ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKaW5kZXggMmE5MWMxNC4uOTY3Zjg4MiAxMDA2NDQKLS0tIGEvLm1haWxtYXAKKysrIGIvLm1haWxtYXAKQEAgLTY5LDYgKzY5LDcgQEAKIEphbWVzIEJvdHRvbWxleSA8amVqYkB0aXRhbmljLmlsLnN0ZWVsZXllLmNvbT4KIEphbWVzIEUgV2lsc29uIDx3aWxzb25Ac3BlY2lmaXguY29tPgogSmFtZXMgS2V0cmVub3MgPGprZXRyZW5vQGlvLihub25lKT4KK0phdmkgTWVyaW5vIDxqYXZpLm1lcmlub0BrZXJuZWwub3JnPiA8amF2aS5tZXJpbm9AYXJtLmNvbT4KIDxqYXZpZXJAb3NnLnNhbXN1bmcuY29tPiA8amF2aWVyLm1hcnRpbmV6QGNvbGxhYm9yYS5jby51az4KIEplYW4gVG91cnJpbGhlcyA8anRAaHBsLmhwLmNvbT4KIEplZmYgR2FyemlrIDxqZ2FyemlrQHByZXR6ZWwueXl6LnVzPgpAQCAtODgsNiArODksNyBAQAogS2VubmV0aCBXIENoZW4gPGtlbm5ldGgudy5jaGVuQGludGVsLmNvbT4KIEtvbnN0YW50aW4gS2hsZWJuaWtvdiA8a29jdDlpQGdtYWlsLmNvbT4gPGsua2hsZWJuaWtvdkBzYW1zdW5nLmNvbT4KIEtvdXNoaWsgPHJhZ2hhdmVuZHJhLmtvdXNoaWtAbmV0ZXJpb24uY29tPgorS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPiA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CiBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+IDxrLmtvemxvd3NraS5rQGdtYWlsLmNvbT4KIEt1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4KIExlb25pZCBJIEFuYW5pZXYgPGxlb25pZC5pLmFuYW5pZXZAaW50ZWwuY29tPgpAQCAtMTU4LDYgKzE2MCw5IEBACiBWaXJlc2ggS3VtYXIgPHZpcmVzaGtAa2VybmVsLm9yZz4gPHZpcmVzaC5rdW1hckBzdC5jb20+CiBWaXJlc2ggS3VtYXIgPHZpcmVzaGtAa2VybmVsLm9yZz4gPHZpcmVzaC5saW51eEBnbWFpbC5jb20+CiBWaXJlc2ggS3VtYXIgPHZpcmVzaGtAa2VybmVsLm9yZz4gPHZpcmVzaC5rdW1hcjJAYXJtLmNvbT4KK1ZsYWQgRG9nYXJ1IDxkZHZsYWRAZ21haWwuY29tPiA8dmxhZC5kb2dhcnVAaW50ZWwuY29tPgorVmxhZGltaXIgRGF2eWRvdiA8dmRhdnlkb3YuZGV2QGdtYWlsLmNvbT4gPHZkYXZ5ZG92QHZpcnR1b3p6by5jb20+CitWbGFkaW1pciBEYXZ5ZG92IDx2ZGF2eWRvdi5kZXZAZ21haWwuY29tPiA8dmRhdnlkb3ZAcGFyYWxsZWxzLmNvbT4KIFRha2FzaGkgWU9TSElJIDx0YWthc2hpLnlvc2hpaS56akByZW5lc2FzLmNvbT4KIFl1c3VrZSBHb2RhIDxnb2RhLnl1c3VrZUByZW5lc2FzLmNvbT4KIEd1c3Rhdm8gUGFkb3ZhbiA8Z3VzdGF2b0BsYXMuaWMudW5pY2FtcC5icj4KZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDJhM2ZiY2QuLmRmMGE1MGUgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMTA5MCw2ICsxMDkwLDEwIEBACiBTOiBQbGVhc2FudG9uLCBDQSA5NDU4OAogUzogVVNBCiAKK046IERtaXRyeSBFcmVtaW4tU29sZW5pa292CitFOiBkYmFyeXNoa292QGdtYWlsLmNvbQorRDogUG93ZXIgU3VwcGx5IE1haW50YWluZXIgZnJvbSB2My4xNCAtIHYzLjE1CisKIE46IERvdWcgRXZhbnMKIEU6IGRqZUBjeWdudXMuY29tCiBEOiBXcm90ZSBYZW5peCBGUyAocGFydCBvZiBzdGFuZGFyZCBrZXJuZWwgc2luY2UgMC45OS4xNSkKQEAgLTE5NDQsNiArMTk0OCwxMSBAQAogRToga3JheGVsQHN1c2UuZGUKIEQ6IHZpZGVvNGxpbnV4LCBidHR2LCB2ZXNhZmIsIHNvbWUgc2NzaSwgbWlzYyBmaXhlcwogCitOOiBIYW5zIEouIEtvY2gKK0Q6IFVTRVJTUEFDRSBJL08sIE1BWDY2NTAKK0Q6IEhhbnMgcGFzc2VkIGF3YXkgaW4gSnVuZSAyMDE2LCBhbmQgd2lsbCBiZSBncmVhdGx5IG1pc3NlZC4KK1c6IGh0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy82OTEwMDAvCisKIE46IEhhcmFsZCBLb2VuaWcKIEU6IGtvZW5pZ0B0YXQucGh5c2lrLnVuaS10dWViaW5nZW4uZGUKIEQ6IFhGcmVlODYgKFMzKSwgRENGNzcsIHNvbWUga2VybmVsIGhhY2tzIGFuZCBmaXhlcwpAQCAtMzUxOCw2ICszNTI3LDEwIEBACiBTOiBOb3J0aGJvcm91Z2gsIE1BIDAxNTMyCiBTOiBVU0EKIAorTjogRG91ZyBUaG9tcHNvbgorRTogZG91Z3Rob21wc29uQHhtaXNzaW9uLmNvbQorRDogRURBQworCiBOOiBUb21teSBUaG9ybgogRTogVG9tbXkuVGhvcm5AaXJpc2EuZnIKIFc6IGh0dHA6Ly93d3cuaXJpc2EuZnIvcHJpdmUvdGhvcm4vaW5kZXguaHRtbApAQCAtMzY1NCw2ICszNjY3LDEwIEBACiBTOiA5NzA3OCBXdWVyemJ1cmcKIFM6IEdlcm1hbnkKIAorTjogSmFzb24gVWhsZW5rb3R0CitFOiBqdWhsZW5rb0Bha2FtYWkuY29tCitEOiBJMzAwMCBFREFDIGRyaXZlcgorCiBOOiBHcmVnIFVuZ2VyZXIKIEU6IGdlcmdAc25hcGdlYXIuY29tCiBEOiB1Q2xpbnV4IGtlcm5lbCBoYWNrZXIKQEAgLTM2OTEsNyArMzcwOCw3IEBACiBOOiBHZWVydCBVeXR0ZXJob2V2ZW4KIEU6IGdlZXJ0QGxpbnV4LW02OGsub3JnCiBXOiBodHRwOi8vdXNlcnMudGVsZW5ldC5iZS9nZWVydHUvCi1QOiAxMDI0Lzg2MjY3OEE2IEM1MUQgMzYxQyAwQkQxIDRDOTAgQjI3NSAgQzU1MyA2RUVBIDExQkEgODYyNiA3OEE2CitQOiA0MDk2Ui80ODA0QjRCQzNGNTVFRUZCIDc1MEQgODJCMCBBNzgxIDU0MzEgNUUyNSAgOTI1QiA0ODA0IEI0QkMgM0Y1NSBFRUZCCiBEOiBtNjhrL0FtaWdhIGFuZCBQUEMvQ0hSUCBMb25ndHJhaWwgY29vcmRpbmF0b3IKIEQ6IEZyYW1lIGJ1ZmZlciBkZXZpY2UgYW5kIFhGNjhfRkJEZXYgbWFpbnRhaW5lcgogRDogbTY4ayBJREUgbWFpbnRhaW5lcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMgYi9Eb2N1bWVudGF0aW9uL0FCSS9zdGFibGUvc3lzZnMtZGV2aWNlcwppbmRleCA0M2Y3OGI4OGQuLmRmNDQ5ZDcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzCkBAIC0xLDcgKzEsNyBAQAogIyBOb3RlOiBUaGlzIGRvY3VtZW50cyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgb2YgYW55IGRldmljZSBiZXlvbmQgd2hhdAogIyBpcyBkb2N1bWVudGVkIGluIERvY3VtZW50YXRpb24vc3lzZnMtcnVsZXMudHh0CiAKLVdoYXQ6CQkvc3lzL2RldmljZXMvKi9vZl9wYXRoCitXaGF0OgkJL3N5cy9kZXZpY2VzLyovb2Zfbm9kZQogRGF0ZToJCUZlYnJ1YXJ5IDIwMTUKIENvbnRhY3Q6CURldmljZSBUcmVlIG1haWxpbmcgbGlzdCA8ZGV2aWNldHJlZUB2Z2VyLmtlcm5lbC5vcmc+CiBEZXNjcmlwdGlvbjoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbGVkIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQKaW5kZXggMzY0NmVjOC4uODZhY2UyOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQKQEAgLTI0LDcgKzI0LDggQEAKIAkJb2YgbGVkIGV2ZW50cy4KIAkJWW91IGNhbiBjaGFuZ2UgdHJpZ2dlcnMgaW4gYSBzaW1pbGFyIG1hbm5lciB0byB0aGUgd2F5IGFuIElPCiAJCXNjaGVkdWxlciBpcyBjaG9zZW4uIFRyaWdnZXIgc3BlY2lmaWMgcGFyYW1ldGVycyBjYW4gYXBwZWFyIGluCi0JCS9zeXMvY2xhc3MvbGVkcy88bGVkPiBvbmNlIGEgZ2l2ZW4gdHJpZ2dlciBpcyBzZWxlY3RlZC4KKwkJL3N5cy9jbGFzcy9sZWRzLzxsZWQ+IG9uY2UgYSBnaXZlbiB0cmlnZ2VyIGlzIHNlbGVjdGVkLiBGb3IKKwkJdGhlaXIgZG9jdW1lbnRhdGlvbiBzZWUgc3lzZnMtY2xhc3MtbGVkLXRyaWdnZXItKi4KIAogV2hhdDoJCS9zeXMvY2xhc3MvbGVkcy88bGVkPi9pbnZlcnRlZAogRGF0ZToJCUphbnVhcnkgMjAxMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQtdHJpZ2dlci1vbmVzaG90IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQtdHJpZ2dlci1vbmVzaG90Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OGEzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZC10cmlnZ2VyLW9uZXNob3QKQEAgLTAsMCArMSwzNiBAQAorV2hhdDoJCS9zeXMvY2xhc3MvbGVkcy88bGVkPi9kZWxheV9vbgorRGF0ZToJCUp1biAyMDEyCitLZXJuZWxWZXJzaW9uOgkzLjYKK0NvbnRhY3Q6CWxpbnV4LWxlZHNAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJU3BlY2lmaWVzIGZvciBob3cgbWFueSBtaWxsaXNlY29uZHMgdGhlIExFRCBoYXMgdG8gc3RheSBhdAorCQlMRURfRlVMTCBicmlnaHRuZXNzIGFmdGVyIGl0IGhhcyBiZWVuIGFybWVkLgorCQlEZWZhdWx0cyB0byAxMDAgbXMuCisKK1doYXQ6CQkvc3lzL2NsYXNzL2xlZHMvPGxlZD4vZGVsYXlfb2ZmCitEYXRlOgkJSnVuIDIwMTIKK0tlcm5lbFZlcnNpb246CTMuNgorQ29udGFjdDoJbGludXgtbGVkc0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlTcGVjaWZpZXMgZm9yIGhvdyBtYW55IG1pbGxpc2Vjb25kcyB0aGUgTEVEIGhhcyB0byBzdGF5IGF0CisJCUxFRF9PRkYgYnJpZ2h0bmVzcyBhZnRlciBpdCBoYXMgYmVlbiBhcm1lZC4KKwkJRGVmYXVsdHMgdG8gMTAwIG1zLgorCitXaGF0OgkJL3N5cy9jbGFzcy9sZWRzLzxsZWQ+L2ludmVydAorRGF0ZToJCUp1biAyMDEyCitLZXJuZWxWZXJzaW9uOgkzLjYKK0NvbnRhY3Q6CWxpbnV4LWxlZHNAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJUmV2ZXJzZSB0aGUgYmxpbmsgbG9naWMuIElmIHNldCB0byAwIChkZWZhdWx0KSBibGluayBvbiBmb3IKKwkJZGVsYXlfb24gbXMsIHRoZW4gYmxpbmsgb2ZmIGZvciBkZWxheV9vZmYgbXMsIGxlYXZpbmcgdGhlIExFRAorCQlub3JtYWxseSBvZmYuIElmIHNldCB0byAxLCBibGluayBvZmYgZm9yIGRlbGF5X29mZiBtcywgdGhlbgorCQlibGluayBvbiBmb3IgZGVsYXlfb24gbXMsIGxlYXZpbmcgdGhlIExFRCBub3JtYWxseSBvbi4KKwkJU2V0dGluZyB0aGlzIHZhbHVlIGFsc28gaW1tZWRpYXRlbHkgY2hhbmdlcyB0aGUgTEVEIHN0YXRlLgorCitXaGF0OgkJL3N5cy9jbGFzcy9sZWRzLzxsZWQ+L3Nob3QKK0RhdGU6CQlKdW4gMjAxMgorS2VybmVsVmVyc2lvbjoJMy42CitDb250YWN0OglsaW51eC1sZWRzQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVdyaXRlIGFueSBub24tZW1wdHkgc3RyaW5nIHRvIHNpZ25hbCBhbiBldmVudHMsIHRoaXMgc3RhcnRzIGEKKwkJYmxpbmsgc2VxdWVuY2UgaWYgbm90IGFscmVhZHkgcnVubmluZy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbGVkLXRyaWdnZXItdXNicG9ydCBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbGVkLXRyaWdnZXItdXNicG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQwZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQtdHJpZ2dlci11c2Jwb3J0CkBAIC0wLDAgKzEsMTIgQEAKK1doYXQ6CQkvc3lzL2NsYXNzL2xlZHMvPGxlZD4vcG9ydHMvPHBvcnQ+CitEYXRlOgkJU2VwdGVtYmVyIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJbGludXgtbGVkc0B2Z2VyLmtlcm5lbC5vcmcKKwkJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUV2ZXJ5IGRpciBlbnRyeSByZXByZXNlbnRzIGEgc2luZ2xlIFVTQiBwb3J0IHRoYXQgY2FuIGJlCisJCXNlbGVjdGVkIGZvciB0aGUgVVNCIHBvcnQgdHJpZ2dlci4gU2VsZWN0aW5nIHBvcnRzIG1ha2VzIHRyaWdnZXIKKwkJb2JzZXJ2aW5nIHRoZW0gZm9yIGFueSBjb25uZWN0ZWQgZGV2aWNlcyBhbmQgbGlnaHRpbmcgb24gTEVEIGlmCisJCXRoZXJlIGFyZSBhbnkuCisJCUVjaG9pbmcgIjEiIHZhbHVlIHNlbGVjdHMgVVNCIHBvcnQuIEVjaG9pbmcgIjAiIHVuc2VsZWN0cyBpdC4KKwkJQ3VycmVudCBzdGF0ZSBjYW4gYmUgYWxzbyByZWFkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1taWMudHh0IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1taWMudHh0CmluZGV4IGQ0NWVlZDIuLjZlZjY4MjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbWljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLW1pYy50eHQKQEAgLTE1Myw3ICsxNTMsNyBAQAogCiBXaGF0OgkJL3N5cy9jbGFzcy9taWMvbWljKHgpL2hlYXJ0YmVhdF9lbmFibGUKIERhdGU6CQlNYXJjaCAyMDE1Ci1LZXJuZWxWZXJzaW9uOgkzLjIwCitLZXJuZWxWZXJzaW9uOgk0LjQKIENvbnRhY3Q6CUFzaHV0b3NoIERpeGl0IDxhc2h1dG9zaC5kaXhpdEBpbnRlbC5jb20+CiBEZXNjcmlwdGlvbjoKIAkJVGhlIE1JQyBkcml2ZXJzIGRldGVjdCBhbmQgaW5mb3JtIHVzZXIgc3BhY2UgYWJvdXQgY2FyZCBjcmFzaGVzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXBvd2VyIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1wb3dlcgppbmRleCBmYTA1NzE5Li5mODVjZTllIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLXBvd2VyCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtcG93ZXIKQEAgLTIyLDcgKzIyLDcgQEAKIFdoYXQ6CQkvc3lzL2NsYXNzL3Bvd2VyX3N1cHBseS9tYXgxNDU3Ny1jaGFyZ2VyL2RldmljZS9mYXN0X2NoYXJnZV90aW1lcgogRGF0ZToJCU9jdG9iZXIgMjAxNAogS2VybmVsVmVyc2lvbjoJMy4xOC4wCi1Db250YWN0OglLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KK0NvbnRhY3Q6CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KIERlc2NyaXB0aW9uOgogCQlUaGlzIGVudHJ5IHNob3dzIGFuZCBzZXRzIHRoZSBtYXhpbXVtIHRpbWUgdGhlIG1heDE0NTc3CiAJCWNoYXJnZXIgb3BlcmF0ZXMgaW4gZmFzdC1jaGFyZ2UgbW9kZS4gV2hlbiB0aGUgdGltZXIgZXhwaXJlcwpAQCAtMzYsNyArMzYsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5L21heDc3NjkzLWNoYXJnZXIvZGV2aWNlL2Zhc3RfY2hhcmdlX3RpbWVyCiBEYXRlOgkJSmFudWFyeSAyMDE1CiBLZXJuZWxWZXJzaW9uOgkzLjE5LjAKLUNvbnRhY3Q6CUtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgorQ29udGFjdDoJS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgogRGVzY3JpcHRpb246CiAJCVRoaXMgZW50cnkgc2hvd3MgYW5kIHNldHMgdGhlIG1heGltdW0gdGltZSB0aGUgbWF4Nzc2OTMKIAkJY2hhcmdlciBvcGVyYXRlcyBpbiBmYXN0LWNoYXJnZSBtb2RlLiBXaGVuIHRoZSB0aW1lciBleHBpcmVzCkBAIC01MCw3ICs1MCw3IEBACiBXaGF0OgkJL3N5cy9jbGFzcy9wb3dlcl9zdXBwbHkvbWF4Nzc2OTMtY2hhcmdlci9kZXZpY2UvdG9wX29mZl90aHJlc2hvbGRfY3VycmVudAogRGF0ZToJCUphbnVhcnkgMjAxNQogS2VybmVsVmVyc2lvbjoJMy4xOS4wCi1Db250YWN0OglLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KK0NvbnRhY3Q6CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KIERlc2NyaXB0aW9uOgogCQlUaGlzIGVudHJ5IHNob3dzIGFuZCBzZXRzIHRoZSBjaGFyZ2luZyBjdXJyZW50IHRocmVzaG9sZCBmb3IKIAkJZW50ZXJpbmcgdG9wLW9mZiBjaGFyZ2luZyBtb2RlLiBXaGVuIGNoYXJnaW5nIGN1cnJlbnQgaW4gZmFzdApAQCAtNjUsNyArNjUsNyBAQAogV2hhdDoJCS9zeXMvY2xhc3MvcG93ZXJfc3VwcGx5L21heDc3NjkzLWNoYXJnZXIvZGV2aWNlL3RvcF9vZmZfdGltZXIKIERhdGU6CQlKYW51YXJ5IDIwMTUKIEtlcm5lbFZlcnNpb246CTMuMTkuMAotQ29udGFjdDoJS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CitDb250YWN0OglLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CiBEZXNjcmlwdGlvbjoKIAkJVGhpcyBlbnRyeSBzaG93cyBhbmQgc2V0cyB0aGUgbWF4aW11bSB0aW1lIHRoZSBtYXg3NzY5MwogCQljaGFyZ2VyIG9wZXJhdGVzIGluIHRvcC1vZmYgY2hhcmdlIG1vZGUuIFdoZW4gdGhlIHRpbWVyIGV4cGlyZXMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1sb2dpdGVjaC1sZzRmZiBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1sb2dpdGVjaC1sZzRmZgppbmRleCBkYjE5N2E4Li4zMDVkZmZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtbG9naXRlY2gtbGc0ZmYKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLWxvZ2l0ZWNoLWxnNGZmCkBAIC0zNSw2ICszNSwxMiBAQAogCQkgIERGLUVYIDwqLS0tLS0tLS0+IEcyNSA8LT4gRzI3CiAJCSAgREYtRVggPCotLS0tLS0tLS0tLS0tLS0tPiBHMjcKIAorCQlHMjk6CisJCSAgREYtRVggPCo+IERGUCA8LT4gRzI1IDwtPiBHMjcgPC0+IEcyOQorCQkgIERGLUVYIDwqLS0tLS0tLS0+IEcyNSA8LT4gRzI3IDwtPiBHMjkKKwkJICBERi1FWCA8Ki0tLS0tLS0tLS0tLS0tLS0+IEcyNyA8LT4gRzI5CisJCSAgREYtRVggPCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IEcyOQorCiAJCURGR1Q6CiAJCSAgREYtRVggPCo+IERGUCA8LT4gREZHVAogCQkgIERGLUVYIDwqLS0tLS0tLS0+IERGR1QKQEAgLTUwLDMgKzU2LDEyIEBACiAJCWFsdGVybmF0ZSBtb2RlIHRoZSB3aGVlbCBtaWdodCBiZSBzd2l0Y2hlZCB0by4KIAkJSXQgaXMgYSByZWFkLW9ubHkgdmFsdWUuCiAJCVRoaXMgZW50cnkgaXMgbm90IGNyZWF0ZWQgZm9yIGRldmljZXMgdGhhdCBoYXZlIG9ubHkgb25lIG1vZGUuCisKK1doYXQ6CQkvc3lzL2J1cy9oaWQvZHJpdmVycy9sb2dpdGVjaC88ZGV2Pi9jb21iaW5lX3BlZGFscworRGF0ZToJCVNlcCAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CVNpbW9uIFdvb2QgPHNpbW9uQG11bmdld2VsbC5vcmc+CitEZXNjcmlwdGlvbjoJQ29udHJvbHMgd2hldGhlciBhIGNvbWJpbmVkIHZhbHVlIG9mIGFjY2VsZXJhdG9yIGFuZCBicmFrZSBpcworCQlyZXBvcnRlZCBvbiB0aGUgWSBheGlzIG9mIHRoZSBjb250cm9sbGVyLiBVc2VmdWwgZm9yIG9sZGVyIGdhbWVzCisJCXdoaWNoIGNhbiBkbyBub3Qgd29yayB3aXRoIHNlcGFyYXRlIGFjY2VsZXJhdG9yL2JyYWtlIGF4aXMuCisJCU9mZiAoJzAnKSBieSBkZWZhdWx0LCBlbmFibGVkIGJ5IHNldHRpbmcgJzEnLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItd2Fjb20gYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci13YWNvbQppbmRleCBkY2E0MjkzLi4yYWE1NTAzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci13YWNvbQorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci13YWNvbQpAQCAtMjQsNiArMjQsNyBAQAogRGF0ZToJCUF1Z3VzdCAyMDE0CiBDb250YWN0OglsaW51eC1pbnB1dEB2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgorCQk8b2Jzb2xldGVkIGJ5IHRoZSBMRUQgY2xhc3MgQVBJIG5vdyBleHBvcnRlZCBieSB0aGUgZHJpdmVyPgogCQlXcml0aW5nIHRvIHRoaXMgZmlsZSBzZXRzIHRoZSBzdGF0dXMgTEVEIGx1bWluYW5jZSAoMS4uMTI3KQogCQl3aGVuIHRoZSBzdHlsdXMgZG9lcyBub3QgdG91Y2ggdGhlIHRhYmxldCBzdXJmYWNlLCBhbmQgbm8KIAkJYnV0dG9uIGlzIHByZXNzZWQgb24gdGhlIHN0eWx1cy4gVGhpcyBsdW1pbmFuY2UgbGV2ZWwgaXMKQEAgLTMzLDYgKzM0LDcgQEAKIERhdGU6CQlBdWd1c3QgMjAxNAogQ29udGFjdDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKKwkJPG9ic29sZXRlZCBieSB0aGUgTEVEIGNsYXNzIEFQSSBub3cgZXhwb3J0ZWQgYnkgdGhlIGRyaXZlcj4KIAkJV3JpdGluZyB0byB0aGlzIGZpbGUgc2V0cyB0aGUgc3RhdHVzIExFRCBsdW1pbmFuY2UgKDEuLjEyNykKIAkJd2hlbiB0aGUgc3R5bHVzIHRvdWNoZXMgdGhlIHRhYmxldCBzdXJmYWNlLCBvciBhbnkgYnV0dG9uIGlzCiAJCXByZXNzZWQgb24gdGhlIHN0eWx1cy4KQEAgLTQxLDYgKzQzLDcgQEAKIERhdGU6CQlBdWd1c3QgMjAxNAogQ29udGFjdDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKKwkJPG9ic29sZXRlZCBieSB0aGUgTEVEIGNsYXNzIEFQSSBub3cgZXhwb3J0ZWQgYnkgdGhlIGRyaXZlcj4KIAkJV3JpdGluZyB0byB0aGlzIGZpbGUgc2V0cyB3aGljaCBvbmUgb2YgdGhlIGZvdXIgKGZvciBJbnR1b3MgNAogCQlhbmQgSW50dW9zIDUpIG9yIG9mIHRoZSByaWdodCBmb3VyIChmb3IgQ2ludGlxIDIxVVgyIGFuZCBDaW50aXEKIAkJMjRIRCkgc3RhdHVzIExFRHMgaXMgYWN0aXZlICgwLi4zKS4gVGhlIG90aGVyIHRocmVlIExFRHMgb24gdGhlCkBAIC01MCw2ICs1Myw3IEBACiBEYXRlOgkJQXVndXN0IDIwMTQKIENvbnRhY3Q6CWxpbnV4LWlucHV0QHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CisJCTxvYnNvbGV0ZWQgYnkgdGhlIExFRCBjbGFzcyBBUEkgbm93IGV4cG9ydGVkIGJ5IHRoZSBkcml2ZXI+CiAJCVdyaXRpbmcgdG8gdGhpcyBmaWxlIHNldHMgd2hpY2ggb25lIG9mIHRoZSBsZWZ0IGZvdXIgKGZvciBDaW50aXEgMjFVWDIKIAkJYW5kIENpbnRpcSAyNEhEKSBzdGF0dXMgTEVEcyBpcyBhY3RpdmUgKDAuLjMpLiBUaGUgb3RoZXIgdGhyZWUgTEVEcyBvbgogCQl0aGUgbGVmdCBhcmUgYWx3YXlzIGluYWN0aXZlLgpAQCAtOTEsNiArOTUsNyBAQAogRGF0ZToJCUp1bHkgMjAxNQogQ29udGFjdDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKKwkJPG9ic29sZXRlZCBieSB0aGUgTEVEIGNsYXNzIEFQSSBub3cgZXhwb3J0ZWQgYnkgdGhlIGRyaXZlcj4KIAkJUmVhZGluZyBmcm9tIHRoaXMgZmlsZSByZXBvcnRzIHRoZSBtb2RlIHN0YXR1cyBvZiB0aGUKIAkJcmVtb3RlIGFzIGluZGljYXRlZCBieSB0aGUgTEVEIGxpZ2h0cyBvbiB0aGUgZGV2aWNlLiBJZiBubwogCQlyZXBvcnRzIGhhdmUgYmVlbiByZWNlaXZlZCBmcm9tIHRoZSBwYWlyZWQgZGV2aWNlLCByZWFkaW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWkyYy1ibXAwODUgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWkyYy1ibXAwODUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NTk2MmEuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1pMmMtYm1wMDg1CisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotV2hhdDoJCS9zeXMvYnVzL2kyYy9kZXZpY2VzLzxidXNudW0+LTxkZXZhZGRyPi9wcmVzc3VyZTBfaW5wdXQKLURhdGU6CQlKdW5lIDIwMTAKLUNvbnRhY3Q6CUNocmlzdG9waCBNYWlyIDxjaHJpc3RvcGgubWFpckBnbWFpbC5jb20+Ci1EZXNjcmlwdGlvbjoJU3RhcnQgYSBwcmVzc3VyZSBtZWFzdXJlbWVudCBhbmQgcmVhZCB0aGUgcmVzdWx0LiBWYWx1ZXMKLQkJcmVwcmVzZW50IHRoZSBhbWJpZW50IGFpciBwcmVzc3VyZSBpbiBwYXNjYWwgKDAuMDEgbWlsbGliYXIpLgotCi0JCVJlYWRpbmc6IHJldHVybnMgdGhlIGN1cnJlbnQgYWlyIHByZXNzdXJlLgotCi0KLVdoYXQ6CQkvc3lzL2J1cy9pMmMvZGV2aWNlcy88YnVzbnVtPi08ZGV2YWRkcj4vdGVtcDBfaW5wdXQKLURhdGU6CQlKdW5lIDIwMTAKLUNvbnRhY3Q6CUNocmlzdG9waCBNYWlyIDxjaHJpc3RvcGgubWFpckBnbWFpbC5jb20+Ci1EZXNjcmlwdGlvbjoJTWVhc3VyZSB0aGUgYW1iaWVudCB0ZW1wZXJhdHVyZS4gVGhlIHJldHVybmVkIHZhbHVlIHJlcHJlc2VudHMKLQkJdGhlIGFtYmllbnQgdGVtcGVyYXR1cmUgaW4gdW5pdHMgb2YgMC4xIGRlZ3JlZSBjZWxzaXVzLgotCi0JCVJlYWRpbmc6IHJldHVybnMgdGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUuCi0KLQotV2hhdDoJCS9zeXMvYnVzL2kyYy9kZXZpY2VzLzxidXNudW0+LTxkZXZhZGRyPi9vdmVyc2FtcGxpbmcKLURhdGU6CQlKdW5lIDIwMTAKLUNvbnRhY3Q6CUNocmlzdG9waCBNYWlyIDxjaHJpc3RvcGgubWFpckBnbWFpbC5jb20+Ci1EZXNjcmlwdGlvbjoJVGVsbCB0aGUgYm1wMDg1IHRvIHVzZSBtb3JlIHNhbXBsZXMgdG8gY2FsY3VsYXRlIGEgcHJlc3N1cmUKLQkJdmFsdWUuIFdoZW4gd3JpdGluZyB0byB0aGlzIGZpbGUgdGhlIGNoaXAgd2lsbCB1c2UgMl54IHNhbXBsZXMKLQkJdG8gY2FsY3VsYXRlIHRoZSBuZXh0IHByZXNzdXJlIHZhbHVlIHdpdGggeCBiZWluZyB0aGUgdmFsdWUKLQkJd3JpdHRlbi4gVXNpbmcgdGhpcyBmZWF0dXJlIHdpbGwgZGVjcmVhc2UgUk1TIG5vaXNlIGFuZAotCQlpbmNyZWFzZSB0aGUgbWVhc3VyZW1lbnQgdGltZS4KLQotCQlSZWFkaW5nOiByZXR1cm5zIHRoZSBjdXJyZW50IG92ZXJzYW1wbGluZyBzZXR0aW5nLgotCi0JCVdyaXRpbmc6IHNldHMgYSBuZXcgb3ZlcnNhbXBsaW5nIHNldHRpbmcuCi0JCUFjY2VwdGVkIHZhbHVlczogMC4uMy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLWlycSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMta2VybmVsLWlycQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjA3NGIxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1rZXJuZWwtaXJxCkBAIC0wLDAgKzEsNTMgQEAKK1doYXQ6CQkvc3lzL2tlcm5lbC9pcnEKK0RhdGU6CQlTZXB0ZW1iZXIgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDcmFpZyBHYWxsZWsgPGtyYWlnQGdvb2dsZS5jb20+CitEZXNjcmlwdGlvbjoJRGlyZWN0b3J5IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5c3RlbSdzIElSUXMuCisJCVNwZWNpZmljYWxseSwgZGF0YSBmcm9tIHRoZSBhc3NvY2lhdGVkIHN0cnVjdCBpcnFfZGVzYy4KKwkJVGhlIGluZm9ybWF0aW9uIGhlcmUgaXMgc2ltaWxhciB0byB0aGF0IGluIC9wcm9jL2ludGVycnVwdHMKKwkJYnV0IGluIGEgbW9yZSBtYWNoaW5lLWZyaWVuZGx5IGZvcm1hdC4gIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zCisJCW9uZSBzdWJkaXJlY3RvcnkgZm9yIGVhY2ggTGludXggSVJRIG51bWJlci4KKworV2hhdDoJCS9zeXMva2VybmVsL2lycS88aXJxPi9hY3Rpb25zCitEYXRlOgkJU2VwdGVtYmVyIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ3JhaWcgR2FsbGVrIDxrcmFpZ0Bnb29nbGUuY29tPgorRGVzY3JpcHRpb246CVRoZSBJUlEgYWN0aW9uIGNoYWluLiAgQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB6ZXJvIG9yIG1vcmUKKwkJZGV2aWNlIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVycnVwdC4KKworV2hhdDoJCS9zeXMva2VybmVsL2lycS88aXJxPi9jaGlwX25hbWUKK0RhdGU6CQlTZXB0ZW1iZXIgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDcmFpZyBHYWxsZWsgPGtyYWlnQGdvb2dsZS5jb20+CitEZXNjcmlwdGlvbjoJSHVtYW4tcmVhZGFibGUgY2hpcCBuYW1lIHN1cHBsaWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGRldmljZQorCQlkcml2ZXIuCisKK1doYXQ6CQkvc3lzL2tlcm5lbC9pcnEvPGlycT4vaHdpcnEKK0RhdGU6CQlTZXB0ZW1iZXIgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDcmFpZyBHYWxsZWsgPGtyYWlnQGdvb2dsZS5jb20+CitEZXNjcmlwdGlvbjoJV2hlbiBpbnRlcnJ1cHQgdHJhbnNsYXRpb24gZG9tYWlucyBhcmUgdXNlZCwgdGhpcyBmaWxlIGNvbnRhaW5zCisJCXRoZSB1bmRlcmx5aW5nIGhhcmR3YXJlIElSUSBudW1iZXIgdXNlZCBmb3IgdGhpcyBMaW51eCBJUlEuCisKK1doYXQ6CQkvc3lzL2tlcm5lbC9pcnEvPGlycT4vbmFtZQorRGF0ZToJCVNlcHRlbWJlciAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNyYWlnIEdhbGxlayA8a3JhaWdAZ29vZ2xlLmNvbT4KK0Rlc2NyaXB0aW9uOglIdW1hbi1yZWFkYWJsZSBmbG93IGhhbmRsZXIgbmFtZSBhcyBkZWZpbmVkIGJ5IHRoZSBpcnEgY2hpcAorCQlkcml2ZXIuCisKK1doYXQ6CQkvc3lzL2tlcm5lbC9pcnEvPGlycT4vcGVyX2NwdV9jb3VudAorRGF0ZToJCVNlcHRlbWJlciAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNyYWlnIEdhbGxlayA8a3JhaWdAZ29vZ2xlLmNvbT4KK0Rlc2NyaXB0aW9uOglUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBpbnRlcnJ1cHQgaGFzIGZpcmVkIHNpbmNlIGJvb3QuICBUaGlzCisJCWlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY291bnRlcnM7IG9uZSBwZXIgQ1BVIGluIENQVSBpZAorCQlvcmRlci4gIE5PVEU6IFRoaXMgZmlsZSBjb25zaXN0ZW50bHkgc2hvd3MgY291bnRlcnMgZm9yIGFsbAorCQlDUFUgaWRzLiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlIGJlaGF2aW9yIG9mIC9wcm9jL2ludGVycnVwdHMKKwkJd2hpY2ggb25seSBzaG93cyBjb3VudGVycyBmb3Igb25saW5lIENQVXMuCisKK1doYXQ6CQkvc3lzL2tlcm5lbC9pcnEvPGlycT4vdHlwZQorRGF0ZToJCVNlcHRlbWJlciAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNyYWlnIEdhbGxlayA8a3JhaWdAZ29vZ2xlLmNvbT4KK0Rlc2NyaXB0aW9uOglUaGUgdHlwZSBvZiB0aGUgaW50ZXJydXB0LiAgRWl0aGVyIHRoZSBzdHJpbmcgJ2xldmVsJyBvciAnZWRnZScuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NoYW5nZXMgYi9Eb2N1bWVudGF0aW9uL0NoYW5nZXMKaW5kZXggZWM5N2I3Ny4uMjI3OTdhMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCisrKyBiL0RvY3VtZW50YXRpb24vQ2hhbmdlcwpAQCAtMSw4ICsxLDEzIEBACisuLiBfY2hhbmdlczoKKworTWluaW1hbCByZXF1ZXJlbWVudHMgdG8gY29tcGlsZSB0aGUgS2VybmVsCisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKKwogSW50cm8KID09PT09CiAKIFRoaXMgZG9jdW1lbnQgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBhIGxpc3Qgb2YgdGhlIG1pbmltdW0gbGV2ZWxzIG9mCi1zb2Z0d2FyZSBuZWNlc3NhcnkgdG8gcnVuIHRoZSAzLjAga2VybmVscy4KK3NvZnR3YXJlIG5lY2Vzc2FyeSB0byBydW4gdGhlIDQueCBrZXJuZWxzLgogCiBUaGlzIGRvY3VtZW50IGlzIG9yaWdpbmFsbHkgYmFzZWQgb24gbXkgIkNoYW5nZXMiIGZpbGUgZm9yIDIuMC54IGtlcm5lbHMKIGFuZCB0aGVyZWZvcmUgb3dlcyBjcmVkaXQgdG8gdGhlIHNhbWUgcGVvcGxlIGFzIHRoYXQgZmlsZSAoSmFyZWQgTWF1Y2gsCkBAIC0xMCw5ICsxNSw5IEBACiAnbmV0KS4KIAogQ3VycmVudCBNaW5pbWFsIFJlcXVpcmVtZW50cwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi1VcGdyYWRlIHRvIGF0ICpsZWFzdCogdGhlc2Ugc29mdHdhcmUgcmV2aXNpb25zIGJlZm9yZSB0aGlua2luZyB5b3UndmUKK1VwZ3JhZGUgdG8gYXQgKipsZWFzdCoqIHRoZXNlIHNvZnR3YXJlIHJldmlzaW9ucyBiZWZvcmUgdGhpbmtpbmcgeW91J3ZlCiBlbmNvdW50ZXJlZCBhIGJ1ZyEgIElmIHlvdSdyZSB1bnN1cmUgd2hhdCB2ZXJzaW9uIHlvdSdyZSBjdXJyZW50bHkKIHJ1bm5pbmcsIHRoZSBzdWdnZXN0ZWQgY29tbWFuZCBzaG91bGQgdGVsbCB5b3UuCiAKQEAgLTIxLDM0ICsyNiw0MCBAQAogc3lzdGVtczsgb2J2aW91c2x5LCBpZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgSVNETiBoYXJkd2FyZSwgZm9yIGV4YW1wbGUsCiB5b3UgcHJvYmFibHkgbmVlZG4ndCBjb25jZXJuIHlvdXJzZWxmIHdpdGggaXNkbjRrLXV0aWxzLgogCi1vICBHTlUgQyAgICAgICAgICAgICAgICAgIDMuMiAgICAgICAgICAgICAgICAgICAgICMgZ2NjIC0tdmVyc2lvbgotbyAgR05VIG1ha2UgICAgICAgICAgICAgICAzLjgwICAgICAgICAgICAgICAgICAgICAjIG1ha2UgLS12ZXJzaW9uCi1vICBiaW51dGlscyAgICAgICAgICAgICAgIDIuMTIgICAgICAgICAgICAgICAgICAgICMgbGQgLXYKLW8gIHV0aWwtbGludXggICAgICAgICAgICAgMi4xMG8gICAgICAgICAgICAgICAgICAgIyBmZGZvcm1hdCAtLXZlcnNpb24KLW8gIG1vZHVsZS1pbml0LXRvb2xzICAgICAgMC45LjEwICAgICAgICAgICAgICAgICAgIyBkZXBtb2QgLVYKLW8gIGUyZnNwcm9ncyAgICAgICAgICAgICAgMS40MS40ICAgICAgICAgICAgICAgICAgIyBlMmZzY2sgLVYKLW8gIGpmc3V0aWxzICAgICAgICAgICAgICAgMS4xLjMgICAgICAgICAgICAgICAgICAgIyBmc2NrLmpmcyAtVgotbyAgcmVpc2VyZnNwcm9ncyAgICAgICAgICAzLjYuMyAgICAgICAgICAgICAgICAgICAjIHJlaXNlcmZzY2sgLVYKLW8gIHhmc3Byb2dzICAgICAgICAgICAgICAgMi42LjAgICAgICAgICAgICAgICAgICAgIyB4ZnNfZGIgLVYKLW8gIHNxdWFzaGZzLXRvb2xzICAgICAgICAgNC4wICAgICAgICAgICAgICAgICAgICAgIyBta3NxdWFzaGZzIC12ZXJzaW9uCi1vICBidHJmcy1wcm9ncyAgICAgICAgICAgIDAuMTggICAgICAgICAgICAgICAgICAgICMgYnRyZnNjawotbyAgcGNtY2lhdXRpbHMgICAgICAgICAgICAwMDQgICAgICAgICAgICAgICAgICAgICAjIHBjY2FyZGN0bCAtVgotbyAgcXVvdGEtdG9vbHMgICAgICAgICAgICAzLjA5ICAgICAgICAgICAgICAgICAgICAjIHF1b3RhIC1WCi1vICBQUFAgICAgICAgICAgICAgICAgICAgIDIuNC4wICAgICAgICAgICAgICAgICAgICMgcHBwZCAtLXZlcnNpb24KLW8gIGlzZG40ay11dGlscyAgICAgICAgICAgMy4xcHJlMSAgICAgICAgICAgICAgICAgIyBpc2RuY3RybCAyPiYxfGdyZXAgdmVyc2lvbgotbyAgbmZzLXV0aWxzICAgICAgICAgICAgICAxLjAuNSAgICAgICAgICAgICAgICAgICAjIHNob3dtb3VudCAtLXZlcnNpb24KLW8gIHByb2NwcyAgICAgICAgICAgICAgICAgMy4yLjAgICAgICAgICAgICAgICAgICAgIyBwcyAtLXZlcnNpb24KLW8gIG9wcm9maWxlICAgICAgICAgICAgICAgMC45ICAgICAgICAgICAgICAgICAgICAgIyBvcHJvZmlsZWQgLS12ZXJzaW9uCi1vICB1ZGV2ICAgICAgICAgICAgICAgICAgIDA4MSAgICAgICAgICAgICAgICAgICAgICMgdWRldmQgLS12ZXJzaW9uCi1vICBncnViICAgICAgICAgICAgICAgICAgIDAuOTMgICAgICAgICAgICAgICAgICAgICMgZ3J1YiAtLXZlcnNpb24gfHwgZ3J1Yi1pbnN0YWxsIC0tdmVyc2lvbgotbyAgbWNlbG9nICAgICAgICAgICAgICAgICAwLjYgICAgICAgICAgICAgICAgICAgICAjIG1jZWxvZyAtLXZlcnNpb24KLW8gIGlwdGFibGVzICAgICAgICAgICAgICAgMS40LjIgICAgICAgICAgICAgICAgICAgIyBpcHRhYmxlcyAtVgotbyAgb3BlbnNzbCAmIGxpYmNyeXB0byAgICAxLjAuMCAgICAgICAgICAgICAgICAgICAjIG9wZW5zc2wgdmVyc2lvbgotbyAgYmMgICAgICAgICAgICAgICAgICAgICAxLjA2Ljk1ICAgICAgICAgICAgICAgICAjIGJjIC0tdmVyc2lvbgorPT09PT09PT09PT09PT09PT09PT09PSA9PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgUHJvZ3JhbSAgICAgICAgTWluaW1hbCB2ZXJzaW9uICAgICAgIENvbW1hbmQgdG8gY2hlY2sgdGhlIHZlcnNpb24KKz09PT09PT09PT09PT09PT09PT09PT0gPT09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitHTlUgQyAgICAgICAgICAgICAgICAgIDMuMiAgICAgICAgICAgICAgZ2NjIC0tdmVyc2lvbgorR05VIG1ha2UgICAgICAgICAgICAgICAzLjgwICAgICAgICAgICAgIG1ha2UgLS12ZXJzaW9uCitiaW51dGlscyAgICAgICAgICAgICAgIDIuMTIgICAgICAgICAgICAgbGQgLXYKK3V0aWwtbGludXggICAgICAgICAgICAgMi4xMG8gICAgICAgICAgICBmZGZvcm1hdCAtLXZlcnNpb24KK21vZHVsZS1pbml0LXRvb2xzICAgICAgMC45LjEwICAgICAgICAgICBkZXBtb2QgLVYKK2UyZnNwcm9ncyAgICAgICAgICAgICAgMS40MS40ICAgICAgICAgICBlMmZzY2sgLVYKK2pmc3V0aWxzICAgICAgICAgICAgICAgMS4xLjMgICAgICAgICAgICBmc2NrLmpmcyAtVgorcmVpc2VyZnNwcm9ncyAgICAgICAgICAzLjYuMyAgICAgICAgICAgIHJlaXNlcmZzY2sgLVYKK3hmc3Byb2dzICAgICAgICAgICAgICAgMi42LjAgICAgICAgICAgICB4ZnNfZGIgLVYKK3NxdWFzaGZzLXRvb2xzICAgICAgICAgNC4wICAgICAgICAgICAgICBta3NxdWFzaGZzIC12ZXJzaW9uCitidHJmcy1wcm9ncyAgICAgICAgICAgIDAuMTggICAgICAgICAgICAgYnRyZnNjaworcGNtY2lhdXRpbHMgICAgICAgICAgICAwMDQgICAgICAgICAgICAgIHBjY2FyZGN0bCAtVgorcXVvdGEtdG9vbHMgICAgICAgICAgICAzLjA5ICAgICAgICAgICAgIHF1b3RhIC1WCitQUFAgICAgICAgICAgICAgICAgICAgIDIuNC4wICAgICAgICAgICAgcHBwZCAtLXZlcnNpb24KK2lzZG40ay11dGlscyAgICAgICAgICAgMy4xcHJlMSAgICAgICAgICBpc2RuY3RybCAyPiYxfGdyZXAgdmVyc2lvbgorbmZzLXV0aWxzICAgICAgICAgICAgICAxLjAuNSAgICAgICAgICAgIHNob3dtb3VudCAtLXZlcnNpb24KK3Byb2NwcyAgICAgICAgICAgICAgICAgMy4yLjAgICAgICAgICAgICBwcyAtLXZlcnNpb24KK29wcm9maWxlICAgICAgICAgICAgICAgMC45ICAgICAgICAgICAgICBvcHJvZmlsZWQgLS12ZXJzaW9uCit1ZGV2ICAgICAgICAgICAgICAgICAgIDA4MSAgICAgICAgICAgICAgdWRldmQgLS12ZXJzaW9uCitncnViICAgICAgICAgICAgICAgICAgIDAuOTMgICAgICAgICAgICAgZ3J1YiAtLXZlcnNpb24gfHwgZ3J1Yi1pbnN0YWxsIC0tdmVyc2lvbgorbWNlbG9nICAgICAgICAgICAgICAgICAwLjYgICAgICAgICAgICAgIG1jZWxvZyAtLXZlcnNpb24KK2lwdGFibGVzICAgICAgICAgICAgICAgMS40LjIgICAgICAgICAgICBpcHRhYmxlcyAtVgorb3BlbnNzbCAmIGxpYmNyeXB0byAgICAxLjAuMCAgICAgICAgICAgIG9wZW5zc2wgdmVyc2lvbgorYmMgICAgICAgICAgICAgICAgICAgICAxLjA2Ljk1ICAgICAgICAgIGJjIC0tdmVyc2lvbgorU3BoaW54XCBbI2YxXV8JICAgICAgIDEuMgkJc3BoaW54LWJ1aWxkIC0tdmVyc2lvbgorPT09PT09PT09PT09PT09PT09PT09PSA9PT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorLi4gWyNmMV0gU3BoaW54IGlzIG5lZWRlZCBvbmx5IHRvIGJ1aWxkIHRoZSBLZXJuZWwgZG9jdW1lbnRhdGlvbgogCiBLZXJuZWwgY29tcGlsYXRpb24KLT09PT09PT09PT09PT09PT09PQorKioqKioqKioqKioqKioqKioqCiAKIEdDQwogLS0tCkBAIC02NCwxNiArNzUsMTYgQEAKIEJpbnV0aWxzCiAtLS0tLS0tLQogCi1MaW51eCBvbiBJQS0zMiBoYXMgcmVjZW50bHkgc3dpdGNoZWQgZnJvbSB1c2luZyBhczg2IHRvIHVzaW5nIGdhcyBmb3IKLWFzc2VtYmxpbmcgdGhlIDE2LWJpdCBib290IGNvZGUsIHJlbW92aW5nIHRoZSBuZWVkIGZvciBhczg2IHRvIGNvbXBpbGUKK0xpbnV4IG9uIElBLTMyIGhhcyByZWNlbnRseSBzd2l0Y2hlZCBmcm9tIHVzaW5nIGBgYXM4NmBgIHRvIHVzaW5nIGBgZ2FzYGAgZm9yCithc3NlbWJsaW5nIHRoZSAxNi1iaXQgYm9vdCBjb2RlLCByZW1vdmluZyB0aGUgbmVlZCBmb3IgYGBhczg2YGAgdG8gY29tcGlsZQogeW91ciBrZXJuZWwuICBUaGlzIGNoYW5nZSBkb2VzLCBob3dldmVyLCBtZWFuIHRoYXQgeW91IG5lZWQgYSByZWNlbnQKIHJlbGVhc2Ugb2YgYmludXRpbHMuCiAKIFBlcmwKIC0tLS0KIAotWW91IHdpbGwgbmVlZCBwZXJsIDUgYW5kIHRoZSBmb2xsb3dpbmcgbW9kdWxlczogR2V0b3B0OjpMb25nLCBHZXRvcHQ6OlN0ZCwKLUZpbGU6OkJhc2VuYW1lLCBhbmQgRmlsZTo6RmluZCB0byBidWlsZCB0aGUga2VybmVsLgorWW91IHdpbGwgbmVlZCBwZXJsIDUgYW5kIHRoZSBmb2xsb3dpbmcgbW9kdWxlczogYGBHZXRvcHQ6OkxvbmdgYCwKK2BgR2V0b3B0OjpTdGRgYCwgYGBGaWxlOjpCYXNlbmFtZWBgLCBhbmQgYGBGaWxlOjpGaW5kYGAgdG8gYnVpbGQgdGhlIGtlcm5lbC4KIAogQkMKIC0tCkBAIC05Myw3ICsxMDQsNyBAQAogCiAKIFN5c3RlbSB1dGlsaXRpZXMKLT09PT09PT09PT09PT09PT0KKyoqKioqKioqKioqKioqKioKIAogQXJjaGl0ZWN0dXJhbCBjaGFuZ2VzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTExNSw3ICsxMjYsNyBAQAogVXRpbC1saW51eAogLS0tLS0tLS0tLQogCi1OZXcgdmVyc2lvbnMgb2YgdXRpbC1saW51eCBwcm92aWRlICpmZGlzayBzdXBwb3J0IGZvciBsYXJnZXIgZGlza3MsCitOZXcgdmVyc2lvbnMgb2YgdXRpbC1saW51eCBwcm92aWRlIGBgZmRpc2tgYCBzdXBwb3J0IGZvciBsYXJnZXIgZGlza3MsCiBzdXBwb3J0IG5ldyBvcHRpb25zIHRvIG1vdW50LCByZWNvZ25pemUgbW9yZSBzdXBwb3J0ZWQgcGFydGl0aW9uCiB0eXBlcywgaGF2ZSBhIGZkZm9ybWF0IHdoaWNoIHdvcmtzIHdpdGggMi40IGtlcm5lbHMsIGFuZCBzaW1pbGFyIGdvb2RpZXMuCiBZb3UnbGwgcHJvYmFibHkgd2FudCB0byB1cGdyYWRlLgpAQCAtMTI1LDU0ICsxMzYsNTcgQEAKIAogSWYgdGhlIHVudGhpbmthYmxlIGhhcHBlbnMgYW5kIHlvdXIga2VybmVsIG9vcHNlcywgeW91IG1heSBuZWVkIHRoZQoga3N5bW9vcHMgdG9vbCB0byBkZWNvZGUgaXQsIGJ1dCBpbiBtb3N0IGNhc2VzIHlvdSBkb24ndC4KLUl0IGlzIGdlbmVyYWxseSBwcmVmZXJyZWQgdG8gYnVpbGQgdGhlIGtlcm5lbCB3aXRoIENPTkZJR19LQUxMU1lNUyBzbworSXQgaXMgZ2VuZXJhbGx5IHByZWZlcnJlZCB0byBidWlsZCB0aGUga2VybmVsIHdpdGggYGBDT05GSUdfS0FMTFNZTVNgYCBzbwogdGhhdCBpdCBwcm9kdWNlcyByZWFkYWJsZSBkdW1wcyB0aGF0IGNhbiBiZSB1c2VkIGFzLWlzICh0aGlzIGFsc28KIHByb2R1Y2VzIGJldHRlciBvdXRwdXQgdGhhbiBrc3ltb29wcykuICBJZiBmb3Igc29tZSByZWFzb24geW91ciBrZXJuZWwKLWlzIG5vdCBidWlsZCB3aXRoIENPTkZJR19LQUxMU1lNUyBhbmQgeW91IGhhdmUgbm8gd2F5IHRvIHJlYnVpbGQgYW5kCitpcyBub3QgYnVpbGQgd2l0aCBgYENPTkZJR19LQUxMU1lNU2BgIGFuZCB5b3UgaGF2ZSBubyB3YXkgdG8gcmVidWlsZCBhbmQKIHJlcHJvZHVjZSB0aGUgT29wcyB3aXRoIHRoYXQgb3B0aW9uLCB0aGVuIHlvdSBjYW4gc3RpbGwgZGVjb2RlIHRoYXQgT29wcwogd2l0aCBrc3ltb29wcy4KIAogTW9kdWxlLUluaXQtVG9vbHMKIC0tLS0tLS0tLS0tLS0tLS0tCiAKLUEgbmV3IG1vZHVsZSBsb2FkZXIgaXMgbm93IGluIHRoZSBrZXJuZWwgdGhhdCByZXF1aXJlcyBtb2R1bGUtaW5pdC10b29scworQSBuZXcgbW9kdWxlIGxvYWRlciBpcyBub3cgaW4gdGhlIGtlcm5lbCB0aGF0IHJlcXVpcmVzIGBgbW9kdWxlLWluaXQtdG9vbHNgYAogdG8gdXNlLiAgSXQgaXMgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIHRoZSAyLjQueCBzZXJpZXMga2VybmVscy4KIAogTWtpbml0cmQKIC0tLS0tLS0tCiAKLVRoZXNlIGNoYW5nZXMgdG8gdGhlIC9saWIvbW9kdWxlcyBmaWxlIHRyZWUgbGF5b3V0IGFsc28gcmVxdWlyZSB0aGF0CitUaGVzZSBjaGFuZ2VzIHRvIHRoZSBgYC9saWIvbW9kdWxlc2BgIGZpbGUgdHJlZSBsYXlvdXQgYWxzbyByZXF1aXJlIHRoYXQKIG1raW5pdHJkIGJlIHVwZ3JhZGVkLgogCiBFMmZzcHJvZ3MKIC0tLS0tLS0tLQogCi1UaGUgbGF0ZXN0IHZlcnNpb24gb2YgZTJmc3Byb2dzIGZpeGVzIHNldmVyYWwgYnVncyBpbiBmc2NrIGFuZAorVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGBgZTJmc3Byb2dzYGAgZml4ZXMgc2V2ZXJhbCBidWdzIGluIGZzY2sgYW5kCiBkZWJ1Z2ZzLiAgT2J2aW91c2x5LCBpdCdzIGEgZ29vZCBpZGVhIHRvIHVwZ3JhZGUuCiAKIEpGU3V0aWxzCiAtLS0tLS0tLQogCi1UaGUgamZzdXRpbHMgcGFja2FnZSBjb250YWlucyB0aGUgdXRpbGl0aWVzIGZvciB0aGUgZmlsZSBzeXN0ZW0uCitUaGUgYGBqZnN1dGlsc2BgIHBhY2thZ2UgY29udGFpbnMgdGhlIHV0aWxpdGllcyBmb3IgdGhlIGZpbGUgc3lzdGVtLgogVGhlIGZvbGxvd2luZyB1dGlsaXRpZXMgYXJlIGF2YWlsYWJsZToKLW8gZnNjay5qZnMgLSBpbml0aWF0ZSByZXBsYXkgb2YgdGhlIHRyYW5zYWN0aW9uIGxvZywgYW5kIGNoZWNrCisKKy0gYGBmc2NrLmpmc2BgIC0gaW5pdGlhdGUgcmVwbGF5IG9mIHRoZSB0cmFuc2FjdGlvbiBsb2csIGFuZCBjaGVjawogICBhbmQgcmVwYWlyIGEgSkZTIGZvcm1hdHRlZCBwYXJ0aXRpb24uCi1vIG1rZnMuamZzIC0gY3JlYXRlIGEgSkZTIGZvcm1hdHRlZCBwYXJ0aXRpb24uCi1vIG90aGVyIGZpbGUgc3lzdGVtIHV0aWxpdGllcyBhcmUgYWxzbyBhdmFpbGFibGUgaW4gdGhpcyBwYWNrYWdlLgorCistIGBgbWtmcy5qZnNgYCAtIGNyZWF0ZSBhIEpGUyBmb3JtYXR0ZWQgcGFydGl0aW9uLgorCistIG90aGVyIGZpbGUgc3lzdGVtIHV0aWxpdGllcyBhcmUgYWxzbyBhdmFpbGFibGUgaW4gdGhpcyBwYWNrYWdlLgogCiBSZWlzZXJmc3Byb2dzCiAtLS0tLS0tLS0tLS0tCiAKIFRoZSByZWlzZXJmc3Byb2dzIHBhY2thZ2Ugc2hvdWxkIGJlIHVzZWQgZm9yIHJlaXNlcmZzLTMuNi54CiAoTGludXgga2VybmVscyAyLjQueCkuIEl0IGlzIGEgY29tYmluZWQgcGFja2FnZSBhbmQgY29udGFpbnMgd29ya2luZwotdmVyc2lvbnMgb2YgbWtyZWlzZXJmcywgcmVzaXplX3JlaXNlcmZzLCBkZWJ1Z3JlaXNlcmZzIGFuZAotcmVpc2VyZnNjay4gVGhlc2UgdXRpbHMgd29yayBvbiBib3RoIGkzODYgYW5kIGFscGhhIHBsYXRmb3Jtcy4KK3ZlcnNpb25zIG9mIGBgbWtyZWlzZXJmc2BgLCBgYHJlc2l6ZV9yZWlzZXJmc2BgLCBgYGRlYnVncmVpc2VyZnNgYCBhbmQKK2BgcmVpc2VyZnNja2BgLiBUaGVzZSB1dGlscyB3b3JrIG9uIGJvdGggaTM4NiBhbmQgYWxwaGEgcGxhdGZvcm1zLgogCiBYZnNwcm9ncwogLS0tLS0tLS0KIAotVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHhmc3Byb2dzIGNvbnRhaW5zIG1rZnMueGZzLCB4ZnNfZGIsIGFuZCB0aGUKLXhmc19yZXBhaXIgdXRpbGl0aWVzLCBhbW9uZyBvdGhlcnMsIGZvciB0aGUgWEZTIGZpbGVzeXN0ZW0uICBJdCBpcworVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGBgeGZzcHJvZ3NgYCBjb250YWlucyBgYG1rZnMueGZzYGAsIGBgeGZzX2RiYGAsIGFuZCB0aGUKK2BgeGZzX3JlcGFpcmBgIHV0aWxpdGllcywgYW1vbmcgb3RoZXJzLCBmb3IgdGhlIFhGUyBmaWxlc3lzdGVtLiAgSXQgaXMKIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBhbmQgYW55IHZlcnNpb24gZnJvbSAyLjAuMCBvbndhcmQgc2hvdWxkCiB3b3JrIGNvcnJlY3RseSB3aXRoIHRoaXMgdmVyc2lvbiBvZiB0aGUgWEZTIGtlcm5lbCBjb2RlICgyLjYuMCBvcgogbGF0ZXIgaXMgcmVjb21tZW5kZWQsIGR1ZSB0byBzb21lIHNpZ25pZmljYW50IGltcHJvdmVtZW50cykuCkBAIC0xODAsNyArMTk0LDcgQEAKIFBDTUNJQXV0aWxzCiAtLS0tLS0tLS0tLQogCi1QQ01DSUF1dGlscyByZXBsYWNlcyBwY21jaWEtY3MuIEl0IHByb3Blcmx5IHNldHMgdXAKK1BDTUNJQXV0aWxzIHJlcGxhY2VzIGBgcGNtY2lhLWNzYGAuIEl0IHByb3Blcmx5IHNldHMgdXAKIFBDTUNJQSBzb2NrZXRzIGF0IHN5c3RlbSBzdGFydHVwIGFuZCBsb2FkcyB0aGUgYXBwcm9wcmlhdGUgbW9kdWxlcwogZm9yIDE2LWJpdCBQQ01DSUEgZGV2aWNlcyBpZiB0aGUga2VybmVsIGlzIG1vZHVsYXJpemVkIGFuZCB0aGUgaG90cGx1Zwogc3Vic3lzdGVtIGlzIHVzZWQuCkBAIC0xOTgsMTkgKzIxMiwyMCBAQAogCiBBIGRyaXZlciBoYXMgYmVlbiBhZGRlZCB0byBhbGxvdyB1cGRhdGluZyBvZiBJbnRlbCBJQTMyIG1pY3JvY29kZSwKIGFjY2Vzc2libGUgYXMgYSBub3JtYWwgKG1pc2MpIGNoYXJhY3RlciBkZXZpY2UuICBJZiB5b3UgYXJlIG5vdCB1c2luZwotdWRldiB5b3UgbWF5IG5lZWQgdG86Cit1ZGV2IHlvdSBtYXkgbmVlZCB0bzo6CiAKLW1rZGlyIC9kZXYvY3B1Ci1ta25vZCAvZGV2L2NwdS9taWNyb2NvZGUgYyAxMCAxODQKLWNobW9kIDA2NDQgL2Rldi9jcHUvbWljcm9jb2RlCisgIG1rZGlyIC9kZXYvY3B1CisgIG1rbm9kIC9kZXYvY3B1L21pY3JvY29kZSBjIDEwIDE4NAorICBjaG1vZCAwNjQ0IC9kZXYvY3B1L21pY3JvY29kZQogCiBhcyByb290IGJlZm9yZSB5b3UgY2FuIHVzZSB0aGlzLiAgWW91J2xsIHByb2JhYmx5IGFsc28gd2FudCB0bwogZ2V0IHRoZSB1c2VyLXNwYWNlIG1pY3JvY29kZV9jdGwgdXRpbGl0eSB0byB1c2Ugd2l0aCB0aGlzLgogCiB1ZGV2CiAtLS0tCi11ZGV2IGlzIGEgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIGZvciBwb3B1bGF0aW5nIC9kZXYgZHluYW1pY2FsbHkgd2l0aAotb25seSBlbnRyaWVzIGZvciBkZXZpY2VzIGFjdHVhbGx5IHByZXNlbnQuICB1ZGV2IHJlcGxhY2VzIHRoZSBiYXNpYworCitgYHVkZXZgYCBpcyBhIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiBmb3IgcG9wdWxhdGluZyBgYC9kZXZgYCBkeW5hbWljYWxseSB3aXRoCitvbmx5IGVudHJpZXMgZm9yIGRldmljZXMgYWN0dWFsbHkgcHJlc2VudC4gYGB1ZGV2YGAgcmVwbGFjZXMgdGhlIGJhc2ljCiBmdW5jdGlvbmFsaXR5IG9mIGRldmZzLCB3aGlsZSBhbGxvd2luZyBwZXJzaXN0ZW50IGRldmljZSBuYW1pbmcgZm9yCiBkZXZpY2VzLgogCkBAIC0yMTgsMTAgKzIzMywxMCBAQAogLS0tLQogCiBOZWVkcyBsaWJmdXNlIDIuNC4wIG9yIGxhdGVyLiAgQWJzb2x1dGUgbWluaW11bSBpcyAyLjMuMCBidXQgbW91bnQKLW9wdGlvbnMgJ2RpcmVjdF9pbycgYW5kICdrZXJuZWxfY2FjaGUnIHdvbid0IHdvcmsuCitvcHRpb25zIGBgZGlyZWN0X2lvYGAgYW5kIGBga2VybmVsX2NhY2hlYGAgd29uJ3Qgd29yay4KIAogTmV0d29ya2luZwotPT09PT09PT09PQorKioqKioqKioqKgogCiBHZW5lcmFsIGNoYW5nZXMKIC0tLS0tLS0tLS0tLS0tLQpAQCAtMjQzLDkgKzI1OCw5IEBACiB1cGdyYWRlIHBwcGQgdG8gYXQgbGVhc3QgMi40LjAuCiAKIElmIHlvdSBhcmUgbm90IHVzaW5nIHVkZXYsIHlvdSBtdXN0IGhhdmUgdGhlIGRldmljZSBmaWxlIC9kZXYvcHBwCi13aGljaCBjYW4gYmUgbWFkZSBieToKK3doaWNoIGNhbiBiZSBtYWRlIGJ5OjoKIAotbWtub2QgL2Rldi9wcHAgYyAxMDggMAorICBta25vZCAvZGV2L3BwcCBjIDEwOCAwCiAKIGFzIHJvb3QuCiAKQEAgLTI2MCwyMiArMjc1LDIyIEBACiAKIEluIGFuY2llbnQgKDIuNCBhbmQgZWFybGllcikga2VybmVscywgdGhlIG5mcyBzZXJ2ZXIgbmVlZGVkIHRvIGtub3cKIGFib3V0IGFueSBjbGllbnQgdGhhdCBleHBlY3RlZCB0byBiZSBhYmxlIHRvIGFjY2VzcyBmaWxlcyB2aWEgTkZTLiAgVGhpcwotaW5mb3JtYXRpb24gd291bGQgYmUgZ2l2ZW4gdG8gdGhlIGtlcm5lbCBieSAibW91bnRkIiB3aGVuIHRoZSBjbGllbnQKLW1vdW50ZWQgdGhlIGZpbGVzeXN0ZW0sIG9yIGJ5ICJleHBvcnRmcyIgYXQgc3lzdGVtIHN0YXJ0dXAuICBleHBvcnRmcwotd291bGQgdGFrZSBpbmZvcm1hdGlvbiBhYm91dCBhY3RpdmUgY2xpZW50cyBmcm9tIC92YXIvbGliL25mcy9ybXRhYi4KK2luZm9ybWF0aW9uIHdvdWxkIGJlIGdpdmVuIHRvIHRoZSBrZXJuZWwgYnkgYGBtb3VudGRgYCB3aGVuIHRoZSBjbGllbnQKK21vdW50ZWQgdGhlIGZpbGVzeXN0ZW0sIG9yIGJ5IGBgZXhwb3J0ZnNgYCBhdCBzeXN0ZW0gc3RhcnR1cC4gIGV4cG9ydGZzCit3b3VsZCB0YWtlIGluZm9ybWF0aW9uIGFib3V0IGFjdGl2ZSBjbGllbnRzIGZyb20gYGAvdmFyL2xpYi9uZnMvcm10YWJgYC4KIAogVGhpcyBhcHByb2FjaCBpcyBxdWl0ZSBmcmFnaWxlIGFzIGl0IGRlcGVuZHMgb24gcm10YWIgYmVpbmcgY29ycmVjdAogd2hpY2ggaXMgbm90IGFsd2F5cyBlYXN5LCBwYXJ0aWN1bGFybHkgd2hlbiB0cnlpbmcgdG8gaW1wbGVtZW50Ci1mYWlsLW92ZXIuICBFdmVuIHdoZW4gdGhlIHN5c3RlbSBpcyB3b3JraW5nIHdlbGwsIHJtdGFiIHN1ZmZlcnMgZnJvbQorZmFpbC1vdmVyLiAgRXZlbiB3aGVuIHRoZSBzeXN0ZW0gaXMgd29ya2luZyB3ZWxsLCBgYHJtdGFiYGAgc3VmZmVycyBmcm9tCiBnZXR0aW5nIGxvdHMgb2Ygb2xkIGVudHJpZXMgdGhhdCBuZXZlciBnZXQgcmVtb3ZlZC4KIAogV2l0aCBtb2Rlcm4ga2VybmVscyB3ZSBoYXZlIHRoZSBvcHRpb24gb2YgaGF2aW5nIHRoZSBrZXJuZWwgdGVsbCBtb3VudGQKIHdoZW4gaXQgZ2V0cyBhIHJlcXVlc3QgZnJvbSBhbiB1bmtub3duIGhvc3QsIGFuZCBtb3VudGQgY2FuIGdpdmUKIGFwcHJvcHJpYXRlIGV4cG9ydCBpbmZvcm1hdGlvbiB0byB0aGUga2VybmVsLiAgVGhpcyByZW1vdmVzIHRoZQotZGVwZW5kZW5jeSBvbiBybXRhYiBhbmQgbWVhbnMgdGhhdCB0aGUga2VybmVsIG9ubHkgbmVlZHMgdG8ga25vdyBhYm91dAorZGVwZW5kZW5jeSBvbiBgYHJtdGFiYGAgYW5kIG1lYW5zIHRoYXQgdGhlIGtlcm5lbCBvbmx5IG5lZWRzIHRvIGtub3cgYWJvdXQKIGN1cnJlbnRseSBhY3RpdmUgY2xpZW50cy4KIAotVG8gZW5hYmxlIHRoaXMgbmV3IGZ1bmN0aW9uYWxpdHksIHlvdSBuZWVkIHRvOgorVG8gZW5hYmxlIHRoaXMgbmV3IGZ1bmN0aW9uYWxpdHksIHlvdSBuZWVkIHRvOjoKIAogICBtb3VudCAtdCBuZnNkIG5mc2QgL3Byb2MvZnMvbmZzZAogCkBAIC0yODcsOCArMzAyLDMyIEBACiAtLS0tLS0KIAogT24geDg2IGtlcm5lbHMgdGhlIG1jZWxvZyB1dGlsaXR5IGlzIG5lZWRlZCB0byBwcm9jZXNzIGFuZCBsb2cgbWFjaGluZSBjaGVjawotZXZlbnRzIHdoZW4gQ09ORklHX1g4Nl9NQ0UgaXMgZW5hYmxlZC4gTWFjaGluZSBjaGVjayBldmVudHMgYXJlIGVycm9ycyByZXBvcnRlZAotYnkgdGhlIENQVS4gUHJvY2Vzc2luZyB0aGVtIGlzIHN0cm9uZ2x5IGVuY291cmFnZWQuCitldmVudHMgd2hlbiBgYENPTkZJR19YODZfTUNFYGAgaXMgZW5hYmxlZC4gTWFjaGluZSBjaGVjayBldmVudHMgYXJlIGVycm9ycworcmVwb3J0ZWQgYnkgdGhlIENQVS4gUHJvY2Vzc2luZyB0aGVtIGlzIHN0cm9uZ2x5IGVuY291cmFnZWQuCisKK0tlcm5lbCBkb2N1bWVudGF0aW9uCisqKioqKioqKioqKioqKioqKioqKgorCitTcGhpbngKKy0tLS0tLQorCitUaGUgUmVTVCBtYXJrdXBzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBEb2N1bWVudGF0aW9uLyBmaWxlcyBhcmUgbWVhbnQgdG8gYmUKK2J1aWx0IHdpdGggYGBTcGhpbnhgYCB2ZXJzaW9uIDEuMiBvciB1cHBlci4gSWYgeW91J3JlIGRlc2lyaW5nIHRvIGJ1aWxkCitQREYgb3V0cHV0cywgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIHZlcnNpb24gMS40LjYuCisKKy4uIG5vdGU6OgorCisgIFBsZWFzZSBub3RpY2UgdGhhdCwgZm9yIFBERiBhbmQgTGFUZVggb3V0cHV0LCB5b3UnbGwgYWxzbyBuZWVkIGBgWGVMYVRlWGBgCisgIHZlcnNpb24gMy4xNDE1OTI2NS4gRGVwZW5kaW5nIG9uIHRoZSBkaXN0cmlidXRpb24sIHlvdSBtYXkgYWxzbyBuZWVkCisgIHRvIGluc3RhbGwgYSBzZXJpZXMgb2YgYGB0ZXhsaXZlYGAgcGFja2FnZXMgdGhhdCBwcm92aWRlIHRoZSBtaW5pbWFsCisgIHNldCBvZiBmdW5jdGlvbmFsaXRpZXMgcmVxdWlyZWQgZm9yIGBgWGVMYVRleGBgIHRvIHdvcmsuCisKK090aGVyIHRvb2xzCistLS0tLS0tLS0tLQorCitJbiBvcmRlciB0byBwcm9kdWNlIGRvY3VtZW50YXRpb24gZnJvbSBEb2NCb29rLCB5b3UnbGwgYWxzbyBuZWVkIGBgeG1sdG9gYC4KK1BsZWFzZSBub3RpY2UsIGhvd2V2ZXIsIHRoYXQgd2UncmUgY3VycmVudGx5IG1pZ3JhdGluZyBhbGwgZG9jdW1lbnRzIHRvIHVzZQorYGBTcGhpbnhgYC4KIAogR2V0dGluZyB1cGRhdGVkIHNvZnR3YXJlCiA9PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTI5OCwxMTQgKzMzNywxNDkgQEAKIAogZ2NjCiAtLS0KLW8gIDxmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvZ2NjLz4KKworLSA8ZnRwOi8vZnRwLmdudS5vcmcvZ251L2djYy8+CiAKIE1ha2UKIC0tLS0KLW8gIDxmdHA6Ly9mdHAuZ251Lm9yZy9nbnUvbWFrZS8+CisKKy0gPGZ0cDovL2Z0cC5nbnUub3JnL2dudS9tYWtlLz4KIAogQmludXRpbHMKIC0tLS0tLS0tCi1vICA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2RldmVsL2JpbnV0aWxzLz4KKworLSA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2RldmVsL2JpbnV0aWxzLz4KIAogT3BlblNTTAogLS0tLS0tLQotbyAgPGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnLz4KKworLSA8aHR0cHM6Ly93d3cub3BlbnNzbC5vcmcvPgogCiBTeXN0ZW0gdXRpbGl0aWVzCiAqKioqKioqKioqKioqKioqCiAKIFV0aWwtbGludXgKIC0tLS0tLS0tLS0KLW8gIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvdXRpbC1saW51eC8+CisKKy0gPGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy91dGlsLWxpbnV4Lz4KIAogS3N5bW9vcHMKIC0tLS0tLS0tCi1vICA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2tlcm5lbC9rc3ltb29wcy92Mi40Lz4KKworLSA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2tlcm5lbC9rc3ltb29wcy92Mi40Lz4KIAogTW9kdWxlLUluaXQtVG9vbHMKIC0tLS0tLS0tLS0tLS0tLS0tCi1vICA8ZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvcnVzdHkvbW9kdWxlcy8+CisKKy0gPGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL3J1c3R5L21vZHVsZXMvPgogCiBNa2luaXRyZAogLS0tLS0tLS0KLW8gIDxodHRwczovL2NvZGUubGF1bmNocGFkLm5ldC9pbml0cmQtdG9vbHMvbWFpbj4KKworLSA8aHR0cHM6Ly9jb2RlLmxhdW5jaHBhZC5uZXQvaW5pdHJkLXRvb2xzL21haW4+CiAKIEUyZnNwcm9ncwogLS0tLS0tLS0tCi1vICA8aHR0cDovL3ByZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC9lMmZzcHJvZ3MvZTJmc3Byb2dzLTEuMjkudGFyLmd6PgorCistIDxodHRwOi8vcHJkb3dubG9hZHMuc291cmNlZm9yZ2UubmV0L2UyZnNwcm9ncy9lMmZzcHJvZ3MtMS4yOS50YXIuZ3o+CiAKIEpGU3V0aWxzCiAtLS0tLS0tLQotbyAgPGh0dHA6Ly9qZnMuc291cmNlZm9yZ2UubmV0Lz4KKworLSA8aHR0cDovL2pmcy5zb3VyY2Vmb3JnZS5uZXQvPgogCiBSZWlzZXJmc3Byb2dzCiAtLS0tLS0tLS0tLS0tCi1vICA8aHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9mcy9yZWlzZXJmcy8+CisKKy0gPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMvZnMvcmVpc2VyZnMvPgogCiBYZnNwcm9ncwogLS0tLS0tLS0KLW8gIDxmdHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy94ZnMvPgorCistIDxmdHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy94ZnMvPgogCiBQY21jaWF1dGlscwogLS0tLS0tLS0tLS0KLW8gIDxmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL3BjbWNpYS8+CisKKy0gPGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9rZXJuZWwvcGNtY2lhLz4KIAogUXVvdGEtdG9vbHMKLS0tLS0tLS0tLS0KLW8gIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpbnV4cXVvdGEvPgorLS0tLS0tLS0tLS0KKworLSA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saW51eHF1b3RhLz4KIAogRG9jQm9vayBTdHlsZXNoZWV0cwogLS0tLS0tLS0tLS0tLS0tLS0tLQotbyAgPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZG9jYm9vay9maWxlcy9kb2Nib29rLWRzc3NsLz4KKworLSA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9kb2Nib29rL2ZpbGVzL2RvY2Jvb2stZHNzc2wvPgogCiBYTUxUTyBYU0xUIEZyb250ZW5kCiAtLS0tLS0tLS0tLS0tLS0tLS0tCi1vICA8aHR0cDovL2N5YmVyZWxrLm5ldC90aW0veG1sdG8vPgorCistIDxodHRwOi8vY3liZXJlbGsubmV0L3RpbS94bWx0by8+CiAKIEludGVsIFA2IG1pY3JvY29kZQogLS0tLS0tLS0tLS0tLS0tLS0tCi1vICA8aHR0cHM6Ly9kb3dubG9hZGNlbnRlci5pbnRlbC5jb20vPgorCistIDxodHRwczovL2Rvd25sb2FkY2VudGVyLmludGVsLmNvbS8+CiAKIHVkZXYKIC0tLS0KLW8gPGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL3N5c3RlbWQvbWFuL3VkZXYuaHRtbD4KKworLSA8aHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvc29mdHdhcmUvc3lzdGVtZC9tYW4vdWRldi5odG1sPgogCiBGVVNFCiAtLS0tCi1vIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2Z1c2U+CisKKy0gPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZnVzZT4KIAogbWNlbG9nCiAtLS0tLS0KLW8gPGh0dHA6Ly93d3cubWNlbG9nLm9yZy8+CisKKy0gPGh0dHA6Ly93d3cubWNlbG9nLm9yZy8+CiAKIE5ldHdvcmtpbmcKICoqKioqKioqKioKIAogUFBQCiAtLS0KLW8gIDxmdHA6Ly9mdHAuc2FtYmEub3JnL3B1Yi9wcHAvPgorCistIDxmdHA6Ly9mdHAuc2FtYmEub3JnL3B1Yi9wcHAvPgogCiBJc2RuNGstdXRpbHMKIC0tLS0tLS0tLS0tLQotbyAgPGZ0cDovL2Z0cC5pc2RuNGxpbnV4LmRlL3B1Yi9pc2RuNGxpbnV4L3V0aWxzLz4KKworLSA8ZnRwOi8vZnRwLmlzZG40bGludXguZGUvcHViL2lzZG40bGludXgvdXRpbHMvPgogCiBORlMtdXRpbHMKIC0tLS0tLS0tLQotbyAgPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9zaG93ZmlsZXMucGhwP2dyb3VwX2lkPTE0PgorCistIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Qvc2hvd2ZpbGVzLnBocD9ncm91cF9pZD0xND4KIAogSXB0YWJsZXMKIC0tLS0tLS0tCi1vICA8aHR0cDovL3d3dy5pcHRhYmxlcy5vcmcvZG93bmxvYWRzLmh0bWw+CisKKy0gPGh0dHA6Ly93d3cuaXB0YWJsZXMub3JnL2Rvd25sb2Fkcy5odG1sPgogCiBJcC1yb3V0ZTIKIC0tLS0tLS0tLQotbyAgPGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL25ldC9pcHJvdXRlMi8+CisKKy0gPGh0dHBzOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL25ldC9pcHJvdXRlMi8+CiAKIE9Qcm9maWxlCiAtLS0tLS0tLQotbyAgPGh0dHA6Ly9vcHJvZmlsZS5zZi5uZXQvZG93bmxvYWQvPgorCistIDxodHRwOi8vb3Byb2ZpbGUuc2YubmV0L2Rvd25sb2FkLz4KIAogTkZTLVV0aWxzCiAtLS0tLS0tLS0KLW8gIDxodHRwOi8vbmZzLnNvdXJjZWZvcmdlLm5ldC8+CisKKy0gPGh0dHA6Ly9uZnMuc291cmNlZm9yZ2UubmV0Lz4KKworS2VybmVsIGRvY3VtZW50YXRpb24KKyoqKioqKioqKioqKioqKioqKioqCisKK1NwaGlueAorLS0tLS0tCisKKy0gPGh0dHA6Ly93d3cuc3BoaW54LWRvYy5vcmcvPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Db2RlT2ZDb25mbGljdCBiL0RvY3VtZW50YXRpb24vQ29kZU9mQ29uZmxpY3QKaW5kZXggMTY4NGQwYi4uNDlhOGVjYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Db2RlT2ZDb25mbGljdAorKysgYi9Eb2N1bWVudGF0aW9uL0NvZGVPZkNvbmZsaWN0CkBAIC0xOSw3ICsxOSw3IEBACiB3aWxsIHdvcmsgdG8gcmVzb2x2ZSB0aGUgaXNzdWUgdG8gdGhlIGJlc3Qgb2YgdGhlaXIgYWJpbGl0eS4gIEZvciBtb3JlCiBpbmZvcm1hdGlvbiBvbiB3aG8gaXMgb24gdGhlIFRlY2huaWNhbCBBZHZpc29yeSBCb2FyZCBhbmQgd2hhdCB0aGVpcgogcm9sZSBpcywgcGxlYXNlIHNlZToKLQlodHRwOi8vd3d3LmxpbnV4Zm91bmRhdGlvbi5vcmcvcHJvZ3JhbXMvYWR2aXNvcnktY291bmNpbHMvdGFiCisJaHR0cDovL3d3dy5saW51eGZvdW5kYXRpb24ub3JnL3Byb2plY3RzL2xpbnV4L3RhYgogCiBBcyBhIHJldmlld2VyIG9mIGNvZGUsIHBsZWFzZSBzdHJpdmUgdG8ga2VlcCB0aGluZ3MgY2l2aWwgYW5kIGZvY3VzZWQgb24KIHRoZSB0ZWNobmljYWwgaXNzdWVzIGludm9sdmVkLiAgV2UgYXJlIGFsbCBodW1hbnMsIGFuZCBmcnVzdHJhdGlvbnMgY2FuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQppbmRleCBhMDk2ODM2Li45YzYxYzAzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisrKyBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKQEAgLTEsOCArMSwxMCBAQAorLi4gX2NvZGluZ3N0eWxlOgogCi0JCUxpbnV4IGtlcm5lbCBjb2Rpbmcgc3R5bGUKK0xpbnV4IGtlcm5lbCBjb2Rpbmcgc3R5bGUKKz09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVGhpcyBpcyBhIHNob3J0IGRvY3VtZW50IGRlc2NyaWJpbmcgdGhlIHByZWZlcnJlZCBjb2Rpbmcgc3R5bGUgZm9yIHRoZQotbGludXgga2VybmVsLiAgQ29kaW5nIHN0eWxlIGlzIHZlcnkgcGVyc29uYWwsIGFuZCBJIHdvbid0IF9mb3JjZV8gbXkKK2xpbnV4IGtlcm5lbC4gIENvZGluZyBzdHlsZSBpcyB2ZXJ5IHBlcnNvbmFsLCBhbmQgSSB3b24ndCAqKmZvcmNlKiogbXkKIHZpZXdzIG9uIGFueWJvZHksIGJ1dCB0aGlzIGlzIHdoYXQgZ29lcyBmb3IgYW55dGhpbmcgdGhhdCBJIGhhdmUgdG8gYmUKIGFibGUgdG8gbWFpbnRhaW4sIGFuZCBJJ2QgcHJlZmVyIGl0IGZvciBtb3N0IG90aGVyIHRoaW5ncyB0b28uICBQbGVhc2UKIGF0IGxlYXN0IGNvbnNpZGVyIHRoZSBwb2ludHMgbWFkZSBoZXJlLgpAQCAtMTMsNyArMTUsOCBAQAogQW55d2F5LCBoZXJlIGdvZXM6CiAKIAotCQlDaGFwdGVyIDE6IEluZGVudGF0aW9uCisxKSBJbmRlbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KIAogVGFicyBhcmUgOCBjaGFyYWN0ZXJzLCBhbmQgdGh1cyBpbmRlbnRhdGlvbnMgYXJlIGFsc28gOCBjaGFyYWN0ZXJzLgogVGhlcmUgYXJlIGhlcmV0aWMgbW92ZW1lbnRzIHRoYXQgdHJ5IHRvIG1ha2UgaW5kZW50YXRpb25zIDQgKG9yIGV2ZW4gMiEpCkBAIC0zNiw4ICszOSwxMCBAQAogSGVlZCB0aGF0IHdhcm5pbmcuCiAKIFRoZSBwcmVmZXJyZWQgd2F5IHRvIGVhc2UgbXVsdGlwbGUgaW5kZW50YXRpb24gbGV2ZWxzIGluIGEgc3dpdGNoIHN0YXRlbWVudCBpcwotdG8gYWxpZ24gdGhlICJzd2l0Y2giIGFuZCBpdHMgc3Vib3JkaW5hdGUgImNhc2UiIGxhYmVscyBpbiB0aGUgc2FtZSBjb2x1bW4KLWluc3RlYWQgb2YgImRvdWJsZS1pbmRlbnRpbmciIHRoZSAiY2FzZSIgbGFiZWxzLiAgRS5nLjoKK3RvIGFsaWduIHRoZSBgYHN3aXRjaGBgIGFuZCBpdHMgc3Vib3JkaW5hdGUgYGBjYXNlYGAgbGFiZWxzIGluIHRoZSBzYW1lIGNvbHVtbgoraW5zdGVhZCBvZiBgYGRvdWJsZS1pbmRlbnRpbmdgYCB0aGUgYGBjYXNlYGAgbGFiZWxzLiAgRS5nLjoKKworLi4gY29kZS1ibG9jazo6IGMKIAogCXN3aXRjaCAoc3VmZml4KSB7CiAJY2FzZSAnRyc6CkBAIC01OSw2ICs2NCw4IEBACiBEb24ndCBwdXQgbXVsdGlwbGUgc3RhdGVtZW50cyBvbiBhIHNpbmdsZSBsaW5lIHVubGVzcyB5b3UgaGF2ZQogc29tZXRoaW5nIHRvIGhpZGU6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlpZiAoY29uZGl0aW9uKSBkb190aGlzOwogCSAgZG9fc29tZXRoaW5nX2V2ZXJ5dGltZTsKIApAQCAtNzEsNyArNzgsOCBAQAogR2V0IGEgZGVjZW50IGVkaXRvciBhbmQgZG9uJ3QgbGVhdmUgd2hpdGVzcGFjZSBhdCB0aGUgZW5kIG9mIGxpbmVzLgogCiAKLQkJQ2hhcHRlciAyOiBCcmVha2luZyBsb25nIGxpbmVzIGFuZCBzdHJpbmdzCisyKSBCcmVha2luZyBsb25nIGxpbmVzIGFuZCBzdHJpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIENvZGluZyBzdHlsZSBpcyBhbGwgYWJvdXQgcmVhZGFiaWxpdHkgYW5kIG1haW50YWluYWJpbGl0eSB1c2luZyBjb21tb25seQogYXZhaWxhYmxlIHRvb2xzLgpAQCAtODcsNyArOTUsOCBAQAogcHJpbnRrIG1lc3NhZ2VzLCBiZWNhdXNlIHRoYXQgYnJlYWtzIHRoZSBhYmlsaXR5IHRvIGdyZXAgZm9yIHRoZW0uCiAKIAotCQlDaGFwdGVyIDM6IFBsYWNpbmcgQnJhY2VzIGFuZCBTcGFjZXMKKzMpIFBsYWNpbmcgQnJhY2VzIGFuZCBTcGFjZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIG90aGVyIGlzc3VlIHRoYXQgYWx3YXlzIGNvbWVzIHVwIGluIEMgc3R5bGluZyBpcyB0aGUgcGxhY2VtZW50IG9mCiBicmFjZXMuICBVbmxpa2UgdGhlIGluZGVudCBzaXplLCB0aGVyZSBhcmUgZmV3IHRlY2huaWNhbCByZWFzb25zIHRvCkBAIC05NSw2ICsxMDQsOCBAQAogc2hvd24gdG8gdXMgYnkgdGhlIHByb3BoZXRzIEtlcm5pZ2hhbiBhbmQgUml0Y2hpZSwgaXMgdG8gcHV0IHRoZSBvcGVuaW5nCiBicmFjZSBsYXN0IG9uIHRoZSBsaW5lLCBhbmQgcHV0IHRoZSBjbG9zaW5nIGJyYWNlIGZpcnN0LCB0aHVzbHk6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlpZiAoeCBpcyB0cnVlKSB7CiAJCXdlIGRvIHkKIAl9CkBAIC0xMDIsNiArMTEzLDggQEAKIFRoaXMgYXBwbGllcyB0byBhbGwgbm9uLWZ1bmN0aW9uIHN0YXRlbWVudCBibG9ja3MgKGlmLCBzd2l0Y2gsIGZvciwKIHdoaWxlLCBkbykuICBFLmcuOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIEtPQkpfQUREOgogCQlyZXR1cm4gImFkZCI7CkBAIC0xMTYsNiArMTI5LDggQEAKIEhvd2V2ZXIsIHRoZXJlIGlzIG9uZSBzcGVjaWFsIGNhc2UsIG5hbWVseSBmdW5jdGlvbnM6IHRoZXkgaGF2ZSB0aGUKIG9wZW5pbmcgYnJhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBsaW5lLCB0aHVzOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJaW50IGZ1bmN0aW9uKGludCB4KQogCXsKIAkJYm9keSBvZiBmdW5jdGlvbgpAQCAtMTIzLDIwICsxMzgsMjQgQEAKIAogSGVyZXRpYyBwZW9wbGUgYWxsIG92ZXIgdGhlIHdvcmxkIGhhdmUgY2xhaW1lZCB0aGF0IHRoaXMgaW5jb25zaXN0ZW5jeQogaXMgLi4uICB3ZWxsIC4uLiAgaW5jb25zaXN0ZW50LCBidXQgYWxsIHJpZ2h0LXRoaW5raW5nIHBlb3BsZSBrbm93IHRoYXQKLShhKSBLJlIgYXJlIF9yaWdodF8gYW5kIChiKSBLJlIgYXJlIHJpZ2h0LiAgQmVzaWRlcywgZnVuY3Rpb25zIGFyZQorKGEpIEsmUiBhcmUgKipyaWdodCoqIGFuZCAoYikgSyZSIGFyZSByaWdodC4gIEJlc2lkZXMsIGZ1bmN0aW9ucyBhcmUKIHNwZWNpYWwgYW55d2F5ICh5b3UgY2FuJ3QgbmVzdCB0aGVtIGluIEMpLgogCi1Ob3RlIHRoYXQgdGhlIGNsb3NpbmcgYnJhY2UgaXMgZW1wdHkgb24gYSBsaW5lIG9mIGl0cyBvd24sIF9leGNlcHRfIGluCitOb3RlIHRoYXQgdGhlIGNsb3NpbmcgYnJhY2UgaXMgZW1wdHkgb24gYSBsaW5lIG9mIGl0cyBvd24sICoqZXhjZXB0KiogaW4KIHRoZSBjYXNlcyB3aGVyZSBpdCBpcyBmb2xsb3dlZCBieSBhIGNvbnRpbnVhdGlvbiBvZiB0aGUgc2FtZSBzdGF0ZW1lbnQsCi1pZSBhICJ3aGlsZSIgaW4gYSBkby1zdGF0ZW1lbnQgb3IgYW4gImVsc2UiIGluIGFuIGlmLXN0YXRlbWVudCwgbGlrZQoraWUgYSBgYHdoaWxlYGAgaW4gYSBkby1zdGF0ZW1lbnQgb3IgYW4gYGBlbHNlYGAgaW4gYW4gaWYtc3RhdGVtZW50LCBsaWtlCiB0aGlzOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJZG8gewogCQlib2R5IG9mIGRvLWxvb3AKIAl9IHdoaWxlIChjb25kaXRpb24pOwogCiBhbmQKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCWlmICh4ID09IHkpIHsKIAkJLi4KIAl9IGVsc2UgaWYgKHggPiB5KSB7CkBAIC0xNTUsMTEgKzE3NCwxNSBAQAogCiBEbyBub3QgdW5uZWNlc3NhcmlseSB1c2UgYnJhY2VzIHdoZXJlIGEgc2luZ2xlIHN0YXRlbWVudCB3aWxsIGRvLgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJaWYgKGNvbmRpdGlvbikKIAkJYWN0aW9uKCk7CiAKIGFuZAogCisuLiBjb2RlLWJsb2NrOjogbm9uZQorCiAJaWYgKGNvbmRpdGlvbikKIAkJZG9fdGhpcygpOwogCWVsc2UKQEAgLTE2OCw2ICsxOTEsOCBAQAogVGhpcyBkb2VzIG5vdCBhcHBseSBpZiBvbmx5IG9uZSBicmFuY2ggb2YgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgaXMgYSBzaW5nbGUKIHN0YXRlbWVudDsgaW4gdGhlIGxhdHRlciBjYXNlIHVzZSBicmFjZXMgaW4gYm90aCBicmFuY2hlczoKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCWlmIChjb25kaXRpb24pIHsKIAkJZG9fdGhpcygpOwogCQlkb190aGF0KCk7CkBAIC0xNzUsNTcgKzIwMCw2NyBAQAogCQlvdGhlcndpc2UoKTsKIAl9CiAKLQkJMy4xOiAgU3BhY2VzCiszLjEpIFNwYWNlcworKioqKioqKioqKioKIAogTGludXgga2VybmVsIHN0eWxlIGZvciB1c2Ugb2Ygc3BhY2VzIGRlcGVuZHMgKG1vc3RseSkgb24KIGZ1bmN0aW9uLXZlcnN1cy1rZXl3b3JkIHVzYWdlLiAgVXNlIGEgc3BhY2UgYWZ0ZXIgKG1vc3QpIGtleXdvcmRzLiAgVGhlCiBub3RhYmxlIGV4Y2VwdGlvbnMgYXJlIHNpemVvZiwgdHlwZW9mLCBhbGlnbm9mLCBhbmQgX19hdHRyaWJ1dGVfXywgd2hpY2ggbG9vawogc29tZXdoYXQgbGlrZSBmdW5jdGlvbnMgKGFuZCBhcmUgdXN1YWxseSB1c2VkIHdpdGggcGFyZW50aGVzZXMgaW4gTGludXgsCi1hbHRob3VnaCB0aGV5IGFyZSBub3QgcmVxdWlyZWQgaW4gdGhlIGxhbmd1YWdlLCBhcyBpbjogInNpemVvZiBpbmZvIiBhZnRlcgotInN0cnVjdCBmaWxlaW5mbyBpbmZvOyIgaXMgZGVjbGFyZWQpLgorYWx0aG91Z2ggdGhleSBhcmUgbm90IHJlcXVpcmVkIGluIHRoZSBsYW5ndWFnZSwgYXMgaW46IGBgc2l6ZW9mIGluZm9gYCBhZnRlcgorYGBzdHJ1Y3QgZmlsZWluZm8gaW5mbztgYCBpcyBkZWNsYXJlZCkuCiAKLVNvIHVzZSBhIHNwYWNlIGFmdGVyIHRoZXNlIGtleXdvcmRzOgorU28gdXNlIGEgc3BhY2UgYWZ0ZXIgdGhlc2Uga2V5d29yZHM6OgogCiAJaWYsIHN3aXRjaCwgY2FzZSwgZm9yLCBkbywgd2hpbGUKIAogYnV0IG5vdCB3aXRoIHNpemVvZiwgdHlwZW9mLCBhbGlnbm9mLCBvciBfX2F0dHJpYnV0ZV9fLiAgRS5nLiwKIAorLi4gY29kZS1ibG9jazo6IGMKKworCiAJcyA9IHNpemVvZihzdHJ1Y3QgZmlsZSk7CiAKIERvIG5vdCBhZGQgc3BhY2VzIGFyb3VuZCAoaW5zaWRlKSBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb25zLiAgVGhpcyBleGFtcGxlIGlzCi0qYmFkKjoKKyoqYmFkKio6CisKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAogCXMgPSBzaXplb2YoIHN0cnVjdCBmaWxlICk7CiAKIFdoZW4gZGVjbGFyaW5nIHBvaW50ZXIgZGF0YSBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHBvaW50ZXIgdHlwZSwgdGhlCi1wcmVmZXJyZWQgdXNlIG9mICcqJyBpcyBhZGphY2VudCB0byB0aGUgZGF0YSBuYW1lIG9yIGZ1bmN0aW9uIG5hbWUgYW5kIG5vdAorcHJlZmVycmVkIHVzZSBvZiBgYCpgYCBpcyBhZGphY2VudCB0byB0aGUgZGF0YSBuYW1lIG9yIGZ1bmN0aW9uIG5hbWUgYW5kIG5vdAogYWRqYWNlbnQgdG8gdGhlIHR5cGUgbmFtZS4gIEV4YW1wbGVzOgogCisuLiBjb2RlLWJsb2NrOjogYworCisKIAljaGFyICpsaW51eF9iYW5uZXI7CiAJdW5zaWduZWQgbG9uZyBsb25nIG1lbXBhcnNlKGNoYXIgKnB0ciwgY2hhciAqKnJldHB0cik7CiAJY2hhciAqbWF0Y2hfc3RyZHVwKHN1YnN0cmluZ190ICpzKTsKIAogVXNlIG9uZSBzcGFjZSBhcm91bmQgKG9uIGVhY2ggc2lkZSBvZikgbW9zdCBiaW5hcnkgYW5kIHRlcm5hcnkgb3BlcmF0b3JzLAotc3VjaCBhcyBhbnkgb2YgdGhlc2U6CitzdWNoIGFzIGFueSBvZiB0aGVzZTo6CiAKIAk9ICArICAtICA8ICA+ICAqICAvICAlICB8ICAmICBeICA8PSAgPj0gID09ICAhPSAgPyAgOgogCi1idXQgbm8gc3BhY2UgYWZ0ZXIgdW5hcnkgb3BlcmF0b3JzOgorYnV0IG5vIHNwYWNlIGFmdGVyIHVuYXJ5IG9wZXJhdG9yczo6CiAKIAkmICAqICArICAtICB+ICAhICBzaXplb2YgIHR5cGVvZiAgYWxpZ25vZiAgX19hdHRyaWJ1dGVfXyAgZGVmaW5lZAogCi1ubyBzcGFjZSBiZWZvcmUgdGhlIHBvc3RmaXggaW5jcmVtZW50ICYgZGVjcmVtZW50IHVuYXJ5IG9wZXJhdG9yczoKK25vIHNwYWNlIGJlZm9yZSB0aGUgcG9zdGZpeCBpbmNyZW1lbnQgJiBkZWNyZW1lbnQgdW5hcnkgb3BlcmF0b3JzOjoKIAogCSsrICAtLQogCi1ubyBzcGFjZSBhZnRlciB0aGUgcHJlZml4IGluY3JlbWVudCAmIGRlY3JlbWVudCB1bmFyeSBvcGVyYXRvcnM6CitubyBzcGFjZSBhZnRlciB0aGUgcHJlZml4IGluY3JlbWVudCAmIGRlY3JlbWVudCB1bmFyeSBvcGVyYXRvcnM6OgogCiAJKysgIC0tCiAKLWFuZCBubyBzcGFjZSBhcm91bmQgdGhlICcuJyBhbmQgIi0+IiBzdHJ1Y3R1cmUgbWVtYmVyIG9wZXJhdG9ycy4KK2FuZCBubyBzcGFjZSBhcm91bmQgdGhlIGBgLmBgIGFuZCBgYC0+YGAgc3RydWN0dXJlIG1lbWJlciBvcGVyYXRvcnMuCiAKIERvIG5vdCBsZWF2ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGF0IHRoZSBlbmRzIG9mIGxpbmVzLiAgU29tZSBlZGl0b3JzIHdpdGgKLSJzbWFydCIgaW5kZW50YXRpb24gd2lsbCBpbnNlcnQgd2hpdGVzcGFjZSBhdCB0aGUgYmVnaW5uaW5nIG9mIG5ldyBsaW5lcyBhcworYGBzbWFydGBgIGluZGVudGF0aW9uIHdpbGwgaW5zZXJ0IHdoaXRlc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiBuZXcgbGluZXMgYXMKIGFwcHJvcHJpYXRlLCBzbyB5b3UgY2FuIHN0YXJ0IHR5cGluZyB0aGUgbmV4dCBsaW5lIG9mIGNvZGUgcmlnaHQgYXdheS4KIEhvd2V2ZXIsIHNvbWUgc3VjaCBlZGl0b3JzIGRvIG5vdCByZW1vdmUgdGhlIHdoaXRlc3BhY2UgaWYgeW91IGVuZCB1cCBub3QKIHB1dHRpbmcgYSBsaW5lIG9mIGNvZGUgdGhlcmUsIHN1Y2ggYXMgaWYgeW91IGxlYXZlIGEgYmxhbmsgbGluZS4gIEFzIGEgcmVzdWx0LApAQCAtMjM3LDIyICsyNzIsMjMgQEAKIGNvbnRleHQgbGluZXMuCiAKIAotCQlDaGFwdGVyIDQ6IE5hbWluZworNCkgTmFtaW5nCistLS0tLS0tLS0KIAogQyBpcyBhIFNwYXJ0YW4gbGFuZ3VhZ2UsIGFuZCBzbyBzaG91bGQgeW91ciBuYW1pbmcgYmUuICBVbmxpa2UgTW9kdWxhLTIKIGFuZCBQYXNjYWwgcHJvZ3JhbW1lcnMsIEMgcHJvZ3JhbW1lcnMgZG8gbm90IHVzZSBjdXRlIG5hbWVzIGxpa2UKIFRoaXNWYXJpYWJsZUlzQVRlbXBvcmFyeUNvdW50ZXIuICBBIEMgcHJvZ3JhbW1lciB3b3VsZCBjYWxsIHRoYXQKLXZhcmlhYmxlICJ0bXAiLCB3aGljaCBpcyBtdWNoIGVhc2llciB0byB3cml0ZSwgYW5kIG5vdCB0aGUgbGVhc3QgbW9yZQordmFyaWFibGUgYGB0bXBgYCwgd2hpY2ggaXMgbXVjaCBlYXNpZXIgdG8gd3JpdGUsIGFuZCBub3QgdGhlIGxlYXN0IG1vcmUKIGRpZmZpY3VsdCB0byB1bmRlcnN0YW5kLgogCiBIT1dFVkVSLCB3aGlsZSBtaXhlZC1jYXNlIG5hbWVzIGFyZSBmcm93bmVkIHVwb24sIGRlc2NyaXB0aXZlIG5hbWVzIGZvcgotZ2xvYmFsIHZhcmlhYmxlcyBhcmUgYSBtdXN0LiAgVG8gY2FsbCBhIGdsb2JhbCBmdW5jdGlvbiAiZm9vIiBpcyBhCitnbG9iYWwgdmFyaWFibGVzIGFyZSBhIG11c3QuICBUbyBjYWxsIGEgZ2xvYmFsIGZ1bmN0aW9uIGBgZm9vYGAgaXMgYQogc2hvb3Rpbmcgb2ZmZW5zZS4KIAotR0xPQkFMIHZhcmlhYmxlcyAodG8gYmUgdXNlZCBvbmx5IGlmIHlvdSBfcmVhbGx5XyBuZWVkIHRoZW0pIG5lZWQgdG8KK0dMT0JBTCB2YXJpYWJsZXMgKHRvIGJlIHVzZWQgb25seSBpZiB5b3UgKipyZWFsbHkqKiBuZWVkIHRoZW0pIG5lZWQgdG8KIGhhdmUgZGVzY3JpcHRpdmUgbmFtZXMsIGFzIGRvIGdsb2JhbCBmdW5jdGlvbnMuICBJZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uCiB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB1c2VycywgeW91IHNob3VsZCBjYWxsIHRoYXQKLSJjb3VudF9hY3RpdmVfdXNlcnMoKSIgb3Igc2ltaWxhciwgeW91IHNob3VsZCBfbm90XyBjYWxsIGl0ICJjbnR1c3IoKSIuCitgYGNvdW50X2FjdGl2ZV91c2VycygpYGAgb3Igc2ltaWxhciwgeW91IHNob3VsZCAqKm5vdCoqIGNhbGwgaXQgYGBjbnR1c3IoKWBgLgogCiBFbmNvZGluZyB0aGUgdHlwZSBvZiBhIGZ1bmN0aW9uIGludG8gdGhlIG5hbWUgKHNvLWNhbGxlZCBIdW5nYXJpYW4KIG5vdGF0aW9uKSBpcyBicmFpbiBkYW1hZ2VkIC0gdGhlIGNvbXBpbGVyIGtub3dzIHRoZSB0eXBlcyBhbnl3YXkgYW5kIGNhbgpAQCAtMjYwLDkgKzI5Niw5IEBACiBtYWtlcyBidWdneSBwcm9ncmFtcy4KIAogTE9DQUwgdmFyaWFibGUgbmFtZXMgc2hvdWxkIGJlIHNob3J0LCBhbmQgdG8gdGhlIHBvaW50LiAgSWYgeW91IGhhdmUKLXNvbWUgcmFuZG9tIGludGVnZXIgbG9vcCBjb3VudGVyLCBpdCBzaG91bGQgcHJvYmFibHkgYmUgY2FsbGVkICJpIi4KLUNhbGxpbmcgaXQgImxvb3BfY291bnRlciIgaXMgbm9uLXByb2R1Y3RpdmUsIGlmIHRoZXJlIGlzIG5vIGNoYW5jZSBvZiBpdAotYmVpbmcgbWlzLXVuZGVyc3Rvb2QuICBTaW1pbGFybHksICJ0bXAiIGNhbiBiZSBqdXN0IGFib3V0IGFueSB0eXBlIG9mCitzb21lIHJhbmRvbSBpbnRlZ2VyIGxvb3AgY291bnRlciwgaXQgc2hvdWxkIHByb2JhYmx5IGJlIGNhbGxlZCBgYGlgYC4KK0NhbGxpbmcgaXQgYGBsb29wX2NvdW50ZXJgYCBpcyBub24tcHJvZHVjdGl2ZSwgaWYgdGhlcmUgaXMgbm8gY2hhbmNlIG9mIGl0CitiZWluZyBtaXMtdW5kZXJzdG9vZC4gIFNpbWlsYXJseSwgYGB0bXBgYCBjYW4gYmUganVzdCBhYm91dCBhbnkgdHlwZSBvZgogdmFyaWFibGUgdGhhdCBpcyB1c2VkIHRvIGhvbGQgYSB0ZW1wb3JhcnkgdmFsdWUuCiAKIElmIHlvdSBhcmUgYWZyYWlkIHRvIG1peCB1cCB5b3VyIGxvY2FsIHZhcmlhYmxlIG5hbWVzLCB5b3UgaGF2ZSBhbm90aGVyCkBAIC0yNzAsNTkgKzMwNiw2OSBAQAogU2VlIGNoYXB0ZXIgNiAoRnVuY3Rpb25zKS4KIAogCi0JCUNoYXB0ZXIgNTogVHlwZWRlZnMKKzUpIFR5cGVkZWZzCistLS0tLS0tLS0tLQogCi1QbGVhc2UgZG9uJ3QgdXNlIHRoaW5ncyBsaWtlICJ2cHNfdCIuCi1JdCdzIGEgX21pc3Rha2VfIHRvIHVzZSB0eXBlZGVmIGZvciBzdHJ1Y3R1cmVzIGFuZCBwb2ludGVycy4gV2hlbiB5b3Ugc2VlIGEKK1BsZWFzZSBkb24ndCB1c2UgdGhpbmdzIGxpa2UgYGB2cHNfdGBgLgorSXQncyBhICoqbWlzdGFrZSoqIHRvIHVzZSB0eXBlZGVmIGZvciBzdHJ1Y3R1cmVzIGFuZCBwb2ludGVycy4gV2hlbiB5b3Ugc2VlIGEKKworLi4gY29kZS1ibG9jazo6IGMKKwogCiAJdnBzX3QgYTsKIAogaW4gdGhlIHNvdXJjZSwgd2hhdCBkb2VzIGl0IG1lYW4/CiBJbiBjb250cmFzdCwgaWYgaXQgc2F5cwogCisuLiBjb2RlLWJsb2NrOjogYworCiAJc3RydWN0IHZpcnR1YWxfY29udGFpbmVyICphOwogCi15b3UgY2FuIGFjdHVhbGx5IHRlbGwgd2hhdCAiYSIgaXMuCit5b3UgY2FuIGFjdHVhbGx5IHRlbGwgd2hhdCBgYGFgYCBpcy4KIAotTG90cyBvZiBwZW9wbGUgdGhpbmsgdGhhdCB0eXBlZGVmcyAiaGVscCByZWFkYWJpbGl0eSIuIE5vdCBzby4gVGhleSBhcmUKK0xvdHMgb2YgcGVvcGxlIHRoaW5rIHRoYXQgdHlwZWRlZnMgYGBoZWxwIHJlYWRhYmlsaXR5YGAuIE5vdCBzby4gVGhleSBhcmUKIHVzZWZ1bCBvbmx5IGZvcjoKIAotIChhKSB0b3RhbGx5IG9wYXF1ZSBvYmplY3RzICh3aGVyZSB0aGUgdHlwZWRlZiBpcyBhY3RpdmVseSB1c2VkIHRvIF9oaWRlXworIChhKSB0b3RhbGx5IG9wYXF1ZSBvYmplY3RzICh3aGVyZSB0aGUgdHlwZWRlZiBpcyBhY3RpdmVseSB1c2VkIHRvICoqaGlkZSoqCiAgICAgIHdoYXQgdGhlIG9iamVjdCBpcykuCiAKLSAgICAgRXhhbXBsZTogInB0ZV90IiBldGMuIG9wYXF1ZSBvYmplY3RzIHRoYXQgeW91IGNhbiBvbmx5IGFjY2VzcyB1c2luZworICAgICBFeGFtcGxlOiBgYHB0ZV90YGAgZXRjLiBvcGFxdWUgb2JqZWN0cyB0aGF0IHlvdSBjYW4gb25seSBhY2Nlc3MgdXNpbmcKICAgICAgdGhlIHByb3BlciBhY2Nlc3NvciBmdW5jdGlvbnMuCiAKLSAgICAgTk9URSEgT3BhcXVlbmVzcyBhbmQgImFjY2Vzc29yIGZ1bmN0aW9ucyIgYXJlIG5vdCBnb29kIGluIHRoZW1zZWx2ZXMuCi0gICAgIFRoZSByZWFzb24gd2UgaGF2ZSB0aGVtIGZvciB0aGluZ3MgbGlrZSBwdGVfdCBldGMuIGlzIHRoYXQgdGhlcmUKLSAgICAgcmVhbGx5IGlzIGFic29sdXRlbHkgX3plcm9fIHBvcnRhYmx5IGFjY2Vzc2libGUgaW5mb3JtYXRpb24gdGhlcmUuCisgICAgIC4uIG5vdGU6OgogCi0gKGIpIENsZWFyIGludGVnZXIgdHlwZXMsIHdoZXJlIHRoZSBhYnN0cmFjdGlvbiBfaGVscHNfIGF2b2lkIGNvbmZ1c2lvbgotICAgICB3aGV0aGVyIGl0IGlzICJpbnQiIG9yICJsb25nIi4KKyAgICAgICBPcGFxdWVuZXNzIGFuZCBgYGFjY2Vzc29yIGZ1bmN0aW9uc2BgIGFyZSBub3QgZ29vZCBpbiB0aGVtc2VsdmVzLgorICAgICAgIFRoZSByZWFzb24gd2UgaGF2ZSB0aGVtIGZvciB0aGluZ3MgbGlrZSBwdGVfdCBldGMuIGlzIHRoYXQgdGhlcmUKKyAgICAgICByZWFsbHkgaXMgYWJzb2x1dGVseSAqKnplcm8qKiBwb3J0YWJseSBhY2Nlc3NpYmxlIGluZm9ybWF0aW9uIHRoZXJlLgorCisgKGIpIENsZWFyIGludGVnZXIgdHlwZXMsIHdoZXJlIHRoZSBhYnN0cmFjdGlvbiAqKmhlbHBzKiogYXZvaWQgY29uZnVzaW9uCisgICAgIHdoZXRoZXIgaXQgaXMgYGBpbnRgYCBvciBgYGxvbmdgYC4KIAogICAgICB1OC91MTYvdTMyIGFyZSBwZXJmZWN0bHkgZmluZSB0eXBlZGVmcywgYWx0aG91Z2ggdGhleSBmaXQgaW50bwogICAgICBjYXRlZ29yeSAoZCkgYmV0dGVyIHRoYW4gaGVyZS4KIAotICAgICBOT1RFISBBZ2FpbiAtIHRoZXJlIG5lZWRzIHRvIGJlIGEgX3JlYXNvbl8gZm9yIHRoaXMuIElmIHNvbWV0aGluZyBpcwotICAgICAidW5zaWduZWQgbG9uZyIsIHRoZW4gdGhlcmUncyBubyByZWFzb24gdG8gZG8KKyAgICAgLi4gbm90ZTo6CisKKyAgICAgICBBZ2FpbiAtIHRoZXJlIG5lZWRzIHRvIGJlIGEgKipyZWFzb24qKiBmb3IgdGhpcy4gSWYgc29tZXRoaW5nIGlzCisgICAgICAgYGB1bnNpZ25lZCBsb25nYGAsIHRoZW4gdGhlcmUncyBubyByZWFzb24gdG8gZG8KIAogCXR5cGVkZWYgdW5zaWduZWQgbG9uZyBteWZsYWdzX3Q7CiAKICAgICAgYnV0IGlmIHRoZXJlIGlzIGEgY2xlYXIgcmVhc29uIGZvciB3aHkgaXQgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzCi0gICAgIG1pZ2h0IGJlIGFuICJ1bnNpZ25lZCBpbnQiIGFuZCB1bmRlciBvdGhlciBjb25maWd1cmF0aW9ucyBtaWdodCBiZQotICAgICAidW5zaWduZWQgbG9uZyIsIHRoZW4gYnkgYWxsIG1lYW5zIGdvIGFoZWFkIGFuZCB1c2UgYSB0eXBlZGVmLgorICAgICBtaWdodCBiZSBhbiBgYHVuc2lnbmVkIGludGBgIGFuZCB1bmRlciBvdGhlciBjb25maWd1cmF0aW9ucyBtaWdodCBiZQorICAgICBgYHVuc2lnbmVkIGxvbmdgYCwgdGhlbiBieSBhbGwgbWVhbnMgZ28gYWhlYWQgYW5kIHVzZSBhIHR5cGVkZWYuCiAKLSAoYykgd2hlbiB5b3UgdXNlIHNwYXJzZSB0byBsaXRlcmFsbHkgY3JlYXRlIGEgX25ld18gdHlwZSBmb3IKKyAoYykgd2hlbiB5b3UgdXNlIHNwYXJzZSB0byBsaXRlcmFsbHkgY3JlYXRlIGEgKipuZXcqKiB0eXBlIGZvcgogICAgICB0eXBlLWNoZWNraW5nLgogCiAgKGQpIE5ldyB0eXBlcyB3aGljaCBhcmUgaWRlbnRpY2FsIHRvIHN0YW5kYXJkIEM5OSB0eXBlcywgaW4gY2VydGFpbgogICAgICBleGNlcHRpb25hbCBjaXJjdW1zdGFuY2VzLgogCiAgICAgIEFsdGhvdWdoIGl0IHdvdWxkIG9ubHkgdGFrZSBhIHNob3J0IGFtb3VudCBvZiB0aW1lIGZvciB0aGUgZXllcyBhbmQKLSAgICAgYnJhaW4gdG8gYmVjb21lIGFjY3VzdG9tZWQgdG8gdGhlIHN0YW5kYXJkIHR5cGVzIGxpa2UgJ3VpbnQzMl90JywKKyAgICAgYnJhaW4gdG8gYmVjb21lIGFjY3VzdG9tZWQgdG8gdGhlIHN0YW5kYXJkIHR5cGVzIGxpa2UgYGB1aW50MzJfdGBgLAogICAgICBzb21lIHBlb3BsZSBvYmplY3QgdG8gdGhlaXIgdXNlIGFueXdheS4KIAotICAgICBUaGVyZWZvcmUsIHRoZSBMaW51eC1zcGVjaWZpYyAndTgvdTE2L3UzMi91NjQnIHR5cGVzIGFuZCB0aGVpcgorICAgICBUaGVyZWZvcmUsIHRoZSBMaW51eC1zcGVjaWZpYyBgYHU4L3UxNi91MzIvdTY0YGAgdHlwZXMgYW5kIHRoZWlyCiAgICAgIHNpZ25lZCBlcXVpdmFsZW50cyB3aGljaCBhcmUgaWRlbnRpY2FsIHRvIHN0YW5kYXJkIHR5cGVzIGFyZQogICAgICBwZXJtaXR0ZWQgLS0gYWx0aG91Z2ggdGhleSBhcmUgbm90IG1hbmRhdG9yeSBpbiBuZXcgY29kZSBvZiB5b3VyCiAgICAgIG93bi4KQEAgLTMzMyw3ICszNzksNyBAQAogIChlKSBUeXBlcyBzYWZlIGZvciB1c2UgaW4gdXNlcnNwYWNlLgogCiAgICAgIEluIGNlcnRhaW4gc3RydWN0dXJlcyB3aGljaCBhcmUgdmlzaWJsZSB0byB1c2Vyc3BhY2UsIHdlIGNhbm5vdAotICAgICByZXF1aXJlIEM5OSB0eXBlcyBhbmQgY2Fubm90IHVzZSB0aGUgJ3UzMicgZm9ybSBhYm92ZS4gVGh1cywgd2UKKyAgICAgcmVxdWlyZSBDOTkgdHlwZXMgYW5kIGNhbm5vdCB1c2UgdGhlIGBgdTMyYGAgZm9ybSBhYm92ZS4gVGh1cywgd2UKICAgICAgdXNlIF9fdTMyIGFuZCBzaW1pbGFyIHR5cGVzIGluIGFsbCBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBzaGFyZWQKICAgICAgd2l0aCB1c2Vyc3BhY2UuCiAKQEAgLTM0MSwxMCArMzg3LDExIEBACiBFVkVSIHVzZSBhIHR5cGVkZWYgdW5sZXNzIHlvdSBjYW4gY2xlYXJseSBtYXRjaCBvbmUgb2YgdGhvc2UgcnVsZXMuCiAKIEluIGdlbmVyYWwsIGEgcG9pbnRlciwgb3IgYSBzdHJ1Y3QgdGhhdCBoYXMgZWxlbWVudHMgdGhhdCBjYW4gcmVhc29uYWJseQotYmUgZGlyZWN0bHkgYWNjZXNzZWQgc2hvdWxkIF9uZXZlcl8gYmUgYSB0eXBlZGVmLgorYmUgZGlyZWN0bHkgYWNjZXNzZWQgc2hvdWxkICoqbmV2ZXIqKiBiZSBhIHR5cGVkZWYuCiAKIAotCQlDaGFwdGVyIDY6IEZ1bmN0aW9ucworNikgRnVuY3Rpb25zCistLS0tLS0tLS0tLS0KIAogRnVuY3Rpb25zIHNob3VsZCBiZSBzaG9ydCBhbmQgc3dlZXQsIGFuZCBkbyBqdXN0IG9uZSB0aGluZy4gIFRoZXkgc2hvdWxkCiBmaXQgb24gb25lIG9yIHR3byBzY3JlZW5mdWxzIG9mIHRleHQgKHRoZSBJU08vQU5TSSBzY3JlZW4gc2l6ZSBpcyA4MHgyNCwKQEAgLTM3Miw4ICs0MTksMTAgQEAKIHRvIHVuZGVyc3RhbmQgd2hhdCB5b3UgZGlkIDIgd2Vla3MgZnJvbSBub3cuCiAKIEluIHNvdXJjZSBmaWxlcywgc2VwYXJhdGUgZnVuY3Rpb25zIHdpdGggb25lIGJsYW5rIGxpbmUuICBJZiB0aGUgZnVuY3Rpb24gaXMKLWV4cG9ydGVkLCB0aGUgRVhQT1JUKiBtYWNybyBmb3IgaXQgc2hvdWxkIGZvbGxvdyBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2xvc2luZwotZnVuY3Rpb24gYnJhY2UgbGluZS4gIEUuZy46CitleHBvcnRlZCwgdGhlICoqRVhQT1JUKiogbWFjcm8gZm9yIGl0IHNob3VsZCBmb2xsb3cgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCitjbG9zaW5nIGZ1bmN0aW9uIGJyYWNlIGxpbmUuICBFLmcuOgorCisuLiBjb2RlLWJsb2NrOjogYwogCiAJaW50IHN5c3RlbV9pc191cCh2b2lkKQogCXsKQEAgLTM4Niw3ICs0MzUsOCBAQAogYmVjYXVzZSBpdCBpcyBhIHNpbXBsZSB3YXkgdG8gYWRkIHZhbHVhYmxlIGluZm9ybWF0aW9uIGZvciB0aGUgcmVhZGVyLgogCiAKLQkJQ2hhcHRlciA3OiBDZW50cmFsaXplZCBleGl0aW5nIG9mIGZ1bmN0aW9ucworNykgQ2VudHJhbGl6ZWQgZXhpdGluZyBvZiBmdW5jdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEFsYmVpdCBkZXByZWNhdGVkIGJ5IHNvbWUgcGVvcGxlLCB0aGUgZXF1aXZhbGVudCBvZiB0aGUgZ290byBzdGF0ZW1lbnQgaXMKIHVzZWQgZnJlcXVlbnRseSBieSBjb21waWxlcnMgaW4gZm9ybSBvZiB0aGUgdW5jb25kaXRpb25hbCBqdW1wIGluc3RydWN0aW9uLgpAQCAtMzk2LDE4ICs0NDYsMjEgQEAKIGNsZWFudXAgbmVlZGVkIHRoZW4ganVzdCByZXR1cm4gZGlyZWN0bHkuCiAKIENob29zZSBsYWJlbCBuYW1lcyB3aGljaCBzYXkgd2hhdCB0aGUgZ290byBkb2VzIG9yIHdoeSB0aGUgZ290byBleGlzdHMuICBBbgotZXhhbXBsZSBvZiBhIGdvb2QgbmFtZSBjb3VsZCBiZSAib3V0X2J1ZmZlcjoiIGlmIHRoZSBnb3RvIGZyZWVzICJidWZmZXIiLiAgQXZvaWQKLXVzaW5nIEdXLUJBU0lDIG5hbWVzIGxpa2UgImVycjE6IiBhbmQgImVycjI6Ii4gIEFsc28gZG9uJ3QgbmFtZSB0aGVtIGFmdGVyIHRoZQotZ290byBsb2NhdGlvbiBsaWtlICJlcnJfa21hbGxvY19mYWlsZWQ6IgorZXhhbXBsZSBvZiBhIGdvb2QgbmFtZSBjb3VsZCBiZSBgYG91dF9mcmVlX2J1ZmZlcjpgYCBpZiB0aGUgZ290byBmcmVlcyBgYGJ1ZmZlcmBgLgorQXZvaWQgdXNpbmcgR1ctQkFTSUMgbmFtZXMgbGlrZSBgYGVycjE6YGAgYW5kIGBgZXJyMjpgYCwgYXMgeW91IHdvdWxkIGhhdmUgdG8KK3JlbnVtYmVyIHRoZW0gaWYgeW91IGV2ZXIgYWRkIG9yIHJlbW92ZSBleGl0IHBhdGhzLCBhbmQgdGhleSBtYWtlIGNvcnJlY3RuZXNzCitkaWZmaWN1bHQgdG8gdmVyaWZ5IGFueXdheS4KIAogVGhlIHJhdGlvbmFsZSBmb3IgdXNpbmcgZ290b3MgaXM6CiAKIC0gdW5jb25kaXRpb25hbCBzdGF0ZW1lbnRzIGFyZSBlYXNpZXIgdG8gdW5kZXJzdGFuZCBhbmQgZm9sbG93CiAtIG5lc3RpbmcgaXMgcmVkdWNlZAogLSBlcnJvcnMgYnkgbm90IHVwZGF0aW5nIGluZGl2aWR1YWwgZXhpdCBwb2ludHMgd2hlbiBtYWtpbmcKLSAgICBtb2RpZmljYXRpb25zIGFyZSBwcmV2ZW50ZWQKKyAgbW9kaWZpY2F0aW9ucyBhcmUgcHJldmVudGVkCiAtIHNhdmVzIHRoZSBjb21waWxlciB3b3JrIHRvIG9wdGltaXplIHJlZHVuZGFudCBjb2RlIGF3YXkgOykKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCWludCBmdW4oaW50IGEpCiAJewogCQlpbnQgcmVzdWx0ID0gMDsKQEAgLTQyNSwyNyArNDc4LDQxIEBACiAJCQlnb3RvIG91dF9idWZmZXI7CiAJCX0KIAkJLi4uCi0Jb3V0X2J1ZmZlcjoKKwlvdXRfZnJlZV9idWZmZXI6CiAJCWtmcmVlKGJ1ZmZlcik7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi1BIGNvbW1vbiB0eXBlIG9mIGJ1ZyB0byBiZSBhd2FyZSBvZiBpcyAib25lIGVyciBidWdzIiB3aGljaCBsb29rIGxpa2UgdGhpczoKK0EgY29tbW9uIHR5cGUgb2YgYnVnIHRvIGJlIGF3YXJlIG9mIGlzIGBgb25lIGVyciBidWdzYGAgd2hpY2ggbG9vayBsaWtlIHRoaXM6CisKKy4uIGNvZGUtYmxvY2s6OiBjCiAKIAllcnI6CiAJCWtmcmVlKGZvby0+YmFyKTsKIAkJa2ZyZWUoZm9vKTsKIAkJcmV0dXJuIHJldDsKIAotVGhlIGJ1ZyBpbiB0aGlzIGNvZGUgaXMgdGhhdCBvbiBzb21lIGV4aXQgcGF0aHMgImZvbyIgaXMgTlVMTC4gIE5vcm1hbGx5IHRoZQotZml4IGZvciB0aGlzIGlzIHRvIHNwbGl0IGl0IHVwIGludG8gdHdvIGVycm9yIGxhYmVscyAiZXJyX2JhcjoiIGFuZCAiZXJyX2ZvbzoiLgorVGhlIGJ1ZyBpbiB0aGlzIGNvZGUgaXMgdGhhdCBvbiBzb21lIGV4aXQgcGF0aHMgYGBmb29gYCBpcyBOVUxMLiAgTm9ybWFsbHkgdGhlCitmaXggZm9yIHRoaXMgaXMgdG8gc3BsaXQgaXQgdXAgaW50byB0d28gZXJyb3IgbGFiZWxzIGBgZXJyX2ZyZWVfYmFyOmBgIGFuZAorYGBlcnJfZnJlZV9mb286YGA6CisKKy4uIGNvZGUtYmxvY2s6OiBjCisKKwkgZXJyX2ZyZWVfYmFyOgorCQlrZnJlZShmb28tPmJhcik7CisJIGVycl9mcmVlX2ZvbzoKKwkJa2ZyZWUoZm9vKTsKKwkJcmV0dXJuIHJldDsKKworSWRlYWxseSB5b3Ugc2hvdWxkIHNpbXVsYXRlIGVycm9ycyB0byB0ZXN0IGFsbCBleGl0IHBhdGhzLgogCiAKLQkJQ2hhcHRlciA4OiBDb21tZW50aW5nCis4KSBDb21tZW50aW5nCistLS0tLS0tLS0tLS0tCiAKIENvbW1lbnRzIGFyZSBnb29kLCBidXQgdGhlcmUgaXMgYWxzbyBhIGRhbmdlciBvZiBvdmVyLWNvbW1lbnRpbmcuICBORVZFUgogdHJ5IHRvIGV4cGxhaW4gSE9XIHlvdXIgY29kZSB3b3JrcyBpbiBhIGNvbW1lbnQ6IGl0J3MgbXVjaCBiZXR0ZXIgdG8KLXdyaXRlIHRoZSBjb2RlIHNvIHRoYXQgdGhlIF93b3JraW5nXyBpcyBvYnZpb3VzLCBhbmQgaXQncyBhIHdhc3RlIG9mCit3cml0ZSB0aGUgY29kZSBzbyB0aGF0IHRoZSAqKndvcmtpbmcqKiBpcyBvYnZpb3VzLCBhbmQgaXQncyBhIHdhc3RlIG9mCiB0aW1lIHRvIGV4cGxhaW4gYmFkbHkgd3JpdHRlbiBjb2RlLgogCiBHZW5lcmFsbHksIHlvdSB3YW50IHlvdXIgY29tbWVudHMgdG8gdGVsbCBXSEFUIHlvdXIgY29kZSBkb2VzLCBub3QgSE9XLgpAQCAtNDYxLDExICs1MjgsMTAgQEAKIFNlZSB0aGUgZmlsZXMgRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jdW1lbnRhdGlvbi5yc3QgYW5kIHNjcmlwdHMva2VybmVsLWRvYwogZm9yIGRldGFpbHMuCiAKLUxpbnV4IHN0eWxlIGZvciBjb21tZW50cyBpcyB0aGUgQzg5ICIvKiAuLi4gKi8iIHN0eWxlLgotRG9uJ3QgdXNlIEM5OS1zdHlsZSAiLy8gLi4uIiBjb21tZW50cy4KLQogVGhlIHByZWZlcnJlZCBzdHlsZSBmb3IgbG9uZyAobXVsdGktbGluZSkgY29tbWVudHMgaXM6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkvKgogCSAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBzdHlsZSBmb3IgbXVsdGktbGluZQogCSAqIGNvbW1lbnRzIGluIHRoZSBMaW51eCBrZXJuZWwgc291cmNlIGNvZGUuCkBAIC00NzgsNiArNTQ0LDggQEAKIEZvciBmaWxlcyBpbiBuZXQvIGFuZCBkcml2ZXJzL25ldC8gdGhlIHByZWZlcnJlZCBzdHlsZSBmb3IgbG9uZyAobXVsdGktbGluZSkKIGNvbW1lbnRzIGlzIGEgbGl0dGxlIGRpZmZlcmVudC4KIAorLi4gY29kZS1ibG9jazo6IGMKKwogCS8qIFRoZSBwcmVmZXJyZWQgY29tbWVudCBzdHlsZSBmb3IgZmlsZXMgaW4gbmV0LyBhbmQgZHJpdmVycy9uZXQKIAkgKiBsb29rcyBsaWtlIHRoaXMuCiAJICoKQEAgLTQ5MSwxMCArNTU5LDExIEBACiBpdGVtLCBleHBsYWluaW5nIGl0cyB1c2UuCiAKIAotCQlDaGFwdGVyIDk6IFlvdSd2ZSBtYWRlIGEgbWVzcyBvZiBpdAorOSkgWW91J3ZlIG1hZGUgYSBtZXNzIG9mIGl0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhhdCdzIE9LLCB3ZSBhbGwgZG8uICBZb3UndmUgcHJvYmFibHkgYmVlbiB0b2xkIGJ5IHlvdXIgbG9uZy10aW1lIFVuaXgKLXVzZXIgaGVscGVyIHRoYXQgIkdOVSBlbWFjcyIgYXV0b21hdGljYWxseSBmb3JtYXRzIHRoZSBDIHNvdXJjZXMgZm9yCit1c2VyIGhlbHBlciB0aGF0IGBgR05VIGVtYWNzYGAgYXV0b21hdGljYWxseSBmb3JtYXRzIHRoZSBDIHNvdXJjZXMgZm9yCiB5b3UsIGFuZCB5b3UndmUgbm90aWNlZCB0aGF0IHllcywgaXQgZG9lcyBkbyB0aGF0LCBidXQgdGhlIGRlZmF1bHRzIGl0CiB1c2VzIGFyZSBsZXNzIHRoYW4gZGVzaXJhYmxlIChpbiBmYWN0LCB0aGV5IGFyZSB3b3JzZSB0aGFuIHJhbmRvbQogdHlwaW5nIC0gYW4gaW5maW5pdGUgbnVtYmVyIG9mIG1vbmtleXMgdHlwaW5nIGludG8gR05VIGVtYWNzIHdvdWxkIG5ldmVyCkBAIC01MDMsNjMgKzU3Miw2NiBAQAogU28sIHlvdSBjYW4gZWl0aGVyIGdldCByaWQgb2YgR05VIGVtYWNzLCBvciBjaGFuZ2UgaXQgdG8gdXNlIHNhbmVyCiB2YWx1ZXMuICBUbyBkbyB0aGUgbGF0dGVyLCB5b3UgY2FuIHN0aWNrIHRoZSBmb2xsb3dpbmcgaW4geW91ciAuZW1hY3MgZmlsZToKIAotKGRlZnVuIGMtbGluZXVwLWFyZ2xpc3QtdGFicy1vbmx5IChpZ25vcmVkKQotICAiTGluZSB1cCBhcmd1bWVudCBsaXN0cyBieSB0YWJzLCBub3Qgc3BhY2VzIgotICAobGV0KiAoKGFuY2hvciAoYy1sYW5nZWxlbS1wb3MgYy1zeW50YWN0aWMtZWxlbWVudCkpCi0gICAgICAgICAoY29sdW1uIChjLWxhbmdlbGVtLTJuZC1wb3MgYy1zeW50YWN0aWMtZWxlbWVudCkpCi0gICAgICAgICAob2Zmc2V0ICgtICgxKyBjb2x1bW4pIGFuY2hvcikpCi0gICAgICAgICAoc3RlcHMgKGZsb29yIG9mZnNldCBjLWJhc2ljLW9mZnNldCkpKQotICAgICgqIChtYXggc3RlcHMgMSkKLSAgICAgICBjLWJhc2ljLW9mZnNldCkpKQorLi4gY29kZS1ibG9jazo6IG5vbmUKIAotKGFkZC1ob29rICdjLW1vZGUtY29tbW9uLWhvb2sKLSAgICAgICAgICAobGFtYmRhICgpCi0gICAgICAgICAgICA7OyBBZGQga2VybmVsIHN0eWxlCi0gICAgICAgICAgICAoYy1hZGQtc3R5bGUKLSAgICAgICAgICAgICAibGludXgtdGFicy1vbmx5IgotICAgICAgICAgICAgICcoImxpbnV4IiAoYy1vZmZzZXRzLWFsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAoYXJnbGlzdC1jb250LW5vbmVtcHR5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgYy1saW5ldXAtZ2NjLWFzbS1yZWcKLSAgICAgICAgICAgICAgICAgICAgICAgICBjLWxpbmV1cC1hcmdsaXN0LXRhYnMtb25seSkpKSkpKQorICAoZGVmdW4gYy1saW5ldXAtYXJnbGlzdC10YWJzLW9ubHkgKGlnbm9yZWQpCisgICAgIkxpbmUgdXAgYXJndW1lbnQgbGlzdHMgYnkgdGFicywgbm90IHNwYWNlcyIKKyAgICAobGV0KiAoKGFuY2hvciAoYy1sYW5nZWxlbS1wb3MgYy1zeW50YWN0aWMtZWxlbWVudCkpCisgICAgICAgICAgIChjb2x1bW4gKGMtbGFuZ2VsZW0tMm5kLXBvcyBjLXN5bnRhY3RpYy1lbGVtZW50KSkKKyAgICAgICAgICAgKG9mZnNldCAoLSAoMSsgY29sdW1uKSBhbmNob3IpKQorICAgICAgICAgICAoc3RlcHMgKGZsb29yIG9mZnNldCBjLWJhc2ljLW9mZnNldCkpKQorICAgICAgKCogKG1heCBzdGVwcyAxKQorICAgICAgICAgYy1iYXNpYy1vZmZzZXQpKSkKIAotKGFkZC1ob29rICdjLW1vZGUtaG9vawotICAgICAgICAgIChsYW1iZGEgKCkKLSAgICAgICAgICAgIChsZXQgKChmaWxlbmFtZSAoYnVmZmVyLWZpbGUtbmFtZSkpKQotICAgICAgICAgICAgICA7OyBFbmFibGUga2VybmVsIG1vZGUgZm9yIHRoZSBhcHByb3ByaWF0ZSBmaWxlcwotICAgICAgICAgICAgICAod2hlbiAoYW5kIGZpbGVuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1tYXRjaCAoZXhwYW5kLWZpbGUtbmFtZSAifi9zcmMvbGludXgtdHJlZXMiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpKQotICAgICAgICAgICAgICAgIChzZXRxIGluZGVudC10YWJzLW1vZGUgdCkKLSAgICAgICAgICAgICAgICAoc2V0cSBzaG93LXRyYWlsaW5nLXdoaXRlc3BhY2UgdCkKLSAgICAgICAgICAgICAgICAoYy1zZXQtc3R5bGUgImxpbnV4LXRhYnMtb25seSIpKSkpKQorICAoYWRkLWhvb2sgJ2MtbW9kZS1jb21tb24taG9vaworICAgICAgICAgICAgKGxhbWJkYSAoKQorICAgICAgICAgICAgICA7OyBBZGQga2VybmVsIHN0eWxlCisgICAgICAgICAgICAgIChjLWFkZC1zdHlsZQorICAgICAgICAgICAgICAgImxpbnV4LXRhYnMtb25seSIKKyAgICAgICAgICAgICAgICcoImxpbnV4IiAoYy1vZmZzZXRzLWFsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdsaXN0LWNvbnQtbm9uZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtbGluZXVwLWdjYy1hc20tcmVnCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjLWxpbmV1cC1hcmdsaXN0LXRhYnMtb25seSkpKSkpKQorCisgIChhZGQtaG9vayAnYy1tb2RlLWhvb2sKKyAgICAgICAgICAgIChsYW1iZGEgKCkKKyAgICAgICAgICAgICAgKGxldCAoKGZpbGVuYW1lIChidWZmZXItZmlsZS1uYW1lKSkpCisgICAgICAgICAgICAgICAgOzsgRW5hYmxlIGtlcm5lbCBtb2RlIGZvciB0aGUgYXBwcm9wcmlhdGUgZmlsZXMKKyAgICAgICAgICAgICAgICAod2hlbiAoYW5kIGZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLW1hdGNoIChleHBhbmQtZmlsZS1uYW1lICJ+L3NyYy9saW51eC10cmVlcyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKSkKKyAgICAgICAgICAgICAgICAgIChzZXRxIGluZGVudC10YWJzLW1vZGUgdCkKKyAgICAgICAgICAgICAgICAgIChzZXRxIHNob3ctdHJhaWxpbmctd2hpdGVzcGFjZSB0KQorICAgICAgICAgICAgICAgICAgKGMtc2V0LXN0eWxlICJsaW51eC10YWJzLW9ubHkiKSkpKSkKIAogVGhpcyB3aWxsIG1ha2UgZW1hY3MgZ28gYmV0dGVyIHdpdGggdGhlIGtlcm5lbCBjb2Rpbmcgc3R5bGUgZm9yIEMKLWZpbGVzIGJlbG93IH4vc3JjL2xpbnV4LXRyZWVzLgorZmlsZXMgYmVsb3cgYGB+L3NyYy9saW51eC10cmVlc2BgLgogCiBCdXQgZXZlbiBpZiB5b3UgZmFpbCBpbiBnZXR0aW5nIGVtYWNzIHRvIGRvIHNhbmUgZm9ybWF0dGluZywgbm90Ci1ldmVyeXRoaW5nIGlzIGxvc3Q6IHVzZSAiaW5kZW50Ii4KK2V2ZXJ5dGhpbmcgaXMgbG9zdDogdXNlIGBgaW5kZW50YGAuCiAKIE5vdywgYWdhaW4sIEdOVSBpbmRlbnQgaGFzIHRoZSBzYW1lIGJyYWluLWRlYWQgc2V0dGluZ3MgdGhhdCBHTlUgZW1hY3MKIGhhcywgd2hpY2ggaXMgd2h5IHlvdSBuZWVkIHRvIGdpdmUgaXQgYSBmZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMuCiBIb3dldmVyLCB0aGF0J3Mgbm90IHRvbyBiYWQsIGJlY2F1c2UgZXZlbiB0aGUgbWFrZXJzIG9mIEdOVSBpbmRlbnQKIHJlY29nbml6ZSB0aGUgYXV0aG9yaXR5IG9mIEsmUiAodGhlIEdOVSBwZW9wbGUgYXJlbid0IGV2aWwsIHRoZXkgYXJlCiBqdXN0IHNldmVyZWx5IG1pc2d1aWRlZCBpbiB0aGlzIG1hdHRlciksIHNvIHlvdSBqdXN0IGdpdmUgaW5kZW50IHRoZQotb3B0aW9ucyAiLWtyIC1pOCIgKHN0YW5kcyBmb3IgIksmUiwgOCBjaGFyYWN0ZXIgaW5kZW50cyIpLCBvciB1c2UKLSJzY3JpcHRzL0xpbmRlbnQiLCB3aGljaCBpbmRlbnRzIGluIHRoZSBsYXRlc3Qgc3R5bGUuCitvcHRpb25zIGBgLWtyIC1pOGBgIChzdGFuZHMgZm9yIGBgSyZSLCA4IGNoYXJhY3RlciBpbmRlbnRzYGApLCBvciB1c2UKK2Bgc2NyaXB0cy9MaW5kZW50YGAsIHdoaWNoIGluZGVudHMgaW4gdGhlIGxhdGVzdCBzdHlsZS4KIAotImluZGVudCIgaGFzIGEgbG90IG9mIG9wdGlvbnMsIGFuZCBlc3BlY2lhbGx5IHdoZW4gaXQgY29tZXMgdG8gY29tbWVudAorYGBpbmRlbnRgYCBoYXMgYSBsb3Qgb2Ygb3B0aW9ucywgYW5kIGVzcGVjaWFsbHkgd2hlbiBpdCBjb21lcyB0byBjb21tZW50CiByZS1mb3JtYXR0aW5nIHlvdSBtYXkgd2FudCB0byB0YWtlIGEgbG9vayBhdCB0aGUgbWFuIHBhZ2UuICBCdXQKLXJlbWVtYmVyOiAiaW5kZW50IiBpcyBub3QgYSBmaXggZm9yIGJhZCBwcm9ncmFtbWluZy4KK3JlbWVtYmVyOiBgYGluZGVudGBgIGlzIG5vdCBhIGZpeCBmb3IgYmFkIHByb2dyYW1taW5nLgogCiAKLQkJQ2hhcHRlciAxMDogS2NvbmZpZyBjb25maWd1cmF0aW9uIGZpbGVzCisxMCkgS2NvbmZpZyBjb25maWd1cmF0aW9uIGZpbGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEZvciBhbGwgb2YgdGhlIEtjb25maWcqIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhyb3VnaG91dCB0aGUgc291cmNlIHRyZWUsCi10aGUgaW5kZW50YXRpb24gaXMgc29tZXdoYXQgZGlmZmVyZW50LiAgTGluZXMgdW5kZXIgYSAiY29uZmlnIiBkZWZpbml0aW9uCit0aGUgaW5kZW50YXRpb24gaXMgc29tZXdoYXQgZGlmZmVyZW50LiAgTGluZXMgdW5kZXIgYSBgYGNvbmZpZ2BgIGRlZmluaXRpb24KIGFyZSBpbmRlbnRlZCB3aXRoIG9uZSB0YWIsIHdoaWxlIGhlbHAgdGV4dCBpcyBpbmRlbnRlZCBhbiBhZGRpdGlvbmFsIHR3bwotc3BhY2VzLiAgRXhhbXBsZToKK3NwYWNlcy4gIEV4YW1wbGU6OgogCi1jb25maWcgQVVESVQKKyAgY29uZmlnIEFVRElUCiAJYm9vbCAiQXVkaXRpbmcgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE5FVAogCWhlbHAKQEAgLTU2OSw5ICs2NDEsOSBAQAogCSAgYXVkaXRpbmcgd2l0aG91dCBDT05GSUdfQVVESVRTWVNDQUxMLgogCiBTZXJpb3VzbHkgZGFuZ2Vyb3VzIGZlYXR1cmVzIChzdWNoIGFzIHdyaXRlIHN1cHBvcnQgZm9yIGNlcnRhaW4KLWZpbGVzeXN0ZW1zKSBzaG91bGQgYWR2ZXJ0aXNlIHRoaXMgcHJvbWluZW50bHkgaW4gdGhlaXIgcHJvbXB0IHN0cmluZzoKK2ZpbGVzeXN0ZW1zKSBzaG91bGQgYWR2ZXJ0aXNlIHRoaXMgcHJvbWluZW50bHkgaW4gdGhlaXIgcHJvbXB0IHN0cmluZzo6CiAKLWNvbmZpZyBBREZTX0ZTX1JXCisgIGNvbmZpZyBBREZTX0ZTX1JXCiAJYm9vbCAiQURGUyB3cml0ZSBzdXBwb3J0IChEQU5HRVJPVVMpIgogCWRlcGVuZHMgb24gQURGU19GUwogCS4uLgpAQCAtNTgwLDQxICs2NTIsNDUgQEAKIERvY3VtZW50YXRpb24va2J1aWxkL2tjb25maWctbGFuZ3VhZ2UudHh0LgogCiAKLQkJQ2hhcHRlciAxMTogRGF0YSBzdHJ1Y3R1cmVzCisxMSkgRGF0YSBzdHJ1Y3R1cmVzCistLS0tLS0tLS0tLS0tLS0tLS0tCiAKIERhdGEgc3RydWN0dXJlcyB0aGF0IGhhdmUgdmlzaWJpbGl0eSBvdXRzaWRlIHRoZSBzaW5nbGUtdGhyZWFkZWQKIGVudmlyb25tZW50IHRoZXkgYXJlIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCBpbiBzaG91bGQgYWx3YXlzIGhhdmUKIHJlZmVyZW5jZSBjb3VudHMuICBJbiB0aGUga2VybmVsLCBnYXJiYWdlIGNvbGxlY3Rpb24gZG9lc24ndCBleGlzdCAoYW5kCiBvdXRzaWRlIHRoZSBrZXJuZWwgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIHNsb3cgYW5kIGluZWZmaWNpZW50KSwgd2hpY2gKLW1lYW5zIHRoYXQgeW91IGFic29sdXRlbHkgX2hhdmVfIHRvIHJlZmVyZW5jZSBjb3VudCBhbGwgeW91ciB1c2VzLgorbWVhbnMgdGhhdCB5b3UgYWJzb2x1dGVseSAqKmhhdmUqKiB0byByZWZlcmVuY2UgY291bnQgYWxsIHlvdXIgdXNlcy4KIAogUmVmZXJlbmNlIGNvdW50aW5nIG1lYW5zIHRoYXQgeW91IGNhbiBhdm9pZCBsb2NraW5nLCBhbmQgYWxsb3dzIG11bHRpcGxlCiB1c2VycyB0byBoYXZlIGFjY2VzcyB0byB0aGUgZGF0YSBzdHJ1Y3R1cmUgaW4gcGFyYWxsZWwgLSBhbmQgbm90IGhhdmluZwogdG8gd29ycnkgYWJvdXQgdGhlIHN0cnVjdHVyZSBzdWRkZW5seSBnb2luZyBhd2F5IGZyb20gdW5kZXIgdGhlbSBqdXN0CiBiZWNhdXNlIHRoZXkgc2xlcHQgb3IgZGlkIHNvbWV0aGluZyBlbHNlIGZvciBhIHdoaWxlLgogCi1Ob3RlIHRoYXQgbG9ja2luZyBpcyBfbm90XyBhIHJlcGxhY2VtZW50IGZvciByZWZlcmVuY2UgY291bnRpbmcuCitOb3RlIHRoYXQgbG9ja2luZyBpcyAqKm5vdCoqIGEgcmVwbGFjZW1lbnQgZm9yIHJlZmVyZW5jZSBjb3VudGluZy4KIExvY2tpbmcgaXMgdXNlZCB0byBrZWVwIGRhdGEgc3RydWN0dXJlcyBjb2hlcmVudCwgd2hpbGUgcmVmZXJlbmNlCiBjb3VudGluZyBpcyBhIG1lbW9yeSBtYW5hZ2VtZW50IHRlY2huaXF1ZS4gIFVzdWFsbHkgYm90aCBhcmUgbmVlZGVkLCBhbmQKIHRoZXkgYXJlIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGVhY2ggb3RoZXIuCiAKIE1hbnkgZGF0YSBzdHJ1Y3R1cmVzIGNhbiBpbmRlZWQgaGF2ZSB0d28gbGV2ZWxzIG9mIHJlZmVyZW5jZSBjb3VudGluZywKLXdoZW4gdGhlcmUgYXJlIHVzZXJzIG9mIGRpZmZlcmVudCAiY2xhc3NlcyIuICBUaGUgc3ViY2xhc3MgY291bnQgY291bnRzCit3aGVuIHRoZXJlIGFyZSB1c2VycyBvZiBkaWZmZXJlbnQgYGBjbGFzc2VzYGAuICBUaGUgc3ViY2xhc3MgY291bnQgY291bnRzCiB0aGUgbnVtYmVyIG9mIHN1YmNsYXNzIHVzZXJzLCBhbmQgZGVjcmVtZW50cyB0aGUgZ2xvYmFsIGNvdW50IGp1c3Qgb25jZQogd2hlbiB0aGUgc3ViY2xhc3MgY291bnQgZ29lcyB0byB6ZXJvLgogCi1FeGFtcGxlcyBvZiB0aGlzIGtpbmQgb2YgIm11bHRpLWxldmVsLXJlZmVyZW5jZS1jb3VudGluZyIgY2FuIGJlIGZvdW5kIGluCi1tZW1vcnkgbWFuYWdlbWVudCAoInN0cnVjdCBtbV9zdHJ1Y3QiOiBtbV91c2VycyBhbmQgbW1fY291bnQpLCBhbmQgaW4KLWZpbGVzeXN0ZW0gY29kZSAoInN0cnVjdCBzdXBlcl9ibG9jayI6IHNfY291bnQgYW5kIHNfYWN0aXZlKS4KK0V4YW1wbGVzIG9mIHRoaXMga2luZCBvZiBgYG11bHRpLWxldmVsLXJlZmVyZW5jZS1jb3VudGluZ2BgIGNhbiBiZSBmb3VuZCBpbgorbWVtb3J5IG1hbmFnZW1lbnQgKGBgc3RydWN0IG1tX3N0cnVjdGBgOiBtbV91c2VycyBhbmQgbW1fY291bnQpLCBhbmQgaW4KK2ZpbGVzeXN0ZW0gY29kZSAoYGBzdHJ1Y3Qgc3VwZXJfYmxvY2tgYDogc19jb3VudCBhbmQgc19hY3RpdmUpLgogCiBSZW1lbWJlcjogaWYgYW5vdGhlciB0aHJlYWQgY2FuIGZpbmQgeW91ciBkYXRhIHN0cnVjdHVyZSwgYW5kIHlvdSBkb24ndAogaGF2ZSBhIHJlZmVyZW5jZSBjb3VudCBvbiBpdCwgeW91IGFsbW9zdCBjZXJ0YWlubHkgaGF2ZSBhIGJ1Zy4KIAogCi0JCUNoYXB0ZXIgMTI6IE1hY3JvcywgRW51bXMgYW5kIFJUTAorMTIpIE1hY3JvcywgRW51bXMgYW5kIFJUTAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBOYW1lcyBvZiBtYWNyb3MgZGVmaW5pbmcgY29uc3RhbnRzIGFuZCBsYWJlbHMgaW4gZW51bXMgYXJlIGNhcGl0YWxpemVkLgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJI2RlZmluZSBDT05TVEFOVCAweDEyMzQ1CiAKIEVudW1zIGFyZSBwcmVmZXJyZWQgd2hlbiBkZWZpbmluZyBzZXZlcmFsIHJlbGF0ZWQgY29uc3RhbnRzLgpAQCAtNjI2LDcgKzcwMiw5IEBACiAKIE1hY3JvcyB3aXRoIG11bHRpcGxlIHN0YXRlbWVudHMgc2hvdWxkIGJlIGVuY2xvc2VkIGluIGEgZG8gLSB3aGlsZSBibG9jazoKIAotCSNkZWZpbmUgbWFjcm9mdW4oYSwgYiwgYykgCQkJXAorLi4gY29kZS1ibG9jazo6IGMKKworCSNkZWZpbmUgbWFjcm9mdW4oYSwgYiwgYykJCQlcCiAJCWRvIHsJCQkJCVwKIAkJCWlmIChhID09IDUpCQkJXAogCQkJCWRvX3RoaXMoYiwgYyk7CQlcCkBAIC02MzYsMTcgKzcxNCwyMSBAQAogCiAxKSBtYWNyb3MgdGhhdCBhZmZlY3QgY29udHJvbCBmbG93OgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJI2RlZmluZSBGT08oeCkJCQkJCVwKIAkJZG8gewkJCQkJXAogCQkJaWYgKGJsYWgoeCkgPCAwKQkJXAogCQkJCXJldHVybiAtRUJVR0dFUkVEOwlcCiAJCX0gd2hpbGUgKDApCiAKLWlzIGEgX3ZlcnlfIGJhZCBpZGVhLiAgSXQgbG9va3MgbGlrZSBhIGZ1bmN0aW9uIGNhbGwgYnV0IGV4aXRzIHRoZSAiY2FsbGluZyIKK2lzIGEgKip2ZXJ5KiogYmFkIGlkZWEuICBJdCBsb29rcyBsaWtlIGEgZnVuY3Rpb24gY2FsbCBidXQgZXhpdHMgdGhlIGBgY2FsbGluZ2BgCiBmdW5jdGlvbjsgZG9uJ3QgYnJlYWsgdGhlIGludGVybmFsIHBhcnNlcnMgb2YgdGhvc2Ugd2hvIHdpbGwgcmVhZCB0aGUgY29kZS4KIAogMikgbWFjcm9zIHRoYXQgZGVwZW5kIG9uIGhhdmluZyBhIGxvY2FsIHZhcmlhYmxlIHdpdGggYSBtYWdpYyBuYW1lOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJI2RlZmluZSBGT08odmFsKSBiYXIoaW5kZXgsIHZhbCkKIAogbWlnaHQgbG9vayBsaWtlIGEgZ29vZCB0aGluZywgYnV0IGl0J3MgY29uZnVzaW5nIGFzIGhlbGwgd2hlbiBvbmUgcmVhZHMgdGhlCkBAIC02NTksMTggKzc0MSwyMiBAQAogbXVzdCBlbmNsb3NlIHRoZSBleHByZXNzaW9uIGluIHBhcmVudGhlc2VzLiBCZXdhcmUgb2Ygc2ltaWxhciBpc3N1ZXMgd2l0aAogbWFjcm9zIHVzaW5nIHBhcmFtZXRlcnMuCiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAkjZGVmaW5lIENPTlNUQU5UIDB4NDAwMAogCSNkZWZpbmUgQ09OU1RFWFAgKENPTlNUQU5UIHwgMykKIAogNSkgbmFtZXNwYWNlIGNvbGxpc2lvbnMgd2hlbiBkZWZpbmluZyBsb2NhbCB2YXJpYWJsZXMgaW4gbWFjcm9zIHJlc2VtYmxpbmcKIGZ1bmN0aW9uczoKIAotI2RlZmluZSBGT08oeCkJCQkJXAotKHsJCQkJCVwKLQl0eXBlb2YoeCkgcmV0OwkJCVwKLQlyZXQgPSBjYWxjX3JldCh4KTsJCVwKLQkocmV0KTsJCQkJXAotfSkKKy4uIGNvZGUtYmxvY2s6OiBjCisKKwkjZGVmaW5lIEZPTyh4KQkJCQlcCisJKHsJCQkJCVwKKwkJdHlwZW9mKHgpIHJldDsJCQlcCisJCXJldCA9IGNhbGNfcmV0KHgpOwkJXAorCQkocmV0KTsJCQkJXAorCX0pCiAKIHJldCBpcyBhIGNvbW1vbiBuYW1lIGZvciBhIGxvY2FsIHZhcmlhYmxlIC0gX19mb29fcmV0IGlzIGxlc3MgbGlrZWx5CiB0byBjb2xsaWRlIHdpdGggYW4gZXhpc3RpbmcgdmFyaWFibGUuCkBAIC02NzksMTEgKzc2NSwxMiBAQAogY292ZXJzIFJUTCB3aGljaCBpcyB1c2VkIGZyZXF1ZW50bHkgd2l0aCBhc3NlbWJseSBsYW5ndWFnZSBpbiB0aGUga2VybmVsLgogCiAKLQkJQ2hhcHRlciAxMzogUHJpbnRpbmcga2VybmVsIG1lc3NhZ2VzCisxMykgUHJpbnRpbmcga2VybmVsIG1lc3NhZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEtlcm5lbCBkZXZlbG9wZXJzIGxpa2UgdG8gYmUgc2VlbiBhcyBsaXRlcmF0ZS4gRG8gbWluZCB0aGUgc3BlbGxpbmcKIG9mIGtlcm5lbCBtZXNzYWdlcyB0byBtYWtlIGEgZ29vZCBpbXByZXNzaW9uLiBEbyBub3QgdXNlIGNyaXBwbGVkCi13b3JkcyBsaWtlICJkb250IjsgdXNlICJkbyBub3QiIG9yICJkb24ndCIgaW5zdGVhZC4gIE1ha2UgdGhlIG1lc3NhZ2VzCit3b3JkcyBsaWtlIGBgZG9udGBgOyB1c2UgYGBkbyBub3RgYCBvciBgYGRvbid0YGAgaW5zdGVhZC4gIE1ha2UgdGhlIG1lc3NhZ2VzCiBjb25jaXNlLCBjbGVhciwgYW5kIHVuYW1iaWd1b3VzLgogCiBLZXJuZWwgbWVzc2FnZXMgZG8gbm90IGhhdmUgdG8gYmUgdGVybWluYXRlZCB3aXRoIGEgcGVyaW9kLgpAQCAtNzEzLDcgKzgwMCw4IEBACiB1c2VkLgogCiAKLQkJQ2hhcHRlciAxNDogQWxsb2NhdGluZyBtZW1vcnkKKzE0KSBBbGxvY2F0aW5nIG1lbW9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZSBrZXJuZWwgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBnZW5lcmFsIHB1cnBvc2UgbWVtb3J5IGFsbG9jYXRvcnM6CiBrbWFsbG9jKCksIGt6YWxsb2MoKSwga21hbGxvY19hcnJheSgpLCBrY2FsbG9jKCksIHZtYWxsb2MoKSwgYW5kCkBAIC03MjIsNiArODEwLDggQEAKIAogVGhlIHByZWZlcnJlZCBmb3JtIGZvciBwYXNzaW5nIGEgc2l6ZSBvZiBhIHN0cnVjdCBpcyB0aGUgZm9sbG93aW5nOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgLi4uKTsKIAogVGhlIGFsdGVybmF0aXZlIGZvcm0gd2hlcmUgc3RydWN0IG5hbWUgaXMgc3BlbGxlZCBvdXQgaHVydHMgcmVhZGFiaWxpdHkgYW5kCkBAIC03MzQsMjAgKzgyNCwyNSBAQAogCiBUaGUgcHJlZmVycmVkIGZvcm0gZm9yIGFsbG9jYXRpbmcgYW4gYXJyYXkgaXMgdGhlIGZvbGxvd2luZzoKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCXAgPSBrbWFsbG9jX2FycmF5KG4sIHNpemVvZiguLi4pLCAuLi4pOwogCiBUaGUgcHJlZmVycmVkIGZvcm0gZm9yIGFsbG9jYXRpbmcgYSB6ZXJvZWQgYXJyYXkgaXMgdGhlIGZvbGxvd2luZzoKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCXAgPSBrY2FsbG9jKG4sIHNpemVvZiguLi4pLCAuLi4pOwogCiBCb3RoIGZvcm1zIGNoZWNrIGZvciBvdmVyZmxvdyBvbiB0aGUgYWxsb2NhdGlvbiBzaXplIG4gKiBzaXplb2YoLi4uKSwKIGFuZCByZXR1cm4gTlVMTCBpZiB0aGF0IG9jY3VycmVkLgogCiAKLQkJQ2hhcHRlciAxNTogVGhlIGlubGluZSBkaXNlYXNlCisxNSkgVGhlIGlubGluZSBkaXNlYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZXJlIGFwcGVhcnMgdG8gYmUgYSBjb21tb24gbWlzcGVyY2VwdGlvbiB0aGF0IGdjYyBoYXMgYSBtYWdpYyAibWFrZSBtZQotZmFzdGVyIiBzcGVlZHVwIG9wdGlvbiBjYWxsZWQgImlubGluZSIuIFdoaWxlIHRoZSB1c2Ugb2YgaW5saW5lcyBjYW4gYmUKK2Zhc3RlciIgc3BlZWR1cCBvcHRpb24gY2FsbGVkIGBgaW5saW5lYGAuIFdoaWxlIHRoZSB1c2Ugb2YgaW5saW5lcyBjYW4gYmUKIGFwcHJvcHJpYXRlIChmb3IgZXhhbXBsZSBhcyBhIG1lYW5zIG9mIHJlcGxhY2luZyBtYWNyb3MsIHNlZSBDaGFwdGVyIDEyKSwgaXQKIHZlcnkgb2Z0ZW4gaXMgbm90LiBBYnVuZGFudCB1c2Ugb2YgdGhlIGlubGluZSBrZXl3b3JkIGxlYWRzIHRvIGEgbXVjaCBiaWdnZXIKIGtlcm5lbCwgd2hpY2ggaW4gdHVybiBzbG93cyB0aGUgc3lzdGVtIGFzIGEgd2hvbGUgZG93biwgZHVlIHRvIGEgYmlnZ2VyCkBAIC03NzEsMjYgKzg2NiwyNyBAQAogc29tZXRoaW5nIGl0IHdvdWxkIGhhdmUgZG9uZSBhbnl3YXkuCiAKIAotCQlDaGFwdGVyIDE2OiBGdW5jdGlvbiByZXR1cm4gdmFsdWVzIGFuZCBuYW1lcworMTYpIEZ1bmN0aW9uIHJldHVybiB2YWx1ZXMgYW5kIG5hbWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogRnVuY3Rpb25zIGNhbiByZXR1cm4gdmFsdWVzIG9mIG1hbnkgZGlmZmVyZW50IGtpbmRzLCBhbmQgb25lIG9mIHRoZQogbW9zdCBjb21tb24gaXMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIHN1Y2NlZWRlZCBvcgogZmFpbGVkLiAgU3VjaCBhIHZhbHVlIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhbiBlcnJvci1jb2RlIGludGVnZXIKLSgtRXh4eCA9IGZhaWx1cmUsIDAgPSBzdWNjZXNzKSBvciBhICJzdWNjZWVkZWQiIGJvb2xlYW4gKDAgPSBmYWlsdXJlLAorKC1FeHh4ID0gZmFpbHVyZSwgMCA9IHN1Y2Nlc3MpIG9yIGEgYGBzdWNjZWVkZWRgYCBib29sZWFuICgwID0gZmFpbHVyZSwKIG5vbi16ZXJvID0gc3VjY2VzcykuCiAKIE1peGluZyB1cCB0aGVzZSB0d28gc29ydHMgb2YgcmVwcmVzZW50YXRpb25zIGlzIGEgZmVydGlsZSBzb3VyY2Ugb2YKIGRpZmZpY3VsdC10by1maW5kIGJ1Z3MuICBJZiB0aGUgQyBsYW5ndWFnZSBpbmNsdWRlZCBhIHN0cm9uZyBkaXN0aW5jdGlvbgogYmV0d2VlbiBpbnRlZ2VycyBhbmQgYm9vbGVhbnMgdGhlbiB0aGUgY29tcGlsZXIgd291bGQgZmluZCB0aGVzZSBtaXN0YWtlcwogZm9yIHVzLi4uIGJ1dCBpdCBkb2Vzbid0LiAgVG8gaGVscCBwcmV2ZW50IHN1Y2ggYnVncywgYWx3YXlzIGZvbGxvdyB0aGlzCi1jb252ZW50aW9uOgorY29udmVudGlvbjo6CiAKIAlJZiB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGlzIGFuIGFjdGlvbiBvciBhbiBpbXBlcmF0aXZlIGNvbW1hbmQsCiAJdGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYW4gZXJyb3ItY29kZSBpbnRlZ2VyLiAgSWYgdGhlIG5hbWUKIAlpcyBhIHByZWRpY2F0ZSwgdGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gYSAic3VjY2VlZGVkIiBib29sZWFuLgogCi1Gb3IgZXhhbXBsZSwgImFkZCB3b3JrIiBpcyBhIGNvbW1hbmQsIGFuZCB0aGUgYWRkX3dvcmsoKSBmdW5jdGlvbiByZXR1cm5zIDAKLWZvciBzdWNjZXNzIG9yIC1FQlVTWSBmb3IgZmFpbHVyZS4gIEluIHRoZSBzYW1lIHdheSwgIlBDSSBkZXZpY2UgcHJlc2VudCIgaXMKK0ZvciBleGFtcGxlLCBgYGFkZCB3b3JrYGAgaXMgYSBjb21tYW5kLCBhbmQgdGhlIGFkZF93b3JrKCkgZnVuY3Rpb24gcmV0dXJucyAwCitmb3Igc3VjY2VzcyBvciAtRUJVU1kgZm9yIGZhaWx1cmUuICBJbiB0aGUgc2FtZSB3YXksIGBgUENJIGRldmljZSBwcmVzZW50YGAgaXMKIGEgcHJlZGljYXRlLCBhbmQgdGhlIHBjaV9kZXZfcHJlc2VudCgpIGZ1bmN0aW9uIHJldHVybnMgMSBpZiBpdCBzdWNjZWVkcyBpbgogZmluZGluZyBhIG1hdGNoaW5nIGRldmljZSBvciAwIGlmIGl0IGRvZXNuJ3QuCiAKQEAgLTgwNSwxNyArOTAxLDIyIEBACiBOVUxMIG9yIHRoZSBFUlJfUFRSIG1lY2hhbmlzbSB0byByZXBvcnQgZmFpbHVyZS4KIAogCi0JCUNoYXB0ZXIgMTc6ICBEb24ndCByZS1pbnZlbnQgdGhlIGtlcm5lbCBtYWNyb3MKKzE3KSBEb24ndCByZS1pbnZlbnQgdGhlIGtlcm5lbCBtYWNyb3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIGhlYWRlciBmaWxlIGluY2x1ZGUvbGludXgva2VybmVsLmggY29udGFpbnMgYSBudW1iZXIgb2YgbWFjcm9zIHRoYXQKIHlvdSBzaG91bGQgdXNlLCByYXRoZXIgdGhhbiBleHBsaWNpdGx5IGNvZGluZyBzb21lIHZhcmlhbnQgb2YgdGhlbSB5b3Vyc2VsZi4KIEZvciBleGFtcGxlLCBpZiB5b3UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiBhbiBhcnJheSwgdGFrZSBhZHZhbnRhZ2UKIG9mIHRoZSBtYWNybwogCisuLiBjb2RlLWJsb2NrOjogYworCiAJI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKIAogU2ltaWxhcmx5LCBpZiB5b3UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2Ygc29tZSBzdHJ1Y3R1cmUgbWVtYmVyLCB1c2UKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCSNkZWZpbmUgRklFTERfU0laRU9GKHQsIGYpIChzaXplb2YoKCh0KikwKS0+ZikpCiAKIFRoZXJlIGFyZSBhbHNvIG1pbigpIGFuZCBtYXgoKSBtYWNyb3MgdGhhdCBkbyBzdHJpY3QgdHlwZSBjaGVja2luZyBpZiB5b3UKQEAgLTgyMywxNiArOTI0LDIxIEBACiBkZWZpbmVkIHRoYXQgeW91IHNob3VsZG4ndCByZXByb2R1Y2UgaW4geW91ciBjb2RlLgogCiAKLQkJQ2hhcHRlciAxODogIEVkaXRvciBtb2RlbGluZXMgYW5kIG90aGVyIGNydWZ0CisxOCkgRWRpdG9yIG1vZGVsaW5lcyBhbmQgb3RoZXIgY3J1ZnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBTb21lIGVkaXRvcnMgY2FuIGludGVycHJldCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGVtYmVkZGVkIGluIHNvdXJjZSBmaWxlcywKIGluZGljYXRlZCB3aXRoIHNwZWNpYWwgbWFya2Vycy4gIEZvciBleGFtcGxlLCBlbWFjcyBpbnRlcnByZXRzIGxpbmVzIG1hcmtlZAogbGlrZSB0aGlzOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJLSotIG1vZGU6IGMgLSotCiAKIE9yIGxpa2UgdGhpczoKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCS8qCiAJTG9jYWwgVmFyaWFibGVzOgogCWNvbXBpbGUtY29tbWFuZDogImdjYyAtRE1BR0lDX0RFQlVHX0ZMQUcgZm9vLmMiCkBAIC04NDEsNiArOTQ3LDggQEAKIAogVmltIGludGVycHJldHMgbWFya2VycyB0aGF0IGxvb2sgbGlrZSB0aGlzOgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJLyogdmltOnNldCBzdz04IG5vZXQgKi8KIAogRG8gbm90IGluY2x1ZGUgYW55IG9mIHRoZXNlIGluIHNvdXJjZSBmaWxlcy4gIFBlb3BsZSBoYXZlIHRoZWlyIG93biBwZXJzb25hbApAQCAtODUwLDcgKzk1OCw4IEBACiB3b3JrIGNvcnJlY3RseS4KIAogCi0JCUNoYXB0ZXIgMTk6ICBJbmxpbmUgYXNzZW1ibHkKKzE5KSBJbmxpbmUgYXNzZW1ibHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSW4gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUsIHlvdSBtYXkgbmVlZCB0byB1c2UgaW5saW5lIGFzc2VtYmx5IHRvIGludGVyZmFjZQogd2l0aCBDUFUgb3IgcGxhdGZvcm0gZnVuY3Rpb25hbGl0eS4gIERvbid0IGhlc2l0YXRlIHRvIGRvIHNvIHdoZW4gbmVjZXNzYXJ5LgpAQCAtODYzLDcgKzk3Miw3IEBACiAKIExhcmdlLCBub24tdHJpdmlhbCBhc3NlbWJseSBmdW5jdGlvbnMgc2hvdWxkIGdvIGluIC5TIGZpbGVzLCB3aXRoIGNvcnJlc3BvbmRpbmcKIEMgcHJvdG90eXBlcyBkZWZpbmVkIGluIEMgaGVhZGVyIGZpbGVzLiAgVGhlIEMgcHJvdG90eXBlcyBmb3IgYXNzZW1ibHkKLWZ1bmN0aW9ucyBzaG91bGQgdXNlICJhc21saW5rYWdlIi4KK2Z1bmN0aW9ucyBzaG91bGQgdXNlIGBgYXNtbGlua2FnZWBgLgogCiBZb3UgbWF5IG5lZWQgdG8gbWFyayB5b3VyIGFzbSBzdGF0ZW1lbnQgYXMgdm9sYXRpbGUsIHRvIHByZXZlbnQgR0NDIGZyb20KIHJlbW92aW5nIGl0IGlmIEdDQyBkb2Vzbid0IG5vdGljZSBhbnkgc2lkZSBlZmZlY3RzLiAgWW91IGRvbid0IGFsd2F5cyBuZWVkIHRvCkBAIC04NzQsMTIgKzk4MywxNSBAQAogc3RyaW5nLCBhbmQgZW5kIGVhY2ggc3RyaW5nIGV4Y2VwdCB0aGUgbGFzdCB3aXRoIFxuXHQgdG8gcHJvcGVybHkgaW5kZW50IHRoZQogbmV4dCBpbnN0cnVjdGlvbiBpbiB0aGUgYXNzZW1ibHkgb3V0cHV0OgogCisuLiBjb2RlLWJsb2NrOjogYworCiAJYXNtICgibWFnaWMgJXJlZzEsICM0MlxuXHQiCiAJICAgICAibW9yZV9tYWdpYyAlcmVnMiwgJXJlZzMiCiAJICAgICA6IC8qIG91dHB1dHMgKi8gOiAvKiBpbnB1dHMgKi8gOiAvKiBjbG9iYmVycyAqLyk7CiAKIAotCQlDaGFwdGVyIDIwOiBDb25kaXRpb25hbCBDb21waWxhdGlvbgorMjApIENvbmRpdGlvbmFsIENvbXBpbGF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogV2hlcmV2ZXIgcG9zc2libGUsIGRvbid0IHVzZSBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzICgjaWYsICNpZmRlZikgaW4gLmMKIGZpbGVzOyBkb2luZyBzbyBtYWtlcyBjb2RlIGhhcmRlciB0byByZWFkIGFuZCBsb2dpYyBoYXJkZXIgdG8gZm9sbG93LiAgSW5zdGVhZCwKQEAgLTkwMyw2ICsxMDE1LDggQEAKIFdpdGhpbiBjb2RlLCB3aGVyZSBwb3NzaWJsZSwgdXNlIHRoZSBJU19FTkFCTEVEIG1hY3JvIHRvIGNvbnZlcnQgYSBLY29uZmlnCiBzeW1ib2wgaW50byBhIEMgYm9vbGVhbiBleHByZXNzaW9uLCBhbmQgdXNlIGl0IGluIGEgbm9ybWFsIEMgY29uZGl0aW9uYWw6CiAKKy4uIGNvZGUtYmxvY2s6OiBjCisKIAlpZiAoSVNfRU5BQkxFRChDT05GSUdfU09NRVRISU5HKSkgewogCQkuLi4KIAl9CkBAIC05MTgsMTIgKzEwMzIsMTUgQEAKIHBsYWNlIGEgY29tbWVudCBhZnRlciB0aGUgI2VuZGlmIG9uIHRoZSBzYW1lIGxpbmUsIG5vdGluZyB0aGUgY29uZGl0aW9uYWwKIGV4cHJlc3Npb24gdXNlZC4gIEZvciBpbnN0YW5jZToKIAorLi4gY29kZS1ibG9jazo6IGMKKwogCSNpZmRlZiBDT05GSUdfU09NRVRISU5HCiAJLi4uCiAJI2VuZGlmIC8qIENPTkZJR19TT01FVEhJTkcgKi8KIAogCi0JCUFwcGVuZGl4IEk6IFJlZmVyZW5jZXMKK0FwcGVuZGl4IEkpIFJlZmVyZW5jZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIEMgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UsIFNlY29uZCBFZGl0aW9uCiBieSBCcmlhbiBXLiBLZXJuaWdoYW4gYW5kIERlbm5pcyBNLiBSaXRjaGllLgpAQCAtOTQzLDQgKzEwNjAsMyBAQAogCiBLZXJuZWwgQ29kaW5nU3R5bGUsIGJ5IGdyZWdAa3JvYWguY29tIGF0IE9MUyAyMDAyOgogaHR0cDovL3d3dy5rcm9haC5jb20vbGludXgvdGFsa3Mvb2xzXzIwMDJfa2VybmVsX2NvZGluZ3N0eWxlX3RhbGsvaHRtbC8KLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLUhPV1RPLnR4dCBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS1IT1dUTy50eHQKaW5kZXggNzgxMDI0ZS4uOTc5MjI4YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLUhPV1RPLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL0RNQS1BUEktSE9XVE8udHh0CkBAIC02OTksNyArNjk5LDcgQEAKIAkJZG1hX2FkZHJfdCBtYXBwaW5nOwogCiAJCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZShjcC0+ZGV2LCBidWZmZXIsIGxlbiwgRE1BX0ZST01fREVWSUNFKTsKLQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGNwLT5kZXYsIGRtYV9oYW5kbGUpKSB7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcihjcC0+ZGV2LCBtYXBwaW5nKSkgewogCQkJLyoKIAkJCSAqIHJlZHVjZSBjdXJyZW50IERNQSBtYXBwaW5nIHVzYWdlLAogCQkJICogZGVsYXkgYW5kIHRyeSBhZ2FpbiBsYXRlciBvcgpAQCAtOTMxLDEwICs5MzEsOCBAQAogCiAxKSBTdHJ1Y3Qgc2NhdHRlcmxpc3QgcmVxdWlyZW1lbnRzLgogCi0gICBEb24ndCBpbnZlbnQgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBzdHJ1Y3Qgc2NhdHRlcmxpc3Q7IGp1c3QgdXNlCi0gICA8YXNtLWdlbmVyaWMvc2NhdHRlcmxpc3QuaD4uIFlvdSBuZWVkIHRvIGVuYWJsZQotICAgQ09ORklHX05FRURfU0dfRE1BX0xFTkdUSCBpZiB0aGUgYXJjaGl0ZWN0dXJlIHN1cHBvcnRzIElPTU1VcwotICAgKGluY2x1ZGluZyBzb2Z0d2FyZSBJT01NVSkuCisgICBZb3UgbmVlZCB0byBlbmFibGUgQ09ORklHX05FRURfU0dfRE1BX0xFTkdUSCBpZiB0aGUgYXJjaGl0ZWN0dXJlCisgICBzdXBwb3J0cyBJT01NVXMgKGluY2x1ZGluZyBzb2Z0d2FyZSBJT01NVSkuCiAKIDIpIEFSQ0hfRE1BX01JTkFMSUdOCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQgYi9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CmluZGV4IDFkMjZlZWI2Li42YjIwMTI4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKQEAgLTI3NywxNCArMjc3LDI2IEBACiByZWNvbW1lbmRlZCB0aGF0IHlvdSBuZXZlciB1c2UgdGhlc2UgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHRoZQogY2FjaGUgd2lkdGggaXMuCiAKK2RtYV9hZGRyX3QKK2RtYV9tYXBfcmVzb3VyY2Uoc3RydWN0IGRldmljZSAqZGV2LCBwaHlzX2FkZHJfdCBwaHlzX2FkZHIsIHNpemVfdCBzaXplLAorCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLCB1bnNpZ25lZCBsb25nIGF0dHJzKQorCit2b2lkCitkbWFfdW5tYXBfcmVzb3VyY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGFkZHIsIHNpemVfdCBzaXplLAorCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHVuc2lnbmVkIGxvbmcgYXR0cnMpCisKK0FQSSBmb3IgbWFwcGluZyBhbmQgdW5tYXBwaW5nIGZvciBNTUlPIHJlc291cmNlcy4gQWxsIHRoZSBub3RlcyBhbmQKK3dhcm5pbmdzIGZvciB0aGUgb3RoZXIgbWFwcGluZyBBUElzIGFwcGx5IGhlcmUuIFRoZSBBUEkgc2hvdWxkIG9ubHkgYmUKK3VzZWQgdG8gbWFwIGRldmljZSBNTUlPIHJlc291cmNlcywgbWFwcGluZyBvZiBSQU0gaXMgbm90IHBlcm1pdHRlZC4KKwogaW50CiBkbWFfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCiAKLUluIHNvbWUgY2lyY3Vtc3RhbmNlcyBkbWFfbWFwX3NpbmdsZSgpIGFuZCBkbWFfbWFwX3BhZ2UoKSB3aWxsIGZhaWwgdG8gY3JlYXRlCi1hIG1hcHBpbmcuIEEgZHJpdmVyIGNhbiBjaGVjayBmb3IgdGhlc2UgZXJyb3JzIGJ5IHRlc3RpbmcgdGhlIHJldHVybmVkCi1ETUEgYWRkcmVzcyB3aXRoIGRtYV9tYXBwaW5nX2Vycm9yKCkuIEEgbm9uLXplcm8gcmV0dXJuIHZhbHVlIG1lYW5zIHRoZSBtYXBwaW5nCi1jb3VsZCBub3QgYmUgY3JlYXRlZCBhbmQgdGhlIGRyaXZlciBzaG91bGQgdGFrZSBhcHByb3ByaWF0ZSBhY3Rpb24gKGUuZy4KLXJlZHVjZSBjdXJyZW50IERNQSBtYXBwaW5nIHVzYWdlIG9yIGRlbGF5IGFuZCB0cnkgYWdhaW4gbGF0ZXIpLgorSW4gc29tZSBjaXJjdW1zdGFuY2VzIGRtYV9tYXBfc2luZ2xlKCksIGRtYV9tYXBfcGFnZSgpIGFuZCBkbWFfbWFwX3Jlc291cmNlKCkKK3dpbGwgZmFpbCB0byBjcmVhdGUgYSBtYXBwaW5nLiBBIGRyaXZlciBjYW4gY2hlY2sgZm9yIHRoZXNlIGVycm9ycyBieSB0ZXN0aW5nCit0aGUgcmV0dXJuZWQgRE1BIGFkZHJlc3Mgd2l0aCBkbWFfbWFwcGluZ19lcnJvcigpLiBBIG5vbi16ZXJvIHJldHVybiB2YWx1ZQorbWVhbnMgdGhlIG1hcHBpbmcgY291bGQgbm90IGJlIGNyZWF0ZWQgYW5kIHRoZSBkcml2ZXIgc2hvdWxkIHRha2UgYXBwcm9wcmlhdGUKK2FjdGlvbiAoZS5nLiByZWR1Y2UgY3VycmVudCBETUEgbWFwcGluZyB1c2FnZSBvciBkZWxheSBhbmQgdHJ5IGFnYWluIGxhdGVyKS4KIAogCWludAogCWRtYV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCmluZGV4IDY0NDYwYTguLjczNmY1OTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKQEAgLTYsNyArNiw3IEBACiAjIFRvIGFkZCBhIG5ldyBib29rIHRoZSBvbmx5IHN0ZXAgcmVxdWlyZWQgaXMgdG8gYWRkIHRoZSBib29rIHRvIHRoZQogIyBsaXN0IG9mIERPQ0JPT0tTLgogCi1ET0NCT09LUyA6PSB6ODUzMGJvb2sueG1sIGRldmljZS1kcml2ZXJzLnhtbCBcCitET0NCT09LUyA6PSB6ODUzMGJvb2sueG1sICBcCiAJICAgIGtlcm5lbC1oYWNraW5nLnhtbCBrZXJuZWwtbG9ja2luZy54bWwgZGV2aWNlaW9ib29rLnhtbCBcCiAJICAgIHdyaXRpbmdfdXNiX2RyaXZlci54bWwgbmV0d29ya2luZy54bWwgXAogCSAgICBrZXJuZWwtYXBpLnhtbCBmaWxlc3lzdGVtcy54bWwgbHNtLnhtbCB1c2IueG1sIGtnZGIueG1sIFwKQEAgLTIyLDggKzIyLDE0IEBACiAjIFNraXAgRG9jQm9vayBidWlsZCBpZiB0aGUgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCBubyBET0NCT09LUy4KIC5ERUZBVUxUOgogCUBlY2hvICIgIFNLSVAgICAgRG9jQm9vayAkQCB0YXJnZXQgKERPQ0JPT0tTPVwiXCIgc3BlY2lmaWVkKS4iCi0KIGVsc2UKK2lmbmVxICgkKFNQSElOWERJUlMpLCkKKworIyBTa2lwIERvY0Jvb2sgYnVpbGQgaWYgdGhlIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0ZWQgYSBzcGhpbnggZGlyCisuREVGQVVMVDoKKwlAZWNobyAiICBTS0lQICAgIERvY0Jvb2sgJEAgdGFyZ2V0IChTUEhJTlhESVJTIHNwZWNpZmllZCkuIgorZWxzZQorCiAKICMjIwogIyBUaGUgYnVpbGQgcHJvY2VzcyBpcyBhcyBmb2xsb3dzICh0YXJnZXRzKToKQEAgLTY2LDYgKzcyLDcgQEAKIAogIyBuby1vcCBmb3IgdGhlIERvY0Jvb2sgdG9vbGNoYWluCiBlcHViZG9jczoKK2xhdGV4ZG9jczoKIAogIyMjCiAjRXh0ZXJuYWwgcHJvZ3JhbXMgdXNlZApAQCAtMjIxLDYgKzIyOCw3IEBACiAJICAgZWNobyAiPC9wcm9ncmFtbGlzdGluZz4iKSAgPiAkQAogCiBlbmRpZiAjIERPQ0JPT0tTPSIiCitlbmRpZiAjIFNQSElORElSPS4uLgogCiAjIyMKICMgSGVscCB0YXJnZXRzIGFzIHVzZWQgYnkgdGhlIHRvcC1sZXZlbCBtYWtlZmlsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RldmljZS1kcml2ZXJzLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxMDAzMC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGV2aWNlLWRyaXZlcnMudG1wbAorKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGJvb2sgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjEuMi8vRU4iCi0JImh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay94bWwvNC4xLjIvZG9jYm9va3guZHRkIiBbXT4KLQotPGJvb2sgaWQ9IkxpbnV4RHJpdmVyc0FQSSI+Ci0gPGJvb2tpbmZvPgotICA8dGl0bGU+TGludXggRGV2aWNlIERyaXZlcnM8L3RpdGxlPgotCi0gIDxsZWdhbG5vdGljZT4KLSAgIDxwYXJhPgotICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKLSAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgotICAgICB2ZXJzaW9uLgotICAgPC9wYXJhPgotCi0gICA8cGFyYT4KLSAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQotICAgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCi0gICAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KLSAgICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICAgPC9wYXJhPgotCi0gICA8cGFyYT4KLSAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKLSAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKLSAgICAgTUEgMDIxMTEtMTMwNyBVU0EKLSAgIDwvcGFyYT4KLQotICAgPHBhcmE+Ci0gICAgIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZQotICAgICBkaXN0cmlidXRpb24gb2YgTGludXguCi0gICA8L3BhcmE+Ci0gIDwvbGVnYWxub3RpY2U+Ci0gPC9ib29raW5mbz4KLQotPHRvYz48L3RvYz4KLQotICA8Y2hhcHRlciBpZD0iQmFzaWNzIj4KLSAgICAgPHRpdGxlPkRyaXZlciBCYXNpY3M8L3RpdGxlPgotICAgICA8c2VjdDE+PHRpdGxlPkRyaXZlciBFbnRyeSBhbmQgRXhpdCBwb2ludHM8L3RpdGxlPgotIUlpbmNsdWRlL2xpbnV4L2luaXQuaAotICAgICA8L3NlY3QxPgotCi0gICAgIDxzZWN0MT48dGl0bGU+QXRvbWljIGFuZCBwb2ludGVyIG1hbmlwdWxhdGlvbjwvdGl0bGU+Ci0hSWFyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pYy5oCi0gICAgIDwvc2VjdDE+Ci0KLSAgICAgPHNlY3QxPjx0aXRsZT5EZWxheWluZywgc2NoZWR1bGluZywgYW5kIHRpbWVyIHJvdXRpbmVzPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9zY2hlZC5oCi0hRWtlcm5lbC9zY2hlZC9jb3JlLmMKLSFJa2VybmVsL3NjaGVkL2NwdXByaS5jCi0hSWtlcm5lbC9zY2hlZC9mYWlyLmMKLSFJaW5jbHVkZS9saW51eC9jb21wbGV0aW9uLmgKLSFFa2VybmVsL3RpbWUvdGltZXIuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPldhaXQgcXVldWVzIGFuZCBXYWtlIGV2ZW50czwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvd2FpdC5oCi0hRWtlcm5lbC9zY2hlZC93YWl0LmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5IaWdoLXJlc29sdXRpb24gdGltZXJzPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9rdGltZS5oCi0hSWluY2x1ZGUvbGludXgvaHJ0aW1lci5oCi0hRWtlcm5lbC90aW1lL2hydGltZXIuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPldvcmtxdWV1ZXMgYW5kIEtldmVudHM8L3RpdGxlPgotIUlpbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCi0hRWtlcm5lbC93b3JrcXVldWUuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPkludGVybmFsIEZ1bmN0aW9uczwvdGl0bGU+Ci0hSWtlcm5lbC9leGl0LmMKLSFJa2VybmVsL3NpZ25hbC5jCi0hSWluY2x1ZGUvbGludXgva3RocmVhZC5oCi0hRWtlcm5lbC9rdGhyZWFkLmMKLSAgICAgPC9zZWN0MT4KLQotICAgICA8c2VjdDE+PHRpdGxlPktlcm5lbCBvYmplY3RzIG1hbmlwdWxhdGlvbjwvdGl0bGU+Ci08IS0tCi1YIUlpbmNsdWRlL2xpbnV4L2tvYmplY3QuaAotLS0+Ci0hRWxpYi9rb2JqZWN0LmMKLSAgICAgPC9zZWN0MT4KLQotICAgICA8c2VjdDE+PHRpdGxlPktlcm5lbCB1dGlsaXR5IGZ1bmN0aW9uczwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgva2VybmVsLmgKLSFFa2VybmVsL3ByaW50ay9wcmludGsuYwotIUVrZXJuZWwvcGFuaWMuYwotIUVrZXJuZWwvc3lzLmMKLSFFa2VybmVsL3JjdS9zcmN1LmMKLSFFa2VybmVsL3JjdS90cmVlLmMKLSFFa2VybmVsL3JjdS90cmVlX3BsdWdpbi5oCi0hRWtlcm5lbC9yY3UvdXBkYXRlLmMKLSAgICAgPC9zZWN0MT4KLQotICAgICA8c2VjdDE+PHRpdGxlPkRldmljZSBSZXNvdXJjZSBNYW5hZ2VtZW50PC90aXRsZT4KLSFFZHJpdmVycy9iYXNlL2RldnJlcy5jCi0gICAgIDwvc2VjdDE+Ci0KLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJkZXZkcml2ZXJzIj4KLSAgICAgPHRpdGxlPkRldmljZSBkcml2ZXJzIGluZnJhc3RydWN0dXJlPC90aXRsZT4KLSAgICAgPHNlY3QxPjx0aXRsZT5UaGUgQmFzaWMgRGV2aWNlIERyaXZlci1Nb2RlbCBTdHJ1Y3R1cmVzIDwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvZGV2aWNlLmgKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5EZXZpY2UgRHJpdmVycyBCYXNlPC90aXRsZT4KLSFJZHJpdmVycy9iYXNlL2luaXQuYwotIUVkcml2ZXJzL2Jhc2UvZHJpdmVyLmMKLSFFZHJpdmVycy9iYXNlL2NvcmUuYwotIUVkcml2ZXJzL2Jhc2Uvc3lzY29yZS5jCi0hRWRyaXZlcnMvYmFzZS9jbGFzcy5jCi0hSWRyaXZlcnMvYmFzZS9ub2RlLmMKLSFFZHJpdmVycy9iYXNlL2Zpcm13YXJlX2NsYXNzLmMKLSFFZHJpdmVycy9iYXNlL3RyYW5zcG9ydF9jbGFzcy5jCi08IS0tIENhbm5vdCBiZSBpbmNsdWRlZCwgYmVjYXVzZQotICAgICBhdHRyaWJ1dGVfY29udGFpbmVyX2FkZF9jbGFzc19kZXZpY2VfYWRhcHRlcgotIGFuZCBhdHRyaWJ1dGVfY29udGFpbmVyX2NsYXNzZGV2X3RvX2NvbnRhaW5lcgotICAgICBleGNlZWQgYWxsb3dlZCA0NCBjaGFyYWN0ZXJzIG1heGltdW0KLVghRWRyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKLS0tPgotIUVkcml2ZXJzL2Jhc2UvZGQuYwotPCEtLQotWCFFZHJpdmVycy9iYXNlL2ludGVyZmFjZS5jCi0tLT4KLSFJaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAotIUVkcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYwotIUVkcml2ZXJzL2Jhc2UvYnVzLmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPgotICAgICAgIDx0aXRsZT5CdWZmZXIgU2hhcmluZyBhbmQgU3luY2hyb25pemF0aW9uPC90aXRsZT4KLSAgICAgICA8cGFyYT4KLSAgICAgICAgIFRoZSBkbWEtYnVmIHN1YnN5c3RlbSBwcm92aWRlcyB0aGUgZnJhbWV3b3JrIGZvciBzaGFyaW5nIGJ1ZmZlcnMKLSAgICAgICAgIGZvciBoYXJkd2FyZSAoRE1BKSBhY2Nlc3MgYWNyb3NzIG11bHRpcGxlIGRldmljZSBkcml2ZXJzIGFuZAotICAgICAgICAgc3Vic3lzdGVtcywgYW5kIGZvciBzeW5jaHJvbml6aW5nIGFzeW5jaHJvbm91cyBoYXJkd2FyZSBhY2Nlc3MuCi0gICAgICAgPC9wYXJhPgotICAgICAgIDxwYXJhPgotICAgICAgICAgVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgYnkgZHJtICJwcmltZSIgbXVsdGktR1BVIHN1cHBvcnQsIGJ1dAotICAgICAgICAgaXMgb2YgY291cnNlIG5vdCBsaW1pdGVkIHRvIEdQVSB1c2UgY2FzZXMuCi0gICAgICAgPC9wYXJhPgotICAgICAgIDxwYXJhPgotICAgICAgICAgVGhlIHRocmVlIG1haW4gY29tcG9uZW50cyBvZiB0aGlzIGFyZTogKDEpIGRtYS1idWYsIHJlcHJlc2VudGluZwotICAgICAgICAgYSBzZ190YWJsZSBhbmQgZXhwb3NlZCB0byB1c2Vyc3BhY2UgYXMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYWxsb3cKLSAgICAgICAgIHBhc3NpbmcgYmV0d2VlbiBkZXZpY2VzLCAoMikgZmVuY2UsIHdoaWNoIHByb3ZpZGVzIGEgbWVjaGFuaXNtCi0gICAgICAgICB0byBzaWduYWwgd2hlbiBvbmUgZGV2aWNlIGFzIGZpbmlzaGVkIGFjY2VzcywgYW5kICgzKSByZXNlcnZhdGlvbiwKLSAgICAgICAgIHdoaWNoIG1hbmFnZXMgdGhlIHNoYXJlZCBvciBleGNsdXNpdmUgZmVuY2UocykgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgICB0aGUgYnVmZmVyLgotICAgICAgIDwvcGFyYT4KLSAgICAgICA8c2VjdDI+PHRpdGxlPmRtYS1idWY8L3RpdGxlPgotIUVkcml2ZXJzL2RtYS1idWYvZG1hLWJ1Zi5jCi0hSWluY2x1ZGUvbGludXgvZG1hLWJ1Zi5oCi0gICAgICAgPC9zZWN0Mj4KLSAgICAgICA8c2VjdDI+PHRpdGxlPnJlc2VydmF0aW9uPC90aXRsZT4KLSFQZHJpdmVycy9kbWEtYnVmL3Jlc2VydmF0aW9uLmMgUmVzZXJ2YXRpb24gT2JqZWN0IE92ZXJ2aWV3Ci0hRWRyaXZlcnMvZG1hLWJ1Zi9yZXNlcnZhdGlvbi5jCi0hSWluY2x1ZGUvbGludXgvcmVzZXJ2YXRpb24uaAotICAgICAgIDwvc2VjdDI+Ci0gICAgICAgPHNlY3QyPjx0aXRsZT5mZW5jZTwvdGl0bGU+Ci0hRWRyaXZlcnMvZG1hLWJ1Zi9mZW5jZS5jCi0hSWluY2x1ZGUvbGludXgvZmVuY2UuaAotIUVkcml2ZXJzL2RtYS1idWYvc2Vxbm8tZmVuY2UuYwotIUlpbmNsdWRlL2xpbnV4L3NlcW5vLWZlbmNlLmgKLSFFZHJpdmVycy9kbWEtYnVmL2ZlbmNlLWFycmF5LmMKLSFJaW5jbHVkZS9saW51eC9mZW5jZS1hcnJheS5oCi0hRWRyaXZlcnMvZG1hLWJ1Zi9yZXNlcnZhdGlvbi5jCi0hSWluY2x1ZGUvbGludXgvcmVzZXJ2YXRpb24uaAotIUVkcml2ZXJzL2RtYS1idWYvc3luY19maWxlLmMKLSFJaW5jbHVkZS9saW51eC9zeW5jX2ZpbGUuaAotICAgICAgIDwvc2VjdDI+Ci0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+RGV2aWNlIERyaXZlcnMgRE1BIE1hbmFnZW1lbnQ8L3RpdGxlPgotIUVkcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMKLSFFZHJpdmVycy9iYXNlL2RtYS1tYXBwaW5nLmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5EZXZpY2UgRHJpdmVycyBQb3dlciBNYW5hZ2VtZW50PC90aXRsZT4KLSFFZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPkRldmljZSBEcml2ZXJzIEFDUEkgU3VwcG9ydDwvdGl0bGU+Ci08IS0tIEludGVybmFsIGZ1bmN0aW9ucyBvbmx5Ci1YIUVkcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jCi1YIUVkcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMKLVghRWRyaXZlcnMvYWNwaS9tb3RoZXJib2FyZC5jCi1YIUVkcml2ZXJzL2FjcGkvYnVzLmMKLS0tPgotIUVkcml2ZXJzL2FjcGkvc2Nhbi5jCi0hSWRyaXZlcnMvYWNwaS9zY2FuLmMKLTwhLS0gTm8gY29ycmVjdCBzdHJ1Y3R1cmVkIGNvbW1lbnRzCi1YIUVkcml2ZXJzL2FjcGkvcGNpX2JpbmQuYwotLS0+Ci0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+RGV2aWNlIGRyaXZlcnMgUG5QIHN1cHBvcnQ8L3RpdGxlPgotIUlkcml2ZXJzL3BucC9jb3JlLmMKLTwhLS0gTm8gY29ycmVjdCBzdHJ1Y3R1cmVkIGNvbW1lbnRzCi1YIUVkcml2ZXJzL3BucC9zeXN0ZW0uYwotIC0tPgotIUVkcml2ZXJzL3BucC9jYXJkLmMKLSFJZHJpdmVycy9wbnAvZHJpdmVyLmMKLSFFZHJpdmVycy9wbnAvbWFuYWdlci5jCi0hRWRyaXZlcnMvcG5wL3N1cHBvcnQuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPlVzZXJzcGFjZSBJTyBkZXZpY2VzPC90aXRsZT4KLSFFZHJpdmVycy91aW8vdWlvLmMKLSFJaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKLSAgICAgPC9zZWN0MT4KLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJwYXJwb3J0ZGV2Ij4KLSAgICAgPHRpdGxlPlBhcmFsbGVsIFBvcnQgRGV2aWNlczwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvcGFycG9ydC5oCi0hRWRyaXZlcnMvcGFycG9ydC9pZWVlMTI4NC5jCi0hRWRyaXZlcnMvcGFycG9ydC9zaGFyZS5jCi0hSWRyaXZlcnMvcGFycG9ydC9kYWlzeS5jCi0gIDwvY2hhcHRlcj4KLQotICA8Y2hhcHRlciBpZD0ibWVzc2FnZV9kZXZpY2VzIj4KLQk8dGl0bGU+TWVzc2FnZS1iYXNlZCBkZXZpY2VzPC90aXRsZT4KLSAgICAgPHNlY3QxPjx0aXRsZT5GdXNpb24gbWVzc2FnZSBkZXZpY2VzPC90aXRsZT4KLSFFZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKLSFJZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKLSFFZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCi0hSWRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwotIUlkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGN0bC5jCi0hSWRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c3BpLmMKLSFJZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRmYy5jCi0hSWRyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0bGFuLmMKLSAgICAgPC9zZWN0MT4KLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJzbmRkZXYiPgotICAgICA8dGl0bGU+U291bmQgRGV2aWNlczwvdGl0bGU+Ci0hSWluY2x1ZGUvc291bmQvY29yZS5oCi0hRXNvdW5kL3NvdW5kX2NvcmUuYwotIUlpbmNsdWRlL3NvdW5kL3BjbS5oCi0hRXNvdW5kL2NvcmUvcGNtLmMKLSFFc291bmQvY29yZS9kZXZpY2UuYwotIUVzb3VuZC9jb3JlL2luZm8uYwotIUVzb3VuZC9jb3JlL3Jhd21pZGkuYwotIUVzb3VuZC9jb3JlL3NvdW5kLmMKLSFFc291bmQvY29yZS9tZW1vcnkuYwotIUVzb3VuZC9jb3JlL3BjbV9tZW1vcnkuYwotIUVzb3VuZC9jb3JlL2luaXQuYwotIUVzb3VuZC9jb3JlL2lzYWRtYS5jCi0hRXNvdW5kL2NvcmUvY29udHJvbC5jCi0hRXNvdW5kL2NvcmUvcGNtX2xpYi5jCi0hRXNvdW5kL2NvcmUvaHdkZXAuYwotIUVzb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwotIUVzb3VuZC9jb3JlL21lbWFsbG9jLmMKLTwhLS0gRklYTUU6IFJlbW92ZWQgZm9yIG5vdyBzaW5jZSBubyBzdHJ1Y3R1cmVkIGNvbW1lbnRzIGluIHNvdXJjZQotWCFJc291bmQvc291bmRfZmlybXdhcmUuYwotLS0+Ci0gIDwvY2hhcHRlcj4KLQotCi0gIDxjaGFwdGVyIGlkPSJ1YXJ0MTZ4NTAiPgotICAgICA8dGl0bGU+MTZ4NTAgVUFSVCBEcml2ZXI8L3RpdGxlPgotIUVkcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYwotIUVkcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYwotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9ImZiZGV2Ij4KLSAgICAgPHRpdGxlPkZyYW1lIEJ1ZmZlciBMaWJyYXJ5PC90aXRsZT4KLQotICAgICA8cGFyYT4KLSAgICAgICBUaGUgZnJhbWUgYnVmZmVyIGRyaXZlcnMgZGVwZW5kIGhlYXZpbHkgb24gZm91ciBkYXRhIHN0cnVjdHVyZXMuCi0gICAgICAgVGhlc2Ugc3RydWN0dXJlcyBhcmUgZGVjbGFyZWQgaW4gaW5jbHVkZS9saW51eC9mYi5oLiAgVGhleSBhcmUKLSAgICAgICBmYl9pbmZvLCBmYl92YXJfc2NyZWVuaW5mbywgZmJfZml4X3NjcmVlbmluZm8gYW5kIGZiX21vbm9zcGVjcy4KLSAgICAgICBUaGUgbGFzdCB0aHJlZSBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gYW5kIGZyb20gdXNlcmxhbmQuCi0gICAgIDwvcGFyYT4KLQotICAgICA8cGFyYT4KLSAgICAgICBmYl9pbmZvIGRlZmluZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIHZpZGVvIGNhcmQuCi0gICAgICAgSW5zaWRlIGZiX2luZm8sIHRoZXJlIGV4aXN0cyBhIGZiX29wcyBzdHJ1Y3R1cmUgd2hpY2ggaXMgYQotICAgICAgIGNvbGxlY3Rpb24gb2YgbmVlZGVkIGZ1bmN0aW9ucyB0byBtYWtlIGZiZGV2IGFuZCBmYmNvbiB3b3JrLgotICAgICAgIGZiX2luZm8gaXMgb25seSB2aXNpYmxlIHRvIHRoZSBrZXJuZWwuCi0gICAgIDwvcGFyYT4KLQotICAgICA8cGFyYT4KLSAgICAgICBmYl92YXJfc2NyZWVuaW5mbyBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBmZWF0dXJlcyBvZiBhIHZpZGVvIGNhcmQKLSAgICAgICB0aGF0IGFyZSB1c2VyIGRlZmluZWQuICBXaXRoIGZiX3Zhcl9zY3JlZW5pbmZvLCB0aGluZ3Mgc3VjaCBhcwotICAgICAgIGRlcHRoIGFuZCB0aGUgcmVzb2x1dGlvbiBtYXkgYmUgZGVmaW5lZC4KLSAgICAgPC9wYXJhPgotCi0gICAgIDxwYXJhPgotICAgICAgIFRoZSBuZXh0IHN0cnVjdHVyZSBpcyBmYl9maXhfc2NyZWVuaW5mby4gVGhpcyBkZWZpbmVzIHRoZQotICAgICAgIHByb3BlcnRpZXMgb2YgYSBjYXJkIHRoYXQgYXJlIGNyZWF0ZWQgd2hlbiBhIG1vZGUgaXMgc2V0IGFuZCBjYW4ndAotICAgICAgIGJlIGNoYW5nZWQgb3RoZXJ3aXNlLiAgQSBnb29kIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGUgc3RhcnQgb2YgdGhlCi0gICAgICAgZnJhbWUgYnVmZmVyIG1lbW9yeS4gIFRoaXMgImxvY2tzIiB0aGUgYWRkcmVzcyBvZiB0aGUgZnJhbWUgYnVmZmVyCi0gICAgICAgbWVtb3J5LCBzbyB0aGF0IGl0IGNhbm5vdCBiZSBjaGFuZ2VkIG9yIG1vdmVkLgotICAgICA8L3BhcmE+Ci0KLSAgICAgPHBhcmE+Ci0gICAgICAgVGhlIGxhc3Qgc3RydWN0dXJlIGlzIGZiX21vbm9zcGVjcy4gSW4gdGhlIG9sZCBBUEksIHRoZXJlIHdhcwotICAgICAgIGxpdHRsZSBpbXBvcnRhbmNlIGZvciBmYl9tb25vc3BlY3MuIFRoaXMgYWxsb3dlZCBmb3IgZm9yYmlkZGVuIHRoaW5ncwotICAgICAgIHN1Y2ggYXMgc2V0dGluZyBhIG1vZGUgb2YgODAweDYwMCBvbiBhIGZpeCBmcmVxdWVuY3kgbW9uaXRvci4gV2l0aAotICAgICAgIHRoZSBuZXcgQVBJLCBmYl9tb25vc3BlY3MgcHJldmVudHMgc3VjaCB0aGluZ3MsIGFuZCBpZiB1c2VkCi0gICAgICAgY29ycmVjdGx5LCBjYW4gcHJldmVudCBhIG1vbml0b3IgZnJvbSBiZWluZyBjb29rZWQuICBmYl9tb25vc3BlY3MKLSAgICAgICB3aWxsIG5vdCBiZSB1c2VmdWwgdW50aWwga2VybmVscyAyLjUueC4KLSAgICAgPC9wYXJhPgotCi0gICAgIDxzZWN0MT48dGl0bGU+RnJhbWUgQnVmZmVyIE1lbW9yeTwvdGl0bGU+Ci0hRWRyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYm1lbS5jCi0gICAgIDwvc2VjdDE+Ci08IS0tCi0gICAgIDxzZWN0MT48dGl0bGU+RnJhbWUgQnVmZmVyIENvbnNvbGU8L3RpdGxlPgotWCFFZHJpdmVycy92aWRlby9jb25zb2xlL2ZiY29uLmMKLSAgICAgPC9zZWN0MT4KLS0tPgotICAgICA8c2VjdDE+PHRpdGxlPkZyYW1lIEJ1ZmZlciBDb2xvcm1hcDwvdGl0bGU+Ci0hRWRyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYmNtYXAuYwotICAgICA8L3NlY3QxPgotPCEtLSBGSVhNRToKLSAgZHJpdmVycy92aWRlby9mYmdlbi5jIGhhcyBubyBkb2NzLCB3aGljaCBzdHVmZnMgdXAgdGhlIHNnbWwuICBDb21tZW50Ci0gIG91dCB1bnRpbCBzb21lYm9keSBhZGRzIGRvY3MuICBLQU8KLSAgICAgPHNlY3QxPjx0aXRsZT5GcmFtZSBCdWZmZXIgR2VuZXJpYyBGdW5jdGlvbnM8L3RpdGxlPgotWCFJZHJpdmVycy92aWRlby9mYmdlbi5jCi0gICAgIDwvc2VjdDE+Ci1LQU8gLS0+Ci0gICAgIDxzZWN0MT48dGl0bGU+RnJhbWUgQnVmZmVyIFZpZGVvIE1vZGUgRGF0YWJhc2U8L3RpdGxlPgotIUlkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvbW9kZWRiLmMKLSFFZHJpdmVycy92aWRlby9mYmRldi9jb3JlL21vZGVkYi5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+RnJhbWUgQnVmZmVyIE1hY2ludG9zaCBWaWRlbyBNb2RlIERhdGFiYXNlPC90aXRsZT4KLSFFZHJpdmVycy92aWRlby9mYmRldi9tYWNtb2Rlcy5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+RnJhbWUgQnVmZmVyIEZvbnRzPC90aXRsZT4KLSAgICAgICAgPHBhcmE+Ci0gICAgICAgICAgIFJlZmVyIHRvIHRoZSBmaWxlIGxpYi9mb250cy9mb250cy5jIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgICAgICA8L3BhcmE+Ci08IS0tIEZJWE1FOiBSZW1vdmVkIGZvciBub3cgc2luY2Ugbm8gc3RydWN0dXJlZCBjb21tZW50cyBpbiBzb3VyY2UKLVghSWxpYi9mb250cy9mb250cy5jCi0tLT4KLSAgICAgPC9zZWN0MT4KLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJpbnB1dF9zdWJzeXN0ZW0iPgotICAgICA8dGl0bGU+SW5wdXQgU3Vic3lzdGVtPC90aXRsZT4KLSAgICAgPHNlY3QxPjx0aXRsZT5JbnB1dCBjb3JlPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9pbnB1dC5oCi0hRWRyaXZlcnMvaW5wdXQvaW5wdXQuYwotIUVkcml2ZXJzL2lucHV0L2ZmLWNvcmUuYwotIUVkcml2ZXJzL2lucHV0L2ZmLW1lbWxlc3MuYwotICAgICA8L3NlY3QxPgotICAgICA8c2VjdDE+PHRpdGxlPk11bHRpdG91Y2ggTGlicmFyeTwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvaW5wdXQvbXQuaAotIUVkcml2ZXJzL2lucHV0L2lucHV0LW10LmMKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5Qb2xsZWQgaW5wdXQgZGV2aWNlczwvdGl0bGU+Ci0hSWluY2x1ZGUvbGludXgvaW5wdXQtcG9sbGRldi5oCi0hRWRyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCi0gICAgIDwvc2VjdDE+Ci0gICAgIDxzZWN0MT48dGl0bGU+TWF0cml4IGtleWJvYXJkcy9rZXlwYWRzPC90aXRsZT4KLSFJaW5jbHVkZS9saW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmgKLSAgICAgPC9zZWN0MT4KLSAgICAgPHNlY3QxPjx0aXRsZT5TcGFyc2Uga2V5bWFwIHN1cHBvcnQ8L3RpdGxlPgotIUlpbmNsdWRlL2xpbnV4L2lucHV0L3NwYXJzZS1rZXltYXAuaAotIUVkcml2ZXJzL2lucHV0L3NwYXJzZS1rZXltYXAuYwotICAgICA8L3NlY3QxPgotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9InNwaSI+Ci0gICAgICA8dGl0bGU+U2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIChTUEkpPC90aXRsZT4KLSAgPHBhcmE+Ci0JU1BJIGlzIHRoZSAiU2VyaWFsIFBlcmlwaGVyYWwgSW50ZXJmYWNlIiwgd2lkZWx5IHVzZWQgd2l0aAotCWVtYmVkZGVkIHN5c3RlbXMgYmVjYXVzZSBpdCBpcyBhIHNpbXBsZSBhbmQgZWZmaWNpZW50Ci0JaW50ZXJmYWNlOiAgYmFzaWNhbGx5IGEgbXVsdGlwbGV4ZWQgc2hpZnQgcmVnaXN0ZXIuCi0JSXRzIHRocmVlIHNpZ25hbCB3aXJlcyBob2xkIGEgY2xvY2sgKFNDSywgb2Z0ZW4gaW4gdGhlIHJhbmdlCi0Jb2YgMS0yMCBNSHopLCBhICJNYXN0ZXIgT3V0LCBTbGF2ZSBJbiIgKE1PU0kpIGRhdGEgbGluZSwgYW5kCi0JYSAiTWFzdGVyIEluLCBTbGF2ZSBPdXQiIChNSVNPKSBkYXRhIGxpbmUuCi0JU1BJIGlzIGEgZnVsbCBkdXBsZXggcHJvdG9jb2w7IGZvciBlYWNoIGJpdCBzaGlmdGVkIG91dCB0aGUKLQlNT1NJIGxpbmUgKG9uZSBwZXIgY2xvY2spIGFub3RoZXIgaXMgc2hpZnRlZCBpbiBvbiB0aGUgTUlTTyBsaW5lLgotCVRob3NlIGJpdHMgYXJlIGFzc2VtYmxlZCBpbnRvIHdvcmRzIG9mIHZhcmlvdXMgc2l6ZXMgb24gdGhlCi0Jd2F5IHRvIGFuZCBmcm9tIHN5c3RlbSBtZW1vcnkuCi0JQW4gYWRkaXRpb25hbCBjaGlwc2VsZWN0IGxpbmUgaXMgdXN1YWxseSBhY3RpdmUtbG93IChuQ1MpOwotCWZvdXIgc2lnbmFscyBhcmUgbm9ybWFsbHkgdXNlZCBmb3IgZWFjaCBwZXJpcGhlcmFsLCBwbHVzCi0Jc29tZXRpbWVzIGFuIGludGVycnVwdC4KLSAgPC9wYXJhPgotICA8cGFyYT4KLQlUaGUgU1BJIGJ1cyBmYWNpbGl0aWVzIGxpc3RlZCBoZXJlIHByb3ZpZGUgYSBnZW5lcmFsaXplZAotCWludGVyZmFjZSB0byBkZWNsYXJlIFNQSSBidXNzZXMgYW5kIGRldmljZXMsIG1hbmFnZSB0aGVtCi0JYWNjb3JkaW5nIHRvIHRoZSBzdGFuZGFyZCBMaW51eCBkcml2ZXIgbW9kZWwsIGFuZCBwZXJmb3JtCi0JaW5wdXQvb3V0cHV0IG9wZXJhdGlvbnMuCi0JQXQgdGhpcyB0aW1lLCBvbmx5ICJtYXN0ZXIiIHNpZGUgaW50ZXJmYWNlcyBhcmUgc3VwcG9ydGVkLAotCXdoZXJlIExpbnV4IHRhbGtzIHRvIFNQSSBwZXJpcGhlcmFscyBhbmQgZG9lcyBub3QgaW1wbGVtZW50Ci0Jc3VjaCBhIHBlcmlwaGVyYWwgaXRzZWxmLgotCShJbnRlcmZhY2VzIHRvIHN1cHBvcnQgaW1wbGVtZW50aW5nIFNQSSBzbGF2ZXMgd291bGQKLQluZWNlc3NhcmlseSBsb29rIGRpZmZlcmVudC4pCi0gIDwvcGFyYT4KLSAgPHBhcmE+Ci0JVGhlIHByb2dyYW1taW5nIGludGVyZmFjZSBpcyBzdHJ1Y3R1cmVkIGFyb3VuZCB0d28ga2luZHMgb2YgZHJpdmVyLAotCWFuZCB0d28ga2luZHMgb2YgZGV2aWNlLgotCUEgIkNvbnRyb2xsZXIgRHJpdmVyIiBhYnN0cmFjdHMgdGhlIGNvbnRyb2xsZXIgaGFyZHdhcmUsIHdoaWNoIG1heQotCWJlIGFzIHNpbXBsZSBhcyBhIHNldCBvZiBHUElPIHBpbnMgb3IgYXMgY29tcGxleCBhcyBhIHBhaXIgb2YgRklGT3MKLQljb25uZWN0ZWQgdG8gZHVhbCBETUEgZW5naW5lcyBvbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgU1BJIHNoaWZ0Ci0JcmVnaXN0ZXIgKG1heGltaXppbmcgdGhyb3VnaHB1dCkuICBTdWNoIGRyaXZlcnMgYnJpZGdlIGJldHdlZW4KLQl3aGF0ZXZlciBidXMgdGhleSBzaXQgb24gKG9mdGVuIHRoZSBwbGF0Zm9ybSBidXMpIGFuZCBTUEksIGFuZAotCWV4cG9zZSB0aGUgU1BJIHNpZGUgb2YgdGhlaXIgZGV2aWNlIGFzIGEKLQk8c3RydWN0bmFtZT5zdHJ1Y3Qgc3BpX21hc3Rlcjwvc3RydWN0bmFtZT4uCi0JU1BJIGRldmljZXMgYXJlIGNoaWxkcmVuIG9mIHRoYXQgbWFzdGVyLCByZXByZXNlbnRlZCBhcyBhCi0JPHN0cnVjdG5hbWU+c3RydWN0IHNwaV9kZXZpY2U8L3N0cnVjdG5hbWU+IGFuZCBtYW51ZmFjdHVyZWQgZnJvbQotCTxzdHJ1Y3RuYW1lPnN0cnVjdCBzcGlfYm9hcmRfaW5mbzwvc3RydWN0bmFtZT4gZGVzY3JpcHRvcnMgd2hpY2gKLQlhcmUgdXN1YWxseSBwcm92aWRlZCBieSBib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBjb2RlLgotCUEgPHN0cnVjdG5hbWU+c3RydWN0IHNwaV9kcml2ZXI8L3N0cnVjdG5hbWU+IGlzIGNhbGxlZCBhCi0JIlByb3RvY29sIERyaXZlciIsIGFuZCBpcyBib3VuZCB0byBhIHNwaV9kZXZpY2UgdXNpbmcgbm9ybWFsCi0JZHJpdmVyIG1vZGVsIGNhbGxzLgotICA8L3BhcmE+Ci0gIDxwYXJhPgotCVRoZSBJL08gbW9kZWwgaXMgYSBzZXQgb2YgcXVldWVkIG1lc3NhZ2VzLiAgUHJvdG9jb2wgZHJpdmVycwotCXN1Ym1pdCBvbmUgb3IgbW9yZSA8c3RydWN0bmFtZT5zdHJ1Y3Qgc3BpX21lc3NhZ2U8L3N0cnVjdG5hbWU+Ci0Jb2JqZWN0cywgd2hpY2ggYXJlIHByb2Nlc3NlZCBhbmQgY29tcGxldGVkIGFzeW5jaHJvbm91c2x5LgotCShUaGVyZSBhcmUgc3luY2hyb25vdXMgd3JhcHBlcnMsIGhvd2V2ZXIuKSAgTWVzc2FnZXMgYXJlCi0JYnVpbHQgZnJvbSBvbmUgb3IgbW9yZSA8c3RydWN0bmFtZT5zdHJ1Y3Qgc3BpX3RyYW5zZmVyPC9zdHJ1Y3RuYW1lPgotCW9iamVjdHMsIGVhY2ggb2Ygd2hpY2ggd3JhcHMgYSBmdWxsIGR1cGxleCBTUEkgdHJhbnNmZXIuCi0JQSB2YXJpZXR5IG9mIHByb3RvY29sIHR3ZWFraW5nIG9wdGlvbnMgYXJlIG5lZWRlZCwgYmVjYXVzZQotCWRpZmZlcmVudCBjaGlwcyBhZG9wdCB2ZXJ5IGRpZmZlcmVudCBwb2xpY2llcyBmb3IgaG93IHRoZXkKLQl1c2UgdGhlIGJpdHMgdHJhbnNmZXJyZWQgd2l0aCBTUEkuCi0gIDwvcGFyYT4KLSFJaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKLSFGZHJpdmVycy9zcGkvc3BpLmMgc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8KLSFFZHJpdmVycy9zcGkvc3BpLmMKLSAgPC9jaGFwdGVyPgotCi0gIDxjaGFwdGVyIGlkPSJpMmMiPgotICAgICA8dGl0bGU+STxzdXBlcnNjcmlwdD4yPC9zdXBlcnNjcmlwdD5DIGFuZCBTTUJ1cyBTdWJzeXN0ZW08L3RpdGxlPgotCi0gICAgIDxwYXJhPgotCUk8c3VwZXJzY3JpcHQ+Mjwvc3VwZXJzY3JpcHQ+QyAob3Igd2l0aG91dCBmYW5jeSB0eXBvZ3JhcGh5LCAiSTJDIikKLQlpcyBhbiBhY3JvbnltIGZvciB0aGUgIkludGVyLUlDIiBidXMsIGEgc2ltcGxlIGJ1cyBwcm90b2NvbCB3aGljaCBpcwotCXdpZGVseSB1c2VkIHdoZXJlIGxvdyBkYXRhIHJhdGUgY29tbXVuaWNhdGlvbnMgc3VmZmljZS4KLQlTaW5jZSBpdCdzIGFsc28gYSBsaWNlbnNlZCB0cmFkZW1hcmssIHNvbWUgdmVuZG9ycyB1c2UgYW5vdGhlcgotCW5hbWUgKHN1Y2ggYXMgIlR3by1XaXJlIEludGVyZmFjZSIsIFRXSSkgZm9yIHRoZSBzYW1lIGJ1cy4KLQlJMkMgb25seSBuZWVkcyB0d28gc2lnbmFscyAoU0NMIGZvciBjbG9jaywgU0RBIGZvciBkYXRhKSwgY29uc2VydmluZwotCWJvYXJkIHJlYWwgZXN0YXRlIGFuZCBtaW5pbWl6aW5nIHNpZ25hbCBxdWFsaXR5IGlzc3Vlcy4KLQlNb3N0IEkyQyBkZXZpY2VzIHVzZSBzZXZlbiBiaXQgYWRkcmVzc2VzLCBhbmQgYnVzIHNwZWVkcyBvZiB1cAotCXRvIDQwMCBrSHo7IHRoZXJlJ3MgYSBoaWdoIHNwZWVkIGV4dGVuc2lvbiAoMy40IE1IeikgdGhhdCdzIG5vdCB5ZXQKLQlmb3VuZCB3aWRlIHVzZS4KLQlJMkMgaXMgYSBtdWx0aS1tYXN0ZXIgYnVzOyBvcGVuIGRyYWluIHNpZ25hbGluZyBpcyB1c2VkIHRvCi0JYXJiaXRyYXRlIGJldHdlZW4gbWFzdGVycywgYXMgd2VsbCBhcyB0byBoYW5kc2hha2UgYW5kIHRvCi0Jc3luY2hyb25pemUgY2xvY2tzIGZyb20gc2xvd2VyIGNsaWVudHMuCi0gICAgIDwvcGFyYT4KLQotICAgICA8cGFyYT4KLQlUaGUgTGludXggSTJDIHByb2dyYW1taW5nIGludGVyZmFjZXMgc3VwcG9ydCBvbmx5IHRoZSBtYXN0ZXIKLQlzaWRlIG9mIGJ1cyBpbnRlcmFjdGlvbnMsIG5vdCB0aGUgc2xhdmUgc2lkZS4KLQlUaGUgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlIGlzIHN0cnVjdHVyZWQgYXJvdW5kIHR3byBraW5kcyBvZiBkcml2ZXIsCi0JYW5kIHR3byBraW5kcyBvZiBkZXZpY2UuCi0JQW4gSTJDICJBZGFwdGVyIERyaXZlciIgYWJzdHJhY3RzIHRoZSBjb250cm9sbGVyIGhhcmR3YXJlOyBpdCBiaW5kcwotCXRvIGEgcGh5c2ljYWwgZGV2aWNlIChwZXJoYXBzIGEgUENJIGRldmljZSBvciBwbGF0Zm9ybV9kZXZpY2UpIGFuZAotCWV4cG9zZXMgYSA8c3RydWN0bmFtZT5zdHJ1Y3QgaTJjX2FkYXB0ZXI8L3N0cnVjdG5hbWU+IHJlcHJlc2VudGluZwotCWVhY2ggSTJDIGJ1cyBzZWdtZW50IGl0IG1hbmFnZXMuCi0JT24gZWFjaCBJMkMgYnVzIHNlZ21lbnQgd2lsbCBiZSBJMkMgZGV2aWNlcyByZXByZXNlbnRlZCBieSBhCi0JPHN0cnVjdG5hbWU+c3RydWN0IGkyY19jbGllbnQ8L3N0cnVjdG5hbWU+LiAgVGhvc2UgZGV2aWNlcyB3aWxsCi0JYmUgYm91bmQgdG8gYSA8c3RydWN0bmFtZT5zdHJ1Y3QgaTJjX2RyaXZlcjwvc3RydWN0bmFtZT4sCi0Jd2hpY2ggc2hvdWxkIGZvbGxvdyB0aGUgc3RhbmRhcmQgTGludXggZHJpdmVyIG1vZGVsLgotCShBdCB0aGlzIHdyaXRpbmcsIGEgbGVnYWN5IG1vZGVsIGlzIG1vcmUgd2lkZWx5IHVzZWQuKQotCVRoZXJlIGFyZSBmdW5jdGlvbnMgdG8gcGVyZm9ybSB2YXJpb3VzIEkyQyBwcm90b2NvbCBvcGVyYXRpb25zOyBhdAotCXRoaXMgd3JpdGluZyBhbGwgc3VjaCBmdW5jdGlvbnMgYXJlIHVzYWJsZSBvbmx5IGZyb20gdGFzayBjb250ZXh0LgotICAgICA8L3BhcmE+Ci0KLSAgICAgPHBhcmE+Ci0JVGhlIFN5c3RlbSBNYW5hZ2VtZW50IEJ1cyAoU01CdXMpIGlzIGEgc2libGluZyBwcm90b2NvbC4gIE1vc3QgU01CdXMKLQlzeXN0ZW1zIGFyZSBhbHNvIEkyQyBjb25mb3JtYW50LiAgVGhlIGVsZWN0cmljYWwgY29uc3RyYWludHMgYXJlCi0JdGlnaHRlciBmb3IgU01CdXMsIGFuZCBpdCBzdGFuZGFyZGl6ZXMgcGFydGljdWxhciBwcm90b2NvbCBtZXNzYWdlcwotCWFuZCBpZGlvbXMuICBDb250cm9sbGVycyB0aGF0IHN1cHBvcnQgSTJDIGNhbiBhbHNvIHN1cHBvcnQgbW9zdAotCVNNQnVzIG9wZXJhdGlvbnMsIGJ1dCBTTUJ1cyBjb250cm9sbGVycyBkb24ndCBzdXBwb3J0IGFsbCB0aGUgcHJvdG9jb2wKLQlvcHRpb25zIHRoYXQgYW4gSTJDIGNvbnRyb2xsZXIgd2lsbC4KLQlUaGVyZSBhcmUgZnVuY3Rpb25zIHRvIHBlcmZvcm0gdmFyaW91cyBTTUJ1cyBwcm90b2NvbCBvcGVyYXRpb25zLAotCWVpdGhlciB1c2luZyBJMkMgcHJpbWl0aXZlcyBvciBieSBpc3N1aW5nIFNNQnVzIGNvbW1hbmRzIHRvCi0JaTJjX2FkYXB0ZXIgZGV2aWNlcyB3aGljaCBkb24ndCBzdXBwb3J0IHRob3NlIEkyQyBvcGVyYXRpb25zLgotICAgICA8L3BhcmE+Ci0KLSFJaW5jbHVkZS9saW51eC9pMmMuaAotIUZkcml2ZXJzL2kyYy9pMmMtYm9hcmRpbmZvLmMgaTJjX3JlZ2lzdGVyX2JvYXJkX2luZm8KLSFFZHJpdmVycy9pMmMvaTJjLWNvcmUuYwotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9ImhzaSI+Ci0gICAgIDx0aXRsZT5IaWdoIFNwZWVkIFN5bmNocm9ub3VzIFNlcmlhbCBJbnRlcmZhY2UgKEhTSSk8L3RpdGxlPgotCi0gICAgIDxwYXJhPgotCUhpZ2ggU3BlZWQgU3luY2hyb25vdXMgU2VyaWFsIEludGVyZmFjZSAoSFNJKSBpcyBhCi0Jc2VyaWFsIGludGVyZmFjZSBtYWlubHkgdXNlZCBmb3IgY29ubmVjdGluZyBhcHBsaWNhdGlvbgotCWVuZ2luZXMgKEFQRSkgd2l0aCBjZWxsdWxhciBtb2RlbSBlbmdpbmVzIChDTVQpIGluIGNlbGx1bGFyCi0JaGFuZHNldHMuCi0KLQlIU0kgcHJvdmlkZXMgbXVsdGlwbGV4aW5nIGZvciB1cCB0byAxNiBsb2dpY2FsIGNoYW5uZWxzLAotCWxvdy1sYXRlbmN5IGFuZCBmdWxsIGR1cGxleCBjb21tdW5pY2F0aW9uLgotICAgICA8L3BhcmE+Ci0KLSFJaW5jbHVkZS9saW51eC9oc2kvaHNpLmgKLSFFZHJpdmVycy9oc2kvaHNpX2NvcmUuYwotICA8L2NoYXB0ZXI+Ci0KLSAgPGNoYXB0ZXIgaWQ9InB3bSI+Ci0gICAgPHRpdGxlPlB1bHNlLVdpZHRoIE1vZHVsYXRpb24gKFBXTSk8L3RpdGxlPgotICAgIDxwYXJhPgotICAgICAgUHVsc2Utd2lkdGggbW9kdWxhdGlvbiBpcyBhIG1vZHVsYXRpb24gdGVjaG5pcXVlIHByaW1hcmlseSB1c2VkIHRvCi0gICAgICBjb250cm9sIHBvd2VyIHN1cHBsaWVkIHRvIGVsZWN0cmljYWwgZGV2aWNlcy4KLSAgICA8L3BhcmE+Ci0gICAgPHBhcmE+Ci0gICAgICBUaGUgUFdNIGZyYW1ld29yayBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBmb3IgcHJvdmlkZXJzIGFuZCBjb25zdW1lcnMKLSAgICAgIG9mIFBXTSBzaWduYWxzLiBBIGNvbnRyb2xsZXIgdGhhdCBwcm92aWRlcyBvbmUgb3IgbW9yZSBQV00gc2lnbmFscyBpcwotICAgICAgcmVnaXN0ZXJlZCBhcyA8c3RydWN0bmFtZT5zdHJ1Y3QgcHdtX2NoaXA8L3N0cnVjdG5hbWU+LiBQcm92aWRlcnMgYXJlCi0gICAgICBleHBlY3RlZCB0byBlbWJlZCB0aGlzIHN0cnVjdHVyZSBpbiBhIGRyaXZlci1zcGVjaWZpYyBzdHJ1Y3R1cmUuIFRoaXMKLSAgICAgIHN0cnVjdHVyZSBjb250YWlucyBmaWVsZHMgdGhhdCBkZXNjcmliZSBhIHBhcnRpY3VsYXIgY2hpcC4KLSAgICA8L3BhcmE+Ci0gICAgPHBhcmE+Ci0gICAgICBBIGNoaXAgZXhwb3NlcyBvbmUgb3IgbW9yZSBQV00gc2lnbmFsIHNvdXJjZXMsIGVhY2ggb2Ygd2hpY2ggZXhwb3NlZAotICAgICAgYXMgYSA8c3RydWN0bmFtZT5zdHJ1Y3QgcHdtX2RldmljZTwvc3RydWN0bmFtZT4uIE9wZXJhdGlvbnMgY2FuIGJlCi0gICAgICBwZXJmb3JtZWQgb24gUFdNIGRldmljZXMgdG8gY29udHJvbCB0aGUgcGVyaW9kLCBkdXR5IGN5Y2xlLCBwb2xhcml0eQotICAgICAgYW5kIGFjdGl2ZSBzdGF0ZSBvZiB0aGUgc2lnbmFsLgotICAgIDwvcGFyYT4KLSAgICA8cGFyYT4KLSAgICAgIE5vdGUgdGhhdCBQV00gZGV2aWNlcyBhcmUgZXhjbHVzaXZlIHJlc291cmNlczogdGhleSBjYW4gYWx3YXlzIG9ubHkgYmUKLSAgICAgIHVzZWQgYnkgb25lIGNvbnN1bWVyIGF0IGEgdGltZS4KLSAgICA8L3BhcmE+Ci0hSWluY2x1ZGUvbGludXgvcHdtLmgKLSFFZHJpdmVycy9wd20vY29yZS5jCi0gIDwvY2hhcHRlcj4KLQotPC9ib29rPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9IT1dUTyBiL0RvY3VtZW50YXRpb24vSE9XVE8KaW5kZXggMWYzNDVkYS4uNWYwNDIzNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9IT1dUTworKysgYi9Eb2N1bWVudGF0aW9uL0hPV1RPCkBAIC0xLDUgKzEsNSBAQAogSE9XVE8gZG8gTGludXgga2VybmVsIGRldmVsb3BtZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBUaGlzIGlzIHRoZSBiZS1hbGwsIGVuZC1hbGwgZG9jdW1lbnQgb24gdGhpcyB0b3BpYy4gIEl0IGNvbnRhaW5zCiBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGJlY29tZSBhIExpbnV4IGtlcm5lbCBkZXZlbG9wZXIgYW5kIGhvdyB0byBsZWFybgpAQCAtMjgsNiArMjgsNyBAQAogeW91IHBsYW4gdG8gZG8gbG93LWxldmVsIGRldmVsb3BtZW50IGZvciB0aGF0IGFyY2hpdGVjdHVyZS4gIFRob3VnaCB0aGV5CiBhcmUgbm90IGEgZ29vZCBzdWJzdGl0dXRlIGZvciBhIHNvbGlkIEMgZWR1Y2F0aW9uIGFuZC9vciB5ZWFycyBvZgogZXhwZXJpZW5jZSwgdGhlIGZvbGxvd2luZyBib29rcyBhcmUgZ29vZCBmb3IsIGlmIGFueXRoaW5nLCByZWZlcmVuY2U6CisKICAtICJUaGUgQyBQcm9ncmFtbWluZyBMYW5ndWFnZSIgYnkgS2VybmlnaGFuIGFuZCBSaXRjaGllIFtQcmVudGljZSBIYWxsXQogIC0gIlByYWN0aWNhbCBDIFByb2dyYW1taW5nIiBieSBTdGV2ZSBPdWFsbGluZSBbTydSZWlsbHldCiAgLSAiQzogIEEgUmVmZXJlbmNlIE1hbnVhbCIgYnkgSGFyYmlzb24gYW5kIFN0ZWVsZSBbUHJlbnRpY2UgSGFsbF0KQEAgLTY0LDcgKzY1LDggQEAKIHRoZWlyIHN0YXRlbWVudHMgb24gbGVnYWwgbWF0dGVycy4KIAogRm9yIGNvbW1vbiBxdWVzdGlvbnMgYW5kIGFuc3dlcnMgYWJvdXQgdGhlIEdQTCwgcGxlYXNlIHNlZToKLQlodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCisKKwlodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogCiAKIERvY3VtZW50YXRpb24KQEAgLTgyLDk2ICs4NCwxMTggQEAKIAogSGVyZSBpcyBhIGxpc3Qgb2YgZmlsZXMgdGhhdCBhcmUgaW4gdGhlIGtlcm5lbCBzb3VyY2UgdHJlZSB0aGF0IGFyZQogcmVxdWlyZWQgcmVhZGluZzoKKwogICBSRUFETUUKICAgICBUaGlzIGZpbGUgZ2l2ZXMgYSBzaG9ydCBiYWNrZ3JvdW5kIG9uIHRoZSBMaW51eCBrZXJuZWwgYW5kIGRlc2NyaWJlcwogICAgIHdoYXQgaXMgbmVjZXNzYXJ5IHRvIGRvIHRvIGNvbmZpZ3VyZSBhbmQgYnVpbGQgdGhlIGtlcm5lbC4gIFBlb3BsZQogICAgIHdobyBhcmUgbmV3IHRvIHRoZSBrZXJuZWwgc2hvdWxkIHN0YXJ0IGhlcmUuCiAKLSAgRG9jdW1lbnRhdGlvbi9DaGFuZ2VzCisgIDpyZWY6YERvY3VtZW50YXRpb24vQ2hhbmdlcyA8Y2hhbmdlcz5gCiAgICAgVGhpcyBmaWxlIGdpdmVzIGEgbGlzdCBvZiB0aGUgbWluaW11bSBsZXZlbHMgb2YgdmFyaW91cyBzb2Z0d2FyZQogICAgIHBhY2thZ2VzIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byBidWlsZCBhbmQgcnVuIHRoZSBrZXJuZWwKICAgICBzdWNjZXNzZnVsbHkuCiAKLSAgRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQorICA6cmVmOmBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIDxjb2RpbmdzdHlsZT5gCiAgICAgVGhpcyBkZXNjcmliZXMgdGhlIExpbnV4IGtlcm5lbCBjb2Rpbmcgc3R5bGUsIGFuZCBzb21lIG9mIHRoZQogICAgIHJhdGlvbmFsZSBiZWhpbmQgaXQuIEFsbCBuZXcgY29kZSBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlCiAgICAgZ3VpZGVsaW5lcyBpbiB0aGlzIGRvY3VtZW50LiBNb3N0IG1haW50YWluZXJzIHdpbGwgb25seSBhY2NlcHQKICAgICBwYXRjaGVzIGlmIHRoZXNlIHJ1bGVzIGFyZSBmb2xsb3dlZCwgYW5kIG1hbnkgcGVvcGxlIHdpbGwgb25seQogICAgIHJldmlldyBjb2RlIGlmIGl0IGlzIGluIHRoZSBwcm9wZXIgc3R5bGUuCiAKLSAgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwotICBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCisgIDpyZWY6YERvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMgPHN1Ym1pdHRpbmdwYXRjaGVzPmAgYW5kIDpyZWY6YERvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMgPHN1Ym1pdHRpbmdkcml2ZXJzPmAKICAgICBUaGVzZSBmaWxlcyBkZXNjcmliZSBpbiBleHBsaWNpdCBkZXRhaWwgaG93IHRvIHN1Y2Nlc3NmdWxseSBjcmVhdGUKICAgICBhbmQgc2VuZCBhIHBhdGNoLCBpbmNsdWRpbmcgKGJ1dCBub3QgbGltaXRlZCB0byk6CisKICAgICAgICAtIEVtYWlsIGNvbnRlbnRzCiAgICAgICAgLSBFbWFpbCBmb3JtYXQKICAgICAgICAtIFdobyB0byBzZW5kIGl0IHRvCisKICAgICBGb2xsb3dpbmcgdGhlc2UgcnVsZXMgd2lsbCBub3QgZ3VhcmFudGVlIHN1Y2Nlc3MgKGFzIGFsbCBwYXRjaGVzIGFyZQogICAgIHN1YmplY3QgdG8gc2NydXRpbnkgZm9yIGNvbnRlbnQgYW5kIHN0eWxlKSwgYnV0IG5vdCBmb2xsb3dpbmcgdGhlbQogICAgIHdpbGwgYWxtb3N0IGFsd2F5cyBwcmV2ZW50IGl0LgogCiAgICAgT3RoZXIgZXhjZWxsZW50IGRlc2NyaXB0aW9ucyBvZiBob3cgdG8gY3JlYXRlIHBhdGNoZXMgcHJvcGVybHkgYXJlOgorCiAJIlRoZSBQZXJmZWN0IFBhdGNoIgotCQlodHRwOi8vd3d3Lm96bGFicy5vcmcvfmFrcG0vc3R1ZmYvdHBwLnR4dAorCQlodHRwczovL3d3dy5vemxhYnMub3JnL35ha3BtL3N0dWZmL3RwcC50eHQKKwogCSJMaW51eCBrZXJuZWwgcGF0Y2ggc3VibWlzc2lvbiBmb3JtYXQiCiAJCWh0dHA6Ly9saW51eC55eXoudXMvcGF0Y2gtZm9ybWF0Lmh0bWwKIAotICBEb2N1bWVudGF0aW9uL3N0YWJsZV9hcGlfbm9uc2Vuc2UudHh0CisgIDpyZWY6YERvY3VtZW50YXRpb24vc3RhYmxlX2FwaV9ub25zZW5zZS50eHQgPHN0YWJsZV9hcGlfbm9uc2Vuc2U+YAogICAgIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhlIGNvbnNjaW91cyBkZWNpc2lvbiB0bwogICAgIG5vdCBoYXZlIGEgc3RhYmxlIEFQSSB3aXRoaW4gdGhlIGtlcm5lbCwgaW5jbHVkaW5nIHRoaW5ncyBsaWtlOgorCiAgICAgICAtIFN1YnN5c3RlbSBzaGltLWxheWVycyAoZm9yIGNvbXBhdGliaWxpdHk/KQogICAgICAgLSBEcml2ZXIgcG9ydGFiaWxpdHkgYmV0d2VlbiBPcGVyYXRpbmcgU3lzdGVtcy4KICAgICAgIC0gTWl0aWdhdGluZyByYXBpZCBjaGFuZ2Ugd2l0aGluIHRoZSBrZXJuZWwgc291cmNlIHRyZWUgKG9yCiAJcHJldmVudGluZyByYXBpZCBjaGFuZ2UpCisKICAgICBUaGlzIGRvY3VtZW50IGlzIGNydWNpYWwgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIExpbnV4IGRldmVsb3BtZW50CiAgICAgcGhpbG9zb3BoeSBhbmQgaXMgdmVyeSBpbXBvcnRhbnQgZm9yIHBlb3BsZSBtb3ZpbmcgdG8gTGludXggZnJvbQogICAgIGRldmVsb3BtZW50IG9uIG90aGVyIE9wZXJhdGluZyBTeXN0ZW1zLgogCi0gIERvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzCisgIDpyZWY6YERvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzIDxzZWN1cml0eWJ1Z3M+YAogICAgIElmIHlvdSBmZWVsIHlvdSBoYXZlIGZvdW5kIGEgc2VjdXJpdHkgcHJvYmxlbSBpbiB0aGUgTGludXgga2VybmVsLAogICAgIHBsZWFzZSBmb2xsb3cgdGhlIHN0ZXBzIGluIHRoaXMgZG9jdW1lbnQgdG8gaGVscCBub3RpZnkgdGhlIGtlcm5lbAogICAgIGRldmVsb3BlcnMsIGFuZCBoZWxwIHNvbHZlIHRoZSBpc3N1ZS4KIAotICBEb2N1bWVudGF0aW9uL01hbmFnZW1lbnRTdHlsZQorICA6cmVmOmBEb2N1bWVudGF0aW9uL01hbmFnZW1lbnRTdHlsZSA8bWFuYWdlbWVudHN0eWxlPmAKICAgICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgTGludXgga2VybmVsIG1haW50YWluZXJzIG9wZXJhdGUgYW5kIHRoZQogICAgIHNoYXJlZCBldGhvcyBiZWhpbmQgdGhlaXIgbWV0aG9kb2xvZ2llcy4gIFRoaXMgaXMgaW1wb3J0YW50IHJlYWRpbmcKICAgICBmb3IgYW55b25lIG5ldyB0byBrZXJuZWwgZGV2ZWxvcG1lbnQgKG9yIGFueW9uZSBzaW1wbHkgY3VyaW91cyBhYm91dAogICAgIGl0KSwgYXMgaXQgcmVzb2x2ZXMgYSBsb3Qgb2YgY29tbW9uIG1pc2NvbmNlcHRpb25zIGFuZCBjb25mdXNpb24KICAgICBhYm91dCB0aGUgdW5pcXVlIGJlaGF2aW9yIG9mIGtlcm5lbCBtYWludGFpbmVycy4KIAotICBEb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0CisgIDpyZWY6YERvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQgPHN0YWJsZV9rZXJuZWxfcnVsZXM+YAogICAgIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHJ1bGVzIG9uIGhvdyB0aGUgc3RhYmxlIGtlcm5lbCByZWxlYXNlcwogICAgIGhhcHBlbiwgYW5kIHdoYXQgdG8gZG8gaWYgeW91IHdhbnQgdG8gZ2V0IGEgY2hhbmdlIGludG8gb25lIG9mIHRoZXNlCiAgICAgcmVsZWFzZXMuCiAKLSAgRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jcy50eHQKKyAgOnJlZjpgRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jcy50eHQgPGtlcm5lbF9kb2NzPmAKICAgICBBIGxpc3Qgb2YgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiB0aGF0IHBlcnRhaW5zIHRvIGtlcm5lbAogICAgIGRldmVsb3BtZW50LiAgUGxlYXNlIGNvbnN1bHQgdGhpcyBsaXN0IGlmIHlvdSBkbyBub3QgZmluZCB3aGF0IHlvdQogICAgIGFyZSBsb29raW5nIGZvciB3aXRoaW4gdGhlIGluLWtlcm5lbCBkb2N1bWVudGF0aW9uLgogCi0gIERvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQKKyAgOnJlZjpgRG9jdW1lbnRhdGlvbi9hcHBseWluZy1wYXRjaGVzLnR4dCA8YXBwbHlpbmdfcGF0Y2hlcz5gCiAgICAgQSBnb29kIGludHJvZHVjdGlvbiBkZXNjcmliaW5nIGV4YWN0bHkgd2hhdCBhIHBhdGNoIGlzIGFuZCBob3cgdG8KICAgICBhcHBseSBpdCB0byB0aGUgZGlmZmVyZW50IGRldmVsb3BtZW50IGJyYW5jaGVzIG9mIHRoZSBrZXJuZWwuCiAKIFRoZSBrZXJuZWwgYWxzbyBoYXMgYSBsYXJnZSBudW1iZXIgb2YgZG9jdW1lbnRzIHRoYXQgY2FuIGJlCi1hdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBzb3VyY2UgY29kZSBpdHNlbGYuICBUaGlzIGluY2x1ZGVzIGEKK2F1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlIHNvdXJjZSBjb2RlIGl0c2VsZiBvciBmcm9tCitSZVN0cnVjdHVyZWRUZXh0IG1hcmt1cHMgKFJlU1QpLCBsaWtlIHRoaXMgb25lLiBUaGlzIGluY2x1ZGVzIGEKIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGluLWtlcm5lbCBBUEksIGFuZCBydWxlcyBvbiBob3cgdG8gaGFuZGxlCi1sb2NraW5nIHByb3Blcmx5LiAgVGhlIGRvY3VtZW50cyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlCi1Eb2N1bWVudGF0aW9uL0RvY0Jvb2svIGRpcmVjdG9yeSBhbmQgY2FuIGJlIGdlbmVyYXRlZCBhcyBQREYsCi1Qb3N0c2NyaXB0LCBIVE1MLCBhbmQgbWFuIHBhZ2VzIGJ5IHJ1bm5pbmc6Citsb2NraW5nIHByb3Blcmx5LgorCitBbGwgc3VjaCBkb2N1bWVudHMgY2FuIGJlIGdlbmVyYXRlZCBhcyBQREYgb3IgSFRNTCBieSBydW5uaW5nOjoKKwogCW1ha2UgcGRmZG9jcwotCW1ha2UgcHNkb2NzCiAJbWFrZSBodG1sZG9jcwotCW1ha2UgbWFuZG9jcworCiByZXNwZWN0aXZlbHkgZnJvbSB0aGUgbWFpbiBrZXJuZWwgc291cmNlIGRpcmVjdG9yeS4KIAorVGhlIGRvY3VtZW50cyB0aGF0IHVzZXMgUmVTVCBtYXJrdXAgd2lsbCBiZSBnZW5lcmF0ZWQgYXQgRG9jdW1lbnRhdGlvbi9vdXRwdXQuCitUaGV5IGNhbiBhbHNvIGJlIGdlbmVyYXRlZCBvbiBMYVRlWCBhbmQgZVB1YiBmb3JtYXRzIHdpdGg6OgorCisJbWFrZSBsYXRleGRvY3MKKwltYWtlIGVwdWJkb2NzCisKK0N1cnJlbnRseSwgdGhlcmUgYXJlIHNvbWUgZG9jdW1lbnRzIHdyaXR0ZW4gb24gRG9jQm9vayB0aGF0IGFyZSBpbgordGhlIHByb2Nlc3Mgb2YgY29udmVyc2lvbiB0byBSZVNULiBTdWNoIGRvY3VtZW50cyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlCitEb2N1bWVudGF0aW9uL0RvY0Jvb2svIGRpcmVjdG9yeSBhbmQgY2FuIGJlIGdlbmVyYXRlZCBhbHNvIGFzCitQb3N0c2NyaXB0IG9yIG1hbiBwYWdlcyBieSBydW5uaW5nOjoKKworCW1ha2UgcHNkb2NzCisJbWFrZSBtYW5kb2NzCiAKIEJlY29taW5nIEEgS2VybmVsIERldmVsb3BlcgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElmIHlvdSBkbyBub3Qga25vdyBhbnl0aGluZyBhYm91dCBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQsIHlvdSBzaG91bGQKIGxvb2sgYXQgdGhlIExpbnV4IEtlcm5lbE5ld2JpZXMgcHJvamVjdDoKLQlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcKKworCWh0dHBzOi8va2VybmVsbmV3Ymllcy5vcmcKKwogSXQgY29uc2lzdHMgb2YgYSBoZWxwZnVsIG1haWxpbmcgbGlzdCB3aGVyZSB5b3UgY2FuIGFzayBhbG1vc3QgYW55IHR5cGUKIG9mIGJhc2ljIGtlcm5lbCBkZXZlbG9wbWVudCBxdWVzdGlvbiAobWFrZSBzdXJlIHRvIHNlYXJjaCB0aGUgYXJjaGl2ZXMKIGZpcnN0LCBiZWZvcmUgYXNraW5nIHNvbWV0aGluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gYW5zd2VyZWQgaW4gdGhlCkBAIC0xODcsNyArMjExLDkgQEAKIElmIHlvdSBkbyBub3Qga25vdyB3aGVyZSB5b3Ugd2FudCB0byBzdGFydCwgYnV0IHlvdSB3YW50IHRvIGxvb2sgZm9yCiBzb21lIHRhc2sgdG8gc3RhcnQgZG9pbmcgdG8gam9pbiBpbnRvIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LAogZ28gdG8gdGhlIExpbnV4IEtlcm5lbCBKYW5pdG9yJ3MgcHJvamVjdDoKLQlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvS2VybmVsSmFuaXRvcnMKKworCWh0dHBzOi8va2VybmVsbmV3Ymllcy5vcmcvS2VybmVsSmFuaXRvcnMKKwogSXQgaXMgYSBncmVhdCBwbGFjZSB0byBzdGFydC4gIEl0IGRlc2NyaWJlcyBhIGxpc3Qgb2YgcmVsYXRpdmVseSBzaW1wbGUKIHByb2JsZW1zIHRoYXQgbmVlZCB0byBiZSBjbGVhbmVkIHVwIGFuZCBmaXhlZCB3aXRoaW4gdGhlIExpbnV4IGtlcm5lbAogc291cmNlIHRyZWUuICBXb3JraW5nIHdpdGggdGhlIGRldmVsb3BlcnMgaW4gY2hhcmdlIG9mIHRoaXMgcHJvamVjdCwgeW91CkBAIC0xOTksNyArMjI1LDggQEAKIHRyZWUsIGJ1dCBuZWVkIHNvbWUgaGVscCBnZXR0aW5nIGl0IGluIHRoZSBwcm9wZXIgZm9ybSwgdGhlCiBrZXJuZWwtbWVudG9ycyBwcm9qZWN0IHdhcyBjcmVhdGVkIHRvIGhlbHAgeW91IG91dCB3aXRoIHRoaXMuICBJdCBpcyBhCiBtYWlsaW5nIGxpc3QsIGFuZCBjYW4gYmUgZm91bmQgYXQ6Ci0JaHR0cDovL3NlbGVuaWMuY29tL21haWxtYW4vbGlzdGluZm8va2VybmVsLW1lbnRvcnMKKworCWh0dHBzOi8vc2VsZW5pYy5jb20vbWFpbG1hbi9saXN0aW5mby9rZXJuZWwtbWVudG9ycwogCiBCZWZvcmUgbWFraW5nIGFueSBhY3R1YWwgbW9kaWZpY2F0aW9ucyB0byB0aGUgTGludXgga2VybmVsIGNvZGUsIGl0IGlzCiBpbXBlcmF0aXZlIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBjb2RlIGluIHF1ZXN0aW9uIHdvcmtzLiAgRm9yIHRoaXMKQEAgLTIwOSw2ICsyMzYsNyBAQAogQ3Jvc3MtUmVmZXJlbmNlIHByb2plY3QsIHdoaWNoIGlzIGFibGUgdG8gcHJlc2VudCBzb3VyY2UgY29kZSBpbiBhCiBzZWxmLXJlZmVyZW50aWFsLCBpbmRleGVkIHdlYnBhZ2UgZm9ybWF0LiBBbiBleGNlbGxlbnQgdXAtdG8tZGF0ZQogcmVwb3NpdG9yeSBvZiB0aGUga2VybmVsIGNvZGUgbWF5IGJlIGZvdW5kIGF0OgorCiAJaHR0cDovL2x4ci5mcmVlLWVsZWN0cm9ucy5jb20vCiAKIApAQCAtMjE4LDYgKzI0Niw3IEBACiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBjdXJyZW50bHkgY29uc2lzdHMgb2YgYSBmZXcgZGlmZmVyZW50CiBtYWluIGtlcm5lbCAiYnJhbmNoZXMiIGFuZCBsb3RzIG9mIGRpZmZlcmVudCBzdWJzeXN0ZW0tc3BlY2lmaWMga2VybmVsCiBicmFuY2hlcy4gIFRoZXNlIGRpZmZlcmVudCBicmFuY2hlcyBhcmU6CisKICAgLSBtYWluIDQueCBrZXJuZWwgdHJlZQogICAtIDQueC55IC1zdGFibGUga2VybmVsIHRyZWUKICAgLSA0LnggLWdpdCBrZXJuZWwgcGF0Y2hlcwpAQCAtMjI3LDE0ICsyNTYsMTUgQEAKIDQueCBrZXJuZWwgdHJlZQogLS0tLS0tLS0tLS0tLS0tLS0KIDQueCBrZXJuZWxzIGFyZSBtYWludGFpbmVkIGJ5IExpbnVzIFRvcnZhbGRzLCBhbmQgY2FuIGJlIGZvdW5kIG9uCi1rZXJuZWwub3JnIGluIHRoZSBwdWIvbGludXgva2VybmVsL3Y0LngvIGRpcmVjdG9yeS4gIEl0cyBkZXZlbG9wbWVudAoraHR0cHM6Ly9rZXJuZWwub3JnIGluIHRoZSBwdWIvbGludXgva2VybmVsL3Y0LngvIGRpcmVjdG9yeS4gIEl0cyBkZXZlbG9wbWVudAogcHJvY2VzcyBpcyBhcyBmb2xsb3dzOgorCiAgIC0gQXMgc29vbiBhcyBhIG5ldyBrZXJuZWwgaXMgcmVsZWFzZWQgYSB0d28gd2Vla3Mgd2luZG93IGlzIG9wZW4sCiAgICAgZHVyaW5nIHRoaXMgcGVyaW9kIG9mIHRpbWUgbWFpbnRhaW5lcnMgY2FuIHN1Ym1pdCBiaWcgZGlmZnMgdG8KICAgICBMaW51cywgdXN1YWxseSB0aGUgcGF0Y2hlcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGluY2x1ZGVkIGluIHRoZQogICAgIC1uZXh0IGtlcm5lbCBmb3IgYSBmZXcgd2Vla3MuICBUaGUgcHJlZmVycmVkIHdheSB0byBzdWJtaXQgYmlnIGNoYW5nZXMKICAgICBpcyB1c2luZyBnaXQgKHRoZSBrZXJuZWwncyBzb3VyY2UgbWFuYWdlbWVudCB0b29sLCBtb3JlIGluZm9ybWF0aW9uCi0gICAgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9naXQtc2NtLmNvbS8pIGJ1dCBwbGFpbiBwYXRjaGVzIGFyZSBhbHNvIGp1c3QKKyAgICBjYW4gYmUgZm91bmQgYXQgaHR0cHM6Ly9naXQtc2NtLmNvbS8pIGJ1dCBwbGFpbiBwYXRjaGVzIGFyZSBhbHNvIGp1c3QKICAgICBmaW5lLgogICAtIEFmdGVyIHR3byB3ZWVrcyBhIC1yYzEga2VybmVsIGlzIHJlbGVhc2VkIGl0IGlzIG5vdyBwb3NzaWJsZSB0byBwdXNoCiAgICAgb25seSBwYXRjaGVzIHRoYXQgZG8gbm90IGluY2x1ZGUgbmV3IGZlYXR1cmVzIHRoYXQgY291bGQgYWZmZWN0IHRoZQpAQCAtMjUzLDkgKzI4MywxMCBAQAogCiBJdCBpcyB3b3J0aCBtZW50aW9uaW5nIHdoYXQgQW5kcmV3IE1vcnRvbiB3cm90ZSBvbiB0aGUgbGludXgta2VybmVsCiBtYWlsaW5nIGxpc3QgYWJvdXQga2VybmVsIHJlbGVhc2VzOgotCSJOb2JvZHkga25vd3Mgd2hlbiBhIGtlcm5lbCB3aWxsIGJlIHJlbGVhc2VkLCBiZWNhdXNlIGl0J3MKKworCSoiTm9ib2R5IGtub3dzIHdoZW4gYSBrZXJuZWwgd2lsbCBiZSByZWxlYXNlZCwgYmVjYXVzZSBpdCdzCiAJcmVsZWFzZWQgYWNjb3JkaW5nIHRvIHBlcmNlaXZlZCBidWcgc3RhdHVzLCBub3QgYWNjb3JkaW5nIHRvIGEKLQlwcmVjb25jZWl2ZWQgdGltZWxpbmUuIgorCXByZWNvbmNlaXZlZCB0aW1lbGluZS4iKgogCiA0LngueSAtc3RhYmxlIGtlcm5lbCB0cmVlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMDEsNyArMzMyLDcgQEAKIE1vc3Qgb2YgdGhlc2UgcmVwb3NpdG9yaWVzIGFyZSBnaXQgdHJlZXMsIGJ1dCB0aGVyZSBhcmUgYWxzbyBvdGhlciBTQ01zCiBpbiB1c2UsIG9yIHBhdGNoIHF1ZXVlcyBiZWluZyBwdWJsaXNoZWQgYXMgcXVpbHQgc2VyaWVzLiAgQWRkcmVzc2VzIG9mCiB0aGVzZSBzdWJzeXN0ZW0gcmVwb3NpdG9yaWVzIGFyZSBsaXN0ZWQgaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUuICBNYW55Ci1vZiB0aGVtIGNhbiBiZSBicm93c2VkIGF0IGh0dHA6Ly9naXQua2VybmVsLm9yZy8uCitvZiB0aGVtIGNhbiBiZSBicm93c2VkIGF0IGh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvLgogCiBCZWZvcmUgYSBwcm9wb3NlZCBwYXRjaCBpcyBjb21taXR0ZWQgdG8gc3VjaCBhIHN1YnN5c3RlbSB0cmVlLCBpdCBpcwogc3ViamVjdCB0byByZXZpZXcgd2hpY2ggcHJpbWFyaWx5IGhhcHBlbnMgb24gbWFpbGluZyBsaXN0cyAoc2VlIHRoZQpAQCAtMzEwLDcgKzM0MSw3IEBACiBpbnRlcmZhY2Ugd2hpY2ggc2hvd3MgcGF0Y2ggcG9zdGluZ3MsIGFueSBjb21tZW50cyBvbiBhIHBhdGNoIG9yCiByZXZpc2lvbnMgdG8gaXQsIGFuZCBtYWludGFpbmVycyBjYW4gbWFyayBwYXRjaGVzIGFzIHVuZGVyIHJldmlldywKIGFjY2VwdGVkLCBvciByZWplY3RlZC4gIE1vc3Qgb2YgdGhlc2UgcGF0Y2h3b3JrIHNpdGVzIGFyZSBsaXN0ZWQgYXQKLWh0dHA6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy8uCitodHRwczovL3BhdGNod29yay5rZXJuZWwub3JnLy4KIAogNC54IC1uZXh0IGtlcm5lbCB0cmVlIGZvciBpbnRlZ3JhdGlvbiB0ZXN0cwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzE4LDcgKzM0OSw4IEBACiB0cmVlLCB0aGV5IG5lZWQgdG8gYmUgaW50ZWdyYXRpb24tdGVzdGVkLiAgRm9yIHRoaXMgcHVycG9zZSwgYSBzcGVjaWFsCiB0ZXN0aW5nIHJlcG9zaXRvcnkgZXhpc3RzIGludG8gd2hpY2ggdmlydHVhbGx5IGFsbCBzdWJzeXN0ZW0gdHJlZXMgYXJlCiBwdWxsZWQgb24gYW4gYWxtb3N0IGRhaWx5IGJhc2lzOgotCWh0dHA6Ly9naXQua2VybmVsLm9yZy8/cD1saW51eC9rZXJuZWwvZ2l0L25leHQvbGludXgtbmV4dC5naXQKKworCWh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC9uZXh0L2xpbnV4LW5leHQuZ2l0CiAKIFRoaXMgd2F5LCB0aGUgLW5leHQga2VybmVsIGdpdmVzIGEgc3VtbWFyeSBvdXRsb29rIG9udG8gd2hhdCB3aWxsIGJlCiBleHBlY3RlZCB0byBnbyBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwgYXQgdGhlIG5leHQgbWVyZ2UgcGVyaW9kLgpAQCAtMzI4LDEwICszNjAsMTEgQEAKIEJ1ZyBSZXBvcnRpbmcKIC0tLS0tLS0tLS0tLS0KIAotYnVnemlsbGEua2VybmVsLm9yZyBpcyB3aGVyZSB0aGUgTGludXgga2VybmVsIGRldmVsb3BlcnMgdHJhY2sga2VybmVsCitodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcgaXMgd2hlcmUgdGhlIExpbnV4IGtlcm5lbCBkZXZlbG9wZXJzIHRyYWNrIGtlcm5lbAogYnVncy4gIFVzZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHJlcG9ydCBhbGwgYnVncyB0aGF0IHRoZXkgZmluZCBpbiB0aGlzCiB0b29sLiAgRm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSB0aGUga2VybmVsIGJ1Z3ppbGxhLCBwbGVhc2Ugc2VlOgotCWh0dHA6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3BhZ2UuY2dpP2lkPWZhcS5odG1sCisKKwlodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvcGFnZS5jZ2k/aWQ9ZmFxLmh0bWwKIAogVGhlIGZpbGUgUkVQT1JUSU5HLUJVR1MgaW4gdGhlIG1haW4ga2VybmVsIHNvdXJjZSBkaXJlY3RvcnkgaGFzIGEgZ29vZAogdGVtcGxhdGUgZm9yIGhvdyB0byByZXBvcnQgYSBwb3NzaWJsZSBrZXJuZWwgYnVnLCBhbmQgZGV0YWlscyB3aGF0IGtpbmQKQEAgLTM0OSwxMyArMzgyLDE0IEBACiBidWdzIGlzIG9uZSBvZiB0aGUgYmVzdCB3YXlzIHRvIGdldCBtZXJpdHMgYW1vbmcgb3RoZXIgZGV2ZWxvcGVycywgYmVjYXVzZQogbm90IG1hbnkgcGVvcGxlIGxpa2Ugd2FzdGluZyB0aW1lIGZpeGluZyBvdGhlciBwZW9wbGUncyBidWdzLgogCi1UbyB3b3JrIGluIHRoZSBhbHJlYWR5IHJlcG9ydGVkIGJ1ZyByZXBvcnRzLCBnbyB0byBodHRwOi8vYnVnemlsbGEua2VybmVsLm9yZy4KK1RvIHdvcmsgaW4gdGhlIGFscmVhZHkgcmVwb3J0ZWQgYnVnIHJlcG9ydHMsIGdvIHRvIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy4KIElmIHlvdSB3YW50IHRvIGJlIGFkdmlzZWQgb2YgdGhlIGZ1dHVyZSBidWcgcmVwb3J0cywgeW91IGNhbiBzdWJzY3JpYmUgdG8gdGhlCiBidWdtZS1uZXcgbWFpbGluZyBsaXN0IChvbmx5IG5ldyBidWcgcmVwb3J0cyBhcmUgbWFpbGVkIGhlcmUpIG9yIHRvIHRoZQogYnVnbWUtamFuaXRvciBtYWlsaW5nIGxpc3QgKGV2ZXJ5IGNoYW5nZSBpbiB0aGUgYnVnemlsbGEgaXMgbWFpbGVkIGhlcmUpCiAKLQlodHRwOi8vbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1uZXcKLQlodHRwOi8vbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1qYW5pdG9ycworCWh0dHBzOi8vbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1uZXcKKworCWh0dHBzOi8vbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9idWdtZS1qYW5pdG9ycwogCiAKIApAQCAtMzY1LDEwICszOTksMTQgQEAKIEFzIHNvbWUgb2YgdGhlIGFib3ZlIGRvY3VtZW50cyBkZXNjcmliZSwgdGhlIG1ham9yaXR5IG9mIHRoZSBjb3JlIGtlcm5lbAogZGV2ZWxvcGVycyBwYXJ0aWNpcGF0ZSBvbiB0aGUgTGludXggS2VybmVsIE1haWxpbmcgbGlzdC4gIERldGFpbHMgb24gaG93CiB0byBzdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIGZyb20gdGhlIGxpc3QgY2FuIGJlIGZvdW5kIGF0OgorCiAJaHR0cDovL3ZnZXIua2VybmVsLm9yZy92Z2VyLWxpc3RzLmh0bWwjbGludXgta2VybmVsCisKIFRoZXJlIGFyZSBhcmNoaXZlcyBvZiB0aGUgbWFpbGluZyBsaXN0IG9uIHRoZSB3ZWIgaW4gbWFueSBkaWZmZXJlbnQKIHBsYWNlcy4gIFVzZSBhIHNlYXJjaCBlbmdpbmUgdG8gZmluZCB0aGVzZSBhcmNoaXZlcy4gIEZvciBleGFtcGxlOgorCiAJaHR0cDovL2Rpci5nbWFuZS5vcmcvZ21hbmUubGludXgua2VybmVsCisKIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBzZWFyY2ggdGhlIGFyY2hpdmVzIGFib3V0IHRoZSB0b3BpYwogeW91IHdhbnQgdG8gYnJpbmcgdXAsIGJlZm9yZSB5b3UgcG9zdCBpdCB0byB0aGUgbGlzdC4gQSBsb3Qgb2YgdGhpbmdzCiBhbHJlYWR5IGRpc2N1c3NlZCBpbiBkZXRhaWwgYXJlIG9ubHkgcmVjb3JkZWQgYXQgdGhlIG1haWxpbmcgbGlzdApAQCAtMzgxLDExICs0MTksMTMgQEAKIAogTWFueSBvZiB0aGUgbGlzdHMgYXJlIGhvc3RlZCBvbiBrZXJuZWwub3JnLiBJbmZvcm1hdGlvbiBvbiB0aGVtIGNhbiBiZQogZm91bmQgYXQ6CisKIAlodHRwOi8vdmdlci5rZXJuZWwub3JnL3ZnZXItbGlzdHMuaHRtbAogCiBQbGVhc2UgcmVtZW1iZXIgdG8gZm9sbG93IGdvb2QgYmVoYXZpb3JhbCBoYWJpdHMgd2hlbiB1c2luZyB0aGUgbGlzdHMuCiBUaG91Z2ggYSBiaXQgY2hlZXN5LCB0aGUgZm9sbG93aW5nIFVSTCBoYXMgc29tZSBzaW1wbGUgZ3VpZGVsaW5lcyBmb3IKIGludGVyYWN0aW5nIHdpdGggdGhlIGxpc3QgKG9yIGFueSBsaXN0KToKKwogCWh0dHA6Ly93d3cuYWxiaW9uLmNvbS9uZXRpcXVldHRlLwogCiBJZiBtdWx0aXBsZSBwZW9wbGUgcmVzcG9uZCB0byB5b3VyIG1haWwsIHRoZSBDQzogbGlzdCBvZiByZWNpcGllbnRzIG1heQpAQCAtNDAwLDEzICs0NDAsMTQgQEAKIHdyaXRpbmcgYXQgdGhlIHRvcCBvZiB0aGUgbWFpbC4KIAogSWYgeW91IGFkZCBwYXRjaGVzIHRvIHlvdXIgbWFpbCwgbWFrZSBzdXJlIHRoZXkgYXJlIHBsYWluIHJlYWRhYmxlIHRleHQKLWFzIHN0YXRlZCBpbiBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzLiBLZXJuZWwgZGV2ZWxvcGVycyBkb24ndAotd2FudCB0byBkZWFsIHdpdGggYXR0YWNobWVudHMgb3IgY29tcHJlc3NlZCBwYXRjaGVzOyB0aGV5IG1heSB3YW50Ci10byBjb21tZW50IG9uIGluZGl2aWR1YWwgbGluZXMgb2YgeW91ciBwYXRjaCwgd2hpY2ggd29ya3Mgb25seSB0aGF0IHdheS4KLU1ha2Ugc3VyZSB5b3UgdXNlIGEgbWFpbCBwcm9ncmFtIHRoYXQgZG9lcyBub3QgbWFuZ2xlIHNwYWNlcyBhbmQgdGFiCi1jaGFyYWN0ZXJzLiBBIGdvb2QgZmlyc3QgdGVzdCBpcyB0byBzZW5kIHRoZSBtYWlsIHRvIHlvdXJzZWxmIGFuZCB0cnkKLXRvIGFwcGx5IHlvdXIgb3duIHBhdGNoIGJ5IHlvdXJzZWxmLiBJZiB0aGF0IGRvZXNuJ3Qgd29yaywgZ2V0IHlvdXIKLW1haWwgcHJvZ3JhbSBmaXhlZCBvciBjaGFuZ2UgaXQgdW50aWwgaXQgd29ya3MuCithcyBzdGF0ZWQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcy4KK0tlcm5lbCBkZXZlbG9wZXJzIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoCithdHRhY2htZW50cyBvciBjb21wcmVzc2VkIHBhdGNoZXM7IHRoZXkgbWF5IHdhbnQgdG8gY29tbWVudCBvbgoraW5kaXZpZHVhbCBsaW5lcyBvZiB5b3VyIHBhdGNoLCB3aGljaCB3b3JrcyBvbmx5IHRoYXQgd2F5LiBNYWtlIHN1cmUgeW91Cit1c2UgYSBtYWlsIHByb2dyYW0gdGhhdCBkb2VzIG5vdCBtYW5nbGUgc3BhY2VzIGFuZCB0YWIgY2hhcmFjdGVycy4gQQorZ29vZCBmaXJzdCB0ZXN0IGlzIHRvIHNlbmQgdGhlIG1haWwgdG8geW91cnNlbGYgYW5kIHRyeSB0byBhcHBseSB5b3VyCitvd24gcGF0Y2ggYnkgeW91cnNlbGYuIElmIHRoYXQgZG9lc24ndCB3b3JrLCBnZXQgeW91ciBtYWlsIHByb2dyYW0gZml4ZWQKK29yIGNoYW5nZSBpdCB1bnRpbCBpdCB3b3Jrcy4KIAogQWJvdmUgYWxsLCBwbGVhc2UgcmVtZW1iZXIgdG8gc2hvdyByZXNwZWN0IHRvIG90aGVyIHN1YnNjcmliZXJzLgogCkBAIC00MTgsNiArNDU5LDcgQEAKIHRoZXJlIGlzLiAgV2hlbiB5b3Ugc3VibWl0IGEgcGF0Y2ggZm9yIGFjY2VwdGFuY2UsIGl0IHdpbGwgYmUgcmV2aWV3ZWQKIG9uIGl0cyB0ZWNobmljYWwgbWVyaXRzIGFuZCB0aG9zZSBhbG9uZS4gIFNvLCB3aGF0IHNob3VsZCB5b3UgYmUKIGV4cGVjdGluZz8KKwogICAtIGNyaXRpY2lzbQogICAtIGNvbW1lbnRzCiAgIC0gcmVxdWVzdHMgZm9yIGNoYW5nZQpAQCAtNDMyLDYgKzQ3NCw3IEBACiBhZ2Fpbiwgc29tZXRpbWVzIHRoaW5ncyBnZXQgbG9zdCBpbiB0aGUgaHVnZSB2b2x1bWUuCiAKIFdoYXQgc2hvdWxkIHlvdSBub3QgZG8/CisKICAgLSBleHBlY3QgeW91ciBwYXRjaCB0byBiZSBhY2NlcHRlZCB3aXRob3V0IHF1ZXN0aW9uCiAgIC0gYmVjb21lIGRlZmVuc2l2ZQogICAtIGlnbm9yZSBjb21tZW50cwpAQCAtNDQ1LDggKzQ4OCw4IEBACiB0b3dhcmQgYSBzb2x1dGlvbiB0aGF0IGlzIHJpZ2h0LgogCiBJdCBpcyBub3JtYWwgdGhhdCB0aGUgYW5zd2VycyB0byB5b3VyIGZpcnN0IHBhdGNoIG1pZ2h0IHNpbXBseSBiZSBhIGxpc3QKLW9mIGEgZG96ZW4gdGhpbmdzIHlvdSBzaG91bGQgY29ycmVjdC4gIFRoaXMgZG9lcyBfbm90XyBpbXBseSB0aGF0IHlvdXIKLXBhdGNoIHdpbGwgbm90IGJlIGFjY2VwdGVkLCBhbmQgaXQgaXMgX25vdF8gbWVhbnQgYWdhaW5zdCB5b3UKK29mIGEgZG96ZW4gdGhpbmdzIHlvdSBzaG91bGQgY29ycmVjdC4gIFRoaXMgZG9lcyAqKm5vdCoqIGltcGx5IHRoYXQgeW91cgorcGF0Y2ggd2lsbCBub3QgYmUgYWNjZXB0ZWQsIGFuZCBpdCBpcyAqKm5vdCoqIG1lYW50IGFnYWluc3QgeW91CiBwZXJzb25hbGx5LiAgU2ltcGx5IGNvcnJlY3QgYWxsIGlzc3VlcyByYWlzZWQgYWdhaW5zdCB5b3VyIHBhdGNoIGFuZAogcmVzZW5kIGl0LgogCkBAIC00NTcsNyArNTAwLDkgQEAKIFRoZSBrZXJuZWwgY29tbXVuaXR5IHdvcmtzIGRpZmZlcmVudGx5IHRoYW4gbW9zdCB0cmFkaXRpb25hbCBjb3Jwb3JhdGUKIGRldmVsb3BtZW50IGVudmlyb25tZW50cy4gIEhlcmUgYXJlIGEgbGlzdCBvZiB0aGluZ3MgdGhhdCB5b3UgY2FuIHRyeSB0bwogZG8gdG8gYXZvaWQgcHJvYmxlbXM6CisKICAgR29vZCB0aGluZ3MgdG8gc2F5IHJlZ2FyZGluZyB5b3VyIHByb3Bvc2VkIGNoYW5nZXM6CisKICAgICAtICJUaGlzIHNvbHZlcyBtdWx0aXBsZSBwcm9ibGVtcy4iCiAgICAgLSAiVGhpcyBkZWxldGVzIDIwMDAgbGluZXMgb2YgY29kZS4iCiAgICAgLSAiSGVyZSBpcyBhIHBhdGNoIHRoYXQgZXhwbGFpbnMgd2hhdCBJIGFtIHRyeWluZyB0byBkZXNjcmliZS4iCkBAIC00NjYsNiArNTExLDcgQEAKICAgICAtICJUaGlzIGluY3JlYXNlcyBwZXJmb3JtYW5jZSBvbiB0eXBpY2FsIG1hY2hpbmVzLi4uIgogCiAgIEJhZCB0aGluZ3MgeW91IHNob3VsZCBhdm9pZCBzYXlpbmc6CisKICAgICAtICJXZSBkaWQgaXQgdGhpcyB3YXkgaW4gQUlYL3B0eC9Tb2xhcmlzLCBzbyB0aGVyZWZvcmUgaXQgbXVzdCBiZQogICAgICAgZ29vZC4uLiIKICAgICAtICJJJ3ZlIGJlaW5nIGRvaW5nIHRoaXMgZm9yIDIwIHllYXJzLCBzby4uLiIKQEAgLTUyNywxNyArNTczLDE4IEBACiAgICBhbmQgc2ltcGxpZnkgKG9yIHNpbXBseSByZS1vcmRlcikgcGF0Y2hlcyBiZWZvcmUgc3VibWl0dGluZyB0aGVtLgogCiBIZXJlIGlzIGFuIGFuYWxvZ3kgZnJvbSBrZXJuZWwgZGV2ZWxvcGVyIEFsIFZpcm86Ci0JIlRoaW5rIG9mIGEgdGVhY2hlciBncmFkaW5nIGhvbWV3b3JrIGZyb20gYSBtYXRoIHN0dWRlbnQuICBUaGUKKworCSoiVGhpbmsgb2YgYSB0ZWFjaGVyIGdyYWRpbmcgaG9tZXdvcmsgZnJvbSBhIG1hdGggc3R1ZGVudC4gIFRoZQogCXRlYWNoZXIgZG9lcyBub3Qgd2FudCB0byBzZWUgdGhlIHN0dWRlbnQncyB0cmlhbHMgYW5kIGVycm9ycwogCWJlZm9yZSB0aGV5IGNhbWUgdXAgd2l0aCB0aGUgc29sdXRpb24uIFRoZXkgd2FudCB0byBzZWUgdGhlCiAJY2xlYW5lc3QsIG1vc3QgZWxlZ2FudCBhbnN3ZXIuICBBIGdvb2Qgc3R1ZGVudCBrbm93cyB0aGlzLCBhbmQKIAl3b3VsZCBuZXZlciBzdWJtaXQgaGVyIGludGVybWVkaWF0ZSB3b3JrIGJlZm9yZSB0aGUgZmluYWwKLQlzb2x1dGlvbi4iCisJc29sdXRpb24uKgogCi0JVGhlIHNhbWUgaXMgdHJ1ZSBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQuIFRoZSBtYWludGFpbmVycyBhbmQKKwkqVGhlIHNhbWUgaXMgdHJ1ZSBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQuIFRoZSBtYWludGFpbmVycyBhbmQKIAlyZXZpZXdlcnMgZG8gbm90IHdhbnQgdG8gc2VlIHRoZSB0aG91Z2h0IHByb2Nlc3MgYmVoaW5kIHRoZQogCXNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtIG9uZSBpcyBzb2x2aW5nLiBUaGV5IHdhbnQgdG8gc2VlIGEKLQlzaW1wbGUgYW5kIGVsZWdhbnQgc29sdXRpb24uIgorCXNpbXBsZSBhbmQgZWxlZ2FudCBzb2x1dGlvbi4iKgogCiBJdCBtYXkgYmUgY2hhbGxlbmdpbmcgdG8ga2VlcCB0aGUgYmFsYW5jZSBiZXR3ZWVuIHByZXNlbnRpbmcgYW4gZWxlZ2FudAogc29sdXRpb24gYW5kIHdvcmtpbmcgdG9nZXRoZXIgd2l0aCB0aGUgY29tbXVuaXR5IGFuZCBkaXNjdXNzaW5nIHlvdXIKQEAgLTU2NSw2ICs2MTIsNyBAQAogdGhlIHRleHQgaW4geW91ciBlbWFpbC4gIFRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZWNvbWUgdGhlIENoYW5nZUxvZwogaW5mb3JtYXRpb24gZm9yIHRoZSBwYXRjaCwgYW5kIHdpbGwgYmUgcHJlc2VydmVkIGZvciBldmVyeW9uZSB0byBzZWUgZm9yCiBhbGwgdGltZS4gIEl0IHNob3VsZCBkZXNjcmliZSB0aGUgcGF0Y2ggY29tcGxldGVseSwgY29udGFpbmluZzoKKwogICAtIHdoeSB0aGUgY2hhbmdlIGlzIG5lY2Vzc2FyeQogICAtIHRoZSBvdmVyYWxsIGRlc2lnbiBhcHByb2FjaCBpbiB0aGUgcGF0Y2gKICAgLSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCkBAIC01NzIsMTIgKzYyMCwxMSBAQAogCiBGb3IgbW9yZSBkZXRhaWxzIG9uIHdoYXQgdGhpcyBzaG91bGQgYWxsIGxvb2sgbGlrZSwgcGxlYXNlIHNlZSB0aGUKIENoYW5nZUxvZyBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudDoKKwogICAiVGhlIFBlcmZlY3QgUGF0Y2giCiAgICAgICBodHRwOi8vd3d3Lm96bGFicy5vcmcvfmFrcG0vc3R1ZmYvdHBwLnR4dAogCiAKLQotCiBBbGwgb2YgdGhlc2UgdGhpbmdzIGFyZSBzb21ldGltZXMgdmVyeSBoYXJkIHRvIGRvLiBJdCBjYW4gdGFrZSB5ZWFycyB0bwogcGVyZmVjdCB0aGVzZSBwcmFjdGljZXMgKGlmIGF0IGFsbCkuIEl0J3MgYSBjb250aW51b3VzIHByb2Nlc3Mgb2YKIGltcHJvdmVtZW50IHRoYXQgcmVxdWlyZXMgYSBsb3Qgb2YgcGF0aWVuY2UgYW5kIGRldGVybWluYXRpb24uIEJ1dApAQCAtNTg4LDggKzYzNSw5IEBACiAKIAogLS0tLS0tLS0tLQorCiBUaGFua3MgdG8gUGFvbG8gQ2lhcnJvY2NoaSB3aG8gYWxsb3dlZCB0aGUgIkRldmVsb3BtZW50IFByb2Nlc3MiCi0oaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvOTQzODYvKSBzZWN0aW9uCisoaHR0cHM6Ly9sd24ubmV0L0FydGljbGVzLzk0Mzg2Lykgc2VjdGlvbgogdG8gYmUgYmFzZWQgb24gdGV4dCBoZSBoYWQgd3JpdHRlbiwgYW5kIHRvIFJhbmR5IER1bmxhcCBhbmQgR2Vycml0CiBIdWl6ZW5nYSBmb3Igc29tZSBvZiB0aGUgbGlzdCBvZiB0aGluZ3MgeW91IHNob3VsZCBhbmQgc2hvdWxkIG5vdCBzYXkuCiBBbHNvIHRoYW5rcyB0byBQYXQgTW9jaGVsLCBIYW5uYSBMaW5kZXIsIFJhbmR5IER1bmxhcCwgS2F5IFNpZXZlcnMsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL01ha2VmaWxlLnNwaGlueCBiL0RvY3VtZW50YXRpb24vTWFrZWZpbGUuc3BoaW54CmluZGV4IDg1N2YxZTIuLjkyZGVlYTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vTWFrZWZpbGUuc3BoaW54CisrKyBiL0RvY3VtZW50YXRpb24vTWFrZWZpbGUuc3BoaW54CkBAIC01LDYgKzUsOSBAQAogIyBZb3UgY2FuIHNldCB0aGVzZSB2YXJpYWJsZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgogU1BISU5YQlVJTEQgICA9IHNwaGlueC1idWlsZAogU1BISU5YT1BUUyAgICA9CitTUEhJTlhESVJTICAgID0gLgorX1NQSElOWERJUlMgICA9ICQocGF0c3Vic3QgJChzcmN0cmVlKS9Eb2N1bWVudGF0aW9uLyUvY29uZi5weSwlLCQod2lsZGNhcmQgJChzcmN0cmVlKS9Eb2N1bWVudGF0aW9uLyovY29uZi5weSkpCitTUEhJTlhfQ09ORiAgID0gY29uZi5weQogUEFQRVIgICAgICAgICA9CiBCVUlMRERJUiAgICAgID0gJChvYmopL291dHB1dAogCkBAIC0yNSwzOCArMjgsNjIgQEAKIAogZWxzZSAjIEhBVkVfU1BISU5YCiAKLSMgVXNlci1mcmllbmRseSBjaGVjayBmb3IgcnN0MnBkZgotSEFWRV9SU1QyUERGIDo9ICQoc2hlbGwgaWYgcHl0aG9uIC1jICJpbXBvcnQgcnN0MnBkZiIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gMTsgZWxzZSBlY2hvIDA7IGZpKQorIyBVc2VyLWZyaWVuZGx5IGNoZWNrIGZvciBwZGZsYXRleAorSEFWRV9QREZMQVRFWCA6PSAkKHNoZWxsIGlmIHdoaWNoIHhlbGF0ZXggPi9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gMTsgZWxzZSBlY2hvIDA7IGZpKQogCiAjIEludGVybmFsIHZhcmlhYmxlcy4KIFBBUEVST1BUX2E0ICAgICA9IC1EIGxhdGV4X3BhcGVyX3NpemU9YTQKIFBBUEVST1BUX2xldHRlciA9IC1EIGxhdGV4X3BhcGVyX3NpemU9bGV0dGVyCiBLRVJORUxET0MgICAgICAgPSAkKHNyY3RyZWUpL3NjcmlwdHMva2VybmVsLWRvYwogS0VSTkVMRE9DX0NPTkYgID0gLUQga2VybmVsZG9jX3NyY3RyZWU9JChzcmN0cmVlKSAtRCBrZXJuZWxkb2NfYmluPSQoS0VSTkVMRE9DKQotQUxMU1BISU5YT1BUUyAgID0gLUQgdmVyc2lvbj0kKEtFUk5FTFZFUlNJT04pIC1EIHJlbGVhc2U9JChLRVJORUxSRUxFQVNFKSAtZCAkKEJVSUxERElSKS8uZG9jdHJlZXMgJChLRVJORUxET0NfQ09ORikgJChQQVBFUk9QVF8kKFBBUEVSKSkgLWMgJChzcmN0cmVlKS8kKHNyYykgJChTUEhJTlhPUFRTKSAkKHNyY3RyZWUpLyQoc3JjKQorQUxMU1BISU5YT1BUUyAgID0gICQoS0VSTkVMRE9DX0NPTkYpICQoUEFQRVJPUFRfJChQQVBFUikpICQoU1BISU5YT1BUUykKICMgdGhlIGkxOG4gYnVpbGRlciBjYW5ub3Qgc2hhcmUgdGhlIGVudmlyb25tZW50IGFuZCBkb2N0cmVlcyB3aXRoIHRoZSBvdGhlcnMKIEkxOE5TUEhJTlhPUFRTICA9ICQoUEFQRVJPUFRfJChQQVBFUikpICQoU1BISU5YT1BUUykgLgogCi1xdWlldF9jbWRfc3BoaW54ID0gU1BISU5YICAkQAotICAgICAgY21kX3NwaGlueCA9IEJVSUxERElSPSQoQlVJTERESVIpICQoU1BISU5YQlVJTEQpIC1iICQyICQoQUxMU1BISU5YT1BUUykgJChCVUlMRERJUikvJDIKKyMgY29tbWFuZHM7IHRoZSAnY21kJyBmcm9tIHNjcmlwdHMvS2J1aWxkLmluY2x1ZGUgaXMgbm90ICpsb29wYWJsZSoKK2xvb3BfY21kID0gJChlY2hvLWNtZCkgJChjbWRfJCgxKSkKKworIyAkMiBzcGhpbnggYnVpbGRlciBlLmcuICJodG1sIgorIyAkMyBuYW1lIG9mIHRoZSBidWlsZCBzdWJmb2xkZXIgLyBlLmcuICJtZWRpYSIsIHVzZWQgYXM6CisjICAgICogZGVzdCBmb2xkZXIgcmVsYXRpdmUgdG8gJChCVUlMRERJUikgYW5kCisjICAgICogY2FjaGUgZm9sZGVyIHJlbGF0aXZlIHRvICQoQlVJTERESVIpLy5kb2N0cmVlcworIyAkNCBkZXN0IHN1YmZvbGRlciBlLmcuICJtYW4iIGZvciBtYW4gcGFnZXMgYXQgbWVkaWEvbWFuCisjICQ1IHJlU1Qgc291cmNlIGZvbGRlciByZWxhdGl2ZSB0byAkKHNyY3RyZWUpLyQoc3JjKSwKKyMgICAgZS5nLiAibWVkaWEiIGZvciB0aGUgbGludXgtdHYgYm9vay1zZXQgYXQgLi9Eb2N1bWVudGF0aW9uL21lZGlhCisKK3F1aWV0X2NtZF9zcGhpbnggPSBTUEhJTlggICRAIC0tPiBmaWxlOi8vJChhYnNwYXRoICQoQlVJTERESVIpLyQzLyQ0KTsKKyAgICAgIGNtZF9zcGhpbnggPSAkKE1BS0UpIEJVSUxERElSPSQoYWJzcGF0aCAkKEJVSUxERElSKSkgJChidWlsZCk9RG9jdW1lbnRhdGlvbi9tZWRpYSBhbGw7XAorCUJVSUxERElSPSQoYWJzcGF0aCAkKEJVSUxERElSKSkgU1BISU5YX0NPTkY9JChhYnNwYXRoICQoc3JjdHJlZSkvJChzcmMpLyQ1LyQoU1BISU5YX0NPTkYpKSBcCisJJChTUEhJTlhCVUlMRCkgXAorCS1iICQyIFwKKwktYyAkKGFic3BhdGggJChzcmN0cmVlKS8kKHNyYykpIFwKKwktZCAkKGFic3BhdGggJChCVUlMRERJUikvLmRvY3RyZWVzLyQzKSBcCisJLUQgdmVyc2lvbj0kKEtFUk5FTFZFUlNJT04pIC1EIHJlbGVhc2U9JChLRVJORUxSRUxFQVNFKSBcCisJJChBTExTUEhJTlhPUFRTKSBcCisJJChhYnNwYXRoICQoc3JjdHJlZSkvJChzcmMpLyQ1KSBcCisJJChhYnNwYXRoICQoQlVJTERESVIpLyQzLyQ0KTsKIAogaHRtbGRvY3M6Ci0JJChNQUtFKSBCVUlMRERJUj0kKEJVSUxERElSKSAtZiAkKHNyY3RyZWUpL0RvY3VtZW50YXRpb24vbWVkaWEvTWFrZWZpbGUgJEAKLQkkKGNhbGwgY21kLHNwaGlueCxodG1sKQorCUAkKGZvcmVhY2ggdmFyLCQoU1BISU5YRElSUyksJChjYWxsIGxvb3BfY21kLHNwaGlueCxodG1sLCQodmFyKSwsJCh2YXIpKSkKIAotcGRmZG9jczoKLWlmZXEgKCQoSEFWRV9SU1QyUERGKSwwKQotCSQod2FybmluZyBUaGUgUHl0aG9uICdyc3QycGRmJyBtb2R1bGUgd2FzIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHlvdSBoYXZlIHRoZSBtb2R1bGUgaW5zdGFsbGVkIHRvIHByb2R1Y2UgUERGIG91dHB1dC4pCitsYXRleGRvY3M6CitpZmVxICgkKEhBVkVfUERGTEFURVgpLDApCisJJCh3YXJuaW5nIFRoZSAneGVsYXRleCcgY29tbWFuZCB3YXMgbm90IGZvdW5kLiBNYWtlIHN1cmUgeW91IGhhdmUgaXQgaW5zdGFsbGVkIGFuZCBpbiBQQVRIIHRvIHByb2R1Y2UgUERGIG91dHB1dC4pCiAJQGVjaG8gIiAgU0tJUCAgICBTcGhpbnggJEAgdGFyZ2V0LiIKLWVsc2UgIyBIQVZFX1JTVDJQREYKLQkkKGNhbGwgY21kLHNwaGlueCxwZGYpCi1lbmRpZiAjIEhBVkVfUlNUMlBERgorZWxzZSAjIEhBVkVfUERGTEFURVgKKwlAJChmb3JlYWNoIHZhciwkKFNQSElOWERJUlMpLCQoY2FsbCBsb29wX2NtZCxzcGhpbngsbGF0ZXgsJCh2YXIpLGxhdGV4LCQodmFyKSkpCitlbmRpZiAjIEhBVkVfUERGTEFURVgKKworcGRmZG9jczogbGF0ZXhkb2NzCitpZm5lcSAoJChIQVZFX1BERkxBVEVYKSwwKQorCSQoZm9yZWFjaCB2YXIsJChTUEhJTlhESVJTKSwgJChNQUtFKSBQREZMQVRFWD14ZWxhdGV4IExBVEVYT1BUUz0iLWludGVyYWN0aW9uPW5vbnN0b3Btb2RlIiAtQyAkKEJVSUxERElSKS8kKHZhcikvbGF0ZXgpCitlbmRpZiAjIEhBVkVfUERGTEFURVgKIAogZXB1YmRvY3M6Ci0JJChjYWxsIGNtZCxzcGhpbngsZXB1YikKKwlAJChmb3JlYWNoIHZhciwkKFNQSElOWERJUlMpLCQoY2FsbCBsb29wX2NtZCxzcGhpbngsZXB1YiwkKHZhciksZXB1YiwkKHZhcikpKQogCiB4bWxkb2NzOgotCSQoY2FsbCBjbWQsc3BoaW54LHhtbCkKKwlAJChmb3JlYWNoIHZhciwkKFNQSElOWERJUlMpLCQoY2FsbCBsb29wX2NtZCxzcGhpbngseG1sLCQodmFyKSx4bWwsJCh2YXIpKSkKIAogIyBuby1vcHMgZm9yIHRoZSBTcGhpbnggdG9vbGNoYWluCiBzZ21sZG9jczoKQEAgLTcyLDcgKzk5LDE0IEBACiBkb2NoZWxwOgogCUBlY2hvICAnIExpbnV4IGtlcm5lbCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uIGluIGRpZmZlcmVudCBmb3JtYXRzIChTcGhpbngpOicKIAlAZWNobyAgJyAgaHRtbGRvY3MgICAgICAgIC0gSFRNTCcKKwlAZWNobyAgJyAgbGF0ZXhkb2NzICAgICAgIC0gTGFUZVgnCiAJQGVjaG8gICcgIHBkZmRvY3MgICAgICAgICAtIFBERicKIAlAZWNobyAgJyAgZXB1YmRvY3MgICAgICAgIC0gRVBVQicKIAlAZWNobyAgJyAgeG1sZG9jcyAgICAgICAgIC0gWE1MJwogCUBlY2hvICAnICBjbGVhbmRvY3MgICAgICAgLSBjbGVhbiBhbGwgZ2VuZXJhdGVkIGZpbGVzJworCUBlY2hvCisJQGVjaG8gICcgIG1ha2UgU1BISU5YRElSUz0iczEgczIiIFt0YXJnZXRdIEdlbmVyYXRlIG9ubHkgZG9jcyBvZiBmb2xkZXIgczEsIHMyJworCUBlY2hvICAnICB2YWxpZCB2YWx1ZXMgZm9yIFNQSElOWERJUlMgYXJlOiAkKF9TUEhJTlhESVJTKScKKwlAZWNobworCUBlY2hvICAnICBtYWtlIFNQSElOWF9DT05GPXtjb25mLWZpbGV9IFt0YXJnZXRdIHVzZSAqYWRkaXRpb25hbCogc3BoaW54LWJ1aWxkJworCUBlY2hvICAnICBjb25maWd1cmF0aW9uLiBUaGlzIGlzIGUuZy4gdXNlZnVsIHRvIGJ1aWxkIHdpdGggbml0LXBpY2tpbmcgY29uZmlnLicKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vTWFuYWdlbWVudFN0eWxlIGIvRG9jdW1lbnRhdGlvbi9NYW5hZ2VtZW50U3R5bGUKaW5kZXggYTIxMWVlOC4uZGVhMmU2NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9NYW5hZ2VtZW50U3R5bGUKKysrIGIvRG9jdW1lbnRhdGlvbi9NYW5hZ2VtZW50U3R5bGUKQEAgLTEsMTAgKzEsMTIgQEAKKy4uIF9tYW5hZ2VtZW50c3R5bGU6CiAKLSAgICAgICAgICAgICAgICBMaW51eCBrZXJuZWwgbWFuYWdlbWVudCBzdHlsZQorTGludXgga2VybmVsIG1hbmFnZW1lbnQgc3R5bGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFRoaXMgaXMgYSBzaG9ydCBkb2N1bWVudCBkZXNjcmliaW5nIHRoZSBwcmVmZXJyZWQgKG9yIG1hZGUgdXAsIGRlcGVuZGluZwogb24gd2hvIHlvdSBhc2spIG1hbmFnZW1lbnQgc3R5bGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuICBJdCdzIG1lYW50IHRvCiBtaXJyb3IgdGhlIENvZGluZ1N0eWxlIGRvY3VtZW50IHRvIHNvbWUgZGVncmVlLCBhbmQgbWFpbmx5IHdyaXR0ZW4gdG8KLWF2b2lkIGFuc3dlcmluZyAoKikgdGhlIHNhbWUgKG9yIHNpbWlsYXIpIHF1ZXN0aW9ucyBvdmVyIGFuZCBvdmVyIGFnYWluLiAKK2F2b2lkIGFuc3dlcmluZyBbI2YxXV8gIHRoZSBzYW1lIChvciBzaW1pbGFyKSBxdWVzdGlvbnMgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4KIAogTWFuYWdlbWVudCBzdHlsZSBpcyB2ZXJ5IHBlcnNvbmFsIGFuZCBtdWNoIGhhcmRlciB0byBxdWFudGlmeSB0aGFuCiBzaW1wbGUgY29kaW5nIHN0eWxlIHJ1bGVzLCBzbyB0aGlzIGRvY3VtZW50IG1heSBvciBtYXkgbm90IGhhdmUgYW55dGhpbmcKQEAgLTE0LDUwICsxNiw1MiBAQAogQnR3LCB3aGVuIHRhbGtpbmcgYWJvdXQgImtlcm5lbCBtYW5hZ2VyIiwgaXQncyBhbGwgYWJvdXQgdGhlIHRlY2huaWNhbAogbGVhZCBwZXJzb25zLCBub3QgdGhlIHBlb3BsZSB3aG8gZG8gdHJhZGl0aW9uYWwgbWFuYWdlbWVudCBpbnNpZGUKIGNvbXBhbmllcy4gIElmIHlvdSBzaWduIHB1cmNoYXNlIG9yZGVycyBvciB5b3UgaGF2ZSBhbnkgY2x1ZSBhYm91dCB0aGUKLWJ1ZGdldCBvZiB5b3VyIGdyb3VwLCB5b3UncmUgYWxtb3N0IGNlcnRhaW5seSBub3QgYSBrZXJuZWwgbWFuYWdlci4gCi1UaGVzZSBzdWdnZXN0aW9ucyBtYXkgb3IgbWF5IG5vdCBhcHBseSB0byB5b3UuIAorYnVkZ2V0IG9mIHlvdXIgZ3JvdXAsIHlvdSdyZSBhbG1vc3QgY2VydGFpbmx5IG5vdCBhIGtlcm5lbCBtYW5hZ2VyLgorVGhlc2Ugc3VnZ2VzdGlvbnMgbWF5IG9yIG1heSBub3QgYXBwbHkgdG8geW91LgogCiBGaXJzdCBvZmYsIEknZCBzdWdnZXN0IGJ1eWluZyAiU2V2ZW4gSGFiaXRzIG9mIEhpZ2hseSBFZmZlY3RpdmUKLVBlb3BsZSIsIGFuZCBOT1QgcmVhZCBpdC4gIEJ1cm4gaXQsIGl0J3MgYSBncmVhdCBzeW1ib2xpYyBnZXN0dXJlLiAKK1Blb3BsZSIsIGFuZCBOT1QgcmVhZCBpdC4gIEJ1cm4gaXQsIGl0J3MgYSBncmVhdCBzeW1ib2xpYyBnZXN0dXJlLgogCi0oKikgVGhpcyBkb2N1bWVudCBkb2VzIHNvIG5vdCBzbyBtdWNoIGJ5IGFuc3dlcmluZyB0aGUgcXVlc3Rpb24sIGJ1dCBieQotbWFraW5nIGl0IHBhaW5mdWxseSBvYnZpb3VzIHRvIHRoZSBxdWVzdGlvbmVyIHRoYXQgd2UgZG9uJ3QgaGF2ZSBhIGNsdWUKLXRvIHdoYXQgdGhlIGFuc3dlciBpcy4gCisuLiBbI2YxXSBUaGlzIGRvY3VtZW50IGRvZXMgc28gbm90IHNvIG11Y2ggYnkgYW5zd2VyaW5nIHRoZSBxdWVzdGlvbiwgYnV0IGJ5CisgIG1ha2luZyBpdCBwYWluZnVsbHkgb2J2aW91cyB0byB0aGUgcXVlc3Rpb25lciB0aGF0IHdlIGRvbid0IGhhdmUgYSBjbHVlCisgIHRvIHdoYXQgdGhlIGFuc3dlciBpcy4KIAogQW55d2F5LCBoZXJlIGdvZXM6CiAKKy4uIF9kZWNpc2lvbnM6CiAKLQkJQ2hhcHRlciAxOiBEZWNpc2lvbnMKKzEpIERlY2lzaW9ucworLS0tLS0tLS0tLS0tCiAKIEV2ZXJ5Ym9keSB0aGlua3MgbWFuYWdlcnMgbWFrZSBkZWNpc2lvbnMsIGFuZCB0aGF0IGRlY2lzaW9uLW1ha2luZyBpcwogaW1wb3J0YW50LiAgVGhlIGJpZ2dlciBhbmQgbW9yZSBwYWluZnVsIHRoZSBkZWNpc2lvbiwgdGhlIGJpZ2dlciB0aGUKIG1hbmFnZXIgbXVzdCBiZSB0byBtYWtlIGl0LiAgVGhhdCdzIHZlcnkgZGVlcCBhbmQgb2J2aW91cywgYnV0IGl0J3Mgbm90Ci1hY3R1YWxseSB0cnVlLiAKK2FjdHVhbGx5IHRydWUuCiAKLVRoZSBuYW1lIG9mIHRoZSBnYW1lIGlzIHRvIF9hdm9pZF8gaGF2aW5nIHRvIG1ha2UgYSBkZWNpc2lvbi4gIEluCitUaGUgbmFtZSBvZiB0aGUgZ2FtZSBpcyB0byAqKmF2b2lkKiogaGF2aW5nIHRvIG1ha2UgYSBkZWNpc2lvbi4gIEluCiBwYXJ0aWN1bGFyLCBpZiBzb21lYm9keSB0ZWxscyB5b3UgImNob29zZSAoYSkgb3IgKGIpLCB3ZSByZWFsbHkgbmVlZCB5b3UKIHRvIGRlY2lkZSBvbiB0aGlzIiwgeW91J3JlIGluIHRyb3VibGUgYXMgYSBtYW5hZ2VyLiAgVGhlIHBlb3BsZSB5b3UKIG1hbmFnZSBoYWQgYmV0dGVyIGtub3cgdGhlIGRldGFpbHMgYmV0dGVyIHRoYW4geW91LCBzbyBpZiB0aGV5IGNvbWUgdG8KIHlvdSBmb3IgYSB0ZWNobmljYWwgZGVjaXNpb24sIHlvdSdyZSBzY3Jld2VkLiAgWW91J3JlIGNsZWFybHkgbm90Ci1jb21wZXRlbnQgdG8gbWFrZSB0aGF0IGRlY2lzaW9uIGZvciB0aGVtLiAKK2NvbXBldGVudCB0byBtYWtlIHRoYXQgZGVjaXNpb24gZm9yIHRoZW0uCiAKIChDb3JvbGxhcnk6aWYgdGhlIHBlb3BsZSB5b3UgbWFuYWdlIGRvbid0IGtub3cgdGhlIGRldGFpbHMgYmV0dGVyIHRoYW4KLXlvdSwgeW91J3JlIGFsc28gc2NyZXdlZCwgYWx0aG91Z2ggZm9yIGEgdG90YWxseSBkaWZmZXJlbnQgcmVhc29uLiAKLU5hbWVseSB0aGF0IHlvdSBhcmUgaW4gdGhlIHdyb25nIGpvYiwgYW5kIHRoYXQgX3RoZXlfIHNob3VsZCBiZSBtYW5hZ2luZwoteW91ciBicmlsbGlhbmNlIGluc3RlYWQpLiAKK3lvdSwgeW91J3JlIGFsc28gc2NyZXdlZCwgYWx0aG91Z2ggZm9yIGEgdG90YWxseSBkaWZmZXJlbnQgcmVhc29uLgorTmFtZWx5IHRoYXQgeW91IGFyZSBpbiB0aGUgd3Jvbmcgam9iLCBhbmQgdGhhdCAqKnRoZXkqKiBzaG91bGQgYmUgbWFuYWdpbmcKK3lvdXIgYnJpbGxpYW5jZSBpbnN0ZWFkKS4KIAotU28gdGhlIG5hbWUgb2YgdGhlIGdhbWUgaXMgdG8gX2F2b2lkXyBkZWNpc2lvbnMsIGF0IGxlYXN0IHRoZSBiaWcgYW5kCitTbyB0aGUgbmFtZSBvZiB0aGUgZ2FtZSBpcyB0byAqKmF2b2lkKiogZGVjaXNpb25zLCBhdCBsZWFzdCB0aGUgYmlnIGFuZAogcGFpbmZ1bCBvbmVzLiAgTWFraW5nIHNtYWxsIGFuZCBub24tY29uc2VxdWVudGlhbCBkZWNpc2lvbnMgaXMgZmluZSwgYW5kCiBtYWtlcyB5b3UgbG9vayBsaWtlIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLCBzbyB3aGF0IGEga2VybmVsIG1hbmFnZXIKIG5lZWRzIHRvIGRvIGlzIHRvIHR1cm4gdGhlIGJpZyBhbmQgcGFpbmZ1bCBvbmVzIGludG8gc21hbGwgdGhpbmdzIHdoZXJlCi1ub2JvZHkgcmVhbGx5IGNhcmVzLiAKK25vYm9keSByZWFsbHkgY2FyZXMuCiAKIEl0IGhlbHBzIHRvIHJlYWxpemUgdGhhdCB0aGUga2V5IGRpZmZlcmVuY2UgYmV0d2VlbiBhIGJpZyBkZWNpc2lvbiBhbmQgYQogc21hbGwgb25lIGlzIHdoZXRoZXIgeW91IGNhbiBmaXggeW91ciBkZWNpc2lvbiBhZnRlcndhcmRzLiAgQW55IGRlY2lzaW9uCiBjYW4gYmUgbWFkZSBzbWFsbCBieSBqdXN0IGFsd2F5cyBtYWtpbmcgc3VyZSB0aGF0IGlmIHlvdSB3ZXJlIHdyb25nIChhbmQKLXlvdSBfd2lsbF8gYmUgd3JvbmcpLCB5b3UgY2FuIGFsd2F5cyB1bmRvIHRoZSBkYW1hZ2UgbGF0ZXIgYnkKK3lvdSAqKndpbGwqKiBiZSB3cm9uZyksIHlvdSBjYW4gYWx3YXlzIHVuZG8gdGhlIGRhbWFnZSBsYXRlciBieQogYmFja3RyYWNraW5nLiAgU3VkZGVubHksIHlvdSBnZXQgdG8gYmUgZG91Ymx5IG1hbmFnZXJpYWwgZm9yIG1ha2luZwotX3R3b18gaW5jb25zZXF1ZW50aWFsIGRlY2lzaW9ucyAtIHRoZSB3cm9uZyBvbmUgX2FuZF8gdGhlIHJpZ2h0IG9uZS4gCisqKnR3byoqIGluY29uc2VxdWVudGlhbCBkZWNpc2lvbnMgLSB0aGUgd3Jvbmcgb25lICoqYW5kKiogdGhlIHJpZ2h0IG9uZS4KIAogQW5kIHBlb3BsZSB3aWxsIGV2ZW4gc2VlIHRoYXQgYXMgdHJ1ZSBsZWFkZXJzaGlwICgqY291Z2gqIGJ1bGxzaGl0CiAqY291Z2gqKS4KQEAgLTY1LDEwICs2OSwxMCBAQAogVGh1cyB0aGUga2V5IHRvIGF2b2lkaW5nIGJpZyBkZWNpc2lvbnMgYmVjb21lcyB0byBqdXN0IGF2b2lkaW5nIHRvIGRvCiB0aGluZ3MgdGhhdCBjYW4ndCBiZSB1bmRvbmUuICBEb24ndCBnZXQgdXNoZXJlZCBpbnRvIGEgY29ybmVyIGZyb20gd2hpY2gKIHlvdSBjYW5ub3QgZXNjYXBlLiAgQSBjb3JuZXJlZCByYXQgbWF5IGJlIGRhbmdlcm91cyAtIGEgY29ybmVyZWQgbWFuYWdlcgotaXMganVzdCBwaXRpZnVsLiAKK2lzIGp1c3QgcGl0aWZ1bC4KIAogSXQgdHVybnMgb3V0IHRoYXQgc2luY2Ugbm9ib2R5IHdvdWxkIGJlIHN0dXBpZCBlbm91Z2ggdG8gZXZlciByZWFsbHkgbGV0Ci1hIGtlcm5lbCBtYW5hZ2VyIGhhdmUgaHVnZSBmaXNjYWwgcmVzcG9uc2liaWxpdHkgX2FueXdheV8sIGl0J3MgdXN1YWxseQorYSBrZXJuZWwgbWFuYWdlciBoYXZlIGh1Z2UgZmlzY2FsIHJlc3BvbnNpYmlsaXR5ICoqYW55d2F5KiosIGl0J3MgdXN1YWxseQogZmFpcmx5IGVhc3kgdG8gYmFja3RyYWNrLiAgU2luY2UgeW91J3JlIG5vdCBnb2luZyB0byBiZSBhYmxlIHRvIHdhc3RlCiBodWdlIGFtb3VudHMgb2YgbW9uZXkgdGhhdCB5b3UgbWlnaHQgbm90IGJlIGFibGUgdG8gcmVwYXksIHRoZSBvbmx5CiB0aGluZyB5b3UgY2FuIGJhY2t0cmFjayBvbiBpcyBhIHRlY2huaWNhbCBkZWNpc2lvbiwgYW5kIHRoZXJlCkBAIC03NiwxMTMgKzgwLDExOCBAQAogaW5jb21wZXRlbnQgbmluY29tcG9vcCwgc2F5IHlvdSdyZSBzb3JyeSwgYW5kIHVuZG8gYWxsIHRoZSB3b3J0aGxlc3MKIHdvcmsgeW91IGhhZCBwZW9wbGUgd29yayBvbiBmb3IgdGhlIGxhc3QgeWVhci4gIFN1ZGRlbmx5IHRoZSBkZWNpc2lvbgogeW91IG1hZGUgYSB5ZWFyIGFnbyB3YXNuJ3QgYSBiaWcgZGVjaXNpb24gYWZ0ZXIgYWxsLCBzaW5jZSBpdCBjb3VsZCBiZQotZWFzaWx5IHVuZG9uZS4gCitlYXNpbHkgdW5kb25lLgogCiBJdCB0dXJucyBvdXQgdGhhdCBzb21lIHBlb3BsZSBoYXZlIHRyb3VibGUgd2l0aCB0aGlzIGFwcHJvYWNoLCBmb3IgdHdvCiByZWFzb25zOgorCiAgLSBhZG1pdHRpbmcgeW91IHdlcmUgYW4gaWRpb3QgaXMgaGFyZGVyIHRoYW4gaXQgbG9va3MuICBXZSBhbGwgbGlrZSB0bwogICAgbWFpbnRhaW4gYXBwZWFyYW5jZXMsIGFuZCBjb21pbmcgb3V0IGluIHB1YmxpYyB0byBzYXkgdGhhdCB5b3Ugd2VyZQotICAgd3JvbmcgaXMgc29tZXRpbWVzIHZlcnkgaGFyZCBpbmRlZWQuIAorICAgd3JvbmcgaXMgc29tZXRpbWVzIHZlcnkgaGFyZCBpbmRlZWQuCiAgLSBoYXZpbmcgc29tZWJvZHkgdGVsbCB5b3UgdGhhdCB3aGF0IHlvdSB3b3JrZWQgb24gZm9yIHRoZSBsYXN0IHllYXIKICAgIHdhc24ndCB3b3J0aHdoaWxlIGFmdGVyIGFsbCBjYW4gYmUgaGFyZCBvbiB0aGUgcG9vciBsb3dseSBlbmdpbmVlcnMKLSAgIHRvbywgYW5kIHdoaWxlIHRoZSBhY3R1YWwgX3dvcmtfIHdhcyBlYXN5IGVub3VnaCB0byB1bmRvIGJ5IGp1c3QKKyAgIHRvbywgYW5kIHdoaWxlIHRoZSBhY3R1YWwgKip3b3JrKiogd2FzIGVhc3kgZW5vdWdoIHRvIHVuZG8gYnkganVzdAogICAgZGVsZXRpbmcgaXQsIHlvdSBtYXkgaGF2ZSBpcnJldm9jYWJseSBsb3N0IHRoZSB0cnVzdCBvZiB0aGF0CiAgICBlbmdpbmVlci4gIEFuZCByZW1lbWJlcjogImlycmV2b2NhYmxlIiB3YXMgd2hhdCB3ZSB0cmllZCB0byBhdm9pZCBpbgogICAgdGhlIGZpcnN0IHBsYWNlLCBhbmQgeW91ciBkZWNpc2lvbiBlbmRlZCB1cCBiZWluZyBhIGJpZyBvbmUgYWZ0ZXIKLSAgIGFsbC4gCisgICBhbGwuCiAKIEhhcHBpbHksIGJvdGggb2YgdGhlc2UgcmVhc29ucyBjYW4gYmUgbWl0aWdhdGVkIGVmZmVjdGl2ZWx5IGJ5IGp1c3QKIGFkbWl0dGluZyB1cC1mcm9udCB0aGF0IHlvdSBkb24ndCBoYXZlIGEgZnJpZ2dpbicgY2x1ZSwgYW5kIHRlbGxpbmcKIHBlb3BsZSBhaGVhZCBvZiB0aGUgZmFjdCB0aGF0IHlvdXIgZGVjaXNpb24gaXMgcHVyZWx5IHByZWxpbWluYXJ5LCBhbmQKIG1pZ2h0IGJlIHRoZSB3cm9uZyB0aGluZy4gIFlvdSBzaG91bGQgYWx3YXlzIHJlc2VydmUgdGhlIHJpZ2h0IHRvIGNoYW5nZQoteW91ciBtaW5kLCBhbmQgbWFrZSBwZW9wbGUgdmVyeSBfYXdhcmVfIG9mIHRoYXQuICBBbmQgaXQncyBtdWNoIGVhc2llcgotdG8gYWRtaXQgdGhhdCB5b3UgYXJlIHN0dXBpZCB3aGVuIHlvdSBoYXZlbid0IF95ZXRfIGRvbmUgdGhlIHJlYWxseQoreW91ciBtaW5kLCBhbmQgbWFrZSBwZW9wbGUgdmVyeSAqKmF3YXJlKiogb2YgdGhhdC4gIEFuZCBpdCdzIG11Y2ggZWFzaWVyCit0byBhZG1pdCB0aGF0IHlvdSBhcmUgc3R1cGlkIHdoZW4geW91IGhhdmVuJ3QgKip5ZXQqKiBkb25lIHRoZSByZWFsbHkKIHN0dXBpZCB0aGluZy4KIAogVGhlbiwgd2hlbiBpdCByZWFsbHkgZG9lcyB0dXJuIG91dCB0byBiZSBzdHVwaWQsIHBlb3BsZSBqdXN0IHJvbGwgdGhlaXIKLWV5ZXMgYW5kIHNheSAiT29wcywgaGUgZGlkIGl0IGFnYWluIi4gIAorZXllcyBhbmQgc2F5ICJPb3BzLCBoZSBkaWQgaXQgYWdhaW4iLgogCiBUaGlzIHByZWVtcHRpdmUgYWRtaXNzaW9uIG9mIGluY29tcGV0ZW5jZSBtaWdodCBhbHNvIG1ha2UgdGhlIHBlb3BsZSB3aG8KIGFjdHVhbGx5IGRvIHRoZSB3b3JrIGFsc28gdGhpbmsgdHdpY2UgYWJvdXQgd2hldGhlciBpdCdzIHdvcnRoIGRvaW5nIG9yCi1ub3QuICBBZnRlciBhbGwsIGlmIF90aGV5XyBhcmVuJ3QgY2VydGFpbiB3aGV0aGVyIGl0J3MgYSBnb29kIGlkZWEsIHlvdQorbm90LiAgQWZ0ZXIgYWxsLCBpZiAqKnRoZXkqKiBhcmVuJ3QgY2VydGFpbiB3aGV0aGVyIGl0J3MgYSBnb29kIGlkZWEsIHlvdQogc3VyZSBhcyBoZWxsIHNob3VsZG4ndCBlbmNvdXJhZ2UgdGhlbSBieSBwcm9taXNpbmcgdGhlbSB0aGF0IHdoYXQgdGhleQogd29yayBvbiB3aWxsIGJlIGluY2x1ZGVkLiAgTWFrZSB0aGVtIGF0IGxlYXN0IHRoaW5rIHR3aWNlIGJlZm9yZSB0aGV5Ci1lbWJhcmsgb24gYSBiaWcgZW5kZWF2b3IuIAorZW1iYXJrIG9uIGEgYmlnIGVuZGVhdm9yLgogCiBSZW1lbWJlcjogdGhleSdkIGJldHRlciBrbm93IG1vcmUgYWJvdXQgdGhlIGRldGFpbHMgdGhhbiB5b3UgZG8sIGFuZAogdGhleSB1c3VhbGx5IGFscmVhZHkgdGhpbmsgdGhleSBoYXZlIHRoZSBhbnN3ZXIgdG8gZXZlcnl0aGluZy4gIFRoZSBiZXN0CiB0aGluZyB5b3UgY2FuIGRvIGFzIGEgbWFuYWdlciBpcyBub3QgdG8gaW5zdGlsbCBjb25maWRlbmNlLCBidXQgcmF0aGVyIGEKLWhlYWx0aHkgZG9zZSBvZiBjcml0aWNhbCB0aGlua2luZyBvbiB3aGF0IHRoZXkgZG8uIAoraGVhbHRoeSBkb3NlIG9mIGNyaXRpY2FsIHRoaW5raW5nIG9uIHdoYXQgdGhleSBkby4KIAogQnR3LCBhbm90aGVyIHdheSB0byBhdm9pZCBhIGRlY2lzaW9uIGlzIHRvIHBsYWludGl2ZWx5IGp1c3Qgd2hpbmUgImNhbid0CiB3ZSBqdXN0IGRvIGJvdGg/IiBhbmQgbG9vayBwaXRpZnVsLiAgVHJ1c3QgbWUsIGl0IHdvcmtzLiAgSWYgaXQncyBub3QKIGNsZWFyIHdoaWNoIGFwcHJvYWNoIGlzIGJldHRlciwgdGhleSdsbCBldmVudHVhbGx5IGZpZ3VyZSBpdCBvdXQuICBUaGUKIGFuc3dlciBtYXkgZW5kIHVwIGJlaW5nIHRoYXQgYm90aCB0ZWFtcyBnZXQgc28gZnJ1c3RyYXRlZCBieSB0aGUKLXNpdHVhdGlvbiB0aGF0IHRoZXkganVzdCBnaXZlIHVwLiAKK3NpdHVhdGlvbiB0aGF0IHRoZXkganVzdCBnaXZlIHVwLgogCiBUaGF0IG1heSBzb3VuZCBsaWtlIGEgZmFpbHVyZSwgYnV0IGl0J3MgdXN1YWxseSBhIHNpZ24gdGhhdCB0aGVyZSB3YXMKIHNvbWV0aGluZyB3cm9uZyB3aXRoIGJvdGggcHJvamVjdHMsIGFuZCB0aGUgcmVhc29uIHRoZSBwZW9wbGUgaW52b2x2ZWQKIGNvdWxkbid0IGRlY2lkZSB3YXMgdGhhdCB0aGV5IHdlcmUgYm90aCB3cm9uZy4gIFlvdSBlbmQgdXAgY29taW5nIHVwCiBzbWVsbGluZyBsaWtlIHJvc2VzLCBhbmQgeW91IGF2b2lkZWQgeWV0IGFub3RoZXIgZGVjaXNpb24gdGhhdCB5b3UgY291bGQKLWhhdmUgc2NyZXdlZCB1cCBvbi4gCitoYXZlIHNjcmV3ZWQgdXAgb24uCiAKIAotCQlDaGFwdGVyIDI6IFBlb3BsZQorMikgUGVvcGxlCistLS0tLS0tLS0KIAogTW9zdCBwZW9wbGUgYXJlIGlkaW90cywgYW5kIGJlaW5nIGEgbWFuYWdlciBtZWFucyB5b3UnbGwgaGF2ZSB0byBkZWFsCi13aXRoIGl0LCBhbmQgcGVyaGFwcyBtb3JlIGltcG9ydGFudGx5LCB0aGF0IF90aGV5XyBoYXZlIHRvIGRlYWwgd2l0aAotX3lvdV8uIAord2l0aCBpdCwgYW5kIHBlcmhhcHMgbW9yZSBpbXBvcnRhbnRseSwgdGhhdCAqKnRoZXkqKiBoYXZlIHRvIGRlYWwgd2l0aAorKip5b3UqKi4KIAogSXQgdHVybnMgb3V0IHRoYXQgd2hpbGUgaXQncyBlYXN5IHRvIHVuZG8gdGVjaG5pY2FsIG1pc3Rha2VzLCBpdCdzIG5vdAogYXMgZWFzeSB0byB1bmRvIHBlcnNvbmFsaXR5IGRpc29yZGVycy4gIFlvdSBqdXN0IGhhdmUgdG8gbGl2ZSB3aXRoCi10aGVpcnMgLSBhbmQgeW91cnMuIAordGhlaXJzIC0gYW5kIHlvdXJzLgogCiBIb3dldmVyLCBpbiBvcmRlciB0byBwcmVwYXJlIHlvdXJzZWxmIGFzIGEga2VybmVsIG1hbmFnZXIsIGl0J3MgYmVzdCB0bwogcmVtZW1iZXIgbm90IHRvIGJ1cm4gYW55IGJyaWRnZXMsIGJvbWIgYW55IGlubm9jZW50IHZpbGxhZ2Vycywgb3IKIGFsaWVuYXRlIHRvbyBtYW55IGtlcm5lbCBkZXZlbG9wZXJzLiBJdCB0dXJucyBvdXQgdGhhdCBhbGllbmF0aW5nIHBlb3BsZQogaXMgZmFpcmx5IGVhc3ksIGFuZCB1bi1hbGllbmF0aW5nIHRoZW0gaXMgaGFyZC4gVGh1cyAiYWxpZW5hdGluZyIKIGltbWVkaWF0ZWx5IGZhbGxzIHVuZGVyIHRoZSBoZWFkaW5nIG9mICJub3QgcmV2ZXJzaWJsZSIsIGFuZCBiZWNvbWVzIGEKLW5vLW5vIGFjY29yZGluZyB0byBDaGFwdGVyIDEuCituby1ubyBhY2NvcmRpbmcgdG8gOnJlZjpgZGVjaXNpb25zYC4KIAogVGhlcmUncyBqdXN0IGEgZmV3IHNpbXBsZSBydWxlcyBoZXJlOgorCiAgKDEpIGRvbid0IGNhbGwgcGVvcGxlIGQqY2toZWFkcyAoYXQgbGVhc3Qgbm90IGluIHB1YmxpYykKICAoMikgbGVhcm4gaG93IHRvIGFwb2xvZ2l6ZSB3aGVuIHlvdSBmb3Jnb3QgcnVsZSAoMSkKIAogVGhlIHByb2JsZW0gd2l0aCAjMSBpcyB0aGF0IGl0J3MgdmVyeSBlYXN5IHRvIGRvLCBzaW5jZSB5b3UgY2FuIHNheQotInlvdSdyZSBhIGQqY2toZWFkIiBpbiBtaWxsaW9ucyBvZiBkaWZmZXJlbnQgd2F5cyAoKiksIHNvbWV0aW1lcyB3aXRob3V0CisieW91J3JlIGEgZCpja2hlYWQiIGluIG1pbGxpb25zIG9mIGRpZmZlcmVudCB3YXlzIFsjZjJdXywgc29tZXRpbWVzIHdpdGhvdXQKIGV2ZW4gcmVhbGl6aW5nIGl0LCBhbmQgYWxtb3N0IGFsd2F5cyB3aXRoIGEgd2hpdGUtaG90IGNvbnZpY3Rpb24gdGhhdAoteW91IGFyZSByaWdodC4gCit5b3UgYXJlIHJpZ2h0LgogCiBBbmQgdGhlIG1vcmUgY29udmluY2VkIHlvdSBhcmUgdGhhdCB5b3UgYXJlIHJpZ2h0IChhbmQgbGV0J3MgZmFjZSBpdCwKLXlvdSBjYW4gY2FsbCBqdXN0IGFib3V0IF9hbnlib2R5XyBhIGQqY2toZWFkLCBhbmQgeW91IG9mdGVuIF93aWxsXyBiZQotcmlnaHQpLCB0aGUgaGFyZGVyIGl0IGVuZHMgdXAgYmVpbmcgdG8gYXBvbG9naXplIGFmdGVyd2FyZHMuIAoreW91IGNhbiBjYWxsIGp1c3QgYWJvdXQgKiphbnlib2R5KiogYSBkKmNraGVhZCwgYW5kIHlvdSBvZnRlbiAqKndpbGwqKiBiZQorcmlnaHQpLCB0aGUgaGFyZGVyIGl0IGVuZHMgdXAgYmVpbmcgdG8gYXBvbG9naXplIGFmdGVyd2FyZHMuCiAKIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgeW91IHJlYWxseSBvbmx5IGhhdmUgdHdvIG9wdGlvbnM6CisKICAtIGdldCByZWFsbHkgZ29vZCBhdCBhcG9sb2dpZXMKICAtIHNwcmVhZCB0aGUgImxvdmUiIG91dCBzbyBldmVubHkgdGhhdCBub2JvZHkgcmVhbGx5IGVuZHMgdXAgZmVlbGluZwogICAgbGlrZSB0aGV5IGdldCB1bmZhaXJseSB0YXJnZXRlZC4gIE1ha2UgaXQgaW52ZW50aXZlIGVub3VnaCwgYW5kIHRoZXkKLSAgIG1pZ2h0IGV2ZW4gYmUgYW11c2VkLiAKKyAgIG1pZ2h0IGV2ZW4gYmUgYW11c2VkLgogCiBUaGUgb3B0aW9uIG9mIGJlaW5nIHVuZmFpbGluZ2x5IHBvbGl0ZSByZWFsbHkgZG9lc24ndCBleGlzdC4gTm9ib2R5IHdpbGwKIHRydXN0IHNvbWVib2R5IHdobyBpcyBzbyBjbGVhcmx5IGhpZGluZyBoaXMgdHJ1ZSBjaGFyYWN0ZXIuCiAKLSgqKSBQYXVsIFNpbW9uIHNhbmcgIkZpZnR5IFdheXMgdG8gTGVhdmUgWW91ciBMb3ZlciIsIGJlY2F1c2UgcXVpdGUKLWZyYW5rbHksICJBIE1pbGxpb24gV2F5cyB0byBUZWxsIGEgRGV2ZWxvcGVyIEhlIElzIGEgRCpja2hlYWQiIGRvZXNuJ3QKLXNjYW4gbmVhcmx5IGFzIHdlbGwuICBCdXQgSSdtIHN1cmUgaGUgdGhvdWdodCBhYm91dCBpdC4gCisuLiBbI2YyXSBQYXVsIFNpbW9uIHNhbmcgIkZpZnR5IFdheXMgdG8gTGVhdmUgWW91ciBMb3ZlciIsIGJlY2F1c2UgcXVpdGUKKyAgZnJhbmtseSwgIkEgTWlsbGlvbiBXYXlzIHRvIFRlbGwgYSBEZXZlbG9wZXIgSGUgSXMgYSBEKmNraGVhZCIgZG9lc24ndAorICBzY2FuIG5lYXJseSBhcyB3ZWxsLiAgQnV0IEknbSBzdXJlIGhlIHRob3VnaHQgYWJvdXQgaXQuCiAKIAotCQlDaGFwdGVyIDM6IFBlb3BsZSBJSSAtIHRoZSBHb29kIEtpbmQKKzMpIFBlb3BsZSBJSSAtIHRoZSBHb29kIEtpbmQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogV2hpbGUgaXQgdHVybnMgb3V0IHRoYXQgbW9zdCBwZW9wbGUgYXJlIGlkaW90cywgdGhlIGNvcm9sbGFyeSB0byB0aGF0IGlzCiBzYWRseSB0aGF0IHlvdSBhcmUgb25lIHRvbywgYW5kIHRoYXQgd2hpbGUgd2UgY2FuIGFsbCBiYXNrIGluIHRoZSBzZWN1cmUKIGtub3dsZWRnZSB0aGF0IHdlJ3JlIGJldHRlciB0aGFuIHRoZSBhdmVyYWdlIHBlcnNvbiAobGV0J3MgZmFjZSBpdCwKIG5vYm9keSBldmVyIGJlbGlldmVzIHRoYXQgdGhleSdyZSBhdmVyYWdlIG9yIGJlbG93LWF2ZXJhZ2UpLCB3ZSBzaG91bGQKIGFsc28gYWRtaXQgdGhhdCB3ZSdyZSBub3QgdGhlIHNoYXJwZXN0IGtuaWZlIGFyb3VuZCwgYW5kIHRoZXJlIHdpbGwgYmUKLW90aGVyIHBlb3BsZSB0aGF0IGFyZSBsZXNzIG9mIGFuIGlkaW90IHRoYW4geW91IGFyZS4gCitvdGhlciBwZW9wbGUgdGhhdCBhcmUgbGVzcyBvZiBhbiBpZGlvdCB0aGFuIHlvdSBhcmUuCiAKLVNvbWUgcGVvcGxlIHJlYWN0IGJhZGx5IHRvIHNtYXJ0IHBlb3BsZS4gIE90aGVycyB0YWtlIGFkdmFudGFnZSBvZiB0aGVtLiAKK1NvbWUgcGVvcGxlIHJlYWN0IGJhZGx5IHRvIHNtYXJ0IHBlb3BsZS4gIE90aGVycyB0YWtlIGFkdmFudGFnZSBvZiB0aGVtLgogCi1NYWtlIHN1cmUgdGhhdCB5b3UsIGFzIGEga2VybmVsIG1haW50YWluZXIsIGFyZSBpbiB0aGUgc2Vjb25kIGdyb3VwLiAKK01ha2Ugc3VyZSB0aGF0IHlvdSwgYXMgYSBrZXJuZWwgbWFpbnRhaW5lciwgYXJlIGluIHRoZSBzZWNvbmQgZ3JvdXAuCiBTdWNrIHVwIHRvIHRoZW0sIGJlY2F1c2UgdGhleSBhcmUgdGhlIHBlb3BsZSB3aG8gd2lsbCBtYWtlIHlvdXIgam9iCiBlYXNpZXIuIEluIHBhcnRpY3VsYXIsIHRoZXknbGwgYmUgYWJsZSB0byBtYWtlIHlvdXIgZGVjaXNpb25zIGZvciB5b3UsCiB3aGljaCBpcyB3aGF0IHRoZSBnYW1lIGlzIGFsbCBhYm91dC4KQEAgLTE5MSw3ICsyMDAsNyBAQAogbWFuYWdlbWVudCByZXNwb25zaWJpbGl0aWVzIGxhcmdlbHkgYmVjb21lIG9uZXMgb2Ygc2F5aW5nICJTb3VuZHMgbGlrZSBhCiBnb29kIGlkZWEgLSBnbyB3aWxkIiwgb3IgIlRoYXQgc291bmRzIGdvb2QsIGJ1dCB3aGF0IGFib3V0IHh4eD8iLiAgVGhlCiBzZWNvbmQgdmVyc2lvbiBpbiBwYXJ0aWN1bGFyIGlzIGEgZ3JlYXQgd2F5IHRvIGVpdGhlciBsZWFybiBzb21ldGhpbmcKLW5ldyBhYm91dCAieHh4IiBvciBzZWVtIF9leHRyYV8gbWFuYWdlcmlhbCBieSBwb2ludGluZyBvdXQgc29tZXRoaW5nIHRoZQorbmV3IGFib3V0ICJ4eHgiIG9yIHNlZW0gKipleHRyYSoqIG1hbmFnZXJpYWwgYnkgcG9pbnRpbmcgb3V0IHNvbWV0aGluZyB0aGUKIHNtYXJ0ZXIgcGVyc29uIGhhZG4ndCB0aG91Z2h0IGFib3V0LiAgSW4gZWl0aGVyIGNhc2UsIHlvdSB3aW4uCiAKIE9uZSB0aGluZyB0byBsb29rIG91dCBmb3IgaXMgdG8gcmVhbGl6ZSB0aGF0IGdyZWF0bmVzcyBpbiBvbmUgYXJlYSBkb2VzCkBAIC0xOTksNDcgKzIwOCw0OSBAQAogc3BlY2lmaWMgZGlyZWN0aW9ucywgYnV0IGxldCdzIGZhY2UgaXQsIHRoZXkgbWlnaHQgYmUgZ29vZCBhdCB3aGF0IHRoZXkKIGRvLCBhbmQgc3VjayBhdCBldmVyeXRoaW5nIGVsc2UuICBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgcGVvcGxlIHRlbmQgdG8KIG5hdHVyYWxseSBncmF2aXRhdGUgYmFjayB0byB3aGF0IHRoZXkgYXJlIGdvb2QgYXQsIHNvIGl0J3Mgbm90IGxpa2UgeW91Ci1hcmUgZG9pbmcgc29tZXRoaW5nIGlycmV2ZXJzaWJsZSB3aGVuIHlvdSBfZG9fIHByb2QgdGhlbSBpbiBzb21lCithcmUgZG9pbmcgc29tZXRoaW5nIGlycmV2ZXJzaWJsZSB3aGVuIHlvdSAqKmRvKiogcHJvZCB0aGVtIGluIHNvbWUKIGRpcmVjdGlvbiwganVzdCBkb24ndCBwdXNoIHRvbyBoYXJkLgogCiAKLQkJQ2hhcHRlciA0OiBQbGFjaW5nIGJsYW1lCis0KSBQbGFjaW5nIGJsYW1lCistLS0tLS0tLS0tLS0tLS0tCiAKIFRoaW5ncyB3aWxsIGdvIHdyb25nLCBhbmQgcGVvcGxlIHdhbnQgc29tZWJvZHkgdG8gYmxhbWUuIFRhZywgeW91J3JlIGl0LgogCiBJdCdzIG5vdCBhY3R1YWxseSB0aGF0IGhhcmQgdG8gYWNjZXB0IHRoZSBibGFtZSwgZXNwZWNpYWxseSBpZiBwZW9wbGUKLWtpbmQgb2YgcmVhbGl6ZSB0aGF0IGl0IHdhc24ndCBfYWxsXyB5b3VyIGZhdWx0LiAgV2hpY2ggYnJpbmdzIHVzIHRvIHRoZQora2luZCBvZiByZWFsaXplIHRoYXQgaXQgd2Fzbid0ICoqYWxsKiogeW91ciBmYXVsdC4gIFdoaWNoIGJyaW5ncyB1cyB0byB0aGUKIGJlc3Qgd2F5IG9mIHRha2luZyB0aGUgYmxhbWU6IGRvIGl0IGZvciBhbm90aGVyIGd1eS4gWW91J2xsIGZlZWwgZ29vZAogZm9yIHRha2luZyB0aGUgZmFsbCwgaGUnbGwgZmVlbCBnb29kIGFib3V0IG5vdCBnZXR0aW5nIGJsYW1lZCwgYW5kIHRoZQogZ3V5IHdobyBsb3N0IGhpcyB3aG9sZSAzNkdCIHBvcm4tY29sbGVjdGlvbiBiZWNhdXNlIG9mIHlvdXIgaW5jb21wZXRlbmNlCiB3aWxsIGdydWRnaW5nbHkgYWRtaXQgdGhhdCB5b3UgYXQgbGVhc3QgZGlkbid0IHRyeSB0byB3ZWFzZWwgb3V0IG9mIGl0LgogCiBUaGVuIG1ha2UgdGhlIGRldmVsb3BlciB3aG8gcmVhbGx5IHNjcmV3ZWQgdXAgKGlmIHlvdSBjYW4gZmluZCBoaW0pIGtub3cKLV9pbl9wcml2YXRlXyB0aGF0IGhlIHNjcmV3ZWQgdXAuICBOb3QganVzdCBzbyBoZSBjYW4gYXZvaWQgaXQgaW4gdGhlCisqKmluX3ByaXZhdGUqKiB0aGF0IGhlIHNjcmV3ZWQgdXAuICBOb3QganVzdCBzbyBoZSBjYW4gYXZvaWQgaXQgaW4gdGhlCiBmdXR1cmUsIGJ1dCBzbyB0aGF0IGhlIGtub3dzIGhlIG93ZXMgeW91IG9uZS4gIEFuZCwgcGVyaGFwcyBldmVuIG1vcmUKIGltcG9ydGFudGx5LCBoZSdzIGFsc28gbGlrZWx5IHRoZSBwZXJzb24gd2hvIGNhbiBmaXggaXQuICBCZWNhdXNlLCBsZXQncwotZmFjZSBpdCwgaXQgc3VyZSBhaW4ndCB5b3UuIAorZmFjZSBpdCwgaXQgc3VyZSBhaW4ndCB5b3UuCiAKLVRha2luZyB0aGUgYmxhbWUgaXMgYWxzbyB3aHkgeW91IGdldCB0byBiZSBtYW5hZ2VyIGluIHRoZSBmaXJzdCBwbGFjZS4gCitUYWtpbmcgdGhlIGJsYW1lIGlzIGFsc28gd2h5IHlvdSBnZXQgdG8gYmUgbWFuYWdlciBpbiB0aGUgZmlyc3QgcGxhY2UuCiBJdCdzIHBhcnQgb2Ygd2hhdCBtYWtlcyBwZW9wbGUgdHJ1c3QgeW91LCBhbmQgYWxsb3cgeW91IHRoZSBwb3RlbnRpYWwKIGdsb3J5LCBiZWNhdXNlIHlvdSdyZSB0aGUgb25lIHdobyBnZXRzIHRvIHNheSAiSSBzY3Jld2VkIHVwIi4gIEFuZCBpZgogeW91J3ZlIGZvbGxvd2VkIHRoZSBwcmV2aW91cyBydWxlcywgeW91J2xsIGJlIHByZXR0eSBnb29kIGF0IHNheWluZyB0aGF0Ci1ieSBub3cuIAorYnkgbm93LgogCiAKLQkJQ2hhcHRlciA1OiBUaGluZ3MgdG8gYXZvaWQKKzUpIFRoaW5ncyB0byBhdm9pZAorLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZXJlJ3Mgb25lIHRoaW5nIHBlb3BsZSBoYXRlIGV2ZW4gbW9yZSB0aGFuIGJlaW5nIGNhbGxlZCAiZCpja2hlYWQiLAogYW5kIHRoYXQgaXMgYmVpbmcgY2FsbGVkIGEgImQqY2toZWFkIiBpbiBhIHNhbmN0aW1vbmlvdXMgdm9pY2UuICBUaGUKIGZpcnN0IHlvdSBjYW4gYXBvbG9naXplIGZvciwgdGhlIHNlY29uZCBvbmUgeW91IHdvbid0IHJlYWxseSBnZXQgdGhlCiBjaGFuY2UuICBUaGV5IGxpa2VseSB3aWxsIG5vIGxvbmdlciBiZSBsaXN0ZW5pbmcgZXZlbiBpZiB5b3Ugb3RoZXJ3aXNlCi1kbyBhIGdvb2Qgam9iLiAKK2RvIGEgZ29vZCBqb2IuCiAKIFdlIGFsbCB0aGluayB3ZSdyZSBiZXR0ZXIgdGhhbiBhbnlib2R5IGVsc2UsIHdoaWNoIG1lYW5zIHRoYXQgd2hlbgotc29tZWJvZHkgZWxzZSBwdXRzIG9uIGFpcnMsIGl0IF9yZWFsbHlfIHJ1YnMgdXMgdGhlIHdyb25nIHdheS4gIFlvdSBtYXkKK3NvbWVib2R5IGVsc2UgcHV0cyBvbiBhaXJzLCBpdCAqKnJlYWxseSoqIHJ1YnMgdXMgdGhlIHdyb25nIHdheS4gIFlvdSBtYXkKIGJlIG1vcmFsbHkgYW5kIGludGVsbGVjdHVhbGx5IHN1cGVyaW9yIHRvIGV2ZXJ5Ym9keSBhcm91bmQgeW91LCBidXQKLWRvbid0IHRyeSB0byBtYWtlIGl0IHRvbyBvYnZpb3VzIHVubGVzcyB5b3UgcmVhbGx5IF9pbnRlbmRfIHRvIGlycml0YXRlCi1zb21lYm9keSAoKikuIAorZG9uJ3QgdHJ5IHRvIG1ha2UgaXQgdG9vIG9idmlvdXMgdW5sZXNzIHlvdSByZWFsbHkgKippbnRlbmQqKiB0byBpcnJpdGF0ZQorc29tZWJvZHkgWyNmM11fLgogCiBTaW1pbGFybHksIGRvbid0IGJlIHRvbyBwb2xpdGUgb3Igc3VidGxlIGFib3V0IHRoaW5ncy4gUG9saXRlbmVzcyBlYXNpbHkKIGVuZHMgdXAgZ29pbmcgb3ZlcmJvYXJkIGFuZCBoaWRpbmcgdGhlIHByb2JsZW0sIGFuZCBhcyB0aGV5IHNheSwgIk9uIHRoZQpAQCAtMjUxLDE1ICsyNjIsMTYgQEAKIG92ZXJib2FyZCB0byB0aGUgcG9pbnQgb2YgYmVpbmcgcmlkaWN1bG91cyBjYW4gZHJpdmUgYSBwb2ludCBob21lCiB3aXRob3V0IG1ha2luZyBpdCBwYWluZnVsIHRvIHRoZSByZWNpcGllbnQsIHdobyBqdXN0IHRoaW5rcyB5b3UncmUgYmVpbmcKIHNpbGx5LiAgSXQgY2FuIHRodXMgaGVscCBnZXQgdGhyb3VnaCB0aGUgcGVyc29uYWwgbWVudGFsIGJsb2NrIHdlIGFsbAotaGF2ZSBhYm91dCBjcml0aWNpc20uIAoraGF2ZSBhYm91dCBjcml0aWNpc20uCiAKLSgqKSBIaW50OiBpbnRlcm5ldCBuZXdzZ3JvdXBzIHRoYXQgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIHlvdXIgd29yawotYXJlIGdyZWF0IHdheXMgdG8gdGFrZSBvdXQgeW91ciBmcnVzdHJhdGlvbnMgYXQgb3RoZXIgcGVvcGxlLiBXcml0ZQotaW5zdWx0aW5nIHBvc3RzIHdpdGggYSBzbmVlciBqdXN0IHRvIGdldCBpbnRvIGEgZ29vZCBmbGFtZSBldmVyeSBvbmNlIGluCi1hIHdoaWxlLCBhbmQgeW91J2xsIGZlZWwgY2xlYW5zZWQuIEp1c3QgZG9uJ3QgY3JhcCB0b28gY2xvc2UgdG8gaG9tZS4KKy4uIFsjZjNdIEhpbnQ6IGludGVybmV0IG5ld3Nncm91cHMgdGhhdCBhcmUgbm90IGRpcmVjdGx5IHJlbGF0ZWQgdG8geW91ciB3b3JrCisgIGFyZSBncmVhdCB3YXlzIHRvIHRha2Ugb3V0IHlvdXIgZnJ1c3RyYXRpb25zIGF0IG90aGVyIHBlb3BsZS4gV3JpdGUKKyAgaW5zdWx0aW5nIHBvc3RzIHdpdGggYSBzbmVlciBqdXN0IHRvIGdldCBpbnRvIGEgZ29vZCBmbGFtZSBldmVyeSBvbmNlIGluCisgIGEgd2hpbGUsIGFuZCB5b3UnbGwgZmVlbCBjbGVhbnNlZC4gSnVzdCBkb24ndCBjcmFwIHRvbyBjbG9zZSB0byBob21lLgogCiAKLQkJQ2hhcHRlciA2OiBXaHkgbWU/Cis2KSBXaHkgbWU/CistLS0tLS0tLS0tCiAKIFNpbmNlIHlvdXIgbWFpbiByZXNwb25zaWJpbGl0eSBzZWVtcyB0byBiZSB0byB0YWtlIHRoZSBibGFtZSBmb3Igb3RoZXIKIHBlb3BsZXMgbWlzdGFrZXMsIGFuZCBtYWtlIGl0IHBhaW5mdWxseSBvYnZpb3VzIHRvIGV2ZXJ5Ym9keSBlbHNlIHRoYXQKQEAgLTI2OCw5ICsyODAsOSBAQAogCiBGaXJzdCBvZmYsIHdoaWxlIHlvdSBtYXkgb3IgbWF5IG5vdCBnZXQgc2NyZWFtaW5nIHRlZW5hZ2UgZ2lybHMgKG9yCiBib3lzLCBsZXQncyBub3QgYmUganVkZ21lbnRhbCBvciBzZXhpc3QgaGVyZSkga25vY2tpbmcgb24geW91ciBkcmVzc2luZwotcm9vbSBkb29yLCB5b3UgX3dpbGxfIGdldCBhbiBpbW1lbnNlIGZlZWxpbmcgb2YgcGVyc29uYWwgYWNjb21wbGlzaG1lbnQKK3Jvb20gZG9vciwgeW91ICoqd2lsbCoqIGdldCBhbiBpbW1lbnNlIGZlZWxpbmcgb2YgcGVyc29uYWwgYWNjb21wbGlzaG1lbnQKIGZvciBiZWluZyAiaW4gY2hhcmdlIi4gIE5ldmVyIG1pbmQgdGhlIGZhY3QgdGhhdCB5b3UncmUgcmVhbGx5IGxlYWRpbmcKIGJ5IHRyeWluZyB0byBrZWVwIHVwIHdpdGggZXZlcnlib2R5IGVsc2UgYW5kIHJ1bm5pbmcgYWZ0ZXIgdGhlbSBhcyBmYXN0Ci1hcyB5b3UgY2FuLiAgRXZlcnlib2R5IHdpbGwgc3RpbGwgdGhpbmsgeW91J3JlIHRoZSBwZXJzb24gaW4gY2hhcmdlLiAKK2FzIHlvdSBjYW4uICBFdmVyeWJvZHkgd2lsbCBzdGlsbCB0aGluayB5b3UncmUgdGhlIHBlcnNvbiBpbiBjaGFyZ2UuCiAKIEl0J3MgYSBncmVhdCBqb2IgaWYgeW91IGNhbiBoYWNrIGl0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dCBiL0RvY3VtZW50YXRpb24vUENJL3BjaS50eHQKaW5kZXggMTIzODgxZi4uNzdmNDlkYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1BDSS9wY2kudHh0CkBAIC0xMjQsNyArMTI0LDYgQEAKIAogVGhlIElEIHRhYmxlIGlzIGFuIGFycmF5IG9mIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGVudHJpZXMgZW5kaW5nIHdpdGggYW4KIGFsbC16ZXJvIGVudHJ5LiAgRGVmaW5pdGlvbnMgd2l0aCBzdGF0aWMgY29uc3QgYXJlIGdlbmVyYWxseSBwcmVmZXJyZWQuCi1Vc2Ugb2YgdGhlIGRlcHJlY2F0ZWQgbWFjcm8gREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUgc2hvdWxkIGJlIGF2b2lkZWQuCiAKIEVhY2ggZW50cnkgY29uc2lzdHMgb2Y6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUENJL3BjaWVhZXItaG93dG8udHh0IGIvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpZWFlci1ob3d0by50eHQKaW5kZXggYjQ5ODdjMC4uZWE4Y2FmYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpZWFlci1ob3d0by50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpZWFlci1ob3d0by50eHQKQEAgLTQ5LDI1ICs0OSwxNyBAQAogQ09ORklHX1BDSUVBRVIgPSB5LgogCiAyLjIgTG9hZCBQQ0kgRXhwcmVzcyBBRVIgUm9vdCBEcml2ZXIKLVRoZXJlIGlzIGEgY2FzZSB3aGVyZSBhIHN5c3RlbSBoYXMgQUVSIHN1cHBvcnQgaW4gQklPUy4gRW5hYmxpbmcgdGhlIEFFUgotUm9vdCBkcml2ZXIgYW5kIGhhdmluZyBBRVIgc3VwcG9ydCBpbiBCSU9TIG1heSByZXN1bHQgdW5wcmVkaWN0YWJsZQotYmVoYXZpb3IuIFRvIGF2b2lkIHRoaXMgY29uZmxpY3QsIGEgc3VjY2Vzc2Z1bCBsb2FkIG9mIHRoZSBBRVIgUm9vdCBkcml2ZXIKLXJlcXVpcmVzIEFDUEkgX09TQyBzdXBwb3J0IGluIHRoZSBCSU9TIHRvIGFsbG93IHRoZSBBRVIgUm9vdCBkcml2ZXIgdG8KLXJlcXVlc3QgZm9yIG5hdGl2ZSBjb250cm9sIG9mIEFFUi4gU2VlIHRoZSBQQ0kgRlcgMy4wIFNwZWNpZmljYXRpb24gZm9yCi1kZXRhaWxzIHJlZ2FyZGluZyBPU0MgdXNhZ2UuIEN1cnJlbnRseSwgbG90cyBvZiBmaXJtd2FyZXMgZG9uJ3QgcHJvdmlkZQotX09TQyBzdXBwb3J0IHdoaWxlIHRoZXkgdXNlIFBDSSBFeHByZXNzLiBUbyBzdXBwb3J0IHN1Y2ggZmlybXdhcmVzLAotZm9yY2Vsb2FkLCBhIHBhcmFtZXRlciBvZiB0eXBlIGJvb2wsIGNvdWxkIGVuYWJsZSBBRVIgdG8gY29udGludWUgdG8KLWJlIGluaXRpYXRlZCBhbHRob3VnaCBmaXJtd2FyZXMgaGF2ZSBubyBfT1NDIHN1cHBvcnQuIFRvIGVuYWJsZSB0aGUKLXdhbGthcm91bmQsIHBscy4gYWRkIGFlcmRyaXZlci5mb3JjZWxvYWQ9eSB0byBrZXJuZWwgYm9vdCBwYXJhbWV0ZXIgbGluZQotd2hlbiBib290aW5nIGtlcm5lbC4gTm90ZSB0aGF0IGZvcmNlbG9hZD1uIGJ5IGRlZmF1bHQuCiAKLW5vc291cmNlaWQsIGFub3RoZXIgcGFyYW1ldGVyIG9mIHR5cGUgYm9vbCwgY2FuIGJlIHVzZWQgd2hlbiBicm9rZW4KLWhhcmR3YXJlIChtb3N0bHkgY2hpcHNldHMpIGhhcyByb290IHBvcnRzIHRoYXQgY2Fubm90IG9idGFpbiB0aGUgcmVwb3J0aW5nCi1zb3VyY2UgSUQuIG5vc291cmNlaWQ9biBieSBkZWZhdWx0LgorU29tZSBzeXN0ZW1zIGhhdmUgQUVSIHN1cHBvcnQgaW4gZmlybXdhcmUuIEVuYWJsaW5nIExpbnV4IEFFUiBzdXBwb3J0IGF0Cit0aGUgc2FtZSB0aW1lIHRoZSBmaXJtd2FyZSBoYW5kbGVzIEFFUiBtYXkgcmVzdWx0IGluIHVucHJlZGljdGFibGUKK2JlaGF2aW9yLiBUaGVyZWZvcmUsIExpbnV4IGRvZXMgbm90IGhhbmRsZSBBRVIgZXZlbnRzIHVubGVzcyB0aGUgZmlybXdhcmUKK2dyYW50cyBBRVIgY29udHJvbCB0byB0aGUgT1MgdmlhIHRoZSBBQ1BJIF9PU0MgbWV0aG9kLiBTZWUgdGhlIFBDSSBGVyAzLjAKK1NwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgcmVnYXJkaW5nIF9PU0MgdXNhZ2UuCiAKIDIuMyBBRVIgZXJyb3Igb3V0cHV0Ci1XaGVuIGEgUENJLUUgQUVSIGVycm9yIGlzIGNhcHR1cmVkLCBhbiBlcnJvciBtZXNzYWdlIHdpbGwgYmUgb3V0cHV0dGVkIHRvCi1jb25zb2xlLiBJZiBpdCdzIGEgY29ycmVjdGFibGUgZXJyb3IsIGl0IGlzIG91dHB1dHRlZCBhcyBhIHdhcm5pbmcuCisKK1doZW4gYSBQQ0llIEFFUiBlcnJvciBpcyBjYXB0dXJlZCwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIG91dHB1dCB0bworY29uc29sZS4gSWYgaXQncyBhIGNvcnJlY3RhYmxlIGVycm9yLCBpdCBpcyBvdXRwdXQgYXMgYSB3YXJuaW5nLgogT3RoZXJ3aXNlLCBpdCBpcyBwcmludGVkIGFzIGFuIGVycm9yLiBTbyB1c2VycyBjb3VsZCBjaG9vc2UgZGlmZmVyZW50CiBsb2cgbGV2ZWwgdG8gZmlsdGVyIG91dCBjb3JyZWN0YWJsZSBlcnJvciBtZXNzYWdlcy4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMuaHRtbCBiL0RvY3VtZW50YXRpb24vUkNVL0Rlc2lnbi9SZXF1aXJlbWVudHMvUmVxdWlyZW1lbnRzLmh0bWwKaW5kZXggZWNlNDEwZi4uYTRkMzgzOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvRGVzaWduL1JlcXVpcmVtZW50cy9SZXF1aXJlbWVudHMuaHRtbAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS9EZXNpZ24vUmVxdWlyZW1lbnRzL1JlcXVpcmVtZW50cy5odG1sCkBAIC0yNDkzLDYgKzI0OTMsMjggQEAKIHZhcmlhbnQgb2YgPHR0PmNhbGxfcmN1KCk8L3R0PiB0aGF0IG1pZ2h0IG9uZSBkYXkgYmUgY3JlYXRlZCBmb3IKIGVuZXJneS1lZmZpY2llbmN5IHB1cnBvc2VzLgogCis8cD4KK1RoYXQgc2FpZCwgdGhlcmUgYXJlIGxpbWl0cy4KK1JDVSByZXF1aXJlcyB0aGF0IHRoZSA8dHQ+cmN1X2hlYWQ8L3R0PiBzdHJ1Y3R1cmUgYmUgYWxpZ25lZCB0byBhCit0d28tYnl0ZSBib3VuZGFyeSwgYW5kIHBhc3NpbmcgYSBtaXNhbGlnbmVkIDx0dD5yY3VfaGVhZDwvdHQ+CitzdHJ1Y3R1cmUgdG8gb25lIG9mIHRoZSA8dHQ+Y2FsbF9yY3UoKTwvdHQ+IGZhbWlseSBvZiBmdW5jdGlvbnMKK3dpbGwgcmVzdWx0IGluIGEgc3BsYXQuCitJdCBpcyB0aGVyZWZvcmUgbmVjZXNzYXJ5IHRvIGV4ZXJjaXNlIGNhdXRpb24gd2hlbiBwYWNraW5nCitzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgZmllbGRzIG9mIHR5cGUgPHR0PnJjdV9oZWFkPC90dD4uCitXaHkgbm90IGEgZm91ci1ieXRlIG9yIGV2ZW4gZWlnaHQtYnl0ZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQ/CitCZWNhdXNlIHRoZSBtNjhrIGFyY2hpdGVjdHVyZSBwcm92aWRlcyBvbmx5IHR3by1ieXRlIGFsaWdubWVudCwKK2FuZCB0aHVzIGFjdHMgYXMgYWxpZ25tZW50J3MgbGVhc3QgY29tbW9uIGRlbm9taW5hdG9yLgorCis8cD4KK1RoZSByZWFzb24gZm9yIHJlc2VydmluZyB0aGUgYm90dG9tIGJpdCBvZiBwb2ludGVycyB0bworPHR0PnJjdV9oZWFkPC90dD4gc3RydWN0dXJlcyBpcyB0byBsZWF2ZSB0aGUgZG9vciBvcGVuIHRvCismbGRxdW87bGF6eSZyZHF1bzsgY2FsbGJhY2tzIHdob3NlIGludm9jYXRpb25zIGNhbiBzYWZlbHkgYmUgZGVmZXJyZWQuCitEZWZlcnJpbmcgaW52b2NhdGlvbiBjb3VsZCBwb3RlbnRpYWxseSBoYXZlIGVuZXJneS1lZmZpY2llbmN5CitiZW5lZml0cywgYnV0IG9ubHkgaWYgdGhlIHJhdGUgb2Ygbm9uLWxhenkgY2FsbGJhY2tzIGRlY3JlYXNlcworc2lnbmlmaWNhbnRseSBmb3Igc29tZSBpbXBvcnRhbnQgd29ya2xvYWQuCitJbiB0aGUgbWVhbnRpbWUsIHJlc2VydmluZyB0aGUgYm90dG9tIGJpdCBrZWVwcyB0aGlzIG9wdGlvbiBvcGVuCitpbiBjYXNlIGl0IG9uZSBkYXkgYmVjb21lcyB1c2VmdWwuCisKIDxoMz48YSBuYW1lPSJQZXJmb3JtYW5jZSwgU2NhbGFiaWxpdHksIFJlc3BvbnNlIFRpbWUsIGFuZCBSZWxpYWJpbGl0eSI+CiBQZXJmb3JtYW5jZSwgU2NhbGFiaWxpdHksIFJlc3BvbnNlIFRpbWUsIGFuZCBSZWxpYWJpbGl0eTwvYT48L2gzPgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS90b3J0dXJlLnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL3RvcnR1cmUudHh0CmluZGV4IDExOGU3YzEuLjI3OGY2YTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUkNVL3RvcnR1cmUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3RvcnR1cmUudHh0CkBAIC0xMCwyMSArMTAsNiBAQAogY29tbWFuZCAocGVyaGFwcyBncmVwcGluZyBmb3IgInRvcnR1cmUiKS4gIFRoZSB0ZXN0IGlzIHN0YXJ0ZWQKIHdoZW4gdGhlIG1vZHVsZSBpcyBsb2FkZWQsIGFuZCBzdG9wcyB3aGVuIHRoZSBtb2R1bGUgaXMgdW5sb2FkZWQuCiAKLUNPTkZJR19SQ1VfVE9SVFVSRV9URVNUX1JVTk5BQkxFCi0KLUl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVD15LCB3aGljaCB3aWxsCi1yZXN1bHQgaW4gdGhlIHRlc3RzIGJlaW5nIGxvYWRlZCBpbnRvIHRoZSBiYXNlIGtlcm5lbC4gIEluIHRoaXMgY2FzZSwKLXRoZSBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVF9SVU5OQUJMRSBjb25maWcgb3B0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeQotd2hldGhlciB0aGUgUkNVIHRvcnR1cmUgdGVzdHMgYXJlIHRvIGJlIHN0YXJ0ZWQgaW1tZWRpYXRlbHkgZHVyaW5nCi1ib290IG9yIHdoZXRoZXIgdGhlIC9wcm9jL3N5cy9rZXJuZWwvcmN1dG9ydHVyZV9ydW5uYWJsZSBmaWxlIGlzIHVzZWQKLXRvIGVuYWJsZSB0aGVtLiAgVGhpcyAvcHJvYyBmaWxlIGNhbiBiZSB1c2VkIHRvIHJlcGVhdGVkbHkgcGF1c2UgYW5kCi1yZXN0YXJ0IHRoZSB0ZXN0cywgcmVnYXJkbGVzcyBvZiB0aGUgaW5pdGlhbCBzdGF0ZSBzcGVjaWZpZWQgYnkgdGhlCi1DT05GSUdfUkNVX1RPUlRVUkVfVEVTVF9SVU5OQUJMRSBjb25maWcgb3B0aW9uLgotCi1Zb3Ugd2lsbCBub3JtYWxseSAtbm90LSB3YW50IHRvIHN0YXJ0IHRoZSBSQ1UgdG9ydHVyZSB0ZXN0cyBkdXJpbmcgYm9vdAotKGFuZCB0aHVzIHRoZSBkZWZhdWx0IGlzIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUX1JVTk5BQkxFPW4pLCBidXQgZG9pbmcKLXRoaXMgY2FuIHNvbWV0aW1lcyBiZSB1c2VmdWwgaW4gZmluZGluZyBib290LXRpbWUgYnVncy4KLQogCiBNT0RVTEUgUEFSQU1FVEVSUwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1NlY3VyaXR5QnVncyBiL0RvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzCmluZGV4IGE2NjBkNDkuLjM0MmQ3NjkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzCisrKyBiL0RvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzCkBAIC0xLDkgKzEsMTUgQEAKKy4uIF9zZWN1cml0eWJ1Z3M6CisKK1NlY3VyaXR5IGJ1Z3MKKz09PT09PT09PT09PT0KKwogTGludXgga2VybmVsIGRldmVsb3BlcnMgdGFrZSBzZWN1cml0eSB2ZXJ5IHNlcmlvdXNseS4gIEFzIHN1Y2gsIHdlJ2QKIGxpa2UgdG8ga25vdyB3aGVuIGEgc2VjdXJpdHkgYnVnIGlzIGZvdW5kIHNvIHRoYXQgaXQgY2FuIGJlIGZpeGVkIGFuZAogZGlzY2xvc2VkIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuICBQbGVhc2UgcmVwb3J0IHNlY3VyaXR5IGJ1Z3MgdG8gdGhlCiBMaW51eCBrZXJuZWwgc2VjdXJpdHkgdGVhbS4KIAogMSkgQ29udGFjdAorLS0tLS0tLS0tLQogCiBUaGUgTGludXgga2VybmVsIHNlY3VyaXR5IHRlYW0gY2FuIGJlIGNvbnRhY3RlZCBieSBlbWFpbCBhdAogPHNlY3VyaXR5QGtlcm5lbC5vcmc+LiAgVGhpcyBpcyBhIHByaXZhdGUgbGlzdCBvZiBzZWN1cml0eSBvZmZpY2VycwpAQCAtMTgsNiArMjQsNyBAQAogY29uc2VudCBmcm9tIHRoZSByZXBvcnRlciB1bmxlc3MgaXQgaGFzIGFscmVhZHkgYmVlbiBtYWRlIHB1YmxpYy4KIAogMikgRGlzY2xvc3VyZQorLS0tLS0tLS0tLS0tLQogCiBUaGUgZ29hbCBvZiB0aGUgTGludXgga2VybmVsIHNlY3VyaXR5IHRlYW0gaXMgdG8gd29yayB3aXRoIHRoZQogYnVnIHN1Ym1pdHRlciB0byBidWcgcmVzb2x1dGlvbiBhcyB3ZWxsIGFzIGRpc2Nsb3N1cmUuICBXZSBwcmVmZXIKQEAgLTMzLDYgKzQwLDcgQEAKIGRpc2Nsb3N1cmUgZGF0ZSB0byBiZSBvbiB0aGUgb3JkZXIgb2YgNyBkYXlzLgogCiAzKSBOb24tZGlzY2xvc3VyZSBhZ3JlZW1lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZSBMaW51eCBrZXJuZWwgc2VjdXJpdHkgdGVhbSBpcyBub3QgYSBmb3JtYWwgYm9keSBhbmQgdGhlcmVmb3JlIHVuYWJsZQogdG8gZW50ZXIgYW55IG5vbi1kaXNjbG9zdXJlIGFncmVlbWVudHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdCBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CmluZGV4IDJiN2UzMmQuLjg5NDI4OWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0CkBAIC0xLDEwOSArMSwxMjAgQEAKKy4uIF9zdWJtaXRjaGVja2xpc3Q6CisKIExpbnV4IEtlcm5lbCBwYXRjaCBzdWJtaXNzaW9uIGNoZWNrbGlzdAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogCiBIZXJlIGFyZSBzb21lIGJhc2ljIHRoaW5ncyB0aGF0IGRldmVsb3BlcnMgc2hvdWxkIGRvIGlmIHRoZXkgd2FudCB0byBzZWUgdGhlaXIKIGtlcm5lbCBwYXRjaCBzdWJtaXNzaW9ucyBhY2NlcHRlZCBtb3JlIHF1aWNrbHkuCiAKIFRoZXNlIGFyZSBhbGwgYWJvdmUgYW5kIGJleW9uZCB0aGUgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIHByb3ZpZGVkIGluCi1Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIGFuZCBlbHNld2hlcmUgcmVnYXJkaW5nIHN1Ym1pdHRpbmcgTGludXgKLWtlcm5lbCBwYXRjaGVzLgorOnJlZjpgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyA8c3VibWl0dGluZ3BhdGNoZXM+YAorYW5kIGVsc2V3aGVyZSByZWdhcmRpbmcgc3VibWl0dGluZyBMaW51eCBrZXJuZWwgcGF0Y2hlcy4KIAogCi0xOiBJZiB5b3UgdXNlIGEgZmFjaWxpdHkgdGhlbiAjaW5jbHVkZSB0aGUgZmlsZSB0aGF0IGRlZmluZXMvZGVjbGFyZXMKKzEpIElmIHlvdSB1c2UgYSBmYWNpbGl0eSB0aGVuICNpbmNsdWRlIHRoZSBmaWxlIHRoYXQgZGVmaW5lcy9kZWNsYXJlcwogICAgdGhhdCBmYWNpbGl0eS4gIERvbid0IGRlcGVuZCBvbiBvdGhlciBoZWFkZXIgZmlsZXMgcHVsbGluZyBpbiBvbmVzCiAgICB0aGF0IHlvdSB1c2UuCiAKLTI6IEJ1aWxkcyBjbGVhbmx5IHdpdGggYXBwbGljYWJsZSBvciBtb2RpZmllZCBDT05GSUcgb3B0aW9ucyA9eSwgPW0sIGFuZAotICAgPW4uICBObyBnY2Mgd2FybmluZ3MvZXJyb3JzLCBubyBsaW5rZXIgd2FybmluZ3MvZXJyb3JzLgorMikgQnVpbGRzIGNsZWFubHk6CiAKLTJiOiBQYXNzZXMgYWxsbm9jb25maWcsIGFsbG1vZGNvbmZpZworICBhKSB3aXRoIGFwcGxpY2FibGUgb3IgbW9kaWZpZWQgYGBDT05GSUdgYCBvcHRpb25zIGBgPXlgYCwgYGA9bWBgLCBhbmQKKyAgICAgYGA9bmBgLiAgTm8gYGBnY2NgYCB3YXJuaW5ncy9lcnJvcnMsIG5vIGxpbmtlciB3YXJuaW5ncy9lcnJvcnMuCiAKLTJjOiBCdWlsZHMgc3VjY2Vzc2Z1bGx5IHdoZW4gdXNpbmcgTz1idWlsZGRpcgorICBiKSBQYXNzZXMgYGBhbGxub2NvbmZpZ2BgLCBgYGFsbG1vZGNvbmZpZ2BgCiAKLTM6IEJ1aWxkcyBvbiBtdWx0aXBsZSBDUFUgYXJjaGl0ZWN0dXJlcyBieSB1c2luZyBsb2NhbCBjcm9zcy1jb21waWxlIHRvb2xzCisgIGMpIEJ1aWxkcyBzdWNjZXNzZnVsbHkgd2hlbiB1c2luZyBgYE89YnVpbGRkaXJgYAorCiszKSBCdWlsZHMgb24gbXVsdGlwbGUgQ1BVIGFyY2hpdGVjdHVyZXMgYnkgdXNpbmcgbG9jYWwgY3Jvc3MtY29tcGlsZSB0b29scwogICAgb3Igc29tZSBvdGhlciBidWlsZCBmYXJtLgogCi00OiBwcGM2NCBpcyBhIGdvb2QgYXJjaGl0ZWN0dXJlIGZvciBjcm9zcy1jb21waWxhdGlvbiBjaGVja2luZyBiZWNhdXNlIGl0Ci0gICB0ZW5kcyB0byB1c2UgYHVuc2lnbmVkIGxvbmcnIGZvciA2NC1iaXQgcXVhbnRpdGllcy4KKzQpIHBwYzY0IGlzIGEgZ29vZCBhcmNoaXRlY3R1cmUgZm9yIGNyb3NzLWNvbXBpbGF0aW9uIGNoZWNraW5nIGJlY2F1c2UgaXQKKyAgIHRlbmRzIHRvIHVzZSBgYHVuc2lnbmVkIGxvbmdgYCBmb3IgNjQtYml0IHF1YW50aXRpZXMuCiAKLTU6IENoZWNrIHlvdXIgcGF0Y2ggZm9yIGdlbmVyYWwgc3R5bGUgYXMgZGV0YWlsZWQgaW4KLSAgIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUuICBDaGVjayBmb3IgdHJpdmlhbCB2aW9sYXRpb25zIHdpdGggdGhlCi0gICBwYXRjaCBzdHlsZSBjaGVja2VyIHByaW9yIHRvIHN1Ym1pc3Npb24gKHNjcmlwdHMvY2hlY2twYXRjaC5wbCkuCis1KSBDaGVjayB5b3VyIHBhdGNoIGZvciBnZW5lcmFsIHN0eWxlIGFzIGRldGFpbGVkIGluCisgICA6cmVmOmBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIDxjb2RpbmdzdHlsZT5gLgorICAgQ2hlY2sgZm9yIHRyaXZpYWwgdmlvbGF0aW9ucyB3aXRoIHRoZSBwYXRjaCBzdHlsZSBjaGVja2VyIHByaW9yIHRvCisgICBzdWJtaXNzaW9uIChgYHNjcmlwdHMvY2hlY2twYXRjaC5wbGBgKS4KICAgIFlvdSBzaG91bGQgYmUgYWJsZSB0byBqdXN0aWZ5IGFsbCB2aW9sYXRpb25zIHRoYXQgcmVtYWluIGluCiAgICB5b3VyIHBhdGNoLgogCi02OiBBbnkgbmV3IG9yIG1vZGlmaWVkIENPTkZJRyBvcHRpb25zIGRvbid0IG11Y2sgdXAgdGhlIGNvbmZpZyBtZW51LgorNikgQW55IG5ldyBvciBtb2RpZmllZCBgYENPTkZJR2BgIG9wdGlvbnMgZG9uJ3QgbXVjayB1cCB0aGUgY29uZmlnIG1lbnUuCiAKLTc6IEFsbCBuZXcgS2NvbmZpZyBvcHRpb25zIGhhdmUgaGVscCB0ZXh0LgorNykgQWxsIG5ldyBgYEtjb25maWdgYCBvcHRpb25zIGhhdmUgaGVscCB0ZXh0LgogCi04OiBIYXMgYmVlbiBjYXJlZnVsbHkgcmV2aWV3ZWQgd2l0aCByZXNwZWN0IHRvIHJlbGV2YW50IEtjb25maWcKKzgpIEhhcyBiZWVuIGNhcmVmdWxseSByZXZpZXdlZCB3aXRoIHJlc3BlY3QgdG8gcmVsZXZhbnQgYGBLY29uZmlnYGAKICAgIGNvbWJpbmF0aW9ucy4gIFRoaXMgaXMgdmVyeSBoYXJkIHRvIGdldCByaWdodCB3aXRoIHRlc3RpbmcgLS0gYnJhaW5wb3dlcgogICAgcGF5cyBvZmYgaGVyZS4KIAotOTogQ2hlY2sgY2xlYW5seSB3aXRoIHNwYXJzZS4KKzkpIENoZWNrIGNsZWFubHkgd2l0aCBzcGFyc2UuCiAKLTEwOiBVc2UgJ21ha2UgY2hlY2tzdGFjaycgYW5kICdtYWtlIG5hbWVzcGFjZWNoZWNrJyBhbmQgZml4IGFueSBwcm9ibGVtcwotICAgIHRoYXQgdGhleSBmaW5kLiAgTm90ZTogY2hlY2tzdGFjayBkb2VzIG5vdCBwb2ludCBvdXQgcHJvYmxlbXMgZXhwbGljaXRseSwKLSAgICBidXQgYW55IG9uZSBmdW5jdGlvbiB0aGF0IHVzZXMgbW9yZSB0aGFuIDUxMiBieXRlcyBvbiB0aGUgc3RhY2sgaXMgYQotICAgIGNhbmRpZGF0ZSBmb3IgY2hhbmdlLgorMTApIFVzZSBgYG1ha2UgY2hlY2tzdGFja2BgIGFuZCBgYG1ha2UgbmFtZXNwYWNlY2hlY2tgYCBhbmQgZml4IGFueSBwcm9ibGVtcworICAgIHRoYXQgdGhleSBmaW5kLgogCi0xMTogSW5jbHVkZSBrZXJuZWwtZG9jIHRvIGRvY3VtZW50IGdsb2JhbCBrZXJuZWwgQVBJcy4gIChOb3QgcmVxdWlyZWQgZm9yCi0gICAgc3RhdGljIGZ1bmN0aW9ucywgYnV0IE9LIHRoZXJlIGFsc28uKSBVc2UgJ21ha2UgaHRtbGRvY3MnIG9yICdtYWtlCi0gICAgbWFuZG9jcycgdG8gY2hlY2sgdGhlIGtlcm5lbC1kb2MgYW5kIGZpeCBhbnkgaXNzdWVzLgorICAgIC4uIG5vdGU6OgogCi0xMjogSGFzIGJlZW4gdGVzdGVkIHdpdGggQ09ORklHX1BSRUVNUFQsIENPTkZJR19ERUJVR19QUkVFTVBULAotICAgIENPTkZJR19ERUJVR19TTEFCLCBDT05GSUdfREVCVUdfUEFHRUFMTE9DLCBDT05GSUdfREVCVUdfTVVURVhFUywKLSAgICBDT05GSUdfREVCVUdfU1BJTkxPQ0ssIENPTkZJR19ERUJVR19BVE9NSUNfU0xFRVAsIENPTkZJR19QUk9WRV9SQ1UKLSAgICBhbmQgQ09ORklHX0RFQlVHX09CSkVDVFNfUkNVX0hFQUQgYWxsIHNpbXVsdGFuZW91c2x5IGVuYWJsZWQuCisgICAgICAgYGBjaGVja3N0YWNrYGAgZG9lcyBub3QgcG9pbnQgb3V0IHByb2JsZW1zIGV4cGxpY2l0bHksCisgICAgICAgYnV0IGFueSBvbmUgZnVuY3Rpb24gdGhhdCB1c2VzIG1vcmUgdGhhbiA1MTIgYnl0ZXMgb24gdGhlIHN0YWNrIGlzIGEKKyAgICAgICBjYW5kaWRhdGUgZm9yIGNoYW5nZS4KIAotMTM6IEhhcyBiZWVuIGJ1aWxkLSBhbmQgcnVudGltZSB0ZXN0ZWQgd2l0aCBhbmQgd2l0aG91dCBDT05GSUdfU01QIGFuZAotICAgIENPTkZJR19QUkVFTVBULgorMTEpIEluY2x1ZGUgOnJlZjpga2VybmVsLWRvYyA8a2VybmVsX2RvYz5gIHRvIGRvY3VtZW50IGdsb2JhbCAga2VybmVsIEFQSXMuCisgICAgKE5vdCByZXF1aXJlZCBmb3Igc3RhdGljIGZ1bmN0aW9ucywgYnV0IE9LIHRoZXJlIGFsc28uKSBVc2UKKyAgICBgYG1ha2UgaHRtbGRvY3NgYCBvciBgYG1ha2UgcGRmZG9jc2BgIHRvIGNoZWNrIHRoZQorICAgIDpyZWY6YGtlcm5lbC1kb2MgPGtlcm5lbF9kb2M+YCBhbmQgZml4IGFueSBpc3N1ZXMuCiAKLTE0OiBJZiB0aGUgcGF0Y2ggYWZmZWN0cyBJTy9EaXNrLCBldGM6IGhhcyBiZWVuIHRlc3RlZCB3aXRoIGFuZCB3aXRob3V0Ci0gICAgQ09ORklHX0xCREFGLgorMTIpIEhhcyBiZWVuIHRlc3RlZCB3aXRoIGBgQ09ORklHX1BSRUVNUFRgYCwgYGBDT05GSUdfREVCVUdfUFJFRU1QVGBgLAorICAgIGBgQ09ORklHX0RFQlVHX1NMQUJgYCwgYGBDT05GSUdfREVCVUdfUEFHRUFMTE9DYGAsIGBgQ09ORklHX0RFQlVHX01VVEVYRVNgYCwKKyAgICBgYENPTkZJR19ERUJVR19TUElOTE9DS2BgLCBgYENPTkZJR19ERUJVR19BVE9NSUNfU0xFRVBgYCwKKyAgICBgYENPTkZJR19QUk9WRV9SQ1VgYCBhbmQgYGBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRGBgIGFsbAorICAgIHNpbXVsdGFuZW91c2x5IGVuYWJsZWQuCiAKLTE1OiBBbGwgY29kZXBhdGhzIGhhdmUgYmVlbiBleGVyY2lzZWQgd2l0aCBhbGwgbG9ja2RlcCBmZWF0dXJlcyBlbmFibGVkLgorMTMpIEhhcyBiZWVuIGJ1aWxkLSBhbmQgcnVudGltZSB0ZXN0ZWQgd2l0aCBhbmQgd2l0aG91dCBgYENPTkZJR19TTVBgYCBhbmQKKyAgICBgYENPTkZJR19QUkVFTVBULmBgCiAKLTE2OiBBbGwgbmV3IC9wcm9jIGVudHJpZXMgYXJlIGRvY3VtZW50ZWQgdW5kZXIgRG9jdW1lbnRhdGlvbi8KKzE0KSBJZiB0aGUgcGF0Y2ggYWZmZWN0cyBJTy9EaXNrLCBldGM6IGhhcyBiZWVuIHRlc3RlZCB3aXRoIGFuZCB3aXRob3V0CisgICAgYGBDT05GSUdfTEJEQUYuYGAKIAotMTc6IEFsbCBuZXcga2VybmVsIGJvb3QgcGFyYW1ldGVycyBhcmUgZG9jdW1lbnRlZCBpbgotICAgIERvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0LgorMTUpIEFsbCBjb2RlcGF0aHMgaGF2ZSBiZWVuIGV4ZXJjaXNlZCB3aXRoIGFsbCBsb2NrZGVwIGZlYXR1cmVzIGVuYWJsZWQuCiAKLTE4OiBBbGwgbmV3IG1vZHVsZSBwYXJhbWV0ZXJzIGFyZSBkb2N1bWVudGVkIHdpdGggTU9EVUxFX1BBUk1fREVTQygpCisxNikgQWxsIG5ldyBgYC9wcm9jYGAgZW50cmllcyBhcmUgZG9jdW1lbnRlZCB1bmRlciBgYERvY3VtZW50YXRpb24vYGAKIAotMTk6IEFsbCBuZXcgdXNlcnNwYWNlIGludGVyZmFjZXMgYXJlIGRvY3VtZW50ZWQgaW4gRG9jdW1lbnRhdGlvbi9BQkkvLgotICAgIFNlZSBEb2N1bWVudGF0aW9uL0FCSS9SRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisxNykgQWxsIG5ldyBrZXJuZWwgYm9vdCBwYXJhbWV0ZXJzIGFyZSBkb2N1bWVudGVkIGluCisgICAgYGBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dGBgLgorCisxOCkgQWxsIG5ldyBtb2R1bGUgcGFyYW1ldGVycyBhcmUgZG9jdW1lbnRlZCB3aXRoIGBgTU9EVUxFX1BBUk1fREVTQygpYGAKKworMTkpIEFsbCBuZXcgdXNlcnNwYWNlIGludGVyZmFjZXMgYXJlIGRvY3VtZW50ZWQgaW4gYGBEb2N1bWVudGF0aW9uL0FCSS9gYC4KKyAgICBTZWUgYGBEb2N1bWVudGF0aW9uL0FCSS9SRUFETUVgYCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICBQYXRjaGVzIHRoYXQgY2hhbmdlIHVzZXJzcGFjZSBpbnRlcmZhY2VzIHNob3VsZCBiZSBDQ2VkIHRvCiAgICAgbGludXgtYXBpQHZnZXIua2VybmVsLm9yZy4KIAotMjA6IENoZWNrIHRoYXQgaXQgYWxsIHBhc3NlcyBgbWFrZSBoZWFkZXJzX2NoZWNrJy4KKzIwKSBDaGVjayB0aGF0IGl0IGFsbCBwYXNzZXMgYGBtYWtlIGhlYWRlcnNfY2hlY2tgYC4KIAotMjE6IEhhcyBiZWVuIGNoZWNrZWQgd2l0aCBpbmplY3Rpb24gb2YgYXQgbGVhc3Qgc2xhYiBhbmQgcGFnZS1hbGxvY2F0aW9uCi0gICAgZmFpbHVyZXMuICBTZWUgRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vLgorMjEpIEhhcyBiZWVuIGNoZWNrZWQgd2l0aCBpbmplY3Rpb24gb2YgYXQgbGVhc3Qgc2xhYiBhbmQgcGFnZS1hbGxvY2F0aW9uCisgICAgZmFpbHVyZXMuICBTZWUgYGBEb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9gYC4KIAogICAgIElmIHRoZSBuZXcgY29kZSBpcyBzdWJzdGFudGlhbCwgYWRkaXRpb24gb2Ygc3Vic3lzdGVtLXNwZWNpZmljIGZhdWx0CiAgICAgaW5qZWN0aW9uIG1pZ2h0IGJlIGFwcHJvcHJpYXRlLgogCi0yMjogTmV3bHktYWRkZWQgY29kZSBoYXMgYmVlbiBjb21waWxlZCB3aXRoIGBnY2MgLVcnICh1c2UgIm1ha2UKLSAgICBFWFRSQV9DRkxBR1M9LVciKS4gIFRoaXMgd2lsbCBnZW5lcmF0ZSBsb3RzIG9mIG5vaXNlLCBidXQgaXMgZ29vZCBmb3IKLSAgICBmaW5kaW5nIGJ1Z3MgbGlrZSAid2FybmluZzogY29tcGFyaXNvbiBiZXR3ZWVuIHNpZ25lZCBhbmQgdW5zaWduZWQiLgorMjIpIE5ld2x5LWFkZGVkIGNvZGUgaGFzIGJlZW4gY29tcGlsZWQgd2l0aCBgYGdjYyAtV2BgICh1c2UKKyAgICBgYG1ha2UgRVhUUkFfQ0ZMQUdTPS1XYGApLiAgVGhpcyB3aWxsIGdlbmVyYXRlIGxvdHMgb2Ygbm9pc2UsIGJ1dCBpcyBnb29kCisgICAgZm9yIGZpbmRpbmcgYnVncyBsaWtlICJ3YXJuaW5nOiBjb21wYXJpc29uIGJldHdlZW4gc2lnbmVkIGFuZCB1bnNpZ25lZCIuCiAKLTIzOiBUZXN0ZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gbWVyZ2VkIGludG8gdGhlIC1tbSBwYXRjaHNldCB0byBtYWtlIHN1cmUKKzIzKSBUZXN0ZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gbWVyZ2VkIGludG8gdGhlIC1tbSBwYXRjaHNldCB0byBtYWtlIHN1cmUKICAgICB0aGF0IGl0IHN0aWxsIHdvcmtzIHdpdGggYWxsIG9mIHRoZSBvdGhlciBxdWV1ZWQgcGF0Y2hlcyBhbmQgdmFyaW91cwogICAgIGNoYW5nZXMgaW4gdGhlIFZNLCBWRlMsIGFuZCBvdGhlciBzdWJzeXN0ZW1zLgogCi0yNDogQWxsIG1lbW9yeSBiYXJyaWVycyB7ZS5nLiwgYmFycmllcigpLCBybWIoKSwgd21iKCl9IG5lZWQgYSBjb21tZW50IGluIHRoZQotICAgIHNvdXJjZSBjb2RlIHRoYXQgZXhwbGFpbnMgdGhlIGxvZ2ljIG9mIHdoYXQgdGhleSBhcmUgZG9pbmcgYW5kIHdoeS4KKzI0KSBBbGwgbWVtb3J5IGJhcnJpZXJzIHtlLmcuLCBgYGJhcnJpZXIoKWBgLCBgYHJtYigpYGAsIGBgd21iKClgYH0gbmVlZCBhCisgICAgY29tbWVudCBpbiB0aGUgc291cmNlIGNvZGUgdGhhdCBleHBsYWlucyB0aGUgbG9naWMgb2Ygd2hhdCB0aGV5IGFyZSBkb2luZworICAgIGFuZCB3aHkuCiAKLTI1OiBJZiBhbnkgaW9jdGwncyBhcmUgYWRkZWQgYnkgdGhlIHBhdGNoLCB0aGVuIGFsc28gdXBkYXRlCi0gICAgRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0LgorMjUpIElmIGFueSBpb2N0bCdzIGFyZSBhZGRlZCBieSB0aGUgcGF0Y2gsIHRoZW4gYWxzbyB1cGRhdGUKKyAgICBgYERvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dGBgLgogCi0yNjogSWYgeW91ciBtb2RpZmllZCBzb3VyY2UgY29kZSBkZXBlbmRzIG9uIG9yIHVzZXMgYW55IG9mIHRoZSBrZXJuZWwKLSAgICBBUElzIG9yIGZlYXR1cmVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIGZvbGxvd2luZyBrY29uZmlnIHN5bWJvbHMsCi0gICAgdGhlbiB0ZXN0IG11bHRpcGxlIGJ1aWxkcyB3aXRoIHRoZSByZWxhdGVkIGtjb25maWcgc3ltYm9scyBkaXNhYmxlZAotICAgIGFuZC9vciA9bSAoaWYgdGhhdCBvcHRpb24gaXMgYXZhaWxhYmxlKSBbbm90IGFsbCBvZiB0aGVzZSBhdCB0aGUKKzI2KSBJZiB5b3VyIG1vZGlmaWVkIHNvdXJjZSBjb2RlIGRlcGVuZHMgb24gb3IgdXNlcyBhbnkgb2YgdGhlIGtlcm5lbAorICAgIEFQSXMgb3IgZmVhdHVyZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgZm9sbG93aW5nIGBgS2NvbmZpZ2BgIHN5bWJvbHMsCisgICAgdGhlbiB0ZXN0IG11bHRpcGxlIGJ1aWxkcyB3aXRoIHRoZSByZWxhdGVkIGBgS2NvbmZpZ2BgIHN5bWJvbHMgZGlzYWJsZWQKKyAgICBhbmQvb3IgYGA9bWBgIChpZiB0aGF0IG9wdGlvbiBpcyBhdmFpbGFibGUpIFtub3QgYWxsIG9mIHRoZXNlIGF0IHRoZQogICAgIHNhbWUgdGltZSwganVzdCB2YXJpb3VzL3JhbmRvbSBjb21iaW5hdGlvbnMgb2YgdGhlbV06CiAKLSAgICBDT05GSUdfU01QLCBDT05GSUdfU1lTRlMsIENPTkZJR19QUk9DX0ZTLCBDT05GSUdfSU5QVVQsIENPTkZJR19QQ0ksCi0gICAgQ09ORklHX0JMT0NLLCBDT05GSUdfUE0sIENPTkZJR19NQUdJQ19TWVNSUSwKLSAgICBDT05GSUdfTkVULCBDT05GSUdfSU5FVD1uIChidXQgbGF0dGVyIHdpdGggQ09ORklHX05FVD15KQorICAgIGBgQ09ORklHX1NNUGBgLCBgYENPTkZJR19TWVNGU2BgLCBgYENPTkZJR19QUk9DX0ZTYGAsIGBgQ09ORklHX0lOUFVUYGAsIGBgQ09ORklHX1BDSWBgLCBgYENPTkZJR19CTE9DS2BgLCBgYENPTkZJR19QTWBgLCBgYENPTkZJR19NQUdJQ19TWVNSUWBgLAorICAgIGBgQ09ORklHX05FVGBgLCBgYENPTkZJR19JTkVUPW5gYCAoYnV0IGxhdHRlciB3aXRoIGBgQ09ORklHX05FVD15YGApLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMKaW5kZXggMzFkMzcyNi4uMjUyYjc3YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nRHJpdmVycworKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdEcml2ZXJzCkBAIC0xLDUgKzEsNyBAQAorLi4gX3N1Ym1pdHRpbmdkcml2ZXJzOgorCiBTdWJtaXR0aW5nIERyaXZlcnMgRm9yIFRoZSBMaW51eCBLZXJuZWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFRoaXMgZG9jdW1lbnQgaXMgaW50ZW5kZWQgdG8gZXhwbGFpbiBob3cgdG8gc3VibWl0IGRldmljZSBkcml2ZXJzIHRvIHRoZQogdmFyaW91cyBrZXJuZWwgdHJlZXMuIE5vdGUgdGhhdCBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gdmlkZW8gY2FyZCBkcml2ZXJzCkBAIC0zOCw0MiArNDAsNDggQEAKIAltYWludGFpbmVyIGRvZXMgbm90IHJlc3BvbmQgb3IgeW91IGNhbm5vdCBmaW5kIHRoZSBhcHByb3ByaWF0ZQogCW1haW50YWluZXIgdGhlbiBwbGVhc2UgY29udGFjdCBXaWxseSBUYXJyZWF1IDx3QDF3dC5ldT4uCiAKLUxpbnV4IDIuNjoKK0xpbnV4IDIuNiBhbmQgdXBwZXI6CiAJVGhlIHNhbWUgcnVsZXMgYXBwbHkgYXMgMi40IGV4Y2VwdCB0aGF0IHlvdSBzaG91bGQgZm9sbG93IGxpbnV4LWtlcm5lbAotCXRvIHRyYWNrIGNoYW5nZXMgaW4gQVBJJ3MuIFRoZSBmaW5hbCBjb250YWN0IHBvaW50IGZvciBMaW51eCAyLjYKKwl0byB0cmFjayBjaGFuZ2VzIGluIEFQSSdzLiBUaGUgZmluYWwgY29udGFjdCBwb2ludCBmb3IgTGludXggMi42KwogCXN1Ym1pc3Npb25zIGlzIEFuZHJldyBNb3J0b24uCiAKIFdoYXQgQ3JpdGVyaWEgRGV0ZXJtaW5lIEFjY2VwdGFuY2UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotTGljZW5zaW5nOglUaGUgY29kZSBtdXN0IGJlIHJlbGVhc2VkIHRvIHVzIHVuZGVyIHRoZQorTGljZW5zaW5nOgorCQlUaGUgY29kZSBtdXN0IGJlIHJlbGVhc2VkIHRvIHVzIHVuZGVyIHRoZQogCQlHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gV2UgZG9uJ3QgaW5zaXN0IG9uIGFueSBraW5kCiAJCW9mIGV4Y2x1c2l2ZSBHUEwgbGljZW5zaW5nLCBhbmQgaWYgeW91IHdpc2ggdGhlIGRyaXZlcgogCQl0byBiZSB1c2VmdWwgdG8gb3RoZXIgY29tbXVuaXRpZXMgc3VjaCBhcyBCU0QgeW91IG1heSB3ZWxsCiAJCXdpc2ggdG8gcmVsZWFzZSB1bmRlciBtdWx0aXBsZSBsaWNlbnNlcy4KIAkJU2VlIGFjY2VwdGVkIGxpY2Vuc2VzIGF0IGluY2x1ZGUvbGludXgvbW9kdWxlLmgKIAotQ29weXJpZ2h0OglUaGUgY29weXJpZ2h0IG93bmVyIG11c3QgYWdyZWUgdG8gdXNlIG9mIEdQTC4KK0NvcHlyaWdodDoKKwkJVGhlIGNvcHlyaWdodCBvd25lciBtdXN0IGFncmVlIHRvIHVzZSBvZiBHUEwuCiAJCUl0J3MgYmVzdCBpZiB0aGUgc3VibWl0dGVyIGFuZCBjb3B5cmlnaHQgb3duZXIKIAkJYXJlIHRoZSBzYW1lIHBlcnNvbi9lbnRpdHkuIElmIG5vdCwgdGhlIG5hbWUgb2YKIAkJdGhlIHBlcnNvbi9lbnRpdHkgYXV0aG9yaXppbmcgdXNlIG9mIEdQTCBzaG91bGQgYmUKIAkJbGlzdGVkIGluIGNhc2UgaXQncyBuZWNlc3NhcnkgdG8gdmVyaWZ5IHRoZSB3aWxsIG9mCiAJCXRoZSBjb3B5cmlnaHQgb3duZXIuCiAKLUludGVyZmFjZXM6CUlmIHlvdXIgZHJpdmVyIHVzZXMgZXhpc3RpbmcgaW50ZXJmYWNlcyBhbmQgYmVoYXZlcyBsaWtlCitJbnRlcmZhY2VzOgorCQlJZiB5b3VyIGRyaXZlciB1c2VzIGV4aXN0aW5nIGludGVyZmFjZXMgYW5kIGJlaGF2ZXMgbGlrZQogCQlvdGhlciBkcml2ZXJzIGluIHRoZSBzYW1lIGNsYXNzIGl0IHdpbGwgYmUgbXVjaCBtb3JlIGxpa2VseQogCQl0byBiZSBhY2NlcHRlZCB0aGFuIGlmIGl0IGludmVudHMgZ3JhdHVpdG91cyBuZXcgb25lcy4KIAkJSWYgeW91IG5lZWQgdG8gaW1wbGVtZW50IGEgY29tbW9uIEFQSSBvdmVyIExpbnV4IGFuZCBOVAogCQlkcml2ZXJzIGRvIGl0IGluIHVzZXJzcGFjZS4KIAotQ29kZToJCVBsZWFzZSB1c2UgdGhlIExpbnV4IHN0eWxlIG9mIGNvZGUgZm9ybWF0dGluZyBhcyBkb2N1bWVudGVkCi0JCWluIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUuIElmIHlvdSBoYXZlIHNlY3Rpb25zIG9mIGNvZGUKK0NvZGU6CisJCVBsZWFzZSB1c2UgdGhlIExpbnV4IHN0eWxlIG9mIGNvZGUgZm9ybWF0dGluZyBhcyBkb2N1bWVudGVkCisJCWluIDpyZWY6YERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUgPGNvZGluZ1N0eWxlPmAuCisJCUlmIHlvdSBoYXZlIHNlY3Rpb25zIG9mIGNvZGUKIAkJdGhhdCBuZWVkIHRvIGJlIGluIG90aGVyIGZvcm1hdHMsIGZvciBleGFtcGxlIGJlY2F1c2UgdGhleQogCQlhcmUgc2hhcmVkIHdpdGggYSB3aW5kb3dzIGRyaXZlciBraXQgYW5kIHlvdSB3YW50IHRvCiAJCW1haW50YWluIHRoZW0ganVzdCBvbmNlIHNlcGFyYXRlIHRoZW0gb3V0IG5pY2VseSBhbmQgbm90ZQogCQl0aGlzIGZhY3QuCiAKLVBvcnRhYmlsaXR5OglQb2ludGVycyBhcmUgbm90IGFsd2F5cyAzMmJpdHMsIG5vdCBhbGwgY29tcHV0ZXJzIGFyZSBsaXR0bGUKK1BvcnRhYmlsaXR5OgorCQlQb2ludGVycyBhcmUgbm90IGFsd2F5cyAzMmJpdHMsIG5vdCBhbGwgY29tcHV0ZXJzIGFyZSBsaXR0bGUKIAkJZW5kaWFuLCBwZW9wbGUgZG8gbm90IGFsbCBoYXZlIGZsb2F0aW5nIHBvaW50IGFuZCB5b3UKIAkJc2hvdWxkbid0IHVzZSBpbmxpbmUgeDg2IGFzc2VtYmxlciBpbiB5b3VyIGRyaXZlciB3aXRob3V0CiAJCWNhcmVmdWwgdGhvdWdodC4gUHVyZSB4ODYgZHJpdmVycyBnZW5lcmFsbHkgYXJlIG5vdCBwb3B1bGFyLgpAQCAtODEsMTIgKzg5LDE0IEBACiAJCWJ1dCBpdCBpcyBlYXN5IHRvIG1ha2Ugc3VyZSB0aGUgY29kZSBjYW4gZWFzaWx5IGJlIG1hZGUKIAkJcG9ydGFibGUuCiAKLUNsYXJpdHk6CUl0IGhlbHBzIGlmIGFueW9uZSBjYW4gc2VlIGhvdyB0byBmaXggdGhlIGRyaXZlci4gSXQgaGVscHMKK0NsYXJpdHk6CisJCUl0IGhlbHBzIGlmIGFueW9uZSBjYW4gc2VlIGhvdyB0byBmaXggdGhlIGRyaXZlci4gSXQgaGVscHMKIAkJeW91IGJlY2F1c2UgeW91IGdldCBwYXRjaGVzIG5vdCBidWcgcmVwb3J0cy4gSWYgeW91IHN1Ym1pdCBhCiAJCWRyaXZlciB0aGF0IGludGVudGlvbmFsbHkgb2JmdXNjYXRlcyBob3cgdGhlIGhhcmR3YXJlIHdvcmtzCiAJCWl0IHdpbGwgZ28gaW4gdGhlIGJpdGJ1Y2tldC4KIAotUE0gc3VwcG9ydDoJU2luY2UgTGludXggaXMgdXNlZCBvbiBtYW55IHBvcnRhYmxlIGFuZCBkZXNrdG9wIHN5c3RlbXMsIHlvdXIKK1BNIHN1cHBvcnQ6CisJCVNpbmNlIExpbnV4IGlzIHVzZWQgb24gbWFueSBwb3J0YWJsZSBhbmQgZGVza3RvcCBzeXN0ZW1zLCB5b3VyCiAJCWRyaXZlciBpcyBsaWtlbHkgdG8gYmUgdXNlZCBvbiBzdWNoIGEgc3lzdGVtIGFuZCB0aGVyZWZvcmUgaXQKIAkJc2hvdWxkIHN1cHBvcnQgYmFzaWMgcG93ZXIgbWFuYWdlbWVudCBieSBpbXBsZW1lbnRpbmcsIGlmCiAJCW5lY2Vzc2FyeSwgdGhlIC5zdXNwZW5kIGFuZCAucmVzdW1lIG1ldGhvZHMgdXNlZCBkdXJpbmcgdGhlCkBAIC0xMDEsNyArMTExLDggQEAKIAkJY29tcGxldGUgb3ZlcnZpZXcgb2YgdGhlIHBvd2VyIG1hbmFnZW1lbnQgaXNzdWVzIHJlbGF0ZWQgdG8KIAkJZHJpdmVycyBzZWUgRG9jdW1lbnRhdGlvbi9wb3dlci9kZXZpY2VzLnR4dCAuCiAKLUNvbnRyb2w6CUluIGdlbmVyYWwgaWYgdGhlcmUgaXMgYWN0aXZlIG1haW50ZW5hbmNlIG9mIGEgZHJpdmVyIGJ5CitDb250cm9sOgorCQlJbiBnZW5lcmFsIGlmIHRoZXJlIGlzIGFjdGl2ZSBtYWludGVuYW5jZSBvZiBhIGRyaXZlciBieQogCQl0aGUgYXV0aG9yIHRoZW4gcGF0Y2hlcyB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gdGhlbSB1bmxlc3MKIAkJdGhleSBhcmUgdG90YWxseSBvYnZpb3VzIGFuZCB3aXRob3V0IG5lZWQgb2YgY2hlY2tpbmcuCiAJCUlmIHlvdSB3YW50IHRvIGJlIHRoZSBjb250YWN0IGFuZCB1cGRhdGUgcG9pbnQgZm9yIHRoZQpAQCAtMTExLDEzICsxMjIsMTUgQEAKIFdoYXQgQ3JpdGVyaWEgRG8gTm90IERldGVybWluZSBBY2NlcHRhbmNlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1WZW5kb3I6CQlCZWluZyB0aGUgaGFyZHdhcmUgdmVuZG9yIGFuZCBtYWludGFpbmluZyB0aGUgZHJpdmVyIGlzCitWZW5kb3I6CisJCUJlaW5nIHRoZSBoYXJkd2FyZSB2ZW5kb3IgYW5kIG1haW50YWluaW5nIHRoZSBkcml2ZXIgaXMKIAkJb2Z0ZW4gYSBnb29kIHRoaW5nLiBJZiB0aGVyZSBpcyBhIHN0YWJsZSB3b3JraW5nIGRyaXZlciBmcm9tCiAJCW90aGVyIHBlb3BsZSBhbHJlYWR5IGluIHRoZSB0cmVlIGRvbid0IGV4cGVjdCAnd2UgYXJlIHRoZQogCQl2ZW5kb3InIHRvIGdldCB5b3VyIGRyaXZlciBjaG9zZW4uIElkZWFsbHkgd29yayB3aXRoIHRoZQogCQlleGlzdGluZyBkcml2ZXIgYXV0aG9yIHRvIGJ1aWxkIGEgc2luZ2xlIHBlcmZlY3QgZHJpdmVyLgogCi1BdXRob3I6CQlJdCBkb2Vzbid0IG1hdHRlciBpZiBhIGxhcmdlIExpbnV4IGNvbXBhbnkgd3JvdGUgdGhlIGRyaXZlciwKK0F1dGhvcjoKKwkJSXQgZG9lc24ndCBtYXR0ZXIgaWYgYSBsYXJnZSBMaW51eCBjb21wYW55IHdyb3RlIHRoZSBkcml2ZXIsCiAJCW9yIHlvdSBkaWQuIE5vYm9keSBoYXMgYW55IHNwZWNpYWwgYWNjZXNzIHRvIHRoZSBrZXJuZWwKIAkJdHJlZS4gQW55b25lIHdobyB0ZWxscyB5b3Ugb3RoZXJ3aXNlIGlzbid0IHRlbGxpbmcgdGhlCiAJCXdob2xlIHN0b3J5LgpAQCAtMTI3LDggKzE0MCwxMCBAQAogLS0tLS0tLS0tCiAKIExpbnV4IGtlcm5lbCBtYXN0ZXIgdHJlZToKLQlmdHAuPz8ua2VybmVsLm9yZzovcHViL2xpbnV4L2tlcm5lbC8uLi4KLQk/PyA9PSB5b3VyIGNvdW50cnkgY29kZSwgc3VjaCBhcyAidXMiLCAidWsiLCAiZnIiLCBldGMuCisJZnRwLlwgKmNvdW50cnlfY29kZSpcIC5rZXJuZWwub3JnOi9wdWIvbGludXgva2VybmVsLy4uLgorCisJd2hlcmUgKmNvdW50cnlfY29kZSogPT0geW91ciBjb3VudHJ5IGNvZGUsIHN1Y2ggYXMKKwkqKnVzKiosICoqdWsqKiwgKipmcioqLCBldGMuCiAKIAlodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC90b3J2YWxkcy9saW51eC5naXQKIApAQCAtMTQxLDE0ICsxNTYsMTkgQEAKIAogTFdOLm5ldDoKIAlXZWVrbHkgc3VtbWFyeSBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQgYWN0aXZpdHkgLSBodHRwOi8vbHduLm5ldC8KKwogCTIuNiBBUEkgY2hhbmdlczoKKwogCQlodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yLjYta2VybmVsLWFwaS8KKwogCVBvcnRpbmcgZHJpdmVycyBmcm9tIHByaW9yIGtlcm5lbHMgdG8gMi42OgorCiAJCWh0dHA6Ly9sd24ubmV0L0FydGljbGVzL2RyaXZlci1wb3J0aW5nLwogCiBLZXJuZWxOZXdiaWVzOgogCURvY3VtZW50YXRpb24gYW5kIGFzc2lzdGFuY2UgZm9yIG5ldyBrZXJuZWwgcHJvZ3JhbW1lcnMKLQlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvCisKKwkJaHR0cDovL2tlcm5lbG5ld2JpZXMub3JnLwogCiBMaW51eCBVU0IgcHJvamVjdDoKIAlodHRwOi8vd3d3LmxpbnV4LXVzYi5vcmcvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzIGIvRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcwppbmRleCA4Yzc5ZjFkLi4zNmYxZGVkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzCisrKyBiL0RvY3VtZW50YXRpb24vU3VibWl0dGluZ1BhdGNoZXMKQEAgLTEsOSArMSw3IEBACisuLiBfc3VibWl0dGluZ3BhdGNoZXM6CiAKLQlIb3cgdG8gR2V0IFlvdXIgQ2hhbmdlIEludG8gdGhlIExpbnV4IEtlcm5lbAotCQlvcgotCUNhcmUgQW5kIE9wZXJhdGlvbiBPZiBZb3VyIExpbnVzIFRvcnZhbGRzCi0KLQorSG93IHRvIEdldCBZb3VyIENoYW5nZSBJbnRvIHRoZSBMaW51eCBLZXJuZWwgb3IgQ2FyZSBBbmQgT3BlcmF0aW9uIE9mIFlvdXIgTGludXMgVG9ydmFsZHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIEZvciBhIHBlcnNvbiBvciBjb21wYW55IHdobyB3aXNoZXMgdG8gc3VibWl0IGEgY2hhbmdlIHRvIHRoZSBMaW51eAoga2VybmVsLCB0aGUgcHJvY2VzcyBjYW4gc29tZXRpbWVzIGJlIGRhdW50aW5nIGlmIHlvdSdyZSBub3QgZmFtaWxpYXIKQEAgLTEyLDU3ICsxMCw1OSBAQAogCiBUaGlzIGRvY3VtZW50IGNvbnRhaW5zIGEgbGFyZ2UgbnVtYmVyIG9mIHN1Z2dlc3Rpb25zIGluIGEgcmVsYXRpdmVseSB0ZXJzZQogZm9ybWF0LiAgRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGhvdyB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MKLXdvcmtzLCBzZWUgRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLiAgQWxzbywgcmVhZAotRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QgZm9yIGEgbGlzdCBvZiBpdGVtcyB0byBjaGVjayBiZWZvcmUKK3dvcmtzLCBzZWUgOnJlZjpgRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzIDxkZXZlbG9wbWVudF9wcm9jZXNzX21haW4+YC4KK0Fsc28sIHJlYWQgOnJlZjpgRG9jdW1lbnRhdGlvbi9TdWJtaXRDaGVja2xpc3QgPHN1Ym1pdGNoZWNrbGlzdD5gCitmb3IgYSBsaXN0IG9mIGl0ZW1zIHRvIGNoZWNrIGJlZm9yZQogc3VibWl0dGluZyBjb2RlLiAgSWYgeW91IGFyZSBzdWJtaXR0aW5nIGEgZHJpdmVyLCBhbHNvIHJlYWQKLURvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnM7IGZvciBkZXZpY2UgdHJlZSBiaW5kaW5nIHBhdGNoZXMsIHJlYWQKKzpyZWY6YERvY3VtZW50YXRpb24vU3VibWl0dGluZ0RyaXZlcnMgPHN1Ym1pdHRpbmdkcml2ZXJzPmA7Citmb3IgZGV2aWNlIHRyZWUgYmluZGluZyBwYXRjaGVzLCByZWFkCiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3VibWl0dGluZy1wYXRjaGVzLnR4dC4KIAotTWFueSBvZiB0aGVzZSBzdGVwcyBkZXNjcmliZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgZ2l0IHZlcnNpb24KLWNvbnRyb2wgc3lzdGVtOyBpZiB5b3UgdXNlIGdpdCB0byBwcmVwYXJlIHlvdXIgcGF0Y2hlcywgeW91J2xsIGZpbmQgbXVjaAorTWFueSBvZiB0aGVzZSBzdGVwcyBkZXNjcmliZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgYGBnaXRgYCB2ZXJzaW9uCitjb250cm9sIHN5c3RlbTsgaWYgeW91IHVzZSBgYGdpdGBgIHRvIHByZXBhcmUgeW91ciBwYXRjaGVzLCB5b3UnbGwgZmluZCBtdWNoCiBvZiB0aGUgbWVjaGFuaWNhbCB3b3JrIGRvbmUgZm9yIHlvdSwgdGhvdWdoIHlvdSdsbCBzdGlsbCBuZWVkIHRvIHByZXBhcmUKLWFuZCBkb2N1bWVudCBhIHNlbnNpYmxlIHNldCBvZiBwYXRjaGVzLiAgSW4gZ2VuZXJhbCwgdXNlIG9mIGdpdCB3aWxsIG1ha2UKK2FuZCBkb2N1bWVudCBhIHNlbnNpYmxlIHNldCBvZiBwYXRjaGVzLiAgSW4gZ2VuZXJhbCwgdXNlIG9mIGBgZ2l0YGAgd2lsbCBtYWtlCiB5b3VyIGxpZmUgYXMgYSBrZXJuZWwgZGV2ZWxvcGVyIGVhc2llci4KIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVNFQ1RJT04gMSAtIENSRUFUSU5HIEFORCBTRU5ESU5HIFlPVVIgQ0hBTkdFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ3JlYXRpbmcgYW5kIFNlbmRpbmcgeW91ciBDaGFuZ2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIAogMCkgT2J0YWluIGEgY3VycmVudCBzb3VyY2UgdHJlZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJZiB5b3UgZG8gbm90IGhhdmUgYSByZXBvc2l0b3J5IHdpdGggdGhlIGN1cnJlbnQga2VybmVsIHNvdXJjZSBoYW5keSwgdXNlCi1naXQgdG8gb2J0YWluIG9uZS4gIFlvdSdsbCB3YW50IHRvIHN0YXJ0IHdpdGggdGhlIG1haW5saW5lIHJlcG9zaXRvcnksCi13aGljaCBjYW4gYmUgZ3JhYmJlZCB3aXRoOgorYGBnaXRgYCB0byBvYnRhaW4gb25lLiAgWW91J2xsIHdhbnQgdG8gc3RhcnQgd2l0aCB0aGUgbWFpbmxpbmUgcmVwb3NpdG9yeSwKK3doaWNoIGNhbiBiZSBncmFiYmVkIHdpdGg6OgogCi0gIGdpdCBjbG9uZSBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXguZ2l0IAorICBnaXQgY2xvbmUgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LmdpdAogCiBOb3RlLCBob3dldmVyLCB0aGF0IHlvdSBtYXkgbm90IHdhbnQgdG8gZGV2ZWxvcCBhZ2FpbnN0IHRoZSBtYWlubGluZSB0cmVlCiBkaXJlY3RseS4gIE1vc3Qgc3Vic3lzdGVtIG1haW50YWluZXJzIHJ1biB0aGVpciBvd24gdHJlZXMgYW5kIHdhbnQgdG8gc2VlCi1wYXRjaGVzIHByZXBhcmVkIGFnYWluc3QgdGhvc2UgdHJlZXMuICBTZWUgdGhlICJUOiIgZW50cnkgZm9yIHRoZSBzdWJzeXN0ZW0KK3BhdGNoZXMgcHJlcGFyZWQgYWdhaW5zdCB0aG9zZSB0cmVlcy4gIFNlZSB0aGUgKipUOioqIGVudHJ5IGZvciB0aGUgc3Vic3lzdGVtCiBpbiB0aGUgTUFJTlRBSU5FUlMgZmlsZSB0byBmaW5kIHRoYXQgdHJlZSwgb3Igc2ltcGx5IGFzayB0aGUgbWFpbnRhaW5lciBpZgogdGhlIHRyZWUgaXMgbm90IGxpc3RlZCB0aGVyZS4KIAogSXQgaXMgc3RpbGwgcG9zc2libGUgdG8gZG93bmxvYWQga2VybmVsIHJlbGVhc2VzIHZpYSB0YXJiYWxscyAoYXMgZGVzY3JpYmVkCiBpbiB0aGUgbmV4dCBzZWN0aW9uKSwgYnV0IHRoYXQgaXMgdGhlIGhhcmQgd2F5IHRvIGRvIGtlcm5lbCBkZXZlbG9wbWVudC4KIAotMSkgImRpZmYgLXVwIgotLS0tLS0tLS0tLS0tCisxKSBgYGRpZmYgLXVwYGAKKy0tLS0tLS0tLS0tLS0tLQogCi1JZiB5b3UgbXVzdCBnZW5lcmF0ZSB5b3VyIHBhdGNoZXMgYnkgaGFuZCwgdXNlICJkaWZmIC11cCIgb3IgImRpZmYgLXVwck4iCitJZiB5b3UgbXVzdCBnZW5lcmF0ZSB5b3VyIHBhdGNoZXMgYnkgaGFuZCwgdXNlIGBgZGlmZiAtdXBgYCBvciBgYGRpZmYgLXVwck5gYAogdG8gY3JlYXRlIHBhdGNoZXMuICBHaXQgZ2VuZXJhdGVzIHBhdGNoZXMgaW4gdGhpcyBmb3JtIGJ5IGRlZmF1bHQ7IGlmCi15b3UncmUgdXNpbmcgZ2l0LCB5b3UgY2FuIHNraXAgdGhpcyBzZWN0aW9uIGVudGlyZWx5LgoreW91J3JlIHVzaW5nIGBgZ2l0YGAsIHlvdSBjYW4gc2tpcCB0aGlzIHNlY3Rpb24gZW50aXJlbHkuCiAKIEFsbCBjaGFuZ2VzIHRvIHRoZSBMaW51eCBrZXJuZWwgb2NjdXIgaW4gdGhlIGZvcm0gb2YgcGF0Y2hlcywgYXMKLWdlbmVyYXRlZCBieSBkaWZmKDEpLiAgV2hlbiBjcmVhdGluZyB5b3VyIHBhdGNoLCBtYWtlIHN1cmUgdG8gY3JlYXRlIGl0Ci1pbiAidW5pZmllZCBkaWZmIiBmb3JtYXQsIGFzIHN1cHBsaWVkIGJ5IHRoZSAnLXUnIGFyZ3VtZW50IHRvIGRpZmYoMSkuCi1BbHNvLCBwbGVhc2UgdXNlIHRoZSAnLXAnIGFyZ3VtZW50IHdoaWNoIHNob3dzIHdoaWNoIEMgZnVuY3Rpb24gZWFjaAotY2hhbmdlIGlzIGluIC0gdGhhdCBtYWtlcyB0aGUgcmVzdWx0YW50IGRpZmYgYSBsb3QgZWFzaWVyIHRvIHJlYWQuCitnZW5lcmF0ZWQgYnkgOm1hbnBhZ2U6YGRpZmYoMSlgLiAgV2hlbiBjcmVhdGluZyB5b3VyIHBhdGNoLCBtYWtlIHN1cmUgdG8KK2NyZWF0ZSBpdCBpbiAidW5pZmllZCBkaWZmIiBmb3JtYXQsIGFzIHN1cHBsaWVkIGJ5IHRoZSBgYC11YGAgYXJndW1lbnQKK3RvIDptYW5wYWdlOmBkaWZmKDEpYC4KK0Fsc28sIHBsZWFzZSB1c2UgdGhlIGBgLXBgYCBhcmd1bWVudCB3aGljaCBzaG93cyB3aGljaCBDIGZ1bmN0aW9uIGVhY2gKK2NoYW5nZSBpcyBpbiAtIHRoYXQgbWFrZXMgdGhlIHJlc3VsdGFudCBgYGRpZmZgYCBhIGxvdCBlYXNpZXIgdG8gcmVhZC4KIFBhdGNoZXMgc2hvdWxkIGJlIGJhc2VkIGluIHRoZSByb290IGtlcm5lbCBzb3VyY2UgZGlyZWN0b3J5LAogbm90IGluIGFueSBsb3dlciBzdWJkaXJlY3RvcnkuCiAKLVRvIGNyZWF0ZSBhIHBhdGNoIGZvciBhIHNpbmdsZSBmaWxlLCBpdCBpcyBvZnRlbiBzdWZmaWNpZW50IHRvIGRvOgorVG8gY3JlYXRlIGEgcGF0Y2ggZm9yIGEgc2luZ2xlIGZpbGUsIGl0IGlzIG9mdGVuIHN1ZmZpY2llbnQgdG8gZG86OgogCiAJU1JDVFJFRT0gbGludXgKIAlNWUZJTEU9ICBkcml2ZXJzL25ldC9teWRyaXZlci5jCkBAIC03NCw4ICs3NCw4IEBACiAJZGlmZiAtdXAgJFNSQ1RSRUUvJE1ZRklMRXsub3JpZyx9ID4gL3RtcC9wYXRjaAogCiBUbyBjcmVhdGUgYSBwYXRjaCBmb3IgbXVsdGlwbGUgZmlsZXMsIHlvdSBzaG91bGQgdW5wYWNrIGEgInZhbmlsbGEiLAotb3IgdW5tb2RpZmllZCBrZXJuZWwgc291cmNlIHRyZWUsIGFuZCBnZW5lcmF0ZSBhIGRpZmYgYWdhaW5zdCB5b3VyCi1vd24gc291cmNlIHRyZWUuICBGb3IgZXhhbXBsZToKK29yIHVubW9kaWZpZWQga2VybmVsIHNvdXJjZSB0cmVlLCBhbmQgZ2VuZXJhdGUgYSBgYGRpZmZgYCBhZ2FpbnN0IHlvdXIKK293biBzb3VyY2UgdHJlZS4gIEZvciBleGFtcGxlOjoKIAogCU1ZU1JDPSAvZGV2ZWwvbGludXgKIApAQCAtODQsMjcgKzg0LDI3IEBACiAJZGlmZiAtdXByTiAtWCBsaW51eC0zLjE5LXZhbmlsbGEvRG9jdW1lbnRhdGlvbi9kb250ZGlmZiBcCiAJCWxpbnV4LTMuMTktdmFuaWxsYSAkTVlTUkMgPiAvdG1wL3BhdGNoCiAKLSJkb250ZGlmZiIgaXMgYSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGtlcm5lbCBkdXJpbmcKLXRoZSBidWlsZCBwcm9jZXNzLCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQgaW4gYW55IGRpZmYoMSktZ2VuZXJhdGVkCitgYGRvbnRkaWZmYGAgaXMgYSBsaXN0IG9mIGZpbGVzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgYnkgdGhlIGtlcm5lbCBkdXJpbmcKK3RoZSBidWlsZCBwcm9jZXNzLCBhbmQgc2hvdWxkIGJlIGlnbm9yZWQgaW4gYW55IDptYW5wYWdlOmBkaWZmKDEpYC1nZW5lcmF0ZWQKIHBhdGNoLgogCiBNYWtlIHN1cmUgeW91ciBwYXRjaCBkb2VzIG5vdCBpbmNsdWRlIGFueSBleHRyYSBmaWxlcyB3aGljaCBkbyBub3QKIGJlbG9uZyBpbiBhIHBhdGNoIHN1Ym1pc3Npb24uICBNYWtlIHN1cmUgdG8gcmV2aWV3IHlvdXIgcGF0Y2ggLWFmdGVyLQotZ2VuZXJhdGluZyBpdCB3aXRoIGRpZmYoMSksIHRvIGVuc3VyZSBhY2N1cmFjeS4KK2dlbmVyYXRpbmcgaXQgd2l0aCA6bWFucGFnZTpgZGlmZigxKWAsIHRvIGVuc3VyZSBhY2N1cmFjeS4KIAogSWYgeW91ciBjaGFuZ2VzIHByb2R1Y2UgYSBsb3Qgb2YgZGVsdGFzLCB5b3UgbmVlZCB0byBzcGxpdCB0aGVtIGludG8KLWluZGl2aWR1YWwgcGF0Y2hlcyB3aGljaCBtb2RpZnkgdGhpbmdzIGluIGxvZ2ljYWwgc3RhZ2VzOyBzZWUgc2VjdGlvbgotIzMuICBUaGlzIHdpbGwgZmFjaWxpdGF0ZSByZXZpZXcgYnkgb3RoZXIga2VybmVsIGRldmVsb3BlcnMsCitpbmRpdmlkdWFsIHBhdGNoZXMgd2hpY2ggbW9kaWZ5IHRoaW5ncyBpbiBsb2dpY2FsIHN0YWdlczsgc2VlCis6cmVmOmBzcGxpdF9jaGFuZ2VzYC4gIFRoaXMgd2lsbCBmYWNpbGl0YXRlIHJldmlldyBieSBvdGhlciBrZXJuZWwgZGV2ZWxvcGVycywKIHZlcnkgaW1wb3J0YW50IGlmIHlvdSB3YW50IHlvdXIgcGF0Y2ggYWNjZXB0ZWQuCiAKLUlmIHlvdSdyZSB1c2luZyBnaXQsICJnaXQgcmViYXNlIC1pIiBjYW4gaGVscCB5b3Ugd2l0aCB0aGlzIHByb2Nlc3MuICBJZgoteW91J3JlIG5vdCB1c2luZyBnaXQsIHF1aWx0IDxodHRwOi8vc2F2YW5uYWgubm9uZ251Lm9yZy9wcm9qZWN0cy9xdWlsdD4KK0lmIHlvdSdyZSB1c2luZyBgYGdpdGBgLCBgYGdpdCByZWJhc2UgLWlgYCBjYW4gaGVscCB5b3Ugd2l0aCB0aGlzIHByb2Nlc3MuICBJZgoreW91J3JlIG5vdCB1c2luZyBgYGdpdGBgLCBgYHF1aWx0YGAgPGh0dHA6Ly9zYXZhbm5haC5ub25nbnUub3JnL3Byb2plY3RzL3F1aWx0PgogaXMgYW5vdGhlciBwb3B1bGFyIGFsdGVybmF0aXZlLgogCisuLiBfZGVzY3JpYmVfY2hhbmdlczoKIAotCi0yKSBEZXNjcmliZSB5b3VyIGNoYW5nZXMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisyKSBEZXNjcmliZSB5b3VyIGNoYW5nZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBEZXNjcmliZSB5b3VyIHByb2JsZW0uICBXaGV0aGVyIHlvdXIgcGF0Y2ggaXMgYSBvbmUtbGluZSBidWcgZml4IG9yCiA1MDAwIGxpbmVzIG9mIGEgbmV3IGZlYXR1cmUsIHRoZXJlIG11c3QgYmUgYW4gdW5kZXJseWluZyBwcm9ibGVtIHRoYXQKQEAgLTEzNywxMSArMTM3LDExIEBACiAKIFRoZSBtYWludGFpbmVyIHdpbGwgdGhhbmsgeW91IGlmIHlvdSB3cml0ZSB5b3VyIHBhdGNoIGRlc2NyaXB0aW9uIGluIGEKIGZvcm0gd2hpY2ggY2FuIGJlIGVhc2lseSBwdWxsZWQgaW50byBMaW51eCdzIHNvdXJjZSBjb2RlIG1hbmFnZW1lbnQKLXN5c3RlbSwgZ2l0LCBhcyBhICJjb21taXQgbG9nIi4gIFNlZSAjMTUsIGJlbG93Lgorc3lzdGVtLCBgYGdpdGBgLCBhcyBhICJjb21taXQgbG9nIi4gIFNlZSA6cmVmOmBleHBsaWNpdF9pbl9yZXBseV90b2AuCiAKIFNvbHZlIG9ubHkgb25lIHByb2JsZW0gcGVyIHBhdGNoLiAgSWYgeW91ciBkZXNjcmlwdGlvbiBzdGFydHMgdG8gZ2V0CiBsb25nLCB0aGF0J3MgYSBzaWduIHRoYXQgeW91IHByb2JhYmx5IG5lZWQgdG8gc3BsaXQgdXAgeW91ciBwYXRjaC4KLVNlZSAjMywgbmV4dC4KK1NlZSA6cmVmOmBzcGxpdF9jaGFuZ2VzYC4KIAogV2hlbiB5b3Ugc3VibWl0IG9yIHJlc3VibWl0IGEgcGF0Y2ggb3IgcGF0Y2ggc2VyaWVzLCBpbmNsdWRlIHRoZQogY29tcGxldGUgcGF0Y2ggZGVzY3JpcHRpb24gYW5kIGp1c3RpZmljYXRpb24gZm9yIGl0LiAgRG9uJ3QganVzdApAQCAtMTYwLDcgKzE2MCw3IEBACiBJZiB0aGUgcGF0Y2ggZml4ZXMgYSBsb2dnZWQgYnVnIGVudHJ5LCByZWZlciB0byB0aGF0IGJ1ZyBlbnRyeSBieQogbnVtYmVyIGFuZCBVUkwuICBJZiB0aGUgcGF0Y2ggZm9sbG93cyBmcm9tIGEgbWFpbGluZyBsaXN0IGRpc2N1c3Npb24sCiBnaXZlIGEgVVJMIHRvIHRoZSBtYWlsaW5nIGxpc3QgYXJjaGl2ZTsgdXNlIHRoZSBodHRwczovL2xrbWwua2VybmVsLm9yZy8KLXJlZGlyZWN0b3Igd2l0aCBhIE1lc3NhZ2UtSWQsIHRvIGVuc3VyZSB0aGF0IHRoZSBsaW5rcyBjYW5ub3QgYmVjb21lCityZWRpcmVjdG9yIHdpdGggYSBgYE1lc3NhZ2UtSWRgYCwgdG8gZW5zdXJlIHRoYXQgdGhlIGxpbmtzIGNhbm5vdCBiZWNvbWUKIHN0YWxlLgogCiBIb3dldmVyLCB0cnkgdG8gbWFrZSB5b3VyIGV4cGxhbmF0aW9uIHVuZGVyc3RhbmRhYmxlIHdpdGhvdXQgZXh0ZXJuYWwKQEAgLTE3MSw3ICsxNzEsNyBAQAogSWYgeW91IHdhbnQgdG8gcmVmZXIgdG8gYSBzcGVjaWZpYyBjb21taXQsIGRvbid0IGp1c3QgcmVmZXIgdG8gdGhlCiBTSEEtMSBJRCBvZiB0aGUgY29tbWl0LiBQbGVhc2UgYWxzbyBpbmNsdWRlIHRoZSBvbmVsaW5lIHN1bW1hcnkgb2YKIHRoZSBjb21taXQsIHRvIG1ha2UgaXQgZWFzaWVyIGZvciByZXZpZXdlcnMgdG8ga25vdyB3aGF0IGl0IGlzIGFib3V0LgotRXhhbXBsZToKK0V4YW1wbGU6OgogCiAJQ29tbWl0IGUyMWQyMTcwZjM2NjAyYWUyNzA4ICgidmlkZW86IHJlbW92ZSB1bm5lY2Vzc2FyeQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKCkiKSByZW1vdmVkIHRoZSB1bm5lY2Vzc2FyeQpAQCAtMTg1LDIzICsxODUsMjUgQEAKIGNoYW5nZSBmaXZlIHllYXJzIGZyb20gbm93LgogCiBJZiB5b3VyIHBhdGNoIGZpeGVzIGEgYnVnIGluIGEgc3BlY2lmaWMgY29tbWl0LCBlLmcuIHlvdSBmb3VuZCBhbiBpc3N1ZSB1c2luZwotZ2l0LWJpc2VjdCwgcGxlYXNlIHVzZSB0aGUgJ0ZpeGVzOicgdGFnIHdpdGggdGhlIGZpcnN0IDEyIGNoYXJhY3RlcnMgb2YgdGhlCi1TSEEtMSBJRCwgYW5kIHRoZSBvbmUgbGluZSBzdW1tYXJ5LiAgRm9yIGV4YW1wbGU6CitgYGdpdCBiaXNlY3RgYCwgcGxlYXNlIHVzZSB0aGUgJ0ZpeGVzOicgdGFnIHdpdGggdGhlIGZpcnN0IDEyIGNoYXJhY3RlcnMgb2YKK3RoZSBTSEEtMSBJRCwgYW5kIHRoZSBvbmUgbGluZSBzdW1tYXJ5LiAgRm9yIGV4YW1wbGU6OgogCiAJRml4ZXM6IGUyMWQyMTcwZjM2NiAoInZpZGVvOiByZW1vdmUgdW5uZWNlc3NhcnkgcGxhdGZvcm1fc2V0X2RydmRhdGEoKSIpCiAKLVRoZSBmb2xsb3dpbmcgZ2l0LWNvbmZpZyBzZXR0aW5ncyBjYW4gYmUgdXNlZCB0byBhZGQgYSBwcmV0dHkgZm9ybWF0IGZvcgotb3V0cHV0dGluZyB0aGUgYWJvdmUgc3R5bGUgaW4gdGhlIGdpdCBsb2cgb3IgZ2l0IHNob3cgY29tbWFuZHMKK1RoZSBmb2xsb3dpbmcgYGBnaXQgY29uZmlnYGAgc2V0dGluZ3MgY2FuIGJlIHVzZWQgdG8gYWRkIGEgcHJldHR5IGZvcm1hdCBmb3IKK291dHB1dHRpbmcgdGhlIGFib3ZlIHN0eWxlIGluIHRoZSBgYGdpdCBsb2dgYCBvciBgYGdpdCBzaG93YGAgY29tbWFuZHM6OgogCiAJW2NvcmVdCiAJCWFiYnJldiA9IDEyCiAJW3ByZXR0eV0KIAkJZml4ZXMgPSBGaXhlczogJWggKFwiJXNcIikKIAotMykgU2VwYXJhdGUgeW91ciBjaGFuZ2VzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLi4gX3NwbGl0X2NoYW5nZXM6CiAKLVNlcGFyYXRlIGVhY2ggX2xvZ2ljYWwgY2hhbmdlXyBpbnRvIGEgc2VwYXJhdGUgcGF0Y2guCiszKSBTZXBhcmF0ZSB5b3VyIGNoYW5nZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTZXBhcmF0ZSBlYWNoICoqbG9naWNhbCBjaGFuZ2UqKiBpbnRvIGEgc2VwYXJhdGUgcGF0Y2guCiAKIEZvciBleGFtcGxlLCBpZiB5b3VyIGNoYW5nZXMgaW5jbHVkZSBib3RoIGJ1ZyBmaXhlcyBhbmQgcGVyZm9ybWFuY2UKIGVuaGFuY2VtZW50cyBmb3IgYSBzaW5nbGUgZHJpdmVyLCBzZXBhcmF0ZSB0aG9zZSBjaGFuZ2VzIGludG8gdHdvCkBAIC0yMTcsMTIgKzIxOSwxMiBAQAogb24gaXRzIG93biBtZXJpdHMuCiAKIElmIG9uZSBwYXRjaCBkZXBlbmRzIG9uIGFub3RoZXIgcGF0Y2ggaW4gb3JkZXIgZm9yIGEgY2hhbmdlIHRvIGJlCi1jb21wbGV0ZSwgdGhhdCBpcyBPSy4gIFNpbXBseSBub3RlICJ0aGlzIHBhdGNoIGRlcGVuZHMgb24gcGF0Y2ggWCIKK2NvbXBsZXRlLCB0aGF0IGlzIE9LLiAgU2ltcGx5IG5vdGUgKioidGhpcyBwYXRjaCBkZXBlbmRzIG9uIHBhdGNoIFgiKioKIGluIHlvdXIgcGF0Y2ggZGVzY3JpcHRpb24uCiAKIFdoZW4gZGl2aWRpbmcgeW91ciBjaGFuZ2UgaW50byBhIHNlcmllcyBvZiBwYXRjaGVzLCB0YWtlIHNwZWNpYWwgY2FyZSB0bwogZW5zdXJlIHRoYXQgdGhlIGtlcm5lbCBidWlsZHMgYW5kIHJ1bnMgcHJvcGVybHkgYWZ0ZXIgZWFjaCBwYXRjaCBpbiB0aGUKLXNlcmllcy4gIERldmVsb3BlcnMgdXNpbmcgImdpdCBiaXNlY3QiIHRvIHRyYWNrIGRvd24gYSBwcm9ibGVtIGNhbiBlbmQgdXAKK3Nlcmllcy4gIERldmVsb3BlcnMgdXNpbmcgYGBnaXQgYmlzZWN0YGAgdG8gdHJhY2sgZG93biBhIHByb2JsZW0gY2FuIGVuZCB1cAogc3BsaXR0aW5nIHlvdXIgcGF0Y2ggc2VyaWVzIGF0IGFueSBwb2ludDsgdGhleSB3aWxsIG5vdCB0aGFuayB5b3UgaWYgeW91CiBpbnRyb2R1Y2UgYnVncyBpbiB0aGUgbWlkZGxlLgogCkBAIC0yMzEsMTEgKzIzMywxMyBAQAogCiAKIAotNCkgU3R5bGUtY2hlY2sgeW91ciBjaGFuZ2VzLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorNCkgU3R5bGUtY2hlY2sgeW91ciBjaGFuZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ2hlY2sgeW91ciBwYXRjaCBmb3IgYmFzaWMgc3R5bGUgdmlvbGF0aW9ucywgZGV0YWlscyBvZiB3aGljaCBjYW4gYmUKLWZvdW5kIGluIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUuICBGYWlsdXJlIHRvIGRvIHNvIHNpbXBseSB3YXN0ZXMKK2ZvdW5kIGluCis6cmVmOmBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIDxjb2RpbmdzdHlsZT5gLgorRmFpbHVyZSB0byBkbyBzbyBzaW1wbHkgd2FzdGVzCiB0aGUgcmV2aWV3ZXJzIHRpbWUgYW5kIHdpbGwgZ2V0IHlvdXIgcGF0Y2ggcmVqZWN0ZWQsIHByb2JhYmx5CiB3aXRob3V0IGV2ZW4gYmVpbmcgcmVhZC4KIApAQCAtMjYwLDggKzI2NCw4IEBACiBwYXRjaC4KIAogCi01KSBTZWxlY3QgdGhlIHJlY2lwaWVudHMgZm9yIHlvdXIgcGF0Y2guCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis1KSBTZWxlY3QgdGhlIHJlY2lwaWVudHMgZm9yIHlvdXIgcGF0Y2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBZb3Ugc2hvdWxkIGFsd2F5cyBjb3B5IHRoZSBhcHByb3ByaWF0ZSBzdWJzeXN0ZW0gbWFpbnRhaW5lcihzKSBvbiBhbnkgcGF0Y2gKIHRvIGNvZGUgdGhhdCB0aGV5IG1haW50YWluOyBsb29rIHRocm91Z2ggdGhlIE1BSU5UQUlORVJTIGZpbGUgYW5kIHRoZQpAQCAtMjk1LDEzICsyOTksMTQgQEAKIG9idmlvdXNseSwgdGhlIHBhdGNoIHNob3VsZCBub3QgYmUgc2VudCB0byBhbnkgcHVibGljIGxpc3RzLgogCiBQYXRjaGVzIHRoYXQgZml4IGEgc2V2ZXJlIGJ1ZyBpbiBhIHJlbGVhc2VkIGtlcm5lbCBzaG91bGQgYmUgZGlyZWN0ZWQKLXRvd2FyZCB0aGUgc3RhYmxlIG1haW50YWluZXJzIGJ5IHB1dHRpbmcgYSBsaW5lIGxpa2UgdGhpczoKK3Rvd2FyZCB0aGUgc3RhYmxlIG1haW50YWluZXJzIGJ5IHB1dHRpbmcgYSBsaW5lIGxpa2UgdGhpczo6CiAKICAgQ2M6IHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmcKIAogaW50byB0aGUgc2lnbi1vZmYgYXJlYSBvZiB5b3VyIHBhdGNoIChub3RlLCBOT1QgYW4gZW1haWwgcmVjaXBpZW50KS4gIFlvdQotc2hvdWxkIGFsc28gcmVhZCBEb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0IGluIGFkZGl0aW9uIHRvIHRoaXMKLWZpbGUuCitzaG91bGQgYWxzbyByZWFkCis6cmVmOmBEb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0IDxzdGFibGVfa2VybmVsX3J1bGVzPmAKK2luIGFkZGl0aW9uIHRvIHRoaXMgZmlsZS4KIAogTm90ZSwgaG93ZXZlciwgdGhhdCBzb21lIHN1YnN5c3RlbSBtYWludGFpbmVycyB3YW50IHRvIGNvbWUgdG8gdGhlaXIgb3duCiBjb25jbHVzaW9ucyBvbiB3aGljaCBwYXRjaGVzIHNob3VsZCBnbyB0byB0aGUgc3RhYmxlIHRyZWVzLiAgVGhlIG5ldHdvcmtpbmcKQEAgLTMxMiwyOCArMzE3LDMwIEBACiBtYWludGFpbmVyIChhcyBsaXN0ZWQgaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUpIGEgbWFuLXBhZ2VzIHBhdGNoLCBvciBhdAogbGVhc3QgYSBub3RpZmljYXRpb24gb2YgdGhlIGNoYW5nZSwgc28gdGhhdCBzb21lIGluZm9ybWF0aW9uIG1ha2VzIGl0cyB3YXkKIGludG8gdGhlIG1hbnVhbCBwYWdlcy4gIFVzZXItc3BhY2UgQVBJIGNoYW5nZXMgc2hvdWxkIGFsc28gYmUgY29waWVkIHRvCi1saW51eC1hcGlAdmdlci5rZXJuZWwub3JnLiAKK2xpbnV4LWFwaUB2Z2VyLmtlcm5lbC5vcmcuCiAKIEZvciBzbWFsbCBwYXRjaGVzIHlvdSBtYXkgd2FudCB0byBDQyB0aGUgVHJpdmlhbCBQYXRjaCBNb25rZXkKIHRyaXZpYWxAa2VybmVsLm9yZyB3aGljaCBjb2xsZWN0cyAidHJpdmlhbCIgcGF0Y2hlcy4gSGF2ZSBhIGxvb2sKIGludG8gdGhlIE1BSU5UQUlORVJTIGZpbGUgZm9yIGl0cyBjdXJyZW50IG1hbmFnZXIuCisKIFRyaXZpYWwgcGF0Y2hlcyBtdXN0IHF1YWxpZnkgZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJ1bGVzOgotIFNwZWxsaW5nIGZpeGVzIGluIGRvY3VtZW50YXRpb24KLSBTcGVsbGluZyBmaXhlcyBmb3IgZXJyb3JzIHdoaWNoIGNvdWxkIGJyZWFrIGdyZXAoMSkKLSBXYXJuaW5nIGZpeGVzIChjbHV0dGVyaW5nIHdpdGggdXNlbGVzcyB3YXJuaW5ncyBpcyBiYWQpCi0gQ29tcGlsYXRpb24gZml4ZXMgKG9ubHkgaWYgdGhleSBhcmUgYWN0dWFsbHkgY29ycmVjdCkKLSBSdW50aW1lIGZpeGVzIChvbmx5IGlmIHRoZXkgYWN0dWFsbHkgZml4IHRoaW5ncykKLSBSZW1vdmluZyB1c2Ugb2YgZGVwcmVjYXRlZCBmdW5jdGlvbnMvbWFjcm9zCi0gQ29udGFjdCBkZXRhaWwgYW5kIGRvY3VtZW50YXRpb24gZml4ZXMKLSBOb24tcG9ydGFibGUgY29kZSByZXBsYWNlZCBieSBwb3J0YWJsZSBjb2RlIChldmVuIGluIGFyY2gtc3BlY2lmaWMsCi0gc2luY2UgcGVvcGxlIGNvcHksIGFzIGxvbmcgYXMgaXQncyB0cml2aWFsKQotIEFueSBmaXggYnkgdGhlIGF1dGhvci9tYWludGFpbmVyIG9mIHRoZSBmaWxlIChpZS4gcGF0Y2ggbW9ua2V5Ci0gaW4gcmUtdHJhbnNtaXNzaW9uIG1vZGUpCisKKy0gU3BlbGxpbmcgZml4ZXMgaW4gZG9jdW1lbnRhdGlvbgorLSBTcGVsbGluZyBmaXhlcyBmb3IgZXJyb3JzIHdoaWNoIGNvdWxkIGJyZWFrIDptYW5wYWdlOmBncmVwKDEpYAorLSBXYXJuaW5nIGZpeGVzIChjbHV0dGVyaW5nIHdpdGggdXNlbGVzcyB3YXJuaW5ncyBpcyBiYWQpCistIENvbXBpbGF0aW9uIGZpeGVzIChvbmx5IGlmIHRoZXkgYXJlIGFjdHVhbGx5IGNvcnJlY3QpCistIFJ1bnRpbWUgZml4ZXMgKG9ubHkgaWYgdGhleSBhY3R1YWxseSBmaXggdGhpbmdzKQorLSBSZW1vdmluZyB1c2Ugb2YgZGVwcmVjYXRlZCBmdW5jdGlvbnMvbWFjcm9zCistIENvbnRhY3QgZGV0YWlsIGFuZCBkb2N1bWVudGF0aW9uIGZpeGVzCistIE5vbi1wb3J0YWJsZSBjb2RlIHJlcGxhY2VkIGJ5IHBvcnRhYmxlIGNvZGUgKGV2ZW4gaW4gYXJjaC1zcGVjaWZpYywKKyAgc2luY2UgcGVvcGxlIGNvcHksIGFzIGxvbmcgYXMgaXQncyB0cml2aWFsKQorLSBBbnkgZml4IGJ5IHRoZSBhdXRob3IvbWFpbnRhaW5lciBvZiB0aGUgZmlsZSAoaWUuIHBhdGNoIG1vbmtleQorICBpbiByZS10cmFuc21pc3Npb24gbW9kZSkKIAogCiAKLTYpIE5vIE1JTUUsIG5vIGxpbmtzLCBubyBjb21wcmVzc2lvbiwgbm8gYXR0YWNobWVudHMuICBKdXN0IHBsYWluIHRleHQuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorNikgTm8gTUlNRSwgbm8gbGlua3MsIG5vIGNvbXByZXNzaW9uLCBubyBhdHRhY2htZW50cy4gIEp1c3QgcGxhaW4gdGV4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBMaW51cyBhbmQgb3RoZXIga2VybmVsIGRldmVsb3BlcnMgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgYW5kIGNvbW1lbnQKIG9uIHRoZSBjaGFuZ2VzIHlvdSBhcmUgc3VibWl0dGluZy4gIEl0IGlzIGltcG9ydGFudCBmb3IgYSBrZXJuZWwKQEAgLTM0MSw4ICszNDgsMTEgQEAKIHRvb2xzLCBzbyB0aGF0IHRoZXkgbWF5IGNvbW1lbnQgb24gc3BlY2lmaWMgcG9ydGlvbnMgb2YgeW91ciBjb2RlLgogCiBGb3IgdGhpcyByZWFzb24sIGFsbCBwYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgYnkgZS1tYWlsICJpbmxpbmUiLgotV0FSTklORzogIEJlIHdhcnkgb2YgeW91ciBlZGl0b3IncyB3b3JkLXdyYXAgY29ycnVwdGluZyB5b3VyIHBhdGNoLAotaWYgeW91IGNob29zZSB0byBjdXQtbi1wYXN0ZSB5b3VyIHBhdGNoLgorCisuLiB3YXJuaW5nOjoKKworICBCZSB3YXJ5IG9mIHlvdXIgZWRpdG9yJ3Mgd29yZC13cmFwIGNvcnJ1cHRpbmcgeW91ciBwYXRjaCwKKyAgaWYgeW91IGNob29zZSB0byBjdXQtbi1wYXN0ZSB5b3VyIHBhdGNoLgogCiBEbyBub3QgYXR0YWNoIHRoZSBwYXRjaCBhcyBhIE1JTUUgYXR0YWNobWVudCwgY29tcHJlc3NlZCBvciBub3QuCiBNYW55IHBvcHVsYXIgZS1tYWlsIGFwcGxpY2F0aW9ucyB3aWxsIG5vdCBhbHdheXMgdHJhbnNtaXQgYSBNSU1FCkBAIC0zNTMsMTEgKzM2MywxMiBAQAogRXhjZXB0aW9uOiAgSWYgeW91ciBtYWlsZXIgaXMgbWFuZ2xpbmcgcGF0Y2hlcyB0aGVuIHNvbWVvbmUgbWF5IGFzawogeW91IHRvIHJlLXNlbmQgdGhlbSB1c2luZyBNSU1FLgogCi1TZWUgRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCBmb3IgaGludHMgYWJvdXQgY29uZmlndXJpbmcKLXlvdXIgZS1tYWlsIGNsaWVudCBzbyB0aGF0IGl0IHNlbmRzIHlvdXIgcGF0Y2hlcyB1bnRvdWNoZWQuCitTZWUgOnJlZjpgRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCA8ZW1haWxfY2xpZW50cz5gCitmb3IgaGludHMgYWJvdXQgY29uZmlndXJpbmcgeW91ciBlLW1haWwgY2xpZW50IHNvIHRoYXQgaXQgc2VuZHMgeW91ciBwYXRjaGVzCit1bnRvdWNoZWQuCiAKLTcpIEUtbWFpbCBzaXplLgotLS0tLS0tLS0tLS0tLS0tCis3KSBFLW1haWwgc2l6ZQorLS0tLS0tLS0tLS0tLS0KIAogTGFyZ2UgY2hhbmdlcyBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBtYWlsaW5nIGxpc3RzLCBhbmQgc29tZQogbWFpbnRhaW5lcnMuICBJZiB5b3VyIHBhdGNoLCB1bmNvbXByZXNzZWQsIGV4Y2VlZHMgMzAwIGtCIGluIHNpemUsCkBAIC0zNjYsOCArMzc3LDggQEAKIHRoYXQgaWYgeW91ciBwYXRjaCBleGNlZWRzIDMwMCBrQiwgaXQgYWxtb3N0IGNlcnRhaW5seSBuZWVkcyB0byBiZSBicm9rZW4gdXAKIGFueXdheS4KIAotOCkgUmVzcG9uZCB0byByZXZpZXcgY29tbWVudHMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzgpIFJlc3BvbmQgdG8gcmV2aWV3IGNvbW1lbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBZb3VyIHBhdGNoIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBnZXQgY29tbWVudHMgZnJvbSByZXZpZXdlcnMgb24gd2F5cyBpbgogd2hpY2ggdGhlIHBhdGNoIGNhbiBiZSBpbXByb3ZlZC4gIFlvdSBtdXN0IHJlc3BvbmQgdG8gdGhvc2UgY29tbWVudHM7CkBAIC0zODIsOCArMzkzLDggQEAKIHBvbGl0ZWx5IGFuZCBhZGRyZXNzIHRoZSBwcm9ibGVtcyB0aGV5IGhhdmUgcG9pbnRlZCBvdXQuCiAKIAotOSkgRG9uJ3QgZ2V0IGRpc2NvdXJhZ2VkIC0gb3IgaW1wYXRpZW50LgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOSkgRG9uJ3QgZ2V0IGRpc2NvdXJhZ2VkIC0gb3IgaW1wYXRpZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQWZ0ZXIgeW91IGhhdmUgc3VibWl0dGVkIHlvdXIgY2hhbmdlLCBiZSBwYXRpZW50IGFuZCB3YWl0LiAgUmV2aWV3ZXJzIGFyZQogYnVzeSBwZW9wbGUgYW5kIG1heSBub3QgZ2V0IHRvIHlvdXIgcGF0Y2ggcmlnaHQgYXdheS4KQEAgLTQxOSw5ICs0MzAsMTAgQEAKIHBhc3MgaXQgb24gYXMgYW4gb3Blbi1zb3VyY2UgcGF0Y2guICBUaGUgcnVsZXMgYXJlIHByZXR0eSBzaW1wbGU6IGlmIHlvdQogY2FuIGNlcnRpZnkgdGhlIGJlbG93OgogCi0gICAgICAgIERldmVsb3BlcidzIENlcnRpZmljYXRlIG9mIE9yaWdpbiAxLjEKK0RldmVsb3BlcidzIENlcnRpZmljYXRlIG9mIE9yaWdpbiAxLjEKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAotICAgICAgICBCeSBtYWtpbmcgYSBjb250cmlidXRpb24gdG8gdGhpcyBwcm9qZWN0LCBJIGNlcnRpZnkgdGhhdDoKK0J5IG1ha2luZyBhIGNvbnRyaWJ1dGlvbiB0byB0aGlzIHByb2plY3QsIEkgY2VydGlmeSB0aGF0OgogCiAgICAgICAgIChhKSBUaGUgY29udHJpYnV0aW9uIHdhcyBjcmVhdGVkIGluIHdob2xlIG9yIGluIHBhcnQgYnkgbWUgYW5kIEkKICAgICAgICAgICAgIGhhdmUgdGhlIHJpZ2h0IHRvIHN1Ym1pdCBpdCB1bmRlciB0aGUgb3BlbiBzb3VyY2UgbGljZW5zZQpAQCAtNDQ1LDcgKzQ1Nyw3IEBACiAgICAgICAgICAgICBtYWludGFpbmVkIGluZGVmaW5pdGVseSBhbmQgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgY29uc2lzdGVudCB3aXRoCiAgICAgICAgICAgICB0aGlzIHByb2plY3Qgb3IgdGhlIG9wZW4gc291cmNlIGxpY2Vuc2UocykgaW52b2x2ZWQuCiAKLXRoZW4geW91IGp1c3QgYWRkIGEgbGluZSBzYXlpbmcKK3RoZW4geW91IGp1c3QgYWRkIGEgbGluZSBzYXlpbmc6OgogCiAJU2lnbmVkLW9mZi1ieTogUmFuZG9tIEogRGV2ZWxvcGVyIDxyYW5kb21AZGV2ZWxvcGVyLmV4YW1wbGUub3JnPgogCkBAIC00NjYsNyArNDc4LDcgQEAKIHRoZSBuYXR1cmUgb2YgeW91ciBjaGFuZ2VzLiBXaGlsZSB0aGVyZSBpcyBub3RoaW5nIG1hbmRhdG9yeSBhYm91dCB0aGlzLCBpdAogc2VlbXMgbGlrZSBwcmVwZW5kaW5nIHRoZSBkZXNjcmlwdGlvbiB3aXRoIHlvdXIgbWFpbCBhbmQvb3IgbmFtZSwgYWxsCiBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMsIGlzIG5vdGljZWFibGUgZW5vdWdoIHRvIG1ha2UgaXQgb2J2aW91cyB0aGF0Ci15b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBsYXN0LW1pbnV0ZSBjaGFuZ2VzLiBFeGFtcGxlIDoKK3lvdSBhcmUgcmVzcG9uc2libGUgZm9yIGxhc3QtbWludXRlIGNoYW5nZXMuIEV4YW1wbGU6OgogCiAJU2lnbmVkLW9mZi1ieTogUmFuZG9tIEogRGV2ZWxvcGVyIDxyYW5kb21AZGV2ZWxvcGVyLmV4YW1wbGUub3JnPgogCVtsdWNreUBtYWludGFpbmVyLmV4YW1wbGUub3JnOiBzdHJ1Y3QgZm9vIG1vdmVkIGZyb20gZm9vLmMgdG8gZm9vLmhdCkBAIC00ODEsMTUgKzQ5MywxNSBAQAogU3BlY2lhbCBub3RlIHRvIGJhY2stcG9ydGVyczogSXQgc2VlbXMgdG8gYmUgYSBjb21tb24gYW5kIHVzZWZ1bCBwcmFjdGljZQogdG8gaW5zZXJ0IGFuIGluZGljYXRpb24gb2YgdGhlIG9yaWdpbiBvZiBhIHBhdGNoIGF0IHRoZSB0b3Agb2YgdGhlIGNvbW1pdAogbWVzc2FnZSAoanVzdCBhZnRlciB0aGUgc3ViamVjdCBsaW5lKSB0byBmYWNpbGl0YXRlIHRyYWNraW5nLiBGb3IgaW5zdGFuY2UsCi1oZXJlJ3Mgd2hhdCB3ZSBzZWUgaW4gYSAzLngtc3RhYmxlIHJlbGVhc2U6CitoZXJlJ3Mgd2hhdCB3ZSBzZWUgaW4gYSAzLngtc3RhYmxlIHJlbGVhc2U6OgogCi1EYXRlOiAgIFR1ZSBPY3QgNyAwNzoyNjozOCAyMDE0IC0wNDAwCisgIERhdGU6ICAgVHVlIE9jdCA3IDA3OjI2OjM4IDIwMTQgLTA0MDAKIAogICAgIGxpYmF0YTogVW4tYnJlYWsgQVRBIGJsYWNrbGlzdAogCiAgICAgY29tbWl0IDFjNDAyNzk5NjBiY2Q3ZDUyZGJkZjFkNDY2YjIwZDI0Yjk5MTc2YzggdXBzdHJlYW0uCiAKLUFuZCBoZXJlJ3Mgd2hhdCBtaWdodCBhcHBlYXIgaW4gYW4gb2xkZXIga2VybmVsIG9uY2UgYSBwYXRjaCBpcyBiYWNrcG9ydGVkOgorQW5kIGhlcmUncyB3aGF0IG1pZ2h0IGFwcGVhciBpbiBhbiBvbGRlciBrZXJuZWwgb25jZSBhIHBhdGNoIGlzIGJhY2twb3J0ZWQ6OgogCiAgICAgRGF0ZTogICBUdWUgTWF5IDEzIDIyOjEyOjI3IDIwMDggKzAyMDAKIApAQCAtNTI5LDcgKzU0MSw3IEBACiBsaXN0IGFyY2hpdmVzLgogCiBJZiBhIHBlcnNvbiBoYXMgaGFkIHRoZSBvcHBvcnR1bml0eSB0byBjb21tZW50IG9uIGEgcGF0Y2gsIGJ1dCBoYXMgbm90Ci1wcm92aWRlZCBzdWNoIGNvbW1lbnRzLCB5b3UgbWF5IG9wdGlvbmFsbHkgYWRkIGEgIkNjOiIgdGFnIHRvIHRoZSBwYXRjaC4KK3Byb3ZpZGVkIHN1Y2ggY29tbWVudHMsIHlvdSBtYXkgb3B0aW9uYWxseSBhZGQgYSBgYENjOmBgIHRhZyB0byB0aGUgcGF0Y2guCiBUaGlzIGlzIHRoZSBvbmx5IHRhZyB3aGljaCBtaWdodCBiZSBhZGRlZCB3aXRob3V0IGFuIGV4cGxpY2l0IGFjdGlvbiBieSB0aGUKIHBlcnNvbiBpdCBuYW1lcyAtIGJ1dCBpdCBzaG91bGQgaW5kaWNhdGUgdGhhdCB0aGlzIHBlcnNvbiB3YXMgY29waWVkIG9uIHRoZQogcGF0Y2guICBUaGlzIHRhZyBkb2N1bWVudHMgdGhhdCBwb3RlbnRpYWxseSBpbnRlcmVzdGVkIHBhcnRpZXMKQEAgLTU1MiwxMSArNTY0LDEyIEBACiBSZXZpZXdlZC1ieTosIGluc3RlYWQsIGluZGljYXRlcyB0aGF0IHRoZSBwYXRjaCBoYXMgYmVlbiByZXZpZXdlZCBhbmQgZm91bmQKIGFjY2VwdGFibGUgYWNjb3JkaW5nIHRvIHRoZSBSZXZpZXdlcidzIFN0YXRlbWVudDoKIAotCVJldmlld2VyJ3Mgc3RhdGVtZW50IG9mIG92ZXJzaWdodAorUmV2aWV3ZXIncyBzdGF0ZW1lbnQgb2Ygb3ZlcnNpZ2h0CiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KIAotCUJ5IG9mZmVyaW5nIG15IFJldmlld2VkLWJ5OiB0YWcsIEkgc3RhdGUgdGhhdDoKK0J5IG9mZmVyaW5nIG15IFJldmlld2VkLWJ5OiB0YWcsIEkgc3RhdGUgdGhhdDoKIAotIAkgKGEpIEkgaGF2ZSBjYXJyaWVkIG91dCBhIHRlY2huaWNhbCByZXZpZXcgb2YgdGhpcyBwYXRjaCB0bworCSAoYSkgSSBoYXZlIGNhcnJpZWQgb3V0IGEgdGVjaG5pY2FsIHJldmlldyBvZiB0aGlzIHBhdGNoIHRvCiAJICAgICBldmFsdWF0ZSBpdHMgYXBwcm9wcmlhdGVuZXNzIGFuZCByZWFkaW5lc3MgZm9yIGluY2x1c2lvbiBpbnRvCiAJICAgICB0aGUgbWFpbmxpbmUga2VybmVsLgogCkBAIC01OTQsMjQgKzYwNywyNSBAQAogaXMgdXNlZCB0byBtYWtlIGl0IGVhc3kgdG8gZGV0ZXJtaW5lIHdoZXJlIGEgYnVnIG9yaWdpbmF0ZWQsIHdoaWNoIGNhbiBoZWxwCiByZXZpZXcgYSBidWcgZml4LiBUaGlzIHRhZyBhbHNvIGFzc2lzdHMgdGhlIHN0YWJsZSBrZXJuZWwgdGVhbSBpbiBkZXRlcm1pbmluZwogd2hpY2ggc3RhYmxlIGtlcm5lbCB2ZXJzaW9ucyBzaG91bGQgcmVjZWl2ZSB5b3VyIGZpeC4gVGhpcyBpcyB0aGUgcHJlZmVycmVkCi1tZXRob2QgZm9yIGluZGljYXRpbmcgYSBidWcgZml4ZWQgYnkgdGhlIHBhdGNoLiBTZWUgIzIgYWJvdmUgZm9yIG1vcmUgZGV0YWlscy4KK21ldGhvZCBmb3IgaW5kaWNhdGluZyBhIGJ1ZyBmaXhlZCBieSB0aGUgcGF0Y2guIFNlZSA6cmVmOmBkZXNjcmliZV9jaGFuZ2VzYAorZm9yIG1vcmUgZGV0YWlscy4KIAogCiAxNCkgVGhlIGNhbm9uaWNhbCBwYXRjaCBmb3JtYXQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGhvdyB0aGUgcGF0Y2ggaXRzZWxmIHNob3VsZCBiZSBmb3JtYXR0ZWQuICBOb3RlCi10aGF0LCBpZiB5b3UgaGF2ZSB5b3VyIHBhdGNoZXMgc3RvcmVkIGluIGEgZ2l0IHJlcG9zaXRvcnksIHByb3BlciBwYXRjaAotZm9ybWF0dGluZyBjYW4gYmUgaGFkIHdpdGggImdpdCBmb3JtYXQtcGF0Y2giLiAgVGhlIHRvb2xzIGNhbm5vdCBjcmVhdGUKK3RoYXQsIGlmIHlvdSBoYXZlIHlvdXIgcGF0Y2hlcyBzdG9yZWQgaW4gYSBgYGdpdGBgIHJlcG9zaXRvcnksIHByb3BlciBwYXRjaAorZm9ybWF0dGluZyBjYW4gYmUgaGFkIHdpdGggYGBnaXQgZm9ybWF0LXBhdGNoYGAuICBUaGUgdG9vbHMgY2Fubm90IGNyZWF0ZQogdGhlIG5lY2Vzc2FyeSB0ZXh0LCB0aG91Z2gsIHNvIHJlYWQgdGhlIGluc3RydWN0aW9ucyBiZWxvdyBhbnl3YXkuCiAKLVRoZSBjYW5vbmljYWwgcGF0Y2ggc3ViamVjdCBsaW5lIGlzOgorVGhlIGNhbm9uaWNhbCBwYXRjaCBzdWJqZWN0IGxpbmUgaXM6OgogCiAgICAgU3ViamVjdDogW1BBVENIIDAwMS8xMjNdIHN1YnN5c3RlbTogc3VtbWFyeSBwaHJhc2UKIAogVGhlIGNhbm9uaWNhbCBwYXRjaCBtZXNzYWdlIGJvZHkgY29udGFpbnMgdGhlIGZvbGxvd2luZzoKIAotICAtIEEgImZyb20iIGxpbmUgc3BlY2lmeWluZyB0aGUgcGF0Y2ggYXV0aG9yIChvbmx5IG5lZWRlZCBpZiB0aGUgcGVyc29uCisgIC0gQSBgYGZyb21gYCBsaW5lIHNwZWNpZnlpbmcgdGhlIHBhdGNoIGF1dGhvciAob25seSBuZWVkZWQgaWYgdGhlIHBlcnNvbgogICAgIHNlbmRpbmcgdGhlIHBhdGNoIGlzIG5vdCB0aGUgYXV0aG9yKS4KIAogICAtIEFuIGVtcHR5IGxpbmUuCkBAIC02MTksNDYgKzYzMyw0NiBAQAogICAtIFRoZSBib2R5IG9mIHRoZSBleHBsYW5hdGlvbiwgbGluZSB3cmFwcGVkIGF0IDc1IGNvbHVtbnMsIHdoaWNoIHdpbGwKICAgICBiZSBjb3BpZWQgdG8gdGhlIHBlcm1hbmVudCBjaGFuZ2Vsb2cgdG8gZGVzY3JpYmUgdGhpcyBwYXRjaC4KIAotICAtIFRoZSAiU2lnbmVkLW9mZi1ieToiIGxpbmVzLCBkZXNjcmliZWQgYWJvdmUsIHdoaWNoIHdpbGwKKyAgLSBUaGUgYGBTaWduZWQtb2ZmLWJ5OmBgIGxpbmVzLCBkZXNjcmliZWQgYWJvdmUsIHdoaWNoIHdpbGwKICAgICBhbHNvIGdvIGluIHRoZSBjaGFuZ2Vsb2cuCiAKLSAgLSBBIG1hcmtlciBsaW5lIGNvbnRhaW5pbmcgc2ltcGx5ICItLS0iLgorICAtIEEgbWFya2VyIGxpbmUgY29udGFpbmluZyBzaW1wbHkgYGAtLS1gYC4KIAogICAtIEFueSBhZGRpdGlvbmFsIGNvbW1lbnRzIG5vdCBzdWl0YWJsZSBmb3IgdGhlIGNoYW5nZWxvZy4KIAotICAtIFRoZSBhY3R1YWwgcGF0Y2ggKGRpZmYgb3V0cHV0KS4KKyAgLSBUaGUgYWN0dWFsIHBhdGNoIChgYGRpZmZgYCBvdXRwdXQpLgogCiBUaGUgU3ViamVjdCBsaW5lIGZvcm1hdCBtYWtlcyBpdCB2ZXJ5IGVhc3kgdG8gc29ydCB0aGUgZW1haWxzCiBhbHBoYWJldGljYWxseSBieSBzdWJqZWN0IGxpbmUgLSBwcmV0dHkgbXVjaCBhbnkgZW1haWwgcmVhZGVyIHdpbGwKIHN1cHBvcnQgdGhhdCAtIHNpbmNlIGJlY2F1c2UgdGhlIHNlcXVlbmNlIG51bWJlciBpcyB6ZXJvLXBhZGRlZCwKIHRoZSBudW1lcmljYWwgYW5kIGFscGhhYmV0aWMgc29ydCBpcyB0aGUgc2FtZS4KIAotVGhlICJzdWJzeXN0ZW0iIGluIHRoZSBlbWFpbCdzIFN1YmplY3Qgc2hvdWxkIGlkZW50aWZ5IHdoaWNoCitUaGUgYGBzdWJzeXN0ZW1gYCBpbiB0aGUgZW1haWwncyBTdWJqZWN0IHNob3VsZCBpZGVudGlmeSB3aGljaAogYXJlYSBvciBzdWJzeXN0ZW0gb2YgdGhlIGtlcm5lbCBpcyBiZWluZyBwYXRjaGVkLgogCi1UaGUgInN1bW1hcnkgcGhyYXNlIiBpbiB0aGUgZW1haWwncyBTdWJqZWN0IHNob3VsZCBjb25jaXNlbHkKLWRlc2NyaWJlIHRoZSBwYXRjaCB3aGljaCB0aGF0IGVtYWlsIGNvbnRhaW5zLiAgVGhlICJzdW1tYXJ5Ci1waHJhc2UiIHNob3VsZCBub3QgYmUgYSBmaWxlbmFtZS4gIERvIG5vdCB1c2UgdGhlIHNhbWUgInN1bW1hcnkKLXBocmFzZSIgZm9yIGV2ZXJ5IHBhdGNoIGluIGEgd2hvbGUgcGF0Y2ggc2VyaWVzICh3aGVyZSBhICJwYXRjaAotc2VyaWVzIiBpcyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIG11bHRpcGxlLCByZWxhdGVkIHBhdGNoZXMpLgorVGhlIGBgc3VtbWFyeSBwaHJhc2VgYCBpbiB0aGUgZW1haWwncyBTdWJqZWN0IHNob3VsZCBjb25jaXNlbHkKK2Rlc2NyaWJlIHRoZSBwYXRjaCB3aGljaCB0aGF0IGVtYWlsIGNvbnRhaW5zLiAgVGhlIGBgc3VtbWFyeQorcGhyYXNlYGAgc2hvdWxkIG5vdCBiZSBhIGZpbGVuYW1lLiAgRG8gbm90IHVzZSB0aGUgc2FtZSBgYHN1bW1hcnkKK3BocmFzZWBgIGZvciBldmVyeSBwYXRjaCBpbiBhIHdob2xlIHBhdGNoIHNlcmllcyAod2hlcmUgYSBgYHBhdGNoCitzZXJpZXNgYCBpcyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIG11bHRpcGxlLCByZWxhdGVkIHBhdGNoZXMpLgogCi1CZWFyIGluIG1pbmQgdGhhdCB0aGUgInN1bW1hcnkgcGhyYXNlIiBvZiB5b3VyIGVtYWlsIGJlY29tZXMgYQorQmVhciBpbiBtaW5kIHRoYXQgdGhlIGBgc3VtbWFyeSBwaHJhc2VgYCBvZiB5b3VyIGVtYWlsIGJlY29tZXMgYQogZ2xvYmFsbHktdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoYXQgcGF0Y2guICBJdCBwcm9wYWdhdGVzIGFsbCB0aGUgd2F5Ci1pbnRvIHRoZSBnaXQgY2hhbmdlbG9nLiAgVGhlICJzdW1tYXJ5IHBocmFzZSIgbWF5IGxhdGVyIGJlIHVzZWQgaW4KK2ludG8gdGhlIGBgZ2l0YGAgY2hhbmdlbG9nLiAgVGhlIGBgc3VtbWFyeSBwaHJhc2VgYCBtYXkgbGF0ZXIgYmUgdXNlZCBpbgogZGV2ZWxvcGVyIGRpc2N1c3Npb25zIHdoaWNoIHJlZmVyIHRvIHRoZSBwYXRjaC4gIFBlb3BsZSB3aWxsIHdhbnQgdG8KLWdvb2dsZSBmb3IgdGhlICJzdW1tYXJ5IHBocmFzZSIgdG8gcmVhZCBkaXNjdXNzaW9uIHJlZ2FyZGluZyB0aGF0Citnb29nbGUgZm9yIHRoZSBgYHN1bW1hcnkgcGhyYXNlYGAgdG8gcmVhZCBkaXNjdXNzaW9uIHJlZ2FyZGluZyB0aGF0CiBwYXRjaC4gIEl0IHdpbGwgYWxzbyBiZSB0aGUgb25seSB0aGluZyB0aGF0IHBlb3BsZSBtYXkgcXVpY2tseSBzZWUKIHdoZW4sIHR3byBvciB0aHJlZSBtb250aHMgbGF0ZXIsIHRoZXkgYXJlIGdvaW5nIHRocm91Z2ggcGVyaGFwcwotdGhvdXNhbmRzIG9mIHBhdGNoZXMgdXNpbmcgdG9vbHMgc3VjaCBhcyAiZ2l0ayIgb3IgImdpdCBsb2cKLS0tb25lbGluZSIuCit0aG91c2FuZHMgb2YgcGF0Y2hlcyB1c2luZyB0b29scyBzdWNoIGFzIGBgZ2l0a2BgIG9yIGBgZ2l0IGxvZworLS1vbmVsaW5lYGAuCiAKLUZvciB0aGVzZSByZWFzb25zLCB0aGUgInN1bW1hcnkiIG11c3QgYmUgbm8gbW9yZSB0aGFuIDcwLTc1CitGb3IgdGhlc2UgcmVhc29ucywgdGhlIGBgc3VtbWFyeWBgIG11c3QgYmUgbm8gbW9yZSB0aGFuIDcwLTc1CiBjaGFyYWN0ZXJzLCBhbmQgaXQgbXVzdCBkZXNjcmliZSBib3RoIHdoYXQgdGhlIHBhdGNoIGNoYW5nZXMsIGFzIHdlbGwKIGFzIHdoeSB0aGUgcGF0Y2ggbWlnaHQgYmUgbmVjZXNzYXJ5LiAgSXQgaXMgY2hhbGxlbmdpbmcgdG8gYmUgYm90aAogc3VjY2luY3QgYW5kIGRlc2NyaXB0aXZlLCBidXQgdGhhdCBpcyB3aGF0IGEgd2VsbC13cml0dGVuIHN1bW1hcnkKIHNob3VsZCBkby4KIAotVGhlICJzdW1tYXJ5IHBocmFzZSIgbWF5IGJlIHByZWZpeGVkIGJ5IHRhZ3MgZW5jbG9zZWQgaW4gc3F1YXJlCitUaGUgYGBzdW1tYXJ5IHBocmFzZWBgIG1heSBiZSBwcmVmaXhlZCBieSB0YWdzIGVuY2xvc2VkIGluIHNxdWFyZQogYnJhY2tldHM6ICJTdWJqZWN0OiBbUEFUQ0ggPHRhZz4uLi5dIDxzdW1tYXJ5IHBocmFzZT4iLiAgVGhlIHRhZ3MgYXJlCiBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBzdW1tYXJ5IHBocmFzZSwgYnV0IGRlc2NyaWJlIGhvdyB0aGUgcGF0Y2gKIHNob3VsZCBiZSB0cmVhdGVkLiAgQ29tbW9uIHRhZ3MgbWlnaHQgaW5jbHVkZSBhIHZlcnNpb24gZGVzY3JpcHRvciBpZgpAQCAtNjcwLDE5ICs2ODQsMTkgQEAKIGFwcGxpZWQgYW5kIHRoYXQgdGhleSBoYXZlIHJldmlld2VkIG9yIGFwcGxpZWQgYWxsIG9mIHRoZSBwYXRjaGVzIGluCiB0aGUgcGF0Y2ggc2VyaWVzLgogCi1BIGNvdXBsZSBvZiBleGFtcGxlIFN1YmplY3RzOgorQSBjb3VwbGUgb2YgZXhhbXBsZSBTdWJqZWN0czo6CiAKICAgICBTdWJqZWN0OiBbUEFUQ0ggMi81XSBleHQyOiBpbXByb3ZlIHNjYWxhYmlsaXR5IG9mIGJpdG1hcCBzZWFyY2hpbmcKICAgICBTdWJqZWN0OiBbUEFUQ0ggdjIgMDEvMjddIHg4NjogZml4IGVmbGFncyB0cmFja2luZwogCi1UaGUgImZyb20iIGxpbmUgbXVzdCBiZSB0aGUgdmVyeSBmaXJzdCBsaW5lIGluIHRoZSBtZXNzYWdlIGJvZHksCitUaGUgYGBmcm9tYGAgbGluZSBtdXN0IGJlIHRoZSB2ZXJ5IGZpcnN0IGxpbmUgaW4gdGhlIG1lc3NhZ2UgYm9keSwKIGFuZCBoYXMgdGhlIGZvcm06CiAKICAgICAgICAgRnJvbTogT3JpZ2luYWwgQXV0aG9yIDxhdXRob3JAZXhhbXBsZS5jb20+CiAKLVRoZSAiZnJvbSIgbGluZSBzcGVjaWZpZXMgd2hvIHdpbGwgYmUgY3JlZGl0ZWQgYXMgdGhlIGF1dGhvciBvZiB0aGUKLXBhdGNoIGluIHRoZSBwZXJtYW5lbnQgY2hhbmdlbG9nLiAgSWYgdGhlICJmcm9tIiBsaW5lIGlzIG1pc3NpbmcsCi10aGVuIHRoZSAiRnJvbToiIGxpbmUgZnJvbSB0aGUgZW1haWwgaGVhZGVyIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUKK1RoZSBgYGZyb21gYCBsaW5lIHNwZWNpZmllcyB3aG8gd2lsbCBiZSBjcmVkaXRlZCBhcyB0aGUgYXV0aG9yIG9mIHRoZQorcGF0Y2ggaW4gdGhlIHBlcm1hbmVudCBjaGFuZ2Vsb2cuICBJZiB0aGUgYGBmcm9tYGAgbGluZSBpcyBtaXNzaW5nLAordGhlbiB0aGUgYGBGcm9tOmBgIGxpbmUgZnJvbSB0aGUgZW1haWwgaGVhZGVyIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUKIHRoZSBwYXRjaCBhdXRob3IgaW4gdGhlIGNoYW5nZWxvZy4KIAogVGhlIGV4cGxhbmF0aW9uIGJvZHkgd2lsbCBiZSBjb21taXR0ZWQgdG8gdGhlIHBlcm1hbmVudCBzb3VyY2UKQEAgLTY5NCwzNSArNzA4LDM3IEBACiBsb29raW5nIGZvciB0aGUgYXBwbGljYWJsZSBwYXRjaC4gIElmIGEgcGF0Y2ggZml4ZXMgYSBjb21waWxlIGZhaWx1cmUsCiBpdCBtYXkgbm90IGJlIG5lY2Vzc2FyeSB0byBpbmNsdWRlIF9hbGxfIG9mIHRoZSBjb21waWxlIGZhaWx1cmVzOyBqdXN0CiBlbm91Z2ggdGhhdCBpdCBpcyBsaWtlbHkgdGhhdCBzb21lb25lIHNlYXJjaGluZyBmb3IgdGhlIHBhdGNoIGNhbiBmaW5kCi1pdC4gIEFzIGluIHRoZSAic3VtbWFyeSBwaHJhc2UiLCBpdCBpcyBpbXBvcnRhbnQgdG8gYmUgYm90aCBzdWNjaW5jdCBhcworaXQuICBBcyBpbiB0aGUgYGBzdW1tYXJ5IHBocmFzZWBgLCBpdCBpcyBpbXBvcnRhbnQgdG8gYmUgYm90aCBzdWNjaW5jdCBhcwogd2VsbCBhcyBkZXNjcmlwdGl2ZS4KIAotVGhlICItLS0iIG1hcmtlciBsaW5lIHNlcnZlcyB0aGUgZXNzZW50aWFsIHB1cnBvc2Ugb2YgbWFya2luZyBmb3IgcGF0Y2gKK1RoZSBgYC0tLWBgIG1hcmtlciBsaW5lIHNlcnZlcyB0aGUgZXNzZW50aWFsIHB1cnBvc2Ugb2YgbWFya2luZyBmb3IgcGF0Y2gKIGhhbmRsaW5nIHRvb2xzIHdoZXJlIHRoZSBjaGFuZ2Vsb2cgbWVzc2FnZSBlbmRzLgogCi1PbmUgZ29vZCB1c2UgZm9yIHRoZSBhZGRpdGlvbmFsIGNvbW1lbnRzIGFmdGVyIHRoZSAiLS0tIiBtYXJrZXIgaXMgZm9yCi1hIGRpZmZzdGF0LCB0byBzaG93IHdoYXQgZmlsZXMgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlIG51bWJlciBvZgotaW5zZXJ0ZWQgYW5kIGRlbGV0ZWQgbGluZXMgcGVyIGZpbGUuICBBIGRpZmZzdGF0IGlzIGVzcGVjaWFsbHkgdXNlZnVsCitPbmUgZ29vZCB1c2UgZm9yIHRoZSBhZGRpdGlvbmFsIGNvbW1lbnRzIGFmdGVyIHRoZSBgYC0tLWBgIG1hcmtlciBpcyBmb3IKK2EgYGBkaWZmc3RhdGBgLCB0byBzaG93IHdoYXQgZmlsZXMgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlIG51bWJlciBvZgoraW5zZXJ0ZWQgYW5kIGRlbGV0ZWQgbGluZXMgcGVyIGZpbGUuICBBIGBgZGlmZnN0YXRgYCBpcyBlc3BlY2lhbGx5IHVzZWZ1bAogb24gYmlnZ2VyIHBhdGNoZXMuICBPdGhlciBjb21tZW50cyByZWxldmFudCBvbmx5IHRvIHRoZSBtb21lbnQgb3IgdGhlCiBtYWludGFpbmVyLCBub3Qgc3VpdGFibGUgZm9yIHRoZSBwZXJtYW5lbnQgY2hhbmdlbG9nLCBzaG91bGQgYWxzbyBnbwotaGVyZS4gIEEgZ29vZCBleGFtcGxlIG9mIHN1Y2ggY29tbWVudHMgbWlnaHQgYmUgInBhdGNoIGNoYW5nZWxvZ3MiCitoZXJlLiAgQSBnb29kIGV4YW1wbGUgb2Ygc3VjaCBjb21tZW50cyBtaWdodCBiZSBgYHBhdGNoIGNoYW5nZWxvZ3NgYAogd2hpY2ggZGVzY3JpYmUgd2hhdCBoYXMgY2hhbmdlZCBiZXR3ZWVuIHRoZSB2MSBhbmQgdjIgdmVyc2lvbiBvZiB0aGUKIHBhdGNoLgogCi1JZiB5b3UgYXJlIGdvaW5nIHRvIGluY2x1ZGUgYSBkaWZmc3RhdCBhZnRlciB0aGUgIi0tLSIgbWFya2VyLCBwbGVhc2UKLXVzZSBkaWZmc3RhdCBvcHRpb25zICItcCAxIC13IDcwIiBzbyB0aGF0IGZpbGVuYW1lcyBhcmUgbGlzdGVkIGZyb20KK0lmIHlvdSBhcmUgZ29pbmcgdG8gaW5jbHVkZSBhIGBgZGlmZnN0YXRgYCBhZnRlciB0aGUgYGAtLS1gYCBtYXJrZXIsIHBsZWFzZQordXNlIGBgZGlmZnN0YXRgYCBvcHRpb25zIGBgLXAgMSAtdyA3MGBgIHNvIHRoYXQgZmlsZW5hbWVzIGFyZSBsaXN0ZWQgZnJvbQogdGhlIHRvcCBvZiB0aGUga2VybmVsIHNvdXJjZSB0cmVlIGFuZCBkb24ndCB1c2UgdG9vIG11Y2ggaG9yaXpvbnRhbAotc3BhY2UgKGVhc2lseSBmaXQgaW4gODAgY29sdW1ucywgbWF5YmUgd2l0aCBzb21lIGluZGVudGF0aW9uKS4gIChnaXQKK3NwYWNlIChlYXNpbHkgZml0IGluIDgwIGNvbHVtbnMsIG1heWJlIHdpdGggc29tZSBpbmRlbnRhdGlvbikuICAoYGBnaXRgYAogZ2VuZXJhdGVzIGFwcHJvcHJpYXRlIGRpZmZzdGF0cyBieSBkZWZhdWx0LikKIAogU2VlIG1vcmUgZGV0YWlscyBvbiB0aGUgcHJvcGVyIHBhdGNoIGZvcm1hdCBpbiB0aGUgZm9sbG93aW5nCiByZWZlcmVuY2VzLgogCisuLiBfZXhwbGljaXRfaW5fcmVwbHlfdG86CisKIDE1KSBFeHBsaWNpdCBJbi1SZXBseS1UbyBoZWFkZXJzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJdCBjYW4gYmUgaGVscGZ1bCB0byBtYW51YWxseSBhZGQgSW4tUmVwbHktVG86IGhlYWRlcnMgdG8gYSBwYXRjaAotKGUuZy4sIHdoZW4gdXNpbmcgImdpdCBzZW5kLWVtYWlsIikgdG8gYXNzb2NpYXRlIHRoZSBwYXRjaCB3aXRoCisoZS5nLiwgd2hlbiB1c2luZyBgYGdpdCBzZW5kLWVtYWlsYGApIHRvIGFzc29jaWF0ZSB0aGUgcGF0Y2ggd2l0aAogcHJldmlvdXMgcmVsZXZhbnQgZGlzY3Vzc2lvbiwgZS5nLiB0byBsaW5rIGEgYnVnIGZpeCB0byB0aGUgZW1haWwgd2l0aAogdGhlIGJ1ZyByZXBvcnQuICBIb3dldmVyLCBmb3IgYSBtdWx0aS1wYXRjaCBzZXJpZXMsIGl0IGlzIGdlbmVyYWxseQogYmVzdCB0byBhdm9pZCB1c2luZyBJbi1SZXBseS1UbzogdG8gbGluayB0byBvbGRlciB2ZXJzaW9ucyBvZiB0aGUKQEAgLTczMiwxMiArNzQ4LDEyIEBACiB0aGUgY292ZXIgZW1haWwgdGV4dCkgdG8gbGluayB0byBhbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhlIHBhdGNoIHNlcmllcy4KIAogCi0xNikgU2VuZGluZyAiZ2l0IHB1bGwiIHJlcXVlc3RzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisxNikgU2VuZGluZyBgYGdpdCBwdWxsYGAgcmVxdWVzdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJZiB5b3UgaGF2ZSBhIHNlcmllcyBvZiBwYXRjaGVzLCBpdCBtYXkgYmUgbW9zdCBjb252ZW5pZW50IHRvIGhhdmUgdGhlCiBtYWludGFpbmVyIHB1bGwgdGhlbSBkaXJlY3RseSBpbnRvIHRoZSBzdWJzeXN0ZW0gcmVwb3NpdG9yeSB3aXRoIGEKLSJnaXQgcHVsbCIgb3BlcmF0aW9uLiAgTm90ZSwgaG93ZXZlciwgdGhhdCBwdWxsaW5nIHBhdGNoZXMgZnJvbSBhIGRldmVsb3BlcgorYGBnaXQgcHVsbGBgIG9wZXJhdGlvbi4gIE5vdGUsIGhvd2V2ZXIsIHRoYXQgcHVsbGluZyBwYXRjaGVzIGZyb20gYSBkZXZlbG9wZXIKIHJlcXVpcmVzIGEgaGlnaGVyIGRlZ3JlZSBvZiB0cnVzdCB0aGFuIHRha2luZyBwYXRjaGVzIGZyb20gYSBtYWlsaW5nIGxpc3QuCiBBcyBhIHJlc3VsdCwgbWFueSBzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgYXJlIHJlbHVjdGFudCB0byB0YWtlIHB1bGwKIHJlcXVlc3RzLCBlc3BlY2lhbGx5IGZyb20gbmV3LCB1bmtub3duIGRldmVsb3BlcnMuICBJZiBpbiBkb3VidCB5b3UgY2FuIHVzZQpAQCAtNzQ2LDcgKzc2Miw3IEBACiAKIEEgcHVsbCByZXF1ZXN0IHNob3VsZCBoYXZlIFtHSVRdIG9yIFtQVUxMXSBpbiB0aGUgc3ViamVjdCBsaW5lLiAgVGhlCiByZXF1ZXN0IGl0c2VsZiBzaG91bGQgaW5jbHVkZSB0aGUgcmVwb3NpdG9yeSBuYW1lIGFuZCB0aGUgYnJhbmNoIG9mCi1pbnRlcmVzdCBvbiBhIHNpbmdsZSBsaW5lOyBpdCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZToKK2ludGVyZXN0IG9uIGEgc2luZ2xlIGxpbmU7IGl0IHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlOjoKIAogICBQbGVhc2UgcHVsbCBmcm9tCiAKQEAgLTc1NSwxMCArNzcxLDEwIEBACiAgIHRvIGdldCB0aGVzZSBjaGFuZ2VzOgogCiBBIHB1bGwgcmVxdWVzdCBzaG91bGQgYWxzbyBpbmNsdWRlIGFuIG92ZXJhbGwgbWVzc2FnZSBzYXlpbmcgd2hhdCB3aWxsIGJlCi1pbmNsdWRlZCBpbiB0aGUgcmVxdWVzdCwgYSAiZ2l0IHNob3J0bG9nIiBsaXN0aW5nIG9mIHRoZSBwYXRjaGVzCi10aGVtc2VsdmVzLCBhbmQgYSBkaWZmc3RhdCBzaG93aW5nIHRoZSBvdmVyYWxsIGVmZmVjdCBvZiB0aGUgcGF0Y2ggc2VyaWVzLgoraW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QsIGEgYGBnaXQgc2hvcnRsb2dgYCBsaXN0aW5nIG9mIHRoZSBwYXRjaGVzCit0aGVtc2VsdmVzLCBhbmQgYSBgYGRpZmZzdGF0YGAgc2hvd2luZyB0aGUgb3ZlcmFsbCBlZmZlY3Qgb2YgdGhlIHBhdGNoIHNlcmllcy4KIFRoZSBlYXNpZXN0IHdheSB0byBnZXQgYWxsIHRoaXMgaW5mb3JtYXRpb24gdG9nZXRoZXIgaXMsIG9mIGNvdXJzZSwgdG8gbGV0Ci1naXQgZG8gaXQgZm9yIHlvdSB3aXRoIHRoZSAiZ2l0IHJlcXVlc3QtcHVsbCIgY29tbWFuZC4KK2BgZ2l0YGAgZG8gaXQgZm9yIHlvdSB3aXRoIHRoZSBgYGdpdCByZXF1ZXN0LXB1bGxgYCBjb21tYW5kLgogCiBTb21lIG1haW50YWluZXJzIChpbmNsdWRpbmcgTGludXMpIHdhbnQgdG8gc2VlIHB1bGwgcmVxdWVzdHMgZnJvbSBzaWduZWQKIGNvbW1pdHM7IHRoYXQgaW5jcmVhc2VzIHRoZWlyIGNvbmZpZGVuY2UgdGhhdCB0aGUgcmVxdWVzdCBhY3R1YWxseSBjYW1lCkBAIC03NzAsOCArNzg2LDggQEAKIG5ldyBkZXZlbG9wZXJzLCBidXQgdGhlcmUgaXMgbm8gd2F5IGFyb3VuZCBpdC4gIEF0dGVuZGluZyBjb25mZXJlbmNlcyBjYW4KIGJlIGEgZ29vZCB3YXkgdG8gZmluZCBkZXZlbG9wZXJzIHdobyBjYW4gc2lnbiB5b3VyIGtleS4KIAotT25jZSB5b3UgaGF2ZSBwcmVwYXJlZCBhIHBhdGNoIHNlcmllcyBpbiBnaXQgdGhhdCB5b3Ugd2lzaCB0byBoYXZlIHNvbWVib2R5Ci1wdWxsLCBjcmVhdGUgYSBzaWduZWQgdGFnIHdpdGggImdpdCB0YWcgLXMiLiAgVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyB0YWcKK09uY2UgeW91IGhhdmUgcHJlcGFyZWQgYSBwYXRjaCBzZXJpZXMgaW4gYGBnaXRgYCB0aGF0IHlvdSB3aXNoIHRvIGhhdmUgc29tZWJvZHkKK3B1bGwsIGNyZWF0ZSBhIHNpZ25lZCB0YWcgd2l0aCBgYGdpdCB0YWcgLXNgYC4gIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcgdGFnCiBpZGVudGlmeWluZyB0aGUgbGFzdCBjb21taXQgaW4gdGhlIHNlcmllcyBhbmQgY29udGFpbmluZyBhIHNpZ25hdHVyZQogY3JlYXRlZCB3aXRoIHlvdXIgcHJpdmF0ZSBrZXkuICBZb3Ugd2lsbCBhbHNvIGhhdmUgdGhlIG9wcG9ydHVuaXR5IHRvIGFkZCBhCiBjaGFuZ2Vsb2ctc3R5bGUgbWVzc2FnZSB0byB0aGUgdGFnOyB0aGlzIGlzIGFuIGlkZWFsIHBsYWNlIHRvIGRlc2NyaWJlIHRoZQpAQCAtNzgyLDE0ICs3OTgsMTMgQEAKIHB1YmxpYyB0cmVlLgogCiBXaGVuIGdlbmVyYXRpbmcgeW91ciBwdWxsIHJlcXVlc3QsIHVzZSB0aGUgc2lnbmVkIHRhZyBhcyB0aGUgdGFyZ2V0LiAgQQotY29tbWFuZCBsaWtlIHRoaXMgd2lsbCBkbyB0aGUgdHJpY2s6Citjb21tYW5kIGxpa2UgdGhpcyB3aWxsIGRvIHRoZSB0cmljazo6CiAKICAgZ2l0IHJlcXVlc3QtcHVsbCBtYXN0ZXIgZ2l0Oi8vbXkucHVibGljLnRyZWUvbGludXguZ2l0IG15LXNpZ25lZC10YWcKIAogCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TRUNUSU9OIDIgLSBSRUZFUkVOQ0VTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSRUZFUkVOQ0VTCisqKioqKioqKioqCiAKIEFuZHJldyBNb3J0b24sICJUaGUgcGVyZmVjdCBwYXRjaCIgKHRwcCkuCiAgIDxodHRwOi8vd3d3Lm96bGFicy5vcmcvfmFrcG0vc3R1ZmYvdHBwLnR4dD4KQEAgLTc5OSwyMyArODE0LDI4IEBACiAKIEdyZWcgS3JvYWgtSGFydG1hbiwgIkhvdyB0byBwaXNzIG9mZiBhIGtlcm5lbCBzdWJzeXN0ZW0gbWFpbnRhaW5lciIuCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci5odG1sPgorCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci0wMi5odG1sPgorCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci0wMy5odG1sPgorCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci0wNC5odG1sPgorCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci0wNS5odG1sPgorCiAgIDxodHRwOi8vd3d3Lmtyb2FoLmNvbS9sb2cvbGludXgvbWFpbnRhaW5lci0wNi5odG1sPgogCiBOTyEhISEgTm8gbW9yZSBodWdlIHBhdGNoIGJvbWJzIHRvIGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcgcGVvcGxlIQogICA8aHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMDUvNy8xMS8zMzY+CiAKIEtlcm5lbCBEb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlOgotICA8RG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZT4KKyAgOnJlZjpgRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZSA8Y29kaW5nc3R5bGU+YAogCiBMaW51cyBUb3J2YWxkcydzIG1haWwgb24gdGhlIGNhbm9uaWNhbCBwYXRjaCBmb3JtYXQ6CiAgIDxodHRwOi8vbGttbC5vcmcvbGttbC8yMDA1LzQvNy8xODM+CiAKIEFuZGkgS2xlZW4sICJPbiBzdWJtaXR0aW5nIGtlcm5lbCBwYXRjaGVzIgogICBTb21lIHN0cmF0ZWdpZXMgdG8gZ2V0IGRpZmZpY3VsdCBvciBjb250cm92ZXJzaWFsIGNoYW5nZXMgaW4uCisKICAgaHR0cDovL2hhbG9iYXRlcy5kZS9vbi1zdWJtaXR0aW5nLXBhdGNoZXMucGRmCiAKLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjcGkvYWNwaS1saWQudHh0IGIvRG9jdW1lbnRhdGlvbi9hY3BpL2FjcGktbGlkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZlN2FmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9hY3BpL2FjcGktbGlkLnR4dApAQCAtMCwwICsxLDk2IEBACitTcGVjaWFsIFVzYWdlIE1vZGVsIG9mIHRoZSBBQ1BJIENvbnRyb2wgTWV0aG9kIExpZCBEZXZpY2UKKworQ29weXJpZ2h0IChDKSAyMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbgorQXV0aG9yOiBMdiBaaGVuZyA8bHYuemhlbmdAaW50ZWwuY29tPgorCisKK0Fic3RyYWN0OgorCitQbGF0Zm9ybXMgY29udGFpbmluZyBsaWRzIGNvbnZleSBsaWQgc3RhdGUgKG9wZW4vY2xvc2UpIHRvIE9TUE1zIHVzaW5nIGEKK2NvbnRyb2wgbWV0aG9kIGxpZCBkZXZpY2UuIFRvIGltcGxlbWVudCB0aGlzLCB0aGUgQU1MIHRhYmxlcyBpc3N1ZQorTm90aWZ5KGxpZF9kZXZpY2UsIDB4ODApIHRvIG5vdGlmeSB0aGUgT1NQTXMgd2hlbmV2ZXIgdGhlIGxpZCBzdGF0ZSBoYXMKK2NoYW5nZWQuIFRoZSBfTElEIGNvbnRyb2wgbWV0aG9kIGZvciB0aGUgbGlkIGRldmljZSBtdXN0IGJlIGltcGxlbWVudGVkIHRvCityZXBvcnQgdGhlICJjdXJyZW50IiBzdGF0ZSBvZiB0aGUgbGlkIGFzIGVpdGhlciAib3BlbmVkIiBvciAiY2xvc2VkIi4KKworRm9yIG1vc3QgcGxhdGZvcm1zLCBib3RoIHRoZSBfTElEIG1ldGhvZCBhbmQgdGhlIGxpZCBub3RpZmljYXRpb25zIGFyZQorcmVsaWFibGUuIEhvd2V2ZXIsIHRoZXJlIGFyZSBleGNlcHRpb25zLiBJbiBvcmRlciB0byB3b3JrIHdpdGggdGhlc2UKK2V4Y2VwdGlvbmFsIGJ1Z2d5IHBsYXRmb3Jtcywgc3BlY2lhbCByZXN0cmljdGlvbnMgYW5kIGV4cGVjdGlvbnMgc2hvdWxkIGJlCit0YWtlbiBpbnRvIGFjY291bnQuIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSByZXN0cmljdGlvbnMgYW5kIHRoZQorZXhwZWN0aW9ucyBvZiB0aGUgTGludXggQUNQSSBsaWQgZGV2aWNlIGRyaXZlci4KKworCisxLiBSZXN0cmljdGlvbnMgb2YgdGhlIHJldHVybmluZyB2YWx1ZSBvZiB0aGUgX0xJRCBjb250cm9sIG1ldGhvZAorCitUaGUgX0xJRCBjb250cm9sIG1ldGhvZCBpcyBkZXNjcmliZWQgdG8gcmV0dXJuIHRoZSAiY3VycmVudCIgbGlkIHN0YXRlLgorSG93ZXZlciB0aGUgd29yZCBvZiAiY3VycmVudCIgaGFzIGFtYmlndWl0eSwgc29tZSBidWdneSBBTUwgdGFibGVzIHJldHVybgordGhlIGxpZCBzdGF0ZSB1cG9uIHRoZSBsYXN0IGxpZCBub3RpZmljYXRpb24gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIGxpZAorc3RhdGUgdXBvbiB0aGUgbGFzdCBfTElEIGV2YWx1YXRpb24uIFRoZXJlIHdvbid0IGJlIGRpZmZlcmVuY2Ugd2hlbiB0aGUKK19MSUQgY29udHJvbCBtZXRob2QgaXMgZXZhbHVhdGVkIGR1cmluZyB0aGUgcnVudGltZSwgdGhlIHByb2JsZW0gaXMgaXRzCitpbml0aWFsIHJldHVybmluZyB2YWx1ZS4gV2hlbiB0aGUgQU1MIHRhYmxlcyBpbXBsZW1lbnQgdGhpcyBjb250cm9sIG1ldGhvZAord2l0aCBjYWNoZWQgdmFsdWUsIHRoZSBpbml0aWFsIHJldHVybmluZyB2YWx1ZSBpcyBsaWtlbHkgbm90IHJlbGlhYmxlLgorVGhlcmUgYXJlIHBsYXRmb3JtcyBhbHdheXMgcmV0dW4gImNsb3NlZCIgYXMgaW5pdGlhbCBsaWQgc3RhdGUuCisKKzIuIFJlc3RyaWN0aW9ucyBvZiB0aGUgbGlkIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb25zCisKK1RoZXJlIGFyZSBidWdneSBBTUwgdGFibGVzIG5ldmVyIG5vdGlmeWluZyB3aGVuIHRoZSBsaWQgZGV2aWNlIHN0YXRlIGlzCitjaGFuZ2VkIHRvICJvcGVuZWQiLiBUaHVzIHRoZSAib3BlbmVkIiBub3RpZmljYXRpb24gaXMgbm90IGd1YXJhbnRlZWQuIEJ1dAoraXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSBBTUwgdGFibGVzIGFsd2F5cyBub3RpZnkgImNsb3NlZCIgd2hlbiB0aGUgbGlkCitzdGF0ZSBpcyBjaGFuZ2VkIHRvICJjbG9zZWQiLiBUaGUgImNsb3NlZCIgbm90aWZpY2F0aW9uIGlzIG5vcm1hbGx5IHVzZWQgdG8KK3RyaWdnZXIgc29tZSBzeXN0ZW0gcG93ZXIgc2F2aW5nIG9wZXJhdGlvbnMgb24gV2luZG93cy4gU2luY2UgaXQgaXMgZnVsbHkKK3Rlc3RlZCwgaXQgaXMgcmVsaWFibGUgZnJvbSBhbGwgQU1MIHRhYmxlcy4KKworMy4gRXhwZWN0aW9ucyBmb3IgdGhlIHVzZXJzcGFjZSB1c2VycyBvZiB0aGUgQUNQSSBsaWQgZGV2aWNlIGRyaXZlcgorCitUaGUgQUNQSSBidXR0b24gZHJpdmVyIGV4cG9ydHMgdGhlIGxpZCBzdGF0ZSB0byB0aGUgdXNlcnNwYWNlIHZpYSB0aGUKK2ZvbGxvd2luZyBmaWxlOgorICAvcHJvYy9hY3BpL2J1dHRvbi9saWQvTElEMC9zdGF0ZQorVGhpcyBmaWxlIGFjdHVhbGx5IGNhbGxzIHRoZSBfTElEIGNvbnRyb2wgbWV0aG9kIGRlc2NyaWJlZCBhYm92ZS4gQW5kIGdpdmVuCit0aGUgcHJldmlvdXMgZXhwbGFuYXRpb24sIGl0IGlzIG5vdCByZWxpYWJsZSBlbm91Z2ggb24gc29tZSBwbGF0Zm9ybXMuIFNvCitpdCBpcyBhZHZpc2VkIGZvciB0aGUgdXNlcnNwYWNlIHByb2dyYW0gdG8gbm90IHRvIHNvbGVseSByZWx5IG9uIHRoaXMgZmlsZQordG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwgbGlkIHN0YXRlLgorCitUaGUgQUNQSSBidXR0b24gZHJpdmVyIGVtaXRzIHRoZSBmb2xsb3dpbmcgaW5wdXQgZXZlbnQgdG8gdGhlIHVzZXJzcGFjZToKKyAgU1dfTElECitUaGUgQUNQSSBsaWQgZGV2aWNlIGRyaXZlciBpcyBpbXBsZW1lbnRlZCB0byB0cnkgdG8gZGVsaXZlciB0aGUgcGxhdGZvcm0KK3RyaWdnZXJlZCBldmVudHMgdG8gdGhlIHVzZXJzcGFjZS4gSG93ZXZlciwgZ2l2ZW4gdGhlIGZhY3QgdGhhdCB0aGUgYnVnZ3kKK2Zpcm13YXJlIGNhbm5vdCBtYWtlIHN1cmUgIm9wZW5lZCIvImNsb3NlZCIgZXZlbnRzIGFyZSBwYWlyZWQsIHRoZSBBQ1BJCitidXR0b24gZHJpdmVyIHVzZXMgdGhlIGZvbGxvd2luZyAzIG1vZGVzIGluIG9yZGVyIG5vdCB0byB0cmlnZ2VyIGlzc3Vlcy4KKworSWYgdGhlIHVzZXJzcGFjZSBoYXNuJ3QgYmVlbiBwcmVwYXJlZCB0byBpZ25vcmUgdGhlIHVucmVsaWFibGUgIm9wZW5lZCIKK2V2ZW50cyBhbmQgdGhlIHVucmVsaWFibGUgaW5pdGlhbCBzdGF0ZSBub3RpZmljYXRpb24sIExpbnV4IHVzZXJzIGNhbiB1c2UKK3RoZSBmb2xsb3dpbmcga2VybmVsIHBhcmFtZXRlcnMgdG8gaGFuZGxlIHRoZSBwb3NzaWJsZSBpc3N1ZXM6CitBLiBidXR0b24ubGlkX2luaXRfc3RhdGU9bWV0aG9kOgorICAgV2hlbiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHRoZSBBQ1BJIGJ1dHRvbiBkcml2ZXIgcmVwb3J0cyB0aGUKKyAgIGluaXRpYWwgbGlkIHN0YXRlIHVzaW5nIHRoZSByZXR1cm5pbmcgdmFsdWUgb2YgdGhlIF9MSUQgY29udHJvbCBtZXRob2QKKyAgIGFuZCB3aGV0aGVyIHRoZSAib3BlbmVkIi8iY2xvc2VkIiBldmVudHMgYXJlIHBhaXJlZCBmdWxseSByZWxpZXMgb24gdGhlCisgICBmaXJtd2FyZSBpbXBsZW1lbnRhdGlvbi4KKyAgIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIGZpeCBzb21lIHBsYXRmb3JtcyB3aGVyZSB0aGUgcmV0dXJuaW5nIHZhbHVlCisgICBvZiB0aGUgX0xJRCBjb250cm9sIG1ldGhvZCBpcyByZWxpYWJsZSBidXQgdGhlIGluaXRpYWwgbGlkIHN0YXRlCisgICBub3RpZmljYXRpb24gaXMgbWlzc2luZy4KKyAgIFRoaXMgb3B0aW9uIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGR1cmluZyB0aGUgcGVyaW9kIHRoZSB1c2Vyc3BhY2UKKyAgIGlzbid0IHJlYWR5IHRvIGhhbmRsZSB0aGUgYnVnZ3kgQU1MIHRhYmxlcy4KK0IuIGJ1dHRvbi5saWRfaW5pdF9zdGF0ZT1vcGVuOgorICAgV2hlbiB0aGlzIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHRoZSBBQ1BJIGJ1dHRvbiBkcml2ZXIgYWx3YXlzIHJlcG9ydHMgdGhlCisgICBpbml0aWFsIGxpZCBzdGF0ZSBhcyAib3BlbmVkIiBhbmQgd2hldGhlciB0aGUgIm9wZW5lZCIvImNsb3NlZCIgZXZlbnRzCisgICBhcmUgcGFpcmVkIGZ1bGx5IHJlbGllcyBvbiB0aGUgZmlybXdhcmUgaW1wbGVtZW50YXRpb24uCisgICBUaGlzIG1heSBmaXggc29tZSBwbGF0Zm9ybXMgd2hlcmUgdGhlIHJldHVybmluZyB2YWx1ZSBvZiB0aGUgX0xJRAorICAgY29udHJvbCBtZXRob2QgaXMgbm90IHJlbGlhYmxlIGFuZCB0aGUgaW5pdGlhbCBsaWQgc3RhdGUgbm90aWZpY2F0aW9uIGlzCisgICBtaXNzaW5nLgorCitJZiB0aGUgdXNlcnNwYWNlIGhhcyBiZWVuIHByZXBhcmVkIHRvIGlnbm9yZSB0aGUgdW5yZWxpYWJsZSAib3BlbmVkIiBldmVudHMKK2FuZCB0aGUgdW5yZWxpYWJsZSBpbml0aWFsIHN0YXRlIG5vdGlmaWNhdGlvbiwgTGludXggdXNlcnMgc2hvdWxkIGFsd2F5cwordXNlIHRoZSBmb2xsb3dpbmcga2VybmVsIHBhcmFtZXRlcjoKK0MuIGJ1dHRvbi5saWRfaW5pdF9zdGF0ZT1pZ25vcmU6CisgICBXaGVuIHRoaXMgb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIEFDUEkgYnV0dG9uIGRyaXZlciBuZXZlciByZXBvcnRzIHRoZQorICAgaW5pdGlhbCBsaWQgc3RhdGUgYW5kIHRoZXJlIGlzIGEgY29tcGVuc2F0aW9uIG1lY2hhbmlzbSBpbXBsZW1lbnRlZCB0bworICAgZW5zdXJlIHRoYXQgdGhlIHJlbGlhYmxlICJjbG9zZWQiIG5vdGlmaWNhdGlvbnMgY2FuIGFsd2F5cyBiZSBkZWxpZXZlcmVkCisgICB0byB0aGUgdXNlcnNwYWNlIGJ5IGFsd2F5cyBwYWlyaW5nICJjbG9zZWQiIGlucHV0IGV2ZW50cyB3aXRoIGNvbXBsZW1lbnQKKyAgICJvcGVuZWQiIGlucHV0IGV2ZW50cy4gQnV0IHRoZXJlIGlzIHN0aWxsIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSAib3BlbmVkIgorICAgbm90aWZpY2F0aW9ucyBjYW4gYmUgZGVsaXZlcmVkIHRvIHRoZSB1c2Vyc3BhY2Ugd2hlbiB0aGUgbGlkIGlzIGFjdHVhbGx5CisgICBvcGVucyBnaXZlbiB0aGF0IHNvbWUgQU1MIHRhYmxlcyBkbyBub3Qgc2VuZCAib3BlbmVkIiBub3RpZmljYXRpb25zCisgICByZWxpYWJseS4KKyAgIEluIHRoaXMgbW9kZSwgaWYgZXZlcnl0aGluZyBpcyBjb3JyZWN0bHkgaW1wbGVtZW50ZWQgYnkgdGhlIHBsYXRmb3JtCisgICBmaXJtd2FyZSwgdGhlIG9sZCB1c2Vyc3BhY2UgcHJvZ3JhbXMgc2hvdWxkIHN0aWxsIHdvcmsuIE90aGVyd2lzZSwgdGhlCisgICBuZXcgdXNlcnNwYWNlIHByb2dyYW1zIGFyZSByZXF1aXJlZCB0byB3b3JrIHdpdGggdGhlIEFDUEkgYnV0dG9uIGRyaXZlci4KKyAgIFRoaXMgb3B0aW9uIHdpbGwgYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYWZ0ZXIgdGhlIHVzZXJzcGFjZSBpcyByZWFkeSB0bworICAgaGFuZGxlIHRoZSBidWdneSBBTUwgdGFibGVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hY3BpL2dwaW8tcHJvcGVydGllcy50eHQgYi9Eb2N1bWVudGF0aW9uL2FjcGkvZ3Bpby1wcm9wZXJ0aWVzLnR4dAppbmRleCBmMzVkYWQxLi41YWFmZTBiMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY3BpL2dwaW8tcHJvcGVydGllcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hY3BpL2dwaW8tcHJvcGVydGllcy50eHQKQEAgLTI4LDggKzI4LDggQEAKICAgICAgICAgICBUb1VVSUQoImRhZmZkODE0LTZlYmEtNGQ4Yy04YTkxLWJjOWJiZjRhYTMwMSIpLAogICAgICAgICAgIFBhY2thZ2UgKCkKIAkgIHsKLSAgICAgICAgICAgICAgUGFja2FnZSAoKSB7InJlc2V0LWdwaW8iLCBQYWNrYWdlKCkge15CVEgsIDEsIDEsIDAgfX0sCi0gICAgICAgICAgICAgIFBhY2thZ2UgKCkgeyJzaHV0ZG93bi1ncGlvIiwgUGFja2FnZSgpIHteQlRILCAwLCAwLCAwIH19LAorICAgICAgICAgICAgICBQYWNrYWdlICgpIHsicmVzZXQtZ3Bpb3MiLCBQYWNrYWdlKCkge15CVEgsIDEsIDEsIDAgfX0sCisgICAgICAgICAgICAgIFBhY2thZ2UgKCkgeyJzaHV0ZG93bi1ncGlvcyIsIFBhY2thZ2UoKSB7XkJUSCwgMCwgMCwgMCB9fSwKICAgICAgICAgICB9CiAgICAgICB9KQogICB9CkBAIC00OCw3ICs0OCw3IEBACiBhY3RpdmUgbG93IG9yIGhpZ2gsIHRoZSAiYWN0aXZlX2xvdyIgYXJndW1lbnQgY2FuIGJlIHVzZWQgaGVyZS4gIFNldHRpbmcKIGl0IHRvIDEgbWFya3MgdGhlIEdQSU8gYXMgYWN0aXZlIGxvdy4KIAotSW4gb3VyIEJsdWV0b290aCBleGFtcGxlIHRoZSAicmVzZXQtZ3BpbyIgcmVmZXJzIHRvIHRoZSBzZWNvbmQgR3Bpb0lvKCkKK0luIG91ciBCbHVldG9vdGggZXhhbXBsZSB0aGUgInJlc2V0LWdwaW9zIiByZWZlcnMgdG8gdGhlIHNlY29uZCBHcGlvSW8oKQogcmVzb3VyY2UsIHNlY29uZCBwaW4gaW4gdGhhdCByZXNvdXJjZSB3aXRoIHRoZSBHUElPIG51bWJlciBvZiAzMS4KIAogQUNQSSBHUElPIE1hcHBpbmdzIFByb3ZpZGVkIGJ5IERyaXZlcnMKQEAgLTgzLDggKzgzLDggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9ncGlvX3BhcmFtcyBzaHV0ZG93bl9ncGlvID0geyAwLCAwLCBmYWxzZSB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZ3Bpb19tYXBwaW5nIGJsdWV0b290aF9hY3BpX2dwaW9zW10gPSB7Ci0gIHsgInJlc2V0LWdwaW8iLCAmcmVzZXRfZ3BpbywgMSB9LAotICB7ICJzaHV0ZG93bi1ncGlvIiwgJnNodXRkb3duX2dwaW8sIDEgfSwKKyAgeyAicmVzZXQtZ3Bpb3MiLCAmcmVzZXRfZ3BpbywgMSB9LAorICB7ICJzaHV0ZG93bi1ncGlvcyIsICZzaHV0ZG93bl9ncGlvLCAxIH0sCiAgIHsgfSwKIH07CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2FwcGx5aW5nLXBhdGNoZXMudHh0CmluZGV4IDc3ZGY1NWIuLjAyY2U0OTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYXBwbHlpbmctcGF0Y2hlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hcHBseWluZy1wYXRjaGVzLnR4dApAQCAtMSw5ICsxLDEzIEBACisuLiBfYXBwbHlpbmdfcGF0Y2hlczoKIAotCUFwcGx5aW5nIFBhdGNoZXMgVG8gVGhlIExpbnV4IEtlcm5lbAotCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQXBwbHlpbmcgUGF0Y2hlcyBUbyBUaGUgTGludXggS2VybmVsCisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIAotCU9yaWdpbmFsIGJ5OiBKZXNwZXIgSnVobCwgQXVndXN0IDIwMDUKLQlMYXN0IHVwZGF0ZTogMjAwNi0wMS0wNQorT3JpZ2luYWwgYnk6CisJSmVzcGVyIEp1aGwsIEF1Z3VzdCAyMDA1CisKK0xhc3QgdXBkYXRlOgorCTIwMTYtMDktMTQKIAogCiBBIGZyZXF1ZW50bHkgYXNrZWQgcXVlc3Rpb24gb24gdGhlIExpbnV4IEtlcm5lbCBNYWlsaW5nIExpc3QgaXMgaG93IHRvIGFwcGx5CkBAIC0xNywxMCArMjEsMTIgQEAKIAogCiBXaGF0IGlzIGEgcGF0Y2g/Ci0tLS0KLSBBIHBhdGNoIGlzIGEgc21hbGwgdGV4dCBkb2N1bWVudCBjb250YWluaW5nIGEgZGVsdGEgb2YgY2hhbmdlcyBiZXR3ZWVuIHR3bwotZGlmZmVyZW50IHZlcnNpb25zIG9mIGEgc291cmNlIHRyZWUuIFBhdGNoZXMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgYGRpZmYnCis9PT09PT09PT09PT09PT09CisKK0EgcGF0Y2ggaXMgYSBzbWFsbCB0ZXh0IGRvY3VtZW50IGNvbnRhaW5pbmcgYSBkZWx0YSBvZiBjaGFuZ2VzIGJldHdlZW4gdHdvCitkaWZmZXJlbnQgdmVyc2lvbnMgb2YgYSBzb3VyY2UgdHJlZS4gUGF0Y2hlcyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBgYGRpZmZgYAogcHJvZ3JhbS4KKwogVG8gY29ycmVjdGx5IGFwcGx5IGEgcGF0Y2ggeW91IG5lZWQgdG8ga25vdyB3aGF0IGJhc2UgaXQgd2FzIGdlbmVyYXRlZCBmcm9tCiBhbmQgd2hhdCBuZXcgdmVyc2lvbiB0aGUgcGF0Y2ggd2lsbCBjaGFuZ2UgdGhlIHNvdXJjZSB0cmVlIGludG8uIFRoZXNlCiBzaG91bGQgYm90aCBiZSBwcmVzZW50IGluIHRoZSBwYXRjaCBmaWxlIG1ldGFkYXRhIG9yIGJlIHBvc3NpYmxlIHRvIGRlZHVjZQpAQCAtMjgsOCArMzQsOSBAQAogCiAKIEhvdyBkbyBJIGFwcGx5IG9yIHJldmVydCBhIHBhdGNoPwotLS0tCi0gWW91IGFwcGx5IGEgcGF0Y2ggd2l0aCB0aGUgYHBhdGNoJyBwcm9ncmFtLiBUaGUgcGF0Y2ggcHJvZ3JhbSByZWFkcyBhIGRpZmYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitZb3UgYXBwbHkgYSBwYXRjaCB3aXRoIHRoZSBgYHBhdGNoYGAgcHJvZ3JhbS4gVGhlIHBhdGNoIHByb2dyYW0gcmVhZHMgYSBkaWZmCiAob3IgcGF0Y2gpIGZpbGUgYW5kIG1ha2VzIHRoZSBjaGFuZ2VzIHRvIHRoZSBzb3VyY2UgdHJlZSBkZXNjcmliZWQgaW4gaXQuCiAKIFBhdGNoZXMgZm9yIHRoZSBMaW51eCBrZXJuZWwgYXJlIGdlbmVyYXRlZCByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeQpAQCAtMzgsMjYgKzQ1LDMzIEBACiBUaGlzIG1lYW5zIHRoYXQgcGF0aHMgdG8gZmlsZXMgaW5zaWRlIHRoZSBwYXRjaCBmaWxlIGNvbnRhaW4gdGhlIG5hbWUgb2YgdGhlCiBrZXJuZWwgc291cmNlIGRpcmVjdG9yaWVzIGl0IHdhcyBnZW5lcmF0ZWQgYWdhaW5zdCAob3Igc29tZSBvdGhlciBkaXJlY3RvcnkKIG5hbWVzIGxpa2UgImEvIiBhbmQgImIvIikuCisKIFNpbmNlIHRoaXMgaXMgdW5saWtlbHkgdG8gbWF0Y2ggdGhlIG5hbWUgb2YgdGhlIGtlcm5lbCBzb3VyY2UgZGlyIG9uIHlvdXIKIGxvY2FsIG1hY2hpbmUgKGJ1dCBpcyBvZnRlbiB1c2VmdWwgaW5mbyB0byBzZWUgd2hhdCB2ZXJzaW9uIGFuIG90aGVyd2lzZQogdW5sYWJlbGVkIHBhdGNoIHdhcyBnZW5lcmF0ZWQgYWdhaW5zdCkgeW91IHNob3VsZCBjaGFuZ2UgaW50byB5b3VyIGtlcm5lbAogc291cmNlIGRpcmVjdG9yeSBhbmQgdGhlbiBzdHJpcCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgcGF0aCBmcm9tIGZpbGVuYW1lcwotaW4gdGhlIHBhdGNoIGZpbGUgd2hlbiBhcHBseWluZyBpdCAodGhlIC1wMSBhcmd1bWVudCB0byBgcGF0Y2gnIGRvZXMgdGhpcykuCitpbiB0aGUgcGF0Y2ggZmlsZSB3aGVuIGFwcGx5aW5nIGl0ICh0aGUgYGAtcDFgYCBhcmd1bWVudCB0byBgYHBhdGNoYGAgZG9lcwordGhpcykuCiAKIFRvIHJldmVydCBhIHByZXZpb3VzbHkgYXBwbGllZCBwYXRjaCwgdXNlIHRoZSAtUiBhcmd1bWVudCB0byBwYXRjaC4KLVNvLCBpZiB5b3UgYXBwbGllZCBhIHBhdGNoIGxpa2UgdGhpczoKK1NvLCBpZiB5b3UgYXBwbGllZCBhIHBhdGNoIGxpa2UgdGhpczo6CisKIAlwYXRjaCAtcDEgPCAuLi9wYXRjaC14LnkuegogCi1Zb3UgY2FuIHJldmVydCAodW5kbykgaXQgbGlrZSB0aGlzOgorWW91IGNhbiByZXZlcnQgKHVuZG8pIGl0IGxpa2UgdGhpczo6CisKIAlwYXRjaCAtUiAtcDEgPCAuLi9wYXRjaC14LnkuegogCiAKLUhvdyBkbyBJIGZlZWQgYSBwYXRjaC9kaWZmIGZpbGUgdG8gYHBhdGNoJz8KLS0tLQotIFRoaXMgKGFzIHVzdWFsIHdpdGggTGludXggYW5kIG90aGVyIFVOSVggbGlrZSBvcGVyYXRpbmcgc3lzdGVtcykgY2FuIGJlCitIb3cgZG8gSSBmZWVkIGEgcGF0Y2gvZGlmZiBmaWxlIHRvIGBgcGF0Y2hgYD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIChhcyB1c3VhbCB3aXRoIExpbnV4IGFuZCBvdGhlciBVTklYIGxpa2Ugb3BlcmF0aW5nIHN5c3RlbXMpIGNhbiBiZQogZG9uZSBpbiBzZXZlcmFsIGRpZmZlcmVudCB3YXlzLgorCiBJbiBhbGwgdGhlIGV4YW1wbGVzIGJlbG93IEkgZmVlZCB0aGUgZmlsZSAoaW4gdW5jb21wcmVzc2VkIGZvcm0pIHRvIHBhdGNoCi12aWEgc3RkaW4gdXNpbmcgdGhlIGZvbGxvd2luZyBzeW50YXg6Cit2aWEgc3RkaW4gdXNpbmcgdGhlIGZvbGxvd2luZyBzeW50YXg6OgorCiAJcGF0Y2ggLXAxIDwgcGF0aC90by9wYXRjaC14LnkuegogCiBJZiB5b3UganVzdCB3YW50IHRvIGJlIGFibGUgdG8gZm9sbG93IHRoZSBleGFtcGxlcyBiZWxvdyBhbmQgZG9uJ3Qgd2FudCB0bwpAQCAtNjUsMzUgKzc5LDQwIEBACiBzZWN0aW9uIGhlcmUuCiAKIFBhdGNoIGNhbiBhbHNvIGdldCB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byB1c2UgdmlhIHRoZSAtaSBhcmd1bWVudCwgbGlrZQotdGhpczoKK3RoaXM6OgorCiAJcGF0Y2ggLXAxIC1pIHBhdGgvdG8vcGF0Y2gteC55LnoKIAotSWYgeW91ciBwYXRjaCBmaWxlIGlzIGNvbXByZXNzZWQgd2l0aCBnemlwIG9yIGJ6aXAyIGFuZCB5b3UgZG9uJ3Qgd2FudCB0bworSWYgeW91ciBwYXRjaCBmaWxlIGlzIGNvbXByZXNzZWQgd2l0aCBnemlwIG9yIHh6IGFuZCB5b3UgZG9uJ3Qgd2FudCB0bwogdW5jb21wcmVzcyBpdCBiZWZvcmUgYXBwbHlpbmcgaXQsIHRoZW4geW91IGNhbiBmZWVkIGl0IHRvIHBhdGNoIGxpa2UgdGhpcwotaW5zdGVhZDoKLQl6Y2F0IHBhdGgvdG8vcGF0Y2gteC55LnouZ3ogfCBwYXRjaCAtcDEKLQliemNhdCBwYXRoL3RvL3BhdGNoLXgueS56LmJ6MiB8IHBhdGNoIC1wMQoraW5zdGVhZDo6CisKKwl4emNhdCBwYXRoL3RvL3BhdGNoLXgueS56Lnh6IHwgcGF0Y2ggLXAxCisJYnpjYXQgcGF0aC90by9wYXRjaC14Lnkuei5neiB8IHBhdGNoIC1wMQogCiBJZiB5b3Ugd2lzaCB0byB1bmNvbXByZXNzIHRoZSBwYXRjaCBmaWxlIGJ5IGhhbmQgZmlyc3QgYmVmb3JlIGFwcGx5aW5nIGl0CiAod2hhdCBJIGFzc3VtZSB5b3UndmUgZG9uZSBpbiB0aGUgZXhhbXBsZXMgYmVsb3cpLCB0aGVuIHlvdSBzaW1wbHkgcnVuCi1ndW56aXAgb3IgYnVuemlwMiBvbiB0aGUgZmlsZSAtLSBsaWtlIHRoaXM6CitndW56aXAgb3IgeHogb24gdGhlIGZpbGUgLS0gbGlrZSB0aGlzOjoKKwogCWd1bnppcCBwYXRjaC14Lnkuei5negotCWJ1bnppcDIgcGF0Y2gteC55LnouYnoyCisJeHogLWQgcGF0Y2gteC55LnoueHoKIAogV2hpY2ggd2lsbCBsZWF2ZSB5b3Ugd2l0aCBhIHBsYWluIHRleHQgcGF0Y2gteC55LnogZmlsZSB0aGF0IHlvdSBjYW4gZmVlZCB0bwotcGF0Y2ggdmlhIHN0ZGluIG9yIHRoZSAtaSBhcmd1bWVudCwgYXMgeW91IHByZWZlci4KK3BhdGNoIHZpYSBzdGRpbiBvciB0aGUgYGAtaWBgIGFyZ3VtZW50LCBhcyB5b3UgcHJlZmVyLgogCi1BIGZldyBvdGhlciBuaWNlIGFyZ3VtZW50cyBmb3IgcGF0Y2ggYXJlIC1zIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBiZSBzaWxlbnQKK0EgZmV3IG90aGVyIG5pY2UgYXJndW1lbnRzIGZvciBwYXRjaCBhcmUgYGAtc2BgIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBiZSBzaWxlbnQKIGV4Y2VwdCBmb3IgZXJyb3JzIHdoaWNoIGlzIG5pY2UgdG8gcHJldmVudCBlcnJvcnMgZnJvbSBzY3JvbGxpbmcgb3V0IG9mIHRoZQotc2NyZWVuIHRvbyBmYXN0LCBhbmQgLS1kcnktcnVuIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBqdXN0IHByaW50IGEgbGlzdGluZyBvZgotd2hhdCB3b3VsZCBoYXBwZW4sIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IG1ha2UgYW55IGNoYW5nZXMuIEZpbmFsbHkgLS12ZXJib3NlCitzY3JlZW4gdG9vIGZhc3QsIGFuZCBgYC0tZHJ5LXJ1bmBgIHdoaWNoIGNhdXNlcyBwYXRjaCB0byBqdXN0IHByaW50IGEgbGlzdGluZyBvZgord2hhdCB3b3VsZCBoYXBwZW4sIGJ1dCBkb2Vzbid0IGFjdHVhbGx5IG1ha2UgYW55IGNoYW5nZXMuIEZpbmFsbHkgYGAtLXZlcmJvc2VgYAogdGVsbHMgcGF0Y2ggdG8gcHJpbnQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd29yayBiZWluZyBkb25lLgogCiAKIENvbW1vbiBlcnJvcnMgd2hlbiBwYXRjaGluZwotLS0tCi0gV2hlbiBwYXRjaCBhcHBsaWVzIGEgcGF0Y2ggZmlsZSBpdCBhdHRlbXB0cyB0byB2ZXJpZnkgdGhlIHNhbml0eSBvZiB0aGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitXaGVuIHBhdGNoIGFwcGxpZXMgYSBwYXRjaCBmaWxlIGl0IGF0dGVtcHRzIHRvIHZlcmlmeSB0aGUgc2FuaXR5IG9mIHRoZQogZmlsZSBpbiBkaWZmZXJlbnQgd2F5cy4KKwogQ2hlY2tpbmcgdGhhdCB0aGUgZmlsZSBsb29rcyBsaWtlIGEgdmFsaWQgcGF0Y2ggZmlsZSBhbmQgY2hlY2tpbmcgdGhlIGNvZGUKIGFyb3VuZCB0aGUgYml0cyBiZWluZyBtb2RpZmllZCBtYXRjaGVzIHRoZSBjb250ZXh0IHByb3ZpZGVkIGluIHRoZSBwYXRjaCBhcmUKIGp1c3QgdHdvIG9mIHRoZSBiYXNpYyBzYW5pdHkgY2hlY2tzIHBhdGNoIGRvZXMuCkBAIC0xMTEsMTMgKzEzMCwxMyBAQAogdXN1YWxseSBhZGp1c3QgdGhlIGxpbmUgbnVtYmVycyBhbmQgYXBwbHkgdGhlIHBhdGNoLgogCiBXaGVuZXZlciBwYXRjaCBhcHBsaWVzIGEgcGF0Y2ggdGhhdCBpdCBoYWQgdG8gbW9kaWZ5IGEgYml0IHRvIG1ha2UgaXQgZml0Ci1pdCdsbCB0ZWxsIHlvdSBhYm91dCBpdCBieSBzYXlpbmcgdGhlIHBhdGNoIGFwcGxpZWQgd2l0aCAnZnV6eicuCitpdCdsbCB0ZWxsIHlvdSBhYm91dCBpdCBieSBzYXlpbmcgdGhlIHBhdGNoIGFwcGxpZWQgd2l0aCAqKmZ1enoqKi4KIFlvdSBzaG91bGQgYmUgd2FyeSBvZiBzdWNoIGNoYW5nZXMgc2luY2UgZXZlbiB0aG91Z2ggcGF0Y2ggcHJvYmFibHkgZ290IGl0CiByaWdodCBpdCBkb2Vzbid0IC9hbHdheXMvIGdldCBpdCByaWdodCwgYW5kIHRoZSByZXN1bHQgd2lsbCBzb21ldGltZXMgYmUKIHdyb25nLgogCiBXaGVuIHBhdGNoIGVuY291bnRlcnMgYSBjaGFuZ2UgdGhhdCBpdCBjYW4ndCBmaXggdXAgd2l0aCBmdXp6IGl0IHJlamVjdHMgaXQKLW91dHJpZ2h0IGFuZCBsZWF2ZXMgYSBmaWxlIHdpdGggYSAucmVqIGV4dGVuc2lvbiAoYSByZWplY3QgZmlsZSkuIFlvdSBjYW4KK291dHJpZ2h0IGFuZCBsZWF2ZXMgYSBmaWxlIHdpdGggYSBgYC5yZWpgYCBleHRlbnNpb24gKGEgcmVqZWN0IGZpbGUpLiBZb3UgY2FuCiByZWFkIHRoaXMgZmlsZSB0byBzZWUgZXhhY3RseSB3aGF0IGNoYW5nZSBjb3VsZG4ndCBiZSBhcHBsaWVkLCBzbyB5b3UgY2FuCiBnbyBmaXggaXQgdXAgYnkgaGFuZCBpZiB5b3Ugd2lzaC4KIApAQCAtMTMyLDQzICsxNTEsNDcgQEAKIAogTGV0J3MgbG9vayBhIGJpdCBtb3JlIGF0IHNvbWUgb2YgdGhlIG1lc3NhZ2VzIHBhdGNoIGNhbiBwcm9kdWNlLgogCi1JZiBwYXRjaCBzdG9wcyBhbmQgcHJlc2VudHMgYSAiRmlsZSB0byBwYXRjaDoiIHByb21wdCwgdGhlbiBwYXRjaCBjb3VsZCBub3QKK0lmIHBhdGNoIHN0b3BzIGFuZCBwcmVzZW50cyBhIGBgRmlsZSB0byBwYXRjaDpgYCBwcm9tcHQsIHRoZW4gcGF0Y2ggY291bGQgbm90CiBmaW5kIGEgZmlsZSB0byBiZSBwYXRjaGVkLiBNb3N0IGxpa2VseSB5b3UgZm9yZ290IHRvIHNwZWNpZnkgLXAxIG9yIHlvdSBhcmUKIGluIHRoZSB3cm9uZyBkaXJlY3RvcnkuIExlc3Mgb2Z0ZW4sIHlvdSdsbCBmaW5kIHBhdGNoZXMgdGhhdCBuZWVkIHRvIGJlCi1hcHBsaWVkIHdpdGggLXAwIGluc3RlYWQgb2YgLXAxIChyZWFkaW5nIHRoZSBwYXRjaCBmaWxlIHNob3VsZCByZXZlYWwgaWYKK2FwcGxpZWQgd2l0aCBgYC1wMGBgIGluc3RlYWQgb2YgYGAtcDFgYCAocmVhZGluZyB0aGUgcGF0Y2ggZmlsZSBzaG91bGQgcmV2ZWFsIGlmCiB0aGlzIGlzIHRoZSBjYXNlIC0tIGlmIHNvLCB0aGVuIHRoaXMgaXMgYW4gZXJyb3IgYnkgdGhlIHBlcnNvbiB3aG8gY3JlYXRlZAogdGhlIHBhdGNoIGJ1dCBpcyBub3QgZmF0YWwpLgogCi1JZiB5b3UgZ2V0ICJIdW5rICMyIHN1Y2NlZWRlZCBhdCAxODg3IHdpdGggZnV6eiAyIChvZmZzZXQgNyBsaW5lcykuIiBvciBhCitJZiB5b3UgZ2V0IGBgSHVuayAjMiBzdWNjZWVkZWQgYXQgMTg4NyB3aXRoIGZ1enogMiAob2Zmc2V0IDcgbGluZXMpLmBgIG9yIGEKIG1lc3NhZ2Ugc2ltaWxhciB0byB0aGF0LCB0aGVuIGl0IG1lYW5zIHRoYXQgcGF0Y2ggaGFkIHRvIGFkanVzdCB0aGUgbG9jYXRpb24KIG9mIHRoZSBjaGFuZ2UgKGluIHRoaXMgZXhhbXBsZSBpdCBuZWVkZWQgdG8gbW92ZSA3IGxpbmVzIGZyb20gd2hlcmUgaXQKIGV4cGVjdGVkIHRvIG1ha2UgdGhlIGNoYW5nZSB0byBtYWtlIGl0IGZpdCkuCisKIFRoZSByZXN1bHRpbmcgZmlsZSBtYXkgb3IgbWF5IG5vdCBiZSBPSywgZGVwZW5kaW5nIG9uIHRoZSByZWFzb24gdGhlIGZpbGUKIHdhcyBkaWZmZXJlbnQgdGhhbiBleHBlY3RlZC4KKwogVGhpcyBvZnRlbiBoYXBwZW5zIGlmIHlvdSB0cnkgdG8gYXBwbHkgYSBwYXRjaCB0aGF0IHdhcyBnZW5lcmF0ZWQgYWdhaW5zdCBhCiBkaWZmZXJlbnQga2VybmVsIHZlcnNpb24gdGhhbiB0aGUgb25lIHlvdSBhcmUgdHJ5aW5nIHRvIHBhdGNoLgogCi1JZiB5b3UgZ2V0IGEgbWVzc2FnZSBsaWtlICJIdW5rICMzIEZBSUxFRCBhdCAyMzg3LiIsIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGUKK0lmIHlvdSBnZXQgYSBtZXNzYWdlIGxpa2UgYGBIdW5rICMzIEZBSUxFRCBhdCAyMzg3LmBgLCB0aGVuIGl0IG1lYW5zIHRoYXQgdGhlCiBwYXRjaCBjb3VsZCBub3QgYmUgYXBwbGllZCBjb3JyZWN0bHkgYW5kIHRoZSBwYXRjaCBwcm9ncmFtIHdhcyB1bmFibGUgdG8KLWZ1enogaXRzIHdheSB0aHJvdWdoLiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSAucmVqIGZpbGUgd2l0aCB0aGUgY2hhbmdlIHRoYXQKLWNhdXNlZCB0aGUgcGF0Y2ggdG8gZmFpbCBhbmQgYWxzbyBhIC5vcmlnIGZpbGUgc2hvd2luZyB5b3UgdGhlIG9yaWdpbmFsCitmdXp6IGl0cyB3YXkgdGhyb3VnaC4gVGhpcyB3aWxsIGdlbmVyYXRlIGEgYGAucmVqYGAgZmlsZSB3aXRoIHRoZSBjaGFuZ2UgdGhhdAorY2F1c2VkIHRoZSBwYXRjaCB0byBmYWlsIGFuZCBhbHNvIGEgYGAub3JpZ2BgIGZpbGUgc2hvd2luZyB5b3UgdGhlIG9yaWdpbmFsCiBjb250ZW50IHRoYXQgY291bGRuJ3QgYmUgY2hhbmdlZC4KIAotSWYgeW91IGdldCAiUmV2ZXJzZWQgKG9yIHByZXZpb3VzbHkgYXBwbGllZCkgcGF0Y2ggZGV0ZWN0ZWQhICBBc3N1bWUgLVI/IFtuXSIKK0lmIHlvdSBnZXQgYGBSZXZlcnNlZCAob3IgcHJldmlvdXNseSBhcHBsaWVkKSBwYXRjaCBkZXRlY3RlZCEgIEFzc3VtZSAtUj8gW25dYGAKIHRoZW4gcGF0Y2ggZGV0ZWN0ZWQgdGhhdCB0aGUgY2hhbmdlIGNvbnRhaW5lZCBpbiB0aGUgcGF0Y2ggc2VlbXMgdG8gaGF2ZQogYWxyZWFkeSBiZWVuIG1hZGUuCisKIElmIHlvdSBhY3R1YWxseSBkaWQgYXBwbHkgdGhpcyBwYXRjaCBwcmV2aW91c2x5IGFuZCB5b3UganVzdCByZS1hcHBsaWVkIGl0CiBpbiBlcnJvciwgdGhlbiBqdXN0IHNheSBbbl1vIGFuZCBhYm9ydCB0aGlzIHBhdGNoLiBJZiB5b3UgYXBwbGllZCB0aGlzIHBhdGNoCiBwcmV2aW91c2x5IGFuZCBhY3R1YWxseSBpbnRlbmRlZCB0byByZXZlcnQgaXQsIGJ1dCBmb3Jnb3QgdG8gc3BlY2lmeSAtUiwKLXRoZW4geW91IGNhbiBzYXkgW3ldZXMgaGVyZSB0byBtYWtlIHBhdGNoIHJldmVydCBpdCBmb3IgeW91LgordGhlbiB5b3UgY2FuIHNheSBbKip5KipdZXMgaGVyZSB0byBtYWtlIHBhdGNoIHJldmVydCBpdCBmb3IgeW91LgorCiBUaGlzIGNhbiBhbHNvIGhhcHBlbiBpZiB0aGUgY3JlYXRvciBvZiB0aGUgcGF0Y2ggcmV2ZXJzZWQgdGhlIHNvdXJjZSBhbmQKIGRlc3RpbmF0aW9uIGRpcmVjdG9yaWVzIHdoZW4gY3JlYXRpbmcgdGhlIHBhdGNoLCBhbmQgaW4gdGhhdCBjYXNlIHJldmVydGluZwogdGhlIHBhdGNoIHdpbGwgaW4gZmFjdCBhcHBseSBpdC4KIAotQSBtZXNzYWdlIHNpbWlsYXIgdG8gInBhdGNoOiAqKioqIHVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gcGF0Y2giIG9yICJwYXRjaAotdW5leHBlY3RlZGx5IGVuZHMgaW4gbWlkZGxlIG9mIGxpbmUiIG1lYW5zIHRoYXQgcGF0Y2ggY291bGQgbWFrZSBubyBzZW5zZSBvZgotdGhlIGZpbGUgeW91IGZlZCB0byBpdC4gRWl0aGVyIHlvdXIgZG93bmxvYWQgaXMgYnJva2VuLCB5b3UgdHJpZWQgdG8gZmVlZAotcGF0Y2ggYSBjb21wcmVzc2VkIHBhdGNoIGZpbGUgd2l0aG91dCB1bmNvbXByZXNzaW5nIGl0IGZpcnN0LCBvciB0aGUgcGF0Y2gKK0EgbWVzc2FnZSBzaW1pbGFyIHRvIGBgcGF0Y2g6ICoqKiogdW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBwYXRjaGBgIG9yCitgYHBhdGNoIHVuZXhwZWN0ZWRseSBlbmRzIGluIG1pZGRsZSBvZiBsaW5lYGAgbWVhbnMgdGhhdCBwYXRjaCBjb3VsZCBtYWtlIG5vCitzZW5zZSBvZiB0aGUgZmlsZSB5b3UgZmVkIHRvIGl0LiBFaXRoZXIgeW91ciBkb3dubG9hZCBpcyBicm9rZW4sIHlvdSB0cmllZCB0bworZmVlZCBwYXRjaCBhIGNvbXByZXNzZWQgcGF0Y2ggZmlsZSB3aXRob3V0IHVuY29tcHJlc3NpbmcgaXQgZmlyc3QsIG9yIHRoZSBwYXRjaAogZmlsZSB0aGF0IHlvdSBhcmUgdXNpbmcgaGFzIGJlZW4gbWFuZ2xlZCBieSBhIG1haWwgY2xpZW50IG9yIG1haWwgdHJhbnNmZXIKIGFnZW50IGFsb25nIHRoZSB3YXkgc29tZXdoZXJlLCBlLmcuLCBieSBzcGxpdHRpbmcgYSBsb25nIGxpbmUgaW50byB0d28gbGluZXMuCiBPZnRlbiB0aGVzZSB3YXJuaW5ncyBjYW4gZWFzaWx5IGJlIGZpeGVkIGJ5IGpvaW5pbmcgKGNvbmNhdGVuYXRpbmcpIHRoZQpAQCAtMTgyLDI4ICsyMDUsMzIgQEAKIHdpc2ggdG8gYXBwbHkuCiAKIAotQXJlIHRoZXJlIGFueSBhbHRlcm5hdGl2ZXMgdG8gYHBhdGNoJz8KLS0tLQotIFllcyB0aGVyZSBhcmUgYWx0ZXJuYXRpdmVzLgorQXJlIHRoZXJlIGFueSBhbHRlcm5hdGl2ZXMgdG8gYGBwYXRjaGBgPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0gWW91IGNhbiB1c2UgdGhlIGBpbnRlcmRpZmYnIHByb2dyYW0gKGh0dHA6Ly9jeWJlcmVsay5uZXQvdGltL3BhdGNodXRpbHMvKSB0bworCitZZXMgdGhlcmUgYXJlIGFsdGVybmF0aXZlcy4KKworWW91IGNhbiB1c2UgdGhlIGBgaW50ZXJkaWZmYGAgcHJvZ3JhbSAoaHR0cDovL2N5YmVyZWxrLm5ldC90aW0vcGF0Y2h1dGlscy8pIHRvCiBnZW5lcmF0ZSBhIHBhdGNoIHJlcHJlc2VudGluZyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gcGF0Y2hlcyBhbmQgdGhlbgogYXBwbHkgdGhlIHJlc3VsdC4KLVRoaXMgd2lsbCBsZXQgeW91IG1vdmUgZnJvbSBzb21ldGhpbmcgbGlrZSAyLjYuMTIuMiB0byAyLjYuMTIuMyBpbiBhIHNpbmdsZQorCitUaGlzIHdpbGwgbGV0IHlvdSBtb3ZlIGZyb20gc29tZXRoaW5nIGxpa2UgNC43LjIgdG8gNC43LjMgaW4gYSBzaW5nbGUKIHN0ZXAuIFRoZSAteiBmbGFnIHRvIGludGVyZGlmZiB3aWxsIGV2ZW4gbGV0IHlvdSBmZWVkIGl0IHBhdGNoZXMgaW4gZ3ppcCBvcgogYnppcDIgY29tcHJlc3NlZCBmb3JtIGRpcmVjdGx5IHdpdGhvdXQgdGhlIHVzZSBvZiB6Y2F0IG9yIGJ6Y2F0IG9yIG1hbnVhbAogZGVjb21wcmVzc2lvbi4KIAotSGVyZSdzIGhvdyB5b3UnZCBnbyBmcm9tIDIuNi4xMi4yIHRvIDIuNi4xMi4zIGluIGEgc2luZ2xlIHN0ZXA6Ci0JaW50ZXJkaWZmIC16IC4uL3BhdGNoLTIuNi4xMi4yLmJ6MiAuLi9wYXRjaC0yLjYuMTIuMy5neiB8IHBhdGNoIC1wMQorSGVyZSdzIGhvdyB5b3UnZCBnbyBmcm9tIDQuNy4yIHRvIDQuNy4zIGluIGEgc2luZ2xlIHN0ZXA6OgorCisJaW50ZXJkaWZmIC16IC4uL3BhdGNoLTQuNy4yLmd6IC4uL3BhdGNoLTQuNy4zLmd6IHwgcGF0Y2ggLXAxCiAKIEFsdGhvdWdoIGludGVyZGlmZiBtYXkgc2F2ZSB5b3UgYSBzdGVwIG9yIHR3byB5b3UgYXJlIGdlbmVyYWxseSBhZHZpc2VkIHRvCiBkbyB0aGUgYWRkaXRpb25hbCBzdGVwcyBzaW5jZSBpbnRlcmRpZmYgY2FuIGdldCB0aGluZ3Mgd3JvbmcgaW4gc29tZSBjYXNlcy4KIAotIEFub3RoZXIgYWx0ZXJuYXRpdmUgaXMgYGtldGNodXAnLCB3aGljaCBpcyBhIHB5dGhvbiBzY3JpcHQgZm9yIGF1dG9tYXRpYworQW5vdGhlciBhbHRlcm5hdGl2ZSBpcyBgYGtldGNodXBgYCwgd2hpY2ggaXMgYSBweXRob24gc2NyaXB0IGZvciBhdXRvbWF0aWMKIGRvd25sb2FkaW5nIGFuZCBhcHBseWluZyBvZiBwYXRjaGVzIChodHRwOi8vd3d3LnNlbGVuaWMuY29tL2tldGNodXAvKS4KIAotIE90aGVyIG5pY2UgdG9vbHMgYXJlIGRpZmZzdGF0LCB3aGljaCBzaG93cyBhIHN1bW1hcnkgb2YgY2hhbmdlcyBtYWRlIGJ5IGEKK090aGVyIG5pY2UgdG9vbHMgYXJlIGRpZmZzdGF0LCB3aGljaCBzaG93cyBhIHN1bW1hcnkgb2YgY2hhbmdlcyBtYWRlIGJ5IGEKIHBhdGNoOyBsc2RpZmYsIHdoaWNoIGRpc3BsYXlzIGEgc2hvcnQgbGlzdGluZyBvZiBhZmZlY3RlZCBmaWxlcyBpbiBhIHBhdGNoCiBmaWxlLCBhbG9uZyB3aXRoIChvcHRpb25hbGx5KSB0aGUgbGluZSBudW1iZXJzIG9mIHRoZSBzdGFydCBvZiBlYWNoIHBhdGNoOwogYW5kIGdyZXBkaWZmLCB3aGljaCBkaXNwbGF5cyBhIGxpc3Qgb2YgdGhlIGZpbGVzIG1vZGlmaWVkIGJ5IGEgcGF0Y2ggd2hlcmUKQEAgLTIxMSw5OSArMjM4LDEwMyBAQAogCiAKIFdoZXJlIGNhbiBJIGRvd25sb2FkIHRoZSBwYXRjaGVzPwotLS0tCi0gVGhlIHBhdGNoZXMgYXJlIGF2YWlsYWJsZSBhdCBodHRwOi8va2VybmVsLm9yZy8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgcGF0Y2hlcyBhcmUgYXZhaWxhYmxlIGF0IGh0dHA6Ly9rZXJuZWwub3JnLwogTW9zdCByZWNlbnQgcGF0Y2hlcyBhcmUgbGlua2VkIGZyb20gdGhlIGZyb250IHBhZ2UsIGJ1dCB0aGV5IGFsc28gaGF2ZQogc3BlY2lmaWMgaG9tZXMuCiAKLVRoZSAyLjYueC55ICgtc3RhYmxlKSBhbmQgMi42LnggcGF0Y2hlcyBsaXZlIGF0Ci0gZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC92Mi42LworVGhlIDQueC55ICgtc3RhYmxlKSBhbmQgNC54IHBhdGNoZXMgbGl2ZSBhdAorCisJZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC92NC54LwogCiBUaGUgLXJjIHBhdGNoZXMgbGl2ZSBhdAotIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjIuNi90ZXN0aW5nLwogCi1UaGUgLWdpdCBwYXRjaGVzIGxpdmUgYXQKLSBmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3YyLjYvc25hcHNob3RzLworCWZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjQueC90ZXN0aW5nLwogCi1UaGUgLW1tIGtlcm5lbHMgbGl2ZSBhdAotIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcGVvcGxlL2FrcG0vcGF0Y2hlcy8yLjYvCi0KLUluIHBsYWNlIG9mIGZ0cC5rZXJuZWwub3JnIHlvdSBjYW4gdXNlIGZ0cC5jYy5rZXJuZWwub3JnLCB3aGVyZSBjYyBpcyBhCitJbiBwbGFjZSBvZiBgYGZ0cC5rZXJuZWwub3JnYGAgeW91IGNhbiB1c2UgYGBmdHAuY2Mua2VybmVsLm9yZ2BgLCB3aGVyZSBjYyBpcyBhCiBjb3VudHJ5IGNvZGUuIFRoaXMgd2F5IHlvdSdsbCBiZSBkb3dubG9hZGluZyBmcm9tIGEgbWlycm9yIHNpdGUgdGhhdCdzIG1vc3QKIGxpa2VseSBnZW9ncmFwaGljYWxseSBjbG9zZXIgdG8geW91LCByZXN1bHRpbmcgaW4gZmFzdGVyIGRvd25sb2FkcyBmb3IgeW91LAogbGVzcyBiYW5kd2lkdGggdXNlZCBnbG9iYWxseSBhbmQgbGVzcyBsb2FkIG9uIHRoZSBtYWluIGtlcm5lbC5vcmcgc2VydmVycyAtLQogdGhlc2UgYXJlIGdvb2QgdGhpbmdzLCBzbyBkbyB1c2UgbWlycm9ycyB3aGVuIHBvc3NpYmxlLgogCiAKLVRoZSAyLjYueCBrZXJuZWxzCi0tLS0KLSBUaGVzZSBhcmUgdGhlIGJhc2Ugc3RhYmxlIHJlbGVhc2VzIHJlbGVhc2VkIGJ5IExpbnVzLiBUaGUgaGlnaGVzdCBudW1iZXJlZAorVGhlIDQueCBrZXJuZWxzCis9PT09PT09PT09PT09PT0KKworVGhlc2UgYXJlIHRoZSBiYXNlIHN0YWJsZSByZWxlYXNlcyByZWxlYXNlZCBieSBMaW51cy4gVGhlIGhpZ2hlc3QgbnVtYmVyZWQKIHJlbGVhc2UgaXMgdGhlIG1vc3QgcmVjZW50LgogCiBJZiByZWdyZXNzaW9ucyBvciBvdGhlciBzZXJpb3VzIGZsYXdzIGFyZSBmb3VuZCwgdGhlbiBhIC1zdGFibGUgZml4IHBhdGNoCi13aWxsIGJlIHJlbGVhc2VkIChzZWUgYmVsb3cpIG9uIHRvcCBvZiB0aGlzIGJhc2UuIE9uY2UgYSBuZXcgMi42LnggYmFzZQord2lsbCBiZSByZWxlYXNlZCAoc2VlIGJlbG93KSBvbiB0b3Agb2YgdGhpcyBiYXNlLiBPbmNlIGEgbmV3IDQueCBiYXNlCiBrZXJuZWwgaXMgcmVsZWFzZWQsIGEgcGF0Y2ggaXMgbWFkZSBhdmFpbGFibGUgdGhhdCBpcyBhIGRlbHRhIGJldHdlZW4gdGhlCi1wcmV2aW91cyAyLjYueCBrZXJuZWwgYW5kIHRoZSBuZXcgb25lLgorcHJldmlvdXMgNC54IGtlcm5lbCBhbmQgdGhlIG5ldyBvbmUuCiAKLVRvIGFwcGx5IGEgcGF0Y2ggbW92aW5nIGZyb20gMi42LjExIHRvIDIuNi4xMiwgeW91J2QgZG8gdGhlIGZvbGxvd2luZyAobm90ZQotdGhhdCBzdWNoIHBhdGNoZXMgZG8gKk5PVCogYXBwbHkgb24gdG9wIG9mIDIuNi54Lnkga2VybmVscyBidXQgb24gdG9wIG9mIHRoZQotYmFzZSAyLjYueCBrZXJuZWwgLS0gaWYgeW91IG5lZWQgdG8gbW92ZSBmcm9tIDIuNi54LnkgdG8gMi42LngrMSB5b3UgbmVlZCB0bwotZmlyc3QgcmV2ZXJ0IHRoZSAyLjYueC55IHBhdGNoKS4KK1RvIGFwcGx5IGEgcGF0Y2ggbW92aW5nIGZyb20gNC42IHRvIDQuNywgeW91J2QgZG8gdGhlIGZvbGxvd2luZyAobm90ZQordGhhdCBzdWNoIHBhdGNoZXMgZG8gKipOT1QqKiBhcHBseSBvbiB0b3Agb2YgNC54Lnkga2VybmVscyBidXQgb24gdG9wIG9mIHRoZQorYmFzZSA0Lngga2VybmVsIC0tIGlmIHlvdSBuZWVkIHRvIG1vdmUgZnJvbSA0LngueSB0byA0LngrMSB5b3UgbmVlZCB0bworZmlyc3QgcmV2ZXJ0IHRoZSA0LngueSBwYXRjaCkuCiAKLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CitIZXJlIGFyZSBzb21lIGV4YW1wbGVzOjoKIAotIyBtb3ZpbmcgZnJvbSAyLjYuMTEgdG8gMi42LjEyCi0kIGNkIH4vbGludXgtMi42LjExCQkJIyBjaGFuZ2UgdG8ga2VybmVsIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEyCQkjIGFwcGx5IHRoZSAyLjYuMTIgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjExIGxpbnV4LTIuNi4xMgkJIyByZW5hbWUgc291cmNlIGRpcgorCSMgbW92aW5nIGZyb20gNC42IHRvIDQuNwogCi0jIG1vdmluZyBmcm9tIDIuNi4xMS4xIHRvIDIuNi4xMgotJCBjZCB+L2xpbnV4LTIuNi4xMS4xCQkJIyBjaGFuZ2UgdG8ga2VybmVsIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtMi42LjExLjEJIyByZXZlcnQgdGhlIDIuNi4xMS4xIHBhdGNoCi0JCQkJCSMgc291cmNlIGRpciBpcyBub3cgMi42LjExCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMgkJIyBhcHBseSBuZXcgMi42LjEyIHBhdGNoCi0kIGNkIC4uCi0kIG12IGxpbnV4LTIuNi4xMS4xIGxpbnV4LTIuNi4xMgkJIyByZW5hbWUgc291cmNlIGRpcgorCSQgY2Qgfi9saW51eC00LjYJCSMgY2hhbmdlIHRvIGtlcm5lbCBzb3VyY2UgZGlyCisJJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC00LjcJIyBhcHBseSB0aGUgNC43IHBhdGNoCisJJCBjZCAuLgorCSQgbXYgbGludXgtNC42IGxpbnV4LTQuNwkjIHJlbmFtZSBzb3VyY2UgZGlyCisKKwkjIG1vdmluZyBmcm9tIDQuNi4xIHRvIDQuNworCisJJCBjZCB+L2xpbnV4LTQuNi4xCQkjIGNoYW5nZSB0byBrZXJuZWwgc291cmNlIGRpcgorCSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtNC42LjEJIyByZXZlcnQgdGhlIDQuNi4xIHBhdGNoCisJCQkJCSMgc291cmNlIGRpciBpcyBub3cgNC42CisJJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC00LjcJIyBhcHBseSBuZXcgNC43IHBhdGNoCisJJCBjZCAuLgorCSQgbXYgbGludXgtNC42LjEgbGludXgtNC43CSMgcmVuYW1lIHNvdXJjZSBkaXIKIAogCi1UaGUgMi42LngueSBrZXJuZWxzCi0tLS0KLSBLZXJuZWxzIHdpdGggNC1kaWdpdCB2ZXJzaW9ucyBhcmUgLXN0YWJsZSBrZXJuZWxzLiBUaGV5IGNvbnRhaW4gc21hbGwoaXNoKQorVGhlIDQueC55IGtlcm5lbHMKKz09PT09PT09PT09PT09PT09CisKK0tlcm5lbHMgd2l0aCAzLWRpZ2l0IHZlcnNpb25zIGFyZSAtc3RhYmxlIGtlcm5lbHMuIFRoZXkgY29udGFpbiBzbWFsbChpc2gpCiBjcml0aWNhbCBmaXhlcyBmb3Igc2VjdXJpdHkgcHJvYmxlbXMgb3Igc2lnbmlmaWNhbnQgcmVncmVzc2lvbnMgZGlzY292ZXJlZAotaW4gYSBnaXZlbiAyLjYueCBrZXJuZWwuCitpbiBhIGdpdmVuIDQueCBrZXJuZWwuCiAKIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIGJyYW5jaCBmb3IgdXNlcnMgd2hvIHdhbnQgdGhlIG1vc3QgcmVjZW50IHN0YWJsZQoga2VybmVsIGFuZCBhcmUgbm90IGludGVyZXN0ZWQgaW4gaGVscGluZyB0ZXN0IGRldmVsb3BtZW50L2V4cGVyaW1lbnRhbAogdmVyc2lvbnMuCiAKLUlmIG5vIDIuNi54Lnkga2VybmVsIGlzIGF2YWlsYWJsZSwgdGhlbiB0aGUgaGlnaGVzdCBudW1iZXJlZCAyLjYueCBrZXJuZWwgaXMKK0lmIG5vIDQueC55IGtlcm5lbCBpcyBhdmFpbGFibGUsIHRoZW4gdGhlIGhpZ2hlc3QgbnVtYmVyZWQgNC54IGtlcm5lbCBpcwogdGhlIGN1cnJlbnQgc3RhYmxlIGtlcm5lbC4KIAotIG5vdGU6IHRoZSAtc3RhYmxlIHRlYW0gdXN1YWxseSBkbyBtYWtlIGluY3JlbWVudGFsIHBhdGNoZXMgYXZhaWxhYmxlIGFzIHdlbGwKKy4uIG5vdGU6OgorCisgVGhlIC1zdGFibGUgdGVhbSB1c3VhbGx5IGRvIG1ha2UgaW5jcmVtZW50YWwgcGF0Y2hlcyBhdmFpbGFibGUgYXMgd2VsbAogIGFzIHBhdGNoZXMgYWdhaW5zdCB0aGUgbGF0ZXN0IG1haW5saW5lIHJlbGVhc2UsIGJ1dCBJIG9ubHkgY292ZXIgdGhlCiAgbm9uLWluY3JlbWVudGFsIG9uZXMgYmVsb3cuIFRoZSBpbmNyZW1lbnRhbCBvbmVzIGNhbiBiZSBmb3VuZCBhdAotIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjIuNi9pbmNyLworIGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvdjQueC9pbmNyLwogCi1UaGVzZSBwYXRjaGVzIGFyZSBub3QgaW5jcmVtZW50YWwsIG1lYW5pbmcgdGhhdCBmb3IgZXhhbXBsZSB0aGUgMi42LjEyLjMKLXBhdGNoIGRvZXMgbm90IGFwcGx5IG9uIHRvcCBvZiB0aGUgMi42LjEyLjIga2VybmVsIHNvdXJjZSwgYnV0IHJhdGhlciBvbiB0b3AKLW9mIHRoZSBiYXNlIDIuNi4xMiBrZXJuZWwgc291cmNlIC4KLVNvLCBpbiBvcmRlciB0byBhcHBseSB0aGUgMi42LjEyLjMgcGF0Y2ggdG8geW91ciBleGlzdGluZyAyLjYuMTIuMiBrZXJuZWwKLXNvdXJjZSB5b3UgaGF2ZSB0byBmaXJzdCBiYWNrIG91dCB0aGUgMi42LjEyLjIgcGF0Y2ggKHNvIHlvdSBhcmUgbGVmdCB3aXRoIGEKLWJhc2UgMi42LjEyIGtlcm5lbCBzb3VyY2UpIGFuZCB0aGVuIGFwcGx5IHRoZSBuZXcgMi42LjEyLjMgcGF0Y2guCitUaGVzZSBwYXRjaGVzIGFyZSBub3QgaW5jcmVtZW50YWwsIG1lYW5pbmcgdGhhdCBmb3IgZXhhbXBsZSB0aGUgNC43LjMKK3BhdGNoIGRvZXMgbm90IGFwcGx5IG9uIHRvcCBvZiB0aGUgNC43LjIga2VybmVsIHNvdXJjZSwgYnV0IHJhdGhlciBvbiB0b3AKK29mIHRoZSBiYXNlIDQuNyBrZXJuZWwgc291cmNlLgogCi1IZXJlJ3MgYSBzbWFsbCBleGFtcGxlOgorU28sIGluIG9yZGVyIHRvIGFwcGx5IHRoZSA0LjcuMyBwYXRjaCB0byB5b3VyIGV4aXN0aW5nIDQuNy4yIGtlcm5lbAorc291cmNlIHlvdSBoYXZlIHRvIGZpcnN0IGJhY2sgb3V0IHRoZSA0LjcuMiBwYXRjaCAoc28geW91IGFyZSBsZWZ0IHdpdGggYQorYmFzZSA0Ljcga2VybmVsIHNvdXJjZSkgYW5kIHRoZW4gYXBwbHkgdGhlIG5ldyA0LjcuMyBwYXRjaC4KIAotJCBjZCB+L2xpbnV4LTIuNi4xMi4yCQkJIyBjaGFuZ2UgaW50byB0aGUga2VybmVsIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtMi42LjEyLjIJIyByZXZlcnQgdGhlIDIuNi4xMi4yIHBhdGNoCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMi4zCQkjIGFwcGx5IHRoZSBuZXcgMi42LjEyLjMgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjEyLjIgbGludXgtMi42LjEyLjMJIyByZW5hbWUgdGhlIGtlcm5lbCBzb3VyY2UgZGlyCitIZXJlJ3MgYSBzbWFsbCBleGFtcGxlOjoKIAorCSQgY2Qgfi9saW51eC00LjcuMgkJIyBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBzb3VyY2UgZGlyCisJJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC00LjcuMgkjIHJldmVydCB0aGUgNC43LjIgcGF0Y2gKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuNy4zCSMgYXBwbHkgdGhlIG5ldyA0LjcuMyBwYXRjaAorCSQgY2QgLi4KKwkkIG12IGxpbnV4LTQuNy4yIGxpbnV4LTQuNy4zCSMgcmVuYW1lIHRoZSBrZXJuZWwgc291cmNlIGRpcgogCiBUaGUgLXJjIGtlcm5lbHMKLS0tLQotIFRoZXNlIGFyZSByZWxlYXNlLWNhbmRpZGF0ZSBrZXJuZWxzLiBUaGVzZSBhcmUgZGV2ZWxvcG1lbnQga2VybmVscyByZWxlYXNlZAorPT09PT09PT09PT09PT09CisKK1RoZXNlIGFyZSByZWxlYXNlLWNhbmRpZGF0ZSBrZXJuZWxzLiBUaGVzZSBhcmUgZGV2ZWxvcG1lbnQga2VybmVscyByZWxlYXNlZAogYnkgTGludXMgd2hlbmV2ZXIgaGUgZGVlbXMgdGhlIGN1cnJlbnQgZ2l0ICh0aGUga2VybmVsJ3Mgc291cmNlIG1hbmFnZW1lbnQKIHRvb2wpIHRyZWUgdG8gYmUgaW4gYSByZWFzb25hYmx5IHNhbmUgc3RhdGUgYWRlcXVhdGUgZm9yIHRlc3RpbmcuCiAKQEAgLTMxNywzOSArMzQ4LDQ0IEBACiBkZXZlbG9wbWVudCBrZXJuZWxzIGJ1dCBkbyBub3Qgd2FudCB0byBydW4gc29tZSBvZiB0aGUgcmVhbGx5IGV4cGVyaW1lbnRhbAogc3R1ZmYgKHN1Y2ggcGVvcGxlIHNob3VsZCBzZWUgdGhlIHNlY3Rpb25zIGFib3V0IC1naXQgYW5kIC1tbSBrZXJuZWxzIGJlbG93KS4KIAotVGhlIC1yYyBwYXRjaGVzIGFyZSBub3QgaW5jcmVtZW50YWwsIHRoZXkgYXBwbHkgdG8gYSBiYXNlIDIuNi54IGtlcm5lbCwganVzdAotbGlrZSB0aGUgMi42LngueSBwYXRjaGVzIGRlc2NyaWJlZCBhYm92ZS4gVGhlIGtlcm5lbCB2ZXJzaW9uIGJlZm9yZSB0aGUgLXJjTgorVGhlIC1yYyBwYXRjaGVzIGFyZSBub3QgaW5jcmVtZW50YWwsIHRoZXkgYXBwbHkgdG8gYSBiYXNlIDQueCBrZXJuZWwsIGp1c3QKK2xpa2UgdGhlIDQueC55IHBhdGNoZXMgZGVzY3JpYmVkIGFib3ZlLiBUaGUga2VybmVsIHZlcnNpb24gYmVmb3JlIHRoZSAtcmNOCiBzdWZmaXggZGVub3RlcyB0aGUgdmVyc2lvbiBvZiB0aGUga2VybmVsIHRoYXQgdGhpcyAtcmMga2VybmVsIHdpbGwgZXZlbnR1YWxseQogdHVybiBpbnRvLgotU28sIDIuNi4xMy1yYzUgbWVhbnMgdGhhdCB0aGlzIGlzIHRoZSBmaWZ0aCByZWxlYXNlIGNhbmRpZGF0ZSBmb3IgdGhlIDIuNi4xMwota2VybmVsIGFuZCB0aGUgcGF0Y2ggc2hvdWxkIGJlIGFwcGxpZWQgb24gdG9wIG9mIHRoZSAyLjYuMTIga2VybmVsIHNvdXJjZS4KIAotSGVyZSBhcmUgMyBleGFtcGxlcyBvZiBob3cgdG8gYXBwbHkgdGhlc2UgcGF0Y2hlczoKK1NvLCA0LjgtcmM1IG1lYW5zIHRoYXQgdGhpcyBpcyB0aGUgZmlmdGggcmVsZWFzZSBjYW5kaWRhdGUgZm9yIHRoZSA0LjgKK2tlcm5lbCBhbmQgdGhlIHBhdGNoIHNob3VsZCBiZSBhcHBsaWVkIG9uIHRvcCBvZiB0aGUgNC43IGtlcm5lbCBzb3VyY2UuCiAKLSMgZmlyc3QgYW4gZXhhbXBsZSBvZiBtb3ZpbmcgZnJvbSAyLjYuMTIgdG8gMi42LjEzLXJjMwotJCBjZCB+L2xpbnV4LTIuNi4xMgkJCSMgY2hhbmdlIGludG8gdGhlIDIuNi4xMiBzb3VyY2UgZGlyCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMy1yYzMJIyBhcHBseSB0aGUgMi42LjEzLXJjMyBwYXRjaAotJCBjZCAuLgotJCBtdiBsaW51eC0yLjYuMTIgbGludXgtMi42LjEzLXJjMwkjIHJlbmFtZSB0aGUgc291cmNlIGRpcgorSGVyZSBhcmUgMyBleGFtcGxlcyBvZiBob3cgdG8gYXBwbHkgdGhlc2UgcGF0Y2hlczo6CiAKLSMgbm93IGxldCdzIG1vdmUgZnJvbSAyLjYuMTMtcmMzIHRvIDIuNi4xMy1yYzUKLSQgY2Qgfi9saW51eC0yLjYuMTMtcmMzCQkJIyBjaGFuZ2UgaW50byB0aGUgMi42LjEzLXJjMyBkaXIKLSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtMi42LjEzLXJjMwkjIHJldmVydCB0aGUgMi42LjEzLXJjMyBwYXRjaAotJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmM1CSMgYXBwbHkgdGhlIG5ldyAyLjYuMTMtcmM1IHBhdGNoCi0kIGNkIC4uCi0kIG12IGxpbnV4LTIuNi4xMy1yYzMgbGludXgtMi42LjEzLXJjNQkjIHJlbmFtZSB0aGUgc291cmNlIGRpcgorCSMgZmlyc3QgYW4gZXhhbXBsZSBvZiBtb3ZpbmcgZnJvbSA0LjcgdG8gNC44LXJjMwogCi0jIGZpbmFsbHkgbGV0J3MgdHJ5IGFuZCBtb3ZlIGZyb20gMi42LjEyLjMgdG8gMi42LjEzLXJjNQotJCBjZCB+L2xpbnV4LTIuNi4xMi4zCQkJIyBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBzb3VyY2UgZGlyCi0kIHBhdGNoIC1wMSAtUiA8IC4uL3BhdGNoLTIuNi4xMi4zCSMgcmV2ZXJ0IHRoZSAyLjYuMTIuMyBwYXRjaAotJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC0yLjYuMTMtcmM1CSMgYXBwbHkgbmV3IDIuNi4xMy1yYzUgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjEyLjMgbGludXgtMi42LjEzLXJjNQkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKKwkkIGNkIH4vbGludXgtNC43CQkJIyBjaGFuZ2UgdG8gdGhlIDQuNyBzb3VyY2UgZGlyCisJJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC00LjgtcmMzCQkjIGFwcGx5IHRoZSA0LjgtcmMzIHBhdGNoCisJJCBjZCAuLgorCSQgbXYgbGludXgtNC43IGxpbnV4LTQuOC1yYzMJCSMgcmVuYW1lIHRoZSBzb3VyY2UgZGlyCisKKwkjIG5vdyBsZXQncyBtb3ZlIGZyb20gNC44LXJjMyB0byA0LjgtcmM1CisKKwkkIGNkIH4vbGludXgtNC44LXJjMwkJCSMgY2hhbmdlIHRvIHRoZSA0LjgtcmMzIGRpcgorCSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtNC44LXJjMwkjIHJldmVydCB0aGUgNC44LXJjMyBwYXRjaAorCSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtNC44LXJjNQkJIyBhcHBseSB0aGUgbmV3IDQuOC1yYzUgcGF0Y2gKKwkkIGNkIC4uCisJJCBtdiBsaW51eC00LjgtcmMzIGxpbnV4LTQuOC1yYzUJIyByZW5hbWUgdGhlIHNvdXJjZSBkaXIKKworCSMgZmluYWxseSBsZXQncyB0cnkgYW5kIG1vdmUgZnJvbSA0LjcuMyB0byA0LjgtcmM1CisKKwkkIGNkIH4vbGludXgtNC43LjMJCQkjIGNoYW5nZSB0byB0aGUga2VybmVsIHNvdXJjZSBkaXIKKwkkIHBhdGNoIC1wMSAtUiA8IC4uL3BhdGNoLTQuNy4zCQkjIHJldmVydCB0aGUgNC43LjMgcGF0Y2gKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuOC1yYzUJCSMgYXBwbHkgbmV3IDQuOC1yYzUgcGF0Y2gKKwkkIGNkIC4uCisJJCBtdiBsaW51eC00LjcuMyBsaW51eC00LjgtcmM1CQkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKIAogCiBUaGUgLWdpdCBrZXJuZWxzCi0tLS0KLSBUaGVzZSBhcmUgZGFpbHkgc25hcHNob3RzIG9mIExpbnVzJyBrZXJuZWwgdHJlZSAobWFuYWdlZCBpbiBhIGdpdAorPT09PT09PT09PT09PT09PQorCitUaGVzZSBhcmUgZGFpbHkgc25hcHNob3RzIG9mIExpbnVzJyBrZXJuZWwgdHJlZSAobWFuYWdlZCBpbiBhIGdpdAogcmVwb3NpdG9yeSwgaGVuY2UgdGhlIG5hbWUpLgogCiBUaGVzZSBwYXRjaGVzIGFyZSB1c3VhbGx5IHJlbGVhc2VkIGRhaWx5IGFuZCByZXByZXNlbnQgdGhlIGN1cnJlbnQgc3RhdGUgb2YKQEAgLTM1Nyw5MSArMzkzLDY2IEBACiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSB3aXRob3V0IGV2ZW4gYSBjdXJzb3J5IGdsYW5jZSB0byBzZWUgaWYgdGhleSBhcmUKIHNhbmUuCiAKLS1naXQgcGF0Y2hlcyBhcmUgbm90IGluY3JlbWVudGFsIGFuZCBhcHBseSBlaXRoZXIgdG8gYSBiYXNlIDIuNi54IGtlcm5lbCBvcgotYSBiYXNlIDIuNi54LXJjIGtlcm5lbCAtLSB5b3UgY2FuIHNlZSB3aGljaCBmcm9tIHRoZWlyIG5hbWUuCi1BIHBhdGNoIG5hbWVkIDIuNi4xMi1naXQxIGFwcGxpZXMgdG8gdGhlIDIuNi4xMiBrZXJuZWwgc291cmNlIGFuZCBhIHBhdGNoCi1uYW1lZCAyLjYuMTMtcmMzLWdpdDIgYXBwbGllcyB0byB0aGUgc291cmNlIG9mIHRoZSAyLjYuMTMtcmMzIGtlcm5lbC4KKy1naXQgcGF0Y2hlcyBhcmUgbm90IGluY3JlbWVudGFsIGFuZCBhcHBseSBlaXRoZXIgdG8gYSBiYXNlIDQueCBrZXJuZWwgb3IKK2EgYmFzZSA0LngtcmMga2VybmVsIC0tIHlvdSBjYW4gc2VlIHdoaWNoIGZyb20gdGhlaXIgbmFtZS4KK0EgcGF0Y2ggbmFtZWQgNC43LWdpdDEgYXBwbGllcyB0byB0aGUgNC43IGtlcm5lbCBzb3VyY2UgYW5kIGEgcGF0Y2gKK25hbWVkIDQuOC1yYzMtZ2l0MiBhcHBsaWVzIHRvIHRoZSBzb3VyY2Ugb2YgdGhlIDQuOC1yYzMga2VybmVsLgogCi1IZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBhcHBseSB0aGVzZSBwYXRjaGVzOgorSGVyZSBhcmUgc29tZSBleGFtcGxlcyBvZiBob3cgdG8gYXBwbHkgdGhlc2UgcGF0Y2hlczo6CiAKLSMgbW92aW5nIGZyb20gMi42LjEyIHRvIDIuNi4xMi1naXQxCi0kIGNkIH4vbGludXgtMi42LjEyCQkJIyBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBzb3VyY2UgZGlyCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMi1naXQxCSMgYXBwbHkgdGhlIDIuNi4xMi1naXQxIHBhdGNoCi0kIGNkIC4uCi0kIG12IGxpbnV4LTIuNi4xMiBsaW51eC0yLjYuMTItZ2l0MQkjIHJlbmFtZSB0aGUga2VybmVsIHNvdXJjZSBkaXIKKwkjIG1vdmluZyBmcm9tIDQuNyB0byA0LjctZ2l0MQogCi0jIG1vdmluZyBmcm9tIDIuNi4xMi1naXQxIHRvIDIuNi4xMy1yYzItZ2l0MwotJCBjZCB+L2xpbnV4LTIuNi4xMi1naXQxCQkjIGNoYW5nZSB0byB0aGUga2VybmVsIHNvdXJjZSBkaXIKLSQgcGF0Y2ggLXAxIC1SIDwgLi4vcGF0Y2gtMi42LjEyLWdpdDEJIyByZXZlcnQgdGhlIDIuNi4xMi1naXQxIHBhdGNoCi0JCQkJCSMgd2Ugbm93IGhhdmUgYSAyLjYuMTIga2VybmVsCi0kIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTIuNi4xMy1yYzIJIyBhcHBseSB0aGUgMi42LjEzLXJjMiBwYXRjaAotCQkJCQkjIHRoZSBrZXJuZWwgaXMgbm93IDIuNi4xMy1yYzIKLSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMi1naXQzCSMgYXBwbHkgdGhlIDIuNi4xMy1yYzItZ2l0MyBwYXRjaAotCQkJCQkjIHRoZSBrZXJuZWwgaXMgbm93IDIuNi4xMy1yYzItZ2l0MwotJCBjZCAuLgotJCBtdiBsaW51eC0yLjYuMTItZ2l0MSBsaW51eC0yLjYuMTMtcmMyLWdpdDMJIyByZW5hbWUgc291cmNlIGRpcgorCSQgY2Qgfi9saW51eC00LjcJCQkjIGNoYW5nZSB0byB0aGUga2VybmVsIHNvdXJjZSBkaXIKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuNy1naXQxCQkjIGFwcGx5IHRoZSA0LjctZ2l0MSBwYXRjaAorCSQgY2QgLi4KKwkkIG12IGxpbnV4LTQuNyBsaW51eC00LjctZ2l0MQkJIyByZW5hbWUgdGhlIGtlcm5lbCBzb3VyY2UgZGlyCisKKwkjIG1vdmluZyBmcm9tIDQuNy1naXQxIHRvIDQuOC1yYzItZ2l0MworCisJJCBjZCB+L2xpbnV4LTQuNy1naXQxCQkJIyBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBzb3VyY2UgZGlyCisJJCBwYXRjaCAtcDEgLVIgPCAuLi9wYXRjaC00LjctZ2l0MQkjIHJldmVydCB0aGUgNC43LWdpdDEgcGF0Y2gKKwkJCQkJCSMgd2Ugbm93IGhhdmUgYSA0Ljcga2VybmVsCisJJCBwYXRjaCAtcDEgPCAuLi9wYXRjaC00LjgtcmMyCQkjIGFwcGx5IHRoZSA0LjgtcmMyIHBhdGNoCisJCQkJCQkjIHRoZSBrZXJuZWwgaXMgbm93IDQuOC1yYzIKKwkkIHBhdGNoIC1wMSA8IC4uL3BhdGNoLTQuOC1yYzItZ2l0MwkjIGFwcGx5IHRoZSA0LjgtcmMyLWdpdDMgcGF0Y2gKKwkJCQkJCSMgdGhlIGtlcm5lbCBpcyBub3cgNC44LXJjMi1naXQzCisJJCBjZCAuLgorCSQgbXYgbGludXgtNC43LWdpdDEgbGludXgtNC44LXJjMi1naXQzCSMgcmVuYW1lIHNvdXJjZSBkaXIKIAogCi1UaGUgLW1tIGtlcm5lbHMKLS0tLQotIFRoZXNlIGFyZSBleHBlcmltZW50YWwga2VybmVscyByZWxlYXNlZCBieSBBbmRyZXcgTW9ydG9uLgorVGhlIC1tbSBwYXRjaGVzIGFuZCB0aGUgbGludXgtbmV4dCB0cmVlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlIC1tbSB0cmVlIHNlcnZlcyBhcyBhIHNvcnQgb2YgcHJvdmluZyBncm91bmQgZm9yIG5ldyBmZWF0dXJlcyBhbmQgb3RoZXIKLWV4cGVyaW1lbnRhbCBwYXRjaGVzLgotT25jZSBhIHBhdGNoIGhhcyBwcm92ZWQgaXRzIHdvcnRoIGluIC1tbSBmb3IgYSB3aGlsZSBBbmRyZXcgcHVzaGVzIGl0IG9uIHRvCi1MaW51cyBmb3IgaW5jbHVzaW9uIGluIG1haW5saW5lLgorVGhlIC1tbSBwYXRjaGVzIGFyZSBleHBlcmltZW50YWwgcGF0Y2hlcyByZWxlYXNlZCBieSBBbmRyZXcgTW9ydG9uLgogCi1BbHRob3VnaCBpdCdzIGVuY291cmFnZWQgdGhhdCBwYXRjaGVzIGZsb3cgdG8gTGludXMgdmlhIHRoZSAtbW0gdHJlZSwgdGhpcwotaXMgbm90IGFsd2F5cyBlbmZvcmNlZC4KLVN1YnN5c3RlbSBtYWludGFpbmVycyAob3IgaW5kaXZpZHVhbHMpIHNvbWV0aW1lcyBwdXNoIHRoZWlyIHBhdGNoZXMgZGlyZWN0bHkKLXRvIExpbnVzLCBldmVuIHRob3VnaCAob3IgYWZ0ZXIpIHRoZXkgaGF2ZSBiZWVuIG1lcmdlZCBhbmQgdGVzdGVkIGluIC1tbSAob3IKLXNvbWV0aW1lcyBldmVuIHdpdGhvdXQgcHJpb3IgdGVzdGluZyBpbiAtbW0pLgorSW4gdGhlIHBhc3QsIC1tbSB0cmVlIHdlcmUgdXNlZCB0byBhbHNvIHRlc3Qgc3Vic3lzdGVtIHBhdGNoZXMsIGJ1dCB0aGlzCitmdW5jdGlvbiBpcyBub3cgZG9uZSB2aWEgdGhlCis6cmVmOmBsaW51eC1uZXh0IDxodHRwczovL3d3dy5rZXJuZWwub3JnL2RvYy9tYW4tcGFnZXMvbGludXgtbmV4dC5odG1sPmAKK3RyZWUuIFRoZSBTdWJzeXN0ZW0gbWFpbnRhaW5lcnMgcHVzaCB0aGVpciBwYXRjaGVzIGZpcnN0IHRvIGxpbnV4LW5leHQsCithbmQsIGR1cmluZyB0aGUgbWVyZ2Ugd2luZG93LCBzZW5kcyB0aGVtIGRpcmVjdGx5IHRvIExpbnVzLgogCi1Zb3Ugc2hvdWxkIGdlbmVyYWxseSBzdHJpdmUgdG8gZ2V0IHlvdXIgcGF0Y2hlcyBpbnRvIG1haW5saW5lIHZpYSAtbW0gdG8KLWVuc3VyZSBtYXhpbXVtIHRlc3RpbmcuCitUaGUgLW1tIHBhdGNoZXMgc2VydmUgYXMgYSBzb3J0IG9mIHByb3ZpbmcgZ3JvdW5kIGZvciBuZXcgZmVhdHVyZXMgYW5kIG90aGVyCitleHBlcmltZW50YWwgcGF0Y2hlcyB0aGF0IGFyZW4ndCBtZXJnZWQgdmlhIGEgc3Vic3lzdGVtIHRyZWUuCitPbmNlIHN1Y2ggcGF0Y2hlcyBoYXMgcHJvdmVkIGl0cyB3b3J0aCBpbiAtbW0gZm9yIGEgd2hpbGUgQW5kcmV3IHB1c2hlcworaXQgb24gdG8gTGludXMgZm9yIGluY2x1c2lvbiBpbiBtYWlubGluZS4KIAotVGhpcyBicmFuY2ggaXMgaW4gY29uc3RhbnQgZmx1eCBhbmQgY29udGFpbnMgbWFueSBleHBlcmltZW50YWwgZmVhdHVyZXMsIGEKK1RoZSBsaW51eC1uZXh0IHRyZWUgaXMgZGFpbHkgdXBkYXRlZCwgYW5kIGluY2x1ZGVzIHRoZSAtbW0gcGF0Y2hlcy4KK0JvdGggYXJlIGluIGNvbnN0YW50IGZsdXggYW5kIGNvbnRhaW5zIG1hbnkgZXhwZXJpbWVudGFsIGZlYXR1cmVzLCBhCiBsb3Qgb2YgZGVidWdnaW5nIHBhdGNoZXMgbm90IGFwcHJvcHJpYXRlIGZvciBtYWlubGluZSBldGMuLCBhbmQgaXMgdGhlIG1vc3QKIGV4cGVyaW1lbnRhbCBvZiB0aGUgYnJhbmNoZXMgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuCiAKLVRoZXNlIGtlcm5lbHMgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgdXNlIG9uIHN5c3RlbXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUKK1RoZXNlIHBhdGNoZXMgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgdXNlIG9uIHN5c3RlbXMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUKIHN0YWJsZSBhbmQgdGhleSBhcmUgbW9yZSByaXNreSB0byBydW4gdGhhbiBhbnkgb2YgdGhlIG90aGVyIGJyYW5jaGVzIChtYWtlCiBzdXJlIHlvdSBoYXZlIHVwLXRvLWRhdGUgYmFja3VwcyAtLSB0aGF0IGdvZXMgZm9yIGFueSBleHBlcmltZW50YWwga2VybmVsIGJ1dAotZXZlbiBtb3JlIHNvIGZvciAtbW0ga2VybmVscykuCitldmVuIG1vcmUgc28gZm9yIC1tbSBwYXRjaGVzIG9yIHVzaW5nIGEgS2VybmVsIGZyb20gdGhlIGxpbnV4LW5leHQgdHJlZSkuCiAKLVRoZXNlIGtlcm5lbHMgaW4gYWRkaXRpb24gdG8gYWxsIHRoZSBvdGhlciBleHBlcmltZW50YWwgcGF0Y2hlcyB0aGV5IGNvbnRhaW4KLXVzdWFsbHkgYWxzbyBjb250YWluIGFueSBjaGFuZ2VzIGluIHRoZSBtYWlubGluZSAtZ2l0IGtlcm5lbHMgYXZhaWxhYmxlIGF0Ci10aGUgdGltZSBvZiByZWxlYXNlLgorVGVzdGluZyBvZiAtbW0gcGF0Y2hlcyBhbmQgbGludXgtbmV4dCBpcyBncmVhdGx5IGFwcHJlY2lhdGVkIHNpbmNlIHRoZSB3aG9sZQorcG9pbnQgb2YgdGhvc2UgYXJlIHRvIHdlZWQgb3V0IHJlZ3Jlc3Npb25zLCBjcmFzaGVzLCBkYXRhIGNvcnJ1cHRpb24gYnVncywKK2J1aWxkIGJyZWFrYWdlIChhbmQgYW55IG90aGVyIGJ1ZyBpbiBnZW5lcmFsKSBiZWZvcmUgY2hhbmdlcyBhcmUgbWVyZ2VkIGludG8KK3RoZSBtb3JlIHN0YWJsZSBtYWlubGluZSBMaW51cyB0cmVlLgogCi1UZXN0aW5nIG9mIC1tbSBrZXJuZWxzIGlzIGdyZWF0bHkgYXBwcmVjaWF0ZWQgc2luY2UgdGhlIHdob2xlIHBvaW50IG9mIHRoZQotdHJlZSBpcyB0byB3ZWVkIG91dCByZWdyZXNzaW9ucywgY3Jhc2hlcywgZGF0YSBjb3JydXB0aW9uIGJ1Z3MsIGJ1aWxkCi1icmVha2FnZSAoYW5kIGFueSBvdGhlciBidWcgaW4gZ2VuZXJhbCkgYmVmb3JlIGNoYW5nZXMgYXJlIG1lcmdlZCBpbnRvIHRoZQotbW9yZSBzdGFibGUgbWFpbmxpbmUgTGludXMgdHJlZS4KLUJ1dCB0ZXN0ZXJzIG9mIC1tbSBzaG91bGQgYmUgYXdhcmUgdGhhdCBicmVha2FnZSBpbiB0aGlzIHRyZWUgaXMgbW9yZSBjb21tb24KLXRoYW4gaW4gYW55IG90aGVyIHRyZWUuCi0KLVRoZSAtbW0ga2VybmVscyBhcmUgbm90IHJlbGVhc2VkIG9uIGEgZml4ZWQgc2NoZWR1bGUsIGJ1dCB1c3VhbGx5IGEgZmV3IC1tbQota2VybmVscyBhcmUgcmVsZWFzZWQgaW4gYmV0d2VlbiBlYWNoIC1yYyBrZXJuZWwgKDEgdG8gMyBpcyBjb21tb24pLgotVGhlIC1tbSBrZXJuZWxzIGFwcGx5IHRvIGVpdGhlciBhIGJhc2UgMi42Lngga2VybmVsICh3aGVuIG5vIC1yYyBrZXJuZWxzCi1oYXZlIGJlZW4gcmVsZWFzZWQgeWV0KSBvciB0byBhIExpbnVzIC1yYyBrZXJuZWwuCi0KLUhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgYXBwbHlpbmcgdGhlIC1tbSBwYXRjaGVzOgotCi0jIG1vdmluZyBmcm9tIDIuNi4xMiB0byAyLjYuMTItbW0xCi0kIGNkIH4vbGludXgtMi42LjEyCQkJIyBjaGFuZ2UgdG8gdGhlIDIuNi4xMiBzb3VyY2UgZGlyCi0kIHBhdGNoIC1wMSA8IC4uLzIuNi4xMi1tbTEJCSMgYXBwbHkgdGhlIDIuNi4xMi1tbTEgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjEyIGxpbnV4LTIuNi4xMi1tbTEJIyByZW5hbWUgdGhlIHNvdXJjZSBhcHByb3ByaWF0ZWx5Ci0KLSMgbW92aW5nIGZyb20gMi42LjEyLW1tMSB0byAyLjYuMTMtcmMzLW1tMwotJCBjZCB+L2xpbnV4LTIuNi4xMi1tbTEKLSQgcGF0Y2ggLXAxIC1SIDwgLi4vMi42LjEyLW1tMQkJIyByZXZlcnQgdGhlIDIuNi4xMi1tbTEgcGF0Y2gKLQkJCQkJIyB3ZSBub3cgaGF2ZSBhIDIuNi4xMiBzb3VyY2UKLSQgcGF0Y2ggLXAxIDwgLi4vcGF0Y2gtMi42LjEzLXJjMwkjIGFwcGx5IHRoZSAyLjYuMTMtcmMzIHBhdGNoCi0JCQkJCSMgd2Ugbm93IGhhdmUgYSAyLjYuMTMtcmMzIHNvdXJjZQotJCBwYXRjaCAtcDEgPCAuLi8yLjYuMTMtcmMzLW1tMwkJIyBhcHBseSB0aGUgMi42LjEzLXJjMy1tbTMgcGF0Y2gKLSQgY2QgLi4KLSQgbXYgbGludXgtMi42LjEyLW1tMSBsaW51eC0yLjYuMTMtcmMzLW1tMwkjIHJlbmFtZSB0aGUgc291cmNlIGRpcgorQnV0IHRlc3RlcnMgb2YgLW1tIGFuZCBsaW51eC1uZXh0IHNob3VsZCBiZSBhd2FyZSB0aGF0IGJyZWFrYWdlcyBhcmUKK21vcmUgY29tbW9uIHRoYW4gaW4gYW55IG90aGVyIHRyZWUuCiAKIAogVGhpcyBjb25jbHVkZXMgdGhpcyBsaXN0IG9mIGV4cGxhbmF0aW9ucyBvZiB0aGUgdmFyaW91cyBrZXJuZWwgdHJlZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS9DQ04udHh0IGIvRG9jdW1lbnRhdGlvbi9hcm0vQ0NOLnR4dAppbmRleCBmZmNhNDQzLi4xNWNkYjdiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FybS9DQ04udHh0CisrKyBiL0RvY3VtZW50YXRpb24vYXJtL0NDTi50eHQKQEAgLTE4LDEzICsxOCwxNyBAQAogZGlyZWN0b3J5IHByb3ZpZGVzIGNvbmZpZ3VyYXRpb24gdGVtcGxhdGVzIGZvciBhbGwgZG9jdW1lbnRlZAogZXZlbnRzLCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggcGVyZiB0b29sLiBGb3IgZXhhbXBsZSAieHBfdmFsaWRfZmxpdCIKIGlzIGFuIGVxdWl2YWxlbnQgb2YgInR5cGU9MHg4LGV2ZW50PTB4NCIuIE90aGVyIHBhcmFtZXRlcnMgbXVzdCBiZQotZXhwbGljaXRseSBzcGVjaWZpZWQuIEZvciBldmVudHMgb3JpZ2luYXRpbmcgZnJvbSBkZXZpY2UsICJub2RlIgotZGVmaW5lcyBpdHMgaW5kZXguIEFsbCBjcm9zc3BvaW50IGV2ZW50cyByZXF1aXJlICJ4cCIgKGluZGV4KSwKLSJwb3J0IiAoZGV2aWNlIHBvcnQgbnVtYmVyKSBhbmQgInZjIiAodmlydHVhbCBjaGFubmVsIElEKSBhbmQKLSJkaXIiIChkaXJlY3Rpb24pLiBXYXRjaHBvaW50cyAoc3BlY2lhbCAiZXZlbnQiIHZhbHVlIDB4ZmUpIGFsc28KLXJlcXVpcmUgY29tcGFyYXRvciB2YWx1ZXMgKCJjbXBfbCIgYW5kICJjbXBfaCIpIGFuZCAibWFzayIsIGJlaW5nCi1pbmRleCBvZiB0aGUgY29tcGFyYXRvciBtYXNrLgorZXhwbGljaXRseSBzcGVjaWZpZWQuCiAKK0ZvciBldmVudHMgb3JpZ2luYXRpbmcgZnJvbSBkZXZpY2UsICJub2RlIiBkZWZpbmVzIGl0cyBpbmRleC4KKworQ3Jvc3Nwb2ludCBQTVUgZXZlbnRzIHJlcXVpcmUgInhwIiAoaW5kZXgpLCAiYnVzIiAoYnVzIG51bWJlcikKK2FuZCAidmMiICh2aXJ0dWFsIGNoYW5uZWwgSUQpLgorCitDcm9zc3BvaW50IHdhdGNocG9pbnQtYmFzZWQgZXZlbnRzIChzcGVjaWFsICJldmVudCIgdmFsdWUgMHhmZSkKK3JlcXVpcmUgInhwIiBhbmQgInZjIiBhcyBhcyBhYm92ZSBwbHVzICJwb3J0IiAoZGV2aWNlIHBvcnQgaW5kZXgpLAorImRpciIgKHRyYW5zbWl0L3JlY2VpdmUgZGlyZWN0aW9uKSwgY29tcGFyYXRvciB2YWx1ZXMgKCJjbXBfbCIKK2FuZCAiY21wX2giKSBhbmQgIm1hc2siLCBiZWluZyBpbmRleCBvZiB0aGUgY29tcGFyYXRvciBtYXNrLgogTWFza3MgYXJlIGRlZmluZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBldmVudCBkZXNjcmlwdGlvbgogKGR1ZSB0byBsaW1pdGVkIG51bWJlciBvZiB0aGUgY29uZmlnIHZhbHVlcykgaW4gdGhlICJjbXBfbWFzayIKIGRpcmVjdG9yeSwgd2l0aCBmaXJzdCA4IGNvbmZpZ3VyYWJsZSBieSB1c2VyIGFuZCBhZGRpdGlvbmFsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FybS9zdW54aS9SRUFETUUgYi9Eb2N1bWVudGF0aW9uL2FybS9zdW54aS9SRUFETUUKaW5kZXggNzdmNTdlZi4uY2QwMjQzMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm0vc3VueGkvUkVBRE1FCisrKyBiL0RvY3VtZW50YXRpb24vYXJtL3N1bnhpL1JFQURNRQpAQCAtNzUsNCArNzUsMTMgQEAKICAgICAqIE9jdGEgQVJNIENvcnRleC1BNyBiYXNlZCBTb0NzCiAgICAgICAtIEFsbHdpbm5lciBBODNUCiAgICAgICAgICsgRGF0YXNoZWV0Ci0gICAgICAgICAgaHR0cDovL2RsLmxpbnV4LXN1bnhpLm9yZy9BODNUL0E4M1RfZGF0YXNoZWV0X1JldmlzaW9uXzEuMS5wZGYKKyAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYWxsd2lubmVyLXpoL2RvY3VtZW50cy9yYXcvbWFzdGVyL0E4M1QvQTgzVF9EYXRhc2hlZXRfdjEuM18yMDE1MDUxMC5wZGYKKyAgICAgICAgKyBVc2VyIE1hbnVhbAorICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbGx3aW5uZXItemgvZG9jdW1lbnRzL3Jhdy9tYXN0ZXIvQTgzVC9BODNUX1VzZXJfTWFudWFsX3YxLjUuMV8yMDE1MDUxMy5wZGYKKworICAgICogUXVhZCBBUk0gQ29ydGV4LUE1MyBiYXNlZCBTb0NzCisgICAgICAtIEFsbHdpbm5lciBBNjQKKyAgICAgICAgKyBEYXRhc2hlZXQKKyAgICAgICAgICBodHRwOi8vZGwubGludXgtc3VueGkub3JnL0E2NC9BNjRfRGF0YXNoZWV0X1YxLjEucGRmCisgICAgICAgICsgVXNlciBNYW51YWwKKyAgICAgICAgICBodHRwOi8vZGwubGludXgtc3VueGkub3JnL0E2NC9BbGx3aW5uZXIlMjBBNjQlMjBVc2VyJTIwTWFudWFsJTIwdjEuMC5wZGYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYXJtNjQvc2lsaWNvbi1lcnJhdGEudHh0IGIvRG9jdW1lbnRhdGlvbi9hcm02NC9zaWxpY29uLWVycmF0YS50eHQKaW5kZXggY2NjNjAzMi4uNDA1ZGExMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hcm02NC9zaWxpY29uLWVycmF0YS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hcm02NC9zaWxpY29uLWVycmF0YS50eHQKQEAgLTYxLDMgKzYxLDUgQEAKIHwgQ2F2aXVtICAgICAgICAgfCBUaHVuZGVyWCBHSUN2MyAgfCAjMjMxNTQgICAgICAgICAgfCBDQVZJVU1fRVJSQVRVTV8yMzE1NCAgICB8CiB8IENhdml1bSAgICAgICAgIHwgVGh1bmRlclggQ29yZSAgIHwgIzI3NDU2ICAgICAgICAgIHwgQ0FWSVVNX0VSUkFUVU1fMjc0NTYgICAgfAogfCBDYXZpdW0gICAgICAgICB8IFRodW5kZXJYIFNNTVV2MiB8ICMyNzcwNCAgICAgICAgICB8IE4vQQkJICAgICAgIHwKK3wgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IEZyZWVzY2FsZS9OWFAgIHwgTFMyMDgwQS9MUzEwNDNBIHwgQS0wMDg1ODUgICAgICAgIHwgRlNMX0VSUkFUVU1fQTAwODU4NSAgICAgfApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0CmluZGV4IGJjZGIyYjQuLjkxOGUxZTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmxvY2svYmlvZG9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2Jpb2RvYy50eHQKQEAgLTExNSw3ICsxMTUsNyBAQAogCiBWYXJpb3VzIHBhcmFtZXRlcnMgdGhhdCB0aGUgZ2VuZXJpYyBpL28gc2NoZWR1bGVyIGxvZ2ljIHVzZXMgYXJlIHNldCBhdAogYSBwZXItcXVldWUgbGV2ZWwgKGUuZyBtYXhpbXVtIHJlcXVlc3Qgc2l6ZSwgbWF4aW11bSBudW1iZXIgb2Ygc2VnbWVudHMgaW4KLWEgc2NhdHRlci1nYXRoZXIgbGlzdCwgaGFyZHNlY3Qgc2l6ZSkKK2Egc2NhdHRlci1nYXRoZXIgbGlzdCwgbG9naWNhbCBibG9jayBzaXplKQogCiBTb21lIHBhcmFtZXRlcnMgdGhhdCB3ZXJlIGVhcmxpZXIgYXZhaWxhYmxlIGFzIGdsb2JhbCBhcnJheXMgaW5kZXhlZCBieQogbWFqb3IvbWlub3IgYXJlIG5vdyBkaXJlY3RseSBhc3NvY2lhdGVkIHdpdGggdGhlIHF1ZXVlLiBTb21lIG9mIHRoZXNlIG1heQpAQCAtMTU2LDcgKzE1Niw3IEBACiAJYmxrX3F1ZXVlX21heF9zZWdtZW50X3NpemUocSwgbWF4X3NlZ19zaXplKQogCQlNYXhpbXVtIHNpemUgb2YgYSBjbHVzdGVyZWQgc2VnbWVudCwgNjRrQiBkZWZhdWx0LgogCi0JYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUocSwgaGFyZHNlY3Rfc2l6ZSkKKwlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHEsIGxvZ2ljYWxfYmxvY2tfc2l6ZSkKIAkJTG93ZXN0IHBvc3NpYmxlIHNlY3RvciBzaXplIHRoYXQgdGhlIGhhcmR3YXJlIGNhbiBvcGVyYXRlCiAJCW9uLCA1MTIgYnl0ZXMgZGVmYXVsdC4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jbGsudHh0IGIvRG9jdW1lbnRhdGlvbi9jbGsudHh0CmluZGV4IDVjNGJjNGQuLjIyZjAyNmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2xrLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Nsay50eHQKQEAgLTMxLDI0ICszMSwyNSBAQAogaGFyZHdhcmUtc3BlY2lmaWMgYml0cyBmb3IgdGhlIGh5cG90aGV0aWNhbCAiZm9vIiBoYXJkd2FyZS4KIAogVHlpbmcgdGhlIHR3byBoYWx2ZXMgb2YgdGhpcyBpbnRlcmZhY2UgdG9nZXRoZXIgaXMgc3RydWN0IGNsa19odywgd2hpY2gKLWlzIGRlZmluZWQgaW4gc3RydWN0IGNsa19mb28gYW5kIHBvaW50ZWQgdG8gd2l0aGluIHN0cnVjdCBjbGsuICBUaGlzCitpcyBkZWZpbmVkIGluIHN0cnVjdCBjbGtfZm9vIGFuZCBwb2ludGVkIHRvIHdpdGhpbiBzdHJ1Y3QgY2xrX2NvcmUuICBUaGlzCiBhbGxvd3MgZm9yIGVhc3kgbmF2aWdhdGlvbiBiZXR3ZWVuIHRoZSB0d28gZGlzY3JldGUgaGFsdmVzIG9mIHRoZSBjb21tb24KIGNsb2NrIGludGVyZmFjZS4KIAogCVBhcnQgMiAtIGNvbW1vbiBkYXRhIHN0cnVjdHVyZXMgYW5kIGFwaQogCi1CZWxvdyBpcyB0aGUgY29tbW9uIHN0cnVjdCBjbGsgZGVmaW5pdGlvbiBmcm9tCi1pbmNsdWRlL2xpbnV4L2Nsay1wcml2YXRlLmgsIG1vZGlmaWVkIGZvciBicmV2aXR5OgorQmVsb3cgaXMgdGhlIGNvbW1vbiBzdHJ1Y3QgY2xrX2NvcmUgZGVmaW5pdGlvbiBmcm9tCitkcml2ZXJzL2Nsay9jbGsuYywgbW9kaWZpZWQgZm9yIGJyZXZpdHk6CiAKLQlzdHJ1Y3QgY2xrIHsKKwlzdHJ1Y3QgY2xrX2NvcmUgewogCQljb25zdCBjaGFyCQkqbmFtZTsKIAkJY29uc3Qgc3RydWN0IGNsa19vcHMJKm9wczsKIAkJc3RydWN0IGNsa19odwkJKmh3OwotCQljaGFyCQkJKipwYXJlbnRfbmFtZXM7Ci0JCXN0cnVjdCBjbGsJCSoqcGFyZW50czsKLQkJc3RydWN0IGNsawkJKnBhcmVudDsKLQkJc3RydWN0IGhsaXN0X2hlYWQJY2hpbGRyZW47Ci0JCXN0cnVjdCBobGlzdF9ub2RlCWNoaWxkX25vZGU7CisJCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKKwkJc3RydWN0IGNsa19jb3JlCQkqcGFyZW50OworCQljb25zdCBjaGFyCQkqKnBhcmVudF9uYW1lczsKKwkJc3RydWN0IGNsa19jb3JlCQkqKnBhcmVudHM7CisJCXU4CQkJbnVtX3BhcmVudHM7CisJCXU4CQkJbmV3X3BhcmVudF9pbmRleDsKIAkJLi4uCiAJfTsKIApAQCAtNTYsMTYgKzU3LDE5IEBACiBhcGkgaXRzZWxmIGRlZmluZXMgc2V2ZXJhbCBkcml2ZXItZmFjaW5nIGZ1bmN0aW9ucyB3aGljaCBvcGVyYXRlIG9uCiBzdHJ1Y3QgY2xrLiAgVGhhdCBhcGkgaXMgZG9jdW1lbnRlZCBpbiBpbmNsdWRlL2xpbnV4L2Nsay5oLgogCi1QbGF0Zm9ybXMgYW5kIGRldmljZXMgdXRpbGl6aW5nIHRoZSBjb21tb24gc3RydWN0IGNsayB1c2UgdGhlIHN0cnVjdAotY2xrX29wcyBwb2ludGVyIGluIHN0cnVjdCBjbGsgdG8gcGVyZm9ybSB0aGUgaGFyZHdhcmUtc3BlY2lmaWMgcGFydHMgb2YKLXRoZSBvcGVyYXRpb25zIGRlZmluZWQgaW4gY2xrLmg6CitQbGF0Zm9ybXMgYW5kIGRldmljZXMgdXRpbGl6aW5nIHRoZSBjb21tb24gc3RydWN0IGNsa19jb3JlIHVzZSB0aGUgc3RydWN0CitjbGtfb3BzIHBvaW50ZXIgaW4gc3RydWN0IGNsa19jb3JlIHRvIHBlcmZvcm0gdGhlIGhhcmR3YXJlLXNwZWNpZmljIHBhcnRzIG9mCit0aGUgb3BlcmF0aW9ucyBkZWZpbmVkIGluIGNsay1wcm92aWRlci5oOgogCiAJc3RydWN0IGNsa19vcHMgewogCQlpbnQJCSgqcHJlcGFyZSkoc3RydWN0IGNsa19odyAqaHcpOwogCQl2b2lkCQkoKnVucHJlcGFyZSkoc3RydWN0IGNsa19odyAqaHcpOworCQlpbnQJCSgqaXNfcHJlcGFyZWQpKHN0cnVjdCBjbGtfaHcgKmh3KTsKKwkJdm9pZAkJKCp1bnByZXBhcmVfdW51c2VkKShzdHJ1Y3QgY2xrX2h3ICpodyk7CiAJCWludAkJKCplbmFibGUpKHN0cnVjdCBjbGtfaHcgKmh3KTsKIAkJdm9pZAkJKCpkaXNhYmxlKShzdHJ1Y3QgY2xrX2h3ICpodyk7CiAJCWludAkJKCppc19lbmFibGVkKShzdHJ1Y3QgY2xrX2h3ICpodyk7CisJCXZvaWQJCSgqZGlzYWJsZV91bnVzZWQpKHN0cnVjdCBjbGtfaHcgKmh3KTsKIAkJdW5zaWduZWQgbG9uZwkoKnJlY2FsY19yYXRlKShzdHJ1Y3QgY2xrX2h3ICpodywKIAkJCQkJCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpOwogCQlsb25nCQkoKnJvdW5kX3JhdGUpKHN0cnVjdCBjbGtfaHcgKmh3LApAQCAtODQsNiArODgsOCBAQAogCQkJCQkgICAgdTggaW5kZXgpOwogCQl1bnNpZ25lZCBsb25nCSgqcmVjYWxjX2FjY3VyYWN5KShzdHJ1Y3QgY2xrX2h3ICpodywKIAkJCQkJCXVuc2lnbmVkIGxvbmcgcGFyZW50X2FjY3VyYWN5KTsKKwkJaW50CQkoKmdldF9waGFzZSkoc3RydWN0IGNsa19odyAqaHcpOworCQlpbnQJCSgqc2V0X3BoYXNlKShzdHJ1Y3QgY2xrX2h3ICpodywgaW50IGRlZ3JlZXMpOwogCQl2b2lkCQkoKmluaXQpKHN0cnVjdCBjbGtfaHcgKmh3KTsKIAkJaW50CQkoKmRlYnVnX2luaXQpKHN0cnVjdCBjbGtfaHcgKmh3LAogCQkJCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwpAQCAtOTEsNyArOTcsNyBAQAogCiAJUGFydCAzIC0gaGFyZHdhcmUgY2xrIGltcGxlbWVudGF0aW9ucwogCi1UaGUgc3RyZW5ndGggb2YgdGhlIGNvbW1vbiBzdHJ1Y3QgY2xrIGNvbWVzIGZyb20gaXRzIC5vcHMgYW5kIC5odyBwb2ludGVycworVGhlIHN0cmVuZ3RoIG9mIHRoZSBjb21tb24gc3RydWN0IGNsa19jb3JlIGNvbWVzIGZyb20gaXRzIC5vcHMgYW5kIC5odyBwb2ludGVycwogd2hpY2ggYWJzdHJhY3QgdGhlIGRldGFpbHMgb2Ygc3RydWN0IGNsayBmcm9tIHRoZSBoYXJkd2FyZS1zcGVjaWZpYyBiaXRzLCBhbmQKIHZpY2UgdmVyc2EuICBUbyBpbGx1c3RyYXRlIGNvbnNpZGVyIHRoZSBzaW1wbGUgZ2F0ZWFibGUgY2xrIGltcGxlbWVudGF0aW9uIGluCiBkcml2ZXJzL2Nsay9jbGstZ2F0ZS5jOgpAQCAtMTA3LDcgKzExMyw3IEBACiBrbm93bGVkZ2UgYWJvdXQgd2hpY2ggcmVnaXN0ZXIgYW5kIGJpdCBjb250cm9scyB0aGlzIGNsaydzIGdhdGluZy4KIE5vdGhpbmcgYWJvdXQgY2xvY2sgdG9wb2xvZ3kgb3IgYWNjb3VudGluZywgc3VjaCBhcyBlbmFibGVfY291bnQgb3IKIG5vdGlmaWVyX2NvdW50LCBpcyBuZWVkZWQgaGVyZS4gIFRoYXQgaXMgYWxsIGhhbmRsZWQgYnkgdGhlIGNvbW1vbgotZnJhbWV3b3JrIGNvZGUgYW5kIHN0cnVjdCBjbGsuCitmcmFtZXdvcmsgY29kZSBhbmQgc3RydWN0IGNsa19jb3JlLgogCiBMZXQncyB3YWxrIHRocm91Z2ggZW5hYmxpbmcgdGhpcyBjbGsgZnJvbSBkcml2ZXIgY29kZToKIApAQCAtMTM5LDIyICsxNDUsMTggQEAKIAogTm90ZSB0aGF0IHRvX2Nsa19nYXRlIGlzIGRlZmluZWQgYXM6CiAKLSNkZWZpbmUgdG9fY2xrX2dhdGUoX2h3KSBjb250YWluZXJfb2YoX2h3LCBzdHJ1Y3QgY2xrX2dhdGUsIGNsaykKKyNkZWZpbmUgdG9fY2xrX2dhdGUoX2h3KSBjb250YWluZXJfb2YoX2h3LCBzdHJ1Y3QgY2xrX2dhdGUsIGh3KQogCiBUaGlzIHBhdHRlcm4gb2YgYWJzdHJhY3Rpb24gaXMgdXNlZCBmb3IgZXZlcnkgY2xvY2sgaGFyZHdhcmUKIHJlcHJlc2VudGF0aW9uLgogCiAJUGFydCA0IC0gc3VwcG9ydGluZyB5b3VyIG93biBjbGsgaGFyZHdhcmUKIAotV2hlbiBpbXBsZW1lbnRpbmcgc3VwcG9ydCBmb3IgYSBuZXcgdHlwZSBvZiBjbG9jayBpdCBvbmx5IG5lY2Vzc2FyeSB0bworV2hlbiBpbXBsZW1lbnRpbmcgc3VwcG9ydCBmb3IgYSBuZXcgdHlwZSBvZiBjbG9jayBpdCBpcyBvbmx5IG5lY2Vzc2FyeSB0bwogaW5jbHVkZSB0aGUgZm9sbG93aW5nIGhlYWRlcjoKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogCi1pbmNsdWRlL2xpbnV4L2Nsay5oIGlzIGluY2x1ZGVkIHdpdGhpbiB0aGF0IGhlYWRlciBhbmQgY2xrLXByaXZhdGUuaAotbXVzdCBuZXZlciBiZSBpbmNsdWRlZCBmcm9tIHRoZSBjb2RlIHdoaWNoIGltcGxlbWVudHMgdGhlIG9wZXJhdGlvbnMgZm9yCi1hIGNsb2NrLiAgTW9yZSBvbiB0aGF0IGJlbG93IGluIFBhcnQgNS4KLQogVG8gY29uc3RydWN0IGEgY2xrIGhhcmR3YXJlIHN0cnVjdHVyZSBmb3IgeW91ciBwbGF0Zm9ybSB5b3UgbXVzdCBkZWZpbmUKIHRoZSBmb2xsb3dpbmc6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWZiMWRhLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotQ29weXJpZ2h0IDIwMTAgTmljb2xhcyBQYWxpeCA8bnBhbGl4QGRpa3UuZGs+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+Ci0KLVRoaXMgU21QTCBleGNlcnB0IGdlbmVyYXRlcyBPcmcgZW50cmllcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcwotaWxsdXN0cmF0ZWQgYmVsb3c6Ci0KLSogVE9ETyBbW3ZpZXc6L2hvbWUvdXNlci9saW51eC9jcnlwdG8vY3RyLmM6OmZhY2U9b3ZsLWZhY2UxOjpsaW5iPTE4ODo6Y29sYj05Ojpjb2xlPTE2XVtFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGFsZ11dCi0qIFRPRE8gW1t2aWV3Oi9ob21lL3VzZXIvbGludXgvY3J5cHRvL2F1dGhlbmMuYzo6ZmFjZT1vdmwtZmFjZTE6OmxpbmI9NjE5Ojpjb2xiPTk6OmNvbGU9MTZdW0VSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYXV0aF1dCi0qIFRPRE8gW1t2aWV3Oi9ob21lL3VzZXIvbGludXgvY3J5cHRvL3h0cy5jOjpmYWNlPW92bC1mYWNlMTo6bGluYj0yMjc6OmNvbGI9OTo6Y29sZT0xNl1bRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhbGddXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jb25mLnB5IGIvRG9jdW1lbnRhdGlvbi9jb25mLnB5CmluZGV4IDEwNmFlOWMuLjBjYzg3NjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY29uZi5weQorKysgYi9Eb2N1bWVudGF0aW9uL2NvbmYucHkKQEAgLTE0LDExICsxNCwxNyBAQAogCiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKK2ltcG9ydCBzcGhpbngKKworIyBHZXQgU3BoaW54IHZlcnNpb24KK21ham9yLCBtaW5vciwgcGF0Y2ggPSBtYXAoaW50LCBzcGhpbnguX192ZXJzaW9uX18uc3BsaXQoIi4iKSkKKwogCiAjIElmIGV4dGVuc2lvbnMgKG9yIG1vZHVsZXMgdG8gZG9jdW1lbnQgd2l0aCBhdXRvZG9jKSBhcmUgaW4gYW5vdGhlciBkaXJlY3RvcnksCiAjIGFkZCB0aGVzZSBkaXJlY3RvcmllcyB0byBzeXMucGF0aCBoZXJlLiBJZiB0aGUgZGlyZWN0b3J5IGlzIHJlbGF0aXZlIHRvIHRoZQogIyBkb2N1bWVudGF0aW9uIHJvb3QsIHVzZSBvcy5wYXRoLmFic3BhdGggdG8gbWFrZSBpdCBhYnNvbHV0ZSwgbGlrZSBzaG93biBoZXJlLgogc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguYWJzcGF0aCgnc3BoaW54JykpCitmcm9tIGxvYWRfY29uZmlnIGltcG9ydCBsb2FkQ29uZmlnCiAKICMgLS0gR2VuZXJhbCBjb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0yOCwxNCArMzQsMTMgQEAKICMgQWRkIGFueSBTcGhpbnggZXh0ZW5zaW9uIG1vZHVsZSBuYW1lcyBoZXJlLCBhcyBzdHJpbmdzLiBUaGV5IGNhbiBiZQogIyBleHRlbnNpb25zIGNvbWluZyB3aXRoIFNwaGlueCAobmFtZWQgJ3NwaGlueC5leHQuKicpIG9yIHlvdXIgY3VzdG9tCiAjIG9uZXMuCi1leHRlbnNpb25zID0gWydrZXJuZWwtZG9jJywgJ3JzdEZsYXRUYWJsZScsICdrZXJuZWxfaW5jbHVkZSddCitleHRlbnNpb25zID0gWydrZXJuZWwtZG9jJywgJ3JzdEZsYXRUYWJsZScsICdrZXJuZWxfaW5jbHVkZScsICdjZG9tYWluJ10KIAotIyBHcmFjZWZ1bGx5IGhhbmRsZSBtaXNzaW5nIHJzdDJwZGYuCi10cnk6Ci0gICAgaW1wb3J0IHJzdDJwZGYKLSAgICBleHRlbnNpb25zICs9IFsncnN0MnBkZi5wZGZidWlsZGVyJ10KLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBwYXNzCisjIFRoZSBuYW1lIG9mIHRoZSBtYXRoIGV4dGVuc2lvbiBjaGFuZ2VkIG9uIFNwaGlueCAxLjQKK2lmIG1pbm9yID4gMzoKKyAgICBleHRlbnNpb25zLmFwcGVuZCgic3BoaW54LmV4dC5pbWdtYXRoIikKK2Vsc2U6CisgICAgZXh0ZW5zaW9ucy5hcHBlbmQoInNwaGlueC5leHQucG5nbWF0aCIpCiAKICMgQWRkIGFueSBwYXRocyB0aGF0IGNvbnRhaW4gdGVtcGxhdGVzIGhlcmUsIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5LgogdGVtcGxhdGVzX3BhdGggPSBbJ190ZW1wbGF0ZXMnXQpAQCAtMjUyLDIzICsyNTcsOTAgQEAKIAogbGF0ZXhfZWxlbWVudHMgPSB7CiAjIFRoZSBwYXBlciBzaXplICgnbGV0dGVycGFwZXInIG9yICdhNHBhcGVyJykuCi0jJ3BhcGVyc2l6ZSc6ICdsZXR0ZXJwYXBlcicsCisncGFwZXJzaXplJzogJ2E0cGFwZXInLAogCiAjIFRoZSBmb250IHNpemUgKCcxMHB0JywgJzExcHQnIG9yICcxMnB0JykuCi0jJ3BvaW50c2l6ZSc6ICcxMHB0JywKLQotIyBBZGRpdGlvbmFsIHN0dWZmIGZvciB0aGUgTGFUZVggcHJlYW1ibGUuCi0jJ3ByZWFtYmxlJzogJycsCisncG9pbnRzaXplJzogJzhwdCcsCiAKICMgTGF0ZXggZmlndXJlIChmbG9hdCkgYWxpZ25tZW50CiAjJ2ZpZ3VyZV9hbGlnbic6ICdodGJwJywKKworIyBEb24ndCBtYW5nbGUgd2l0aCBVVEYtOCBjaGFycworJ2lucHV0ZW5jJzogJycsCisndXRmOGV4dHJhJzogJycsCisKKyMgQWRkaXRpb25hbCBzdHVmZiBmb3IgdGhlIExhVGVYIHByZWFtYmxlLgorICAgICdwcmVhbWJsZSc6ICcnJworCSUgQWRqdXN0IG1hcmdpbnMKKwlcXHVzZXBhY2thZ2VbbWFyZ2luPTAuNWluLCB0b3A9MWluLCBib3R0b209MWluXXtnZW9tZXRyeX0KKworICAgICAgICAlIEFsbG93IGdlbmVyYXRlIHNvbWUgcGFnZXMgaW4gbGFuZHNjYXBlCisgICAgICAgIFxcdXNlcGFja2FnZXtsc2NhcGV9CisKKyAgICAgICAgJSBQdXQgbm90ZXMgaW4gY29sb3IgYW5kIGxldCB0aGVtIGJlIGluc2lkZSBhIHRhYmxlCisJXFxkZWZpbmVjb2xvcntOb3RlQ29sb3J9e1JHQn17MjA0LDI1NSwyNTV9CisJXFxkZWZpbmVjb2xvcntXYXJuaW5nQ29sb3J9e1JHQn17MjU1LDIwNCwyMDR9CisJXFxkZWZpbmVjb2xvcntBdHRlbnRpb25Db2xvcn17UkdCfXsyNTUsMjU1LDIwNH0KKwlcXGRlZmluZWNvbG9ye090aGVyQ29sb3J9e1JHQn17MjA0LDIwNCwyMDR9CisgICAgICAgIFxcbmV3bGVuZ3Roe1xcbXlub3RpY2VsZW5ndGh9CisgICAgICAgIFxcbWFrZWF0bGV0dGVyXFxuZXdlbnZpcm9ubWVudHtjb2xvcmVkYm94fVsxXXslCisJICAgXFxzZXRsZW5ndGh7XFxmYm94cnVsZX17MXB0fQorCSAgIFxcc2V0bGVuZ3Roe1xcZmJveHNlcH17N3B0fQorCSAgIFxcc2V0bGVuZ3Roe1xcbXlub3RpY2VsZW5ndGh9e1xcbGluZXdpZHRofQorCSAgIFxcYWRkdG9sZW5ndGh7XFxteW5vdGljZWxlbmd0aH17LTJcXGZib3hzZXB9CisJICAgXFxhZGR0b2xlbmd0aHtcXG15bm90aWNlbGVuZ3RofXstMlxcZmJveHJ1bGV9CisgICAgICAgICAgIFxcYmVnaW57bHJib3h9e1xcQHRlbXBib3hhfVxcYmVnaW57bWluaXBhZ2V9e1xcbXlub3RpY2VsZW5ndGh9fXtcXGVuZHttaW5pcGFnZX1cXGVuZHtscmJveH0lCisJICAgXFxpZnRoZW5lbHNlJQorCSAgICAgIHtcXGVxdWFse1xccHlAbm90aWNldHlwZX17bm90ZX19JQorCSAgICAgIHtcXGNvbG9yYm94e05vdGVDb2xvcn17XFx1c2Vib3h7XFxAdGVtcGJveGF9fX0lCisJICAgICAgeyUKKwkgICAgICAgICBcXGlmdGhlbmVsc2UlCisJICAgICAgICAge1xcZXF1YWx7XFxweUBub3RpY2V0eXBlfXt3YXJuaW5nfX0lCisJICAgICAgICAge1xcY29sb3Jib3h7V2FybmluZ0NvbG9yfXtcXHVzZWJveHtcXEB0ZW1wYm94YX19fSUKKwkJIHslCisJICAgICAgICAgICAgXFxpZnRoZW5lbHNlJQorCSAgICAgICAgICAgIHtcXGVxdWFse1xccHlAbm90aWNldHlwZX17YXR0ZW50aW9ufX0lCisJICAgICAgICAgICAge1xcY29sb3Jib3h7QXR0ZW50aW9uQ29sb3J9e1xcdXNlYm94e1xcQHRlbXBib3hhfX19JQorCSAgICAgICAgICAgIHtcXGNvbG9yYm94e090aGVyQ29sb3J9e1xcdXNlYm94e1xcQHRlbXBib3hhfX19JQorCQkgfSUKKwkgICAgICB9JQorICAgICAgICB9XFxtYWtlYXRvdGhlcgorCisgICAgICAgIFxcbWFrZWF0bGV0dGVyCisgICAgICAgIFxccmVuZXdlbnZpcm9ubWVudHtub3RpY2V9WzJdeyUKKyAgICAgICAgICBcXGRlZlxccHlAbm90aWNldHlwZXsjMX0KKyAgICAgICAgICBcXGJlZ2lue2NvbG9yZWRib3h9eyMxfQorICAgICAgICAgIFxcYmZcXGl0CisgICAgICAgICAgXFxwYXJcXHN0cm9uZ3sjMn0KKyAgICAgICAgICBcXGNzbmFtZSBweUBub3RpY2VzdGFydEAjMVxcZW5kY3NuYW1lCisgICAgICAgIH0KKwl7CisgICAgICAgICAgXFxjc25hbWUgcHlAbm90aWNlZW5kQFxccHlAbm90aWNldHlwZVxcZW5kY3NuYW1lCisgICAgICAgICAgXFxlbmR7Y29sb3JlZGJveH0KKyAgICAgICAgfQorCVxcbWFrZWF0b3RoZXIKKworCSUgVXNlIHNvbWUgZm9udCB3aXRoIFVURi04IHN1cHBvcnQgd2l0aCBYZUxhVGVYCisgICAgICAgIFxcdXNlcGFja2FnZXtmb250c3BlY30KKyAgICAgICAgXFxzZXRzYW5zZm9udHtEZWphVnUgU2VyaWZ9CisgICAgICAgIFxcc2V0cm9tYW5mb250e0RlamFWdSBTYW5zfQorICAgICAgICBcXHNldG1vbm9mb250e0RlamFWdSBTYW5zIE1vbm99CisKKwklIFRvIGFsbG93IGFkanVzdGluZyB0YWJsZSBzaXplcworCVxcdXNlcGFja2FnZXthZGp1c3Rib3h9CisKKyAgICAgJycnCiB9CiAKICMgR3JvdXBpbmcgdGhlIGRvY3VtZW50IHRyZWUgaW50byBMYVRlWCBmaWxlcy4gTGlzdCBvZiB0dXBsZXMKICMgKHNvdXJjZSBzdGFydCBmaWxlLCB0YXJnZXQgbmFtZSwgdGl0bGUsCiAjICBhdXRob3IsIGRvY3VtZW50Y2xhc3MgW2hvd3RvLCBtYW51YWwsIG9yIG93biBjbGFzc10pLgogbGF0ZXhfZG9jdW1lbnRzID0gWwotICAgIChtYXN0ZXJfZG9jLCAnVGhlTGludXhLZXJuZWwudGV4JywgJ1RoZSBMaW51eCBLZXJuZWwgRG9jdW1lbnRhdGlvbicsCisgICAgKCdrZXJuZWwtZG9jdW1lbnRhdGlvbicsICdrZXJuZWwtZG9jdW1lbnRhdGlvbi50ZXgnLCAnVGhlIExpbnV4IEtlcm5lbCBEb2N1bWVudGF0aW9uJywKKyAgICAgJ1RoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5JywgJ21hbnVhbCcpLAorICAgICgnZGV2ZWxvcG1lbnQtcHJvY2Vzcy9pbmRleCcsICdkZXZlbG9wbWVudC1wcm9jZXNzLnRleCcsICdMaW51eCBLZXJuZWwgRGV2ZWxvcG1lbnQgRG9jdW1lbnRhdGlvbicsCisgICAgICdUaGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eScsICdtYW51YWwnKSwKKyAgICAoJ2dwdS9pbmRleCcsICdncHUudGV4JywgJ0xpbnV4IEdQVSBEcml2ZXIgRGV2ZWxvcGVyXCdzIEd1aWRlJywKICAgICAgJ1RoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5JywgJ21hbnVhbCcpLAogXQogCkBAIC00MTksMyArNDkxLDkgQEAKICMgbGluZSBhcmd1bWVudHMuCiBrZXJuZWxkb2NfYmluID0gJy4uL3NjcmlwdHMva2VybmVsLWRvYycKIGtlcm5lbGRvY19zcmN0cmVlID0gJy4uJworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTaW5jZSBsb2FkQ29uZmlnIG92ZXJ3cml0ZXMgc2V0dGluZ3MgZnJvbSB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaXQgaGFzIHRvIGJlCisjIHRoZSBsYXN0IHN0YXRlbWVudCBpbiB0aGUgY29uZi5weSBmaWxlCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbG9hZENvbmZpZyhnbG9iYWxzKCkpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdWZyZXEtc3RhdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9jcHUtZnJlcS9jcHVmcmVxLXN0YXRzLnR4dAppbmRleCBmYzY0NzQ5Li44ZDk3NzNmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2NwdS1mcmVxL2NwdWZyZXEtc3RhdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY3B1LWZyZXEvY3B1ZnJlcS1zdGF0cy50eHQKQEAgLTEwMyw3ICsxMDMsNyBAQAogCVBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoQUNQSSwgQVBNKSAgLS0tPgogCQlDUFUgRnJlcXVlbmN5IHNjYWxpbmcgIC0tLT4KIAkJCVsqXSBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKLQkJCTwqPiAgIENQVSBmcmVxdWVuY3kgdHJhbnNsYXRpb24gc3RhdGlzdGljcyAKKwkJCVsqXSAgIENQVSBmcmVxdWVuY3kgdHJhbnNsYXRpb24gc3RhdGlzdGljcwogCQkJWypdICAgICBDUFUgZnJlcXVlbmN5IHRyYW5zbGF0aW9uIHN0YXRpc3RpY3MgZGV0YWlscwogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NvY2NpbmVsbGUucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY29jY2luZWxsZS5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE2NGI0YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2NvY2NpbmVsbGUucnN0CkBAIC0wLDAgKzEsNDkxIEBACisuLiBDb3B5cmlnaHQgMjAxMCBOaWNvbGFzIFBhbGl4IDxucGFsaXhAZGlrdS5kaz4KKy4uIENvcHlyaWdodCAyMDEwIEp1bGlhIExhd2FsbCA8anVsaWFAZGlrdS5kaz4KKy4uIENvcHlyaWdodCAyMDEwIEdpbGxlcyBNdWxsZXIgPEdpbGxlcy5NdWxsZXJAbGlwNi5mcj4KKworLi4gaGlnaGxpZ2h0Ojogbm9uZQorCitDb2NjaW5lbGxlCis9PT09PT09PT09CisKK0NvY2NpbmVsbGUgaXMgYSB0b29sIGZvciBwYXR0ZXJuIG1hdGNoaW5nIGFuZCB0ZXh0IHRyYW5zZm9ybWF0aW9uIHRoYXQgaGFzCittYW55IHVzZXMgaW4ga2VybmVsIGRldmVsb3BtZW50LCBpbmNsdWRpbmcgdGhlIGFwcGxpY2F0aW9uIG9mIGNvbXBsZXgsCit0cmVlLXdpZGUgcGF0Y2hlcyBhbmQgZGV0ZWN0aW9uIG9mIHByb2JsZW1hdGljIHByb2dyYW1taW5nIHBhdHRlcm5zLgorCitHZXR0aW5nIENvY2NpbmVsbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHNlbWFudGljIHBhdGNoZXMgaW5jbHVkZWQgaW4gdGhlIGtlcm5lbCB1c2UgZmVhdHVyZXMgYW5kIG9wdGlvbnMKK3doaWNoIGFyZSBwcm92aWRlZCBieSBDb2NjaW5lbGxlIHZlcnNpb24gMS4wLjAtcmMxMSBhbmQgYWJvdmUuCitVc2luZyBlYXJsaWVyIHZlcnNpb25zIHdpbGwgZmFpbCBhcyB0aGUgb3B0aW9uIG5hbWVzIHVzZWQgYnkKK3RoZSBDb2NjaW5lbGxlIGZpbGVzIGFuZCBjb2NjaWNoZWNrIGhhdmUgYmVlbiB1cGRhdGVkLgorCitDb2NjaW5lbGxlIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBwYWNrYWdlIG1hbmFnZXIKK29mIG1hbnkgZGlzdHJpYnV0aW9ucywgZS5nLiA6CisKKyAtIERlYmlhbgorIC0gRmVkb3JhCisgLSBVYnVudHUKKyAtIE9wZW5TVVNFCisgLSBBcmNoIExpbnV4CisgLSBOZXRCU0QKKyAtIEZyZWVCU0QKKworWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIHJlbGVhc2VkIGZyb20gdGhlIENvY2NpbmVsbGUgaG9tZXBhZ2UgYXQKK2h0dHA6Ly9jb2NjaW5lbGxlLmxpcDYuZnIvCisKK0luZm9ybWF0aW9uIGFuZCB0aXBzIGFib3V0IENvY2NpbmVsbGUgYXJlIGFsc28gcHJvdmlkZWQgb24gdGhlIHdpa2kKK3BhZ2VzIGF0IGh0dHA6Ly9jb2NjaS5la3N0cmFuZXQuZGlrdS5kay93aWtpL2Rva3UucGhwCisKK09uY2UgeW91IGhhdmUgaXQsIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6OgorCisgICAgIAkuL2NvbmZpZ3VyZQorICAgICAgICBtYWtlCisKK2FzIGEgcmVndWxhciB1c2VyLCBhbmQgaW5zdGFsbCBpdCB3aXRoOjoKKworICAgICAgICBzdWRvIG1ha2UgaW5zdGFsbAorCitTdXBwbGVtZW50YWwgZG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZvciBzdXBwbGVtZW50YWwgZG9jdW1lbnRhdGlvbiByZWZlciB0byB0aGUgd2lraToKKworaHR0cHM6Ly9ib3R0ZXN0Lndpa2kua2VybmVsLm9yZy9jb2NjaWNoZWNrCisKK1RoZSB3aWtpIGRvY3VtZW50YXRpb24gYWx3YXlzIHJlZmVycyB0byB0aGUgbGludXgtbmV4dCB2ZXJzaW9uIG9mIHRoZSBzY3JpcHQuCisKK1VzaW5nIENvY2NpbmVsbGUgb24gdGhlIExpbnV4IGtlcm5lbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgQ29jY2luZWxsZS1zcGVjaWZpYyB0YXJnZXQgaXMgZGVmaW5lZCBpbiB0aGUgdG9wIGxldmVsCitNYWtlZmlsZS4gVGhpcyB0YXJnZXQgaXMgbmFtZWQgYGBjb2NjaWNoZWNrYGAgYW5kIGNhbGxzIHRoZSBgYGNvY2NpY2hlY2tgYAorZnJvbnQtZW5kIGluIHRoZSBgYHNjcmlwdHNgYCBkaXJlY3RvcnkuCisKK0ZvdXIgYmFzaWMgbW9kZXMgYXJlIGRlZmluZWQ6IGBgcGF0Y2hgYCwgYGByZXBvcnRgYCwgYGBjb250ZXh0YGAsIGFuZAorYGBvcmdgYC4gVGhlIG1vZGUgdG8gdXNlIGlzIHNwZWNpZmllZCBieSBzZXR0aW5nIHRoZSBNT0RFIHZhcmlhYmxlIHdpdGgKK2BgTU9ERT08bW9kZT5gYC4KKworLSBgYHBhdGNoYGAgcHJvcG9zZXMgYSBmaXgsIHdoZW4gcG9zc2libGUuCisKKy0gYGByZXBvcnRgYCBnZW5lcmF0ZXMgYSBsaXN0IGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorICBmaWxlOmxpbmU6Y29sdW1uLWNvbHVtbjogbWVzc2FnZQorCistIGBgY29udGV4dGBgIGhpZ2hsaWdodHMgbGluZXMgb2YgaW50ZXJlc3QgYW5kIHRoZWlyIGNvbnRleHQgaW4gYQorICBkaWZmLWxpa2Ugc3R5bGUuTGluZXMgb2YgaW50ZXJlc3QgYXJlIGluZGljYXRlZCB3aXRoIGBgLWBgLgorCistIGBgb3JnYGAgZ2VuZXJhdGVzIGEgcmVwb3J0IGluIHRoZSBPcmcgbW9kZSBmb3JtYXQgb2YgRW1hY3MuCisKK05vdGUgdGhhdCBub3QgYWxsIHNlbWFudGljIHBhdGNoZXMgaW1wbGVtZW50IGFsbCBtb2Rlcy4gRm9yIGVhc3kgdXNlCitvZiBDb2NjaW5lbGxlLCB0aGUgZGVmYXVsdCBtb2RlIGlzICJyZXBvcnQiLgorCitUd28gb3RoZXIgbW9kZXMgcHJvdmlkZSBzb21lIGNvbW1vbiBjb21iaW5hdGlvbnMgb2YgdGhlc2UgbW9kZXMuCisKKy0gYGBjaGFpbmBgIHRyaWVzIHRoZSBwcmV2aW91cyBtb2RlcyBpbiB0aGUgb3JkZXIgYWJvdmUgdW50aWwgb25lIHN1Y2NlZWRzLgorCistIGBgcmVwK2N0eHRgYCBydW5zIHN1Y2Nlc3NpdmVseSB0aGUgcmVwb3J0IG1vZGUgYW5kIHRoZSBjb250ZXh0IG1vZGUuCisgIEl0IHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIEMgb3B0aW9uIChkZXNjcmliZWQgbGF0ZXIpCisgIHdoaWNoIGNoZWNrcyB0aGUgY29kZSBvbiBhIGZpbGUgYmFzaXMuCisKK0V4YW1wbGVzCit+fn5+fn5+fgorCitUbyBtYWtlIGEgcmVwb3J0IGZvciBldmVyeSBzZW1hbnRpYyBwYXRjaCwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo6CisKKwkJbWFrZSBjb2NjaWNoZWNrIE1PREU9cmVwb3J0CisKK1RvIHByb2R1Y2UgcGF0Y2hlcywgcnVuOjoKKworCQltYWtlIGNvY2NpY2hlY2sgTU9ERT1wYXRjaAorCisKK1RoZSBjb2NjaWNoZWNrIHRhcmdldCBhcHBsaWVzIGV2ZXJ5IHNlbWFudGljIHBhdGNoIGF2YWlsYWJsZSBpbiB0aGUKK3N1Yi1kaXJlY3RvcmllcyBvZiBgYHNjcmlwdHMvY29jY2luZWxsZWBgIHRvIHRoZSBlbnRpcmUgTGludXgga2VybmVsLgorCitGb3IgZWFjaCBzZW1hbnRpYyBwYXRjaCwgYSBjb21taXQgbWVzc2FnZSBpcyBwcm9wb3NlZC4gIEl0IGdpdmVzIGEKK2Rlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIGJlaW5nIGNoZWNrZWQgYnkgdGhlIHNlbWFudGljIHBhdGNoLCBhbmQKK2luY2x1ZGVzIGEgcmVmZXJlbmNlIHRvIENvY2NpbmVsbGUuCisKK0FzIGFueSBzdGF0aWMgY29kZSBhbmFseXplciwgQ29jY2luZWxsZSBwcm9kdWNlcyBmYWxzZQorcG9zaXRpdmVzLiBUaHVzLCByZXBvcnRzIG11c3QgYmUgY2FyZWZ1bGx5IGNoZWNrZWQsIGFuZCBwYXRjaGVzCityZXZpZXdlZC4KKworVG8gZW5hYmxlIHZlcmJvc2UgbWVzc2FnZXMgc2V0IHRoZSBWPSB2YXJpYWJsZSwgZm9yIGV4YW1wbGU6OgorCisgICBtYWtlIGNvY2NpY2hlY2sgTU9ERT1yZXBvcnQgVj0xCisKK0NvY2NpbmVsbGUgcGFyYWxsZWxpemF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQnkgZGVmYXVsdCwgY29jY2ljaGVjayB0cmllcyB0byBydW4gYXMgcGFyYWxsZWwgYXMgcG9zc2libGUuIFRvIGNoYW5nZQordGhlIHBhcmFsbGVsaXNtLCBzZXQgdGhlIEo9IHZhcmlhYmxlLiBGb3IgZXhhbXBsZSwgdG8gcnVuIGFjcm9zcyA0IENQVXM6OgorCisgICBtYWtlIGNvY2NpY2hlY2sgTU9ERT1yZXBvcnQgSj00CisKK0FzIG9mIENvY2NpbmVsbGUgMS4wLjIgQ29jY2luZWxsZSB1c2VzIE9jYW1sIHBhcm1hcCBmb3IgcGFyYWxsZWxpemF0aW9uLAoraWYgc3VwcG9ydCBmb3IgdGhpcyBpcyBkZXRlY3RlZCB5b3Ugd2lsbCBiZW5lZml0IGZyb20gcGFybWFwIHBhcmFsbGVsaXphdGlvbi4KKworV2hlbiBwYXJtYXAgaXMgZW5hYmxlZCBjb2NjaWNoZWNrIHdpbGwgZW5hYmxlIGR5bmFtaWMgbG9hZCBiYWxhbmNpbmcgYnkgdXNpbmcKK2BgLS1jaHVua3NpemUgMWBgIGFyZ3VtZW50LCB0aGlzIGVuc3VyZXMgd2Uga2VlcCBmZWVkaW5nIHRocmVhZHMgd2l0aCB3b3JrCitvbmUgYnkgb25lLCBzbyB0aGF0IHdlIGF2b2lkIHRoZSBzaXR1YXRpb24gd2hlcmUgbW9zdCB3b3JrIGdldHMgZG9uZSBieSBvbmx5CithIGZldyB0aHJlYWRzLiBXaXRoIGR5bmFtaWMgbG9hZCBiYWxhbmNpbmcsIGlmIGEgdGhyZWFkIGZpbmlzaGVzIGVhcmx5IHdlIGtlZXAKK2ZlZWRpbmcgaXQgbW9yZSB3b3JrLgorCitXaGVuIHBhcm1hcCBpcyBlbmFibGVkLCBpZiBhbiBlcnJvciBvY2N1cnMgaW4gQ29jY2luZWxsZSwgdGhpcyBlcnJvcgordmFsdWUgaXMgcHJvcGFnYXRlZCBiYWNrLCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBgYG1ha2UgY29jY2ljaGVja2BgCitjYXB0dXJlcyB0aGlzIHJldHVybiB2YWx1ZS4KKworVXNpbmcgQ29jY2luZWxsZSB3aXRoIGEgc2luZ2xlIHNlbWFudGljIHBhdGNoCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG9wdGlvbmFsIG1ha2UgdmFyaWFibGUgQ09DQ0kgY2FuIGJlIHVzZWQgdG8gY2hlY2sgYSBzaW5nbGUKK3NlbWFudGljIHBhdGNoLiBJbiB0aGF0IGNhc2UsIHRoZSB2YXJpYWJsZSBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGgKK3RoZSBuYW1lIG9mIHRoZSBzZW1hbnRpYyBwYXRjaCB0byBhcHBseS4KKworRm9yIGluc3RhbmNlOjoKKworCW1ha2UgY29jY2ljaGVjayBDT0NDST08bXlfU1AuY29jY2k+IE1PREU9cGF0Y2gKKworb3I6OgorCisJbWFrZSBjb2NjaWNoZWNrIENPQ0NJPTxteV9TUC5jb2NjaT4gTU9ERT1yZXBvcnQKKworCitDb250cm9sbGluZyBXaGljaCBGaWxlcyBhcmUgUHJvY2Vzc2VkIGJ5IENvY2NpbmVsbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCeSBkZWZhdWx0IHRoZSBlbnRpcmUga2VybmVsIHNvdXJjZSB0cmVlIGlzIGNoZWNrZWQuCisKK1RvIGFwcGx5IENvY2NpbmVsbGUgdG8gYSBzcGVjaWZpYyBkaXJlY3RvcnksIGBgTT1gYCBjYW4gYmUgdXNlZC4KK0ZvciBleGFtcGxlLCB0byBjaGVjayBkcml2ZXJzL25ldC93aXJlbGVzcy8gb25lIG1heSB3cml0ZTo6CisKKyAgICBtYWtlIGNvY2NpY2hlY2sgTT1kcml2ZXJzL25ldC93aXJlbGVzcy8KKworVG8gYXBwbHkgQ29jY2luZWxsZSBvbiBhIGZpbGUgYmFzaXMsIGluc3RlYWQgb2YgYSBkaXJlY3RvcnkgYmFzaXMsIHRoZQorZm9sbG93aW5nIGNvbW1hbmQgbWF5IGJlIHVzZWQ6OgorCisgICAgbWFrZSBDPTEgQ0hFQ0s9InNjcmlwdHMvY29jY2ljaGVjayIKKworVG8gY2hlY2sgb25seSBuZXdseSBlZGl0ZWQgY29kZSwgdXNlIHRoZSB2YWx1ZSAyIGZvciB0aGUgQyBmbGFnLCBpLmUuOjoKKworICAgIG1ha2UgQz0yIENIRUNLPSJzY3JpcHRzL2NvY2NpY2hlY2siCisKK0luIHRoZXNlIG1vZGVzLCB3aGljaCB3b3JrcyBvbiBhIGZpbGUgYmFzaXMsIHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uCithYm91dCBzZW1hbnRpYyBwYXRjaGVzIGRpc3BsYXllZCwgYW5kIG5vIGNvbW1pdCBtZXNzYWdlIHByb3Bvc2VkLgorCitUaGlzIHJ1bnMgZXZlcnkgc2VtYW50aWMgcGF0Y2ggaW4gc2NyaXB0cy9jb2NjaW5lbGxlIGJ5IGRlZmF1bHQuIFRoZQorQ09DQ0kgdmFyaWFibGUgbWF5IGFkZGl0aW9uYWxseSBiZSB1c2VkIHRvIG9ubHkgYXBwbHkgYSBzaW5nbGUKK3NlbWFudGljIHBhdGNoIGFzIHNob3duIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLgorCitUaGUgInJlcG9ydCIgbW9kZSBpcyB0aGUgZGVmYXVsdC4gWW91IGNhbiBzZWxlY3QgYW5vdGhlciBvbmUgd2l0aCB0aGUKK01PREUgdmFyaWFibGUgZXhwbGFpbmVkIGFib3ZlLgorCitEZWJ1Z2dpbmcgQ29jY2luZWxsZSBTbVBMIHBhdGNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitVc2luZyBjb2NjaWNoZWNrIGlzIGJlc3QgYXMgaXQgcHJvdmlkZXMgaW4gdGhlIHNwYXRjaCBjb21tYW5kIGxpbmUKK2luY2x1ZGUgb3B0aW9ucyBtYXRjaGluZyB0aGUgb3B0aW9ucyB1c2VkIHdoZW4gd2UgY29tcGlsZSB0aGUga2VybmVsLgorWW91IGNhbiBsZWFybiB3aGF0IHRoZXNlIG9wdGlvbnMgYXJlIGJ5IHVzaW5nIFY9MSwgeW91IGNvdWxkIHRoZW4KK21hbnVhbGx5IHJ1biBDb2NjaW5lbGxlIHdpdGggZGVidWcgb3B0aW9ucyBhZGRlZC4KKworQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGRlYnVnIHJ1bm5pbmcgQ29jY2luZWxsZSBhZ2FpbnN0IFNtUEwgcGF0Y2hlcworYnkgYXNraW5nIGZvciBzdGRlcnIgdG8gYmUgcmVkaXJlY3RlZCB0byBzdGRlcnIsIGJ5IGRlZmF1bHQgc3RkZXJyCitpcyByZWRpcmVjdGVkIHRvIC9kZXYvbnVsbCwgaWYgeW91J2QgbGlrZSB0byBjYXB0dXJlIHN0ZGVyciB5b3UKK2NhbiBzcGVjaWZ5IHRoZSBgYERFQlVHX0ZJTEU9ImZpbGUudHh0ImBgIG9wdGlvbiB0byBjb2NjaWNoZWNrLiBGb3IKK2luc3RhbmNlOjoKKworICAgIHJtIC1mIGNvY2NpLmVycgorICAgIG1ha2UgY29jY2ljaGVjayBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvZnJlZS9rZnJlZS5jb2NjaSBNT0RFPXJlcG9ydCBERUJVR19GSUxFPWNvY2NpLmVycgorICAgIGNhdCBjb2NjaS5lcnIKKworWW91IGNhbiB1c2UgU1BGTEFHUyB0byBhZGQgZGVidWdnaW5nIGZsYWdzLCBmb3IgaW5zdGFuY2UgeW91IG1heSB3YW50IHRvCithZGQgYm90aCAtLXByb2ZpbGUgLS1zaG93LXRyeWluZyB0byBTUEZMQUdTIHdoZW4gZGVidWdnaW5nLiBGb3IgaW5zdGFuY2UKK3lvdSBtYXkgd2FudCB0byB1c2U6OgorCisgICAgcm0gLWYgZXJyLmxvZworICAgIGV4cG9ydCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9pcnFmX29uZXNob3QuY29jY2kKKyAgICBtYWtlIGNvY2NpY2hlY2sgREVCVUdfRklMRT0iZXJyLmxvZyIgTU9ERT1yZXBvcnQgU1BGTEFHUz0iLS1wcm9maWxlIC0tc2hvdy10cnlpbmciIE09Li9kcml2ZXJzL21mZC9hcml6b25hLWlycS5jCisKK2Vyci5sb2cgd2lsbCBub3cgaGF2ZSB0aGUgcHJvZmlsaW5nIGluZm9ybWF0aW9uLCB3aGlsZSBzdGRvdXQgd2lsbAorcHJvdmlkZSBzb21lIHByb2dyZXNzIGluZm9ybWF0aW9uIGFzIENvY2NpbmVsbGUgbW92ZXMgZm9yd2FyZCB3aXRoCit3b3JrLgorCitERUJVR19GSUxFIHN1cHBvcnQgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBjb2NjaW5lbGxlID49IDEuMi4KKworLmNvY2NpY29uZmlnIHN1cHBvcnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvY2NpbmVsbGUgc3VwcG9ydHMgcmVhZGluZyAuY29jY2ljb25maWcgZm9yIGRlZmF1bHQgQ29jY2luZWxsZSBvcHRpb25zIHRoYXQKK3Nob3VsZCBiZSB1c2VkIGV2ZXJ5IHRpbWUgc3BhdGNoIGlzIHNwYXduZWQsIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGZvcgordmFyaWFibGVzIGZvciAuY29jY2ljb25maWcgaXMgYXMgZm9sbG93czoKKworLSBZb3VyIGN1cnJlbnQgdXNlcidzIGhvbWUgZGlyZWN0b3J5IGlzIHByb2Nlc3NlZCBmaXJzdAorLSBZb3VyIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHNwYXRjaCBpcyBjYWxsZWQgaXMgcHJvY2Vzc2VkIG5leHQKKy0gVGhlIGRpcmVjdG9yeSBwcm92aWRlZCB3aXRoIHRoZSAtLWRpciBvcHRpb24gaXMgcHJvY2Vzc2VkIGxhc3QsIGlmIHVzZWQKKworU2luY2UgY29jY2ljaGVjayBydW5zIHRocm91Z2ggbWFrZSwgaXQgbmF0dXJhbGx5IHJ1bnMgZnJvbSB0aGUga2VybmVsCitwcm9wZXIgZGlyLCBhcyBzdWNoIHRoZSBzZWNvbmQgcnVsZSBhYm92ZSB3b3VsZCBiZSBpbXBsaWVkIGZvciBwaWNraW5nIHVwIGEKKy5jb2NjaWNvbmZpZyB3aGVuIHVzaW5nIGBgbWFrZSBjb2NjaWNoZWNrYGAuCisKK2BgbWFrZSBjb2NjaWNoZWNrYGAgYWxzbyBzdXBwb3J0cyB1c2luZyBNPSB0YXJnZXRzLklmIHlvdSBkbyBub3Qgc3VwcGx5CithbnkgTT0gdGFyZ2V0LCBpdCBpcyBhc3N1bWVkIHlvdSB3YW50IHRvIHRhcmdldCB0aGUgZW50aXJlIGtlcm5lbC4KK1RoZSBrZXJuZWwgY29jY2ljaGVjayBzY3JpcHQgaGFzOjoKKworICAgIGlmIFsgIiRLQlVJTERfRVhUTU9EIiA9ICIiIF0gOyB0aGVuCisgICAgICAgIE9QVElPTlM9Ii0tZGlyICRzcmN0cmVlICRDT0NDSUlOQ0xVREUiCisgICAgZWxzZQorICAgICAgICBPUFRJT05TPSItLWRpciAkS0JVSUxEX0VYVE1PRCAkQ09DQ0lJTkNMVURFIgorICAgIGZpCisKK0tCVUlMRF9FWFRNT0QgaXMgc2V0IHdoZW4gYW4gZXhwbGljaXQgdGFyZ2V0IHdpdGggTT0gaXMgdXNlZC4gRm9yIGJvdGggY2FzZXMKK3RoZSBzcGF0Y2ggLS1kaXIgYXJndW1lbnQgaXMgdXNlZCwgYXMgc3VjaCB0aGlyZCBydWxlIGFwcGxpZXMgd2hlbiB3aGV0aGVyIE09CitpcyB1c2VkIG9yIG5vdCwgYW5kIHdoZW4gTT0gaXMgdXNlZCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBjYW4gaGF2ZSBpdHMgb3duCisuY29jY2ljb25maWcgZmlsZS4gV2hlbiBNPSBpcyBub3QgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIGNvY2NpY2hlY2sgdGhlCit0YXJnZXQgZGlyZWN0b3J5IGlzIHRoZSBzYW1lIGFzIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGVyZSBzcGF0Y2ggd2FzIGNhbGxlZC4KKworSWYgbm90IHVzaW5nIHRoZSBrZXJuZWwncyBjb2NjaWNoZWNrIHRhcmdldCwga2VlcCB0aGUgYWJvdmUgcHJlY2VkZW5jZQorb3JkZXIgbG9naWMgb2YgLmNvY2NpY29uZmlnIHJlYWRpbmcuIElmIHVzaW5nIHRoZSBrZXJuZWwncyBjb2NjaWNoZWNrIHRhcmdldCwKK292ZXJyaWRlIGFueSBvZiB0aGUga2VybmVsJ3MgLmNvY2NpY2hlY2sncyBzZXR0aW5ncyB1c2luZyBTUEZMQUdTLgorCitXZSBoZWxwIENvY2NpbmVsbGUgd2hlbiB1c2VkIGFnYWluc3QgTGludXggd2l0aCBhIHNldCBvZiBzZW5zaWJsZSBkZWZhdWx0cworb3B0aW9ucyBmb3IgTGludXggd2l0aCBvdXIgb3duIExpbnV4IC5jb2NjaWNvbmZpZy4gVGhpcyBoaW50cyB0byBjb2NjaW5lbGxlCitnaXQgY2FuIGJlIHVzZWQgZm9yIGBgZ2l0IGdyZXBgYCBxdWVyaWVzIG92ZXIgY29jY2lncmVwLiBBIHRpbWVvdXQgb2YgMjAwCitzZWNvbmRzIHNob3VsZCBzdWZmaWNlIGZvciBub3cuCisKK1RoZSBvcHRpb25zIHBpY2tlZCB1cCBieSBjb2NjaW5lbGxlIHdoZW4gcmVhZGluZyBhIC5jb2NjaWNvbmZpZyBkbyBub3QgYXBwZWFyCithcyBhcmd1bWVudHMgdG8gc3BhdGNoIHByb2Nlc3NlcyBydW5uaW5nIG9uIHlvdXIgc3lzdGVtLCB0byBjb25maXJtIHdoYXQKK29wdGlvbnMgd2lsbCBiZSB1c2VkIGJ5IENvY2NpbmVsbGUgcnVuOjoKKworICAgICAgc3BhdGNoIC0tcHJpbnQtb3B0aW9ucy1vbmx5CisKK1lvdSBjYW4gb3ZlcnJpZGUgd2l0aCB5b3VyIG93biBwcmVmZXJyZWQgaW5kZXggb3B0aW9uIGJ5IHVzaW5nIFNQRkxBR1MuIFRha2UKK25vdGUgdGhhdCB3aGVuIHRoZXJlIGFyZSBjb25mbGljdGluZyBvcHRpb25zIENvY2NpbmVsbGUgdGFrZXMgcHJlY2VkZW5jZSBmb3IKK3RoZSBsYXN0IG9wdGlvbnMgcGFzc2VkLiBVc2luZyAuY29jY2ljb25maWcgaXMgcG9zc2libGUgdG8gdXNlIGlkdXRpbHMsIGhvd2V2ZXIKK2dpdmVuIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGZvbGxvd2VkIGJ5IENvY2NpbmVsbGUsIHNpbmNlIHRoZSBrZXJuZWwgbm93CitjYXJyaWVzIGl0cyBvd24gLmNvY2NpY29uZmlnLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBTUEZMQUdTIHRvIHVzZSBpZHV0aWxzIGlmCitkZXNpcmVkLiBTZWUgYmVsb3cgc2VjdGlvbiAiQWRkaXRpb25hbCBmbGFncyIgZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gdXNlCitpZHV0aWxzLgorCitBZGRpdGlvbmFsIGZsYWdzCistLS0tLS0tLS0tLS0tLS0tCisKK0FkZGl0aW9uYWwgZmxhZ3MgY2FuIGJlIHBhc3NlZCB0byBzcGF0Y2ggdGhyb3VnaCB0aGUgU1BGTEFHUwordmFyaWFibGUuIFRoaXMgd29ya3MgYXMgQ29jY2luZWxsZSByZXNwZWN0cyB0aGUgbGFzdCBmbGFncworZ2l2ZW4gdG8gaXQgd2hlbiBvcHRpb25zIGFyZSBpbiBjb25mbGljdC4gOjoKKworICAgIG1ha2UgU1BGTEFHUz0tLXVzZS1nbGltcHNlIGNvY2NpY2hlY2sKKworQ29jY2luZWxsZSBzdXBwb3J0cyBpZHV0aWxzIGFzIHdlbGwgYnV0IHJlcXVpcmVzIGNvY2NpbmVsbGUgPj0gMS4wLjYuCitXaGVuIG5vIElEIGZpbGUgaXMgc3BlY2lmaWVkIGNvY2NpbmVsbGUgYXNzdW1lcyB5b3VyIElEIGRhdGFiYXNlIGZpbGUKK2lzIGluIHRoZSBmaWxlIC5pZC11dGlscy5pbmRleCBvbiB0aGUgdG9wIGxldmVsIG9mIHRoZSBrZXJuZWwsIGNvY2NpbmVsbGUKK2NhcnJpZXMgYSBzY3JpcHQgc2NyaXB0cy9pZHV0aWxzX2luZGV4LnNoIHdoaWNoIGNyZWF0ZXMgdGhlIGRhdGFiYXNlIHdpdGg6OgorCisgICAgbWtpZCAtaSBDIC0tb3V0cHV0IC5pZC11dGlscy5pbmRleAorCitJZiB5b3UgaGF2ZSBhbm90aGVyIGRhdGFiYXNlIGZpbGVuYW1lIHlvdSBjYW4gYWxzbyBqdXN0IHN5bWxpbmsgd2l0aCB0aGlzCituYW1lLiA6OgorCisgICAgbWFrZSBTUEZMQUdTPS0tdXNlLWlkdXRpbHMgY29jY2ljaGVjaworCitBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gc3BlY2lmeSB0aGUgZGF0YWJhc2UgZmlsZW5hbWUgZXhwbGljaXRseSwgZm9yCitpbnN0YW5jZTo6CisKKyAgICBtYWtlIFNQRkxBR1M9Ii0tdXNlLWlkdXRpbHMgL2Z1bGwtcGF0aC90by9JRCIgY29jY2ljaGVjaworCitTZWUgYGBzcGF0Y2ggLS1oZWxwYGAgdG8gbGVhcm4gbW9yZSBhYm91dCBzcGF0Y2ggb3B0aW9ucy4KKworTm90ZSB0aGF0IHRoZSBgYC0tdXNlLWdsaW1wc2VgYCBhbmQgYGAtLXVzZS1pZHV0aWxzYGAgb3B0aW9ucworcmVxdWlyZSBleHRlcm5hbCB0b29scyBmb3IgaW5kZXhpbmcgdGhlIGNvZGUuIE5vbmUgb2YgdGhlbSBpcwordGh1cyBhY3RpdmUgYnkgZGVmYXVsdC4gSG93ZXZlciwgYnkgaW5kZXhpbmcgdGhlIGNvZGUgd2l0aAorb25lIG9mIHRoZXNlIHRvb2xzLCBhbmQgYWNjb3JkaW5nIHRvIHRoZSBjb2NjaSBmaWxlIHVzZWQsCitzcGF0Y2ggY291bGQgcHJvY2VlZCB0aGUgZW50aXJlIGNvZGUgYmFzZSBtb3JlIHF1aWNrbHkuCisKK1NtUEwgcGF0Y2ggc3BlY2lmaWMgb3B0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NtUEwgcGF0Y2hlcyBjYW4gaGF2ZSB0aGVpciBvd24gcmVxdWlyZW1lbnRzIGZvciBvcHRpb25zIHBhc3NlZAordG8gQ29jY2luZWxsZS4gU21QTCBwYXRjaCBzcGVjaWZpYyBvcHRpb25zIGNhbiBiZSBwcm92aWRlZCBieQorcHJvdmlkaW5nIHRoZW0gYXQgdGhlIHRvcCBvZiB0aGUgU21QTCBwYXRjaCwgZm9yIGluc3RhbmNlOjoKKworCS8vIE9wdGlvbnM6IC0tbm8taW5jbHVkZXMgLS1pbmNsdWRlLWhlYWRlcnMKKworU21QTCBwYXRjaCBDb2NjaW5lbGxlIHJlcXVpcmVtZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcyBDb2NjaW5lbGxlIGZlYXR1cmVzIGdldCBhZGRlZCBzb21lIG1vcmUgYWR2YW5jZWQgU21QTCBwYXRjaGVzCittYXkgcmVxdWlyZSBuZXdlciB2ZXJzaW9ucyBvZiBDb2NjaW5lbGxlLiBJZiBhbiBTbVBMIHBhdGNoIHJlcXVpcmVzCithdCBsZWFzdCBhIHZlcnNpb24gb2YgQ29jY2luZWxsZSwgdGhpcyBjYW4gYmUgc3BlY2lmaWVkIGFzIGZvbGxvd3MsCithcyBhbiBleGFtcGxlIGlmIHJlcXVpcmluZyBhdCBsZWFzdCBDb2NjaW5lbGxlID49IDEuMC41OjoKKworCS8vIFJlcXVpcmVzOiAxLjAuNQorCitQcm9wb3NpbmcgbmV3IHNlbWFudGljIHBhdGNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmV3IHNlbWFudGljIHBhdGNoZXMgY2FuIGJlIHByb3Bvc2VkIGFuZCBzdWJtaXR0ZWQgYnkga2VybmVsCitkZXZlbG9wZXJzLiBGb3Igc2FrZSBvZiBjbGFyaXR5LCB0aGV5IHNob3VsZCBiZSBvcmdhbml6ZWQgaW4gdGhlCitzdWItZGlyZWN0b3JpZXMgb2YgYGBzY3JpcHRzL2NvY2NpbmVsbGUvYGAuCisKKworRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGBgcmVwb3J0YGAgbW9kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitgYHJlcG9ydGBgIGdlbmVyYXRlcyBhIGxpc3QgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6OgorCisgIGZpbGU6bGluZTpjb2x1bW4tY29sdW1uOiBtZXNzYWdlCisKK0V4YW1wbGUKK35+fn5+fn4KKworUnVubmluZzo6CisKKwltYWtlIGNvY2NpY2hlY2sgTU9ERT1yZXBvcnQgQ09DQ0k9c2NyaXB0cy9jb2NjaW5lbGxlL2FwaS9lcnJfY2FzdC5jb2NjaQorCit3aWxsIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBwYXJ0IG9mIHRoZSBTbVBMIHNjcmlwdDo6CisKKyAgIDxzbXBsPgorICAgQHIgZGVwZW5kcyBvbiAhY29udGV4dCAmJiAhcGF0Y2ggJiYgKG9yZyB8fCByZXBvcnQpQAorICAgZXhwcmVzc2lvbiB4OworICAgcG9zaXRpb24gcDsKKyAgIEBACisKKyAgICAgRVJSX1BUUkBwKFBUUl9FUlIoeCkpCisKKyAgIEBzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gcmVwb3J0QAorICAgcCA8PCByLnA7CisgICB4IDw8IHIueDsKKyAgIEBACisKKyAgIG1zZz0iRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCAlcyIgJSAoeCkKKyAgIGNvY2NpbGliLnJlcG9ydC5wcmludF9yZXBvcnQocFswXSwgbXNnKQorICAgPC9zbXBsPgorCitUaGlzIFNtUEwgZXhjZXJwdCBnZW5lcmF0ZXMgZW50cmllcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcworaWxsdXN0cmF0ZWQgYmVsb3c6OgorCisgICAgL2hvbWUvdXNlci9saW51eC9jcnlwdG8vY3RyLmM6MTg4OjktMTY6IEVSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYWxnCisgICAgL2hvbWUvdXNlci9saW51eC9jcnlwdG8vYXV0aGVuYy5jOjYxOTo5LTE2OiBFUlJfQ0FTVCBjYW4gYmUgdXNlZCB3aXRoIGF1dGgKKyAgICAvaG9tZS91c2VyL2xpbnV4L2NyeXB0by94dHMuYzoyMjc6OS0xNjogRVJSX0NBU1QgY2FuIGJlIHVzZWQgd2l0aCBhbGcKKworCitEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYGBwYXRjaGBgIG1vZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIHRoZSBgYHBhdGNoYGAgbW9kZSBpcyBhdmFpbGFibGUsIGl0IHByb3Bvc2VzIGEgZml4IGZvciBlYWNoIHByb2JsZW0KK2lkZW50aWZpZWQuCisKK0V4YW1wbGUKK35+fn5+fn4KKworUnVubmluZzo6CisKKwltYWtlIGNvY2NpY2hlY2sgTU9ERT1wYXRjaCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvYXBpL2Vycl9jYXN0LmNvY2NpCisKK3dpbGwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgdGhlIFNtUEwgc2NyaXB0OjoKKworICAgIDxzbXBsPgorICAgIEAgZGVwZW5kcyBvbiAhY29udGV4dCAmJiBwYXRjaCAmJiAhb3JnICYmICFyZXBvcnQgQAorICAgIGV4cHJlc3Npb24geDsKKyAgICBAQAorCisgICAgLSBFUlJfUFRSKFBUUl9FUlIoeCkpCisgICAgKyBFUlJfQ0FTVCh4KQorICAgIDwvc21wbD4KKworVGhpcyBTbVBMIGV4Y2VycHQgZ2VuZXJhdGVzIHBhdGNoIGh1bmtzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGFzCitpbGx1c3RyYXRlZCBiZWxvdzo6CisKKyAgICBkaWZmIC11IC1wIGEvY3J5cHRvL2N0ci5jIGIvY3J5cHRvL2N0ci5jCisgICAgLS0tIGEvY3J5cHRvL2N0ci5jIDIwMTAtMDUtMjYgMTA6NDk6MzguMDAwMDAwMDAwICswMjAwCisgICAgKysrIGIvY3J5cHRvL2N0ci5jIDIwMTAtMDYtMDMgMjM6NDQ6NDkuMDAwMDAwMDAwICswMjAwCisgICAgQEAgLTE4NSw3ICsxODUsNyBAQCBzdGF0aWMgc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqY3J5cHRvX2N0CisgCWFsZyA9IGNyeXB0b19hdHRyX2FsZyh0YlsxXSwgQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKyAJCQkJICBDUllQVE9fQUxHX1RZUEVfTUFTSyk7CisgCWlmIChJU19FUlIoYWxnKSkKKyAgICAtCQlyZXR1cm4gRVJSX1BUUihQVFJfRVJSKGFsZykpOworICAgICsJCXJldHVybiBFUlJfQ0FTVChhbGcpOworCisgCS8qIEJsb2NrIHNpemUgbXVzdCBiZSA+PSA0IGJ5dGVzLiAqLworIAllcnIgPSAtRUlOVkFMOworCitEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgYGBjb250ZXh0YGAgbW9kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYGBjb250ZXh0YGAgaGlnaGxpZ2h0cyBsaW5lcyBvZiBpbnRlcmVzdCBhbmQgdGhlaXIgY29udGV4dAoraW4gYSBkaWZmLWxpa2Ugc3R5bGUuCisKKyAgICAgICoqTk9URSoqOiBUaGUgZGlmZi1saWtlIG91dHB1dCBnZW5lcmF0ZWQgaXMgTk9UIGFuIGFwcGxpY2FibGUgcGF0Y2guIFRoZQorICAgICAgaW50ZW50IG9mIHRoZSBgYGNvbnRleHRgYCBtb2RlIGlzIHRvIGhpZ2hsaWdodCB0aGUgaW1wb3J0YW50IGxpbmVzCisgICAgICAoYW5ub3RhdGVkIHdpdGggbWludXMsIGBgLWBgKSBhbmQgZ2l2ZXMgc29tZSBzdXJyb3VuZGluZyBjb250ZXh0CisgICAgICBsaW5lcyBhcm91bmQuIFRoaXMgb3V0cHV0IGNhbiBiZSB1c2VkIHdpdGggdGhlIGRpZmYgbW9kZSBvZgorICAgICAgRW1hY3MgdG8gcmV2aWV3IHRoZSBjb2RlLgorCitFeGFtcGxlCit+fn5+fn5+CisKK1J1bm5pbmc6OgorCisJbWFrZSBjb2NjaWNoZWNrIE1PREU9Y29udGV4dCBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvYXBpL2Vycl9jYXN0LmNvY2NpCisKK3dpbGwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgdGhlIFNtUEwgc2NyaXB0OjoKKworICAgIDxzbXBsPgorICAgIEAgZGVwZW5kcyBvbiBjb250ZXh0ICYmICFwYXRjaCAmJiAhb3JnICYmICFyZXBvcnRACisgICAgZXhwcmVzc2lvbiB4OworICAgIEBACisKKyAgICAqIEVSUl9QVFIoUFRSX0VSUih4KSkKKyAgICA8L3NtcGw+CisKK1RoaXMgU21QTCBleGNlcnB0IGdlbmVyYXRlcyBkaWZmIGh1bmtzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQsIGFzCitpbGx1c3RyYXRlZCBiZWxvdzo6CisKKyAgICBkaWZmIC11IC1wIC9ob21lL3VzZXIvbGludXgvY3J5cHRvL2N0ci5jIC90bXAvbm90aGluZworICAgIC0tLSAvaG9tZS91c2VyL2xpbnV4L2NyeXB0by9jdHIuYwkyMDEwLTA1LTI2IDEwOjQ5OjM4LjAwMDAwMDAwMCArMDIwMAorICAgICsrKyAvdG1wL25vdGhpbmcKKyAgICBAQCAtMTg1LDcgKzE4NSw2IEBAIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICpjcnlwdG9fY3QKKyAJYWxnID0gY3J5cHRvX2F0dHJfYWxnKHRiWzFdLCBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSLAorIAkJCQkgIENSWVBUT19BTEdfVFlQRV9NQVNLKTsKKyAJaWYgKElTX0VSUihhbGcpKQorICAgIC0JCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYWxnKSk7CisKKyAJLyogQmxvY2sgc2l6ZSBtdXN0IGJlID49IDQgYnl0ZXMuICovCisgCWVyciA9IC1FSU5WQUw7CisKK0RldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBgYG9yZ2BgIG1vZGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYGBvcmdgYCBnZW5lcmF0ZXMgYSByZXBvcnQgaW4gdGhlIE9yZyBtb2RlIGZvcm1hdCBvZiBFbWFjcy4KKworRXhhbXBsZQorfn5+fn5+fgorCitSdW5uaW5nOjoKKworCW1ha2UgY29jY2ljaGVjayBNT0RFPW9yZyBDT0NDST1zY3JpcHRzL2NvY2NpbmVsbGUvYXBpL2Vycl9jYXN0LmNvY2NpCisKK3dpbGwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHBhcnQgb2YgdGhlIFNtUEwgc2NyaXB0OjoKKworICAgIDxzbXBsPgorICAgIEByIGRlcGVuZHMgb24gIWNvbnRleHQgJiYgIXBhdGNoICYmIChvcmcgfHwgcmVwb3J0KUAKKyAgICBleHByZXNzaW9uIHg7CisgICAgcG9zaXRpb24gcDsKKyAgICBAQAorCisgICAgICBFUlJfUFRSQHAoUFRSX0VSUih4KSkKKworICAgIEBzY3JpcHQ6cHl0aG9uIGRlcGVuZHMgb24gb3JnQAorICAgIHAgPDwgci5wOworICAgIHggPDwgci54OworICAgIEBACisKKyAgICBtc2c9IkVSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggJXMiICUgKHgpCisgICAgbXNnX3NhZmU9bXNnLnJlcGxhY2UoIlsiLCJAKCIpLnJlcGxhY2UoIl0iLCIpIikKKyAgICBjb2NjaWxpYi5vcmcucHJpbnRfdG9kbyhwWzBdLCBtc2dfc2FmZSkKKyAgICA8L3NtcGw+CisKK1RoaXMgU21QTCBleGNlcnB0IGdlbmVyYXRlcyBPcmcgZW50cmllcyBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LCBhcworaWxsdXN0cmF0ZWQgYmVsb3c6OgorCisgICAgKiBUT0RPIFtbdmlldzovaG9tZS91c2VyL2xpbnV4L2NyeXB0by9jdHIuYzo6ZmFjZT1vdmwtZmFjZTE6OmxpbmI9MTg4Ojpjb2xiPTk6OmNvbGU9MTZdW0VSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYWxnXV0KKyAgICAqIFRPRE8gW1t2aWV3Oi9ob21lL3VzZXIvbGludXgvY3J5cHRvL2F1dGhlbmMuYzo6ZmFjZT1vdmwtZmFjZTE6OmxpbmI9NjE5Ojpjb2xiPTk6OmNvbGU9MTZdW0VSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYXV0aF1dCisgICAgKiBUT0RPIFtbdmlldzovaG9tZS91c2VyL2xpbnV4L2NyeXB0by94dHMuYzo6ZmFjZT1vdmwtZmFjZTE6OmxpbmI9MjI3Ojpjb2xiPTk6OmNvbGU9MTZdW0VSUl9DQVNUIGNhbiBiZSB1c2VkIHdpdGggYWxnXV0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2djb3YucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvZ2Nvdi5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllZWRmZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2djb3YucnN0CkBAIC0wLDAgKzEsMjU2IEBACitVc2luZyBnY292IHdpdGggdGhlIExpbnV4IGtlcm5lbAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZ2NvdiBwcm9maWxpbmcga2VybmVsIHN1cHBvcnQgZW5hYmxlcyB0aGUgdXNlIG9mIEdDQydzIGNvdmVyYWdlIHRlc3RpbmcKK3Rvb2wgZ2Nvdl8gd2l0aCB0aGUgTGludXgga2VybmVsLiBDb3ZlcmFnZSBkYXRhIG9mIGEgcnVubmluZyBrZXJuZWwKK2lzIGV4cG9ydGVkIGluIGdjb3YtY29tcGF0aWJsZSBmb3JtYXQgdmlhIHRoZSAiZ2NvdiIgZGVidWdmcyBkaXJlY3RvcnkuCitUbyBnZXQgY292ZXJhZ2UgZGF0YSBmb3IgYSBzcGVjaWZpYyBmaWxlLCBjaGFuZ2UgdG8gdGhlIGtlcm5lbCBidWlsZAorZGlyZWN0b3J5IGFuZCB1c2UgZ2NvdiB3aXRoIHRoZSBgYC1vYGAgb3B0aW9uIGFzIGZvbGxvd3MgKHJlcXVpcmVzIHJvb3QpOjoKKworICAgICMgY2QgL3RtcC9saW51eC1vdXQKKyAgICAjIGdjb3YgLW8gL3N5cy9rZXJuZWwvZGVidWcvZ2Nvdi90bXAvbGludXgtb3V0L2tlcm5lbCBzcGlubG9jay5jCisKK1RoaXMgd2lsbCBjcmVhdGUgc291cmNlIGNvZGUgZmlsZXMgYW5ub3RhdGVkIHdpdGggZXhlY3V0aW9uIGNvdW50cworaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiBJbiBhZGRpdGlvbiwgZ3JhcGhpY2FsIGdjb3YgZnJvbnQtZW5kcyBzdWNoCithcyBsY292XyBjYW4gYmUgdXNlZCB0byBhdXRvbWF0ZSB0aGUgcHJvY2VzcyBvZiBjb2xsZWN0aW5nIGRhdGEKK2ZvciB0aGUgZW50aXJlIGtlcm5lbCBhbmQgcHJvdmlkZSBjb3ZlcmFnZSBvdmVydmlld3MgaW4gSFRNTCBmb3JtYXQuCisKK1Bvc3NpYmxlIHVzZXM6CisKKyogZGVidWdnaW5nIChoYXMgdGhpcyBsaW5lIGJlZW4gcmVhY2hlZCBhdCBhbGw/KQorKiB0ZXN0IGltcHJvdmVtZW50IChob3cgZG8gSSBjaGFuZ2UgbXkgdGVzdCB0byBjb3ZlciB0aGVzZSBsaW5lcz8pCisqIG1pbmltaXppbmcga2VybmVsIGNvbmZpZ3VyYXRpb25zIChkbyBJIG5lZWQgdGhpcyBvcHRpb24gaWYgdGhlCisgIGFzc29jaWF0ZWQgY29kZSBpcyBuZXZlciBydW4/KQorCisuLiBfZ2NvdjogaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0djb3YuaHRtbAorLi4gX2xjb3Y6IGh0dHA6Ly9sdHAuc291cmNlZm9yZ2UubmV0L2NvdmVyYWdlL2xjb3YucGhwCisKKworUHJlcGFyYXRpb24KKy0tLS0tLS0tLS0tCisKK0NvbmZpZ3VyZSB0aGUga2VybmVsIHdpdGg6OgorCisgICAgICAgIENPTkZJR19ERUJVR19GUz15CisgICAgICAgIENPTkZJR19HQ09WX0tFUk5FTD15CisKK3NlbGVjdCB0aGUgZ2NjJ3MgZ2NvdiBmb3JtYXQsIGRlZmF1bHQgaXMgYXV0b2RldGVjdCBiYXNlZCBvbiBnY2MgdmVyc2lvbjo6CisKKyAgICAgICAgQ09ORklHX0dDT1ZfRk9STUFUX0FVVE9ERVRFQ1Q9eQorCithbmQgdG8gZ2V0IGNvdmVyYWdlIGRhdGEgZm9yIHRoZSBlbnRpcmUga2VybmVsOjoKKworICAgICAgICBDT05GSUdfR0NPVl9QUk9GSUxFX0FMTD15CisKK05vdGUgdGhhdCBrZXJuZWxzIGNvbXBpbGVkIHdpdGggcHJvZmlsaW5nIGZsYWdzIHdpbGwgYmUgc2lnbmlmaWNhbnRseQorbGFyZ2VyIGFuZCBydW4gc2xvd2VyLiBBbHNvIENPTkZJR19HQ09WX1BST0ZJTEVfQUxMIG1heSBub3QgYmUgc3VwcG9ydGVkCitvbiBhbGwgYXJjaGl0ZWN0dXJlcy4KKworUHJvZmlsaW5nIGRhdGEgd2lsbCBvbmx5IGJlY29tZSBhY2Nlc3NpYmxlIG9uY2UgZGVidWdmcyBoYXMgYmVlbgorbW91bnRlZDo6CisKKyAgICAgICAgbW91bnQgLXQgZGVidWdmcyBub25lIC9zeXMva2VybmVsL2RlYnVnCisKKworQ3VzdG9taXphdGlvbgorLS0tLS0tLS0tLS0tLQorCitUbyBlbmFibGUgcHJvZmlsaW5nIGZvciBzcGVjaWZpYyBmaWxlcyBvciBkaXJlY3RvcmllcywgYWRkIGEgbGluZQorc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIHRvIHRoZSByZXNwZWN0aXZlIGtlcm5lbCBNYWtlZmlsZToKKworLSBGb3IgYSBzaW5nbGUgZmlsZSAoZS5nLiBtYWluLm8pOjoKKworCUdDT1ZfUFJPRklMRV9tYWluLm8gOj0geQorCistIEZvciBhbGwgZmlsZXMgaW4gb25lIGRpcmVjdG9yeTo6CisKKwlHQ09WX1BST0ZJTEUgOj0geQorCitUbyBleGNsdWRlIGZpbGVzIGZyb20gYmVpbmcgcHJvZmlsZWQgZXZlbiB3aGVuIENPTkZJR19HQ09WX1BST0ZJTEVfQUxMCitpcyBzcGVjaWZpZWQsIHVzZTo6CisKKwlHQ09WX1BST0ZJTEVfbWFpbi5vIDo9IG4KKworYW5kOjoKKworCUdDT1ZfUFJPRklMRSA6PSBuCisKK09ubHkgZmlsZXMgd2hpY2ggYXJlIGxpbmtlZCB0byB0aGUgbWFpbiBrZXJuZWwgaW1hZ2Ugb3IgYXJlIGNvbXBpbGVkIGFzCitrZXJuZWwgbW9kdWxlcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgbWVjaGFuaXNtLgorCisKK0ZpbGVzCistLS0tLQorCitUaGUgZ2NvdiBrZXJuZWwgc3VwcG9ydCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgZmlsZXMgaW4gZGVidWdmczoKKworYGAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292YGAKKwlQYXJlbnQgZGlyZWN0b3J5IGZvciBhbGwgZ2Nvdi1yZWxhdGVkIGZpbGVzLgorCitgYC9zeXMva2VybmVsL2RlYnVnL2djb3YvcmVzZXRgYAorCUdsb2JhbCByZXNldCBmaWxlOiByZXNldHMgYWxsIGNvdmVyYWdlIGRhdGEgdG8gemVybyB3aGVuCisgICAgICAgIHdyaXR0ZW4gdG8uCisKK2BgL3N5cy9rZXJuZWwvZGVidWcvZ2Nvdi9wYXRoL3RvL2NvbXBpbGUvZGlyL2ZpbGUuZ2NkYWBgCisJVGhlIGFjdHVhbCBnY292IGRhdGEgZmlsZSBhcyB1bmRlcnN0b29kIGJ5IHRoZSBnY292CisgICAgICAgIHRvb2wuIFJlc2V0cyBmaWxlIGNvdmVyYWdlIGRhdGEgdG8gemVybyB3aGVuIHdyaXR0ZW4gdG8uCisKK2BgL3N5cy9rZXJuZWwvZGVidWcvZ2Nvdi9wYXRoL3RvL2NvbXBpbGUvZGlyL2ZpbGUuZ2Nub2BgCisJU3ltYm9saWMgbGluayB0byBhIHN0YXRpYyBkYXRhIGZpbGUgcmVxdWlyZWQgYnkgdGhlIGdjb3YKKyAgICAgICAgdG9vbC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBnY2Mgd2hlbiBjb21waWxpbmcgd2l0aAorICAgICAgICBvcHRpb24gYGAtZnRlc3QtY292ZXJhZ2VgYC4KKworCitNb2R1bGVzCistLS0tLS0tCisKK0tlcm5lbCBtb2R1bGVzIG1heSBjb250YWluIGNsZWFudXAgY29kZSB3aGljaCBpcyBvbmx5IHJ1biBkdXJpbmcKK21vZHVsZSB1bmxvYWQgdGltZS4gVGhlIGdjb3YgbWVjaGFuaXNtIHByb3ZpZGVzIGEgbWVhbnMgdG8gY29sbGVjdAorY292ZXJhZ2UgZGF0YSBmb3Igc3VjaCBjb2RlIGJ5IGtlZXBpbmcgYSBjb3B5IG9mIHRoZSBkYXRhIGFzc29jaWF0ZWQKK3dpdGggdGhlIHVubG9hZGVkIG1vZHVsZS4gVGhpcyBkYXRhIHJlbWFpbnMgYXZhaWxhYmxlIHRocm91Z2ggZGVidWdmcy4KK09uY2UgdGhlIG1vZHVsZSBpcyBsb2FkZWQgYWdhaW4sIHRoZSBhc3NvY2lhdGVkIGNvdmVyYWdlIGNvdW50ZXJzIGFyZQoraW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGF0YSBmcm9tIGl0cyBwcmV2aW91cyBpbnN0YW50aWF0aW9uLgorCitUaGlzIGJlaGF2aW9yIGNhbiBiZSBkZWFjdGl2YXRlZCBieSBzcGVjaWZ5aW5nIHRoZSBnY292X3BlcnNpc3Qga2VybmVsCitwYXJhbWV0ZXI6OgorCisgICAgICAgIGdjb3ZfcGVyc2lzdD0wCisKK0F0IHJ1bi10aW1lLCBhIHVzZXIgY2FuIGFsc28gY2hvb3NlIHRvIGRpc2NhcmQgZGF0YSBmb3IgYW4gdW5sb2FkZWQKK21vZHVsZSBieSB3cml0aW5nIHRvIGl0cyBkYXRhIGZpbGUgb3IgdGhlIGdsb2JhbCByZXNldCBmaWxlLgorCisKK1NlcGFyYXRlZCBidWlsZCBhbmQgdGVzdCBtYWNoaW5lcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBnY292IGtlcm5lbCBwcm9maWxpbmcgaW5mcmFzdHJ1Y3R1cmUgaXMgZGVzaWduZWQgdG8gd29yayBvdXQtb2YtdGhlCitib3ggZm9yIHNldHVwcyB3aGVyZSBrZXJuZWxzIGFyZSBidWlsdCBhbmQgcnVuIG9uIHRoZSBzYW1lIG1hY2hpbmUuIEluCitjYXNlcyB3aGVyZSB0aGUga2VybmVsIHJ1bnMgb24gYSBzZXBhcmF0ZSBtYWNoaW5lLCBzcGVjaWFsIHByZXBhcmF0aW9ucworbXVzdCBiZSBtYWRlLCBkZXBlbmRpbmcgb24gd2hlcmUgdGhlIGdjb3YgdG9vbCBpcyB1c2VkOgorCithKSBnY292IGlzIHJ1biBvbiB0aGUgVEVTVCBtYWNoaW5lCisKKyAgICBUaGUgZ2NvdiB0b29sIHZlcnNpb24gb24gdGhlIHRlc3QgbWFjaGluZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICBnY2MgdmVyc2lvbiB1c2VkIGZvciBrZXJuZWwgYnVpbGQuIEFsc28gdGhlIGZvbGxvd2luZyBmaWxlcyBuZWVkIHRvIGJlCisgICAgY29waWVkIGZyb20gYnVpbGQgdG8gdGVzdCBtYWNoaW5lOgorCisgICAgZnJvbSB0aGUgc291cmNlIHRyZWU6CisgICAgICAtIGFsbCBDIHNvdXJjZSBmaWxlcyArIGhlYWRlcnMKKworICAgIGZyb20gdGhlIGJ1aWxkIHRyZWU6CisgICAgICAtIGFsbCBDIHNvdXJjZSBmaWxlcyArIGhlYWRlcnMKKyAgICAgIC0gYWxsIC5nY2RhIGFuZCAuZ2NubyBmaWxlcworICAgICAgLSBhbGwgbGlua3MgdG8gZGlyZWN0b3JpZXMKKworICAgIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlc2UgZmlsZXMgbmVlZCB0byBiZSBwbGFjZWQgaW50byB0aGUKKyAgICBleGFjdCBzYW1lIGZpbGUgc3lzdGVtIGxvY2F0aW9uIG9uIHRoZSB0ZXN0IG1hY2hpbmUgYXMgb24gdGhlIGJ1aWxkCisgICAgbWFjaGluZS4gSWYgYW55IG9mIHRoZSBwYXRoIGNvbXBvbmVudHMgaXMgc3ltYm9saWMgbGluaywgdGhlIGFjdHVhbAorICAgIGRpcmVjdG9yeSBuZWVkcyB0byBiZSB1c2VkIGluc3RlYWQgKGR1ZSB0byBtYWtlJ3MgQ1VSRElSIGhhbmRsaW5nKS4KKworYikgZ2NvdiBpcyBydW4gb24gdGhlIEJVSUxEIG1hY2hpbmUKKworICAgIFRoZSBmb2xsb3dpbmcgZmlsZXMgbmVlZCB0byBiZSBjb3BpZWQgYWZ0ZXIgZWFjaCB0ZXN0IGNhc2UgZnJvbSB0ZXN0CisgICAgdG8gYnVpbGQgbWFjaGluZToKKworICAgIGZyb20gdGhlIGdjb3YgZGlyZWN0b3J5IGluIHN5c2ZzOgorICAgICAgLSBhbGwgLmdjZGEgZmlsZXMKKyAgICAgIC0gYWxsIGxpbmtzIHRvIC5nY25vIGZpbGVzCisKKyAgICBUaGVzZSBmaWxlcyBjYW4gYmUgY29waWVkIHRvIGFueSBsb2NhdGlvbiBvbiB0aGUgYnVpbGQgbWFjaGluZS4gZ2NvdgorICAgIG11c3QgdGhlbiBiZSBjYWxsZWQgd2l0aCB0aGUgLW8gb3B0aW9uIHBvaW50aW5nIHRvIHRoYXQgZGlyZWN0b3J5LgorCisgICAgRXhhbXBsZSBkaXJlY3Rvcnkgc2V0dXAgb24gdGhlIGJ1aWxkIG1hY2hpbmU6OgorCisgICAgICAvdG1wL2xpbnV4OiAgICBrZXJuZWwgc291cmNlIHRyZWUKKyAgICAgIC90bXAvb3V0OiAgICAgIGtlcm5lbCBidWlsZCBkaXJlY3RvcnkgYXMgc3BlY2lmaWVkIGJ5IG1ha2UgTz0KKyAgICAgIC90bXAvY292ZXJhZ2U6IGxvY2F0aW9uIG9mIHRoZSBmaWxlcyBjb3BpZWQgZnJvbSB0aGUgdGVzdCBtYWNoaW5lCisKKyAgICAgIFt1c2VyQGJ1aWxkXSBjZCAvdG1wL291dAorICAgICAgW3VzZXJAYnVpbGRdIGdjb3YgLW8gL3RtcC9jb3ZlcmFnZS90bXAvb3V0L2luaXQgbWFpbi5jCisKKworVHJvdWJsZXNob290aW5nCistLS0tLS0tLS0tLS0tLS0KKworUHJvYmxlbQorICAgIENvbXBpbGF0aW9uIGFib3J0cyBkdXJpbmcgbGlua2VyIHN0ZXAuCisKK0NhdXNlCisgICAgUHJvZmlsaW5nIGZsYWdzIGFyZSBzcGVjaWZpZWQgZm9yIHNvdXJjZSBmaWxlcyB3aGljaCBhcmUgbm90CisgICAgbGlua2VkIHRvIHRoZSBtYWluIGtlcm5lbCBvciB3aGljaCBhcmUgbGlua2VkIGJ5IGEgY3VzdG9tCisgICAgbGlua2VyIHByb2NlZHVyZS4KKworU29sdXRpb24KKyAgICBFeGNsdWRlIGFmZmVjdGVkIHNvdXJjZSBmaWxlcyBmcm9tIHByb2ZpbGluZyBieSBzcGVjaWZ5aW5nCisgICAgYGBHQ09WX1BST0ZJTEUgOj0gbmBgIG9yIGBgR0NPVl9QUk9GSUxFX2Jhc2VuYW1lLm8gOj0gbmBgIGluIHRoZQorICAgIGNvcnJlc3BvbmRpbmcgTWFrZWZpbGUuCisKK1Byb2JsZW0KKyAgICBGaWxlcyBjb3BpZWQgZnJvbSBzeXNmcyBhcHBlYXIgZW1wdHkgb3IgaW5jb21wbGV0ZS4KKworQ2F1c2UKKyAgICBEdWUgdG8gdGhlIHdheSBzZXFfZmlsZSB3b3Jrcywgc29tZSB0b29scyBzdWNoIGFzIGNwIG9yIHRhcgorICAgIG1heSBub3QgY29ycmVjdGx5IGNvcHkgZmlsZXMgZnJvbSBzeXNmcy4KKworU29sdXRpb24KKyAgICBVc2UgYGBjYXRgYCcgdG8gcmVhZCBgYC5nY2RhYGAgZmlsZXMgYW5kIGBgY3AgLWRgYCB0byBjb3B5IGxpbmtzLgorICAgIEFsdGVybmF0aXZlbHkgdXNlIHRoZSBtZWNoYW5pc20gc2hvd24gaW4gQXBwZW5kaXggQi4KKworCitBcHBlbmRpeCBBOiBnYXRoZXJfb25fYnVpbGQuc2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitTYW1wbGUgc2NyaXB0IHRvIGdhdGhlciBjb3ZlcmFnZSBtZXRhIGZpbGVzIG9uIHRoZSBidWlsZCBtYWNoaW5lCisoc2VlIDZhKTo6CisKKyAgICAjIS9iaW4vYmFzaAorCisgICAgS1NSQz0kMQorICAgIEtPQko9JDIKKyAgICBERVNUPSQzCisKKyAgICBpZiBbIC16ICIkS1NSQyIgXSB8fCBbIC16ICIkS09CSiIgXSB8fCBbIC16ICIkREVTVCIgXTsgdGhlbgorICAgICAgZWNobyAiVXNhZ2U6ICQwIDxrc3JjIGRpcmVjdG9yeT4gPGtvYmogZGlyZWN0b3J5PiA8b3V0cHV0LnRhci5nej4iID4mMgorICAgICAgZXhpdCAxCisgICAgZmkKKworICAgIEtTUkM9JChjZCAkS1NSQzsgcHJpbnRmICJhbGw6XG5cdEBlY2hvIFwke0NVUkRJUn1cbiIgfCBtYWtlIC1mIC0pCisgICAgS09CSj0kKGNkICRLT0JKOyBwcmludGYgImFsbDpcblx0QGVjaG8gXCR7Q1VSRElSfVxuIiB8IG1ha2UgLWYgLSkKKworICAgIGZpbmQgJEtTUkMgJEtPQkogXCggLW5hbWUgJyouZ2NubycgLW8gLW5hbWUgJyouW2NoXScgLW8gLXR5cGUgbCBcKSAtYSBcCisgICAgICAgICAgICAgICAgICAgICAtcGVybSAvdStyLGcrciB8IHRhciBjZnogJERFU1QgLVAgLVQgLQorCisgICAgaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgorICAgICAgZWNobyAiJERFU1Qgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQsIGNvcHkgdG8gdGVzdCBzeXN0ZW0gYW5kIHVucGFjayB3aXRoOiIKKyAgICAgIGVjaG8gIiAgdGFyIHhmeiAkREVTVCAtUCIKKyAgICBlbHNlCisgICAgICBlY2hvICJDb3VsZCBub3QgY3JlYXRlIGZpbGUgJERFU1QiCisgICAgZmkKKworCitBcHBlbmRpeCBCOiBnYXRoZXJfb25fdGVzdC5zaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2FtcGxlIHNjcmlwdCB0byBnYXRoZXIgY292ZXJhZ2UgZGF0YSBmaWxlcyBvbiB0aGUgdGVzdCBtYWNoaW5lCisoc2VlIDZiKTo6CisKKyAgICAjIS9iaW4vYmFzaCAtZQorCisgICAgREVTVD0kMQorICAgIEdDREE9L3N5cy9rZXJuZWwvZGVidWcvZ2NvdgorCisgICAgaWYgWyAteiAiJERFU1QiIF0gOyB0aGVuCisgICAgICBlY2hvICJVc2FnZTogJDAgPG91dHB1dC50YXIuZ3o+IiA+JjIKKyAgICAgIGV4aXQgMQorICAgIGZpCisKKyAgICBURU1QRElSPSQobWt0ZW1wIC1kKQorICAgIGVjaG8gQ29sbGVjdGluZyBkYXRhLi4KKyAgICBmaW5kICRHQ0RBIC10eXBlIGQgLWV4ZWMgbWtkaXIgLXAgJFRFTVBESVIvXHtcfSBcOworICAgIGZpbmQgJEdDREEgLW5hbWUgJyouZ2NkYScgLWV4ZWMgc2ggLWMgJ2NhdCA8ICQwID4gJyRURU1QRElSJy8kMCcge30gXDsKKyAgICBmaW5kICRHQ0RBIC1uYW1lICcqLmdjbm8nIC1leGVjIHNoIC1jICdjcCAtZCAkMCAnJFRFTVBESVInLyQwJyB7fSBcOworICAgIHRhciBjemYgJERFU1QgLUMgJFRFTVBESVIgc3lzCisgICAgcm0gLXJmICRURU1QRElSCisKKyAgICBlY2hvICIkREVTVCBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgY29weSB0byBidWlsZCBzeXN0ZW0gYW5kIHVucGFjayB3aXRoOiIKKyAgICBlY2hvICIgIHRhciB4ZnogJERFU1QiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9nZGIta2VybmVsLWRlYnVnZ2luZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9nZGIta2VybmVsLWRlYnVnZ2luZy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5M2M5YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2dkYi1rZXJuZWwtZGVidWdnaW5nLnJzdApAQCAtMCwwICsxLDE3MyBAQAorLi4gaGlnaGxpZ2h0Ojogbm9uZQorCitEZWJ1Z2dpbmcga2VybmVsIGFuZCBtb2R1bGVzIHZpYSBnZGIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUga2VybmVsIGRlYnVnZ2VyIGtnZGIsIGh5cGVydmlzb3JzIGxpa2UgUUVNVSBvciBKVEFHLWJhc2VkIGhhcmR3YXJlCitpbnRlcmZhY2VzIGFsbG93IHRvIGRlYnVnIHRoZSBMaW51eCBrZXJuZWwgYW5kIGl0cyBtb2R1bGVzIGR1cmluZyBydW50aW1lCit1c2luZyBnZGIuIEdkYiBjb21lcyB3aXRoIGEgcG93ZXJmdWwgc2NyaXB0aW5nIGludGVyZmFjZSBmb3IgcHl0aG9uLiBUaGUKK2tlcm5lbCBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YgaGVscGVyIHNjcmlwdHMgdGhhdCBjYW4gc2ltcGxpZnkgdHlwaWNhbAora2VybmVsIGRlYnVnZ2luZyBzdGVwcy4gVGhpcyBpcyBhIHNob3J0IHR1dG9yaWFsIGFib3V0IGhvdyB0byBlbmFibGUgYW5kIHVzZQordGhlbS4gSXQgZm9jdXNlcyBvbiBRRU1VL0tWTSB2aXJ0dWFsIG1hY2hpbmVzIGFzIHRhcmdldCwgYnV0IHRoZSBleGFtcGxlcyBjYW4KK2JlIHRyYW5zZmVycmVkIHRvIHRoZSBvdGhlciBnZGIgc3R1YnMgYXMgd2VsbC4KKworCitSZXF1aXJlbWVudHMKKy0tLS0tLS0tLS0tLQorCistIGdkYiA3LjIrIChyZWNvbW1lbmRlZDogNy40Kykgd2l0aCBweXRob24gc3VwcG9ydCBlbmFibGVkICh0eXBpY2FsbHkgdHJ1ZQorICBmb3IgZGlzdHJpYnV0aW9ucykKKworCitTZXR1cAorLS0tLS0KKworLSBDcmVhdGUgYSB2aXJ0dWFsIExpbnV4IG1hY2hpbmUgZm9yIFFFTVUvS1ZNIChzZWUgd3d3LmxpbnV4LWt2bS5vcmcgYW5kCisgIHd3dy5xZW11Lm9yZyBmb3IgbW9yZSBkZXRhaWxzKS4gRm9yIGNyb3NzLWRldmVsb3BtZW50LAorICBodHRwOi8vbGFuZGxleS5uZXQvYWJvcmlnaW5hbC9iaW4ga2VlcHMgYSBwb29sIG9mIG1hY2hpbmUgaW1hZ2VzIGFuZAorICB0b29sY2hhaW5zIHRoYXQgY2FuIGJlIGhlbHBmdWwgdG8gc3RhcnQgZnJvbS4KKworLSBCdWlsZCB0aGUga2VybmVsIHdpdGggQ09ORklHX0dEQl9TQ1JJUFRTIGVuYWJsZWQsIGJ1dCBsZWF2ZQorICBDT05GSUdfREVCVUdfSU5GT19SRURVQ0VEIG9mZi4gSWYgeW91ciBhcmNoaXRlY3R1cmUgc3VwcG9ydHMKKyAgQ09ORklHX0ZSQU1FX1BPSU5URVIsIGtlZXAgaXQgZW5hYmxlZC4KKworLSBJbnN0YWxsIHRoYXQga2VybmVsIG9uIHRoZSBndWVzdC4KKyAgQWx0ZXJuYXRpdmVseSwgUUVNVSBhbGxvd3MgdG8gYm9vdCB0aGUga2VybmVsIGRpcmVjdGx5IHVzaW5nIC1rZXJuZWwsCisgIC1hcHBlbmQsIC1pbml0cmQgY29tbWFuZCBsaW5lIHN3aXRjaGVzLiBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCBpZgorICB5b3UgZG8gbm90IGRlcGVuZCBvbiBtb2R1bGVzLiBTZWUgUUVNVSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24KKyAgdGhpcyBtb2RlLgorCistIEVuYWJsZSB0aGUgZ2RiIHN0dWIgb2YgUUVNVS9LVk0sIGVpdGhlcgorCisgICAgLSBhdCBWTSBzdGFydHVwIHRpbWUgYnkgYXBwZW5kaW5nICItcyIgdG8gdGhlIFFFTVUgY29tbWFuZCBsaW5lCisKKyAgb3IKKworICAgIC0gZHVyaW5nIHJ1bnRpbWUgYnkgaXNzdWluZyAiZ2Ric2VydmVyIiBmcm9tIHRoZSBRRU1VIG1vbml0b3IKKyAgICAgIGNvbnNvbGUKKworLSBjZCAvcGF0aC90by9saW51eC1idWlsZAorCistIFN0YXJ0IGdkYjogZ2RiIHZtbGludXgKKworICBOb3RlOiBTb21lIGRpc3Ryb3MgbWF5IHJlc3RyaWN0IGF1dG8tbG9hZGluZyBvZiBnZGIgc2NyaXB0cyB0byBrbm93biBzYWZlCisgIGRpcmVjdG9yaWVzLiBJbiBjYXNlIGdkYiByZXBvcnRzIHRvIHJlZnVzZSBsb2FkaW5nIHZtbGludXgtZ2RiLnB5LCBhZGQ6OgorCisgICAgYWRkLWF1dG8tbG9hZC1zYWZlLXBhdGggL3BhdGgvdG8vbGludXgtYnVpbGQKKworICB0byB+Ly5nZGJpbml0LiBTZWUgZ2RiIGhlbHAgZm9yIG1vcmUgZGV0YWlscy4KKworLSBBdHRhY2ggdG8gdGhlIGJvb3RlZCBndWVzdDo6CisKKyAgICAoZ2RiKSB0YXJnZXQgcmVtb3RlIDoxMjM0CisKKworRXhhbXBsZXMgb2YgdXNpbmcgdGhlIExpbnV4LXByb3ZpZGVkIGdkYiBoZWxwZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBMb2FkIG1vZHVsZSAoYW5kIG1haW4ga2VybmVsKSBzeW1ib2xzOjoKKworICAgIChnZGIpIGx4LXN5bWJvbHMKKyAgICBsb2FkaW5nIHZtbGludXgKKyAgICBzY2FubmluZyBmb3IgbW9kdWxlcyBpbiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDIwMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL25ldC9uZXRmaWx0ZXIveHRfdGNwdWRwLmtvCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDE2MDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL25ldC9uZXRmaWx0ZXIveHRfcGt0dHlwZS5rbworICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAwMjAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9uZXQvbmV0ZmlsdGVyL3h0X2xpbWl0LmtvCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMGNhMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL25ldC9wYWNrZXQvYWZfcGFja2V0LmtvCisgICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDNjMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2ZzL2Z1c2UvZnVzZS5rbworICAgIC4uLgorICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAwMDAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5rbworCistIFNldCBhIGJyZWFrcG9pbnQgb24gc29tZSBub3QgeWV0IGxvYWRlZCBtb2R1bGUgZnVuY3Rpb24sIGUuZy46OgorCisgICAgKGdkYikgYiBidHJmc19pbml0X3N5c2ZzCisgICAgRnVuY3Rpb24gImJ0cmZzX2luaXRfc3lzZnMiIG5vdCBkZWZpbmVkLgorICAgIE1ha2UgYnJlYWtwb2ludCBwZW5kaW5nIG9uIGZ1dHVyZSBzaGFyZWQgbGlicmFyeSBsb2FkPyAoeSBvciBbbl0pIHkKKyAgICBCcmVha3BvaW50IDEgKGJ0cmZzX2luaXRfc3lzZnMpIHBlbmRpbmcuCisKKy0gQ29udGludWUgdGhlIHRhcmdldDo6CisKKyAgICAoZ2RiKSBjCisKKy0gTG9hZCB0aGUgbW9kdWxlIG9uIHRoZSB0YXJnZXQgYW5kIHdhdGNoIHRoZSBzeW1ib2xzIGJlaW5nIGxvYWRlZCBhcyB3ZWxsIGFzCisgIHRoZSBicmVha3BvaW50IGhpdDo6CisKKyAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwMzQwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbGliL2xpYmNyYzMyYy5rbworICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDA1MDAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9saWIvbHpvL2x6b19jb21wcmVzcy5rbworICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDA2ZTAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9saWIvemxpYl9kZWZsYXRlL3psaWJfZGVmbGF0ZS5rbworICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDFiMTAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9mcy9idHJmcy9idHJmcy5rbworCisgICAgQnJlYWtwb2ludCAxLCBidHJmc19pbml0X3N5c2ZzICgpIGF0IC9ob21lL3VzZXIvbGludXgvZnMvYnRyZnMvc3lzZnMuYzozNgorICAgIDM2ICAgICAgICAgICAgICBidHJmc19rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgiYnRyZnMiLCBOVUxMLCBmc19rb2JqKTsKKworLSBEdW1wIHRoZSBsb2cgYnVmZmVyIG9mIHRoZSB0YXJnZXQga2VybmVsOjoKKworICAgIChnZGIpIGx4LWRtZXNnCisgICAgWyAgICAgMC4wMDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdXNldAorICAgIFsgICAgIDAuMDAwMDAwXSBJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBjcHUKKyAgICBbICAgICAwLjAwMDAwMF0gTGludXggdmVyc2lvbiAzLjguMC1yYzQtZGJnKyAoLi4uCisgICAgWyAgICAgMC4wMDAwMDBdIENvbW1hbmQgbGluZTogcm9vdD0vZGV2L3NkYTIgcmVzdW1lPS9kZXYvc2RhMSB2Z2E9MHgzMTQKKyAgICBbICAgICAwLjAwMDAwMF0gZTgyMDogQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOgorICAgIFsgICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDAwMDAwMDAwLTB4MDAwMDAwMDAwMDA5ZmJmZl0gdXNhYmxlCisgICAgWyAgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwMDAwOWZjMDAtMHgwMDAwMDAwMDAwMDlmZmZmXSByZXNlcnZlZAorICAgIC4uLi4KKworLSBFeGFtaW5lIGZpZWxkcyBvZiB0aGUgY3VycmVudCB0YXNrIHN0cnVjdDo6CisKKyAgICAoZ2RiKSBwICRseF9jdXJyZW50KCkucGlkCisgICAgJDEgPSA0OTk4CisgICAgKGdkYikgcCAkbHhfY3VycmVudCgpLmNvbW0KKyAgICAkMiA9ICJtb2Rwcm9iZVwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiCisKKy0gTWFrZSB1c2Ugb2YgdGhlIHBlci1jcHUgZnVuY3Rpb24gZm9yIHRoZSBjdXJyZW50IG9yIGEgc3BlY2lmaWVkIENQVTo6CisKKyAgICAoZ2RiKSBwICRseF9wZXJfY3B1KCJydW5xdWV1ZXMiKS5ucl9ydW5uaW5nCisgICAgJDMgPSAxCisgICAgKGdkYikgcCAkbHhfcGVyX2NwdSgicnVucXVldWVzIiwgMikubnJfcnVubmluZworICAgICQ0ID0gMAorCistIERpZyBpbnRvIGhydGltZXJzIHVzaW5nIHRoZSBjb250YWluZXJfb2YgaGVscGVyOjoKKworICAgIChnZGIpIHNldCAkbmV4dCA9ICRseF9wZXJfY3B1KCJocnRpbWVyX2Jhc2VzIikuY2xvY2tfYmFzZVswXS5hY3RpdmUubmV4dAorICAgIChnZGIpIHAgKiRjb250YWluZXJfb2YoJG5leHQsICJzdHJ1Y3QgaHJ0aW1lciIsICJub2RlIikKKyAgICAkNSA9IHsKKyAgICAgIG5vZGUgPSB7CisgICAgICAgIG5vZGUgPSB7CisgICAgICAgICAgX19yYl9wYXJlbnRfY29sb3IgPSAxODQ0NjYxMjEzMzM1NTI1NjA3MiwKKyAgICAgICAgICByYl9yaWdodCA9IDB4MCA8aXJxX3N0YWNrX3VuaW9uPiwKKyAgICAgICAgICByYl9sZWZ0ID0gMHgwIDxpcnFfc3RhY2tfdW5pb24+CisgICAgICAgIH0sCisgICAgICAgIGV4cGlyZXMgPSB7CisgICAgICAgICAgdHY2NCA9IDE4MzUyNjgwMDAwMDAKKyAgICAgICAgfQorICAgICAgfSwKKyAgICAgIF9zb2Z0ZXhwaXJlcyA9IHsKKyAgICAgICAgdHY2NCA9IDE4MzUyNjgwMDAwMDAKKyAgICAgIH0sCisgICAgICBmdW5jdGlvbiA9IDB4ZmZmZmZmZmY4MTA3ODIzMiA8dGlja19zY2hlZF90aW1lcj4sCisgICAgICBiYXNlID0gMHhmZmZmODgwMDNmZDBkNmYwLAorICAgICAgc3RhdGUgPSAxLAorICAgICAgc3RhcnRfcGlkID0gMCwKKyAgICAgIHN0YXJ0X3NpdGUgPSAweGZmZmZmZmZmODEwNTVjMWYgPGhydGltZXJfc3RhcnRfcmFuZ2VfbnMrMjA+LAorICAgICAgc3RhcnRfY29tbSA9ICJzd2FwcGVyLzJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiCisgICAgfQorCisKK0xpc3Qgb2YgY29tbWFuZHMgYW5kIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBudW1iZXIgb2YgY29tbWFuZHMgYW5kIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBtYXkgZXZvbHZlIG92ZXIgdGhlIHRpbWUsCit0aGlzIGlzIGp1c3QgYSBzbmFwc2hvdCBvZiB0aGUgaW5pdGlhbCB2ZXJzaW9uOjoKKworIChnZGIpIGFwcm9wb3MgbHgKKyBmdW5jdGlvbiBseF9jdXJyZW50IC0tIFJldHVybiBjdXJyZW50IHRhc2sKKyBmdW5jdGlvbiBseF9tb2R1bGUgLS0gRmluZCBtb2R1bGUgYnkgbmFtZSBhbmQgcmV0dXJuIHRoZSBtb2R1bGUgdmFyaWFibGUKKyBmdW5jdGlvbiBseF9wZXJfY3B1IC0tIFJldHVybiBwZXItY3B1IHZhcmlhYmxlCisgZnVuY3Rpb24gbHhfdGFza19ieV9waWQgLS0gRmluZCBMaW51eCB0YXNrIGJ5IFBJRCBhbmQgcmV0dXJuIHRoZSB0YXNrX3N0cnVjdCB2YXJpYWJsZQorIGZ1bmN0aW9uIGx4X3RocmVhZF9pbmZvIC0tIENhbGN1bGF0ZSBMaW51eCB0aHJlYWRfaW5mbyBmcm9tIHRhc2sgdmFyaWFibGUKKyBseC1kbWVzZyAtLSBQcmludCBMaW51eCBrZXJuZWwgbG9nIGJ1ZmZlcgorIGx4LWxzbW9kIC0tIExpc3QgY3VycmVudGx5IGxvYWRlZCBtb2R1bGVzCisgbHgtc3ltYm9scyAtLSAoUmUtKWxvYWQgc3ltYm9scyBvZiBMaW51eCBrZXJuZWwgYW5kIGN1cnJlbnRseSBsb2FkZWQgbW9kdWxlcworCitEZXRhaWxlZCBoZWxwIGNhbiBiZSBvYnRhaW5lZCB2aWEgImhlbHAgPGNvbW1hbmQtbmFtZT4iIGZvciBjb21tYW5kcyBhbmQgImhlbHAKK2Z1bmN0aW9uIDxmdW5jdGlvbi1uYW1lPiIgZm9yIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2thc2FuLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2thc2FuLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2ExOGYyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva2FzYW4ucnN0CkBAIC0wLDAgKzEsMTczIEBACitUaGUgS2VybmVsIEFkZHJlc3MgU2FuaXRpemVyIChLQVNBTikKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitPdmVydmlldworLS0tLS0tLS0KKworS2VybmVsQWRkcmVzc1NBTml0aXplciAoS0FTQU4pIGlzIGEgZHluYW1pYyBtZW1vcnkgZXJyb3IgZGV0ZWN0b3IuIEl0IHByb3ZpZGVzCithIGZhc3QgYW5kIGNvbXByZWhlbnNpdmUgc29sdXRpb24gZm9yIGZpbmRpbmcgdXNlLWFmdGVyLWZyZWUgYW5kIG91dC1vZi1ib3VuZHMKK2J1Z3MuCisKK0tBU0FOIHVzZXMgY29tcGlsZS10aW1lIGluc3RydW1lbnRhdGlvbiBmb3IgY2hlY2tpbmcgZXZlcnkgbWVtb3J5IGFjY2VzcywKK3RoZXJlZm9yZSB5b3Ugd2lsbCBuZWVkIGEgR0NDIHZlcnNpb24gNC45LjIgb3IgbGF0ZXIuIEdDQyA1LjAgb3IgbGF0ZXIgaXMKK3JlcXVpcmVkIGZvciBkZXRlY3Rpb24gb2Ygb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyB0byBzdGFjayBvciBnbG9iYWwgdmFyaWFibGVzLgorCitDdXJyZW50bHkgS0FTQU4gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHRoZSB4ODZfNjQgYW5kIGFybTY0IGFyY2hpdGVjdHVyZXMuCisKK1VzYWdlCistLS0tLQorCitUbyBlbmFibGUgS0FTQU4gY29uZmlndXJlIGtlcm5lbCB3aXRoOjoKKworCSAgQ09ORklHX0tBU0FOID0geQorCithbmQgY2hvb3NlIGJldHdlZW4gQ09ORklHX0tBU0FOX09VVExJTkUgYW5kIENPTkZJR19LQVNBTl9JTkxJTkUuIE91dGxpbmUgYW5kCitpbmxpbmUgYXJlIGNvbXBpbGVyIGluc3RydW1lbnRhdGlvbiB0eXBlcy4gVGhlIGZvcm1lciBwcm9kdWNlcyBzbWFsbGVyIGJpbmFyeQordGhlIGxhdHRlciBpcyAxLjEgLSAyIHRpbWVzIGZhc3Rlci4gSW5saW5lIGluc3RydW1lbnRhdGlvbiByZXF1aXJlcyBhIEdDQwordmVyc2lvbiA1LjAgb3IgbGF0ZXIuCisKK0tBU0FOIHdvcmtzIHdpdGggYm90aCBTTFVCIGFuZCBTTEFCIG1lbW9yeSBhbGxvY2F0b3JzLgorRm9yIGJldHRlciBidWcgZGV0ZWN0aW9uIGFuZCBuaWNlciByZXBvcnRpbmcsIGVuYWJsZSBDT05GSUdfU1RBQ0tUUkFDRS4KKworVG8gZGlzYWJsZSBpbnN0cnVtZW50YXRpb24gZm9yIHNwZWNpZmljIGZpbGVzIG9yIGRpcmVjdG9yaWVzLCBhZGQgYSBsaW5lCitzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHJlc3BlY3RpdmUga2VybmVsIE1ha2VmaWxlOgorCistIEZvciBhIHNpbmdsZSBmaWxlIChlLmcuIG1haW4ubyk6OgorCisgICAgS0FTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IG4KKworLSBGb3IgYWxsIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnk6OgorCisgICAgS0FTQU5fU0FOSVRJWkUgOj0gbgorCitFcnJvciByZXBvcnRzCit+fn5+fn5+fn5+fn5+CisKK0EgdHlwaWNhbCBvdXQgb2YgYm91bmRzIGFjY2VzcyByZXBvcnQgbG9va3MgbGlrZSB0aGlzOjoKKworICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEJVRzogQWRkcmVzc1Nhbml0aXplcjogb3V0IG9mIGJvdW5kcyBhY2Nlc3MgaW4ga21hbGxvY19vb2JfcmlnaHQrMHg2NS8weDc1IFt0ZXN0X2thc2FuXSBhdCBhZGRyIGZmZmY4ODAwNjkzYmM1ZDMKKyAgICBXcml0ZSBvZiBzaXplIDEgYnkgdGFzayBtb2Rwcm9iZS8xNjg5CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBCVUcga21hbGxvYy0xMjggKE5vdCB0YWludGVkKToga2FzYW4gZXJyb3IKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgRGlzYWJsaW5nIGxvY2sgZGVidWdnaW5nIGR1ZSB0byBrZXJuZWwgdGFpbnQKKyAgICBJTkZPOiBBbGxvY2F0ZWQgaW4ga21hbGxvY19vb2JfcmlnaHQrMHgzZC8weDc1IFt0ZXN0X2thc2FuXSBhZ2U9MCBjcHU9MCBwaWQ9MTY4OQorICAgICBfX3NsYWJfYWxsb2MrMHg0YjQvMHg0ZjAKKyAgICAga21lbV9jYWNoZV9hbGxvY190cmFjZSsweDEwYi8weDE5MAorICAgICBrbWFsbG9jX29vYl9yaWdodCsweDNkLzB4NzUgW3Rlc3Rfa2FzYW5dCisgICAgIGluaXRfbW9kdWxlKzB4OS8weDQ3IFt0ZXN0X2thc2FuXQorICAgICBkb19vbmVfaW5pdGNhbGwrMHg5OS8weDIwMAorICAgICBsb2FkX21vZHVsZSsweDJjYjMvMHgzYjIwCisgICAgIFN5U19maW5pdF9tb2R1bGUrMHg3Ni8weDgwCisgICAgIHN5c3RlbV9jYWxsX2Zhc3RwYXRoKzB4MTIvMHgxNworICAgIElORk86IFNsYWIgMHhmZmZmZWEwMDAxYTRlZjAwIG9iamVjdHM9MTcgdXNlZD03IGZwPTB4ZmZmZjg4MDA2OTNiZDcyOCBmbGFncz0weDEwMDAwMDAwMDAwNDA4MAorICAgIElORk86IE9iamVjdCAweGZmZmY4ODAwNjkzYmM1NTggQG9mZnNldD0xMzY4IGZwPTB4ZmZmZjg4MDA2OTNiYzcyMAorCisgICAgQnl0ZXMgYjQgZmZmZjg4MDA2OTNiYzU0ODogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgNWEgNWEgNWEgNWEgNWEgNWEgNWEgNWEgIC4uLi4uLi4uWlpaWlpaWloKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzU1ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzU2ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzU3ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzU4ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzU5ODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzVhODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzViODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgIGtra2tra2tra2tra2tra2sKKyAgICBPYmplY3QgZmZmZjg4MDA2OTNiYzVjODogNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgNmIgYTUgIGtra2tra2tra2tra2tray4KKyAgICBSZWR6b25lIGZmZmY4ODAwNjkzYmM1ZDg6IGNjIGNjIGNjIGNjIGNjIGNjIGNjIGNjICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uLi4uLgorICAgIFBhZGRpbmcgZmZmZjg4MDA2OTNiYzcxODogNWEgNWEgNWEgNWEgNWEgNWEgNWEgNWEgICAgICAgICAgICAgICAgICAgICAgICAgIFpaWlpaWlpaCisgICAgQ1BVOiAwIFBJRDogMTY4OSBDb21tOiBtb2Rwcm9iZSBUYWludGVkOiBHICAgIEIgICAgICAgICAgMy4xOC4wLXJjMS1tbTErICM5OAorICAgIEhhcmR3YXJlIG5hbWU6IFFFTVUgU3RhbmRhcmQgUEMgKGk0NDBGWCArIFBJSVgsIDE5OTYpLCBCSU9TIHJlbC0xLjcuNS0wLWdlNTE0ODhjLTIwMTQwNjAyXzE2NDYxMi1uaWxzc29uLmhvbWUua3JheGVsLm9yZyAwNC8wMS8yMDE0CisgICAgIGZmZmY4ODAwNjkzYmMwMDAgMDAwMDAwMDAwMDAwMDAwMCBmZmZmODgwMDY5M2JjNTU4IGZmZmY4ODAwNjkyM2JiNzgKKyAgICAgZmZmZmZmZmY4MWNjNjhhZSAwMDAwMDAwMDAwMDAwMGYzIGZmZmY4ODAwNmQ0MDc2MDAgZmZmZjg4MDA2OTIzYmJhOAorICAgICBmZmZmZmZmZjgxMWZkODQ4IGZmZmY4ODAwNmQ0MDc2MDAgZmZmZmVhMDAwMWE0ZWYwMCBmZmZmODgwMDY5M2JjNTU4CisgICAgQ2FsbCBUcmFjZToKKyAgICAgWzxmZmZmZmZmZjgxY2M2OGFlPl0gZHVtcF9zdGFjaysweDQ2LzB4NTgKKyAgICAgWzxmZmZmZmZmZjgxMWZkODQ4Pl0gcHJpbnRfdHJhaWxlcisweGY4LzB4MTYwCisgICAgIFs8ZmZmZmZmZmZhMDAwMjZhNz5dID8ga21lbV9jYWNoZV9vb2IrMHhjMy8weGMzIFt0ZXN0X2thc2FuXQorICAgICBbPGZmZmZmZmZmODExZmYwZjU+XSBvYmplY3RfZXJyKzB4MzUvMHg0MAorICAgICBbPGZmZmZmZmZmYTAwMDIwNjU+XSA/IGttYWxsb2Nfb29iX3JpZ2h0KzB4NjUvMHg3NSBbdGVzdF9rYXNhbl0KKyAgICAgWzxmZmZmZmZmZjgxMjBiOWZhPl0ga2FzYW5fcmVwb3J0X2Vycm9yKzB4MzhhLzB4M2YwCisgICAgIFs8ZmZmZmZmZmY4MTIwYTc5Zj5dID8ga2FzYW5fcG9pc29uX3NoYWRvdysweDJmLzB4NDAKKyAgICAgWzxmZmZmZmZmZjgxMjBiMzQ0Pl0gPyBrYXNhbl91bnBvaXNvbl9zaGFkb3crMHgxNC8weDQwCisgICAgIFs8ZmZmZmZmZmY4MTIwYTc5Zj5dID8ga2FzYW5fcG9pc29uX3NoYWRvdysweDJmLzB4NDAKKyAgICAgWzxmZmZmZmZmZmEwMDAyNmE3Pl0gPyBrbWVtX2NhY2hlX29vYisweGMzLzB4YzMgW3Rlc3Rfa2FzYW5dCisgICAgIFs8ZmZmZmZmZmY4MTIwYTk5NT5dIF9fYXNhbl9zdG9yZTErMHg3NS8weGIwCisgICAgIFs8ZmZmZmZmZmZhMDAwMjYwMT5dID8ga21lbV9jYWNoZV9vb2IrMHgxZC8weGMzIFt0ZXN0X2thc2FuXQorICAgICBbPGZmZmZmZmZmYTAwMDIwNjU+XSA/IGttYWxsb2Nfb29iX3JpZ2h0KzB4NjUvMHg3NSBbdGVzdF9rYXNhbl0KKyAgICAgWzxmZmZmZmZmZmEwMDAyMDY1Pl0ga21hbGxvY19vb2JfcmlnaHQrMHg2NS8weDc1IFt0ZXN0X2thc2FuXQorICAgICBbPGZmZmZmZmZmYTAwMDI2YjA+XSBpbml0X21vZHVsZSsweDkvMHg0NyBbdGVzdF9rYXNhbl0KKyAgICAgWzxmZmZmZmZmZjgxMDAwMmQ5Pl0gZG9fb25lX2luaXRjYWxsKzB4OTkvMHgyMDAKKyAgICAgWzxmZmZmZmZmZjgxMWU0ZTVjPl0gPyBfX3Z1bm1hcCsweGVjLzB4MTYwCisgICAgIFs8ZmZmZmZmZmY4MTExNGY2Mz5dIGxvYWRfbW9kdWxlKzB4MmNiMy8weDNiMjAKKyAgICAgWzxmZmZmZmZmZjgxMTBmZDcwPl0gPyBtX3Nob3crMHgyNDAvMHgyNDAKKyAgICAgWzxmZmZmZmZmZjgxMTE1ZjA2Pl0gU3lTX2Zpbml0X21vZHVsZSsweDc2LzB4ODAKKyAgICAgWzxmZmZmZmZmZjgxY2QzMTI5Pl0gc3lzdGVtX2NhbGxfZmFzdHBhdGgrMHgxMi8weDE3CisgICAgTWVtb3J5IHN0YXRlIGFyb3VuZCB0aGUgYnVnZ3kgYWRkcmVzczoKKyAgICAgZmZmZjg4MDA2OTNiYzMwMDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKKyAgICAgZmZmZjg4MDA2OTNiYzM4MDogZmMgZmMgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgZmMKKyAgICAgZmZmZjg4MDA2OTNiYzQwMDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKKyAgICAgZmZmZjg4MDA2OTNiYzQ4MDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMKKyAgICAgZmZmZjg4MDA2OTNiYzUwMDogZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgZmMgMDAgMDAgMDAgMDAgMDAKKyAgICA+ZmZmZjg4MDA2OTNiYzU4MDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDMgZmMgZmMgZmMgZmMgZmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgICAgIGZmZmY4ODAwNjkzYmM2MDA6IGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjCisgICAgIGZmZmY4ODAwNjkzYmM2ODA6IGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjIGZjCisgICAgIGZmZmY4ODAwNjkzYmM3MDA6IGZjIGZjIGZjIGZjIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiCisgICAgIGZmZmY4ODAwNjkzYmM3ODA6IGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiCisgICAgIGZmZmY4ODAwNjkzYmM4MDA6IGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiIGZiCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBoZWFkZXIgb2YgdGhlIHJlcG9ydCBkaXNjcmliZSB3aGF0IGtpbmQgb2YgYnVnIGhhcHBlbmVkIGFuZCB3aGF0IGtpbmQgb2YKK2FjY2VzcyBjYXVzZWQgaXQuIEl0J3MgZm9sbG93ZWQgYnkgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBhY2Nlc3NlZCBzbHViIG9iamVjdAorKHNlZSAnU0xVQiBEZWJ1ZyBvdXRwdXQnIHNlY3Rpb24gaW4gRG9jdW1lbnRhdGlvbi92bS9zbHViLnR4dCBmb3IgZGV0YWlscykgYW5kCit0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGFjY2Vzc2VkIG1lbW9yeSBwYWdlLgorCitJbiB0aGUgbGFzdCBzZWN0aW9uIHRoZSByZXBvcnQgc2hvd3MgbWVtb3J5IHN0YXRlIGFyb3VuZCB0aGUgYWNjZXNzZWQgYWRkcmVzcy4KK1JlYWRpbmcgdGhpcyBwYXJ0IHJlcXVpcmVzIHNvbWUgdW5kZXJzdGFuZGluZyBvZiBob3cgS0FTQU4gd29ya3MuCisKK1RoZSBzdGF0ZSBvZiBlYWNoIDggYWxpZ25lZCBieXRlcyBvZiBtZW1vcnkgaXMgZW5jb2RlZCBpbiBvbmUgc2hhZG93IGJ5dGUuCitUaG9zZSA4IGJ5dGVzIGNhbiBiZSBhY2Nlc3NpYmxlLCBwYXJ0aWFsbHkgYWNjZXNzaWJsZSwgZnJlZWQgb3IgYmUgYSByZWR6b25lLgorV2UgdXNlIHRoZSBmb2xsb3dpbmcgZW5jb2RpbmcgZm9yIGVhY2ggc2hhZG93IGJ5dGU6IDAgbWVhbnMgdGhhdCBhbGwgOCBieXRlcworb2YgdGhlIGNvcnJlc3BvbmRpbmcgbWVtb3J5IHJlZ2lvbiBhcmUgYWNjZXNzaWJsZTsgbnVtYmVyIE4gKDEgPD0gTiA8PSA3KSBtZWFucwordGhhdCB0aGUgZmlyc3QgTiBieXRlcyBhcmUgYWNjZXNzaWJsZSwgYW5kIG90aGVyICg4IC0gTikgYnl0ZXMgYXJlIG5vdDsKK2FueSBuZWdhdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZW50aXJlIDgtYnl0ZSB3b3JkIGlzIGluYWNjZXNzaWJsZS4KK1dlIHVzZSBkaWZmZXJlbnQgbmVnYXRpdmUgdmFsdWVzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZGlmZmVyZW50IGtpbmRzIG9mCitpbmFjY2Vzc2libGUgbWVtb3J5IGxpa2UgcmVkem9uZXMgb3IgZnJlZWQgbWVtb3J5IChzZWUgbW0va2FzYW4va2FzYW4uaCkuCisKK0luIHRoZSByZXBvcnQgYWJvdmUgdGhlIGFycm93cyBwb2ludCB0byB0aGUgc2hhZG93IGJ5dGUgMDMsIHdoaWNoIG1lYW5zIHRoYXQKK3RoZSBhY2Nlc3NlZCBhZGRyZXNzIGlzIHBhcnRpYWxseSBhY2Nlc3NpYmxlLgorCisKK0ltcGxlbWVudGF0aW9uIGRldGFpbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRnJvbSBhIGhpZ2ggbGV2ZWwsIG91ciBhcHByb2FjaCB0byBtZW1vcnkgZXJyb3IgZGV0ZWN0aW9uIGlzIHNpbWlsYXIgdG8gdGhhdAorb2Yga21lbWNoZWNrOiB1c2Ugc2hhZG93IG1lbW9yeSB0byByZWNvcmQgd2hldGhlciBlYWNoIGJ5dGUgb2YgbWVtb3J5IGlzIHNhZmUKK3RvIGFjY2VzcywgYW5kIHVzZSBjb21waWxlLXRpbWUgaW5zdHJ1bWVudGF0aW9uIHRvIGNoZWNrIHNoYWRvdyBtZW1vcnkgb24gZWFjaAorbWVtb3J5IGFjY2Vzcy4KKworQWRkcmVzc1Nhbml0aXplciBkZWRpY2F0ZXMgMS84IG9mIGtlcm5lbCBtZW1vcnkgdG8gaXRzIHNoYWRvdyBtZW1vcnkKKyhlLmcuIDE2VEIgdG8gY292ZXIgMTI4VEIgb24geDg2XzY0KSBhbmQgdXNlcyBkaXJlY3QgbWFwcGluZyB3aXRoIGEgc2NhbGUgYW5kCitvZmZzZXQgdG8gdHJhbnNsYXRlIGEgbWVtb3J5IGFkZHJlc3MgdG8gaXRzIGNvcnJlc3BvbmRpbmcgc2hhZG93IGFkZHJlc3MuCisKK0hlcmUgaXMgdGhlIGZ1bmN0aW9uIHdoaWNoIHRyYW5zbGF0ZXMgYW4gYWRkcmVzcyB0byBpdHMgY29ycmVzcG9uZGluZyBzaGFkb3cKK2FkZHJlc3M6OgorCisgICAgc3RhdGljIGlubGluZSB2b2lkICprYXNhbl9tZW1fdG9fc2hhZG93KGNvbnN0IHZvaWQgKmFkZHIpCisgICAgeworCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpYWRkciA+PiBLQVNBTl9TSEFET1dfU0NBTEVfU0hJRlQpCisJCSsgS0FTQU5fU0hBRE9XX09GRlNFVDsKKyAgICB9CisKK3doZXJlIGBgS0FTQU5fU0hBRE9XX1NDQUxFX1NISUZUID0gM2BgLgorCitDb21waWxlLXRpbWUgaW5zdHJ1bWVudGF0aW9uIHVzZWQgZm9yIGNoZWNraW5nIG1lbW9yeSBhY2Nlc3Nlcy4gQ29tcGlsZXIgaW5zZXJ0cworZnVuY3Rpb24gY2FsbHMgKF9fYXNhbl9sb2FkKihhZGRyKSwgX19hc2FuX3N0b3JlKihhZGRyKSkgYmVmb3JlIGVhY2ggbWVtb3J5CithY2Nlc3Mgb2Ygc2l6ZSAxLCAyLCA0LCA4IG9yIDE2LiBUaGVzZSBmdW5jdGlvbnMgY2hlY2sgd2hldGhlciBtZW1vcnkgYWNjZXNzIGlzCit2YWxpZCBvciBub3QgYnkgY2hlY2tpbmcgY29ycmVzcG9uZGluZyBzaGFkb3cgbWVtb3J5LgorCitHQ0MgNS4wIGhhcyBwb3NzaWJpbGl0eSB0byBwZXJmb3JtIGlubGluZSBpbnN0cnVtZW50YXRpb24uIEluc3RlYWQgb2YgbWFraW5nCitmdW5jdGlvbiBjYWxscyBHQ0MgZGlyZWN0bHkgaW5zZXJ0cyB0aGUgY29kZSB0byBjaGVjayB0aGUgc2hhZG93IG1lbW9yeS4KK1RoaXMgb3B0aW9uIHNpZ25pZmljYW50bHkgZW5sYXJnZXMga2VybmVsIGJ1dCBpdCBnaXZlcyB4MS4xLXgyIHBlcmZvcm1hbmNlCitib29zdCBvdmVyIG91dGxpbmUgaW5zdHJ1bWVudGVkIGtlcm5lbC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2tjb3YucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva2Nvdi5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhMGUyNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2tjb3YucnN0CkBAIC0wLDAgKzEsMTExIEBACitrY292OiBjb2RlIGNvdmVyYWdlIGZvciBmdXp6aW5nCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2tjb3YgZXhwb3NlcyBrZXJuZWwgY29kZSBjb3ZlcmFnZSBpbmZvcm1hdGlvbiBpbiBhIGZvcm0gc3VpdGFibGUgZm9yIGNvdmVyYWdlLQorZ3VpZGVkIGZ1enppbmcgKHJhbmRvbWl6ZWQgdGVzdGluZykuIENvdmVyYWdlIGRhdGEgb2YgYSBydW5uaW5nIGtlcm5lbCBpcworZXhwb3J0ZWQgdmlhIHRoZSAia2NvdiIgZGVidWdmcyBmaWxlLiBDb3ZlcmFnZSBjb2xsZWN0aW9uIGlzIGVuYWJsZWQgb24gYSB0YXNrCitiYXNpcywgYW5kIHRodXMgaXQgY2FuIGNhcHR1cmUgcHJlY2lzZSBjb3ZlcmFnZSBvZiBhIHNpbmdsZSBzeXN0ZW0gY2FsbC4KKworTm90ZSB0aGF0IGtjb3YgZG9lcyBub3QgYWltIHRvIGNvbGxlY3QgYXMgbXVjaCBjb3ZlcmFnZSBhcyBwb3NzaWJsZS4gSXQgYWltcwordG8gY29sbGVjdCBtb3JlIG9yIGxlc3Mgc3RhYmxlIGNvdmVyYWdlIHRoYXQgaXMgZnVuY3Rpb24gb2Ygc3lzY2FsbCBpbnB1dHMuCitUbyBhY2hpZXZlIHRoaXMgZ29hbCBpdCBkb2VzIG5vdCBjb2xsZWN0IGNvdmVyYWdlIGluIHNvZnQvaGFyZCBpbnRlcnJ1cHRzCithbmQgaW5zdHJ1bWVudGF0aW9uIG9mIHNvbWUgaW5oZXJlbnRseSBub24tZGV0ZXJtaW5pc3RpYyBwYXJ0cyBvZiBrZXJuZWwgaXMKK2Rpc2JsZWQgKGUuZy4gc2NoZWR1bGVyLCBsb2NraW5nKS4KKworVXNhZ2UKKy0tLS0tCisKK0NvbmZpZ3VyZSB0aGUga2VybmVsIHdpdGg6OgorCisgICAgICAgIENPTkZJR19LQ09WPXkKKworQ09ORklHX0tDT1YgcmVxdWlyZXMgZ2NjIGJ1aWx0IG9uIHJldmlzaW9uIDIzMTI5NiBvciBsYXRlci4KK1Byb2ZpbGluZyBkYXRhIHdpbGwgb25seSBiZWNvbWUgYWNjZXNzaWJsZSBvbmNlIGRlYnVnZnMgaGFzIGJlZW4gbW91bnRlZDo6CisKKyAgICAgICAgbW91bnQgLXQgZGVidWdmcyBub25lIC9zeXMva2VybmVsL2RlYnVnCisKK1RoZSBmb2xsb3dpbmcgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMga2NvdiB1c2FnZSBmcm9tIHdpdGhpbiBhIHRlc3QgcHJvZ3JhbTo6CisKKyAgICAjaW5jbHVkZSA8c3RkaW8uaD4KKyAgICAjaW5jbHVkZSA8c3RkZGVmLmg+CisgICAgI2luY2x1ZGUgPHN0ZGludC5oPgorICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyAgICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICAgI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisgICAgI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorICAgICNpbmNsdWRlIDxzeXMvbW1hbi5oPgorICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKyAgICAjaW5jbHVkZSA8ZmNudGwuaD4KKworICAgICNkZWZpbmUgS0NPVl9JTklUX1RSQUNFCQkJX0lPUignYycsIDEsIHVuc2lnbmVkIGxvbmcpCisgICAgI2RlZmluZSBLQ09WX0VOQUJMRQkJCV9JTygnYycsIDEwMCkKKyAgICAjZGVmaW5lIEtDT1ZfRElTQUJMRQkJCV9JTygnYycsIDEwMSkKKyAgICAjZGVmaW5lIENPVkVSX1NJWkUJCQkoNjQ8PDEwKQorCisgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQorICAgIHsKKwlpbnQgZmQ7CisJdW5zaWduZWQgbG9uZyAqY292ZXIsIG4sIGk7CisKKwkvKiBBIHNpbmdsZSBmZCBkZXNjcmlwdG9yIGFsbG93cyBjb3ZlcmFnZSBjb2xsZWN0aW9uIG9uIGEgc2luZ2xlCisJICogdGhyZWFkLgorCSAqLworCWZkID0gb3BlbigiL3N5cy9rZXJuZWwvZGVidWcva2NvdiIsIE9fUkRXUik7CisJaWYgKGZkID09IC0xKQorCQlwZXJyb3IoIm9wZW4iKSwgZXhpdCgxKTsKKwkvKiBTZXR1cCB0cmFjZSBtb2RlIGFuZCB0cmFjZSBzaXplLiAqLworCWlmIChpb2N0bChmZCwgS0NPVl9JTklUX1RSQUNFLCBDT1ZFUl9TSVpFKSkKKwkJcGVycm9yKCJpb2N0bCIpLCBleGl0KDEpOworCS8qIE1tYXAgYnVmZmVyIHNoYXJlZCBiZXR3ZWVuIGtlcm5lbC0gYW5kIHVzZXItc3BhY2UuICovCisJY292ZXIgPSAodW5zaWduZWQgbG9uZyopbW1hcChOVUxMLCBDT1ZFUl9TSVpFICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCQkJCSAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmQsIDApOworCWlmICgodm9pZCopY292ZXIgPT0gTUFQX0ZBSUxFRCkKKwkJcGVycm9yKCJtbWFwIiksIGV4aXQoMSk7CisJLyogRW5hYmxlIGNvdmVyYWdlIGNvbGxlY3Rpb24gb24gdGhlIGN1cnJlbnQgdGhyZWFkLiAqLworCWlmIChpb2N0bChmZCwgS0NPVl9FTkFCTEUsIDApKQorCQlwZXJyb3IoImlvY3RsIiksIGV4aXQoMSk7CisJLyogUmVzZXQgY292ZXJhZ2UgZnJvbSB0aGUgdGFpbCBvZiB0aGUgaW9jdGwoKSBjYWxsLiAqLworCV9fYXRvbWljX3N0b3JlX24oJmNvdmVyWzBdLCAwLCBfX0FUT01JQ19SRUxBWEVEKTsKKwkvKiBUaGF0J3MgdGhlIHRhcmdldCBzeXNjYWwgY2FsbC4gKi8KKwlyZWFkKC0xLCBOVUxMLCAwKTsKKwkvKiBSZWFkIG51bWJlciBvZiBQQ3MgY29sbGVjdGVkLiAqLworCW4gPSBfX2F0b21pY19sb2FkX24oJmNvdmVyWzBdLCBfX0FUT01JQ19SRUxBWEVEKTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlwcmludGYoIjB4JWx4XG4iLCBjb3ZlcltpICsgMV0pOworCS8qIERpc2FibGUgY292ZXJhZ2UgY29sbGVjdGlvbiBmb3IgdGhlIGN1cnJlbnQgdGhyZWFkLiBBZnRlciB0aGlzIGNhbGwKKwkgKiBjb3ZlcmFnZSBjYW4gYmUgZW5hYmxlZCBmb3IgYSBkaWZmZXJlbnQgdGhyZWFkLgorCSAqLworCWlmIChpb2N0bChmZCwgS0NPVl9ESVNBQkxFLCAwKSkKKwkJcGVycm9yKCJpb2N0bCIpLCBleGl0KDEpOworCS8qIEZyZWUgcmVzb3VyY2VzLiAqLworCWlmIChtdW5tYXAoY292ZXIsIENPVkVSX1NJWkUgKiBzaXplb2YodW5zaWduZWQgbG9uZykpKQorCQlwZXJyb3IoIm11bm1hcCIpLCBleGl0KDEpOworCWlmIChjbG9zZShmZCkpCisJCXBlcnJvcigiY2xvc2UiKSwgZXhpdCgxKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKK0FmdGVyIHBpcGluZyB0aHJvdWdoIGFkZHIybGluZSBvdXRwdXQgb2YgdGhlIHByb2dyYW0gbG9va3MgYXMgZm9sbG93czo6CisKKyAgICBTeVNfcmVhZAorICAgIGZzL3JlYWRfd3JpdGUuYzo1NjIKKyAgICBfX2ZkZ2V0X3BvcworICAgIGZzL2ZpbGUuYzo3NzQKKyAgICBfX2ZnZXRfbGlnaHQKKyAgICBmcy9maWxlLmM6NzQ2CisgICAgX19mZ2V0X2xpZ2h0CisgICAgZnMvZmlsZS5jOjc1MAorICAgIF9fZmdldF9saWdodAorICAgIGZzL2ZpbGUuYzo3NjAKKyAgICBfX2ZkZ2V0X3BvcworICAgIGZzL2ZpbGUuYzo3ODQKKyAgICBTeVNfcmVhZAorICAgIGZzL3JlYWRfd3JpdGUuYzo1NjIKKworSWYgYSBwcm9ncmFtIG5lZWRzIHRvIGNvbGxlY3QgY292ZXJhZ2UgZnJvbSBzZXZlcmFsIHRocmVhZHMgKGluZGVwZW5kZW50bHkpLAoraXQgbmVlZHMgdG8gb3BlbiAvc3lzL2tlcm5lbC9kZWJ1Zy9rY292IGluIGVhY2ggdGhyZWFkIHNlcGFyYXRlbHkuCisKK1RoZSBpbnRlcmZhY2UgaXMgZmluZS1ncmFpbmVkIHRvIGFsbG93IGVmZmljaWVudCBmb3JraW5nIG9mIHRlc3QgcHJvY2Vzc2VzLgorVGhhdCBpcywgYSBwYXJlbnQgcHJvY2VzcyBvcGVucyAvc3lzL2tlcm5lbC9kZWJ1Zy9rY292LCBlbmFibGVzIHRyYWNlIG1vZGUsCittbWFwcyBjb3ZlcmFnZSBidWZmZXIgYW5kIHRoZW4gZm9ya3MgY2hpbGQgcHJvY2Vzc2VzIGluIGEgbG9vcC4gQ2hpbGQgcHJvY2Vzc2VzCitvbmx5IG5lZWQgdG8gZW5hYmxlIGNvdmVyYWdlIChkaXNhYmxlIGhhcHBlbnMgYXV0b21hdGljYWxseSBvbiB0aHJlYWQgZW5kKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2ttZW1jaGVjay5yc3QgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9rbWVtY2hlY2sucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmM2QxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9rbWVtY2hlY2sucnN0CkBAIC0wLDAgKzEsNzMzIEBACitHZXR0aW5nIHN0YXJ0ZWQgd2l0aCBrbWVtY2hlY2sKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitWZWdhcmQgTm9zc3VtIDx2ZWdhcmRub0BpZmkudWlvLm5vPgorCisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCisKK2ttZW1jaGVjayBpcyBhIGRlYnVnZ2luZyBmZWF0dXJlIGZvciB0aGUgTGludXggS2VybmVsLiBNb3JlIHNwZWNpZmljYWxseSwgaXQKK2lzIGEgZHluYW1pYyBjaGVja2VyIHRoYXQgZGV0ZWN0cyBhbmQgd2FybnMgYWJvdXQgc29tZSB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQKK21lbW9yeS4KKworVXNlcnNwYWNlIHByb2dyYW1tZXJzIG1pZ2h0IGJlIGZhbWlsaWFyIHdpdGggVmFsZ3JpbmQncyBtZW1jaGVjay4gVGhlIG1haW4KK2RpZmZlcmVuY2UgYmV0d2VlbiBtZW1jaGVjayBhbmQga21lbWNoZWNrIGlzIHRoYXQgbWVtY2hlY2sgd29ya3MgZm9yIHVzZXJzcGFjZQorcHJvZ3JhbXMgb25seSwgYW5kIGttZW1jaGVjayB3b3JrcyBmb3IgdGhlIGtlcm5lbCBvbmx5LiBUaGUgaW1wbGVtZW50YXRpb25zCithcmUgb2YgY291cnNlIHZhc3RseSBkaWZmZXJlbnQuIEJlY2F1c2Ugb2YgdGhpcywga21lbWNoZWNrIGlzIG5vdCBhcyBhY2N1cmF0ZQorYXMgbWVtY2hlY2ssIGJ1dCBpdCB0dXJucyBvdXQgdG8gYmUgZ29vZCBlbm91Z2ggaW4gcHJhY3RpY2UgdG8gZGlzY292ZXIgcmVhbAorcHJvZ3JhbW1lciBlcnJvcnMgdGhhdCB0aGUgY29tcGlsZXIgaXMgbm90IGFibGUgdG8gZmluZCB0aHJvdWdoIHN0YXRpYworYW5hbHlzaXMuCisKK0VuYWJsaW5nIGttZW1jaGVjayBvbiBhIGtlcm5lbCB3aWxsIHByb2JhYmx5IHNsb3cgaXQgZG93biB0byB0aGUgZXh0ZW50IHRoYXQKK3RoZSBtYWNoaW5lIHdpbGwgbm90IGJlIHVzYWJsZSBmb3Igbm9ybWFsIHdvcmtsb2FkcyBzdWNoIGFzIGUuZy4gYW4KK2ludGVyYWN0aXZlIGRlc2t0b3AuIGttZW1jaGVjayB3aWxsIGFsc28gY2F1c2UgdGhlIGtlcm5lbCB0byB1c2UgYWJvdXQgdHdpY2UKK2FzIG11Y2ggbWVtb3J5IGFzIG5vcm1hbC4gRm9yIHRoaXMgcmVhc29uLCBrbWVtY2hlY2sgaXMgc3RyaWN0bHkgYSBkZWJ1Z2dpbmcKK2ZlYXR1cmUuCisKKworRG93bmxvYWRpbmcKKy0tLS0tLS0tLS0tCisKK0FzIG9mIHZlcnNpb24gMi42LjMxLXJjMSwga21lbWNoZWNrIGlzIGluY2x1ZGVkIGluIHRoZSBtYWlubGluZSBrZXJuZWwuCisKKworQ29uZmlndXJpbmcgYW5kIGNvbXBpbGluZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitrbWVtY2hlY2sgb25seSB3b3JrcyBmb3IgdGhlIHg4NiAoYm90aCAzMi0gYW5kIDY0LWJpdCkgcGxhdGZvcm0uIEEgbnVtYmVyIG9mCitjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBtdXN0IGhhdmUgc3BlY2lmaWMgc2V0dGluZ3MgaW4gb3JkZXIgZm9yIHRoZSBrbWVtY2hlY2sKK21lbnUgdG8gZXZlbiBhcHBlYXIgaW4gIm1lbnVjb25maWciLiBUaGVzZSBhcmU6CisKKy0gYGBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9bmBgCisJVGhpcyBvcHRpb24gaXMgbG9jYXRlZCB1bmRlciAiR2VuZXJhbCBzZXR1cCIgLyAiT3B0aW1pemUgZm9yIHNpemUiLgorCisJV2l0aG91dCB0aGlzLCBnY2Mgd2lsbCB1c2UgY2VydGFpbiBvcHRpbWl6YXRpb25zIHRoYXQgdXN1YWxseSBsZWFkIHRvCisJZmFsc2UgcG9zaXRpdmUgd2FybmluZ3MgZnJvbSBrbWVtY2hlY2suIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyBhIDE2LWJpdAorCWZpZWxkIGluIGEgc3RydWN0LCB3aGVyZSBnY2MgbWF5IGxvYWQgMzIgYml0cywgdGhlbiBkaXNjYXJkIHRoZSB1cHBlcgorCTE2IGJpdHMuIGttZW1jaGVjayBzZWVzIG9ubHkgdGhlIDMyLWJpdCBsb2FkLCBhbmQgbWF5IHRyaWdnZXIgYQorCXdhcm5pbmcgZm9yIHRoZSB1cHBlciAxNiBiaXRzIChpZiB0aGV5J3JlIHVuaW5pdGlhbGl6ZWQpLgorCistIGBgQ09ORklHX1NMQUI9eWBgIG9yIGBgQ09ORklHX1NMVUI9eWBgCisJVGhpcyBvcHRpb24gaXMgbG9jYXRlZCB1bmRlciAiR2VuZXJhbCBzZXR1cCIgLyAiQ2hvb3NlIFNMQUIKKwlhbGxvY2F0b3IiLgorCistIGBgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUj1uYGAKKwlUaGlzIG9wdGlvbiBpcyBsb2NhdGVkIHVuZGVyICJLZXJuZWwgaGFja2luZyIgLyAiVHJhY2VycyIgLyAiS2VybmVsCisJRnVuY3Rpb24gVHJhY2VyIgorCisJV2hlbiBmdW5jdGlvbiB0cmFjaW5nIGlzIGNvbXBpbGVkIGluLCBnY2MgZW1pdHMgYSBjYWxsIHRvIGFub3RoZXIKKwlmdW5jdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IGZ1bmN0aW9uLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUKKwlwYWdlIGZhdWx0IGhhbmRsZXIgaXMgY2FsbGVkLCB0aGUgZnRyYWNlIGZyYW1ld29yayB3aWxsIGJlIGNhbGxlZAorCWJlZm9yZSBrbWVtY2hlY2sgaGFzIGhhZCBhIGNoYW5jZSB0byBoYW5kbGUgdGhlIGZhdWx0LiBJZiBmdHJhY2UgdGhlbgorCW1vZGlmaWVzIG1lbW9yeSB0aGF0IHdhcyB0cmFja2VkIGJ5IGttZW1jaGVjaywgdGhlIHJlc3VsdCBpcyBhbgorCWVuZGxlc3MgcmVjdXJzaXZlIHBhZ2UgZmF1bHQuCisKKy0gYGBDT05GSUdfREVCVUdfUEFHRUFMTE9DPW5gYAorCVRoaXMgb3B0aW9uIGlzIGxvY2F0ZWQgdW5kZXIgIktlcm5lbCBoYWNraW5nIiAvICJNZW1vcnkgRGVidWdnaW5nIgorCS8gIkRlYnVnIHBhZ2UgbWVtb3J5IGFsbG9jYXRpb25zIi4KKworSW4gYWRkaXRpb24sIEkgaGlnaGx5IHJlY29tbWVuZCB0dXJuaW5nIG9uIGBgQ09ORklHX0RFQlVHX0lORk89eWBgLiBUaGlzIGlzIGFsc28KK2xvY2F0ZWQgdW5kZXIgIktlcm5lbCBoYWNraW5nIi4gV2l0aCB0aGlzLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGdldCBsaW5lIG51bWJlcgoraW5mb3JtYXRpb24gZnJvbSB0aGUga21lbWNoZWNrIHdhcm5pbmdzLCB3aGljaCBpcyBleHRyZW1lbHkgdmFsdWFibGUgaW4KK2RlYnVnZ2luZyBhIHByb2JsZW0uIFRoaXMgb3B0aW9uIGlzIG5vdCBtYW5kYXRvcnksIGhvd2V2ZXIsIGJlY2F1c2UgaXQgc2xvd3MKK2Rvd24gdGhlIGNvbXBpbGF0aW9uIHByb2Nlc3MgYW5kIHByb2R1Y2VzIGEgbXVjaCBiaWdnZXIga2VybmVsIGltYWdlLgorCitOb3cgdGhlIGttZW1jaGVjayBtZW51IHNob3VsZCBiZSB2aXNpYmxlICh1bmRlciAiS2VybmVsIGhhY2tpbmciIC8gIk1lbW9yeQorRGVidWdnaW5nIiAvICJrbWVtY2hlY2s6IHRyYXAgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IikuIEhlcmUgZm9sbG93cworYSBkZXNjcmlwdGlvbiBvZiB0aGUga21lbWNoZWNrIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzOgorCistIGBgQ09ORklHX0tNRU1DSEVDS2BgCisJVGhpcyBtdXN0IGJlIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIGttZW1jaGVjayBhdCBhbGwuLi4KKworLSBgYENPTkZJR19LTUVNQ0hFQ0tfYGBbYGBESVNBQkxFRGBgIHwgYGBFTkFCTEVEYGAgfCBgYE9ORVNIT1RgYF1gYF9CWV9ERUZBVUxUYGAKKwlUaGlzIG9wdGlvbiBjb250cm9scyB0aGUgc3RhdHVzIG9mIGttZW1jaGVjayBhdCBib290LXRpbWUuICJFbmFibGVkIgorCXdpbGwgZW5hYmxlIGttZW1jaGVjayByaWdodCBmcm9tIHRoZSBzdGFydCwgImRpc2FibGVkIiB3aWxsIGJvb3QgdGhlCisJa2VybmVsIGFzIG5vcm1hbCAoYnV0IHdpdGggdGhlIGttZW1jaGVjayBjb2RlIGNvbXBpbGVkIGluLCBzbyBpdCBjYW4KKwliZSBlbmFibGVkIGF0IHJ1bi10aW1lIGFmdGVyIHRoZSBrZXJuZWwgaGFzIGJvb3RlZCksIGFuZCAib25lLXNob3QiIGlzCisJYSBzcGVjaWFsIG1vZGUgd2hpY2ggd2lsbCB0dXJuIGttZW1jaGVjayBvZmYgYXV0b21hdGljYWxseSBhZnRlcgorCWRldGVjdGluZyB0aGUgZmlyc3QgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5LgorCisJSWYgeW91IGFyZSB1c2luZyBrbWVtY2hlY2sgdG8gYWN0aXZlbHkgZGVidWcgYSBwcm9ibGVtLCB0aGVuIHlvdQorCXByb2JhYmx5IHdhbnQgdG8gY2hvb3NlICJlbmFibGVkIiBoZXJlLgorCisJVGhlIG9uZS1zaG90IG1vZGUgaXMgbW9zdGx5IHVzZWZ1bCBpbiBhdXRvbWF0ZWQgdGVzdCBzZXR1cHMgYmVjYXVzZSBpdAorCWNhbiBwcmV2ZW50IGZsb29kcyBvZiB3YXJuaW5ncyBhbmQgaW5jcmVhc2UgdGhlIGNoYW5jZXMgb2YgdGhlIG1hY2hpbmUKKwlzdXJ2aXZpbmcgaW4gY2FzZSBzb21ldGhpbmcgaXMgcmVhbGx5IHdyb25nLiBJbiBvdGhlciBjYXNlcywgdGhlIG9uZS0KKwlzaG90IG1vZGUgY291bGQgYWN0dWFsbHkgYmUgY291bnRlci1wcm9kdWN0aXZlIGJlY2F1c2UgaXQgd291bGQgdHVybgorCWl0c2VsZiBvZmYgYXQgdGhlIHZlcnkgZmlyc3QgZXJyb3IgLS0gaW4gdGhlIGNhc2Ugb2YgYSBmYWxzZSBwb3NpdGl2ZQorCXRvbyAtLSBhbmQgdGhpcyB3b3VsZCBjb21lIGluIHRoZSB3YXkgb2YgZGVidWdnaW5nIHRoZSBzcGVjaWZpYworCXByb2JsZW0geW91IHdlcmUgaW50ZXJlc3RlZCBpbi4KKworCUlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB5b3VyIGtlcm5lbCBhcyBub3JtYWwsIGJ1dCB3aXRoIGEgY2hhbmNlIHRvCisJZW5hYmxlIGttZW1jaGVjayBpbiBjYXNlIG9mIHNvbWUgcHJvYmxlbSwgaXQgbWlnaHQgYmUgYSBnb29kIGlkZWEgdG8KKwljaG9vc2UgImRpc2FibGVkIiBoZXJlLiBXaGVuIGttZW1jaGVjayBpcyBkaXNhYmxlZCwgbW9zdCBvZiB0aGUgcnVuLQorCXRpbWUgb3ZlcmhlYWQgaXMgbm90IGluY3VycmVkLCBhbmQgdGhlIGtlcm5lbCB3aWxsIGJlIGFsbW9zdCBhcyBmYXN0CisJYXMgbm9ybWFsLgorCistIGBgQ09ORklHX0tNRU1DSEVDS19RVUVVRV9TSVpFYGAKKwlTZWxlY3QgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVycm9yIHJlcG9ydHMgdG8gc3RvcmUgaW4gYW4gaW50ZXJuYWwKKwkoZml4ZWQtc2l6ZSkgYnVmZmVyLiBTaW5jZSBlcnJvcnMgY2FuIG9jY3VyIHZpcnR1YWxseSBhbnl3aGVyZSBhbmQgaW4KKwlhbnkgY29udGV4dCwgd2UgbmVlZCBhIHRlbXBvcmFyeSBzdG9yYWdlIGFyZWEgd2hpY2ggaXMgZ3VhcmFudGVlZCBub3QKKwl0byBnZW5lcmF0ZSBhbnkgb3RoZXIgcGFnZSBmYXVsdHMgd2hlbiBhY2Nlc3NlZC4gVGhlIHF1ZXVlIHdpbGwgYmUKKwllbXB0aWVkIGFzIHNvb24gYXMgYSB0YXNrbGV0IG1heSBiZSBzY2hlZHVsZWQuIElmIHRoZSBxdWV1ZSBpcyBmdWxsLAorCW5ldyBlcnJvciByZXBvcnRzIHdpbGwgYmUgbG9zdC4KKworCVRoZSBkZWZhdWx0IHZhbHVlIG9mIDY0IGlzIHByb2JhYmx5IGZpbmUuIElmIHNvbWUgY29kZSBwcm9kdWNlcyBtb3JlCisJdGhhbiA2NCBlcnJvcnMgd2l0aGluIGFuIGlycXMtb2ZmIHNlY3Rpb24sIHRoZW4gdGhlIGNvZGUgaXMgbGlrZWx5IHRvCisJcHJvZHVjZSBtYW55LCBtYW55IG1vcmUsIHRvbywgYW5kIHRoZXNlIGFkZGl0aW9uYWwgcmVwb3J0cyBzZWxkb20gZ2l2ZQorCWFueSBtb3JlIGluZm9ybWF0aW9uICh0aGUgZmlyc3QgcmVwb3J0IGlzIHVzdWFsbHkgdGhlIG1vc3QgdmFsdWFibGUKKwlhbnl3YXkpLgorCisJVGhpcyBudW1iZXIgbWlnaHQgaGF2ZSB0byBiZSBhZGp1c3RlZCBpZiB5b3UgYXJlIG5vdCB1c2luZyBzZXJpYWwKKwljb25zb2xlIG9yIHNpbWlsYXIgdG8gY2FwdHVyZSB0aGUga2VybmVsIGxvZy4gSWYgeW91IGFyZSB1c2luZyB0aGUKKwkiZG1lc2ciIGNvbW1hbmQgdG8gc2F2ZSB0aGUgbG9nLCB0aGVuIGdldHRpbmcgYSBsb3Qgb2Yga21lbWNoZWNrCisJd2FybmluZ3MgbWlnaHQgb3ZlcmZsb3cgdGhlIGtlcm5lbCBsb2cgaXRzZWxmLCBhbmQgdGhlIGVhcmxpZXIgcmVwb3J0cworCXdpbGwgZ2V0IGxvc3QgaW4gdGhhdCB3YXkgaW5zdGVhZC4gVHJ5IHNldHRpbmcgdGhpcyB0byAxMCBvciBzbyBvbgorCXN1Y2ggYSBzZXR1cC4KKworLSBgYENPTkZJR19LTUVNQ0hFQ0tfU0hBRE9XX0NPUFlfU0hJRlRgYAorCVNlbGVjdCB0aGUgbnVtYmVyIG9mIHNoYWRvdyBieXRlcyB0byBzYXZlIGFsb25nIHdpdGggZWFjaCBlbnRyeSBvZiB0aGUKKwllcnJvci1yZXBvcnQgcXVldWUuIFRoZXNlIGJ5dGVzIGluZGljYXRlIHdoYXQgcGFydHMgb2YgYW4gYWxsb2NhdGlvbgorCWFyZSBpbml0aWFsaXplZCwgdW5pbml0aWFsaXplZCwgZXRjLiBhbmQgd2lsbCBiZSBkaXNwbGF5ZWQgd2hlbiBhbgorCWVycm9yIGlzIGRldGVjdGVkIHRvIGhlbHAgdGhlIGRlYnVnZ2luZyBvZiBhIHBhcnRpY3VsYXIgcHJvYmxlbS4KKworCVRoZSBudW1iZXIgZW50ZXJlZCBoZXJlIGlzIGFjdHVhbGx5IHRoZSBsb2dhcml0aG0gb2YgdGhlIG51bWJlciBvZgorCWJ5dGVzIHRoYXQgd2lsbCBiZSBzYXZlZC4gU28gaWYgeW91IHBpY2sgZm9yIGV4YW1wbGUgNSBoZXJlLCBrbWVtY2hlY2sKKwl3aWxsIHNhdmUgMl41ID0gMzIgYnl0ZXMuCisKKwlUaGUgZGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgZmluZSBmb3IgZGVidWdnaW5nIG1vc3QgcHJvYmxlbXMuIEl0IGFsc28KKwlmaXRzIG5pY2VseSB3aXRoaW4gODAgY29sdW1ucy4KKworLSBgYENPTkZJR19LTUVNQ0hFQ0tfUEFSVElBTF9PS2BgCisJVGhpcyBvcHRpb24gKHdoZW4gZW5hYmxlZCkgd29ya3MgYXJvdW5kIGNlcnRhaW4gR0NDIG9wdGltaXphdGlvbnMgdGhhdAorCXByb2R1Y2UgMzItYml0IHJlYWRzIGZyb20gMTYtYml0IHZhcmlhYmxlcyB3aGVyZSB0aGUgdXBwZXIgMTYgYml0cyBhcmUKKwl0aHJvd24gYXdheSBhZnRlcndhcmRzLgorCisJVGhlIGRlZmF1bHQgdmFsdWUgKGVuYWJsZWQpIGlzIHJlY29tbWVuZGVkLiBUaGlzIG1heSBvZiBjb3Vyc2UgaGlkZQorCXNvbWUgcmVhbCBlcnJvcnMsIGJ1dCBkaXNhYmxpbmcgaXQgd291bGQgcHJvYmFibHkgcHJvZHVjZSBhIGxvdCBvZgorCWZhbHNlIHBvc2l0aXZlcy4KKworLSBgYENPTkZJR19LTUVNQ0hFQ0tfQklUT1BTX09LYGAKKwlUaGlzIG9wdGlvbiBzaWxlbmNlcyB3YXJuaW5ncyB0aGF0IHdvdWxkIGJlIGdlbmVyYXRlZCBmb3IgYml0LWZpZWxkCisJYWNjZXNzZXMgd2hlcmUgbm90IGFsbCB0aGUgYml0cyBhcmUgaW5pdGlhbGl6ZWQgYXQgdGhlIHNhbWUgdGltZS4gVGhpcworCW1heSBhbHNvIGhpZGUgc29tZSByZWFsIGJ1Z3MuCisKKwlUaGlzIG9wdGlvbiBpcyBwcm9iYWJseSBvYnNvbGV0ZSwgb3IgaXQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGgKKwl0aGUga21lbWNoZWNrLS9iaXRmaWVsZC1hbm5vdGF0aW9ucyBmb3IgdGhlIGNvZGUgaW4gcXVlc3Rpb24uIFRoZQorCWRlZmF1bHQgdmFsdWUgaXMgdGhlcmVmb3JlIGZpbmUuCisKK05vdyBjb21waWxlIHRoZSBrZXJuZWwgYXMgdXN1YWwuCisKKworSG93IHRvIHVzZQorLS0tLS0tLS0tLQorCitCb290aW5nCit+fn5+fn5+CisKK0ZpcnN0IHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zLiBUaGVyZSBpcyBvbmx5IG9uZQorb3B0aW9uIHNwZWNpZmljIHRvIGttZW1jaGVjaywgYW5kIHRoaXMgaXMgY2FsbGVkICJrbWVtY2hlY2siLiBJdCBjYW4gYmUgdXNlZAordG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbW9kZSBhcyBjaG9zZW4gYnkgdGhlIGBgQ09ORklHX0tNRU1DSEVDS18qX0JZX0RFRkFVTFRgYAorb3B0aW9uLiBJdHMgcG9zc2libGUgc2V0dGluZ3MgYXJlOgorCistIGBga21lbWNoZWNrPTBgYCAoZGlzYWJsZWQpCistIGBga21lbWNoZWNrPTFgYCAoZW5hYmxlZCkKKy0gYGBrbWVtY2hlY2s9MmBgIChvbmUtc2hvdCBtb2RlKQorCitJZiBTTFVCIGRlYnVnZ2luZyBoYXMgYmVlbiBlbmFibGVkIGluIHRoZSBrZXJuZWwsIGl0IG1heSB0YWtlIHByZWNlZGVuY2Ugb3Zlcgora21lbWNoZWNrIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgc2xhYiBjYWNoZXMgd2hpY2ggYXJlIHVuZGVyIFNMVUIgZGVidWdnaW5nCit3aWxsIG5vdCBiZSB0cmFja2VkIGJ5IGttZW1jaGVjay4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhpcyBkb2Vzbid0IGhhcHBlbgorKGV2ZW4gdGhvdWdoIGl0IHNob3VsZG4ndCBieSBkZWZhdWx0KSwgdXNlIFNMVUIncyBib290IG9wdGlvbiBgYHNsdWJfZGVidWdgYCwKK2xpa2UgdGhpczogYGBzbHViX2RlYnVnPS1gYAorCitJbiBmYWN0LCB0aGlzIG9wdGlvbiBtYXkgYWxzbyBiZSB1c2VkIGZvciBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIFNMVUIgdnMuCitrbWVtY2hlY2suIEZvciBleGFtcGxlLCBpZiB0aGUgY29tbWFuZCBsaW5lIGluY2x1ZGVzCitgYGttZW1jaGVjaz0xIHNsdWJfZGVidWc9LGRlbnRyeWBgLCB0aGVuIFNMVUIgZGVidWdnaW5nIHdpbGwgYmUgdXNlZCBvbmx5Citmb3IgdGhlICJkZW50cnkiIHNsYWIgY2FjaGUsIGFuZCB3aXRoIGttZW1jaGVjayB0cmFja2luZyBhbGwgdGhlIG90aGVyCitjYWNoZXMuIFRoaXMgaXMgYWR2YW5jZWQgdXNhZ2UsIGhvd2V2ZXIsIGFuZCBpcyBub3QgZ2VuZXJhbGx5IHJlY29tbWVuZGVkLgorCisKK1J1bi10aW1lIGVuYWJsZS9kaXNhYmxlCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitXaGVuIHRoZSBrZXJuZWwgaGFzIGJvb3RlZCwgaXQgaXMgcG9zc2libGUgdG8gZW5hYmxlIG9yIGRpc2FibGUga21lbWNoZWNrIGF0CitydW4tdGltZS4gV0FSTklORzogVGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNhdXNlIGZhbHNlCitwb3NpdGl2ZSB3YXJuaW5ncyB0byBhcHBlYXIuIFRoZXJlZm9yZSwgdHJ5IG5vdCB0byB1c2UgdGhpcy4gSWYgeW91IGZpbmQgdGhhdAoraXQgZG9lc24ndCB3b3JrIHByb3Blcmx5IChlLmcuIHlvdSBzZWUgYW4gdW5yZWFzb25hYmxlIGFtb3VudCBvZiB3YXJuaW5ncyksIEkKK3dpbGwgYmUgaGFwcHkgdG8gdGFrZSBidWcgcmVwb3J0cy4KKworVXNlIHRoZSBmaWxlIGBgL3Byb2Mvc3lzL2tlcm5lbC9rbWVtY2hlY2tgYCBmb3IgdGhpcyBwdXJwb3NlLCBlLmcuOjoKKworCSQgZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9rbWVtY2hlY2sgIyBkaXNhYmxlcyBrbWVtY2hlY2sKKworVGhlIG51bWJlcnMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgYGBrbWVtY2hlY2s9YGAgY29tbWFuZC1saW5lIG9wdGlvbi4KKworCitEZWJ1Z2dpbmcKK35+fn5+fn5+fgorCitBIHR5cGljYWwgcmVwb3J0IHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOjoKKworICAgIFdBUk5JTkc6IGttZW1jaGVjazogQ2F1Z2h0IDMyLWJpdCByZWFkIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkgKGZmZmY4ODAwM2U0YTIwMjQpCisgICAgODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODhmZmZmMDAwMDAwMDAwMDAwMDAwMAorICAgICBpIGkgaSBpIHUgdSB1IHUgaSBpIGkgaSBpIGkgaSBpIHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUKKyAgICAgICAgICAgICBeCisKKyAgICBQaWQ6IDE4NTYsIGNvbW06IG50cGRhdGUgTm90IHRhaW50ZWQgMi42LjI5LXJjNSAjMjY0IDk0NVAtQQorICAgIFJJUDogMDAxMDpbPGZmZmZmZmZmODEwNGVkZTg+XSAgWzxmZmZmZmZmZjgxMDRlZGU4Pl0gX19kZXF1ZXVlX3NpZ25hbCsweGM4LzB4MTkwCisgICAgUlNQOiAwMDE4OmZmZmY4ODAwM2NkZjdkOTggIEVGTEFHUzogMDAyMTAwMDIKKyAgICBSQVg6IDAwMDAwMDAwMDAwMDAwMzAgUkJYOiBmZmZmODgwMDNkNGVhOTY4IFJDWDogMDAwMDAwMDAwMDAwMDAwOQorICAgIFJEWDogZmZmZjg4MDAzZTVkNjAxOCBSU0k6IGZmZmY4ODAwM2U1ZDYwMjQgUkRJOiBmZmZmODgwMDNjZGY3ZTg0CisgICAgUkJQOiBmZmZmODgwMDNjZGY3ZGI4IFIwODogZmZmZjg4MDAzZTVkNjAwMCBSMDk6IDAwMDAwMDAwMDAwMDAwMDAKKyAgICBSMTA6IDAwMDAwMDAwMDAwMDAwODAgUjExOiAwMDAwMDAwMDAwMDAwMDAwIFIxMjogMDAwMDAwMDAwMDAwMDAwZQorICAgIFIxMzogZmZmZjg4MDAzY2RmN2U3OCBSMTQ6IGZmZmY4ODAwM2Q1MzA3MTAgUjE1OiBmZmZmODgwMDNkNWE5OGM4CisgICAgRlM6ICAwMDAwMDAwMDAwMDAwMDAwKDAwMDApIEdTOmZmZmY4ODAwMDE5ODIwMDAoMDA2Mykga25sR1M6MDAwMDAKKyAgICBDUzogIDAwMTAgRFM6IDAwMmIgRVM6IDAwMmIgQ1IwOiAwMDAwMDAwMDgwMDUwMDMzCisgICAgQ1IyOiBmZmZmODgwMDNmODA2ZWEwIENSMzogMDAwMDAwMDAzYzAzNjAwMCBDUjQ6IDAwMDAwMDAwMDAwMDA2YTAKKyAgICBEUjA6IDAwMDAwMDAwMDAwMDAwMDAgRFIxOiAwMDAwMDAwMDAwMDAwMDAwIERSMjogMDAwMDAwMDAwMDAwMDAwMAorICAgIERSMzogMDAwMDAwMDAwMDAwMDAwMCBEUjY6IDAwMDAwMDAwZmZmZjRmZjAgRFI3OiAwMDAwMDAwMDAwMDAwNDAwCisgICAgIFs8ZmZmZmZmZmY4MTA0ZjA0ZT5dIGRlcXVldWVfc2lnbmFsKzB4OGUvMHgxNzAKKyAgICAgWzxmZmZmZmZmZjgxMDUwYmQ4Pl0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKzB4OTgvMHgzOTAKKyAgICAgWzxmZmZmZmZmZjgxMDBiODdkPl0gZG9fbm90aWZ5X3Jlc3VtZSsweGFkLzB4N2QwCisgICAgIFs8ZmZmZmZmZmY4MTAwYzdiNT5dIGludF9zaWduYWwrMHgxMi8weDE3CisgICAgIFs8ZmZmZmZmZmZmZmZmZmZmZj5dIDB4ZmZmZmZmZmZmZmZmZmZmZgorCitUaGUgc2luZ2xlIG1vc3QgdmFsdWFibGUgaW5mb3JtYXRpb24gaW4gdGhpcyByZXBvcnQgaXMgdGhlIFJJUCAob3IgRUlQIG9uIDMyLQorYml0KSB2YWx1ZS4gVGhpcyB3aWxsIGhlbHAgdXMgcGlucG9pbnQgZXhhY3RseSB3aGljaCBpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZAordGhlIHdhcm5pbmcuCisKK0lmIHlvdXIga2VybmVsIHdhcyBjb21waWxlZCB3aXRoIGBgQ09ORklHX0RFQlVHX0lORk89eWBgLCB0aGVuIGFsbCB3ZSBoYXZlIHRvIGRvCitpcyBnaXZlIHRoaXMgYWRkcmVzcyB0byB0aGUgYWRkcjJsaW5lIHByb2dyYW0sIGxpa2UgdGhpczo6CisKKwkkIGFkZHIybGluZSAtZSB2bWxpbnV4IC1pIGZmZmZmZmZmODEwNGVkZTgKKwlhcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdHJpbmdfNjQuaDoxMgorCWluY2x1ZGUvYXNtLWdlbmVyaWMvc2lnaW5mby5oOjI4NworCWtlcm5lbC9zaWduYWwuYzozODAKKwlrZXJuZWwvc2lnbmFsLmM6NDEwCisKK1RoZSAiYGAtZSB2bWxpbnV4YGAiIHRlbGxzIGFkZHIybGluZSB3aGljaCBmaWxlIHRvIGxvb2sgaW4uICoqSU1QT1JUQU5UOioqCitUaGlzIG11c3QgYmUgdGhlIHZtbGludXggb2YgdGhlIGtlcm5lbCB0aGF0IHByb2R1Y2VkIHRoZSB3YXJuaW5nIGluIHRoZQorZmlyc3QgcGxhY2UhIElmIG5vdCwgdGhlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZQord3JvbmcuCisKK1RoZSAiYGAtaWBgIiB0ZWxscyBhZGRyMmxpbmUgdG8gYWxzbyBwcmludCB0aGUgbGluZSBudW1iZXJzIG9mIGlubGluZWQKK2Z1bmN0aW9ucy4gIEluIHRoaXMgY2FzZSwgdGhlIGZsYWcgd2FzIHZlcnkgaW1wb3J0YW50LCBiZWNhdXNlIG90aGVyd2lzZSwKK2l0IHdvdWxkIG9ubHkgaGF2ZSBwcmludGVkIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBpcyBqdXN0IGEgY2FsbCB0bworYGBtZW1jcHkoKWBgLCB3aGljaCBjb3VsZCBiZSBjYWxsZWQgZnJvbSBhIHRob3VzYW5kIHBsYWNlcyBpbiB0aGUga2VybmVsLCBhbmQKK2lzIHRoZXJlZm9yZSBub3QgdmVyeSB1c2VmdWwuICBUaGVzZSBpbmxpbmVkIGZ1bmN0aW9ucyB3b3VsZCBub3Qgc2hvdyB1cCBpbgordGhlIHN0YWNrIHRyYWNlIGFib3ZlLCBzaW1wbHkgYmVjYXVzZSB0aGUga2VybmVsIGRvZXNuJ3QgbG9hZCB0aGUgZXh0cmEKK2RlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhpcyB0ZWNobmlxdWUgY2FuIG9mIGNvdXJzZSBiZSB1c2VkIHdpdGggb3JkaW5hcnkKK2tlcm5lbCBvb3BzZXMgYXMgd2VsbC4KKworSW4gdGhpcyBjYXNlLCBpdCdzIHRoZSBjYWxsZXIgb2YgYGBtZW1jcHkoKWBgIHRoYXQgaXMgaW50ZXJlc3RpbmcsIGFuZCBpdCBjYW4gYmUKK2ZvdW5kIGluIGBgaW5jbHVkZS9hc20tZ2VuZXJpYy9zaWdpbmZvLmhgYCwgbGluZSAyODc6OgorCisgICAgMjgxIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3NpZ2luZm8oc3RydWN0IHNpZ2luZm8gKnRvLCBzdHJ1Y3Qgc2lnaW5mbyAqZnJvbSkKKyAgICAyODIgeworICAgIDI4MyAgICAgICAgIGlmIChmcm9tLT5zaV9jb2RlIDwgMCkKKyAgICAyODQgICAgICAgICAgICAgICAgIG1lbWNweSh0bywgZnJvbSwgc2l6ZW9mKCp0bykpOworICAgIDI4NSAgICAgICAgIGVsc2UKKyAgICAyODYgICAgICAgICAgICAgICAgIC8qIF9zaWdjaGxkIGlzIGN1cnJlbnRseSB0aGUgbGFyZ2VzdCBrbm93IHVuaW9uIG1lbWJlciAqLworICAgIDI4NyAgICAgICAgICAgICAgICAgbWVtY3B5KHRvLCBmcm9tLCBfX0FSQ0hfU0lfUFJFQU1CTEVfU0laRSArIHNpemVvZihmcm9tLT5fc2lmaWVsZHMuX3NpZ2NobGQpKTsKKyAgICAyODggfQorCitTaW5jZSB0aGlzIHdhcyBhIHJlYWQgKGttZW1jaGVjayB1c3VhbGx5IHdhcm5zIGFib3V0IHJlYWRzIG9ubHksIHRob3VnaCBpdCBjYW4KK3dhcm4gYWJvdXQgd3JpdGVzIHRvIHVuYWxsb2NhdGVkIG9yIGZyZWVkIG1lbW9yeSBhcyB3ZWxsKSwgaXQgd2FzIHByb2JhYmx5IHRoZQorImZyb20iIGFyZ3VtZW50IHdoaWNoIGNvbnRhaW5lZCBzb21lIHVuaW5pdGlhbGl6ZWQgYnl0ZXMuIEZvbGxvd2luZyB0aGUgY2hhaW4KK29mIGNhbGxzLCB3ZSBtb3ZlIHVwd2FyZHMgdG8gc2VlIHdoZXJlICJmcm9tIiB3YXMgYWxsb2NhdGVkIG9yIGluaXRpYWxpemVkLAorYGBrZXJuZWwvc2lnbmFsLmNgYCwgbGluZSAzODA6OgorCisgICAgMzU5IHN0YXRpYyB2b2lkIGNvbGxlY3Rfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBzaWdwZW5kaW5nICpsaXN0LCBzaWdpbmZvX3QgKmluZm8pCisgICAgMzYwIHsKKyAgICAuLi4KKyAgICAzNjcgICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZsaXN0LT5saXN0LCBsaXN0KSB7CisgICAgMzY4ICAgICAgICAgICAgICAgICBpZiAocS0+aW5mby5zaV9zaWdubyA9PSBzaWcpIHsKKyAgICAzNjkgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQorICAgIDM3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc3RpbGxfcGVuZGluZzsKKyAgICAzNzEgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBxOworICAgIC4uLgorICAgIDM3NyAgICAgICAgIGlmIChmaXJzdCkgeworICAgIDM3OCBzdGlsbF9wZW5kaW5nOgorICAgIDM3OSAgICAgICAgICAgICAgICAgbGlzdF9kZWxfaW5pdCgmZmlyc3QtPmxpc3QpOworICAgIDM4MCAgICAgICAgICAgICAgICAgY29weV9zaWdpbmZvKGluZm8sICZmaXJzdC0+aW5mbyk7CisgICAgMzgxICAgICAgICAgICAgICAgICBfX3NpZ3F1ZXVlX2ZyZWUoZmlyc3QpOworICAgIC4uLgorICAgIDM5MiAgICAgICAgIH0KKyAgICAzOTMgfQorCitIZXJlLCBpdCBpcyBgYCZmaXJzdC0+aW5mb2BgIHRoYXQgaXMgYmVpbmcgcGFzc2VkIG9uIHRvIGBgY29weV9zaWdpbmZvKClgYC4gVGhlCit2YXJpYWJsZSBgYGZpcnN0YGAgd2FzIGZvdW5kIG9uIGEgbGlzdCAtLSBwYXNzZWQgaW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0bworYGBjb2xsZWN0X3NpZ25hbCgpYGAuIFdlICBjb250aW51ZSBvdXIgam91cm5leSB0aHJvdWdoIHRoZSBzdGFjaywgdG8gZmlndXJlIG91dAord2hlcmUgdGhlIGl0ZW0gb24gImxpc3QiIHdhcyBhbGxvY2F0ZWQgb3IgaW5pdGlhbGl6ZWQuIFdlIG1vdmUgdG8gbGluZSA0MTA6OgorCisgICAgMzk1IHN0YXRpYyBpbnQgX19kZXF1ZXVlX3NpZ25hbChzdHJ1Y3Qgc2lncGVuZGluZyAqcGVuZGluZywgc2lnc2V0X3QgKm1hc2ssCisgICAgMzk2ICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ2luZm9fdCAqaW5mbykKKyAgICAzOTcgeworICAgIC4uLgorICAgIDQxMCAgICAgICAgICAgICAgICAgY29sbGVjdF9zaWduYWwoc2lnLCBwZW5kaW5nLCBpbmZvKTsKKyAgICAuLi4KKyAgICA0MTQgfQorCitOb3cgd2UgbmVlZCB0byBmb2xsb3cgdGhlIGBgcGVuZGluZ2BgIHBvaW50ZXIsIHNpbmNlIHRoYXQgaXMgYmVpbmcgcGFzc2VkIG9uIHRvCitgYGNvbGxlY3Rfc2lnbmFsKClgYCBhcyBgYGxpc3RgYC4gQXQgdGhpcyBwb2ludCwgd2UndmUgcnVuIG91dCBvZiBsaW5lcyBmcm9tIHRoZQorImFkZHIybGluZSIgb3V0cHV0LiBOb3QgdG8gd29ycnksIHdlIGp1c3QgcGFzdGUgdGhlIG5leHQgYWRkcmVzc2VzIGZyb20gdGhlCitrbWVtY2hlY2sgc3RhY2sgZHVtcCwgaS5lLjo6CisKKyAgICAgWzxmZmZmZmZmZjgxMDRmMDRlPl0gZGVxdWV1ZV9zaWduYWwrMHg4ZS8weDE3MAorICAgICBbPGZmZmZmZmZmODEwNTBiZDg+XSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIrMHg5OC8weDM5MAorICAgICBbPGZmZmZmZmZmODEwMGI4N2Q+XSBkb19ub3RpZnlfcmVzdW1lKzB4YWQvMHg3ZDAKKyAgICAgWzxmZmZmZmZmZjgxMDBjN2I1Pl0gaW50X3NpZ25hbCsweDEyLzB4MTcKKworCSQgYWRkcjJsaW5lIC1lIHZtbGludXggLWkgZmZmZmZmZmY4MTA0ZjA0ZSBmZmZmZmZmZjgxMDUwYmQ4IFwKKwkJZmZmZmZmZmY4MTAwYjg3ZCBmZmZmZmZmZjgxMDBjN2I1CisJa2VybmVsL3NpZ25hbC5jOjQ0NgorCWtlcm5lbC9zaWduYWwuYzoxODA2CisJYXJjaC94ODYva2VybmVsL3NpZ25hbC5jOjgwNQorCWFyY2gveDg2L2tlcm5lbC9zaWduYWwuYzo4NzEKKwlhcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUzo2OTQKKworUmVtZW1iZXIgdGhhdCBzaW5jZSB0aGVzZSBhZGRyZXNzZXMgd2VyZSBmb3VuZCBvbiB0aGUgc3RhY2sgYW5kIG5vdCBhcyB0aGUKK1JJUCB2YWx1ZSwgdGhleSBhY3R1YWxseSBwb2ludCB0byB0aGUgX25leHRfIGluc3RydWN0aW9uICh0aGV5IGFyZSByZXR1cm4KK2FkZHJlc3NlcykuIFRoaXMgYmVjb21lcyBvYnZpb3VzIHdoZW4gd2UgbG9vayBhdCB0aGUgY29kZSBmb3IgbGluZSA0NDY6OgorCisgICAgNDIyIGludCBkZXF1ZXVlX3NpZ25hbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc2lnc2V0X3QgKm1hc2ssIHNpZ2luZm9fdCAqaW5mbykKKyAgICA0MjMgeworICAgIC4uLgorICAgIDQzMSAgICAgICAgICAgICAgICAgc2lnbnIgPSBfX2RlcXVldWVfc2lnbmFsKCZ0c2stPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcsCisgICAgNDMyCQkJCQkJIG1hc2ssIGluZm8pOworICAgIDQzMwkJCS8qCisgICAgNDM0CQkJICogaXRpbWVyIHNpZ25hbCA/CisgICAgNDM1CQkJICoKKyAgICA0MzYJCQkgKiBpdGltZXJzIGFyZSBwcm9jZXNzIHNoYXJlZCBhbmQgd2UgcmVzdGFydCBwZXJpb2RpYworICAgIDQzNwkJCSAqIGl0aW1lcnMgaW4gdGhlIHNpZ25hbCBkZWxpdmVyeSBwYXRoIHRvIHByZXZlbnQgRG9TCisgICAgNDM4CQkJICogYXR0YWNrcyBpbiB0aGUgaGlnaCByZXNvbHV0aW9uIHRpbWVyIGNhc2UuIFRoaXMgaXMKKyAgICA0MzkJCQkgKiBjb21wbGlhbnQgd2l0aCB0aGUgb2xkIHdheSBvZiBzZWxmIHJlc3RhcnRpbmcKKyAgICA0NDAJCQkgKiBpdGltZXJzLCBhcyB0aGUgU0lHQUxSTSBpcyBhIGxlZ2FjeSBzaWduYWwgYW5kIG9ubHkKKyAgICA0NDEJCQkgKiBxdWV1ZWQgb25jZS4gQ2hhbmdpbmcgdGhlIHJlc3RhcnQgYmVoYXZpb3VyIHRvCisgICAgNDQyCQkJICogcmVzdGFydCB0aGUgdGltZXIgaW4gdGhlIHNpZ25hbCBkZXF1ZXVlIHBhdGggaXMKKyAgICA0NDMJCQkgKiByZWR1Y2luZyB0aGUgdGltZXIgbm9pc2Ugb24gaGVhdnkgbG9hZGVkICFoaWdocmVzCisgICAgNDQ0CQkJICogc3lzdGVtcyB0b28uCisgICAgNDQ1CQkJICovCisgICAgNDQ2CQkJaWYgKHVubGlrZWx5KHNpZ25yID09IFNJR0FMUk0pKSB7CisgICAgLi4uCisgICAgNDg5IH0KKworU28gaW5zdGVhZCBvZiBsb29raW5nIGF0IDQ0Niwgd2Ugc2hvdWxkIGJlIGxvb2tpbmcgYXQgNDMxLCB3aGljaCBpcyB0aGUgbGluZQordGhhdCBleGVjdXRlcyBqdXN0IGJlZm9yZSA0NDYuIEhlcmUgd2Ugc2VlIHRoYXQgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IgaXMKK2BgJnRzay0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZ2BgLgorCitPdXIgbmV4dCB0YXNrIGlzIG5vdyB0byBmaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRoYXQgcHV0cyBpdGVtcyBvbiB0aGlzCitgYHNoYXJlZF9wZW5kaW5nYGAgbGlzdC4gQSBjcnVkZSwgYnV0IGVmZmljaWVudCB0b29sLCBpcyBgYGdpdCBncmVwYGA6OgorCisJJCBnaXQgZ3JlcCAtbiAnc2hhcmVkX3BlbmRpbmcnIGtlcm5lbC8KKwkuLi4KKwlrZXJuZWwvc2lnbmFsLmM6ODI4OglwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOworCWtlcm5lbC9zaWduYWwuYzoxMzM5OglwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOworCS4uLgorCitUaGVyZSB3ZXJlIG1vcmUgcmVzdWx0cywgYnV0IG5vbmUgb2YgdGhlbSB3ZXJlIHJlbGF0ZWQgdG8gbGlzdCBvcGVyYXRpb25zLAorYW5kIHRoZXNlIHdlcmUgdGhlIG9ubHkgYXNzaWdubWVudHMuIFdlIGluc3BlY3QgdGhlIGxpbmUgbnVtYmVycyBtb3JlIGNsb3NlbHkKK2FuZCBmaW5kIHRoYXQgdGhpcyBpcyBpbmRlZWQgd2hlcmUgaXRlbXMgYXJlIGJlaW5nIGFkZGVkIHRvIHRoZSBsaXN0OjoKKworICAgIDgxNiBzdGF0aWMgaW50IHNlbmRfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsCisgICAgODE3CQkJCWludCBncm91cCkKKyAgICA4MTggeworICAgIC4uLgorICAgIDgyOAkJcGVuZGluZyA9IGdyb3VwID8gJnQtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcgOiAmdC0+cGVuZGluZzsKKyAgICAuLi4KKyAgICA4NTEJCXEgPSBfX3NpZ3F1ZXVlX2FsbG9jKHQsIEdGUF9BVE9NSUMsIChzaWcgPCBTSUdSVE1JTiAmJgorICAgIDg1MgkJCQkJCSAgICAgKGlzX3NpX3NwZWNpYWwoaW5mbykgfHwKKyAgICA4NTMJCQkJCQkgICAgICBpbmZvLT5zaV9jb2RlID49IDApKSk7CisgICAgODU0CQlpZiAocSkgeworICAgIDg1NQkJCWxpc3RfYWRkX3RhaWwoJnEtPmxpc3QsICZwZW5kaW5nLT5saXN0KTsKKyAgICAuLi4KKyAgICA4OTAgfQorCithbmQ6OgorCisgICAgMTMwOSBpbnQgc2VuZF9zaWdxdWV1ZShzdHJ1Y3Qgc2lncXVldWUgKnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGdyb3VwKQorICAgIDEzMTAgeworICAgIC4uLi4KKyAgICAxMzM5CSBwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOworICAgIDEzNDAJIGxpc3RfYWRkX3RhaWwoJnEtPmxpc3QsICZwZW5kaW5nLT5saXN0KTsKKyAgICAuLi4uCisgICAgMTM0NyB9CisKK0luIHRoZSBmaXJzdCBjYXNlLCB0aGUgbGlzdCBlbGVtZW50IHdlIGFyZSBsb29raW5nIGZvciwgYGBxYGAsIGlzIGJlaW5nCityZXR1cm5lZCBmcm9tIHRoZSBmdW5jdGlvbiBgYF9fc2lncXVldWVfYWxsb2MoKWBgLCB3aGljaCBsb29rcyBsaWtlIGFuCithbGxvY2F0aW9uIGZ1bmN0aW9uLiAgTGV0J3MgdGFrZSBhIGxvb2sgYXQgaXQ6OgorCisgICAgMTg3IHN0YXRpYyBzdHJ1Y3Qgc2lncXVldWUgKl9fc2lncXVldWVfYWxsb2Moc3RydWN0IHRhc2tfc3RydWN0ICp0LCBnZnBfdCBmbGFncywKKyAgICAxODgJCQkJCQkgaW50IG92ZXJyaWRlX3JsaW1pdCkKKyAgICAxODkgeworICAgIDE5MAkJc3RydWN0IHNpZ3F1ZXVlICpxID0gTlVMTDsKKyAgICAxOTEJCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcjsKKyAgICAxOTIKKyAgICAxOTMJCS8qCisgICAgMTk0CQkgKiBXZSB3b24ndCBnZXQgcHJvYmxlbXMgd2l0aCB0aGUgdGFyZ2V0J3MgVUlEIGNoYW5naW5nIHVuZGVyIHVzCisgICAgMTk1CQkgKiBiZWNhdXNlIGNoYW5naW5nIGl0IHJlcXVpcmVzIFJDVSBiZSB1c2VkLCBhbmQgaWYgdCAhPSBjdXJyZW50LCB0aGUKKyAgICAxOTYJCSAqIGNhbGxlciBtdXN0IGJlIGhvbGRpbmcgdGhlIFJDVSByZWFkbG9jayAoYnkgd2F5IG9mIGEgc3BpbmxvY2spIGFuZAorICAgIDE5NwkJICogd2UgdXNlIFJDVSBwcm90ZWN0aW9uIGhlcmUKKyAgICAxOTgJCSAqLworICAgIDE5OQkJdXNlciA9IGdldF91aWQoX190YXNrX2NyZWQodCktPnVzZXIpOworICAgIDIwMAkJYXRvbWljX2luYygmdXNlci0+c2lncGVuZGluZyk7CisgICAgMjAxCQlpZiAob3ZlcnJpZGVfcmxpbWl0IHx8CisgICAgMjAyCQkgICAgYXRvbWljX3JlYWQoJnVzZXItPnNpZ3BlbmRpbmcpIDw9CisgICAgMjAzCQkJCXQtPnNpZ25hbC0+cmxpbVtSTElNSVRfU0lHUEVORElOR10ucmxpbV9jdXIpCisgICAgMjA0CQkJcSA9IGttZW1fY2FjaGVfYWxsb2Moc2lncXVldWVfY2FjaGVwLCBmbGFncyk7CisgICAgMjA1CQlpZiAodW5saWtlbHkocSA9PSBOVUxMKSkgeworICAgIDIwNgkJCWF0b21pY19kZWMoJnVzZXItPnNpZ3BlbmRpbmcpOworICAgIDIwNwkJCWZyZWVfdWlkKHVzZXIpOworICAgIDIwOAkJfSBlbHNlIHsKKyAgICAyMDkJCQlJTklUX0xJU1RfSEVBRCgmcS0+bGlzdCk7CisgICAgMjEwCQkJcS0+ZmxhZ3MgPSAwOworICAgIDIxMQkJCXEtPnVzZXIgPSB1c2VyOworICAgIDIxMgkJfQorICAgIDIxMworICAgIDIxNAkJcmV0dXJuIHE7CisgICAgMjE1IH0KKworV2Ugc2VlIHRoYXQgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBgYHEtPmxpc3RgYCwgYGBxLT5mbGFnc2BgLCBhbmQKK2BgcS0+dXNlcmBgLiBJdCBzZWVtcyB0aGF0IG5vdyBpcyB0aGUgdGltZSB0byBsb29rIGF0IHRoZSBkZWZpbml0aW9uIG9mCitgYHN0cnVjdCBzaWdxdWV1ZWBgLCBlLmcuOjoKKworICAgIDE0IHN0cnVjdCBzaWdxdWV1ZSB7CisgICAgMTUJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKyAgICAxNgkgICAgICAgaW50IGZsYWdzOworICAgIDE3CSAgICAgICBzaWdpbmZvX3QgaW5mbzsKKyAgICAxOAkgICAgICAgc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOworICAgIDE5IH07CisKK0FuZCwgeW91IG1pZ2h0IHJlbWVtYmVyLCBpdCB3YXMgYSBgYG1lbWNweSgpYGAgb24gYGAmZmlyc3QtPmluZm9gYCB0aGF0CitjYXVzZWQgdGhlIHdhcm5pbmcsIHNvIHRoaXMgbWFrZXMgcGVyZmVjdCBzZW5zZS4gSXQgYWxzbyBzZWVtcyByZWFzb25hYmxlCit0byBhc3N1bWUgdGhhdCBpdCBpcyB0aGUgY2FsbGVyIG9mIGBgX19zaWdxdWV1ZV9hbGxvYygpYGAgdGhhdCBoYXMgdGhlCityZXNwb25zaWJpbGl0eSBvZiBmaWxsaW5nIG91dCAoaW5pdGlhbGl6aW5nKSB0aGlzIG1lbWJlci4KKworQnV0IGp1c3Qgd2hpY2ggZmllbGRzIG9mIHRoZSBzdHJ1Y3Qgd2VyZSB1bmluaXRpYWxpemVkPyBMZXQncyBsb29rIGF0CitrbWVtY2hlY2sncyByZXBvcnQgYWdhaW46OgorCisgICAgV0FSTklORzoga21lbWNoZWNrOiBDYXVnaHQgMzItYml0IHJlYWQgZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeSAoZmZmZjg4MDAzZTRhMjAyNCkKKyAgICA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4OGZmZmYwMDAwMDAwMDAwMDAwMDAwCisgICAgIGkgaSBpIGkgdSB1IHUgdSBpIGkgaSBpIGkgaSBpIGkgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdQorCSAgICAgXgorCitUaGVzZSBmaXJzdCB0d28gbGluZXMgYXJlIHRoZSBtZW1vcnkgZHVtcCBvZiB0aGUgbWVtb3J5IG9iamVjdCBpdHNlbGYsIGFuZAordGhlIHNoYWRvdyBieXRlbWFwLCByZXNwZWN0aXZlbHkuIFRoZSBtZW1vcnkgb2JqZWN0IGl0c2VsZiBpcyBpbiB0aGlzIGNhc2UKK2BgJmZpcnN0LT5pbmZvYGAuIEp1c3QgYmV3YXJlIHRoYXQgdGhlIHN0YXJ0IG9mIHRoaXMgZHVtcCBpcyBOT1QgdGhlIHN0YXJ0CitvZiB0aGUgb2JqZWN0IGl0c2VsZiEgVGhlIHBvc2l0aW9uIG9mIHRoZSBjYXJldCAoXikgY29ycmVzcG9uZHMgd2l0aCB0aGUKK2FkZHJlc3Mgb2YgdGhlIHJlYWQgKGZmZmY4ODAwM2U0YTIwMjQpLgorCitUaGUgc2hhZG93IGJ5dGVtYXAgZHVtcCBsZWdlbmQgaXMgYXMgZm9sbG93czoKKworLSBpOiBpbml0aWFsaXplZAorLSB1OiB1bmluaXRpYWxpemVkCistIGE6IHVuYWxsb2NhdGVkIChtZW1vcnkgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSBzbGFiIGxheWVyLCBidXQgaGFzIG5vdAorICB5ZXQgYmVlbiBoYW5kZWQgb2ZmIHRvIGFueWJvZHkpCistIGY6IGZyZWVkIChtZW1vcnkgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSBzbGFiIGxheWVyLCBidXQgaGFzIGJlZW4gZnJlZWQKKyAgYnkgdGhlIHByZXZpb3VzIG93bmVyKQorCitJbiBvcmRlciB0byBmaWd1cmUgb3V0IHdoZXJlIChyZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIG9iamVjdCkgdGhlCit1bmluaXRpYWxpemVkIG1lbW9yeSB3YXMgbG9jYXRlZCwgd2UgaGF2ZSB0byBsb29rIGF0IHRoZSBkaXNhc3NlbWJseS4gRm9yCit0aGF0LCB3ZSdsbCBuZWVkIHRoZSBSSVAgYWRkcmVzcyBhZ2Fpbjo6CisKKyAgICBSSVA6IDAwMTA6WzxmZmZmZmZmZjgxMDRlZGU4Pl0gIFs8ZmZmZmZmZmY4MTA0ZWRlOD5dIF9fZGVxdWV1ZV9zaWduYWwrMHhjOC8weDE5MAorCisJJCBvYmpkdW1wIC1kIC0tbm8tc2hvdy1yYXctaW5zbiB2bWxpbnV4IHwgZ3JlcCAtQyA4IGZmZmZmZmZmODEwNGVkZTg6CisJZmZmZmZmZmY4MTA0ZWRjODoJbW92ICAgICVyOCwweDgoJXI4KQorCWZmZmZmZmZmODEwNGVkY2M6CXRlc3QgICAlcjEwZCwlcjEwZAorCWZmZmZmZmZmODEwNGVkY2Y6CWpzICAgICBmZmZmZmZmZjgxMDRlZTg4IDxfX2RlcXVldWVfc2lnbmFsKzB4MTY4PgorCWZmZmZmZmZmODEwNGVkZDU6CW1vdiAgICAlcmF4LCVyZHgKKwlmZmZmZmZmZjgxMDRlZGQ4Ogltb3YgICAgJDB4YywlZWN4CisJZmZmZmZmZmY4MTA0ZWRkZDoJbW92ICAgICVyMTMsJXJkaQorCWZmZmZmZmZmODEwNGVkZTA6CW1vdiAgICAkMHgzMCwlZWF4CisJZmZmZmZmZmY4MTA0ZWRlNToJbW92ICAgICVyZHgsJXJzaQorCWZmZmZmZmZmODEwNGVkZTg6CXJlcCBtb3ZzbCAlZHM6KCVyc2kpLCVlczooJXJkaSkKKwlmZmZmZmZmZjgxMDRlZGVhOgl0ZXN0ICAgJDB4MiwlYWwKKwlmZmZmZmZmZjgxMDRlZGVjOglqZSAgICAgZmZmZmZmZmY4MTA0ZWRmMCA8X19kZXF1ZXVlX3NpZ25hbCsweGQwPgorCWZmZmZmZmZmODEwNGVkZWU6CW1vdnN3ICAlZHM6KCVyc2kpLCVlczooJXJkaSkKKwlmZmZmZmZmZjgxMDRlZGYwOgl0ZXN0ICAgJDB4MSwlYWwKKwlmZmZmZmZmZjgxMDRlZGYyOglqZSAgICAgZmZmZmZmZmY4MTA0ZWRmNSA8X19kZXF1ZXVlX3NpZ25hbCsweGQ1PgorCWZmZmZmZmZmODEwNGVkZjQ6CW1vdnNiICAlZHM6KCVyc2kpLCVlczooJXJkaSkKKwlmZmZmZmZmZjgxMDRlZGY1Ogltb3YgICAgJXI4LCVyZGkKKwlmZmZmZmZmZjgxMDRlZGY4OgljYWxscSAgZmZmZmZmZmY4MTA0ZGU2MCA8X19zaWdxdWV1ZV9mcmVlPgorCitBcyBleHBlY3RlZCwgaXQncyB0aGUgImBgcmVwIG1vdnNsYGAiIGluc3RydWN0aW9uIGZyb20gdGhlIGBgbWVtY3B5KClgYAordGhhdCBjYXVzZXMgdGhlIHdhcm5pbmcuIFdlIGtub3cgYWJvdXQgYGBSRVAgTU9WU0xgYCB0aGF0IGl0IHVzZXMgdGhlIHJlZ2lzdGVyCitgYFJDWGBgIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGl0ZXJhdGlvbnMuIEJ5IHRha2luZyBhIGxvb2sgYXQgdGhlCityZWdpc3RlciBkdW1wIGFnYWluIChmcm9tIHRoZSBrbWVtY2hlY2sgcmVwb3J0KSwgd2UgY2FuIGZpZ3VyZSBvdXQgaG93IG1hbnkKK2J5dGVzIHdlcmUgbGVmdCB0byBjb3B5OjoKKworICAgIFJBWDogMDAwMDAwMDAwMDAwMDAzMCBSQlg6IGZmZmY4ODAwM2Q0ZWE5NjggUkNYOiAwMDAwMDAwMDAwMDAwMDA5CisKK0J5IGxvb2tpbmcgYXQgdGhlIGRpc2Fzc2VtYmx5LCB3ZSBhbHNvIHNlZSB0aGF0IGBgJWVjeGBgIGlzIGJlaW5nIGxvYWRlZAord2l0aCB0aGUgdmFsdWUgYGAkMHhjYGAganVzdCBiZWZvcmUgKGZmZmZmZmZmODEwNGVkZDgpLCBzbyB3ZSBhcmUgdmVyeQorbHVja3kuIEtlZXAgaW4gbWluZCB0aGF0IHRoaXMgaXMgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zLCBub3QgYnl0ZXMuIEFuZAorc2luY2UgdGhpcyBpcyBhICJsb25nIiBvcGVyYXRpb24sIHdlIG5lZWQgdG8gbXVsdGlwbHkgYnkgNCB0byBnZXQgdGhlCitudW1iZXIgb2YgYnl0ZXMuIFNvIHRoaXMgbWVhbnMgdGhhdCB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZSB3YXMgZW5jb3VudGVyZWQKK2F0IDQgKiAoMHhjIC0gMHg5KSA9IDEyIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBvYmplY3QuCisKK1dlIGNhbiBub3cgdHJ5IHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmllbGQgb2YgdGhlICJgYHN0cnVjdCBzaWdpbmZvYGAiIHRoYXQKK3dhcyBub3QgaW5pdGlhbGl6ZWQuIFRoaXMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0OjoKKworICAgIDQwIHR5cGVkZWYgc3RydWN0IHNpZ2luZm8geworICAgIDQxCSAgICAgICBpbnQgc2lfc2lnbm87CisgICAgNDIJICAgICAgIGludCBzaV9lcnJubzsKKyAgICA0MwkgICAgICAgaW50IHNpX2NvZGU7CisgICAgNDQKKyAgICA0NQkgICAgICAgdW5pb24geworICAgIC4uCisgICAgOTIJICAgICAgIH0gX3NpZmllbGRzOworICAgIDkzIH0gc2lnaW5mb190OworCitPbiA2NC1iaXQsIHRoZSBpbnQgaXMgNCBieXRlcyBsb25nLCBzbyBpdCBtdXN0IHRoZSB1bmlvbiBtZW1iZXIgdGhhdCBoYXMKK25vdCBiZWVuIGluaXRpYWxpemVkLiBXZSBjYW4gdmVyaWZ5IHRoaXMgdXNpbmcgZ2RiOjoKKworCSQgZ2RiIHZtbGludXgKKwkuLi4KKwkoZ2RiKSBwICYoKHN0cnVjdCBzaWdpbmZvICopIDApLT5fc2lmaWVsZHMKKwkkMSA9ICh1bmlvbiB7Li4ufSAqKSAweDEwCisKK0FjdHVhbGx5LCBpdCBzZWVtcyB0aGF0IHRoZSB1bmlvbiBtZW1iZXIgaXMgbG9jYXRlZCBhdCBvZmZzZXQgMHgxMCAtLSB3aGljaAorbWVhbnMgdGhhdCBnY2MgaGFzIGluc2VydGVkIDQgYnl0ZXMgb2YgcGFkZGluZyBiZXR3ZWVuIHRoZSBtZW1iZXJzIGBgc2lfY29kZWBgCithbmQgYGBfc2lmaWVsZHNgYC4gV2UgY2FuIG5vdyBnZXQgYSBmdWxsZXIgcGljdHVyZSBvZiB0aGUgbWVtb3J5IGR1bXA6OgorCisJCSBfLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT0+IHNpX2NvZGUKKwkJLwkgXy0tLS0tLS0tLS0tLS0tLS0tLS0tPT4gKHBhZGRpbmcpCisJICAgICAgIHwJLwkgXy0tLS0tLS0tLS0tLT0+IF9zaWZpZWxkcyguX2tpbGwuX3BpZCkKKwkgICAgICAgfCAgICAgICB8CS8JIF8tLS0tPT4gX3NpZmllbGRzKC5fa2lsbC5fdWlkKQorCSAgICAgICB8ICAgICAgIHwgICAgICAgfAkvCisJLS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXwKKwk4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4OGZmZmYwMDAwMDAwMDAwMDAwMDAwCisJIGkgaSBpIGkgdSB1IHUgdSBpIGkgaSBpIGkgaSBpIGkgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdQorCitUaGlzIGFsbG93cyB1cyB0byByZWFsaXplIGFub3RoZXIgaW1wb3J0YW50IGZhY3Q6IGBgc2lfY29kZWBgIGNvbnRhaW5zIHRoZQordmFsdWUgMHg4MC4gUmVtZW1iZXIgdGhhdCB4ODYgaXMgbGl0dGxlIGVuZGlhbiwgc28gdGhlIGZpcnN0IDQgYnl0ZXMKKyI4MDAwMDAwMCIgYXJlIHJlYWxseSB0aGUgbnVtYmVyIDB4MDAwMDAwODAuIFdpdGggYSBiaXQgb2YgcmVzZWFyY2gsIHdlCitmaW5kIHRoYXQgdGhpcyBpcyBhY3R1YWxseSB0aGUgY29uc3RhbnQgYGBTSV9LRVJORUxgYCBkZWZpbmVkIGluCitgYGluY2x1ZGUvYXNtLWdlbmVyaWMvc2lnaW5mby5oYGA6OgorCisgICAgMTQ0ICNkZWZpbmUgU0lfS0VSTkVMCTB4ODAJCS8qIHNlbnQgYnkgdGhlIGtlcm5lbCBmcm9tIHNvbWV3aGVyZQkgKi8KKworVGhpcyBtYWNybyBpcyB1c2VkIGluIGV4YWN0bHkgb25lIHBsYWNlIGluIHRoZSB4ODYga2VybmVsOiBJbiBgYHNlbmRfc2lnbmFsKClgYAoraW4gYGBrZXJuZWwvc2lnbmFsLmNgYDo6CisKKyAgICA4MTYgc3RhdGljIGludCBzZW5kX3NpZ25hbChpbnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHRhc2tfc3RydWN0ICp0LAorICAgIDgxNwkJCQlpbnQgZ3JvdXApCisgICAgODE4IHsKKyAgICAuLi4KKyAgICA4MjgJCXBlbmRpbmcgPSBncm91cCA/ICZ0LT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nIDogJnQtPnBlbmRpbmc7CisgICAgLi4uCisgICAgODUxCQlxID0gX19zaWdxdWV1ZV9hbGxvYyh0LCBHRlBfQVRPTUlDLCAoc2lnIDwgU0lHUlRNSU4gJiYKKyAgICA4NTIJCQkJCQkgICAgIChpc19zaV9zcGVjaWFsKGluZm8pIHx8CisgICAgODUzCQkJCQkJICAgICAgaW5mby0+c2lfY29kZSA+PSAwKSkpOworICAgIDg1NAkJaWYgKHEpIHsKKyAgICA4NTUJCQlsaXN0X2FkZF90YWlsKCZxLT5saXN0LCAmcGVuZGluZy0+bGlzdCk7CisgICAgODU2CQkJc3dpdGNoICgodW5zaWduZWQgbG9uZykgaW5mbykgeworICAgIC4uLgorICAgIDg2NQkJCWNhc2UgKHVuc2lnbmVkIGxvbmcpIFNFTkRfU0lHX1BSSVY6CisgICAgODY2CQkJCXEtPmluZm8uc2lfc2lnbm8gPSBzaWc7CisgICAgODY3CQkJCXEtPmluZm8uc2lfZXJybm8gPSAwOworICAgIDg2OAkJCQlxLT5pbmZvLnNpX2NvZGUgPSBTSV9LRVJORUw7CisgICAgODY5CQkJCXEtPmluZm8uc2lfcGlkID0gMDsKKyAgICA4NzAJCQkJcS0+aW5mby5zaV91aWQgPSAwOworICAgIDg3MQkJCQlicmVhazsKKyAgICAuLi4KKyAgICA4OTAgfQorCitOb3Qgb25seSBkb2VzIHRoaXMgbWF0Y2ggd2l0aCB0aGUgYGAuc2lfY29kZWBgIG1lbWJlciwgaXQgYWxzbyBtYXRjaGVzIHRoZSBwbGFjZQord2UgZm91bmQgZWFybGllciB3aGVuIGxvb2tpbmcgZm9yIHdoZXJlIHNpZ2luZm9fdCBvYmplY3RzIGFyZSBlbnF1ZXVlZCBvbiB0aGUKK2Bgc2hhcmVkX3BlbmRpbmdgYCBsaXN0LgorCitTbyB0byBzdW0gdXA6IEl0IHNlZW1zIHRoYXQgaXQgaXMgdGhlIHBhZGRpbmcgaW50cm9kdWNlZCBieSB0aGUgY29tcGlsZXIKK2JldHdlZW4gdHdvIHN0cnVjdCBmaWVsZHMgdGhhdCBpcyB1bmluaXRpYWxpemVkLCBhbmQgdGhpcyBnZXRzIHJlcG9ydGVkIHdoZW4KK3dlIGRvIGEgYGBtZW1jcHkoKWBgIG9uIHRoZSBzdHJ1Y3QuIFRoaXMgbWVhbnMgdGhhdCB3ZSBoYXZlIGlkZW50aWZpZWQgYSBmYWxzZQorcG9zaXRpdmUgd2FybmluZy4KKworTm9ybWFsbHksIGttZW1jaGVjayB3aWxsIG5vdCByZXBvcnQgdW5pbml0aWFsaXplZCBhY2Nlc3NlcyBpbiBgYG1lbWNweSgpYGAgY2FsbHMKK3doZW4gYm90aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgYXJlIHRyYWNrZWQuIChJbnN0ZWFkLCB3ZSBjb3B5Cit0aGUgc2hhZG93IGJ5dGVtYXAgYXMgd2VsbCkuIEluIHRoaXMgY2FzZSwgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgY2xlYXJseQord2FzIG5vdCB0cmFja2VkLiBXZSBjYW4gZGlnIGEgbGl0dGxlIGRlZXBlciBpbnRvIHRoZSBzdGFjayB0cmFjZSBmcm9tIGFib3ZlOjoKKworCWFyY2gveDg2L2tlcm5lbC9zaWduYWwuYzo4MDUKKwlhcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmM6ODcxCisJYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlM6Njk0CisKK0FuZCB3ZSBjbGVhcmx5IHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBzaWdpbmZvIG9iamVjdCBpcyBsb2NhdGVkIG9uIHRoZQorc3RhY2s6OgorCisgICAgNzgyIHN0YXRpYyB2b2lkIGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKKyAgICA3ODMgeworICAgIDc4NAkJc3RydWN0IGtfc2lnYWN0aW9uIGthOworICAgIDc4NQkJc2lnaW5mb190IGluZm87CisgICAgLi4uCisgICAgODA0CQlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKKyAgICAuLi4KKyAgICA4NTQgfQorCitBbmQgdGhpcyBgYCZpbmZvYGAgaXMgd2hhdCBldmVudHVhbGx5IGdldHMgcGFzc2VkIHRvIGBgY29weV9zaWdpbmZvKClgYCBhcyB0aGUKK2Rlc3RpbmF0aW9uIGFyZ3VtZW50LgorCitOb3csIGV2ZW4gdGhvdWdoIHdlIGRpZG4ndCBmaW5kIGFuIGFjdHVhbCBlcnJvciBoZXJlLCB0aGUgZXhhbXBsZSBpcyBzdGlsbCBhCitnb29kIG9uZSwgYmVjYXVzZSBpdCBzaG93cyBob3cgb25lIHdvdWxkIGdvIGFib3V0IHRvIGZpbmQgb3V0IHdoYXQgdGhlIHJlcG9ydAord2FzIGFsbCBhYm91dC4KKworCitBbm5vdGF0aW5nIGZhbHNlIHBvc2l0aXZlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlcmUgYXJlIGEgZmV3IGRpZmZlcmVudCB3YXlzIHRvIG1ha2UgYW5ub3RhdGlvbnMgaW4gdGhlIHNvdXJjZSBjb2RlIHRoYXQKK3dpbGwga2VlcCBrbWVtY2hlY2sgZnJvbSBjaGVja2luZyBhbmQgcmVwb3J0aW5nIGNlcnRhaW4gYWxsb2NhdGlvbnMuIEhlcmUKK3RoZXkgYXJlOgorCistIGBgX19HRlBfTk9UUkFDS19GQUxTRV9QT1NJVElWRWBgCisJVGhpcyBmbGFnIGNhbiBiZSBwYXNzZWQgdG8gYGBrbWFsbG9jKClgYCBvciBgYGttZW1fY2FjaGVfYWxsb2MoKWBgCisJKHRoZXJlZm9yZSBhbHNvIHRvIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVuZCB1cCBjYWxsaW5nIG9uZSBvZgorCXRoZXNlKSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBhbGxvY2F0aW9uIHNob3VsZCBub3QgYmUgdHJhY2tlZAorCWJlY2F1c2UgaXQgd291bGQgbGVhZCB0byBhIGZhbHNlIHBvc2l0aXZlIHJlcG9ydC4gVGhpcyBpcyBhICJiaWcKKwloYW1tZXIiIHdheSBvZiBzaWxlbmNpbmcga21lbWNoZWNrOyBhZnRlciBhbGwsIGV2ZW4gaWYgdGhlIGZhbHNlCisJcG9zaXRpdmUgcGVydGFpbnMgdG8gcGFydGljdWxhciBmaWVsZCBpbiBhIHN0cnVjdCwgZm9yIGV4YW1wbGUsIHdlCisJd2lsbCBub3cgbG9zZSB0aGUgYWJpbGl0eSB0byBmaW5kIChyZWFsKSBlcnJvcnMgaW4gb3RoZXIgcGFydHMgb2YKKwl0aGUgc2FtZSBzdHJ1Y3QuCisKKwlFeGFtcGxlOjoKKworCSAgICAvKiBObyB3YXJuaW5ncyB3aWxsIGV2ZXIgdHJpZ2dlciBvbiBhY2Nlc3NpbmcgYW55IHBhcnQgb2YgeCAqLworCSAgICB4ID0ga21hbGxvYyhzaXplb2YgKngsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1RSQUNLX0ZBTFNFX1BPU0lUSVZFKTsKKworLSBgYGttZW1jaGVja19iaXRmaWVsZF9iZWdpbihuYW1lKWBgL2Bga21lbWNoZWNrX2JpdGZpZWxkX2VuZChuYW1lKWBgIGFuZAorCWBga21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKHB0ciwgbmFtZSlgYAorCVRoZSBmaXJzdCB0d28gb2YgdGhlc2UgdGhyZWUgbWFjcm9zIGNhbiBiZSB1c2VkIGluc2lkZSBzdHJ1Y3QKKwlkZWZpbml0aW9ucyB0byBzaWduYWwsIHJlc3BlY3RpdmVseSwgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEKKwliaXRmaWVsZC4gQWRkaXRpb25hbGx5LCB0aGlzIHdpbGwgYXNzaWduIHRoZSBiaXRmaWVsZCBhIG5hbWUsIHdoaWNoCisJaXMgZ2l2ZW4gYXMgYW4gYXJndW1lbnQgdG8gdGhlIG1hY3Jvcy4KKworCUhhdmluZyB1c2VkIHRoZXNlIG1hcmtlcnMsIG9uZSBjYW4gbGF0ZXIgdXNlCisJa21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKCkgYXQgdGhlIHBvaW50IG9mIGFsbG9jYXRpb24sIHRvIGluZGljYXRlCisJd2hpY2ggcGFydHMgb2YgdGhlIGFsbG9jYXRpb24gaXMgcGFydCBvZiBhIGJpdGZpZWxkLgorCisJRXhhbXBsZTo6CisKKwkgICAgc3RydWN0IGZvbyB7CisJCWludCB4OworCisJCWttZW1jaGVja19iaXRmaWVsZF9iZWdpbihmbGFncyk7CisJCWludCBmbGFnX2E6MTsKKwkJaW50IGZsYWdfYjoxOworCQlrbWVtY2hlY2tfYml0ZmllbGRfZW5kKGZsYWdzKTsKKworCQlpbnQgeTsKKwkgICAgfTsKKworCSAgICBzdHJ1Y3QgZm9vICp4ID0ga21hbGxvYyhzaXplb2YgKngpOworCisJICAgIC8qIE5vIHdhcm5pbmdzIHdpbGwgdHJpZ2dlciBvbiBhY2Nlc3NpbmcgdGhlIGJpdGZpZWxkIG9mIHggKi8KKwkgICAga21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKHgsIGZsYWdzKTsKKworCU5vdGUgdGhhdCBgYGttZW1jaGVja19hbm5vdGF0ZV9iaXRmaWVsZCgpYGAgY2FuIGJlIHVzZWQgZXZlbiBiZWZvcmUgdGhlCisJcmV0dXJuIHZhbHVlIG9mIGBga21hbGxvYygpYGAgaXMgY2hlY2tlZCAtLSBpbiBvdGhlciB3b3JkcywgcGFzc2luZyBOVUxMCisJYXMgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGxlZ2FsIChhbmQgd2lsbCBkbyBub3RoaW5nKS4KKworCitSZXBvcnRpbmcgZXJyb3JzCistLS0tLS0tLS0tLS0tLS0tCisKK0FzIHdlIGhhdmUgc2Vlbiwga21lbWNoZWNrIHdpbGwgcHJvZHVjZSBmYWxzZSBwb3NpdGl2ZSByZXBvcnRzLiBUaGVyZWZvcmUsIGl0CitpcyBub3QgdmVyeSB3aXNlIHRvIGJsaW5kbHkgcG9zdCBrbWVtY2hlY2sgd2FybmluZ3MgdG8gbWFpbGluZyBsaXN0cyBhbmQKK21haW50YWluZXJzLiBJbnN0ZWFkLCBJIGVuY291cmFnZSBtYWludGFpbmVycyBhbmQgZGV2ZWxvcGVycyB0byBmaW5kIGVycm9ycworaW4gdGhlaXIgb3duIGNvZGUuIElmIHlvdSBnZXQgYSB3YXJuaW5nLCB5b3UgY2FuIHRyeSB0byB3b3JrIGFyb3VuZCBpdCwgdHJ5Cit0byBmaWd1cmUgb3V0IGlmIGl0J3MgYSByZWFsIGVycm9yIG9yIG5vdCwgb3Igc2ltcGx5IGlnbm9yZSBpdC4gTW9zdAorZGV2ZWxvcGVycyBrbm93IHRoZWlyIG93biBjb2RlIGFuZCB3aWxsIHF1aWNrbHkgYW5kIGVmZmljaWVudGx5IGRldGVybWluZSB0aGUKK3Jvb3QgY2F1c2Ugb2YgYSBrbWVtY2hlY2sgcmVwb3J0LiBUaGlzIGlzIHRoZXJlZm9yZSBhbHNvIHRoZSBtb3N0IGVmZmljaWVudAord2F5IHRvIHdvcmsgd2l0aCBrbWVtY2hlY2suCisKK1RoYXQgc2FpZCwgd2UgKHRoZSBrbWVtY2hlY2sgbWFpbnRhaW5lcnMpIHdpbGwgYWx3YXlzIGJlIG9uIHRoZSBsb29rb3V0IGZvcgorZmFsc2UgcG9zaXRpdmVzIHRoYXQgd2UgY2FuIGFubm90YXRlIGFuZCBzaWxlbmNlLiBTbyB3aGF0ZXZlciB5b3UgZmluZCwKK3BsZWFzZSBkcm9wIHVzIGEgbm90ZSBwcml2YXRlbHkhIEtlcm5lbCBjb25maWdzIGFuZCBzdGVwcyB0byByZXByb2R1Y2UgKGlmCithdmFpbGFibGUpIGFyZSBvZiBjb3Vyc2UgYSBncmVhdCBoZWxwIHRvby4KKworSGFwcHkgaGFja2luZyEKKworCitUZWNobmljYWwgZGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitrbWVtY2hlY2sgd29ya3MgYnkgbWFya2luZyBtZW1vcnkgcGFnZXMgbm9uLXByZXNlbnQuIFRoaXMgbWVhbnMgdGhhdCB3aGVuZXZlcgorc29tZWJvZHkgYXR0ZW1wdHMgdG8gYWNjZXNzIHRoZSBwYWdlLCBhIHBhZ2UgZmF1bHQgaXMgZ2VuZXJhdGVkLiBUaGUgcGFnZQorZmF1bHQgaGFuZGxlciBub3RpY2VzIHRoYXQgdGhlIHBhZ2Ugd2FzIGluIGZhY3Qgb25seSBoaWRkZW4sIGFuZCBzbyBpdCBjYWxscworb24gdGhlIGttZW1jaGVjayBjb2RlIHRvIG1ha2UgZnVydGhlciBpbnZlc3RpZ2F0aW9ucy4KKworV2hlbiB0aGUgaW52ZXN0aWdhdGlvbnMgYXJlIGNvbXBsZXRlZCwga21lbWNoZWNrICJzaG93cyIgdGhlIHBhZ2UgYnkgbWFya2luZworaXQgcHJlc2VudCAoYXMgaXQgd291bGQgYmUgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMpLiBUaGlzIHdheSwgdGhlCitpbnRlcnJ1cHRlZCBjb2RlIGNhbiBjb250aW51ZSBhcyB1c3VhbC4KKworQnV0IGFmdGVyIHRoZSBpbnN0cnVjdGlvbiBoYXMgYmVlbiBleGVjdXRlZCwgd2Ugc2hvdWxkIGhpZGUgdGhlIHBhZ2UgYWdhaW4sIHNvCit0aGF0IHdlIGNhbiBjYXRjaCB0aGUgbmV4dCBhY2Nlc3MgdG9vISBOb3cga21lbWNoZWNrIG1ha2VzIHVzZSBvZiBhIGRlYnVnZ2luZworZmVhdHVyZSBvZiB0aGUgcHJvY2Vzc29yLCBuYW1lbHkgc2luZ2xlLXN0ZXBwaW5nLiBXaGVuIHRoZSBwcm9jZXNzb3IgaGFzCitmaW5pc2hlZCB0aGUgb25lIGluc3RydWN0aW9uIHRoYXQgZ2VuZXJhdGVkIHRoZSBtZW1vcnkgYWNjZXNzLCBhIGRlYnVnCitleGNlcHRpb24gaXMgcmFpc2VkLiBGcm9tIGhlcmUsIHdlIHNpbXBseSBoaWRlIHRoZSBwYWdlIGFnYWluIGFuZCBjb250aW51ZQorZXhlY3V0aW9uLCB0aGlzIHRpbWUgd2l0aCB0aGUgc2luZ2xlLXN0ZXBwaW5nIGZlYXR1cmUgdHVybmVkIG9mZi4KKwora21lbWNoZWNrIHJlcXVpcmVzIHNvbWUgYXNzaXN0YW5jZSBmcm9tIHRoZSBtZW1vcnkgYWxsb2NhdG9yIGluIG9yZGVyIHRvIHdvcmsuCitUaGUgbWVtb3J5IGFsbG9jYXRvciBuZWVkcyB0bworCisgIDEuIFRlbGwga21lbWNoZWNrIGFib3V0IG5ld2x5IGFsbG9jYXRlZCBwYWdlcyBhbmQgcGFnZXMgdGhhdCBhcmUgYWJvdXQgdG8KKyAgICAgYmUgZnJlZWQuIFRoaXMgYWxsb3dzIGttZW1jaGVjayB0byBzZXQgdXAgYW5kIHRlYXIgZG93biB0aGUgc2hhZG93IG1lbW9yeQorICAgICBmb3IgdGhlIHBhZ2VzIGluIHF1ZXN0aW9uLiBUaGUgc2hhZG93IG1lbW9yeSBzdG9yZXMgdGhlIHN0YXR1cyBvZiBlYWNoCisgICAgIGJ5dGUgaW4gdGhlIGFsbG9jYXRpb24gcHJvcGVyLCBlLmcuIHdoZXRoZXIgaXQgaXMgaW5pdGlhbGl6ZWQgb3IKKyAgICAgdW5pbml0aWFsaXplZC4KKworICAyLiBUZWxsIGttZW1jaGVjayB3aGljaCBwYXJ0cyBvZiBtZW1vcnkgc2hvdWxkIGJlIG1hcmtlZCB1bmluaXRpYWxpemVkLgorICAgICBUaGVyZSBhcmUgYWN0dWFsbHkgYSBmZXcgbW9yZSBzdGF0ZXMsIHN1Y2ggYXMgIm5vdCB5ZXQgYWxsb2NhdGVkIiBhbmQKKyAgICAgInJlY2VudGx5IGZyZWVkIi4KKworSWYgYSBzbGFiIGNhY2hlIGlzIHNldCB1cCB1c2luZyB0aGUgU0xBQl9OT1RSQUNLIGZsYWcsIGl0IHdpbGwgbmV2ZXIgcmV0dXJuCittZW1vcnkgdGhhdCBjYW4gdGFrZSBwYWdlIGZhdWx0cyBiZWNhdXNlIG9mIGttZW1jaGVjay4KKworSWYgYSBzbGFiIGNhY2hlIGlzIE5PVCBzZXQgdXAgdXNpbmcgdGhlIFNMQUJfTk9UUkFDSyBmbGFnLCBjYWxsZXJzIGNhbiBzdGlsbAorcmVxdWVzdCBtZW1vcnkgd2l0aCB0aGUgX19HRlBfTk9UUkFDSyBvciBfX0dGUF9OT1RSQUNLX0ZBTFNFX1BPU0lUSVZFIGZsYWdzLgorVGhpcyBkb2VzIG5vdCBwcmV2ZW50IHRoZSBwYWdlIGZhdWx0cyBmcm9tIG9jY3VycmluZywgaG93ZXZlciwgYnV0IG1hcmtzIHRoZQorb2JqZWN0IGluIHF1ZXN0aW9uIGFzIGJlaW5nIGluaXRpYWxpemVkIHNvIHRoYXQgbm8gd2FybmluZ3Mgd2lsbCBldmVyIGJlCitwcm9kdWNlZCBmb3IgdGhpcyBvYmplY3QuCisKK0N1cnJlbnRseSwgdGhlIFNMQUIgYW5kIFNMVUIgYWxsb2NhdG9ycyBhcmUgc3VwcG9ydGVkIGJ5IGttZW1jaGVjay4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2ttZW1sZWFrLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL2ttZW1sZWFrLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzg4NzIyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva21lbWxlYWsucnN0CkBAIC0wLDAgKzEsMjEwIEBACitLZXJuZWwgTWVtb3J5IExlYWsgRGV0ZWN0b3IKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitLbWVtbGVhayBwcm92aWRlcyBhIHdheSBvZiBkZXRlY3RpbmcgcG9zc2libGUga2VybmVsIG1lbW9yeSBsZWFrcyBpbiBhCit3YXkgc2ltaWxhciB0byBhIHRyYWNpbmcgZ2FyYmFnZSBjb2xsZWN0b3IKKyhodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HYXJiYWdlX2NvbGxlY3Rpb25fJTI4Y29tcHV0ZXJfc2NpZW5jZSUyOSNUcmFjaW5nX2dhcmJhZ2VfY29sbGVjdG9ycyksCit3aXRoIHRoZSBkaWZmZXJlbmNlIHRoYXQgdGhlIG9ycGhhbiBvYmplY3RzIGFyZSBub3QgZnJlZWQgYnV0IG9ubHkKK3JlcG9ydGVkIHZpYSAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhay4gQSBzaW1pbGFyIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZQorVmFsZ3JpbmQgdG9vbCAoYGBtZW1jaGVjayAtLWxlYWstY2hlY2tgYCkgdG8gZGV0ZWN0IHRoZSBtZW1vcnkgbGVha3MgaW4KK3VzZXItc3BhY2UgYXBwbGljYXRpb25zLgorS21lbWxlYWsgaXMgc3VwcG9ydGVkIG9uIHg4NiwgYXJtLCBwb3dlcnBjLCBzcGFyYywgc2gsIG1pY3JvYmxhemUsIHBwYywgbWlwcywgczM5MCwgbWV0YWcgYW5kIHRpbGUuCisKK1VzYWdlCistLS0tLQorCitDT05GSUdfREVCVUdfS01FTUxFQUsgaW4gIktlcm5lbCBoYWNraW5nIiBoYXMgdG8gYmUgZW5hYmxlZC4gQSBrZXJuZWwKK3RocmVhZCBzY2FucyB0aGUgbWVtb3J5IGV2ZXJ5IDEwIG1pbnV0ZXMgKGJ5IGRlZmF1bHQpIGFuZCBwcmludHMgdGhlCitudW1iZXIgb2YgbmV3IHVucmVmZXJlbmNlZCBvYmplY3RzIGZvdW5kLiBUbyBkaXNwbGF5IHRoZSBkZXRhaWxzIG9mIGFsbAordGhlIHBvc3NpYmxlIG1lbW9yeSBsZWFrczo6CisKKyAgIyBtb3VudCAtdCBkZWJ1Z2ZzIG5vZGV2IC9zeXMva2VybmVsL2RlYnVnLworICAjIGNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhaworCitUbyB0cmlnZ2VyIGFuIGludGVybWVkaWF0ZSBtZW1vcnkgc2Nhbjo6CisKKyAgIyBlY2hvIHNjYW4gPiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhaworCitUbyBjbGVhciB0aGUgbGlzdCBvZiBhbGwgY3VycmVudCBwb3NzaWJsZSBtZW1vcnkgbGVha3M6OgorCisgICMgZWNobyBjbGVhciA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisKK05ldyBsZWFrcyB3aWxsIHRoZW4gY29tZSB1cCB1cG9uIHJlYWRpbmcgYGAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVha2BgCithZ2Fpbi4KKworTm90ZSB0aGF0IHRoZSBvcnBoYW4gb2JqZWN0cyBhcmUgbGlzdGVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYWxsb2NhdGVkCithbmQgb25lIG9iamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IG1heSBjYXVzZSBvdGhlciBzdWJzZXF1ZW50CitvYmplY3RzIHRvIGJlIHJlcG9ydGVkIGFzIG9ycGhhbi4KKworTWVtb3J5IHNjYW5uaW5nIHBhcmFtZXRlcnMgY2FuIGJlIG1vZGlmaWVkIGF0IHJ1bi10aW1lIGJ5IHdyaXRpbmcgdG8gdGhlCitgYC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrYGAgZmlsZS4gVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQ6CisKKy0gb2ZmCisgICAgZGlzYWJsZSBrbWVtbGVhayAoaXJyZXZlcnNpYmxlKQorLSBzdGFjaz1vbgorICAgIGVuYWJsZSB0aGUgdGFzayBzdGFja3Mgc2Nhbm5pbmcgKGRlZmF1bHQpCistIHN0YWNrPW9mZgorICAgIGRpc2FibGUgdGhlIHRhc2tzIHN0YWNrcyBzY2FubmluZworLSBzY2FuPW9uCisgICAgc3RhcnQgdGhlIGF1dG9tYXRpYyBtZW1vcnkgc2Nhbm5pbmcgdGhyZWFkIChkZWZhdWx0KQorLSBzY2FuPW9mZgorICAgIHN0b3AgdGhlIGF1dG9tYXRpYyBtZW1vcnkgc2Nhbm5pbmcgdGhyZWFkCistIHNjYW49PHNlY3M+CisgICAgc2V0IHRoZSBhdXRvbWF0aWMgbWVtb3J5IHNjYW5uaW5nIHBlcmlvZCBpbiBzZWNvbmRzCisgICAgKGRlZmF1bHQgNjAwLCAwIHRvIHN0b3AgdGhlIGF1dG9tYXRpYyBzY2FubmluZykKKy0gc2NhbgorICAgIHRyaWdnZXIgYSBtZW1vcnkgc2NhbgorLSBjbGVhcgorICAgIGNsZWFyIGxpc3Qgb2YgY3VycmVudCBtZW1vcnkgbGVhayBzdXNwZWN0cywgZG9uZSBieQorICAgIG1hcmtpbmcgYWxsIGN1cnJlbnQgcmVwb3J0ZWQgdW5yZWZlcmVuY2VkIG9iamVjdHMgZ3JleSwKKyAgICBvciBmcmVlIGFsbCBrbWVtbGVhayBvYmplY3RzIGlmIGttZW1sZWFrIGhhcyBiZWVuIGRpc2FibGVkLgorLSBkdW1wPTxhZGRyPgorICAgIGR1bXAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBmb3VuZCBhdCA8YWRkcj4KKworS21lbWxlYWsgY2FuIGFsc28gYmUgZGlzYWJsZWQgYXQgYm9vdC10aW1lIGJ5IHBhc3NpbmcgYGBrbWVtbGVhaz1vZmZgYCBvbgordGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCisKK01lbW9yeSBtYXkgYmUgYWxsb2NhdGVkIG9yIGZyZWVkIGJlZm9yZSBrbWVtbGVhayBpcyBpbml0aWFsaXNlZCBhbmQKK3RoZXNlIGFjdGlvbnMgYXJlIHN0b3JlZCBpbiBhbiBlYXJseSBsb2cgYnVmZmVyLiBUaGUgc2l6ZSBvZiB0aGlzIGJ1ZmZlcgoraXMgY29uZmlndXJlZCB2aWEgdGhlIENPTkZJR19ERUJVR19LTUVNTEVBS19FQVJMWV9MT0dfU0laRSBvcHRpb24uCisKK0lmIENPTkZJR19ERUJVR19LTUVNTEVBS19ERUZBVUxUX09GRiBhcmUgZW5hYmxlZCwgdGhlIGttZW1sZWFrIGlzCitkaXNhYmxlZCBieSBkZWZhdWx0LiBQYXNzaW5nIGBga21lbWxlYWs9b25gYCBvbiB0aGUga2VybmVsIGNvbW1hbmQKK2xpbmUgZW5hYmxlcyB0aGUgZnVuY3Rpb24uIAorCitCYXNpYyBBbGdvcml0aG0KKy0tLS0tLS0tLS0tLS0tLQorCitUaGUgbWVtb3J5IGFsbG9jYXRpb25zIHZpYSA6YzpmdW5jOmBrbWFsbG9jYCwgOmM6ZnVuYzpgdm1hbGxvY2AsCis6YzpmdW5jOmBrbWVtX2NhY2hlX2FsbG9jYCBhbmQKK2ZyaWVuZHMgYXJlIHRyYWNlZCBhbmQgdGhlIHBvaW50ZXJzLCB0b2dldGhlciB3aXRoIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uIGxpa2Ugc2l6ZSBhbmQgc3RhY2sgdHJhY2UsIGFyZSBzdG9yZWQgaW4gYSByYnRyZWUuCitUaGUgY29ycmVzcG9uZGluZyBmcmVlaW5nIGZ1bmN0aW9uIGNhbGxzIGFyZSB0cmFja2VkIGFuZCB0aGUgcG9pbnRlcnMKK3JlbW92ZWQgZnJvbSB0aGUga21lbWxlYWsgZGF0YSBzdHJ1Y3R1cmVzLgorCitBbiBhbGxvY2F0ZWQgYmxvY2sgb2YgbWVtb3J5IGlzIGNvbnNpZGVyZWQgb3JwaGFuIGlmIG5vIHBvaW50ZXIgdG8gaXRzCitzdGFydCBhZGRyZXNzIG9yIHRvIGFueSBsb2NhdGlvbiBpbnNpZGUgdGhlIGJsb2NrIGNhbiBiZSBmb3VuZCBieQorc2Nhbm5pbmcgdGhlIG1lbW9yeSAoaW5jbHVkaW5nIHNhdmVkIHJlZ2lzdGVycykuIFRoaXMgbWVhbnMgdGhhdCB0aGVyZQorbWlnaHQgYmUgbm8gd2F5IGZvciB0aGUga2VybmVsIHRvIHBhc3MgdGhlIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZAorYmxvY2sgdG8gYSBmcmVlaW5nIGZ1bmN0aW9uIGFuZCB0aGVyZWZvcmUgdGhlIGJsb2NrIGlzIGNvbnNpZGVyZWQgYQorbWVtb3J5IGxlYWsuCisKK1RoZSBzY2FubmluZyBhbGdvcml0aG0gc3RlcHM6CisKKyAgMS4gbWFyayBhbGwgb2JqZWN0cyBhcyB3aGl0ZSAocmVtYWluaW5nIHdoaXRlIG9iamVjdHMgd2lsbCBsYXRlciBiZQorICAgICBjb25zaWRlcmVkIG9ycGhhbikKKyAgMi4gc2NhbiB0aGUgbWVtb3J5IHN0YXJ0aW5nIHdpdGggdGhlIGRhdGEgc2VjdGlvbiBhbmQgc3RhY2tzLCBjaGVja2luZworICAgICB0aGUgdmFsdWVzIGFnYWluc3QgdGhlIGFkZHJlc3NlcyBzdG9yZWQgaW4gdGhlIHJidHJlZS4gSWYKKyAgICAgYSBwb2ludGVyIHRvIGEgd2hpdGUgb2JqZWN0IGlzIGZvdW5kLCB0aGUgb2JqZWN0IGlzIGFkZGVkIHRvIHRoZQorICAgICBncmF5IGxpc3QKKyAgMy4gc2NhbiB0aGUgZ3JheSBvYmplY3RzIGZvciBtYXRjaGluZyBhZGRyZXNzZXMgKHNvbWUgd2hpdGUgb2JqZWN0cworICAgICBjYW4gYmVjb21lIGdyYXkgYW5kIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGdyYXkgbGlzdCkgdW50aWwgdGhlCisgICAgIGdyYXkgc2V0IGlzIGZpbmlzaGVkCisgIDQuIHRoZSByZW1haW5pbmcgd2hpdGUgb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBvcnBoYW4gYW5kIHJlcG9ydGVkIHZpYQorICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhaworCitTb21lIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2tzIGhhdmUgcG9pbnRlcnMgc3RvcmVkIGluIHRoZSBrZXJuZWwncworaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGFuZCB0aGV5IGNhbm5vdCBiZSBkZXRlY3RlZCBhcyBvcnBoYW5zLiBUbworYXZvaWQgdGhpcywga21lbWxlYWsgY2FuIGFsc28gc3RvcmUgdGhlIG51bWJlciBvZiB2YWx1ZXMgcG9pbnRpbmcgdG8gYW4KK2FkZHJlc3MgaW5zaWRlIHRoZSBibG9jayBhZGRyZXNzIHJhbmdlIHRoYXQgbmVlZCB0byBiZSBmb3VuZCBzbyB0aGF0IHRoZQorYmxvY2sgaXMgbm90IGNvbnNpZGVyZWQgYSBsZWFrLiBPbmUgZXhhbXBsZSBpcyBfX3ZtYWxsb2MoKS4KKworVGVzdGluZyBzcGVjaWZpYyBzZWN0aW9ucyB3aXRoIGttZW1sZWFrCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVXBvbiBpbml0aWFsIGJvb3R1cCB5b3VyIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrIG91dHB1dCBwYWdlIG1heSBiZQorcXVpdGUgZXh0ZW5zaXZlLiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBjYXNlIGlmIHlvdSBoYXZlIHZlcnkgYnVnZ3kgY29kZQord2hlbiBkb2luZyBkZXZlbG9wbWVudC4gVG8gd29yayBhcm91bmQgdGhlc2Ugc2l0dWF0aW9ucyB5b3UgY2FuIHVzZSB0aGUKKydjbGVhcicgY29tbWFuZCB0byBjbGVhciBhbGwgcmVwb3J0ZWQgdW5yZWZlcmVuY2VkIG9iamVjdHMgZnJvbSB0aGUKKy9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrIG91dHB1dC4gQnkgaXNzdWluZyBhICdzY2FuJyBhZnRlciBhICdjbGVhcicKK3lvdSBjYW4gZmluZCBuZXcgdW5yZWZlcmVuY2VkIG9iamVjdHM7IHRoaXMgc2hvdWxkIGhlbHAgd2l0aCB0ZXN0aW5nCitzcGVjaWZpYyBzZWN0aW9ucyBvZiBjb2RlLgorCitUbyB0ZXN0IGEgY3JpdGljYWwgc2VjdGlvbiBvbiBkZW1hbmQgd2l0aCBhIGNsZWFuIGttZW1sZWFrIGRvOjoKKworICAjIGVjaG8gY2xlYXIgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhaworICAuLi4gdGVzdCB5b3VyIGtlcm5lbCBvciBtb2R1bGVzIC4uLgorICAjIGVjaG8gc2NhbiA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisKK1RoZW4gYXMgdXN1YWwgdG8gZ2V0IHlvdXIgcmVwb3J0IHdpdGg6OgorCisgICMgY2F0IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisKK0ZyZWVpbmcga21lbWxlYWsgaW50ZXJuYWwgb2JqZWN0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIGFsbG93IGFjY2VzcyB0byBwcmV2aW91c2x5IGZvdW5kIG1lbW9yeSBsZWFrcyBhZnRlciBrbWVtbGVhayBoYXMgYmVlbgorZGlzYWJsZWQgYnkgdGhlIHVzZXIgb3IgZHVlIHRvIGFuIGZhdGFsIGVycm9yLCBpbnRlcm5hbCBrbWVtbGVhayBvYmplY3RzCit3b24ndCBiZSBmcmVlZCB3aGVuIGttZW1sZWFrIGlzIGRpc2FibGVkLCBhbmQgdGhvc2Ugb2JqZWN0cyBtYXkgb2NjdXB5CithIGxhcmdlIHBhcnQgb2YgcGh5c2ljYWwgbWVtb3J5LgorCitJbiB0aGlzIHNpdHVhdGlvbiwgeW91IG1heSByZWNsYWltIG1lbW9yeSB3aXRoOjoKKworICAjIGVjaG8gY2xlYXIgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhaworCitLbWVtbGVhayBBUEkKKy0tLS0tLS0tLS0tLQorCitTZWUgdGhlIGluY2x1ZGUvbGludXgva21lbWxlYWsuaCBoZWFkZXIgZm9yIHRoZSBmdW5jdGlvbnMgcHJvdG90eXBlLgorCistIGBga21lbWxlYWtfaW5pdGBgCQkgLSBpbml0aWFsaXplIGttZW1sZWFrCistIGBga21lbWxlYWtfYWxsb2NgYAkJIC0gbm90aWZ5IG9mIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24KKy0gYGBrbWVtbGVha19hbGxvY19wZXJjcHVgYAkgLSBub3RpZnkgb2YgYSBwZXJjcHUgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24KKy0gYGBrbWVtbGVha19mcmVlYGAJCSAtIG5vdGlmeSBvZiBhIG1lbW9yeSBibG9jayBmcmVlaW5nCistIGBga21lbWxlYWtfZnJlZV9wYXJ0YGAJIC0gbm90aWZ5IG9mIGEgcGFydGlhbCBtZW1vcnkgYmxvY2sgZnJlZWluZworLSBgYGttZW1sZWFrX2ZyZWVfcGVyY3B1YGAJIC0gbm90aWZ5IG9mIGEgcGVyY3B1IG1lbW9yeSBibG9jayBmcmVlaW5nCistIGBga21lbWxlYWtfdXBkYXRlX3RyYWNlYGAJIC0gdXBkYXRlIG9iamVjdCBhbGxvY2F0aW9uIHN0YWNrIHRyYWNlCistIGBga21lbWxlYWtfbm90X2xlYWtgYAkgLSBtYXJrIGFuIG9iamVjdCBhcyBub3QgYSBsZWFrCistIGBga21lbWxlYWtfaWdub3JlYGAJCSAtIGRvIG5vdCBzY2FuIG9yIHJlcG9ydCBhbiBvYmplY3QgYXMgbGVhaworLSBgYGttZW1sZWFrX3NjYW5fYXJlYWBgCSAtIGFkZCBzY2FuIGFyZWFzIGluc2lkZSBhIG1lbW9yeSBibG9jaworLSBgYGttZW1sZWFrX25vX3NjYW5gYAkgLSBkbyBub3Qgc2NhbiBhIG1lbW9yeSBibG9jaworLSBgYGttZW1sZWFrX2VyYXNlYGAJCSAtIGVyYXNlIGFuIG9sZCB2YWx1ZSBpbiBhIHBvaW50ZXIgdmFyaWFibGUKKy0gYGBrbWVtbGVha19hbGxvY19yZWN1cnNpdmVgYCAtIGFzIGttZW1sZWFrX2FsbG9jIGJ1dCBjaGVja3MgdGhlIHJlY3Vyc2l2ZW5lc3MKKy0gYGBrbWVtbGVha19mcmVlX3JlY3Vyc2l2ZWBgCSAtIGFzIGttZW1sZWFrX2ZyZWUgYnV0IGNoZWNrcyB0aGUgcmVjdXJzaXZlbmVzcworCitEZWFsaW5nIHdpdGggZmFsc2UgcG9zaXRpdmVzL25lZ2F0aXZlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZhbHNlIG5lZ2F0aXZlcyBhcmUgcmVhbCBtZW1vcnkgbGVha3MgKG9ycGhhbiBvYmplY3RzKSBidXQgbm90CityZXBvcnRlZCBieSBrbWVtbGVhayBiZWNhdXNlIHZhbHVlcyBmb3VuZCBkdXJpbmcgdGhlIG1lbW9yeSBzY2FubmluZworcG9pbnQgdG8gc3VjaCBvYmplY3RzLiBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBmYWxzZSBuZWdhdGl2ZXMsIGttZW1sZWFrCitwcm92aWRlcyB0aGUga21lbWxlYWtfaWdub3JlLCBrbWVtbGVha19zY2FuX2FyZWEsIGttZW1sZWFrX25vX3NjYW4gYW5kCitrbWVtbGVha19lcmFzZSBmdW5jdGlvbnMgKHNlZSBhYm92ZSkuIFRoZSB0YXNrIHN0YWNrcyBhbHNvIGluY3JlYXNlIHRoZQorYW1vdW50IG9mIGZhbHNlIG5lZ2F0aXZlcyBhbmQgdGhlaXIgc2Nhbm5pbmcgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KKworVGhlIGZhbHNlIHBvc2l0aXZlcyBhcmUgb2JqZWN0cyB3cm9uZ2x5IHJlcG9ydGVkIGFzIGJlaW5nIG1lbW9yeSBsZWFrcworKG9ycGhhbikuIEZvciBvYmplY3RzIGtub3duIG5vdCB0byBiZSBsZWFrcywga21lbWxlYWsgcHJvdmlkZXMgdGhlCitrbWVtbGVha19ub3RfbGVhayBmdW5jdGlvbi4gVGhlIGttZW1sZWFrX2lnbm9yZSBjb3VsZCBhbHNvIGJlIHVzZWQgaWYKK3RoZSBtZW1vcnkgYmxvY2sgaXMga25vd24gbm90IHRvIGNvbnRhaW4gb3RoZXIgcG9pbnRlcnMgYW5kIGl0IHdpbGwgbm8KK2xvbmdlciBiZSBzY2FubmVkLgorCitTb21lIG9mIHRoZSByZXBvcnRlZCBsZWFrcyBhcmUgb25seSB0cmFuc2llbnQsIGVzcGVjaWFsbHkgb24gU01QCitzeXN0ZW1zLCBiZWNhdXNlIG9mIHBvaW50ZXJzIHRlbXBvcmFyaWx5IHN0b3JlZCBpbiBDUFUgcmVnaXN0ZXJzIG9yCitzdGFja3MuIEttZW1sZWFrIGRlZmluZXMgTVNFQ1NfTUlOX0FHRSAoZGVmYXVsdGluZyB0byAxMDAwKSByZXByZXNlbnRpbmcKK3RoZSBtaW5pbXVtIGFnZSBvZiBhbiBvYmplY3QgdG8gYmUgcmVwb3J0ZWQgYXMgYSBtZW1vcnkgbGVhay4KKworTGltaXRhdGlvbnMgYW5kIERyYXdiYWNrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbWFpbiBkcmF3YmFjayBpcyB0aGUgcmVkdWNlZCBwZXJmb3JtYW5jZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQKK2ZyZWVpbmcuIFRvIGF2b2lkIG90aGVyIHBlbmFsdGllcywgdGhlIG1lbW9yeSBzY2FubmluZyBpcyBvbmx5IHBlcmZvcm1lZAord2hlbiB0aGUgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsgZmlsZSBpcyByZWFkLiBBbnl3YXksIHRoaXMgdG9vbCBpcworaW50ZW5kZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aGVyZSB0aGUgcGVyZm9ybWFuY2UgbWlnaHQgbm90IGJlIHRoZQorbW9zdCBpbXBvcnRhbnQgcmVxdWlyZW1lbnQuCisKK1RvIGtlZXAgdGhlIGFsZ29yaXRobSBzaW1wbGUsIGttZW1sZWFrIHNjYW5zIGZvciB2YWx1ZXMgcG9pbnRpbmcgdG8gYW55CithZGRyZXNzIGluc2lkZSBhIGJsb2NrJ3MgYWRkcmVzcyByYW5nZS4gVGhpcyBtYXkgbGVhZCB0byBhbiBpbmNyZWFzZWQKK251bWJlciBvZiBmYWxzZSBuZWdhdGl2ZXMuIEhvd2V2ZXIsIGl0IGlzIGxpa2VseSB0aGF0IGEgcmVhbCBtZW1vcnkgbGVhaword2lsbCBldmVudHVhbGx5IGJlY29tZSB2aXNpYmxlLgorCitBbm90aGVyIHNvdXJjZSBvZiBmYWxzZSBuZWdhdGl2ZXMgaXMgdGhlIGRhdGEgc3RvcmVkIGluIG5vbi1wb2ludGVyCit2YWx1ZXMuIEluIGEgZnV0dXJlIHZlcnNpb24sIGttZW1sZWFrIGNvdWxkIG9ubHkgc2NhbiB0aGUgcG9pbnRlcgorbWVtYmVycyBpbiB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZXMuIFRoaXMgZmVhdHVyZSB3b3VsZCBzb2x2ZSBtYW55IG9mCit0aGUgZmFsc2UgbmVnYXRpdmUgY2FzZXMgZGVzY3JpYmVkIGFib3ZlLgorCitUaGUgdG9vbCBjYW4gcmVwb3J0IGZhbHNlIHBvc2l0aXZlcy4gVGhlc2UgYXJlIGNhc2VzIHdoZXJlIGFuIGFsbG9jYXRlZAorYmxvY2sgZG9lc24ndCBuZWVkIHRvIGJlIGZyZWVkIChzb21lIGNhc2VzIGluIHRoZSBpbml0X2NhbGwgZnVuY3Rpb25zKSwKK3RoZSBwb2ludGVyIGlzIGNhbGN1bGF0ZWQgYnkgb3RoZXIgbWV0aG9kcyB0aGFuIHRoZSB1c3VhbCBjb250YWluZXJfb2YKK21hY3JvIG9yIHRoZSBwb2ludGVyIGlzIHN0b3JlZCBpbiBhIGxvY2F0aW9uIG5vdCBzY2FubmVkIGJ5IGttZW1sZWFrLgorCitQYWdlIGFsbG9jYXRpb25zIGFuZCBpb3JlbWFwIGFyZSBub3QgdHJhY2tlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL3NwYXJzZS5yc3QgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9zcGFyc2UucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjUwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy9zcGFyc2UucnN0CkBAIC0wLDAgKzEsMTE3IEBACisuLiBDb3B5cmlnaHQgMjAwNCBMaW51cyBUb3J2YWxkcworLi4gQ29weXJpZ2h0IDIwMDQgUGF2ZWwgTWFjaGVrIDxwYXZlbEB1Y3cuY3o+CisuLiBDb3B5cmlnaHQgMjAwNiBCb2IgQ29wZWxhbmQgPG1lQGJvYmNvcGVsYW5kLmNvbT4KKworU3BhcnNlCis9PT09PT0KKworU3BhcnNlIGlzIGEgc2VtYW50aWMgY2hlY2tlciBmb3IgQyBwcm9ncmFtczsgaXQgY2FuIGJlIHVzZWQgdG8gZmluZCBhCitudW1iZXIgb2YgcG90ZW50aWFsIHByb2JsZW1zIHdpdGgga2VybmVsIGNvZGUuICBTZWUKK2h0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy82ODk5MDcvIGZvciBhbiBvdmVydmlldyBvZiBzcGFyc2U7IHRoaXMgZG9jdW1lbnQKK2NvbnRhaW5zIHNvbWUga2VybmVsLXNwZWNpZmljIHNwYXJzZSBpbmZvcm1hdGlvbi4KKworCitVc2luZyBzcGFyc2UgZm9yIHR5cGVjaGVja2luZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIl9fYml0d2lzZSIgaXMgYSB0eXBlIGF0dHJpYnV0ZSwgc28geW91IGhhdmUgdG8gZG8gc29tZXRoaW5nIGxpa2UgdGhpczo6CisKKyAgICAgICAgdHlwZWRlZiBpbnQgX19iaXR3aXNlIHBtX3JlcXVlc3RfdDsKKworICAgICAgICBlbnVtIHBtX3JlcXVlc3QgeworICAgICAgICAgICAgICAgIFBNX1NVU1BFTkQgPSAoX19mb3JjZSBwbV9yZXF1ZXN0X3QpIDEsCisgICAgICAgICAgICAgICAgUE1fUkVTVU1FID0gKF9fZm9yY2UgcG1fcmVxdWVzdF90KSAyCisgICAgICAgIH07CisKK3doaWNoIG1ha2VzIFBNX1NVU1BFTkQgYW5kIFBNX1JFU1VNRSAiYml0d2lzZSIgaW50ZWdlcnMgKHRoZSAiX19mb3JjZSIgaXMKK3RoZXJlIGJlY2F1c2Ugc3BhcnNlIHdpbGwgY29tcGxhaW4gYWJvdXQgY2FzdGluZyB0by9mcm9tIGEgYml0d2lzZSB0eXBlLAorYnV0IGluIHRoaXMgY2FzZSB3ZSByZWFsbHkgX2RvXyB3YW50IHRvIGZvcmNlIHRoZSBjb252ZXJzaW9uKS4gQW5kIGJlY2F1c2UKK3RoZSBlbnVtIHZhbHVlcyBhcmUgYWxsIHRoZSBzYW1lIHR5cGUsIG5vdyAiZW51bSBwbV9yZXF1ZXN0IiB3aWxsIGJlIHRoYXQKK3R5cGUgdG9vLgorCitBbmQgd2l0aCBnY2MsIGFsbCB0aGUgIl9fYml0d2lzZSIvIl9fZm9yY2Ugc3R1ZmYiIGdvZXMgYXdheSwgYW5kIGl0IGFsbAorZW5kcyB1cCBsb29raW5nIGp1c3QgbGlrZSBpbnRlZ2VycyB0byBnY2MuCisKK1F1aXRlIGZyYW5rbHksIHlvdSBkb24ndCBuZWVkIHRoZSBlbnVtIHRoZXJlLiBUaGUgYWJvdmUgYWxsIHJlYWxseSBqdXN0Citib2lscyBkb3duIHRvIG9uZSBzcGVjaWFsICJpbnQgX19iaXR3aXNlIiB0eXBlLgorCitTbyB0aGUgc2ltcGxlciB3YXkgaXMgdG8ganVzdCBkbzo6CisKKyAgICAgICAgdHlwZWRlZiBpbnQgX19iaXR3aXNlIHBtX3JlcXVlc3RfdDsKKworICAgICAgICAjZGVmaW5lIFBNX1NVU1BFTkQgKChfX2ZvcmNlIHBtX3JlcXVlc3RfdCkgMSkKKyAgICAgICAgI2RlZmluZSBQTV9SRVNVTUUgKChfX2ZvcmNlIHBtX3JlcXVlc3RfdCkgMikKKworYW5kIHlvdSBub3cgaGF2ZSBhbGwgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCBmb3Igc3RyaWN0IHR5cGVjaGVja2luZy4KKworT25lIHNtYWxsIG5vdGU6IHRoZSBjb25zdGFudCBpbnRlZ2VyICIwIiBpcyBzcGVjaWFsLiBZb3UgY2FuIHVzZSBhCitjb25zdGFudCB6ZXJvIGFzIGEgYml0d2lzZSBpbnRlZ2VyIHR5cGUgd2l0aG91dCBzcGFyc2UgZXZlciBjb21wbGFpbmluZy4KK1RoaXMgaXMgYmVjYXVzZSAiYml0d2lzZSIgKGFzIHRoZSBuYW1lIGltcGxpZXMpIHdhcyBkZXNpZ25lZCBmb3IgbWFraW5nCitzdXJlIHRoYXQgYml0d2lzZSB0eXBlcyBkb24ndCBnZXQgbWl4ZWQgdXAgKGxpdHRsZS1lbmRpYW4gdnMgYmlnLWVuZGlhbgordnMgY3B1LWVuZGlhbiB2cyB3aGF0ZXZlciksIGFuZCB0aGVyZSB0aGUgY29uc3RhbnQgIjAiIHJlYWxseSBfaXNfCitzcGVjaWFsLgorCitfX2JpdHdpc2VfXyAtIHRvIGJlIHVzZWQgZm9yIHJlbGF0aXZlbHkgY29tcGFjdCBzdHVmZiAoZ2ZwX3QsIGV0Yy4pIHRoYXQKK2lzIG1vc3RseSB3YXJuaW5nLWZyZWUgYW5kIGlzIHN1cHBvc2VkIHRvIHN0YXkgdGhhdCB3YXkuICBXYXJuaW5ncyB3aWxsCitiZSBnZW5lcmF0ZWQgd2l0aG91dCBfX0NIRUNLX0VORElBTl9fLgorCitfX2JpdHdpc2UgLSBub2lzeSBzdHVmZjsgaW4gcGFydGljdWxhciwgX19sZSovX19iZSogYXJlIHRoYXQuICBXZSByZWFsbHkKK2Rvbid0IHdhbnQgdG8gZHJvd24gaW4gbm9pc2UgdW5sZXNzIHdlJ2QgZXhwbGljaXRseSBhc2tlZCBmb3IgaXQuCisKK1VzaW5nIHNwYXJzZSBmb3IgbG9jayBjaGVja2luZworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSB1bmRlZmluZWQgZm9yIGdjYyBhbmQgZGVmaW5lZCBkdXJpbmcgYSBzcGFyc2UKK3J1biB0byB1c2UgdGhlICJjb250ZXh0IiB0cmFja2luZyBmZWF0dXJlIG9mIHNwYXJzZSwgYXBwbGllZCB0bworbG9ja2luZy4gIFRoZXNlIGFubm90YXRpb25zIHRlbGwgc3BhcnNlIHdoZW4gYSBsb2NrIGlzIGhlbGQsIHdpdGgKK3JlZ2FyZCB0byB0aGUgYW5ub3RhdGVkIGZ1bmN0aW9uJ3MgZW50cnkgYW5kIGV4aXQuCisKK19fbXVzdF9ob2xkIC0gVGhlIHNwZWNpZmllZCBsb2NrIGlzIGhlbGQgb24gZnVuY3Rpb24gZW50cnkgYW5kIGV4aXQuCisKK19fYWNxdWlyZXMgLSBUaGUgc3BlY2lmaWVkIGxvY2sgaXMgaGVsZCBvbiBmdW5jdGlvbiBleGl0LCBidXQgbm90IGVudHJ5LgorCitfX3JlbGVhc2VzIC0gVGhlIHNwZWNpZmllZCBsb2NrIGlzIGhlbGQgb24gZnVuY3Rpb24gZW50cnksIGJ1dCBub3QgZXhpdC4KKworSWYgdGhlIGZ1bmN0aW9uIGVudGVycyBhbmQgZXhpdHMgd2l0aG91dCB0aGUgbG9jayBoZWxkLCBhY3F1aXJpbmcgYW5kCityZWxlYXNpbmcgdGhlIGxvY2sgaW5zaWRlIHRoZSBmdW5jdGlvbiBpbiBhIGJhbGFuY2VkIHdheSwgbm8KK2Fubm90YXRpb24gaXMgbmVlZGVkLiAgVGhlIHRyZWUgYW5ub3RhdGlvbnMgYWJvdmUgYXJlIGZvciBjYXNlcyB3aGVyZQorc3BhcnNlIHdvdWxkIG90aGVyd2lzZSByZXBvcnQgYSBjb250ZXh0IGltYmFsYW5jZS4KKworR2V0dGluZyBzcGFyc2UKKy0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gZ2V0IGxhdGVzdCByZWxlYXNlZCB2ZXJzaW9ucyBmcm9tIHRoZSBTcGFyc2UgaG9tZXBhZ2UgYXQKK2h0dHBzOi8vc3BhcnNlLndpa2kua2VybmVsLm9yZy9pbmRleC5waHAvTWFpbl9QYWdlCisKK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gZ2V0IHNuYXBzaG90cyBvZiB0aGUgbGF0ZXN0IGRldmVsb3BtZW50IHZlcnNpb24KK29mIHNwYXJzZSB1c2luZyBnaXQgdG8gY2xvbmU6OgorCisgICAgICAgIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vZGV2ZWwvc3BhcnNlL3NwYXJzZS5naXQKKworRGF2ZUogaGFzIGhvdXJseSBnZW5lcmF0ZWQgdGFyYmFsbHMgb2YgdGhlIGdpdCB0cmVlIGF2YWlsYWJsZSBhdDo6CisKKyAgICAgICAgaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9wcm9qZWN0cy9naXQtc25hcHNob3RzL3NwYXJzZS8KKworCitPbmNlIHlvdSBoYXZlIGl0LCBqdXN0IGRvOjoKKworICAgICAgICBtYWtlCisgICAgICAgIG1ha2UgaW5zdGFsbAorCithcyBhIHJlZ3VsYXIgdXNlciwgYW5kIGl0IHdpbGwgaW5zdGFsbCBzcGFyc2UgaW4geW91ciB+L2JpbiBkaXJlY3RvcnkuCisKK1VzaW5nIHNwYXJzZQorLS0tLS0tLS0tLS0tCisKK0RvIGEga2VybmVsIG1ha2Ugd2l0aCAibWFrZSBDPTEiIHRvIHJ1biBzcGFyc2Ugb24gYWxsIHRoZSBDIGZpbGVzIHRoYXQgZ2V0CityZWNvbXBpbGVkLCBvciB1c2UgIm1ha2UgQz0yIiB0byBydW4gc3BhcnNlIG9uIHRoZSBmaWxlcyB3aGV0aGVyIHRoZXkgbmVlZCB0bworYmUgcmVjb21waWxlZCBvciBub3QuICBUaGUgbGF0dGVyIGlzIGEgZmFzdCB3YXkgdG8gY2hlY2sgdGhlIHdob2xlIHRyZWUgaWYgeW91CitoYXZlIGFscmVhZHkgYnVpbHQgaXQuCisKK1RoZSBvcHRpb25hbCBtYWtlIHZhcmlhYmxlIENGIGNhbiBiZSB1c2VkIHRvIHBhc3MgYXJndW1lbnRzIHRvIHNwYXJzZS4gIFRoZQorYnVpbGQgc3lzdGVtIHBhc3NlcyAtV2JpdHdpc2UgdG8gc3BhcnNlIGF1dG9tYXRpY2FsbHkuICBUbyBwZXJmb3JtIGVuZGlhbm5lc3MKK2NoZWNrcywgeW91IG1heSBkZWZpbmUgX19DSEVDS19FTkRJQU5fXzo6CisKKyAgICAgICAgbWFrZSBDPTIgQ0Y9Ii1EX19DSEVDS19FTkRJQU5fXyIKKworVGhlc2UgY2hlY2tzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0IGFzIHRoZXkgZ2VuZXJhdGUgYSBob3N0IG9mIHdhcm5pbmdzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvdG9vbHMucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvdG9vbHMucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNGFlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Rldi10b29scy90b29scy5yc3QKQEAgLTAsMCArMSwyNSBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0RldmVsb3BtZW50IHRvb2xzIGZvciB0aGUga2VybmVsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGRvY3VtZW50IGlzIGEgY29sbGVjdGlvbiBvZiBkb2N1bWVudHMgYWJvdXQgZGV2ZWxvcG1lbnQgdG9vbHMgdGhhdCBjYW4KK2JlIHVzZWQgdG8gd29yayBvbiB0aGUga2VybmVsLiAgRm9yIG5vdywgdGhlIGRvY3VtZW50cyBoYXZlIGJlZW4gcHVsbGVkCit0b2dldGhlciB3aXRob3V0IGFueSBzaWduaWZpY2FudCBlZmZvdCB0byBpbnRlZ3JhdGUgdGhlbSBpbnRvIGEgY29oZXJlbnQKK3dob2xlOyBwYXRjaGVzIHdlbGNvbWUhCisKKy4uIGNsYXNzOjogdG9jLXRpdGxlCisKKwkgICBUYWJsZSBvZiBjb250ZW50cworCisuLiB0b2N0cmVlOjoKKyAgIDptYXhkZXB0aDogMgorCisgICBjb2NjaW5lbGxlCisgICBzcGFyc2UKKyAgIGtjb3YKKyAgIGdjb3YKKyAgIGthc2FuCisgICB1YnNhbgorICAga21lbWxlYWsKKyAgIGttZW1jaGVjaworICAgZ2RiLWtlcm5lbC1kZWJ1Z2dpbmcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL3Vic2FuLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2LXRvb2xzL3Vic2FuLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTVlNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvdWJzYW4ucnN0CkBAIC0wLDAgKzEsODggQEAKK1RoZSBVbmRlZmluZWQgQmVoYXZpb3IgU2FuaXRpemVyIC0gVUJTQU4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVUJTQU4gaXMgYSBydW50aW1lIHVuZGVmaW5lZCBiZWhhdmlvdXIgY2hlY2tlci4KKworVUJTQU4gdXNlcyBjb21waWxlLXRpbWUgaW5zdHJ1bWVudGF0aW9uIHRvIGNhdGNoIHVuZGVmaW5lZCBiZWhhdmlvciAoVUIpLgorQ29tcGlsZXIgaW5zZXJ0cyBjb2RlIHRoYXQgcGVyZm9ybSBjZXJ0YWluIGtpbmRzIG9mIGNoZWNrcyBiZWZvcmUgb3BlcmF0aW9ucwordGhhdCBtYXkgY2F1c2UgVUIuIElmIGNoZWNrIGZhaWxzIChpLmUuIFVCIGRldGVjdGVkKSBfX3Vic2FuX2hhbmRsZV8qCitmdW5jdGlvbiBjYWxsZWQgdG8gcHJpbnQgZXJyb3IgbWVzc2FnZS4KKworR0NDIGhhcyB0aGF0IGZlYXR1cmUgc2luY2UgNC45LnggWzFfXSAoc2VlIGBgLWZzYW5pdGl6ZT11bmRlZmluZWRgYCBvcHRpb24gYW5kCitpdHMgc3Vib3B0aW9ucykuIEdDQyA1LnggaGFzIG1vcmUgY2hlY2tlcnMgaW1wbGVtZW50ZWQgWzJfXS4KKworUmVwb3J0IGV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tCisKKzo6CisKKwkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkgVUJTQU46IFVuZGVmaW5lZCBiZWhhdmlvdXIgaW4gLi4vaW5jbHVkZS9saW51eC9iaXRvcHMuaDoxMTA6MzMKKwkgc2hpZnQgZXhwb25lbnQgMzIgaXMgdG8gbGFyZ2UgZm9yIDMyLWJpdCB0eXBlICd1bnNpZ25lZCBpbnQnCisJIENQVTogMCBQSUQ6IDAgQ29tbTogc3dhcHBlciBOb3QgdGFpbnRlZCA0LjQuMC1yYzErICMyNgorCSAgMDAwMDAwMDAwMDAwMDAwMCBmZmZmZmZmZjgyNDAzY2M4IGZmZmZmZmZmODE1ZTZjZDYgMDAwMDAwMDAwMDAwMDAwMQorCSAgZmZmZmZmZmY4MjQwM2NmOCBmZmZmZmZmZjgyNDAzY2UwIGZmZmZmZmZmODE2M2E1ZWQgMDAwMDAwMDAwMDAwMDAyMAorCSAgZmZmZmZmZmY4MjQwM2Q3OCBmZmZmZmZmZjgxNjNhYzJiIGZmZmZmZmZmODE1ZjAwMDEgMDAwMDAwMDAwMDAwMDAwMgorCSBDYWxsIFRyYWNlOgorCSAgWzxmZmZmZmZmZjgxNWU2Y2Q2Pl0gZHVtcF9zdGFjaysweDQ1LzB4NWYKKwkgIFs8ZmZmZmZmZmY4MTYzYTVlZD5dIHVic2FuX2VwaWxvZ3VlKzB4ZC8weDQwCisJICBbPGZmZmZmZmZmODE2M2FjMmI+XSBfX3Vic2FuX2hhbmRsZV9zaGlmdF9vdXRfb2ZfYm91bmRzKzB4ZWIvMHgxMzAKKwkgIFs8ZmZmZmZmZmY4MTVmMDAwMT5dID8gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF9zbG90KzB4NTEvMHgxNTAKKwkgIFs8ZmZmZmZmZmY4MTczYzU4Nj5dIF9taXhfcG9vbF9ieXRlcysweDFlNi8weDQ4MAorCSAgWzxmZmZmZmZmZjgzMTA1NjUzPl0gPyBkbWlfd2Fsa19lYXJseSsweDQ4LzB4NWMKKwkgIFs8ZmZmZmZmZmY4MTczYzg4MT5dIGFkZF9kZXZpY2VfcmFuZG9tbmVzcysweDYxLzB4MTMwCisJICBbPGZmZmZmZmZmODMxMDViMzU+XSA/IGRtaV9zYXZlX29uZV9kZXZpY2UrMHhhYS8weGFhCisJICBbPGZmZmZmZmZmODMxMDU2NTM+XSBkbWlfd2Fsa19lYXJseSsweDQ4LzB4NWMKKwkgIFs8ZmZmZmZmZmY4MzEwNjZhZT5dIGRtaV9zY2FuX21hY2hpbmUrMHgyNzgvMHg0YjQKKwkgIFs8ZmZmZmZmZmY4MTExZDU4YT5dID8gdnByaW50a19kZWZhdWx0KzB4MWEvMHgyMAorCSAgWzxmZmZmZmZmZjgzMGFkMTIwPl0gPyBlYXJseV9pZHRfaGFuZGxlcl9hcnJheSsweDEyMC8weDEyMAorCSAgWzxmZmZmZmZmZjgzMGIyMjQwPl0gc2V0dXBfYXJjaCsweDQwNS8weGMyYworCSAgWzxmZmZmZmZmZjgzMGFkMTIwPl0gPyBlYXJseV9pZHRfaGFuZGxlcl9hcnJheSsweDEyMC8weDEyMAorCSAgWzxmZmZmZmZmZjgzMGFlMDUzPl0gc3RhcnRfa2VybmVsKzB4ODMvMHg0OWEKKwkgIFs8ZmZmZmZmZmY4MzBhZDEyMD5dID8gZWFybHlfaWR0X2hhbmRsZXJfYXJyYXkrMHgxMjAvMHgxMjAKKwkgIFs8ZmZmZmZmZmY4MzBhZDM4Nj5dIHg4Nl82NF9zdGFydF9yZXNlcnZhdGlvbnMrMHgyYS8weDJjCisJICBbPGZmZmZmZmZmODMwYWQ0ZjM+XSB4ODZfNjRfc3RhcnRfa2VybmVsKzB4MTZiLzB4MTdhCisJID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1VzYWdlCistLS0tLQorCitUbyBlbmFibGUgVUJTQU4gY29uZmlndXJlIGtlcm5lbCB3aXRoOjoKKworCUNPTkZJR19VQlNBTj15CisKK2FuZCB0byBjaGVjayB0aGUgZW50aXJlIGtlcm5lbDo6CisKKyAgICAgICAgQ09ORklHX1VCU0FOX1NBTklUSVpFX0FMTD15CisKK1RvIGVuYWJsZSBpbnN0cnVtZW50YXRpb24gZm9yIHNwZWNpZmljIGZpbGVzIG9yIGRpcmVjdG9yaWVzLCBhZGQgYSBsaW5lCitzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHJlc3BlY3RpdmUga2VybmVsIE1ha2VmaWxlOgorCistIEZvciBhIHNpbmdsZSBmaWxlIChlLmcuIG1haW4ubyk6OgorCisgICAgVUJTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IHkKKworLSBGb3IgYWxsIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnk6OgorCisgICAgVUJTQU5fU0FOSVRJWkUgOj0geQorCitUbyBleGNsdWRlIGZpbGVzIGZyb20gYmVpbmcgaW5zdHJ1bWVudGVkIGV2ZW4gaWYKK2BgQ09ORklHX1VCU0FOX1NBTklUSVpFX0FMTD15YGAsIHVzZTo6CisKKyAgVUJTQU5fU0FOSVRJWkVfbWFpbi5vIDo9IG4KKworYW5kOjoKKworICBVQlNBTl9TQU5JVElaRSA6PSBuCisKK0RldGVjdGlvbiBvZiB1bmFsaWduZWQgYWNjZXNzZXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBzZXBhcmF0ZSBvcHRpb24gLQorQ09ORklHX1VCU0FOX0FMSUdOTUVOVC4gSXQncyBvZmYgYnkgZGVmYXVsdCBvbiBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydAordW5hbGlnbmVkIGFjY2Vzc2VzIChDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUz15KS4gT25lIGNvdWxkCitzdGlsbCBlbmFibGUgaXQgaW4gY29uZmlnLCBqdXN0IG5vdGUgdGhhdCBpdCB3aWxsIHByb2R1Y2UgYSBsb3Qgb2YgVUJTQU4KK3JlcG9ydHMuCisKK1JlZmVyZW5jZXMKKy0tLS0tLS0tLS0KKworLi4gXzE6IGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtNC45LjAvZ2NjL0RlYnVnZ2luZy1PcHRpb25zLmh0bWwKKy4uIF8yOiBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0RlYnVnZ2luZy1PcHRpb25zLmh0bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8xLkludHJvIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzEuSW50cm8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNjE0NDguLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzEuSW50cm8KKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotMTogQSBHVUlERSBUTyBUSEUgS0VSTkVMIERFVkVMT1BNRU5UIFBST0NFU1MKLQotVGhlIHB1cnBvc2Ugb2YgdGhpcyBkb2N1bWVudCBpcyB0byBoZWxwIGRldmVsb3BlcnMgKGFuZCB0aGVpciBtYW5hZ2VycykKLXdvcmsgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IHdpdGggYSBtaW5pbXVtIG9mIGZydXN0cmF0aW9uLiAgSXQgaXMKLWFuIGF0dGVtcHQgdG8gZG9jdW1lbnQgaG93IHRoaXMgY29tbXVuaXR5IHdvcmtzIGluIGEgd2F5IHdoaWNoIGlzCi1hY2Nlc3NpYmxlIHRvIHRob3NlIHdobyBhcmUgbm90IGludGltYXRlbHkgZmFtaWxpYXIgd2l0aCBMaW51eCBrZXJuZWwKLWRldmVsb3BtZW50IChvciwgaW5kZWVkLCBmcmVlIHNvZnR3YXJlIGRldmVsb3BtZW50IGluIGdlbmVyYWwpLiAgV2hpbGUKLXRoZXJlIGlzIHNvbWUgdGVjaG5pY2FsIG1hdGVyaWFsIGhlcmUsIHRoaXMgaXMgdmVyeSBtdWNoIGEgcHJvY2Vzcy1vcmllbnRlZAotZGlzY3Vzc2lvbiB3aGljaCBkb2VzIG5vdCByZXF1aXJlIGEgZGVlcCBrbm93bGVkZ2Ugb2Yga2VybmVsIHByb2dyYW1taW5nIHRvCi11bmRlcnN0YW5kLgotCi0KLTEuMTogRVhFQ1VUSVZFIFNVTU1BUlkKLQotVGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uIGNvdmVycyB0aGUgc2NvcGUgb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzCi1hbmQgdGhlIGtpbmRzIG9mIGZydXN0cmF0aW9ucyB0aGF0IGRldmVsb3BlcnMgYW5kIHRoZWlyIGVtcGxveWVycyBjYW4KLWVuY291bnRlciB0aGVyZS4gIFRoZXJlIGFyZSBhIGdyZWF0IG1hbnkgcmVhc29ucyB3aHkga2VybmVsIGNvZGUgc2hvdWxkIGJlCi1tZXJnZWQgaW50byB0aGUgb2ZmaWNpYWwgKCJtYWlubGluZSIpIGtlcm5lbCwgaW5jbHVkaW5nIGF1dG9tYXRpYwotYXZhaWxhYmlsaXR5IHRvIHVzZXJzLCBjb21tdW5pdHkgc3VwcG9ydCBpbiBtYW55IGZvcm1zLCBhbmQgdGhlIGFiaWxpdHkgdG8KLWluZmx1ZW5jZSB0aGUgZGlyZWN0aW9uIG9mIGtlcm5lbCBkZXZlbG9wbWVudC4gIENvZGUgY29udHJpYnV0ZWQgdG8gdGhlCi1MaW51eCBrZXJuZWwgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhIEdQTC1jb21wYXRpYmxlIGxpY2Vuc2UuCi0KLVNlY3Rpb24gMiBpbnRyb2R1Y2VzIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLCB0aGUga2VybmVsIHJlbGVhc2UgY3ljbGUsIGFuZAotdGhlIG1lY2hhbmljcyBvZiB0aGUgbWVyZ2Ugd2luZG93LiAgVGhlIHZhcmlvdXMgcGhhc2VzIGluIHRoZSBwYXRjaAotZGV2ZWxvcG1lbnQsIHJldmlldywgYW5kIG1lcmdpbmcgY3ljbGUgYXJlIGNvdmVyZWQuICBUaGVyZSBpcyBzb21lCi1kaXNjdXNzaW9uIG9mIHRvb2xzIGFuZCBtYWlsaW5nIGxpc3RzLiAgRGV2ZWxvcGVycyB3YW50aW5nIHRvIGdldCBzdGFydGVkCi13aXRoIGtlcm5lbCBkZXZlbG9wbWVudCBhcmUgZW5jb3VyYWdlZCB0byB0cmFjayBkb3duIGFuZCBmaXggYnVncyBhcyBhbgotaW5pdGlhbCBleGVyY2lzZS4KLQotU2VjdGlvbiAzIGNvdmVycyBlYXJseS1zdGFnZSBwcm9qZWN0IHBsYW5uaW5nLCB3aXRoIGFuIGVtcGhhc2lzIG9uCi1pbnZvbHZpbmcgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSBhcyBzb29uIGFzIHBvc3NpYmxlLgotCi1TZWN0aW9uIDQgaXMgYWJvdXQgdGhlIGNvZGluZyBwcm9jZXNzOyBzZXZlcmFsIHBpdGZhbGxzIHdoaWNoIGhhdmUgYmVlbgotZW5jb3VudGVyZWQgYnkgb3RoZXIgZGV2ZWxvcGVycyBhcmUgZGlzY3Vzc2VkLiAgU29tZSByZXF1aXJlbWVudHMgZm9yCi1wYXRjaGVzIGFyZSBjb3ZlcmVkLCBhbmQgdGhlcmUgaXMgYW4gaW50cm9kdWN0aW9uIHRvIHNvbWUgb2YgdGhlIHRvb2xzCi13aGljaCBjYW4gaGVscCB0byBlbnN1cmUgdGhhdCBrZXJuZWwgcGF0Y2hlcyBhcmUgY29ycmVjdC4KLQotU2VjdGlvbiA1IHRhbGtzIGFib3V0IHRoZSBwcm9jZXNzIG9mIHBvc3RpbmcgcGF0Y2hlcyBmb3IgcmV2aWV3LiAgVG8gYmUKLXRha2VuIHNlcmlvdXNseSBieSB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LCBwYXRjaGVzIG11c3QgYmUgcHJvcGVybHkKLWZvcm1hdHRlZCBhbmQgZGVzY3JpYmVkLCBhbmQgdGhleSBtdXN0IGJlIHNlbnQgdG8gdGhlIHJpZ2h0IHBsYWNlLgotRm9sbG93aW5nIHRoZSBhZHZpY2UgaW4gdGhpcyBzZWN0aW9uIHNob3VsZCBoZWxwIHRvIGVuc3VyZSB0aGUgYmVzdAotcG9zc2libGUgcmVjZXB0aW9uIGZvciB5b3VyIHdvcmsuCi0KLVNlY3Rpb24gNiBjb3ZlcnMgd2hhdCBoYXBwZW5zIGFmdGVyIHBvc3RpbmcgcGF0Y2hlczsgdGhlIGpvYiBpcyBmYXIgZnJvbQotZG9uZSBhdCB0aGF0IHBvaW50LiAgV29ya2luZyB3aXRoIHJldmlld2VycyBpcyBhIGNydWNpYWwgcGFydCBvZiB0aGUKLWRldmVsb3BtZW50IHByb2Nlc3M7IHRoaXMgc2VjdGlvbiBvZmZlcnMgYSBudW1iZXIgb2YgdGlwcyBvbiBob3cgdG8gYXZvaWQKLXByb2JsZW1zIGF0IHRoaXMgaW1wb3J0YW50IHN0YWdlLiAgRGV2ZWxvcGVycyBhcmUgY2F1dGlvbmVkIGFnYWluc3QKLWFzc3VtaW5nIHRoYXQgdGhlIGpvYiBpcyBkb25lIHdoZW4gYSBwYXRjaCBpcyBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUuCi0KLVNlY3Rpb24gNyBpbnRyb2R1Y2VzIGEgY291cGxlIG9mICJhZHZhbmNlZCIgdG9waWNzOiBtYW5hZ2luZyBwYXRjaGVzIHdpdGgKLWdpdCBhbmQgcmV2aWV3aW5nIHBhdGNoZXMgcG9zdGVkIGJ5IG90aGVycy4KLQotU2VjdGlvbiA4IGNvbmNsdWRlcyB0aGUgZG9jdW1lbnQgd2l0aCBwb2ludGVycyB0byBzb3VyY2VzIGZvciBtb3JlCi1pbmZvcm1hdGlvbiBvbiBrZXJuZWwgZGV2ZWxvcG1lbnQuCi0KLQotMS4yOiBXSEFUIFRISVMgRE9DVU1FTlQgSVMgQUJPVVQKLQotVGhlIExpbnV4IGtlcm5lbCwgYXQgb3ZlciA4IG1pbGxpb24gbGluZXMgb2YgY29kZSBhbmQgd2VsbCBvdmVyIDEwMDAKLWNvbnRyaWJ1dG9ycyB0byBlYWNoIHJlbGVhc2UsIGlzIG9uZSBvZiB0aGUgbGFyZ2VzdCBhbmQgbW9zdCBhY3RpdmUgZnJlZQotc29mdHdhcmUgcHJvamVjdHMgaW4gZXhpc3RlbmNlLiAgU2luY2UgaXRzIGh1bWJsZSBiZWdpbm5pbmcgaW4gMTk5MSwgdGhpcwota2VybmVsIGhhcyBldm9sdmVkIGludG8gYSBiZXN0LW9mLWJyZWVkIG9wZXJhdGluZyBzeXN0ZW0gY29tcG9uZW50IHdoaWNoCi1ydW5zIG9uIHBvY2tldC1zaXplZCBkaWdpdGFsIG11c2ljIHBsYXllcnMsIGRlc2t0b3AgUENzLCB0aGUgbGFyZ2VzdAotc3VwZXJjb21wdXRlcnMgaW4gZXhpc3RlbmNlLCBhbmQgYWxsIHR5cGVzIG9mIHN5c3RlbXMgaW4gYmV0d2Vlbi4gIEl0IGlzIGEKLXJvYnVzdCwgZWZmaWNpZW50LCBhbmQgc2NhbGFibGUgc29sdXRpb24gZm9yIGFsbW9zdCBhbnkgc2l0dWF0aW9uLgotCi1XaXRoIHRoZSBncm93dGggb2YgTGludXggaGFzIGNvbWUgYW4gaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBkZXZlbG9wZXJzCi0oYW5kIGNvbXBhbmllcykgd2lzaGluZyB0byBwYXJ0aWNpcGF0ZSBpbiBpdHMgZGV2ZWxvcG1lbnQuICBIYXJkd2FyZQotdmVuZG9ycyB3YW50IHRvIGVuc3VyZSB0aGF0IExpbnV4IHN1cHBvcnRzIHRoZWlyIHByb2R1Y3RzIHdlbGwsIG1ha2luZwotdGhvc2UgcHJvZHVjdHMgYXR0cmFjdGl2ZSB0byBMaW51eCB1c2Vycy4gIEVtYmVkZGVkIHN5c3RlbXMgdmVuZG9ycywgd2hvCi11c2UgTGludXggYXMgYSBjb21wb25lbnQgaW4gYW4gaW50ZWdyYXRlZCBwcm9kdWN0LCB3YW50IExpbnV4IHRvIGJlIGFzCi1jYXBhYmxlIGFuZCB3ZWxsLXN1aXRlZCB0byB0aGUgdGFzayBhdCBoYW5kIGFzIHBvc3NpYmxlLiAgRGlzdHJpYnV0b3JzIGFuZAotb3RoZXIgc29mdHdhcmUgdmVuZG9ycyB3aG8gYmFzZSB0aGVpciBwcm9kdWN0cyBvbiBMaW51eCBoYXZlIGEgY2xlYXIKLWludGVyZXN0IGluIHRoZSBjYXBhYmlsaXRpZXMsIHBlcmZvcm1hbmNlLCBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlIExpbnV4Ci1rZXJuZWwuICBBbmQgZW5kIHVzZXJzLCB0b28sIHdpbGwgb2Z0ZW4gd2lzaCB0byBjaGFuZ2UgTGludXggdG8gbWFrZSBpdAotYmV0dGVyIHN1aXQgdGhlaXIgbmVlZHMuCi0KLU9uZSBvZiB0aGUgbW9zdCBjb21wZWxsaW5nIGZlYXR1cmVzIG9mIExpbnV4IGlzIHRoYXQgaXQgaXMgYWNjZXNzaWJsZSB0bwotdGhlc2UgZGV2ZWxvcGVyczsgYW55Ym9keSB3aXRoIHRoZSByZXF1aXNpdGUgc2tpbGxzIGNhbiBpbXByb3ZlIExpbnV4IGFuZAotaW5mbHVlbmNlIHRoZSBkaXJlY3Rpb24gb2YgaXRzIGRldmVsb3BtZW50LiAgUHJvcHJpZXRhcnkgcHJvZHVjdHMgY2Fubm90Ci1vZmZlciB0aGlzIGtpbmQgb2Ygb3Blbm5lc3MsIHdoaWNoIGlzIGEgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIGZyZWUgc29mdHdhcmUKLXByb2Nlc3MuICBCdXQsIGlmIGFueXRoaW5nLCB0aGUga2VybmVsIGlzIGV2ZW4gbW9yZSBvcGVuIHRoYW4gbW9zdCBvdGhlcgotZnJlZSBzb2Z0d2FyZSBwcm9qZWN0cy4gIEEgdHlwaWNhbCB0aHJlZS1tb250aCBrZXJuZWwgZGV2ZWxvcG1lbnQgY3ljbGUgY2FuCi1pbnZvbHZlIG92ZXIgMTAwMCBkZXZlbG9wZXJzIHdvcmtpbmcgZm9yIG1vcmUgdGhhbiAxMDAgZGlmZmVyZW50IGNvbXBhbmllcwotKG9yIGZvciBubyBjb21wYW55IGF0IGFsbCkuCi0KLVdvcmtpbmcgd2l0aCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBpcyBub3QgZXNwZWNpYWxseSBoYXJkLiAgQnV0LAotdGhhdCBub3R3aXRoc3RhbmRpbmcsIG1hbnkgcG90ZW50aWFsIGNvbnRyaWJ1dG9ycyBoYXZlIGV4cGVyaWVuY2VkCi1kaWZmaWN1bHRpZXMgd2hlbiB0cnlpbmcgdG8gZG8ga2VybmVsIHdvcmsuICBUaGUga2VybmVsIGNvbW11bml0eSBoYXMKLWV2b2x2ZWQgaXRzIG93biBkaXN0aW5jdCB3YXlzIG9mIG9wZXJhdGluZyB3aGljaCBhbGxvdyBpdCB0byBmdW5jdGlvbgotc21vb3RobHkgKGFuZCBwcm9kdWNlIGEgaGlnaC1xdWFsaXR5IHByb2R1Y3QpIGluIGFuIGVudmlyb25tZW50IHdoZXJlCi10aG91c2FuZHMgb2YgbGluZXMgb2YgY29kZSBhcmUgYmVpbmcgY2hhbmdlZCBldmVyeSBkYXkuICBTbyBpdCBpcyBub3QKLXN1cnByaXNpbmcgdGhhdCBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkaWZmZXJzIGdyZWF0bHkgZnJvbQotcHJvcHJpZXRhcnkgZGV2ZWxvcG1lbnQgbWV0aG9kcy4KLQotVGhlIGtlcm5lbCdzIGRldmVsb3BtZW50IHByb2Nlc3MgbWF5IGNvbWUgYWNyb3NzIGFzIHN0cmFuZ2UgYW5kCi1pbnRpbWlkYXRpbmcgdG8gbmV3IGRldmVsb3BlcnMsIGJ1dCB0aGVyZSBhcmUgZ29vZCByZWFzb25zIGFuZCBzb2xpZAotZXhwZXJpZW5jZSBiZWhpbmQgaXQuICBBIGRldmVsb3BlciB3aG8gZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUga2VybmVsCi1jb21tdW5pdHkncyB3YXlzIChvciwgd29yc2UsIHdobyB0cmllcyB0byBmbG91dCBvciBjaXJjdW12ZW50IHRoZW0pIHdpbGwKLWhhdmUgYSBmcnVzdHJhdGluZyBleHBlcmllbmNlIGluIHN0b3JlLiAgVGhlIGRldmVsb3BtZW50IGNvbW11bml0eSwgd2hpbGUKLWJlaW5nIGhlbHBmdWwgdG8gdGhvc2Ugd2hvIGFyZSB0cnlpbmcgdG8gbGVhcm4sIGhhcyBsaXR0bGUgdGltZSBmb3IgdGhvc2UKLXdobyB3aWxsIG5vdCBsaXN0ZW4gb3Igd2hvIGRvIG5vdCBjYXJlIGFib3V0IHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLgotCi1JdCBpcyBob3BlZCB0aGF0IHRob3NlIHdobyByZWFkIHRoaXMgZG9jdW1lbnQgd2lsbCBiZSBhYmxlIHRvIGF2b2lkIHRoYXQKLWZydXN0cmF0aW5nIGV4cGVyaWVuY2UuICBUaGVyZSBpcyBhIGxvdCBvZiBtYXRlcmlhbCBoZXJlLCBidXQgdGhlIGVmZm9ydAotaW52b2x2ZWQgaW4gcmVhZGluZyBpdCB3aWxsIGJlIHJlcGFpZCBpbiBzaG9ydCBvcmRlci4gIFRoZSBkZXZlbG9wbWVudAotY29tbXVuaXR5IGlzIGFsd2F5cyBpbiBuZWVkIG9mIGRldmVsb3BlcnMgd2hvIHdpbGwgaGVscCB0byBtYWtlIHRoZSBrZXJuZWwKLWJldHRlcjsgdGhlIGZvbGxvd2luZyB0ZXh0IHNob3VsZCBoZWxwIHlvdSAtIG9yIHRob3NlIHdobyB3b3JrIGZvciB5b3UgLQotam9pbiBvdXIgY29tbXVuaXR5LgotCi0KLTEuMzogQ1JFRElUUwotCi1UaGlzIGRvY3VtZW50IHdhcyB3cml0dGVuIGJ5IEpvbmF0aGFuIENvcmJldCwgY29yYmV0QGx3bi5uZXQuICBJdCBoYXMgYmVlbgotaW1wcm92ZWQgYnkgY29tbWVudHMgZnJvbSBKb2hhbm5lcyBCZXJnLCBKYW1lcyBCZXJyeSwgQWxleCBDaGlhbmcsIFJvbGFuZAotRHJlaWVyLCBSYW5keSBEdW5sYXAsIEpha2UgRWRnZSwgSmlyaSBLb3NpbmEsIE1hdHQgTWFja2FsbCwgQXJ0aHVyIE1hcnNoLAotQW1hbmRhIE1jUGhlcnNvbiwgQW5kcmV3IE1vcnRvbiwgQW5kcmV3IFByaWNlLCBUc3VnaWthenUgU2hpYmF0YSwgYW5kCi1Kb2NoZW4gVm/Dny4KLQotVGhpcyB3b3JrIHdhcyBzdXBwb3J0ZWQgYnkgdGhlIExpbnV4IEZvdW5kYXRpb247IHRoYW5rcyBlc3BlY2lhbGx5IHRvCi1BbWFuZGEgTWNQaGVyc29uLCB3aG8gc2F3IHRoZSB2YWx1ZSBvZiB0aGlzIGVmZm9ydCBhbmQgbWFkZSBpdCBhbGwgaGFwcGVuLgotCi0KLTEuNDogVEhFIElNUE9SVEFOQ0UgT0YgR0VUVElORyBDT0RFIElOVE8gVEhFIE1BSU5MSU5FCi0KLVNvbWUgY29tcGFuaWVzIGFuZCBkZXZlbG9wZXJzIG9jY2FzaW9uYWxseSB3b25kZXIgd2h5IHRoZXkgc2hvdWxkIGJvdGhlcgotbGVhcm5pbmcgaG93IHRvIHdvcmsgd2l0aCB0aGUga2VybmVsIGNvbW11bml0eSBhbmQgZ2V0IHRoZWlyIGNvZGUgaW50byB0aGUKLW1haW5saW5lIGtlcm5lbCAodGhlICJtYWlubGluZSIgYmVpbmcgdGhlIGtlcm5lbCBtYWludGFpbmVkIGJ5IExpbnVzCi1Ub3J2YWxkcyBhbmQgdXNlZCBhcyBhIGJhc2UgYnkgTGludXggZGlzdHJpYnV0b3JzKS4gIEluIHRoZSBzaG9ydCB0ZXJtLAotY29udHJpYnV0aW5nIGNvZGUgY2FuIGxvb2sgbGlrZSBhbiBhdm9pZGFibGUgZXhwZW5zZTsgaXQgc2VlbXMgZWFzaWVyIHRvCi1qdXN0IGtlZXAgdGhlIGNvZGUgc2VwYXJhdGUgYW5kIHN1cHBvcnQgdXNlcnMgZGlyZWN0bHkuICBUaGUgdHJ1dGggb2YgdGhlCi1tYXR0ZXIgaXMgdGhhdCBrZWVwaW5nIGNvZGUgc2VwYXJhdGUgKCJvdXQgb2YgdHJlZSIpIGlzIGEgZmFsc2UgZWNvbm9teS4KLQotQXMgYSB3YXkgb2YgaWxsdXN0cmF0aW5nIHRoZSBjb3N0cyBvZiBvdXQtb2YtdHJlZSBjb2RlLCBoZXJlIGFyZSBhIGZldwotcmVsZXZhbnQgYXNwZWN0cyBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3M7IG1vc3Qgb2YgdGhlc2Ugd2lsbCBiZQotZGlzY3Vzc2VkIGluIGdyZWF0ZXIgZGV0YWlsIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQuICBDb25zaWRlcjoKLQotLSBDb2RlIHdoaWNoIGhhcyBiZWVuIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwgaXMgYXZhaWxhYmxlIHRvIGFsbAotICBMaW51eCB1c2Vycy4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBwcmVzZW50IG9uIGFsbCBkaXN0cmlidXRpb25zIHdoaWNoCi0gIGVuYWJsZSBpdC4gIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGRyaXZlciBkaXNrcywgZG93bmxvYWRzLCBvciB0aGUgaGFzc2xlcwotICBvZiBzdXBwb3J0aW5nIG11bHRpcGxlIHZlcnNpb25zIG9mIG11bHRpcGxlIGRpc3RyaWJ1dGlvbnM7IGl0IGFsbCBqdXN0Ci0gIHdvcmtzLCBmb3IgdGhlIGRldmVsb3BlciBhbmQgZm9yIHRoZSB1c2VyLiAgSW5jb3Jwb3JhdGlvbiBpbnRvIHRoZQotICBtYWlubGluZSBzb2x2ZXMgYSBsYXJnZSBudW1iZXIgb2YgZGlzdHJpYnV0aW9uIGFuZCBzdXBwb3J0IHByb2JsZW1zLgotCi0tIFdoaWxlIGtlcm5lbCBkZXZlbG9wZXJzIHN0cml2ZSB0byBtYWludGFpbiBhIHN0YWJsZSBpbnRlcmZhY2UgdG8gdXNlcgotICBzcGFjZSwgdGhlIGludGVybmFsIGtlcm5lbCBBUEkgaXMgaW4gY29uc3RhbnQgZmx1eC4gIFRoZSBsYWNrIG9mIGEgc3RhYmxlCi0gIGludGVybmFsIGludGVyZmFjZSBpcyBhIGRlbGliZXJhdGUgZGVzaWduIGRlY2lzaW9uOyBpdCBhbGxvd3MgZnVuZGFtZW50YWwKLSAgaW1wcm92ZW1lbnRzIHRvIGJlIG1hZGUgYXQgYW55IHRpbWUgYW5kIHJlc3VsdHMgaW4gaGlnaGVyLXF1YWxpdHkgY29kZS4KLSAgQnV0IG9uZSByZXN1bHQgb2YgdGhhdCBwb2xpY3kgaXMgdGhhdCBhbnkgb3V0LW9mLXRyZWUgY29kZSByZXF1aXJlcwotICBjb25zdGFudCB1cGtlZXAgaWYgaXQgaXMgdG8gd29yayB3aXRoIG5ldyBrZXJuZWxzLiAgTWFpbnRhaW5pbmcKLSAgb3V0LW9mLXRyZWUgY29kZSByZXF1aXJlcyBzaWduaWZpY2FudCBhbW91bnRzIG9mIHdvcmsganVzdCB0byBrZWVwIHRoYXQKLSAgY29kZSB3b3JraW5nLgotCi0gIENvZGUgd2hpY2ggaXMgaW4gdGhlIG1haW5saW5lLCBpbnN0ZWFkLCBkb2VzIG5vdCByZXF1aXJlIHRoaXMgd29yayBhcyB0aGUKLSAgcmVzdWx0IG9mIGEgc2ltcGxlIHJ1bGUgcmVxdWlyaW5nIGFueSBkZXZlbG9wZXIgd2hvIG1ha2VzIGFuIEFQSSBjaGFuZ2UKLSAgdG8gYWxzbyBmaXggYW55IGNvZGUgdGhhdCBicmVha3MgYXMgdGhlIHJlc3VsdCBvZiB0aGF0IGNoYW5nZS4gIFNvIGNvZGUKLSAgd2hpY2ggaGFzIGJlZW4gbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGhhcyBzaWduaWZpY2FudGx5IGxvd2VyCi0gIG1haW50ZW5hbmNlIGNvc3RzLgotCi0tIEJleW9uZCB0aGF0LCBjb2RlIHdoaWNoIGlzIGluIHRoZSBrZXJuZWwgd2lsbCBvZnRlbiBiZSBpbXByb3ZlZCBieSBvdGhlcgotICBkZXZlbG9wZXJzLiAgU3VycHJpc2luZyByZXN1bHRzIGNhbiBjb21lIGZyb20gZW1wb3dlcmluZyB5b3VyIHVzZXIKLSAgY29tbXVuaXR5IGFuZCBjdXN0b21lcnMgdG8gaW1wcm92ZSB5b3VyIHByb2R1Y3QuCi0KLS0gS2VybmVsIGNvZGUgaXMgc3ViamVjdGVkIHRvIHJldmlldywgYm90aCBiZWZvcmUgYW5kIGFmdGVyIG1lcmdpbmcgaW50bwotICB0aGUgbWFpbmxpbmUuICBObyBtYXR0ZXIgaG93IHN0cm9uZyB0aGUgb3JpZ2luYWwgZGV2ZWxvcGVyJ3Mgc2tpbGxzIGFyZSwKLSAgdGhpcyByZXZpZXcgcHJvY2VzcyBpbnZhcmlhYmx5IGZpbmRzIHdheXMgaW4gd2hpY2ggdGhlIGNvZGUgY2FuIGJlCi0gIGltcHJvdmVkLiAgT2Z0ZW4gcmV2aWV3IGZpbmRzIHNldmVyZSBidWdzIGFuZCBzZWN1cml0eSBwcm9ibGVtcy4gIFRoaXMgaXMKLSAgZXNwZWNpYWxseSB0cnVlIGZvciBjb2RlIHdoaWNoIGhhcyBiZWVuIGRldmVsb3BlZCBpbiBhIGNsb3NlZAotICBlbnZpcm9ubWVudDsgc3VjaCBjb2RlIGJlbmVmaXRzIHN0cm9uZ2x5IGZyb20gcmV2aWV3IGJ5IG91dHNpZGUKLSAgZGV2ZWxvcGVycy4gIE91dC1vZi10cmVlIGNvZGUgaXMgbG93ZXItcXVhbGl0eSBjb2RlLgotCi0tIFBhcnRpY2lwYXRpb24gaW4gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MgaXMgeW91ciB3YXkgdG8gaW5mbHVlbmNlIHRoZQotICBkaXJlY3Rpb24gb2Yga2VybmVsIGRldmVsb3BtZW50LiAgVXNlcnMgd2hvIGNvbXBsYWluIGZyb20gdGhlIHNpZGVsaW5lcwotICBhcmUgaGVhcmQsIGJ1dCBhY3RpdmUgZGV2ZWxvcGVycyBoYXZlIGEgc3Ryb25nZXIgdm9pY2UgLSBhbmQgdGhlIGFiaWxpdHkKLSAgdG8gaW1wbGVtZW50IGNoYW5nZXMgd2hpY2ggbWFrZSB0aGUga2VybmVsIHdvcmsgYmV0dGVyIGZvciB0aGVpciBuZWVkcy4KLQotLSBXaGVuIGNvZGUgaXMgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5LCB0aGUgcG9zc2liaWxpdHkgdGhhdCBhIHRoaXJkIHBhcnR5Ci0gIHdpbGwgY29udHJpYnV0ZSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNpbWlsYXIgZmVhdHVyZSBhbHdheXMKLSAgZXhpc3RzLiAgU2hvdWxkIHRoYXQgaGFwcGVuLCBnZXR0aW5nIHlvdXIgY29kZSBtZXJnZWQgd2lsbCBiZWNvbWUgbXVjaAotICBoYXJkZXIgLSB0byB0aGUgcG9pbnQgb2YgaW1wb3NzaWJpbGl0eS4gIFRoZW4geW91IHdpbGwgYmUgZmFjZWQgd2l0aCB0aGUKLSAgdW5wbGVhc2FudCBhbHRlcm5hdGl2ZXMgb2YgZWl0aGVyICgxKSBtYWludGFpbmluZyBhIG5vbnN0YW5kYXJkIGZlYXR1cmUKLSAgb3V0IG9mIHRyZWUgaW5kZWZpbml0ZWx5LCBvciAoMikgYWJhbmRvbmluZyB5b3VyIGNvZGUgYW5kIG1pZ3JhdGluZyB5b3VyCi0gIHVzZXJzIG92ZXIgdG8gdGhlIGluLXRyZWUgdmVyc2lvbi4KLQotLSBDb250cmlidXRpb24gb2YgY29kZSBpcyB0aGUgZnVuZGFtZW50YWwgYWN0aW9uIHdoaWNoIG1ha2VzIHRoZSB3aG9sZQotICBwcm9jZXNzIHdvcmsuICBCeSBjb250cmlidXRpbmcgeW91ciBjb2RlIHlvdSBjYW4gYWRkIG5ldyBmdW5jdGlvbmFsaXR5IHRvCi0gIHRoZSBrZXJuZWwgYW5kIHByb3ZpZGUgY2FwYWJpbGl0aWVzIGFuZCBleGFtcGxlcyB3aGljaCBhcmUgb2YgdXNlIHRvCi0gIG90aGVyIGtlcm5lbCBkZXZlbG9wZXJzLiAgSWYgeW91IGhhdmUgZGV2ZWxvcGVkIGNvZGUgZm9yIExpbnV4IChvciBhcmUKLSAgdGhpbmtpbmcgYWJvdXQgZG9pbmcgc28pLCB5b3UgY2xlYXJseSBoYXZlIGFuIGludGVyZXN0IGluIHRoZSBjb250aW51ZWQKLSAgc3VjY2VzcyBvZiB0aGlzIHBsYXRmb3JtOyBjb250cmlidXRpbmcgY29kZSBpcyBvbmUgb2YgdGhlIGJlc3Qgd2F5cyB0bwotICBoZWxwIGVuc3VyZSB0aGF0IHN1Y2Nlc3MuCi0KLUFsbCBvZiB0aGUgcmVhc29uaW5nIGFib3ZlIGFwcGxpZXMgdG8gYW55IG91dC1vZi10cmVlIGtlcm5lbCBjb2RlLAotaW5jbHVkaW5nIGNvZGUgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgaW4gcHJvcHJpZXRhcnksIGJpbmFyeS1vbmx5IGZvcm0uCi1UaGVyZSBhcmUsIGhvd2V2ZXIsIGFkZGl0aW9uYWwgZmFjdG9ycyB3aGljaCBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50Ci1iZWZvcmUgY29uc2lkZXJpbmcgYW55IHNvcnQgb2YgYmluYXJ5LW9ubHkga2VybmVsIGNvZGUgZGlzdHJpYnV0aW9uLiAgVGhlc2UKLWluY2x1ZGU6Ci0KLS0gVGhlIGxlZ2FsIGlzc3VlcyBhcm91bmQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBwcm9wcmlldGFyeSBrZXJuZWwgbW9kdWxlcwotICBhcmUgY2xvdWR5IGF0IGJlc3Q7IHF1aXRlIGEgZmV3IGtlcm5lbCBjb3B5cmlnaHQgaG9sZGVycyBiZWxpZXZlIHRoYXQKLSAgbW9zdCBiaW5hcnktb25seSBtb2R1bGVzIGFyZSBkZXJpdmVkIHByb2R1Y3RzIG9mIHRoZSBrZXJuZWwgYW5kIHRoYXQsIGFzCi0gIGEgcmVzdWx0LCB0aGVpciBkaXN0cmlidXRpb24gaXMgYSB2aW9sYXRpb24gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICBsaWNlbnNlIChhYm91dCB3aGljaCBtb3JlIHdpbGwgYmUgc2FpZCBiZWxvdykuICBZb3VyIGF1dGhvciBpcyBub3QgYQotICBsYXd5ZXIsIGFuZCBub3RoaW5nIGluIHRoaXMgZG9jdW1lbnQgY2FuIHBvc3NpYmx5IGJlIGNvbnNpZGVyZWQgdG8gYmUKLSAgbGVnYWwgYWR2aWNlLiAgVGhlIHRydWUgbGVnYWwgc3RhdHVzIG9mIGNsb3NlZC1zb3VyY2UgbW9kdWxlcyBjYW4gb25seSBiZQotICBkZXRlcm1pbmVkIGJ5IHRoZSBjb3VydHMuICBCdXQgdGhlIHVuY2VydGFpbnR5IHdoaWNoIGhhdW50cyB0aG9zZSBtb2R1bGVzCi0gIGlzIHRoZXJlIHJlZ2FyZGxlc3MuCi0KLS0gQmluYXJ5IG1vZHVsZXMgZ3JlYXRseSBpbmNyZWFzZSB0aGUgZGlmZmljdWx0eSBvZiBkZWJ1Z2dpbmcga2VybmVsCi0gIHByb2JsZW1zLCB0byB0aGUgcG9pbnQgdGhhdCBtb3N0IGtlcm5lbCBkZXZlbG9wZXJzIHdpbGwgbm90IGV2ZW4gdHJ5LiAgU28KLSAgdGhlIGRpc3RyaWJ1dGlvbiBvZiBiaW5hcnktb25seSBtb2R1bGVzIHdpbGwgbWFrZSBpdCBoYXJkZXIgZm9yIHlvdXIKLSAgdXNlcnMgdG8gZ2V0IHN1cHBvcnQgZnJvbSB0aGUgY29tbXVuaXR5LgotCi0tIFN1cHBvcnQgaXMgYWxzbyBoYXJkZXIgZm9yIGRpc3RyaWJ1dG9ycyBvZiBiaW5hcnktb25seSBtb2R1bGVzLCB3aG8gbXVzdAotICBwcm92aWRlIGEgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGZvciBldmVyeSBkaXN0cmlidXRpb24gYW5kIGV2ZXJ5IGtlcm5lbAotICB2ZXJzaW9uIHRoZXkgd2lzaCB0byBzdXBwb3J0LiAgRG96ZW5zIG9mIGJ1aWxkcyBvZiBhIHNpbmdsZSBtb2R1bGUgY2FuCi0gIGJlIHJlcXVpcmVkIHRvIHByb3ZpZGUgcmVhc29uYWJseSBjb21wcmVoZW5zaXZlIGNvdmVyYWdlLCBhbmQgeW91ciB1c2VycwotICB3aWxsIGhhdmUgdG8gdXBncmFkZSB5b3VyIG1vZHVsZSBzZXBhcmF0ZWx5IGV2ZXJ5IHRpbWUgdGhleSB1cGdyYWRlIHRoZWlyCi0gIGtlcm5lbC4KLQotLSBFdmVyeXRoaW5nIHRoYXQgd2FzIHNhaWQgYWJvdmUgYWJvdXQgY29kZSByZXZpZXcgYXBwbGllcyBkb3VibHkgdG8KLSAgY2xvc2VkLXNvdXJjZSBjb2RlLiAgU2luY2UgdGhpcyBjb2RlIGlzIG5vdCBhdmFpbGFibGUgYXQgYWxsLCBpdCBjYW5ub3QKLSAgaGF2ZSBiZWVuIHJldmlld2VkIGJ5IHRoZSBjb21tdW5pdHkgYW5kIHdpbGwsIGJleW9uZCBkb3VidCwgaGF2ZSBzZXJpb3VzCi0gIHByb2JsZW1zLgotCi1NYWtlcnMgb2YgZW1iZWRkZWQgc3lzdGVtcywgaW4gcGFydGljdWxhciwgbWF5IGJlIHRlbXB0ZWQgdG8gZGlzcmVnYXJkIG11Y2gKLW9mIHdoYXQgaGFzIGJlZW4gc2FpZCBpbiB0aGlzIHNlY3Rpb24gaW4gdGhlIGJlbGllZiB0aGF0IHRoZXkgYXJlIHNoaXBwaW5nCi1hIHNlbGYtY29udGFpbmVkIHByb2R1Y3Qgd2hpY2ggdXNlcyBhIGZyb3plbiBrZXJuZWwgdmVyc2lvbiBhbmQgcmVxdWlyZXMgbm8KLW1vcmUgZGV2ZWxvcG1lbnQgYWZ0ZXIgaXRzIHJlbGVhc2UuICBUaGlzIGFyZ3VtZW50IG1pc3NlcyB0aGUgdmFsdWUgb2YKLXdpZGVzcHJlYWQgY29kZSByZXZpZXcgYW5kIHRoZSB2YWx1ZSBvZiBhbGxvd2luZyB5b3VyIHVzZXJzIHRvIGFkZAotY2FwYWJpbGl0aWVzIHRvIHlvdXIgcHJvZHVjdC4gIEJ1dCB0aGVzZSBwcm9kdWN0cywgdG9vLCBoYXZlIGEgbGltaXRlZAotY29tbWVyY2lhbCBsaWZlLCBhZnRlciB3aGljaCBhIG5ldyB2ZXJzaW9uIG11c3QgYmUgcmVsZWFzZWQuICBBdCB0aGF0Ci1wb2ludCwgdmVuZG9ycyB3aG9zZSBjb2RlIGlzIGluIHRoZSBtYWlubGluZSBhbmQgd2VsbCBtYWludGFpbmVkIHdpbGwgYmUKLW11Y2ggYmV0dGVyIHBvc2l0aW9uZWQgdG8gZ2V0IHRoZSBuZXcgcHJvZHVjdCByZWFkeSBmb3IgbWFya2V0IHF1aWNrbHkuCi0KLQotMS41OiBMSUNFTlNJTkcKLQotQ29kZSBpcyBjb250cmlidXRlZCB0byB0aGUgTGludXgga2VybmVsIHVuZGVyIGEgbnVtYmVyIG9mIGxpY2Vuc2VzLCBidXQgYWxsCi1jb2RlIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLShHUEx2MiksIHdoaWNoIGlzIHRoZSBsaWNlbnNlIGNvdmVyaW5nIHRoZSBrZXJuZWwgZGlzdHJpYnV0aW9uIGFzIGEgd2hvbGUuCi1JbiBwcmFjdGljZSwgdGhhdCBtZWFucyB0aGF0IGFsbCBjb2RlIGNvbnRyaWJ1dGlvbnMgYXJlIGNvdmVyZWQgZWl0aGVyIGJ5Ci1HUEx2MiAod2l0aCwgb3B0aW9uYWxseSwgbGFuZ3VhZ2UgYWxsb3dpbmcgZGlzdHJpYnV0aW9uIHVuZGVyIGxhdGVyCi12ZXJzaW9ucyBvZiB0aGUgR1BMKSBvciB0aGUgdGhyZWUtY2xhdXNlIEJTRCBsaWNlbnNlLiAgQW55IGNvbnRyaWJ1dGlvbnMKLXdoaWNoIGFyZSBub3QgY292ZXJlZCBieSBhIGNvbXBhdGlibGUgbGljZW5zZSB3aWxsIG5vdCBiZSBhY2NlcHRlZCBpbnRvIHRoZQota2VybmVsLgotCi1Db3B5cmlnaHQgYXNzaWdubWVudHMgYXJlIG5vdCByZXF1aXJlZCAob3IgcmVxdWVzdGVkKSBmb3IgY29kZSBjb250cmlidXRlZAotdG8gdGhlIGtlcm5lbC4gIEFsbCBjb2RlIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwgcmV0YWlucyBpdHMKLW9yaWdpbmFsIG93bmVyc2hpcDsgYXMgYSByZXN1bHQsIHRoZSBrZXJuZWwgbm93IGhhcyB0aG91c2FuZHMgb2Ygb3duZXJzLgotCi1PbmUgaW1wbGljYXRpb24gb2YgdGhpcyBvd25lcnNoaXAgc3RydWN0dXJlIGlzIHRoYXQgYW55IGF0dGVtcHQgdG8gY2hhbmdlCi10aGUgbGljZW5zaW5nIG9mIHRoZSBrZXJuZWwgaXMgZG9vbWVkIHRvIGFsbW9zdCBjZXJ0YWluIGZhaWx1cmUuICBUaGVyZSBhcmUKLWZldyBwcmFjdGljYWwgc2NlbmFyaW9zIHdoZXJlIHRoZSBhZ3JlZW1lbnQgb2YgYWxsIGNvcHlyaWdodCBob2xkZXJzIGNvdWxkCi1iZSBvYnRhaW5lZCAob3IgdGhlaXIgY29kZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbCkuICBTbywgaW4gcGFydGljdWxhciwKLXRoZXJlIGlzIG5vIHByb3NwZWN0IG9mIGEgbWlncmF0aW9uIHRvIHZlcnNpb24gMyBvZiB0aGUgR1BMIGluIHRoZQotZm9yZXNlZWFibGUgZnV0dXJlLgotCi1JdCBpcyBpbXBlcmF0aXZlIHRoYXQgYWxsIGNvZGUgY29udHJpYnV0ZWQgdG8gdGhlIGtlcm5lbCBiZSBsZWdpdGltYXRlbHkKLWZyZWUgc29mdHdhcmUuICBGb3IgdGhhdCByZWFzb24sIGNvZGUgZnJvbSBhbm9ueW1vdXMgKG9yIHBzZXVkb255bW91cykKLWNvbnRyaWJ1dG9ycyB3aWxsIG5vdCBiZSBhY2NlcHRlZC4gIEFsbCBjb250cmlidXRvcnMgYXJlIHJlcXVpcmVkIHRvICJzaWduCi1vZmYiIG9uIHRoZWlyIGNvZGUsIHN0YXRpbmcgdGhhdCB0aGUgY29kZSBjYW4gYmUgZGlzdHJpYnV0ZWQgd2l0aCB0aGUKLWtlcm5lbCB1bmRlciB0aGUgR1BMLiAgQ29kZSB3aGljaCBoYXMgbm90IGJlZW4gbGljZW5zZWQgYXMgZnJlZSBzb2Z0d2FyZSBieQotaXRzIG93bmVyLCBvciB3aGljaCByaXNrcyBjcmVhdGluZyBjb3B5cmlnaHQtcmVsYXRlZCBwcm9ibGVtcyBmb3IgdGhlCi1rZXJuZWwgKHN1Y2ggYXMgY29kZSB3aGljaCBkZXJpdmVzIGZyb20gcmV2ZXJzZS1lbmdpbmVlcmluZyBlZmZvcnRzIGxhY2tpbmcKLXByb3BlciBzYWZlZ3VhcmRzKSBjYW5ub3QgYmUgY29udHJpYnV0ZWQuCi0KLVF1ZXN0aW9ucyBhYm91dCBjb3B5cmlnaHQtcmVsYXRlZCBpc3N1ZXMgYXJlIGNvbW1vbiBvbiBMaW51eCBkZXZlbG9wbWVudAotbWFpbGluZyBsaXN0cy4gIFN1Y2ggcXVlc3Rpb25zIHdpbGwgbm9ybWFsbHkgcmVjZWl2ZSBubyBzaG9ydGFnZSBvZgotYW5zd2VycywgYnV0IG9uZSBzaG91bGQgYmVhciBpbiBtaW5kIHRoYXQgdGhlIHBlb3BsZSBhbnN3ZXJpbmcgdGhvc2UKLXF1ZXN0aW9ucyBhcmUgbm90IGxhd3llcnMgYW5kIGNhbm5vdCBwcm92aWRlIGxlZ2FsIGFkdmljZS4gIElmIHlvdSBoYXZlCi1sZWdhbCBxdWVzdGlvbnMgcmVsYXRpbmcgdG8gTGludXggc291cmNlIGNvZGUsIHRoZXJlIGlzIG5vIHN1YnN0aXR1dGUgZm9yCi10YWxraW5nIHdpdGggYSBsYXd5ZXIgd2hvIHVuZGVyc3RhbmRzIHRoaXMgZmllbGQuICBSZWx5aW5nIG9uIGFuc3dlcnMKLW9idGFpbmVkIG9uIHRlY2huaWNhbCBtYWlsaW5nIGxpc3RzIGlzIGEgcmlza3kgYWZmYWlyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzEuSW50cm8ucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzEuSW50cm8ucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjQyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMS5JbnRyby5yc3QKQEAgLTAsMCArMSwyNjYgQEAKK0ludHJvZHV0aW9uCis9PT09PT09PT09PQorCitFeGVjdXRpdmUgc3VtbWFyeQorLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHJlc3Qgb2YgdGhpcyBzZWN0aW9uIGNvdmVycyB0aGUgc2NvcGUgb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzCithbmQgdGhlIGtpbmRzIG9mIGZydXN0cmF0aW9ucyB0aGF0IGRldmVsb3BlcnMgYW5kIHRoZWlyIGVtcGxveWVycyBjYW4KK2VuY291bnRlciB0aGVyZS4gIFRoZXJlIGFyZSBhIGdyZWF0IG1hbnkgcmVhc29ucyB3aHkga2VybmVsIGNvZGUgc2hvdWxkIGJlCittZXJnZWQgaW50byB0aGUgb2ZmaWNpYWwgKCJtYWlubGluZSIpIGtlcm5lbCwgaW5jbHVkaW5nIGF1dG9tYXRpYworYXZhaWxhYmlsaXR5IHRvIHVzZXJzLCBjb21tdW5pdHkgc3VwcG9ydCBpbiBtYW55IGZvcm1zLCBhbmQgdGhlIGFiaWxpdHkgdG8KK2luZmx1ZW5jZSB0aGUgZGlyZWN0aW9uIG9mIGtlcm5lbCBkZXZlbG9wbWVudC4gIENvZGUgY29udHJpYnV0ZWQgdG8gdGhlCitMaW51eCBrZXJuZWwgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBhIEdQTC1jb21wYXRpYmxlIGxpY2Vuc2UuCisKKzpyZWY6YGRldmVsb3BtZW50X3Byb2Nlc3NgIGludHJvZHVjZXMgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MsIHRoZSBrZXJuZWwKK3JlbGVhc2UgY3ljbGUsIGFuZCB0aGUgbWVjaGFuaWNzIG9mIHRoZSBtZXJnZSB3aW5kb3cuICBUaGUgdmFyaW91cyBwaGFzZXMgaW4KK3RoZSBwYXRjaCBkZXZlbG9wbWVudCwgcmV2aWV3LCBhbmQgbWVyZ2luZyBjeWNsZSBhcmUgY292ZXJlZC4gIFRoZXJlIGlzIHNvbWUKK2Rpc2N1c3Npb24gb2YgdG9vbHMgYW5kIG1haWxpbmcgbGlzdHMuICBEZXZlbG9wZXJzIHdhbnRpbmcgdG8gZ2V0IHN0YXJ0ZWQKK3dpdGgga2VybmVsIGRldmVsb3BtZW50IGFyZSBlbmNvdXJhZ2VkIHRvIHRyYWNrIGRvd24gYW5kIGZpeCBidWdzIGFzIGFuCitpbml0aWFsIGV4ZXJjaXNlLgorCis6cmVmOmBkZXZlbG9wbWVudF9lYXJseV9zdGFnZWAgY292ZXJzIGVhcmx5LXN0YWdlIHByb2plY3QgcGxhbm5pbmcsIHdpdGggYW4KK2VtcGhhc2lzIG9uIGludm9sdmluZyB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGFzIHNvb24gYXMgcG9zc2libGUuCisKKzpyZWY6YGRldmVsb3BtZW50X2NvZGluZ2AgaXMgYWJvdXQgdGhlIGNvZGluZyBwcm9jZXNzOyBzZXZlcmFsIHBpdGZhbGxzIHdoaWNoCitoYXZlIGJlZW4gZW5jb3VudGVyZWQgYnkgb3RoZXIgZGV2ZWxvcGVycyBhcmUgZGlzY3Vzc2VkLiAgU29tZSByZXF1aXJlbWVudHMgZm9yCitwYXRjaGVzIGFyZSBjb3ZlcmVkLCBhbmQgdGhlcmUgaXMgYW4gaW50cm9kdWN0aW9uIHRvIHNvbWUgb2YgdGhlIHRvb2xzCit3aGljaCBjYW4gaGVscCB0byBlbnN1cmUgdGhhdCBrZXJuZWwgcGF0Y2hlcyBhcmUgY29ycmVjdC4KKworOnJlZjpgZGV2ZWxvcG1lbnRfcG9zdGluZ2AgdGFsa3MgYWJvdXQgdGhlIHByb2Nlc3Mgb2YgcG9zdGluZyBwYXRjaGVzIGZvcgorcmV2aWV3LiBUbyBiZSB0YWtlbiBzZXJpb3VzbHkgYnkgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSwgcGF0Y2hlcyBtdXN0IGJlCitwcm9wZXJseSBmb3JtYXR0ZWQgYW5kIGRlc2NyaWJlZCwgYW5kIHRoZXkgbXVzdCBiZSBzZW50IHRvIHRoZSByaWdodCBwbGFjZS4KK0ZvbGxvd2luZyB0aGUgYWR2aWNlIGluIHRoaXMgc2VjdGlvbiBzaG91bGQgaGVscCB0byBlbnN1cmUgdGhlIGJlc3QKK3Bvc3NpYmxlIHJlY2VwdGlvbiBmb3IgeW91ciB3b3JrLgorCis6cmVmOmBkZXZlbG9wbWVudF9mb2xsb3d0aHJvdWdoYCBjb3ZlcnMgd2hhdCBoYXBwZW5zIGFmdGVyIHBvc3RpbmcgcGF0Y2hlczsgdGhlCitqb2IgaXMgZmFyIGZyb20gZG9uZSBhdCB0aGF0IHBvaW50LiAgV29ya2luZyB3aXRoIHJldmlld2VycyBpcyBhIGNydWNpYWwgcGFydAorb2YgdGhlIGRldmVsb3BtZW50IHByb2Nlc3M7IHRoaXMgc2VjdGlvbiBvZmZlcnMgYSBudW1iZXIgb2YgdGlwcyBvbiBob3cgdG8KK2F2b2lkIHByb2JsZW1zIGF0IHRoaXMgaW1wb3J0YW50IHN0YWdlLiAgRGV2ZWxvcGVycyBhcmUgY2F1dGlvbmVkIGFnYWluc3QKK2Fzc3VtaW5nIHRoYXQgdGhlIGpvYiBpcyBkb25lIHdoZW4gYSBwYXRjaCBpcyBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUuCisKKzpyZWY6YGRldmVsb3BtZW50X2FkdmFuY2VkdG9waWNzYCBpbnRyb2R1Y2VzIGEgY291cGxlIG9mICJhZHZhbmNlZCIgdG9waWNzOgorbWFuYWdpbmcgcGF0Y2hlcyB3aXRoIGdpdCBhbmQgcmV2aWV3aW5nIHBhdGNoZXMgcG9zdGVkIGJ5IG90aGVycy4KKworOnJlZjpgZGV2ZWxvcG1lbnRfY29uY2x1c2lvbmAgY29uY2x1ZGVzIHRoZSBkb2N1bWVudCB3aXRoIHBvaW50ZXJzIHRvIHNvdXJjZXMKK2ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGtlcm5lbCBkZXZlbG9wbWVudC4KKworV2hhdCB0aGlzIGRvY3VtZW50IGlzIGFib3V0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIExpbnV4IGtlcm5lbCwgYXQgb3ZlciA4IG1pbGxpb24gbGluZXMgb2YgY29kZSBhbmQgd2VsbCBvdmVyIDEwMDAKK2NvbnRyaWJ1dG9ycyB0byBlYWNoIHJlbGVhc2UsIGlzIG9uZSBvZiB0aGUgbGFyZ2VzdCBhbmQgbW9zdCBhY3RpdmUgZnJlZQorc29mdHdhcmUgcHJvamVjdHMgaW4gZXhpc3RlbmNlLiAgU2luY2UgaXRzIGh1bWJsZSBiZWdpbm5pbmcgaW4gMTk5MSwgdGhpcwora2VybmVsIGhhcyBldm9sdmVkIGludG8gYSBiZXN0LW9mLWJyZWVkIG9wZXJhdGluZyBzeXN0ZW0gY29tcG9uZW50IHdoaWNoCitydW5zIG9uIHBvY2tldC1zaXplZCBkaWdpdGFsIG11c2ljIHBsYXllcnMsIGRlc2t0b3AgUENzLCB0aGUgbGFyZ2VzdAorc3VwZXJjb21wdXRlcnMgaW4gZXhpc3RlbmNlLCBhbmQgYWxsIHR5cGVzIG9mIHN5c3RlbXMgaW4gYmV0d2Vlbi4gIEl0IGlzIGEKK3JvYnVzdCwgZWZmaWNpZW50LCBhbmQgc2NhbGFibGUgc29sdXRpb24gZm9yIGFsbW9zdCBhbnkgc2l0dWF0aW9uLgorCitXaXRoIHRoZSBncm93dGggb2YgTGludXggaGFzIGNvbWUgYW4gaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBkZXZlbG9wZXJzCisoYW5kIGNvbXBhbmllcykgd2lzaGluZyB0byBwYXJ0aWNpcGF0ZSBpbiBpdHMgZGV2ZWxvcG1lbnQuICBIYXJkd2FyZQordmVuZG9ycyB3YW50IHRvIGVuc3VyZSB0aGF0IExpbnV4IHN1cHBvcnRzIHRoZWlyIHByb2R1Y3RzIHdlbGwsIG1ha2luZwordGhvc2UgcHJvZHVjdHMgYXR0cmFjdGl2ZSB0byBMaW51eCB1c2Vycy4gIEVtYmVkZGVkIHN5c3RlbXMgdmVuZG9ycywgd2hvCit1c2UgTGludXggYXMgYSBjb21wb25lbnQgaW4gYW4gaW50ZWdyYXRlZCBwcm9kdWN0LCB3YW50IExpbnV4IHRvIGJlIGFzCitjYXBhYmxlIGFuZCB3ZWxsLXN1aXRlZCB0byB0aGUgdGFzayBhdCBoYW5kIGFzIHBvc3NpYmxlLiAgRGlzdHJpYnV0b3JzIGFuZAorb3RoZXIgc29mdHdhcmUgdmVuZG9ycyB3aG8gYmFzZSB0aGVpciBwcm9kdWN0cyBvbiBMaW51eCBoYXZlIGEgY2xlYXIKK2ludGVyZXN0IGluIHRoZSBjYXBhYmlsaXRpZXMsIHBlcmZvcm1hbmNlLCBhbmQgcmVsaWFiaWxpdHkgb2YgdGhlIExpbnV4CitrZXJuZWwuICBBbmQgZW5kIHVzZXJzLCB0b28sIHdpbGwgb2Z0ZW4gd2lzaCB0byBjaGFuZ2UgTGludXggdG8gbWFrZSBpdAorYmV0dGVyIHN1aXQgdGhlaXIgbmVlZHMuCisKK09uZSBvZiB0aGUgbW9zdCBjb21wZWxsaW5nIGZlYXR1cmVzIG9mIExpbnV4IGlzIHRoYXQgaXQgaXMgYWNjZXNzaWJsZSB0bwordGhlc2UgZGV2ZWxvcGVyczsgYW55Ym9keSB3aXRoIHRoZSByZXF1aXNpdGUgc2tpbGxzIGNhbiBpbXByb3ZlIExpbnV4IGFuZAoraW5mbHVlbmNlIHRoZSBkaXJlY3Rpb24gb2YgaXRzIGRldmVsb3BtZW50LiAgUHJvcHJpZXRhcnkgcHJvZHVjdHMgY2Fubm90CitvZmZlciB0aGlzIGtpbmQgb2Ygb3Blbm5lc3MsIHdoaWNoIGlzIGEgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIGZyZWUgc29mdHdhcmUKK3Byb2Nlc3MuICBCdXQsIGlmIGFueXRoaW5nLCB0aGUga2VybmVsIGlzIGV2ZW4gbW9yZSBvcGVuIHRoYW4gbW9zdCBvdGhlcgorZnJlZSBzb2Z0d2FyZSBwcm9qZWN0cy4gIEEgdHlwaWNhbCB0aHJlZS1tb250aCBrZXJuZWwgZGV2ZWxvcG1lbnQgY3ljbGUgY2FuCitpbnZvbHZlIG92ZXIgMTAwMCBkZXZlbG9wZXJzIHdvcmtpbmcgZm9yIG1vcmUgdGhhbiAxMDAgZGlmZmVyZW50IGNvbXBhbmllcworKG9yIGZvciBubyBjb21wYW55IGF0IGFsbCkuCisKK1dvcmtpbmcgd2l0aCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBpcyBub3QgZXNwZWNpYWxseSBoYXJkLiAgQnV0LAordGhhdCBub3R3aXRoc3RhbmRpbmcsIG1hbnkgcG90ZW50aWFsIGNvbnRyaWJ1dG9ycyBoYXZlIGV4cGVyaWVuY2VkCitkaWZmaWN1bHRpZXMgd2hlbiB0cnlpbmcgdG8gZG8ga2VybmVsIHdvcmsuICBUaGUga2VybmVsIGNvbW11bml0eSBoYXMKK2V2b2x2ZWQgaXRzIG93biBkaXN0aW5jdCB3YXlzIG9mIG9wZXJhdGluZyB3aGljaCBhbGxvdyBpdCB0byBmdW5jdGlvbgorc21vb3RobHkgKGFuZCBwcm9kdWNlIGEgaGlnaC1xdWFsaXR5IHByb2R1Y3QpIGluIGFuIGVudmlyb25tZW50IHdoZXJlCit0aG91c2FuZHMgb2YgbGluZXMgb2YgY29kZSBhcmUgYmVpbmcgY2hhbmdlZCBldmVyeSBkYXkuICBTbyBpdCBpcyBub3QKK3N1cnByaXNpbmcgdGhhdCBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkaWZmZXJzIGdyZWF0bHkgZnJvbQorcHJvcHJpZXRhcnkgZGV2ZWxvcG1lbnQgbWV0aG9kcy4KKworVGhlIGtlcm5lbCdzIGRldmVsb3BtZW50IHByb2Nlc3MgbWF5IGNvbWUgYWNyb3NzIGFzIHN0cmFuZ2UgYW5kCitpbnRpbWlkYXRpbmcgdG8gbmV3IGRldmVsb3BlcnMsIGJ1dCB0aGVyZSBhcmUgZ29vZCByZWFzb25zIGFuZCBzb2xpZAorZXhwZXJpZW5jZSBiZWhpbmQgaXQuICBBIGRldmVsb3BlciB3aG8gZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUga2VybmVsCitjb21tdW5pdHkncyB3YXlzIChvciwgd29yc2UsIHdobyB0cmllcyB0byBmbG91dCBvciBjaXJjdW12ZW50IHRoZW0pIHdpbGwKK2hhdmUgYSBmcnVzdHJhdGluZyBleHBlcmllbmNlIGluIHN0b3JlLiAgVGhlIGRldmVsb3BtZW50IGNvbW11bml0eSwgd2hpbGUKK2JlaW5nIGhlbHBmdWwgdG8gdGhvc2Ugd2hvIGFyZSB0cnlpbmcgdG8gbGVhcm4sIGhhcyBsaXR0bGUgdGltZSBmb3IgdGhvc2UKK3dobyB3aWxsIG5vdCBsaXN0ZW4gb3Igd2hvIGRvIG5vdCBjYXJlIGFib3V0IHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLgorCitJdCBpcyBob3BlZCB0aGF0IHRob3NlIHdobyByZWFkIHRoaXMgZG9jdW1lbnQgd2lsbCBiZSBhYmxlIHRvIGF2b2lkIHRoYXQKK2ZydXN0cmF0aW5nIGV4cGVyaWVuY2UuICBUaGVyZSBpcyBhIGxvdCBvZiBtYXRlcmlhbCBoZXJlLCBidXQgdGhlIGVmZm9ydAoraW52b2x2ZWQgaW4gcmVhZGluZyBpdCB3aWxsIGJlIHJlcGFpZCBpbiBzaG9ydCBvcmRlci4gIFRoZSBkZXZlbG9wbWVudAorY29tbXVuaXR5IGlzIGFsd2F5cyBpbiBuZWVkIG9mIGRldmVsb3BlcnMgd2hvIHdpbGwgaGVscCB0byBtYWtlIHRoZSBrZXJuZWwKK2JldHRlcjsgdGhlIGZvbGxvd2luZyB0ZXh0IHNob3VsZCBoZWxwIHlvdSAtIG9yIHRob3NlIHdobyB3b3JrIGZvciB5b3UgLQoram9pbiBvdXIgY29tbXVuaXR5LgorCitDcmVkaXRzCistLS0tLS0tCisKK1RoaXMgZG9jdW1lbnQgd2FzIHdyaXR0ZW4gYnkgSm9uYXRoYW4gQ29yYmV0LCBjb3JiZXRAbHduLm5ldC4gIEl0IGhhcyBiZWVuCitpbXByb3ZlZCBieSBjb21tZW50cyBmcm9tIEpvaGFubmVzIEJlcmcsIEphbWVzIEJlcnJ5LCBBbGV4IENoaWFuZywgUm9sYW5kCitEcmVpZXIsIFJhbmR5IER1bmxhcCwgSmFrZSBFZGdlLCBKaXJpIEtvc2luYSwgTWF0dCBNYWNrYWxsLCBBcnRodXIgTWFyc2gsCitBbWFuZGEgTWNQaGVyc29uLCBBbmRyZXcgTW9ydG9uLCBBbmRyZXcgUHJpY2UsIFRzdWdpa2F6dSBTaGliYXRhLCBhbmQKK0pvY2hlbiBWb8OfLgorCitUaGlzIHdvcmsgd2FzIHN1cHBvcnRlZCBieSB0aGUgTGludXggRm91bmRhdGlvbjsgdGhhbmtzIGVzcGVjaWFsbHkgdG8KK0FtYW5kYSBNY1BoZXJzb24sIHdobyBzYXcgdGhlIHZhbHVlIG9mIHRoaXMgZWZmb3J0IGFuZCBtYWRlIGl0IGFsbCBoYXBwZW4uCisKK1RoZSBpbXBvcnRhbmNlIG9mIGdldHRpbmcgY29kZSBpbnRvIHRoZSBtYWlubGluZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWUgY29tcGFuaWVzIGFuZCBkZXZlbG9wZXJzIG9jY2FzaW9uYWxseSB3b25kZXIgd2h5IHRoZXkgc2hvdWxkIGJvdGhlcgorbGVhcm5pbmcgaG93IHRvIHdvcmsgd2l0aCB0aGUga2VybmVsIGNvbW11bml0eSBhbmQgZ2V0IHRoZWlyIGNvZGUgaW50byB0aGUKK21haW5saW5lIGtlcm5lbCAodGhlICJtYWlubGluZSIgYmVpbmcgdGhlIGtlcm5lbCBtYWludGFpbmVkIGJ5IExpbnVzCitUb3J2YWxkcyBhbmQgdXNlZCBhcyBhIGJhc2UgYnkgTGludXggZGlzdHJpYnV0b3JzKS4gIEluIHRoZSBzaG9ydCB0ZXJtLAorY29udHJpYnV0aW5nIGNvZGUgY2FuIGxvb2sgbGlrZSBhbiBhdm9pZGFibGUgZXhwZW5zZTsgaXQgc2VlbXMgZWFzaWVyIHRvCitqdXN0IGtlZXAgdGhlIGNvZGUgc2VwYXJhdGUgYW5kIHN1cHBvcnQgdXNlcnMgZGlyZWN0bHkuICBUaGUgdHJ1dGggb2YgdGhlCittYXR0ZXIgaXMgdGhhdCBrZWVwaW5nIGNvZGUgc2VwYXJhdGUgKCJvdXQgb2YgdHJlZSIpIGlzIGEgZmFsc2UgZWNvbm9teS4KKworQXMgYSB3YXkgb2YgaWxsdXN0cmF0aW5nIHRoZSBjb3N0cyBvZiBvdXQtb2YtdHJlZSBjb2RlLCBoZXJlIGFyZSBhIGZldworcmVsZXZhbnQgYXNwZWN0cyBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3M7IG1vc3Qgb2YgdGhlc2Ugd2lsbCBiZQorZGlzY3Vzc2VkIGluIGdyZWF0ZXIgZGV0YWlsIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQuICBDb25zaWRlcjoKKworLSBDb2RlIHdoaWNoIGhhcyBiZWVuIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwgaXMgYXZhaWxhYmxlIHRvIGFsbAorICBMaW51eCB1c2Vycy4gIEl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBwcmVzZW50IG9uIGFsbCBkaXN0cmlidXRpb25zIHdoaWNoCisgIGVuYWJsZSBpdC4gIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGRyaXZlciBkaXNrcywgZG93bmxvYWRzLCBvciB0aGUgaGFzc2xlcworICBvZiBzdXBwb3J0aW5nIG11bHRpcGxlIHZlcnNpb25zIG9mIG11bHRpcGxlIGRpc3RyaWJ1dGlvbnM7IGl0IGFsbCBqdXN0CisgIHdvcmtzLCBmb3IgdGhlIGRldmVsb3BlciBhbmQgZm9yIHRoZSB1c2VyLiAgSW5jb3Jwb3JhdGlvbiBpbnRvIHRoZQorICBtYWlubGluZSBzb2x2ZXMgYSBsYXJnZSBudW1iZXIgb2YgZGlzdHJpYnV0aW9uIGFuZCBzdXBwb3J0IHByb2JsZW1zLgorCistIFdoaWxlIGtlcm5lbCBkZXZlbG9wZXJzIHN0cml2ZSB0byBtYWludGFpbiBhIHN0YWJsZSBpbnRlcmZhY2UgdG8gdXNlcgorICBzcGFjZSwgdGhlIGludGVybmFsIGtlcm5lbCBBUEkgaXMgaW4gY29uc3RhbnQgZmx1eC4gIFRoZSBsYWNrIG9mIGEgc3RhYmxlCisgIGludGVybmFsIGludGVyZmFjZSBpcyBhIGRlbGliZXJhdGUgZGVzaWduIGRlY2lzaW9uOyBpdCBhbGxvd3MgZnVuZGFtZW50YWwKKyAgaW1wcm92ZW1lbnRzIHRvIGJlIG1hZGUgYXQgYW55IHRpbWUgYW5kIHJlc3VsdHMgaW4gaGlnaGVyLXF1YWxpdHkgY29kZS4KKyAgQnV0IG9uZSByZXN1bHQgb2YgdGhhdCBwb2xpY3kgaXMgdGhhdCBhbnkgb3V0LW9mLXRyZWUgY29kZSByZXF1aXJlcworICBjb25zdGFudCB1cGtlZXAgaWYgaXQgaXMgdG8gd29yayB3aXRoIG5ldyBrZXJuZWxzLiAgTWFpbnRhaW5pbmcKKyAgb3V0LW9mLXRyZWUgY29kZSByZXF1aXJlcyBzaWduaWZpY2FudCBhbW91bnRzIG9mIHdvcmsganVzdCB0byBrZWVwIHRoYXQKKyAgY29kZSB3b3JraW5nLgorCisgIENvZGUgd2hpY2ggaXMgaW4gdGhlIG1haW5saW5lLCBpbnN0ZWFkLCBkb2VzIG5vdCByZXF1aXJlIHRoaXMgd29yayBhcyB0aGUKKyAgcmVzdWx0IG9mIGEgc2ltcGxlIHJ1bGUgcmVxdWlyaW5nIGFueSBkZXZlbG9wZXIgd2hvIG1ha2VzIGFuIEFQSSBjaGFuZ2UKKyAgdG8gYWxzbyBmaXggYW55IGNvZGUgdGhhdCBicmVha3MgYXMgdGhlIHJlc3VsdCBvZiB0aGF0IGNoYW5nZS4gIFNvIGNvZGUKKyAgd2hpY2ggaGFzIGJlZW4gbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGhhcyBzaWduaWZpY2FudGx5IGxvd2VyCisgIG1haW50ZW5hbmNlIGNvc3RzLgorCistIEJleW9uZCB0aGF0LCBjb2RlIHdoaWNoIGlzIGluIHRoZSBrZXJuZWwgd2lsbCBvZnRlbiBiZSBpbXByb3ZlZCBieSBvdGhlcgorICBkZXZlbG9wZXJzLiAgU3VycHJpc2luZyByZXN1bHRzIGNhbiBjb21lIGZyb20gZW1wb3dlcmluZyB5b3VyIHVzZXIKKyAgY29tbXVuaXR5IGFuZCBjdXN0b21lcnMgdG8gaW1wcm92ZSB5b3VyIHByb2R1Y3QuCisKKy0gS2VybmVsIGNvZGUgaXMgc3ViamVjdGVkIHRvIHJldmlldywgYm90aCBiZWZvcmUgYW5kIGFmdGVyIG1lcmdpbmcgaW50bworICB0aGUgbWFpbmxpbmUuICBObyBtYXR0ZXIgaG93IHN0cm9uZyB0aGUgb3JpZ2luYWwgZGV2ZWxvcGVyJ3Mgc2tpbGxzIGFyZSwKKyAgdGhpcyByZXZpZXcgcHJvY2VzcyBpbnZhcmlhYmx5IGZpbmRzIHdheXMgaW4gd2hpY2ggdGhlIGNvZGUgY2FuIGJlCisgIGltcHJvdmVkLiAgT2Z0ZW4gcmV2aWV3IGZpbmRzIHNldmVyZSBidWdzIGFuZCBzZWN1cml0eSBwcm9ibGVtcy4gIFRoaXMgaXMKKyAgZXNwZWNpYWxseSB0cnVlIGZvciBjb2RlIHdoaWNoIGhhcyBiZWVuIGRldmVsb3BlZCBpbiBhIGNsb3NlZAorICBlbnZpcm9ubWVudDsgc3VjaCBjb2RlIGJlbmVmaXRzIHN0cm9uZ2x5IGZyb20gcmV2aWV3IGJ5IG91dHNpZGUKKyAgZGV2ZWxvcGVycy4gIE91dC1vZi10cmVlIGNvZGUgaXMgbG93ZXItcXVhbGl0eSBjb2RlLgorCistIFBhcnRpY2lwYXRpb24gaW4gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MgaXMgeW91ciB3YXkgdG8gaW5mbHVlbmNlIHRoZQorICBkaXJlY3Rpb24gb2Yga2VybmVsIGRldmVsb3BtZW50LiAgVXNlcnMgd2hvIGNvbXBsYWluIGZyb20gdGhlIHNpZGVsaW5lcworICBhcmUgaGVhcmQsIGJ1dCBhY3RpdmUgZGV2ZWxvcGVycyBoYXZlIGEgc3Ryb25nZXIgdm9pY2UgLSBhbmQgdGhlIGFiaWxpdHkKKyAgdG8gaW1wbGVtZW50IGNoYW5nZXMgd2hpY2ggbWFrZSB0aGUga2VybmVsIHdvcmsgYmV0dGVyIGZvciB0aGVpciBuZWVkcy4KKworLSBXaGVuIGNvZGUgaXMgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5LCB0aGUgcG9zc2liaWxpdHkgdGhhdCBhIHRoaXJkIHBhcnR5CisgIHdpbGwgY29udHJpYnV0ZSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNpbWlsYXIgZmVhdHVyZSBhbHdheXMKKyAgZXhpc3RzLiAgU2hvdWxkIHRoYXQgaGFwcGVuLCBnZXR0aW5nIHlvdXIgY29kZSBtZXJnZWQgd2lsbCBiZWNvbWUgbXVjaAorICBoYXJkZXIgLSB0byB0aGUgcG9pbnQgb2YgaW1wb3NzaWJpbGl0eS4gIFRoZW4geW91IHdpbGwgYmUgZmFjZWQgd2l0aCB0aGUKKyAgdW5wbGVhc2FudCBhbHRlcm5hdGl2ZXMgb2YgZWl0aGVyICgxKSBtYWludGFpbmluZyBhIG5vbnN0YW5kYXJkIGZlYXR1cmUKKyAgb3V0IG9mIHRyZWUgaW5kZWZpbml0ZWx5LCBvciAoMikgYWJhbmRvbmluZyB5b3VyIGNvZGUgYW5kIG1pZ3JhdGluZyB5b3VyCisgIHVzZXJzIG92ZXIgdG8gdGhlIGluLXRyZWUgdmVyc2lvbi4KKworLSBDb250cmlidXRpb24gb2YgY29kZSBpcyB0aGUgZnVuZGFtZW50YWwgYWN0aW9uIHdoaWNoIG1ha2VzIHRoZSB3aG9sZQorICBwcm9jZXNzIHdvcmsuICBCeSBjb250cmlidXRpbmcgeW91ciBjb2RlIHlvdSBjYW4gYWRkIG5ldyBmdW5jdGlvbmFsaXR5IHRvCisgIHRoZSBrZXJuZWwgYW5kIHByb3ZpZGUgY2FwYWJpbGl0aWVzIGFuZCBleGFtcGxlcyB3aGljaCBhcmUgb2YgdXNlIHRvCisgIG90aGVyIGtlcm5lbCBkZXZlbG9wZXJzLiAgSWYgeW91IGhhdmUgZGV2ZWxvcGVkIGNvZGUgZm9yIExpbnV4IChvciBhcmUKKyAgdGhpbmtpbmcgYWJvdXQgZG9pbmcgc28pLCB5b3UgY2xlYXJseSBoYXZlIGFuIGludGVyZXN0IGluIHRoZSBjb250aW51ZWQKKyAgc3VjY2VzcyBvZiB0aGlzIHBsYXRmb3JtOyBjb250cmlidXRpbmcgY29kZSBpcyBvbmUgb2YgdGhlIGJlc3Qgd2F5cyB0bworICBoZWxwIGVuc3VyZSB0aGF0IHN1Y2Nlc3MuCisKK0FsbCBvZiB0aGUgcmVhc29uaW5nIGFib3ZlIGFwcGxpZXMgdG8gYW55IG91dC1vZi10cmVlIGtlcm5lbCBjb2RlLAoraW5jbHVkaW5nIGNvZGUgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgaW4gcHJvcHJpZXRhcnksIGJpbmFyeS1vbmx5IGZvcm0uCitUaGVyZSBhcmUsIGhvd2V2ZXIsIGFkZGl0aW9uYWwgZmFjdG9ycyB3aGljaCBzaG91bGQgYmUgdGFrZW4gaW50byBhY2NvdW50CitiZWZvcmUgY29uc2lkZXJpbmcgYW55IHNvcnQgb2YgYmluYXJ5LW9ubHkga2VybmVsIGNvZGUgZGlzdHJpYnV0aW9uLiAgVGhlc2UKK2luY2x1ZGU6CisKKy0gVGhlIGxlZ2FsIGlzc3VlcyBhcm91bmQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBwcm9wcmlldGFyeSBrZXJuZWwgbW9kdWxlcworICBhcmUgY2xvdWR5IGF0IGJlc3Q7IHF1aXRlIGEgZmV3IGtlcm5lbCBjb3B5cmlnaHQgaG9sZGVycyBiZWxpZXZlIHRoYXQKKyAgbW9zdCBiaW5hcnktb25seSBtb2R1bGVzIGFyZSBkZXJpdmVkIHByb2R1Y3RzIG9mIHRoZSBrZXJuZWwgYW5kIHRoYXQsIGFzCisgIGEgcmVzdWx0LCB0aGVpciBkaXN0cmlidXRpb24gaXMgYSB2aW9sYXRpb24gb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICBsaWNlbnNlIChhYm91dCB3aGljaCBtb3JlIHdpbGwgYmUgc2FpZCBiZWxvdykuICBZb3VyIGF1dGhvciBpcyBub3QgYQorICBsYXd5ZXIsIGFuZCBub3RoaW5nIGluIHRoaXMgZG9jdW1lbnQgY2FuIHBvc3NpYmx5IGJlIGNvbnNpZGVyZWQgdG8gYmUKKyAgbGVnYWwgYWR2aWNlLiAgVGhlIHRydWUgbGVnYWwgc3RhdHVzIG9mIGNsb3NlZC1zb3VyY2UgbW9kdWxlcyBjYW4gb25seSBiZQorICBkZXRlcm1pbmVkIGJ5IHRoZSBjb3VydHMuICBCdXQgdGhlIHVuY2VydGFpbnR5IHdoaWNoIGhhdW50cyB0aG9zZSBtb2R1bGVzCisgIGlzIHRoZXJlIHJlZ2FyZGxlc3MuCisKKy0gQmluYXJ5IG1vZHVsZXMgZ3JlYXRseSBpbmNyZWFzZSB0aGUgZGlmZmljdWx0eSBvZiBkZWJ1Z2dpbmcga2VybmVsCisgIHByb2JsZW1zLCB0byB0aGUgcG9pbnQgdGhhdCBtb3N0IGtlcm5lbCBkZXZlbG9wZXJzIHdpbGwgbm90IGV2ZW4gdHJ5LiAgU28KKyAgdGhlIGRpc3RyaWJ1dGlvbiBvZiBiaW5hcnktb25seSBtb2R1bGVzIHdpbGwgbWFrZSBpdCBoYXJkZXIgZm9yIHlvdXIKKyAgdXNlcnMgdG8gZ2V0IHN1cHBvcnQgZnJvbSB0aGUgY29tbXVuaXR5LgorCistIFN1cHBvcnQgaXMgYWxzbyBoYXJkZXIgZm9yIGRpc3RyaWJ1dG9ycyBvZiBiaW5hcnktb25seSBtb2R1bGVzLCB3aG8gbXVzdAorICBwcm92aWRlIGEgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGZvciBldmVyeSBkaXN0cmlidXRpb24gYW5kIGV2ZXJ5IGtlcm5lbAorICB2ZXJzaW9uIHRoZXkgd2lzaCB0byBzdXBwb3J0LiAgRG96ZW5zIG9mIGJ1aWxkcyBvZiBhIHNpbmdsZSBtb2R1bGUgY2FuCisgIGJlIHJlcXVpcmVkIHRvIHByb3ZpZGUgcmVhc29uYWJseSBjb21wcmVoZW5zaXZlIGNvdmVyYWdlLCBhbmQgeW91ciB1c2VycworICB3aWxsIGhhdmUgdG8gdXBncmFkZSB5b3VyIG1vZHVsZSBzZXBhcmF0ZWx5IGV2ZXJ5IHRpbWUgdGhleSB1cGdyYWRlIHRoZWlyCisgIGtlcm5lbC4KKworLSBFdmVyeXRoaW5nIHRoYXQgd2FzIHNhaWQgYWJvdmUgYWJvdXQgY29kZSByZXZpZXcgYXBwbGllcyBkb3VibHkgdG8KKyAgY2xvc2VkLXNvdXJjZSBjb2RlLiAgU2luY2UgdGhpcyBjb2RlIGlzIG5vdCBhdmFpbGFibGUgYXQgYWxsLCBpdCBjYW5ub3QKKyAgaGF2ZSBiZWVuIHJldmlld2VkIGJ5IHRoZSBjb21tdW5pdHkgYW5kIHdpbGwsIGJleW9uZCBkb3VidCwgaGF2ZSBzZXJpb3VzCisgIHByb2JsZW1zLgorCitNYWtlcnMgb2YgZW1iZWRkZWQgc3lzdGVtcywgaW4gcGFydGljdWxhciwgbWF5IGJlIHRlbXB0ZWQgdG8gZGlzcmVnYXJkIG11Y2gKK29mIHdoYXQgaGFzIGJlZW4gc2FpZCBpbiB0aGlzIHNlY3Rpb24gaW4gdGhlIGJlbGllZiB0aGF0IHRoZXkgYXJlIHNoaXBwaW5nCithIHNlbGYtY29udGFpbmVkIHByb2R1Y3Qgd2hpY2ggdXNlcyBhIGZyb3plbiBrZXJuZWwgdmVyc2lvbiBhbmQgcmVxdWlyZXMgbm8KK21vcmUgZGV2ZWxvcG1lbnQgYWZ0ZXIgaXRzIHJlbGVhc2UuICBUaGlzIGFyZ3VtZW50IG1pc3NlcyB0aGUgdmFsdWUgb2YKK3dpZGVzcHJlYWQgY29kZSByZXZpZXcgYW5kIHRoZSB2YWx1ZSBvZiBhbGxvd2luZyB5b3VyIHVzZXJzIHRvIGFkZAorY2FwYWJpbGl0aWVzIHRvIHlvdXIgcHJvZHVjdC4gIEJ1dCB0aGVzZSBwcm9kdWN0cywgdG9vLCBoYXZlIGEgbGltaXRlZAorY29tbWVyY2lhbCBsaWZlLCBhZnRlciB3aGljaCBhIG5ldyB2ZXJzaW9uIG11c3QgYmUgcmVsZWFzZWQuICBBdCB0aGF0Citwb2ludCwgdmVuZG9ycyB3aG9zZSBjb2RlIGlzIGluIHRoZSBtYWlubGluZSBhbmQgd2VsbCBtYWludGFpbmVkIHdpbGwgYmUKK211Y2ggYmV0dGVyIHBvc2l0aW9uZWQgdG8gZ2V0IHRoZSBuZXcgcHJvZHVjdCByZWFkeSBmb3IgbWFya2V0IHF1aWNrbHkuCisKK0xpY2Vuc2luZworLS0tLS0tLS0tCisKK0NvZGUgaXMgY29udHJpYnV0ZWQgdG8gdGhlIExpbnV4IGtlcm5lbCB1bmRlciBhIG51bWJlciBvZiBsaWNlbnNlcywgYnV0IGFsbAorY29kZSBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisoR1BMdjIpLCB3aGljaCBpcyB0aGUgbGljZW5zZSBjb3ZlcmluZyB0aGUga2VybmVsIGRpc3RyaWJ1dGlvbiBhcyBhIHdob2xlLgorSW4gcHJhY3RpY2UsIHRoYXQgbWVhbnMgdGhhdCBhbGwgY29kZSBjb250cmlidXRpb25zIGFyZSBjb3ZlcmVkIGVpdGhlciBieQorR1BMdjIgKHdpdGgsIG9wdGlvbmFsbHksIGxhbmd1YWdlIGFsbG93aW5nIGRpc3RyaWJ1dGlvbiB1bmRlciBsYXRlcgordmVyc2lvbnMgb2YgdGhlIEdQTCkgb3IgdGhlIHRocmVlLWNsYXVzZSBCU0QgbGljZW5zZS4gIEFueSBjb250cmlidXRpb25zCit3aGljaCBhcmUgbm90IGNvdmVyZWQgYnkgYSBjb21wYXRpYmxlIGxpY2Vuc2Ugd2lsbCBub3QgYmUgYWNjZXB0ZWQgaW50byB0aGUKK2tlcm5lbC4KKworQ29weXJpZ2h0IGFzc2lnbm1lbnRzIGFyZSBub3QgcmVxdWlyZWQgKG9yIHJlcXVlc3RlZCkgZm9yIGNvZGUgY29udHJpYnV0ZWQKK3RvIHRoZSBrZXJuZWwuICBBbGwgY29kZSBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUga2VybmVsIHJldGFpbnMgaXRzCitvcmlnaW5hbCBvd25lcnNoaXA7IGFzIGEgcmVzdWx0LCB0aGUga2VybmVsIG5vdyBoYXMgdGhvdXNhbmRzIG9mIG93bmVycy4KKworT25lIGltcGxpY2F0aW9uIG9mIHRoaXMgb3duZXJzaGlwIHN0cnVjdHVyZSBpcyB0aGF0IGFueSBhdHRlbXB0IHRvIGNoYW5nZQordGhlIGxpY2Vuc2luZyBvZiB0aGUga2VybmVsIGlzIGRvb21lZCB0byBhbG1vc3QgY2VydGFpbiBmYWlsdXJlLiAgVGhlcmUgYXJlCitmZXcgcHJhY3RpY2FsIHNjZW5hcmlvcyB3aGVyZSB0aGUgYWdyZWVtZW50IG9mIGFsbCBjb3B5cmlnaHQgaG9sZGVycyBjb3VsZAorYmUgb2J0YWluZWQgKG9yIHRoZWlyIGNvZGUgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwpLiAgU28sIGluIHBhcnRpY3VsYXIsCit0aGVyZSBpcyBubyBwcm9zcGVjdCBvZiBhIG1pZ3JhdGlvbiB0byB2ZXJzaW9uIDMgb2YgdGhlIEdQTCBpbiB0aGUKK2ZvcmVzZWVhYmxlIGZ1dHVyZS4KKworSXQgaXMgaW1wZXJhdGl2ZSB0aGF0IGFsbCBjb2RlIGNvbnRyaWJ1dGVkIHRvIHRoZSBrZXJuZWwgYmUgbGVnaXRpbWF0ZWx5CitmcmVlIHNvZnR3YXJlLiAgRm9yIHRoYXQgcmVhc29uLCBjb2RlIGZyb20gYW5vbnltb3VzIChvciBwc2V1ZG9ueW1vdXMpCitjb250cmlidXRvcnMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuICBBbGwgY29udHJpYnV0b3JzIGFyZSByZXF1aXJlZCB0byAic2lnbgorb2ZmIiBvbiB0aGVpciBjb2RlLCBzdGF0aW5nIHRoYXQgdGhlIGNvZGUgY2FuIGJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlCitrZXJuZWwgdW5kZXIgdGhlIEdQTC4gIENvZGUgd2hpY2ggaGFzIG5vdCBiZWVuIGxpY2Vuc2VkIGFzIGZyZWUgc29mdHdhcmUgYnkKK2l0cyBvd25lciwgb3Igd2hpY2ggcmlza3MgY3JlYXRpbmcgY29weXJpZ2h0LXJlbGF0ZWQgcHJvYmxlbXMgZm9yIHRoZQora2VybmVsIChzdWNoIGFzIGNvZGUgd2hpY2ggZGVyaXZlcyBmcm9tIHJldmVyc2UtZW5naW5lZXJpbmcgZWZmb3J0cyBsYWNraW5nCitwcm9wZXIgc2FmZWd1YXJkcykgY2Fubm90IGJlIGNvbnRyaWJ1dGVkLgorCitRdWVzdGlvbnMgYWJvdXQgY29weXJpZ2h0LXJlbGF0ZWQgaXNzdWVzIGFyZSBjb21tb24gb24gTGludXggZGV2ZWxvcG1lbnQKK21haWxpbmcgbGlzdHMuICBTdWNoIHF1ZXN0aW9ucyB3aWxsIG5vcm1hbGx5IHJlY2VpdmUgbm8gc2hvcnRhZ2Ugb2YKK2Fuc3dlcnMsIGJ1dCBvbmUgc2hvdWxkIGJlYXIgaW4gbWluZCB0aGF0IHRoZSBwZW9wbGUgYW5zd2VyaW5nIHRob3NlCitxdWVzdGlvbnMgYXJlIG5vdCBsYXd5ZXJzIGFuZCBjYW5ub3QgcHJvdmlkZSBsZWdhbCBhZHZpY2UuICBJZiB5b3UgaGF2ZQorbGVnYWwgcXVlc3Rpb25zIHJlbGF0aW5nIHRvIExpbnV4IHNvdXJjZSBjb2RlLCB0aGVyZSBpcyBubyBzdWJzdGl0dXRlIGZvcgordGFsa2luZyB3aXRoIGEgbGF3eWVyIHdobyB1bmRlcnN0YW5kcyB0aGlzIGZpZWxkLiAgUmVseWluZyBvbiBhbnN3ZXJzCitvYnRhaW5lZCBvbiB0ZWNobmljYWwgbWFpbGluZyBsaXN0cyBpcyBhIHJpc2t5IGFmZmFpci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8yLlByb2Nlc3MgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMi5Qcm9jZXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjRlMTU2Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8yLlByb2Nlc3MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzggKzAsMCBAQAotMjogSE9XIFRIRSBERVZFTE9QTUVOVCBQUk9DRVNTIFdPUktTCi0KLUxpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBpbiB0aGUgZWFybHkgMTk5MCdzIHdhcyBhIHByZXR0eSBsb29zZSBhZmZhaXIsCi13aXRoIHJlbGF0aXZlbHkgc21hbGwgbnVtYmVycyBvZiB1c2VycyBhbmQgZGV2ZWxvcGVycyBpbnZvbHZlZC4gIFdpdGggYQotdXNlciBiYXNlIGluIHRoZSBtaWxsaW9ucyBhbmQgd2l0aCBzb21lIDIsMDAwIGRldmVsb3BlcnMgaW52b2x2ZWQgb3ZlciB0aGUKLWNvdXJzZSBvZiBvbmUgeWVhciwgdGhlIGtlcm5lbCBoYXMgc2luY2UgaGFkIHRvIGV2b2x2ZSBhIG51bWJlciBvZgotcHJvY2Vzc2VzIHRvIGtlZXAgZGV2ZWxvcG1lbnQgaGFwcGVuaW5nIHNtb290aGx5LiAgQSBzb2xpZCB1bmRlcnN0YW5kaW5nIG9mCi1ob3cgdGhlIHByb2Nlc3Mgd29ya3MgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gYmUgYW4gZWZmZWN0aXZlIHBhcnQgb2YgaXQuCi0KLQotMi4xOiBUSEUgQklHIFBJQ1RVUkUKLQotVGhlIGtlcm5lbCBkZXZlbG9wZXJzIHVzZSBhIGxvb3NlbHkgdGltZS1iYXNlZCByZWxlYXNlIHByb2Nlc3MsIHdpdGggYSBuZXcKLW1ham9yIGtlcm5lbCByZWxlYXNlIGhhcHBlbmluZyBldmVyeSB0d28gb3IgdGhyZWUgbW9udGhzLiAgVGhlIHJlY2VudAotcmVsZWFzZSBoaXN0b3J5IGxvb2tzIGxpa2UgdGhpczoKLQotCTIuNi4zOAlNYXJjaCAxNCwgMjAxMQotCTIuNi4zNwlKYW51YXJ5IDQsIDIwMTEKLQkyLjYuMzYJT2N0b2JlciAyMCwgMjAxMAotCTIuNi4zNQlBdWd1c3QgMSwgMjAxMAotCTIuNi4zNAlNYXkgMTUsIDIwMTAKLQkyLjYuMzMJRmVicnVhcnkgMjQsIDIwMTAKLQotRXZlcnkgMi42LnggcmVsZWFzZSBpcyBhIG1ham9yIGtlcm5lbCByZWxlYXNlIHdpdGggbmV3IGZlYXR1cmVzLCBpbnRlcm5hbAotQVBJIGNoYW5nZXMsIGFuZCBtb3JlLiAgQSB0eXBpY2FsIDIuNiByZWxlYXNlIGNhbiBjb250YWluIG5lYXJseSAxMCwwMDAKLWNoYW5nZXNldHMgd2l0aCBjaGFuZ2VzIHRvIHNldmVyYWwgaHVuZHJlZCB0aG91c2FuZCBsaW5lcyBvZiBjb2RlLiAgMi42IGlzCi10aHVzIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgTGludXgga2VybmVsIGRldmVsb3BtZW50OyB0aGUga2VybmVsIHVzZXMgYQotcm9sbGluZyBkZXZlbG9wbWVudCBtb2RlbCB3aGljaCBpcyBjb250aW51YWxseSBpbnRlZ3JhdGluZyBtYWpvciBjaGFuZ2VzLgotCi1BIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkIGRpc2NpcGxpbmUgaXMgZm9sbG93ZWQgd2l0aCByZWdhcmQgdG8gdGhlCi1tZXJnaW5nIG9mIHBhdGNoZXMgZm9yIGVhY2ggcmVsZWFzZS4gIEF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBkZXZlbG9wbWVudAotY3ljbGUsIHRoZSAibWVyZ2Ugd2luZG93IiBpcyBzYWlkIHRvIGJlIG9wZW4uICBBdCB0aGF0IHRpbWUsIGNvZGUgd2hpY2ggaXMKLWRlZW1lZCB0byBiZSBzdWZmaWNpZW50bHkgc3RhYmxlIChhbmQgd2hpY2ggaXMgYWNjZXB0ZWQgYnkgdGhlIGRldmVsb3BtZW50Ci1jb21tdW5pdHkpIGlzIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuICBUaGUgYnVsayBvZiBjaGFuZ2VzIGZvciBhCi1uZXcgZGV2ZWxvcG1lbnQgY3ljbGUgKGFuZCBhbGwgb2YgdGhlIG1ham9yIGNoYW5nZXMpIHdpbGwgYmUgbWVyZ2VkIGR1cmluZwotdGhpcyB0aW1lLCBhdCBhIHJhdGUgYXBwcm9hY2hpbmcgMSwwMDAgY2hhbmdlcyAoInBhdGNoZXMsIiBvciAiY2hhbmdlc2V0cyIpCi1wZXIgZGF5LgotCi0oQXMgYW4gYXNpZGUsIGl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHRoZSBjaGFuZ2VzIGludGVncmF0ZWQgZHVyaW5nIHRoZQotbWVyZ2Ugd2luZG93IGRvIG5vdCBjb21lIG91dCBvZiB0aGluIGFpcjsgdGhleSBoYXZlIGJlZW4gY29sbGVjdGVkLCB0ZXN0ZWQsCi1hbmQgc3RhZ2VkIGFoZWFkIG9mIHRpbWUuICBIb3cgdGhhdCBwcm9jZXNzIHdvcmtzIHdpbGwgYmUgZGVzY3JpYmVkIGluCi1kZXRhaWwgbGF0ZXIgb24pLgotCi1UaGUgbWVyZ2Ugd2luZG93IGxhc3RzIGZvciBhcHByb3hpbWF0ZWx5IHR3byB3ZWVrcy4gIEF0IHRoZSBlbmQgb2YgdGhpcwotdGltZSwgTGludXMgVG9ydmFsZHMgd2lsbCBkZWNsYXJlIHRoYXQgdGhlIHdpbmRvdyBpcyBjbG9zZWQgYW5kIHJlbGVhc2UgdGhlCi1maXJzdCBvZiB0aGUgInJjIiBrZXJuZWxzLiAgRm9yIHRoZSBrZXJuZWwgd2hpY2ggaXMgZGVzdGluZWQgdG8gYmUgMi42LjQwLAotZm9yIGV4YW1wbGUsIHRoZSByZWxlYXNlIHdoaWNoIGhhcHBlbnMgYXQgdGhlIGVuZCBvZiB0aGUgbWVyZ2Ugd2luZG93IHdpbGwKLWJlIGNhbGxlZCAyLjYuNDAtcmMxLiAgVGhlIC1yYzEgcmVsZWFzZSBpcyB0aGUgc2lnbmFsIHRoYXQgdGhlIHRpbWUgdG8KLW1lcmdlIG5ldyBmZWF0dXJlcyBoYXMgcGFzc2VkLCBhbmQgdGhhdCB0aGUgdGltZSB0byBzdGFiaWxpemUgdGhlIG5leHQKLWtlcm5lbCBoYXMgYmVndW4uCi0KLU92ZXIgdGhlIG5leHQgc2l4IHRvIHRlbiB3ZWVrcywgb25seSBwYXRjaGVzIHdoaWNoIGZpeCBwcm9ibGVtcyBzaG91bGQgYmUKLXN1Ym1pdHRlZCB0byB0aGUgbWFpbmxpbmUuICBPbiBvY2Nhc2lvbiBhIG1vcmUgc2lnbmlmaWNhbnQgY2hhbmdlIHdpbGwgYmUKLWFsbG93ZWQsIGJ1dCBzdWNoIG9jY2FzaW9ucyBhcmUgcmFyZTsgZGV2ZWxvcGVycyB3aG8gdHJ5IHRvIG1lcmdlIG5ldwotZmVhdHVyZXMgb3V0c2lkZSBvZiB0aGUgbWVyZ2Ugd2luZG93IHRlbmQgdG8gZ2V0IGFuIHVuZnJpZW5kbHkgcmVjZXB0aW9uLgotQXMgYSBnZW5lcmFsIHJ1bGUsIGlmIHlvdSBtaXNzIHRoZSBtZXJnZSB3aW5kb3cgZm9yIGEgZ2l2ZW4gZmVhdHVyZSwgdGhlCi1iZXN0IHRoaW5nIHRvIGRvIGlzIHRvIHdhaXQgZm9yIHRoZSBuZXh0IGRldmVsb3BtZW50IGN5Y2xlLiAgKEFuIG9jY2FzaW9uYWwKLWV4Y2VwdGlvbiBpcyBtYWRlIGZvciBkcml2ZXJzIGZvciBwcmV2aW91c2x5LXVuc3VwcG9ydGVkIGhhcmR3YXJlOyBpZiB0aGV5Ci10b3VjaCBubyBpbi10cmVlIGNvZGUsIHRoZXkgY2Fubm90IGNhdXNlIHJlZ3Jlc3Npb25zIGFuZCBzaG91bGQgYmUgc2FmZSB0bwotYWRkIGF0IGFueSB0aW1lKS4KLQotQXMgZml4ZXMgbWFrZSB0aGVpciB3YXkgaW50byB0aGUgbWFpbmxpbmUsIHRoZSBwYXRjaCByYXRlIHdpbGwgc2xvdyBvdmVyCi10aW1lLiAgTGludXMgcmVsZWFzZXMgbmV3IC1yYyBrZXJuZWxzIGFib3V0IG9uY2UgYSB3ZWVrOyBhIG5vcm1hbCBzZXJpZXMKLXdpbGwgZ2V0IHVwIHRvIHNvbWV3aGVyZSBiZXR3ZWVuIC1yYzYgYW5kIC1yYzkgYmVmb3JlIHRoZSBrZXJuZWwgaXMKLWNvbnNpZGVyZWQgdG8gYmUgc3VmZmljaWVudGx5IHN0YWJsZSBhbmQgdGhlIGZpbmFsIDIuNi54IHJlbGVhc2UgaXMgbWFkZS4KLUF0IHRoYXQgcG9pbnQgdGhlIHdob2xlIHByb2Nlc3Mgc3RhcnRzIG92ZXIgYWdhaW4uCi0KLUFzIGFuIGV4YW1wbGUsIGhlcmUgaXMgaG93IHRoZSAyLjYuMzggZGV2ZWxvcG1lbnQgY3ljbGUgd2VudCAoYWxsIGRhdGVzIGluCi0yMDExKToKLQotCUphbnVhcnkgNAkyLjYuMzcgc3RhYmxlIHJlbGVhc2UKLQlKYW51YXJ5IDE4CTIuNi4zOC1yYzEsIG1lcmdlIHdpbmRvdyBjbG9zZXMKLQlKYW51YXJ5IDIxCTIuNi4zOC1yYzIKLQlGZWJydWFyeSAxCTIuNi4zOC1yYzMKLQlGZWJydWFyeSA3CTIuNi4zOC1yYzQKLQlGZWJydWFyeSAxNQkyLjYuMzgtcmM1Ci0JRmVicnVhcnkgMjEJMi42LjM4LXJjNgotCU1hcmNoIDEJCTIuNi4zOC1yYzcKLQlNYXJjaCA3CQkyLjYuMzgtcmM4Ci0JTWFyY2ggMTQJMi42LjM4IHN0YWJsZSByZWxlYXNlCi0KLUhvdyBkbyB0aGUgZGV2ZWxvcGVycyBkZWNpZGUgd2hlbiB0byBjbG9zZSB0aGUgZGV2ZWxvcG1lbnQgY3ljbGUgYW5kIGNyZWF0ZQotdGhlIHN0YWJsZSByZWxlYXNlPyAgVGhlIG1vc3Qgc2lnbmlmaWNhbnQgbWV0cmljIHVzZWQgaXMgdGhlIGxpc3Qgb2YKLXJlZ3Jlc3Npb25zIGZyb20gcHJldmlvdXMgcmVsZWFzZXMuICBObyBidWdzIGFyZSB3ZWxjb21lLCBidXQgdGhvc2Ugd2hpY2gKLWJyZWFrIHN5c3RlbXMgd2hpY2ggd29ya2VkIGluIHRoZSBwYXN0IGFyZSBjb25zaWRlcmVkIHRvIGJlIGVzcGVjaWFsbHkKLXNlcmlvdXMuICBGb3IgdGhpcyByZWFzb24sIHBhdGNoZXMgd2hpY2ggY2F1c2UgcmVncmVzc2lvbnMgYXJlIGxvb2tlZCB1cG9uCi11bmZhdm9yYWJseSBhbmQgYXJlIHF1aXRlIGxpa2VseSB0byBiZSByZXZlcnRlZCBkdXJpbmcgdGhlIHN0YWJpbGl6YXRpb24KLXBlcmlvZC4KLQotVGhlIGRldmVsb3BlcnMnIGdvYWwgaXMgdG8gZml4IGFsbCBrbm93biByZWdyZXNzaW9ucyBiZWZvcmUgdGhlIHN0YWJsZQotcmVsZWFzZSBpcyBtYWRlLiAgSW4gdGhlIHJlYWwgd29ybGQsIHRoaXMga2luZCBvZiBwZXJmZWN0aW9uIGlzIGhhcmQgdG8KLWFjaGlldmU7IHRoZXJlIGFyZSBqdXN0IHRvbyBtYW55IHZhcmlhYmxlcyBpbiBhIHByb2plY3Qgb2YgdGhpcyBzaXplLgotVGhlcmUgY29tZXMgYSBwb2ludCB3aGVyZSBkZWxheWluZyB0aGUgZmluYWwgcmVsZWFzZSBqdXN0IG1ha2VzIHRoZSBwcm9ibGVtCi13b3JzZTsgdGhlIHBpbGUgb2YgY2hhbmdlcyB3YWl0aW5nIGZvciB0aGUgbmV4dCBtZXJnZSB3aW5kb3cgd2lsbCBncm93Ci1sYXJnZXIsIGNyZWF0aW5nIGV2ZW4gbW9yZSByZWdyZXNzaW9ucyB0aGUgbmV4dCB0aW1lIGFyb3VuZC4gIFNvIG1vc3QgMi42LngKLWtlcm5lbHMgZ28gb3V0IHdpdGggYSBoYW5kZnVsIG9mIGtub3duIHJlZ3Jlc3Npb25zIHRob3VnaCwgaG9wZWZ1bGx5LCBub25lCi1vZiB0aGVtIGFyZSBzZXJpb3VzLgotCi1PbmNlIGEgc3RhYmxlIHJlbGVhc2UgaXMgbWFkZSwgaXRzIG9uZ29pbmcgbWFpbnRlbmFuY2UgaXMgcGFzc2VkIG9mZiB0byB0aGUKLSJzdGFibGUgdGVhbSwiIGN1cnJlbnRseSBjb25zaXN0aW5nIG9mIEdyZWcgS3JvYWgtSGFydG1hbi4gIFRoZSBzdGFibGUgdGVhbQotd2lsbCByZWxlYXNlIG9jY2FzaW9uYWwgdXBkYXRlcyB0byB0aGUgc3RhYmxlIHJlbGVhc2UgdXNpbmcgdGhlIDIuNi54LnkKLW51bWJlcmluZyBzY2hlbWUuICBUbyBiZSBjb25zaWRlcmVkIGZvciBhbiB1cGRhdGUgcmVsZWFzZSwgYSBwYXRjaCBtdXN0ICgxKQotZml4IGEgc2lnbmlmaWNhbnQgYnVnLCBhbmQgKDIpIGFscmVhZHkgYmUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lIGZvciB0aGUKLW5leHQgZGV2ZWxvcG1lbnQga2VybmVsLiAgS2VybmVscyB3aWxsIHR5cGljYWxseSByZWNlaXZlIHN0YWJsZSB1cGRhdGVzIGZvcgotYSBsaXR0bGUgbW9yZSB0aGFuIG9uZSBkZXZlbG9wbWVudCBjeWNsZSBwYXN0IHRoZWlyIGluaXRpYWwgcmVsZWFzZS4gIFNvLAotZm9yIGV4YW1wbGUsIHRoZSAyLjYuMzYga2VybmVsJ3MgaGlzdG9yeSBsb29rZWQgbGlrZToKLQotCU9jdG9iZXIgMTAJMi42LjM2IHN0YWJsZSByZWxlYXNlCi0JTm92ZW1iZXIgMjIJMi42LjM2LjEKLQlEZWNlbWJlciA5CTIuNi4zNi4yCi0JSmFudWFyeSA3CTIuNi4zNi4zCi0JRmVicnVhcnkgMTcJMi42LjM2LjQKLQotMi42LjM2LjQgd2FzIHRoZSBmaW5hbCBzdGFibGUgdXBkYXRlIGZvciB0aGUgMi42LjM2IHJlbGVhc2UuCi0KLVNvbWUga2VybmVscyBhcmUgZGVzaWduYXRlZCAibG9uZyB0ZXJtIiBrZXJuZWxzOyB0aGV5IHdpbGwgcmVjZWl2ZSBzdXBwb3J0Ci1mb3IgYSBsb25nZXIgcGVyaW9kLiAgQXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgY3VycmVudCBsb25nIHRlcm0ga2VybmVscwotYW5kIHRoZWlyIG1haW50YWluZXJzIGFyZToKLQotCTIuNi4yNwlXaWxseSBUYXJyZWF1CQkoRGVlcC1mcm96ZW4gc3RhYmxlIGtlcm5lbCkKLQkyLjYuMzIJR3JlZyBLcm9haC1IYXJ0bWFuCi0JMi42LjM1CUFuZGkgS2xlZW4JCShFbWJlZGRlZCBmbGFnIGtlcm5lbCkKLQotVGhlIHNlbGVjdGlvbiBvZiBhIGtlcm5lbCBmb3IgbG9uZy10ZXJtIHN1cHBvcnQgaXMgcHVyZWx5IGEgbWF0dGVyIG9mIGEKLW1haW50YWluZXIgaGF2aW5nIHRoZSBuZWVkIGFuZCB0aGUgdGltZSB0byBtYWludGFpbiB0aGF0IHJlbGVhc2UuICBUaGVyZQotYXJlIG5vIGtub3duIHBsYW5zIGZvciBsb25nLXRlcm0gc3VwcG9ydCBmb3IgYW55IHNwZWNpZmljIHVwY29taW5nCi1yZWxlYXNlLgotCi0KLTIuMjogVEhFIExJRkVDWUNMRSBPRiBBIFBBVENICi0KLVBhdGNoZXMgZG8gbm90IGdvIGRpcmVjdGx5IGZyb20gdGhlIGRldmVsb3BlcidzIGtleWJvYXJkIGludG8gdGhlIG1haW5saW5lCi1rZXJuZWwuICBUaGVyZSBpcywgaW5zdGVhZCwgYSBzb21ld2hhdCBpbnZvbHZlZCAoaWYgc29tZXdoYXQgaW5mb3JtYWwpCi1wcm9jZXNzIGRlc2lnbmVkIHRvIGVuc3VyZSB0aGF0IGVhY2ggcGF0Y2ggaXMgcmV2aWV3ZWQgZm9yIHF1YWxpdHkgYW5kIHRoYXQKLWVhY2ggcGF0Y2ggaW1wbGVtZW50cyBhIGNoYW5nZSB3aGljaCBpcyBkZXNpcmFibGUgdG8gaGF2ZSBpbiB0aGUgbWFpbmxpbmUuCi1UaGlzIHByb2Nlc3MgY2FuIGhhcHBlbiBxdWlja2x5IGZvciBtaW5vciBmaXhlcywgb3IsIGluIHRoZSBjYXNlIG9mIGxhcmdlCi1hbmQgY29udHJvdmVyc2lhbCBjaGFuZ2VzLCBnbyBvbiBmb3IgeWVhcnMuICBNdWNoIGRldmVsb3BlciBmcnVzdHJhdGlvbgotY29tZXMgZnJvbSBhIGxhY2sgb2YgdW5kZXJzdGFuZGluZyBvZiB0aGlzIHByb2Nlc3Mgb3IgZnJvbSBhdHRlbXB0cyB0bwotY2lyY3VtdmVudCBpdC4KLQotSW4gdGhlIGhvcGVzIG9mIHJlZHVjaW5nIHRoYXQgZnJ1c3RyYXRpb24sIHRoaXMgZG9jdW1lbnQgd2lsbCBkZXNjcmliZSBob3cKLWEgcGF0Y2ggZ2V0cyBpbnRvIHRoZSBrZXJuZWwuICBXaGF0IGZvbGxvd3MgYmVsb3cgaXMgYW4gaW50cm9kdWN0aW9uIHdoaWNoCi1kZXNjcmliZXMgdGhlIHByb2Nlc3MgaW4gYSBzb21ld2hhdCBpZGVhbGl6ZWQgd2F5LiAgQSBtdWNoIG1vcmUgZGV0YWlsZWQKLXRyZWF0bWVudCB3aWxsIGNvbWUgaW4gbGF0ZXIgc2VjdGlvbnMuCi0KLVRoZSBzdGFnZXMgdGhhdCBhIHBhdGNoIGdvZXMgdGhyb3VnaCBhcmUsIGdlbmVyYWxseToKLQotIC0gRGVzaWduLiAgVGhpcyBpcyB3aGVyZSB0aGUgcmVhbCByZXF1aXJlbWVudHMgZm9yIHRoZSBwYXRjaCAtIGFuZCB0aGUgd2F5Ci0gICB0aG9zZSByZXF1aXJlbWVudHMgd2lsbCBiZSBtZXQgLSBhcmUgbGFpZCBvdXQuICBEZXNpZ24gd29yayBpcyBvZnRlbgotICAgZG9uZSB3aXRob3V0IGludm9sdmluZyB0aGUgY29tbXVuaXR5LCBidXQgaXQgaXMgYmV0dGVyIHRvIGRvIHRoaXMgd29yawotICAgaW4gdGhlIG9wZW4gaWYgYXQgYWxsIHBvc3NpYmxlOyBpdCBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lIHJlZGVzaWduaW5nCi0gICB0aGluZ3MgbGF0ZXIuCi0KLSAtIEVhcmx5IHJldmlldy4gIFBhdGNoZXMgYXJlIHBvc3RlZCB0byB0aGUgcmVsZXZhbnQgbWFpbGluZyBsaXN0LCBhbmQKLSAgIGRldmVsb3BlcnMgb24gdGhhdCBsaXN0IHJlcGx5IHdpdGggYW55IGNvbW1lbnRzIHRoZXkgbWF5IGhhdmUuICBUaGlzCi0gICBwcm9jZXNzIHNob3VsZCB0dXJuIHVwIGFueSBtYWpvciBwcm9ibGVtcyB3aXRoIGEgcGF0Y2ggaWYgYWxsIGdvZXMKLSAgIHdlbGwuCi0KLSAtIFdpZGVyIHJldmlldy4gIFdoZW4gdGhlIHBhdGNoIGlzIGdldHRpbmcgY2xvc2UgdG8gcmVhZHkgZm9yIG1haW5saW5lCi0gICBpbmNsdXNpb24sIGl0IHNob3VsZCBiZSBhY2NlcHRlZCBieSBhIHJlbGV2YW50IHN1YnN5c3RlbSBtYWludGFpbmVyIC0KLSAgIHRob3VnaCB0aGlzIGFjY2VwdGFuY2UgaXMgbm90IGEgZ3VhcmFudGVlIHRoYXQgdGhlIHBhdGNoIHdpbGwgbWFrZSBpdAotICAgYWxsIHRoZSB3YXkgdG8gdGhlIG1haW5saW5lLiAgVGhlIHBhdGNoIHdpbGwgc2hvdyB1cCBpbiB0aGUgbWFpbnRhaW5lcidzCi0gICBzdWJzeXN0ZW0gdHJlZSBhbmQgaW50byB0aGUgLW5leHQgdHJlZXMgKGRlc2NyaWJlZCBiZWxvdykuICBXaGVuIHRoZQotICAgcHJvY2VzcyB3b3JrcywgdGhpcyBzdGVwIGxlYWRzIHRvIG1vcmUgZXh0ZW5zaXZlIHJldmlldyBvZiB0aGUgcGF0Y2ggYW5kCi0gICB0aGUgZGlzY292ZXJ5IG9mIGFueSBwcm9ibGVtcyByZXN1bHRpbmcgZnJvbSB0aGUgaW50ZWdyYXRpb24gb2YgdGhpcwotICAgcGF0Y2ggd2l0aCB3b3JrIGJlaW5nIGRvbmUgYnkgb3RoZXJzLgotCi0tICBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFpbnRhaW5lcnMgYWxzbyBoYXZlIGRheSBqb2JzLCBzbyBtZXJnaW5nCi0gICB5b3VyIHBhdGNoIG1heSBub3QgYmUgdGhlaXIgaGlnaGVzdCBwcmlvcml0eS4gIElmIHlvdXIgcGF0Y2ggaXMKLSAgIGdldHRpbmcgZmVlZGJhY2sgYWJvdXQgY2hhbmdlcyB0aGF0IGFyZSBuZWVkZWQsIHlvdSBzaG91bGQgZWl0aGVyCi0gICBtYWtlIHRob3NlIGNoYW5nZXMgb3IganVzdGlmeSB3aHkgdGhleSBzaG91bGQgbm90IGJlIG1hZGUuICBJZiB5b3VyCi0gICBwYXRjaCBoYXMgbm8gcmV2aWV3IGNvbXBsYWludHMgYnV0IGlzIG5vdCBiZWluZyBtZXJnZWQgYnkgaXRzCi0gICBhcHByb3ByaWF0ZSBzdWJzeXN0ZW0gb3IgZHJpdmVyIG1haW50YWluZXIsIHlvdSBzaG91bGQgYmUgcGVyc2lzdGVudAotICAgaW4gdXBkYXRpbmcgdGhlIHBhdGNoIHRvIHRoZSBjdXJyZW50IGtlcm5lbCBzbyB0aGF0IGl0IGFwcGxpZXMgY2xlYW5seQotICAgYW5kIGtlZXAgc2VuZGluZyBpdCBmb3IgcmV2aWV3IGFuZCBtZXJnaW5nLgotCi0gLSBNZXJnaW5nIGludG8gdGhlIG1haW5saW5lLiAgRXZlbnR1YWxseSwgYSBzdWNjZXNzZnVsIHBhdGNoIHdpbGwgYmUKLSAgIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZSByZXBvc2l0b3J5IG1hbmFnZWQgYnkgTGludXMgVG9ydmFsZHMuICBNb3JlCi0gICBjb21tZW50cyBhbmQvb3IgcHJvYmxlbXMgbWF5IHN1cmZhY2UgYXQgdGhpcyB0aW1lOyBpdCBpcyBpbXBvcnRhbnQgdGhhdAotICAgdGhlIGRldmVsb3BlciBiZSByZXNwb25zaXZlIHRvIHRoZXNlIGFuZCBmaXggYW55IGlzc3VlcyB3aGljaCBhcmlzZS4KLQotIC0gU3RhYmxlIHJlbGVhc2UuICBUaGUgbnVtYmVyIG9mIHVzZXJzIHBvdGVudGlhbGx5IGFmZmVjdGVkIGJ5IHRoZSBwYXRjaAotICAgaXMgbm93IGxhcmdlLCBzbywgb25jZSBhZ2FpbiwgbmV3IHByb2JsZW1zIG1heSBhcmlzZS4KLQotIC0gTG9uZy10ZXJtIG1haW50ZW5hbmNlLiAgV2hpbGUgaXQgaXMgY2VydGFpbmx5IHBvc3NpYmxlIGZvciBhIGRldmVsb3BlcgotICAgdG8gZm9yZ2V0IGFib3V0IGNvZGUgYWZ0ZXIgbWVyZ2luZyBpdCwgdGhhdCBzb3J0IG9mIGJlaGF2aW9yIHRlbmRzIHRvCi0gICBsZWF2ZSBhIHBvb3IgaW1wcmVzc2lvbiBpbiB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LiAgTWVyZ2luZyBjb2RlCi0gICBlbGltaW5hdGVzIHNvbWUgb2YgdGhlIG1haW50ZW5hbmNlIGJ1cmRlbiwgaW4gdGhhdCBvdGhlcnMgd2lsbCBmaXgKLSAgIHByb2JsZW1zIGNhdXNlZCBieSBBUEkgY2hhbmdlcy4gIEJ1dCB0aGUgb3JpZ2luYWwgZGV2ZWxvcGVyIHNob3VsZAotICAgY29udGludWUgdG8gdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgdGhlIGNvZGUgaWYgaXQgaXMgdG8gcmVtYWluIHVzZWZ1bAotICAgaW4gdGhlIGxvbmdlciB0ZXJtLgotCi1PbmUgb2YgdGhlIGxhcmdlc3QgbWlzdGFrZXMgbWFkZSBieSBrZXJuZWwgZGV2ZWxvcGVycyAob3IgdGhlaXIgZW1wbG95ZXJzKQotaXMgdG8gdHJ5IHRvIGN1dCB0aGUgcHJvY2VzcyBkb3duIHRvIGEgc2luZ2xlICJtZXJnaW5nIGludG8gdGhlIG1haW5saW5lIgotc3RlcC4gIFRoaXMgYXBwcm9hY2ggaW52YXJpYWJseSBsZWFkcyB0byBmcnVzdHJhdGlvbiBmb3IgZXZlcnlib2R5Ci1pbnZvbHZlZC4KLQotCi0yLjM6IEhPVyBQQVRDSEVTIEdFVCBJTlRPIFRIRSBLRVJORUwKLQotVGhlcmUgaXMgZXhhY3RseSBvbmUgcGVyc29uIHdobyBjYW4gbWVyZ2UgcGF0Y2hlcyBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwKLXJlcG9zaXRvcnk6IExpbnVzIFRvcnZhbGRzLiAgQnV0LCBvZiB0aGUgb3ZlciA5LDUwMCBwYXRjaGVzIHdoaWNoIHdlbnQKLWludG8gdGhlIDIuNi4zOCBrZXJuZWwsIG9ubHkgMTEyIChhcm91bmQgMS4zJSkgd2VyZSBkaXJlY3RseSBjaG9zZW4gYnkgTGludXMKLWhpbXNlbGYuICBUaGUga2VybmVsIHByb2plY3QgaGFzIGxvbmcgc2luY2UgZ3Jvd24gdG8gYSBzaXplIHdoZXJlIG5vIHNpbmdsZQotZGV2ZWxvcGVyIGNvdWxkIHBvc3NpYmx5IGluc3BlY3QgYW5kIHNlbGVjdCBldmVyeSBwYXRjaCB1bmFzc2lzdGVkLiAgVGhlCi13YXkgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIGhhdmUgYWRkcmVzc2VkIHRoaXMgZ3Jvd3RoIGlzIHRocm91Z2ggdGhlIHVzZSBvZgotYSBsaWV1dGVuYW50IHN5c3RlbSBidWlsdCBhcm91bmQgYSBjaGFpbiBvZiB0cnVzdC4KLQotVGhlIGtlcm5lbCBjb2RlIGJhc2UgaXMgbG9naWNhbGx5IGJyb2tlbiBkb3duIGludG8gYSBzZXQgb2Ygc3Vic3lzdGVtczoKLW5ldHdvcmtpbmcsIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBzdXBwb3J0LCBtZW1vcnkgbWFuYWdlbWVudCwgdmlkZW8KLWRldmljZXMsIGV0Yy4gIE1vc3Qgc3Vic3lzdGVtcyBoYXZlIGEgZGVzaWduYXRlZCBtYWludGFpbmVyLCBhIGRldmVsb3Blcgotd2hvIGhhcyBvdmVyYWxsIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgY29kZSB3aXRoaW4gdGhhdCBzdWJzeXN0ZW0uICBUaGVzZQotc3Vic3lzdGVtIG1haW50YWluZXJzIGFyZSB0aGUgZ2F0ZWtlZXBlcnMgKGluIGEgbG9vc2Ugd2F5KSBmb3IgdGhlIHBvcnRpb24KLW9mIHRoZSBrZXJuZWwgdGhleSBtYW5hZ2U7IHRoZXkgYXJlIHRoZSBvbmVzIHdobyB3aWxsICh1c3VhbGx5KSBhY2NlcHQgYQotcGF0Y2ggZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuCi0KLVN1YnN5c3RlbSBtYWludGFpbmVycyBlYWNoIG1hbmFnZSB0aGVpciBvd24gdmVyc2lvbiBvZiB0aGUga2VybmVsIHNvdXJjZQotdHJlZSwgdXN1YWxseSAoYnV0IGNlcnRhaW5seSBub3QgYWx3YXlzKSB1c2luZyB0aGUgZ2l0IHNvdXJjZSBtYW5hZ2VtZW50Ci10b29sLiAgVG9vbHMgbGlrZSBnaXQgKGFuZCByZWxhdGVkIHRvb2xzIGxpa2UgcXVpbHQgb3IgbWVyY3VyaWFsKSBhbGxvdwotbWFpbnRhaW5lcnMgdG8gdHJhY2sgYSBsaXN0IG9mIHBhdGNoZXMsIGluY2x1ZGluZyBhdXRob3JzaGlwIGluZm9ybWF0aW9uCi1hbmQgb3RoZXIgbWV0YWRhdGEuICBBdCBhbnkgZ2l2ZW4gdGltZSwgdGhlIG1haW50YWluZXIgY2FuIGlkZW50aWZ5IHdoaWNoCi1wYXRjaGVzIGluIGhpcyBvciBoZXIgcmVwb3NpdG9yeSBhcmUgbm90IGZvdW5kIGluIHRoZSBtYWlubGluZS4KLQotV2hlbiB0aGUgbWVyZ2Ugd2luZG93IG9wZW5zLCB0b3AtbGV2ZWwgbWFpbnRhaW5lcnMgd2lsbCBhc2sgTGludXMgdG8gInB1bGwiCi10aGUgcGF0Y2hlcyB0aGV5IGhhdmUgc2VsZWN0ZWQgZm9yIG1lcmdpbmcgZnJvbSB0aGVpciByZXBvc2l0b3JpZXMuICBJZgotTGludXMgYWdyZWVzLCB0aGUgc3RyZWFtIG9mIHBhdGNoZXMgd2lsbCBmbG93IHVwIGludG8gaGlzIHJlcG9zaXRvcnksCi1iZWNvbWluZyBwYXJ0IG9mIHRoZSBtYWlubGluZSBrZXJuZWwuICBUaGUgYW1vdW50IG9mIGF0dGVudGlvbiB0aGF0IExpbnVzCi1wYXlzIHRvIHNwZWNpZmljIHBhdGNoZXMgcmVjZWl2ZWQgaW4gYSBwdWxsIG9wZXJhdGlvbiB2YXJpZXMuICBJdCBpcyBjbGVhcgotdGhhdCwgc29tZXRpbWVzLCBoZSBsb29rcyBxdWl0ZSBjbG9zZWx5LiAgQnV0LCBhcyBhIGdlbmVyYWwgcnVsZSwgTGludXMKLXRydXN0cyB0aGUgc3Vic3lzdGVtIG1haW50YWluZXJzIHRvIG5vdCBzZW5kIGJhZCBwYXRjaGVzIHVwc3RyZWFtLgotCi1TdWJzeXN0ZW0gbWFpbnRhaW5lcnMsIGluIHR1cm4sIGNhbiBwdWxsIHBhdGNoZXMgZnJvbSBvdGhlciBtYWludGFpbmVycy4KLUZvciBleGFtcGxlLCB0aGUgbmV0d29ya2luZyB0cmVlIGlzIGJ1aWx0IGZyb20gcGF0Y2hlcyB3aGljaCBhY2N1bXVsYXRlZAotZmlyc3QgaW4gdHJlZXMgZGVkaWNhdGVkIHRvIG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMsIHdpcmVsZXNzIG5ldHdvcmtpbmcsCi1ldGMuICBUaGlzIGNoYWluIG9mIHJlcG9zaXRvcmllcyBjYW4gYmUgYXJiaXRyYXJpbHkgbG9uZywgdGhvdWdoIGl0IHJhcmVseQotZXhjZWVkcyB0d28gb3IgdGhyZWUgbGlua3MuICBTaW5jZSBlYWNoIG1haW50YWluZXIgaW4gdGhlIGNoYWluIHRydXN0cwotdGhvc2UgbWFuYWdpbmcgbG93ZXItbGV2ZWwgdHJlZXMsIHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcyB0aGUgImNoYWluIG9mCi10cnVzdC4iCi0KLUNsZWFybHksIGluIGEgc3lzdGVtIGxpa2UgdGhpcywgZ2V0dGluZyBwYXRjaGVzIGludG8gdGhlIGtlcm5lbCBkZXBlbmRzIG9uCi1maW5kaW5nIHRoZSByaWdodCBtYWludGFpbmVyLiAgU2VuZGluZyBwYXRjaGVzIGRpcmVjdGx5IHRvIExpbnVzIGlzIG5vdAotbm9ybWFsbHkgdGhlIHJpZ2h0IHdheSB0byBnby4KLQotCi0yLjQ6IE5FWFQgVFJFRVMKLQotVGhlIGNoYWluIG9mIHN1YnN5c3RlbSB0cmVlcyBndWlkZXMgdGhlIGZsb3cgb2YgcGF0Y2hlcyBpbnRvIHRoZSBrZXJuZWwsCi1idXQgaXQgYWxzbyByYWlzZXMgYW4gaW50ZXJlc3RpbmcgcXVlc3Rpb246IHdoYXQgaWYgc29tZWJvZHkgd2FudHMgdG8gbG9vawotYXQgYWxsIG9mIHRoZSBwYXRjaGVzIHdoaWNoIGFyZSBiZWluZyBwcmVwYXJlZCBmb3IgdGhlIG5leHQgbWVyZ2Ugd2luZG93PwotRGV2ZWxvcGVycyB3aWxsIGJlIGludGVyZXN0ZWQgaW4gd2hhdCBvdGhlciBjaGFuZ2VzIGFyZSBwZW5kaW5nIHRvIHNlZQotd2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZsaWN0cyB0byB3b3JyeSBhYm91dDsgYSBwYXRjaCB3aGljaCBjaGFuZ2VzIGEKLWNvcmUga2VybmVsIGZ1bmN0aW9uIHByb3RvdHlwZSwgZm9yIGV4YW1wbGUsIHdpbGwgY29uZmxpY3Qgd2l0aCBhbnkgb3RoZXIKLXBhdGNoZXMgd2hpY2ggdXNlIHRoZSBvbGRlciBmb3JtIG9mIHRoYXQgZnVuY3Rpb24uICBSZXZpZXdlcnMgYW5kIHRlc3RlcnMKLXdhbnQgYWNjZXNzIHRvIHRoZSBjaGFuZ2VzIGluIHRoZWlyIGludGVncmF0ZWQgZm9ybSBiZWZvcmUgYWxsIG9mIHRob3NlCi1jaGFuZ2VzIGxhbmQgaW4gdGhlIG1haW5saW5lIGtlcm5lbC4gIE9uZSBjb3VsZCBwdWxsIGNoYW5nZXMgZnJvbSBhbGwgb2YKLXRoZSBpbnRlcmVzdGluZyBzdWJzeXN0ZW0gdHJlZXMsIGJ1dCB0aGF0IHdvdWxkIGJlIGEgYmlnIGFuZCBlcnJvci1wcm9uZQotam9iLgotCi1UaGUgYW5zd2VyIGNvbWVzIGluIHRoZSBmb3JtIG9mIC1uZXh0IHRyZWVzLCB3aGVyZSBzdWJzeXN0ZW0gdHJlZXMgYXJlCi1jb2xsZWN0ZWQgZm9yIHRlc3RpbmcgYW5kIHJldmlldy4gIFRoZSBvbGRlciBvZiB0aGVzZSB0cmVlcywgbWFpbnRhaW5lZCBieQotQW5kcmV3IE1vcnRvbiwgaXMgY2FsbGVkICItbW0iIChmb3IgbWVtb3J5IG1hbmFnZW1lbnQsIHdoaWNoIGlzIGhvdyBpdCBnb3QKLXN0YXJ0ZWQpLiAgVGhlIC1tbSB0cmVlIGludGVncmF0ZXMgcGF0Y2hlcyBmcm9tIGEgbG9uZyBsaXN0IG9mIHN1YnN5c3RlbQotdHJlZXM7IGl0IGFsc28gaGFzIHNvbWUgcGF0Y2hlcyBhaW1lZCBhdCBoZWxwaW5nIHdpdGggZGVidWdnaW5nLgotCi1CZXlvbmQgdGhhdCwgLW1tIGNvbnRhaW5zIGEgc2lnbmlmaWNhbnQgY29sbGVjdGlvbiBvZiBwYXRjaGVzIHdoaWNoIGhhdmUKLWJlZW4gc2VsZWN0ZWQgYnkgQW5kcmV3IGRpcmVjdGx5LiAgVGhlc2UgcGF0Y2hlcyBtYXkgaGF2ZSBiZWVuIHBvc3RlZCBvbiBhCi1tYWlsaW5nIGxpc3QsIG9yIHRoZXkgbWF5IGFwcGx5IHRvIGEgcGFydCBvZiB0aGUga2VybmVsIGZvciB3aGljaCB0aGVyZSBpcwotbm8gZGVzaWduYXRlZCBzdWJzeXN0ZW0gdHJlZS4gIEFzIGEgcmVzdWx0LCAtbW0gb3BlcmF0ZXMgYXMgYSBzb3J0IG9mCi1zdWJzeXN0ZW0gdHJlZSBvZiBsYXN0IHJlc29ydDsgaWYgdGhlcmUgaXMgbm8gb3RoZXIgb2J2aW91cyBwYXRoIGZvciBhCi1wYXRjaCBpbnRvIHRoZSBtYWlubGluZSwgaXQgaXMgbGlrZWx5IHRvIGVuZCB1cCBpbiAtbW0uICBNaXNjZWxsYW5lb3VzCi1wYXRjaGVzIHdoaWNoIGFjY3VtdWxhdGUgaW4gLW1tIHdpbGwgZXZlbnR1YWxseSBlaXRoZXIgYmUgZm9yd2FyZGVkIG9uIHRvCi1hbiBhcHByb3ByaWF0ZSBzdWJzeXN0ZW0gdHJlZSBvciBiZSBzZW50IGRpcmVjdGx5IHRvIExpbnVzLiAgSW4gYSB0eXBpY2FsCi1kZXZlbG9wbWVudCBjeWNsZSwgYXBwcm94aW1hdGVseSA1LTEwJSBvZiB0aGUgcGF0Y2hlcyBnb2luZyBpbnRvIHRoZQotbWFpbmxpbmUgZ2V0IHRoZXJlIHZpYSAtbW0uCi0KLVRoZSBjdXJyZW50IC1tbSBwYXRjaCBpcyBhdmFpbGFibGUgaW4gdGhlICJtbW90bSIgKC1tbSBvZiB0aGUgbW9tZW50KQotZGlyZWN0b3J5IGF0OgotCi0JaHR0cDovL3d3dy5vemxhYnMub3JnL35ha3BtL21tb3RtLwotCi1Vc2Ugb2YgdGhlIE1NT1RNIHRyZWUgaXMgbGlrZWx5IHRvIGJlIGEgZnJ1c3RyYXRpbmcgZXhwZXJpZW5jZSwgdGhvdWdoOwotdGhlcmUgaXMgYSBkZWZpbml0ZSBjaGFuY2UgdGhhdCBpdCB3aWxsIG5vdCBldmVuIGNvbXBpbGUuCi0KLVRoZSBwcmltYXJ5IHRyZWUgZm9yIG5leHQtY3ljbGUgcGF0Y2ggbWVyZ2luZyBpcyBsaW51eC1uZXh0LCBtYWludGFpbmVkIGJ5Ci1TdGVwaGVuIFJvdGh3ZWxsLiAgVGhlIGxpbnV4LW5leHQgdHJlZSBpcywgYnkgZGVzaWduLCBhIHNuYXBzaG90IG9mIHdoYXQKLXRoZSBtYWlubGluZSBpcyBleHBlY3RlZCB0byBsb29rIGxpa2UgYWZ0ZXIgdGhlIG5leHQgbWVyZ2Ugd2luZG93IGNsb3Nlcy4KLUxpbnV4LW5leHQgdHJlZXMgYXJlIGFubm91bmNlZCBvbiB0aGUgbGludXgta2VybmVsIGFuZCBsaW51eC1uZXh0IG1haWxpbmcKLWxpc3RzIHdoZW4gdGhleSBhcmUgYXNzZW1ibGVkOyB0aGV5IGNhbiBiZSBkb3dubG9hZGVkIGZyb206Ci0KLQlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9uZXh0LwotCi1MaW51eC1uZXh0IGhhcyBiZWNvbWUgYW4gaW50ZWdyYWwgcGFydCBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3M7Ci1hbGwgcGF0Y2hlcyBtZXJnZWQgZHVyaW5nIGEgZ2l2ZW4gbWVyZ2Ugd2luZG93IHNob3VsZCByZWFsbHkgaGF2ZSBmb3VuZAotdGhlaXIgd2F5IGludG8gbGludXgtbmV4dCBzb21lIHRpbWUgYmVmb3JlIHRoZSBtZXJnZSB3aW5kb3cgb3BlbnMuCi0KLQotMi40LjE6IFNUQUdJTkcgVFJFRVMKLQotVGhlIGtlcm5lbCBzb3VyY2UgdHJlZSBjb250YWlucyB0aGUgZHJpdmVycy9zdGFnaW5nLyBkaXJlY3RvcnksIHdoZXJlCi1tYW55IHN1Yi1kaXJlY3RvcmllcyBmb3IgZHJpdmVycyBvciBmaWxlc3lzdGVtcyB0aGF0IGFyZSBvbiB0aGVpciB3YXkgdG8KLWJlaW5nIGFkZGVkIHRvIHRoZSBrZXJuZWwgdHJlZSBsaXZlLiAgVGhleSByZW1haW4gaW4gZHJpdmVycy9zdGFnaW5nIHdoaWxlCi10aGV5IHN0aWxsIG5lZWQgbW9yZSB3b3JrOyBvbmNlIGNvbXBsZXRlLCB0aGV5IGNhbiBiZSBtb3ZlZCBpbnRvIHRoZQota2VybmVsIHByb3Blci4gIFRoaXMgaXMgYSB3YXkgdG8ga2VlcCB0cmFjayBvZiBkcml2ZXJzIHRoYXQgYXJlbid0Ci11cCB0byBMaW51eCBrZXJuZWwgY29kaW5nIG9yIHF1YWxpdHkgc3RhbmRhcmRzLCBidXQgcGVvcGxlIG1heSB3YW50IHRvIHVzZQotdGhlbSBhbmQgdHJhY2sgZGV2ZWxvcG1lbnQuCi0KLUdyZWcgS3JvYWgtSGFydG1hbiBjdXJyZW50bHkgbWFpbnRhaW5zIHRoZSBzdGFnaW5nIHRyZWUuICBEcml2ZXJzIHRoYXQKLXN0aWxsIG5lZWQgd29yayBhcmUgc2VudCB0byBoaW0sIHdpdGggZWFjaCBkcml2ZXIgaGF2aW5nIGl0cyBvd24KLXN1YmRpcmVjdG9yeSBpbiBkcml2ZXJzL3N0YWdpbmcvLiAgQWxvbmcgd2l0aCB0aGUgZHJpdmVyIHNvdXJjZSBmaWxlcywgYQotVE9ETyBmaWxlIHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBkaXJlY3RvcnkgYXMgd2VsbC4gIFRoZSBUT0RPIGZpbGUgbGlzdHMKLXRoZSBwZW5kaW5nIHdvcmsgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIGZvciBhY2NlcHRhbmNlIGludG8gdGhlIGtlcm5lbAotcHJvcGVyLCBhcyB3ZWxsIGFzIGEgbGlzdCBvZiBwZW9wbGUgdGhhdCBzaG91bGQgYmUgQ2MnZCBmb3IgYW55IHBhdGNoZXMgdG8KLXRoZSBkcml2ZXIuICBDdXJyZW50IHJ1bGVzIHJlcXVpcmUgdGhhdCBkcml2ZXJzIGNvbnRyaWJ1dGVkIHRvIHN0YWdpbmcKLW11c3QsIGF0IGEgbWluaW11bSwgY29tcGlsZSBwcm9wZXJseS4KLQotU3RhZ2luZyBjYW4gYmUgYSByZWxhdGl2ZWx5IGVhc3kgd2F5IHRvIGdldCBuZXcgZHJpdmVycyBpbnRvIHRoZSBtYWlubGluZQotd2hlcmUsIHdpdGggbHVjaywgdGhleSB3aWxsIGNvbWUgdG8gdGhlIGF0dGVudGlvbiBvZiBvdGhlciBkZXZlbG9wZXJzIGFuZAotaW1wcm92ZSBxdWlja2x5LiAgRW50cnkgaW50byBzdGFnaW5nIGlzIG5vdCB0aGUgZW5kIG9mIHRoZSBzdG9yeSwgdGhvdWdoOwotY29kZSBpbiBzdGFnaW5nIHdoaWNoIGlzIG5vdCBzZWVpbmcgcmVndWxhciBwcm9ncmVzcyB3aWxsIGV2ZW50dWFsbHkgYmUKLXJlbW92ZWQuICBEaXN0cmlidXRvcnMgYWxzbyB0ZW5kIHRvIGJlIHJlbGF0aXZlbHkgcmVsdWN0YW50IHRvIGVuYWJsZQotc3RhZ2luZyBkcml2ZXJzLiAgU28gc3RhZ2luZyBpcywgYXQgYmVzdCwgYSBzdG9wIG9uIHRoZSB3YXkgdG93YXJkIGJlY29taW5nCi1hIHByb3BlciBtYWlubGluZSBkcml2ZXIuCi0KLQotMi41OiBUT09MUwotCi1BcyBjYW4gYmUgc2VlbiBmcm9tIHRoZSBhYm92ZSB0ZXh0LCB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MgZGVwZW5kcwotaGVhdmlseSBvbiB0aGUgYWJpbGl0eSB0byBoZXJkIGNvbGxlY3Rpb25zIG9mIHBhdGNoZXMgaW4gdmFyaW91cwotZGlyZWN0aW9ucy4gIFRoZSB3aG9sZSB0aGluZyB3b3VsZCBub3Qgd29yayBhbnl3aGVyZSBuZWFyIGFzIHdlbGwgYXMgaXQKLWRvZXMgd2l0aG91dCBzdWl0YWJseSBwb3dlcmZ1bCB0b29scy4gIFR1dG9yaWFscyBvbiBob3cgdG8gdXNlIHRoZXNlIHRvb2xzCi1hcmUgd2VsbCBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQsIGJ1dCB0aGVyZSBpcyBzcGFjZSBmb3IgYSBmZXcKLXBvaW50ZXJzLgotCi1CeSBmYXIgdGhlIGRvbWluYW50IHNvdXJjZSBjb2RlIG1hbmFnZW1lbnQgc3lzdGVtIHVzZWQgYnkgdGhlIGtlcm5lbAotY29tbXVuaXR5IGlzIGdpdC4gIEdpdCBpcyBvbmUgb2YgYSBudW1iZXIgb2YgZGlzdHJpYnV0ZWQgdmVyc2lvbiBjb250cm9sCi1zeXN0ZW1zIGJlaW5nIGRldmVsb3BlZCBpbiB0aGUgZnJlZSBzb2Z0d2FyZSBjb21tdW5pdHkuICBJdCBpcyB3ZWxsIHR1bmVkCi1mb3Iga2VybmVsIGRldmVsb3BtZW50LCBpbiB0aGF0IGl0IHBlcmZvcm1zIHF1aXRlIHdlbGwgd2hlbiBkZWFsaW5nIHdpdGgKLWxhcmdlIHJlcG9zaXRvcmllcyBhbmQgbGFyZ2UgbnVtYmVycyBvZiBwYXRjaGVzLiAgSXQgYWxzbyBoYXMgYSByZXB1dGF0aW9uCi1mb3IgYmVpbmcgZGlmZmljdWx0IHRvIGxlYXJuIGFuZCB1c2UsIHRob3VnaCBpdCBoYXMgZ290dGVuIGJldHRlciBvdmVyCi10aW1lLiAgU29tZSBzb3J0IG9mIGZhbWlsaWFyaXR5IHdpdGggZ2l0IGlzIGFsbW9zdCBhIHJlcXVpcmVtZW50IGZvciBrZXJuZWwKLWRldmVsb3BlcnM7IGV2ZW4gaWYgdGhleSBkbyBub3QgdXNlIGl0IGZvciB0aGVpciBvd24gd29yaywgdGhleSdsbCBuZWVkIGdpdAotdG8ga2VlcCB1cCB3aXRoIHdoYXQgb3RoZXIgZGV2ZWxvcGVycyAoYW5kIHRoZSBtYWlubGluZSkgYXJlIGRvaW5nLgotCi1HaXQgaXMgbm93IHBhY2thZ2VkIGJ5IGFsbW9zdCBhbGwgTGludXggZGlzdHJpYnV0aW9ucy4gIFRoZXJlIGlzIGEgaG9tZQotcGFnZSBhdDoKLQotCWh0dHA6Ly9naXQtc2NtLmNvbS8KLQotVGhhdCBwYWdlIGhhcyBwb2ludGVycyB0byBkb2N1bWVudGF0aW9uIGFuZCB0dXRvcmlhbHMuCi0KLUFtb25nIHRoZSBrZXJuZWwgZGV2ZWxvcGVycyB3aG8gZG8gbm90IHVzZSBnaXQsIHRoZSBtb3N0IHBvcHVsYXIgY2hvaWNlIGlzCi1hbG1vc3QgY2VydGFpbmx5IE1lcmN1cmlhbDoKLQotCWh0dHA6Ly93d3cuc2VsZW5pYy5jb20vbWVyY3VyaWFsLwotCi1NZXJjdXJpYWwgc2hhcmVzIG1hbnkgZmVhdHVyZXMgd2l0aCBnaXQsIGJ1dCBpdCBwcm92aWRlcyBhbiBpbnRlcmZhY2Ugd2hpY2gKLW1hbnkgZmluZCBlYXNpZXIgdG8gdXNlLgotCi1UaGUgb3RoZXIgdG9vbCB3b3J0aCBrbm93aW5nIGFib3V0IGlzIFF1aWx0OgotCi0JaHR0cDovL3NhdmFubmFoLm5vbmdudS5vcmcvcHJvamVjdHMvcXVpbHQvCi0KLVF1aWx0IGlzIGEgcGF0Y2ggbWFuYWdlbWVudCBzeXN0ZW0sIHJhdGhlciB0aGFuIGEgc291cmNlIGNvZGUgbWFuYWdlbWVudAotc3lzdGVtLiAgSXQgZG9lcyBub3QgdHJhY2sgaGlzdG9yeSBvdmVyIHRpbWU7IGl0IGlzLCBpbnN0ZWFkLCBvcmllbnRlZAotdG93YXJkIHRyYWNraW5nIGEgc3BlY2lmaWMgc2V0IG9mIGNoYW5nZXMgYWdhaW5zdCBhbiBldm9sdmluZyBjb2RlIGJhc2UuCi1Tb21lIG1ham9yIHN1YnN5c3RlbSBtYWludGFpbmVycyB1c2UgcXVpbHQgdG8gbWFuYWdlIHBhdGNoZXMgaW50ZW5kZWQgdG8gZ28KLXVwc3RyZWFtLiAgRm9yIHRoZSBtYW5hZ2VtZW50IG9mIGNlcnRhaW4ga2luZHMgb2YgdHJlZXMgKC1tbSwgZm9yIGV4YW1wbGUpLAotcXVpbHQgaXMgdGhlIGJlc3QgdG9vbCBmb3IgdGhlIGpvYi4KLQotCi0yLjY6IE1BSUxJTkcgTElTVFMKLQotQSBncmVhdCBkZWFsIG9mIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCB3b3JrIGlzIGRvbmUgYnkgd2F5IG9mIG1haWxpbmcKLWxpc3RzLiAgSXQgaXMgaGFyZCB0byBiZSBhIGZ1bGx5LWZ1bmN0aW9uaW5nIG1lbWJlciBvZiB0aGUgY29tbXVuaXR5Ci13aXRob3V0IGpvaW5pbmcgYXQgbGVhc3Qgb25lIGxpc3Qgc29tZXdoZXJlLiAgQnV0IExpbnV4IG1haWxpbmcgbGlzdHMgYWxzbwotcmVwcmVzZW50IGEgcG90ZW50aWFsIGhhemFyZCB0byBkZXZlbG9wZXJzLCB3aG8gcmlzayBnZXR0aW5nIGJ1cmllZCB1bmRlciBhCi1sb2FkIG9mIGVsZWN0cm9uaWMgbWFpbCwgcnVubmluZyBhZm91bCBvZiB0aGUgY29udmVudGlvbnMgdXNlZCBvbiB0aGUgTGludXgKLWxpc3RzLCBvciBib3RoLgotCi1Nb3N0IGtlcm5lbCBtYWlsaW5nIGxpc3RzIGFyZSBydW4gb24gdmdlci5rZXJuZWwub3JnOyB0aGUgbWFzdGVyIGxpc3QgY2FuCi1iZSBmb3VuZCBhdDoKLQotCWh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvdmdlci1saXN0cy5odG1sCi0KLVRoZXJlIGFyZSBsaXN0cyBob3N0ZWQgZWxzZXdoZXJlLCB0aG91Z2g7IGEgbnVtYmVyIG9mIHRoZW0gYXJlIGF0Ci1saXN0cy5yZWRoYXQuY29tLgotCi1UaGUgY29yZSBtYWlsaW5nIGxpc3QgZm9yIGtlcm5lbCBkZXZlbG9wbWVudCBpcywgb2YgY291cnNlLCBsaW51eC1rZXJuZWwuCi1UaGlzIGxpc3QgaXMgYW4gaW50aW1pZGF0aW5nIHBsYWNlIHRvIGJlOyB2b2x1bWUgY2FuIHJlYWNoIDUwMCBtZXNzYWdlcyBwZXIKLWRheSwgdGhlIGFtb3VudCBvZiBub2lzZSBpcyBoaWdoLCB0aGUgY29udmVyc2F0aW9uIGNhbiBiZSBzZXZlcmVseQotdGVjaG5pY2FsLCBhbmQgcGFydGljaXBhbnRzIGFyZSBub3QgYWx3YXlzIGNvbmNlcm5lZCB3aXRoIHNob3dpbmcgYSBoaWdoCi1kZWdyZWUgb2YgcG9saXRlbmVzcy4gIEJ1dCB0aGVyZSBpcyBubyBvdGhlciBwbGFjZSB3aGVyZSB0aGUga2VybmVsCi1kZXZlbG9wbWVudCBjb21tdW5pdHkgY29tZXMgdG9nZXRoZXIgYXMgYSB3aG9sZTsgZGV2ZWxvcGVycyB3aG8gYXZvaWQgdGhpcwotbGlzdCB3aWxsIG1pc3MgaW1wb3J0YW50IGluZm9ybWF0aW9uLgotCi1UaGVyZSBhcmUgYSBmZXcgaGludHMgd2hpY2ggY2FuIGhlbHAgd2l0aCBsaW51eC1rZXJuZWwgc3Vydml2YWw6Ci0KLS0gSGF2ZSB0aGUgbGlzdCBkZWxpdmVyZWQgdG8gYSBzZXBhcmF0ZSBmb2xkZXIsIHJhdGhlciB0aGFuIHlvdXIgbWFpbgotICBtYWlsYm94LiAgT25lIG11c3QgYmUgYWJsZSB0byBpZ25vcmUgdGhlIHN0cmVhbSBmb3Igc3VzdGFpbmVkIHBlcmlvZHMgb2YKLSAgdGltZS4KLQotLSBEbyBub3QgdHJ5IHRvIGZvbGxvdyBldmVyeSBjb252ZXJzYXRpb24gLSBub2JvZHkgZWxzZSBkb2VzLiAgSXQgaXMKLSAgaW1wb3J0YW50IHRvIGZpbHRlciBvbiBib3RoIHRoZSB0b3BpYyBvZiBpbnRlcmVzdCAodGhvdWdoIG5vdGUgdGhhdAotICBsb25nLXJ1bm5pbmcgY29udmVyc2F0aW9ucyBjYW4gZHJpZnQgYXdheSBmcm9tIHRoZSBvcmlnaW5hbCBzdWJqZWN0Ci0gIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGVtYWlsIHN1YmplY3QgbGluZSkgYW5kIHRoZSBwZW9wbGUgd2hvIGFyZQotICBwYXJ0aWNpcGF0aW5nLgotCi0tIERvIG5vdCBmZWVkIHRoZSB0cm9sbHMuICBJZiBzb21lYm9keSBpcyB0cnlpbmcgdG8gc3RpciB1cCBhbiBhbmdyeQotICByZXNwb25zZSwgaWdub3JlIHRoZW0uCi0KLS0gV2hlbiByZXNwb25kaW5nIHRvIGxpbnV4LWtlcm5lbCBlbWFpbCAob3IgdGhhdCBvbiBvdGhlciBsaXN0cykgcHJlc2VydmUKLSAgdGhlIENjOiBoZWFkZXIgZm9yIGFsbCBpbnZvbHZlZC4gIEluIHRoZSBhYnNlbmNlIG9mIGEgc3Ryb25nIHJlYXNvbiAoc3VjaAotICBhcyBhbiBleHBsaWNpdCByZXF1ZXN0KSwgeW91IHNob3VsZCBuZXZlciByZW1vdmUgcmVjaXBpZW50cy4gIEFsd2F5cyBtYWtlCi0gIHN1cmUgdGhhdCB0aGUgcGVyc29uIHlvdSBhcmUgcmVzcG9uZGluZyB0byBpcyBpbiB0aGUgQ2M6IGxpc3QuICBUaGlzCi0gIGNvbnZlbnRpb24gYWxzbyBtYWtlcyBpdCB1bm5lY2Vzc2FyeSB0byBleHBsaWNpdGx5IGFzayB0byBiZSBjb3BpZWQgb24KLSAgcmVwbGllcyB0byB5b3VyIHBvc3RpbmdzLgotCi0tIFNlYXJjaCB0aGUgbGlzdCBhcmNoaXZlcyAoYW5kIHRoZSBuZXQgYXMgYSB3aG9sZSkgYmVmb3JlIGFza2luZwotICBxdWVzdGlvbnMuICBTb21lIGRldmVsb3BlcnMgY2FuIGdldCBpbXBhdGllbnQgd2l0aCBwZW9wbGUgd2hvIGNsZWFybHkKLSAgaGF2ZSBub3QgZG9uZSB0aGVpciBob21ld29yay4KLQotLSBBdm9pZCB0b3AtcG9zdGluZyAodGhlIHByYWN0aWNlIG9mIHB1dHRpbmcgeW91ciBhbnN3ZXIgYWJvdmUgdGhlIHF1b3RlZAotICB0ZXh0IHlvdSBhcmUgcmVzcG9uZGluZyB0bykuICBJdCBtYWtlcyB5b3VyIHJlc3BvbnNlIGhhcmRlciB0byByZWFkIGFuZAotICBtYWtlcyBhIHBvb3IgaW1wcmVzc2lvbi4KLQotLSBBc2sgb24gdGhlIGNvcnJlY3QgbWFpbGluZyBsaXN0LiAgTGludXgta2VybmVsIG1heSBiZSB0aGUgZ2VuZXJhbCBtZWV0aW5nCi0gIHBvaW50LCBidXQgaXQgaXMgbm90IHRoZSBiZXN0IHBsYWNlIHRvIGZpbmQgZGV2ZWxvcGVycyBmcm9tIGFsbAotICBzdWJzeXN0ZW1zLgotCi1UaGUgbGFzdCBwb2ludCAtIGZpbmRpbmcgdGhlIGNvcnJlY3QgbWFpbGluZyBsaXN0IC0gaXMgYSBjb21tb24gcGxhY2UgZm9yCi1iZWdpbm5pbmcgZGV2ZWxvcGVycyB0byBnbyB3cm9uZy4gIFNvbWVib2R5IHdobyBhc2tzIGEgbmV0d29ya2luZy1yZWxhdGVkCi1xdWVzdGlvbiBvbiBsaW51eC1rZXJuZWwgd2lsbCBhbG1vc3QgY2VydGFpbmx5IHJlY2VpdmUgYSBwb2xpdGUgc3VnZ2VzdGlvbgotdG8gYXNrIG9uIHRoZSBuZXRkZXYgbGlzdCBpbnN0ZWFkLCBhcyB0aGF0IGlzIHRoZSBsaXN0IGZyZXF1ZW50ZWQgYnkgbW9zdAotbmV0d29ya2luZyBkZXZlbG9wZXJzLiAgT3RoZXIgbGlzdHMgZXhpc3QgZm9yIHRoZSBTQ1NJLCB2aWRlbzRsaW51eCwgSURFLAotZmlsZXN5c3RlbSwgZXRjLiBzdWJzeXN0ZW1zLiAgVGhlIGJlc3QgcGxhY2UgdG8gbG9vayBmb3IgbWFpbGluZyBsaXN0cyBpcwotaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUgcGFja2FnZWQgd2l0aCB0aGUga2VybmVsIHNvdXJjZS4KLQotCi0yLjc6IEdFVFRJTkcgU1RBUlRFRCBXSVRIIEtFUk5FTCBERVZFTE9QTUVOVAotCi1RdWVzdGlvbnMgYWJvdXQgaG93IHRvIGdldCBzdGFydGVkIHdpdGggdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIGFyZQotY29tbW9uIC0gZnJvbSBib3RoIGluZGl2aWR1YWxzIGFuZCBjb21wYW5pZXMuICBFcXVhbGx5IGNvbW1vbiBhcmUgbWlzc3RlcHMKLXdoaWNoIG1ha2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVsYXRpb25zaGlwIGhhcmRlciB0aGFuIGl0IGhhcyB0byBiZS4KLQotQ29tcGFuaWVzIG9mdGVuIGxvb2sgdG8gaGlyZSB3ZWxsLWtub3duIGRldmVsb3BlcnMgdG8gZ2V0IGEgZGV2ZWxvcG1lbnQKLWdyb3VwIHN0YXJ0ZWQuICBUaGlzIGNhbiwgaW4gZmFjdCwgYmUgYW4gZWZmZWN0aXZlIHRlY2huaXF1ZS4gIEJ1dCBpdCBhbHNvCi10ZW5kcyB0byBiZSBleHBlbnNpdmUgYW5kIGRvZXMgbm90IGRvIG11Y2ggdG8gZ3JvdyB0aGUgcG9vbCBvZiBleHBlcmllbmNlZAota2VybmVsIGRldmVsb3BlcnMuICBJdCBpcyBwb3NzaWJsZSB0byBicmluZyBpbi1ob3VzZSBkZXZlbG9wZXJzIHVwIHRvIHNwZWVkCi1vbiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQsIGdpdmVuIHRoZSBpbnZlc3RtZW50IG9mIGEgYml0IG9mIHRpbWUuICBUYWtpbmcKLXRoaXMgdGltZSBjYW4gZW5kb3cgYW4gZW1wbG95ZXIgd2l0aCBhIGdyb3VwIG9mIGRldmVsb3BlcnMgd2hvIHVuZGVyc3RhbmQKLXRoZSBrZXJuZWwgYW5kIHRoZSBjb21wYW55IGJvdGgsIGFuZCB3aG8gY2FuIGhlbHAgdG8gdHJhaW4gb3RoZXJzIGFzIHdlbGwuCi1PdmVyIHRoZSBtZWRpdW0gdGVybSwgdGhpcyBpcyBvZnRlbiB0aGUgbW9yZSBwcm9maXRhYmxlIGFwcHJvYWNoLgotCi1JbmRpdmlkdWFsIGRldmVsb3BlcnMgYXJlIG9mdGVuLCB1bmRlcnN0YW5kYWJseSwgYXQgYSBsb3NzIGZvciBhIHBsYWNlIHRvCi1zdGFydC4gIEJlZ2lubmluZyB3aXRoIGEgbGFyZ2UgcHJvamVjdCBjYW4gYmUgaW50aW1pZGF0aW5nOyBvbmUgb2Z0ZW4gd2FudHMKLXRvIHRlc3QgdGhlIHdhdGVycyB3aXRoIHNvbWV0aGluZyBzbWFsbGVyIGZpcnN0LiAgVGhpcyBpcyB0aGUgcG9pbnQgd2hlcmUKLXNvbWUgZGV2ZWxvcGVycyBqdW1wIGludG8gdGhlIGNyZWF0aW9uIG9mIHBhdGNoZXMgZml4aW5nIHNwZWxsaW5nIGVycm9ycyBvcgotbWlub3IgY29kaW5nIHN0eWxlIGlzc3Vlcy4gIFVuZm9ydHVuYXRlbHksIHN1Y2ggcGF0Y2hlcyBjcmVhdGUgYSBsZXZlbCBvZgotbm9pc2Ugd2hpY2ggaXMgZGlzdHJhY3RpbmcgZm9yIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYXMgYSB3aG9sZSwgc28sCi1pbmNyZWFzaW5nbHksIHRoZXkgYXJlIGxvb2tlZCBkb3duIHVwb24uICBOZXcgZGV2ZWxvcGVycyB3aXNoaW5nIHRvCi1pbnRyb2R1Y2UgdGhlbXNlbHZlcyB0byB0aGUgY29tbXVuaXR5IHdpbGwgbm90IGdldCB0aGUgc29ydCBvZiByZWNlcHRpb24KLXRoZXkgd2lzaCBmb3IgYnkgdGhlc2UgbWVhbnMuCi0KLUFuZHJldyBNb3J0b24gZ2l2ZXMgdGhpcyBhZHZpY2UgZm9yIGFzcGlyaW5nIGtlcm5lbCBkZXZlbG9wZXJzCi0KLQlUaGUgIzEgcHJvamVjdCBmb3IgYWxsIGtlcm5lbCBiZWdpbm5lcnMgc2hvdWxkIHN1cmVseSBiZSAibWFrZSBzdXJlCi0JdGhhdCB0aGUga2VybmVsIHJ1bnMgcGVyZmVjdGx5IGF0IGFsbCB0aW1lcyBvbiBhbGwgbWFjaGluZXMgd2hpY2gKLQl5b3UgY2FuIGxheSB5b3VyIGhhbmRzIG9uIi4gIFVzdWFsbHkgdGhlIHdheSB0byBkbyB0aGlzIGlzIHRvIHdvcmsKLQl3aXRoIG90aGVycyBvbiBnZXR0aW5nIHRoaW5ncyBmaXhlZCB1cCAodGhpcyBjYW4gcmVxdWlyZQotCXBlcnNpc3RlbmNlISkgYnV0IHRoYXQncyBmaW5lIC0gaXQncyBhIHBhcnQgb2Yga2VybmVsIGRldmVsb3BtZW50LgotCi0oaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjgzOTgyLykuCi0KLUluIHRoZSBhYnNlbmNlIG9mIG9idmlvdXMgcHJvYmxlbXMgdG8gZml4LCBkZXZlbG9wZXJzIGFyZSBhZHZpc2VkIHRvIGxvb2sKLWF0IHRoZSBjdXJyZW50IGxpc3RzIG9mIHJlZ3Jlc3Npb25zIGFuZCBvcGVuIGJ1Z3MgaW4gZ2VuZXJhbC4gIFRoZXJlIGlzCi1uZXZlciBhbnkgc2hvcnRhZ2Ugb2YgaXNzdWVzIGluIG5lZWQgb2YgZml4aW5nOyBieSBhZGRyZXNzaW5nIHRoZXNlIGlzc3VlcywKLWRldmVsb3BlcnMgd2lsbCBnYWluIGV4cGVyaWVuY2Ugd2l0aCB0aGUgcHJvY2VzcyB3aGlsZSwgYXQgdGhlIHNhbWUgdGltZSwKLWJ1aWxkaW5nIHJlc3BlY3Qgd2l0aCB0aGUgcmVzdCBvZiB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzIuUHJvY2Vzcy5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMi5Qcm9jZXNzLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTU1NjFiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzIuUHJvY2Vzcy5yc3QKQEAgLTAsMCArMSw0OTcgQEAKKy4uIF9kZXZlbG9wbWVudF9wcm9jZXNzOgorCitIb3cgdGhlIGRldmVsb3BtZW50IHByb2Nlc3Mgd29ya3MKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgaW4gdGhlIGVhcmx5IDE5OTAncyB3YXMgYSBwcmV0dHkgbG9vc2UgYWZmYWlyLAord2l0aCByZWxhdGl2ZWx5IHNtYWxsIG51bWJlcnMgb2YgdXNlcnMgYW5kIGRldmVsb3BlcnMgaW52b2x2ZWQuICBXaXRoIGEKK3VzZXIgYmFzZSBpbiB0aGUgbWlsbGlvbnMgYW5kIHdpdGggc29tZSAyLDAwMCBkZXZlbG9wZXJzIGludm9sdmVkIG92ZXIgdGhlCitjb3Vyc2Ugb2Ygb25lIHllYXIsIHRoZSBrZXJuZWwgaGFzIHNpbmNlIGhhZCB0byBldm9sdmUgYSBudW1iZXIgb2YKK3Byb2Nlc3NlcyB0byBrZWVwIGRldmVsb3BtZW50IGhhcHBlbmluZyBzbW9vdGhseS4gIEEgc29saWQgdW5kZXJzdGFuZGluZyBvZgoraG93IHRoZSBwcm9jZXNzIHdvcmtzIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIGJlIGFuIGVmZmVjdGl2ZSBwYXJ0IG9mIGl0LgorCitUaGUgYmlnIHBpY3R1cmUKKy0tLS0tLS0tLS0tLS0tLQorCitUaGUga2VybmVsIGRldmVsb3BlcnMgdXNlIGEgbG9vc2VseSB0aW1lLWJhc2VkIHJlbGVhc2UgcHJvY2Vzcywgd2l0aCBhIG5ldworbWFqb3Iga2VybmVsIHJlbGVhc2UgaGFwcGVuaW5nIGV2ZXJ5IHR3byBvciB0aHJlZSBtb250aHMuICBUaGUgcmVjZW50CityZWxlYXNlIGhpc3RvcnkgbG9va3MgbGlrZSB0aGlzOgorCisJPT09PT09ICA9PT09PT09PT09PT09PT09PQorCTIuNi4zOAlNYXJjaCAxNCwgMjAxMQorCTIuNi4zNwlKYW51YXJ5IDQsIDIwMTEKKwkyLjYuMzYJT2N0b2JlciAyMCwgMjAxMAorCTIuNi4zNQlBdWd1c3QgMSwgMjAxMAorCTIuNi4zNAlNYXkgMTUsIDIwMTAKKwkyLjYuMzMJRmVicnVhcnkgMjQsIDIwMTAKKwk9PT09PT0gID09PT09PT09PT09PT09PT09CisKK0V2ZXJ5IDIuNi54IHJlbGVhc2UgaXMgYSBtYWpvciBrZXJuZWwgcmVsZWFzZSB3aXRoIG5ldyBmZWF0dXJlcywgaW50ZXJuYWwKK0FQSSBjaGFuZ2VzLCBhbmQgbW9yZS4gIEEgdHlwaWNhbCAyLjYgcmVsZWFzZSBjYW4gY29udGFpbiBuZWFybHkgMTAsMDAwCitjaGFuZ2VzZXRzIHdpdGggY2hhbmdlcyB0byBzZXZlcmFsIGh1bmRyZWQgdGhvdXNhbmQgbGluZXMgb2YgY29kZS4gIDIuNiBpcwordGh1cyB0aGUgbGVhZGluZyBlZGdlIG9mIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudDsgdGhlIGtlcm5lbCB1c2VzIGEKK3JvbGxpbmcgZGV2ZWxvcG1lbnQgbW9kZWwgd2hpY2ggaXMgY29udGludWFsbHkgaW50ZWdyYXRpbmcgbWFqb3IgY2hhbmdlcy4KKworQSByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZCBkaXNjaXBsaW5lIGlzIGZvbGxvd2VkIHdpdGggcmVnYXJkIHRvIHRoZQorbWVyZ2luZyBvZiBwYXRjaGVzIGZvciBlYWNoIHJlbGVhc2UuICBBdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggZGV2ZWxvcG1lbnQKK2N5Y2xlLCB0aGUgIm1lcmdlIHdpbmRvdyIgaXMgc2FpZCB0byBiZSBvcGVuLiAgQXQgdGhhdCB0aW1lLCBjb2RlIHdoaWNoIGlzCitkZWVtZWQgdG8gYmUgc3VmZmljaWVudGx5IHN0YWJsZSAoYW5kIHdoaWNoIGlzIGFjY2VwdGVkIGJ5IHRoZSBkZXZlbG9wbWVudAorY29tbXVuaXR5KSBpcyBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLiAgVGhlIGJ1bGsgb2YgY2hhbmdlcyBmb3IgYQorbmV3IGRldmVsb3BtZW50IGN5Y2xlIChhbmQgYWxsIG9mIHRoZSBtYWpvciBjaGFuZ2VzKSB3aWxsIGJlIG1lcmdlZCBkdXJpbmcKK3RoaXMgdGltZSwgYXQgYSByYXRlIGFwcHJvYWNoaW5nIDEsMDAwIGNoYW5nZXMgKCJwYXRjaGVzLCIgb3IgImNoYW5nZXNldHMiKQorcGVyIGRheS4KKworKEFzIGFuIGFzaWRlLCBpdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB0aGUgY2hhbmdlcyBpbnRlZ3JhdGVkIGR1cmluZyB0aGUKK21lcmdlIHdpbmRvdyBkbyBub3QgY29tZSBvdXQgb2YgdGhpbiBhaXI7IHRoZXkgaGF2ZSBiZWVuIGNvbGxlY3RlZCwgdGVzdGVkLAorYW5kIHN0YWdlZCBhaGVhZCBvZiB0aW1lLiAgSG93IHRoYXQgcHJvY2VzcyB3b3JrcyB3aWxsIGJlIGRlc2NyaWJlZCBpbgorZGV0YWlsIGxhdGVyIG9uKS4KKworVGhlIG1lcmdlIHdpbmRvdyBsYXN0cyBmb3IgYXBwcm94aW1hdGVseSB0d28gd2Vla3MuICBBdCB0aGUgZW5kIG9mIHRoaXMKK3RpbWUsIExpbnVzIFRvcnZhbGRzIHdpbGwgZGVjbGFyZSB0aGF0IHRoZSB3aW5kb3cgaXMgY2xvc2VkIGFuZCByZWxlYXNlIHRoZQorZmlyc3Qgb2YgdGhlICJyYyIga2VybmVscy4gIEZvciB0aGUga2VybmVsIHdoaWNoIGlzIGRlc3RpbmVkIHRvIGJlIDIuNi40MCwKK2ZvciBleGFtcGxlLCB0aGUgcmVsZWFzZSB3aGljaCBoYXBwZW5zIGF0IHRoZSBlbmQgb2YgdGhlIG1lcmdlIHdpbmRvdyB3aWxsCitiZSBjYWxsZWQgMi42LjQwLXJjMS4gIFRoZSAtcmMxIHJlbGVhc2UgaXMgdGhlIHNpZ25hbCB0aGF0IHRoZSB0aW1lIHRvCittZXJnZSBuZXcgZmVhdHVyZXMgaGFzIHBhc3NlZCwgYW5kIHRoYXQgdGhlIHRpbWUgdG8gc3RhYmlsaXplIHRoZSBuZXh0CitrZXJuZWwgaGFzIGJlZ3VuLgorCitPdmVyIHRoZSBuZXh0IHNpeCB0byB0ZW4gd2Vla3MsIG9ubHkgcGF0Y2hlcyB3aGljaCBmaXggcHJvYmxlbXMgc2hvdWxkIGJlCitzdWJtaXR0ZWQgdG8gdGhlIG1haW5saW5lLiAgT24gb2NjYXNpb24gYSBtb3JlIHNpZ25pZmljYW50IGNoYW5nZSB3aWxsIGJlCithbGxvd2VkLCBidXQgc3VjaCBvY2Nhc2lvbnMgYXJlIHJhcmU7IGRldmVsb3BlcnMgd2hvIHRyeSB0byBtZXJnZSBuZXcKK2ZlYXR1cmVzIG91dHNpZGUgb2YgdGhlIG1lcmdlIHdpbmRvdyB0ZW5kIHRvIGdldCBhbiB1bmZyaWVuZGx5IHJlY2VwdGlvbi4KK0FzIGEgZ2VuZXJhbCBydWxlLCBpZiB5b3UgbWlzcyB0aGUgbWVyZ2Ugd2luZG93IGZvciBhIGdpdmVuIGZlYXR1cmUsIHRoZQorYmVzdCB0aGluZyB0byBkbyBpcyB0byB3YWl0IGZvciB0aGUgbmV4dCBkZXZlbG9wbWVudCBjeWNsZS4gIChBbiBvY2Nhc2lvbmFsCitleGNlcHRpb24gaXMgbWFkZSBmb3IgZHJpdmVycyBmb3IgcHJldmlvdXNseS11bnN1cHBvcnRlZCBoYXJkd2FyZTsgaWYgdGhleQordG91Y2ggbm8gaW4tdHJlZSBjb2RlLCB0aGV5IGNhbm5vdCBjYXVzZSByZWdyZXNzaW9ucyBhbmQgc2hvdWxkIGJlIHNhZmUgdG8KK2FkZCBhdCBhbnkgdGltZSkuCisKK0FzIGZpeGVzIG1ha2UgdGhlaXIgd2F5IGludG8gdGhlIG1haW5saW5lLCB0aGUgcGF0Y2ggcmF0ZSB3aWxsIHNsb3cgb3ZlcgordGltZS4gIExpbnVzIHJlbGVhc2VzIG5ldyAtcmMga2VybmVscyBhYm91dCBvbmNlIGEgd2VlazsgYSBub3JtYWwgc2VyaWVzCit3aWxsIGdldCB1cCB0byBzb21ld2hlcmUgYmV0d2VlbiAtcmM2IGFuZCAtcmM5IGJlZm9yZSB0aGUga2VybmVsIGlzCitjb25zaWRlcmVkIHRvIGJlIHN1ZmZpY2llbnRseSBzdGFibGUgYW5kIHRoZSBmaW5hbCAyLjYueCByZWxlYXNlIGlzIG1hZGUuCitBdCB0aGF0IHBvaW50IHRoZSB3aG9sZSBwcm9jZXNzIHN0YXJ0cyBvdmVyIGFnYWluLgorCitBcyBhbiBleGFtcGxlLCBoZXJlIGlzIGhvdyB0aGUgMi42LjM4IGRldmVsb3BtZW50IGN5Y2xlIHdlbnQgKGFsbCBkYXRlcyBpbgorMjAxMSk6CisKKwk9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCUphbnVhcnkgNAkyLjYuMzcgc3RhYmxlIHJlbGVhc2UKKwlKYW51YXJ5IDE4CTIuNi4zOC1yYzEsIG1lcmdlIHdpbmRvdyBjbG9zZXMKKwlKYW51YXJ5IDIxCTIuNi4zOC1yYzIKKwlGZWJydWFyeSAxCTIuNi4zOC1yYzMKKwlGZWJydWFyeSA3CTIuNi4zOC1yYzQKKwlGZWJydWFyeSAxNQkyLjYuMzgtcmM1CisJRmVicnVhcnkgMjEJMi42LjM4LXJjNgorCU1hcmNoIDEJCTIuNi4zOC1yYzcKKwlNYXJjaCA3CQkyLjYuMzgtcmM4CisJTWFyY2ggMTQJMi42LjM4IHN0YWJsZSByZWxlYXNlCisJPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSG93IGRvIHRoZSBkZXZlbG9wZXJzIGRlY2lkZSB3aGVuIHRvIGNsb3NlIHRoZSBkZXZlbG9wbWVudCBjeWNsZSBhbmQgY3JlYXRlCit0aGUgc3RhYmxlIHJlbGVhc2U/ICBUaGUgbW9zdCBzaWduaWZpY2FudCBtZXRyaWMgdXNlZCBpcyB0aGUgbGlzdCBvZgorcmVncmVzc2lvbnMgZnJvbSBwcmV2aW91cyByZWxlYXNlcy4gIE5vIGJ1Z3MgYXJlIHdlbGNvbWUsIGJ1dCB0aG9zZSB3aGljaAorYnJlYWsgc3lzdGVtcyB3aGljaCB3b3JrZWQgaW4gdGhlIHBhc3QgYXJlIGNvbnNpZGVyZWQgdG8gYmUgZXNwZWNpYWxseQorc2VyaW91cy4gIEZvciB0aGlzIHJlYXNvbiwgcGF0Y2hlcyB3aGljaCBjYXVzZSByZWdyZXNzaW9ucyBhcmUgbG9va2VkIHVwb24KK3VuZmF2b3JhYmx5IGFuZCBhcmUgcXVpdGUgbGlrZWx5IHRvIGJlIHJldmVydGVkIGR1cmluZyB0aGUgc3RhYmlsaXphdGlvbgorcGVyaW9kLgorCitUaGUgZGV2ZWxvcGVycycgZ29hbCBpcyB0byBmaXggYWxsIGtub3duIHJlZ3Jlc3Npb25zIGJlZm9yZSB0aGUgc3RhYmxlCityZWxlYXNlIGlzIG1hZGUuICBJbiB0aGUgcmVhbCB3b3JsZCwgdGhpcyBraW5kIG9mIHBlcmZlY3Rpb24gaXMgaGFyZCB0bworYWNoaWV2ZTsgdGhlcmUgYXJlIGp1c3QgdG9vIG1hbnkgdmFyaWFibGVzIGluIGEgcHJvamVjdCBvZiB0aGlzIHNpemUuCitUaGVyZSBjb21lcyBhIHBvaW50IHdoZXJlIGRlbGF5aW5nIHRoZSBmaW5hbCByZWxlYXNlIGp1c3QgbWFrZXMgdGhlIHByb2JsZW0KK3dvcnNlOyB0aGUgcGlsZSBvZiBjaGFuZ2VzIHdhaXRpbmcgZm9yIHRoZSBuZXh0IG1lcmdlIHdpbmRvdyB3aWxsIGdyb3cKK2xhcmdlciwgY3JlYXRpbmcgZXZlbiBtb3JlIHJlZ3Jlc3Npb25zIHRoZSBuZXh0IHRpbWUgYXJvdW5kLiAgU28gbW9zdCAyLjYueAora2VybmVscyBnbyBvdXQgd2l0aCBhIGhhbmRmdWwgb2Yga25vd24gcmVncmVzc2lvbnMgdGhvdWdoLCBob3BlZnVsbHksIG5vbmUKK29mIHRoZW0gYXJlIHNlcmlvdXMuCisKK09uY2UgYSBzdGFibGUgcmVsZWFzZSBpcyBtYWRlLCBpdHMgb25nb2luZyBtYWludGVuYW5jZSBpcyBwYXNzZWQgb2ZmIHRvIHRoZQorInN0YWJsZSB0ZWFtLCIgY3VycmVudGx5IGNvbnNpc3Rpbmcgb2YgR3JlZyBLcm9haC1IYXJ0bWFuLiAgVGhlIHN0YWJsZSB0ZWFtCit3aWxsIHJlbGVhc2Ugb2NjYXNpb25hbCB1cGRhdGVzIHRvIHRoZSBzdGFibGUgcmVsZWFzZSB1c2luZyB0aGUgMi42LngueQorbnVtYmVyaW5nIHNjaGVtZS4gIFRvIGJlIGNvbnNpZGVyZWQgZm9yIGFuIHVwZGF0ZSByZWxlYXNlLCBhIHBhdGNoIG11c3QgKDEpCitmaXggYSBzaWduaWZpY2FudCBidWcsIGFuZCAoMikgYWxyZWFkeSBiZSBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUgZm9yIHRoZQorbmV4dCBkZXZlbG9wbWVudCBrZXJuZWwuICBLZXJuZWxzIHdpbGwgdHlwaWNhbGx5IHJlY2VpdmUgc3RhYmxlIHVwZGF0ZXMgZm9yCithIGxpdHRsZSBtb3JlIHRoYW4gb25lIGRldmVsb3BtZW50IGN5Y2xlIHBhc3QgdGhlaXIgaW5pdGlhbCByZWxlYXNlLiAgU28sCitmb3IgZXhhbXBsZSwgdGhlIDIuNi4zNiBrZXJuZWwncyBoaXN0b3J5IGxvb2tlZCBsaWtlOgorCisJPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlPY3RvYmVyIDEwCTIuNi4zNiBzdGFibGUgcmVsZWFzZQorCU5vdmVtYmVyIDIyCTIuNi4zNi4xCisJRGVjZW1iZXIgOQkyLjYuMzYuMgorCUphbnVhcnkgNwkyLjYuMzYuMworCUZlYnJ1YXJ5IDE3CTIuNi4zNi40CisJPT09PT09PT09PT09PT0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMi42LjM2LjQgd2FzIHRoZSBmaW5hbCBzdGFibGUgdXBkYXRlIGZvciB0aGUgMi42LjM2IHJlbGVhc2UuCisKK1NvbWUga2VybmVscyBhcmUgZGVzaWduYXRlZCAibG9uZyB0ZXJtIiBrZXJuZWxzOyB0aGV5IHdpbGwgcmVjZWl2ZSBzdXBwb3J0Citmb3IgYSBsb25nZXIgcGVyaW9kLiAgQXMgb2YgdGhpcyB3cml0aW5nLCB0aGUgY3VycmVudCBsb25nIHRlcm0ga2VybmVscworYW5kIHRoZWlyIG1haW50YWluZXJzIGFyZToKKworCT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09CisJMi42LjI3CVdpbGx5IFRhcnJlYXUJCShEZWVwLWZyb3plbiBzdGFibGUga2VybmVsKQorCTIuNi4zMglHcmVnIEtyb2FoLUhhcnRtYW4KKwkyLjYuMzUJQW5kaSBLbGVlbgkJKEVtYmVkZGVkIGZsYWcga2VybmVsKQorCT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBzZWxlY3Rpb24gb2YgYSBrZXJuZWwgZm9yIGxvbmctdGVybSBzdXBwb3J0IGlzIHB1cmVseSBhIG1hdHRlciBvZiBhCittYWludGFpbmVyIGhhdmluZyB0aGUgbmVlZCBhbmQgdGhlIHRpbWUgdG8gbWFpbnRhaW4gdGhhdCByZWxlYXNlLiAgVGhlcmUKK2FyZSBubyBrbm93biBwbGFucyBmb3IgbG9uZy10ZXJtIHN1cHBvcnQgZm9yIGFueSBzcGVjaWZpYyB1cGNvbWluZworcmVsZWFzZS4KKworCitUaGUgbGlmZWN5Y2xlIG9mIGEgcGF0Y2gKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQYXRjaGVzIGRvIG5vdCBnbyBkaXJlY3RseSBmcm9tIHRoZSBkZXZlbG9wZXIncyBrZXlib2FyZCBpbnRvIHRoZSBtYWlubGluZQora2VybmVsLiAgVGhlcmUgaXMsIGluc3RlYWQsIGEgc29tZXdoYXQgaW52b2x2ZWQgKGlmIHNvbWV3aGF0IGluZm9ybWFsKQorcHJvY2VzcyBkZXNpZ25lZCB0byBlbnN1cmUgdGhhdCBlYWNoIHBhdGNoIGlzIHJldmlld2VkIGZvciBxdWFsaXR5IGFuZCB0aGF0CitlYWNoIHBhdGNoIGltcGxlbWVudHMgYSBjaGFuZ2Ugd2hpY2ggaXMgZGVzaXJhYmxlIHRvIGhhdmUgaW4gdGhlIG1haW5saW5lLgorVGhpcyBwcm9jZXNzIGNhbiBoYXBwZW4gcXVpY2tseSBmb3IgbWlub3IgZml4ZXMsIG9yLCBpbiB0aGUgY2FzZSBvZiBsYXJnZQorYW5kIGNvbnRyb3ZlcnNpYWwgY2hhbmdlcywgZ28gb24gZm9yIHllYXJzLiAgTXVjaCBkZXZlbG9wZXIgZnJ1c3RyYXRpb24KK2NvbWVzIGZyb20gYSBsYWNrIG9mIHVuZGVyc3RhbmRpbmcgb2YgdGhpcyBwcm9jZXNzIG9yIGZyb20gYXR0ZW1wdHMgdG8KK2NpcmN1bXZlbnQgaXQuCisKK0luIHRoZSBob3BlcyBvZiByZWR1Y2luZyB0aGF0IGZydXN0cmF0aW9uLCB0aGlzIGRvY3VtZW50IHdpbGwgZGVzY3JpYmUgaG93CithIHBhdGNoIGdldHMgaW50byB0aGUga2VybmVsLiAgV2hhdCBmb2xsb3dzIGJlbG93IGlzIGFuIGludHJvZHVjdGlvbiB3aGljaAorZGVzY3JpYmVzIHRoZSBwcm9jZXNzIGluIGEgc29tZXdoYXQgaWRlYWxpemVkIHdheS4gIEEgbXVjaCBtb3JlIGRldGFpbGVkCit0cmVhdG1lbnQgd2lsbCBjb21lIGluIGxhdGVyIHNlY3Rpb25zLgorCitUaGUgc3RhZ2VzIHRoYXQgYSBwYXRjaCBnb2VzIHRocm91Z2ggYXJlLCBnZW5lcmFsbHk6CisKKyAtIERlc2lnbi4gIFRoaXMgaXMgd2hlcmUgdGhlIHJlYWwgcmVxdWlyZW1lbnRzIGZvciB0aGUgcGF0Y2ggLSBhbmQgdGhlIHdheQorICAgdGhvc2UgcmVxdWlyZW1lbnRzIHdpbGwgYmUgbWV0IC0gYXJlIGxhaWQgb3V0LiAgRGVzaWduIHdvcmsgaXMgb2Z0ZW4KKyAgIGRvbmUgd2l0aG91dCBpbnZvbHZpbmcgdGhlIGNvbW11bml0eSwgYnV0IGl0IGlzIGJldHRlciB0byBkbyB0aGlzIHdvcmsKKyAgIGluIHRoZSBvcGVuIGlmIGF0IGFsbCBwb3NzaWJsZTsgaXQgY2FuIHNhdmUgYSBsb3Qgb2YgdGltZSByZWRlc2lnbmluZworICAgdGhpbmdzIGxhdGVyLgorCisgLSBFYXJseSByZXZpZXcuICBQYXRjaGVzIGFyZSBwb3N0ZWQgdG8gdGhlIHJlbGV2YW50IG1haWxpbmcgbGlzdCwgYW5kCisgICBkZXZlbG9wZXJzIG9uIHRoYXQgbGlzdCByZXBseSB3aXRoIGFueSBjb21tZW50cyB0aGV5IG1heSBoYXZlLiAgVGhpcworICAgcHJvY2VzcyBzaG91bGQgdHVybiB1cCBhbnkgbWFqb3IgcHJvYmxlbXMgd2l0aCBhIHBhdGNoIGlmIGFsbCBnb2VzCisgICB3ZWxsLgorCisgLSBXaWRlciByZXZpZXcuICBXaGVuIHRoZSBwYXRjaCBpcyBnZXR0aW5nIGNsb3NlIHRvIHJlYWR5IGZvciBtYWlubGluZQorICAgaW5jbHVzaW9uLCBpdCBzaG91bGQgYmUgYWNjZXB0ZWQgYnkgYSByZWxldmFudCBzdWJzeXN0ZW0gbWFpbnRhaW5lciAtCisgICB0aG91Z2ggdGhpcyBhY2NlcHRhbmNlIGlzIG5vdCBhIGd1YXJhbnRlZSB0aGF0IHRoZSBwYXRjaCB3aWxsIG1ha2UgaXQKKyAgIGFsbCB0aGUgd2F5IHRvIHRoZSBtYWlubGluZS4gIFRoZSBwYXRjaCB3aWxsIHNob3cgdXAgaW4gdGhlIG1haW50YWluZXIncworICAgc3Vic3lzdGVtIHRyZWUgYW5kIGludG8gdGhlIC1uZXh0IHRyZWVzIChkZXNjcmliZWQgYmVsb3cpLiAgV2hlbiB0aGUKKyAgIHByb2Nlc3Mgd29ya3MsIHRoaXMgc3RlcCBsZWFkcyB0byBtb3JlIGV4dGVuc2l2ZSByZXZpZXcgb2YgdGhlIHBhdGNoIGFuZAorICAgdGhlIGRpc2NvdmVyeSBvZiBhbnkgcHJvYmxlbXMgcmVzdWx0aW5nIGZyb20gdGhlIGludGVncmF0aW9uIG9mIHRoaXMKKyAgIHBhdGNoIHdpdGggd29yayBiZWluZyBkb25lIGJ5IG90aGVycy4KKworLSAgUGxlYXNlIG5vdGUgdGhhdCBtb3N0IG1haW50YWluZXJzIGFsc28gaGF2ZSBkYXkgam9icywgc28gbWVyZ2luZworICAgeW91ciBwYXRjaCBtYXkgbm90IGJlIHRoZWlyIGhpZ2hlc3QgcHJpb3JpdHkuICBJZiB5b3VyIHBhdGNoIGlzCisgICBnZXR0aW5nIGZlZWRiYWNrIGFib3V0IGNoYW5nZXMgdGhhdCBhcmUgbmVlZGVkLCB5b3Ugc2hvdWxkIGVpdGhlcgorICAgbWFrZSB0aG9zZSBjaGFuZ2VzIG9yIGp1c3RpZnkgd2h5IHRoZXkgc2hvdWxkIG5vdCBiZSBtYWRlLiAgSWYgeW91cgorICAgcGF0Y2ggaGFzIG5vIHJldmlldyBjb21wbGFpbnRzIGJ1dCBpcyBub3QgYmVpbmcgbWVyZ2VkIGJ5IGl0cworICAgYXBwcm9wcmlhdGUgc3Vic3lzdGVtIG9yIGRyaXZlciBtYWludGFpbmVyLCB5b3Ugc2hvdWxkIGJlIHBlcnNpc3RlbnQKKyAgIGluIHVwZGF0aW5nIHRoZSBwYXRjaCB0byB0aGUgY3VycmVudCBrZXJuZWwgc28gdGhhdCBpdCBhcHBsaWVzIGNsZWFubHkKKyAgIGFuZCBrZWVwIHNlbmRpbmcgaXQgZm9yIHJldmlldyBhbmQgbWVyZ2luZy4KKworIC0gTWVyZ2luZyBpbnRvIHRoZSBtYWlubGluZS4gIEV2ZW50dWFsbHksIGEgc3VjY2Vzc2Z1bCBwYXRjaCB3aWxsIGJlCisgICBtZXJnZWQgaW50byB0aGUgbWFpbmxpbmUgcmVwb3NpdG9yeSBtYW5hZ2VkIGJ5IExpbnVzIFRvcnZhbGRzLiAgTW9yZQorICAgY29tbWVudHMgYW5kL29yIHByb2JsZW1zIG1heSBzdXJmYWNlIGF0IHRoaXMgdGltZTsgaXQgaXMgaW1wb3J0YW50IHRoYXQKKyAgIHRoZSBkZXZlbG9wZXIgYmUgcmVzcG9uc2l2ZSB0byB0aGVzZSBhbmQgZml4IGFueSBpc3N1ZXMgd2hpY2ggYXJpc2UuCisKKyAtIFN0YWJsZSByZWxlYXNlLiAgVGhlIG51bWJlciBvZiB1c2VycyBwb3RlbnRpYWxseSBhZmZlY3RlZCBieSB0aGUgcGF0Y2gKKyAgIGlzIG5vdyBsYXJnZSwgc28sIG9uY2UgYWdhaW4sIG5ldyBwcm9ibGVtcyBtYXkgYXJpc2UuCisKKyAtIExvbmctdGVybSBtYWludGVuYW5jZS4gIFdoaWxlIGl0IGlzIGNlcnRhaW5seSBwb3NzaWJsZSBmb3IgYSBkZXZlbG9wZXIKKyAgIHRvIGZvcmdldCBhYm91dCBjb2RlIGFmdGVyIG1lcmdpbmcgaXQsIHRoYXQgc29ydCBvZiBiZWhhdmlvciB0ZW5kcyB0bworICAgbGVhdmUgYSBwb29yIGltcHJlc3Npb24gaW4gdGhlIGRldmVsb3BtZW50IGNvbW11bml0eS4gIE1lcmdpbmcgY29kZQorICAgZWxpbWluYXRlcyBzb21lIG9mIHRoZSBtYWludGVuYW5jZSBidXJkZW4sIGluIHRoYXQgb3RoZXJzIHdpbGwgZml4CisgICBwcm9ibGVtcyBjYXVzZWQgYnkgQVBJIGNoYW5nZXMuICBCdXQgdGhlIG9yaWdpbmFsIGRldmVsb3BlciBzaG91bGQKKyAgIGNvbnRpbnVlIHRvIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBjb2RlIGlmIGl0IGlzIHRvIHJlbWFpbiB1c2VmdWwKKyAgIGluIHRoZSBsb25nZXIgdGVybS4KKworT25lIG9mIHRoZSBsYXJnZXN0IG1pc3Rha2VzIG1hZGUgYnkga2VybmVsIGRldmVsb3BlcnMgKG9yIHRoZWlyIGVtcGxveWVycykKK2lzIHRvIHRyeSB0byBjdXQgdGhlIHByb2Nlc3MgZG93biB0byBhIHNpbmdsZSAibWVyZ2luZyBpbnRvIHRoZSBtYWlubGluZSIKK3N0ZXAuICBUaGlzIGFwcHJvYWNoIGludmFyaWFibHkgbGVhZHMgdG8gZnJ1c3RyYXRpb24gZm9yIGV2ZXJ5Ym9keQoraW52b2x2ZWQuCisKK0hvdyBwYXRjaGVzIGdldCBpbnRvIHRoZSBLZXJuZWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgaXMgZXhhY3RseSBvbmUgcGVyc29uIHdobyBjYW4gbWVyZ2UgcGF0Y2hlcyBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwKK3JlcG9zaXRvcnk6IExpbnVzIFRvcnZhbGRzLiAgQnV0LCBvZiB0aGUgb3ZlciA5LDUwMCBwYXRjaGVzIHdoaWNoIHdlbnQKK2ludG8gdGhlIDIuNi4zOCBrZXJuZWwsIG9ubHkgMTEyIChhcm91bmQgMS4zJSkgd2VyZSBkaXJlY3RseSBjaG9zZW4gYnkgTGludXMKK2hpbXNlbGYuICBUaGUga2VybmVsIHByb2plY3QgaGFzIGxvbmcgc2luY2UgZ3Jvd24gdG8gYSBzaXplIHdoZXJlIG5vIHNpbmdsZQorZGV2ZWxvcGVyIGNvdWxkIHBvc3NpYmx5IGluc3BlY3QgYW5kIHNlbGVjdCBldmVyeSBwYXRjaCB1bmFzc2lzdGVkLiAgVGhlCit3YXkgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIGhhdmUgYWRkcmVzc2VkIHRoaXMgZ3Jvd3RoIGlzIHRocm91Z2ggdGhlIHVzZSBvZgorYSBsaWV1dGVuYW50IHN5c3RlbSBidWlsdCBhcm91bmQgYSBjaGFpbiBvZiB0cnVzdC4KKworVGhlIGtlcm5lbCBjb2RlIGJhc2UgaXMgbG9naWNhbGx5IGJyb2tlbiBkb3duIGludG8gYSBzZXQgb2Ygc3Vic3lzdGVtczoKK25ldHdvcmtpbmcsIHNwZWNpZmljIGFyY2hpdGVjdHVyZSBzdXBwb3J0LCBtZW1vcnkgbWFuYWdlbWVudCwgdmlkZW8KK2RldmljZXMsIGV0Yy4gIE1vc3Qgc3Vic3lzdGVtcyBoYXZlIGEgZGVzaWduYXRlZCBtYWludGFpbmVyLCBhIGRldmVsb3Blcgord2hvIGhhcyBvdmVyYWxsIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgY29kZSB3aXRoaW4gdGhhdCBzdWJzeXN0ZW0uICBUaGVzZQorc3Vic3lzdGVtIG1haW50YWluZXJzIGFyZSB0aGUgZ2F0ZWtlZXBlcnMgKGluIGEgbG9vc2Ugd2F5KSBmb3IgdGhlIHBvcnRpb24KK29mIHRoZSBrZXJuZWwgdGhleSBtYW5hZ2U7IHRoZXkgYXJlIHRoZSBvbmVzIHdobyB3aWxsICh1c3VhbGx5KSBhY2NlcHQgYQorcGF0Y2ggZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuCisKK1N1YnN5c3RlbSBtYWludGFpbmVycyBlYWNoIG1hbmFnZSB0aGVpciBvd24gdmVyc2lvbiBvZiB0aGUga2VybmVsIHNvdXJjZQordHJlZSwgdXN1YWxseSAoYnV0IGNlcnRhaW5seSBub3QgYWx3YXlzKSB1c2luZyB0aGUgZ2l0IHNvdXJjZSBtYW5hZ2VtZW50Cit0b29sLiAgVG9vbHMgbGlrZSBnaXQgKGFuZCByZWxhdGVkIHRvb2xzIGxpa2UgcXVpbHQgb3IgbWVyY3VyaWFsKSBhbGxvdworbWFpbnRhaW5lcnMgdG8gdHJhY2sgYSBsaXN0IG9mIHBhdGNoZXMsIGluY2x1ZGluZyBhdXRob3JzaGlwIGluZm9ybWF0aW9uCithbmQgb3RoZXIgbWV0YWRhdGEuICBBdCBhbnkgZ2l2ZW4gdGltZSwgdGhlIG1haW50YWluZXIgY2FuIGlkZW50aWZ5IHdoaWNoCitwYXRjaGVzIGluIGhpcyBvciBoZXIgcmVwb3NpdG9yeSBhcmUgbm90IGZvdW5kIGluIHRoZSBtYWlubGluZS4KKworV2hlbiB0aGUgbWVyZ2Ugd2luZG93IG9wZW5zLCB0b3AtbGV2ZWwgbWFpbnRhaW5lcnMgd2lsbCBhc2sgTGludXMgdG8gInB1bGwiCit0aGUgcGF0Y2hlcyB0aGV5IGhhdmUgc2VsZWN0ZWQgZm9yIG1lcmdpbmcgZnJvbSB0aGVpciByZXBvc2l0b3JpZXMuICBJZgorTGludXMgYWdyZWVzLCB0aGUgc3RyZWFtIG9mIHBhdGNoZXMgd2lsbCBmbG93IHVwIGludG8gaGlzIHJlcG9zaXRvcnksCitiZWNvbWluZyBwYXJ0IG9mIHRoZSBtYWlubGluZSBrZXJuZWwuICBUaGUgYW1vdW50IG9mIGF0dGVudGlvbiB0aGF0IExpbnVzCitwYXlzIHRvIHNwZWNpZmljIHBhdGNoZXMgcmVjZWl2ZWQgaW4gYSBwdWxsIG9wZXJhdGlvbiB2YXJpZXMuICBJdCBpcyBjbGVhcgordGhhdCwgc29tZXRpbWVzLCBoZSBsb29rcyBxdWl0ZSBjbG9zZWx5LiAgQnV0LCBhcyBhIGdlbmVyYWwgcnVsZSwgTGludXMKK3RydXN0cyB0aGUgc3Vic3lzdGVtIG1haW50YWluZXJzIHRvIG5vdCBzZW5kIGJhZCBwYXRjaGVzIHVwc3RyZWFtLgorCitTdWJzeXN0ZW0gbWFpbnRhaW5lcnMsIGluIHR1cm4sIGNhbiBwdWxsIHBhdGNoZXMgZnJvbSBvdGhlciBtYWludGFpbmVycy4KK0ZvciBleGFtcGxlLCB0aGUgbmV0d29ya2luZyB0cmVlIGlzIGJ1aWx0IGZyb20gcGF0Y2hlcyB3aGljaCBhY2N1bXVsYXRlZAorZmlyc3QgaW4gdHJlZXMgZGVkaWNhdGVkIHRvIG5ldHdvcmsgZGV2aWNlIGRyaXZlcnMsIHdpcmVsZXNzIG5ldHdvcmtpbmcsCitldGMuICBUaGlzIGNoYWluIG9mIHJlcG9zaXRvcmllcyBjYW4gYmUgYXJiaXRyYXJpbHkgbG9uZywgdGhvdWdoIGl0IHJhcmVseQorZXhjZWVkcyB0d28gb3IgdGhyZWUgbGlua3MuICBTaW5jZSBlYWNoIG1haW50YWluZXIgaW4gdGhlIGNoYWluIHRydXN0cwordGhvc2UgbWFuYWdpbmcgbG93ZXItbGV2ZWwgdHJlZXMsIHRoaXMgcHJvY2VzcyBpcyBrbm93biBhcyB0aGUgImNoYWluIG9mCit0cnVzdC4iCisKK0NsZWFybHksIGluIGEgc3lzdGVtIGxpa2UgdGhpcywgZ2V0dGluZyBwYXRjaGVzIGludG8gdGhlIGtlcm5lbCBkZXBlbmRzIG9uCitmaW5kaW5nIHRoZSByaWdodCBtYWludGFpbmVyLiAgU2VuZGluZyBwYXRjaGVzIGRpcmVjdGx5IHRvIExpbnVzIGlzIG5vdAorbm9ybWFsbHkgdGhlIHJpZ2h0IHdheSB0byBnby4KKworCitOZXh0IHRyZWVzCistLS0tLS0tLS0tCisKK1RoZSBjaGFpbiBvZiBzdWJzeXN0ZW0gdHJlZXMgZ3VpZGVzIHRoZSBmbG93IG9mIHBhdGNoZXMgaW50byB0aGUga2VybmVsLAorYnV0IGl0IGFsc28gcmFpc2VzIGFuIGludGVyZXN0aW5nIHF1ZXN0aW9uOiB3aGF0IGlmIHNvbWVib2R5IHdhbnRzIHRvIGxvb2sKK2F0IGFsbCBvZiB0aGUgcGF0Y2hlcyB3aGljaCBhcmUgYmVpbmcgcHJlcGFyZWQgZm9yIHRoZSBuZXh0IG1lcmdlIHdpbmRvdz8KK0RldmVsb3BlcnMgd2lsbCBiZSBpbnRlcmVzdGVkIGluIHdoYXQgb3RoZXIgY2hhbmdlcyBhcmUgcGVuZGluZyB0byBzZWUKK3doZXRoZXIgdGhlcmUgYXJlIGFueSBjb25mbGljdHMgdG8gd29ycnkgYWJvdXQ7IGEgcGF0Y2ggd2hpY2ggY2hhbmdlcyBhCitjb3JlIGtlcm5lbCBmdW5jdGlvbiBwcm90b3R5cGUsIGZvciBleGFtcGxlLCB3aWxsIGNvbmZsaWN0IHdpdGggYW55IG90aGVyCitwYXRjaGVzIHdoaWNoIHVzZSB0aGUgb2xkZXIgZm9ybSBvZiB0aGF0IGZ1bmN0aW9uLiAgUmV2aWV3ZXJzIGFuZCB0ZXN0ZXJzCit3YW50IGFjY2VzcyB0byB0aGUgY2hhbmdlcyBpbiB0aGVpciBpbnRlZ3JhdGVkIGZvcm0gYmVmb3JlIGFsbCBvZiB0aG9zZQorY2hhbmdlcyBsYW5kIGluIHRoZSBtYWlubGluZSBrZXJuZWwuICBPbmUgY291bGQgcHVsbCBjaGFuZ2VzIGZyb20gYWxsIG9mCit0aGUgaW50ZXJlc3Rpbmcgc3Vic3lzdGVtIHRyZWVzLCBidXQgdGhhdCB3b3VsZCBiZSBhIGJpZyBhbmQgZXJyb3ItcHJvbmUKK2pvYi4KKworVGhlIGFuc3dlciBjb21lcyBpbiB0aGUgZm9ybSBvZiAtbmV4dCB0cmVlcywgd2hlcmUgc3Vic3lzdGVtIHRyZWVzIGFyZQorY29sbGVjdGVkIGZvciB0ZXN0aW5nIGFuZCByZXZpZXcuICBUaGUgb2xkZXIgb2YgdGhlc2UgdHJlZXMsIG1haW50YWluZWQgYnkKK0FuZHJldyBNb3J0b24sIGlzIGNhbGxlZCAiLW1tIiAoZm9yIG1lbW9yeSBtYW5hZ2VtZW50LCB3aGljaCBpcyBob3cgaXQgZ290CitzdGFydGVkKS4gIFRoZSAtbW0gdHJlZSBpbnRlZ3JhdGVzIHBhdGNoZXMgZnJvbSBhIGxvbmcgbGlzdCBvZiBzdWJzeXN0ZW0KK3RyZWVzOyBpdCBhbHNvIGhhcyBzb21lIHBhdGNoZXMgYWltZWQgYXQgaGVscGluZyB3aXRoIGRlYnVnZ2luZy4KKworQmV5b25kIHRoYXQsIC1tbSBjb250YWlucyBhIHNpZ25pZmljYW50IGNvbGxlY3Rpb24gb2YgcGF0Y2hlcyB3aGljaCBoYXZlCitiZWVuIHNlbGVjdGVkIGJ5IEFuZHJldyBkaXJlY3RseS4gIFRoZXNlIHBhdGNoZXMgbWF5IGhhdmUgYmVlbiBwb3N0ZWQgb24gYQorbWFpbGluZyBsaXN0LCBvciB0aGV5IG1heSBhcHBseSB0byBhIHBhcnQgb2YgdGhlIGtlcm5lbCBmb3Igd2hpY2ggdGhlcmUgaXMKK25vIGRlc2lnbmF0ZWQgc3Vic3lzdGVtIHRyZWUuICBBcyBhIHJlc3VsdCwgLW1tIG9wZXJhdGVzIGFzIGEgc29ydCBvZgorc3Vic3lzdGVtIHRyZWUgb2YgbGFzdCByZXNvcnQ7IGlmIHRoZXJlIGlzIG5vIG90aGVyIG9idmlvdXMgcGF0aCBmb3IgYQorcGF0Y2ggaW50byB0aGUgbWFpbmxpbmUsIGl0IGlzIGxpa2VseSB0byBlbmQgdXAgaW4gLW1tLiAgTWlzY2VsbGFuZW91cworcGF0Y2hlcyB3aGljaCBhY2N1bXVsYXRlIGluIC1tbSB3aWxsIGV2ZW50dWFsbHkgZWl0aGVyIGJlIGZvcndhcmRlZCBvbiB0bworYW4gYXBwcm9wcmlhdGUgc3Vic3lzdGVtIHRyZWUgb3IgYmUgc2VudCBkaXJlY3RseSB0byBMaW51cy4gIEluIGEgdHlwaWNhbAorZGV2ZWxvcG1lbnQgY3ljbGUsIGFwcHJveGltYXRlbHkgNS0xMCUgb2YgdGhlIHBhdGNoZXMgZ29pbmcgaW50byB0aGUKK21haW5saW5lIGdldCB0aGVyZSB2aWEgLW1tLgorCitUaGUgY3VycmVudCAtbW0gcGF0Y2ggaXMgYXZhaWxhYmxlIGluIHRoZSAibW1vdG0iICgtbW0gb2YgdGhlIG1vbWVudCkKK2RpcmVjdG9yeSBhdDoKKworCWh0dHA6Ly93d3cub3psYWJzLm9yZy9+YWtwbS9tbW90bS8KKworVXNlIG9mIHRoZSBNTU9UTSB0cmVlIGlzIGxpa2VseSB0byBiZSBhIGZydXN0cmF0aW5nIGV4cGVyaWVuY2UsIHRob3VnaDsKK3RoZXJlIGlzIGEgZGVmaW5pdGUgY2hhbmNlIHRoYXQgaXQgd2lsbCBub3QgZXZlbiBjb21waWxlLgorCitUaGUgcHJpbWFyeSB0cmVlIGZvciBuZXh0LWN5Y2xlIHBhdGNoIG1lcmdpbmcgaXMgbGludXgtbmV4dCwgbWFpbnRhaW5lZCBieQorU3RlcGhlbiBSb3Rod2VsbC4gIFRoZSBsaW51eC1uZXh0IHRyZWUgaXMsIGJ5IGRlc2lnbiwgYSBzbmFwc2hvdCBvZiB3aGF0Cit0aGUgbWFpbmxpbmUgaXMgZXhwZWN0ZWQgdG8gbG9vayBsaWtlIGFmdGVyIHRoZSBuZXh0IG1lcmdlIHdpbmRvdyBjbG9zZXMuCitMaW51eC1uZXh0IHRyZWVzIGFyZSBhbm5vdW5jZWQgb24gdGhlIGxpbnV4LWtlcm5lbCBhbmQgbGludXgtbmV4dCBtYWlsaW5nCitsaXN0cyB3aGVuIHRoZXkgYXJlIGFzc2VtYmxlZDsgdGhleSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tOgorCisJaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvbmV4dC8KKworTGludXgtbmV4dCBoYXMgYmVjb21lIGFuIGludGVncmFsIHBhcnQgb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzOworYWxsIHBhdGNoZXMgbWVyZ2VkIGR1cmluZyBhIGdpdmVuIG1lcmdlIHdpbmRvdyBzaG91bGQgcmVhbGx5IGhhdmUgZm91bmQKK3RoZWlyIHdheSBpbnRvIGxpbnV4LW5leHQgc29tZSB0aW1lIGJlZm9yZSB0aGUgbWVyZ2Ugd2luZG93IG9wZW5zLgorCisKK1N0YWdpbmcgdHJlZXMKKy0tLS0tLS0tLS0tLS0KKworVGhlIGtlcm5lbCBzb3VyY2UgdHJlZSBjb250YWlucyB0aGUgZHJpdmVycy9zdGFnaW5nLyBkaXJlY3RvcnksIHdoZXJlCittYW55IHN1Yi1kaXJlY3RvcmllcyBmb3IgZHJpdmVycyBvciBmaWxlc3lzdGVtcyB0aGF0IGFyZSBvbiB0aGVpciB3YXkgdG8KK2JlaW5nIGFkZGVkIHRvIHRoZSBrZXJuZWwgdHJlZSBsaXZlLiAgVGhleSByZW1haW4gaW4gZHJpdmVycy9zdGFnaW5nIHdoaWxlCit0aGV5IHN0aWxsIG5lZWQgbW9yZSB3b3JrOyBvbmNlIGNvbXBsZXRlLCB0aGV5IGNhbiBiZSBtb3ZlZCBpbnRvIHRoZQora2VybmVsIHByb3Blci4gIFRoaXMgaXMgYSB3YXkgdG8ga2VlcCB0cmFjayBvZiBkcml2ZXJzIHRoYXQgYXJlbid0Cit1cCB0byBMaW51eCBrZXJuZWwgY29kaW5nIG9yIHF1YWxpdHkgc3RhbmRhcmRzLCBidXQgcGVvcGxlIG1heSB3YW50IHRvIHVzZQordGhlbSBhbmQgdHJhY2sgZGV2ZWxvcG1lbnQuCisKK0dyZWcgS3JvYWgtSGFydG1hbiBjdXJyZW50bHkgbWFpbnRhaW5zIHRoZSBzdGFnaW5nIHRyZWUuICBEcml2ZXJzIHRoYXQKK3N0aWxsIG5lZWQgd29yayBhcmUgc2VudCB0byBoaW0sIHdpdGggZWFjaCBkcml2ZXIgaGF2aW5nIGl0cyBvd24KK3N1YmRpcmVjdG9yeSBpbiBkcml2ZXJzL3N0YWdpbmcvLiAgQWxvbmcgd2l0aCB0aGUgZHJpdmVyIHNvdXJjZSBmaWxlcywgYQorVE9ETyBmaWxlIHNob3VsZCBiZSBwcmVzZW50IGluIHRoZSBkaXJlY3RvcnkgYXMgd2VsbC4gIFRoZSBUT0RPIGZpbGUgbGlzdHMKK3RoZSBwZW5kaW5nIHdvcmsgdGhhdCB0aGUgZHJpdmVyIG5lZWRzIGZvciBhY2NlcHRhbmNlIGludG8gdGhlIGtlcm5lbAorcHJvcGVyLCBhcyB3ZWxsIGFzIGEgbGlzdCBvZiBwZW9wbGUgdGhhdCBzaG91bGQgYmUgQ2MnZCBmb3IgYW55IHBhdGNoZXMgdG8KK3RoZSBkcml2ZXIuICBDdXJyZW50IHJ1bGVzIHJlcXVpcmUgdGhhdCBkcml2ZXJzIGNvbnRyaWJ1dGVkIHRvIHN0YWdpbmcKK211c3QsIGF0IGEgbWluaW11bSwgY29tcGlsZSBwcm9wZXJseS4KKworU3RhZ2luZyBjYW4gYmUgYSByZWxhdGl2ZWx5IGVhc3kgd2F5IHRvIGdldCBuZXcgZHJpdmVycyBpbnRvIHRoZSBtYWlubGluZQord2hlcmUsIHdpdGggbHVjaywgdGhleSB3aWxsIGNvbWUgdG8gdGhlIGF0dGVudGlvbiBvZiBvdGhlciBkZXZlbG9wZXJzIGFuZAoraW1wcm92ZSBxdWlja2x5LiAgRW50cnkgaW50byBzdGFnaW5nIGlzIG5vdCB0aGUgZW5kIG9mIHRoZSBzdG9yeSwgdGhvdWdoOworY29kZSBpbiBzdGFnaW5nIHdoaWNoIGlzIG5vdCBzZWVpbmcgcmVndWxhciBwcm9ncmVzcyB3aWxsIGV2ZW50dWFsbHkgYmUKK3JlbW92ZWQuICBEaXN0cmlidXRvcnMgYWxzbyB0ZW5kIHRvIGJlIHJlbGF0aXZlbHkgcmVsdWN0YW50IHRvIGVuYWJsZQorc3RhZ2luZyBkcml2ZXJzLiAgU28gc3RhZ2luZyBpcywgYXQgYmVzdCwgYSBzdG9wIG9uIHRoZSB3YXkgdG93YXJkIGJlY29taW5nCithIHByb3BlciBtYWlubGluZSBkcml2ZXIuCisKKworVG9vbHMKKy0tLS0tCisKK0FzIGNhbiBiZSBzZWVuIGZyb20gdGhlIGFib3ZlIHRleHQsIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBkZXBlbmRzCitoZWF2aWx5IG9uIHRoZSBhYmlsaXR5IHRvIGhlcmQgY29sbGVjdGlvbnMgb2YgcGF0Y2hlcyBpbiB2YXJpb3VzCitkaXJlY3Rpb25zLiAgVGhlIHdob2xlIHRoaW5nIHdvdWxkIG5vdCB3b3JrIGFueXdoZXJlIG5lYXIgYXMgd2VsbCBhcyBpdAorZG9lcyB3aXRob3V0IHN1aXRhYmx5IHBvd2VyZnVsIHRvb2xzLiAgVHV0b3JpYWxzIG9uIGhvdyB0byB1c2UgdGhlc2UgdG9vbHMKK2FyZSB3ZWxsIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudCwgYnV0IHRoZXJlIGlzIHNwYWNlIGZvciBhIGZldworcG9pbnRlcnMuCisKK0J5IGZhciB0aGUgZG9taW5hbnQgc291cmNlIGNvZGUgbWFuYWdlbWVudCBzeXN0ZW0gdXNlZCBieSB0aGUga2VybmVsCitjb21tdW5pdHkgaXMgZ2l0LiAgR2l0IGlzIG9uZSBvZiBhIG51bWJlciBvZiBkaXN0cmlidXRlZCB2ZXJzaW9uIGNvbnRyb2wKK3N5c3RlbXMgYmVpbmcgZGV2ZWxvcGVkIGluIHRoZSBmcmVlIHNvZnR3YXJlIGNvbW11bml0eS4gIEl0IGlzIHdlbGwgdHVuZWQKK2ZvciBrZXJuZWwgZGV2ZWxvcG1lbnQsIGluIHRoYXQgaXQgcGVyZm9ybXMgcXVpdGUgd2VsbCB3aGVuIGRlYWxpbmcgd2l0aAorbGFyZ2UgcmVwb3NpdG9yaWVzIGFuZCBsYXJnZSBudW1iZXJzIG9mIHBhdGNoZXMuICBJdCBhbHNvIGhhcyBhIHJlcHV0YXRpb24KK2ZvciBiZWluZyBkaWZmaWN1bHQgdG8gbGVhcm4gYW5kIHVzZSwgdGhvdWdoIGl0IGhhcyBnb3R0ZW4gYmV0dGVyIG92ZXIKK3RpbWUuICBTb21lIHNvcnQgb2YgZmFtaWxpYXJpdHkgd2l0aCBnaXQgaXMgYWxtb3N0IGEgcmVxdWlyZW1lbnQgZm9yIGtlcm5lbAorZGV2ZWxvcGVyczsgZXZlbiBpZiB0aGV5IGRvIG5vdCB1c2UgaXQgZm9yIHRoZWlyIG93biB3b3JrLCB0aGV5J2xsIG5lZWQgZ2l0Cit0byBrZWVwIHVwIHdpdGggd2hhdCBvdGhlciBkZXZlbG9wZXJzIChhbmQgdGhlIG1haW5saW5lKSBhcmUgZG9pbmcuCisKK0dpdCBpcyBub3cgcGFja2FnZWQgYnkgYWxtb3N0IGFsbCBMaW51eCBkaXN0cmlidXRpb25zLiAgVGhlcmUgaXMgYSBob21lCitwYWdlIGF0OgorCisJaHR0cDovL2dpdC1zY20uY29tLworCitUaGF0IHBhZ2UgaGFzIHBvaW50ZXJzIHRvIGRvY3VtZW50YXRpb24gYW5kIHR1dG9yaWFscy4KKworQW1vbmcgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIHdobyBkbyBub3QgdXNlIGdpdCwgdGhlIG1vc3QgcG9wdWxhciBjaG9pY2UgaXMKK2FsbW9zdCBjZXJ0YWlubHkgTWVyY3VyaWFsOgorCisJaHR0cDovL3d3dy5zZWxlbmljLmNvbS9tZXJjdXJpYWwvCisKK01lcmN1cmlhbCBzaGFyZXMgbWFueSBmZWF0dXJlcyB3aXRoIGdpdCwgYnV0IGl0IHByb3ZpZGVzIGFuIGludGVyZmFjZSB3aGljaAorbWFueSBmaW5kIGVhc2llciB0byB1c2UuCisKK1RoZSBvdGhlciB0b29sIHdvcnRoIGtub3dpbmcgYWJvdXQgaXMgUXVpbHQ6CisKKwlodHRwOi8vc2F2YW5uYWgubm9uZ251Lm9yZy9wcm9qZWN0cy9xdWlsdC8KKworUXVpbHQgaXMgYSBwYXRjaCBtYW5hZ2VtZW50IHN5c3RlbSwgcmF0aGVyIHRoYW4gYSBzb3VyY2UgY29kZSBtYW5hZ2VtZW50CitzeXN0ZW0uICBJdCBkb2VzIG5vdCB0cmFjayBoaXN0b3J5IG92ZXIgdGltZTsgaXQgaXMsIGluc3RlYWQsIG9yaWVudGVkCit0b3dhcmQgdHJhY2tpbmcgYSBzcGVjaWZpYyBzZXQgb2YgY2hhbmdlcyBhZ2FpbnN0IGFuIGV2b2x2aW5nIGNvZGUgYmFzZS4KK1NvbWUgbWFqb3Igc3Vic3lzdGVtIG1haW50YWluZXJzIHVzZSBxdWlsdCB0byBtYW5hZ2UgcGF0Y2hlcyBpbnRlbmRlZCB0byBnbwordXBzdHJlYW0uICBGb3IgdGhlIG1hbmFnZW1lbnQgb2YgY2VydGFpbiBraW5kcyBvZiB0cmVlcyAoLW1tLCBmb3IgZXhhbXBsZSksCitxdWlsdCBpcyB0aGUgYmVzdCB0b29sIGZvciB0aGUgam9iLgorCisKK01haWxpbmcgbGlzdHMKKy0tLS0tLS0tLS0tLS0KKworQSBncmVhdCBkZWFsIG9mIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCB3b3JrIGlzIGRvbmUgYnkgd2F5IG9mIG1haWxpbmcKK2xpc3RzLiAgSXQgaXMgaGFyZCB0byBiZSBhIGZ1bGx5LWZ1bmN0aW9uaW5nIG1lbWJlciBvZiB0aGUgY29tbXVuaXR5Cit3aXRob3V0IGpvaW5pbmcgYXQgbGVhc3Qgb25lIGxpc3Qgc29tZXdoZXJlLiAgQnV0IExpbnV4IG1haWxpbmcgbGlzdHMgYWxzbworcmVwcmVzZW50IGEgcG90ZW50aWFsIGhhemFyZCB0byBkZXZlbG9wZXJzLCB3aG8gcmlzayBnZXR0aW5nIGJ1cmllZCB1bmRlciBhCitsb2FkIG9mIGVsZWN0cm9uaWMgbWFpbCwgcnVubmluZyBhZm91bCBvZiB0aGUgY29udmVudGlvbnMgdXNlZCBvbiB0aGUgTGludXgKK2xpc3RzLCBvciBib3RoLgorCitNb3N0IGtlcm5lbCBtYWlsaW5nIGxpc3RzIGFyZSBydW4gb24gdmdlci5rZXJuZWwub3JnOyB0aGUgbWFzdGVyIGxpc3QgY2FuCitiZSBmb3VuZCBhdDoKKworCWh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvdmdlci1saXN0cy5odG1sCisKK1RoZXJlIGFyZSBsaXN0cyBob3N0ZWQgZWxzZXdoZXJlLCB0aG91Z2g7IGEgbnVtYmVyIG9mIHRoZW0gYXJlIGF0CitsaXN0cy5yZWRoYXQuY29tLgorCitUaGUgY29yZSBtYWlsaW5nIGxpc3QgZm9yIGtlcm5lbCBkZXZlbG9wbWVudCBpcywgb2YgY291cnNlLCBsaW51eC1rZXJuZWwuCitUaGlzIGxpc3QgaXMgYW4gaW50aW1pZGF0aW5nIHBsYWNlIHRvIGJlOyB2b2x1bWUgY2FuIHJlYWNoIDUwMCBtZXNzYWdlcyBwZXIKK2RheSwgdGhlIGFtb3VudCBvZiBub2lzZSBpcyBoaWdoLCB0aGUgY29udmVyc2F0aW9uIGNhbiBiZSBzZXZlcmVseQordGVjaG5pY2FsLCBhbmQgcGFydGljaXBhbnRzIGFyZSBub3QgYWx3YXlzIGNvbmNlcm5lZCB3aXRoIHNob3dpbmcgYSBoaWdoCitkZWdyZWUgb2YgcG9saXRlbmVzcy4gIEJ1dCB0aGVyZSBpcyBubyBvdGhlciBwbGFjZSB3aGVyZSB0aGUga2VybmVsCitkZXZlbG9wbWVudCBjb21tdW5pdHkgY29tZXMgdG9nZXRoZXIgYXMgYSB3aG9sZTsgZGV2ZWxvcGVycyB3aG8gYXZvaWQgdGhpcworbGlzdCB3aWxsIG1pc3MgaW1wb3J0YW50IGluZm9ybWF0aW9uLgorCitUaGVyZSBhcmUgYSBmZXcgaGludHMgd2hpY2ggY2FuIGhlbHAgd2l0aCBsaW51eC1rZXJuZWwgc3Vydml2YWw6CisKKy0gSGF2ZSB0aGUgbGlzdCBkZWxpdmVyZWQgdG8gYSBzZXBhcmF0ZSBmb2xkZXIsIHJhdGhlciB0aGFuIHlvdXIgbWFpbgorICBtYWlsYm94LiAgT25lIG11c3QgYmUgYWJsZSB0byBpZ25vcmUgdGhlIHN0cmVhbSBmb3Igc3VzdGFpbmVkIHBlcmlvZHMgb2YKKyAgdGltZS4KKworLSBEbyBub3QgdHJ5IHRvIGZvbGxvdyBldmVyeSBjb252ZXJzYXRpb24gLSBub2JvZHkgZWxzZSBkb2VzLiAgSXQgaXMKKyAgaW1wb3J0YW50IHRvIGZpbHRlciBvbiBib3RoIHRoZSB0b3BpYyBvZiBpbnRlcmVzdCAodGhvdWdoIG5vdGUgdGhhdAorICBsb25nLXJ1bm5pbmcgY29udmVyc2F0aW9ucyBjYW4gZHJpZnQgYXdheSBmcm9tIHRoZSBvcmlnaW5hbCBzdWJqZWN0CisgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGVtYWlsIHN1YmplY3QgbGluZSkgYW5kIHRoZSBwZW9wbGUgd2hvIGFyZQorICBwYXJ0aWNpcGF0aW5nLgorCistIERvIG5vdCBmZWVkIHRoZSB0cm9sbHMuICBJZiBzb21lYm9keSBpcyB0cnlpbmcgdG8gc3RpciB1cCBhbiBhbmdyeQorICByZXNwb25zZSwgaWdub3JlIHRoZW0uCisKKy0gV2hlbiByZXNwb25kaW5nIHRvIGxpbnV4LWtlcm5lbCBlbWFpbCAob3IgdGhhdCBvbiBvdGhlciBsaXN0cykgcHJlc2VydmUKKyAgdGhlIENjOiBoZWFkZXIgZm9yIGFsbCBpbnZvbHZlZC4gIEluIHRoZSBhYnNlbmNlIG9mIGEgc3Ryb25nIHJlYXNvbiAoc3VjaAorICBhcyBhbiBleHBsaWNpdCByZXF1ZXN0KSwgeW91IHNob3VsZCBuZXZlciByZW1vdmUgcmVjaXBpZW50cy4gIEFsd2F5cyBtYWtlCisgIHN1cmUgdGhhdCB0aGUgcGVyc29uIHlvdSBhcmUgcmVzcG9uZGluZyB0byBpcyBpbiB0aGUgQ2M6IGxpc3QuICBUaGlzCisgIGNvbnZlbnRpb24gYWxzbyBtYWtlcyBpdCB1bm5lY2Vzc2FyeSB0byBleHBsaWNpdGx5IGFzayB0byBiZSBjb3BpZWQgb24KKyAgcmVwbGllcyB0byB5b3VyIHBvc3RpbmdzLgorCistIFNlYXJjaCB0aGUgbGlzdCBhcmNoaXZlcyAoYW5kIHRoZSBuZXQgYXMgYSB3aG9sZSkgYmVmb3JlIGFza2luZworICBxdWVzdGlvbnMuICBTb21lIGRldmVsb3BlcnMgY2FuIGdldCBpbXBhdGllbnQgd2l0aCBwZW9wbGUgd2hvIGNsZWFybHkKKyAgaGF2ZSBub3QgZG9uZSB0aGVpciBob21ld29yay4KKworLSBBdm9pZCB0b3AtcG9zdGluZyAodGhlIHByYWN0aWNlIG9mIHB1dHRpbmcgeW91ciBhbnN3ZXIgYWJvdmUgdGhlIHF1b3RlZAorICB0ZXh0IHlvdSBhcmUgcmVzcG9uZGluZyB0bykuICBJdCBtYWtlcyB5b3VyIHJlc3BvbnNlIGhhcmRlciB0byByZWFkIGFuZAorICBtYWtlcyBhIHBvb3IgaW1wcmVzc2lvbi4KKworLSBBc2sgb24gdGhlIGNvcnJlY3QgbWFpbGluZyBsaXN0LiAgTGludXgta2VybmVsIG1heSBiZSB0aGUgZ2VuZXJhbCBtZWV0aW5nCisgIHBvaW50LCBidXQgaXQgaXMgbm90IHRoZSBiZXN0IHBsYWNlIHRvIGZpbmQgZGV2ZWxvcGVycyBmcm9tIGFsbAorICBzdWJzeXN0ZW1zLgorCitUaGUgbGFzdCBwb2ludCAtIGZpbmRpbmcgdGhlIGNvcnJlY3QgbWFpbGluZyBsaXN0IC0gaXMgYSBjb21tb24gcGxhY2UgZm9yCitiZWdpbm5pbmcgZGV2ZWxvcGVycyB0byBnbyB3cm9uZy4gIFNvbWVib2R5IHdobyBhc2tzIGEgbmV0d29ya2luZy1yZWxhdGVkCitxdWVzdGlvbiBvbiBsaW51eC1rZXJuZWwgd2lsbCBhbG1vc3QgY2VydGFpbmx5IHJlY2VpdmUgYSBwb2xpdGUgc3VnZ2VzdGlvbgordG8gYXNrIG9uIHRoZSBuZXRkZXYgbGlzdCBpbnN0ZWFkLCBhcyB0aGF0IGlzIHRoZSBsaXN0IGZyZXF1ZW50ZWQgYnkgbW9zdAorbmV0d29ya2luZyBkZXZlbG9wZXJzLiAgT3RoZXIgbGlzdHMgZXhpc3QgZm9yIHRoZSBTQ1NJLCB2aWRlbzRsaW51eCwgSURFLAorZmlsZXN5c3RlbSwgZXRjLiBzdWJzeXN0ZW1zLiAgVGhlIGJlc3QgcGxhY2UgdG8gbG9vayBmb3IgbWFpbGluZyBsaXN0cyBpcworaW4gdGhlIE1BSU5UQUlORVJTIGZpbGUgcGFja2FnZWQgd2l0aCB0aGUga2VybmVsIHNvdXJjZS4KKworCitHZXR0aW5nIHN0YXJ0ZWQgd2l0aCBLZXJuZWwgZGV2ZWxvcG1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitRdWVzdGlvbnMgYWJvdXQgaG93IHRvIGdldCBzdGFydGVkIHdpdGggdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIGFyZQorY29tbW9uIC0gZnJvbSBib3RoIGluZGl2aWR1YWxzIGFuZCBjb21wYW5pZXMuICBFcXVhbGx5IGNvbW1vbiBhcmUgbWlzc3RlcHMKK3doaWNoIG1ha2UgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVsYXRpb25zaGlwIGhhcmRlciB0aGFuIGl0IGhhcyB0byBiZS4KKworQ29tcGFuaWVzIG9mdGVuIGxvb2sgdG8gaGlyZSB3ZWxsLWtub3duIGRldmVsb3BlcnMgdG8gZ2V0IGEgZGV2ZWxvcG1lbnQKK2dyb3VwIHN0YXJ0ZWQuICBUaGlzIGNhbiwgaW4gZmFjdCwgYmUgYW4gZWZmZWN0aXZlIHRlY2huaXF1ZS4gIEJ1dCBpdCBhbHNvCit0ZW5kcyB0byBiZSBleHBlbnNpdmUgYW5kIGRvZXMgbm90IGRvIG11Y2ggdG8gZ3JvdyB0aGUgcG9vbCBvZiBleHBlcmllbmNlZAora2VybmVsIGRldmVsb3BlcnMuICBJdCBpcyBwb3NzaWJsZSB0byBicmluZyBpbi1ob3VzZSBkZXZlbG9wZXJzIHVwIHRvIHNwZWVkCitvbiBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQsIGdpdmVuIHRoZSBpbnZlc3RtZW50IG9mIGEgYml0IG9mIHRpbWUuICBUYWtpbmcKK3RoaXMgdGltZSBjYW4gZW5kb3cgYW4gZW1wbG95ZXIgd2l0aCBhIGdyb3VwIG9mIGRldmVsb3BlcnMgd2hvIHVuZGVyc3RhbmQKK3RoZSBrZXJuZWwgYW5kIHRoZSBjb21wYW55IGJvdGgsIGFuZCB3aG8gY2FuIGhlbHAgdG8gdHJhaW4gb3RoZXJzIGFzIHdlbGwuCitPdmVyIHRoZSBtZWRpdW0gdGVybSwgdGhpcyBpcyBvZnRlbiB0aGUgbW9yZSBwcm9maXRhYmxlIGFwcHJvYWNoLgorCitJbmRpdmlkdWFsIGRldmVsb3BlcnMgYXJlIG9mdGVuLCB1bmRlcnN0YW5kYWJseSwgYXQgYSBsb3NzIGZvciBhIHBsYWNlIHRvCitzdGFydC4gIEJlZ2lubmluZyB3aXRoIGEgbGFyZ2UgcHJvamVjdCBjYW4gYmUgaW50aW1pZGF0aW5nOyBvbmUgb2Z0ZW4gd2FudHMKK3RvIHRlc3QgdGhlIHdhdGVycyB3aXRoIHNvbWV0aGluZyBzbWFsbGVyIGZpcnN0LiAgVGhpcyBpcyB0aGUgcG9pbnQgd2hlcmUKK3NvbWUgZGV2ZWxvcGVycyBqdW1wIGludG8gdGhlIGNyZWF0aW9uIG9mIHBhdGNoZXMgZml4aW5nIHNwZWxsaW5nIGVycm9ycyBvcgorbWlub3IgY29kaW5nIHN0eWxlIGlzc3Vlcy4gIFVuZm9ydHVuYXRlbHksIHN1Y2ggcGF0Y2hlcyBjcmVhdGUgYSBsZXZlbCBvZgorbm9pc2Ugd2hpY2ggaXMgZGlzdHJhY3RpbmcgZm9yIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYXMgYSB3aG9sZSwgc28sCitpbmNyZWFzaW5nbHksIHRoZXkgYXJlIGxvb2tlZCBkb3duIHVwb24uICBOZXcgZGV2ZWxvcGVycyB3aXNoaW5nIHRvCitpbnRyb2R1Y2UgdGhlbXNlbHZlcyB0byB0aGUgY29tbXVuaXR5IHdpbGwgbm90IGdldCB0aGUgc29ydCBvZiByZWNlcHRpb24KK3RoZXkgd2lzaCBmb3IgYnkgdGhlc2UgbWVhbnMuCisKK0FuZHJldyBNb3J0b24gZ2l2ZXMgdGhpcyBhZHZpY2UgZm9yIGFzcGlyaW5nIGtlcm5lbCBkZXZlbG9wZXJzCisKKzo6CisKKwlUaGUgIzEgcHJvamVjdCBmb3IgYWxsIGtlcm5lbCBiZWdpbm5lcnMgc2hvdWxkIHN1cmVseSBiZSAibWFrZSBzdXJlCisJdGhhdCB0aGUga2VybmVsIHJ1bnMgcGVyZmVjdGx5IGF0IGFsbCB0aW1lcyBvbiBhbGwgbWFjaGluZXMgd2hpY2gKKwl5b3UgY2FuIGxheSB5b3VyIGhhbmRzIG9uIi4gIFVzdWFsbHkgdGhlIHdheSB0byBkbyB0aGlzIGlzIHRvIHdvcmsKKwl3aXRoIG90aGVycyBvbiBnZXR0aW5nIHRoaW5ncyBmaXhlZCB1cCAodGhpcyBjYW4gcmVxdWlyZQorCXBlcnNpc3RlbmNlISkgYnV0IHRoYXQncyBmaW5lIC0gaXQncyBhIHBhcnQgb2Yga2VybmVsIGRldmVsb3BtZW50LgorCisoaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjgzOTgyLykuCisKK0luIHRoZSBhYnNlbmNlIG9mIG9idmlvdXMgcHJvYmxlbXMgdG8gZml4LCBkZXZlbG9wZXJzIGFyZSBhZHZpc2VkIHRvIGxvb2sKK2F0IHRoZSBjdXJyZW50IGxpc3RzIG9mIHJlZ3Jlc3Npb25zIGFuZCBvcGVuIGJ1Z3MgaW4gZ2VuZXJhbC4gIFRoZXJlIGlzCituZXZlciBhbnkgc2hvcnRhZ2Ugb2YgaXNzdWVzIGluIG5lZWQgb2YgZml4aW5nOyBieSBhZGRyZXNzaW5nIHRoZXNlIGlzc3VlcywKK2RldmVsb3BlcnMgd2lsbCBnYWluIGV4cGVyaWVuY2Ugd2l0aCB0aGUgcHJvY2VzcyB3aGlsZSwgYXQgdGhlIHNhbWUgdGltZSwKK2J1aWxkaW5nIHJlc3BlY3Qgd2l0aCB0aGUgcmVzdCBvZiB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzMuRWFybHktc3RhZ2UgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMy5FYXJseS1zdGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3YmE3Yi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMy5FYXJseS1zdGFnZQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0zOiBFQVJMWS1TVEFHRSBQTEFOTklORwotCi1XaGVuIGNvbnRlbXBsYXRpbmcgYSBMaW51eCBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCwgaXQgY2FuIGJlIHRlbXB0aW5nCi10byBqdW1wIHJpZ2h0IGluIGFuZCBzdGFydCBjb2RpbmcuICBBcyB3aXRoIGFueSBzaWduaWZpY2FudCBwcm9qZWN0LAotdGhvdWdoLCBtdWNoIG9mIHRoZSBncm91bmR3b3JrIGZvciBzdWNjZXNzIGlzIGJlc3QgbGFpZCBiZWZvcmUgdGhlIGZpcnN0Ci1saW5lIG9mIGNvZGUgaXMgd3JpdHRlbi4gIFNvbWUgdGltZSBzcGVudCBpbiBlYXJseSBwbGFubmluZyBhbmQKLWNvbW11bmljYXRpb24gY2FuIHNhdmUgZmFyIG1vcmUgdGltZSBsYXRlciBvbi4KLQotCi0zLjE6IFNQRUNJRllJTkcgVEhFIFBST0JMRU0KLQotTGlrZSBhbnkgZW5naW5lZXJpbmcgcHJvamVjdCwgYSBzdWNjZXNzZnVsIGtlcm5lbCBlbmhhbmNlbWVudCBzdGFydHMgd2l0aCBhCi1jbGVhciBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbSB0byBiZSBzb2x2ZWQuICBJbiBzb21lIGNhc2VzLCB0aGlzIHN0ZXAgaXMKLWVhc3k6IHdoZW4gYSBkcml2ZXIgaXMgbmVlZGVkIGZvciBhIHNwZWNpZmljIHBpZWNlIG9mIGhhcmR3YXJlLCBmb3IKLWV4YW1wbGUuICBJbiBvdGhlcnMsIHRob3VnaCwgaXQgaXMgdGVtcHRpbmcgdG8gY29uZnVzZSB0aGUgcmVhbCBwcm9ibGVtCi13aXRoIHRoZSBwcm9wb3NlZCBzb2x1dGlvbiwgYW5kIHRoYXQgY2FuIGxlYWQgdG8gZGlmZmljdWx0aWVzLgotCi1Db25zaWRlciBhbiBleGFtcGxlOiBzb21lIHllYXJzIGFnbywgZGV2ZWxvcGVycyB3b3JraW5nIHdpdGggTGludXggYXVkaW8KLXNvdWdodCBhIHdheSB0byBydW4gYXBwbGljYXRpb25zIHdpdGhvdXQgZHJvcG91dHMgb3Igb3RoZXIgYXJ0aWZhY3RzIGNhdXNlZAotYnkgZXhjZXNzaXZlIGxhdGVuY3kgaW4gdGhlIHN5c3RlbS4gIFRoZSBzb2x1dGlvbiB0aGV5IGFycml2ZWQgYXQgd2FzIGEKLWtlcm5lbCBtb2R1bGUgaW50ZW5kZWQgdG8gaG9vayBpbnRvIHRoZSBMaW51eCBTZWN1cml0eSBNb2R1bGUgKExTTSkKLWZyYW1ld29yazsgdGhpcyBtb2R1bGUgY291bGQgYmUgY29uZmlndXJlZCB0byBnaXZlIHNwZWNpZmljIGFwcGxpY2F0aW9ucwotYWNjZXNzIHRvIHRoZSByZWFsdGltZSBzY2hlZHVsZXIuICBUaGlzIG1vZHVsZSB3YXMgaW1wbGVtZW50ZWQgYW5kIHNlbnQgdG8KLXRoZSBsaW51eC1rZXJuZWwgbWFpbGluZyBsaXN0LCB3aGVyZSBpdCBpbW1lZGlhdGVseSByYW4gaW50byBwcm9ibGVtcy4KLQotVG8gdGhlIGF1ZGlvIGRldmVsb3BlcnMsIHRoaXMgc2VjdXJpdHkgbW9kdWxlIHdhcyBzdWZmaWNpZW50IHRvIHNvbHZlIHRoZWlyCi1pbW1lZGlhdGUgcHJvYmxlbS4gIFRvIHRoZSB3aWRlciBrZXJuZWwgY29tbXVuaXR5LCB0aG91Z2gsIGl0IHdhcyBzZWVuIGFzIGEKLW1pc3VzZSBvZiB0aGUgTFNNIGZyYW1ld29yayAod2hpY2ggaXMgbm90IGludGVuZGVkIHRvIGNvbmZlciBwcml2aWxlZ2VzCi1vbnRvIHByb2Nlc3NlcyB3aGljaCB0aGV5IHdvdWxkIG5vdCBvdGhlcndpc2UgaGF2ZSkgYW5kIGEgcmlzayB0byBzeXN0ZW0KLXN0YWJpbGl0eS4gIFRoZWlyIHByZWZlcnJlZCBzb2x1dGlvbnMgaW52b2x2ZWQgcmVhbHRpbWUgc2NoZWR1bGluZyBhY2Nlc3MKLXZpYSB0aGUgcmxpbWl0IG1lY2hhbmlzbSBmb3IgdGhlIHNob3J0IHRlcm0sIGFuZCBvbmdvaW5nIGxhdGVuY3kgcmVkdWN0aW9uCi13b3JrIGluIHRoZSBsb25nIHRlcm0uCi0KLVRoZSBhdWRpbyBjb21tdW5pdHksIGhvd2V2ZXIsIGNvdWxkIG5vdCBzZWUgcGFzdCB0aGUgcGFydGljdWxhciBzb2x1dGlvbgotdGhleSBoYWQgaW1wbGVtZW50ZWQ7IHRoZXkgd2VyZSB1bndpbGxpbmcgdG8gYWNjZXB0IGFsdGVybmF0aXZlcy4gIFRoZQotcmVzdWx0aW5nIGRpc2FncmVlbWVudCBsZWZ0IHRob3NlIGRldmVsb3BlcnMgZmVlbGluZyBkaXNpbGx1c2lvbmVkIHdpdGggdGhlCi1lbnRpcmUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3M7IG9uZSBvZiB0aGVtIHdlbnQgYmFjayB0byBhbiBhdWRpbyBsaXN0Ci1hbmQgcG9zdGVkIHRoaXM6Ci0KLQlUaGVyZSBhcmUgYSBudW1iZXIgb2YgdmVyeSBnb29kIExpbnV4IGtlcm5lbCBkZXZlbG9wZXJzLCBidXQgdGhleQotCXRlbmQgdG8gZ2V0IG91dHNob3V0ZWQgYnkgYSBsYXJnZSBjcm93ZCBvZiBhcnJvZ2FudCBmb29scy4gVHJ5aW5nCi0JdG8gY29tbXVuaWNhdGUgdXNlciByZXF1aXJlbWVudHMgdG8gdGhlc2UgcGVvcGxlIGlzIGEgd2FzdGUgb2YKLQl0aW1lLiBUaGV5IGFyZSBtdWNoIHRvbyAiaW50ZWxsaWdlbnQiIHRvIGxpc3RlbiB0byBsZXNzZXIgbW9ydGFscy4KLQotKGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzEzMTc3Ni8pLgotCi1UaGUgcmVhbGl0eSBvZiB0aGUgc2l0dWF0aW9uIHdhcyBkaWZmZXJlbnQ7IHRoZSBrZXJuZWwgZGV2ZWxvcGVycyB3ZXJlIGZhcgotbW9yZSBjb25jZXJuZWQgYWJvdXQgc3lzdGVtIHN0YWJpbGl0eSwgbG9uZy10ZXJtIG1haW50ZW5hbmNlLCBhbmQgZmluZGluZwotdGhlIHJpZ2h0IHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtIHRoYW4gdGhleSB3ZXJlIHdpdGggYSBzcGVjaWZpYyBtb2R1bGUuCi1UaGUgbW9yYWwgb2YgdGhlIHN0b3J5IGlzIHRvIGZvY3VzIG9uIHRoZSBwcm9ibGVtIC0gbm90IGEgc3BlY2lmaWMgc29sdXRpb24KLS0gYW5kIHRvIGRpc2N1c3MgaXQgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGJlZm9yZSBpbnZlc3RpbmcgaW4gdGhlCi1jcmVhdGlvbiBvZiBhIGJvZHkgb2YgY29kZS4KLQotU28sIHdoZW4gY29udGVtcGxhdGluZyBhIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9qZWN0LCBvbmUgc2hvdWxkIG9idGFpbgotYW5zd2VycyB0byBhIHNob3J0IHNldCBvZiBxdWVzdGlvbnM6Ci0KLSAtIFdoYXQsIGV4YWN0bHksIGlzIHRoZSBwcm9ibGVtIHdoaWNoIG5lZWRzIHRvIGJlIHNvbHZlZD8KLQotIC0gV2hvIGFyZSB0aGUgdXNlcnMgYWZmZWN0ZWQgYnkgdGhpcyBwcm9ibGVtPyAgV2hpY2ggdXNlIGNhc2VzIHNob3VsZCB0aGUKLSAgIHNvbHV0aW9uIGFkZHJlc3M/Ci0KLSAtIEhvdyBkb2VzIHRoZSBrZXJuZWwgZmFsbCBzaG9ydCBpbiBhZGRyZXNzaW5nIHRoYXQgcHJvYmxlbSBub3c/Ci0KLU9ubHkgdGhlbiBkb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gc3RhcnQgY29uc2lkZXJpbmcgcG9zc2libGUgc29sdXRpb25zLgotCi0KLTMuMjogRUFSTFkgRElTQ1VTU0lPTgotCi1XaGVuIHBsYW5uaW5nIGEga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIGl0IG1ha2VzIGdyZWF0IHNlbnNlIHRvIGhvbGQKLWRpc2N1c3Npb25zIHdpdGggdGhlIGNvbW11bml0eSBiZWZvcmUgbGF1bmNoaW5nIGludG8gaW1wbGVtZW50YXRpb24uICBFYXJseQotY29tbXVuaWNhdGlvbiBjYW4gc2F2ZSB0aW1lIGFuZCB0cm91YmxlIGluIGEgbnVtYmVyIG9mIHdheXM6Ci0KLSAtIEl0IG1heSB3ZWxsIGJlIHRoYXQgdGhlIHByb2JsZW0gaXMgYWRkcmVzc2VkIGJ5IHRoZSBrZXJuZWwgaW4gd2F5cyB3aGljaAotICAgeW91IGhhdmUgbm90IHVuZGVyc3Rvb2QuICBUaGUgTGludXgga2VybmVsIGlzIGxhcmdlIGFuZCBoYXMgYSBudW1iZXIgb2YKLSAgIGZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMgd2hpY2ggYXJlIG5vdCBpbW1lZGlhdGVseSBvYnZpb3VzLiAgTm90IGFsbAotICAga2VybmVsIGNhcGFiaWxpdGllcyBhcmUgZG9jdW1lbnRlZCBhcyB3ZWxsIGFzIG9uZSBtaWdodCBsaWtlLCBhbmQgaXQgaXMKLSAgIGVhc3kgdG8gbWlzcyB0aGluZ3MuICBZb3VyIGF1dGhvciBoYXMgc2VlbiB0aGUgcG9zdGluZyBvZiBhIGNvbXBsZXRlCi0gICBkcml2ZXIgd2hpY2ggZHVwbGljYXRlZCBhbiBleGlzdGluZyBkcml2ZXIgdGhhdCB0aGUgbmV3IGF1dGhvciBoYWQgYmVlbgotICAgdW5hd2FyZSBvZi4gIENvZGUgd2hpY2ggcmVpbnZlbnRzIGV4aXN0aW5nIHdoZWVscyBpcyBub3Qgb25seSB3YXN0ZWZ1bDsKLSAgIGl0IHdpbGwgYWxzbyBub3QgYmUgYWNjZXB0ZWQgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLgotCi0gLSBUaGVyZSBtYXkgYmUgZWxlbWVudHMgb2YgdGhlIHByb3Bvc2VkIHNvbHV0aW9uIHdoaWNoIHdpbGwgbm90IGJlCi0gICBhY2NlcHRhYmxlIGZvciBtYWlubGluZSBtZXJnaW5nLiAgSXQgaXMgYmV0dGVyIHRvIGZpbmQgb3V0IGFib3V0Ci0gICBwcm9ibGVtcyBsaWtlIHRoaXMgYmVmb3JlIHdyaXRpbmcgdGhlIGNvZGUuCi0KLSAtIEl0J3MgZW50aXJlbHkgcG9zc2libGUgdGhhdCBvdGhlciBkZXZlbG9wZXJzIGhhdmUgdGhvdWdodCBhYm91dCB0aGUKLSAgIHByb2JsZW07IHRoZXkgbWF5IGhhdmUgaWRlYXMgZm9yIGEgYmV0dGVyIHNvbHV0aW9uLCBhbmQgbWF5IGJlIHdpbGxpbmcKLSAgIHRvIGhlbHAgaW4gdGhlIGNyZWF0aW9uIG9mIHRoYXQgc29sdXRpb24uCi0KLVllYXJzIG9mIGV4cGVyaWVuY2Ugd2l0aCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBoYXZlIHRhdWdodCBhCi1jbGVhciBsZXNzb246IGtlcm5lbCBjb2RlIHdoaWNoIGlzIGRlc2lnbmVkIGFuZCBkZXZlbG9wZWQgYmVoaW5kIGNsb3NlZAotZG9vcnMgaW52YXJpYWJseSBoYXMgcHJvYmxlbXMgd2hpY2ggYXJlIG9ubHkgcmV2ZWFsZWQgd2hlbiB0aGUgY29kZSBpcwotcmVsZWFzZWQgaW50byB0aGUgY29tbXVuaXR5LiAgU29tZXRpbWVzIHRoZXNlIHByb2JsZW1zIGFyZSBzZXZlcmUsCi1yZXF1aXJpbmcgbW9udGhzIG9yIHllYXJzIG9mIGVmZm9ydCBiZWZvcmUgdGhlIGNvZGUgY2FuIGJlIGJyb3VnaHQgdXAgdG8KLXRoZSBrZXJuZWwgY29tbXVuaXR5J3Mgc3RhbmRhcmRzLiAgU29tZSBleGFtcGxlcyBpbmNsdWRlOgotCi0gLSBUaGUgRGV2aWNlc2NhcGUgbmV0d29yayBzdGFjayB3YXMgZGVzaWduZWQgYW5kIGltcGxlbWVudGVkIGZvcgotICAgc2luZ2xlLXByb2Nlc3NvciBzeXN0ZW1zLiAgSXQgY291bGQgbm90IGJlIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZQotICAgdW50aWwgaXQgd2FzIG1hZGUgc3VpdGFibGUgZm9yIG11bHRpcHJvY2Vzc29yIHN5c3RlbXMuICBSZXRyb2ZpdHRpbmcKLSAgIGxvY2tpbmcgYW5kIHN1Y2ggaW50byBjb2RlIGlzIGEgZGlmZmljdWx0IHRhc2s7IGFzIGEgcmVzdWx0LCB0aGUgbWVyZ2luZwotICAgb2YgdGhpcyBjb2RlIChub3cgY2FsbGVkIG1hYzgwMjExKSB3YXMgZGVsYXllZCBmb3Igb3ZlciBhIHllYXIuCi0KLSAtIFRoZSBSZWlzZXI0IGZpbGVzeXN0ZW0gaW5jbHVkZWQgYSBudW1iZXIgb2YgY2FwYWJpbGl0aWVzIHdoaWNoLCBpbiB0aGUKLSAgIGNvcmUga2VybmVsIGRldmVsb3BlcnMnIG9waW5pb24sIHNob3VsZCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhlCi0gICB2aXJ0dWFsIGZpbGVzeXN0ZW0gbGF5ZXIgaW5zdGVhZC4gIEl0IGFsc28gaW5jbHVkZWQgZmVhdHVyZXMgd2hpY2ggY291bGQKLSAgIG5vdCBlYXNpbHkgYmUgaW1wbGVtZW50ZWQgd2l0aG91dCBleHBvc2luZyB0aGUgc3lzdGVtIHRvIHVzZXItY2F1c2VkCi0gICBkZWFkbG9ja3MuICBUaGUgbGF0ZSByZXZlbGF0aW9uIG9mIHRoZXNlIHByb2JsZW1zIC0gYW5kIHJlZnVzYWwgdG8KLSAgIGFkZHJlc3Mgc29tZSBvZiB0aGVtIC0gaGFzIGNhdXNlZCBSZWlzZXI0IHRvIHN0YXkgb3V0IG9mIHRoZSBtYWlubGluZQotICAga2VybmVsLgotCi0gLSBUaGUgQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlIG1hZGUgdXNlIG9mIGludGVybmFsIHZpcnR1YWwgZmlsZXN5c3RlbQotICAgZGF0YSBzdHJ1Y3R1cmVzIGluIHdheXMgd2hpY2ggd2VyZSBjb25zaWRlcmVkIHRvIGJlIHVuc2FmZSBhbmQKLSAgIHVucmVsaWFibGUuICBUaGlzIGNvbmNlcm4gKGFtb25nIG90aGVycykga2VwdCBBcHBBcm1vciBvdXQgb2YgdGhlCi0gICBtYWlubGluZSBmb3IgeWVhcnMuCi0KLUluIGVhY2ggb2YgdGhlc2UgY2FzZXMsIGEgZ3JlYXQgZGVhbCBvZiBwYWluIGFuZCBleHRyYSB3b3JrIGNvdWxkIGhhdmUgYmVlbgotYXZvaWRlZCB3aXRoIHNvbWUgZWFybHkgZGlzY3Vzc2lvbiB3aXRoIHRoZSBrZXJuZWwgZGV2ZWxvcGVycy4KLQotCi0zLjM6IFdITyBETyBZT1UgVEFMSyBUTz8KLQotV2hlbiBkZXZlbG9wZXJzIGRlY2lkZSB0byB0YWtlIHRoZWlyIHBsYW5zIHB1YmxpYywgdGhlIG5leHQgcXVlc3Rpb24gd2lsbAotYmU6IHdoZXJlIGRvIHdlIHN0YXJ0PyAgVGhlIGFuc3dlciBpcyB0byBmaW5kIHRoZSByaWdodCBtYWlsaW5nIGxpc3QocykgYW5kCi10aGUgcmlnaHQgbWFpbnRhaW5lci4gIEZvciBtYWlsaW5nIGxpc3RzLCB0aGUgYmVzdCBhcHByb2FjaCBpcyB0byBsb29rIGluCi10aGUgTUFJTlRBSU5FUlMgZmlsZSBmb3IgYSByZWxldmFudCBwbGFjZSB0byBwb3N0LiAgSWYgdGhlcmUgaXMgYSBzdWl0YWJsZQotc3Vic3lzdGVtIGxpc3QsIHBvc3RpbmcgdGhlcmUgaXMgb2Z0ZW4gcHJlZmVyYWJsZSB0byBwb3N0aW5nIG9uCi1saW51eC1rZXJuZWw7IHlvdSBhcmUgbW9yZSBsaWtlbHkgdG8gcmVhY2ggZGV2ZWxvcGVycyB3aXRoIGV4cGVydGlzZSBpbiB0aGUKLXJlbGV2YW50IHN1YnN5c3RlbSBhbmQgdGhlIGVudmlyb25tZW50IG1heSBiZSBtb3JlIHN1cHBvcnRpdmUuCi0KLUZpbmRpbmcgbWFpbnRhaW5lcnMgY2FuIGJlIGEgYml0IGhhcmRlci4gIEFnYWluLCB0aGUgTUFJTlRBSU5FUlMgZmlsZSBpcwotdGhlIHBsYWNlIHRvIHN0YXJ0LiAgVGhhdCBmaWxlIHRlbmRzIHRvIG5vdCBhbHdheXMgYmUgdXAgdG8gZGF0ZSwgdGhvdWdoLAotYW5kIG5vdCBhbGwgc3Vic3lzdGVtcyBhcmUgcmVwcmVzZW50ZWQgdGhlcmUuICBUaGUgcGVyc29uIGxpc3RlZCBpbiB0aGUKLU1BSU5UQUlORVJTIGZpbGUgbWF5LCBpbiBmYWN0LCBub3QgYmUgdGhlIHBlcnNvbiB3aG8gaXMgYWN0dWFsbHkgYWN0aW5nIGluCi10aGF0IHJvbGUgY3VycmVudGx5LiAgU28sIHdoZW4gdGhlcmUgaXMgZG91YnQgYWJvdXQgd2hvIHRvIGNvbnRhY3QsIGEKLXVzZWZ1bCB0cmljayBpcyB0byB1c2UgZ2l0IChhbmQgImdpdCBsb2ciIGluIHBhcnRpY3VsYXIpIHRvIHNlZSB3aG8gaXMKLWN1cnJlbnRseSBhY3RpdmUgd2l0aGluIHRoZSBzdWJzeXN0ZW0gb2YgaW50ZXJlc3QuICBMb29rIGF0IHdobyBpcyB3cml0aW5nCi1wYXRjaGVzLCBhbmQgd2hvLCBpZiBhbnlib2R5LCBpcyBhdHRhY2hpbmcgU2lnbmVkLW9mZi1ieSBsaW5lcyB0byB0aG9zZQotcGF0Y2hlcy4gIFRob3NlIGFyZSB0aGUgcGVvcGxlIHdobyB3aWxsIGJlIGJlc3QgcGxhY2VkIHRvIGhlbHAgd2l0aCBhIG5ldwotZGV2ZWxvcG1lbnQgcHJvamVjdC4KLQotVGhlIHRhc2sgb2YgZmluZGluZyB0aGUgcmlnaHQgbWFpbnRhaW5lciBpcyBzb21ldGltZXMgY2hhbGxlbmdpbmcgZW5vdWdoCi10aGF0IHRoZSBrZXJuZWwgZGV2ZWxvcGVycyBoYXZlIGFkZGVkIGEgc2NyaXB0IHRvIGVhc2UgdGhlIHByb2Nlc3M6Ci0KLQkuLi4vc2NyaXB0cy9nZXRfbWFpbnRhaW5lci5wbAotCi1UaGlzIHNjcmlwdCB3aWxsIHJldHVybiB0aGUgY3VycmVudCBtYWludGFpbmVyKHMpIGZvciBhIGdpdmVuIGZpbGUgb3IKLWRpcmVjdG9yeSB3aGVuIGdpdmVuIHRoZSAiLWYiIG9wdGlvbi4gIElmIHBhc3NlZCBhIHBhdGNoIG9uIHRoZQotY29tbWFuZCBsaW5lLCBpdCB3aWxsIGxpc3QgdGhlIG1haW50YWluZXJzIHdobyBzaG91bGQgcHJvYmFibHkgcmVjZWl2ZQotY29waWVzIG9mIHRoZSBwYXRjaC4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiBvcHRpb25zIHJlZ3VsYXRpbmcgaG93IGhhcmQKLWdldF9tYWludGFpbmVyLnBsIHdpbGwgc2VhcmNoIGZvciBtYWludGFpbmVyczsgcGxlYXNlIGJlIGNhcmVmdWwgYWJvdXQKLXVzaW5nIHRoZSBtb3JlIGFnZ3Jlc3NpdmUgb3B0aW9ucyBhcyB5b3UgbWF5IGVuZCB1cCBpbmNsdWRpbmcgZGV2ZWxvcGVycwotd2hvIGhhdmUgbm8gcmVhbCBpbnRlcmVzdCBpbiB0aGUgY29kZSB5b3UgYXJlIG1vZGlmeWluZy4KLQotSWYgYWxsIGVsc2UgZmFpbHMsIHRhbGtpbmcgdG8gQW5kcmV3IE1vcnRvbiBjYW4gYmUgYW4gZWZmZWN0aXZlIHdheSB0bwotdHJhY2sgZG93biBhIG1haW50YWluZXIgZm9yIGEgc3BlY2lmaWMgcGllY2Ugb2YgY29kZS4KLQotCi0zLjQ6IFdIRU4gVE8gUE9TVD8KLQotSWYgcG9zc2libGUsIHBvc3RpbmcgeW91ciBwbGFucyBkdXJpbmcgdGhlIGVhcmx5IHN0YWdlcyBjYW4gb25seSBiZQotaGVscGZ1bC4gIERlc2NyaWJlIHRoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCBhbmQgYW55IHBsYW5zIHRoYXQgaGF2ZSBiZWVuCi1tYWRlIG9uIGhvdyB0aGUgaW1wbGVtZW50YXRpb24gd2lsbCBiZSBkb25lLiAgQW55IGluZm9ybWF0aW9uIHlvdSBjYW4KLXByb3ZpZGUgY2FuIGhlbHAgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSBwcm92aWRlIHVzZWZ1bCBpbnB1dCBvbiB0aGUKLXByb2plY3QuCi0KLU9uZSBkaXNjb3VyYWdpbmcgdGhpbmcgd2hpY2ggY2FuIGhhcHBlbiBhdCB0aGlzIHN0YWdlIGlzIG5vdCBhIGhvc3RpbGUKLXJlYWN0aW9uLCBidXQsIGluc3RlYWQsIGxpdHRsZSBvciBubyByZWFjdGlvbiBhdCBhbGwuICBUaGUgc2FkIHRydXRoIG9mIHRoZQotbWF0dGVyIGlzICgxKSBrZXJuZWwgZGV2ZWxvcGVycyB0ZW5kIHRvIGJlIGJ1c3ksICgyKSB0aGVyZSBpcyBubyBzaG9ydGFnZQotb2YgcGVvcGxlIHdpdGggZ3JhbmQgcGxhbnMgYW5kIGxpdHRsZSBjb2RlIChvciBldmVuIHByb3NwZWN0IG9mIGNvZGUpIHRvCi1iYWNrIHRoZW0gdXAsIGFuZCAoMykgbm9ib2R5IGlzIG9ibGlnYXRlZCB0byByZXZpZXcgb3IgY29tbWVudCBvbiBpZGVhcwotcG9zdGVkIGJ5IG90aGVycy4gIEJleW9uZCB0aGF0LCBoaWdoLWxldmVsIGRlc2lnbnMgb2Z0ZW4gaGlkZSBwcm9ibGVtcwotd2hpY2ggYXJlIG9ubHkgcmV2aWV3ZWQgd2hlbiBzb21lYm9keSBhY3R1YWxseSB0cmllcyB0byBpbXBsZW1lbnQgdGhvc2UKLWRlc2lnbnM7IGZvciB0aGF0IHJlYXNvbiwga2VybmVsIGRldmVsb3BlcnMgd291bGQgcmF0aGVyIHNlZSB0aGUgY29kZS4KLQotSWYgYSByZXF1ZXN0LWZvci1jb21tZW50cyBwb3N0aW5nIHlpZWxkcyBsaXR0bGUgaW4gdGhlIHdheSBvZiBjb21tZW50cywgZG8KLW5vdCBhc3N1bWUgdGhhdCBpdCBtZWFucyB0aGVyZSBpcyBubyBpbnRlcmVzdCBpbiB0aGUgcHJvamVjdC4KLVVuZm9ydHVuYXRlbHksIHlvdSBhbHNvIGNhbm5vdCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbm8gcHJvYmxlbXMgd2l0aCB5b3VyCi1pZGVhLiAgVGhlIGJlc3QgdGhpbmcgdG8gZG8gaW4gdGhpcyBzaXR1YXRpb24gaXMgdG8gcHJvY2VlZCwga2VlcGluZyB0aGUKLWNvbW11bml0eSBpbmZvcm1lZCBhcyB5b3UgZ28uCi0KLQotMy41OiBHRVRUSU5HIE9GRklDSUFMIEJVWS1JTgotCi1JZiB5b3VyIHdvcmsgaXMgYmVpbmcgZG9uZSBpbiBhIGNvcnBvcmF0ZSBlbnZpcm9ubWVudCAtIGFzIG1vc3QgTGludXgKLWtlcm5lbCB3b3JrIGlzIC0geW91IG11c3QsIG9idmlvdXNseSwgaGF2ZSBwZXJtaXNzaW9uIGZyb20gc3VpdGFibHkKLWVtcG93ZXJlZCBtYW5hZ2VycyBiZWZvcmUgeW91IGNhbiBwb3N0IHlvdXIgY29tcGFueSdzIHBsYW5zIG9yIGNvZGUgdG8gYQotcHVibGljIG1haWxpbmcgbGlzdC4gIFRoZSBwb3N0aW5nIG9mIGNvZGUgd2hpY2ggaGFzIG5vdCBiZWVuIGNsZWFyZWQgZm9yCi1yZWxlYXNlIHVuZGVyIGEgR1BMLWNvbXBhdGlibGUgbGljZW5zZSBjYW4gYmUgZXNwZWNpYWxseSBwcm9ibGVtYXRpYzsgdGhlCi1zb29uZXIgdGhhdCBhIGNvbXBhbnkncyBtYW5hZ2VtZW50IGFuZCBsZWdhbCBzdGFmZiBjYW4gYWdyZWUgb24gdGhlIHBvc3RpbmcKLW9mIGEga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIHRoZSBiZXR0ZXIgb2ZmIGV2ZXJ5Ym9keSBpbnZvbHZlZCB3aWxsIGJlLgotCi1Tb21lIHJlYWRlcnMgbWF5IGJlIHRoaW5raW5nIGF0IHRoaXMgcG9pbnQgdGhhdCB0aGVpciBrZXJuZWwgd29yayBpcwotaW50ZW5kZWQgdG8gc3VwcG9ydCBhIHByb2R1Y3Qgd2hpY2ggZG9lcyBub3QgeWV0IGhhdmUgYW4gb2ZmaWNpYWxseQotYWNrbm93bGVkZ2VkIGV4aXN0ZW5jZS4gIFJldmVhbGluZyB0aGVpciBlbXBsb3llcidzIHBsYW5zIG9uIGEgcHVibGljCi1tYWlsaW5nIGxpc3QgbWF5IG5vdCBiZSBhIHZpYWJsZSBvcHRpb24uICBJbiBjYXNlcyBsaWtlIHRoaXMsIGl0IGlzIHdvcnRoCi1jb25zaWRlcmluZyB3aGV0aGVyIHRoZSBzZWNyZWN5IGlzIHJlYWxseSBuZWNlc3Nhcnk7IHRoZXJlIGlzIG9mdGVuIG5vIHJlYWwKLW5lZWQgdG8ga2VlcCBkZXZlbG9wbWVudCBwbGFucyBiZWhpbmQgY2xvc2VkIGRvb3JzLgotCi1UaGF0IHNhaWQsIHRoZXJlIGFyZSBhbHNvIGNhc2VzIHdoZXJlIGEgY29tcGFueSBsZWdpdGltYXRlbHkgY2Fubm90Ci1kaXNjbG9zZSBpdHMgcGxhbnMgZWFybHkgaW4gdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuICBDb21wYW5pZXMgd2l0aAotZXhwZXJpZW5jZWQga2VybmVsIGRldmVsb3BlcnMgbWF5IGNob29zZSB0byBwcm9jZWVkIGluIGFuIG9wZW4tbG9vcCBtYW5uZXIKLW9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhleSB3aWxsIGJlIGFibGUgdG8gYXZvaWQgc2VyaW91cyBpbnRlZ3JhdGlvbgotcHJvYmxlbXMgbGF0ZXIuICBGb3IgY29tcGFuaWVzIHdpdGhvdXQgdGhhdCBzb3J0IG9mIGluLWhvdXNlIGV4cGVydGlzZSwgdGhlCi1iZXN0IG9wdGlvbiBpcyBvZnRlbiB0byBoaXJlIGFuIG91dHNpZGUgZGV2ZWxvcGVyIHRvIHJldmlldyB0aGUgcGxhbnMgdW5kZXIKLWEgbm9uLWRpc2Nsb3N1cmUgYWdyZWVtZW50LiAgVGhlIExpbnV4IEZvdW5kYXRpb24gb3BlcmF0ZXMgYW4gTkRBIHByb2dyYW0KLWRlc2lnbmVkIHRvIGhlbHAgd2l0aCB0aGlzIHNvcnQgb2Ygc2l0dWF0aW9uOyBtb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZAotYXQ6Ci0KLSAgICBodHRwOi8vd3d3LmxpbnV4Zm91bmRhdGlvbi5vcmcvZW4vTkRBX3Byb2dyYW0KLQotVGhpcyBraW5kIG9mIHJldmlldyBpcyBvZnRlbiBlbm91Z2ggdG8gYXZvaWQgc2VyaW91cyBwcm9ibGVtcyBsYXRlciBvbgotd2l0aG91dCByZXF1aXJpbmcgcHVibGljIGRpc2Nsb3N1cmUgb2YgdGhlIHByb2plY3QuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMy5FYXJseS1zdGFnZS5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvMy5FYXJseS1zdGFnZS5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyYzBhZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy8zLkVhcmx5LXN0YWdlLnJzdApAQCAtMCwwICsxLDIyMiBAQAorLi4gX2RldmVsb3BtZW50X2Vhcmx5X3N0YWdlOgorCitFYXJseS1zdGFnZSBwbGFubmluZworPT09PT09PT09PT09PT09PT09PT0KKworV2hlbiBjb250ZW1wbGF0aW5nIGEgTGludXgga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIGl0IGNhbiBiZSB0ZW1wdGluZwordG8ganVtcCByaWdodCBpbiBhbmQgc3RhcnQgY29kaW5nLiAgQXMgd2l0aCBhbnkgc2lnbmlmaWNhbnQgcHJvamVjdCwKK3Rob3VnaCwgbXVjaCBvZiB0aGUgZ3JvdW5kd29yayBmb3Igc3VjY2VzcyBpcyBiZXN0IGxhaWQgYmVmb3JlIHRoZSBmaXJzdAorbGluZSBvZiBjb2RlIGlzIHdyaXR0ZW4uICBTb21lIHRpbWUgc3BlbnQgaW4gZWFybHkgcGxhbm5pbmcgYW5kCitjb21tdW5pY2F0aW9uIGNhbiBzYXZlIGZhciBtb3JlIHRpbWUgbGF0ZXIgb24uCisKKworU3BlY2lmeWluZyB0aGUgcHJvYmxlbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMaWtlIGFueSBlbmdpbmVlcmluZyBwcm9qZWN0LCBhIHN1Y2Nlc3NmdWwga2VybmVsIGVuaGFuY2VtZW50IHN0YXJ0cyB3aXRoIGEKK2NsZWFyIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtIHRvIGJlIHNvbHZlZC4gIEluIHNvbWUgY2FzZXMsIHRoaXMgc3RlcCBpcworZWFzeTogd2hlbiBhIGRyaXZlciBpcyBuZWVkZWQgZm9yIGEgc3BlY2lmaWMgcGllY2Ugb2YgaGFyZHdhcmUsIGZvcgorZXhhbXBsZS4gIEluIG90aGVycywgdGhvdWdoLCBpdCBpcyB0ZW1wdGluZyB0byBjb25mdXNlIHRoZSByZWFsIHByb2JsZW0KK3dpdGggdGhlIHByb3Bvc2VkIHNvbHV0aW9uLCBhbmQgdGhhdCBjYW4gbGVhZCB0byBkaWZmaWN1bHRpZXMuCisKK0NvbnNpZGVyIGFuIGV4YW1wbGU6IHNvbWUgeWVhcnMgYWdvLCBkZXZlbG9wZXJzIHdvcmtpbmcgd2l0aCBMaW51eCBhdWRpbworc291Z2h0IGEgd2F5IHRvIHJ1biBhcHBsaWNhdGlvbnMgd2l0aG91dCBkcm9wb3V0cyBvciBvdGhlciBhcnRpZmFjdHMgY2F1c2VkCitieSBleGNlc3NpdmUgbGF0ZW5jeSBpbiB0aGUgc3lzdGVtLiAgVGhlIHNvbHV0aW9uIHRoZXkgYXJyaXZlZCBhdCB3YXMgYQora2VybmVsIG1vZHVsZSBpbnRlbmRlZCB0byBob29rIGludG8gdGhlIExpbnV4IFNlY3VyaXR5IE1vZHVsZSAoTFNNKQorZnJhbWV3b3JrOyB0aGlzIG1vZHVsZSBjb3VsZCBiZSBjb25maWd1cmVkIHRvIGdpdmUgc3BlY2lmaWMgYXBwbGljYXRpb25zCithY2Nlc3MgdG8gdGhlIHJlYWx0aW1lIHNjaGVkdWxlci4gIFRoaXMgbW9kdWxlIHdhcyBpbXBsZW1lbnRlZCBhbmQgc2VudCB0bwordGhlIGxpbnV4LWtlcm5lbCBtYWlsaW5nIGxpc3QsIHdoZXJlIGl0IGltbWVkaWF0ZWx5IHJhbiBpbnRvIHByb2JsZW1zLgorCitUbyB0aGUgYXVkaW8gZGV2ZWxvcGVycywgdGhpcyBzZWN1cml0eSBtb2R1bGUgd2FzIHN1ZmZpY2llbnQgdG8gc29sdmUgdGhlaXIKK2ltbWVkaWF0ZSBwcm9ibGVtLiAgVG8gdGhlIHdpZGVyIGtlcm5lbCBjb21tdW5pdHksIHRob3VnaCwgaXQgd2FzIHNlZW4gYXMgYQorbWlzdXNlIG9mIHRoZSBMU00gZnJhbWV3b3JrICh3aGljaCBpcyBub3QgaW50ZW5kZWQgdG8gY29uZmVyIHByaXZpbGVnZXMKK29udG8gcHJvY2Vzc2VzIHdoaWNoIHRoZXkgd291bGQgbm90IG90aGVyd2lzZSBoYXZlKSBhbmQgYSByaXNrIHRvIHN5c3RlbQorc3RhYmlsaXR5LiAgVGhlaXIgcHJlZmVycmVkIHNvbHV0aW9ucyBpbnZvbHZlZCByZWFsdGltZSBzY2hlZHVsaW5nIGFjY2VzcwordmlhIHRoZSBybGltaXQgbWVjaGFuaXNtIGZvciB0aGUgc2hvcnQgdGVybSwgYW5kIG9uZ29pbmcgbGF0ZW5jeSByZWR1Y3Rpb24KK3dvcmsgaW4gdGhlIGxvbmcgdGVybS4KKworVGhlIGF1ZGlvIGNvbW11bml0eSwgaG93ZXZlciwgY291bGQgbm90IHNlZSBwYXN0IHRoZSBwYXJ0aWN1bGFyIHNvbHV0aW9uCit0aGV5IGhhZCBpbXBsZW1lbnRlZDsgdGhleSB3ZXJlIHVud2lsbGluZyB0byBhY2NlcHQgYWx0ZXJuYXRpdmVzLiAgVGhlCityZXN1bHRpbmcgZGlzYWdyZWVtZW50IGxlZnQgdGhvc2UgZGV2ZWxvcGVycyBmZWVsaW5nIGRpc2lsbHVzaW9uZWQgd2l0aCB0aGUKK2VudGlyZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2Vzczsgb25lIG9mIHRoZW0gd2VudCBiYWNrIHRvIGFuIGF1ZGlvIGxpc3QKK2FuZCBwb3N0ZWQgdGhpczoKKworCVRoZXJlIGFyZSBhIG51bWJlciBvZiB2ZXJ5IGdvb2QgTGludXgga2VybmVsIGRldmVsb3BlcnMsIGJ1dCB0aGV5CisJdGVuZCB0byBnZXQgb3V0c2hvdXRlZCBieSBhIGxhcmdlIGNyb3dkIG9mIGFycm9nYW50IGZvb2xzLiBUcnlpbmcKKwl0byBjb21tdW5pY2F0ZSB1c2VyIHJlcXVpcmVtZW50cyB0byB0aGVzZSBwZW9wbGUgaXMgYSB3YXN0ZSBvZgorCXRpbWUuIFRoZXkgYXJlIG11Y2ggdG9vICJpbnRlbGxpZ2VudCIgdG8gbGlzdGVuIHRvIGxlc3NlciBtb3J0YWxzLgorCisoaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMTMxNzc2LykuCisKK1RoZSByZWFsaXR5IG9mIHRoZSBzaXR1YXRpb24gd2FzIGRpZmZlcmVudDsgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIHdlcmUgZmFyCittb3JlIGNvbmNlcm5lZCBhYm91dCBzeXN0ZW0gc3RhYmlsaXR5LCBsb25nLXRlcm0gbWFpbnRlbmFuY2UsIGFuZCBmaW5kaW5nCit0aGUgcmlnaHQgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gdGhhbiB0aGV5IHdlcmUgd2l0aCBhIHNwZWNpZmljIG1vZHVsZS4KK1RoZSBtb3JhbCBvZiB0aGUgc3RvcnkgaXMgdG8gZm9jdXMgb24gdGhlIHByb2JsZW0gLSBub3QgYSBzcGVjaWZpYyBzb2x1dGlvbgorLSBhbmQgdG8gZGlzY3VzcyBpdCB3aXRoIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYmVmb3JlIGludmVzdGluZyBpbiB0aGUKK2NyZWF0aW9uIG9mIGEgYm9keSBvZiBjb2RlLgorCitTbywgd2hlbiBjb250ZW1wbGF0aW5nIGEga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIG9uZSBzaG91bGQgb2J0YWluCithbnN3ZXJzIHRvIGEgc2hvcnQgc2V0IG9mIHF1ZXN0aW9uczoKKworIC0gV2hhdCwgZXhhY3RseSwgaXMgdGhlIHByb2JsZW0gd2hpY2ggbmVlZHMgdG8gYmUgc29sdmVkPworCisgLSBXaG8gYXJlIHRoZSB1c2VycyBhZmZlY3RlZCBieSB0aGlzIHByb2JsZW0/ICBXaGljaCB1c2UgY2FzZXMgc2hvdWxkIHRoZQorICAgc29sdXRpb24gYWRkcmVzcz8KKworIC0gSG93IGRvZXMgdGhlIGtlcm5lbCBmYWxsIHNob3J0IGluIGFkZHJlc3NpbmcgdGhhdCBwcm9ibGVtIG5vdz8KKworT25seSB0aGVuIGRvZXMgaXQgbWFrZSBzZW5zZSB0byBzdGFydCBjb25zaWRlcmluZyBwb3NzaWJsZSBzb2x1dGlvbnMuCisKKworRWFybHkgZGlzY3Vzc2lvbgorLS0tLS0tLS0tLS0tLS0tLQorCitXaGVuIHBsYW5uaW5nIGEga2VybmVsIGRldmVsb3BtZW50IHByb2plY3QsIGl0IG1ha2VzIGdyZWF0IHNlbnNlIHRvIGhvbGQKK2Rpc2N1c3Npb25zIHdpdGggdGhlIGNvbW11bml0eSBiZWZvcmUgbGF1bmNoaW5nIGludG8gaW1wbGVtZW50YXRpb24uICBFYXJseQorY29tbXVuaWNhdGlvbiBjYW4gc2F2ZSB0aW1lIGFuZCB0cm91YmxlIGluIGEgbnVtYmVyIG9mIHdheXM6CisKKyAtIEl0IG1heSB3ZWxsIGJlIHRoYXQgdGhlIHByb2JsZW0gaXMgYWRkcmVzc2VkIGJ5IHRoZSBrZXJuZWwgaW4gd2F5cyB3aGljaAorICAgeW91IGhhdmUgbm90IHVuZGVyc3Rvb2QuICBUaGUgTGludXgga2VybmVsIGlzIGxhcmdlIGFuZCBoYXMgYSBudW1iZXIgb2YKKyAgIGZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMgd2hpY2ggYXJlIG5vdCBpbW1lZGlhdGVseSBvYnZpb3VzLiAgTm90IGFsbAorICAga2VybmVsIGNhcGFiaWxpdGllcyBhcmUgZG9jdW1lbnRlZCBhcyB3ZWxsIGFzIG9uZSBtaWdodCBsaWtlLCBhbmQgaXQgaXMKKyAgIGVhc3kgdG8gbWlzcyB0aGluZ3MuICBZb3VyIGF1dGhvciBoYXMgc2VlbiB0aGUgcG9zdGluZyBvZiBhIGNvbXBsZXRlCisgICBkcml2ZXIgd2hpY2ggZHVwbGljYXRlZCBhbiBleGlzdGluZyBkcml2ZXIgdGhhdCB0aGUgbmV3IGF1dGhvciBoYWQgYmVlbgorICAgdW5hd2FyZSBvZi4gIENvZGUgd2hpY2ggcmVpbnZlbnRzIGV4aXN0aW5nIHdoZWVscyBpcyBub3Qgb25seSB3YXN0ZWZ1bDsKKyAgIGl0IHdpbGwgYWxzbyBub3QgYmUgYWNjZXB0ZWQgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLgorCisgLSBUaGVyZSBtYXkgYmUgZWxlbWVudHMgb2YgdGhlIHByb3Bvc2VkIHNvbHV0aW9uIHdoaWNoIHdpbGwgbm90IGJlCisgICBhY2NlcHRhYmxlIGZvciBtYWlubGluZSBtZXJnaW5nLiAgSXQgaXMgYmV0dGVyIHRvIGZpbmQgb3V0IGFib3V0CisgICBwcm9ibGVtcyBsaWtlIHRoaXMgYmVmb3JlIHdyaXRpbmcgdGhlIGNvZGUuCisKKyAtIEl0J3MgZW50aXJlbHkgcG9zc2libGUgdGhhdCBvdGhlciBkZXZlbG9wZXJzIGhhdmUgdGhvdWdodCBhYm91dCB0aGUKKyAgIHByb2JsZW07IHRoZXkgbWF5IGhhdmUgaWRlYXMgZm9yIGEgYmV0dGVyIHNvbHV0aW9uLCBhbmQgbWF5IGJlIHdpbGxpbmcKKyAgIHRvIGhlbHAgaW4gdGhlIGNyZWF0aW9uIG9mIHRoYXQgc29sdXRpb24uCisKK1llYXJzIG9mIGV4cGVyaWVuY2Ugd2l0aCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBoYXZlIHRhdWdodCBhCitjbGVhciBsZXNzb246IGtlcm5lbCBjb2RlIHdoaWNoIGlzIGRlc2lnbmVkIGFuZCBkZXZlbG9wZWQgYmVoaW5kIGNsb3NlZAorZG9vcnMgaW52YXJpYWJseSBoYXMgcHJvYmxlbXMgd2hpY2ggYXJlIG9ubHkgcmV2ZWFsZWQgd2hlbiB0aGUgY29kZSBpcworcmVsZWFzZWQgaW50byB0aGUgY29tbXVuaXR5LiAgU29tZXRpbWVzIHRoZXNlIHByb2JsZW1zIGFyZSBzZXZlcmUsCityZXF1aXJpbmcgbW9udGhzIG9yIHllYXJzIG9mIGVmZm9ydCBiZWZvcmUgdGhlIGNvZGUgY2FuIGJlIGJyb3VnaHQgdXAgdG8KK3RoZSBrZXJuZWwgY29tbXVuaXR5J3Mgc3RhbmRhcmRzLiAgU29tZSBleGFtcGxlcyBpbmNsdWRlOgorCisgLSBUaGUgRGV2aWNlc2NhcGUgbmV0d29yayBzdGFjayB3YXMgZGVzaWduZWQgYW5kIGltcGxlbWVudGVkIGZvcgorICAgc2luZ2xlLXByb2Nlc3NvciBzeXN0ZW1zLiAgSXQgY291bGQgbm90IGJlIG1lcmdlZCBpbnRvIHRoZSBtYWlubGluZQorICAgdW50aWwgaXQgd2FzIG1hZGUgc3VpdGFibGUgZm9yIG11bHRpcHJvY2Vzc29yIHN5c3RlbXMuICBSZXRyb2ZpdHRpbmcKKyAgIGxvY2tpbmcgYW5kIHN1Y2ggaW50byBjb2RlIGlzIGEgZGlmZmljdWx0IHRhc2s7IGFzIGEgcmVzdWx0LCB0aGUgbWVyZ2luZworICAgb2YgdGhpcyBjb2RlIChub3cgY2FsbGVkIG1hYzgwMjExKSB3YXMgZGVsYXllZCBmb3Igb3ZlciBhIHllYXIuCisKKyAtIFRoZSBSZWlzZXI0IGZpbGVzeXN0ZW0gaW5jbHVkZWQgYSBudW1iZXIgb2YgY2FwYWJpbGl0aWVzIHdoaWNoLCBpbiB0aGUKKyAgIGNvcmUga2VybmVsIGRldmVsb3BlcnMnIG9waW5pb24sIHNob3VsZCBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgaW4gdGhlCisgICB2aXJ0dWFsIGZpbGVzeXN0ZW0gbGF5ZXIgaW5zdGVhZC4gIEl0IGFsc28gaW5jbHVkZWQgZmVhdHVyZXMgd2hpY2ggY291bGQKKyAgIG5vdCBlYXNpbHkgYmUgaW1wbGVtZW50ZWQgd2l0aG91dCBleHBvc2luZyB0aGUgc3lzdGVtIHRvIHVzZXItY2F1c2VkCisgICBkZWFkbG9ja3MuICBUaGUgbGF0ZSByZXZlbGF0aW9uIG9mIHRoZXNlIHByb2JsZW1zIC0gYW5kIHJlZnVzYWwgdG8KKyAgIGFkZHJlc3Mgc29tZSBvZiB0aGVtIC0gaGFzIGNhdXNlZCBSZWlzZXI0IHRvIHN0YXkgb3V0IG9mIHRoZSBtYWlubGluZQorICAga2VybmVsLgorCisgLSBUaGUgQXBwQXJtb3Igc2VjdXJpdHkgbW9kdWxlIG1hZGUgdXNlIG9mIGludGVybmFsIHZpcnR1YWwgZmlsZXN5c3RlbQorICAgZGF0YSBzdHJ1Y3R1cmVzIGluIHdheXMgd2hpY2ggd2VyZSBjb25zaWRlcmVkIHRvIGJlIHVuc2FmZSBhbmQKKyAgIHVucmVsaWFibGUuICBUaGlzIGNvbmNlcm4gKGFtb25nIG90aGVycykga2VwdCBBcHBBcm1vciBvdXQgb2YgdGhlCisgICBtYWlubGluZSBmb3IgeWVhcnMuCisKK0luIGVhY2ggb2YgdGhlc2UgY2FzZXMsIGEgZ3JlYXQgZGVhbCBvZiBwYWluIGFuZCBleHRyYSB3b3JrIGNvdWxkIGhhdmUgYmVlbgorYXZvaWRlZCB3aXRoIHNvbWUgZWFybHkgZGlzY3Vzc2lvbiB3aXRoIHRoZSBrZXJuZWwgZGV2ZWxvcGVycy4KKworCitXaG8gZG8geW91IHRhbGsgdG8/CistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doZW4gZGV2ZWxvcGVycyBkZWNpZGUgdG8gdGFrZSB0aGVpciBwbGFucyBwdWJsaWMsIHRoZSBuZXh0IHF1ZXN0aW9uIHdpbGwKK2JlOiB3aGVyZSBkbyB3ZSBzdGFydD8gIFRoZSBhbnN3ZXIgaXMgdG8gZmluZCB0aGUgcmlnaHQgbWFpbGluZyBsaXN0KHMpIGFuZAordGhlIHJpZ2h0IG1haW50YWluZXIuICBGb3IgbWFpbGluZyBsaXN0cywgdGhlIGJlc3QgYXBwcm9hY2ggaXMgdG8gbG9vayBpbgordGhlIE1BSU5UQUlORVJTIGZpbGUgZm9yIGEgcmVsZXZhbnQgcGxhY2UgdG8gcG9zdC4gIElmIHRoZXJlIGlzIGEgc3VpdGFibGUKK3N1YnN5c3RlbSBsaXN0LCBwb3N0aW5nIHRoZXJlIGlzIG9mdGVuIHByZWZlcmFibGUgdG8gcG9zdGluZyBvbgorbGludXgta2VybmVsOyB5b3UgYXJlIG1vcmUgbGlrZWx5IHRvIHJlYWNoIGRldmVsb3BlcnMgd2l0aCBleHBlcnRpc2UgaW4gdGhlCityZWxldmFudCBzdWJzeXN0ZW0gYW5kIHRoZSBlbnZpcm9ubWVudCBtYXkgYmUgbW9yZSBzdXBwb3J0aXZlLgorCitGaW5kaW5nIG1haW50YWluZXJzIGNhbiBiZSBhIGJpdCBoYXJkZXIuICBBZ2FpbiwgdGhlIE1BSU5UQUlORVJTIGZpbGUgaXMKK3RoZSBwbGFjZSB0byBzdGFydC4gIFRoYXQgZmlsZSB0ZW5kcyB0byBub3QgYWx3YXlzIGJlIHVwIHRvIGRhdGUsIHRob3VnaCwKK2FuZCBub3QgYWxsIHN1YnN5c3RlbXMgYXJlIHJlcHJlc2VudGVkIHRoZXJlLiAgVGhlIHBlcnNvbiBsaXN0ZWQgaW4gdGhlCitNQUlOVEFJTkVSUyBmaWxlIG1heSwgaW4gZmFjdCwgbm90IGJlIHRoZSBwZXJzb24gd2hvIGlzIGFjdHVhbGx5IGFjdGluZyBpbgordGhhdCByb2xlIGN1cnJlbnRseS4gIFNvLCB3aGVuIHRoZXJlIGlzIGRvdWJ0IGFib3V0IHdobyB0byBjb250YWN0LCBhCit1c2VmdWwgdHJpY2sgaXMgdG8gdXNlIGdpdCAoYW5kICJnaXQgbG9nIiBpbiBwYXJ0aWN1bGFyKSB0byBzZWUgd2hvIGlzCitjdXJyZW50bHkgYWN0aXZlIHdpdGhpbiB0aGUgc3Vic3lzdGVtIG9mIGludGVyZXN0LiAgTG9vayBhdCB3aG8gaXMgd3JpdGluZworcGF0Y2hlcywgYW5kIHdobywgaWYgYW55Ym9keSwgaXMgYXR0YWNoaW5nIFNpZ25lZC1vZmYtYnkgbGluZXMgdG8gdGhvc2UKK3BhdGNoZXMuICBUaG9zZSBhcmUgdGhlIHBlb3BsZSB3aG8gd2lsbCBiZSBiZXN0IHBsYWNlZCB0byBoZWxwIHdpdGggYSBuZXcKK2RldmVsb3BtZW50IHByb2plY3QuCisKK1RoZSB0YXNrIG9mIGZpbmRpbmcgdGhlIHJpZ2h0IG1haW50YWluZXIgaXMgc29tZXRpbWVzIGNoYWxsZW5naW5nIGVub3VnaAordGhhdCB0aGUga2VybmVsIGRldmVsb3BlcnMgaGF2ZSBhZGRlZCBhIHNjcmlwdCB0byBlYXNlIHRoZSBwcm9jZXNzOgorCis6OgorCisJLi4uL3NjcmlwdHMvZ2V0X21haW50YWluZXIucGwKKworVGhpcyBzY3JpcHQgd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgbWFpbnRhaW5lcihzKSBmb3IgYSBnaXZlbiBmaWxlIG9yCitkaXJlY3Rvcnkgd2hlbiBnaXZlbiB0aGUgIi1mIiBvcHRpb24uICBJZiBwYXNzZWQgYSBwYXRjaCBvbiB0aGUKK2NvbW1hbmQgbGluZSwgaXQgd2lsbCBsaXN0IHRoZSBtYWludGFpbmVycyB3aG8gc2hvdWxkIHByb2JhYmx5IHJlY2VpdmUKK2NvcGllcyBvZiB0aGUgcGF0Y2guICBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygb3B0aW9ucyByZWd1bGF0aW5nIGhvdyBoYXJkCitnZXRfbWFpbnRhaW5lci5wbCB3aWxsIHNlYXJjaCBmb3IgbWFpbnRhaW5lcnM7IHBsZWFzZSBiZSBjYXJlZnVsIGFib3V0Cit1c2luZyB0aGUgbW9yZSBhZ2dyZXNzaXZlIG9wdGlvbnMgYXMgeW91IG1heSBlbmQgdXAgaW5jbHVkaW5nIGRldmVsb3BlcnMKK3dobyBoYXZlIG5vIHJlYWwgaW50ZXJlc3QgaW4gdGhlIGNvZGUgeW91IGFyZSBtb2RpZnlpbmcuCisKK0lmIGFsbCBlbHNlIGZhaWxzLCB0YWxraW5nIHRvIEFuZHJldyBNb3J0b24gY2FuIGJlIGFuIGVmZmVjdGl2ZSB3YXkgdG8KK3RyYWNrIGRvd24gYSBtYWludGFpbmVyIGZvciBhIHNwZWNpZmljIHBpZWNlIG9mIGNvZGUuCisKKworV2hlbiB0byBwb3N0PworLS0tLS0tLS0tLS0tLQorCitJZiBwb3NzaWJsZSwgcG9zdGluZyB5b3VyIHBsYW5zIGR1cmluZyB0aGUgZWFybHkgc3RhZ2VzIGNhbiBvbmx5IGJlCitoZWxwZnVsLiAgRGVzY3JpYmUgdGhlIHByb2JsZW0gYmVpbmcgc29sdmVkIGFuZCBhbnkgcGxhbnMgdGhhdCBoYXZlIGJlZW4KK21hZGUgb24gaG93IHRoZSBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGRvbmUuICBBbnkgaW5mb3JtYXRpb24geW91IGNhbgorcHJvdmlkZSBjYW4gaGVscCB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IHByb3ZpZGUgdXNlZnVsIGlucHV0IG9uIHRoZQorcHJvamVjdC4KKworT25lIGRpc2NvdXJhZ2luZyB0aGluZyB3aGljaCBjYW4gaGFwcGVuIGF0IHRoaXMgc3RhZ2UgaXMgbm90IGEgaG9zdGlsZQorcmVhY3Rpb24sIGJ1dCwgaW5zdGVhZCwgbGl0dGxlIG9yIG5vIHJlYWN0aW9uIGF0IGFsbC4gIFRoZSBzYWQgdHJ1dGggb2YgdGhlCittYXR0ZXIgaXMgKDEpIGtlcm5lbCBkZXZlbG9wZXJzIHRlbmQgdG8gYmUgYnVzeSwgKDIpIHRoZXJlIGlzIG5vIHNob3J0YWdlCitvZiBwZW9wbGUgd2l0aCBncmFuZCBwbGFucyBhbmQgbGl0dGxlIGNvZGUgKG9yIGV2ZW4gcHJvc3BlY3Qgb2YgY29kZSkgdG8KK2JhY2sgdGhlbSB1cCwgYW5kICgzKSBub2JvZHkgaXMgb2JsaWdhdGVkIHRvIHJldmlldyBvciBjb21tZW50IG9uIGlkZWFzCitwb3N0ZWQgYnkgb3RoZXJzLiAgQmV5b25kIHRoYXQsIGhpZ2gtbGV2ZWwgZGVzaWducyBvZnRlbiBoaWRlIHByb2JsZW1zCit3aGljaCBhcmUgb25seSByZXZpZXdlZCB3aGVuIHNvbWVib2R5IGFjdHVhbGx5IHRyaWVzIHRvIGltcGxlbWVudCB0aG9zZQorZGVzaWduczsgZm9yIHRoYXQgcmVhc29uLCBrZXJuZWwgZGV2ZWxvcGVycyB3b3VsZCByYXRoZXIgc2VlIHRoZSBjb2RlLgorCitJZiBhIHJlcXVlc3QtZm9yLWNvbW1lbnRzIHBvc3RpbmcgeWllbGRzIGxpdHRsZSBpbiB0aGUgd2F5IG9mIGNvbW1lbnRzLCBkbworbm90IGFzc3VtZSB0aGF0IGl0IG1lYW5zIHRoZXJlIGlzIG5vIGludGVyZXN0IGluIHRoZSBwcm9qZWN0LgorVW5mb3J0dW5hdGVseSwgeW91IGFsc28gY2Fubm90IGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBubyBwcm9ibGVtcyB3aXRoIHlvdXIKK2lkZWEuICBUaGUgYmVzdCB0aGluZyB0byBkbyBpbiB0aGlzIHNpdHVhdGlvbiBpcyB0byBwcm9jZWVkLCBrZWVwaW5nIHRoZQorY29tbXVuaXR5IGluZm9ybWVkIGFzIHlvdSBnby4KKworCitHZXR0aW5nIG9mZmljaWFsIGJ1eS1pbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91ciB3b3JrIGlzIGJlaW5nIGRvbmUgaW4gYSBjb3Jwb3JhdGUgZW52aXJvbm1lbnQgLSBhcyBtb3N0IExpbnV4CitrZXJuZWwgd29yayBpcyAtIHlvdSBtdXN0LCBvYnZpb3VzbHksIGhhdmUgcGVybWlzc2lvbiBmcm9tIHN1aXRhYmx5CitlbXBvd2VyZWQgbWFuYWdlcnMgYmVmb3JlIHlvdSBjYW4gcG9zdCB5b3VyIGNvbXBhbnkncyBwbGFucyBvciBjb2RlIHRvIGEKK3B1YmxpYyBtYWlsaW5nIGxpc3QuICBUaGUgcG9zdGluZyBvZiBjb2RlIHdoaWNoIGhhcyBub3QgYmVlbiBjbGVhcmVkIGZvcgorcmVsZWFzZSB1bmRlciBhIEdQTC1jb21wYXRpYmxlIGxpY2Vuc2UgY2FuIGJlIGVzcGVjaWFsbHkgcHJvYmxlbWF0aWM7IHRoZQorc29vbmVyIHRoYXQgYSBjb21wYW55J3MgbWFuYWdlbWVudCBhbmQgbGVnYWwgc3RhZmYgY2FuIGFncmVlIG9uIHRoZSBwb3N0aW5nCitvZiBhIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9qZWN0LCB0aGUgYmV0dGVyIG9mZiBldmVyeWJvZHkgaW52b2x2ZWQgd2lsbCBiZS4KKworU29tZSByZWFkZXJzIG1heSBiZSB0aGlua2luZyBhdCB0aGlzIHBvaW50IHRoYXQgdGhlaXIga2VybmVsIHdvcmsgaXMKK2ludGVuZGVkIHRvIHN1cHBvcnQgYSBwcm9kdWN0IHdoaWNoIGRvZXMgbm90IHlldCBoYXZlIGFuIG9mZmljaWFsbHkKK2Fja25vd2xlZGdlZCBleGlzdGVuY2UuICBSZXZlYWxpbmcgdGhlaXIgZW1wbG95ZXIncyBwbGFucyBvbiBhIHB1YmxpYworbWFpbGluZyBsaXN0IG1heSBub3QgYmUgYSB2aWFibGUgb3B0aW9uLiAgSW4gY2FzZXMgbGlrZSB0aGlzLCBpdCBpcyB3b3J0aAorY29uc2lkZXJpbmcgd2hldGhlciB0aGUgc2VjcmVjeSBpcyByZWFsbHkgbmVjZXNzYXJ5OyB0aGVyZSBpcyBvZnRlbiBubyByZWFsCituZWVkIHRvIGtlZXAgZGV2ZWxvcG1lbnQgcGxhbnMgYmVoaW5kIGNsb3NlZCBkb29ycy4KKworVGhhdCBzYWlkLCB0aGVyZSBhcmUgYWxzbyBjYXNlcyB3aGVyZSBhIGNvbXBhbnkgbGVnaXRpbWF0ZWx5IGNhbm5vdAorZGlzY2xvc2UgaXRzIHBsYW5zIGVhcmx5IGluIHRoZSBkZXZlbG9wbWVudCBwcm9jZXNzLiAgQ29tcGFuaWVzIHdpdGgKK2V4cGVyaWVuY2VkIGtlcm5lbCBkZXZlbG9wZXJzIG1heSBjaG9vc2UgdG8gcHJvY2VlZCBpbiBhbiBvcGVuLWxvb3AgbWFubmVyCitvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZXkgd2lsbCBiZSBhYmxlIHRvIGF2b2lkIHNlcmlvdXMgaW50ZWdyYXRpb24KK3Byb2JsZW1zIGxhdGVyLiAgRm9yIGNvbXBhbmllcyB3aXRob3V0IHRoYXQgc29ydCBvZiBpbi1ob3VzZSBleHBlcnRpc2UsIHRoZQorYmVzdCBvcHRpb24gaXMgb2Z0ZW4gdG8gaGlyZSBhbiBvdXRzaWRlIGRldmVsb3BlciB0byByZXZpZXcgdGhlIHBsYW5zIHVuZGVyCithIG5vbi1kaXNjbG9zdXJlIGFncmVlbWVudC4gIFRoZSBMaW51eCBGb3VuZGF0aW9uIG9wZXJhdGVzIGFuIE5EQSBwcm9ncmFtCitkZXNpZ25lZCB0byBoZWxwIHdpdGggdGhpcyBzb3J0IG9mIHNpdHVhdGlvbjsgbW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQKK2F0OgorCisgICAgaHR0cDovL3d3dy5saW51eGZvdW5kYXRpb24ub3JnL2VuL05EQV9wcm9ncmFtCisKK1RoaXMga2luZCBvZiByZXZpZXcgaXMgb2Z0ZW4gZW5vdWdoIHRvIGF2b2lkIHNlcmlvdXMgcHJvYmxlbXMgbGF0ZXIgb24KK3dpdGhvdXQgcmVxdWlyaW5nIHB1YmxpYyBkaXNjbG9zdXJlIG9mIHRoZSBwcm9qZWN0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzQuQ29kaW5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTNlZTc3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZworKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi00OiBHRVRUSU5HIFRIRSBDT0RFIFJJR0hUCi0KLVdoaWxlIHRoZXJlIGlzIG11Y2ggdG8gYmUgc2FpZCBmb3IgYSBzb2xpZCBhbmQgY29tbXVuaXR5LW9yaWVudGVkIGRlc2lnbgotcHJvY2VzcywgdGhlIHByb29mIG9mIGFueSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCBpcyBpbiB0aGUgcmVzdWx0aW5nCi1jb2RlLiAgSXQgaXMgdGhlIGNvZGUgd2hpY2ggd2lsbCBiZSBleGFtaW5lZCBieSBvdGhlciBkZXZlbG9wZXJzIGFuZCBtZXJnZWQKLShvciBub3QpIGludG8gdGhlIG1haW5saW5lIHRyZWUuICBTbyBpdCBpcyB0aGUgcXVhbGl0eSBvZiB0aGlzIGNvZGUgd2hpY2gKLXdpbGwgZGV0ZXJtaW5lIHRoZSB1bHRpbWF0ZSBzdWNjZXNzIG9mIHRoZSBwcm9qZWN0LgotCi1UaGlzIHNlY3Rpb24gd2lsbCBleGFtaW5lIHRoZSBjb2RpbmcgcHJvY2Vzcy4gIFdlJ2xsIHN0YXJ0IHdpdGggYSBsb29rIGF0IGEKLW51bWJlciBvZiB3YXlzIGluIHdoaWNoIGtlcm5lbCBkZXZlbG9wZXJzIGNhbiBnbyB3cm9uZy4gIFRoZW4gdGhlIGZvY3VzCi13aWxsIHNoaWZ0IHRvd2FyZCBkb2luZyB0aGluZ3MgcmlnaHQgYW5kIHRoZSB0b29scyB3aGljaCBjYW4gaGVscCBpbiB0aGF0Ci1xdWVzdC4KLQotCi00LjE6IFBJVEZBTExTCi0KLSogQ29kaW5nIHN0eWxlCi0KLVRoZSBrZXJuZWwgaGFzIGxvbmcgaGFkIGEgc3RhbmRhcmQgY29kaW5nIHN0eWxlLCBkZXNjcmliZWQgaW4KLURvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUuICBGb3IgbXVjaCBvZiB0aGF0IHRpbWUsIHRoZSBwb2xpY2llcyBkZXNjcmliZWQKLWluIHRoYXQgZmlsZSB3ZXJlIHRha2VuIGFzIGJlaW5nLCBhdCBtb3N0LCBhZHZpc29yeS4gIEFzIGEgcmVzdWx0LCB0aGVyZSBpcwotYSBzdWJzdGFudGlhbCBhbW91bnQgb2YgY29kZSBpbiB0aGUga2VybmVsIHdoaWNoIGRvZXMgbm90IG1lZXQgdGhlIGNvZGluZwotc3R5bGUgZ3VpZGVsaW5lcy4gIFRoZSBwcmVzZW5jZSBvZiB0aGF0IGNvZGUgbGVhZHMgdG8gdHdvIGluZGVwZW5kZW50Ci1oYXphcmRzIGZvciBrZXJuZWwgZGV2ZWxvcGVycy4KLQotVGhlIGZpcnN0IG9mIHRoZXNlIGlzIHRvIGJlbGlldmUgdGhhdCB0aGUga2VybmVsIGNvZGluZyBzdGFuZGFyZHMgZG8gbm90Ci1tYXR0ZXIgYW5kIGFyZSBub3QgZW5mb3JjZWQuICBUaGUgdHJ1dGggb2YgdGhlIG1hdHRlciBpcyB0aGF0IGFkZGluZyBuZXcKLWNvZGUgdG8gdGhlIGtlcm5lbCBpcyB2ZXJ5IGRpZmZpY3VsdCBpZiB0aGF0IGNvZGUgaXMgbm90IGNvZGVkIGFjY29yZGluZyB0bwotdGhlIHN0YW5kYXJkOyBtYW55IGRldmVsb3BlcnMgd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvZGUgYmUgcmVmb3JtYXR0ZWQKLWJlZm9yZSB0aGV5IHdpbGwgZXZlbiByZXZpZXcgaXQuICBBIGNvZGUgYmFzZSBhcyBsYXJnZSBhcyB0aGUga2VybmVsCi1yZXF1aXJlcyBzb21lIHVuaWZvcm1pdHkgb2YgY29kZSB0byBtYWtlIGl0IHBvc3NpYmxlIGZvciBkZXZlbG9wZXJzIHRvCi1xdWlja2x5IHVuZGVyc3RhbmQgYW55IHBhcnQgb2YgaXQuICBTbyB0aGVyZSBpcyBubyBsb25nZXIgcm9vbSBmb3IKLXN0cmFuZ2VseS1mb3JtYXR0ZWQgY29kZS4KLQotT2NjYXNpb25hbGx5LCB0aGUga2VybmVsJ3MgY29kaW5nIHN0eWxlIHdpbGwgcnVuIGludG8gY29uZmxpY3Qgd2l0aCBhbgotZW1wbG95ZXIncyBtYW5kYXRlZCBzdHlsZS4gIEluIHN1Y2ggY2FzZXMsIHRoZSBrZXJuZWwncyBzdHlsZSB3aWxsIGhhdmUgdG8KLXdpbiBiZWZvcmUgdGhlIGNvZGUgY2FuIGJlIG1lcmdlZC4gIFB1dHRpbmcgY29kZSBpbnRvIHRoZSBrZXJuZWwgbWVhbnMKLWdpdmluZyB1cCBhIGRlZ3JlZSBvZiBjb250cm9sIGluIGEgbnVtYmVyIG9mIHdheXMgLSBpbmNsdWRpbmcgY29udHJvbCBvdmVyCi1ob3cgdGhlIGNvZGUgaXMgZm9ybWF0dGVkLgotCi1UaGUgb3RoZXIgdHJhcCBpcyB0byBhc3N1bWUgdGhhdCBjb2RlIHdoaWNoIGlzIGFscmVhZHkgaW4gdGhlIGtlcm5lbCBpcwotdXJnZW50bHkgaW4gbmVlZCBvZiBjb2Rpbmcgc3R5bGUgZml4ZXMuICBEZXZlbG9wZXJzIG1heSBzdGFydCB0byBnZW5lcmF0ZQotcmVmb3JtYXR0aW5nIHBhdGNoZXMgYXMgYSB3YXkgb2YgZ2FpbmluZyBmYW1pbGlhcml0eSB3aXRoIHRoZSBwcm9jZXNzLCBvcgotYXMgYSB3YXkgb2YgZ2V0dGluZyB0aGVpciBuYW1lIGludG8gdGhlIGtlcm5lbCBjaGFuZ2Vsb2dzIC0gb3IgYm90aC4gIEJ1dAotcHVyZSBjb2Rpbmcgc3R5bGUgZml4ZXMgYXJlIHNlZW4gYXMgbm9pc2UgYnkgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eTsKLXRoZXkgdGVuZCB0byBnZXQgYSBjaGlsbHkgcmVjZXB0aW9uLiAgU28gdGhpcyB0eXBlIG9mIHBhdGNoIGlzIGJlc3QKLWF2b2lkZWQuICBJdCBpcyBuYXR1cmFsIHRvIGZpeCB0aGUgc3R5bGUgb2YgYSBwaWVjZSBvZiBjb2RlIHdoaWxlIHdvcmtpbmcKLW9uIGl0IGZvciBvdGhlciByZWFzb25zLCBidXQgY29kaW5nIHN0eWxlIGNoYW5nZXMgc2hvdWxkIG5vdCBiZSBtYWRlIGZvcgotdGhlaXIgb3duIHNha2UuCi0KLVRoZSBjb2Rpbmcgc3R5bGUgZG9jdW1lbnQgYWxzbyBzaG91bGQgbm90IGJlIHJlYWQgYXMgYW4gYWJzb2x1dGUgbGF3IHdoaWNoCi1jYW4gbmV2ZXIgYmUgdHJhbnNncmVzc2VkLiAgSWYgdGhlcmUgaXMgYSBnb29kIHJlYXNvbiB0byBnbyBhZ2FpbnN0IHRoZQotc3R5bGUgKGEgbGluZSB3aGljaCBiZWNvbWVzIGZhciBsZXNzIHJlYWRhYmxlIGlmIHNwbGl0IHRvIGZpdCB3aXRoaW4gdGhlCi04MC1jb2x1bW4gbGltaXQsIGZvciBleGFtcGxlKSwganVzdCBkbyBpdC4KLQotCi0qIEFic3RyYWN0aW9uIGxheWVycwotCi1Db21wdXRlciBTY2llbmNlIHByb2Zlc3NvcnMgdGVhY2ggc3R1ZGVudHMgdG8gbWFrZSBleHRlbnNpdmUgdXNlIG9mCi1hYnN0cmFjdGlvbiBsYXllcnMgaW4gdGhlIG5hbWUgb2YgZmxleGliaWxpdHkgYW5kIGluZm9ybWF0aW9uIGhpZGluZy4KLUNlcnRhaW5seSB0aGUga2VybmVsIG1ha2VzIGV4dGVuc2l2ZSB1c2Ugb2YgYWJzdHJhY3Rpb247IG5vIHByb2plY3QKLWludm9sdmluZyBzZXZlcmFsIG1pbGxpb24gbGluZXMgb2YgY29kZSBjb3VsZCBkbyBvdGhlcndpc2UgYW5kIHN1cnZpdmUuCi1CdXQgZXhwZXJpZW5jZSBoYXMgc2hvd24gdGhhdCBleGNlc3NpdmUgb3IgcHJlbWF0dXJlIGFic3RyYWN0aW9uIGNhbiBiZQotanVzdCBhcyBoYXJtZnVsIGFzIHByZW1hdHVyZSBvcHRpbWl6YXRpb24uICBBYnN0cmFjdGlvbiBzaG91bGQgYmUgdXNlZCB0bwotdGhlIGxldmVsIHJlcXVpcmVkIGFuZCBubyBmdXJ0aGVyLgotCi1BdCBhIHNpbXBsZSBsZXZlbCwgY29uc2lkZXIgYSBmdW5jdGlvbiB3aGljaCBoYXMgYW4gYXJndW1lbnQgd2hpY2ggaXMKLWFsd2F5cyBwYXNzZWQgYXMgemVybyBieSBhbGwgY2FsbGVycy4gIE9uZSBjb3VsZCByZXRhaW4gdGhhdCBhcmd1bWVudCBqdXN0Ci1pbiBjYXNlIHNvbWVib2R5IGV2ZW50dWFsbHkgbmVlZHMgdG8gdXNlIHRoZSBleHRyYSBmbGV4aWJpbGl0eSB0aGF0IGl0Ci1wcm92aWRlcy4gIEJ5IHRoYXQgdGltZSwgdGhvdWdoLCBjaGFuY2VzIGFyZSBnb29kIHRoYXQgdGhlIGNvZGUgd2hpY2gKLWltcGxlbWVudHMgdGhpcyBleHRyYSBhcmd1bWVudCBoYXMgYmVlbiBicm9rZW4gaW4gc29tZSBzdWJ0bGUgd2F5IHdoaWNoIHdhcwotbmV2ZXIgbm90aWNlZCAtIGJlY2F1c2UgaXQgaGFzIG5ldmVyIGJlZW4gdXNlZC4gIE9yLCB3aGVuIHRoZSBuZWVkIGZvcgotZXh0cmEgZmxleGliaWxpdHkgYXJpc2VzLCBpdCBkb2VzIG5vdCBkbyBzbyBpbiBhIHdheSB3aGljaCBtYXRjaGVzIHRoZQotcHJvZ3JhbW1lcidzIGVhcmx5IGV4cGVjdGF0aW9uLiAgS2VybmVsIGRldmVsb3BlcnMgd2lsbCByb3V0aW5lbHkgc3VibWl0Ci1wYXRjaGVzIHRvIHJlbW92ZSB1bnVzZWQgYXJndW1lbnRzOyB0aGV5IHNob3VsZCwgaW4gZ2VuZXJhbCwgbm90IGJlIGFkZGVkCi1pbiB0aGUgZmlyc3QgcGxhY2UuCi0KLUFic3RyYWN0aW9uIGxheWVycyB3aGljaCBoaWRlIGFjY2VzcyB0byBoYXJkd2FyZSAtIG9mdGVuIHRvIGFsbG93IHRoZSBidWxrCi1vZiBhIGRyaXZlciB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgb3BlcmF0aW5nIHN5c3RlbXMgLSBhcmUgZXNwZWNpYWxseQotZnJvd25lZCB1cG9uLiAgU3VjaCBsYXllcnMgb2JzY3VyZSB0aGUgY29kZSBhbmQgbWF5IGltcG9zZSBhIHBlcmZvcm1hbmNlCi1wZW5hbHR5OyB0aGV5IGRvIG5vdCBiZWxvbmcgaW4gdGhlIExpbnV4IGtlcm5lbC4KLQotT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBmaW5kIHlvdXJzZWxmIGNvcHlpbmcgc2lnbmlmaWNhbnQgYW1vdW50cyBvZiBjb2RlCi1mcm9tIGFub3RoZXIga2VybmVsIHN1YnN5c3RlbSwgaXQgaXMgdGltZSB0byBhc2sgd2hldGhlciBpdCB3b3VsZCwgaW4gZmFjdCwKLW1ha2Ugc2Vuc2UgdG8gcHVsbCBvdXQgc29tZSBvZiB0aGF0IGNvZGUgaW50byBhIHNlcGFyYXRlIGxpYnJhcnkgb3IgdG8KLWltcGxlbWVudCB0aGF0IGZ1bmN0aW9uYWxpdHkgYXQgYSBoaWdoZXIgbGV2ZWwuICBUaGVyZSBpcyBubyB2YWx1ZSBpbgotcmVwbGljYXRpbmcgdGhlIHNhbWUgY29kZSB0aHJvdWdob3V0IHRoZSBrZXJuZWwuCi0KLQotKiAjaWZkZWYgYW5kIHByZXByb2Nlc3NvciB1c2UgaW4gZ2VuZXJhbAotCi1UaGUgQyBwcmVwcm9jZXNzb3Igc2VlbXMgdG8gcHJlc2VudCBhIHBvd2VyZnVsIHRlbXB0YXRpb24gdG8gc29tZSBDCi1wcm9ncmFtbWVycywgd2hvIHNlZSBpdCBhcyBhIHdheSB0byBlZmZpY2llbnRseSBlbmNvZGUgYSBncmVhdCBkZWFsIG9mCi1mbGV4aWJpbGl0eSBpbnRvIGEgc291cmNlIGZpbGUuICBCdXQgdGhlIHByZXByb2Nlc3NvciBpcyBub3QgQywgYW5kIGhlYXZ5Ci11c2Ugb2YgaXQgcmVzdWx0cyBpbiBjb2RlIHdoaWNoIGlzIG11Y2ggaGFyZGVyIGZvciBvdGhlcnMgdG8gcmVhZCBhbmQKLWhhcmRlciBmb3IgdGhlIGNvbXBpbGVyIHRvIGNoZWNrIGZvciBjb3JyZWN0bmVzcy4gIEhlYXZ5IHByZXByb2Nlc3NvciB1c2UKLWlzIGFsbW9zdCBhbHdheXMgYSBzaWduIG9mIGNvZGUgd2hpY2ggbmVlZHMgc29tZSBjbGVhbnVwIHdvcmsuCi0KLUNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpdGggI2lmZGVmIGlzLCBpbmRlZWQsIGEgcG93ZXJmdWwgZmVhdHVyZSwgYW5kIGl0Ci1pcyB1c2VkIHdpdGhpbiB0aGUga2VybmVsLiAgQnV0IHRoZXJlIGlzIGxpdHRsZSBkZXNpcmUgdG8gc2VlIGNvZGUgd2hpY2ggaXMKLXNwcmlua2xlZCBsaWJlcmFsbHkgd2l0aCAjaWZkZWYgYmxvY2tzLiAgQXMgYSBnZW5lcmFsIHJ1bGUsICNpZmRlZiB1c2UKLXNob3VsZCBiZSBjb25maW5lZCB0byBoZWFkZXIgZmlsZXMgd2hlbmV2ZXIgcG9zc2libGUuCi1Db25kaXRpb25hbGx5LWNvbXBpbGVkIGNvZGUgY2FuIGJlIGNvbmZpbmVkIHRvIGZ1bmN0aW9ucyB3aGljaCwgaWYgdGhlIGNvZGUKLWlzIG5vdCB0byBiZSBwcmVzZW50LCBzaW1wbHkgYmVjb21lIGVtcHR5LiAgVGhlIGNvbXBpbGVyIHdpbGwgdGhlbiBxdWlldGx5Ci1vcHRpbWl6ZSBvdXQgdGhlIGNhbGwgdG8gdGhlIGVtcHR5IGZ1bmN0aW9uLiAgVGhlIHJlc3VsdCBpcyBmYXIgY2xlYW5lcgotY29kZSB3aGljaCBpcyBlYXNpZXIgdG8gZm9sbG93LgotCi1DIHByZXByb2Nlc3NvciBtYWNyb3MgcHJlc2VudCBhIG51bWJlciBvZiBoYXphcmRzLCBpbmNsdWRpbmcgcG9zc2libGUKLW11bHRpcGxlIGV2YWx1YXRpb24gb2YgZXhwcmVzc2lvbnMgd2l0aCBzaWRlIGVmZmVjdHMgYW5kIG5vIHR5cGUgc2FmZXR5LgotSWYgeW91IGFyZSB0ZW1wdGVkIHRvIGRlZmluZSBhIG1hY3JvLCBjb25zaWRlciBjcmVhdGluZyBhbiBpbmxpbmUgZnVuY3Rpb24KLWluc3RlYWQuICBUaGUgY29kZSB3aGljaCByZXN1bHRzIHdpbGwgYmUgdGhlIHNhbWUsIGJ1dCBpbmxpbmUgZnVuY3Rpb25zIGFyZQotZWFzaWVyIHRvIHJlYWQsIGRvIG5vdCBldmFsdWF0ZSB0aGVpciBhcmd1bWVudHMgbXVsdGlwbGUgdGltZXMsIGFuZCBhbGxvdwotdGhlIGNvbXBpbGVyIHRvIHBlcmZvcm0gdHlwZSBjaGVja2luZyBvbiB0aGUgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWUuCi0KLQotKiBJbmxpbmUgZnVuY3Rpb25zCi0KLUlubGluZSBmdW5jdGlvbnMgcHJlc2VudCBhIGhhemFyZCBvZiB0aGVpciBvd24sIHRob3VnaC4gIFByb2dyYW1tZXJzIGNhbgotYmVjb21lIGVuYW1vcmVkIG9mIHRoZSBwZXJjZWl2ZWQgZWZmaWNpZW5jeSBpbmhlcmVudCBpbiBhdm9pZGluZyBhIGZ1bmN0aW9uCi1jYWxsIGFuZCBmaWxsIGEgc291cmNlIGZpbGUgd2l0aCBpbmxpbmUgZnVuY3Rpb25zLiAgVGhvc2UgZnVuY3Rpb25zLAotaG93ZXZlciwgY2FuIGFjdHVhbGx5IHJlZHVjZSBwZXJmb3JtYW5jZS4gIFNpbmNlIHRoZWlyIGNvZGUgaXMgcmVwbGljYXRlZAotYXQgZWFjaCBjYWxsIHNpdGUsIHRoZXkgZW5kIHVwIGJsb2F0aW5nIHRoZSBzaXplIG9mIHRoZSBjb21waWxlZCBrZXJuZWwuCi1UaGF0LCBpbiB0dXJuLCBjcmVhdGVzIHByZXNzdXJlIG9uIHRoZSBwcm9jZXNzb3IncyBtZW1vcnkgY2FjaGVzLCB3aGljaCBjYW4KLXNsb3cgZXhlY3V0aW9uIGRyYW1hdGljYWxseS4gIElubGluZSBmdW5jdGlvbnMsIGFzIGEgcnVsZSwgc2hvdWxkIGJlIHF1aXRlCi1zbWFsbCBhbmQgcmVsYXRpdmVseSByYXJlLiAgVGhlIGNvc3Qgb2YgYSBmdW5jdGlvbiBjYWxsLCBhZnRlciBhbGwsIGlzIG5vdAotdGhhdCBoaWdoOyB0aGUgY3JlYXRpb24gb2YgbGFyZ2UgbnVtYmVycyBvZiBpbmxpbmUgZnVuY3Rpb25zIGlzIGEgY2xhc3NpYwotZXhhbXBsZSBvZiBwcmVtYXR1cmUgb3B0aW1pemF0aW9uLgotCi1JbiBnZW5lcmFsLCBrZXJuZWwgcHJvZ3JhbW1lcnMgaWdub3JlIGNhY2hlIGVmZmVjdHMgYXQgdGhlaXIgcGVyaWwuICBUaGUKLWNsYXNzaWMgdGltZS9zcGFjZSB0cmFkZW9mZiB0YXVnaHQgaW4gYmVnaW5uaW5nIGRhdGEgc3RydWN0dXJlcyBjbGFzc2VzCi1vZnRlbiBkb2VzIG5vdCBhcHBseSB0byBjb250ZW1wb3JhcnkgaGFyZHdhcmUuICBTcGFjZSAqaXMqIHRpbWUsIGluIHRoYXQgYQotbGFyZ2VyIHByb2dyYW0gd2lsbCBydW4gc2xvd2VyIHRoYW4gb25lIHdoaWNoIGlzIG1vcmUgY29tcGFjdC4KLQotTW9yZSByZWNlbnQgY29tcGlsZXJzIHRha2UgYW4gaW5jcmVhc2luZ2x5IGFjdGl2ZSByb2xlIGluIGRlY2lkaW5nIHdoZXRoZXIKLWEgZ2l2ZW4gZnVuY3Rpb24gc2hvdWxkIGFjdHVhbGx5IGJlIGlubGluZWQgb3Igbm90LiAgU28gdGhlIGxpYmVyYWwKLXBsYWNlbWVudCBvZiAiaW5saW5lIiBrZXl3b3JkcyBtYXkgbm90IGp1c3QgYmUgZXhjZXNzaXZlOyBpdCBjb3VsZCBhbHNvIGJlCi1pcnJlbGV2YW50LgotCi0KLSogTG9ja2luZwotCi1JbiBNYXksIDIwMDYsIHRoZSAiRGV2aWNlc2NhcGUiIG5ldHdvcmtpbmcgc3RhY2sgd2FzLCB3aXRoIGdyZWF0Ci1mYW5mYXJlLCByZWxlYXNlZCB1bmRlciB0aGUgR1BMIGFuZCBtYWRlIGF2YWlsYWJsZSBmb3IgaW5jbHVzaW9uIGluIHRoZQotbWFpbmxpbmUga2VybmVsLiAgVGhpcyBkb25hdGlvbiB3YXMgd2VsY29tZSBuZXdzOyBzdXBwb3J0IGZvciB3aXJlbGVzcwotbmV0d29ya2luZyBpbiBMaW51eCB3YXMgY29uc2lkZXJlZCBzdWJzdGFuZGFyZCBhdCBiZXN0LCBhbmQgdGhlIERldmljZXNjYXBlCi1zdGFjayBvZmZlcmVkIHRoZSBwcm9taXNlIG9mIGZpeGluZyB0aGF0IHNpdHVhdGlvbi4gIFlldCwgdGhpcyBjb2RlIGRpZCBub3QKLWFjdHVhbGx5IG1ha2UgaXQgaW50byB0aGUgbWFpbmxpbmUgdW50aWwgSnVuZSwgMjAwNyAoMi42LjIyKS4gIFdoYXQKLWhhcHBlbmVkPwotCi1UaGlzIGNvZGUgc2hvd2VkIGEgbnVtYmVyIG9mIHNpZ25zIG9mIGhhdmluZyBiZWVuIGRldmVsb3BlZCBiZWhpbmQKLWNvcnBvcmF0ZSBkb29ycy4gIEJ1dCBvbmUgbGFyZ2UgcHJvYmxlbSBpbiBwYXJ0aWN1bGFyIHdhcyB0aGF0IGl0IHdhcyBub3QKLWRlc2lnbmVkIHRvIHdvcmsgb24gbXVsdGlwcm9jZXNzb3Igc3lzdGVtcy4gIEJlZm9yZSB0aGlzIG5ldHdvcmtpbmcgc3RhY2sKLShub3cgY2FsbGVkIG1hYzgwMjExKSBjb3VsZCBiZSBtZXJnZWQsIGEgbG9ja2luZyBzY2hlbWUgbmVlZGVkIHRvIGJlCi1yZXRyb2ZpdHRlZCBvbnRvIGl0LiAgCi0KLU9uY2UgdXBvbiBhIHRpbWUsIExpbnV4IGtlcm5lbCBjb2RlIGNvdWxkIGJlIGRldmVsb3BlZCB3aXRob3V0IHRoaW5raW5nCi1hYm91dCB0aGUgY29uY3VycmVuY3kgaXNzdWVzIHByZXNlbnRlZCBieSBtdWx0aXByb2Nlc3NvciBzeXN0ZW1zLiAgTm93LAotaG93ZXZlciwgdGhpcyBkb2N1bWVudCBpcyBiZWluZyB3cml0dGVuIG9uIGEgZHVhbC1jb3JlIGxhcHRvcC4gIEV2ZW4gb24KLXNpbmdsZS1wcm9jZXNzb3Igc3lzdGVtcywgd29yayBiZWluZyBkb25lIHRvIGltcHJvdmUgcmVzcG9uc2l2ZW5lc3Mgd2lsbAotcmFpc2UgdGhlIGxldmVsIG9mIGNvbmN1cnJlbmN5IHdpdGhpbiB0aGUga2VybmVsLiAgVGhlIGRheXMgd2hlbiBrZXJuZWwKLWNvZGUgY291bGQgYmUgd3JpdHRlbiB3aXRob3V0IHRoaW5raW5nIGFib3V0IGxvY2tpbmcgYXJlIGxvbmcgcGFzdC4KLQotQW55IHJlc291cmNlIChkYXRhIHN0cnVjdHVyZXMsIGhhcmR3YXJlIHJlZ2lzdGVycywgZXRjLikgd2hpY2ggY291bGQgYmUKLWFjY2Vzc2VkIGNvbmN1cnJlbnRseSBieSBtb3JlIHRoYW4gb25lIHRocmVhZCBtdXN0IGJlIHByb3RlY3RlZCBieSBhIGxvY2suCi1OZXcgY29kZSBzaG91bGQgYmUgd3JpdHRlbiB3aXRoIHRoaXMgcmVxdWlyZW1lbnQgaW4gbWluZDsgcmV0cm9maXR0aW5nCi1sb2NraW5nIGFmdGVyIHRoZSBmYWN0IGlzIGEgcmF0aGVyIG1vcmUgZGlmZmljdWx0IHRhc2suICBLZXJuZWwgZGV2ZWxvcGVycwotc2hvdWxkIHRha2UgdGhlIHRpbWUgdG8gdW5kZXJzdGFuZCB0aGUgYXZhaWxhYmxlIGxvY2tpbmcgcHJpbWl0aXZlcyB3ZWxsCi1lbm91Z2ggdG8gcGljayB0aGUgcmlnaHQgdG9vbCBmb3IgdGhlIGpvYi4gIENvZGUgd2hpY2ggc2hvd3MgYSBsYWNrIG9mCi1hdHRlbnRpb24gdG8gY29uY3VycmVuY3kgd2lsbCBoYXZlIGEgZGlmZmljdWx0IHBhdGggaW50byB0aGUgbWFpbmxpbmUuCi0KLQotKiBSZWdyZXNzaW9ucwotCi1PbmUgZmluYWwgaGF6YXJkIHdvcnRoIG1lbnRpb25pbmcgaXMgdGhpczogaXQgY2FuIGJlIHRlbXB0aW5nIHRvIG1ha2UgYQotY2hhbmdlICh3aGljaCBtYXkgYnJpbmcgYmlnIGltcHJvdmVtZW50cykgd2hpY2ggY2F1c2VzIHNvbWV0aGluZyB0byBicmVhawotZm9yIGV4aXN0aW5nIHVzZXJzLiAgVGhpcyBraW5kIG9mIGNoYW5nZSBpcyBjYWxsZWQgYSAicmVncmVzc2lvbiwiIGFuZAotcmVncmVzc2lvbnMgaGF2ZSBiZWNvbWUgbW9zdCB1bndlbGNvbWUgaW4gdGhlIG1haW5saW5lIGtlcm5lbC4gIFdpdGggZmV3Ci1leGNlcHRpb25zLCBjaGFuZ2VzIHdoaWNoIGNhdXNlIHJlZ3Jlc3Npb25zIHdpbGwgYmUgYmFja2VkIG91dCBpZiB0aGUKLXJlZ3Jlc3Npb24gY2Fubm90IGJlIGZpeGVkIGluIGEgdGltZWx5IG1hbm5lci4gIEZhciBiZXR0ZXIgdG8gYXZvaWQgdGhlCi1yZWdyZXNzaW9uIGluIHRoZSBmaXJzdCBwbGFjZS4KLQotSXQgaXMgb2Z0ZW4gYXJndWVkIHRoYXQgYSByZWdyZXNzaW9uIGNhbiBiZSBqdXN0aWZpZWQgaWYgaXQgY2F1c2VzIHRoaW5ncwotdG8gd29yayBmb3IgbW9yZSBwZW9wbGUgdGhhbiBpdCBjcmVhdGVzIHByb2JsZW1zIGZvci4gIFdoeSBub3QgbWFrZSBhCi1jaGFuZ2UgaWYgaXQgYnJpbmdzIG5ldyBmdW5jdGlvbmFsaXR5IHRvIHRlbiBzeXN0ZW1zIGZvciBlYWNoIG9uZSBpdAotYnJlYWtzPyAgVGhlIGJlc3QgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd2FzIGV4cHJlc3NlZCBieSBMaW51cyBpbiBKdWx5LAotMjAwNzoKLQotCVNvIHdlIGRvbid0IGZpeCBidWdzIGJ5IGludHJvZHVjaW5nIG5ldyBwcm9ibGVtcy4gIFRoYXQgd2F5IGxpZXMKLQltYWRuZXNzLCBhbmQgbm9ib2R5IGV2ZXIga25vd3MgaWYgeW91IGFjdHVhbGx5IG1ha2UgYW55IHJlYWwKLQlwcm9ncmVzcyBhdCBhbGwuIElzIGl0IHR3byBzdGVwcyBmb3J3YXJkcywgb25lIHN0ZXAgYmFjaywgb3Igb25lCi0Jc3RlcCBmb3J3YXJkIGFuZCB0d28gc3RlcHMgYmFjaz8KLQotKGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzI0MzQ2MC8pLgotCi1BbiBlc3BlY2lhbGx5IHVud2VsY29tZSB0eXBlIG9mIHJlZ3Jlc3Npb24gaXMgYW55IHNvcnQgb2YgY2hhbmdlIHRvIHRoZQotdXNlci1zcGFjZSBBQkkuICBPbmNlIGFuIGludGVyZmFjZSBoYXMgYmVlbiBleHBvcnRlZCB0byB1c2VyIHNwYWNlLCBpdCBtdXN0Ci1iZSBzdXBwb3J0ZWQgaW5kZWZpbml0ZWx5LiAgVGhpcyBmYWN0IG1ha2VzIHRoZSBjcmVhdGlvbiBvZiB1c2VyLXNwYWNlCi1pbnRlcmZhY2VzIHBhcnRpY3VsYXJseSBjaGFsbGVuZ2luZzogc2luY2UgdGhleSBjYW5ub3QgYmUgY2hhbmdlZCBpbgotaW5jb21wYXRpYmxlIHdheXMsIHRoZXkgbXVzdCBiZSBkb25lIHJpZ2h0IHRoZSBmaXJzdCB0aW1lLiAgRm9yIHRoaXMKLXJlYXNvbiwgYSBncmVhdCBkZWFsIG9mIHRob3VnaHQsIGNsZWFyIGRvY3VtZW50YXRpb24sIGFuZCB3aWRlIHJldmlldyBmb3IKLXVzZXItc3BhY2UgaW50ZXJmYWNlcyBpcyBhbHdheXMgcmVxdWlyZWQuCi0KLQotCi00LjI6IENPREUgQ0hFQ0tJTkcgVE9PTFMKLQotRm9yIG5vdywgYXQgbGVhc3QsIHRoZSB3cml0aW5nIG9mIGVycm9yLWZyZWUgY29kZSByZW1haW5zIGFuIGlkZWFsIHRoYXQgZmV3Ci1vZiB1cyBjYW4gcmVhY2guICBXaGF0IHdlIGNhbiBob3BlIHRvIGRvLCB0aG91Z2gsIGlzIHRvIGNhdGNoIGFuZCBmaXggYXMKLW1hbnkgb2YgdGhvc2UgZXJyb3JzIGFzIHBvc3NpYmxlIGJlZm9yZSBvdXIgY29kZSBnb2VzIGludG8gdGhlIG1haW5saW5lCi1rZXJuZWwuICBUbyB0aGF0IGVuZCwgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIGhhdmUgcHV0IHRvZ2V0aGVyIGFuIGltcHJlc3NpdmUKLWFycmF5IG9mIHRvb2xzIHdoaWNoIGNhbiBjYXRjaCBhIHdpZGUgdmFyaWV0eSBvZiBvYnNjdXJlIHByb2JsZW1zIGluIGFuCi1hdXRvbWF0ZWQgd2F5LiAgQW55IHByb2JsZW0gY2F1Z2h0IGJ5IHRoZSBjb21wdXRlciBpcyBhIHByb2JsZW0gd2hpY2ggd2lsbAotbm90IGFmZmxpY3QgYSB1c2VyIGxhdGVyIG9uLCBzbyBpdCBzdGFuZHMgdG8gcmVhc29uIHRoYXQgdGhlIGF1dG9tYXRlZAotdG9vbHMgc2hvdWxkIGJlIHVzZWQgd2hlbmV2ZXIgcG9zc2libGUuCi0KLVRoZSBmaXJzdCBzdGVwIGlzIHNpbXBseSB0byBoZWVkIHRoZSB3YXJuaW5ncyBwcm9kdWNlZCBieSB0aGUgY29tcGlsZXIuCi1Db250ZW1wb3JhcnkgdmVyc2lvbnMgb2YgZ2NjIGNhbiBkZXRlY3QgKGFuZCB3YXJuIGFib3V0KSBhIGxhcmdlIG51bWJlciBvZgotcG90ZW50aWFsIGVycm9ycy4gIFF1aXRlIG9mdGVuLCB0aGVzZSB3YXJuaW5ncyBwb2ludCB0byByZWFsIHByb2JsZW1zLgotQ29kZSBzdWJtaXR0ZWQgZm9yIHJldmlldyBzaG91bGQsIGFzIGEgcnVsZSwgbm90IHByb2R1Y2UgYW55IGNvbXBpbGVyCi13YXJuaW5ncy4gIFdoZW4gc2lsZW5jaW5nIHdhcm5pbmdzLCB0YWtlIGNhcmUgdG8gdW5kZXJzdGFuZCB0aGUgcmVhbCBjYXVzZQotYW5kIHRyeSB0byBhdm9pZCAiZml4ZXMiIHdoaWNoIG1ha2UgdGhlIHdhcm5pbmcgZ28gYXdheSB3aXRob3V0IGFkZHJlc3NpbmcKLWl0cyBjYXVzZS4KLQotTm90ZSB0aGF0IG5vdCBhbGwgY29tcGlsZXIgd2FybmluZ3MgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gIEJ1aWxkIHRoZQota2VybmVsIHdpdGggIm1ha2UgRVhUUkFfQ0ZMQUdTPS1XIiB0byBnZXQgdGhlIGZ1bGwgc2V0LgotCi1UaGUga2VybmVsIHByb3ZpZGVzIHNldmVyYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIHdoaWNoIHR1cm4gb24gZGVidWdnaW5nCi1mZWF0dXJlczsgbW9zdCBvZiB0aGVzZSBhcmUgZm91bmQgaW4gdGhlICJrZXJuZWwgaGFja2luZyIgc3VibWVudS4gIFNldmVyYWwKLW9mIHRoZXNlIG9wdGlvbnMgc2hvdWxkIGJlIHR1cm5lZCBvbiBmb3IgYW55IGtlcm5lbCB1c2VkIGZvciBkZXZlbG9wbWVudCBvcgotdGVzdGluZyBwdXJwb3Nlcy4gIEluIHBhcnRpY3VsYXIsIHlvdSBzaG91bGQgdHVybiBvbjoKLQotIC0gRU5BQkxFX1dBUk5fREVQUkVDQVRFRCwgRU5BQkxFX01VU1RfQ0hFQ0ssIGFuZCBGUkFNRV9XQVJOIHRvIGdldCBhbgotICAgZXh0cmEgc2V0IG9mIHdhcm5pbmdzIGZvciBwcm9ibGVtcyBsaWtlIHRoZSB1c2Ugb2YgZGVwcmVjYXRlZCBpbnRlcmZhY2VzCi0gICBvciBpZ25vcmluZyBhbiBpbXBvcnRhbnQgcmV0dXJuIHZhbHVlIGZyb20gYSBmdW5jdGlvbi4gIFRoZSBvdXRwdXQKLSAgIGdlbmVyYXRlZCBieSB0aGVzZSB3YXJuaW5ncyBjYW4gYmUgdmVyYm9zZSwgYnV0IG9uZSBuZWVkIG5vdCB3b3JyeSBhYm91dAotICAgd2FybmluZ3MgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLgotCi0gLSBERUJVR19PQkpFQ1RTIHdpbGwgYWRkIGNvZGUgdG8gdHJhY2sgdGhlIGxpZmV0aW1lIG9mIHZhcmlvdXMgb2JqZWN0cwotICAgY3JlYXRlZCBieSB0aGUga2VybmVsIGFuZCB3YXJuIHdoZW4gdGhpbmdzIGFyZSBkb25lIG91dCBvZiBvcmRlci4gIElmCi0gICB5b3UgYXJlIGFkZGluZyBhIHN1YnN5c3RlbSB3aGljaCBjcmVhdGVzIChhbmQgZXhwb3J0cykgY29tcGxleCBvYmplY3RzCi0gICBvZiBpdHMgb3duLCBjb25zaWRlciBhZGRpbmcgc3VwcG9ydCBmb3IgdGhlIG9iamVjdCBkZWJ1Z2dpbmcKLSAgIGluZnJhc3RydWN0dXJlLgotCi0gLSBERUJVR19TTEFCIGNhbiBmaW5kIGEgdmFyaWV0eSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgdXNlIGVycm9yczsgaXQKLSAgIHNob3VsZCBiZSB1c2VkIG9uIG1vc3QgZGV2ZWxvcG1lbnQga2VybmVscy4KLQotIC0gREVCVUdfU1BJTkxPQ0ssIERFQlVHX0FUT01JQ19TTEVFUCwgYW5kIERFQlVHX01VVEVYRVMgd2lsbCBmaW5kIGEKLSAgIG51bWJlciBvZiBjb21tb24gbG9ja2luZyBlcnJvcnMuCi0KLVRoZXJlIGFyZSBxdWl0ZSBhIGZldyBvdGhlciBkZWJ1Z2dpbmcgb3B0aW9ucywgc29tZSBvZiB3aGljaCB3aWxsIGJlCi1kaXNjdXNzZWQgYmVsb3cuICBTb21lIG9mIHRoZW0gaGF2ZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBhbmQKLXNob3VsZCBub3QgYmUgdXNlZCBhbGwgb2YgdGhlIHRpbWUuICBCdXQgc29tZSB0aW1lIHNwZW50IGxlYXJuaW5nIHRoZQotYXZhaWxhYmxlIG9wdGlvbnMgd2lsbCBsaWtlbHkgYmUgcGFpZCBiYWNrIG1hbnkgdGltZXMgb3ZlciBpbiBzaG9ydCBvcmRlci4gCi0KLU9uZSBvZiB0aGUgaGVhdmllciBkZWJ1Z2dpbmcgdG9vbHMgaXMgdGhlIGxvY2tpbmcgY2hlY2tlciwgb3IgImxvY2tkZXAuIgotVGhpcyB0b29sIHdpbGwgdHJhY2sgdGhlIGFjcXVpc2l0aW9uIGFuZCByZWxlYXNlIG9mIGV2ZXJ5IGxvY2sgKHNwaW5sb2NrIG9yCi1tdXRleCkgaW4gdGhlIHN5c3RlbSwgdGhlIG9yZGVyIGluIHdoaWNoIGxvY2tzIGFyZSBhY3F1aXJlZCByZWxhdGl2ZSB0bwotZWFjaCBvdGhlciwgdGhlIGN1cnJlbnQgaW50ZXJydXB0IGVudmlyb25tZW50LCBhbmQgbW9yZS4gIEl0IGNhbiB0aGVuCi1lbnN1cmUgdGhhdCBsb2NrcyBhcmUgYWx3YXlzIGFjcXVpcmVkIGluIHRoZSBzYW1lIG9yZGVyLCB0aGF0IHRoZSBzYW1lCi1pbnRlcnJ1cHQgYXNzdW1wdGlvbnMgYXBwbHkgaW4gYWxsIHNpdHVhdGlvbnMsIGFuZCBzbyBvbi4gIEluIG90aGVyIHdvcmRzLAotbG9ja2RlcCBjYW4gZmluZCBhIG51bWJlciBvZiBzY2VuYXJpb3MgaW4gd2hpY2ggdGhlIHN5c3RlbSBjb3VsZCwgb24gcmFyZQotb2NjYXNpb24sIGRlYWRsb2NrLiAgVGhpcyBraW5kIG9mIHByb2JsZW0gY2FuIGJlIHBhaW5mdWwgKGZvciBib3RoCi1kZXZlbG9wZXJzIGFuZCB1c2VycykgaW4gYSBkZXBsb3llZCBzeXN0ZW07IGxvY2tkZXAgYWxsb3dzIHRoZW0gdG8gYmUgZm91bmQKLWluIGFuIGF1dG9tYXRlZCBtYW5uZXIgYWhlYWQgb2YgdGltZS4gIENvZGUgd2l0aCBhbnkgc29ydCBvZiBub24tdHJpdmlhbAotbG9ja2luZyBzaG91bGQgYmUgcnVuIHdpdGggbG9ja2RlcCBlbmFibGVkIGJlZm9yZSBiZWluZyBzdWJtaXR0ZWQgZm9yCi1pbmNsdXNpb24uIAotCi1BcyBhIGRpbGlnZW50IGtlcm5lbCBwcm9ncmFtbWVyLCB5b3Ugd2lsbCwgYmV5b25kIGRvdWJ0LCBjaGVjayB0aGUgcmV0dXJuCi1zdGF0dXMgb2YgYW55IG9wZXJhdGlvbiAoc3VjaCBhcyBhIG1lbW9yeSBhbGxvY2F0aW9uKSB3aGljaCBjYW4gZmFpbC4gIFRoZQotZmFjdCBvZiB0aGUgbWF0dGVyLCB0aG91Z2gsIGlzIHRoYXQgdGhlIHJlc3VsdGluZyBmYWlsdXJlIHJlY292ZXJ5IHBhdGhzCi1hcmUsIHByb2JhYmx5LCBjb21wbGV0ZWx5IHVudGVzdGVkLiAgVW50ZXN0ZWQgY29kZSB0ZW5kcyB0byBiZSBicm9rZW4gY29kZTsKLXlvdSBjb3VsZCBiZSBtdWNoIG1vcmUgY29uZmlkZW50IG9mIHlvdXIgY29kZSBpZiBhbGwgdGhvc2UgZXJyb3ItaGFuZGxpbmcKLXBhdGhzIGhhZCBiZWVuIGV4ZXJjaXNlZCBhIGZldyB0aW1lcy4KLQotVGhlIGtlcm5lbCBwcm92aWRlcyBhIGZhdWx0IGluamVjdGlvbiBmcmFtZXdvcmsgd2hpY2ggY2FuIGRvIGV4YWN0bHkgdGhhdCwKLWVzcGVjaWFsbHkgd2hlcmUgbWVtb3J5IGFsbG9jYXRpb25zIGFyZSBpbnZvbHZlZC4gIFdpdGggZmF1bHQgaW5qZWN0aW9uCi1lbmFibGVkLCBhIGNvbmZpZ3VyYWJsZSBwZXJjZW50YWdlIG9mIG1lbW9yeSBhbGxvY2F0aW9ucyB3aWxsIGJlIG1hZGUgdG8KLWZhaWw7IHRoZXNlIGZhaWx1cmVzIGNhbiBiZSByZXN0cmljdGVkIHRvIGEgc3BlY2lmaWMgcmFuZ2Ugb2YgY29kZS4KLVJ1bm5pbmcgd2l0aCBmYXVsdCBpbmplY3Rpb24gZW5hYmxlZCBhbGxvd3MgdGhlIHByb2dyYW1tZXIgdG8gc2VlIGhvdyB0aGUKLWNvZGUgcmVzcG9uZHMgd2hlbiB0aGluZ3MgZ28gYmFkbHkuICBTZWUKLURvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KLWhvdyB0byB1c2UgdGhpcyBmYWNpbGl0eS4KLQotT3RoZXIga2luZHMgb2YgZXJyb3JzIGNhbiBiZSBmb3VuZCB3aXRoIHRoZSAic3BhcnNlIiBzdGF0aWMgYW5hbHlzaXMgdG9vbC4KLVdpdGggc3BhcnNlLCB0aGUgcHJvZ3JhbW1lciBjYW4gYmUgd2FybmVkIGFib3V0IGNvbmZ1c2lvbiBiZXR3ZWVuCi11c2VyLXNwYWNlIGFuZCBrZXJuZWwtc3BhY2UgYWRkcmVzc2VzLCBtaXh0dXJlIG9mIGJpZy1lbmRpYW4gYW5kCi1zbWFsbC1lbmRpYW4gcXVhbnRpdGllcywgdGhlIHBhc3Npbmcgb2YgaW50ZWdlciB2YWx1ZXMgd2hlcmUgYSBzZXQgb2YgYml0Ci1mbGFncyBpcyBleHBlY3RlZCwgYW5kIHNvIG9uLiAgU3BhcnNlIG11c3QgYmUgaW5zdGFsbGVkIHNlcGFyYXRlbHkgKGl0IGNhbgotYmUgZm91bmQgYXQgaHR0cHM6Ly9zcGFyc2Uud2lraS5rZXJuZWwub3JnL2luZGV4LnBocC9NYWluX1BhZ2UgaWYgeW91cgotZGlzdHJpYnV0b3IgZG9lcyBub3QgcGFja2FnZSBpdCk7IGl0IGNhbiB0aGVuIGJlIHJ1biBvbiB0aGUgY29kZSBieSBhZGRpbmcKLSJDPTEiIHRvIHlvdXIgbWFrZSBjb21tYW5kLgotCi1UaGUgIkNvY2NpbmVsbGUiIHRvb2wgKGh0dHA6Ly9jb2NjaW5lbGxlLmxpcDYuZnIvKSBpcyBhYmxlIHRvIGZpbmQgYSB3aWRlCi12YXJpZXR5IG9mIHBvdGVudGlhbCBjb2RpbmcgcHJvYmxlbXM7IGl0IGNhbiBhbHNvIHByb3Bvc2UgZml4ZXMgZm9yIHRob3NlCi1wcm9ibGVtcy4gIFF1aXRlIGEgZmV3ICJzZW1hbnRpYyBwYXRjaGVzIiBmb3IgdGhlIGtlcm5lbCBoYXZlIGJlZW4gcGFja2FnZWQKLXVuZGVyIHRoZSBzY3JpcHRzL2NvY2NpbmVsbGUgZGlyZWN0b3J5OyBydW5uaW5nICJtYWtlIGNvY2NpY2hlY2siIHdpbGwgcnVuCi10aHJvdWdoIHRob3NlIHNlbWFudGljIHBhdGNoZXMgYW5kIHJlcG9ydCBvbiBhbnkgcHJvYmxlbXMgZm91bmQuICBTZWUKLURvY3VtZW50YXRpb24vY29jY2luZWxsZS50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0KLU90aGVyIGtpbmRzIG9mIHBvcnRhYmlsaXR5IGVycm9ycyBhcmUgYmVzdCBmb3VuZCBieSBjb21waWxpbmcgeW91ciBjb2RlIGZvcgotb3RoZXIgYXJjaGl0ZWN0dXJlcy4gIElmIHlvdSBkbyBub3QgaGFwcGVuIHRvIGhhdmUgYW4gUy8zOTAgc3lzdGVtIG9yIGEKLUJsYWNrZmluIGRldmVsb3BtZW50IGJvYXJkIGhhbmR5LCB5b3UgY2FuIHN0aWxsIHBlcmZvcm0gdGhlIGNvbXBpbGF0aW9uCi1zdGVwLiAgQSBsYXJnZSBzZXQgb2YgY3Jvc3MgY29tcGlsZXJzIGZvciB4ODYgc3lzdGVtcyBjYW4gYmUgZm91bmQgYXQgCi0KLQlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3Rvb2xzL2Nyb3NzdG9vbC8KLQotU29tZSB0aW1lIHNwZW50IGluc3RhbGxpbmcgYW5kIHVzaW5nIHRoZXNlIGNvbXBpbGVycyB3aWxsIGhlbHAgYXZvaWQKLWVtYmFycmFzc21lbnQgbGF0ZXIuCi0KLQotNC4zOiBET0NVTUVOVEFUSU9OCi0KLURvY3VtZW50YXRpb24gaGFzIG9mdGVuIGJlZW4gbW9yZSB0aGUgZXhjZXB0aW9uIHRoYW4gdGhlIHJ1bGUgd2l0aCBrZXJuZWwKLWRldmVsb3BtZW50LiAgRXZlbiBzbywgYWRlcXVhdGUgZG9jdW1lbnRhdGlvbiB3aWxsIGhlbHAgdG8gZWFzZSB0aGUgbWVyZ2luZwotb2YgbmV3IGNvZGUgaW50byB0aGUga2VybmVsLCBtYWtlIGxpZmUgZWFzaWVyIGZvciBvdGhlciBkZXZlbG9wZXJzLCBhbmQKLXdpbGwgYmUgaGVscGZ1bCBmb3IgeW91ciB1c2Vycy4gIEluIG1hbnkgY2FzZXMsIHRoZSBhZGRpdGlvbiBvZgotZG9jdW1lbnRhdGlvbiBoYXMgYmVjb21lIGVzc2VudGlhbGx5IG1hbmRhdG9yeS4KLQotVGhlIGZpcnN0IHBpZWNlIG9mIGRvY3VtZW50YXRpb24gZm9yIGFueSBwYXRjaCBpcyBpdHMgYXNzb2NpYXRlZAotY2hhbmdlbG9nLiAgTG9nIGVudHJpZXMgc2hvdWxkIGRlc2NyaWJlIHRoZSBwcm9ibGVtIGJlaW5nIHNvbHZlZCwgdGhlIGZvcm0KLW9mIHRoZSBzb2x1dGlvbiwgdGhlIHBlb3BsZSB3aG8gd29ya2VkIG9uIHRoZSBwYXRjaCwgYW55IHJlbGV2YW50Ci1lZmZlY3RzIG9uIHBlcmZvcm1hbmNlLCBhbmQgYW55dGhpbmcgZWxzZSB0aGF0IG1pZ2h0IGJlIG5lZWRlZCB0bwotdW5kZXJzdGFuZCB0aGUgcGF0Y2guICBCZSBzdXJlIHRoYXQgdGhlIGNoYW5nZWxvZyBzYXlzICp3aHkqIHRoZSBwYXRjaCBpcwotd29ydGggYXBwbHlpbmc7IGEgc3VycHJpc2luZyBudW1iZXIgb2YgZGV2ZWxvcGVycyBmYWlsIHRvIHByb3ZpZGUgdGhhdAotaW5mb3JtYXRpb24uCi0KLUFueSBjb2RlIHdoaWNoIGFkZHMgYSBuZXcgdXNlci1zcGFjZSBpbnRlcmZhY2UgLSBpbmNsdWRpbmcgbmV3IHN5c2ZzIG9yCi0vcHJvYyBmaWxlcyAtIHNob3VsZCBpbmNsdWRlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBpbnRlcmZhY2Ugd2hpY2ggZW5hYmxlcwotdXNlci1zcGFjZSBkZXZlbG9wZXJzIHRvIGtub3cgd2hhdCB0aGV5IGFyZSB3b3JraW5nIHdpdGguICBTZWUKLURvY3VtZW50YXRpb24vQUJJL1JFQURNRSBmb3IgYSBkZXNjcmlwdGlvbiBvZiBob3cgdGhpcyBkb2N1bWVudGF0aW9uIHNob3VsZAotYmUgZm9ybWF0dGVkIGFuZCB3aGF0IGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHByb3ZpZGVkLgotCi1UaGUgZmlsZSBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBkZXNjcmliZXMgYWxsIG9mIHRoZSBrZXJuZWwncwotYm9vdC10aW1lIHBhcmFtZXRlcnMuICBBbnkgcGF0Y2ggd2hpY2ggYWRkcyBuZXcgcGFyYW1ldGVycyBzaG91bGQgYWRkIHRoZQotYXBwcm9wcmlhdGUgZW50cmllcyB0byB0aGlzIGZpbGUuCi0KLUFueSBuZXcgY29uZmlndXJhdGlvbiBvcHRpb25zIG11c3QgYmUgYWNjb21wYW5pZWQgYnkgaGVscCB0ZXh0IHdoaWNoCi1jbGVhcmx5IGV4cGxhaW5zIHRoZSBvcHRpb25zIGFuZCB3aGVuIHRoZSB1c2VyIG1pZ2h0IHdhbnQgdG8gc2VsZWN0IHRoZW0uCi0KLUludGVybmFsIEFQSSBpbmZvcm1hdGlvbiBmb3IgbWFueSBzdWJzeXN0ZW1zIGlzIGRvY3VtZW50ZWQgYnkgd2F5IG9mCi1zcGVjaWFsbHktZm9ybWF0dGVkIGNvbW1lbnRzOyB0aGVzZSBjb21tZW50cyBjYW4gYmUgZXh0cmFjdGVkIGFuZCBmb3JtYXR0ZWQKLWluIGEgbnVtYmVyIG9mIHdheXMgYnkgdGhlICJrZXJuZWwtZG9jIiBzY3JpcHQuICBJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aGluCi1hIHN1YnN5c3RlbSB3aGljaCBoYXMga2VybmVsZG9jIGNvbW1lbnRzLCB5b3Ugc2hvdWxkIG1haW50YWluIHRoZW0gYW5kIGFkZAotdGhlbSwgYXMgYXBwcm9wcmlhdGUsIGZvciBleHRlcm5hbGx5LWF2YWlsYWJsZSBmdW5jdGlvbnMuICBFdmVuIGluIGFyZWFzCi13aGljaCBoYXZlIG5vdCBiZWVuIHNvIGRvY3VtZW50ZWQsIHRoZXJlIGlzIG5vIGhhcm0gaW4gYWRkaW5nIGtlcm5lbGRvYwotY29tbWVudHMgZm9yIHRoZSBmdXR1cmU7IGluZGVlZCwgdGhpcyBjYW4gYmUgYSB1c2VmdWwgYWN0aXZpdHkgZm9yCi1iZWdpbm5pbmcga2VybmVsIGRldmVsb3BlcnMuICBUaGUgZm9ybWF0IG9mIHRoZXNlIGNvbW1lbnRzLCBhbG9uZyB3aXRoIHNvbWUKLWluZm9ybWF0aW9uIG9uIGhvdyB0byBjcmVhdGUga2VybmVsZG9jIHRlbXBsYXRlcyBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUKLURvY3VtZW50YXRpb24va2VybmVsLWRvY3VtZW50YXRpb24ucnN0LgotCi1Bbnlib2R5IHdobyByZWFkcyB0aHJvdWdoIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGV4aXN0aW5nIGtlcm5lbCBjb2RlIHdpbGwKLW5vdGUgdGhhdCwgb2Z0ZW4sIGNvbW1lbnRzIGFyZSBtb3N0IG5vdGFibGUgYnkgdGhlaXIgYWJzZW5jZS4gIE9uY2UgYWdhaW4sCi10aGUgZXhwZWN0YXRpb25zIGZvciBuZXcgY29kZSBhcmUgaGlnaGVyIHRoYW4gdGhleSB3ZXJlIGluIHRoZSBwYXN0OwotbWVyZ2luZyB1bmNvbW1lbnRlZCBjb2RlIHdpbGwgYmUgaGFyZGVyLiAgVGhhdCBzYWlkLCB0aGVyZSBpcyBsaXR0bGUgZGVzaXJlCi1mb3IgdmVyYm9zZWx5LWNvbW1lbnRlZCBjb2RlLiAgVGhlIGNvZGUgc2hvdWxkLCBpdHNlbGYsIGJlIHJlYWRhYmxlLCB3aXRoCi1jb21tZW50cyBleHBsYWluaW5nIHRoZSBtb3JlIHN1YnRsZSBhc3BlY3RzLgotCi1DZXJ0YWluIHRoaW5ncyBzaG91bGQgYWx3YXlzIGJlIGNvbW1lbnRlZC4gIFVzZXMgb2YgbWVtb3J5IGJhcnJpZXJzIHNob3VsZAotYmUgYWNjb21wYW5pZWQgYnkgYSBsaW5lIGV4cGxhaW5pbmcgd2h5IHRoZSBiYXJyaWVyIGlzIG5lY2Vzc2FyeS4gIFRoZQotbG9ja2luZyBydWxlcyBmb3IgZGF0YSBzdHJ1Y3R1cmVzIGdlbmVyYWxseSBuZWVkIHRvIGJlIGV4cGxhaW5lZCBzb21ld2hlcmUuCi1NYWpvciBkYXRhIHN0cnVjdHVyZXMgbmVlZCBjb21wcmVoZW5zaXZlIGRvY3VtZW50YXRpb24gaW4gZ2VuZXJhbC4KLU5vbi1vYnZpb3VzIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHNlcGFyYXRlIGJpdHMgb2YgY29kZSBzaG91bGQgYmUgcG9pbnRlZAotb3V0LiAgQW55dGhpbmcgd2hpY2ggbWlnaHQgdGVtcHQgYSBjb2RlIGphbml0b3IgdG8gbWFrZSBhbiBpbmNvcnJlY3QKLSJjbGVhbnVwIiBuZWVkcyBhIGNvbW1lbnQgc2F5aW5nIHdoeSBpdCBpcyBkb25lIHRoZSB3YXkgaXQgaXMuICBBbmQgc28gb24uCi0KLQotNC40OiBJTlRFUk5BTCBBUEkgQ0hBTkdFUwotCi1UaGUgYmluYXJ5IGludGVyZmFjZSBwcm92aWRlZCBieSB0aGUga2VybmVsIHRvIHVzZXIgc3BhY2UgY2Fubm90IGJlIGJyb2tlbgotZXhjZXB0IHVuZGVyIHRoZSBtb3N0IHNldmVyZSBjaXJjdW1zdGFuY2VzLiAgVGhlIGtlcm5lbCdzIGludGVybmFsCi1wcm9ncmFtbWluZyBpbnRlcmZhY2VzLCBpbnN0ZWFkLCBhcmUgaGlnaGx5IGZsdWlkIGFuZCBjYW4gYmUgY2hhbmdlZCB3aGVuCi10aGUgbmVlZCBhcmlzZXMuICBJZiB5b3UgZmluZCB5b3Vyc2VsZiBoYXZpbmcgdG8gd29yayBhcm91bmQgYSBrZXJuZWwgQVBJLAotb3Igc2ltcGx5IG5vdCB1c2luZyBhIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBtZWV0IHlvdXIKLW5lZWRzLCB0aGF0IG1heSBiZSBhIHNpZ24gdGhhdCB0aGUgQVBJIG5lZWRzIHRvIGNoYW5nZS4gIEFzIGEga2VybmVsCi1kZXZlbG9wZXIsIHlvdSBhcmUgZW1wb3dlcmVkIHRvIG1ha2Ugc3VjaCBjaGFuZ2VzLgotCi1UaGVyZSBhcmUsIG9mIGNvdXJzZSwgc29tZSBjYXRjaGVzLiAgQVBJIGNoYW5nZXMgY2FuIGJlIG1hZGUsIGJ1dCB0aGV5IG5lZWQKLXRvIGJlIHdlbGwganVzdGlmaWVkLiAgU28gYW55IHBhdGNoIG1ha2luZyBhbiBpbnRlcm5hbCBBUEkgY2hhbmdlIHNob3VsZCBiZQotYWNjb21wYW5pZWQgYnkgYSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBjaGFuZ2UgaXMgYW5kIHdoeSBpdCBpcwotbmVjZXNzYXJ5LiAgVGhpcyBraW5kIG9mIGNoYW5nZSBzaG91bGQgYWxzbyBiZSBicm9rZW4gb3V0IGludG8gYSBzZXBhcmF0ZQotcGF0Y2gsIHJhdGhlciB0aGFuIGJ1cmllZCB3aXRoaW4gYSBsYXJnZXIgcGF0Y2guCi0KLVRoZSBvdGhlciBjYXRjaCBpcyB0aGF0IGEgZGV2ZWxvcGVyIHdobyBjaGFuZ2VzIGFuIGludGVybmFsIEFQSSBpcwotZ2VuZXJhbGx5IGNoYXJnZWQgd2l0aCB0aGUgdGFzayBvZiBmaXhpbmcgYW55IGNvZGUgd2l0aGluIHRoZSBrZXJuZWwgdHJlZQotd2hpY2ggaXMgYnJva2VuIGJ5IHRoZSBjaGFuZ2UuICBGb3IgYSB3aWRlbHktdXNlZCBmdW5jdGlvbiwgdGhpcyBkdXR5IGNhbgotbGVhZCB0byBsaXRlcmFsbHkgaHVuZHJlZHMgb3IgdGhvdXNhbmRzIG9mIGNoYW5nZXMgLSBtYW55IG9mIHdoaWNoIGFyZQotbGlrZWx5IHRvIGNvbmZsaWN0IHdpdGggd29yayBiZWluZyBkb25lIGJ5IG90aGVyIGRldmVsb3BlcnMuICBOZWVkbGVzcyB0bwotc2F5LCB0aGlzIGNhbiBiZSBhIGxhcmdlIGpvYiwgc28gaXQgaXMgYmVzdCB0byBiZSBzdXJlIHRoYXQgdGhlCi1qdXN0aWZpY2F0aW9uIGlzIHNvbGlkLiAgTm90ZSB0aGF0IHRoZSBDb2NjaW5lbGxlIHRvb2wgY2FuIGhlbHAgd2l0aAotd2lkZS1yYW5naW5nIEFQSSBjaGFuZ2VzLgotCi1XaGVuIG1ha2luZyBhbiBpbmNvbXBhdGlibGUgQVBJIGNoYW5nZSwgb25lIHNob3VsZCwgd2hlbmV2ZXIgcG9zc2libGUsCi1lbnN1cmUgdGhhdCBjb2RlIHdoaWNoIGhhcyBub3QgYmVlbiB1cGRhdGVkIGlzIGNhdWdodCBieSB0aGUgY29tcGlsZXIuCi1UaGlzIHdpbGwgaGVscCB5b3UgdG8gYmUgc3VyZSB0aGF0IHlvdSBoYXZlIGZvdW5kIGFsbCBpbi10cmVlIHVzZXMgb2YgdGhhdAotaW50ZXJmYWNlLiAgSXQgd2lsbCBhbHNvIGFsZXJ0IGRldmVsb3BlcnMgb2Ygb3V0LW9mLXRyZWUgY29kZSB0aGF0IHRoZXJlIGlzCi1hIGNoYW5nZSB0aGF0IHRoZXkgbmVlZCB0byByZXNwb25kIHRvLiAgU3VwcG9ydGluZyBvdXQtb2YtdHJlZSBjb2RlIGlzIG5vdAotc29tZXRoaW5nIHRoYXQga2VybmVsIGRldmVsb3BlcnMgbmVlZCB0byBiZSB3b3JyaWVkIGFib3V0LCBidXQgd2UgYWxzbyBkbwotbm90IGhhdmUgdG8gbWFrZSBsaWZlIGhhcmRlciBmb3Igb3V0LW9mLXRyZWUgZGV2ZWxvcGVycyB0aGFuIGl0IG5lZWRzIHRvCi1iZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy80LkNvZGluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNWNlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNC5Db2RpbmcucnN0CkBAIC0wLDAgKzEsNDEzIEBACisuLiBfZGV2ZWxvcG1lbnRfY29kaW5nOgorCitHZXR0aW5nIHRoZSBjb2RlIHJpZ2h0Cis9PT09PT09PT09PT09PT09PT09PT09CisKK1doaWxlIHRoZXJlIGlzIG11Y2ggdG8gYmUgc2FpZCBmb3IgYSBzb2xpZCBhbmQgY29tbXVuaXR5LW9yaWVudGVkIGRlc2lnbgorcHJvY2VzcywgdGhlIHByb29mIG9mIGFueSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvamVjdCBpcyBpbiB0aGUgcmVzdWx0aW5nCitjb2RlLiAgSXQgaXMgdGhlIGNvZGUgd2hpY2ggd2lsbCBiZSBleGFtaW5lZCBieSBvdGhlciBkZXZlbG9wZXJzIGFuZCBtZXJnZWQKKyhvciBub3QpIGludG8gdGhlIG1haW5saW5lIHRyZWUuICBTbyBpdCBpcyB0aGUgcXVhbGl0eSBvZiB0aGlzIGNvZGUgd2hpY2gKK3dpbGwgZGV0ZXJtaW5lIHRoZSB1bHRpbWF0ZSBzdWNjZXNzIG9mIHRoZSBwcm9qZWN0LgorCitUaGlzIHNlY3Rpb24gd2lsbCBleGFtaW5lIHRoZSBjb2RpbmcgcHJvY2Vzcy4gIFdlJ2xsIHN0YXJ0IHdpdGggYSBsb29rIGF0IGEKK251bWJlciBvZiB3YXlzIGluIHdoaWNoIGtlcm5lbCBkZXZlbG9wZXJzIGNhbiBnbyB3cm9uZy4gIFRoZW4gdGhlIGZvY3VzCit3aWxsIHNoaWZ0IHRvd2FyZCBkb2luZyB0aGluZ3MgcmlnaHQgYW5kIHRoZSB0b29scyB3aGljaCBjYW4gaGVscCBpbiB0aGF0CitxdWVzdC4KKworCitQaXRmYWxscworLS0tLS0tLS0tCisKK0NvZGluZyBzdHlsZQorKioqKioqKioqKioqCisKK1RoZSBrZXJuZWwgaGFzIGxvbmcgaGFkIGEgc3RhbmRhcmQgY29kaW5nIHN0eWxlLCBkZXNjcmliZWQgaW4KK0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUuICBGb3IgbXVjaCBvZiB0aGF0IHRpbWUsIHRoZSBwb2xpY2llcyBkZXNjcmliZWQKK2luIHRoYXQgZmlsZSB3ZXJlIHRha2VuIGFzIGJlaW5nLCBhdCBtb3N0LCBhZHZpc29yeS4gIEFzIGEgcmVzdWx0LCB0aGVyZSBpcworYSBzdWJzdGFudGlhbCBhbW91bnQgb2YgY29kZSBpbiB0aGUga2VybmVsIHdoaWNoIGRvZXMgbm90IG1lZXQgdGhlIGNvZGluZworc3R5bGUgZ3VpZGVsaW5lcy4gIFRoZSBwcmVzZW5jZSBvZiB0aGF0IGNvZGUgbGVhZHMgdG8gdHdvIGluZGVwZW5kZW50CitoYXphcmRzIGZvciBrZXJuZWwgZGV2ZWxvcGVycy4KKworVGhlIGZpcnN0IG9mIHRoZXNlIGlzIHRvIGJlbGlldmUgdGhhdCB0aGUga2VybmVsIGNvZGluZyBzdGFuZGFyZHMgZG8gbm90CittYXR0ZXIgYW5kIGFyZSBub3QgZW5mb3JjZWQuICBUaGUgdHJ1dGggb2YgdGhlIG1hdHRlciBpcyB0aGF0IGFkZGluZyBuZXcKK2NvZGUgdG8gdGhlIGtlcm5lbCBpcyB2ZXJ5IGRpZmZpY3VsdCBpZiB0aGF0IGNvZGUgaXMgbm90IGNvZGVkIGFjY29yZGluZyB0bwordGhlIHN0YW5kYXJkOyBtYW55IGRldmVsb3BlcnMgd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvZGUgYmUgcmVmb3JtYXR0ZWQKK2JlZm9yZSB0aGV5IHdpbGwgZXZlbiByZXZpZXcgaXQuICBBIGNvZGUgYmFzZSBhcyBsYXJnZSBhcyB0aGUga2VybmVsCityZXF1aXJlcyBzb21lIHVuaWZvcm1pdHkgb2YgY29kZSB0byBtYWtlIGl0IHBvc3NpYmxlIGZvciBkZXZlbG9wZXJzIHRvCitxdWlja2x5IHVuZGVyc3RhbmQgYW55IHBhcnQgb2YgaXQuICBTbyB0aGVyZSBpcyBubyBsb25nZXIgcm9vbSBmb3IKK3N0cmFuZ2VseS1mb3JtYXR0ZWQgY29kZS4KKworT2NjYXNpb25hbGx5LCB0aGUga2VybmVsJ3MgY29kaW5nIHN0eWxlIHdpbGwgcnVuIGludG8gY29uZmxpY3Qgd2l0aCBhbgorZW1wbG95ZXIncyBtYW5kYXRlZCBzdHlsZS4gIEluIHN1Y2ggY2FzZXMsIHRoZSBrZXJuZWwncyBzdHlsZSB3aWxsIGhhdmUgdG8KK3dpbiBiZWZvcmUgdGhlIGNvZGUgY2FuIGJlIG1lcmdlZC4gIFB1dHRpbmcgY29kZSBpbnRvIHRoZSBrZXJuZWwgbWVhbnMKK2dpdmluZyB1cCBhIGRlZ3JlZSBvZiBjb250cm9sIGluIGEgbnVtYmVyIG9mIHdheXMgLSBpbmNsdWRpbmcgY29udHJvbCBvdmVyCitob3cgdGhlIGNvZGUgaXMgZm9ybWF0dGVkLgorCitUaGUgb3RoZXIgdHJhcCBpcyB0byBhc3N1bWUgdGhhdCBjb2RlIHdoaWNoIGlzIGFscmVhZHkgaW4gdGhlIGtlcm5lbCBpcwordXJnZW50bHkgaW4gbmVlZCBvZiBjb2Rpbmcgc3R5bGUgZml4ZXMuICBEZXZlbG9wZXJzIG1heSBzdGFydCB0byBnZW5lcmF0ZQorcmVmb3JtYXR0aW5nIHBhdGNoZXMgYXMgYSB3YXkgb2YgZ2FpbmluZyBmYW1pbGlhcml0eSB3aXRoIHRoZSBwcm9jZXNzLCBvcgorYXMgYSB3YXkgb2YgZ2V0dGluZyB0aGVpciBuYW1lIGludG8gdGhlIGtlcm5lbCBjaGFuZ2Vsb2dzIC0gb3IgYm90aC4gIEJ1dAorcHVyZSBjb2Rpbmcgc3R5bGUgZml4ZXMgYXJlIHNlZW4gYXMgbm9pc2UgYnkgdGhlIGRldmVsb3BtZW50IGNvbW11bml0eTsKK3RoZXkgdGVuZCB0byBnZXQgYSBjaGlsbHkgcmVjZXB0aW9uLiAgU28gdGhpcyB0eXBlIG9mIHBhdGNoIGlzIGJlc3QKK2F2b2lkZWQuICBJdCBpcyBuYXR1cmFsIHRvIGZpeCB0aGUgc3R5bGUgb2YgYSBwaWVjZSBvZiBjb2RlIHdoaWxlIHdvcmtpbmcKK29uIGl0IGZvciBvdGhlciByZWFzb25zLCBidXQgY29kaW5nIHN0eWxlIGNoYW5nZXMgc2hvdWxkIG5vdCBiZSBtYWRlIGZvcgordGhlaXIgb3duIHNha2UuCisKK1RoZSBjb2Rpbmcgc3R5bGUgZG9jdW1lbnQgYWxzbyBzaG91bGQgbm90IGJlIHJlYWQgYXMgYW4gYWJzb2x1dGUgbGF3IHdoaWNoCitjYW4gbmV2ZXIgYmUgdHJhbnNncmVzc2VkLiAgSWYgdGhlcmUgaXMgYSBnb29kIHJlYXNvbiB0byBnbyBhZ2FpbnN0IHRoZQorc3R5bGUgKGEgbGluZSB3aGljaCBiZWNvbWVzIGZhciBsZXNzIHJlYWRhYmxlIGlmIHNwbGl0IHRvIGZpdCB3aXRoaW4gdGhlCis4MC1jb2x1bW4gbGltaXQsIGZvciBleGFtcGxlKSwganVzdCBkbyBpdC4KKworCitBYnN0cmFjdGlvbiBsYXllcnMKKyoqKioqKioqKioqKioqKioqKgorCitDb21wdXRlciBTY2llbmNlIHByb2Zlc3NvcnMgdGVhY2ggc3R1ZGVudHMgdG8gbWFrZSBleHRlbnNpdmUgdXNlIG9mCithYnN0cmFjdGlvbiBsYXllcnMgaW4gdGhlIG5hbWUgb2YgZmxleGliaWxpdHkgYW5kIGluZm9ybWF0aW9uIGhpZGluZy4KK0NlcnRhaW5seSB0aGUga2VybmVsIG1ha2VzIGV4dGVuc2l2ZSB1c2Ugb2YgYWJzdHJhY3Rpb247IG5vIHByb2plY3QKK2ludm9sdmluZyBzZXZlcmFsIG1pbGxpb24gbGluZXMgb2YgY29kZSBjb3VsZCBkbyBvdGhlcndpc2UgYW5kIHN1cnZpdmUuCitCdXQgZXhwZXJpZW5jZSBoYXMgc2hvd24gdGhhdCBleGNlc3NpdmUgb3IgcHJlbWF0dXJlIGFic3RyYWN0aW9uIGNhbiBiZQoranVzdCBhcyBoYXJtZnVsIGFzIHByZW1hdHVyZSBvcHRpbWl6YXRpb24uICBBYnN0cmFjdGlvbiBzaG91bGQgYmUgdXNlZCB0bwordGhlIGxldmVsIHJlcXVpcmVkIGFuZCBubyBmdXJ0aGVyLgorCitBdCBhIHNpbXBsZSBsZXZlbCwgY29uc2lkZXIgYSBmdW5jdGlvbiB3aGljaCBoYXMgYW4gYXJndW1lbnQgd2hpY2ggaXMKK2Fsd2F5cyBwYXNzZWQgYXMgemVybyBieSBhbGwgY2FsbGVycy4gIE9uZSBjb3VsZCByZXRhaW4gdGhhdCBhcmd1bWVudCBqdXN0CitpbiBjYXNlIHNvbWVib2R5IGV2ZW50dWFsbHkgbmVlZHMgdG8gdXNlIHRoZSBleHRyYSBmbGV4aWJpbGl0eSB0aGF0IGl0Citwcm92aWRlcy4gIEJ5IHRoYXQgdGltZSwgdGhvdWdoLCBjaGFuY2VzIGFyZSBnb29kIHRoYXQgdGhlIGNvZGUgd2hpY2gKK2ltcGxlbWVudHMgdGhpcyBleHRyYSBhcmd1bWVudCBoYXMgYmVlbiBicm9rZW4gaW4gc29tZSBzdWJ0bGUgd2F5IHdoaWNoIHdhcworbmV2ZXIgbm90aWNlZCAtIGJlY2F1c2UgaXQgaGFzIG5ldmVyIGJlZW4gdXNlZC4gIE9yLCB3aGVuIHRoZSBuZWVkIGZvcgorZXh0cmEgZmxleGliaWxpdHkgYXJpc2VzLCBpdCBkb2VzIG5vdCBkbyBzbyBpbiBhIHdheSB3aGljaCBtYXRjaGVzIHRoZQorcHJvZ3JhbW1lcidzIGVhcmx5IGV4cGVjdGF0aW9uLiAgS2VybmVsIGRldmVsb3BlcnMgd2lsbCByb3V0aW5lbHkgc3VibWl0CitwYXRjaGVzIHRvIHJlbW92ZSB1bnVzZWQgYXJndW1lbnRzOyB0aGV5IHNob3VsZCwgaW4gZ2VuZXJhbCwgbm90IGJlIGFkZGVkCitpbiB0aGUgZmlyc3QgcGxhY2UuCisKK0Fic3RyYWN0aW9uIGxheWVycyB3aGljaCBoaWRlIGFjY2VzcyB0byBoYXJkd2FyZSAtIG9mdGVuIHRvIGFsbG93IHRoZSBidWxrCitvZiBhIGRyaXZlciB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgb3BlcmF0aW5nIHN5c3RlbXMgLSBhcmUgZXNwZWNpYWxseQorZnJvd25lZCB1cG9uLiAgU3VjaCBsYXllcnMgb2JzY3VyZSB0aGUgY29kZSBhbmQgbWF5IGltcG9zZSBhIHBlcmZvcm1hbmNlCitwZW5hbHR5OyB0aGV5IGRvIG5vdCBiZWxvbmcgaW4gdGhlIExpbnV4IGtlcm5lbC4KKworT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBmaW5kIHlvdXJzZWxmIGNvcHlpbmcgc2lnbmlmaWNhbnQgYW1vdW50cyBvZiBjb2RlCitmcm9tIGFub3RoZXIga2VybmVsIHN1YnN5c3RlbSwgaXQgaXMgdGltZSB0byBhc2sgd2hldGhlciBpdCB3b3VsZCwgaW4gZmFjdCwKK21ha2Ugc2Vuc2UgdG8gcHVsbCBvdXQgc29tZSBvZiB0aGF0IGNvZGUgaW50byBhIHNlcGFyYXRlIGxpYnJhcnkgb3IgdG8KK2ltcGxlbWVudCB0aGF0IGZ1bmN0aW9uYWxpdHkgYXQgYSBoaWdoZXIgbGV2ZWwuICBUaGVyZSBpcyBubyB2YWx1ZSBpbgorcmVwbGljYXRpbmcgdGhlIHNhbWUgY29kZSB0aHJvdWdob3V0IHRoZSBrZXJuZWwuCisKKworI2lmZGVmIGFuZCBwcmVwcm9jZXNzb3IgdXNlIGluIGdlbmVyYWwKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK1RoZSBDIHByZXByb2Nlc3NvciBzZWVtcyB0byBwcmVzZW50IGEgcG93ZXJmdWwgdGVtcHRhdGlvbiB0byBzb21lIEMKK3Byb2dyYW1tZXJzLCB3aG8gc2VlIGl0IGFzIGEgd2F5IHRvIGVmZmljaWVudGx5IGVuY29kZSBhIGdyZWF0IGRlYWwgb2YKK2ZsZXhpYmlsaXR5IGludG8gYSBzb3VyY2UgZmlsZS4gIEJ1dCB0aGUgcHJlcHJvY2Vzc29yIGlzIG5vdCBDLCBhbmQgaGVhdnkKK3VzZSBvZiBpdCByZXN1bHRzIGluIGNvZGUgd2hpY2ggaXMgbXVjaCBoYXJkZXIgZm9yIG90aGVycyB0byByZWFkIGFuZAoraGFyZGVyIGZvciB0aGUgY29tcGlsZXIgdG8gY2hlY2sgZm9yIGNvcnJlY3RuZXNzLiAgSGVhdnkgcHJlcHJvY2Vzc29yIHVzZQoraXMgYWxtb3N0IGFsd2F5cyBhIHNpZ24gb2YgY29kZSB3aGljaCBuZWVkcyBzb21lIGNsZWFudXAgd29yay4KKworQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2l0aCAjaWZkZWYgaXMsIGluZGVlZCwgYSBwb3dlcmZ1bCBmZWF0dXJlLCBhbmQgaXQKK2lzIHVzZWQgd2l0aGluIHRoZSBrZXJuZWwuICBCdXQgdGhlcmUgaXMgbGl0dGxlIGRlc2lyZSB0byBzZWUgY29kZSB3aGljaCBpcworc3ByaW5rbGVkIGxpYmVyYWxseSB3aXRoICNpZmRlZiBibG9ja3MuICBBcyBhIGdlbmVyYWwgcnVsZSwgI2lmZGVmIHVzZQorc2hvdWxkIGJlIGNvbmZpbmVkIHRvIGhlYWRlciBmaWxlcyB3aGVuZXZlciBwb3NzaWJsZS4KK0NvbmRpdGlvbmFsbHktY29tcGlsZWQgY29kZSBjYW4gYmUgY29uZmluZWQgdG8gZnVuY3Rpb25zIHdoaWNoLCBpZiB0aGUgY29kZQoraXMgbm90IHRvIGJlIHByZXNlbnQsIHNpbXBseSBiZWNvbWUgZW1wdHkuICBUaGUgY29tcGlsZXIgd2lsbCB0aGVuIHF1aWV0bHkKK29wdGltaXplIG91dCB0aGUgY2FsbCB0byB0aGUgZW1wdHkgZnVuY3Rpb24uICBUaGUgcmVzdWx0IGlzIGZhciBjbGVhbmVyCitjb2RlIHdoaWNoIGlzIGVhc2llciB0byBmb2xsb3cuCisKK0MgcHJlcHJvY2Vzc29yIG1hY3JvcyBwcmVzZW50IGEgbnVtYmVyIG9mIGhhemFyZHMsIGluY2x1ZGluZyBwb3NzaWJsZQorbXVsdGlwbGUgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucyB3aXRoIHNpZGUgZWZmZWN0cyBhbmQgbm8gdHlwZSBzYWZldHkuCitJZiB5b3UgYXJlIHRlbXB0ZWQgdG8gZGVmaW5lIGEgbWFjcm8sIGNvbnNpZGVyIGNyZWF0aW5nIGFuIGlubGluZSBmdW5jdGlvbgoraW5zdGVhZC4gIFRoZSBjb2RlIHdoaWNoIHJlc3VsdHMgd2lsbCBiZSB0aGUgc2FtZSwgYnV0IGlubGluZSBmdW5jdGlvbnMgYXJlCitlYXNpZXIgdG8gcmVhZCwgZG8gbm90IGV2YWx1YXRlIHRoZWlyIGFyZ3VtZW50cyBtdWx0aXBsZSB0aW1lcywgYW5kIGFsbG93Cit0aGUgY29tcGlsZXIgdG8gcGVyZm9ybSB0eXBlIGNoZWNraW5nIG9uIHRoZSBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS4KKworCitJbmxpbmUgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqCisKK0lubGluZSBmdW5jdGlvbnMgcHJlc2VudCBhIGhhemFyZCBvZiB0aGVpciBvd24sIHRob3VnaC4gIFByb2dyYW1tZXJzIGNhbgorYmVjb21lIGVuYW1vcmVkIG9mIHRoZSBwZXJjZWl2ZWQgZWZmaWNpZW5jeSBpbmhlcmVudCBpbiBhdm9pZGluZyBhIGZ1bmN0aW9uCitjYWxsIGFuZCBmaWxsIGEgc291cmNlIGZpbGUgd2l0aCBpbmxpbmUgZnVuY3Rpb25zLiAgVGhvc2UgZnVuY3Rpb25zLAoraG93ZXZlciwgY2FuIGFjdHVhbGx5IHJlZHVjZSBwZXJmb3JtYW5jZS4gIFNpbmNlIHRoZWlyIGNvZGUgaXMgcmVwbGljYXRlZAorYXQgZWFjaCBjYWxsIHNpdGUsIHRoZXkgZW5kIHVwIGJsb2F0aW5nIHRoZSBzaXplIG9mIHRoZSBjb21waWxlZCBrZXJuZWwuCitUaGF0LCBpbiB0dXJuLCBjcmVhdGVzIHByZXNzdXJlIG9uIHRoZSBwcm9jZXNzb3IncyBtZW1vcnkgY2FjaGVzLCB3aGljaCBjYW4KK3Nsb3cgZXhlY3V0aW9uIGRyYW1hdGljYWxseS4gIElubGluZSBmdW5jdGlvbnMsIGFzIGEgcnVsZSwgc2hvdWxkIGJlIHF1aXRlCitzbWFsbCBhbmQgcmVsYXRpdmVseSByYXJlLiAgVGhlIGNvc3Qgb2YgYSBmdW5jdGlvbiBjYWxsLCBhZnRlciBhbGwsIGlzIG5vdAordGhhdCBoaWdoOyB0aGUgY3JlYXRpb24gb2YgbGFyZ2UgbnVtYmVycyBvZiBpbmxpbmUgZnVuY3Rpb25zIGlzIGEgY2xhc3NpYworZXhhbXBsZSBvZiBwcmVtYXR1cmUgb3B0aW1pemF0aW9uLgorCitJbiBnZW5lcmFsLCBrZXJuZWwgcHJvZ3JhbW1lcnMgaWdub3JlIGNhY2hlIGVmZmVjdHMgYXQgdGhlaXIgcGVyaWwuICBUaGUKK2NsYXNzaWMgdGltZS9zcGFjZSB0cmFkZW9mZiB0YXVnaHQgaW4gYmVnaW5uaW5nIGRhdGEgc3RydWN0dXJlcyBjbGFzc2VzCitvZnRlbiBkb2VzIG5vdCBhcHBseSB0byBjb250ZW1wb3JhcnkgaGFyZHdhcmUuICBTcGFjZSAqaXMqIHRpbWUsIGluIHRoYXQgYQorbGFyZ2VyIHByb2dyYW0gd2lsbCBydW4gc2xvd2VyIHRoYW4gb25lIHdoaWNoIGlzIG1vcmUgY29tcGFjdC4KKworTW9yZSByZWNlbnQgY29tcGlsZXJzIHRha2UgYW4gaW5jcmVhc2luZ2x5IGFjdGl2ZSByb2xlIGluIGRlY2lkaW5nIHdoZXRoZXIKK2EgZ2l2ZW4gZnVuY3Rpb24gc2hvdWxkIGFjdHVhbGx5IGJlIGlubGluZWQgb3Igbm90LiAgU28gdGhlIGxpYmVyYWwKK3BsYWNlbWVudCBvZiAiaW5saW5lIiBrZXl3b3JkcyBtYXkgbm90IGp1c3QgYmUgZXhjZXNzaXZlOyBpdCBjb3VsZCBhbHNvIGJlCitpcnJlbGV2YW50LgorCisKK0xvY2tpbmcKKyoqKioqKioKKworSW4gTWF5LCAyMDA2LCB0aGUgIkRldmljZXNjYXBlIiBuZXR3b3JraW5nIHN0YWNrIHdhcywgd2l0aCBncmVhdAorZmFuZmFyZSwgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTCBhbmQgbWFkZSBhdmFpbGFibGUgZm9yIGluY2x1c2lvbiBpbiB0aGUKK21haW5saW5lIGtlcm5lbC4gIFRoaXMgZG9uYXRpb24gd2FzIHdlbGNvbWUgbmV3czsgc3VwcG9ydCBmb3Igd2lyZWxlc3MKK25ldHdvcmtpbmcgaW4gTGludXggd2FzIGNvbnNpZGVyZWQgc3Vic3RhbmRhcmQgYXQgYmVzdCwgYW5kIHRoZSBEZXZpY2VzY2FwZQorc3RhY2sgb2ZmZXJlZCB0aGUgcHJvbWlzZSBvZiBmaXhpbmcgdGhhdCBzaXR1YXRpb24uICBZZXQsIHRoaXMgY29kZSBkaWQgbm90CithY3R1YWxseSBtYWtlIGl0IGludG8gdGhlIG1haW5saW5lIHVudGlsIEp1bmUsIDIwMDcgKDIuNi4yMikuICBXaGF0CitoYXBwZW5lZD8KKworVGhpcyBjb2RlIHNob3dlZCBhIG51bWJlciBvZiBzaWducyBvZiBoYXZpbmcgYmVlbiBkZXZlbG9wZWQgYmVoaW5kCitjb3Jwb3JhdGUgZG9vcnMuICBCdXQgb25lIGxhcmdlIHByb2JsZW0gaW4gcGFydGljdWxhciB3YXMgdGhhdCBpdCB3YXMgbm90CitkZXNpZ25lZCB0byB3b3JrIG9uIG11bHRpcHJvY2Vzc29yIHN5c3RlbXMuICBCZWZvcmUgdGhpcyBuZXR3b3JraW5nIHN0YWNrCisobm93IGNhbGxlZCBtYWM4MDIxMSkgY291bGQgYmUgbWVyZ2VkLCBhIGxvY2tpbmcgc2NoZW1lIG5lZWRlZCB0byBiZQorcmV0cm9maXR0ZWQgb250byBpdC4KKworT25jZSB1cG9uIGEgdGltZSwgTGludXgga2VybmVsIGNvZGUgY291bGQgYmUgZGV2ZWxvcGVkIHdpdGhvdXQgdGhpbmtpbmcKK2Fib3V0IHRoZSBjb25jdXJyZW5jeSBpc3N1ZXMgcHJlc2VudGVkIGJ5IG11bHRpcHJvY2Vzc29yIHN5c3RlbXMuICBOb3csCitob3dldmVyLCB0aGlzIGRvY3VtZW50IGlzIGJlaW5nIHdyaXR0ZW4gb24gYSBkdWFsLWNvcmUgbGFwdG9wLiAgRXZlbiBvbgorc2luZ2xlLXByb2Nlc3NvciBzeXN0ZW1zLCB3b3JrIGJlaW5nIGRvbmUgdG8gaW1wcm92ZSByZXNwb25zaXZlbmVzcyB3aWxsCityYWlzZSB0aGUgbGV2ZWwgb2YgY29uY3VycmVuY3kgd2l0aGluIHRoZSBrZXJuZWwuICBUaGUgZGF5cyB3aGVuIGtlcm5lbAorY29kZSBjb3VsZCBiZSB3cml0dGVuIHdpdGhvdXQgdGhpbmtpbmcgYWJvdXQgbG9ja2luZyBhcmUgbG9uZyBwYXN0LgorCitBbnkgcmVzb3VyY2UgKGRhdGEgc3RydWN0dXJlcywgaGFyZHdhcmUgcmVnaXN0ZXJzLCBldGMuKSB3aGljaCBjb3VsZCBiZQorYWNjZXNzZWQgY29uY3VycmVudGx5IGJ5IG1vcmUgdGhhbiBvbmUgdGhyZWFkIG11c3QgYmUgcHJvdGVjdGVkIGJ5IGEgbG9jay4KK05ldyBjb2RlIHNob3VsZCBiZSB3cml0dGVuIHdpdGggdGhpcyByZXF1aXJlbWVudCBpbiBtaW5kOyByZXRyb2ZpdHRpbmcKK2xvY2tpbmcgYWZ0ZXIgdGhlIGZhY3QgaXMgYSByYXRoZXIgbW9yZSBkaWZmaWN1bHQgdGFzay4gIEtlcm5lbCBkZXZlbG9wZXJzCitzaG91bGQgdGFrZSB0aGUgdGltZSB0byB1bmRlcnN0YW5kIHRoZSBhdmFpbGFibGUgbG9ja2luZyBwcmltaXRpdmVzIHdlbGwKK2Vub3VnaCB0byBwaWNrIHRoZSByaWdodCB0b29sIGZvciB0aGUgam9iLiAgQ29kZSB3aGljaCBzaG93cyBhIGxhY2sgb2YKK2F0dGVudGlvbiB0byBjb25jdXJyZW5jeSB3aWxsIGhhdmUgYSBkaWZmaWN1bHQgcGF0aCBpbnRvIHRoZSBtYWlubGluZS4KKworCitSZWdyZXNzaW9ucworKioqKioqKioqKioKKworT25lIGZpbmFsIGhhemFyZCB3b3J0aCBtZW50aW9uaW5nIGlzIHRoaXM6IGl0IGNhbiBiZSB0ZW1wdGluZyB0byBtYWtlIGEKK2NoYW5nZSAod2hpY2ggbWF5IGJyaW5nIGJpZyBpbXByb3ZlbWVudHMpIHdoaWNoIGNhdXNlcyBzb21ldGhpbmcgdG8gYnJlYWsKK2ZvciBleGlzdGluZyB1c2Vycy4gIFRoaXMga2luZCBvZiBjaGFuZ2UgaXMgY2FsbGVkIGEgInJlZ3Jlc3Npb24sIiBhbmQKK3JlZ3Jlc3Npb25zIGhhdmUgYmVjb21lIG1vc3QgdW53ZWxjb21lIGluIHRoZSBtYWlubGluZSBrZXJuZWwuICBXaXRoIGZldworZXhjZXB0aW9ucywgY2hhbmdlcyB3aGljaCBjYXVzZSByZWdyZXNzaW9ucyB3aWxsIGJlIGJhY2tlZCBvdXQgaWYgdGhlCityZWdyZXNzaW9uIGNhbm5vdCBiZSBmaXhlZCBpbiBhIHRpbWVseSBtYW5uZXIuICBGYXIgYmV0dGVyIHRvIGF2b2lkIHRoZQorcmVncmVzc2lvbiBpbiB0aGUgZmlyc3QgcGxhY2UuCisKK0l0IGlzIG9mdGVuIGFyZ3VlZCB0aGF0IGEgcmVncmVzc2lvbiBjYW4gYmUganVzdGlmaWVkIGlmIGl0IGNhdXNlcyB0aGluZ3MKK3RvIHdvcmsgZm9yIG1vcmUgcGVvcGxlIHRoYW4gaXQgY3JlYXRlcyBwcm9ibGVtcyBmb3IuICBXaHkgbm90IG1ha2UgYQorY2hhbmdlIGlmIGl0IGJyaW5ncyBuZXcgZnVuY3Rpb25hbGl0eSB0byB0ZW4gc3lzdGVtcyBmb3IgZWFjaCBvbmUgaXQKK2JyZWFrcz8gIFRoZSBiZXN0IGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIHdhcyBleHByZXNzZWQgYnkgTGludXMgaW4gSnVseSwKKzIwMDc6CisKKzo6CisKKwlTbyB3ZSBkb24ndCBmaXggYnVncyBieSBpbnRyb2R1Y2luZyBuZXcgcHJvYmxlbXMuICBUaGF0IHdheSBsaWVzCisJbWFkbmVzcywgYW5kIG5vYm9keSBldmVyIGtub3dzIGlmIHlvdSBhY3R1YWxseSBtYWtlIGFueSByZWFsCisJcHJvZ3Jlc3MgYXQgYWxsLiBJcyBpdCB0d28gc3RlcHMgZm9yd2FyZHMsIG9uZSBzdGVwIGJhY2ssIG9yIG9uZQorCXN0ZXAgZm9yd2FyZCBhbmQgdHdvIHN0ZXBzIGJhY2s/CisKKyhodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yNDM0NjAvKS4KKworQW4gZXNwZWNpYWxseSB1bndlbGNvbWUgdHlwZSBvZiByZWdyZXNzaW9uIGlzIGFueSBzb3J0IG9mIGNoYW5nZSB0byB0aGUKK3VzZXItc3BhY2UgQUJJLiAgT25jZSBhbiBpbnRlcmZhY2UgaGFzIGJlZW4gZXhwb3J0ZWQgdG8gdXNlciBzcGFjZSwgaXQgbXVzdAorYmUgc3VwcG9ydGVkIGluZGVmaW5pdGVseS4gIFRoaXMgZmFjdCBtYWtlcyB0aGUgY3JlYXRpb24gb2YgdXNlci1zcGFjZQoraW50ZXJmYWNlcyBwYXJ0aWN1bGFybHkgY2hhbGxlbmdpbmc6IHNpbmNlIHRoZXkgY2Fubm90IGJlIGNoYW5nZWQgaW4KK2luY29tcGF0aWJsZSB3YXlzLCB0aGV5IG11c3QgYmUgZG9uZSByaWdodCB0aGUgZmlyc3QgdGltZS4gIEZvciB0aGlzCityZWFzb24sIGEgZ3JlYXQgZGVhbCBvZiB0aG91Z2h0LCBjbGVhciBkb2N1bWVudGF0aW9uLCBhbmQgd2lkZSByZXZpZXcgZm9yCit1c2VyLXNwYWNlIGludGVyZmFjZXMgaXMgYWx3YXlzIHJlcXVpcmVkLgorCisKK0NvZGUgY2hlY2tpbmcgdG9vbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9yIG5vdywgYXQgbGVhc3QsIHRoZSB3cml0aW5nIG9mIGVycm9yLWZyZWUgY29kZSByZW1haW5zIGFuIGlkZWFsIHRoYXQgZmV3CitvZiB1cyBjYW4gcmVhY2guICBXaGF0IHdlIGNhbiBob3BlIHRvIGRvLCB0aG91Z2gsIGlzIHRvIGNhdGNoIGFuZCBmaXggYXMKK21hbnkgb2YgdGhvc2UgZXJyb3JzIGFzIHBvc3NpYmxlIGJlZm9yZSBvdXIgY29kZSBnb2VzIGludG8gdGhlIG1haW5saW5lCitrZXJuZWwuICBUbyB0aGF0IGVuZCwgdGhlIGtlcm5lbCBkZXZlbG9wZXJzIGhhdmUgcHV0IHRvZ2V0aGVyIGFuIGltcHJlc3NpdmUKK2FycmF5IG9mIHRvb2xzIHdoaWNoIGNhbiBjYXRjaCBhIHdpZGUgdmFyaWV0eSBvZiBvYnNjdXJlIHByb2JsZW1zIGluIGFuCithdXRvbWF0ZWQgd2F5LiAgQW55IHByb2JsZW0gY2F1Z2h0IGJ5IHRoZSBjb21wdXRlciBpcyBhIHByb2JsZW0gd2hpY2ggd2lsbAorbm90IGFmZmxpY3QgYSB1c2VyIGxhdGVyIG9uLCBzbyBpdCBzdGFuZHMgdG8gcmVhc29uIHRoYXQgdGhlIGF1dG9tYXRlZAordG9vbHMgc2hvdWxkIGJlIHVzZWQgd2hlbmV2ZXIgcG9zc2libGUuCisKK1RoZSBmaXJzdCBzdGVwIGlzIHNpbXBseSB0byBoZWVkIHRoZSB3YXJuaW5ncyBwcm9kdWNlZCBieSB0aGUgY29tcGlsZXIuCitDb250ZW1wb3JhcnkgdmVyc2lvbnMgb2YgZ2NjIGNhbiBkZXRlY3QgKGFuZCB3YXJuIGFib3V0KSBhIGxhcmdlIG51bWJlciBvZgorcG90ZW50aWFsIGVycm9ycy4gIFF1aXRlIG9mdGVuLCB0aGVzZSB3YXJuaW5ncyBwb2ludCB0byByZWFsIHByb2JsZW1zLgorQ29kZSBzdWJtaXR0ZWQgZm9yIHJldmlldyBzaG91bGQsIGFzIGEgcnVsZSwgbm90IHByb2R1Y2UgYW55IGNvbXBpbGVyCit3YXJuaW5ncy4gIFdoZW4gc2lsZW5jaW5nIHdhcm5pbmdzLCB0YWtlIGNhcmUgdG8gdW5kZXJzdGFuZCB0aGUgcmVhbCBjYXVzZQorYW5kIHRyeSB0byBhdm9pZCAiZml4ZXMiIHdoaWNoIG1ha2UgdGhlIHdhcm5pbmcgZ28gYXdheSB3aXRob3V0IGFkZHJlc3NpbmcKK2l0cyBjYXVzZS4KKworTm90ZSB0aGF0IG5vdCBhbGwgY29tcGlsZXIgd2FybmluZ3MgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gIEJ1aWxkIHRoZQora2VybmVsIHdpdGggIm1ha2UgRVhUUkFfQ0ZMQUdTPS1XIiB0byBnZXQgdGhlIGZ1bGwgc2V0LgorCitUaGUga2VybmVsIHByb3ZpZGVzIHNldmVyYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIHdoaWNoIHR1cm4gb24gZGVidWdnaW5nCitmZWF0dXJlczsgbW9zdCBvZiB0aGVzZSBhcmUgZm91bmQgaW4gdGhlICJrZXJuZWwgaGFja2luZyIgc3VibWVudS4gIFNldmVyYWwKK29mIHRoZXNlIG9wdGlvbnMgc2hvdWxkIGJlIHR1cm5lZCBvbiBmb3IgYW55IGtlcm5lbCB1c2VkIGZvciBkZXZlbG9wbWVudCBvcgordGVzdGluZyBwdXJwb3Nlcy4gIEluIHBhcnRpY3VsYXIsIHlvdSBzaG91bGQgdHVybiBvbjoKKworIC0gRU5BQkxFX1dBUk5fREVQUkVDQVRFRCwgRU5BQkxFX01VU1RfQ0hFQ0ssIGFuZCBGUkFNRV9XQVJOIHRvIGdldCBhbgorICAgZXh0cmEgc2V0IG9mIHdhcm5pbmdzIGZvciBwcm9ibGVtcyBsaWtlIHRoZSB1c2Ugb2YgZGVwcmVjYXRlZCBpbnRlcmZhY2VzCisgICBvciBpZ25vcmluZyBhbiBpbXBvcnRhbnQgcmV0dXJuIHZhbHVlIGZyb20gYSBmdW5jdGlvbi4gIFRoZSBvdXRwdXQKKyAgIGdlbmVyYXRlZCBieSB0aGVzZSB3YXJuaW5ncyBjYW4gYmUgdmVyYm9zZSwgYnV0IG9uZSBuZWVkIG5vdCB3b3JyeSBhYm91dAorICAgd2FybmluZ3MgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUga2VybmVsLgorCisgLSBERUJVR19PQkpFQ1RTIHdpbGwgYWRkIGNvZGUgdG8gdHJhY2sgdGhlIGxpZmV0aW1lIG9mIHZhcmlvdXMgb2JqZWN0cworICAgY3JlYXRlZCBieSB0aGUga2VybmVsIGFuZCB3YXJuIHdoZW4gdGhpbmdzIGFyZSBkb25lIG91dCBvZiBvcmRlci4gIElmCisgICB5b3UgYXJlIGFkZGluZyBhIHN1YnN5c3RlbSB3aGljaCBjcmVhdGVzIChhbmQgZXhwb3J0cykgY29tcGxleCBvYmplY3RzCisgICBvZiBpdHMgb3duLCBjb25zaWRlciBhZGRpbmcgc3VwcG9ydCBmb3IgdGhlIG9iamVjdCBkZWJ1Z2dpbmcKKyAgIGluZnJhc3RydWN0dXJlLgorCisgLSBERUJVR19TTEFCIGNhbiBmaW5kIGEgdmFyaWV0eSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgdXNlIGVycm9yczsgaXQKKyAgIHNob3VsZCBiZSB1c2VkIG9uIG1vc3QgZGV2ZWxvcG1lbnQga2VybmVscy4KKworIC0gREVCVUdfU1BJTkxPQ0ssIERFQlVHX0FUT01JQ19TTEVFUCwgYW5kIERFQlVHX01VVEVYRVMgd2lsbCBmaW5kIGEKKyAgIG51bWJlciBvZiBjb21tb24gbG9ja2luZyBlcnJvcnMuCisKK1RoZXJlIGFyZSBxdWl0ZSBhIGZldyBvdGhlciBkZWJ1Z2dpbmcgb3B0aW9ucywgc29tZSBvZiB3aGljaCB3aWxsIGJlCitkaXNjdXNzZWQgYmVsb3cuICBTb21lIG9mIHRoZW0gaGF2ZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBhbmQKK3Nob3VsZCBub3QgYmUgdXNlZCBhbGwgb2YgdGhlIHRpbWUuICBCdXQgc29tZSB0aW1lIHNwZW50IGxlYXJuaW5nIHRoZQorYXZhaWxhYmxlIG9wdGlvbnMgd2lsbCBsaWtlbHkgYmUgcGFpZCBiYWNrIG1hbnkgdGltZXMgb3ZlciBpbiBzaG9ydCBvcmRlci4KKworT25lIG9mIHRoZSBoZWF2aWVyIGRlYnVnZ2luZyB0b29scyBpcyB0aGUgbG9ja2luZyBjaGVja2VyLCBvciAibG9ja2RlcC4iCitUaGlzIHRvb2wgd2lsbCB0cmFjayB0aGUgYWNxdWlzaXRpb24gYW5kIHJlbGVhc2Ugb2YgZXZlcnkgbG9jayAoc3BpbmxvY2sgb3IKK211dGV4KSBpbiB0aGUgc3lzdGVtLCB0aGUgb3JkZXIgaW4gd2hpY2ggbG9ja3MgYXJlIGFjcXVpcmVkIHJlbGF0aXZlIHRvCitlYWNoIG90aGVyLCB0aGUgY3VycmVudCBpbnRlcnJ1cHQgZW52aXJvbm1lbnQsIGFuZCBtb3JlLiAgSXQgY2FuIHRoZW4KK2Vuc3VyZSB0aGF0IGxvY2tzIGFyZSBhbHdheXMgYWNxdWlyZWQgaW4gdGhlIHNhbWUgb3JkZXIsIHRoYXQgdGhlIHNhbWUKK2ludGVycnVwdCBhc3N1bXB0aW9ucyBhcHBseSBpbiBhbGwgc2l0dWF0aW9ucywgYW5kIHNvIG9uLiAgSW4gb3RoZXIgd29yZHMsCitsb2NrZGVwIGNhbiBmaW5kIGEgbnVtYmVyIG9mIHNjZW5hcmlvcyBpbiB3aGljaCB0aGUgc3lzdGVtIGNvdWxkLCBvbiByYXJlCitvY2Nhc2lvbiwgZGVhZGxvY2suICBUaGlzIGtpbmQgb2YgcHJvYmxlbSBjYW4gYmUgcGFpbmZ1bCAoZm9yIGJvdGgKK2RldmVsb3BlcnMgYW5kIHVzZXJzKSBpbiBhIGRlcGxveWVkIHN5c3RlbTsgbG9ja2RlcCBhbGxvd3MgdGhlbSB0byBiZSBmb3VuZAoraW4gYW4gYXV0b21hdGVkIG1hbm5lciBhaGVhZCBvZiB0aW1lLiAgQ29kZSB3aXRoIGFueSBzb3J0IG9mIG5vbi10cml2aWFsCitsb2NraW5nIHNob3VsZCBiZSBydW4gd2l0aCBsb2NrZGVwIGVuYWJsZWQgYmVmb3JlIGJlaW5nIHN1Ym1pdHRlZCBmb3IKK2luY2x1c2lvbi4KKworQXMgYSBkaWxpZ2VudCBrZXJuZWwgcHJvZ3JhbW1lciwgeW91IHdpbGwsIGJleW9uZCBkb3VidCwgY2hlY2sgdGhlIHJldHVybgorc3RhdHVzIG9mIGFueSBvcGVyYXRpb24gKHN1Y2ggYXMgYSBtZW1vcnkgYWxsb2NhdGlvbikgd2hpY2ggY2FuIGZhaWwuICBUaGUKK2ZhY3Qgb2YgdGhlIG1hdHRlciwgdGhvdWdoLCBpcyB0aGF0IHRoZSByZXN1bHRpbmcgZmFpbHVyZSByZWNvdmVyeSBwYXRocworYXJlLCBwcm9iYWJseSwgY29tcGxldGVseSB1bnRlc3RlZC4gIFVudGVzdGVkIGNvZGUgdGVuZHMgdG8gYmUgYnJva2VuIGNvZGU7Cit5b3UgY291bGQgYmUgbXVjaCBtb3JlIGNvbmZpZGVudCBvZiB5b3VyIGNvZGUgaWYgYWxsIHRob3NlIGVycm9yLWhhbmRsaW5nCitwYXRocyBoYWQgYmVlbiBleGVyY2lzZWQgYSBmZXcgdGltZXMuCisKK1RoZSBrZXJuZWwgcHJvdmlkZXMgYSBmYXVsdCBpbmplY3Rpb24gZnJhbWV3b3JrIHdoaWNoIGNhbiBkbyBleGFjdGx5IHRoYXQsCitlc3BlY2lhbGx5IHdoZXJlIG1lbW9yeSBhbGxvY2F0aW9ucyBhcmUgaW52b2x2ZWQuICBXaXRoIGZhdWx0IGluamVjdGlvbgorZW5hYmxlZCwgYSBjb25maWd1cmFibGUgcGVyY2VudGFnZSBvZiBtZW1vcnkgYWxsb2NhdGlvbnMgd2lsbCBiZSBtYWRlIHRvCitmYWlsOyB0aGVzZSBmYWlsdXJlcyBjYW4gYmUgcmVzdHJpY3RlZCB0byBhIHNwZWNpZmljIHJhbmdlIG9mIGNvZGUuCitSdW5uaW5nIHdpdGggZmF1bHQgaW5qZWN0aW9uIGVuYWJsZWQgYWxsb3dzIHRoZSBwcm9ncmFtbWVyIHRvIHNlZSBob3cgdGhlCitjb2RlIHJlc3BvbmRzIHdoZW4gdGhpbmdzIGdvIGJhZGx5LiAgU2VlCitEb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCitob3cgdG8gdXNlIHRoaXMgZmFjaWxpdHkuCisKK090aGVyIGtpbmRzIG9mIGVycm9ycyBjYW4gYmUgZm91bmQgd2l0aCB0aGUgInNwYXJzZSIgc3RhdGljIGFuYWx5c2lzIHRvb2wuCitXaXRoIHNwYXJzZSwgdGhlIHByb2dyYW1tZXIgY2FuIGJlIHdhcm5lZCBhYm91dCBjb25mdXNpb24gYmV0d2VlbgordXNlci1zcGFjZSBhbmQga2VybmVsLXNwYWNlIGFkZHJlc3NlcywgbWl4dHVyZSBvZiBiaWctZW5kaWFuIGFuZAorc21hbGwtZW5kaWFuIHF1YW50aXRpZXMsIHRoZSBwYXNzaW5nIG9mIGludGVnZXIgdmFsdWVzIHdoZXJlIGEgc2V0IG9mIGJpdAorZmxhZ3MgaXMgZXhwZWN0ZWQsIGFuZCBzbyBvbi4gIFNwYXJzZSBtdXN0IGJlIGluc3RhbGxlZCBzZXBhcmF0ZWx5IChpdCBjYW4KK2JlIGZvdW5kIGF0IGh0dHBzOi8vc3BhcnNlLndpa2kua2VybmVsLm9yZy9pbmRleC5waHAvTWFpbl9QYWdlIGlmIHlvdXIKK2Rpc3RyaWJ1dG9yIGRvZXMgbm90IHBhY2thZ2UgaXQpOyBpdCBjYW4gdGhlbiBiZSBydW4gb24gdGhlIGNvZGUgYnkgYWRkaW5nCisiQz0xIiB0byB5b3VyIG1ha2UgY29tbWFuZC4KKworVGhlICJDb2NjaW5lbGxlIiB0b29sIChodHRwOi8vY29jY2luZWxsZS5saXA2LmZyLykgaXMgYWJsZSB0byBmaW5kIGEgd2lkZQordmFyaWV0eSBvZiBwb3RlbnRpYWwgY29kaW5nIHByb2JsZW1zOyBpdCBjYW4gYWxzbyBwcm9wb3NlIGZpeGVzIGZvciB0aG9zZQorcHJvYmxlbXMuICBRdWl0ZSBhIGZldyAic2VtYW50aWMgcGF0Y2hlcyIgZm9yIHRoZSBrZXJuZWwgaGF2ZSBiZWVuIHBhY2thZ2VkCit1bmRlciB0aGUgc2NyaXB0cy9jb2NjaW5lbGxlIGRpcmVjdG9yeTsgcnVubmluZyAibWFrZSBjb2NjaWNoZWNrIiB3aWxsIHJ1bgordGhyb3VnaCB0aG9zZSBzZW1hbnRpYyBwYXRjaGVzIGFuZCByZXBvcnQgb24gYW55IHByb2JsZW1zIGZvdW5kLiAgU2VlCitEb2N1bWVudGF0aW9uL2NvY2NpbmVsbGUudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitPdGhlciBraW5kcyBvZiBwb3J0YWJpbGl0eSBlcnJvcnMgYXJlIGJlc3QgZm91bmQgYnkgY29tcGlsaW5nIHlvdXIgY29kZSBmb3IKK290aGVyIGFyY2hpdGVjdHVyZXMuICBJZiB5b3UgZG8gbm90IGhhcHBlbiB0byBoYXZlIGFuIFMvMzkwIHN5c3RlbSBvciBhCitCbGFja2ZpbiBkZXZlbG9wbWVudCBib2FyZCBoYW5keSwgeW91IGNhbiBzdGlsbCBwZXJmb3JtIHRoZSBjb21waWxhdGlvbgorc3RlcC4gIEEgbGFyZ2Ugc2V0IG9mIGNyb3NzIGNvbXBpbGVycyBmb3IgeDg2IHN5c3RlbXMgY2FuIGJlIGZvdW5kIGF0CisKKwlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3Rvb2xzL2Nyb3NzdG9vbC8KKworU29tZSB0aW1lIHNwZW50IGluc3RhbGxpbmcgYW5kIHVzaW5nIHRoZXNlIGNvbXBpbGVycyB3aWxsIGhlbHAgYXZvaWQKK2VtYmFycmFzc21lbnQgbGF0ZXIuCisKKworRG9jdW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLQorCitEb2N1bWVudGF0aW9uIGhhcyBvZnRlbiBiZWVuIG1vcmUgdGhlIGV4Y2VwdGlvbiB0aGFuIHRoZSBydWxlIHdpdGgga2VybmVsCitkZXZlbG9wbWVudC4gIEV2ZW4gc28sIGFkZXF1YXRlIGRvY3VtZW50YXRpb24gd2lsbCBoZWxwIHRvIGVhc2UgdGhlIG1lcmdpbmcKK29mIG5ldyBjb2RlIGludG8gdGhlIGtlcm5lbCwgbWFrZSBsaWZlIGVhc2llciBmb3Igb3RoZXIgZGV2ZWxvcGVycywgYW5kCit3aWxsIGJlIGhlbHBmdWwgZm9yIHlvdXIgdXNlcnMuICBJbiBtYW55IGNhc2VzLCB0aGUgYWRkaXRpb24gb2YKK2RvY3VtZW50YXRpb24gaGFzIGJlY29tZSBlc3NlbnRpYWxseSBtYW5kYXRvcnkuCisKK1RoZSBmaXJzdCBwaWVjZSBvZiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcGF0Y2ggaXMgaXRzIGFzc29jaWF0ZWQKK2NoYW5nZWxvZy4gIExvZyBlbnRyaWVzIHNob3VsZCBkZXNjcmliZSB0aGUgcHJvYmxlbSBiZWluZyBzb2x2ZWQsIHRoZSBmb3JtCitvZiB0aGUgc29sdXRpb24sIHRoZSBwZW9wbGUgd2hvIHdvcmtlZCBvbiB0aGUgcGF0Y2gsIGFueSByZWxldmFudAorZWZmZWN0cyBvbiBwZXJmb3JtYW5jZSwgYW5kIGFueXRoaW5nIGVsc2UgdGhhdCBtaWdodCBiZSBuZWVkZWQgdG8KK3VuZGVyc3RhbmQgdGhlIHBhdGNoLiAgQmUgc3VyZSB0aGF0IHRoZSBjaGFuZ2Vsb2cgc2F5cyAqd2h5KiB0aGUgcGF0Y2ggaXMKK3dvcnRoIGFwcGx5aW5nOyBhIHN1cnByaXNpbmcgbnVtYmVyIG9mIGRldmVsb3BlcnMgZmFpbCB0byBwcm92aWRlIHRoYXQKK2luZm9ybWF0aW9uLgorCitBbnkgY29kZSB3aGljaCBhZGRzIGEgbmV3IHVzZXItc3BhY2UgaW50ZXJmYWNlIC0gaW5jbHVkaW5nIG5ldyBzeXNmcyBvcgorL3Byb2MgZmlsZXMgLSBzaG91bGQgaW5jbHVkZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgaW50ZXJmYWNlIHdoaWNoIGVuYWJsZXMKK3VzZXItc3BhY2UgZGV2ZWxvcGVycyB0byBrbm93IHdoYXQgdGhleSBhcmUgd29ya2luZyB3aXRoLiAgU2VlCitEb2N1bWVudGF0aW9uL0FCSS9SRUFETUUgZm9yIGEgZGVzY3JpcHRpb24gb2YgaG93IHRoaXMgZG9jdW1lbnRhdGlvbiBzaG91bGQKK2JlIGZvcm1hdHRlZCBhbmQgd2hhdCBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSBwcm92aWRlZC4KKworVGhlIGZpbGUgRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgZGVzY3JpYmVzIGFsbCBvZiB0aGUga2VybmVsJ3MKK2Jvb3QtdGltZSBwYXJhbWV0ZXJzLiAgQW55IHBhdGNoIHdoaWNoIGFkZHMgbmV3IHBhcmFtZXRlcnMgc2hvdWxkIGFkZCB0aGUKK2FwcHJvcHJpYXRlIGVudHJpZXMgdG8gdGhpcyBmaWxlLgorCitBbnkgbmV3IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGhlbHAgdGV4dCB3aGljaAorY2xlYXJseSBleHBsYWlucyB0aGUgb3B0aW9ucyBhbmQgd2hlbiB0aGUgdXNlciBtaWdodCB3YW50IHRvIHNlbGVjdCB0aGVtLgorCitJbnRlcm5hbCBBUEkgaW5mb3JtYXRpb24gZm9yIG1hbnkgc3Vic3lzdGVtcyBpcyBkb2N1bWVudGVkIGJ5IHdheSBvZgorc3BlY2lhbGx5LWZvcm1hdHRlZCBjb21tZW50czsgdGhlc2UgY29tbWVudHMgY2FuIGJlIGV4dHJhY3RlZCBhbmQgZm9ybWF0dGVkCitpbiBhIG51bWJlciBvZiB3YXlzIGJ5IHRoZSAia2VybmVsLWRvYyIgc2NyaXB0LiAgSWYgeW91IGFyZSB3b3JraW5nIHdpdGhpbgorYSBzdWJzeXN0ZW0gd2hpY2ggaGFzIGtlcm5lbGRvYyBjb21tZW50cywgeW91IHNob3VsZCBtYWludGFpbiB0aGVtIGFuZCBhZGQKK3RoZW0sIGFzIGFwcHJvcHJpYXRlLCBmb3IgZXh0ZXJuYWxseS1hdmFpbGFibGUgZnVuY3Rpb25zLiAgRXZlbiBpbiBhcmVhcword2hpY2ggaGF2ZSBub3QgYmVlbiBzbyBkb2N1bWVudGVkLCB0aGVyZSBpcyBubyBoYXJtIGluIGFkZGluZyBrZXJuZWxkb2MKK2NvbW1lbnRzIGZvciB0aGUgZnV0dXJlOyBpbmRlZWQsIHRoaXMgY2FuIGJlIGEgdXNlZnVsIGFjdGl2aXR5IGZvcgorYmVnaW5uaW5nIGtlcm5lbCBkZXZlbG9wZXJzLiAgVGhlIGZvcm1hdCBvZiB0aGVzZSBjb21tZW50cywgYWxvbmcgd2l0aCBzb21lCitpbmZvcm1hdGlvbiBvbiBob3cgdG8gY3JlYXRlIGtlcm5lbGRvYyB0ZW1wbGF0ZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlCitEb2N1bWVudGF0aW9uL2tlcm5lbC1kb2N1bWVudGF0aW9uLnJzdC4KKworQW55Ym9keSB3aG8gcmVhZHMgdGhyb3VnaCBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBleGlzdGluZyBrZXJuZWwgY29kZSB3aWxsCitub3RlIHRoYXQsIG9mdGVuLCBjb21tZW50cyBhcmUgbW9zdCBub3RhYmxlIGJ5IHRoZWlyIGFic2VuY2UuICBPbmNlIGFnYWluLAordGhlIGV4cGVjdGF0aW9ucyBmb3IgbmV3IGNvZGUgYXJlIGhpZ2hlciB0aGFuIHRoZXkgd2VyZSBpbiB0aGUgcGFzdDsKK21lcmdpbmcgdW5jb21tZW50ZWQgY29kZSB3aWxsIGJlIGhhcmRlci4gIFRoYXQgc2FpZCwgdGhlcmUgaXMgbGl0dGxlIGRlc2lyZQorZm9yIHZlcmJvc2VseS1jb21tZW50ZWQgY29kZS4gIFRoZSBjb2RlIHNob3VsZCwgaXRzZWxmLCBiZSByZWFkYWJsZSwgd2l0aAorY29tbWVudHMgZXhwbGFpbmluZyB0aGUgbW9yZSBzdWJ0bGUgYXNwZWN0cy4KKworQ2VydGFpbiB0aGluZ3Mgc2hvdWxkIGFsd2F5cyBiZSBjb21tZW50ZWQuICBVc2VzIG9mIG1lbW9yeSBiYXJyaWVycyBzaG91bGQKK2JlIGFjY29tcGFuaWVkIGJ5IGEgbGluZSBleHBsYWluaW5nIHdoeSB0aGUgYmFycmllciBpcyBuZWNlc3NhcnkuICBUaGUKK2xvY2tpbmcgcnVsZXMgZm9yIGRhdGEgc3RydWN0dXJlcyBnZW5lcmFsbHkgbmVlZCB0byBiZSBleHBsYWluZWQgc29tZXdoZXJlLgorTWFqb3IgZGF0YSBzdHJ1Y3R1cmVzIG5lZWQgY29tcHJlaGVuc2l2ZSBkb2N1bWVudGF0aW9uIGluIGdlbmVyYWwuCitOb24tb2J2aW91cyBkZXBlbmRlbmNpZXMgYmV0d2VlbiBzZXBhcmF0ZSBiaXRzIG9mIGNvZGUgc2hvdWxkIGJlIHBvaW50ZWQKK291dC4gIEFueXRoaW5nIHdoaWNoIG1pZ2h0IHRlbXB0IGEgY29kZSBqYW5pdG9yIHRvIG1ha2UgYW4gaW5jb3JyZWN0CisiY2xlYW51cCIgbmVlZHMgYSBjb21tZW50IHNheWluZyB3aHkgaXQgaXMgZG9uZSB0aGUgd2F5IGl0IGlzLiAgQW5kIHNvIG9uLgorCisKK0ludGVybmFsIEFQSSBjaGFuZ2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgYmluYXJ5IGludGVyZmFjZSBwcm92aWRlZCBieSB0aGUga2VybmVsIHRvIHVzZXIgc3BhY2UgY2Fubm90IGJlIGJyb2tlbgorZXhjZXB0IHVuZGVyIHRoZSBtb3N0IHNldmVyZSBjaXJjdW1zdGFuY2VzLiAgVGhlIGtlcm5lbCdzIGludGVybmFsCitwcm9ncmFtbWluZyBpbnRlcmZhY2VzLCBpbnN0ZWFkLCBhcmUgaGlnaGx5IGZsdWlkIGFuZCBjYW4gYmUgY2hhbmdlZCB3aGVuCit0aGUgbmVlZCBhcmlzZXMuICBJZiB5b3UgZmluZCB5b3Vyc2VsZiBoYXZpbmcgdG8gd29yayBhcm91bmQgYSBrZXJuZWwgQVBJLAorb3Igc2ltcGx5IG5vdCB1c2luZyBhIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBtZWV0IHlvdXIKK25lZWRzLCB0aGF0IG1heSBiZSBhIHNpZ24gdGhhdCB0aGUgQVBJIG5lZWRzIHRvIGNoYW5nZS4gIEFzIGEga2VybmVsCitkZXZlbG9wZXIsIHlvdSBhcmUgZW1wb3dlcmVkIHRvIG1ha2Ugc3VjaCBjaGFuZ2VzLgorCitUaGVyZSBhcmUsIG9mIGNvdXJzZSwgc29tZSBjYXRjaGVzLiAgQVBJIGNoYW5nZXMgY2FuIGJlIG1hZGUsIGJ1dCB0aGV5IG5lZWQKK3RvIGJlIHdlbGwganVzdGlmaWVkLiAgU28gYW55IHBhdGNoIG1ha2luZyBhbiBpbnRlcm5hbCBBUEkgY2hhbmdlIHNob3VsZCBiZQorYWNjb21wYW5pZWQgYnkgYSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBjaGFuZ2UgaXMgYW5kIHdoeSBpdCBpcworbmVjZXNzYXJ5LiAgVGhpcyBraW5kIG9mIGNoYW5nZSBzaG91bGQgYWxzbyBiZSBicm9rZW4gb3V0IGludG8gYSBzZXBhcmF0ZQorcGF0Y2gsIHJhdGhlciB0aGFuIGJ1cmllZCB3aXRoaW4gYSBsYXJnZXIgcGF0Y2guCisKK1RoZSBvdGhlciBjYXRjaCBpcyB0aGF0IGEgZGV2ZWxvcGVyIHdobyBjaGFuZ2VzIGFuIGludGVybmFsIEFQSSBpcworZ2VuZXJhbGx5IGNoYXJnZWQgd2l0aCB0aGUgdGFzayBvZiBmaXhpbmcgYW55IGNvZGUgd2l0aGluIHRoZSBrZXJuZWwgdHJlZQord2hpY2ggaXMgYnJva2VuIGJ5IHRoZSBjaGFuZ2UuICBGb3IgYSB3aWRlbHktdXNlZCBmdW5jdGlvbiwgdGhpcyBkdXR5IGNhbgorbGVhZCB0byBsaXRlcmFsbHkgaHVuZHJlZHMgb3IgdGhvdXNhbmRzIG9mIGNoYW5nZXMgLSBtYW55IG9mIHdoaWNoIGFyZQorbGlrZWx5IHRvIGNvbmZsaWN0IHdpdGggd29yayBiZWluZyBkb25lIGJ5IG90aGVyIGRldmVsb3BlcnMuICBOZWVkbGVzcyB0bworc2F5LCB0aGlzIGNhbiBiZSBhIGxhcmdlIGpvYiwgc28gaXQgaXMgYmVzdCB0byBiZSBzdXJlIHRoYXQgdGhlCitqdXN0aWZpY2F0aW9uIGlzIHNvbGlkLiAgTm90ZSB0aGF0IHRoZSBDb2NjaW5lbGxlIHRvb2wgY2FuIGhlbHAgd2l0aAord2lkZS1yYW5naW5nIEFQSSBjaGFuZ2VzLgorCitXaGVuIG1ha2luZyBhbiBpbmNvbXBhdGlibGUgQVBJIGNoYW5nZSwgb25lIHNob3VsZCwgd2hlbmV2ZXIgcG9zc2libGUsCitlbnN1cmUgdGhhdCBjb2RlIHdoaWNoIGhhcyBub3QgYmVlbiB1cGRhdGVkIGlzIGNhdWdodCBieSB0aGUgY29tcGlsZXIuCitUaGlzIHdpbGwgaGVscCB5b3UgdG8gYmUgc3VyZSB0aGF0IHlvdSBoYXZlIGZvdW5kIGFsbCBpbi10cmVlIHVzZXMgb2YgdGhhdAoraW50ZXJmYWNlLiAgSXQgd2lsbCBhbHNvIGFsZXJ0IGRldmVsb3BlcnMgb2Ygb3V0LW9mLXRyZWUgY29kZSB0aGF0IHRoZXJlIGlzCithIGNoYW5nZSB0aGF0IHRoZXkgbmVlZCB0byByZXNwb25kIHRvLiAgU3VwcG9ydGluZyBvdXQtb2YtdHJlZSBjb2RlIGlzIG5vdAorc29tZXRoaW5nIHRoYXQga2VybmVsIGRldmVsb3BlcnMgbmVlZCB0byBiZSB3b3JyaWVkIGFib3V0LCBidXQgd2UgYWxzbyBkbworbm90IGhhdmUgdG8gbWFrZSBsaWZlIGhhcmRlciBmb3Igb3V0LW9mLXRyZWUgZGV2ZWxvcGVycyB0aGFuIGl0IG5lZWRzIHRvCitiZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy81LlBvc3RpbmcgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNS5Qb3N0aW5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQ4YzliLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy81LlBvc3RpbmcKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotNTogUE9TVElORyBQQVRDSEVTCi0KLVNvb25lciBvciBsYXRlciwgdGhlIHRpbWUgY29tZXMgd2hlbiB5b3VyIHdvcmsgaXMgcmVhZHkgdG8gYmUgcHJlc2VudGVkIHRvCi10aGUgY29tbXVuaXR5IGZvciByZXZpZXcgYW5kLCBldmVudHVhbGx5LCBpbmNsdXNpb24gaW50byB0aGUgbWFpbmxpbmUKLWtlcm5lbC4gIFVuc3VycHJpc2luZ2x5LCB0aGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eSBoYXMgZXZvbHZlZCBhIHNldAotb2YgY29udmVudGlvbnMgYW5kIHByb2NlZHVyZXMgd2hpY2ggYXJlIHVzZWQgaW4gdGhlIHBvc3Rpbmcgb2YgcGF0Y2hlczsKLWZvbGxvd2luZyB0aGVtIHdpbGwgbWFrZSBsaWZlIG11Y2ggZWFzaWVyIGZvciBldmVyeWJvZHkgaW52b2x2ZWQuICBUaGlzCi1kb2N1bWVudCB3aWxsIGF0dGVtcHQgdG8gY292ZXIgdGhlc2UgZXhwZWN0YXRpb25zIGluIHJlYXNvbmFibGUgZGV0YWlsOwotbW9yZSBpbmZvcm1hdGlvbiBjYW4gYWxzbyBiZSBmb3VuZCBpbiB0aGUgZmlsZXMgU3VibWl0dGluZ1BhdGNoZXMsCi1TdWJtaXR0aW5nRHJpdmVycywgYW5kIFN1Ym1pdENoZWNrbGlzdCBpbiB0aGUga2VybmVsIGRvY3VtZW50YXRpb24KLWRpcmVjdG9yeS4KLQotCi01LjE6IFdIRU4gVE8gUE9TVAotCi1UaGVyZSBpcyBhIGNvbnN0YW50IHRlbXB0YXRpb24gdG8gYXZvaWQgcG9zdGluZyBwYXRjaGVzIGJlZm9yZSB0aGV5IGFyZQotY29tcGxldGVseSAicmVhZHkuIiAgRm9yIHNpbXBsZSBwYXRjaGVzLCB0aGF0IGlzIG5vdCBhIHByb2JsZW0uICBJZiB0aGUKLXdvcmsgYmVpbmcgZG9uZSBpcyBjb21wbGV4LCB0aG91Z2gsIHRoZXJlIGlzIGEgbG90IHRvIGJlIGdhaW5lZCBieSBnZXR0aW5nCi1mZWVkYmFjayBmcm9tIHRoZSBjb21tdW5pdHkgYmVmb3JlIHRoZSB3b3JrIGlzIGNvbXBsZXRlLiAgU28geW91IHNob3VsZAotY29uc2lkZXIgcG9zdGluZyBpbi1wcm9ncmVzcyB3b3JrLCBvciBldmVuIG1ha2luZyBhIGdpdCB0cmVlIGF2YWlsYWJsZSBzbwotdGhhdCBpbnRlcmVzdGVkIGRldmVsb3BlcnMgY2FuIGNhdGNoIHVwIHdpdGggeW91ciB3b3JrIGF0IGFueSB0aW1lLgotCi1XaGVuIHBvc3RpbmcgY29kZSB3aGljaCBpcyBub3QgeWV0IGNvbnNpZGVyZWQgcmVhZHkgZm9yIGluY2x1c2lvbiwgaXQgaXMgYQotZ29vZCBpZGVhIHRvIHNheSBzbyBpbiB0aGUgcG9zdGluZyBpdHNlbGYuICBBbHNvIG1lbnRpb24gYW55IG1ham9yIHdvcmsKLXdoaWNoIHJlbWFpbnMgdG8gYmUgZG9uZSBhbmQgYW55IGtub3duIHByb2JsZW1zLiAgRmV3ZXIgcGVvcGxlIHdpbGwgbG9vayBhdAotcGF0Y2hlcyB3aGljaCBhcmUga25vd24gdG8gYmUgaGFsZi1iYWtlZCwgYnV0IHRob3NlIHdobyBkbyB3aWxsIGNvbWUgaW4KLXdpdGggdGhlIGlkZWEgdGhhdCB0aGV5IGNhbiBoZWxwIHlvdSBkcml2ZSB0aGUgd29yayBpbiB0aGUgcmlnaHQgZGlyZWN0aW9uLgotCi0KLTUuMjogQkVGT1JFIENSRUFUSU5HIFBBVENIRVMKLQotVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB3aGljaCBzaG91bGQgYmUgZG9uZSBiZWZvcmUgeW91IGNvbnNpZGVyCi1zZW5kaW5nIHBhdGNoZXMgdG8gdGhlIGRldmVsb3BtZW50IGNvbW11bml0eS4gIFRoZXNlIGluY2x1ZGU6Ci0KLSAtIFRlc3QgdGhlIGNvZGUgdG8gdGhlIGV4dGVudCB0aGF0IHlvdSBjYW4uICBNYWtlIHVzZSBvZiB0aGUga2VybmVsJ3MKLSAgIGRlYnVnZ2luZyB0b29scywgZW5zdXJlIHRoYXQgdGhlIGtlcm5lbCB3aWxsIGJ1aWxkIHdpdGggYWxsIHJlYXNvbmFibGUKLSAgIGNvbWJpbmF0aW9ucyBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHVzZSBjcm9zcy1jb21waWxlcnMgdG8gYnVpbGQgZm9yCi0gICBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcywgZXRjLgotCi0gLSBNYWtlIHN1cmUgeW91ciBjb2RlIGlzIGNvbXBsaWFudCB3aXRoIHRoZSBrZXJuZWwgY29kaW5nIHN0eWxlCi0gICBndWlkZWxpbmVzLgotCi0gLSBEb2VzIHlvdXIgY2hhbmdlIGhhdmUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zPyAgSWYgc28sIHlvdSBzaG91bGQgcnVuCi0gICBiZW5jaG1hcmtzIHNob3dpbmcgd2hhdCB0aGUgaW1wYWN0IChvciBiZW5lZml0KSBvZiB5b3VyIGNoYW5nZSBpczsgYQotICAgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cyBzaG91bGQgYmUgaW5jbHVkZWQgd2l0aCB0aGUgcGF0Y2guCi0KLSAtIEJlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgcmlnaHQgdG8gcG9zdCB0aGUgY29kZS4gIElmIHRoaXMgd29yayB3YXMgZG9uZQotICAgZm9yIGFuIGVtcGxveWVyLCB0aGUgZW1wbG95ZXIgbGlrZWx5IGhhcyBhIHJpZ2h0IHRvIHRoZSB3b3JrIGFuZCBtdXN0IGJlCi0gICBhZ3JlZWFibGUgd2l0aCBpdHMgcmVsZWFzZSB1bmRlciB0aGUgR1BMLgotCi1BcyBhIGdlbmVyYWwgcnVsZSwgcHV0dGluZyBpbiBzb21lIGV4dHJhIHRob3VnaHQgYmVmb3JlIHBvc3RpbmcgY29kZSBhbG1vc3QKLWFsd2F5cyBwYXlzIGJhY2sgdGhlIGVmZm9ydCBpbiBzaG9ydCBvcmRlci4KLQotCi01LjM6IFBBVENIIFBSRVBBUkFUSU9OCi0KLVRoZSBwcmVwYXJhdGlvbiBvZiBwYXRjaGVzIGZvciBwb3N0aW5nIGNhbiBiZSBhIHN1cnByaXNpbmcgYW1vdW50IG9mIHdvcmssCi1idXQsIG9uY2UgYWdhaW4sIGF0dGVtcHRpbmcgdG8gc2F2ZSB0aW1lIGhlcmUgaXMgbm90IGdlbmVyYWxseSBhZHZpc2FibGUKLWV2ZW4gaW4gdGhlIHNob3J0IHRlcm0uCi0KLVBhdGNoZXMgbXVzdCBiZSBwcmVwYXJlZCBhZ2FpbnN0IGEgc3BlY2lmaWMgdmVyc2lvbiBvZiB0aGUga2VybmVsLiAgQXMgYQotZ2VuZXJhbCBydWxlLCBhIHBhdGNoIHNob3VsZCBiZSBiYXNlZCBvbiB0aGUgY3VycmVudCBtYWlubGluZSBhcyBmb3VuZCBpbgotTGludXMncyBnaXQgdHJlZS4gIFdoZW4gYmFzaW5nIG9uIG1haW5saW5lLCBzdGFydCB3aXRoIGEgd2VsbC1rbm93biByZWxlYXNlCi1wb2ludCAtIGEgc3RhYmxlIG9yIC1yYyByZWxlYXNlIC0gcmF0aGVyIHRoYW4gYnJhbmNoaW5nIG9mZiB0aGUgbWFpbmxpbmUgYXQKLWFuIGFyYml0cmFyeSBzcG90LgotCi1JdCBtYXkgYmVjb21lIG5lY2Vzc2FyeSB0byBtYWtlIHZlcnNpb25zIGFnYWluc3QgLW1tLCBsaW51eC1uZXh0LCBvciBhCi1zdWJzeXN0ZW0gdHJlZSwgdGhvdWdoLCB0byBmYWNpbGl0YXRlIHdpZGVyIHRlc3RpbmcgYW5kIHJldmlldy4gIERlcGVuZGluZwotb24gdGhlIGFyZWEgb2YgeW91ciBwYXRjaCBhbmQgd2hhdCBpcyBnb2luZyBvbiBlbHNld2hlcmUsIGJhc2luZyBhIHBhdGNoCi1hZ2FpbnN0IHRoZXNlIG90aGVyIHRyZWVzIGNhbiByZXF1aXJlIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHdvcmsKLXJlc29sdmluZyBjb25mbGljdHMgYW5kIGRlYWxpbmcgd2l0aCBBUEkgY2hhbmdlcy4KLQotT25seSB0aGUgbW9zdCBzaW1wbGUgY2hhbmdlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIGEgc2luZ2xlIHBhdGNoOwotZXZlcnl0aGluZyBlbHNlIHNob3VsZCBiZSBtYWRlIGFzIGEgbG9naWNhbCBzZXJpZXMgb2YgY2hhbmdlcy4gIFNwbGl0dGluZwotdXAgcGF0Y2hlcyBpcyBhIGJpdCBvZiBhbiBhcnQ7IHNvbWUgZGV2ZWxvcGVycyBzcGVuZCBhIGxvbmcgdGltZSBmaWd1cmluZwotb3V0IGhvdyB0byBkbyBpdCBpbiB0aGUgd2F5IHRoYXQgdGhlIGNvbW11bml0eSBleHBlY3RzLiAgVGhlcmUgYXJlIGEgZmV3Ci1ydWxlcyBvZiB0aHVtYiwgaG93ZXZlciwgd2hpY2ggY2FuIGhlbHAgY29uc2lkZXJhYmx5OgotCi0gLSBUaGUgcGF0Y2ggc2VyaWVzIHlvdSBwb3N0IHdpbGwgYWxtb3N0IGNlcnRhaW5seSBub3QgYmUgdGhlIHNlcmllcyBvZgotICAgY2hhbmdlcyBmb3VuZCBpbiB5b3VyIHdvcmtpbmcgcmV2aXNpb24gY29udHJvbCBzeXN0ZW0uICBJbnN0ZWFkLCB0aGUKLSAgIGNoYW5nZXMgeW91IGhhdmUgbWFkZSBuZWVkIHRvIGJlIGNvbnNpZGVyZWQgaW4gdGhlaXIgZmluYWwgZm9ybSwgdGhlbgotICAgc3BsaXQgYXBhcnQgaW4gd2F5cyB3aGljaCBtYWtlIHNlbnNlLiAgVGhlIGRldmVsb3BlcnMgYXJlIGludGVyZXN0ZWQgaW4KLSAgIGRpc2NyZXRlLCBzZWxmLWNvbnRhaW5lZCBjaGFuZ2VzLCBub3QgdGhlIHBhdGggeW91IHRvb2sgdG8gZ2V0IHRvIHRob3NlCi0gICBjaGFuZ2VzLgotCi0gLSBFYWNoIGxvZ2ljYWxseSBpbmRlcGVuZGVudCBjaGFuZ2Ugc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBhIHNlcGFyYXRlCi0gICBwYXRjaC4gIFRoZXNlIGNoYW5nZXMgY2FuIGJlIHNtYWxsICgiYWRkIGEgZmllbGQgdG8gdGhpcyBzdHJ1Y3R1cmUiKSBvcgotICAgbGFyZ2UgKGFkZGluZyBhIHNpZ25pZmljYW50IG5ldyBkcml2ZXIsIGZvciBleGFtcGxlKSwgYnV0IHRoZXkgc2hvdWxkIGJlCi0gICBjb25jZXB0dWFsbHkgc21hbGwgYW5kIGFtZW5hYmxlIHRvIGEgb25lLWxpbmUgZGVzY3JpcHRpb24uICBFYWNoIHBhdGNoCi0gICBzaG91bGQgbWFrZSBhIHNwZWNpZmljIGNoYW5nZSB3aGljaCBjYW4gYmUgcmV2aWV3ZWQgb24gaXRzIG93biBhbmQKLSAgIHZlcmlmaWVkIHRvIGRvIHdoYXQgaXQgc2F5cyBpdCBkb2VzLgotCi0gLSBBcyBhIHdheSBvZiByZXN0YXRpbmcgdGhlIGd1aWRlbGluZSBhYm92ZTogZG8gbm90IG1peCBkaWZmZXJlbnQgdHlwZXMgb2YKLSAgIGNoYW5nZXMgaW4gdGhlIHNhbWUgcGF0Y2guICBJZiBhIHNpbmdsZSBwYXRjaCBmaXhlcyBhIGNyaXRpY2FsIHNlY3VyaXR5Ci0gICBidWcsIHJlYXJyYW5nZXMgYSBmZXcgc3RydWN0dXJlcywgYW5kIHJlZm9ybWF0cyB0aGUgY29kZSwgdGhlcmUgaXMgYQotICAgZ29vZCBjaGFuY2UgdGhhdCBpdCB3aWxsIGJlIHBhc3NlZCBvdmVyIGFuZCB0aGUgaW1wb3J0YW50IGZpeCB3aWxsIGJlCi0gICBsb3N0LgotCi0gLSBFYWNoIHBhdGNoIHNob3VsZCB5aWVsZCBhIGtlcm5lbCB3aGljaCBidWlsZHMgYW5kIHJ1bnMgcHJvcGVybHk7IGlmIHlvdXIKLSAgIHBhdGNoIHNlcmllcyBpcyBpbnRlcnJ1cHRlZCBpbiB0aGUgbWlkZGxlLCB0aGUgcmVzdWx0IHNob3VsZCBzdGlsbCBiZSBhCi0gICB3b3JraW5nIGtlcm5lbC4gIFBhcnRpYWwgYXBwbGljYXRpb24gb2YgYSBwYXRjaCBzZXJpZXMgaXMgYSBjb21tb24KLSAgIHNjZW5hcmlvIHdoZW4gdGhlICJnaXQgYmlzZWN0IiB0b29sIGlzIHVzZWQgdG8gZmluZCByZWdyZXNzaW9uczsgaWYgdGhlCi0gICByZXN1bHQgaXMgYSBicm9rZW4ga2VybmVsLCB5b3Ugd2lsbCBtYWtlIGxpZmUgaGFyZGVyIGZvciBkZXZlbG9wZXJzIGFuZAotICAgdXNlcnMgd2hvIGFyZSBlbmdhZ2luZyBpbiB0aGUgbm9ibGUgd29yayBvZiB0cmFja2luZyBkb3duIHByb2JsZW1zLgotCi0gLSBEbyBub3Qgb3ZlcmRvIGl0LCB0aG91Z2guICBPbmUgZGV2ZWxvcGVyIG9uY2UgcG9zdGVkIGEgc2V0IG9mIGVkaXRzCi0gICB0byBhIHNpbmdsZSBmaWxlIGFzIDUwMCBzZXBhcmF0ZSBwYXRjaGVzIC0gYW4gYWN0IHdoaWNoIGRpZCBub3QgbWFrZSBoaW0KLSAgIHRoZSBtb3N0IHBvcHVsYXIgcGVyc29uIG9uIHRoZSBrZXJuZWwgbWFpbGluZyBsaXN0LiAgQSBzaW5nbGUgcGF0Y2ggY2FuCi0gICBiZSByZWFzb25hYmx5IGxhcmdlIGFzIGxvbmcgYXMgaXQgc3RpbGwgY29udGFpbnMgYSBzaW5nbGUgKmxvZ2ljYWwqCi0gICBjaGFuZ2UuCi0KLSAtIEl0IGNhbiBiZSB0ZW1wdGluZyB0byBhZGQgYSB3aG9sZSBuZXcgaW5mcmFzdHJ1Y3R1cmUgd2l0aCBhIHNlcmllcyBvZgotICAgcGF0Y2hlcywgYnV0IHRvIGxlYXZlIHRoYXQgaW5mcmFzdHJ1Y3R1cmUgdW51c2VkIHVudGlsIHRoZSBmaW5hbCBwYXRjaAotICAgaW4gdGhlIHNlcmllcyBlbmFibGVzIHRoZSB3aG9sZSB0aGluZy4gIFRoaXMgdGVtcHRhdGlvbiBzaG91bGQgYmUKLSAgIGF2b2lkZWQgaWYgcG9zc2libGU7IGlmIHRoYXQgc2VyaWVzIGFkZHMgcmVncmVzc2lvbnMsIGJpc2VjdGlvbiB3aWxsCi0gICBmaW5nZXIgdGhlIGxhc3QgcGF0Y2ggYXMgdGhlIG9uZSB3aGljaCBjYXVzZWQgdGhlIHByb2JsZW0sIGV2ZW4gdGhvdWdoCi0gICB0aGUgcmVhbCBidWcgaXMgZWxzZXdoZXJlLiAgV2hlbmV2ZXIgcG9zc2libGUsIGEgcGF0Y2ggd2hpY2ggYWRkcyBuZXcKLSAgIGNvZGUgc2hvdWxkIG1ha2UgdGhhdCBjb2RlIGFjdGl2ZSBpbW1lZGlhdGVseS4KLQotV29ya2luZyB0byBjcmVhdGUgdGhlIHBlcmZlY3QgcGF0Y2ggc2VyaWVzIGNhbiBiZSBhIGZydXN0cmF0aW5nIHByb2Nlc3MKLXdoaWNoIHRha2VzIHF1aXRlIGEgYml0IG9mIHRpbWUgYW5kIHRob3VnaHQgYWZ0ZXIgdGhlICJyZWFsIHdvcmsiIGhhcyBiZWVuCi1kb25lLiAgV2hlbiBkb25lIHByb3Blcmx5LCB0aG91Z2gsIGl0IGlzIHRpbWUgd2VsbCBzcGVudC4KLQotCi01LjQ6IFBBVENIIEZPUk1BVFRJTkcgQU5EIENIQU5HRUxPR1MKLQotU28gbm93IHlvdSBoYXZlIGEgcGVyZmVjdCBzZXJpZXMgb2YgcGF0Y2hlcyBmb3IgcG9zdGluZywgYnV0IHRoZSB3b3JrIGlzCi1ub3QgZG9uZSBxdWl0ZSB5ZXQuICBFYWNoIHBhdGNoIG5lZWRzIHRvIGJlIGZvcm1hdHRlZCBpbnRvIGEgbWVzc2FnZSB3aGljaAotcXVpY2tseSBhbmQgY2xlYXJseSBjb21tdW5pY2F0ZXMgaXRzIHB1cnBvc2UgdG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmxkLiAgVG8KLXRoYXQgZW5kLCBlYWNoIHBhdGNoIHdpbGwgYmUgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZzoKLQotIC0gQW4gb3B0aW9uYWwgIkZyb20iIGxpbmUgbmFtaW5nIHRoZSBhdXRob3Igb2YgdGhlIHBhdGNoLiAgVGhpcyBsaW5lIGlzCi0gICBvbmx5IG5lY2Vzc2FyeSBpZiB5b3UgYXJlIHBhc3Npbmcgb24gc29tZWJvZHkgZWxzZSdzIHBhdGNoIHZpYSBlbWFpbCwKLSAgIGJ1dCBpdCBuZXZlciBodXJ0cyB0byBhZGQgaXQgd2hlbiBpbiBkb3VidC4KLQotIC0gQSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBwYXRjaCBkb2VzLiAgVGhpcyBtZXNzYWdlIHNob3VsZCBiZQotICAgZW5vdWdoIGZvciBhIHJlYWRlciB3aG8gc2VlcyBpdCB3aXRoIG5vIG90aGVyIGNvbnRleHQgdG8gZmlndXJlIG91dCB0aGUKLSAgIHNjb3BlIG9mIHRoZSBwYXRjaDsgaXQgaXMgdGhlIGxpbmUgdGhhdCB3aWxsIHNob3cgdXAgaW4gdGhlICJzaG9ydCBmb3JtIgotICAgY2hhbmdlbG9ncy4gIFRoaXMgbWVzc2FnZSBpcyB1c3VhbGx5IGZvcm1hdHRlZCB3aXRoIHRoZSByZWxldmFudAotICAgc3Vic3lzdGVtIG5hbWUgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBwdXJwb3NlIG9mIHRoZSBwYXRjaC4gIEZvcgotICAgZXhhbXBsZToKLQotCWdwaW86IGZpeCBidWlsZCBvbiBDT05GSUdfR1BJT19TWVNGUz1uCi0KLSAtIEEgYmxhbmsgbGluZSBmb2xsb3dlZCBieSBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZiB0aGUKLSAgIHBhdGNoLiAgVGhpcyBkZXNjcmlwdGlvbiBjYW4gYmUgYXMgbG9uZyBhcyBpcyByZXF1aXJlZDsgaXQgc2hvdWxkIHNheQotICAgd2hhdCB0aGUgcGF0Y2ggZG9lcyBhbmQgd2h5IGl0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBrZXJuZWwuCi0KLSAtIE9uZSBvciBtb3JlIHRhZyBsaW5lcywgd2l0aCwgYXQgYSBtaW5pbXVtLCBvbmUgU2lnbmVkLW9mZi1ieTogbGluZSBmcm9tCi0gICB0aGUgYXV0aG9yIG9mIHRoZSBwYXRjaC4gIFRhZ3Mgd2lsbCBiZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cuCi0KLVRoZSBpdGVtcyBhYm92ZSwgdG9nZXRoZXIsIGZvcm0gdGhlIGNoYW5nZWxvZyBmb3IgdGhlIHBhdGNoLiAgV3JpdGluZyBnb29kCi1jaGFuZ2Vsb2dzIGlzIGEgY3J1Y2lhbCBidXQgb2Z0ZW4tbmVnbGVjdGVkIGFydDsgaXQncyB3b3J0aCBzcGVuZGluZwotYW5vdGhlciBtb21lbnQgZGlzY3Vzc2luZyB0aGlzIGlzc3VlLiAgV2hlbiB3cml0aW5nIGEgY2hhbmdlbG9nLCB5b3Ugc2hvdWxkCi1iZWFyIGluIG1pbmQgdGhhdCBhIG51bWJlciBvZiBkaWZmZXJlbnQgcGVvcGxlIHdpbGwgYmUgcmVhZGluZyB5b3VyIHdvcmRzLgotVGhlc2UgaW5jbHVkZSBzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgYW5kIHJldmlld2VycyB3aG8gbmVlZCB0byBkZWNpZGUKLXdoZXRoZXIgdGhlIHBhdGNoIHNob3VsZCBiZSBpbmNsdWRlZCwgZGlzdHJpYnV0b3JzIGFuZCBvdGhlciBtYWludGFpbmVycwotdHJ5aW5nIHRvIGRlY2lkZSB3aGV0aGVyIGEgcGF0Y2ggc2hvdWxkIGJlIGJhY2twb3J0ZWQgdG8gb3RoZXIga2VybmVscywgYnVnCi1odW50ZXJzIHdvbmRlcmluZyB3aGV0aGVyIHRoZSBwYXRjaCBpcyByZXNwb25zaWJsZSBmb3IgYSBwcm9ibGVtIHRoZXkgYXJlCi1jaGFzaW5nLCB1c2VycyB3aG8gd2FudCB0byBrbm93IGhvdyB0aGUga2VybmVsIGhhcyBjaGFuZ2VkLCBhbmQgbW9yZS4gIEEKLWdvb2QgY2hhbmdlbG9nIGNvbnZleXMgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiB0byBhbGwgb2YgdGhlc2UgcGVvcGxlIGluIHRoZQotbW9zdCBkaXJlY3QgYW5kIGNvbmNpc2Ugd2F5IHBvc3NpYmxlLgotCi1UbyB0aGF0IGVuZCwgdGhlIHN1bW1hcnkgbGluZSBzaG91bGQgZGVzY3JpYmUgdGhlIGVmZmVjdHMgb2YgYW5kIG1vdGl2YXRpb24KLWZvciB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgcG9zc2libGUgZ2l2ZW4gdGhlIG9uZS1saW5lIGNvbnN0cmFpbnQuICBUaGUKLWRldGFpbGVkIGRlc2NyaXB0aW9uIGNhbiB0aGVuIGFtcGxpZnkgb24gdGhvc2UgdG9waWNzIGFuZCBwcm92aWRlIGFueQotbmVlZGVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICBJZiB0aGUgcGF0Y2ggZml4ZXMgYSBidWcsIGNpdGUgdGhlIGNvbW1pdAotd2hpY2ggaW50cm9kdWNlZCB0aGUgYnVnIGlmIHBvc3NpYmxlIChhbmQgcGxlYXNlIHByb3ZpZGUgYm90aCB0aGUgY29tbWl0IElECi1hbmQgdGhlIHRpdGxlIHdoZW4gY2l0aW5nIGNvbW1pdHMpLiAgSWYgYSBwcm9ibGVtIGlzIGFzc29jaWF0ZWQgd2l0aAotc3BlY2lmaWMgbG9nIG9yIGNvbXBpbGVyIG91dHB1dCwgaW5jbHVkZSB0aGF0IG91dHB1dCB0byBoZWxwIG90aGVycwotc2VhcmNoaW5nIGZvciBhIHNvbHV0aW9uIHRvIHRoZSBzYW1lIHByb2JsZW0uICBJZiB0aGUgY2hhbmdlIGlzIG1lYW50IHRvCi1zdXBwb3J0IG90aGVyIGNoYW5nZXMgY29taW5nIGluIGxhdGVyIHBhdGNoLCBzYXkgc28uICBJZiBpbnRlcm5hbCBBUElzIGFyZQotY2hhbmdlZCwgZGV0YWlsIHRob3NlIGNoYW5nZXMgYW5kIGhvdyBvdGhlciBkZXZlbG9wZXJzIHNob3VsZCByZXNwb25kLiAgSW4KLWdlbmVyYWwsIHRoZSBtb3JlIHlvdSBjYW4gcHV0IHlvdXJzZWxmIGludG8gdGhlIHNob2VzIG9mIGV2ZXJ5Ym9keSB3aG8gd2lsbAotYmUgcmVhZGluZyB5b3VyIGNoYW5nZWxvZywgdGhlIGJldHRlciB0aGF0IGNoYW5nZWxvZyAoYW5kIHRoZSBrZXJuZWwgYXMgYQotd2hvbGUpIHdpbGwgYmUuCi0KLU5lZWRsZXNzIHRvIHNheSwgdGhlIGNoYW5nZWxvZyBzaG91bGQgYmUgdGhlIHRleHQgdXNlZCB3aGVuIGNvbW1pdHRpbmcgdGhlCi1jaGFuZ2UgdG8gYSByZXZpc2lvbiBjb250cm9sIHN5c3RlbS4gIEl0IHdpbGwgYmUgZm9sbG93ZWQgYnk6Ci0KLSAtIFRoZSBwYXRjaCBpdHNlbGYsIGluIHRoZSB1bmlmaWVkICgiLXUiKSBwYXRjaCBmb3JtYXQuICBVc2luZyB0aGUgIi1wIgotICAgb3B0aW9uIHRvIGRpZmYgd2lsbCBhc3NvY2lhdGUgZnVuY3Rpb24gbmFtZXMgd2l0aCBjaGFuZ2VzLCBtYWtpbmcgdGhlCi0gICByZXN1bHRpbmcgcGF0Y2ggZWFzaWVyIGZvciBvdGhlcnMgdG8gcmVhZC4KLQotWW91IHNob3VsZCBhdm9pZCBpbmNsdWRpbmcgY2hhbmdlcyB0byBpcnJlbGV2YW50IGZpbGVzICh0aG9zZSBnZW5lcmF0ZWQgYnkKLXRoZSBidWlsZCBwcm9jZXNzLCBmb3IgZXhhbXBsZSwgb3IgZWRpdG9yIGJhY2t1cCBmaWxlcykgaW4gdGhlIHBhdGNoLiAgVGhlCi1maWxlICJkb250ZGlmZiIgaW4gdGhlIERvY3VtZW50YXRpb24gZGlyZWN0b3J5IGNhbiBoZWxwIGluIHRoaXMgcmVnYXJkOwotcGFzcyBpdCB0byBkaWZmIHdpdGggdGhlICItWCIgb3B0aW9uLgotCi1UaGUgdGFncyBtZW50aW9uZWQgYWJvdmUgYXJlIHVzZWQgdG8gZGVzY3JpYmUgaG93IHZhcmlvdXMgZGV2ZWxvcGVycyBoYXZlCi1iZWVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBwYXRjaC4gIFRoZXkgYXJlIGRlc2NyaWJlZCBpbgotZGV0YWlsIGluIHRoZSBTdWJtaXR0aW5nUGF0Y2hlcyBkb2N1bWVudDsgd2hhdCBmb2xsb3dzIGhlcmUgaXMgYSBicmllZgotc3VtbWFyeS4gIEVhY2ggb2YgdGhlc2UgbGluZXMgaGFzIHRoZSBmb3JtYXQ6Ci0KLQl0YWc6IEZ1bGwgTmFtZSA8ZW1haWwgYWRkcmVzcz4gIG9wdGlvbmFsLW90aGVyLXN0dWZmCi0KLVRoZSB0YWdzIGluIGNvbW1vbiB1c2UgYXJlOgotCi0gLSBTaWduZWQtb2ZmLWJ5OiB0aGlzIGlzIGEgZGV2ZWxvcGVyJ3MgY2VydGlmaWNhdGlvbiB0aGF0IGhlIG9yIHNoZSBoYXMKLSAgIHRoZSByaWdodCB0byBzdWJtaXQgdGhlIHBhdGNoIGZvciBpbmNsdXNpb24gaW50byB0aGUga2VybmVsLiAgSXQgaXMgYW4KLSAgIGFncmVlbWVudCB0byB0aGUgRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luLCB0aGUgZnVsbCB0ZXh0IG9mCi0gICB3aGljaCBjYW4gYmUgZm91bmQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcy4gIENvZGUgd2l0aG91dCBhCi0gICBwcm9wZXIgc2lnbm9mZiBjYW5ub3QgYmUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lLgotCi0gLSBBY2tlZC1ieTogaW5kaWNhdGVzIGFuIGFncmVlbWVudCBieSBhbm90aGVyIGRldmVsb3BlciAob2Z0ZW4gYQotICAgbWFpbnRhaW5lciBvZiB0aGUgcmVsZXZhbnQgY29kZSkgdGhhdCB0aGUgcGF0Y2ggaXMgYXBwcm9wcmlhdGUgZm9yCi0gICBpbmNsdXNpb24gaW50byB0aGUga2VybmVsLgotCi0gLSBUZXN0ZWQtYnk6IHN0YXRlcyB0aGF0IHRoZSBuYW1lZCBwZXJzb24gaGFzIHRlc3RlZCB0aGUgcGF0Y2ggYW5kIGZvdW5kCi0gICBpdCB0byB3b3JrLgotCi0gLSBSZXZpZXdlZC1ieTogdGhlIG5hbWVkIGRldmVsb3BlciBoYXMgcmV2aWV3ZWQgdGhlIHBhdGNoIGZvciBjb3JyZWN0bmVzczsKLSAgIHNlZSB0aGUgcmV2aWV3ZXIncyBzdGF0ZW1lbnQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBmb3IgbW9yZQotICAgZGV0YWlsLgotCi0gLSBSZXBvcnRlZC1ieTogbmFtZXMgYSB1c2VyIHdobyByZXBvcnRlZCBhIHByb2JsZW0gd2hpY2ggaXMgZml4ZWQgYnkgdGhpcwotICAgcGF0Y2g7IHRoaXMgdGFnIGlzIHVzZWQgdG8gZ2l2ZSBjcmVkaXQgdG8gdGhlIChvZnRlbiB1bmRlcmFwcHJlY2lhdGVkKQotICAgcGVvcGxlIHdobyB0ZXN0IG91ciBjb2RlIGFuZCBsZXQgdXMga25vdyB3aGVuIHRoaW5ncyBkbyBub3Qgd29yawotICAgY29ycmVjdGx5LgotCi0gLSBDYzogdGhlIG5hbWVkIHBlcnNvbiByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIHBhdGNoIGFuZCBoYWQgdGhlCi0gICBvcHBvcnR1bml0eSB0byBjb21tZW50IG9uIGl0LgotCi1CZSBjYXJlZnVsIGluIHRoZSBhZGRpdGlvbiBvZiB0YWdzIHRvIHlvdXIgcGF0Y2hlczogb25seSBDYzogaXMgYXBwcm9wcmlhdGUKLWZvciBhZGRpdGlvbiB3aXRob3V0IHRoZSBleHBsaWNpdCBwZXJtaXNzaW9uIG9mIHRoZSBwZXJzb24gbmFtZWQuCi0KLQotNS41OiBTRU5ESU5HIFRIRSBQQVRDSAotCi1CZWZvcmUgeW91IG1haWwgeW91ciBwYXRjaGVzLCB0aGVyZSBhcmUgYSBjb3VwbGUgb2Ygb3RoZXIgdGhpbmdzIHlvdSBzaG91bGQKLXRha2UgY2FyZSBvZjoKLQotIC0gQXJlIHlvdSBzdXJlIHRoYXQgeW91ciBtYWlsZXIgd2lsbCBub3QgY29ycnVwdCB0aGUgcGF0Y2hlcz8gIFBhdGNoZXMKLSAgIHdoaWNoIGhhdmUgaGFkIGdyYXR1aXRvdXMgd2hpdGUtc3BhY2UgY2hhbmdlcyBvciBsaW5lIHdyYXBwaW5nIHBlcmZvcm1lZAotICAgYnkgdGhlIG1haWwgY2xpZW50IHdpbGwgbm90IGFwcGx5IGF0IHRoZSBvdGhlciBlbmQsIGFuZCBvZnRlbiB3aWxsIG5vdAotICAgYmUgZXhhbWluZWQgaW4gYW55IGRldGFpbC4gIElmIHRoZXJlIGlzIGFueSBkb3VidCBhdCBhbGwsIG1haWwgdGhlIHBhdGNoCi0gICB0byB5b3Vyc2VsZiBhbmQgY29udmluY2UgeW91cnNlbGYgdGhhdCBpdCBzaG93cyB1cCBpbnRhY3QuCi0KLSAgIERvY3VtZW50YXRpb24vZW1haWwtY2xpZW50cy50eHQgaGFzIHNvbWUgaGVscGZ1bCBoaW50cyBvbiBtYWtpbmcKLSAgIHNwZWNpZmljIG1haWwgY2xpZW50cyB3b3JrIGZvciBzZW5kaW5nIHBhdGNoZXMuCi0KLSAtIEFyZSB5b3Ugc3VyZSB5b3VyIHBhdGNoIGlzIGZyZWUgb2Ygc2lsbHkgbWlzdGFrZXM/ICBZb3Ugc2hvdWxkIGFsd2F5cwotICAgcnVuIHBhdGNoZXMgdGhyb3VnaCBzY3JpcHRzL2NoZWNrcGF0Y2gucGwgYW5kIGFkZHJlc3MgdGhlIGNvbXBsYWludHMgaXQKLSAgIGNvbWVzIHVwIHdpdGguICBQbGVhc2UgYmVhciBpbiBtaW5kIHRoYXQgY2hlY2twYXRjaC5wbCwgd2hpbGUgYmVpbmcgdGhlCi0gICBlbWJvZGltZW50IG9mIGEgZmFpciBhbW91bnQgb2YgdGhvdWdodCBhYm91dCB3aGF0IGtlcm5lbCBwYXRjaGVzIHNob3VsZAotICAgbG9vayBsaWtlLCBpcyBub3Qgc21hcnRlciB0aGFuIHlvdS4gIElmIGZpeGluZyBhIGNoZWNrcGF0Y2gucGwgY29tcGxhaW50Ci0gICB3b3VsZCBtYWtlIHRoZSBjb2RlIHdvcnNlLCBkb24ndCBkbyBpdC4KLQotUGF0Y2hlcyBzaG91bGQgYWx3YXlzIGJlIHNlbnQgYXMgcGxhaW4gdGV4dC4gIFBsZWFzZSBkbyBub3Qgc2VuZCB0aGVtIGFzCi1hdHRhY2htZW50czsgdGhhdCBtYWtlcyBpdCBtdWNoIGhhcmRlciBmb3IgcmV2aWV3ZXJzIHRvIHF1b3RlIHNlY3Rpb25zIG9mCi10aGUgcGF0Y2ggaW4gdGhlaXIgcmVwbGllcy4gIEluc3RlYWQsIGp1c3QgcHV0IHRoZSBwYXRjaCBkaXJlY3RseSBpbnRvIHlvdXIKLW1lc3NhZ2UuCi0KLVdoZW4gbWFpbGluZyBwYXRjaGVzLCBpdCBpcyBpbXBvcnRhbnQgdG8gc2VuZCBjb3BpZXMgdG8gYW55Ym9keSB3aG8gbWlnaHQKLWJlIGludGVyZXN0ZWQgaW4gaXQuICBVbmxpa2Ugc29tZSBvdGhlciBwcm9qZWN0cywgdGhlIGtlcm5lbCBlbmNvdXJhZ2VzCi1wZW9wbGUgdG8gZXJyIG9uIHRoZSBzaWRlIG9mIHNlbmRpbmcgdG9vIG1hbnkgY29waWVzOyBkb24ndCBhc3N1bWUgdGhhdCB0aGUKLXJlbGV2YW50IHBlb3BsZSB3aWxsIHNlZSB5b3VyIHBvc3Rpbmcgb24gdGhlIG1haWxpbmcgbGlzdHMuICBJbiBwYXJ0aWN1bGFyLAotY29waWVzIHNob3VsZCBnbyB0bzoKLQotIC0gVGhlIG1haW50YWluZXIocykgb2YgdGhlIGFmZmVjdGVkIHN1YnN5c3RlbShzKS4gIEFzIGRlc2NyaWJlZCBlYXJsaWVyLAotICAgdGhlIE1BSU5UQUlORVJTIGZpbGUgaXMgdGhlIGZpcnN0IHBsYWNlIHRvIGxvb2sgZm9yIHRoZXNlIHBlb3BsZS4KLQotIC0gT3RoZXIgZGV2ZWxvcGVycyB3aG8gaGF2ZSBiZWVuIHdvcmtpbmcgaW4gdGhlIHNhbWUgYXJlYSAtIGVzcGVjaWFsbHkKLSAgIHRob3NlIHdobyBtaWdodCBiZSB3b3JraW5nIHRoZXJlIG5vdy4gIFVzaW5nIGdpdCB0byBzZWUgd2hvIGVsc2UgaGFzCi0gICBtb2RpZmllZCB0aGUgZmlsZXMgeW91IGFyZSB3b3JraW5nIG9uIGNhbiBiZSBoZWxwZnVsLgotCi0gLSBJZiB5b3UgYXJlIHJlc3BvbmRpbmcgdG8gYSBidWcgcmVwb3J0IG9yIGEgZmVhdHVyZSByZXF1ZXN0LCBjb3B5IHRoZQotICAgb3JpZ2luYWwgcG9zdGVyIGFzIHdlbGwuCi0KLSAtIFNlbmQgYSBjb3B5IHRvIHRoZSByZWxldmFudCBtYWlsaW5nIGxpc3QsIG9yLCBpZiBub3RoaW5nIGVsc2UgYXBwbGllcywKLSAgIHRoZSBsaW51eC1rZXJuZWwgbGlzdC4KLQotIC0gSWYgeW91IGFyZSBmaXhpbmcgYSBidWcsIHRoaW5rIGFib3V0IHdoZXRoZXIgdGhlIGZpeCBzaG91bGQgZ28gaW50byB0aGUKLSAgIG5leHQgc3RhYmxlIHVwZGF0ZS4gIElmIHNvLCBzdGFibGVAdmdlci5rZXJuZWwub3JnIHNob3VsZCBnZXQgYSBjb3B5IG9mCi0gICB0aGUgcGF0Y2guICBBbHNvIGFkZCBhICJDYzogc3RhYmxlQHZnZXIua2VybmVsLm9yZyIgdG8gdGhlIHRhZ3Mgd2l0aGluCi0gICB0aGUgcGF0Y2ggaXRzZWxmOyB0aGF0IHdpbGwgY2F1c2UgdGhlIHN0YWJsZSB0ZWFtIHRvIGdldCBhIG5vdGlmaWNhdGlvbgotICAgd2hlbiB5b3VyIGZpeCBnb2VzIGludG8gdGhlIG1haW5saW5lLgotCi1XaGVuIHNlbGVjdGluZyByZWNpcGllbnRzIGZvciBhIHBhdGNoLCBpdCBpcyBnb29kIHRvIGhhdmUgYW4gaWRlYSBvZiB3aG8KLXlvdSB0aGluayB3aWxsIGV2ZW50dWFsbHkgYWNjZXB0IHRoZSBwYXRjaCBhbmQgZ2V0IGl0IG1lcmdlZC4gIFdoaWxlIGl0Ci1pcyBwb3NzaWJsZSB0byBzZW5kIHBhdGNoZXMgZGlyZWN0bHkgdG8gTGludXMgVG9ydmFsZHMgYW5kIGhhdmUgaGltIG1lcmdlCi10aGVtLCB0aGluZ3MgYXJlIG5vdCBub3JtYWxseSBkb25lIHRoYXQgd2F5LiAgTGludXMgaXMgYnVzeSwgYW5kIHRoZXJlIGFyZQotc3Vic3lzdGVtIG1haW50YWluZXJzIHdobyB3YXRjaCBvdmVyIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwuICBVc3VhbGx5Ci15b3Ugd2lsbCBiZSB3YW50aW5nIHRoYXQgbWFpbnRhaW5lciB0byBtZXJnZSB5b3VyIHBhdGNoZXMuICBJZiB0aGVyZSBpcyBubwotb2J2aW91cyBtYWludGFpbmVyLCBBbmRyZXcgTW9ydG9uIGlzIG9mdGVuIHRoZSBwYXRjaCB0YXJnZXQgb2YgbGFzdCByZXNvcnQuCi0KLVBhdGNoZXMgbmVlZCBnb29kIHN1YmplY3QgbGluZXMuICBUaGUgY2Fub25pY2FsIGZvcm1hdCBmb3IgYSBwYXRjaCBsaW5lIGlzCi1zb21ldGhpbmcgbGlrZToKLQotCVtQQVRDSCBubi9tbV0gc3Vic3lzOiBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgcGF0Y2gKLQotd2hlcmUgIm5uIiBpcyB0aGUgb3JkaW5hbCBudW1iZXIgb2YgdGhlIHBhdGNoLCAibW0iIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YKLXBhdGNoZXMgaW4gdGhlIHNlcmllcywgYW5kICJzdWJzeXMiIGlzIHRoZSBuYW1lIG9mIHRoZSBhZmZlY3RlZCBzdWJzeXN0ZW0uCi1DbGVhcmx5LCBubi9tbSBjYW4gYmUgb21pdHRlZCBmb3IgYSBzaW5nbGUsIHN0YW5kYWxvbmUgcGF0Y2guCi0KLUlmIHlvdSBoYXZlIGEgc2lnbmlmaWNhbnQgc2VyaWVzIG9mIHBhdGNoZXMsIGl0IGlzIGN1c3RvbWFyeSB0byBzZW5kIGFuCi1pbnRyb2R1Y3RvcnkgZGVzY3JpcHRpb24gYXMgcGFydCB6ZXJvLiAgVGhpcyBjb252ZW50aW9uIGlzIG5vdCB1bml2ZXJzYWxseQotZm9sbG93ZWQgdGhvdWdoOyBpZiB5b3UgdXNlIGl0LCByZW1lbWJlciB0aGF0IGluZm9ybWF0aW9uIGluIHRoZQotaW50cm9kdWN0aW9uIGRvZXMgbm90IG1ha2UgaXQgaW50byB0aGUga2VybmVsIGNoYW5nZWxvZ3MuICBTbyBwbGVhc2UgZW5zdXJlCi10aGF0IHRoZSBwYXRjaGVzLCB0aGVtc2VsdmVzLCBoYXZlIGNvbXBsZXRlIGNoYW5nZWxvZyBpbmZvcm1hdGlvbi4KLQotSW4gZ2VuZXJhbCwgdGhlIHNlY29uZCBhbmQgZm9sbG93aW5nIHBhcnRzIG9mIGEgbXVsdGktcGFydCBwYXRjaCBzaG91bGQgYmUKLXNlbnQgYXMgYSByZXBseSB0byB0aGUgZmlyc3QgcGFydCBzbyB0aGF0IHRoZXkgYWxsIHRocmVhZCB0b2dldGhlciBhdCB0aGUKLXJlY2VpdmluZyBlbmQuICBUb29scyBsaWtlIGdpdCBhbmQgcXVpbHQgaGF2ZSBjb21tYW5kcyB0byBtYWlsIG91dCBhIHNldCBvZgotcGF0Y2hlcyB3aXRoIHRoZSBwcm9wZXIgdGhyZWFkaW5nLiAgSWYgeW91IGhhdmUgYSBsb25nIHNlcmllcywgdGhvdWdoLCBhbmQKLWFyZSB1c2luZyBnaXQsIHBsZWFzZSBzdGF5IGF3YXkgZnJvbSB0aGUgLS1jaGFpbi1yZXBseS10byBvcHRpb24gdG8gYXZvaWQKLWNyZWF0aW5nIGV4Y2VwdGlvbmFsbHkgZGVlcCBuZXN0aW5nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzUuUG9zdGluZy5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNS5Qb3N0aW5nLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTExZGRmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzUuUG9zdGluZy5yc3QKQEAgLTAsMCArMSwzMjEgQEAKKy4uIF9kZXZlbG9wbWVudF9wb3N0aW5nOgorCitQb3N0aW5nIHBhdGNoZXMKKz09PT09PT09PT09PT09PQorCitTb29uZXIgb3IgbGF0ZXIsIHRoZSB0aW1lIGNvbWVzIHdoZW4geW91ciB3b3JrIGlzIHJlYWR5IHRvIGJlIHByZXNlbnRlZCB0bwordGhlIGNvbW11bml0eSBmb3IgcmV2aWV3IGFuZCwgZXZlbnR1YWxseSwgaW5jbHVzaW9uIGludG8gdGhlIG1haW5saW5lCitrZXJuZWwuICBVbnN1cnByaXNpbmdseSwgdGhlIGtlcm5lbCBkZXZlbG9wbWVudCBjb21tdW5pdHkgaGFzIGV2b2x2ZWQgYSBzZXQKK29mIGNvbnZlbnRpb25zIGFuZCBwcm9jZWR1cmVzIHdoaWNoIGFyZSB1c2VkIGluIHRoZSBwb3N0aW5nIG9mIHBhdGNoZXM7Citmb2xsb3dpbmcgdGhlbSB3aWxsIG1ha2UgbGlmZSBtdWNoIGVhc2llciBmb3IgZXZlcnlib2R5IGludm9sdmVkLiAgVGhpcworZG9jdW1lbnQgd2lsbCBhdHRlbXB0IHRvIGNvdmVyIHRoZXNlIGV4cGVjdGF0aW9ucyBpbiByZWFzb25hYmxlIGRldGFpbDsKK21vcmUgaW5mb3JtYXRpb24gY2FuIGFsc28gYmUgZm91bmQgaW4gdGhlIGZpbGVzIFN1Ym1pdHRpbmdQYXRjaGVzLAorU3VibWl0dGluZ0RyaXZlcnMsIGFuZCBTdWJtaXRDaGVja2xpc3QgaW4gdGhlIGtlcm5lbCBkb2N1bWVudGF0aW9uCitkaXJlY3RvcnkuCisKKworV2hlbiB0byBwb3N0CistLS0tLS0tLS0tLS0KKworVGhlcmUgaXMgYSBjb25zdGFudCB0ZW1wdGF0aW9uIHRvIGF2b2lkIHBvc3RpbmcgcGF0Y2hlcyBiZWZvcmUgdGhleSBhcmUKK2NvbXBsZXRlbHkgInJlYWR5LiIgIEZvciBzaW1wbGUgcGF0Y2hlcywgdGhhdCBpcyBub3QgYSBwcm9ibGVtLiAgSWYgdGhlCit3b3JrIGJlaW5nIGRvbmUgaXMgY29tcGxleCwgdGhvdWdoLCB0aGVyZSBpcyBhIGxvdCB0byBiZSBnYWluZWQgYnkgZ2V0dGluZworZmVlZGJhY2sgZnJvbSB0aGUgY29tbXVuaXR5IGJlZm9yZSB0aGUgd29yayBpcyBjb21wbGV0ZS4gIFNvIHlvdSBzaG91bGQKK2NvbnNpZGVyIHBvc3RpbmcgaW4tcHJvZ3Jlc3Mgd29yaywgb3IgZXZlbiBtYWtpbmcgYSBnaXQgdHJlZSBhdmFpbGFibGUgc28KK3RoYXQgaW50ZXJlc3RlZCBkZXZlbG9wZXJzIGNhbiBjYXRjaCB1cCB3aXRoIHlvdXIgd29yayBhdCBhbnkgdGltZS4KKworV2hlbiBwb3N0aW5nIGNvZGUgd2hpY2ggaXMgbm90IHlldCBjb25zaWRlcmVkIHJlYWR5IGZvciBpbmNsdXNpb24sIGl0IGlzIGEKK2dvb2QgaWRlYSB0byBzYXkgc28gaW4gdGhlIHBvc3RpbmcgaXRzZWxmLiAgQWxzbyBtZW50aW9uIGFueSBtYWpvciB3b3JrCit3aGljaCByZW1haW5zIHRvIGJlIGRvbmUgYW5kIGFueSBrbm93biBwcm9ibGVtcy4gIEZld2VyIHBlb3BsZSB3aWxsIGxvb2sgYXQKK3BhdGNoZXMgd2hpY2ggYXJlIGtub3duIHRvIGJlIGhhbGYtYmFrZWQsIGJ1dCB0aG9zZSB3aG8gZG8gd2lsbCBjb21lIGluCit3aXRoIHRoZSBpZGVhIHRoYXQgdGhleSBjYW4gaGVscCB5b3UgZHJpdmUgdGhlIHdvcmsgaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbi4KKworCitCZWZvcmUgY3JlYXRpbmcgcGF0Y2hlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoaW5ncyB3aGljaCBzaG91bGQgYmUgZG9uZSBiZWZvcmUgeW91IGNvbnNpZGVyCitzZW5kaW5nIHBhdGNoZXMgdG8gdGhlIGRldmVsb3BtZW50IGNvbW11bml0eS4gIFRoZXNlIGluY2x1ZGU6CisKKyAtIFRlc3QgdGhlIGNvZGUgdG8gdGhlIGV4dGVudCB0aGF0IHlvdSBjYW4uICBNYWtlIHVzZSBvZiB0aGUga2VybmVsJ3MKKyAgIGRlYnVnZ2luZyB0b29scywgZW5zdXJlIHRoYXQgdGhlIGtlcm5lbCB3aWxsIGJ1aWxkIHdpdGggYWxsIHJlYXNvbmFibGUKKyAgIGNvbWJpbmF0aW9ucyBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMsIHVzZSBjcm9zcy1jb21waWxlcnMgdG8gYnVpbGQgZm9yCisgICBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcywgZXRjLgorCisgLSBNYWtlIHN1cmUgeW91ciBjb2RlIGlzIGNvbXBsaWFudCB3aXRoIHRoZSBrZXJuZWwgY29kaW5nIHN0eWxlCisgICBndWlkZWxpbmVzLgorCisgLSBEb2VzIHlvdXIgY2hhbmdlIGhhdmUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zPyAgSWYgc28sIHlvdSBzaG91bGQgcnVuCisgICBiZW5jaG1hcmtzIHNob3dpbmcgd2hhdCB0aGUgaW1wYWN0IChvciBiZW5lZml0KSBvZiB5b3VyIGNoYW5nZSBpczsgYQorICAgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cyBzaG91bGQgYmUgaW5jbHVkZWQgd2l0aCB0aGUgcGF0Y2guCisKKyAtIEJlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgcmlnaHQgdG8gcG9zdCB0aGUgY29kZS4gIElmIHRoaXMgd29yayB3YXMgZG9uZQorICAgZm9yIGFuIGVtcGxveWVyLCB0aGUgZW1wbG95ZXIgbGlrZWx5IGhhcyBhIHJpZ2h0IHRvIHRoZSB3b3JrIGFuZCBtdXN0IGJlCisgICBhZ3JlZWFibGUgd2l0aCBpdHMgcmVsZWFzZSB1bmRlciB0aGUgR1BMLgorCitBcyBhIGdlbmVyYWwgcnVsZSwgcHV0dGluZyBpbiBzb21lIGV4dHJhIHRob3VnaHQgYmVmb3JlIHBvc3RpbmcgY29kZSBhbG1vc3QKK2Fsd2F5cyBwYXlzIGJhY2sgdGhlIGVmZm9ydCBpbiBzaG9ydCBvcmRlci4KKworCitQYXRjaCBwcmVwYXJhdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIHByZXBhcmF0aW9uIG9mIHBhdGNoZXMgZm9yIHBvc3RpbmcgY2FuIGJlIGEgc3VycHJpc2luZyBhbW91bnQgb2Ygd29yaywKK2J1dCwgb25jZSBhZ2FpbiwgYXR0ZW1wdGluZyB0byBzYXZlIHRpbWUgaGVyZSBpcyBub3QgZ2VuZXJhbGx5IGFkdmlzYWJsZQorZXZlbiBpbiB0aGUgc2hvcnQgdGVybS4KKworUGF0Y2hlcyBtdXN0IGJlIHByZXBhcmVkIGFnYWluc3QgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBrZXJuZWwuICBBcyBhCitnZW5lcmFsIHJ1bGUsIGEgcGF0Y2ggc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBjdXJyZW50IG1haW5saW5lIGFzIGZvdW5kIGluCitMaW51cydzIGdpdCB0cmVlLiAgV2hlbiBiYXNpbmcgb24gbWFpbmxpbmUsIHN0YXJ0IHdpdGggYSB3ZWxsLWtub3duIHJlbGVhc2UKK3BvaW50IC0gYSBzdGFibGUgb3IgLXJjIHJlbGVhc2UgLSByYXRoZXIgdGhhbiBicmFuY2hpbmcgb2ZmIHRoZSBtYWlubGluZSBhdAorYW4gYXJiaXRyYXJ5IHNwb3QuCisKK0l0IG1heSBiZWNvbWUgbmVjZXNzYXJ5IHRvIG1ha2UgdmVyc2lvbnMgYWdhaW5zdCAtbW0sIGxpbnV4LW5leHQsIG9yIGEKK3N1YnN5c3RlbSB0cmVlLCB0aG91Z2gsIHRvIGZhY2lsaXRhdGUgd2lkZXIgdGVzdGluZyBhbmQgcmV2aWV3LiAgRGVwZW5kaW5nCitvbiB0aGUgYXJlYSBvZiB5b3VyIHBhdGNoIGFuZCB3aGF0IGlzIGdvaW5nIG9uIGVsc2V3aGVyZSwgYmFzaW5nIGEgcGF0Y2gKK2FnYWluc3QgdGhlc2Ugb3RoZXIgdHJlZXMgY2FuIHJlcXVpcmUgYSBzaWduaWZpY2FudCBhbW91bnQgb2Ygd29yaworcmVzb2x2aW5nIGNvbmZsaWN0cyBhbmQgZGVhbGluZyB3aXRoIEFQSSBjaGFuZ2VzLgorCitPbmx5IHRoZSBtb3N0IHNpbXBsZSBjaGFuZ2VzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgYSBzaW5nbGUgcGF0Y2g7CitldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIGJlIG1hZGUgYXMgYSBsb2dpY2FsIHNlcmllcyBvZiBjaGFuZ2VzLiAgU3BsaXR0aW5nCit1cCBwYXRjaGVzIGlzIGEgYml0IG9mIGFuIGFydDsgc29tZSBkZXZlbG9wZXJzIHNwZW5kIGEgbG9uZyB0aW1lIGZpZ3VyaW5nCitvdXQgaG93IHRvIGRvIGl0IGluIHRoZSB3YXkgdGhhdCB0aGUgY29tbXVuaXR5IGV4cGVjdHMuICBUaGVyZSBhcmUgYSBmZXcKK3J1bGVzIG9mIHRodW1iLCBob3dldmVyLCB3aGljaCBjYW4gaGVscCBjb25zaWRlcmFibHk6CisKKyAtIFRoZSBwYXRjaCBzZXJpZXMgeW91IHBvc3Qgd2lsbCBhbG1vc3QgY2VydGFpbmx5IG5vdCBiZSB0aGUgc2VyaWVzIG9mCisgICBjaGFuZ2VzIGZvdW5kIGluIHlvdXIgd29ya2luZyByZXZpc2lvbiBjb250cm9sIHN5c3RlbS4gIEluc3RlYWQsIHRoZQorICAgY2hhbmdlcyB5b3UgaGF2ZSBtYWRlIG5lZWQgdG8gYmUgY29uc2lkZXJlZCBpbiB0aGVpciBmaW5hbCBmb3JtLCB0aGVuCisgICBzcGxpdCBhcGFydCBpbiB3YXlzIHdoaWNoIG1ha2Ugc2Vuc2UuICBUaGUgZGV2ZWxvcGVycyBhcmUgaW50ZXJlc3RlZCBpbgorICAgZGlzY3JldGUsIHNlbGYtY29udGFpbmVkIGNoYW5nZXMsIG5vdCB0aGUgcGF0aCB5b3UgdG9vayB0byBnZXQgdG8gdGhvc2UKKyAgIGNoYW5nZXMuCisKKyAtIEVhY2ggbG9naWNhbGx5IGluZGVwZW5kZW50IGNoYW5nZSBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIGEgc2VwYXJhdGUKKyAgIHBhdGNoLiAgVGhlc2UgY2hhbmdlcyBjYW4gYmUgc21hbGwgKCJhZGQgYSBmaWVsZCB0byB0aGlzIHN0cnVjdHVyZSIpIG9yCisgICBsYXJnZSAoYWRkaW5nIGEgc2lnbmlmaWNhbnQgbmV3IGRyaXZlciwgZm9yIGV4YW1wbGUpLCBidXQgdGhleSBzaG91bGQgYmUKKyAgIGNvbmNlcHR1YWxseSBzbWFsbCBhbmQgYW1lbmFibGUgdG8gYSBvbmUtbGluZSBkZXNjcmlwdGlvbi4gIEVhY2ggcGF0Y2gKKyAgIHNob3VsZCBtYWtlIGEgc3BlY2lmaWMgY2hhbmdlIHdoaWNoIGNhbiBiZSByZXZpZXdlZCBvbiBpdHMgb3duIGFuZAorICAgdmVyaWZpZWQgdG8gZG8gd2hhdCBpdCBzYXlzIGl0IGRvZXMuCisKKyAtIEFzIGEgd2F5IG9mIHJlc3RhdGluZyB0aGUgZ3VpZGVsaW5lIGFib3ZlOiBkbyBub3QgbWl4IGRpZmZlcmVudCB0eXBlcyBvZgorICAgY2hhbmdlcyBpbiB0aGUgc2FtZSBwYXRjaC4gIElmIGEgc2luZ2xlIHBhdGNoIGZpeGVzIGEgY3JpdGljYWwgc2VjdXJpdHkKKyAgIGJ1ZywgcmVhcnJhbmdlcyBhIGZldyBzdHJ1Y3R1cmVzLCBhbmQgcmVmb3JtYXRzIHRoZSBjb2RlLCB0aGVyZSBpcyBhCisgICBnb29kIGNoYW5jZSB0aGF0IGl0IHdpbGwgYmUgcGFzc2VkIG92ZXIgYW5kIHRoZSBpbXBvcnRhbnQgZml4IHdpbGwgYmUKKyAgIGxvc3QuCisKKyAtIEVhY2ggcGF0Y2ggc2hvdWxkIHlpZWxkIGEga2VybmVsIHdoaWNoIGJ1aWxkcyBhbmQgcnVucyBwcm9wZXJseTsgaWYgeW91cgorICAgcGF0Y2ggc2VyaWVzIGlzIGludGVycnVwdGVkIGluIHRoZSBtaWRkbGUsIHRoZSByZXN1bHQgc2hvdWxkIHN0aWxsIGJlIGEKKyAgIHdvcmtpbmcga2VybmVsLiAgUGFydGlhbCBhcHBsaWNhdGlvbiBvZiBhIHBhdGNoIHNlcmllcyBpcyBhIGNvbW1vbgorICAgc2NlbmFyaW8gd2hlbiB0aGUgImdpdCBiaXNlY3QiIHRvb2wgaXMgdXNlZCB0byBmaW5kIHJlZ3Jlc3Npb25zOyBpZiB0aGUKKyAgIHJlc3VsdCBpcyBhIGJyb2tlbiBrZXJuZWwsIHlvdSB3aWxsIG1ha2UgbGlmZSBoYXJkZXIgZm9yIGRldmVsb3BlcnMgYW5kCisgICB1c2VycyB3aG8gYXJlIGVuZ2FnaW5nIGluIHRoZSBub2JsZSB3b3JrIG9mIHRyYWNraW5nIGRvd24gcHJvYmxlbXMuCisKKyAtIERvIG5vdCBvdmVyZG8gaXQsIHRob3VnaC4gIE9uZSBkZXZlbG9wZXIgb25jZSBwb3N0ZWQgYSBzZXQgb2YgZWRpdHMKKyAgIHRvIGEgc2luZ2xlIGZpbGUgYXMgNTAwIHNlcGFyYXRlIHBhdGNoZXMgLSBhbiBhY3Qgd2hpY2ggZGlkIG5vdCBtYWtlIGhpbQorICAgdGhlIG1vc3QgcG9wdWxhciBwZXJzb24gb24gdGhlIGtlcm5lbCBtYWlsaW5nIGxpc3QuICBBIHNpbmdsZSBwYXRjaCBjYW4KKyAgIGJlIHJlYXNvbmFibHkgbGFyZ2UgYXMgbG9uZyBhcyBpdCBzdGlsbCBjb250YWlucyBhIHNpbmdsZSAqbG9naWNhbCoKKyAgIGNoYW5nZS4KKworIC0gSXQgY2FuIGJlIHRlbXB0aW5nIHRvIGFkZCBhIHdob2xlIG5ldyBpbmZyYXN0cnVjdHVyZSB3aXRoIGEgc2VyaWVzIG9mCisgICBwYXRjaGVzLCBidXQgdG8gbGVhdmUgdGhhdCBpbmZyYXN0cnVjdHVyZSB1bnVzZWQgdW50aWwgdGhlIGZpbmFsIHBhdGNoCisgICBpbiB0aGUgc2VyaWVzIGVuYWJsZXMgdGhlIHdob2xlIHRoaW5nLiAgVGhpcyB0ZW1wdGF0aW9uIHNob3VsZCBiZQorICAgYXZvaWRlZCBpZiBwb3NzaWJsZTsgaWYgdGhhdCBzZXJpZXMgYWRkcyByZWdyZXNzaW9ucywgYmlzZWN0aW9uIHdpbGwKKyAgIGZpbmdlciB0aGUgbGFzdCBwYXRjaCBhcyB0aGUgb25lIHdoaWNoIGNhdXNlZCB0aGUgcHJvYmxlbSwgZXZlbiB0aG91Z2gKKyAgIHRoZSByZWFsIGJ1ZyBpcyBlbHNld2hlcmUuICBXaGVuZXZlciBwb3NzaWJsZSwgYSBwYXRjaCB3aGljaCBhZGRzIG5ldworICAgY29kZSBzaG91bGQgbWFrZSB0aGF0IGNvZGUgYWN0aXZlIGltbWVkaWF0ZWx5LgorCitXb3JraW5nIHRvIGNyZWF0ZSB0aGUgcGVyZmVjdCBwYXRjaCBzZXJpZXMgY2FuIGJlIGEgZnJ1c3RyYXRpbmcgcHJvY2Vzcword2hpY2ggdGFrZXMgcXVpdGUgYSBiaXQgb2YgdGltZSBhbmQgdGhvdWdodCBhZnRlciB0aGUgInJlYWwgd29yayIgaGFzIGJlZW4KK2RvbmUuICBXaGVuIGRvbmUgcHJvcGVybHksIHRob3VnaCwgaXQgaXMgdGltZSB3ZWxsIHNwZW50LgorCisKK1BhdGNoIGZvcm1hdHRpbmcgYW5kIGNoYW5nZWxvZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU28gbm93IHlvdSBoYXZlIGEgcGVyZmVjdCBzZXJpZXMgb2YgcGF0Y2hlcyBmb3IgcG9zdGluZywgYnV0IHRoZSB3b3JrIGlzCitub3QgZG9uZSBxdWl0ZSB5ZXQuICBFYWNoIHBhdGNoIG5lZWRzIHRvIGJlIGZvcm1hdHRlZCBpbnRvIGEgbWVzc2FnZSB3aGljaAorcXVpY2tseSBhbmQgY2xlYXJseSBjb21tdW5pY2F0ZXMgaXRzIHB1cnBvc2UgdG8gdGhlIHJlc3Qgb2YgdGhlIHdvcmxkLiAgVG8KK3RoYXQgZW5kLCBlYWNoIHBhdGNoIHdpbGwgYmUgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZzoKKworIC0gQW4gb3B0aW9uYWwgIkZyb20iIGxpbmUgbmFtaW5nIHRoZSBhdXRob3Igb2YgdGhlIHBhdGNoLiAgVGhpcyBsaW5lIGlzCisgICBvbmx5IG5lY2Vzc2FyeSBpZiB5b3UgYXJlIHBhc3Npbmcgb24gc29tZWJvZHkgZWxzZSdzIHBhdGNoIHZpYSBlbWFpbCwKKyAgIGJ1dCBpdCBuZXZlciBodXJ0cyB0byBhZGQgaXQgd2hlbiBpbiBkb3VidC4KKworIC0gQSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHRoZSBwYXRjaCBkb2VzLiAgVGhpcyBtZXNzYWdlIHNob3VsZCBiZQorICAgZW5vdWdoIGZvciBhIHJlYWRlciB3aG8gc2VlcyBpdCB3aXRoIG5vIG90aGVyIGNvbnRleHQgdG8gZmlndXJlIG91dCB0aGUKKyAgIHNjb3BlIG9mIHRoZSBwYXRjaDsgaXQgaXMgdGhlIGxpbmUgdGhhdCB3aWxsIHNob3cgdXAgaW4gdGhlICJzaG9ydCBmb3JtIgorICAgY2hhbmdlbG9ncy4gIFRoaXMgbWVzc2FnZSBpcyB1c3VhbGx5IGZvcm1hdHRlZCB3aXRoIHRoZSByZWxldmFudAorICAgc3Vic3lzdGVtIG5hbWUgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBwdXJwb3NlIG9mIHRoZSBwYXRjaC4gIEZvcgorICAgZXhhbXBsZToKKworICAgOjoKKworCWdwaW86IGZpeCBidWlsZCBvbiBDT05GSUdfR1BJT19TWVNGUz1uCisKKyAtIEEgYmxhbmsgbGluZSBmb2xsb3dlZCBieSBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgIHBhdGNoLiAgVGhpcyBkZXNjcmlwdGlvbiBjYW4gYmUgYXMgbG9uZyBhcyBpcyByZXF1aXJlZDsgaXQgc2hvdWxkIHNheQorICAgd2hhdCB0aGUgcGF0Y2ggZG9lcyBhbmQgd2h5IGl0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBrZXJuZWwuCisKKyAtIE9uZSBvciBtb3JlIHRhZyBsaW5lcywgd2l0aCwgYXQgYSBtaW5pbXVtLCBvbmUgU2lnbmVkLW9mZi1ieTogbGluZSBmcm9tCisgICB0aGUgYXV0aG9yIG9mIHRoZSBwYXRjaC4gIFRhZ3Mgd2lsbCBiZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cuCisKK1RoZSBpdGVtcyBhYm92ZSwgdG9nZXRoZXIsIGZvcm0gdGhlIGNoYW5nZWxvZyBmb3IgdGhlIHBhdGNoLiAgV3JpdGluZyBnb29kCitjaGFuZ2Vsb2dzIGlzIGEgY3J1Y2lhbCBidXQgb2Z0ZW4tbmVnbGVjdGVkIGFydDsgaXQncyB3b3J0aCBzcGVuZGluZworYW5vdGhlciBtb21lbnQgZGlzY3Vzc2luZyB0aGlzIGlzc3VlLiAgV2hlbiB3cml0aW5nIGEgY2hhbmdlbG9nLCB5b3Ugc2hvdWxkCitiZWFyIGluIG1pbmQgdGhhdCBhIG51bWJlciBvZiBkaWZmZXJlbnQgcGVvcGxlIHdpbGwgYmUgcmVhZGluZyB5b3VyIHdvcmRzLgorVGhlc2UgaW5jbHVkZSBzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgYW5kIHJldmlld2VycyB3aG8gbmVlZCB0byBkZWNpZGUKK3doZXRoZXIgdGhlIHBhdGNoIHNob3VsZCBiZSBpbmNsdWRlZCwgZGlzdHJpYnV0b3JzIGFuZCBvdGhlciBtYWludGFpbmVycwordHJ5aW5nIHRvIGRlY2lkZSB3aGV0aGVyIGEgcGF0Y2ggc2hvdWxkIGJlIGJhY2twb3J0ZWQgdG8gb3RoZXIga2VybmVscywgYnVnCitodW50ZXJzIHdvbmRlcmluZyB3aGV0aGVyIHRoZSBwYXRjaCBpcyByZXNwb25zaWJsZSBmb3IgYSBwcm9ibGVtIHRoZXkgYXJlCitjaGFzaW5nLCB1c2VycyB3aG8gd2FudCB0byBrbm93IGhvdyB0aGUga2VybmVsIGhhcyBjaGFuZ2VkLCBhbmQgbW9yZS4gIEEKK2dvb2QgY2hhbmdlbG9nIGNvbnZleXMgdGhlIG5lZWRlZCBpbmZvcm1hdGlvbiB0byBhbGwgb2YgdGhlc2UgcGVvcGxlIGluIHRoZQorbW9zdCBkaXJlY3QgYW5kIGNvbmNpc2Ugd2F5IHBvc3NpYmxlLgorCitUbyB0aGF0IGVuZCwgdGhlIHN1bW1hcnkgbGluZSBzaG91bGQgZGVzY3JpYmUgdGhlIGVmZmVjdHMgb2YgYW5kIG1vdGl2YXRpb24KK2ZvciB0aGUgY2hhbmdlIGFzIHdlbGwgYXMgcG9zc2libGUgZ2l2ZW4gdGhlIG9uZS1saW5lIGNvbnN0cmFpbnQuICBUaGUKK2RldGFpbGVkIGRlc2NyaXB0aW9uIGNhbiB0aGVuIGFtcGxpZnkgb24gdGhvc2UgdG9waWNzIGFuZCBwcm92aWRlIGFueQorbmVlZGVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICBJZiB0aGUgcGF0Y2ggZml4ZXMgYSBidWcsIGNpdGUgdGhlIGNvbW1pdAord2hpY2ggaW50cm9kdWNlZCB0aGUgYnVnIGlmIHBvc3NpYmxlIChhbmQgcGxlYXNlIHByb3ZpZGUgYm90aCB0aGUgY29tbWl0IElECithbmQgdGhlIHRpdGxlIHdoZW4gY2l0aW5nIGNvbW1pdHMpLiAgSWYgYSBwcm9ibGVtIGlzIGFzc29jaWF0ZWQgd2l0aAorc3BlY2lmaWMgbG9nIG9yIGNvbXBpbGVyIG91dHB1dCwgaW5jbHVkZSB0aGF0IG91dHB1dCB0byBoZWxwIG90aGVycworc2VhcmNoaW5nIGZvciBhIHNvbHV0aW9uIHRvIHRoZSBzYW1lIHByb2JsZW0uICBJZiB0aGUgY2hhbmdlIGlzIG1lYW50IHRvCitzdXBwb3J0IG90aGVyIGNoYW5nZXMgY29taW5nIGluIGxhdGVyIHBhdGNoLCBzYXkgc28uICBJZiBpbnRlcm5hbCBBUElzIGFyZQorY2hhbmdlZCwgZGV0YWlsIHRob3NlIGNoYW5nZXMgYW5kIGhvdyBvdGhlciBkZXZlbG9wZXJzIHNob3VsZCByZXNwb25kLiAgSW4KK2dlbmVyYWwsIHRoZSBtb3JlIHlvdSBjYW4gcHV0IHlvdXJzZWxmIGludG8gdGhlIHNob2VzIG9mIGV2ZXJ5Ym9keSB3aG8gd2lsbAorYmUgcmVhZGluZyB5b3VyIGNoYW5nZWxvZywgdGhlIGJldHRlciB0aGF0IGNoYW5nZWxvZyAoYW5kIHRoZSBrZXJuZWwgYXMgYQord2hvbGUpIHdpbGwgYmUuCisKK05lZWRsZXNzIHRvIHNheSwgdGhlIGNoYW5nZWxvZyBzaG91bGQgYmUgdGhlIHRleHQgdXNlZCB3aGVuIGNvbW1pdHRpbmcgdGhlCitjaGFuZ2UgdG8gYSByZXZpc2lvbiBjb250cm9sIHN5c3RlbS4gIEl0IHdpbGwgYmUgZm9sbG93ZWQgYnk6CisKKyAtIFRoZSBwYXRjaCBpdHNlbGYsIGluIHRoZSB1bmlmaWVkICgiLXUiKSBwYXRjaCBmb3JtYXQuICBVc2luZyB0aGUgIi1wIgorICAgb3B0aW9uIHRvIGRpZmYgd2lsbCBhc3NvY2lhdGUgZnVuY3Rpb24gbmFtZXMgd2l0aCBjaGFuZ2VzLCBtYWtpbmcgdGhlCisgICByZXN1bHRpbmcgcGF0Y2ggZWFzaWVyIGZvciBvdGhlcnMgdG8gcmVhZC4KKworWW91IHNob3VsZCBhdm9pZCBpbmNsdWRpbmcgY2hhbmdlcyB0byBpcnJlbGV2YW50IGZpbGVzICh0aG9zZSBnZW5lcmF0ZWQgYnkKK3RoZSBidWlsZCBwcm9jZXNzLCBmb3IgZXhhbXBsZSwgb3IgZWRpdG9yIGJhY2t1cCBmaWxlcykgaW4gdGhlIHBhdGNoLiAgVGhlCitmaWxlICJkb250ZGlmZiIgaW4gdGhlIERvY3VtZW50YXRpb24gZGlyZWN0b3J5IGNhbiBoZWxwIGluIHRoaXMgcmVnYXJkOworcGFzcyBpdCB0byBkaWZmIHdpdGggdGhlICItWCIgb3B0aW9uLgorCitUaGUgdGFncyBtZW50aW9uZWQgYWJvdmUgYXJlIHVzZWQgdG8gZGVzY3JpYmUgaG93IHZhcmlvdXMgZGV2ZWxvcGVycyBoYXZlCitiZWVuIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBwYXRjaC4gIFRoZXkgYXJlIGRlc2NyaWJlZCBpbgorZGV0YWlsIGluIHRoZSBTdWJtaXR0aW5nUGF0Y2hlcyBkb2N1bWVudDsgd2hhdCBmb2xsb3dzIGhlcmUgaXMgYSBicmllZgorc3VtbWFyeS4gIEVhY2ggb2YgdGhlc2UgbGluZXMgaGFzIHRoZSBmb3JtYXQ6CisKKzo6CisKKwl0YWc6IEZ1bGwgTmFtZSA8ZW1haWwgYWRkcmVzcz4gIG9wdGlvbmFsLW90aGVyLXN0dWZmCisKK1RoZSB0YWdzIGluIGNvbW1vbiB1c2UgYXJlOgorCisgLSBTaWduZWQtb2ZmLWJ5OiB0aGlzIGlzIGEgZGV2ZWxvcGVyJ3MgY2VydGlmaWNhdGlvbiB0aGF0IGhlIG9yIHNoZSBoYXMKKyAgIHRoZSByaWdodCB0byBzdWJtaXQgdGhlIHBhdGNoIGZvciBpbmNsdXNpb24gaW50byB0aGUga2VybmVsLiAgSXQgaXMgYW4KKyAgIGFncmVlbWVudCB0byB0aGUgRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luLCB0aGUgZnVsbCB0ZXh0IG9mCisgICB3aGljaCBjYW4gYmUgZm91bmQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcy4gIENvZGUgd2l0aG91dCBhCisgICBwcm9wZXIgc2lnbm9mZiBjYW5ub3QgYmUgbWVyZ2VkIGludG8gdGhlIG1haW5saW5lLgorCisgLSBBY2tlZC1ieTogaW5kaWNhdGVzIGFuIGFncmVlbWVudCBieSBhbm90aGVyIGRldmVsb3BlciAob2Z0ZW4gYQorICAgbWFpbnRhaW5lciBvZiB0aGUgcmVsZXZhbnQgY29kZSkgdGhhdCB0aGUgcGF0Y2ggaXMgYXBwcm9wcmlhdGUgZm9yCisgICBpbmNsdXNpb24gaW50byB0aGUga2VybmVsLgorCisgLSBUZXN0ZWQtYnk6IHN0YXRlcyB0aGF0IHRoZSBuYW1lZCBwZXJzb24gaGFzIHRlc3RlZCB0aGUgcGF0Y2ggYW5kIGZvdW5kCisgICBpdCB0byB3b3JrLgorCisgLSBSZXZpZXdlZC1ieTogdGhlIG5hbWVkIGRldmVsb3BlciBoYXMgcmV2aWV3ZWQgdGhlIHBhdGNoIGZvciBjb3JyZWN0bmVzczsKKyAgIHNlZSB0aGUgcmV2aWV3ZXIncyBzdGF0ZW1lbnQgaW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBmb3IgbW9yZQorICAgZGV0YWlsLgorCisgLSBSZXBvcnRlZC1ieTogbmFtZXMgYSB1c2VyIHdobyByZXBvcnRlZCBhIHByb2JsZW0gd2hpY2ggaXMgZml4ZWQgYnkgdGhpcworICAgcGF0Y2g7IHRoaXMgdGFnIGlzIHVzZWQgdG8gZ2l2ZSBjcmVkaXQgdG8gdGhlIChvZnRlbiB1bmRlcmFwcHJlY2lhdGVkKQorICAgcGVvcGxlIHdobyB0ZXN0IG91ciBjb2RlIGFuZCBsZXQgdXMga25vdyB3aGVuIHRoaW5ncyBkbyBub3Qgd29yaworICAgY29ycmVjdGx5LgorCisgLSBDYzogdGhlIG5hbWVkIHBlcnNvbiByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIHBhdGNoIGFuZCBoYWQgdGhlCisgICBvcHBvcnR1bml0eSB0byBjb21tZW50IG9uIGl0LgorCitCZSBjYXJlZnVsIGluIHRoZSBhZGRpdGlvbiBvZiB0YWdzIHRvIHlvdXIgcGF0Y2hlczogb25seSBDYzogaXMgYXBwcm9wcmlhdGUKK2ZvciBhZGRpdGlvbiB3aXRob3V0IHRoZSBleHBsaWNpdCBwZXJtaXNzaW9uIG9mIHRoZSBwZXJzb24gbmFtZWQuCisKKworU2VuZGluZyB0aGUgcGF0Y2gKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0JlZm9yZSB5b3UgbWFpbCB5b3VyIHBhdGNoZXMsIHRoZXJlIGFyZSBhIGNvdXBsZSBvZiBvdGhlciB0aGluZ3MgeW91IHNob3VsZAordGFrZSBjYXJlIG9mOgorCisgLSBBcmUgeW91IHN1cmUgdGhhdCB5b3VyIG1haWxlciB3aWxsIG5vdCBjb3JydXB0IHRoZSBwYXRjaGVzPyAgUGF0Y2hlcworICAgd2hpY2ggaGF2ZSBoYWQgZ3JhdHVpdG91cyB3aGl0ZS1zcGFjZSBjaGFuZ2VzIG9yIGxpbmUgd3JhcHBpbmcgcGVyZm9ybWVkCisgICBieSB0aGUgbWFpbCBjbGllbnQgd2lsbCBub3QgYXBwbHkgYXQgdGhlIG90aGVyIGVuZCwgYW5kIG9mdGVuIHdpbGwgbm90CisgICBiZSBleGFtaW5lZCBpbiBhbnkgZGV0YWlsLiAgSWYgdGhlcmUgaXMgYW55IGRvdWJ0IGF0IGFsbCwgbWFpbCB0aGUgcGF0Y2gKKyAgIHRvIHlvdXJzZWxmIGFuZCBjb252aW5jZSB5b3Vyc2VsZiB0aGF0IGl0IHNob3dzIHVwIGludGFjdC4KKworICAgRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCBoYXMgc29tZSBoZWxwZnVsIGhpbnRzIG9uIG1ha2luZworICAgc3BlY2lmaWMgbWFpbCBjbGllbnRzIHdvcmsgZm9yIHNlbmRpbmcgcGF0Y2hlcy4KKworIC0gQXJlIHlvdSBzdXJlIHlvdXIgcGF0Y2ggaXMgZnJlZSBvZiBzaWxseSBtaXN0YWtlcz8gIFlvdSBzaG91bGQgYWx3YXlzCisgICBydW4gcGF0Y2hlcyB0aHJvdWdoIHNjcmlwdHMvY2hlY2twYXRjaC5wbCBhbmQgYWRkcmVzcyB0aGUgY29tcGxhaW50cyBpdAorICAgY29tZXMgdXAgd2l0aC4gIFBsZWFzZSBiZWFyIGluIG1pbmQgdGhhdCBjaGVja3BhdGNoLnBsLCB3aGlsZSBiZWluZyB0aGUKKyAgIGVtYm9kaW1lbnQgb2YgYSBmYWlyIGFtb3VudCBvZiB0aG91Z2h0IGFib3V0IHdoYXQga2VybmVsIHBhdGNoZXMgc2hvdWxkCisgICBsb29rIGxpa2UsIGlzIG5vdCBzbWFydGVyIHRoYW4geW91LiAgSWYgZml4aW5nIGEgY2hlY2twYXRjaC5wbCBjb21wbGFpbnQKKyAgIHdvdWxkIG1ha2UgdGhlIGNvZGUgd29yc2UsIGRvbid0IGRvIGl0LgorCitQYXRjaGVzIHNob3VsZCBhbHdheXMgYmUgc2VudCBhcyBwbGFpbiB0ZXh0LiAgUGxlYXNlIGRvIG5vdCBzZW5kIHRoZW0gYXMKK2F0dGFjaG1lbnRzOyB0aGF0IG1ha2VzIGl0IG11Y2ggaGFyZGVyIGZvciByZXZpZXdlcnMgdG8gcXVvdGUgc2VjdGlvbnMgb2YKK3RoZSBwYXRjaCBpbiB0aGVpciByZXBsaWVzLiAgSW5zdGVhZCwganVzdCBwdXQgdGhlIHBhdGNoIGRpcmVjdGx5IGludG8geW91cgorbWVzc2FnZS4KKworV2hlbiBtYWlsaW5nIHBhdGNoZXMsIGl0IGlzIGltcG9ydGFudCB0byBzZW5kIGNvcGllcyB0byBhbnlib2R5IHdobyBtaWdodAorYmUgaW50ZXJlc3RlZCBpbiBpdC4gIFVubGlrZSBzb21lIG90aGVyIHByb2plY3RzLCB0aGUga2VybmVsIGVuY291cmFnZXMKK3Blb3BsZSB0byBlcnIgb24gdGhlIHNpZGUgb2Ygc2VuZGluZyB0b28gbWFueSBjb3BpZXM7IGRvbid0IGFzc3VtZSB0aGF0IHRoZQorcmVsZXZhbnQgcGVvcGxlIHdpbGwgc2VlIHlvdXIgcG9zdGluZyBvbiB0aGUgbWFpbGluZyBsaXN0cy4gIEluIHBhcnRpY3VsYXIsCitjb3BpZXMgc2hvdWxkIGdvIHRvOgorCisgLSBUaGUgbWFpbnRhaW5lcihzKSBvZiB0aGUgYWZmZWN0ZWQgc3Vic3lzdGVtKHMpLiAgQXMgZGVzY3JpYmVkIGVhcmxpZXIsCisgICB0aGUgTUFJTlRBSU5FUlMgZmlsZSBpcyB0aGUgZmlyc3QgcGxhY2UgdG8gbG9vayBmb3IgdGhlc2UgcGVvcGxlLgorCisgLSBPdGhlciBkZXZlbG9wZXJzIHdobyBoYXZlIGJlZW4gd29ya2luZyBpbiB0aGUgc2FtZSBhcmVhIC0gZXNwZWNpYWxseQorICAgdGhvc2Ugd2hvIG1pZ2h0IGJlIHdvcmtpbmcgdGhlcmUgbm93LiAgVXNpbmcgZ2l0IHRvIHNlZSB3aG8gZWxzZSBoYXMKKyAgIG1vZGlmaWVkIHRoZSBmaWxlcyB5b3UgYXJlIHdvcmtpbmcgb24gY2FuIGJlIGhlbHBmdWwuCisKKyAtIElmIHlvdSBhcmUgcmVzcG9uZGluZyB0byBhIGJ1ZyByZXBvcnQgb3IgYSBmZWF0dXJlIHJlcXVlc3QsIGNvcHkgdGhlCisgICBvcmlnaW5hbCBwb3N0ZXIgYXMgd2VsbC4KKworIC0gU2VuZCBhIGNvcHkgdG8gdGhlIHJlbGV2YW50IG1haWxpbmcgbGlzdCwgb3IsIGlmIG5vdGhpbmcgZWxzZSBhcHBsaWVzLAorICAgdGhlIGxpbnV4LWtlcm5lbCBsaXN0LgorCisgLSBJZiB5b3UgYXJlIGZpeGluZyBhIGJ1ZywgdGhpbmsgYWJvdXQgd2hldGhlciB0aGUgZml4IHNob3VsZCBnbyBpbnRvIHRoZQorICAgbmV4dCBzdGFibGUgdXBkYXRlLiAgSWYgc28sIHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmcgc2hvdWxkIGdldCBhIGNvcHkgb2YKKyAgIHRoZSBwYXRjaC4gIEFsc28gYWRkIGEgIkNjOiBzdGFibGVAdmdlci5rZXJuZWwub3JnIiB0byB0aGUgdGFncyB3aXRoaW4KKyAgIHRoZSBwYXRjaCBpdHNlbGY7IHRoYXQgd2lsbCBjYXVzZSB0aGUgc3RhYmxlIHRlYW0gdG8gZ2V0IGEgbm90aWZpY2F0aW9uCisgICB3aGVuIHlvdXIgZml4IGdvZXMgaW50byB0aGUgbWFpbmxpbmUuCisKK1doZW4gc2VsZWN0aW5nIHJlY2lwaWVudHMgZm9yIGEgcGF0Y2gsIGl0IGlzIGdvb2QgdG8gaGF2ZSBhbiBpZGVhIG9mIHdobworeW91IHRoaW5rIHdpbGwgZXZlbnR1YWxseSBhY2NlcHQgdGhlIHBhdGNoIGFuZCBnZXQgaXQgbWVyZ2VkLiAgV2hpbGUgaXQKK2lzIHBvc3NpYmxlIHRvIHNlbmQgcGF0Y2hlcyBkaXJlY3RseSB0byBMaW51cyBUb3J2YWxkcyBhbmQgaGF2ZSBoaW0gbWVyZ2UKK3RoZW0sIHRoaW5ncyBhcmUgbm90IG5vcm1hbGx5IGRvbmUgdGhhdCB3YXkuICBMaW51cyBpcyBidXN5LCBhbmQgdGhlcmUgYXJlCitzdWJzeXN0ZW0gbWFpbnRhaW5lcnMgd2hvIHdhdGNoIG92ZXIgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbC4gIFVzdWFsbHkKK3lvdSB3aWxsIGJlIHdhbnRpbmcgdGhhdCBtYWludGFpbmVyIHRvIG1lcmdlIHlvdXIgcGF0Y2hlcy4gIElmIHRoZXJlIGlzIG5vCitvYnZpb3VzIG1haW50YWluZXIsIEFuZHJldyBNb3J0b24gaXMgb2Z0ZW4gdGhlIHBhdGNoIHRhcmdldCBvZiBsYXN0IHJlc29ydC4KKworUGF0Y2hlcyBuZWVkIGdvb2Qgc3ViamVjdCBsaW5lcy4gIFRoZSBjYW5vbmljYWwgZm9ybWF0IGZvciBhIHBhdGNoIGxpbmUgaXMKK3NvbWV0aGluZyBsaWtlOgorCis6OgorCisJW1BBVENIIG5uL21tXSBzdWJzeXM6IG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXRjaAorCit3aGVyZSAibm4iIGlzIHRoZSBvcmRpbmFsIG51bWJlciBvZiB0aGUgcGF0Y2gsICJtbSIgaXMgdGhlIHRvdGFsIG51bWJlciBvZgorcGF0Y2hlcyBpbiB0aGUgc2VyaWVzLCBhbmQgInN1YnN5cyIgaXMgdGhlIG5hbWUgb2YgdGhlIGFmZmVjdGVkIHN1YnN5c3RlbS4KK0NsZWFybHksIG5uL21tIGNhbiBiZSBvbWl0dGVkIGZvciBhIHNpbmdsZSwgc3RhbmRhbG9uZSBwYXRjaC4KKworSWYgeW91IGhhdmUgYSBzaWduaWZpY2FudCBzZXJpZXMgb2YgcGF0Y2hlcywgaXQgaXMgY3VzdG9tYXJ5IHRvIHNlbmQgYW4KK2ludHJvZHVjdG9yeSBkZXNjcmlwdGlvbiBhcyBwYXJ0IHplcm8uICBUaGlzIGNvbnZlbnRpb24gaXMgbm90IHVuaXZlcnNhbGx5Citmb2xsb3dlZCB0aG91Z2g7IGlmIHlvdSB1c2UgaXQsIHJlbWVtYmVyIHRoYXQgaW5mb3JtYXRpb24gaW4gdGhlCitpbnRyb2R1Y3Rpb24gZG9lcyBub3QgbWFrZSBpdCBpbnRvIHRoZSBrZXJuZWwgY2hhbmdlbG9ncy4gIFNvIHBsZWFzZSBlbnN1cmUKK3RoYXQgdGhlIHBhdGNoZXMsIHRoZW1zZWx2ZXMsIGhhdmUgY29tcGxldGUgY2hhbmdlbG9nIGluZm9ybWF0aW9uLgorCitJbiBnZW5lcmFsLCB0aGUgc2Vjb25kIGFuZCBmb2xsb3dpbmcgcGFydHMgb2YgYSBtdWx0aS1wYXJ0IHBhdGNoIHNob3VsZCBiZQorc2VudCBhcyBhIHJlcGx5IHRvIHRoZSBmaXJzdCBwYXJ0IHNvIHRoYXQgdGhleSBhbGwgdGhyZWFkIHRvZ2V0aGVyIGF0IHRoZQorcmVjZWl2aW5nIGVuZC4gIFRvb2xzIGxpa2UgZ2l0IGFuZCBxdWlsdCBoYXZlIGNvbW1hbmRzIHRvIG1haWwgb3V0IGEgc2V0IG9mCitwYXRjaGVzIHdpdGggdGhlIHByb3BlciB0aHJlYWRpbmcuICBJZiB5b3UgaGF2ZSBhIGxvbmcgc2VyaWVzLCB0aG91Z2gsIGFuZAorYXJlIHVzaW5nIGdpdCwgcGxlYXNlIHN0YXkgYXdheSBmcm9tIHRoZSAtLWNoYWluLXJlcGx5LXRvIG9wdGlvbiB0byBhdm9pZAorY3JlYXRpbmcgZXhjZXB0aW9uYWxseSBkZWVwIG5lc3RpbmcuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNi5Gb2xsb3d0aHJvdWdoIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzYuRm9sbG93dGhyb3VnaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkMzI0YS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNi5Gb2xsb3d0aHJvdWdoCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLTY6IEZPTExPV1RIUk9VR0gKLQotQXQgdGhpcyBwb2ludCwgeW91IGhhdmUgZm9sbG93ZWQgdGhlIGd1aWRlbGluZXMgZ2l2ZW4gc28gZmFyIGFuZCwgd2l0aCB0aGUKLWFkZGl0aW9uIG9mIHlvdXIgb3duIGVuZ2luZWVyaW5nIHNraWxscywgaGF2ZSBwb3N0ZWQgYSBwZXJmZWN0IHNlcmllcyBvZgotcGF0Y2hlcy4gIE9uZSBvZiB0aGUgYmlnZ2VzdCBtaXN0YWtlcyB0aGF0IGV2ZW4gZXhwZXJpZW5jZWQga2VybmVsCi1kZXZlbG9wZXJzIGNhbiBtYWtlIGlzIHRvIGNvbmNsdWRlIHRoYXQgdGhlaXIgd29yayBpcyBub3cgZG9uZS4gIEluIHRydXRoLAotcG9zdGluZyBwYXRjaGVzIGluZGljYXRlcyBhIHRyYW5zaXRpb24gaW50byB0aGUgbmV4dCBzdGFnZSBvZiB0aGUgcHJvY2VzcywKLXdpdGgsIHBvc3NpYmx5LCBxdWl0ZSBhIGJpdCBvZiB3b3JrIHlldCB0byBiZSBkb25lLgotCi1JdCBpcyBhIHJhcmUgcGF0Y2ggd2hpY2ggaXMgc28gZ29vZCBhdCBpdHMgZmlyc3QgcG9zdGluZyB0aGF0IHRoZXJlIGlzIG5vCi1yb29tIGZvciBpbXByb3ZlbWVudC4gIFRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyByZWNvZ25pemVzIHRoaXMgZmFjdCwKLWFuZCwgYXMgYSByZXN1bHQsIGlzIGhlYXZpbHkgb3JpZW50ZWQgdG93YXJkIHRoZSBpbXByb3ZlbWVudCBvZiBwb3N0ZWQKLWNvZGUuICBZb3UsIGFzIHRoZSBhdXRob3Igb2YgdGhhdCBjb2RlLCB3aWxsIGJlIGV4cGVjdGVkIHRvIHdvcmsgd2l0aCB0aGUKLWtlcm5lbCBjb21tdW5pdHkgdG8gZW5zdXJlIHRoYXQgeW91ciBjb2RlIGlzIHVwIHRvIHRoZSBrZXJuZWwncyBxdWFsaXR5Ci1zdGFuZGFyZHMuICBBIGZhaWx1cmUgdG8gcGFydGljaXBhdGUgaW4gdGhpcyBwcm9jZXNzIGlzIHF1aXRlIGxpa2VseSB0bwotcHJldmVudCB0aGUgaW5jbHVzaW9uIG9mIHlvdXIgcGF0Y2hlcyBpbnRvIHRoZSBtYWlubGluZS4KLQotCi02LjE6IFdPUktJTkcgV0lUSCBSRVZJRVdFUlMKLQotQSBwYXRjaCBvZiBhbnkgc2lnbmlmaWNhbmNlIHdpbGwgcmVzdWx0IGluIGEgbnVtYmVyIG9mIGNvbW1lbnRzIGZyb20gb3RoZXIKLWRldmVsb3BlcnMgYXMgdGhleSByZXZpZXcgdGhlIGNvZGUuICBXb3JraW5nIHdpdGggcmV2aWV3ZXJzIGNhbiBiZSwgZm9yCi1tYW55IGRldmVsb3BlcnMsIHRoZSBtb3N0IGludGltaWRhdGluZyBwYXJ0IG9mIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQKLXByb2Nlc3MuICBMaWZlIGNhbiBiZSBtYWRlIG11Y2ggZWFzaWVyLCB0aG91Z2gsIGlmIHlvdSBrZWVwIGEgZmV3IHRoaW5ncyBpbgotbWluZDoKLQotIC0gSWYgeW91IGhhdmUgZXhwbGFpbmVkIHlvdXIgcGF0Y2ggd2VsbCwgcmV2aWV3ZXJzIHdpbGwgdW5kZXJzdGFuZCBpdHMKLSAgIHZhbHVlIGFuZCB3aHkgeW91IHdlbnQgdG8gdGhlIHRyb3VibGUgb2Ygd3JpdGluZyBpdC4gIEJ1dCB0aGF0IHZhbHVlCi0gICB3aWxsIG5vdCBrZWVwIHRoZW0gZnJvbSBhc2tpbmcgYSBmdW5kYW1lbnRhbCBxdWVzdGlvbjogd2hhdCB3aWxsIGl0IGJlCi0gICBsaWtlIHRvIG1haW50YWluIGEga2VybmVsIHdpdGggdGhpcyBjb2RlIGluIGl0IGZpdmUgb3IgdGVuIHllYXJzIGxhdGVyPwotICAgTWFueSBvZiB0aGUgY2hhbmdlcyB5b3UgbWF5IGJlIGFza2VkIHRvIG1ha2UgLSBmcm9tIGNvZGluZyBzdHlsZSB0d2Vha3MKLSAgIHRvIHN1YnN0YW50aWFsIHJld3JpdGVzIC0gY29tZSBmcm9tIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgTGludXggd2lsbAotICAgc3RpbGwgYmUgYXJvdW5kIGFuZCB1bmRlciBkZXZlbG9wbWVudCBhIGRlY2FkZSBmcm9tIG5vdy4KLQotIC0gQ29kZSByZXZpZXcgaXMgaGFyZCB3b3JrLCBhbmQgaXQgaXMgYSByZWxhdGl2ZWx5IHRoYW5rbGVzcyBvY2N1cGF0aW9uOwotICAgcGVvcGxlIHJlbWVtYmVyIHdobyB3cm90ZSBrZXJuZWwgY29kZSwgYnV0IHRoZXJlIGlzIGxpdHRsZSBsYXN0aW5nIGZhbWUKLSAgIGZvciB0aG9zZSB3aG8gcmV2aWV3ZWQgaXQuICBTbyByZXZpZXdlcnMgY2FuIGdldCBncnVtcHksIGVzcGVjaWFsbHkgd2hlbgotICAgdGhleSBzZWUgdGhlIHNhbWUgbWlzdGFrZXMgYmVpbmcgbWFkZSBvdmVyIGFuZCBvdmVyIGFnYWluLiAgSWYgeW91IGdldCBhCi0gICByZXZpZXcgd2hpY2ggc2VlbXMgYW5ncnksIGluc3VsdGluZywgb3Igb3V0cmlnaHQgb2ZmZW5zaXZlLCByZXNpc3QgdGhlCi0gICBpbXB1bHNlIHRvIHJlc3BvbmQgaW4ga2luZC4gIENvZGUgcmV2aWV3IGlzIGFib3V0IHRoZSBjb2RlLCBub3QgYWJvdXQKLSAgIHRoZSBwZW9wbGUsIGFuZCBjb2RlIHJldmlld2VycyBhcmUgbm90IGF0dGFja2luZyB5b3UgcGVyc29uYWxseS4KLQotIC0gU2ltaWxhcmx5LCBjb2RlIHJldmlld2VycyBhcmUgbm90IHRyeWluZyB0byBwcm9tb3RlIHRoZWlyIGVtcGxveWVycycKLSAgIGFnZW5kYXMgYXQgdGhlIGV4cGVuc2Ugb2YgeW91ciBvd24uICBLZXJuZWwgZGV2ZWxvcGVycyBvZnRlbiBleHBlY3QgdG8KLSAgIGJlIHdvcmtpbmcgb24gdGhlIGtlcm5lbCB5ZWFycyBmcm9tIG5vdywgYnV0IHRoZXkgdW5kZXJzdGFuZCB0aGF0IHRoZWlyCi0gICBlbXBsb3llciBjb3VsZCBjaGFuZ2UuICBUaGV5IHRydWx5IGFyZSwgYWxtb3N0IHdpdGhvdXQgZXhjZXB0aW9uLAotICAgd29ya2luZyB0b3dhcmQgdGhlIGNyZWF0aW9uIG9mIHRoZSBiZXN0IGtlcm5lbCB0aGV5IGNhbjsgdGhleSBhcmUgbm90Ci0gICB0cnlpbmcgdG8gY3JlYXRlIGRpc2NvbWZvcnQgZm9yIHRoZWlyIGVtcGxveWVycycgY29tcGV0aXRvcnMuCi0KLVdoYXQgYWxsIG9mIHRoaXMgY29tZXMgZG93biB0byBpcyB0aGF0LCB3aGVuIHJldmlld2VycyBzZW5kIHlvdSBjb21tZW50cywKLXlvdSBuZWVkIHRvIHBheSBhdHRlbnRpb24gdG8gdGhlIHRlY2huaWNhbCBvYnNlcnZhdGlvbnMgdGhhdCB0aGV5IGFyZQotbWFraW5nLiAgRG8gbm90IGxldCB0aGVpciBmb3JtIG9mIGV4cHJlc3Npb24gb3IgeW91ciBvd24gcHJpZGUga2VlcCB0aGF0Ci1mcm9tIGhhcHBlbmluZy4gIFdoZW4geW91IGdldCByZXZpZXcgY29tbWVudHMgb24gYSBwYXRjaCwgdGFrZSB0aGUgdGltZSB0bwotdW5kZXJzdGFuZCB3aGF0IHRoZSByZXZpZXdlciBpcyB0cnlpbmcgdG8gc2F5LiAgSWYgcG9zc2libGUsIGZpeCB0aGUgdGhpbmdzCi10aGF0IHRoZSByZXZpZXdlciBpcyBhc2tpbmcgeW91IHRvIGZpeC4gIEFuZCByZXNwb25kIGJhY2sgdG8gdGhlIHJldmlld2VyOgotdGhhbmsgdGhlbSwgYW5kIGRlc2NyaWJlIGhvdyB5b3Ugd2lsbCBhbnN3ZXIgdGhlaXIgcXVlc3Rpb25zLgotCi1Ob3RlIHRoYXQgeW91IGRvIG5vdCBoYXZlIHRvIGFncmVlIHdpdGggZXZlcnkgY2hhbmdlIHN1Z2dlc3RlZCBieQotcmV2aWV3ZXJzLiAgSWYgeW91IGJlbGlldmUgdGhhdCB0aGUgcmV2aWV3ZXIgaGFzIG1pc3VuZGVyc3Rvb2QgeW91ciBjb2RlLAotZXhwbGFpbiB3aGF0IGlzIHJlYWxseSBnb2luZyBvbi4gIElmIHlvdSBoYXZlIGEgdGVjaG5pY2FsIG9iamVjdGlvbiB0byBhCi1zdWdnZXN0ZWQgY2hhbmdlLCBkZXNjcmliZSBpdCBhbmQganVzdGlmeSB5b3VyIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtLiAgSWYKLXlvdXIgZXhwbGFuYXRpb25zIG1ha2Ugc2Vuc2UsIHRoZSByZXZpZXdlciB3aWxsIGFjY2VwdCB0aGVtLiAgU2hvdWxkIHlvdXIKLWV4cGxhbmF0aW9uIG5vdCBwcm92ZSBwZXJzdWFzaXZlLCB0aG91Z2gsIGVzcGVjaWFsbHkgaWYgb3RoZXJzIHN0YXJ0IHRvCi1hZ3JlZSB3aXRoIHRoZSByZXZpZXdlciwgdGFrZSBzb21lIHRpbWUgdG8gdGhpbmsgdGhpbmdzIG92ZXIgYWdhaW4uICBJdCBjYW4KLWJlIGVhc3kgdG8gYmVjb21lIGJsaW5kZWQgYnkgeW91ciBvd24gc29sdXRpb24gdG8gYSBwcm9ibGVtIHRvIHRoZSBwb2ludAotdGhhdCB5b3UgZG9uJ3QgcmVhbGl6ZSB0aGF0IHNvbWV0aGluZyBpcyBmdW5kYW1lbnRhbGx5IHdyb25nIG9yLCBwZXJoYXBzLAoteW91J3JlIG5vdCBldmVuIHNvbHZpbmcgdGhlIHJpZ2h0IHByb2JsZW0uCi0KLUFuZHJldyBNb3J0b24gaGFzIHN1Z2dlc3RlZCB0aGF0IGV2ZXJ5IHJldmlldyBjb21tZW50IHdoaWNoIGRvZXMgbm90IHJlc3VsdAotaW4gYSBjb2RlIGNoYW5nZSBzaG91bGQgcmVzdWx0IGluIGFuIGFkZGl0aW9uYWwgY29kZSBjb21tZW50IGluc3RlYWQ7IHRoYXQKLWNhbiBoZWxwIGZ1dHVyZSByZXZpZXdlcnMgYXZvaWQgdGhlIHF1ZXN0aW9ucyB3aGljaCBjYW1lIHVwIHRoZSBmaXJzdCB0aW1lCi1hcm91bmQuCi0KLU9uZSBmYXRhbCBtaXN0YWtlIGlzIHRvIGlnbm9yZSByZXZpZXcgY29tbWVudHMgaW4gdGhlIGhvcGUgdGhhdCB0aGV5IHdpbGwKLWdvIGF3YXkuICBUaGV5IHdpbGwgbm90IGdvIGF3YXkuICBJZiB5b3UgcmVwb3N0IGNvZGUgd2l0aG91dCBoYXZpbmcKLXJlc3BvbmRlZCB0byB0aGUgY29tbWVudHMgeW91IGdvdCB0aGUgdGltZSBiZWZvcmUsIHlvdSdyZSBsaWtlbHkgdG8gZmluZAotdGhhdCB5b3VyIHBhdGNoZXMgZ28gbm93aGVyZS4KLQotU3BlYWtpbmcgb2YgcmVwb3N0aW5nIGNvZGU6IHBsZWFzZSBiZWFyIGluIG1pbmQgdGhhdCByZXZpZXdlcnMgYXJlIG5vdAotZ29pbmcgdG8gcmVtZW1iZXIgYWxsIHRoZSBkZXRhaWxzIG9mIHRoZSBjb2RlIHlvdSBwb3N0ZWQgdGhlIGxhc3QgdGltZQotYXJvdW5kLiAgU28gaXQgaXMgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIHJlbWluZCByZXZpZXdlcnMgb2YgcHJldmlvdXNseQotcmFpc2VkIGlzc3VlcyBhbmQgaG93IHlvdSBkZWFsdCB3aXRoIHRoZW07IHRoZSBwYXRjaCBjaGFuZ2Vsb2cgaXMgYSBnb29kCi1wbGFjZSBmb3IgdGhpcyBraW5kIG9mIGluZm9ybWF0aW9uLiAgUmV2aWV3ZXJzIHNob3VsZCBub3QgaGF2ZSB0byBzZWFyY2gKLXRocm91Z2ggbGlzdCBhcmNoaXZlcyB0byBmYW1pbGlhcml6ZSB0aGVtc2VsdmVzIHdpdGggd2hhdCB3YXMgc2FpZCBsYXN0Ci10aW1lOyBpZiB5b3UgaGVscCB0aGVtIGdldCBhIHJ1bm5pbmcgc3RhcnQsIHRoZXkgd2lsbCBiZSBpbiBhIGJldHRlciBtb29kCi13aGVuIHRoZXkgcmV2aXNpdCB5b3VyIGNvZGUuCi0KLVdoYXQgaWYgeW91J3ZlIHRyaWVkIHRvIGRvIGV2ZXJ5dGhpbmcgcmlnaHQgYW5kIHRoaW5ncyBzdGlsbCBhcmVuJ3QgZ29pbmcKLWFueXdoZXJlPyAgTW9zdCB0ZWNobmljYWwgZGlzYWdyZWVtZW50cyBjYW4gYmUgcmVzb2x2ZWQgdGhyb3VnaCBkaXNjdXNzaW9uLAotYnV0IHRoZXJlIGFyZSB0aW1lcyB3aGVuIHNvbWVib2R5IHNpbXBseSBoYXMgdG8gbWFrZSBhIGRlY2lzaW9uLiAgSWYgeW91Ci1ob25lc3RseSBiZWxpZXZlIHRoYXQgdGhpcyBkZWNpc2lvbiBpcyBnb2luZyBhZ2FpbnN0IHlvdSB3cm9uZ2x5LCB5b3UgY2FuCi1hbHdheXMgdHJ5IGFwcGVhbGluZyB0byBhIGhpZ2hlciBwb3dlci4gIEFzIG9mIHRoaXMgd3JpdGluZywgdGhhdCBoaWdoZXIKLXBvd2VyIHRlbmRzIHRvIGJlIEFuZHJldyBNb3J0b24uICBBbmRyZXcgaGFzIGEgZ3JlYXQgZGVhbCBvZiByZXNwZWN0IGluIHRoZQota2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eTsgaGUgY2FuIG9mdGVuIHVuamFtIGEgc2l0dWF0aW9uIHdoaWNoIHNlZW1zIHRvCi1iZSBob3BlbGVzc2x5IGJsb2NrZWQuICBBcHBlYWxpbmcgdG8gQW5kcmV3IHNob3VsZCBub3QgYmUgZG9uZSBsaWdodGx5LAotdGhvdWdoLCBhbmQgbm90IGJlZm9yZSBhbGwgb3RoZXIgYWx0ZXJuYXRpdmVzIGhhdmUgYmVlbiBleHBsb3JlZC4gIEFuZCBiZWFyCi1pbiBtaW5kLCBvZiBjb3Vyc2UsIHRoYXQgaGUgbWF5IG5vdCBhZ3JlZSB3aXRoIHlvdSBlaXRoZXIuCi0KLQotNi4yOiBXSEFUIEhBUFBFTlMgTkVYVAotCi1JZiBhIHBhdGNoIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBnb29kIHRoaW5nIHRvIGFkZCB0byB0aGUga2VybmVsLCBhbmQgb25jZQotbW9zdCBvZiB0aGUgcmV2aWV3IGlzc3VlcyBoYXZlIGJlZW4gcmVzb2x2ZWQsIHRoZSBuZXh0IHN0ZXAgaXMgdXN1YWxseQotZW50cnkgaW50byBhIHN1YnN5c3RlbSBtYWludGFpbmVyJ3MgdHJlZS4gIEhvdyB0aGF0IHdvcmtzIHZhcmllcyBmcm9tIG9uZQotc3Vic3lzdGVtIHRvIHRoZSBuZXh0OyBlYWNoIG1haW50YWluZXIgaGFzIGhpcyBvciBoZXIgb3duIHdheSBvZiBkb2luZwotdGhpbmdzLiAgSW4gcGFydGljdWxhciwgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgdHJlZSAtIG9uZSwgcGVyaGFwcywKLWRlZGljYXRlZCB0byBwYXRjaGVzIHBsYW5uZWQgZm9yIHRoZSBuZXh0IG1lcmdlIHdpbmRvdywgYW5kIGFub3RoZXIgZm9yCi1sb25nZXItdGVybSB3b3JrLgotCi1Gb3IgcGF0Y2hlcyBhcHBseWluZyB0byBhcmVhcyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gb2J2aW91cyBzdWJzeXN0ZW0gdHJlZQotKG1lbW9yeSBtYW5hZ2VtZW50IHBhdGNoZXMsIGZvciBleGFtcGxlKSwgdGhlIGRlZmF1bHQgdHJlZSBvZnRlbiBlbmRzIHVwCi1iZWluZyAtbW0uICBQYXRjaGVzIHdoaWNoIGFmZmVjdCBtdWx0aXBsZSBzdWJzeXN0ZW1zIGNhbiBhbHNvIGVuZCB1cCBnb2luZwotdGhyb3VnaCB0aGUgLW1tIHRyZWUuCi0KLUluY2x1c2lvbiBpbnRvIGEgc3Vic3lzdGVtIHRyZWUgY2FuIGJyaW5nIGEgaGlnaGVyIGxldmVsIG9mIHZpc2liaWxpdHkgdG8gYQotcGF0Y2guICBOb3cgb3RoZXIgZGV2ZWxvcGVycyB3b3JraW5nIHdpdGggdGhhdCB0cmVlIHdpbGwgZ2V0IHRoZSBwYXRjaCBieQotZGVmYXVsdC4gIFN1YnN5c3RlbSB0cmVlcyB0eXBpY2FsbHkgZmVlZCBsaW51eC1uZXh0IGFzIHdlbGwsIG1ha2luZyB0aGVpcgotY29udGVudHMgdmlzaWJsZSB0byB0aGUgZGV2ZWxvcG1lbnQgY29tbXVuaXR5IGFzIGEgd2hvbGUuICBBdCB0aGlzIHBvaW50LAotdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoYXQgeW91IHdpbGwgZ2V0IG1vcmUgY29tbWVudHMgZnJvbSBhIG5ldyBzZXQgb2YKLXJldmlld2VyczsgdGhlc2UgY29tbWVudHMgbmVlZCB0byBiZSBhbnN3ZXJlZCBhcyBpbiB0aGUgcHJldmlvdXMgcm91bmQuCi0KLVdoYXQgbWF5IGFsc28gaGFwcGVuIGF0IHRoaXMgcG9pbnQsIGRlcGVuZGluZyBvbiB0aGUgbmF0dXJlIG9mIHlvdXIgcGF0Y2gsCi1pcyB0aGF0IGNvbmZsaWN0cyB3aXRoIHdvcmsgYmVpbmcgZG9uZSBieSBvdGhlcnMgdHVybiB1cC4gIEluIHRoZSB3b3JzdAotY2FzZSwgaGVhdnkgcGF0Y2ggY29uZmxpY3RzIGNhbiByZXN1bHQgaW4gc29tZSB3b3JrIGJlaW5nIHB1dCBvbiB0aGUgYmFjawotYnVybmVyIHNvIHRoYXQgdGhlIHJlbWFpbmluZyBwYXRjaGVzIGNhbiBiZSB3b3JrZWQgaW50byBzaGFwZSBhbmQgbWVyZ2VkLgotT3RoZXIgdGltZXMsIGNvbmZsaWN0IHJlc29sdXRpb24gd2lsbCBpbnZvbHZlIHdvcmtpbmcgd2l0aCB0aGUgb3RoZXIKLWRldmVsb3BlcnMgYW5kLCBwb3NzaWJseSwgbW92aW5nIHNvbWUgcGF0Y2hlcyBiZXR3ZWVuIHRyZWVzIHRvIGVuc3VyZSB0aGF0Ci1ldmVyeXRoaW5nIGFwcGxpZXMgY2xlYW5seS4gIFRoaXMgd29yayBjYW4gYmUgYSBwYWluLCBidXQgY291bnQgeW91cgotYmxlc3NpbmdzOiBiZWZvcmUgdGhlIGFkdmVudCBvZiB0aGUgbGludXgtbmV4dCB0cmVlLCB0aGVzZSBjb25mbGljdHMgb2Z0ZW4KLW9ubHkgdHVybmVkIHVwIGR1cmluZyB0aGUgbWVyZ2Ugd2luZG93IGFuZCBoYWQgdG8gYmUgYWRkcmVzc2VkIGluIGEgaHVycnkuCi1Ob3cgdGhleSBjYW4gYmUgcmVzb2x2ZWQgYXQgbGVpc3VyZSwgYmVmb3JlIHRoZSBtZXJnZSB3aW5kb3cgb3BlbnMuCi0KLVNvbWUgZGF5LCBpZiBhbGwgZ29lcyB3ZWxsLCB5b3UnbGwgbG9nIG9uIGFuZCBzZWUgdGhhdCB5b3VyIHBhdGNoIGhhcyBiZWVuCi1tZXJnZWQgaW50byB0aGUgbWFpbmxpbmUga2VybmVsLiAgQ29uZ3JhdHVsYXRpb25zISAgT25jZSB0aGUgY2VsZWJyYXRpb24gaXMKLWNvbXBsZXRlIChhbmQgeW91IGhhdmUgYWRkZWQgeW91cnNlbGYgdG8gdGhlIE1BSU5UQUlORVJTIGZpbGUpLCB0aG91Z2gsIGl0Ci1pcyB3b3J0aCByZW1lbWJlcmluZyBhbiBpbXBvcnRhbnQgbGl0dGxlIGZhY3Q6IHRoZSBqb2Igc3RpbGwgaXMgbm90IGRvbmUuCi1NZXJnaW5nIGludG8gdGhlIG1haW5saW5lIGJyaW5ncyBpdHMgb3duIGNoYWxsZW5nZXMuCi0KLVRvIGJlZ2luIHdpdGgsIHRoZSB2aXNpYmlsaXR5IG9mIHlvdXIgcGF0Y2ggaGFzIGluY3JlYXNlZCB5ZXQgYWdhaW4uICBUaGVyZQotbWF5IGJlIGEgbmV3IHJvdW5kIG9mIGNvbW1lbnRzIGZyb20gZGV2ZWxvcGVycyB3aG8gaGFkIG5vdCBiZWVuIGF3YXJlIG9mCi10aGUgcGF0Y2ggYmVmb3JlLiAgSXQgbWF5IGJlIHRlbXB0aW5nIHRvIGlnbm9yZSB0aGVtLCBzaW5jZSB0aGVyZSBpcyBubwotbG9uZ2VyIGFueSBxdWVzdGlvbiBvZiB5b3VyIGNvZGUgYmVpbmcgbWVyZ2VkLiAgUmVzaXN0IHRoYXQgdGVtcHRhdGlvbiwKLXRob3VnaDsgeW91IHN0aWxsIG5lZWQgdG8gYmUgcmVzcG9uc2l2ZSB0byBkZXZlbG9wZXJzIHdobyBoYXZlIHF1ZXN0aW9ucyBvcgotc3VnZ2VzdGlvbnMuCi0KLU1vcmUgaW1wb3J0YW50bHksIHRob3VnaDogaW5jbHVzaW9uIGludG8gdGhlIG1haW5saW5lIHB1dHMgeW91ciBjb2RlIGludG8KLXRoZSBoYW5kcyBvZiBhIG11Y2ggbGFyZ2VyIGdyb3VwIG9mIHRlc3RlcnMuICBFdmVuIGlmIHlvdSBoYXZlIGNvbnRyaWJ1dGVkCi1hIGRyaXZlciBmb3IgaGFyZHdhcmUgd2hpY2ggaXMgbm90IHlldCBhdmFpbGFibGUsIHlvdSB3aWxsIGJlIHN1cnByaXNlZCBieQotaG93IG1hbnkgcGVvcGxlIHdpbGwgYnVpbGQgeW91ciBjb2RlIGludG8gdGhlaXIga2VybmVscy4gIEFuZCwgb2YgY291cnNlLAotd2hlcmUgdGhlcmUgYXJlIHRlc3RlcnMsIHRoZXJlIHdpbGwgYmUgYnVnIHJlcG9ydHMuCi0KLVRoZSB3b3JzdCBzb3J0IG9mIGJ1ZyByZXBvcnRzIGFyZSByZWdyZXNzaW9ucy4gIElmIHlvdXIgcGF0Y2ggY2F1c2VzIGEKLXJlZ3Jlc3Npb24sIHlvdSdsbCBmaW5kIGFuIHVuY29tZm9ydGFibGUgbnVtYmVyIG9mIGV5ZXMgdXBvbiB5b3U7Ci1yZWdyZXNzaW9ucyBuZWVkIHRvIGJlIGZpeGVkIGFzIHNvb24gYXMgcG9zc2libGUuICBJZiB5b3UgYXJlIHVud2lsbGluZyBvcgotdW5hYmxlIHRvIGZpeCB0aGUgcmVncmVzc2lvbiAoYW5kIG5vYm9keSBlbHNlIGRvZXMgaXQgZm9yIHlvdSksIHlvdXIgcGF0Y2gKLXdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSByZW1vdmVkIGR1cmluZyB0aGUgc3RhYmlsaXphdGlvbiBwZXJpb2QuICBCZXlvbmQKLW5lZ2F0aW5nIGFsbCBvZiB0aGUgd29yayB5b3UgaGF2ZSBkb25lIHRvIGdldCB5b3VyIHBhdGNoIGludG8gdGhlIG1haW5saW5lLAotaGF2aW5nIGEgcGF0Y2ggcHVsbGVkIGFzIHRoZSByZXN1bHQgb2YgYSBmYWlsdXJlIHRvIGZpeCBhIHJlZ3Jlc3Npb24gY291bGQKLXdlbGwgbWFrZSBpdCBoYXJkZXIgZm9yIHlvdSB0byBnZXQgd29yayBtZXJnZWQgaW4gdGhlIGZ1dHVyZS4KLQotQWZ0ZXIgYW55IHJlZ3Jlc3Npb25zIGhhdmUgYmVlbiBkZWFsdCB3aXRoLCB0aGVyZSBtYXkgYmUgb3RoZXIsIG9yZGluYXJ5Ci1idWdzIHRvIGRlYWwgd2l0aC4gIFRoZSBzdGFiaWxpemF0aW9uIHBlcmlvZCBpcyB5b3VyIGJlc3Qgb3Bwb3J0dW5pdHkgdG8KLWZpeCB0aGVzZSBidWdzIGFuZCBlbnN1cmUgdGhhdCB5b3VyIGNvZGUncyBkZWJ1dCBpbiBhIG1haW5saW5lIGtlcm5lbAotcmVsZWFzZSBpcyBhcyBzb2xpZCBhcyBwb3NzaWJsZS4gIFNvLCBwbGVhc2UsIGFuc3dlciBidWcgcmVwb3J0cywgYW5kIGZpeAotdGhlIHByb2JsZW1zIGlmIGF0IGFsbCBwb3NzaWJsZS4gIFRoYXQncyB3aGF0IHRoZSBzdGFiaWxpemF0aW9uIHBlcmlvZCBpcwotZm9yOyB5b3UgY2FuIHN0YXJ0IGNyZWF0aW5nIGNvb2wgbmV3IHBhdGNoZXMgb25jZSBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgb2xkCi1vbmVzIGhhdmUgYmVlbiB0YWtlbiBjYXJlIG9mLgotCi1BbmQgZG9uJ3QgZm9yZ2V0IHRoYXQgdGhlcmUgYXJlIG90aGVyIG1pbGVzdG9uZXMgd2hpY2ggbWF5IGFsc28gY3JlYXRlIGJ1ZwotcmVwb3J0czogdGhlIG5leHQgbWFpbmxpbmUgc3RhYmxlIHJlbGVhc2UsIHdoZW4gcHJvbWluZW50IGRpc3RyaWJ1dG9ycyBwaWNrCi11cCBhIHZlcnNpb24gb2YgdGhlIGtlcm5lbCBjb250YWluaW5nIHlvdXIgcGF0Y2gsIGV0Yy4gIENvbnRpbnVpbmcgdG8KLXJlc3BvbmQgdG8gdGhlc2UgcmVwb3J0cyBpcyBhIG1hdHRlciBvZiBiYXNpYyBwcmlkZSBpbiB5b3VyIHdvcmsuICBJZiB0aGF0Ci1pcyBpbnN1ZmZpY2llbnQgbW90aXZhdGlvbiwgdGhvdWdoLCBpdCdzIGFsc28gd29ydGggY29uc2lkZXJpbmcgdGhhdCB0aGUKLWRldmVsb3BtZW50IGNvbW11bml0eSByZW1lbWJlcnMgZGV2ZWxvcGVycyB3aG8gbG9zZSBpbnRlcmVzdCBpbiB0aGVpciBjb2RlCi1hZnRlciBpdCdzIG1lcmdlZC4gIFRoZSBuZXh0IHRpbWUgeW91IHBvc3QgYSBwYXRjaCwgdGhleSB3aWxsIGJlIGV2YWx1YXRpbmcKLWl0IHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB5b3Ugd2lsbCBub3QgYmUgYXJvdW5kIHRvIG1haW50YWluIGl0Ci1hZnRlcndhcmQuCi0KLQotNi4zOiBPVEhFUiBUSElOR1MgVEhBVCBDQU4gSEFQUEVOCi0KLU9uZSBkYXksIHlvdSBtYXkgb3BlbiB5b3VyIG1haWwgY2xpZW50IGFuZCBzZWUgdGhhdCBzb21lYm9keSBoYXMgbWFpbGVkIHlvdQotYSBwYXRjaCB0byB5b3VyIGNvZGUuICBUaGF0IGlzIG9uZSBvZiB0aGUgYWR2YW50YWdlcyBvZiBoYXZpbmcgeW91ciBjb2RlCi1vdXQgdGhlcmUgaW4gdGhlIG9wZW4sIGFmdGVyIGFsbC4gIElmIHlvdSBhZ3JlZSB3aXRoIHRoZSBwYXRjaCwgeW91IGNhbgotZWl0aGVyIGZvcndhcmQgaXQgb24gdG8gdGhlIHN1YnN5c3RlbSBtYWludGFpbmVyIChiZSBzdXJlIHRvIGluY2x1ZGUgYQotcHJvcGVyIEZyb206IGxpbmUgc28gdGhhdCB0aGUgYXR0cmlidXRpb24gaXMgY29ycmVjdCwgYW5kIGFkZCBhIHNpZ25vZmYgb2YKLXlvdXIgb3duKSwgb3Igc2VuZCBhbiBBY2tlZC1ieTogcmVzcG9uc2UgYmFjayBhbmQgbGV0IHRoZSBvcmlnaW5hbCBwb3N0ZXIKLXNlbmQgaXQgdXB3YXJkLgotCi1JZiB5b3UgZGlzYWdyZWUgd2l0aCB0aGUgcGF0Y2gsIHNlbmQgYSBwb2xpdGUgcmVzcG9uc2UgZXhwbGFpbmluZyB3aHkuICBJZgotcG9zc2libGUsIHRlbGwgdGhlIGF1dGhvciB3aGF0IGNoYW5nZXMgbmVlZCB0byBiZSBtYWRlIHRvIG1ha2UgdGhlIHBhdGNoCi1hY2NlcHRhYmxlIHRvIHlvdS4gIFRoZXJlIGlzIGEgY2VydGFpbiByZXNpc3RhbmNlIHRvIG1lcmdpbmcgcGF0Y2hlcyB3aGljaAotYXJlIG9wcG9zZWQgYnkgdGhlIGF1dGhvciBhbmQgbWFpbnRhaW5lciBvZiB0aGUgY29kZSwgYnV0IGl0IG9ubHkgZ29lcyBzbwotZmFyLiAgSWYgeW91IGFyZSBzZWVuIGFzIG5lZWRsZXNzbHkgYmxvY2tpbmcgZ29vZCB3b3JrLCB0aG9zZSBwYXRjaGVzIHdpbGwKLWV2ZW50dWFsbHkgZmxvdyBhcm91bmQgeW91IGFuZCBnZXQgaW50byB0aGUgbWFpbmxpbmUgYW55d2F5LiAgSW4gdGhlIExpbnV4Ci1rZXJuZWwsIG5vYm9keSBoYXMgYWJzb2x1dGUgdmV0byBwb3dlciBvdmVyIGFueSBjb2RlLiAgRXhjZXB0IG1heWJlIExpbnVzLgotCi1PbiB2ZXJ5IHJhcmUgb2NjYXNpb24sIHlvdSBtYXkgc2VlIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudDogYW5vdGhlcgotZGV2ZWxvcGVyIHBvc3RzIGEgZGlmZmVyZW50IHNvbHV0aW9uIHRvIHlvdXIgcHJvYmxlbS4gIEF0IHRoYXQgcG9pbnQsCi1jaGFuY2VzIGFyZSB0aGF0IG9uZSBvZiB0aGUgdHdvIHBhdGNoZXMgd2lsbCBub3QgYmUgbWVyZ2VkLCBhbmQgIm1pbmUgd2FzCi1oZXJlIGZpcnN0IiBpcyBub3QgY29uc2lkZXJlZCB0byBiZSBhIGNvbXBlbGxpbmcgdGVjaG5pY2FsIGFyZ3VtZW50LiAgSWYKLXNvbWVib2R5IGVsc2UncyBwYXRjaCBkaXNwbGFjZXMgeW91cnMgYW5kIGdldHMgaW50byB0aGUgbWFpbmxpbmUsIHRoZXJlIGlzCi1yZWFsbHkgb25seSBvbmUgd2F5IHRvIHJlc3BvbmQ6IGJlIHBsZWFzZWQgdGhhdCB5b3VyIHByb2JsZW0gZ290IHNvbHZlZCBhbmQKLWdldCBvbiB3aXRoIHlvdXIgd29yay4gIEhhdmluZyBvbmUncyB3b3JrIHNob3ZlZCBhc2lkZSBpbiB0aGlzIG1hbm5lciBjYW4KLWJlIGh1cnRmdWwgYW5kIGRpc2NvdXJhZ2luZywgYnV0IHRoZSBjb21tdW5pdHkgd2lsbCByZW1lbWJlciB5b3VyIHJlYWN0aW9uCi1sb25nIGFmdGVyIHRoZXkgaGF2ZSBmb3Jnb3R0ZW4gd2hvc2UgcGF0Y2ggYWN0dWFsbHkgZ290IG1lcmdlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy82LkZvbGxvd3Rocm91Z2gucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzYuRm9sbG93dGhyb3VnaC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3M2NkNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy82LkZvbGxvd3Rocm91Z2gucnN0CkBAIC0wLDAgKzEsMjEyIEBACisuLiBfZGV2ZWxvcG1lbnRfZm9sbG93dGhyb3VnaDoKKworRm9sbG93dGhyb3VnaAorPT09PT09PT09PT09PQorCitBdCB0aGlzIHBvaW50LCB5b3UgaGF2ZSBmb2xsb3dlZCB0aGUgZ3VpZGVsaW5lcyBnaXZlbiBzbyBmYXIgYW5kLCB3aXRoIHRoZQorYWRkaXRpb24gb2YgeW91ciBvd24gZW5naW5lZXJpbmcgc2tpbGxzLCBoYXZlIHBvc3RlZCBhIHBlcmZlY3Qgc2VyaWVzIG9mCitwYXRjaGVzLiAgT25lIG9mIHRoZSBiaWdnZXN0IG1pc3Rha2VzIHRoYXQgZXZlbiBleHBlcmllbmNlZCBrZXJuZWwKK2RldmVsb3BlcnMgY2FuIG1ha2UgaXMgdG8gY29uY2x1ZGUgdGhhdCB0aGVpciB3b3JrIGlzIG5vdyBkb25lLiAgSW4gdHJ1dGgsCitwb3N0aW5nIHBhdGNoZXMgaW5kaWNhdGVzIGEgdHJhbnNpdGlvbiBpbnRvIHRoZSBuZXh0IHN0YWdlIG9mIHRoZSBwcm9jZXNzLAord2l0aCwgcG9zc2libHksIHF1aXRlIGEgYml0IG9mIHdvcmsgeWV0IHRvIGJlIGRvbmUuCisKK0l0IGlzIGEgcmFyZSBwYXRjaCB3aGljaCBpcyBzbyBnb29kIGF0IGl0cyBmaXJzdCBwb3N0aW5nIHRoYXQgdGhlcmUgaXMgbm8KK3Jvb20gZm9yIGltcHJvdmVtZW50LiAgVGhlIGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzIHJlY29nbml6ZXMgdGhpcyBmYWN0LAorYW5kLCBhcyBhIHJlc3VsdCwgaXMgaGVhdmlseSBvcmllbnRlZCB0b3dhcmQgdGhlIGltcHJvdmVtZW50IG9mIHBvc3RlZAorY29kZS4gIFlvdSwgYXMgdGhlIGF1dGhvciBvZiB0aGF0IGNvZGUsIHdpbGwgYmUgZXhwZWN0ZWQgdG8gd29yayB3aXRoIHRoZQora2VybmVsIGNvbW11bml0eSB0byBlbnN1cmUgdGhhdCB5b3VyIGNvZGUgaXMgdXAgdG8gdGhlIGtlcm5lbCdzIHF1YWxpdHkKK3N0YW5kYXJkcy4gIEEgZmFpbHVyZSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGlzIHByb2Nlc3MgaXMgcXVpdGUgbGlrZWx5IHRvCitwcmV2ZW50IHRoZSBpbmNsdXNpb24gb2YgeW91ciBwYXRjaGVzIGludG8gdGhlIG1haW5saW5lLgorCisKK1dvcmtpbmcgd2l0aCByZXZpZXdlcnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQSBwYXRjaCBvZiBhbnkgc2lnbmlmaWNhbmNlIHdpbGwgcmVzdWx0IGluIGEgbnVtYmVyIG9mIGNvbW1lbnRzIGZyb20gb3RoZXIKK2RldmVsb3BlcnMgYXMgdGhleSByZXZpZXcgdGhlIGNvZGUuICBXb3JraW5nIHdpdGggcmV2aWV3ZXJzIGNhbiBiZSwgZm9yCittYW55IGRldmVsb3BlcnMsIHRoZSBtb3N0IGludGltaWRhdGluZyBwYXJ0IG9mIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQKK3Byb2Nlc3MuICBMaWZlIGNhbiBiZSBtYWRlIG11Y2ggZWFzaWVyLCB0aG91Z2gsIGlmIHlvdSBrZWVwIGEgZmV3IHRoaW5ncyBpbgorbWluZDoKKworIC0gSWYgeW91IGhhdmUgZXhwbGFpbmVkIHlvdXIgcGF0Y2ggd2VsbCwgcmV2aWV3ZXJzIHdpbGwgdW5kZXJzdGFuZCBpdHMKKyAgIHZhbHVlIGFuZCB3aHkgeW91IHdlbnQgdG8gdGhlIHRyb3VibGUgb2Ygd3JpdGluZyBpdC4gIEJ1dCB0aGF0IHZhbHVlCisgICB3aWxsIG5vdCBrZWVwIHRoZW0gZnJvbSBhc2tpbmcgYSBmdW5kYW1lbnRhbCBxdWVzdGlvbjogd2hhdCB3aWxsIGl0IGJlCisgICBsaWtlIHRvIG1haW50YWluIGEga2VybmVsIHdpdGggdGhpcyBjb2RlIGluIGl0IGZpdmUgb3IgdGVuIHllYXJzIGxhdGVyPworICAgTWFueSBvZiB0aGUgY2hhbmdlcyB5b3UgbWF5IGJlIGFza2VkIHRvIG1ha2UgLSBmcm9tIGNvZGluZyBzdHlsZSB0d2Vha3MKKyAgIHRvIHN1YnN0YW50aWFsIHJld3JpdGVzIC0gY29tZSBmcm9tIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgTGludXggd2lsbAorICAgc3RpbGwgYmUgYXJvdW5kIGFuZCB1bmRlciBkZXZlbG9wbWVudCBhIGRlY2FkZSBmcm9tIG5vdy4KKworIC0gQ29kZSByZXZpZXcgaXMgaGFyZCB3b3JrLCBhbmQgaXQgaXMgYSByZWxhdGl2ZWx5IHRoYW5rbGVzcyBvY2N1cGF0aW9uOworICAgcGVvcGxlIHJlbWVtYmVyIHdobyB3cm90ZSBrZXJuZWwgY29kZSwgYnV0IHRoZXJlIGlzIGxpdHRsZSBsYXN0aW5nIGZhbWUKKyAgIGZvciB0aG9zZSB3aG8gcmV2aWV3ZWQgaXQuICBTbyByZXZpZXdlcnMgY2FuIGdldCBncnVtcHksIGVzcGVjaWFsbHkgd2hlbgorICAgdGhleSBzZWUgdGhlIHNhbWUgbWlzdGFrZXMgYmVpbmcgbWFkZSBvdmVyIGFuZCBvdmVyIGFnYWluLiAgSWYgeW91IGdldCBhCisgICByZXZpZXcgd2hpY2ggc2VlbXMgYW5ncnksIGluc3VsdGluZywgb3Igb3V0cmlnaHQgb2ZmZW5zaXZlLCByZXNpc3QgdGhlCisgICBpbXB1bHNlIHRvIHJlc3BvbmQgaW4ga2luZC4gIENvZGUgcmV2aWV3IGlzIGFib3V0IHRoZSBjb2RlLCBub3QgYWJvdXQKKyAgIHRoZSBwZW9wbGUsIGFuZCBjb2RlIHJldmlld2VycyBhcmUgbm90IGF0dGFja2luZyB5b3UgcGVyc29uYWxseS4KKworIC0gU2ltaWxhcmx5LCBjb2RlIHJldmlld2VycyBhcmUgbm90IHRyeWluZyB0byBwcm9tb3RlIHRoZWlyIGVtcGxveWVycycKKyAgIGFnZW5kYXMgYXQgdGhlIGV4cGVuc2Ugb2YgeW91ciBvd24uICBLZXJuZWwgZGV2ZWxvcGVycyBvZnRlbiBleHBlY3QgdG8KKyAgIGJlIHdvcmtpbmcgb24gdGhlIGtlcm5lbCB5ZWFycyBmcm9tIG5vdywgYnV0IHRoZXkgdW5kZXJzdGFuZCB0aGF0IHRoZWlyCisgICBlbXBsb3llciBjb3VsZCBjaGFuZ2UuICBUaGV5IHRydWx5IGFyZSwgYWxtb3N0IHdpdGhvdXQgZXhjZXB0aW9uLAorICAgd29ya2luZyB0b3dhcmQgdGhlIGNyZWF0aW9uIG9mIHRoZSBiZXN0IGtlcm5lbCB0aGV5IGNhbjsgdGhleSBhcmUgbm90CisgICB0cnlpbmcgdG8gY3JlYXRlIGRpc2NvbWZvcnQgZm9yIHRoZWlyIGVtcGxveWVycycgY29tcGV0aXRvcnMuCisKK1doYXQgYWxsIG9mIHRoaXMgY29tZXMgZG93biB0byBpcyB0aGF0LCB3aGVuIHJldmlld2VycyBzZW5kIHlvdSBjb21tZW50cywKK3lvdSBuZWVkIHRvIHBheSBhdHRlbnRpb24gdG8gdGhlIHRlY2huaWNhbCBvYnNlcnZhdGlvbnMgdGhhdCB0aGV5IGFyZQorbWFraW5nLiAgRG8gbm90IGxldCB0aGVpciBmb3JtIG9mIGV4cHJlc3Npb24gb3IgeW91ciBvd24gcHJpZGUga2VlcCB0aGF0Citmcm9tIGhhcHBlbmluZy4gIFdoZW4geW91IGdldCByZXZpZXcgY29tbWVudHMgb24gYSBwYXRjaCwgdGFrZSB0aGUgdGltZSB0bwordW5kZXJzdGFuZCB3aGF0IHRoZSByZXZpZXdlciBpcyB0cnlpbmcgdG8gc2F5LiAgSWYgcG9zc2libGUsIGZpeCB0aGUgdGhpbmdzCit0aGF0IHRoZSByZXZpZXdlciBpcyBhc2tpbmcgeW91IHRvIGZpeC4gIEFuZCByZXNwb25kIGJhY2sgdG8gdGhlIHJldmlld2VyOgordGhhbmsgdGhlbSwgYW5kIGRlc2NyaWJlIGhvdyB5b3Ugd2lsbCBhbnN3ZXIgdGhlaXIgcXVlc3Rpb25zLgorCitOb3RlIHRoYXQgeW91IGRvIG5vdCBoYXZlIHRvIGFncmVlIHdpdGggZXZlcnkgY2hhbmdlIHN1Z2dlc3RlZCBieQorcmV2aWV3ZXJzLiAgSWYgeW91IGJlbGlldmUgdGhhdCB0aGUgcmV2aWV3ZXIgaGFzIG1pc3VuZGVyc3Rvb2QgeW91ciBjb2RlLAorZXhwbGFpbiB3aGF0IGlzIHJlYWxseSBnb2luZyBvbi4gIElmIHlvdSBoYXZlIGEgdGVjaG5pY2FsIG9iamVjdGlvbiB0byBhCitzdWdnZXN0ZWQgY2hhbmdlLCBkZXNjcmliZSBpdCBhbmQganVzdGlmeSB5b3VyIHNvbHV0aW9uIHRvIHRoZSBwcm9ibGVtLiAgSWYKK3lvdXIgZXhwbGFuYXRpb25zIG1ha2Ugc2Vuc2UsIHRoZSByZXZpZXdlciB3aWxsIGFjY2VwdCB0aGVtLiAgU2hvdWxkIHlvdXIKK2V4cGxhbmF0aW9uIG5vdCBwcm92ZSBwZXJzdWFzaXZlLCB0aG91Z2gsIGVzcGVjaWFsbHkgaWYgb3RoZXJzIHN0YXJ0IHRvCithZ3JlZSB3aXRoIHRoZSByZXZpZXdlciwgdGFrZSBzb21lIHRpbWUgdG8gdGhpbmsgdGhpbmdzIG92ZXIgYWdhaW4uICBJdCBjYW4KK2JlIGVhc3kgdG8gYmVjb21lIGJsaW5kZWQgYnkgeW91ciBvd24gc29sdXRpb24gdG8gYSBwcm9ibGVtIHRvIHRoZSBwb2ludAordGhhdCB5b3UgZG9uJ3QgcmVhbGl6ZSB0aGF0IHNvbWV0aGluZyBpcyBmdW5kYW1lbnRhbGx5IHdyb25nIG9yLCBwZXJoYXBzLAoreW91J3JlIG5vdCBldmVuIHNvbHZpbmcgdGhlIHJpZ2h0IHByb2JsZW0uCisKK0FuZHJldyBNb3J0b24gaGFzIHN1Z2dlc3RlZCB0aGF0IGV2ZXJ5IHJldmlldyBjb21tZW50IHdoaWNoIGRvZXMgbm90IHJlc3VsdAoraW4gYSBjb2RlIGNoYW5nZSBzaG91bGQgcmVzdWx0IGluIGFuIGFkZGl0aW9uYWwgY29kZSBjb21tZW50IGluc3RlYWQ7IHRoYXQKK2NhbiBoZWxwIGZ1dHVyZSByZXZpZXdlcnMgYXZvaWQgdGhlIHF1ZXN0aW9ucyB3aGljaCBjYW1lIHVwIHRoZSBmaXJzdCB0aW1lCithcm91bmQuCisKK09uZSBmYXRhbCBtaXN0YWtlIGlzIHRvIGlnbm9yZSByZXZpZXcgY29tbWVudHMgaW4gdGhlIGhvcGUgdGhhdCB0aGV5IHdpbGwKK2dvIGF3YXkuICBUaGV5IHdpbGwgbm90IGdvIGF3YXkuICBJZiB5b3UgcmVwb3N0IGNvZGUgd2l0aG91dCBoYXZpbmcKK3Jlc3BvbmRlZCB0byB0aGUgY29tbWVudHMgeW91IGdvdCB0aGUgdGltZSBiZWZvcmUsIHlvdSdyZSBsaWtlbHkgdG8gZmluZAordGhhdCB5b3VyIHBhdGNoZXMgZ28gbm93aGVyZS4KKworU3BlYWtpbmcgb2YgcmVwb3N0aW5nIGNvZGU6IHBsZWFzZSBiZWFyIGluIG1pbmQgdGhhdCByZXZpZXdlcnMgYXJlIG5vdAorZ29pbmcgdG8gcmVtZW1iZXIgYWxsIHRoZSBkZXRhaWxzIG9mIHRoZSBjb2RlIHlvdSBwb3N0ZWQgdGhlIGxhc3QgdGltZQorYXJvdW5kLiAgU28gaXQgaXMgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIHJlbWluZCByZXZpZXdlcnMgb2YgcHJldmlvdXNseQorcmFpc2VkIGlzc3VlcyBhbmQgaG93IHlvdSBkZWFsdCB3aXRoIHRoZW07IHRoZSBwYXRjaCBjaGFuZ2Vsb2cgaXMgYSBnb29kCitwbGFjZSBmb3IgdGhpcyBraW5kIG9mIGluZm9ybWF0aW9uLiAgUmV2aWV3ZXJzIHNob3VsZCBub3QgaGF2ZSB0byBzZWFyY2gKK3Rocm91Z2ggbGlzdCBhcmNoaXZlcyB0byBmYW1pbGlhcml6ZSB0aGVtc2VsdmVzIHdpdGggd2hhdCB3YXMgc2FpZCBsYXN0Cit0aW1lOyBpZiB5b3UgaGVscCB0aGVtIGdldCBhIHJ1bm5pbmcgc3RhcnQsIHRoZXkgd2lsbCBiZSBpbiBhIGJldHRlciBtb29kCit3aGVuIHRoZXkgcmV2aXNpdCB5b3VyIGNvZGUuCisKK1doYXQgaWYgeW91J3ZlIHRyaWVkIHRvIGRvIGV2ZXJ5dGhpbmcgcmlnaHQgYW5kIHRoaW5ncyBzdGlsbCBhcmVuJ3QgZ29pbmcKK2FueXdoZXJlPyAgTW9zdCB0ZWNobmljYWwgZGlzYWdyZWVtZW50cyBjYW4gYmUgcmVzb2x2ZWQgdGhyb3VnaCBkaXNjdXNzaW9uLAorYnV0IHRoZXJlIGFyZSB0aW1lcyB3aGVuIHNvbWVib2R5IHNpbXBseSBoYXMgdG8gbWFrZSBhIGRlY2lzaW9uLiAgSWYgeW91Citob25lc3RseSBiZWxpZXZlIHRoYXQgdGhpcyBkZWNpc2lvbiBpcyBnb2luZyBhZ2FpbnN0IHlvdSB3cm9uZ2x5LCB5b3UgY2FuCithbHdheXMgdHJ5IGFwcGVhbGluZyB0byBhIGhpZ2hlciBwb3dlci4gIEFzIG9mIHRoaXMgd3JpdGluZywgdGhhdCBoaWdoZXIKK3Bvd2VyIHRlbmRzIHRvIGJlIEFuZHJldyBNb3J0b24uICBBbmRyZXcgaGFzIGEgZ3JlYXQgZGVhbCBvZiByZXNwZWN0IGluIHRoZQora2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eTsgaGUgY2FuIG9mdGVuIHVuamFtIGEgc2l0dWF0aW9uIHdoaWNoIHNlZW1zIHRvCitiZSBob3BlbGVzc2x5IGJsb2NrZWQuICBBcHBlYWxpbmcgdG8gQW5kcmV3IHNob3VsZCBub3QgYmUgZG9uZSBsaWdodGx5LAordGhvdWdoLCBhbmQgbm90IGJlZm9yZSBhbGwgb3RoZXIgYWx0ZXJuYXRpdmVzIGhhdmUgYmVlbiBleHBsb3JlZC4gIEFuZCBiZWFyCitpbiBtaW5kLCBvZiBjb3Vyc2UsIHRoYXQgaGUgbWF5IG5vdCBhZ3JlZSB3aXRoIHlvdSBlaXRoZXIuCisKKworV2hhdCBoYXBwZW5zIG5leHQKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIGEgcGF0Y2ggaXMgY29uc2lkZXJlZCB0byBiZSBhIGdvb2QgdGhpbmcgdG8gYWRkIHRvIHRoZSBrZXJuZWwsIGFuZCBvbmNlCittb3N0IG9mIHRoZSByZXZpZXcgaXNzdWVzIGhhdmUgYmVlbiByZXNvbHZlZCwgdGhlIG5leHQgc3RlcCBpcyB1c3VhbGx5CitlbnRyeSBpbnRvIGEgc3Vic3lzdGVtIG1haW50YWluZXIncyB0cmVlLiAgSG93IHRoYXQgd29ya3MgdmFyaWVzIGZyb20gb25lCitzdWJzeXN0ZW0gdG8gdGhlIG5leHQ7IGVhY2ggbWFpbnRhaW5lciBoYXMgaGlzIG9yIGhlciBvd24gd2F5IG9mIGRvaW5nCit0aGluZ3MuICBJbiBwYXJ0aWN1bGFyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSB0cmVlIC0gb25lLCBwZXJoYXBzLAorZGVkaWNhdGVkIHRvIHBhdGNoZXMgcGxhbm5lZCBmb3IgdGhlIG5leHQgbWVyZ2Ugd2luZG93LCBhbmQgYW5vdGhlciBmb3IKK2xvbmdlci10ZXJtIHdvcmsuCisKK0ZvciBwYXRjaGVzIGFwcGx5aW5nIHRvIGFyZWFzIGZvciB3aGljaCB0aGVyZSBpcyBubyBvYnZpb3VzIHN1YnN5c3RlbSB0cmVlCisobWVtb3J5IG1hbmFnZW1lbnQgcGF0Y2hlcywgZm9yIGV4YW1wbGUpLCB0aGUgZGVmYXVsdCB0cmVlIG9mdGVuIGVuZHMgdXAKK2JlaW5nIC1tbS4gIFBhdGNoZXMgd2hpY2ggYWZmZWN0IG11bHRpcGxlIHN1YnN5c3RlbXMgY2FuIGFsc28gZW5kIHVwIGdvaW5nCit0aHJvdWdoIHRoZSAtbW0gdHJlZS4KKworSW5jbHVzaW9uIGludG8gYSBzdWJzeXN0ZW0gdHJlZSBjYW4gYnJpbmcgYSBoaWdoZXIgbGV2ZWwgb2YgdmlzaWJpbGl0eSB0byBhCitwYXRjaC4gIE5vdyBvdGhlciBkZXZlbG9wZXJzIHdvcmtpbmcgd2l0aCB0aGF0IHRyZWUgd2lsbCBnZXQgdGhlIHBhdGNoIGJ5CitkZWZhdWx0LiAgU3Vic3lzdGVtIHRyZWVzIHR5cGljYWxseSBmZWVkIGxpbnV4LW5leHQgYXMgd2VsbCwgbWFraW5nIHRoZWlyCitjb250ZW50cyB2aXNpYmxlIHRvIHRoZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYXMgYSB3aG9sZS4gIEF0IHRoaXMgcG9pbnQsCit0aGVyZSdzIGEgZ29vZCBjaGFuY2UgdGhhdCB5b3Ugd2lsbCBnZXQgbW9yZSBjb21tZW50cyBmcm9tIGEgbmV3IHNldCBvZgorcmV2aWV3ZXJzOyB0aGVzZSBjb21tZW50cyBuZWVkIHRvIGJlIGFuc3dlcmVkIGFzIGluIHRoZSBwcmV2aW91cyByb3VuZC4KKworV2hhdCBtYXkgYWxzbyBoYXBwZW4gYXQgdGhpcyBwb2ludCwgZGVwZW5kaW5nIG9uIHRoZSBuYXR1cmUgb2YgeW91ciBwYXRjaCwKK2lzIHRoYXQgY29uZmxpY3RzIHdpdGggd29yayBiZWluZyBkb25lIGJ5IG90aGVycyB0dXJuIHVwLiAgSW4gdGhlIHdvcnN0CitjYXNlLCBoZWF2eSBwYXRjaCBjb25mbGljdHMgY2FuIHJlc3VsdCBpbiBzb21lIHdvcmsgYmVpbmcgcHV0IG9uIHRoZSBiYWNrCitidXJuZXIgc28gdGhhdCB0aGUgcmVtYWluaW5nIHBhdGNoZXMgY2FuIGJlIHdvcmtlZCBpbnRvIHNoYXBlIGFuZCBtZXJnZWQuCitPdGhlciB0aW1lcywgY29uZmxpY3QgcmVzb2x1dGlvbiB3aWxsIGludm9sdmUgd29ya2luZyB3aXRoIHRoZSBvdGhlcgorZGV2ZWxvcGVycyBhbmQsIHBvc3NpYmx5LCBtb3Zpbmcgc29tZSBwYXRjaGVzIGJldHdlZW4gdHJlZXMgdG8gZW5zdXJlIHRoYXQKK2V2ZXJ5dGhpbmcgYXBwbGllcyBjbGVhbmx5LiAgVGhpcyB3b3JrIGNhbiBiZSBhIHBhaW4sIGJ1dCBjb3VudCB5b3VyCitibGVzc2luZ3M6IGJlZm9yZSB0aGUgYWR2ZW50IG9mIHRoZSBsaW51eC1uZXh0IHRyZWUsIHRoZXNlIGNvbmZsaWN0cyBvZnRlbgorb25seSB0dXJuZWQgdXAgZHVyaW5nIHRoZSBtZXJnZSB3aW5kb3cgYW5kIGhhZCB0byBiZSBhZGRyZXNzZWQgaW4gYSBodXJyeS4KK05vdyB0aGV5IGNhbiBiZSByZXNvbHZlZCBhdCBsZWlzdXJlLCBiZWZvcmUgdGhlIG1lcmdlIHdpbmRvdyBvcGVucy4KKworU29tZSBkYXksIGlmIGFsbCBnb2VzIHdlbGwsIHlvdSdsbCBsb2cgb24gYW5kIHNlZSB0aGF0IHlvdXIgcGF0Y2ggaGFzIGJlZW4KK21lcmdlZCBpbnRvIHRoZSBtYWlubGluZSBrZXJuZWwuICBDb25ncmF0dWxhdGlvbnMhICBPbmNlIHRoZSBjZWxlYnJhdGlvbiBpcworY29tcGxldGUgKGFuZCB5b3UgaGF2ZSBhZGRlZCB5b3Vyc2VsZiB0byB0aGUgTUFJTlRBSU5FUlMgZmlsZSksIHRob3VnaCwgaXQKK2lzIHdvcnRoIHJlbWVtYmVyaW5nIGFuIGltcG9ydGFudCBsaXR0bGUgZmFjdDogdGhlIGpvYiBzdGlsbCBpcyBub3QgZG9uZS4KK01lcmdpbmcgaW50byB0aGUgbWFpbmxpbmUgYnJpbmdzIGl0cyBvd24gY2hhbGxlbmdlcy4KKworVG8gYmVnaW4gd2l0aCwgdGhlIHZpc2liaWxpdHkgb2YgeW91ciBwYXRjaCBoYXMgaW5jcmVhc2VkIHlldCBhZ2Fpbi4gIFRoZXJlCittYXkgYmUgYSBuZXcgcm91bmQgb2YgY29tbWVudHMgZnJvbSBkZXZlbG9wZXJzIHdobyBoYWQgbm90IGJlZW4gYXdhcmUgb2YKK3RoZSBwYXRjaCBiZWZvcmUuICBJdCBtYXkgYmUgdGVtcHRpbmcgdG8gaWdub3JlIHRoZW0sIHNpbmNlIHRoZXJlIGlzIG5vCitsb25nZXIgYW55IHF1ZXN0aW9uIG9mIHlvdXIgY29kZSBiZWluZyBtZXJnZWQuICBSZXNpc3QgdGhhdCB0ZW1wdGF0aW9uLAordGhvdWdoOyB5b3Ugc3RpbGwgbmVlZCB0byBiZSByZXNwb25zaXZlIHRvIGRldmVsb3BlcnMgd2hvIGhhdmUgcXVlc3Rpb25zIG9yCitzdWdnZXN0aW9ucy4KKworTW9yZSBpbXBvcnRhbnRseSwgdGhvdWdoOiBpbmNsdXNpb24gaW50byB0aGUgbWFpbmxpbmUgcHV0cyB5b3VyIGNvZGUgaW50bwordGhlIGhhbmRzIG9mIGEgbXVjaCBsYXJnZXIgZ3JvdXAgb2YgdGVzdGVycy4gIEV2ZW4gaWYgeW91IGhhdmUgY29udHJpYnV0ZWQKK2EgZHJpdmVyIGZvciBoYXJkd2FyZSB3aGljaCBpcyBub3QgeWV0IGF2YWlsYWJsZSwgeW91IHdpbGwgYmUgc3VycHJpc2VkIGJ5Citob3cgbWFueSBwZW9wbGUgd2lsbCBidWlsZCB5b3VyIGNvZGUgaW50byB0aGVpciBrZXJuZWxzLiAgQW5kLCBvZiBjb3Vyc2UsCit3aGVyZSB0aGVyZSBhcmUgdGVzdGVycywgdGhlcmUgd2lsbCBiZSBidWcgcmVwb3J0cy4KKworVGhlIHdvcnN0IHNvcnQgb2YgYnVnIHJlcG9ydHMgYXJlIHJlZ3Jlc3Npb25zLiAgSWYgeW91ciBwYXRjaCBjYXVzZXMgYQorcmVncmVzc2lvbiwgeW91J2xsIGZpbmQgYW4gdW5jb21mb3J0YWJsZSBudW1iZXIgb2YgZXllcyB1cG9uIHlvdTsKK3JlZ3Jlc3Npb25zIG5lZWQgdG8gYmUgZml4ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS4gIElmIHlvdSBhcmUgdW53aWxsaW5nIG9yCit1bmFibGUgdG8gZml4IHRoZSByZWdyZXNzaW9uIChhbmQgbm9ib2R5IGVsc2UgZG9lcyBpdCBmb3IgeW91KSwgeW91ciBwYXRjaAord2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIHJlbW92ZWQgZHVyaW5nIHRoZSBzdGFiaWxpemF0aW9uIHBlcmlvZC4gIEJleW9uZAorbmVnYXRpbmcgYWxsIG9mIHRoZSB3b3JrIHlvdSBoYXZlIGRvbmUgdG8gZ2V0IHlvdXIgcGF0Y2ggaW50byB0aGUgbWFpbmxpbmUsCitoYXZpbmcgYSBwYXRjaCBwdWxsZWQgYXMgdGhlIHJlc3VsdCBvZiBhIGZhaWx1cmUgdG8gZml4IGEgcmVncmVzc2lvbiBjb3VsZAord2VsbCBtYWtlIGl0IGhhcmRlciBmb3IgeW91IHRvIGdldCB3b3JrIG1lcmdlZCBpbiB0aGUgZnV0dXJlLgorCitBZnRlciBhbnkgcmVncmVzc2lvbnMgaGF2ZSBiZWVuIGRlYWx0IHdpdGgsIHRoZXJlIG1heSBiZSBvdGhlciwgb3JkaW5hcnkKK2J1Z3MgdG8gZGVhbCB3aXRoLiAgVGhlIHN0YWJpbGl6YXRpb24gcGVyaW9kIGlzIHlvdXIgYmVzdCBvcHBvcnR1bml0eSB0bworZml4IHRoZXNlIGJ1Z3MgYW5kIGVuc3VyZSB0aGF0IHlvdXIgY29kZSdzIGRlYnV0IGluIGEgbWFpbmxpbmUga2VybmVsCityZWxlYXNlIGlzIGFzIHNvbGlkIGFzIHBvc3NpYmxlLiAgU28sIHBsZWFzZSwgYW5zd2VyIGJ1ZyByZXBvcnRzLCBhbmQgZml4Cit0aGUgcHJvYmxlbXMgaWYgYXQgYWxsIHBvc3NpYmxlLiAgVGhhdCdzIHdoYXQgdGhlIHN0YWJpbGl6YXRpb24gcGVyaW9kIGlzCitmb3I7IHlvdSBjYW4gc3RhcnQgY3JlYXRpbmcgY29vbCBuZXcgcGF0Y2hlcyBvbmNlIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBvbGQKK29uZXMgaGF2ZSBiZWVuIHRha2VuIGNhcmUgb2YuCisKK0FuZCBkb24ndCBmb3JnZXQgdGhhdCB0aGVyZSBhcmUgb3RoZXIgbWlsZXN0b25lcyB3aGljaCBtYXkgYWxzbyBjcmVhdGUgYnVnCityZXBvcnRzOiB0aGUgbmV4dCBtYWlubGluZSBzdGFibGUgcmVsZWFzZSwgd2hlbiBwcm9taW5lbnQgZGlzdHJpYnV0b3JzIHBpY2sKK3VwIGEgdmVyc2lvbiBvZiB0aGUga2VybmVsIGNvbnRhaW5pbmcgeW91ciBwYXRjaCwgZXRjLiAgQ29udGludWluZyB0bworcmVzcG9uZCB0byB0aGVzZSByZXBvcnRzIGlzIGEgbWF0dGVyIG9mIGJhc2ljIHByaWRlIGluIHlvdXIgd29yay4gIElmIHRoYXQKK2lzIGluc3VmZmljaWVudCBtb3RpdmF0aW9uLCB0aG91Z2gsIGl0J3MgYWxzbyB3b3J0aCBjb25zaWRlcmluZyB0aGF0IHRoZQorZGV2ZWxvcG1lbnQgY29tbXVuaXR5IHJlbWVtYmVycyBkZXZlbG9wZXJzIHdobyBsb3NlIGludGVyZXN0IGluIHRoZWlyIGNvZGUKK2FmdGVyIGl0J3MgbWVyZ2VkLiAgVGhlIG5leHQgdGltZSB5b3UgcG9zdCBhIHBhdGNoLCB0aGV5IHdpbGwgYmUgZXZhbHVhdGluZworaXQgd2l0aCB0aGUgYXNzdW1wdGlvbiB0aGF0IHlvdSB3aWxsIG5vdCBiZSBhcm91bmQgdG8gbWFpbnRhaW4gaXQKK2FmdGVyd2FyZC4KKworCitPdGhlciB0aGluZ3MgdGhhdCBjYW4gaGFwcGVuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPbmUgZGF5LCB5b3UgbWF5IG9wZW4geW91ciBtYWlsIGNsaWVudCBhbmQgc2VlIHRoYXQgc29tZWJvZHkgaGFzIG1haWxlZCB5b3UKK2EgcGF0Y2ggdG8geW91ciBjb2RlLiAgVGhhdCBpcyBvbmUgb2YgdGhlIGFkdmFudGFnZXMgb2YgaGF2aW5nIHlvdXIgY29kZQorb3V0IHRoZXJlIGluIHRoZSBvcGVuLCBhZnRlciBhbGwuICBJZiB5b3UgYWdyZWUgd2l0aCB0aGUgcGF0Y2gsIHlvdSBjYW4KK2VpdGhlciBmb3J3YXJkIGl0IG9uIHRvIHRoZSBzdWJzeXN0ZW0gbWFpbnRhaW5lciAoYmUgc3VyZSB0byBpbmNsdWRlIGEKK3Byb3BlciBGcm9tOiBsaW5lIHNvIHRoYXQgdGhlIGF0dHJpYnV0aW9uIGlzIGNvcnJlY3QsIGFuZCBhZGQgYSBzaWdub2ZmIG9mCit5b3VyIG93biksIG9yIHNlbmQgYW4gQWNrZWQtYnk6IHJlc3BvbnNlIGJhY2sgYW5kIGxldCB0aGUgb3JpZ2luYWwgcG9zdGVyCitzZW5kIGl0IHVwd2FyZC4KKworSWYgeW91IGRpc2FncmVlIHdpdGggdGhlIHBhdGNoLCBzZW5kIGEgcG9saXRlIHJlc3BvbnNlIGV4cGxhaW5pbmcgd2h5LiAgSWYKK3Bvc3NpYmxlLCB0ZWxsIHRoZSBhdXRob3Igd2hhdCBjaGFuZ2VzIG5lZWQgdG8gYmUgbWFkZSB0byBtYWtlIHRoZSBwYXRjaAorYWNjZXB0YWJsZSB0byB5b3UuICBUaGVyZSBpcyBhIGNlcnRhaW4gcmVzaXN0YW5jZSB0byBtZXJnaW5nIHBhdGNoZXMgd2hpY2gKK2FyZSBvcHBvc2VkIGJ5IHRoZSBhdXRob3IgYW5kIG1haW50YWluZXIgb2YgdGhlIGNvZGUsIGJ1dCBpdCBvbmx5IGdvZXMgc28KK2Zhci4gIElmIHlvdSBhcmUgc2VlbiBhcyBuZWVkbGVzc2x5IGJsb2NraW5nIGdvb2Qgd29yaywgdGhvc2UgcGF0Y2hlcyB3aWxsCitldmVudHVhbGx5IGZsb3cgYXJvdW5kIHlvdSBhbmQgZ2V0IGludG8gdGhlIG1haW5saW5lIGFueXdheS4gIEluIHRoZSBMaW51eAora2VybmVsLCBub2JvZHkgaGFzIGFic29sdXRlIHZldG8gcG93ZXIgb3ZlciBhbnkgY29kZS4gIEV4Y2VwdCBtYXliZSBMaW51cy4KKworT24gdmVyeSByYXJlIG9jY2FzaW9uLCB5b3UgbWF5IHNlZSBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQ6IGFub3RoZXIKK2RldmVsb3BlciBwb3N0cyBhIGRpZmZlcmVudCBzb2x1dGlvbiB0byB5b3VyIHByb2JsZW0uICBBdCB0aGF0IHBvaW50LAorY2hhbmNlcyBhcmUgdGhhdCBvbmUgb2YgdGhlIHR3byBwYXRjaGVzIHdpbGwgbm90IGJlIG1lcmdlZCwgYW5kICJtaW5lIHdhcworaGVyZSBmaXJzdCIgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgYSBjb21wZWxsaW5nIHRlY2huaWNhbCBhcmd1bWVudC4gIElmCitzb21lYm9keSBlbHNlJ3MgcGF0Y2ggZGlzcGxhY2VzIHlvdXJzIGFuZCBnZXRzIGludG8gdGhlIG1haW5saW5lLCB0aGVyZSBpcworcmVhbGx5IG9ubHkgb25lIHdheSB0byByZXNwb25kOiBiZSBwbGVhc2VkIHRoYXQgeW91ciBwcm9ibGVtIGdvdCBzb2x2ZWQgYW5kCitnZXQgb24gd2l0aCB5b3VyIHdvcmsuICBIYXZpbmcgb25lJ3Mgd29yayBzaG92ZWQgYXNpZGUgaW4gdGhpcyBtYW5uZXIgY2FuCitiZSBodXJ0ZnVsIGFuZCBkaXNjb3VyYWdpbmcsIGJ1dCB0aGUgY29tbXVuaXR5IHdpbGwgcmVtZW1iZXIgeW91ciByZWFjdGlvbgorbG9uZyBhZnRlciB0aGV5IGhhdmUgZm9yZ290dGVuIHdob3NlIHBhdGNoIGFjdHVhbGx5IGdvdCBtZXJnZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNy5BZHZhbmNlZFRvcGljcyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy83LkFkdmFuY2VkVG9waWNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmRjM2ZhLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy83LkFkdmFuY2VkVG9waWNzCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLTc6IEFEVkFOQ0VEIFRPUElDUwotCi1BdCB0aGlzIHBvaW50LCBob3BlZnVsbHksIHlvdSBoYXZlIGEgaGFuZGxlIG9uIGhvdyB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcwotd29ya3MuICBUaGVyZSBpcyBzdGlsbCBtb3JlIHRvIGxlYXJuLCBob3dldmVyISAgVGhpcyBzZWN0aW9uIHdpbGwgY292ZXIgYQotbnVtYmVyIG9mIHRvcGljcyB3aGljaCBjYW4gYmUgaGVscGZ1bCBmb3IgZGV2ZWxvcGVycyB3YW50aW5nIHRvIGJlY29tZSBhCi1yZWd1bGFyIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzLgotCi03LjE6IE1BTkFHSU5HIFBBVENIRVMgV0lUSCBHSVQKLQotVGhlIHVzZSBvZiBkaXN0cmlidXRlZCB2ZXJzaW9uIGNvbnRyb2wgZm9yIHRoZSBrZXJuZWwgYmVnYW4gaW4gZWFybHkgMjAwMiwKLXdoZW4gTGludXMgZmlyc3Qgc3RhcnRlZCBwbGF5aW5nIHdpdGggdGhlIHByb3ByaWV0YXJ5IEJpdEtlZXBlcgotYXBwbGljYXRpb24uICBXaGlsZSBCaXRLZWVwZXIgd2FzIGNvbnRyb3ZlcnNpYWwsIHRoZSBhcHByb2FjaCB0byBzb2Z0d2FyZQotdmVyc2lvbiBtYW5hZ2VtZW50IGl0IGVtYm9kaWVkIG1vc3QgY2VydGFpbmx5IHdhcyBub3QuICBEaXN0cmlidXRlZCB2ZXJzaW9uCi1jb250cm9sIGVuYWJsZWQgYW4gaW1tZWRpYXRlIGFjY2VsZXJhdGlvbiBvZiB0aGUga2VybmVsIGRldmVsb3BtZW50Ci1wcm9qZWN0LiAgSW4gY3VycmVudCB0aW1lcywgdGhlcmUgYXJlIHNldmVyYWwgZnJlZSBhbHRlcm5hdGl2ZXMgdG8KLUJpdEtlZXBlci4gIEZvciBiZXR0ZXIgb3IgZm9yIHdvcnNlLCB0aGUga2VybmVsIHByb2plY3QgaGFzIHNldHRsZWQgb24gZ2l0Ci1hcyBpdHMgdG9vbCBvZiBjaG9pY2UuCi0KLU1hbmFnaW5nIHBhdGNoZXMgd2l0aCBnaXQgY2FuIG1ha2UgbGlmZSBtdWNoIGVhc2llciBmb3IgdGhlIGRldmVsb3BlciwKLWVzcGVjaWFsbHkgYXMgdGhlIHZvbHVtZSBvZiB0aG9zZSBwYXRjaGVzIGdyb3dzLiAgR2l0IGFsc28gaGFzIGl0cyByb3VnaAotZWRnZXMgYW5kIHBvc2VzIGNlcnRhaW4gaGF6YXJkczsgaXQgaXMgYSB5b3VuZyBhbmQgcG93ZXJmdWwgdG9vbCB3aGljaCBpcwotc3RpbGwgYmVpbmcgY2l2aWxpemVkIGJ5IGl0cyBkZXZlbG9wZXJzLiAgVGhpcyBkb2N1bWVudCB3aWxsIG5vdCBhdHRlbXB0IHRvCi10ZWFjaCB0aGUgcmVhZGVyIGhvdyB0byB1c2UgZ2l0OyB0aGF0IHdvdWxkIGJlIHN1ZmZpY2llbnQgbWF0ZXJpYWwgZm9yIGEKLWxvbmcgZG9jdW1lbnQgaW4gaXRzIG93biByaWdodC4gIEluc3RlYWQsIHRoZSBmb2N1cyBoZXJlIHdpbGwgYmUgb24gaG93IGdpdAotZml0cyBpbnRvIHRoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBpbiBwYXJ0aWN1bGFyLiAgRGV2ZWxvcGVycyB3aG8KLXdpc2ggdG8gY29tZSB1cCB0byBzcGVlZCB3aXRoIGdpdCB3aWxsIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhdDoKLQotCWh0dHA6Ly9naXQtc2NtLmNvbS8KLQotCWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzL3VzZXItbWFudWFsLmh0bWwKLQotYW5kIG9uIHZhcmlvdXMgdHV0b3JpYWxzIGZvdW5kIG9uIHRoZSB3ZWIuCi0KLVRoZSBmaXJzdCBvcmRlciBvZiBidXNpbmVzcyBpcyB0byByZWFkIHRoZSBhYm92ZSBzaXRlcyBhbmQgZ2V0IGEgc29saWQKLXVuZGVyc3RhbmRpbmcgb2YgaG93IGdpdCB3b3JrcyBiZWZvcmUgdHJ5aW5nIHRvIHVzZSBpdCB0byBtYWtlIHBhdGNoZXMKLWF2YWlsYWJsZSB0byBvdGhlcnMuICBBIGdpdC11c2luZyBkZXZlbG9wZXIgc2hvdWxkIGJlIGFibGUgdG8gb2J0YWluIGEgY29weQotb2YgdGhlIG1haW5saW5lIHJlcG9zaXRvcnksIGV4cGxvcmUgdGhlIHJldmlzaW9uIGhpc3RvcnksIGNvbW1pdCBjaGFuZ2VzIHRvCi10aGUgdHJlZSwgdXNlIGJyYW5jaGVzLCBldGMuICBBbiB1bmRlcnN0YW5kaW5nIG9mIGdpdCdzIHRvb2xzIGZvciB0aGUKLXJld3JpdGluZyBvZiBoaXN0b3J5IChzdWNoIGFzIHJlYmFzZSkgaXMgYWxzbyB1c2VmdWwuICBHaXQgY29tZXMgd2l0aCBpdHMKLW93biB0ZXJtaW5vbG9neSBhbmQgY29uY2VwdHM7IGEgbmV3IHVzZXIgb2YgZ2l0IHNob3VsZCBrbm93IGFib3V0IHJlZnMsCi1yZW1vdGUgYnJhbmNoZXMsIHRoZSBpbmRleCwgZmFzdC1mb3J3YXJkIG1lcmdlcywgcHVzaGVzIGFuZCBwdWxscywgZGV0YWNoZWQKLWhlYWRzLCBldGMuICBJdCBjYW4gYWxsIGJlIGEgbGl0dGxlIGludGltaWRhdGluZyBhdCB0aGUgb3V0c2V0LCBidXQgdGhlCi1jb25jZXB0cyBhcmUgbm90IHRoYXQgaGFyZCB0byBncmFzcCB3aXRoIGEgYml0IG9mIHN0dWR5LgotCi1Vc2luZyBnaXQgdG8gZ2VuZXJhdGUgcGF0Y2hlcyBmb3Igc3VibWlzc2lvbiBieSBlbWFpbCBjYW4gYmUgYSBnb29kCi1leGVyY2lzZSB3aGlsZSBjb21pbmcgdXAgdG8gc3BlZWQuCi0KLVdoZW4geW91IGFyZSByZWFkeSB0byBzdGFydCBwdXR0aW5nIHVwIGdpdCB0cmVlcyBmb3Igb3RoZXJzIHRvIGxvb2sgYXQsIHlvdQotd2lsbCwgb2YgY291cnNlLCBuZWVkIGEgc2VydmVyIHRoYXQgY2FuIGJlIHB1bGxlZCBmcm9tLiAgU2V0dGluZyB1cCBzdWNoIGEKLXNlcnZlciB3aXRoIGdpdC1kYWVtb24gaXMgcmVsYXRpdmVseSBzdHJhaWdodGZvcndhcmQgaWYgeW91IGhhdmUgYSBzeXN0ZW0KLXdoaWNoIGlzIGFjY2Vzc2libGUgdG8gdGhlIEludGVybmV0LiAgT3RoZXJ3aXNlLCBmcmVlLCBwdWJsaWMgaG9zdGluZyBzaXRlcwotKEdpdGh1YiwgZm9yIGV4YW1wbGUpIGFyZSBzdGFydGluZyB0byBhcHBlYXIgb24gdGhlIG5ldC4gIEVzdGFibGlzaGVkCi1kZXZlbG9wZXJzIGNhbiBnZXQgYW4gYWNjb3VudCBvbiBrZXJuZWwub3JnLCBidXQgdGhvc2UgYXJlIG5vdCBlYXN5IHRvIGNvbWUKLWJ5OyBzZWUgaHR0cDovL2tlcm5lbC5vcmcvZmFxLyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotVGhlIG5vcm1hbCBnaXQgd29ya2Zsb3cgaW52b2x2ZXMgdGhlIHVzZSBvZiBhIGxvdCBvZiBicmFuY2hlcy4gIEVhY2ggbGluZQotb2YgZGV2ZWxvcG1lbnQgY2FuIGJlIHNlcGFyYXRlZCBpbnRvIGEgc2VwYXJhdGUgInRvcGljIGJyYW5jaCIgYW5kCi1tYWludGFpbmVkIGluZGVwZW5kZW50bHkuICBCcmFuY2hlcyBpbiBnaXQgYXJlIGNoZWFwLCB0aGVyZSBpcyBubyByZWFzb24gdG8KLW5vdCBtYWtlIGZyZWUgdXNlIG9mIHRoZW0uICBBbmQsIGluIGFueSBjYXNlLCB5b3Ugc2hvdWxkIG5vdCBkbyB5b3VyCi1kZXZlbG9wbWVudCBpbiBhbnkgYnJhbmNoIHdoaWNoIHlvdSBpbnRlbmQgdG8gYXNrIG90aGVycyB0byBwdWxsIGZyb20uCi1QdWJsaWNseS1hdmFpbGFibGUgYnJhbmNoZXMgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aCBjYXJlOyBtZXJnZSBpbiBwYXRjaGVzCi1mcm9tIGRldmVsb3BtZW50IGJyYW5jaGVzIHdoZW4gdGhleSBhcmUgaW4gY29tcGxldGUgZm9ybSBhbmQgcmVhZHkgdG8gZ28gLQotbm90IGJlZm9yZS4KLQotR2l0IHByb3ZpZGVzIHNvbWUgcG93ZXJmdWwgdG9vbHMgd2hpY2ggY2FuIGFsbG93IHlvdSB0byByZXdyaXRlIHlvdXIKLWRldmVsb3BtZW50IGhpc3RvcnkuICBBbiBpbmNvbnZlbmllbnQgcGF0Y2ggKG9uZSB3aGljaCBicmVha3MgYmlzZWN0aW9uLAotc2F5LCBvciB3aGljaCBoYXMgc29tZSBvdGhlciBzb3J0IG9mIG9idmlvdXMgYnVnKSBjYW4gYmUgZml4ZWQgaW4gcGxhY2Ugb3IKLW1hZGUgdG8gZGlzYXBwZWFyIGZyb20gdGhlIGhpc3RvcnkgZW50aXJlbHkuICBBIHBhdGNoIHNlcmllcyBjYW4gYmUKLXJld3JpdHRlbiBhcyBpZiBpdCBoYWQgYmVlbiB3cml0dGVuIG9uIHRvcCBvZiB0b2RheSdzIG1haW5saW5lLCBldmVuIHRob3VnaAoteW91IGhhdmUgYmVlbiB3b3JraW5nIG9uIGl0IGZvciBtb250aHMuICBDaGFuZ2VzIGNhbiBiZSB0cmFuc3BhcmVudGx5Ci1zaGlmdGVkIGZyb20gb25lIGJyYW5jaCB0byBhbm90aGVyLiAgQW5kIHNvIG9uLiAgSnVkaWNpb3VzIHVzZSBvZiBnaXQncwotYWJpbGl0eSB0byByZXZpc2UgaGlzdG9yeSBjYW4gaGVscCBpbiB0aGUgY3JlYXRpb24gb2YgY2xlYW4gcGF0Y2ggc2V0cyB3aXRoCi1mZXdlciBwcm9ibGVtcy4KLQotRXhjZXNzaXZlIHVzZSBvZiB0aGlzIGNhcGFiaWxpdHkgY2FuIGxlYWQgdG8gb3RoZXIgcHJvYmxlbXMsIHRob3VnaCwgYmV5b25kCi1hIHNpbXBsZSBvYnNlc3Npb24gZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgcGVyZmVjdCBwcm9qZWN0IGhpc3RvcnkuCi1SZXdyaXRpbmcgaGlzdG9yeSB3aWxsIHJld3JpdGUgdGhlIGNoYW5nZXMgY29udGFpbmVkIGluIHRoYXQgaGlzdG9yeSwKLXR1cm5pbmcgYSB0ZXN0ZWQgKGhvcGVmdWxseSkga2VybmVsIHRyZWUgaW50byBhbiB1bnRlc3RlZCBvbmUuICBCdXQsIGJleW9uZAotdGhhdCwgZGV2ZWxvcGVycyBjYW5ub3QgZWFzaWx5IGNvbGxhYm9yYXRlIGlmIHRoZXkgZG8gbm90IGhhdmUgYSBzaGFyZWQKLXZpZXcgb2YgdGhlIHByb2plY3QgaGlzdG9yeTsgaWYgeW91IHJld3JpdGUgaGlzdG9yeSB3aGljaCBvdGhlciBkZXZlbG9wZXJzCi1oYXZlIHB1bGxlZCBpbnRvIHRoZWlyIHJlcG9zaXRvcmllcywgeW91IHdpbGwgbWFrZSBsaWZlIG11Y2ggbW9yZSBkaWZmaWN1bHQKLWZvciB0aG9zZSBkZXZlbG9wZXJzLiAgU28gYSBzaW1wbGUgcnVsZSBvZiB0aHVtYiBhcHBsaWVzIGhlcmU6IGhpc3RvcnkKLXdoaWNoIGhhcyBiZWVuIGV4cG9ydGVkIHRvIG90aGVycyBzaG91bGQgZ2VuZXJhbGx5IGJlIHNlZW4gYXMgaW1tdXRhYmxlCi10aGVyZWFmdGVyLgotCi1Tbywgb25jZSB5b3UgcHVzaCBhIHNldCBvZiBjaGFuZ2VzIHRvIHlvdXIgcHVibGljbHktYXZhaWxhYmxlIHNlcnZlciwgdGhvc2UKLWNoYW5nZXMgc2hvdWxkIG5vdCBiZSByZXdyaXR0ZW4uICBHaXQgd2lsbCBhdHRlbXB0IHRvIGVuZm9yY2UgdGhpcyBydWxlIGlmCi15b3UgdHJ5IHRvIHB1c2ggY2hhbmdlcyB3aGljaCBkbyBub3QgcmVzdWx0IGluIGEgZmFzdC1mb3J3YXJkIG1lcmdlCi0oaS5lLiBjaGFuZ2VzIHdoaWNoIGRvIG5vdCBzaGFyZSB0aGUgc2FtZSBoaXN0b3J5KS4gIEl0IGlzIHBvc3NpYmxlIHRvCi1vdmVycmlkZSB0aGlzIGNoZWNrLCBhbmQgdGhlcmUgbWF5IGJlIHRpbWVzIHdoZW4gaXQgaXMgbmVjZXNzYXJ5IHRvIHJld3JpdGUKLWFuIGV4cG9ydGVkIHRyZWUuICBNb3ZpbmcgY2hhbmdlc2V0cyBiZXR3ZWVuIHRyZWVzIHRvIGF2b2lkIGNvbmZsaWN0cyBpbgotbGludXgtbmV4dCBpcyBvbmUgZXhhbXBsZS4gIEJ1dCBzdWNoIGFjdGlvbnMgc2hvdWxkIGJlIHJhcmUuICBUaGlzIGlzIG9uZQotb2YgdGhlIHJlYXNvbnMgd2h5IGRldmVsb3BtZW50IHNob3VsZCBiZSBkb25lIGluIHByaXZhdGUgYnJhbmNoZXMgKHdoaWNoCi1jYW4gYmUgcmV3cml0dGVuIGlmIG5lY2Vzc2FyeSkgYW5kIG9ubHkgbW92ZWQgaW50byBwdWJsaWMgYnJhbmNoZXMgd2hlbgotaXQncyBpbiBhIHJlYXNvbmFibHkgYWR2YW5jZWQgc3RhdGUuCi0KLUFzIHRoZSBtYWlubGluZSAob3Igb3RoZXIgdHJlZSB1cG9uIHdoaWNoIGEgc2V0IG9mIGNoYW5nZXMgaXMgYmFzZWQpCi1hZHZhbmNlcywgaXQgaXMgdGVtcHRpbmcgdG8gbWVyZ2Ugd2l0aCB0aGF0IHRyZWUgdG8gc3RheSBvbiB0aGUgbGVhZGluZwotZWRnZS4gIEZvciBhIHByaXZhdGUgYnJhbmNoLCByZWJhc2luZyBjYW4gYmUgYW4gZWFzeSB3YXkgdG8ga2VlcCB1cCB3aXRoCi1hbm90aGVyIHRyZWUsIGJ1dCByZWJhc2luZyBpcyBub3QgYW4gb3B0aW9uIG9uY2UgYSB0cmVlIGlzIGV4cG9ydGVkIHRvIHRoZQotd29ybGQuICBPbmNlIHRoYXQgaGFwcGVucywgYSBmdWxsIG1lcmdlIG11c3QgYmUgZG9uZS4gIE1lcmdpbmcgb2NjYXNpb25hbGx5Ci1tYWtlcyBnb29kIHNlbnNlLCBidXQgb3Zlcmx5IGZyZXF1ZW50IG1lcmdlcyBjYW4gY2x1dHRlciB0aGUgaGlzdG9yeQotbmVlZGxlc3NseS4gIFN1Z2dlc3RlZCB0ZWNobmlxdWUgaW4gdGhpcyBjYXNlIGlzIHRvIG1lcmdlIGluZnJlcXVlbnRseSwgYW5kCi1nZW5lcmFsbHkgb25seSBhdCBzcGVjaWZpYyByZWxlYXNlIHBvaW50cyAoc3VjaCBhcyBhIG1haW5saW5lIC1yYwotcmVsZWFzZSkuICBJZiB5b3UgYXJlIG5lcnZvdXMgYWJvdXQgc3BlY2lmaWMgY2hhbmdlcywgeW91IGNhbiBhbHdheXMKLXBlcmZvcm0gdGVzdCBtZXJnZXMgaW4gYSBwcml2YXRlIGJyYW5jaC4gIFRoZSBnaXQgInJlcmVyZSIgdG9vbCBjYW4gYmUKLXVzZWZ1bCBpbiBzdWNoIHNpdHVhdGlvbnM7IGl0IHJlbWVtYmVycyBob3cgbWVyZ2UgY29uZmxpY3RzIHdlcmUgcmVzb2x2ZWQKLXNvIHRoYXQgeW91IGRvbid0IGhhdmUgdG8gZG8gdGhlIHNhbWUgd29yayB0d2ljZS4KLQotT25lIG9mIHRoZSBiaWdnZXN0IHJlY3VycmluZyBjb21wbGFpbnRzIGFib3V0IHRvb2xzIGxpa2UgZ2l0IGlzIHRoaXM6IHRoZQotbWFzcyBtb3ZlbWVudCBvZiBwYXRjaGVzIGZyb20gb25lIHJlcG9zaXRvcnkgdG8gYW5vdGhlciBtYWtlcyBpdCBlYXN5IHRvCi1zbGlwIGluIGlsbC1hZHZpc2VkIGNoYW5nZXMgd2hpY2ggZ28gaW50byB0aGUgbWFpbmxpbmUgYmVsb3cgdGhlIHJldmlldwotcmFkYXIuICBLZXJuZWwgZGV2ZWxvcGVycyB0ZW5kIHRvIGdldCB1bmhhcHB5IHdoZW4gdGhleSBzZWUgdGhhdCBraW5kIG9mCi10aGluZyBoYXBwZW5pbmc7IHB1dHRpbmcgdXAgYSBnaXQgdHJlZSB3aXRoIHVucmV2aWV3ZWQgb3Igb2ZmLXRvcGljIHBhdGNoZXMKLWNhbiBhZmZlY3QgeW91ciBhYmlsaXR5IHRvIGdldCB0cmVlcyBwdWxsZWQgaW4gdGhlIGZ1dHVyZS4gIFF1b3RpbmcgTGludXM6Ci0KLQlZb3UgY2FuIHNlbmQgbWUgcGF0Y2hlcywgYnV0IGZvciBtZSB0byBwdWxsIGEgZ2l0IHBhdGNoIGZyb20geW91LCBJCi0JbmVlZCB0byBrbm93IHRoYXQgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcsIGFuZCBJIG5lZWQgdG8gYmUgYWJsZQotCXRvIHRydXN0IHRoaW5ncyAqd2l0aG91dCogdGhlbiBoYXZpbmcgdG8gZ28gYW5kIGNoZWNrIGV2ZXJ5Ci0JaW5kaXZpZHVhbCBjaGFuZ2UgYnkgaGFuZC4KLQotKGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzIyNDEzNS8pLgotCi1UbyBhdm9pZCB0aGlzIGtpbmQgb2Ygc2l0dWF0aW9uLCBlbnN1cmUgdGhhdCBhbGwgcGF0Y2hlcyB3aXRoaW4gYSBnaXZlbgotYnJhbmNoIHN0aWNrIGNsb3NlbHkgdG8gdGhlIGFzc29jaWF0ZWQgdG9waWM7IGEgImRyaXZlciBmaXhlcyIgYnJhbmNoCi1zaG91bGQgbm90IGJlIG1ha2luZyBjaGFuZ2VzIHRvIHRoZSBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGNvZGUuICBBbmQsIG1vc3QKLWltcG9ydGFudGx5LCBkbyBub3QgdXNlIGEgZ2l0IHRyZWUgdG8gYnlwYXNzIHRoZSByZXZpZXcgcHJvY2Vzcy4gIFBvc3QgYW4KLW9jY2FzaW9uYWwgc3VtbWFyeSBvZiB0aGUgdHJlZSB0byB0aGUgcmVsZXZhbnQgbGlzdCwgYW5kLCB3aGVuIHRoZSB0aW1lIGlzCi1yaWdodCwgcmVxdWVzdCB0aGF0IHRoZSB0cmVlIGJlIGluY2x1ZGVkIGluIGxpbnV4LW5leHQuCi0KLUlmIGFuZCB3aGVuIG90aGVycyBzdGFydCB0byBzZW5kIHBhdGNoZXMgZm9yIGluY2x1c2lvbiBpbnRvIHlvdXIgdHJlZSwKLWRvbid0IGZvcmdldCB0byByZXZpZXcgdGhlbS4gIEFsc28gZW5zdXJlIHRoYXQgeW91IG1haW50YWluIHRoZSBjb3JyZWN0Ci1hdXRob3JzaGlwIGluZm9ybWF0aW9uOyB0aGUgZ2l0ICJhbSIgdG9vbCBkb2VzIGl0cyBiZXN0IGluIHRoaXMgcmVnYXJkLCBidXQKLXlvdSBtYXkgaGF2ZSB0byBhZGQgYSAiRnJvbToiIGxpbmUgdG8gdGhlIHBhdGNoIGlmIGl0IGhhcyBiZWVuIHJlbGF5ZWQgdG8KLXlvdSB2aWEgYSB0aGlyZCBwYXJ0eS4KLQotV2hlbiByZXF1ZXN0aW5nIGEgcHVsbCwgYmUgc3VyZSB0byBnaXZlIGFsbCB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb246IHdoZXJlCi15b3VyIHRyZWUgaXMsIHdoYXQgYnJhbmNoIHRvIHB1bGwsIGFuZCB3aGF0IGNoYW5nZXMgd2lsbCByZXN1bHQgZnJvbSB0aGUKLXB1bGwuICBUaGUgZ2l0IHJlcXVlc3QtcHVsbCBjb21tYW5kIGNhbiBiZSBoZWxwZnVsIGluIHRoaXMgcmVnYXJkOyBpdCB3aWxsCi1mb3JtYXQgdGhlIHJlcXVlc3QgYXMgb3RoZXIgZGV2ZWxvcGVycyBleHBlY3QsIGFuZCB3aWxsIGFsc28gY2hlY2sgdG8gYmUKLXN1cmUgdGhhdCB5b3UgaGF2ZSByZW1lbWJlcmVkIHRvIHB1c2ggdGhvc2UgY2hhbmdlcyB0byB0aGUgcHVibGljIHNlcnZlci4KLQotCi03LjI6IFJFVklFV0lORyBQQVRDSEVTCi0KLVNvbWUgcmVhZGVycyB3aWxsIGNlcnRhaW5seSBvYmplY3QgdG8gcHV0dGluZyB0aGlzIHNlY3Rpb24gd2l0aCAiYWR2YW5jZWQKLXRvcGljcyIgb24gdGhlIGdyb3VuZHMgdGhhdCBldmVuIGJlZ2lubmluZyBrZXJuZWwgZGV2ZWxvcGVycyBzaG91bGQgYmUKLXJldmlld2luZyBwYXRjaGVzLiAgSXQgaXMgY2VydGFpbmx5IHRydWUgdGhhdCB0aGVyZSBpcyBubyBiZXR0ZXIgd2F5IHRvCi1sZWFybiBob3cgdG8gcHJvZ3JhbSBpbiB0aGUga2VybmVsIGVudmlyb25tZW50IHRoYW4gYnkgbG9va2luZyBhdCBjb2RlCi1wb3N0ZWQgYnkgb3RoZXJzLiAgSW4gYWRkaXRpb24sIHJldmlld2VycyBhcmUgZm9yZXZlciBpbiBzaG9ydCBzdXBwbHk7IGJ5Ci1sb29raW5nIGF0IGNvZGUgeW91IGNhbiBtYWtlIGEgc2lnbmlmaWNhbnQgY29udHJpYnV0aW9uIHRvIHRoZSBwcm9jZXNzIGFzIGEKLXdob2xlLgotCi1SZXZpZXdpbmcgY29kZSBjYW4gYmUgYW4gaW50aW1pZGF0aW5nIHByb3NwZWN0LCBlc3BlY2lhbGx5IGZvciBhIG5ldyBrZXJuZWwKLWRldmVsb3BlciB3aG8gbWF5IHdlbGwgZmVlbCBuZXJ2b3VzIGFib3V0IHF1ZXN0aW9uaW5nIGNvZGUgLSBpbiBwdWJsaWMgLQotd2hpY2ggaGFzIGJlZW4gcG9zdGVkIGJ5IHRob3NlIHdpdGggbW9yZSBleHBlcmllbmNlLiAgRXZlbiBjb2RlIHdyaXR0ZW4gYnkKLXRoZSBtb3N0IGV4cGVyaWVuY2VkIGRldmVsb3BlcnMgY2FuIGJlIGltcHJvdmVkLCB0aG91Z2guICBQZXJoYXBzIHRoZSBiZXN0Ci1waWVjZSBvZiBhZHZpY2UgZm9yIHJldmlld2VycyAoYWxsIHJldmlld2VycykgaXMgdGhpczogcGhyYXNlIHJldmlldwotY29tbWVudHMgYXMgcXVlc3Rpb25zIHJhdGhlciB0aGFuIGNyaXRpY2lzbXMuICBBc2tpbmcgImhvdyBkb2VzIHRoZSBsb2NrCi1nZXQgcmVsZWFzZWQgaW4gdGhpcyBwYXRoPyIgd2lsbCBhbHdheXMgd29yayBiZXR0ZXIgdGhhbiBzdGF0aW5nICJ0aGUKLWxvY2tpbmcgaGVyZSBpcyB3cm9uZy4iCi0KLURpZmZlcmVudCBkZXZlbG9wZXJzIHdpbGwgcmV2aWV3IGNvZGUgZnJvbSBkaWZmZXJlbnQgcG9pbnRzIG9mIHZpZXcuICBTb21lCi1hcmUgbW9zdGx5IGNvbmNlcm5lZCB3aXRoIGNvZGluZyBzdHlsZSBhbmQgd2hldGhlciBjb2RlIGxpbmVzIGhhdmUgdHJhaWxpbmcKLXdoaXRlIHNwYWNlLiAgT3RoZXJzIHdpbGwgZm9jdXMgcHJpbWFyaWx5IG9uIHdoZXRoZXIgdGhlIGNoYW5nZSBpbXBsZW1lbnRlZAotYnkgdGhlIHBhdGNoIGFzIGEgd2hvbGUgaXMgYSBnb29kIHRoaW5nIGZvciB0aGUga2VybmVsIG9yIG5vdC4gIFlldCBvdGhlcnMKLXdpbGwgY2hlY2sgZm9yIHByb2JsZW1hdGljIGxvY2tpbmcsIGV4Y2Vzc2l2ZSBzdGFjayB1c2FnZSwgcG9zc2libGUKLXNlY3VyaXR5IGlzc3VlcywgZHVwbGljYXRpb24gb2YgY29kZSBmb3VuZCBlbHNld2hlcmUsIGFkZXF1YXRlCi1kb2N1bWVudGF0aW9uLCBhZHZlcnNlIGVmZmVjdHMgb24gcGVyZm9ybWFuY2UsIHVzZXItc3BhY2UgQUJJIGNoYW5nZXMsIGV0Yy4KLUFsbCB0eXBlcyBvZiByZXZpZXcsIGlmIHRoZXkgbGVhZCB0byBiZXR0ZXIgY29kZSBnb2luZyBpbnRvIHRoZSBrZXJuZWwsIGFyZQotd2VsY29tZSBhbmQgd29ydGh3aGlsZS4KLQotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNy5BZHZhbmNlZFRvcGljcy5yc3QgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvNy5BZHZhbmNlZFRvcGljcy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkNjFjNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy83LkFkdmFuY2VkVG9waWNzLnJzdApAQCAtMCwwICsxLDE4MCBAQAorLi4gX2RldmVsb3BtZW50X2FkdmFuY2VkdG9waWNzOgorCitBZHZhbmNlZCB0b3BpY3MKKz09PT09PT09PT09PT09PQorCitBdCB0aGlzIHBvaW50LCBob3BlZnVsbHksIHlvdSBoYXZlIGEgaGFuZGxlIG9uIGhvdyB0aGUgZGV2ZWxvcG1lbnQgcHJvY2Vzcword29ya3MuICBUaGVyZSBpcyBzdGlsbCBtb3JlIHRvIGxlYXJuLCBob3dldmVyISAgVGhpcyBzZWN0aW9uIHdpbGwgY292ZXIgYQorbnVtYmVyIG9mIHRvcGljcyB3aGljaCBjYW4gYmUgaGVscGZ1bCBmb3IgZGV2ZWxvcGVycyB3YW50aW5nIHRvIGJlY29tZSBhCityZWd1bGFyIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBwcm9jZXNzLgorCitNYW5hZ2luZyBwYXRjaGVzIHdpdGggZ2l0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB1c2Ugb2YgZGlzdHJpYnV0ZWQgdmVyc2lvbiBjb250cm9sIGZvciB0aGUga2VybmVsIGJlZ2FuIGluIGVhcmx5IDIwMDIsCit3aGVuIExpbnVzIGZpcnN0IHN0YXJ0ZWQgcGxheWluZyB3aXRoIHRoZSBwcm9wcmlldGFyeSBCaXRLZWVwZXIKK2FwcGxpY2F0aW9uLiAgV2hpbGUgQml0S2VlcGVyIHdhcyBjb250cm92ZXJzaWFsLCB0aGUgYXBwcm9hY2ggdG8gc29mdHdhcmUKK3ZlcnNpb24gbWFuYWdlbWVudCBpdCBlbWJvZGllZCBtb3N0IGNlcnRhaW5seSB3YXMgbm90LiAgRGlzdHJpYnV0ZWQgdmVyc2lvbgorY29udHJvbCBlbmFibGVkIGFuIGltbWVkaWF0ZSBhY2NlbGVyYXRpb24gb2YgdGhlIGtlcm5lbCBkZXZlbG9wbWVudAorcHJvamVjdC4gIEluIGN1cnJlbnQgdGltZXMsIHRoZXJlIGFyZSBzZXZlcmFsIGZyZWUgYWx0ZXJuYXRpdmVzIHRvCitCaXRLZWVwZXIuICBGb3IgYmV0dGVyIG9yIGZvciB3b3JzZSwgdGhlIGtlcm5lbCBwcm9qZWN0IGhhcyBzZXR0bGVkIG9uIGdpdAorYXMgaXRzIHRvb2wgb2YgY2hvaWNlLgorCitNYW5hZ2luZyBwYXRjaGVzIHdpdGggZ2l0IGNhbiBtYWtlIGxpZmUgbXVjaCBlYXNpZXIgZm9yIHRoZSBkZXZlbG9wZXIsCitlc3BlY2lhbGx5IGFzIHRoZSB2b2x1bWUgb2YgdGhvc2UgcGF0Y2hlcyBncm93cy4gIEdpdCBhbHNvIGhhcyBpdHMgcm91Z2gKK2VkZ2VzIGFuZCBwb3NlcyBjZXJ0YWluIGhhemFyZHM7IGl0IGlzIGEgeW91bmcgYW5kIHBvd2VyZnVsIHRvb2wgd2hpY2ggaXMKK3N0aWxsIGJlaW5nIGNpdmlsaXplZCBieSBpdHMgZGV2ZWxvcGVycy4gIFRoaXMgZG9jdW1lbnQgd2lsbCBub3QgYXR0ZW1wdCB0bwordGVhY2ggdGhlIHJlYWRlciBob3cgdG8gdXNlIGdpdDsgdGhhdCB3b3VsZCBiZSBzdWZmaWNpZW50IG1hdGVyaWFsIGZvciBhCitsb25nIGRvY3VtZW50IGluIGl0cyBvd24gcmlnaHQuICBJbnN0ZWFkLCB0aGUgZm9jdXMgaGVyZSB3aWxsIGJlIG9uIGhvdyBnaXQKK2ZpdHMgaW50byB0aGUga2VybmVsIGRldmVsb3BtZW50IHByb2Nlc3MgaW4gcGFydGljdWxhci4gIERldmVsb3BlcnMgd2hvCit3aXNoIHRvIGNvbWUgdXAgdG8gc3BlZWQgd2l0aCBnaXQgd2lsbCBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYXQ6CisKKwlodHRwOi8vZ2l0LXNjbS5jb20vCisKKwlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy91c2VyLW1hbnVhbC5odG1sCisKK2FuZCBvbiB2YXJpb3VzIHR1dG9yaWFscyBmb3VuZCBvbiB0aGUgd2ViLgorCitUaGUgZmlyc3Qgb3JkZXIgb2YgYnVzaW5lc3MgaXMgdG8gcmVhZCB0aGUgYWJvdmUgc2l0ZXMgYW5kIGdldCBhIHNvbGlkCit1bmRlcnN0YW5kaW5nIG9mIGhvdyBnaXQgd29ya3MgYmVmb3JlIHRyeWluZyB0byB1c2UgaXQgdG8gbWFrZSBwYXRjaGVzCithdmFpbGFibGUgdG8gb3RoZXJzLiAgQSBnaXQtdXNpbmcgZGV2ZWxvcGVyIHNob3VsZCBiZSBhYmxlIHRvIG9idGFpbiBhIGNvcHkKK29mIHRoZSBtYWlubGluZSByZXBvc2l0b3J5LCBleHBsb3JlIHRoZSByZXZpc2lvbiBoaXN0b3J5LCBjb21taXQgY2hhbmdlcyB0bwordGhlIHRyZWUsIHVzZSBicmFuY2hlcywgZXRjLiAgQW4gdW5kZXJzdGFuZGluZyBvZiBnaXQncyB0b29scyBmb3IgdGhlCityZXdyaXRpbmcgb2YgaGlzdG9yeSAoc3VjaCBhcyByZWJhc2UpIGlzIGFsc28gdXNlZnVsLiAgR2l0IGNvbWVzIHdpdGggaXRzCitvd24gdGVybWlub2xvZ3kgYW5kIGNvbmNlcHRzOyBhIG5ldyB1c2VyIG9mIGdpdCBzaG91bGQga25vdyBhYm91dCByZWZzLAorcmVtb3RlIGJyYW5jaGVzLCB0aGUgaW5kZXgsIGZhc3QtZm9yd2FyZCBtZXJnZXMsIHB1c2hlcyBhbmQgcHVsbHMsIGRldGFjaGVkCitoZWFkcywgZXRjLiAgSXQgY2FuIGFsbCBiZSBhIGxpdHRsZSBpbnRpbWlkYXRpbmcgYXQgdGhlIG91dHNldCwgYnV0IHRoZQorY29uY2VwdHMgYXJlIG5vdCB0aGF0IGhhcmQgdG8gZ3Jhc3Agd2l0aCBhIGJpdCBvZiBzdHVkeS4KKworVXNpbmcgZ2l0IHRvIGdlbmVyYXRlIHBhdGNoZXMgZm9yIHN1Ym1pc3Npb24gYnkgZW1haWwgY2FuIGJlIGEgZ29vZAorZXhlcmNpc2Ugd2hpbGUgY29taW5nIHVwIHRvIHNwZWVkLgorCitXaGVuIHlvdSBhcmUgcmVhZHkgdG8gc3RhcnQgcHV0dGluZyB1cCBnaXQgdHJlZXMgZm9yIG90aGVycyB0byBsb29rIGF0LCB5b3UKK3dpbGwsIG9mIGNvdXJzZSwgbmVlZCBhIHNlcnZlciB0aGF0IGNhbiBiZSBwdWxsZWQgZnJvbS4gIFNldHRpbmcgdXAgc3VjaCBhCitzZXJ2ZXIgd2l0aCBnaXQtZGFlbW9uIGlzIHJlbGF0aXZlbHkgc3RyYWlnaHRmb3J3YXJkIGlmIHlvdSBoYXZlIGEgc3lzdGVtCit3aGljaCBpcyBhY2Nlc3NpYmxlIHRvIHRoZSBJbnRlcm5ldC4gIE90aGVyd2lzZSwgZnJlZSwgcHVibGljIGhvc3Rpbmcgc2l0ZXMKKyhHaXRodWIsIGZvciBleGFtcGxlKSBhcmUgc3RhcnRpbmcgdG8gYXBwZWFyIG9uIHRoZSBuZXQuICBFc3RhYmxpc2hlZAorZGV2ZWxvcGVycyBjYW4gZ2V0IGFuIGFjY291bnQgb24ga2VybmVsLm9yZywgYnV0IHRob3NlIGFyZSBub3QgZWFzeSB0byBjb21lCitieTsgc2VlIGh0dHA6Ly9rZXJuZWwub3JnL2ZhcS8gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1RoZSBub3JtYWwgZ2l0IHdvcmtmbG93IGludm9sdmVzIHRoZSB1c2Ugb2YgYSBsb3Qgb2YgYnJhbmNoZXMuICBFYWNoIGxpbmUKK29mIGRldmVsb3BtZW50IGNhbiBiZSBzZXBhcmF0ZWQgaW50byBhIHNlcGFyYXRlICJ0b3BpYyBicmFuY2giIGFuZAorbWFpbnRhaW5lZCBpbmRlcGVuZGVudGx5LiAgQnJhbmNoZXMgaW4gZ2l0IGFyZSBjaGVhcCwgdGhlcmUgaXMgbm8gcmVhc29uIHRvCitub3QgbWFrZSBmcmVlIHVzZSBvZiB0aGVtLiAgQW5kLCBpbiBhbnkgY2FzZSwgeW91IHNob3VsZCBub3QgZG8geW91cgorZGV2ZWxvcG1lbnQgaW4gYW55IGJyYW5jaCB3aGljaCB5b3UgaW50ZW5kIHRvIGFzayBvdGhlcnMgdG8gcHVsbCBmcm9tLgorUHVibGljbHktYXZhaWxhYmxlIGJyYW5jaGVzIHNob3VsZCBiZSBjcmVhdGVkIHdpdGggY2FyZTsgbWVyZ2UgaW4gcGF0Y2hlcworZnJvbSBkZXZlbG9wbWVudCBicmFuY2hlcyB3aGVuIHRoZXkgYXJlIGluIGNvbXBsZXRlIGZvcm0gYW5kIHJlYWR5IHRvIGdvIC0KK25vdCBiZWZvcmUuCisKK0dpdCBwcm92aWRlcyBzb21lIHBvd2VyZnVsIHRvb2xzIHdoaWNoIGNhbiBhbGxvdyB5b3UgdG8gcmV3cml0ZSB5b3VyCitkZXZlbG9wbWVudCBoaXN0b3J5LiAgQW4gaW5jb252ZW5pZW50IHBhdGNoIChvbmUgd2hpY2ggYnJlYWtzIGJpc2VjdGlvbiwKK3NheSwgb3Igd2hpY2ggaGFzIHNvbWUgb3RoZXIgc29ydCBvZiBvYnZpb3VzIGJ1ZykgY2FuIGJlIGZpeGVkIGluIHBsYWNlIG9yCittYWRlIHRvIGRpc2FwcGVhciBmcm9tIHRoZSBoaXN0b3J5IGVudGlyZWx5LiAgQSBwYXRjaCBzZXJpZXMgY2FuIGJlCityZXdyaXR0ZW4gYXMgaWYgaXQgaGFkIGJlZW4gd3JpdHRlbiBvbiB0b3Agb2YgdG9kYXkncyBtYWlubGluZSwgZXZlbiB0aG91Z2gKK3lvdSBoYXZlIGJlZW4gd29ya2luZyBvbiBpdCBmb3IgbW9udGhzLiAgQ2hhbmdlcyBjYW4gYmUgdHJhbnNwYXJlbnRseQorc2hpZnRlZCBmcm9tIG9uZSBicmFuY2ggdG8gYW5vdGhlci4gIEFuZCBzbyBvbi4gIEp1ZGljaW91cyB1c2Ugb2YgZ2l0J3MKK2FiaWxpdHkgdG8gcmV2aXNlIGhpc3RvcnkgY2FuIGhlbHAgaW4gdGhlIGNyZWF0aW9uIG9mIGNsZWFuIHBhdGNoIHNldHMgd2l0aAorZmV3ZXIgcHJvYmxlbXMuCisKK0V4Y2Vzc2l2ZSB1c2Ugb2YgdGhpcyBjYXBhYmlsaXR5IGNhbiBsZWFkIHRvIG90aGVyIHByb2JsZW1zLCB0aG91Z2gsIGJleW9uZAorYSBzaW1wbGUgb2JzZXNzaW9uIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIHBlcmZlY3QgcHJvamVjdCBoaXN0b3J5LgorUmV3cml0aW5nIGhpc3Rvcnkgd2lsbCByZXdyaXRlIHRoZSBjaGFuZ2VzIGNvbnRhaW5lZCBpbiB0aGF0IGhpc3RvcnksCit0dXJuaW5nIGEgdGVzdGVkIChob3BlZnVsbHkpIGtlcm5lbCB0cmVlIGludG8gYW4gdW50ZXN0ZWQgb25lLiAgQnV0LCBiZXlvbmQKK3RoYXQsIGRldmVsb3BlcnMgY2Fubm90IGVhc2lseSBjb2xsYWJvcmF0ZSBpZiB0aGV5IGRvIG5vdCBoYXZlIGEgc2hhcmVkCit2aWV3IG9mIHRoZSBwcm9qZWN0IGhpc3Rvcnk7IGlmIHlvdSByZXdyaXRlIGhpc3Rvcnkgd2hpY2ggb3RoZXIgZGV2ZWxvcGVycworaGF2ZSBwdWxsZWQgaW50byB0aGVpciByZXBvc2l0b3JpZXMsIHlvdSB3aWxsIG1ha2UgbGlmZSBtdWNoIG1vcmUgZGlmZmljdWx0Citmb3IgdGhvc2UgZGV2ZWxvcGVycy4gIFNvIGEgc2ltcGxlIHJ1bGUgb2YgdGh1bWIgYXBwbGllcyBoZXJlOiBoaXN0b3J5Cit3aGljaCBoYXMgYmVlbiBleHBvcnRlZCB0byBvdGhlcnMgc2hvdWxkIGdlbmVyYWxseSBiZSBzZWVuIGFzIGltbXV0YWJsZQordGhlcmVhZnRlci4KKworU28sIG9uY2UgeW91IHB1c2ggYSBzZXQgb2YgY2hhbmdlcyB0byB5b3VyIHB1YmxpY2x5LWF2YWlsYWJsZSBzZXJ2ZXIsIHRob3NlCitjaGFuZ2VzIHNob3VsZCBub3QgYmUgcmV3cml0dGVuLiAgR2l0IHdpbGwgYXR0ZW1wdCB0byBlbmZvcmNlIHRoaXMgcnVsZSBpZgoreW91IHRyeSB0byBwdXNoIGNoYW5nZXMgd2hpY2ggZG8gbm90IHJlc3VsdCBpbiBhIGZhc3QtZm9yd2FyZCBtZXJnZQorKGkuZS4gY2hhbmdlcyB3aGljaCBkbyBub3Qgc2hhcmUgdGhlIHNhbWUgaGlzdG9yeSkuICBJdCBpcyBwb3NzaWJsZSB0bworb3ZlcnJpZGUgdGhpcyBjaGVjaywgYW5kIHRoZXJlIG1heSBiZSB0aW1lcyB3aGVuIGl0IGlzIG5lY2Vzc2FyeSB0byByZXdyaXRlCithbiBleHBvcnRlZCB0cmVlLiAgTW92aW5nIGNoYW5nZXNldHMgYmV0d2VlbiB0cmVlcyB0byBhdm9pZCBjb25mbGljdHMgaW4KK2xpbnV4LW5leHQgaXMgb25lIGV4YW1wbGUuICBCdXQgc3VjaCBhY3Rpb25zIHNob3VsZCBiZSByYXJlLiAgVGhpcyBpcyBvbmUKK29mIHRoZSByZWFzb25zIHdoeSBkZXZlbG9wbWVudCBzaG91bGQgYmUgZG9uZSBpbiBwcml2YXRlIGJyYW5jaGVzICh3aGljaAorY2FuIGJlIHJld3JpdHRlbiBpZiBuZWNlc3NhcnkpIGFuZCBvbmx5IG1vdmVkIGludG8gcHVibGljIGJyYW5jaGVzIHdoZW4KK2l0J3MgaW4gYSByZWFzb25hYmx5IGFkdmFuY2VkIHN0YXRlLgorCitBcyB0aGUgbWFpbmxpbmUgKG9yIG90aGVyIHRyZWUgdXBvbiB3aGljaCBhIHNldCBvZiBjaGFuZ2VzIGlzIGJhc2VkKQorYWR2YW5jZXMsIGl0IGlzIHRlbXB0aW5nIHRvIG1lcmdlIHdpdGggdGhhdCB0cmVlIHRvIHN0YXkgb24gdGhlIGxlYWRpbmcKK2VkZ2UuICBGb3IgYSBwcml2YXRlIGJyYW5jaCwgcmViYXNpbmcgY2FuIGJlIGFuIGVhc3kgd2F5IHRvIGtlZXAgdXAgd2l0aAorYW5vdGhlciB0cmVlLCBidXQgcmViYXNpbmcgaXMgbm90IGFuIG9wdGlvbiBvbmNlIGEgdHJlZSBpcyBleHBvcnRlZCB0byB0aGUKK3dvcmxkLiAgT25jZSB0aGF0IGhhcHBlbnMsIGEgZnVsbCBtZXJnZSBtdXN0IGJlIGRvbmUuICBNZXJnaW5nIG9jY2FzaW9uYWxseQorbWFrZXMgZ29vZCBzZW5zZSwgYnV0IG92ZXJseSBmcmVxdWVudCBtZXJnZXMgY2FuIGNsdXR0ZXIgdGhlIGhpc3RvcnkKK25lZWRsZXNzbHkuICBTdWdnZXN0ZWQgdGVjaG5pcXVlIGluIHRoaXMgY2FzZSBpcyB0byBtZXJnZSBpbmZyZXF1ZW50bHksIGFuZAorZ2VuZXJhbGx5IG9ubHkgYXQgc3BlY2lmaWMgcmVsZWFzZSBwb2ludHMgKHN1Y2ggYXMgYSBtYWlubGluZSAtcmMKK3JlbGVhc2UpLiAgSWYgeW91IGFyZSBuZXJ2b3VzIGFib3V0IHNwZWNpZmljIGNoYW5nZXMsIHlvdSBjYW4gYWx3YXlzCitwZXJmb3JtIHRlc3QgbWVyZ2VzIGluIGEgcHJpdmF0ZSBicmFuY2guICBUaGUgZ2l0ICJyZXJlcmUiIHRvb2wgY2FuIGJlCit1c2VmdWwgaW4gc3VjaCBzaXR1YXRpb25zOyBpdCByZW1lbWJlcnMgaG93IG1lcmdlIGNvbmZsaWN0cyB3ZXJlIHJlc29sdmVkCitzbyB0aGF0IHlvdSBkb24ndCBoYXZlIHRvIGRvIHRoZSBzYW1lIHdvcmsgdHdpY2UuCisKK09uZSBvZiB0aGUgYmlnZ2VzdCByZWN1cnJpbmcgY29tcGxhaW50cyBhYm91dCB0b29scyBsaWtlIGdpdCBpcyB0aGlzOiB0aGUKK21hc3MgbW92ZW1lbnQgb2YgcGF0Y2hlcyBmcm9tIG9uZSByZXBvc2l0b3J5IHRvIGFub3RoZXIgbWFrZXMgaXQgZWFzeSB0bworc2xpcCBpbiBpbGwtYWR2aXNlZCBjaGFuZ2VzIHdoaWNoIGdvIGludG8gdGhlIG1haW5saW5lIGJlbG93IHRoZSByZXZpZXcKK3JhZGFyLiAgS2VybmVsIGRldmVsb3BlcnMgdGVuZCB0byBnZXQgdW5oYXBweSB3aGVuIHRoZXkgc2VlIHRoYXQga2luZCBvZgordGhpbmcgaGFwcGVuaW5nOyBwdXR0aW5nIHVwIGEgZ2l0IHRyZWUgd2l0aCB1bnJldmlld2VkIG9yIG9mZi10b3BpYyBwYXRjaGVzCitjYW4gYWZmZWN0IHlvdXIgYWJpbGl0eSB0byBnZXQgdHJlZXMgcHVsbGVkIGluIHRoZSBmdXR1cmUuICBRdW90aW5nIExpbnVzOgorCis6OgorCisJWW91IGNhbiBzZW5kIG1lIHBhdGNoZXMsIGJ1dCBmb3IgbWUgdG8gcHVsbCBhIGdpdCBwYXRjaCBmcm9tIHlvdSwgSQorCW5lZWQgdG8ga25vdyB0aGF0IHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLCBhbmQgSSBuZWVkIHRvIGJlIGFibGUKKwl0byB0cnVzdCB0aGluZ3MgKndpdGhvdXQqIHRoZW4gaGF2aW5nIHRvIGdvIGFuZCBjaGVjayBldmVyeQorCWluZGl2aWR1YWwgY2hhbmdlIGJ5IGhhbmQuCisKKyhodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yMjQxMzUvKS4KKworVG8gYXZvaWQgdGhpcyBraW5kIG9mIHNpdHVhdGlvbiwgZW5zdXJlIHRoYXQgYWxsIHBhdGNoZXMgd2l0aGluIGEgZ2l2ZW4KK2JyYW5jaCBzdGljayBjbG9zZWx5IHRvIHRoZSBhc3NvY2lhdGVkIHRvcGljOyBhICJkcml2ZXIgZml4ZXMiIGJyYW5jaAorc2hvdWxkIG5vdCBiZSBtYWtpbmcgY2hhbmdlcyB0byB0aGUgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBjb2RlLiAgQW5kLCBtb3N0CitpbXBvcnRhbnRseSwgZG8gbm90IHVzZSBhIGdpdCB0cmVlIHRvIGJ5cGFzcyB0aGUgcmV2aWV3IHByb2Nlc3MuICBQb3N0IGFuCitvY2Nhc2lvbmFsIHN1bW1hcnkgb2YgdGhlIHRyZWUgdG8gdGhlIHJlbGV2YW50IGxpc3QsIGFuZCwgd2hlbiB0aGUgdGltZSBpcworcmlnaHQsIHJlcXVlc3QgdGhhdCB0aGUgdHJlZSBiZSBpbmNsdWRlZCBpbiBsaW51eC1uZXh0LgorCitJZiBhbmQgd2hlbiBvdGhlcnMgc3RhcnQgdG8gc2VuZCBwYXRjaGVzIGZvciBpbmNsdXNpb24gaW50byB5b3VyIHRyZWUsCitkb24ndCBmb3JnZXQgdG8gcmV2aWV3IHRoZW0uICBBbHNvIGVuc3VyZSB0aGF0IHlvdSBtYWludGFpbiB0aGUgY29ycmVjdAorYXV0aG9yc2hpcCBpbmZvcm1hdGlvbjsgdGhlIGdpdCAiYW0iIHRvb2wgZG9lcyBpdHMgYmVzdCBpbiB0aGlzIHJlZ2FyZCwgYnV0Cit5b3UgbWF5IGhhdmUgdG8gYWRkIGEgIkZyb206IiBsaW5lIHRvIHRoZSBwYXRjaCBpZiBpdCBoYXMgYmVlbiByZWxheWVkIHRvCit5b3UgdmlhIGEgdGhpcmQgcGFydHkuCisKK1doZW4gcmVxdWVzdGluZyBhIHB1bGwsIGJlIHN1cmUgdG8gZ2l2ZSBhbGwgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uOiB3aGVyZQoreW91ciB0cmVlIGlzLCB3aGF0IGJyYW5jaCB0byBwdWxsLCBhbmQgd2hhdCBjaGFuZ2VzIHdpbGwgcmVzdWx0IGZyb20gdGhlCitwdWxsLiAgVGhlIGdpdCByZXF1ZXN0LXB1bGwgY29tbWFuZCBjYW4gYmUgaGVscGZ1bCBpbiB0aGlzIHJlZ2FyZDsgaXQgd2lsbAorZm9ybWF0IHRoZSByZXF1ZXN0IGFzIG90aGVyIGRldmVsb3BlcnMgZXhwZWN0LCBhbmQgd2lsbCBhbHNvIGNoZWNrIHRvIGJlCitzdXJlIHRoYXQgeW91IGhhdmUgcmVtZW1iZXJlZCB0byBwdXNoIHRob3NlIGNoYW5nZXMgdG8gdGhlIHB1YmxpYyBzZXJ2ZXIuCisKKworUmV2aWV3aW5nIHBhdGNoZXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWUgcmVhZGVycyB3aWxsIGNlcnRhaW5seSBvYmplY3QgdG8gcHV0dGluZyB0aGlzIHNlY3Rpb24gd2l0aCAiYWR2YW5jZWQKK3RvcGljcyIgb24gdGhlIGdyb3VuZHMgdGhhdCBldmVuIGJlZ2lubmluZyBrZXJuZWwgZGV2ZWxvcGVycyBzaG91bGQgYmUKK3Jldmlld2luZyBwYXRjaGVzLiAgSXQgaXMgY2VydGFpbmx5IHRydWUgdGhhdCB0aGVyZSBpcyBubyBiZXR0ZXIgd2F5IHRvCitsZWFybiBob3cgdG8gcHJvZ3JhbSBpbiB0aGUga2VybmVsIGVudmlyb25tZW50IHRoYW4gYnkgbG9va2luZyBhdCBjb2RlCitwb3N0ZWQgYnkgb3RoZXJzLiAgSW4gYWRkaXRpb24sIHJldmlld2VycyBhcmUgZm9yZXZlciBpbiBzaG9ydCBzdXBwbHk7IGJ5Citsb29raW5nIGF0IGNvZGUgeW91IGNhbiBtYWtlIGEgc2lnbmlmaWNhbnQgY29udHJpYnV0aW9uIHRvIHRoZSBwcm9jZXNzIGFzIGEKK3dob2xlLgorCitSZXZpZXdpbmcgY29kZSBjYW4gYmUgYW4gaW50aW1pZGF0aW5nIHByb3NwZWN0LCBlc3BlY2lhbGx5IGZvciBhIG5ldyBrZXJuZWwKK2RldmVsb3BlciB3aG8gbWF5IHdlbGwgZmVlbCBuZXJ2b3VzIGFib3V0IHF1ZXN0aW9uaW5nIGNvZGUgLSBpbiBwdWJsaWMgLQord2hpY2ggaGFzIGJlZW4gcG9zdGVkIGJ5IHRob3NlIHdpdGggbW9yZSBleHBlcmllbmNlLiAgRXZlbiBjb2RlIHdyaXR0ZW4gYnkKK3RoZSBtb3N0IGV4cGVyaWVuY2VkIGRldmVsb3BlcnMgY2FuIGJlIGltcHJvdmVkLCB0aG91Z2guICBQZXJoYXBzIHRoZSBiZXN0CitwaWVjZSBvZiBhZHZpY2UgZm9yIHJldmlld2VycyAoYWxsIHJldmlld2VycykgaXMgdGhpczogcGhyYXNlIHJldmlldworY29tbWVudHMgYXMgcXVlc3Rpb25zIHJhdGhlciB0aGFuIGNyaXRpY2lzbXMuICBBc2tpbmcgImhvdyBkb2VzIHRoZSBsb2NrCitnZXQgcmVsZWFzZWQgaW4gdGhpcyBwYXRoPyIgd2lsbCBhbHdheXMgd29yayBiZXR0ZXIgdGhhbiBzdGF0aW5nICJ0aGUKK2xvY2tpbmcgaGVyZSBpcyB3cm9uZy4iCisKK0RpZmZlcmVudCBkZXZlbG9wZXJzIHdpbGwgcmV2aWV3IGNvZGUgZnJvbSBkaWZmZXJlbnQgcG9pbnRzIG9mIHZpZXcuICBTb21lCithcmUgbW9zdGx5IGNvbmNlcm5lZCB3aXRoIGNvZGluZyBzdHlsZSBhbmQgd2hldGhlciBjb2RlIGxpbmVzIGhhdmUgdHJhaWxpbmcKK3doaXRlIHNwYWNlLiAgT3RoZXJzIHdpbGwgZm9jdXMgcHJpbWFyaWx5IG9uIHdoZXRoZXIgdGhlIGNoYW5nZSBpbXBsZW1lbnRlZAorYnkgdGhlIHBhdGNoIGFzIGEgd2hvbGUgaXMgYSBnb29kIHRoaW5nIGZvciB0aGUga2VybmVsIG9yIG5vdC4gIFlldCBvdGhlcnMKK3dpbGwgY2hlY2sgZm9yIHByb2JsZW1hdGljIGxvY2tpbmcsIGV4Y2Vzc2l2ZSBzdGFjayB1c2FnZSwgcG9zc2libGUKK3NlY3VyaXR5IGlzc3VlcywgZHVwbGljYXRpb24gb2YgY29kZSBmb3VuZCBlbHNld2hlcmUsIGFkZXF1YXRlCitkb2N1bWVudGF0aW9uLCBhZHZlcnNlIGVmZmVjdHMgb24gcGVyZm9ybWFuY2UsIHVzZXItc3BhY2UgQUJJIGNoYW5nZXMsIGV0Yy4KK0FsbCB0eXBlcyBvZiByZXZpZXcsIGlmIHRoZXkgbGVhZCB0byBiZXR0ZXIgY29kZSBnb2luZyBpbnRvIHRoZSBrZXJuZWwsIGFyZQord2VsY29tZSBhbmQgd29ydGh3aGlsZS4KKworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvOC5Db25jbHVzaW9uIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzLzguQ29uY2x1c2lvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlZjY5MC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvOC5Db25jbHVzaW9uCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotODogRk9SIE1PUkUgSU5GT1JNQVRJT04KLQotVGhlcmUgYXJlIG51bWVyb3VzIHNvdXJjZXMgb2YgaW5mb3JtYXRpb24gb24gTGludXgga2VybmVsIGRldmVsb3BtZW50IGFuZAotcmVsYXRlZCB0b3BpY3MuICBGaXJzdCBhbW9uZyB0aG9zZSB3aWxsIGFsd2F5cyBiZSB0aGUgRG9jdW1lbnRhdGlvbgotZGlyZWN0b3J5IGZvdW5kIGluIHRoZSBrZXJuZWwgc291cmNlIGRpc3RyaWJ1dGlvbi4gIFRoZSB0b3AtbGV2ZWwgSE9XVE8KLWZpbGUgaXMgYW4gaW1wb3J0YW50IHN0YXJ0aW5nIHBvaW50OyBTdWJtaXR0aW5nUGF0Y2hlcyBhbmQKLVN1Ym1pdHRpbmdEcml2ZXJzIGFyZSBhbHNvIHNvbWV0aGluZyB3aGljaCBhbGwga2VybmVsIGRldmVsb3BlcnMgc2hvdWxkCi1yZWFkLiAgTWFueSBpbnRlcm5hbCBrZXJuZWwgQVBJcyBhcmUgZG9jdW1lbnRlZCB1c2luZyB0aGUga2VybmVsZG9jCi1tZWNoYW5pc207ICJtYWtlIGh0bWxkb2NzIiBvciAibWFrZSBwZGZkb2NzIiBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aG9zZQotZG9jdW1lbnRzIGluIEhUTUwgb3IgUERGIGZvcm1hdCAodGhvdWdoIHRoZSB2ZXJzaW9uIG9mIFRlWCBzaGlwcGVkIGJ5IHNvbWUKLWRpc3RyaWJ1dGlvbnMgcnVucyBpbnRvIGludGVybmFsIGxpbWl0cyBhbmQgZmFpbHMgdG8gcHJvY2VzcyB0aGUgZG9jdW1lbnRzCi1wcm9wZXJseSkuCi0KLVZhcmlvdXMgd2ViIHNpdGVzIGRpc2N1c3Mga2VybmVsIGRldmVsb3BtZW50IGF0IGFsbCBsZXZlbHMgb2YgZGV0YWlsLiAgWW91cgotYXV0aG9yIHdvdWxkIGxpa2UgdG8gaHVtYmx5IHN1Z2dlc3QgaHR0cDovL2x3bi5uZXQvIGFzIGEgc291cmNlOwotaW5mb3JtYXRpb24gb24gbWFueSBzcGVjaWZpYyBrZXJuZWwgdG9waWNzIGNhbiBiZSBmb3VuZCB2aWEgdGhlIExXTiBrZXJuZWwKLWluZGV4IGF0OgotCi0JaHR0cDovL2x3bi5uZXQvS2VybmVsL0luZGV4LwotCi1CZXlvbmQgdGhhdCwgYSB2YWx1YWJsZSByZXNvdXJjZSBmb3Iga2VybmVsIGRldmVsb3BlcnMgaXM6Ci0KLQlodHRwOi8va2VybmVsbmV3Ymllcy5vcmcvCi0KLUFuZCwgb2YgY291cnNlLCBvbmUgc2hvdWxkIG5vdCBmb3JnZXQgaHR0cDovL2tlcm5lbC5vcmcvLCB0aGUgZGVmaW5pdGl2ZQotbG9jYXRpb24gZm9yIGtlcm5lbCByZWxlYXNlIGluZm9ybWF0aW9uLgotCi1UaGVyZSBhcmUgYSBudW1iZXIgb2YgYm9va3Mgb24ga2VybmVsIGRldmVsb3BtZW50OgotCi0JTGludXggRGV2aWNlIERyaXZlcnMsIDNyZCBFZGl0aW9uIChKb25hdGhhbiBDb3JiZXQsIEFsZXNzYW5kcm8KLQlSdWJpbmksIGFuZCBHcmVnIEtyb2FoLUhhcnRtYW4pLiAgT25saW5lIGF0Ci0JaHR0cDovL2x3bi5uZXQvS2VybmVsL0xERDMvLgotCi0JTGludXggS2VybmVsIERldmVsb3BtZW50IChSb2JlcnQgTG92ZSkuCi0KLQlVbmRlcnN0YW5kaW5nIHRoZSBMaW51eCBLZXJuZWwgKERhbmllbCBCb3ZldCBhbmQgTWFyY28gQ2VzYXRpKS4KLQotQWxsIG9mIHRoZXNlIGJvb2tzIHN1ZmZlciBmcm9tIGEgY29tbW9uIGZhdWx0LCB0aG91Z2g6IHRoZXkgdGVuZCB0byBiZQotc29tZXdoYXQgb2Jzb2xldGUgYnkgdGhlIHRpbWUgdGhleSBoaXQgdGhlIHNoZWx2ZXMsIGFuZCB0aGV5IGhhdmUgYmVlbiBvbgotdGhlIHNoZWx2ZXMgZm9yIGEgd2hpbGUgbm93LiAgU3RpbGwsIHRoZXJlIGlzIHF1aXRlIGEgYml0IG9mIGdvb2QKLWluZm9ybWF0aW9uIHRvIGJlIGZvdW5kIHRoZXJlLgotCi1Eb2N1bWVudGF0aW9uIGZvciBnaXQgY2FuIGJlIGZvdW5kIGF0OgotCi0JaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvCi0KLQlodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL3NvZnR3YXJlL3NjbS9naXQvZG9jcy91c2VyLW1hbnVhbC5odG1sCi0KLQotOTogQ09OQ0xVU0lPTgotCi1Db25ncmF0dWxhdGlvbnMgdG8gYW55Ym9keSB3aG8gaGFzIG1hZGUgaXQgdGhyb3VnaCB0aGlzIGxvbmctd2luZGVkCi1kb2N1bWVudC4gIEhvcGVmdWxseSBpdCBoYXMgcHJvdmlkZWQgYSBoZWxwZnVsIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZQotTGludXgga2VybmVsIGlzIGRldmVsb3BlZCBhbmQgaG93IHlvdSBjYW4gcGFydGljaXBhdGUgaW4gdGhhdCBwcm9jZXNzLgotCi1JbiB0aGUgZW5kLCBpdCdzIHRoZSBwYXJ0aWNpcGF0aW9uIHRoYXQgbWF0dGVycy4gIEFueSBvcGVuIHNvdXJjZSBzb2Z0d2FyZQotcHJvamVjdCBpcyBubyBtb3JlIHRoYW4gdGhlIHN1bSBvZiB3aGF0IGl0cyBjb250cmlidXRvcnMgcHV0IGludG8gaXQuICBUaGUKLUxpbnV4IGtlcm5lbCBoYXMgcHJvZ3Jlc3NlZCBhcyBxdWlja2x5IGFuZCBhcyB3ZWxsIGFzIGl0IGhhcyBiZWNhdXNlIGl0IGhhcwotYmVlbiBoZWxwZWQgYnkgYW4gaW1wcmVzc2l2ZWx5IGxhcmdlIGdyb3VwIG9mIGRldmVsb3BlcnMsIGFsbCBvZiB3aG9tIGFyZQotd29ya2luZyB0byBtYWtlIGl0IGJldHRlci4gIFRoZSBrZXJuZWwgaXMgYSBwcmVtaWVyIGV4YW1wbGUgb2Ygd2hhdCBjYW4gYmUKLWRvbmUgd2hlbiB0aG91c2FuZHMgb2YgcGVvcGxlIHdvcmsgdG9nZXRoZXIgdG93YXJkIGEgY29tbW9uIGdvYWwuCi0KLVRoZSBrZXJuZWwgY2FuIGFsd2F5cyBiZW5lZml0IGZyb20gYSBsYXJnZXIgZGV2ZWxvcGVyIGJhc2UsIHRob3VnaC4gIFRoZXJlCi1pcyBhbHdheXMgbW9yZSB3b3JrIHRvIGRvLiAgQnV0LCBqdXN0IGFzIGltcG9ydGFudGx5LCBtb3N0IG90aGVyCi1wYXJ0aWNpcGFudHMgaW4gdGhlIExpbnV4IGVjb3N5c3RlbSBjYW4gYmVuZWZpdCB0aHJvdWdoIGNvbnRyaWJ1dGluZyB0byB0aGUKLWtlcm5lbC4gIEdldHRpbmcgY29kZSBpbnRvIHRoZSBtYWlubGluZSBpcyB0aGUga2V5IHRvIGhpZ2hlciBjb2RlIHF1YWxpdHksCi1sb3dlciBtYWludGVuYW5jZSBhbmQgZGlzdHJpYnV0aW9uIGNvc3RzLCBhIGhpZ2hlciBsZXZlbCBvZiBpbmZsdWVuY2Ugb3ZlcgotdGhlIGRpcmVjdGlvbiBvZiBrZXJuZWwgZGV2ZWxvcG1lbnQsIGFuZCBtb3JlLiAgSXQgaXMgYSBzaXR1YXRpb24gd2hlcmUKLWV2ZXJ5Ym9keSBpbnZvbHZlZCB3aW5zLiAgRmlyZSB1cCB5b3VyIGVkaXRvciBhbmQgY29tZSBqb2luIHVzOyB5b3Ugd2lsbCBiZQotbW9yZSB0aGFuIHdlbGNvbWUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvOC5Db25jbHVzaW9uLnJzdCBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy84LkNvbmNsdXNpb24ucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZWM3Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvOC5Db25jbHVzaW9uLnJzdApAQCAtMCwwICsxLDc0IEBACisuLiBfZGV2ZWxvcG1lbnRfY29uY2x1c2lvbjoKKworRm9yIG1vcmUgaW5mb3JtYXRpb24KKz09PT09PT09PT09PT09PT09PT09CisKK1RoZXJlIGFyZSBudW1lcm91cyBzb3VyY2VzIG9mIGluZm9ybWF0aW9uIG9uIExpbnV4IGtlcm5lbCBkZXZlbG9wbWVudCBhbmQKK3JlbGF0ZWQgdG9waWNzLiAgRmlyc3QgYW1vbmcgdGhvc2Ugd2lsbCBhbHdheXMgYmUgdGhlIERvY3VtZW50YXRpb24KK2RpcmVjdG9yeSBmb3VuZCBpbiB0aGUga2VybmVsIHNvdXJjZSBkaXN0cmlidXRpb24uICBUaGUgdG9wLWxldmVsIEhPV1RPCitmaWxlIGlzIGFuIGltcG9ydGFudCBzdGFydGluZyBwb2ludDsgU3VibWl0dGluZ1BhdGNoZXMgYW5kCitTdWJtaXR0aW5nRHJpdmVycyBhcmUgYWxzbyBzb21ldGhpbmcgd2hpY2ggYWxsIGtlcm5lbCBkZXZlbG9wZXJzIHNob3VsZAorcmVhZC4gIE1hbnkgaW50ZXJuYWwga2VybmVsIEFQSXMgYXJlIGRvY3VtZW50ZWQgdXNpbmcgdGhlIGtlcm5lbGRvYworbWVjaGFuaXNtOyAibWFrZSBodG1sZG9jcyIgb3IgIm1ha2UgcGRmZG9jcyIgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhvc2UKK2RvY3VtZW50cyBpbiBIVE1MIG9yIFBERiBmb3JtYXQgKHRob3VnaCB0aGUgdmVyc2lvbiBvZiBUZVggc2hpcHBlZCBieSBzb21lCitkaXN0cmlidXRpb25zIHJ1bnMgaW50byBpbnRlcm5hbCBsaW1pdHMgYW5kIGZhaWxzIHRvIHByb2Nlc3MgdGhlIGRvY3VtZW50cworcHJvcGVybHkpLgorCitWYXJpb3VzIHdlYiBzaXRlcyBkaXNjdXNzIGtlcm5lbCBkZXZlbG9wbWVudCBhdCBhbGwgbGV2ZWxzIG9mIGRldGFpbC4gIFlvdXIKK2F1dGhvciB3b3VsZCBsaWtlIHRvIGh1bWJseSBzdWdnZXN0IGh0dHA6Ly9sd24ubmV0LyBhcyBhIHNvdXJjZTsKK2luZm9ybWF0aW9uIG9uIG1hbnkgc3BlY2lmaWMga2VybmVsIHRvcGljcyBjYW4gYmUgZm91bmQgdmlhIHRoZSBMV04ga2VybmVsCitpbmRleCBhdDoKKworCWh0dHA6Ly9sd24ubmV0L0tlcm5lbC9JbmRleC8KKworQmV5b25kIHRoYXQsIGEgdmFsdWFibGUgcmVzb3VyY2UgZm9yIGtlcm5lbCBkZXZlbG9wZXJzIGlzOgorCisJaHR0cDovL2tlcm5lbG5ld2JpZXMub3JnLworCitBbmQsIG9mIGNvdXJzZSwgb25lIHNob3VsZCBub3QgZm9yZ2V0IGh0dHA6Ly9rZXJuZWwub3JnLywgdGhlIGRlZmluaXRpdmUKK2xvY2F0aW9uIGZvciBrZXJuZWwgcmVsZWFzZSBpbmZvcm1hdGlvbi4KKworVGhlcmUgYXJlIGEgbnVtYmVyIG9mIGJvb2tzIG9uIGtlcm5lbCBkZXZlbG9wbWVudDoKKworCUxpbnV4IERldmljZSBEcml2ZXJzLCAzcmQgRWRpdGlvbiAoSm9uYXRoYW4gQ29yYmV0LCBBbGVzc2FuZHJvCisJUnViaW5pLCBhbmQgR3JlZyBLcm9haC1IYXJ0bWFuKS4gIE9ubGluZSBhdAorCWh0dHA6Ly9sd24ubmV0L0tlcm5lbC9MREQzLy4KKworCUxpbnV4IEtlcm5lbCBEZXZlbG9wbWVudCAoUm9iZXJ0IExvdmUpLgorCisJVW5kZXJzdGFuZGluZyB0aGUgTGludXggS2VybmVsIChEYW5pZWwgQm92ZXQgYW5kIE1hcmNvIENlc2F0aSkuCisKK0FsbCBvZiB0aGVzZSBib29rcyBzdWZmZXIgZnJvbSBhIGNvbW1vbiBmYXVsdCwgdGhvdWdoOiB0aGV5IHRlbmQgdG8gYmUKK3NvbWV3aGF0IG9ic29sZXRlIGJ5IHRoZSB0aW1lIHRoZXkgaGl0IHRoZSBzaGVsdmVzLCBhbmQgdGhleSBoYXZlIGJlZW4gb24KK3RoZSBzaGVsdmVzIGZvciBhIHdoaWxlIG5vdy4gIFN0aWxsLCB0aGVyZSBpcyBxdWl0ZSBhIGJpdCBvZiBnb29kCitpbmZvcm1hdGlvbiB0byBiZSBmb3VuZCB0aGVyZS4KKworRG9jdW1lbnRhdGlvbiBmb3IgZ2l0IGNhbiBiZSBmb3VuZCBhdDoKKworCWh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvc29mdHdhcmUvc2NtL2dpdC9kb2NzLworCisJaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvdXNlci1tYW51YWwuaHRtbAorCisKK0NvbmNsdXNpb24KKz09PT09PT09PT0KKworQ29uZ3JhdHVsYXRpb25zIHRvIGFueWJvZHkgd2hvIGhhcyBtYWRlIGl0IHRocm91Z2ggdGhpcyBsb25nLXdpbmRlZAorZG9jdW1lbnQuICBIb3BlZnVsbHkgaXQgaGFzIHByb3ZpZGVkIGEgaGVscGZ1bCB1bmRlcnN0YW5kaW5nIG9mIGhvdyB0aGUKK0xpbnV4IGtlcm5lbCBpcyBkZXZlbG9wZWQgYW5kIGhvdyB5b3UgY2FuIHBhcnRpY2lwYXRlIGluIHRoYXQgcHJvY2Vzcy4KKworSW4gdGhlIGVuZCwgaXQncyB0aGUgcGFydGljaXBhdGlvbiB0aGF0IG1hdHRlcnMuICBBbnkgb3BlbiBzb3VyY2Ugc29mdHdhcmUKK3Byb2plY3QgaXMgbm8gbW9yZSB0aGFuIHRoZSBzdW0gb2Ygd2hhdCBpdHMgY29udHJpYnV0b3JzIHB1dCBpbnRvIGl0LiAgVGhlCitMaW51eCBrZXJuZWwgaGFzIHByb2dyZXNzZWQgYXMgcXVpY2tseSBhbmQgYXMgd2VsbCBhcyBpdCBoYXMgYmVjYXVzZSBpdCBoYXMKK2JlZW4gaGVscGVkIGJ5IGFuIGltcHJlc3NpdmVseSBsYXJnZSBncm91cCBvZiBkZXZlbG9wZXJzLCBhbGwgb2Ygd2hvbSBhcmUKK3dvcmtpbmcgdG8gbWFrZSBpdCBiZXR0ZXIuICBUaGUga2VybmVsIGlzIGEgcHJlbWllciBleGFtcGxlIG9mIHdoYXQgY2FuIGJlCitkb25lIHdoZW4gdGhvdXNhbmRzIG9mIHBlb3BsZSB3b3JrIHRvZ2V0aGVyIHRvd2FyZCBhIGNvbW1vbiBnb2FsLgorCitUaGUga2VybmVsIGNhbiBhbHdheXMgYmVuZWZpdCBmcm9tIGEgbGFyZ2VyIGRldmVsb3BlciBiYXNlLCB0aG91Z2guICBUaGVyZQoraXMgYWx3YXlzIG1vcmUgd29yayB0byBkby4gIEJ1dCwganVzdCBhcyBpbXBvcnRhbnRseSwgbW9zdCBvdGhlcgorcGFydGljaXBhbnRzIGluIHRoZSBMaW51eCBlY29zeXN0ZW0gY2FuIGJlbmVmaXQgdGhyb3VnaCBjb250cmlidXRpbmcgdG8gdGhlCitrZXJuZWwuICBHZXR0aW5nIGNvZGUgaW50byB0aGUgbWFpbmxpbmUgaXMgdGhlIGtleSB0byBoaWdoZXIgY29kZSBxdWFsaXR5LAorbG93ZXIgbWFpbnRlbmFuY2UgYW5kIGRpc3RyaWJ1dGlvbiBjb3N0cywgYSBoaWdoZXIgbGV2ZWwgb2YgaW5mbHVlbmNlIG92ZXIKK3RoZSBkaXJlY3Rpb24gb2Yga2VybmVsIGRldmVsb3BtZW50LCBhbmQgbW9yZS4gIEl0IGlzIGEgc2l0dWF0aW9uIHdoZXJlCitldmVyeWJvZHkgaW52b2x2ZWQgd2lucy4gIEZpcmUgdXAgeW91ciBlZGl0b3IgYW5kIGNvbWUgam9pbiB1czsgeW91IHdpbGwgYmUKK21vcmUgdGhhbiB3ZWxjb21lLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2NvbmYucHkgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvY29uZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjRhMTJkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2NvbmYucHkKQEAgLTAsMCArMSwxMCBAQAorIyAtKi0gY29kaW5nOiB1dGYtODsgbW9kZTogcHl0aG9uIC0qLQorCitwcm9qZWN0ID0gJ0xpbnV4IEtlcm5lbCBEZXZlbG9wbWVudCBEb2N1bWVudGF0aW9uJworCit0YWdzLmFkZCgic3VicHJvamVjdCIpCisKK2xhdGV4X2RvY3VtZW50cyA9IFsKKyAgICAoJ2luZGV4JywgJ2RldmVsb3BtZW50LXByb2Nlc3MudGV4JywgJ0xpbnV4IEtlcm5lbCBEZXZlbG9wbWVudCBEb2N1bWVudGF0aW9uJywKKyAgICAgJ1RoZSBrZXJuZWwgZGV2ZWxvcG1lbnQgY29tbXVuaXR5JywgJ21hbnVhbCcpLAorXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2RldmVsb3BtZW50LXByb2Nlc3MucnN0IGIvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2RldmVsb3BtZW50LXByb2Nlc3MucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTM5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmVsb3BtZW50LXByb2Nlc3MvZGV2ZWxvcG1lbnQtcHJvY2Vzcy5yc3QKQEAgLTAsMCArMSwyOSBAQAorLi4gX2RldmVsb3BtZW50X3Byb2Nlc3NfbWFpbjoKKworQSBndWlkZSB0byB0aGUgS2VybmVsIERldmVsb3BtZW50IFByb2Nlc3MKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbnRlbnRzOgorCisuLiB0b2N0cmVlOjoKKyAgIDpudW1iZXJlZDoKKyAgIDptYXhkZXB0aDogMgorCisgICAxLkludHJvCisgICAyLlByb2Nlc3MKKyAgIDMuRWFybHktc3RhZ2UKKyAgIDQuQ29kaW5nCisgICA1LlBvc3RpbmcKKyAgIDYuRm9sbG93dGhyb3VnaAorICAgNy5BZHZhbmNlZFRvcGljcworICAgOC5Db25jbHVzaW9uCisKK1RoZSBwdXJwb3NlIG9mIHRoaXMgZG9jdW1lbnQgaXMgdG8gaGVscCBkZXZlbG9wZXJzIChhbmQgdGhlaXIgbWFuYWdlcnMpCit3b3JrIHdpdGggdGhlIGRldmVsb3BtZW50IGNvbW11bml0eSB3aXRoIGEgbWluaW11bSBvZiBmcnVzdHJhdGlvbi4gIEl0IGlzCithbiBhdHRlbXB0IHRvIGRvY3VtZW50IGhvdyB0aGlzIGNvbW11bml0eSB3b3JrcyBpbiBhIHdheSB3aGljaCBpcworYWNjZXNzaWJsZSB0byB0aG9zZSB3aG8gYXJlIG5vdCBpbnRpbWF0ZWx5IGZhbWlsaWFyIHdpdGggTGludXgga2VybmVsCitkZXZlbG9wbWVudCAob3IsIGluZGVlZCwgZnJlZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBpbiBnZW5lcmFsKS4gIFdoaWxlCit0aGVyZSBpcyBzb21lIHRlY2huaWNhbCBtYXRlcmlhbCBoZXJlLCB0aGlzIGlzIHZlcnkgbXVjaCBhIHByb2Nlc3Mtb3JpZW50ZWQKK2Rpc2N1c3Npb24gd2hpY2ggZG9lcyBub3QgcmVxdWlyZSBhIGRlZXAga25vd2xlZGdlIG9mIGtlcm5lbCBwcm9ncmFtbWluZyB0bwordW5kZXJzdGFuZC4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZlbG9wbWVudC1wcm9jZXNzL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy9pbmRleC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3NDc1ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2ZWxvcG1lbnQtcHJvY2Vzcy9pbmRleC5yc3QKQEAgLTAsMCArMSw5IEBACitMaW51eCBLZXJuZWwgRGV2ZWxvcG1lbnQgRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ29udGVudHM6CisKKy4uIHRvY3RyZWU6OgorICAgOm1heGRlcHRoOiAyCisKKyAgIGRldmVsb3BtZW50LXByb2Nlc3MKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYWx0ZXJhL3NvY2ZwZ2EtZWNjbWdyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYWx0ZXJhL3NvY2ZwZ2EtZWNjbWdyLnR4dAppbmRleCBiNTQ1ODU2Li40YTE3MTRmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2FsdGVyYS9zb2NmcGdhLWVjY21nci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hbHRlcmEvc29jZnBnYS1lY2NtZ3IudHh0CkBAIC05MCw2ICs5MCw0NyBAQAogLSBpbnRlcnJ1cHRzICAgICAgOiBTaG91bGQgYmUgc2luZ2xlIGJpdCBlcnJvciBpbnRlcnJ1cHQsIHRoZW4gZG91YmxlIGJpdCBlcnJvcgogCWludGVycnVwdCwgaW4gdGhpcyBvcmRlci4KIAorTkFORCBGSUZPIEVDQworUmVxdWlyZWQgUHJvcGVydGllczoKKy0gY29tcGF0aWJsZSAgICAgIDogU2hvdWxkIGJlICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiCistIHJlZyAgICAgICAgICAgICA6IEFkZHJlc3MgYW5kIHNpemUgZm9yIEVDQyBibG9jayByZWdpc3RlcnMuCistIGFsdHIsZWNjLXBhcmVudCA6IHBoYW5kbGUgdG8gcGFyZW50IE5BTkQgbm9kZS4KKy0gaW50ZXJydXB0cyAgICAgIDogU2hvdWxkIGJlIHNpbmdsZSBiaXQgZXJyb3IgaW50ZXJydXB0LCB0aGVuIGRvdWJsZSBiaXQgZXJyb3IKKwlpbnRlcnJ1cHQsIGluIHRoaXMgb3JkZXIuCisKK0RNQSBGSUZPIEVDQworUmVxdWlyZWQgUHJvcGVydGllczoKKy0gY29tcGF0aWJsZSAgICAgIDogU2hvdWxkIGJlICJhbHRyLHNvY2ZwZ2EtZG1hLWVjYyIKKy0gcmVnICAgICAgICAgICAgIDogQWRkcmVzcyBhbmQgc2l6ZSBmb3IgRUNDIGJsb2NrIHJlZ2lzdGVycy4KKy0gYWx0cixlY2MtcGFyZW50IDogcGhhbmRsZSB0byBwYXJlbnQgRE1BIG5vZGUuCistIGludGVycnVwdHMgICAgICA6IFNob3VsZCBiZSBzaW5nbGUgYml0IGVycm9yIGludGVycnVwdCwgdGhlbiBkb3VibGUgYml0IGVycm9yCisJaW50ZXJydXB0LCBpbiB0aGlzIG9yZGVyLgorCitVU0IgRklGTyBFQ0MKK1JlcXVpcmVkIFByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgICAgICA6IFNob3VsZCBiZSAiYWx0cixzb2NmcGdhLXVzYi1lY2MiCistIHJlZyAgICAgICAgICAgICA6IEFkZHJlc3MgYW5kIHNpemUgZm9yIEVDQyBibG9jayByZWdpc3RlcnMuCistIGFsdHIsZWNjLXBhcmVudCA6IHBoYW5kbGUgdG8gcGFyZW50IFVTQiBub2RlLgorLSBpbnRlcnJ1cHRzICAgICAgOiBTaG91bGQgYmUgc2luZ2xlIGJpdCBlcnJvciBpbnRlcnJ1cHQsIHRoZW4gZG91YmxlIGJpdCBlcnJvcgorCWludGVycnVwdCwgaW4gdGhpcyBvcmRlci4KKworUVNQSSBGSUZPIEVDQworUmVxdWlyZWQgUHJvcGVydGllczoKKy0gY29tcGF0aWJsZSAgICAgIDogU2hvdWxkIGJlICJhbHRyLHNvY2ZwZ2EtcXNwaS1lY2MiCistIHJlZyAgICAgICAgICAgICA6IEFkZHJlc3MgYW5kIHNpemUgZm9yIEVDQyBibG9jayByZWdpc3RlcnMuCistIGFsdHIsZWNjLXBhcmVudCA6IHBoYW5kbGUgdG8gcGFyZW50IFFTUEkgbm9kZS4KKy0gaW50ZXJydXB0cyAgICAgIDogU2hvdWxkIGJlIHNpbmdsZSBiaXQgZXJyb3IgaW50ZXJydXB0LCB0aGVuIGRvdWJsZSBiaXQgZXJyb3IKKwlpbnRlcnJ1cHQsIGluIHRoaXMgb3JkZXIuCisKK1NETU1DIEZJRk8gRUNDCitSZXF1aXJlZCBQcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlICAgICAgOiBTaG91bGQgYmUgImFsdHIsc29jZnBnYS1zZG1tYy1lY2MiCistIHJlZyAgICAgICAgICAgICA6IEFkZHJlc3MgYW5kIHNpemUgZm9yIEVDQyBibG9jayByZWdpc3RlcnMuCistIGFsdHIsZWNjLXBhcmVudCA6IHBoYW5kbGUgdG8gcGFyZW50IFNEL01NQyBub2RlLgorLSBpbnRlcnJ1cHRzICAgICAgOiBTaG91bGQgYmUgc2luZ2xlIGJpdCBlcnJvciBpbnRlcnJ1cHQsIHRoZW4gZG91YmxlIGJpdCBlcnJvcgorCWludGVycnVwdCwgaW4gdGhpcyBvcmRlciBmb3IgcG9ydCBBLCBhbmQgdGhlbiBzaW5nbGUgYml0IGVycm9yIGludGVycnVwdCwKKwl0aGVuIGRvdWJsZSBiaXQgZXJyb3IgaW50ZXJydXB0IGluIHRoaXMgb3JkZXIgZm9yIHBvcnQgQi4KKwogRXhhbXBsZToKIAogCWVjY21ncjogZWNjbWdyQGZmZDA2MDAwIHsKQEAgLTEzMiw0ICsxNzMsNjEgQEAKIAkJCWludGVycnVwdHMgPSA8NSBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKIAkJCQkgICAgIDwzNyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJfTsKKworCQluYW5kLWJ1Zi1lY2NAZmY4YzIwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiOworCQkJcmVnID0gPDB4ZmY4YzIwMDAgMHg0MDA+OworCQkJYWx0cixlY2MtcGFyZW50ID0gPCZuYW5kPjsKKwkJCWludGVycnVwdHMgPSA8MTEgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8NDMgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisKKwkJbmFuZC1yZC1lY2NAZmY4YzI0MDAgeworCQkJY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiOworCQkJcmVnID0gPDB4ZmY4YzI0MDAgMHg0MDA+OworCQkJYWx0cixlY2MtcGFyZW50ID0gPCZuYW5kPjsKKwkJCWludGVycnVwdHMgPSA8MTMgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8NDUgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisKKwkJbmFuZC13ci1lY2NAZmY4YzI4MDAgeworCQkJY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2EtbmFuZC1lY2MiOworCQkJcmVnID0gPDB4ZmY4YzI4MDAgMHg0MDA+OworCQkJYWx0cixlY2MtcGFyZW50ID0gPCZuYW5kPjsKKwkJCWludGVycnVwdHMgPSA8MTIgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8NDQgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CisKKwkJZG1hLWVjY0BmZjhjODAwMCB7CisJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1kbWEtZWNjIjsKKwkJCXJlZyA9IDwweGZmOGM4MDAwIDB4NDAwPjsKKwkJCWFsdHIsZWNjLXBhcmVudCA9IDwmcGRtYT47CisJCQlpbnRlcnJ1cHRzID0gPDEwIElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJCSAgICAgPDQyIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCisJCXVzYjAtZWNjQGZmOGM4ODAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYWx0cixzb2NmcGdhLXVzYi1lY2MiOworCQkJcmVnID0gPDB4ZmY4Yzg4MDAgMHg0MDA+OworCQkJYWx0cixlY2MtcGFyZW50ID0gPCZ1c2IwPjsKKwkJCWludGVycnVwdHMgPSA8MiBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDwzNCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKworCQlxc3BpLWVjY0BmZjhjODQwMCB7CisJCQljb21wYXRpYmxlID0gImFsdHIsc29jZnBnYS1xc3BpLWVjYyI7CisJCQlyZWcgPSA8MHhmZjhjODQwMCAweDQwMD47CisJCQlhbHRyLGVjYy1wYXJlbnQgPSA8JnFzcGk+OworCQkJaW50ZXJydXB0cyA9IDwxNCBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDw0NiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJfTsKKworCQlzZG1tYy1lY2NAZmY4YzJjMDAgeworCQkJY29tcGF0aWJsZSA9ICJhbHRyLHNvY2ZwZ2Etc2RtbWMtZWNjIjsKKwkJCXJlZyA9IDwweGZmOGMyYzAwIDB4NDAwPjsKKwkJCWFsdHIsZWNjLXBhcmVudCA9IDwmbW1jPjsKKwkJCWludGVycnVwdHMgPSA8MTUgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8NDcgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8MTYgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICA8NDggSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCX07CiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJjaF90aW1lci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2FyY2hfdGltZXIudHh0CmluZGV4IGU3NzQxMjguLmVmNWZiZTkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJjaF90aW1lci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9hcmNoX3RpbWVyLnR4dApAQCAtMjUsNiArMjUsMTIgQEAKIC0gYWx3YXlzLW9uIDogYSBib29sZWFuIHByb3BlcnR5LiBJZiBwcmVzZW50LCB0aGUgdGltZXIgaXMgcG93ZXJlZCB0aHJvdWdoIGFuCiAgIGFsd2F5cy1vbiBwb3dlciBkb21haW4sIHRoZXJlZm9yZSBpdCBuZXZlciBsb3NlcyBjb250ZXh0LgogCistIGZzbCxlcnJhdHVtLWEwMDg1ODUgOiBBIGJvb2xlYW4gcHJvcGVydHkuIEluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YKKyAgUW9ySVEgZXJyYXR1bSBBLTAwODU4NSwgd2hpY2ggc2F5cyB0aGF0IHJlYWRpbmcgdGhlIGNvdW50ZXIgaXMKKyAgdW5yZWxpYWJsZSB1bmxlc3MgdGhlIHNhbWUgdmFsdWUgaXMgcmV0dXJuZWQgYnkgYmFjay10by1iYWNrIHJlYWRzLgorICBUaGlzIGFsc28gYWZmZWN0cyB3cml0ZXMgdG8gdGhlIHR2YWwgcmVnaXN0ZXIsIGR1ZSB0byB0aGUgaW1wbGljaXQKKyAgY291bnRlciByZWFkLgorCiAqKiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogCiAtIGFybSxjcHUtcmVnaXN0ZXJzLW5vdC1mdy1jb25maWd1cmVkIDogRmlybXdhcmUgZG9lcyBub3QgaW5pdGlhbGl6ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxhcG1peGVkc3lzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssYXBtaXhlZHN5cy50eHQKaW5kZXggOTM2MTY2Zi4uY2IwMDU0YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxhcG1peGVkc3lzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGFwbWl4ZWRzeXMudHh0CkBAIC01LDcgKzUsOCBAQAogCiBSZXF1aXJlZCBQcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZjoKKwktICJtZWRpYXRlayxtdDI3MDEtYXBtaXhlZHN5cyIKIAktICJtZWRpYXRlayxtdDgxMzUtYXBtaXhlZHN5cyIKIAktICJtZWRpYXRlayxtdDgxNzMtYXBtaXhlZHN5cyIKIC0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssYmRwc3lzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssYmRwc3lzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTM3MTk2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxiZHBzeXMudHh0CkBAIC0wLDAgKzEsMjIgQEAKK01lZGlhdGVrIGJkcHN5cyBjb250cm9sbGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBNZWRpYXRlayBiZHBzeXMgY29udHJvbGxlciBwcm92aWRlcyB2YXJpb3VzIGNsb2NrcyB0byB0aGUgc3lzdGVtLgorCitSZXF1aXJlZCBQcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKwktICJtZWRpYXRlayxtdDI3MDEtYmRwc3lzIiwgInN5c2NvbiIKKy0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKKworVGhlIGJkcHN5cyBjb250cm9sbGVyIHVzZXMgdGhlIGNvbW1vbiBjbGsgYmluZGluZyBmcm9tCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CitUaGUgYXZhaWxhYmxlIGNsb2NrcyBhcmUgZGVmaW5lZCBpbiBkdC1iaW5kaW5ncy9jbG9jay9tdCotY2xrLmguCisKK0V4YW1wbGU6CisKK2JkcHN5czogY2xvY2stY29udHJvbGxlckAxYzAwMDAwMCB7CisJY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDI3MDEtYmRwc3lzIiwgInN5c2NvbiI7CisJcmVnID0gPDAgMHgxYzAwMDAwMCAwIDB4MTAwMD47CisJI2Nsb2NrLWNlbGxzID0gPDE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssZXRoc3lzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssZXRoc3lzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhmM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxldGhzeXMudHh0CkBAIC0wLDAgKzEsMjIgQEAKK01lZGlhdGVrIGV0aHN5cyBjb250cm9sbGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBNZWRpYXRlayBldGhzeXMgY29udHJvbGxlciBwcm92aWRlcyB2YXJpb3VzIGNsb2NrcyB0byB0aGUgc3lzdGVtLgorCitSZXF1aXJlZCBQcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKwktICJtZWRpYXRlayxtdDI3MDEtZXRoc3lzIiwgInN5c2NvbiIKKy0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKKworVGhlIGV0aHN5cyBjb250cm9sbGVyIHVzZXMgdGhlIGNvbW1vbiBjbGsgYmluZGluZyBmcm9tCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CitUaGUgYXZhaWxhYmxlIGNsb2NrcyBhcmUgZGVmaW5lZCBpbiBkdC1iaW5kaW5ncy9jbG9jay9tdCotY2xrLmguCisKK0V4YW1wbGU6CisKK2V0aHN5czogY2xvY2stY29udHJvbGxlckAxYjAwMDAwMCB7CisJY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDI3MDEtZXRoc3lzIiwgInN5c2NvbiI7CisJcmVnID0gPDAgMHgxYjAwMDAwMCAwIDB4MTAwMD47CisJI2Nsb2NrLWNlbGxzID0gPDE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaGlmc3lzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaGlmc3lzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWVkN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxoaWZzeXMudHh0CkBAIC0wLDAgKzEsMjQgQEAKK01lZGlhdGVrIGhpZnN5cyBjb250cm9sbGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBNZWRpYXRlayBoaWZzeXMgY29udHJvbGxlciBwcm92aWRlcyB2YXJpb3VzIGNsb2NrcyBhbmQgcmVzZXQKK291dHB1dHMgdG8gdGhlIHN5c3RlbS4KKworUmVxdWlyZWQgUHJvcGVydGllczoKKworLSBjb21wYXRpYmxlOiBTaG91bGQgYmU6CisJLSAibWVkaWF0ZWssbXQyNzAxLWhpZnN5cyIsICJzeXNjb24iCistICNjbG9jay1jZWxsczogTXVzdCBiZSAxCisKK1RoZSBoaWZzeXMgY29udHJvbGxlciB1c2VzIHRoZSBjb21tb24gY2xrIGJpbmRpbmcgZnJvbQorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dAorVGhlIGF2YWlsYWJsZSBjbG9ja3MgYXJlIGRlZmluZWQgaW4gZHQtYmluZGluZ3MvY2xvY2svbXQqLWNsay5oLgorCitFeGFtcGxlOgorCitoaWZzeXM6IGNsb2NrLWNvbnRyb2xsZXJAMWEwMDAwMDAgeworCWNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQyNzAxLWhpZnN5cyIsICJzeXNjb24iOworCXJlZyA9IDwwIDB4MWEwMDAwMDAgMCAweDEwMDA+OworCSNjbG9jay1jZWxscyA9IDwxPjsKKwkjcmVzZXQtY2VsbHMgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxpbWdzeXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxpbWdzeXMudHh0CmluZGV4IGIxZjJjZTEuLmY2YTkxNjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaW1nc3lzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGltZ3N5cy50eHQKQEAgLTUsNyArNSw4IEBACiAKIFJlcXVpcmVkIFByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorCS0gIm1lZGlhdGVrLG10MjcwMS1pbWdzeXMiLCAic3lzY29uIgogCS0gIm1lZGlhdGVrLG10ODE3My1pbWdzeXMiLCAic3lzY29uIgogLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLGluZnJhY2ZnLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaW5mcmFjZmcudHh0CmluZGV4IGFhZjhkMTQuLjE2MjBlYzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaW5mcmFjZmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssaW5mcmFjZmcudHh0CkBAIC02LDcgKzYsOCBAQAogCiBSZXF1aXJlZCBQcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZjoKKwktICJtZWRpYXRlayxtdDI3MDEtaW5mcmFjZmciLCAic3lzY29uIgogCS0gIm1lZGlhdGVrLG10ODEzNS1pbmZyYWNmZyIsICJzeXNjb24iCiAJLSAibWVkaWF0ZWssbXQ4MTczLWluZnJhY2ZnIiwgInN5c2NvbiIKIC0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssbW1zeXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxtbXN5cy50eHQKaW5kZXggNDM4NTk0Ni4uNjdkZDJlNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxtbXN5cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxtbXN5cy50eHQKQEAgLTUsNyArNSw4IEBACiAKIFJlcXVpcmVkIFByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorCS0gIm1lZGlhdGVrLG10MjcwMS1tbXN5cyIsICJzeXNjb24iCiAJLSAibWVkaWF0ZWssbXQ4MTczLW1tc3lzIiwgInN5c2NvbiIKIC0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxwZXJpY2ZnLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWsscGVyaWNmZy50eHQKaW5kZXggMmY2ZmY4Ni4uZTQ5NDM2NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayxwZXJpY2ZnLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLHBlcmljZmcudHh0CkBAIC02LDcgKzYsOCBAQAogCiBSZXF1aXJlZCBQcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZjoKKwktICJtZWRpYXRlayxtdDI3MDEtcGVyaWNmZyIsICJzeXNjb24iCiAJLSAibWVkaWF0ZWssbXQ4MTM1LXBlcmljZmciLCAic3lzY29uIgogCS0gIm1lZGlhdGVrLG10ODE3My1wZXJpY2ZnIiwgInN5c2NvbiIKIC0gI2Nsb2NrLWNlbGxzOiBNdXN0IGJlIDEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssdG9wY2tnZW4udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx0b3Bja2dlbi50eHQKaW5kZXggZjllOTE3OS4uOWYyZmU3OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx0b3Bja2dlbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx0b3Bja2dlbi50eHQKQEAgLTUsNyArNSw4IEBACiAKIFJlcXVpcmVkIFByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlOgorLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgb25lIG9mOgorCS0gIm1lZGlhdGVrLG10MjcwMS10b3Bja2dlbiIKIAktICJtZWRpYXRlayxtdDgxMzUtdG9wY2tnZW4iCiAJLSAibWVkaWF0ZWssbXQ4MTczLXRvcGNrZ2VuIgogLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx2ZGVjc3lzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vbWVkaWF0ZWsvbWVkaWF0ZWssdmRlY3N5cy50eHQKaW5kZXggMWZhYWNmMS4uMjQ0MGY3MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9tZWRpYXRlay9tZWRpYXRlayx2ZGVjc3lzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL21lZGlhdGVrL21lZGlhdGVrLHZkZWNzeXMudHh0CkBAIC01LDcgKzUsOCBAQAogCiBSZXF1aXJlZCBQcm9wZXJ0aWVzOgogCi0tIGNvbXBhdGlibGU6IFNob3VsZCBiZToKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZjoKKwktICJtZWRpYXRlayxtdDI3MDEtdmRlY3N5cyIsICJzeXNjb24iCiAJLSAibWVkaWF0ZWssbXQ4MTczLXZkZWNzeXMiLCAic3lzY29uIgogLSAjY2xvY2stY2VsbHM6IE11c3QgYmUgMQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYW1sb2dpYyxneGJiLWFvY2xrYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYW1sb2dpYyxneGJiLWFvY2xrYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1ZDMxYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hbWxvZ2ljLGd4YmItYW9jbGtjLnR4dApAQCAtMCwwICsxLDQ1IEBACisqIEFtbG9naWMgR1hCQiBBTyBDbG9jayBhbmQgUmVzZXQgVW5pdAorCitUaGUgQW1sb2dpYyBHWEJCIEFPIGNsb2NrIGNvbnRyb2xsZXIgZ2VuZXJhdGVzIGFuZCBzdXBwbGllcyBjbG9jayB0byB2YXJpb3VzCitjb250cm9sbGVycyB3aXRoaW4gdGhlIEFsd2F5cy1PbiBwYXJ0IG9mIHRoZSBTb0MuCisKK1JlcXVpcmVkIFByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJhbWxvZ2ljLGd4YmItYW9jbGtjIgorLSByZWc6IHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY2xvY2sgY29udHJvbGxlciBhbmQgbGVuZ3RoIG9mIG1lbW9yeQorICAgICAgIG1hcHBlZCByZWdpb24uCisKKy0gI2Nsb2NrLWNlbGxzOiBzaG91bGQgYmUgMS4KKworRWFjaCBjbG9jayBpcyBhc3NpZ25lZCBhbiBpZGVudGlmaWVyIGFuZCBjbGllbnQgbm9kZXMgY2FuIHVzZSB0aGlzIGlkZW50aWZpZXIKK3RvIHNwZWNpZnkgdGhlIGNsb2NrIHdoaWNoIHRoZXkgY29uc3VtZS4gQWxsIGF2YWlsYWJsZSBjbG9ja3MgYXJlIGRlZmluZWQgYXMKK3ByZXByb2Nlc3NvciBtYWNyb3MgaW4gdGhlIGR0LWJpbmRpbmdzL2Nsb2NrL2d4YmItYW9jbGtjLmggaGVhZGVyIGFuZCBjYW4gYmUKK3VzZWQgaW4gZGV2aWNlIHRyZWUgc291cmNlcy4KKworLSAjcmVzZXQtY2VsbHM6IHNob3VsZCBiZSAxLgorCitFYWNoIHJlc2V0IGlzIGFzc2lnbmVkIGFuIGlkZW50aWZpZXIgYW5kIGNsaWVudCBub2RlcyBjYW4gdXNlIHRoaXMgaWRlbnRpZmllcgordG8gc3BlY2lmeSB0aGUgcmVzZXQgd2hpY2ggdGhleSBjb25zdW1lLiBBbGwgYXZhaWxhYmxlIHJlc2V0cyBhcmUgZGVmaW5lZCBhcworcHJlcHJvY2Vzc29yIG1hY3JvcyBpbiB0aGUgZHQtYmluZGluZ3MvcmVzZXQvZ3hiYi1hb2Nsa2MuaCBoZWFkZXIgYW5kIGNhbiBiZQordXNlZCBpbiBkZXZpY2UgdHJlZSBzb3VyY2VzLgorCitFeGFtcGxlOiBBTyBDbG9jayBjb250cm9sbGVyIG5vZGU6CisKKwljbGtjX0FPOiBjbG9jay1jb250cm9sbGVyQDA0MCB7CisJCWNvbXBhdGlibGUgPSAiYW1sb2dpYyxneGJiLWFvY2xrYyI7CisJCXJlZyA9IDwweDAgMHgwNDAgMHgwIDB4ND47CisJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJI3Jlc2V0LWNlbGxzID0gPDE+OworCX07CisKK0V4YW1wbGU6IFVBUlQgY29udHJvbGxlciBub2RlIHRoYXQgY29uc3VtZXMgdGhlIGNsb2NrIGFuZCByZXNldCBnZW5lcmF0ZWQKKyAgYnkgdGhlIGNsb2NrIGNvbnRyb2xsZXI6CisKKwl1YXJ0X0FPOiBzZXJpYWxANGMwIHsKKwkJY29tcGF0aWJsZSA9ICJhbWxvZ2ljLG1lc29uLXVhcnQiOworCQlyZWcgPSA8MHg0YzAgMHgxND47CisJCWludGVycnVwdHMgPSA8MCA5MCAxPjsKKwkJY2xvY2tzID0gPCZjbGtjX0FPIENMS0lEX0FPX1VBUlQxPjsKKwkJcmVzZXRzID0gPCZjbGtjX0FPIFJFU0VUX0FPX1VBUlQxPjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybS1zeXNjb24taWNzdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtLXN5c2Nvbi1pY3N0LnR4dAppbmRleCA4YjcxNzdjLi4yNzQ2ODExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtLXN5c2Nvbi1pY3N0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtLXN5c2Nvbi1pY3N0LnR4dApAQCAtNSwyMCArNSw1MCBAQAogcmVmZXJlbmNlIGRlc2lnbnMgYnkgYWRkaW5nIHNwZWNpYWwgY29udHJvbCByZWdpc3RlcnMgdGhhdCBtYW5hZ2Ugc3VjaAogb3NjaWxsYXRvcnMgdG8gdGhlaXIgc3lzdGVtIGNvbnRyb2xsZXJzLgogCi1UaGUgQVJNIHN5c3RlbSBjb250cm9sbGVyIGNvbnRhaW5zIGxvZ2ljIHRvIHNlcmlhbGl6ZSBhbmQgaW5pdGlhbGl6ZQorVGhlIHZhcmlvdXMgQVJNIHN5c3RlbSBjb250cm9sbGVycyBjb250YWluIGxvZ2ljIHRvIHNlcmlhbGl6ZSBhbmQgaW5pdGlhbGl6ZQogYW4gSUNTVCBjbG9jayByZXF1ZXN0IGFmdGVyIGEgd3JpdGUgdG8gdGhlIDMyIGJpdCByZWdpc3RlciBhdCBhbiBvZmZzZXQKIGludG8gdGhlIHN5c3RlbSBjb250cm9sbGVyLiBGdXJ0aGVybW9yZSwgdG8gZXZlbiBiZSBhYmxlIHRvIGFsdGVyIG9uZSBvZgogdGhlc2UgZnJlcXVlbmNpZXMsIHRoZSBzeXN0ZW0gY29udHJvbGxlciBtdXN0IGZpcnN0IGJlIHVubG9ja2VkIGJ5CiB3cml0aW5nIGEgc3BlY2lhbCB0b2tlbiB0byBhbm90aGVyIG9mZnNldCBpbiB0aGUgc3lzdGVtIGNvbnRyb2xsZXIuCiAKK1NvbWUgQVJNIGhhcmR3YXJlIGNvbnRhaW4gc3BlY2lhbCB2ZXJzaW9ucyBvZiB0aGUgc2VyaWFsIGludGVyZmFjZSB0aGF0IG9ubHkKK2Nvbm5lY3RzIHRoZSBsb3cgOCBiaXRzIG9mIHRoZSBWRFcgKG1pc3Npbmcgb25lIGJpdCksIGhhcmR3aXJlcyBSRFcgdG8KK2RpZmZlcmVudCB2YWx1ZXMgYW5kIHNvbWV0aW1lcyBhbHNvIGhhcmR3aXJlIHRoZSBvdXRwdXQgZGl2aWRlci4gVGhleQordGhlcmVmb3JlIGhhdmUgc3BlY2lhbCBjb21wYXRpYmxlIHN0cmluZ3MgYXMgcGVyIHRoaXMgdGFibGUgKHRoZSBPRCB2YWx1ZSBpcwordGhlIHZhbHVlIG9uIHRoZSBwaW5zLCBub3QgdGhlIHJlc3VsdGluZyBvdXRwdXQgZGl2aWRlcik6CisKK0hhcmR3YXJlIHZhcmlhbnQ6ICAgICAgICBSRFcgICAgIE9EICAgICAgICAgIFZEVworCitJbnRlZ3JhdG9yL0FQICAgICAgICAgICAgMjIgICAgICAxICAgICAgICAgICBCaXQgOCAwLCByZXN0IHZhcmlhYmxlCitpbnRlZ3JhdG9yYXAtY20KKworSW50ZWdyYXRvci9BUCAgICAgICAgICAgIDQ2ICAgICAgMyAgICAgICAgICAgQml0IDggMCwgcmVzdCB2YXJpYWJsZQoraW50ZWdyYXRvcmFwLXN5cworCitJbnRlZ3JhdG9yL0FQICAgICAgICAgICAgMjIgb3IgICAxICAgICAgICAgICAxNyBvciAoMzMgb3IgMjUgTUh6KQoraW50ZWdyYXRvcmFwLXBjaSAgICAgICAgIDE0ICAgICAgMSAgICAgICAgICAgMTQKKworSW50ZWdyYXRvci9DUCAgICAgICAgICAgIDIyICAgICAgdmFyaWFibGUgICAgQml0IDggMCwgcmVzdCB2YXJpYWJsZQoraW50ZWdyYXRvcmNwLWNtLWNvcmUKKworSW50ZWdyYXRvci9DUCAgICAgICAgICAgIDIyICAgICAgdmFyaWFibGUgICAgQml0IDggMCwgcmVzdCB2YXJpYWJsZQoraW50ZWdyYXRvcmNwLWNtLW1lbQorCiBUaGUgSUNTVCBvc2NpbGxhdG9yIG11c3QgYmUgcHJvdmlkZWQgaW5zaWRlIGEgc3lzdGVtIGNvbnRyb2xsZXIgbm9kZS4KIAogUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogbXVzdCBiZSBvbmUgb2YKKyAgImFybSxzeXNjb24taWNzdDUyNSIKKyAgImFybSxzeXNjb24taWNzdDMwNyIKKyAgImFybSxzeXNjb24taWNzdDUyNS1pbnRlZ3JhdG9yYXAtY20iCisgICJhcm0sc3lzY29uLWljc3Q1MjUtaW50ZWdyYXRvcmFwLXN5cyIKKyAgImFybSxzeXNjb24taWNzdDUyNS1pbnRlZ3JhdG9yYXAtcGNpIgorICAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JjcC1jbS1jb3JlIgorICAiYXJtLHN5c2Nvbi1pY3N0NTI1LWludGVncmF0b3JjcC1jbS1tZW0iCiAtIGxvY2stb2Zmc2V0OiB0aGUgb2Zmc2V0IGFkZHJlc3MgaW50byB0aGUgc3lzdGVtIGNvbnRyb2xsZXIgd2hlcmUgdGhlCiAgIHVubG9ja2luZyByZWdpc3RlciBpcyBsb2NhdGVkCiAtIHZjby1vZmZzZXQ6IHRoZSBvZmZzZXQgYWRkcmVzcyBpbnRvIHRoZSBzeXN0ZW0gY29udHJvbGxlciB3aGVyZSB0aGUKICAgSUNTVCBjb250cm9sIHJlZ2lzdGVyIGlzIGxvY2F0ZWQgKGV2ZW4gMzIgYml0IGFkZHJlc3MpCi0tIGNvbXBhdGlibGU6IG11c3QgYmUgb25lIG9mICJhcm0sc3lzY29uLWljc3Q1MjUiIG9yICJhcm0sc3lzY29uLWljc3QzMDciCiAtICNjbG9jay1jZWxsczogbXVzdCBiZSA8MD4KIC0gY2xvY2tzOiBwYXJlbnQgY2xvY2ssIHNpbmNlIHRoZSBJQ1NUIG5lZWRzIGEgcGFyZW50IGNsb2NrIHRvIGRlcml2ZSBpdHMKICAgZnJlcXVlbmN5IGZyb20sIHRoaXMgYXR0cmlidXRlIGlzIGNvbXB1bHNvcnkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC1wZXJpcGgtY2xvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAtcGVyaXBoLWNsb2NrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTMzNzBiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAtcGVyaXBoLWNsb2NrLnR4dApAQCAtMCwwICsxLDcwIEBACisqIFBlcmlwaGVyYWwgQ2xvY2sgYmluZGluZ3MgZm9yIE1hcnZlbGwgQXJtYWRhIDM3eHggU29DcworCitNYXJ2ZWxsIEFybWFkYSAzN3h4IFNvQ3MgcHJvdmlkZSBwZXJpcGhlcmFsIGNsb2NrcyB3aGljaCBhcmUKK3VzZWQgYXMgY2xvY2sgc291cmNlIGZvciB0aGUgcGVyaXBoZXJhbCBvZiB0aGUgU29DLgorCitUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBibG9ja3MgYXNzb2NpYXRlZCB0byBub3J0aCBicmlkZ2UgYW5kIHNvdXRoCiticmlkZ2UuCisKK1RoZSBwZXJpcGhlcmFsIGNsb2NrIGNvbnN1bWVyIHNob3VsZCBzcGVjaWZ5IHRoZSBkZXNpcmVkIGNsb2NrIGJ5CitoYXZpbmcgdGhlIGNsb2NrIElEIGluIGl0cyAiY2xvY2tzIiBwaGFuZGxlIGNlbGwuCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHByb3ZpZGVkIElEcyBmb3IgQXJtYWRhIDM3MCBOb3J0aCBicmlkZ2UgY2xvY2tzOgorSUQJQ2xvY2sgbmFtZQlEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzAJbW1jCQlNTUMgY29udHJvbGxlcgorMQlzYXRhX2hvc3QJU2F0YSBIb3N0CisyCXNlY19hdAkJU2VjdXJpdHkgQVQKKzMJc2FjX2RhcAkJU2VjdXJpdHkgREFQCis0CXRzZWNtCQlTZWN1cml0eSBFbmdpbmUKKzUJc2V0bV90bXgJU2VyaWFsIEVtYmVkZGVkIFRyYWNlIE1vZHVsZQorNglhdnMJCUFkYXB0aXZlIFZvbHRhZ2UgU2NhbGluZworNwlzcWYJCVNQSQorOAlwd20JCVBXTQorOQlpMmNfMgkJSTJDIDIKKzEwCWkyY18xCQlJMkMgMQorMTEJZGRyX3BoeQkJRERSIFBIWQorMTIJZGRyX2ZjbGsJRERSIEYgY2xvY2sKKzEzCXRyYWNlCQlUcmFjZQorMTQJY291bnRlcgkJQ291bnRlcgorMTUJZWlwOTcJCUVJUCA5NworMTYJY3B1CQlDUFUKKworVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgcHJvdmlkZWQgSURzIGZvciBBcm1hZGEgMzcwIFNvdXRoIGJyaWRnZSBjbG9ja3M6CitJRAlDbG9jayBuYW1lCURlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorMAlnYmUtNTAJCTUwIE1IeiBwYXJlbnQgY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQKKzEJZ2JlLWNvcmUJcGFyZW50IGNsb2NrIGZvciBHaWdhYml0IEV0aGVybmV0IGNvcmUKKzIJZ2JlLTEyNQkJMTI1IE1IeiBwYXJlbnQgY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQKKzMJZ2JlMS01MAkJNTAgTUh6IGNsb2NrIGZvciBHaWdhYml0IEV0aGVybmV0IHBvcnQgMQorNAlnYmUwLTUwCQk1MCBNSHogY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQgcG9ydCAwCis1CWdiZTEtMTI1CTEyNSBNSHogY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQgcG9ydCAxCis2CWdiZTAtMTI1CTEyNSBNSHogY2xvY2sgZm9yIEdpZ2FiaXQgRXRoZXJuZXQgcG9ydCAwCis3CWdiZTEtY29yZQlHaWdhYml0IEV0aGVybmV0IGNvcmUgcG9ydCAxCis4CWdiZTAtY29yZQlHaWdhYml0IEV0aGVybmV0IGNvcmUgcG9ydCAwCis5CWdiZS1ibQkJR2lnYWJpdCBFdGhlcm5ldCBCdWZmZXIgTWFuYWdlcgorMTAJc2RpbwkJU0RJTworMTEJdXNiMzItc3ViMi1zeXMJVVNCIDIgY2xvY2sKKzEyCXVzYjMyLXNzLXN5cwlVU0IgMyBjbG9jaworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUgOiBzaGFsbCBiZSAibWFydmVsbCxhcm1hZGEtMzcwMC1wZXJpcGgtY2xvY2stbmIiIGZvciB0aGUKKyAgbm9ydGggYnJpZGdlIGJsb2NrLCBvcgorICAibWFydmVsbCxhcm1hZGEtMzcwMC1wZXJpcGgtY2xvY2stc2IiIGZvciB0aGUgc291dGggYnJpZGdlIGJsb2NrCistIHJlZyA6IG11c3QgYmUgdGhlIHJlZ2lzdGVyIGFkZHJlc3Mgb2YgTm9ydGgvU291dGggQnJpZGdlIENsb2NrIHJlZ2lzdGVyCistICNjbG9jay1jZWxscyA6IGZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAxCisKKy0gY2xvY2tzIDogbGlzdCBvZiB0aGUgcGFyZW50IGNsb2NrIHBoYW5kbGUgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAgVEJHLUEgUCwgVEJHLUIgUCwgVEJHLUEgUywgVEJHLUIgUyBhbmQgZmluYWxseSB0aGUgeHRhbCBjbG9jay4KKworCitFeGFtcGxlOgorCituYl9wZXJpaF9jbGs6IG5iLXBlcmlwaC1jbGtAMTMwMDB7CisJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFkYS0zNzAwLXBlcmlwaC1jbG9jay1uYiI7CisJcmVnID0gPDB4MTMwMDAgMHgxMDAwPjsKKwljbG9ja3MgPSA8JnRiZyAwPiwgPCZ0YmcgMT4sIDwmdGJnIDI+LAorCTwmdGJnIDM+LCA8Jnh0YWxjbGs+OworCSNjbG9jay1jZWxscyA9IDwxPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC10YmctY2xvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAtdGJnLWNsb2NrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmExZDgzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAtdGJnLWNsb2NrLnR4dApAQCAtMCwwICsxLDI3IEBACisqIFRpbWUgQmFzZSBHZW5lcmF0b3IgQ2xvY2sgYmluZGluZ3MgZm9yIE1hcnZlbGwgQXJtYWRhIDM3eHggU29DcworCitNYXJ2ZWxsIEFybWFkYSAzN3h4IFNvQ3MgcHJvdmRlIFRpbWUgQmFzZSBHZW5lcmF0b3IgY2xvY2tzIHdoaWNoIGFyZQordXNlZCBhcyBwYXJlbnQgY2xvY2tzIGZvciB0aGUgcGVyaXBoZXJhbCBjbG9ja3MuCisKK1RoZSBUQkcgY2xvY2sgY29uc3VtZXIgc2hvdWxkIHNwZWNpZnkgdGhlIGRlc2lyZWQgY2xvY2sgYnkgaGF2aW5nIHRoZQorY2xvY2sgSUQgaW4gaXRzICJjbG9ja3MiIHBoYW5kbGUgY2VsbC4KKworVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgcHJvdmlkZWQgSURzIGFuZCBjbG9jayBuYW1lcyBvbiBBcm1hZGEgMzcwMDoKKyAwID0gVEJHIEEgUAorIDEgPSBUQkcgQiBQCisgMiA9IFRCRyBBIFMKKyAzID0gVEJHIEIgUworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogc2hhbGwgYmUgIm1hcnZlbGwsYXJtYWRhLTM3MDAtdGJnLWNsb2NrIgorLSByZWcgOiBtdXN0IGJlIHRoZSByZWdpc3RlciBhZGRyZXNzIG9mIE5vcnRoIEJyaWRnZSBQTEwgcmVnaXN0ZXIKKy0gI2Nsb2NrLWNlbGxzIDogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgc2hhbGwgYmUgc2V0IHRvIDEKKworRXhhbXBsZToKKwordGJnOiB0YmdAMTMyMDAgeworCWNvbXBhdGlibGUgPSAibWFydmVsbCxhcm1hZGEtMzcwMC10YmctY2xvY2siOworCXJlZyA9IDwweDEzMjAwIDB4MTAwMD47CisJY2xvY2tzID0gPCZ4dGFsY2xrPjsKKwkjY2xvY2stY2VsbHMgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAteHRhbC1jbG9jay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXJtYWRhMzcwMC14dGFsLWNsb2NrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODhmMWYwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2FybWFkYTM3MDAteHRhbC1jbG9jay50eHQKQEAgLTAsMCArMSwyOCBAQAorKiBYdGFsIENsb2NrIGJpbmRpbmdzIGZvciBNYXJ2ZWxsIEFybWFkYSAzN3h4IFNvQ3MKKworTWFydmVsbCBBcm1hZGEgMzd4eCBTb0NzIGFsbG93IHRvIGRldGVybWluZSB0aGUgeHRhbCBjbG9jayBmcmVxdWVuY2llcyBieQorcmVhZGluZyB0aGUgZ3BpbyBsYXRjaCByZWdpc3Rlci4KKworVGhpcyBub2RlIG11c3QgYmUgYSBzdWJub2RlIG9mIHRoZSBub2RlIGV4cG9zaW5nIHRoZSByZWdpc3RlciBhZGRyZXNzCitvZiB0aGUgR1BJTyBibG9jayB3aGVyZSB0aGUgZ3BpbyBsYXRjaCBpcyBsb2NhdGVkLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogc2hhbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJIm1hcnZlbGwsYXJtYWRhLTM3MDAteHRhbC1jbG9jayIKKy0gI2Nsb2NrLWNlbGxzIDogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgc2hhbGwgYmUgc2V0IHRvIDAKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gY2xvY2stb3V0cHV0LW5hbWVzIDogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgYWxsb3dzIG92ZXJ3cml0ZSBkZWZhdWx0IGNsb2NrCisJb3V0cHV0IG5hbWVzICgieHRhbCIpCisKK0V4YW1wbGU6CitncGlvMTogZ3Bpb0AxMzgwMCB7CisJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFkYS0zNzAwLWdwaW8iLCAic3lzY29uIiwgInNpbXBsZS1tZmQiOworCXJlZyA9IDwweDEzODAwIDB4MTAwMD47CisKKwl4dGFsY2xrOiB4dGFsLWNsayB7CisJCWNvbXBhdGlibGUgPSAibWFydmVsbCxhcm1hZGEtMzcwMC14dGFsLWNsb2NrIjsKKwkJY2xvY2stb3V0cHV0LW5hbWVzID0gInh0YWwiOworCQkjY2xvY2stY2VsbHMgPSA8MD47CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXQ5MS1jbG9jay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXQ5MS1jbG9jay50eHQKaW5kZXggMTgxYmM4YS4uNWYzYWQ2NWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9hdDkxLWNsb2NrLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYXQ5MS1jbG9jay50eHQKQEAgLTYsNyArNiw4IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGUgOiBzaGFsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLQkiYXRtZWwsYXQ5MXNhbTl4NS1zY2tjIjoKKwkiYXRtZWwsYXQ5MXNhbTl4NS1zY2tjIiBvcgorCSJhdG1lbCxzYW1hNWQ0LXNja2MiOgogCQlhdDkxIFNDS0MgKFNsb3cgQ2xvY2sgQ29udHJvbGxlcikKIAkJVGhpcyBub2RlIGNvbnRhaW5zIHRoZSBzbG93IGNsb2NrIGRlZmluaXRpb25zLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svYnJjbSxiY201MzU3My1pbHAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2JyY20sYmNtNTM1NzMtaWxwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWJiMTA3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2JyY20sYmNtNTM1NzMtaWxwLnR4dApAQCAtMCwwICsxLDM2IEBACitCcm9hZGNvbSBCQ001MzU3MyBJTFAgY2xvY2sKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGJpbmRpbmcgdXNlcyB0aGUgY29tbW9uIGNsb2NrIGJpbmRpbmc6CisgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dAorCitUaGlzIGJpbmRpbmcgaXMgdXNlZCBmb3IgSUxQIGNsb2NrIChzb21ldGltZXMgcmVmZXJyZWQgYXMgInNsb3cgY2xvY2siKQorb24gQnJvYWRjb20gQkNNNTM1NzMgZGV2aWNlcyB1c2luZyBDb3J0ZXgtQTcgQ1BVLgorCitJTFAncyByYXRlIGhhcyB0byBiZSBjYWxjdWxhdGVkIG9uIHJ1bnRpbWUgYW5kIGl0IGRlcGVuZHMgb24gQUxQIGNsb2NrCit3aGljaCBoYXMgdG8gYmUgcmVmZXJlbmNlZC4KKworVGhpcyBjbG9jayBpcyBwYXJ0IG9mIFBNVSAoUG93ZXIgTWFuYWdlbWVudCBVbml0KSwgYSBCcm9hZGNvbSdzIGRldmljZQoraGFuZGluZyBwb3dlci1yZWxhdGVkIGFzcGVjdHMuIEl0cyBub2RlIG11c3QgYmUgc3ViLW5vZGUgb2YgdGhlIFBNVQorZGV2aWNlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAiYnJjbSxiY201MzU3My1pbHAiCistIGNsb2NrczogaGFzIHRvIHJlZmVyZW5jZSBhbiBBTFAgY2xvY2sKKy0gI2Nsb2NrLWNlbGxzOiBzaG91bGQgYmUgPDA+CistIGNsb2NrLW91dHB1dC1uYW1lczogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZ3MsIHNob3VsZCBjb250YWluIGNsb2NrCisJCSAgICAgIG5hbWUKKworRXhhbXBsZToKKworcG11QDE4MDEyMDAwIHsKKwljb21wYXRpYmxlID0gInNpbXBsZS1tZmQiLCAic3lzY29uIjsKKwlyZWcgPSA8MHgxODAxMjAwMCAweDAwMDAxMDAwPjsKKworCWlscCB7CisJCWNvbXBhdGlibGUgPSAiYnJjbSxiY201MzU3My1pbHAiOworCQljbG9ja3MgPSA8JmFscD47CisJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJY2xvY2stb3V0cHV0LW5hbWVzID0gImlscCI7CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xrLWV4eW5vcy1hdWRzcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xrLWV4eW5vcy1hdWRzcy50eHQKaW5kZXggMTgwZTg4My4uMGMzZDYwMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsay1leHlub3MtYXVkc3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbGstZXh5bm9zLWF1ZHNzLnR4dApAQCAtMTAsNiArMTAsOCBAQAogICAtICJzYW1zdW5nLGV4eW5vczQyMTAtYXVkc3MtY2xvY2siIC0gY29udHJvbGxlciBjb21wYXRpYmxlIHdpdGggYWxsIEV4eW5vczQgU29Dcy4KICAgLSAic2Ftc3VuZyxleHlub3M1MjUwLWF1ZHNzLWNsb2NrIiAtIGNvbnRyb2xsZXIgY29tcGF0aWJsZSB3aXRoIEV4eW5vczUyNTAKICAgICBTb0NzLgorICAtICJzYW1zdW5nLGV4eW5vczU0MTAtYXVkc3MtY2xvY2siIC0gY29udHJvbGxlciBjb21wYXRpYmxlIHdpdGggRXh5bm9zNTQxMAorICAgIFNvQ3MuCiAgIC0gInNhbXN1bmcsZXh5bm9zNTQyMC1hdWRzcy1jbG9jayIgLSBjb250cm9sbGVyIGNvbXBhdGlibGUgd2l0aCBFeHlub3M1NDIwCiAgICAgU29Dcy4KIC0gcmVnOiBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgY29udHJvbGxlcidzIHJlZ2lzdGVyIHNldC4KQEAgLTkxLDUgKzkzLDUgQEAKIAkJPCZjbG9ja19hdWRzcyBFWFlOT1NfTU9VVF9BVURTUz4sCiAJCTwmY2xvY2tfYXVkc3MgRVhZTk9TX01PVVRfSTJTPjsKIAljbG9jay1uYW1lcyA9ICJpaXMiLCAiaTJzX29wY2xrMCIsICJpMnNfb3BjbGsxIiwKLQkibW91dF9hdWRzcyIsICJtb3V0X2kycyI7CisJCSAgICAgICJtb3V0X2F1ZHNzIiwgIm1vdXRfaTJzIjsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svZXh5bm9zNTQxMC1jbG9jay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svZXh5bm9zNTQxMC1jbG9jay50eHQKaW5kZXggYWVhYjYzNS4uNDUyN2RlMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2V4eW5vczU0MTAtY2xvY2sudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9leHlub3M1NDEwLWNsb2NrLnR4dApAQCAtMTIsMjQgKzEyLDI5IEBACiAKIC0gI2Nsb2NrLWNlbGxzOiBzaG91bGQgYmUgMS4KIAorLSBjbG9ja3M6IHNob3VsZCBjb250YWluIGFuIGVudHJ5IHNwZWNpZnlpbmcgdGhlIHJvb3QgY2xvY2sgZnJvbSBleHRlcm5hbAorICBvc2NpbGxhdG9yIHN1cHBsaWVkIHRocm91Z2ggWFhUSSBvciBYdXNiWFRJIHBpbi4gIFRoaXMgY2xvY2sgc2hvdWxkIGJlCisgIGRlZmluZWQgdXNpbmcgc3RhbmRhcmQgY2xvY2sgYmluZGluZ3Mgd2l0aCAiZmluX3BsbCIgY2xvY2stb3V0cHV0LW5hbWUuCisgIFRoYXQgY2xvY2sgaXMgYmVpbmcgcGFzc2VkIGludGVybmFsbHkgdG8gdGhlIDkgUExMcy4KKwogQWxsIGF2YWlsYWJsZSBjbG9ja3MgYXJlIGRlZmluZWQgYXMgcHJlcHJvY2Vzc29yIG1hY3JvcyBpbgogZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQxMC5oIGhlYWRlciBhbmQgY2FuIGJlIHVzZWQgaW4gZGV2aWNlCiB0cmVlIHNvdXJjZXMuCiAKLUV4dGVybmFsIGNsb2NrOgotCi1UaGVyZSBpcyBjbG9jayB0aGF0IGlzIGdlbmVyYXRlZCBvdXRzaWRlIHRoZSBTb0MuIEl0Ci1pcyBleHBlY3RlZCB0aGF0IGl0IGlzIGRlZmluZWQgdXNpbmcgc3RhbmRhcmQgY2xvY2sgYmluZGluZ3MKLXdpdGggZm9sbG93aW5nIGNsb2NrLW91dHB1dC1uYW1lOgotCi0gLSAiZmluX3BsbCIgLSBQTEwgaW5wdXQgY2xvY2sgZnJvbSBYWFRJCi0KIEV4YW1wbGUgMTogQW4gZXhhbXBsZSBvZiBhIGNsb2NrIGNvbnRyb2xsZXIgbm9kZSBpcyBsaXN0ZWQgYmVsb3cuCiAKKwlmaW5fcGxsOiB4eHRpIHsKKwkJY29tcGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyNDAwMDAwMD47CisJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJmaW5fcGxsIjsKKwkJI2Nsb2NrLWNlbGxzID0gPDA+OworCX07CisKIAljbG9jazogY2xvY2stY29udHJvbGxlckAweDEwMDEwMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczU0MTAtY2xvY2siOwogCQlyZWcgPSA8MHgxMDAxMDAwMCAweDMwMDAwPjsKIAkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQljbG9ja3MgPSA8JmZpbl9wbGw+OwogCX07CiAKIEV4YW1wbGUgMjogVUFSVCBjb250cm9sbGVyIG5vZGUgdGhhdCBjb25zdW1lcyB0aGUgY2xvY2sgZ2VuZXJhdGVkIGJ5IHRoZSBjbG9jawpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3Njg2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzY4Ni50eHQKaW5kZXggOWM0MDczOS4uODM5OGEzYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3Njg2LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2ODYudHh0CkBAIC0xLDEwICsxLDI0IEBACi1CaW5kaW5nIGZvciBNYXhpbSBNQVg3NzY4NiAzMmsgY2xvY2sgZ2VuZXJhdG9yIGJsb2NrCitCaW5kaW5nIGZvciBNYXhpbSBNQVg3NzY4Ni9NQVg3NzgwMi9NQVg3NzYyMCAzMmsgY2xvY2sgZ2VuZXJhdG9yIGJsb2NrCiAKLVRoaXMgaXMgYSBwYXJ0IG9mIGRldmljZSB0cmVlIGJpbmRpbmdzIG9mIE1BWDc3Njg2IG11bHRpLWZ1bmN0aW9uIGRldmljZS4KLU1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIGJpbmRpbmdzL21mZC9tYXg3NzY4Ni50eHQgZmlsZS4KK1RoaXMgaXMgYSBwYXJ0IG9mIGRldmljZSB0cmVlIGJpbmRpbmdzIG9mIE1BWDc3Njg2L01BWDc3ODAyL01BWDc3NjIwCittdWx0aS1mdW5jdGlvbiBkZXZpY2UuIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIE1GRCBEVCBiaW5kaW5nCitkb2MgYXMgZm9sbG93czoKKwliaW5kaW5ncy9tZmQvbWF4Nzc2ODYudHh0IGZvciBNQVg3NzY4NiBhbmQKKwliaW5kaW5ncy9tZmQvbWF4Nzc4MDIudHh0IGZvciBNQVg3NzgwMiBhbmQKKwliaW5kaW5ncy9tZmQvbWF4Nzc2MjAudHh0IGZvciBNQVg3NzYyMC4KIAogVGhlIE1BWDc3Njg2IGNvbnRhaW5zIHRocmVlIDMyLjc2OGtoeiBjbG9jayBvdXRwdXRzIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQKLShnYXRlZC91bmdhdGVkKSBvdmVyIEkyQy4KKyhnYXRlZC91bmdhdGVkKSBvdmVyIEkyQy4gQ2xvY2tzIGFyZSBkZWZpbmVkIGFzIHByZXByb2Nlc3NvciBtYWNyb3MgaW4KK2R0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3Njg2LmguCisKKworVGhlIE1BWDc3ODAyIGNvbnRhaW5zIHR3byAzMi43NjhraHogY2xvY2sgb3V0cHV0cyB0aGF0IGNhbiBiZSBjb250cm9sbGVkCisoZ2F0ZWQvdW5nYXRlZCkgb3ZlciBJMkMuIENsb2NrcyBhcmUgZGVmaW5lZCBhcyBwcmVwcm9jZXNzb3IgbWFjcm9zIGluCitkdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzgwMi5oLgorCitUaGUgTUFYNzc2ODYgY29udGFpbnMgb25lIDMyLjc2OGtoeiBjbG9jayBvdXRwdXRzIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQKKyhnYXRlZC91bmdhdGVkKSBvdmVyIEkyQy4gQ2xvY2tzIGFyZSBkZWZpbmVkIGFzIHByZXByb2Nlc3NvciBtYWNyb3MgaW4KK2R0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3NjIwLmguCiAKIEZvbGxvd2luZyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBwcmVzZW5kIGluIG1haW4gZGV2aWNlIG5vZGUgb2YgdGhlIE1GRCBjaGlwLgogCkBAIC0xNywzMCArMzEsODQgQEAKIAogRWFjaCBjbG9jayBpcyBhc3NpZ25lZCBhbiBpZGVudGlmaWVyIGFuZCBjbGllbnQgbm9kZXMgY2FuIHVzZSB0aGlzIGlkZW50aWZpZXIKIHRvIHNwZWNpZnkgdGhlIGNsb2NrIHdoaWNoIHRoZXkgY29uc3VtZS4gRm9sbG93aW5nIGluZGljZXMgYXJlIGFsbG93ZWQ6Ci0gICAgLSAwOiAzMmtoel9hcCBjbG9jaywKLSAgICAtIDE6IDMya2h6X2NwIGNsb2NrLAotICAgIC0gMjogMzJraHpfcG1pYyBjbG9jay4KKyAgICAtIDA6IDMya2h6X2FwIGNsb2NrIChtYXg3NzY4NiwgbWF4Nzc4MDIpLCAzMmtoel9vdXQwIChtYXg3NzYyMCkKKyAgICAtIDE6IDMya2h6X2NwIGNsb2NrIChtYXg3NzY4NiwgbWF4Nzc4MDIpLAorICAgIC0gMjogMzJraHpfcG1pYyBjbG9jayAobWF4Nzc2ODYpLgogCi1DbG9ja3MgYXJlIGRlZmluZWQgYXMgcHJlcHJvY2Vzc29yIG1hY3JvcyBpbiBkdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzY4Ni5oCi1oZWFkZXIgYW5kIGNhbiBiZSB1c2VkIGluIGRldmljZSB0cmVlIHNvdXJjZXMuCitDbG9ja3MgYXJlIGRlZmluZWQgYXMgcHJlcHJvY2Vzc29yIG1hY3JvcyBpbiBhYm92ZSBkdC1iaW5kaW5nIGhlYWRlciBmb3IKK3Jlc3BlY3RpdmUgY2hpcHMuCiAKLUV4YW1wbGU6IE5vZGUgb2YgdGhlIE1GRCBjaGlwCitFeGFtcGxlOgogCi0JbWF4Nzc2ODY6IG1heDc3Njg2QDA5IHsKLQkJY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg3NzY4NiI7Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jndha2V1cF9laW50PjsKLQkJaW50ZXJydXB0cyA9IDwyNiAwPjsKLQkJcmVnID0gPDB4MDk+OwotCQkjY2xvY2stY2VsbHMgPSA8MT47CisxLiBXaXRoIE1BWDc3Njg2OgogCi0JCS8qIC4uLiAqLwotCX07CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2ODYuaD4KKy8qIC4uLiAqLwogCi1FeGFtcGxlOiBDbG9jayBjb25zdW1lciBub2RlCisJTm9kZSBvZiB0aGUgTUZEIGNoaXAKKwkJbWF4Nzc2ODY6IG1heDc3Njg2QDA5IHsKKwkJCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc2ODYiOworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmd2FrZXVwX2VpbnQ+OworCQkJaW50ZXJydXB0cyA9IDwyNiAwPjsKKwkJCXJlZyA9IDwweDA5PjsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKIAotCWZvb0AwIHsKLQkJY29tcGF0aWJsZSA9ICJiYXIsZm9vIjsKLQkJLyogLi4uICovCi0JCWNsb2NrLW5hbWVzID0gIm15LWNsb2NrIjsKLQkJY2xvY2tzID0gPCZtYXg3NzY4NiBNQVg3NzY4Nl9DTEtfUE1JQz47Ci0JfTsKKwkJCS8qIC4uLiAqLworCQl9OworCisJQ2xvY2sgY29uc3VtZXIgbm9kZQorCisJCWZvb0AwIHsKKwkJCWNvbXBhdGlibGUgPSAiYmFyLGZvbyI7CisJCQkvKiAuLi4gKi8KKwkJCWNsb2NrLW5hbWVzID0gIm15LWNsb2NrIjsKKwkJCWNsb2NrcyA9IDwmbWF4Nzc2ODYgTUFYNzc2ODZfQ0xLX1BNSUM+OworCQl9OworCisyLiBXaXRoIE1BWDc3ODAyOgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc4MDIuaD4KKy8qIC4uLiAqLworCisJTm9kZSBvZiB0aGUgTUZEIGNoaXAKKwkJbWF4Nzc4MDI6IG1heDc3ODAyQDA5IHsKKwkJCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc4MDIiOworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmd2FrZXVwX2VpbnQ+OworCQkJaW50ZXJydXB0cyA9IDwyNiAwPjsKKwkJCXJlZyA9IDwweDA5PjsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKworCQkJLyogLi4uICovCisJCX07CisKKwlDbG9jayBjb25zdW1lciBub2RlCisKKwkJZm9vQDAgeworCQkJY29tcGF0aWJsZSA9ICJiYXIsZm9vIjsKKwkJCS8qIC4uLiAqLworCQkJY2xvY2stbmFtZXMgPSAibXktY2xvY2siOworCQkJY2xvY2tzID0gPCZtYXg3NzgwMiBNQVg3NzgwMl9DTEtfMzJLX0FQPjsKKwkJfTsKKworCiszLiBXaXRoIE1BWDc3NjIwOgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc2MjAuaD4KKy8qIC4uLiAqLworCisJTm9kZSBvZiB0aGUgTUZEIGNoaXAKKwkJbWF4Nzc2MjA6IG1heDc3NjIwQDNjIHsKKwkJCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc2MjAiOworCQkJcmVnID0gPDB4M2M+OworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQkJLyogLi4uICovCisJCX07CisKKwlDbG9jayBjb25zdW1lciBub2RlCisKKwkJZm9vQDAgeworCQkJY29tcGF0aWJsZSA9ICJiYXIsZm9vIjsKKwkJCS8qIC4uLiAqLworCQkJY2xvY2stbmFtZXMgPSAibXktY2xvY2siOworCQkJY2xvY2tzID0gPCZtYXg3NzYyMCBNQVg3NzYyMF9DTEtfMzJLX09VVDA+OworCQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3ODAyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzgwMi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZGM3ODMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3ODAyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLUJpbmRpbmcgZm9yIE1heGltIE1BWDc3ODAyIDMyayBjbG9jayBnZW5lcmF0b3IgYmxvY2sKLQotVGhpcyBpcyBhIHBhcnQgb2YgZGV2aWNlIHRyZWUgYmluZGluZ3Mgb2YgTUFYNzc4MDIgbXVsdGktZnVuY3Rpb24gZGV2aWNlLgotTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gYmluZGluZ3MvbWZkL21heDc3ODAyLnR4dCBmaWxlLgotCi1UaGUgTUFYNzc4MDIgY29udGFpbnMgdHdvIDMyLjc2OGtoeiBjbG9jayBvdXRwdXRzIHRoYXQgY2FuIGJlIGNvbnRyb2xsZWQKLShnYXRlZC91bmdhdGVkKSBvdmVyIEkyQy4KLQotRm9sbG93aW5nIHByb3BlcnRpZXMgc2hvdWxkIGJlIHByZXNlbnQgaW4gbWFpbiBkZXZpY2Ugbm9kZSBvZiB0aGUgTUZEIGNoaXAuCi0KLVJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tICNjbG9jay1jZWxsczogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgc2hhbGwgYmUgc2V0IHRvIDEuCi0KLU9wdGlvbmFsIHByb3BlcnRpZXM6Ci0tIGNsb2NrLW91dHB1dC1uYW1lczogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZy4KLQotRWFjaCBjbG9jayBpcyBhc3NpZ25lZCBhbiBpZGVudGlmaWVyIGFuZCBjbGllbnQgbm9kZXMgY2FuIHVzZSB0aGlzIGlkZW50aWZpZXIKLXRvIHNwZWNpZnkgdGhlIGNsb2NrIHdoaWNoIHRoZXkgY29uc3VtZS4gRm9sbG93aW5nIGluZGljZXMgYXJlIGFsbG93ZWQ6Ci0gICAgIC0gMDogMzJraHpfYXAgY2xvY2ssCi0gICAgIC0gMTogMzJraHpfY3AgY2xvY2suCi0KLUNsb2NrcyBhcmUgZGVmaW5lZCBhcyBwcmVwcm9jZXNzb3IgbWFjcm9zIGluIGR0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3ODAyLmgKLWhlYWRlciBhbmQgY2FuIGJlIHVzZWQgaW4gZGV2aWNlIHRyZWUgc291cmNlcy4KLQotRXhhbXBsZTogTm9kZSBvZiB0aGUgTUZEIGNoaXAKLQotCW1heDc3ODAyOiBtYXg3NzgwMkAwOSB7Ci0JCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc4MDIiOwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ3YWtldXBfZWludD47Ci0JCWludGVycnVwdHMgPSA8MjYgMD47Ci0JCXJlZyA9IDwweDA5PjsKLQkJI2Nsb2NrLWNlbGxzID0gPDE+OwotCi0JCS8qIC4uLiAqLwotCX07Ci0KLUV4YW1wbGU6IENsb2NrIGNvbnN1bWVyIG5vZGUKLQotCWZvb0AwIHsKLQkJY29tcGF0aWJsZSA9ICJiYXIsZm9vIjsKLQkJLyogLi4uICovCi0JCWNsb2NrLW5hbWVzID0gIm15LWNsb2NrIjsKLQkJY2xvY2tzID0gPCZtYXg3NzgwMiBNQVg3NzgwMl9DTEtfMzJLX0FQPjsKLQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL212ZWJ1LWdhdGVkLWNsb2NrLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9tdmVidS1nYXRlZC1jbG9jay50eHQKaW5kZXggNjYwZTY0OS4uY2I4NTQyZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL212ZWJ1LWdhdGVkLWNsb2NrLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svbXZlYnUtZ2F0ZWQtY2xvY2sudHh0CkBAIC04Niw2ICs4Niw4IEBACiA3CXBleDMJCVBDSWUgMwogOAlwZXgwCQlQQ0llIDAKIDkJdXNiM2gwCQlVU0IzIEhvc3QgMAorMTAJdXNiM2gxCQlVU0IzIEhvc3QgMQorMTUJc2F0YTAJCVNBVEEgMAogMTcJc2RpbwkJU0RJTwogMjIJeG9yMAkJWE9SIDAKIDI4CXhvcjEJCVhPUiAxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxnY2MudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLnR4dAppbmRleCA5YTYwZmRlLi44NjlhMmYwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxnY2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGdjYy50eHQKQEAgLTE1LDYgKzE1LDcgQEAKIAkJCSJxY29tLGdjYy1tc204OTc0cHJvIgogCQkJInFjb20sZ2NjLW1zbTg5NzRwcm8tYWMiCiAJCQkicWNvbSxnY2MtbXNtODk5NiIKKwkJCSJxY29tLGdjYy1tZG05NjE1IgogCiAtIHJlZyA6IHNoYWxsIGNvbnRhaW4gYmFzZSByZWdpc3RlciBsb2NhdGlvbiBhbmQgbGVuZ3RoCiAtICNjbG9jay1jZWxscyA6IHNoYWxsIGNvbnRhaW4gMQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sbGNjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9xY29tLGxjYy50eHQKaW5kZXggZGQ3NTViZS4uYTNjNzhhYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3Fjb20sbGNjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svcWNvbSxsY2MudHh0CkBAIC03LDYgKzcsNyBAQAogCQkJInFjb20sbGNjLW1zbTg5NjAiCiAJCQkicWNvbSxsY2MtYXBxODA2NCIKIAkJCSJxY29tLGxjYy1pcHE4MDY0IgorCQkJInFjb20sbGNjLW1kbTk2MTUiCiAKIC0gcmVnIDogc2hhbGwgY29udGFpbiBiYXNlIHJlZ2lzdGVyIGxvY2F0aW9uIGFuZCBsZW5ndGgKIC0gI2Nsb2NrLWNlbGxzIDogc2hhbGwgY29udGFpbiAxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLWRpdm11eC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLWRpdm11eC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNDc2NTIuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1kaXZtdXgudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotQmluZGluZyBmb3IgYSBTVCBkaXZpZGVyIGFuZCBtdWx0aXBsZXhlciBjbG9jayBkcml2ZXIuCi0KLVRoaXMgYmluZGluZyB1c2VzIHRoZSBjb21tb24gY2xvY2sgYmluZGluZ1sxXS4KLUJhc2UgYWRkcmVzcyBpcyBsb2NhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS4gU2VlIGNsb2NrIGJpbmRpbmdbMl0KLQotWzFdIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbG9jay1iaW5kaW5ncy50eHQKLVsyXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLnR4dAotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotCi0tIGNvbXBhdGlibGUgOiBzaGFsbCBiZToKLQkic3QsY2xrZ2VuYS1kaXZtdXgtYzY1LWhzIiwJInN0LGNsa2dlbmEtZGl2bXV4IgotCSJzdCxjbGtnZW5hLWRpdm11eC1jNjUtbHMiLAkic3QsY2xrZ2VuYS1kaXZtdXgiCi0JInN0LGNsa2dlbmEtZGl2bXV4LWMzMi1vZGYwIiwJInN0LGNsa2dlbmEtZGl2bXV4IgotCSJzdCxjbGtnZW5hLWRpdm11eC1jMzItb2RmMSIsCSJzdCxjbGtnZW5hLWRpdm11eCIKLQkic3QsY2xrZ2VuYS1kaXZtdXgtYzMyLW9kZjIiLAkic3QsY2xrZ2VuYS1kaXZtdXgiCi0JInN0LGNsa2dlbmEtZGl2bXV4LWMzMi1vZGYzIiwJInN0LGNsa2dlbmEtZGl2bXV4IgotCi0tICNjbG9jay1jZWxscyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAxLgotCi0tIGNsb2NrcyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmcKLQotLSBjbG9jay1vdXRwdXQtbmFtZXMgOiBGcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nLgotCi1FeGFtcGxlOgotCi0JY2xvY2tnZW4tYUBmZDM0NTAwMCB7Ci0JCXJlZyA9IDwweGZkMzQ1MDAwIDB4YjUwPjsKLQotCQljbGtfbV9hMV9kaXYxOiBjbGstbS1hMS1kaXYxIHsKLQkJCSNjbG9jay1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1kaXZtdXgtYzMyLW9kZjEiLAotCQkJCSAgICAgInN0LGNsa2dlbmEtZGl2bXV4IjsKLQotCQkJY2xvY2tzID0gPCZjbGtfbV9hMV9vc2NfcHJlZGl2PiwKLQkJCQkgPCZjbGtfbV9hMV9wbGwwIDE+LCAvKiBQTEwwIFBISTEgKi8KLQkJCQkgPCZjbGtfbV9hMV9wbGwxIDE+OyAvKiBQTEwxIFBISTEgKi8KLQotCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1tLXJ4LWljbi10cyIsCi0JCQkJCSAgICAgImNsay1tLXJ4LWljbi12ZHAtMCIsCi0JCQkJCSAgICAgIiIsIC8qIHVudXNlZCAqLwotCQkJCQkgICAgICJjbGstbS1wcnYtdDEtYnVzIiwKLQkJCQkJICAgICAiY2xrLW0taWNuLXJlZy0xMiIsCi0JCQkJCSAgICAgImNsay1tLWljbi1yZWctMTAiLAotCQkJCQkgICAgICIiLCAvKiB1bnVzZWQgKi8KLQkJCQkJICAgICAiY2xrLW0taWNuLXN0MjMxIjsKLQkJfTsKLQl9OwotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLW11eC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLW11eC50eHQKaW5kZXggZjFmYTkxYy4uOWE0NmNiMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1tdXgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tbXV4LnR4dApAQCAtMTAsMTQgKzEwLDcgQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKIC0gY29tcGF0aWJsZSA6IHNoYWxsIGJlOgotCSJzdCxzdGloNDE2LWNsa2dlbmMtdmNjLWhkIiwJInN0LGNsa2dlbi1tdXgiCi0JInN0LHN0aWg0MTYtY2xrZ2VuZi12Y2MtZnZkcCIsCSJzdCxjbGtnZW4tbXV4IgotCSJzdCxzdGloNDE2LWNsa2dlbmYtdmNjLWh2YSIsIAkic3QsY2xrZ2VuLW11eCIKLQkic3Qsc3RpaDQxNi1jbGtnZW5mLXZjYy1oZCIsCSJzdCxjbGtnZW4tbXV4IgotCSJzdCxzdGloNDE2LWNsa2dlbmYtdmNjLXNkIiwJInN0LGNsa2dlbi1tdXgiCi0JInN0LHN0aWg0MTUtY2xrZ2VuLWE5LW11eCIsCSJzdCxjbGtnZW4tbXV4IgotCSJzdCxzdGloNDE2LWNsa2dlbi1hOS1tdXgiLAkic3QsY2xrZ2VuLW11eCIKLQkic3Qsc3RpaDQwNy1jbGtnZW4tYTktbXV4IiwJInN0LGNsa2dlbi1tdXgiCisJInN0LHN0aWg0MDctY2xrZ2VuLWE5LW11eCIKIAogLSAjY2xvY2stY2VsbHMgOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOyBzaGFsbCBiZSBzZXQgdG8gMC4KIApAQCAtMjcsMTAgKzIwLDEzIEBACiAKIEV4YW1wbGU6CiAKLQljbGtfbV9odmE6IGNsay1tLWh2YUBmZDY5MDg2OCB7CisJY2xrX21fYTk6IGNsay1tLWE5QDkyYjAwMDAgewogCQkjY2xvY2stY2VsbHMgPSA8MD47Ci0JCWNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1jbGtnZW5mLXZjYy1odmEiLCAic3QsY2xrZ2VuLW11eCI7Ci0JCXJlZyA9IDwweGZkNjkwODY4IDQ+OworCQljb21wYXRpYmxlID0gInN0LHN0aWg0MDctY2xrZ2VuLWE5LW11eCI7CisJCXJlZyA9IDwweDkyYjAwMDAgMHgxMDAwMD47CiAKLQkJY2xvY2tzID0gPCZjbG9ja2dlbl9mIDE+LCA8JmNsa19tX2ExX2RpdjAgMz47CisJCWNsb2NrcyA9IDwmY2xvY2tnZW5fYTlfcGxsIDA+LAorCQkJIDwmY2xvY2tnZW5fYTlfcGxsIDA+LAorCQkJIDwmY2xrX3NfYzBfZmxleGdlbiAxMz4sCisJCQkgPCZjbGtfbV9hOV9leHQyZl9kaXYyPjsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1wbGwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1wbGwudHh0CmluZGV4IDg0NGIzYTAuLmYyMDcwNTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tcGxsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLXBsbC50eHQKQEAgLTksMjQgKzksMTAgQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKIC0gY29tcGF0aWJsZSA6IHNoYWxsIGJlOgotCSJzdCxjbGtnZW5hLXByZWRpdi1jNjUiLAkic3QsY2xrZ2VuYS1wcmVkaXYiCi0JInN0LGNsa2dlbmEtcHJlZGl2LWMzMiIsCSJzdCxjbGtnZW5hLXByZWRpdiIKLQotCSJzdCxjbGtnZW5hLXBsbHMtYzY1IgotCSJzdCxwbGxzLWMzMi1hMXgtMCIsCQkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCSJzdCxwbGxzLWMzMi1hMXgtMSIsCQkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCSJzdCxzdGloNDE1LXBsbHMtYzMyLWE5IiwJInN0LGNsa2dlbi1wbGxzLWMzMiIKLQkic3Qsc3RpaDQxNS1wbGxzLWMzMi1kZHIiLAkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCSJzdCxzdGloNDE2LXBsbHMtYzMyLWE5IiwJInN0LGNsa2dlbi1wbGxzLWMzMiIKLQkic3Qsc3RpaDQxNi1wbGxzLWMzMi1kZHIiLAkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCSJzdCxzdGloNDA3LXBsbHMtYzMyLWEwIiwJInN0LGNsa2dlbi1wbGxzLWMzMiIKLQkic3Qsc3RpaDQwNy1wbGxzLWMzMi1hOSIsCSJzdCxjbGtnZW4tcGxscy1jMzIiCi0JInNzdCxwbGxzLWMzMi1jeF8wIiwJCSJzdCxjbGtnZW4tcGxscy1jMzIiCi0JInNzdCxwbGxzLWMzMi1jeF8xIiwJCSJzdCxjbGtnZW4tcGxscy1jMzIiCi0JInN0LHN0aWg0MTgtcGxscy1jMjgtYTkiLAkic3QsY2xrZ2VuLXBsbHMtYzMyIgotCi0JInN0LHN0aWg0MTUtZ3B1LXBsbC1jMzIiLAkic3QsY2xrZ2VuZ3B1LXBsbC1jMzIiCi0JInN0LHN0aWg0MTYtZ3B1LXBsbC1jMzIiLAkic3QsY2xrZ2VuZ3B1LXBsbC1jMzIiCisJInN0LGNsa2dlbi1wbGwwIgorCSJzdCxjbGtnZW4tcGxsMSIKKwkic3Qsc3RpaDQwNy1jbGtnZW4tcGxsYTkiCisJInN0LHN0aWg0MTgtY2xrZ2VuLXBsbGE5IgogCiAtICNjbG9jay1jZWxscyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAxLgogCkBAIC0zNiwxNyArMjIsMTYgQEAKIAogRXhhbXBsZToKIAotCWNsb2NrZ2VuLWFAZmVlNjIwMDAgewotCQlyZWcgPSA8MHhmZWU2MjAwMCAweGI0OD47CisJY2xvY2tnZW4tYTlAOTJiMDAwMCB7CisJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuLWMzMiI7CisJCXJlZyA9IDwweDkyYjAwMDAgMHhmZmZmPjsKIAotCQljbGtfc19hMF9wbGw6IGNsay1zLWEwLXBsbCB7CisJCWNsb2NrZ2VuX2E5X3BsbDogY2xvY2tnZW4tYTktcGxsIHsKIAkJCSNjbG9jay1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1wbGxzLWM2NSI7CisJCQljb21wYXRpYmxlID0gInN0LHN0aWg0MDctY2xrZ2VuLXBsbGE5IjsKIAogCQkJY2xvY2tzID0gPCZjbGtfc3lzaW4+OwogCi0JCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLXMtYTAtcGxsMC1ocyIsCi0JCQkJCSAgICAgImNsay1zLWEwLXBsbDAtbHMiLAotCQkJCQkgICAgICJjbGstcy1hMC1wbGwxIjsKKwkJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbG9ja2dlbi1hOS1wbGwtb2RmIjsKIAkJfTsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1wcmVkaXYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi1wcmVkaXYudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ3NjZjLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tcHJlZGl2LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLUJpbmRpbmcgZm9yIGEgU1QgcHJlLWRpdmlkZXIgY2xvY2sgZHJpdmVyLgotCi1UaGlzIGJpbmRpbmcgdXNlcyB0aGUgY29tbW9uIGNsb2NrIGJpbmRpbmdbMV0uCi1CYXNlIGFkZHJlc3MgaXMgbG9jYXRlZCB0byB0aGUgcGFyZW50IG5vZGUuIFNlZSBjbG9jayBiaW5kaW5nWzJdCi0KLVsxXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0Ci1bMl0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi50eHQKLQotUmVxdWlyZWQgcHJvcGVydGllczoKLQotLSBjb21wYXRpYmxlIDogc2hhbGwgYmU6Ci0JInN0LGNsa2dlbmEtcHJlZGl2LWM2NSIsCSJzdCxjbGtnZW5hLXByZWRpdiIKLQkic3QsY2xrZ2VuYS1wcmVkaXYtYzMyIiwJInN0LGNsa2dlbmEtcHJlZGl2IgotCi0tICNjbG9jay1jZWxscyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAwLgotCi0tIGNsb2NrcyA6IEZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmcKLQotLSBjbG9jay1vdXRwdXQtbmFtZXMgOiBGcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nLgotCi1FeGFtcGxlOgotCi0JY2xvY2tnZW4tYUBmZDM0NTAwMCB7Ci0JCXJlZyA9IDwweGZkMzQ1MDAwIDB4YjUwPjsKLQotCQljbGtfbV9hMl9vc2NfcHJlZGl2OiBjbGstbS1hMi1vc2MtcHJlZGl2IHsKLQkJCSNjbG9jay1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1wcmVkaXYtYzMyIiwKLQkJCQkgICAgICJzdCxjbGtnZW5hLXByZWRpdiI7Ci0KLQkJCWNsb2NrcyA9IDwmY2xrX3N5c2luPjsKLQotCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1tLWEyLW9zYy1wcmVkaXYiOwotCQl9OwotCX07Ci0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tdmNjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4tdmNjLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5YjNlZC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsY2xrZ2VuLXZjYy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1CaW5kaW5nIGZvciBhIHR5cGUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIGNsb2NrIGNyb3NzYmFyIChWQ0MpLgotCi1UaGUgY3Jvc3NiYXIgY2FuIHRha2UgdXAgdG8gNCBpbnB1dCBjbG9ja3MgYW5kIGNvbnRyb2wgdXAgdG8gMTYKLW91dHB1dCBjbG9ja3MuIE5vdCBhbGwgaW5wdXRzIG9yIG91dHB1dHMgaGF2ZSB0byBiZSBpbiB1c2UgaW4gYQotcGFydGljdWxhciBpbnN0YW50aWF0aW9uLiBFYWNoIG91dHB1dCBjYW4gYmUgaW5kaXZpZHVhbGx5IGVuYWJsZWQsCi1zZWxlY3QgYW55IG9mIHRoZSBpbnB1dCBjbG9ja3MgYW5kIGFwcGx5IGEgZGl2aWRlIChieSAxLDIsNCBvciA4KSB0bwotdGhhdCBzZWxlY3RlZCBjbG9jay4KLQotVGhpcyBiaW5kaW5nIHVzZXMgdGhlIGNvbW1vbiBjbG9jayBiaW5kaW5nWzFdLgotCi1bMV0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dAotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotCi0tIGNvbXBhdGlibGUgOiBzaGFsbCBiZToKLQkic3Qsc3RpaDQxNi1jbGtnZW5jIiwJCSJzdCx2Y2MiCi0JInN0LHN0aWg0MTYtY2xrZ2VuZiIsCQkic3QsdmNjIgotCi0tICNjbG9jay1jZWxscyA6IGZyb20gY29tbW9uIGNsb2NrIGJpbmRpbmc7IHNoYWxsIGJlIHNldCB0byAxLgotCi0tIHJlZyA6IEEgQmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldC4KLQotLSBjbG9ja3MgOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nCi0KLS0gY2xvY2stb3V0cHV0LW5hbWVzIDogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZy4gVGhlIGJsb2NrIGhhcyAxNgotICAgICAgICAgICAgICAgICAgICAgICBjbG9jayBvdXRwdXRzIGJ1dCBub3QgYWxsIG9mIHRoZW0gaW4gYSBzcGVjaWZpYyBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIGJlIHVzZWQgaW4gdGhlIFNvQy4gSWYgYSBjbG9jayBuYW1lIGlzIGxlZnQgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgYW4gZW1wdHkgc3RyaW5nIHRoZW4gbm8gY2xvY2sgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGFzc29jaWF0ZWQgd2l0aCB0aGF0IHN0cmluZyBpbmRleC4gSWYgZmV3ZXIgdGhhbgotICAgICAgICAgICAgICAgICAgICAgICAxNiBzdHJpbmdzIGFyZSBwcm92aWRlZCB0aGVuIG5vIGNsb2NrcyB3aWxsIGJlIGNyZWF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSByZW1haW5pbmcgb3V0cHV0cy4KLQotRXhhbXBsZToKLQotCWNsb2NrZ2VuX2NfdmNjOiBjbG9ja2dlbi1jLXZjY0AweGZlODMwOGFjIHsKLQkJI2Nsb2NrLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gInN0LHN0aWg0MTYtY2xrZ2VuYyIsICJzdCxjbGtnZW4tdmNjIjsKLQkJcmVnID0gPDB4ZmU4MzA4YWMgMTI+OwotCi0JCWNsb2NrcyA9IDwmY2xrX3NfdmNjX2hkPiwKLQkJCSA8JmNsb2NrZ2VuX2MgMT4sCi0JCQkgPCZjbGtfc190bWRzX2Zyb21waHk+LAotCQkJIDwmY2xvY2tnZW5fYyAyPjsKLQotCQljbG9jay1vdXRwdXQtbmFtZXMgID0gImNsay1zLXBpeC1oZG1pIiwKLQkJCQkgICAgICAiY2xrLXMtcGl4LWR2byIsCi0JCQkJICAgICAgImNsay1zLW91dC1kdm8iLAotCQkJCSAgICAgICJjbGstcy1waXgtaGQiLAotCQkJCSAgICAgICJjbGstcy1oZGRhYyIsCi0JCQkJICAgICAgImNsay1zLWRlbmMiLAotCQkJCSAgICAgICJjbGstcy1zZGRhYyIsCi0JCQkJICAgICAgImNsay1zLXBpeC1tYWluIiwKLQkJCQkgICAgICAiY2xrLXMtcGl4LWF1eCIsCi0JCQkJICAgICAgImNsay1zLXN0ZmUtZnJjLTAiLAotCQkJCSAgICAgICJjbGstcy1yZWYtbWNydSIsCi0JCQkJICAgICAgImNsay1zLXNsYXZlLW1jcnUiLAotCQkJCSAgICAgICJjbGstcy10bWRzLWhkbWkiLAotCQkJCSAgICAgICJjbGstcy1oZG1pLXJlamVjdC1wbGwiLAotCQkJCSAgICAgICJjbGstcy10aHNlbnMiOwotCX07Ci0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxjbGtnZW4udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi50eHQKaW5kZXggYjE4YmY4Ni4uYzM1MzkwZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGNsa2dlbi50eHQKQEAgLTEzLDE0ICsxMyw2IEBACiAJCQkuLi4KIAkJfTsKIAotCQlwcmVkaXZfbm9kZSB7Ci0JCQkuLi4KLQkJfTsKLQotCQlkaXZtdXhfbm9kZSB7Ci0JCQkuLi4KLQkJfTsKLQogCQlxdWFkZnNfbm9kZSB7CiAJCQkuLi4KIAkJfTsKQEAgLTI5LDEwICsyMSw2IEBACiAJCQkuLi4KIAkJfTsKIAotCQl2Y2Nfbm9kZSB7Ci0JCQkuLi4KLQkJfTsKLQogCQlmbGV4Z2VuX25vZGUgewogCQkJLi4uCiAJCX07CkBAIC00MywxMSArMzEsOCBAQAogRWFjaCBzdWJub2RlIHNob3VsZCB1c2UgdGhlIGJpbmRpbmcgZGVzY3JpYmVkIGluIFsyXS4uWzddCiAKIFsxXSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0Ci1bMl0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0LGNsa2dlbi1kaXZtdXgudHh0CiBbM10gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0LGNsa2dlbi1tdXgudHh0CiBbNF0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0LGNsa2dlbi1wbGwudHh0Ci1bNV0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0LGNsa2dlbi1wcmVkaXYudHh0Ci1bNl0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0LHZjYy50eHQKIFs3XSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3QscXVhZGZzLnR4dAogWzhdIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdCxmbGV4Z2VuLnR4dAogCkBAIC01Nyw0NCArNDIsMjcgQEAKIAogRXhhbXBsZToKIAotCWNsb2NrZ2VuLWFAZmVlNjIwMDAgewotCi0JCXJlZyA9IDwweGZlZTYyMDAwIDB4YjQ4PjsKKwljbG9ja2dlbi1hQDA5MGZmMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzdCxjbGtnZW4tYzMyIjsKKwkJcmVnID0gPDB4OTBmZjAwMCAweDEwMDA+OwogCiAJCWNsa19zX2EwX3BsbDogY2xrLXMtYTAtcGxsIHsKIAkJCSNjbG9jay1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAic3QsY2xrZ2VuYS1wbGxzLWM2NSI7Ci0KLQkJCWNsb2NrcyA9IDwmY2xrLXN5c2luPjsKLQotCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1zLWEwLXBsbDAtaHMiLAotCQkJCQkgICAgICJjbGstcy1hMC1wbGwwLWxzIiwKLQkJCQkJICAgICAiY2xrLXMtYTAtcGxsMSI7Ci0JCX07Ci0KLQkJY2xrX3NfYTBfb3NjX3ByZWRpdjogY2xrLXMtYTAtb3NjLXByZWRpdiB7Ci0JCQkjY2xvY2stY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gInN0LGNsa2dlbmEtcHJlZGl2LWM2NSIsCi0JCQkJICAgICAic3QsY2xrZ2VuYS1wcmVkaXYiOworCQkJY29tcGF0aWJsZSA9ICJzdCxjbGtnZW4tcGxsMCI7CiAKIAkJCWNsb2NrcyA9IDwmY2xrX3N5c2luPjsKIAotCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1zLWEwLW9zYy1wcmVkaXYiOworCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1zLWEwLXBsbC1vZmQtMCI7CiAJCX07CiAKLQkJY2xrX3NfYTBfaHM6IGNsay1zLWEwLWhzIHsKKwkJY2xrX3NfYTBfZmxleGdlbjogY2xrLXMtYTAtZmxleGdlbiB7CisJCQljb21wYXRpYmxlID0gInN0LGZsZXhnZW4iOworCiAJCQkjY2xvY2stY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gInN0LGNsa2dlbmEtZGl2bXV4LWM2NS1ocyIsCi0JCQkJICAgICAic3QsY2xrZ2VuYS1kaXZtdXgiOwogCi0JCQljbG9ja3MgPSA8JmNsay1zX2EwX29zY19wcmVkaXY+LAotCQkJCSA8JmNsay1zX2EwX3BsbCAwPiwgLyogcGxsMCBocyAqLwotCQkJCSA8JmNsay1zX2EwX3BsbCAyPjsgLyogcGxsMSAqLworCQkJY2xvY2tzID0gPCZjbGtfc19hMF9wbGwgMD4sCisJCQkJIDwmY2xrX3N5c2luPjsKIAotCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNsay1zLWZkbWEtMCIsCi0JCQkJCSAgICAgImNsay1zLWZkbWEtMSIsCi0JCQkJCSAgICAgIiI7IC8qIGNsay1zLWppdC1zZW5zZSAqLwotCQkJCQkgICAgIC8qIGZvdXJ0aCBvdXRwdXQgdW51c2VkICovCisJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLWljLWxtaTAiOwogCQl9OwogCX07Ci0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxmbGV4Z2VuLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxmbGV4Z2VuLnR4dAppbmRleCBiN2VlNWM3Li43ZmY3N2ZjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QsZmxleGdlbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N0L3N0LGZsZXhnZW4udHh0CkBAIC02MCw2ICs2MCwxMCBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZSA6IHNoYWxsIGJlOgogICAic3QsZmxleGdlbiIKKyAgInN0LGZsZXhnZW4tYXVkaW8iLCAic3QsZmxleGdlbiIgKGVuYWJsZSBjbG9jayBwcm9wYWdhdGlvbiBvbiBwYXJlbnQgZm9yCisgIGF1ZGlvIHVzZSBjYXNlKQorICAic3QsZmxleGdlbi12aWRlbyIsICJzdCxmbGV4Z2VuIiAoZW5hYmxlIGNsb2NrIHByb3BhZ2F0aW9uIG9uIHBhcmVudAorCQkJCQlhbmQgYWN0aXZhdGUgc3luY2hyb25vdXMgbW9kZSkKIAogLSAjY2xvY2stY2VsbHMgOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOyBzaGFsbCBiZSBzZXQgdG8gMSAobXVsdGlwbGUgY2xvY2sKICAgb3V0cHV0cykuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3Qvc3QscXVhZGZzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxxdWFkZnMudHh0CmluZGV4IGNlZGViOWMuLmQ5M2Q0OTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxxdWFkZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9zdC9zdCxxdWFkZnMudHh0CkBAIC0xMSwxMiArMTEsOCBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBjb21wYXRpYmxlIDogc2hhbGwgYmU6Ci0gICJzdCxzdGloNDE2LXF1YWRmczIxNiIsCSJzdCxxdWFkZnMiCi0gICJzdCxzdGloNDE2LXF1YWRmczQzMiIsCSJzdCxxdWFkZnMiCi0gICJzdCxzdGloNDE2LXF1YWRmczY2MC1FIiwJInN0LHF1YWRmcyIKLSAgInN0LHN0aWg0MTYtcXVhZGZzNjYwLUYiLAkic3QscXVhZGZzIgotICAic3Qsc3RpaDQwNy1xdWFkZnM2NjAtQyIsCSJzdCxxdWFkZnMiCi0gICJzdCxzdGloNDA3LXF1YWRmczY2MC1EIiwJInN0LHF1YWRmcyIKKyAgInN0LHF1YWRmcyIKKyAgInN0LHF1YWRmcy1wbGwiCiAKIAogLSAjY2xvY2stY2VsbHMgOiBmcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOyBzaGFsbCBiZSBzZXQgdG8gMS4KQEAgLTM1LDE0ICszMSwxNSBAQAogCiBFeGFtcGxlOgogCi0JY2xvY2tnZW5fZTogY2xvY2tnZW4tZUBmZDMyMDhiYyB7Ci0gICAgICAgICAgICAgICAgI2Nsb2NrLWNlbGxzID0gPDE+OwotICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1xdWFkZnM2NjAtRSIsICJzdCxxdWFkZnMiOwotICAgICAgICAgICAgICAgIHJlZyA9IDwweGZkMzIwOGJjIDB4QjA+OworCWNsa19zX2MwX3F1YWRmczogY2xrLXMtYzAtcXVhZGZzQDkxMDMwMDAgeworCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic3QscXVhZGZzLXBsbCI7CisJCXJlZyA9IDwweDkxMDMwMDAgMHgxMDAwPjsKIAotICAgICAgICAgICAgICAgIGNsb2NrcyA9IDwmY2xrX3N5c2luPjsKLSAgICAgICAgICAgICAgICBjbG9jay1vdXRwdXQtbmFtZXMgPSAiY2xrLW0tcGl4LW1kdHAtMCIsCi0JCQkJICAgICAiY2xrLW0tcGl4LW1kdHAtMSIsCi0JCQkJICAgICAiY2xrLW0tcGl4LW1kdHAtMiIsCi0JCQkJICAgICAiY2xrLW0tbXBlbHBjIjsKLSAgICAgICAgfTsKKwkJY2xvY2tzID0gPCZjbGtfc3lzaW4+OworCisJCWNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbGstcy1jMC1mczAtY2gwIiwKKwkJCQkgICAgICJjbGstcy1jMC1mczAtY2gxIiwKKwkJCQkgICAgICJjbGstcy1jMC1mczAtY2gyIiwKKwkJCQkgICAgICJjbGstcy1jMC1mczAtY2gzIjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3N1bnhpLWNjdS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3VueGktY2N1LnR4dAppbmRleCBjYjkxNTA3Li4zODY4NDU4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3VueGktY2N1LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svc3VueGktY2N1LnR4dApAQCAtMiw3ICsyLDEwIEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogUmVxdWlyZWQgcHJvcGVydGllcyA6Ci0tIGNvbXBhdGlibGU6IG11c3QgY29udGFpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb21wYXRpYmxlOgorLSBjb21wYXRpYmxlOiBtdXN0IGNvbnRhaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY29tcGF0aWJsZXM6CisJCS0gImFsbHdpbm5lcixzdW42aS1hMzEtY2N1IgorCQktICJhbGx3aW5uZXIsc3VuOGktYTIzLWNjdSIKKwkJLSAiYWxsd2lubmVyLHN1bjhpLWEzMy1jY3UiCiAJCS0gImFsbHdpbm5lcixzdW44aS1oMy1jY3UiCiAKIC0gcmVnOiBNdXN0IGNvbnRhaW4gdGhlIHJlZ2lzdGVycyBiYXNlIGFkZHJlc3MgYW5kIGxlbmd0aApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3VuaXBoaWVyLWNsb2NrLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay91bmlwaGllci1jbG9jay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxNzlkMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay91bmlwaGllci1jbG9jay50eHQKQEAgLTAsMCArMSwxMzQgQEAKK1VuaVBoaWVyIGNsb2NrIGNvbnRyb2xsZXIKKworCitTeXN0ZW0gY2xvY2sKKy0tLS0tLS0tLS0tLQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgInNvY2lvbmV4dCx1bmlwaGllci1zbGQzLWNsb2NrIiAtIGZvciBzTEQzIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkNC1jbG9jayIgIC0gZm9yIExENCBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1wcm80LWNsb2NrIiAtIGZvciBQcm80IFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXNsZDgtY2xvY2siIC0gZm9yIHNMRDggU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHJvNS1jbG9jayIgLSBmb3IgUHJvNSBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1weHMyLWNsb2NrIiAtIGZvciBQWHMyL0xENmIgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItbGQxMS1jbG9jayIgLSBmb3IgTEQxMSBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLWNsb2NrIiAtIGZvciBMRDIwIFNvQy4KKy0gI2Nsb2NrLWNlbGxzOiBzaG91bGQgYmUgMS4KKworRXhhbXBsZToKKworCXN5c2N0cmxANjE4NDAwMDAgeworCQljb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1zeXNjdHJsIiwKKwkJCSAgICAgInNpbXBsZS1tZmQiLCAic3lzY29uIjsKKwkJcmVnID0gPDB4NjE4NDAwMDAgMHg0MDAwPjsKKworCQljbG9jayB7CisJCQljb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLWNsb2NrIjsKKwkJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJfTsKKworCQlvdGhlciBub2RlcyAuLi4KKwl9OworCitQcm92aWRlZCBjbG9ja3M6CisKKyA4OiBTVCBETUFDCisxMjogR0lPIChHaWdhIGJpdCBzdHJlYW0gSS9PKQorMTQ6IFVTQjMgY2gwIGhvc3QKKzE1OiBVU0IzIGNoMSBob3N0CisxNjogVVNCMyBjaDAgUEhZMAorMTc6IFVTQjMgY2gwIFBIWTEKKzIwOiBVU0IzIGNoMSBQSFkwCisyMTogVVNCMyBjaDEgUEhZMQorCisKK01lZGlhIEkvTyAoTUlPKSBjbG9jaworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXNsZDMtbWlvLWNsb2NrIiAtIGZvciBzTEQzIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkNC1taW8tY2xvY2siICAtIGZvciBMRDQgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHJvNC1taW8tY2xvY2siIC0gZm9yIFBybzQgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItc2xkOC1taW8tY2xvY2siIC0gZm9yIHNMRDggU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHJvNS1taW8tY2xvY2siIC0gZm9yIFBybzUgU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHhzMi1taW8tY2xvY2siIC0gZm9yIFBYczIvTEQ2YiBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1sZDExLW1pby1jbG9jayIgLSBmb3IgTEQxMSBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLW1pby1jbG9jayIgLSBmb3IgTEQyMCBTb0MuCistICNjbG9jay1jZWxsczogc2hvdWxkIGJlIDEuCisKK0V4YW1wbGU6CisKKwltaW9jdHJsQDU5ODEwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzb2Npb25leHQsdW5pcGhpZXItbWlvY3RybCIsCisJCQkgICAgICJzaW1wbGUtbWZkIiwgInN5c2NvbiI7CisJCXJlZyA9IDwweDU5ODEwMDAwIDB4ODAwPjsKKworCQljbG9jayB7CisJCQljb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLW1pby1jbG9jayI7CisJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCX07CisKKwkJb3RoZXIgbm9kZXMgLi4uCisJfTsKKworUHJvdmlkZWQgY2xvY2tzOgorCisgMDogU0QgY2gwIGhvc3QKKyAxOiBlTU1DIGhvc3QKKyAyOiBTRCBjaDEgaG9zdAorIDc6IE1JTyBETUFDCisgODogVVNCMiBjaDAgaG9zdAorIDk6IFVTQjIgY2gxIGhvc3QKKzEwOiBVU0IyIGNoMiBob3N0CisxMTogVVNCMiBjaDMgaG9zdAorMTI6IFVTQjIgY2gwIFBIWQorMTM6IFVTQjIgY2gxIFBIWQorMTQ6IFVTQjIgY2gyIFBIWQorMTU6IFVTQjIgY2gzIFBIWQorCisKK1BlcmlwaGVyYWwgY2xvY2sKKy0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICAgICJzb2Npb25leHQsdW5pcGhpZXItc2xkMy1wZXJpLWNsb2NrIiAtIGZvciBzTEQzIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkNC1wZXJpLWNsb2NrIiAgLSBmb3IgTEQ0IFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXBybzQtcGVyaS1jbG9jayIgLSBmb3IgUHJvNCBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1zbGQ4LXBlcmktY2xvY2siIC0gZm9yIHNMRDggU29DLgorICAgICJzb2Npb25leHQsdW5pcGhpZXItcHJvNS1wZXJpLWNsb2NrIiAtIGZvciBQcm81IFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLXB4czItcGVyaS1jbG9jayIgLSBmb3IgUFhzMi9MRDZiIFNvQy4KKyAgICAic29jaW9uZXh0LHVuaXBoaWVyLWxkMTEtcGVyaS1jbG9jayIgLSBmb3IgTEQxMSBTb0MuCisgICAgInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLXBlcmktY2xvY2siIC0gZm9yIExEMjAgU29DLgorLSAjY2xvY2stY2VsbHM6IHNob3VsZCBiZSAxLgorCitFeGFtcGxlOgorCisJcGVyaWN0cmxANTk4MjAwMDAgeworCQljb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1wZXJpY3RybCIsCisJCQkgICAgICJzaW1wbGUtbWZkIiwgInN5c2NvbiI7CisJCXJlZyA9IDwweDU5ODIwMDAwIDB4MjAwPjsKKworCQljbG9jayB7CisJCQljb21wYXRpYmxlID0gInNvY2lvbmV4dCx1bmlwaGllci1sZDIwLXBlcmktY2xvY2siOworCQkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQl9OworCisJCW90aGVyIG5vZGVzIC4uLgorCX07CisKK1Byb3ZpZGVkIGNsb2NrczoKKworIDA6IFVBUlQgY2gwCisgMTogVUFSVCBjaDEKKyAyOiBVQVJUIGNoMgorIDM6IFVBUlQgY2gzCisgNDogSTJDIGNoMAorIDU6IEkyQyBjaDEKKyA2OiBJMkMgY2gyCisgNzogSTJDIGNoMworIDg6IEkyQyBjaDQKKyA5OiBJMkMgY2g1CisxMDogSTJDIGNoNgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3hnZW5lLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay94Z2VuZS50eHQKaW5kZXggODJmOTYzOC4uODIzM2U3NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3hnZW5lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2sveGdlbmUudHh0CkBAIC04LDYgKzgsNyBAQAogLSBjb21wYXRpYmxlIDogc2hhbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAJImFwbSx4Z2VuZS1zb2NwbGwtY2xvY2siIC0gZm9yIGEgWC1HZW5lIFNvQyBQTEwgY2xvY2sKIAkiYXBtLHhnZW5lLXBjcHBsbC1jbG9jayIgLSBmb3IgYSBYLUdlbmUgUENQIFBMTCBjbG9jaworCSJhcG0seGdlbmUtcG1kLWNsb2NrIiAtIGZvciBhIFgtR2VuZSBQTUQgY2xvY2sKIAkiYXBtLHhnZW5lLWRldmljZS1jbG9jayIgLSBmb3IgYSBYLUdlbmUgZGV2aWNlIGNsb2NrCiAJImFwbSx4Z2VuZS1zb2NwbGwtdjItY2xvY2siIC0gZm9yIGEgWC1HZW5lIFNvQyBQTEwgdjIgY2xvY2sKIAkiYXBtLHhnZW5lLXBjcHBsbC12Mi1jbG9jayIgLSBmb3IgYSBYLUdlbmUgUENQIFBMTCB2MiBjbG9jawpAQCAtMjIsNiArMjMsMTUgQEAKIE9wdGlvbmFsIHByb3BlcnRpZXMgZm9yIFBMTCBjbG9ja3M6CiAtIGNsb2NrLW5hbWVzIDogc2hhbGwgYmUgdGhlIG5hbWUgb2YgdGhlIFBMTC4gSWYgbWlzc2luZywgdXNlIHRoZSBkZXZpY2UgbmFtZS4KIAorUmVxdWlyZWQgcHJvcGVydGllcyBmb3IgUE1EIGNsb2NrczoKKy0gcmVnIDogc2hhbGwgYmUgdGhlIHBoeXNpY2FsIHJlZ2lzdGVyIGFkZHJlc3MgZm9yIHRoZSBwbWQgY2xvY2suCistIGNsb2NrcyA6IHNoYWxsIGJlIHRoZSBpbnB1dCBwYXJlbnQgY2xvY2sgcGhhbmRsZSBmb3IgdGhlIGNsb2NrLgorLSAjY2xvY2stY2VsbHMgOiBzaGFsbCBiZSBzZXQgdG8gMS4KKy0gY2xvY2stb3V0cHV0LW5hbWVzIDogc2hhbGwgYmUgdGhlIG5hbWUgb2YgdGhlIGNsb2NrIHJlZmVyZW5jZWQgYnkgZGVyaXZlCisgIGNsb2NrLgorT3B0aW9uYWwgcHJvcGVydGllcyBmb3IgUExMIGNsb2NrczoKKy0gY2xvY2stbmFtZXMgOiBzaGFsbCBiZSB0aGUgbmFtZSBvZiB0aGUgY2xvY2suIElmIG1pc3NpbmcsIHVzZSB0aGUgZGV2aWNlIG5hbWUuCisKIFJlcXVpcmVkIHByb3BlcnRpZXMgZm9yIGRldmljZSBjbG9ja3M6CiAtIHJlZyA6IHNoYWxsIGJlIGEgbGlzdCBvZiBhZGRyZXNzIGFuZCBsZW5ndGggcGFpcnMgZGVzY3JpYmluZyB0aGUgQ1NSCiAgICAgICAgICByZXNldCBhbmQvb3IgdGhlIGRpdmlkZXIuIEVpdGhlciBtYXkgYmUgb21pdHRlZCwgYnV0IGF0IGxlYXN0CkBAIC01OSw2ICs2OSwxNCBAQAogCQl0eXBlID0gPDA+OwogCX07CiAKKwlwbWQwY2xrOiBwbWQwY2xrQDdlMjAwMjAwIHsKKwkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtcG1kLWNsb2NrIjsKKwkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQljbG9ja3MgPSA8JnBtZHBsbCAwPjsKKwkJcmVnID0gPDB4MCAweDdlMjAwMjAwIDB4MCAweDEwPjsKKwkJY2xvY2stb3V0cHV0LW5hbWVzID0gInBtZDBjbGsiOworCX07CisKIAlzb2NwbGw6IHNvY3BsbEAxNzAwMDEyMCB7CiAJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLXNvY3BsbC1jbG9jayI7CiAJCSNjbG9jay1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay96eDI5NjcxOC1jbGsudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL3p4Mjk2NzE4LWNsay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxOGI3YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay96eDI5NjcxOC1jbGsudHh0CkBAIC0wLDAgKzEsMzUgQEAKK0RldmljZSBUcmVlIENsb2NrIGJpbmRpbmdzIGZvciBaVEUgengyOTY3MTgKKworVGhpcyBiaW5kaW5nIHVzZXMgdGhlIGNvbW1vbiBjbG9jayBiaW5kaW5nWzFdLgorCitbMV0gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Nsb2NrL2Nsb2NrLWJpbmRpbmdzLnR4dAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogc2hhbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJInp0ZSx6eDI5NjcxOC10b3Bjcm0iOgorCQl6eDI5NjcxOCB0b3AgY2xvY2sgc2VsZWN0aW9uLCBkaXZpZGVyIGFuZCBnYXRpbmcKKworCSJ6dGUsengyOTY3MTgtbHNwMGNybSIgYW5kCisJInp0ZSx6eDI5NjcxOC1sc3AxY3JtIjoKKwkJengyOTY3MTggZGV2aWNlIGxldmVsIGNsb2NrIHNlbGVjdGlvbiBhbmQgZ2F0aW5nCisKKy0gcmVnOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldAorCitUaGUgY2xvY2sgY29uc3VtZXIgc2hvdWxkIHNwZWNpZnkgdGhlIGRlc2lyZWQgY2xvY2sgYnkgaGF2aW5nIHRoZSBjbG9jaworSUQgaW4gaXRzICJjbG9ja3MiIHBoYW5kbGUgY2VsbC4gU2VlIGluY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svengyOTY3MTgtY2xvY2suaAorZm9yIHRoZSBmdWxsIGxpc3Qgb2YgengyOTY3MTggY2xvY2sgSURzLgorCisKK3RvcGNsazogdG9wY3JtQDE0NjEwMDAgeworICAgICAgICBjb21wYXRpYmxlID0gInp0ZSx6eDI5NjcxOC10b3Bjcm0tY2xrIjsKKyAgICAgICAgcmVnID0gPDB4MDE0NjEwMDAgMHgxMDAwPjsKKyAgICAgICAgI2Nsb2NrLWNlbGxzID0gPDE+OworfTsKKwordXNicGh5MDp1c2ItcGh5MCB7CisJY29tcGF0aWJsZSA9ICJ6dGUsengyOTY3MTgtdXNiLXBoeSI7CisJI3BoeS1jZWxscyA9IDwwPjsKKwljbG9ja3MgPSA8JnRvcGNsayBVU0IyMF9QSFlfQ0xLPjsKKwljbG9jay1uYW1lcyA9ICJwaHljbGsiOworCXN0YXR1cyA9ICJva2F5IjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGV2ZnJlcS9ldmVudC9yb2NrY2hpcC1kZmkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RldmZyZXEvZXZlbnQvcm9ja2NoaXAtZGZpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjIzMzEzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RldmZyZXEvZXZlbnQvcm9ja2NoaXAtZGZpLnR4dApAQCAtMCwwICsxLDE5IEBACisKKyogUm9ja2NoaXAgcmszMzk5IERGSSBkZXZpY2UKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogTXVzdCBiZSAicm9ja2NoaXAscmszMzk5LWRmaSIuCistIHJlZzogcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIGVhY2ggREZJIGFuZCBsZW5ndGggb2YgbWVtb3J5IG1hcHBlZCByZWdpb24KKy0gcm9ja2NoaXAscG11OiBwaGFuZGxlIHRvIHRoZSBzeXNjb24gbWFuYWdpbmcgdGhlICJwbXUgZ2VuZXJhbCByZWdpc3RlciBmaWxlcyIKKy0gY2xvY2tzOiBwaGFuZGxlcyBmb3IgY2xvY2sgc3BlY2lmaWVkIGluICJjbG9jay1uYW1lcyIgcHJvcGVydHkKKy0gY2xvY2stbmFtZXMgOiB0aGUgbmFtZSBvZiBjbG9jayB1c2VkIGJ5IHRoZSBERkksIG11c3QgYmUgInBjbGtfZGRyX21vbiI7CisKK0V4YW1wbGU6CisJZGZpOiBkZmlAMHhmZjYzMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LWRmaSI7CisJCXJlZyA9IDwweDAwIDB4ZmY2MzAwMDAgMHgwMCAweDQwMDA+OworCQlyb2NrY2hpcCxwbXUgPSA8JnBtdWdyZj47CisJCWNsb2NrcyA9IDwmY3J1IFBDTEtfRERSX01PTj47CisJCWNsb2NrLW5hbWVzID0gInBjbGtfZGRyX21vbiI7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kZXZmcmVxL3JrMzM5OV9kbWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RldmZyZXEvcmszMzk5X2RtYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5ZTg2MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kZXZmcmVxL3JrMzM5OV9kbWMudHh0CkBAIC0wLDAgKzEsMjA5IEBACisqIFJvY2tjaGlwIHJrMzM5OSBETUMoRHluYW1pYyBNZW1vcnkgQ29udHJvbGxlcikgZGV2aWNlCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6CQkgTXVzdCBiZSAicm9ja2NoaXAscmszMzk5LWRtYyIuCistIGRldmZyZXEtZXZlbnRzOgkgTm9kZSB0byBnZXQgRERSIGxvYWRpbmcsIFJlZmVyIHRvCisJCQkgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RldmZyZXEvCisJCQkgcm9ja2NoaXAtZGZpLnR4dAorLSBpbnRlcnJ1cHRzOgkJIFRoZSBpbnRlcnJ1cHQgbnVtYmVyIHRvIHRoZSBDUFUuIFRoZSBpbnRlcnJ1cHQKKwkJCSBzcGVjaWZpZXIgZm9ybWF0IGRlcGVuZHMgb24gdGhlIGludGVycnVwdCBjb250cm9sbGVyLgorCQkJIEl0IHNob3VsZCBiZSBEQ0YgaW50ZXJydXB0cywgd2hlbiBERFIgZHZmcyBmaW5pc2gsCisJCQkgaXQgd2lsbCBoYXBwZW4uCistIGNsb2NrczoJCSBQaGFuZGxlcyBmb3IgY2xvY2sgc3BlY2lmaWVkIGluICJjbG9jay1uYW1lcyIgcHJvcGVydHkKKy0gY2xvY2stbmFtZXMgOgkJIFRoZSBuYW1lIG9mIGNsb2NrIHVzZWQgYnkgdGhlIERGSSwgbXVzdCBiZQorCQkJICJwY2xrX2Rkcl9tb24iOworLSBvcGVyYXRpbmctcG9pbnRzLXYyOgkgUmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL29wcC50eHQKKwkJCSBmb3IgZGV0YWlscy4KKy0gY2VudGVyLXN1cHBseToJIERNQyBzdXBwbHkgbm9kZS4KKy0gc3RhdHVzOgkJIE1hcmtzIHRoZSBub2RlIGVuYWJsZWQvZGlzYWJsZWQuCisKK0ZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBkZHIgdGltaW5nOgorCistIHJvY2tjaGlwLGRyYW1fc3BlZWRfYmluIDoJICBWYWx1ZSByZWZlcmVuY2UgaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9kZHIuaCwKKwkJCQkgIGl0IHNlbGVjdCBkZHIzIGNsLXRycC10cmNkIHR5cGUsIGRlZmF1bHQgdmFsdWUKKwkJCQkgICJERFIzX0RFRkFVTFQiLml0IG11c3Qgc2VsZWN0ZWQgYWNjb3JkaW5nIHRvCisJCQkJICAiU3BlZWQgQmluIiBpbiBkZHIzIGRhdGFzaGVldCwgRE8gTk9UIHVzZQorCQkJCSAgc21hbGxlciAiU3BlZWQgQmluIiB0aGFuIGRkcjMgZXhhY3RseSBpcy4KKworLSByb2NrY2hpcCxwZF9pZGxlIDoJCSAgQ29uZmlnIHRoZSBQRF9JRExFIHZhbHVlLCBkZWZpbmVkIHRoZSBwb3dlci1kb3duCisJCQkJICBpZGxlIHBlcmlvZCwgbWVtb3JpZXMgYXJlIHBsYWNlcyBpbnRvIHBvd2VyLWRvd24KKwkJCQkgIG1vZGUgaWYgYnVzIGlzIGlkbGUgZm9yIFBEX0lETEUgREZJIGNsb2Nrcy4KKworLSByb2NrY2hpcCxzcl9pZGxlIDoJCSAgQ29uZmlndXJlIHRoZSBTUl9JRExFIHZhbHVlLCBkZWZpbmVkIHRoZQorCQkJCSAgc2VsZnJlZnJlc2ggaWRsZSBwZXJpb2QsIG1lbW9yaWVzIGFyZSBwbGFjZXMKKwkJCQkgIGludG8gc2VsZi1yZWZyZXNoIG1vZGUgaWYgYnVzIGlzIGlkbGUgZm9yCisJCQkJICBTUl9JRExFKjEwMjQgREZJIGNsb2NrcyAoREZJIGNsb2NrcyBmcmVxIGlzCisJCQkJICBoYWxmIG9mIGRyYW0ncyBjbG9ja3MpLCBkZWZhdWxlIHZhbHVlIGlzICIwIi4KKworLSByb2NrY2hpcCxzcl9tY19nYXRlX2lkbGUgOgkgIERlZmluZWQgdGhlIHNlbGYtcmVmcmVzaCB3aXRoIG1lbW9yeSBhbmQKKwkJCQkgIGNvbnRyb2xsZXIgY2xvY2sgZ2F0aW5nIGlkbGUgcGVyaW9kLCBtZW1vcmllcworCQkJCSAgYXJlIHBsYWNlcyBpbnRvIHNlbGYtcmVmcmVzaCBtb2RlIGFuZCBtZW1vcnkKKwkJCQkgIGNvbnRyb2xsZXIgY2xvY2sgYXJnIGdhdGluZyBpZiBidXMgaXMgaWRsZSBmb3IKKwkJCQkgIHNyX21jX2dhdGVfaWRsZSoxMDI0IERGSSBjbG9ja3MuCisKKy0gcm9ja2NoaXAsc3JwZF9saXRlX2lkbGUgOgkgIERlZmluZWQgdGhlIHNlbGYtcmVmcmVzaCBwb3dlciBkb3duIGlkbGUKKwkJCQkgIHBlcmlvZCwgbWVtb3JpZXMgYXJlIHBsYWNlcyBpbnRvIHNlbGYtcmVmcmVzaAorCQkJCSAgcG93ZXIgZG93biBtb2RlIGlmIGJ1cyBpcyBpZGxlIGZvcgorCQkJCSAgc3JwZF9saXRlX2lkbGUqMTAyNCBERkkgY2xvY2tzLiBUaGlzIHBhcmFtZXRlcgorCQkJCSAgaXMgZm9yIExQRERSNCBvbmx5LgorCistIHJvY2tjaGlwLHN0YW5kYnlfaWRsZSA6CSAgRGVmaW5lZCB0aGUgc3RhbmRieSBpZGxlIHBlcmlvZCwgbWVtb3JpZXMgYXJlCisJCQkJICBwbGFjZXMgaW50byBzZWxmLXJlZnJlc2ggdGhhbiBjb250cm9sbGVyLCBwaSwKKwkJCQkgIHBoeSBhbmQgZHJhbSBjbG9jayB3aWxsIGdhdGluZyBpZiBidXMgaXMgaWRsZQorCQkJCSAgZm9yIHN0YW5kYnlfaWRsZSAqIERGSSBjbG9ja3MuCisKKy0gcm9ja2NoaXAsZHJhbV9kbGxfZGlzYl9mcmVxIDogIEl0J3MgZGVmaW5lZCB0aGUgRERSMyBkbGwgYnlwYXNzIGZyZXF1ZW5jeSBpbgorCQkJCSAgTUh6LCB3aGVuIGRkciBmcmVxIGxlc3MgdGhhbiBEUkFNX0RMTF9ESVNCX0ZSRVEsCisJCQkJICBkZHIzIGRsbCB3aWxsIGJ5cHNzZWQgbm90ZTogaWYgZGxsIHdhcyBieXBhc3NlZCwKKwkJCQkgIHRoZSBvZHQgYWxzbyBzdG9wIHdvcmtpbmcuCisKKy0gcm9ja2NoaXAscGh5X2RsbF9kaXNiX2ZyZXEgOgkgIERlZmluZWQgdGhlIFBIWSBkbGwgYnlwYXNzIGZyZXF1ZW5jeSBpbgorCQkJCSAgTUh6IChNZWdhIEh6KSwgd2hlbiBkZHIgZnJlcSBsZXNzIHRoYW4KKwkJCQkgIERSQU1fRExMX0RJU0JfRlJFUSwgcGh5IGRsbCB3aWxsIGJ5cHNzZWQuCisJCQkJICBub3RlOiBwaHkgZGxsIGFuZCBwaHkgb2R0IGFyZSBpbmRlcGVuZGVudC4KKworLSByb2NrY2hpcCxkZHIzX29kdF9kaXNiX2ZyZXEgOiAgV2hlbiBkcmFtIHR5cGUgaXMgRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lZAorCQkJCSAgdGhlIG9kdCBkaXNhYmxlIGZyZXF1ZW5jeSBpbiBNSHogKE1lZ2EgSHopLAorCQkJCSAgd2hlbiBkZHIgZnJlcXVlbmN5IGxlc3MgdGhlbiBkZHIzX29kdF9kaXNiX2ZyZXEsCisJCQkJICB0aGUgb2R0IG9uIGRyYW0gc2lkZSBhbmQgY29udHJvbGxlciBzaWRlIGFyZQorCQkJCSAgYm90aCBkaXNhYmxlZC4KKworLSByb2NrY2hpcCxkZHIzX2RydiA6CQkgIFdoZW4gZHJhbSB0eXBlIGlzIEREUjMsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIGRyYW0gc2lkZSBkcml2ZXIgc3Rlbmd0aCBpbiBvaG0sIGRlZmF1bHQKKwkJCQkgIHZhbHVlIGlzIEREUjNfRFNfNDBvaG0uCisKKy0gcm9ja2NoaXAsZGRyM19vZHQgOgkJICBXaGVuIGRyYW0gdHlwZSBpcyBERFIzLCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBkcmFtIHNpZGUgT0RUIHN0ZW5ndGggaW4gb2htLCBkZWZhdWx0IHZhbHVlCisJCQkJICBpcyBERFIzX09EVF8xMjBvaG0uCisKKy0gcm9ja2NoaXAscGh5X2RkcjNfY2FfZHJ2IDoJICBXaGVuIGRyYW0gdHlwZSBpcyBERFIzLCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBwaHkgc2lkZSBDQSBsaW5lKGluY2x1aW5nIGNvbW1hbmQgbGluZSwKKwkJCQkgIGFkZHJlc3MgbGluZSBhbmQgY2xvY2sgbGluZSkgZHJpdmVyIHN0cmVuZ3RoLgorCQkJCSAgRGVmYXVsdCB2YWx1ZSBpcyBQSFlfRFJWX09EVF80MC4KKworLSByb2NrY2hpcCxwaHlfZGRyM19kcV9kcnYgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIEREUjMsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIHBoeSBzaWRlIERRIGxpbmUoaW5jbHVpbmcgRFFTL0RRL0RNIGxpbmUpCisJCQkJICBkcml2ZXIgc3RyZW5ndGguIGRlZmF1bHQgdmFsdWUgaXMgUEhZX0RSVl9PRFRfNDAuCisKKy0gcm9ja2NoaXAscGh5X2RkcjNfb2R0IDogCSAgV2hlbiBkcmFtIHR5cGUgaXMgRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lIHRoZQorCQkJCSAgcGh5IHNpZGUgb2R0IHN0cmVuZ3RoLCBkZWZhdWx0IHZhbHVlIGlzCisJCQkJICBQSFlfRFJWX09EVF8yNDAuCisKKy0gcm9ja2NoaXAsbHBkZHIzX29kdF9kaXNiX2ZyZXEgOiBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjMsIHRoaXMgcGFyYW1ldGVyIGRlZmluZWQKKwkJCQkgIHRoZW4gb2R0IGRpc2FibGUgZnJlcXVlbmN5IGluIE1IeiAoTWVnYSBIeiksCisJCQkJICB3aGVuIGRkciBmcmVxdWVuY3kgbGVzcyB0aGVuIGRkcjNfb2R0X2Rpc2JfZnJlcSwKKwkJCQkgIHRoZSBvZHQgb24gZHJhbSBzaWRlIGFuZCBjb250cm9sbGVyIHNpZGUgYXJlCisJCQkJICBib3RoIGRpc2FibGVkLgorCistIHJvY2tjaGlwLGxwZGRyM19kcnYgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgZHJhbSBzaWRlIGRyaXZlciBzdGVuZ3RoIGluIG9obSwgZGVmYXVsdAorCQkJCSAgdmFsdWUgaXMgTFAzX0RTXzM0b2htLgorCistIHJvY2tjaGlwLGxwZGRyM19vZHQgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgZHJhbSBzaWRlIE9EVCBzdGVuZ3RoIGluIG9obSwgZGVmYXVsdCB2YWx1ZQorCQkJCSAgaXMgTFAzX09EVF8yNDBvaG0uCisKKy0gcm9ja2NoaXAscGh5X2xwZGRyM19jYV9kcnYgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgcGh5IHNpZGUgQ0EgbGluZShpbmNsdWluZyBjb21tYW5kIGxpbmUsCisJCQkJICBhZGRyZXNzIGxpbmUgYW5kIGNsb2NrIGxpbmUpIGRyaXZlciBzdHJlbmd0aC4KKwkJCQkgIGRlZmF1bHQgdmFsdWUgaXMgUEhZX0RSVl9PRFRfNDAuCisKKy0gcm9ja2NoaXAscGh5X2xwZGRyM19kcV9kcnYgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSMywgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgcGh5IHNpZGUgRFEgbGluZShpbmNsdWluZyBEUVMvRFEvRE0gbGluZSkKKwkJCQkgIGRyaXZlciBzdHJlbmd0aC4gZGVmYXVsdCB2YWx1ZSBpcworCQkJCSAgUEhZX0RSVl9PRFRfNDAuCisKKy0gcm9ja2NoaXAscGh5X2xwZGRyM19vZHQgOiAJICBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjMsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIHBoeSBzaWRlIG9kdCBzdHJlbmd0aCwgZGVmYXVsdCB2YWx1ZSBpcworCQkJCSAgUEhZX0RSVl9PRFRfMjQwLgorCistIHJvY2tjaGlwLGxwZGRyNF9vZHRfZGlzYl9mcmVxIDogV2hlbiBkcmFtIHR5cGUgaXMgTFBERFI0LCB0aGlzIHBhcmFtZXRlcgorCQkJCSAgZGVmaW5lZCB0aGUgb2R0IGRpc2FibGUgZnJlcXVlbmN5IGluCisJCQkJICBNSHogKE1lZ2EgSHopLCB3aGVuIGRkciBmcmVxdWVuY3kgbGVzcyB0aGVuCisJCQkJICBkZHIzX29kdF9kaXNiX2ZyZXEsIHRoZSBvZHQgb24gZHJhbSBzaWRlIGFuZAorCQkJCSAgY29udHJvbGxlciBzaWRlIGFyZSBib3RoIGRpc2FibGVkLgorCistIHJvY2tjaGlwLGxwZGRyNF9kcnYgOgkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSNCwgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgZHJhbSBzaWRlIGRyaXZlciBzdGVuZ3RoIGluIG9obSwgZGVmYXVsdAorCQkJCSAgdmFsdWUgaXMgTFA0X1BERFNfNjBvaG0uCisKKy0gcm9ja2NoaXAsbHBkZHI0X2RxX29kdCA6IAkgIFdoZW4gZHJhbSB0eXBlIGlzIExQRERSNCwgdGhpcyBwYXJhbWV0ZXIgZGVmaW5lCisJCQkJICB0aGUgZHJhbSBzaWRlIE9EVCBvbiBkcXMvZHEgbGluZSBzdGVuZ3RoIGluIG9obSwKKwkJCQkgIGRlZmF1bHQgdmFsdWUgaXMgTFA0X0RRX09EVF80MG9obS4KKworLSByb2NrY2hpcCxscGRkcjRfY2Ffb2R0IDoJICBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjQsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIGRyYW0gc2lkZSBPRFQgb24gY2EgbGluZSBzdGVuZ3RoIGluIG9obSwKKwkJCQkgIGRlZmF1bHQgdmFsdWUgaXMgTFA0X0NBX09EVF80MG9obS4KKworLSByb2NrY2hpcCxwaHlfbHBkZHI0X2NhX2RydiA6CSAgV2hlbiBkcmFtIHR5cGUgaXMgTFBERFI0LCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBwaHkgc2lkZSAgQ0EgbGluZShpbmNsdWluZyBjb21tYW5kIGFkZHJlc3MKKwkJCQkgIGxpbmUpIGRyaXZlciBzdHJlbmd0aC4gZGVmYXVsdCB2YWx1ZSBpcworCQkJCSAgUEhZX0RSVl9PRFRfNDAuCisKKy0gcm9ja2NoaXAscGh5X2xwZGRyNF9ja19jc19kcnYgOiBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjQsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIHBoeSBzaWRlIGNsb2NrIGxpbmUgYW5kIGNzIGxpbmUgZHJpdmVyCisJCQkJICBzdHJlbmd0aC4gZGVmYXVsdCB2YWx1ZSBpcyBQSFlfRFJWX09EVF84MC4KKworLSByb2NrY2hpcCxwaHlfbHBkZHI0X2RxX2RydiA6CSAgV2hlbiBkcmFtIHR5cGUgaXMgTFBERFI0LCB0aGlzIHBhcmFtZXRlciBkZWZpbmUKKwkJCQkgIHRoZSBwaHkgc2lkZSBEUSBsaW5lKGluY2x1aW5nIERRUy9EUS9ETSBsaW5lKQorCQkJCSAgZHJpdmVyIHN0cmVuZ3RoLiBkZWZhdWx0IHZhbHVlIGlzIFBIWV9EUlZfT0RUXzgwLgorCistIHJvY2tjaGlwLHBoeV9scGRkcjRfb2R0IDoJICBXaGVuIGRyYW0gdHlwZSBpcyBMUEREUjQsIHRoaXMgcGFyYW1ldGVyIGRlZmluZQorCQkJCSAgdGhlIHBoeSBzaWRlIG9kdCBzdHJlbmd0aCwgZGVmYXVsdCB2YWx1ZSBpcworCQkJCSAgUEhZX0RSVl9PRFRfNjAuCisKK0V4YW1wbGU6CisJZG1jX29wcF90YWJsZTogZG1jX29wcF90YWJsZSB7CisJCWNvbXBhdGlibGUgPSAib3BlcmF0aW5nLXBvaW50cy12MiI7CisKKwkJb3BwMDAgeworCQkJb3BwLWh6ID0gL2JpdHMvIDY0IDwzMDAwMDAwMDA+OworCQkJb3BwLW1pY3Jvdm9sdCA9IDw5MDAwMDA+OworCQl9OworCQlvcHAwMSB7CisJCQlvcHAtaHogPSAvYml0cy8gNjQgPDY2NjAwMDAwMD47CisJCQlvcHAtbWljcm92b2x0ID0gPDkwMDAwMD47CisJCX07CisJfTsKKworCWRtYzogZG1jIHsKKwkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZG1jIjsKKwkJZGV2ZnJlcS1ldmVudHMgPSA8JmRmaT47CisJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQljbG9ja3MgPSA8JmNydSBTQ0xLX0REUkNMSz47CisJCWNsb2NrLW5hbWVzID0gImRtY19jbGsiOworCQlvcGVyYXRpbmctcG9pbnRzLXYyID0gPCZkbWNfb3BwX3RhYmxlPjsKKwkJY2VudGVyLXN1cHBseSA9IDwmcHB2YXJfY2VudGVybG9naWM+OworCQl1cHRocmVzaG9sZCA9IDwxNT47CisJCWRvd25kaWZmZXJlbnRpYWwgPSA8MTA+OworCQlyb2NrY2hpcCxkZHIzX3NwZWVkX2JpbiA9IDwyMT47CisJCXJvY2tjaGlwLHBkX2lkbGUgPSA8MHg0MD47CisJCXJvY2tjaGlwLHNyX2lkbGUgPSA8MHgyPjsKKwkJcm9ja2NoaXAsc3JfbWNfZ2F0ZV9pZGxlID0gPDB4Mz47CisJCXJvY2tjaGlwLHNycGRfbGl0ZV9pZGxlCT0gPDB4ND47CisJCXJvY2tjaGlwLHN0YW5kYnlfaWRsZSA9IDwweDIwMDA+OworCQlyb2NrY2hpcCxkcmFtX2RsbF9kaXNfZnJlcSA9IDwzMDA+OworCQlyb2NrY2hpcCxwaHlfZGxsX2Rpc19mcmVxID0gPDEyNT47CisJCXJvY2tjaGlwLGF1dG9fcGRfZGlzX2ZyZXEgPSA8NjY2PjsKKwkJcm9ja2NoaXAsZGRyM19vZHRfZGlzX2ZyZXEgPSA8MzMzPjsKKwkJcm9ja2NoaXAsZGRyM19kcnYgPSA8RERSM19EU180MG9obT47CisJCXJvY2tjaGlwLGRkcjNfb2R0ID0gPEREUjNfT0RUXzEyMG9obT47CisJCXJvY2tjaGlwLHBoeV9kZHIzX2NhX2RydiA9IDxQSFlfRFJWX09EVF80MD47CisJCXJvY2tjaGlwLHBoeV9kZHIzX2RxX2RydiA9IDxQSFlfRFJWX09EVF80MD47CisJCXJvY2tjaGlwLHBoeV9kZHIzX29kdCA9IDxQSFlfRFJWX09EVF8yNDA+OworCQlyb2NrY2hpcCxscGRkcjNfb2R0X2Rpc19mcmVxID0gPDMzMz47CisJCXJvY2tjaGlwLGxwZGRyM19kcnYgPSA8TFAzX0RTXzM0b2htPjsKKwkJcm9ja2NoaXAsbHBkZHIzX29kdCA9IDxMUDNfT0RUXzI0MG9obT47CisJCXJvY2tjaGlwLHBoeV9scGRkcjNfY2FfZHJ2ID0gPFBIWV9EUlZfT0RUXzQwPjsKKwkJcm9ja2NoaXAscGh5X2xwZGRyM19kcV9kcnYgPSA8UEhZX0RSVl9PRFRfNDA+OworCQlyb2NrY2hpcCxwaHlfbHBkZHIzX29kdCA9IDxQSFlfRFJWX09EVF8yNDA+OworCQlyb2NrY2hpcCxscGRkcjRfb2R0X2Rpc19mcmVxID0gPDMzMz47CisJCXJvY2tjaGlwLGxwZGRyNF9kcnYgPSA8TFA0X1BERFNfNjBvaG0+OworCQlyb2NrY2hpcCxscGRkcjRfZHFfb2R0ID0gPExQNF9EUV9PRFRfNDBvaG0+OworCQlyb2NrY2hpcCxscGRkcjRfY2Ffb2R0ID0gPExQNF9DQV9PRFRfNDBvaG0+OworCQlyb2NrY2hpcCxwaHlfbHBkZHI0X2NhX2RydiA9IDxQSFlfRFJWX09EVF80MD47CisJCXJvY2tjaGlwLHBoeV9scGRkcjRfY2tfY3NfZHJ2ID0gPFBIWV9EUlZfT0RUXzgwPjsKKwkJcm9ja2NoaXAscGh5X2xwZGRyNF9kcV9kcnYgPSA8UEhZX0RSVl9PRFRfODA+OworCQlyb2NrY2hpcCxwaHlfbHBkZHI0X29kdCA9IDxQSFlfRFJWX09EVF82MD47CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvZnNsLWlteC1zZG1hLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvZnNsLWlteC1zZG1hLnR4dAppbmRleCAxNzVmMGU0Li4zYzlhNTdhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2ZzbC1pbXgtc2RtYS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9mc2wtaW14LXNkbWEudHh0CkBAIC04LDYgKzgsNyBAQAogICAgICAgImZzbCxpbXg1MS1zZG1hIgogICAgICAgImZzbCxpbXg1My1zZG1hIgogICAgICAgImZzbCxpbXg2cS1zZG1hIgorICAgICAgImZzbCxpbXg3ZC1zZG1hIgogICBUaGUgLXRvIHZhcmlhbnRzIHNob3VsZCBiZSBwcmVmZXJyZWQgc2luY2UgdGhleSBhbGxvdyB0byBkZXRlcm1pbmUgdGhlCiAgIGNvcnJlY3QgUk9NIHNjcmlwdCBhZGRyZXNzZXMgbmVlZGVkIGZvciB0aGUgZHJpdmVyIHRvIHdvcmsgd2l0aG91dCBhZGRpdGlvbmFsCiAgIGZpcm13YXJlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9yZW5lc2FzLHJjYXItZG1hYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL3JlbmVzYXMscmNhci1kbWFjLnR4dAppbmRleCA1YjkwMmFjLi41ZjJjZTY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL3JlbmVzYXMscmNhci1kbWFjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL3JlbmVzYXMscmNhci1kbWFjLnR4dApAQCAtMSw0ICsxLDQgQEAKLSogUmVuZXNhcyBSLUNhciBETUEgQ29udHJvbGxlciBEZXZpY2UgVHJlZSBiaW5kaW5ncworKiBSZW5lc2FzIFItQ2FyIChSWi9HKSBETUEgQ29udHJvbGxlciBEZXZpY2UgVHJlZSBiaW5kaW5ncwogCiBSZW5lc2FzIFItQ2FyIEdlbmVyYXRpb24gMiBTb0NzIGhhdmUgbXVsdGlwbGUgbXVsdGktY2hhbm5lbCBETUEKIGNvbnRyb2xsZXIgaW5zdGFuY2VzIG5hbWVkIERNQUMgY2FwYWJsZSBvZiBzZXJ2aW5nIG11bHRpcGxlIGNsaWVudHMuIENoYW5uZWxzCkBAIC0xNiw2ICsxNiw4IEBACiAKIC0gY29tcGF0aWJsZTogInJlbmVzYXMsZG1hYy08c29jdHlwZT4iLCAicmVuZXNhcyxyY2FyLWRtYWMiIGFzIGZhbGxiYWNrLgogCSAgICAgIEV4YW1wbGVzIHdpdGggc29jdHlwZXMgYXJlOgorCQktICJyZW5lc2FzLGRtYWMtcjhhNzc0MyIgKFJaL0cxTSkKKwkJLSAicmVuZXNhcyxkbWFjLXI4YTc3NDUiIChSWi9HMUUpCiAJCS0gInJlbmVzYXMsZG1hYy1yOGE3NzkwIiAoUi1DYXIgSDIpCiAJCS0gInJlbmVzYXMsZG1hYy1yOGE3NzkxIiAoUi1DYXIgTTItVykKIAkJLSAicmVuZXNhcyxkbWFjLXI4YTc3OTIiIChSLUNhciBWMkgpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL3N1bjZpLWRtYS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL3N1bjZpLWRtYS50eHQKaW5kZXggZDEzYzEzNi4uNmIyNjcwNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9zdW42aS1kbWEudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvc3VuNmktZG1hLnR4dApAQCAtNyw2ICs3LDcgQEAKIC0gY29tcGF0aWJsZToJTXVzdCBiZSBvbmUgb2YKIAkJICAiYWxsd2lubmVyLHN1bjZpLWEzMS1kbWEiCiAJCSAgImFsbHdpbm5lcixzdW44aS1hMjMtZG1hIgorCQkgICJhbGx3aW5uZXIsc3VuOGktYTgzdC1kbWEiCiAJCSAgImFsbHdpbm5lcixzdW44aS1oMy1kbWEiCiAtIHJlZzoJCVNob3VsZCBjb250YWluIHRoZSByZWdpc3RlcnMgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGgKIC0gaW50ZXJydXB0czoJU2hvdWxkIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVycnVwdCB1c2VkIGJ5IHRoaXMgZGV2aWNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZXh0Y29uL3Fjb20scG04OTQxLW1pc2MudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2V4dGNvbi9xY29tLHBtODk0MS1taXNjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTM4M2FkYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9leHRjb24vcWNvbSxwbTg5NDEtbWlzYy50eHQKQEAgLTAsMCArMSw0MSBAQAorUXVhbGNvbW0ncyBQTTg5NDEgVVNCIElEIEV4dGNvbiBkZXZpY2UKKworU29tZSBRdWFsY29tbSBQTUlDcyBoYXZlIGEgIm1pc2MiIG1vZHVsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVjdCB3aGVuCit0aGUgVVNCIElEIHBpbiBoYXMgYmVlbiBwdWxsZWQgbG93IG9yIGhpZ2guCisKK1BST1BFUlRJRVMKKworLSBjb21wYXRpYmxlOgorICAgIFVzYWdlOiByZXF1aXJlZAorICAgIFZhbHVlIHR5cGU6IDxzdHJpbmc+CisgICAgRGVmaW5pdGlvbjogU2hvdWxkIGNvbnRhaW4gInFjb20scG04OTQxLW1pc2MiOworCistIHJlZzoKKyAgICBVc2FnZTogcmVxdWlyZWQKKyAgICBWYWx1ZSB0eXBlOiA8dTMyPgorICAgIERlZmluaXRpb246IFNob3VsZCBjb250YWluIHRoZSBvZmZzZXQgdG8gdGhlIG1pc2MgYWRkcmVzcyBzcGFjZQorCistIGludGVycnVwdHM6CisgICAgVXNhZ2U6IHJlcXVpcmVkCisgICAgVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKyAgICBEZWZpbml0aW9uOiBTaG91bGQgY29udGFpbiB0aGUgdXNiIGlkIGludGVycnVwdAorCistIGludGVycnVwdC1uYW1lczoKKyAgICBVc2FnZTogcmVxdWlyZWQKKyAgICBWYWx1ZSB0eXBlOiA8c3RyaW5nbGlzdD4KKyAgICBEZWZpbml0aW9uOiBTaG91bGQgY29udGFpbiB0aGUgc3RyaW5nICJ1c2JfaWQiIGZvciB0aGUgdXNiIGlkIGludGVycnVwdAorCitFeGFtcGxlOgorCisJcG1pYyB7CisJCXVzYl9pZDogbWlzY0A5MDAgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHBtODk0MS1taXNjIjsKKwkJCXJlZyA9IDwweDkwMD47CisJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDkgMCBJUlFfVFlQRV9FREdFX0JPVEg+OworCQkJaW50ZXJydXB0LW5hbWVzID0gInVzYl9pZCI7CisJCX07CisJfQorCisJdXNiLWNvbnRyb2xsZXIgeworCQlleHRjb24gPSA8JnVzYl9pZD47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2JyY20sYmNtNjM0NS1ncGlvLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2JyY20sYmNtNjM0NS1ncGlvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzg1MzE0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vYnJjbSxiY202MzQ1LWdwaW8udHh0CkBAIC0wLDAgKzEsNDYgQEAKK0JpbmRpbmdzIGZvciB0aGUgQnJvYWRjb20ncyBicmNtLGJjbTYzNDUtZ3BpbyBtZW1vcnktbWFwcGVkIEdQSU8gY29udHJvbGxlcnMuCisKK1RoZXNlIGJpbmRpbmdzIGNhbiBiZSB1c2VkIG9uIGFueSBCQ002M3h4IFNvQy4gSG93ZXZlciwgQkNNNjMzOCBhbmQgQkNNNjM0NQorYXJlIHRoZSBvbmx5IG9uZXMgd2hpY2ggZG9uJ3QgbmVlZCBhIHBpbmN0cmwgZHJpdmVyLgorQkNNNjMzOCBoYXZlIDgtYml0IGRhdGEgYW5kIGRpcm91dCByZWdpc3RlcnMsIHdoZXJlIEdQSU8gc3RhdGUgY2FuIGJlIHJlYWQKK2FuZC9vciB3cml0dGVuLCBhbmQgdGhlIGRpcmVjdGlvbiBjaGFuZ2VkIGZyb20gaW5wdXQgdG8gb3V0cHV0LgorQkNNNjM0NSBoYXZlIDE2LWJpdCBkYXRhIGFuZCBkaXJvdXQgcmVnaXN0ZXJzLCB3aGVyZSBHUElPIHN0YXRlIGNhbiBiZSByZWFkCithbmQvb3Igd3JpdHRlbiwgYW5kIHRoZSBkaXJlY3Rpb24gY2hhbmdlZCBmcm9tIGlucHV0IHRvIG91dHB1dC4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKwktIGNvbXBhdGlibGU6IHNob3VsZCBiZSAiYnJjbSxiY202MzQ1LWdwaW8iCisJLSByZWctbmFtZXM6IG11c3QgY29udGFpbgorCQkiZGF0IiAtIGRhdGEgcmVnaXN0ZXIKKwkJImRpcm91dCIgLSBkaXJlY3Rpb24gKG91dHB1dCkgcmVnaXN0ZXIKKwktIHJlZzogYWRkcmVzcyArIHNpemUgcGFpcnMgZGVzY3JpYmluZyB0aGUgR1BJTyByZWdpc3RlciBzZXRzOworCQlvcmRlciBtdXN0IGNvcnJlc3BvbmQgd2l0aCB0aGUgb3JkZXIgb2YgZW50cmllcyBpbiByZWctbmFtZXMKKwktICNncGlvLWNlbGxzOiBtdXN0IGJlIHNldCB0byAyLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlciBhbmQKKwkJCXRoZSBzZWNvbmQgY2VsbCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGdwaW8gcG9sYXJpdHk6CisJCQkwID0gYWN0aXZlIGhpZ2gKKwkJCTEgPSBhY3RpdmUgbG93CisJLSBncGlvLWNvbnRyb2xsZXI6IE1hcmtzIHRoZSBkZXZpY2Ugbm9kZSBhcyBhIGdwaW8gY29udHJvbGxlci4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKwktIG5hdGl2ZS1lbmRpYW46IHVzZSBuYXRpdmUgZW5kaWFuIG1lbW9yeS4KKworRXhhbXBsZXM6CisJLSBCQ002MzM4OgorCWdwaW86IGdwaW8tY29udHJvbGxlckBmZmZlMDQwNyB7CisJCWNvbXBhdGlibGUgPSAiYnJjbSxiY202MzQ1LWdwaW8iOworCQlyZWctbmFtZXMgPSAiZGlyb3V0IiwgImRhdCI7CisJCXJlZyA9IDwweGZmZmUwNDA3IDE+LCA8MHhmZmZlMDQwZiAxPjsKKworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJZ3Bpby1jb250cm9sbGVyOworCX07CisKKwktIEJDTTYzNDU6CisJZ3BpbzogZ3Bpby1jb250cm9sbGVyQGZmZmUwNDA2IHsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTYzNDUtZ3BpbyI7CisJCXJlZy1uYW1lcyA9ICJkaXJvdXQiLCAiZGF0IjsKKwkJcmVnID0gPDB4ZmZmZTA0MDYgMj4sIDwweGZmZmUwNDBhIDI+OworCQluYXRpdmUtZW5kaWFuOworCisJCSNncGlvLWNlbGxzID0gPDI+OworCQlncGlvLWNvbnRyb2xsZXI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tYXNwZWVkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tYXNwZWVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTNiYjJlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby1hc3BlZWQudHh0CkBAIC0wLDAgKzEsMzYgQEAKK0FzcGVlZCBHUElPIGNvbnRyb2xsZXIgRGV2aWNlIFRyZWUgQmluZGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZQkJOiBFaXRoZXIgImFzcGVlZCxhc3QyNDAwLWdwaW8iIG9yICJhc3BlZWQsYXN0MjUwMC1ncGlvIgorCistICNncGlvLWNlbGxzIAkJOiBTaG91bGQgYmUgdHdvCisJCQkgIC0gRmlyc3QgY2VsbCBpcyB0aGUgR1BJTyBsaW5lIG51bWJlcgorCQkJICAtIFNlY29uZCBjZWxsIGlzIHVzZWQgdG8gc3BlY2lmeSBvcHRpb25hbAorCQkJICAgIHBhcmFtZXRlcnMgKHVudXNlZCkKKworLSByZWcJCQk6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCistIGdwaW8tY29udHJvbGxlcgk6IE1hcmtzIHRoZSBkZXZpY2Ugbm9kZSBhcyBhIEdQSU8gY29udHJvbGxlci4KKy0gaW50ZXJydXB0cwkJOiBJbnRlcnJ1cHQgc3BlY2lmaWVyIChzZWUgaW50ZXJydXB0IGJpbmRpbmdzIGZvcgorCQkJICBkZXRhaWxzKQorLSBpbnRlcnJ1cHQtY29udHJvbGxlcgk6IE1hcmsgdGhlIEdQSU8gY29udHJvbGxlciBhcyBhbiBpbnRlcnJ1cHQtY29udHJvbGxlcgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCistIGludGVycnVwdC1wYXJlbnQgICAgIDogVGhlIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlciwgb3B0aW9uYWwgaWYgaW5oZXJpdGVkCisKK1RoZSBncGlvIGFuZCBpbnRlcnJ1cHQgcHJvcGVydGllcyBhcmUgZnVydGhlciBkZXNjcmliZWQgaW4gdGhlaXIgcmVzcGVjdGl2ZQorYmluZGluZ3MgZG9jdW1lbnRhdGlvbjoKKworLSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLnR4dAorLSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvaW50ZXJydXB0cy50eHQKKworICBFeGFtcGxlOgorCWdwaW9AMWU3ODAwMDAgeworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJY29tcGF0aWJsZSA9ICJhc3BlZWQsYXN0MjQwMC1ncGlvIjsKKwkJZ3Bpby1jb250cm9sbGVyOworCQlpbnRlcnJ1cHRzID0gPDIwPjsKKwkJcmVnID0gPDB4MWU3ODAwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tYXhwMjA5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tYXhwMjA5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjYxMTMwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby1heHAyMDkudHh0CkBAIC0wLDAgKzEsMzAgQEAKK0FYUDIwOSBHUElPIGNvbnRyb2xsZXIKKworVGhpcyBkcml2ZXIgZm9sbG93cyB0aGUgdXN1YWwgR1BJTyBiaW5kaW5ncyBmb3VuZCBpbgorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby50eHQKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ4LXBvd2VycyxheHAyMDktZ3BpbyIKKy0gI2dwaW8tY2VsbHM6IFNob3VsZCBiZSB0d28uIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBwaW4gbnVtYmVyIGFuZCB0aGUKKyAgc2Vjb25kIGlzIHRoZSBHUElPIGZsYWdzLgorLSBncGlvLWNvbnRyb2xsZXI6IE1hcmtzIHRoZSBkZXZpY2Ugbm9kZSBhcyBhIEdQSU8gY29udHJvbGxlci4KKworVGhpcyBub2RlIG11c3QgYmUgYSBzdWJub2RlIG9mIHRoZSBheHAyMHggUE1JQywgZG9jdW1lbnRlZCBpbgorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9heHAyMHgudHh0CisKK0V4YW1wbGU6CisKK2F4cDIwOTogcG1pY0AzNCB7CisJY29tcGF0aWJsZSA9ICJ4LXBvd2VycyxheHAyMDkiOworCXJlZyA9IDwweDM0PjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZubWlfaW50Yz47CisJaW50ZXJydXB0cyA9IDwwIElSUV9UWVBFX0xFVkVMX0xPVz47CisJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKworCWF4cF9ncGlvOiBncGlvIHsKKwkJY29tcGF0aWJsZSA9ICJ4LXBvd2VycyxheHAyMDktZ3BpbyI7CisJCWdwaW8tY29udHJvbGxlcjsKKwkJI2dwaW8tY2VsbHMgPSA8Mj47CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLXRwaWMyODEwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHBpYzI4MTAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZmMyZGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLXRwaWMyODEwLnR4dApAQCAtMCwwICsxLDE2IEBACitUUElDMjgxMCBHUElPIGNvbnRyb2xsZXIgYmluZGluZ3MKKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGUJCTogU2hvdWxkIGJlICJ0aSx0cGljMjgxMCIuCisgLSByZWcJCQk6IFRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgZGV2aWNlCisgLSBncGlvLWNvbnRyb2xsZXIJOiBNYXJrcyB0aGUgZGV2aWNlIG5vZGUgYXMgYSBHUElPIGNvbnRyb2xsZXIuCisgLSAjZ3Bpby1jZWxscwkJOiBTaG91bGQgYmUgdHdvLiBGb3IgY29uc3VtZXIgdXNlIHNlZSBncGlvLnR4dC4KKworRXhhbXBsZToKKworCWdwaW9ANjAgeworCQljb21wYXRpYmxlID0gInRpLHRwaWMyODEwIjsKKwkJcmVnID0gPDB4NjA+OworCQlncGlvLWNvbnRyb2xsZXI7CisJCSNncGlvLWNlbGxzID0gPDI+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLXRwczY1MDg2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHBzNjUwODYudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA1MTA3Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHBzNjUwODYudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotKiBUUFM2NTA4NiBHUE8gQ29udHJvbGxlciBiaW5kaW5ncwotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZQkJOiBTaG91bGQgYmUgInRpLHRwczY1MDg2LWdwaW8iLgotIC0gZ3Bpby1jb250cm9sbGVyCTogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgR1BJTyBDb250cm9sbGVyLgotIC0gI2dwaW8tY2VsbHMJCTogU2hvdWxkIGJlIHR3by4gVGhlIGZpcnN0IGNlbGwgaXMgdGhlIHBpbiBudW1iZXIKLQkJCSAgICBhbmQgdGhlIHNlY29uZCBjZWxsIGlzIHVzZWQgdG8gc3BlY2lmeSBmbGFncy4KLQkJCSAgICBTZWUgLi4vZ3Bpby9ncGlvLnR4dCBmb3IgcG9zc2libGUgdmFsdWVzLgotCi1FeGFtcGxlOgotCi0JZ3BpbzQ6IGdwaW8gewotCQljb21wYXRpYmxlID0gInRpLHRwczY1MDg2LWdwaW8iOwotCQlncGlvLWNvbnRyb2xsZXI7Ci0JCSNncGlvLWNlbGxzID0gPDI+OwotCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLXRzNDkwMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLXRzNDkwMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4ZTcxYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tdHM0OTAwLnR4dApAQCAtMCwwICsxLDMwIEBACisqIFRlY2hub2xvZ2ljIFN5c3RlbXMgSTJDLUZQR0EncyBHUElPIGNvbnRyb2xsZXIgYmluZGluZ3MKKworVGhpcyBiaW5kaW5ncyBkZXNjcmliZXMgdGhlIEdQSU8gY29udHJvbGxlciBmb3IgVGVjaG5vbG9naWMncyBGUEdBIGNvcmUuCitUUy00OTAwJ3MgRlBHQSBlbmNvZGVzIHRoZSBHUElPIHN0YXRlIG9uIDMgYml0cywgd2hlcmVhcyB0aGUgVFMtNzk3MCdzIEZQR0EKK3VzZXMgMiBiaXRzOiBpdCBkb2Vzbid0IHVzZSBhIGRlZGljYXRlZCBpbnB1dCBiaXQuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZworCQkidGVjaG5vbG9naWMsdHM0OTAwLWdwaW8iCisJCSJ0ZWNobm9sb2dpYyx0czc5NzAtZ3BpbyIKKy0gcmVnOiBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIgYW5kIGxlbmd0aAorICAgICAgIG9mIG1lbW9yeSBtYXBwZWQgcmVnaW9uLgorLSAjZ3Bpby1jZWxsczogU2hvdWxkIGJlIHR3by4gVGhlIGZpcnN0IGNlbGwgaXMgdGhlIHBpbiBudW1iZXIuCistIGdwaW8tY29udHJvbGxlcjogTWFya3MgdGhlIGRldmljZSBub2RlIGFzIGEgZ3BpbyBjb250cm9sbGVyLgorCitPcHRpb25hbCBwcm9wZXJ0eToKKy0gbmdwaW9zOiBOdW1iZXIgb2YgR1BJT3MgdGhpcyBjb250cm9sbGVyIGlzIGluc3RhbnRpYXRlZCB3aXRoLAorICB0aGUgZGVmYXVsdCBpcyAzMi4gU2VlIGdwaW8udHh0IGZvciBtb3JlIGRldGFpbHMuCisKK0V4YW1wbGU6CisKKyZpMmMyIHsKKwlncGlvODogZ3Bpb0AyOCB7CisJCWNvbXBhdGlibGUgPSAidGVjaG5vbG9naWMsdHM0OTAwLWdwaW8iOworCQlyZWcgPSA8MHgyOD47CisJCSNncGlvLWNlbGxzID0gPDI+OworCQlncGlvLWNvbnRyb2xsZXI7CisJCW5ncGlvcyA9IDwzMj47CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9tcnZsLWdwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vbXJ2bC1ncGlvLnR4dAppbmRleCA5OGQxOTgzLi5jM2QwMTY1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9tcnZsLWdwaW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL21ydmwtZ3Bpby50eHQKQEAgLTQ0LDI2ICs0NCwzIEBACiAJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDB4Mj47CiAJfTsKLQotKiBNYXJ2ZWxsIE9yaW9uIEdQSU8gQ29udHJvbGxlcgotCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlICAgICAgICAgOiBTaG91bGQgYmUgIm1hcnZlbGwsb3Jpb24tZ3BpbyIKLS0gcmVnICAgICAgICAgICAgICAgIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIGNvbnRyb2xsZXIuCi0tIGdwaW8tY29udHJvbGxlciAgICA6IFNvIHdlIGtub3cgdGhpcyBpcyBhIGdwaW8gY29udHJvbGxlci4KLS0gbmdwaW8gICAgICAgICAgICAgIDogSG93IG1hbnkgZ3Bpb3MgdGhpcyBjb250cm9sbGVyIGhhcy4KLS0gaW50ZXJydXB0cwkgICAgIDogVXAgdG8gNCBJbnRlcnJ1cHRzIGZvciB0aGUgY29udHJvbGxlci4KLQotT3B0aW9uYWwgcHJvcGVydGllczoKLS0gbWFzay1vZmZzZXQgICAgICAgIDogRm9yIFNNUCBPcmlvbnMsIG9mZnNldCBmb3IgTnRoIENQVQotCi1FeGFtcGxlOgotCi0JCWdwaW8wOiBncGlvQDEwMTAwIHsKLQkJCWNvbXBhdGlibGUgPSAibWFydmVsbCxvcmlvbi1ncGlvIjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQkJcmVnID0gPDB4MTAxMDAgMHg0MD47Ci0JCQluZ3BpbyA9IDwzMj47Ci0JCQlpbnRlcnJ1cHRzID0gPDM1PiwgPDM2PiwgPDM3PiwgPDM4PjsKLQkJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL3JlbmVzYXMsZ3Bpby1yY2FyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL3JlbmVzYXMsZ3Bpby1yY2FyLnR4dAppbmRleCA4ZGEyNmIzLi43YzFhYjNiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9yZW5lc2FzLGdwaW8tcmNhci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vcmVuZXNhcyxncGlvLXJjYXIudHh0CkBAIC0xMSw2ICsxMSw3IEBACiAgICAgLSAicmVuZXNhcyxncGlvLXI4YTc3OTMiOiBmb3IgUjhBNzc5MyAoUi1DYXIgTTItTikgY29tcGF0aWJsZSBHUElPIGNvbnRyb2xsZXIuCiAgICAgLSAicmVuZXNhcyxncGlvLXI4YTc3OTQiOiBmb3IgUjhBNzc5NCAoUi1DYXIgRTIpIGNvbXBhdGlibGUgR1BJTyBjb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMsZ3Bpby1yOGE3Nzk1IjogZm9yIFI4QTc3OTUgKFItQ2FyIEgzKSBjb21wYXRpYmxlIEdQSU8gY29udHJvbGxlci4KKyAgICAtICJyZW5lc2FzLGdwaW8tcjhhNzc5NiI6IGZvciBSOEE3Nzk2IChSLUNhciBNMy1XKSBjb21wYXRpYmxlIEdQSU8gY29udHJvbGxlci4KICAgICAtICJyZW5lc2FzLGdwaW8tcmNhciI6IGZvciBnZW5lcmljIFItQ2FyIEdQSU8gY29udHJvbGxlci4KIAogICAtIHJlZzogQmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgZWFjaCBtZW1vcnkgcmVzb3VyY2UgdXNlZCBieSB0aGUgR1BJTwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2h3bW9uL2x0YzQxNTEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2h3bW9uL2x0YzQxNTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDhhNWUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vbHRjNDE1MS50eHQKQEAgLTAsMCArMSwxOCBAQAorTFRDNDE1MSBIaWdoIFZvbHRhZ2UgSTJDIEN1cnJlbnQgYW5kIFZvbHRhZ2UgTW9uaXRvcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBNdXN0IGJlICJsbHRjLGx0YzQxNTEiCistIHJlZzogSTJDIGFkZHJlc3MKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gc2h1bnQtcmVzaXN0b3ItbWljcm8tb2htcworCVNodW50IHJlc2lzdG9yIHZhbHVlIGluIG1pY3JvLU9obXMKKwlEZWZhdWx0cyB0byA8MTAwMD4gaWYgdW5zZXQuCisKK0V4YW1wbGU6CisKK2x0YzQxNTFANmUgeworCWNvbXBhdGlibGUgPSAibGx0YyxsdGM0MTUxIjsKKwlyZWcgPSA8MHg2ZT47CisJc2h1bnQtcmVzaXN0b3ItbWljcm8tb2htcyA9IDwxNTAwPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vbWF4NjY1MC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaHdtb24vbWF4NjY1MC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiZDg3ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od21vbi9tYXg2NjUwLnR4dApAQCAtMCwwICsxLDI4IEBACitCaW5kaW5ncyBmb3IgTUFYNjY1MSBhbmQgTUFYNjY1MCBJMkMgZmFuIGNvbnRyb2xsZXJzCisKK1JlZmVyZW5jZToKK1sxXQlodHRwczovL2RhdGFzaGVldHMubWF4aW1pbnRlZ3JhdGVkLmNvbS9lbi9kcy9NQVg2NjUwLU1BWDY2NTEucGRmCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBPbmUgb2YgIm1heGltLG1heDY2NTAiIG9yICJtYXhpbSxtYXg2NjUxIgorLSByZWcgICAgICAgIDogSTJDIGFkZHJlc3MsIG9uZSBvZiAweDFiLCAweDFmLCAweDRiLCAweDQ4LgorCitPcHRpb25hbCBwcm9wZXJ0aWVzLCBkZWZhdWx0IGlzIHRvIHJldGFpbiB0aGUgY2hpcCdzIGN1cnJlbnQgc2V0dGluZzoKKy0gbWF4aW0sZmFuLW1pY3Jvdm9sdCA6IFRoZSBzdXBwbHkgdm9sdGFnZSBvZiB0aGUgZmFuLCBlaXRoZXIgNTAwMDAwMCB1ViBvcgorCQkJMTIwMDAwMDAgdVYuCistIG1heGltLGZhbi1wcmVzY2FsZSAgOiBQcmUtc2NhbGluZyB2YWx1ZSwgYXMgcGVyIGRhdGFzaGVldCBbMV0uIExvd2VyIHZhbHVlcworCQkJYWxsb3cgbW9yZSBmaW5lLWdyYWluZWQgY29udHJvbCBvZiBzbG93ZXIgZmFucy4KKwkJCVZhbGlkOiAxLCAyLCA0LCA4LCAxNi4KKy0gbWF4aW0sZmFuLXRhcmdldC1ycG06IEluaXRpYWwgcmVxdWVzdGVkIGZhbiByb3RhdGlvbiBzcGVlZC4gSWYgc3BlY2lmaWVkLCB0aGUKKwkJCWRyaXZlciBzZWxlY3RzIGNsb3NlZC1sb29wIG1vZGUgYW5kIHRoZSByZXF1ZXN0ZWQgc3BlZWQuCisJCQlUaGlzIGVuc3VyZXMgdGhlIGZhbiBpcyBhbHJlYWR5IHJ1bm5pbmcgYmVmb3JlIHVzZXJzcGFjZQorCQkJdGFrZXMgb3Zlci4KKworRXhhbXBsZToKKwlmYW4tbWF4NjY1MDogbWF4NjY1MEAxYiB7CisJCXJlZyA9IDwweDFiPjsKKwkJY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg2NjUwIjsKKwkJbWF4aW0sZmFuLW1pY3Jvdm9sdCA9IDwxMjAwMDAwMD47CisJCW1heGltLGZhbi1wcmVzY2FsZSA9IDw0PjsKKwkJbWF4aW0sZmFuLXRhcmdldC1ycG0gPSA8MTIwMD47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLWFyYi1ncGlvLWNoYWxsZW5nZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2kyYy1hcmItZ3Bpby1jaGFsbGVuZ2UudHh0CmluZGV4IDcxMTkxZmYuLjI0OGExNTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLWFyYi1ncGlvLWNoYWxsZW5nZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtYXJiLWdwaW8tY2hhbGxlbmdlLnR4dApAQCAtNDQsOCArNDQsNyBAQAogLSBvdXItY2xhaW0tZ3BpbzogVGhlIEdQSU8gdGhhdCB3ZSB1c2UgdG8gY2xhaW0gdGhlIGJ1cy4KIC0gdGhlaXItY2xhaW0tZ3Bpb3M6IFRoZSBHUElPcyB0aGF0IHRoZSBvdGhlciBzaWRlcyB1c2UgdG8gY2xhaW0gdGhlIGJ1cy4KICAgTm90ZSB0aGF0IHNvbWUgaW1wbGVtZW50YXRpb25zIG1heSBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgb3RoZXIgbWFzdGVyLgotLSBTdGFuZGFyZCBJMkMgbXV4IHByb3BlcnRpZXMuIFNlZSBpMmMtbXV4LnR4dCBpbiB0aGlzIGRpcmVjdG9yeS4KLS0gU2luZ2xlIEkyQyBjaGlsZCBidXMgbm9kZSBhdCByZWcgMC4gU2VlIGkyYy1tdXgudHh0IGluIHRoaXMgZGlyZWN0b3J5LgorLSBJMkMgYXJiaXRyYXRpb24gYnVzIG5vZGUuIFNlZSBpMmMtYXJiLnR4dCBpbiB0aGlzIGRpcmVjdG9yeS4KIAogT3B0aW9uYWwgcHJvcGVydGllczoKIC0gc2xldy1kZWxheS11czogbWljcm9zZWNvbmRzIHRvIHdhaXQgZm9yIGEgR1BJTyB0byBnbyBoaWdoLiBEZWZhdWx0IGlzIDEwIHVzLgpAQCAtNjMsOCArNjIsNiBAQAogCiAJaTJjLWFyYml0cmF0b3IgewogCQljb21wYXRpYmxlID0gImkyYy1hcmItZ3Bpby1jaGFsbGVuZ2UiOwotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47CiAKIAkJaTJjLXBhcmVudCA9IDwmey9pMmNAMTJDQTAwMDB9PjsKIApAQCAtNzQsOCArNzEsNyBAQAogCQl3YWl0LXJldHJ5LXVzID0gPDMwMDA+OwogCQl3YWl0LWZyZWUtdXMgPSA8NTAwMDA+OwogCi0JCWkyY0AwIHsKLQkJCXJlZyA9IDwwPjsKKwkJaTJjLWFyYiB7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2kyYy1hcmIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtYXJiLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWFiZjkyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtYXJiLnR4dApAQCAtMCwwICsxLDM1IEBACitDb21tb24gaTJjIGFyYml0cmF0aW9uIGJ1cyBwcm9wZXJ0aWVzLgorCistIGkyYy1hcmIgY2hpbGQgbm9kZQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciB0aGUgaTJjLWFyYiBjaGlsZCBub2RlOgorLSAjYWRkcmVzcy1jZWxscyA9IDwxPjsKKy0gI3NpemUtY2VsbHMgPSA8MD47CisKK09wdGlvbmFsIHByb3BlcnRpZXMgZm9yIGkyYy1hcmIgY2hpbGQgbm9kZToKKy0gQ2hpbGQgbm9kZXMgY29uZm9ybWluZyB0byBpMmMgYnVzIGJpbmRpbmcKKworCitFeGFtcGxlIDoKKworCS8qCisJICAgQW4gTlhQIHBjYTk1NDEgSTJDIGJ1cyBtYXN0ZXIgc2VsZWN0b3IgYXQgYWRkcmVzcyAweDc0CisJICAgd2l0aCBhIE5YUCBwY2E4NTc0IEdQSU8gZXhwYW5kZXIgYXR0YWNoZWQuCisJICovCisKKwlhcmJANzQgeworCQljb21wYXRpYmxlID0gIm54cCxwY2E5NTQxIjsKKwkJcmVnID0gPDB4NzQ+OworCisJCWkyYy1hcmIgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJZ3Bpb0AzOCB7CisJCQkJY29tcGF0aWJsZSA9ICJueHAscGNhODU3NCI7CisJCQkJcmVnID0gPDB4Mzg+OworCQkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJCWdwaW8tY29udHJvbGxlcjsKKwkJCX07CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLWdhdGUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtZ2F0ZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg0NmQyMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLWdhdGUudHh0CkBAIC0wLDAgKzEsNDEgQEAKK0FuIGkyYyBnYXRlIGlzIHVzZWZ1bCB0byBlLmcuIHJlZHVjZSB0aGUgZGlnaXRhbCBub2lzZSBmb3IgUkYgdHVuZXJzIGNvbm5lY3RlZAordG8gdGhlIGkyYyBidXMuIEdhdGVzIGFyZSBzaW1pbGFyIHRvIGFyYml0cmF0b3JzIGluIHRoYXQgeW91IG5lZWQgdG8gcGVyZm9ybQorc29tZSBraW5kIG9mIG9wZXJhdGlvbiB0byBhY2Nlc3MgdGhlIGkyYyBidXMgcGFzdCB0aGUgYXJiaXRyYXRvci9nYXRlLCBidXQKK3RoZXJlIGFyZSBubyBjb21wZXRpbmcgbWFzdGVycyB0byBjb25zaWRlciBmb3IgZ2F0ZXMgYW5kIHRoZXJlZm9yZSB0aGVyZSBpcworbm8gYXJiaXRyYXRpb24gaGFwcGVuaW5nIGZvciBnYXRlcy4KKworQ29tbW9uIGkyYyBnYXRlIHByb3BlcnRpZXMuCisKKy0gaTJjLWdhdGUgY2hpbGQgbm9kZQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciB0aGUgaTJjLWdhdGUgY2hpbGQgbm9kZToKKy0gI2FkZHJlc3MtY2VsbHMgPSA8MT47CistICNzaXplLWNlbGxzID0gPDA+OworCitPcHRpb25hbCBwcm9wZXJ0aWVzIGZvciBpMmMtZ2F0ZSBjaGlsZCBub2RlOgorLSBDaGlsZCBub2RlcyBjb25mb3JtaW5nIHRvIGkyYyBidXMgYmluZGluZworCisKK0V4YW1wbGUgOgorCisJLyoKKwkgICBBbiBJbnZlbnNlbnNlIG1wdTkxNTAgYXQgYWRkcmVzcyAweDY4IGZlYXR1cmluZyBhbiBvbi1jaGlwIEFzYWhpCisJICAgS2FzZWkgYWs4OTc1IGNvbXBhc3MgYmVoaW5kIGEgZ2F0ZS4KKwkgKi8KKworCW1wdTkxNTBANjggeworCQljb21wYXRpYmxlID0gImludmVuc2Vuc2UsbXB1OTE1MCI7CisJCXJlZyA9IDwweDY4PjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzE+OworCQlpbnRlcnJ1cHRzID0gPDE4IDE+OworCisJCWkyYy1nYXRlIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJCWF4ODk3NUBjIHsKKwkJCQljb21wYXRpYmxlID0gImFrLGFrODk3NSI7CisJCQkJcmVnID0gPDB4MGM+OworCQkJfTsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtbWVzb24udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtbWVzb24udHh0CmluZGV4IDY4MmY5YTYuLjM4NjM1N2QgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLW1lc29uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2kyYy1tZXNvbi50eHQKQEAgLTEsNyArMSw3IEBACiBBbWxvZ2ljIE1lc29uIEkyQyBjb250cm9sbGVyCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlOiBtdXN0IGJlICJhbWxvZ2ljLG1lc29uNi1pMmMiCisgLSBjb21wYXRpYmxlOiBtdXN0IGJlICJhbWxvZ2ljLG1lc29uNi1pMmMiIG9yICJhbWxvZ2ljLG1lc29uLWd4YmItaTJjIgogIC0gcmVnOiBwaHlzaWNhbCBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIGRldmljZSByZWdpc3RlcnMKICAtIGludGVycnVwdHM6IGEgc2luZ2xlIGludGVycnVwdCBzcGVjaWZpZXIKICAtIGNsb2NrczogY2xvY2sgZm9yIHRoZSBkZXZpY2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLW11eC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2kyYy1tdXgudHh0CmluZGV4IGFmODRjY2UuLjIxMmU2NzcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLW11eC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtbXV4LnR4dApAQCAtMiwxOSArMiwzMiBAQAogCiBBbiBpMmMgYnVzIG11bHRpcGxleGVyL3N3aXRjaCB3aWxsIGhhdmUgc2V2ZXJhbCBjaGlsZCBidXNzZXMgdGhhdCBhcmUKIG51bWJlcmVkIHVuaXF1ZWx5IGluIGEgZGV2aWNlIGRlcGVuZGVudCBtYW5uZXIuICBUaGUgbm9kZXMgZm9yIGFuIGkyYyBidXMKLW11bHRpcGxleGVyL3N3aXRjaCB3aWxsIGhhdmUgb25lIGNoaWxkIG5vZGUgZm9yIGVhY2ggY2hpbGQKLWJ1cy4KK211bHRpcGxleGVyL3N3aXRjaCB3aWxsIGhhdmUgb25lIGNoaWxkIG5vZGUgZm9yIGVhY2ggY2hpbGQgYnVzLgogCi1SZXF1aXJlZCBwcm9wZXJ0aWVzOgorT3B0aW9uYWwgcHJvcGVydGllczoKKy0gI2FkZHJlc3MtY2VsbHMgPSA8MT47CisgICBUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkIGlzIHRoZSBpMmMtbXV4IGNoaWxkIG5vZGUgZG9lcyBub3QgZXhpc3QuCisKKy0gI3NpemUtY2VsbHMgPSA8MD47CisgICBUaGlzIHByb3BlcnR5IGlzIHJlcXVpcmVkIGlzIHRoZSBpMmMtbXV4IGNoaWxkIG5vZGUgZG9lcyBub3QgZXhpc3QuCisKKy0gaTJjLW11eAorICAgRm9yIGkyYyBtdWx0aXBsZXhlcnMvc3dpdGNoZXMgdGhhdCBoYXZlIGNoaWxkIG5vZGVzIHRoYXQgYXJlIGEgbWl4dHVyZQorICAgb2YgYm90aCBpMmMgY2hpbGQgYnVzc2VzIGFuZCBvdGhlciBjaGlsZCBub2RlcywgdGhlICdpMmMtbXV4JyBzdWJub2RlCisgICBjYW4gYmUgdXNlZCBmb3IgcG9wdWxhdGluZyB0aGUgaTJjIGNoaWxkIGJ1c3Nlcy4gIElmIGFuICdpMmMtbXV4JworICAgc3Vibm9kZSBpcyBwcmVzZW50LCBvbmx5IHN1Ym5vZGVzIG9mIHRoaXMgd2lsbCBiZSBjb25zaWRlcmVkIGFzIGkyYworICAgY2hpbGQgYnVzc2VzLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciB0aGUgaTJjLW11eCBjaGlsZCBub2RlOgogLSAjYWRkcmVzcy1jZWxscyA9IDwxPjsKIC0gI3NpemUtY2VsbHMgPSA8MD47CiAKLVJlcXVpcmVkIHByb3BlcnRpZXMgZm9yIGNoaWxkIG5vZGVzOgorUmVxdWlyZWQgcHJvcGVydGllcyBmb3IgaTJjIGNoaWxkIGJ1cyBub2RlczoKIC0gI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAtICNzaXplLWNlbGxzID0gPDA+OwogLSByZWcgOiBUaGUgc3ViLWJ1cyBudW1iZXIuCiAKLU9wdGlvbmFsIHByb3BlcnRpZXMgZm9yIGNoaWxkIG5vZGVzOgorT3B0aW9uYWwgcHJvcGVydGllcyBmb3IgaTJjIGNoaWxkIGJ1cyBub2RlczoKIC0gT3RoZXIgcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgbXVsdGlwbGV4ZXIvc3dpdGNoIGhhcmR3YXJlLgogLSBDaGlsZCBub2RlcyBjb25mb3JtaW5nIHRvIGkyYyBidXMgYmluZGluZwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2kyYy1yY2FyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLXJjYXIudHh0CmluZGV4IDVmMGNiNTAuLjIzOTYzMmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLXJjYXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLXJjYXIudHh0CkBAIC0xMSw2ICsxMSw3IEBACiAJInJlbmVzYXMsaTJjLXI4YTc3OTMiCiAJInJlbmVzYXMsaTJjLXI4YTc3OTQiCiAJInJlbmVzYXMsaTJjLXI4YTc3OTUiCisJInJlbmVzYXMsaTJjLXI4YTc3OTYiCiAtIHJlZzogcGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVyIGFuZCBsZW5ndGggb2YgbWVtb3J5IG1hcHBlZAogICByZWdpb24uCiAtIGludGVycnVwdHM6IGludGVycnVwdCBzcGVjaWZpZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL254cCxwY2E5NTQxLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvbnhwLHBjYTk1NDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYmJjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL254cCxwY2E5NTQxLnR4dApAQCAtMCwwICsxLDI5IEBACisqIE5YUCBQQ0E5NTQxIEkyQyBidXMgbWFzdGVyIHNlbGVjdG9yCisKK1JlcXVpcmVkIFByb3BlcnRpZXM6CisKKyAgLSBjb21wYXRpYmxlOiBNdXN0IGJlICJueHAscGNhOTU0MSIKKworICAtIHJlZzogVGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UuCisKKyAgVGhlIGZvbGxvd2luZyByZXF1aXJlZCBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGV4dGVybmFsbHk6CisKKyAgLSBJMkMgYXJiaXRyYXRpb24gYnVzIG5vZGUuIFNlZSBpMmMtYXJiLnR4dCBpbiB0aGlzIGRpcmVjdG9yeS4KKworCitFeGFtcGxlOgorCisJaTJjLWFyYml0cmF0b3JANzQgeworCQljb21wYXRpYmxlID0gIm54cCxwY2E5NTQxIjsKKwkJcmVnID0gPDB4NzQ+OworCisJCWkyYy1hcmIgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJZWVwcm9tQDU0IHsKKwkJCQljb21wYXRpYmxlID0gImF0LDI0YzA4IjsKKwkJCQlyZWcgPSA8MHg1ND47CisJCQl9OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQKaW5kZXggNWM3MGNlOS4uMTQxNmM2YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZpY2VzLnR4dApAQCAtMzgsNiArMzgsNyBAQAogZGFsbGFzLGRzNzUJCURpZ2l0YWwgVGhlcm1vbWV0ZXIgYW5kIFRoZXJtb3N0YXQKIGRsZyxkYTkwNTMJCURBOTA1MzogZmxleGlibGUgc3lzdGVtIGxldmVsIFBNSUMgd2l0aCBtdWx0aWNvcmUgc3VwcG9ydAogZGxnLGRhOTA2MwkJREE5MDYzOiBzeXN0ZW0gUE1JQyBmb3IgcXVhZC1jb3JlIGFwcGxpY2F0aW9uIHByb2Nlc3NvcnMKK2RvbWludGVjaCxkbWFyZDA5CURNQVJEMDk6IDMtYXhpcyBBY2NlbGVyb21ldGVyCiBlcHNvbixyeDgwMTAJCUkyQy1CVVMgSU5URVJGQUNFIFJFQUwgVElNRSBDTE9DSyBNT0RVTEUKIGVwc29uLHJ4ODAyNQkJSGlnaC1TdGFiaWxpdHkuIEkyQy1CdXMgSU5URVJGQUNFIFJFQUwgVElNRSBDTE9DSyBNT0RVTEUKIGVwc29uLHJ4ODU4MQkJSTJDLUJVUyBJTlRFUkZBQ0UgUkVBTCBUSU1FIENMT0NLIE1PRFVMRQpAQCAtNTYsNiArNTcsNyBAQAogbWF4aW0sbWF4MTIzNwkJTG93LVBvd2VyLCA0LS8xMi1DaGFubmVsLCAyLVdpcmUgU2VyaWFsLCAxMi1CaXQgQURDcwogbWF4aW0sbWF4NjYyNQkJOS1CaXQvMTItQml0IFRlbXBlcmF0dXJlIFNlbnNvcnMgd2l0aCBJwrJDLUNvbXBhdGlibGUgU2VyaWFsIEludGVyZmFjZQogbWMscnYzMDI5YzIJCVJlYWwgVGltZSBDbG9jayBNb2R1bGUgd2l0aCBJMkMtQnVzCittY3ViZSxtYzMyMzAJCW1DdWJlIDMtYXhpcyA4LWJpdCBkaWdpdGFsIGFjY2VsZXJvbWV0ZXIKIG1pY3JvY2hpcCxtY3A0NTMxLTUwMglNaWNyb2NoaXAgNy1iaXQgU2luZ2xlIEkyQyBEaWdpdGFsIFBvdGVudGlvbWV0ZXIgKDVrKQogbWljcm9jaGlwLG1jcDQ1MzEtMTAzCU1pY3JvY2hpcCA3LWJpdCBTaW5nbGUgSTJDIERpZ2l0YWwgUG90ZW50aW9tZXRlciAoMTBrKQogbWljcm9jaGlwLG1jcDQ1MzEtNTAzCU1pY3JvY2hpcCA3LWJpdCBTaW5nbGUgSTJDIERpZ2l0YWwgUG90ZW50aW9tZXRlciAoNTBrKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hY2NlbC9kbWFyZDA2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWNjZWwvZG1hcmQwNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxMDVhMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWNjZWwvZG1hcmQwNi50eHQKQEAgLTAsMCArMSwxOSBAQAorRGV2aWNlIHRyZWUgYmluZGluZ3MgZm9yIERvbWludGVjaCBETUFSRDA1LCBETUFSRDA2LCBETUFSRDA3IGFjY2VsZXJvbWV0ZXJzCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlCQk6IFNob3VsZCBiZSAiZG9taW50ZWNoLGRtYXJkMDUiCisJCQkJIG9yICJkb21pbnRlY2gsZG1hcmQwNiIKKwkJCQkgb3IgImRvbWludGVjaCxkbWFyZDA3IgorIC0gcmVnCQkJOiBJMkMgYWRkcmVzcyBvZiB0aGUgY2hpcC4gU2hvdWxkIGJlIDB4MWMKKworRXhhbXBsZToKKwkmaTJjMSB7CisJCS8qIC4uLiAqLworCisJCWFjY2VsZXJvbWV0ZXJAMWMgeworCQkJY29tcGF0aWJsZSA9ICJkb21pbnRlY2gsZG1hcmQwNiI7CisJCQlyZWcgPSA8MHgxYz47CisJCX07CisKKwkJLyogLi4uICovCisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWNjZWwva2lvbml4LGt4c2Q5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWNjZWwva2lvbml4LGt4c2Q5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjViZjNhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hY2NlbC9raW9uaXgsa3hzZDkudHh0CkBAIC0wLDAgKzEsMjIgQEAKK0tpb25peCBLWFNEOSBBY2NlbGVyb21ldGVyIGRldmljZSB0cmVlIGJpbmRpbmdzCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlOiAJCXNob3VsZCBiZSBzZXQgdG8gImtpb25peCxreHNkOSIKKyAtIHJlZzoJCQlpMmMgc2xhdmUgYWRkcmVzcworCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gdmRkLXN1cHBseToJCVRoZSBpbnB1dCBzdXBwbHkgZm9yIFZERAorIC0gaW92ZGQtc3VwcGx5OglUaGUgaW5wdXQgc3VwcGx5IGZvciBJT1ZERAorIC0gaW50ZXJydXB0czoJCVRoZSBtb3ZlbWVudCBkZXRlY3Rpb24gaW50ZXJydXB0CisgLSBtb3VudC1tYXRyaXg6CVNlZSBtb3VudC1tYXRyaXgudHh0CisKK0V4YW1wbGU6CisKK2t4c2Q5QDE4IHsKKwljb21wYXRpYmxlID0gImtpb25peCxreHNkOSI7CisJcmVnID0gPDB4MTg+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmZvbz47CisJaW50ZXJydXB0cyA9IDw1NyBJUlFfVFlQRV9FREdFX0ZBTExJTkc+OworCWlvdmRkLXN1cHBseSA9IDwmYmFyPjsKKwl2ZGQtc3VwcGx5ID0gPCZiYXo+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL210NjU3N19hdXhhZGMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvbXQ2NTc3X2F1eGFkYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhjNDVjYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL210NjU3N19hdXhhZGMudHh0CkBAIC0wLDAgKzEsMjkgQEAKKyogTWVkaWF0ZWsgQVVYQURDIC0gQW5hbG9nIHRvIERpZ2l0YWwgQ29udmVydGVyIG9uIE1lZGlhdGVrIG1vYmlsZSBzb2MgKG10NjV4eC9tdDgxeHgvbXQyN3h4KQorPT09PT09PT09PT09PT09CisKK1RoZSBBdXhpbGlhcnkgQW5hbG9nL0RpZ2l0YWwgQ29udmVydGVyIChBVVhBREMpIGlzIGFuIEFEQyBmb3VuZAoraW4gc29tZSBNZWRpYXRlayBTb0NzIHdoaWNoIGFtb25nIG90aGVyIHRoaW5ncyBtZWFzdXJlcyB0aGUgdGVtcGVyYXR1cmVzCitpbiB0aGUgU29DLiBJdCBjYW4gYmUgdXNlZCBkaXJlY3RseSB3aXRoIHJlZ2lzdGVyIGFjY2Vzc2VzLCBidXQgaXQgaXMgYWxzbwordXNlZCBieSB0aGVybWFsIGNvbnRyb2xsZXIgd2hpY2ggcmVhZHMgdGhlIHRlbXBlcmF0dXJlcyBmcm9tIHRoZSBBVVhBREMKK2RpcmVjdGx5IHZpYSBpdHMgb3duIGJ1cyBpbnRlcmZhY2UuIFNlZQorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RoZXJtYWwvbWVkaWF0ZWstdGhlcm1hbC50eHQKK2ZvciB0aGUgVGhlcm1hbCBDb250cm9sbGVyIHdoaWNoIGhvbGRzIGEgcGhhbmRsZSB0byB0aGUgQVVYQURDLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorICAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2Y6CisgICAgLSAibWVkaWF0ZWssbXQyNzAxLWF1eGFkYyI6IEZvciBNVDI3MDEgZmFtaWx5IG9mIFNvQ3MKKyAgICAtICJtZWRpYXRlayxtdDgxNzMtYXV4YWRjIjogRm9yIE1UODE3MyBmYW1pbHkgb2YgU29DcworICAtIHJlZzogQWRkcmVzcyByYW5nZSBvZiB0aGUgQVVYQURDIHVuaXQuCisgIC0gY2xvY2tzOiBTaG91bGQgY29udGFpbiBhIGNsb2NrIHNwZWNpZmllciBmb3IgZWFjaCBlbnRyeSBpbiBjbG9jay1uYW1lcworICAtIGNsb2NrLW5hbWVzOiBTaG91bGQgY29udGFpbiAibWFpbiIuCisgIC0gI2lvLWNoYW5uZWwtY2VsbHM6IFNob3VsZCBiZSAxLCBzZWUgLi4vaWlvLWJpbmRpbmdzLnR4dAorCitFeGFtcGxlOgorCithdXhhZGM6IGFkY0AxMTAwMTAwMCB7CisJY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDI3MDEtYXV4YWRjIjsKKwlyZWcgPSA8MCAweDExMDAxMDAwIDAgMHgxMDAwPjsKKwljbG9ja3MgPSA8JnBlcmljZmcgQ0xLX1BFUklfQVVYQURDPjsKKwljbG9jay1uYW1lcyA9ICJtYWluIjsKKwkjaW8tY2hhbm5lbC1jZWxscyA9IDwxPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9yb2NrY2hpcC1zYXJhZGMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvcm9ja2NoaXAtc2FyYWRjLnR4dAppbmRleCBiZjk5ZTJmLi4yMDU1OTNmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9yb2NrY2hpcC1zYXJhZGMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL3JvY2tjaGlwLXNhcmFkYy50eHQKQEAgLTE2LDYgKzE2LDExIEBACiAtIHZyZWYtc3VwcGx5OiBUaGUgcmVndWxhdG9yIHN1cHBseSBBREMgcmVmZXJlbmNlIHZvbHRhZ2UuCiAtICNpby1jaGFubmVsLWNlbGxzOiBTaG91bGQgYmUgMSwgc2VlIC4uL2lpby1iaW5kaW5ncy50eHQKIAorT3B0aW9uYWwgcHJvcGVydGllczoKKy0gcmVzZXRzOiBNdXN0IGNvbnRhaW4gYW4gZW50cnkgZm9yIGVhY2ggZW50cnkgaW4gcmVzZXQtbmFtZXMgaWYgbmVlZCBzdXBwb3J0CisJICB0aGlzIG9wdGlvbi4gU2VlIC4uL3Jlc2V0L3Jlc2V0LnR4dCBmb3IgZGV0YWlscy4KKy0gcmVzZXQtbmFtZXM6IE11c3QgaW5jbHVkZSB0aGUgbmFtZSAic2FyYWRjLWFwYiIuCisKIEV4YW1wbGU6CiAJc2FyYWRjOiBzYXJhZGNAMjAwNmMwMDAgewogCQljb21wYXRpYmxlID0gInJvY2tjaGlwLHNhcmFkYyI7CkBAIC0yMyw2ICsyOCw4IEBACiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSAyNiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJY2xvY2tzID0gPCZjcnUgU0NMS19TQVJBREM+LCA8JmNydSBQQ0xLX1NBUkFEQz47CiAJCWNsb2NrLW5hbWVzID0gInNhcmFkYyIsICJhcGJfcGNsayI7CisJCXJlc2V0cyA9IDwmY3J1IFNSU1RfU0FSQURDPjsKKwkJcmVzZXQtbmFtZXMgPSAic2FyYWRjLWFwYiI7CiAJCSNpby1jaGFubmVsLWNlbGxzID0gPDE+OwogCQl2cmVmLXN1cHBseSA9IDwmdmNjMTg+OwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy90aS1hZGMxMjEzOC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy90aS1hZGMxMjEzOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5YTFkMwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL3RpLWFkYzEyMTM4LnR4dApAQCAtMCwwICsxLDM3IEBACisqIFRleGFzIEluc3RydW1lbnRzJyBBREMxMjEzMC9BREMxMjEzMi9BREMxMjEzOAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZgorCSogInRpLGFkYzEyMTMwIgorCSogInRpLGFkYzEyMTMyIgorCSogInRpLGFkYzEyMTM4IgorIC0gcmVnOiBTUEkgY2hpcCBzZWxlY3QgbnVtYmVyIGZvciB0aGUgZGV2aWNlCisgLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiBpbnRlcnJ1cHQgZm9yIEVPQyAoZW5kIG9mIGNvbnZlcnNpb24pCisgLSBjbG9ja3M6IHBoYW5kbGUgdG8gY29udmVyc2lvbiBjbG9jayBpbnB1dAorIC0gc3BpLW1heC1mcmVxdWVuY3k6IERlZmluaXNpb24gYXMgcGVyCisJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dAorIC0gdnJlZi1wLXN1cHBseTogVGhlIHJlZ3VsYXRvciBzdXBwbHkgZm9yIHBvc2l0aXZlIGFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gdnJlZi1uLXN1cHBseTogVGhlIHJlZ3VsYXRvciBzdXBwbHkgZm9yIG5lZ2F0aXZlIGFuYWxvZyB2b2x0YWdlIHJlZmVyZW5jZQorCShOb3RlIHRoYXQgdGhpcyBtdXN0IG5vdCBnbyBiZWxvdyBHTkQgb3IgZXhjZWVkIHZyZWYtcCkKKwlJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIGlzIGFzc3VtZWQgdG8gYmUgYW5hbG9nIGdyb3VuZC4KKyAtIHRpLGFjcXVpc2l0aW9uLXRpbWU6IFRoZSBudW1iZXIgb2YgY29udmVyc2lvbiBjbG9jayBwZXJpb2RzIGZvciB0aGUgUy9IJ3MKKwlhY3F1aXNpdGlvbiB0aW1lLiAgU2hvdWxkIGJlIG9uZSBvZiA2LCAxMCwgMTgsIDM0LiAgSWYgbm90IHNwZWNpZmllZCwKKwlkZWZhdWx0IHZhbHVlIG9mIDEwIGlzIHVzZWQuCisJRm9yIGhpZ2ggc291cmNlIGltcGVkYW5jZXMsIHRoaXMgdmFsdWUgY2FuIGJlIGluY3JlYXNlZCB0byAxOCBvciAzNC4KKwlGb3IgbGVzcyBBREMgYWNjdXJhY3kgYW5kL29yIHNsb3dlciBDQ0xLIGZyZXF1ZW5jaWVzIHRoaXMgdmFsdWUgbWF5IGJlCisJZGVjcmVhc2VkIHRvIDYuICBTZWUgc2VjdGlvbiA2LjAgSU5QVVQgU09VUkNFIFJFU0lTVEFOQ0UgaW4gdGhlCisJZGF0YXNoZWV0IGZvciBkZXRhaWxzLgorCitFeGFtcGxlOgorYWRjQDAgeworCWNvbXBhdGlibGUgPSAidGksYWRjMTIxMzgiOworCXJlZyA9IDwwPjsKKwlpbnRlcnJ1cHRzID0gPDI4IElSUV9UWVBFX0VER0VfUklTSU5HPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZncGlvMT47CisJY2xvY2tzID0gPCZjY2xrPjsKKwl2cmVmLXAtc3VwcGx5ID0gPCZsZG80X3JlZz47CisJc3BpLW1heC1mcmVxdWVuY3kgPSA8NTAwMDAwMD47CisJdGksYWNxdWlzaXRpb24tdGltZSA9IDw2PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy90aS1hZGMxNjFzNjI2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL3RpLWFkYzE2MXM2MjYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZDIzMTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy90aS1hZGMxNjFzNjI2LnR4dApAQCAtMCwwICsxLDE2IEBACisqIFRleGFzIEluc3RydW1lbnRzIEFEQzE0MVM2MjYgYW5kIEFEQzE2MVM2MjYgY2hpcHMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSAidGksYWRjMTQxczYyNiIgb3IgInRpLGFkYzE2MXM2MjYiCisgLSByZWc6IHNwaSBjaGlwIHNlbGVjdCBudW1iZXIgZm9yIHRoZSBkZXZpY2UKKworUmVjb21tZW5kZWQgcHJvcGVydGllczoKKyAtIHNwaS1tYXgtZnJlcXVlbmN5OiBEZWZpbml0aW9uIGFzIHBlcgorCQlEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1idXMudHh0CisKK0V4YW1wbGU6CithZGNAMCB7CisJY29tcGF0aWJsZSA9ICJ0aSxhZGMxNjFzNjI2IjsKKwlyZWcgPSA8MD47CisJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDMwMDAwMD47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9jaGVtaWNhbC9hdGxhcyxvcnAtc20udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9jaGVtaWNhbC9hdGxhcyxvcnAtc20udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOGI2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2NoZW1pY2FsL2F0bGFzLG9ycC1zbS50eHQKQEAgLTAsMCArMSwyMiBAQAorKiBBdGxhcyBTY2llbnRpZmljIE9SUC1TTSBPRU0gc2Vuc29yCisKK2h0dHBzOi8vd3d3LmF0bGFzLXNjaWVudGlmaWMuY29tL19maWxlcy9fZGF0YXNoZWV0cy9fb2VtL09SUF9vZW1fZGF0YXNoZWV0LnBkZgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZTogbXVzdCBiZSAiYXRsYXMsb3JwLXNtIgorICAtIHJlZzogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBzZW5zb3IKKyAgLSBpbnRlcnJ1cHQtcGFyZW50OiBzaG91bGQgYmUgdGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgorICAtIGludGVycnVwdHM6IHRoZSBzb2xlIGludGVycnVwdCBnZW5lcmF0ZWQgYnkgdGhlIGRldmljZQorCisgIFJlZmVyIHRvIGludGVycnVwdC1jb250cm9sbGVyL2ludGVycnVwdHMudHh0IGZvciBnZW5lcmljIGludGVycnVwdCBjbGllbnQKKyAgbm9kZSBiaW5kaW5ncy4KKworRXhhbXBsZToKKworYXRsYXNANjYgeworCWNvbXBhdGlibGUgPSAiYXRsYXMsb3JwLXNtIjsKKwlyZWcgPSA8MHg2Nj47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzE+OworCWludGVycnVwdHMgPSA8MTYgMj47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vbWFnbmV0b21ldGVyL2FrODk3NC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdkNWFiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL21hZ25ldG9tZXRlci9hazg5NzQudHh0CkBAIC0wLDAgKzEsMjkgQEAKKyogQXNhaGkgS2FzZWkgQUs4OTc0IG1hZ25ldG9tZXRlciBzZW5zb3IKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJhc2FoaS1rYXNlaSxhazg5NzQiCistIHJlZyA6IHRoZSBJMkMgYWRkcmVzcyBvZiB0aGUgbWFnbmV0b21ldGVyCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKy0gYXZkZC1zdXBwbHk6IHJlZ3VsYXRvciBzdXBwbHkgZm9yIHRoZSBhbmFsb2cgdm9sdGFnZQorICAoc2VlIHJlZ3VsYXRvci9yZWd1bGF0b3IudHh0KQorLSBkdmRkLXN1cHBseTogcmVndWxhdG9yIHN1cHBseSBmb3IgdGhlIGRpZ2l0YWwgdm9sdGFnZQorICAoc2VlIHJlZ3VsYXRvci9yZWd1bGF0b3IudHh0KQorLSBpbnRlcnJ1cHRzOiBkYXRhIHJlYWR5IChEUkRZKSBhbmQgaW50ZXJydXB0IChJTlQxKSBsaW5lcworICBmcm9tIHRoZSBjaGlwLCB0aGUgRFJEWSBpbnRlcnJ1cHQgbXVzdCBiZSBwbGFjZWQgZmlyc3QuCisgIFRoZSBpbnRlcnJ1cHRzIGNhbiBiZSB0cmlnZ2VyZWQgb24gcmlzaW5nIG9yIGZhbGxpbmcKKyAgZWRnZXMgYWxpa2UuCistIG1vdW50LW1hdHJpeDogYW4gb3B0aW9uYWwgM3gzIG1vdW50aW5nIHJvdGF0aW9uIG1hdHJpeAorCitFeGFtcGxlOgorCithazg5NzRAMGYgeworCWNvbXBhdGlibGUgPSAiYXNhaGkta2FzZWksYWs4OTc0IjsKKwlyZWcgPSA8MHgwZj47CisJYXZkZC1zdXBwbHkgPSA8JmZvb19yZWc+OworCWR2ZGQtc3VwcGx5ID0gPCZiYXJfcmVnPjsKKwlpbnRlcnJ1cHRzID0gPDAgSVJRX1RZUEVfRURHRV9SSVNJTkc+LAorCQkgICAgIDwxIElSUV9UWVBFX0VER0VfUklTSU5HPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL3ByZXNzdXJlL3pwYTIzMjYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9wcmVzc3VyZS96cGEyMzI2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjg1ZGU2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9wcmVzc3VyZS96cGEyMzI2LnR4dApAQCAtMCwwICsxLDMxIEBACitNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBzZW5zb3IKKworUHJlc3N1cmUgc2Vuc29yIGZyb20gTXVyYXRhIHdpdGggU1BJIGFuZCBJMkMgYnVzIGludGVyZmFjZXMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6ICJtdXJhdGEsenBhMjMyNiIKKy0gcmVnOiB0aGUgSTJDIGFkZHJlc3Mgb3IgU1BJIGNoaXAgc2VsZWN0IHRoZSBkZXZpY2Ugd2lsbCByZXNwb25kIHRvCisKK1JlY29tbWVuZGVkIHByb3BlcnRpZXMgZm9yIFNQSSBidXMgdXNhZ2U6CistIHNwaS1tYXgtZnJlcXVlbmN5OiBtYXhpbXVtIFNQSSBidXMgZnJlcXVlbmN5IGFzIGRvY3VtZW50ZWQgaW4KKyAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dAorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSB2cmVmLXN1cHBseTogYW4gb3B0aW9uYWwgcmVndWxhdG9yIHRoYXQgbmVlZHMgdG8gYmUgb24gdG8gcHJvdmlkZSBWUkVGCisgIHBvd2VyIHRvIHRoZSBzZW5zb3IKKy0gdmRkLXN1cHBseTogYW4gb3B0aW9uYWwgcmVndWxhdG9yIHRoYXQgbmVlZHMgdG8gYmUgb24gdG8gcHJvdmlkZSBWREQKKyAgcG93ZXIgdG8gdGhlIHNlbnNvcgorLSBpbnRlcnJ1cHQtcGFyZW50OiBwaGFuZGxlIHRvIHRoZSBwYXJlbnQgaW50ZXJydXB0IGNvbnRyb2xsZXIgYXMgZG9jdW1lbnRlZCBpbgorICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvaW50ZXJydXB0cy50eHQKKy0gaW50ZXJydXB0czogaW50ZXJydXB0IG1hcHBpbmcgZm9yIElSUSBhcyBkb2N1bWVudGVkIGluCisgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9pbnRlcnJ1cHRzLnR4dAorCitFeGFtcGxlOgorCit6cGEyMzI2QDVjIHsKKwljb21wYXRpYmxlID0gIm11cmF0YSx6cGEyMzI2IjsKKwlyZWcgPSA8MHg1Yz47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3Bpbz47CisJaW50ZXJydXB0cyA9IDwxMj47CisJdmRkLXN1cHBseSA9IDwmbGRvXzF2OF9nbnNzPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL3Byb3hpbWl0eS9zeDk1MDAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9wcm94aW1pdHkvc3g5NTAwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzAxZGQyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9wcm94aW1pdHkvc3g5NTAwLnR4dApAQCAtMCwwICsxLDI0IEBACitTZW10ZWNoJ3MgU1g5NTAwIGNhcGFjaXRpdmUgcHJveGltaXR5IGJ1dHRvbiBkZXZpY2UgZHJpdmVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisJLSBjb21wYXRpYmxlOiBtdXN0IGJlICJzZW10ZWNoLHN4OTUwMCIKKwktIHJlZzogaTJjIGFkZHJlc3Mgd2hlcmUgdG8gZmluZCB0aGUgZGV2aWNlCisJLSBpbnRlcnJ1cHQtcGFyZW50IDogc2hvdWxkIGJlIHRoZSBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKKwktIGludGVycnVwdHMgOiB0aGUgc29sZSBpbnRlcnJ1cHQgZ2VuZXJhdGVkIGJ5IHRoZSBkZXZpY2UKKworCVJlZmVyIHRvIGludGVycnVwdC1jb250cm9sbGVyL2ludGVycnVwdHMudHh0IGZvciBnZW5lcmljCisJaW50ZXJydXB0IGNsaWVudCBub2RlIGJpbmRpbmdzLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCS0gcmVzZXQtZ3Bpb3M6IFJlZmVyZW5jZSB0byB0aGUgR1BJTyBjb25uZWN0ZWQgdG8gdGhlIGRldmljZSdzIGFjdGl2ZQorCSAgbG93IHJlc2V0IHBpbi4KKworRXhhbXBsZToKKworc3g5NTAwQDI4IHsKKwljb21wYXRpYmxlID0gInNlbXRlY2gsc3g5NTAwIjsKKwlyZWcgPSA8MHgyOD47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzI+OworCWludGVycnVwdHMgPSA8MTYgSVJRX1RZUEVfTEVWRUxfTE9XPjsKKwlyZXNldC1ncGlvcyA9IDwmZ3BpbzIgMTAgR1BJT19BQ1RJVkVfTE9XPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL3RlbXBlcmF0dXJlL21heGltX3RoZXJtb2NvdXBsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL3RlbXBlcmF0dXJlL21heGltX3RoZXJtb2NvdXBsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiYzVjNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vdGVtcGVyYXR1cmUvbWF4aW1fdGhlcm1vY291cGxlLnR4dApAQCAtMCwwICsxLDIxIEBACitNYXhpbSB0aGVybW9jb3VwbGUgc3VwcG9ydAorCisqIGh0dHBzOi8vZGF0YXNoZWV0cy5tYXhpbWludGVncmF0ZWQuY29tL2VuL2RzL01BWDY2NzUucGRmCisqIGh0dHBzOi8vZGF0YXNoZWV0cy5tYXhpbWludGVncmF0ZWQuY29tL2VuL2RzL01BWDMxODU1LnBkZgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisJLSBjb21wYXRpYmxlOiBtdXN0IGJlICJtYXhpbSxtYXgzMTg1NSIgb3IgIm1heGltLG1heDY2NzUiCisJLSByZWc6IFNQSSBjaGlwIHNlbGVjdCBudW1iZXIgZm9yIHRoZSBkZXZpY2UKKwktIHNwaS1tYXgtZnJlcXVlbmN5OiBtdXN0IGJlIDQzMDAwMDAKKwktIHNwaS1jcGhhOiBtdXN0IGJlIGRlZmluZWQgZm9yIG1heDY2NzUgdG8gZW5hYmxlIFNQSSBtb2RlIDEKKworCVJlZmVyIHRvIHNwaS9zcGktYnVzLnR4dCBmb3IgZ2VuZXJpYyBTUEkgc2xhdmUgYmluZGluZ3MuCisKK0V4YW1wbGU6CisKKwltYXgzMTg1NUAwIHsKKwkJY29tcGF0aWJsZSA9ICJtYXhpbSxtYXgzMTg1NSI7CisJCXJlZyA9IDwwPjsKKwkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDMwMDAwMD47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC9hZGMta2V5cy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvYWRjLWtleXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTE4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvYWRjLWtleXMudHh0CkBAIC0wLDAgKzEsNDkgQEAKK0FEQyBhdHRhY2hlZCByZXNpc3RvciBsYWRkZXIgYnV0dG9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlOiAiYWRjLWtleXMiCisgLSBpby1jaGFubmVsczogUGhhbmRsZSB0byBhbiBBREMgY2hhbm5lbAorIC0gaW8tY2hhbm5lbC1uYW1lcyA9ICJidXR0b25zIjsKKyAtIGtleXVwLXRocmVzaG9sZC1taWNyb3ZvbHQ6IFZvbHRhZ2UgYXQgd2hpY2ggYWxsIHRoZSBrZXlzIGFyZSBjb25zaWRlcmVkIHVwLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCS0gcG9sbC1pbnRlcnZhbDogUG9sbCBpbnRlcnZhbCB0aW1lIGluIG1pbGxpc2Vjb25kcworCS0gYXV0b3JlcGVhdDogQm9vbGVhbiwgRW5hYmxlIGF1dG8gcmVwZWF0IGZlYXR1cmUgb2YgTGludXggaW5wdXQKKwkgIHN1YnN5c3RlbS4KKworRWFjaCBidXR0b24gKGtleSkgaXMgcmVwcmVzZW50ZWQgYXMgYSBzdWItbm9kZSBvZiAiYWRjLWtleXMiOgorCitSZXF1aXJlZCBzdWJub2RlLXByb3BlcnRpZXM6CisJLSBsYWJlbDogRGVzY3JpcHRpdmUgbmFtZSBvZiB0aGUga2V5LgorCS0gbGludXgsY29kZTogS2V5Y29kZSB0byBlbWl0LgorCS0gcHJlc3MtdGhyZXNob2xkLW1pY3Jvdm9sdDogVm9sdGFnZSBBREMgaW5wdXQgd2hlbiB0aGlzIGtleSBpcyBwcmVzc2VkLgorCitFeGFtcGxlOgorCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW5wdXQvaW5wdXQuaD4KKworCWFkYy1rZXlzIHsKKwkJY29tcGF0aWJsZSA9ICJhZGMta2V5cyI7CisJCWlvLWNoYW5uZWxzID0gPCZscmFkYyAwPjsKKwkJaW8tY2hhbm5lbC1uYW1lcyA9ICJidXR0b25zIjsKKwkJa2V5dXAtdGhyZXNob2xkLW1pY3Jvdm9sdCA9IDwyMDAwMDAwPjsKKworCQlidXR0b24tdXAgeworCQkJbGFiZWwgPSAiVm9sdW1lIFVwIjsKKwkJCWxpbnV4LGNvZGUgPSA8S0VZX1ZPTFVNRVVQPjsKKwkJCXByZXNzLXRocmVzaG9sZC1taWNyb3ZvbHQgPSA8MTUwMDAwMD47CisJCX07CisKKwkJYnV0dG9uLWRvd24geworCQkJbGFiZWwgPSAiVm9sdW1lIERvd24iOworCQkJbGludXgsY29kZSA9IDxLRVlfVk9MVU1FRE9XTj47CisJCQlwcmVzcy10aHJlc2hvbGQtbWljcm92b2x0ID0gPDEwMDAwMDA+OworCQl9OworCisJCWJ1dHRvbi1lbnRlciB7CisJCQlsYWJlbCA9ICJFbnRlciI7CisJCQlsaW51eCxjb2RlID0gPEtFWV9FTlRFUj47CisJCQlwcmVzcy10aHJlc2hvbGQtbWljcm92b2x0ID0gPDUwMDAwMD47CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC9ncGlvLWRlY29kZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L2dwaW8tZGVjb2Rlci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhNzdmYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC9ncGlvLWRlY29kZXIudHh0CkBAIC0wLDAgKzEsMjMgQEAKKyogR1BJTyBEZWNvZGVyIERUIGJpbmRpbmdzCisKK1JlcXVpcmVkIFByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IHNob3VsZCBiZSAiZ3Bpby1kZWNvZGVyIgorLSBncGlvczogYSBzcGVjIG9mIGdwaW9zIChhdCBsZWFzdCB0d28pIHRvIGJlIGRlY29kZWQgdG8gYSBudW1iZXIgd2l0aAorICBmaXJzdCBlbnRyeSByZXByZXNlbnRpbmcgdGhlIE1TQi4KKworT3B0aW9uYWwgUHJvcGVydGllczoKKy0gZGVjb2Rlci1tYXgtdmFsdWU6IE1heGltdW0gcG9zc2libGUgdmFsdWUgdGhhdCBjYW4gYmUgcmVwb3J0ZWQgYnkKKyAgdGhlIGdwaW9zLgorLSBsaW51eCxheGlzOiB0aGUgaW5wdXQgc3Vic3lzdGVtIGF4aXMgdG8gbWFwIHRvIChBQlNfWC9BQlNfWSkuCisgIERlZmF1bHRzIHRvIDAgKEFCU19YKS4KKworRXhhbXBsZToKKwlncGlvLWRlY29kZXIwIHsKKwkJY29tcGF0aWJsZSA9ICJncGlvLWRlY29kZXIiOworCQlncGlvcyA9IDwmcGNhOTUzNiAzIEdQSU9fQUNUSVZFX0hJR0g+LAorCQkJPCZwY2E5NTM2IDIgR1BJT19BQ1RJVkVfSElHSD4sCisJCQk8JnBjYTk1MzYgMSBHUElPX0FDVElWRV9ISUdIPiwKKwkJCTwmcGNhOTUzNiAwIEdQSU9fQUNUSVZFX0hJR0g+OworCQlsaW51eCxheGlzID0gPDA+OyAvKiBBQlNfWCAqLworCQlkZWNvZGVyLW1heC12YWx1ZSA9IDw5PjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L2dwaW8ta2V5cy1wb2xsZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L2dwaW8ta2V5cy1wb2xsZWQudHh0CmluZGV4IDk1ZDBmYjEuLjRkOWEzNzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC9ncGlvLWtleXMtcG9sbGVkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvZ3Bpby1rZXlzLXBvbGxlZC50eHQKQEAgLTM0LDExICszNCwxMCBAQAogCiAJZ3Bpb19rZXlzX3BvbGxlZCB7CiAJCQljb21wYXRpYmxlID0gImdwaW8ta2V5cy1wb2xsZWQiOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKIAkJCXBvbGwtaW50ZXJ2YWwgPSA8MTAwPjsKIAkJCWF1dG9yZXBlYXQ7Ci0JCQlidXR0b25AMjEgeworCisJCQlidXR0b24yMSB7CiAJCQkJbGFiZWwgPSAiR1BJTyBLZXkgVVAiOwogCQkJCWxpbnV4LGNvZGUgPSA8MTAzPjsKIAkJCQlncGlvcyA9IDwmZ3BpbzEgMCAxPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9lZHQtZnQ1eDA2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9lZHQtZnQ1eDA2LnR4dAppbmRleCBmOTk1MjhkLi42ZGIyMjEwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vZWR0LWZ0NXgwNi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RvdWNoc2NyZWVuL2VkdC1mdDV4MDYudHh0CkBAIC0xOSw2ICsxOSw3IEBACiAgICAgICAgICAgIG9yOiAgImVkdCxlZHQtZnQ1MzA2IgogICAgICAgICAgICBvcjogICJlZHQsZWR0LWZ0NTQwNiIKICAgICAgICAgICAgb3I6ICAiZWR0LGVkdC1mdDU1MDYiCisgICAgICAgICAgIG9yOiAgImZvY2FsdGVjaCxmdDYyMzYiCiAKICAtIHJlZzogICAgICAgICBJMkMgc2xhdmUgYWRkcmVzcyBvZiB0aGUgY2hpcCAoMHgzOCkKICAtIGludGVycnVwdC1wYXJlbnQ6IGEgcGhhbmRsZSBwb2ludGluZyB0byB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKQEAgLTQzLDYgKzQ0LDEzIEBACiAKICAtIG9mZnNldDogICAgICBhbGxvd3Mgc2V0dGluZyB0aGUgZWRnZSBjb21wZW5zYXRpb24gaW4gdGhlIHJhbmdlIGZyb20KICAgICAgICAgICAgICAgICAwIHRvIDMxLgorIC0gdG91Y2hzY3JlZW4tc2l6ZS14CSAgIDogU2VlIHRvdWNoc2NyZWVuLnR4dAorIC0gdG91Y2hzY3JlZW4tc2l6ZS15CSAgIDogU2VlIHRvdWNoc2NyZWVuLnR4dAorIC0gdG91Y2hzY3JlZW4tZnV6ei14ICAgICAgOiBTZWUgdG91Y2hzY3JlZW4udHh0CisgLSB0b3VjaHNjcmVlbi1mdXp6LXkgICAgICA6IFNlZSB0b3VjaHNjcmVlbi50eHQKKyAtIHRvdWNoc2NyZWVuLWludmVydGVkLXggIDogU2VlIHRvdWNoc2NyZWVuLnR4dAorIC0gdG91Y2hzY3JlZW4taW52ZXJ0ZWQteSAgOiBTZWUgdG91Y2hzY3JlZW4udHh0CisgLSB0b3VjaHNjcmVlbi1zd2FwcGVkLXgteSA6IFNlZSB0b3VjaHNjcmVlbi50eHQKIAogRXhhbXBsZToKIAlwb2x5dG91Y2g6IGVkdC1mdDV4MDZAMzggewpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RvdWNoc2NyZWVuL2VrdGYyMTI3LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9la3RmMjEyNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExOWY0YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9la3RmMjEyNy50eHQKQEAgLTAsMCArMSwyNyBAQAorKiBFbGFuIGVLVEYyMTI3IEkyQyB0b3VjaHNjcmVlbiBjb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlCQkgIDogImVsYW4sZWt0ZjIxMjciCisgLSByZWcJCQkgIDogSTJDIHNsYXZlIGFkZHJlc3Mgb2YgdGhlIGNoaXAgKDB4NDApCisgLSBpbnRlcnJ1cHQtcGFyZW50CSAgOiBhIHBoYW5kbGUgcG9pbnRpbmcgdG8gdGhlIGludGVycnVwdCBjb250cm9sbGVyCisJCQkgICAgc2VydmluZyB0aGUgaW50ZXJydXB0IGZvciB0aGlzIGNoaXAKKyAtIGludGVycnVwdHMJCSAgOiBpbnRlcnJ1cHQgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGVrdGYyMTI3IGludGVycnVwdAorIC0gcG93ZXItZ3Bpb3MJCSAgOiBHUElPIHNwZWNpZmljYXRpb24gZm9yIHRoZSBwaW4gY29ubmVjdGVkIHRvIHRoZQorCQkJICAgIGVrdGYyMTI3J3Mgd2FrZSBpbnB1dC4gVGhpcyBuZWVkcyB0byBiZSBkcml2ZW4gaGlnaAorCQkJICAgIHRvIHRha2UgZWt0ZjIxMjcgb3V0IG9mIGl0J3MgbG93IHBvd2VyIHN0YXRlCisKK0ZvciBhZGRpdGlvbmFsIG9wdGlvbmFsIHByb3BlcnRpZXMgc2VlOiB0b3VjaHNjcmVlbi50eHQKKworRXhhbXBsZToKKworaTJjQDAwMDAwMDAwIHsKKwlla3RmMjEyNzogdG91Y2hzY3JlZW5AMTUgeworCQljb21wYXRpYmxlID0gImVsYW4sZWt0ZjIxMjciOworCQlyZWcgPSA8MHgxNT47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnBpbz47CisJCWludGVycnVwdHMgPSA8NiAxMSBJUlFfVFlQRV9FREdFX0ZBTExJTkc+CisJCXBvd2VyLWdwaW9zID0gPCZwaW8gMSAzIEdQSU9fQUNUSVZFX0hJR0g+OworCQl0b3VjaHNjcmVlbi1pbnZlcnRlZC14OworCQl0b3VjaHNjcmVlbi1zd2FwcGVkLXgteTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9mb2NhbHRlY2gtZnQ2MjM2LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9mb2NhbHRlY2gtZnQ2MjM2LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc3NTIxZC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vZm9jYWx0ZWNoLWZ0NjIzNi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0qIEZvY2FsVGVjaCBGVDYyMzYgSTJDIHRvdWNoc2NyZWVuIGNvbnRyb2xsZXIKLQotUmVxdWlyZWQgcHJvcGVydGllczoKLSAtIGNvbXBhdGlibGUJCSAgOiAiZm9jYWx0ZWNoLGZ0NjIzNiIKLSAtIHJlZwkJCSAgOiBJMkMgc2xhdmUgYWRkcmVzcyBvZiB0aGUgY2hpcCAoMHgzOCkKLSAtIGludGVycnVwdC1wYXJlbnQJICA6IGEgcGhhbmRsZSBwb2ludGluZyB0byB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKLQkJCSAgICBzZXJ2aW5nIHRoZSBpbnRlcnJ1cHQgZm9yIHRoaXMgY2hpcAotIC0gaW50ZXJydXB0cwkJICA6IGludGVycnVwdCBzcGVjaWZpY2F0aW9uIGZvciB0aGUgdG91Y2ggY29udHJvbGxlcgotCQkJICAgIGludGVycnVwdAotIC0gcmVzZXQtZ3Bpb3MJCSAgOiBHUElPIHNwZWNpZmljYXRpb24gZm9yIHRoZSBSU1ROIGlucHV0Ci0gLSB0b3VjaHNjcmVlbi1zaXplLXgJICA6IGhvcml6b250YWwgcmVzb2x1dGlvbiBvZiB0b3VjaHNjcmVlbiAoaW4gcGl4ZWxzKQotIC0gdG91Y2hzY3JlZW4tc2l6ZS15CSAgOiB2ZXJ0aWNhbCByZXNvbHV0aW9uIG9mIHRvdWNoc2NyZWVuIChpbiBwaXhlbHMpCi0KLU9wdGlvbmFsIHByb3BlcnRpZXM6Ci0gLSB0b3VjaHNjcmVlbi1mdXp6LXgJICA6IGhvcml6b250YWwgbm9pc2UgdmFsdWUgb2YgdGhlIGFic29sdXRlIGlucHV0Ci0JCQkgICAgZGV2aWNlIChpbiBwaXhlbHMpCi0gLSB0b3VjaHNjcmVlbi1mdXp6LXkJICA6IHZlcnRpY2FsIG5vaXNlIHZhbHVlIG9mIHRoZSBhYnNvbHV0ZSBpbnB1dAotCQkJICAgIGRldmljZSAoaW4gcGl4ZWxzKQotIC0gdG91Y2hzY3JlZW4taW52ZXJ0ZWQteCA6IFggYXhpcyBpcyBpbnZlcnRlZCAoYm9vbGVhbikKLSAtIHRvdWNoc2NyZWVuLWludmVydGVkLXkgOiBZIGF4aXMgaXMgaW52ZXJ0ZWQgKGJvb2xlYW4pCi0gLSB0b3VjaHNjcmVlbi1zd2FwcGVkLXgteTogWCBhbmQgWSBheGlzIGFyZSBzd2FwcGVkIChib29sZWFuKQotCQkJICAgIFN3YXBwaW5nIGlzIGRvbmUgYWZ0ZXIgaW52ZXJ0aW5nIHRoZSBheGlzCi0KLUV4YW1wbGU6Ci0KLQlmdDZ4MDZAMzggewotCQljb21wYXRpYmxlID0gImZvY2FsdGVjaCxmdDYyMzYiOwotCQlyZWcgPSA8MHgzOD47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8+OwotCQlpbnRlcnJ1cHRzID0gPDIzIDI+OwotCQl0b3VjaHNjcmVlbi1zaXplLXggPSA8MzIwPjsKLQkJdG91Y2hzY3JlZW4tc2l6ZS15ID0gPDQ4MD47Ci0JCXRvdWNoc2NyZWVuLWludmVydGVkLXg7Ci0JCXRvdWNoc2NyZWVuLXN3YXBwZWQteC15OwotCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vc2lsZWFkX2dzbDE2ODAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RvdWNoc2NyZWVuL3NpbGVhZF9nc2wxNjgwLnR4dAppbmRleCAxMTEyZTBkLi44MjBmZWU0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vc2lsZWFkX2dzbDE2ODAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9zaWxlYWRfZ3NsMTY4MC50eHQKQEAgLTEzLDYgKzEzLDcgQEAKIC0gdG91Y2hzY3JlZW4tc2l6ZS15CSAgOiBTZWUgdG91Y2hzY3JlZW4udHh0CiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CistIGZpcm13YXJlLW5hbWUJCSAgOiBGaWxlIGJhc2VuYW1lIChzdHJpbmcpIGZvciBib2FyZCBzcGVjaWZpYyBmaXJtd2FyZQogLSB0b3VjaHNjcmVlbi1pbnZlcnRlZC14ICA6IFNlZSB0b3VjaHNjcmVlbi50eHQKIC0gdG91Y2hzY3JlZW4taW52ZXJ0ZWQteSAgOiBTZWUgdG91Y2hzY3JlZW4udHh0CiAtIHRvdWNoc2NyZWVuLXN3YXBwZWQteC15IDogU2VlIHRvdWNoc2NyZWVuLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RwczY1MjE4LXB3cmJ1dHRvbi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdHBzNjUyMTgtcHdyYnV0dG9uLnR4dAppbmRleCBlMzBlMGI5Li4zZTViOTc5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdHBzNjUyMTgtcHdyYnV0dG9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdHBzNjUyMTgtcHdyYnV0dG9uLnR4dApAQCAtMSwxMyArMSwyNCBAQAotVGV4YXMgSW5zdHJ1bWVudHMgVFBTNjUyMTggcG93ZXIgYnV0dG9uCitUZXhhcyBJbnN0cnVtZW50cyBUUFM2NTIxNyBhbmQgVFBTNjUyMTggcG93ZXIgYnV0dG9uCisKK1RoaXMgbW9kdWxlIGlzIHBhcnQgb2YgdGhlIFRQUzY1MjE3L1RQUzY1MjE4LiBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSB3aG9sZQorVFBTNjUyMTcgY2hpcCBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci90cHM2NTIxNy50eHQuCiAKIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGEgc2ltcGxlIHBvd2VyIGJ1dHRvbiBldmVudCB2aWEgYW4gSW50ZXJydXB0LgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgInRpLHRwczY1MjE4LXB3cmJ1dHRvbiIKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJ0aSx0cHM2NTIxNy1wd3JidXR0b24iIG9yICJ0aSx0cHM2NTIxOC1wd3JidXR0b24iCisKK1JlcXVpcmVkIHByb3BlcnRpZXMgZm9yIFRQUzY1MjE4OgogLSBpbnRlcnJ1cHRzOiBzaG91bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcKICAgIC0gPDMgSVJRX1RZUEVfRURHRV9CT1RIPjogRm9yIGNvbnRyb2xsZXJzIGNvbXBhdGlibGUgd2l0aCB0cHM2NTIxOAogCi1FeGFtcGxlOgorRXhhbXBsZXM6CisKKyZ0cHMgeworCXRwczY1MjE3LXB3cmJ1dHRvbiB7CisJCWNvbXBhdGlibGUgPSAidGksdHBzNjUyMTctcHdyYnV0dG9uIjsKKwl9OworfTsKIAogJnRwcyB7CiAJcG93ZXItYnV0dG9uIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9qY29yZSxhaWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2pjb3JlLGFpYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUyYWQzNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9qY29yZSxhaWMudHh0CkBAIC0wLDAgKzEsMjYgQEAKK0otQ29yZSBBZHZhbmNlZCBJbnRlcnJ1cHQgQ29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAiamNvcmUsYWljMSIgZm9yIHRoZSAob2Jzb2xldGUpIGZpcnN0LWdlbmVyYXRpb24gYWljCisgIHdpdGggOCBpbnRlcnJ1cHQgbGluZXMgd2l0aCBwcm9ncmFtbWFibGUgcHJpb3JpdGllcywgb3IgImpjb3JlLGFpYzIiIGZvcgorICB0aGUgImFpYzIiIGNvcmUgd2l0aCA2NCBpbnRlcnJ1cHRzLgorCistIHJlZzogTWVtb3J5IHJlZ2lvbihzKSBmb3IgY29uZmlndXJhdGlvbi4gRm9yIFNNUCwgdGhlcmUgc2hvdWxkIGJlIG9uZQorICByZWdpb24gcGVyIGNwdSwgaW5kZXhlZCBieSB0aGUgc2VxdWVudGlhbCwgemVyby1iYXNlZCBoYXJkd2FyZSBjcHUKKyAgbnVtYmVyLgorCistIGludGVycnVwdC1jb250cm9sbGVyOiBJZGVudGlmaWVzIHRoZSBub2RlIGFzIGFuIGludGVycnVwdCBjb250cm9sbGVyCisKKy0gI2ludGVycnVwdC1jZWxsczogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgbmVlZGVkIHRvIGVuY29kZSBhbgorICBpbnRlcnJ1cHQgc291cmNlLiBUaGUgdmFsdWUgc2hhbGwgYmUgMS4KKworCitFeGFtcGxlOgorCithaWM6IGludGVycnVwdC1jb250cm9sbGVyQDIwMCB7CisJY29tcGF0aWJsZSA9ICJqY29yZSxhaWMyIjsKKwlyZWcgPSA8IDB4MjAwIDB4MzAgMHg1MDAgMHgzMCA+OworCWludGVycnVwdC1jb250cm9sbGVyOworCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL21hcnZlbGwsYXJtYWRhLThrLXBpYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvbWFydmVsbCxhcm1hZGEtOGstcGljLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE3YjRjZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9tYXJ2ZWxsLGFybWFkYS04ay1waWMudHh0CkBAIC0wLDAgKzEsMjUgQEAKK01hcnZlbGwgQXJtYWRhIDdLLzhLIFBJQyBJbnRlcnJ1cHQgY29udHJvbGxlcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgaXMgdGhlIERldmljZSBUcmVlIGJpbmRpbmcgZm9yIHRoZSBQSUMsIGEgc2Vjb25kYXJ5IGludGVycnVwdAorY29udHJvbGxlciBhdmFpbGFibGUgb24gdGhlIE1hcnZlbGwgQXJtYWRhIDdLLzhLIEFSTTY0IFNvQ3MsIGFuZAordHlwaWNhbGx5IGNvbm5lY3RlZCB0byB0aGUgR0lDIGFzIHRoZSBwcmltYXJ5IGludGVycnVwdCBjb250cm9sbGVyLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgIm1hcnZlbGwsYXJtYWRhLThrLXBpYyIKKy0gaW50ZXJydXB0LWNvbnRyb2xsZXI6IGlkZW50aWZpZXMgdGhlIG5vZGUgYXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIKKy0gI2ludGVycnVwdC1jZWxsczogdGhlIG51bWJlciBvZiBjZWxscyB0byBkZWZpbmUgaW50ZXJydXB0cyBvbiB0aGlzCisgIGNvbnRyb2xsZXIuIFNob3VsZCBiZSAxCistIHJlZzogdGhlIHJlZ2lzdGVyIGFyZWEgZm9yIHRoZSBQSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIKKy0gaW50ZXJydXB0czogdGhlIGludGVycnVwdCB0byB0aGUgcHJpbWFyeSBpbnRlcnJ1cHQgY29udHJvbGxlciwKKyAgdHlwaWNhbGx5IHRoZSBHSUMKKworRXhhbXBsZToKKworCXBpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJAM2YwMTAwIHsKKwkJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFkYS04ay1waWMiOworCQlyZWcgPSA8MHgzZjAxMDAgMHgxMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQlpbnRlcnJ1cHRzID0gPEdJQ19QUEkgMTUgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9tYXJ2ZWxsLG9kbWktY29udHJvbGxlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvbWFydmVsbCxvZG1pLWNvbnRyb2xsZXIudHh0CmluZGV4IDhhZjBhOGUuLjNmNjQ0MmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9tYXJ2ZWxsLG9kbWktY29udHJvbGxlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL21hcnZlbGwsb2RtaS1jb250cm9sbGVyLnR4dApAQCAtMzEsNyArMzEsNyBAQAogRXhhbXBsZToKIAogCW9kbWk6IG9kbWlAMzAwMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFwODA2LW9kbS1jb250cm9sbGVyIiwKKwkJY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFwODA2LW9kbWktY29udHJvbGxlciIsCiAJCQkgICAgICJtYXJ2ZWxsLG9kbWktY29udHJvbGxlciI7CiAJCWludGVycnVwdC1jb250cm9sbGVyOwogCQltc2ktY29udHJvbGxlcjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9yZW5lc2FzLGlycWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3JlbmVzYXMsaXJxYy50eHQKaW5kZXggYWU1MDU0Yy4uZTNmMDUyZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3JlbmVzYXMsaXJxYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3JlbmVzYXMsaXJxYy50eHQKQEAgLTEsMTAgKzEsMTIgQEAKLURUIGJpbmRpbmdzIGZvciB0aGUgUi1Nb2JpbGUvUi1DYXIgaW50ZXJydXB0IGNvbnRyb2xsZXIKK0RUIGJpbmRpbmdzIGZvciB0aGUgUi1Nb2JpbGUvUi1DYXIvUlovRyBpbnRlcnJ1cHQgY29udHJvbGxlcgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogCiAtIGNvbXBhdGlibGU6IGhhcyB0byBiZSAicmVuZXNhcyxpcnFjLTxzb2N0eXBlPiIsICJyZW5lc2FzLGlycWMiIGFzIGZhbGxiYWNrLgogICBFeGFtcGxlcyB3aXRoIHNvY3R5cGVzIGFyZToKICAgICAtICJyZW5lc2FzLGlycWMtcjhhNzNhNCIgKFItTW9iaWxlIEFQRTYpCisgICAgLSAicmVuZXNhcyxpcnFjLXI4YTc3NDMiIChSWi9HMU0pCisgICAgLSAicmVuZXNhcyxpcnFjLXI4YTc3NDUiIChSWi9HMUUpCiAgICAgLSAicmVuZXNhcyxpcnFjLXI4YTc3OTAiIChSLUNhciBIMikKICAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc5MSIgKFItQ2FyIE0yLVcpCiAgICAgLSAicmVuZXNhcyxpcnFjLXI4YTc3OTIiIChSLUNhciBWMkgpCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvc3Qsc3RtMzItZXh0aS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvc3Qsc3RtMzItZXh0aS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3NzAzZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9zdCxzdG0zMi1leHRpLnR4dApAQCAtMCwwICsxLDIwIEBACitTVE0zMiBFeHRlcm5hbCBJbnRlcnJ1cHQgQ29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAic3Qsc3RtMzItZXh0aSIKKy0gcmVnOiBTcGVjaWZpZXMgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSByZWdpc3RlcnMKKy0gaW50ZXJydXB0LWNvbnRyb2xsZXI6IEluZGVudGlmaWVzIHRoZSBub2RlIGFzIGFuIGludGVycnVwdCBjb250cm9sbGVyCistICNpbnRlcnJ1cHQtY2VsbHM6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNlbGxzIHRvIGVuY29kZSBhbiBpbnRlcnJ1cHQKKyAgc3BlY2lmaWVyLCBzaGFsbCBiZSAyCistIGludGVycnVwdHM6IGludGVycnVwdHMgcmVmZXJlbmNlcyB0byBwcmltYXJ5IGludGVycnVwdCBjb250cm9sbGVyCisKK0V4YW1wbGU6CisKK2V4dGk6IGludGVycnVwdC1jb250cm9sbGVyQDQwMDEzYzAwIHsKKwljb21wYXRpYmxlID0gInN0LHN0bTMyLWV4dGkiOworCWludGVycnVwdC1jb250cm9sbGVyOworCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJcmVnID0gPDB4NDAwMTNDMDAgMHg0MDA+OworCWludGVycnVwdHMgPSA8MT4sIDwyPiwgPDM+LCA8Nj4sIDw3PiwgPDg+LCA8OT4sIDwxMD4sIDwyMz4sIDw0MD4sIDw0MT4sIDw0Mj4sIDw2Mj4sIDw3Nj47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKaW5kZXggOTNlZjZlNi4uNjk2YmU1NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CkBAIC0xOSw2ICsxOSwxMyBAQAogCSAgYSBkZXZpY2UsIGkuZS4gbm8gb3RoZXIgTEVEIGNsYXNzIGRldmljZSBjYW4gYmUgYXNzaWduZWQgdGhlIHNhbWUKIAkgIGxhYmVsLgogCistIGRlZmF1bHQtc3RhdGUgOiBUaGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgTEVELiBWYWxpZCB2YWx1ZXMgYXJlICJvbiIsICJvZmYiLAorICBhbmQgImtlZXAiLiBJZiB0aGUgTEVEIGlzIGFscmVhZHkgb24gb3Igb2ZmIGFuZCB0aGUgZGVmYXVsdC1zdGF0ZSBwcm9wZXJ0eSBpcworICBzZXQgdGhlIHRvIHNhbWUgdmFsdWUsIHRoZW4gbm8gZ2xpdGNoIHNob3VsZCBiZSBwcm9kdWNlZCB3aGVyZSB0aGUgTEVECisgIG1vbWVudGFyaWx5IHR1cm5zIG9mZiAob3Igb24pLiBUaGUgImtlZXAiIHNldHRpbmcgd2lsbCBrZWVwIHRoZSBMRUQgYXQKKyAgd2hhdGV2ZXIgaXRzIGN1cnJlbnQgc3RhdGUgaXMsIHdpdGhvdXQgcHJvZHVjaW5nIGEgZ2xpdGNoLiAgVGhlIGRlZmF1bHQgaXMKKyAgb2ZmIGlmIHRoaXMgcHJvcGVydHkgaXMgbm90IHByZXNlbnQuCisKIC0gbGludXgsZGVmYXVsdC10cmlnZ2VyIDogIFRoaXMgcGFyYW1ldGVyLCBpZiBwcmVzZW50LCBpcyBhCiAgICAgc3RyaW5nIGRlZmluaW5nIHRoZSB0cmlnZ2VyIGFzc2lnbmVkIHRvIHRoZSBMRUQuICBDdXJyZW50IHRyaWdnZXJzIGFyZToKICAgICAgImJhY2tsaWdodCIgLSBMRUQgd2lsbCBhY3QgYXMgYSBiYWNrLWxpZ2h0LCBjb250cm9sbGVkIGJ5IHRoZSBmcmFtZWJ1ZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1iY202MzI4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtYmNtNjMyOC50eHQKaW5kZXggM2Y0OGMxZS4uY2NlYmNlNSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1iY202MzI4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWJjbTYzMjgudHh0CkBAIC00OSw3ICs0OSw3IEBACiAgICAgLSBhY3RpdmUtbG93IDogQm9vbGVhbiwgbWFrZXMgTEVEIGFjdGl2ZSBsb3cuCiAgICAgICBEZWZhdWx0IDogZmFsc2UKICAgICAtIGRlZmF1bHQtc3RhdGUgOiBzZWUKLSAgICAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtZ3Bpby50eHQKKyAgICAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKICAgICAtIGxpbnV4LGRlZmF1bHQtdHJpZ2dlciA6IHNlZQogICAgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWJjbTYzNTgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1iY202MzU4LnR4dAppbmRleCBiMjJhNTViLi5kYTU3MDhlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWJjbTYzNTgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtYmNtNjM1OC50eHQKQEAgLTI4LDcgKzI4LDcgQEAKICAgLSBhY3RpdmUtbG93IDogQm9vbGVhbiwgbWFrZXMgTEVEIGFjdGl2ZSBsb3cuCiAgICAgRGVmYXVsdCA6IGZhbHNlCiAgIC0gZGVmYXVsdC1zdGF0ZSA6IHNlZQotICAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtZ3Bpby50eHQKKyAgICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CiAgIC0gbGludXgsZGVmYXVsdC10cmlnZ2VyIDogc2VlCiAgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWdwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1ncGlvLnR4dAppbmRleCA1YjFiNDNhLi43NjUzNWNhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWdwaW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtZ3Bpby50eHQKQEAgLTE0LDEzICsxNCw4IEBACiAgIHNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CiAtIGxpbnV4LGRlZmF1bHQtdHJpZ2dlciA6ICAob3B0aW9uYWwpCiAgIHNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0Ci0tIGRlZmF1bHQtc3RhdGU6ICAob3B0aW9uYWwpIFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBMRUQuICBWYWxpZAotICB2YWx1ZXMgYXJlICJvbiIsICJvZmYiLCBhbmQgImtlZXAiLiAgSWYgdGhlIExFRCBpcyBhbHJlYWR5IG9uIG9yIG9mZgotICBhbmQgdGhlIGRlZmF1bHQtc3RhdGUgcHJvcGVydHkgaXMgc2V0IHRoZSB0byBzYW1lIHZhbHVlLCB0aGVuIG5vCi0gIGdsaXRjaCBzaG91bGQgYmUgcHJvZHVjZWQgd2hlcmUgdGhlIExFRCBtb21lbnRhcmlseSB0dXJucyBvZmYgKG9yCi0gIG9uKS4gIFRoZSAia2VlcCIgc2V0dGluZyB3aWxsIGtlZXAgdGhlIExFRCBhdCB3aGF0ZXZlciBpdHMgY3VycmVudAotICBzdGF0ZSBpcywgd2l0aG91dCBwcm9kdWNpbmcgYSBnbGl0Y2guICBUaGUgZGVmYXVsdCBpcyBvZmYgaWYgdGhpcwotICBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudC4KKy0gZGVmYXVsdC1zdGF0ZTogIChvcHRpb25hbCkgVGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIExFRC4KKyAgc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKIC0gcmV0YWluLXN0YXRlLXN1c3BlbmRlZDogKG9wdGlvbmFsKSBUaGUgc3VzcGVuZCBzdGF0ZSBjYW4gYmUgcmV0YWluZWQuU3VjaAogICBhcyBjaGFyZ2UtbGVkIGdwaW8uCiAtIHBhbmljLWluZGljYXRvciA6IChvcHRpb25hbCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtaXMzMWZsMzE5eC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWlzMzFmbDMxOXgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjYwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWlzMzFmbDMxOXgudHh0CkBAIC0wLDAgKzEsNTkgQEAKK0xFRHMgY29ubmVjdGVkIHRvIGlzMzFmbDMxOXggTEVEIGNvbnRyb2xsZXIgY2hpcAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlIGFueSBvZgorCSJpc3NpLGlzMzFmbDMxOTAiCisJImlzc2ksaXMzMWZsMzE5MSIKKwkiaXNzaSxpczMxZmwzMTkzIgorCSJpc3NpLGlzMzFmbDMxOTYiCisJImlzc2ksaXMzMWZsMzE5OSIKKwkic2ktZW4sc24zMTk5Ii4KKy0gI2FkZHJlc3MtY2VsbHM6IE11c3QgYmUgMS4KKy0gI3NpemUtY2VsbHM6IE11c3QgYmUgMC4KKy0gcmVnOiAweDY0LCAweDY1LCAweDY2LCBvciAweDY3LgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBhdWRpby1nYWluLWRiIDogYXVkaW8gZ2FpbiBzZWxlY3Rpb24gZm9yIGV4dGVybmFsIGFuYWxvZyBtb2R1bGF0aW9uIGlucHV0LgorCVZhbGlkIHZhbHVlczogMCAtIDIxLCBzdGVwIGJ5IDMgKHJvdW5kZWQgZG93bikKKwlEZWZhdWx0OiAwCisKK0VhY2ggbGVkIGlzIHJlcHJlc2VudGVkIGFzIGEgc3ViLW5vZGUgb2YgdGhlIGlzc2ksaXMzMWZsMzE5eCBkZXZpY2UuCitUaGVyZSBjYW4gYmUgbGVzcyBsZWRzIHN1Ym5vZGVzIHRoYW4gdGhlIGNoaXAgY2FuIHN1cHBvcnQgYnV0IG5vdCBtb3JlLgorCitSZXF1aXJlZCBsZWQgc3ViLW5vZGUgcHJvcGVydGllczoKKy0gcmVnIDogbnVtYmVyIG9mIExFRCBsaW5lCisJVmFsaWQgdmFsdWVzOiAxIC0gbnVtYmVyIG9mIGxlZHMgc3VwcG9ydGVkIGJ5IHRoZSBjaGlwIHZhcmlhbnQuCisKK09wdGlvbmFsIGxlZCBzdWItbm9kZSBwcm9wZXJ0aWVzOgorLSBsYWJlbCA6IHNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0LgorLSBsaW51eCxkZWZhdWx0LXRyaWdnZXIgOgorCXNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0LgorLSBsZWQtbWF4LW1pY3JvYW1wIDogKG9wdGlvbmFsKQorCVZhbGlkIHZhbHVlczogNTAwMCAtIDQwMDAwLCBzdGVwIGJ5IDUwMDAgKHJvdW5kZWQgZG93bikKKwlEZWZhdWx0OiAyMDAwMCAoMjAgbUEpCisJTm90ZTogYSBkcml2ZXIgd2lsbCB0YWtlIHRoZSBsb3dlc3Qgb2YgYWxsIGxlZCBsaW1pdHMgc2luY2UgdGhlCisJY2hpcCBoYXMgYSBzaW5nbGUgZ2xvYmFsIHNldHRpbmcuIFRoZSBsb3dlc3QgdmFsdWUgd2lsbCBiZSBjaG9zZW4KKwlkdWUgdG8gdGhlIFBXTSBzcGVjaWZpY2l0eSwgd2hlcmUgbG93ZXIgYnJpZ2h0bmVzcyBpcyBhY2hpZXZlZAorCWJ5IHJlZHVjaW5nIHRoZSBkdXJ5LWN5Y2xlIG9mIHB1bHNlcyBhbmQgbm90IHRoZSBjdXJyZW50LCB3aGljaAorCXdpbGwgYWx3YXlzIGhhdmUgaXRzIHBlYWsgdmFsdWUgZXF1YWwgdG8gbGVkLW1heC1taWNyb2FtcC4KKworRXhhbXBsZXM6CisKK2ZhbmN5X2xlZHM6IGxlZHNANjUgeworCWNvbXBhdGlibGUgPSAiaXNzaSxpczMxZmwzMTk2IjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwwPjsKKwlyZWcgPSA8MHg2NT47CisKKwlyZWRfYXV4OiBsZWRAMSB7CisJCWxhYmVsID0gInJlZDphdXgiOworCQlyZWcgPSA8MT47CisJCWxlZC1tYXgtbWljcm9hbXAgPSA8MTAwMDA+OworCX07CisKKwlncmVlbl9wb3dlcjogbGVkQDUgeworCQlsYWJlbCA9ICJncmVlbjpwb3dlciI7CisJCXJlZyA9IDw1PjsKKwkJbGludXgsZGVmYXVsdC10cmlnZ2VyID0gImRlZmF1bHQtb24iOworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1wbTgwNTgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1wbTgwNTgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTg0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLXBtODA1OC50eHQKQEAgLTAsMCArMSw2NyBAQAorUXVhbGNvbW0gUE04MDU4IExFRCBkcml2ZXIKKworVGhlIFF1YWxjb21tIFBNODA1OCBpcyBhIG11bHRpLWZ1bmN0aW9uYWwgZGV2aWNlIHdoaWNoIGNvbnRhaW5zCithbiBMRUQgZHJpdmVyIGJsb2NrIGZvciB1cCB0byBzaXggTEVEczogdGhyZWUgbm9ybWFsIExFRHMsIHR3bworImZsYXNoIiBMRURzIGFuZCBvbmUgImtleXBhZCBiYWNrbGlnaHQiIExFRC4gVGhlIG5hbWVzIGFyZQorcXVvdGVkIGJlY2F1c2Ugc29tZXRpbWVzIHRoZXNlIExFRCBkcml2ZXJzIGFyZSB1c2VkIGZvciB3aWxkbHkKK2RpZmZlcmVudCB0aGluZ3MgdGhhbiBmbGFzaCBvciBrZXlwYWQgYmFja2xpZ2h0OiB0aGVpciBuYW1lcworYXJlIG1vcmUgb2YgYSBzdWdnZXN0aW9uIHRoYW4gYSBoYXJkLXdpcmVkIHVzZWNhc2UuCisKK0hhcmR3YXJlLXdpc2UgdGhlIGRpZmZlcmVudCBMRURzIHN1cHBvcnQgc2xpZ2h0bHkgZGlmZmVyZW50CitvdXRwdXQgY3VycmVudHMuIFRoZSAiZmxhc2giIExFRHMgZG8gbm90IG5lZWQgdG8gY2hhcmdlIG5vcgorZG8gdGhleSBzdXBwb3J0IGV4dGVybmFsIHRyaWdnZXJzLiBUaGV5IGFyZSBqdXN0IHBvd2VyZnVsIExFRAorZHJpdmVycy4KKworVGhlIExFRHMgYXBwZWFyIGFzIGNoaWxkcmVuIHRvIHRoZSBQTTgwNTggZGV2aWNlLCB3aXRoIHRoZQorcHJvcGVyIGNvbXBhdGlibGUgc3RyaW5nLiBGb3IgdGhlIFBNODA1OCBiaW5kaW5ncyBzZWU6CittZmQvcWNvbS1wbTh4eHgudHh0LgorCitFYWNoIExFRCBpcyByZXByZXNlbnRlZCBhcyBhIHN1Yi1ub2RlIG9mIHRoZSBzeXNjb24gZGV2aWNlLiBFYWNoCitub2RlJ3MgbmFtZSByZXByZXNlbnRzIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIExFRC4KKworTEVEIHN1Yi1ub2RlIHByb3BlcnRpZXM6CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IG9uZSBvZgorICAicWNvbSxwbTgwNTgtbGVkIiAoZm9yIHRoZSBub3JtYWwgTEVEcyBhdCAweDEzMSwgMHgxMzIgYW5kIDB4MTMzKQorICAicWNvbSxwbTgwNTgta2V5cGFkLWxlZCIgKGZvciB0aGUgImtleXBhZCIgTEVEIGF0IDB4NDgpCisgICJxY29tLHBtODA1OC1mbGFzaC1sZWQiIChmb3IgdGhlICJmbGFzaCIgTEVEcyBhdCAweDQ5IGFuZCAweEZCKQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBsYWJlbDogc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKKy0gZGVmYXVsdC1zdGF0ZTogc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKKy0gbGludXgsZGVmYXVsdC10cmlnZ2VyOiBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAorCitFeGFtcGxlOgorCitxY29tLHNzYmlANTAwMDAwIHsKKwlwbWljaW50YzogcG1pY0AwIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHBtODA1OCI7CisJCWxlZEA0OCB7CisJCQljb21wYXRpYmxlID0gInFjb20scG04MDU4LWtleXBhZC1sZWQiOworCQkJcmVnID0gPDB4NDg+OworCQkJbGFiZWwgPSAicG04MDUwOndoaXRlOmtleXBhZCI7CisJCQlkZWZhdWx0LXN0YXRlID0gIm9mZiI7CisJCX07CisJCWxlZEAxMzEgeworCQkJY29tcGF0aWJsZSA9ICJxY29tLHBtODA1OC1sZWQiOworCQkJcmVnID0gPDB4MTMxPjsKKwkJCWxhYmVsID0gInBtODA1ODpyZWQiOworCQkJZGVmYXVsdC1zdGF0ZSA9ICJvZmYiOworCQl9OworCQlsZWRAMTMyIHsKKwkJCWNvbXBhdGlibGUgPSAicWNvbSxwbTgwNTgtbGVkIjsKKwkJCXJlZyA9IDwweDEzMj47CisJCQlsYWJlbCA9ICJwbTgwNTg6eWVsbG93IjsKKwkJCWRlZmF1bHQtc3RhdGUgPSAib2ZmIjsKKwkJCWxpbnV4LGRlZmF1bHQtdHJpZ2dlciA9ICJtbWMwIjsKKwkJfTsKKwkJbGVkQDEzMyB7CisJCQljb21wYXRpYmxlID0gInFjb20scG04MDU4LWxlZCI7CisJCQlyZWcgPSA8MHgxMzM+OworCQkJbGFiZWwgPSAicG04MDU4OmdyZWVuIjsKKwkJCWRlZmF1bHQtc3RhdGUgPSAib24iOworCQkJbGludXgsZGVmYXVsdC10cmlnZ2VyID0gImhlYXJ0YmVhdCI7CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9yZWdpc3Rlci1iaXQtbGVkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL3JlZ2lzdGVyLWJpdC1sZWQudHh0CmluZGV4IDM3OWNlZmRjLi41OWI1NjM2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9yZWdpc3Rlci1iaXQtbGVkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9yZWdpc3Rlci1iaXQtbGVkLnR4dApAQCAtMjMsMTMgKzIzLDggQEAKICAgc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKIC0gbGludXgsZGVmYXVsdC10cmlnZ2VyIDogKG9wdGlvbmFsKQogICBzZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAotLSBkZWZhdWx0LXN0YXRlOiAob3B0aW9uYWwpIFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBMRUQuIFZhbGlkCi0gIHZhbHVlcyBhcmUgIm9uIiwgIm9mZiIsIGFuZCAia2VlcCIuIElmIHRoZSBMRUQgaXMgYWxyZWFkeSBvbiBvciBvZmYKLSAgYW5kIHRoZSBkZWZhdWx0LXN0YXRlIHByb3BlcnR5IGlzIHNldCB0aGUgdG8gc2FtZSB2YWx1ZSwgdGhlbiBubwotICBnbGl0Y2ggc2hvdWxkIGJlIHByb2R1Y2VkIHdoZXJlIHRoZSBMRUQgbW9tZW50YXJpbHkgdHVybnMgb2ZmIChvcgotICBvbikuIFRoZSAia2VlcCIgc2V0dGluZyB3aWxsIGtlZXAgdGhlIExFRCBhdCB3aGF0ZXZlciBpdHMgY3VycmVudAotICBzdGF0ZSBpcywgd2l0aG91dCBwcm9kdWNpbmcgYSBnbGl0Y2guICBUaGUgZGVmYXVsdCBpcyBvZmYgaWYgdGhpcwotICBwcm9wZXJ0eSBpcyBub3QgcHJlc2VudC4KKy0gZGVmYXVsdC1zdGF0ZTogKG9wdGlvbmFsKSBUaGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgTEVECisgIHNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CiAKIEV4YW1wbGU6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tYWlsYm94L21lc29uLW1odS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWFpbGJveC9tZXNvbi1taHUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MzAzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWFpbGJveC9tZXNvbi1taHUudHh0CkBAIC0wLDAgKzEsMzQgQEAKK0FtbG9naWMgTWVzb24gTUhVIE1haWxib3ggRHJpdmVyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgQW1sb2dpYydzIE1lc29uIFNvQ3MgTWVzc2FnZS1IYW5kbGluZy1Vbml0IChNSFUpIGlzIGEgbWFpbGJveCBjb250cm9sbGVyCit0aGF0IGhhcyAzIGluZGVwZW5kZW50IGNoYW5uZWxzL2xpbmtzIHRvIGNvbW11bmljYXRlIHdpdGggcmVtb3RlIHByb2Nlc3NvcihzKS4KK01IVSBsaW5rcyBhcmUgaGFyZHdpcmVkIG9uIGEgcGxhdGZvcm0uIEEgbGluayByYWlzZXMgaW50ZXJydXB0IGZvciBhbnkKK3JlY2VpdmVkIGRhdGEuIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIHNwZWNpZmllZCB3YXkgb2Yga25vd2luZyBpZiB0aGUgc2VudAorZGF0YSBoYXMgYmVlbiByZWFkIGJ5IHRoZSByZW1vdGUuIFRoaXMgZHJpdmVyIGFzc3VtZXMgdGhlIHNlbmRlciBwb2xscworU1RBVCByZWdpc3RlciBhbmQgdGhlIHJlbW90ZSBjbGVhcnMgaXQgYWZ0ZXIgaGF2aW5nIHJlYWQgdGhlIGRhdGEuCisKK01haWxib3ggRGV2aWNlIE5vZGU6Cis9PT09PT09PT09PT09PT09PT09PQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0gY29tcGF0aWJsZToJCVNoYWxsIGJlICJhbWxvZ2ljLG1lc29uLWd4YmItbWh1IgorLSByZWc6CQkJQ29udGFpbnMgdGhlIG1haWxib3ggcmVnaXN0ZXIgYWRkcmVzcyByYW5nZSAoYmFzZQorCQkJYWRkcmVzcyBhbmQgbGVuZ3RoKQorLSAjbWJveC1jZWxscwkJU2hhbGwgYmUgMSAtIHRoZSBpbmRleCBvZiB0aGUgY2hhbm5lbCBuZWVkZWQuCistIGludGVycnVwdHM6CQlDb250YWlucyB0aGUgaW50ZXJydXB0IGluZm9ybWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8KKwkJCWVhY2ggb2YgdGhlIDIgbGlua3Mgb2YgTUhVLgorCitFeGFtcGxlOgorLS0tLS0tLS0KKworCW1haWxib3g6IG1haWxib3hAYzg4M2M0MDQgeworCQkjbWJveC1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJhbWxvZ2ljLG1lc29uLWd4YmItbWh1IjsKKwkJcmVnID0gPDAgMHhjODgzYzQwNCAwIDB4NGM+OworCQlpbnRlcnJ1cHRzID0gPDAgMjA4IElSUV9UWVBFX0VER0VfUklTSU5HPiwKKwkJCSAgICAgPDAgMjA5IElSUV9UWVBFX0VER0VfUklTSU5HPiwKKwkJCSAgICAgPDAgMjEwIElSUV9UWVBFX0VER0VfUklTSU5HPjsKKwkJI21ib3gtY2VsbHMgPSA8MT47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZW1vcnktY29udHJvbGxlcnMvZnNsL2Rkci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVtb3J5LWNvbnRyb2xsZXJzL2ZzbC9kZHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZTZkODMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWVtb3J5LWNvbnRyb2xsZXJzL2ZzbC9kZHIudHh0CkBAIC0wLDAgKzEsMjkgQEAKK0ZyZWVzY2FsZSBERFIgbWVtb3J5IGNvbnRyb2xsZXIKKworUHJvcGVydGllczoKKworLSBjb21wYXRpYmxlCTogU2hvdWxkIGluY2x1ZGUgImZzbCxjaGlwLW1lbW9yeS1jb250cm9sbGVyIiB3aGVyZQorCQkgIGNoaXAgaXMgdGhlIHByb2Nlc3NvciAoYnNjOTEzMiwgbXBjODU3MiBldGMuKSwgb3IKKwkJICAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIi4KKy0gcmVnCQk6IEFkZHJlc3MgYW5kIHNpemUgb2YgRERSIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCistIGludGVycnVwdHMJOiBFcnJvciBpbnRlcnJ1cHQgb2YgRERSIGNvbnRyb2xsZXIKKy0gbGl0dGxlLWVuZGlhbgk6IFNwZWNpZmllcyBsaXR0bGUtZW5kaWFuIGFjY2VzcyB0byByZWdpc3RlcnMKKwkJICBJZiBvbWl0dGVkLCBiaWctZW5kaWFuIHdpbGwgYmUgdXNlZC4KKworRXhhbXBsZSAxOgorCisJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGJzYzkxMzItbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDg+OworCX07CisKKworRXhhbXBsZSAyOgorCisJZGRyMTogbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjciLAorCQkJCSJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHg4MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9hYzEwMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL2FjMTAwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGVmMDA2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9hYzEwMC50eHQKQEAgLTAsMCArMSw1NCBAQAorWC1Qb3dlcnMgQUMxMDAgQ29kZWMvUlRDIElDIERldmljZSBUcmVlIGJpbmRpbmdzCisKK0FDMTAwIGlzIGEgYXVkaW8gY29kZWMgYW5kIFJUQyBzdWJzeXN0ZW0gY29tYm8gSUMuIFRoZSAyIHBhcnRzIGFyZQorc2VwYXJhdGVkLCBpbmNsdWRpbmcgcG93ZXIgc3VwcGxpZXMgYW5kIGludGVycnVwdCBsaW5lcywgYnV0IHNoYXJlCithIGNvbW1vbiByZWdpc3RlciBhZGRyZXNzIHNwYWNlIGFuZCBob3N0IGludGVyZmFjZS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogIngtcG93ZXJzLGFjMTAwIgorLSByZWc6IFRoZSBJMkMgc2xhdmUgYWRkcmVzcyBvciBSU0IgaGFyZHdhcmUgYWRkcmVzcyBmb3IgdGhlIGNoaXAKKy0gc3ViLW5vZGVzOgorICAtIGNvZGVjCisgICAgLSBjb21wYXRpYmxlOgkJIngtcG93ZXJzLGFjMTAwLWNvZGVjIgorICAgIC0gaW50ZXJydXB0LXBhcmVudDoJCVRoZSBwYXJlbnQgaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAgICAtIGludGVycnVwdHM6CQlTb0MgTk1JIC8gR1BJTyBpbnRlcnJ1cHQgY29ubmVjdGVkIHRvIHRoZQorICAgIAkJCQlJUlFfQVVESU8gcGluCisgICAgLSAjY2xvY2stY2VsbHM6CQlTaGFsbCBiZSAwCisgICAgLSBjbG9jay1vdXRwdXQtbmFtZXM6CSI0TV9hZGRhIgorCisgICAgLSBzZWUgY2xvY2svY2xvY2stYmluZGluZ3MudHh0IGZvciBjb21tb24gY2xvY2sgYmluZGluZ3MKKworICAtIHJ0YworICAgIC0gY29tcGF0aWJsZToJCSJ4LXBvd2VycyxhYzEwMC1ydGMiCisgICAgLSBpbnRlcnJ1cHQtcGFyZW50OgkJVGhlIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlcgorICAgIC0gaW50ZXJydXB0czoJCVNvQyBOTUkgLyBHUElPIGludGVycnVwdCBjb25uZWN0ZWQgdG8gdGhlCisgICAgCQkJCUlSUV9SVEMgcGluCisgICAgLSBjbG9ja3M6CQkJQSBwaGFuZGxlIHRvIHRoZSBjb2RlYydzICI0TV9hZGRhIiBjbG9jaworICAgIC0gI2Nsb2NrLWNlbGxzOgkJU2hhbGwgYmUgMQorICAgIC0gY2xvY2stb3V0cHV0LW5hbWVzOgkiY2tvMV9ydGMiLCAiY2tvMl9ydGMiLCAiY2tvM19ydGMiCisKKyAgICAtIHNlZSBjbG9jay9jbG9jay1iaW5kaW5ncy50eHQgZm9yIGNvbW1vbiBjbG9jayBiaW5kaW5ncworCitFeGFtcGxlOgorCithYzEwMDogY29kZWNAZTg5IHsKKwljb21wYXRpYmxlID0gIngtcG93ZXJzLGFjMTAwIjsKKwlyZWcgPSA8MHhlODk+OworCisJYWMxMDBfY29kZWM6IGNvZGVjIHsKKwkJY29tcGF0aWJsZSA9ICJ4LXBvd2VycyxhYzEwMC1jb2RlYyI7CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnJfcGlvPjsKKwkJaW50ZXJydXB0cyA9IDwwIDkgSVJRX1RZUEVfTEVWRUxfTE9XPjsgLyogUEw5ICovCisJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJY2xvY2stb3V0cHV0LW5hbWVzID0gIjRNX2FkZGEiOworCX07CisKKwlhYzEwMF9ydGM6IHJ0YyB7CisJCWNvbXBhdGlibGUgPSAieC1wb3dlcnMsYWMxMDAtcnRjIjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbm1pX2ludGM+OworCQlpbnRlcnJ1cHRzID0gPDAgSVJRX1RZUEVfTEVWRUxfTE9XPjsKKwkJY2xvY2tzID0gPCZhYzEwMF9jb2RlYz47CisJCSNjbG9jay1jZWxscyA9IDwxPjsKKwkJY2xvY2stb3V0cHV0LW5hbWVzID0gImNrbzFfcnRjIiwgImNrbzJfcnRjIiwgImNrbzNfcnRjIjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvYWN0ODk0NWEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9hY3Q4OTQ1YS50eHQKaW5kZXggZjcxMjgzMC4uNDYyODE5YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9hY3Q4OTQ1YS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9hY3Q4OTQ1YS50eHQKQEAgLTE0LDEzICsxNCw2IEBACiAJCXJlZyA9IDwweDViPjsKIAkJc3RhdHVzID0gIm9rYXkiOwogCi0JCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7Ci0JCXBpbmN0cmwtMCA9IDwmcGluY3RybF9jaGFyZ2VyX2NoZ2xldj47Ci0JCWFjdGl2ZS1zZW1pLGNoZ2xldi1ncGlvID0gPCZwaW9BIDEyIEdQSU9fQUNUSVZFX0hJR0g+OwotCQlhY3RpdmUtc2VtaSxpbnB1dC12b2x0YWdlLXRocmVzaG9sZC1taWNyb3ZvbHQgPSA8NjYwMD47Ci0JCWFjdGl2ZS1zZW1pLHByZWNvbmRpdGlvbi10aW1lb3V0ID0gPDQwPjsKLQkJYWN0aXZlLXNlbWksdG90YWwtdGltZW91dCA9IDwzPjsKLQogCQlhY3RpdmUtc2VtaSx2c2VsLWhpZ2g7CiAKIAkJcmVndWxhdG9ycyB7CkBAIC03Myw0ICs2NiwxOSBAQAogCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CiAJCQl9OwogCQl9OworCisJCWNoYXJnZXIgeworCQkJY29tcGF0aWJsZSA9ICJhY3RpdmUtc2VtaSxhY3Q4OTQ1YS1jaGFyZ2VyIjsKKwkJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfY2hhcmdlcl9jaGdsZXYgJnBpbmN0cmxfY2hhcmdlcl9sYm8gJnBpbmN0cmxfY2hhcmdlcl9pcnE+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcGlvQT47CisJCQlpbnRlcnJ1cHRzID0gPDQ1IEdQSU9fQUNUSVZFX0xPVz47CisKKwkJCWFjdGl2ZS1zZW1pLGNoZ2xldi1ncGlvcyA9IDwmcGlvQSAxMiBHUElPX0FDVElWRV9ISUdIPjsKKwkJCWFjdGl2ZS1zZW1pLGxiby1ncGlvcyA9IDwmcGlvQSA3MiBHUElPX0FDVElWRV9MT1c+OworCQkJYWN0aXZlLXNlbWksaW5wdXQtdm9sdGFnZS10aHJlc2hvbGQtbWljcm92b2x0ID0gPDY2MDA+OworCQkJYWN0aXZlLXNlbWkscHJlY29uZGl0aW9uLXRpbWVvdXQgPSA8NDA+OworCQkJYWN0aXZlLXNlbWksdG90YWwtdGltZW91dCA9IDwzPjsKKwkJCXN0YXR1cyA9ICJva2F5IjsKKwkJfTsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9hcml6b25hLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvYXJpem9uYS50eHQKaW5kZXggYTZlMmVhNDEuLjhmMmUyODIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvYXJpem9uYS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9hcml6b25hLnR4dApAQCAtODUsNiArODUsMjQgQEAKICAgICBwcmVzZW50LCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZQogICAgIG51bWJlciBvZiBpbnB1dHMsIHVuc3BlY2lmaWVkIGlucHV0cyB3aWxsIHVzZSB0aGUgY2hpcCBkZWZhdWx0LgogCisgIC0gd2xmLG1heC1jaGFubmVscy1jbG9ja2VkIDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHRvIGJlIGNsb2NrZWQgb24KKyAgICBlYWNoIEFJRiwgdXNlZnVsIGZvciBJMlMgc3lzdGVtcyB3aXRoIG11bHRpcGxlIGRhdGEgbGluZXMgYmVpbmcgbWFzdGVyZWQuCisgICAgU3BlY2lmeSBvbmUgY2VsbCBmb3IgZWFjaCBBSUYgdG8gYmUgY29uZmlndXJlZCwgc3BlY2lmeSB6ZXJvIGZvciBBSUZzIHRoYXQKKyAgICBzaG91bGQgYmUgaGFuZGxlZCBub3JtYWxseS4KKyAgICBJZiBwcmVzZW50LCBudW1iZXIgb2YgY2VsbHMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgIEFJRnMuIElmIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIEFJRnMsIGZvciBjZWxscyB0aGF0IGhhdmUgbm90IGJlZW4KKyAgICBzcGVjaWZpZWQgdGhlIGNvcnJlc3BvbmRpbmcgQUlGcyB3aWxsIGJlIHRyZWF0ZWQgYXMgZGVmYXVsdCBzZXR0aW5nLgorCisgIC0gd2xmLHNway1mbXQgOiBQRE0gc3BlYWtlciBkYXRhIGZvcm1hdCwgbXVzdCBjb250YWluIDIgY2VsbHMgKE9VVDUgYW5kIE9VVDYpLgorICAgIFNlZSB0aGUgZGF0YXNoZWV0IGZvciB2YWx1ZXMuCisgICAgVGhlIHNlY29uZCBjZWxsIGlzIGlnbm9yZWQgZm9yIGNvZGVjcyB0aGF0IGRvIG5vdCBoYXZlIE9VVDYgKHdtNTEwMiwgd204OTk3LAorICAgICAgd204OTk4LCB3bTE4MTQpCisKKyAgLSB3bGYsc3BrLW11dGUgOiBQRE0gc3BlYWtlciBtdXRlIHNldHRpbmcsIG11c3QgY29udGFpbiAyIGNlbGxzIChPVVQ1IGFuZCBPVVQ2KS4KKyAgICBTZWUgdGhlIGRhdGFzaGVldCBmb3IgdmFsdWVzLgorICAgIFRoZSBzZWNvbmQgY2VsbCBpcyBpZ25vcmVkIGZvciBjb2RlY3MgdGhhdCBkbyBub3QgaGF2ZSBPVVQ2ICh3bTUxMDIsIHdtODk5NywKKyAgICB3bTg5OTgsIHdtMTgxNCkKKwogICAtIERDVkRELXN1cHBseSwgTUlDVkRELXN1cHBseSA6IFBvd2VyIHN1cHBsaWVzLCBvbmx5IG5lZWQgdG8gYmUgc3BlY2lmaWVkIGlmCiAgICAgdGhleSBhcmUgYmVpbmcgZXh0ZXJuYWxseSBzdXBwbGllZC4gQXMgY292ZXJlZCBpbgogICAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9hc3BlZWQtc2N1LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvYXNwZWVkLXNjdS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZjNWI4MwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvYXNwZWVkLXNjdS50eHQKQEAgLTAsMCArMSwxOCBAQAorVGhlIEFzcGVlZCBTeXN0ZW0gQ29udHJvbCBVbml0IG1hbmFnZXMgdGhlIGdsb2JhbCBiZWhhdmlvdXIgb2YgdGhlIFNvQywKK2NvbmZpZ3VyaW5nIGVsZW1lbnRzIHN1Y2ggYXMgY2xvY2tzLCBwaW5tdXgsIGFuZCByZXNldC4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZToJT25lIG9mOgorCQkiYXNwZWVkLGFzdDI0MDAtc2N1IiwgInN5c2NvbiIsICJzaW1wbGUtbWZkIgorCQkiYXNwZWVkLGc0LXNjdSIsICJzeXNjb24iLCAic2ltcGxlLW1mZCIKKwkJImFzcGVlZCxhc3QyNTAwLXNjdSIsICJzeXNjb24iLCAic2ltcGxlLW1mZCIKKwkJImFzcGVlZCxnNS1zY3UiLCAic3lzY29uIiwgInNpbXBsZS1tZmQiCisKKy0gcmVnOgkJY29udGFpbnMgdGhlIG9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBTQ1UgbWVtb3J5IHJlZ2lvbgorCitFeGFtcGxlOgorCitzeXNjb246IHN5c2NvbkAxZTZlMjAwMCB7CisJY29tcGF0aWJsZSA9ICJhc3BlZWQsYXN0MjQwMC1zY3UiLCAic3lzY29uIiwgInNpbXBsZS1tZmQiOworCXJlZyA9IDwweDFlNmUyMDAwIDB4MWE4PjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL2F4cDIweC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL2F4cDIweC50eHQKaW5kZXggNTg1YTk1NS4uOGYzYWQ5YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9heHAyMHgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvYXhwMjB4LnR4dApAQCAtMTAsNyArMTAsOCBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBjb21wYXRpYmxlOiAieC1wb3dlcnMsYXhwMTUyIiwgIngtcG93ZXJzLGF4cDIwMiIsICJ4LXBvd2VycyxheHAyMDkiLAotCSAgICAgICJ4LXBvd2VycyxheHAyMjEiLCAieC1wb3dlcnMsYXhwMjIzIiwgIngtcG93ZXJzLGF4cDgwOSIKKwkgICAgICAieC1wb3dlcnMsYXhwMjIxIiwgIngtcG93ZXJzLGF4cDIyMyIsICJ4LXBvd2VycyxheHA4MDYiLAorCSAgICAgICJ4LXBvd2VycyxheHA4MDkiCiAtIHJlZzogVGhlIEkyQyBzbGF2ZSBhZGRyZXNzIG9yIFJTQiBoYXJkd2FyZSBhZGRyZXNzIGZvciB0aGUgQVhQIGNoaXAKIC0gaW50ZXJydXB0LXBhcmVudDogVGhlIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlcgogLSBpbnRlcnJ1cHRzOiBTb0MgTk1JIC8gR1BJTyBpbnRlcnJ1cHQgY29ubmVjdGVkIHRvIHRoZSBQTUlDJ3MgSVJRIHBpbgpAQCAtNDcsNyArNDgsNiBAQAogCQkJICBwcm9iYWJseSBtYWtlcyBzZW5zZSBmb3IgSGlGaSBhdWRpbyByZWxhdGVkCiAJCQkgIGFwcGxpY2F0aW9ucyB0aGF0IGFyZW4ndCBiYXR0ZXJ5IGNvbnN0cmFpbmVkLgogCi0KIEFYUDIwMi9BWFAyMDkgcmVndWxhdG9ycywgdHlwZSwgYW5kIGNvcnJlc3BvbmRpbmcgaW5wdXQgc3VwcGx5IG5hbWVzOgogCiBSZWd1bGF0b3IJICBUeXBlCQkgIFN1cHBseSBOYW1lCQkgIE5vdGVzCkBAIC04Niw2ICs4NiwzMCBAQAogUlRDX0xETwkJOiBMRE8JCTogaXBzLXN1cHBseQkJOiBhbHdheXMgb24KIERSSVZFVkJVUwk6IEVuYWJsZSBvdXRwdXQJOiBkcml2ZXZidXMtc3VwcGx5CTogZXh0ZXJuYWwgcmVndWxhdG9yCiAKK0FYUDgwNiByZWd1bGF0b3JzLCB0eXBlLCBhbmQgY29ycmVzcG9uZGluZyBpbnB1dCBzdXBwbHkgbmFtZXM6CisKK1JlZ3VsYXRvcgkgIFR5cGUJCSAgU3VwcGx5IE5hbWUJCSAgTm90ZXMKKy0tLS0tLS0tLQkgIC0tLS0JCSAgLS0tLS0tLS0tLS0JCSAgLS0tLS0KK0RDRENBCQk6IERDLURDIGJ1Y2sJOiB2aW5hLXN1cHBseQkJOiBwb2x5LXBoYXNlIGNhcGFibGUKK0RDRENCCQk6IERDLURDIGJ1Y2sJOiB2aW5iLXN1cHBseQkJOiBwb2x5LXBoYXNlIGNhcGFibGUKK0RDRENDCQk6IERDLURDCWJ1Y2sJOiB2aW5jLXN1cHBseQkJOiBwb2x5LXBoYXNlIGNhcGFibGUKK0RDRENECQk6IERDLURDCWJ1Y2sJOiB2aW5kLXN1cHBseQkJOiBwb2x5LXBoYXNlIGNhcGFibGUKK0RDRENFCQk6IERDLURDCWJ1Y2sJOiB2aW5lLXN1cHBseQkJOiBwb2x5LXBoYXNlIGNhcGFibGUKK0FMRE8xCQk6IExETwkJOiBhbGRvaW4tc3VwcGx5CQk6IHNoYXJlZCBzdXBwbHkKK0FMRE8yCQk6IExETwkJOiBhbGRvaW4tc3VwcGx5CQk6IHNoYXJlZCBzdXBwbHkKK0FMRE8zCQk6IExETwkJOiBhbGRvaW4tc3VwcGx5CQk6IHNoYXJlZCBzdXBwbHkKK0JMRE8xCQk6IExETwkJOiBibGRvaW4tc3VwcGx5CQk6IHNoYXJlZCBzdXBwbHkKK0JMRE8yCQk6IExETwkJOiBibGRvaW4tc3VwcGx5CQk6IHNoYXJlZCBzdXBwbHkKK0JMRE8zCQk6IExETwkJOiBibGRvaW4tc3VwcGx5CQk6IHNoYXJlZCBzdXBwbHkKK0JMRE80CQk6IExETwkJOiBibGRvaW4tc3VwcGx5CQk6IHNoYXJlZCBzdXBwbHkKK0NMRE8xCQk6IExETwkJOiBjbGRvaW4tc3VwcGx5CQk6IHNoYXJlZCBzdXBwbHkKK0NMRE8yCQk6IExETwkJOiBjbGRvaW4tc3VwcGx5CQk6IHNoYXJlZCBzdXBwbHkKK0NMRE8zCQk6IExETwkJOiBjbGRvaW4tc3VwcGx5CQk6IHNoYXJlZCBzdXBwbHkKK1NXCQk6IE9uL09mZiBTd2l0Y2ggOiBzd2luLXN1cHBseQorCitBZGRpdGlvbmFsbHksIHRoZSBBWFA4MDYgREMtREMgcmVndWxhdG9ycyBzdXBwb3J0IHBvbHktcGhhc2UgYXJyYW5nZW1lbnRzCitmb3IgaGlnaGVyIG91dHB1dCBjdXJyZW50LiBUaGUgcG9zc2libGUgZ3JvdXBpbmdzIGFyZTogQStCLCBBK0IrQywgRCtFLgorCiBBWFA4MDkgcmVndWxhdG9ycywgdHlwZSwgYW5kIGNvcnJlc3BvbmRpbmcgaW5wdXQgc3VwcGx5IG5hbWVzOgogCiBSZWd1bGF0b3IJICBUeXBlCQkgIFN1cHBseSBOYW1lCQkgIE5vdGVzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL2xwODczeC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL2xwODczeC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3NjZjMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvbHA4NzN4LnR4dApAQCAtMCwwICsxLDU5IEBACitUSSBMUDg3M1ggUE1JQyBNRkQgZHJpdmVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgIC0gY29tcGF0aWJsZToJInRpLGxwODczMiIsICJ0aSxscDg3MzMiCisgIC0gcmVnOgkJSTJDIHNsYXZlIGFkZHJlc3MuCisgIC0gZ3Bpby1jb250cm9sbGVyOglNYXJrcyB0aGUgZGV2aWNlIG5vZGUgYXMgYSBHUElPIENvbnRyb2xsZXIuCisgIC0gI2dwaW8tY2VsbHM6CVNob3VsZCBiZSB0d28uICBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlciBhbmQKKwkJCXRoZSBzZWNvbmQgY2VsbCBpcyB1c2VkIHRvIHNwZWNpZnkgZmxhZ3MuCisJCQlTZWUgLi4vZ3Bpby9ncGlvLnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgLSByZWd1bGF0b3JzOglMaXN0IG9mIGNoaWxkIG5vZGVzIHRoYXQgc3BlY2lmeSB0aGUgcmVndWxhdG9yCisJCQlpbml0aWFsaXphdGlvbiBkYXRhLgorRXhhbXBsZToKKworcG1pYzogbHA4NzMzQDYwIHsKKwljb21wYXRpYmxlID0gInRpLGxwODczMyI7CisJcmVnID0gPDB4NjA+OworCWdwaW8tY29udHJvbGxlcjsKKwkjZ3Bpby1jZWxscyA9IDwyPjsKKworCXJlZ3VsYXRvcnMgeworCQlscDg3MzNfYnVjazA6IGJ1Y2swIHsKKwkJCXJlZ3VsYXRvci1uYW1lID0gImxwODczMy1idWNrMCI7CisJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw4MDAwMDA+OworCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTQwMDAwMD47CisJCQlyZWd1bGF0b3ItbWluLW1pY3JvYW1wID0gPDE1MDAwMDA+OworCQkJcmVndWxhdG9yLW1heC1taWNyb2FtcCA9IDw0MDAwMDAwPjsKKwkJCXJlZ3VsYXRvci1yYW1wLWRlbGF5ID0gPDEwMDAwPjsKKwkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJfTsKKworCQlscDg3MzNfYnVjazE6IGJ1Y2sxIHsKKwkJCXJlZ3VsYXRvci1uYW1lID0gImxwODczMy1idWNrMSI7CisJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw4MDAwMDA+OworCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTQwMDAwMD47CisJCQlyZWd1bGF0b3ItbWluLW1pY3JvYW1wID0gPDE1MDAwMDA+OworCQkJcmVndWxhdG9yLW1heC1taWNyb2FtcCA9IDw0MDAwMDAwPjsKKwkJCXJlZ3VsYXRvci1yYW1wLWRlbGF5ID0gPDEwMDAwPjsKKwkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJfTsKKworCQlscDg3MzNfbGRvMDogbGRvMCB7CisJCQlyZWd1bGF0b3ItbmFtZSA9ICJscDg3MzMtbGRvMCI7CisJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw4MDAwMDA+OworCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzAwMDAwMD47CisJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCX07CisKKwkJbHA4NzMzX2xkbzE6IGxkbzEgeworCQkJcmVndWxhdG9yLW5hbWUgPSAibHA4NzMzLWxkbzEiOworCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8ODAwMDAwPjsKKwkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDMwMDAwMDA+OworCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCXJlZ3VsYXRvci1ib290LW9uOworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9tYXg3NzY5My50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL21heDc3NjkzLnR4dAppbmRleCBkMzQyNTg0Li42YTFhZTNhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL21heDc3NjkzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL21heDc3NjkzLnR4dApAQCAtMTcsMjggKzE3LDI4IEBACiAtIGludGVycnVwdC1wYXJlbnQgOiAgVGhlIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlci4KIAogT3B0aW9uYWwgcHJvcGVydGllczoKLS0gcmVndWxhdG9ycyA6IFRoZSByZWd1bGF0b3JzIG9mIG1heDc3NjkzIGhhdmUgdG8gYmUgaW5zdGFudGlhdGVkIHVuZGVyIHN1Ym5vZAorLSByZWd1bGF0b3JzIDogVGhlIHJlZ3VsYXRvcnMgb2YgbWF4Nzc2OTMgaGF2ZSB0byBiZSBpbnN0YW50aWF0ZWQgdW5kZXIgc3Vibm9kZQogICBuYW1lZCAicmVndWxhdG9ycyIgdXNpbmcgdGhlIGZvbGxvd2luZyBmb3JtYXQuCiAKIAlyZWd1bGF0b3JzIHsKLQkJcmVndWFsdG9yLWNvbXBhdGlibGUgPSBFU0FGRU9VVDEvRVNBRkVPVVQyL0NIQVJHRVIKLQkJc3RhbmRhcmQgcmVndWxhdG9yIGNvbnN0cmF0aW50c1sqXS4KKwkJcmVndWxhdG9yLWNvbXBhdGlibGUgPSBFU0FGRU9VVDEvRVNBRkVPVVQyL0NIQVJHRVIKKwkJc3RhbmRhcmQgcmVndWxhdG9yIGNvbnN0cmFpbnRzWypdLgogCX07CiAKIAlbKl0gcmVmZXIgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0CiAKIC0gaGFwdGljIDogVGhlIE1BWDc3NjkzIGhhcHRpYyBkZXZpY2UgdXRpbGlzZXMgYSBQV00gY29udHJvbGxlZCBtb3RvciB0byBwcm92aWRlCiAgIHVzZXJzIHdpdGggdGFjdGlsZSBmZWVkYmFjay4gUFdNIHBlcmlvZCBhbmQgZHV0eS1jeWNsZSBhcmUgdmFyaWVkIGluCi0gIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGFwcHJvcHJpdGUgbGV2ZWwgb2YgZmVlZGJhY2suCisgIG9yZGVyIHRvIHByb3ZpZGUgdGhlIGFwcHJvcHJpYXRlIGxldmVsIG9mIGZlZWRiYWNrLgogCiAgUmVxdWlyZWQgcHJvcGVydGllczoKLQktIGNvbXBhdGlibGUgOiBNdXN0IGJlICJtYXhpbSxtYXg3NzY5My1ocGF0aWMiCisJLSBjb21wYXRpYmxlIDogTXVzdCBiZSAibWF4aW0sbWF4Nzc2OTMtaGFwdGljIgogCS0gaGFwdGljLXN1cHBseSA6IHBvd2VyIHN1cHBseSBmb3IgdGhlIGhhcHRpYyBtb3RvcgogCVsqXSByZWZlciBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKIAktIHB3bXMgOiBwaGFuZGxlIHRvIHRoZSBwaHlzaWNhbCBQV00oUHVsc2UgV2lkdGggTW9kdWxhdGlvbikgZGV2aWNlLgogCSBQV00gcHJvcGVydGllcyBzaG91bGQgYmUgbmFtZWQgInB3bXMiLiBBbmQgbnVtYmVyIG9mIGNlbGwgaXMgZGlmZmVyZW50CiAJIGZvciBlYWNoIHB3bSBkZXZpY2UuCi0JIFRvIGdldCBtb3JlIGluZm9ybWF0aW9ucywgcGxlYXNlIHJlZmVyIHRvIGRvY3VtZW50YWlvbi4KKwkgVG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byBkb2N1bWVudGF0aW9uLgogCVsqXSByZWZlciBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcHdtL3B3bS50eHQKIAogLSBjaGFyZ2VyIDogTm9kZSBjb25maWd1cmluZyB0aGUgY2hhcmdlciBkcml2ZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3Fjb20tcG04eHh4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvcWNvbS1wbTh4eHgudHh0CmluZGV4IGYyNGYzMzQuLjM3YTA4OGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvcWNvbS1wbTh4eHgudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvcWNvbS1wbTh4eHgudHh0CkBAIC02Miw2ICs2Miw3IEBACiAJCSAgICAicWNvbSxwbTgwNTgtcnRjIgogCQkgICAgInFjb20scG04OTIxLXJ0YyIKIAkJICAgICJxY29tLHBtODk0MS1ydGMiCisJCSAgICAicWNvbSxwbTgwMTgtcnRjIgogCiAtIHJlZzoKIAlVc2FnZTogcmVxdWlyZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvcWNvbS1ycG0udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9xY29tLXJwbS50eHQKaW5kZXggYjk4YjI5MS4uNDg1YmM1OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9xY29tLXJwbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9xY29tLXJwbS50eHQKQEAgLTEzLDYgKzEzLDcgQEAKIAkJICAgICJxY29tLHJwbS1tc204NjYwIgogCQkgICAgInFjb20scnBtLW1zbTg5NjAiCiAJCSAgICAicWNvbSxycG0taXBxODA2NCIKKwkJICAgICJxY29tLHJwbS1tZG05NjE1IgogCiAtIHJlZzoKIAlVc2FnZTogcmVxdWlyZWQKQEAgLTU5LDYgKzYwLDcgQEAKIAkJICAgICJxY29tLHJwbS1wbTgwNTgtcmVndWxhdG9ycyIKIAkJICAgICJxY29tLHJwbS1wbTg5MDEtcmVndWxhdG9ycyIKIAkJICAgICJxY29tLHJwbS1wbTg5MjEtcmVndWxhdG9ycyIKKwkJICAgICJxY29tLHJwbS1wbTgwMTgtcmVndWxhdG9ycyIKIAogLSB2ZGRfbDBfbDFfbHZzLXN1cHBseToKIC0gdmRkX2wyX2wxMV9sMTItc3VwcGx5OgpAQCAtMTM3LDYgKzEzOSwxNSBAQAogCURlZmluaXRpb246IHJlZmVyZW5jZSB0byByZWd1bGF0b3Igc3VwcGx5aW5nIHRoZSBpbnB1dCBwaW4sIGFzCiAJCSAgICBkZXNjcmliZWQgaW4gdGhlIGRhdGEgc2hlZXQKIAorLSB2aW5fbHZzMS1zdXBwbHk6CistIHZkZF9sNy1zdXBwbHk6CistIHZkZF9sOC1zdXBwbHk6CistIHZkZF9sOV9sMTBfbDExX2wxMi1zdXBwbHk6CisJVXNhZ2U6IG9wdGlvbmFsIChwbTgwMTggb25seSkKKwlWYWx1ZSB0eXBlOiA8cGhhbmRsZT4KKwlEZWZpbml0aW9uOiByZWZlcmVuY2UgdG8gcmVndWxhdG9yIHN1cHBseWluZyB0aGUgaW5wdXQgcGluLCBhcworCQkgICAgZGVzY3JpYmVkIGluIHRoZSBkYXRhIHNoZWV0CisKIFRoZSByZWd1bGF0b3Igbm9kZSBob3VzZXMgc3ViLW5vZGVzIGZvciBlYWNoIHJlZ3VsYXRvciB3aXRoaW4gdGhlIGRldmljZS4gRWFjaAogc3ViLW5vZGUgaXMgaWRlbnRpZmllZCB1c2luZyB0aGUgbm9kZSdzIG5hbWUsIHdpdGggdmFsaWQgdmFsdWVzIGxpc3RlZCBmb3IgZWFjaAogb2YgdGhlIHBtaWNzIGJlbG93LgpAQCAtMTU2LDYgKzE2NywxMCBAQAogCWwyOSwgbHZzMSwgbHZzMiwgbHZzMywgbHZzNCwgbHZzNSwgbHZzNiwgbHZzNywgdXNiLXN3aXRjaCwgaGRtaS1zd2l0Y2gsCiAJbmNwCiAKK3BtODAxODoKKwlzMSwgczIsIHMzLCBzNCwgczUsICwgbDEsIGwyLCBsMywgbDQsIGw1LCBsNiwgbDcsIGw4LCBsOSwgbDEwLCBsMTEsCisJbDEyLCBsMTQsIGx2czEKKwogVGhlIGNvbnRlbnQgb2YgZWFjaCBzdWItbm9kZSBpcyBkZWZpbmVkIGJ5IHRoZSBzdGFuZGFyZCBiaW5kaW5nIGZvciByZWd1bGF0b3JzIC0KIHNlZSByZWd1bGF0b3IudHh0IC0gd2l0aCBhZGRpdGlvbmFsIGN1c3RvbSBwcm9wZXJ0aWVzIGRlc2NyaWJlZCBiZWxvdzoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9yazgwOC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3JrODA4LnR4dAppbmRleCA0Y2E2YWFiLi45NjM2YWU4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3JrODA4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3JrODA4LnR4dApAQCAtMSw3ICsxLDExIEBACi1SSzgwOCBQb3dlciBNYW5hZ2VtZW50IEludGVncmF0ZWQgQ2lyY3VpdAorUks4WFggUG93ZXIgTWFuYWdlbWVudCBJbnRlZ3JhdGVkIENpcmN1aXQKKworVGhlIHJrOHh4IGZhbWlseSBjdXJyZW50IG1lbWJlcnM6CityazgwOAorcms4MTgKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogInJvY2tjaGlwLHJrODA4IgorLSBjb21wYXRpYmxlOiAicm9ja2NoaXAscms4MDgiLCAicm9ja2NoaXAscms4MTgiCiAtIHJlZzogSTJDIHNsYXZlIGFkZHJlc3MKIC0gaW50ZXJydXB0LXBhcmVudDogVGhlIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlci4KIC0gaW50ZXJydXB0czogdGhlIGludGVycnVwdCBvdXRwdXRzIG9mIHRoZSBjb250cm9sbGVyLgpAQCAtMTMsNiArMTcsOCBAQAogICBkZWZhdWx0IG91dHB1dCBjbG9jayBuYW1lCiAtIHJvY2tjaGlwLHN5c3RlbS1wb3dlci1jb250cm9sbGVyOiBUZWxsaW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgcG1pYyBpcyBjb250cm9sbGluZwogICB0aGUgc3lzdGVtIHBvd2VyLgorCitPcHRpb25hbCBSSzgwOCBwcm9wZXJ0aWVzOgogLSB2Y2MxLXN1cHBseTogIFRoZSBpbnB1dCBzdXBwbHkgZm9yIERDRENfUkVHMQogLSB2Y2MyLXN1cHBseTogIFRoZSBpbnB1dCBzdXBwbHkgZm9yIERDRENfUkVHMgogLSB2Y2MzLXN1cHBseTogIFRoZSBpbnB1dCBzdXBwbHkgZm9yIERDRENfUkVHMwpAQCAtMjksNyArMzUsMjAgQEAKICAgdGhlIGdwaW8gY29udHJvbGxlci4gSWYgRFZTIEdQSU9zIGFyZW4ndCBwcmVzZW50LCB2b2x0YWdlIGNoYW5nZXMgd2lsbCBoYXBwZW4KICAgdmVyeSBxdWlja2x5IHdpdGggbm8gc2xvdyByYW1wIHRpbWUuCiAKLVJlZ3VsYXRvcnM6IEFsbCB0aGUgcmVndWxhdG9ycyBvZiBSSzgwOCB0byBiZSBpbnN0YW50aWF0ZWQgc2hhbGwgYmUKK09wdGlvbmFsIFJLODE4IHByb3BlcnRpZXM6CistIHZjYzEtc3VwcGx5OiAgVGhlIGlucHV0IHN1cHBseSBmb3IgRENEQ19SRUcxCistIHZjYzItc3VwcGx5OiAgVGhlIGlucHV0IHN1cHBseSBmb3IgRENEQ19SRUcyCistIHZjYzMtc3VwcGx5OiAgVGhlIGlucHV0IHN1cHBseSBmb3IgRENEQ19SRUczCistIHZjYzQtc3VwcGx5OiAgVGhlIGlucHV0IHN1cHBseSBmb3IgRENEQ19SRUc0CistIGJvb3N0LXN1cHBseTogVGhlIGlucHV0IHN1cHBseSBmb3IgRENEQ19CT09TVAorLSB2Y2M2LXN1cHBseTogIFRoZSBpbnB1dCBzdXBwbHkgZm9yIExET19SRUcxIGFuZCBMRE9fUkVHMgorLSB2Y2M3LXN1cHBseTogIFRoZSBpbnB1dCBzdXBwbHkgZm9yIExET19SRUczLCBMRE9fUkVHNSBhbmQgTERPX1JFRzcKKy0gdmNjOC1zdXBwbHk6ICBUaGUgaW5wdXQgc3VwcGx5IGZvciBMRE9fUkVHNCwgTERPX1JFRzYgYW5kIExET19SRUc4CistIHZjYzktc3VwcGx5OiAgVGhlIGlucHV0IHN1cHBseSBmb3IgTERPX1JFRzkgYW5kIFNXSVRDSF9SRUcKKy0gaF81di1zdXBwbHk6ICBUaGUgaW5wdXQgc3VwcGx5IGZvciBIRE1JX1NXSVRDSAorLSB1c2Itc3VwcGx5OiAgIFRoZSBpbnB1dCBzdXBwbHkgZm9yIE9UR19TV0lUQ0gKKworUmVndWxhdG9yczogQWxsIHRoZSByZWd1bGF0b3JzIG9mIFJLOFhYIHRvIGJlIGluc3RhbnRpYXRlZCBzaGFsbCBiZQogbGlzdGVkIGluIGEgY2hpbGQgbm9kZSBuYW1lZCAncmVndWxhdG9ycycuIEVhY2ggcmVndWxhdG9yIGlzIHJlcHJlc2VudGVkCiBieSBhIGNoaWxkIG5vZGUgb2YgdGhlICdyZWd1bGF0b3JzJyBub2RlLgogCkBAIC00OCw2ICs2NywxOCBAQAogCS0gU1dJVENIX1JFR24KIAkJLSB2YWxpZCB2YWx1ZXMgZm9yIG4gYXJlIDEgdG8gMgogCitGb2xsb3dpbmcgcmVndWxhdG9ycyBvZiB0aGUgUks4MTggUE1JQyBibG9jayBhcmUgc3VwcG9ydGVkLiBOb3RlIHRoYXQKK3RoZSAnbicgaW4gcmVndWxhdG9yIG5hbWUsIGFzIGluIERDRENfUkVHbiBvciBMRE9uLCByZXByZXNlbnRzIHRoZSBEQ0RDIG9yIExETworbnVtYmVyIGFzIGRlc2NyaWJlZCBpbiBSSzgxOCBkYXRhc2hlZXQuCisKKwktIERDRENfUkVHbgorCQktIHZhbGlkIHZhbHVlcyBmb3IgbiBhcmUgMSB0byA0LgorCS0gTERPX1JFR24KKwkJLSB2YWxpZCB2YWx1ZXMgZm9yIG4gYXJlIDEgdG8gOS4KKwktIFNXSVRDSF9SRUcKKwktIEhETUlfU1dJVENICisJLSBPVEdfU1dJVENICisKIFN0YW5kYXJkIHJlZ3VsYXRvciBiaW5kaW5ncyBhcmUgdXNlZCBpbnNpZGUgcmVndWxhdG9yIHN1Ym5vZGVzLiBDaGVjawogICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKIGZvciBtb3JlIGRldGFpbHMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvc2Ftc3VuZyxleHlub3M1NDMzLWxwYXNzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvc2Ftc3VuZyxleHlub3M1NDMzLWxwYXNzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTEwZTExCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zYW1zdW5nLGV4eW5vczU0MzMtbHBhc3MudHh0CkBAIC0wLDAgKzEsNzAgQEAKK1NhbXN1bmcgRXh5bm9zIFNvQyBMb3cgUG93ZXIgQXVkaW8gU3Vic3lzdGVtIChMUEFTUykKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZQkJOiAic2Ftc3VuZyxleHlub3M1NDMzLWxwYXNzIgorIC0gcmVnCQkJOiBzaG91bGQgY29udGFpbiB0aGUgTFBBU1MgdG9wIFNGUiByZWdpb24gbG9jYXRpb24KKwkJCSAgYW5kIHNpemUKKyAtIHNhbXN1bmcscG11LXN5c2Nvbgk6IHRoZSBwaGFuZGxlIHRvIHRoZSBQb3dlciBNYW5hZ2VtZW50IFVuaXQgbm9kZQorIC0gI2FkZHJlc3MtY2VsbHMJOiBzaG91bGQgYmUgMQorIC0gI3NpemUtY2VsbHMJCTogc2hvdWxkIGJlIDEKKyAtIHJhbmdlcwkJOiBtdXN0IGJlIHByZXNlbnQKKworRWFjaCBJUCBibG9jayBvZiB0aGUgTG93IFBvd2VyIEF1ZGlvIFN1YnN5c3RlbSBzaG91bGQgYmUgc3BlY2lmaWVkIGFzCithbiBvcHRpb25hbCBzdWItbm9kZS4gRm9yICJzYW1zdW5nLGV4eW5vczU0MzMtbHBhc3MiIGNvbXBhdGlibGUgdGhpcyBpbmNsdWRlczoKK1VBUlQsIFNMSU1CVVMsIFBDTSwgSTJTLCBETUFDLCBUaW1lcnMgMC4uLjQsIFZJQywgV0RUIDAuLi4xIGRldmljZXMuCisKK0JpbmRpbmdzIG9mIHRoZSBzdWItbm9kZXMgYXJlIGRlc2NyaWJlZCBpbjoKKyAgLi4vc2VyaWFsL3NhbXN1bmdfdWFydC50eHQKKyAgLi4vc291bmQvc2Ftc3VuZy1pMnMudHh0CisgIC4uL2RtYS9hcm0tcGwzMzAudHh0CisKKworRXhhbXBsZToKKworYXVkaW8tc3Vic3lzdGVtIHsKKwljb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTQzMy1scGFzcyI7CisJcmVnID0gPDB4MTE0MDAwMDAgMHgxMDA+LCA8MHgxMTUwMDAwMCAweDA4PjsKKwlzYW1zdW5nLHBtdS1zeXNjb24gPSA8JnBtdV9zeXN0ZW1fY29udHJvbGxlcj47CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJcmFuZ2VzOworCisJYWRtYTogYWRtYUAxMTQyMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHBsMzMwIiwgImFybSxwcmltZWNlbGwiOworCQlyZWcgPSA8MHgxMTQyMDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDAgNzMgMD47CisJCWNsb2NrcyA9IDwmY211X2F1ZCBDTEtfQUNMS19ETUFDPjsKKwkJY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiOworCQkjZG1hLWNlbGxzID0gPDE+OworCQkjZG1hLWNoYW5uZWxzID0gPDg+OworCQkjZG1hLXJlcXVlc3RzID0gPDMyPjsKKwl9OworCisJaTJzMDogaTJzMEAxMTQ0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M3LWkycyI7CisJCXJlZyA9IDwweDExNDQwMDAwIDB4MTAwPjsKKwkJZG1hcyA9IDwmYWRtYSAwICZhZG1hIDI+OworCQlkbWEtbmFtZXMgPSAidHgiLCAicngiOworCQlpbnRlcnJ1cHRzID0gPDAgNzAgMD47CisJCWNsb2NrcyA9IDwmY211X2F1ZCBDTEtfUENMS19BVURfSTJTPiwKKwkJCSA8JmNtdV9hdWQgQ0xLX1NDTEtfQVVEX0kyUz4sCisJCQkgPCZjbXVfYXVkIENMS19TQ0xLX0kyU19CQ0xLPjsKKwkJY2xvY2stbmFtZXMgPSAiaWlzIiwgImkyc19vcGNsazAiLCAiaTJzX29wY2xrMSI7CisJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCXBpbmN0cmwtMCA9IDwmaTJzMF9idXM+OworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCX07CisKKwlzZXJpYWxfMzogc2VyaWFsQDExNDYwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczU0MzMtdWFydCI7CisJCXJlZyA9IDwweDExNDYwMDAwIDB4MTAwPjsKKwkJaW50ZXJydXB0cyA9IDwwIDY3IDA+OworCQljbG9ja3MgPSA8JmNtdV9hdWQgQ0xLX1BDTEtfQVVEX1VBUlQ+LAorCQkJIDwmY211X2F1ZCBDTEtfU0NMS19BVURfVUFSVD47CisJCWNsb2NrLW5hbWVzID0gInVhcnQiLCAiY2xrX3VhcnRfYmF1ZDAiOworCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCQlwaW5jdHJsLTAgPSA8JnVhcnRfYXVkX2J1cz47CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKKyB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zdG1wZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3N0bXBlLnR4dAppbmRleCAzZmI2OGJmLi5mOTA2NWE1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3N0bXBlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3N0bXBlLnR4dApAQCAtNCw3ICs0LDcgQEAKIGtleXBhZCwgdG91Y2hzY3JlZW4sIGFkYywgcHdtLCByb3RhdG9yLgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZSAgICAgICAgICAgICAgICAgICA6ICJzdCxzdG1wZVs2MTB8ODAxfDgxMXwxNjAxfDI0MDF8MjQwM10iCisgLSBjb21wYXRpYmxlICAgICAgICAgICAgICAgICAgIDogInN0LHN0bXBlWzYxMHw4MDF8ODExfDE2MDB8MTYwMXwyNDAxfDI0MDNdIgogIC0gcmVnICAgICAgICAgICAgICAgICAgICAgICAgICA6IEkyQy9TUEkgYWRkcmVzcyBvZiB0aGUgZGV2aWNlCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3R3bDYwNDAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC90d2w2MDQwLnR4dAppbmRleCBlNmFmZGZhMy4uOWE5OGVlNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC90d2w2MDQwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3R3bDYwNDAudHh0CkBAIC0xMiw2ICsxMiw3IEBACiAtIGludGVycnVwdC1wYXJlbnQ6IFRoZSBwYXJlbnQgaW50ZXJydXB0IGNvbnRyb2xsZXIKIC0gZ3Bpby1jb250cm9sbGVyOgogLSAjZ3Bpby1jZWxscyA9IDwxPjogdHdsNjA0MCBwcm92aWRlcyBHUE8gbGluZXMuCistICNjbG9jay1jZWxscyA9IDwwPjsgdHdsNjA0MCBpcyBhIHByb3ZpZGVyIG9mIHBkbWNsayB3aGljaCBpcyB1c2VkIGJ5IE1jUERNCiAtIHR3bDYwNDAsYXVkcHdyb24tZ3BpbzogUG93ZXIgb24gR1BJTyBsaW5lIGZvciB0aGUgdHdsNjA0MAogCiAtIHZpby1zdXBwbHk6IFJlZ3VsYXRvciBmb3IgdGhlIHR3bDYwNDAgVklPIHN1cHBseQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9hcmFzYW4sc2RoY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9hcmFzYW4sc2RoY2kudHh0CmluZGV4IDM0MDRhZmEuLjQ5ZGY2MzAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYXJhc2FuLHNkaGNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2FyYXNhbixzZGhjaS50eHQKQEAgLTM2LDYgKzM2LDkgQEAKICAgLSAjY2xvY2stY2VsbHM6IElmIHNwZWNpZmllZCB0aGlzIHNob3VsZCBiZSB0aGUgdmFsdWUgPDA+LiAgV2l0aCB0aGlzIHByb3BlcnR5CiAgICAgaW4gcGxhY2Ugd2Ugd2lsbCBleHBvcnQgYSBjbG9jayByZXByZXNlbnRpbmcgdGhlIENhcmQgQ2xvY2suICBUaGlzIGNsb2NrCiAgICAgaXMgZXhwZWN0ZWQgdG8gYmUgY29uc3VtZWQgYnkgb3VyIFBIWS4gIFlvdSBtdXN0IGFsc28gc3BlY2lmeQorICAtIHhsbngsZmFpbHMtd2l0aG91dC10ZXN0LWNkOiB3aGVuIHByZXNlbnQsIHRoZSBjb250cm9sbGVyIGRvZXNuJ3Qgd29yayB3aGVuCisgICAgdGhlIENEIGxpbmUgaXMgbm90IGNvbm5lY3RlZCBwcm9wZXJseSwgYW5kIHRoZSBsaW5lIGlzIG5vdCBjb25uZWN0ZWQKKyAgICBwcm9wZXJseS4gVGVzdCBtb2RlIGNhbiBiZSB1c2VkIHRvIGZvcmNlIHRoZSBjb250cm9sbGVyIHRvIGZ1bmN0aW9uLgogCiBFeGFtcGxlOgogCXNkaGNpQGUwMTAwMDAwIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYnJjbSxiY203NDI1LXNkaGNpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYnJjbSxiY203NDI1LXNkaGNpLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI4NDcxNy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2JyY20sYmNtNzQyNS1zZGhjaS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0qIEJST0FEQ09NIEJSQ01TVEIvQk1JUFMgU0RIQ0kgQ29udHJvbGxlcgotCi1UaGlzIGZpbGUgZG9jdW1lbnRzIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGNvcmUgcHJvcGVydGllcyBpbiBtbWMudHh0Ci1hbmQgdGhlIHByb3BlcnRpZXMgdXNlZCBieSB0aGUgc2RoY2ktYnJjbXN0YiBkcml2ZXIuCi0KLU5PVEU6IFRoZSBkcml2ZXIgZGlzYWJsZXMgYWxsIFVIUyBzcGVlZCBtb2RlcyBieSBkZWZhdWx0IGFuZCBkZXBlbmRzCi1vbiBEZXZpY2UgVHJlZSBwcm9wZXJ0aWVzIHRvIGVuYWJsZSB0aGVtIGZvciBTb0MvQm9hcmQgY29tYmluYXRpb25zCi10aGF0IHN1cHBvcnQgdGhlbS4KLQotUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogImJyY20sYmNtNzQyNS1zZGhjaSIKLQotUmVmZXIgdG8gY2xvY2tzL2Nsb2NrLWJpbmRpbmdzLnR4dCBmb3IgZ2VuZXJpYyBjbG9jayBjb25zdW1lciBwcm9wZXJ0aWVzLgotCi1FeGFtcGxlOgotCi0Jc2RoY2lAZjAzZTAxMDAgewotCQljb21wYXRpYmxlID0gImJyY20sYmNtNzQyNS1zZGhjaSI7Ci0JCXJlZyA9IDwweGYwM2UwMDAwIDB4MTAwPjsKLQkJaW50ZXJydXB0cyA9IDwweDAgMHgyNiAweDA+OwotCQlzZGhjaSxhdXRvLWNtZDEyOwotCQljbG9ja3MgPSA8JnN3X3NkaW8+OwotCQlzZC11aHMtc2RyNTA7Ci0JCXNkLXVocy1kZHI1MDsKLQl9OwotCi0Jc2RoY2lAZjAzZTAzMDAgewotCQlub24tcmVtb3ZhYmxlOwotCQlidXMtd2lkdGggPSA8MHg4PjsKLQkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTc0MjUtc2RoY2kiOwotCQlyZWcgPSA8MHhmMDNlMDIwMCAweDEwMD47Ci0JCWludGVycnVwdHMgPSA8MHgwIDB4MjcgMHgwPjsKLQkJc2RoY2ksYXV0by1jbWQxMjsKLQkJY2xvY2tzID0gPHN3X3NkaW8+OwotCQltbWMtaHMyMDAtMV84djsKLQl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9icmNtLHNkaGNpLWJyY21zdGIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9icmNtLHNkaGNpLWJyY21zdGIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczM2I2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2JyY20sc2RoY2ktYnJjbXN0Yi50eHQKQEAgLTAsMCArMSwzOCBAQAorKiBCUk9BRENPTSBCUkNNU1RCL0JNSVBTIFNESENJIENvbnRyb2xsZXIKKworVGhpcyBmaWxlIGRvY3VtZW50cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBjb3JlIHByb3BlcnRpZXMgaW4gbW1jLnR4dAorYW5kIHRoZSBwcm9wZXJ0aWVzIHVzZWQgYnkgdGhlIHNkaGNpLWJyY21zdGIgZHJpdmVyLgorCitOT1RFOiBUaGUgZHJpdmVyIGRpc2FibGVzIGFsbCBVSFMgc3BlZWQgbW9kZXMgYnkgZGVmYXVsdCBhbmQgZGVwZW5kcworb24gRGV2aWNlIFRyZWUgcHJvcGVydGllcyB0byBlbmFibGUgdGhlbSBmb3IgU29DL0JvYXJkIGNvbWJpbmF0aW9ucwordGhhdCBzdXBwb3J0IHRoZW0uCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IHNob3VsZCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZworICAtICJicmNtLGJjbTc0MjUtc2RoY2kiCisgIC0gImJyY20sYmNtNzQ0NS1zZGhjaSIKKworUmVmZXIgdG8gY2xvY2tzL2Nsb2NrLWJpbmRpbmdzLnR4dCBmb3IgZ2VuZXJpYyBjbG9jayBjb25zdW1lciBwcm9wZXJ0aWVzLgorCitFeGFtcGxlOgorCisJc2RoY2lAZjAzZTAxMDAgeworCQljb21wYXRpYmxlID0gImJyY20sYmNtNzQyNS1zZGhjaSI7CisJCXJlZyA9IDwweGYwM2UwMDAwIDB4MTAwPjsKKwkJaW50ZXJydXB0cyA9IDwweDAgMHgyNiAweDA+OworCQlzZGhjaSxhdXRvLWNtZDEyOworCQljbG9ja3MgPSA8JnN3X3NkaW8+OworCQlzZC11aHMtc2RyNTA7CisJCXNkLXVocy1kZHI1MDsKKwl9OworCisJc2RoY2lAZjAzZTAzMDAgeworCQlub24tcmVtb3ZhYmxlOworCQlidXMtd2lkdGggPSA8MHg4PjsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGJjbTc0MjUtc2RoY2kiOworCQlyZWcgPSA8MHhmMDNlMDIwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8MHgwIDB4MjcgMHgwPjsKKwkJc2RoY2ksYXV0by1jbWQxMjsKKwkJY2xvY2tzID0gPHN3X3NkaW8+OworCQltbWMtaHMyMDAtMV84djsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMtcHdyc2VxLXNpbXBsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL21tYy1wd3JzZXEtc2ltcGxlLnR4dAppbmRleCBjZTBlNzY3Li5lMjU0MzY4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL21tYy1wd3JzZXEtc2ltcGxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL21tYy1wd3JzZXEtc2ltcGxlLnR4dApAQCAtMTYsNiArMTYsOCBAQAogICBTZWUgLi4vY2xvY2tzL2Nsb2NrLWJpbmRpbmdzLnR4dCBmb3IgZGV0YWlscy4KIC0gY2xvY2stbmFtZXMgOiBNdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBlbnRyeToKICAgImV4dF9jbG9jayIgKEV4dGVybmFsIGNsb2NrIHByb3ZpZGVkIHRvIHRoZSBjYXJkKS4KKy0gcG9zdC1wb3dlci1vbi1kZWxheS1tcyA6IERlbGF5IGluIG1zIGFmdGVyIHBvd2VyaW5nIHRoZSBjYXJkIGFuZAorCWRlLWFzc2VydGluZyB0aGUgcmVzZXQtZ3Bpb3MgKGlmIGFueSkKIAogRXhhbXBsZToKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMudHh0CmluZGV4IDIyZDFlMWYuLjhhMzc3ODIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL21tYy50eHQKQEAgLTc1LDYgKzc1LDE3IEBACiAtIHdha2V1cC1zb3VyY2U6IEVuYWJsZXMgd2FrZSB1cCBvZiBob3N0IHN5c3RlbSBvbiBTRElPIElSUSBhc3NlcnRpb24KIAkJIChMZWdhY3kgcHJvcGVydHkgc3VwcG9ydGVkOiAiZW5hYmxlLXNkaW8td2FrZXVwIikKIAorTU1DIHBvd2VyCistLS0tLS0tLS0KKworQ29udHJvbGxlcnMgbWF5IGltcGxlbWVudCBwb3dlciBjb250cm9sIGZyb20gYm90aCB0aGUgY29ubmVjdGVkIGNhcmRzIGFuZAordGhlIElPIHNpZ25hbGluZyAoZm9yIGV4YW1wbGUgdG8gY2hhbmdlIHRvIGhpZ2gtc3BlZWQgMS44ViBzaWduYWxsaW5nKS4gSWYKK3RoZSBzeXN0ZW0gc3VwcG9ydHMgdGhpcywgdGhlbiB0aGUgZm9sbG93aW5nIHR3byBwcm9wZXJ0aWVzIHNob3VsZCBwb2ludAordG8gdmFsaWQgcmVndWxhdG9yIG5vZGVzOgorCistIHZxbW1jLXN1cHBseTogc3VwcGx5IG5vZGUgZm9yIElPIGxpbmUgcG93ZXIKKy0gdm1tYy1zdXBwbHk6IHN1cHBseSBub2RlIGZvciBjYXJkJ3MgcG93ZXIKKwogCiBNTUMgcG93ZXIgc2VxdWVuY2VzOgogLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEwMiwxMSArMTEzLDEzIEBACiAtICNzaXplLWNlbGxzOiBzaG91bGQgYmUgemVyby4KIAogUmVxdWlyZWQgZnVuY3Rpb24gc3Vibm9kZSBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlOiBuYW1lIG9mIFNESU8gZnVuY3Rpb24gZm9sbG93aW5nIGdlbmVyaWMgbmFtZXMgcmVjb21tZW5kZWQgcHJhY3RpY2UKIC0gcmVnOiBNdXN0IGNvbnRhaW4gdGhlIFNESU8gZnVuY3Rpb24gbnVtYmVyIG9mIHRoZSBmdW5jdGlvbiB0aGlzIHN1Ym5vZGUKICAgICAgICBkZXNjcmliZXMuIEEgdmFsdWUgb2YgMCBkZW5vdGVzIHRoZSBtZW1vcnkgU0QgZnVuY3Rpb24sIHZhbHVlcyBmcm9tCiAgICAgICAgMSB0byA3IGRlbm90ZSB0aGUgU0RJTyBmdW5jdGlvbnMuCiAKK09wdGlvbmFsIGZ1bmN0aW9uIHN1Ym5vZGUgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogbmFtZSBvZiBTRElPIGZ1bmN0aW9uIGZvbGxvd2luZyBnZW5lcmljIG5hbWVzIHJlY29tbWVuZGVkIHByYWN0aWNlCisKIAogRXhhbXBsZXMKIC0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3NkaGNpLXN0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc2RoY2ktc3QudHh0CmluZGV4IDg4ZmFhOTEuLjNjZDRjNDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc2RoY2ktc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc2RoY2ktc3QudHh0CkBAIC0xMCw3ICsxMCw3IEBACiAJCQlzdWJzeXN0ZW0gKG1tY3NzKSBpbnNpZGUgdGhlIEZsYXNoU1MgKGF2YWlsYWJsZSBpbiBTVGlINDA3IFNvQwogCQkJZmFtaWx5KS4KIAotLSBjbG9jay1uYW1lczoJCVNob3VsZCBiZSAibW1jIi4KKy0gY2xvY2stbmFtZXM6CQlTaG91bGQgYmUgIm1tYyIgYW5kICJpY24iLiAgKE5COiBUaGUgbGF0dGVyIGlzIG5vdCBjb21wdWxzb3J5KQogCQkJU2VlOiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVzb3VyY2UtbmFtZXMudHh0CiAtIGNsb2NrczoJCVBoYW5kbGUgdG8gdGhlIGNsb2NrLgogCQkJU2VlOiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3N1bnhpLW1tYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3N1bnhpLW1tYy50eHQKaW5kZXggNGJmNDFkOC4uNTVjZGQ4MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9zdW54aS1tbWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc3VueGktbW1jLnR4dApAQCAtOCw3ICs4LDEyIEBACiBBYnNvbHV0ZSBtYXhpbXVtIHRyYW5zZmVyIHJhdGUgaXMgMjAwTUIvcwogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZSA6ICJhbGx3aW5uZXIsc3VuNGktYTEwLW1tYyIgb3IgImFsbHdpbm5lcixzdW41aS1hMTMtbW1jIgorIC0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBvbmUgb2Y6CisgICAqICJhbGx3aW5uZXIsc3VuNGktYTEwLW1tYyIKKyAgICogImFsbHdpbm5lcixzdW41aS1hMTMtbW1jIgorICAgKiAiYWxsd2lubmVyLHN1bjdpLWEyMC1tbWMiCisgICAqICJhbGx3aW5uZXIsc3VuOWktYTgwLW1tYyIKKyAgICogImFsbHdpbm5lcixzdW41MGktYTY0LW1tYyIKICAtIHJlZyA6IG1tYyBjb250cm9sbGVyIGJhc2UgcmVnaXN0ZXJzCiAgLSBjbG9ja3MgOiBhIGxpc3Qgd2l0aCA0IHBoYW5kbGUgKyBjbG9jayBzcGVjaWZpZXIgcGFpcnMKICAtIGNsb2NrLW5hbWVzIDogbXVzdCBjb250YWluICJhaGIiLCAibW1jIiwgIm91dHB1dCIgYW5kICJzYW1wbGUiCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3N5bm9wc3lzLWR3LW1zaGMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9zeW5vcHN5cy1kdy1tc2hjLnR4dAppbmRleCA4NjM2ZjVhLi40ZTAwZTg1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3N5bm9wc3lzLWR3LW1zaGMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc3lub3BzeXMtZHctbXNoYy50eHQKQEAgLTM5LDYgKzM5LDEwIEBACiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAKKyogcmVzZXRzOiBwaGFuZGxlICsgcmVzZXQgc3BlY2lmaWVyIHBhaXIsIGludGVuZGVkIHRvIHJlcHJlc2VudCBoYXJkd2FyZQorICByZXNldCBzaWduYWwgcHJlc2VudCBpbnRlcm5hbGx5IGluIHNvbWUgaG9zdCBjb250cm9sbGVyIElDIGRlc2lnbnMuCisgIFNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVzZXQvcmVzZXQudHh0IGZvciBkZXRhaWxzLgorCiAqIGNsb2NrczogZnJvbSBjb21tb24gY2xvY2sgYmluZGluZzogaGFuZGxlIHRvIGJpdSBhbmQgY2l1IGNsb2NrcyBmb3IgdGhlCiAgIGJ1cyBpbnRlcmZhY2UgdW5pdCBjbG9jayBhbmQgdGhlIGNhcmQgaW50ZXJmYWNlIHVuaXQgY2xvY2suCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvdG1pb19tbWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy90bWlvX21tYy50eHQKaW5kZXggMGY2MTBkNC4uMTNkZjljMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy90bWlvX21tYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy90bWlvX21tYy50eHQKQEAgLTIzLDYgKzIzLDcgQEAKIAkJInJlbmVzYXMsc2RoaS1yOGE3NzkzIiAtIFNESEkgSVAgb24gUjhBNzc5MyBTb0MKIAkJInJlbmVzYXMsc2RoaS1yOGE3Nzk0IiAtIFNESEkgSVAgb24gUjhBNzc5NCBTb0MKIAkJInJlbmVzYXMsc2RoaS1yOGE3Nzk1IiAtIFNESEkgSVAgb24gUjhBNzc5NSBTb0MKKwkJInJlbmVzYXMsc2RoaS1yOGE3Nzk2IiAtIFNESEkgSVAgb24gUjhBNzc5NiBTb0MKIAogT3B0aW9uYWwgcHJvcGVydGllczoKIC0gdG9zaGliYSxtbWMtd3Jwcm90ZWN0LWRpc2FibGU6IHdyaXRlLXByb3RlY3QgZGV0ZWN0aW9uIGlzIHVuYXZhaWxhYmxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FwbS14Z2VuZS1lbmV0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYXBtLXhnZW5lLWVuZXQudHh0CmluZGV4IGU0MWIyZDUuLmY1OTFhYjcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYXBtLXhnZW5lLWVuZXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYXBtLXhnZW5lLWVuZXQudHh0CkBAIC00Nyw2ICs0Nyw5IEBACiAJICAgIFZhbGlkIHZhbHVlcyBhcmUgYmV0d2VlbiAwIHRvIDcsIHRoYXQgbWFwcyB0bwogCSAgICAyNzMsIDU4OSwgODk5LCAxMjIyLCAxNDgwLCAxODA2LCAyMTQ3LCAyNDY0IHBzCiAJICAgIERlZmF1bHQgdmFsdWUgaXMgMiwgd2hpY2ggY29ycmVzcG9uZHMgdG8gODk5IHBzCistIHJ4bG9zLWdwaW9zOiBJbnB1dCBncGlvIGZyb20gU0ZQKyBtb2R1bGUgdG8gaW5kaWNhdGUgYXZhaWxhYmlsaXR5IG9mCisJICAgICAgIGluY29taW5nIHNpZ25hbC4KKwogCiBFeGFtcGxlOgogCW1lbmV0Y2xrOiBtZW5ldGNsayB7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2JyY20sYmNtNzQ0NS1zd2l0Y2gtdjQuMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2JyY20sYmNtNzQ0NS1zd2l0Y2gtdjQuMC50eHQKaW5kZXggMzBkNDg3NS4uZmI0MDg5MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9icmNtLGJjbTc0NDUtc3dpdGNoLXY0LjAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYnJjbSxiY203NDQ1LXN3aXRjaC12NC4wLnR4dApAQCAtNiw5ICs2LDEzIEBACiAtIHJlZzogYWRkcmVzc2VzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldHMgZm9yIHRoZSBkZXZpY2UsIG11c3QgYmUgNgogICBwYWlycyBvZiByZWdpc3RlciBhZGRyZXNzZXMgYW5kIGxlbmd0aHMKIC0gaW50ZXJydXB0czogaW50ZXJydXB0cyBmb3IgdGhlIGRldmljZXMsIG11c3QgYmUgdHdvIGludGVycnVwdHMKKy0gI2FkZHJlc3MtY2VsbHM6IG11c3QgYmUgMSwgc2VlIGRzYS9kc2EudHh0CistICNzaXplLWNlbGxzOiBtdXN0IGJlIDAsIHNlZSBkc2EvZHNhLnR4dAorCitEZXByZWNhdGVkIGJpbmRpbmcgcmVxdWlyZWQgcHJvcGVydGllczoKKwogLSBkc2EsbWlpLWJ1czogcGhhbmRsZSB0byB0aGUgTURJTyBidXMgY29udHJvbGxlciwgc2VlIGRzYS9kc2EudHh0CiAtIGRzYSxldGhlcm5ldDogcGhhbmRsZSB0byB0aGUgQ1BVIG5ldHdvcmsgaW50ZXJmYWNlIGNvbnRyb2xsZXIsIHNlZSBkc2EvZHNhLnR4dAotLSAjc2l6ZS1jZWxsczogbXVzdCBiZSAwCiAtICNhZGRyZXNzLWNlbGxzOiBtdXN0IGJlIDIsIHNlZSBkc2EvZHNhLnR4dAogCiBTdWJub2RlczoKQEAgLTQ4LDYgKzUyLDQ1IEBACiAJZXRoZXJuZXRfc3dpdGNoQDAgewogCQljb21wYXRpYmxlID0gImJyY20sYmNtNzQ0NS1zd2l0Y2gtdjQuMCI7CiAJCSNzaXplLWNlbGxzID0gPDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4MCAweDQwMDAwCisJCQkweDQwMDAwIDB4MTEwCisJCQkweDQwMzQwIDB4MzAKKwkJCTB4NDAzODAgMHgzMAorCQkJMHg0MDQwMCAweDM0CisJCQkweDQwNjAwIDB4MjA4PjsKKwkJcmVnLW5hbWVzID0gImNvcmUiLCAicmVnIiwgaW50cmwyXzAiLCAiaW50cmwyXzEiLAorCQkJICAgICJmY2IsICJhY2IiOworCQlpbnRlcnJ1cHRzID0gPDAgMHgxOCAwCisJCQkJMCAweDE5IDA+OworCQlicmNtLG51bS1ncGh5ID0gPDE+OworCQlicmNtLG51bS1yZ21paS1wb3J0cyA9IDwyPjsKKwkJYnJjbSxmY2ItcGF1c2Utb3ZlcnJpZGU7CisJCWJyY20sYWNiLXBhY2tldHMtaW5mbGlnaHQ7CisKKwkJcG9ydHMgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQkJcG9ydEAwIHsKKwkJCQlsYWJlbCA9ICJncGh5IjsKKwkJCQlyZWcgPSA8MD47CisJCQl9OworCQl9OworCX07Cit9OworCitFeGFtcGxlIHVzaW5nIHRoZSBvbGQgRFNBIERldmljZVRyZWUgYmluZGluZzoKKworc3dpdGNoX3RvcEBmMGIwMDAwMCB7CisJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwlyYW5nZXMgPSA8MCAweGYwYjAwMDAwIDB4NDA4MDQ+OworCisJZXRoZXJuZXRfc3dpdGNoQDAgeworCQljb21wYXRpYmxlID0gImJyY20sYmNtNzQ0NS1zd2l0Y2gtdjQuMCI7CisJCSNzaXplLWNlbGxzID0gPDA+OwogCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkJcmVnID0gPDB4MCAweDQwMDAwCiAJCQkweDQwMDAwIDB4MTEwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2RzYS9xY2E4ay50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2RzYS9xY2E4ay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2N2VlNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZHNhL3FjYThrLnR4dApAQCAtMCwwICsxLDg5IEBACisqIFF1YWxjb21tIEF0aGVyb3MgUUNBOHh4eCBzd2l0Y2ggZmFtaWx5CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJxY2EscWNhODMzNyIKKy0gI3NpemUtY2VsbHM6IG11c3QgYmUgMAorLSAjYWRkcmVzcy1jZWxsczogbXVzdCBiZSAxCisKK1N1Ym5vZGVzOgorCitUaGUgaW50ZWdyYXRlZCBzd2l0Y2ggc3Vibm9kZSBzaG91bGQgYmUgc3BlY2lmaWVkIGFjY29yZGluZyB0byB0aGUgYmluZGluZworZGVzY3JpYmVkIGluIGRzYS9kc2EudHh0LiBBcyB0aGUgUUNBOEsgc3dpdGNoZXMgZG8gbm90IGhhdmUgYSBOOk4gbWFwcGluZyBvZgorcG9ydCBhbmQgUEhZIGlkLCBlYWNoIHN1Ym5vZGUgZGVzY3JpYmluZyBhIHBvcnQgbmVlZHMgdG8gaGF2ZSBhIHZhbGlkIHBoYW5kbGUKK3JlZmVyZW5jaW5nIHRoZSBpbnRlcm5hbCBQSFkgY29ubmVjdGVkIHRvIGl0LiBUaGUgQ1BVIHBvcnQgb2YgdGhpcyBzd2l0Y2ggaXMKK2Fsd2F5cyBwb3J0IDAuCisKK0V4YW1wbGU6CisKKworCSZtZGlvMCB7CisJCXBoeV9wb3J0MTogcGh5QDAgeworCQkJcmVnID0gPDA+OworCQl9OworCisJCXBoeV9wb3J0MjogcGh5QDEgeworCQkJcmVnID0gPDE+OworCQl9OworCisJCXBoeV9wb3J0MzogcGh5QDIgeworCQkJcmVnID0gPDI+OworCQl9OworCisJCXBoeV9wb3J0NDogcGh5QDMgeworCQkJcmVnID0gPDM+OworCQl9OworCisJCXBoeV9wb3J0NTogcGh5QDQgeworCQkJcmVnID0gPDQ+OworCQl9OworCisJCXN3aXRjaDBAMCB7CisJCQljb21wYXRpYmxlID0gInFjYSxxY2E4MzM3IjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJCXJlZyA9IDwwPjsKKworCQkJcG9ydHMgeworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCXBvcnRAMCB7CisJCQkJCXJlZyA9IDwwPjsKKwkJCQkJbGFiZWwgPSAiY3B1IjsKKwkJCQkJZXRoZXJuZXQgPSA8JmdtYWMxPjsKKwkJCQkJcGh5LW1vZGUgPSAicmdtaWkiOworCQkJCX07CisKKwkJCQlwb3J0QDEgeworCQkJCQlyZWcgPSA8MT47CisJCQkJCWxhYmVsID0gImxhbjEiOworCQkJCQlwaHktaGFuZGxlID0gPCZwaHlfcG9ydDE+OworCQkJCX07CisKKwkJCQlwb3J0QDIgeworCQkJCQlyZWcgPSA8Mj47CisJCQkJCWxhYmVsID0gImxhbjIiOworCQkJCQlwaHktaGFuZGxlID0gPCZwaHlfcG9ydDI+OworCQkJCX07CisKKwkJCQlwb3J0QDMgeworCQkJCQlyZWcgPSA8Mz47CisJCQkJCWxhYmVsID0gImxhbjMiOworCQkJCQlwaHktaGFuZGxlID0gPCZwaHlfcG9ydDM+OworCQkJCX07CisKKwkJCQlwb3J0QDQgeworCQkJCQlyZWcgPSA8ND47CisJCQkJCWxhYmVsID0gImxhbjQiOworCQkJCQlwaHktaGFuZGxlID0gPCZwaHlfcG9ydDQ+OworCQkJCX07CisKKwkJCQlwb3J0QDUgeworCQkJCQlyZWcgPSA8NT47CisJCQkJCWxhYmVsID0gIndhbiI7CisJCQkJCXBoeS1oYW5kbGUgPSA8JnBoeV9wb3J0NT47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZXRoZXJuZXQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9ldGhlcm5ldC50eHQKaW5kZXggNWQ4OGYzNy4uZTFkNzY4MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9ldGhlcm5ldC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9ldGhlcm5ldC50eHQKQEAgLTExLDggKzExLDggQEAKICAgdGhlIG1heGltdW0gZnJhbWUgc2l6ZSAodGhlcmUncyBjb250cmFkaWN0aW9uIGluIGVQQVBSKS4KIC0gcGh5LW1vZGU6IHN0cmluZywgb3BlcmF0aW9uIG1vZGUgb2YgdGhlIFBIWSBpbnRlcmZhY2U7IHN1cHBvcnRlZCB2YWx1ZXMgYXJlCiAgICJtaWkiLCAiZ21paSIsICJzZ21paSIsICJxc2dtaWkiLCAidGJpIiwgInJldi1taWkiLCAicm1paSIsICJyZ21paSIsICJyZ21paS1pZCIsCi0gICJyZ21paS1yeGlkIiwgInJnbWlpLXR4aWQiLCAicnRiaSIsICJzbWlpIiwgInhnbWlpIjsgdGhpcyBpcyBub3cgYSBkZS1mYWN0bwotICBzdGFuZGFyZCBwcm9wZXJ0eTsKKyAgInJnbWlpLXJ4aWQiLCAicmdtaWktdHhpZCIsICJydGJpIiwgInNtaWkiLCAieGdtaWkiLCAidHJnbWlpIjsgdGhpcyBpcyBub3cgYQorICBkZS1mYWN0byBzdGFuZGFyZCBwcm9wZXJ0eTsKIC0gcGh5LWNvbm5lY3Rpb24tdHlwZTogdGhlIHNhbWUgYXMgInBoeS1tb2RlIiBwcm9wZXJ0eSBidXQgZGVzY3JpYmVkIGluIGVQQVBSOwogLSBwaHktaGFuZGxlOiBwaGFuZGxlLCBzcGVjaWZpZXMgYSByZWZlcmVuY2UgdG8gYSBub2RlIHJlcHJlc2VudGluZyBhIFBIWQogICBkZXZpY2U7IHRoaXMgcHJvcGVydHkgaXMgZGVzY3JpYmVkIGluIGVQQVBSIGFuZCBzbyBwcmVmZXJyZWQ7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21hY2IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9tYWNiLnR4dAppbmRleCBiNWE0MmRmLi4xNTA2ZTk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21hY2IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWFjYi50eHQKQEAgLTIxLDYgKzIxLDcgQEAKIC0gY2xvY2stbmFtZXM6IFR1cGxlIGxpc3RpbmcgaW5wdXQgY2xvY2sgbmFtZXMuCiAJUmVxdWlyZWQgZWxlbWVudHM6ICdwY2xrJywgJ2hjbGsnCiAJT3B0aW9uYWwgZWxlbWVudHM6ICd0eF9jbGsnCisJT3B0aW9uYWwgZWxlbWVudHM6ICdyeF9jbGsnIGFwcGxpZXMgdG8gY2Rucyx6eW5xbXAtZ2VtCiAtIGNsb2NrczogUGhhbmRsZXMgdG8gaW5wdXQgY2xvY2tzLgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzIGZvciBQSFkgY2hpbGQgbm9kZToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWVkaWF0ZWstbmV0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWVkaWF0ZWstbmV0LnR4dAppbmRleCAzMmVhYWNhLi5mMDk1MjU3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21lZGlhdGVrLW5ldC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9tZWRpYXRlay1uZXQudHh0CkBAIC0yNCwxNCArMjQsMTcgQEAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIGludGVycnVwdC1wYXJlbnQ6IFNob3VsZCBiZSB0aGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyCiAgIHRoYXQgc2VydmljZXMgaW50ZXJydXB0cyBmb3IgdGhpcyBkZXZpY2UKLQorLSBtZWRpYXRlayxod2xybzogdGhlIGNhcGFiaWxpdHkgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIExSTyBmdW5jdGlvbnMKIAogKiBFdGhlcm5ldCBNQUMgbm9kZQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgIm1lZGlhdGVrLGV0aC1tYWMiCiAtIHJlZzogVGhlIG51bWJlciBvZiB0aGUgTUFDCi0tIHBoeS1oYW5kbGU6IHNlZSBldGhlcm5ldC50eHQgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCistIHBoeS1oYW5kbGU6IHNlZSBldGhlcm5ldC50eHQgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYW5kCisJdGhlIHBoeS1tb2RlICJ0cmdtaWkiIHJlcXVpcmVkIGJlaW5nIHByb3ZpZGVkIHdoZW4gcmVnCisJaXMgZXF1YWwgdG8gMCBhbmQgdGhlIE1BQyB1c2VzIGZpeGVkLWxpbmsgdG8gY29ubmVjdAorCXdpdGggaW50ZXJuYWwgc3dpdGNoIHN1Y2ggYXMgTVQ3NTMwLgogCiBFeGFtcGxlOgogCkBAIC01MSw2ICs1NCw3IEBACiAJcmVzZXQtbmFtZXMgPSAiZXRoIjsKIAltZWRpYXRlayxldGhzeXMgPSA8JmV0aHN5cz47CiAJbWVkaWF0ZWsscGN0bCA9IDwmc3lzY2ZnX3BjdGxfYT47CisJbWVkaWF0ZWssaHdscm87CiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MD47CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbXNjYy1waHktdnNjODUzMS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21zY2MtcGh5LXZzYzg1MzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YzdlYjAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21zY2MtcGh5LXZzYzg1MzEudHh0CkBAIC0wLDAgKzEsNTggQEAKKyogTWljcm9zZW1pIC0gdnNjODUzMSBHaWdhIGJpdCBldGhlcm5ldCBwaHkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZQk6IFNob3VsZCBjb250YWluIHBoeSBpZCBhcyAiZXRoZXJuZXQtcGh5LWlkQUFBQS5CQkJCIgorCQkgIFRoZSBQSFkgZGV2aWNlIHVzZXMgdGhlIGJpbmRpbmcgZGVzY3JpYmVkIGluCisJCSAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9waHkudHh0CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHZzYzg1MzEsdmRkbWFjCTogVGhlIHZkZG1hYyBpbiBtVi4KKy0gdnNjODUzMSxlZGdlLXNsb3dkb3duCTogJSB0aGUgZWRnZSBzaG91bGQgYmUgc2xvd2VkIGRvd24gcmVsYXRpdmUgdG8KKwkJCSAgdGhlIGZhc3Rlc3QgcG9zc2libGUgZWRnZSB0aW1lLiBOYXRpdmUgc2lnbgorCQkJICBuZWVkIG5vdCBlbnRlci4KKwkJCSAgRWRnZSByYXRlIHNldHMgdGhlIGRyaXZlIHN0cmVuZ3RoIG9mIHRoZSBNQUMKKwkJCSAgaW50ZXJmYWNlIG91dHB1dCBzaWduYWxzLiAgQ2hhbmdpbmcgdGhlIGRyaXZlCisJCQkgIHN0cmVuZ3RoIHdpbGwgYWZmZWN0IHRoZSBlZGdlIHJhdGUgb2YgdGhlIG91dHB1dAorCQkJICBzaWduYWwuICBUaGUgZ29hbCBvZiB0aGlzIHNldHRpbmcgaXMgdG8gaGVscAorCQkJICByZWR1Y2UgZWxlY3RyaWNhbCBlbWlzc2lvbiAoRU1JKSBieSBiZWluZyBhYmxlCisJCQkgIHRvIHJlcHJvZ3JhbSBkcml2ZSBzdHJlbmd0aCBhbmQgaW4gZWZmZWN0IHNsb3cKKwkJCSAgZG93biB0aGUgZWRnZSByYXRlIGlmIGRlc2lyZWQuICBUYWJsZSAxIHNob3dzIHRoZQorCQkJICBpbXBhY3QgdG8gdGhlIGVkZ2UgcmF0ZSBwZXIgVkRETUFDIHN1cHBseSBmb3IgZWFjaAorCQkJICBkcml2ZSBzdHJlbmd0aCBzZXR0aW5nLgorCQkJICBSZWY6IFRhYmxlOjEgLSBFZGdlIHJhdGUgY2hhbmdlIGJlbG93LgorCitOb3RlOiBzZWUgZHQtYmluZGluZ3MvbmV0L21zY2MtcGh5LXZzYzg1MzEuaCBmb3IgYXBwbGljYWJsZSB2YWx1ZXMKKworVGFibGU6IDEgLSBFZGdlIHJhdGUgY2hhbmdlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCAJCUVkZ2UgUmF0ZSBDaGFuZ2UgKFZERE1BQykJCQl8Cit8CQkJCQkJCQl8Cit8IDMzMDAgbVYJMjUwMCBtVgkJMTgwMCBtVgkJMTUwMCBtVgkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgRGVmYXVsdAlEZWFmdWx0CQlEZWZhdWx0CQlEZWZhdWx0CQl8Cit8IChGYXN0ZXN0KQkJCShyZWNvbW1lbmRlZCkJKHJlY29tbWVuZGVkKQl8Cit8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCAtMiUJCS0zJQkJLTUlCQktNiUJCXwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IC00JQkJLTYlCQktOSUJCS0xNCUJCXwKK3wtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18Cit8IC03JQkJLTEwJQkJLTE2JQkJLTIxJQkJfAorfChyZWNvbW1lbmRlZCkJKHJlY29tbWVuZGVkKQkJCQkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgLTEwJQkJLTE0JQkJLTIzJQkJLTI5JQkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgLTE3JQkJLTIzJQkJLTM1JQkJLTQyJQkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgLTI5JQkJLTM3JQkJLTUyJQkJLTU4JQkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgLTUzJQkJLTYzJQkJLTc2JQkJLTc3JQkJfAorfCAoc2xvd2VzdCkJCQkJCQkJfAorfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKworRXhhbXBsZToKKworICAgICAgICB2c2M4NTMxXzA6IGV0aGVybmV0LXBoeUAwIHsKKyAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gImV0aGVybmV0LXBoeS1pZDAwMDcuMDU3MCI7CisgICAgICAgICAgICAgICAgdnNjODUzMSx2ZGRtYWMJCT0gPDMzMDA+OworICAgICAgICAgICAgICAgIHZzYzg1MzEsZWRnZS1zbG93ZG93bgk9IDwyMT47CisgICAgICAgIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3Fjb20tZW1hYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3Fjb20tZW1hYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ2ZTZjNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcWNvbS1lbWFjLnR4dApAQCAtMCwwICsxLDExMSBAQAorUXVhbGNvbW0gVGVjaG5vbG9naWVzIEVNQUMgR2lnYWJpdCBFdGhlcm5ldCBDb250cm9sbGVyCisKK1RoaXMgbmV0d29yayBjb250cm9sbGVyIGNvbnNpc3RzIG9mIHR3byBkZXZpY2VzOiBhIE1BQyBhbmQgYW4gU0dNSUkKK2ludGVybmFsIFBIWS4gIEVhY2ggZGV2aWNlIGlzIHJlcHJlc2VudGVkIGJ5IGEgZGV2aWNlIHRyZWUgbm9kZS4gIEEgcGhhbmRsZQorY29ubmVjdHMgdGhlIE1BQyBub2RlIHRvIGl0cyBjb3JyZXNwb25kaW5nIGludGVybmFsIHBoeSBub2RlLiAgQW5vdGhlcgorcGhhbmRsZSBwb2ludHMgdG8gdGhlIGV4dGVybmFsIFBIWSBub2RlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCitNQUMgbm9kZToKKy0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAicWNvbSxmc205OTAwLWVtYWMiLgorLSByZWcgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgcmVnaW9ucyBmb3IgdGhlIGRldmljZQorLSBpbnRlcnJ1cHRzIDogSW50ZXJydXB0IG51bWJlciB1c2VkIGJ5IHRoaXMgY29udHJvbGxlcgorLSBtYWMtYWRkcmVzcyA6IFRoZSA2LWJ5dGUgTUFDIGFkZHJlc3MuIElmIHByZXNlbnQsIGl0IGlzIHRoZSBkZWZhdWx0CisJTUFDIGFkZHJlc3MuCistIGludGVybmFsLXBoeSA6IHBoYW5kbGUgdG8gdGhlIGludGVybmFsIFBIWSBub2RlCistIHBoeS1oYW5kbGUgOiBwaGFuZGxlIHRoZSB0aGUgZXh0ZXJuYWwgUEhZIG5vZGUKKworSW50ZXJuYWwgUEhZIG5vZGU6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgInFjb20sZnNtOTkwMC1lbWFjLXNnbWlpIiBvciAicWNvbSxxZGYyNDMyLWVtYWMtc2dtaWkiLgorLSByZWcgOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgcmVnaW9uKHMpIGZvciB0aGUgZGV2aWNlCistIGludGVycnVwdHMgOiBJbnRlcnJ1cHQgbnVtYmVyIHVzZWQgYnkgdGhpcyBjb250cm9sbGVyCisKK1RoZSBleHRlcm5hbCBwaHkgY2hpbGQgbm9kZToKKy0gcmVnIDogVGhlIHBoeSBhZGRyZXNzCisKK0V4YW1wbGU6CisKK0ZTTTk5MDA6CisKK3NvYyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisKKwllbWFjMDogZXRoZXJuZXRAZmViMjAwMDAgeworCQljb21wYXRpYmxlID0gInFjb20sZnNtOTkwMC1lbWFjIjsKKwkJcmVnID0gPDB4ZmViMjAwMDAgMHgxMDAwMD4sCisJCSAgICAgIDwweGZlYjM2MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8NzY+OworCisJCWNsb2NrcyA9IDwmZ2NjIDA+LCA8JmdjYyAxPiwgPCZnY2MgMz4sIDwmZ2NjIDQ+LCA8JmdjYyA1PiwKKwkJCTwmZ2NjIDY+LCA8JmdjYyA3PjsKKwkJY2xvY2stbmFtZXMgPSAiYXhpX2NsayIsICJjZmdfYWhiX2NsayIsICJoaWdoX3NwZWVkX2NsayIsCisJCQkibWRpb19jbGsiLCAidHhfY2xrIiwgInJ4X2NsayIsICJzeXNfY2xrIjsKKworCQlpbnRlcm5hbC1waHkgPSA8JmVtYWNfc2dtaWk+OworCisJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OworCisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJcGh5MDogZXRoZXJuZXQtcGh5QDAgeworCQkJcmVnID0gPDA+OworCQl9OworCisJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCXBpbmN0cmwtMCA9IDwmbWRpb19waW5zX2E+OworCX07CisKKwllbWFjX3NnbWlpOiBldGhlcm5ldEBmZWIzODAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxmc205OTAwLWVtYWMtc2dtaWkiOworCQlyZWcgPSA8MHhmZWIzODAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDgwPjsKKwl9OworCisJdGxtbTogcGluY3RybEBmZDUxMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxmc205OTAwLXBpbmN0cmwiOworCisJCW1kaW9fcGluc19hOiBtZGlvIHsKKwkJCXN0YXRlIHsKKwkJCQlwaW5zID0gImdwaW8xMjMiLCAiZ3BpbzEyNCI7CisJCQkJZnVuY3Rpb24gPSAibWRpbyI7CisJCQl9OworCQl9OworCX07CisKKworUURGMjQzMjoKKworc29jIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKworCWVtYWMwOiBldGhlcm5ldEAzODgwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicWNvbSxmc205OTAwLWVtYWMiOworCQlyZWcgPSA8MHgwIDB4Mzg4MDAwMDAgMHgwIDB4MTAwMDA+LAorCQkgICAgICA8MHgwIDB4Mzg4MTYwMDAgMHgwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MCAyNTYgND47CisKKwkJY2xvY2tzID0gPCZnY2MgMD4sIDwmZ2NjIDE+LCA8JmdjYyAzPiwgPCZnY2MgND4sIDwmZ2NjIDU+LAorCQkJIDwmZ2NjIDY+LCA8JmdjYyA3PjsKKwkJY2xvY2stbmFtZXMgPSAiYXhpX2NsayIsICJjZmdfYWhiX2NsayIsICJoaWdoX3NwZWVkX2NsayIsCisJCQkibWRpb19jbGsiLCAidHhfY2xrIiwgInJ4X2NsayIsICJzeXNfY2xrIjsKKworCQlpbnRlcm5hbC1waHkgPSA8JmVtYWNfc2dtaWk+OworCisJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OworCisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJcGh5MDogZXRoZXJuZXQtcGh5QDQgeworCQkJcmVnID0gPDQ+OworCQl9OworCX07CisKKwllbWFjX3NnbWlpOiBldGhlcm5ldEA0MTA0MDAgeworCQljb21wYXRpYmxlID0gInFjb20scWRmMjQzMi1lbWFjLXNnbWlpIjsKKwkJcmVnID0gPDB4MCAweDAwNDEwNDAwIDB4MCAweGMwMD4sIC8qIEJhc2UgYWRkcmVzcyAqLworCQkgICAgICA8MHgwIDB4MDA0MTAwMDAgMHgwIDB4NDAwPjsgLyogUGVyLWxhbmUgZGlnaXRhbCAqLworCQlpbnRlcnJ1cHRzID0gPDAgMjU0IDE+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3JvY2tjaGlwLWR3bWFjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcm9ja2NoaXAtZHdtYWMudHh0CmluZGV4IGNjY2Q5NDUuLjk1MzgzYzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcm9ja2NoaXAtZHdtYWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvcm9ja2NoaXAtZHdtYWMudHh0CkBAIC0zLDggKzMsMTIgQEAKIFRoZSBkZXZpY2Ugbm9kZSBoYXMgZm9sbG93aW5nIHByb3BlcnRpZXMuCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlOiBDYW4gYmUgb25lIG9mICJyb2NrY2hpcCxyazMyMjgtZ21hYyIsICJyb2NrY2hpcCxyazMyODgtZ21hYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb2NrY2hpcCxyazMzNjgtZ21hYyIKKyAtIGNvbXBhdGlibGU6IHNob3VsZCBiZSAicm9ja2NoaXAsPG5hbWU+LWdhbWMiCisgICAicm9ja2NoaXAscmszMjI4LWdtYWMiOiBmb3VuZCBvbiBSSzMyMnggU29DcworICAgInJvY2tjaGlwLHJrMzI4OC1nbWFjIjogZm91bmQgb24gUkszMjg4IFNvQ3MKKyAgICJyb2NrY2hpcCxyazMzNjYtZ21hYyI6IGZvdW5kIG9uIFJLMzM2NiBTb0NzCisgICAicm9ja2NoaXAscmszMzY4LWdtYWMiOiBmb3VuZCBvbiBSSzMzNjggU29DcworICAgInJvY2tjaGlwLHJrMzM5OS1nbWFjIjogZm91bmQgb24gUkszMzk5IFNvQ3MKICAtIHJlZzogYWRkcmVzc2VzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldHMgZm9yIHRoZSBkZXZpY2UuCiAgLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiB0aGUgR01BQyBpbnRlcnJ1cHRzLgogIC0gaW50ZXJydXB0LW5hbWVzOiBTaG91bGQgY29udGFpbiB0aGUgaW50ZXJydXB0IG5hbWVzICJtYWNpcnEiLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zaF9ldGgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zaF9ldGgudHh0CmluZGV4IDJmNmVjODUuLjAxMTVjODUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc2hfZXRoLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3NoX2V0aC50eHQKQEAgLTUsNiArNSw4IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGU6ICJyZW5lc2FzLGdldGhlci1yOGE3NzQwIiBpZiB0aGUgZGV2aWNlIGlzIGEgcGFydCBvZiBSOEE3NzQwIFNvQy4KKwkgICAgICAicmVuZXNhcyxldGhlci1yOGE3NzQzIiAgaWYgdGhlIGRldmljZSBpcyBhIHBhcnQgb2YgUjhBNzc0MyBTb0MuCisJICAgICAgInJlbmVzYXMsZXRoZXItcjhhNzc0NSIgIGlmIHRoZSBkZXZpY2UgaXMgYSBwYXJ0IG9mIFI4QTc3NDUgU29DLgogCSAgICAgICJyZW5lc2FzLGV0aGVyLXI4YTc3NzgiICBpZiB0aGUgZGV2aWNlIGlzIGEgcGFydCBvZiBSOEE3Nzc4IFNvQy4KIAkgICAgICAicmVuZXNhcyxldGhlci1yOGE3Nzc5IiAgaWYgdGhlIGRldmljZSBpcyBhIHBhcnQgb2YgUjhBNzc3OSBTb0MuCiAJICAgICAgInJlbmVzYXMsZXRoZXItcjhhNzc5MCIgIGlmIHRoZSBkZXZpY2UgaXMgYSBwYXJ0IG9mIFI4QTc3OTAgU29DLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbXNjOTExeC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3Ntc2M5MTF4LnR4dAppbmRleCAzZmVkM2MxLi4xNmMzYTk1MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbXNjOTExeC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbXNjOTExeC50eHQKQEAgLTMsOSArMywxMSBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAic21zYyxsYW48bW9kZWw+IiwgInNtc2MsbGFuOTExNSIKIC0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBpbyBzcGFjZSBmb3IgU01TQyBMQU4KLS0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIFNNU0MgTEFOIGludGVycnVwdCBsaW5lCi0tIGludGVycnVwdC1wYXJlbnQgOiBTaG91bGQgYmUgdGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgotICB0aGF0IHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlCistIGludGVycnVwdHMgOiBvbmUgb3IgdHdvIGludGVycnVwdCBzcGVjaWZpZXJzCisgIC0gVGhlIGZpcnN0IGludGVycnVwdCBpcyB0aGUgU01TQyBMQU4gaW50ZXJydXB0IGxpbmUKKyAgLSBUaGUgc2Vjb25kIGludGVycnVwdCAoaWYgcHJlc2VudCkgaXMgdGhlIFBNRSAocG93ZXIKKyAgICBtYW5hZ2VtZW50IGV2ZW50KSBpbnRlcnJ1cHQgdGhhdCBpcyBhYmxlIHRvIHdha2UgdXAgdGhlIGhvc3QKKyAgICAgc3lzdGVtIHdpdGggYSA1MG1zIHB1bHNlIG9uIG5ldHdvcmsgYWN0aXZpdHkKIC0gcGh5LW1vZGUgOiBTZWUgZXRoZXJuZXQudHh0IGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CkBAIC0yMSw2ICsyMywxMCBAQAogICBleHRlcm5hbCBQSFkKIC0gc21zYyxzYXZlLW1hYy1hZGRyZXNzIDogSW5kaWNhdGVzIHRoYXQgbWFjIGFkZHJlc3MgbmVlZHMgdG8gYmUgc2F2ZWQKICAgYmVmb3JlIHJlc2V0dGluZyB0aGUgY29udHJvbGxlcgorLSByZXNldC1ncGlvcyA6IGEgR1BJTyBsaW5lIGNvbm5lY3RlZCB0byB0aGUgUkVTRVQgKGFjdGl2ZSBsb3cpIHNpZ25hbAorICBvZiB0aGUgZGV2aWNlLiBPbiBtYW55IHN5c3RlbXMgdGhpcyBpcyB3aXJlZCBoaWdoIHNvIHRoZSBkZXZpY2UgZ29lcworICBvdXQgb2YgcmVzZXQgYXQgcG93ZXItb24sIGJ1dCBpZiBpdCBpcyB1bmRlciBwcm9ncmFtIGNvbnRyb2wsIHRoaXMKKyAgb3B0aW9uYWwgR1BJTyBjYW4gd2FrZSB1cCBpbiByZXNwb25zZSB0byBpdC4KIAogRXhhbXBsZXM6CiAKQEAgLTI5LDcgKzM1LDggQEAKIAlyZWcgPSA8MHhmNDAwMDAwMCAweDIwMDAwMDA+OwogCXBoeS1tb2RlID0gIm1paSI7CiAJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3BpbzE+OwotCWludGVycnVwdHMgPSA8MzE+OworCWludGVycnVwdHMgPSA8MzE+LCA8MzI+OworCXJlc2V0LWdwaW9zID0gPCZncGlvMSAzMCBHUElPX0FDVElWRV9MT1c+OwogCXJlZy1pby13aWR0aCA9IDw0PjsKIAlzbXNjLGlycS1wdXNoLXB1bGw7CiB9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbnBzLGR3Yy1xb3MtZXRoZXJuZXQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zbnBzLGR3Yy1xb3MtZXRoZXJuZXQudHh0CmluZGV4IDUxZjhkMmUuLmQ5M2Y3MWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc25wcyxkd2MtcW9zLWV0aGVybmV0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3NucHMsZHdjLXFvcy1ldGhlcm5ldC50eHQKQEAgLTEsMjEgKzEsMTExIEBACiAqIFN5bm9wc3lzIERXQyBFdGhlcm5ldCBRb1MgSVAgdmVyc2lvbiA0LjEwIGRyaXZlciAoR01BQykKIAorVGhpcyBiaW5kaW5nIHN1cHBvcnRzIHRoZSBTeW5vcHN5cyBEZXNpZ253YXJlIEV0aGVybmV0IFFvUyAoUXVhbGl0eSBPZiBTZXJ2aWNlKQorSVAgYmxvY2suIFRoZSBJUCBzdXBwb3J0cyBtdWx0aXBsZSBvcHRpb25zIGZvciBidXMgdHlwZSwgY2xvY2tpbmcgYW5kIHJlc2V0CitzdHJ1Y3R1cmUsIGFuZCBmZWF0dXJlIGxpc3QuIENvbnNlcXVlbnRseSwgYSBudW1iZXIgb2YgcHJvcGVydGllcyBhbmQgbGlzdAorZW50cmllcyBpbiBwcm9wZXJ0aWVzIGFyZSBtYXJrZWQgYXMgb3B0aW9uYWwsIG9yIG9ubHkgcmVxdWlyZWQgaW4gc3BlY2lmaWMgSFcKK2NvbmZpZ3VyYXRpb25zLgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIgorLSBjb21wYXRpYmxlOiBPbmUgb2Y6CisgIC0gImF4aXMsYXJ0cGVjNi1lcW9zIiwgInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIgorICAgIFJlcHJlc2VudHMgdGhlIElQIGNvcmUgd2hlbiBpbnRlZ3JhdGVkIGludG8gdGhlIEF4aXMgQVJUUEVDLTYgU29DLgorICAtICJudmlkaWEsdGVncmExODYtZXFvcyIsICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCIKKyAgICBSZXByZXNlbnRzIHRoZSBJUCBjb3JlIHdoZW4gaW50ZWdyYXRlZCBpbnRvIHRoZSBOVklESUEgVGVncmExODYgU29DLgorICAtICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCIKKyAgICBUaGlzIGNvbWJpbmF0aW9uIGlzIGRlcHJlY2F0ZWQuIEl0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8KKyAgICAiYXhpcyxhcnRwZWM2LWVxb3MiLCAic25wcyxkd2MtcW9zLWV0aGVybmV0LTQuMTAiLiBJdCBpcyBzdXBwb3J0ZWQgdG8gYmUKKyAgICBjb21wYXRpYmxlIHdpdGggZWFybGllciByZXZpc2lvbnMgb2YgdGhpcyBiaW5kaW5nLgogLSByZWc6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCi0tIGNsb2NrczogUGhhbmRsZXMgdG8gdGhlIHJlZmVyZW5jZSBjbG9jayBhbmQgdGhlIGJ1cyBjbG9jawotLSBjbG9jay1uYW1lczogU2hvdWxkIGJlICJwaHlfcmVmX2NsayIgZm9yIHRoZSByZWZlcmVuY2UgY2xvY2sgYW5kICJhcGJfcGNsayIKLSAgZm9yIHRoZSBidXMgY2xvY2suCistIGNsb2NrczogUGhhbmRsZSBhbmQgY2xvY2sgc3BlY2lmaWVycyBmb3IgZWFjaCBlbnRyeSBpbiBjbG9jay1uYW1lcywgaW4gdGhlCisgIHNhbWUgb3JkZXIuIFNlZSAuLi9jbG9jay9jbG9jay1iaW5kaW5ncy50eHQuCistIGNsb2NrLW5hbWVzOiBNYXkgY29udGFpbiBhbnkvYWxsIG9mIHRoZSBmb2xsb3dpbmcgZGVwZW5kaW5nIG9uIHRoZSBJUAorICBjb25maWd1cmF0aW9uLCBpbiBhbnkgb3JkZXI6CisgIC0gInR4IgorICAgIFRoZSBFUU9TIHRyYW5zbWl0IHBhdGggY2xvY2suIFRoZSBIVyBzaWduYWwgbmFtZSBpcyBjbGtfdHhfaS4KKyAgICBJbiBzb21lIGNvbmZpZ3VyYXRpb25zIChlLmcuIEdNSUkvUkdNSUkpLCB0aGlzIGNsb2NrIGFsc28gZHJpdmVzIHRoZSBQSFkgVFgKKyAgICBwYXRoLiBJbiBvdGhlciBjb25maWd1cmF0aW9ucywgb3RoZXIgY2xvY2tzIChzdWNoIGFzIHR4XzEyNSwgcm1paSkgbWF5CisgICAgZHJpdmUgdGhlIFBIWSBUWCBwYXRoLgorICAtICJyeCIKKyAgICBUaGUgRVFPUyByZWNlaXZlIHBhdGggY2xvY2suIFRoZSBIVyBzaWduYWwgbmFtZSBpcyBjbGtfcnhfaS4KKyAgICBJbiBzb21lIGNvbmZpZ3VyYXRpb25zIChlLmcuIEdNSUkvUkdNSUkpLCB0aGlzIGNsb2NrIGlzIGRlcml2ZWQgZnJvbSB0aGUKKyAgICBQSFkncyBSWCBjbG9jayBvdXRwdXQuIEluIG90aGVyIGNvbmZpZ3VyYXRpb25zLCBvdGhlciBjbG9ja3MgKHN1Y2ggYXMKKyAgICByeF8xMjUsIHJtaWkpIG1heSBkcml2ZSB0aGUgRVFPUyBSWCBwYXRoLgorICAgIEluIGNhc2VzIHdoZXJlIHRoZSBQSFkgY2xvY2sgaXMgZGlyZWN0bHkgZmVkIGludG8gdGhlIEVRT1MgcmVjZWl2ZSBwYXRoCisgICAgd2l0aG91dCBpbnRlcnZlbmluZyBsb2dpYywgdGhlIERUIG5lZWQgbm90IHJlcHJlc2VudCB0aGlzIGNsb2NrLCBzaW5jZSBpdAorICAgIGlzIGFzc3VtZWQgdG8gYmUgZnVsbHkgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIFBIWSBkZXZpY2UvZHJpdmVyLiBJbgorICAgIGNhc2VzIHdoZXJlIFNvQyBpbnRlZ3JhdGlvbiBhZGRzIGFkZGl0aW9uYWwgbG9naWMgdG8gdGhpcyBwYXRoLCBzdWNoIGFzIGEKKyAgICBTVy1jb250cm9sbGVkIGNsb2NrIGdhdGUsIHRoaXMgY2xvY2sgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGluIERULgorICAtICJzbGF2ZV9idXMiCisgICAgVGhlIENQVS9zbGF2ZS1idXMgKENTUikgaW50ZXJmYWNlIGNsb2NrLiBUaGlzIGFwcGxpZXMgdG8gYW55IGJ1cyB0eXBlOworICAgIEFQQiwgQUhCLCBBWEksIGV0Yy4gVGhlIEhXIHNpZ25hbCBuYW1lIGlzIGhjbGtfaSAoQUhCKSBvciBjbGtfY3NyX2kgKG90aGVyCisgICAgYnVzZXMpLgorICAtICJtYXN0ZXJfYnVzIgorICAgIFRoZSBtYXN0ZXIgYnVzIGludGVyZmFjZSBjbG9jay4gT25seSByZXF1aXJlZCBpbiBjb25maWd1cmF0aW9ucyB0aGF0IHVzZSBhCisgICAgc2VwYXJhdGUgY2xvY2sgZm9yIHRoZSBtYXN0ZXIgYW5kIHNsYXZlIGJ1cyBpbnRlcmZhY2VzLiBUaGUgSFcgc2lnbmFsIG5hbWUKKyAgICBpcyBoY2xrX2kgKEFIQikgb3IgYWNsa19pIChBWEkpLgorICAtICJwdHBfcmVmIgorICAgIFRoZSBQVFAgcmVmZXJlbmNlIGNsb2NrLiBUaGUgSFcgc2lnbmFsIG5hbWUgaXMgY2xrX3B0cF9yZWZfaS4KKyAgLSAicGh5X3JlZl9jbGsiCisgICAgVGhpcyBjbG9jayBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgbmV3IGNvbXBhdGlibGUgdmFsdWVzLgorICAgIEl0IGlzIGVxdWl2YWxlbnQgdG8gInR4Ii4KKyAgLSAiYXBiX3BjbGsiCisgICAgVGhpcyBjbG9jayBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgbmV3IGNvbXBhdGlibGUgdmFsdWVzLgorICAgIEl0IGlzIGVxdWl2YWxlbnQgdG8gInNsYXZlX2J1cyIuCisKKyAgTm90ZTogU3VwcG9ydCBmb3IgYWRkaXRpb25hbCBJUCBjb25maWd1cmF0aW9ucyBtYXkgcmVxdWlyZSBhZGRpbmcgdGhlCisgIGZvbGxvd2luZyBjbG9ja3MgdG8gdGhpcyBsaXN0IGluIHRoZSBmdXR1cmU6IGNsa19yeF8xMjVfaSwgY2xrX3R4XzEyNV9pLAorICBjbGtfcG1hcnhfMF9pLCBjbGtfcG1hcngxX2ksIGNsa19ybWlpX2ksIGNsa19yZXZtaWlfcnhfaSwgY2xrX3Jldm1paV90eF9pLgorICBDb25maWd1cmF0aW9ucyBleGlzdCB3aGVyZSBtdWx0aXBsZSBzaW1pbGFyIGNsb2NrcyBhcmUgdXNlZCBhdCBvbmNlLCBlLmcuIGFsbAorICBvZiBjbGtfcnhfMTI1X2ksIGNsa19wbWFyeF8wX2ksIGNsa19wbWFyeDFfaS4gRm9yIHRoaXMgcmVhc29uIGl0IGlzIGJlc3QgdG8KKyAgZXh0ZW5kIHRoZSBiaW5kaW5nIHdpdGggYSBzZXBhcmF0ZSBjbG9jay1uYW1lcyBlbnRyeSBmb3IgZWFjaCBvZiB0aG9zZSBSWAorICBjbG9ja3MsIHJhdGhlciB0aGFuIHJlcHVycG9zaW5nIHRoZSBleGlzdGluZyAicngiIGNsb2NrLW5hbWVzIGVudHJ5IGFzIGEKKyAgZ2VuZXJpYy9sb2dpY2FsIGNsb2NrIGluIGEgc2ltaWxhciBmYXNoaW9uIHRvICJtYXN0ZXJfYnVzIiBhbmQgInNsYXZlX2J1cyIuCisgIFRoaXMgd2lsbCBhbGxvdyBlYXN5IHN1cHBvcnQgZm9yIGNvbmZpZ3VyYXRpb25zIHRoYXQgc3VwcG9ydCBtdWx0aXBsZSBQSFkKKyAgaW50ZXJmYWNlcyB1c2luZyBhIG11eCwgYW5kIGhlbmNlIG5lZWQgdG8gaGF2ZSBleHBsaWNpdCBjb250cm9sIG92ZXIKKyAgc3BlY2lmaWMgUlggY2xvY2tzLgorCisgIFRoZSBmb2xsb3dpbmcgY29tcGF0aWJsZSB2YWx1ZXMgcmVxdWlyZSB0aGUgZm9sbG93aW5nIHNldCBvZiBjbG9ja3M6CisgIC0gIm52aWRpYSx0ZWdyYTE4Ni1lcW9zIiwgInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIjoKKyAgICAtICJzbGF2ZV9idXMiCisgICAgLSAibWFzdGVyX2J1cyIKKyAgICAtICJyeCIKKyAgICAtICJ0eCIKKyAgICAtICJwdHBfcmVmIgorICAtICJheGlzLGFydHBlYzYtZXFvcyIsICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCI6CisgICAgLSAic2xhdmVfYnVzIgorICAgIC0gIm1hc3Rlcl9idXMiCisgICAgLSAidHgiCisgICAgLSAicHRwX3JlZiIKKyAgLSAic25wcyxkd2MtcW9zLWV0aGVybmV0LTQuMTAiIChkZXByZWNhdGVkKToKKyAgICAtICJwaHlfcmVmX2NsayIKKyAgICAtICJhcGJfY2xrIgogLSBpbnRlcnJ1cHQtcGFyZW50OiBTaG91bGQgYmUgdGhlIHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgogICB0aGF0IHNlcnZpY2VzIGludGVycnVwdHMgZm9yIHRoaXMgZGV2aWNlCiAtIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIHRoZSBjb3JlJ3MgY29tYmluZWQgaW50ZXJydXB0IHNpZ25hbAogLSBwaHktbW9kZTogU2VlIGV0aGVybmV0LnR4dCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorLSByZXNldHM6IFBoYW5kbGUgYW5kIHJlc2V0IHNwZWNpZmllcnMgZm9yIGVhY2ggZW50cnkgaW4gcmVzZXQtbmFtZXMsIGluIHRoZQorICBzYW1lIG9yZGVyLiBTZWUgLi4vcmVzZXQvcmVzZXQudHh0LgorLSByZXNldC1uYW1lczogTWF5IGNvbnRhaW4gYW55L2FsbCBvZiB0aGUgZm9sbG93aW5nIGRlcGVuZGluZyBvbiB0aGUgSVAKKyAgY29uZmlndXJhdGlvbiwgaW4gYW55IG9yZGVyOgorICAtICJlcW9zIi4gVGhlIHJlc2V0IHRvIHRoZSBlbnRpcmUgbW9kdWxlLiBUaGUgSFcgc2lnbmFsIG5hbWUgaXMgaHJlc2V0X24KKyAgICAoQUhCKSBvciBhcmVzZXRuX2kgKEFYSSkuCisKKyAgVGhlIGZvbGxvd2luZyBjb21wYXRpYmxlIHZhbHVlcyByZXF1aXJlIHRoZSBmb2xsb3dpbmcgc2V0IG9mIHJlc2V0czoKKyAgKHRoZSByZXNldCBwcm9wZXJ0aWVzIG1heSBiZSBvbWl0dGVkIGlmIGVtcHR5KQorICAtICJudmlkaWEsdGVncmExODYtZXFvcyIsICJzbnBzLGR3Yy1xb3MtZXRoZXJuZXQtNC4xMCI6CisgICAgLSAiZXFvcyIuCisgIC0gImF4aXMsYXJ0cGVjNi1lcW9zIiwgInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIjoKKyAgICAtIE5vbmUuCisgIC0gInNucHMsZHdjLXFvcy1ldGhlcm5ldC00LjEwIiAoZGVwcmVjYXRlZCk6CisgICAgLSBOb25lLgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogLSBkbWEtY29oZXJlbnQ6IFByZXNlbnQgaWYgZG1hIG9wZXJhdGlvbnMgYXJlIGNvaGVyZW50CiAtIG1hYy1hZGRyZXNzOiBTZWUgZXRoZXJuZXQudHh0IGluIHRoZSBzYW1lIGRpcmVjdG9yeQogLSBsb2NhbC1tYWMtYWRkcmVzczogU2VlIGV0aGVybmV0LnR4dCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkKKy0gcGh5LXJlc2V0LWdwaW9zOiBQaGFuZGxlIGFuZCBzcGVjaWZpZXIgZm9yIGFueSBHUElPIHVzZWQgdG8gcmVzZXQgdGhlIFBIWS4KKyAgU2VlIC4uL2dwaW8vZ3Bpby50eHQuCiAtIHNucHMsZW4tbHBpOiBJZiBwcmVzZW50IGl0IGVuYWJsZXMgdXNlIG9mIHRoZSBBWEkgbG93LXBvd2VyIGludGVyZmFjZQogLSBzbnBzLHdyaXRlLXJlcXVlc3RzOiBOdW1iZXIgb2Ygd3JpdGUgcmVxdWVzdHMgdGhhdCB0aGUgQVhJIHBvcnQgY2FuIGlzc3VlLgogICBJdCBkZXBlbmRzIG9uIHRoZSBTb0MgY29uZmlndXJhdGlvbi4KQEAgLTUyLDYgKzE0Miw3IEBACiAJcmVnID0gPDB4NDAwMTAwMDAgMHg0MDAwPjsKIAlwaHktaGFuZGxlID0gPCZwaHkyPjsKIAlwaHktbW9kZSA9ICJnbWlpIjsKKwlwaHktcmVzZXQtZ3Bpb3MgPSA8JmdwaW9jdGxyIDQzIEdQSU9fQUNUSVZFX0xPVz47CiAKIAlzbnBzLGVuLXR4LWxwaS1jbG9ja2dhdGluZzsKIAlzbnBzLGVuLWxwaTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc3RtMzItZHdtYWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zdG0zMi1kd21hYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1YWZiNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc3RtMzItZHdtYWMudHh0CkBAIC0wLDAgKzEsMzIgQEAKK1NUTWljcm9lbGVjdHJvbmljcyBTVE0zMiAvIE1DVSBEV01BQyBnbHVlIGxheWVyIGNvbnRyb2xsZXIKKworVGhpcyBmaWxlIGRvY3VtZW50cyBwbGF0Zm9ybSBnbHVlIGxheWVyIGZvciBzdG1tYWMuCitQbGVhc2Ugc2VlIHN0bW1hYy50eHQgZm9yIHRoZSBvdGhlciB1bmNoYW5nZWQgcHJvcGVydGllcy4KKworVGhlIGRldmljZSBub2RlIGhhcyBmb2xsb3dpbmcgcHJvcGVydGllcy4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogIFNob3VsZCBiZSAic3Qsc3RtMzItZHdtYWMiIHRvIHNlbGVjdCBnbHVlLCBhbmQKKwkgICAgICAgInNucHMsZHdtYWMtMy41MGEiIHRvIHNlbGVjdCBJUCB2ZXJzaW9uLgorLSBjbG9ja3M6IE11c3QgY29udGFpbiBhIHBoYW5kbGUgZm9yIGVhY2ggZW50cnkgaW4gY2xvY2stbmFtZXMuCistIGNsb2NrLW5hbWVzOiBTaG91bGQgYmUgInN0bW1hY2V0aCIgZm9yIHRoZSBob3N0IGNsb2NrLgorCSAgICAgICBTaG91bGQgYmUgIm1hYy1jbGstdHgiIGZvciB0aGUgTUFDIFRYIGNsb2NrLgorCSAgICAgICBTaG91bGQgYmUgIm1hYy1jbGstcngiIGZvciB0aGUgTUFDIFJYIGNsb2NrLgorLSBzdCxzeXNjb24gOiBTaG91bGQgYmUgcGhhbmRsZS9vZmZzZXQgcGFpci4gVGhlIHBoYW5kbGUgdG8gdGhlIHN5c2NvbiBub2RlIHdoaWNoCisJICAgICAgZW5jb21wYXNlcyB0aGUgZ2x1ZSByZWdpc3RlciwgYW5kIHRoZSBvZmZzZXQgb2YgdGhlIGNvbnRyb2wgcmVnaXN0ZXIuCitFeGFtcGxlOgorCisJZXRoZXJuZXRANDAwMjgwMDAgeworCQljb21wYXRpYmxlID0gInN0LHN0bTMyLWR3bWFjIiwgInNucHMsZHdtYWMtMy41MGEiOworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQlyZWcgPSA8MHg0MDAyODAwMCAweDgwMDA+OworCQlyZWctbmFtZXMgPSAic3RtbWFjZXRoIjsKKwkJaW50ZXJydXB0cyA9IDwwIDYxIDA+LCA8MCA2MiAwPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gIm1hY2lycSIsICJldGhfd2FrZV9pcnEiOworCQljbG9jay1uYW1lcyA9ICJzdG1tYWNldGgiLCAibWFjLWNsay10eCIsICJtYWMtY2xrLXJ4IjsKKwkJY2xvY2tzID0gPCZyY2MgMCAyNT4sIDwmcmNjIDAgMjY+LCA8JnJjYyAwIDI3PjsKKwkJc3Qsc3lzY29uID0gPCZzeXNjZmcgMHg0PjsKKwkJc25wcyxwYmwgPSA8OD47CisJCXNucHMsbWl4ZWQtYnVyc3Q7CisJCWRtYS1yYW5nZXM7CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvd2lyZWxlc3MvZXNwLGVzcDgwODkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC93aXJlbGVzcy9lc3AsZXNwODA4OS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzMzFiYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvd2lyZWxlc3MvZXNwLGVzcDgwODkudHh0CkBAIC0wLDAgKzEsMzEgQEAKK0VzcHJlc3NpZiBFU1A4MDg5IHdpcmVsZXNzIFNESU8gZGV2aWNlcworCitUaGlzIG5vZGUgcHJvdmlkZXMgcHJvcGVydGllcyBmb3IgY29udHJvbGxpbmcgdGhlIEVTUDgwODkgd2lyZWxlc3MgZGV2aWNlLgorVGhlIG5vZGUgaXMgZXhwZWN0ZWQgdG8gYmUgc3BlY2lmaWVkIGFzIGEgY2hpbGQgbm9kZSB0byB0aGUgU0RJTyBjb250cm9sbGVyCit0aGF0IGNvbm5lY3RzIHRoZSBkZXZpY2UgdG8gdGhlIHN5c3RlbS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiZXNwLGVzcDgwODkiLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gZXNwLGNyeXN0YWwtMjZNLWVuOiBJbnRlZ2VyIHZhbHVlIGZvciB0aGUgY3J5c3RhbF8yNk1fZW4gZmlybXdhcmUgcGFyYW1ldGVyCisKK0V4YW1wbGU6CisKKyZtbWMxIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwwPjsKKworCXZtbWMtc3VwcGx5ID0gPCZyZWdfZGxkbzE+OworCW1tYy1wd3JzZXEgPSA8JndpZmlfcHdyc2VxPjsKKwlidXMtd2lkdGggPSA8ND47CisJbm9uLXJlbW92YWJsZTsKKwlzdGF0dXMgPSAib2theSI7CisKKwllc3A4MDg5OiBzZGlvX3dpZmlAMSB7CisJCWNvbXBhdGlibGUgPSAiZXNwLGVzcDgwODkiOworCQlyZWcgPSA8MT47CisJCWVzcCxjcnlzdGFsLTI2TS1lbiA9IDwyPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQveGlsaW54X2dtaWkycmdtaWkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC94aWxpbnhfZ21paTJyZ21paS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZGRhNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQveGlsaW54X2dtaWkycmdtaWkudHh0CkBAIC0wLDAgKzEsMzUgQEAKK1hJTElOWCBHTUlJVE9SR01JSSBDb252ZXJ0ZXIgRHJpdmVyIERldmljZSBUcmVlIEJpbmRpbmdzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgR2lnYWJpdCBNZWRpYSBJbmRlcGVuZGVudCBJbnRlcmZhY2UgKEdNSUkpIHRvIFJlZHVjZWQgR2lnYWJpdCBNZWRpYQorSW5kZXBlbmRlbnQgSW50ZXJmYWNlIChSR01JSSkgY29yZSBwcm92aWRlcyB0aGUgUkdNSUkgYmV0d2VlbiBSR01JSS1jb21wbGlhbnQKK0V0aGVybmV0IHBoeXNpY2FsIG1lZGlhIGRldmljZXMgKFBIWSkgYW5kIHRoZSBHaWdhYml0IEV0aGVybmV0IGNvbnRyb2xsZXIuCitUaGlzIGNvcmUgY2FuIGJlIHVzZWQgaW4gYWxsIHRocmVlIG1vZGVzIG9mIG9wZXJhdGlvbigxMC8xMDAvMTAwMCBNYi9zKS4KK1RoZSBNYW5hZ2VtZW50IERhdGEgSW5wdXQvT3V0cHV0IChNRElPKSBpbnRlcmZhY2UgaXMgdXNlZCB0byBjb25maWd1cmUgdGhlCitTcGVlZCBvZiBvcGVyYXRpb24uIFRoaXMgY29yZSBjYW4gc3dpdGNoIGR5bmFtaWNhbGx5IGJldHdlZW4gdGhlIHRocmVlCitEaWZmZXJlbnQgc3BlZWQgbW9kZXMgYnkgY29uZmlndXJpbmcgdGhlIGNvbnZldGVyIHJlZ2lzdGVyIHRocm91Z2ggbWRpbyB3cml0ZS4KKworVGhpcyBjb252ZXJ0ZXIgc2l0cyBiZXR3ZWVuIHRoZSBldGhlcm5ldCBNQUMgYW5kIHRoZSBleHRlcm5hbCBwaHkuCitNQUMgPD09PiBHTUlJMlJHTUlJIDw9PT4gUkdNSUlfUEhZCisKK0ZvciBtb3JlIGRldGFpbHMgYWJvdXQgbWRpbyBwbGVhc2UgcmVmZXIgcGh5LnR4dCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZQk6IFNob3VsZCBiZSAieGxueCxnbWlpLXRvLXJnbWlpLTEuMCIKKy0gcmVnCQk6IFRoZSBJRCBudW1iZXIgZm9yIHRoZSBwaHksIHVzdWFsbHkgYSBzbWFsbCBpbnRlZ2VyCistIHBoeS1oYW5kbGUJOiBTaG91bGQgcG9pbnQgdG8gdGhlIGV4dGVybmFsIHBoeSBkZXZpY2UuCisJCSAgU2VlIGV0aGVybmV0LnR4dCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KKworRXhhbXBsZToKKwltZGlvIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQlwaHk6IGV0aGVybmV0LXBoeUAwIHsKKwkJCS4uLi4uLgorCQl9OworCQlnbWlpdG9yZ21paTogZ21paXRvcmdtaWlAOCB7CisJCQljb21wYXRpYmxlID0gInhsbngsZ21paS10by1yZ21paS0xLjAiOworCQkJcmVnID0gPDg+OworCQkJcGh5LWhhbmRsZSA9IDwmcGh5PjsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL252bWVtL3JvY2tjaGlwLWVmdXNlLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9udm1lbS9yb2NrY2hpcC1lZnVzZS50eHQKaW5kZXggOGY4NmFiMy4uOTRhZWVlYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL252bWVtL3JvY2tjaGlwLWVmdXNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbnZtZW0vcm9ja2NoaXAtZWZ1c2UudHh0CkBAIC0xLDExICsxLDIwIEBACiA9IFJvY2tjaGlwIGVGdXNlIGRldmljZSB0cmVlIGJpbmRpbmdzID0KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJyb2NrY2hpcCxyb2NrY2hpcC1lZnVzZSIKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLgorICAtICJyb2NrY2hpcCxyazMwNjZhLWVmdXNlIiAtIGZvciBSSzMwNjZhIFNvQ3MuCisgIC0gInJvY2tjaGlwLHJrMzE4OC1lZnVzZSIgLSBmb3IgUkszMTg4IFNvQ3MuCisgIC0gInJvY2tjaGlwLHJrMzI4OC1lZnVzZSIgLSBmb3IgUkszMjg4IFNvQ3MuCisgIC0gInJvY2tjaGlwLHJrMzM5OS1lZnVzZSIgLSBmb3IgUkszMzk5IFNvQ3MuCiAtIHJlZzogU2hvdWxkIGNvbnRhaW4gdGhlIHJlZ2lzdGVycyBsb2NhdGlvbiBhbmQgZXhhY3QgZUZ1c2Ugc2l6ZQogLSBjbG9ja3M6IFNob3VsZCBiZSB0aGUgY2xvY2sgaWQgb2YgZUZ1c2UKIC0gY2xvY2stbmFtZXM6IFNob3VsZCBiZSAicGNsa19lZnVzZSIKIAorRGVwcmVjYXRlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAicm9ja2NoaXAscm9ja2NoaXAtZWZ1c2UiCisgIE9sZCBlZnVzZSBjb21wYXRpYmxlIHZhbHVlIGNvbXBhdGlibGUgdG8gcmszMDY2YSwgcmszMTg4IGFuZCByazMyODgKKyAgZWZ1c2VzCisKID0gRGF0YSBjZWxscyA9CiBBcmUgY2hpbGQgbm9kZXMgb2YgZUZ1c2UsIGJpbmRpbmdzIG9mIHdoaWNoIGFzIGRlc2NyaWJlZCBpbgogYmluZGluZ3MvbnZtZW0vbnZtZW0udHh0CkBAIC0xMyw3ICsyMiw3IEBACiBFeGFtcGxlOgogCiAJZWZ1c2U6IGVmdXNlQGZmYjQwMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyb2NrY2hpcC1lZnVzZSI7CisJCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMjg4LWVmdXNlIjsKIAkJcmVnID0gPDB4ZmZiNDAwMDAgMHgyMD47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvYXhpcyxhcnRwZWM2LXBjaWUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9heGlzLGFydHBlYzYtcGNpZS50eHQKaW5kZXggMzMwYTQ1Yi4uNWVjYWVhMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9heGlzLGFydHBlYzYtcGNpZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9heGlzLGFydHBlYzYtcGNpZS50eHQKQEAgLTI0LDE2ICsyNCwxNyBAQAogCQljb21wYXRpYmxlID0gImF4aXMsYXJ0cGVjNi1wY2llIiwgInNucHMsZHctcGNpZSI7CiAJCXJlZyA9IDwweGY4MDUwMDAwIDB4MjAwMAogCQkgICAgICAgMHhmODA0MDAwMCAweDEwMDAKLQkJICAgICAgIDB4YzAwMDAwMDAgMHgxMDAwPjsKKwkJICAgICAgIDB4YzAwMDAwMDAgMHgyMDAwPjsKIAkJcmVnLW5hbWVzID0gImRiaSIsICJwaHkiLCAiY29uZmlnIjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCSNzaXplLWNlbGxzID0gPDI+OwogCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJICAvKiBkb3duc3RyZWFtIEkvTyAqLwotCQlyYW5nZXMgPSA8MHg4MTAwMDAwMCAwIDB4MDAwMTAwMDAgMHhjMDAxMDAwMCAwIDB4MDAwMTAwMDAKKwkJcmFuZ2VzID0gPDB4ODEwMDAwMDAgMCAwIDB4YzAwMDIwMDAgMCAweDAwMDEwMDAwCiAJCQkgIC8qIG5vbi1wcmVmZXRjaGFibGUgbWVtb3J5ICovCi0JCQkgIDB4ODIwMDAwMDAgMCAweGMwMDIwMDAwIDB4YzAwMjAwMDAgMCAweDFmZmUwMDAwPjsKKwkJCSAgMHg4MjAwMDAwMCAwIDB4YzAwMTIwMDAgMHhjMDAxMjAwMCAwIDB4MWZmZWUwMDA+OwogCQludW0tbGFuZXMgPSA8Mj47CisJCWJ1cy1yYW5nZSA9IDwweDAwIDB4ZmY+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTQ4IElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQlpbnRlcnJ1cHQtbmFtZXMgPSAibXNpIjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvZGVzaWdud2FyZS1wY2llLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvZGVzaWdud2FyZS1wY2llLnR4dAppbmRleCA2YzUzMjJjLi4xMzkyYzcwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL2Rlc2lnbndhcmUtcGNpZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9kZXNpZ253YXJlLXBjaWUudHh0CkBAIC0xNyw2ICsxNyw4IEBACiAtIG51bS1sYW5lczogbnVtYmVyIG9mIGxhbmVzIHRvIHVzZQogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBudW0tdmlld3BvcnQ6IG51bWJlciBvZiB2aWV3IHBvcnRzIGNvbmZpZ3VyZWQgaW4gaGFyZHdhcmUuICBJZiBhIHBsYXRmb3JtCisgIGRvZXMgbm90IHNwZWNpZnkgaXQsIHRoZSBkcml2ZXIgYXNzdW1lcyAyLgogLSBudW0tbGFuZXM6IG51bWJlciBvZiBsYW5lcyB0byB1c2UgKHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHNwZWNpZmllZCB1bmxlc3MKICAgdGhlIGxpbmsgaXMgYnJvdWdodCBhbHJlYWR5IHVwIGluIEJJT1MpCiAtIHJlc2V0LWdwaW86IGdwaW8gcGluIG51bWJlciBvZiBwb3dlciBnb29kIHNpZ25hbApAQCAtNDQsNCArNDYsNSBAQAogCQlpbnRlcnJ1cHRzID0gPDI1PiwgPDI0PjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKIAkJbnVtLWxhbmVzID0gPDE+OworCQludW0tdmlld3BvcnQgPSA8Mz47CiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvcm9ja2NoaXAtcGNpZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL3JvY2tjaGlwLXBjaWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjdiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL3JvY2tjaGlwLXBjaWUudHh0CkBAIC0wLDAgKzEsMTA2IEBACisqIFJvY2tjaGlwIEFYSSBQQ0llIFJvb3QgUG9ydCBCcmlkZ2UgRFQgZGVzY3JpcHRpb24KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gI2FkZHJlc3MtY2VsbHM6IEFkZHJlc3MgcmVwcmVzZW50YXRpb24gZm9yIHJvb3QgcG9ydHMsIHNldCB0byA8Mz4KKy0gI3NpemUtY2VsbHM6IFNpemUgcmVwcmVzZW50YXRpb24gZm9yIHJvb3QgcG9ydHMsIHNldCB0byA8Mj4KKy0gI2ludGVycnVwdC1jZWxsczogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgbmVlZGVkIHRvIGVuY29kZSBhbgorCQlpbnRlcnJ1cHQgc291cmNlLiBUaGUgdmFsdWUgbXVzdCBiZSAxLgorLSBjb21wYXRpYmxlOiBTaG91bGQgY29udGFpbiAicm9ja2NoaXAscmszMzk5LXBjaWUiCistIHJlZzogVHdvIHJlZ2lzdGVyIHJhbmdlcyBhcyBsaXN0ZWQgaW4gdGhlIHJlZy1uYW1lcyBwcm9wZXJ0eQorLSByZWctbmFtZXM6IE11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG5hbWVzCisJLSAiYXhpLWJhc2UiCisJLSAiYXBiLWJhc2UiCistIGNsb2NrczogTXVzdCBjb250YWluIGFuIGVudHJ5IGZvciBlYWNoIGVudHJ5IGluIGNsb2NrLW5hbWVzLgorCQlTZWUgLi4vY2xvY2tzL2Nsb2NrLWJpbmRpbmdzLnR4dCBmb3IgZGV0YWlscy4KKy0gY2xvY2stbmFtZXM6IE11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGVudHJpZXM6CisJLSAiYWNsayIKKwktICJhY2xrLXBlcmYiCisJLSAiaGNsayIKKwktICJwbSIKKy0gbXNpLW1hcDogTWFwcyBhIFJlcXVlc3RlciBJRCB0byBhbiBNU0kgY29udHJvbGxlciBhbmQgYXNzb2NpYXRlZAorCW1zaS1zcGVjaWZpZXIgZGF0YS4gU2VlIC4vcGNpLW1zaS50eHQKKy0gcGh5czogRnJvbSBQSFkgYmluZGluZ3M6IFBoYW5kbGUgZm9yIHRoZSBHZW5lcmljIFBIWSBmb3IgUENJZS4KKy0gcGh5LW5hbWVzOiAgTVVTVCBiZSAicGNpZS1waHkiLgorLSBpbnRlcnJ1cHRzOiBUaHJlZSBpbnRlcnJ1cHQgZW50cmllcyBtdXN0IGJlIHNwZWNpZmllZC4KKy0gaW50ZXJydXB0LW5hbWVzOiBNdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBuYW1lcworCS0gInN5cyIKKwktICJsZWdhY3kiCisJLSAiY2xpZW50IgorLSByZXNldHM6IE11c3QgY29udGFpbiBmaXZlIGVudHJpZXMgZm9yIGVhY2ggZW50cnkgaW4gcmVzZXQtbmFtZXMuCisJICAgU2VlIC4uL3Jlc2V0L3Jlc2V0LnR4dCBmb3IgZGV0YWlscy4KKy0gcmVzZXQtbmFtZXM6IE11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG5hbWVzCisJLSAiY29yZSIKKwktICJtZ210IgorCS0gIm1nbXQtc3RpY2t5IgorCS0gInBpcGUiCistIHBpbmN0cmwtbmFtZXMgOiBUaGUgcGluIGNvbnRyb2wgc3RhdGUgbmFtZXMKKy0gcGluY3RybC0wOiBUaGUgImRlZmF1bHQiIHBpbmN0cmwgc3RhdGUKKy0gI2ludGVycnVwdC1jZWxsczogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgbmVlZGVkIHRvIGVuY29kZSBhbgorCWludGVycnVwdCBzb3VyY2UuIFRoZSB2YWx1ZSBtdXN0IGJlIDEuCistIGludGVycnVwdC1tYXAtbWFzayBhbmQgaW50ZXJydXB0LW1hcDogc3RhbmRhcmQgUENJIHByb3BlcnRpZXMKKworT3B0aW9uYWwgUHJvcGVydHk6CistIGVwLWdwaW9zOiBjb250YWluIHRoZSBlbnRyeSBmb3IgcHJlLXJlc2V0IGdwaW8KKy0gbnVtLWxhbmVzOiBudW1iZXIgb2YgbGFuZXMgdG8gdXNlCistIHZwY2llM3YzLXN1cHBseTogVGhlIHBoYW5kbGUgdG8gdGhlIDMuM3YgcmVndWxhdG9yIHRvIHVzZSBmb3IgUENJZS4KKy0gdnBjaWUxdjgtc3VwcGx5OiBUaGUgcGhhbmRsZSB0byB0aGUgMS44diByZWd1bGF0b3IgdG8gdXNlIGZvciBQQ0llLgorLSB2cGNpZTB2OS1zdXBwbHk6IFRoZSBwaGFuZGxlIHRvIHRoZSAwLjl2IHJlZ3VsYXRvciB0byB1c2UgZm9yIFBDSWUuCisKKypJbnRlcnJ1cHQgY29udHJvbGxlciBjaGlsZCBub2RlKgorVGhlIGNvcmUgY29udHJvbGxlciBwcm92aWRlcyBhIHNpbmdsZSBpbnRlcnJ1cHQgZm9yIGxlZ2FjeSBJTlR4LiBUaGUgUENJZSBub2RlCitzaG91bGQgY29udGFpbiBhbiBpbnRlcnJ1cHQgY29udHJvbGxlciBub2RlIGFzIGEgdGFyZ2V0IGZvciB0aGUgUENJCisnaW50ZXJydXB0LW1hcCcgcHJvcGVydHkuIFRoaXMgbm9kZSByZXByZXNlbnRzIHRoZSBkb21haW4gYXQgd2hpY2ggdGhlIGZvdXIKK0lOVHggaW50ZXJydXB0cyBhcmUgZGVjb2RlZCBhbmQgcm91dGVkLgorCisKK1JlcXVpcmVkIHByb3BlcnRpZXMgZm9yIEludGVycnVwdCBjb250cm9sbGVyIGNoaWxkIG5vZGU6CistIGludGVycnVwdC1jb250cm9sbGVyOiBpZGVudGlmaWVzIHRoZSBub2RlIGFzIGFuIGludGVycnVwdCBjb250cm9sbGVyCistICNhZGRyZXNzLWNlbGxzOiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjZWxscyBuZWVkZWQgdG8gZW5jb2RlIGFuCisJYWRkcmVzcy4gVGhlIHZhbHVlIG11c3QgYmUgMC4KKy0gI2ludGVycnVwdC1jZWxsczogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgbmVlZGVkIHRvIGVuY29kZSBhbgorCWludGVycnVwdCBzb3VyY2UuIFRoZSB2YWx1ZSBtdXN0IGJlIDEuCisKK0V4YW1wbGU6CisKK3BjaWUwOiBwY2llQGY4MDAwMDAwIHsKKwljb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1wY2llIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwljbG9ja3MgPSA8JmNydSBBQ0xLX1BDSUU+LCA8JmNydSBBQ0xLX1BFUkZfUENJRT4sCisJCSA8JmNydSBQQ0xLX1BDSUU+LCA8JmNydSBTQ0xLX1BDSUVfUE0+OworCWNsb2NrLW5hbWVzID0gImFjbGsiLCAiYWNsay1wZXJmIiwKKwkJICAgICAgImhjbGsiLCAicG0iOworCWJ1cy1yYW5nZSA9IDwweDAgMHgxPjsKKwlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNDkgSVJRX1RZUEVfTEVWRUxfSElHSCAwPiwKKwkJICAgICA8R0lDX1NQSSA1MCBJUlFfVFlQRV9MRVZFTF9ISUdIIDA+LAorCQkgICAgIDxHSUNfU1BJIDUxIElSUV9UWVBFX0xFVkVMX0hJR0ggMD47CisJaW50ZXJydXB0LW5hbWVzID0gInN5cyIsICJsZWdhY3kiLCAiY2xpZW50IjsKKwlhc3NpZ25lZC1jbG9ja3MgPSA8JmNydSBTQ0xLX1BDSUVQSFlfUkVGPjsKKwlhc3NpZ25lZC1jbG9jay1wYXJlbnRzID0gPCZjcnUgU0NMS19QQ0lFUEhZX1JFRjEwME0+OworCWFzc2lnbmVkLWNsb2NrLXJhdGVzID0gPDEwMDAwMDAwMD47CisJZXAtZ3Bpb3MgPSA8JmdwaW8zIDEzIEdQSU9fQUNUSVZFX0hJR0g+OworCXJhbmdlcyA9IDwweDgzMDAwMDAwIDB4MCAweGZhMDAwMDAwIDB4MCAweGZhMDAwMDAwIDB4MCAweDYwMDAwMAorCQkgIDB4ODEwMDAwMDAgMHgwIDB4ZmE2MDAwMDAgMHgwIDB4ZmE2MDAwMDAgMHgwIDB4MTAwMDAwPjsKKwludW0tbGFuZXMgPSA8ND47CisJbXNpLW1hcCA9IDwweDAgJml0cyAweDAgMHgxMDAwPjsKKwlyZWcgPSA8MHgwIDB4ZjgwMDAwMDAgMHgwIDB4MjAwMDAwMD4sIDwweDAgMHhmZDAwMDAwMCAweDAgMHgxMDAwMDAwPjsKKwlyZWctbmFtZXMgPSAiYXhpLWJhc2UiLCAiYXBiLWJhc2UiOworCXJlc2V0cyA9IDwmY3J1IFNSU1RfUENJRV9DT1JFPiwgPCZjcnUgU1JTVF9QQ0lFX01HTVQ+LAorCQkgPCZjcnUgU1JTVF9QQ0lFX01HTVRfU1RJQ0tZPiwgPCZjcnUgU1JTVF9QQ0lFX1BJUEU+OworCXJlc2V0LW5hbWVzID0gImNvcmUiLCAibWdtdCIsICJtZ210LXN0aWNreSIsICJwaXBlIjsKKwlwaHlzID0gPCZwY2llX3BoeT47CisJcGh5LW5hbWVzID0gInBjaWUtcGh5IjsKKwlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCXBpbmN0cmwtMCA9IDwmcGNpZV9jbGtyZXE+OworCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJaW50ZXJydXB0LW1hcC1tYXNrID0gPDAgMCAwIDc+OworCWludGVycnVwdC1tYXAgPSA8MCAwIDAgMSAmcGNpZTBfaW50YyAwPiwKKwkJCTwwIDAgMCAyICZwY2llMF9pbnRjIDE+LAorCQkJPDAgMCAwIDMgJnBjaWUwX2ludGMgMj4sCisJCQk8MCAwIDAgNCAmcGNpZTBfaW50YyAzPjsKKwlwY2llMF9pbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlciB7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kveGlsaW54LW53bC1wY2llLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kveGlsaW54LW53bC1wY2llLnR4dAppbmRleCAzMzdmYzk3Li4zMjU5Nzk4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGNpL3hpbGlueC1ud2wtcGNpZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS94aWxpbngtbndsLXBjaWUudHh0CkBAIC01NSw5ICs1NSwxMCBAQAogCW1zaS1wYXJlbnQgPSA8Jm53bF9wY2llPjsKIAlyZWcgPSA8MHgwIDB4ZmQwZTAwMDAgMHgwIDB4MTAwMD4sCiAJICAgICAgPDB4MCAweGZkNDgwMDAwIDB4MCAweDEwMDA+LAotCSAgICAgIDwweDAgMHhlMDAwMDAwMCAweDAgMHgxMDAwMDAwPjsKKwkgICAgICA8MHg4MCAweDAwMDAwMDAwIDB4MCAweDEwMDAwMDA+OwogCXJlZy1uYW1lcyA9ICJicmVnIiwgInBjaXJlZyIsICJjZmciOwotCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MDAwMDAwMDAgMHhlMTAwMDAwMCAweDAwMDAwMDAwIDB4ZTEwMDAwMDAgMCAweDBmMDAwMDAwPjsKKwlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAwMDAwMDAwIDB4ZTAwMDAwMDAgMHgwMDAwMDAwMCAweGUwMDAwMDAwIDB4MDAwMDAwMDAgMHgxMDAwMDAwMCAgLyogbm9uLXByZWZldGNoYWJsZSBtZW1vcnkgKi8KKwkJICAweDQzMDAwMDAwIDB4MDAwMDAwMDYgMHgwMDAwMDAwMCAweDAwMDAwMDA2IDB4MDAwMDAwMDAgMHgwMDAwMDAwMiAweDAwMDAwMDAwPjsvKiBwcmVmZXRjaGFibGUgbWVtb3J5ICovCiAKIAlwY2llX2ludGM6IGxlZ2FjeS1pbnRlcnJ1cHQtY29udHJvbGxlciB7CiAJCWludGVycnVwdC1jb250cm9sbGVyOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9iY20tbnMtdXNiMy1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9iY20tbnMtdXNiMy1waHkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YWViYTkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L2JjbS1ucy11c2IzLXBoeS50eHQKQEAgLTAsMCArMSwyMyBAQAorRHJpdmVyIGZvciBCcm9hZGNvbSBOb3J0aHN0YXIgVVNCIDMuMCBQSFkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlOiBvbmUgb2Y6ICJicmNtLG5zLWF4LXVzYjMtcGh5IiwgImJyY20sbnMtYngtdXNiMy1waHkiLgorLSByZWc6IHJlZ2lzdGVyIG1hcHBpbmdzIGZvciBETVAgKERldmljZSBNYW5hZ2VtZW50IFBsdWdpbikgYW5kIENoaXBDb21tb24gQgorICAgICAgIE1NSS4KKy0gcmVnLW5hbWVzOiAiZG1wIiBhbmQgImNjYi1taWkiCisKK0luaXRpYWxpemF0aW9uIG9mIFVTQiAzLjAgUEhZIGRlcGVuZHMgb24gTm9ydGhzdGFyIHZlcnNpb24uIFRoZXJlIGFyZSBjdXJyZW50bHkKK3RocmVlIGtub3duIHNlcmllczogQXgsIEJ4IGFuZCBDeC4KK0tub3duIEEwOiBCQ000NzA3IHJldiAwCitLbm93biBCMDogQkNNNDcwNyByZXYgNCwgQkNNNTM1NzMgcmV2IDIKK0tub3duIEIxOiBCQ000NzA3IHJldiA2CitLbm93biBDMDogQkNNNDcwOTQgcmV2IDAKKworRXhhbXBsZToKKwl1c2IzLXBoeSB7CisJCWNvbXBhdGlibGUgPSAiYnJjbSxucy1heC11c2IzLXBoeSI7CisJCXJlZyA9IDwweDE4MTA1MDAwIDB4MTAwMD4sIDwweDE4MDAzMDAwIDB4MTAwMD47CisJCXJlZy1uYW1lcyA9ICJkbXAiLCAiY2NiLW1paSI7CisJCSNwaHktY2VsbHMgPSA8MD47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvbXhzLXVzYi1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9teHMtdXNiLXBoeS50eHQKaW5kZXggMzc5Yjg0YS4uMWQyNWIwNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9teHMtdXNiLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9teHMtdXNiLXBoeS50eHQKQEAgLTEyLDYgKzEyLDE2IEBACiAtIGludGVycnVwdHM6IFNob3VsZCBjb250YWluIHBoeSBpbnRlcnJ1cHQKIC0gZnNsLGFuYXRvcDogcGhhbmRsZSBmb3IgYW5hdG9wIHJlZ2lzdGVyLCBpdCBpcyBvbmx5IGZvciBpbXg2IFNvQyBzZXJpZXMKIAorT3B0aW9uYWwgcHJvcGVydGllczoKKy0gZnNsLHR4LWNhbC00NS1kbi1vaG1zOiBJbnRlZ2VyIFszMC01NV0uIFJlc2lzdGFuY2UgKGluIG9obXMpIG9mIHN3aXRjaGFibGUKKyAgaGlnaC1zcGVlZCB0cmltbWluZyByZXNpc3RvciBjb25uZWN0ZWQgaW4gcGFyYWxsZWwgd2l0aCB0aGUgNDUgb2htIHJlc2lzdG9yCisgIHRoYXQgdGVybWluYXRlcyB0aGUgRE4gb3V0cHV0IHNpZ25hbC4gRGVmYXVsdDogNDUKKy0gZnNsLHR4LWNhbC00NS1kcC1vaG1zOiBJbnRlZ2VyIFszMC01NV0uIFJlc2lzdGFuY2UgKGluIG9obXMpIG9mIHN3aXRjaGFibGUKKyAgaGlnaC1zcGVlZCB0cmltbWluZyByZXNpc3RvciBjb25uZWN0ZWQgaW4gcGFyYWxsZWwgd2l0aCB0aGUgNDUgb2htIHJlc2lzdG9yCisgIHRoYXQgdGVybWluYXRlcyB0aGUgRFAgb3V0cHV0IHNpZ25hbC4gRGVmYXVsdDogNDUKKy0gZnNsLHR4LWQtY2FsOiBJbnRlZ2VyIFs3OS0xMTldLiBDdXJyZW50IHRyaW1taW5nIHZhbHVlIChhcyBhIHBlcmNlbnRhZ2UpIG9mCisgIHRoZSAxNy43OG1BIFRYIHJlZmVyZW5jZSBjdXJyZW50LiBEZWZhdWx0OiAxMDAKKwogRXhhbXBsZToKIHVzYnBoeTE6IHVzYnBoeUAwMjBjOTAwMCB7CiAJY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdXNicGh5IiwgImZzbCxpbXgyMy11c2JwaHkiOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9waHktcm9ja2NoaXAtaW5uby11c2IyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcGh5LXJvY2tjaGlwLWlubm8tdXNiMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyOWM3NwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcGh5LXJvY2tjaGlwLWlubm8tdXNiMi50eHQKQEAgLTAsMCArMSw2NCBAQAorUk9DS0NISVAgVVNCMi4wIFBIWSBXSVRIIElOTk8gSVAgQkxPQ0sKKworUmVxdWlyZWQgcHJvcGVydGllcyAocGh5IChwYXJlbnQpIG5vZGUpOgorIC0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBvbmUgb2YgdGhlIGxpc3RlZCBjb21wYXRpYmxlczoKKwkqICJyb2NrY2hpcCxyazMzNjYtdXNiMnBoeSIKKwkqICJyb2NrY2hpcCxyazMzOTktdXNiMnBoeSIKKyAtIHJlZyA6IHRoZSBhZGRyZXNzIG9mZnNldCBvZiBncmYgZm9yIHVzYi1waHkgY29uZmlndXJhdGlvbi4KKyAtICNjbG9jay1jZWxscyA6IHNob3VsZCBiZSAwLgorIC0gY2xvY2stb3V0cHV0LW5hbWVzIDogc3BlY2lmeSB0aGUgNDgwbSBvdXRwdXQgY2xvY2sgbmFtZS4KKworT3B0aW9uYWwgcHJvcGVydGllczoKKyAtIGNsb2NrcyA6IHBoYW5kbGUgKyBwaHkgc3BlY2lmaWVyIHBhaXIsIGZvciB0aGUgaW5wdXQgY2xvY2sgb2YgcGh5LgorIC0gY2xvY2stbmFtZXMgOiBpbnB1dCBjbG9jayBuYW1lIG9mIHBoeSwgbXVzdCBiZSAicGh5Y2xrIi4KKworUmVxdWlyZWQgbm9kZXMgOiBhIHN1Yi1ub2RlIGlzIHJlcXVpcmVkIGZvciBlYWNoIHBvcnQgdGhlIHBoeSBwcm92aWRlcy4KKwkJIFRoZSBzdWItbm9kZSBuYW1lIGlzIHVzZWQgdG8gaWRlbnRpZnkgaG9zdCBvciBvdGcgcG9ydCwKKwkJIGFuZCBzaGFsbCBiZSB0aGUgZm9sbG93aW5nIGVudHJpZXM6CisJKiAib3RnLXBvcnQiIDogdGhlIG5hbWUgb2Ygb3RnIHBvcnQuCisJKiAiaG9zdC1wb3J0IiA6IHRoZSBuYW1lIG9mIGhvc3QgcG9ydC4KKworUmVxdWlyZWQgcHJvcGVydGllcyAocG9ydCAoY2hpbGQpIG5vZGUpOgorIC0gI3BoeS1jZWxscyA6IG11c3QgYmUgMC4gU2VlIC4vcGh5LWJpbmRpbmdzLnR4dCBmb3IgZGV0YWlscy4KKyAtIGludGVycnVwdHMgOiBzcGVjaWZ5IGFuIGludGVycnVwdCBmb3IgZWFjaCBlbnRyeSBpbiBpbnRlcnJ1cHQtbmFtZXMuCisgLSBpbnRlcnJ1cHQtbmFtZXMgOiBhIGxpc3Qgd2hpY2ggc2hhbGwgYmUgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgorCSogIm90Zy1pZCIgOiBmb3IgdGhlIG90ZyBpZCBpbnRlcnJ1cHQuCisJKiAib3RnLWJ2YWxpZCIgOiBmb3IgdGhlIG90ZyB2YnVzIGludGVycnVwdC4KKwkqICJsaW5lc3RhdGUiIDogZm9yIHRoZSBob3N0L290ZyBsaW5lc3RhdGUgaW50ZXJydXB0LgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gcGh5LXN1cHBseSA6IHBoYW5kbGUgdG8gYSByZWd1bGF0b3IgdGhhdCBwcm92aWRlcyBwb3dlciB0byBWQlVTLgorCQlTZWUgLi9waHktYmluZGluZ3MudHh0IGZvciBkZXRhaWxzLgorCitFeGFtcGxlOgorCitncmY6IHN5c2NvbkBmZjc3MDAwMCB7CisJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzNjYtZ3JmIiwgInN5c2NvbiIsICJzaW1wbGUtbWZkIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworLi4uCisKKwl1MnBoeTogdXNiMi1waHlANzAwIHsKKwkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzNjYtdXNiMnBoeSI7CisJCXJlZyA9IDwweDcwMCAweDJjPjsKKwkJI2Nsb2NrLWNlbGxzID0gPDA+OworCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic2Nsa19vdGdwaHkwXzQ4MG0iOworCisJCXUycGh5X290Zzogb3RnLXBvcnQgeworCQkJI3BoeS1jZWxscyA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8R0lDX1NQSSA5MyBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwkJCQkgICAgIDxHSUNfU1BJIDk0IElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJCSAgICAgPEdJQ19TUEkgOTUgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlpbnRlcnJ1cHQtbmFtZXMgPSAib3RnLWlkIiwgIm90Zy1idmFsaWQiLCAibGluZXN0YXRlIjsKKwkJCXN0YXR1cyA9ICJva2F5IjsKKwkJfTsKKworCQl1MnBoeV9ob3N0OiBob3N0LXBvcnQgeworCQkJI3BoeS1jZWxscyA9IDwwPjsKKwkJCWludGVycnVwdHMgPSA8R0lDX1NQSSA5NiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWludGVycnVwdC1uYW1lcyA9ICJsaW5lc3RhdGUiOworCQkJc3RhdHVzID0gIm9rYXkiOworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9waHktcm9ja2NoaXAtdHlwZWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9waHktcm9ja2NoaXAtdHlwZWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTg2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3BoeS1yb2NrY2hpcC10eXBlYy50eHQKQEAgLTAsMCArMSwxMDEgQEAKKyogUk9DS0NISVAgdHlwZS1jIFBIWQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlIDogbXVzdCBiZSAicm9ja2NoaXAscmszMzk5LXR5cGVjLXBoeSIKKyAtIHJlZzogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSB1c2IgcGh5IGNvbnRyb2wgcmVnaXN0ZXIgc2V0CisgLSByb2NrY2hpcCxncmYgOiBwaGFuZGxlIHRvIHRoZSBzeXNjb24gbWFuYWdpbmcgdGhlICJnZW5lcmFsCisgICByZWdpc3RlciBmaWxlcyIKKyAtIGNsb2NrcyA6IHBoYW5kbGUgKyBjbG9jayBzcGVjaWZpZXIgZm9yIHRoZSBwaHkgY2xvY2tzCisgLSBjbG9jay1uYW1lcyA6IHN0cmluZywgY2xvY2sgbmFtZSwgbXVzdCBiZSAidGNwZGNvcmUiLCAidGNwZHBoeS1yZWYiOworIC0gYXNzaWduZWQtY2xvY2tzOiBtYWluIGNsb2NrLCBzaG91bGQgYmUgPCZjcnUgU0NMS19VUEhZMF9UQ1BEQ09SRT4gb3IKKwkJICAgIDwmY3J1IFNDTEtfVVBIWTFfVENQRENPUkU+OworIC0gYXNzaWduZWQtY2xvY2stcmF0ZXMgOiB0aGUgcGh5IGNvcmUgY2xrIGZyZXF1ZW5jeSwgc2hhbGwgYmU6IDUwMDAwMDAwCisgLSByZXNldHMgOiBhIGxpc3Qgb2YgcGhhbmRsZSArIHJlc2V0IHNwZWNpZmllciBwYWlycworIC0gcmVzZXQtbmFtZXMgOiBzdHJpbmcgcmVzZXQgbmFtZSwgbXVzdCBiZToKKwkJICJ1cGh5IiwgInVwaHktcGlwZSIsICJ1cGh5LXRjcGh5IgorIC0gZXh0Y29uIDogZXh0Y29uIHNwZWNpZmllciBmb3IgdGhlIFBvd2VyIERlbGl2ZXJ5CisKK05vdGUsIHRoZXJlIGFyZSAyIHR5cGUtYyBwaHlzIGZvciBSSzMzOTksIGFuZCB0aGV5IGFyZSBhbG1vc3QgaWRlbnRpY2FsLCBleGNlcHQKK3RoZXNlIHJlZ2lzdGVycyhkZXNjcmlwdGlvbiBiZWxvdyksIGV2ZXJ5IHJlZ2lzdGVyIG5vZGUgY29udGFpbnMgMyBzZWN0aW9uczoKK29mZnNldCwgZW5hYmxlIGJpdCwgd3JpdGUgbWFzayBiaXQuCisgLSByb2NrY2hpcCx0eXBlYy1jb25uLWRpciA6IHRoZSByZWdpc3RlciBvZiB0eXBlLWMgY29ubmVjdG9yIGRpcmVjdGlvbiwKKyAgIGZvciB0eXBlLWMgcGh5MCwgaXQgbXVzdCBiZSA8MHhlNTgwIDAgMTY+OworICAgZm9yIHR5cGUtYyBwaHkxLCBpdCBtdXN0IGJlIDwweGU1OGMgMCAxNj47CisgLSByb2NrY2hpcCx1c2IzdG91c2IyLWVuIDogdGhlIHJlZ2lzdGVyIG9mIHR5cGUtYyBmb3JjZSB1c2IzIHRvIHVzYjIgZW5hYmxlCisgICBjb250cm9sLgorICAgZm9yIHR5cGUtYyBwaHkwLCBpdCBtdXN0IGJlIDwweGU1ODAgMyAxOT47CisgICBmb3IgdHlwZS1jIHBoeTEsIGl0IG11c3QgYmUgPDB4ZTU4YyAzIDE5PjsKKyAtIHJvY2tjaGlwLGV4dGVybmFsLXBzbSA6IHRoZSByZWdpc3RlciBvZiB0eXBlLWMgcGh5IGV4dGVybmFsIHBzbSBjbG9jaworICAgc2VsZWN0aW9uLgorICAgZm9yIHR5cGUtYyBwaHkwLCBpdCBtdXN0IGJlIDwweGU1ODggMTQgMzA+OworICAgZm9yIHR5cGUtYyBwaHkxLCBpdCBtdXN0IGJlIDwweGU1OTQgMTQgMzA+OworIC0gcm9ja2NoaXAscGlwZS1zdGF0dXMgOiB0aGUgcmVnaXN0ZXIgb2YgdHlwZS1jIHBoeSBwaXBlIHN0YXR1cy4KKyAgIGZvciB0eXBlLWMgcGh5MCwgaXQgbXVzdCBiZSA8MHhlNWMwIDAgMD47CisgICBmb3IgdHlwZS1jIHBoeTEsIGl0IG11c3QgYmUgPDB4ZTVjMCAxNiAxNj47CisKK1JlcXVpcmVkIG5vZGVzIDogYSBzdWItbm9kZSBpcyByZXF1aXJlZCBmb3IgZWFjaCBwb3J0IHRoZSBwaHkgcHJvdmlkZXMuCisJCSBUaGUgc3ViLW5vZGUgbmFtZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGRwIG9yIHVzYjMgcG9ydCwKKwkJIGFuZCBzaGFsbCBiZSB0aGUgZm9sbG93aW5nIGVudHJpZXM6CisJKiAiZHAtcG9ydCIgOiB0aGUgbmFtZSBvZiBEUCBwb3J0LgorCSogInVzYjMtcG9ydCIgOiB0aGUgbmFtZSBvZiBVU0IzIHBvcnQuCisKK1JlcXVpcmVkIHByb3BlcnRpZXMgKHBvcnQgKGNoaWxkKSBub2RlKToKKy0gI3BoeS1jZWxscyA6IG11c3QgYmUgMCwgU2VlIC4vcGh5LWJpbmRpbmdzLnR4dCBmb3IgZGV0YWlscy4KKworRXhhbXBsZToKKwl0Y3BoeTA6IHBoeUBmZjdjMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LXR5cGVjLXBoeSI7CisJCXJlZyA9IDwweDAgMHhmZjdjMDAwMCAweDAgMHg0MDAwMD47CisJCXJvY2tjaGlwLGdyZiA9IDwmZ3JmPjsKKwkJZXh0Y29uID0gPCZmdXNiMD47CisJCWNsb2NrcyA9IDwmY3J1IFNDTEtfVVBIWTBfVENQRENPUkU+LAorCQkJIDwmY3J1IFNDTEtfVVBIWTBfVENQRFBIWV9SRUY+OworCQljbG9jay1uYW1lcyA9ICJ0Y3BkY29yZSIsICJ0Y3BkcGh5LXJlZiI7CisJCWFzc2lnbmVkLWNsb2NrcyA9IDwmY3J1IFNDTEtfVVBIWTBfVENQRENPUkU+OworCQlhc3NpZ25lZC1jbG9jay1yYXRlcyA9IDw1MDAwMDAwMD47CisJCXJlc2V0cyA9IDwmY3J1IFNSU1RfVVBIWTA+LAorCQkJIDwmY3J1IFNSU1RfVVBIWTBfUElQRV9MMDA+LAorCQkJIDwmY3J1IFNSU1RfUF9VUEhZMF9UQ1BIWT47CisJCXJlc2V0LW5hbWVzID0gInVwaHkiLCAidXBoeS1waXBlIiwgInVwaHktdGNwaHkiOworCQlyb2NrY2hpcCx0eXBlYy1jb25uLWRpciA9IDwweGU1ODAgMCAxNj47CisJCXJvY2tjaGlwLHVzYjN0b3VzYjItZW4gPSA8MHhlNTgwIDMgMTk+OworCQlyb2NrY2hpcCxleHRlcm5hbC1wc20gPSA8MHhlNTg4IDE0IDMwPjsKKwkJcm9ja2NoaXAscGlwZS1zdGF0dXMgPSA8MHhlNWMwIDAgMD47CisKKwkJdGNwaHkwX2RwOiBkcC1wb3J0IHsKKwkJCSNwaHktY2VsbHMgPSA8MD47CisJCX07CisKKwkJdGNwaHkwX3VzYjM6IHVzYjMtcG9ydCB7CisJCQkjcGh5LWNlbGxzID0gPDA+OworCQl9OworCX07CisKKwl0Y3BoeTE6IHBoeUBmZjgwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LXR5cGVjLXBoeSI7CisJCXJlZyA9IDwweDAgMHhmZjgwMDAwMCAweDAgMHg0MDAwMD47CisJCXJvY2tjaGlwLGdyZiA9IDwmZ3JmPjsKKwkJZXh0Y29uID0gPCZmdXNiMT47CisJCWNsb2NrcyA9IDwmY3J1IFNDTEtfVVBIWTFfVENQRENPUkU+LAorCQkJIDwmY3J1IFNDTEtfVVBIWTFfVENQRFBIWV9SRUY+OworCQljbG9jay1uYW1lcyA9ICJ0Y3BkY29yZSIsICJ0Y3BkcGh5LXJlZiI7CisJCWFzc2lnbmVkLWNsb2NrcyA9IDwmY3J1IFNDTEtfVVBIWTFfVENQRENPUkU+OworCQlhc3NpZ25lZC1jbG9jay1yYXRlcyA9IDw1MDAwMDAwMD47CisJCXJlc2V0cyA9IDwmY3J1IFNSU1RfVVBIWTE+LAorCQkJIDwmY3J1IFNSU1RfVVBIWTFfUElQRV9MMDA+LAorCQkJIDwmY3J1IFNSU1RfUF9VUEhZMV9UQ1BIWT47CisJCXJlc2V0LW5hbWVzID0gInVwaHkiLCAidXBoeS1waXBlIiwgInVwaHktdGNwaHkiOworCQlyb2NrY2hpcCx0eXBlYy1jb25uLWRpciA9IDwweGU1OGMgMCAxNj47CisJCXJvY2tjaGlwLHVzYjN0b3VzYjItZW4gPSA8MHhlNThjIDMgMTk+OworCQlyb2NrY2hpcCxleHRlcm5hbC1wc20gPSA8MHhlNTk0IDE0IDMwPjsKKwkJcm9ja2NoaXAscGlwZS1zdGF0dXMgPSA8MHhlNWMwIDE2IDE2PjsKKworCQl0Y3BoeTFfZHA6IGRwLXBvcnQgeworCQkJI3BoeS1jZWxscyA9IDwwPjsKKwkJfTsKKworCQl0Y3BoeTFfdXNiMzogdXNiMy1wb3J0IHsKKwkJCSNwaHktY2VsbHMgPSA8MD47CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcmNhci1nZW4zLXBoeS11c2IyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcmNhci1nZW4zLXBoeS11c2IyLnR4dAppbmRleCAyMjgxZDZjLi5hY2U5Y2NlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3JjYXItZ2VuMy1waHktdXNiMi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9yY2FyLWdlbjMtcGh5LXVzYjIudHh0CkBAIC02LDYgKzYsOCBAQAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZTogInJlbmVzYXMsdXNiMi1waHktcjhhNzc5NSIgaWYgdGhlIGRldmljZSBpcyBhIHBhcnQgb2YgYW4gUjhBNzc5NQogCSAgICAgIFNvQy4KKwkgICAgICAicmVuZXNhcyx1c2IyLXBoeS1yOGE3Nzk2IiBpZiB0aGUgZGV2aWNlIGlzIGEgcGFydCBvZiBhbiBSOEE3Nzk2CisJICAgICAgU29DLgogCSAgICAgICJyZW5lc2FzLHJjYXItZ2VuMy11c2IyLXBoeSIgZm9yIGEgZ2VuZXJpYyBSLUNhciBHZW4zIGNvbXBhdGlibGUgZGV2aWNlLgogCiAJICAgICAgV2hlbiBjb21wYXRpYmxlIHdpdGggdGhlIGdlbmVyaWMgdmVyc2lvbiwgbm9kZXMgbXVzdCBsaXN0IHRoZQpAQCAtMzAsMTEgKzMyLDExIEBACiAJCWNvbXBhdGlibGUgPSAicmVuZXNhcyx1c2IyLXBoeS1yOGE3Nzk1IiwgInJlbmVzYXMscmNhci1nZW4zLXVzYjItcGh5IjsKIAkJcmVnID0gPDAgMHhlZTA4MDIwMCAwIDB4NzAwPjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDEwOCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKLQkJY2xvY2tzID0gPCZtc3RwN19jbGtzIFI4QTc3OTVfQ0xLX0VIQ0kwPjsKKwkJY2xvY2tzID0gPCZjcGcgQ1BHX01PRCA3MDM+OwogCX07CiAKIAl1c2ItcGh5QGVlMGEwMjAwIHsKIAkJY29tcGF0aWJsZSA9ICJyZW5lc2FzLHVzYjItcGh5LXI4YTc3OTUiLCAicmVuZXNhcyxyY2FyLWdlbjMtdXNiMi1waHkiOwogCQlyZWcgPSA8MCAweGVlMGEwMjAwIDAgMHg3MDA+OwotCQljbG9ja3MgPSA8Jm1zdHA3X2Nsa3MgUjhBNzc5NV9DTEtfRUhDSTA+OworCQljbG9ja3MgPSA8JmNwZyBDUEdfTU9EIDcwMj47CiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAtcGNpZS1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9yb2NrY2hpcC1wY2llLXBoeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2MjIyYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAtcGNpZS1waHkudHh0CkBAIC0wLDAgKzEsMzEgQEAKK1JvY2tjaGlwIFBDSUUgUEhZCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogcm9ja2NoaXAscmszMzk5LXBjaWUtcGh5CisgLSAjcGh5LWNlbGxzOiBtdXN0IGJlIDAKKyAtIGNsb2NrczogTXVzdCBjb250YWluIGFuIGVudHJ5IGluIGNsb2NrLW5hbWVzLgorCVNlZSAuLi9jbG9ja3MvY2xvY2stYmluZGluZ3MudHh0IGZvciBkZXRhaWxzLgorIC0gY2xvY2stbmFtZXM6IE11c3QgYmUgInJlZmNsayIKKyAtIHJlc2V0czogTXVzdCBjb250YWluIGFuIGVudHJ5IGluIHJlc2V0LW5hbWVzLgorCVNlZSAuLi9yZXNldC9yZXNldC50eHQgZm9yIGRldGFpbHMuCisgLSByZXNldC1uYW1lczogTXVzdCBiZSAicGh5IgorCitFeGFtcGxlOgorCitncmY6IHN5c2NvbkBmZjc3MDAwMCB7CisJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZ3JmIiwgInN5c2NvbiIsICJzaW1wbGUtbWZkIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKworCS4uLgorCisJcGNpZV9waHk6IHBjaWUtcGh5IHsKKwkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktcGNpZS1waHkiOworCQkjcGh5LWNlbGxzID0gPDA+OworCQljbG9ja3MgPSA8JmNydSBTQ0xLX1BDSUVQSFlfUkVGPjsKKwkJY2xvY2stbmFtZXMgPSAicmVmY2xrIjsKKwkJcmVzZXRzID0gPCZjcnUgU1JTVF9QQ0lFUEhZPjsKKwkJcmVzZXQtbmFtZXMgPSAicGh5IjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAtdXNiLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3JvY2tjaGlwLXVzYi1waHkudHh0CmluZGV4IGNjNmJlOTYuLjU3ZGMzODggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAtdXNiLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9yb2NrY2hpcC11c2ItcGh5LnR4dApAQCAtMjcsNiArMjcsOSBAQAogLSBjbG9ja3MgOiBwaGFuZGxlICsgY2xvY2sgc3BlY2lmaWVyIGZvciB0aGUgcGh5IGNsb2NrcwogLSBjbG9jay1uYW1lczogc3RyaW5nLCBjbG9jayBuYW1lLCBtdXN0IGJlICJwaHljbGsiCiAtICNjbG9jay1jZWxsczogZm9yIHVzZXJzIG9mIHRoZSBwaHktcGxsLCBzaG91bGQgYmUgMAorLSByZXNldC1uYW1lczogT25seSBhbGxvdyB0aGUgZm9sbG93aW5nIGVudHJpZXM6CisgLSBwaHktcmVzZXQKKy0gcmVzZXRzOiBNdXN0IGNvbnRhaW4gYW4gZW50cnkgZm9yIGVhY2ggZW50cnkgaW4gcmVzZXQtbmFtZXMuCiAKIEV4YW1wbGU6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc3VuNGktdXNiLXBoeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3N1bjRpLXVzYi1waHkudHh0CmluZGV4IDk1NzM2ZDcuLjI4NzE1MGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc3VuNGktdXNiLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zdW40aS11c2ItcGh5LnR4dApAQCAtMTAsNiArMTAsNyBAQAogICAqIGFsbHdpbm5lcixzdW44aS1hMjMtdXNiLXBoeQogICAqIGFsbHdpbm5lcixzdW44aS1hMzMtdXNiLXBoeQogICAqIGFsbHdpbm5lcixzdW44aS1oMy11c2ItcGh5CisgICogYWxsd2lubmVyLHN1bjUwaS1hNjQtdXNiLXBoeQogLSByZWcgOiBhIGxpc3Qgb2Ygb2Zmc2V0ICsgbGVuZ3RoIHBhaXJzCiAtIHJlZy1uYW1lcyA6CiAgICogInBoeV9jdHJsIgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS90aS1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS90aS1waHkudHh0CmluZGV4IGEzYjM5NDUuLmNkMTNlNjE1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3RpLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS90aS1waHkudHh0CkBAIC0zMSw2ICszMSw4IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAgLSBjb21wYXRpYmxlOiBTaG91bGQgYmUgInRpLG9tYXAtdXNiMiIKKwkgICAgICAgU2hvdWxkIGJlICJ0aSxkcmE3eC11c2IyIiBmb3IgdGhlIDFzdCBpbnN0YW5jZSBvZiBVU0IyIFBIWSBvbgorCSAgICAgICBEUkE3eAogCSAgICAgICBTaG91bGQgYmUgInRpLGRyYTd4LXVzYjItcGh5MiIgZm9yIHRoZSAybmQgaW5zdGFuY2Ugb2YgVVNCMiBQSFkKIAkgICAgICAgaW4gRFJBN3gKICAtIHJlZyA6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvYWxsd2lubmVyLHN1bnhpLXBpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvYWxsd2lubmVyLHN1bnhpLXBpbmN0cmwudHh0CmluZGV4IDY5NjE3MjIuLjE2ODU4MjEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL2FsbHdpbm5lcixzdW54aS1waW5jdHJsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9hbGx3aW5uZXIsc3VueGktcGluY3RybC50eHQKQEAgLTIzLDYgKzIzLDcgQEAKICAgImFsbHdpbm5lcixzdW44aS1oMy1waW5jdHJsIgogICAiYWxsd2lubmVyLHN1bjhpLWgzLXItcGluY3RybCIKICAgImFsbHdpbm5lcixzdW41MGktYTY0LXBpbmN0cmwiCisgICJuZXh0dGhpbmcsZ3I4LXBpbmN0cmwiCiAKIC0gcmVnOiBTaG91bGQgY29udGFpbiB0aGUgcmVnaXN0ZXIgcGh5c2ljYWwgYWRkcmVzcyBhbmQgbGVuZ3RoIGZvciB0aGUKICAgcGluIGNvbnRyb2xsZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLWFzcGVlZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLWFzcGVlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2MGFkMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtYXNwZWVkLnR4dApAQCAtMCwwICsxLDY1IEBACitBc3BlZWQgUGluIENvbnRyb2xsZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBBc3BlZWQgU29DcyB2YXJ5IGluIGZ1bmN0aW9uYWxpdHkgaW5zaWRlIGEgZ2VuZXJhdGlvbiBidXQgaGF2ZSBhIGNvbW1vbiBtdXgKK2RldmljZSByZWdpc3RlciBsYXlvdXQuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgYW55IG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCQkiYXNwZWVkLGFzdDI0MDAtcGluY3RybCIKKwkJImFzcGVlZCxnNC1waW5jdHJsIgorCQkiYXNwZWVkLGFzdDI1MDAtcGluY3RybCIKKwkJImFzcGVlZCxnNS1waW5jdHJsIgorCitUaGUgcGluIGNvbnRyb2xsZXIgbm9kZSBzaG91bGQgYmUgYSBjaGlsZCBvZiBhIHN5c2NvbiBub2RlIHdpdGggdGhlIHJlcXVpcmVkCitwcm9wZXJ0eToKKy0gY29tcGF0aWJsZTogInN5c2NvbiIsICJzaW1wbGUtbWZkIgorCitSZWZlciB0byB0aGUgdGhlIGJpbmRpbmdzIGRlc2NyaWJlZCBpbgorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9zeXNjb24udHh0CisKK1N1Ym5vZGUgRm9ybWF0CistLS0tLS0tLS0tLS0tLQorCitUaGUgcmVxdWlyZWQgcHJvcGVydGllcyBvZiBjaGlsZCBub2RlcyBhcmUgKGFzIGRlZmluZWQgaW4gcGluY3RybC1iaW5kaW5ncyk6CistIGZ1bmN0aW9uCistIGdyb3VwcworCitFYWNoIGZ1bmN0aW9uIGhhcyBvbmx5IG9uZSBhc3NvY2lhdGVkIHBpbiBncm91cC4gRWFjaCBncm91cCBpcyBuYW1lZCBieSBpdHMKK2Z1bmN0aW9uLiBUaGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgdGhlIGZ1bmN0aW9uIGFuZCBncm91cHMgcHJvcGVydGllcyBhcmUKK3N1cHBvcnRlZDoKKworYXNwZWVkLGFzdDI0MDAtcGluY3RybCwgYXNwZWVkLGc0LXBpbmN0cmw6CisKK0FDUEkgQk1DSU5UIEREQ0NMSyBERENEQVQgRkxBQ0sgRkxCVVNZIEZMV1AgR1BJRDAgR1BJRTAgR1BJRTIgR1BJRTQgR1BJRTYgSTJDMTAKK0kyQzExIEkyQzEyIEkyQzEzIEkyQzMgSTJDNCBJMkM1IEkyQzYgSTJDNyBJMkM4IEkyQzkgTFBDUEQgTFBDUE1FIExQQ1NNSSBNRElPMQorTURJTzIgTkNUUzEgTkNUUzMgTkNUUzQgTkRDRDEgTkRDRDMgTkRDRDQgTkRTUjEgTkRTUjMgTkRUUjEgTkRUUjMgTlJJMSBOUkkzCitOUkk0IE5SVFMxIE5SVFMzIFBXTTAgUFdNMSBQV00yIFBXTTMgUFdNNCBQV001IFBXTTYgUFdNNyBSR01JSTEgUk1JSTEgUk9NMTYKK1JPTTggUk9NQ1MxIFJPTUNTMiBST01DUzMgUk9NQ1M0IFJYRDEgUlhEMyBSWEQ0IFNEMSBTR1BNSSBTSU9QQkkgU0lPUEJPIFRJTUVSMworVElNRVI1IFRJTUVSNiBUSU1FUjcgVElNRVI4IFRYRDEgVFhEMyBUWEQ0IFVBUlQ2IFZHQUhTIFZHQVZTIFZQSTE4IFZQSTI0IFZQSTMwCitWUE8xMiBWUE8yNAorCithc3BlZWQsYXN0MjUwMC1waW5jdHJsLCBhc3BlZWQsZzUtcGluY3RybDoKKworR1BJRDAgR1BJRDIgR1BJRTAgSTJDMTAgSTJDMTEgSTJDMTIgSTJDMTMgSTJDMTQgSTJDMyBJMkM0IEkyQzUgSTJDNiBJMkM3IEkyQzgKK0kyQzkgTUFDMUxJTksgTURJTzEgTURJTzIgT1NDQ0xLIFBFV0FLRSBQV00wIFBXTTEgUFdNMiBQV00zIFBXTTQgUFdNNSBQV002IFBXTTcKK1JHTUlJMSBSR01JSTIgUk1JSTEgUk1JSTIgU0QxIFNQSTEgVElNRVI0IFRJTUVSNSBUSU1FUjYgVElNRVI3IFRJTUVSOAorCitFeGFtcGxlczoKKworc3lzY29uOiBzY3VAMWU2ZTIwMDAgeworCWNvbXBhdGlibGUgPSAic3lzY29uIiwgInNpbXBsZS1tZmQiOworCXJlZyA9IDwweDFlNmUyMDAwIDB4MWE4PjsKKworCXBpbmN0cmw6IHBpbmN0cmwgeworCQljb21wYXRpYmxlID0gImFzcGVlZCxnNC1waW5jdHJsIjsKKworCQlwaW5jdHJsX2kyYzNfZGVmYXVsdDogaTJjM19kZWZhdWx0IHsKKwkJCWZ1bmN0aW9uID0gIkkyQzMiOworCQkJZ3JvdXBzID0gIkkyQzMiOworCQl9OworCX07Cit9OworCitQbGVhc2UgcmVmZXIgdG8gcGluY3RybC1iaW5kaW5ncy50eHQgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIGRldGFpbHMgb2YgdGhlCitjb21tb24gcGluY3RybCBiaW5kaW5ncyB1c2VkIGJ5IGNsaWVudCBkZXZpY2VzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1zdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dAppbmRleCAyNmJjYjE4Li4wMTNjNjc1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLXN0LnR4dApAQCAtMzAsOCArMzAsNyBAQAogCiBQaW4gY29udHJvbGxlciBub2RlOgogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZQk6IHNob3VsZCBiZSAic3QsPFNPQz4tPHBpby1ibG9jaz4tcGluY3RybCIKLQlsaWtlIHN0LHN0aWg0MTUtc2JjLXBpbmN0cmwsIHN0LHN0aWg0MTUtZnJvbnQtcGluY3RybCBhbmQgc28gb24uCistIGNvbXBhdGlibGUJOiBzaG91bGQgYmUgInN0LHN0aWg0MDctPHBpby1ibG9jaz4tcGluY3RybCIKIC0gc3Qsc3lzY2ZnCQk6IFNob3VsZCBiZSBhIHBoYW5kbGUgb2YgdGhlIHN5c2NmZyBub2RlLgogLSBzdCxyZXRpbWUtcGluLW1hc2sJOiBTaG91bGQgYmUgbWFzayB0byBzcGVjaWZ5IHdoaWNoIHBpbnMgY2FuIGJlIHJldGltZWQuCiAJSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBwcmVzZW50LCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsIHRoZSBwaW5zIGluIHRoZQpAQCAtNTAsNyArNDksMTEgQEAKIEdQSU8gY29udHJvbGxlci9iYW5rIG5vZGUuCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBncGlvLWNvbnRyb2xsZXIgOiBJbmRpY2F0ZXMgdGhpcyBkZXZpY2UgaXMgYSBHUElPIGNvbnRyb2xsZXIKLS0gI2dwaW8tY2VsbHMJICA6IFNob3VsZCBiZSBvbmUuIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBwaW4gbnVtYmVyLgorLSAjZ3Bpby1jZWxscwkgIDogTXVzdCBiZSB0d28uCisgICAgIC0gRmlyc3QgY2VsbDogc3BlY2lmaWVzIHRoZSBwaW4gbnVtYmVyIGluc2lkZSB0aGUgY29udHJvbGxlcgorICAgICAtIFNlY29uZCBjZWxsOiBzcGVjaWZpZXMgd2hldGhlciB0aGUgcGluIGlzIGxvZ2ljYWxseSBpbnZlcnRlZC4KKyAgICAgICAtIDAgPSBhY3RpdmUgaGlnaAorICAgICAgIC0gMSA9IGFjdGl2ZSBsb3cKIC0gc3QsYmFuay1uYW1lCSAgOiBTaG91bGQgYmUgYSBuYW1lIHN0cmluZyBmb3IgdGhpcyBiYW5rIGFzIHNwZWNpZmllZCBpbgogICBkYXRhc2hlZXQuCiAKQEAgLTc2LDIzICs3OSwyMyBAQAogCiBFeGFtcGxlOgogCXBpbi1jb250cm9sbGVyLXNiYyB7Ci0JCSNhZGRyZXNzLWNlbGxzCT0gPDE+OwotCQkjc2l6ZS1jZWxscwk9IDwxPjsKLQkJY29tcGF0aWJsZQk9ICJzdCxzdGloNDE1LXNiYy1waW5jdHJsIjsKLQkJc3Qsc3lzY2ZnCT0gPCZzeXNjZmdfc2JjPjsKLQkJcmVnIAkJPSA8MHhmZTYxZjA4MCAweDQ+OwotCQlyZWctbmFtZXMJPSAiaXJxbXV4IjsKLQkJaW50ZXJydXB0cyAJPSA8R0lDX1NQSSAxODAgSVJRX1RZUEVfTEVWRUxfSElHSD47Ci0JCWludGVycnVwdC1uYW1lcwk9ICJpcnFtdXgiOwotCQlyYW5nZXMgCQk9IDwwIDB4ZmU2MTAwMDAgMHg1MDAwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gInN0LHN0aWg0MDctc2JjLXBpbmN0cmwiOworCQlzdCxzeXNjZmcgPSA8JnN5c2NmZ19zYmM+OworCQlyZWcgPSA8MHgwOTYxZjA4MCAweDQ+OworCQlyZWctbmFtZXMgPSAiaXJxbXV4IjsKKwkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDE4OCBJUlFfVFlQRV9OT05FPjsKKwkJaW50ZXJydXB0LW5hbWVzID0gImlycW11eCI7CisJCXJhbmdlcyA9IDwwIDB4MDk2MTAwMDAgMHg2MDAwPjsKIAotCQlQSU8wOiBncGlvQGZlNjEwMDAwIHsKKwkJcGlvMDogZ3Bpb0AwOTYxMDAwMCB7CiAJCQlncGlvLWNvbnRyb2xsZXI7Ci0JCQkjZ3Bpby1jZWxscwk9IDwxPjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OwogCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQkJcmVnCQk9IDwwIDB4MTAwPjsKLQkJCXN0LGJhbmstbmFtZQk9ICJQSU8wIjsKKwkJCXJlZyA9IDwweDAgMHgxMDA+OworCQkJc3QsYmFuay1uYW1lID0gIlBJTzAiOwogCQl9OwogCQkuLi4KIAkJcGluLWZ1bmN0aW9ucyBub2RlcyBmb2xsb3cuLi4KQEAgLTE2Miw3ICsxNjUsNyBAQAogCiBzZGhjaTA6c2RoY2lAZmU4MTAwMDB7CiAJLi4uCi0JaW50ZXJydXB0LXBhcmVudCA9IDwmUElPMz47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmcGlvMz47CiAJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAlpbnRlcnJ1cHRzID0gPDMgSVJRX1RZUEVfTEVWRUxfSElHSD47IC8qIEludGVycnVwdCBsaW5lIHZpYSBQSU8zLTMgKi8KIAlpbnRlcnJ1cHQtbmFtZXMgPSAiY2FyZC1kZXRlY3QiOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLWdwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLWdwaW8udHh0CmluZGV4IGE1NGMzOWUuLjhkODkzYTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1ncGlvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLHBtaWMtZ3Bpby50eHQKQEAgLTE3LDYgKzE3LDkgQEAKIAkJICAgICJxY29tLHBtODk5NC1ncGlvIgogCQkgICAgInFjb20scG1hODA4NC1ncGlvIgogCisJCSAgICBBbmQgbXVzdCBjb250YWluIGVpdGhlciAicWNvbSxzcG1pLWdwaW8iIG9yICJxY29tLHNzYmktZ3BpbyIKKwkJICAgIGlmIHRoZSBkZXZpY2UgaXMgb24gYW4gc3BtaSBidXMgb3IgYW4gc3NiaSBidXMgcmVzcGVjdGl2ZWx5CisKIC0gcmVnOgogCVVzYWdlOiByZXF1aXJlZAogCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CkBAIC0xODMsNyArMTg2LDcgQEAKIEV4YW1wbGU6CiAKIAlwbTg5MjFfZ3BpbzogZ3Bpb0AxNTAgewotCQljb21wYXRpYmxlID0gInFjb20scG04OTIxLWdwaW8iOworCQljb21wYXRpYmxlID0gInFjb20scG04OTIxLWdwaW8iLCAicWNvbSxzc2JpLWdwaW8iOwogCQlyZWcgPSA8MHgxNTAgMHgxNjA+OwogCQlpbnRlcnJ1cHRzID0gPDE5MiAxPiwgPDE5MyAxPiwgPDE5NCAxPiwKIAkJCSAgICAgPDE5NSAxPiwgPDE5NiAxPiwgPDE5NyAxPiwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1tcHAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLW1wcC50eHQKaW5kZXggYjQ4NGJhMS4uMmFiOTViYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLW1wcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLW1wcC50eHQKQEAgLTE5LDYgKzE5LDkgQEAKIAkJICAgICJxY29tLHBtODk5NC1tcHAiLAogCQkgICAgInFjb20scG1hODA4NC1tcHAiLAogCisJCSAgICBBbmQgbXVzdCBjb250YWluIGVpdGhlciAicWNvbSxzcG1pLW1wcCIgb3IgInFjb20sc3NiaS1tcHAiCisJCSAgICBpZiB0aGUgZGV2aWNlIGlzIG9uIGFuIHNwbWkgYnVzIG9yIGFuIHNzYmkgYnVzIHJlc3BlY3RpdmVseS4KKwogLSByZWc6CiAJVXNhZ2U6IHJlcXVpcmVkCiAJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KQEAgLTE1OCw3ICsxNjEsNyBAQAogRXhhbXBsZToKIAogCW1wcHNAYTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAicWNvbSxwbTg4NDEtbXBwIjsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHBtODg0MS1tcHAiLCAicWNvbSxzcG1pLW1wcCI7CiAJCXJlZyA9IDwweGEwMDA+OwogCQlncGlvLWNvbnRyb2xsZXI7CiAJCSNncGlvLWNlbGxzID0gPDI+OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcmVuZXNhcyxwZmMtcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9yZW5lc2FzLHBmYy1waW5jdHJsLnR4dAppbmRleCBlNGNmMDIyLi4xM2RmOTQ5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9yZW5lc2FzLHBmYy1waW5jdHJsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9yZW5lc2FzLHBmYy1waW5jdHJsLnR4dApAQCAtMTcsOSArMTcsMTEgQEAKICAgICAtICJyZW5lc2FzLHBmYy1yOGE3Nzc5IjogZm9yIFI4QTc3NzkgKFItQ2FyIEgxKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMscGZjLXI4YTc3OTAiOiBmb3IgUjhBNzc5MCAoUi1DYXIgSDIpIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCiAgICAgLSAicmVuZXNhcyxwZmMtcjhhNzc5MSI6IGZvciBSOEE3NzkxIChSLUNhciBNMi1XKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgorICAgIC0gInJlbmVzYXMscGZjLXI4YTc3OTIiOiBmb3IgUjhBNzc5MiAoUi1DYXIgVjJIKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMscGZjLXI4YTc3OTMiOiBmb3IgUjhBNzc5MyAoUi1DYXIgTTItTikgY29tcGF0aWJsZSBwaW4tY29udHJvbGxlci4KICAgICAtICJyZW5lc2FzLHBmYy1yOGE3Nzk0IjogZm9yIFI4QTc3OTQgKFItQ2FyIEUyKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMscGZjLXI4YTc3OTUiOiBmb3IgUjhBNzc5NSAoUi1DYXIgSDMpIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCisgICAgLSAicmVuZXNhcyxwZmMtcjhhNzc5NiI6IGZvciBSOEE3Nzk2IChSLUNhciBNMy1XKSBjb21wYXRpYmxlIHBpbi1jb250cm9sbGVyLgogICAgIC0gInJlbmVzYXMscGZjLXNoNzNhMCI6IGZvciBTSDczQTAgKFNILU1vYmlsZSBBRzUpIGNvbXBhdGlibGUgcGluLWNvbnRyb2xsZXIuCiAKICAgLSByZWc6IEJhc2UgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIGVhY2ggbWVtb3J5IHJlc291cmNlIHVzZWQgYnkgdGhlIHBpbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvc3Qsc3RtMzItcGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9zdCxzdG0zMi1waW5jdHJsLnR4dAppbmRleCA1ODdiZmZiLi5mOTc1M2M0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9zdCxzdG0zMi1waW5jdHJsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9zdCxzdG0zMi1waW5jdHJsLnR4dApAQCAtMTQsNiArMTQsMTEgQEAKICAtICNzaXplLWNlbGxzCTogVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgbXVzdCBiZSAxCiAgLSByYW5nZXMJOiBkZWZpbmVzIG1hcHBpbmcgYmV0d2VlbiBwaW4gY29udHJvbGxlciBub2RlIChwYXJlbnQpIHRvCiAgICBncGlvLWJhbmsgbm9kZSAoY2hpbGRyZW4pLgorIC0gaW50ZXJydXB0LXBhcmVudDogcGhhbmRsZSBvZiB0aGUgaW50ZXJydXB0IHBhcmVudCB0byB3aGljaCB0aGUgZXh0ZXJuYWwKKyAgIEdQSU8gaW50ZXJydXB0cyBhcmUgZm9yd2FyZGVkIHRvLgorIC0gc3Qsc3lzY2ZnOiBTaG91bGQgYmUgcGhhbmRsZS9vZmZzZXQgcGFpci4gVGhlIHBoYW5kbGUgdG8gdGhlIHN5c2NvbiBub2RlCisgICB3aGljaCBpbmNsdWRlcyBJUlEgbXV4IHNlbGVjdGlvbiByZWdpc3RlciwgYW5kIHRoZSBvZmZzZXQgb2YgdGhlIElSUSBtdXgKKyAgIHNlbGVjdGlvbiByZWdpc3Rlci4KICAtIHBpbnMtYXJlLW51bWJlcmVkOiBTcGVjaWZ5IHRoZSBzdWJub2RlcyBhcmUgdXNpbmcgbnVtYmVyZWQgcGlubXV4IHRvCiAgICBzcGVjaWZ5IHBpbnMuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9hY3Q4OTQ1YS1jaGFyZ2VyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9hY3Q4OTQ1YS1jaGFyZ2VyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhMjU0Yy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvYWN0ODk0NWEtY2hhcmdlci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1EZXZpY2UtVHJlZSBiaW5kaW5ncyBmb3IgY2hhcmdlciBvZiBBY3RpdmUtc2VtaSBBQ1Q4OTQ1QSBNdWx0aS1GdW5jdGlvbiBEZXZpY2UKLQotUmVxdWlyZWQgcHJvcGVydGllczoKLSAtIGNvbXBhdGlibGU6ICJhY3RpdmUtc2VtaSxhY3Q4OTQ1YSIsIHBsZWFzZSByZWZlciB0byAuLi9tZmQvYWN0ODk0NWEudHh0LgotIC0gYWN0aXZlLXNlbWksY2hnbGV2LWdwaW9zOiBjaGFyZ2UgY3VycmVudCBsZXZlbCBwaGFuZGxlIHdpdGggYXJncwotICAgYXMgZGVzY3JpYmVkIGluIC4uL2dwaW8vZ3Bpby50eHQuCi0KLU9wdGlvbmFsIHByb3BlcnRpZXM6Ci0gLSBhY3RpdmUtc2VtaSxjaGVjay1iYXR0ZXJ5LXRlbXBlcmF0dXJlOiBib29sZWFuIHRvIGNoZWNrIHRoZSBiYXR0ZXJ5Ci0gICB0ZW1wZXJhdHVyZSBvciBub3QuCi0gLSBhY3RpdmUtc2VtaSxpbnB1dC12b2x0YWdlLXRocmVzaG9sZC1taWNyb3ZvbHQ6IHVuaXQ6IG1WOwotICAgU3BlY2lmaWVzIHRoZSBjaGFyZ2VyJ3MgaW5wdXQgb3Zlci12b2x0YWdlIHRocmVzaG9sZCB2YWx1ZTsKLSAgIFRoZSB2YWx1ZSBjYW4gYmU6IDY2MDAsIDcwMDAsIDc1MDAsIDgwMDA7IGRlZmF1bHQ6IDY2MDAKLSAtIGFjdGl2ZS1zZW1pLHByZWNvbmRpdGlvbi10aW1lb3V0OiB1bml0OiBtaW51dGVzOwotICAgU3BlY2lmaWVzIHRoZSBjaGFyZ2VyJ3MgUFJFQ09ORElUSU9OIHNhZmV0eSB0aW1lciBzZXR0aW5nIHZhbHVlOwotICAgVGhlIHZhbHVlIGNhbiBiZTogNDAsIDYwLCA4MCwgMDsgSWYgMCwgaXQgbWVhbnMgdG8gZGlzYWJsZSB0aGlzIHRpbWVyOwotICAgZGVmYXVsdDogNDAuCi0gLSBhY3RpdmUtc2VtaSx0b3RhbC10aW1lb3V0OiB1bml0OiBob3VyczsKLSAgIFNwZWNpZmllcyB0aGUgY2hhcmdlcidzIHRvdGFsIHNhZmV0eSB0aW1lciBzZXR0aW5nIHZhbHVlOwotICAgVGhlIHZhbHVlIGNhbiBiZTogMywgNCwgNSwgMDsgSWYgMCwgaXQgbWVhbnMgdG8gZGlzYWJsZSB0aGlzIHRpbWVyOwotICAgZGVmYXVsdDogMy4KLQotRXhhbXBsZToKLQlwbWljQDViIHsKLQkJY29tcGF0aWJsZSA9ICJhY3RpdmUtc2VtaSxhY3Q4OTQ1YSI7Ci0JCXJlZyA9IDwweDViPjsKLQkJc3RhdHVzID0gIm9rYXkiOwotCi0JCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7Ci0JCXBpbmN0cmwtMCA9IDwmcGluY3RybF9jaGFyZ2VyX2NoZ2xldj47Ci0JCWFjdGl2ZS1zZW1pLGNoZ2xldi1ncGlvcyA9IDwmcGlvQSAxMiBHUElPX0FDVElWRV9ISUdIPjsKLQkJYWN0aXZlLXNlbWksaW5wdXQtdm9sdGFnZS10aHJlc2hvbGQtbWljcm92b2x0ID0gPDY2MDA+OwotCQlhY3RpdmUtc2VtaSxwcmVjb25kaXRpb24tdGltZW91dCA9IDw0MD47Ci0JCWFjdGl2ZS1zZW1pLHRvdGFsLXRpbWVvdXQgPSA8Mz47Ci0JfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvYXh4aWEtcmVzZXQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Jlc2V0L2F4eGlhLXJlc2V0LnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9heHhpYS1yZXNldC50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC9heHhpYS1yZXNldC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvaW14LXNudnMtcG93ZXJvZmYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Jlc2V0L2lteC1zbnZzLXBvd2Vyb2ZmLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9pbXgtc252cy1wb3dlcm9mZi50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC9pbXgtc252cy1wb3dlcm9mZi50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvbXNtLXBvd2Vyb2ZmLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC9tc20tcG93ZXJvZmYudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L21zbS1wb3dlcm9mZi50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC9tc20tcG93ZXJvZmYudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3FuYXAtcG93ZXJvZmYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Jlc2V0L3FuYXAtcG93ZXJvZmYudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3FuYXAtcG93ZXJvZmYudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcmVzZXQvcW5hcC1wb3dlcm9mZi50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvcmVzdGFydC1wb3dlcm9mZi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcmVzZXQvcmVzdGFydC1wb3dlcm9mZi50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvcmVzdGFydC1wb3dlcm9mZi50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC9yZXN0YXJ0LXBvd2Vyb2ZmLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Jlc2V0L3N0LXJlc2V0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC9zdC1yZXNldC50eHQKaW5kZXggODA5YWY1NC4uODM3MzRkYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Jlc2V0L3N0LXJlc2V0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcmVzZXQvc3QtcmVzZXQudHh0CkBAIC0xLDExICsxLDEyIEBACiAqRGV2aWNlLVRyZWUgYmluZGluZ3MgZm9yIFNUIFNXIHJlc2V0IGZ1bmN0aW9uYWxpdHkKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJzdCw8Y2hpcD4tcmVzdGFydCIuCistIGNvbXBhdGlibGU6IHNob3VsZCBiZSAic3RpaDQwNy1yZXN0YXJ0Ii4KIC0gc3Qsc3lzY2ZnOiBzaG91bGQgYmUgYSBwaGFuZGxlIG9mIHRoZSBzeXNjZmcgbm9kZS4KIAogRXhhbXBsZSBub2RlOgogCXJlc3RhcnQgewotCQljb21wYXRpYmxlID0gInN0LHN0aWg0MTYtcmVzdGFydCI7Ci0JCXN0LHN5c2NmZyA9IDwmc3lzY2ZnX3NiYz47CisJCWNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1yZXN0YXJ0IjsKKwkJc3Qsc3lzY2ZnID0gPCZzeXNjZmdfc2JjX3JlZz47CisJCXN0YXR1cyA9ICJva2F5IjsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9hYjg1MDAvYnRlbXAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9hYjg1MDAvYnRlbXAudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2FiODUwMC9idGVtcC50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYWI4NTAwL2J0ZW1wLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9hYjg1MDAvY2hhcmdhbGcudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9hYjg1MDAvY2hhcmdhbGcudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2FiODUwMC9jaGFyZ2FsZy50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYWI4NTAwL2NoYXJnYWxnLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9hYjg1MDAvY2hhcmdlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2FiODUwMC9jaGFyZ2VyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9hYjg1MDAvY2hhcmdlci50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYWI4NTAwL2NoYXJnZXIudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2FiODUwMC9mZy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2FiODUwMC9mZy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvYWI4NTAwL2ZnLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9hYjg1MDAvZmcudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2FjdDg5NDVhLWNoYXJnZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9hY3Q4OTQ1YS1jaGFyZ2VyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTc4ZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9hY3Q4OTQ1YS1jaGFyZ2VyLnR4dApAQCAtMCwwICsxLDQ4IEBACitEZXZpY2UtVHJlZSBiaW5kaW5ncyBmb3IgY2hhcmdlciBvZiBBY3RpdmUtc2VtaSBBQ1Q4OTQ1QSBNdWx0aS1GdW5jdGlvbiBEZXZpY2UKKworUmVxdWlyZWQgcHJvcGVydGllczoKKyAtIGNvbXBhdGlibGU6ICJhY3RpdmUtc2VtaSxhY3Q4OTQ1YS1jaGFyZ2VyIi4KKyAtIGFjdGl2ZS1zZW1pLGNoZ2xldi1ncGlvczogY2hhcmdlIGN1cnJlbnQgbGV2ZWwgcGhhbmRsZSB3aXRoIGFyZ3MKKyAgIGFzIGRlc2NyaWJlZCBpbiAuLi9ncGlvL2dwaW8udHh0LgorIC0gYWN0aXZlLXNlbWksbGJvLWdwaW9zOiBzcGVjaWZ5IHRoZSBsb3cgYmF0dGVyeSB2b2x0YWdlIGRldGVjdCBwaGFuZGxlCisgICB3aXRoIGFyZ3MgYXMgYXMgZGVzY3JpYmVkIGluIC4uL2dwaW8vZ3Bpby50eHQuCisgLSBpbnRlcnJ1cHRzOiA8YSBiPiB3aGVyZSBhIGlzIHRoZSBpbnRlcnJ1cHQgbnVtYmVyIGFuZCBiIGlzIGEKKyAgIGZpZWxkIHRoYXQgcmVwcmVzZW50cyBhbiBlbmNvZGluZyBvZiB0aGUgc2Vuc2UgYW5kIGxldmVsCisgICBpbmZvcm1hdGlvbiBmb3IgdGhlIGludGVycnVwdC4KKyAtIGludGVycnVwdC1wYXJlbnQ6IHRoZSBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgdGhhdAorICAgc2VydmljZXMgaW50ZXJydXB0cyBmb3IgdGhpcyBkZXZpY2UuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisgLSBhY3RpdmUtc2VtaSxpbnB1dC12b2x0YWdlLXRocmVzaG9sZC1taWNyb3ZvbHQ6IHVuaXQ6IG1WOworICAgU3BlY2lmaWVzIHRoZSBjaGFyZ2VyJ3MgaW5wdXQgb3Zlci12b2x0YWdlIHRocmVzaG9sZCB2YWx1ZTsKKyAgIFRoZSB2YWx1ZSBjYW4gYmU6IDY2MDAsIDcwMDAsIDc1MDAsIDgwMDA7IGRlZmF1bHQ6IDY2MDAKKyAtIGFjdGl2ZS1zZW1pLHByZWNvbmRpdGlvbi10aW1lb3V0OiB1bml0OiBtaW51dGVzOworICAgU3BlY2lmaWVzIHRoZSBjaGFyZ2VyJ3MgUFJFQ09ORElUSU9OIHNhZmV0eSB0aW1lciBzZXR0aW5nIHZhbHVlOworICAgVGhlIHZhbHVlIGNhbiBiZTogNDAsIDYwLCA4MCwgMDsgSWYgMCwgaXQgbWVhbnMgdG8gZGlzYWJsZSB0aGlzIHRpbWVyOworICAgZGVmYXVsdDogNDAuCisgLSBhY3RpdmUtc2VtaSx0b3RhbC10aW1lb3V0OiB1bml0OiBob3VyczsKKyAgIFNwZWNpZmllcyB0aGUgY2hhcmdlcidzIHRvdGFsIHNhZmV0eSB0aW1lciBzZXR0aW5nIHZhbHVlOworICAgVGhlIHZhbHVlIGNhbiBiZTogMywgNCwgNSwgMDsgSWYgMCwgaXQgbWVhbnMgdG8gZGlzYWJsZSB0aGlzIHRpbWVyOworICAgZGVmYXVsdDogMy4KKworRXhhbXBsZToKKwlwbWljQDViIHsKKwkJY29tcGF0aWJsZSA9ICJhY3RpdmUtc2VtaSxhY3Q4OTQ1YSI7CisJCXJlZyA9IDwweDViPjsKKwkJc3RhdHVzID0gIm9rYXkiOworCisJCWNoYXJnZXIgeworCQkJY29tcGF0aWJsZSA9ICJhY3RpdmUtc2VtaSxhY3Q4OTQ1YS1jaGFyZ2VyIjsKKwkJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCQlwaW5jdHJsLTAgPSA8JnBpbmN0cmxfY2hhcmdlcl9jaGdsZXYgJnBpbmN0cmxfY2hhcmdlcl9sYm8gJnBpbmN0cmxfY2hhcmdlcl9pcnE+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcGlvQT47CisJCQlpbnRlcnJ1cHRzID0gPDQ1IEdQSU9fQUNUSVZFX0xPVz47CisKKwkJCWFjdGl2ZS1zZW1pLGNoZ2xldi1ncGlvcyA9IDwmcGlvQSAxMiBHUElPX0FDVElWRV9ISUdIPjsKKwkJCWFjdGl2ZS1zZW1pLGxiby1ncGlvcyA9IDwmcGlvQSA3MiBHUElPX0FDVElWRV9MT1c+OworCQkJYWN0aXZlLXNlbWksaW5wdXQtdm9sdGFnZS10aHJlc2hvbGQtbWljcm92b2x0ID0gPDY2MDA+OworCQkJYWN0aXZlLXNlbWkscHJlY29uZGl0aW9uLXRpbWVvdXQgPSA8NDA+OworCQkJYWN0aXZlLXNlbWksdG90YWwtdGltZW91dCA9IDwzPjsKKwkJCXN0YXR1cyA9ICJva2F5IjsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9heHAyMHhfdXNiX3Bvd2VyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYXhwMjB4X3VzYl9wb3dlci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvYXhwMjB4X3VzYl9wb3dlci50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYXhwMjB4X3VzYl9wb3dlci50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9icTI0MTV4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYnEyNDE1eC50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9icTI0MTV4LnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9icTI0MTV4LnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2JxMjQyNTcudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9icTI0MjU3LnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2JxMjQyNTcudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2JxMjQyNTcudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvYnEyNTg5MC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2JxMjU4OTAudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvYnEyNTg5MC50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvYnEyNTg5MC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvY2hhcmdlci1tYW5hZ2VyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvY2hhcmdlci1tYW5hZ2VyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9jaGFyZ2VyLW1hbmFnZXIudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2NoYXJnZXItbWFuYWdlci50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9kYTkxNTAtY2hhcmdlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2RhOTE1MC1jaGFyZ2VyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2RhOTE1MC1jaGFyZ2VyLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9kYTkxNTAtY2hhcmdlci50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9kYTkxNTAtZmcudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9kYTkxNTAtZmcudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvZGE5MTUwLWZnLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9kYTkxNTAtZmcudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L2dwaW8tY2hhcmdlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2dwaW8tY2hhcmdlci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvZ3Bpby1jaGFyZ2VyLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9ncGlvLWNoYXJnZXIudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvaXNwMTcwNC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2lzcDE3MDQudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvaXNwMTcwNC50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvaXNwMTcwNC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvbHA4NzI3X2NoYXJnZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9scDg3MjdfY2hhcmdlci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvbHA4NzI3X2NoYXJnZXIudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2xwODcyN19jaGFyZ2VyLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2x0YzI5NDEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9sdGMyOTQxLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2x0YzI5NDEudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L2x0YzI5NDEudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L21heDE3MDQyX2JhdHRlcnkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9tYXgxNzA0Ml9iYXR0ZXJ5LnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9tYXgxNzA0Ml9iYXR0ZXJ5LnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9tYXgxNzA0Ml9iYXR0ZXJ5LnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9tYXg4OTI1X2JhdHRlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L21heDg5MjVfYmF0dGVyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9tYXg4OTI1X2JhdHRlci50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvbWF4ODkyNV9iYXR0ZXIudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L29scGNfYmF0dGVyeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L29scGNfYmF0dGVyeS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvb2xwY19iYXR0ZXJ5LnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9vbHBjX2JhdHRlcnkudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3Bvd2VyX3N1cHBseS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3Bvd2VyX3N1cHBseS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvcG93ZXJfc3VwcGx5LnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHkudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcWNvbSxjb2luY2VsbC1jaGFyZ2VyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvcWNvbSxjb2luY2VsbC1jaGFyZ2VyLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Fjb20sY29pbmNlbGwtY2hhcmdlci50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvcWNvbSxjb2luY2VsbC1jaGFyZ2VyLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9xY29tX3NtYmIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS9xY29tX3NtYmIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3Fjb21fc21iYi50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvcWNvbV9zbWJiLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3J0OTQ1NV9jaGFyZ2VyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvcnQ5NDU1X2NoYXJnZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcnQ5NDU1X2NoYXJnZXIudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3J0OTQ1NV9jaGFyZ2VyLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3J4NTEtYmF0dGVyeS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3J4NTEtYmF0dGVyeS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yeDUxLWJhdHRlcnkudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3J4NTEtYmF0dGVyeS50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvc2JzX3Nicy1iYXR0ZXJ5LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvc2JzX3Nicy1iYXR0ZXJ5LnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyX3N1cHBseS9zYnNfc2JzLWJhdHRlcnkudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3Nic19zYnMtYmF0dGVyeS50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvdGksYnEyNDczNS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3RpLGJxMjQ3MzUudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3RpLGJxMjQ3MzUudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3RpLGJxMjQ3MzUudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3RwczY1MDkwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvdHBzNjUwOTAudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3RwczY1MDkwLnR4dApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS90cHM2NTA5MC50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvdHBzNjUyMTdfY2hhcmdlci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3RwczY1MjE3X2NoYXJnZXIudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJfc3VwcGx5L3RwczY1MjE3X2NoYXJnZXIudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5L3RwczY1MjE3X2NoYXJnZXIudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvdHdsLWNoYXJnZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3N1cHBseS90d2wtY2hhcmdlci50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci90d2wtY2hhcmdlci50eHQKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9zdXBwbHkvdHdsLWNoYXJnZXIudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvbWVtLWN0cmxyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9tZW0tY3RybHIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODc4NTZmLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9tZW0tY3RybHIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotRnJlZXNjYWxlIEREUiBtZW1vcnkgY29udHJvbGxlcgotCi1Qcm9wZXJ0aWVzOgotCi0tIGNvbXBhdGlibGUJOiBTaG91bGQgaW5jbHVkZSAiZnNsLGNoaXAtbWVtb3J5LWNvbnRyb2xsZXIiIHdoZXJlCi0JCSAgY2hpcCBpcyB0aGUgcHJvY2Vzc29yIChic2M5MTMyLCBtcGM4NTcyIGV0Yy4pLCBvcgotCQkgICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiLgotLSByZWcJCTogQWRkcmVzcyBhbmQgc2l6ZSBvZiBERFIgY29udHJvbGxlciByZWdpc3RlcnMKLS0gaW50ZXJydXB0cwk6IEVycm9yIGludGVycnVwdCBvZiBERFIgY29udHJvbGxlcgotCi1FeGFtcGxlIDE6Ci0KLQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsYnNjOTEzMi1tZW1vcnktY29udHJvbGxlciI7Ci0JCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgOD47Ci0JfTsKLQotCi1FeGFtcGxlIDI6Ci0KLQlkZHIxOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNyIsCi0JCQkJImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7Ci0JCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OwotCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL2x0YzM2NzYudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9sdGMzNjc2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGViMzY2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9sdGMzNjc2LnR4dApAQCAtMCwwICsxLDk0IEBACitMaW5lYXIgVGVjaG5vbG9neSBMVEMzNjc2IDgtb3V0cHV0IHJlZ3VsYXRvcnMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogImxsdGMsbHRjMzY3NiIKKy0gcmVnOiBJMkMgc2xhdmUgYWRkcmVzcworCitSZXF1aXJlZCBjaGlsZCBub2RlOgorLSByZWd1bGF0b3JzOiBDb250YWlucyBlaWdodCByZWd1bGF0b3IgY2hpbGQgbm9kZXMgc3cxLCBzdzIsIHN3Mywgc3c0LAorICBsZG8xLCBsZG8yLCBsZG8zLCBhbmQgbGRvNCwgc3BlY2lmeWluZyB0aGUgaW5pdGlhbGl6YXRpb24gZGF0YSBhcworICBkb2N1bWVudGVkIGluIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dC4KKworRWFjaCByZWd1bGF0b3IgaXMgZGVmaW5lZCB1c2luZyB0aGUgc3RhbmRhcmQgYmluZGluZyBmb3IgcmVndWxhdG9ycy4gVGhlCitub2RlcyBmb3Igc3cxLCBzdzIsIHN3Mywgc3c0LCBsZG8xLCBsZG8yIGFuZCBsZG80IGFkZGl0aW9uYWxseSBuZWVkIHRvIHNwZWNpZnkKK3RoZSByZXNpc3RvciB2YWx1ZXMgb2YgdGhlaXIgZXh0ZXJuYWwgZmVlZGJhY2sgdm9sdGFnZSBkaXZpZGVyczoKKworUmVxdWlyZWQgcHJvcGVydGllcyAobm90IG9uIGxkbzMpOgorLSBsbHRjLGZiLXZvbHRhZ2UtZGl2aWRlcjogQW4gYXJyYXkgb2YgdHdvIGludGVnZXJzIGNvbnRhaW5pbmcgdGhlIHJlc2lzdG9yCisgIHZhbHVlcyBSMSBhbmQgUjIgb2YgdGhlIGZlZWRiYWNrIHZvbHRhZ2UgZGl2aWRlciBpbiBvaG1zLgorCitSZWd1bGF0b3JzIHN3MSwgc3cyLCBzdzMsIHN3NCBjYW4gcmVndWxhdGUgdGhlIGZlZWRiYWNrIHJlZmVyZW5jZSBmcm9tOgorNDEyLjVtViB0byA4MDBtViBpbiAxMi41IG1WIHN0ZXBzLiBUaGUgb3V0cHV0IHZvbHRhZ2UgdGh1cyByYW5nZXMgYmV0d2VlbgorMC40MTI1ICogKDEgKyBSMS9SMikgViBhbmQgMC44ICogKDEgKyBSMS9SMikgVi4KKworUmVndWxhdG9ycyBsZG8xLCBsZG8yLCBhbmQgbGRvNCBoYXZlIGEgZml4ZWQgMC43MjUgViByZWZlcmVuY2UgYW5kIHRodXMgb3V0cHV0CiswLjcyNSAqICgxICsgUjEvUjIpIFYuIFRoZSBsZG8zIHJlZ3VsYXRvciBpcyBmaXhlZCB0byAxLjggVi4gIFRoZSBsZG8xIHN0YW5kYnkKK3JlZ3VsYXRvciBjYW4gbm90IGJlIGRpc2FibGVkIGFuZCB0aHVzIHNob3VsZCBoYXZlIHRoZSByZWd1bGF0b3ItYWx3YXlzLW9uCitwcm9wZXJ0eSBzZXQuCisKK0V4YW1wbGU6CisKKwlsdGMzNjc2OiBwbWljQDNjIHsKKwkJY29tcGF0aWJsZSA9ICJsbHRjLGx0YzM2NzYiOworCQlyZWcgPSA8MHgzYz47CisKKwkJcmVndWxhdG9ycyB7CisJCQlzdzFfcmVnOiBzdzEgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDY3NDQwMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MTMwODAwMD47CisJCQkJbGx0YyxmYi12b2x0YWdlLWRpdmlkZXIgPSA8MTI3MDAwIDIwMDAwMD47CisJCQkJcmVndWxhdG9yLXJhbXAtZGVsYXkgPSA8NzAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCXN3Ml9yZWc6IHN3MiB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTAzMzMxMD47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MjAwNDAwPjsKKwkJCQlsbHRjLGZiLXZvbHRhZ2UtZGl2aWRlciA9IDwzMDEwMDAgMjAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItcmFtcC1kZWxheSA9IDw3MDAwPjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKworCQkJc3czX3JlZzogc3czIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDw2NzQ0MDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDEzMDgwMD47CisJCQkJbGx0YyxmYi12b2x0YWdlLWRpdmlkZXIgPSA8MTI3MDAwIDIwMDAwMD47CisJCQkJcmVndWxhdG9yLXJhbXAtZGVsYXkgPSA8NzAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCXN3NF9yZWc6IHN3NCB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8ODY4MzEwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxNjg0MDA+OworCQkJCWxsdGMsZmItdm9sdGFnZS1kaXZpZGVyID0gPDIyMTAwMCAyMDAwMDA+OworCQkJCXJlZ3VsYXRvci1yYW1wLWRlbGF5ID0gPDcwMDA+OworCQkJCXJlZ3VsYXRvci1ib290LW9uOworCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQl9OworCisJCQlsZG8yX3JlZzogbGRvMiB7CisJCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MjQ5MDM3NT47CisJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MjQ5MDM3NT47CisJCQkJbGx0YyxmYi12b2x0YWdlLWRpdmlkZXIgPSA8NDg3MDAwIDIwMDAwMD47CisJCQkJcmVndWxhdG9yLWJvb3Qtb247CisJCQkJcmVndWxhdG9yLWFsd2F5cy1vbjsKKwkJCX07CisKKwkJCWxkbzNfcmVnOiBsZG8zIHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxODAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxODAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCX07CisKKwkJCWxkbzRfcmVnOiBsZG80IHsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwzMDIzMjUwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzMDIzMjUwPjsKKwkJCQlsbHRjLGZiLXZvbHRhZ2UtZGl2aWRlciA9IDw2MzQwMDAgMjAwMDAwPjsKKwkJCQlyZWd1bGF0b3ItYm9vdC1vbjsKKwkJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJfTsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9wdjg4MDgwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcHY4ODA4MC50eHQKaW5kZXggMzhhNjE0Mi4uZTZlNGI5YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9wdjg4MDgwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3B2ODgwODAudHh0CkBAIC0xLDIyICsxLDI4IEBACiAqIFBvd2VydmVudHVyZSBTZW1pY29uZHVjdG9yIFBWODgwODAgVm9sdGFnZSBSZWd1bGF0b3IKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogInB2cyxwdjg4MDgwIi4KLS0gcmVnOiBJMkMgc2xhdmUgYWRkcmVzcywgdXN1YWxseSAweDQ5LgorLSBjb21wYXRpYmxlOiBNdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nLCBkZXBlbmRpbmcgb24gdGhlCisgIHNpbGljb24gdmVyc2lvbjoKKwktICJwdnMscHY4ODA4MCIgKERFUFJFQ0FURUQpCisKKwktICJwdnMscHY4ODA4MC1hYSIgZm9yIFBWODgwODAgQUEgb3IgQUIgc2lsaWNvbgorCS0gInB2cyxwdjg4MDgwLWJhIiBmb3IgUFY4ODA4MCBCQSBvciBCQiBzaWxpY29uCisgIE5PVEU6IFRoZSB1c2Ugb2YgdGhlIGNvbXBhdGlibGVzIHdpdGggbm8gc2lsaWNvbiB2ZXJzaW9uIGlzIGRlcHJlY2F0ZWQuCistIHJlZzogSTJDIHNsYXZlIGFkZHJlc3MsIHVzdWFsbHkgMHg0OQogLSBpbnRlcnJ1cHRzOiB0aGUgaW50ZXJydXB0IG91dHB1dHMgb2YgdGhlIGNvbnRyb2xsZXIKIC0gcmVndWxhdG9yczogQSBub2RlIHRoYXQgaG91c2VzIGEgc3ViLW5vZGUgZm9yIGVhY2ggcmVndWxhdG9yIHdpdGhpbiB0aGUKICAgZGV2aWNlLiBFYWNoIHN1Yi1ub2RlIGlzIGlkZW50aWZpZWQgdXNpbmcgdGhlIG5vZGUncyBuYW1lLCB3aXRoIHZhbGlkCiAgIHZhbHVlcyBsaXN0ZWQgYmVsb3cuIFRoZSBjb250ZW50IG9mIGVhY2ggc3ViLW5vZGUgaXMgZGVmaW5lZCBieSB0aGUKICAgc3RhbmRhcmQgYmluZGluZyBmb3IgcmVndWxhdG9yczsgc2VlIHJlZ3VsYXRvci50eHQuCi0gIEJVQ0sxLCBCVUNLMiwgYW5kIEJVQ0szLgorICBCVUNLMSwgQlVDSzIsIEJVQ0szIGFuZCBIVkJVQ0suCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIEFueSBvcHRpb25hbCBwcm9wZXJ0eSBkZWZpbmVkIGluIHJlZ3VsYXRvci50eHQKIAotRXhhbXBsZQorRXhhbXBsZToKIAogCXBtaWM6IHB2ODgwODBANDkgewotCQljb21wYXRpYmxlID0gInB2cyxwdjg4MDgwIjsKKwkJY29tcGF0aWJsZSA9ICJwdnMscHY4ODA4MC1iYSI7CiAJCXJlZyA9IDwweDQ5PjsKIAkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ3Bpbz47CiAJCWludGVycnVwdHMgPSA8MjQgMjQ+OwpAQCAtNDUsNSArNTEsMTIgQEAKIAkJCQlyZWd1bGF0b3ItbWluLW1pY3JvYW1wIAk9IDwxNDk2MDAwPjsKIAkJCQlyZWd1bGF0b3ItbWF4LW1pY3JvYW1wIAk9IDw0MTg5MDAwPjsKIAkJCX07CisKKwkJCUhWQlVDSyB7CisJCQkJcmVndWxhdG9yLW5hbWUgPSAiaHZidWNrIjsKKwkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwgICA1MDAwPjsKKwkJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxMjc1MDAwPjsKKyAJCQl9OwogCQl9OwogCX07CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dAppbmRleCBlY2ZjNTkzLi42YWI1YWVmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0CkBAIC0xMyw3ICsxMyw3IEBACiAtIHJlZ3VsYXRvci1hbGxvdy1ieXBhc3M6IGFsbG93IHRoZSByZWd1bGF0b3IgdG8gZ28gaW50byBieXBhc3MgbW9kZQogLSByZWd1bGF0b3ItYWxsb3ctc2V0LWxvYWQ6IGFsbG93IHRoZSByZWd1bGF0b3IgcGVyZm9ybWFuY2UgbGV2ZWwgdG8gYmUgY29uZmlndXJlZAogLSA8bmFtZT4tc3VwcGx5OiBwaGFuZGxlIHRvIHRoZSBwYXJlbnQgc3VwcGx5L3JlZ3VsYXRvciBub2RlCi0tIHJlZ3VsYXRvci1yYW1wLWRlbGF5OiByYW1wIGRlbGF5IGZvciByZWd1bGF0b3IoaW4gdVYvdVMpCistIHJlZ3VsYXRvci1yYW1wLWRlbGF5OiByYW1wIGRlbGF5IGZvciByZWd1bGF0b3IoaW4gdVYvdXMpCiAgIEZvciBoYXJkd2FyZSB3aGljaCBzdXBwb3J0cyBkaXNhYmxpbmcgcmFtcCByYXRlLCBpdCBzaG91bGQgYmUgZXhwbGljaXRseQogICBpbml0aWFsaXNlZCB0byB6ZXJvIChyZWd1bGF0b3ItcmFtcC1kZWxheSA9IDwwPikgZm9yIGRpc2FibGluZyByYW1wIGRlbGF5LgogLSByZWd1bGF0b3ItZW5hYmxlLXJhbXAtZGVsYXk6IFRoZSB0aW1lIHRha2VuLCBpbiBtaWNyb3NlY29uZHMsIGZvciB0aGUgc3VwcGx5CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVtb3RlcHJvYy9xY29tLHdjbnNzLXBpbC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVtb3RlcHJvYy9xY29tLHdjbnNzLXBpbC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyMzYxZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZW1vdGVwcm9jL3Fjb20sd2Nuc3MtcGlsLnR4dApAQCAtMCwwICsxLDEzMiBAQAorUXVhbGNvbW0gV0NOU1MgUGVyaXBoZXJhbCBJbWFnZSBMb2FkZXIKKworVGhpcyBkb2N1bWVudCBkZWZpbmVzIHRoZSBiaW5kaW5nIGZvciBhIGNvbXBvbmVudCB0aGF0IGxvYWRzIGFuZCBib290cyBmaXJtd2FyZQorb24gdGhlIFF1YWxjb21tIFdDTlNTIGNvcmUuCisKKy0gY29tcGF0aWJsZToKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IG11c3QgYmUgb25lIG9mOgorCQkgICAgInFjb20scml2YS1waWwiLAorCQkgICAgInFjb20scHJvbnRvLXYxLXBpbCIsCisJCSAgICAicWNvbSxwcm9udG8tdjItcGlsIgorCistIHJlZzoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IG11c3Qgc3BlY2lmeSB0aGUgYmFzZSBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSBDQ1UsIERYRSBhbmQKKwkJICAgIFBNVSByZWdpc3RlciBibG9ja3MKKworLSByZWctbmFtZXM6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZ2xpc3Q+CisJRGVmaW5pdGlvbjogbXVzdCBiZSAiY2N1IiwgImR4ZSIsICJwbXUiCisKKy0gaW50ZXJydXB0cy1leHRlbmRlZDoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IG11c3QgbGlzdCB0aGUgd2F0Y2hkb2cgYW5kIGZhdGFsIElSUXMgYW5kIG1heSBzcGVjaWZ5IHRoZQorCQkgICAgcmVhZHksIGhhbmRvdmVyIGFuZCBzdG9wLWFjayBJUlFzCisKKy0gaW50ZXJydXB0LW5hbWVzOgorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxzdHJpbmdsaXN0PgorCURlZmluaXRpb246IHNob3VsZCBiZSAid2RvZyIsICJmYXRhbCIsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgInJlYWR5IiwKKwkJICAgICJoYW5kb3ZlciIsICJzdG9wLWFjayIKKworLSB2ZGRteC1zdXBwbHk6CistIHZkZGN4LXN1cHBseToKKy0gdmRkcHgtc3VwcGx5OgorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwaGFuZGxlPgorCURlZmluaXRpb246IHJlZmVyZW5jZSB0byB0aGUgcmVndWxhdG9ycyB0byBiZSBoZWxkIG9uIGJlaGFsZiBvZiB0aGUKKwkJICAgIGJvb3Rpbmcgb2YgdGhlIFdDTlNTIGNvcmUKKworLSBxY29tLHNtZW0tc3RhdGVzOgorCVVzYWdlOiBvcHRpb25hbAorCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogcmVmZXJlbmNlIHRvIHRoZSBTTUVNIHN0YXRlIHVzZWQgdG8gaW5kaWNhdGUgdG8gV0NOU1MgdGhhdAorCQkgICAgaXQgc2hvdWxkIHNodXQgZG93bgorCistIHFjb20sc21lbS1zdGF0ZS1uYW1lczoKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nbGlzdD4KKwlEZWZpbml0aW9uOiBzaG91bGQgYmUgInN0b3AiCisKKy0gbWVtb3J5LXJlZ2lvbjoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IHJlZmVyZW5jZSB0byByZXNlcnZlZC1tZW1vcnkgbm9kZSBmb3IgdGhlIHJlbW90ZSBwcm9jZXNzb3IKKwkJICAgIHNlZSAuLi9yZXNlcnZlZC1tZW1vcnkvcmVzZXJ2ZWQtbWVtb3J5LnR4dAorCis9IFNVQk5PREVTCitBIHNpbmdsZSBzdWJub2RlIG9mIHRoZSBXQ05TUyBQSUwgZGVzY3JpYmVzIHRoZSBhdHRhY2hlZCByZiBtb2R1bGUgYW5kIGl0cworcmVzb3VyY2UgZGVwZW5kZW5jaWVzLgorCistIGNvbXBhdGlibGU6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBtdXN0IGJlIG9uZSBvZjoKKwkJICAgICJxY29tLHdjbjM2MjAiLAorCQkgICAgInFjb20sd2NuMzY2MCIsCisJCSAgICAicWNvbSx3Y24zNjgwIgorCistIGNsb2NrczoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IHNob3VsZCBzcGVjaWZ5IHRoZSB4byBjbG9jayBhbmQgb3B0aW9uYWxseSB0aGUgcmYgY2xvY2sKKworLSBjbG9jay1uYW1lczoKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nbGlzdD4KKwlEZWZpbml0aW9uOiBzaG91bGQgYmUgInhvIiwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSAicmYiCisKKy0gdmRkeG8tc3VwcGx5OgorLSB2ZGRyZmEtc3VwcGx5OgorLSB2ZGRwYS1zdXBwbHk6CistIHZkZGRpZy1zdXBwbHk6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHBoYW5kbGU+CisJRGVmaW5pdGlvbjogcmVmZXJlbmNlIHRvIHRoZSByZWd1bGF0b3JzIHRvIGJlIGhlbGQgb24gYmVoYWxmIG9mIHRoZQorCQkgICAgYm9vdGluZyBvZiB0aGUgV0NOU1MgY29yZQorCis9IEVYQU1QTEUKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZXNjcmliZXMgdGhlIHJlc291cmNlcyBuZWVkZWQgdG8gYm9vdCBjb250cm9sIHRoZSBXQ05TUywKK3dpdGggYXR0YWNoZWQgV0NOMzY4MCwgYXMgaXQgaXMgY29tbW9ubHkgZm91bmQgb24gTVNNODk3NCBib2FyZHMuCisKK3Byb250b0BmYjIwNDAwMCB7CisJY29tcGF0aWJsZSA9ICJxY29tLHByb250by12Mi1waWwiOworCXJlZyA9IDwweGZiMjA0MDAwIDB4MjAwMD4sIDwweGZiMjAyMDAwIDB4MTAwMD4sIDwweGZiMjFiMDAwIDB4MzAwMD47CisJcmVnLW5hbWVzID0gImNjdSIsICJkeGUiLCAicG11IjsKKworCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmludGMgMCAxNDkgMT4sCisJCQkgICAgICA8JndjbnNzX3NtcDJwX3NsYXZlIDAgMD4sCisJCQkgICAgICA8JndjbnNzX3NtcDJwX3NsYXZlIDEgMD4sCisJCQkgICAgICA8JndjbnNzX3NtcDJwX3NsYXZlIDIgMD4sCisJCQkgICAgICA8JndjbnNzX3NtcDJwX3NsYXZlIDMgMD47CisJaW50ZXJydXB0LW5hbWVzID0gIndkb2ciLCAiZmF0YWwiLCAicmVhZHkiLCAiaGFuZG92ZXIiLCAic3RvcC1hY2siOworCisJdmRkbXgtc3VwcGx5ID0gPCZwbTg4NDFfczE+OworCXZkZGN4LXN1cHBseSA9IDwmcG04ODQxX3MyPjsKKwl2ZGRweC1zdXBwbHkgPSA8JnBtODk0MV9zMz47CisKKwlxY29tLHNtZW0tc3RhdGVzID0gPCZ3Y25zc19zbXAycF9vdXQgMD47CisJcWNvbSxzbWVtLXN0YXRlLW5hbWVzID0gInN0b3AiOworCisJbWVtb3J5LXJlZ2lvbiA9IDwmd2Nuc3NfcmVnaW9uPjsKKworCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJcGluY3RybC0wID0gPCZ3Y25zc19waW5fYT47CisKKwlpcmlzIHsKKwkJY29tcGF0aWJsZSA9ICJxY29tLHdjbjM2ODAiOworCisJCWNsb2NrcyA9IDwmcnBtY2MgUlBNX0NYT19DTEtfU1JDPiwgPCZycG1jYyBSUE1fQ1hPX0EyPjsKKwkJY2xvY2stbmFtZXMgPSAieG8iLCAicmYiOworCisJCXZkZHhvLXN1cHBseSA9IDwmcG04OTQxX2w2PjsKKwkJdmRkcmZhLXN1cHBseSA9IDwmcG04OTQxX2wxMT47CisJCXZkZHBhLXN1cHBseSA9IDwmcG04OTQxX2wxOT47CisJCXZkZGRpZy1zdXBwbHkgPSA8JnBtODk0MV9zMz47CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsLzgyNTAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC84MjUwLnR4dAppbmRleCBmNTU2MWFjLi5mODZiYjA2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VyaWFsLzgyNTAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvODI1MC50eHQKQEAgLTQyLDkgKzQyLDggQEAKIC0gYXV0by1mbG93LWNvbnRyb2w6IG9uZSB3YXkgdG8gZW5hYmxlIGF1dG9tYXRpYyBmbG93IGNvbnRyb2wgc3VwcG9ydC4gVGhlCiAgIGRyaXZlciBpcyBhbGxvd2VkIHRvIGRldGVjdCBzdXBwb3J0IGZvciB0aGUgY2FwYWJpbGl0eSBldmVuIHdpdGhvdXQgdGhpcwogICBwcm9wZXJ0eS4KLS0ge3J0cyxjdHMsZHRyLGRzcixybmcsZGNkfS1ncGlvczogc3BlY2lmeSBhIEdQSU8gZm9yIFJUUy9DVFMvRFRSL0RTUi9SSS9EQ0QKLSAgbGluZSByZXNwZWN0aXZlbHkuIEl0IHdpbGwgdXNlIHNwZWNpZmllZCBHUElPIGluc3RlYWQgb2YgdGhlIHBlcmlwaGVyYWwKLSAgZnVuY3Rpb24gcGluIGZvciB0aGUgVUFSVCBmZWF0dXJlLiBJZiB1bnN1cmUsIGRvbid0IHNwZWNpZnkgdGhpcyBwcm9wZXJ0eS4KKy0gdHgtdGhyZXNob2xkOiBTcGVjaWZ5IHRoZSBUWCBGSUZPIGxvdyB3YXRlciBpbmRpY2F0aW9uIGZvciBwYXJ0cyB3aXRoCisgIHByb2dyYW1tYWJsZSBUWCBGSUZPIHRocmVzaG9sZHMuCiAKIE5vdGU6CiAqIGZzbCxuczE2NTUwOgpAQCAtNjYsMTkgKzY1LDMgQEAKIAkJaW50ZXJydXB0cyA9IDwxMD47CiAJCXJlZy1zaGlmdCA9IDwyPjsKIAl9OwotCi1FeGFtcGxlIGZvciBPTUFQIFVBUlQgdXNpbmcgR1BJTy1iYXNlZCBtb2RlbSBjb250cm9sIHNpZ25hbHM6Ci0KLQl1YXJ0NDogc2VyaWFsQDQ5MDQyMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwMy11YXJ0IjsKLQkJcmVnID0gPDB4NDkwNDIwMDAgMHg0MDA+OwotCQlpbnRlcnJ1cHRzID0gPDgwPjsKLQkJdGksaHdtb2RzID0gInVhcnQ0IjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDQ4MDAwMDAwPjsKLQkJY3RzLWdwaW9zID0gPCZncGlvMyA1IEdQSU9fQUNUSVZFX0xPVz47Ci0JCXJ0cy1ncGlvcyA9IDwmZ3BpbzMgNiBHUElPX0FDVElWRV9MT1c+OwotCQlkdHItZ3Bpb3MgPSA8JmdwaW8xIDEyIEdQSU9fQUNUSVZFX0xPVz47Ci0JCWRzci1ncGlvcyA9IDwmZ3BpbzEgMTMgR1BJT19BQ1RJVkVfTE9XPjsKLQkJZGNkLWdwaW9zID0gPCZncGlvMSAxNCBHUElPX0FDVElWRV9MT1c+OwotCQlybmctZ3Bpb3MgPSA8JmdwaW8xIDE1IEdQSU9fQUNUSVZFX0xPVz47Ci0JfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvc3Qsc3RtMzItdXNhcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NlcmlhbC9zdCxzdG0zMi11c2FydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlYzVmMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZXJpYWwvc3Qsc3RtMzItdXNhcnQudHh0CkBAIC0wLDAgKzEsNDYgQEAKKyogU1RNaWNyb2VsZWN0cm9uaWNzIFNUTTMyIFVTQVJUCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IENhbiBiZSBlaXRoZXIgInN0LHN0bTMyLXVzYXJ0IiwgInN0LHN0bTMyLXVhcnQiLAorInN0LHN0bTMyZjctdXNhcnQiIG9yICJzdCxzdG0zMmY3LXVhcnQiIGRlcGVuZGluZyBvbiB3aGV0aGVyCit0aGUgZGV2aWNlIHN1cHBvcnRzIHN5bmNocm9ub3VzIG1vZGUgYW5kIGlzIGNvbXBhdGlibGUgd2l0aAorc3RtMzIoZjQpIG9yIHN0bTMyZjcuCistIHJlZzogVGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcGVyaXBoZXJhbCByZWdpc3RlcnMgc3BhY2UKKy0gaW50ZXJydXB0czogVGhlIGludGVycnVwdCBsaW5lIG9mIHRoZSBVU0FSVCBpbnN0YW5jZQorLSBjbG9ja3M6IFRoZSBpbnB1dCBjbG9jayBvZiB0aGUgVVNBUlQgaW5zdGFuY2UKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gcGluY3RybDogVGhlIHJlZmVyZW5jZSBvbiB0aGUgcGlucyBjb25maWd1cmF0aW9uCistIHN0LGh3LWZsb3ctY3RybDogYm9vbCBmbGFnIHRvIGVuYWJsZSBoYXJkd2FyZSBmbG93IGNvbnRyb2wuCistIGRtYXM6IHBoYW5kbGUocykgdG8gRE1BIGNvbnRyb2xsZXIgbm9kZShzKS4gUmVmZXIgdG8gc3RtMzItZG1hLnR4dAorLSBkbWEtbmFtZXM6ICJyeCIgYW5kL29yICJ0eCIKKworRXhhbXBsZXM6Cit1c2FydDQ6IHNlcmlhbEA0MDAwNGMwMCB7CisJY29tcGF0aWJsZSA9ICJzdCxzdG0zMi11YXJ0IjsKKwlyZWcgPSA8MHg0MDAwNGMwMCAweDQwMD47CisJaW50ZXJydXB0cyA9IDw1Mj47CisJY2xvY2tzID0gPCZjbGtfcGNsazE+OworCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJcGluY3RybC0wID0gPCZwaW5jdHJsX3VzYXJ0ND47Cit9OworCit1c2FydDI6IHNlcmlhbEA0MDAwNDQwMCB7CisJY29tcGF0aWJsZSA9ICJzdCxzdG0zMi11c2FydCIsICJzdCxzdG0zMi11YXJ0IjsKKwlyZWcgPSA8MHg0MDAwNDQwMCAweDQwMD47CisJaW50ZXJydXB0cyA9IDwzOD47CisJY2xvY2tzID0gPCZjbGtfcGNsazE+OworCXN0LGh3LWZsb3ctY3RybDsKKwlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCXBpbmN0cmwtMCA9IDwmcGluY3RybF91c2FydDIgJnBpbmN0cmxfdXNhcnQyX3J0c2N0cz47Cit9OworCit1c2FydDE6IHNlcmlhbEA0MDAxMTAwMCB7CisJY29tcGF0aWJsZSA9ICJzdCxzdG0zMi11c2FydCIsICJzdCxzdG0zMi11YXJ0IjsKKwlyZWcgPSA8MHg0MDAxMTAwMCAweDQwMD47CisJaW50ZXJydXB0cyA9IDwzNz47CisJY2xvY2tzID0gPCZyY2MgMCAxNjQ+OworCWRtYXMgPSA8JmRtYTIgMiA0IDB4NDE0IDB4MD4sCisJICAgICAgIDwmZG1hMiA3IDQgMHg0MTQgMHgwPjsKKwlkbWEtbmFtZXMgPSAicngiLCAidHgiOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb2MvbWVkaWF0ZWsvYXV4YWRjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb2MvbWVkaWF0ZWsvYXV4YWRjLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiNzgyOS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc29jL21lZGlhdGVrL2F1eGFkYy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NZWRpYVRlayBBVVhBREMKLT09PT09PT09PT09PT09PQotCi1UaGUgQXV4aWxpYXJ5IEFuYWxvZy9EaWdpdGFsIENvbnZlcnRlciAoQVVYQURDKSBpcyBhbiBBREMgZm91bmQKLWluIHNvbWUgTWVkaWF0ZWsgU29DcyB3aGljaCBhbW9uZyBvdGhlciB0aGluZ3MgbWVhc3VyZXMgdGhlIHRlbXBlcmF0dXJlcwotaW4gdGhlIFNvQy4gSXQgY2FuIGJlIHVzZWQgZGlyZWN0bHkgd2l0aCByZWdpc3RlciBhY2Nlc3NlcywgYnV0IGl0IGlzIGFsc28KLXVzZWQgYnkgdGhlcm1hbCBjb250cm9sbGVyIHdoaWNoIHJlYWRzIHRoZSB0ZW1wZXJhdHVyZXMgZnJvbSB0aGUgQVVYQURDCi1kaXJlY3RseSB2aWEgaXRzIG93biBidXMgaW50ZXJmYWNlLiBTZWUKLURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFsL21lZGlhdGVrLXRoZXJtYWwudHh0Ci1mb3IgdGhlIFRoZXJtYWwgQ29udHJvbGxlciB3aGljaCBob2xkcyBhIHBoYW5kbGUgdG8gdGhlIEFVWEFEQy4KLQotUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogTXVzdCBiZSAibWVkaWF0ZWssbXQ4MTczLWF1eGFkYyIKLS0gcmVnOiBBZGRyZXNzIHJhbmdlIG9mIHRoZSBBVVhBREMgdW5pdAotCi1FeGFtcGxlOgotCi1hdXhhZGM6IGF1eGFkY0AxMTAwMTAwMCB7Ci0JY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgxNzMtYXV4YWRjIjsKLQlyZWcgPSA8MCAweDExMDAxMDAwIDAgMHgxMDAwPjsKLX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvbmF1ODgxMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvbmF1ODgxMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4MzBlNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9uYXU4ODEwLnR4dApAQCAtMCwwICsxLDE2IEBACitOQVU4ODEwIGF1ZGlvIENPREVDCisKK1RoaXMgZGV2aWNlIHN1cHBvcnRzIEkyQyBvbmx5LgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJudXZvdG9uLG5hdTg4MTAiCisKKyAgLSByZWcgOiB0aGUgSTJDIGFkZHJlc3Mgb2YgdGhlIGRldmljZS4KKworRXhhbXBsZToKKworY29kZWM6IG5hdTg4MTBAMWEgeworCWNvbXBhdGlibGUgPSAibnV2b3RvbixuYXU4ODEwIjsKKwlyZWcgPSA8MHgxYT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL252aWRpYSx0ZWdyYS1hdWRpby1zZ3RsNTAwMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvbnZpZGlhLHRlZ3JhLWF1ZGlvLXNndGw1MDAwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE3ZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL252aWRpYSx0ZWdyYS1hdWRpby1zZ3RsNTAwMC50eHQKQEAgLTAsMCArMSw0MiBAQAorTlZJRElBIFRlZ3JhIGF1ZGlvIGNvbXBsZXgsIHdpdGggU0dUTDUwMDAgQ09ERUMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJudmlkaWEsdGVncmEtYXVkaW8tc2d0bDUwMDAiCistIGNsb2NrcyA6IE11c3QgY29udGFpbiBhbiBlbnRyeSBmb3IgZWFjaCBlbnRyeSBpbiBjbG9jay1uYW1lcy4KKyAgU2VlIC4uL2Nsb2Nrcy9jbG9jay1iaW5kaW5ncy50eHQgZm9yIGRldGFpbHMuCistIGNsb2NrLW5hbWVzIDogTXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZW50cmllczoKKyAgLSBwbGxfYQorICAtIHBsbF9hX291dDAKKyAgLSBtY2xrIChUaGUgVGVncmEgY2RldjEvZXh0ZXJuMSBjbG9jaywgd2hpY2ggZmVlZHMgdGhlIENPREVDJ3MgbWNsaykKKy0gbnZpZGlhLG1vZGVsIDogVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoaXMgc291bmQgY29tcGxleC4KKy0gbnZpZGlhLGF1ZGlvLXJvdXRpbmcgOiBBIGxpc3Qgb2YgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gYXVkaW8gY29tcG9uZW50cy4KKyAgRWFjaCBlbnRyeSBpcyBhIHBhaXIgb2Ygc3RyaW5ncywgdGhlIGZpcnN0IGJlaW5nIHRoZSBjb25uZWN0aW9uJ3Mgc2luaywKKyAgdGhlIHNlY29uZCBiZWluZyB0aGUgY29ubmVjdGlvbidzIHNvdXJjZS4gVmFsaWQgbmFtZXMgZm9yIHNvdXJjZXMgYW5kCisgIHNpbmtzIGFyZSB0aGUgU0dUTDUwMDAncyBwaW5zIChhcyBkb2N1bWVudGVkIGluIGl0cyBiaW5kaW5nKSwgYW5kIHRoZSBqYWNrcworICBvbiB0aGUgYm9hcmQ6CisKKyAgKiBIZWFkcGhvbmUgSmFjaworICAqIExpbmUgSW4gSmFjaworICAqIE1pYyBKYWNrCisKKy0gbnZpZGlhLGkycy1jb250cm9sbGVyIDogVGhlIHBoYW5kbGUgb2YgdGhlIFRlZ3JhIEkyUyBjb250cm9sbGVyIHRoYXQncworICBjb25uZWN0ZWQgdG8gdGhlIENPREVDLgorLSBudmlkaWEsYXVkaW8tY29kZWMgOiBUaGUgcGhhbmRsZSBvZiB0aGUgU0dUTDUwMDAgYXVkaW8gY29kZWMuCisKK0V4YW1wbGU6CisKK3NvdW5kIHsKKwljb21wYXRpYmxlID0gInRvcmFkZXgsdGVncmEtYXVkaW8tc2d0bDUwMDAtYXBhbGlzX3QzMCIsCisJCSAgICAgIm52aWRpYSx0ZWdyYS1hdWRpby1zZ3RsNTAwMCI7CisJbnZpZGlhLG1vZGVsID0gIlRvcmFkZXggQXBhbGlzIFQzMCI7CisJbnZpZGlhLGF1ZGlvLXJvdXRpbmcgPQorCQkiSGVhZHBob25lIEphY2siLCAiSFBfT1VUIiwKKwkJIkxJTkVfSU4iLCAiTGluZSBJbiBKYWNrIiwKKwkJIk1JQ19JTiIsICJNaWMgSmFjayI7CisJbnZpZGlhLGkycy1jb250cm9sbGVyID0gPCZ0ZWdyYV9pMnMyPjsKKwludmlkaWEsYXVkaW8tY29kZWMgPSA8JnNndGw1MDAwPjsKKwljbG9ja3MgPSA8JnRlZ3JhX2NhciBURUdSQTMwX0NMS19QTExfQT4sCisJCSA8JnRlZ3JhX2NhciBURUdSQTMwX0NMS19QTExfQV9PVVQwPiwKKwkJIDwmdGVncmFfY2FyIFRFR1JBMzBfQ0xLX0VYVEVSTjE+OworCWNsb2NrLW5hbWVzID0gInBsbF9hIiwgInBsbF9hX291dDAiLCAibWNsayI7Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3Fjb20sYXBxODAxNi1zYmMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3Fjb20sYXBxODAxNi1zYmMudHh0CmluZGV4IDQ4MTI5MzYuLmQ5ZDg2MzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9xY29tLGFwcTgwMTYtc2JjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcWNvbSxhcHE4MDE2LXNiYy50eHQKQEAgLTE2LDYgKzE2LDI0IEBACiAJCQkJKiAic3Brci1pb211eCIKIC0gcWNvbSxtb2RlbAkJOiBOYW1lIG9mIHRoZSBzb3VuZCBjYXJkLgogCistIHFjb20sYXVkaW8tcm91dGluZwk6IEEgbGlzdCBvZiB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiBhdWRpbyBjb21wb25lbnRzLgorCQkJICBFYWNoIGVudHJ5IGlzIGEgcGFpciBvZiBzdHJpbmdzLCB0aGUgZmlyc3QgYmVpbmcgdGhlCisJCQkgIGNvbm5lY3Rpb24ncyBzaW5rLCB0aGUgc2Vjb25kIGJlaW5nIHRoZSBjb25uZWN0aW9uJ3MKKwkJCSAgc291cmNlLiBWYWxpZCBuYW1lcyBjb3VsZCBiZSBwb3dlciBzdXBwbGllcywgTWljQmlhcworCQkJICBvZiBtc204eDE2X3djZCBjb2RlYyBhbmQgdGhlIGphY2tzIG9uIHRoZSBib2FyZDoKKworCQkJICBQb3dlciBzdXBwbGllczoKKwkJCSAgKiBNSUMgQklBUyBFeHRlcm5hbDEKKwkJCSAgKiBNSUMgQklBUyBFeHRlcm5hbDIKKwkJCSAgKiBNSUMgQklBUyBJbnRlcm5hbDEKKwkJCSAgKiBNSUMgQklBUyBJbnRlcm5hbDIKKworCQkJICBCb2FyZCBjb25uZWN0b3JzOgorCQkJICAqIEhlYWRzZXQgTWljCisJCQkgICogU2Vjb25kYXJ5IE1pYyIsCisJCQkgICogRE1JQworCQkJICAqIEV4dCBTcGsKKwogRGFpLWxpbmsgc3Vibm9kZSBwcm9wZXJ0aWVzIGFuZCBzdWJub2RlczoKIAogUmVxdWlyZWQgZGFpLWxpbmsgc3Vibm9kZXM6CkBAIC0zNyw2ICs1NSwxOCBAQAogCXJlZy1uYW1lcyA9ICJtaWMtaW9tdXgiLCAic3Brci1pb211eCI7CiAJcWNvbSxtb2RlbCA9ICJEQjQxMGMiOwogCisJcWNvbSxhdWRpby1yb3V0aW5nID0KKwkJIk1JQyBCSUFTIEV4dGVybmFsMSIsICJIYW5kc2V0IE1pYyIsCisJCSJNSUMgQklBUyBJbnRlcm5hbDIiLCAiSGVhZHNldCBNaWMiLAorCQkiTUlDIEJJQVMgRXh0ZXJuYWwxIiwgIlNlY29uZGFyeSBNaWMiLAorCQkiQU1JQzEiLCAiTUlDIEJJQVMgRXh0ZXJuYWwxIiwKKwkJIkFNSUMyIiwgIk1JQyBCSUFTIEludGVybmFsMiIsCisJCSJBTUlDMyIsICJNSUMgQklBUyBFeHRlcm5hbDEiLAorCQkiRE1JQzEiLCAiTUlDIEJJQVMgSW50ZXJuYWwxIiwKKwkJIk1JQyBCSUFTIEludGVybmFsMSIsICJEaWdpdGFsIE1pYzEiLAorCQkiRE1JQzIiLCAiTUlDIEJJQVMgSW50ZXJuYWwxIiwKKwkJIk1JQyBCSUFTIEludGVybmFsMSIsICJEaWdpdGFsIE1pYzIiOworCiAJLyogSTJTIC0gSW50ZXJuYWwgY29kZWMgKi8KIAlpbnRlcm5hbC1kYWktbGlua0AwIHsKIAkJY3B1IHsgLyogUFJJTUFSWSAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JlbmVzYXMscnNyYy1jYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yZW5lc2FzLHJzcmMtY2FyZC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NWVjZTMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JlbmVzYXMscnNyYy1jYXJkLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLVJlbmVzYXMgU2FtcGxpbmcgUmF0ZSBDb252ZXJ0IFNvdW5kIENhcmQ6Ci0KLVJlbmVzYXMgU2FtcGxpbmcgUmF0ZSBDb252ZXJ0IFNvdW5kIENhcmQgc3BlY2lmaWVzIGF1ZGlvIERBSSBjb25uZWN0aW9ucyBvZiBTb0MgPC0+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+OwogCiBUaGVuIGl0IHNob3VsZCBiZSBjb25maWd1cmVkIHNvIHRoYXQgbnVtX2NoaXBzZWxlY3QgPSA0IHdpdGggdGhlCiBmb2xsb3dpbmcgbWFwcGluZzoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLW1lc29uLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLW1lc29uLnR4dAppbmRleCBiYjUyYTg2Li5kYzZkMDMxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1tZXNvbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktbWVzb24udHh0CkBAIC03LDcgKzcsNyBAQAogcmVjZWl2ZSBidWZmZXIuCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgImFtbG9naWMsbWVzb242LXNwaWZjIgorIC0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJhbWxvZ2ljLG1lc29uNi1zcGlmYyIgb3IgImFtbG9naWMsbWVzb24tZ3hiYi1zcGlmYyIKICAtIHJlZzogcGh5c2ljYWwgYmFzZSBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCiAgLSBjbG9ja3M6IHBoYW5kbGUgb2YgdGhlIGlucHV0IGNsb2NrIGZvciB0aGUgYmF1ZCByYXRlIGdlbmVyYXRvcgogIC0gI2FkZHJlc3MtY2VsbHM6IHNob3VsZCBiZSAxCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvbW94YSxtb3hhcnQtdGltZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL21veGEsbW94YXJ0LXRpbWVyLnR4dAppbmRleCBkYTJkNTEwLi5lMjA3YzExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvbW94YSxtb3hhcnQtdGltZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci9tb3hhLG1veGFydC10aW1lci50eHQKQEAgLTIsNyArMiw5IEBACiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAKLS0gY29tcGF0aWJsZSA6IE11c3QgYmUgIm1veGEsbW94YXJ0LXRpbWVyIgorLSBjb21wYXRpYmxlIDogTXVzdCBiZSBvbmUgb2Y6CisgCS0gIm1veGEsbW94YXJ0LXRpbWVyIgorIAktICJhc3BlZWQsYXN0MjQwMC10aW1lciIKIC0gcmVnIDogU2hvdWxkIGNvbnRhaW4gcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKIC0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIHRoZSB0aW1lciBpbnRlcnJ1cHQgbnVtYmVyCiAtIGNsb2NrcyA6IFNob3VsZCBjb250YWluIHBoYW5kbGUgZm9yIHRoZSBjbG9jayB0aGF0IGRyaXZlcyB0aGUgY291bnRlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL294c2VtaSxycHMtdGltZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RpbWVyL294c2VtaSxycHMtdGltZXIudHh0CmluZGV4IDNjYTg5Y2QuLmQxOTE2MTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aW1lci9veHNlbWkscnBzLXRpbWVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGltZXIvb3hzZW1pLHJwcy10aW1lci50eHQKQEAgLTIsNyArMiw3IEBACiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJveHNlbWksb3g4MTBzZS1ycHMtdGltZXIiCistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAib3hzZW1pLG94ODEwc2UtcnBzLXRpbWVyIiBvciAib3hzZW1pLG94ODIwLXJwcy10aW1lciIKIC0gcmVnIDogU3BlY2lmaWVzIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBhbmQgc2l6ZSBvZiB0aGUgcmVnaXN0ZXJzLgogLSBpbnRlcnJ1cHRzIDogVGhlIGludGVycnVwdHMgb2YgdGhlIHR3byB0aW1lcnMKIC0gY2xvY2tzIDogVGhlIHBoYW5kbGUgb2YgdGhlIHRpbWVyIGNsb2NrIHNvdXJjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLXVzYjIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9jaS1oZHJjLXVzYjIudHh0CmluZGV4IDM0MWRjNjcuLjBlMDMzNDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvY2ktaGRyYy11c2IyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2NpLWhkcmMtdXNiMi50eHQKQEAgLTgxLDYgKzgxLDggQEAKIC0gZnNsLHVzYm1pc2M6IHBoYW5kbGVyIG9mIG5vbi1jb3JlIHJlZ2lzdGVyIGRldmljZSwgd2l0aCBvbmUKICAgYXJndW1lbnQgdGhhdCBpbmRpY2F0ZSB1c2IgY29udHJvbGxlciBpbmRleAogLSBkaXNhYmxlLW92ZXItY3VycmVudDogZGlzYWJsZSBvdmVyIGN1cnJlbnQgZGV0ZWN0CistIG92ZXItY3VycmVudC1hY3RpdmUtaGlnaDogb3ZlciBjdXJyZW50IHNpZ25hbCBwb2xhcml0eSBpcyBoaWdoIGFjdGl2ZSwKKyAgdHlwaWNhbGx5IG92ZXIgY3VycmVudCBzaWduYWwgcG9sYXJpdHkgaXMgbG93IGFjdGl2ZS4KIC0gZXh0ZXJuYWwtdmJ1cy1kaXZpZGVyOiBlbmFibGVzIG9mZi1jaGlwIHJlc2lzdG9yIGRpdmlkZXIgZm9yIFZidXMKIAogRXhhbXBsZToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzIudHh0CmluZGV4IDIwYTY4YmYuLjdkMTZlYmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MyLnR4dApAQCAtMjYsNyArMjYsMTAgQEAKIC0gZy11c2UtZG1hOiBlbmFibGUgZG1hIHVzYWdlIGluIGdhZGdldCBkcml2ZXIuCiAtIGctcngtZmlmby1zaXplOiBzaXplIG9mIHJ4IGZpZm8gc2l6ZSBpbiBnYWRnZXQgbW9kZS4KIC0gZy1ucC10eC1maWZvLXNpemU6IHNpemUgb2Ygbm9uLXBlcmlvZGljIHR4IGZpZm8gc2l6ZSBpbiBnYWRnZXQgbW9kZS4KLS0gZy10eC1maWZvLXNpemU6IHNpemUgb2YgcGVyaW9kaWMgdHggZmlmbyBwZXIgZW5kcG9pbnQgKGV4Y2VwdCBlcDApIGluIGdhZGdldCBtb2RlLgorCitEZXByZWNhdGVkIHByb3BlcnRpZXM6CistIGctdHgtZmlmby1zaXplOiBzaXplIG9mIHBlcmlvZGljIHR4IGZpZm8gcGVyIGVuZHBvaW50IChleGNlcHQgZXAwKQorICBpbiBnYWRnZXQgbW9kZS4KIAogRXhhbXBsZToKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLWNhdml1bS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMtY2F2aXVtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBiNzgyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLWNhdml1bS50eHQKQEAgLTAsMCArMSwyOCBAQAorQ2F2aXVtIFN1cGVyU3BlZWQgRFdDMyBVU0IgU29DIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZToJU2hvdWxkIGNvbnRhaW4gImNhdml1bSxvY3Rlb24tNzEzMC11c2ItdWN0bCIKKworUmVxdWlyZWQgY2hpbGQgbm9kZToKK0EgY2hpbGQgbm9kZSBtdXN0IGV4aXN0IHRvIHJlcHJlc2VudCB0aGUgY29yZSBEV0MzIElQIGJsb2NrLiBUaGUgbmFtZSBvZgordGhlIG5vZGUgaXMgbm90IGltcG9ydGFudC4gVGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUgaXMgZGVmaW5lZCBpbiBkd2MzLnR4dC4KKworRXhhbXBsZSBkZXZpY2Ugbm9kZToKKworCQkgICAgdWN0bEAxMTgwMDY5MDAwMDAwIHsKKwkJCSAgICBjb21wYXRpYmxlID0gImNhdml1bSxvY3Rlb24tNzEzMC11c2ItdWN0bCI7CisJCQkgICAgcmVnID0gPDB4MDAwMTE4MDAgMHg2OTAwMDAwMCAweDAwMDAwMDAwIDB4MDAwMDAxMDA+OworCQkJICAgIHJhbmdlczsKKwkJCSAgICAjYWRkcmVzcy1jZWxscyA9IDwweDAwMDAwMDAyPjsKKwkJCSAgICAjc2l6ZS1jZWxscyA9IDwweDAwMDAwMDAyPjsKKwkJCSAgICByZWZjbGstZnJlcXVlbmN5ID0gPDB4MDVmNWUxMDA+OworCQkJICAgIHJlZmNsay10eXBlLXNzID0gImRsbWNfcmVmX2NsazAiOworCQkJICAgIHJlZmNsay10eXBlLWhzID0gImRsbWNfcmVmX2NsazAiOworCQkJICAgIHBvd2VyID0gPDB4MDAwMDAwMDIgMHgwMDAwMDAwMiAweDAwMDAwMDAxPjsKKwkJCSAgICB4aGNpQDE2OTAwMDAwMDAwMDAgeworCQkJCSAgICBjb21wYXRpYmxlID0gImNhdml1bSxvY3Rlb24tNzEzMC14aGNpIiwgInN5bm9wc3lzLGR3YzMiOworCQkJCSAgICByZWcgPSA8MHgwMDAxNjkwMCAweDAwMDAwMDAwIDB4MDAwMDAwMTAgMHgwMDAwMDAwMD47CisJCQkJICAgIGludGVycnVwdC1wYXJlbnQgPSA8MHgwMDAwMDAxMD47CisJCQkJICAgIGludGVycnVwdHMgPSA8MHgwMDAwMDAwOSAweDAwMDAwMDA0PjsKKwkJCSAgICB9OworCQkgICAgfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0CmluZGV4IDdkN2NlMDguLmUzZTY5ODMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dApAQCAtMTMsNyArMTMsOCBAQAogICAgaW4gdGhlIGFycmF5IGlzIGV4cGVjdGVkIHRvIGJlIGEgaGFuZGxlIHRvIHRoZSBVU0IyL0hTIFBIWSBhbmQKICAgIHRoZSBzZWNvbmQgZWxlbWVudCBpcyBleHBlY3RlZCB0byBiZSBhIGhhbmRsZSB0byB0aGUgVVNCMy9TUyBQSFkKICAtIHBoeXM6IGZyb20gdGhlICpHZW5lcmljIFBIWSogYmluZGluZ3MKLSAtIHBoeS1uYW1lczogZnJvbSB0aGUgKkdlbmVyaWMgUEhZKiBiaW5kaW5ncworIC0gcGh5LW5hbWVzOiBmcm9tIHRoZSAqR2VuZXJpYyBQSFkqIGJpbmRpbmdzOyBzdXBwb3J0ZWQgbmFtZXMgYXJlICJ1c2IyLXBoeSIKKwlvciAidXNiMy1waHkiLgogIC0gc25wcyx1c2IzX2xwbV9jYXBhYmxlOiBkZXRlcm1pbmVzIGlmIHBsYXRmb3JtIGlzIFVTQjMgTFBNIGNhcGFibGUKICAtIHNucHMsZGlzYWJsZV9zY3JhbWJsZV9xdWlyazogdHJ1ZSB3aGVuIFNXIHNob3VsZCBkaXNhYmxlIGRhdGEgc2NyYW1ibGluZy4KIAlPbmx5IHJlYWxseSB1c2VmdWwgZm9yIEZQR0EgYnVpbGRzLgpAQCAtMzksNiArNDAsMTEgQEAKIAkJCWRpc2FibGluZyB0aGUgc3VzcGVuZCBzaWduYWwgdG8gdGhlIFBIWS4KICAtIHNucHMsZGlzX3J4ZGV0X2lucDNfcXVpcms6IHdoZW4gc2V0IGNvcmUgd2lsbCBkaXNhYmxlIHJlY2VpdmVyIGRldGVjdGlvbgogCQkJaW4gUEhZIFAzIHBvd2VyIHN0YXRlLgorIC0gc25wcyxkaXMtdTItZnJlZWNsay1leGlzdHMtcXVpcms6IHdoZW4gc2V0LCBjbGVhciB0aGUgdTJfZnJlZWNsa19leGlzdHMKKwkJCWluIEdVU0IyUEhZQ0ZHLCBzcGVjaWZ5IHRoYXQgVVNCMiBQSFkgZG9lc24ndCBwcm92aWRlCisJCQlhIGZyZWUtcnVubmluZyBQSFkgY2xvY2suCisgLSBzbnBzLGRpcy1kZWwtcGh5LXBvd2VyLWNoZy1xdWlyazogd2hlbiBzZXQgY29yZSB3aWxsIGNoYW5nZSBQSFkgcG93ZXIKKwkJCWZyb20gUDAgdG8gUDEvUDIvUDMgd2l0aG91dCBkZWxheS4KICAtIHNucHMsaXMtdXRtaS1sMS1zdXNwZW5kOiB0cnVlIHdoZW4gRFdDMyBhc3NlcnRzIG91dHB1dCBzaWduYWwKIAkJCXV0bWlfbDFfc3VzcGVuZF9uLCBmYWxzZSB3aGVuIGFzc2VydHMgdXRtaV9zbGVlcF9uCiAgLSBzbnBzLGhpcmQtdGhyZXNob2xkOiBISVJEIHRocmVzaG9sZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9nZW5lcmljLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZ2VuZXJpYy50eHQKaW5kZXggYmJhODI1Ny4uYmZhZGViMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9nZW5lcmljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2dlbmVyaWMudHh0CkBAIC0xMSw2ICsxMSwxMSBAQAogCQkJInBlcmlwaGVyYWwiIGFuZCAib3RnIi4gSW4gY2FzZSB0aGlzIGF0dHJpYnV0ZSBpc24ndAogCQkJcGFzc2VkIHZpYSBEVCwgVVNCIERSRCBjb250cm9sbGVycyBzaG91bGQgZGVmYXVsdCB0bwogCQkJT1RHLgorIC0gcGh5X3R5cGU6IHRlbGxzIFVTQiBjb250cm9sbGVycyB0aGF0IHdlIHdhbnQgdG8gY29uZmlndXJlIHRoZSBjb3JlIHRvIHN1cHBvcnQKKwkJCWEgVVRNSSsgUEhZIHdpdGggYW4gOC0gb3IgMTYtYml0IGludGVyZmFjZSBpZiBVVE1JKyBpcworCQkJc2VsZWN0ZWQuIFZhbGlkIGFyZ3VtZW50cyBhcmUgInV0bWkiIGFuZCAidXRtaV93aWRlIi4KKwkJCUluIGNhc2UgdGhpcyBpc24ndCBwYXNzZWQgdmlhIERULCBVU0IgY29udHJvbGxlcnMgc2hvdWxkCisJCQlkZWZhdWx0IHRvIEhXIGNhcGFiaWxpdHkuCiAgLSBvdGctcmV2OiB0ZWxscyB1c2IgZHJpdmVyIHRoZSByZWxlYXNlIG51bWJlciBvZiB0aGUgT1RHIGFuZCBFSCBzdXBwbGVtZW50CiAJCQl3aXRoIHdoaWNoIHRoZSBkZXZpY2UgYW5kIGl0cyBkZXNjcmlwdG9ycyBhcmUgY29tcGxpYW50LAogCQkJaW4gYmluYXJ5LWNvZGVkIGRlY2ltYWwgKGkuZS4gMi4wIGlzIDAyMDBIKS4gVGhpcwpAQCAtMzQsNiArMzksNyBAQAogCXVzYi1waHkgPSA8JnVzYjJfcGh5PiwgPCZ1c2IzLHBoeT47CiAJbWF4aW11bS1zcGVlZCA9ICJzdXBlci1zcGVlZCI7CiAJZHJfbW9kZSA9ICJvdGciOworCXBoeV90eXBlID0gInV0bWlfd2lkZSI7CiAJb3RnLXJldiA9IDwweDAyMDA+OwogCWFkcC1kaXNhYmxlOwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvcmVuZXNhc191c2Jocy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3JlbmVzYXNfdXNiaHMudHh0CmluZGV4IGI2MDQwNTYuLjllMThlMDAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvcmVuZXNhc191c2Jocy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9yZW5lc2FzX3VzYmhzLnR4dApAQCAtOSw2ICs5LDcgQEAKIAktICJyZW5lc2FzLHVzYmhzLXI4YTc3OTMiIGZvciByOGE3NzkzIChSLUNhciBNMi1OKSBjb21wYXRpYmxlIGRldmljZQogCS0gInJlbmVzYXMsdXNiaHMtcjhhNzc5NCIgZm9yIHI4YTc3OTQgKFItQ2FyIEUyKSBjb21wYXRpYmxlIGRldmljZQogCS0gInJlbmVzYXMsdXNiaHMtcjhhNzc5NSIgZm9yIHI4YTc3OTUgKFItQ2FyIEgzKSBjb21wYXRpYmxlIGRldmljZQorCS0gInJlbmVzYXMsdXNiaHMtcjhhNzc5NiIgZm9yIHI4YTc3OTYgKFItQ2FyIE0zLVcpIGNvbXBhdGlibGUgZGV2aWNlCiAJLSAicmVuZXNhcyxyY2FyLWdlbjItdXNiaHMiIGZvciBSLUNhciBHZW4yIGNvbXBhdGlibGUgZGV2aWNlCiAJLSAicmVuZXNhcyxyY2FyLWdlbjMtdXNiaHMiIGZvciBSLUNhciBHZW4zIGNvbXBhdGlibGUgZGV2aWNlCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2Ivcm9ja2NoaXAsZHdjMy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3JvY2tjaGlwLGR3YzMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzZhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3JvY2tjaGlwLGR3YzMudHh0CkBAIC0wLDAgKzEsNTkgQEAKK1JvY2tjaGlwIFN1cGVyU3BlZWQgRFdDMyBVU0IgU29DIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZToJc2hvdWxkIGNvbnRhaW4gInJvY2tjaGlwLHJrMzM5OS1kd2MzIiBmb3IgcmszMzk5IFNvQworLSBjbG9ja3M6CUEgbGlzdCBvZiBwaGFuZGxlICsgY2xvY2stc3BlY2lmaWVyIHBhaXJzIGZvciB0aGUKKwkJY2xvY2tzIGxpc3RlZCBpbiBjbG9jay1uYW1lcworLSBjbG9jay1uYW1lczoJU2hvdWxkIGNvbnRhaW4gdGhlIGZvbGxvd2luZzoKKyAgInJlZl9jbGsiCUNvbnRyb2xsZXIgcmVmZXJlbmNlIGNsaywgaGF2ZSB0byBiZSAyNCBNSHoKKyAgInN1c3BlbmRfY2xrIglDb250cm9sbGVyIHN1c3BlbmQgY2xrLCBoYXZlIHRvIGJlIDI0IE1IeiBvciAzMiBLSHoKKyAgImJ1c19jbGsiCU1hc3Rlci9Db3JlIGNsb2NrLCBoYXZlIHRvIGJlID49IDYyLjUgTUh6IGZvciBTUworCQlvcGVyYXRpb24gYW5kID49IDMwTUh6IGZvciBIUyBvcGVyYXRpb24KKyAgImdyZl9jbGsiCUNvbnRyb2xsZXIgZ3JmIGNsaworCitSZXF1aXJlZCBjaGlsZCBub2RlOgorQSBjaGlsZCBub2RlIG11c3QgZXhpc3QgdG8gcmVwcmVzZW50IHRoZSBjb3JlIERXQzMgSVAgYmxvY2suIFRoZSBuYW1lIG9mCit0aGUgbm9kZSBpcyBub3QgaW1wb3J0YW50LiBUaGUgY29udGVudCBvZiB0aGUgbm9kZSBpcyBkZWZpbmVkIGluIGR3YzMudHh0LgorCitQaHkgZG9jdW1lbnRhdGlvbiBpcyBwcm92aWRlZCBpbiB0aGUgZm9sbG93aW5nIHBsYWNlczoKK0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcm9ja2NoaXAsZHdjMy11c2ItcGh5LnR4dAorCitFeGFtcGxlIGRldmljZSBub2RlczoKKworCXVzYmRyZDNfMDogdXNiQGZlODAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZHdjMyI7CisJCWNsb2NrcyA9IDwmY3J1IFNDTEtfVVNCM09URzBfUkVGPiwgPCZjcnUgU0NMS19VU0IzT1RHMF9TVVNQRU5EPiwKKwkJCSA8JmNydSBBQ0xLX1VTQjNPVEcwPiwgPCZjcnUgQUNMS19VU0IzX0dSRj47CisJCWNsb2NrLW5hbWVzID0gInJlZl9jbGsiLCAic3VzcGVuZF9jbGsiLAorCQkJICAgICAgImJ1c19jbGsiLCAiZ3JmX2NsayI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJcmFuZ2VzOworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl1c2JkcmRfZHdjM18wOiBkd2MzQGZlODAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxkd2MzIjsKKwkJCXJlZyA9IDwweDAgMHhmZTgwMDAwMCAweDAgMHgxMDAwMDA+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDEwNSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWRyX21vZGUgPSAib3RnIjsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisJfTsKKworCXVzYmRyZDNfMTogdXNiQGZlOTAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZHdjMyI7CisJCWNsb2NrcyA9IDwmY3J1IFNDTEtfVVNCM09URzFfUkVGPiwgPCZjcnUgU0NMS19VU0IzT1RHMV9TVVNQRU5EPiwKKwkJCSA8JmNydSBBQ0xLX1VTQjNPVEcxPiwgPCZjcnUgQUNMS19VU0IzX0dSRj47CisJCWNsb2NrLW5hbWVzID0gInJlZl9jbGsiLCAic3VzcGVuZF9jbGsiLAorCQkJICAgICAgImJ1c19jbGsiLCAiZ3JmX2NsayI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJcmFuZ2VzOworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl1c2JkcmRfZHdjM18xOiBkd2MzQGZlOTAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxkd2MzIjsKKwkJCXJlZyA9IDwweDAgMHhmZTkwMDAwMCAweDAgMHgxMDAwMDA+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDExMCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWRyX21vZGUgPSAib3RnIjsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNiNDYwNC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYjQ2MDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTA2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYjQ2MDQudHh0CkBAIC0wLDAgKzEsMTkgQEAKK1NNU0MgVVNCNDYwNCBIaWdoLVNwZWVkIEh1YiBDb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAic21zYyx1c2I0NjA0IgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSByZWc6IFNwZWNpZmllcyB0aGUgaTJjIHNsYXZlIGFkZHJlc3MsIGl0IGlzIHJlcXVpcmVkIGFuZCBzaG91bGQgYmUgMHgyZAorICAgICAgIGlmIEkyQyBpcyB1c2VkLgorLSByZXNldC1ncGlvczogU2hvdWxkIHNwZWNpZnkgR1BJTyBmb3IgcmVzZXQuCistIGluaXRpYWwtbW9kZTogU2hvdWxkIHNwZWNpZnkgaW5pdGlhbCBtb2RlLgorICAgICAgICAgICAgICAgICgxIGZvciBIVUIgbW9kZSwgMiBmb3IgU1RBTkRCWSBtb2RlKQorCitFeGFtcGxlczoKKwl1c2ItaHViQDJkIHsKKwkJY29tcGF0aWJsZSA9ICJzbXNjLHVzYjQ2MDQiOworCQlyZWcgPSA8MHgyZD47CisJCXJlc2V0LWdwaW9zID0gPCZncHgzIDUgMT47CisJCWluaXRpYWwtbW9kZSA9IDwxPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2JtaXNjLWlteC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYm1pc2MtaW14LnR4dAppbmRleCAzNTM5ZDRlLi5mMWUyN2ZhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYm1pc2MtaW14LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3VzYm1pc2MtaW14LnR4dApAQCAtNiw2ICs2LDcgQEAKIAkiZnNsLGlteDZxLXVzYm1pc2MiIGZvciBpbXg2cQogCSJmc2wsdmY2MTAtdXNibWlzYyIgZm9yIFZ5YnJpZCB2ZjYxMAogCSJmc2wsaW14NnN4LXVzYm1pc2MiIGZvciBpbXg2c3gKKwkiZnNsLGlteDdkLXVzYm1pc2MiIGZvciBpbXg3ZAogLSByZWc6IFNob3VsZCBjb250YWluIHJlZ2lzdGVycyBsb2NhdGlvbiBhbmQgbGVuZ3RoCiAKIEV4YW1wbGVzOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3ZlbmRvci1wcmVmaXhlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmVuZG9yLXByZWZpeGVzLnR4dAppbmRleCAxOTkyYWE5Li43N2U5ODVmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmVuZG9yLXByZWZpeGVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmVuZG9yLXByZWZpeGVzLnR4dApAQCAtMyw4ICszLDggQEAKIFRoaXMgaXNuJ3QgYW4gZXhoYXVzdGl2ZSBsaXN0LCBidXQgeW91IHNob3VsZCBhZGQgbmV3IHByZWZpeGVzIHRvIGl0IGJlZm9yZQogdXNpbmcgdGhlbSB0byBhdm9pZCBuYW1lLXNwYWNlIGNvbGxpc2lvbnMuCiAKLWFiaWxpcwlBYmlsaXMgU3lzdGVtcwogYWJjbglBYnJhY29uIENvcnBvcmF0aW9uCithYmlsaXMJQWJpbGlzIFN5c3RlbXMKIGFjdGl2ZS1zZW1pCUFjdGl2ZS1TZW1pIEludGVybmF0aW9uYWwgSW5jCiBhZAlBdmlvbmljIERlc2lnbiBHbWJICiBhZGFwdGV2YQlBZGFwdGV2YSwgSW5jLgpAQCAtMzYsNiArMzYsNyBAQAogYXRsYXMJQXRsYXMgU2NpZW50aWZpYyBMTEMKIGF0bWVsCUF0bWVsIENvcnBvcmF0aW9uCiBhdW8JQVUgT3B0cm9uaWNzIENvcnBvcmF0aW9uCithdXZpZGVhIEF1dmlkZWEgR21iSAogYXZhZ28JQXZhZ28gVGVjaG5vbG9naWVzCiBhdmljCVNoYW5naGFpIEFWSUMgT3B0b2VsZWN0cm9uaWNzIENvLiwgTHRkLgogYXhpcwlBeGlzIENvbW11bmljYXRpb25zIEFCCkBAIC03NSw2ICs3Niw3IEBACiBkbGcJRGlhbG9nIFNlbWljb25kdWN0b3IKIGRsaW5rCUQtTGluayBDb3Jwb3JhdGlvbgogZG1vCURhdGEgTW9kdWwgQUcKK2RvbWludGVjaAlEb21pbnRlY2ggQ28uLCBMdGQuCiBkcHRlY2huaWNzCURQVGVjaG5pY3MKIGRyYWdpbm8JRHJhZ2lubyBUZWNobm9sb2d5IENvLiwgTGltaXRlZAogZWEJRW1iZWRkZWQgQXJ0aXN0cyBBQgpAQCAtODUsNiArODcsNyBAQAogZW1iZXN0CVNoZW56aGVuIEVtYmVzdCBUZWNobm9sb2d5IENvLiwgTHRkLgogZW1taWNybwlFTSBNaWNyb2VsZWN0cm9uaWMKIGVuZXJneW1pY3JvCVNpbGljb24gTGFib3JhdG9yaWVzIChmb3JtZXJseSBFbmVyZ3kgTWljcm8gQVMpCitlbmdpY2FtCUVuZ2ljYW0gUy5yLmwuCiBlcGNvcwlFUENPUyBBRwogZXBmbAlFY29sZSBQb2x5dGVjaG5pcXVlIEbDqWTDqXJhbGUgZGUgTGF1c2FubmUKIGVwc29uCVNlaWtvIEVwc29uIENvcnAuCkBAIC0xMDEsOCArMTA0LDggQEAKIGZzbAlGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvcgogZ2UJR2VuZXJhbCBFbGVjdHJpYyBDb21wYW55CiBnZWVrYnV5aW5nCUdlZWtCdXlpbmcKLUdFRmFudWMJR0UgRmFudWMgSW50ZWxsaWdlbnQgUGxhdGZvcm1zIEVtYmVkZGVkIFN5c3RlbXMsIEluYy4KIGdlZglHRSBGYW51YyBJbnRlbGxpZ2VudCBQbGF0Zm9ybXMgRW1iZWRkZWQgU3lzdGVtcywgSW5jLgorR0VGYW51YwlHRSBGYW51YyBJbnRlbGxpZ2VudCBQbGF0Zm9ybXMgRW1iZWRkZWQgU3lzdGVtcywgSW5jLgogZ2VuaWF0ZWNoCUdlbmlhdGVjaCwgSW5jLgogZ2lhbnRwbHVzCUdpYW50cGx1cyBUZWNobm9sb2d5IENvLiwgTHRkLgogZ2xvYmFsc2NhbGUJR2xvYmFsc2NhbGUgVGVjaG5vbG9naWVzLCBJbmMuCkBAIC0xMjYsNyArMTI5LDYgQEAKIGlibQlJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIChJQk0pCiBpZHQJSW50ZWdyYXRlZCBEZXZpY2UgVGVjaG5vbG9naWVzLCBJbmMuCiBpZmkJSW5nZW5pZXVyYnVybyBGdXIgSWMtVGVjaG5vbG9naWUgKEkvRi9JKQotaW9tCUlvbWVnYSBDb3Jwb3JhdGlvbgogaW1nCUltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCiBpbmZpbmVvbiBJbmZpbmVvbiBUZWNobm9sb2dpZXMKIGluZm9yY2UJSW5mb3JjZSBDb21wdXRpbmcKQEAgLTEzNSwxMSArMTM3LDE0IEBACiBpbnRlbAlJbnRlbCBDb3Jwb3JhdGlvbgogaW50ZXJjb250cm9sCUludGVyIENvbnRyb2wgR3JvdXAKIGludmVuc2Vuc2UJSW52ZW5TZW5zZSBJbmMuCitpb20JSW9tZWdhIENvcnBvcmF0aW9uCiBpc2VlCUlTRUUgMjAwNyBTLkwuCiBpc2lsCUludGVyc2lsCiBpc3NpCUludGVncmF0ZWQgU2lsaWNvbiBTb2x1dGlvbnMgSW5jLgoramRpCUphcGFuIERpc3BsYXkgSW5jLgogamVkZWMJSkVERUMgU29saWQgU3RhdGUgVGVjaG5vbG9neSBBc3NvY2lhdGlvbgoga2FybwlLYS1SbyBlbGVjdHJvbmljcyBHbWJICitrZWl0aGtvZXAJS2VpdGggJiBLb2VwIEdtYkgKIGtleW1pbGUJS2V5bWlsZSBHbWJICiBraW5ldGljIEtpbmV0aWMgVGVjaG5vbG9naWVzCiBrb3NhZ2kJU3V0YWppbyBLby1Vc2FnaSBQVEUgTHRkLgpAQCAtMTQ5LDggKzE1NCw4IEBACiBsZW5vdm8JTGVub3ZvIEdyb3VwIEx0ZC4KIGxnCUxHIENvcnBvcmF0aW9uCiBsaW51eAlMaW51eC1zcGVjaWZpYyBiaW5kaW5nCi1sc2kJTFNJIENvcnAuIChMU0kgTG9naWMpCiBsbHRjCUxpbmVhciBUZWNobm9sb2d5IENvcnBvcmF0aW9uCitsc2kJTFNJIENvcnAuIChMU0kgTG9naWMpCiBtYXJ2ZWxsCU1hcnZlbGwgVGVjaG5vbG9neSBHcm91cCBMdGQuCiBtYXhpbQlNYXhpbSBJbnRlZ3JhdGVkIFByb2R1Y3RzCiBtZWFzCU1lYXN1cmVtZW50IFNwZWNpYWx0aWVzCkBAIC0xOTAsMjAgKzE5NSwyMCBAQAogb250YXQJT24gVGF0IEluZHVzdHJpYWwgQ29tcGFueQogb3BlbmNvcmVzCU9wZW5Db3Jlcy5vcmcKIG9wdGlvbglPcHRpb24gTlYKK09SQ0wJT3JhY2xlIENvcnBvcmF0aW9uCiBvcnR1c3RlY2gJT3J0dXMgVGVjaG5vbG9neSBDby4sIEx0ZC4KIG92dGkJT21uaVZpc2lvbiBUZWNobm9sb2dpZXMKLU9SQ0wJT3JhY2xlIENvcnBvcmF0aW9uCiBveHNlbWkJT3hmb3JkIFNlbWljb25kdWN0b3IsIEx0ZC4KIHBhbmFzb25pYwlQYW5hc29uaWMgQ29ycG9yYXRpb24KIHBhcmFkZQlQYXJhZGUgVGVjaG5vbG9naWVzIEluYy4KIHBlcmljb20JUGVyaWNvbSBUZWNobm9sb2d5IEluYy4KIHBoeXRlYwlQSFlURUMgTWVzc3RlY2huaWsgR21iSAogcGljb2NoaXAJUGljb2NoaXAgTHRkCitwaXhjaXIgIFBJWENJUiBNSUNST0VMRUNUUk9OSUNTIENvLiwgTHRkCiBwbGF0aG9tZQlQbGF0J0hvbWUgQ28uLCBMdGQuCiBwbGRhCVBMREEKLXBpeGNpciAgUElYQ0lSIE1JQ1JPRUxFQ1RST05JQ1MgQ28uLCBMdGQKLXB1bHNlZGxpZ2h0CVB1bHNlZExpZ2h0LCBJbmMKIHBvd2VydnIJUG93ZXJWUiAoZGVwcmVjYXRlZCwgdXNlIGltZykKK3B1bHNlZGxpZ2h0CVB1bHNlZExpZ2h0LCBJbmMKIHFjYQlRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiBxY29tCVF1YWxjb21tIFRlY2hub2xvZ2llcywgSW5jCiBxZW11CVFFTVUsIGEgZ2VuZXJpYyBhbmQgb3BlbiBzb3VyY2UgbWFjaGluZSBlbXVsYXRvciBhbmQgdmlydHVhbGl6ZXIKQEAgLTIzMSwxMiArMjM2LDEzIEBACiBzaGFycAlTaGFycCBDb3Jwb3JhdGlvbgogc2ktZW4JU2ktRW4gVGVjaG5vbG9neSBMdGQuCiBzaWdtYQlTaWdtYSBEZXNpZ25zLCBJbmMuCitzaWkJU2Vpa28gSW5zdHJ1bWVudHMsIEluYy4KIHNpbAlTaWxpY29uIEltYWdlCiBzaWxhYnMJU2lsaWNvbiBMYWJvcmF0b3JpZXMKK3NpbGVhZAlTaWxlYWQgSW5jLgorc2lsZXJneQlTaWxlcmd5IENvcnAuCiBzaWxpY29ubWl0dXMJU2lsaWNvbiBNaXR1cywgSW5jLgogc2ltdGVrCi1zaWkJU2Vpa28gSW5zdHJ1bWVudHMsIEluYy4KLXNpbGVyZ3kJU2lsZXJneSBDb3JwLgogc2lyZglTaVJGIFRlY2hub2xvZ3ksIEluYy4KIHNpcwlTaWxpY29uIEludGVncmF0ZWQgU3lzdGVtcyBDb3JwLgogc2l0cm9uaXgJU2l0cm9uaXggVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgpAQCAtMjU0LDkgKzI2MCwxMiBAQAogc3RhcnRlawlTdGFydGVrCiBzdGUJU1QtRXJpY3Nzb24KIHN0ZXJpY3Nzb24JU1QtRXJpY3Nzb24KK3N1bW1pdAlTdW1taXQgbWljcm9lbGVjdHJvbmljcworc3VuY2hpcAlTaGVuemhlbiBTdW5jaGlwIFRlY2hub2xvZ3kgQ28uLCBMdGQKK1NVTlcJU3VuIE1pY3Jvc3lzdGVtcywgSW5jCitzd2lyCVNpZXJyYSBXaXJlbGVzcwogc3luYQlTeW5hcHRpY3MgSW5jLgogc3lub2xvZ3kJU3lub2xvZ3ksIEluYy4KLVNVTlcJU3VuIE1pY3Jvc3lzdGVtcywgSW5jCiB0YnMJVEJTIFRlY2hub2xvZ2llcwogdGNnCVRydXN0ZWQgQ29tcHV0aW5nIEdyb3VwCiB0Y2wJVG9ieSBDaHVyY2hpbGwgTHRkLgpAQCAtMjY1LDE3ICsyNzQsMTggQEAKIHRoaW5lCVRIaW5lIEVsZWN0cm9uaWNzLCBJbmMuCiB0aQlUZXhhcyBJbnN0cnVtZW50cwogdGxtCVRydXN0ZWQgTG9naWMgTW9iaWxpdHkKK3RvcGVldCAgVG9wZWV0CiB0b3JhZGV4CVRvcmFkZXggQUcKIHRvc2hpYmEJVG9zaGliYSBDb3Jwb3JhdGlvbgogdG91bWF6CVRvdW1hegotdHBsaW5rCVRQLUxJTksgVGVjaG5vbG9naWVzIENvLiwgTHRkLgogdHBrCVRQSyBVLlMuQS4gTExDCit0cGxpbmsJVFAtTElOSyBUZWNobm9sb2dpZXMgQ28uLCBMdGQuCiB0cm9uZnkJVHJvbmZ5CiB0cm9uc21hcnQJVHJvbnNtYXJ0CiB0cnVseQlUcnVseSBTZW1pY29uZHVjdG9ycyBMaW1pdGVkCiB0eWFuCVR5YW4gQ29tcHV0ZXIgQ29ycG9yYXRpb24KLXVwaXNlbWkJdVBJIFNlbWljb25kdWN0b3IgQ29ycC4KIHVuaXdlc3QJVW5pdGVkIFdlc3Rlcm4gVGVjaG5vbG9naWVzIENvcnAgKFVuaVdlc3QpCit1cGlzZW1pCXVQSSBTZW1pY29uZHVjdG9yIENvcnAuCiB1cnQJVW5pdGVkIFJhZGlhbnQgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbgogdXNpCVVuaXZlcnNhbCBTY2llbnRpZmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCiB2MwlWMyBTZW1pY29uZHVjdG9yCkBAIC0yOTMsNyArMzAzLDcgQEAKIHhlcwlFeHRyZW1lIEVuZ2luZWVyaW5nIFNvbHV0aW9ucyAoWC1FUykKIHhpbGx5YnVzCVhpbGx5YnVzIEx0ZC4KIHhsbngJWGlsaW54Ci16eXhlbAlaeVhFTCBDb21tdW5pY2F0aW9ucyBDb3JwLgogemFybGluawlaYXJsaW5rIFNlbWljb25kdWN0b3IKIHppaQlab2RpYWMgSW5mbGlnaHQgSW5ub3ZhdGlvbnMKIHp0ZQlaVEUgQ29ycC4KK3p5eGVsCVp5WEVMIENvbW11bmljYXRpb25zIENvcnAuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvY2hhbmdlc2V0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvY2hhbmdlc2V0cy50eHQKaW5kZXggOTM1YmE1YS4uY2I0ODhlZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2NoYW5nZXNldHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9jaGFuZ2VzZXRzLnR4dApAQCAtMjEsMjAgKzIxLDExIEBACiBBbGwgdGhlIGNoYW5nZSBvcGVyYXRpb25zIGFyZSByZWNvcmRlZCBpbiB0aGUgb2ZfY2hhbmdlc2V0ICdlbnRyaWVzJwogbGlzdC4KIAotMy4gbXV0ZXhfbG9jayhvZl9tdXRleCkgLSBzdGFydHMgYSBjaGFuZ2VzZXQ7IFRoZSBnbG9iYWwgb2ZfbXV0ZXgKLWVuc3VyZXMgdGhlcmUgY2FuIG9ubHkgYmUgb25lIGVkaXRvciBhdCBhIHRpbWUuCi0KLTQuIG9mX2NoYW5nZXNldF9hcHBseSgpIC0gQXBwbHkgdGhlIGNoYW5nZXMgdG8gdGhlIHRyZWUuIEVpdGhlciB0aGUKKzMuIG9mX2NoYW5nZXNldF9hcHBseSgpIC0gQXBwbHkgdGhlIGNoYW5nZXMgdG8gdGhlIHRyZWUuIEVpdGhlciB0aGUKIGVudGlyZSBjaGFuZ2VzZXQgd2lsbCBnZXQgYXBwbGllZCwgb3IgaWYgdGhlcmUgaXMgYW4gZXJyb3IgdGhlIHRyZWUgd2lsbAotYmUgcmVzdG9yZWQgdG8gdGhlIHByZXZpb3VzIHN0YXRlCi0KLTUuIG11dGV4X3VubG9jayhvZl9tdXRleCkgLSBBbGwgb3BlcmF0aW9ucyBjb21wbGV0ZSwgcmVsZWFzZSB0aGUgbXV0ZXgKK2JlIHJlc3RvcmVkIHRvIHRoZSBwcmV2aW91cyBzdGF0ZS4gVGhlIGNvcmUgZW5zdXJlcyBwcm9wZXIgc2VyaWFsaXphdGlvbgordGhyb3VnaCBsb2NraW5nLiBBbiB1bmxvY2tlZCB2ZXJzaW9uIF9fb2ZfY2hhbmdlc2V0X2FwcGx5IGlzIGF2YWlsYWJsZSwKK2lmIG5lZWRlZC4KIAogSWYgYSBzdWNjZXNzZnVsbHkgYXBwbGllZCBjaGFuZ2VzZXQgbmVlZHMgdG8gYmUgcmVtb3ZlZCwgaXQgY2FuIGJlIGRvbmUKLXdpdGggdGhlIGZvbGxvd2luZyBzZXF1ZW5jZS4KLQotMS4gbXV0ZXhfbG9jayhvZl9tdXRleCkKLQotMi4gb2ZfY2hhbmdlc2V0X3JldmVydCgpCi0KLTMuIG11dGV4X3VubG9jayhvZl9tdXRleCkKK3dpdGggb2ZfY2hhbmdlc2V0X3JldmVydCgpLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kbWFlbmdpbmUvcHJvdmlkZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kbWFlbmdpbmUvcHJvdmlkZXIudHh0CmluZGV4IDkxY2U4MmQuLmM0ZmQ0NzUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZG1hZW5naW5lL3Byb3ZpZGVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RtYWVuZ2luZS9wcm92aWRlci50eHQKQEAgLTI4Miw2ICsyODIsMTcgQEAKIAkJCXRoYXQgaXMgc3VwcG9zZWQgdG8gcHVzaCB0aGUgY3VycmVudAogCQkJdHJhbnNhY3Rpb24gZGVzY3JpcHRvciB0byBhIHBlbmRpbmcgcXVldWUsIHdhaXRpbmcKIAkJCWZvciBpc3N1ZV9wZW5kaW5nIHRvIGJlIGNhbGxlZC4KKyAgICAgLSBJbiB0aGlzIHN0cnVjdHVyZSB0aGUgZnVuY3Rpb24gcG9pbnRlciBjYWxsYmFja19yZXN1bHQgY2FuIGJlCisgICAgICAgaW5pdGlhbGl6ZWQgaW4gb3JkZXIgZm9yIHRoZSBzdWJtaXR0ZXIgdG8gYmUgbm90aWZpZWQgdGhhdCBhCisgICAgICAgdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZC4gSW4gdGhlIGVhcmxpZXIgY29kZSB0aGUgZnVuY3Rpb24gcG9pbnRlcgorICAgICAgIGNhbGxiYWNrIGhhcyBiZWVuIHVzZWQuIEhvd2V2ZXIgaXQgZG9lcyBub3QgcHJvdmlkZSBhbnkgc3RhdHVzIHRvIHRoZQorICAgICAgIHRyYW5zYWN0aW9uIGFuZCB3aWxsIGJlIGRlcHJlY2F0ZWQuIFRoZSByZXN1bHQgc3RydWN0dXJlIGRlZmluZWQgYXMKKyAgICAgICBkbWFlbmdpbmVfcmVzdWx0IHRoYXQgaXMgcGFzc2VkIGluIHRvIGNhbGxiYWNrX3Jlc3VsdCBoYXMgdHdvIGZpZWxkczoKKyAgICAgICArIHJlc3VsdDogVGhpcyBwcm92aWRlcyB0aGUgdHJhbnNmZXIgcmVzdWx0IGRlZmluZWQgYnkKKwkJIGRtYWVuZ2luZV90eF9yZXN1bHQuIEVpdGhlciBzdWNjZXNzIG9yIHNvbWUgZXJyb3IKKwkJIGNvbmRpdGlvbi4KKyAgICAgICArIHJlc2lkdWU6IFByb3ZpZGVzIHRoZSByZXNpZHVlIGJ5dGVzIG9mIHRoZSB0cmFuc2ZlciBmb3IgdGhvc2UgdGhhdAorCQkgIHN1cHBvcnQgcmVzaWR1ZS4KIAogICAgKiBkZXZpY2VfaXNzdWVfcGVuZGluZwogICAgICAtIFRha2VzIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiBkZXNjcmlwdG9yIGluIHRoZSBwZW5kaW5nIHF1ZXVlLApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kb2N1dGlscy5jb25mIGIvRG9jdW1lbnRhdGlvbi9kb2N1dGlscy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MzA3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RvY3V0aWxzLmNvbmYKQEAgLTAsMCArMSw3IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IG1vZGU6IGNvbmYtY29sb24gLSotCisjCisjIGRvY3V0aWxzIGNvbmZpZ3VyYXRpb24gZmlsZQorIyBodHRwOi8vZG9jdXRpbHMuc291cmNlZm9yZ2UubmV0L2RvY3MvdXNlci9jb25maWcuaHRtbAorCitbZ2VuZXJhbF0KK2hhbHRfbGV2ZWw6IHNldmVyZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9iYXNpY3MucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2Jhc2ljcy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM1YjliOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9iYXNpY3MucnN0CkBAIC0wLDAgKzEsMTIwIEBACitEcml2ZXIgQmFzaWNzCis9PT09PT09PT09PT09CisKK0RyaXZlciBFbnRyeSBhbmQgRXhpdCBwb2ludHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvaW5pdC5oCisgICA6aW50ZXJuYWw6CisKK0F0b21pYyBhbmQgcG9pbnRlciBtYW5pcHVsYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGFyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pYy5oCisgICA6aW50ZXJuYWw6CisKK0RlbGF5aW5nLCBzY2hlZHVsaW5nLCBhbmQgdGltZXIgcm91dGluZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvc2NoZWQuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3NjaGVkL2NvcmUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9zY2hlZC9jcHVwcmkuYworICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3NjaGVkL2ZhaXIuYworICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9jb21wbGV0aW9uLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC90aW1lL3RpbWVyLmMKKyAgIDpleHBvcnQ6CisKK1dhaXQgcXVldWVzIGFuZCBXYWtlIGV2ZW50cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3dhaXQuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3NjaGVkL3dhaXQuYworICAgOmV4cG9ydDoKKworSGlnaC1yZXNvbHV0aW9uIHRpbWVycworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9rdGltZS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2hydGltZXIuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3RpbWUvaHJ0aW1lci5jCisgICA6ZXhwb3J0OgorCitXb3JrcXVldWVzIGFuZCBLZXZlbnRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvd29ya3F1ZXVlLmMKKyAgIDpleHBvcnQ6CisKK0ludGVybmFsIEZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvZXhpdC5jCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvc2lnbmFsLmMKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgva3RocmVhZC5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwva3RocmVhZC5jCisgICA6ZXhwb3J0OgorCitLZXJuZWwgb2JqZWN0cyBtYW5pcHVsYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogbGliL2tvYmplY3QuYworICAgOmV4cG9ydDoKKworS2VybmVsIHV0aWxpdHkgZnVuY3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgva2VybmVsLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9wcmludGsvcHJpbnRrLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvcGFuaWMuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9zeXMuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGtlcm5lbC9yY3Uvc3JjdS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjoga2VybmVsL3JjdS90cmVlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmgKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBrZXJuZWwvcmN1L3VwZGF0ZS5jCisgICA6ZXhwb3J0OgorCitEZXZpY2UgUmVzb3VyY2UgTWFuYWdlbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9kZXZyZXMuYworICAgOmV4cG9ydDoKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2ZyYW1lLWJ1ZmZlci5yc3QgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvZnJhbWUtYnVmZmVyLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQzMDYwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2ZyYW1lLWJ1ZmZlci5yc3QKQEAgLTAsMCArMSw2MiBAQAorRnJhbWUgQnVmZmVyIExpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmcmFtZSBidWZmZXIgZHJpdmVycyBkZXBlbmQgaGVhdmlseSBvbiBmb3VyIGRhdGEgc3RydWN0dXJlcy4gVGhlc2UKK3N0cnVjdHVyZXMgYXJlIGRlY2xhcmVkIGluIGluY2x1ZGUvbGludXgvZmIuaC4gVGhleSBhcmUgZmJfaW5mbywKK2ZiX3Zhcl9zY3JlZW5pbmZvLCBmYl9maXhfc2NyZWVuaW5mbyBhbmQgZmJfbW9ub3NwZWNzLiBUaGUgbGFzdAordGhyZWUgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIGFuZCBmcm9tIHVzZXJsYW5kLgorCitmYl9pbmZvIGRlZmluZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBwYXJ0aWN1bGFyIHZpZGVvIGNhcmQuIEluc2lkZQorZmJfaW5mbywgdGhlcmUgZXhpc3RzIGEgZmJfb3BzIHN0cnVjdHVyZSB3aGljaCBpcyBhIGNvbGxlY3Rpb24gb2YKK25lZWRlZCBmdW5jdGlvbnMgdG8gbWFrZSBmYmRldiBhbmQgZmJjb24gd29yay4gZmJfaW5mbyBpcyBvbmx5IHZpc2libGUKK3RvIHRoZSBrZXJuZWwuCisKK2ZiX3Zhcl9zY3JlZW5pbmZvIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZlYXR1cmVzIG9mIGEgdmlkZW8gY2FyZAordGhhdCBhcmUgdXNlciBkZWZpbmVkLiBXaXRoIGZiX3Zhcl9zY3JlZW5pbmZvLCB0aGluZ3Mgc3VjaCBhcyBkZXB0aAorYW5kIHRoZSByZXNvbHV0aW9uIG1heSBiZSBkZWZpbmVkLgorCitUaGUgbmV4dCBzdHJ1Y3R1cmUgaXMgZmJfZml4X3NjcmVlbmluZm8uIFRoaXMgZGVmaW5lcyB0aGUgcHJvcGVydGllcworb2YgYSBjYXJkIHRoYXQgYXJlIGNyZWF0ZWQgd2hlbiBhIG1vZGUgaXMgc2V0IGFuZCBjYW4ndCBiZSBjaGFuZ2VkCitvdGhlcndpc2UuIEEgZ29vZCBleGFtcGxlIG9mIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIHRoZSBmcmFtZSBidWZmZXIKK21lbW9yeS4gVGhpcyAibG9ja3MiIHRoZSBhZGRyZXNzIG9mIHRoZSBmcmFtZSBidWZmZXIgbWVtb3J5LCBzbyB0aGF0IGl0CitjYW5ub3QgYmUgY2hhbmdlZCBvciBtb3ZlZC4KKworVGhlIGxhc3Qgc3RydWN0dXJlIGlzIGZiX21vbm9zcGVjcy4gSW4gdGhlIG9sZCBBUEksIHRoZXJlIHdhcyBsaXR0bGUKK2ltcG9ydGFuY2UgZm9yIGZiX21vbm9zcGVjcy4gVGhpcyBhbGxvd2VkIGZvciBmb3JiaWRkZW4gdGhpbmdzIHN1Y2ggYXMKK3NldHRpbmcgYSBtb2RlIG9mIDgwMHg2MDAgb24gYSBmaXggZnJlcXVlbmN5IG1vbml0b3IuIFdpdGggdGhlIG5ldyBBUEksCitmYl9tb25vc3BlY3MgcHJldmVudHMgc3VjaCB0aGluZ3MsIGFuZCBpZiB1c2VkIGNvcnJlY3RseSwgY2FuIHByZXZlbnQgYQorbW9uaXRvciBmcm9tIGJlaW5nIGNvb2tlZC4gZmJfbW9ub3NwZWNzIHdpbGwgbm90IGJlIHVzZWZ1bCB1bnRpbAora2VybmVscyAyLjUueC4KKworRnJhbWUgQnVmZmVyIE1lbW9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy92aWRlby9mYmRldi9jb3JlL2ZibWVtLmMKKyAgIDpleHBvcnQ6CisKK0ZyYW1lIEJ1ZmZlciBDb2xvcm1hcAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJjbWFwLmMKKyAgIDpleHBvcnQ6CisKK0ZyYW1lIEJ1ZmZlciBWaWRlbyBNb2RlIERhdGFiYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy92aWRlby9mYmRldi9jb3JlL21vZGVkYi5jCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvbW9kZWRiLmMKKyAgIDpleHBvcnQ6CisKK0ZyYW1lIEJ1ZmZlciBNYWNpbnRvc2ggVmlkZW8gTW9kZSBEYXRhYmFzZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3ZpZGVvL2ZiZGV2L21hY21vZGVzLmMKKyAgIDpleHBvcnQ6CisKK0ZyYW1lIEJ1ZmZlciBGb250cworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1JlZmVyIHRvIHRoZSBmaWxlIGxpYi9mb250cy9mb250cy5jIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaHNpLnJzdCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9oc2kucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2VjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaHNpLnJzdApAQCAtMCwwICsxLDg4IEBACitIaWdoIFNwZWVkIFN5bmNocm9ub3VzIFNlcmlhbCBJbnRlcmZhY2UgKEhTSSkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLS0tLQorCitIaWdoIFNwZWVkIFN5bmNyb25vdXMgSW50ZXJmYWNlIChIU0kpIGlzIGEgZnVsbGR1cGxleCwgbG93IGxhdGVuY3kgcHJvdG9jb2wsCit0aGF0IGlzIG9wdGltaXplZCBmb3IgZGllLWxldmVsIGludGVyY29ubmVjdCBiZXR3ZWVuIGFuIEFwcGxpY2F0aW9uIFByb2Nlc3NvcgorYW5kIGEgQmFzZWJhbmQgY2hpcHNldC4gSXQgaGFzIGJlZW4gc3BlY2lmaWVkIGJ5IHRoZSBNSVBJIGFsbGlhbmNlIGluIDIwMDMgYW5kCitpbXBsZW1lbnRlZCBieSBtdWx0aXBsZSB2ZW5kb3JzIHNpbmNlIHRoZW4uCisKK1RoZSBIU0kgaW50ZXJmYWNlIHN1cHBvcnRzIGZ1bGwgZHVwbGV4IGNvbW11bmljYXRpb24gb3ZlciBtdWx0aXBsZSBjaGFubmVscworKHR5cGljYWxseSA4KSBhbmQgaXMgY2FwYWJsZSBvZiByZWFjaGluZyBzcGVlZHMgdXAgdG8gMjAwIE1iaXQvcy4KKworVGhlIHNlcmlhbCBwcm90b2NvbCB1c2VzIHR3byBzaWduYWxzLCBEQVRBIGFuZCBGTEFHIGFzIGNvbWJpbmVkIGRhdGEgYW5kIGNsb2NrCitzaWduYWxzIGFuZCBhbiBhZGRpdGlvbmFsIFJFQURZIHNpZ25hbCBmb3IgZmxvdyBjb250cm9sLiBBbiBhZGRpdGlvbmFsIFdBS0UKK3NpZ25hbCBjYW4gYmUgdXNlZCB0byB3YWtldXAgdGhlIGNoaXBzIGZyb20gc3RhbmRieSBtb2Rlcy4gVGhlIHNpZ25hbHMgYXJlCitjb21tb25seSBwcmVmaXhlZCBieSBBQyBmb3Igc2lnbmFscyBnb2luZyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBkaWUgdG8gdGhlCitjZWxsdWxhciBkaWUgYW5kIENBIGZvciBzaWduYWxzIGdvaW5nIHRoZSBvdGhlciB3YXkgYXJvdW5kLgorCis6OgorCisgICAgKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworICAgIHwgIENlbGx1bGFyICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgQXBwbGljYXRpb24gIHwKKyAgICB8ICAgIERpZSAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBEaWUgICAgICB8CisgICAgfCAgICAgICAgICAgIHwgLSAtIC0gLSAtIC0gQ0FXQUtFIC0gLSAtIC0gLSAtID58ICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgIFR8LS0tLS0tLS0tLS0tIENBREFUQSAtLS0tLS0tLS0tLS0+fFIgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICBYfC0tLS0tLS0tLS0tLSBDQUZMQUcgLS0tLS0tLS0tLS0tPnxYICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgIHw8LS0tLS0tLS0tLS0gQUNSRUFEWSAtLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgIHw8IC0gLSAtIC0gLSAgQUNXQUtFIC0gLSAtIC0gLSAtIC18ICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgIFJ8PC0tLS0tLS0tLS0tIEFDREFUQSAtLS0tLS0tLS0tLS0tfFQgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICBYfDwtLS0tLS0tLS0tLSBBQ0ZMQUcgLS0tLS0tLS0tLS0tLXxYICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0gQ0FSRUFEWSAtLS0tLS0tLS0tLT58ICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworCitIU0kgU3Vic3lzdGVtIGluIExpbnV4CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIHRoZSBMaW51eCBrZXJuZWwgdGhlIGhzaSBzdWJzeXN0ZW0gaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBmb3IgSFNJIGRldmljZXMuCitUaGUgaHNpIHN1YnN5c3RlbSBjb250YWlucyBkcml2ZXJzIGZvciBoc2kgY29udHJvbGxlcnMgaW5jbHVkaW5nIHN1cHBvcnQgZm9yCittdWx0aS1wb3J0IGNvbnRyb2xsZXJzIGFuZCBwcm92aWRlcyBhIGdlbmVyaWMgQVBJIGZvciB1c2luZyB0aGUgSFNJIHBvcnRzLgorCitJdCBhbHNvIGNvbnRhaW5zIEhTSSBjbGllbnQgZHJpdmVycywgd2hpY2ggbWFrZSB1c2Ugb2YgdGhlIGdlbmVyaWMgQVBJIHRvCitpbXBsZW1lbnQgYSBwcm90b2NvbCB1c2VkIG9uIHRoZSBIU0kgaW50ZXJmYWNlLiBUaGVzZSBjbGllbnQgZHJpdmVycyBjYW4KK3VzZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGNoYW5uZWxzLgorCitoc2ktY2hhciBEZXZpY2UKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitFYWNoIHBvcnQgYXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBnZW5lcmljIGNsaWVudCBkcml2ZXIgY2FsbGVkIGhzaV9jaGFyLAord2hpY2ggcHJvdmlkZXMgYSBjaGFyZWN0ZXIgZGV2aWNlIGZvciB1c2Vyc3BhY2UgcmVwcmVzZW50aW5nIHRoZSBIU0kgcG9ydC4KK0l0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHZpYSBIU0kgZnJvbSB1c2Vyc3BhY2UuIFVzZXJzcGFjZSBtYXkKK2NvbmZpZ3VyZSB0aGUgaHNpX2NoYXIgZGV2aWNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgaW9jdGwgY29tbWFuZHM6CisKK0hTQ19SRVNFVAorIGZsdXNoIHRoZSBIU0kgcG9ydAorCitIU0NfU0VUX1BNCisgZW5hYmxlIG9yIGRpc2FibGUgdGhlIGNsaWVudC4KKworSFNDX1NFTkRfQlJFQUsKKyBzZW5kIGJyZWFrCisKK0hTQ19TRVRfUlgKKyBzZXQgUlggY29uZmlndXJhdGlvbgorCitIU0NfR0VUX1JYCisgZ2V0IFJYIGNvbmZpZ3VyYXRpb24KKworSFNDX1NFVF9UWAorIHNldCBUWCBjb25maWd1cmF0aW9uCisKK0hTQ19HRVRfVFgKKyBnZXQgVFggY29uZmlndXJhdGlvbgorCitUaGUga2VybmVsIEhTSSBBUEkKKy0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9oc2kvaHNpLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaHNpL2hzaV9jb3JlLmMKKyAgIDpleHBvcnQ6CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pMmMucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2kyYy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5MzlmNwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pMmMucnN0CkBAIC0wLDAgKzEsNDYgQEAKK0lcIDpzdXA6YDJgXCBDIGFuZCBTTUJ1cyBTdWJzeXN0ZW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSVwgOnN1cDpgMmBcIEMgKG9yIHdpdGhvdXQgZmFuY3kgdHlwb2dyYXBoeSwgIkkyQyIpIGlzIGFuIGFjcm9ueW0gZm9yCit0aGUgIkludGVyLUlDIiBidXMsIGEgc2ltcGxlIGJ1cyBwcm90b2NvbCB3aGljaCBpcyB3aWRlbHkgdXNlZCB3aGVyZSBsb3cKK2RhdGEgcmF0ZSBjb21tdW5pY2F0aW9ucyBzdWZmaWNlLiBTaW5jZSBpdCdzIGFsc28gYSBsaWNlbnNlZCB0cmFkZW1hcmssCitzb21lIHZlbmRvcnMgdXNlIGFub3RoZXIgbmFtZSAoc3VjaCBhcyAiVHdvLVdpcmUgSW50ZXJmYWNlIiwgVFdJKSBmb3IKK3RoZSBzYW1lIGJ1cy4gSTJDIG9ubHkgbmVlZHMgdHdvIHNpZ25hbHMgKFNDTCBmb3IgY2xvY2ssIFNEQSBmb3IgZGF0YSksCitjb25zZXJ2aW5nIGJvYXJkIHJlYWwgZXN0YXRlIGFuZCBtaW5pbWl6aW5nIHNpZ25hbCBxdWFsaXR5IGlzc3Vlcy4gTW9zdAorSTJDIGRldmljZXMgdXNlIHNldmVuIGJpdCBhZGRyZXNzZXMsIGFuZCBidXMgc3BlZWRzIG9mIHVwIHRvIDQwMCBrSHo7Cit0aGVyZSdzIGEgaGlnaCBzcGVlZCBleHRlbnNpb24gKDMuNCBNSHopIHRoYXQncyBub3QgeWV0IGZvdW5kIHdpZGUgdXNlLgorSTJDIGlzIGEgbXVsdGktbWFzdGVyIGJ1czsgb3BlbiBkcmFpbiBzaWduYWxpbmcgaXMgdXNlZCB0byBhcmJpdHJhdGUKK2JldHdlZW4gbWFzdGVycywgYXMgd2VsbCBhcyB0byBoYW5kc2hha2UgYW5kIHRvIHN5bmNocm9uaXplIGNsb2NrcyBmcm9tCitzbG93ZXIgY2xpZW50cy4KKworVGhlIExpbnV4IEkyQyBwcm9ncmFtbWluZyBpbnRlcmZhY2VzIHN1cHBvcnQgb25seSB0aGUgbWFzdGVyIHNpZGUgb2YgYnVzCitpbnRlcmFjdGlvbnMsIG5vdCB0aGUgc2xhdmUgc2lkZS4gVGhlIHByb2dyYW1taW5nIGludGVyZmFjZSBpcworc3RydWN0dXJlZCBhcm91bmQgdHdvIGtpbmRzIG9mIGRyaXZlciwgYW5kIHR3byBraW5kcyBvZiBkZXZpY2UuIEFuIEkyQworIkFkYXB0ZXIgRHJpdmVyIiBhYnN0cmFjdHMgdGhlIGNvbnRyb2xsZXIgaGFyZHdhcmU7IGl0IGJpbmRzIHRvIGEKK3BoeXNpY2FsIGRldmljZSAocGVyaGFwcyBhIFBDSSBkZXZpY2Ugb3IgcGxhdGZvcm1fZGV2aWNlKSBhbmQgZXhwb3NlcyBhCis6Yzp0eXBlOmBzdHJ1Y3QgaTJjX2FkYXB0ZXIgPGkyY19hZGFwdGVyPmAgcmVwcmVzZW50aW5nIGVhY2gKK0kyQyBidXMgc2VnbWVudCBpdCBtYW5hZ2VzLiBPbiBlYWNoIEkyQyBidXMgc2VnbWVudCB3aWxsIGJlIEkyQyBkZXZpY2VzCityZXByZXNlbnRlZCBieSBhIDpjOnR5cGU6YHN0cnVjdCBpMmNfY2xpZW50IDxpMmNfY2xpZW50PmAuCitUaG9zZSBkZXZpY2VzIHdpbGwgYmUgYm91bmQgdG8gYSA6Yzp0eXBlOmBzdHJ1Y3QgaTJjX2RyaXZlcgorPGkyY19kcml2ZXI+YCwgd2hpY2ggc2hvdWxkIGZvbGxvdyB0aGUgc3RhbmRhcmQgTGludXggZHJpdmVyCittb2RlbC4gKEF0IHRoaXMgd3JpdGluZywgYSBsZWdhY3kgbW9kZWwgaXMgbW9yZSB3aWRlbHkgdXNlZC4pIFRoZXJlIGFyZQorZnVuY3Rpb25zIHRvIHBlcmZvcm0gdmFyaW91cyBJMkMgcHJvdG9jb2wgb3BlcmF0aW9uczsgYXQgdGhpcyB3cml0aW5nCithbGwgc3VjaCBmdW5jdGlvbnMgYXJlIHVzYWJsZSBvbmx5IGZyb20gdGFzayBjb250ZXh0LgorCitUaGUgU3lzdGVtIE1hbmFnZW1lbnQgQnVzIChTTUJ1cykgaXMgYSBzaWJsaW5nIHByb3RvY29sLiBNb3N0IFNNQnVzCitzeXN0ZW1zIGFyZSBhbHNvIEkyQyBjb25mb3JtYW50LiBUaGUgZWxlY3RyaWNhbCBjb25zdHJhaW50cyBhcmUgdGlnaHRlcgorZm9yIFNNQnVzLCBhbmQgaXQgc3RhbmRhcmRpemVzIHBhcnRpY3VsYXIgcHJvdG9jb2wgbWVzc2FnZXMgYW5kIGlkaW9tcy4KK0NvbnRyb2xsZXJzIHRoYXQgc3VwcG9ydCBJMkMgY2FuIGFsc28gc3VwcG9ydCBtb3N0IFNNQnVzIG9wZXJhdGlvbnMsIGJ1dAorU01CdXMgY29udHJvbGxlcnMgZG9uJ3Qgc3VwcG9ydCBhbGwgdGhlIHByb3RvY29sIG9wdGlvbnMgdGhhdCBhbiBJMkMKK2NvbnRyb2xsZXIgd2lsbC4gVGhlcmUgYXJlIGZ1bmN0aW9ucyB0byBwZXJmb3JtIHZhcmlvdXMgU01CdXMgcHJvdG9jb2wKK29wZXJhdGlvbnMsIGVpdGhlciB1c2luZyBJMkMgcHJpbWl0aXZlcyBvciBieSBpc3N1aW5nIFNNQnVzIGNvbW1hbmRzIHRvCitpMmNfYWRhcHRlciBkZXZpY2VzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhvc2UgSTJDIG9wZXJhdGlvbnMuCisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2kyYy5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2kyYy9pMmMtYm9hcmRpbmZvLmMKKyAgIDpmdW5jdGlvbnM6IGkyY19yZWdpc3Rlcl9ib2FyZF9pbmZvCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2kyYy9pMmMtY29yZS5jCisgICA6ZXhwb3J0OgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pbmRleC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyNTljNWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaW5kZXgucnN0CkBAIC0wLDAgKzEsMjYgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZSBMaW51eCBkcml2ZXIgaW1wbGVtZW50ZXIncyBBUEkgZ3VpZGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIGtlcm5lbCBvZmZlcnMgYSB3aWRlIHZhcmlldHkgb2YgaW50ZXJmYWNlcyB0byBzdXBwb3J0IHRoZSBkZXZlbG9wbWVudAorb2YgZGV2aWNlIGRyaXZlcnMuICBUaGlzIGRvY3VtZW50IGlzIGFuIG9ubHkgc29tZXdoYXQgb3JnYW5pemVkIGNvbGxlY3Rpb24KK29mIHNvbWUgb2YgdGhvc2UgaW50ZXJmYWNlcyDigJQgaXQgd2lsbCBob3BlZnVsbHkgZ2V0IGJldHRlciBvdmVyIHRpbWUhICBUaGUKK2F2YWlsYWJsZSBzdWJzZWN0aW9ucyBjYW4gYmUgc2VlbiBiZWxvdy4KKworLi4gY2xhc3M6OiB0b2MtdGl0bGUKKworCSAgIFRhYmxlIG9mIGNvbnRlbnRzCisKKy4uIHRvY3RyZWU6OgorICAgOm1heGRlcHRoOiAyCisKKyAgIGJhc2ljcworICAgaW5mcmFzdHJ1Y3R1cmUKKyAgIG1lc3NhZ2UtYmFzZWQKKyAgIHNvdW5kCisgICBmcmFtZS1idWZmZXIKKyAgIGlucHV0CisgICBzcGkKKyAgIGkyYworICAgaHNpCisgICBtaXNjZWxsYW5lb3VzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvaW5mcmFzdHJ1Y3R1cmUucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2luZnJhc3RydWN0dXJlLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDUwZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2luZnJhc3RydWN0dXJlLnJzdApAQCAtMCwwICsxLDE2OSBAQAorRGV2aWNlIGRyaXZlcnMgaW5mcmFzdHJ1Y3R1cmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBCYXNpYyBEZXZpY2UgRHJpdmVyLU1vZGVsIFN0cnVjdHVyZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvZGV2aWNlLmgKKyAgIDppbnRlcm5hbDoKKworRGV2aWNlIERyaXZlcnMgQmFzZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL2luaXQuYworICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL2RyaXZlci5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL2NvcmUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9zeXNjb3JlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvY2xhc3MuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9ub2RlLmMKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL3RyYW5zcG9ydF9jbGFzcy5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL2RkLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYmFzZS9idXMuYworICAgOmV4cG9ydDoKKworQnVmZmVyIFNoYXJpbmcgYW5kIFN5bmNocm9uaXphdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZG1hLWJ1ZiBzdWJzeXN0ZW0gcHJvdmlkZXMgdGhlIGZyYW1ld29yayBmb3Igc2hhcmluZyBidWZmZXJzIGZvcgoraGFyZHdhcmUgKERNQSkgYWNjZXNzIGFjcm9zcyBtdWx0aXBsZSBkZXZpY2UgZHJpdmVycyBhbmQgc3Vic3lzdGVtcywgYW5kCitmb3Igc3luY2hyb25pemluZyBhc3luY2hyb25vdXMgaGFyZHdhcmUgYWNjZXNzLgorCitUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCBieSBkcm0gInByaW1lIiBtdWx0aS1HUFUgc3VwcG9ydCwgYnV0IGlzIG9mCitjb3Vyc2Ugbm90IGxpbWl0ZWQgdG8gR1BVIHVzZSBjYXNlcy4KKworVGhlIHRocmVlIG1haW4gY29tcG9uZW50cyBvZiB0aGlzIGFyZTogKDEpIGRtYS1idWYsIHJlcHJlc2VudGluZyBhCitzZ190YWJsZSBhbmQgZXhwb3NlZCB0byB1c2Vyc3BhY2UgYXMgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYWxsb3cgcGFzc2luZworYmV0d2VlbiBkZXZpY2VzLCAoMikgZmVuY2UsIHdoaWNoIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHNpZ25hbCB3aGVuCitvbmUgZGV2aWNlIGFzIGZpbmlzaGVkIGFjY2VzcywgYW5kICgzKSByZXNlcnZhdGlvbiwgd2hpY2ggbWFuYWdlcyB0aGUKK3NoYXJlZCBvciBleGNsdXNpdmUgZmVuY2UocykgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIuCisKK2RtYS1idWYKK35+fn5+fn4KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZG1hLWJ1Zi9kbWEtYnVmLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2RtYS1idWYuaAorICAgOmludGVybmFsOgorCityZXNlcnZhdGlvbgorfn5+fn5+fn5+fn4KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZG1hLWJ1Zi9yZXNlcnZhdGlvbi5jCisgICA6ZG9jOiBSZXNlcnZhdGlvbiBPYmplY3QgT3ZlcnZpZXcKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZG1hLWJ1Zi9yZXNlcnZhdGlvbi5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9yZXNlcnZhdGlvbi5oCisgICA6aW50ZXJuYWw6CisKK2ZlbmNlCit+fn5+fgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9kbWEtYnVmL2ZlbmNlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L2ZlbmNlLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZG1hLWJ1Zi9zZXFuby1mZW5jZS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9zZXFuby1mZW5jZS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2RtYS1idWYvZmVuY2UtYXJyYXkuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvZmVuY2UtYXJyYXkuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9kbWEtYnVmL3Jlc2VydmF0aW9uLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3Jlc2VydmF0aW9uLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZG1hLWJ1Zi9zeW5jX2ZpbGUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvc3luY19maWxlLmgKKyAgIDppbnRlcm5hbDoKKworRGV2aWNlIERyaXZlcnMgRE1BIE1hbmFnZW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2Jhc2UvZG1hLW1hcHBpbmcuYworICAgOmV4cG9ydDoKKworRGV2aWNlIERyaXZlcnMgUG93ZXIgTWFuYWdlbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYworICAgOmV4cG9ydDoKKworRGV2aWNlIERyaXZlcnMgQUNQSSBTdXBwb3J0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvYWNwaS9zY2FuLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2FjcGkvc2Nhbi5jCisgICA6aW50ZXJuYWw6CisKK0RldmljZSBkcml2ZXJzIFBuUCBzdXBwb3J0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9wbnAvY29yZS5jCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3BucC9jYXJkLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3BucC9kcml2ZXIuYworICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9wbnAvbWFuYWdlci5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9wbnAvc3VwcG9ydC5jCisgICA6ZXhwb3J0OgorCitVc2Vyc3BhY2UgSU8gZGV2aWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvdWlvL3Vpby5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC91aW9fZHJpdmVyLmgKKyAgIDppbnRlcm5hbDoKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL2lucHV0LnJzdCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pbnB1dC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1YmY1OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9pbnB1dC5yc3QKQEAgLTAsMCArMSw1MSBAQAorSW5wdXQgU3Vic3lzdGVtCis9PT09PT09PT09PT09PT0KKworSW5wdXQgY29yZQorLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9pbnB1dC5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2lucHV0L2lucHV0LmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2lucHV0L2ZmLWNvcmUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaW5wdXQvZmYtbWVtbGVzcy5jCisgICA6ZXhwb3J0OgorCitNdWx0aXRvdWNoIExpYnJhcnkKKy0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9pbnB1dC9tdC5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2lucHV0L2lucHV0LW10LmMKKyAgIDpleHBvcnQ6CisKK1BvbGxlZCBpbnB1dCBkZXZpY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9pbnB1dC1wb2xsZGV2LmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvaW5wdXQvaW5wdXQtcG9sbGRldi5jCisgICA6ZXhwb3J0OgorCitNYXRyaXgga2V5Ym9hcmRzL2tleXBhZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmgKKyAgIDppbnRlcm5hbDoKKworU3BhcnNlIGtleW1hcCBzdXBwb3J0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvbGludXgvaW5wdXQvc3BhcnNlLWtleW1hcC5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2lucHV0L3NwYXJzZS1rZXltYXAuYworICAgOmV4cG9ydDoKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL21lc3NhZ2UtYmFzZWQucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL21lc3NhZ2UtYmFzZWQucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZmY5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvbWVzc2FnZS1iYXNlZC5yc3QKQEAgLTAsMCArMSwxMiBAQAorTWVzc2FnZS1iYXNlZCBkZXZpY2VzCis9PT09PT09PT09PT09PT09PT09PT0KKworRnVzaW9uIG1lc3NhZ2UgZGV2aWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKKyAgIDpleHBvcnQ6CisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9taXNjZWxsYW5lb3VzLnJzdCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9taXNjZWxsYW5lb3VzLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGE3ZDExCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL21pc2NlbGxhbmVvdXMucnN0CkBAIC0wLDAgKzEsNTAgQEAKK1BhcmFsbGVsIFBvcnQgRGV2aWNlcworPT09PT09PT09PT09PT09PT09PT09CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL2xpbnV4L3BhcnBvcnQuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9wYXJwb3J0L2llZWUxMjg0LmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3BhcnBvcnQvc2hhcmUuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvcGFycG9ydC9kYWlzeS5jCisgICA6aW50ZXJuYWw6CisKKzE2eDUwIFVBUlQgRHJpdmVyCis9PT09PT09PT09PT09PT09PQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy90dHkvc2VyaWFsL3NlcmlhbF9jb3JlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2NvcmUuYworICAgOmV4cG9ydDoKKworUHVsc2UtV2lkdGggTW9kdWxhdGlvbiAoUFdNKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQdWxzZS13aWR0aCBtb2R1bGF0aW9uIGlzIGEgbW9kdWxhdGlvbiB0ZWNobmlxdWUgcHJpbWFyaWx5IHVzZWQgdG8KK2NvbnRyb2wgcG93ZXIgc3VwcGxpZWQgdG8gZWxlY3RyaWNhbCBkZXZpY2VzLgorCitUaGUgUFdNIGZyYW1ld29yayBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBmb3IgcHJvdmlkZXJzIGFuZCBjb25zdW1lcnMgb2YKK1BXTSBzaWduYWxzLiBBIGNvbnRyb2xsZXIgdGhhdCBwcm92aWRlcyBvbmUgb3IgbW9yZSBQV00gc2lnbmFscyBpcworcmVnaXN0ZXJlZCBhcyA6Yzp0eXBlOmBzdHJ1Y3QgcHdtX2NoaXAgPHB3bV9jaGlwPmAuIFByb3ZpZGVycworYXJlIGV4cGVjdGVkIHRvIGVtYmVkIHRoaXMgc3RydWN0dXJlIGluIGEgZHJpdmVyLXNwZWNpZmljIHN0cnVjdHVyZS4KK1RoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGZpZWxkcyB0aGF0IGRlc2NyaWJlIGEgcGFydGljdWxhciBjaGlwLgorCitBIGNoaXAgZXhwb3NlcyBvbmUgb3IgbW9yZSBQV00gc2lnbmFsIHNvdXJjZXMsIGVhY2ggb2Ygd2hpY2ggZXhwb3NlZCBhcworYSA6Yzp0eXBlOmBzdHJ1Y3QgcHdtX2RldmljZSA8cHdtX2RldmljZT5gLiBPcGVyYXRpb25zIGNhbiBiZQorcGVyZm9ybWVkIG9uIFBXTSBkZXZpY2VzIHRvIGNvbnRyb2wgdGhlIHBlcmlvZCwgZHV0eSBjeWNsZSwgcG9sYXJpdHkgYW5kCithY3RpdmUgc3RhdGUgb2YgdGhlIHNpZ25hbC4KKworTm90ZSB0aGF0IFBXTSBkZXZpY2VzIGFyZSBleGNsdXNpdmUgcmVzb3VyY2VzOiB0aGV5IGNhbiBhbHdheXMgb25seSBiZQordXNlZCBieSBvbmUgY29uc3VtZXIgYXQgYSB0aW1lLgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9wd20uaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9wd20vY29yZS5jCisgICA6ZXhwb3J0OgorICAgCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvc291bmQucnN0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL3NvdW5kLnJzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmVmNmVhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBpL3NvdW5kLnJzdApAQCAtMCwwICsxLDU0IEBACitTb3VuZCBEZXZpY2VzCis9PT09PT09PT09PT09CisKKy4uIGtlcm5lbC1kb2M6OiBpbmNsdWRlL3NvdW5kL2NvcmUuaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvc291bmRfY29yZS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9zb3VuZC9wY20uaAorICAgOmludGVybmFsOgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9wY20uYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvZGV2aWNlLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL2luZm8uYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvcmF3bWlkaS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9zb3VuZC5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9tZW1vcnkuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvcGNtX21lbW9yeS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9pbml0LmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL2lzYWRtYS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9jb250cm9sLmMKKyAgIDpleHBvcnQ6CisKKy4uIGtlcm5lbC1kb2M6OiBzb3VuZC9jb3JlL3BjbV9saWIuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvaHdkZXAuYworICAgOmV4cG9ydDoKKworLi4ga2VybmVsLWRvYzo6IHNvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCisgICA6ZXhwb3J0OgorCisuLiBrZXJuZWwtZG9jOjogc291bmQvY29yZS9tZW1hbGxvYy5jCisgICA6ZXhwb3J0OgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvc3BpLnJzdCBiL0RvY3VtZW50YXRpb24vZHJpdmVyLWFwaS9zcGkucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NGNiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1hcGkvc3BpLnJzdApAQCAtMCwwICsxLDUzIEBACitTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UgKFNQSSkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTUEkgaXMgdGhlICJTZXJpYWwgUGVyaXBoZXJhbCBJbnRlcmZhY2UiLCB3aWRlbHkgdXNlZCB3aXRoIGVtYmVkZGVkCitzeXN0ZW1zIGJlY2F1c2UgaXQgaXMgYSBzaW1wbGUgYW5kIGVmZmljaWVudCBpbnRlcmZhY2U6IGJhc2ljYWxseSBhCittdWx0aXBsZXhlZCBzaGlmdCByZWdpc3Rlci4gSXRzIHRocmVlIHNpZ25hbCB3aXJlcyBob2xkIGEgY2xvY2sgKFNDSywKK29mdGVuIGluIHRoZSByYW5nZSBvZiAxLTIwIE1IeiksIGEgIk1hc3RlciBPdXQsIFNsYXZlIEluIiAoTU9TSSkgZGF0YQorbGluZSwgYW5kIGEgIk1hc3RlciBJbiwgU2xhdmUgT3V0IiAoTUlTTykgZGF0YSBsaW5lLiBTUEkgaXMgYSBmdWxsCitkdXBsZXggcHJvdG9jb2w7IGZvciBlYWNoIGJpdCBzaGlmdGVkIG91dCB0aGUgTU9TSSBsaW5lIChvbmUgcGVyIGNsb2NrKQorYW5vdGhlciBpcyBzaGlmdGVkIGluIG9uIHRoZSBNSVNPIGxpbmUuIFRob3NlIGJpdHMgYXJlIGFzc2VtYmxlZCBpbnRvCit3b3JkcyBvZiB2YXJpb3VzIHNpemVzIG9uIHRoZSB3YXkgdG8gYW5kIGZyb20gc3lzdGVtIG1lbW9yeS4gQW4KK2FkZGl0aW9uYWwgY2hpcHNlbGVjdCBsaW5lIGlzIHVzdWFsbHkgYWN0aXZlLWxvdyAobkNTKTsgZm91ciBzaWduYWxzIGFyZQorbm9ybWFsbHkgdXNlZCBmb3IgZWFjaCBwZXJpcGhlcmFsLCBwbHVzIHNvbWV0aW1lcyBhbiBpbnRlcnJ1cHQuCisKK1RoZSBTUEkgYnVzIGZhY2lsaXRpZXMgbGlzdGVkIGhlcmUgcHJvdmlkZSBhIGdlbmVyYWxpemVkIGludGVyZmFjZSB0bworZGVjbGFyZSBTUEkgYnVzc2VzIGFuZCBkZXZpY2VzLCBtYW5hZ2UgdGhlbSBhY2NvcmRpbmcgdG8gdGhlIHN0YW5kYXJkCitMaW51eCBkcml2ZXIgbW9kZWwsIGFuZCBwZXJmb3JtIGlucHV0L291dHB1dCBvcGVyYXRpb25zLiBBdCB0aGlzIHRpbWUsCitvbmx5ICJtYXN0ZXIiIHNpZGUgaW50ZXJmYWNlcyBhcmUgc3VwcG9ydGVkLCB3aGVyZSBMaW51eCB0YWxrcyB0byBTUEkKK3BlcmlwaGVyYWxzIGFuZCBkb2VzIG5vdCBpbXBsZW1lbnQgc3VjaCBhIHBlcmlwaGVyYWwgaXRzZWxmLiAoSW50ZXJmYWNlcwordG8gc3VwcG9ydCBpbXBsZW1lbnRpbmcgU1BJIHNsYXZlcyB3b3VsZCBuZWNlc3NhcmlseSBsb29rIGRpZmZlcmVudC4pCisKK1RoZSBwcm9ncmFtbWluZyBpbnRlcmZhY2UgaXMgc3RydWN0dXJlZCBhcm91bmQgdHdvIGtpbmRzIG9mIGRyaXZlciwgYW5kCit0d28ga2luZHMgb2YgZGV2aWNlLiBBICJDb250cm9sbGVyIERyaXZlciIgYWJzdHJhY3RzIHRoZSBjb250cm9sbGVyCitoYXJkd2FyZSwgd2hpY2ggbWF5IGJlIGFzIHNpbXBsZSBhcyBhIHNldCBvZiBHUElPIHBpbnMgb3IgYXMgY29tcGxleCBhcworYSBwYWlyIG9mIEZJRk9zIGNvbm5lY3RlZCB0byBkdWFsIERNQSBlbmdpbmVzIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZQorU1BJIHNoaWZ0IHJlZ2lzdGVyIChtYXhpbWl6aW5nIHRocm91Z2hwdXQpLiBTdWNoIGRyaXZlcnMgYnJpZGdlIGJldHdlZW4KK3doYXRldmVyIGJ1cyB0aGV5IHNpdCBvbiAob2Z0ZW4gdGhlIHBsYXRmb3JtIGJ1cykgYW5kIFNQSSwgYW5kIGV4cG9zZQordGhlIFNQSSBzaWRlIG9mIHRoZWlyIGRldmljZSBhcyBhIDpjOnR5cGU6YHN0cnVjdCBzcGlfbWFzdGVyCis8c3BpX21hc3Rlcj5gLiBTUEkgZGV2aWNlcyBhcmUgY2hpbGRyZW4gb2YgdGhhdCBtYXN0ZXIsCityZXByZXNlbnRlZCBhcyBhIDpjOnR5cGU6YHN0cnVjdCBzcGlfZGV2aWNlIDxzcGlfZGV2aWNlPmAgYW5kCittYW51ZmFjdHVyZWQgZnJvbSA6Yzp0eXBlOmBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8KKzxzcGlfYm9hcmRfaW5mbz5gIGRlc2NyaXB0b3JzIHdoaWNoIGFyZSB1c3VhbGx5IHByb3ZpZGVkIGJ5Citib2FyZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBjb2RlLiBBIDpjOnR5cGU6YHN0cnVjdCBzcGlfZHJpdmVyCis8c3BpX2RyaXZlcj5gIGlzIGNhbGxlZCBhICJQcm90b2NvbCBEcml2ZXIiLCBhbmQgaXMgYm91bmQgdG8gYQorc3BpX2RldmljZSB1c2luZyBub3JtYWwgZHJpdmVyIG1vZGVsIGNhbGxzLgorCitUaGUgSS9PIG1vZGVsIGlzIGEgc2V0IG9mIHF1ZXVlZCBtZXNzYWdlcy4gUHJvdG9jb2wgZHJpdmVycyBzdWJtaXQgb25lCitvciBtb3JlIDpjOnR5cGU6YHN0cnVjdCBzcGlfbWVzc2FnZSA8c3BpX21lc3NhZ2U+YCBvYmplY3RzLAord2hpY2ggYXJlIHByb2Nlc3NlZCBhbmQgY29tcGxldGVkIGFzeW5jaHJvbm91c2x5LiAoVGhlcmUgYXJlIHN5bmNocm9ub3VzCit3cmFwcGVycywgaG93ZXZlci4pIE1lc3NhZ2VzIGFyZSBidWlsdCBmcm9tIG9uZSBvciBtb3JlCis6Yzp0eXBlOmBzdHJ1Y3Qgc3BpX3RyYW5zZmVyIDxzcGlfdHJhbnNmZXI+YCBvYmplY3RzLCBlYWNoIG9mCit3aGljaCB3cmFwcyBhIGZ1bGwgZHVwbGV4IFNQSSB0cmFuc2Zlci4gQSB2YXJpZXR5IG9mIHByb3RvY29sIHR3ZWFraW5nCitvcHRpb25zIGFyZSBuZWVkZWQsIGJlY2F1c2UgZGlmZmVyZW50IGNoaXBzIGFkb3B0IHZlcnkgZGlmZmVyZW50Citwb2xpY2llcyBmb3IgaG93IHRoZXkgdXNlIHRoZSBiaXRzIHRyYW5zZmVycmVkIHdpdGggU1BJLgorCisuLiBrZXJuZWwtZG9jOjogaW5jbHVkZS9saW51eC9zcGkvc3BpLmgKKyAgIDppbnRlcm5hbDoKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvc3BpL3NwaS5jCisgICA6ZnVuY3Rpb25zOiBzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbworCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9zcGkvc3BpLmMKKyAgIDpleHBvcnQ6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZpY2UudHh0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZGV2aWNlLnR4dAppbmRleCAxZTcwMjIwLi4yNDAzZWI4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZpY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldmljZS50eHQKQEAgLTUwLDcgKzUwLDcgQEAKIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zeXNmcy50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24KIG9uIGhvdyBzeXNmcyB3b3Jrcy4KIAotQXMgZXhwbGFpbmVkIGluIERvY3VtZW50YXRpb24va29iamVjdC50eHQsIGRldmljZSBhdHRyaWJ1dGVzIG11c3QgYmUgYmUKK0FzIGV4cGxhaW5lZCBpbiBEb2N1bWVudGF0aW9uL2tvYmplY3QudHh0LCBkZXZpY2UgYXR0cmlidXRlcyBtdXN0IGJlCiBjcmVhdGVkIGJlZm9yZSB0aGUgS09CSl9BREQgdWV2ZW50IGlzIGdlbmVyYXRlZC4gVGhlIG9ubHkgd2F5IHRvIHJlYWxpemUKIHRoYXQgaXMgYnkgZGVmaW5pbmcgYW4gYXR0cmlidXRlIGdyb3VwLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZyZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZGV2cmVzLnR4dAppbmRleCBiMGQ3NzVkLi4xNjcwNzA4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZyZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldnJlcy50eHQKQEAgLTI2Niw4ICsyNjYsMTIgQEAKICAgZGV2bV9paW9fZGV2aWNlX3VucmVnaXN0ZXIoKQogICBkZXZtX2lpb19rZmlmb19hbGxvY2F0ZSgpCiAgIGRldm1faWlvX2tmaWZvX2ZyZWUoKQorICBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKCkKKyAgZGV2bV9paW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKCkKICAgZGV2bV9paW9fdHJpZ2dlcl9hbGxvYygpCiAgIGRldm1faWlvX3RyaWdnZXJfZnJlZSgpCisgIGRldm1faWlvX3RyaWdnZXJfcmVnaXN0ZXIoKQorICBkZXZtX2lpb190cmlnZ2VyX3VucmVnaXN0ZXIoKQogICBkZXZtX2lpb19jaGFubmVsX2dldCgpCiAgIGRldm1faWlvX2NoYW5uZWxfcmVsZWFzZSgpCiAgIGRldm1faWlvX2NoYW5uZWxfZ2V0X2FsbCgpCkBAIC0zNDIsNiArMzQ2LDEwIEBACiAgIGRldm1fcGluY3RybF9yZWdpc3RlcigpCiAgIGRldm1fcGluY3RybF91bnJlZ2lzdGVyKCkKIAorUE9XRVIKKyAgZGV2bV9yZWJvb3RfbW9kZV9yZWdpc3RlcigpCisgIGRldm1fcmVib290X21vZGVfdW5yZWdpc3RlcigpCisKIFBXTQogICBkZXZtX3B3bV9nZXQoKQogICBkZXZtX3B3bV9wdXQoKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dCBiL0RvY3VtZW50YXRpb24vZW1haWwtY2xpZW50cy50eHQKaW5kZXggMmQ0ODVkZS4uYWM4OTJiMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9lbWFpbC1jbGllbnRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2VtYWlsLWNsaWVudHMudHh0CkBAIC0xLDIzICsxLDI3IEBACisuLiBfZW1haWxfY2xpZW50czoKKwogRW1haWwgY2xpZW50cyBpbmZvIGZvciBMaW51eAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBHaXQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVRoZXNlIGRheXMgbW9zdCBkZXZlbG9wZXJzIHVzZSBgZ2l0IHNlbmQtZW1haWxgIGluc3RlYWQgb2YgcmVndWxhcgotZW1haWwgY2xpZW50cy4gIFRoZSBtYW4gcGFnZSBmb3IgdGhpcyBpcyBxdWl0ZSBnb29kLiAgT24gdGhlIHJlY2VpdmluZwotZW5kLCBtYWludGFpbmVycyB1c2UgYGdpdCBhbWAgdG8gYXBwbHkgdGhlIHBhdGNoZXMuCistLS0KIAotSWYgeW91IGFyZSBuZXcgdG8gZ2l0IHRoZW4gc2VuZCB5b3VyIGZpcnN0IHBhdGNoIHRvIHlvdXJzZWxmLiAgU2F2ZSBpdAotYXMgcmF3IHRleHQgaW5jbHVkaW5nIGFsbCB0aGUgaGVhZGVycy4gIFJ1biBgZ2l0IGFtIHJhd19lbWFpbC50eHRgIGFuZAotdGhlbiByZXZpZXcgdGhlIGNoYW5nZWxvZyB3aXRoIGBnaXQgbG9nYC4gIFdoZW4gdGhhdCB3b3JrcyB0aGVuIHNlbmQKK1RoZXNlIGRheXMgbW9zdCBkZXZlbG9wZXJzIHVzZSBgYGdpdCBzZW5kLWVtYWlsYGAgaW5zdGVhZCBvZiByZWd1bGFyCitlbWFpbCBjbGllbnRzLiAgVGhlIG1hbiBwYWdlIGZvciB0aGlzIGlzIHF1aXRlIGdvb2QuICBPbiB0aGUgcmVjZWl2aW5nCitlbmQsIG1haW50YWluZXJzIHVzZSBgYGdpdCBhbWBgIHRvIGFwcGx5IHRoZSBwYXRjaGVzLgorCitJZiB5b3UgYXJlIG5ldyB0byBgYGdpdGBgIHRoZW4gc2VuZCB5b3VyIGZpcnN0IHBhdGNoIHRvIHlvdXJzZWxmLiAgU2F2ZSBpdAorYXMgcmF3IHRleHQgaW5jbHVkaW5nIGFsbCB0aGUgaGVhZGVycy4gIFJ1biBgYGdpdCBhbSByYXdfZW1haWwudHh0YGAgYW5kCit0aGVuIHJldmlldyB0aGUgY2hhbmdlbG9nIHdpdGggYGBnaXQgbG9nYGAuICBXaGVuIHRoYXQgd29ya3MgdGhlbiBzZW5kCiB0aGUgcGF0Y2ggdG8gdGhlIGFwcHJvcHJpYXRlIG1haWxpbmcgbGlzdChzKS4KIAogR2VuZXJhbCBQcmVmZXJlbmNlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBQYXRjaGVzIGZvciB0aGUgTGludXgga2VybmVsIGFyZSBzdWJtaXR0ZWQgdmlhIGVtYWlsLCBwcmVmZXJhYmx5IGFzCiBpbmxpbmUgdGV4dCBpbiB0aGUgYm9keSBvZiB0aGUgZW1haWwuICBTb21lIG1haW50YWluZXJzIGFjY2VwdAogYXR0YWNobWVudHMsIGJ1dCB0aGVuIHRoZSBhdHRhY2htZW50cyBzaG91bGQgaGF2ZSBjb250ZW50LXR5cGUKLSJ0ZXh0L3BsYWluIi4gIEhvd2V2ZXIsIGF0dGFjaG1lbnRzIGFyZSBnZW5lcmFsbHkgZnJvd25lZCB1cG9uIGJlY2F1c2UKK2BgdGV4dC9wbGFpbmBgLiAgSG93ZXZlciwgYXR0YWNobWVudHMgYXJlIGdlbmVyYWxseSBmcm93bmVkIHVwb24gYmVjYXVzZQogaXQgbWFrZXMgcXVvdGluZyBwb3J0aW9ucyBvZiB0aGUgcGF0Y2ggbW9yZSBkaWZmaWN1bHQgaW4gdGhlIHBhdGNoCiByZXZpZXcgcHJvY2Vzcy4KIApAQCAtMjUsNyArMjksNyBAQAogcGF0Y2ggdGV4dCB1bnRvdWNoZWQuICBGb3IgZXhhbXBsZSwgdGhleSBzaG91bGQgbm90IG1vZGlmeSBvciBkZWxldGUgdGFicwogb3Igc3BhY2VzLCBldmVuIGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIGxpbmVzLgogCi1Eb24ndCBzZW5kIHBhdGNoZXMgd2l0aCAiZm9ybWF0PWZsb3dlZCIuICBUaGlzIGNhbiBjYXVzZSB1bmV4cGVjdGVkCitEb24ndCBzZW5kIHBhdGNoZXMgd2l0aCBgYGZvcm1hdD1mbG93ZWRgYC4gIFRoaXMgY2FuIGNhdXNlIHVuZXhwZWN0ZWQKIGFuZCB1bndhbnRlZCBsaW5lIGJyZWFrcy4KIAogRG9uJ3QgbGV0IHlvdXIgZW1haWwgY2xpZW50IGRvIGF1dG9tYXRpYyB3b3JkIHdyYXBwaW5nIGZvciB5b3UuCkBAIC01NCw1NyArNTgsNjMgQEAKIAogCiBTb21lIGVtYWlsIGNsaWVudCAoTVVBKSBoaW50cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogSGVyZSBhcmUgc29tZSBzcGVjaWZpYyBNVUEgY29uZmlndXJhdGlvbiBoaW50cyBmb3IgZWRpdGluZyBhbmQgc2VuZGluZwogcGF0Y2hlcyBmb3IgdGhlIExpbnV4IGtlcm5lbC4gIFRoZXNlIGFyZSBub3QgbWVhbnQgdG8gYmUgY29tcGxldGUKIHNvZnR3YXJlIHBhY2thZ2UgY29uZmlndXJhdGlvbiBzdW1tYXJpZXMuCiAKLUxlZ2VuZDoKLVRVSSA9IHRleHQtYmFzZWQgdXNlciBpbnRlcmZhY2UKLUdVSSA9IGdyYXBoaWNhbCB1c2VyIGludGVyZmFjZQogCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorTGVnZW5kOgorCistIFRVSSA9IHRleHQtYmFzZWQgdXNlciBpbnRlcmZhY2UKKy0gR1VJID0gZ3JhcGhpY2FsIHVzZXIgaW50ZXJmYWNlCisKIEFscGluZSAoVFVJKQorKioqKioqKioqKioqCiAKIENvbmZpZyBvcHRpb25zOgotSW4gdGhlICJTZW5kaW5nIFByZWZlcmVuY2VzIiBzZWN0aW9uOgogCi0tICJEbyBOb3QgU2VuZCBGbG93ZWQgVGV4dCIgbXVzdCBiZSBlbmFibGVkCi0tICJTdHJpcCBXaGl0ZXNwYWNlIEJlZm9yZSBTZW5kaW5nIiBtdXN0IGJlIGRpc2FibGVkCitJbiB0aGUgOm1lbnVzZWxlY3Rpb246YFNlbmRpbmcgUHJlZmVyZW5jZXNgIHNlY3Rpb246CisKKy0gOm1lbnVzZWxlY3Rpb246YERvIE5vdCBTZW5kIEZsb3dlZCBUZXh0YCBtdXN0IGJlIGBgZW5hYmxlZGBgCistIDptZW51c2VsZWN0aW9uOmBTdHJpcCBXaGl0ZXNwYWNlIEJlZm9yZSBTZW5kaW5nYCBtdXN0IGJlIGBgZGlzYWJsZWRgYAogCiBXaGVuIGNvbXBvc2luZyB0aGUgbWVzc2FnZSwgdGhlIGN1cnNvciBzaG91bGQgYmUgcGxhY2VkIHdoZXJlIHRoZSBwYXRjaAotc2hvdWxkIGFwcGVhciwgYW5kIHRoZW4gcHJlc3NpbmcgQ1RSTC1SIGxldCB5b3Ugc3BlY2lmeSB0aGUgcGF0Y2ggZmlsZQorc2hvdWxkIGFwcGVhciwgYW5kIHRoZW4gcHJlc3NpbmcgOmtiZDpgQ1RSTC1SYCBsZXQgeW91IHNwZWNpZnkgdGhlIHBhdGNoIGZpbGUKIHRvIGluc2VydCBpbnRvIHRoZSBtZXNzYWdlLgogCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogQ2xhd3MgTWFpbCAoR1VJKQorKioqKioqKioqKioqKioqKgogCiBXb3Jrcy4gU29tZSBwZW9wbGUgdXNlIHRoaXMgc3VjY2Vzc2Z1bGx5IGZvciBwYXRjaGVzLgogCi1UbyBpbnNlcnQgYSBwYXRjaCB1c2UgTWVzc2FnZS0+SW5zZXJ0IEZpbGUgKENUUkwraSkgb3IgYW4gZXh0ZXJuYWwgZWRpdG9yLgorVG8gaW5zZXJ0IGEgcGF0Y2ggdXNlIDptZW51c2VsZWN0aW9uOmBNZXNzYWdlLS0+SW5zZXJ0YCBGaWxlICg6a2JkOmBDVFJMLUlgKQorb3IgYW4gZXh0ZXJuYWwgZWRpdG9yLgogCiBJZiB0aGUgaW5zZXJ0ZWQgcGF0Y2ggaGFzIHRvIGJlIGVkaXRlZCBpbiB0aGUgQ2xhd3MgY29tcG9zaXRpb24gd2luZG93Ci0iQXV0byB3cmFwcGluZyIgaW4gQ29uZmlndXJhdGlvbi0+UHJlZmVyZW5jZXMtPkNvbXBvc2UtPldyYXBwaW5nIHNob3VsZCBiZQorIkF1dG8gd3JhcHBpbmciIGluCis6bWVudXNlbGVjdGlvbjpgQ29uZmlndXJhdGlvbi0tPlByZWZlcmVuY2VzLS0+Q29tcG9zZS0tPldyYXBwaW5nYCBzaG91bGQgYmUKIGRpc2FibGVkLgogCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogRXZvbHV0aW9uIChHVUkpCisqKioqKioqKioqKioqKioKIAogU29tZSBwZW9wbGUgdXNlIHRoaXMgc3VjY2Vzc2Z1bGx5IGZvciBwYXRjaGVzLgogCiBXaGVuIGNvbXBvc2luZyBtYWlsIHNlbGVjdDogUHJlZm9ybWF0Ci0gIGZyb20gRm9ybWF0LT5QYXJhZ3JhcGggU3R5bGUtPlByZWZvcm1hdHRlZCAoQ3RybC03KQorICBmcm9tIDptZW51c2VsZWN0aW9uOmBGb3JtYXQtLT5QYXJhZ3JhcGggU3R5bGUtLT5QcmVmb3JtYXR0ZWRgICg6a2JkOmBDVFJMLTdgKQogICBvciB0aGUgdG9vbGJhcgogCiBUaGVuIHVzZToKLSAgSW5zZXJ0LT5UZXh0IEZpbGUuLi4gKEFsdC1uIHgpCis6bWVudXNlbGVjdGlvbjpgSW5zZXJ0LS0+VGV4dCBGaWxlLi4uYCAoOmtiZDpgQUxULU4geGApCiB0byBpbnNlcnQgdGhlIHBhdGNoLgogCi1Zb3UgY2FuIGFsc28gImRpZmYgLU5ydSBvbGQuYyBuZXcuYyB8IHhjbGlwIiwgc2VsZWN0IFByZWZvcm1hdCwgdGhlbgotcGFzdGUgd2l0aCB0aGUgbWlkZGxlIGJ1dHRvbi4KK1lvdSBjYW4gYWxzbyBgYGRpZmYgLU5ydSBvbGQuYyBuZXcuYyB8IHhjbGlwYGAsIHNlbGVjdAorOm1lbnVzZWxlY3Rpb246YFByZWZvcm1hdGAsIHRoZW4gcGFzdGUgd2l0aCB0aGUgbWlkZGxlIGJ1dHRvbi4KIAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIEttYWlsIChHVUkpCisqKioqKioqKioqKgogCiBTb21lIHBlb3BsZSB1c2UgS21haWwgc3VjY2Vzc2Z1bGx5IGZvciBwYXRjaGVzLgogCkBAIC0xMjAsMTEgKzEzMCwxMiBAQAogd3JhcHBpbmcuCiAKIEF0IHRoZSBib3R0b20gb2YgeW91ciBlbWFpbCwgcHV0IHRoZSBjb21tb25seS11c2VkIHBhdGNoIGRlbGltaXRlciBiZWZvcmUKLWluc2VydGluZyB5b3VyIHBhdGNoOiAgdGhyZWUgaHlwaGVucyAoLS0tKS4KK2luc2VydGluZyB5b3VyIHBhdGNoOiAgdGhyZWUgaHlwaGVucyAoYGAtLS1gYCkuCiAKLVRoZW4gZnJvbSB0aGUgIk1lc3NhZ2UiIG1lbnUgaXRlbSwgc2VsZWN0IGluc2VydCBmaWxlIGFuZCBjaG9vc2UgeW91ciBwYXRjaC4KK1RoZW4gZnJvbSB0aGUgOm1lbnVzZWxlY3Rpb246YE1lc3NhZ2VgIG1lbnUgaXRlbSwgc2VsZWN0IGluc2VydCBmaWxlIGFuZAorY2hvb3NlIHlvdXIgcGF0Y2guCiBBcyBhbiBhZGRlZCBib251cyB5b3UgY2FuIGN1c3RvbWlzZSB0aGUgbWVzc2FnZSBjcmVhdGlvbiB0b29sYmFyIG1lbnUKLWFuZCBwdXQgdGhlICJpbnNlcnQgZmlsZSIgaWNvbiB0aGVyZS4KK2FuZCBwdXQgdGhlIDptZW51c2VsZWN0aW9uOmBpbnNlcnQgZmlsZWAgaWNvbiB0aGVyZS4KIAogTWFrZSB0aGUgY29tcG9zZXIgd2luZG93IHdpZGUgZW5vdWdoIHNvIHRoYXQgbm8gbGluZXMgd3JhcC4gQXMgb2YKIEtNYWlsIDEuMTMuNSAoS0RFIDQuNS40KSwgS01haWwgd2lsbCBhcHBseSB3b3JkIHdyYXBwaW5nIHdoZW4gc2VuZGluZwpAQCAtMTM5LDg2ICsxNTAsOTYgQEAKIAogSWYgeW91IGFic29sdXRlbHkgbXVzdCBzZW5kIHBhdGNoZXMgYXMgYXR0YWNobWVudHMgaW5zdGVhZCBvZiBpbmxpbmluZwogdGhlbSBhcyB0ZXh0LCByaWdodCBjbGljayBvbiB0aGUgYXR0YWNobWVudCBhbmQgc2VsZWN0IHByb3BlcnRpZXMsIGFuZAotaGlnaGxpZ2h0ICJTdWdnZXN0IGF1dG9tYXRpYyBkaXNwbGF5IiB0byBtYWtlIHRoZSBhdHRhY2htZW50IGlubGluZWQgdG8KLW1ha2UgaXQgbW9yZSB2aWV3YWJsZS4KK2hpZ2hsaWdodCA6bWVudXNlbGVjdGlvbjpgU3VnZ2VzdCBhdXRvbWF0aWMgZGlzcGxheWAgdG8gbWFrZSB0aGUgYXR0YWNobWVudAoraW5saW5lZCB0byBtYWtlIGl0IG1vcmUgdmlld2FibGUuCiAKIFdoZW4gc2F2aW5nIHBhdGNoZXMgdGhhdCBhcmUgc2VudCBhcyBpbmxpbmVkIHRleHQsIHNlbGVjdCB0aGUgZW1haWwgdGhhdAogY29udGFpbnMgdGhlIHBhdGNoIGZyb20gdGhlIG1lc3NhZ2UgbGlzdCBwYW5lLCByaWdodCBjbGljayBhbmQgc2VsZWN0Ci0ic2F2ZSBhcyIuICBZb3UgY2FuIHVzZSB0aGUgd2hvbGUgZW1haWwgdW5tb2RpZmllZCBhcyBhIHBhdGNoIGlmIGl0IHdhcwotcHJvcGVybHkgY29tcG9zZWQuICBUaGVyZSBpcyBubyBvcHRpb24gY3VycmVudGx5IHRvIHNhdmUgdGhlIGVtYWlsIHdoZW4geW91Ci1hcmUgYWN0dWFsbHkgdmlld2luZyBpdCBpbiBpdHMgb3duIHdpbmRvdyAtLSB0aGVyZSBoYXMgYmVlbiBhIHJlcXVlc3QgZmlsZWQKLWF0IGttYWlsJ3MgYnVnemlsbGEgYW5kIGhvcGVmdWxseSB0aGlzIHdpbGwgYmUgYWRkcmVzc2VkLiAgRW1haWxzIGFyZSBzYXZlZAotYXMgcmVhZC13cml0ZSBmb3IgdXNlciBvbmx5IHNvIHlvdSB3aWxsIGhhdmUgdG8gY2htb2QgdGhlbSB0byBtYWtlIHRoZW0KKzptZW51c2VsZWN0aW9uOmBzYXZlIGFzYC4gIFlvdSBjYW4gdXNlIHRoZSB3aG9sZSBlbWFpbCB1bm1vZGlmaWVkIGFzIGEgcGF0Y2gKK2lmIGl0IHdhcyBwcm9wZXJseSBjb21wb3NlZC4gIFRoZXJlIGlzIG5vIG9wdGlvbiBjdXJyZW50bHkgdG8gc2F2ZSB0aGUgZW1haWwKK3doZW4geW91IGFyZSBhY3R1YWxseSB2aWV3aW5nIGl0IGluIGl0cyBvd24gd2luZG93IC0tIHRoZXJlIGhhcyBiZWVuIGEgcmVxdWVzdAorZmlsZWQgYXQga21haWwncyBidWd6aWxsYSBhbmQgaG9wZWZ1bGx5IHRoaXMgd2lsbCBiZSBhZGRyZXNzZWQuICBFbWFpbHMgYXJlCitzYXZlZCBhcyByZWFkLXdyaXRlIGZvciB1c2VyIG9ubHkgc28geW91IHdpbGwgaGF2ZSB0byBjaG1vZCB0aGVtIHRvIG1ha2UgdGhlbQogZ3JvdXAgYW5kIHdvcmxkIHJlYWRhYmxlIGlmIHlvdSBjb3B5IHRoZW0gZWxzZXdoZXJlLgogCi1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogTG90dXMgTm90ZXMgKEdVSSkKKyoqKioqKioqKioqKioqKioqCiAKIFJ1biBhd2F5IGZyb20gaXQuCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBNdXR0IChUVUkpCisqKioqKioqKioqCiAKLVBsZW50eSBvZiBMaW51eCBkZXZlbG9wZXJzIHVzZSBtdXR0LCBzbyBpdCBtdXN0IHdvcmsgcHJldHR5IHdlbGwuCitQbGVudHkgb2YgTGludXggZGV2ZWxvcGVycyB1c2UgYGBtdXR0YGAsIHNvIGl0IG11c3Qgd29yayBwcmV0dHkgd2VsbC4KIAogTXV0dCBkb2Vzbid0IGNvbWUgd2l0aCBhbiBlZGl0b3IsIHNvIHdoYXRldmVyIGVkaXRvciB5b3UgdXNlIHNob3VsZCBiZQogdXNlZCBpbiBhIHdheSB0aGF0IHRoZXJlIGFyZSBubyBhdXRvbWF0aWMgbGluZWJyZWFrcy4gIE1vc3QgZWRpdG9ycyBoYXZlCi1hbiAiaW5zZXJ0IGZpbGUiIG9wdGlvbiB0aGF0IGluc2VydHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSB1bmFsdGVyZWQuCithbiA6bWVudXNlbGVjdGlvbjpgaW5zZXJ0IGZpbGVgIG9wdGlvbiB0aGF0IGluc2VydHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZQordW5hbHRlcmVkLgogCi1UbyB1c2UgJ3ZpbScgd2l0aCBtdXR0OgorVG8gdXNlIGBgdmltYGAgd2l0aCBtdXR0OjoKKwogICBzZXQgZWRpdG9yPSJ2aSIKIAotICBJZiB1c2luZyB4Y2xpcCwgdHlwZSB0aGUgY29tbWFuZAorSWYgdXNpbmcgeGNsaXAsIHR5cGUgdGhlIGNvbW1hbmQ6OgorCiAgIDpzZXQgcGFzdGUKLSAgYmVmb3JlIG1pZGRsZSBidXR0b24gb3Igc2hpZnQtaW5zZXJ0IG9yIHVzZQorCitiZWZvcmUgbWlkZGxlIGJ1dHRvbiBvciBzaGlmdC1pbnNlcnQgb3IgdXNlOjoKKwogICA6ciBmaWxlbmFtZQogCiBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBwYXRjaCBpbmxpbmUuCi0oYSl0dGFjaCB3b3JrcyBmaW5lIHdpdGhvdXQgInNldCBwYXN0ZSIuCisoYSl0dGFjaCB3b3JrcyBmaW5lIHdpdGhvdXQgYGBzZXQgcGFzdGVgYC4KIAotWW91IGNhbiBhbHNvIGdlbmVyYXRlIHBhdGNoZXMgd2l0aCAnZ2l0IGZvcm1hdC1wYXRjaCcgYW5kIHRoZW4gdXNlIE11dHQKLXRvIHNlbmQgdGhlbToKK1lvdSBjYW4gYWxzbyBnZW5lcmF0ZSBwYXRjaGVzIHdpdGggYGBnaXQgZm9ybWF0LXBhdGNoYGAgYW5kIHRoZW4gdXNlIE11dHQKK3RvIHNlbmQgdGhlbTo6CisKICAgICAkIG11dHQgLUggMDAwMS1zb21lLWJ1Zy1maXgucGF0Y2gKIAogQ29uZmlnIG9wdGlvbnM6CisKIEl0IHNob3VsZCB3b3JrIHdpdGggZGVmYXVsdCBzZXR0aW5ncy4KLUhvd2V2ZXIsIGl0J3MgYSBnb29kIGlkZWEgdG8gc2V0IHRoZSAic2VuZF9jaGFyc2V0IiB0bzoKK0hvd2V2ZXIsIGl0J3MgYSBnb29kIGlkZWEgdG8gc2V0IHRoZSBgYHNlbmRfY2hhcnNldGBgIHRvOjoKKwogICBzZXQgc2VuZF9jaGFyc2V0PSJ1cy1hc2NpaTp1dGYtOCIKIAogTXV0dCBpcyBoaWdobHkgY3VzdG9taXphYmxlLiBIZXJlIGlzIGEgbWluaW11bSBjb25maWd1cmF0aW9uIHRvIHN0YXJ0Ci11c2luZyBNdXR0IHRvIHNlbmQgcGF0Y2hlcyB0aHJvdWdoIEdtYWlsOgordXNpbmcgTXV0dCB0byBzZW5kIHBhdGNoZXMgdGhyb3VnaCBHbWFpbDo6CiAKLSMgLm11dHRyYwotIyA9PT09PT09PT09PT09PT09ICBJTUFQID09PT09PT09PT09PT09PT09PT09Ci1zZXQgaW1hcF91c2VyID0gJ3lvdXJ1c2VybmFtZUBnbWFpbC5jb20nCi1zZXQgaW1hcF9wYXNzID0gJ3lvdXJwYXNzd29yZCcKLXNldCBzcG9vbGZpbGUgPSBpbWFwczovL2ltYXAuZ21haWwuY29tL0lOQk9YCi1zZXQgZm9sZGVyID0gaW1hcHM6Ly9pbWFwLmdtYWlsLmNvbS8KLXNldCByZWNvcmQ9ImltYXBzOi8vaW1hcC5nbWFpbC5jb20vW0dtYWlsXS9TZW50IE1haWwiCi1zZXQgcG9zdHBvbmVkPSJpbWFwczovL2ltYXAuZ21haWwuY29tL1tHbWFpbF0vRHJhZnRzIgotc2V0IG1ib3g9ImltYXBzOi8vaW1hcC5nbWFpbC5jb20vW0dtYWlsXS9BbGwgTWFpbCIKKyAgIyAubXV0dHJjCisgICMgPT09PT09PT09PT09PT09PSAgSU1BUCA9PT09PT09PT09PT09PT09PT09PQorICBzZXQgaW1hcF91c2VyID0gJ3lvdXJ1c2VybmFtZUBnbWFpbC5jb20nCisgIHNldCBpbWFwX3Bhc3MgPSAneW91cnBhc3N3b3JkJworICBzZXQgc3Bvb2xmaWxlID0gaW1hcHM6Ly9pbWFwLmdtYWlsLmNvbS9JTkJPWAorICBzZXQgZm9sZGVyID0gaW1hcHM6Ly9pbWFwLmdtYWlsLmNvbS8KKyAgc2V0IHJlY29yZD0iaW1hcHM6Ly9pbWFwLmdtYWlsLmNvbS9bR21haWxdL1NlbnQgTWFpbCIKKyAgc2V0IHBvc3Rwb25lZD0iaW1hcHM6Ly9pbWFwLmdtYWlsLmNvbS9bR21haWxdL0RyYWZ0cyIKKyAgc2V0IG1ib3g9ImltYXBzOi8vaW1hcC5nbWFpbC5jb20vW0dtYWlsXS9BbGwgTWFpbCIKIAotIyA9PT09PT09PT09PT09PT09ICBTTVRQICA9PT09PT09PT09PT09PT09PT09PQotc2V0IHNtdHBfdXJsID0gInNtdHA6Ly91c2VybmFtZUBzbXRwLmdtYWlsLmNvbTo1ODcvIgotc2V0IHNtdHBfcGFzcyA9ICRpbWFwX3Bhc3MKLXNldCBzc2xfZm9yY2VfdGxzID0geWVzICMgUmVxdWlyZSBlbmNyeXB0ZWQgY29ubmVjdGlvbgorICAjID09PT09PT09PT09PT09PT0gIFNNVFAgID09PT09PT09PT09PT09PT09PT09CisgIHNldCBzbXRwX3VybCA9ICJzbXRwOi8vdXNlcm5hbWVAc210cC5nbWFpbC5jb206NTg3LyIKKyAgc2V0IHNtdHBfcGFzcyA9ICRpbWFwX3Bhc3MKKyAgc2V0IHNzbF9mb3JjZV90bHMgPSB5ZXMgIyBSZXF1aXJlIGVuY3J5cHRlZCBjb25uZWN0aW9uCiAKLSMgPT09PT09PT09PT09PT09PSAgQ29tcG9zaXRpb24gID09PT09PT09PT09PT09PT09PT09Ci1zZXQgZWRpdG9yID0gYGVjaG8gXCRFRElUT1JgCi1zZXQgZWRpdF9oZWFkZXJzID0geWVzICAjIFNlZSB0aGUgaGVhZGVycyB3aGVuIGVkaXRpbmcKLXNldCBjaGFyc2V0ID0gVVRGLTggICAgICMgdmFsdWUgb2YgJExBTkc7IGFsc28gZmFsbGJhY2sgZm9yIHNlbmRfY2hhcnNldAotIyBTZW5kZXIsIGVtYWlsIGFkZHJlc3MsIGFuZCBzaWduLW9mZiBsaW5lIG11c3QgbWF0Y2gKLXVuc2V0IHVzZV9kb21haW4gICAgICAgICMgYmVjYXVzZSBqb2VAbG9jYWxob3N0IGlzIGp1c3QgZW1iYXJyYXNzaW5nCi1zZXQgcmVhbG5hbWUgPSAiWU9VUiBOQU1FIgotc2V0IGZyb20gPSAidXNlcm5hbWVAZ21haWwuY29tIgotc2V0IHVzZV9mcm9tID0geWVzCisgICMgPT09PT09PT09PT09PT09PSAgQ29tcG9zaXRpb24gID09PT09PT09PT09PT09PT09PT09CisgIHNldCBlZGl0b3IgPSBgZWNobyBcJEVESVRPUmAKKyAgc2V0IGVkaXRfaGVhZGVycyA9IHllcyAgIyBTZWUgdGhlIGhlYWRlcnMgd2hlbiBlZGl0aW5nCisgIHNldCBjaGFyc2V0ID0gVVRGLTggICAgICMgdmFsdWUgb2YgJExBTkc7IGFsc28gZmFsbGJhY2sgZm9yIHNlbmRfY2hhcnNldAorICAjIFNlbmRlciwgZW1haWwgYWRkcmVzcywgYW5kIHNpZ24tb2ZmIGxpbmUgbXVzdCBtYXRjaAorICB1bnNldCB1c2VfZG9tYWluICAgICAgICAjIGJlY2F1c2Ugam9lQGxvY2FsaG9zdCBpcyBqdXN0IGVtYmFycmFzc2luZworICBzZXQgcmVhbG5hbWUgPSAiWU9VUiBOQU1FIgorICBzZXQgZnJvbSA9ICJ1c2VybmFtZUBnbWFpbC5jb20iCisgIHNldCB1c2VfZnJvbSA9IHllcwogCiBUaGUgTXV0dCBkb2NzIGhhdmUgbG90cyBtb3JlIGluZm9ybWF0aW9uOgorCiAgICAgaHR0cDovL2Rldi5tdXR0Lm9yZy90cmFjL3dpa2kvVXNlQ2FzZXMvR21haWwKKwogICAgIGh0dHA6Ly9kZXYubXV0dC5vcmcvZG9jL21hbnVhbC5odG1sCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBQaW5lIChUVUkpCisqKioqKioqKioqCiAKIFBpbmUgaGFzIGhhZCBzb21lIHdoaXRlc3BhY2UgdHJ1bmNhdGlvbiBpc3N1ZXMgaW4gdGhlIHBhc3QsIGJ1dCB0aGVzZQogc2hvdWxkIGFsbCBiZSBmaXhlZCBub3cuCkBAIC0yMjYsMTIgKzI0NywxMyBAQAogVXNlIGFscGluZSAocGluZSdzIHN1Y2Nlc3NvcikgaWYgeW91IGNhbi4KIAogQ29uZmlnIG9wdGlvbnM6Ci0tIHF1ZWxsLWZsb3dlZC10ZXh0IGlzIG5lZWRlZCBmb3IgcmVjZW50IHZlcnNpb25zCi0tIHRoZSAibm8tc3RyaXAtd2hpdGVzcGFjZS1iZWZvcmUtc2VuZCIgb3B0aW9uIGlzIG5lZWRlZAorCistIGBgcXVlbGwtZmxvd2VkLXRleHRgYCBpcyBuZWVkZWQgZm9yIHJlY2VudCB2ZXJzaW9ucworLSB0aGUgYGBuby1zdHJpcC13aGl0ZXNwYWNlLWJlZm9yZS1zZW5kYGAgb3B0aW9uIGlzIG5lZWRlZAogCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBTeWxwaGVlZCAoR1VJKQorKioqKioqKioqKioqKioKIAogLSBXb3JrcyB3ZWxsIGZvciBpbmxpbmluZyB0ZXh0IChvciB1c2luZyBhdHRhY2htZW50cykuCiAtIEFsbG93cyB1c2Ugb2YgYW4gZXh0ZXJuYWwgZWRpdG9yLgpAQCAtMjQxLDUwICsyNjMsNTAgQEAKIC0gQWRkaW5nIGFkZHJlc3NlcyB0byBhZGRyZXNzIGJvb2sgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBkaXNwbGF5IG5hbWUKICAgcHJvcGVybHkuCiAKLX5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiBUaHVuZGVyYmlyZCAoR1VJKQorKioqKioqKioqKioqKioqKioKIAogVGh1bmRlcmJpcmQgaXMgYW4gT3V0bG9vayBjbG9uZSB0aGF0IGxpa2VzIHRvIG1hbmdsZSB0ZXh0LCBidXQgdGhlcmUgYXJlIHdheXMKIHRvIGNvZXJjZSBpdCBpbnRvIGJlaGF2aW5nLgogCiAtIEFsbG93IHVzZSBvZiBhbiBleHRlcm5hbCBlZGl0b3I6CiAgIFRoZSBlYXNpZXN0IHRoaW5nIHRvIGRvIHdpdGggVGh1bmRlcmJpcmQgYW5kIHBhdGNoZXMgaXMgdG8gdXNlIGFuCi0gICJleHRlcm5hbCBlZGl0b3IiIGV4dGVuc2lvbiBhbmQgdGhlbiBqdXN0IHVzZSB5b3VyIGZhdm9yaXRlICRFRElUT1IKKyAgImV4dGVybmFsIGVkaXRvciIgZXh0ZW5zaW9uIGFuZCB0aGVuIGp1c3QgdXNlIHlvdXIgZmF2b3JpdGUgYGAkRURJVE9SYGAKICAgZm9yIHJlYWRpbmcvbWVyZ2luZyBwYXRjaGVzIGludG8gdGhlIGJvZHkgdGV4dC4gIFRvIGRvIHRoaXMsIGRvd25sb2FkCiAgIGFuZCBpbnN0YWxsIHRoZSBleHRlbnNpb24sIHRoZW4gYWRkIGEgYnV0dG9uIGZvciBpdCB1c2luZwotICBWaWV3LT5Ub29sYmFycy0+Q3VzdG9taXplLi4uIGFuZCBmaW5hbGx5IGp1c3QgY2xpY2sgb24gaXQgd2hlbiBpbiB0aGUKLSAgQ29tcG9zZSBkaWFsb2cuCisgIDptZW51c2VsZWN0aW9uOmBWaWV3LS0+VG9vbGJhcnMtLT5DdXN0b21pemUuLi5gIGFuZCBmaW5hbGx5IGp1c3QgY2xpY2sgb24gaXQKKyAgd2hlbiBpbiB0aGUgOm1lbnVzZWxlY3Rpb246YENvbXBvc2VgIGRpYWxvZy4KIAogICBQbGVhc2Ugbm90ZSB0aGF0ICJleHRlcm5hbCBlZGl0b3IiIHJlcXVpcmVzIHRoYXQgeW91ciBlZGl0b3IgbXVzdCBub3QKICAgZm9yaywgb3IgaW4gb3RoZXIgd29yZHMsIHRoZSBlZGl0b3IgbXVzdCBub3QgcmV0dXJuIGJlZm9yZSBjbG9zaW5nLgogICBZb3UgbWF5IGhhdmUgdG8gcGFzcyBhZGRpdGlvbmFsIGZsYWdzIG9yIGNoYW5nZSB0aGUgc2V0dGluZ3Mgb2YgeW91cgogICBlZGl0b3IuIE1vc3Qgbm90YWJseSBpZiB5b3UgYXJlIHVzaW5nIGd2aW0gdGhlbiB5b3UgbXVzdCBwYXNzIHRoZSAtZgotICBvcHRpb24gdG8gZ3ZpbSBieSBwdXR0aW5nICIvdXNyL2Jpbi9ndmltIC1mIiAoaWYgdGhlIGJpbmFyeSBpcyBpbgotICAvdXNyL2JpbikgdG8gdGhlIHRleHQgZWRpdG9yIGZpZWxkIGluICJleHRlcm5hbCBlZGl0b3IiIHNldHRpbmdzLiBJZiB5b3UKLSAgYXJlIHVzaW5nIHNvbWUgb3RoZXIgZWRpdG9yIHRoZW4gcGxlYXNlIHJlYWQgaXRzIG1hbnVhbCB0byBmaW5kIG91dCBob3cKLSAgdG8gZG8gdGhpcy4KKyAgb3B0aW9uIHRvIGd2aW0gYnkgcHV0dGluZyBgYC91c3IvYmluL2d2aW0gLWZgYCAoaWYgdGhlIGJpbmFyeSBpcyBpbgorICBgYC91c3IvYmluYGApIHRvIHRoZSB0ZXh0IGVkaXRvciBmaWVsZCBpbiA6bWVudXNlbGVjdGlvbjpgZXh0ZXJuYWwgZWRpdG9yYAorICBzZXR0aW5ncy4gSWYgeW91IGFyZSB1c2luZyBzb21lIG90aGVyIGVkaXRvciB0aGVuIHBsZWFzZSByZWFkIGl0cyBtYW51YWwKKyAgdG8gZmluZCBvdXQgaG93IHRvIGRvIHRoaXMuCiAKIFRvIGJlYXQgc29tZSBzZW5zZSBvdXQgb2YgdGhlIGludGVybmFsIGVkaXRvciwgZG8gdGhpczoKIAotLSBFZGl0IHlvdXIgVGh1bmRlcmJpcmQgY29uZmlnIHNldHRpbmdzIHNvIHRoYXQgaXQgd29uJ3QgdXNlIGZvcm1hdD1mbG93ZWQuCi0gIEdvIHRvICJlZGl0LT5wcmVmZXJlbmNlcy0+YWR2YW5jZWQtPmNvbmZpZyBlZGl0b3IiIHRvIGJyaW5nIHVwIHRoZQotICB0aHVuZGVyYmlyZCdzIHJlZ2lzdHJ5IGVkaXRvci4KKy0gRWRpdCB5b3VyIFRodW5kZXJiaXJkIGNvbmZpZyBzZXR0aW5ncyBzbyB0aGF0IGl0IHdvbid0IHVzZSBgYGZvcm1hdD1mbG93ZWRgYC4KKyAgR28gdG8gOm1lbnVzZWxlY3Rpb246YGVkaXQtLT5wcmVmZXJlbmNlcy0tPmFkdmFuY2VkLS0+Y29uZmlnIGVkaXRvcmAgdG8gYnJpbmcgdXAKKyAgdGhlIHRodW5kZXJiaXJkJ3MgcmVnaXN0cnkgZWRpdG9yLgogCi0tIFNldCAibWFpbG5ld3Muc2VuZF9wbGFpbnRleHRfZmxvd2VkIiB0byAiZmFsc2UiCistIFNldCBgYG1haWxuZXdzLnNlbmRfcGxhaW50ZXh0X2Zsb3dlZGBgIHRvIGBgZmFsc2VgYAogCi0tIFNldCAibWFpbG5ld3Mud3JhcGxlbmd0aCIgZnJvbSAiNzIiIHRvICIwIgorLSBTZXQgYGBtYWlsbmV3cy53cmFwbGVuZ3RoYGAgZnJvbSBgYDcyYGAgdG8gYGAwYGAKIAotLSAiVmlldyIgPiAiTWVzc2FnZSBCb2R5IEFzIiA+ICJQbGFpbiBUZXh0IgorLSA6bWVudXNlbGVjdGlvbjpgVmlldy0tPk1lc3NhZ2UgQm9keSBBcy0tPlBsYWluIFRleHRgCiAKLS0gIlZpZXciID4gIkNoYXJhY3RlciBFbmNvZGluZyIgPiAiVW5pY29kZSAoVVRGLTgpIgorLSA6bWVudXNlbGVjdGlvbjpgVmlldy0tPkNoYXJhY3RlciBFbmNvZGluZy0tPlVuaWNvZGUgKFVURi04KWAKIAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIFRrUmF0IChHVUkpCisqKioqKioqKioqKgogCiBXb3Jrcy4gIFVzZSAiSW5zZXJ0IGZpbGUuLi4iIG9yIGV4dGVybmFsIGVkaXRvci4KIAotfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIEdtYWlsIChXZWIgR1VJKQorKioqKioqKioqKioqKioqCiAKIERvZXMgbm90IHdvcmsgZm9yIHNlbmRpbmcgcGF0Y2hlcy4KIApAQCAtMjk1LDUgKzMxNywzIEBACiAKIEFub3RoZXIgcHJvYmxlbSBpcyB0aGF0IEdtYWlsIHdpbGwgYmFzZTY0LWVuY29kZSBhbnkgbWVzc2FnZSB0aGF0IGhhcyBhCiBub24tQVNDSUkgY2hhcmFjdGVyLiBUaGF0IGluY2x1ZGVzIHRoaW5ncyBsaWtlIEV1cm9wZWFuIG5hbWVzLgotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kYXgudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kYXgudHh0CmluZGV4IDBjMTZhMjIuLjIzZDE4YjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGF4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RheC50eHQKQEAgLTEyMyw5ICsxMjMsMTIgQEAKIG1hcHBlZCBjYWNoZXMgc3VjaCBhcyBBUk0sIE1JUFMgYW5kIFNQQVJDLgogCiBDYWxsaW5nIGdldF91c2VyX3BhZ2VzKCkgb24gYSByYW5nZSBvZiB1c2VyIG1lbW9yeSB0aGF0IGhhcyBiZWVuIG1tYXBlZAotZnJvbSBhIERBWCBmaWxlIHdpbGwgZmFpbCBhcyB0aGVyZSBhcmUgbm8gJ3N0cnVjdCBwYWdlJyB0byBkZXNjcmliZQotdGhvc2UgcGFnZXMuICBUaGlzIHByb2JsZW0gaXMgYmVpbmcgd29ya2VkIG9uLiAgVGhhdCBtZWFucyB0aGF0IE9fRElSRUNUCi1yZWFkcy93cml0ZXMgdG8gdGhvc2UgbWVtb3J5IHJhbmdlcyBmcm9tIGEgbm9uLURBWCBmaWxlIHdpbGwgZmFpbCAobm90ZQotdGhhdCBPX0RJUkVDVCByZWFkcy93cml0ZXMgX29mIGEgREFYIGZpbGVfIGRvIHdvcmssIGl0IGlzIHRoZSBtZW1vcnkKLXRoYXQgaXMgYmVpbmcgYWNjZXNzZWQgdGhhdCBpcyBrZXkgaGVyZSkuICBPdGhlciB0aGluZ3MgdGhhdCB3aWxsIG5vdAotd29yayBpbmNsdWRlIFJETUEsIHNlbmRmaWxlKCkgYW5kIHNwbGljZSgpLgorZnJvbSBhIERBWCBmaWxlIHdpbGwgZmFpbCB3aGVuIHRoZXJlIGFyZSBubyAnc3RydWN0IHBhZ2UnIHRvIGRlc2NyaWJlCit0aG9zZSBwYWdlcy4gIFRoaXMgcHJvYmxlbSBoYXMgYmVlbiBhZGRyZXNzZWQgaW4gc29tZSBkZXZpY2UgZHJpdmVycworYnkgYWRkaW5nIG9wdGlvbmFsIHN0cnVjdCBwYWdlIHN1cHBvcnQgZm9yIHBhZ2VzIHVuZGVyIHRoZSBjb250cm9sIG9mCit0aGUgZHJpdmVyIChzZWUgQ09ORklHX05WRElNTV9QRk4gaW4gZHJpdmVycy9udmRpbW0gZm9yIGFuIGV4YW1wbGUgb2YKK2hvdyB0byBkbyB0aGlzKS4gSW4gdGhlIG5vbiBzdHJ1Y3QgcGFnZSBjYXNlcyBPX0RJUkVDVCByZWFkcy93cml0ZXMgdG8KK3Rob3NlIG1lbW9yeSByYW5nZXMgZnJvbSBhIG5vbi1EQVggZmlsZSB3aWxsIGZhaWwgKG5vdGUgdGhhdCBPX0RJUkVDVAorcmVhZHMvd3JpdGVzIF9vZiBhIERBWCBmaWxlXyBkbyB3b3JrLCBpdCBpcyB0aGUgbWVtb3J5IHRoYXQgaXMgYmVpbmcKK2FjY2Vzc2VkIHRoYXQgaXMga2V5IGhlcmUpLiAgT3RoZXIgdGhpbmdzIHRoYXQgd2lsbCBub3Qgd29yayBpbiB0aGUKK25vbiBzdHJ1Y3QgcGFnZSBjYXNlIGluY2x1ZGUgUkRNQSwgc2VuZGZpbGUoKSBhbmQgc3BsaWNlKCkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2YyZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mMmZzLnR4dAppbmRleCBlY2Q4MDgwLi43NTNkZDRmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2YyZnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZjJmcy50eHQKQEAgLTEzMSw2ICsxMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgZW50cmllcyBjYW4gYmUgd3JpdHRlbiBpbnRvIGlub2RlIGJsb2NrLiBUaGUKICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2Ugb2YgaW5vZGUgYmxvY2sgd2hpY2ggaXMgdXNlZCB0byBzdG9yZSBpbmxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgZGVudHJpZXMgaXMgbGltaXRlZCB0byB+My40ay4KK25vaW5saW5lX2RlbnRyeSAgICAgICAgRGlhYmxlIHRoZSBpbmxpbmUgZGVudHJ5IGZlYXR1cmUuCiBmbHVzaF9tZXJnZQkgICAgICAgTWVyZ2UgY29uY3VycmVudCBjYWNoZV9mbHVzaCBjb21tYW5kcyBhcyBtdWNoIGFzIHBvc3NpYmxlCiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGVsaW1pbmF0ZSByZWR1bmRhbnQgY29tbWFuZCBpc3N1ZXMuIElmIHRoZSB1bmRlcmx5aW5nCiAJCSAgICAgICBkZXZpY2UgaGFuZGxlcyB0aGUgY2FjaGVfZmx1c2ggY29tbWFuZCByZWxhdGl2ZWx5IHNsb3dseSwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb3ZlcmxheWZzLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvb3ZlcmxheWZzLnR4dAppbmRleCBkNjI1OWM3Li5iY2JmOTcxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL292ZXJsYXlmcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9vdmVybGF5ZnMudHh0CkBAIC0xODMsMTIgKzE4MywxMCBAQAogbW92ZXMgaXQgb3ZlciB0byB0aGUgb2xkIG5hbWUuICBUaGUgbmV3IGZpbGUgbWF5IGJlIG9uIGEgZGlmZmVyZW50CiBmaWxlc3lzdGVtLCBzbyBib3RoIHN0X2RldiBhbmQgc3RfaW5vIG9mIHRoZSBmaWxlIG1heSBjaGFuZ2UuCiAKLUFueSBvcGVuIGZpbGVzIHJlZmVycmluZyB0byB0aGlzIGlub2RlIHdpbGwgYWNjZXNzIHRoZSBvbGQgZGF0YSBhbmQKLW1ldGFkYXRhLiAgU2ltaWxhcmx5IGFueSBmaWxlIGxvY2tzIG9idGFpbmVkIGJlZm9yZSBjb3B5X3VwIHdpbGwgbm90Ci1hcHBseSB0byB0aGUgY29waWVkIHVwIGZpbGUuCitBbnkgb3BlbiBmaWxlcyByZWZlcnJpbmcgdG8gdGhpcyBpbm9kZSB3aWxsIGFjY2VzcyB0aGUgb2xkIGRhdGEuCiAKLU9uIGEgZmlsZSBvcGVuZWQgd2l0aCBPX1JET05MWSBmY2htb2QoMiksIGZjaG93bigyKSwgZnV0aW1lc2F0KDIpIGFuZAotZnNldHhhdHRyKDIpIHdpbGwgZmFpbCB3aXRoIEVST0ZTLgorQW55IGZpbGUgbG9ja3MgKGFuZCBsZWFzZXMpIG9idGFpbmVkIGJlZm9yZSBjb3B5X3VwIHdpbGwgbm90IGFwcGx5Cit0byB0aGUgY29waWVkIHVwIGZpbGUuCiAKIElmIGEgZmlsZSB3aXRoIG11bHRpcGxlIGhhcmQgbGlua3MgaXMgY29waWVkIHVwLCB0aGVuIHRoaXMgd2lsbAogImJyZWFrIiB0aGUgbGluay4gIENoYW5nZXMgd2lsbCBub3QgYmUgcHJvcGFnYXRlZCB0byBvdGhlciBuYW1lcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKaW5kZXggNjgwODBhZC4uZmNjMWFjMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0CkBAIC0xNDUsNyArMTQ1LDcgQEAKIAkJc3ltYm9sIHRoZSB0YXNrIGlzIGJsb2NrZWQgaW4gLSBvciAiMCIgaWYgbm90IGJsb2NrZWQuCiAgcGFnZW1hcAlQYWdlIHRhYmxlCiAgc3RhY2sJCVJlcG9ydCBmdWxsIHN0YWNrIHRyYWNlLCBlbmFibGUgdmlhIENPTkZJR19TVEFDS1RSQUNFCi0gc21hcHMJCWEgZXh0ZW5zaW9uIGJhc2VkIG9uIG1hcHMsIHNob3dpbmcgdGhlIG1lbW9yeSBjb25zdW1wdGlvbiBvZgorIHNtYXBzCQlhbiBleHRlbnNpb24gYmFzZWQgb24gbWFwcywgc2hvd2luZyB0aGUgbWVtb3J5IGNvbnN1bXB0aW9uIG9mCiAJCWVhY2ggbWFwcGluZyBhbmQgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIGl0CiAgbnVtYV9tYXBzCWFuIGV4dGVuc2lvbiBiYXNlZCBvbiBtYXBzLCBzaG93aW5nIHRoZSBtZW1vcnkgbG9jYWxpdHkgYW5kCiAJCWJpbmRpbmcgcG9saWN5IGFzIHdlbGwgYXMgbWVtIHVzYWdlIChpbiBwYWdlcykgb2YgZWFjaCBtYXBwaW5nLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CmluZGV4IDlhY2UzNTkuLmNiZWMwMDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKQEAgLTcyMiw3ICs3MjIsNyBAQAogCiAJVGhlIHNlY29uZCBjYXNlIGlzIHdoZW4gYSByZXF1ZXN0IGhhcyBiZWVuIG1hZGUgdG8gaW52YWxpZGF0ZQogICAgICAgICBzb21lIG9yIGFsbCBwYWdlcyBpbiBhbiBhZGRyZXNzX3NwYWNlLiAgVGhpcyBjYW4gaGFwcGVuCi0gICAgICAgIHRocm91Z2ggdGhlIGZhZHZpY2UoUE9TSVhfRkFEVl9ET05UTkVFRCkgc3lzdGVtIGNhbGwgb3IgYnkgdGhlCisgICAgICAgIHRocm91Z2ggdGhlIGZhZHZpc2UoUE9TSVhfRkFEVl9ET05UTkVFRCkgc3lzdGVtIGNhbGwgb3IgYnkgdGhlCiAgICAgICAgIGZpbGVzeXN0ZW0gZXhwbGljaXRseSByZXF1ZXN0aW5nIGl0IGFzIG5mcyBhbmQgOWZzIGRvICh3aGVuCiAgICAgICAgIHRoZXkgYmVsaWV2ZSB0aGUgY2FjaGUgbWF5IGJlIG91dCBvZiBkYXRlIHdpdGggc3RvcmFnZSkgYnkKICAgICAgICAgY2FsbGluZyBpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMigpLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy94ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy94ZnMudHh0CmluZGV4IDgxNDZlOWYuLmMyZDQ0ZTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMveGZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3hmcy50eHQKQEAgLTM0OCwzICszNDgsMTI2IEBACiAgIC0tLS0JCQkJLS0tLS0tLQogICBmcy54ZnMueGZzYnVmZF9jZW50aXNlYwl2NC4wCiAgIGZzLnhmcy5hZ2VfYnVmZmVyX2NlbnRpc2Vjcwl2NC4wCisKKworRXJyb3IgaGFuZGxpbmcKKz09PT09PT09PT09PT09CisKK1hGUyBjYW4gYWN0IGRpZmZlcmVudGx5IGFjY29yZGluZyB0byB0aGUgdHlwZSBvZiBlcnJvciBmb3VuZCBkdXJpbmcgaXRzCitvcGVyYXRpb24uIFRoZSBpbXBsZW1lbnRhdGlvbiBpbnRyb2R1Y2VzIHRoZSBmb2xsb3dpbmcgY29uY2VwdHMgdG8gdGhlIGVycm9yCitoYW5kbGVyOgorCisgLWZhaWx1cmUgc3BlZWQ6CisJRGVmaW5lcyBob3cgZmFzdCBYRlMgc2hvdWxkIHByb3BhZ2F0ZSBhbiBlcnJvciB1cHdhcmRzIHdoZW4gYSBzcGVjaWZpYworCWVycm9yIGlzIGZvdW5kIGR1cmluZyB0aGUgZmlsZXN5c3RlbSBvcGVyYXRpb24uIEl0IGNhbiBwcm9wYWdhdGUKKwlpbW1lZGlhdGVseSwgYWZ0ZXIgYSBkZWZpbmVkIG51bWJlciBvZiByZXRyaWVzLCBhZnRlciBhIHNldCB0aW1lIHBlcmlvZCwKKwlvciBzaW1wbHkgcmV0cnkgZm9yZXZlci4KKworIC1lcnJvciBjbGFzc2VzOgorCVNwZWNpZmllcyB0aGUgc3Vic3lzdGVtIHRoZSBlcnJvciBjb25maWd1cmF0aW9uIHdpbGwgYXBwbHkgdG8sIHN1Y2ggYXMKKwltZXRhZGF0YSBJTyBvciBtZW1vcnkgYWxsb2NhdGlvbi4gRGlmZmVyZW50IHN1YnN5c3RlbXMgd2lsbCBoYXZlCisJZGlmZmVyZW50IGVycm9yIGhhbmRsZXJzIGZvciB3aGljaCBiZWhhdmlvdXIgY2FuIGJlIGNvbmZpZ3VyZWQuCisKKyAtZXJyb3IgaGFuZGxlcnM6CisJRGVmaW5lcyB0aGUgYmVoYXZpb3IgZm9yIGEgc3BlY2lmaWMgZXJyb3IuCisKK1RoZSBmaWxlc3lzdGVtIGJlaGF2aW9yIGR1cmluZyBhbiBlcnJvciBjYW4gYmUgc2V0IHZpYSBzeXNmcyBmaWxlcy4gRWFjaAorZXJyb3IgaGFuZGxlciB3b3JrcyBpbmRlcGVuZGVudGx5IC0gdGhlIGZpcnN0IGNvbmRpdGlvbiBtZXQgYnkgYW4gZXJyb3IgaGFuZGxlcgorZm9yIGEgc3BlY2lmaWMgY2xhc3Mgd2lsbCBjYXVzZSB0aGUgZXJyb3IgdG8gYmUgcHJvcGFnYXRlZCByYXRoZXIgdGhhbiByZXNldCBhbmQKK3JldHJpZWQuCisKK1RoZSBhY3Rpb24gdGFrZW4gYnkgdGhlIGZpbGVzeXN0ZW0gd2hlbiB0aGUgZXJyb3IgaXMgcHJvcGFnYXRlZCBpcyBjb250ZXh0CitkZXBlbmRlbnQgLSBpdCBtYXkgY2F1c2UgYSBzaHV0IGRvd24gaW4gdGhlIGNhc2Ugb2YgYW4gdW5yZWNvdmVyYWJsZSBlcnJvciwKK2l0IG1heSBiZSByZXBvcnRlZCBiYWNrIHRvIHVzZXJzcGFjZSwgb3IgaXQgbWF5IGV2ZW4gYmUgaWdub3JlZCBiZWNhdXNlCit0aGVyZSdzIG5vdGhpbmcgdXNlZnVsIHdlIGNhbiB3aXRoIHRoZSBlcnJvciBvciBhbnlvbmUgd2UgY2FuIHJlcG9ydCBpdCB0byAoZS5nLgorZHVyaW5nIHVubW91bnQpLgorCitUaGUgY29uZmlndXJhdGlvbiBmaWxlcyBhcmUgb3JnYW5pemVkIGludG8gdGhlIGZvbGxvd2luZyBoaWVyYXJjaHkgZm9yIGVhY2gKK21vdW50ZWQgZmlsZXN5c3RlbToKKworICAvc3lzL2ZzL3hmcy88ZGV2Pi9lcnJvci88Y2xhc3M+LzxlcnJvcj4vCisKK1doZXJlOgorICA8ZGV2PgorCVRoZSBzaG9ydCBkZXZpY2UgbmFtZSBvZiB0aGUgbW91bnRlZCBmaWxlc3lzdGVtLiBUaGlzIGlzIHRoZSBzYW1lIGRldmljZQorCW5hbWUgdGhhdCBzaG93cyB1cCBpbiBYRlMga2VybmVsIGVycm9yIG1lc3NhZ2VzIGFzICJYRlMoPGRldj4pOiAuLi4iCisKKyAgPGNsYXNzPgorCVRoZSBzdWJzeXN0ZW0gdGhlIGVycm9yIGNvbmZpZ3VyYXRpb24gYmVsb25ncyB0by4gQXMgb2YgNC45LCB0aGUgZGVmaW5lZAorCWNsYXNzZXMgYXJlOgorCisJCS0gIm1ldGFkYXRhIjogYXBwbGllcyBtZXRhZGF0YSBidWZmZXIgd3JpdGUgSU8KKworICA8ZXJyb3I+CisJVGhlIGluZGl2aWR1YWwgZXJyb3IgaGFuZGxlciBjb25maWd1cmF0aW9ucy4KKworCitFYWNoIGZpbGVzeXN0ZW0gaGFzICJnbG9iYWwiIGVycm9yIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBkZWZpbmVkIGluIHRoZWlyIHRvcAorbGV2ZWwgZGlyZWN0b3J5OgorCisgIC9zeXMvZnMveGZzLzxkZXY+L2Vycm9yLworCisgIGZhaWxfYXRfdW5tb3VudAkJKE1pbjogIDAgIERlZmF1bHQ6ICAxICBNYXg6IDEpCisJRGVmaW5lcyB0aGUgZmlsZXN5c3RlbSBlcnJvciBiZWhhdmlvciBhdCB1bm1vdW50IHRpbWUuCisKKwlJZiBzZXQgdG8gYSB2YWx1ZSBvZiAxLCBYRlMgd2lsbCBvdmVycmlkZSBhbGwgb3RoZXIgZXJyb3IgY29uZmlndXJhdGlvbnMKKwlkdXJpbmcgdW5tb3VudCBhbmQgcmVwbGFjZSB0aGVtIHdpdGggImltbWVkaWF0ZSBmYWlsIiBjaGFyYWN0ZXJpc3RpY3MuCisJaS5lLiBubyByZXRyaWVzLCBubyByZXRyeSB0aW1lb3V0LiBUaGlzIHdpbGwgYWx3YXlzIGFsbG93IHVubW91bnQgdG8KKwlzdWNjZWVkIHdoZW4gdGhlcmUgYXJlIHBlcnNpc3RlbnQgZXJyb3JzIHByZXNlbnQuCisKKwlJZiBzZXQgdG8gMCwgdGhlIGNvbmZpZ3VyZWQgcmV0cnkgYmVoYXZpb3VyIHdpbGwgY29udGludWUgdW50aWwgYWxsCisJcmV0cmllcyBhbmQvb3IgdGltZW91dHMgaGF2ZSBiZWVuIGV4aGF1c3RlZC4gVGhpcyB3aWxsIGRlbGF5IHVubW91bnQKKwljb21wbGV0aW9uIHdoZW4gdGhlcmUgYXJlIHBlcnNpc3RlbnQgZXJyb3JzLCBhbmQgaXQgbWF5IHByZXZlbnQgdGhlCisJZmlsZXN5c3RlbSBmcm9tIGV2ZXIgdW5tb3VudGluZyBmdWxseSBpbiB0aGUgY2FzZSBvZiAicmV0cnkgZm9yZXZlciIKKwloYW5kbGVyIGNvbmZpZ3VyYXRpb25zLgorCisJTm90ZTogdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgZmFpbF9hdF91bm1vdW50IGNhbiBiZSBzZXQgd2hpbHN0IGFuCisJdW5tb3VudCBpcyBpbiBwcm9ncmVzcy4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgc3lzZnMgZW50cmllcyBhcmUKKwlyZW1vdmVkIGJ5IHRoZSB1bm1vdW50aW5nIGZpbGVzeXN0ZW0gYmVmb3JlIGEgInJldHJ5IGZvcmV2ZXIiIGVycm9yCisJaGFuZGxlciBjb25maWd1cmF0aW9uIGNhdXNlcyB1bm1vdW50IHRvIGhhbmcsIGFuZCBoZW5jZSB0aGUgZmlsZXN5c3RlbQorCW11c3QgYmUgY29uZmlndXJlZCBhcHByb3ByaWF0ZWx5IGJlZm9yZSB1bm1vdW50IGJlZ2lucyB0byBwcmV2ZW50CisJdW5tb3VudCBoYW5ncy4KKworRWFjaCBmaWxlc3lzdGVtIGhhcyBzcGVjaWZpYyBlcnJvciBjbGFzcyBoYW5kbGVycyB0aGF0IGRlZmluZSB0aGUgZXJyb3IKK3Byb3BhZ2F0aW9uIGJlaGF2aW91ciBmb3Igc3BlY2lmaWMgZXJyb3JzLiBUaGVyZSBpcyBhbHNvIGEgImRlZmF1bHQiIGVycm9yCitoYW5kbGVyIGRlZmluZWQsIHdoaWNoIGRlZmluZXMgdGhlIGJlaGF2aW91ciBmb3IgYWxsIGVycm9ycyB0aGF0IGRvbid0IGhhdmUKK3NwZWNpZmljIGhhbmRsZXJzIGRlZmluZWQuIFdoZXJlIG11bHRpcGxlIHJldHJ5IGNvbnN0cmFpbnRzIGFyZSBjb25maWd1cmVkaSBmb3IKK2Egc2luZ2xlIGVycm9yLCB0aGUgZmlyc3QgcmV0cnkgY29uZmlndXJhdGlvbiB0aGF0IGV4cGlyZXMgd2lsbCBjYXVzZSB0aGUgZXJyb3IKK3RvIGJlIHByb3BhZ2F0ZWQuIFRoZSBoYW5kbGVyIGNvbmZpZ3VyYXRpb25zIGFyZSBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5OgorCisgIC9zeXMvZnMveGZzLzxkZXY+L2Vycm9yLzxjbGFzcz4vPGVycm9yPi8KKworICBtYXhfcmV0cmllcwkJCShNaW46IC0xICBEZWZhdWx0OiBWYXJpZXMgIE1heDogSU5UTUFYKQorCURlZmluZXMgdGhlIGFsbG93ZWQgbnVtYmVyIG9mIHJldHJpZXMgb2YgYSBzcGVjaWZpYyBlcnJvciBiZWZvcmUKKwl0aGUgZmlsZXN5c3RlbSB3aWxsIHByb3BhZ2F0ZSB0aGUgZXJyb3IuIFRoZSByZXRyeSBjb3VudCBmb3IgYSBnaXZlbgorCWVycm9yIGNvbnRleHQgKGUuZy4gYSBzcGVjaWZpYyBtZXRhZGF0YSBidWZmZXIpIGlzIHJlc2V0IGV2ZXJ5IHRpbWUKKwl0aGVyZSBpcyBhIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiB0aGUgb3BlcmF0aW9uLgorCisJU2V0dGluZyB0aGUgdmFsdWUgdG8gIi0xIiB3aWxsIGNhdXNlIFhGUyB0byByZXRyeSBmb3JldmVyIGZvciB0aGlzCisJc3BlY2lmaWMgZXJyb3IuCisKKwlTZXR0aW5nIHRoZSB2YWx1ZSB0byAiMCIgd2lsbCBjYXVzZSBYRlMgdG8gZmFpbCBpbW1lZGlhdGVseSB3aGVuIHRoZQorCXNwZWNpZmljIGVycm9yIGlzIHJlcG9ydGVkLgorCisJU2V0dGluZyB0aGUgdmFsdWUgdG8gIk4iICh3aGVyZSAwIDwgTiA8IE1heCkgd2lsbCBtYWtlIFhGUyByZXRyeSB0aGUKKwlvcGVyYXRpb24gIk4iIHRpbWVzIGJlZm9yZSBwcm9wYWdhdGluZyB0aGUgZXJyb3IuCisKKyAgcmV0cnlfdGltZW91dF9zZWNvbmRzCQkoTWluOiAgLTEgIERlZmF1bHQ6ICBWYXJpZXMgIE1heDogMSBkYXkpCisJRGVmaW5lIHRoZSBhbW91bnQgb2YgdGltZSAoaW4gc2Vjb25kcykgdGhhdCB0aGUgZmlsZXN5c3RlbSBpcworCWFsbG93ZWQgdG8gcmV0cnkgaXRzIG9wZXJhdGlvbnMgd2hlbiB0aGUgc3BlY2lmaWMgZXJyb3IgaXMKKwlmb3VuZC4KKworCVNldHRpbmcgdGhlIHZhbHVlIHRvICItMSIgd2lsbCBhbGxvdyBYRlMgdG8gcmV0cnkgZm9yZXZlciBmb3IgdGhpcworCXNwZWNpZmljIGVycm9yLgorCisJU2V0dGluZyB0aGUgdmFsdWUgdG8gIjAiIHdpbGwgY2F1c2UgWEZTIHRvIGZhaWwgaW1tZWRpYXRlbHkgd2hlbiB0aGUKKwlzcGVjaWZpYyBlcnJvciBpcyByZXBvcnRlZC4KKworCVNldHRpbmcgdGhlIHZhbHVlIHRvICJOIiAod2hlcmUgMCA8IE4gPCBNYXgpIHdpbGwgYWxsb3cgWEZTIHRvIHJldHJ5IHRoZQorCW9wZXJhdGlvbiBmb3IgdXAgdG8gIk4iIHNlY29uZHMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBlcnJvci4KKworTm90ZTogVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvciBhIHNwZWNpZmljIGVycm9yIGhhbmRsZXIgaXMgZGVwZW5kZW50IG9uIGJvdGgKK3RoZSBjbGFzcyBhbmQgZXJyb3IgY29udGV4dC4gRm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IKKyJtZXRhZGF0YS9FTk9ERVYiIGFyZSAiMCIgcmF0aGVyIHRoYW4gIi0xIiBzbyB0aGF0IHRoaXMgZXJyb3IgaGFuZGxlciBkZWZhdWx0cwordG8gImZhaWwgaW1tZWRpYXRlbHkiIGJlaGF2aW91ci4gVGhpcyBpcyBkb25lIGJlY2F1c2UgRU5PREVWIGlzIGEgZmF0YWwsCit1bnJlY292ZXJhYmxlIGVycm9yIG5vIG1hdHRlciBob3cgbWFueSB0aW1lcyB0aGUgbWV0YWRhdGEgSU8gaXMgcmV0cmllZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ2Nvdi50eHQgYi9Eb2N1bWVudGF0aW9uL2djb3YudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjcyNzc4Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vZ2Nvdi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotVXNpbmcgZ2NvdiB3aXRoIHRoZSBMaW51eCBrZXJuZWwKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLTEuIEludHJvZHVjdGlvbgotMi4gUHJlcGFyYXRpb24KLTMuIEN1c3RvbWl6YXRpb24KLTQuIEZpbGVzCi01LiBNb2R1bGVzCi02LiBTZXBhcmF0ZWQgYnVpbGQgYW5kIHRlc3QgbWFjaGluZXMKLTcuIFRyb3VibGVzaG9vdGluZwotQXBwZW5kaXggQTogc2FtcGxlIHNjcmlwdDogZ2F0aGVyX29uX2J1aWxkLnNoCi1BcHBlbmRpeCBCOiBzYW1wbGUgc2NyaXB0OiBnYXRoZXJfb25fdGVzdC5zaAotCi0KLTEuIEludHJvZHVjdGlvbgotPT09PT09PT09PT09PT09Ci0KLWdjb3YgcHJvZmlsaW5nIGtlcm5lbCBzdXBwb3J0IGVuYWJsZXMgdGhlIHVzZSBvZiBHQ0MncyBjb3ZlcmFnZSB0ZXN0aW5nCi10b29sIGdjb3YgWzFdIHdpdGggdGhlIExpbnV4IGtlcm5lbC4gQ292ZXJhZ2UgZGF0YSBvZiBhIHJ1bm5pbmcga2VybmVsCi1pcyBleHBvcnRlZCBpbiBnY292LWNvbXBhdGlibGUgZm9ybWF0IHZpYSB0aGUgImdjb3YiIGRlYnVnZnMgZGlyZWN0b3J5LgotVG8gZ2V0IGNvdmVyYWdlIGRhdGEgZm9yIGEgc3BlY2lmaWMgZmlsZSwgY2hhbmdlIHRvIHRoZSBrZXJuZWwgYnVpbGQKLWRpcmVjdG9yeSBhbmQgdXNlIGdjb3Ygd2l0aCB0aGUgLW8gb3B0aW9uIGFzIGZvbGxvd3MgKHJlcXVpcmVzIHJvb3QpOgotCi0jIGNkIC90bXAvbGludXgtb3V0Ci0jIGdjb3YgLW8gL3N5cy9rZXJuZWwvZGVidWcvZ2Nvdi90bXAvbGludXgtb3V0L2tlcm5lbCBzcGlubG9jay5jCi0KLVRoaXMgd2lsbCBjcmVhdGUgc291cmNlIGNvZGUgZmlsZXMgYW5ub3RhdGVkIHdpdGggZXhlY3V0aW9uIGNvdW50cwotaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiBJbiBhZGRpdGlvbiwgZ3JhcGhpY2FsIGdjb3YgZnJvbnQtZW5kcyBzdWNoCi1hcyBsY292IFsyXSBjYW4gYmUgdXNlZCB0byBhdXRvbWF0ZSB0aGUgcHJvY2VzcyBvZiBjb2xsZWN0aW5nIGRhdGEKLWZvciB0aGUgZW50aXJlIGtlcm5lbCBhbmQgcHJvdmlkZSBjb3ZlcmFnZSBvdmVydmlld3MgaW4gSFRNTCBmb3JtYXQuCi0KLVBvc3NpYmxlIHVzZXM6Ci0KLSogZGVidWdnaW5nIChoYXMgdGhpcyBsaW5lIGJlZW4gcmVhY2hlZCBhdCBhbGw/KQotKiB0ZXN0IGltcHJvdmVtZW50IChob3cgZG8gSSBjaGFuZ2UgbXkgdGVzdCB0byBjb3ZlciB0aGVzZSBsaW5lcz8pCi0qIG1pbmltaXppbmcga2VybmVsIGNvbmZpZ3VyYXRpb25zIChkbyBJIG5lZWQgdGhpcyBvcHRpb24gaWYgdGhlCi0gIGFzc29jaWF0ZWQgY29kZSBpcyBuZXZlciBydW4/KQotCi0tLQotCi1bMV0gaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0djb3YuaHRtbAotWzJdIGh0dHA6Ly9sdHAuc291cmNlZm9yZ2UubmV0L2NvdmVyYWdlL2xjb3YucGhwCi0KLQotMi4gUHJlcGFyYXRpb24KLT09PT09PT09PT09PT09Ci0KLUNvbmZpZ3VyZSB0aGUga2VybmVsIHdpdGg6Ci0KLSAgICAgICAgQ09ORklHX0RFQlVHX0ZTPXkKLSAgICAgICAgQ09ORklHX0dDT1ZfS0VSTkVMPXkKLQotc2VsZWN0IHRoZSBnY2MncyBnY292IGZvcm1hdCwgZGVmYXVsdCBpcyBhdXRvZGV0ZWN0IGJhc2VkIG9uIGdjYyB2ZXJzaW9uOgotCi0gICAgICAgIENPTkZJR19HQ09WX0ZPUk1BVF9BVVRPREVURUNUPXkKLQotYW5kIHRvIGdldCBjb3ZlcmFnZSBkYXRhIGZvciB0aGUgZW50aXJlIGtlcm5lbDoKLQotICAgICAgICBDT05GSUdfR0NPVl9QUk9GSUxFX0FMTD15Ci0KLU5vdGUgdGhhdCBrZXJuZWxzIGNvbXBpbGVkIHdpdGggcHJvZmlsaW5nIGZsYWdzIHdpbGwgYmUgc2lnbmlmaWNhbnRseQotbGFyZ2VyIGFuZCBydW4gc2xvd2VyLiBBbHNvIENPTkZJR19HQ09WX1BST0ZJTEVfQUxMIG1heSBub3QgYmUgc3VwcG9ydGVkCi1vbiBhbGwgYXJjaGl0ZWN0dXJlcy4KLQotUHJvZmlsaW5nIGRhdGEgd2lsbCBvbmx5IGJlY29tZSBhY2Nlc3NpYmxlIG9uY2UgZGVidWdmcyBoYXMgYmVlbgotbW91bnRlZDoKLQotICAgICAgICBtb3VudCAtdCBkZWJ1Z2ZzIG5vbmUgL3N5cy9rZXJuZWwvZGVidWcKLQotCi0zLiBDdXN0b21pemF0aW9uCi09PT09PT09PT09PT09PT09Ci0KLVRvIGVuYWJsZSBwcm9maWxpbmcgZm9yIHNwZWNpZmljIGZpbGVzIG9yIGRpcmVjdG9yaWVzLCBhZGQgYSBsaW5lCi1zaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgdG8gdGhlIHJlc3BlY3RpdmUga2VybmVsIE1ha2VmaWxlOgotCi0gICAgICAgIEZvciBhIHNpbmdsZSBmaWxlIChlLmcuIG1haW4ubyk6Ci0gICAgICAgICAgICAgICAgR0NPVl9QUk9GSUxFX21haW4ubyA6PSB5Ci0KLSAgICAgICAgRm9yIGFsbCBmaWxlcyBpbiBvbmUgZGlyZWN0b3J5OgotICAgICAgICAgICAgICAgIEdDT1ZfUFJPRklMRSA6PSB5Ci0KLVRvIGV4Y2x1ZGUgZmlsZXMgZnJvbSBiZWluZyBwcm9maWxlZCBldmVuIHdoZW4gQ09ORklHX0dDT1ZfUFJPRklMRV9BTEwKLWlzIHNwZWNpZmllZCwgdXNlOgotCi0gICAgICAgICAgICAgICAgR0NPVl9QUk9GSUxFX21haW4ubyA6PSBuCi0gICAgICAgIGFuZDoKLSAgICAgICAgICAgICAgICBHQ09WX1BST0ZJTEUgOj0gbgotCi1Pbmx5IGZpbGVzIHdoaWNoIGFyZSBsaW5rZWQgdG8gdGhlIG1haW4ga2VybmVsIGltYWdlIG9yIGFyZSBjb21waWxlZCBhcwota2VybmVsIG1vZHVsZXMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIG1lY2hhbmlzbS4KLQotCi00LiBGaWxlcwotPT09PT09PT0KLQotVGhlIGdjb3Yga2VybmVsIHN1cHBvcnQgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGZpbGVzIGluIGRlYnVnZnM6Ci0KLSAgICAgICAgL3N5cy9rZXJuZWwvZGVidWcvZ2NvdgotICAgICAgICAgICAgICAgIFBhcmVudCBkaXJlY3RvcnkgZm9yIGFsbCBnY292LXJlbGF0ZWQgZmlsZXMuCi0KLSAgICAgICAgL3N5cy9rZXJuZWwvZGVidWcvZ2Nvdi9yZXNldAotICAgICAgICAgICAgICAgIEdsb2JhbCByZXNldCBmaWxlOiByZXNldHMgYWxsIGNvdmVyYWdlIGRhdGEgdG8gemVybyB3aGVuCi0gICAgICAgICAgICAgICAgd3JpdHRlbiB0by4KLQotICAgICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292L3BhdGgvdG8vY29tcGlsZS9kaXIvZmlsZS5nY2RhCi0gICAgICAgICAgICAgICAgVGhlIGFjdHVhbCBnY292IGRhdGEgZmlsZSBhcyB1bmRlcnN0b29kIGJ5IHRoZSBnY292Ci0gICAgICAgICAgICAgICAgdG9vbC4gUmVzZXRzIGZpbGUgY292ZXJhZ2UgZGF0YSB0byB6ZXJvIHdoZW4gd3JpdHRlbiB0by4KLQotICAgICAgICAvc3lzL2tlcm5lbC9kZWJ1Zy9nY292L3BhdGgvdG8vY29tcGlsZS9kaXIvZmlsZS5nY25vCi0gICAgICAgICAgICAgICAgU3ltYm9saWMgbGluayB0byBhIHN0YXRpYyBkYXRhIGZpbGUgcmVxdWlyZWQgYnkgdGhlIGdjb3YKLSAgICAgICAgICAgICAgICB0b29sLiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IGdjYyB3aGVuIGNvbXBpbGluZyB3aXRoCi0gICAgICAgICAgICAgICAgb3B0aW9uIC1mdGVzdC1jb3ZlcmFnZS4KLQotCi01LiBNb2R1bGVzCi09PT09PT09PT09Ci0KLUtlcm5lbCBtb2R1bGVzIG1heSBjb250YWluIGNsZWFudXAgY29kZSB3aGljaCBpcyBvbmx5IHJ1biBkdXJpbmcKLW1vZHVsZSB1bmxvYWQgdGltZS4gVGhlIGdjb3YgbWVjaGFuaXNtIHByb3ZpZGVzIGEgbWVhbnMgdG8gY29sbGVjdAotY292ZXJhZ2UgZGF0YSBmb3Igc3VjaCBjb2RlIGJ5IGtlZXBpbmcgYSBjb3B5IG9mIHRoZSBkYXRhIGFzc29jaWF0ZWQKLXdpdGggdGhlIHVubG9hZGVkIG1vZHVsZS4gVGhpcyBkYXRhIHJlbWFpbnMgYXZhaWxhYmxlIHRocm91Z2ggZGVidWdmcy4KLU9uY2UgdGhlIG1vZHVsZSBpcyBsb2FkZWQgYWdhaW4sIHRoZSBhc3NvY2lhdGVkIGNvdmVyYWdlIGNvdW50ZXJzIGFyZQotaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGF0YSBmcm9tIGl0cyBwcmV2aW91cyBpbnN0YW50aWF0aW9uLgotCi1UaGlzIGJlaGF2aW9yIGNhbiBiZSBkZWFjdGl2YXRlZCBieSBzcGVjaWZ5aW5nIHRoZSBnY292X3BlcnNpc3Qga2VybmVsCi1wYXJhbWV0ZXI6Ci0KLSAgICAgICAgZ2Nvdl9wZXJzaXN0PTAKLQotQXQgcnVuLXRpbWUsIGEgdXNlciBjYW4gYWxzbyBjaG9vc2UgdG8gZGlzY2FyZCBkYXRhIGZvciBhbiB1bmxvYWRlZAotbW9kdWxlIGJ5IHdyaXRpbmcgdG8gaXRzIGRhdGEgZmlsZSBvciB0aGUgZ2xvYmFsIHJlc2V0IGZpbGUuCi0KLQotNi4gU2VwYXJhdGVkIGJ1aWxkIGFuZCB0ZXN0IG1hY2hpbmVzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlIGdjb3Yga2VybmVsIHByb2ZpbGluZyBpbmZyYXN0cnVjdHVyZSBpcyBkZXNpZ25lZCB0byB3b3JrIG91dC1vZi10aGUKLWJveCBmb3Igc2V0dXBzIHdoZXJlIGtlcm5lbHMgYXJlIGJ1aWx0IGFuZCBydW4gb24gdGhlIHNhbWUgbWFjaGluZS4gSW4KLWNhc2VzIHdoZXJlIHRoZSBrZXJuZWwgcnVucyBvbiBhIHNlcGFyYXRlIG1hY2hpbmUsIHNwZWNpYWwgcHJlcGFyYXRpb25zCi1tdXN0IGJlIG1hZGUsIGRlcGVuZGluZyBvbiB3aGVyZSB0aGUgZ2NvdiB0b29sIGlzIHVzZWQ6Ci0KLWEpIGdjb3YgaXMgcnVuIG9uIHRoZSBURVNUIG1hY2hpbmUKLQotVGhlIGdjb3YgdG9vbCB2ZXJzaW9uIG9uIHRoZSB0ZXN0IG1hY2hpbmUgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlCi1nY2MgdmVyc2lvbiB1c2VkIGZvciBrZXJuZWwgYnVpbGQuIEFsc28gdGhlIGZvbGxvd2luZyBmaWxlcyBuZWVkIHRvIGJlCi1jb3BpZWQgZnJvbSBidWlsZCB0byB0ZXN0IG1hY2hpbmU6Ci0KLWZyb20gdGhlIHNvdXJjZSB0cmVlOgotICAtIGFsbCBDIHNvdXJjZSBmaWxlcyArIGhlYWRlcnMKLQotZnJvbSB0aGUgYnVpbGQgdHJlZToKLSAgLSBhbGwgQyBzb3VyY2UgZmlsZXMgKyBoZWFkZXJzCi0gIC0gYWxsIC5nY2RhIGFuZCAuZ2NubyBmaWxlcwotICAtIGFsbCBsaW5rcyB0byBkaXJlY3RvcmllcwotCi1JdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZXNlIGZpbGVzIG5lZWQgdG8gYmUgcGxhY2VkIGludG8gdGhlCi1leGFjdCBzYW1lIGZpbGUgc3lzdGVtIGxvY2F0aW9uIG9uIHRoZSB0ZXN0IG1hY2hpbmUgYXMgb24gdGhlIGJ1aWxkCi1tYWNoaW5lLiBJZiBhbnkgb2YgdGhlIHBhdGggY29tcG9uZW50cyBpcyBzeW1ib2xpYyBsaW5rLCB0aGUgYWN0dWFsCi1kaXJlY3RvcnkgbmVlZHMgdG8gYmUgdXNlZCBpbnN0ZWFkIChkdWUgdG8gbWFrZSdzIENVUkRJUiBoYW5kbGluZykuCi0KLWIpIGdjb3YgaXMgcnVuIG9uIHRoZSBCVUlMRCBtYWNoaW5lCi0KLVRoZSBmb2xsb3dpbmcgZmlsZXMgbmVlZCB0byBiZSBjb3BpZWQgYWZ0ZXIgZWFjaCB0ZXN0IGNhc2UgZnJvbSB0ZXN0Ci10byBidWlsZCBtYWNoaW5lOgotCi1mcm9tIHRoZSBnY292IGRpcmVjdG9yeSBpbiBzeXNmczoKLSAgLSBhbGwgLmdjZGEgZmlsZXMKLSAgLSBhbGwgbGlua3MgdG8gLmdjbm8gZmlsZXMKLQotVGhlc2UgZmlsZXMgY2FuIGJlIGNvcGllZCB0byBhbnkgbG9jYXRpb24gb24gdGhlIGJ1aWxkIG1hY2hpbmUuIGdjb3YKLW11c3QgdGhlbiBiZSBjYWxsZWQgd2l0aCB0aGUgLW8gb3B0aW9uIHBvaW50aW5nIHRvIHRoYXQgZGlyZWN0b3J5LgotCi1FeGFtcGxlIGRpcmVjdG9yeSBzZXR1cCBvbiB0aGUgYnVpbGQgbWFjaGluZToKLQotICAvdG1wL2xpbnV4OiAgICBrZXJuZWwgc291cmNlIHRyZWUKLSAgL3RtcC9vdXQ6ICAgICAga2VybmVsIGJ1aWxkIGRpcmVjdG9yeSBhcyBzcGVjaWZpZWQgYnkgbWFrZSBPPQotICAvdG1wL2NvdmVyYWdlOiBsb2NhdGlvbiBvZiB0aGUgZmlsZXMgY29waWVkIGZyb20gdGhlIHRlc3QgbWFjaGluZQotCi0gIFt1c2VyQGJ1aWxkXSBjZCAvdG1wL291dAotICBbdXNlckBidWlsZF0gZ2NvdiAtbyAvdG1wL2NvdmVyYWdlL3RtcC9vdXQvaW5pdCBtYWluLmMKLQotCi03LiBUcm91Ymxlc2hvb3RpbmcKLT09PT09PT09PT09PT09PT09PQotCi1Qcm9ibGVtOiAgQ29tcGlsYXRpb24gYWJvcnRzIGR1cmluZyBsaW5rZXIgc3RlcC4KLUNhdXNlOiAgICBQcm9maWxpbmcgZmxhZ3MgYXJlIHNwZWNpZmllZCBmb3Igc291cmNlIGZpbGVzIHdoaWNoIGFyZSBub3QKLSAgICAgICAgICBsaW5rZWQgdG8gdGhlIG1haW4ga2VybmVsIG9yIHdoaWNoIGFyZSBsaW5rZWQgYnkgYSBjdXN0b20KLSAgICAgICAgICBsaW5rZXIgcHJvY2VkdXJlLgotU29sdXRpb246IEV4Y2x1ZGUgYWZmZWN0ZWQgc291cmNlIGZpbGVzIGZyb20gcHJvZmlsaW5nIGJ5IHNwZWNpZnlpbmcKLSAgICAgICAgICBHQ09WX1BST0ZJTEUgOj0gbiBvciBHQ09WX1BST0ZJTEVfYmFzZW5hbWUubyA6PSBuIGluIHRoZQotICAgICAgICAgIGNvcnJlc3BvbmRpbmcgTWFrZWZpbGUuCi0KLVByb2JsZW06ICBGaWxlcyBjb3BpZWQgZnJvbSBzeXNmcyBhcHBlYXIgZW1wdHkgb3IgaW5jb21wbGV0ZS4KLUNhdXNlOiAgICBEdWUgdG8gdGhlIHdheSBzZXFfZmlsZSB3b3Jrcywgc29tZSB0b29scyBzdWNoIGFzIGNwIG9yIHRhcgotICAgICAgICAgIG1heSBub3QgY29ycmVjdGx5IGNvcHkgZmlsZXMgZnJvbSBzeXNmcy4KLVNvbHV0aW9uOiBVc2UgJ2NhdCcgdG8gcmVhZCAuZ2NkYSBmaWxlcyBhbmQgJ2NwIC1kJyB0byBjb3B5IGxpbmtzLgotICAgICAgICAgIEFsdGVybmF0aXZlbHkgdXNlIHRoZSBtZWNoYW5pc20gc2hvd24gaW4gQXBwZW5kaXggQi4KLQotCi1BcHBlbmRpeCBBOiBnYXRoZXJfb25fYnVpbGQuc2gKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TYW1wbGUgc2NyaXB0IHRvIGdhdGhlciBjb3ZlcmFnZSBtZXRhIGZpbGVzIG9uIHRoZSBidWlsZCBtYWNoaW5lCi0oc2VlIDZhKToKLSMhL2Jpbi9iYXNoCi0KLUtTUkM9JDEKLUtPQko9JDIKLURFU1Q9JDMKLQotaWYgWyAteiAiJEtTUkMiIF0gfHwgWyAteiAiJEtPQkoiIF0gfHwgWyAteiAiJERFU1QiIF07IHRoZW4KLSAgZWNobyAiVXNhZ2U6ICQwIDxrc3JjIGRpcmVjdG9yeT4gPGtvYmogZGlyZWN0b3J5PiA8b3V0cHV0LnRhci5nej4iID4mMgotICBleGl0IDEKLWZpCi0KLUtTUkM9JChjZCAkS1NSQzsgcHJpbnRmICJhbGw6XG5cdEBlY2hvIFwke0NVUkRJUn1cbiIgfCBtYWtlIC1mIC0pCi1LT0JKPSQoY2QgJEtPQko7IHByaW50ZiAiYWxsOlxuXHRAZWNobyBcJHtDVVJESVJ9XG4iIHwgbWFrZSAtZiAtKQotCi1maW5kICRLU1JDICRLT0JKIFwoIC1uYW1lICcqLmdjbm8nIC1vIC1uYW1lICcqLltjaF0nIC1vIC10eXBlIGwgXCkgLWEgXAotICAgICAgICAgICAgICAgICAtcGVybSAvdStyLGcrciB8IHRhciBjZnogJERFU1QgLVAgLVQgLQotCi1pZiBbICQ/IC1lcSAwIF0gOyB0aGVuCi0gIGVjaG8gIiRERVNUIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBjb3B5IHRvIHRlc3Qgc3lzdGVtIGFuZCB1bnBhY2sgd2l0aDoiCi0gIGVjaG8gIiAgdGFyIHhmeiAkREVTVCAtUCIKLWVsc2UKLSAgZWNobyAiQ291bGQgbm90IGNyZWF0ZSBmaWxlICRERVNUIgotZmkKLQotCi1BcHBlbmRpeCBCOiBnYXRoZXJfb25fdGVzdC5zaAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotU2FtcGxlIHNjcmlwdCB0byBnYXRoZXIgY292ZXJhZ2UgZGF0YSBmaWxlcyBvbiB0aGUgdGVzdCBtYWNoaW5lCi0oc2VlIDZiKToKLQotIyEvYmluL2Jhc2ggLWUKLQotREVTVD0kMQotR0NEQT0vc3lzL2tlcm5lbC9kZWJ1Zy9nY292Ci0KLWlmIFsgLXogIiRERVNUIiBdIDsgdGhlbgotICBlY2hvICJVc2FnZTogJDAgPG91dHB1dC50YXIuZ3o+IiA+JjIKLSAgZXhpdCAxCi1maQotCi1URU1QRElSPSQobWt0ZW1wIC1kKQotZWNobyBDb2xsZWN0aW5nIGRhdGEuLgotZmluZCAkR0NEQSAtdHlwZSBkIC1leGVjIG1rZGlyIC1wICRURU1QRElSL1x7XH0gXDsKLWZpbmQgJEdDREEgLW5hbWUgJyouZ2NkYScgLWV4ZWMgc2ggLWMgJ2NhdCA8ICQwID4gJyRURU1QRElSJy8kMCcge30gXDsKLWZpbmQgJEdDREEgLW5hbWUgJyouZ2NubycgLWV4ZWMgc2ggLWMgJ2NwIC1kICQwICckVEVNUERJUicvJDAnIHt9IFw7Ci10YXIgY3pmICRERVNUIC1DICRURU1QRElSIHN5cwotcm0gLXJmICRURU1QRElSCi0KLWVjaG8gIiRERVNUIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBjb3B5IHRvIGJ1aWxkIHN5c3RlbSBhbmQgdW5wYWNrIHdpdGg6IgotZWNobyAiICB0YXIgeGZ6ICRERVNUIgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9nZGIta2VybmVsLWRlYnVnZ2luZy50eHQgYi9Eb2N1bWVudGF0aW9uL2dkYi1rZXJuZWwtZGVidWdnaW5nLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MGNlOC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2dkYi1rZXJuZWwtZGVidWdnaW5nLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi1EZWJ1Z2dpbmcga2VybmVsIGFuZCBtb2R1bGVzIHZpYSBnZGIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUga2VybmVsIGRlYnVnZ2VyIGtnZGIsIGh5cGVydmlzb3JzIGxpa2UgUUVNVSBvciBKVEFHLWJhc2VkIGhhcmR3YXJlCi1pbnRlcmZhY2VzIGFsbG93IHRvIGRlYnVnIHRoZSBMaW51eCBrZXJuZWwgYW5kIGl0cyBtb2R1bGVzIGR1cmluZyBydW50aW1lCi11c2luZyBnZGIuIEdkYiBjb21lcyB3aXRoIGEgcG93ZXJmdWwgc2NyaXB0aW5nIGludGVyZmFjZSBmb3IgcHl0aG9uLiBUaGUKLWtlcm5lbCBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YgaGVscGVyIHNjcmlwdHMgdGhhdCBjYW4gc2ltcGxpZnkgdHlwaWNhbAota2VybmVsIGRlYnVnZ2luZyBzdGVwcy4gVGhpcyBpcyBhIHNob3J0IHR1dG9yaWFsIGFib3V0IGhvdyB0byBlbmFibGUgYW5kIHVzZQotdGhlbS4gSXQgZm9jdXNlcyBvbiBRRU1VL0tWTSB2aXJ0dWFsIG1hY2hpbmVzIGFzIHRhcmdldCwgYnV0IHRoZSBleGFtcGxlcyBjYW4KLWJlIHRyYW5zZmVycmVkIHRvIHRoZSBvdGhlciBnZGIgc3R1YnMgYXMgd2VsbC4KLQotCi1SZXF1aXJlbWVudHMKLS0tLS0tLS0tLS0tLQotCi0gbyBnZGIgNy4yKyAocmVjb21tZW5kZWQ6IDcuNCspIHdpdGggcHl0aG9uIHN1cHBvcnQgZW5hYmxlZCAodHlwaWNhbGx5IHRydWUKLSAgIGZvciBkaXN0cmlidXRpb25zKQotCi0KLVNldHVwCi0tLS0tLQotCi0gbyBDcmVhdGUgYSB2aXJ0dWFsIExpbnV4IG1hY2hpbmUgZm9yIFFFTVUvS1ZNIChzZWUgd3d3LmxpbnV4LWt2bS5vcmcgYW5kCi0gICB3d3cucWVtdS5vcmcgZm9yIG1vcmUgZGV0YWlscykuIEZvciBjcm9zcy1kZXZlbG9wbWVudCwKLSAgIGh0dHA6Ly9sYW5kbGV5Lm5ldC9hYm9yaWdpbmFsL2JpbiBrZWVwcyBhIHBvb2wgb2YgbWFjaGluZSBpbWFnZXMgYW5kCi0gICB0b29sY2hhaW5zIHRoYXQgY2FuIGJlIGhlbHBmdWwgdG8gc3RhcnQgZnJvbS4KLQotIG8gQnVpbGQgdGhlIGtlcm5lbCB3aXRoIENPTkZJR19HREJfU0NSSVBUUyBlbmFibGVkLCBidXQgbGVhdmUKLSAgIENPTkZJR19ERUJVR19JTkZPX1JFRFVDRUQgb2ZmLiBJZiB5b3VyIGFyY2hpdGVjdHVyZSBzdXBwb3J0cwotICAgQ09ORklHX0ZSQU1FX1BPSU5URVIsIGtlZXAgaXQgZW5hYmxlZC4KLQotIG8gSW5zdGFsbCB0aGF0IGtlcm5lbCBvbiB0aGUgZ3Vlc3QuCi0KLSAgIEFsdGVybmF0aXZlbHksIFFFTVUgYWxsb3dzIHRvIGJvb3QgdGhlIGtlcm5lbCBkaXJlY3RseSB1c2luZyAta2VybmVsLAotICAgLWFwcGVuZCwgLWluaXRyZCBjb21tYW5kIGxpbmUgc3dpdGNoZXMuIFRoaXMgaXMgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIGlmCi0gICB5b3UgZG8gbm90IGRlcGVuZCBvbiBtb2R1bGVzLiBTZWUgUUVNVSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMgb24KLSAgIHRoaXMgbW9kZS4KLQotIG8gRW5hYmxlIHRoZSBnZGIgc3R1YiBvZiBRRU1VL0tWTSwgZWl0aGVyCi0gICAgLSBhdCBWTSBzdGFydHVwIHRpbWUgYnkgYXBwZW5kaW5nICItcyIgdG8gdGhlIFFFTVUgY29tbWFuZCBsaW5lCi0gICBvcgotICAgIC0gZHVyaW5nIHJ1bnRpbWUgYnkgaXNzdWluZyAiZ2Ric2VydmVyIiBmcm9tIHRoZSBRRU1VIG1vbml0b3IKLSAgICAgIGNvbnNvbGUKLQotIG8gY2QgL3BhdGgvdG8vbGludXgtYnVpbGQKLQotIG8gU3RhcnQgZ2RiOiBnZGIgdm1saW51eAotCi0gICBOb3RlOiBTb21lIGRpc3Ryb3MgbWF5IHJlc3RyaWN0IGF1dG8tbG9hZGluZyBvZiBnZGIgc2NyaXB0cyB0byBrbm93biBzYWZlCi0gICBkaXJlY3Rvcmllcy4gSW4gY2FzZSBnZGIgcmVwb3J0cyB0byByZWZ1c2UgbG9hZGluZyB2bWxpbnV4LWdkYi5weSwgYWRkCi0KLSAgICBhZGQtYXV0by1sb2FkLXNhZmUtcGF0aCAvcGF0aC90by9saW51eC1idWlsZAotCi0gICB0byB+Ly5nZGJpbml0LiBTZWUgZ2RiIGhlbHAgZm9yIG1vcmUgZGV0YWlscy4KLQotIG8gQXR0YWNoIHRvIHRoZSBib290ZWQgZ3Vlc3Q6Ci0gICAgKGdkYikgdGFyZ2V0IHJlbW90ZSA6MTIzNAotCi0KLUV4YW1wbGVzIG9mIHVzaW5nIHRoZSBMaW51eC1wcm92aWRlZCBnZGIgaGVscGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSBvIExvYWQgbW9kdWxlIChhbmQgbWFpbiBrZXJuZWwpIHN5bWJvbHM6Ci0gICAgKGdkYikgbHgtc3ltYm9scwotICAgIGxvYWRpbmcgdm1saW51eAotICAgIHNjYW5uaW5nIGZvciBtb2R1bGVzIGluIC9ob21lL3VzZXIvbGludXgvYnVpbGQKLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwMjAwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbmV0L25ldGZpbHRlci94dF90Y3B1ZHAua28KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwMTYwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbmV0L25ldGZpbHRlci94dF9wa3R0eXBlLmtvCi0gICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDAyMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL25ldC9uZXRmaWx0ZXIveHRfbGltaXQua28KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwY2EwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvbmV0L3BhY2tldC9hZl9wYWNrZXQua28KLSAgICBsb2FkaW5nIEAweGZmZmZmZmZmYTAwM2MwMDA6IC9ob21lL3VzZXIvbGludXgvYnVpbGQvZnMvZnVzZS9mdXNlLmtvCi0gICAgLi4uCi0gICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDAwMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmtvCi0KLSBvIFNldCBhIGJyZWFrcG9pbnQgb24gc29tZSBub3QgeWV0IGxvYWRlZCBtb2R1bGUgZnVuY3Rpb24sIGUuZy46Ci0gICAgKGdkYikgYiBidHJmc19pbml0X3N5c2ZzCi0gICAgRnVuY3Rpb24gImJ0cmZzX2luaXRfc3lzZnMiIG5vdCBkZWZpbmVkLgotICAgIE1ha2UgYnJlYWtwb2ludCBwZW5kaW5nIG9uIGZ1dHVyZSBzaGFyZWQgbGlicmFyeSBsb2FkPyAoeSBvciBbbl0pIHkKLSAgICBCcmVha3BvaW50IDEgKGJ0cmZzX2luaXRfc3lzZnMpIHBlbmRpbmcuCi0KLSBvIENvbnRpbnVlIHRoZSB0YXJnZXQKLSAgICAoZ2RiKSBjCi0KLSBvIExvYWQgdGhlIG1vZHVsZSBvbiB0aGUgdGFyZ2V0IGFuZCB3YXRjaCB0aGUgc3ltYm9scyBiZWluZyBsb2FkZWQgYXMgd2VsbCBhcwotICAgdGhlIGJyZWFrcG9pbnQgaGl0OgotICAgIGxvYWRpbmcgQDB4ZmZmZmZmZmZhMDAzNDAwMDogL2hvbWUvdXNlci9saW51eC9idWlsZC9saWIvbGliY3JjMzJjLmtvCi0gICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDUwMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2xpYi9sem8vbHpvX2NvbXByZXNzLmtvCi0gICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMDZlMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2xpYi96bGliX2RlZmxhdGUvemxpYl9kZWZsYXRlLmtvCi0gICAgbG9hZGluZyBAMHhmZmZmZmZmZmEwMWIxMDAwOiAvaG9tZS91c2VyL2xpbnV4L2J1aWxkL2ZzL2J0cmZzL2J0cmZzLmtvCi0KLSAgICBCcmVha3BvaW50IDEsIGJ0cmZzX2luaXRfc3lzZnMgKCkgYXQgL2hvbWUvdXNlci9saW51eC9mcy9idHJmcy9zeXNmcy5jOjM2Ci0gICAgMzYgICAgICAgICAgICAgIGJ0cmZzX2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCJidHJmcyIsIE5VTEwsIGZzX2tvYmopOwotCi0gbyBEdW1wIHRoZSBsb2cgYnVmZmVyIG9mIHRoZSB0YXJnZXQga2VybmVsOgotICAgIChnZGIpIGx4LWRtZXNnCi0gICAgWyAgICAgMC4wMDAwMDBdIEluaXRpYWxpemluZyBjZ3JvdXAgc3Vic3lzIGNwdXNldAotICAgIFsgICAgIDAuMDAwMDAwXSBJbml0aWFsaXppbmcgY2dyb3VwIHN1YnN5cyBjcHUKLSAgICBbICAgICAwLjAwMDAwMF0gTGludXggdmVyc2lvbiAzLjguMC1yYzQtZGJnKyAoLi4uCi0gICAgWyAgICAgMC4wMDAwMDBdIENvbW1hbmQgbGluZTogcm9vdD0vZGV2L3NkYTIgcmVzdW1lPS9kZXYvc2RhMSB2Z2E9MHgzMTQKLSAgICBbICAgICAwLjAwMDAwMF0gZTgyMDogQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOgotICAgIFsgICAgIDAuMDAwMDAwXSBCSU9TLWU4MjA6IFttZW0gMHgwMDAwMDAwMDAwMDAwMDAwLTB4MDAwMDAwMDAwMDA5ZmJmZl0gdXNhYmxlCi0gICAgWyAgICAgMC4wMDAwMDBdIEJJT1MtZTgyMDogW21lbSAweDAwMDAwMDAwMDAwOWZjMDAtMHgwMDAwMDAwMDAwMDlmZmZmXSByZXNlcnZlZAotICAgIC4uLi4KLQotIG8gRXhhbWluZSBmaWVsZHMgb2YgdGhlIGN1cnJlbnQgdGFzayBzdHJ1Y3Q6Ci0gICAgKGdkYikgcCAkbHhfY3VycmVudCgpLnBpZAotICAgICQxID0gNDk5OAotICAgIChnZGIpIHAgJGx4X2N1cnJlbnQoKS5jb21tCi0gICAgJDIgPSAibW9kcHJvYmVcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIgotCi0gbyBNYWtlIHVzZSBvZiB0aGUgcGVyLWNwdSBmdW5jdGlvbiBmb3IgdGhlIGN1cnJlbnQgb3IgYSBzcGVjaWZpZWQgQ1BVOgotICAgIChnZGIpIHAgJGx4X3Blcl9jcHUoInJ1bnF1ZXVlcyIpLm5yX3J1bm5pbmcKLSAgICAkMyA9IDEKLSAgICAoZ2RiKSBwICRseF9wZXJfY3B1KCJydW5xdWV1ZXMiLCAyKS5ucl9ydW5uaW5nCi0gICAgJDQgPSAwCi0KLSBvIERpZyBpbnRvIGhydGltZXJzIHVzaW5nIHRoZSBjb250YWluZXJfb2YgaGVscGVyOgotICAgIChnZGIpIHNldCAkbmV4dCA9ICRseF9wZXJfY3B1KCJocnRpbWVyX2Jhc2VzIikuY2xvY2tfYmFzZVswXS5hY3RpdmUubmV4dAotICAgIChnZGIpIHAgKiRjb250YWluZXJfb2YoJG5leHQsICJzdHJ1Y3QgaHJ0aW1lciIsICJub2RlIikKLSAgICAkNSA9IHsKLSAgICAgIG5vZGUgPSB7Ci0gICAgICAgIG5vZGUgPSB7Ci0gICAgICAgICAgX19yYl9wYXJlbnRfY29sb3IgPSAxODQ0NjYxMjEzMzM1NTI1NjA3MiwKLSAgICAgICAgICByYl9yaWdodCA9IDB4MCA8aXJxX3N0YWNrX3VuaW9uPiwKLSAgICAgICAgICByYl9sZWZ0ID0gMHgwIDxpcnFfc3RhY2tfdW5pb24+Ci0gICAgICAgIH0sCi0gICAgICAgIGV4cGlyZXMgPSB7Ci0gICAgICAgICAgdHY2NCA9IDE4MzUyNjgwMDAwMDAKLSAgICAgICAgfQotICAgICAgfSwKLSAgICAgIF9zb2Z0ZXhwaXJlcyA9IHsKLSAgICAgICAgdHY2NCA9IDE4MzUyNjgwMDAwMDAKLSAgICAgIH0sCi0gICAgICBmdW5jdGlvbiA9IDB4ZmZmZmZmZmY4MTA3ODIzMiA8dGlja19zY2hlZF90aW1lcj4sCi0gICAgICBiYXNlID0gMHhmZmZmODgwMDNmZDBkNmYwLAotICAgICAgc3RhdGUgPSAxLAotICAgICAgc3RhcnRfcGlkID0gMCwKLSAgICAgIHN0YXJ0X3NpdGUgPSAweGZmZmZmZmZmODEwNTVjMWYgPGhydGltZXJfc3RhcnRfcmFuZ2VfbnMrMjA+LAotICAgICAgc3RhcnRfY29tbSA9ICJzd2FwcGVyLzJcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAiCi0gICAgfQotCi0KLUxpc3Qgb2YgY29tbWFuZHMgYW5kIGZ1bmN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBudW1iZXIgb2YgY29tbWFuZHMgYW5kIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBtYXkgZXZvbHZlIG92ZXIgdGhlIHRpbWUsCi10aGlzIGlzIGp1c3QgYSBzbmFwc2hvdCBvZiB0aGUgaW5pdGlhbCB2ZXJzaW9uOgotCi0gKGdkYikgYXByb3BvcyBseAotIGZ1bmN0aW9uIGx4X2N1cnJlbnQgLS0gUmV0dXJuIGN1cnJlbnQgdGFzawotIGZ1bmN0aW9uIGx4X21vZHVsZSAtLSBGaW5kIG1vZHVsZSBieSBuYW1lIGFuZCByZXR1cm4gdGhlIG1vZHVsZSB2YXJpYWJsZQotIGZ1bmN0aW9uIGx4X3Blcl9jcHUgLS0gUmV0dXJuIHBlci1jcHUgdmFyaWFibGUKLSBmdW5jdGlvbiBseF90YXNrX2J5X3BpZCAtLSBGaW5kIExpbnV4IHRhc2sgYnkgUElEIGFuZCByZXR1cm4gdGhlIHRhc2tfc3RydWN0IHZhcmlhYmxlCi0gZnVuY3Rpb24gbHhfdGhyZWFkX2luZm8gLS0gQ2FsY3VsYXRlIExpbnV4IHRocmVhZF9pbmZvIGZyb20gdGFzayB2YXJpYWJsZQotIGx4LWRtZXNnIC0tIFByaW50IExpbnV4IGtlcm5lbCBsb2cgYnVmZmVyCi0gbHgtbHNtb2QgLS0gTGlzdCBjdXJyZW50bHkgbG9hZGVkIG1vZHVsZXMKLSBseC1zeW1ib2xzIC0tIChSZS0pbG9hZCBzeW1ib2xzIG9mIExpbnV4IGtlcm5lbCBhbmQgY3VycmVudGx5IGxvYWRlZCBtb2R1bGVzCi0KLURldGFpbGVkIGhlbHAgY2FuIGJlIG9idGFpbmVkIHZpYSAiaGVscCA8Y29tbWFuZC1uYW1lPiIgZm9yIGNvbW1hbmRzIGFuZCAiaGVscAotZnVuY3Rpb24gPGZ1bmN0aW9uLW5hbWU+IiBmb3IgY29udmVuaWVuY2UgZnVuY3Rpb25zLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ncGlvL2JvYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vZ3Bpby9ib2FyZC50eHQKaW5kZXggODZkM2ZhOS4uNDA4ODRjNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ncGlvL2JvYXJkLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2dwaW8vYm9hcmQudHh0CkBAIC04LDkgKzgsOSBAQAogaW50ZXJmYWNlOyB5b3UganVzdCBmZXRjaCBhbiBpbnRlZ2VyIGZyb20gc29tZXdoZXJlIGFuZCByZXF1ZXN0IHRoZQogY29ycmVzcG9uZGluZyBHUElPLgogCi1QbGF0Zm9ybXMgdGhhdCBtYWtlIHVzZSBvZiBHUElPcyBtdXN0IHNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQiAoaWYgR1BJTyB1c2FnZQotaXMgbWFuZGF0b3J5KSBvciBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQiAoaWYgR1BJTyBzdXBwb3J0IGNhbiBiZSBvbWl0dGVkKSBpbgotdGhlaXIgS2NvbmZpZy4gVGhlbiwgaG93IEdQSU9zIGFyZSBtYXBwZWQgZGVwZW5kcyBvbiB3aGF0IHRoZSBwbGF0Zm9ybSB1c2VzIHRvCitBbGwgcGxhdGZvcm1zIGNhbiBlbmFibGUgdGhlIEdQSU8gbGlicmFyeSwgYnV0IGlmIHRoZSBwbGF0Zm9ybSBzdHJpY3RseQorcmVxdWlyZXMgR1BJTyBmdW5jdGlvbmFsaXR5IHRvIGJlIHByZXNlbnQsIGl0IG5lZWRzIHRvIHNlbGVjdCBHUElPTElCIGZyb20gaXRzCitLY29uZmlnLiBUaGVuLCBob3cgR1BJT3MgYXJlIG1hcHBlZCBkZXBlbmRzIG9uIHdoYXQgdGhlIHBsYXRmb3JtIHVzZXMgdG8KIGRlc2NyaWJlIGl0cyBoYXJkd2FyZSBsYXlvdXQuIEN1cnJlbnRseSwgbWFwcGluZ3MgY2FuIGJlIGRlZmluZWQgdGhyb3VnaCBkZXZpY2UKIHRyZWUsIEFDUEksIGFuZCBwbGF0Zm9ybSBkYXRhLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwaW8vZHJpdmVyLnR4dCBiL0RvY3VtZW50YXRpb24vZ3Bpby9kcml2ZXIudHh0CmluZGV4IDZjYjM1YTcuLjM2OGQ1YTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZ3Bpby9kcml2ZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZ3Bpby9kcml2ZXIudHh0CkBAIC0yNjIsNiArMjYyLDEyIEBACiAgIHRvIHRoZSBjb250YWluZXIgdXNpbmcgY29udGFpbmVyX29mKCkuCiAgIChTZWUgRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZGVzaWduLXBhdHRlcm5zLnR4dCkKIAorICBJZiB0aGVyZSBpcyBhIG5lZWQgdG8gZXhjbHVkZSBjZXJ0YWluIEdQSU9zIGZyb20gdGhlIElSUSBkb21haW4sIG9uZSBjYW4KKyAgc2V0IC5pcnFfbmVlZF92YWxpZF9tYXNrIG9mIHRoZSBncGlvY2hpcCBiZWZvcmUgZ3Bpb2NoaXBfYWRkX2RhdGEoKSBpcworICBjYWxsZWQuIFRoaXMgYWxsb2NhdGVzIC5pcnFfdmFsaWRfbWFzayB3aXRoIGFzIG1hbnkgYml0cyBzZXQgYXMgdGhlcmUgYXJlCisgIEdQSU9zIGluIHRoZSBjaGlwLiBEcml2ZXJzIGNhbiBleGNsdWRlIEdQSU9zIGJ5IGNsZWFyaW5nIGJpdHMgZnJvbSB0aGlzCisgIG1hc2suIFRoZSBtYXNrIG11c3QgYmUgZmlsbGVkIGluIGJlZm9yZSBncGlvY2hpcF9pcnFjaGlwX2FkZCgpIGlzIGNhbGxlZC4KKwogKiBncGlvY2hpcF9zZXRfY2hhaW5lZF9pcnFjaGlwKCk6IHNldHMgdXAgYSBjaGFpbmVkIGlycSBoYW5kbGVyIGZvciBhCiAgIGdwaW9fY2hpcCBmcm9tIGEgcGFyZW50IElSUSBhbmQgcGFzc2VzIHRoZSBzdHJ1Y3QgZ3Bpb19jaGlwKiBhcyBoYW5kbGVyCiAgIGRhdGEuIChOb3RpY2UgaGFuZGxlciBkYXRhLCBzaW5jZSB0aGUgaXJxY2hpcCBkYXRhIGlzIGxpa2VseSB1c2VkIGJ5IHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ncGlvL2dwaW8tbGVnYWN5LnR4dCBiL0RvY3VtZW50YXRpb24vZ3Bpby9ncGlvLWxlZ2FjeS50eHQKaW5kZXggNzlhYjU2NC4uYjM0ZmQ5NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ncGlvL2dwaW8tbGVnYWN5LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2dwaW8vZ3Bpby1sZWdhY3kudHh0CkBAIC03Miw4ICs3Miw4IEBACiBub3QgY2FyZSBob3cgaXQncyBpbXBsZW1lbnRlZC4pCiAKIFRoYXQgc2FpZCwgaWYgdGhlIGNvbnZlbnRpb24gaXMgc3VwcG9ydGVkIG9uIHRoZWlyIHBsYXRmb3JtLCBkcml2ZXJzIHNob3VsZAotdXNlIGl0IHdoZW4gcG9zc2libGUuICBQbGF0Zm9ybXMgbXVzdCBzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIgb3IKLUFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCIGluIHRoZWlyIEtjb25maWcuICBEcml2ZXJzIHRoYXQgY2FuJ3Qgd29yayB3aXRob3V0Cit1c2UgaXQgd2hlbiBwb3NzaWJsZS4gIFBsYXRmb3JtcyBtdXN0IHNlbGVjdCBHUElPTElCIGlmIEdQSU8gZnVuY3Rpb25hbGl0eQoraXMgc3RyaWN0bHkgcmVxdWlyZWQuICBEcml2ZXJzIHRoYXQgY2FuJ3Qgd29yayB3aXRob3V0CiBzdGFuZGFyZCBHUElPIGNhbGxzIHNob3VsZCBoYXZlIEtjb25maWcgZW50cmllcyB3aGljaCBkZXBlbmQgb24gR1BJT0xJQi4gIFRoZQogR1BJTyBjYWxscyBhcmUgYXZhaWxhYmxlLCBlaXRoZXIgYXMgInJlYWwgY29kZSIgb3IgYXMgb3B0aW1pemVkLWF3YXkgc3R1YnMsCiB3aGVuIGRyaXZlcnMgdXNlIHRoZSBpbmNsdWRlIGZpbGU6CkBAIC01NTMsMjIgKzU1MywxNCBAQAogCiBQbGF0Zm9ybSBTdXBwb3J0CiAtLS0tLS0tLS0tLS0tLS0tCi1UbyBzdXBwb3J0IHRoaXMgZnJhbWV3b3JrLCBhIHBsYXRmb3JtJ3MgS2NvbmZpZyB3aWxsICJzZWxlY3QiIGVpdGhlcgotQVJDSF9SRVFVSVJFX0dQSU9MSUIgb3IgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKLWFuZCBhcnJhbmdlIHRoYXQgaXRzIDxhc20vZ3Bpby5oPiBpbmNsdWRlcyA8YXNtLWdlbmVyaWMvZ3Bpby5oPiBhbmQgZGVmaW5lcwotdGhyZWUgZnVuY3Rpb25zOiBncGlvX2dldF92YWx1ZSgpLCBncGlvX3NldF92YWx1ZSgpLCBhbmQgZ3Bpb19jYW5zbGVlcCgpLgorVG8gZm9yY2UtZW5hYmxlIHRoaXMgZnJhbWV3b3JrLCBhIHBsYXRmb3JtJ3MgS2NvbmZpZyB3aWxsICJzZWxlY3QiIEdQSU9MSUIsCitlbHNlIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBzdXBwb3J0IGZvciBHUElPLgogCiBJdCBtYXkgYWxzbyBwcm92aWRlIGEgY3VzdG9tIHZhbHVlIGZvciBBUkNIX05SX0dQSU9TLCBzbyB0aGF0IGl0IGJldHRlcgogcmVmbGVjdHMgdGhlIG51bWJlciBvZiBHUElPcyBpbiBhY3R1YWwgdXNlIG9uIHRoYXQgcGxhdGZvcm0sIHdpdGhvdXQKIHdhc3Rpbmcgc3RhdGljIHRhYmxlIHNwYWNlLiAgKEl0IHNob3VsZCBjb3VudCBib3RoIGJ1aWx0LWluL1NvQyBHUElPcyBhbmQKIGFsc28gb25lcyBvbiBHUElPIGV4cGFuZGVycy4KIAotQVJDSF9SRVFVSVJFX0dQSU9MSUIgbWVhbnMgdGhhdCB0aGUgZ3Bpb2xpYiBjb2RlIHdpbGwgYWx3YXlzIGdldCBjb21waWxlZAotaW50byB0aGUga2VybmVsIG9uIHRoYXQgYXJjaGl0ZWN0dXJlLgotCi1BUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQiBtZWFucyB0aGUgZ3Bpb2xpYiBjb2RlIGRlZmF1bHRzIHRvIG9mZiBhbmQgdGhlIHVzZXIKLWNhbiBlbmFibGUgaXQgYW5kIGJ1aWxkIGl0IGludG8gdGhlIGtlcm5lbCBvcHRpb25hbGx5LgotCiBJZiBuZWl0aGVyIG9mIHRoZXNlIG9wdGlvbnMgYXJlIHNlbGVjdGVkLCB0aGUgcGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydAogR1BJT3MgdGhyb3VnaCBHUElPLWxpYiBhbmQgdGhlIGNvZGUgY2Fubm90IGJlIGVuYWJsZWQgYnkgdGhlIHVzZXIuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ3B1L2NvbmYucHkgYi9Eb2N1bWVudGF0aW9uL2dwdS9jb25mLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTRkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2dwdS9jb25mLnB5CkBAIC0wLDAgKzEsNSBAQAorIyAtKi0gY29kaW5nOiB1dGYtODsgbW9kZTogcHl0aG9uIC0qLQorCitwcm9qZWN0ID0gIkxpbnV4IEdQVSBEcml2ZXIgRGV2ZWxvcGVyJ3MgR3VpZGUiCisKK3RhZ3MuYWRkKCJzdWJwcm9qZWN0IikKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ3B1L2luZGV4LnJzdCBiL0RvY3VtZW50YXRpb24vZ3B1L2luZGV4LnJzdAppbmRleCBmY2FjMGZhLi41ZmYzZDJiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2dwdS9pbmRleC5yc3QKKysrIGIvRG9jdW1lbnRhdGlvbi9ncHUvaW5kZXgucnN0CkBAIC0xMiwzICsxMiwxMCBAQAogICAgZHJtLXVhcGkKICAgIGk5MTUKICAgIHZnYS1zd2l0Y2hlcm9vCisKKy4uIG9ubHk6OiAgc3VicHJvamVjdAorCisgICBJbmRpY2VzCisgICA9PT09PT09CisKKyAgICogOnJlZjpgZ2VuaW5kZXhgCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2hpZC9pbnRlbC1pc2gtaGlkLnR4dCBiL0RvY3VtZW50YXRpb24vaGlkL2ludGVsLWlzaC1oaWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OGIyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hpZC9pbnRlbC1pc2gtaGlkLnR4dApAQCAtMCwwICsxLDQ1NCBAQAorSW50ZWwgSW50ZWdyYXRlZCBTZW5zb3IgSHViIChJU0gpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0Egc2Vuc29yIGh1YiBlbmFibGVzIHRoZSBhYmlsaXR5IHRvIG9mZmxvYWQgc2Vuc29yIHBvbGxpbmcgYW5kIGFsZ29yaXRobQorcHJvY2Vzc2luZyB0byBhIGRlZGljYXRlZCBsb3cgcG93ZXIgY28tcHJvY2Vzc29yLiBUaGlzIGFsbG93cyB0aGUgY29yZQorcHJvY2Vzc29yIHRvIGdvIGludG8gbG93IHBvd2VyIG1vZGVzIG1vcmUgb2Z0ZW4sIHJlc3VsdGluZyBpbiB0aGUgaW5jcmVhc2VkCitiYXR0ZXJ5IGxpZmUuCisKK1RoZXJlIGFyZSBtYW55IHZlbmRvcnMgcHJvdmlkaW5nIGV4dGVybmFsIHNlbnNvciBodWJzIGNvbmZpcm1pbmcgdG8gSElECitTZW5zb3IgdXNhZ2UgdGFibGVzLCBhbmQgdXNlZCBpbiBzZXZlcmFsIHRhYmxldHMsIDIgaW4gMSBjb252ZXJ0aWJsZSBsYXB0b3BzCithbmQgZW1iZWRkZWQgcHJvZHVjdHMuIExpbnV4IGhhZCB0aGlzIHN1cHBvcnQgc2luY2UgTGludXggMy45LgorCitJbnRlbMKuIGludHJvZHVjZWQgaW50ZWdyYXRlZCBzZW5zb3IgaHVicyBhcyBhIHBhcnQgb2YgdGhlIFNvQyBzdGFydGluZyBmcm9tCitDaGVycnkgVHJhaWwgYW5kIG5vdyBzdXBwb3J0ZWQgb24gbXVsdGlwbGUgZ2VuZXJhdGlvbnMgb2YgQ1BVIHBhY2thZ2VzLiBUaGVyZQorYXJlIG1hbnkgY29tbWVyY2lhbCBkZXZpY2VzIGFscmVhZHkgc2hpcHBlZCB3aXRoIEludGVncmF0ZWQgU2Vuc29yIEh1YnMgKElTSCkuCitUaGVzZSBJU0ggYWxzbyBjb21wbHkgdG8gSElEIHNlbnNvciBzcGVjaWZpY2F0aW9uLCBidXQgdGhlICBkaWZmZXJlbmNlIGlzIHRoZQordHJhbnNwb3J0IHByb3RvY29sIHVzZWQgZm9yIGNvbW11bmljYXRpb24uIFRoZSBjdXJyZW50IGV4dGVybmFsIHNlbnNvciBodWJzCittYWlubHkgdXNlIEhJRCBvdmVyIGkyQyBvciBVU0IuIEJ1dCBJU0ggZG9lc24ndCB1c2UgZWl0aGVyIGkyYyBvciBVU0IuCisKKzEuIE92ZXJ2aWV3CisKK1VzaW5nIGEgYW5hbG9neSB3aXRoIGEgdXNiaGlkIGltcGxlbWVudGF0aW9uLCB0aGUgSVNIIGZvbGxvd3MgYSBzaW1pbGFyIG1vZGVsCitmb3IgYSB2ZXJ5IGhpZ2ggc3BlZWQgY29tbXVuaWNhdGlvbjoKKworCS0tLS0tLS0tLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJfCAgICBVU0IgSElECXwJLS0+CXwgICAgSVNIIEhJRAkgICAgIHwKKwktLS0tLS0tLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS0tLS0tLS0tLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJfCAgVVNCIHByb3RvY29sCXwJLS0+CXwgICAgSVNIIFRyYW5zcG9ydCAgIHwKKwktLS0tLS0tLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS0tLS0tLS0tLS0tLS0tLS0tCQktLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJfCAgRUhDSS9YSENJCXwJLS0+CXwgICAgSVNIIElQQwkgICAgIHwKKwktLS0tLS0tLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICAgIFBDSQkJCQkgUENJCisJLS0tLS0tLS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgfEhvc3QgY29udHJvbGxlcnwJLS0+CXwgICAgSVNIIHByb2Nlc3NvciAgIHwKKwktLS0tLS0tLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAgICAgVVNCIExpbmsKKwktLS0tLS0tLS0tLS0tLS0tLQkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXwgVVNCIEVuZCBwb2ludHN8CS0tPgl8ICAgIElTSCBDbGllbnRzICAgICB8CisJLS0tLS0tLS0tLS0tLS0tLS0JCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTGlrZSBVU0IgcHJvdG9jb2wgcHJvdmlkZXMgYSBtZXRob2QgZm9yIGRldmljZSBlbnVtZXJhdGlvbiwgbGluayBtYW5hZ2VtZW50CithbmQgdXNlciBkYXRhIGVuY2Fwc3VsYXRpb24sIHRoZSBJU0ggYWxzbyBwcm92aWRlcyBzaW1pbGFyIHNlcnZpY2VzLiBCdXQgaXQgaXMKK3ZlcnkgbGlnaHQgd2VpZ2h0IHRhaWxvcmVkIHRvIG1hbmFnZSBhbmQgY29tbXVuaWNhdGUgd2l0aCBJU0ggY2xpZW50CithcHBsaWNhdGlvbnMgaW1wbGVtZW50ZWQgaW4gdGhlIGZpcm13YXJlLgorCitUaGUgSVNIIGFsbG93cyBtdWx0aXBsZSBzZW5zb3IgbWFuYWdlbWVudCBhcHBsaWNhdGlvbnMgZXhlY3V0aW5nIGluIHRoZQorZmlybXdhcmUuIExpa2UgVVNCIGVuZHBvaW50cyB0aGUgbWVzc2FnaW5nIGNhbiBiZSB0by9mcm9tIGEgY2xpZW50LiBBcyBwYXJ0IG9mCitlbnVtZXJhdGlvbiBwcm9jZXNzLCB0aGVzZSBjbGllbnRzIGFyZSBpZGVudGlmaWVkLiBUaGVzZSBjbGllbnRzIGNhbiBiZSBzaW1wbGUKK0hJRCBzZW5zb3IgYXBwbGljYXRpb25zLCBzZW5zb3IgY2FsaWJyYXRpb24gYXBwbGljYXRpb24gb3Igc2Vub3IgZmlybXdhcmUKK3VwZGF0ZSBhcHBsaWNhdGlvbi4KKworVGhlIGltcGxlbWVudGF0aW9uIG1vZGVsIGlzIHNpbWlsYXIsIGxpa2UgVVNCIGJ1cywgSVNIIHRyYW5zcG9ydCBpcyBhbHNvCitpbXBsZW1lbnRlZCBhcyBhIGJ1cy4gRWFjaCBjbGllbnQgYXBwbGljYXRpb24gZXhlY3V0aW5nIGluIHRoZSBJU0ggcHJvY2Vzc29yCitpcyByZWdpc3RlcmVkIGFzIGEgZGV2aWNlIG9uIHRoaXMgYnVzLiBUaGUgZHJpdmVyLCB3aGljaCBiaW5kcyBlYWNoIGRldmljZQorKElTSCBISUQgZHJpdmVyKSBpZGVudGlmaWVzIHRoZSBkZXZpY2UgdHlwZSBhbmQgcmVnaXN0ZXJzIHdpdGggdGhlIGhpZCBjb3JlLgorCisyLiBJU0ggSW1wbGVtZW50YXRpb246IEJsb2NrIERpYWdyYW0KKworCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl8ICBVc2VyIFNwYWNlIEFwcGxpY2F0aW9ucyAgfAorCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0tLS0tLS0tLS0tLS0tLUlJTyBBQkktLS0tLS0tLS0tLS0tLS0tCisJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJfCAgSUlPIFNlbnNvciBEcml2ZXJzCSAgfAorCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXwJIElJTyBjb3JlCSAgfAorCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCXwgICBISUQgU2Vuc29yIEh1YiBNRkQJICB8CisJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJfCAgICAgICBISUQgQ29yZQkgIHwKKwkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl8ICAgSElEIG92ZXIgSVNIIENsaWVudCAgIHwKKwkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl8ICAgSVNIIFRyYW5zcG9ydCAoSVNIVFApIHwKKwkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwl8ICAgICAgSVBDIERyaXZlcnMJICB8CisJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitPUworLS0tLS0tLS0tLS0tLS0tLSAgIFBDSSAtLS0tLS0tLS0tLS0tLS0tLQorSGFyZHdhcmUgKyBGaXJtd2FyZQorCSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJfCBJU0ggSGFyZHdhcmUvRmlybXdhcmUoRlcpIHwKKwkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiszLiBIaWdoIGxldmVsIHByb2Nlc3NpbmcgaW4gYWJvdmUgYmxvY2tzCisKKzMuMSBIYXJkd2FyZSBJbnRlcmZhY2UKKworVGhlIElTSCBpcyBleHBvc2VkIGFzICJOb24tVkdBIHVuY2xhc3NpZmllZCBQQ0kgZGV2aWNlIiB0byB0aGUgaG9zdC4gVGhlIFBDSQorcHJvZHVjdCBhbmQgdmVuZG9yIElEcyBhcmUgY2hhbmdlZCBmcm9tIGRpZmZlcmVudCBnZW5lcmF0aW9ucyBvZiBwcm9jZXNzb3JzLiBTbwordGhlIHNvdXJjZSBjb2RlIHdoaWNoIGVudW1lcmF0ZSBkcml2ZXJzIG5lZWRzIHRvIHVwZGF0ZSBmcm9tIGdlbmVyYXRpb24gdG8KK2dlbmVyYXRpb24uCisKKzMuMiBJbnRlciBQcm9jZXNzb3IgQ29tbXVuaWNhdGlvbiAoSVBDKSBkcml2ZXIKK0xvY2F0aW9uOiBkcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lwYworCitUaGUgSVBDIG1lc3NhZ2UgdXNlZCBtZW1vcnkgbWFwcGVkIEkvTy4gVGhlIHJlZ2lzdGVycyBhcmUgZGVmaW5lZCBpbgoraHctaXNoLXJlZ3MuaC4KKworMy4yLjEgSVBDL0ZXIG1lc3NhZ2UgdHlwZXMKKworVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBtZXNzYWdlcywgb25lIGZvciBtYW5hZ2VtZW50IG9mIGxpbmsgYW5kIG90aGVyIG1lc3NhZ2VzCithcmUgdG8gYW5kIGZyb20gdHJhbnNwb3J0IGxheWVycy4KKworVFggYW5kIFJYIG9mIFRyYW5zcG9ydCBtZXNzYWdlcworCitBIHNldCBvZiBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVyIG9mZmVycyBzdXBwb3J0IG9mIG11bHRpIGJ5dGUgbWVzc2FnZXMgVFggYW5kCitSWCAoRS5nLklQQ19SRUdfSVNIMkhPU1RfTVNHLCBJUENfUkVHX0hPU1QySVNIX01TRykuIFRoZSBJUEMgbGF5ZXIgbWFpbnRhaW5zCitpbnRlcm5hbCBxdWV1ZXMgdG8gc2VxdWVuY2UgbWVzc2FnZXMgYW5kIHNlbmQgdGhlbSBpbiBvcmRlciB0byB0aGUgRlcuCitPcHRpb25hbGx5IHRoZSBjYWxsZXIgY2FuIHJlZ2lzdGVyIGhhbmRsZXIgdG8gZ2V0IG5vdGlmaWNhdGlvbiBvZiBjb21wbGV0aW9uLgorQSBkb29yIGJlbGwgbWVjaGFuaXNtIGlzIHVzZWQgaW4gbWVzc2FnaW5nIHRvIHRyaWdnZXIgcHJvY2Vzc2luZyBpbiBob3N0IGFuZAorY2xpZW50IGZpcm13YXJlIHNpZGUuIFdoZW4gSVNIIGludGVycnVwdCBoYW5kbGVyIGlzIGNhbGxlZCwgdGhlIElTSDJIT1NUCitkb29yYmVsbCByZWdpc3RlciBpcyB1c2VkIGJ5IGhvc3QgZHJpdmVycyB0byBkZXRlcm1pbmUgdGhhdCB0aGUgaW50ZXJydXB0CitpcyBmb3IgSVNILgorCitFYWNoIHNpZGUgaGFzIDMyIDMyLWJpdCBtZXNzYWdlIHJlZ2lzdGVycyBhbmQgYSAzMi1iaXQgZG9vcmJlbGwuIERvb3JiZWxsCityZWdpc3RlciBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CitCaXRzIDAuLjY6IGZyYWdtZW50IGxlbmd0aCAoNyBiaXRzIGFyZSB1c2VkKQorQml0cyAxMC4uMTM6IGVuY2Fwc3VsYXRlZCBwcm90b2NvbAorQml0cyAxNi4uMTk6IG1hbmFnZW1lbnQgY29tbWFuZCAoZm9yIElQQyBtYW5hZ2VtZW50IHByb3RvY29sKQorQml0IDMxOiBkb29yYmVsbCB0cmlnZ2VyIChzaWduYWwgSC9XIGludGVycnVwdCB0byB0aGUgb3RoZXIgc2lkZSkKK090aGVyIGJpdHMgYXJlIHJlc2VydmVkLCBzaG91bGQgYmUgMC4KKworMy4yLjIgVHJhbnNwb3J0IGxheWVyIGludGVyZmFjZQorCitUbyBhYnN0cmFjdCBIVyBsZXZlbCBJUEMgY29tbXVuaWNhdGlvbiwgYSBzZXQgb2YgY2FsbGJhY2tzIGFyZSByZWdpc3RlcmVkLgorVGhlIHRyYW5zcG9ydCBsYXllciB1c2VzIHRoZW0gdG8gc2VuZCBhbmQgcmVjZWl2ZSBtZXNzYWdlcy4KK1JlZmVyIHRvICBzdHJ1Y3QgaXNodHBfaHdfb3BzIGZvciBjYWxsYmFja3MuCisKKzMuMyBJU0ggVHJhbnNwb3J0IGxheWVyCitMb2NhdGlvbjogZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC8KKworMy4zLjEgQSBHZW5lcmljIFRyYW5zcG9ydCBMYXllcgorCitUaGUgdHJhbnNwb3J0IGxheWVyIGlzIGEgYmktZGlyZWN0aW9uYWwgcHJvdG9jb2wsIHdoaWNoIGRlZmluZXM6CistIFNldCBvZiBjb21tYW5kcyB0byBzdGFydCwgc3RvcCwgY29ubmVjdCwgZGlzY29ubmVjdCBhbmQgZmxvdyBjb250cm9sCisoaXNodHAvaGJtLmgpIGZvciBkZXRhaWxzCistIEEgZmxvdyBjb250cm9sIG1lY2hhbmlzbSB0byBhdm9pZCBidWZmZXIgb3ZlcmZsb3dzCisKK1RoaXMgcHJvdG9jb2wgcmVzZW1ibGVzIGJ1cyBtZXNzYWdlcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBkb2N1bWVudDoKK2h0dHA6Ly93d3cuaW50ZWwuY29tL2NvbnRlbnQvZGFtL3d3dy9wdWJsaWMvdXMvZW4vZG9jdW1lbnRzL3RlY2huaWNhbC1cCitzcGVjaWZpY2F0aW9ucy9kY21pLWhpLTEtMC1zcGVjLnBkZiAiQ2hhcHRlciA3OiBCdXMgTWVzc2FnZSBMYXllciIKKworMy4zLjIgQ29ubmVjdGlvbiBhbmQgRmxvdyBDb250cm9sIE1lY2hhbmlzbQorCitFYWNoIEZXIGNsaWVudCBhbmQgYSBwcm90b2NvbCBpcyBpZGVudGlmaWVkIGJ5IGFuIFVVSUQuIEluIG9yZGVyIHRvIGNvbW11bmljYXRlCit0byBhIEZXIGNsaWVudCwgYSBjb25uZWN0aW9uIG11c3QgYmUgZXN0YWJsaXNoZWQgdXNpbmcgY29ubmVjdCByZXF1ZXN0IGFuZAorcmVzcG9uc2UgYnVzIG1lc3NhZ2VzLiBJZiBzdWNjZXNzZnVsLCBhIHBhaXIgKGhvc3RfY2xpZW50X2lkIGFuZCBmd19jbGllbnRfaWQpCit3aWxsIGlkZW50aWZ5IHRoZSBjb25uZWN0aW9uLgorCitPbmNlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQsIHBlZXJzIHNlbmQgZWFjaCBvdGhlciBmbG93IGNvbnRyb2wgYnVzIG1lc3NhZ2VzCitpbmRlcGVuZGVudGx5LiBFdmVyeSBwZWVyIG1heSBzZW5kIGEgbWVzc2FnZSBvbmx5IGlmIGl0IGhhcyByZWNlaXZlZCBhCitmbG93LWNvbnRyb2wgY3JlZGl0IGJlZm9yZS4gT25jZSBpdCBzZW50IGEgbWVzc2FnZSwgaXQgbWF5IG5vdCBzZW5kIGFub3RoZXIgb25lCitiZWZvcmUgcmVjZWl2aW5nIHRoZSBuZXh0IGZsb3cgY29udHJvbCBjcmVkaXQuCitFaXRoZXIgc2lkZSBjYW4gc2VuZCBkaXNjb25uZWN0IHJlcXVlc3QgYnVzIG1lc3NhZ2UgdG8gZW5kIGNvbW11bmljYXRpb24uIEFsc28KK3RoZSBsaW5rIHdpbGwgYmUgZHJvcHBlZCBpZiBtYWpvciBGVyByZXNldCBvY2N1cnMuCisKKzMuMy4zIFBlZXIgdG8gUGVlciBkYXRhIHRyYW5zZmVyCisKK1BlZXIgdG8gUGVlciBkYXRhIHRyYW5zZmVyIGNhbiBoYXBwZW4gd2l0aCBvciB3aXRob3V0IHVzaW5nIERNQS4gRGVwZW5kaW5nIG9uCit0aGUgc2Vuc29yIGJhbmR3aWR0aCByZXF1aXJlbWVudCBETUEgY2FuIGJlIGVuYWJsZWQgYnkgdXNpbmcgbW9kdWxlIHBhcmFtZXRlcgoraXNodHBfdXNlX2RtYSB1bmRlciBpbnRlbF9pc2h0cC4KKworRWFjaCBzaWRlIChob3N0IGFuZCBGVykgbWFuYWdlcyBpdHMgRE1BIHRyYW5zZmVyIG1lbW9yeSBpbmRlcGVuZGVudGx5LiBXaGVuIGFuCitJU0hUUCBjbGllbnQgZnJvbSBlaXRoZXIgaG9zdCBvciBGVyBzaWRlIHdhbnRzIHRvIHNlbmQgc29tZXRoaW5nLCBpdCBkZWNpZGVzCit3aGV0aGVyIHRvIHNlbmQgb3ZlciBJUEMgb3Igb3ZlciBETUE7IGZvciBlYWNoIHRyYW5zZmVyIHRoZSBkZWNpc2lvbiBpcworaW5kZXBlbmRlbnQuIFRoZSBzZW5kaW5nIHNpZGUgc2VuZHMgRE1BX1hGRVIgbWVzc2FnZSB3aGVuIHRoZSBtZXNzYWdlIGlzIGluCit0aGUgcmVzcGVjdGl2ZSBob3N0IGJ1ZmZlciAoVFggd2hlbiBob3N0IGNsaWVudCBzZW5kcywgUlggd2hlbiBGVyBjbGllbnQKK3NlbmRzKS4gVGhlIHJlY2lwaWVudCBvZiBETUEgbWVzc2FnZSByZXNwb25kcyB3aXRoIERNQV9YRkVSX0FDSywgaW5kaWNhdGluZwordGhlIHNlbmRlciB0aGF0IHRoZSBtZW1vcnkgcmVnaW9uIGZvciB0aGF0IG1lc3NhZ2UgbWF5IGJlIHJldXNlZC4KKworRE1BIGluaXRpYWxpemF0aW9uIGlzIHN0YXJ0ZWQgd2l0aCBob3N0IHNlbmRpbmcgRE1BX0FMTE9DX05PVElGWSBidXMgbWVzc2FnZQorKHRoYXQgaW5jbHVkZXMgUlggYnVmZmVyKSBhbmQgRlcgcmVzcG9uZHMgd2l0aCBETUFfQUxMT0NfTk9USUZZX0FDSy4KK0FkZGl0aW9uYWxseSB0byBETUEgYWRkcmVzcyBjb21tdW5pY2F0aW9uLCB0aGlzIHNlcXVlbmNlIGNoZWNrcyBjYXBhYmlsaXRpZXM6CitpZiB0aHcgaG9zdCBkb2Vzbid0IHN1cHBvcnQgRE1BLCB0aGVuIGl0IHdvbid0IHNlbmQgRE1BIGFsbG9jYXRpb24sIHNvIEZXIGNhbid0CitzZW5kIERNQTsgaWYgRlcgZG9lc24ndCBzdXBwb3J0IERNQSB0aGVuIGl0IHdvbid0IHJlc3BvbmQgd2l0aAorRE1BX0FMTE9DX05PVElGWV9BQ0ssIGluIHdoaWNoIGNhc2UgaG9zdCB3aWxsIG5vdCB1c2UgRE1BIHRyYW5zZmVycy4KK0hlcmUgSVNIIGFjdHMgYXMgYnVzbWFzdGVyIERNQSBjb250cm9sbGVyLiBIZW5jZSB3aGVuIGhvc3Qgc2VuZHMgRE1BX1hGRVIsCitpdCdzIHJlcXVlc3QgdG8gZG8gaG9zdC0+SVNIIERNQSB0cmFuc2Zlcjsgd2hlbiBGVyBzZW5kcyBETUFfWEZFUiwgaXQgbWVhbnMKK3RoYXQgaXQgYWxyZWFkeSBkaWQgRE1BIGFuZCB0aGUgbWVzc2FnZSByZXNpZGVzIGF0IGhvc3QuIFRodXMsIERNQV9YRkVSCithbmQgRE1BX1hGRVJfQUNLIGFjdCBhcyBvd25lcnNoaXAgaW5kaWNhdG9ycy4KKworQXQgaW5pdGlhbCBzdGF0ZSBhbGwgb3V0Z29pbmcgbWVtb3J5IGJlbG9uZ3MgdG8gdGhlIHNlbmRlciAoVFggdG8gaG9zdCwgUlggdG8KK0ZXKSwgRE1BX1hGRVIgdHJhbnNmZXJzIG93bmVyc2hpcCBvbiB0aGUgcmVnaW9uIHRoYXQgY29udGFpbnMgSVNIVFAgbWVzc2FnZSB0bwordGhlIHJlY2VpdmluZyBzaWRlLCBETUFfWEZFUl9BQ0sgcmV0dXJucyBvd25lcnNoaXAgdG8gdGhlIHNlbmRlci4gQSBzZW5kZXIKK25lZWRzIG5vdCB3YWl0IGZvciBwcmV2aW91cyBETUFfWEZFUiB0byBiZSBhY2snZWQsIGFuZCBtYXkgc2VuZCBhbm90aGVyIG1lc3NhZ2UKK2FzIGxvbmcgYXMgcmVtYWluaW5nIGNvbnRpbnVvdXMgbWVtb3J5IGluIGl0cyBvd25lcnNoaXAgaXMgZW5vdWdoLgorSW4gcHJpbmNpcGxlLCBtdWx0aXBsZSBETUFfWEZFUiBhbmQgRE1BX1hGRVJfQUNLIG1lc3NhZ2VzIG1heSBiZSBzZW50IGF0IG9uY2UKKyh1cCB0byBJUEMgTVRVKSwgdGh1cyBhbGxvd2luZyBmb3IgaW50ZXJydXB0IHRocm90dGxpbmcuCitDdXJyZW50bHksIElTSCBGVyBkZWNpZGVzIHRvIHNlbmQgb3ZlciBETUEgaWYgSVNIVFAgbWVzc2FnZSBpcyBtb3JlIHRoYW4gMyBJUEMKK2ZyYWdtZW50cyBhbmQgdmlhIElQQyBvdGhlcndpc2UuCisKKzMuMy40IFJpbmcgQnVmZmVycworCitXaGVuIGEgY2xpZW50IGluaXRpYXRlIGEgY29ubmVjdGlvbiwgYSByaW5nIG9yIFJYIGFuZCBUWCBidWZmZXJzIGFyZSBhbGxvY2F0ZWQuCitUaGUgc2l6ZSBvZiByaW5nIGNhbiBiZSBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudC4gSElEIGNsaWVudCBzZXQgMTYgYW5kIDMyIGZvcgorVFggYW5kIFJYIGJ1ZmZlcnMgcmVzcGVjdGl2ZWx5LiBPbiBzZW5kIHJlcXVlc3QgZnJvbSBjbGllbnQsIHRoZSBkYXRhIHRvIGJlCitzZW50IGlzIGNvcGllZCB0byBvbmUgb2YgdGhlIHNlbmQgcmluZyBidWZmZXIgYW5kIHNjaGVkdWxlZCB0byBiZSBzZW50IHVzaW5nCitidXMgbWVzc2FnZSBwcm90b2NvbC4gVGhlc2UgYnVmZmVycyBhcmUgcmVxdWlyZWQgYmVjYXVzZSB0aGUgRlcgbWF5IGhhdmUgbm90CitoYXZlIHByb2Nlc3NlZCB0aGUgbGFzdCBtZXNzYWdlIGFuZCBtYXkgbm90IGhhdmUgZW5vdWdoIGZsb3cgY29udHJvbCBjcmVkaXRzCit0byBzZW5kLiBTYW1lIHRoaW5nIGhvbGRzIHRydWUgb24gcmVjZWl2ZSBzaWRlIGFuZCBmbG93IGNvbnRyb2wgaXMgcmVxdWlyZWQuCisKKzMuMy41IEhvc3QgRW51bWVyYXRpb24KKworVGhlIGhvc3QgZW51bWVyYXRpb24gYnVzIGNvbW1hbmQgYWxsb3cgZGlzY292ZXJ5IG9mIGNsaWVudHMgcHJlc2VudCBpbiB0aGUgRlcuCitUaGVyZSBjYW4gYmUgbXVsdGlwbGUgc2Vuc29yIGNsaWVudHMgYW5kIGNsaWVudHMgZm9yIGNhbGlicmF0aW9uIGZ1bmN0aW9uLgorCitUbyBlYXNlIGluIGltcGxhbnRhdGlvbiBhbmQgYWxsb3cgaW5kZXBlbmRlbnQgZHJpdmVyIGhhbmRsZSBlYWNoIGNsaWVudAordGhpcyB0cmFuc3BvcnQgbGF5ZXIgdGFrZXMgYWR2YW50YWdlIG9mIExpbnV4IEJ1cyBkcml2ZXIgbW9kZWwuIEVhY2gKK2NsaWVudCBpcyByZWdpc3RlcmVkIGFzIGRldmljZSBvbiB0aGUgdGhlIHRyYW5zcG9ydCBidXMgKGlzaHRwIGJ1cykuCisKK0VudW1lcmF0aW9uIHNlcXVlbmNlIG9mIG1lc3NhZ2VzOgorLSBIb3N0IHNlbmRzIEhPU1RfU1RBUlRfUkVRX0NNRCwgaW5kaWNhdGluZyB0aGF0IGhvc3QgSVNIVFAgbGF5ZXIgaXMgdXAuCistIEZXIHJlc3BvbmRzIHdpdGggSE9TVF9TVEFSVF9SRVNfQ01ECistIEhvc3Qgc2VuZHMgSE9TVF9FTlVNX1JFUV9DTUQgKGVudW1lcmF0ZSBGVyBjbGllbnRzKQorLSBGVyByZXNwb25kcyB3aXRoIEhPU1RfRU5VTV9SRVNfQ01EIHRoYXQgaW5jbHVkZXMgYml0bWFwIG9mIGF2YWlsYWJsZSBGVworY2xpZW50IElEcworLSBGb3IgZWFjaCBGVyBJRCBmb3VuZCBpbiB0aGF0IGJpdG1hcCBob3N0IHNlbmRzCitIT1NUX0NMSUVOVF9QUk9QRVJUSUVTX1JFUV9DTUQKKy0gRlcgcmVzcG9uZHMgd2l0aCBIT1NUX0NMSUVOVF9QUk9QRVJUSUVTX1JFU19DTUQuIFByb3BlcnRpZXMgaW5jbHVkZSBVVUlELAorbWF4IElTSFRQIG1lc3NhZ2Ugc2l6ZSwgZXRjLgorLSBPbmNlIGhvc3QgcmVjZWl2ZWQgcHJvcGVydGllcyBmb3IgdGhhdCBsYXN0IGRpc2NvdmVyZWQgY2xpZW50LCBpdCBjb25zaWRlcnMKK0lTSFRQIGRldmljZSBmdWxseSBmdW5jdGlvbmFsIChhbmQgYWxsb2NhdGVzIERNQSBidWZmZXJzKQorCiszLjQgSElEIG92ZXIgSVNIIENsaWVudAorTG9jYXRpb246IGRyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQKKworVGhlIElTSFRQIGNsaWVudCBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yOgorLSBlbnVtZXJhdGUgSElEIGRldmljZXMgdW5kZXIgRlcgSVNIIGNsaWVudAorLSBHZXQgUmVwb3J0IGRlc2NyaXB0b3IKKy0gUmVnaXN0ZXIgd2l0aCBISUQgY29yZSBhcyBhIExMIGRyaXZlcgorLSBQcm9jZXNzIEdldC9TZXQgZmVhdHVyZSByZXF1ZXN0CistIEdldCBpbnB1dCByZXBvcnRzCisKKzMuNSBISUQgU2Vuc29yIEh1YiBNRkQgYW5kIElJTyBzZW5zb3IgZHJpdmVycworCitUaGUgZnVuY3Rpb25hbGl0eSBpbiB0aGVzZSBkcml2ZXJzIGlzIHRoZSBzYW1lIGFzIGFuIGV4dGVybmFsIHNlbnNvciBodWIuCitSZWZlciB0bworRG9jdW1lbnRhdGlvbi9oaWQvaGlkLXNlbnNvci50eHQgZm9yIEhJRCBzZW5zb3IKK0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWlpbyBmb3IgSUlPIEFCSXMgdG8gdXNlciBzcGFjZQorCiszLjYgRW5kIHRvIEVuZCBISUQgdHJhbnNwb3J0IFNlcXVlbmNlIERpYWdyYW0KKworSElELUlTSC1DTE4JCQlJU0hUUAkJCUlQQwkJCQlIVworCXwJCQl8CQkJfAkJCQl8CisJfAkJCXwJCQl8LS0tLS1XQUtFIFVQLS0tLS0tLS0tLS0tLS0tLS0tPnwKKwl8CQkJfAkJCXwJCQkJfAorCXwJCQl8CQkJfC0tLS0tSE9TVCBSRUFEWS0tLS0tLS0tLS0tLS0tLT58CisJfAkJCXwJCQl8CQkJCXwKKwl8CQkJfAkJCXw8LS0tLU1OR19SRVNFVF9OT1RJRllfQUNLLS0tLS0gfAorCXwJCQl8CQkJfAkJCQl8CisJfAkJCXw8LS0tLUlTSFRQX1NUQVJULS0tLS0tIHwJCQkJfAorCXwJCQl8CQkJfAkJCQl8CisJfAkJCXw8LS0tLS0tLS0tLS0tLS0tLS1IT1NUX1NUQVJUX1JFU19DTUQtLS0tLS0tLS0tLS0tLS0tLS0tfAorCXwJCQl8CQkJfAkJCQl8CisJfAkJCXwtLS0tLS0tLS0tLS0tLS0tLS1RVUVSWV9TVUJTQ1JJQkVSLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAorCXwJCQl8CQkJfAkJCQl8CisJfAkJCXwtLS0tLS0tLS0tLS0tLS0tLS1IT1NUX0VOVU1fUkVRX0NNRC0tLS0tLS0tLS0tLS0tLS0tLS0+fAorCXwJCQl8CQkJfAkJCQl8CisJfAkJCXw8LS0tLS0tLS0tLS0tLS0tLS1IT1NUX0VOVU1fUkVTX0NNRC0tLS0tLS0tLS0tLS0tLS0tLS0tfAorCXwJCQl8CQkJfAkJCQl8CisJfAkJCXwtLS0tLS0tLS0tLS0tLS0tLS1IT1NUX0NMSUVOVF9QUk9QRVJUSUVTX1JFUV9DTUQtLS0tLS0+fAorCXwJCQl8CQkJfAkJCQl8CisJfAkJCXw8LS0tLS0tLS0tLS0tLS0tLS1IT1NUX0NMSUVOVF9QUk9QRVJUSUVTX1JFU19DTUQtLS0tLS0tfAorCXwJQ3JlYXRlIG5ldyBkZXZpY2Ugb24gaW4gaXNodHAgYnVzCXwJCQkJfAorCXwJCQl8CQkJfAkJCQl8CisJfAkJCXwtLS0tLS0tLS0tLS0tLS0tLS1IT1NUX0NMSUVOVF9QUk9QRVJUSUVTX1JFUV9DTUQtLS0tLS0+fAorCXwJCQl8CQkJfAkJCQl8CisJfAkJCXw8LS0tLS0tLS0tLS0tLS0tLS1IT1NUX0NMSUVOVF9QUk9QRVJUSUVTX1JFU19DTUQtLS0tLS0tfAorCXwJQ3JlYXRlIG5ldyBkZXZpY2Ugb24gaW4gaXNodHAgYnVzCXwJCQkJfAorCXwJCQl8CQkJfAkJCQl8CisJfAkJCXwtLVJlcGVhdCBIT1NUX0NMSUVOVF9QUk9QRVJUSUVTX1JFUV9DTUQtdGlsbCBsYXN0IG9uZS0tfAorCXwJCQl8CQkJfAkJCQl8CisgICAgIHByb2JlZCgpCisJfC0tLS1pc2h0cF9jbF9jb25uZWN0LS0+fC0tLS0tLS0tLS0tLS0tLS0tIENMSUVOVF9DT05ORUNUX1JFUV9DTUQtLS0tLS0tLS0tLS0tLT58CisJfAkJCXwJCQl8CQkJCXwKKwl8CQkJfDwtLS0tLS0tLS0tLS0tLS0tQ0xJRU5UX0NPTk5FQ1RfUkVTX0NNRC0tLS0tLS0tLS0tLS0tLS18CisJfAkJCXwJCQl8CQkJCXwKKwl8cmVnaXN0ZXIgZXZlbnQgY2FsbGJhY2t8CQkJfAkJCQl8CisJfAkJCXwJCQl8CQkJCXwKKwl8aXNodHBfY2xfc2VuZCgKKwlIT1NUSUZfRE1fRU5VTV9ERVZJQ0VTKSB8LS0tLS0tLS0tLWZpbGwgaXNodHBfbXNnX2hkciBzdHJ1Y3Qgd3JpdGUgdG8gSFctLS0tLSAgPnwKKwl8CQkJfAkJCXwJCQkJfAorCXwJCQl8CQkJfDwtLS0tLUlSUShJUENfUFJPVE9DT0xfSVNIVFAtLS18CisJfAkJCXwJCQl8CQkJCXwKKwl8PC0tRU5VTV9ERVZJQ0UgUlNQLS0tLS18CQkJfAkJCQl8CisJfAkJCXwJCQl8CQkJCXwKK2ZvciBlYWNoIGVudW1lcmF0ZWQgZGV2aWNlCisJfGlzaHRwX2NsX3NlbmQoCisJSE9TVElGX0dFVF9ISURfREVTQ1JJUFRPUiB8LS0tLS0tLS0tLWZpbGwgaXNodHBfbXNnX2hkciBzdHJ1Y3Qgd3JpdGUgdG8gSFctLS0gID58CisJfAkJCXwJCQl8CQkJCXwKKwkuLi5SZXNwb25zZQorCXwJCQl8CQkJfAkJCQl8Citmb3IgZWFjaCBlbnVtZXJhdGVkIGRldmljZQorCXxpc2h0cF9jbF9zZW5kKAorCUhPU1RJRl9HRVRfUkVQT1JUX0RFU0NSSVBUT1IgfC0tLS0tLS0tLS1maWxsIGlzaHRwX21zZ19oZHIgc3RydWN0IHdyaXRlIHRvIEhXLSA+fAorCXwJCQl8CQkJfAkJCQl8CisJfAkJCXwJCQl8CQkJCXwKKyBoaWRfYWxsb2NhdGVfZGV2aWNlCisJfAkJCXwJCQl8CQkJCXwKKyBoaWRfYWRkX2RldmljZQkJCXwJCQl8CQkJCXwKKwl8CQkJfAkJCXwJCQkJfAorCisKKzMuNyBJU0ggRGVidWdnaW5nCisKK1RvIGRlYnVnIElTSCwgZXZlbnQgdHJhY2luZyBtZWNoYW5pc20gaXMgdXNlZC4gVG8gZW5hYmxlIGRlYnVnIGxvZ3MKK2VjaG8gMSA+IC9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL2ludGVsX2lzaC9lbmFibGUKK2NhdCBzeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvdHJhY2UKKworMy44IElTSCBJSU8gc3lzZnMgRXhhbXBsZSBvbiBMZW5vdm8gdGhpbmtwYWQgWW9nYSAyNjAKKworcm9vdEBvdGNwbC1UaGlua1BhZC1Zb2dhLTI2MDp+IyB0cmVlIC1sIC9zeXMvYnVzL2lpby9kZXZpY2VzLworL3N5cy9idXMvaWlvL2RldmljZXMvCivilJzilIDilIAgaWlvOmRldmljZTAgLT4gLi4vLi4vLi4vZGV2aWNlcy8wMDQ0OjgwODY6MjJEOC4wMDAxL0hJRC1TRU5TT1ItMjAwMDczLjkuYXV0by9paW86ZGV2aWNlMAor4pSCwqDCoCDilJzilIDilIAgYnVmZmVyCivilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGVuYWJsZQor4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBsZW5ndGgKK+KUgsKgwqAg4pSCwqDCoCDilJTilIDilIAgd2F0ZXJtYXJrCisuLi4KK+KUgsKgwqAg4pSc4pSA4pSAIGluX2FjY2VsX2h5c3RlcmVzaXMKK+KUgsKgwqAg4pSc4pSA4pSAIGluX2FjY2VsX29mZnNldAor4pSCwqDCoCDilJzilIDilIAgaW5fYWNjZWxfc2FtcGxpbmdfZnJlcXVlbmN5CivilILCoMKgIOKUnOKUgOKUgCBpbl9hY2NlbF9zY2FsZQor4pSCwqDCoCDilJzilIDilIAgaW5fYWNjZWxfeF9yYXcKK+KUgsKgwqAg4pSc4pSA4pSAIGluX2FjY2VsX3lfcmF3CivilILCoMKgIOKUnOKUgOKUgCBpbl9hY2NlbF96X3Jhdwor4pSCwqDCoCDilJzilIDilIAgbmFtZQor4pSCwqDCoCDilJzilIDilIAgc2Nhbl9lbGVtZW50cwor4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hY2NlbF94X2VuCivilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FjY2VsX3hfaW5kZXgKK+KUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fYWNjZWxfeF90eXBlCivilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FjY2VsX3lfZW4KK+KUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fYWNjZWxfeV9pbmRleAor4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hY2NlbF95X3R5cGUKK+KUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fYWNjZWxfel9lbgor4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hY2NlbF96X2luZGV4CivilILCoMKgIOKUgsKgwqAg4pSU4pSA4pSAIGluX2FjY2VsX3pfdHlwZQorLi4uCivilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGRldmljZXMKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGJ1ZmZlcgor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBlbmFibGUKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgbGVuZ3RoCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSU4pSA4pSAIHdhdGVybWFyawor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgZGV2CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9pbnRlbnNpdHlfYm90aF9yYXcKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2ludGVuc2l0eV9oeXN0ZXJlc2lzCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9pbnRlbnNpdHlfb2Zmc2V0CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9pbnRlbnNpdHlfc2FtcGxpbmdfZnJlcXVlbmN5CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9pbnRlbnNpdHlfc2NhbGUKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIG5hbWUKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIHNjYW5fZWxlbWVudHMKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5faW50ZW5zaXR5X2JvdGhfZW4KK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5faW50ZW5zaXR5X2JvdGhfaW5kZXgKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJTilIDilIAgaW5faW50ZW5zaXR5X2JvdGhfdHlwZQor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgdHJpZ2dlcgor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUlOKUgOKUgCBjdXJyZW50X3RyaWdnZXIKKy4uLgor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgYnVmZmVyCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGVuYWJsZQor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBsZW5ndGgKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJTilIDilIAgd2F0ZXJtYXJrCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBkZXYKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX21hZ25faHlzdGVyZXNpcwor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fbWFnbl9vZmZzZXQKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX21hZ25fc2FtcGxpbmdfZnJlcXVlbmN5CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9tYWduX3NjYWxlCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9tYWduX3hfcmF3CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9tYWduX3lfcmF3CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9tYWduX3pfcmF3CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9yb3RfZnJvbV9ub3J0aF9tYWduZXRpY190aWx0X2NvbXBfcmF3CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9yb3RfaHlzdGVyZXNpcwor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fcm90X29mZnNldAor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fcm90X3NhbXBsaW5nX2ZyZXF1ZW5jeQor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fcm90X3NjYWxlCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBuYW1lCisuLi4KK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIHNjYW5fZWxlbWVudHMKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fbWFnbl94X2VuCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX21hZ25feF9pbmRleAor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9tYWduX3hfdHlwZQor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9tYWduX3lfZW4KK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fbWFnbl95X2luZGV4CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX21hZ25feV90eXBlCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX21hZ25fel9lbgor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9tYWduX3pfaW5kZXgKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fbWFnbl96X3R5cGUKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fcm90X2Zyb21fbm9ydGhfbWFnbmV0aWNfdGlsdF9jb21wX2VuCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX3JvdF9mcm9tX25vcnRoX21hZ25ldGljX3RpbHRfY29tcF9pbmRleAor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUlOKUgOKUgCBpbl9yb3RfZnJvbV9ub3J0aF9tYWduZXRpY190aWx0X2NvbXBfdHlwZQor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgdHJpZ2dlcgor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUlOKUgOKUgCBjdXJyZW50X3RyaWdnZXIKKy4uLgor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgYnVmZmVyCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGVuYWJsZQor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBsZW5ndGgKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJTilIDilIAgd2F0ZXJtYXJrCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBkZXYKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FuZ2x2ZWxfaHlzdGVyZXNpcwor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fYW5nbHZlbF9vZmZzZXQKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FuZ2x2ZWxfc2FtcGxpbmdfZnJlcXVlbmN5CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hbmdsdmVsX3NjYWxlCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hbmdsdmVsX3hfcmF3CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hbmdsdmVsX3lfcmF3CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hbmdsdmVsX3pfcmF3CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBuYW1lCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBzY2FuX2VsZW1lbnRzCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FuZ2x2ZWxfeF9lbgor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hbmdsdmVsX3hfaW5kZXgKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fYW5nbHZlbF94X3R5cGUKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fYW5nbHZlbF95X2VuCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FuZ2x2ZWxfeV9pbmRleAor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hbmdsdmVsX3lfdHlwZQor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hbmdsdmVsX3pfZW4KK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fYW5nbHZlbF96X2luZGV4CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSU4pSA4pSAIGluX2FuZ2x2ZWxfel90eXBlCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCB0cmlnZ2VyCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSU4pSA4pSAIGN1cnJlbnRfdHJpZ2dlcgorLi4uCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBidWZmZXIKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgZW5hYmxlCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGxlbmd0aAor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUlOKUgOKUgCB3YXRlcm1hcmsKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGRldgor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fYW5nbHZlbF9oeXN0ZXJlc2lzCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hbmdsdmVsX29mZnNldAor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fYW5nbHZlbF9zYW1wbGluZ19mcmVxdWVuY3kKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FuZ2x2ZWxfc2NhbGUKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FuZ2x2ZWxfeF9yYXcKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FuZ2x2ZWxfeV9yYXcKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FuZ2x2ZWxfel9yYXcKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIG5hbWUKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIHNjYW5fZWxlbWVudHMKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fYW5nbHZlbF94X2VuCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FuZ2x2ZWxfeF9pbmRleAor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hbmdsdmVsX3hfdHlwZQor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hbmdsdmVsX3lfZW4KK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJzilIDilIAgaW5fYW5nbHZlbF95X2luZGV4CivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FuZ2x2ZWxfeV90eXBlCivilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIGluX2FuZ2x2ZWxfel9lbgor4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUnOKUgOKUgCBpbl9hbmdsdmVsX3pfaW5kZXgKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJTilIDilIAgaW5fYW5nbHZlbF96X3R5cGUKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSc4pSA4pSAIHRyaWdnZXIKK+KUgsKgwqAg4pSCwqDCoCDilILCoMKgIOKUgsKgwqAg4pSCwqDCoCDilJTilIDilIAgY3VycmVudF90cmlnZ2VyCisuLi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHNpLnR4dCBiL0RvY3VtZW50YXRpb24vaHNpLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjNmNkNS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2hzaS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi1IU0kgLSBIaWdoLXNwZWVkIFN5bmNocm9ub3VzIFNlcmlhbCBJbnRlcmZhY2UKLQotMS4gSW50cm9kdWN0aW9uCi1+fn5+fn5+fn5+fn5+fn4KLQotSGlnaCBTcGVlZCBTeW5jcm9ub3VzIEludGVyZmFjZSAoSFNJKSBpcyBhIGZ1bGxkdXBsZXgsIGxvdyBsYXRlbmN5IHByb3RvY29sLAotdGhhdCBpcyBvcHRpbWl6ZWQgZm9yIGRpZS1sZXZlbCBpbnRlcmNvbm5lY3QgYmV0d2VlbiBhbiBBcHBsaWNhdGlvbiBQcm9jZXNzb3IKLWFuZCBhIEJhc2ViYW5kIGNoaXBzZXQuIEl0IGhhcyBiZWVuIHNwZWNpZmllZCBieSB0aGUgTUlQSSBhbGxpYW5jZSBpbiAyMDAzIGFuZAotaW1wbGVtZW50ZWQgYnkgbXVsdGlwbGUgdmVuZG9ycyBzaW5jZSB0aGVuLgotCi1UaGUgSFNJIGludGVyZmFjZSBzdXBwb3J0cyBmdWxsIGR1cGxleCBjb21tdW5pY2F0aW9uIG92ZXIgbXVsdGlwbGUgY2hhbm5lbHMKLSh0eXBpY2FsbHkgOCkgYW5kIGlzIGNhcGFibGUgb2YgcmVhY2hpbmcgc3BlZWRzIHVwIHRvIDIwMCBNYml0L3MuCi0KLVRoZSBzZXJpYWwgcHJvdG9jb2wgdXNlcyB0d28gc2lnbmFscywgREFUQSBhbmQgRkxBRyBhcyBjb21iaW5lZCBkYXRhIGFuZCBjbG9jawotc2lnbmFscyBhbmQgYW4gYWRkaXRpb25hbCBSRUFEWSBzaWduYWwgZm9yIGZsb3cgY29udHJvbC4gQW4gYWRkaXRpb25hbCBXQUtFCi1zaWduYWwgY2FuIGJlIHVzZWQgdG8gd2FrZXVwIHRoZSBjaGlwcyBmcm9tIHN0YW5kYnkgbW9kZXMuIFRoZSBzaWduYWxzIGFyZQotY29tbW9ubHkgcHJlZml4ZWQgYnkgQUMgZm9yIHNpZ25hbHMgZ29pbmcgZnJvbSB0aGUgYXBwbGljYXRpb24gZGllIHRvIHRoZQotY2VsbHVsYXIgZGllIGFuZCBDQSBmb3Igc2lnbmFscyBnb2luZyB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KLQotKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKwotfCAgQ2VsbHVsYXIgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBcHBsaWNhdGlvbiAgfAotfCAgICBEaWUgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgRGllICAgICAgfAotfCAgICAgICAgICAgIHwgLSAtIC0gLSAtIC0gQ0FXQUtFIC0gLSAtIC0gLSAtID58ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgVHwtLS0tLS0tLS0tLS0gQ0FEQVRBIC0tLS0tLS0tLS0tLT58UiAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgWHwtLS0tLS0tLS0tLS0gQ0FGTEFHIC0tLS0tLS0tLS0tLT58WCAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHw8LS0tLS0tLS0tLS0gQUNSRUFEWSAtLS0tLS0tLS0tLS18ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHw8IC0gLSAtIC0gLSAgQUNXQUtFIC0gLSAtIC0gLSAtIC18ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgUnw8LS0tLS0tLS0tLS0gQUNEQVRBIC0tLS0tLS0tLS0tLS18VCAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgWHw8LS0tLS0tLS0tLS0gQUNGTEFHIC0tLS0tLS0tLS0tLS18WCAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0gQ0FSRUFEWSAtLS0tLS0tLS0tLT58ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotKy0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKwotCi0yLiBIU0kgU3Vic3lzdGVtIGluIExpbnV4Ci1+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLUluIHRoZSBMaW51eCBrZXJuZWwgdGhlIGhzaSBzdWJzeXN0ZW0gaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBmb3IgSFNJIGRldmljZXMuCi1UaGUgaHNpIHN1YnN5c3RlbSBjb250YWlucyBkcml2ZXJzIGZvciBoc2kgY29udHJvbGxlcnMgaW5jbHVkaW5nIHN1cHBvcnQgZm9yCi1tdWx0aS1wb3J0IGNvbnRyb2xsZXJzIGFuZCBwcm92aWRlcyBhIGdlbmVyaWMgQVBJIGZvciB1c2luZyB0aGUgSFNJIHBvcnRzLgotCi1JdCBhbHNvIGNvbnRhaW5zIEhTSSBjbGllbnQgZHJpdmVycywgd2hpY2ggbWFrZSB1c2Ugb2YgdGhlIGdlbmVyaWMgQVBJIHRvCi1pbXBsZW1lbnQgYSBwcm90b2NvbCB1c2VkIG9uIHRoZSBIU0kgaW50ZXJmYWNlLiBUaGVzZSBjbGllbnQgZHJpdmVycyBjYW4KLXVzZSBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGNoYW5uZWxzLgotCi0zLiBoc2ktY2hhciBEZXZpY2UKLX5+fn5+fn5+fn5+fn5+fn5+fgotCi1FYWNoIHBvcnQgYXV0b21hdGljYWxseSByZWdpc3RlcnMgYSBnZW5lcmljIGNsaWVudCBkcml2ZXIgY2FsbGVkIGhzaV9jaGFyLAotd2hpY2ggcHJvdmlkZXMgYSBjaGFyZWN0ZXIgZGV2aWNlIGZvciB1c2Vyc3BhY2UgcmVwcmVzZW50aW5nIHRoZSBIU0kgcG9ydC4KLUl0IGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIHZpYSBIU0kgZnJvbSB1c2Vyc3BhY2UuIFVzZXJzcGFjZSBtYXkKLWNvbmZpZ3VyZSB0aGUgaHNpX2NoYXIgZGV2aWNlIHVzaW5nIHRoZSBmb2xsb3dpbmcgaW9jdGwgY29tbWFuZHM6Ci0KLSogSFNDX1JFU0VUOgotIC0gZmx1c2ggdGhlIEhTSSBwb3J0Ci0KLSogSFNDX1NFVF9QTQotIC0gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGNsaWVudC4KLQotKiBIU0NfU0VORF9CUkVBSwotIC0gc2VuZCBicmVhawotCi0qIEhTQ19TRVRfUlgKLSAtIHNldCBSWCBjb25maWd1cmF0aW9uCi0KLSogSFNDX0dFVF9SWAotIC0gZ2V0IFJYIGNvbmZpZ3VyYXRpb24KLQotKiBIU0NfU0VUX1RYCi0gLSBzZXQgVFggY29uZmlndXJhdGlvbgotCi0qIEhTQ19HRVRfVFgKLSAtIGdldCBUWCBjb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAKaW5kZXggOGNlNGFhMC4uZmU2OGUxOGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vYWR0NzQ3MAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkdDc0NzAKQEAgLTY1LDYgKzY1LDIzIEBACiB0ZW1wZXJhdHVyZSBzZW5zb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBQV00gY29udHJvbCBleGNlZWRzCiBwd20jX2F1dG9fcG9pbnQyX3RlbXAuCiAKK1RoZSBkcml2ZXIgYWxzbyBhbGxvd3MgY29udHJvbCBvZiB0aGUgUFdNIGZyZXF1ZW5jeToKKworKiBwd20xX2ZyZXEKKworVGhlIFBXTSBmcmVxdWVuY3kgaXMgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBvbmUgb2Y6CisKKyogMTEuMCBIegorKiAxNC43IEh6CisqIDIyLjEgSHoKKyogMjkuNCBIegorKiAzNS4zIEh6CisqIDQ0LjEgSHoKKyogNTguOCBIegorKiA4OC4yIEh6CisqIDEuNCBrSHoKKyogMjIuNSBrSHoKKwogTm90ZXMKIC0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vaHdtb24ta2VybmVsLWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2h3bW9uLWtlcm5lbC1hcGkudHh0CmluZGV4IDJlY2RiZmMuLmVmOWQ3NDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vaHdtb24ta2VybmVsLWFwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9od21vbi1rZXJuZWwtYXBpLnR4dApAQCAtMzQsNiArMzQsMTkgQEAKIAkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZHJ2ZGF0YSwKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3Vwcyk7CiAKK3N0cnVjdCBkZXZpY2UgKgoraHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZHJ2ZGF0YSwKKwkJCQljb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpOworCitzdHJ1Y3QgZGV2aWNlICoKK2Rldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgdm9pZCAqZHJ2ZGF0YSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gKmluZm8sCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzKTsKKwogdm9pZCBod21vbl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogdm9pZCBkZXZtX2h3bW9uX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKQEAgLTYwLDE1ICs3MywyMjkgQEAKIGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3Vwcy4gSG93ZXZlciwgaXQgaXMgZGV2aWNlIG1hbmFnZWQsIG1lYW5pbmcgdGhlCiBod21vbiBkZXZpY2UgZG9lcyBub3QgaGF2ZSB0byBiZSByZW1vdmVkIGV4cGxpY2l0bHkgYnkgdGhlIHJlbW92YWwgZnVuY3Rpb24uCiAKK2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gaXMgdGhlIG1vc3QgY29tcHJlaGVuc2l2ZSBhbmQgcHJlZmVycmVkIG1lYW5zCit0byByZWdpc3RlciBhIGhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlLiBJdCBjcmVhdGVzIHRoZSBzdGFuZGFyZCBzeXNmcworYXR0cmlidXRlcyBpbiB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZyBjb3JlLCBsZXR0aW5nIHRoZSBkcml2ZXIgZm9jdXMgb24gcmVhZGluZworZnJvbSBhbmQgd3JpdGluZyB0byB0aGUgY2hpcCBpbnN0ZWFkIG9mIGhhdmluZyB0byBib3RoZXIgd2l0aCBzeXNmcyBhdHRyaWJ1dGVzLgorSXRzIHBhcmFtZXRlcnMgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBiZWxvdy4KKworZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvIGlzIHNpbWlsYXIgdG8KK2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8uIEhvd2V2ZXIsIGl0IGlzIGRldmljZSBtYW5hZ2VkLCBtZWFuaW5nIHRoZQoraHdtb24gZGV2aWNlIGRvZXMgbm90IGhhdmUgdG8gYmUgcmVtb3ZlZCBleHBsaWNpdGx5IGJ5IHRoZSByZW1vdmFsIGZ1bmN0aW9uLgorCiBod21vbl9kZXZpY2VfdW5yZWdpc3RlciBkZXJlZ2lzdGVycyBhIHJlZ2lzdGVyZWQgaGFyZHdhcmUgbW9uaXRvcmluZyBkZXZpY2UuCiBUaGUgcGFyYW1ldGVyIG9mIHRoaXMgZnVuY3Rpb24gaXMgdGhlIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyZWQgaGFyZHdhcmUKIG1vbml0b3JpbmcgZGV2aWNlIHN0cnVjdHVyZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBkcml2ZXIKIHJlbW92ZSBmdW5jdGlvbiBpZiB0aGUgaGFyZHdhcmUgbW9uaXRvcmluZyBkZXZpY2Ugd2FzIHJlZ2lzdGVyZWQgd2l0aAotaHdtb25fZGV2aWNlX3JlZ2lzdGVyIG9yIHdpdGggaHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzLgoraHdtb25fZGV2aWNlX3JlZ2lzdGVyLCBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMsIG9yCitod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvLgogCiBkZXZtX2h3bW9uX2RldmljZV91bnJlZ2lzdGVyIGRvZXMgbm90IG5vcm1hbGx5IGhhdmUgdG8gYmUgY2FsbGVkLiBJdCBpcyBvbmx5CiBuZWVkZWQgZm9yIGVycm9yIGhhbmRsaW5nLCBhbmQgb25seSBuZWVkZWQgaWYgdGhlIGRyaXZlciBwcm9iZSBmYWlscyBhZnRlcgotdGhlIGNhbGwgdG8gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMuCit0aGUgY2FsbCB0byBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyBhbmQgaWYgdGhlIGF1dG9tYXRpYworKGRldmljZSBtYW5hZ2VkKSByZW1vdmFsIHdvdWxkIGJlIHRvbyBsYXRlLgorCitVc2luZyBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbygpIHJlZ2lzdGVycyBhIGhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlLgorVGhlIHBhcmFtZXRlcnMgdG8gdGhpcyBmdW5jdGlvbiBhcmUKKworc3RydWN0IGRldmljZSAqZGV2CVBvaW50ZXIgdG8gcGFyZW50IGRldmljZQorY29uc3QgY2hhciAqbmFtZQlEZXZpY2UgbmFtZQordm9pZCAqZHJ2ZGF0YQkJRHJpdmVyIHByaXZhdGUgZGF0YQorY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyAqaW5mbworCQkJUG9pbnRlciB0byBjaGlwIGRlc2NyaXB0aW9uLgorY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3VwcworCQkJTnVsbC10ZXJtaW5hdGVkIGxpc3Qgb2YgYWRkaXRpb25hbCBzeXNmcyBhdHRyaWJ1dGUKKwkJCWdyb3Vwcy4KKworVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZQorb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlLgorCitUaGUgaHdtb25fY2hpcF9pbmZvIHN0cnVjdHVyZSBsb29rcyBhcyBmb2xsb3dzLgorCitzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIHsKKwljb25zdCBzdHJ1Y3QgaHdtb25fb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqKmluZm87Cit9OworCitJdCBjb250YWlucyB0aGUgZm9sbG93aW5nIGZpZWxkczoKKworKiBvcHM6CVBvaW50ZXIgdG8gZGV2aWNlIG9wZXJhdGlvbnMuCisqIGluZm86IE5VTEwtdGVybWluYXRlZCBsaXN0IG9mIGRldmljZSBjaGFubmVsIGRlc2NyaXB0b3JzLgorCitUaGUgbGlzdCBvZiBod21vbiBvcGVyYXRpb25zIGlzIGRlZmluZWQgYXM6CisKK3N0cnVjdCBod21vbl9vcHMgeworCXVtb2RlX3QgKCppc192aXNpYmxlKShjb25zdCB2b2lkICosIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgICAgICB1MzIgYXR0ciwgaW50KTsKKwlpbnQgKCpyZWFkKShzdHJ1Y3QgZGV2aWNlICosIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICB1MzIgYXR0ciwgaW50LCBsb25nICopOworCWludCAoKndyaXRlKShzdHJ1Y3QgZGV2aWNlICosIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICAgdTMyIGF0dHIsIGludCwgbG9uZyk7Cit9OworCitJdCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucy4KKworKiBpc192aXNpYmxlOiBQb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBmaWxlIG1vZGUgZm9yIGVhY2ggc3VwcG9ydGVkCisgIGF0dHJpYnV0ZS4gVGhpcyBmdW5jdGlvbiBpcyBtYW5kYXRvcnkuCisKKyogcmVhZDogUG9pbnRlciB0byBhIGZ1bmN0aW9uIGZvciByZWFkaW5nIGEgdmFsdWUgZnJvbSB0aGUgY2hpcC4gVGhpcyBmdW5jdGlvbgorICBpcyBvcHRpb25hbCwgYnV0IG11c3QgYmUgcHJvdmlkZWQgaWYgYW55IHJlYWRhYmxlIGF0dHJpYnV0ZXMgZXhpc3QuCisKKyogd3JpdGU6IFBvaW50ZXIgdG8gYSBmdW5jdGlvbiBmb3Igd3JpdGluZyBhIHZhbHVlIHRvIHRoZSBjaGlwLiBUaGlzIGZ1bmN0aW9uIGlzCisgIG9wdGlvbmFsLCBidXQgbXVzdCBiZSBwcm92aWRlZCBpZiBhbnkgd3JpdGVhYmxlIGF0dHJpYnV0ZXMgZXhpc3QuCisKK0VhY2ggc2Vuc29yIGNoYW5uZWwgaXMgZGVzY3JpYmVkIHdpdGggc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbywgd2hpY2ggaXMKK2RlZmluZWQgYXMgZm9sbG93cy4KKworc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyB7CisJZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZTsKKwl1MzIgKmNvbmZpZzsKK307CisKK0l0IGNvbnRhaW5zIGZvbGxvd2luZyBmaWVsZHM6CisKKyogdHlwZTogVGhlIGhhcmR3YXJlIG1vbml0b3Jpbmcgc2Vuc29yIHR5cGUuCisgIFN1cHBvcnRlZCBzZW5zb3IgdHlwZXMgYXJlCisgICogaHdtb25fY2hpcAkJQSB2aXJ0dWFsIHNlbnNvciB0eXBlLCB1c2VkIHRvIGRlc2NyaWJlIGF0dHJpYnV0ZXMKKwkJCXdoaWNoIGFwcGx5IHRvIHRoZSBlbnRpcmUgY2hpcC4KKyAgKiBod21vbl90ZW1wCQlUZW1wZXJhdHVyZSBzZW5zb3IKKyAgKiBod21vbl9pbgkJVm9sdGFnZSBzZW5zb3IKKyAgKiBod21vbl9jdXJyCQlDdXJyZW50IHNlbnNvcgorICAqIGh3bW9uX3Bvd2VyCQlQb3dlciBzZW5zb3IKKyAgKiBod21vbl9lbmVyZ3kJRW5lcmd5IHNlbnNvcgorICAqIGh3bW9uX2h1bWlkaXR5CUh1bWlkaXR5IHNlbnNvcgorICAqIGh3bW9uX2ZhbgkJRmFuIHNwZWVkIHNlbnNvcgorICAqIGh3bW9uX3B3bQkJUFdNIGNvbnRyb2wKKworKiBjb25maWc6IFBvaW50ZXIgdG8gYSAwLXRlcm1pbmF0ZWQgbGlzdCBvZiBjb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgZWFjaAorICBzZW5zb3Igb2YgdGhlIGdpdmVuIHR5cGUuIEVhY2ggdmFsdWUgaXMgYSBjb21iaW5hdGlvbiBvZiBiaXQgdmFsdWVzCisgIGRlc2NyaWJpbmcgdGhlIGF0dHJpYnV0ZXMgc3VwcG9zZWQgYnkgYSBzaW5nbGUgc2Vuc29yLgorCitBcyBhbiBleGFtcGxlLCBoZXJlIGlzIHRoZSBjb21wbGV0ZSBkZXNjcmlwdGlvbiBmaWxlIGZvciBhIExNNzUgY29tcGF0aWJsZQorc2Vuc29yIGNoaXAuIFRoZSBjaGlwIGhhcyBhIHNpbmdsZSB0ZW1wZXJhdHVyZSBzZW5zb3IuIFRoZSBkcml2ZXIgd2FudHMgdG8KK3JlZ2lzdGVyIHdpdGggdGhlIHRoZXJtYWwgc3Vic3lzdGVtIChIV01PTl9DX1JFR0lTVEVSX1RaKSwgYW5kIGl0IHN1cHBvcnRzCit0aGUgdXBkYXRlX2ludGVydmFsIGF0dHJpYnV0ZSAoSFdNT05fQ19VUERBVEVfSU5URVJWQUwpLiBUaGUgY2hpcCBzdXBwb3J0cworcmVhZGluZyB0aGUgdGVtcGVyYXR1cmUgKEhXTU9OX1RfSU5QVVQpLCBpdCBoYXMgYSBtYXhpbXVtIHRlbXBlcmF0dXJlCityZWdpc3RlciAoSFdNT05fVF9NQVgpIGFzIHdlbGwgYXMgYSBtYXhpbXVtIHRlbXBlcmF0dXJlIGh5c3RlcmVzaXMgcmVnaXN0ZXIKKyhIV01PTl9UX01BWF9IWVNUKS4KKworc3RhdGljIGNvbnN0IHUzMiBsbTc1X2NoaXBfY29uZmlnW10gPSB7CisJSFdNT05fQ19SRUdJU1RFUl9UWiB8IEhXTU9OX0NfVVBEQVRFX0lOVEVSVkFMLAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtNzVfY2hpcCA9IHsKKwkudHlwZSA9IGh3bW9uX2NoaXAsCisJLmNvbmZpZyA9IGxtNzVfY2hpcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGxtNzVfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NQVggfCBIV01PTl9UX01BWF9IWVNULAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtNzVfdGVtcCA9IHsKKwkudHlwZSA9IGh3bW9uX3RlbXAsCisJLmNvbmZpZyA9IGxtNzVfdGVtcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqbG03NV9pbmZvW10gPSB7CisJJmxtNzVfY2hpcCwKKwkmbG03NV90ZW1wLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIGxtNzVfaHdtb25fb3BzID0geworCS5pc192aXNpYmxlID0gbG03NV9pc192aXNpYmxlLAorCS5yZWFkID0gbG03NV9yZWFkLAorCS53cml0ZSA9IGxtNzVfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyBsbTc1X2NoaXBfaW5mbyA9IHsKKwkub3BzID0gJmxtNzVfaHdtb25fb3BzLAorCS5pbmZvID0gbG03NV9pbmZvLAorfTsKKworQSBjb21wbGV0ZSBsaXN0IG9mIGJpdCB2YWx1ZXMgaW5kaWNhdGluZyBpbmRpdmlkdWFsIGF0dHJpYnV0ZSBzdXBwb3J0CitpcyBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvaHdtb24uaC4gRGVmaW5pdGlvbiBwcmVmaXhlcyBhcmUgYXMgZm9sbG93cy4KKworSFdNT05fQ194eHh4CUNoaXAgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX2NoaXAuCitIV01PTl9UX3h4eHgJVGVtcGVyYXR1cmUgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX3RlbXAuCitIV01PTl9JX3h4eHgJVm9sdGFnZSBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25faW4uCitIV01PTl9DX3h4eHgJQ3VycmVudCBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25fY3Vyci4KKwkJTm90aWNlIHRoZSBwcmVmaXggb3ZlcmxhcCB3aXRoIGNoaXAgYXR0cmlidXRlcy4KK0hXTU9OX1BfeHh4eAlQb3dlciBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25fcG93ZXIuCitIV01PTl9FX3h4eHgJRW5lcmd5IGF0dHJpYnV0ZXMsIGZvciB1c2Ugd2l0aCBod21vbl9lbmVyZ3kuCitIV01PTl9IX3h4eHgJSHVtaWRpdHkgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX2h1bWlkaXR5LgorSFdNT05fRl94eHh4CUZhbiBzcGVlZCBhdHRyaWJ1dGVzLCBmb3IgdXNlIHdpdGggaHdtb25fZmFuLgorSFdNT05fUFdNX3h4eHgJUFdNIGNvbnRyb2wgYXR0cmlidXRlcywgZm9yIHVzZSB3aXRoIGh3bW9uX3B3bS4KKworRHJpdmVyIGNhbGxiYWNrIGZ1bmN0aW9ucworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFYWNoIGRyaXZlciBwcm92aWRlcyBpc192aXNpYmxlLCByZWFkLCBhbmQgd3JpdGUgZnVuY3Rpb25zLiBQYXJhbWV0ZXJzCithbmQgcmV0dXJuIHZhbHVlcyBmb3IgdGhvc2UgZnVuY3Rpb25zIGFyZSBhcyBmb2xsb3dzLgorCit1bW9kZV90IGlzX3Zpc2libGVfZnVuYyhjb25zdCB2b2lkICpkYXRhLCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJdTMyIGF0dHIsIGludCBjaGFubmVsKQorCitQYXJhbWV0ZXJzOgorCWRhdGE6CVBvaW50ZXIgdG8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUuCisJdHlwZToJVGhlIHNlbnNvciB0eXBlLgorCWF0dHI6CUF0dHJpYnV0ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGF0dHJpYnV0ZS4KKwkJRm9yIGV4YW1wbGUsIHRoZSBhdHRyaWJ1dGUgdmFsdWUgZm9yIEhXTU9OX1RfSU5QVVQgd291bGQgYmUKKwkJaHdtb25fdGVtcF9pbnB1dC4gRm9yIGNvbXBsZXRlIG1hcHBpbmdzIG9mIGJpdCBmaWVsZHMgdG8KKwkJYXR0cmlidXRlIHZhbHVlcyBwbGVhc2Ugc2VlIGluY2x1ZGUvbGludXgvaHdtb24uaC4KKwljaGFubmVsOlRoZSBzZW5zb3IgY2hhbm5lbCBudW1iZXIuCisKK1JldHVybiB2YWx1ZToKKwlUaGUgZmlsZSBtb2RlIGZvciB0aGlzIGF0dHJpYnV0ZS4gVHlwaWNhbGx5LCB0aGlzIHdpbGwgYmUgMCAodGhlCisJYXR0cmlidXRlIHdpbGwgbm90IGJlIGNyZWF0ZWQpLCBTX0lSVUdPLCBvciAnU19JUlVHTyB8IFNfSVdVU1InLgorCitpbnQgcmVhZF9mdW5jKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKKworUGFyYW1ldGVyczoKKwlkZXY6CVBvaW50ZXIgdG8gdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlLgorCXR5cGU6CVRoZSBzZW5zb3IgdHlwZS4KKwlhdHRyOglBdHRyaWJ1dGUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBhdHRyaWJ1dGUuCisJCUZvciBleGFtcGxlLCB0aGUgYXR0cmlidXRlIHZhbHVlIGZvciBIV01PTl9UX0lOUFVUIHdvdWxkIGJlCisJCWh3bW9uX3RlbXBfaW5wdXQuIEZvciBjb21wbGV0ZSBtYXBwaW5ncyBwbGVhc2Ugc2VlCisJCWluY2x1ZGUvbGludXgvaHdtb24uaC4KKwljaGFubmVsOlRoZSBzZW5zb3IgY2hhbm5lbCBudW1iZXIuCisJdmFsOglQb2ludGVyIHRvIGF0dHJpYnV0ZSB2YWx1ZS4KKworUmV0dXJuIHZhbHVlOgorCTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb3RoZXJ3aXNlLgorCitpbnQgd3JpdGVfZnVuYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJICAgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCisKK1BhcmFtZXRlcnM6CisJZGV2OglQb2ludGVyIHRvIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZS4KKwl0eXBlOglUaGUgc2Vuc29yIHR5cGUuCisJYXR0cjoJQXR0cmlidXRlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgYXR0cmlidXRlLgorCQlGb3IgZXhhbXBsZSwgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgSFdNT05fVF9JTlBVVCB3b3VsZCBiZQorCQlod21vbl90ZW1wX2lucHV0LiBGb3IgY29tcGxldGUgbWFwcGluZ3MgcGxlYXNlIHNlZQorCQlpbmNsdWRlL2xpbnV4L2h3bW9uLmguCisJY2hhbm5lbDpUaGUgc2Vuc29yIGNoYW5uZWwgbnVtYmVyLgorCXZhbDoJVGhlIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBjaGlwLgorCitSZXR1cm4gdmFsdWU6CisJMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvdGhlcndpc2UuCisKKworRHJpdmVyLXByb3ZpZGVkIHN5c2ZzIGF0dHJpYnV0ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lmIHRoZSBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZSBpcyByZWdpc3RlcmVkIHdpdGgKK2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gb3IgZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvLAoraXQgaXMgbW9zdCBsaWtlbHkgbm90IG5lY2Vzc2FyeSB0byBwcm92aWRlIHN5c2ZzIGF0dHJpYnV0ZXMuIE9ubHkgbm9uLXN0YW5kYXJkCitzeXNmcyBhdHRyaWJ1dGVzIG5lZWQgdG8gYmUgcHJvdmlkZWQgd2hlbiBvbmUgb2YgdGhvc2UgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucworaXMgdXNlZC4KIAogVGhlIGhlYWRlciBmaWxlIGxpbnV4L2h3bW9uLXN5c2ZzLmggcHJvdmlkZXMgYSBudW1iZXIgb2YgdXNlZnVsIG1hY3JvcyB0bwogZGVjbGFyZSBhbmQgdXNlIGhhcmR3YXJlIG1vbml0b3Jpbmcgc3lzZnMgYXR0cmlidXRlcy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbWF4NjY1MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbWF4NjY1MAppbmRleCA1OGQ5NjQ0Li5kZmYxZDI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDY2NTAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9tYXg2NjUwCkBAIC0zNCw2ICszNCw3IEBACiBmYW40X2lucHV0CXJvCSIKIGZhbjFfdGFyZ2V0CXJ3CWRlc2lyZWQgZmFuIHNwZWVkIGluIFJQTSAoY2xvc2VkIGxvb3AgbW9kZSBvbmx5KQogcHdtMV9lbmFibGUJcncJcmVndWxhdG9yIG1vZGUsIDA9ZnVsbCBvbiwgMT1vcGVuIGxvb3AsIDI9Y2xvc2VkIGxvb3AKKwkJCTM9b2ZmCiBwd20xCQlydwlyZWxhdGl2ZSBzcGVlZCAoMC0yNTUpLCAyNTU9bWF4LiBzcGVlZC4KIAkJCVVzZWQgaW4gb3BlbiBsb29wIG1vZGUgb25seS4KIGZhbjFfZGl2CXJ3CXNldHMgdGhlIHNwZWVkIHJhbmdlIHRoZSBpbnB1dHMgY2FuIGhhbmRsZS4gTGVnYWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdWNkOTAwMCBiL0RvY3VtZW50YXRpb24vaHdtb24vdWNkOTAwMAppbmRleCA4MDVlMzNlLi4yNjJlNzEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3VjZDkwMDAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi91Y2Q5MDAwCkBAIC0yLDEyICsyLDEzIEBACiA9PT09PT09PT09PT09PT09PT09PT0KIAogU3VwcG9ydGVkIGNoaXBzOgotICAqIFRJIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTA5MCwgYW5kIFVDRDkwOTEwCi0gICAgUHJlZml4ZXM6ICd1Y2Q5MDEyMCcsICd1Y2Q5MDEyNCcsICd1Y2Q5MDkwJywgJ3VjZDkwOTEwJworICAqIFRJIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTAxNjAsIFVDRDkwOTAsIGFuZCBVQ0Q5MDkxMAorICAgIFByZWZpeGVzOiAndWNkOTAxMjAnLCAndWNkOTAxMjQnLCAndWNkOTAxNjAnLCAndWNkOTA5MCcsICd1Y2Q5MDkxMCcKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQogICAgIERhdGFzaGVldHM6CiAJaHR0cDovL2ZvY3VzLnRpLmNvbS9saXQvZHMvc3ltbGluay91Y2Q5MDEyMC5wZGYKIAlodHRwOi8vZm9jdXMudGkuY29tL2xpdC9kcy9zeW1saW5rL3VjZDkwMTI0LnBkZgorCWh0dHA6Ly9mb2N1cy50aS5jb20vbGl0L2RzL3N5bWxpbmsvdWNkOTAxNjAucGRmCiAJaHR0cDovL2ZvY3VzLnRpLmNvbS9saXQvZHMvc3ltbGluay91Y2Q5MDkwLnBkZgogCWh0dHA6Ly9mb2N1cy50aS5jb20vbGl0L2RzL3N5bWxpbmsvdWNkOTA5MTAucGRmCiAKQEAgLTMyLDYgKzMzLDEzIEBACiBmdW5jdGlvbmFsaXR5LiBVc2luZyB0aGVzZSBwaW5zLCB0aGUgVUNEOTAxMjQgb2ZmZXJzIHN1cHBvcnQgZm9yIGZhbiBjb250cm9sLAogbWFyZ2luaW5nLCBhbmQgZ2VuZXJhbC1wdXJwb3NlIFBXTSBmdW5jdGlvbnMuCiAKK1RoZSBVQ0Q5MDE2MCBpcyBhIDE2LXJhaWwgUE1CdXMvSTJDIGFkZHJlc3NhYmxlIHBvd2VyLXN1cHBseSBzZXF1ZW5jZXIgYW5kCittb25pdG9yLiBUaGUgZGV2aWNlIGludGVncmF0ZXMgYSAxMi1iaXQgQURDIGZvciBtb25pdG9yaW5nIHVwIHRvIDE2IHBvd2VyLXN1cHBseQordm9sdGFnZSBpbnB1dHMuIFR3ZW50eS1zaXggR1BJTyBwaW5zIGNhbiBiZSB1c2VkIGZvciBwb3dlciBzdXBwbHkgZW5hYmxlcywKK3Bvd2VyLW9uIHJlc2V0IHNpZ25hbHMsIGV4dGVybmFsIGludGVycnVwdHMsIGNhc2NhZGluZywgb3Igb3RoZXIgc3lzdGVtCitmdW5jdGlvbnMuIFR3ZWx2ZSBvZiB0aGVzZSBwaW5zIG9mZmVyIFBXTSBmdW5jdGlvbmFsaXR5LiBVc2luZyB0aGVzZSBwaW5zLCB0aGUKK1VDRDkwMTYwIG9mZmVycyBzdXBwb3J0IGZvciBtYXJnaW5pbmcsIGFuZCBnZW5lcmFsLXB1cnBvc2UgUFdNIGZ1bmN0aW9ucy4KKwogVGhlIFVDRDkwOTAgaXMgYSAxMC1yYWlsIFBNQnVzL0kyQyBhZGRyZXNzYWJsZSBwb3dlci1zdXBwbHkgc2VxdWVuY2VyIGFuZAogbW9uaXRvci4gVGhlIGRldmljZSBpbnRlZ3JhdGVzIGEgMTItYml0IEFEQyBmb3IgbW9uaXRvcmluZyB1cCB0byAxMCBwb3dlci1zdXBwbHkKIHZvbHRhZ2UgaW5wdXRzLiBUd2VudHktdGhyZWUgR1BJTyBwaW5zIGNhbiBiZSB1c2VkIGZvciBwb3dlciBzdXBwbHkgZW5hYmxlcywKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24veGdlbmUtaHdtb24gYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3hnZW5lLWh3bW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzUwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3hnZW5lLWh3bW9uCkBAIC0wLDAgKzEsMzAgQEAKK0tlcm5lbCBkcml2ZXIgeGdlbmUtaHdtb24KKz09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgKiBBUE0gWC1HZW5lIFNvQworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgYWRkcyBoYXJkd2FyZSB0ZW1wZXJhdHVyZSBhbmQgcG93ZXIgcmVhZGluZyBzdXBwb3J0IGZvcgorQVBNIFgtR2VuZSBTb0MgdXNpbmcgdGhlIG1haWxib3ggY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UuCitGb3IgZGV2aWNlIHRyZWUsIGl0IGlzIHRoZSBzdGFuZGFyZCBEVCBtYWlsYm94LgorRm9yIEFDUEksIGl0IGlzIHRoZSBQQ0MgbWFpbGJveC4KKworVGhlIGZvbGxvd2luZyBzZW5zb3JzIGFyZSBzdXBwb3J0ZWQKKworICAqIFRlbXBlcmF0dXJlCisgICAgLSBTb0Mgb24tZGllIHRlbXBlcmF0dXJlIGluIG1pbGxpLWRlZ3JlZSBDCisgICAgLSBBbGFybSB3aGVuIGhpZ2gvb3ZlciB0ZW1wZXJhdHVyZSBvY2N1cnMKKyAgKiBQb3dlcgorICAgIC0gQ1BVIHBvd2VyIGluIHVXCisgICAgLSBJTyBwb3dlciBpbiB1VworCitzeXNmcy1JbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLQorCit0ZW1wMF9pbnB1dCAtIFNvQyBvbi1kaWUgdGVtcGVyYXR1cmUgKG1pbGxpLWRlZ3JlZSBDKQordGVtcDBfY3JpdGljYWxfYWxhcm0gLSBBbiAxIHdvdWxkIGluZGljYXRlcyBvbi1kaWUgdGVtcGVyYXR1cmUgZXhjZWVkZWQgdGhyZXNob2xkCitwb3dlcjBfaW5wdXQgLSBDUFUgcG93ZXIgaW4gKHVXKQorcG93ZXIxX2lucHV0IC0gSU8gcG93ZXIgaW4gKHVXKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvc2xhdmUtaW50ZXJmYWNlIGIvRG9jdW1lbnRhdGlvbi9pMmMvc2xhdmUtaW50ZXJmYWNlCmluZGV4IDgwODA3YWQuLjdlMmEyMjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL3NsYXZlLWludGVyZmFjZQorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9zbGF2ZS1pbnRlcmZhY2UKQEAgLTE0NSw2ICsxNDUsMTEgQEAKIAogKiBDYXRjaCB0aGUgc2xhdmUgaW50ZXJydXB0cyBhbmQgc2VuZCBhcHByb3ByaWF0ZSBpMmNfc2xhdmVfZXZlbnRzIHRvIHRoZSBiYWNrZW5kLgogCitOb3RlIHRoYXQgbW9zdCBoYXJkd2FyZSBzdXBwb3J0cyBiZWluZyBtYXN0ZXIgX2FuZF8gc2xhdmUgb24gdGhlIHNhbWUgYnVzLiBTbywKK2lmIHlvdSBleHRlbmQgYSBidXMgZHJpdmVyLCBwbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIGRyaXZlciBzdXBwb3J0cyB0aGF0IGFzCit3ZWxsLiBJbiBhbG1vc3QgYWxsIGNhc2VzLCBzbGF2ZSBzdXBwb3J0IGRvZXMgbm90IG5lZWQgdG8gZGlzYWJsZSB0aGUgbWFzdGVyCitmdW5jdGlvbmFsaXR5LgorCiBDaGVjayB0aGUgaTJjLXJjYXIgZHJpdmVyIGFzIGFuIGV4YW1wbGUuCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9paW8vaWlvX2NvbmZpZ2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vaWlvL2lpb19jb25maWdmcy50eHQKaW5kZXggZjBhZGQzNS4uNGU1ZjEwMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9paW8vaWlvX2NvbmZpZ2ZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2lpby9paW9fY29uZmlnZnMudHh0CkBAIC04Miw4ICs4Miw4IEBACiAKIGUuZzoKIAotJCBta2RpciAvY29uZmlnL3RyaWdnZXJzL2hydGltZXIvaW5zdGFuY2UxCi0kIHJtZGlyIC9jb25maWcvdHJpZ2dlcnMvaHJ0aW1lci9pbnN0YW5jZTEKKyQgbWtkaXIgL2NvbmZpZy9paW8vdHJpZ2dlcnMvaHJ0aW1lci9pbnN0YW5jZTEKKyQgcm1kaXIgL2NvbmZpZy9paW8vdHJpZ2dlcnMvaHJ0aW1lci9pbnN0YW5jZTEKIAogRWFjaCB0cmlnZ2VyIGNhbiBoYXZlIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgc3BlY2lmaWMgdG8gdGhlIHRyaWdnZXIgdHlwZS4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbmRleC5yc3QgYi9Eb2N1bWVudGF0aW9uL2luZGV4LnJzdAppbmRleCBlMGZjNzI5Li5kOWNjYjk0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2luZGV4LnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL2luZGV4LnJzdApAQCAtNiwyMiArNiwxOSBAQAogV2VsY29tZSB0byBUaGUgTGludXggS2VybmVsJ3MgZG9jdW1lbnRhdGlvbiEKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLU5vdGhpbmcgZm9yIHlvdSB0byBzZWUgaGVyZSAqeWV0Ki4gUGxlYXNlIG1vdmUgYWxvbmcuCi0KIENvbnRlbnRzOgogCiAuLiB0b2N0cmVlOjoKICAgIDptYXhkZXB0aDogMgogCiAgICBrZXJuZWwtZG9jdW1lbnRhdGlvbgotICAgbWVkaWEvbWVkaWFfdWFwaQotICAgbWVkaWEvbWVkaWFfa2FwaQotICAgbWVkaWEvZHZiLWRyaXZlcnMvaW5kZXgKLSAgIG1lZGlhL3Y0bC1kcml2ZXJzL2luZGV4CisgICBkZXZlbG9wbWVudC1wcm9jZXNzL2luZGV4CisgICBkZXYtdG9vbHMvdG9vbHMKKyAgIGRyaXZlci1hcGkvaW5kZXgKKyAgIG1lZGlhL2luZGV4CiAgICBncHUvaW5kZXgKIAogSW5kaWNlcyBhbmQgdGFibGVzCiA9PT09PT09PT09PT09PT09PT0KIAogKiA6cmVmOmBnZW5pbmRleGAKLSogOnJlZjpgc2VhcmNoYApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3N5c2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vaW5maW5pYmFuZC9zeXNmcy50eHQKaW5kZXggNDViY2FmZS4uNzc1NzBkMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pbmZpbmliYW5kL3N5c2ZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2luZmluaWJhbmQvc3lzZnMudHh0CkBAIC04OSw2ICs4OSwzNiBAQAogICAgbmN0eHRzIC0gbnVtYmVyIG9mIGFsbG93ZWQgY29udGV4dHMgKFBTTTIpCiAgICBjaGlwX3Jlc2V0IC0gZGlhZ25vc3RpYyAocm9vdCBvbmx5KQogICAgYm9hcmR2ZXJzaW9uIC0gYm9hcmQgdmVyc2lvbgorCisgICBzZG1hPE4+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+am1zZXlhcy9saW51eC9rZXJuZWwvaGFja2Vycy1kb2NzLmh0bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLWRvY3VtZW50YXRpb24ucnN0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jdW1lbnRhdGlvbi5yc3QKaW5kZXggMzkxZGVjYy4uMTBjYzdkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jdW1lbnRhdGlvbi5yc3QKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jdW1lbnRhdGlvbi5yc3QKQEAgLTEwNyw2ICsxMDcsMzUgQEAKICAgdGhlIG9yZGVyIGFzIGVuY291bnRlcmVkLiIpLCBoYXZpbmcgdGhlIGhpZ2hlciBsZXZlbHMgdGhlIHNhbWUgb3ZlcmFsbCBtYWtlcwogICBpdCBlYXNpZXIgdG8gZm9sbG93IHRoZSBkb2N1bWVudHMuCiAKKwordGhlIEMgZG9tYWluCistLS0tLS0tLS0tLS0KKworVGhlIGBTcGhpbnggQyBEb21haW5gXyAobmFtZSBjKSBpcyBzdWl0ZWQgZm9yIGRvY3VtZW50YXRpb24gb2YgQyBBUEkuIEUuZy4gYQorZnVuY3Rpb24gcHJvdG90eXBlOgorCisuLiBjb2RlLWJsb2NrOjogcnN0CisKKyAgICAuLiBjOmZ1bmN0aW9uOjogaW50IGlvY3RsKCBpbnQgZmQsIGludCByZXF1ZXN0ICkKKworVGhlIEMgZG9tYWluIG9mIHRoZSBrZXJuZWwtZG9jIGhhcyBzb21lIGFkZGl0aW9uYWwgZmVhdHVyZXMuIEUuZy4geW91IGNhbgorKnJlbmFtZSogdGhlIHJlZmVyZW5jZSBuYW1lIG9mIGEgZnVuY3Rpb24gd2l0aCBhIGNvbW1vbiBuYW1lIGxpa2UgYGBvcGVuYGAgb3IKK2BgaW9jdGxgYDoKKworLi4gY29kZS1ibG9jazo6IHJzdAorCisgICAgIC4uIGM6ZnVuY3Rpb246OiBpbnQgaW9jdGwoIGludCBmZCwgaW50IHJlcXVlc3QgKQorICAgICAgICA6bmFtZTogVklESU9DX0xPR19TVEFUVVMKKworVGhlIGZ1bmMtbmFtZSAoZS5nLiBpb2N0bCkgcmVtYWlucyBpbiB0aGUgb3V0cHV0IGJ1dCB0aGUgcmVmLW5hbWUgY2hhbmdlZCBmcm9tCitgYGlvY3RsYGAgdG8gYGBWSURJT0NfTE9HX1NUQVRVU2BgLiBUaGUgaW5kZXggZW50cnkgZm9yIHRoaXMgZnVuY3Rpb24gaXMgYWxzbworY2hhbmdlZCB0byBgYFZJRElPQ19MT0dfU1RBVFVTYGAgYW5kIHRoZSBmdW5jdGlvbiBjYW4gbm93IHJlZmVyZW5jZWQgYnk6CisKKy4uIGNvZGUtYmxvY2s6OiByc3QKKworICAgICA6YzpmdW5jOmBWSURJT0NfTE9HX1NUQVRVU2AKKworCiBsaXN0IHRhYmxlcwogLS0tLS0tLS0tLS0KIApAQCAtMjY1LDYgKzI5NCw4IEBACiBgYHNjcmlwdHMva2VybmVsLWRvY2BgIHNjcmlwdCB0byBleHRyYWN0IHRoZSBkb2N1bWVudGF0aW9uIGNvbW1lbnRzIGZyb20gdGhlCiBzb3VyY2UuCiAKKy4uIF9rZXJuZWxfZG9jOgorCiBXcml0aW5nIGtlcm5lbC1kb2MgY29tbWVudHMKID09PT09PT09PT09PT09PT09PT09PT09PT09PQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IGE0ZjRkNjkuLmVjOGQ4MTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC00NjAsNiArNDYwLDE1IEBACiAJCQlkcml2ZXIgd2lsbCBwcmludCBBQ1BJIHRhYmxlcyBmb3IgQU1EIElPTU1VIGR1cmluZwogCQkJSU9NTVUgaW5pdGlhbGl6YXRpb24uCiAKKwlhbWRfaW9tbXVfaW50cj0JW0hXLFg4Ni02NF0KKwkJCVNwZWNpZmllcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBBTUQgSU9NTVUgaW50ZXJydXB0CisJCQlyZW1hcHBpbmcgbW9kZXM6CisJCQlsZWdhY3kgICAgIC0gVXNlIGxlZ2FjeSBpbnRlcnJ1cHQgcmVtYXBwaW5nIG1vZGUuCisJCQl2YXBpYyAgICAgIC0gVXNlIHZpcnR1YWwgQVBJQyBtb2RlLCB3aGljaCBhbGxvd3MgSU9NTVUKKwkJCSAgICAgICAgICAgICB0byBpbmplY3QgaW50ZXJydXB0cyBkaXJlY3RseSBpbnRvIGd1ZXN0LgorCQkJICAgICAgICAgICAgIFRoaXMgbW9kZSByZXF1aXJlcyBrdm0tYW1kLmF2aWM9MS4KKwkJCSAgICAgICAgICAgICAoRGVmYXVsdCB3aGVuIElPTU1VIEhXIHN1cHBvcnQgaXMgcHJlc2VudC4pCisKIAlhbWlqb3kubWFwPQlbSFcsSk9ZXSBBbWlnYSBqb3lzdGljayBzdXBwb3J0CiAJCQlNYXAgb2YgZGV2aWNlcyBhdHRhY2hlZCB0byBKT1kwREFUIGFuZCBKT1kxREFUCiAJCQlGb3JtYXQ6IDxhPiw8Yj4KQEAgLTY5OCw2ICs3MDcsMTUgQEAKIAkJCWxvb3BzIGNhbiBiZSBkZWJ1Z2dlZCBtb3JlIGVmZmVjdGl2ZWx5IG9uIHByb2R1Y3Rpb24KIAkJCXN5c3RlbXMuCiAKKwljbG9ja3NvdXJjZS5hcm1fYXJjaF90aW1lci5mc2wtYTAwODU4NT0KKwkJCVtBUk02NF0KKwkJCUZvcm1hdDogPGJvb2w+CisJCQlFbmFibGUvZGlzYWJsZSB0aGUgd29ya2Fyb3VuZCBvZiBGcmVlc2NhbGUvTlhQCisJCQllcnJhdHVtIEEtMDA4NTg1LiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBLVk0KKwkJCWd1ZXN0cywgaWYgdGhlIGd1ZXN0IGRldmljZSB0cmVlIGRvZXNuJ3Qgc2hvdyB0aGUKKwkJCWVycmF0dW0uICBJZiB1bnNwZWNpZmllZCwgdGhlIHdvcmthcm91bmQgaXMKKwkJCWVuYWJsZWQgYmFzZWQgb24gdGhlIGRldmljZSB0cmVlLgorCiAJY2xlYXJjcHVpZD1CSVROVU0gW1g4Nl0KIAkJCURpc2FibGUgQ1BVSUQgZmVhdHVyZSBYIGZvciB0aGUga2VybmVsLiBTZWUKIAkJCWFyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmVzLmggZm9yIHRoZSB2YWxpZCBiaXQKQEAgLTEwNDUsMTEgKzEwNjMsMTIgQEAKIAkJCWRldGVybWluZWQgYnkgdGhlIHN0ZG91dC1wYXRoIHByb3BlcnR5IGluIGRldmljZQogCQkJdHJlZSdzIGNob3NlbiBub2RlLgogCi0JCWNkbnMsPGFkZHI+Ci0JCQlTdGFydCBhbiBlYXJseSwgcG9sbGVkLW1vZGUgY29uc29sZSBvbiBhIGNhZGVuY2Ugc2VyaWFsCi0JCQlwb3J0IGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gVGhlIGNhZGVuY2Ugc2VyaWFsIHBvcnQKLQkJCW11c3QgYWxyZWFkeSBiZSBzZXR1cCBhbmQgY29uZmlndXJlZC4gT3B0aW9ucyBhcmUgbm90Ci0JCQl5ZXQgc3VwcG9ydGVkLgorCQljZG5zLDxhZGRyPlssb3B0aW9uc10KKwkJCVN0YXJ0IGFuIGVhcmx5LCBwb2xsZWQtbW9kZSBjb25zb2xlIG9uIGEgQ2FkZW5jZQorCQkJKHh1YXJ0cHMpIHNlcmlhbCBwb3J0IGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4gT25seQorCQkJc3VwcG9ydGVkIG9wdGlvbiBpcyBiYXVkIHJhdGUuIElmIGJhdWQgcmF0ZSBpcyBub3QKKwkJCXNwZWNpZmllZCwgdGhlIHNlcmlhbCBwb3J0IG11c3QgYWxyZWFkeSBiZSBzZXR1cCBhbmQKKwkJCWNvbmZpZ3VyZWQuCiAKIAkJdWFydFs4MjUwXSxpbyw8YWRkcj5bLG9wdGlvbnNdCiAJCXVhcnRbODI1MF0sbW1pbyw8YWRkcj5bLG9wdGlvbnNdCkBAIC0xMzY0LDYgKzEzODMsMTAgQEAKIAkJCUZvcm1hdDogPHVuc2lnbmVkIGludD4gc3VjaCB0aGF0IChyeHNpemUgJiB+MHgxZmZmYzApID09IDAuCiAJCQlEZWZhdWx0OiAxMDI0CiAKKwlncGlvLW1vY2t1cC5ncGlvX21vY2t1cF9yYW5nZXMKKwkJCVtIV10gU2V0cyB0aGUgcmFuZ2VzIG9mIGdwaW9jaGlwIG9mIGZvciB0aGlzIGRldmljZS4KKwkJCUZvcm1hdDogPHN0YXJ0MT4sPGVuZDE+LDxzdGFydDI+LDxlbmQyPi4uLgorCiAJaGFyZGxvY2t1cF9hbGxfY3B1X2JhY2t0cmFjZT0KIAkJCVtLTkxdIFNob3VsZCB0aGUgaGFyZC1sb2NrdXAgZGV0ZWN0b3IgZ2VuZXJhdGUKIAkJCWJhY2t0cmFjZXMgb24gYWxsIGNwdXMuCkBAIC0xNjg4LDcgKzE3MTEsNyBAQAogCiAJaW50ZWxfaWRsZS5tYXhfY3N0YXRlPQlbS05MLEhXLEFDUEksWDg2XQogCQkJMAlkaXNhYmxlcyBpbnRlbF9pZGxlIGFuZCBmYWxsIGJhY2sgb24gYWNwaV9pZGxlLgotCQkJMSB0byA2CXNwZWNpZnkgbWF4aW11bSBkZXB0aCBvZiBDLXN0YXRlLgorCQkJMSB0byA5CXNwZWNpZnkgbWF4aW11bSBkZXB0aCBvZiBDLXN0YXRlLgogCiAJaW50ZWxfcHN0YXRlPSAgW1g4Nl0KIAkJICAgICAgIGRpc2FibGUKQEAgLTIxNjEsMTAgKzIxODQsMTMgQEAKIAkJCXRoYW4gb3IgZXF1YWwgdG8gdGhpcyBwaHlzaWNhbCBhZGRyZXNzIGlzIGlnbm9yZWQuCiAKIAltYXhjcHVzPQlbU01QXSBNYXhpbXVtIG51bWJlciBvZiBwcm9jZXNzb3JzIHRoYXQJYW4gU01QIGtlcm5lbAotCQkJc2hvdWxkIG1ha2UgdXNlIG9mLiAgbWF4Y3B1cz1uIDogbiA+PSAwIGxpbWl0cyB0aGUKLQkJCWtlcm5lbCB0byB1c2luZyAnbicgcHJvY2Vzc29ycy4gIG49MCBpcyBhIHNwZWNpYWwgY2FzZSwKLQkJCWl0IGlzIGVxdWl2YWxlbnQgdG8gIm5vc21wIiwgd2hpY2ggYWxzbyBkaXNhYmxlcwotCQkJdGhlIElPIEFQSUMuCisJCQl3aWxsIGJyaW5nIHVwIGR1cmluZyBib290dXAuICBtYXhjcHVzPW4gOiBuID49IDAgbGltaXRzCisJCQl0aGUga2VybmVsIHRvIGJyaW5nIHVwICduJyBwcm9jZXNzb3JzLiBTdXJlbHkgYWZ0ZXIKKwkJCWJvb3R1cCB5b3UgY2FuIGJyaW5nIHVwIHRoZSBvdGhlciBwbHVnZ2VkIGNwdSBieSBleGVjdXRpbmcKKwkJCSJlY2hvIDEgPiAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHVYL29ubGluZSIuIFNvIG1heGNwdXMKKwkJCW9ubHkgdGFrZXMgZWZmZWN0IGR1cmluZyBzeXN0ZW0gYm9vdHVwLgorCQkJV2hpbGUgbj0wIGlzIGEgc3BlY2lhbCBjYXNlLCBpdCBpcyBlcXVpdmFsZW50IHRvICJub3NtcCIsCisJCQl3aGljaCBhbHNvIGRpc2FibGVzIHRoZSBJTyBBUElDLgogCiAJbWF4X2xvb3A9CVtMT09QXSBUaGUgbnVtYmVyIG9mIGxvb3AgYmxvY2sgZGV2aWNlcyB0aGF0IGdldAogCShsb29wLm1heF9sb29wKQl1bmNvbmRpdGlvbmFsbHkgcHJlLWNyZWF0ZWQgYXQgaW5pdCB0aW1lLiBUaGUgZGVmYXVsdApAQCAtMjU3MSw4ICsyNTk3LDYgQEAKIAogCW5vZGVsYXlhY2N0CVtLTkxdIERpc2FibGUgcGVyLXRhc2sgZGVsYXkgYWNjb3VudGluZwogCi0Jbm9kaXNjb25uZWN0CVtIVyxTQ1NJLE02OEtdIERpc2FibGVzIFNDU0kgZGlzY29ubmVjdHMuCi0KIAlub2RzcAkJW1NIXSBEaXNhYmxlIGhhcmR3YXJlIERTUCBhdCBib290IHRpbWUuCiAKIAlub2VmaQkJRGlzYWJsZSBFRkkgcnVudGltZSBzZXJ2aWNlcyBzdXBwb3J0LgpAQCAtMjc3Myw5ICsyNzk3LDEyIEBACiAKIAlucl9jcHVzPQlbU01QXSBNYXhpbXVtIG51bWJlciBvZiBwcm9jZXNzb3JzIHRoYXQJYW4gU01QIGtlcm5lbAogCQkJY291bGQgc3VwcG9ydC4gIG5yX2NwdXM9biA6IG4gPj0gMSBsaW1pdHMgdGhlIGtlcm5lbCB0bwotCQkJc3VwcG9ydGluZyAnbicgcHJvY2Vzc29ycy4gTGF0ZXIgaW4gcnVudGltZSB5b3UgY2FuIG5vdAotCQkJdXNlIGhvdHBsdWcgY3B1IGZlYXR1cmUgdG8gcHV0IG1vcmUgY3B1IGJhY2sgdG8gb25saW5lLgotCQkJanVzdCBsaWtlIHlvdSBjb21waWxlIHRoZSBrZXJuZWwgTlJfQ1BVUz1uCisJCQlzdXBwb3J0ICduJyBwcm9jZXNzb3JzLiBJdCBjb3VsZCBiZSBsYXJnZXIgdGhhbiB0aGUKKwkJCW51bWJlciBvZiBhbHJlYWR5IHBsdWdnZWQgQ1BVIGR1cmluZyBib290dXAsIGxhdGVyIGluCisJCQlydW50aW1lIHlvdSBjYW4gcGh5c2ljYWxseSBhZGQgZXh0cmEgY3B1IHVudGlsIGl0IHJlYWNoZXMKKwkJCW4uIFNvIGR1cmluZyBib290IHVwIHNvbWUgYm9vdCB0aW1lIG1lbW9yeSBmb3IgcGVyLWNwdQorCQkJdmFyaWFibGVzIG5lZWQgYmUgcHJlLWFsbG9jYXRlZCBmb3IgbGF0ZXIgcGh5c2ljYWwgY3B1CisJCQlob3QgcGx1Z2dpbmcuCiAKIAlucl91YXJ0cz0JW1NFUklBTF0gbWF4aW11bSBudW1iZXIgb2YgVUFSVHMgdG8gYmUgcmVnaXN0ZXJlZC4KIApAQCAtNDIzOCw2ICs0MjY1LDggQEAKIAkJCQl1ID0gSUdOT1JFX1VBUyAoZG9uJ3QgYmluZCB0byB0aGUgdWFzIGRyaXZlcik7CiAJCQkJdyA9IE5PX1dQX0RFVEVDVCAoZG9uJ3QgdGVzdCB3aGV0aGVyIHRoZQogCQkJCQltZWRpdW0gaXMgd3JpdGUtcHJvdGVjdGVkKS4KKwkJCQl5ID0gQUxXQVlTX1NZTkMgKGlzc3VlIGEgU1lOQ0hST05JWkVfQ0FDSEUKKwkJCQkJZXZlbiBpZiB0aGUgZGV2aWNlIGNsYWltcyBubyBjYWNoZSkKIAkJCUV4YW1wbGU6IHF1aXJrcz0wNDE5OmFhZjU6cmwsMDQyMTowNDMzOnJjCiAKIAl1c2VyX2RlYnVnPQlbS05MLEFSTV0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va21lbWNoZWNrLnR4dCBiL0RvY3VtZW50YXRpb24va21lbWNoZWNrLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhYWU4NS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2ttZW1jaGVjay50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw3NTQgKzAsMCBAQAotR0VUVElORyBTVEFSVEVEIFdJVEggS01FTUNIRUNLCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVmVnYXJkIE5vc3N1bSA8dmVnYXJkbm9AaWZpLnVpby5ubz4KLQotCi1Db250ZW50cwotPT09PT09PT0KLTAuIEludHJvZHVjdGlvbgotMS4gRG93bmxvYWRpbmcKLTIuIENvbmZpZ3VyaW5nIGFuZCBjb21waWxpbmcKLTMuIEhvdyB0byB1c2UKLTMuMS4gQm9vdGluZwotMy4yLiBSdW4tdGltZSBlbmFibGUvZGlzYWJsZQotMy4zLiBEZWJ1Z2dpbmcKLTMuNC4gQW5ub3RhdGluZyBmYWxzZSBwb3NpdGl2ZXMKLTQuIFJlcG9ydGluZyBlcnJvcnMKLTUuIFRlY2huaWNhbCBkZXNjcmlwdGlvbgotCi0KLTAuIEludHJvZHVjdGlvbgotPT09PT09PT09PT09PT09Ci0KLWttZW1jaGVjayBpcyBhIGRlYnVnZ2luZyBmZWF0dXJlIGZvciB0aGUgTGludXggS2VybmVsLiBNb3JlIHNwZWNpZmljYWxseSwgaXQKLWlzIGEgZHluYW1pYyBjaGVja2VyIHRoYXQgZGV0ZWN0cyBhbmQgd2FybnMgYWJvdXQgc29tZSB1c2VzIG9mIHVuaW5pdGlhbGl6ZWQKLW1lbW9yeS4KLQotVXNlcnNwYWNlIHByb2dyYW1tZXJzIG1pZ2h0IGJlIGZhbWlsaWFyIHdpdGggVmFsZ3JpbmQncyBtZW1jaGVjay4gVGhlIG1haW4KLWRpZmZlcmVuY2UgYmV0d2VlbiBtZW1jaGVjayBhbmQga21lbWNoZWNrIGlzIHRoYXQgbWVtY2hlY2sgd29ya3MgZm9yIHVzZXJzcGFjZQotcHJvZ3JhbXMgb25seSwgYW5kIGttZW1jaGVjayB3b3JrcyBmb3IgdGhlIGtlcm5lbCBvbmx5LiBUaGUgaW1wbGVtZW50YXRpb25zCi1hcmUgb2YgY291cnNlIHZhc3RseSBkaWZmZXJlbnQuIEJlY2F1c2Ugb2YgdGhpcywga21lbWNoZWNrIGlzIG5vdCBhcyBhY2N1cmF0ZQotYXMgbWVtY2hlY2ssIGJ1dCBpdCB0dXJucyBvdXQgdG8gYmUgZ29vZCBlbm91Z2ggaW4gcHJhY3RpY2UgdG8gZGlzY292ZXIgcmVhbAotcHJvZ3JhbW1lciBlcnJvcnMgdGhhdCB0aGUgY29tcGlsZXIgaXMgbm90IGFibGUgdG8gZmluZCB0aHJvdWdoIHN0YXRpYwotYW5hbHlzaXMuCi0KLUVuYWJsaW5nIGttZW1jaGVjayBvbiBhIGtlcm5lbCB3aWxsIHByb2JhYmx5IHNsb3cgaXQgZG93biB0byB0aGUgZXh0ZW50IHRoYXQKLXRoZSBtYWNoaW5lIHdpbGwgbm90IGJlIHVzYWJsZSBmb3Igbm9ybWFsIHdvcmtsb2FkcyBzdWNoIGFzIGUuZy4gYW4KLWludGVyYWN0aXZlIGRlc2t0b3AuIGttZW1jaGVjayB3aWxsIGFsc28gY2F1c2UgdGhlIGtlcm5lbCB0byB1c2UgYWJvdXQgdHdpY2UKLWFzIG11Y2ggbWVtb3J5IGFzIG5vcm1hbC4gRm9yIHRoaXMgcmVhc29uLCBrbWVtY2hlY2sgaXMgc3RyaWN0bHkgYSBkZWJ1Z2dpbmcKLWZlYXR1cmUuCi0KLQotMS4gRG93bmxvYWRpbmcKLT09PT09PT09PT09PT09Ci0KLUFzIG9mIHZlcnNpb24gMi42LjMxLXJjMSwga21lbWNoZWNrIGlzIGluY2x1ZGVkIGluIHRoZSBtYWlubGluZSBrZXJuZWwuCi0KLQotMi4gQ29uZmlndXJpbmcgYW5kIGNvbXBpbGluZwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1rbWVtY2hlY2sgb25seSB3b3JrcyBmb3IgdGhlIHg4NiAoYm90aCAzMi0gYW5kIDY0LWJpdCkgcGxhdGZvcm0uIEEgbnVtYmVyIG9mCi1jb25maWd1cmF0aW9uIHZhcmlhYmxlcyBtdXN0IGhhdmUgc3BlY2lmaWMgc2V0dGluZ3MgaW4gb3JkZXIgZm9yIHRoZSBrbWVtY2hlY2sKLW1lbnUgdG8gZXZlbiBhcHBlYXIgaW4gIm1lbnVjb25maWciLiBUaGVzZSBhcmU6Ci0KLSAgbyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9bgotCi0JVGhpcyBvcHRpb24gaXMgbG9jYXRlZCB1bmRlciAiR2VuZXJhbCBzZXR1cCIgLyAiT3B0aW1pemUgZm9yIHNpemUiLgotCi0JV2l0aG91dCB0aGlzLCBnY2Mgd2lsbCB1c2UgY2VydGFpbiBvcHRpbWl6YXRpb25zIHRoYXQgdXN1YWxseSBsZWFkIHRvCi0JZmFsc2UgcG9zaXRpdmUgd2FybmluZ3MgZnJvbSBrbWVtY2hlY2suIEFuIGV4YW1wbGUgb2YgdGhpcyBpcyBhIDE2LWJpdAotCWZpZWxkIGluIGEgc3RydWN0LCB3aGVyZSBnY2MgbWF5IGxvYWQgMzIgYml0cywgdGhlbiBkaXNjYXJkIHRoZSB1cHBlcgotCTE2IGJpdHMuIGttZW1jaGVjayBzZWVzIG9ubHkgdGhlIDMyLWJpdCBsb2FkLCBhbmQgbWF5IHRyaWdnZXIgYQotCXdhcm5pbmcgZm9yIHRoZSB1cHBlciAxNiBiaXRzIChpZiB0aGV5J3JlIHVuaW5pdGlhbGl6ZWQpLgotCi0gIG8gQ09ORklHX1NMQUI9eSBvciBDT05GSUdfU0xVQj15Ci0KLQlUaGlzIG9wdGlvbiBpcyBsb2NhdGVkIHVuZGVyICJHZW5lcmFsIHNldHVwIiAvICJDaG9vc2UgU0xBQgotCWFsbG9jYXRvciIuCi0KLSAgbyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSPW4KLQotCVRoaXMgb3B0aW9uIGlzIGxvY2F0ZWQgdW5kZXIgIktlcm5lbCBoYWNraW5nIiAvICJUcmFjZXJzIiAvICJLZXJuZWwKLQlGdW5jdGlvbiBUcmFjZXIiCi0KLQlXaGVuIGZ1bmN0aW9uIHRyYWNpbmcgaXMgY29tcGlsZWQgaW4sIGdjYyBlbWl0cyBhIGNhbGwgdG8gYW5vdGhlcgotCWZ1bmN0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgZnVuY3Rpb24uIFRoaXMgbWVhbnMgdGhhdCB3aGVuIHRoZQotCXBhZ2UgZmF1bHQgaGFuZGxlciBpcyBjYWxsZWQsIHRoZSBmdHJhY2UgZnJhbWV3b3JrIHdpbGwgYmUgY2FsbGVkCi0JYmVmb3JlIGttZW1jaGVjayBoYXMgaGFkIGEgY2hhbmNlIHRvIGhhbmRsZSB0aGUgZmF1bHQuIElmIGZ0cmFjZSB0aGVuCi0JbW9kaWZpZXMgbWVtb3J5IHRoYXQgd2FzIHRyYWNrZWQgYnkga21lbWNoZWNrLCB0aGUgcmVzdWx0IGlzIGFuCi0JZW5kbGVzcyByZWN1cnNpdmUgcGFnZSBmYXVsdC4KLQotICBvIENPTkZJR19ERUJVR19QQUdFQUxMT0M9bgotCi0JVGhpcyBvcHRpb24gaXMgbG9jYXRlZCB1bmRlciAiS2VybmVsIGhhY2tpbmciIC8gIk1lbW9yeSBEZWJ1Z2dpbmciCi0JIC8gIkRlYnVnIHBhZ2UgbWVtb3J5IGFsbG9jYXRpb25zIi4KLQotSW4gYWRkaXRpb24sIEkgaGlnaGx5IHJlY29tbWVuZCB0dXJuaW5nIG9uIENPTkZJR19ERUJVR19JTkZPPXkuIFRoaXMgaXMgYWxzbwotbG9jYXRlZCB1bmRlciAiS2VybmVsIGhhY2tpbmciLiBXaXRoIHRoaXMsIHlvdSB3aWxsIGJlIGFibGUgdG8gZ2V0IGxpbmUgbnVtYmVyCi1pbmZvcm1hdGlvbiBmcm9tIHRoZSBrbWVtY2hlY2sgd2FybmluZ3MsIHdoaWNoIGlzIGV4dHJlbWVseSB2YWx1YWJsZSBpbgotZGVidWdnaW5nIGEgcHJvYmxlbS4gVGhpcyBvcHRpb24gaXMgbm90IG1hbmRhdG9yeSwgaG93ZXZlciwgYmVjYXVzZSBpdCBzbG93cwotZG93biB0aGUgY29tcGlsYXRpb24gcHJvY2VzcyBhbmQgcHJvZHVjZXMgYSBtdWNoIGJpZ2dlciBrZXJuZWwgaW1hZ2UuCi0KLU5vdyB0aGUga21lbWNoZWNrIG1lbnUgc2hvdWxkIGJlIHZpc2libGUgKHVuZGVyICJLZXJuZWwgaGFja2luZyIgLyAiTWVtb3J5Ci1EZWJ1Z2dpbmciIC8gImttZW1jaGVjazogdHJhcCB1c2Ugb2YgdW5pbml0aWFsaXplZCBtZW1vcnkiKS4gSGVyZSBmb2xsb3dzCi1hIGRlc2NyaXB0aW9uIG9mIHRoZSBrbWVtY2hlY2sgY29uZmlndXJhdGlvbiB2YXJpYWJsZXM6Ci0KLSAgbyBDT05GSUdfS01FTUNIRUNLCi0KLQlUaGlzIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0byB1c2Uga21lbWNoZWNrIGF0IGFsbC4uLgotCi0gIG8gQ09ORklHX0tNRU1DSEVDS19bRElTQUJMRUQgfCBFTkFCTEVEIHwgT05FU0hPVF1fQllfREVGQVVMVAotCi0JVGhpcyBvcHRpb24gY29udHJvbHMgdGhlIHN0YXR1cyBvZiBrbWVtY2hlY2sgYXQgYm9vdC10aW1lLiAiRW5hYmxlZCIKLQl3aWxsIGVuYWJsZSBrbWVtY2hlY2sgcmlnaHQgZnJvbSB0aGUgc3RhcnQsICJkaXNhYmxlZCIgd2lsbCBib290IHRoZQotCWtlcm5lbCBhcyBub3JtYWwgKGJ1dCB3aXRoIHRoZSBrbWVtY2hlY2sgY29kZSBjb21waWxlZCBpbiwgc28gaXQgY2FuCi0JYmUgZW5hYmxlZCBhdCBydW4tdGltZSBhZnRlciB0aGUga2VybmVsIGhhcyBib290ZWQpLCBhbmQgIm9uZS1zaG90IiBpcwotCWEgc3BlY2lhbCBtb2RlIHdoaWNoIHdpbGwgdHVybiBrbWVtY2hlY2sgb2ZmIGF1dG9tYXRpY2FsbHkgYWZ0ZXIKLQlkZXRlY3RpbmcgdGhlIGZpcnN0IHVzZSBvZiB1bmluaXRpYWxpemVkIG1lbW9yeS4KLQotCUlmIHlvdSBhcmUgdXNpbmcga21lbWNoZWNrIHRvIGFjdGl2ZWx5IGRlYnVnIGEgcHJvYmxlbSwgdGhlbiB5b3UKLQlwcm9iYWJseSB3YW50IHRvIGNob29zZSAiZW5hYmxlZCIgaGVyZS4KLQotCVRoZSBvbmUtc2hvdCBtb2RlIGlzIG1vc3RseSB1c2VmdWwgaW4gYXV0b21hdGVkIHRlc3Qgc2V0dXBzIGJlY2F1c2UgaXQKLQljYW4gcHJldmVudCBmbG9vZHMgb2Ygd2FybmluZ3MgYW5kIGluY3JlYXNlIHRoZSBjaGFuY2VzIG9mIHRoZSBtYWNoaW5lCi0Jc3Vydml2aW5nIGluIGNhc2Ugc29tZXRoaW5nIGlzIHJlYWxseSB3cm9uZy4gSW4gb3RoZXIgY2FzZXMsIHRoZSBvbmUtCi0Jc2hvdCBtb2RlIGNvdWxkIGFjdHVhbGx5IGJlIGNvdW50ZXItcHJvZHVjdGl2ZSBiZWNhdXNlIGl0IHdvdWxkIHR1cm4KLQlpdHNlbGYgb2ZmIGF0IHRoZSB2ZXJ5IGZpcnN0IGVycm9yIC0tIGluIHRoZSBjYXNlIG9mIGEgZmFsc2UgcG9zaXRpdmUKLQl0b28gLS0gYW5kIHRoaXMgd291bGQgY29tZSBpbiB0aGUgd2F5IG9mIGRlYnVnZ2luZyB0aGUgc3BlY2lmaWMKLQlwcm9ibGVtIHlvdSB3ZXJlIGludGVyZXN0ZWQgaW4uCi0KLQlJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgeW91ciBrZXJuZWwgYXMgbm9ybWFsLCBidXQgd2l0aCBhIGNoYW5jZSB0bwotCWVuYWJsZSBrbWVtY2hlY2sgaW4gY2FzZSBvZiBzb21lIHByb2JsZW0sIGl0IG1pZ2h0IGJlIGEgZ29vZCBpZGVhIHRvCi0JY2hvb3NlICJkaXNhYmxlZCIgaGVyZS4gV2hlbiBrbWVtY2hlY2sgaXMgZGlzYWJsZWQsIG1vc3Qgb2YgdGhlIHJ1bi0KLQl0aW1lIG92ZXJoZWFkIGlzIG5vdCBpbmN1cnJlZCwgYW5kIHRoZSBrZXJuZWwgd2lsbCBiZSBhbG1vc3QgYXMgZmFzdAotCWFzIG5vcm1hbC4KLQotICBvIENPTkZJR19LTUVNQ0hFQ0tfUVVFVUVfU0laRQotCi0JU2VsZWN0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlcnJvciByZXBvcnRzIHRvIHN0b3JlIGluIGFuIGludGVybmFsCi0JKGZpeGVkLXNpemUpIGJ1ZmZlci4gU2luY2UgZXJyb3JzIGNhbiBvY2N1ciB2aXJ0dWFsbHkgYW55d2hlcmUgYW5kIGluCi0JYW55IGNvbnRleHQsIHdlIG5lZWQgYSB0ZW1wb3Jhcnkgc3RvcmFnZSBhcmVhIHdoaWNoIGlzIGd1YXJhbnRlZWQgbm90Ci0JdG8gZ2VuZXJhdGUgYW55IG90aGVyIHBhZ2UgZmF1bHRzIHdoZW4gYWNjZXNzZWQuIFRoZSBxdWV1ZSB3aWxsIGJlCi0JZW1wdGllZCBhcyBzb29uIGFzIGEgdGFza2xldCBtYXkgYmUgc2NoZWR1bGVkLiBJZiB0aGUgcXVldWUgaXMgZnVsbCwKLQluZXcgZXJyb3IgcmVwb3J0cyB3aWxsIGJlIGxvc3QuCi0KLQlUaGUgZGVmYXVsdCB2YWx1ZSBvZiA2NCBpcyBwcm9iYWJseSBmaW5lLiBJZiBzb21lIGNvZGUgcHJvZHVjZXMgbW9yZQotCXRoYW4gNjQgZXJyb3JzIHdpdGhpbiBhbiBpcnFzLW9mZiBzZWN0aW9uLCB0aGVuIHRoZSBjb2RlIGlzIGxpa2VseSB0bwotCXByb2R1Y2UgbWFueSwgbWFueSBtb3JlLCB0b28sIGFuZCB0aGVzZSBhZGRpdGlvbmFsIHJlcG9ydHMgc2VsZG9tIGdpdmUKLQlhbnkgbW9yZSBpbmZvcm1hdGlvbiAodGhlIGZpcnN0IHJlcG9ydCBpcyB1c3VhbGx5IHRoZSBtb3N0IHZhbHVhYmxlCi0JYW55d2F5KS4KLQotCVRoaXMgbnVtYmVyIG1pZ2h0IGhhdmUgdG8gYmUgYWRqdXN0ZWQgaWYgeW91IGFyZSBub3QgdXNpbmcgc2VyaWFsCi0JY29uc29sZSBvciBzaW1pbGFyIHRvIGNhcHR1cmUgdGhlIGtlcm5lbCBsb2cuIElmIHlvdSBhcmUgdXNpbmcgdGhlCi0JImRtZXNnIiBjb21tYW5kIHRvIHNhdmUgdGhlIGxvZywgdGhlbiBnZXR0aW5nIGEgbG90IG9mIGttZW1jaGVjawotCXdhcm5pbmdzIG1pZ2h0IG92ZXJmbG93IHRoZSBrZXJuZWwgbG9nIGl0c2VsZiwgYW5kIHRoZSBlYXJsaWVyIHJlcG9ydHMKLQl3aWxsIGdldCBsb3N0IGluIHRoYXQgd2F5IGluc3RlYWQuIFRyeSBzZXR0aW5nIHRoaXMgdG8gMTAgb3Igc28gb24KLQlzdWNoIGEgc2V0dXAuCi0KLSAgbyBDT05GSUdfS01FTUNIRUNLX1NIQURPV19DT1BZX1NISUZUCi0KLQlTZWxlY3QgdGhlIG51bWJlciBvZiBzaGFkb3cgYnl0ZXMgdG8gc2F2ZSBhbG9uZyB3aXRoIGVhY2ggZW50cnkgb2YgdGhlCi0JZXJyb3ItcmVwb3J0IHF1ZXVlLiBUaGVzZSBieXRlcyBpbmRpY2F0ZSB3aGF0IHBhcnRzIG9mIGFuIGFsbG9jYXRpb24KLQlhcmUgaW5pdGlhbGl6ZWQsIHVuaW5pdGlhbGl6ZWQsIGV0Yy4gYW5kIHdpbGwgYmUgZGlzcGxheWVkIHdoZW4gYW4KLQllcnJvciBpcyBkZXRlY3RlZCB0byBoZWxwIHRoZSBkZWJ1Z2dpbmcgb2YgYSBwYXJ0aWN1bGFyIHByb2JsZW0uCi0KLQlUaGUgbnVtYmVyIGVudGVyZWQgaGVyZSBpcyBhY3R1YWxseSB0aGUgbG9nYXJpdGhtIG9mIHRoZSBudW1iZXIgb2YKLQlieXRlcyB0aGF0IHdpbGwgYmUgc2F2ZWQuIFNvIGlmIHlvdSBwaWNrIGZvciBleGFtcGxlIDUgaGVyZSwga21lbWNoZWNrCi0Jd2lsbCBzYXZlIDJeNSA9IDMyIGJ5dGVzLgotCi0JVGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIGZpbmUgZm9yIGRlYnVnZ2luZyBtb3N0IHByb2JsZW1zLiBJdCBhbHNvCi0JZml0cyBuaWNlbHkgd2l0aGluIDgwIGNvbHVtbnMuCi0KLSAgbyBDT05GSUdfS01FTUNIRUNLX1BBUlRJQUxfT0sKLQotCVRoaXMgb3B0aW9uICh3aGVuIGVuYWJsZWQpIHdvcmtzIGFyb3VuZCBjZXJ0YWluIEdDQyBvcHRpbWl6YXRpb25zIHRoYXQKLQlwcm9kdWNlIDMyLWJpdCByZWFkcyBmcm9tIDE2LWJpdCB2YXJpYWJsZXMgd2hlcmUgdGhlIHVwcGVyIDE2IGJpdHMgYXJlCi0JdGhyb3duIGF3YXkgYWZ0ZXJ3YXJkcy4KLQotCVRoZSBkZWZhdWx0IHZhbHVlIChlbmFibGVkKSBpcyByZWNvbW1lbmRlZC4gVGhpcyBtYXkgb2YgY291cnNlIGhpZGUKLQlzb21lIHJlYWwgZXJyb3JzLCBidXQgZGlzYWJsaW5nIGl0IHdvdWxkIHByb2JhYmx5IHByb2R1Y2UgYSBsb3Qgb2YKLQlmYWxzZSBwb3NpdGl2ZXMuCi0KLSAgbyBDT05GSUdfS01FTUNIRUNLX0JJVE9QU19PSwotCi0JVGhpcyBvcHRpb24gc2lsZW5jZXMgd2FybmluZ3MgdGhhdCB3b3VsZCBiZSBnZW5lcmF0ZWQgZm9yIGJpdC1maWVsZAotCWFjY2Vzc2VzIHdoZXJlIG5vdCBhbGwgdGhlIGJpdHMgYXJlIGluaXRpYWxpemVkIGF0IHRoZSBzYW1lIHRpbWUuIFRoaXMKLQltYXkgYWxzbyBoaWRlIHNvbWUgcmVhbCBidWdzLgotCi0JVGhpcyBvcHRpb24gaXMgcHJvYmFibHkgb2Jzb2xldGUsIG9yIGl0IHNob3VsZCBiZSByZXBsYWNlZCB3aXRoCi0JdGhlIGttZW1jaGVjay0vYml0ZmllbGQtYW5ub3RhdGlvbnMgZm9yIHRoZSBjb2RlIGluIHF1ZXN0aW9uLiBUaGUKLQlkZWZhdWx0IHZhbHVlIGlzIHRoZXJlZm9yZSBmaW5lLgotCi1Ob3cgY29tcGlsZSB0aGUga2VybmVsIGFzIHVzdWFsLgotCi0KLTMuIEhvdyB0byB1c2UKLT09PT09PT09PT09PT0KLQotMy4xLiBCb290aW5nCi09PT09PT09PT09PT0KLQotRmlyc3Qgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMuIFRoZXJlIGlzIG9ubHkgb25lCi1vcHRpb24gc3BlY2lmaWMgdG8ga21lbWNoZWNrLCBhbmQgdGhpcyBpcyBjYWxsZWQgImttZW1jaGVjayIuIEl0IGNhbiBiZSB1c2VkCi10byBvdmVycmlkZSB0aGUgZGVmYXVsdCBtb2RlIGFzIGNob3NlbiBieSB0aGUgQ09ORklHX0tNRU1DSEVDS18qX0JZX0RFRkFVTFQKLW9wdGlvbi4gSXRzIHBvc3NpYmxlIHNldHRpbmdzIGFyZToKLQotICBvIGttZW1jaGVjaz0wIChkaXNhYmxlZCkKLSAgbyBrbWVtY2hlY2s9MSAoZW5hYmxlZCkKLSAgbyBrbWVtY2hlY2s9MiAob25lLXNob3QgbW9kZSkKLQotSWYgU0xVQiBkZWJ1Z2dpbmcgaGFzIGJlZW4gZW5hYmxlZCBpbiB0aGUga2VybmVsLCBpdCBtYXkgdGFrZSBwcmVjZWRlbmNlIG92ZXIKLWttZW1jaGVjayBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIHNsYWIgY2FjaGVzIHdoaWNoIGFyZSB1bmRlciBTTFVCIGRlYnVnZ2luZwotd2lsbCBub3QgYmUgdHJhY2tlZCBieSBrbWVtY2hlY2suIEluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IHRoaXMgZG9lc24ndCBoYXBwZW4KLShldmVuIHRob3VnaCBpdCBzaG91bGRuJ3QgYnkgZGVmYXVsdCksIHVzZSBTTFVCJ3MgYm9vdCBvcHRpb24gInNsdWJfZGVidWciLAotbGlrZSB0aGlzOiBzbHViX2RlYnVnPS0KLQotSW4gZmFjdCwgdGhpcyBvcHRpb24gbWF5IGFsc28gYmUgdXNlZCBmb3IgZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciBTTFVCIHZzLgota21lbWNoZWNrLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGNvbW1hbmQgbGluZSBpbmNsdWRlcyAia21lbWNoZWNrPTEKLXNsdWJfZGVidWc9LGRlbnRyeSIsIHRoZW4gU0xVQiBkZWJ1Z2dpbmcgd2lsbCBiZSB1c2VkIG9ubHkgZm9yIHRoZSAiZGVudHJ5Igotc2xhYiBjYWNoZSwgYW5kIHdpdGgga21lbWNoZWNrIHRyYWNraW5nIGFsbCB0aGUgb3RoZXIgY2FjaGVzLiBUaGlzIGlzIGFkdmFuY2VkCi11c2FnZSwgaG93ZXZlciwgYW5kIGlzIG5vdCBnZW5lcmFsbHkgcmVjb21tZW5kZWQuCi0KLQotMy4yLiBSdW4tdGltZSBlbmFibGUvZGlzYWJsZQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1XaGVuIHRoZSBrZXJuZWwgaGFzIGJvb3RlZCwgaXQgaXMgcG9zc2libGUgdG8gZW5hYmxlIG9yIGRpc2FibGUga21lbWNoZWNrIGF0Ci1ydW4tdGltZS4gV0FSTklORzogVGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGNhdXNlIGZhbHNlCi1wb3NpdGl2ZSB3YXJuaW5ncyB0byBhcHBlYXIuIFRoZXJlZm9yZSwgdHJ5IG5vdCB0byB1c2UgdGhpcy4gSWYgeW91IGZpbmQgdGhhdAotaXQgZG9lc24ndCB3b3JrIHByb3Blcmx5IChlLmcuIHlvdSBzZWUgYW4gdW5yZWFzb25hYmxlIGFtb3VudCBvZiB3YXJuaW5ncyksIEkKLXdpbGwgYmUgaGFwcHkgdG8gdGFrZSBidWcgcmVwb3J0cy4KLQotVXNlIHRoZSBmaWxlIC9wcm9jL3N5cy9rZXJuZWwva21lbWNoZWNrIGZvciB0aGlzIHB1cnBvc2UsIGUuZy46Ci0KLQkkIGVjaG8gMCA+IC9wcm9jL3N5cy9rZXJuZWwva21lbWNoZWNrICMgZGlzYWJsZXMga21lbWNoZWNrCi0KLVRoZSBudW1iZXJzIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIGttZW1jaGVjaz0gY29tbWFuZC1saW5lIG9wdGlvbi4KLQotCi0zLjMuIERlYnVnZ2luZwotPT09PT09PT09PT09PT0KLQotQSB0eXBpY2FsIHJlcG9ydCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKLQotV0FSTklORzoga21lbWNoZWNrOiBDYXVnaHQgMzItYml0IHJlYWQgZnJvbSB1bmluaXRpYWxpemVkIG1lbW9yeSAoZmZmZjg4MDAzZTRhMjAyNCkKLTgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDg4ZmZmZjAwMDAwMDAwMDAwMDAwMDAKLSBpIGkgaSBpIHUgdSB1IHUgaSBpIGkgaSBpIGkgaSBpIHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUKLSAgICAgICAgIF4KLQotUGlkOiAxODU2LCBjb21tOiBudHBkYXRlIE5vdCB0YWludGVkIDIuNi4yOS1yYzUgIzI2NCA5NDVQLUEKLVJJUDogMDAxMDpbPGZmZmZmZmZmODEwNGVkZTg+XSAgWzxmZmZmZmZmZjgxMDRlZGU4Pl0gX19kZXF1ZXVlX3NpZ25hbCsweGM4LzB4MTkwCi1SU1A6IDAwMTg6ZmZmZjg4MDAzY2RmN2Q5OCAgRUZMQUdTOiAwMDIxMDAwMgotUkFYOiAwMDAwMDAwMDAwMDAwMDMwIFJCWDogZmZmZjg4MDAzZDRlYTk2OCBSQ1g6IDAwMDAwMDAwMDAwMDAwMDkKLVJEWDogZmZmZjg4MDAzZTVkNjAxOCBSU0k6IGZmZmY4ODAwM2U1ZDYwMjQgUkRJOiBmZmZmODgwMDNjZGY3ZTg0Ci1SQlA6IGZmZmY4ODAwM2NkZjdkYjggUjA4OiBmZmZmODgwMDNlNWQ2MDAwIFIwOTogMDAwMDAwMDAwMDAwMDAwMAotUjEwOiAwMDAwMDAwMDAwMDAwMDgwIFIxMTogMDAwMDAwMDAwMDAwMDAwMCBSMTI6IDAwMDAwMDAwMDAwMDAwMGUKLVIxMzogZmZmZjg4MDAzY2RmN2U3OCBSMTQ6IGZmZmY4ODAwM2Q1MzA3MTAgUjE1OiBmZmZmODgwMDNkNWE5OGM4Ci1GUzogIDAwMDAwMDAwMDAwMDAwMDAoMDAwMCkgR1M6ZmZmZjg4MDAwMTk4MjAwMCgwMDYzKSBrbmxHUzowMDAwMAotQ1M6ICAwMDEwIERTOiAwMDJiIEVTOiAwMDJiIENSMDogMDAwMDAwMDA4MDA1MDAzMwotQ1IyOiBmZmZmODgwMDNmODA2ZWEwIENSMzogMDAwMDAwMDAzYzAzNjAwMCBDUjQ6IDAwMDAwMDAwMDAwMDA2YTAKLURSMDogMDAwMDAwMDAwMDAwMDAwMCBEUjE6IDAwMDAwMDAwMDAwMDAwMDAgRFIyOiAwMDAwMDAwMDAwMDAwMDAwCi1EUjM6IDAwMDAwMDAwMDAwMDAwMDAgRFI2OiAwMDAwMDAwMGZmZmY0ZmYwIERSNzogMDAwMDAwMDAwMDAwMDQwMAotIFs8ZmZmZmZmZmY4MTA0ZjA0ZT5dIGRlcXVldWVfc2lnbmFsKzB4OGUvMHgxNzAKLSBbPGZmZmZmZmZmODEwNTBiZDg+XSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIrMHg5OC8weDM5MAotIFs8ZmZmZmZmZmY4MTAwYjg3ZD5dIGRvX25vdGlmeV9yZXN1bWUrMHhhZC8weDdkMAotIFs8ZmZmZmZmZmY4MTAwYzdiNT5dIGludF9zaWduYWwrMHgxMi8weDE3Ci0gWzxmZmZmZmZmZmZmZmZmZmZmPl0gMHhmZmZmZmZmZmZmZmZmZmZmCi0KLVRoZSBzaW5nbGUgbW9zdCB2YWx1YWJsZSBpbmZvcm1hdGlvbiBpbiB0aGlzIHJlcG9ydCBpcyB0aGUgUklQIChvciBFSVAgb24gMzItCi1iaXQpIHZhbHVlLiBUaGlzIHdpbGwgaGVscCB1cyBwaW5wb2ludCBleGFjdGx5IHdoaWNoIGluc3RydWN0aW9uIHRoYXQgY2F1c2VkCi10aGUgd2FybmluZy4KLQotSWYgeW91ciBrZXJuZWwgd2FzIGNvbXBpbGVkIHdpdGggQ09ORklHX0RFQlVHX0lORk89eSwgdGhlbiBhbGwgd2UgaGF2ZSB0byBkbwotaXMgZ2l2ZSB0aGlzIGFkZHJlc3MgdG8gdGhlIGFkZHIybGluZSBwcm9ncmFtLCBsaWtlIHRoaXM6Ci0KLQkkIGFkZHIybGluZSAtZSB2bWxpbnV4IC1pIGZmZmZmZmZmODEwNGVkZTgKLQlhcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdHJpbmdfNjQuaDoxMgotCWluY2x1ZGUvYXNtLWdlbmVyaWMvc2lnaW5mby5oOjI4NwotCWtlcm5lbC9zaWduYWwuYzozODAKLQlrZXJuZWwvc2lnbmFsLmM6NDEwCi0KLVRoZSAiLWUgdm1saW51eCIgdGVsbHMgYWRkcjJsaW5lIHdoaWNoIGZpbGUgdG8gbG9vayBpbi4gSU1QT1JUQU5UOiBUaGlzIG11c3QKLWJlIHRoZSB2bWxpbnV4IG9mIHRoZSBrZXJuZWwgdGhhdCBwcm9kdWNlZCB0aGUgd2FybmluZyBpbiB0aGUgZmlyc3QgcGxhY2UhIElmCi1ub3QsIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgd3JvbmcuCi0KLVRoZSAiLWkiIHRlbGxzIGFkZHIybGluZSB0byBhbHNvIHByaW50IHRoZSBsaW5lIG51bWJlcnMgb2YgaW5saW5lZCBmdW5jdGlvbnMuCi1JbiB0aGlzIGNhc2UsIHRoZSBmbGFnIHdhcyB2ZXJ5IGltcG9ydGFudCwgYmVjYXVzZSBvdGhlcndpc2UsIGl0IHdvdWxkIG9ubHkKLWhhdmUgcHJpbnRlZCB0aGUgZmlyc3QgbGluZSwgd2hpY2ggaXMganVzdCBhIGNhbGwgdG8gbWVtY3B5KCksIHdoaWNoIGNvdWxkIGJlCi1jYWxsZWQgZnJvbSBhIHRob3VzYW5kIHBsYWNlcyBpbiB0aGUga2VybmVsLCBhbmQgaXMgdGhlcmVmb3JlIG5vdCB2ZXJ5IHVzZWZ1bC4KLVRoZXNlIGlubGluZWQgZnVuY3Rpb25zIHdvdWxkIG5vdCBzaG93IHVwIGluIHRoZSBzdGFjayB0cmFjZSBhYm92ZSwgc2ltcGx5Ci1iZWNhdXNlIHRoZSBrZXJuZWwgZG9lc24ndCBsb2FkIHRoZSBleHRyYSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIFRoaXMKLXRlY2huaXF1ZSBjYW4gb2YgY291cnNlIGJlIHVzZWQgd2l0aCBvcmRpbmFyeSBrZXJuZWwgb29wc2VzIGFzIHdlbGwuCi0KLUluIHRoaXMgY2FzZSwgaXQncyB0aGUgY2FsbGVyIG9mIG1lbWNweSgpIHRoYXQgaXMgaW50ZXJlc3RpbmcsIGFuZCBpdCBjYW4gYmUKLWZvdW5kIGluIGluY2x1ZGUvYXNtLWdlbmVyaWMvc2lnaW5mby5oLCBsaW5lIDI4NzoKLQotMjgxIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3NpZ2luZm8oc3RydWN0IHNpZ2luZm8gKnRvLCBzdHJ1Y3Qgc2lnaW5mbyAqZnJvbSkKLTI4MiB7Ci0yODMgICAgICAgICBpZiAoZnJvbS0+c2lfY29kZSA8IDApCi0yODQgICAgICAgICAgICAgICAgIG1lbWNweSh0bywgZnJvbSwgc2l6ZW9mKCp0bykpOwotMjg1ICAgICAgICAgZWxzZQotMjg2ICAgICAgICAgICAgICAgICAvKiBfc2lnY2hsZCBpcyBjdXJyZW50bHkgdGhlIGxhcmdlc3Qga25vdyB1bmlvbiBtZW1iZXIgKi8KLTI4NyAgICAgICAgICAgICAgICAgbWVtY3B5KHRvLCBmcm9tLCBfX0FSQ0hfU0lfUFJFQU1CTEVfU0laRSArIHNpemVvZihmcm9tLT5fc2lmaWVsZHMuX3NpZ2NobGQpKTsKLTI4OCB9Ci0KLVNpbmNlIHRoaXMgd2FzIGEgcmVhZCAoa21lbWNoZWNrIHVzdWFsbHkgd2FybnMgYWJvdXQgcmVhZHMgb25seSwgdGhvdWdoIGl0IGNhbgotd2FybiBhYm91dCB3cml0ZXMgdG8gdW5hbGxvY2F0ZWQgb3IgZnJlZWQgbWVtb3J5IGFzIHdlbGwpLCBpdCB3YXMgcHJvYmFibHkgdGhlCi0iZnJvbSIgYXJndW1lbnQgd2hpY2ggY29udGFpbmVkIHNvbWUgdW5pbml0aWFsaXplZCBieXRlcy4gRm9sbG93aW5nIHRoZSBjaGFpbgotb2YgY2FsbHMsIHdlIG1vdmUgdXB3YXJkcyB0byBzZWUgd2hlcmUgImZyb20iIHdhcyBhbGxvY2F0ZWQgb3IgaW5pdGlhbGl6ZWQsCi1rZXJuZWwvc2lnbmFsLmMsIGxpbmUgMzgwOgotCi0zNTkgc3RhdGljIHZvaWQgY29sbGVjdF9zaWduYWwoaW50IHNpZywgc3RydWN0IHNpZ3BlbmRpbmcgKmxpc3QsIHNpZ2luZm9fdCAqaW5mbykKLTM2MCB7Ci0uLi4KLTM2NyAgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmxpc3QtPmxpc3QsIGxpc3QpIHsKLTM2OCAgICAgICAgICAgICAgICAgaWYgKHEtPmluZm8uc2lfc2lnbm8gPT0gc2lnKSB7Ci0zNjkgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotMzcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzdGlsbF9wZW5kaW5nOwotMzcxICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gcTsKLS4uLgotMzc3ICAgICAgICAgaWYgKGZpcnN0KSB7Ci0zNzggc3RpbGxfcGVuZGluZzoKLTM3OSAgICAgICAgICAgICAgICAgbGlzdF9kZWxfaW5pdCgmZmlyc3QtPmxpc3QpOwotMzgwICAgICAgICAgICAgICAgICBjb3B5X3NpZ2luZm8oaW5mbywgJmZpcnN0LT5pbmZvKTsKLTM4MSAgICAgICAgICAgICAgICAgX19zaWdxdWV1ZV9mcmVlKGZpcnN0KTsKLS4uLgotMzkyICAgICAgICAgfQotMzkzIH0KLQotSGVyZSwgaXQgaXMgJmZpcnN0LT5pbmZvIHRoYXQgaXMgYmVpbmcgcGFzc2VkIG9uIHRvIGNvcHlfc2lnaW5mbygpLiBUaGUKLXZhcmlhYmxlICJmaXJzdCIgd2FzIGZvdW5kIG9uIGEgbGlzdCAtLSBwYXNzZWQgaW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCB0bwotY29sbGVjdF9zaWduYWwoKS4gV2UgIGNvbnRpbnVlIG91ciBqb3VybmV5IHRocm91Z2ggdGhlIHN0YWNrLCB0byBmaWd1cmUgb3V0Ci13aGVyZSB0aGUgaXRlbSBvbiAibGlzdCIgd2FzIGFsbG9jYXRlZCBvciBpbml0aWFsaXplZC4gV2UgbW92ZSB0byBsaW5lIDQxMDoKLQotMzk1IHN0YXRpYyBpbnQgX19kZXF1ZXVlX3NpZ25hbChzdHJ1Y3Qgc2lncGVuZGluZyAqcGVuZGluZywgc2lnc2V0X3QgKm1hc2ssCi0zOTYgICAgICAgICAgICAgICAgICAgICAgICAgc2lnaW5mb190ICppbmZvKQotMzk3IHsKLS4uLgotNDEwICAgICAgICAgICAgICAgICBjb2xsZWN0X3NpZ25hbChzaWcsIHBlbmRpbmcsIGluZm8pOwotLi4uCi00MTQgfQotCi1Ob3cgd2UgbmVlZCB0byBmb2xsb3cgdGhlICJwZW5kaW5nIiBwb2ludGVyLCBzaW5jZSB0aGF0IGlzIGJlaW5nIHBhc3NlZCBvbiB0bwotY29sbGVjdF9zaWduYWwoKSBhcyAibGlzdCIuIEF0IHRoaXMgcG9pbnQsIHdlJ3ZlIHJ1biBvdXQgb2YgbGluZXMgZnJvbSB0aGUKLSJhZGRyMmxpbmUiIG91dHB1dC4gTm90IHRvIHdvcnJ5LCB3ZSBqdXN0IHBhc3RlIHRoZSBuZXh0IGFkZHJlc3NlcyBmcm9tIHRoZQota21lbWNoZWNrIHN0YWNrIGR1bXAsIGkuZS46Ci0KLSBbPGZmZmZmZmZmODEwNGYwNGU+XSBkZXF1ZXVlX3NpZ25hbCsweDhlLzB4MTcwCi0gWzxmZmZmZmZmZjgxMDUwYmQ4Pl0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKzB4OTgvMHgzOTAKLSBbPGZmZmZmZmZmODEwMGI4N2Q+XSBkb19ub3RpZnlfcmVzdW1lKzB4YWQvMHg3ZDAKLSBbPGZmZmZmZmZmODEwMGM3YjU+XSBpbnRfc2lnbmFsKzB4MTIvMHgxNwotCi0JJCBhZGRyMmxpbmUgLWUgdm1saW51eCAtaSBmZmZmZmZmZjgxMDRmMDRlIGZmZmZmZmZmODEwNTBiZDggXAotCQlmZmZmZmZmZjgxMDBiODdkIGZmZmZmZmZmODEwMGM3YjUKLQlrZXJuZWwvc2lnbmFsLmM6NDQ2Ci0Ja2VybmVsL3NpZ25hbC5jOjE4MDYKLQlhcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmM6ODA1Ci0JYXJjaC94ODYva2VybmVsL3NpZ25hbC5jOjg3MQotCWFyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TOjY5NAotCi1SZW1lbWJlciB0aGF0IHNpbmNlIHRoZXNlIGFkZHJlc3NlcyB3ZXJlIGZvdW5kIG9uIHRoZSBzdGFjayBhbmQgbm90IGFzIHRoZQotUklQIHZhbHVlLCB0aGV5IGFjdHVhbGx5IHBvaW50IHRvIHRoZSBfbmV4dF8gaW5zdHJ1Y3Rpb24gKHRoZXkgYXJlIHJldHVybgotYWRkcmVzc2VzKS4gVGhpcyBiZWNvbWVzIG9idmlvdXMgd2hlbiB3ZSBsb29rIGF0IHRoZSBjb2RlIGZvciBsaW5lIDQ0NjoKLQotNDIyIGludCBkZXF1ZXVlX3NpZ25hbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc2lnc2V0X3QgKm1hc2ssIHNpZ2luZm9fdCAqaW5mbykKLTQyMyB7Ci0uLi4KLTQzMSAgICAgICAgICAgICAgICAgc2lnbnIgPSBfX2RlcXVldWVfc2lnbmFsKCZ0c2stPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcsCi00MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrLCBpbmZvKTsKLTQzMyAgICAgICAgICAgICAgICAgLyoKLTQzNCAgICAgICAgICAgICAgICAgICogaXRpbWVyIHNpZ25hbCA/Ci00MzUgICAgICAgICAgICAgICAgICAqCi00MzYgICAgICAgICAgICAgICAgICAqIGl0aW1lcnMgYXJlIHByb2Nlc3Mgc2hhcmVkIGFuZCB3ZSByZXN0YXJ0IHBlcmlvZGljCi00MzcgICAgICAgICAgICAgICAgICAqIGl0aW1lcnMgaW4gdGhlIHNpZ25hbCBkZWxpdmVyeSBwYXRoIHRvIHByZXZlbnQgRG9TCi00MzggICAgICAgICAgICAgICAgICAqIGF0dGFja3MgaW4gdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBjYXNlLiBUaGlzIGlzCi00MzkgICAgICAgICAgICAgICAgICAqIGNvbXBsaWFudCB3aXRoIHRoZSBvbGQgd2F5IG9mIHNlbGYgcmVzdGFydGluZwotNDQwICAgICAgICAgICAgICAgICAgKiBpdGltZXJzLCBhcyB0aGUgU0lHQUxSTSBpcyBhIGxlZ2FjeSBzaWduYWwgYW5kIG9ubHkKLTQ0MSAgICAgICAgICAgICAgICAgICogcXVldWVkIG9uY2UuIENoYW5naW5nIHRoZSByZXN0YXJ0IGJlaGF2aW91ciB0bwotNDQyICAgICAgICAgICAgICAgICAgKiByZXN0YXJ0IHRoZSB0aW1lciBpbiB0aGUgc2lnbmFsIGRlcXVldWUgcGF0aCBpcwotNDQzICAgICAgICAgICAgICAgICAgKiByZWR1Y2luZyB0aGUgdGltZXIgbm9pc2Ugb24gaGVhdnkgbG9hZGVkICFoaWdocmVzCi00NDQgICAgICAgICAgICAgICAgICAqIHN5c3RlbXMgdG9vLgotNDQ1ICAgICAgICAgICAgICAgICAgKi8KLTQ0NiAgICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KHNpZ25yID09IFNJR0FMUk0pKSB7Ci0uLi4KLTQ4OSB9Ci0KLVNvIGluc3RlYWQgb2YgbG9va2luZyBhdCA0NDYsIHdlIHNob3VsZCBiZSBsb29raW5nIGF0IDQzMSwgd2hpY2ggaXMgdGhlIGxpbmUKLXRoYXQgZXhlY3V0ZXMganVzdCBiZWZvcmUgNDQ2LiBIZXJlIHdlIHNlZSB0aGF0IHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yIGlzCi0mdHNrLT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nLgotCi1PdXIgbmV4dCB0YXNrIGlzIG5vdyB0byBmaWd1cmUgb3V0IHdoaWNoIGZ1bmN0aW9uIHRoYXQgcHV0cyBpdGVtcyBvbiB0aGlzCi0ic2hhcmVkX3BlbmRpbmciIGxpc3QuIEEgY3J1ZGUsIGJ1dCBlZmZpY2llbnQgdG9vbCwgaXMgZ2l0IGdyZXA6Ci0KLQkkIGdpdCBncmVwIC1uICdzaGFyZWRfcGVuZGluZycga2VybmVsLwotCS4uLgotCWtlcm5lbC9zaWduYWwuYzo4Mjg6ICAgIHBlbmRpbmcgPSBncm91cCA/ICZ0LT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nIDogJnQtPnBlbmRpbmc7Ci0Ja2VybmVsL3NpZ25hbC5jOjEzMzk6ICAgcGVuZGluZyA9IGdyb3VwID8gJnQtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcgOiAmdC0+cGVuZGluZzsKLQkuLi4KLQotVGhlcmUgd2VyZSBtb3JlIHJlc3VsdHMsIGJ1dCBub25lIG9mIHRoZW0gd2VyZSByZWxhdGVkIHRvIGxpc3Qgb3BlcmF0aW9ucywKLWFuZCB0aGVzZSB3ZXJlIHRoZSBvbmx5IGFzc2lnbm1lbnRzLiBXZSBpbnNwZWN0IHRoZSBsaW5lIG51bWJlcnMgbW9yZSBjbG9zZWx5Ci1hbmQgZmluZCB0aGF0IHRoaXMgaXMgaW5kZWVkIHdoZXJlIGl0ZW1zIGFyZSBiZWluZyBhZGRlZCB0byB0aGUgbGlzdDoKLQotODE2IHN0YXRpYyBpbnQgc2VuZF9zaWduYWwoaW50IHNpZywgc3RydWN0IHNpZ2luZm8gKmluZm8sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwKLTgxNyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXApCi04MTggewotLi4uCi04MjggICAgICAgICBwZW5kaW5nID0gZ3JvdXAgPyAmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyA6ICZ0LT5wZW5kaW5nOwotLi4uCi04NTEgICAgICAgICBxID0gX19zaWdxdWV1ZV9hbGxvYyh0LCBHRlBfQVRPTUlDLCAoc2lnIDwgU0lHUlRNSU4gJiYKLTg1MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNfc2lfc3BlY2lhbChpbmZvKSB8fAotODUzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaV9jb2RlID49IDApKSk7Ci04NTQgICAgICAgICBpZiAocSkgewotODU1ICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZxLT5saXN0LCAmcGVuZGluZy0+bGlzdCk7Ci0uLi4KLTg5MCB9Ci0KLWFuZDoKLQotMTMwOSBpbnQgc2VuZF9zaWdxdWV1ZShzdHJ1Y3Qgc2lncXVldWUgKnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGdyb3VwKQotMTMxMCB7Ci0uLi4uCi0xMzM5ICAgICAgICAgcGVuZGluZyA9IGdyb3VwID8gJnQtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcgOiAmdC0+cGVuZGluZzsKLTEzNDAgICAgICAgICBsaXN0X2FkZF90YWlsKCZxLT5saXN0LCAmcGVuZGluZy0+bGlzdCk7Ci0uLi4uCi0xMzQ3IH0KLQotSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBsaXN0IGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLCAicSIsIGlzIGJlaW5nIHJldHVybmVkCi1mcm9tIHRoZSBmdW5jdGlvbiBfX3NpZ3F1ZXVlX2FsbG9jKCksIHdoaWNoIGxvb2tzIGxpa2UgYW4gYWxsb2NhdGlvbiBmdW5jdGlvbi4KLUxldCdzIHRha2UgYSBsb29rIGF0IGl0OgotCi0xODcgc3RhdGljIHN0cnVjdCBzaWdxdWV1ZSAqX19zaWdxdWV1ZV9hbGxvYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGdmcF90IGZsYWdzLAotMTg4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJyaWRlX3JsaW1pdCkKLTE4OSB7Ci0xOTAgICAgICAgICBzdHJ1Y3Qgc2lncXVldWUgKnEgPSBOVUxMOwotMTkxICAgICAgICAgc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyOwotMTkyIAotMTkzICAgICAgICAgLyoKLTE5NCAgICAgICAgICAqIFdlIHdvbid0IGdldCBwcm9ibGVtcyB3aXRoIHRoZSB0YXJnZXQncyBVSUQgY2hhbmdpbmcgdW5kZXIgdXMKLTE5NSAgICAgICAgICAqIGJlY2F1c2UgY2hhbmdpbmcgaXQgcmVxdWlyZXMgUkNVIGJlIHVzZWQsIGFuZCBpZiB0ICE9IGN1cnJlbnQsIHRoZQotMTk2ICAgICAgICAgICogY2FsbGVyIG11c3QgYmUgaG9sZGluZyB0aGUgUkNVIHJlYWRsb2NrIChieSB3YXkgb2YgYSBzcGlubG9jaykgYW5kCi0xOTcgICAgICAgICAgKiB3ZSB1c2UgUkNVIHByb3RlY3Rpb24gaGVyZQotMTk4ICAgICAgICAgICovCi0xOTkgICAgICAgICB1c2VyID0gZ2V0X3VpZChfX3Rhc2tfY3JlZCh0KS0+dXNlcik7Ci0yMDAgICAgICAgICBhdG9taWNfaW5jKCZ1c2VyLT5zaWdwZW5kaW5nKTsKLTIwMSAgICAgICAgIGlmIChvdmVycmlkZV9ybGltaXQgfHwKLTIwMiAgICAgICAgICAgICBhdG9taWNfcmVhZCgmdXNlci0+c2lncGVuZGluZykgPD0KLTIwMyAgICAgICAgICAgICAgICAgICAgICAgICB0LT5zaWduYWwtPnJsaW1bUkxJTUlUX1NJR1BFTkRJTkddLnJsaW1fY3VyKQotMjA0ICAgICAgICAgICAgICAgICBxID0ga21lbV9jYWNoZV9hbGxvYyhzaWdxdWV1ZV9jYWNoZXAsIGZsYWdzKTsKLTIwNSAgICAgICAgIGlmICh1bmxpa2VseShxID09IE5VTEwpKSB7Ci0yMDYgICAgICAgICAgICAgICAgIGF0b21pY19kZWMoJnVzZXItPnNpZ3BlbmRpbmcpOwotMjA3ICAgICAgICAgICAgICAgICBmcmVlX3VpZCh1c2VyKTsKLTIwOCAgICAgICAgIH0gZWxzZSB7Ci0yMDkgICAgICAgICAgICAgICAgIElOSVRfTElTVF9IRUFEKCZxLT5saXN0KTsKLTIxMCAgICAgICAgICAgICAgICAgcS0+ZmxhZ3MgPSAwOwotMjExICAgICAgICAgICAgICAgICBxLT51c2VyID0gdXNlcjsKLTIxMiAgICAgICAgIH0KLTIxMyAKLTIxNCAgICAgICAgIHJldHVybiBxOwotMjE1IH0KLQotV2Ugc2VlIHRoYXQgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBxLT5saXN0LCBxLT5mbGFncywgYW5kIHEtPnVzZXIuIEl0IHNlZW1zCi10aGF0IG5vdyBpcyB0aGUgdGltZSB0byBsb29rIGF0IHRoZSBkZWZpbml0aW9uIG9mICJzdHJ1Y3Qgc2lncXVldWUiLCBlLmcuOgotCi0xNCBzdHJ1Y3Qgc2lncXVldWUgewotMTUgICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0xNiAgICAgICAgIGludCBmbGFnczsKLTE3ICAgICAgICAgc2lnaW5mb190IGluZm87Ci0xOCAgICAgICAgIHN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcjsKLTE5IH07Ci0KLUFuZCwgeW91IG1pZ2h0IHJlbWVtYmVyLCBpdCB3YXMgYSBtZW1jcHkoKSBvbiAmZmlyc3QtPmluZm8gdGhhdCBjYXVzZWQgdGhlCi13YXJuaW5nLCBzbyB0aGlzIG1ha2VzIHBlcmZlY3Qgc2Vuc2UuIEl0IGFsc28gc2VlbXMgcmVhc29uYWJsZSB0byBhc3N1bWUgdGhhdAotaXQgaXMgdGhlIGNhbGxlciBvZiBfX3NpZ3F1ZXVlX2FsbG9jKCkgdGhhdCBoYXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGZpbGxpbmcKLW91dCAoaW5pdGlhbGl6aW5nKSB0aGlzIG1lbWJlci4KLQotQnV0IGp1c3Qgd2hpY2ggZmllbGRzIG9mIHRoZSBzdHJ1Y3Qgd2VyZSB1bmluaXRpYWxpemVkPyBMZXQncyBsb29rIGF0Ci1rbWVtY2hlY2sncyByZXBvcnQgYWdhaW46Ci0KLVdBUk5JTkc6IGttZW1jaGVjazogQ2F1Z2h0IDMyLWJpdCByZWFkIGZyb20gdW5pbml0aWFsaXplZCBtZW1vcnkgKGZmZmY4ODAwM2U0YTIwMjQpCi04MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4OGZmZmYwMDAwMDAwMDAwMDAwMDAwCi0gaSBpIGkgaSB1IHUgdSB1IGkgaSBpIGkgaSBpIGkgaSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1Ci0gICAgICAgICBeCi0KLVRoZXNlIGZpcnN0IHR3byBsaW5lcyBhcmUgdGhlIG1lbW9yeSBkdW1wIG9mIHRoZSBtZW1vcnkgb2JqZWN0IGl0c2VsZiwgYW5kIHRoZQotc2hhZG93IGJ5dGVtYXAsIHJlc3BlY3RpdmVseS4gVGhlIG1lbW9yeSBvYmplY3QgaXRzZWxmIGlzIGluIHRoaXMgY2FzZQotJmZpcnN0LT5pbmZvLiBKdXN0IGJld2FyZSB0aGF0IHRoZSBzdGFydCBvZiB0aGlzIGR1bXAgaXMgTk9UIHRoZSBzdGFydCBvZiB0aGUKLW9iamVjdCBpdHNlbGYhIFRoZSBwb3NpdGlvbiBvZiB0aGUgY2FyZXQgKF4pIGNvcnJlc3BvbmRzIHdpdGggdGhlIGFkZHJlc3Mgb2YKLXRoZSByZWFkIChmZmZmODgwMDNlNGEyMDI0KS4KLQotVGhlIHNoYWRvdyBieXRlbWFwIGR1bXAgbGVnZW5kIGlzIGFzIGZvbGxvd3M6Ci0KLSAgaSAtIGluaXRpYWxpemVkCi0gIHUgLSB1bmluaXRpYWxpemVkCi0gIGEgLSB1bmFsbG9jYXRlZCAobWVtb3J5IGhhcyBiZWVuIGFsbG9jYXRlZCBieSB0aGUgc2xhYiBsYXllciwgYnV0IGhhcyBub3QKLSAgICAgIHlldCBiZWVuIGhhbmRlZCBvZmYgdG8gYW55Ym9keSkKLSAgZiAtIGZyZWVkIChtZW1vcnkgaGFzIGJlZW4gYWxsb2NhdGVkIGJ5IHRoZSBzbGFiIGxheWVyLCBidXQgaGFzIGJlZW4gZnJlZWQKLSAgICAgIGJ5IHRoZSBwcmV2aW91cyBvd25lcikKLQotSW4gb3JkZXIgdG8gZmlndXJlIG91dCB3aGVyZSAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBvYmplY3QpIHRoZQotdW5pbml0aWFsaXplZCBtZW1vcnkgd2FzIGxvY2F0ZWQsIHdlIGhhdmUgdG8gbG9vayBhdCB0aGUgZGlzYXNzZW1ibHkuIEZvcgotdGhhdCwgd2UnbGwgbmVlZCB0aGUgUklQIGFkZHJlc3MgYWdhaW46Ci0KLVJJUDogMDAxMDpbPGZmZmZmZmZmODEwNGVkZTg+XSAgWzxmZmZmZmZmZjgxMDRlZGU4Pl0gX19kZXF1ZXVlX3NpZ25hbCsweGM4LzB4MTkwCi0KLQkkIG9iamR1bXAgLWQgLS1uby1zaG93LXJhdy1pbnNuIHZtbGludXggfCBncmVwIC1DIDggZmZmZmZmZmY4MTA0ZWRlODoKLQlmZmZmZmZmZjgxMDRlZGM4OiAgICAgICBtb3YgICAgJXI4LDB4OCglcjgpCi0JZmZmZmZmZmY4MTA0ZWRjYzogICAgICAgdGVzdCAgICVyMTBkLCVyMTBkCi0JZmZmZmZmZmY4MTA0ZWRjZjogICAgICAganMgICAgIGZmZmZmZmZmODEwNGVlODggPF9fZGVxdWV1ZV9zaWduYWwrMHgxNjg+Ci0JZmZmZmZmZmY4MTA0ZWRkNTogICAgICAgbW92ICAgICVyYXgsJXJkeAotCWZmZmZmZmZmODEwNGVkZDg6ICAgICAgIG1vdiAgICAkMHhjLCVlY3gKLQlmZmZmZmZmZjgxMDRlZGRkOiAgICAgICBtb3YgICAgJXIxMywlcmRpCi0JZmZmZmZmZmY4MTA0ZWRlMDogICAgICAgbW92ICAgICQweDMwLCVlYXgKLQlmZmZmZmZmZjgxMDRlZGU1OiAgICAgICBtb3YgICAgJXJkeCwlcnNpCi0JZmZmZmZmZmY4MTA0ZWRlODogICAgICAgcmVwIG1vdnNsICVkczooJXJzaSksJWVzOiglcmRpKQotCWZmZmZmZmZmODEwNGVkZWE6ICAgICAgIHRlc3QgICAkMHgyLCVhbAotCWZmZmZmZmZmODEwNGVkZWM6ICAgICAgIGplICAgICBmZmZmZmZmZjgxMDRlZGYwIDxfX2RlcXVldWVfc2lnbmFsKzB4ZDA+Ci0JZmZmZmZmZmY4MTA0ZWRlZTogICAgICAgbW92c3cgICVkczooJXJzaSksJWVzOiglcmRpKQotCWZmZmZmZmZmODEwNGVkZjA6ICAgICAgIHRlc3QgICAkMHgxLCVhbAotCWZmZmZmZmZmODEwNGVkZjI6ICAgICAgIGplICAgICBmZmZmZmZmZjgxMDRlZGY1IDxfX2RlcXVldWVfc2lnbmFsKzB4ZDU+Ci0JZmZmZmZmZmY4MTA0ZWRmNDogICAgICAgbW92c2IgICVkczooJXJzaSksJWVzOiglcmRpKQotCWZmZmZmZmZmODEwNGVkZjU6ICAgICAgIG1vdiAgICAlcjgsJXJkaQotCWZmZmZmZmZmODEwNGVkZjg6ICAgICAgIGNhbGxxICBmZmZmZmZmZjgxMDRkZTYwIDxfX3NpZ3F1ZXVlX2ZyZWU+Ci0KLUFzIGV4cGVjdGVkLCBpdCdzIHRoZSAicmVwIG1vdnNsIiBpbnN0cnVjdGlvbiBmcm9tIHRoZSBtZW1jcHkoKSB0aGF0IGNhdXNlcwotdGhlIHdhcm5pbmcuIFdlIGtub3cgYWJvdXQgUkVQIE1PVlNMIHRoYXQgaXQgdXNlcyB0aGUgcmVnaXN0ZXIgUkNYIHRvIGNvdW50Ci10aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBpdGVyYXRpb25zLiBCeSB0YWtpbmcgYSBsb29rIGF0IHRoZSByZWdpc3RlciBkdW1wCi1hZ2FpbiAoZnJvbSB0aGUga21lbWNoZWNrIHJlcG9ydCksIHdlIGNhbiBmaWd1cmUgb3V0IGhvdyBtYW55IGJ5dGVzIHdlcmUgbGVmdAotdG8gY29weToKLQotUkFYOiAwMDAwMDAwMDAwMDAwMDMwIFJCWDogZmZmZjg4MDAzZDRlYTk2OCBSQ1g6IDAwMDAwMDAwMDAwMDAwMDkKLQotQnkgbG9va2luZyBhdCB0aGUgZGlzYXNzZW1ibHksIHdlIGFsc28gc2VlIHRoYXQgJWVjeCBpcyBiZWluZyBsb2FkZWQgd2l0aCB0aGUKLXZhbHVlICQweGMganVzdCBiZWZvcmUgKGZmZmZmZmZmODEwNGVkZDgpLCBzbyB3ZSBhcmUgdmVyeSBsdWNreS4gS2VlcCBpbiBtaW5kCi10aGF0IHRoaXMgaXMgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zLCBub3QgYnl0ZXMuIEFuZCBzaW5jZSB0aGlzIGlzIGEgImxvbmciCi1vcGVyYXRpb24sIHdlIG5lZWQgdG8gbXVsdGlwbHkgYnkgNCB0byBnZXQgdGhlIG51bWJlciBvZiBieXRlcy4gU28gdGhpcyBtZWFucwotdGhhdCB0aGUgdW5pbml0aWFsaXplZCB2YWx1ZSB3YXMgZW5jb3VudGVyZWQgYXQgNCAqICgweGMgLSAweDkpID0gMTIgYnl0ZXMKLWZyb20gdGhlIHN0YXJ0IG9mIHRoZSBvYmplY3QuCi0KLVdlIGNhbiBub3cgdHJ5IHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmllbGQgb2YgdGhlICJzdHJ1Y3Qgc2lnaW5mbyIgdGhhdCB3YXMgbm90Ci1pbml0aWFsaXplZC4gVGhpcyBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3Q6Ci0KLTQwIHR5cGVkZWYgc3RydWN0IHNpZ2luZm8gewotNDEgICAgICAgICBpbnQgc2lfc2lnbm87Ci00MiAgICAgICAgIGludCBzaV9lcnJubzsKLTQzICAgICAgICAgaW50IHNpX2NvZGU7Ci00NCAgICAgICAgICAgICAgICAgCi00NSAgICAgICAgIHVuaW9uIHsKLS4uCi05MiAgICAgICAgIH0gX3NpZmllbGRzOwotOTMgfSBzaWdpbmZvX3Q7Ci0KLU9uIDY0LWJpdCwgdGhlIGludCBpcyA0IGJ5dGVzIGxvbmcsIHNvIGl0IG11c3QgdGhlIHVuaW9uIG1lbWJlciB0aGF0IGhhcwotbm90IGJlZW4gaW5pdGlhbGl6ZWQuIFdlIGNhbiB2ZXJpZnkgdGhpcyB1c2luZyBnZGI6Ci0KLQkkIGdkYiB2bWxpbnV4Ci0JLi4uCi0JKGdkYikgcCAmKChzdHJ1Y3Qgc2lnaW5mbyAqKSAwKS0+X3NpZmllbGRzCi0JJDEgPSAodW5pb24gey4uLn0gKikgMHgxMAotCi1BY3R1YWxseSwgaXQgc2VlbXMgdGhhdCB0aGUgdW5pb24gbWVtYmVyIGlzIGxvY2F0ZWQgYXQgb2Zmc2V0IDB4MTAgLS0gd2hpY2gKLW1lYW5zIHRoYXQgZ2NjIGhhcyBpbnNlcnRlZCA0IGJ5dGVzIG9mIHBhZGRpbmcgYmV0d2VlbiB0aGUgbWVtYmVycyBzaV9jb2RlCi1hbmQgX3NpZmllbGRzLiBXZSBjYW4gbm93IGdldCBhIGZ1bGxlciBwaWN0dXJlIG9mIHRoZSBtZW1vcnkgZHVtcDoKLQotICAgICAgICAgXy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PiBzaV9jb2RlCi0gICAgICAgIC8gICAgICAgIF8tLS0tLS0tLS0tLS0tLS0tLS0tLT0+IChwYWRkaW5nKQotICAgICAgIHwgICAgICAgIC8gICAgICAgIF8tLS0tLS0tLS0tLS09PiBfc2lmaWVsZHMoLl9raWxsLl9waWQpCi0gICAgICAgfCAgICAgICB8ICAgICAgICAvICAgICAgICBfLS0tLT0+IF9zaWZpZWxkcyguX2tpbGwuX3VpZCkKLSAgICAgICB8ICAgICAgIHwgICAgICAgfCAgICAgICAgLyAKLS0tLS0tLS18LS0tLS0tLXwtLS0tLS0tfC0tLS0tLS18Ci04MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4OGZmZmYwMDAwMDAwMDAwMDAwMDAwCi0gaSBpIGkgaSB1IHUgdSB1IGkgaSBpIGkgaSBpIGkgaSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1IHUgdSB1Ci0KLVRoaXMgYWxsb3dzIHVzIHRvIHJlYWxpemUgYW5vdGhlciBpbXBvcnRhbnQgZmFjdDogc2lfY29kZSBjb250YWlucyB0aGUgdmFsdWUKLTB4ODAuIFJlbWVtYmVyIHRoYXQgeDg2IGlzIGxpdHRsZSBlbmRpYW4sIHNvIHRoZSBmaXJzdCA0IGJ5dGVzICI4MDAwMDAwMCIgYXJlCi1yZWFsbHkgdGhlIG51bWJlciAweDAwMDAwMDgwLiBXaXRoIGEgYml0IG9mIHJlc2VhcmNoLCB3ZSBmaW5kIHRoYXQgdGhpcyBpcwotYWN0dWFsbHkgdGhlIGNvbnN0YW50IFNJX0tFUk5FTCBkZWZpbmVkIGluIGluY2x1ZGUvYXNtLWdlbmVyaWMvc2lnaW5mby5oOgotCi0xNDQgI2RlZmluZSBTSV9LRVJORUwgICAgICAgMHg4MCAgICAgICAgICAgIC8qIHNlbnQgYnkgdGhlIGtlcm5lbCBmcm9tIHNvbWV3aGVyZSAgICAgKi8KLQotVGhpcyBtYWNybyBpcyB1c2VkIGluIGV4YWN0bHkgb25lIHBsYWNlIGluIHRoZSB4ODYga2VybmVsOiBJbiBzZW5kX3NpZ25hbCgpCi1pbiBrZXJuZWwvc2lnbmFsLmM6Ci0KLTgxNiBzdGF0aWMgaW50IHNlbmRfc2lnbmFsKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsCi04MTcgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwKQotODE4IHsKLS4uLgotODI4ICAgICAgICAgcGVuZGluZyA9IGdyb3VwID8gJnQtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcgOiAmdC0+cGVuZGluZzsKLS4uLgotODUxICAgICAgICAgcSA9IF9fc2lncXVldWVfYWxsb2ModCwgR0ZQX0FUT01JQywgKHNpZyA8IFNJR1JUTUlOICYmCi04NTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzX3NpX3NwZWNpYWwoaW5mbykgfHwKLTg1MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2lfY29kZSA+PSAwKSkpOwotODU0ICAgICAgICAgaWYgKHEpIHsKLTg1NSAgICAgICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCgmcS0+bGlzdCwgJnBlbmRpbmctPmxpc3QpOwotODU2ICAgICAgICAgICAgICAgICBzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKSBpbmZvKSB7Ci0uLi4KLTg2NSAgICAgICAgICAgICAgICAgY2FzZSAodW5zaWduZWQgbG9uZykgU0VORF9TSUdfUFJJVjoKLTg2NiAgICAgICAgICAgICAgICAgICAgICAgICBxLT5pbmZvLnNpX3NpZ25vID0gc2lnOwotODY3ICAgICAgICAgICAgICAgICAgICAgICAgIHEtPmluZm8uc2lfZXJybm8gPSAwOwotODY4ICAgICAgICAgICAgICAgICAgICAgICAgIHEtPmluZm8uc2lfY29kZSA9IFNJX0tFUk5FTDsKLTg2OSAgICAgICAgICAgICAgICAgICAgICAgICBxLT5pbmZvLnNpX3BpZCA9IDA7Ci04NzAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+aW5mby5zaV91aWQgPSAwOwotODcxICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotLi4uCi04OTAgfQotCi1Ob3Qgb25seSBkb2VzIHRoaXMgbWF0Y2ggd2l0aCB0aGUgLnNpX2NvZGUgbWVtYmVyLCBpdCBhbHNvIG1hdGNoZXMgdGhlIHBsYWNlCi13ZSBmb3VuZCBlYXJsaWVyIHdoZW4gbG9va2luZyBmb3Igd2hlcmUgc2lnaW5mb190IG9iamVjdHMgYXJlIGVucXVldWVkIG9uIHRoZQotInNoYXJlZF9wZW5kaW5nIiBsaXN0LgotCi1TbyB0byBzdW0gdXA6IEl0IHNlZW1zIHRoYXQgaXQgaXMgdGhlIHBhZGRpbmcgaW50cm9kdWNlZCBieSB0aGUgY29tcGlsZXIKLWJldHdlZW4gdHdvIHN0cnVjdCBmaWVsZHMgdGhhdCBpcyB1bmluaXRpYWxpemVkLCBhbmQgdGhpcyBnZXRzIHJlcG9ydGVkIHdoZW4KLXdlIGRvIGEgbWVtY3B5KCkgb24gdGhlIHN0cnVjdC4gVGhpcyBtZWFucyB0aGF0IHdlIGhhdmUgaWRlbnRpZmllZCBhIGZhbHNlCi1wb3NpdGl2ZSB3YXJuaW5nLgotCi1Ob3JtYWxseSwga21lbWNoZWNrIHdpbGwgbm90IHJlcG9ydCB1bmluaXRpYWxpemVkIGFjY2Vzc2VzIGluIG1lbWNweSgpIGNhbGxzCi13aGVuIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzIGFyZSB0cmFja2VkLiAoSW5zdGVhZCwgd2UgY29weQotdGhlIHNoYWRvdyBieXRlbWFwIGFzIHdlbGwpLiBJbiB0aGlzIGNhc2UsIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGNsZWFybHkKLXdhcyBub3QgdHJhY2tlZC4gV2UgY2FuIGRpZyBhIGxpdHRsZSBkZWVwZXIgaW50byB0aGUgc3RhY2sgdHJhY2UgZnJvbSBhYm92ZToKLQotCWFyY2gveDg2L2tlcm5lbC9zaWduYWwuYzo4MDUKLQlhcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmM6ODcxCi0JYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlM6Njk0Ci0KLUFuZCB3ZSBjbGVhcmx5IHNlZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBzaWdpbmZvIG9iamVjdCBpcyBsb2NhdGVkIG9uIHRoZQotc3RhY2s6Ci0KLTc4MiBzdGF0aWMgdm9pZCBkb19zaWduYWwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi03ODMgewotNzg0ICAgICAgICAgc3RydWN0IGtfc2lnYWN0aW9uIGthOwotNzg1ICAgICAgICAgc2lnaW5mb190IGluZm87Ci0uLi4KLTgwNCAgICAgICAgIHNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOwotLi4uCi04NTQgfQotCi1BbmQgdGhpcyAmaW5mbyBpcyB3aGF0IGV2ZW50dWFsbHkgZ2V0cyBwYXNzZWQgdG8gY29weV9zaWdpbmZvKCkgYXMgdGhlCi1kZXN0aW5hdGlvbiBhcmd1bWVudC4KLQotTm93LCBldmVuIHRob3VnaCB3ZSBkaWRuJ3QgZmluZCBhbiBhY3R1YWwgZXJyb3IgaGVyZSwgdGhlIGV4YW1wbGUgaXMgc3RpbGwgYQotZ29vZCBvbmUsIGJlY2F1c2UgaXQgc2hvd3MgaG93IG9uZSB3b3VsZCBnbyBhYm91dCB0byBmaW5kIG91dCB3aGF0IHRoZSByZXBvcnQKLXdhcyBhbGwgYWJvdXQuCi0KLQotMy40LiBBbm5vdGF0aW5nIGZhbHNlIHBvc2l0aXZlcwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGVyZSBhcmUgYSBmZXcgZGlmZmVyZW50IHdheXMgdG8gbWFrZSBhbm5vdGF0aW9ucyBpbiB0aGUgc291cmNlIGNvZGUgdGhhdAotd2lsbCBrZWVwIGttZW1jaGVjayBmcm9tIGNoZWNraW5nIGFuZCByZXBvcnRpbmcgY2VydGFpbiBhbGxvY2F0aW9ucy4gSGVyZQotdGhleSBhcmU6Ci0KLSAgbyBfX0dGUF9OT1RSQUNLX0ZBTFNFX1BPU0lUSVZFCi0KLQlUaGlzIGZsYWcgY2FuIGJlIHBhc3NlZCB0byBrbWFsbG9jKCkgb3Iga21lbV9jYWNoZV9hbGxvYygpICh0aGVyZWZvcmUKLQlhbHNvIHRvIG90aGVyIGZ1bmN0aW9ucyB0aGF0IGVuZCB1cCBjYWxsaW5nIG9uZSBvZiB0aGVzZSkgdG8gaW5kaWNhdGUKLQl0aGF0IHRoZSBhbGxvY2F0aW9uIHNob3VsZCBub3QgYmUgdHJhY2tlZCBiZWNhdXNlIGl0IHdvdWxkIGxlYWQgdG8KLQlhIGZhbHNlIHBvc2l0aXZlIHJlcG9ydC4gVGhpcyBpcyBhICJiaWcgaGFtbWVyIiB3YXkgb2Ygc2lsZW5jaW5nCi0Ja21lbWNoZWNrOyBhZnRlciBhbGwsIGV2ZW4gaWYgdGhlIGZhbHNlIHBvc2l0aXZlIHBlcnRhaW5zIHRvIAotCXBhcnRpY3VsYXIgZmllbGQgaW4gYSBzdHJ1Y3QsIGZvciBleGFtcGxlLCB3ZSB3aWxsIG5vdyBsb3NlIHRoZQotCWFiaWxpdHkgdG8gZmluZCAocmVhbCkgZXJyb3JzIGluIG90aGVyIHBhcnRzIG9mIHRoZSBzYW1lIHN0cnVjdC4KLQotCUV4YW1wbGU6Ci0KLQkgICAgLyogTm8gd2FybmluZ3Mgd2lsbCBldmVyIHRyaWdnZXIgb24gYWNjZXNzaW5nIGFueSBwYXJ0IG9mIHggKi8KLQkgICAgeCA9IGttYWxsb2Moc2l6ZW9mICp4LCBHRlBfS0VSTkVMIHwgX19HRlBfTk9UUkFDS19GQUxTRV9QT1NJVElWRSk7Ci0KLSAgbyBrbWVtY2hlY2tfYml0ZmllbGRfYmVnaW4obmFtZSkva21lbWNoZWNrX2JpdGZpZWxkX2VuZChuYW1lKSBhbmQKLQlrbWVtY2hlY2tfYW5ub3RhdGVfYml0ZmllbGQocHRyLCBuYW1lKQotCi0JVGhlIGZpcnN0IHR3byBvZiB0aGVzZSB0aHJlZSBtYWNyb3MgY2FuIGJlIHVzZWQgaW5zaWRlIHN0cnVjdAotCWRlZmluaXRpb25zIHRvIHNpZ25hbCwgcmVzcGVjdGl2ZWx5LCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgYQotCWJpdGZpZWxkLiBBZGRpdGlvbmFsbHksIHRoaXMgd2lsbCBhc3NpZ24gdGhlIGJpdGZpZWxkIGEgbmFtZSwgd2hpY2gKLQlpcyBnaXZlbiBhcyBhbiBhcmd1bWVudCB0byB0aGUgbWFjcm9zLgotCi0JSGF2aW5nIHVzZWQgdGhlc2UgbWFya2Vycywgb25lIGNhbiBsYXRlciB1c2UKLQlrbWVtY2hlY2tfYW5ub3RhdGVfYml0ZmllbGQoKSBhdCB0aGUgcG9pbnQgb2YgYWxsb2NhdGlvbiwgdG8gaW5kaWNhdGUKLQl3aGljaCBwYXJ0cyBvZiB0aGUgYWxsb2NhdGlvbiBpcyBwYXJ0IG9mIGEgYml0ZmllbGQuCi0KLQlFeGFtcGxlOgotCi0JICAgIHN0cnVjdCBmb28gewotCQlpbnQgeDsKLQotCQlrbWVtY2hlY2tfYml0ZmllbGRfYmVnaW4oZmxhZ3MpOwotCQlpbnQgZmxhZ19hOjE7Ci0JCWludCBmbGFnX2I6MTsKLQkJa21lbWNoZWNrX2JpdGZpZWxkX2VuZChmbGFncyk7Ci0KLQkJaW50IHk7Ci0JICAgIH07Ci0KLQkgICAgc3RydWN0IGZvbyAqeCA9IGttYWxsb2Moc2l6ZW9mICp4KTsKLQotCSAgICAvKiBObyB3YXJuaW5ncyB3aWxsIHRyaWdnZXIgb24gYWNjZXNzaW5nIHRoZSBiaXRmaWVsZCBvZiB4ICovCi0JICAgIGttZW1jaGVja19hbm5vdGF0ZV9iaXRmaWVsZCh4LCBmbGFncyk7Ci0KLQlOb3RlIHRoYXQga21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKCkgY2FuIGJlIHVzZWQgZXZlbiBiZWZvcmUgdGhlCi0JcmV0dXJuIHZhbHVlIG9mIGttYWxsb2MoKSBpcyBjaGVja2VkIC0tIGluIG90aGVyIHdvcmRzLCBwYXNzaW5nIE5VTEwKLQlhcyB0aGUgZmlyc3QgYXJndW1lbnQgaXMgbGVnYWwgKGFuZCB3aWxsIGRvIG5vdGhpbmcpLgotCi0KLTQuIFJlcG9ydGluZyBlcnJvcnMKLT09PT09PT09PT09PT09PT09PT0KLQotQXMgd2UgaGF2ZSBzZWVuLCBrbWVtY2hlY2sgd2lsbCBwcm9kdWNlIGZhbHNlIHBvc2l0aXZlIHJlcG9ydHMuIFRoZXJlZm9yZSwgaXQKLWlzIG5vdCB2ZXJ5IHdpc2UgdG8gYmxpbmRseSBwb3N0IGttZW1jaGVjayB3YXJuaW5ncyB0byBtYWlsaW5nIGxpc3RzIGFuZAotbWFpbnRhaW5lcnMuIEluc3RlYWQsIEkgZW5jb3VyYWdlIG1haW50YWluZXJzIGFuZCBkZXZlbG9wZXJzIHRvIGZpbmQgZXJyb3JzCi1pbiB0aGVpciBvd24gY29kZS4gSWYgeW91IGdldCBhIHdhcm5pbmcsIHlvdSBjYW4gdHJ5IHRvIHdvcmsgYXJvdW5kIGl0LCB0cnkKLXRvIGZpZ3VyZSBvdXQgaWYgaXQncyBhIHJlYWwgZXJyb3Igb3Igbm90LCBvciBzaW1wbHkgaWdub3JlIGl0LiBNb3N0Ci1kZXZlbG9wZXJzIGtub3cgdGhlaXIgb3duIGNvZGUgYW5kIHdpbGwgcXVpY2tseSBhbmQgZWZmaWNpZW50bHkgZGV0ZXJtaW5lIHRoZQotcm9vdCBjYXVzZSBvZiBhIGttZW1jaGVjayByZXBvcnQuIFRoaXMgaXMgdGhlcmVmb3JlIGFsc28gdGhlIG1vc3QgZWZmaWNpZW50Ci13YXkgdG8gd29yayB3aXRoIGttZW1jaGVjay4KLQotVGhhdCBzYWlkLCB3ZSAodGhlIGttZW1jaGVjayBtYWludGFpbmVycykgd2lsbCBhbHdheXMgYmUgb24gdGhlIGxvb2tvdXQgZm9yCi1mYWxzZSBwb3NpdGl2ZXMgdGhhdCB3ZSBjYW4gYW5ub3RhdGUgYW5kIHNpbGVuY2UuIFNvIHdoYXRldmVyIHlvdSBmaW5kLAotcGxlYXNlIGRyb3AgdXMgYSBub3RlIHByaXZhdGVseSEgS2VybmVsIGNvbmZpZ3MgYW5kIHN0ZXBzIHRvIHJlcHJvZHVjZSAoaWYKLWF2YWlsYWJsZSkgYXJlIG9mIGNvdXJzZSBhIGdyZWF0IGhlbHAgdG9vLgotCi1IYXBweSBoYWNraW5nIQotCi0KLTUuIFRlY2huaWNhbCBkZXNjcmlwdGlvbgotPT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWttZW1jaGVjayB3b3JrcyBieSBtYXJraW5nIG1lbW9yeSBwYWdlcyBub24tcHJlc2VudC4gVGhpcyBtZWFucyB0aGF0IHdoZW5ldmVyCi1zb21lYm9keSBhdHRlbXB0cyB0byBhY2Nlc3MgdGhlIHBhZ2UsIGEgcGFnZSBmYXVsdCBpcyBnZW5lcmF0ZWQuIFRoZSBwYWdlCi1mYXVsdCBoYW5kbGVyIG5vdGljZXMgdGhhdCB0aGUgcGFnZSB3YXMgaW4gZmFjdCBvbmx5IGhpZGRlbiwgYW5kIHNvIGl0IGNhbGxzCi1vbiB0aGUga21lbWNoZWNrIGNvZGUgdG8gbWFrZSBmdXJ0aGVyIGludmVzdGlnYXRpb25zLgotCi1XaGVuIHRoZSBpbnZlc3RpZ2F0aW9ucyBhcmUgY29tcGxldGVkLCBrbWVtY2hlY2sgInNob3dzIiB0aGUgcGFnZSBieSBtYXJraW5nCi1pdCBwcmVzZW50IChhcyBpdCB3b3VsZCBiZSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcykuIFRoaXMgd2F5LCB0aGUKLWludGVycnVwdGVkIGNvZGUgY2FuIGNvbnRpbnVlIGFzIHVzdWFsLgotCi1CdXQgYWZ0ZXIgdGhlIGluc3RydWN0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLCB3ZSBzaG91bGQgaGlkZSB0aGUgcGFnZSBhZ2Fpbiwgc28KLXRoYXQgd2UgY2FuIGNhdGNoIHRoZSBuZXh0IGFjY2VzcyB0b28hIE5vdyBrbWVtY2hlY2sgbWFrZXMgdXNlIG9mIGEgZGVidWdnaW5nCi1mZWF0dXJlIG9mIHRoZSBwcm9jZXNzb3IsIG5hbWVseSBzaW5nbGUtc3RlcHBpbmcuIFdoZW4gdGhlIHByb2Nlc3NvciBoYXMKLWZpbmlzaGVkIHRoZSBvbmUgaW5zdHJ1Y3Rpb24gdGhhdCBnZW5lcmF0ZWQgdGhlIG1lbW9yeSBhY2Nlc3MsIGEgZGVidWcKLWV4Y2VwdGlvbiBpcyByYWlzZWQuIEZyb20gaGVyZSwgd2Ugc2ltcGx5IGhpZGUgdGhlIHBhZ2UgYWdhaW4gYW5kIGNvbnRpbnVlCi1leGVjdXRpb24sIHRoaXMgdGltZSB3aXRoIHRoZSBzaW5nbGUtc3RlcHBpbmcgZmVhdHVyZSB0dXJuZWQgb2ZmLgotCi1rbWVtY2hlY2sgcmVxdWlyZXMgc29tZSBhc3Npc3RhbmNlIGZyb20gdGhlIG1lbW9yeSBhbGxvY2F0b3IgaW4gb3JkZXIgdG8gd29yay4KLVRoZSBtZW1vcnkgYWxsb2NhdG9yIG5lZWRzIHRvCi0KLSAgMS4gVGVsbCBrbWVtY2hlY2sgYWJvdXQgbmV3bHkgYWxsb2NhdGVkIHBhZ2VzIGFuZCBwYWdlcyB0aGF0IGFyZSBhYm91dCB0bwotICAgICBiZSBmcmVlZC4gVGhpcyBhbGxvd3Mga21lbWNoZWNrIHRvIHNldCB1cCBhbmQgdGVhciBkb3duIHRoZSBzaGFkb3cgbWVtb3J5Ci0gICAgIGZvciB0aGUgcGFnZXMgaW4gcXVlc3Rpb24uIFRoZSBzaGFkb3cgbWVtb3J5IHN0b3JlcyB0aGUgc3RhdHVzIG9mIGVhY2gKLSAgICAgYnl0ZSBpbiB0aGUgYWxsb2NhdGlvbiBwcm9wZXIsIGUuZy4gd2hldGhlciBpdCBpcyBpbml0aWFsaXplZCBvcgotICAgICB1bmluaXRpYWxpemVkLgotCi0gIDIuIFRlbGwga21lbWNoZWNrIHdoaWNoIHBhcnRzIG9mIG1lbW9yeSBzaG91bGQgYmUgbWFya2VkIHVuaW5pdGlhbGl6ZWQuCi0gICAgIFRoZXJlIGFyZSBhY3R1YWxseSBhIGZldyBtb3JlIHN0YXRlcywgc3VjaCBhcyAibm90IHlldCBhbGxvY2F0ZWQiIGFuZAotICAgICAicmVjZW50bHkgZnJlZWQiLgotCi1JZiBhIHNsYWIgY2FjaGUgaXMgc2V0IHVwIHVzaW5nIHRoZSBTTEFCX05PVFJBQ0sgZmxhZywgaXQgd2lsbCBuZXZlciByZXR1cm4KLW1lbW9yeSB0aGF0IGNhbiB0YWtlIHBhZ2UgZmF1bHRzIGJlY2F1c2Ugb2Yga21lbWNoZWNrLgotCi1JZiBhIHNsYWIgY2FjaGUgaXMgTk9UIHNldCB1cCB1c2luZyB0aGUgU0xBQl9OT1RSQUNLIGZsYWcsIGNhbGxlcnMgY2FuIHN0aWxsCi1yZXF1ZXN0IG1lbW9yeSB3aXRoIHRoZSBfX0dGUF9OT1RSQUNLIG9yIF9fR0ZQX05PVFJBQ0tfRkFMU0VfUE9TSVRJVkUgZmxhZ3MuCi1UaGlzIGRvZXMgbm90IHByZXZlbnQgdGhlIHBhZ2UgZmF1bHRzIGZyb20gb2NjdXJyaW5nLCBob3dldmVyLCBidXQgbWFya3MgdGhlCi1vYmplY3QgaW4gcXVlc3Rpb24gYXMgYmVpbmcgaW5pdGlhbGl6ZWQgc28gdGhhdCBubyB3YXJuaW5ncyB3aWxsIGV2ZXIgYmUKLXByb2R1Y2VkIGZvciB0aGlzIG9iamVjdC4KLQotQ3VycmVudGx5LCB0aGUgU0xBQiBhbmQgU0xVQiBhbGxvY2F0b3JzIGFyZSBzdXBwb3J0ZWQgYnkga21lbWNoZWNrLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rbWVtbGVhay50eHQgYi9Eb2N1bWVudGF0aW9uL2ttZW1sZWFrLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlMjRhYi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2ttZW1sZWFrLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi1LZXJuZWwgTWVtb3J5IExlYWsgRGV0ZWN0b3IKLT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JbnRyb2R1Y3Rpb24KLS0tLS0tLS0tLS0tLQotCi1LbWVtbGVhayBwcm92aWRlcyBhIHdheSBvZiBkZXRlY3RpbmcgcG9zc2libGUga2VybmVsIG1lbW9yeSBsZWFrcyBpbiBhCi13YXkgc2ltaWxhciB0byBhIHRyYWNpbmcgZ2FyYmFnZSBjb2xsZWN0b3IKLShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HYXJiYWdlX2NvbGxlY3Rpb25fJTI4Y29tcHV0ZXJfc2NpZW5jZSUyOSNUcmFjaW5nX2dhcmJhZ2VfY29sbGVjdG9ycyksCi13aXRoIHRoZSBkaWZmZXJlbmNlIHRoYXQgdGhlIG9ycGhhbiBvYmplY3RzIGFyZSBub3QgZnJlZWQgYnV0IG9ubHkKLXJlcG9ydGVkIHZpYSAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhay4gQSBzaW1pbGFyIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZQotVmFsZ3JpbmQgdG9vbCAobWVtY2hlY2sgLS1sZWFrLWNoZWNrKSB0byBkZXRlY3QgdGhlIG1lbW9yeSBsZWFrcyBpbgotdXNlci1zcGFjZSBhcHBsaWNhdGlvbnMuCi1LbWVtbGVhayBpcyBzdXBwb3J0ZWQgb24geDg2LCBhcm0sIHBvd2VycGMsIHNwYXJjLCBzaCwgbWljcm9ibGF6ZSwgcHBjLCBtaXBzLCBzMzkwLCBtZXRhZyBhbmQgdGlsZS4KLQotVXNhZ2UKLS0tLS0tCi0KLUNPTkZJR19ERUJVR19LTUVNTEVBSyBpbiAiS2VybmVsIGhhY2tpbmciIGhhcyB0byBiZSBlbmFibGVkLiBBIGtlcm5lbAotdGhyZWFkIHNjYW5zIHRoZSBtZW1vcnkgZXZlcnkgMTAgbWludXRlcyAoYnkgZGVmYXVsdCkgYW5kIHByaW50cyB0aGUKLW51bWJlciBvZiBuZXcgdW5yZWZlcmVuY2VkIG9iamVjdHMgZm91bmQuIFRvIGRpc3BsYXkgdGhlIGRldGFpbHMgb2YgYWxsCi10aGUgcG9zc2libGUgbWVtb3J5IGxlYWtzOgotCi0gICMgbW91bnQgLXQgZGVidWdmcyBub2RldiAvc3lzL2tlcm5lbC9kZWJ1Zy8KLSAgIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKLQotVG8gdHJpZ2dlciBhbiBpbnRlcm1lZGlhdGUgbWVtb3J5IHNjYW46Ci0KLSAgIyBlY2hvIHNjYW4gPiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhawotCi1UbyBjbGVhciB0aGUgbGlzdCBvZiBhbGwgY3VycmVudCBwb3NzaWJsZSBtZW1vcnkgbGVha3M6Ci0KLSAgIyBlY2hvIGNsZWFyID4gL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKLQotTmV3IGxlYWtzIHdpbGwgdGhlbiBjb21lIHVwIHVwb24gcmVhZGluZyAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhawotYWdhaW4uCi0KLU5vdGUgdGhhdCB0aGUgb3JwaGFuIG9iamVjdHMgYXJlIGxpc3RlZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGFsbG9jYXRlZAotYW5kIG9uZSBvYmplY3QgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCBtYXkgY2F1c2Ugb3RoZXIgc3Vic2VxdWVudAotb2JqZWN0cyB0byBiZSByZXBvcnRlZCBhcyBvcnBoYW4uCi0KLU1lbW9yeSBzY2FubmluZyBwYXJhbWV0ZXJzIGNhbiBiZSBtb2RpZmllZCBhdCBydW4tdGltZSBieSB3cml0aW5nIHRvIHRoZQotL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsgZmlsZS4gVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQ6Ci0KLSAgb2ZmCQktIGRpc2FibGUga21lbWxlYWsgKGlycmV2ZXJzaWJsZSkKLSAgc3RhY2s9b24JLSBlbmFibGUgdGhlIHRhc2sgc3RhY2tzIHNjYW5uaW5nIChkZWZhdWx0KQotICBzdGFjaz1vZmYJLSBkaXNhYmxlIHRoZSB0YXNrcyBzdGFja3Mgc2Nhbm5pbmcKLSAgc2Nhbj1vbgktIHN0YXJ0IHRoZSBhdXRvbWF0aWMgbWVtb3J5IHNjYW5uaW5nIHRocmVhZCAoZGVmYXVsdCkKLSAgc2Nhbj1vZmYJLSBzdG9wIHRoZSBhdXRvbWF0aWMgbWVtb3J5IHNjYW5uaW5nIHRocmVhZAotICBzY2FuPTxzZWNzPgktIHNldCB0aGUgYXV0b21hdGljIG1lbW9yeSBzY2FubmluZyBwZXJpb2QgaW4gc2Vjb25kcwotCQkgIChkZWZhdWx0IDYwMCwgMCB0byBzdG9wIHRoZSBhdXRvbWF0aWMgc2Nhbm5pbmcpCi0gIHNjYW4JCS0gdHJpZ2dlciBhIG1lbW9yeSBzY2FuCi0gIGNsZWFyCQktIGNsZWFyIGxpc3Qgb2YgY3VycmVudCBtZW1vcnkgbGVhayBzdXNwZWN0cywgZG9uZSBieQotCQkgIG1hcmtpbmcgYWxsIGN1cnJlbnQgcmVwb3J0ZWQgdW5yZWZlcmVuY2VkIG9iamVjdHMgZ3JleSwKLQkJICBvciBmcmVlIGFsbCBrbWVtbGVhayBvYmplY3RzIGlmIGttZW1sZWFrIGhhcyBiZWVuIGRpc2FibGVkLgotICBkdW1wPTxhZGRyPgktIGR1bXAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9iamVjdCBmb3VuZCBhdCA8YWRkcj4KLQotS21lbWxlYWsgY2FuIGFsc28gYmUgZGlzYWJsZWQgYXQgYm9vdC10aW1lIGJ5IHBhc3NpbmcgImttZW1sZWFrPW9mZiIgb24KLXRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgotCi1NZW1vcnkgbWF5IGJlIGFsbG9jYXRlZCBvciBmcmVlZCBiZWZvcmUga21lbWxlYWsgaXMgaW5pdGlhbGlzZWQgYW5kCi10aGVzZSBhY3Rpb25zIGFyZSBzdG9yZWQgaW4gYW4gZWFybHkgbG9nIGJ1ZmZlci4gVGhlIHNpemUgb2YgdGhpcyBidWZmZXIKLWlzIGNvbmZpZ3VyZWQgdmlhIHRoZSBDT05GSUdfREVCVUdfS01FTUxFQUtfRUFSTFlfTE9HX1NJWkUgb3B0aW9uLgotCi1JZiBDT05GSUdfREVCVUdfS01FTUxFQUtfREVGQVVMVF9PRkYgYXJlIGVuYWJsZWQsIHRoZSBrbWVtbGVhayBpcwotZGlzYWJsZWQgYnkgZGVmYXVsdC4gUGFzc2luZyAia21lbWxlYWs9b24iIG9uIHRoZSBrZXJuZWwgY29tbWFuZAotbGluZSBlbmFibGVzIHRoZSBmdW5jdGlvbi4gCi0KLUJhc2ljIEFsZ29yaXRobQotLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBtZW1vcnkgYWxsb2NhdGlvbnMgdmlhIGttYWxsb2MsIHZtYWxsb2MsIGttZW1fY2FjaGVfYWxsb2MgYW5kCi1mcmllbmRzIGFyZSB0cmFjZWQgYW5kIHRoZSBwb2ludGVycywgdG9nZXRoZXIgd2l0aCBhZGRpdGlvbmFsCi1pbmZvcm1hdGlvbiBsaWtlIHNpemUgYW5kIHN0YWNrIHRyYWNlLCBhcmUgc3RvcmVkIGluIGEgcmJ0cmVlLgotVGhlIGNvcnJlc3BvbmRpbmcgZnJlZWluZyBmdW5jdGlvbiBjYWxscyBhcmUgdHJhY2tlZCBhbmQgdGhlIHBvaW50ZXJzCi1yZW1vdmVkIGZyb20gdGhlIGttZW1sZWFrIGRhdGEgc3RydWN0dXJlcy4KLQotQW4gYWxsb2NhdGVkIGJsb2NrIG9mIG1lbW9yeSBpcyBjb25zaWRlcmVkIG9ycGhhbiBpZiBubyBwb2ludGVyIHRvIGl0cwotc3RhcnQgYWRkcmVzcyBvciB0byBhbnkgbG9jYXRpb24gaW5zaWRlIHRoZSBibG9jayBjYW4gYmUgZm91bmQgYnkKLXNjYW5uaW5nIHRoZSBtZW1vcnkgKGluY2x1ZGluZyBzYXZlZCByZWdpc3RlcnMpLiBUaGlzIG1lYW5zIHRoYXQgdGhlcmUKLW1pZ2h0IGJlIG5vIHdheSBmb3IgdGhlIGtlcm5lbCB0byBwYXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQKLWJsb2NrIHRvIGEgZnJlZWluZyBmdW5jdGlvbiBhbmQgdGhlcmVmb3JlIHRoZSBibG9jayBpcyBjb25zaWRlcmVkIGEKLW1lbW9yeSBsZWFrLgotCi1UaGUgc2Nhbm5pbmcgYWxnb3JpdGhtIHN0ZXBzOgotCi0gIDEuIG1hcmsgYWxsIG9iamVjdHMgYXMgd2hpdGUgKHJlbWFpbmluZyB3aGl0ZSBvYmplY3RzIHdpbGwgbGF0ZXIgYmUKLSAgICAgY29uc2lkZXJlZCBvcnBoYW4pCi0gIDIuIHNjYW4gdGhlIG1lbW9yeSBzdGFydGluZyB3aXRoIHRoZSBkYXRhIHNlY3Rpb24gYW5kIHN0YWNrcywgY2hlY2tpbmcKLSAgICAgdGhlIHZhbHVlcyBhZ2FpbnN0IHRoZSBhZGRyZXNzZXMgc3RvcmVkIGluIHRoZSByYnRyZWUuIElmCi0gICAgIGEgcG9pbnRlciB0byBhIHdoaXRlIG9iamVjdCBpcyBmb3VuZCwgdGhlIG9iamVjdCBpcyBhZGRlZCB0byB0aGUKLSAgICAgZ3JheSBsaXN0Ci0gIDMuIHNjYW4gdGhlIGdyYXkgb2JqZWN0cyBmb3IgbWF0Y2hpbmcgYWRkcmVzc2VzIChzb21lIHdoaXRlIG9iamVjdHMKLSAgICAgY2FuIGJlY29tZSBncmF5IGFuZCBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBncmF5IGxpc3QpIHVudGlsIHRoZQotICAgICBncmF5IHNldCBpcyBmaW5pc2hlZAotICA0LiB0aGUgcmVtYWluaW5nIHdoaXRlIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgb3JwaGFuIGFuZCByZXBvcnRlZCB2aWEKLSAgICAgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKLQotU29tZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrcyBoYXZlIHBvaW50ZXJzIHN0b3JlZCBpbiB0aGUga2VybmVsJ3MKLWludGVybmFsIGRhdGEgc3RydWN0dXJlcyBhbmQgdGhleSBjYW5ub3QgYmUgZGV0ZWN0ZWQgYXMgb3JwaGFucy4gVG8KLWF2b2lkIHRoaXMsIGttZW1sZWFrIGNhbiBhbHNvIHN0b3JlIHRoZSBudW1iZXIgb2YgdmFsdWVzIHBvaW50aW5nIHRvIGFuCi1hZGRyZXNzIGluc2lkZSB0aGUgYmxvY2sgYWRkcmVzcyByYW5nZSB0aGF0IG5lZWQgdG8gYmUgZm91bmQgc28gdGhhdCB0aGUKLWJsb2NrIGlzIG5vdCBjb25zaWRlcmVkIGEgbGVhay4gT25lIGV4YW1wbGUgaXMgX192bWFsbG9jKCkuCi0KLVRlc3Rpbmcgc3BlY2lmaWMgc2VjdGlvbnMgd2l0aCBrbWVtbGVhawotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVVwb24gaW5pdGlhbCBib290dXAgeW91ciAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhayBvdXRwdXQgcGFnZSBtYXkgYmUKLXF1aXRlIGV4dGVuc2l2ZS4gVGhpcyBjYW4gYWxzbyBiZSB0aGUgY2FzZSBpZiB5b3UgaGF2ZSB2ZXJ5IGJ1Z2d5IGNvZGUKLXdoZW4gZG9pbmcgZGV2ZWxvcG1lbnQuIFRvIHdvcmsgYXJvdW5kIHRoZXNlIHNpdHVhdGlvbnMgeW91IGNhbiB1c2UgdGhlCi0nY2xlYXInIGNvbW1hbmQgdG8gY2xlYXIgYWxsIHJlcG9ydGVkIHVucmVmZXJlbmNlZCBvYmplY3RzIGZyb20gdGhlCi0vc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhayBvdXRwdXQuIEJ5IGlzc3VpbmcgYSAnc2NhbicgYWZ0ZXIgYSAnY2xlYXInCi15b3UgY2FuIGZpbmQgbmV3IHVucmVmZXJlbmNlZCBvYmplY3RzOyB0aGlzIHNob3VsZCBoZWxwIHdpdGggdGVzdGluZwotc3BlY2lmaWMgc2VjdGlvbnMgb2YgY29kZS4KLQotVG8gdGVzdCBhIGNyaXRpY2FsIHNlY3Rpb24gb24gZGVtYW5kIHdpdGggYSBjbGVhbiBrbWVtbGVhayBkbzoKLQotICAjIGVjaG8gY2xlYXIgPiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhawotICAuLi4gdGVzdCB5b3VyIGtlcm5lbCBvciBtb2R1bGVzIC4uLgotICAjIGVjaG8gc2NhbiA+IC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCi0KLVRoZW4gYXMgdXN1YWwgdG8gZ2V0IHlvdXIgcmVwb3J0IHdpdGg6Ci0KLSAgIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKLQotRnJlZWluZyBrbWVtbGVhayBpbnRlcm5hbCBvYmplY3RzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVG8gYWxsb3cgYWNjZXNzIHRvIHByZXZpb3VzbHkgZm91bmQgbWVtb3J5IGxlYWtzIGFmdGVyIGttZW1sZWFrIGhhcyBiZWVuCi1kaXNhYmxlZCBieSB0aGUgdXNlciBvciBkdWUgdG8gYW4gZmF0YWwgZXJyb3IsIGludGVybmFsIGttZW1sZWFrIG9iamVjdHMKLXdvbid0IGJlIGZyZWVkIHdoZW4ga21lbWxlYWsgaXMgZGlzYWJsZWQsIGFuZCB0aG9zZSBvYmplY3RzIG1heSBvY2N1cHkKLWEgbGFyZ2UgcGFydCBvZiBwaHlzaWNhbCBtZW1vcnkuCi0KLUluIHRoaXMgc2l0dWF0aW9uLCB5b3UgbWF5IHJlY2xhaW0gbWVtb3J5IHdpdGg6Ci0KLSAgIyBlY2hvIGNsZWFyID4gL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKLQotS21lbWxlYWsgQVBJCi0tLS0tLS0tLS0tLS0KLQotU2VlIHRoZSBpbmNsdWRlL2xpbnV4L2ttZW1sZWFrLmggaGVhZGVyIGZvciB0aGUgZnVuY3Rpb25zIHByb3RvdHlwZS4KLQota21lbWxlYWtfaW5pdAkJIC0gaW5pdGlhbGl6ZSBrbWVtbGVhawota21lbWxlYWtfYWxsb2MJCSAtIG5vdGlmeSBvZiBhIG1lbW9yeSBibG9jayBhbGxvY2F0aW9uCi1rbWVtbGVha19hbGxvY19wZXJjcHUJIC0gbm90aWZ5IG9mIGEgcGVyY3B1IG1lbW9yeSBibG9jayBhbGxvY2F0aW9uCi1rbWVtbGVha19mcmVlCQkgLSBub3RpZnkgb2YgYSBtZW1vcnkgYmxvY2sgZnJlZWluZwota21lbWxlYWtfZnJlZV9wYXJ0CSAtIG5vdGlmeSBvZiBhIHBhcnRpYWwgbWVtb3J5IGJsb2NrIGZyZWVpbmcKLWttZW1sZWFrX2ZyZWVfcGVyY3B1CSAtIG5vdGlmeSBvZiBhIHBlcmNwdSBtZW1vcnkgYmxvY2sgZnJlZWluZwota21lbWxlYWtfdXBkYXRlX3RyYWNlCSAtIHVwZGF0ZSBvYmplY3QgYWxsb2NhdGlvbiBzdGFjayB0cmFjZQota21lbWxlYWtfbm90X2xlYWsJIC0gbWFyayBhbiBvYmplY3QgYXMgbm90IGEgbGVhawota21lbWxlYWtfaWdub3JlCQkgLSBkbyBub3Qgc2NhbiBvciByZXBvcnQgYW4gb2JqZWN0IGFzIGxlYWsKLWttZW1sZWFrX3NjYW5fYXJlYQkgLSBhZGQgc2NhbiBhcmVhcyBpbnNpZGUgYSBtZW1vcnkgYmxvY2sKLWttZW1sZWFrX25vX3NjYW4JIC0gZG8gbm90IHNjYW4gYSBtZW1vcnkgYmxvY2sKLWttZW1sZWFrX2VyYXNlCQkgLSBlcmFzZSBhbiBvbGQgdmFsdWUgaW4gYSBwb2ludGVyIHZhcmlhYmxlCi1rbWVtbGVha19hbGxvY19yZWN1cnNpdmUgLSBhcyBrbWVtbGVha19hbGxvYyBidXQgY2hlY2tzIHRoZSByZWN1cnNpdmVuZXNzCi1rbWVtbGVha19mcmVlX3JlY3Vyc2l2ZQkgLSBhcyBrbWVtbGVha19mcmVlIGJ1dCBjaGVja3MgdGhlIHJlY3Vyc2l2ZW5lc3MKLQotRGVhbGluZyB3aXRoIGZhbHNlIHBvc2l0aXZlcy9uZWdhdGl2ZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBmYWxzZSBuZWdhdGl2ZXMgYXJlIHJlYWwgbWVtb3J5IGxlYWtzIChvcnBoYW4gb2JqZWN0cykgYnV0IG5vdAotcmVwb3J0ZWQgYnkga21lbWxlYWsgYmVjYXVzZSB2YWx1ZXMgZm91bmQgZHVyaW5nIHRoZSBtZW1vcnkgc2Nhbm5pbmcKLXBvaW50IHRvIHN1Y2ggb2JqZWN0cy4gVG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZmFsc2UgbmVnYXRpdmVzLCBrbWVtbGVhawotcHJvdmlkZXMgdGhlIGttZW1sZWFrX2lnbm9yZSwga21lbWxlYWtfc2Nhbl9hcmVhLCBrbWVtbGVha19ub19zY2FuIGFuZAota21lbWxlYWtfZXJhc2UgZnVuY3Rpb25zIChzZWUgYWJvdmUpLiBUaGUgdGFzayBzdGFja3MgYWxzbyBpbmNyZWFzZSB0aGUKLWFtb3VudCBvZiBmYWxzZSBuZWdhdGl2ZXMgYW5kIHRoZWlyIHNjYW5uaW5nIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQuCi0KLVRoZSBmYWxzZSBwb3NpdGl2ZXMgYXJlIG9iamVjdHMgd3JvbmdseSByZXBvcnRlZCBhcyBiZWluZyBtZW1vcnkgbGVha3MKLShvcnBoYW4pLiBGb3Igb2JqZWN0cyBrbm93biBub3QgdG8gYmUgbGVha3MsIGttZW1sZWFrIHByb3ZpZGVzIHRoZQota21lbWxlYWtfbm90X2xlYWsgZnVuY3Rpb24uIFRoZSBrbWVtbGVha19pZ25vcmUgY291bGQgYWxzbyBiZSB1c2VkIGlmCi10aGUgbWVtb3J5IGJsb2NrIGlzIGtub3duIG5vdCB0byBjb250YWluIG90aGVyIHBvaW50ZXJzIGFuZCBpdCB3aWxsIG5vCi1sb25nZXIgYmUgc2Nhbm5lZC4KLQotU29tZSBvZiB0aGUgcmVwb3J0ZWQgbGVha3MgYXJlIG9ubHkgdHJhbnNpZW50LCBlc3BlY2lhbGx5IG9uIFNNUAotc3lzdGVtcywgYmVjYXVzZSBvZiBwb2ludGVycyB0ZW1wb3JhcmlseSBzdG9yZWQgaW4gQ1BVIHJlZ2lzdGVycyBvcgotc3RhY2tzLiBLbWVtbGVhayBkZWZpbmVzIE1TRUNTX01JTl9BR0UgKGRlZmF1bHRpbmcgdG8gMTAwMCkgcmVwcmVzZW50aW5nCi10aGUgbWluaW11bSBhZ2Ugb2YgYW4gb2JqZWN0IHRvIGJlIHJlcG9ydGVkIGFzIGEgbWVtb3J5IGxlYWsuCi0KLUxpbWl0YXRpb25zIGFuZCBEcmF3YmFja3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIG1haW4gZHJhd2JhY2sgaXMgdGhlIHJlZHVjZWQgcGVyZm9ybWFuY2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gYW5kCi1mcmVlaW5nLiBUbyBhdm9pZCBvdGhlciBwZW5hbHRpZXMsIHRoZSBtZW1vcnkgc2Nhbm5pbmcgaXMgb25seSBwZXJmb3JtZWQKLXdoZW4gdGhlIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrIGZpbGUgaXMgcmVhZC4gQW55d2F5LCB0aGlzIHRvb2wgaXMKLWludGVuZGVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgd2hlcmUgdGhlIHBlcmZvcm1hbmNlIG1pZ2h0IG5vdCBiZSB0aGUKLW1vc3QgaW1wb3J0YW50IHJlcXVpcmVtZW50LgotCi1UbyBrZWVwIHRoZSBhbGdvcml0aG0gc2ltcGxlLCBrbWVtbGVhayBzY2FucyBmb3IgdmFsdWVzIHBvaW50aW5nIHRvIGFueQotYWRkcmVzcyBpbnNpZGUgYSBibG9jaydzIGFkZHJlc3MgcmFuZ2UuIFRoaXMgbWF5IGxlYWQgdG8gYW4gaW5jcmVhc2VkCi1udW1iZXIgb2YgZmFsc2UgbmVnYXRpdmVzLiBIb3dldmVyLCBpdCBpcyBsaWtlbHkgdGhhdCBhIHJlYWwgbWVtb3J5IGxlYWsKLXdpbGwgZXZlbnR1YWxseSBiZWNvbWUgdmlzaWJsZS4KLQotQW5vdGhlciBzb3VyY2Ugb2YgZmFsc2UgbmVnYXRpdmVzIGlzIHRoZSBkYXRhIHN0b3JlZCBpbiBub24tcG9pbnRlcgotdmFsdWVzLiBJbiBhIGZ1dHVyZSB2ZXJzaW9uLCBrbWVtbGVhayBjb3VsZCBvbmx5IHNjYW4gdGhlIHBvaW50ZXIKLW1lbWJlcnMgaW4gdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmVzLiBUaGlzIGZlYXR1cmUgd291bGQgc29sdmUgbWFueSBvZgotdGhlIGZhbHNlIG5lZ2F0aXZlIGNhc2VzIGRlc2NyaWJlZCBhYm92ZS4KLQotVGhlIHRvb2wgY2FuIHJlcG9ydCBmYWxzZSBwb3NpdGl2ZXMuIFRoZXNlIGFyZSBjYXNlcyB3aGVyZSBhbiBhbGxvY2F0ZWQKLWJsb2NrIGRvZXNuJ3QgbmVlZCB0byBiZSBmcmVlZCAoc29tZSBjYXNlcyBpbiB0aGUgaW5pdF9jYWxsIGZ1bmN0aW9ucyksCi10aGUgcG9pbnRlciBpcyBjYWxjdWxhdGVkIGJ5IG90aGVyIG1ldGhvZHMgdGhhbiB0aGUgdXN1YWwgY29udGFpbmVyX29mCi1tYWNybyBvciB0aGUgcG9pbnRlciBpcyBzdG9yZWQgaW4gYSBsb2NhdGlvbiBub3Qgc2Nhbm5lZCBieSBrbWVtbGVhay4KLQotUGFnZSBhbGxvY2F0aW9ucyBhbmQgaW9yZW1hcCBhcmUgbm90IHRyYWNrZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tvX0tSL21lbW9yeS1iYXJyaWVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tvX0tSL21lbW9yeS1iYXJyaWVycy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkM2QzOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24va29fS1IvbWVtb3J5LWJhcnJpZXJzLnR4dApAQCAtMCwwICsxLDMxMzUgQEAKK05PVEU6CitUaGlzIGlzIGEgdmVyc2lvbiBvZiBEb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQgdHJhbnNsYXRlZCBpbnRvIEtvcmVhbi4KK1RoaXMgZG9jdW1lbnQgaXMgbWFpbnRhaW5lZCBieSBTZW9uZ0phZSBQYXJrIDxzajM4LnBhcmtAZ21haWwuY29tPi4KK0lmIHlvdSBmaW5kIGFueSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBkb2N1bWVudCBhbmQgdGhlIG9yaWdpbmFsIGZpbGUgb3IKK2EgcHJvYmxlbSB3aXRoIHRoZSB0cmFuc2xhdGlvbiwgcGxlYXNlIGNvbnRhY3QgdGhlIG1haW50YWluZXIgb2YgdGhpcyBmaWxlLgorCitQbGVhc2UgYWxzbyBub3RlIHRoYXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIGJlIGVhc2llciB0bworcmVhZCBmb3Igbm9uIEVuZ2xpc2ggKHJlYWQ6IEtvcmVhbikgc3BlYWtlcnMgYW5kIGlzIG5vdCBpbnRlbmRlZCBhcworYSBmb3JrLiAgU28gaWYgeW91IGhhdmUgYW55IGNvbW1lbnRzIG9yIHVwZGF0ZXMgZm9yIHRoaXMgZmlsZSBwbGVhc2UKK3VwZGF0ZSB0aGUgb3JpZ2luYWwgRW5nbGlzaCBmaWxlIGZpcnN0LiAgVGhlIEVuZ2xpc2ggdmVyc2lvbiBpcworZGVmaW5pdGl2ZSwgYW5kIHJlYWRlcnMgc2hvdWxkIGxvb2sgdGhlcmUgaWYgdGhleSBoYXZlIGFueSBkb3VidC4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK+ydtCDrrLjshJzripQKK0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dAor7J2YIO2VnOq4gCDrsojsl63snoXri4jri6QuCisKK+yXreyekO+8miDrsJXshLHsnqwgPHNqMzgucGFya0BnbWFpbC5jb20+Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKwkJCSA9PT09PT09PT09PT09PT09PT09PT09PT09CisJCQkg66as64iF7IqkIOy7pOuEkCDrqZTrqqjrpqwg67Cw66as7Ja0CisJCQkgPT09PT09PT09PT09PT09PT09PT09PT09PQorCivsoIDsnpA6IERhdmlkIEhvd2VsbHMgPGRob3dlbGxzQHJlZGhhdC5jb20+CisgICAgICBQYXVsIEUuIE1jS2VubmV5IDxwYXVsbWNrQGxpbnV4LnZuZXQuaWJtLmNvbT4KKyAgICAgIFdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgorICAgICAgUGV0ZXIgWmlqbHN0cmEgPHBldGVyekBpbmZyYWRlYWQub3JnPgorCis9PT09PT09PQor66m07LGF7KGw7ZWtCis9PT09PT09PQorCivsnbQg66y47ISc64qUIOuqheyEuOyEnOqwgCDslYTri5nri4jri6Q7IOydtCDrrLjshJzripQg7JmE67K97ZWY7KeAIOyViuydgOuNsCwg6rCE6rKw7ISx7J2EIOychO2VtCDsnZjrj4TrkJwKK+u2gOu2hOuPhCDsnojqs6AsIOydmOuPhO2VmOynhCDslYrslZjsp4Drp4wg7IKs656M7JeQIOydmO2VtCDsk7DsmIDri6Trs7Tri4gg67aI7JmE7KCE7ZWcIOu2gOu2hOuPhCDsnojsirXri4jri6QuCivsnbQg66y47ISc64qUIOumrOuIheyKpOyXkOyEnCDsoJzqs7XtlZjripQg64uk7JaR7ZWcIOuplOuqqOumrCDrsLDrpqzslrTrk6TsnYQg7IKs7Jqp7ZWY6riwIOychO2VnAor7JWI64K07ISc7J6F64uI64uk66eMLCDrrZTqsIAg7J207IOB7ZWY64ukIOyLtuycvOuptCAo6re465+w6rKMIOunjuydhCDqsoHri4jri6QpIOyniOusuOydhCDrtoDtg4Hrk5zrpr3ri4jri6QuCisKK+uLpOyLnCDrp5DtlZjsp4Drp4wsIOydtCDrrLjshJzripQg66as64iF7Iqk6rCAIO2VmOuTnOybqOyWtOyXkCDquLDrjIDtlZjripQg7IKs7ZWt7JeQIOuMgO2VnCDrqoXshLjshJzqsIAKK+yVhOuLmeuLiOuLpC4KKwor7J20IOusuOyEnOydmCDrqqnsoIHsnYAg65GQ6rCA7KeA7J6F64uI64ukOgorCisgKDEpIOyWtOuWpCDtirnsoJUg67Cw66as7Ja07JeQIOuMgO2VtCDquLDrjIDtlaAg7IiYIOyeiOuKlCDstZzshoztlZzsnZgg6riw64ql7J2EIOuqheyEuO2VmOq4sCDsnITtlbTshJwsCisgICAgIOq3uOumrOqzoAorCisgKDIpIOyCrOyaqSDqsIDriqXtlZwg67Cw66as7Ja065Ok7JeQIOuMgO2VtCDslrTrlrvqsowg7IKs7Jqp7ZW07JW8IO2VmOuKlOyngOyXkCDrjIDtlZwg7JWI64K066W8IOygnOqzte2VmOq4sAorICAgICDsnITtlbTshJwuCisKK+yWtOuWpCDslYTtgqTthY3ss5DripQg7Yq57KCV7ZWcIOuwsOumrOyWtOuTpOyXkCDrjIDtlbTshJzripQg7Jes6riw7IScIOydtOyVvOq4sO2VmOuKlCDstZzshoztlZzsnZgKK+yalOq1rOyCrO2VreuTpOuztOuLpCDrp47snYAg6riw64ql7J2EIOygnOqzte2VoCDsiJjrj4Qg7J6I7Iq164uI64uk66eMLCDsl6zquLDshJwg7J207JW86riw7ZWY64qUCivsmpTqtazsgqztla3rk6TsnYQg7Lap7KGx7ZWY7KeAIOyViuuKlCDslYTtgqTthY3ss5DqsIAg7J6I64uk66m0IOq3uCDslYTtgqTthY3ss5DqsIAg7J6Y66q765CcIOqyg+ydtOuegCDsoJDsnYQKK+yVjOyVhOuRkOyLnOq4sCDrsJTrno3ri4jri6QuCisKK+uYkO2VnCwg7Yq57KCVIOyVhO2CpO2FjeyzkOyXkOyEnCDsnbzrtoAg67Cw66as7Ja064qUIO2VtOuLuSDslYTtgqTthY3ss5DsnZgg7Yq57IiY7ZWcIOuPmeyekSDrsKnsi53snLzroZwg7J247ZW0CivtlbTri7kg67Cw66as7Ja07J2YIOuqheyLnOyggSDsgqzsmqnsnbQg67aI7ZWE7JqU7ZW07IScIG5vLW9wIOydtCDrkKDsiJjrj4Qg7J6I7J2M7J2EIOyVjOyVhOuRkOyLnOq4sAor67CU656N64uI64ukLgorCivsl63snpA6IOuzuCDrsojsl60g7Jet7IucIOyZhOuyve2VmOyngCDslYrsnYDrjbAsIOydtCDsl63si5wg67aA67aE7KCB7Jy866Gc64qUIOydmOuPhOuQnCDqsoPsnbTquLDrj4QKK+2VqeuLiOuLpC4gIOyXrO2DgCDquLDsiKAg66y47ISc65Ok7J20IOq3uOugh+uTryDsmYTrsr3tlZwg7J207ZW066W8IOychO2VtOyEnOuKlCDrsojsl63rrLjqs7wg7JuQ66y47J2EIO2VqOq7mAor7J297Jy87Iuc65CYIOuyiOyXreusuOydhCDtlZjrgpjsnZgg6rCA7J2065Oc66GcIO2ZnOyaqe2VmOyLnOq4uCDstpTsspzrk5zrpqzrqbAsIOuwnOqyrOuQmOuKlCDsmKTsl60g65Ox7JeQCivrjIDtlbTshJzripQg7Ja47KCc65OgIOydmOqyrOydhCDrtoDtg4Hrk5zrpr3ri4jri6QuICDqs7ztlZwg67KI7Jet7Jy866GcIOyduO2VnCDsmKTtlbTrpbwg7LWc7IaM7ZmU7ZWY6riwIOychO2VtAor7JWg66ek7ZWcIOu2gOu2hOydtCDsnojsnYQg6rK97Jqw7JeQ64qUIOyWtOyDie2VqOydtCDsnojrjZTrnbzrj4Qg7JuQ656Y7J2YIOyaqeyWtOulvCDssKjsmqntlanri4jri6QuCisKKworPT09PT0KK+uqqeywqDoKKz09PT09CisKKyAoKikg7LaU7IOBIOuplOuqqOumrCDslaHshLjsiqQg66qo6424LgorCisgICAgIC0g65SU67CU7J207IqkIOyYpO2NvOugiOydtOyFmC4KKyAgICAgLSDrs7TsnqXsgqztla0uCisKKyAoKikg66mU66qo66asIOuwsOumrOyWtOuegCDrrLTsl4fsnbjqsIA/CisKKyAgICAgLSDrqZTrqqjrpqwg67Cw66as7Ja07J2YIOyiheulmC4KKyAgICAgLSDrqZTrqqjrpqwg67Cw66as7Ja07JeQIOuMgO2VtCDqsIDsoJXtlbTshKAg7JWI65CgIOqygy4KKyAgICAgLSDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtC4KKyAgICAgLSDsu6jtirjroaQg7J2Y7KG07ISxLgorICAgICAtIFNNUCDrsLDrpqzslrQg7Ked66ee7LaU6riwLgorICAgICAtIOuplOuqqOumrCDrsLDrpqzslrQg7Iuc7YCA7Iqk7J2YIOyYiC4KKyAgICAgLSDsnb3quLAg66mU66qo66asIOuwsOumrOyWtCB2cyDroZzrk5wg7JiI7LihLgorICAgICAtIOydtO2WieyEsQorCisgKCopIOuqheyLnOyggSDsu6TrhJAg67Cw66as7Ja0LgorCisgICAgIC0g7Lu07YyM7J2865+sIOuwsOumrOyWtC4KKyAgICAgLSBDUFUg66mU66qo66asIOuwsOumrOyWtC4KKyAgICAgLSBNTUlPIOyTsOq4sCDrsLDrpqzslrQuCisKKyAoKikg7JWU66y17KCBIOy7pOuEkCDrqZTrqqjrpqwg67Cw66as7Ja0LgorCisgICAgIC0g6529IEFjcXVpc2l0aW9uIO2VqOyImC4KKyAgICAgLSDsnbjthLDrn73tirgg67mE7Zmc7ISx7ZmUIO2VqOyImC4KKyAgICAgLSDsiqzrpr3qs7wg7Juo7J207YGs7JeFIO2VqOyImC4KKyAgICAgLSDqt7jsmbjsnZgg7ZWo7IiY65OkLgorCisgKCopIENQVSDqsIQgQUNRVUlSSU5HIOuwsOumrOyWtOydmCDtmqjqs7wuCisKKyAgICAgLSBBY3F1aXJlIHZzIOuplOuqqOumrCDslaHshLjsiqQuCisgICAgIC0gQWNxdWlyZSB2cyBJL08g7JWh7IS47IqkLgorCisgKCopIOuplOuqqOumrCDrsLDrpqzslrTqsIAg7ZWE7JqU7ZWcIOqzsworCisgICAgIC0g7ZSE66Gc7IS47ISc6rCEIOyDge2YuCDsnpHsmqkuCisgICAgIC0g7Ja07Yag66+5IOyYpO2NvOugiOydtOyFmC4KKyAgICAgLSDrlJTrsJTsnbTsiqQg7JWh7IS47IqkLgorICAgICAtIOyduO2EsOufve2KuC4KKworICgqKSDsu6TrhJAgSS9PIOuwsOumrOyWtOydmCDtmqjqs7wuCisKKyAoKikg6rCA7KCV65CY64qUIOqwgOyepSDsmYTtmZTrkJwg7Iuk7ZaJIOyInOyEnCDrqqjrjbguCisKKyAoKikgQ1BVIOy6kOyLnOydmCDsmIHtlqUuCisKKyAgICAgLSDsupDsi5wg7J286rSA7ISxLgorICAgICAtIOy6kOyLnCDsnbzqtIDshLEgdnMgRE1BLgorICAgICAtIOy6kOyLnCDsnbzqtIDshLEgdnMgTU1JTy4KKworICgqKSBDUFUg65Ok7J20IOyggOyngOultOuKlCDsnbzrk6QuCisKKyAgICAgLSDqt7jrpqzqs6AsIEFscGhhIOqwgCDsnojri6QuCisgICAgIC0g6rCA7IOBIOuouOyLoCDqsozsiqTtirguCisKKyAoKikg7IKs7JqpIOyYiC4KKworICAgICAtIOyInO2ZmOyLnSDrsoTtjbwuCisKKyAoKikg7LC46rOgIOusuO2XjC4KKworCis9PT09PT09PT09PT09PT09PT09PT09PQor7LaU7IOBIOuplOuqqOumrCDslaHshLjsiqQg66qo6424Cis9PT09PT09PT09PT09PT09PT09PT09PQorCivri6TsnYzqs7wg6rCZ7J20IOy2lOyDge2ZlOuQnCDsi5zsiqTthZwg66qo64247J2EIOyDneqwge2VtCDrtIXsi5zri6Q6CisKKwkJICAgICAgICAgICAgOiAgICAgICAgICAgICAgICA6CisJCSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgOgorCQkgICAgICAgICAgICA6ICAgICAgICAgICAgICAgIDoKKwkJKy0tLS0tLS0rICAgOiAgICstLS0tLS0tLSsgICA6ICAgKy0tLS0tLS0rCisJCXwgICAgICAgfCAgIDogICB8ICAgICAgICB8ICAgOiAgIHwgICAgICAgfAorCQl8ICAgICAgIHwgICA6ICAgfCAgICAgICAgfCAgIDogICB8ICAgICAgIHwKKwkJfCBDUFUgMSB8PC0tLS0tPnwgTWVtb3J5IHw8LS0tLS0+fCBDUFUgMiB8CisJCXwgICAgICAgfCAgIDogICB8ICAgICAgICB8ICAgOiAgIHwgICAgICAgfAorCQl8ICAgICAgIHwgICA6ICAgfCAgICAgICAgfCAgIDogICB8ICAgICAgIHwKKwkJKy0tLS0tLS0rICAgOiAgICstLS0tLS0tLSsgICA6ICAgKy0tLS0tLS0rCisJCSAgICBeICAgICAgIDogICAgICAgXiAgICAgICAgOiAgICAgICBeCisJCSAgICB8ICAgICAgIDogICAgICAgfCAgICAgICAgOiAgICAgICB8CisJCSAgICB8ICAgICAgIDogICAgICAgfCAgICAgICAgOiAgICAgICB8CisJCSAgICB8ICAgICAgIDogICAgICAgdiAgICAgICAgOiAgICAgICB8CisJCSAgICB8ICAgICAgIDogICArLS0tLS0tLS0rICAgOiAgICAgICB8CisJCSAgICB8ICAgICAgIDogICB8ICAgICAgICB8ICAgOiAgICAgICB8CisJCSAgICB8ICAgICAgIDogICB8ICAgICAgICB8ICAgOiAgICAgICB8CisJCSAgICArLS0tLS0tLS0tLT58IERldmljZSB8PC0tLS0tLS0tLS0rCisJCSAgICAgICAgICAgIDogICB8ICAgICAgICB8ICAgOgorCQkgICAgICAgICAgICA6ICAgfCAgICAgICAgfCAgIDoKKwkJICAgICAgICAgICAgOiAgICstLS0tLS0tLSsgICA6CisJCSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgOgorCivtlITroZzqt7jrnqjsnYAg7Jes65+sIOuplOuqqOumrCDslaHshLjsiqQg7Jik7Y2866CI7J207IWY7J2EIOuwnOyDneyLnO2CpOqzoCwg6rCB6rCB7J2YIENQVSDripQg6re465+wCivtlITroZzqt7jrnqjrk6TsnYQg7Iuk7ZaJ7ZWp64uI64ukLiAg7LaU7IOB7ZmU65CcIENQVSDrqqjrjbjsl5DshJwg66mU66qo66asIOyYpO2NvOugiOydtOyFmOuTpOydmCDsiJzshJzripQKK+unpOyasCDsmYTtmZTrkJjslrQg7J6I6rOgLCBDUFUg64qUIO2UhOuhnOq3uOueqOydtCDsnbjqs7zqtIDqs4Trpbwg7Ja06riw7KeAIOyViuuKlCDsg4Htg5zroZwg6rSA66as65Cc64uk6rOgCivrs7Tsnbwg7IiY66eMIOyeiOuLpOuptCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY7J2EIOyekOyLoOydtCDsm5DtlZjripQg7Ja065akIOyInOyEnOuMgOuhnOuToCDsnqzrsLDsuZjtlbQKK+uPmeyekeyLnO2CrCDsiJgg7J6I7Iq164uI64ukLiAg67mE7Iq37ZWY6rKMLCDsu7TtjIzsnbzrn6wg65iQ7ZWcIO2UhOuhnOq3uOueqOydmCDsoJXsg4HsoIEg64+Z7J6R7J2EIO2VtOy5mOyngAor7JWK64qUIO2VnOuPhCDrgrTsl5DshJzripQg7Ja065akIOyInOyEnOuhnOuToCDsnpDsi6DsnbQg7JuQ7ZWY64qUIOuMgOuhnCDsnbjsiqTtirjrn63shZjsnYQg7J6s67Cw7LmYIO2VoCDsiJgKK+yeiOyKteuLiOuLpC4KKwor65Sw65287IScIOychOydmCDri6TsnbTslrTqt7jrnqjsl5DshJwg7ZWcIENQVeqwgCDrj5nsnpHsi5ztgqTripQg66mU66qo66asIOyYpO2NvOugiOydtOyFmOydtCDrp4zrk6TslrTrgrTripQKK+uzgO2ZlOuKlCDtlbTri7kg7Jik7Y2866CI7J207IWY7J20IENQVSDsmYAg7Iuc7Iqk7YWc7J2YIOuLpOuluCDrtoDrtoTrk6Qg7IKs7J207J2YIOyduO2EsO2OmOydtOyKpCjsoJDshKAp66W8Civsp4DrgpjqsIDrqbTshJwg7Iuc7Iqk7YWc7J2YIOuCmOuouOyngCDrtoDrtoTrk6Tsl5Ag7J247KeA65Cp64uI64ukLgorCisKK+yYiOulvCDrk6TslrQsIOuLpOydjOydmCDsnbzroKjsnZgg7J2067Kk7Yq465Ok7J2EIOyDneqwge2VtCDrtIXsi5zri6Q6CisKKwlDUFUgMQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09CisJeyBBID09IDE7IEIgPT0gMiB9CisJQSA9IDM7CQl4ID0gQjsKKwlCID0gNDsJCXkgPSBBOworCivri6TsnbTslrTqt7jrnqjsnZgg6rCA7Jq0642w7JeQIOychOy5mO2VnCDrqZTrqqjrpqwg7Iuc7Iqk7YWc7JeQIOuztOyXrOyngOqyjCDrkJjripQg7JWh7IS47Iqk65Ok7J2AIOuLpOydjOydmCDstJ0KKzI06rCc7J2YIOyhsO2VqeycvOuhnCDsnqzqtazshLHrkKAg7IiYIOyeiOyKteuLiOuLpDoKKworCVNUT1JFIEE9MywJU1RPUkUgQj00LAl5PUxPQUQgQS0+MywJeD1MT0FEIEItPjQKKwlTVE9SRSBBPTMsCVNUT1JFIEI9NCwJeD1MT0FEIEItPjQsCXk9TE9BRCBBLT4zCisJU1RPUkUgQT0zLAl5PUxPQUQgQS0+MywJU1RPUkUgQj00LAl4PUxPQUQgQi0+NAorCVNUT1JFIEE9MywJeT1MT0FEIEEtPjMsCXg9TE9BRCBCLT4yLAlTVE9SRSBCPTQKKwlTVE9SRSBBPTMsCXg9TE9BRCBCLT4yLAlTVE9SRSBCPTQsCXk9TE9BRCBBLT4zCisJU1RPUkUgQT0zLAl4PUxPQUQgQi0+MiwJeT1MT0FEIEEtPjMsCVNUT1JFIEI9NAorCVNUT1JFIEI9NCwJU1RPUkUgQT0zLAl5PUxPQUQgQS0+MywJeD1MT0FEIEItPjQKKwlTVE9SRSBCPTQsIC4uLgorCS4uLgorCivrlLDrnbzshJwg64uk7J2M7J2YIOuEpOqwgOyngCDsobDtlansnZgg6rCS65Ok7J20IOuCmOyYrCDsiJgg7J6I7Iq164uI64ukOgorCisJeCA9PSAyLCB5ID09IDEKKwl4ID09IDIsIHkgPT0gMworCXggPT0gNCwgeSA9PSAxCisJeCA9PSA0LCB5ID09IDMKKworCivtlZzrsJwg642UIOuCmOyVhOqwgOyEnCwg7ZWcIENQVSDqsIAg66mU66qo66asIOyLnOyKpO2FnOyXkCDrsJjsmIHtlZwg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOuTpOydmCDqsrDqs7zripQKK+uLpOuluCBDUFUg7JeQ7ISc7J2YIOuhnOuTnCDsmKTtjbzroIjsnbTshZjsnYQg7Ya17ZW0IOyduOyngOuQmOuKlOuNsCwg7J20IOuVjCDsiqTthqDslrTqsIAg67CY7JiB65CcIOyInOyEnOyZgAor64uk66W4IOyInOyEnOuhnCDsnbjsp4DrkKAg7IiY64+EIOyeiOyKteuLiOuLpC4KKworCivsmIjroZwsIOyVhOuemOydmCDsnbzroKjsnZgg7J2067Kk7Yq465Ok7J2EIOyDneqwge2VtCDrtIXsi5zri6Q6CisKKwlDUFUgMQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09CisJeyBBID09IDEsIEIgPT0gMiwgQyA9PSAzLCBQID09ICZBLCBRID09ICZDIH0KKwlCID0gNDsJCVEgPSBQOworCVAgPSAmQgkJRCA9ICpROworCitEIOuhnCDsnb3tmIDsp4DripQg6rCS7J2AIENQVSAyIOyXkOyEnCBQIOuhnOu2gO2EsCDsnb3tmIDsp4Qg7KO87IaM6rCS7JeQIOydmOyhtOyggeydtOq4sCDrlYzrrLjsl5Ag7Jes6riw7JeUCivrtoTrqoXtlZwg642w7J207YSwIOydmOyhtOyEseydtCDsnojsirXri4jri6QuICDtlZjsp4Drp4wg7J20IOydtOuypO2KuOuTpOydmCDsi6Ttlokg6rKw6rO866Gc64qUIOyVhOuemOydmAor6rKw6rO865Ok7J20IOuqqOuRkCDrgpjtg4DrgqAg7IiYIOyeiOyKteuLiOuLpDoKKworCShRID09ICZBKSBhbmQgKEQgPT0gMSkKKwkoUSA9PSAmQikgYW5kIChEID09IDIpCisJKFEgPT0gJkIpIGFuZCAoRCA9PSA0KQorCitDUFUgMiDripQgKlEg7J2YIOuhnOuTnOulvCDsmpTssq3tlZjquLAg7KCE7JeQIFAg66W8IFEg7JeQIOuEo+q4sCDrlYzrrLjsl5AgRCDsl5AgQyDrpbwg7KeR7Ja064Sj64qUCivsnbzsnYAg7JeG7J2M7J2EIOyVjOyVhOuRkOyEuOyalC4KKworCivrlJTrsJTsnbTsiqQg7Jik7Y2866CI7J207IWYCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK+ydvOu2gCDrlJTrsJTsnbTsiqTripQg7J6Q7Iug7J2YIOy7qO2KuOuhpCDsnbjthLDtjpjsnbTsiqTrpbwg66mU66qo66as7J2YIO2KueyglSDsmIHsl63snLzroZwg66ek7ZWR7ZW07IScCivsoJzqs7XtlZjripTrjbAoTWVtb3J5IG1hcHBlZCBJL08pLCDtlbTri7kg7Luo7Yq466GkIOugiOyngOyKpO2EsOyXkCDsoJHqt7ztlZjripQg7Iic7ISc64qUIOunpOyasAor7KSR7JqU7ZWp64uI64ukLiAg7JiI66W8IOuTpOyWtCwg7Ja065Oc66CI7IqkIO2PrO2KuCDroIjsp4DsiqTthLAgKEEpIOyZgCDrjbDsnbTthLAg7Y+s7Yq4IOugiOyngOyKpO2EsCAoRCkKK+ulvCDthrXtlbQg7KCR6re865CY64qUIOuCtOu2gCDroIjsp4DsiqTthLAg7KeR7ZWp7J2EIOqwluuKlCDsnbTrjZTrhLcg7Lm065Oc66W8IOyDneqwge2VtCDrtIXsi5zri6QuICDrgrTrtoDsnZgKKzXrsogg66CI7KeA7Iqk7YSw66W8IOydveq4sCDsnITtlbQg64uk7J2M7J2YIOy9lOuTnOqwgCDsgqzsmqnrkKAg7IiYIOyeiOyKteuLiOuLpDoKKworCSpBID0gNTsKKwl4ID0gKkQ7CisKK+2VmOyngOunjCwg7J206rG0IOuLpOydjOydmCDrkZAg7KGw7ZWpIOykkSDtlZjrgpjroZwg66eM65Ok7Ja07KeIIOyImCDsnojsirXri4jri6Q6CisKKwlTVE9SRSAqQSA9IDUsIHggPSBMT0FEICpECisJeCA9IExPQUQgKkQsIFNUT1JFICpBID0gNQorCivrkZDrsojsp7gg7KGw7ZWp7J2AIOuNsOydtO2EsOulvCDsnb3slrTsmKggX+2bhOyXkF8g7KO87IaM66W8IOyEpOygle2VmOuvgOuhnCwg7Jik64+Z7J6R7J2EIOydvOycvO2CrCDqsoHri4jri6QuCisKKwor67O07J6l7IKs7ZWtCistLS0tLS0tLQorCitDUFUg7JeQ6rKMIOq4sOuMgO2VoCDsiJgg7J6I64qUIOy1nOyGjO2VnOydmCDrs7TsnqXsgqztla0g66qH6rCA7KeA6rCAIOyeiOyKteuLiOuLpDoKKworICgqKSDslrTrlqQgQ1BVIOuToCwg7J2Y7KG07ISx7J20IOyhtOyerO2VmOuKlCDrqZTrqqjrpqwg7JWh7IS47Iqk65Ok7J2AIO2VtOuLuSBDUFUg7J6Q7Iug7JeQ6rKMCisgICAgIOyeiOyWtOyEnOuKlCDsiJzshJzrjIDroZwg66mU66qo66asIOyLnOyKpO2FnOyXkCDsiJjtlokg7JqU7LKt65Cp64uI64ukLiDspoksIOuLpOydjOyXkCDrjIDtlbTshJw6CisKKwlRID0gUkVBRF9PTkNFKFApOyBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsgRCA9IFJFQURfT05DRSgqUSk7CisKKyAgICAgQ1BVIOuKlCDri6TsnYzqs7wg6rCZ7J2AIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZgg7Iuc7YCA7Iqk66W8IOyImO2WiSDsmpTssq3tlanri4jri6Q6CisKKwlRID0gTE9BRCBQLCBEID0gTE9BRCAqUQorCisgICAgIOq3uOumrOqzoCDqt7gg7Iuc7YCA7IqkIOuCtOyXkOyEnOydmCDsiJzshJzripQg7ZWt7IOBIOyngOy8nOynkeuLiOuLpC4gIOuMgOu2gOu2hOydmCDsi5zsiqTthZzsl5DshJwKKyAgICAgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkg64qUIOyVhOustOydvOuPhCDslYjtlZjsp4Drp4wgREVDIEFscGhhIOyXkOyEnOuKlAorICAgICDrqoXsi5zsoIHsnLzroZwg7IKs7Jqp65CY7Ja07JW8IO2VqeuLiOuLpC4gIOuztO2GteydmCDqsr3smrDsl5DripQgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkKKyAgICAg66W8IOyngeygkSDsgqzsmqntlZjripQg64yA7IugIHJjdV9kZXJlZmVyZW5jZSgpIOqwmeydgCDqsoPrk6TsnYQg7IKs7Jqp7ZW07JW8IO2VqOydhAorICAgICDslYzslYTrkZDshLjsmpQuCisKKyAoKikg7Yq57KCVIENQVSDrgrTsl5DshJwg6rK57LmY64qUIOyYgeyXreydmCDrqZTrqqjrpqzsl5Ag7ZaJ7ZW07KeA64qUIOuhnOuTnOyZgCDsiqTthqDslrQg65Ok7J2AIO2VtOuLuQorICAgICBDUFUg7JWI7JeQ7ISc64qUIOyInOyEnOqwgCDrsJTrgIzsp4Ag7JWK7J2AIOqyg+ycvOuhnCDrs7Tsl6zsp5Hri4jri6QuICDspoksIOuLpOydjOyXkCDrjIDtlbTshJw6CisKKwlhID0gUkVBRF9PTkNFKCpYKTsgV1JJVEVfT05DRSgqWCwgYik7CisKKyAgICAgQ1BVIOuKlCDri6TsnYzsnZgg66mU66qo66asIOyYpO2NvOugiOydtOyFmCDsi5ztgIDsiqTrp4zsnYQg66mU66qo66as7JeQIOyalOyyre2VoCDqsoHri4jri6Q6CisKKwlhID0gTE9BRCAqWCwgU1RPUkUgKlggPSBiCisKKyAgICAg6re466as6rOgIOuLpOydjOyXkCDrjIDtlbTshJzripQ6CisKKwlXUklURV9PTkNFKCpYLCBjKTsgZCA9IFJFQURfT05DRSgqWCk7CisKKyAgICAgQ1BVIOuKlCDri6TsnYzsnZgg7IiY7ZaJIOyalOyyreunjOydhCDrp4zrk6TslrQg64OF64uI64ukOgorCisJU1RPUkUgKlggPSBjLCBkID0gTE9BRCAqWAorCisgICAgICjroZzrk5wg7Jik7Y2866CI7J207IWY6rO8IOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjsnbQg6rK57LmY64qUIOuplOuqqOumrCDsmIHsl63sl5Ag64yA7ZW0CisgICAgIOyImO2WieuQnOuLpOuptCDtlbTri7kg7Jik7Y2866CI7J207IWY65Ok7J2AIOqyuey5nOuLpOqzoCDtkZztmITrkKnri4jri6QpLgorCivqt7jrpqzqs6AgX+uwmOuTnOyLnF8g65iQ64qUIF/soIjrjIDroZxfIOqwgOygle2VmOqxsOuCmCDqsIDsoJXtlZjsp4Ag66eQ7JWE7JW8IO2VmOuKlCDqsoPrk6TsnbQg7J6I7Iq164uI64ukOgorCisgKCopIOy7tO2MjOydvOufrOqwgCBSRUFEX09OQ0UoKSDrgpggV1JJVEVfT05DRSgpIOuhnCDrs7TtmLjrkJjsp4Ag7JWK7J2AIOuplOuqqOumrCDslaHshLjsiqTrpbwKKyAgICAg64u57Iug7J20IOybkO2VmOuKlCDrjIDroZwg7ZWgIOqyg+ydtOudvOuKlCDqsIDsoJXsnYAgX+ygiOuMgOuhnF8g7ZW07ISgIOyViOuQqeuLiOuLpC4gIOq3uOqyg+uTpOydtAorICAgICDsl4bri6TrqbQsIOy7tO2MjOydvOufrOuKlCDsu7TtjIzsnbzrn6wg67Cw66as7Ja0IOyEueyFmOyXkOyEnCDri6Tro6jqsowg65CgLCDrqqjrk6AgIuywveydmOyggeyduCIKKyAgICAg67OA6rK965Ok7J2EIOunjOuTpOyWtOuCvCDqtoztlZzsnYQg6rCW6rKMIOuQqeuLiOuLpC4KKworICgqKSDqsJzrs4TsoIHsnbgg66Gc65Oc7JmAIOyKpO2GoOyWtOuTpOydtCDso7zslrTsp4Qg7Iic7ISc64yA66GcIOyalOyyreuQoCDqsoPsnbTrnbzripQg6rCA7KCV7J2AIF/soIjrjIDroZxfCisgICAgIO2VmOyngCDrp5DslYTslbwg7ZWp64uI64ukLiAg7J20IOunkOydgCDqs6c6CisKKwlYID0gKkE7IFkgPSAqQjsgKkQgPSBaOworCisgICAgIOuKlCDri6TsnYzsnZgg6rKD65OkIOykkSDslrTripAg6rKD7Jy866Gc65OgIOunjOuTpOyWtOyniCDsiJgg7J6I64uk64qUIOydmOuvuOyeheuLiOuLpDoKKworCVggPSBMT0FEICpBLCAgWSA9IExPQUQgKkIsICBTVE9SRSAqRCA9IFoKKwlYID0gTE9BRCAqQSwgIFNUT1JFICpEID0gWiwgWSA9IExPQUQgKkIKKwlZID0gTE9BRCAqQiwgIFggPSBMT0FEICpBLCAgU1RPUkUgKkQgPSBaCisJWSA9IExPQUQgKkIsICBTVE9SRSAqRCA9IFosIFggPSBMT0FEICpBCisJU1RPUkUgKkQgPSBaLCBYID0gTE9BRCAqQSwgIFkgPSBMT0FEICpCCisJU1RPUkUgKkQgPSBaLCBZID0gTE9BRCAqQiwgIFggPSBMT0FEICpBCisKKyAoKikg6rK57LmY64qUIOuplOuqqOumrCDslaHshLjsiqTrk6TsnYAg7ZWp7LOQ7KeA6rGw64KYIOuyhOugpOyniCDsiJgg7J6I7J2M7J2EIF/rsJjrk5zsi5xfIOqwgOygle2VtOyVvAorICAgICDtlanri4jri6QuICDri6TsnYzsnZgg7L2U65Oc64qUOgorCisJWCA9ICpBOyBZID0gKihBICsgNCk7CisKKyAgICAg64uk7J2M7J2YIOqyg+uTpCDspJEg662Q65OgIOuQoCDsiJgg7J6I7Iq164uI64ukOgorCisJWCA9IExPQUQgKkE7IFkgPSBMT0FEICooQSArIDQpOworCVkgPSBMT0FEICooQSArIDQpOyBYID0gTE9BRCAqQTsKKwl7WCwgWX0gPSBMT0FEIHsqQSwgKihBICsgNCkgfTsKKworICAgICDqt7jrpqzqs6A6CisKKwkqQSA9IFg7ICooQSArIDQpID0gWTsKKworICAgICDripQg64uk7J2MIOykkSDrrZDrk6Ag65CgIOyImCDsnojsirXri4jri6Q6CisKKwlTVE9SRSAqQSA9IFg7IFNUT1JFICooQSArIDQpID0gWTsKKwlTVE9SRSAqKEEgKyA0KSA9IFk7IFNUT1JFICpBID0gWDsKKwlTVE9SRSB7KkEsICooQSArIDQpIH0gPSB7WCwgWX07CisKK+q3uOumrOqzoCDrs7TsnqXsgqztla3sl5Ag67CY64yA65CY64qUIOqyg+uTpChhbnRpLWd1YXJhbnRlZXMp7J20IOyeiOyKteuLiOuLpDoKKworICgqKSDsnbQg67O07J6l7IKs7ZWt65Ok7J2AIGJpdGZpZWxkIOyXkOuKlCDsoIHsmqnrkJjsp4Ag7JWK64qU642wLCDsu7TtjIzsnbzrn6zrk6TsnYAgYml0ZmllbGQg66W8CisgICAgIOyImOygle2VmOuKlCDsvZTrk5zrpbwg7IOd7ISx7ZWgIOuVjCDsm5DsnpDshLEg7JeG64qUKG5vbi1hdG9taWMpIOydveqzoC3siJjsoJXtlZjqs6At7JOw64qUCisgICAgIOyduOyKpO2KuOufreyFmOuTpOydmCDsobDtlansnYQg66eM65Oc64qUIOqyveyasOqwgCDrp47quLAg65WM66y47J6F64uI64ukLiAg67OR66CsIOyVjOqzoOumrOymmOydmAorICAgICDrj5nquLDtmZTsl5AgYml0ZmllbGQg66W8IOyCrOyaqe2VmOugpCDtlZjsp4Ag66eI7Iut7Iuc7JikLgorCisgKCopIGJpdGZpZWxkIOuTpOydtCDsl6zrn6wg65297Jy866GcIOuztO2YuOuQmOuKlCDqsr3smrDrnbwg7ZWY642U652864+ELCDtlZjrgpjsnZggYml0ZmllbGQg7J2YCisgICAgIOuqqOuToCDtlYTrk5zrk6TsnYAg7ZWY64KY7J2YIOudveycvOuhnCDrs7TtmLjrkJjslrTslbwg7ZWp64uI64ukLiAg66eM7JW9IO2VnCBiaXRmaWVsZCDsnZgg65GQCisgICAgIO2VhOuTnOqwgCDshJzroZwg64uk66W4IOudveycvOuhnCDrs7TtmLjrkJzri6TrqbQsIOy7tO2MjOydvOufrOydmCDsm5DsnpDshLEg7JeG64qUCisgICAgIOydveqzoC3siJjsoJXtlZjqs6At7JOw64qUIOyduOyKpO2KuOufreyFmCDsobDtlansnYAg7ZWcIO2VhOuTnOyXkOydmCDsl4XrjbDsnbTtirjqsIAg6re87LKY7J2YCisgICAgIO2VhOuTnOyXkOuPhCDsmIHtlqXsnYQg64G87LmY6rKMIO2VoCDsiJgg7J6I7Iq164uI64ukLgorCisgKCopIOydtCDrs7TsnqXsgqztla3rk6TsnYAg7KCB7KCI7ZWY6rKMIOygleugrOuQmOqzoCDtgazquLDqsIAg7J6h7Z6MIOyKpOy5vOudvCDrs4DsiJjrk6Tsl5Ag64yA7ZW07ISc66eMCisgICAgIOyggeyaqeuQqeuLiOuLpC4gICLsoIHsoIjtlZjqsowg7YGs6riw6rCAIOyeoe2ejCIg7J2065287ZWo7J2AIO2YhOyerOuhnOyNqOuKlCAiY2hhciIsICJzaG9ydCIsCisgICAgICJpbnQiIOq3uOumrOqzoCAibG9uZyIg6rO8IOqwmeydgCDtgazquLDsnZgg67OA7IiY65Ok7J2EIOydmOuvuO2VqeuLiOuLpC4gICLsoIHsoIjtlZjqsowg7KCV66Cs65CcIgorICAgICDsnYAg7J6Q7Jew7Iqk65+wIOygleugrOydhCDsnZjrr7jtlZjripTrjbAsIOuUsOudvOyEnCAiY2hhciIg7JeQIOuMgO2VtOyEnOuKlCDslYTrrLQg7KCc7JW97J20IOyXhuqzoCwKKyAgICAgInNob3J0IiDsl5Ag64yA7ZW07ISc64qUIDLrsJTsnbTtirgg7KCV66Cs7J2ELCAiaW50IiDsl5DripQgNOuwlOydtO2KuCDsoJXroKzsnYQsIOq3uOumrOqzoAorICAgICAibG9uZyIg7JeQIOuMgO2VtOyEnOuKlCAzMi1iaXQg7Iuc7Iqk7YWc7J247KeAIDY0LWJpdCDsi5zsiqTthZzsnbjsp4Dsl5Ag65Sw6528IDTrsJTsnbTtirgg65iQ64qUCisgICAgIDjrsJTsnbTtirgg7KCV66Cs7J2EIOydmOuvuO2VqeuLiOuLpC4gIOydtCDrs7TsnqXsgqztla3rk6TsnYAgQzExIO2RnOykgOyXkOyEnCDshozqsJzrkJjsl4jsnLzrr4DroZwsCisgICAgIEMxMSDsoITsnZgg7Jik656Y65CcIOy7tO2MjOydvOufrCjsmIjrpbwg65Ok7Ja0LCBnY2MgNC42KSDrpbwg7IKs7Jqp7ZWgIOuVjOyXlCDso7zsnZjtlZjsi5zquLAKKyAgICAg67CU656N64uI64ukLiAg7ZGc7KSA7JeQIOydtCDrs7TsnqXsgqztla3rk6TsnYAgIm1lbW9yeSBsb2NhdGlvbiIg7J2EIOygleydmO2VmOuKlCAzLjE0CisgICAgIOyEueyFmOyXkCDri6TsnYzqs7wg6rCZ7J20IOyEpOuqheuQmOyWtCDsnojsirXri4jri6Q6CisgICAgICjsl63snpA6IOyduOyaqeusuOydtOuvgOuhnCDrsojsl63tlZjsp4Ag7JWK7Iq164uI64ukKQorCisJbWVtb3J5IGxvY2F0aW9uCisJCWVpdGhlciBhbiBvYmplY3Qgb2Ygc2NhbGFyIHR5cGUsIG9yIGEgbWF4aW1hbCBzZXF1ZW5jZQorCQlvZiBhZGphY2VudCBiaXQtZmllbGRzIGFsbCBoYXZpbmcgbm9uemVybyB3aWR0aAorCisJCU5PVEUgMTogVHdvIHRocmVhZHMgb2YgZXhlY3V0aW9uIGNhbiB1cGRhdGUgYW5kIGFjY2VzcworCQlzZXBhcmF0ZSBtZW1vcnkgbG9jYXRpb25zIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aAorCQllYWNoIG90aGVyLgorCisJCU5PVEUgMjogQSBiaXQtZmllbGQgYW5kIGFuIGFkamFjZW50IG5vbi1iaXQtZmllbGQgbWVtYmVyCisJCWFyZSBpbiBzZXBhcmF0ZSBtZW1vcnkgbG9jYXRpb25zLiBUaGUgc2FtZSBhcHBsaWVzCisJCXRvIHR3byBiaXQtZmllbGRzLCBpZiBvbmUgaXMgZGVjbGFyZWQgaW5zaWRlIGEgbmVzdGVkCisJCXN0cnVjdHVyZSBkZWNsYXJhdGlvbiBhbmQgdGhlIG90aGVyIGlzIG5vdCwgb3IgaWYgdGhlIHR3bworCQlhcmUgc2VwYXJhdGVkIGJ5IGEgemVyby1sZW5ndGggYml0LWZpZWxkIGRlY2xhcmF0aW9uLAorCQlvciBpZiB0aGV5IGFyZSBzZXBhcmF0ZWQgYnkgYSBub24tYml0LWZpZWxkIG1lbWJlcgorCQlkZWNsYXJhdGlvbi4gSXQgaXMgbm90IHNhZmUgdG8gY29uY3VycmVudGx5IHVwZGF0ZSB0d28KKwkJYml0LWZpZWxkcyBpbiB0aGUgc2FtZSBzdHJ1Y3R1cmUgaWYgYWxsIG1lbWJlcnMgZGVjbGFyZWQKKwkJYmV0d2VlbiB0aGVtIGFyZSBhbHNvIGJpdC1maWVsZHMsIG5vIG1hdHRlciB3aGF0IHRoZQorCQlzaXplcyBvZiB0aG9zZSBpbnRlcnZlbmluZyBiaXQtZmllbGRzIGhhcHBlbiB0byBiZS4KKworCis9PT09PT09PT09PT09PT09PT09PT09PT09CivrqZTrqqjrpqwg67Cw66as7Ja0656AIOustOyXh+yduOqwgD8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKwor7JWe7JeQ7IScIOu0pOuTr+ydtCwg7IOB7Zi46rCEIOydmOyhtOyEseydtCDsl4bripQg66mU66qo66asIOyYpO2NvOugiOydtOyFmOuTpOydgCDsi6TsoJzroZzripQg66y07J6R7JyE7KCBCivsiJzshJzroZwg7IiY7ZaJ65CgIOyImCDsnojsnLzrqbAsIOydtOuKlCBDUFUg7JmAIENQVSDqsITsnZgg7IOB7Zi47J6R7Jqp7J2064KYIEkvTyDsl5Ag66y47KCc6rCAIOuQoCDsiJgKK+yeiOyKteuLiOuLpC4gIOuUsOudvOyEnCDsu7TtjIzsnbzrn6zsmYAgQ1BVIOqwgCDsiJzshJzrpbwg67CU6r6464qU642wIOygnOyVveydhCDqsbgg7IiYIOyeiOuPhOuhnSDqsJzsnoXtlaAKK+yImCDsnojripQg7Ja065akIOuwqeuyleydtCDtlYTsmpTtlanri4jri6QuCisKK+uplOuqqOumrCDrsLDrpqzslrTripQg6re465+wIOqwnOyehSDsiJjri6jsnoXri4jri6QuICDrqZTrqqjrpqwg67Cw66as7Ja064qUIOuwsOumrOyWtOulvCDsgqzsnbTsl5Ag65GUIOyVnuqzvAor65KkIOyWkey4oeydmCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY65OkIOqwhOyXkCDrtoDrtoTsoIEg7Iic7ISc6rCAIOyhtOyerO2VmOuPhOuhnSDtlZjripQg7Zqo6rO866W8IOykjeuLiOuLpC4KKwor7Iuc7Iqk7YWc7J2YIENQVSDrk6Tqs7wg7Jes65+sIOuUlOuwlOydtOyKpOuTpOydgCDshLHriqXsnYQg7Jis66as6riwIOychO2VtCDrqoXroLnslrQg7J6s67Cw7LmYLCDsi6TtlokKK+ycoOyYiCwg66mU66qo66asIOyYpO2NvOugiOydtOyFmOuTpOydmCDsobDtlaksIOyYiOy4oeyggSDroZzrk5woc3BlY3VsYXRpdmUgbG9hZCksIOu4jOuenOy5mAor7JiI7LihKHNwZWN1bGF0aXZlIGJyYW5jaCBwcmVkaWN0aW9uKSwg64uk7JaR7ZWcIOyiheulmOydmCDsupDsi7EoY2FjaGluZykg65Ox7J2YIOuLpOyWke2VnAor7Yq466at7J2EIOyCrOyaqe2VoCDsiJgg7J6I6riwIOuVjOusuOyXkCDsnbTrn7Ag6rCV7KCc66Cl7J2AIOykkeyalO2VqeuLiOuLpC4gIOuplOuqqOumrCDrsLDrpqzslrTrk6TsnYAg7J2065+wCivtirjrpq3rk6TsnYQg66y07Zqo66GcIO2VmOqxsOuCmCDslrXsoJztlZjripQg66qp7KCB7Jy866GcIOyCrOyaqeuQmOyWtOyguOyEnCDsvZTrk5zqsIAg7Jes65+sIENQVSDsmYAKK+uUlOuwlOydtOyKpOuTpCDqsITsnZgg7IOB7Zi47J6R7Jqp7J2EIOygleyDgeyggeycvOuhnCDsoJzslrTtlaAg7IiYIOyeiOqyjCDtlbTspI3ri4jri6QuCisKKwor66mU66qo66asIOuwsOumrOyWtOydmCDsooXrpZgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK+uplOuqqOumrCDrsLDrpqzslrTripQg64Sk6rCc7J2YIOq4sOuzuCDtg4DsnoXsnLzroZwg67aE66WY65Cp64uI64ukOgorCisgKDEpIOyTsOq4sCAo65iQ64qUIOyKpO2GoOyWtCkg66mU66qo66asIOuwsOumrOyWtC4KKworICAgICDsk7DquLAg66mU66qo66asIOuwsOumrOyWtOuKlCDsi5zsiqTthZzsnZgg64uk66W4IOy7tO2PrOuEjO2KuOuTpOyXkCDtlbTri7kg67Cw66as7Ja067O064ukIOyVnuyEnAorICAgICDrqoXsi5zrkJwg66qo65OgIFNUT1JFIOyYpO2NvOugiOydtOyFmOuTpOydtCDtlbTri7kg67Cw66as7Ja0IOuSpOyXkCDrqoXsi5zrkJwg66qo65OgIFNUT1JFCisgICAgIOyYpO2NvOugiOydtOyFmOuTpOuztOuLpCDrqLzsoIAg7IiY7ZaJ65CcIOqyg+ycvOuhnCDrs7Tsnbwg6rKD7J2EIOuztOyepe2VqeuLiOuLpC4KKworICAgICDsk7DquLAg67Cw66as7Ja064qUIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjrk6Tsl5Ag64yA7ZWcIOu2gOu2hOyggSDsiJzshJwg7IS47Jqw6riw7J6F64uI64ukOyDroZzrk5wKKyAgICAg7Jik7Y2866CI7J207IWY65Ok7JeQIOuMgO2VtOyEnOuKlCDslrTrlqQg7JiB7Zal64+EIOuBvOy5mOyngCDslYrsirXri4jri6QuCisKKyAgICAgQ1BVIOuKlCDsi5zqsITsnZgg7Z2Q66aE7JeQIOuUsOudvCDrqZTrqqjrpqwg7Iuc7Iqk7YWc7JeQIOydvOugqOydmCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY65Ok7J2ECisgICAgIO2VmOuCmOyUqSDsmpTssq3tlbQg7KeR7Ja064Sj7Iq164uI64ukLiAg7JOw6riwIOuwsOumrOyWtCDslZ7snZgg66qo65OgIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjrk6TsnYAKKyAgICAg7JOw6riwIOuwsOumrOyWtCDrkqTsnZgg66qo65OgIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjrk6Trs7Tri6QgX+yVnuyEnF8g7IiY7ZaJ65CgIOqygeuLiOuLpC4KKworICAgICBbIV0g7JOw6riwIOuwsOumrOyWtOuTpOydgCDsnb3quLAg65iQ64qUIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja07JmAIO2VqOq7mCDsp53snYQg66ee7LawCisgICAgIOyCrOyaqeuQmOyWtOyVvOunjCDtlajsnYQg7JWM7JWE65GQ7IS47JqUOyAiU01QIOuwsOumrOyWtCDsp53rp57stpTquLAiIOyEnOu4jOyEueyFmOydhCDssLjqs6DtlZjshLjsmpQuCisKKworICgyKSDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtC4KKworICAgICDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuKlCDsnb3quLAg67Cw66as7Ja07J2YIOuztOuLpCDsmYTtmZTrkJwg7ZiV7YOc7J6F64uI64ukLiAg65GQ6rCc7J2YIOuhnOuTnAorICAgICDsmKTtjbzroIjsnbTshZjsnbQg7J6I6rOgIOuRkOuyiOynuCDqsoPsnbQg7LKr67KI7Ke4IOqyg+ydmCDqsrDqs7zsl5Ag7J2Y7KG07ZWY6rOgIOyeiOydhCDrlYwo7JiIOgorICAgICDrkZDrsojsp7gg66Gc65Oc6rCAIOywuOyhsO2VoCDso7zshozrpbwg7LKr67KI7Ke4IOuhnOuTnOqwgCDsnb3ripQg6rK97JqwKSwg65GQ67KI7Ke4IOuhnOuTnOqwgCDsnb3slrTsmKwKKyAgICAg642w7J207YSw64qUIOyyq+uyiOynuCDroZzrk5zsl5Ag7J2Y7ZW0IOq3uCDso7zshozqsIAg7Ja77Ja07KeA6riwIOyghOyXkCDsl4XrjbDsnbTtirgg65CY7Ja0IOyeiOydjOydhAorICAgICDrs7TsnqXtlZjquLAg7JyE7ZW07IScIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja06rCAIO2VhOyalO2VoCDsiJgg7J6I7Iq164uI64ukLgorCisgICAgIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064qUIOyDge2YuCDsnZjsobTsoIHsnbgg66Gc65OcIOyYpO2NvOugiOydtOyFmOuTpCDsgqzsnbTsnZgg67aA67aE7KCBIOyInOyEnAorICAgICDshLjsmrDquLDsnoXri4jri6Q7IOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjrk6TsnbTrgpgg64+F66a97KCB7J24IOuhnOuTnOuTpCwg65iQ64qUIOykkeuzteuQmOuKlAorICAgICDroZzrk5zrk6Tsl5Ag64yA7ZW07ISc64qUIOyWtOuWpCDsmIHtlqXrj4Qg64G87LmY7KeAIOyViuyKteuLiOuLpC4KKworICAgICAoMSkg7JeQ7IScIOyWuOq4ie2WiOuTr+ydtCwg7Iuc7Iqk7YWc7J2YIENQVSDrk6TsnYAg66mU66qo66asIOyLnOyKpO2FnOyXkCDsnbzroKjsnZgg7Iqk7Yag7Ja0CisgICAgIOyYpO2NvOugiOydtOyFmOuTpOydhCDrjZjsoLgg64Sj6rOgIOyeiOycvOupsCwg6rGw6riw7JeQIOq0gOyLrOydtCDsnojripQg64uk66W4IENQVSDripQg6re4CisgICAgIOyYpO2NvOugiOydtOyFmOuTpOydhCDrqZTrqqjrpqwg7Iuc7Iqk7YWc7J20IOyLpO2Wie2VnCDqsrDqs7zrpbwg7J247KeA7ZWgIOyImCDsnojsirXri4jri6QuICDsnbTsspjrn7wKKyAgICAg64uk66W4IENQVSDsnZgg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOydmCDqsrDqs7zsl5Ag6rSA7Ius7J2EIOuRkOqzoCDsnojripQgQ1BVIOqwgCDsiJjtlokg7JqU7LKt7ZWcCisgICAgIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064qULCDrsLDrpqzslrQg7JWe7J2YIOyWtOuWpCDroZzrk5wg7Jik7Y2866CI7J207IWY7J20IOuLpOuluCBDUFUg7JeQ7IScCisgICAgIOuNmOyguCDrhKPsnYAg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOqzvCDqsJnsnYAg7JiB7Jet7J2EIO2Wpe2WiOuLpOuptCwg6re465+wIOyKpO2GoOyWtAorICAgICDsmKTtjbzroIjsnbTshZjrk6TsnbQg66eM65Ok7Ja064K064qUIOqysOqzvOqwgCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtCDrkqTsnZgg66Gc65OcCisgICAgIOyYpO2NvOugiOydtOyFmOuTpOyXkOqyjOuKlCDrs7Tsnbwg6rKD7J2EIOuztOyepe2VqeuLiOuLpC4KKworICAgICDsnbQg7Iic7IScIOyEuOyasOq4sCDsoJzslb3sl5Ag64yA7ZWcIOq3uOumvOydhCDrs7TquLAg7JyE7ZW07ISgICLrqZTrqqjrpqwg67Cw66as7Ja0IOyLnO2AgOyKpOydmCDsmIgiCisgICAgIOyEnOu4jOyEueyFmOydhCDssLjqs6DtlZjsi5zquLAg67CU656N64uI64ukLgorCisgICAgIFshXSDssqvrsojsp7gg66Gc65Oc64qUIOuwmOuTnOyLnCBf642w7J207YSwXyDsnZjsobTshLHsnYQg6rCA7KC47JW87KeAIOy7qO2KuOuhpCDsnZjsobTshLHsnYQg6rCA7KC47JW8CisgICAgIO2VmOuKlOqyjCDslYTri5jsnYQg7JWM7JWE65GQ7Iut7Iuc7JikLiAg66eM7JW9IOuRkOuyiOynuCDroZzrk5zrpbwg7JyE7ZWcIOyjvOyGjOqwgCDssqvrsojsp7gg66Gc65Oc7JeQCisgICAgIOydmOyhtOyggeydtOyngOunjCDqt7gg7J2Y7KG07ISx7J2AIOyhsOqxtOyggeydtOyngCDqt7gg7KO87IaMIOyekOyytOulvCDqsIDsoLjsmKTripTqsowg7JWE64uI652866m0LAorICAgICDqt7jqsoPsnYAgX+y7qO2KuOuhpF8g7J2Y7KG07ISx7J206rOgLCDsnbQg6rK97Jqw7JeQ64qUIOydveq4sCDrsLDrpqzslrTrgpgg6re467O064ukIOqwleugpe2VnAorICAgICDrrLTslrjqsIDqsIAg7ZWE7JqU7ZWp64uI64ukLiAg642UIOyekOyEuO2VnCDrgrTsmqnsnYQg7JyE7ZW07ISc64qUICLsu6jtirjroaQg7J2Y7KG07ISxIiDshJzruIzshLnshZjsnYQKKyAgICAg7LC46rOg7ZWY7Iuc6riwIOuwlOuejeuLiOuLpC4KKworICAgICBbIV0g642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTripQg67O07Ya1IOyTsOq4sCDrsLDrpqzslrTrk6Tqs7wg7ZWo6ruYIOynneydhCDrp57strAg7IKs7Jqp65CY7Ja07JW8CisgICAgIO2VqeuLiOuLpDsgIlNNUCDrsLDrpqzslrQg7Ked66ee7LaU6riwIiDshJzruIzshLnshZjsnYQg7LC46rOg7ZWY7IS47JqULgorCisKKyAoMykg7J296riwICjrmJDripQg66Gc65OcKSDrqZTrqqjrpqwg67Cw66as7Ja0LgorCisgICAgIOydveq4sCDrsLDrpqzslrTripQg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrQg6riw64ql7J2YIOuztOyepeyCrO2VreyXkCDrjZTtlbTshJwg67Cw66as7Ja067O064ukCisgICAgIOyVnuyEnCDrqoXsi5zrkJwg66qo65OgIExPQUQg7Jik7Y2866CI7J207IWY65Ok7J20IOuwsOumrOyWtCDrkqTsl5Ag66qF7Iuc65CY64qUIOuqqOuToCBMT0FECisgICAgIOyYpO2NvOugiOydtOyFmOuTpOuztOuLpCDrqLzsoIAg7ZaJ7ZW07KeEIOqyg+ycvOuhnCDsi5zsiqTthZzsnZgg64uk66W4IOy7tO2PrOuEjO2KuOuTpOyXkCDrs7Tsl6zsp4gg6rKD7J2ECisgICAgIOuztOyepe2VqeuLiOuLpC4KKworICAgICDsnb3quLAg67Cw66as7Ja064qUIOuhnOuTnCDsmKTtjbzroIjsnbTshZjsl5Ag7ZaJ7ZW07KeA64qUIOu2gOu2hOyggSDsiJzshJwg7IS47Jqw6riw7J6F64uI64ukOyDsiqTthqDslrQKKyAgICAg7Jik7Y2866CI7J207IWY7JeQIOuMgO2VtOyEnOuKlCDslrTrlqQg7JiB7Zal64+EIOuBvOy5mOyngCDslYrsirXri4jri6QuCisKKyAgICAg7J296riwIOuplOuqqOumrCDrsLDrpqzslrTripQg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTrpbwg64K07J6l7ZWY66+A66GcIOuNsOydtO2EsCDsnZjsobTshLEKKyAgICAg67Cw66as7Ja066W8IOuMgOyLoO2VoCDsiJgg7J6I7Iq164uI64ukLgorCisgICAgIFshXSDsnb3quLAg67Cw66as7Ja064qUIOydvOuwmOyggeycvOuhnCDsk7DquLAg67Cw66as7Ja065Ok6rO8IO2VqOq7mCDsp53snYQg66ee7LawIOyCrOyaqeuQmOyWtOyVvAorICAgICDtlanri4jri6Q7ICJTTVAg67Cw66as7Ja0IOynneunnuy2lOq4sCIg7ISc67iM7IS57IWY7J2EIOywuOqzoO2VmOyEuOyalC4KKworCisgKDQpIOuylOyaqSDrqZTrqqjrpqwg67Cw66as7Ja0LgorCisgICAgIOuylOyaqShnZW5lcmFsKSDrqZTrqqjrpqwg67Cw66as7Ja064qUIOuwsOumrOyWtOuztOuLpCDslZ7shJwg66qF7Iuc65CcIOuqqOuToCBMT0FEIOyZgCBTVE9SRQorICAgICDsmKTtjbzroIjsnbTshZjrk6TsnbQg67Cw66as7Ja0IOuSpOyXkCDrqoXsi5zrkJwg66qo65OgIExPQUQg7JmAIFNUT1JFIOyYpO2NvOugiOydtOyFmOuTpOuztOuLpAorICAgICDrqLzsoIAg7IiY7ZaJ65CcIOqyg+ycvOuhnCDsi5zsiqTthZzsnZgg64KY66i47KeAIOy7tO2PrOuEjO2KuOuTpOyXkCDrs7TsnbTqsowg65Co7J2EIOuztOyepe2VqeuLiOuLpC4KKworICAgICDrspTsmqkg66mU66qo66asIOuwsOumrOyWtOuKlCDroZzrk5zsmYAg7Iqk7Yag7Ja0IOuqqOuRkOyXkCDrjIDtlZwg67aA67aE7KCBIOyInOyEnCDshLjsmrDquLDsnoXri4jri6QuCisKKyAgICAg67KU7JqpIOuplOuqqOumrCDrsLDrpqzslrTripQg7J296riwIOuplOuqqOumrCDrsLDrpqzslrQsIOyTsOq4sCDrqZTrqqjrpqwg67Cw66as7Ja0IOuqqOuRkOulvAorICAgICDrgrTsnqXtlZjrr4DroZwsIOuRkCDrsLDrpqzslrTrpbwg66qo65GQIOuMgOyLoO2VoCDsiJgg7J6I7Iq164uI64ukLgorCisKK+q3uOumrOqzoCDrkZDqsJzsnZgg66qF7Iuc7KCB7J207KeAIOyViuydgCDtg4DsnoXsnbQg7J6I7Iq164uI64ukOgorCisgKDUpIEFDUVVJUkUg7Jik7Y2866CI7J207IWYLgorCisgICAgIOydtCDtg4DsnoXsnZgg7Jik7Y2866CI7J207IWY7J2AIOuLqOuwqe2WpeydmCDtiKzqs7zshLEg67Cw66as7Ja07LKY65+8IOuPmeyeke2VqeuLiOuLpC4gIEFDUVVJUkUKKyAgICAg7Jik7Y2866CI7J207IWYIOuSpOydmCDrqqjrk6Ag66mU66qo66asIOyYpO2NvOugiOydtOyFmOuTpOydtCBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmCDtm4Tsl5AKKyAgICAg7J287Ja064KcIOqyg+ycvOuhnCDsi5zsiqTthZzsnZgg64KY66i47KeAIOy7tO2PrOuEjO2KuOuTpOyXkCDrs7TsnbTqsowg65CgIOqyg+ydtCDrs7TsnqXrkKnri4jri6QuCisgICAgIExPQ0sg7Jik7Y2866CI7J207IWY6rO8IHNtcF9sb2FkX2FjcXVpcmUoKSwgc21wX2NvbmRfYWNxdWlyZSgpIOyYpO2NvOugiOydtOyFmOuPhAorICAgICBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmOyXkCDtj6ztlajrkKnri4jri6QuICBzbXBfY29uZF9hY3F1aXJlKCkg7Jik7Y2866CI7J207IWY7J2AIOy7qO2KuOuhpAorICAgICDsnZjsobTshLHqs7wgc21wX3JtYigpIOulvCDsgqzsmqntlbTshJwgQUNRVUlSRSDsnZgg7J2Y66+47KCBIOyalOq1rOyCrO2VrShzZW1hbnRpYynsnYQKKyAgICAg7Lap7KGx7Iuc7YK164uI64ukLgorCisgICAgIEFDUVVJUkUg7Jik7Y2866CI7J207IWYIOyVnuydmCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY65Ok7J2AIEFDUVVJUkUg7Jik7Y2866CI7J207IWYIOyZhOujjCDtm4Tsl5AKKyAgICAg7IiY7ZaJ65CcIOqyg+yymOufvCDrs7Tsnbwg7IiYIOyeiOyKteuLiOuLpC4KKworICAgICBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmOydgCDqsbDsnZgg7ZWt7IOBIFJFTEVBU0Ug7Jik7Y2866CI7J207IWY6rO8IOynneydhCDsp4DslrQg7IKs7Jqp65CY7Ja07JW8CisgICAgIO2VqeuLiOuLpC4KKworCisgKDYpIFJFTEVBU0Ug7Jik7Y2866CI7J207IWYLgorCisgICAgIOydtCDtg4DsnoXsnZgg7Jik7Y2866CI7J207IWY65Ok64+EIOuLqOuwqe2WpSDtiKzqs7zshLEg67Cw66as7Ja07LKY65+8IOuPmeyeke2VqeuLiOuLpC4gIFJFTEVBU0UKKyAgICAg7Jik7Y2866CI7J207IWYIOyVnuydmCDrqqjrk6Ag66mU66qo66asIOyYpO2NvOugiOydtOyFmOuTpOydgCBSRUxFQVNFIOyYpO2NvOugiOydtOyFmCDsoITsl5Ag7JmE66OM65CcCisgICAgIOqyg+ycvOuhnCDsi5zsiqTthZzsnZgg64uk66W4IOy7tO2PrOuEjO2KuOuTpOyXkCDrs7Tsl6zsp4gg6rKD7J20IOuztOyepeuQqeuLiOuLpC4gIFVOTE9DSyDrpZjsnZgKKyAgICAg7Jik7Y2866CI7J207IWY65Ok6rO8IHNtcF9zdG9yZV9yZWxlYXNlKCkg7Jik7Y2866CI7J207IWY64+EIFJFTEVBU0Ug7Jik7Y2866CI7J207IWY7J2YCisgICAgIOydvOyiheyeheuLiOuLpC4KKworICAgICBSRUxFQVNFIOyYpO2NvOugiOydtOyFmCDrkqTsnZgg66mU66qo66asIOyYpO2NvOugiOydtOyFmOuTpOydgCBSRUxFQVNFIOyYpO2NvOugiOydtOyFmOydtAorICAgICDsmYTro4zrkJjquLAg7KCE7JeQIO2Wie2VtOynhCDqsoPsspjrn7wg67O07J28IOyImCDsnojsirXri4jri6QuCisKKyAgICAgQUNRVUlSRSDsmYAgUkVMRUFTRSDsmKTtjbzroIjsnbTshZjsnZgg7IKs7Jqp7J2AIOydvOuwmOyggeycvOuhnCDri6Trpbgg66mU66qo66asIOuwsOumrOyWtOydmAorICAgICDtlYTsmpTshLHsnYQg7JeG7JWx64uI64ukICjtlZjsp4Drp4wgIk1NSU8g7JOw6riwIOuwsOumrOyWtCIg7ISc67iM7IS57IWY7JeQ7IScIOyEpOuqheuQmOuKlCDsmIjsmbjrpbwKKyAgICAg7JWM7JWE65GQ7IS47JqUKS4gIOuYkO2VnCwgUkVMRUFTRStBQ1FVSVJFIOyhsO2VqeydgCDrspTsmqkg66mU66qo66asIOuwsOumrOyWtOyymOufvCDrj5nsnpHtlaAKKyAgICAg6rKD7J2EIOuztOyepe2VmOyngCAt7JWK7Iq164uI64ukLS4gIO2VmOyngOunjCwg7Ja065akIOuzgOyImOyXkCDrjIDtlZwgUkVMRUFTRSDsmKTtjbzroIjsnbTshZjsnYQKKyAgICAg7JWe7ISc64qUIOuplOuqqOumrCDslaHshLjsiqTrk6TsnZgg7IiY7ZaJIOqysOqzvOuKlCDsnbQgUkVMRUFTRSDsmKTtjbzroIjsnbTshZjsnYQg65Kk7J207Ja0IOqwmeydgAorICAgICDrs4DsiJjsl5Ag64yA7ZW0IOyImO2WieuQnCBBQ1FVSVJFIOyYpO2NvOugiOydtOyFmOydhCDrkqTrlLDrpbTripQg66mU66qo66asIOyVoeyEuOyKpOyXkOuKlCDrs7Tsl6zsp4gKKyAgICAg6rKD7J20IOuztOyepeuQqeuLiOuLpC4gIOuLpOultOqyjCDrp5DtlZjsnpDrqbQsIOyjvOyWtOynhCDrs4DsiJjsnZgg7YGs66as7Yuw7LusIOyEueyFmOyXkOyEnOuKlCwg7ZW064u5CisgICAgIOuzgOyImOyXkCDrjIDtlZwg7JWe7J2YIO2BrOumrO2LsOy7rCDshLnshZjsl5DshJzsnZgg66qo65OgIOyVoeyEuOyKpOuTpOydtCDsmYTro4zrkJjsl4jsnYQg6rKD7J2ECisgICAgIOuztOyepe2VqeuLiOuLpC4KKworICAgICDspoksIEFDUVVJUkUg64qUIOy1nOyGjO2VnOydmCAi7Leo65OdIiDrj5nsnpHsspjrn7wsIOq3uOumrOqzoCBSRUxFQVNFIOuKlCDstZzshoztlZzsnZggIuqzteqwnCIKKyAgICAg7LKY65+8IOuPmeyeke2VnOuLpOuKlCDsnZjrr7jsnoXri4jri6QuCisKK2F0b21pY19vcHMudHh0IOyXkOyEnCDshKTrqoXrkJjripQg7Ja07Yag66+5IOyYpO2NvOugiOydtOyFmOuTpCDspJHsl5DripQg7JmE7KCE7Z6IIOyInOyEnOyeoe2ejCDqsoPrk6Tqs7wKKyjrsLDrpqzslrTrpbwg7IKs7Jqp7ZWY7KeAIOyViuuKlCkg7JmE7ZmU65CcIOyInOyEnOydmCDqsoPrk6Qg7Jm47JeQIEFDUVVJUkUg7JmAIFJFTEVBU0Ug67aA66WY7J2YCivqsoPrk6Trj4Qg7KG07J6s7ZWp64uI64ukLiAg66Gc65Oc7JmAIOyKpO2GoOyWtOulvCDrqqjrkZAg7IiY7ZaJ7ZWY64qUIOyhsO2VqeuQnCDslrTthqDrr7kg7Jik7Y2866CI7J207IWY7JeQ7IScLAorQUNRVUlSRSDripQg7ZW064u5IOyYpO2NvOugiOydtOyFmOydmCDroZzrk5wg67aA67aE7JeQ66eMIOyggeyaqeuQmOqzoCBSRUxFQVNFIOuKlCDtlbTri7kKK+yYpO2NvOugiOydtOyFmOydmCDsiqTthqDslrQg67aA67aE7JeQ66eMIOyggeyaqeuQqeuLiOuLpC4KKwor66mU66qo66asIOuwsOumrOyWtOuTpOydgCDrkZAgQ1BVIOqwhCwg65iQ64qUIENQVSDsmYAg65SU67CU7J207IqkIOqwhOyXkCDsg4HtmLjsnpHsmqnsnZgg6rCA64ql7ISx7J20IOyeiOydhAor65WM7JeQ66eMIO2VhOyalO2VqeuLiOuLpC4gIOunjOyVvSDslrTrlqQg7L2U65Oc7JeQIOq3uOufsCDsg4HtmLjsnpHsmqnsnbQg7JeG7J2EIOqyg+ydtCDrs7TsnqXrkJzri6TrqbQsIO2VtOuLuQor7L2U65Oc7JeQ7ISc64qUIOuplOuqqOumrCDrsLDrpqzslrTrpbwg7IKs7Jqp7ZWgIO2VhOyalOqwgCDsl4bsirXri4jri6QuCisKKwor7J206rKD65Ok7J2AIF/stZzshoztlZzsnZhfIOuztOyepeyCrO2VreuTpOyehOydhCDslYzslYTrkZDshLjsmpQuICDri6Trpbgg7JWE7YKk7YWN7LOQ7JeQ7ISc64qUIOuNlCDqsJXroKXtlZwKK+uztOyepeyCrO2VreydhCDsoJzqs7XtlaAg7IiY64+EIOyeiOyKteuLiOuLpOunjCwg6re465+wIOuztOyepeyCrO2VreydgCDslYTtgqTthY3ss5Ag7KKF7IaN7KCBIOy9lOuTnCDsnbTsmbjsnZgKK+u2gOu2hOyXkOyEnOuKlCDsi6DrorDrkJjsp4AgX+yViuydhF8g6rKB64uI64ukLgorCisKK+uplOuqqOumrCDrsLDrpqzslrTsl5Ag64yA7ZW0IOqwgOygle2VtOyEoCDslYjrkKAg6rKDCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK+umrOuIheyKpCDsu6TrhJAg66mU66qo66asIOuwsOumrOyWtOuTpOydtCDrs7TsnqXtlZjsp4Ag7JWK64qUIOqyg+uTpOydtCDsnojsirXri4jri6Q6CisKKyAoKikg66mU66qo66asIOuwsOumrOyWtCDslZ7sl5DshJwg66qF7Iuc65CcIOyWtOuWpCDrqZTrqqjrpqwg7JWh7IS47Iqk64+EIOuplOuqqOumrCDrsLDrpqzslrQg66qF66C57J2YIOyImO2WiQorICAgICDsmYTro4wg7Iuc7KCQ6rmM7KeAIF/smYTro4xfIOuQoCDqsoPsnbTrnoAg67O07J6l7J2AIOyXhuyKteuLiOuLpDsg67Cw66as7Ja06rCAIO2VmOuKlCDsnbzsnYAgQ1BVIOydmAorICAgICDslaHshLjsiqQg7YGQ7JeQIO2KueyglSDtg4DsnoXsnZgg7JWh7IS47Iqk65Ok7J2AIOuEmOydhCDsiJgg7JeG64qUIOyEoOydhCDquIvripQg6rKD7Jy866GcIOyDneqwgeuQoCDsiJgKKyAgICAg7J6I7Iq164uI64ukLgorCisgKCopIO2VnCBDUFUg7JeQ7IScIOuplOuqqOumrCDrsLDrpqzslrTrpbwg7IiY7ZaJ7ZWY64qU6rKMIOyLnOyKpO2FnOydmCDri6TrpbggQ1BVIOuCmCDtlZjrk5zsm6jslrTsl5AKKyAgICAg7Ja065akIOyngeygkeyggeyduCDsmIHtlqXsnYQg64G87Lmc64uk64qUIOuztOyepeydgCDsobTsnqztlZjsp4Ag7JWK7Iq164uI64ukLiAg67Cw66as7Ja0IOyImO2WieydtAorICAgICDrp4zrk5zripQg6rCE7KCR7KCBIOyYge2WpeydgCDrkZDrsojsp7ggQ1BVIOqwgCDssqvrsojsp7ggQ1BVIOydmCDslaHshLjsiqTrk6TsnZgg6rKw6rO866W8CisgICAgIOuwlOudvOuztOuKlCDsiJzshJzqsIAg65Cp64uI64uk66eMLCDri6TsnYwg7ZWt66qp7J2EIOuztOyEuOyalDoKKworICgqKSDssqvrsojsp7ggQ1BVIOqwgCDrkZDrsojsp7ggQ1BVIOydmCDrqZTrqqjrpqwg7JWh7IS47Iqk65Ok7J2YIOqysOqzvOulvCDrsJTrnbzrs7wg65WMLCBf7ISk66C5XworICAgICDrkZDrsojsp7ggQ1BVIOqwgCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOyCrOyaqe2VnOuLpCDtlbTrj4QsIOyyq+uyiOynuCBDUFUgX+uYkO2VnF8g6re47JeQIOunnuuKlAorICAgICDrqZTrqqjrpqwg67Cw66as7Ja066W8IOyCrOyaqe2VmOyngCDslYrripTri6TrqbQgKCJTTVAg67Cw66as7Ja0IOynneunnuy2lOq4sCIg7ISc67iM7IS57IWY7J2ECisgICAgIOywuOqzoO2VmOyEuOyalCkg6re4IOqysOqzvOqwgCDsmKzrsJTrpbgg7Iic7ISc66GcIOuztOyXrOynhOuLpOuKlCDrs7TsnqXsnYAg7JeG7Iq164uI64ukLgorCisgKCopIENQVSDrsJTquaXsnZgg7ZWY65Oc7Juo7Ja0WypdIOqwgCDrqZTrqqjrpqwg7JWh7IS47Iqk65Ok7J2YIOyInOyEnOulvCDrsJTqvrjsp4Ag7JWK64qU64uk64qUIOuztOyepeydgAorICAgICDsobTsnqztlZjsp4Ag7JWK7Iq164uI64ukLiAgQ1BVIOy6kOyLnCDsnbzqtIDshLEg66mU7Luk64uI7KaY7J2AIOuplOuqqOumrCDrsLDrpqzslrTsnZgg6rCE7KCR7KCBCisgICAgIOyYge2WpeydhCBDUFUg7IKs7J207JeQIOyghO2MjO2VmOq4tCDtlZjsp4Drp4wsIOyInOyEnOuMgOuhnCDsoITtjIztlZjsp4DripQg7JWK7J2EIOyImCDsnojsirXri4jri6QuCisKKwlbKl0g67KE7IqkIOuniOyKpO2EsOungSBETUEg7JmAIOydvOq0gOyEseyXkCDrjIDtlbTshJzripQg64uk7J2M7J2EIOywuOqzoO2VmOyLnOq4sCDrsJTrno3ri4jri6Q6CisKKwkgICAgRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dAorCSAgICBEb2N1bWVudGF0aW9uL0RNQS1BUEktSE9XVE8udHh0CisJICAgIERvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKKworCivrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTsnZgg7IKs7Jqp7JeQIOyeiOyWtCDsp4DsvJzslbwg7ZWY64qUIOyCrO2VreuTpOydgCDslb3qsIQg66+466yY7ZWY6rOgLCDrjbDsnbTthLAKK+ydmOyhtOyEsSDrsLDrpqzslrTqsIAg7IKs7Jqp65CY7Ja07JW8IO2VmOuKlCDsg4Htmanrj4Qg7ZWt7IOBIOuqheuwse2VmOyngOuKlCDslYrsirXri4jri6QuICDshKTrqoXsnYQg7JyE7ZW0Civri6TsnYzsnZgg7J2067Kk7Yq4IOyLnO2AgOyKpOulvCDsg53qsIHtlbQg67SF7Iuc64ukOgorCisJQ1BVIDEJCSAgICAgIENQVSAyCisJPT09PT09PT09PT09PT09CSAgICAgID09PT09PT09PT09PT09PQorCXsgQSA9PSAxLCBCID09IDIsIEMgPT0gMywgUCA9PSAmQSwgUSA9PSAmQyB9CisJQiA9IDQ7CisJPOyTsOq4sCDrsLDrpqzslrQ+CisJV1JJVEVfT05DRShQLCAmQikKKwkJCSAgICAgIFEgPSBSRUFEX09OQ0UoUCk7CisJCQkgICAgICBEID0gKlE7CisKK+yXrOq4sOyXlCDrtoTrqoXtlZwg642w7J207YSwIOydmOyhtOyEseydtCDsobTsnqztlZjrr4DroZwsIOydtCDsi5ztgIDsiqTqsIAg64Gd64Ks7J2EIOuVjCBRIOuKlCAmQSDrmJDripQgJkIKK+ydvCDqsoPsnbTqs6AsIOuUsOudvOyEnDoKKworCShRID09ICZBKSDripQgKEQgPT0gMSkg66W8LAorCShRID09ICZCKSDripQgKEQgPT0gNCkg66W8IOydmOuvuO2VqeuLiOuLpC4KKwor7ZWY7KeA66eMISAgQ1BVIDIg64qUIEIg7J2YIOyXheuNsOydtO2KuOulvCDsnbjsi53tlZjquLAg7KCE7JeQIFAg7J2YIOyXheuNsOydtO2KuOulvCDsnbjsi53tlaAg7IiYIOyeiOqzoCwKK+uUsOudvOyEnCDri6TsnYzsnZgg6rKw6rO86rCAIOqwgOuKpe2VqeuLiOuLpDoKKworCShRID09ICZCKSBhbmQgKEQgPT0gMikgPz8/PworCivsnbTrn7Ag6rKw6rO864qUIOydvOq0gOyEseydtOuCmCDsnbjqs7wg6rSA6rOEIOycoOyngOqwgCDsi6TtjKjtlZwg6rKD7LKY65+8IOuztOydvCDsiJjrj4Qg7J6I6rKg7KeA66eMLAor6re466CH7KeAIOyViuyKteuLiOuLpCwg6re466as6rOgIOydtCDtmITsg4HsnYAgKERFQyBBbHBoYSDsmYAg6rCZ7J2AKSDsl6zrn6wgQ1BVIOyXkOyEnCDsi6TsoJzroZwKK+uwnOqyrOuQoCDsiJgg7J6I7Iq164uI64ukLgorCivsnbQg66y47KCcIOyDge2ZqeydhCDsoJzrjIDroZwg7ZW06rKw7ZWY6riwIOychO2VtCwg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTrgpgg6re467O064ukIOqwle2ZlOuQnAor66y07Ja46rCA6rCAIOyjvOyGjOulvCDsnb3slrTsmKwg65WM7JmAIOuNsOydtO2EsOulvCDsnb3slrTsmKwg65WMIOyCrOydtOyXkCDstpTqsIDrkJjslrTslbzrp4wg7ZWp64uI64ukOgorCisJQ1BVIDEJCSAgICAgIENQVSAyCisJPT09PT09PT09PT09PT09CSAgICAgID09PT09PT09PT09PT09PQorCXsgQSA9PSAxLCBCID09IDIsIEMgPT0gMywgUCA9PSAmQSwgUSA9PSAmQyB9CisJQiA9IDQ7CisJPOyTsOq4sCDrsLDrpqzslrQ+CisJV1JJVEVfT05DRShQLCAmQik7CisJCQkgICAgICBRID0gUkVBRF9PTkNFKFApOworCQkJICAgICAgPOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja0PgorCQkJICAgICAgRCA9ICpROworCivsnbQg67OA6rK97J2AIOyVnuydmCDsspjsnYwg65GQ6rCA7KeAIOqysOqzvCDspJEg7ZWY64KY66eM7J20IOuwnOyDne2VoCDsiJgg7J6I6rOgLCDshLjrsojsp7jsnZgg6rKw6rO864qUCivrsJzsg53tlaAg7IiYIOyXhuuPhOuhnSDtlanri4jri6QuCisKK+uNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064qUIOydmOyhtOyggSDsk7DquLDsl5Ag64yA7ZW07ISc64+EIOyInOyEnOulvCDsnqHslYTspI3ri4jri6Q6CisKKwlDUFUgMQkJICAgICAgQ1BVIDIKKwk9PT09PT09PT09PT09PT0JICAgICAgPT09PT09PT09PT09PT09CisJeyBBID09IDEsIEIgPT0gMiwgQyA9IDMsIFAgPT0gJkEsIFEgPT0gJkMgfQorCUIgPSA0OworCTzsk7DquLAg67Cw66as7Ja0PgorCVdSSVRFX09OQ0UoUCwgJkIpOworCQkJICAgICAgUSA9IFJFQURfT05DRShQKTsKKwkJCSAgICAgIDzrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtD4KKwkJCSAgICAgICpRID0gNTsKKwor7J20IOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064qUIFEg66Gc7J2YIOydveq4sOqwgCAqUSDroZzsnZgg7Iqk7Yag7Ja07JmAIOyInOyEnOulvCDrp57stpTqsowKK+2VtOykjeuLiOuLpC4gIOydtOuKlCDri6TsnYzqs7wg6rCZ7J2AIOqysOqzvOulvCDrp4nsirXri4jri6Q6CisKKwkoUSA9PSAmQikgJiYgKEIgPT0gNCkKKwor7J2065+wIO2MqO2EtOydgCDrk5zrrLzqsowg7IKs7Jqp65CY7Ja07JW8IO2VqOydhCDslYzslYQg65GQ7Iuc6riwIOuwlOuejeuLiOuLpC4gIOustOyXh+uztOuLpOuPhCwg7J2Y7KG07ISxCivsiJzshJwg6rec7LmZ7J2YIOydmOuPhOuKlCDsk7DquLAg7J6R7JeF7J2EIC3smIjrsKktIO2VtOyEnCDqt7jroZwg7J247ZW0IOuwnOyDne2VmOuKlCDruYTsi7wg7LqQ7IucIOuvuOyKpOuPhAor7JeG7JWg66Ck64qUIOqyg+yeheuLiOuLpC4gIOydtCDtjKjthLTsnYAg65Oc66y86rKMIOuwnOyDne2VmOuKlCDsl5Drn6wg7KGw6rG0IOqwmeydgOqyg+uTpOydhCDquLDroZ3tlZjripTrjbAKK+yCrOyaqeuQoCDsiJgg7J6I6rOgLCDsnbTroIfqsowg67Cw66as7Ja066W8IOyCrOyaqe2VtCDsiJzshJzrpbwg7KeA7YKk6rKMIO2VqOycvOuhnOyNqCDqt7jrn7Ag6riw66Gd7J20Civsgqzrnbzsp4DripQg6rKD7J2EIOunieyKteuLiOuLpC4KKworCitbIV0g7IOB64u57Z6IIOu5hOyngeq0gOyggeyduCDsnbQg7IOB7Zmp7J2AIOu2hOumrOuQnCDsupDsi5zrpbwg6rCA7KeEIOq4sOqzhCwg7JiI66W8IOuTpOyWtCDtlZwg7LqQ7IucCivrsYXtgazqsIAg7Ked7IiY67KIIOy6kOyLnCDrnbzsnbjsnYQg7LKY66as7ZWY6rOgIOuLpOuluCDrsYXtgazripQg7ZmA7IiY67KIIOy6kOyLnCDrnbzsnbjsnYQg7LKY66as7ZWY64qUIOq4sOqzhAor65Ox7JeQ7IScIOqwgOyepSDsnpgg67Cc7IOd7ZWp64uI64ukLiAg7Y+s7J247YSwIFAg64qUIO2ZgOyImCDrsojtmLjsnZgg7LqQ7IucIOudvOyduOyXkCDsnojqs6AsIOuzgOyImCBCIOuKlAor7Ked7IiYIOuyiO2YuCDsupDsi5wg65287J247JeQIOyeiOuLpOqzoCDsg53qsIHtlbQg67SF7Iuc64ukLiAg6re465+wIOyDge2DnOyXkOyEnCDsnb3quLAg7J6R7JeF7J2EIO2VmOuKlCBDUFUKK+ydmCDsp53siJjrsogg67GF7YGs64qUIO2VoCDsnbzsnbQg7IyT7JesIOunpOyasCDrsJTsgZjsp4Drp4wg7ZmA7IiY67KIIOuxhe2BrOuKlCDtlaAg7J287J20IOyXhuyWtCDslYTrrLQKK+ydvOuPhCDtlZjsp4Ag7JWK6rOgICDsnojsl4jri6TrqbQsIO2PrOyduO2EsCBQIOuKlCDsg4gg6rCSICgmQikg7J2ELCDqt7jrpqzqs6Ag67OA7IiYIEIg64qUIOyYm+uCoCDqsJIKKygyKSDsnYQg6rCA7KeA6rOgIOyeiOuKlCDsg4Htg5zqsIAg67O07Jes7KeIIOyImOuPhCDsnojsirXri4jri6QuCisKKwor642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTripQg66ek7JqwIOykkeyalO2VnOuNsCwg7JiI66W8IOuTpOyWtCBSQ1Ug7Iuc7Iqk7YWc7JeQ7IScIOq3uOugh+yKteuLiOuLpC4KK2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaCDsnZggcmN1X2Fzc2lnbl9wb2ludGVyKCkg7JmAIHJjdV9kZXJlZmVyZW5jZSgpIOulvAor7LC46rOg7ZWY7IS47JqULiAg7Jes6riw7IScIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064qUIFJDVSDroZwg6rSA66as65CY64qUIO2PrOyduO2EsOydmCDtg4Dqsp/snYQg7ZiE7J6sCivtg4Dqsp/sl5DshJwg7IiY7KCV65CcIOyDiOuhnOyatCDtg4Dqsp/snLzroZwg67CU6r6464qUIOyekeyXheyXkOyEnCDsg4jroZwg7IiY7KCV65CcIO2DgOqyn+ydtCDstIjquLDtmZTqsIAKK+yZhOujjOuQmOyngCDslYrsnYAg7LGE66GcIOuztOyXrOyngOuKlCDsnbzsnbQg7J287Ja064KY7KeAIOyViuqyjCDtlbTspI3ri4jri6QuCisKK+uNlCDrp47snYAg7JiI66W8IOychO2VtOyEoCAi7LqQ7IucIOydvOq0gOyEsSIg7ISc67iM7IS57IWY7J2EIOywuOqzoO2VmOyEuOyalC4KKworCivsu6jtirjroaQg7J2Y7KG07ISxCistLS0tLS0tLS0tLS0tCisKK+uhnOuTnC3roZzrk5wg7Luo7Yq466GkIOydmOyhtOyEseydgCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOunjOycvOuhnOuKlCDsoJXtmZXtnogg64+Z7J6R7ZWgIOyImOqwgAor7JeG7Ja07IScIOydveq4sCDrqZTrqqjrpqwg67Cw66as7Ja066W8IO2VhOyalOuhnCDtlanri4jri6QuICDslYTrnpjsnZgg7L2U65Oc66W8IOu0heyLnOuLpDoKKworCXEgPSBSRUFEX09OQ0UoYSk7CisJaWYgKHEpIHsKKwkJPOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja0PiAgLyogQlVHOiBObyBkYXRhIGRlcGVuZGVuY3khISEgKi8KKwkJcCA9IFJFQURfT05DRShiKTsKKwl9CisKK+ydtCDsvZTrk5zripQg7JuQ7ZWY64qUIOuMgOuhnOydmCDtmqjqs7zrpbwg64K07KeAIOuqu+2VoCDsiJgg7J6I64qU642wLCDsnbQg7L2U65Oc7JeQ64qUIOuNsOydtO2EsCDsnZjsobTshLHsnbQKK+yVhOuLiOudvCDsu6jtirjroaQg7J2Y7KG07ISx7J20IOyhtOyerO2VmOq4sCDrlYzrrLjsnLzroZwsIOydtOufsCDsg4Htmansl5DshJwgQ1BVIOuKlCDsi6Ttlokg7IaN64+E66W8IOuNlAor67mg66W06rKMIO2VmOq4sCDsnITtlbQg67aE6riwIOyhsOqxtOydmCDqsrDqs7zrpbwg7JiI7Lih7ZWY6rOgIOy9lOuTnOulvCDsnqzrsLDsuZgg7ZWgIOyImCDsnojslrTshJwg64uk66W4CitDUFUg64qUIGIg66Gc67aA7YSw7J2YIOuhnOuTnCDsmKTtjbzroIjsnbTshZjsnbQgYSDroZzrtoDthLDsnZgg66Gc65OcIOyYpO2NvOugiOydtOyFmOuztOuLpCDrqLzsoIAg67Cc7IOd7ZWcCivqsbjroZwg7J247Iud7ZWgIOyImCDsnojsirXri4jri6QuICDsl6zquLDsl5Ag7KCV66eQ66GcIO2VhOyalO2WiOuNmCDqsbQg64uk7J2M6rO8IOqwmeyKteuLiOuLpDoKKworCXEgPSBSRUFEX09OQ0UoYSk7CisJaWYgKHEpIHsKKwkJPOydveq4sCDrsLDrpqzslrQ+CisJCXAgPSBSRUFEX09OQ0UoYik7CisJfQorCivtlZjsp4Drp4wsIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjsnYAg7JiI7Lih7KCB7Jy866GcIOyImO2WieuQmOyngCDslYrsirXri4jri6QuICDspoksIOuLpOydjCDsmIjsl5DshJzsmYAKK+qwmeydtCDroZzrk5wt7Iqk7Yag7Ja0IOy7qO2KuOuhpCDsnZjsobTshLHsnbQg7KG07J6s7ZWY64qUIOqyveyasOyXkOuKlCDsiJzshJzqsIAgLeyngOy8nOynhOuLpC3ripQKK+ydmOuvuOyeheuLiOuLpC4KKworCXEgPSBSRUFEX09OQ0UoYSk7CisJaWYgKHEpIHsKKwkJV1JJVEVfT05DRShiLCBwKTsKKwl9CisKK+y7qO2KuOuhpCDsnZjsobTshLHsnYAg67O07Ya1IOuLpOuluCDtg4DsnoXsnZgg67Cw66as7Ja065Ok6rO8IOynneydhCDrp57strAg7IKs7Jqp65Cp64uI64ukLiAg6re466CH64uk6rOkCivtlZjrgpgsIFJFQURfT05DRSgpIOuKlCDrsJjrk5zsi5wg7IKs7Jqp7ZW07JW8IO2VqOydhCDrtoDrlJQg66qF7Ius7ZWY7IS47JqUISAgUkVBRF9PTkNFKCkg6rCACivsl4bri6TrqbQsIOy7tO2MjOydvOufrOqwgCAnYScg66Gc67aA7YSw7J2YIOuhnOuTnOulvCAnYScg66Gc67aA7YSw7J2YIOuYkOuLpOuluCDroZzrk5zsmYAsICdiJyDroZzsnZgKK+yKpO2GoOyWtOulvCAnYicg66Gc7J2YIOuYkOuLpOuluCDsiqTthqDslrTsmYAg7KGw7ZWp7ZW0IOuyhOugpCDrp6TsmrAg67mE7KeB6rSA7KCB7J24IOqysOqzvOulvCDstIjrnpjtlaAg7IiYCivsnojsirXri4jri6QuCisKK+ydtOqxuOuhnCDrgZ3snbQg7JWE64uM6rKMLCDsu7TtjIzsnbzrn6zqsIAg67OA7IiYICdhJyDsnZgg6rCS7J20IO2VreyDgSAw7J20IOyVhOuLiOudvOqzoCDspp3rqoXtlaAg7IiYCivsnojri6TrqbQsIOyVnuydmCDsmIjsl5DshJwgImlmIiDrrLjsnYQg7JeG7JWg7IScIOuLpOydjOqzvCDqsJnsnbQg7LWc7KCB7ZmUIO2VoCDsiJjrj4Qg7J6I7Iq164uI64ukOgorCisJcSA9IGE7CisJYiA9IHA7ICAvKiBCVUc6IENvbXBpbGVyIGFuZCBDUFUgY2FuIGJvdGggcmVvcmRlciEhISAqLworCivqt7jrn6zri4ggUkVBRF9PTkNFKCkg66W8IOuwmOuTnOyLnCDsgqzsmqntlZjshLjsmpQuCisKK+uLpOydjOqzvCDqsJnsnbQgImlmIiDrrLjsnZgg7JaR6rCI656YIOu4jOuenOy5mOyXkCDrqqjrkZAg7KG07J6s7ZWY64qUIOuPmeydvO2VnCDsiqTthqDslrTsl5Ag64yA7ZW0IOyInOyEnOulvAor6rCV7KCc7ZWY6rOgIOyLtuydgCDqsr3smrDqsIAg7J6I7J2EIOyImCDsnojsirXri4jri6Q6CisKKwlxID0gUkVBRF9PTkNFKGEpOworCWlmIChxKSB7CisJCWJhcnJpZXIoKTsKKwkJV1JJVEVfT05DRShiLCBwKTsKKwkJZG9fc29tZXRoaW5nKCk7CisJfSBlbHNlIHsKKwkJYmFycmllcigpOworCQlXUklURV9PTkNFKGIsIHApOworCQlkb19zb21ldGhpbmdfZWxzZSgpOworCX0KKwor7JWI7YOA6rmd6rKM64+ELCDtmITsnqzsnZgg7Lu07YyM7J2865+s65Ok7J2AIOuGkuydgCDstZzsoIHtmZQg66CI67Ko7JeQ7ISc64qUIOydtOqxuCDri6TsnYzqs7wg6rCZ7J20CivrsJTqv5TrsoTrpr3ri4jri6Q6CisKKwlxID0gUkVBRF9PTkNFKGEpOworCWJhcnJpZXIoKTsKKwlXUklURV9PTkNFKGIsIHApOyAgLyogQlVHOiBObyBvcmRlcmluZyB2cy4gbG9hZCBmcm9tIGEhISEgKi8KKwlpZiAocSkgeworCQkvKiBXUklURV9PTkNFKGIsIHApOyAtLSBtb3ZlZCB1cCwgQlVHISEhICovCisJCWRvX3NvbWV0aGluZygpOworCX0gZWxzZSB7CisJCS8qIFdSSVRFX09OQ0UoYiwgcCk7IC0tIG1vdmVkIHVwLCBCVUchISEgKi8KKwkJZG9fc29tZXRoaW5nX2Vsc2UoKTsKKwl9CisKK+ydtOygnCAnYScg7JeQ7ISc7J2YIOuhnOuTnOyZgCAnYicg66Gc7J2YIOyKpO2GoOyWtCDsgqzsnbTsl5DripQg7KGw6rG07KCBIOq0gOqzhOqwgCDsl4bquLAg65WM66y47JeQIENQVQor64qUIOydtOuTpOydmCDsiJzshJzrpbwg67CU6r+AIOyImCDsnojqsowg65Cp64uI64ukOiDsnbTrn7Ag6rK97Jqw7JeQIOyhsOqxtOyggSDqtIDqs4TripQg67CY65Oc7IucCivtlYTsmpTtlZzrjbAsIOuqqOuToCDsu7TtjIzsnbzrn6wg7LWc7KCB7ZmU6rCAIOydtOujqOyWtOyngOqzoCDrgpwg7ZuE7J2YIOyWtOyFiOu4lOumrCDsvZTrk5zsl5DshJzrj4QKK+uniOywrOqwgOyngOyeheuLiOuLpC4gIOuUsOudvOyEnCwg7J20IOyYiOyXkOyEnCDsiJzshJzrpbwg7KeA7YKk6riwIOychO2VtOyEnOuKlCBzbXBfc3RvcmVfcmVsZWFzZSgpCivsmYAg6rCZ7J2AIOuqheyLnOyggSDrqZTrqqjrpqwg67Cw66as7Ja06rCAIO2VhOyalO2VqeuLiOuLpDoKKworCXEgPSBSRUFEX09OQ0UoYSk7CisJaWYgKHEpIHsKKwkJc21wX3N0b3JlX3JlbGVhc2UoJmIsIHApOworCQlkb19zb21ldGhpbmcoKTsKKwl9IGVsc2UgeworCQlzbXBfc3RvcmVfcmVsZWFzZSgmYiwgcCk7CisJCWRvX3NvbWV0aGluZ19lbHNlKCk7CisJfQorCivrsJjrqbTsl5Ag66qF7Iuc7KCBIOuplOuqqOumrCDrsLDrpqzslrTqsIAg7JeG64uk66m0LCDsnbTrn7Ag6rK97Jqw7J2YIOyInOyEnOuKlCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY65Ok7J20CivshJzroZwg64uk66W8IOuVjOyXkOunjCDrs7TsnqXrkJjripTrjbAsIOyYiOulvCDrk6TrqbQg64uk7J2M6rO8IOqwmeydgCDqsr3smrDsnoXri4jri6Q6CisKKwlxID0gUkVBRF9PTkNFKGEpOworCWlmIChxKSB7CisJCVdSSVRFX09OQ0UoYiwgcCk7CisJCWRvX3NvbWV0aGluZygpOworCX0gZWxzZSB7CisJCVdSSVRFX09OQ0UoYiwgcik7CisJCWRvX3NvbWV0aGluZ19lbHNlKCk7CisJfQorCivsspjsnYzsnZggUkVBRF9PTkNFKCkg64qUIOy7tO2MjOydvOufrOqwgCAnYScg7J2YIOqwkuydhCDspp3rqoXtlbTrgrTripQg6rKD7J2EIOunieq4sCDsnITtlbQg7Jes7KCE7Z6ICivtlYTsmpTtlanri4jri6QuCisKK+uYkO2VnCwg66Gc7LusIOuzgOyImCAncScg66W8IOqwgOyngOqzoCDtlZjripQg7J287JeQIOuMgO2VtCDso7zsnZjtlbTslbwg7ZWY64qU642wLCDqt7jrn6zsp4Ag7JWK7Jy866m0Civsu7TtjIzsnbzrn6zripQg6re4IOqwkuydhCDstpTsuKHtlZjqs6Ag65iQ64uk7IucIO2VhOyalO2VnCDsobDqsbTqtIDqs4Trpbwg7JeG7JWg67KE66a0IOyImCDsnojsirXri4jri6QuCivsmIjrpbwg65Ok66m0OgorCisJcSA9IFJFQURfT05DRShhKTsKKwlpZiAocSAlIE1BWCkgeworCQlXUklURV9PTkNFKGIsIHApOworCQlkb19zb21ldGhpbmcoKTsKKwl9IGVsc2UgeworCQlXUklURV9PTkNFKGIsIHIpOworCQlkb19zb21ldGhpbmdfZWxzZSgpOworCX0KKwor66eM7JW9IE1BWCDqsIAgMSDroZwg7KCV7J2Y65CcIOyDgeyImOudvOuptCwg7Lu07YyM7J2865+s64qUIChxICUgTUFYKSDripQgMOydtOuegCDqsoPsnYQg7JWM7JWE7LGE6rOgLAor7JyE7J2YIOy9lOuTnOulvCDslYTrnpjsmYAg6rCZ7J20IOuwlOq/lOuyhOumtCDsiJgg7J6I7Iq164uI64ukOgorCisJcSA9IFJFQURfT05DRShhKTsKKwlXUklURV9PTkNFKGIsIHApOworCWRvX3NvbWV0aGluZ19lbHNlKCk7CisKK+ydtOugh+qyjCDrkJjrqbQsIENQVSDripQg67OA7IiYICdhJyDroZzrtoDthLDsnZgg66Gc65Oc7JmAIOuzgOyImCAnYicg66Gc7J2YIOyKpO2GoOyWtCDsgqzsnbTsnZgg7Iic7ISc66W8Civsp4DsvJzspIQg7ZWE7JqU6rCAIOyXhuyWtOynkeuLiOuLpC4gIGJhcnJpZXIoKSDrpbwg7LaU6rCA7ZW0IO2VtOqysO2VtCDrs7Tqs6Ag7Iu26rKg7KeA66eMLCDqt7jqsbQKK+uPhOybgOydtCDslYjrkKnri4jri6QuICDsobDqsbQg6rSA6rOE64qUIOyCrOudvOyhjOqzoCwgYmFycmllcigpIOuKlCDsnbTrpbwg65CY64+M66as7KeAIOuqu+2VqeuLiOuLpC4KK+uUsOudvOyEnCwg7J20IOyInOyEnOulvCDsp4DsvJzslbwg7ZWc64uk66m0LCBNQVgg6rCAIDEg67O064ukIO2BrOuLpOuKlCDqsoPsnYQsIOuLpOydjOqzvCDqsJnsnYAg67Cp67KV7J2ECivsgqzsmqntlbQg67aE66qF7Z6IIO2VtOyVvCDtlanri4jri6Q6CisKKwlxID0gUkVBRF9PTkNFKGEpOworCUJVSUxEX0JVR19PTihNQVggPD0gMSk7IC8qIE9yZGVyIGxvYWQgZnJvbSBhIHdpdGggc3RvcmUgdG8gYi4gKi8KKwlpZiAocSAlIE1BWCkgeworCQlXUklURV9PTkNFKGIsIHApOworCQlkb19zb21ldGhpbmcoKTsKKwl9IGVsc2UgeworCQlXUklURV9PTkNFKGIsIHIpOworCQlkb19zb21ldGhpbmdfZWxzZSgpOworCX0KKworJ2InIOuhnOydmCDsiqTthqDslrTrk6TsnYAg7Jes7KCE7Z6IIOyEnOuhnCDri6TrpoTsnYQg7JWM7JWE65GQ7IS47JqULiAg66eM7JW9IOq3uOqyg+uTpOydtCDrj5nsnbztlZjrqbQsCivslZ7sl5DshJwg7J207JW86riw7ZaI65OvLCDsu7TtjIzsnbzrn6zqsIAg6re4IOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjrk6TsnYQgJ2lmJyDrrLgg67CU6rml7Jy866GcCivrgYTsp5HslrTrgrwg7IiYIOyeiOyKteuLiOuLpC4KKwor65iQ7ZWcIOydtOynhCDsobDqsbTrrLgg7Y+J6rCA7JeQIOuEiOustCDsnZjsobTtlZjsp4Ag7JWK64+E66GdIOyhsOyLrO2VtOyVvCDtlanri4jri6QuICDri6TsnYzsnZgg7JiI66W8CivrtIXsi5zri6Q6CisKKwlxID0gUkVBRF9PTkNFKGEpOworCWlmIChxIHx8IDEgPiAwKQorCQlXUklURV9PTkNFKGIsIDEpOworCivssqvrsojsp7gg7KGw6rG066eM7Jy866Gc64qUIOu4jOuenOy5mCDsobDqsbQg7KCE7LK066W8IOqxsOynk+ycvOuhnCDrp4zrk6Qg7IiYIOyXhuqzoCDrkZDrsojsp7gg7KGw6rG07J2AIO2VreyDgQor7LC47J206riwIOuVjOusuOyXkCwg7Lu07YyM7J2865+s64qUIOydtCDsmIjrpbwg64uk7J2M6rO8IOqwmeydtCDrsJTqv5TshJwg7Luo7Yq466GkIOydmOyhtOyEseydhCDsl4bslaDrsoTrprQKK+yImCDsnojsirXri4jri6Q6CisKKwlxID0gUkVBRF9PTkNFKGEpOworCVdSSVRFX09OQ0UoYiwgMSk7CisKK+ydtCDsmIjripQg7Lu07YyM7J2865+s6rCAIOy9lOuTnOulvCDstpTsuKHsnLzroZwg7IiY7KCV7ZWgIOyImCDsl4brj4TroZ0g67aE66qF7Z6IIO2VtOyVvCDtlZzri6TripQg7KCQ7J2ECivqsJXsobDtlanri4jri6QuICDsobDquIgg642UIOydvOuwmOyggeycvOuhnCDrp5DtlbTshJwsIFJFQURfT05DRSgpIOuKlCDsu7TtjIzsnbzrn6zsl5Dqsowg7KO87Ja07KeEIOuhnOuTnAor7Jik7Y2866CI7J207IWY7J2EIOychO2VnCDsvZTrk5zrpbwg7KCV66eQ66GcIOunjOuTpOuPhOuhnSDtlZjsp4Drp4wsIOy7tO2MjOydvOufrOqwgCDqt7jroIfqsowg66eM65Ok7Ja07KeECivsvZTrk5zsnZgg7IiY7ZaJIOqysOqzvOulvCDsgqzsmqntlZjrj4TroZ0g6rCV7KCc7ZWY7KeA64qUIOyViuyKteuLiOuLpC4KKwor66eI7KeA66eJ7Jy866GcLCDsu6jtirjroaQg7J2Y7KG07ISx7J2AIOydtO2WieyEsSAodHJhbnNpdGl2aXR5KSDsnYQg7KCc6rO17ZWY7KeAIC3slYrsirXri4jri6QtLiAg7J206rG0Cit4IOyZgCB5IOqwgCDrkZgg64ukIDAg7J20652864qUIOy0iOq4sOqwkuydhCDqsIDsoYzri6TripQg6rCA7KCVIO2VmOydmCDrkZDqsJzsnZgg7JiI7KCc66GcCivrs7TsnbTqsqDsirXri4jri6Q6CisKKwlDUFUgMCAgICAgICAgICAgICAgICAgICAgIENQVSAxCisJPT09PT09PT09PT09PT09PT09PT09PT0gICA9PT09PT09PT09PT09PT09PT09PT09PQorCXIxID0gUkVBRF9PTkNFKHgpOyAgICAgICAgcjIgPSBSRUFEX09OQ0UoeSk7CisJaWYgKHIxID4gMCkgICAgICAgICAgICAgICBpZiAocjIgPiAwKQorCSAgV1JJVEVfT05DRSh5LCAxKTsgICAgICAgICBXUklURV9PTkNFKHgsIDEpOworCisJYXNzZXJ0KCEocjEgPT0gMSAmJiByMiA9PSAxKSk7CisKK+ydtCDrkZAgQ1BVIOyYiOygnOyXkOyEnCBhc3NlcnQoKSDsnZgg7KGw6rG07J2AIO2VreyDgSDssLjsnbwg6rKD7J6F64uI64ukLiAg6re466as6rOgLCDrp4zslb0g7Luo7Yq466GkCivsnZjsobTshLHsnbQg7J207ZaJ7ISx7J2EICjsi6TsoJzroZzripQg6re465+s7KeAIOyViuyngOunjCkg67O07J6l7ZWc64uk66m0LCDri6TsnYzsnZggQ1BVIOqwgCDstpTqsIDrkJjslrTrj4QKK+yVhOuemOydmCBhc3NlcnQoKSDsobDqsbTsnYAg7LC47J20IOuQoOqyg+yeheuLiOuLpDoKKworCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09CisJV1JJVEVfT05DRSh4LCAyKTsKKworCWFzc2VydCghKHIxID09IDIgJiYgcjIgPT0gMSAmJiB4ID09IDIpKTsgLyogRkFJTFMhISEgKi8KKwor7ZWY7KeA66eMIOy7qO2KuOuhpCDsnZjsobTshLHsnYAg7J207ZaJ7ISx7J2EIOygnOqzte2VmOyngCAt7JWK6riwLSDrlYzrrLjsl5AsIOyEuOqwnOydmCBDUFUg7JiI7KCc6rCAIOyLpO2WiQor7JmE66OM65CcIO2bhOyXkCDsnITsnZggYXNzZXJ0KCkg7J2YIOyhsOqxtOydgCDqsbDsp5PsnLzroZwg7Y+J6rCA65CgIOyImCDsnojsirXri4jri6QuICDshLjqsJzsnZggQ1BVCivsmIjsoJzqsIAg7Iic7ISc66W8IOyngO2CpOq4uCDsm5DtlZzri6TrqbQsIENQVSAwIOyZgCBDUFUgMSDsvZTrk5zsnZgg66Gc65Oc7JmAIOyKpO2GoOyWtCDsgqzsnbQsICJpZiIKK+usuCDrsJTroZwg64uk7J2M7JeQIHNtcF9tYigp66W8IOuEo+yWtOyVvCDtlanri4jri6QuICDrjZQg64KY7JWE6rCA7IScLCDstZzstIjsnZgg65GQIENQVSDsmIjsoJzripQKK+unpOyasCDsnITtl5jtlZjrr4DroZwg7IKs7Jqp65CY7KeAIOyViuyVhOyVvCDtlanri4jri6QuCisKK+ydtCDrkZDqsJzsnZgg7JiI7KCc64qUIOuLpOydjCDrhbzrrLg6CitodHRwOi8vd3d3LmNsLmNhbS5hYy51ay91c2Vycy9wZXMyMC9wcGMtc3VwcGxlbWVudGFsL3Rlc3Q2LnBkZiDsmYAKK+ydtCDsgqzsnbTtirg6IGh0dHBzOi8vd3d3LmNsLmNhbS5hYy51ay9+cGVzMjAvcHBjbWVtL2luZGV4Lmh0bWwg7JeQIOuCmOyYqCBMQiDsmYAgV1dDCivrpqztirjrqLjsiqQg7YWM7Iqk7Yq47J6F64uI64ukLgorCivsmpTslb3tlZjsnpDrqbQ6CisKKyAgKCopIOy7qO2KuOuhpCDsnZjsobTshLHsnYAg7JWe7J2YIOuhnOuTnOuTpOydhCDrkqTsnZgg7Iqk7Yag7Ja065Ok7JeQIOuMgO2VtCDsiJzshJzrpbwg66ee7Law7KSN64uI64ukLgorICAgICAg7ZWY7KeA66eMLCDqt7gg7Jm47J2YIOyWtOuWpCDsiJzshJzrj4Qg67O07J6l7ZWY7KeAIC3slYrsirXri4jri6QtOiDslZ7snZgg66Gc65Oc7JmAIOuSpOydmCDroZzrk5zrk6QKKyAgICAgIOyCrOydtOyXkOuPhCwg7JWe7J2YIOyKpO2GoOyWtOyZgCDrkqTsnZgg7Iqk7Yag7Ja065OkIOyCrOydtOyXkOuPhOyalC4gIOydtOufsCDri6Trpbgg7ZiV7YOc7J2YCisgICAgICDsiJzshJzqsIAg7ZWE7JqU7ZWY64uk66m0IHNtcF9ybWIoKSDrgpggc21wX3dtYigp66W8LCDrmJDripQsIOyVnuydmCDsiqTthqDslrTrk6Tqs7wg65Kk7J2YCisgICAgICDroZzrk5zrk6Qg7IKs7J207J2YIOyInOyEnOulvCDsnITtlbTshJzripQgc21wX21iKCkg66W8IOyCrOyaqe2VmOyEuOyalC4KKworICAoKikgImlmIiDrrLjsnZgg7JaR6rCI656YIOu4jOuenOy5mOqwgCDqsJnsnYAg67OA7IiY7JeQ7J2YIOuPmeydvO2VnCDsiqTthqDslrTroZwg7Iuc7J6R7ZWc64uk66m0LCDqt7gKKyAgICAgIOyKpO2GoOyWtOuTpOydgCDqsIEg7Iqk7Yag7Ja0IOyVnuyXkCBzbXBfbWIoKSDrpbwg64Sj6rGw64KYIHNtcF9zdG9yZV9yZWxlYXNlKCkg66W8CisgICAgICDsgqzsmqntlbTshJwg7Iqk7Yag7Ja066W8IO2VmOuKlCDsi53snLzroZwg7Iic7ISc66W8IOunnuy2sOykmOyVvCDtlanri4jri6QuICDsnbQg66y47KCc66W8IO2VtOqysO2VmOq4sAorICAgICAg7JyE7ZW0ICJpZiIg66y47J2YIOyWkeqwiOuemCDruIzrnpzsuZjsnZgg7Iuc7J6RIOyngOygkOyXkCBiYXJyaWVyKCkg66W8IOuEo+uKlCDqsoPrp4zsnLzroZzripQKKyAgICAgIOy2qeu2hO2VnCDtlbTqsrDsnbQg65CY7KeAIOyViuuKlOuNsCwg7J2064qUIOyVnuydmCDsmIjsl5DshJwg67O46rKD6rO8IOqwmeydtCwg7Lu07YyM7J2865+s7J2YCisgICAgICDstZzsoIHtmZTripQgYmFycmllcigpIOqwgCDsnZjrr7jtlZjripQg67CU66W8IOyngO2CpOuptOyEnOuPhCDsu6jtirjroaQg7J2Y7KG07ISx7J2EIOyGkOyDgeyLnO2CrAorICAgICAg7IiYIOyeiOq4sCDrlYzrrLjsnbTrnbzripQg7KCQ7J2EIOu2gOuUlCDslYzslYTrkZDsi5zquLAg67CU656N64uI64ukLgorCisgICgqKSDsu6jtirjroaQg7J2Y7KG07ISx7J2AIOyVnuydmCDroZzrk5zsmYAg65Kk7J2YIOyKpO2GoOyWtCDsgqzsnbTsl5Ag7LWc7IaMIO2VmOuCmOydmCwg7Iuk7ZaJCisgICAgICDsi5zsoJDsl5DshJzsnZgg7KGw6rG06rSA6rOE66W8IO2VhOyalOuhnCDtlZjrqbAsIOydtCDsobDqsbTqtIDqs4TripQg7JWe7J2YIOuhnOuTnOyZgCDqtIDqs4TrkJjslrTslbwKKyAgICAgIO2VqeuLiOuLpC4gIOunjOyVvSDsu7TtjIzsnbzrn6zqsIAg7KGw6rG0IOq0gOqzhOulvCDstZzsoIHtmZTroZwg7JeG7JWo7IiYIOyeiOuLpOuptCwg7Iic7ISc64+ECisgICAgICDstZzsoIHtmZTroZwg7JeG7JWg67KE66C47J2EIOqygeuLiOuLpC4gIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg7J2YIOyjvOydmCDquYrsnYAKKyAgICAgIOyCrOyaqeydgCDso7zslrTsp4Qg7KGw6rG0IOq0gOqzhOulvCDsnKDsp4DtlZjripTrjbAg64+E7JuA7J20IOuQoCDsiJgg7J6I7Iq164uI64ukLgorCisgICgqKSDsu6jtirjroaQg7J2Y7KG07ISx7J2EIOychO2VtOyEoCDsu7TtjIzsnbzrn6zqsIAg7KGw6rG06rSA6rOE66W8IOyXhuyVoOuyhOumrOuKlCDqsoPsnYQg66eJ7JWE7JW8CisgICAgICDtlanri4jri6QuICDso7zsnZgg6rmK7J2AIFJFQURfT05DRSgpIOuCmCBhdG9taWN7LDY0fV9yZWFkKCkg7J2YIOyCrOyaqeydtCDsu6jtirjroaQKKyAgICAgIOydmOyhtOyEseydtCDsgqzrnbzsp4Dsp4Ag7JWK6rKMIO2VmOuKlOuNsCDrj4Tsm4DsnYQg7KSEIOyImCDsnojsirXri4jri6QuICDrjZQg66eO7J2AIOygleuztOulvAorICAgICAg7JyE7ZW07ISgICLsu7TtjIzsnbzrn6wg67Cw66as7Ja0IiDshLnshZjsnYQg7LC46rOg7ZWY7Iuc6riwIOuwlOuejeuLiOuLpC4KKworICAoKikg7Luo7Yq466GkIOydmOyhtOyEseydgCDrs7TthrUg64uk66W4IO2DgOyeheydmCDrsLDrpqzslrTrk6Tqs7wg7Ked7J2EIOunnuy2sCDsgqzsmqnrkKnri4jri6QuCisKKyAgKCopIOy7qO2KuOuhpCDsnZjsobTshLHsnYAg7J207ZaJ7ISx7J2EIOygnOqzte2VmOyngCAt7JWK7Iq164uI64ukLS4gIOydtO2WieyEseydtCDtlYTsmpTtlZjri6TrqbQsCisgICAgICBzbXBfbWIoKSDrpbwg7IKs7Jqp7ZWY7IS47JqULgorCisKK1NNUCDrsLDrpqzslrQg7Ked66ee7LaU6riwCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDUFUg6rCEIOyDge2YuOyekeyaqeydhCDri6Tro7Ag65WM7JeQIOydvOu2gCDtg4DsnoXsnZgg66mU66qo66asIOuwsOumrOyWtOuKlCDtla3sg4Eg7Ked7J2EIOunnuy2sAor7IKs7Jqp65CY7Ja07JW8IO2VqeuLiOuLpC4gIOyggeygiO2VmOqyjCDsp53snYQg66ee7LaU7KeAIOyViuydgCDsvZTrk5zripQg7IKs7Iuk7IOBIOyXkOufrOyXkCDqsIDquZ3sirXri4jri6QuCisKK+uylOyaqSDrsLDrpqzslrTrk6TsnYAg67KU7JqpIOuwsOumrOyWtOuBvOumrOuPhCDsp53snYQg66ee7LaU7KeA66eMIOydtO2WieyEseydtCDsl4bripQg64yA67aA67aE7J2YIOuLpOuluAor7YOA7J6F7J2YIOuwsOumrOyWtOuTpOqzvOuPhCDsp53snYQg66ee7Lal64uI64ukLiAgQUNRVUlSRSDrsLDrpqzslrTripQgUkVMRUFTRSDrsLDrpqzslrTsmYAg7Ked7J2ECivrp57stqXri4jri6Trp4wsIOuRmCDri6Qg67KU7JqpIOuwsOumrOyWtOulvCDtj6ztlajtlbQg64uk66W4IOuwsOumrOyWtOuTpOqzvOuPhCDsp53snYQg66ee7LacIOyImCDsnojsirXri4jri6QuCivsk7DquLAg67Cw66as7Ja064qUIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064KYIOy7qO2KuOuhpCDsnZjsobTshLEsIEFDUVVJUkUg67Cw66as7Ja0LCBSRUxFQVNFCivrsLDrpqzslrQsIOydveq4sCDrsLDrpqzslrQsIOuYkOuKlCDrspTsmqkg67Cw66as7Ja07JmAIOynneydhCDrp57stqXri4jri6QuICDruYTsirftlZjqsowg7J296riwIOuwsOumrOyWtOuCmAor7Luo7Yq466GkIOydmOyhtOyEsSwg65iQ64qUIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064qUIOyTsOq4sCDrsLDrpqzslrTrgpggQUNRVUlSRSDrsLDrpqzslrQsCitSRUxFQVNFIOuwsOumrOyWtCwg65iQ64qUIOuylOyaqSDrsLDrpqzslrTsmYAg7Ked7J2EIOunnuy2lOuKlOuNsCwg64uk7J2M6rO8IOqwmeyKteuLiOuLpDoKKworCUNQVSAxCQkgICAgICBDUFUgMgorCT09PT09PT09PT09PT09PQkgICAgICA9PT09PT09PT09PT09PT0KKwlXUklURV9PTkNFKGEsIDEpOworCTzsk7DquLAg67Cw66as7Ja0PgorCVdSSVRFX09OQ0UoYiwgMik7ICAgICB4ID0gUkVBRF9PTkNFKGIpOworCQkJICAgICAgPOydveq4sCDrsLDrpqzslrQ+CisJCQkgICAgICB5ID0gUkVBRF9PTkNFKGEpOworCivrmJDripQ6CisKKwlDUFUgMQkJICAgICAgQ1BVIDIKKwk9PT09PT09PT09PT09PT0JICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCWEgPSAxOworCTzsk7DquLAg67Cw66as7Ja0PgorCVdSSVRFX09OQ0UoYiwgJmEpOyAgICB4ID0gUkVBRF9PTkNFKGIpOworCQkJICAgICAgPOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja0PgorCQkJICAgICAgeSA9ICp4OworCivrmJDripQ6CisKKwlDUFUgMQkJICAgICAgQ1BVIDIKKwk9PT09PT09PT09PT09PT0JICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCXIxID0gUkVBRF9PTkNFKHkpOworCTzrspTsmqkg67Cw66as7Ja0PgorCVdSSVRFX09OQ0UoeSwgMSk7ICAgICBpZiAocjIgPSBSRUFEX09OQ0UoeCkpIHsKKwkJCSAgICAgICAgIDzrrLXsi5zsoIEg7Luo7Yq466GkIOydmOyhtOyEsT4KKwkJCSAgICAgICAgIFdSSVRFX09OQ0UoeSwgMSk7CisJCQkgICAgICB9CisKKwlhc3NlcnQocjEgPT0gMCB8fCByMiA9PSAwKTsKKwor6riw67O47KCB7Jy866GcLCDsl6zquLDshJzsnZgg7J296riwIOuwsOumrOyWtOuKlCAi642UIOyZhO2ZlOuQnCIg7YOA7J6F7J28IOyInCDsnojslrTrj4Qg7ZWt7IOBIOyhtOyerO2VtOyVvAor7ZWp64uI64ukLgorCitbIV0g7JOw6riwIOuwsOumrOyWtCDslZ7snZgg7Iqk7Yag7Ja0IOyYpO2NvOugiOydtOyFmOydgCDsnbzrsJjsoIHsnLzroZwg7J296riwIOuwsOumrOyWtOuCmCDrjbDsnbTthLAKK+ydmOyhtOyEsSDrsLDrpqzslrQg65Kk7J2YIOuhnOuTnCDsmKTtjbzroIjsnbTshZjqs7wg66ek7LmY65CgIOqyg+ydtOqzoCwg67CY64yA64+EIOuniOywrOqwgOyngOyeheuLiOuLpDoKKworCUNQVSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVSAyCisJPT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PQorCVdSSVRFX09OQ0UoYSwgMSk7ICAgIH0tLS0tICAgLS0tPnsgIHYgPSBSRUFEX09OQ0UoYyk7CisJV1JJVEVfT05DRShiLCAyKTsgICAgfSAgICBcIC8gICAgeyAgdyA9IFJFQURfT05DRShkKTsKKwk87JOw6riwIOuwsOumrOyWtD4gICAgICAgICAgICAgIFwgICAgICAgIDzsnb3quLAg67Cw66as7Ja0PgorCVdSSVRFX09OQ0UoYywgMyk7ICAgIH0gICAgLyBcICAgIHsgIHggPSBSRUFEX09OQ0UoYSk7CisJV1JJVEVfT05DRShkLCA0KTsgICAgfS0tLS0gICAtLS0+eyAgeSA9IFJFQURfT05DRShiKTsKKworCivrqZTrqqjrpqwg67Cw66as7Ja0IOyLnO2AgOyKpOydmCDsmIgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor7LKr7Ke4LCDsk7DquLAg67Cw66as7Ja064qUIOyKpO2GoOyWtCDsmKTtjbzroIjsnbTshZjrk6TsnZgg67aA67aE7KCBIOyInOyEnCDshLjsmrDquLDroZwg64+Z7J6R7ZWp64uI64ukLgor7JWE656Y7J2YIOydtOuypO2KuCDsi5ztgIDsiqTrpbwg67O07IS47JqUOgorCisJQ1BVIDEKKwk9PT09PT09PT09PT09PT09PT09PT09PQorCVNUT1JFIEEgPSAxCisJU1RPUkUgQiA9IDIKKwlTVE9SRSBDID0gMworCTzsk7DquLAg67Cw66as7Ja0PgorCVNUT1JFIEQgPSA0CisJU1RPUkUgRSA9IDUKKwor7J20IOydtOuypO2KuCDsi5ztgIDsiqTripQg66mU66qo66asIOydvOq0gOyEsSDsi5zsiqTthZzsl5Ag7JuQ7IaM64G866as7J2YIOyInOyEnOqwgCDsobTsnqztlZjsp4Ag7JWK64qUIOynke2VqQoreyBTVE9SRSBBLCBTVE9SRSBCLCBTVE9SRSBDIH0g6rCAIOyXreyLnCDsm5DshozrgbzrpqzsnZgg7Iic7ISc6rCAIOyhtOyerO2VmOyngCDslYrripQg7KeR7ZWpCit7IFNUT1JFIEQsIFNUT1JFIEUgfSDrs7Tri6Qg66i87KCAIOydvOyWtOuCnCDqsoPsnLzroZwg7Iuc7Iqk7YWc7J2YIOuCmOuouOyngCDsmpTshozrk6Tsl5Ag67O07J2064+E66GdCivsoITri6zrkKnri4jri6Q6CisKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsKKwl8ICAgICAgIHwtLS0tLS0+fCBDPTMgIHwgICAgIH0gICAgIC9cCisJfCAgICAgICB8ICA6ICAgICstLS0tLS0rICAgICB9LS0tLS0gIFwgIC0tLS0tPiDsi5zsiqTthZzsnZgg64KY66i47KeAIOyalOyGjOyXkAorCXwgICAgICAgfCAgOiAgICB8IEE9MSAgfCAgICAgfSAgICAgICAgXC8gICAgICAg67O07Jes7KeIIOyImCDsnojripQg7J2067Kk7Yq465OkCisJfCAgICAgICB8ICA6ICAgICstLS0tLS0rICAgICB9CisJfCBDUFUgMSB8ICA6ICAgIHwgQj0yICB8ICAgICB9CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICB9CisJfCAgICAgICB8ICAgd3d3d3d3d3d3d3d3d3d3dyB9ICAgPC0tLSDsl6zquLDshJwg7JOw6riwIOuwsOumrOyWtOuKlCDrsLDrpqzslrQg7JWe7J2YCisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICB9ICAgICAgICDrqqjrk6Ag7Iqk7Yag7Ja06rCAIOuwsOumrOyWtCDrkqTsnZgg7Iqk7Yag7Ja0CisJfCAgICAgICB8ICA6ICAgIHwgRT01ICB8ICAgICB9ICAgICAgICDsoITsl5Ag66mU66qo66asIOyLnOyKpO2FnOyXkCDsoITri6zrkJjrj4TroZ0KKwl8ICAgICAgIHwgIDogICAgKy0tLS0tLSsgICAgIH0gICAgICAgIO2VqeuLiOuLpAorCXwgICAgICAgfC0tLS0tLT58IEQ9NCAgfCAgICAgfQorCXwgICAgICAgfCAgICAgICArLS0tLS0tKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOgorCSAgICAgICAgICAgICAgICAgICB8CisJICAgICAgICAgICAgICAgICAgIHwgQ1BVIDEg7JeQIOydmO2VtCDrqZTrqqjrpqwg7Iuc7Iqk7YWc7JeQIOyghOuLrOuQmOuKlAorCSAgICAgICAgICAgICAgICAgICB8IOydvOugqOydmCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY65OkCisJICAgICAgICAgICAgICAgICAgIFYKKworCivrkZjsp7gsIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064qUIOuNsOydtO2EsCDsnZjsobTsoIEg66Gc65OcIOyYpO2NvOugiOydtOyFmOuTpOydmCDrtoDrtoTsoIEg7Iic7IScCivshLjsmrDquLDroZwg64+Z7J6R7ZWp64uI64ukLiAg64uk7J2MIOydvOugqOydmCDsnbTrsqTtirjrk6TsnYQg67O07IS47JqUOgorCisJQ1BVIDEJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CisJCXsgQiA9IDc7IFggPSA5OyBZID0gODsgQyA9ICZZIH0KKwlTVE9SRSBBID0gMQorCVNUT1JFIEIgPSAyCisJPOyTsOq4sCDrsLDrpqzslrQ+CisJU1RPUkUgQyA9ICZCCQlMT0FEIFgKKwlTVE9SRSBEID0gNAkJTE9BRCBDIChnZXRzICZCKQorCQkJCUxPQUQgKkMgKHJlYWRzIEIpCisKK+yXrOq4sOyXkCDrs4Tri6Trpbgg6rCc7J6F7J20IOyXhuuLpOuptCwgQ1BVIDEg7J2YIOyTsOq4sCDrsLDrpqzslrTsl5Drj4Qg67aI6rWs7ZWY6rOgIENQVSAyIOuKlCBDUFUgMQor7J2YIOydtOuypO2KuOuTpOydhCDsmYTsoITtnogg66y07J6R7JyE7KCBIOyInOyEnOuhnCDsnbjsp4DtlZjqsowg65Cp64uI64ukOgorCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgICAgICAgICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICAgICAgICAgICArLS0tLS0tLSsgIHwgQ1BVIDIg7JeQIOyduOyngOuQmOuKlAorCXwgICAgICAgfC0tLS0tLT58IEI9MiAgfC0tLS0tICAgICAgIC0tLT58IFktPjggIHwgIHwg7JeF642w7J207Yq4IOydtOuypO2KuAorCXwgICAgICAgfCAgOiAgICArLS0tLS0tKyAgICAgXCAgICAgICAgICArLS0tLS0tLSsgIHwg7Iuc7YCA7IqkCisJfCBDUFUgMSB8ICA6ICAgIHwgQT0xICB8ICAgICAgXCAgICAgLS0tPnwgQy0+JlkgfCAgVgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICB8ICAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwgICB3d3d3d3d3d3d3d3d3d3d3ICAgfCAgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgIHwgICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgOiAgICB8IEM9JkIgfC0tLSAgICB8ICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8ICA6ICAgICstLS0tLS0rICAgXCAgIHwgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwl8ICAgICAgIHwtLS0tLS0+fCBEPTQgIHwgICAgLS0tLS0tLS0tLS0+fCBDLT4mQiB8LS0tLS0tPnwgICAgICAgfAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICB8ICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgICAgIHwgICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICA6ICAgICAgIDogICAgICAgfCBDUFUgMiB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAg67aE66qF7Z6IIOyemOuqu+uQnCAgICAgICAgLS0tPiAgfCAgICAgICAgfCBCLT43ICB8LS0tLS0tPnwgICAgICAgfAorCSAgICBCIOydmCDqsJIg7J247KeAICghKSAgICAgICAgICAgfCAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgWCDsnZgg66Gc65Oc6rCAIEIg7J2YICAgIC0tLT4gICAgXCAgICAgICB8IFgtPjkgIHwtLS0tLS0+fCAgICAgICB8CisJICAgIOydvOq0gOyEsSDsnKDsp4DrpbwgICAgICAgICAgICAgICAgXCAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAg7KeA7Jew7Iuc7YK0ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tPnwgQi0+MiAgfCAgICAgICArLS0tLS0tLSsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOgorCisKK+yVnuydmCDsmIjsl5DshJwsIENQVSAyIOuKlCAoQiDsnZgg6rCS7J20IOuQoCkgKkMg7J2YIOqwkiDsnb3quLDqsIAgQyDsnZggTE9BRCDrkqTsl5Ag7J207Ja07KeQ7JeQ64+ECitCIOqwgCA3IOydtOudvOuKlCDqsrDqs7zrpbwg7Ja77Iq164uI64ukLgorCivtlZjsp4Drp4wsIOunjOyVvSDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOqwgCBDIOydmCDroZzrk5zsmYAgKkMgKOymiSwgQikg7J2YIOuhnOuTnCDsgqzsnbTsl5AKK+yeiOyXiOuLpOuptDoKKworCUNQVSAxCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQorCQl7IEIgPSA3OyBYID0gOTsgWSA9IDg7IEMgPSAmWSB9CisJU1RPUkUgQSA9IDEKKwlTVE9SRSBCID0gMgorCTzsk7DquLAg67Cw66as7Ja0PgorCVNUT1JFIEMgPSAmQgkJTE9BRCBYCisJU1RPUkUgRCA9IDQJCUxPQUQgQyAoZ2V0cyAmQikKKwkJCQk8642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrQ+CisJCQkJTE9BRCAqQyAocmVhZHMgQikKKwor64uk7J2M6rO8IOqwmeydtCDrkKnri4jri6Q6CisKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgICAgICAgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgICAgICAgICAgICstLS0tLS0tKworCXwgICAgICAgfC0tLS0tLT58IEI9MiAgfC0tLS0tICAgICAgIC0tLT58IFktPjggIHwKKwl8ICAgICAgIHwgIDogICAgKy0tLS0tLSsgICAgIFwgICAgICAgICAgKy0tLS0tLS0rCisJfCBDUFUgMSB8ICA6ICAgIHwgQT0xICB8ICAgICAgXCAgICAgLS0tPnwgQy0+JlkgfAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICB8ICAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwgICB3d3d3d3d3d3d3d3d3d3d3ICAgfCAgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgIHwgICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgOiAgICB8IEM9JkIgfC0tLSAgICB8ICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8ICA6ICAgICstLS0tLS0rICAgXCAgIHwgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwl8ICAgICAgIHwtLS0tLS0+fCBEPTQgIHwgICAgLS0tLS0tLS0tLS0+fCBDLT4mQiB8LS0tLS0tPnwgICAgICAgfAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICB8ICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgICAgIHwgICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICA6ICAgICAgIDogICAgICAgfCBDUFUgMiB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfCBYLT45ICB8LS0tLS0tPnwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICBDIOuhnOydmCDsiqTthqDslrQg7JWe7J2YICAgICAtLS0+ICAgXCAgIGRkZGRkZGRkZGRkZGRkZGRkICAgfCAgICAgICB8CisJICDrqqjrk6Ag7J2067Kk7Yq4IOqysOqzvOqwgCAgICAgICAgICAgICBcICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAg65Kk7J2YIOuhnOuTnOyXkOqyjCAgICAgICAgICAgICAgICAgICAtLS0tLT58IEItPjIgIHwtLS0tLS0+fCAgICAgICB8CisJICDrs7TsnbTqsowg6rCV7KCc7ZWc64ukICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKworCivshYvsp7gsIOydveq4sCDrsLDrpqzslrTripQg66Gc65OcIOyYpO2NvOugiOydtOyFmOuTpOyXkOydmCDrtoDrtoTsoIEg7Iic7IScIOyEuOyasOq4sOuhnCDrj5nsnpHtlanri4jri6QuCivslYTrnpjsnZgg7J2866Co7J2YIOydtOuypO2KuOulvCDrtIXsi5zri6Q6CisKKwlDUFUgMQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0KKwkJeyBBID0gMCwgQiA9IDkgfQorCVNUT1JFIEE9MQorCTzsk7DquLAg67Cw66as7Ja0PgorCVNUT1JFIEI9MgorCQkJCUxPQUQgQgorCQkJCUxPQUQgQQorCitDUFUgMSDsnYAg7JOw6riwIOuwsOumrOyWtOulvCDss6Tsp4Drp4wsIOuzhOuLpOuluCDqsJzsnoXsnbQg7JeG64uk66m0IENQVSAyIOuKlCBDUFUgMSDsl5DshJwg7ZaJ7ZW07KeECivsnbTrsqTtirjsnZgg6rKw6rO866W8IOustOyekeychOyggSDsiJzshJzroZwg7J247KeA7ZWY6rKMIOuQqeuLiOuLpC4KKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICAgICAgICAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgICAgICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8LS0tLS0tPnwgQT0xICB8LS0tLS0tICAgICAgLS0tPnwgQS0+MCAgfAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgIFwgICAgICAgICArLS0tLS0tLSsKKwl8IENQVSAxIHwgICB3d3d3d3d3d3d3d3d3d3d3ICAgXCAgICAtLS0+fCBCLT45ICB8CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgICB8ICAgICAgICstLS0tLS0tKworCXwgICAgICAgfC0tLS0tLT58IEI9MiAgfC0tLSAgICAgfCAgICAgICA6ICAgICAgIDoKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICBcICAgIHwgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCSstLS0tLS0tKyAgICAgICA6ICAgICAgOiAgICBcICAgfCAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tPnwgQi0+MiAgfC0tLS0tLT58ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgKy0tLS0tLS0rICAgICAgIHwgQ1BVIDIgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8IEEtPjAgIHwtLS0tLS0+fCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgICAgICA6ICAgICAgIDoKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAgICAgKy0tLS0tLS0rCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tPnwgQS0+MSAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6CisKKwor7ZWY7KeA66eMLCDrp4zslb0g7J296riwIOuwsOumrOyWtOqwgCBCIOydmCDroZzrk5zsmYAgQSDsnZgg66Gc65OcIOyCrOydtOyXkCDsobTsnqztlZzri6TrqbQ6CisKKwlDUFUgMQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0KKwkJeyBBID0gMCwgQiA9IDkgfQorCVNUT1JFIEE9MQorCTzsk7DquLAg67Cw66as7Ja0PgorCVNUT1JFIEI9MgorCQkJCUxPQUQgQgorCQkJCTzsnb3quLAg67Cw66as7Ja0PgorCQkJCUxPQUQgQQorCitDUFUgMSDsl5Ag7J2Y7ZW0IOunjOuTpOyWtOynhCDrtoDrtoTsoIEg7Iic7ISc6rCAIENQVSAyIOyXkOuPhCDqt7jrjIDroZwg7J247KeA65Cp64uI64ukOgorCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgICAgICAgICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICAgICAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwtLS0tLS0+fCBBPTEgIHwtLS0tLS0gICAgICAtLS0+fCBBLT4wICB8CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgXCAgICAgICAgICstLS0tLS0tKworCXwgQ1BVIDEgfCAgIHd3d3d3d3d3d3d3d3d3d3cgICBcICAgIC0tLT58IEItPjkgIHwKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgIHwgICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8LS0tLS0tPnwgQj0yICB8LS0tICAgICB8ICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgIFwgICAgfCAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgIFwgICB8ICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0+fCBCLT4yICB8LS0tLS0tPnwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICArLS0tLS0tLSsgICAgICAgfCBDUFUgMiB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAg7Jes6riw7IScIOydveq4sCDrsLDrpqzslrTripQgICAtLS0tPiAgIFwgIHJycnJycnJycnJycnJycnJyICAgfCAgICAgICB8CisJICBCIOuhnOydmCDsiqTthqDslrQg7KCE7J2YICAgICAgICAgICAgICBcICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICDrqqjrk6Ag6rKw6rO866W8IENQVSAyIOyXkCAgICAgICAgICAgICAtLS0tPnwgQS0+MSAgfC0tLS0tLT58ICAgICAgIHwKKwkgIOuztOydtOuPhOuhnSDtlZzri6QgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisKKwor642UIOyZhOuyve2VnCDshKTrqoXsnYQg7JyE7ZW0LCBBIOydmCDroZzrk5zqsIAg7J296riwIOuwsOumrOyWtCDslZ7qs7wg65Kk7JeQIOyeiOycvOuptCDslrTrlrvqsowg65Cg7KeACivsg53qsIHtlbQg67SF7Iuc64ukOgorCisJQ1BVIDEJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CisJCXsgQSA9IDAsIEIgPSA5IH0KKwlTVE9SRSBBPTEKKwk87JOw6riwIOuwsOumrOyWtD4KKwlTVE9SRSBCPTIKKwkJCQlMT0FEIEIKKwkJCQlMT0FEIEEgW2ZpcnN0IGxvYWQgb2YgQV0KKwkJCQk87J296riwIOuwsOumrOyWtD4KKwkJCQlMT0FEIEEgW3NlY29uZCBsb2FkIG9mIEFdCisKK0Eg7J2YIOuhnOuTnCDrkZDqsJzqsIAg66qo65GQIEIg7J2YIOuhnOuTnCDrkqTsl5Ag7J6I7KeA66eMLCDshJzroZwg64uk66W4IOqwkuydhCDslrvslrTsmKwg7IiYCivsnojsirXri4jri6Q6CisKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgICAgICAgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgICAgICAgICAgICstLS0tLS0tKworCXwgICAgICAgfC0tLS0tLT58IEE9MSAgfC0tLS0tLSAgICAgIC0tLT58IEEtPjAgIHwKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICBcICAgICAgICAgKy0tLS0tLS0rCisJfCBDUFUgMSB8ICAgd3d3d3d3d3d3d3d3d3d3dyAgIFwgICAgLS0tPnwgQi0+OSAgfAorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICAgfCAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwtLS0tLS0+fCBCPTIgIHwtLS0gICAgIHwgICAgICAgOiAgICAgICA6CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgXCAgICB8ICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKwkrLS0tLS0tLSsgICAgICAgOiAgICAgIDogICAgXCAgIHwgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLT58IEItPjIgIHwtLS0tLS0+fCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICstLS0tLS0tKyAgICAgICB8IENQVSAyIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICA6ICAgICAgIDogICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfCBBLT4wICB8LS0tLS0tPnwgMXN0ICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICDsl6zquLDshJwg7J296riwIOuwsOumrOyWtOuKlCAgIC0tLS0+ICAgXCAgcnJycnJycnJycnJycnJycnIgICB8ICAgICAgIHwKKwkgIEIg66Gc7J2YIOyKpO2GoOyWtCDsoITsnZggICAgICAgICAgICAgIFwgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgIOuqqOuToCDqsrDqs7zrpbwgQ1BVIDIg7JeQICAgICAgICAgICAgIC0tLS0+fCBBLT4xICB8LS0tLS0tPnwgMm5kICAgfAorCSAg67O07J2064+E66GdIO2VnOuLpCAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKworCivtlZjsp4Drp4wgQ1BVIDEg7JeQ7ISc7J2YIEEg7JeF642w7J207Yq464qUIOydveq4sCDrsLDrpqzslrTqsIAg7JmE66OM65CY6riwIOyghOyXkOuPhCDrs7Tsnbwg7IiY64+ECivsnojquLQg7ZWp64uI64ukOgorCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgICAgICAgICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgICAgICAgICAgICAgICArLS0tLS0tLSsKKwl8ICAgICAgIHwtLS0tLS0+fCBBPTEgIHwtLS0tLS0gICAgICAtLS0+fCBBLT4wICB8CisJfCAgICAgICB8ICAgICAgICstLS0tLS0rICAgICAgXCAgICAgICAgICstLS0tLS0tKworCXwgQ1BVIDEgfCAgIHd3d3d3d3d3d3d3d3d3d3cgICBcICAgIC0tLT58IEItPjkgIHwKKwl8ICAgICAgIHwgICAgICAgKy0tLS0tLSsgICAgICAgIHwgICAgICAgKy0tLS0tLS0rCisJfCAgICAgICB8LS0tLS0tPnwgQj0yICB8LS0tICAgICB8ICAgICAgIDogICAgICAgOgorCXwgICAgICAgfCAgICAgICArLS0tLS0tKyAgIFwgICAgfCAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisJKy0tLS0tLS0rICAgICAgIDogICAgICA6ICAgIFwgICB8ICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0+fCBCLT4yICB8LS0tLS0tPnwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICArLS0tLS0tLSsgICAgICAgfCBDUFUgMiB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICAgICAgOiAgICAgICA6ICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tPnwgQS0+MSAgfC0tLS0tLT58IDFzdCAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJycnJycnJycnJycnJycnJyICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBLT4xICB8LS0tLS0tPnwgMm5kICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKworCivsl6zquLDshJwg67O07J6l65CY64qUIOqxtCwg66eM7JW9IEIg7J2YIOuhnOuTnOqwgCBCID09IDIg652864qUIOqysOqzvOulvCDrtKTri6TrqbQsIEEg7JeQ7J2YIOuRkOuyiOynuAor66Gc65Oc64qUIO2VreyDgSBBID09IDEg7J2EIOuztOqyjCDrkKAg6rKD7J20652864qUIOqygeuLiOuLpC4gIEEg7JeQ7J2YIOyyq+uyiOynuCDroZzrk5zsl5DripQg6re465+wCivrs7TsnqXsnbQg7JeG7Iq164uI64ukOyBBID09IDAg7J206rGw64KYIEEgPT0gMSDsnbTqsbDrgpgg65GYIOykkSDtlZjrgpjsnZgg6rKw6rO866W8IOuztOqyjCDrkKDqsoHri4jri6QuCisKKwor7J296riwIOuplOuqqOumrCDrsLDrpqzslrQgVlMg66Gc65OcIOyYiOy4oQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCivrp47snYAgQ1BV65Ok7J20IOuhnOuTnOulvCDsmIjsuKHsoIHsnLzroZwgKHNwZWN1bGF0aXZlbHkpIO2VqeuLiOuLpDog7Ja065akIOuNsOydtO2EsOulvCDrqZTrqqjrpqzsl5DshJwKK+uhnOuTnO2VtOyVvCDtlZjqsowg65Cg7KeAIOyYiOy4oeydhCDtlojri6TrqbQsIO2VtOuLuSDrjbDsnbTthLDrpbwg66Gc65Oc7ZWY64qUIOyduOyKpO2KuOufreyFmOydhCDsi6TsoJzroZzripQKK+yVhOyngSDrp4zrgpjsp4Ag7JWK7JWY642U652864+EIOuLpOuluCDroZzrk5wg7J6R7JeF7J20IOyXhuyWtCDrsoTsiqQgKGJ1cykg6rCAIOyVhOustCDsnbzrj4Qg7ZWY6rOgIOyeiOyngAor7JWK64uk66m0LCDqt7gg642w7J207YSw66W8IOuhnOuTnO2VqeuLiOuLpC4gIOydtO2bhOyXkCDsi6TsoJwg66Gc65OcIOyduOyKpO2KuOufreyFmOydtCDsi6TtlonrkJjrqbQgQ1BVIOqwgAor7J2066+4IOq3uCDqsJLsnYQg6rCA7KeA6rOgIOyeiOq4sCDrlYzrrLjsl5Ag6re4IOuhnOuTnCDsnbjsiqTtirjrn63shZjsnYAg7KaJ7IucIOyZhOujjOuQqeuLiOuLpC4KKwor7ZW064u5IENQVSDripQg7Iuk7KCc66Gc64qUIOq3uCDqsJLsnbQg7ZWE7JqU7LmYIOyViuyVmOuLpOuKlCDsgqzsi6TsnbQg64KY7KSR7JeQIOuTnOufrOuCoCDsiJjrj4Qg7J6I64qU642wIC0KK+2VtOuLuSDroZzrk5wg7J247Iqk7Yq465+t7IWY7J20IOu4jOuenOy5mOuhnCDsmrDtmozrkJjqsbDrgpgg7ZaI7J2EIOyImCDsnojqsqDso6AgLSAsIOq3uOugh+qyjCDrkJjrqbQg7JWe7IScCivsnb3slrTrkZQg6rCS7J2EIOuyhOumrOqxsOuCmCDrgpjspJHsnZgg7IKs7Jqp7J2EIOychO2VtCDsupDsi5zsl5Ag64Sj7Ja065GYIOyImCDsnojsirXri4jri6QuCisKK+uLpOydjOydhCDsg53qsIHtlbQg67SF7Iuc64ukOgorCisJQ1BVIDEJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CisJCQkJTE9BRCBCCisJCQkJRElWSURFCQl9IOuCmOuIhOq4sCDrqoXroLnsnYAg7J2867CY7KCB7Jy866GcCisJCQkJRElWSURFCQl9IOq4tCDsi5zqsITsnYQg7ZWE7JqU66GcIO2VqeuLiOuLpAorCQkJCUxPQUQgQQorCivripQg7J2066CH6rKMIOuQoCDsiJgg7J6I7Iq164uI64ukOgorCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLT58IEItPjIgIHwtLS0tLS0+fCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8IENQVSAyIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6RElWSURFIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJ64KY64iE6riwIO2VmOuKkOudvCDrsJTsgZwgICAgICAgLS0tPiAgICAgICAtLS0+fCBBLT4wICB8fn5+fiAgIHwgICAgICAgfAorCUNQVSDripQgQSDsnZggTE9BRCDrpbwgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICB+ICAgfCAgICAgICB8CisJ7JiI7Lih7ZW07IScIOyImO2Wie2VnOuLpCAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgfiAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDpESVZJREUgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgIH4gICB8ICAgICAgIHwKKwnrgpjriITquLDqsIAg64Gd64KY66m0ICAgICAgIC0tLT4gICAgIC0tLT4gICAgIDogICAgICAgOiAgIH4tLT58ICAgICAgIHwKKwlDUFUg64qUIO2VtOuLuSBMT0FEIOulvCAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwnsponqsIEg7JmE66OM7ZWc64ukICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCisKK+ydveq4sCDrsLDrpqzslrTrgpgg642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTrpbwg65GQ67KI7Ke4IOuhnOuTnCDsp4HsoITsl5Ag64aT64qU64uk66m0OgorCisJQ1BVIDEJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09CisJCQkJTE9BRCBCCisJCQkJRElWSURFCisJCQkJRElWSURFCisJCQkJPOydveq4sCDrsLDrpqzslrQ+CisJCQkJTE9BRCBBCisKK+yYiOy4oeycvOuhnCDslrvslrTsp4Qg6rCS7J2AIOyCrOyaqeuQnCDrsLDrpqzslrTsnZgg7YOA7J6F7JeQIOuUsOudvOyEnCDtlbTri7kg6rCS7J20IOyYs+ydgOyngCDqsoDthqDrkJjqsowKK+uQqeuLiOuLpC4gIOunjOyVvSDtlbTri7kg66mU66qo66asIOyYgeyXreyXkCDrs4DtmZTqsIAg7JeG7JeI64uk66m0LCDsmIjsuKHsnLzroZwg7Ja77Ja065GQ7JeI642YIOqwkuydtAor7IKs7Jqp65Cp64uI64ukOgorCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLT58IEItPjIgIHwtLS0tLS0+fCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8IENQVSAyIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6RElWSURFIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJ64KY64iE6riwIO2VmOuKkOudvCDrsJTsgZwgICAgICAgLS0tPiAgICAgICAtLS0+fCBBLT4wICB8fn5+fiAgIHwgICAgICAgfAorCUNQVSDripQgQSDsnZggTE9BRCDrpbwgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICB+ICAgfCAgICAgICB8CisJ7JiI7Lih7ZWc64ukICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICB+ICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOkRJVklERSB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgfiAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICB+ICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnJycnJycnJycnJycnJycn4gICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgfiAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICB+LS0+fCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgICAgICstLS0tLS0tKworCisKK+2VmOyngOunjCDri6TrpbggQ1BVIOyXkOyEnCDsl4XrjbDsnbTtirjrgpgg66y07Zqo7ZmU6rCAIOyeiOyXiOuLpOuptCwg6re4IOyYiOy4oeydgCDrrLTtmqjtmZTrkJjqs6Ag6re4IOqwkuydgAor64uk7IucIOydve2YgOynkeuLiOuLpDoKKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDogICAgICAgKy0tLS0tLS0rCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0+fCBCLT4yICB8LS0tLS0tPnwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCBDUFUgMiB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOkRJVklERSB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgICAgIHwgICAgICAgfAorCeuCmOuIhOq4sCDtlZjripDrnbwg67CU7IGcICAgICAgIC0tLT4gICAgICAgLS0tPnwgQS0+MCAgfH5+fn4gICB8ICAgICAgIHwKKwlDUFUg64qUIEEg7J2YIExPQUQg66W8ICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rICAgfiAgIHwgICAgICAgfAorCeyYiOy4oe2VnOuLpCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgfiAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgIDpESVZJREUgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgIH4gICB8ICAgICAgIHwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6ICAgfiAgIHwgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJycnJycnJycnJycnJycnJyICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICB8ICAgICAgIHwKKwnsmIjsuKHshLEg64+Z7J6R7J2AIOustO2aqO2ZlCDrkJjqs6AgICAgLS0tPiAgIC0tLT58IEEtPjEgIHwtLS0tLS0+fCAgICAgICB8CisJ7JeF642w7J207Yq465CcIOqwkuydtCDri6Tsi5wg7J297ZiA7KeE64ukICAgICAgICAgICArLS0tLS0tLSsgICAgICAgfCAgICAgICB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgICAgOiAgICAgICArLS0tLS0tLSsKKworCivsnbTtlonshLEKKy0tLS0tLQorCivsnbTtlonshLEodHJhbnNpdGl2aXR5KeydgCDsi6TsoJzsnZgg7Lu07ZOo7YSwIOyLnOyKpO2FnOyXkOyEnCDtla3sg4Eg7KCc6rO165CY7KeA64qUIOyViuuKlCwg7Iic7IScCivrp57stpTquLDsl5Ag64yA7ZWcIOyDgeuLue2eiCDsp4HqtIDsoIHsnbgg6rCc64WQ7J6F64uI64ukLiAg64uk7J2M7J2YIOyYiOqwgCDsnbTtlonshLHsnYQg67O07Jes7KSN64uI64ukOgorCisJQ1BVIDEJCQlDUFUgMgkJCUNQVSAzCisJPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT0KKwkJeyBYID0gMCwgWSA9IDAgfQorCVNUT1JFIFg9MQkJTE9BRCBYCQkJU1RPUkUgWT0xCisJCQkJPOuylOyaqSDrsLDrpqzslrQ+CQk867KU7JqpIOuwsOumrOyWtD4KKwkJCQlMT0FEIFkJCQlMT0FEIFgKKworQ1BVIDIg7J2YIFgg66Gc65Oc6rCAIDHsnYQg66as7YS07ZaI6rOgIFkg66Gc65Oc6rCAIDDsnYQg66as7YS07ZaI64uk6rOgIO2VtOu0heyLnOuLpC4gIOydtOuKlCBDUFUgMiDsnZgKK1gg66Gc65Oc6rCAIENQVSAxIOydmCBYIOyKpO2GoOyWtCDrkqTsl5Ag7J2066Oo7Ja07KGM6rOgIENQVSAyIOydmCBZIOuhnOuTnOuKlCBDUFUgMyDsnZggWSDsiqTthqDslrQKK+yghOyXkCDsnbTro6jslrTsoYzsnYzsnYQg7J2Y66+47ZWp64uI64ukLiAg6re465+8ICJDUFUgMyDsnZggWCDroZzrk5zripQgMOydhCDrpqzthLTtlaAg7IiYIOyeiOuCmOyalD8iCisKK0NQVSAyIOydmCBYIOuhnOuTnOuKlCBDUFUgMSDsnZgg7Iqk7Yag7Ja0IO2bhOyXkCDsnbTro6jslrTsoYzsnLzri4gsIENQVSAzIOydmCBYIOuhnOuTnOuKlCAx7J2ECivrpqzthLTtlZjripTqsowg7J6Q7Jew7Iqk65+97Iq164uI64ukLiAg7J2065+wIOyDneqwgeydtCDsnbTtlonshLHsnZgg7ZWcIOyYiOyeheuLiOuLpDogQ1BVIEEg7JeQ7IScIOyLpO2WieuQnAor66Gc65Oc6rCAIENQVSBCIOyXkOyEnOydmCDqsJnsnYAg67OA7IiY7JeQIOuMgO2VnCDroZzrk5zrpbwg65Kk65Sw66W464uk66m0LCBDUFUgQSDsnZgg66Gc65Oc64qUIENQVSBCCivsnZgg66Gc65Oc6rCAIOuCtOuGk+ydgCDqsJLqs7wg6rCZ6rGw64KYIOq3uCDtm4TsnZgg6rCS7J2EIOuCtOuGk+yVhOyVvCDtlanri4jri6QuCisKK+umrOuIheyKpCDsu6TrhJDsl5DshJwg67KU7JqpIOuwsOumrOyWtOydmCDsgqzsmqnsnYAg7J207ZaJ7ISx7J2EIOuztOyepe2VqeuLiOuLpC4gIOuUsOudvOyEnCwg7JWe7J2YIOyYiOyXkOyEnAorQ1BVIDIg7J2YIFgg66Gc65Oc6rCAIDHsnYQsIFkg66Gc65Oc64qUIDDsnYQg66as7YS07ZaI64uk66m0LCBDUFUgMyDsnZggWCDroZzrk5zripQg67CY65Oc7IucIDHsnYQKK+umrO2EtO2VqeuLiOuLpC4KKwor7ZWY7KeA66eMLCDsnb3quLDrgpgg7JOw6riwIOuwsOumrOyWtOyXkCDrjIDtlbTshJzripQg7J207ZaJ7ISx7J20IOuztOyepeuQmOyngCAt7JWK7Iq164uI64ukLS4gIOyYiOulvCDrk6TslrQsCivslZ7snZgg7JiI7JeQ7IScIENQVSAyIOydmCDrspTsmqkg67Cw66as7Ja06rCAIOyVhOuemOyymOufvCDsnb3quLAg67Cw66as7Ja066GcIOuwlOuAkCDqsr3smrDrpbwg7IOd6rCB7ZW0CivrtIXsi5zri6Q6CisKKwlDUFUgMQkJCUNQVSAyCQkJQ1BVIDMKKwk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQorCQl7IFggPSAwLCBZID0gMCB9CisJU1RPUkUgWD0xCQlMT0FEIFgJCQlTVE9SRSBZPTEKKwkJCQk87J296riwIOuwsOumrOyWtD4JCTzrspTsmqkg67Cw66as7Ja0PgorCQkJCUxPQUQgWQkJCUxPQUQgWAorCivsnbQg7L2U65Oc64qUIOydtO2WieyEseydhCDqsJbsp4Ag7JWK7Iq164uI64ukOiDsnbQg7JiI7JeQ7ISc64qULCBDUFUgMiDsnZggWCDroZzrk5zqsIAgMeydhAor66as7YS07ZWY6rOgLCBZIOuhnOuTnOuKlCAw7J2EIOumrO2EtO2VmOyngOunjCBDUFUgMyDsnZggWCDroZzrk5zqsIAgMOydhCDrpqzthLTtlZjripQg6rKD64+EIOyZhOyghO2eiAor7ZWp67KV7KCB7J6F64uI64ukLgorCitDUFUgMiDsnZgg7J296riwIOuwsOumrOyWtOqwgCDsnpDsi6DsnZgg7J296riw64qUIOyInOyEnOulvCDrp57strDspJjrj4QsIENQVSAxIOydmCDsiqTthqDslrTsmYDsnZgKK+yInOyEnOulvCDrp57strDspIDri6Tqs6DripQg67O07J6l7ZWgIOyImCDsl4bri6TripTqsowg7ZW17Ius7J6F64uI64ukLiAg65Sw65287IScLCBDUFUgMSDqs7wgQ1BVIDIg6rCACivrsoTtjbzrgpgg7LqQ7Iuc66W8IOqzteycoO2VmOuKlCDsi5zsiqTthZzsl5DshJwg7J20IOyYiOygnCDsvZTrk5zqsIAg7Iuk7ZaJ65Cc64uk66m0LCBDUFUgMiDripQgQ1BVIDEg7J20Civsk7Qg6rCS7JeQIOyigCDruajrpqwg7KCR6re87ZWgIOyImCDsnojsnYQg6rKD7J6F64uI64ukLiAg65Sw65287IScIENQVSAxIOqzvCBDUFUgMiDsnZgg7KCR6re87Jy866GcCivsobDtlanrkJwg7Iic7ISc66W8IOuqqOuToCBDUFUg6rCAIOuPmeydmO2VoCDsiJgg7J6I64+E66GdIO2VmOq4sCDsnITtlbQg67KU7JqpIOuwsOumrOyWtOqwgCDtlYTsmpTtlanri4jri6QuCisKK+uylOyaqSDrsLDrpqzslrTripQgIuq4gOuhnOuyjCDsnbTtlonshLEi7J2EIOygnOqzte2VtOyEnCwg66qo65OgIENQVSDrk6TsnbQg7Jik7Y2866CI7J207IWY65Ok7J2YIOyInOyEnOyXkAor64+Z7J2Y7ZWY6rKMIO2VoCDqsoPsnoXri4jri6QuICDrsJjrqbQsIHJlbGVhc2UtYWNxdWlyZSDsobDtlansnYAgIuuhnOy7rCDsnbTtlonshLEiIOunjOydhAor7KCc6rO17ZW07IScLCDtlbTri7kg7KGw7ZWp7J20IOyCrOyaqeuQnCBDUFUg65Ok66eM7J20IO2VtOuLuSDslaHshLjsiqTrk6TsnZgg7KGw7ZWp65CcIOyInOyEnOyXkCDrj5nsnZjtlajsnbQKK+uztOyepeuQqeuLiOuLpC4gIOyYiOulvCDrk6TslrQsIOyhtOqyveyKpOufsCBIZXJtYW4gSG9sbGVyaXRoIOydmCBDIOy9lOuTnOuhnCDrs7TrqbQ6CisKKwlpbnQgdSwgdiwgeCwgeSwgejsKKworCXZvaWQgY3B1MCh2b2lkKQorCXsKKwkJcjAgPSBzbXBfbG9hZF9hY3F1aXJlKCZ4KTsKKwkJV1JJVEVfT05DRSh1LCAxKTsKKwkJc21wX3N0b3JlX3JlbGVhc2UoJnksIDEpOworCX0KKworCXZvaWQgY3B1MSh2b2lkKQorCXsKKwkJcjEgPSBzbXBfbG9hZF9hY3F1aXJlKCZ5KTsKKwkJcjQgPSBSRUFEX09OQ0Uodik7CisJCXI1ID0gUkVBRF9PTkNFKHUpOworCQlzbXBfc3RvcmVfcmVsZWFzZSgmeiwgMSk7CisJfQorCisJdm9pZCBjcHUyKHZvaWQpCisJeworCQlyMiA9IHNtcF9sb2FkX2FjcXVpcmUoJnopOworCQlzbXBfc3RvcmVfcmVsZWFzZSgmeCwgMSk7CisJfQorCisJdm9pZCBjcHUzKHZvaWQpCisJeworCQlXUklURV9PTkNFKHYsIDEpOworCQlzbXBfbWIoKTsKKwkJcjMgPSBSRUFEX09OQ0UodSk7CisJfQorCitjcHUwKCksIGNwdTEoKSwg6re466as6rOgIGNwdTIoKSDripQgc21wX3N0b3JlX3JlbGVhc2UoKS9zbXBfbG9hZF9hY3F1aXJlKCkg7IyN7J2YCivsl7DqsrDsnYQg7Ya17ZWcIOuhnOy7rCDsnbTtlonshLHsl5Ag64+Z7LC47ZWY6rOgIOyeiOycvOuvgOuhnCwg64uk7J2M6rO8IOqwmeydgCDqsrDqs7zripQg64KY7Jik7KeAIOyViuydhAor6rKB64uI64ukOgorCisJcjAgPT0gMSAmJiByMSA9PSAxICYmIHIyID09IDEKKwor642UIOuCmOyVhOqwgOyEnCwgY3B1MCgpIOyZgCBjcHUxKCkg7IKs7J207J2YIHJlbGVhc2UtYWNxdWlyZSDqtIDqs4TroZwg7J247ZW0LCBjcHUxKCkg7J2ACitjcHUwKCkg7J2YIOyTsOq4sOulvCDrtJDslbzrp4wg7ZWY66+A66GcLCDri6TsnYzqs7wg6rCZ7J2AIOqysOqzvOuPhCDsl4bsnYQg6rKB64uI64ukOgorCisJcjEgPT0gMSAmJiByNSA9PSAwCisKK+2VmOyngOunjCwgcmVsZWFzZS1hY3F1aXJlIO2DgOuPmeyEseydgCDrj5nssLjtlZwgQ1BVIOuTpOyXkOunjCDsoIHsmqnrkJjrr4DroZwgY3B1MygpIOyXkOuKlAor7KCB7Jqp65CY7KeAIOyViuyKteuLiOuLpC4gIOuUsOudvOyEnCwg64uk7J2M6rO8IOqwmeydgCDqsrDqs7zqsIAg6rCA64ql7ZWp64uI64ukOgorCisJcjAgPT0gMCAmJiByMSA9PSAxICYmIHIyID09IDEgJiYgcjMgPT0gMCAmJiByNCA9PSAwCisKK+u5hOyKt+2VmOqyjCwg64uk7J2M6rO8IOqwmeydgCDqsrDqs7zrj4Qg6rCA64ql7ZWp64uI64ukOgorCisJcjAgPT0gMCAmJiByMSA9PSAxICYmIHIyID09IDEgJiYgcjMgPT0gMCAmJiByNCA9PSAwICYmIHI1ID09IDEKKworY3B1MCgpLCBjcHUxKCksIOq3uOumrOqzoCBjcHUyKCkg64qUIOq3uOuTpOydmCDsnb3quLDsmYAg7JOw6riw66W8IOyInOyEnOuMgOuhnCDrs7Tqsowg65CY7KeA66eMLAorcmVsZWFzZS1hY3F1aXJlIOyytOyduOyXkCDqtIDsl6zrkJjsp4Ag7JWK7J2AIENQVSDrk6TsnYAg6re4IOyInOyEnOyXkCDsnbTqsqzsnYQg6rCA7KeIIOyImAor7J6I7Iq164uI64ukLiAg7J2065+wIOydtOqyrOydgCBzbXBfbG9hZF9hY3F1aXJlKCkg7JmAIHNtcF9zdG9yZV9yZWxlYXNlKCkg7J2YIOq1rO2YhOyXkAor7IKs7Jqp65CY64qUIOyZhO2ZlOuQnCDrqZTrqqjrpqwg67Cw66as7Ja0IOyduOyKpO2KuOufreyFmOuTpOydgCDtla3sg4Eg67Cw66as7Ja0IOyVnuydmCDsiqTthqDslrTrk6TsnYQg65Kk7J2YCivroZzrk5zrk6Tsl5Ag7JWe7IS47Jq4IO2VhOyalOuKlCDsl4bri6TripQg7IKs7Iuk7JeQ7IScIOq4sOyduO2VqeuLiOuLpC4gIOydtCDrp5DsnYAgY3B1MygpIOuKlCBjcHUwKCkg7J2YCit1IOuhnOydmCDsiqTthqDslrTrpbwgY3B1MSgpIOydmCB2IOuhnOu2gO2EsOydmCDroZzrk5wg65Kk7JeQIOydvOyWtOuCnCDqsoPsnLzroZwg67O8IOyImCDsnojri6TripQKK+ucu+yeheuLiOuLpCwgY3B1MCgpIOyZgCBjcHUxKCkg7J2AIOydtCDrkZAg7Jik7Y2866CI7J207IWY7J20IOydmOuPhOuQnCDsiJzshJzrjIDroZwg7J287Ja064Ks7J2M7JeQCivrqqjrkZAg64+Z7J2Y7ZWY64qU642w64+EIOunkOyeheuLiOuLpC4KKwor7ZWY7KeA66eMLCBzbXBfbG9hZF9hY3F1aXJlKCkg64qUIOuniOyIoOydtCDslYTri5jsnYQg66qF7Ius7ZWY7Iuc6riwIOuwlOuejeuLiOuLpC4gIOq1rOyytOyggeycvOuhnCwKK+ydtCDtlajsiJjripQg64uo7Iic7Z6IIOyInOyEnCDqt5zsuZnsnYQg7KeA7YKk66mwIOyduOyekOuhnOu2gO2EsOydmCDsnb3quLDrpbwg7IiY7ZaJ7ZWp64uI64ukLiAg7J206rKD7J2ACivslrTrlqQg7Yq57KCV7ZWcIOqwkuydtCDsnb3tnpAg6rKD7J247KeA64qUIOuztOyepe2VmOyngCAt7JWK7Iq164uI64ukLS4gIOuUsOudvOyEnCwg64uk7J2M6rO8IOqwmeydgCDqsrDqs7zrj4QKK+qwgOuKpe2VqeuLiOuLpDoKKworCXIwID09IDAgJiYgcjEgPT0gMCAmJiByMiA9PSAwICYmIHI1ID09IDAKKwor7J2065+wIOqysOqzvOuKlCDslrTrlqQg6rKD64+EIOyerOuwsOy5mCDrkJjsp4Ag7JWK64qULCDsiJzssKjsoIEg7J286rSA7ISx7J2EIOqwgOynhCDqsIDsg4HsnZgKK+yLnOyKpO2FnOyXkOyEnOuPhCDsnbzslrTrgqAg7IiYIOyeiOydjOydhCDquLDslrXtlbQg65GQ7Iuc6riwIOuwlOuejeuLiOuLpC4KKwor64uk7IucIOunkO2VmOyngOunjCwg64u57Iug7J2YIOy9lOuTnOqwgCDquIDroZzrsowg7J207ZaJ7ISx7J2EIO2VhOyalOuhnCDtlZzri6TrqbQsIOuylOyaqSDrsLDrpqzslrTrpbwKK+yCrOyaqe2VmOyLreyLnOyYpC4KKworCis9PT09PT09PT09PT09PT09PT0KK+uqheyLnOyggSDsu6TrhJAg67Cw66as7Ja0Cis9PT09PT09PT09PT09PT09PT0KKwor66as64iF7IqkIOy7pOuEkOydgCDshJzroZwg64uk66W4IOuLqOqzhOyXkOyEnCDrj5nsnpHtlZjripQg64uk7JaR7ZWcIOuwsOumrOyWtOuTpOydhCDqsIDsp4Dqs6Ag7J6I7Iq164uI64ukOgorCisgICgqKSDsu7TtjIzsnbzrn6wg67Cw66as7Ja0LgorCisgICgqKSBDUFUg66mU66qo66asIOuwsOumrOyWtC4KKworICAoKikgTU1JTyDsk7DquLAg67Cw66as7Ja0LgorCisKK+y7tO2MjOydvOufrCDrsLDrpqzslrQKKy0tLS0tLS0tLS0tLS0tLQorCivrpqzriIXsiqQg7Luk64SQ7J2AIOy7tO2MjOydvOufrOqwgCDrqZTrqqjrpqwg7JWh7IS47Iqk66W8IOyerOuwsOy5mCDtlZjripQg6rKD7J2EIOunieyVhOyjvOuKlCDrqoXsi5zsoIHsnbgKK+y7tO2MjOydvOufrCDrsLDrpqzslrTrpbwg6rCA7KeA6rOgIOyeiOyKteuLiOuLpDoKKworCWJhcnJpZXIoKTsKKwor7J206rG0IOuylOyaqSDrsLDrpqzslrTsnoXri4jri6QgLS0gYmFycmllcigpIOydmCDsnb3quLAt7J296riwIOuCmCDsk7DquLAt7JOw6riwIOuzgOyiheydgCDsl4bsirXri4jri6QuCivtlZjsp4Drp4wsIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg64qUIO2KueyglSDslaHshLjsiqTrk6Tsl5Ag64yA7ZW07ISc66eMIOuPmeyeke2VmOuKlAorYmFycmllcigpIOydmCDsmYTtmZTrkJwg7ZiV7YOc66GcIOuzvCDsiJgg7J6I7Iq164uI64ukLgorCitiYXJyaWVyKCkg7ZWo7IiY64qUIOuLpOydjOqzvCDqsJnsnYAg7Zqo6rO866W8IOqwluyKteuLiOuLpDoKKworICgqKSDsu7TtjIzsnbzrn6zqsIAgYmFycmllcigpIOuSpOydmCDslaHshLjsiqTrk6TsnbQgYmFycmllcigpIOyVnuydmCDslaHshLjsiqTrs7Tri6Qg7JWe7Jy866GcCisgICAgIOyerOuwsOy5mOuQmOyngCDrqrvtlZjqsowg7ZWp64uI64ukLiAg7JiI66W8IOuTpOyWtCwg7J247YSw65+97Yq4IO2VuOuTpOufrCDsvZTrk5zsmYAg7J247YSw65+97Yq4IOuLue2VnAorICAgICDsvZTrk5wg7IKs7J207J2YIO2GteyLoOydhCDsi6DspJHtnogg7ZWY6riwIOychO2VtCDsgqzsmqnrkKAg7IiYIOyeiOyKteuLiOuLpC4KKworICgqKSDro6jtlITsl5DshJwsIOy7tO2MjOydvOufrOqwgCDro6jtlIQg7KGw6rG07JeQIOyCrOyaqeuQnCDrs4DsiJjrpbwg66ekIOydtO2EsOugiOydtOyFmOuniOuLpAorICAgICDrqZTrqqjrpqzsl5DshJwg66Gc65Oc7ZWY7KeAIOyViuyVhOuPhCDrkJjrj4TroZ0g7LWc7KCB7ZmUIO2VmOuKlOqxuCDrsKnsp4Dtlanri4jri6QuCisKK1JFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg7ZWo7IiY64qUIOyLseq4gCDsk7DroIjrk5wg7L2U65Oc7JeQ7ISc64qUIOusuOygnCDsl4bsp4Drp4wg64+Z7Iuc7ISx7J20CivsnojripQg7L2U65Oc7JeQ7ISc64qUIOusuOygnOqwgCDrkKAg7IiYIOyeiOuKlCDrqqjrk6Ag7LWc7KCB7ZmU66W8IOunieyKteuLiOuLpC4gIOydtOufsCDrpZjsnZgg7LWc7KCB7ZmU7JeQCivrjIDtlZwg7JiI66W8IOuqh+qwgOyngCDrk6TslrTrs7TrqbQg64uk7J2M6rO8IOqwmeyKteuLiOuLpDoKKworICgqKSDsu7TtjIzsnbzrn6zripQg6rCZ7J2AIOuzgOyImOyXkCDrjIDtlZwg66Gc65Oc7JmAIOyKpO2GoOyWtOulvCDsnqzrsLDsuZgg7ZWgIOyImCDsnojqs6AsIOyWtOuWpAorICAgICDqsr3smrDsl5DripQgQ1BV6rCAIOqwmeydgCDrs4DsiJjroZzrtoDthLDsnZgg66Gc65Oc65Ok7J2EIOyerOuwsOy5mO2VoCDsiJjrj4Qg7J6I7Iq164uI64ukLiAg7J2064qUCisgICAgIOuLpOydjOydmCDsvZTrk5zqsIA6CisKKwlhWzBdID0geDsKKwlhWzFdID0geDsKKworICAgICB4IOydmCDsmIjsoIQg6rCS7J20IGFbMV0g7JeQLCDsg4gg6rCS7J20IGFbMF0g7JeQIOyeiOqyjCDtlaAg7IiYIOyeiOuLpOuKlCDrnLvsnoXri4jri6QuCisgICAgIOy7tO2MjOydvOufrOyZgCBDUFXqsIAg7J2065+wIOydvOydhCDrqrvtlZjqsowg7ZWY66Ck66m0IOuLpOydjOqzvCDqsJnsnbQg7ZW07JW8IO2VqeuLiOuLpDoKKworCWFbMF0gPSBSRUFEX09OQ0UoeCk7CisJYVsxXSA9IFJFQURfT05DRSh4KTsKKworICAgICDspoksIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg64qUIOyXrOufrCBDUFUg7JeQ7IScIO2VmOuCmOydmCDrs4DsiJjsl5Ag6rCA7ZW07KeA64qUCisgICAgIOyVoeyEuOyKpOuTpOyXkCDsupDsi5wg7J286rSA7ISx7J2EIOygnOqzte2VqeuLiOuLpC4KKworICgqKSDsu7TtjIzsnbzrn6zripQg6rCZ7J2AIOuzgOyImOyXkCDrjIDtlZwg7Jew7IaN7KCB7J24IOuhnOuTnOuTpOydhCDrs5HtlantlaAg7IiYIOyeiOyKteuLiOuLpC4gIOq3uOufsAorICAgICDrs5Htlakg7J6R7JeF7Jy866GcIOy7tO2MjOydvOufrOuKlCDri6TsnYzsnZgg7L2U65Oc66W8OgorCisJd2hpbGUgKHRtcCA9IGEpCisJCWRvX3NvbWV0aGluZ193aXRoKHRtcCk7CisKKyAgICAg64uk7J2M6rO8IOqwmeydtCwg7Iux6riAIOyTsOugiOuTnCDsvZTrk5zsl5DshJzripQg66eQ7J20IOuQmOyngOunjCDqsJzrsJzsnpDsnZgg7J2Y64+E7JmAIOyghO2YgCDrp57sp4AKKyAgICAg7JWK64qUIOuwqe2WpeycvOuhnCAi7LWc7KCB7ZmUIiDtlaAg7IiYIOyeiOyKteuLiOuLpDoKKworCWlmICh0bXAgPSBhKQorCQlmb3IgKDs7KQorCQkJZG9fc29tZXRoaW5nX3dpdGgodG1wKTsKKworICAgICDsu7TtjIzsnbzrn6zqsIAg7J2065+wIOynk+ydhCDtlZjsp4Ag66q77ZWY6rKMIO2VmOugpOuptCBSRUFEX09OQ0UoKSDrpbwg7IKs7Jqp7ZWY7IS47JqUOgorCisJd2hpbGUgKHRtcCA9IFJFQURfT05DRShhKSkKKwkJZG9fc29tZXRoaW5nX3dpdGgodG1wKTsKKworICgqKSDsmIjsu6jrjIAg66CI7KeA7Iqk7YSwIOyCrOyaqeufieydtCDrp47slYQg7Lu07YyM7J2865+s6rCAIOuqqOuToCDrjbDsnbTthLDrpbwg66CI7KeA7Iqk7YSw7JeQIOuLtOydhCDsiJgKKyAgICAg7JeG64qUIOqyveyasCwg7Lu07YyM7J2865+s64qUIOuzgOyImOulvCDri6Tsi5wg66Gc65Oc7ZWgIOyImCDsnojsirXri4jri6QuICDrlLDrnbzshJwg7Lu07YyM7J2865+s64qUCisgICAgIOyVnuydmCDsmIjsl5DshJwg67OA7IiYICd0bXAnIOyCrOyaqeydhCDstZzsoIHtmZTroZwg7JeG7JWg67KE66a0IOyImCDsnojsirXri4jri6Q6CisKKwl3aGlsZSAodG1wID0gYSkKKwkJZG9fc29tZXRoaW5nX3dpdGgodG1wKTsKKworICAgICDsnbQg7L2U65Oc64qUIOuLpOydjOqzvCDqsJnsnbQg7Iux6riAIOyTsOugiOuTnOyXkOyEnOuKlCDsmYTrsr3tlZjsp4Drp4wg64+Z7Iuc7ISx7J20IOyhtOyerO2VmOuKlAorICAgICDqsr3smrDsl5Qg7LmY66qF7KCB7J24IOy9lOuTnOuhnCDrsJTrgJQg7IiYIOyeiOyKteuLiOuLpDoKKworCXdoaWxlIChhKQorCQlkb19zb21ldGhpbmdfd2l0aChhKTsKKworICAgICDsmIjrpbwg65Ok7Ja0LCDstZzsoIHtmZTrkJwg7J20IOy9lOuTnOuKlCDrs4DsiJggYSDqsIAg64uk66W4IENQVSDsl5Ag7J2Y7ZW0ICJ3aGlsZSIg66y46rO8CisgICAgIGRvX3NvbWV0aGluZ193aXRoKCkg7Zi47LacIOyCrOydtOyXkCDrsJTrgIzslrQgZG9fc29tZXRoaW5nX3dpdGgoKSDsl5AgMOydhCDrhJjquLgKKyAgICAg7IiY64+EIOyeiOyKteuLiOuLpC4KKworICAgICDsnbTrsojsl5Drj4QsIOy7tO2MjOydvOufrOqwgCDqt7jrn7Ag7KeT7J2EIO2VmOuKlOqxuCDrp4nquLAg7JyE7ZW0IFJFQURfT05DRSgpIOulvCDsgqzsmqntlZjshLjsmpQ6CisKKwl3aGlsZSAodG1wID0gUkVBRF9PTkNFKGEpKQorCQlkb19zb21ldGhpbmdfd2l0aCh0bXApOworCisgICAgIOugiOyngOyKpO2EsOqwgCDrtoDsobHtlZwg7IOB7Zmp7J2EIOqyquuKlCDqsr3smrAsIOy7tO2MjOydvOufrOuKlCB0bXAg66W8IOyKpO2DneyXkCDsoIDsnqXtlbTrkZgg7IiY64+ECisgICAgIOyeiOyKteuLiOuLpC4gIOy7tO2MjOydvOufrOqwgCDrs4DsiJjrpbwg64uk7IucIOydveyWtOuTpOydtOuKlOqxtCDsnbTroIfqsowg7KCA7J6l7ZW065GQ6rOgIO2bhOyXkCDri6Tsi5wKKyAgICAg7J297Ja065Ok7J2064qU642wIOuTnOuKlCDsmKTrsoTtl6Trk5wg65WM66y47J6F64uI64ukLiAg6re466CH6rKMIO2VmOuKlOqyjCDsi7HquIAg7JOw66CI65OcCisgICAgIOy9lOuTnOyXkOyEnOuKlCDslYjsoITtlZjrr4DroZwsIOyViOyghO2VmOyngCDslYrsnYAg6rK97Jqw7JeQ64qUIOy7tO2MjOydvOufrOyXkOqyjCDsp4HsoJEg7JWM66Ck7KSY7JW8CisgICAgIO2VqeuLiOuLpC4KKworICgqKSDsu7TtjIzsnbzrn6zripQg6re4IOqwkuydtCDrrLTsl4fsnbzsp4Ag7JWM6rOgIOyeiOuLpOuptCDroZzrk5zrpbwg7JWE7JiIIOyViO2VoCDsiJjrj4Qg7J6I7Iq164uI64ukLgorICAgICDsmIjrpbwg65Ok7Ja0LCDri6TsnYzsnZgg7L2U65Oc64qUIOuzgOyImCAnYScg7J2YIOqwkuydtCDtla3sg4EgMOyehOydhCDspp3rqoXtlaAg7IiYIOyeiOuLpOuptDoKKworCXdoaWxlICh0bXAgPSBhKQorCQlkb19zb21ldGhpbmdfd2l0aCh0bXApOworCisgICAgIOydtOugh+qyjCDstZzsoIHtmZQg65CY7Ja067KE66a0IOyImCDsnojsirXri4jri6Q6CisKKwlkbyB7IH0gd2hpbGUgKDApOworCisgICAgIOydtCDrs4DtmZjsnYAg7Iux6riAIOyTsOugiOuTnCDsvZTrk5zsl5DshJzripQg64+E7JuA7J20IOuQmOuKlOuNsCDroZzrk5zsmYAg67iM656c7LmY66W8IOygnOqxsO2WiOq4sAorICAgICDrlYzrrLjsnoXri4jri6QuICDrrLjsoJzripQg7Lu07YyM7J2865+s6rCAICdhJyDsnZgg6rCS7J2EIOyXheuNsOydtO2KuCDtlZjripTqsbQg7ZiE7J6s7J2YIENQVSDtlZjrgpgKKyAgICAg67+Q7J20652864qUIOqwgOyglSDsnITsl5DshJwg7Kad66qF7J2EIO2WiOuLpOuKlOuNsCDsnojsirXri4jri6QuICDrp4zslb0g67OA7IiYICdhJyDqsIAg6rO17Jyg65CY7Ja0CisgICAgIOyeiOuLpOuptCwg7Lu07YyM7J2865+s7J2YIOymneuqheydgCDti4DrprAg6rKD7J20IOuQoOqygeuLiOuLpC4gIOy7tO2MjOydvOufrOuKlCDqt7gg7J6Q7Iug7J20CisgICAgIOyDneqwge2VmOuKlCDqsoPrp4ztgbwg66eO7J2AIOqyg+ydhCDslYzqs6Ag7J6I7KeAIOuqu+2VqOydhCDsu7TtjIzsnbzrn6zsl5Dqsowg7JWM66as6riwIOychO2VtAorICAgICBSRUFEX09OQ0UoKSDrpbwg7IKs7Jqp7ZWY7IS47JqUOgorCisJd2hpbGUgKHRtcCA9IFJFQURfT05DRShhKSkKKwkJZG9fc29tZXRoaW5nX3dpdGgodG1wKTsKKworICAgICDtlZjsp4Drp4wg7Lu07YyM7J2865+s64qUIFJFQURfT05DRSgpIOuSpOyXkCDrgpjsmKTripQg6rCS7JeQIOuMgO2VtOyEnOuPhCDriIjquLjsnYQg65GQ6rOgIOyeiOydjOydhAorICAgICDquLDslrXtlZjshLjsmpQuICDsmIjrpbwg65Ok7Ja0LCDri6TsnYzsnZgg7L2U65Oc7JeQ7IScIE1BWCDripQg7KCE7LKY66as6riwIOunpO2BrOuhnOuhnCwgMeydmCDqsJLsnYQKKyAgICAg6rCW64qU64uk6rOgIO2VtOu0heyLnOuLpDoKKworCXdoaWxlICgodG1wID0gUkVBRF9PTkNFKGEpKSAlIE1BWCkKKwkJZG9fc29tZXRoaW5nX3dpdGgodG1wKTsKKworICAgICDsnbTroIfqsowg65CY66m0IOy7tO2MjOydvOufrOuKlCBNQVgg66W8IOqwgOyngOqzoCDsiJjtlonrkJjripQgIiUiIOyYpO2NvOugiOydtO2EsOydmCDqsrDqs7zqsIAg7ZWt7IOBCisgICAgIDDsnbTrnbzripQg6rKD7J2EIOyVjOqyjCDrkJjqs6AsIOy7tO2MjOydvOufrOqwgCDsvZTrk5zrpbwg7Iuk7KeI7KCB7Jy866Gc64qUIOyhtOyerO2VmOyngCDslYrripQKKyAgICAg6rKD7LKY65+8IOy1nOygge2ZlCDtlZjripQg6rKD7J20IO2XiOyaqeuQmOyWtCDrsoTrpr3ri4jri6QuICAoJ2EnIOuzgOyImOydmCDroZzrk5zripQg7Jes7KCE7Z6ICisgICAgIO2Wie2VtOyniCDqsoHri4jri6QuKQorCisgKCopIOu5hOyKt+2VmOqyjCwg7Lu07YyM7J2865+s64qUIOuzgOyImOqwgCDsoIDsnqXtlZjroKQg7ZWY64qUIOqwkuydhCDsnbTrr7gg6rCA7KeA6rOgIOyeiOuLpOuKlCDqsoPsnYQKKyAgICAg7JWM66m0IOyKpO2GoOyWtCDsnpDssrTrpbwg7KCc6rGw7ZWgIOyImCDsnojsirXri4jri6QuICDsnbTrsojsl5Drj4QsIOy7tO2MjOydvOufrOuKlCDtmITsnqzsnZggQ1BVCisgICAgIOunjOydtCDqt7gg67OA7IiY7JeQIOqwkuydhCDsk7DripQg7Jik66Gc7KeAIO2VmOuCmOydmCDsobTsnqzrnbzqs6Ag7IOd6rCB7ZWY7JesIOqzteycoOuQnCDrs4DsiJjsl5AKKyAgICAg64yA7ZW07ISc64qUIOyemOuqu+uQnCDsnbzsnYQg7ZWY6rKMIOuQqeuLiOuLpC4gIOyYiOulvCDrk6TslrQsIOuLpOydjOqzvCDqsJnsnYAg6rK97Jqw6rCAIOyeiOydhCDsiJgKKyAgICAg7J6I7Iq164uI64ukOgorCisJYSA9IDA7CisJLi4uIOuzgOyImCBhIOyXkCDsiqTthqDslrTrpbwg7ZWY7KeAIOyViuuKlCDsvZTrk5wgLi4uCisJYSA9IDA7CisKKyAgICAg7Lu07YyM7J2865+s64qUIOuzgOyImCAnYScg7J2YIOqwkuydgCDsnbTrr7ggMOydtOudvOuKlCDqsoPsnYQg7JWM6rOgLCDrlLDrnbzshJwg65GQ67KI7Ke4IOyKpO2GoOyWtOulvAorICAgICDsgq3soJztlaAg6rKB64uI64ukLiAg66eM7JW9IOuLpOuluCBDUFUg6rCAIOq3uCDsgqzsnbQg67OA7IiYICdhJyDsl5Ag64uk66W4IOqwkuydhCDsjbzri6TrqbQKKyAgICAg7Zmp64u57ZWcIOqysOqzvOqwgCDrgpjsmKwg6rKB64uI64ukLgorCisgICAgIOy7tO2MjOydvOufrOqwgCDqt7jrn7Ag7J6Y66q765CcIOy2lOy4oeydhCDtlZjsp4Ag7JWK64+E66GdIFdSSVRFX09OQ0UoKSDrpbwg7IKs7Jqp7ZWY7IS47JqUOgorCisJV1JJVEVfT05DRShhLCAwKTsKKwkuLi4g67OA7IiYIGEg7JeQIOyKpO2GoOyWtOulvCDtlZjsp4Ag7JWK64qUIOy9lOuTnCAuLi4KKwlXUklURV9PTkNFKGEsIDApOworCisgKCopIOy7tO2MjOydvOufrOuKlCDtlZjsp4Ag66eQ65286rOgIO2VmOyngCDslYrsnLzrqbQg66mU66qo66asIOyVoeyEuOyKpOuTpOydhCDsnqzrsLDsuZgg7ZWgIOyImAorICAgICDsnojsirXri4jri6QuICDsmIjrpbwg65Ok7Ja0LCDri6TsnYzsnZgg7ZSE66Gc7IS47IqkIOugiOuyqCDsvZTrk5zsmYAg7J247YSw65+97Yq4IO2VuOuTpOufrCDsgqzsnbTsnZgKKyAgICAg7IOB7Zi47J6R7Jqp7J2EIOyDneqwge2VtCDrtIXsi5zri6Q6CisKKwl2b2lkIHByb2Nlc3NfbGV2ZWwodm9pZCkKKwl7CisJCW1zZyA9IGdldF9tZXNzYWdlKCk7CisJCWZsYWcgPSB0cnVlOworCX0KKworCXZvaWQgaW50ZXJydXB0X2hhbmRsZXIodm9pZCkKKwl7CisJCWlmIChmbGFnKQorCQkJcHJvY2Vzc19tZXNzYWdlKG1zZyk7CisJfQorCisgICAgIOydtCDsvZTrk5zsl5DripQg7Lu07YyM7J2865+s6rCAIHByb2Nlc3NfbGV2ZWwoKSDsnYQg64uk7J2M6rO8IOqwmeydtCDrs4DtmZjtlZjripQg6rKD7J2EIOunieydhAorICAgICDsiJjri6jsnbQg7JeG6rOgLCDsnbTrn7Ag67OA7ZmY7J2AIOyLseq4gOyTsOugiOuTnOyXkOyEnOudvOuptCDsi6TsoJzroZwg7ZuM66Wt7ZWcIOyEoO2DneydvCDsiJgKKyAgICAg7J6I7Iq164uI64ukOgorCisJdm9pZCBwcm9jZXNzX2xldmVsKHZvaWQpCisJeworCQlmbGFnID0gdHJ1ZTsKKwkJbXNnID0gZ2V0X21lc3NhZ2UoKTsKKwl9CisKKyAgICAg7J20IOuRkOqwnOydmCDrrLjsnqUg7IKs7J207JeQIOyduO2EsOufve2KuOqwgCDrsJzsg53tlZzri6TrqbQsIGludGVycnVwdF9oYW5kbGVyKCkg64qUIOydmOuvuOulvAorICAgICDslYwg7IiYIOyXhuuKlCDrqZTshLjsp4Drpbwg67Cb7J2EIOyImOuPhCDsnojsirXri4jri6QuICDsnbTqsbgg66eJ6riwIOychO2VtCDri6TsnYzqs7wg6rCZ7J20CisgICAgIFdSSVRFX09OQ0UoKSDrpbwg7IKs7Jqp7ZWY7IS47JqUOgorCisJdm9pZCBwcm9jZXNzX2xldmVsKHZvaWQpCisJeworCQlXUklURV9PTkNFKG1zZywgZ2V0X21lc3NhZ2UoKSk7CisJCVdSSVRFX09OQ0UoZmxhZywgdHJ1ZSk7CisJfQorCisJdm9pZCBpbnRlcnJ1cHRfaGFuZGxlcih2b2lkKQorCXsKKwkJaWYgKFJFQURfT05DRShmbGFnKSkKKwkJCXByb2Nlc3NfbWVzc2FnZShSRUFEX09OQ0UobXNnKSk7CisJfQorCisgICAgIGludGVycnVwdF9oYW5kbGVyKCkg7JWI7JeQ7ISc64+EIOykkeyyqeuQnCDsnbjthLDrn73tirjrgpggTk1JIOyZgCDqsJnsnbQg7J247YSw65+97Yq4IO2VuOuTpOufrAorICAgICDsl63si5wgJ2ZsYWcnIOyZgCAnbXNnJyDsl5Ag7KCR6re87ZWY64qUIOuYkOuLpOuluCDrrLTslrjqsIDsl5Ag7J247YSw65+97Yq4IOuQoCDsiJgg7J6I64uk66m0CisgICAgIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg66W8IOyCrOyaqe2VtOyVvCDtlajsnYQg6riw7Ja17ZW0IOuRkOyEuOyalC4gIOunjOyVvSDqt7jrn7AKKyAgICAg6rCA64ql7ISx7J20IOyXhuuLpOuptCwgaW50ZXJydXB0X2hhbmRsZXIoKSDslYjsl5DshJzripQg66y47ISc7ZmUIOuqqeyggeydtCDslYTri4jrnbzrqbQKKyAgICAgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDripQg7ZWE7JqU7LmYIOyViuyKteuLiOuLpC4gICjqt7zrnpjsnZgg66as64iF7IqkIOy7pOuEkOyXkOyEnAorICAgICDspJHssqnrkJwg7J247YSw65+97Yq464qUIOuztO2GtSDsnpgg7J287Ja064KY7KeAIOyViuydjOuPhCDquLDslrXtlbQg65GQ7IS47JqULCDsi6TsoJzroZwsIOyWtOuWpAorICAgICDsnbjthLDrn73tirgg7ZW465Ok65+s6rCAIOyduO2EsOufve2KuOqwgCDtmZzshLHtmZTrkJwg7LGE66GcIOumrO2EtO2VmOuptCBXQVJOX09OQ0UoKSDqsIAKKyAgICAg7Iuk7ZaJ65Cp64uI64ukLikKKworICAgICDsu7TtjIzsnbzrn6zripQgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDrkqTsnZggUkVBRF9PTkNFKCkg64KYIFdSSVRFX09OQ0UoKSwKKyAgICAgYmFycmllcigpLCDrmJDripQg67mE7Iq37ZWcIOqyg+uTpOydhCDri7Tqs6Ag7J6I7KeAIOyViuydgCDsvZTrk5zrpbwg7JuA7KeB7J28IOyImCDsnojsnYQg6rKD7Jy866GcCisgICAgIOqwgOygleuQmOyWtOyVvCDtlanri4jri6QuCisKKyAgICAg7J20IO2aqOqzvOuKlCBiYXJyaWVyKCkg66W8IO2Gte2VtOyEnOuPhCDrp4zrk6Qg7IiYIOyeiOyngOunjCwgUkVBRF9PTkNFKCkg7JmACisgICAgIFdSSVRFX09OQ0UoKSDqsIAg7KKAIOuNlCDslYjrqqkg64aS7J2AIOyEoO2DneyeheuLiOuLpDogUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKeuKlAorICAgICDsu7TtjIzsnbzrn6zsl5Ag7KO87Ja07KeEIOuplOuqqOumrCDsmIHsl63sl5Ag64yA7ZW07ISc66eMIOy1nOygge2ZlCDqsIDriqXshLHsnYQg7Y+s6riw7ZWY64+E66GdCisgICAgIO2VmOyngOunjCwgYmFycmllcigpIOuKlCDsu7TtjIzsnbzrn6zqsIAg7KeA6riI6rmM7KeAIOq4sOqzhOydmCDroIjsp4DsiqTthLDsl5Ag7LqQ7Iuc7ZW0IOuGk+ydgAorICAgICDrqqjrk6Ag66mU66qo66asIOyYgeyXreydmCDqsJLsnYQg67KE66Ck7JW8IO2VmOqyjCDtlZjquLAg65WM66y47J6F64uI64ukLiAg66y866GgLCDsu7TtjIzsnbzrn6zripQKKyAgICAgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDqsIAg7J287Ja064KcIOyInOyEnOuPhCDsp4DsvJzspI3ri4jri6QsIENQVSDripQg64u57Jew7Z6ICisgICAgIOq3uCDsiJzshJzrpbwg7KeA7YKsIOydmOustOqwgCDsl4bsp4Drp4zsmpQuCisKKyAoKikg7Lu07YyM7J2865+s64qUIOuLpOydjOydmCDsmIjsl5DshJzsmYAg6rCZ7J20IOuzgOyImOyXkOydmCDsiqTthqDslrTrpbwg64Kg7KGw7ZW064K8IOyImOuPhCDsnojsirXri4jri6Q6CisKKwlpZiAoYSkKKwkJYiA9IGE7CisJZWxzZQorCQliID0gNDI7CisKKyAgICAg7Lu07YyM7J2865+s64qUIOyVhOuemOyZgCDqsJnsnYAg7LWc7KCB7ZmU66GcIOu4jOuenOy5mOulvCDspITsnbwg6rKB64uI64ukOgorCisJYiA9IDQyOworCWlmIChhKQorCQliID0gYTsKKworICAgICDsi7HquIAg7JOw66CI65OcIOy9lOuTnOyXkOyEnCDsnbQg7LWc7KCB7ZmU64qUIOyViOyghO2VoCDrv5Ag7JWE64uI6528IOu4jOuenOy5mCDqsK/siJjrpbwKKyAgICAg7KSE7Jes7KSN64uI64ukLiAg7ZWY7KeA66eMIOyViO2DgOq5neqyjOuPhCwg64+Z7Iuc7ISx7J20IOyeiOuKlCDsvZTrk5zsl5DshJzripQg7J20IOy1nOygge2ZlOuKlCDri6TrpbgKKyAgICAgQ1BVIOqwgCAnYicg66W8IOuhnOuTnO2VoCDrlYwsIC0tICdhJyDqsIAgMOydtCDslYTri4zrjbDrj4QgLS0g6rCA7Kec7J24IOqwkiwgNDLrpbwg67O06rKMCisgICAgIOuQmOuKlCDqsr3smrDrpbwg6rCA64ql7ZWY6rKMIO2VqeuLiOuLpC4gIOydtOqxuCDrsKnsp4DtlZjquLAg7JyE7ZW0IFdSSVRFX09OQ0UoKSDrpbwKKyAgICAg7IKs7Jqp7ZWY7IS47JqUOgorCisJaWYgKGEpCisJCVdSSVRFX09OQ0UoYiwgYSk7CisJZWxzZQorCQlXUklURV9PTkNFKGIsIDQyKTsKKworICAgICDsu7TtjIzsnbzrn6zripQg66Gc65Oc66W8IOunjOuTpOyWtOuCvCDsiJjrj4Qg7J6I7Iq164uI64ukLiAg7J2867CY7KCB7Jy866Gc64qUIOusuOygnOulvCDsnbzsnLztgqTsp4AKKyAgICAg7JWK7KeA66eMLCDsupDsi5wg65287J24IOuwlOyatOyLseydhCDsnbzsnLzsvJwg7ISx64ql6rO8IO2ZleyepeyEseydhCDrlqjslrTrnKjrprQg7IiYIOyeiOyKteuLiOuLpC4KKyAgICAg64Kg7KGw65CcIOuhnOuTnOulvCDrp4nquLAg7JyE7ZW07ISgIFJFQURfT05DRSgpIOulvCDsgqzsmqntlZjshLjsmpQuCisKKyAoKikg7KCV66Cs65CcIOuplOuqqOumrCDso7zshozsl5Ag7JyE7LmY7ZWcLCDtlZzrsojsnZgg66mU66qo66asIOywuOyhsCDsnbjsiqTtirjrn63shZjsnLzroZwg7JWh7IS47IqkCisgICAgIOqwgOuKpe2VnCDtgazquLDsnZgg642w7J207YSw64qUIO2VmOuCmOydmCDtgbAg7JWh7IS47Iqk6rCAIOyXrOufrOqwnOydmCDsnpHsnYAg7JWh7IS47Iqk65Ok66GcCisgICAgIOuMgOyytOuQmOuKlCAi66Gc65OcIO2LsOyWtOungShsb2FkIHRlYXJpbmcpIiDqs7wgIuyKpO2GoOyWtCDti7DslrTrp4Eoc3RvcmUgdGVhcmluZykiIOydhAorICAgICDrsKnsp4Dtlanri4jri6QuICDsmIjrpbwg65Ok7Ja0LCDso7zslrTsp4Qg7JWE7YKk7YWN7LOQ6rCAIDctYml0IGltZWVkaWF0ZSBmaWVsZCDrpbwg6rCW64qUCisgICAgIDE2LWJpdCDsiqTthqDslrQg7J247Iqk7Yq465+t7IWY7J2EIOygnOqzte2VnOuLpOuptCwg7Lu07YyM7J2865+s64qUIOuLpOydjOydmCAzMi1iaXQg7Iqk7Yag7Ja066W8CisgICAgIOq1rO2YhO2VmOuKlOuNsOyXkCDrkZDqsJzsnZggMTYtYml0IHN0b3JlLWltbWVkaWF0ZSDrqoXroLnsnYQg7IKs7Jqp7ZWY66CkIO2VoOqygeuLiOuLpDoKKworCXAgPSAweDAwMDEwMDAyOworCisgICAgIOyKpO2GoOyWtCDtlaAg7IOB7IiY66W8IOunjOuTpOqzoCDqt7gg6rCS7J2EIOyKpO2GoOyWtCDtlZjquLAg7JyE7ZW0IOuRkOqwnOqwgCDrhJjripQg7J247Iqk7Yq465+t7IWY7J2ECisgICAgIOyCrOyaqe2VmOqyjCDrkJjripQsIOydtOufsCDsooXrpZjsnZgg7LWc7KCB7ZmU66W8IEdDQyDripQg7Iuk7KCc66GcIO2VqOydhCDrtoDrlJQg7JWM7JWEIOuRkOyLreyLnOyYpC4KKyAgICAg7J20IOy1nOygge2ZlOuKlCDsi7HquIAg7JOw66CI65OcIOy9lOuTnOyXkOyEnOuKlCDshLHqs7XsoIHsnbgg7LWc7KCB7ZmUIOyeheuLiOuLpC4gIOyLpOygnOuhnCwg6re8656Y7JeQCisgICAgIOuwnOyDne2VnCAo6re466as6rOgIOqzoOyzkOynhCkg67KE6re464qUIEdDQyDqsIAgdm9sYXRpbGUg7Iqk7Yag7Ja07JeQIOu5hOygleyDgeyggeycvOuhnCDsnbQKKyAgICAg7LWc7KCB7ZmU66W8IOyCrOyaqe2VmOqyjCDtlojsirXri4jri6QuICDqt7jrn7Ag67KE6re46rCAIOyXhuuLpOuptCwg64uk7J2M7J2YIOyYiOyXkOyEnAorICAgICBXUklURV9PTkNFKCkg7J2YIOyCrOyaqeydgCDsiqTthqDslrQg7Yuw7Ja066eB7J2EIOuwqeyngO2VqeuLiOuLpDoKKworCVdSSVRFX09OQ0UocCwgMHgwMDAxMDAwMik7CisKKyAgICAgUGFja2VkIOq1rOyhsOyytOydmCDsgqzsmqkg7Jet7IucIOuLpOydjOydmCDsmIjsspjrn7wgIOuhnOuTnCAvIOyKpO2GoOyWtCDti7DslrTrp4HsnYQg7Jyg67Cc7ZWgIOyImAorICAgICDsnojsirXri4jri6Q6CisKKwlzdHJ1Y3QgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpIGZvbyB7CisJCXNob3J0IGE7CisJCWludCBiOworCQlzaG9ydCBjOworCX07CisJc3RydWN0IGZvbyBmb28xLCBmb28yOworCS4uLgorCisJZm9vMi5hID0gZm9vMS5hOworCWZvbzIuYiA9IGZvbzEuYjsKKwlmb28yLmMgPSBmb28xLmM7CisKKyAgICAgUkVBRF9PTkNFKCkg64KYIFdSSVRFX09OQ0UoKSDrj4Qg7JeG6rOgIHZvbGF0aWxlIOuniO2CueuPhCDsl4bquLAg65WM66y47JeQLAorICAgICDsu7TtjIzsnbzrn6zripQg7J20IOyEuOqwnOydmCDrjIDsnoXrrLjsnYQg65GQ6rCc7J2YIDMyLWJpdCDroZzrk5zsmYAg65GQ6rCc7J2YIDMyLWJpdCDsiqTthqDslrTroZwKKyAgICAg67OA7ZmY7ZWgIOyImCDsnojsirXri4jri6QuICDsnbTripQgJ2ZvbzEuYicg7J2YIOqwkuydmCDroZzrk5wg7Yuw7Ja066eB6rO8ICdmb28yLmInIOydmAorICAgICDsiqTthqDslrQg7Yuw7Ja066eB7J2EIOy0iOuemO2VoCDqsoHri4jri6QuICDsnbQg7JiI7JeQ7ISc64+EIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkKKyAgICAg6rCAIO2LsOyWtOungeydhCDrp4nsnYQg7IiYIOyeiOyKteuLiOuLpDoKKworCWZvbzIuYSA9IGZvbzEuYTsKKwlXUklURV9PTkNFKGZvbzIuYiwgUkVBRF9PTkNFKGZvbzEuYikpOworCWZvbzIuYyA9IGZvbzEuYzsKKwor6re466CH7KeA66eMLCB2b2xhdGlsZSDroZwg66eI7YGs65CcIOuzgOyImOyXkCDrjIDtlbTshJzripQgUkVBRF9PTkNFKCkg7JmAIFdSSVRFX09OQ0UoKSDqsIAKK+2VhOyalOy5mCDslYrsirXri4jri6QuICDsmIjrpbwg65Ok7Ja0LCAnamlmZmllcycg64qUIHZvbGF0aWxlIOuhnCDrp4jtgazrkJjslrQg7J6I6riwIOuVjOusuOyXkCwKK1JFQURfT05DRShqaWZmaWVzKSDrnbzqs6Ag7ZWgIO2VhOyalOqwgCDsl4bsirXri4jri6QuICBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOqwgAor7Iuk7J2AIHZvbGF0aWxlIOy6kOyKpO2MheycvOuhnCDqtaztmITrkJjslrQg7J6I7Ja07IScIOyduOyekOqwgCDsnbTrr7ggdm9sYXRpbGUg66GcIOuniO2BrOuQmOyWtAor7J6I64uk66m0IOuYkOuLpOuluCDtmqjqs7zrpbwg64K07KeA64qUIOyViuq4sCDrlYzrrLjsnoXri4jri6QuCisKK+ydtCDsu7TtjIzsnbzrn6wg67Cw66as7Ja065Ok7J2AIENQVSDsl5DripQg7KeB7KCR7KCBIO2aqOqzvOulvCDsoITtmIAg66eM65Ok7KeAIOyViuq4sCDrlYzrrLjsl5AsIOqysOq1reydgAor7J6s67Cw7LmY6rCAIOydvOyWtOuCoCDsiJjrj4Qg7J6I7J2M7J2EIOu2gOuUlCDquLDslrXtlbQg65GQ7Iut7Iuc7JikLgorCisKK0NQVSDrqZTrqqjrpqwg67Cw66as7Ja0CistLS0tLS0tLS0tLS0tLS0tLQorCivrpqzriIXsiqQg7Luk64SQ7J2AIOuLpOydjOydmCDsl6zrjZ/qsJwg6riw67O4IENQVSDrqZTrqqjrpqwg67Cw66as7Ja066W8IOqwgOyngOqzoCDsnojsirXri4jri6Q6CisKKwlUWVBFCQlNQU5EQVRPUlkJCVNNUCBDT05ESVRJT05BTAorCT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwnrspTsmqkJCW1iKCkJCQlzbXBfbWIoKQorCeyTsOq4sAkJd21iKCkJCQlzbXBfd21iKCkKKwnsnb3quLAJCXJtYigpCQkJc21wX3JtYigpCisJ642w7J207YSwIOydmOyhtOyEsQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCisKKwor642w7J207YSwIOydmOyhtOyEsSDrsLDrpqzslrTrpbwg7KCc7Jm47ZWcIOuqqOuToCDrqZTrqqjrpqwg67Cw66as7Ja064qUIOy7tO2MjOydvOufrCDrsLDrpqzslrTrpbwKK+2PrO2VqO2VqeuLiOuLpC4gIOuNsOydtO2EsCDsnZjsobTshLHsnYAg7Lu07YyM7J2865+s7JeQ7J2YIOy2lOqwgOyggeyduCDsiJzshJwg67O07J6l7J2EIO2PrO2VqO2VmOyngAor7JWK7Iq164uI64ukLgorCivrsKnrsLE6IOuNsOydtO2EsCDsnZjsobTshLHsnbQg7J6I64qUIOqyveyasCwg7Lu07YyM7J2865+s64qUIO2VtOuLuSDroZzrk5zrpbwg7Jis67CU66W4IOyInOyEnOuhnCDsnbzsnLztgqwKK+qyg+ycvOuhnCAo7JiIOiBgYVtiXWAg64qUIGFbYl0g66W8IOuhnOuTnCDtlZjquLAg7KCE7JeQIGIg7J2YIOqwkuydhCDrqLzsoIAg66Gc65Oc7ZWc64ukKQor6riw64yA65CY7KeA66eMLCBDIOyWuOyWtCDsgqzslpHsl5DripQg7Lu07YyM7J2865+s6rCAIGIg7J2YIOqwkuydhCDstpTsuKEgKOyYiDogMSDqs7wg6rCZ7J2MKSDtlbTshJwKK2IgIOuhnOuTnCDsoITsl5AgYSDroZzrk5zrpbwg7ZWY64qUIOy9lOuTnCAo7JiIOiB0bXAgPSBhWzFdOyBpZiAoYiAhPSAxKSB0bXAgPSBhW2JdOyApIOulvAor66eM65Ok7KeAIOyViuyVhOyVvCDtlZzri6TripQg64K07JqpIOqwmeydgCDqsbQg7JeG7Iq164uI64ukLiAg65iQ7ZWcIOy7tO2MjOydvOufrOuKlCBhW2JdIOulvCDroZzrk5ztlZwKK+2bhOyXkCBiIOulvCDrmJDri6Tsi5wg66Gc65Oc7ZWgIOyImOuPhCDsnojslrTshJwsIGFbYl0g67O064ukIOy1nOyLoCDrsoTsoITsnZggYiDqsJLsnYQg6rCA7KeIIOyImOuPhAor7J6I7Iq164uI64ukLiAg7J2065+wIOusuOygnOuTpOydmCDtlbTqsrDssYXsl5Ag64yA7ZWcIOydmOqyrCDsnbzsuZjripQg7JWE7KeBIOyXhuyKteuLiOuLpOunjCwg7J2864uoCitSRUFEX09OQ0UoKSDrp6TtgazroZzrtoDthLAg67O06riwIOyLnOyeke2VmOuKlOqyjCDsoovsnYAg7Iuc7J6R7J20IOuQoOqygeuLiOuLpC4KKworU01QIOuplOuqqOumrCDrsLDrpqzslrTrk6TsnYAg7Jyg64uI7ZSE66Gc7IS47ISc66GcIOy7tO2MjOydvOuQnCDsi5zsiqTthZzsl5DshJzripQg7Lu07YyM7J2865+sIOuwsOumrOyWtOuhnAor67CU64CM64qU642wLCDtlZjrgpjsnZggQ1BVIOuKlCDsiqTsiqTroZwg7J286rSA7ISx7J2EIOycoOyngO2VmOqzoCwg6rK57LmY64qUIOyVoeyEuOyKpOuTpCDsl63si5wg7Jis67CU66W4CivsiJzshJzroZwg7ZaJ7ZW07KeIIOqyg+ycvOuhnCDsg53qsIHrkJjquLAg65WM66y47J6F64uI64ukLiAg7ZWY7KeA66eMLCDslYTrnpjsnZggIlZpcnR1YWwgTWFjaGluZQorR3Vlc3RzIiDshJzruIzshLnshZjsnYQg7LC46rOg7ZWY7Iut7Iuc7JikLgorCitbIV0gU01QIOyLnOyKpO2FnOyXkOyEnCDqs7XsnKDrqZTrqqjrpqzroZzsnZgg7KCR6re865Ok7J2EIOyInOyEnCDshLjsm4zslbwg7ZWgIOuVjCwgU01QIOuplOuqqOumrAor67Cw66as7Ja064qUIF/rsJjrk5zsi5xfIOyCrOyaqeuQmOyWtOyVvCDtlajsnYQg6riw7Ja17ZWY7IS47JqULCDqt7jrjIDsi6Ag65297J2EIOyCrOyaqe2VmOuKlCDqsoPsnLzroZzrj4QKK+y2qeu2hO2VmOq4tCDtlZjsp4Drp4wg66eQ7J207KOgLgorCitNYW5kYXRvcnkg67Cw66as7Ja065Ok7J2AIFNNUCDsi5zsiqTthZzsl5DshJzrj4QgVVAg7Iuc7Iqk7YWc7JeQ7ISc64+EIFNNUCDtmqjqs7zrp4wg7Ya17KCc7ZWY6riw7JeQ64qUCivrtojtlYTsmpTtlZwg7Jik67KE7Zek65Oc66W8IOqwluq4sCDrlYzrrLjsl5AgU01QIO2aqOqzvOunjCDthrXsoJztlZjrqbQg65CY64qUIOqzs+yXkOuKlCDsgqzsmqnrkJjsp4Ag7JWK7JWE7JW8Civtlanri4jri6QuICDtlZjsp4Drp4wsIOuKkOyKqO2VnCDsiJzshJwg6rec7LmZ7J2YIOuplOuqqOumrCBJL08g7JyI64+E7Jqw66W8IO2Gte2VnCBNTUlPIOydmCDtmqjqs7zrpbwKK+2GteygnO2VoCDrlYzsl5DripQgbWFuZGF0b3J5IOuwsOumrOyWtOuTpOydtCDsgqzsmqnrkKAg7IiYIOyeiOyKteuLiOuLpC4gIOydtCDrsLDrpqzslrTrk6TsnYAKK+y7tO2MjOydvOufrOyZgCBDUFUg66qo65GQIOyerOuwsOy5mOulvCDrqrvtlZjrj4TroZ0g7ZWo7Jy866Gc7I2oIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjrk6TsnbQg65SU67CU7J207Iqk7JeQCivrs7Tsl6zsp4DripQg7Iic7ISc7JeQ64+EIOyYge2WpeydhCDso7zquLAg65WM66y47JeQLCBTTVAg6rCAIOyVhOuLjCDsi5zsiqTthZzsnbTrnbwg7ZWg7KeA652864+EIO2VhOyalO2VoCDsiJgKK+yeiOyKteuLiOuLpC4KKworCivsnbzrtoAg6rOg6riJIOuwsOumrOyWtCDtlajsiJjrk6Trj4Qg7J6I7Iq164uI64ukOgorCisgKCopIHNtcF9zdG9yZV9tYih2YXIsIHZhbHVlKQorCisgICAgIOydtCDtlajsiJjripQg7Yq57KCVIOuzgOyImOyXkCDtirnsoJUg6rCS7J2EIOuMgOyehe2VmOqzoCDrspTsmqkg66mU66qo66asIOuwsOumrOyWtOulvCDsuanri4jri6QuCisgICAgIFVQIOy7tO2MjOydvOyXkOyEnOuKlCDsu7TtjIzsnbzrn6wg67Cw66as7Ja067O064ukIOuNlO2VnCDqsoPsnYQg7Lmc64uk6rOg64qUIOuztOyepeuQmOyngCDslYrsirXri4jri6QuCisKKworICgqKSBzbXBfbWJfX2JlZm9yZV9hdG9taWMoKTsKKyAoKikgc21wX21iX19hZnRlcl9hdG9taWMoKTsKKworICAgICDsnbTqsoPrk6TsnYAg6rCS7J2EIOumrO2EtO2VmOyngCDslYrripQgKOuNlO2VmOq4sCwg67m86riwLCDspp3qsIAsIOqwkOyGjOyZgCDqsJnsnYApIOyWtO2GoOuvuQorICAgICDtlajsiJjrk6TsnYQg7JyE7ZWcLCDtirntnogg6re46rKD65Ok7J20IOugiO2NvOufsOyKpCDsubTsmrTtjIXsl5Ag7IKs7Jqp65CgIOuVjOulvCDsnITtlZwKKyAgICAg7ZWo7IiY65Ok7J6F64uI64ukLiAg7J20IO2VqOyImOuTpOydgCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOuCtO2PrO2VmOqzoCDsnojsp4DripQg7JWK7Iq164uI64ukLgorCisgICAgIOydtOqyg+uTpOydgCDqsJLsnYQg66as7YS07ZWY7KeAIOyViuycvOupsCDslrTthqDrr7ntlZwgKHNldF9iaXQg6rO8IGNsZWFyX2JpdCDqsJnsnYApIOu5hO2KuAorICAgICDsl7DsgrDsl5Drj4Qg7IKs7Jqp65CgIOyImCDsnojsirXri4jri6QuCisKKyAgICAg7ZWcIOyYiOuhnCwg6rCd7LK0IO2VmOuCmOulvCDrrLTtmqjtlZwg6rKD7Jy866GcIO2RnOyLnO2VmOqzoCDqt7gg6rCd7LK07J2YIOugiO2NvOufsOyKpCDsubTsmrTtirjrpbwKKyAgICAg6rCQ7IaM7Iuc7YKk64qUIOuLpOydjCDsvZTrk5zrpbwg67O07IS47JqUOgorCisJb2JqLT5kZWFkID0gMTsKKwlzbXBfbWJfX2JlZm9yZV9hdG9taWMoKTsKKwlhdG9taWNfZGVjKCZvYmotPnJlZl9jb3VudCk7CisKKyAgICAg7J20IOy9lOuTnOuKlCDqsJ3ssrTsnZgg7JeF642w7J207Yq465CcIGRlYXRoIOuniO2BrOqwgCDroIjtjbzrn7DsiqQg7Lm07Jq07YSwIOqwkOyGjCDrj5nsnpEKKyAgICAgKuyghOyXkCog67O07J28IOqyg+ydhCDrs7TsnqXtlanri4jri6QuCisKKyAgICAg642UIOunjuydgCDsoJXrs7Trpbwg7JyE7ZW07ISgIERvY3VtZW50YXRpb24vYXRvbWljX29wcy50eHQg66y47ISc66W8IOywuOqzoO2VmOyEuOyalC4KKyAgICAg7Ja065SU7IScIOydtOqyg+uTpOydhCDsgqzsmqntlbTslbwg7ZWg7KeAIOq2geq4iO2VmOuLpOuptCAi7Ja07Yag66+5IOyYpO2NvOugiOydtOyFmCIg7ISc67iM7IS57IWY7J2ECisgICAgIOywuOqzoO2VmOyEuOyalC4KKworCisgKCopIGxvY2tsZXNzX2RlcmVmZXJlbmNlKCk7CisKKyAgICAg7J20IO2VqOyImOuKlCBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKSDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOulvCDsgqzsmqntlZjripQKKyAgICAg7Y+s7J247YSwIOydveyWtOyYpOq4sCDrnpjtjbwod3JhcHBlcikg7ZWo7IiY66GcIOyDneqwgeuQoCDsiJgg7J6I7Iq164uI64ukLgorCisgICAgIOqwneyytOydmCDrnbzsnbTtlITtg4DsnoTsnbQgUkNVIOyZuOydmCDrqZTsu6Tri4jsppjsnLzroZwg6rSA66as65Cc64uk64qUIOygkOydhCDsoJzsmbjtlZjrqbQKKyAgICAgcmN1X2RlcmVmZXJlbmNlKCkg7JmA64+EIOycoOyCrO2VnOuNsCwg7JiI66W8IOuTpOuptCDqsJ3ssrTqsIAg7Iuc7Iqk7YWc7J20IOq6vOyniCDrlYzsl5Drp4wKKyAgICAg7KCc6rGw65CY64qUIOqyveyasCDrk7HsnoXri4jri6QuICDrmJDtlZwsIGxvY2tsZXNzX2RlcmVmZXJlbmNlKCkg7J2AIFJDVSDsmYAg7ZWo6ruYCisgICAgIOyCrOyaqeuQoOyImOuPhCwgUkNVIOyXhuydtCDsgqzsmqnrkKAg7IiY64+EIOyeiOuKlCDsnbzrtoAg642w7J207YSwIOq1rOyhsOyXkCDsgqzsmqnrkJjqs6AKKyAgICAg7J6I7Iq164uI64ukLgorCisKKyAoKikgZG1hX3dtYigpOworICgqKSBkbWFfcm1iKCk7CisKKyAgICAg7J206rKD65Ok7J2AIENQVSDsmYAgRE1BIOqwgOuKpe2VnCDrlJTrsJTsnbTsiqTsl5DshJwg66qo65GQIOyVoeyEuOyKpCDqsIDriqXtlZwg6rO17JygIOuplOuqqOumrOydmAorICAgICDsnb3quLAsIOyTsOq4sCDsnpHsl4Xrk6TsnZgg7Iic7ISc66W8IOuztOyepe2VmOq4sCDsnITtlbQgY29uc2lzdGVudCBtZW1vcnkg7JeQ7IScIOyCrOyaqe2VmOq4sAorICAgICDsnITtlZwg6rKD65Ok7J6F64uI64ukLgorCisgICAgIOyYiOulvCDrk6TslrQsIOuUlOuwlOydtOyKpOyZgCDrqZTrqqjrpqzrpbwg6rO17Jyg7ZWY66mwLCDrlJTsiqTtgazrpr3thLAg7IOB7YOcIOqwkuydhCDsgqzsmqntlbQKKyAgICAg65SU7Iqk7YGs66a97YSw6rCAIOuUlOuwlOydtOyKpOyXkCDsho3tlbQg7J6I64qU7KeAIOyVhOuLiOuptCBDUFUg7JeQIOyGje2VtCDsnojripTsp4Ag7ZGc7Iuc7ZWY6rOgLAorICAgICDqs7Xsp4Dsmqkg7LSI7J247KKFKGRvb3JiZWxsKSDsnYQg7IKs7Jqp7ZW0IOyXheuNsOydtO2KuOuQnCDrlJTsiqTtgazrpr3thLDqsIAg65SU67CU7J207Iqk7JeQIOyCrOyaqQorICAgICDqsIDriqXtlbTsoYzsnYzsnYQg6rO17KeA7ZWY64qUIOuUlOuwlOydtOyKpCDrk5zrnbzsnbTrsoTrpbwg7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworCWlmIChkZXNjLT5zdGF0dXMgIT0gREVWSUNFX09XTikgeworCQkvKiDrlJTsiqTtgazrpr3thLDrpbwg7IaM7Jyg7ZWY6riwIOyghOyXkOuKlCDrjbDsnbTthLDrpbwg7J297KeAIOyViuydjCAqLworCQlkbWFfcm1iKCk7CisKKwkJLyog642w7J207YSw66W8IOydveqzoCDslIAgKi8KKwkJcmVhZF9kYXRhID0gZGVzYy0+ZGF0YTsKKwkJZGVzYy0+ZGF0YSA9IHdyaXRlX2RhdGE7CisKKwkJLyog7IOB7YOcIOyXheuNsOydtO2KuCDsoIQg7IiY7KCV7IKs7ZWt7J2EIOuwmOyYgSAqLworCQlkbWFfd21iKCk7CisKKwkJLyog7IaM7Jyg6raM7J2EIOyImOyglSAqLworCQlkZXNjLT5zdGF0dXMgPSBERVZJQ0VfT1dOOworCisJCS8qIE1NSU8g66W8IO2Gte2VtCDrlJTrsJTsnbTsiqTsl5Ag6rO17KeA66W8IO2VmOq4sCDsoITsl5Ag66mU66qo66as66W8IOuPmeq4sO2ZlCAqLworCQl3bWIoKTsKKworCQkvKiDsl4XrjbDsnbTtirjrkJwg65SU7Iqk7YGs66a97YSw7J2YIOuUlOuwlOydtOyKpOyXkCDqs7Xsp4AgKi8KKwkJd3JpdGVsKERFU0NfTk9USUZZLCBkb29yYmVsbCk7CisJfQorCisgICAgIGRtYV9ybWIoKSDripQg65SU7Iqk7YGs66a97YSw66Gc67aA7YSwIOuNsOydtO2EsOulvCDsnb3slrTsmKTquLAg7KCE7JeQIOuUlOuwlOydtOyKpOqwgCDshozsnKDqtozsnYQKKyAgICAg64K064aT7JWY7J2M7J2EIOuztOyepe2VmOqyjCDtlZjqs6AsIGRtYV93bWIoKSDripQg65SU67CU7J207Iqk6rCAIOyekOyLoOydtCDshozsnKDqtozsnYQg64uk7IucCisgICAgIOqwgOyhjOydjOydhCDrs7TquLAg7KCE7JeQIOuUlOyKpO2BrOumve2EsOyXkCDrjbDsnbTthLDqsIAg7JOw7JiA7J2M7J2EIOuztOyepe2VqeuLiOuLpC4gIHdtYigpIOuKlAorICAgICDsupDsi5wg7J286rSA7ISx7J20IOyXhuuKlCAoY2FjaGUgaW5jb2hlcmVudCkgTU1JTyDsmIHsl63sl5Ag7JOw6riw66W8IOyLnOuPhO2VmOq4sCDsoITsl5AKKyAgICAg7LqQ7IucIOydvOq0gOyEseydtCDsnojripQg66mU66qo66asIChjYWNoZSBjb2hlcmVudCBtZW1vcnkpIOyTsOq4sOqwgCDsmYTro4zrkJjsl4jsnYzsnYQKKyAgICAg67O07J6l7ZW07KO86riwIOychO2VtCDtlYTsmpTtlanri4jri6QuCisKKyAgICAgY29uc2lzdGVudCBtZW1vcnkg7JeQIOuMgO2VnCDsnpDshLjtlZwg64K07Jqp7J2EIOychO2VtOyEoCBEb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CisgICAgIOusuOyEnOulvCDssLjqs6DtlZjshLjsmpQuCisKKworTU1JTyDsk7DquLAg67Cw66as7Ja0CistLS0tLS0tLS0tLS0tLS0tCisKK+umrOuIheyKpCDsu6TrhJDsnYAg65iQ7ZWcIG1lbW9yeS1tYXBwZWQgSS9PIOyTsOq4sOulvCDsnITtlZwg7Yq567OE7ZWcIOuwsOumrOyWtOuPhCDqsIDsp4Dqs6AKK+yeiOyKteuLiOuLpDoKKworCW1taW93YigpOworCivsnbTqsoPsnYAgbWFuZGF0b3J5IOyTsOq4sCDrsLDrpqzslrTsnZgg67OA7KKF7Jy866GcLCDsmYTtmZTrkJwg7Iic7IScIOq3nOy5meydmCBJL08g7JiB7Jet7JeQ7Jy866Gc7J2YCivsk7DquLDqsIAg67aA67aE7KCB7Jy866GcIOyInOyEnOulvCDrp57stpTrj4TroZ0g7ZW07KSN64uI64ukLiAg7J20IO2VqOyImOuKlCBDUFUtPu2VmOuTnOybqOyWtCDsgqzsnbTrpbwKK+uEmOyWtOyEnCDsi6TsoJwg7ZWY65Oc7Juo7Ja07JeQ6rmM7KeAIOydvOu2gCDsiJjspIDsnZgg7JiB7Zal7J2EIOuBvOy5qeuLiOuLpC4KKwor642UIOunjuydgCDsoJXrs7Trpbwg7JyE7ZW07ISgICJBY3F1aXJlIHZzIEkvTyDslaHshLjsiqQiIOyEnOu4jOyEueyFmOydhCDssLjqs6DtlZjshLjsmpQuCisKKworPT09PT09PT09PT09PT09PT09PT09PT09PQor7JWU66y17KCBIOy7pOuEkCDrqZTrqqjrpqwg67Cw66as7Ja0Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK+umrOuIheyKpCDsu6TrhJDsnZgg7J2867aAIO2VqOyImOuTpOydgCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOuCtOyepe2VmOqzoCDsnojripTrjbAsIOudvShsb2NrKeqzvAor7Iqk7LyA7KW066eBIOq0gOugqCDtlajsiJjrk6TsnbQg64yA67aA67aE7J6F64uI64ukLgorCivsl6zquLDshKAgX+y1nOyGjO2VnOydmF8g67O07J6l7J2EIOyEpOuqhe2VqeuLiOuLpDsg7Yq57KCVIOyVhO2CpO2FjeyzkOyXkOyEnOuKlCDsnbQg7ISk66qF67O064ukIOuNlCDrp47snYAKK+uztOyepeydhCDsoJzqs7XtlaAg7IiY64+EIOyeiOyKteuLiOuLpOunjCDtlbTri7kg7JWE7YKk7YWN7LOQ7JeQIOyiheyGjeyggeyduCDsvZTrk5wg7Jm47J2YIOu2gOu2hOyXkOyEnOuKlAor6re465+wIOuztOyepeydhCDquLDrjIDtlbTshKAg7JWI65Cg6rKB64uI64ukLgorCisKK+udvSBBQ1FVSVNJVElPTiDtlajsiJgKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKwor66as64iF7IqkIOy7pOuEkOydgCDri6TslpHtlZwg6529IOq1rOyEseyytOulvCDqsIDsp4Dqs6Ag7J6I7Iq164uI64ukOgorCisgKCopIOyKpO2VgCDrnb0KKyAoKikgUi9XIOyKpO2VgCDrnb0KKyAoKikg666k7YWN7IqkCisgKCopIOyEuOuniO2PrOyWtAorICgqKSBSL1cg7IS466eI7Y+s7Ja0CisKK+qwgSDqtazshLHssrTrp4jri6Qg66qo65OgIOqyveyasOyXkCAiQUNRVUlSRSIg7Jik7Y2866CI7J207IWY6rO8ICJSRUxFQVNFIiDsmKTtjbzroIjsnbTshZjsnZgg67OA7KKF7J20CivsobTsnqztlanri4jri6QuICDsnbQg7Jik7Y2866CI7J207IWY65Ok7J2AIOuqqOuRkCDsoIHsoIjtlZwg67Cw66as7Ja066W8IOuCtO2PrO2VmOqzoCDsnojsirXri4jri6Q6CisKKyAoMSkgQUNRVUlSRSDsmKTtjbzroIjsnbTshZjsnZgg7JiB7ZalOgorCisgICAgIEFDUVVJUkUg65Kk7JeQ7IScIOyalOyyreuQnCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY7J2AIEFDUVVJUkUg7Jik7Y2866CI7J207IWY7J20IOyZhOujjOuQnAorICAgICDrkqTsl5Ag7JmE66OM65Cp64uI64ukLgorCisgICAgIEFDUVVJUkUg7JWe7JeQ7IScIOyalOyyreuQnCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY7J2AIEFDUVVJUkUg7Jik7Y2866CI7J207IWY7J20IOyZhOujjOuQnCDtm4Tsl5AKKyAgICAg7JmE66OM65CgIOyImCDsnojsirXri4jri6QuICBzbXBfbWJfX2JlZm9yZV9zcGlubG9jaygpIOuSpOyXkCBBQ1FVSVJFIOqwgCDsi6TtlonrkJjripQKKyAgICAg7L2U65OcIOu4lOuhneydgCDruJTroZ0g7JWe7J2YIOyKpO2GoOyWtOulvCDruJTroZ0g65Kk7J2YIOuhnOuTnOyZgCDsiqTthqDslrTsl5Ag64yA7ZW0IOyInOyEnAorICAgICDrp57stqXri4jri6QuICDsnbTqsbQgc21wX21iKCkg67O064ukIOyZhO2ZlOuQnCDqsoPsnoTsnYQg6riw7Ja17ZWY7IS47JqUISAg66eO7J2AIOyVhO2CpO2FjeyzkOyXkOyEnAorICAgICBzbXBfbWJfX2JlZm9yZV9zcGlubG9jaygpIOydgCDsgqzsi6Qg7JWE66y07J2864+EIO2VmOyngCDslYrsirXri4jri6QuCisKKyAoMikgUkVMRUFTRSDsmKTtjbzroIjsnbTshZjsnZgg7JiB7ZalOgorCisgICAgIFJFTEVBU0Ug7JWe7JeQ7IScIOyalOyyreuQnCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY7J2AIFJFTEVBU0Ug7Jik7Y2866CI7J207IWY7J20IOyZhOujjOuQmOq4sAorICAgICDsoITsl5Ag7JmE66OM65Cp64uI64ukLgorCisgICAgIFJFTEVBU0Ug65Kk7JeQ7IScIOyalOyyreuQnCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWY7J2AIFJFTEVBU0Ug7Jik7Y2866CI7J207IWYIOyZhOujjCDsoITsl5AKKyAgICAg7JmE66OM65CgIOyImCDsnojsirXri4jri6QuCisKKyAoMykgQUNRVUlSRSB2cyBBQ1FVSVJFIOyYge2WpToKKworICAgICDslrTrlqQgQUNRVUlSRSDsmKTtjbzroIjsnbTshZjrs7Tri6Qg7JWe7JeQ7IScIOyalOyyreuQnCDrqqjrk6AgQUNRVUlSRSDsmKTtjbzroIjsnbTshZjsnYAg6re4CisgICAgIEFDUVVJUkUg7Jik7Y2866CI7J207IWYIOyghOyXkCDsmYTro4zrkKnri4jri6QuCisKKyAoNCkgQUNRVUlSRSB2cyBSRUxFQVNFIGltcGxpY2F0aW9uOgorCisgICAgIOyWtOuWpCBSRUxFQVNFIOyYpO2NvOugiOydtOyFmOuztOuLpCDslZ7shJwg7JqU7LKt65CcIEFDUVVJUkUg7Jik7Y2866CI7J207IWY7J2AIOq3uCBSRUxFQVNFCisgICAgIOyYpO2NvOugiOydtOyFmOuztOuLpCDrqLzsoIAg7JmE66OM65Cp64uI64ukLgorCisgKDUpIOyLpO2MqO2VnCDsobDqsbTsoIEgQUNRVUlSRSDsmIHtlqU6CisKKyAgICAgQUNRVUlSRSDsmKTtjbzroIjsnbTshZjsnZgg7J2867aAIOudvShsb2NrKSDrs4DsooXsnYAg65297J20IOqzp+uwlOuhnCDtmo3rk53tlZjquLDsl5DripQKKyAgICAg67aI6rCA64ql7ZWcIOyDge2DnOydtOqxsOuCmCDrnb3snbQg7ZqN65OdIOqwgOuKpe2VtOyngOuPhOuhnSDquLDri6TrpqzripQg64+E7KSRIOyLnOq3uOuEkOydhCDrsJvqsbDrgpgKKyAgICAg7ZW07IScIOyLpO2MqO2VoCDsiJgg7J6I7Iq164uI64ukLiAg7Iuk7Yyo7ZWcIOudveydgCDslrTrlqQg67Cw66as7Ja064+EIOuCtO2PrO2VmOyngCDslYrsirXri4jri6QuCisKK1shXSDssLjqs6A6IOudvSBBQ1FVSVJFIOyZgCBSRUxFQVNFIOqwgCDri6jrsKntlqUg67Cw66as7Ja07Jes7IScIOuCmO2DgOuCmOuKlCDtmITsg4Eg7KSRIO2VmOuCmOuKlAor7YGs66as7Yuw7LusIOyEueyFmCDrsJTquaXsnZgg7J247Iqk7Yq465+t7IWY7J2YIOyYge2WpeydtCDtgazrpqzti7Dsu6wg7IS57IWYIOuCtOu2gOuhnOuPhCDrk6TslrTsmKwg7IiYCivsnojri6TripQg6rKD7J6F64uI64ukLgorCitSRUxFQVNFIO2bhOyXkCDsmpTssq3rkJjripQgQUNRVUlSRSDripQg7KCE7LK0IOuplOuqqOumrCDrsLDrpqzslrTrnbwg7Jes6rKo7KeA66m0IOyViOuQmOuKlOuNsCwKK0FDUVVJUkUg7JWe7J2YIOyVoeyEuOyKpOqwgCBBQ1FVSVJFIO2bhOyXkCDsiJjtlonrkKAg7IiYIOyeiOqzoCwgUkVMRUFTRSDtm4TsnZgg7JWh7IS47Iqk6rCACitSRUxFQVNFIOyghOyXkCDsiJjtlonrkKAg7IiY64+EIOyeiOycvOupsCwg6re4IOuRkOqwnOydmCDslaHshLjsiqTqsIAg7ISc66Gc66W8IOyngOuCmOy5oCDsiJjrj4Qg7J6I6riwCivrlYzrrLjsnoXri4jri6Q6CisKKwkqQSA9IGE7CisJQUNRVUlSRSBNCisJUkVMRUFTRSBNCisJKkIgPSBiOworCivripQg64uk7J2M6rO8IOqwmeydtCDrkKAg7IiY64+EIOyeiOyKteuLiOuLpDoKKworCUFDUVVJUkUgTSwgU1RPUkUgKkIsIFNUT1JFICpBLCBSRUxFQVNFIE0KKworQUNRVUlSRSDsmYAgUkVMRUFTRSDqsIAg6529IO2ajeuTneqzvCDtlbTsoJzrnbzrqbQsIOq3uOumrOqzoCDrnb3snZggQUNRVUlSRSDsmYAgUkVMRUFTRSDqsIAKK+qwmeydgCDrnb0g67OA7IiY7JeQIOuMgO2VnCDqsoPsnbTrnbzrqbQsIO2VtOuLuSDrnb3snYQg7KWQ6rOgIOyeiOyngCDslYrsnYAg64uk66W4IENQVSDsnZgg7Iuc7JW87JeQ64qUCivsnbTsmYAg6rCZ7J2AIOyerOuwsOy5mOqwgCDsnbzslrTrgpjripQg6rKD7Jy866GcIOuztOydvCDsiJgg7J6I7Iq164uI64ukLiAg7JqU7JW97ZWY7J6Q66m0LCBBQ1FVSVJFIOyXkAor7J207Ja0IFJFTEVBU0Ug7Jik7Y2866CI7J207IWY7J2EIOyInOywqOyggeycvOuhnCDsi6TtlontlZjripQg7ZaJ7JyE6rCAIOyghOyytCDrqZTrqqjrpqwg67Cw66as7Ja066GcCivsg53qsIHrkJjslrTshKAgLeyViOuQqeuLiOuLpC0uCisKK+u5hOyKt+2VmOqyjCwg7JWe7J2YIOuwmOuMgCDsvIDsnbTsiqTsnbggUkVMRUFTRSDsmYAgQUNRVUlSRSDrkZDqsJwg7Jik7Y2866CI7J207IWY7J2YIOyInOywqOyggSDsi6TtlokKK+yXreyLnCDsoITssrQg66mU66qo66asIOuwsOumrOyWtOulvCDrgrTtj6ztlZjsp4Ag7JWK7Iq164uI64ukLiAg65Sw65287IScLCBSRUxFQVNFLCBBQ1FVSVJFIOuhnAor6rec7KCV65CY64qUIO2BrOumrO2LsOy7rCDshLnshZjsnZggQ1BVIOyImO2WieydgCBSRUxFQVNFIOyZgCBBQ1FVSVJFIOulvCDqsIDroZzsp4Drpbwg7IiYIOyeiOycvOuvgOuhnCwKK+uLpOydjOqzvCDqsJnsnYAg7L2U65Oc64qUOgorCisJKkEgPSBhOworCVJFTEVBU0UgTQorCUFDUVVJUkUgTgorCSpCID0gYjsKKwor64uk7J2M6rO8IOqwmeydtCDsiJjtlonrkKAg7IiYIOyeiOyKteuLiOuLpDoKKworCUFDUVVJUkUgTiwgU1RPUkUgKkIsIFNUT1JFICpBLCBSRUxFQVNFIE0KKwor7J2065+wIOyerOuwsOy5mOuKlCDrjbDrk5zrnb3snYQg7J287Jy87YKsIOyImOuPhCDsnojsnYQg6rKD7LKY65+8IOuztOydvCDsiJgg7J6I7Iq164uI64ukLiAg7ZWY7KeA66eMLCDqt7jrn7AKK+uNsOuTnOudveydmCDsobDsp5DsnbQg7J6I64uk66m0IFJFTEVBU0Ug64qUIOuLqOyInO2eiCDsmYTro4zrkKAg6rKD7J2066+A66GcIOuNsOuTnOudveydgCDsobTsnqztlaAg7IiYCivsl4bsirXri4jri6QuCisKKwnsnbTqsowg7Ja065a76rKMIOyYrOuwlOuluCDrj5nsnpHsnYQg7ZWgIOyImCDsnojsnYTquYzsmpQ/CisKKwnsmrDrpqzqsIAg7J207JW86riwIO2VmOqzoCDsnojripTqsbQg7J6s67Cw7LmY66W8IO2VmOuKlCBDUFUg7JeQIOuMgO2VnCDsnbTslbzquLDsnbTsp4AsCisJ7Lu07YyM7J2865+s7JeQIOuMgO2VnCDqsoPsnbQg7JWE64uI656AIOygkOydtCDtlbXsi6zsnoXri4jri6QuICDsu7TtjIzsnbzrn6wgKOuYkOuKlCwg6rCc67Cc7J6QKQorCeqwgCDsmKTtjbzroIjsnbTshZjrk6TsnYQg7J2066CH6rKMIOyerOuwsOy5mO2VmOuptCwg642w65Oc65297J20IOydvOyWtOuCoCDsiJggLeyeiOyKtS3ri4jri6QuCisKKwntlZjsp4Drp4wgQ1BVIOqwgCDsmKTtjbzroIjsnbTshZjrk6TsnYQg7J6s67Cw7LmYIO2WiOuLpOuKlOqxuCDsg53qsIHtlbQg67O07IS47JqULiAg7J20IOyYiOyXkOyEnCwKKwnslrTshYjruJTrpqwg7L2U65OcIOyDgeycvOuhnOuKlCDslrjrnb3snbQg65297J2EIOyVnuyEnOqyjCDrkJjslrQg7J6I7Iq164uI64ukLiAgQ1BVIOqwgCDsnbTrpbwKKwnsnqzrsLDsuZjtlbTshJwg65Kk7J2YIOudvSDsmKTtjbzroIjsnbTshZjsnYQg66i87KCAIOyLpO2Wie2VmOqyjCDrkKnri4jri6QuICDrp4zslb0g642w65Oc65297J20CisJ7KG07J6s7ZWc64uk66m0LCDsnbQg6529IOyYpO2NvOugiOydtOyFmOydgCDqt7jsoIAg7Iqk7ZWA7J2EIO2VmOupsCDqs4Tsho3tlbTshJwg65297J2ECisJ7Iuc64+E7ZWp64uI64ukICjrmJDripQsIO2VnOywuCDtm4Tsl5DqsqDsp4Drp4wsIOyeoOuTreuLiOuLpCkuICBDUFUg64qUIOyWuOygoOqwgOuKlAorCSjslrTshYjruJTrpqwg7L2U65Oc7JeQ7ISc64qUIOudveydhCDslZ7shJzripQpIOyWuOudvSDsmKTtjbzroIjsnbTshZjsnYQg7Iuk7ZaJ7ZWY64qU642wLCDsnbQg7Ja46529CisJ7Jik7Y2866CI7J207IWY7J20IOyeoOyerOyggSDrjbDrk5zrnb3snYQg7ZW06rKw7ZWY6rOgLCDrnb0g7Jik7Y2866CI7J207IWY64+EIOuSpOydtOyWtCDshLHqs7XtlZjqsowKKwnrkKnri4jri6QuCisKKwntlZjsp4Drp4wg66eM7JW9IOudveydtCDsnqDsnYQg7J6Q64qUIO2DgOyeheydtOyXiOuLpOuptOyalD8gIOq3uOufsCDqsr3smrDsl5Ag7L2U65Oc64qUCisJ7Iqk7LyA7KW065+s66GcIOuTpOyWtOqwgOugpCDtlaAg6rGw6rOgLCDsl6zquLDshJwg6rKw6rWt7J2AIOuplOuqqOumrCDrsLDrpqzslrTrpbwg66eM64KY6rKMCisJ65CY64qU642wLCDsnbQg66mU66qo66asIOuwsOumrOyWtOuKlCDslZ7snZgg7Ja46529IOyYpO2NvOugiOydtOyFmOydtCDsmYTro4zrkJjrj4TroZ0g66eM65Ok6rOgLAorCeuNsOuTnOudveydgCDsnbTrsojsl5Drj4Qg7ZW06rKw65Cp64uI64ukLiAg7J6g7J2EIOyekOuKlCDtlonsnITsmYAg7Ja46529IOyCrOydtOydmCDqsr3so7wg7IOB7ZmpCisJKHJhY2UpIOuPhCDsnojsnYQg7IiYIOyeiOqyoOyKteuLiOuLpOunjCwg6529IOq0gOugqCDquLDriqXrk6TsnYAg6re465+wIOqyveyjvCDsg4HtmansnYQg66qo65OgCisJ6rK97Jqw7JeQIOygnOuMgOuhnCDtlbTqsrDtlaAg7IiYIOyeiOyWtOyVvCDtlanri4jri6QuCisKK+udveqzvCDshLjrp4jtj6zslrTripQgVVAg7Lu07YyM7J2865CcIOyLnOyKpO2FnOyXkOyEnOydmCDsiJzshJzsl5Ag64yA7ZW0IOuztOyepeydhCDtlZjsp4Ag7JWK6riwIOuVjOusuOyXkCwKK+q3uOufsCDsg4Htmansl5DshJwg7J247YSw65+97Yq4IOu5hO2ZnOyEse2ZlCDsmKTtjbzroIjsnbTshZjqs7wg7ZWo6ruY6rCAIOyVhOuLiOudvOuptCDslrTrlqQg7J287JeQ64+EIC0g7Yq57Z6ICitJL08g7JWh7IS47Iqk7JmAIOq0gOugqO2VtOyEnOuKlCAtIOygnOuMgOuhnCDsgqzsmqnrkKAg7IiYIOyXhuydhCDqsoHri4jri6QuCisKKyJDUFUg6rCEIEFDUVVJUklORyDrsLDrpqzslrQg7Zqo6rO8IiDshLnshZjrj4Qg7LC46rOg7ZWY7Iuc6riwIOuwlOuejeuLiOuLpC4KKworCivsmIjrpbwg65Ok7Ja0LCDri6TsnYzqs7wg6rCZ7J2AIOy9lOuTnOulvCDsg53qsIHtlbQg67SF7Iuc64ukOgorCisJKkEgPSBhOworCSpCID0gYjsKKwlBQ1FVSVJFCisJKkMgPSBjOworCSpEID0gZDsKKwlSRUxFQVNFCisJKkUgPSBlOworCSpGID0gZjsKKwor7Jes6riw7ISgIOuLpOydjOydmCDsnbTrsqTtirgg7Iuc7YCA7Iqk6rCAIOyDneq4uCDsiJgg7J6I7Iq164uI64ukOgorCisJQUNRVUlSRSwgeypGLCpBfSwgKkUsIHsqQywqRH0sICpCLCBSRUxFQVNFCisKKwlbK10geypGLCpBfSDripQg7KGw7ZWp65CcIOyVoeyEuOyKpOulvCDsnZjrr7jtlanri4jri6QuCisKK+2VmOyngOunjCDri6TsnYzqs7wg6rCZ7J2AIOqxtCDrtojqsIDriqXtlZjso6A6CisKKwl7KkYsKkF9LCAqQiwJQUNRVUlSRSwgKkMsICpELAlSRUxFQVNFLCAqRQorCSpBLCAqQiwgKkMsCUFDUVVJUkUsICpELAkJUkVMRUFTRSwgKkUsICpGCisJKkEsICpCLAkJQUNRVUlSRSwgKkMsCQlSRUxFQVNFLCAqRCwgKkUsICpGCisJKkIsCQlBQ1FVSVJFLCAqQywgKkQsCVJFTEVBU0UsIHsqRiwqQX0sICpFCisKKworCivsnbjthLDrn73tirgg67mE7Zmc7ISx7ZmUIO2VqOyImAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCivsnbjthLDrn73tirjrpbwg67mE7Zmc7ISx7ZmUIO2VmOuKlCDtlajsiJggKEFDUVVJUkUg7JmAIOuPmeydvCkg7JmAIOyduO2EsOufve2KuOulvCDtmZzshLHtmZQg7ZWY64qUIO2VqOyImAorKFJFTEVBU0Ug7JmAIOuPmeydvCkg64qUIOy7tO2MjOydvOufrCDrsLDrpqzslrTsspjrn7zrp4wg64+Z7J6R7ZWp64uI64ukLiAg65Sw65287IScLCDrs4Trj4TsnZgg66mU66qo66asCivrsLDrpqzslrTrgpggSS9PIOuwsOumrOyWtOqwgCDtlYTsmpTtlZwg7IOB7Zmp7J20652866m0IOq3uCDrsLDrpqzslrTrk6TsnYAg7J247YSw65+97Yq4IOu5hO2ZnOyEse2ZlCDtlajsiJgKK+yZuOydmCDrsKnrspXsnLzroZwg7KCc6rO165CY7Ja07JW866eMIO2VqeuLiOuLpC4KKworCivsiqzrpr3qs7wg7Juo7J207YGs7JeFIO2VqOyImAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor6riA66Gc67KMIOuNsOydtO2EsOyXkCDtkZzsi5zrkJwg7J2067Kk7Yq47JeQIOydmO2VtCDtlITroZzshLjsiqTrpbwg7J6g7JeQIOu5oO2KuOumrOuKlCDqsoPqs7wg6rmo7Jqw64qUIOqyg+ydgAor7ZW064u5IOydtOuypO2KuOulvCDquLDri6TrpqzripQg7YOc7Iqk7YGs7J2YIO2DnOyKpO2BrCDsg4Htg5zsmYAg6re4IOydtOuypO2KuOulvCDslYzrpqzquLAg7JyE7ZW0IOyCrOyaqeuQmOuKlAor6riA66Gc67KMIOuNsOydtO2EsCwg65GQIOuNsOydtO2EsOqwhOydmCDsg4HtmLjsnpHsmqnsnLzroZwg67O8IOyImCDsnojsirXri4jri6QuICDsnbTqsoPsnbQg7Jiz7J2AIOyInOyEnOuMgOuhnAor7J287Ja064Ko7J2EIOu2hOuqhe2eiCDtlZjquLAg7JyE7ZW0LCDtlITroZzshLjsiqTrpbwg7J6g7JeQIOuTpOqyjCDtlZjripQg6riw64ql6rO8IOq5qOyasOuKlCDquLDriqXsnYAKK+uqh+qwgOyngCDrsLDrpqzslrTrpbwg64K07Y+s7ZWp64uI64ukLgorCivrqLzsoIAsIOyeoOydhCDsnqzsmrDripQg7Kq97J2AIOydvOuwmOyggeycvOuhnCDri6TsnYzqs7wg6rCZ7J2AIOydtOuypO2KuCDsi5ztgIDsiqTrpbwg65Sw66aF64uI64ukOgorCisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWlmIChldmVudF9pbmRpY2F0ZWQpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisKK3NldF9jdXJyZW50X3N0YXRlKCkg7JeQIOydmO2VtCwg7YOc7Iqk7YGsIOyDge2DnOqwgCDrsJTrgJAg7ZuEIOuylOyaqSDrqZTrqqjrpqwg67Cw66as7Ja06rCACivsnpDrj5nsnLzroZwg7IK97J6F65Cp64uI64ukOgorCisJQ1BVIDEKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJc2V0X2N1cnJlbnRfc3RhdGUoKTsKKwkgIHNtcF9zdG9yZV9tYigpOworCSAgICBTVE9SRSBjdXJyZW50LT5zdGF0ZQorCSAgICA867KU7JqpIOuwsOumrOyWtD4KKwlMT0FEIGV2ZW50X2luZGljYXRlZAorCitzZXRfY3VycmVudF9zdGF0ZSgpIOuKlCDri6TsnYzsnZgg6rKD65Ok66GcIOqwkOyLuOyniCDsiJjrj4Qg7J6I7Iq164uI64ukOgorCisJcHJlcGFyZV90b193YWl0KCk7CisJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZSgpOworCivsnbTqsoPrk6Qg7Jet7IucIOyDge2DnOulvCDshKTsoJXtlZwg7ZuEIOuylOyaqSDrqZTrqqjrpqwg67Cw66as7Ja066W8IOyCveyehe2VqeuLiOuLpC4KK+yVnuydmCDsoITssrQg7Iuc7YCA7Iqk64qUIOuLpOydjOqzvCDqsJnsnYAg7ZWo7IiY65Ok66GcIO2VnOuyiOyXkCDsiJjtlokg6rCA64ql7ZWc642wLCDsnbTqsoPrk6TsnYAg66qo65GQCivsmKzrsJTrpbgg7J6l7IaM7JeQIOuplOuqqOumrCDrsLDrpqzslrTrpbwg7IK97J6F7ZWp64uI64ukOgorCisJd2FpdF9ldmVudCgpOworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgpOworCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV9leGNsdXNpdmUoKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCgpOworCXdhaXRfZXZlbnRfa2lsbGFibGUoKTsKKwl3YWl0X2V2ZW50X3RpbWVvdXQoKTsKKwl3YWl0X29uX2JpdCgpOworCXdhaXRfb25fYml0X2xvY2soKTsKKworCivrkZDrsojsp7jroZwsIOq5qOyasOq4sOulvCDsiJjtlontlZjripQg7L2U65Oc64qUIOydvOuwmOyggeycvOuhnCDri6TsnYzqs7wg6rCZ7J2EIOqygeuLiOuLpDoKKworCWV2ZW50X2luZGljYXRlZCA9IDE7CisJd2FrZV91cCgmZXZlbnRfd2FpdF9xdWV1ZSk7CisKK+uYkOuKlDoKKworCWV2ZW50X2luZGljYXRlZCA9IDE7CisJd2FrZV91cF9wcm9jZXNzKGV2ZW50X2RhZW1vbik7CisKK3dha2VfdXAoKSDrpZjsl5Ag7J2Y7ZW0IOyTsOq4sCDrqZTrqqjrpqwg67Cw66as7Ja06rCAIOuCtO2PrOuQqeuLiOuLpC4gIOunjOyVvSDqt7jqsoPrk6TsnbQg662U6rCA66W8CivquajsmrTri6TrqbTsmpQuICDsnbQg67Cw66as7Ja064qUIO2DnOyKpO2BrCDsg4Htg5zqsIAg7KeA7JuM7KeA6riwIOyghOyXkCDsiJjtlonrkJjrr4DroZwsIOydtOuypO2KuOulvAor7JWM66as6riwIOychO2VnCBTVE9SRSDsmYAg7YOc7Iqk7YGsIOyDge2DnOulvCBUQVNLX1JVTk5JTkcg7Jy866GcIOyEpOygle2VmOuKlCBTVE9SRSDsgqzsnbTsl5AKK+ychOy5mO2VmOqyjCDrkKnri4jri6QuCisKKwlDUFUgMQkJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCXNldF9jdXJyZW50X3N0YXRlKCk7CQlTVE9SRSBldmVudF9pbmRpY2F0ZWQKKwkgIHNtcF9zdG9yZV9tYigpOwkJd2FrZV91cCgpOworCSAgICBTVE9SRSBjdXJyZW50LT5zdGF0ZQkgIDzsk7DquLAg67Cw66as7Ja0PgorCSAgICA867KU7JqpIOuwsOumrOyWtD4JCSAgU1RPUkUgY3VycmVudC0+c3RhdGUKKwlMT0FEIGV2ZW50X2luZGljYXRlZAorCivtlZzrsojrjZQg66eQ7ZWp64uI64uk66eMLCDsnbQg7JOw6riwIOuplOuqqOumrCDrsLDrpqzslrTripQg7J20IOy9lOuTnOqwgCDsoJXrp5DroZwg662U6rCA66W8IOq5qOyauCDrlYzsl5Drp4wKK+yLpO2WieuQqeuLiOuLpC4gIOydtOqxuCDshKTrqoXtlZjquLAg7JyE7ZW0LCBYIOyZgCBZIOuKlCDrqqjrkZAgMCDsnLzroZwg7LSI6riw7ZmUIOuQmOyWtCDsnojri6TripQg6rCA7KCVCivtlZjsl5Ag7JWE656Y7J2YIOydtOuypO2KuCDsi5ztgIDsiqTrpbwg7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworCUNQVSAxCQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJWCA9IDE7CQkJCVNUT1JFIGV2ZW50X2luZGljYXRlZAorCXNtcF9tYigpOwkJCXdha2VfdXAoKTsKKwlZID0gMTsJCQkJd2FpdF9ldmVudCh3cSwgWSA9PSAxKTsKKwl3YWtlX3VwKCk7CQkJICBsb2FkIGZyb20gWSBzZWVzIDEsIG5vIG1lbW9yeSBiYXJyaWVyCisJCQkJCWxvYWQgZnJvbSBYIG1pZ2h0IHNlZSAwCisKK+ychCDsmIjsoJzsl5DshJzsnZgg6rK97Jqw7JmAIOuLrOumrCDquajsmrDquLDqsIAg7KCV66eQ66GcIO2Wie2VtOyhjOuLpOuptCwgQ1BVIDIg7J2YIFgg66Gc65Oc64qUIDEg7J2ECivrs7jri6Tqs6Ag67O07J6l65CgIOyImCDsnojsnYQg6rKB64uI64ukLgorCivsgqzsmqkg6rCA64ql7ZWcIOq5qOyasOq4sOulmCDtlajsiJjrk6TroZwg64uk7J2M6rO8IOqwmeydgCDqsoPrk6TsnbQg7J6I7Iq164uI64ukOgorCisJY29tcGxldGUoKTsKKwl3YWtlX3VwKCk7CisJd2FrZV91cF9hbGwoKTsKKwl3YWtlX3VwX2JpdCgpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfbnIoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfcG9sbCgpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jKCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmNfcG9sbCgpOworCXdha2VfdXBfbG9ja2VkKCk7CisJd2FrZV91cF9sb2NrZWRfcG9sbCgpOworCXdha2VfdXBfbnIoKTsKKwl3YWtlX3VwX3BvbGwoKTsKKwl3YWtlX3VwX3Byb2Nlc3MoKTsKKworCitbIV0g7J6g7J6s7Jqw64qUIOy9lOuTnOyZgCDquajsmrDripQg7L2U65Oc7JeQIOuCtO2PrOuQmOuKlCDrqZTrqqjrpqwg67Cw66as7Ja065Ok7J2AIOq5qOyasOq4sCDsoITsl5AKK+ydtOujqOyWtOynhCDsiqTthqDslrTrpbwg7J6g7J6s7Jqw64qUIOy9lOuTnOqwgCBzZXRfY3VycmVudF9zdGF0ZSgpIOulvCDtmLjstpztlZwg7ZuE7JeQIO2Wie2VmOuKlAor66Gc65Oc7JeQIOuMgO2VtCDsiJzshJzrpbwg66ee7LaU7KeAIF/slYrripTri6TripRfIOygkOydhCDquLDslrXtlZjshLjsmpQuICDsmIjrpbwg65Ok7Ja0LCDsnqDsnqzsmrDripQKK+y9lOuTnOqwgCDri6TsnYzqs7wg6rCZ6rOgOgorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlpZiAoZXZlbnRfaW5kaWNhdGVkKQorCQlicmVhazsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJZG9fc29tZXRoaW5nKG15X2RhdGEpOworCivquajsmrDripQg7L2U65Oc64qUIOuLpOydjOqzvCDqsJnri6TrqbQ6CisKKwlteV9kYXRhID0gdmFsdWU7CisJZXZlbnRfaW5kaWNhdGVkID0gMTsKKwl3YWtlX3VwKCZldmVudF93YWl0X3F1ZXVlKTsKKworZXZlbnRfaW5kZWNhdGVkIOyXkOydmCDrs4Dqsr3snbQg7J6g7J6s7Jqw64qUIOy9lOuTnOyXkOqyjCBteV9kYXRhIOyXkOydmCDrs4Dqsr0g7ZuE7JeQIOydtOujqOyWtOynhAor6rKD7Jy866GcIOyduOyngOuQoCDqsoPsnbTrnbzripQg67O07J6l7J20IOyXhuyKteuLiOuLpC4gIOydtOufsCDqsr3smrDsl5DripQg7JaR7Kq9IOy9lOuTnCDrqqjrkZAg6rCB6rCB7J2YCivrjbDsnbTthLAg7JWh7IS47IqkIOyCrOydtOyXkCDrqZTrqqjrpqwg67Cw66as7Ja066W8IOyngeygkSDss5Dslbwg7ZWp64uI64ukLiAg65Sw65287IScIOyVnuydmCDsnqzsmrDripQKK+y9lOuTnOuKlCDri6TsnYzqs7wg6rCZ7J20OgorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlpZiAoZXZlbnRfaW5kaWNhdGVkKSB7CisJCXNtcF9ybWIoKTsKKwkJZG9fc29tZXRoaW5nKG15X2RhdGEpOworCX0KKwor6re466as6rOgIOq5qOyasOuKlCDsvZTrk5zripQg64uk7J2M6rO8IOqwmeydtCDrkJjslrTslbwg7ZWp64uI64ukOgorCisJbXlfZGF0YSA9IHZhbHVlOworCXNtcF93bWIoKTsKKwlldmVudF9pbmRpY2F0ZWQgPSAxOworCXdha2VfdXAoJmV2ZW50X3dhaXRfcXVldWUpOworCisKK+q3uOyZuOydmCDtlajsiJjrk6QKKy0tLS0tLS0tLS0tLS0KKwor6re47Jm47J2YIOuwsOumrOyWtOulvCDrgrTtj6ztlZjripQg7ZWo7IiY65Ok7J2AIOuLpOydjOqzvCDqsJnsirXri4jri6Q6CisKKyAoKikgc2NoZWR1bGUoKSDqs7wg6re4IOycoOyCrO2VnCDqsoPrk6TsnbQg7JmE7KCE7ZWcIOuplOuqqOumrCDrsLDrpqzslrTrpbwg64K07Y+s7ZWp64uI64ukLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ1BVIOqwhCBBQ1FVSVJJTkcg67Cw66as7Ja07J2YIO2aqOqzvAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NNUCDsi5zsiqTthZzsl5DshJzsnZgg6529IOq4sOuKpeuTpOydgCDrjZTsmrEg6rCV66Cl7ZWcIO2Yle2DnOydmCDrsLDrpqzslrTrpbwg7KCc6rO17ZWp64uI64ukOiDsnbQKK+uwsOumrOyWtOuKlCDrj5nsnbztlZwg65297J2EIOyCrOyaqe2VmOuKlCDri6TrpbggQ1BVIOuTpOydmCDrqZTrqqjrpqwg7JWh7IS47IqkIOyInOyEnOyXkOuPhCDsmIHtlqXsnYQKK+uBvOy5qeuLiOuLpC4KKworCitBQ1FVSVJFIFZTIOuplOuqqOumrCDslaHshLjsiqQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCivri6TsnYzsnZgg7JiI66W8IOyDneqwge2VtCDrtIXsi5zri6Q6IOyLnOyKpO2FnOydgCDrkZDqsJzsnZgg7Iqk7ZWA6529IChNKSDqs7wgKFEpLCDqt7jrpqzqs6Ag7IS46rCc7J2YIENQVQor66W8IOqwgOyngOqzoCDsnojsirXri4jri6Q7IOyXrOq4sOyXkCDri6TsnYzsnZgg7J2067Kk7Yq4IOyLnO2AgOyKpOqwgCDrsJzsg53tlanri4jri6Q6CisKKwlDUFUgMQkJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVdSSVRFX09OQ0UoKkEsIGEpOwkJV1JJVEVfT05DRSgqRSwgZSk7CisJQUNRVUlSRSBNCQkJQUNRVUlSRSBRCisJV1JJVEVfT05DRSgqQiwgYik7CQlXUklURV9PTkNFKCpGLCBmKTsKKwlXUklURV9PTkNFKCpDLCBjKTsJCVdSSVRFX09OQ0UoKkcsIGcpOworCVJFTEVBU0UgTQkJCVJFTEVBU0UgUQorCVdSSVRFX09OQ0UoKkQsIGQpOwkJV1JJVEVfT05DRSgqSCwgaCk7CisKKypBIOuhnOydmCDslaHshLjsiqTrtoDthLAgKkgg66Gc7J2YIOyVoeyEuOyKpOq5jOyngOqwgCDslrTrlqQg7Iic7ISc66GcIENQVSAzIOyXkOqyjCDrs7Tsl6zsp4jsp4Dsl5AKK+uMgO2VtOyEnOuKlCDqsIEgQ1BVIOyXkOyEnOydmCDrnb0g7IKs7Jqp7JeQIOydmO2VtCDrgrTtj6zrkJjslrQg7J6I64qUIOygnOyVveydhCDsoJzsmbjtlZjqs6DripQg7Ja065akCivrs7TsnqXrj4Qg7KG07J6s7ZWY7KeAIOyViuyKteuLiOuLpC4gIOyYiOulvCDrk6TslrQsIENQVSAzIOyXkOqyjCDri6TsnYzqs7wg6rCZ7J2AIOyInOyEnOuhnCDrs7Tsl6zsp4DripQKK+qyg+ydtCDqsIDriqXtlanri4jri6Q6CisKKwkqRSwgQUNRVUlSRSBNLCBBQ1FVSVJFIFEsICpHLCAqQywgKkYsICpBLCAqQiwgUkVMRUFTRSBRLCAqRCwgKkgsIFJFTEVBU0UgTQorCivtlZjsp4Drp4wg64uk7J2M6rO8IOqwmeydtCDrs7TsnbTsp4DripQg7JWK7J2EIOqygeuLiOuLpDoKKworCSpCLCAqQyBvciAqRCBwcmVjZWRpbmcgQUNRVUlSRSBNCisJKkEsICpCIG9yICpDIGZvbGxvd2luZyBSRUxFQVNFIE0KKwkqRiwgKkcgb3IgKkggcHJlY2VkaW5nIEFDUVVJUkUgUQorCSpFLCAqRiBvciAqRyBmb2xsb3dpbmcgUkVMRUFTRSBRCisKKworCitBQ1FVSVJFIFZTIEkvTyDslaHshLjsiqQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwor7Yq57KCV7ZWcICjtirntnoggTlVNQSDqsIAg6rSA66Co65CcKSDtmZjqsr0g7ZWY7JeQ7IScIOuRkOqwnOydmCBDUFUg7JeQ7IScIOuPmeydvO2VnCDsiqTtlYDrnb3snLzroZwKK+uztO2YuOuQmOuKlCDrkZDqsJzsnZgg7YGs66as7Yuw7LusIOyEueyFmCDslYjsnZggSS9PIOyVoeyEuOyKpOuKlCBQQ0kg67iM66a/7KeA7JeQIOqyueyzkOynhCBJL08KK+yVoeyEuOyKpOuhnCDrs7Tsnbwg7IiYIOyeiOuKlOuNsCwgUENJIOu4jOumv+yngOuKlCDsupDsi5wg7J286rSA7ISxIO2UhOuhnO2GoOy9nOqzvCDtlansnYQg66ee7Law7JW8IO2VoAor7J2Y66y06rCAIOyXhuycvOuvgOuhnCwg7ZWE7JqU7ZWcIOydveq4sCDrqZTrqqjrpqwg67Cw66as7Ja06rCAIOyalOyyreuQmOyngCDslYrquLAg65WM66y47J6F64uI64ukLgorCivsmIjrpbwg65Ok7Ja07IScOgorCisJQ1BVIDEJCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlzcGluX2xvY2soUSkKKwl3cml0ZWwoMCwgQUREUikKKwl3cml0ZWwoMSwgREFUQSk7CisJc3Bpbl91bmxvY2soUSk7CisJCQkJCXNwaW5fbG9jayhRKTsKKwkJCQkJd3JpdGVsKDQsIEFERFIpOworCQkJCQl3cml0ZWwoNSwgREFUQSk7CisJCQkJCXNwaW5fdW5sb2NrKFEpOworCivripQgUENJIOu4jOumv+yngOyXkCDri6TsnYzqs7wg6rCZ7J20IOuztOydvCDsiJgg7J6I7Iq164uI64ukOgorCisJU1RPUkUgKkFERFIgPSAwLCBTVE9SRSAqQUREUiA9IDQsIFNUT1JFICpEQVRBID0gMSwgU1RPUkUgKkRBVEEgPSA1CisKK+ydtOugh+qyjCDrkJjrqbQg7ZWY65Oc7Juo7Ja07J2YIOyYpOuPmeyekeydhCDsnbzsnLztgqwg7IiYIOyeiOyKteuLiOuLpC4KKworCivsnbTrn7Ag6rK97Jqw7JeUIOyeoeyVhOuRlCDsiqTtlYDrnb3snYQg64K066Ck64aT6riwIOyghOyXkCBtbWlvd2IoKSDrpbwg7IiY7ZaJ7ZW07JW8IO2VmOuKlOuNsCwg7JiI66W8Civrk6TrqbQg64uk7J2M6rO8IOqwmeyKteuLiOuLpDoKKworCUNQVSAxCQkJCUNQVSAyCisJPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJc3Bpbl9sb2NrKFEpCisJd3JpdGVsKDAsIEFERFIpCisJd3JpdGVsKDEsIERBVEEpOworCW1taW93YigpOworCXNwaW5fdW5sb2NrKFEpOworCQkJCQlzcGluX2xvY2soUSk7CisJCQkJCXdyaXRlbCg0LCBBRERSKTsKKwkJCQkJd3JpdGVsKDUsIERBVEEpOworCQkJCQltbWlvd2IoKTsKKwkJCQkJc3Bpbl91bmxvY2soUSk7CisKK+ydtCDsvZTrk5zripQgQ1BVIDEg7JeQ7IScIOyalOyyreuQnCDrkZDqsJzsnZgg7Iqk7Yag7Ja06rCAIFBDSSDruIzrpr/sp4Dsl5AgQ1BVIDIg7JeQ7IScIOyalOyyreuQnAor7Iqk7Yag7Ja065Ok67O064ukIOuovOyggCDrs7Tsl6zsp5DsnYQg67O07J6l7ZWp64uI64ukLgorCisKK+uYkO2VnCwg6rCZ7J2AIOuUlOuwlOydtOyKpOyXkOyEnCDsiqTthqDslrTrpbwg7J207Ja0IOuhnOuTnOqwgCDsiJjtlonrkJjrqbQg7J20IOuhnOuTnOuKlCDroZzrk5zqsIAg7IiY7ZaJ65CY6riwCivsoITsl5Ag7Iqk7Yag7Ja06rCAIOyZhOujjOuQmOq4sOulvCDqsJXsoJztlZjrr4DroZwgbW1pb3diKCkg7J2YIO2VhOyalOqwgCDsl4bslrTsp5Hri4jri6Q6CisKKwlDUFUgMQkJCQlDUFUgMgorCT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCXNwaW5fbG9jayhRKQorCXdyaXRlbCgwLCBBRERSKQorCWEgPSByZWFkbChEQVRBKTsKKwlzcGluX3VubG9jayhRKTsKKwkJCQkJc3Bpbl9sb2NrKFEpOworCQkJCQl3cml0ZWwoNCwgQUREUik7CisJCQkJCWIgPSByZWFkbChEQVRBKTsKKwkJCQkJc3Bpbl91bmxvY2soUSk7CisKKwor642UIOunjuydgCDsoJXrs7Trpbwg7JyE7ZW07ISgIERvY3VtZW5hdGFpb24vRG9jQm9vay9kZXZpY2Vpb2Jvb2sudG1wbCDsnYQg7LC46rOg7ZWY7IS47JqULgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT0KK+uplOuqqOumrCDrsLDrpqzslrTqsIAg7ZWE7JqU7ZWcIOqzsworPT09PT09PT09PT09PT09PT09PT09PT09PQorCivshKTroLkgU01QIOy7pOuEkOydhCDsgqzsmqntlZjrjZTrnbzrj4Qg7Iux6riAIOyTsOugiOuTnOuhnCDrj5nsnpHtlZjripQg7L2U65Oc64qUIOyYrOuwlOultOqyjCDrj5nsnpHtlZjripQKK+qyg+ycvOuhnCDrs7Tsl6zsp4gg6rKD7J206riwIOuVjOusuOyXkCwg7Y+J67KU7ZWcIOyLnOyKpO2FnCDsmrTsmIHspJHsl5Ag66mU66qo66asIOyYpO2NvOugiOydtOyFmCDsnqzrsLDsuZjripQKK+ydvOuwmOyggeycvOuhnCDrrLjsoJzqsIAg65CY7KeAIOyViuyKteuLiOuLpC4gIO2VmOyngOunjCwg7J6s67Cw7LmY6rCAIOusuOygnOqwgCBf65CgIOyImCDsnojripRfIOuEpOqwgOyngAor7ZmY6rK97J20IOyeiOyKteuLiOuLpDoKKworICgqKSDtlITroZzshLjshJzqsIQg7IOB7Zi4IOyekeyaqS4KKworICgqKSDslrTthqDrr7kg7Jik7Y2866CI7J207IWYLgorCisgKCopIOuUlOuwlOydtOyKpCDslaHshLjsiqQuCisKKyAoKikg7J247YSw65+97Yq4LgorCisKK+2UhOuhnOyEuOyEnOqwhCDsg4HtmLgg7J6R7JqpCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCivrkZDqsJwg7J207IOB7J2YIO2UhOuhnOyEuOyEnOulvCDqsIDsp4Qg7Iuc7Iqk7YWc7J20IOyeiOuLpOuptCwg7Iuc7Iqk7YWc7J2YIOuRkOqwnCDsnbTsg4HsnZggQ1BVIOuKlCDrj5nsi5zsl5AKK+qwmeydgCDrjbDsnbTthLDsl5Ag64yA7ZWcIOyekeyXheydhCDtlaAg7IiYIOyeiOyKteuLiOuLpC4gIOydtOuKlCDrj5nquLDtmZQg66y47KCc66W8IOydvOycvO2CrCDsiJgg7J6I6rOgLAor7J20IOusuOygnOulvCDtlbTqsrDtlZjripQg7J2867CY7KCBIOuwqeuyleydgCDrnb3snYQg7IKs7Jqp7ZWY64qUIOqyg+yeheuLiOuLpC4gIO2VmOyngOunjCwg65297J2AIOyDgeuLue2eiAor67mE7Jqp7J20IOu5hOyLuOyEnCDqsIDriqXtlZjrqbQg65297J2EIOyCrOyaqe2VmOyngCDslYrqs6Ag7J287J2EIOyymOumrO2VmOuKlCDqsoPsnbQg64Kr7Iq164uI64ukLiAg7J2065+wCivqsr3smrAsIOuRkCBDUFUg66qo65GQ7JeQIOyYge2WpeydhCDrgbzsuZjripQg7Jik7Y2866CI7J207IWY65Ok7J2AIOyYpOuPmeyekeydhCDrp4nquLAg7JyE7ZW0IOyLoOykke2VmOqyjAor7Iic7ISc6rCAIOunnuy2sOyguOyVvCDtlanri4jri6QuCisKK+yYiOulvCDrk6TslrQsIFIvVyDshLjrp4jtj6zslrTsnZgg64qQ66awIOyImO2WieqyveuhnCAoc2xvdyBwYXRoKSDrpbwg7IOd6rCB7ZW0IOu0heyLnOuLpC4KK+yEuOuniO2PrOyWtOulvCDsnITtlbQg64yA6riw66W8IO2VmOuKlCDtlZjrgpjsnZgg7ZSE66Gc7IS47Iqk6rCAIOyekOyLoOydmCDsiqTtg50g7KSRIOydvOu2gOulvCDsnbQKK+yEuOuniO2PrOyWtOydmCDrjIDquLAg7ZSE66Gc7IS47IqkIOumrOyKpO2KuOyXkCDrp4HtgaztlZwg7LGE66GcIOyeiOyKteuLiOuLpDoKKworCXN0cnVjdCByd19zZW1hcGhvcmUgeworCQkuLi4KKwkJc3BpbmxvY2tfdCBsb2NrOworCQlzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRlcnM7CisJfTsKKworCXN0cnVjdCByd3NlbV93YWl0ZXIgeworCQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwl9OworCivtirnsoJUg64yA6riwIOyDge2DnCDtlITroZzshLjsiqTrpbwg6rmo7Jqw6riwIOychO2VtCwgdXBfcmVhZCgpIOuCmCB1cF93cml0ZSgpIO2VqOyImOuKlCDri6TsnYzqs7wKK+qwmeydgCDsnbzsnYQg7ZWp64uI64ukOgorCisgKDEpIOuLpOydjCDrjIDquLAg7IOB7YOcIO2UhOuhnOyEuOyKpCDroIjsvZTrk5zripQg7Ja065SU7J6I64qU7KeAIOyVjOq4sCDsnITtlbQg7J20IOuMgOq4sCDsg4Htg5wKKyAgICAg7ZSE66Gc7IS47IqkIOugiOy9lOuTnOydmCBuZXh0IO2PrOyduO2EsOulvCDsnb3sirXri4jri6Q7CisKKyAoMikg7J20IOuMgOq4sCDsg4Htg5wg7ZSE66Gc7IS47Iqk7J2YIHRhc2sg6rWs7KGw7LK066Gc7J2YIO2PrOyduO2EsOulvCDsnb3sirXri4jri6Q7CisKKyAoMykg7J20IOuMgOq4sCDsg4Htg5wg7ZSE66Gc7IS47Iqk6rCAIOyEuOuniO2PrOyWtOulvCDtmo3rk53tlojsnYzsnYQg7JWM66as6riwIOychO2VtCB0YXNrCisgICAgIO2PrOyduO2EsOulvCDstIjquLDtmZQg7ZWp64uI64ukOworCisgKDQpIO2VtOuLuSDtg5zsiqTtgazsl5Ag64yA7ZW0IHdha2VfdXBfcHJvY2VzcygpIOulvCDtmLjstpztlanri4jri6Q7IOq3uOumrOqzoAorCisgKDUpIO2VtOuLuSDrjIDquLAg7IOB7YOcIO2UhOuhnOyEuOyKpOydmCB0YXNrIOq1rOyhsOyytOulvCDsnqHqs6Ag7J6I642YIOugiO2NvOufsOyKpOulvCDtlbTsoJztlanri4jri6QuCisKK+uLrOumrCDrp5DtlZjsnpDrqbQsIOuLpOydjCDsnbTrsqTtirgg7Iuc7YCA7Iqk66W8IOyImO2Wie2VtOyVvCDtlanri4jri6Q6CisKKwlMT0FEIHdhaXRlci0+bGlzdC5uZXh0OworCUxPQUQgd2FpdGVyLT50YXNrOworCVNUT1JFIHdhaXRlci0+dGFzazsKKwlDQUxMIHdha2V1cAorCVJFTEVBU0UgdGFzaworCivqt7jrpqzqs6Ag7J20IOydtOuypO2KuOuTpOydtCDri6Trpbgg7Iic7ISc66GcIOyImO2WieuQnOuLpOuptCwg7Jik64+Z7J6R7J20IOydvOyWtOuCoCDsiJgg7J6I7Iq164uI64ukLgorCivtlZzrsogg7IS466eI7Y+s7Ja07J2YIOuMgOq4sOykhOyXkCDrk6TslrTqsJTqs6Ag7IS466eI7Y+s7Ja0IOudveydhCDrhpPslZjri6TrqbQsIO2VtOuLuSDrjIDquLAg7ZSE66Gc7IS47Iqk64qUCivrnb3snYQg64uk7Iuc64qUIOyeoeyngCDslYrsirXri4jri6Q7IOuMgOyLoCDsnpDsi6DsnZggdGFzayDtj6zsnbjthLDqsIAg7LSI6riw7ZmUIOuQmOq4uCDquLDri6Trpr3ri4jri6QuCivqt7gg66CI7L2U65Oc64qUIOuMgOq4sCDtlITroZzshLjsiqTsnZgg7Iqk7YOd7JeQIOyeiOq4sCDrlYzrrLjsl5AsIOumrOyKpO2KuOydmCBuZXh0IO2PrOyduO2EsOqwgCDsnb3tmIDsp4DquLAKK1/soITsl5BfIHRhc2sg7Y+s7J247YSw6rCAIOyngOybjOynhOuLpOuptCwg64uk66W4IENQVSDripQg7ZW064u5IOuMgOq4sCDtlITroZzshLjsiqTrpbwg7Iuc7J6R7ZW0IOuyhOumrOqzoAordXAqKCkg7ZWo7IiY6rCAIG5leHQg7Y+s7J247YSw66W8IOydveq4sCDsoITsl5Ag64yA6riwIO2UhOuhnOyEuOyKpOydmCDsiqTtg53snYQg66eI6rWsIOqxtOuTnOumtCDsiJgKK+yeiOyKteuLiOuLpC4KKwor6re466CH6rKMIOuQmOuptCDsnITsnZgg7J2067Kk7Yq4IOyLnO2AgOyKpOyXkCDslrTrlqQg7J287J20IOydvOyWtOuCmOuKlOyngCDsg53qsIHtlbQg67O07KOgOgorCisJQ1BVIDEJCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJCQkJZG93bl94eHgoKQorCQkJCQlRdWV1ZSB3YWl0ZXIKKwkJCQkJU2xlZXAKKwl1cF95eXkoKQorCUxPQUQgd2FpdGVyLT50YXNrOworCVNUT1JFIHdhaXRlci0+dGFzazsKKwkJCQkJV29rZW4gdXAgYnkgb3RoZXIgZXZlbnQKKwk8cHJlZW1wdD4KKwkJCQkJUmVzdW1lIHByb2Nlc3NpbmcKKwkJCQkJZG93bl94eHgoKSByZXR1cm5zCisJCQkJCWNhbGwgZm9vKCkKKwkJCQkJZm9vKCkgY2xvYmJlcnMgKndhaXRlcgorCTwvcHJlZW1wdD4KKwlMT0FEIHdhaXRlci0+bGlzdC5uZXh0OworCS0tLSBPT1BTIC0tLQorCivsnbQg66y47KCc64qUIOyEuOuniO2PrOyWtCDrnb3snZgg7IKs7Jqp7Jy866GcIO2VtOqysOuQoCDsiJjrj4Qg7J6I6rKg7KeA66eMLCDqt7jroIfqsowg65CY66m0IOq5qOyWtOuCnCDtm4Tsl5AKK2Rvd25feHh4KCkg7ZWo7IiY6rCAIOu2iO2VhOyalO2VmOqyjCDsiqTtlYDrnb3snYQg65iQ64uk7IucIOyWu+yWtOyVvOunjCDtlanri4jri6QuCisKK+ydtCDrrLjsoJzrpbwg7ZW06rKw7ZWY64qUIOuwqeuyleydgCDrspTsmqkgU01QIOuplOuqqOumrCDrsLDrpqzslrTrpbwg7LaU6rCA7ZWY64qUIOqygeuLiOuLpDoKKworCUxPQUQgd2FpdGVyLT5saXN0Lm5leHQ7CisJTE9BRCB3YWl0ZXItPnRhc2s7CisJc21wX21iKCk7CisJU1RPUkUgd2FpdGVyLT50YXNrOworCUNBTEwgd2FrZXVwCisJUkVMRUFTRSB0YXNrCisKK+ydtCDqsr3smrDsl5AsIOuwsOumrOyWtOuKlCDsi5zsiqTthZzsnZgg64KY66i47KeAIENQVSDrk6Tsl5Dqsowg66qo65OgIOuwsOumrOyWtCDslZ7snZgg66mU66qo66asIOyVoeyEuOyKpOqwgAor67Cw66as7Ja0IOuSpOydmCDrqZTrqqjrpqwg7JWh7IS47Iqk67O064ukIOyVnuyEnCDsnbzslrTrgpwg6rKD7Jy866GcIOuztOydtOqyjCDrp4zrk63ri4jri6QuICDrsLDrpqzslrQg7JWe7J2YCivrqZTrqqjrpqwg7JWh7IS47Iqk65Ok7J20IOuwsOumrOyWtCDrqoXroLkg7J6Q7LK06rCAIOyZhOujjOuQmOuKlCDsi5zsoJDquYzsp4Ag7JmE66OM65Cc64uk6rOg64qUIOuztOyepe2VmOyngAorX+yViuyKteuLiOuLpF8uCisKKyjsnbTqsowg66y47KCc6rCAIOuQmOyngCDslYrsnYQpIOuLqOydvCDtlITroZzshLjshJwg7Iuc7Iqk7YWc7JeQ7IScIHNtcF9tYigpIOuKlCDsi6TsoJzroZzripQg6re47KCACivsu7TtjIzsnbzrn6zqsIAgQ1BVIOyViOyXkOyEnOydmCDsiJzshJzrpbwg67CU6r646rGw64KYIO2VmOyngCDslYrqs6Ag7KO87Ja07KeEIOyInOyEnOuMgOuhnCDrqoXroLnsnYQKK+uCtOumrOuPhOuhnSDtlZjripQg7Lu07YyM7J2865+sIOuwsOumrOyWtOydvCDrv5DsnoXri4jri6QuICDsmKTsp4Eg7ZWY64KY7J2YIENQVSDrp4wg7J6I7Jy864uILCBDUFUg7J2YCivsnZjsobTshLEg7Iic7IScIOuhnOyngeydtCDqt7gg7Jm47J2YIOuqqOuToOqyg+ydhCDslYzslYTshJwg7LKY66as7ZWgIOqygeuLiOuLpC4KKworCivslrTthqDrr7kg7Jik7Y2866CI7J207IWYCistLS0tLS0tLS0tLS0tLS0tLQorCivslrTthqDrr7kg7Jik7Y2866CI7J207IWY7J2AIOq4sOyIoOyggeycvOuhnCDtlITroZzshLjshJzqsIQg7IOB7Zi47J6R7Jqp7Jy866GcIOu2hOulmOuQmOupsCDqt7gg7KSRIOydvOu2gOuKlAor7KCE7LK0IOuplOuqqOumrCDrsLDrpqzslrTrpbwg64K07Y+s7ZWY6rOgIOuYkCDsnbzrtoDripQg64K07Y+s7ZWY7KeAIOyViuyngOunjCwg7Luk64SQ7JeQ7IScIOyDgeuLue2eiAor7J2Y7KG07KCB7Jy866GcIOyCrOyaqe2VmOuKlCDquLDriqUg7KSRIO2VmOuCmOyeheuLiOuLpC4KKwor66mU66qo66as7J2YIOyWtOuWpCDsg4Htg5zrpbwg7IiY7KCV7ZWY6rOgIO2VtOuLuSDsg4Htg5zsl5Ag64yA7ZWcICjsmIjsoITsnZgg65iQ64qUIOy1nOyLoOydmCkg7KCV67O066W8CivrpqzthLTtlZjripQg7Ja07Yag66+5IOyYpO2NvOugiOydtOyFmOydgCDrqqjrkZAgU01QLeyhsOqxtOyggSDrspTsmqkg66mU66qo66asIOuwsOumrOyWtChzbXBfbWIoKSnrpbwKK+yLpOygnCDsmKTtjbzroIjsnbTshZjsnZgg7JWe6rO8IOuSpOyXkCDrgrTtj6ztlanri4jri6QuICDsnbTrn7Ag7Jik7Y2866CI7J207IWY7J2AIOuLpOydjOydmCDqsoPrk6TsnYQKK+2PrO2VqO2VqeuLiOuLpDoKKworCXhjaGcoKTsKKwlhdG9taWNfeGNoZygpOwkJCWF0b21pY19sb25nX3hjaGcoKTsKKwlhdG9taWNfaW5jX3JldHVybigpOwkJYXRvbWljX2xvbmdfaW5jX3JldHVybigpOworCWF0b21pY19kZWNfcmV0dXJuKCk7CQlhdG9taWNfbG9uZ19kZWNfcmV0dXJuKCk7CisJYXRvbWljX2FkZF9yZXR1cm4oKTsJCWF0b21pY19sb25nX2FkZF9yZXR1cm4oKTsKKwlhdG9taWNfc3ViX3JldHVybigpOwkJYXRvbWljX2xvbmdfc3ViX3JldHVybigpOworCWF0b21pY19pbmNfYW5kX3Rlc3QoKTsJCWF0b21pY19sb25nX2luY19hbmRfdGVzdCgpOworCWF0b21pY19kZWNfYW5kX3Rlc3QoKTsJCWF0b21pY19sb25nX2RlY19hbmRfdGVzdCgpOworCWF0b21pY19zdWJfYW5kX3Rlc3QoKTsJCWF0b21pY19sb25nX3N1Yl9hbmRfdGVzdCgpOworCWF0b21pY19hZGRfbmVnYXRpdmUoKTsJCWF0b21pY19sb25nX2FkZF9uZWdhdGl2ZSgpOworCXRlc3RfYW5kX3NldF9iaXQoKTsKKwl0ZXN0X2FuZF9jbGVhcl9iaXQoKTsKKwl0ZXN0X2FuZF9jaGFuZ2VfYml0KCk7CisKKwkvKiBleGNoYW5nZSDsobDqsbTsnbQg7ISx6rO17ZWgIOuVjCAqLworCWNtcHhjaGcoKTsKKwlhdG9taWNfY21weGNoZygpOwkJYXRvbWljX2xvbmdfY21weGNoZygpOworCWF0b21pY19hZGRfdW5sZXNzKCk7CQlhdG9taWNfbG9uZ19hZGRfdW5sZXNzKCk7CisKK+ydtOqyg+uTpOydgCDrqZTrqqjrpqwg67Cw66as7Ja0IO2aqOqzvOqwgCDtlYTsmpTtlZwgQUNRVUlSRSDrtoDrpZjsmYAgUkVMRUFTRSDrtoDrpZgg7Jik7Y2866CI7J207IWY65Ok7J2ECivqtaztmITtlaAg65WMLCDqt7jrpqzqs6Ag6rCd7LK0IO2VtOygnOulvCDsnITtlbQg66CI7Y2865+w7IqkIOy5tOyatO2EsOulvCDsobDsoJXtlaAg65WMLCDslZTrrLXsoIEg66mU66qo66asCivrsLDrpqzslrQg7Zqo6rO86rCAIO2VhOyalO2VnCDqs7Mg65Ox7JeQIOyCrOyaqeuQqeuLiOuLpC4KKworCivri6TsnYzsnZgg7Jik7Y2866CI7J207IWY65Ok7J2AIOuplOuqqOumrCDrsLDrpqzslrTrpbwg64K07Y+s7ZWY7KeAIF/slYrquLBfIOuVjOusuOyXkCDrrLjsoJzqsIAg65CgIOyImAor7J6I7KeA66eMLCBSRUxFQVNFIOu2gOulmOydmCDsmKTtjbzroIjsnbTshZjrk6Tqs7wg6rCZ7J2AIOqyg+uTpOydhCDqtaztmITtlaAg65WMIOyCrOyaqeuQoCDsiJjrj4QKK+yeiOyKteuLiOuLpDoKKworCWF0b21pY19zZXQoKTsKKwlzZXRfYml0KCk7CisJY2xlYXJfYml0KCk7CisJY2hhbmdlX2JpdCgpOworCivsnbTqsoPrk6TsnYQg7IKs7Jqp7ZWgIOuVjOyXkOuKlCDtlYTsmpTtlZjri6TrqbQg7KCB7KCI7ZWcICjsmIjrpbwg65Ok66m0IHNtcF9tYl9fYmVmb3JlX2F0b21pYygpCivqsJnsnYApIOuplOuqqOumrCDrsLDrpqzslrTqsIAg66qF7Iuc7KCB7Jy866GcIO2VqOq7mCDsgqzsmqnrkJjslrTslbwg7ZWp64uI64ukLgorCisKK+yVhOuemOydmCDqsoPrk6Trj4Qg66mU66qo66asIOuwsOumrOyWtOulvCDrgrTtj6ztlZjsp4AgX+yViuq4sF8g65WM66y47JeQLCDsnbzrtoAg7ZmY6rK97JeQ7ISc64qUICjsmIjrpbwKK+uTpOuptCBzbXBfbWJfX2JlZm9yZV9hdG9taWMoKSDqs7wg6rCZ7J2AKSDrqoXsi5zsoIHsnbgg66mU66qo66asIOuwsOumrOyWtCDsgqzsmqnsnbQg7ZWE7JqU7ZWp64uI64ukLgorCisJYXRvbWljX2FkZCgpOworCWF0b21pY19zdWIoKTsKKwlhdG9taWNfaW5jKCk7CisJYXRvbWljX2RlYygpOworCivsnbTqsoPrk6TsnbQg7Ya16rOEIOyDneyEseydhCDsnITtlbQg7IKs7Jqp65Cc64uk66m0LCDqt7jrpqzqs6Ag7Ya16rOEIOuNsOydtO2EsCDsgqzsnbTsl5Ag6rSA6rOE6rCAIOyhtOyerO2VmOyngAor7JWK64qU64uk66m0IOuplOuqqOumrCDrsLDrpqzslrTripQg7ZWE7JqU7LmYIOyViuydhCDqsoHri4jri6QuCisKK+qwneyytOydmCDsiJjrqoXsnYQg6rSA66as7ZWY6riwIOychO2VtCDroIjtjbzrn7DsiqQg7Lm07Jq07YyFIOuqqeyggeycvOuhnCDsgqzsmqnrkJzri6TrqbQsIOugiO2NvOufsOyKpAor7Lm07Jq07YSw64qUIOudveycvOuhnCDrs7TtmLjrkJjripQg7IS57IWY7JeQ7ISc66eMIOyhsOygleuQmOqxsOuCmCDtmLjstpztlZjripQg7Kq97J20IOydtOuvuCDstqnrtoTtlZwKK+ugiO2NvOufsOyKpOulvCDsnqHqs6Ag7J6I7J2EIOqyg+ydtOq4sCDrlYzrrLjsl5Ag66mU66qo66asIOuwsOumrOyWtOuKlCDslYTrp4gg7ZWE7JqUIOyXhuydhCDqsoHri4jri6QuCisKK+unjOyVvSDslrTrlqQg65297J2EIOq1rOyEse2VmOq4sCDsnITtlbQg7IKs7Jqp65Cc64uk66m0LCDrnb0g6rSA66CoIOuPmeyekeydgCDsnbzrsJjsoIHsnLzroZwg7J6R7JeF7J2EIO2KueyglQor7Iic7ISc64yA66GcIOynhO2Wie2VtOyVvCDtlZjrr4DroZwg66mU66qo66asIOuwsOumrOyWtOqwgCDtlYTsmpTtlaAg7IiYIOyeiOyKteuLiOuLpC4KKwor6riw67O47KCB7Jy866GcLCDqsIEg7IKs7Jqp7LKY7JeQ7ISc64qUIOuplOuqqOumrCDrsLDrpqzslrTqsIAg7ZWE7JqU7ZWc7KeAIOyVhOuLjOyngCDstqnrtoTtnogg6rOg66Ck7ZW07JW8Civtlanri4jri6QuCisKK+yVhOuemOydmCDsmKTtjbzroIjsnbTshZjrk6TsnYAg7Yq567OE7ZWcIOudvSDqtIDroKgg64+Z7J6R65Ok7J6F64uI64ukOgorCisJdGVzdF9hbmRfc2V0X2JpdF9sb2NrKCk7CisJY2xlYXJfYml0X3VubG9jaygpOworCV9fY2xlYXJfYml0X3VubG9jaygpOworCivsnbTqsoPrk6TsnYAgQUNRVUlSRSDrpZjsmYAgUkVMRUFTRSDrpZjsnZgg7Jik7Y2866CI7J207IWY65Ok7J2EIOq1rO2YhO2VqeuLiOuLpC4gIOudvSDqtIDroKgg64+E6rWs66W8CivqtaztmITtlaAg65WM7JeQ64qUIOydtOqyg+uTpOydhCDsooAg642UIOyEoO2YuO2VmOuKlCDtjrjsnbQg64KY7J2A642wLCDsnbTqsoPrk6TsnZgg6rWs7ZiE7J2AIOunjuydgAor7JWE7YKk7YWN7LOQ7JeQ7IScIOy1nOygge2ZlCDrkKAg7IiYIOyeiOq4sCDrlYzrrLjsnoXri4jri6QuCisKK1shXSDsnbTrn7Ag7IOB7Zmp7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIO2KueyImO2VnCDrqZTrqqjrpqwg67Cw66as7Ja0IOuPhOq1rOuTpOydtCDsnojsirXri4jri6Trp4wsIOydvOu2gAorQ1BVIOyXkOyEnOuKlCDsgqzsmqnrkJjripQg7Ja07Yag66+5IOyduOyKpO2KuOufreyFmCDsnpDssrTsl5Ag66mU66qo66asIOuwsOumrOyWtOqwgCDrgrTtj6zrkJjslrQg7J6I7Ja07IScCivslrTthqDrr7kg7Jik7Y2866CI7J207IWY6rO8IOuplOuqqOumrCDrsLDrpqzslrTrpbwg7ZWo6ruYIOyCrOyaqe2VmOuKlCDqsowg67aI7ZWE7JqU7ZWcIOydvOydtCDrkKAg7IiYCivsnojripTrjbAsIOq3uOufsCDqsr3smrDsl5Ag7J20IO2KueyImCDrqZTrqqjrpqwg67Cw66as7Ja0IOuPhOq1rOuTpOydgCBuby1vcCDsnbQg65CY7Ja0IOyLpOyniOyggeycvOuhnAor7JWE66y07J2864+EIO2VmOyngCDslYrsirXri4jri6QuCisKK+uNlCDrp47snYAg64K07Jqp7J2EIOychO2VtOyEoCBEb2N1bWVudGF0aW9uL2F0b21pY19vcHMudHh0IOulvCDssLjqs6DtlZjshLjsmpQuCisKKwor65SU67CU7J207IqkIOyVoeyEuOyKpAorLS0tLS0tLS0tLS0tLS0tCisKK+unjuydgCDrlJTrsJTsnbTsiqTqsIAg66mU66qo66asIOunpO2VkSDquLDrspXsnLzroZwg7KCc7Ja065CgIOyImCDsnojripTrjbAsIOq3uOugh+qyjCDsoJzslrTrkJjripQKK+uUlOuwlOydtOyKpOuKlCBDUFUg7JeQ64qUIOuLqOyngCDtirnsoJUg66mU66qo66asIOyYgeyXreydmCDsp5Htlansspjrn7wg67O07J206rKMIOuQqeuLiOuLpC4gIOuTnOudvOydtOuyhOuKlAor6re465+wIOuUlOuwlOydtOyKpOulvCDsoJzslrTtlZjquLAg7JyE7ZW0IOygle2Zle2eiCDsmKzrsJTrpbgg7Iic7ISc66GcIOyYrOuwlOuluCDrqZTrqqjrpqwg7JWh7IS47Iqk66W8Civrp4zrk6TslrTslbwg7ZWp64uI64ukLgorCivtlZjsp4Drp4wsIOyVoeyEuOyKpOuTpOydhCDsnqzrsLDsuZgg7ZWY6rGw64KYIOyhsO2Vqe2VmOqxsOuCmCDrs5HtlantlZjripTqsowg642UIO2aqOycqOyggeydtOudvCDtjJDri6jtlZjripQKK+yYgeumrO2VnCBDUFUg64KYIOy7tO2MjOydvOufrOuTpOydhCDsgqzsmqntlZjrqbQg65Oc65287J2067KEIOy9lOuTnOydmCDsobDsi6zsiqTrn73qsowg7Iic7IScIOunnuy2sOynhAor7JWh7IS47Iqk65Ok7J20IOuUlOuwlOydtOyKpOyXkOuKlCDsmpTssq3rkJwg7Iic7ISc64yA66GcIOuPhOywqe2VmOyngCDrqrvtlZjqsowg7ZWgIOyImCDsnojripQgLSDrlJTrsJTsnbTsiqTqsIAKK+yYpOuPmeyekeydhCDtlZjqsowg7ZWgIC0g7J6g7J6s7KCBIOusuOygnOqwgCDsg53quLgg7IiYIOyeiOyKteuLiOuLpC4KKwor66as64iF7IqkIOy7pOuEkCDrgrTrtoDsl5DshJwsIEkvTyDripQg7Ja065a76rKMIOyVoeyEuOyKpOuTpOydhCDsoIHsoIjtnogg7Iic7LCo7KCB7J206rKMIOunjOuTpCDsiJgg7J6I64qU7KeACivslYzqs6Ag7J6I64qULCAtIGluYigpIOuCmCB3cml0ZWwoKSDqs7wg6rCZ7J2AIC0g7KCB7KCI7ZWcIOyVoeyEuOyKpCDro6jti7TsnYQg7Ya17ZW0IOydtOujqOyWtOyguOyVvOunjAor7ZWp64uI64ukLiAg7J206rKD65Ok7J2AIOuMgOu2gOu2hOydmCDqsr3smrDsl5DripQg66qF7Iuc7KCBIOuplOuqqOumrCDrsLDrpqzslrQg7JmAIO2VqOq7mCDsgqzsmqnrkKAg7ZWE7JqU6rCACivsl4bsirXri4jri6Trp4wsIOuLpOydjOydmCDrkZDqsIDsp4Ag7IOB7Zmp7JeQ7ISc64qUIOuqheyLnOyggSDrqZTrqqjrpqwg67Cw66as7Ja06rCAIO2VhOyalO2VoCDsiJgg7J6I7Iq164uI64ukOgorCisgKDEpIOydvOu2gCDsi5zsiqTthZzsl5DshJwgSS9PIOyKpO2GoOyWtOuKlCDrqqjrk6AgQ1BVIOyXkCDsnbzqtIDrkJjqsowg7Iic7IScIOunnuy2sOyngOyngCDslYrripTrjbAsCisgICAgIOuUsOudvOyEnCBf66qo65OgXyDsnbzrsJjsoIHsnbgg65Oc65287J2067KE65Ok7JeQIOudveydtCDsgqzsmqnrkJjslrTslbzrp4wg7ZWY6rOgIOydtCDtgazrpqzti7Dsu6wKKyAgICAg7IS57IWY7J2EIOu5oOyguOuCmOyYpOq4sCDsoITsl5AgbW1pb3diKCkg6rCAIOq8rSDtmLjstpzrkJjslrTslbwg7ZWp64uI64ukLgorCisgKDIpIOunjOyVvSDslaHshLjsiqQg7ZWo7IiY65Ok7J20IOyZhO2ZlOuQnCDrqZTrqqjrpqwg7JWh7IS47IqkIOyGjeyEseydhCDqsJbripQgSS9PIOuplOuqqOumrCDsnIjrj4TsmrDrpbwKKyAgICAg7IKs7Jqp7ZWc64uk66m0LCDsiJzshJzrpbwg6rCV7KCc7ZWY6riwIOychO2VtOyEoCBfbWFuZGF0b3J5XyDrqZTrqqjrpqwg67Cw66as7Ja06rCAIO2VhOyalO2VqeuLiOuLpC4KKwor642UIOunjuydgCDsoJXrs7Trpbwg7JyE7ZW07ISgIERvY3VtZW50YXRpb24vRG9jQm9vay9kZXZpY2Vpb2Jvb2sudG1wbCDsnYQg7LC46rOg7ZWY7Iut7Iuc7JikLgorCisKK+yduO2EsOufve2KuAorLS0tLS0tLS0KKwor65Oc65287J2067KE64qUIOyekOyLoOydmCDsnbjthLDrn73tirgg7ISc67mE7IqkIOujqO2LtOyXkCDsnZjtlbQg7J247YSw65+97Yq4IOuLue2VoCDsiJgg7J6I6riwIOuVjOusuOyXkAor65Oc65287J2067KE7J2YIOydtCDrkZAg67aA67aE7J2AIOyEnOuhnOydmCDrlJTrsJTsnbTsiqQg7KCc7Ja0IOuYkOuKlCDslaHshLjsiqQg67aA67aE6rO8IOyDge2YuCDqsITshK3tlaAg7IiYCivsnojsirXri4jri6QuCisKK+yKpOyKpOuhnOyXkOqyjCDsnbjthLDrn73tirgg64u57ZWY64qUIOqxuCDrtojqsIDriqXtlZjqsowg7ZWY6rOgLCDrk5zrnbzsnbTrsoTsnZgg7YGs66as7Yuw7Lus7ZWcCivsmKTtjbzroIjsnbTshZjrk6TsnYQg66qo65GQIOyduO2EsOufve2KuOqwgCDrtojqsIDriqXtlZjqsowg65CcIOyYgeyXreyXkCDsp5HslrTrhKPqsbDrgpgg7ZWY64qUIOuwqeuylSAo65297J2YCivtlZwg7ZiV7YOcKSDsnLzroZwg7J2065+wIOyDge2YuCDqsITshK3snYQgLSDstZzshoztlZwg67aA67aE7KCB7Jy866Gc652864+EIC0g7KSE7J28IOyImCDsnojsirXri4jri6QuCivrk5zrnbzsnbTrsoTsnZgg7J247YSw65+97Yq4IOujqO2LtOydtCDsi6Ttlokg7KSR7J24IOuPmeyViCwg7ZW064u5IOuTnOudvOydtOuyhOydmCDsvZTslrTripQg6rCZ7J2AIENQVSDsl5DshJwKK+yImO2WieuQmOyngCDslYrsnYQg6rKD7J2066mwLCDtmITsnqzsnZgg7J247YSw65+97Yq46rCAIOyymOumrOuQmOuKlCDspJHsl5DripQg65iQ64uk7IucIOyduO2EsOufve2KuOqwgAor7J287Ja064KY7KeAIOuqu+2VmOuPhOuhnSDrkJjslrQg7J6I7Jy864uIIOyduO2EsOufve2KuCDtlbjrk6Trn6zripQg6re47JeQIOuMgO2VtOyEnOuKlCDrnb3snYQg7J6h7KeAIOyViuyVhOuPhAor65Cp64uI64ukLgorCivtlZjsp4Drp4wsIOyWtOuTnOugiOyKpCDroIjsp4DsiqTthLDsmYAg642w7J207YSwIOugiOyngOyKpO2EsOulvCDqsJbripQg7J20642U64S3IOy5tOuTnOulvCDri6Tro6jripQKK+uTnOudvOydtOuyhOulvCDsg53qsIHtlbQg67SF7Iuc64ukLiAg66eM7JW9IOydtCDrk5zrnbzsnbTrsoTsnZgg7L2U7Ja06rCAIOyduO2EsOufve2KuOulvCDruYTtmZzshLHtmZTsi5ztgqgKK+yxhOuhnCDsnbTrjZTrhLcg7Lm065Oc7JmAIOuMgO2ZlO2VmOqzoCDrk5zrnbzsnbTrsoTsnZgg7J247YSw65+97Yq4IO2VuOuTpOufrOqwgCDtmLjstpzrkJjsl4jri6TrqbQ6CisKKwlMT0NBTCBJUlEgRElTQUJMRQorCXdyaXRldyhBRERSLCAzKTsKKwl3cml0ZXcoREFUQSwgeSk7CisJTE9DQUwgSVJRIEVOQUJMRQorCTxpbnRlcnJ1cHQ+CisJd3JpdGV3KEFERFIsIDQpOworCXEgPSByZWFkdyhEQVRBKTsKKwk8L2ludGVycnVwdD4KKwor66eM7JW9IOyInOyEnCDqt5zsuZnsnbQg7Lap67aE7Z6IIOyZhO2ZlOuQmOyWtCDsnojri6TrqbQg642w7J207YSwIOugiOyngOyKpO2EsOyXkOydmCDsiqTthqDslrTripQg7Ja065Oc66CI7IqkCivroIjsp4DsiqTthLDsl5Ag65GQ67KI7Ke466GcIO2Wie2VtOyngOuKlCDsiqTthqDslrQg65Kk7JeQIOydvOyWtOuCoCDsiJjrj4Qg7J6I7Iq164uI64ukOgorCisJU1RPUkUgKkFERFIgPSAzLCBTVE9SRSAqQUREUiA9IDQsIFNUT1JFICpEQVRBID0geSwgcSA9IExPQUQgKkRBVEEKKworCivrp4zslb0g7Iic7IScIOq3nOy5meydtCDstqnrtoTtnogg7JmE7ZmU65CY7Ja0IOyeiOqzoCDrrLXsi5zsoIHsnLzroZzrk6Ag66qF7Iuc7KCB7Jy866Gc65OgIOuwsOumrOyWtOqwgAor7IKs7Jqp65CY7KeAIOyViuyVmOuLpOuptCDsnbjthLDrn73tirgg67mE7Zmc7ISx7ZmUIOyEueyFmOyXkOyEnCDsnbzslrTrgpwg7JWh7IS47Iqk6rCAIOuwlOq5peycvOuhnCDsg4jslrTshJwKK+yduO2EsOufve2KuCDrgrTsl5DshJwg7J287Ja064KcIOyVoeyEuOyKpOyZgCDshJ7snbwg7IiYIOyeiOuLpOqzoCAtIOq3uOumrOqzoCDqt7gg67CY64yA64+EIC0g6rCA7KCV7ZW07JW866eMCivtlanri4jri6QuCisKK+q3uOufsCDsmIHsl60g7JWI7JeQ7IScIOydvOyWtOuCmOuKlCBJL08g7JWh7IS47Iqk65Ok7J2AIOyXhOqyqe2VnCDsiJzshJwg6rec7LmZ7J2YIEkvTyDroIjsp4DsiqTthLDsl5AKK+usteyLnOyggSBJL08g67Cw66as7Ja066W8IO2YleyEse2VmOuKlCDrj5nquLDsoIEgKHN5bmNocm9ub3VzKSDroZzrk5wg7Jik7Y2866CI7J207IWY7J2EIO2PrO2VqO2VmOq4sAor65WM66y47JeQIOydvOuwmOyggeycvOuhnOuKlCDsnbTrn7Dqsowg66y47KCc6rCAIOuQmOyngCDslYrsirXri4jri6QuICDrp4zslb0g7J206rG466Gc64qUIOy2qeu2hOy5mCDslYrri6TrqbQKK21taW93YigpIOqwgCDrqoXsi5zsoIHsnLzroZwg7IKs7Jqp65CgIO2VhOyalOqwgCDsnojsirXri4jri6QuCisKKwor7ZWY64KY7J2YIOyduO2EsOufve2KuCDro6jti7Tqs7wg67OE64+E7J2YIENQVSDsl5DshJwg7IiY7ZaJ7KSR7J2066mwIOyEnOuhnCDthrXsi6DsnYQg7ZWY64qUIOuRkCDro6jti7QKK+yCrOydtOyXkOuPhCDruYTsirftlZwg7IOB7Zmp7J20IOydvOyWtOuCoCDsiJgg7J6I7Iq164uI64ukLiAg66eM7JW9IOq3uOufsCDqsr3smrDqsIAg67Cc7IOd7ZWgIOqwgOuKpeyEseydtAor7J6I64uk66m0LCDsiJzshJzrpbwg67O07J6l7ZWY6riwIOychO2VtCDsnbjthLDrn73tirgg67mE7Zmc7ISx7ZmUIOudveydtCDsgqzsmqnrkJjslrTsoLjslbzrp4wg7ZWp64uI64ukLgorCisKKz09PT09PT09PT09PT09PT09PT09PT0KK+y7pOuEkCBJL08g67Cw66as7Ja07J2YIO2aqOqzvAorPT09PT09PT09PT09PT09PT09PT09PQorCitJL08g66mU66qo66as7JeQIOyVoeyEuOyKpO2VoCDrlYwsIOuTnOudvOydtOuyhOuKlCDsoIHsoIjtlZwg7JWh7IS47IqkIO2VqOyImOulvCDsgqzsmqntlbTslbwg7ZWp64uI64ukOgorCisgKCopIGluWCgpLCBvdXRYKCk6CisKKyAgICAg7J206rKD65Ok7J2AIOuplOuqqOumrCDqs7XqsITrs7Tri6TripQgSS9PIOqzteqwhOyXkCDsnbTslbzquLDrpbwg7ZWY66Ck64qUIOydmOuPhOuhnAorICAgICDrp4zrk6TslrTsoYzsirXri4jri6Trp4wsIOq3uOqxtCDquLDrs7jsoIHsnLzroZwgQ1BVIOuniOuLpCDri6Trpbgg7Luo7IWJ7J6F64uI64ukLiAgaTM4NiDqs7wKKyAgICAgeDg2XzY0IO2UhOuhnOyEuOyEnOuTpOydgCDtirnrs4TtlZwgSS9PIOqzteqwhCDslaHshLjsiqQg7IKs7J207YG06rO8IOuqheugueyWtOulvCDsi6TsoJzroZwg6rCA7KeA6rOgCisgICAgIOyeiOyngOunjCwg64uk66W4IOunjuydgCBDUFUg65Ok7JeQ64qUIOq3uOufsCDsu6jshYnsnbQg7KG07J6s7ZWY7KeAIOyViuyKteuLiOuLpC4KKworICAgICDri6Trpbgg6rKD65OkIOykkeyXkOyEnOuPhCBQQ0kg67KE7Iqk6rCAIEkvTyDqs7XqsIQg7Luo7IWJ7J2EIOygleydmO2VmOuKlOuNsCwg7J2064qUIC0gaTM4NiDqs7wKKyAgICAgeDg2XzY0IOqwmeydgCBDUFUg7JeQ7IScIC0gQ1BVIOydmCBJL08g6rO16rCEIOy7qOyFieycvOuhnCDsib3qsowg66ek7LmY65Cp64uI64ukLiAg7ZWY7KeA66eMLAorICAgICDrjIDssrTtlaAgSS9PIOqzteqwhOydtCDsl4bripQgQ1BVIOyXkOyEnOuKlCBDUFUg7J2YIOuplOuqqOumrCDrp7XsnZgg6rCA7IOBIEkvTyDqs7XqsITsnLzroZwKKyAgICAg66ek7ZWR65CgIOyImOuPhCDsnojsirXri4jri6QuCisKKyAgICAg7J20IOqzteqwhOycvOuhnOydmCDslaHshLjsiqTripQgKGkzODYg65Ox7JeQ7ISc64qUKSDsmYTsoITtlZjqsowg64+Z6riw7ZmUIOuQqeuLiOuLpOunjCwg7KSR6rCE7J2YCisgICAgIChQQ0kg7Zi47Iqk7Yq4IOu4jOumrOyngOyZgCDqsJnsnYApIOu4jOumrOyngOuTpOydgCDsnbTrpbwg7JmE7KCE7Z6IIOuztOyepe2VmOynhCDslYrsnYTsiJjrj4QKKyAgICAg7J6I7Iq164uI64ukLgorCisgICAgIOydtOqyg+uTpOydmCDsg4HtmLjqsITsnZgg7Iic7ISc64qUIOyZhOyghO2VmOqyjCDrs7TsnqXrkKnri4jri6QuCisKKyAgICAg64uk66W4IO2DgOyeheydmCDrqZTrqqjrpqwg7Jik7Y2866CI7J207IWYLCBJL08g7Jik7Y2866CI7J207IWY7JeQIOuMgO2VnCDsiJzshJzripQg7JmE7KCE7ZWY6rKMCisgICAgIOuztOyepeuQmOyngOuKlCDslYrsirXri4jri6QuCisKKyAoKikgcmVhZFgoKSwgd3JpdGVYKCk6CisKKyAgICAg7J206rKD65Ok7J20IOyImO2WiSDsmpTssq3rkJjripQgQ1BVIOyXkOyEnCDshJzroZzsl5Dqsowg7JmE7KCE7Z6IIOyInOyEnOqwgCDrp57strDsp4Dqs6Ag64+F66a97KCB7Jy866GcCisgICAgIOyImO2WieuQmOuKlOyngOyXkCDrjIDtlZwg67O07J6lIOyXrOu2gOuKlCDsnbTrk6TsnbQg7JWh7IS47IqkIO2VmOuKlCDrqZTrqqjrpqwg7JyI64+E7Jqw7JeQIOygleydmOuQnAorICAgICDtirnshLHsl5Ag7J2Y7ZW0IOqysOygleuQqeuLiOuLpC4gIOyYiOulvCDrk6TslrQsIOy1nOyLoOydmCBpMzg2IOyVhO2CpO2FjeyzkCDrqLjsi6Dsl5DshJzripQgTVRSUgorICAgICDroIjsp4DsiqTthLDroZwg7J20IO2KueyEseydtCDsobDsoJXrkKnri4jri6QuCisKKyAgICAg7J2867CY7KCB7Jy866Gc64qULCDtlITrpqztjpjsuZggKHByZWZldGNoKSDqsIDriqXtlZwg65SU67CU7J207Iqk66W8IOyVoeyEuOyKpCDtlZjripTqsowKKyAgICAg7JWE64uI652866m0LCDsnbTqsoPrk6TsnYAg7JmE7KCE7Z6IIOyInOyEnOqwgCDrp57strDsp4Dqs6Ag6rKw7ZWp65CY7KeAIOyViuqyjCDrs7TsnqXrkKAg6rKB64uI64ukLgorCisgICAgIO2VmOyngOunjCwgKFBDSSDruIzrpqzsp4DsmYAg6rCZ7J2AKSDspJHqsITsnZgg7ZWY65Oc7Juo7Ja064qUIOyekOyLoOydtCDsm5DtlZzri6TrqbQg7KeR7ZaJ7J2ECisgICAgIOyXsOq4sOyLnO2CrCDsiJgg7J6I7Iq164uI64ukOyDsiqTthqDslrQg66qF66C57J2EIOyLpOygnOuhnCDtlZjrk5zsm6jslrTroZwg64K066Ck67O064K06riwKGZsdXNoKQorICAgICDsnITtlbTshJzripQg6rCZ7J2AIOychOy5mOuhnOu2gO2EsCDroZzrk5zrpbwg7ZWY64qUIOuwqeuyleydtCDsnojsirXri4jri6Trp4xbKl0sIFBDSSDsnZgg6rK97Jqw64qUCisgICAgIOqwmeydgCDrlJTrsJTsnbTsiqTrgpgg7ZmY6rK9IOq1rOyEsSDsmIHsl63sl5DshJzsnZgg66Gc65Oc66eM7Jy866Gc64+EIOy2qeu2hO2VoCDqsoHri4jri6QuCisKKyAgICAgWypdIOyjvOydmCEg7JOw7Jes7KeEIOqyg+qzvCDqsJnsnYAg7JyE7LmY66Gc67aA7YSw7J2YIOuhnOuTnOulvCDsi5zrj4TtlZjripQg6rKD7J2AIOyYpOuPmeyekeydhAorCSDsnbzsnLztgqwg7IiY64+EIOyeiOyKteuLiOuLpCAtIOyYiOuhnCAxNjY1MCBSeC9UeCDsi5zrpqzslrwg66CI7KeA7Iqk7YSw66W8IOyDneqwge2VtAorCSDrs7TshLjsmpQuCisKKyAgICAg7ZSE66as7Y6Y7LmYIOqwgOuKpe2VnCBJL08g66mU66qo66as6rCAIOyCrOyaqeuQmOuptCwg7Iqk7Yag7Ja0IOuqheugueuTpOydtCDsiJzshJzrpbwg7KeA7YKk64+E66GdCisgICAgIO2VmOq4sCDsnITtlbQgbW1pb3diKCkg67Cw66as7Ja06rCAIO2VhOyalO2VoCDsiJgg7J6I7Iq164uI64ukLgorCisgICAgIFBDSSDtirjrnpzsnq3shZgg7IKs7J207J2YIOyDge2YuOyekeyaqeyXkCDrjIDtlbQg642UIOunjuydgCDsoJXrs7Trpbwg7JyE7ZW07ISgIFBDSSDrqoXshLjshJzrpbwKKyAgICAg7LC46rOg7ZWY7Iuc6riwIOuwlOuejeuLiOuLpC4KKworICgqKSByZWFkWF9yZWxheGVkKCksIHdyaXRlWF9yZWxheGVkKCkKKworICAgICDsnbTqsoPrk6TsnYAgcmVhZFgoKSDsmYAgd3JpdGVYKCkg656RIOu5hOyKt+2VmOyngOunjCwg642UIOyZhO2ZlOuQnCDrqZTrqqjrpqwg7Iic7IScIOuztOyepeydhAorICAgICDsoJzqs7Xtlanri4jri6QuICDqtazssrTsoIHsnLzroZwsIOydtOqyg+uTpOydgCDsnbzrsJjsoIEg66mU66qo66asIOyVoeyEuOyKpCAo7JiIOiBETUEg67KE7Y28KSDsl5Drj4QKKyAgICAgTE9DSyDsnbTrgpggVU5MT0NLIOyYpO2NvOugiOydtOyFmOuTpOyXkOuPhCDsiJzshJzrpbwg67O07J6l7ZWY7KeAIOyViuyKteuLiOuLpC4gIExPQ0sg7J2064KYCisgICAgIFVOTE9DSyDsmKTtjbzroIjsnbTshZjrk6Tsl5Ag66ee7Law7KeA64qUIOyInOyEnOqwgCDtlYTsmpTtlZjri6TrqbQsIG1taW93YigpIOuwsOumrOyWtOqwgCDsgqzsmqnrkKAKKyAgICAg7IiYIOyeiOyKteuLiOuLpC4gIOqwmeydgCDso7zrs4Ag7J6l7LmY7JeQ7J2YIOyZhO2ZlOuQnCDslaHshLjsiqTrgbzrpqzripQg7Iic7ISc6rCAIOyngOy8nOynkOydhCDslYzslYQKKyAgICAg65GQ7Iuc6riwIOuwlOuejeuLiOuLpC4KKworICgqKSBpb3JlYWRYKCksIGlvd3JpdGVYKCkKKworICAgICDsnbTqsoPrk6TsnYAgaW5YKCkvb3V0WCgpIOuCmCByZWFkWCgpL3dyaXRlWCgpIOyymOufvCDsi6TsoJzroZwg7IiY7ZaJ7ZWY64qUIOyVoeyEuOyKpOydmAorICAgICDsooXrpZjsl5Ag65Sw6528IOyggeygiO2VmOqyjCDsiJjtlonrkKAg6rKD7J6F64uI64ukLgorCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CivqsIDsoJXrkJjripQg6rCA7J6lIOyZhO2ZlOuQnCDsi6Ttlokg7Iic7IScIOuqqOuNuAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwor7Luo7IWJ7KCB7Jy866GcIENQVSDripQg7KO87Ja07KeEIO2UhOuhnOq3uOueqOyXkCDrjIDtlbQg7ZSE66Gc6re4656oIOq3uCDsnpDssrTsl5DripQg7J246rO87ISxIChwcm9ncmFtCitjYXVzYWxpdHkpIOydhCDsp4DtgqTripQg6rKD7LKY65+8IOuztOydtOqyjCDtlZjsp4Drp4wg7J2867CY7KCB7Jy866Gc64qUIOyInOyEnOulvCDqsbDsnZgg7KeA7Lyc7KO87KeACivslYrripTri6Tqs6Ag6rCA7KCV65CY7Ja07JW866eMIO2VqeuLiOuLpC4gIChpMzg2IOydtOuCmCB4ODZfNjQg6rCZ7J2AKSDsnbzrtoAgQ1BVIOuTpOydgCDsvZTrk5wKK+yerOuwsOy5mOyXkCAocG93ZXJwYyDrgpggZnJ2IOyZgCDqsJnsnYApIOuLpOuluCDqsoPrk6Tsl5Ag67mE7ZW0IOqwle2VnCDsoJzslb3snYQg6rCW7KeA66eMLCDslYTtgqTthY3ss5AKK+yiheyGjeyggSDsvZTrk5wg7J207Jm47J2YIOy9lOuTnOyXkOyEnOuKlCDsiJzshJzsl5Ag64yA7ZWcIOygnOyVveydtCDqsIDsnqUg7JmE7ZmU65CcIOqyveyasCAoREVDIEFscGhhKQor66W8IOqwgOygle2VtOyVvCDtlanri4jri6QuCisKK+ydtCDrp5DsnYAsIENQVSDsl5Dqsowg7KO87Ja07KeA64qUIOyduOyKpO2KuOufreyFmCDsiqTtirjrprwg64K07J2YIO2VnCDsnbjsiqTtirjrn63shZjsnbQg7JWe7J2YCivsnbjsiqTtirjrn63shZjsl5Ag7KKF7IaN7KCB7J20652866m0IOyVnuydmCDsnbjsiqTtirjrn63shZjsnYAg65Kk7J2YIOyiheyGjeyggSDsnbjsiqTtirjrn63shZjsnbQg7Iuk7ZaJ65CY6riwCivsoITsl5Ag7JmE66OMWypd65CgIOyImCDsnojslrTslbwg7ZWc64uk64qUIOygnOyVvSAo64us66asIOunkO2VtOyEnCwg7J246rO87ISx7J20IOyngOy8nOyngOuKlCDqsoPsnLzroZwKK+uztOydtOqyjCDtlagpIOyZuOyXkOuKlCDsnpDsi6DsnbQg7JuQ7ZWY64qUIOyInOyEnOuMgOuhnCAtIOyLrOyngOyWtCDrs5HroKzsoIHsnLzroZzrj4QgLSDqt7gg7Iqk7Yq466a87J2ECivsi6TtlontlaAg7IiYIOyeiOydjOydhCDsnZjrr7jtlanri4jri6QKKworIFsqXSDsnbzrtoAg7J247Iqk7Yq465+t7IWY7J2AIO2VmOuCmCDsnbTsg4HsnZgg7JiB7ZalIC0g7KGw6rG0IOy9lOuTnOulvCDrsJTqvrzri6TrjZjsp4AsIOugiOyngOyKpO2EsOuCmAorICAgICDrqZTrqqjrpqzrpbwg67CU6r6864uk642Y7KeAIC0g7J2EIOunjOuTpOyWtOuCtOupsCwg64uk66W4IOyduOyKpO2KuOufreyFmOydgCDri6Trpbgg7Zqo6rO87JeQCisgICAgIOyiheyGjeyggeydvCDsiJgg7J6I7Iq164uI64ukLgorCitDUFUg64qUIOy1nOyiheyggeycvOuhnCDslYTrrLQg7Zqo6rO864+EIOunjOuTpOyngCDslYrripQg7J247Iqk7Yq465+t7IWYIOyLnO2AgOyKpOuKlCDsl4bslaDrsoTrprQg7IiY64+ECivsnojsirXri4jri6QuICDsmIjrpbwg65Ok7Ja0LCDrp4zslb0g65GQ6rCc7J2YIOyXsOyGjeuQmOuKlCDsnbjsiqTtirjrn63shZjsnbQg65GYIOuLpCDqsJnsnYAg66CI7KeA7Iqk7YSw7JeQCivsp4HsoJHsoIHsnbgg6rCSIChpbW1lZGlhdGUgdmFsdWUpIOydhCDsp5HslrTrhKPripTri6TrqbQsIOyyq+uyiOynuCDsnbjsiqTtirjrn63shZjsnYAg67KE66Ck7KeIIOyImOuPhAor7J6I7Iq164uI64ukLgorCisKK+u5hOyKt+2VmOqyjCwg7Lu07YyM7J2865+sIOyXreyLnCDtlITroZzqt7jrnqjsnZgg7J246rO87ISx66eMIOyngOy8nOykgOuLpOuptCDsnbjsiqTtirjrn63shZgg7Iqk7Yq466a87J2ECivsnpDsi6DsnbQg67O06riw7JeQIOyYrOuwlOultOuLpCDsg53qsIHrkJjripTrjIDroZwg7J6s67Cw7LmYIO2VoCDsiJgg7J6I7Iq164uI64ukLgorCisKKz09PT09PT09PT09PT09PQorQ1BVIOy6kOyLnOydmCDsmIHtlqUKKz09PT09PT09PT09PT09PQorCivsupDsi5zrkJwg66mU66qo66asIOyYpO2NvOugiOydtOyFmOuTpOydtCDsi5zsiqTthZwg7KCE7LK07JeQIOyWtOuWu+qyjCDsnbjsp4DrkJjripTsp4DripQgQ1BVIOyZgCDrqZTrqqjrpqwKK+yCrOydtOyXkCDsobTsnqztlZjripQg7LqQ7Iuc65OkLCDqt7jrpqzqs6Ag7Iuc7Iqk7YWcIOyDge2DnOydmCDsnbzqtIDshLHsnYQg6rSA66as7ZWY64qUIOuplOuqqOumrCDsnbzqtIDshLEKK+yLnOyKpO2FnOyXkCDsg4Hri7kg67aA67aEIOyYge2WpeydhCDrsJvsirXri4jri6QuCisKK+2VnCBDUFUg6rCAIOyLnOyKpO2FnOydmCDri6Trpbgg67aA67aE65Ok6rO8IOy6kOyLnOulvCDthrXtlbQg7IOB7Zi47J6R7Jqp7ZWc64uk66m0LCDrqZTrqqjrpqwg7Iuc7Iqk7YWc7J2ACitDUFUg7J2YIOy6kOyLnOuTpOydhCDtj6ztlajtlbTslbwg7ZWY66mwLCBDUFUg7JmAIENQVSDsnpDsi6DsnZgg7LqQ7IucIOyCrOydtOyXkOyEnOydmCDrj5nsnpHsnYQg7JyE7ZWcCivrqZTrqqjrpqwg67Cw66as7Ja066W8IOqwgOyguOyVvCDtlanri4jri6QuICjrqZTrqqjrpqwg67Cw66as7Ja064qUIOuFvOumrOyggeycvOuhnOuKlCDri6TsnYwg6re466a87J2YCivsoJDshKDsl5DshJwg64+Z7J6R7ZWp64uI64ukKToKKworCSAgICA8LS0tIENQVSAtLS0+ICAgICAgICAgOiAgICAgICA8LS0tLS0tLS0tLS0gTWVtb3J5IC0tLS0tLS0tLS0tPgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgOgorCSstLS0tLS0tLSsgICAgKy0tLS0tLS0tKyAgOiAgICstLS0tLS0tLSsgICAgKy0tLS0tLS0tLS0tKworCXwgICAgICAgIHwgICAgfCAgICAgICAgfCAgOiAgIHwgICAgICAgIHwgICAgfCAgICAgICAgICAgfCAgICArLS0tLS0tLS0rCisJfCAgQ1BVICAgfCAgICB8IE1lbW9yeSB8ICA6ICAgfCBDUFUgICAgfCAgICB8ICAgICAgICAgICB8ICAgIHwgICAgICAgIHwKKwl8ICBDb3JlICB8LS0tPnwgQWNjZXNzIHwtLS0tLT58IENhY2hlICB8PC0tPnwgICAgICAgICAgIHwgICAgfCAgICAgICAgfAorCXwgICAgICAgIHwgICAgfCBRdWV1ZSAgfCAgOiAgIHwgICAgICAgIHwgICAgfCAgICAgICAgICAgfC0tLT58IE1lbW9yeSB8CisJfCAgICAgICAgfCAgICB8ICAgICAgICB8ICA6ICAgfCAgICAgICAgfCAgICB8ICAgICAgICAgICB8ICAgIHwgICAgICAgIHwKKwkrLS0tLS0tLS0rICAgICstLS0tLS0tLSsgIDogICArLS0tLS0tLS0rICAgIHwgICAgICAgICAgIHwgICAgfCAgICAgICAgfAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgfCBDYWNoZSAgICAgfCAgICArLS0tLS0tLS0rCisJICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICB8IENvaGVyZW5jeSB8CisJICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICB8IE1lY2hhbmlzbSB8ICAgICstLS0tLS0tLSsKKwkrLS0tLS0tLS0rICAgICstLS0tLS0tLSsgIDogICArLS0tLS0tLS0rICAgIHwgICAgICAgICAgIHwgICAgfAkgICAgICB8CisJfCAgICAgICAgfCAgICB8ICAgICAgICB8ICA6ICAgfCAgICAgICAgfCAgICB8ICAgICAgICAgICB8ICAgIHwgICAgICAgIHwKKwl8ICBDUFUgICB8ICAgIHwgTWVtb3J5IHwgIDogICB8IENQVSAgICB8ICAgIHwgICAgICAgICAgIHwtLS0+fCBEZXZpY2UgfAorCXwgIENvcmUgIHwtLS0+fCBBY2Nlc3MgfC0tLS0tPnwgQ2FjaGUgIHw8LS0+fCAgICAgICAgICAgfCAgICB8ICAgICAgICB8CisJfCAgICAgICAgfCAgICB8IFF1ZXVlICB8ICA6ICAgfCAgICAgICAgfCAgICB8ICAgICAgICAgICB8ICAgIHwgICAgICAgIHwKKwl8ICAgICAgICB8ICAgIHwgICAgICAgIHwgIDogICB8ICAgICAgICB8ICAgIHwgICAgICAgICAgIHwgICAgKy0tLS0tLS0tKworCSstLS0tLS0tLSsgICAgKy0tLS0tLS0tKyAgOiAgICstLS0tLS0tLSsgICAgKy0tLS0tLS0tLS0tKworCSAgICAgICAgICAgICAgICAgICAgICAgICAgOgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgOgorCivtirnsoJUg66Gc65Oc64KYIOyKpO2GoOyWtOuKlCDtlbTri7kg7Jik7Y2866CI7J207IWY7J2EIOyalOyyre2VnCBDUFUg7J2YIOy6kOyLnCDrgrTsl5DshJwg64+Z7J6R7J2EIOyZhOujjO2VoAor7IiY64+EIOyeiOq4sCDrlYzrrLjsl5Ag7ZW064u5IENQVSDsnZgg67CU6rml7JeQ64qUIOuztOydtOyngCDslYrsnYQg7IiYIOyeiOyngOunjCwg64uk66W4IENQVSDqsIAg6rSA7Ius7J2ECivqsJbripTri6TrqbQg7LqQ7IucIOydvOq0gOyEsSDrqZTsu6Tri4jsppjsnbQg7ZW064u5IOy6kOyLnOudvOyduOydhCDtlbTri7kgQ1BVIOyXkOqyjCDsoITri6ztlZjqs6AsIO2VtOuLuQor66mU66qo66asIOyYgeyXreyXkCDrjIDtlZwg7Jik7Y2866CI7J207IWY7J20IOuwnOyDne2VoCDrlYzrp4jri6Qg6re4IOyYge2WpeydhCDsoITtjIzsi5ztgqTquLAg65WM66y47JeQLCDtlbTri7kKK+yYpO2NvOugiOydtOyFmOydgCDrqZTrqqjrpqzsl5Ag7Iuk7KCc66GcIOyVoeyEuOyKpOulvCDtlZzqsoPsspjrn7wg64KY7YOA64KgIOqyg+yeheuLiOuLpC4KKworQ1BVIOy9lOyWtOuKlCDtlITroZzqt7jrnqjsnZgg7J246rO87ISx7J20IOycoOyngOuQnOuLpOqzoOunjCDsl6zqsqjsp4Tri6TrqbQg7J247Iqk7Yq465+t7IWY65Ok7J2EIOyWtOuWpAor7Iic7ISc66Gc65OgIOyerOuwsOy5mO2VtOyEnCDsiJjtlontlaAg7IiYIOyeiOyKteuLiOuLpC4gIOydvOu2gCDsnbjsiqTtirjrn63shZjrk6TsnYAg66Gc65Oc64KYIOyKpO2GoOyWtAor7Jik7Y2866CI7J207IWY7J2EIOunjOuTnOuKlOuNsCDsnbQg7Jik7Y2866CI7J207IWY65Ok7J2AIOydtO2bhCDsiJjtlonrkKAg66mU66qo66asIOyVoeyEuOyKpCDtgZDsl5Ag65Ok7Ja06rCA6rKMCivrkKnri4jri6QuICDsvZTslrTripQg7J20IOyYpO2NvOugiOydtOyFmOuTpOydhCDtlbTri7kg7YGQ7JeQIOyWtOuWpCDsiJzshJzroZzrk6Ag7JuQ7ZWY64qU64yA66GcIOuEo+ydhCDsiJgKK+yeiOqzoCwg64uk66W4IOyduOyKpO2KuOufreyFmOydmCDsmYTro4zrpbwg6riw64uk66as64+E66GdIOqwleygnOuQmOq4sCDsoITquYzsp4DripQg7IiY7ZaJ7J2EIOqzhOyGje2VqeuLiOuLpC4KKwor66mU66qo66asIOuwsOumrOyWtOqwgCDtlZjripQg7J287J2AIENQVSDsqr3sl5DshJwg66mU66qo66asIOyqveycvOuhnCDrhJjslrTqsIDripQg7JWh7IS47Iqk65Ok7J2YIOyInOyEnCwKK+q3uOumrOqzoCDqt7gg7JWh7IS47Iqk7J2YIOqysOqzvOqwgCDsi5zsiqTthZzsnZgg64uk66W4IOq0gOywsOyekOuTpOyXkOqyjCDsnbjsp4DrkJjripQg7Iic7ISc66W8IOygnOyWtO2VmOuKlAor6rKD7J6F64uI64ukLgorCitbIV0gQ1BVIOuTpOydgCDtla3sg4Eg6re465OkIOyekOyLoOydmCDroZzrk5zsmYAg7Iqk7Yag7Ja064qUIO2UhOuhnOq3uOueqCDsiJzshJzrjIDroZwg7J287Ja064KcIOqyg+ycvOuhnAor67O06riwIOuVjOusuOyXkCwg7KO87Ja07KeEIENQVSDrgrTsl5DshJzripQg66mU66qo66asIOuwsOumrOyWtOulvCDsgqzsmqntlaAg7ZWE7JqU6rCAIF/sl4bsirXri4jri6RfLgorCitbIV0gTU1JTyDrgpgg64uk66W4IOuUlOuwlOydtOyKpCDslaHshLjsiqTrk6TsnYAg7LqQ7IucIOyLnOyKpO2FnOydhCDsmrDtmoztlaAg7IiY64+EIOyeiOyKteuLiOuLpC4gIOyasO2ajAor7Jes67aA64qUIOuUlOuwlOydtOyKpOqwgCDslaHshLjsiqQg65CY64qUIOuplOuqqOumrCDsnIjrj4TsmrDsnZgg7Yq57ISx7JeQIOydmO2VtCDqsrDsoJXrkKAg7IiY64+EIOyeiOqzoCwgQ1BVCivqsIAg6rCA7KeA6rOgIOyeiOydhCDsiJgg7J6I64qUIO2KueyImO2VnCDrlJTrsJTsnbTsiqQg7Ya17IugIOyduOyKpO2KuOufreyFmOydmCDsgqzsmqnsl5Ag7J2Y7ZW07IScIOqysOygleuQoAor7IiY64+EIOyeiOyKteuLiOuLpC4KKworCivsupDsi5wg7J286rSA7ISxCistLS0tLS0tLS0tLQorCivtlZjsp4Drp4wg7IK27J2AIOyVnuyXkOyEnCDsnbTslbzquLDtlZwg6rKD7LKY65+8IOuLqOyInO2VmOyngCDslYrsirXri4jri6Q6IOy6kOyLnOuTpOydgCDsnbzqtIDsoIHsnbwg6rKD7Jy866GcCivquLDrjIDrkJjsp4Drp4wsIOq3uCDsnbzqtIDshLHsnbQg7Iic7ISc7JeQ64+EIOyggeyaqeuQoCDqsbDrnbzripQg67O07J6l7J2AIOyXhuyKteuLiOuLpC4gIO2VnCBDUFUg7JeQ7IScCivrp4zrk6TslrTsp4Qg67OA6rK9IOyCrO2VreydgCDstZzsooXsoIHsnLzroZzripQg7Iuc7Iqk7YWc7J2YIOuqqOuToCBDUFUg7JeQ6rKMIOuztOyXrOyngOqyjCDrkJjsp4Drp4wsIOuLpOuluAorQ1BVIOuTpOyXkOqyjOuPhCDqsJnsnYAg7Iic7ISc66GcIOuztOydtOqyjCDrkKAg6rGw652864qUIOuztOyepeydgCDsl4bri6TripQg65y77J6F64uI64ukLgorCisKK+uRkOqwnOydmCBDUFUgKDEgJiAyKSDqsIAg64us66CkIOyeiOqzoCwg6rCBIENQVSDsl5Ag65GQ6rCc7J2YIOuNsOydtO2EsCDsupDsi5woQ1BVIDEg7J2AIEEvQiDrpbwsCitDUFUgMiDripQgQy9EIOulvCDqsJbsirXri4jri6Qp6rCAIOuzkeugrOuhnCDsl7DqsrDrkJjslrQg7J6I64qUIOyLnOyKpO2FnOydhCDri6Tro6zri6Tqs6Ag7IOd6rCB7ZW0CivrtIXsi5zri6Q6CisKKwkgICAgICAgICAgICA6CisJICAgICAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tKworCSAgICAgICAgICAgIDogICAgICArLS0tLS0tLS0tKyAgICAgICAgIHwgICAgICAgIHwKKwkrLS0tLS0tLS0rICA6ICstLS0+fCBDYWNoZSBBIHw8LS0tLS0tLT58ICAgICAgICB8CisJfCAgICAgICAgfCAgOiB8ICAgICstLS0tLS0tLS0rICAgICAgICAgfCAgICAgICAgfAorCXwgIENQVSAxIHw8LS0tKyAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwKKwl8ICAgICAgICB8ICA6IHwgICAgKy0tLS0tLS0tLSsgICAgICAgICB8ICAgICAgICB8CisJKy0tLS0tLS0tKyAgOiArLS0tPnwgQ2FjaGUgQiB8PC0tLS0tLS0+fCAgICAgICAgfAorCSAgICAgICAgICAgIDogICAgICArLS0tLS0tLS0tKyAgICAgICAgIHwgICAgICAgIHwKKwkgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1lbW9yeSB8CisJICAgICAgICAgICAgOiAgICAgICstLS0tLS0tLS0rICAgICAgICAgfCBTeXN0ZW0gfAorCSstLS0tLS0tLSsgIDogKy0tLT58IENhY2hlIEMgfDwtLS0tLS0tPnwgICAgICAgIHwKKwl8ICAgICAgICB8ICA6IHwgICAgKy0tLS0tLS0tLSsgICAgICAgICB8ICAgICAgICB8CisJfCAgQ1BVIDIgfDwtLS0rICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfAorCXwgICAgICAgIHwgIDogfCAgICArLS0tLS0tLS0tKyAgICAgICAgIHwgICAgICAgIHwKKwkrLS0tLS0tLS0rICA6ICstLS0+fCBDYWNoZSBEIHw8LS0tLS0tLT58ICAgICAgICB8CisJICAgICAgICAgICAgOiAgICAgICstLS0tLS0tLS0rICAgICAgICAgfCAgICAgICAgfAorCSAgICAgICAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLSsKKwkgICAgICAgICAgICA6CisKK+ydtCDsi5zsiqTthZzsnbQg64uk7J2M6rO8IOqwmeydgCDtirnshLHsnYQg6rCW64qU64ukIOyDneqwge2VtCDrtIXsi5zri6Q6CisKKyAoKikg7ZmA7IiY67KIIOy6kOyLnOudvOyduOydgCDsupDsi5wgQSwg7LqQ7IucIEMg65iQ64qUIOuplOuqqOumrOyXkCDsnITsuZjtlaAg7IiYIOyeiOydjDsKKworICgqKSDsp53siJjrsogg7LqQ7Iuc65287J247J2AIOy6kOyLnCBCLCDsupDsi5wgRCDrmJDripQg66mU66qo66as7JeQIOychOy5mO2VoCDsiJgg7J6I7J2MOworCisgKCopIENQVSDsvZTslrTqsIAg7ZWc6rCc7J2YIOy6kOyLnOyXkCDsoJHqt7ztlZjripQg64+Z7JWILCDri6Trpbgg7LqQ7Iuc64qUIC0g642U7YuwIOy6kOyLnOudvOyduOydhAorICAgICDrqZTrqqjrpqzsl5Ag64K066as6rGw64KYIOy2lOy4oeyEsSDroZzrk5zrpbwg7ZWY6rGw64KYIO2VmOq4sCDsnITtlbQgLSDsi5zsiqTthZzsnZgg64uk66W4IOu2gOu2hOyXkAorICAgICDslaHshLjsiqQg7ZWY6riwIOychO2VtCDrsoTsiqTrpbwg7IKs7Jqp7ZWgIOyImCDsnojsnYw7CisKKyAoKikg6rCBIOy6kOyLnOuKlCDsi5zsiqTthZzsnZgg64KY66i47KeAIOu2gOu2hOuTpOqzvCDsnbzqtIDshLHsnYQg66ee7LaU6riwIOychO2VtCDtlbTri7kg7LqQ7Iuc7JeQCisgICAgIOyggeyaqeuQmOyWtOyVvCDtlaAg7Jik7Y2866CI7J207IWY65Ok7J2YIO2BkOulvCDqsIDsp5A7CisKKyAoKikg7J20IOydvOq0gOyEsSDtgZDripQg7LqQ7Iuc7JeQIOydtOuvuCDsobTsnqztlZjripQg65287J247JeQIOqwgO2VtOyngOuKlCDtj4nrspTtlZwg66Gc65Oc7JeQIOydmO2VtOyEnOuKlAorICAgICDruYTsm4zsp4Dsp4Ag7JWK64qU642wLCDtgZDsnZgg7Jik7Y2866CI7J207IWY65Ok7J20IOydtCDroZzrk5zsnZgg6rKw6rO87JeQIOyYge2WpeydhCDrgbzsuaAg7IiYIOyeiOuLpAorICAgICDtlaDsp4Drnbzrj4Qg6re465+s7ZWoLgorCivsnbTsoJwsIOyyq+uyiOynuCBDUFUg7JeQ7IScIOuRkOqwnOydmCDsk7DquLAg7Jik7Y2866CI7J207IWY7J2EIOunjOuTnOuKlOuNsCwg7ZW064u5IENQVSDsnZgg7LqQ7Iuc7JeQCivsmpTssq3rkJwg7Iic7ISc66GcIOyYpO2NvOugiOydtOyFmOydtCDrj4Tri6zrkKjsnYQg67O07J6l7ZWY6riwIOychO2VtCDrkZAg7Jik7Y2866CI7J207IWYIOyCrOydtOyXkCDsk7DquLAKK+uwsOumrOyWtOulvCDsgqzsmqntlZjripQg7IOB7Zmp7J2EIOyDgeyDge2VtCDrtIXsi5zri6Q6CisKKwlDUFUgMQkJQ1BVIDIJCUNPTU1FTlQKKwk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkJCQl1ID09IDAsIHYgPT0gMSBhbmQgcCA9PSAmdSwgcSA9PSAmdQorCXYgPSAyOworCXNtcF93bWIoKTsJCQl2IOydmCDrs4Dqsr3snbQgcCDsnZgg67OA6rK9IOyghOyXkCDrs7Tsnbwg6rKD7J2ECisJCQkJCSDrtoTrqoXtnogg7ZWoCisJPEE6bW9kaWZ5IHY9Mj4JCQl2IOuKlCDsnbTsoJwg7LqQ7IucIEEg7JeQIOuPheygkOyggeycvOuhnCDsobTsnqztlagKKwlwID0gJnY7CisJPEI6bW9kaWZ5IHA9JnY+CQkJcCDripQg7J207KCcIOy6kOyLnCBCIOyXkCDrj4XsoJDsoIHsnLzroZwg7KG07J6s7ZWoCisKK+yXrOq4sOyEnOydmCDsk7DquLAg66mU66qo66asIOuwsOumrOyWtOuKlCBDUFUgMSDsnZgg7LqQ7Iuc6rCAIOyYrOuwlOuluCDsiJzshJzroZwg7JeF642w7J207Yq4IOuQnCDqsoPsnLzroZwKK+yLnOyKpO2FnOydmCDri6TrpbggQ1BVIOuTpOydtCDsnbjsp4DtlZjqsowg66eM65Ot64uI64ukLiAg7ZWY7KeA66eMLCDsnbTsoJwg65GQ67KI7Ke4IENQVSDqsIAg6re4IOqwkuuTpOydhAor7J297Jy866CkIO2VmOuKlCDsg4HtmansnYQg7IOd6rCB7ZW0IOu0heyLnOuLpDoKKworCUNQVSAxCQlDUFUgMgkJQ09NTUVOVAorCT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLi4uCisJCQlxID0gcDsKKwkJCXggPSAqcTsKKwor7JyE7J2YIOuRkOqwnOydmCDsnb3quLAg7Jik7Y2866CI7J207IWY7J2AIOyYiOyDgeuQnCDsiJzshJzroZwg7J287Ja064KY7KeAIOuqu+2VoCDsiJgg7J6I64qU642wLCDrkZDrsojsp7ggQ1BVCivsnZgg7ZWcIOy6kOyLnOyXkCDri6Trpbgg7LqQ7IucIOydtOuypO2KuOqwgCDrsJzsg53tlbQgdiDrpbwg64u06rOgIOyeiOuKlCDsupDsi5zrnbzsnbjsnZgg7ZW064u5IOy6kOyLnOyXkOydmAor7JeF642w7J207Yq46rCAIOyngOyXsOuQmOuKlCDsgqzsnbQsIHAg66W8IOuLtOqzoCDsnojripQg7LqQ7Iuc65287J247J2AIOuRkOuyiOynuCBDUFUg7J2YIOuLpOuluCDsupDsi5zsl5AKK+yXheuNsOydtO2KuCDrkJjslrTrsoTroLjsnYQg7IiYIOyeiOq4sCDrlYzrrLjsnoXri4jri6QuCisKKwlDUFUgMQkJQ1BVIDIJCUNPTU1FTlQKKwk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkJCQl1ID09IDAsIHYgPT0gMSBhbmQgcCA9PSAmdSwgcSA9PSAmdQorCXYgPSAyOworCXNtcF93bWIoKTsKKwk8QTptb2RpZnkgdj0yPgk8QzpidXN5PgorCQkJPEM6cXVldWUgdj0yPgorCXAgPSAmdjsJCXEgPSBwOworCQkJPEQ6cmVxdWVzdCBwPgorCTxCOm1vZGlmeSBwPSZ2Pgk8RDpjb21taXQgcD0mdj4KKwkJCTxEOnJlYWQgcD4KKwkJCXggPSAqcTsKKwkJCTxDOnJlYWQgKnE+Cey6kOyLnOyXkCDsl4XrjbDsnbTtirgg65CY6riwIOyghOydmCB2IOulvCDsnb3snYwKKwkJCTxDOnVuYnVzeT4KKwkJCTxDOmNvbW1pdCB2PTI+CisKK+q4sOuzuOyggeycvOuhnCwg65GQ6rCc7J2YIOy6kOyLnOudvOyduCDrqqjrkZAgQ1BVIDIg7JeQIOy1nOyiheyggeycvOuhnOuKlCDsl4XrjbDsnbTtirgg65CgIOqyg+ydtOyngOunjCwKK+uzhOuPhOydmCDqsJzsnoUg7JeG7J2064qULCDsl4XrjbDsnbTtirjsnZgg7Iic7ISc6rCAIENQVSAxIOyXkOyEnCDrp4zrk6TslrTsp4Qg7Iic7ISc7JmAIOuPmeydvO2VoAor6rKD7J20652864qUIOuztOyepeydtCDsl4bsirXri4jri6QuCisKKwor7Jes6riw7JeQIOqwnOyehe2VmOq4sCDsnITtlbTshKAsIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja064KYIOydveq4sCDrsLDrpqzslrTrpbwg66Gc65OcIOyYpO2NvOugiOydtOyFmOuTpAor7IKs7J207JeQIOuEo+yWtOyVvCDtlanri4jri6QuICDsnbTroIfqsowg7ZWo7Jy866Gc7I2oIOy6kOyLnOqwgCDri6TsnYwg7JqU7LKt7J2EIOyymOumrO2VmOq4sCDsoITsl5Ag7J286rSA7ISxCivtgZDrpbwg7LKY66as7ZWY64+E66GdIOqwleygnO2VmOqyjCDrkKnri4jri6QuCisKKwlDUFUgMQkJQ1BVIDIJCUNPTU1FTlQKKwk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkJCQl1ID09IDAsIHYgPT0gMSBhbmQgcCA9PSAmdSwgcSA9PSAmdQorCXYgPSAyOworCXNtcF93bWIoKTsKKwk8QTptb2RpZnkgdj0yPgk8QzpidXN5PgorCQkJPEM6cXVldWUgdj0yPgorCXAgPSAmdjsJCXEgPSBwOworCQkJPEQ6cmVxdWVzdCBwPgorCTxCOm1vZGlmeSBwPSZ2Pgk8RDpjb21taXQgcD0mdj4KKwkJCTxEOnJlYWQgcD4KKwkJCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpCisJCQk8Qzp1bmJ1c3k+CisJCQk8Qzpjb21taXQgdj0yPgorCQkJeCA9ICpxOworCQkJPEM6cmVhZCAqcT4J7LqQ7Iuc7JeQIOyXheuNsOydtO2KuCDrkJwgdiDrpbwg7J297J2MCisKKwor7J2065+wIOu2gOulmOydmCDrrLjsoJzripQgREVDIEFscGhhIOqzhOyXtCDtlITroZzshLjshJzrk6Tsl5DshJwg67Cc6rKs65CgIOyImCDsnojripTrjbAsIOydtOuTpOydgAor642w7J207YSwIOuyhOyKpOulvCDsooAg642UIOyemCDsgqzsmqntlbQg7ISx64ql7J2EIOqwnOyEoO2VoCDsiJgg7J6I64qULCDrtoTtlaDrkJwg7LqQ7Iuc66W8IOqwgOyngOqzoCDsnojquLAKK+uVjOusuOyeheuLiOuLpC4gIOuMgOu2gOu2hOydmCBDUFUg64qUIO2VmOuCmOydmCDsnb3quLAg7Jik7Y2866CI7J207IWY7J2YIOuplOuqqOumrCDslaHshLjsiqTqsIAg64uk66W4IOydveq4sAor7Jik7Y2866CI7J207IWY7JeQIOydmOyhtOyggeydtOudvOuptCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOulvCDrgrTtj6zsi5ztgrXri4jri6Trp4wsIOuqqOuRkOqwgCDqt7jrn7DqsbQKK+yVhOuLiOq4sCDrlYzrrLjsl5Ag7J207KCQ7JeQIOydmOyhtO2VtOyEoCDslYjrkKnri4jri6QuCisKK+uLpOuluCBDUFUg65Ok64+EIOu2hO2VoOuQnCDsupDsi5zrpbwg6rCA7KeA6rOgIOyeiOydhCDsiJgg7J6I7KeA66eMLCDqt7jrn7AgQ1BVIOuTpOydgCDtj4nrspTtlZwg66mU66qo66asCivslaHshLjsiqTrpbwg7JyE7ZW07ISc64+EIOydtCDrtoTtlaDrkJwg7LqQ7Iuc65OkIOyCrOydtOydmCDsobDsoJXsnYQg7ZW07JW866eMIO2VqeuLiOuLpC4gIEFscGhhIOuKlCDqsIDsnqUKK+yVve2VnCDrqZTrqqjrpqwg7Iic7IScIOyLnOunqO2LsSAoc2VtYW50aWMpIOydhCDshKDtg53tlajsnLzroZzsjagg66mU66qo66asIOuwsOumrOyWtOqwgCDrqoXsi5zsoIHsnLzroZwKK+yCrOyaqeuQmOyngCDslYrslZjsnYQg65WM7JeQ64qUIOq3uOufsCDsobDsoJXsnbQg7ZWE7JqU7ZWY7KeAIOyViuqyjCDtlojsirXri4jri6QuCisKKwor7LqQ7IucIOydvOq0gOyEsSBWUyBETUEKKy0tLS0tLS0tLS0tLS0tLS0tLQorCivrqqjrk6Ag7Iuc7Iqk7YWc7J20IERNQSDrpbwg7ZWY64qUIOuUlOuwlOydtOyKpOyXkCDrjIDtlbTshJzquYzsp4Ag7LqQ7IucIOydvOq0gOyEseydhCDsnKDsp4DtlZjsp4DripQKK+yViuyKteuLiOuLpC4gIOq3uOufsCDqsr3smrAsIERNQSDrpbwg7Iuc64+E7ZWY64qUIOuUlOuwlOydtOyKpOuKlCBSQU0g7Jy866Gc67aA7YSwIOyemOuqu+uQnCDrjbDsnbTthLDrpbwKK+ydveydhCDsiJgg7J6I64qU642wLCDrjZTti7Ag7LqQ7IucIOudvOyduOydtCBDUFUg7J2YIOy6kOyLnOyXkCDrqLjrrLTrpbTqs6Ag7J6I6rOgLCDrsJTrgJAg6rCS7J20IOyVhOyngQorUkFNIOyXkCDsjajsp4Dsp4Ag7JWK7JWY7J2EIOyImCDsnojquLAg65WM66y47J6F64uI64ukLiAg7J20IOusuOygnOulvCDtlbTqsrDtlZjquLAg7JyE7ZW07ISgLCDsu6TrhJDsnZgKK+yggeygiO2VnCDrtoDrtoTsl5DshJwg6rCBIENQVSDsupDsi5zsnZgg66y47KCc65CY64qUIOu5hO2KuOuTpOydhCDtlIzrn6zsi5wgKGZsdXNoKSDsi5zsvJzslbzrp4wg7ZWp64uI64ukCiso6re466as6rOgIOq3uOqyg+uTpOydhCDrrLTtmqjtmZQgLSBpbnZhbGlkYXRpb24gLSDsi5ztgqwg7IiY64+EIOyeiOqyoOyjoCkuCisKK+uYkO2VnCwg65SU67CU7J207Iqk7JeQIOydmO2VtCBSQU0g7JeQIERNQSDroZwg7JOw7Jes7KeEIOqwkuydgCDrlJTrsJTsnbTsiqTqsIAg7JOw6riw66W8IOyZhOujjO2VnCDtm4Tsl5AKK0NQVSDsnZgg7LqQ7Iuc7JeQ7IScIFJBTSDsnLzroZwg7JOw7Jes7KeA64qUIOuNlO2LsCDsupDsi5wg65287J247JeQIOydmO2VtCDrja7slrTsjajsp4gg7IiY64+EIOyeiOqzoCwgQ1BVCivsnZgg7LqQ7Iuc7JeQIOyhtOyerO2VmOuKlCDsupDsi5wg65287J247J20IO2VtOuLuSDsupDsi5zsl5DshJwg7IKt7KCc65CY6rOgIOuLpOyLnCDqsJLsnYQg7J297Ja065Ok7J206riwCivsoITquYzsp4DripQgUkFNIOydtCDsl4XrjbDsnbTtirgg65CY7JeI64uk64qUIOyCrOyLpCDsnpDssrTqsIAg7Iio6rKo7KC4IOuyhOumtCDsiJjrj4Qg7J6I7Iq164uI64ukLiAg7J20CivrrLjsoJzrpbwg7ZW06rKw7ZWY6riwIOychO2VtOyEoCwg7Luk64SQ7J2YIOyggeygiO2VnCDrtoDrtoTsl5DshJwg6rCBIENQVSDsnZgg7LqQ7IucIOyViOydmCDrrLjsoJzqsIAg65CY64qUCivruYTtirjrk6TsnYQg66y07Zqo7ZmUIOyLnOy8nOyVvCDtlanri4jri6QuCisKK+y6kOyLnCDqtIDrpqzsl5Ag64yA7ZWcIOuNlCDrp47snYAg7KCV67O066W8IOychO2VtOyEoCBEb2N1bWVudGF0aW9uL2NhY2hldGxiLnR4dCDrpbwKK+ywuOqzoO2VmOyEuOyalC4KKworCivsupDsi5wg7J286rSA7ISxIFZTIE1NSU8KKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworTWVtb3J5IG1hcHBlZCBJL08g64qUIOydvOuwmOyggeycvOuhnCBDUFUg7J2YIOuplOuqqOumrCDqs7XqsIQg64K07J2YIO2VnCDsnIjrj4TsmrDsnZgg7Yq57KCVIOu2gOu2hAor64K07J2YIOuplOuqqOumrCDsp4Dsl63sl5Ag7J2066Oo7Ja07KeA64qU642wLCDsnbQg7JyI64+E7Jqw64qUIOydvOuwmOyggeyduCwgUkFNIOycvOuhnCDtlqXtlZjripQKK+yciOuPhOyasOyZgOuKlCDri6Trpbgg7Yq57ISx7J2EIOqwluyKteuLiOuLpC4KKwor6re465+wIO2KueyEsSDqsIDsmrTrjbAg7ZWY64KY64qULCDsnbzrsJjsoIHsnLzroZwg6re465+wIOyVoeyEuOyKpOuKlCDsupDsi5zrpbwg7JmE7KCE7Z6IIOyasO2ajO2VmOqzoAor65SU67CU7J207IqkIOuyhOyKpOuhnCDqs6frsJTroZwg7Zal7ZWc64uk64qUIOqyg+yeheuLiOuLpC4gIOydtCDrp5DsnYAgTU1JTyDslaHshLjsiqTripQg66i87KCACivsi5zsnpHrkJjslrTshJwg7LqQ7Iuc7JeQ7IScIOyZhOujjOuQnCDrqZTrqqjrpqwg7JWh7IS47Iqk66W8IOy2lOyblO2VoCDsiJgg7J6I64uk64qUIOucu+yeheuLiOuLpC4gIOydtOufsAor6rK97Jqw7JeUIOuplOuqqOumrCDrsLDrpqzslrTrp4zsnLzroZzripQg7Lap67aE7LmYIOyViuqzoCwg66eM7JW9IOy6kOyLnOuQnCDrqZTrqqjrpqwg7JOw6riwIOyYpO2NvOugiOydtOyFmOqzvAorTU1JTyDslaHshLjsiqTqsIAg7Ja065akIOuwqeyLneycvOuhnOuToCDsnZjsobTsoIHsnbTrnbzrqbQg7ZW064u5IOy6kOyLnOuKlCDrkZAg7Jik7Y2866CI7J207IWYIOyCrOydtOyXkAor67mE7JuM7KC4KGZsdXNoKeyVvOunjCDtlanri4jri6QuCisKKworPT09PT09PT09PT09PT09PT09PT09PQorQ1BVIOuTpOydtCDsoIDsp4DrpbTripQg7J2865OkCis9PT09PT09PT09PT09PT09PT09PT09CisKK+2UhOuhnOq3uOuemOuouOuKlCBDUFUg6rCAIOuplOuqqOumrCDsmKTtjbzroIjsnbTshZjrk6TsnYQg7KCV7ZmV7Z6IIOyalOyyre2VnOuMgOuhnCDsiJjtlontlbQg7KSEIOqyg+ydtOudvOqzoAor7IOd6rCB7ZWY64qU642wLCDsmIjrpbwg65Ok7Ja0IOuLpOydjOqzvCDqsJnsnYAg7L2U65Oc66W8IENQVSDsl5Dqsowg64SY6ri064uk66m0OgorCisJYSA9IFJFQURfT05DRSgqQSk7CisJV1JJVEVfT05DRSgqQiwgYik7CisJYyA9IFJFQURfT05DRSgqQyk7CisJZCA9IFJFQURfT05DRSgqRCk7CisJV1JJVEVfT05DRSgqRSwgZSk7CisKK0NQVSDripQg64uk7J2MIOyduOyKpO2KuOufreyFmOydhCDsspjrpqztlZjquLAg7KCE7JeQIO2YhOyerOydmCDsnbjsiqTtirjrn63shZjsnYQg7JyE7ZWcIOuplOuqqOumrAor7Jik7Y2866CI7J207IWY7J2EIOyZhOujjO2VoCDqsoPsnbTrnbwg7IOd6rCB7ZWY6rOgLCDrlLDrnbzshJwg7Iuc7Iqk7YWcIOyZuOu2gOyXkOyEnCDqtIDssLDtlZjquLDsl5Drj4Qg7KCV7ZW07KeECivsiJzshJzrjIDroZwg7Jik7Y2866CI7J207IWY7J20IOyImO2WieuQoCDqsoPsnLzroZwg7JiI7IOB7ZWp64uI64ukOgorCisJTE9BRCAqQSwgU1RPUkUgKkIsIExPQUQgKkMsIExPQUQgKkQsIFNUT1JFICpFLgorCisKK+uLueyXsO2VmOyngOunjCwg7Iuk7KCc66Gc64qUIO2bqOyUrCDsl4nrp53snoXri4jri6QuICDrp47snYAgQ1BVIOyZgCDsu7TtjIzsnbzrn6zsl5DshJwg7JWe7J2YIOqwgOygleydgAor7ISx66a97ZWY7KeAIOuqu+2VmOuKlOuNsCDqt7gg7J207Jyg64qUIOuLpOydjOqzvCDqsJnsirXri4jri6Q6CisKKyAoKikg66Gc65OcIOyYpO2NvOugiOydtOyFmOuTpOydgCDsi6TtlonsnYQg6rOE7IaNIO2VtOuCmOqwgOq4sCDsnITtlbQg6rOn67CU66GcIOyZhOujjOuQoCDtlYTsmpTqsIAg7J6I64qUCisgICAgIOqyveyasOqwgCDrp47snYAg67CY66m0LCDsiqTthqDslrQg7Jik7Y2866CI7J207IWY65Ok7J2AIOyiheyihSDrs4Tri6Trpbgg66y47KCcIOyXhuydtCDsnKDsmIjrkKAg7IiYCisgICAgIOyeiOyKteuLiOuLpDsKKworICgqKSDroZzrk5wg7Jik7Y2866CI7J207IWY65Ok7J2AIOyYiOy4oeyggeycvOuhnCDsiJjtlonrkKAg7IiYIOyeiOycvOupsCwg7ZWE7JqU7JeG64qUIOuhnOuTnOyYgOuLpOqzoAorICAgICDspp3rqoXrkJwg7JiI7Lih7KCBIOuhnOuTnOydmCDqsrDqs7zripQg67KE66Ck7KeR64uI64ukOworCisgKCopIOuhnOuTnCDsmKTtjbzroIjsnbTshZjrk6TsnYAg7JiI7Lih7KCB7Jy866GcIOyImO2WieuQoCDsiJgg7J6I7Jy866+A66GcLCDsmIjsg4HrkJwg7J2067Kk7Yq47J2YCisgICAgIOyLnO2AgOyKpOyZgCDri6Trpbgg7Iuc6rCE7JeQIOuhnOuTnOqwgCDsnbTrpITsp4gg7IiYIOyeiOyKteuLiOuLpDsKKworICgqKSDrqZTrqqjrpqwg7JWh7IS47IqkIOyInOyEnOuKlCBDUFUg67KE7Iqk7JmAIOy6kOyLnOulvCDsooAg642UIOyemCDsgqzsmqntlaAg7IiYIOyeiOuPhOuhnSDsnqzrsLDsuZgKKyAgICAg65CgIOyImCDsnojsirXri4jri6Q7CisKKyAoKikg66Gc65Oc7JmAIOyKpO2GoOyWtOuKlCDsnbjsoJHtlZwg7JyE7LmY7JeQ7J2YIOyVoeyEuOyKpOuTpOydhCDsnbzqtITsoIHsnLzroZwg7LKY66as7ZWgIOyImCDsnojripQKKyAgICAg66mU66qo66as64KYIEkvTyDtlZjrk5zsm6jslrQgKOuplOuqqOumrOyZgCBQQ0kg65SU67CU7J207IqkIOuRmCDri6Qg7J206rKMIOqwgOuKpe2VoCDsiJgKKyAgICAg7J6I7Iq164uI64ukKSDsl5Ag64yA7ZW0IOyalOyyreuQmOuKlCDqsr3smrAsIOqwnOuzhCDsmKTtjbzroIjsnbTshZjsnYQg7JyE7ZWcIO2KuOuenOyereyFmCDshKTsoJUKKyAgICAg67mE7Jqp7J2EIOyVhOuBvOq4sCDsnITtlbQg7KGw7ZWp65CY7Ja0IOyLpO2WieuQoCDsiJgg7J6I7Iq164uI64ukOyDqt7jrpqzqs6AKKworICgqKSDtlbTri7kgQ1BVIOydmCDrjbDsnbTthLAg7LqQ7Iuc6rCAIOyInOyEnOyXkCDsmIHtlqXsnYQg64G87LmgIOyImOuPhCDsnojqs6AsIOy6kOyLnCDsnbzqtIDshLEKKyAgICAg66mU7Luk64uI7KaY7J20IC0g7Iqk7Yag7Ja06rCAIOyLpOygnOuhnCDsupDsi5zsl5Ag64+E64us7ZWc64uk66m0IC0g7J20IOusuOygnOulvCDsmYTtmZTsi5ztgqwg7IiY64qUCisgICAgIOyeiOyngOunjCDsnbQg7J286rSA7ISxIOq0gOumrOqwgCDri6TrpbggQ1BVIOuTpOyXkOuPhCDqsJnsnYAg7Iic7ISc66GcIOyghOuLrOuQnOuLpOuKlCDrs7TsnqXsnYAKKyAgICAg7JeG7Iq164uI64ukLgorCivrlLDrnbzshJwsIOyVnuydmCDsvZTrk5zsl5Ag64yA7ZW0IOuLpOuluCBDUFUg6rCAIOuztOuKlCDqsrDqs7zripQg64uk7J2M6rO8IOqwmeydhCDsiJgg7J6I7Iq164uI64ukOgorCisJTE9BRCAqQSwgLi4uLCBMT0FEIHsqQywqRH0sIFNUT1JFICpFLCBTVE9SRSAqQgorCisJKCJMT0FEIHsqQywqRH0iIOuKlCDsobDtlanrkJwg66Gc65Oc7J6F64uI64ukKQorCisKK+2VmOyngOunjCwgQ1BVIOuKlCDsiqTsiqTroZzripQg7J286rSA7KCB7J28IOqyg+ydhCDrs7TsnqXtlanri4jri6Q6IENQVSBf7J6Q7IugXyDsnZgg7JWh7IS47Iqk65Ok7J2ACivsnpDsi6Dsl5DqsozripQg66mU66qo66asIOuwsOumrOyWtOqwgCDsl4bsnYzsl5Drj4Qg67aI6rWs7ZWY6rOgIOygle2Zle2eiCDsiJzshJwg7IS47JuM7KeEIOqyg+ycvOuhnCDrs7Tsl6zsp4gKK+qyg+yeheuLiOuLpC4gIOyYiOulvCDrk6TslrQg64uk7J2M7J2YIOy9lOuTnOqwgCDso7zslrTsoYzri6TrqbQ6CisKKwlVID0gUkVBRF9PTkNFKCpBKTsKKwlXUklURV9PTkNFKCpBLCBWKTsKKwlXUklURV9PTkNFKCpBLCBXKTsKKwlYID0gUkVBRF9PTkNFKCpBKTsKKwlXUklURV9PTkNFKCpBLCBZKTsKKwlaID0gUkVBRF9PTkNFKCpBKTsKKwor6re466as6rOgIOyZuOu2gOydmCDsmIHtlqXsl5Ag7J2Y7ZWcIOqwhOyEreydtCDsl4bri6Tqs6Ag6rCA7KCV7ZWY66m0LCDstZzsooUg6rKw6rO864qUIOuLpOydjOqzvCDqsJnsnbQKK+uCmO2DgOuCoCDqsoPsnbTrnbzqs6Ag7JiI7IOB65CgIOyImCDsnojsirXri4jri6Q6CisKKwlVID09ICpBIOydmCDstZzstIgg6rCSCisJWCA9PSBXCisJWiA9PSBZCisJKkEgPT0gWQorCivslZ7snZgg7L2U65Oc64qUIENQVSDqsIAg64uk7J2M7J2YIOuplOuqqOumrCDslaHshLjsiqQg7Iuc7YCA7Iqk66W8IOunjOuTpOuPhOuhnSDtlaDqsoHri4jri6Q6CisKKwlVPUxPQUQgKkEsIFNUT1JFICpBPVYsIFNUT1JFICpBPVcsIFg9TE9BRCAqQSwgU1RPUkUgKkE9WSwgWj1MT0FEICpBCisKK+2VmOyngOunjCwg67OE64uk66W4IOqwnOyeheydtCDsl4bqs6Ag7ZSE66Gc6re4656o7J2YIOyLnOyVvOyXkCDsnbQg7IS47IOB7J20IOyXrOyghO2eiCDsnbzqtIDsoIHsnbTrnbzqs6AKK+uztOyduOuLpOuKlCDrs7TsnqXrp4wg7KeA7Lyc7KeE64uk66m0IOydtCDsi5ztgIDsiqTripQg7Ja065akIOyhsO2VqeycvOuhnOuToCDsnqzqtazshLHrkKAg7IiYIOyeiOycvOupsCwg6rCBCivslaHshLjsiqTrk6TsnYAg7ZWp7LOQ7KeA6rGw64KYIOuyhOugpOyniCDsiJgg7J6I7Iq164uI64ukLiAg7J2867aAIOyVhO2CpO2FjeyzkOyXkOyEnCBDUFUg64qUIOqwmeydgCDsnITsuZjsl5AKK+uMgO2VnCDsl7Dsho3soIHsnbgg66Gc65OcIOyYpO2NvOugiOydtOyFmOuTpOydhCDsnqzrsLDsuZgg7ZWgIOyImCDsnojquLAg65WM66y47JeQIOyVnuydmCDsmIjsl5DshJzsnZgKK1JFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkg64qUIOuwmOuTnOyLnCDsobTsnqztlbTslbwg7ZWo7J2EIOyVjOyVhOuRkOyEuOyalC4gIOq3uOufsCDsooXrpZjsnZgKK+yVhO2CpO2FjeyzkOyXkOyEnCBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOuKlCDsnbQg66y47KCc66W8IOunieq4sCDsnITtlbQg7ZWE7JqU7ZWcIOydvOydhAor662Q6rCAIOuQkOuToOyngCDtlZjqsowg65CY64qU642wLCDsmIjrpbwg65Ok7Ja0IEl0YW5pdW0g7JeQ7ISc64qUIFJFQURfT05DRSgpIOyZgCBXUklURV9PTkNFKCkKK+qwgCDsgqzsmqntlZjripQgdm9sYXRpbGUg7LqQ7Iqk7YyF7J2AIEdDQyDqsIAg6re465+wIOyerOuwsOy5mOulvCDrsKnsp4DtlZjripQg7Yq57IiYIOyduOyKpO2KuOufreyFmOyduAorbGQuYWNxIOyZgCBzdGwucmVsIOyduOyKpO2KuOufreyFmOydhCDqsIHqsIEg66eM65Ok7Ja0IOuCtOuPhOuhnSDtlanri4jri6QuCisKK+y7tO2MjOydvOufrCDsl63si5wg7J20IOyLnO2AgOyKpOydmCDslaHshLjsiqTrk6TsnYQgQ1BVIOqwgCDrs7TquLDrj4Qg7KCE7JeQIO2Vqey5mOqxsOuCmCDrsoTrpqzqsbDrgpgg65Kk66GcCivrr7jrpITrsoTrprQg7IiYIOyeiOyKteuLiOuLpC4KKwor7JiI66W8IOuTpOyWtDoKKworCSpBID0gVjsKKwkqQSA9IFc7CisKK+uKlCDri6TsnYzqs7wg6rCZ7J20IOuzgO2YleuQoCDsiJgg7J6I7Iq164uI64ukOgorCisJKkEgPSBXOworCivrlLDrnbzshJwsIOyTsOq4sCDrsLDrpqzslrTrgpggV1JJVEVfT05DRSgpIOqwgCDsl4bri6TrqbQgKkEg66Gc7J2YIFYg6rCS7J2YIOyggOyepeydmCDtmqjqs7zripQKK+yCrOudvOynhOuLpOqzoCDqsIDsoJXrkKAg7IiYIOyeiOyKteuLiOuLpC4gIOu5hOyKt+2VmOqyjDoKKworCSpBID0gWTsKKwlaID0gKkE7CisKK+uKlCwg66mU66qo66asIOuwsOumrOyWtOuCmCBSRUFEX09OQ0UoKSDsmYAgV1JJVEVfT05DRSgpIOyXhuydtOuKlCDri6TsnYzqs7wg6rCZ7J20IOuzgO2YleuQoCDsiJgKK+yeiOyKteuLiOuLpDoKKworCSpBID0gWTsKKwlaID0gWTsKKwor6re466as6rOgIOydtCBMT0FEIOyYpO2NvOugiOydtOyFmOydgCBDUFUg67CU6rml7JeQ64qUIOyVhOyYiCDrs7TsnbTsp4Ag7JWK7Iq164uI64ukLgorCisKK+q3uOumrOqzoCwgQUxQSEEg6rCAIOyeiOuLpAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RFQyBBbHBoYSBDUFUg64qUIOqwgOyepSDsmYTtmZTrkJwg66mU66qo66asIOyInOyEnOydmCBDUFUg7KSRIO2VmOuCmOyeheuLiOuLpC4gIOu/kOunjCDslYTri4jrnbwsCitBbHBoYSBDUFUg7J2YIOydvOu2gCDrsoTsoITsnYAg67aE7ZWg65CcIOuNsOydtO2EsCDsupDsi5zrpbwg6rCA7KeA6rOgIOyeiOyWtOyEnCwg7J2Y66+47KCB7Jy866GcCivqtIDqs4TrkJjslrQg7J6I64qUIOuRkOqwnOydmCDsupDsi5wg65287J247J20IOyEnOuhnCDri6Trpbgg7Iuc6rCE7JeQIOyXheuNsOydtO2KuCDrkJjripTqsowg6rCA64ql7ZWp64uI64ukLgor7J206rKMIOuNsOydtO2EsCDsnZjsobTshLEg67Cw66as7Ja06rCAIOygleunkCDtlYTsmpTtlbTsp4DripQg67aA67aE7J24642wLCDrjbDsnbTthLAg7J2Y7KG07ISxIOuwsOumrOyWtOuKlAor66mU66qo66asIOydvOq0gOyEsSDsi5zsiqTthZzqs7wg7ZWo6ruYIOuRkOqwnOydmCDsupDsi5zrpbwg64+Z6riw7ZmUIOyLnOy8nOyEnCwg7Y+s7J247YSwIOuzgOqyveqzvCDsg4jroZzsmrQKK+uNsOydtO2EsOydmCDrsJzqsqzsnYQg7Jis67CU66W4IOyInOyEnOuhnCDsnbzslrTrgpjqsowg7ZWY6riwIOuVjOusuOyeheuLiOuLpC4KKwor66as64iF7IqkIOy7pOuEkOydmCDrqZTrqqjrpqwg67Cw66as7Ja0IOuqqOuNuOydgCBBbHBoYSDsl5Ag6riw7LSI7ZW07IScIOygleydmOuQmOyXiOyKteuLiOuLpC4KKwor7JyE7J2YICLsupDsi5wg7J286rSA7ISxIiDshJzruIzshLnshZjsnYQg7LC46rOg7ZWY7IS47JqULgorCisKK+qwgOyDgSDrqLjsi6Ag6rKM7Iqk7Yq4CistLS0tLS0tLS0tLS0tLS0tCisKK+qwgOyDgSDrqLjsi6Dsl5DshJwg64+Z7J6R7ZWY64qUIOqyjOyKpO2KuOuTpOydgCDqsozsiqTtirgg7J6Q7LK064qUIFNNUCDsp4Dsm5Ag7JeG7J20IOy7tO2MjOydvCDrkJjsl4jri6QKK+2VtOuPhCBTTVAg7JiB7Zal7J2EIOuwm+ydhCDsiJgg7J6I7Iq164uI64ukLiAg7J206rG0IFVQIOy7pOuEkOydhCDsgqzsmqntlZjrqbTshJwgU01QIO2YuOyKpO2KuOyZgAor6rKw67aA65CY7Ja0IOuwnOyDne2VmOuKlCDrtoDsnpHsmqnsnoXri4jri6QuICDsnbQg6rK97Jqw7JeQ64qUIG1hbmRhdG9yeSDrsLDrpqzslrTrpbwg7IKs7Jqp7ZW07IScIOusuOygnOulvAor7ZW06rKw7ZWgIOyImCDsnojqsqDsp4Drp4wg6re465+wIO2VtOqysOydgCDrjIDrtoDrtoTsnZgg6rK97JqwIOy1nOyggeydmCDtlbTqsrDssYXsnbQg7JWE64uZ64uI64ukLgorCivsnbQg66y47KCc66W8IOyZhOuyve2VmOqyjCDtlbTqsrDtlZjquLAg7JyE7ZW0LCDroZzsmrAg66CI67Ko7J2YIHZpcnRfbWIoKSDrk7HsnZgg66ek7YGs66Gc66W8IOyCrOyaqe2VoCDsiJgKK+yeiOyKteuLiOuLpC4g7J206rKD65Ok7J2AIFNNUCDqsIAg7Zmc7ISx7ZmUIOuQmOyWtCDsnojri6TrqbQgc21wX21iKCkg65Ox6rO8IOuPmeydvO2VnCDtmqjqs7zrpbwKK+qwluyKteuLiOuLpOunjCwgU01QIOyZgCBTTVAg7JWE64uMIOyLnOyKpO2FnCDrqqjrkZDsl5Ag64yA7ZW0IOuPmeydvO2VnCDsvZTrk5zrpbwg66eM65Ok7Ja064OF64uI64ukLgor7JiI66W8IOuTpOyWtCwg6rCA7IOBIOuouOyLoCDqsozsiqTtirjrk6TsnYAgKFNNUCDsnbwg7IiYIOyeiOuKlCkg7Zi47Iqk7Yq47JmAIOuPmeq4sO2ZlOulvCDtlaAg65WM7JeQ64qUCitzbXBfbWIoKSDqsIAg7JWE64uI6528IHZpcnRfbWIoKSDrpbwg7IKs7Jqp7ZW07JW8IO2VqeuLiOuLpC4KKwor7J206rKD65Ok7J2AIHNtcF9tYigpIOulmOydmCDqsoPrk6Tqs7wg66qo65OgIOu2gOu2hOyXkOyEnCDrj5nsnbztlZjrqbAsIO2Kue2eiCwgTU1JTyDsnZgg7JiB7Zal7JeQCivrjIDtlbTshJzripQg6rCE7Jes7ZWY7KeAIOyViuyKteuLiOuLpDogTU1JTyDsnZgg7JiB7Zal7J2EIOygnOyWtO2VmOugpOuptCwgbWFuZGF0b3J5IOuwsOumrOyWtOulvAor7IKs7Jqp7ZWY7Iuc6riwIOuwlOuejeuLiOuLpC4KKworCis9PT09PT09Civsgqzsmqkg7JiICis9PT09PT09CisKK+yInO2ZmOyLnSDrsoTtjbwKKy0tLS0tLS0tLS0tCisKK+uplOuqqOumrCDrsLDrpqzslrTripQg7Iic7ZmY7IudIOuyhO2NvOulvCDsg53shLHsnpAocHJvZHVjZXIp7JmAIOyGjOu5hOyekChjb25zdW1lcikg7IKs7J207J2YCivrj5nquLDtmZTsl5Ag65297J2EIOyCrOyaqe2VmOyngCDslYrqs6Ag6rWs7ZiE7ZWY64qU642w7JeQIOyCrOyaqeuQoCDsiJgg7J6I7Iq164uI64ukLiAg642UIOyekOyEuO2VnCDrgrTsmqnsnYQKK+ychO2VtOyEoCDri6TsnYzsnYQg7LC46rOg7ZWY7IS47JqUOgorCisJRG9jdW1lbnRhdGlvbi9jaXJjdWxhci1idWZmZXJzLnR4dAorCisKKz09PT09PT09PQor7LC46rOgIOusuO2XjAorPT09PT09PT09CisKK0FscGhhIEFYUCBBcmNoaXRlY3R1cmUgUmVmZXJlbmNlIE1hbnVhbCwgU2Vjb25kIEVkaXRpb24gKFNpdGVzICYgV2l0ZWssCitEaWdpdGFsIFByZXNzKQorCUNoYXB0ZXIgNS4yOiBQaHlzaWNhbCBBZGRyZXNzIFNwYWNlIENoYXJhY3RlcmlzdGljcworCUNoYXB0ZXIgNS40OiBDYWNoZXMgYW5kIFdyaXRlIEJ1ZmZlcnMKKwlDaGFwdGVyIDUuNTogRGF0YSBTaGFyaW5nCisJQ2hhcHRlciA1LjY6IFJlYWQvV3JpdGUgT3JkZXJpbmcKKworQU1ENjQgQXJjaGl0ZWN0dXJlIFByb2dyYW1tZXIncyBNYW51YWwgVm9sdW1lIDI6IFN5c3RlbSBQcm9ncmFtbWluZworCUNoYXB0ZXIgNy4xOiBNZW1vcnktQWNjZXNzIE9yZGVyaW5nCisJQ2hhcHRlciA3LjQ6IEJ1ZmZlcmluZyBhbmQgQ29tYmluaW5nIE1lbW9yeSBXcml0ZXMKKworSUEtMzIgSW50ZWwgQXJjaGl0ZWN0dXJlIFNvZnR3YXJlIERldmVsb3BlcidzIE1hbnVhbCwgVm9sdW1lIDM6CitTeXN0ZW0gUHJvZ3JhbW1pbmcgR3VpZGUKKwlDaGFwdGVyIDcuMTogTG9ja2VkIEF0b21pYyBPcGVyYXRpb25zCisJQ2hhcHRlciA3LjI6IE1lbW9yeSBPcmRlcmluZworCUNoYXB0ZXIgNy40OiBTZXJpYWxpemluZyBJbnN0cnVjdGlvbnMKKworVGhlIFNQQVJDIEFyY2hpdGVjdHVyZSBNYW51YWwsIFZlcnNpb24gOQorCUNoYXB0ZXIgODogTWVtb3J5IE1vZGVscworCUFwcGVuZGl4IEQ6IEZvcm1hbCBTcGVjaWZpY2F0aW9uIG9mIHRoZSBNZW1vcnkgTW9kZWxzCisJQXBwZW5kaXggSjogUHJvZ3JhbW1pbmcgd2l0aCB0aGUgTWVtb3J5IE1vZGVscworCitVbHRyYVNQQVJDIFByb2dyYW1tZXIgUmVmZXJlbmNlIE1hbnVhbAorCUNoYXB0ZXIgNTogTWVtb3J5IEFjY2Vzc2VzIGFuZCBDYWNoZWFiaWxpdHkKKwlDaGFwdGVyIDE1OiBTcGFyYy1WOSBNZW1vcnkgTW9kZWxzCisKK1VsdHJhU1BBUkMgSUlJIEN1IFVzZXIncyBNYW51YWwKKwlDaGFwdGVyIDk6IE1lbW9yeSBNb2RlbHMKKworVWx0cmFTUEFSQyBJSUlpIFByb2Nlc3NvciBVc2VyJ3MgTWFudWFsCisJQ2hhcHRlciA4OiBNZW1vcnkgTW9kZWxzCisKK1VsdHJhU1BBUkMgQXJjaGl0ZWN0dXJlIDIwMDUKKwlDaGFwdGVyIDk6IE1lbW9yeQorCUFwcGVuZGl4IEQ6IEZvcm1hbCBTcGVjaWZpY2F0aW9ucyBvZiB0aGUgTWVtb3J5IE1vZGVscworCitVbHRyYVNQQVJDIFQxIFN1cHBsZW1lbnQgdG8gdGhlIFVsdHJhU1BBUkMgQXJjaGl0ZWN0dXJlIDIwMDUKKwlDaGFwdGVyIDg6IE1lbW9yeSBNb2RlbHMKKwlBcHBlbmRpeCBGOiBDYWNoZXMgYW5kIENhY2hlIENvaGVyZW5jeQorCitTb2xhcmlzIEludGVybmFscywgQ29yZSBLZXJuZWwgQXJjaGl0ZWN0dXJlLCBwNjMtNjg6CisJQ2hhcHRlciAzLjM6IEhhcmR3YXJlIENvbnNpZGVyYXRpb25zIGZvciBMb2NrcyBhbmQKKwkJCVN5bmNocm9uaXphdGlvbgorCitVbml4IFN5c3RlbXMgZm9yIE1vZGVybiBBcmNoaXRlY3R1cmVzLCBTeW1tZXRyaWMgTXVsdGlwcm9jZXNzaW5nIGFuZCBDYWNoaW5nCitmb3IgS2VybmVsIFByb2dyYW1tZXJzOgorCUNoYXB0ZXIgMTM6IE90aGVyIE1lbW9yeSBNb2RlbHMKKworSW50ZWwgSXRhbml1bSBBcmNoaXRlY3R1cmUgU29mdHdhcmUgRGV2ZWxvcGVyJ3MgTWFudWFsOiBWb2x1bWUgMToKKwlTZWN0aW9uIDIuNjogU3BlY3VsYXRpb24KKwlTZWN0aW9uIDQuNDogTWVtb3J5IEFjY2VzcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dCBiL0RvY3VtZW50YXRpb24va3Byb2Jlcy50eHQKaW5kZXggMWY5YjNlMi4uMWY2ZDQ1YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rcHJvYmVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2twcm9iZXMudHh0CkBAIC0xMDMsNiArMTAzLDE2IEBACiBvciBpbiByZWdpc3RlcnMuICBUaGUganByb2JlIHdpbGwgd29yayBpbiBlaXRoZXIgY2FzZSwgc28gbG9uZyBhcyB0aGUKIGhhbmRsZXIncyBwcm90b3R5cGUgbWF0Y2hlcyB0aGF0IG9mIHRoZSBwcm9iZWQgZnVuY3Rpb24uCiAKK05vdGUgdGhhdCBpbiBzb21lIGFyY2hpdGVjdHVyZXMgKGUuZy46IGFybTY0IGFuZCBzcGFyYzY0KSB0aGUgc3RhY2sKK2NvcHkgaXMgbm90IGRvbmUsIGFzIHRoZSBhY3R1YWwgbG9jYXRpb24gb2Ygc3RhY2tlZCBwYXJhbWV0ZXJzIG1heSBiZQorb3V0c2lkZSBvZiBhIHJlYXNvbmFibGUgTUFYX1NUQUNLX1NJWkUgdmFsdWUgYW5kIGJlY2F1c2UgdGhhdCBsb2NhdGlvbgorY2Fubm90IGJlIGRldGVybWluZWQgYnkgdGhlIGpwcm9iZXMgY29kZS4gSW4gdGhpcyBjYXNlIHRoZSBqcHJvYmVzCit1c2VyIG11c3QgYmUgY2FyZWZ1bCB0byBtYWtlIGNlcnRhaW4gdGhlIGNhbGxpbmcgc2lnbmF0dXJlIG9mIHRoZQorZnVuY3Rpb24gZG9lcyBub3QgY2F1c2UgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgb24gdGhlIHN0YWNrIChlLmcuOgorbW9yZSB0aGFuIGVpZ2h0IGZ1bmN0aW9uIGFyZ3VtZW50cywgYW4gYXJndW1lbnQgb2YgbW9yZSB0aGFuIHNpeHRlZW4KK2J5dGVzLCBvciBtb3JlIHRoYW4gNjQgYnl0ZXMgb2YgYXJndW1lbnQgZGF0YSwgZGVwZW5kaW5nIG9uCithcmNoaXRlY3R1cmUpLgorCiAxLjMgUmV0dXJuIFByb2JlcwogCiAxLjMuMSBIb3cgRG9lcyBhIFJldHVybiBQcm9iZSBXb3JrPwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHMtbWx4Y3BsZC50eHQgYi9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkcy1tbHhjcGxkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGU4ZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHMtbWx4Y3BsZC50eHQKQEAgLTAsMCArMSwxMTAgQEAKK0tlcm5lbCBkcml2ZXIgZm9yIE1lbGxhbm94IHN5c3RlbXMgTEVEcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1Byb3ZpZGUgc3lzdGVtIExFRCBzdXBwb3J0IGZvciB0aGUgbmV4IE1lbGxhbm94IHN5c3RlbXM6CisibXN4NjcxMCIsICJtc3g2NzIwIiwgIm1zYjc3MDAiLCAibXNuMjcwMCIsICJtc3gxNDEwIiwKKyJtc24yNDEwIiwgIm1zYjc4MDAiLCAibXNuMjc0MCIsICJtc24yMTAwIi4KKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCitEcml2ZXIgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBMRURzIGZvciB0aGUgc3lzdGVtcyAibXN4NjcxMCIsICJtc3g2NzIwIiwKKyJtc2I3NzAwIiwgIm1zbjI3MDAiLCAibXN4MTQxMCIsICJtc24yNDEwIiwgIm1zYjc4MDAiLCAibXNuMjc0MCI6CisgIG1seGNwbGQ6ZmFuMTpncmVlbgorICBtbHhjcGxkOmZhbjE6cmVkCisgIG1seGNwbGQ6ZmFuMjpncmVlbgorICBtbHhjcGxkOmZhbjI6cmVkCisgIG1seGNwbGQ6ZmFuMzpncmVlbgorICBtbHhjcGxkOmZhbjM6cmVkCisgIG1seGNwbGQ6ZmFuNDpncmVlbgorICBtbHhjcGxkOmZhbjQ6cmVkCisgIG1seGNwbGQ6cHN1OmdyZWVuCisgIG1seGNwbGQ6cHN1OnJlZAorICBtbHhjcGxkOnN0YXR1czpncmVlbgorICBtbHhjcGxkOnN0YXR1czpyZWQKKworICJzdGF0dXMiCisgIENQTEQgcmVnIG9mZnNldDogMHgyMAorICBCaXRzIFszOjBdCisKKyAicHN1IgorICBDUExEIHJlZyBvZmZzZXQ6IDB4MjAKKyAgQml0cyBbNzo0XQorCisgImZhbjEiCisgIENQTEQgcmVnIG9mZnNldDogMHgyMQorICBCaXRzIFszOjBdCisKKyAiZmFuMiIKKyAgQ1BMRCByZWcgb2Zmc2V0OiAweDIxCisgIEJpdHMgWzc6NF0KKworICJmYW4zIgorICBDUExEIHJlZyBvZmZzZXQ6IDB4MjIKKyAgQml0cyBbMzowXQorCisgImZhbjQiCisgIENQTEQgcmVnIG9mZnNldDogMHgyMgorICBCaXRzIFs3OjRdCisKKyBDb2xvciBtYXNrIGZvciBhbGwgdGhlIGFib3ZlIExFRHM6CisgIFtiaXQzLGJpdDIsYml0MSxiaXQwXSBvcgorICBbYml0NyxiaXQ2LGJpdDUsYml0NF06CisJWzAsMCwwLDBdID0gTEVEIE9GRgorCVswLDEsMCwxXSA9IFJlZCBzdGF0aWMgT04KKwlbMSwxLDAsMV0gPSBHcmVlbiBzdGF0aWMgT04KKwlbMCwxLDEsMF0gPSBSZWQgYmxpbmsgM0h6CisJWzEsMSwxLDBdID0gR3JlZW4gYmxpbmsgM0h6CisJWzAsMSwxLDFdID0gUmVkIGJsaW5rIDZIegorCVsxLDEsMSwxXSA9IEdyZWVuIGJsaW5rIDZIegorCitEcml2ZXIgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBMRURzIGZvciB0aGUgc3lzdGVtICJtc24yMTAwIjoKKyAgbWx4Y3BsZDpmYW46Z3JlZW4KKyAgbWx4Y3BsZDpmYW46cmVkCisgIG1seGNwbGQ6cHN1MTpncmVlbgorICBtbHhjcGxkOnBzdTE6cmVkCisgIG1seGNwbGQ6cHN1MjpncmVlbgorICBtbHhjcGxkOnBzdTI6cmVkCisgIG1seGNwbGQ6c3RhdHVzOmdyZWVuCisgIG1seGNwbGQ6c3RhdHVzOnJlZAorICBtbHhjcGxkOnVpZDpibHVlCisKKyAic3RhdHVzIgorICBDUExEIHJlZyBvZmZzZXQ6IDB4MjAKKyAgQml0cyBbMzowXQorCisgImZhbiIKKyAgQ1BMRCByZWcgb2Zmc2V0OiAweDIxCisgIEJpdHMgWzM6MF0KKworICJwc3UxIgorICBDUExEIHJlZyBvZmZzZXQ6IDB4MjMKKyAgQml0cyBbMzowXQorCisgInBzdTIiCisgIENQTEQgcmVnIG9mZnNldDogMHgyMworICBCaXRzIFs3OjRdCisKKyAidWlkIgorICBDUExEIHJlZyBvZmZzZXQ6IDB4MjQKKyAgQml0cyBbMzowXQorCisgQ29sb3IgbWFzayBmb3IgYWxsIHRoZSBhYm92ZSBMRURzLCBleGNlcHRlZCB1aWQ6CisgIFtiaXQzLGJpdDIsYml0MSxiaXQwXSBvcgorICBbYml0NyxiaXQ2LGJpdDUsYml0NF06CisJWzAsMCwwLDBdID0gTEVEIE9GRgorCVswLDEsMCwxXSA9IFJlZCBzdGF0aWMgT04KKwlbMSwxLDAsMV0gPSBHcmVlbiBzdGF0aWMgT04KKwlbMCwxLDEsMF0gPSBSZWQgYmxpbmsgM0h6CisJWzEsMSwxLDBdID0gR3JlZW4gYmxpbmsgM0h6CisJWzAsMSwxLDFdID0gUmVkIGJsaW5rIDZIegorCVsxLDEsMSwxXSA9IEdyZWVuIGJsaW5rIDZIegorCisgQ29sb3IgbWFzayBmb3IgdWlkIExFRDoKKyAgW2JpdDMsYml0MixiaXQxLGJpdDBdOgorCVswLDAsMCwwXSA9IExFRCBPRkYKKwlbMSwxLDAsMV0gPSBCbHVlIHN0YXRpYyBPTgorCVsxLDEsMSwwXSA9IEJsdWUgYmxpbmsgM0h6CisJWzEsMSwxLDFdID0gQmx1ZSBibGluayA2SHoKKworRHJpdmVyIHN1cHBvcnRzIEhXIGJsaW5raW5nIGF0IDNIeiBhbmQgNkh6IGZyZXF1ZW5jeSAoNTAlIGR1dHkgY3ljbGUpLgorRm9yIDNIeiBkdXR5IGN5bGNlIGlzIGFib3V0IDE2NyBtc2VjLCBmb3IgNkh6IGlzIGFib3V0IDgzIG1zZWMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkdHJpZy1vbmVzaG90LnR4dCBiL0RvY3VtZW50YXRpb24vbGVkcy9sZWR0cmlnLW9uZXNob3QudHh0CmluZGV4IDA3Y2QxZmEuLmZlNTc0NzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGVkcy9sZWR0cmlnLW9uZXNob3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbGVkcy9sZWR0cmlnLW9uZXNob3QudHh0CkBAIC0yMSwyNCArMjEsOCBAQAogCiAgIGVjaG8gb25lc2hvdCA+IHRyaWdnZXIKIAotVGhpcyBhZGRzIHRoZSBmb2xsb3dpbmcgc3lzZnMgYXR0cmlidXRlcyB0byB0aGUgTEVEOgotCi0gIGRlbGF5X29uIC0gc3BlY2lmaWVzIGZvciBob3cgbWFueSBtaWxsaXNlY29uZHMgdGhlIExFRCBoYXMgdG8gc3RheSBhdAotICAgICAgICAgICAgIExFRF9GVUxMIGJyaWdodG5lc3MgYWZ0ZXIgaXQgaGFzIGJlZW4gYXJtZWQuCi0gICAgICAgICAgICAgRGVmYXVsdCB0byAxMDAgbXMuCi0KLSAgZGVsYXlfb2ZmIC0gc3BlY2lmaWVzIGZvciBob3cgbWFueSBtaWxsaXNlY29uZHMgdGhlIExFRCBoYXMgdG8gc3RheSBhdAotICAgICAgICAgICAgICBMRURfT0ZGIGJyaWdodG5lc3MgYWZ0ZXIgaXQgaGFzIGJlZW4gYXJtZWQuCi0gICAgICAgICAgICAgIERlZmF1bHQgdG8gMTAwIG1zLgotCi0gIGludmVydCAtIHJldmVyc2UgdGhlIGJsaW5rIGxvZ2ljLiAgSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGJsaW5rIG9uIGZvciBkZWxheV9vbgotICAgICAgICAgICBtcywgdGhlbiBibGluayBvZmYgZm9yIGRlbGF5X29mZiBtcywgbGVhdmluZyB0aGUgTEVEIG5vcm1hbGx5IG9mZi4gIElmCi0gICAgICAgICAgIHNldCB0byAxLCBibGluayBvZmYgZm9yIGRlbGF5X29mZiBtcywgdGhlbiBibGluayBvbiBmb3IgZGVsYXlfb24gbXMsCi0gICAgICAgICAgIGxlYXZpbmcgdGhlIExFRCBub3JtYWxseSBvbi4KLSAgICAgICAgICAgU2V0dGluZyB0aGlzIHZhbHVlIGFsc28gaW1tZWRpYXRlbHkgY2hhbmdlIHRoZSBMRUQgc3RhdGUuCi0KLSAgc2hvdCAtIHdyaXRlIGFueSBub24tZW1wdHkgc3RyaW5nIHRvIHNpZ25hbCBhbiBldmVudHMsIHRoaXMgc3RhcnRzIGEgYmxpbmsKLSAgICAgICAgIHNlcXVlbmNlIGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcuCitUaGlzIGFkZHMgc3lzZnMgYXR0cmlidXRlcyB0byB0aGUgTEVEIHRoYXQgYXJlIGRvY3VtZW50ZWQgaW46CitEb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZC10cmlnZ2VyLW9uZXNob3QKIAogRXhhbXBsZSB1c2UtY2FzZTogbmV0d29yayBkZXZpY2VzLCBpbml0aWFsaXphdGlvbjoKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHRyaWctdXNicG9ydC50eHQgYi9Eb2N1bWVudGF0aW9uL2xlZHMvbGVkdHJpZy11c2Jwb3J0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWY1NGJmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHRyaWctdXNicG9ydC50eHQKQEAgLTAsMCArMSw0MSBAQAorVVNCIHBvcnQgTEVEIHRyaWdnZXIKKz09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgTEVEIHRyaWdnZXIgY2FuIGJlIHVzZWQgZm9yIHNpZ25hbGxpbmcgdG8gdGhlIHVzZXIgYSBwcmVzZW5jZSBvZiBVU0IgZGV2aWNlCitpbiBhIGdpdmVuIHBvcnQuIEl0IHNpbXBseSB0dXJucyBvbiBMRUQgd2hlbiBkZXZpY2UgYXBwZWFycyBhbmQgdHVybnMgaXQgb2ZmCit3aGVuIGl0IGRpc2FwcGVhcnMuCisKK0l0IHJlcXVpcmVzIHNlbGVjdGluZyBVU0IgcG9ydHMgdGhhdCBzaG91bGQgYmUgb2JzZXJ2ZWQuIEFsbCBhdmFpbGFibGUgb25lcyBhcmUKK2xpc3RlZCBhcyBzZXBhcmF0ZWQgZW50cmllcyBpbiBhICJwb3J0cyIgc3ViZGlyZWN0b3J5LiBTZWxlY3RpbmcgaXMgaGFuZGxlZCBieQorZWNob2luZyAiMSIgdG8gYSBjaG9zZW4gcG9ydC4KKworUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHRyaWdnZXIgYWxsb3dzIHNlbGVjdGluZyBtdWx0aXBsZSBVU0IgcG9ydHMgZm9yIGEgc2luZ2xlCitMRUQuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpbiB0d28gY2FzZXM6CisKKzEpIERldmljZSB3aXRoIHNpbmdsZSBVU0IgTEVEIGFuZCBmZXcgcGh5c2ljYWwgcG9ydHMKKworSW4gc3VjaCBhIGNhc2UgTEVEIHdpbGwgYmUgdHVybmVkIG9uIGFzIGxvbmcgYXMgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNvbm5lY3RlZAorVVNCIGRldmljZS4KKworMikgRGV2aWNlIHdpdGggYSBwaHlzaWNhbCBwb3J0IGhhbmRsZWQgYnkgZmV3IGNvbnRyb2xsZXJzCisKK1NvbWUgZGV2aWNlcyBtYXkgaGF2ZSBvbmUgY29udHJvbGxlciBwZXIgUEhZIHN0YW5kYXJkLiBFLmcuIFVTQiAzLjAgcGh5c2ljYWwKK3BvcnQgbWF5IGJlIGhhbmRsZWQgYnkgb2hjaS1wbGF0Zm9ybSwgZWhjaS1wbGF0Zm9ybSBhbmQgeGhjaS1oY2QuIElmIHRoZXJlIGlzCitvbmx5IG9uZSBMRUQgdXNlciB3aWxsIG1vc3QgbGlrZWx5IHdhbnQgdG8gYXNzaWduIHBvcnRzIGZyb20gYWxsIDMgaHVicy4KKworCitUaGlzIHRyaWdnZXIgY2FuIGJlIGFjdGl2YXRlZCBmcm9tIHVzZXIgc3BhY2Ugb24gbGVkIGNsYXNzIGRldmljZXMgYXMgc2hvd24KK2JlbG93OgorCisgIGVjaG8gdXNicG9ydCA+IHRyaWdnZXIKKworVGhpcyBhZGRzIHN5c2ZzIGF0dHJpYnV0ZXMgdG8gdGhlIExFRCB0aGF0IGFyZSBkb2N1bWVudGVkIGluOgorRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQtdHJpZ2dlci11c2Jwb3J0CisKK0V4YW1wbGUgdXNlLWNhc2U6CisKKyAgZWNobyB1c2Jwb3J0ID4gdHJpZ2dlcgorICBlY2hvIDEgPiBwb3J0cy91c2IxLXBvcnQxCisgIGVjaG8gMSA+IHBvcnRzL3VzYjItcG9ydDEKKyAgY2F0IHBvcnRzL3VzYjEtcG9ydDEKKyAgZWNobyAwID4gcG9ydHMvdXNiMS1wb3J0MQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9saXZlcGF0Y2gvbW9kdWxlLWVsZi1mb3JtYXQudHh0IGIvRG9jdW1lbnRhdGlvbi9saXZlcGF0Y2gvbW9kdWxlLWVsZi1mb3JtYXQudHh0CmluZGV4IGVlZGJkY2YuLmYyMWE1MjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbGl2ZXBhdGNoL21vZHVsZS1lbGYtZm9ybWF0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2xpdmVwYXRjaC9tb2R1bGUtZWxmLWZvcm1hdC50eHQKQEAgLTI1LDcgKzI1LDggQEAKICAgICAgICAzLjMuMiBSZXF1aXJlZCBuYW1lIGZvcm1hdAogICAgICAgIDMuMy4zIEV4YW1wbGUgbGl2ZXBhdGNoIHN5bWJvbCBuYW1lcwogICAgICAgIDMuMy40IEV4YW1wbGUgYHJlYWRlbGYgLS1zeW1ib2xzYCBvdXRwdXQKLTQuIFN5bWJvbCB0YWJsZSBhbmQgRWxmIHNlY3Rpb24gYWNjZXNzCis0LiBBcmNoaXRlY3R1cmUtc3BlY2lmaWMgc2VjdGlvbnMKKzUuIFN5bWJvbCB0YWJsZSBhbmQgRWxmIHNlY3Rpb24gYWNjZXNzCiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDAuIEJhY2tncm91bmQgYW5kIG1vdGl2YXRpb24KQEAgLTQ2LDcgKzQ3LDcgQEAKIAogU2luY2UgYXBwbHlfcmVsb2NhdGVfYWRkKCkgcmVxdWlyZXMgYWNjZXNzIHRvIGEgbW9kdWxlJ3Mgc2VjdGlvbiBoZWFkZXIKIHRhYmxlLCBzeW1ib2wgdGFibGUsIGFuZCByZWxvY2F0aW9uIHNlY3Rpb24gaW5kaWNlcywgRWxmIGluZm9ybWF0aW9uIGlzCi1wcmVzZXJ2ZWQgZm9yIGxpdmVwYXRjaCBtb2R1bGVzIChzZWUgc2VjdGlvbiA0KS4gTGl2ZXBhdGNoIG1hbmFnZXMgaXRzIG93bgorcHJlc2VydmVkIGZvciBsaXZlcGF0Y2ggbW9kdWxlcyAoc2VlIHNlY3Rpb24gNSkuIExpdmVwYXRjaCBtYW5hZ2VzIGl0cyBvd24KIHJlbG9jYXRpb24gc2VjdGlvbnMgYW5kIHN5bWJvbHMsIHdoaWNoIGFyZSBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudC4gVGhlCiBFbGYgY29uc3RhbnRzIHVzZWQgdG8gbWFyayBsaXZlcGF0Y2ggc3ltYm9scyBhbmQgcmVsb2NhdGlvbiBzZWN0aW9ucyB3ZXJlCiBzZWxlY3RlZCBmcm9tIE9TLXNwZWNpZmljIHJhbmdlcyBhY2NvcmRpbmcgdG8gdGhlIGRlZmluaXRpb25zIGZyb20gZ2xpYmMuCkBAIC0xMTcsNyArMTE4LDcgQEAKIHNlY3Rpb25zLCBhcyBpbiB0aGUgY2FzZSBvZiB0aGUgc2FtcGxlIGxpdmVwYXRjaCBtb2R1bGUgKHNlZQogc2FtcGxlcy9saXZlcGF0Y2gpLgogCi1TaW5jZSBFbGYgaW5mb3JtYXRpb24gaXMgcHJlc2VydmVkIGZvciBsaXZlcGF0Y2ggbW9kdWxlcyAoc2VlIFNlY3Rpb24gNCksIGEKK1NpbmNlIEVsZiBpbmZvcm1hdGlvbiBpcyBwcmVzZXJ2ZWQgZm9yIGxpdmVwYXRjaCBtb2R1bGVzIChzZWUgU2VjdGlvbiA1KSwgYQogbGl2ZXBhdGNoIHJlbG9jYXRpb24gc2VjdGlvbiBjYW4gYmUgYXBwbGllZCBzaW1wbHkgYnkgcGFzc2luZyBpbiB0aGUKIGFwcHJvcHJpYXRlIHNlY3Rpb24gaW5kZXggdG8gYXBwbHlfcmVsb2NhdGVfYWRkKCksIHdoaWNoIHRoZW4gdXNlcyBpdCB0bwogYWNjZXNzIHRoZSByZWxvY2F0aW9uIHNlY3Rpb24gYW5kIGFwcGx5IHRoZSByZWxvY2F0aW9ucy4KQEAgLTI5Miw4ICsyOTMsMTkgQEAKIFsqXSBOb3RlIHRoYXQgdGhlICdOZHgnIChTZWN0aW9uIGluZGV4KSBmb3IgdGhlc2Ugc3ltYm9scyBpcyBTSE5fTElWRVBBVENIICgweGZmMjApLgogICAgICJPUyIgbWVhbnMgT1Mtc3BlY2lmaWMuCiAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorNC4gQXJjaGl0ZWN0dXJlLXNwZWNpZmljIHNlY3Rpb25zCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FyY2hpdGVjdHVyZXMgbWF5IG92ZXJyaWRlIGFyY2hfa2xwX2luaXRfb2JqZWN0X2xvYWRlZCgpIHRvIHBlcmZvcm0KK2FkZGl0aW9uYWwgYXJjaC1zcGVjaWZpYyB0YXNrcyB3aGVuIGEgdGFyZ2V0IG1vZHVsZSBsb2Fkcywgc3VjaCBhcyBhcHBseWluZworYXJjaC1zcGVjaWZpYyBzZWN0aW9ucy4gT24geDg2IGZvciBleGFtcGxlLCB3ZSBtdXN0IGFwcGx5IHBlci1vYmplY3QKKy5hbHRpbnN0cnVjdGlvbnMgYW5kIC5wYXJhaW5zdHJ1Y3Rpb25zIHNlY3Rpb25zIHdoZW4gYSB0YXJnZXQgbW9kdWxlIGxvYWRzLgorVGhlc2Ugc2VjdGlvbnMgbXVzdCBiZSBwcmVmaXhlZCB3aXRoICIua2xwLmFyY2guJG9iam5hbWUuIiBzbyB0aGF0IHRoZXkgY2FuCitiZSBlYXNpbHkgaWRlbnRpZmllZCB3aGVuIGl0ZXJhdGluZyB0aHJvdWdoIGEgcGF0Y2ggbW9kdWxlJ3MgRWxmIHNlY3Rpb25zCisoU2VlIGFyY2gveDg2L2tlcm5lbC9saXZlcGF0Y2guYyBmb3IgYSBjb21wbGV0ZSBleGFtcGxlKS4KKwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTQuIFN5bWJvbCB0YWJsZSBhbmQgRWxmIHNlY3Rpb24gYWNjZXNzCis1LiBTeW1ib2wgdGFibGUgYW5kIEVsZiBzZWN0aW9uIGFjY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEEgbGl2ZXBhdGNoIG1vZHVsZSdzIHN5bWJvbCB0YWJsZSBpcyBhY2Nlc3NpYmxlIHRocm91Z2ggbW9kdWxlLT5zeW10YWIuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbG9ja2luZy9sZ2xvY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xnbG9jay50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTcxZTMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xnbG9jay50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotbGdsb2NrIC0gbG9jYWwvZ2xvYmFsIGxvY2tzIGZvciBtb3N0bHkgbG9jYWwgYWNjZXNzIHBhdHRlcm5zCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotT3JpZ2luOiBOaWNrIFBpZ2dpbidzIFZGUyBzY2FsYWJpbGl0eSBzZXJpZXMgaW50cm9kdWNlZCBkdXJpbmcKLQkyLjYuMzUrKyBbMV0gWzJdCi1Mb2NhdGlvbjoga2VybmVsL2xvY2tpbmcvbGdsb2NrLmMKLQlpbmNsdWRlL2xpbnV4L2xnbG9jay5oCi1Vc2VyczogY3VycmVudGx5IG9ubHkgdGhlIFZGUyBhbmQgc3RvcF9tYWNoaW5lIHJlbGF0ZWQgY29kZQotCi1EZXNpZ24gR29hbDoKLS0tLS0tLS0tLS0tLQotCi1JbXByb3ZlIHNjYWxhYmlsaXR5IG9mIGdsb2JhbGx5IHVzZWQgbGFyZ2UgZGF0YSBzZXRzIHRoYXQgYXJlCi1kaXN0cmlidXRlZCBvdmVyIGFsbCBDUFVzIGFzIHBlcl9jcHUgZWxlbWVudHMuCi0KLVRvIG1hbmFnZSBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgYXJlIHBhcnRpdGlvbmVkIG92ZXIgYWxsIENQVXMKLWFzIHBlcl9jcHUgZWxlbWVudHMgYnV0IGNhbiBiZSBtb3N0bHkgaGFuZGxlZCBieSBDUFUgbG9jYWwgYWN0aW9ucwotbGdsb2NrIHdpbGwgYmUgdXNlZCB3aGVyZSB0aGUgbWFqb3JpdHkgb2YgYWNjZXNzZXMgYXJlIGNwdSBsb2NhbAotcmVhZGluZyBhbmQgb2NjYXNpb25hbCBjcHUgbG9jYWwgd3JpdGluZyB3aXRoIHZlcnkgaW5mcmVxdWVudAotZ2xvYmFsIHdyaXRlIGFjY2Vzcy4KLQotCi0qIGRlYWwgd2l0aCB0aGluZ3MgbG9jYWxseSB3aGVuZXZlciBwb3NzaWJsZQotCS0gdmVyeSBmYXN0IGFjY2VzcyB0byB0aGUgbG9jYWwgcGVyX2NwdSBkYXRhCi0JLSByZWFzb25hYmx5IGZhc3QgYWNjZXNzIHRvIHNwZWNpZmljIHBlcl9jcHUgZGF0YSBvbiBhIGRpZmZlcmVudAotCSAgQ1BVCi0qIHdoaWxlIG1ha2luZyBnbG9iYWwgYWN0aW9uIHBvc3NpYmxlIHdoZW4gbmVlZGVkCi0JLSBieSBleHBlbnNpdmUgYWNjZXNzIHRvIGFsbCBDUFVzIGxvY2tzIC0gZWZmZWN0aXZlbHkKLQkgIHJlc3VsdGluZyBpbiBhIGdsb2JhbGx5IHZpc2libGUgY3JpdGljYWwgc2VjdGlvbi4KLQotRGVzaWduOgotLS0tLS0tLQotCi1CYXNpY2FsbHkgaXQgaXMgYW4gYXJyYXkgb2YgcGVyX2NwdSBzcGlubG9ja3Mgd2l0aCB0aGUKLWxnX2xvY2FsX2xvY2svdW5sb2NrIGFjY2Vzc2luZyB0aGUgbG9jYWwgQ1BVcyBsb2NrIG9iamVjdCBhbmQgdGhlCi1sZ19sb2NhbF9sb2NrX2NwdS91bmxvY2tfY3B1IGFjY2Vzc2luZyBhIHJlbW90ZSBDUFVzIGxvY2sgb2JqZWN0Ci10aGUgbGdfbG9jYWxfbG9jayBoYXMgdG8gZGlzYWJsZSBwcmVlbXB0aW9uIGFzIG1pZ3JhdGlvbiBwcm90ZWN0aW9uIHNvCi10aGF0IHRoZSByZWZlcmVuY2UgdG8gdGhlIGxvY2FsIENQVXMgbG9jayBkb2VzIG5vdCBnbyBvdXQgb2Ygc2NvcGUuCi1EdWUgdG8gdGhlIGxnX2xvY2FsX2xvY2svdW5sb2NrIG9ubHkgdG91Y2hpbmcgY3B1LWxvY2FsIHJlc291cmNlcyBpdAotaXMgZmFzdC4gVGFraW5nIHRoZSBsb2NhbCBsb2NrIG9uIGEgZGlmZmVyZW50IENQVSB3aWxsIGJlIG1vcmUKLWV4cGVuc2l2ZSBidXQgc3RpbGwgcmVsYXRpdmVseSBjaGVhcC4KLQotT25lIGNhbiByZWxheCB0aGUgbWlncmF0aW9uIGNvbnN0cmFpbnRzIGJ5IGFjcXVpcmluZyB0aGUgY3VycmVudAotQ1BVcyBsb2NrIHdpdGggbGdfbG9jYWxfbG9ja19jcHUsIHJlbWVtYmVyIHRoZSBjcHUsIGFuZCByZWxlYXNlIHRoYXQKLWxvY2sgYXQgdGhlIGVuZCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBldmVuIGlmIG1pZ3JhdGVkLiBUaGlzIHNob3VsZAotZ2l2ZSBtb3N0IG9mIHRoZSBwZXJmb3JtYW5jZSBiZW5lZml0cyB3aXRob3V0IGluaGliaXRpbmcgbWlncmF0aW9uCi10aG91Z2ggbmVlZHMgY2FyZWZ1bCBjb25zaWRlcmF0aW9ucyBmb3IgbmVzdGluZyBvZiBsZ2xvY2tzIGFuZAotY29uc2lkZXJhdGlvbiBvZiBkZWFkbG9ja3Mgd2l0aCBsZ19nbG9iYWxfbG9jay4KLQotVGhlIGxnX2dsb2JhbF9sb2NrL3VubG9jayBsb2NrcyBhbGwgdW5kZXJseWluZyBzcGlubG9ja3Mgb2YgYWxsCi1wb3NzaWJsZSBDUFVzIChpbmNsdWRpbmcgdGhvc2Ugb2ZmLWxpbmUpLiBUaGUgcHJlZW1wdGlvbiBkaXNhYmxlL2VuYWJsZQotYXJlIG5lZWRlZCBpbiB0aGUgbm9uLVJUIGtlcm5lbHMgdG8gcHJldmVudCBkZWFkbG9ja3MgbGlrZToKLQotICAgICAgICAgICAgICAgICAgICAgb24gY3B1IDEKLQotICAgICAgICAgICAgICB0YXNrIEEgICAgICAgICAgdGFzayBCCi0gICAgICAgICBsZ19nbG9iYWxfbG9jawotICAgICAgICAgICBnb3QgY3B1IDAgbG9jawotICAgICAgICAgICAgICAgICA8PDw8IHByZWVtcHQgPDw8PAotICAgICAgICAgICAgICAgICAgICAgICAgIGxnX2xvY2FsX2xvY2tfY3B1IGZvciBjcHUgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BpbiBvbiBjcHUgMCBsb2NrCi0KLU9uIC1SVCB0aGlzIGRlYWRsb2NrIHNjZW5hcmlvIGlzIHJlc29sdmVkIGJ5IHRoZSBhcmNoX3NwaW5fbG9ja3MgaW4gdGhlCi1sZ2xvY2tzIGJlaW5nIHJlcGxhY2VkIGJ5IHJ0X211dGV4ZXMgd2hpY2ggcmVzb2x2ZSB0aGUgYWJvdmUgZGVhZGxvY2sKLWJ5IGJvb3N0aW5nIHRoZSBsb2NrLWhvbGRlci4KLQotCi1JbXBsZW1lbnRhdGlvbjoKLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgaW5pdGlhbCBsZ2xvY2sgaW1wbGVtZW50YXRpb24gZnJvbSBOaWNrIFBpZ2dpbiB1c2VkIHNvbWUgY29tcGxleAotbWFjcm9zIHRvIGdlbmVyYXRlIHRoZSBsZ2xvY2svYnJsb2NrIGluIGxnbG9jay5oIC0gdGhleSB3ZXJlIGxhdGVyCi10dXJuZWQgaW50byBhIHNldCBvZiBmdW5jdGlvbnMgYnkgQW5kaSBLbGVlbiBbN10uIFRoZSBjaGFuZ2UgdG8gZnVuY3Rpb25zCi13YXMgbW90aXZhdGVkIGJ5IHRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZSBsb2NrIHVzZXJzIGFuZCBhbHNvIGJ5IHRoZW0KLWJlaW5nIGVhc2llciB0byBtYWludGFpbiB0aGFuIHRoZSBnZW5lcmF0aW5nIG1hY3Jvcy4gVGhpcyBjaGFuZ2UgdG8KLWZ1bmN0aW9ucyBpcyBhbHNvIHRoZSBiYXNpcyB0byBlbGltaW5hdGVkIHRoZSByZXN0cmljdGlvbiBvZiBub3QKLWJlaW5nIGluaXRpYWxpemVhYmxlIGluIGtlcm5lbCBtb2R1bGVzICh0aGUgcmVtYWluaW5nIHByb2JsZW0gaXMgdGhhdAotbG9ja3MgYXJlIG5vdCBleHBsaWNpdGx5IGluaXRpYWxpemVkIC0gc2VlIGxvY2tkZXAtZGVzaWduLnR4dCkKLQotRGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICNpbmNsdWRlIDxsaW51eC9sZ2xvY2suaD4KLQotICBERUZJTkVfTEdMT0NLKG5hbWUpCi0gIG9yOgotICBERUZJTkVfU1RBVElDX0xHTE9DSyhuYW1lKTsKLQotICBsZ19sb2NrX2luaXQoJm5hbWUsICJsb2NrZGVwX25hbWVfc3RyaW5nIik7Ci0KLSAgb24gVVAgdGhpcyBpcyBtYXBwZWQgdG8gREVGSU5FX1NQSU5MT0NLKG5hbWUpIGluIGJvdGggY2FzZXMsIG5vdGUKLSAgYWxzbyB0aGF0IGFzIG9mIDMuMTgtcmM2IGFsbCBkZWNsYXJhdGlvbiBpbiB1c2UgYXJlIG9mIHRoZSBfU1RBVElDXwotICB2YXJpYW50IChhbmQgaXQgc2VlbXMgdGhhdCB0aGUgbm9uLXN0YXRpYyB3YXMgbmV2ZXIgaW4gdXNlKS4KLSAgbGdfbG9ja19pbml0IGlzIGluaXRpYWxpemluZyB0aGUgbG9ja2RlcCBtYXAgb25seS4KLQotVXNhZ2U6Ci0tLS0tLS0KLQotRnJvbSB0aGUgbG9ja2luZyBzZW1hbnRpY3MgaXQgaXMgYSBzcGlubG9jay4gSXQgY291bGQgYmUgY2FsbGVkIGEKLWxvY2FsaXR5IGF3YXJlIHNwaW5sb2NrLiBsZ19sb2NhbF8qIGJlaGF2ZXMgbGlrZSBhIHBlcl9jcHUKLXNwaW5sb2NrIGFuZCBsZ19nbG9iYWxfKiBsaWtlIGEgZ2xvYmFsIHNwaW5sb2NrLgotTm8gc3VycHJpc2VzIGluIHRoZSBBUEkuCi0KLSAgbGdfbG9jYWxfbG9jaygqbGdsb2NrKTsKLSAgICAgYWNjZXNzIHRvIHByb3RlY3RlZCBwZXJfY3B1IG9iamVjdCBvbiB0aGlzIENQVQotICBsZ19sb2NhbF91bmxvY2soKmxnbG9jayk7Ci0KLSAgbGdfbG9jYWxfbG9ja19jcHUoKmxnbG9jaywgY3B1KTsKLSAgICAgYWNjZXNzIHRvIHByb3RlY3RlZCBwZXJfY3B1IG9iamVjdCBvbiBvdGhlciBDUFUgY3B1Ci0gIGxnX2xvY2FsX3VubG9ja19jcHUoKmxnbG9jaywgY3B1KTsKLQotICBsZ19nbG9iYWxfbG9jaygqbGdsb2NrKTsKLSAgICAgYWNjZXNzIGFsbCBwcm90ZWN0ZWQgcGVyX2NwdSBvYmplY3RzIG9uIGFsbCBDUFVzCi0gIGxnX2dsb2JhbF91bmxvY2soKmxnbG9jayk7Ci0KLSAgVGhlcmUgYXJlIG5vIF90cnlsb2NrIHZhcmlhbnRzIG9mIHRoZSBsZ2xvY2tzLgotCi1Ob3RlIHRoYXQgdGhlIGxnX2dsb2JhbF9sb2NrL3VubG9jayBoYXMgdG8gaXRlcmF0ZSBvdmVyIGFsbCBwb3NzaWJsZQotQ1BVcyByYXRoZXIgdGhhbiB0aGUgYWN0dWFsbHkgcHJlc2VudCBDUFVzIG9yIGEgQ1BVIGNvdWxkIGdvIG9mZi1saW5lCi13aXRoIGEgaGVsZCBsb2NrIFs0XSBhbmQgdGhhdCBtYWtlcyBpdCB2ZXJ5IGV4cGVuc2l2ZS4gQSBkaXNjdXNzaW9uIG9uCi10aGVzZSBpc3N1ZXMgY2FuIGJlIGZvdW5kIGF0IFs1XQotCi1Db25zdHJhaW50czoKLS0tLS0tLS0tLS0tLQotCi0gICogY3VycmVudGx5IHRoZSBkZWNsYXJhdGlvbiBvZiBsZ2xvY2tzIGluIGtlcm5lbCBtb2R1bGVzIGlzIG5vdAotICAgIHBvc3NpYmxlLCB0aG91Z2ggdGhpcyBzaG91bGQgYmUgZG9hYmxlIHdpdGggbGl0dGxlIGNoYW5nZS4KLSAgKiBsZ2xvY2tzIGFyZSBub3QgcmVjdXJzaXZlLgotICAqIHN1aXRhYmxlIGZvciBjb2RlIHRoYXQgY2FuIGRvIG1vc3Qgb3BlcmF0aW9ucyBvbiB0aGUgQ1BVIGxvY2FsCi0gICAgZGF0YSBhbmQgd2lsbCB2ZXJ5IHJhcmVseSBuZWVkIHRoZSBnbG9iYWwgbG9jawotICAqIGxnX2dsb2JhbF9sb2NrL3VubG9jayBpcyAqdmVyeSogZXhwZW5zaXZlIGFuZCBkb2VzIG5vdCBzY2FsZQotICAqIG9uIFVQIHN5c3RlbXMgYWxsIGxnXyogcHJpbWl0aXZlcyBhcmUgc2ltcGx5IHNwaW5sb2NrcwotICAqIGluIFBSRUVNUFRfUlQgdGhlIHNwaW5sb2NrIGJlY29tZXMgYW4gcnQtbXV0ZXggYW5kIGNhbiBzbGVlcCBidXQKLSAgICBkb2VzIG5vdCBjaGFuZ2UgdGhlIHRhc2tzIHN0YXRlIHdoaWxlIHNsZWVwaW5nIFs2XS4KLSAgKiBpbiBQUkVFTVBUX1JUIHRoZSBwcmVlbXB0X2Rpc2FibGUvZW5hYmxlIGluIGxnX2xvY2FsX2xvY2svdW5sb2NrCi0gICAgaXMgZG93bmdyYWRlZCB0byBhIG1pZ3JhdGVfZGlzYWJsZS9lbmFibGUsIHRoZSBvdGhlcgotICAgIHByZWVtcHRfZGlzYWJsZS9lbmFibGUgYXJlIGRvd25ncmFkZWQgdG8gYmFycmllcnMgWzZdLgotICAgIFRoZSBkZWFkbG9jayBub3RlZCBmb3Igbm9uLVJUIGFib3ZlIGlzIHJlc29sdmVkIGR1ZSB0byBydF9tdXRleGVzCi0gICAgYm9vc3RpbmcgdGhlIGxvY2staG9sZGVyIGluIHRoaXMgY2FzZSB3aGljaCBhcmNoX3NwaW5fbG9ja3MgZG8KLSAgICBub3QgZG8uCi0KLWxnbG9ja3Mgd2VyZSBkZXNpZ25lZCBmb3IgdmVyeSBzcGVjaWZpYyBwcm9ibGVtcyBpbiB0aGUgVkZTIGFuZCBwcm9iYWJseQotb25seSBhcmUgdGhlIHJpZ2h0IGFuc3dlciBpbiB0aGVzZSBjb3JuZXIgY2FzZXMuIEFueSBuZXcgdXNlciB0aGF0IGxvb2tzCi1hdCBsZ2xvY2tzIHByb2JhYmx5IHdhbnRzIHRvIGxvb2sgYXQgdGhlIHNlcWxvY2sgYW5kIFJDVSBhbHRlcm5hdGl2ZXMgYXMKLWhlciBmaXJzdCBjaG9pY2UuIFRoZXJlIGFyZSBhbHNvIGVmZm9ydHMgdG8gcmVzb2x2ZSB0aGUgUkNVIGlzc3VlcyB0aGF0Ci1jdXJyZW50bHkgcHJldmVudCB1c2luZyBSQ1UgaW4gcGxhY2Ugb2YgdmlldyByZW1haW5pbmcgbGdsb2Nrcy4KLQotTm90ZSBvbiBicmxvY2sgaGlzdG9yeToKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSAnQmlnIFJlYWRlcicgcmVhZC13cml0ZSBzcGlubG9ja3Mgd2VyZSBvcmlnaW5hbGx5IGludHJvZHVjZWQgYnkKLUluZ28gTW9sbmFyIGluIDIwMDAgKDIuNC8yLjUga2VybmVsIHNlcmllcykgYW5kIHJlbW92ZWQgaW4gMjAwMy4gVGhleQotbGF0ZXIgd2VyZSBpbnRyb2R1Y2VkIGJ5IHRoZSBWRlMgc2NhbGFiaWxpdHkgcGF0Y2ggc2V0IGluIDIuNiBzZXJpZXMKLWFnYWluIGFzIHRoZSAiYmlnIHJlYWRlciBsb2NrIiBicmxvY2sgWzJdIHZhcmlhbnQgb2YgbGdsb2NrIHdoaWNoIGhhcwotYmVlbiByZXBsYWNlZCBieSBzZXFsb2NrIHByaW1pdGl2ZXMgb3IgYnkgUkNVIGJhc2VkIHByaW1pdGl2ZXMgaW4gdGhlCi0zLjEzIGtlcm5lbCBzZXJpZXMgYXMgd2FzIHN1Z2dlc3RlZCBpbiBbM10gaW4gMjAwMy4gVGhlIGJybG9jayB3YXMKLWVudGlyZWx5IHJlbW92ZWQgaW4gdGhlIDMuMTMga2VybmVsIHNlcmllcy4KLQotTGluazogMSBodHRwOi8vbGttbC5vcmcvbGttbC8yMDEwLzgvMi84MQotTGluazogMiBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy80MDE3MzgvCi1MaW5rOiAzIGh0dHA6Ly9sa21sLm9yZy9sa21sLzIwMDMvMy85LzIwNQotTGluazogNCBodHRwczovL2xrbWwub3JnL2xrbWwvMjAxMS84LzI0LzE4NQotTGluazogNSBodHRwOi8vbGttbC5vcmcvbGttbC8yMDExLzEyLzE4LzE4OQotTGluazogNiBodHRwczovL3d3dy5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvcHJvamVjdHMvcnQvCi0gICAgICAgIHBhdGNoIHNlcmllcyAtIGxnbG9ja3MtcnQucGF0Y2gucGF0Y2gKLUxpbms6IDcgaHR0cDovL2xrbWwub3JnL2xrbWwvMjAxMi8zLzUvMjYKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVkaWEvTWFrZWZpbGUgYi9Eb2N1bWVudGF0aW9uL21lZGlhL01ha2VmaWxlCmluZGV4IDM5ZTJkNzYuLmE3ZmIzNTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWVkaWEvTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9tZWRpYS9NYWtlZmlsZQpAQCAtMTAsNyArMTAsOCBAQAogCiBUQVJHRVRTIDo9ICQoYWRkcHJlZml4ICQoQlVJTERESVIpLywgJChGSUxFUykpCiAKLWh0bWxkb2NzOiAkKEJVSUxERElSKSAke1RBUkdFVFN9CisuUEhPTlk6IGFsbAorYWxsOiAkKEJVSUxERElSKSAke1RBUkdFVFN9CiAKICQoQlVJTERESVIpOgogCSQoUSlta2RpciAtcCAkQApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZWRpYS9jb25mLnB5IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS9jb25mLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjkyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL21lZGlhL2NvbmYucHkKQEAgLTAsMCArMSwxMCBAQAorIyAtKi0gY29kaW5nOiB1dGYtODsgbW9kZTogcHl0aG9uIC0qLQorCitwcm9qZWN0ID0gJ0xpbnV4IE1lZGlhIFN1YnN5c3RlbSBEb2N1bWVudGF0aW9uJworCit0YWdzLmFkZCgic3VicHJvamVjdCIpCisKK2xhdGV4X2RvY3VtZW50cyA9IFsKKyAgICAoJ2luZGV4JywgJ21lZGlhLnRleCcsICdMaW51eCBNZWRpYSBTdWJzeXN0ZW0gRG9jdW1lbnRhdGlvbicsCisgICAgICdUaGUga2VybmVsIGRldmVsb3BtZW50IGNvbW11bml0eScsICdtYW51YWwnKSwKK10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVkaWEvY29uZl9uaXRwaWNrLnB5IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS9jb25mX25pdHBpY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiZWFjMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbWVkaWEvY29uZl9uaXRwaWNrLnB5CkBAIC0wLDAgKzEsOTMgQEAKKyMgLSotIGNvZGluZzogdXRmLTg7IG1vZGU6IHB5dGhvbiAtKi0KKworcHJvamVjdCA9ICdMaW51eCBNZWRpYSBTdWJzeXN0ZW0gRG9jdW1lbnRhdGlvbicKKworIyBJdCBpcyBwb3NzaWJsZSB0byBydW4gU3BoaW54IGluIG5pY2twaWNrIG1vZGUgd2l0aDoKK25pdHBpY2t5ID0gVHJ1ZQorCisjIHdpdGhpbiBuaXQtcGlja2luZyBidWlsZCwgZG8gbm90IHJlZmVyIHRvIGFueSBpbnRlcnNwaGlueCBvYmplY3QKK2ludGVyc3BoaW54X21hcHBpbmcgPSB7fQorCisjIEluIG5pY2twaWNrIG1vZGUsIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgbG90cyBvZiBtaXNzaW5nIHJlZmVyZW5jZXMgdGhhdAorIworIyAxKSBhcmUganVzdCB0eXBlZGVmcyBsaWtlOiBib29sLCBfX3UzMiwgZXRjOworIyAyKSBJdCB3aWxsIGNvbXBsYWluIGZvciB0aGluZ3MgbGlrZTogZW51bSwgTlVMTDsKKyMgMykgSXQgd2lsbCBjb21wbGFpbiBmb3Igc3ltYm9scyB0aGF0IHNob3VsZCBiZSBvbiBkaWZmZXJlbnQKKyMgICAgYm9va3MgKGJ1dCBjdXJyZW50bHkgYXJlbid0IHBvcnRlZCB0byBSZVNUKQorIworIyBUaGUgbGlzdCBiZWxvdyBoYXMgYSBsaXN0IG9mIHN1Y2ggc3ltYm9scyB0byBiZSBpZ25vcmVkIGluIG5pdHBpY2sgbW9kZQorIworbml0cGlja19pZ25vcmUgPSBbCisgICAgKCJjOmZ1bmMiLCAiY2xvY2tfZ2V0dGltZSIpLAorICAgICgiYzpmdW5jIiwgImNsb3NlIiksCisgICAgKCJjOmZ1bmMiLCAiY29udGFpbmVyX29mIiksCisgICAgKCJjOmZ1bmMiLCAiZGV0ZXJtaW5lX3ZhbGlkX2lvY3RscyIpLAorICAgICgiYzpmdW5jIiwgIkVSUl9QVFIiKSwKKyAgICAoImM6ZnVuYyIsICJpb2N0bCIpLAorICAgICgiYzpmdW5jIiwgIklTX0VSUiIpLAorICAgICgiYzpmdW5jIiwgIm1tYXAiKSwKKyAgICAoImM6ZnVuYyIsICJvcGVuIiksCisgICAgKCJjOmZ1bmMiLCAicGNpX25hbWUiKSwKKyAgICAoImM6ZnVuYyIsICJwb2xsIiksCisgICAgKCJjOmZ1bmMiLCAiUFRSX0VSUiIpLAorICAgICgiYzpmdW5jIiwgInJlYWQiKSwKKyAgICAoImM6ZnVuYyIsICJyZWxlYXNlIiksCisgICAgKCJjOmZ1bmMiLCAic2V0IiksCisgICAgKCJjOmZ1bmMiLCAic3RydWN0IGZkX3NldCIpLAorICAgICgiYzpmdW5jIiwgInN0cnVjdCBwb2xsZmQiKSwKKyAgICAoImM6ZnVuYyIsICJ1c2JfbWFrZV9wYXRoIiksCisgICAgKCJjOmZ1bmMiLCAid3JpdGUiKSwKKyAgICAoImM6dHlwZSIsICJhdG9taWNfdCIpLAorICAgICgiYzp0eXBlIiwgImJvb2wiKSwKKyAgICAoImM6dHlwZSIsICJidWZfcXVldWUiKSwKKyAgICAoImM6dHlwZSIsICJkZXZpY2UiKSwKKyAgICAoImM6dHlwZSIsICJkZXZpY2VfZHJpdmVyIiksCisgICAgKCJjOnR5cGUiLCAiZGV2aWNlX25vZGUiKSwKKyAgICAoImM6dHlwZSIsICJlbnVtIiksCisgICAgKCJjOnR5cGUiLCAiZmlsZSIpLAorICAgICgiYzp0eXBlIiwgImkyY19hZGFwdGVyIiksCisgICAgKCJjOnR5cGUiLCAiaTJjX2JvYXJkX2luZm8iKSwKKyAgICAoImM6dHlwZSIsICJpMmNfY2xpZW50IiksCisgICAgKCJjOnR5cGUiLCAia3RpbWVfdCIpLAorICAgICgiYzp0eXBlIiwgImxlZF9jbGFzc2Rldl9mbGFzaCIpLAorICAgICgiYzp0eXBlIiwgImxpc3RfaGVhZCIpLAorICAgICgiYzp0eXBlIiwgImxvY2tfY2xhc3Nfa2V5IiksCisgICAgKCJjOnR5cGUiLCAibW9kdWxlIiksCisgICAgKCJjOnR5cGUiLCAibXV0ZXgiKSwKKyAgICAoImM6dHlwZSIsICJwY2lfZGV2IiksCisgICAgKCJjOnR5cGUiLCAicGR2YmRldiIpLAorICAgICgiYzp0eXBlIiwgInBvbGxfdGFibGVfc3RydWN0IiksCisgICAgKCJjOnR5cGUiLCAiczMyIiksCisgICAgKCJjOnR5cGUiLCAiczY0IiksCisgICAgKCJjOnR5cGUiLCAic2QiKSwKKyAgICAoImM6dHlwZSIsICJzcGlfYm9hcmRfaW5mbyIpLAorICAgICgiYzp0eXBlIiwgInNwaV9kZXZpY2UiKSwKKyAgICAoImM6dHlwZSIsICJzcGlfbWFzdGVyIiksCisgICAgKCJjOnR5cGUiLCAic3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIiksCisgICAgKCJjOnR5cGUiLCAic3RydWN0IHBvbGxmZCIpLAorICAgICgiYzp0eXBlIiwgInN0cnVjdCB0aW1ldmFsIiksCisgICAgKCJjOnR5cGUiLCAic3RydWN0IHZpZGVvX2NhcGFiaWxpdHkiKSwKKyAgICAoImM6dHlwZSIsICJ1MTYiKSwKKyAgICAoImM6dHlwZSIsICJ1MzIiKSwKKyAgICAoImM6dHlwZSIsICJ1NjQiKSwKKyAgICAoImM6dHlwZSIsICJ1OCIpLAorICAgICgiYzp0eXBlIiwgInVuaW9uIiksCisgICAgKCJjOnR5cGUiLCAidXNiX2RldmljZSIpLAorCisgICAgKCJjcHA6dHlwZSIsICJib29sZWFuIiksCisgICAgKCJjcHA6dHlwZSIsICJmZCIpLAorICAgICgiY3BwOnR5cGUiLCAiZmRfc2V0IiksCisgICAgKCJjcHA6dHlwZSIsICJpbnQxNl90IiksCisgICAgKCJjcHA6dHlwZSIsICJOVUxMIiksCisgICAgKCJjcHA6dHlwZSIsICJvZmZfdCIpLAorICAgICgiY3BwOnR5cGUiLCAicG9sbGZkIiksCisgICAgKCJjcHA6dHlwZSIsICJzaXplX3QiKSwKKyAgICAoImNwcDp0eXBlIiwgInNzaXplX3QiKSwKKyAgICAoImNwcDp0eXBlIiwgInRpbWV2YWwiKSwKKyAgICAoImNwcDp0eXBlIiwgIl9fdTE2IiksCisgICAgKCJjcHA6dHlwZSIsICJfX3UzMiIpLAorICAgICgiY3BwOnR5cGUiLCAiX191NjQiKSwKKyAgICAoImNwcDp0eXBlIiwgInVpbnQxNl90IiksCisgICAgKCJjcHA6dHlwZSIsICJ1aW50MzJfdCIpLAorICAgICgiY3BwOnR5cGUiLCAidmlkZW9fc3lzdGVtX3QiKSwKK10KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVkaWEvaW5kZXgucnN0IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS9pbmRleC5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4ZjBhZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbWVkaWEvaW5kZXgucnN0CkBAIC0wLDAgKzEsMTkgQEAKK0xpbnV4IE1lZGlhIFN1YnN5c3RlbSBEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb250ZW50czoKKworLi4gdG9jdHJlZTo6CisgICA6bWF4ZGVwdGg6IDIKKworICAgbWVkaWFfdWFwaQorICAgbWVkaWFfa2FwaQorICAgZHZiLWRyaXZlcnMvaW5kZXgKKyAgIHY0bC1kcml2ZXJzL2luZGV4CisKKy4uIG9ubHk6OiAgc3VicHJvamVjdAorCisgICBJbmRpY2VzCisgICA9PT09PT09CisKKyAgICogOnJlZjpgZ2VuaW5kZXhgCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1mdW5jLW9wZW4ucnN0IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtZnVuYy1vcGVuLnJzdAppbmRleCAzOGZkN2UwLi43YzBmOTgxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1mdW5jLW9wZW4ucnN0CisrKyBiL0RvY3VtZW50YXRpb24vbWVkaWEvdWFwaS9jZWMvY2VjLWZ1bmMtb3Blbi5yc3QKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBPcGVuIGZsYWdzLiBBY2Nlc3MgbW9kZSBtdXN0IGJlIGBgT19SRFdSYGAuCiAKICAgICBXaGVuIHRoZSBgYE9fTk9OQkxPQ0tgYCBmbGFnIGlzIGdpdmVuLCB0aGUKLSAgICA6cmVmOmBDRUNfUkVDRUlWRSA8Q0VDX1JFQ0VJVkU+YCBhbmQgOnJlZjpgQ0VDX0RRRVZFTlQgPENFQ19EUUVWRU5UPmAgaW9jdGxzCisgICAgOnJlZjpgQ0VDX1JFQ0VJVkUgPENFQ19SRUNFSVZFPmAgYW5kIDpjOmZ1bmM6YENFQ19EUUVWRU5UYCBpb2N0bHMKICAgICB3aWxsIHJldHVybiB0aGUgYGBFQUdBSU5gYCBlcnJvciBjb2RlIHdoZW4gbm8gbWVzc2FnZSBvciBldmVudCBpcyBhdmFpbGFibGUsIGFuZAogICAgIGlvY3RscyA6cmVmOmBDRUNfVFJBTlNNSVQgPENFQ19UUkFOU01JVD5gLAogICAgIDpyZWY6YENFQ19BREFQX1NfUEhZU19BRERSIDxDRUNfQURBUF9TX1BIWVNfQUREUj5gIGFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtaW9jLWFkYXAtZy1sb2ctYWRkcnMucnN0IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtaW9jLWFkYXAtZy1sb2ctYWRkcnMucnN0CmluZGV4IDA0ZWU5MDAuLjIwMWQ0ODMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWVkaWEvdWFwaS9jZWMvY2VjLWlvYy1hZGFwLWctbG9nLWFkZHJzLnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1pb2MtYWRhcC1nLWxvZy1hZGRycy5yc3QKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiAgICAgICAgLSAgYGBmbGFnc2BgCiAKLSAgICAgICAtICBGbGFncy4gTm8gZmxhZ3MgYXJlIGRlZmluZWQgeWV0LCBzbyBzZXQgdGhpcyB0byAwLgorICAgICAgIC0gIEZsYWdzLiBTZWUgOnJlZjpgY2VjLWxvZy1hZGRycy1mbGFnc2AgZm9yIGEgbGlzdCBvZiBhdmFpbGFibGUgZmxhZ3MuCiAKICAgICAtICAuLiByb3cgNwogCkBAIC0yMDEsNiArMjAxLDI1IEBACiAgICAgICAgICAgZ2l2ZSB0aGUgQ0VDIGZyYW1ld29yayBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgdHlwZSwgZXZlbgogICAgICAgICAgIHRob3VnaCB0aGUgZnJhbWV3b3JrIHdvbid0IHVzZSBpdCBkaXJlY3RseSBpbiB0aGUgQ0VDIG1lc3NhZ2UuCiAKKy4uIF9jZWMtbG9nLWFkZHJzLWZsYWdzOgorCisuLiBmbGF0LXRhYmxlOjogRmxhZ3MgZm9yIHN0cnVjdCBjZWNfbG9nX2FkZHJzCisgICAgOmhlYWRlci1yb3dzOiAgMAorICAgIDpzdHViLWNvbHVtbnM6IDAKKyAgICA6d2lkdGhzOiAgICAgICAzIDEgNAorCisKKyAgICAtICAuLiBfYENFQy1MT0ctQUREUlMtRkwtQUxMT1ctVU5SRUctRkFMTEJBQ0tgOgorCisgICAgICAgLSAgYGBDRUNfTE9HX0FERFJTX0ZMX0FMTE9XX1VOUkVHX0ZBTExCQUNLYGAKKworICAgICAgIC0gIDEKKworICAgICAgIC0gIEJ5IGRlZmF1bHQgaWYgbm8gbG9naWNhbCBhZGRyZXNzIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZSBjYW4gYmUgY2xhaW1lZCwgdGhlbgorCSAgaXQgd2lsbCBnbyBiYWNrIHRvIHRoZSB1bmNvbmZpZ3VyZWQgc3RhdGUuIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZW4gaXQgd2lsbAorCSAgZmFsbGJhY2sgdG8gdGhlIFVucmVnaXN0ZXJlZCBsb2dpY2FsIGFkZHJlc3MuIE5vdGUgdGhhdCBpZiB0aGUgVW5yZWdpc3RlcmVkCisJICBsb2dpY2FsIGFkZHJlc3Mgd2FzIGV4cGxpY2l0bHkgcmVxdWVzdGVkLCB0aGVuIHRoaXMgZmxhZyBoYXMgbm8gZWZmZWN0LgorCiAuLiBfY2VjLXZlcnNpb25zOgogCiAuLiBmbGF0LXRhYmxlOjogQ0VDIFZlcnNpb25zCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1pb2MtZHFldmVudC5yc3QgYi9Eb2N1bWVudGF0aW9uL21lZGlhL3VhcGkvY2VjL2NlYy1pb2MtZHFldmVudC5yc3QKaW5kZXggN2E2ZDZkMC4uZjhjYWEyOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZWRpYS91YXBpL2NlYy9jZWMtaW9jLWRxZXZlbnQucnN0CisrKyBiL0RvY3VtZW50YXRpb24vbWVkaWEvdWFwaS9jZWMvY2VjLWlvYy1kcWV2ZW50LnJzdApAQCAtMTUsNyArMTUsOCBAQAogU3lub3BzaXMKID09PT09PT09CiAKLS4uIGNwcDpmdW5jdGlvbjo6IGludCBpb2N0bCggaW50IGZkLCBpbnQgcmVxdWVzdCwgc3RydWN0IGNlY19ldmVudCAqYXJncCApCisuLiBjOmZ1bmN0aW9uOjogaW50IGlvY3RsKCBpbnQgZmQsIGludCByZXF1ZXN0LCBzdHJ1Y3QgY2VjX2V2ZW50ICphcmdwICkKKyAgIDpuYW1lOiBDRUNfRFFFVkVOVAogCiBBcmd1bWVudHMKID09PT09PT09PQpAQCAtMzYsNyArMzcsNyBAQAogICAgYW5kIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBhcyBhIHN0YWdpbmcga2VybmVsIG1vZHVsZS4KIAogQ0VDIGRldmljZXMgY2FuIHNlbmQgYXN5bmNocm9ub3VzIGV2ZW50cy4gVGhlc2UgY2FuIGJlIHJldHJpZXZlZCBieQotY2FsbGluZyA6cmVmOmBpb2N0bCBDRUNfRFFFVkVOVCA8Q0VDX0RRRVZFTlQ+YC4gSWYgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBpbgorY2FsbGluZyA6YzpmdW5jOmBDRUNfRFFFVkVOVGAuIElmIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgaW4KIG5vbi1ibG9ja2luZyBtb2RlIGFuZCBubyBldmVudCBpcyBwZW5kaW5nLCB0aGVuIGl0IHdpbGwgcmV0dXJuIC0xIGFuZAogc2V0IGVycm5vIHRvIHRoZSBgYEVBR0FJTmBgIGVycm9yIGNvZGUuCiAKQEAgLTY0LDcgKzY1LDggQEAKIAogICAgICAgIC0gIGBgcGh5c19hZGRyYGAKIAotICAgICAgIC0gIFRoZSBjdXJyZW50IHBoeXNpY2FsIGFkZHJlc3MuCisgICAgICAgLSAgVGhlIGN1cnJlbnQgcGh5c2ljYWwgYWRkcmVzcy4gVGhpcyBpcyBgYENFQ19QSFlTX0FERFJfSU5WQUxJRGBgIGlmIG5vCisgICAgICAgICAgdmFsaWQgcGh5c2ljYWwgYWRkcmVzcyBpcyBzZXQuCiAKICAgICAtICAuLiByb3cgMgogCkBAIC03Miw3ICs3NCwxMCBAQAogCiAgICAgICAgLSAgYGBsb2dfYWRkcl9tYXNrYGAKIAotICAgICAgIC0gIFRoZSBjdXJyZW50IHNldCBvZiBjbGFpbWVkIGxvZ2ljYWwgYWRkcmVzc2VzLgorICAgICAgIC0gIFRoZSBjdXJyZW50IHNldCBvZiBjbGFpbWVkIGxvZ2ljYWwgYWRkcmVzc2VzLiBUaGlzIGlzIDAgaWYgbm8gbG9naWNhbAorICAgICAgICAgIGFkZHJlc3NlcyBhcmUgY2xhaW1lZCBvciBpZiBgYHBoeXNfYWRkcmBgIGlzIGBgQ0VDX1BIWVNfQUREUl9JTlZBTElEYGAuCisJICBJZiBiaXQgMTUgaXMgc2V0IChgYDEgPDwgQ0VDX0xPR19BRERSX1VOUkVHSVNURVJFRGBgKSB0aGVuIHRoaXMgZGV2aWNlCisJICBoYXMgdGhlIHVucmVnaXN0ZXJlZCBsb2dpY2FsIGFkZHJlc3MuIEluIHRoYXQgY2FzZSBhbGwgb3RoZXIgYml0cyBhcmUgMC4KIAogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dAppbmRleCBhNGQwYTk5Li5iYTgxOGVjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CkBAIC02MDksNyArNjA5LDcgQEAKIFRoZSBkYXRhLWRlcGVuZGVuY3kgYmFycmllciBtdXN0IG9yZGVyIHRoZSByZWFkIGludG8gUSB3aXRoIHRoZSBzdG9yZQogaW50byAqUS4gIFRoaXMgcHJvaGliaXRzIHRoaXMgb3V0Y29tZToKIAotCShRID09IEIpICYmIChCID09IDQpCisJKFEgPT0gJkIpICYmIChCID09IDQpCiAKIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBwYXR0ZXJuIHNob3VsZCBiZSByYXJlLiAgQWZ0ZXIgYWxsLCB0aGUgd2hvbGUgcG9pbnQKIG9mIGRlcGVuZGVuY3kgb3JkZXJpbmcgaXMgdG8gLXByZXZlbnQtIHdyaXRlcyB0byB0aGUgZGF0YSBzdHJ1Y3R1cmUsIGFsb25nCkBAIC0xOTI4LDYgKzE5MjgsNyBAQAogCiAgICAgIFNlZSBEb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnNpc3RlbnQgbWVtb3J5LgogCisKIE1NSU8gV1JJVEUgQkFSUklFUgogLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTIwNzUsNyArMjA3Niw3IEBACiBhbnl0aGluZyBhdCBhbGwgLSBlc3BlY2lhbGx5IHdpdGggcmVzcGVjdCB0byBJL08gYWNjZXNzZXMgLSB1bmxlc3MgY29tYmluZWQKIHdpdGggaW50ZXJydXB0IGRpc2FibGluZyBvcGVyYXRpb25zLgogCi1TZWUgYWxzbyB0aGUgc2VjdGlvbiBvbiAiSW50ZXItQ1BVIGxvY2tpbmcgYmFycmllciBlZmZlY3RzIi4KK1NlZSBhbHNvIHRoZSBzZWN0aW9uIG9uICJJbnRlci1DUFUgYWNxdWlyaW5nIGJhcnJpZXIgZWZmZWN0cyIuCiAKIAogQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZzoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWAppbmRleCA0MTUxNTRhLi5hNzY5Nzc4MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWApAQCAtNzQsNiArNzQsOCBAQAogCS0gVGhlIEROUyByZXNvbHZlciBtb2R1bGUgYWxsb3dzIGtlcm5lbCBzZXJ2aWVzIHRvIG1ha2UgRE5TIHF1ZXJpZXMuCiBkcml2ZXIudHh0CiAJLSBTb2Z0bmV0IGRyaXZlciBpc3N1ZXMuCitlbmEudHh0CisJLSBpbmZvIG9uIEFtYXpvbidzIEVsYXN0aWMgTmV0d29yayBBZGFwdGVyIChFTkEpCiBlMTAwLnR4dAogCS0gaW5mbyBvbiBJbnRlbCdzIEV0aGVyRXhwcmVzcyBQUk8vMTAwIGxpbmUgb2YgMTAvMTAwIGJvYXJkcwogZTEwMDAudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmF0bWFuLWFkdi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmF0bWFuLWFkdi50eHQKaW5kZXggMWI1ZTdhNy4uOGE4ZDNkOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JhdG1hbi1hZHYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9iYXRtYW4tYWR2LnR4dApAQCAtNDMsMTAgKzQzLDE1IEBACiByZWxvYWQgdGhlIG1vZHVsZSBpZiB5b3UgcGx1ZyB5b3VyIFVTQiB3aWZpIGFkYXB0ZXIgaW50byB5b3VyIG1hLQogY2hpbmUgYWZ0ZXIgYmF0bWFuIGFkdmFuY2VkIHdhcyBpbml0aWFsbHkgbG9hZGVkLgogCi1UbyBhY3RpdmF0ZSBhICBnaXZlbiAgaW50ZXJmYWNlICBzaW1wbHkgIHdyaXRlICAiYmF0MCIgIGludG8gIGl0cwotIm1lc2hfaWZhY2UiIGZpbGUgaW5zaWRlIHRoZSBiYXRtYW5fYWR2IHN1YmZvbGRlcjoKK1RoZSBiYXRtYW4tYWR2IHNvZnQtaW50ZXJmYWNlIGNhbiBiZSBjcmVhdGVkIHVzaW5nICB0aGUgIGlwcm91dGUyCit0b29sICJpcCIKIAotIyBlY2hvIGJhdDAgPiAvc3lzL2NsYXNzL25ldC9ldGgwL2JhdG1hbl9hZHYvbWVzaF9pZmFjZQorIyBpcCBsaW5rIGFkZCBuYW1lIGJhdDAgdHlwZSBiYXRhZHYKKworVG8gIGFjdGl2YXRlIGEgIGdpdmVuICBpbnRlcmZhY2UgIHNpbXBseSAgYXR0YWNoIGl0IHRvIHRoZSAiYmF0MCIKK2ludGVyZmFjZQorCisjIGlwIGxpbmsgc2V0IGRldiBldGgwIG1hc3RlciBiYXQwCiAKIFJlcGVhdCAgdGhpcyBzdGVwIGZvciBhbGwgaW50ZXJmYWNlcyB5b3Ugd2lzaCB0byBhZGQuICBOb3cgYmF0bWFuCiBzdGFydHMgdXNpbmcvYnJvYWRjYXN0aW5nIG9uIHRoaXMvdGhlc2UgaW50ZXJmYWNlKHMpLgpAQCAtNTYsMTAgKzYxLDEwIEBACiAjIGNhdCAvc3lzL2NsYXNzL25ldC9ldGgwL2JhdG1hbl9hZHYvaWZhY2Vfc3RhdHVzCiAjIGFjdGl2ZQogCi1UbyBkZWFjdGl2YXRlIGFuIGludGVyZmFjZSB5b3UgaGF2ZSAgdG8gIHdyaXRlICAibm9uZSIgIGludG8gIGl0cwotIm1lc2hfaWZhY2UiIGZpbGU6CitUbyAgZGVhY3RpdmF0ZSAgYW4gIGludGVyZmFjZSAgeW91ICBoYXZlICAgdG8gIGRldGFjaCBpdCBmcm9tIHRoZQorImJhdDAiIGludGVyZmFjZToKIAotIyBlY2hvIG5vbmUgPiAvc3lzL2NsYXNzL25ldC9ldGgwL2JhdG1hbl9hZHYvbWVzaF9pZmFjZQorIyBpcCBsaW5rIHNldCBkZXYgZXRoMCBub21hc3RlcgogCiAKIEFsbCAgbWVzaCAgd2lkZSAgc2V0dGluZ3MgIGNhbiBiZSBmb3VuZCBpbiBiYXRtYW4ncyBvd24gaW50ZXJmYWNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZHNhL2RzYS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZHNhL2RzYS50eHQKaW5kZXggOWQwNWVkNy4uNmQ2YzA3YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2RzYS9kc2EudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9kc2EvZHNhLnR4dApAQCAtMjI3LDkgKzIyNyw5IEBACiAKIGRzYV9zd2l0Y2g6IHN0cnVjdHVyZSBkZXNjcmliaW5nIGEgc3dpdGNoIGRldmljZSBpbiB0aGUgdHJlZSwgcmVmZXJlbmNpbmcgYQogZHNhX3N3aXRjaF90cmVlIGFzIGEgYmFja3BvaW50ZXIsIHNsYXZlIG5ldHdvcmsgZGV2aWNlcywgbWFzdGVyIG5ldHdvcmsgZGV2aWNlLAotYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBiYWNraW5nIGRzYV9zd2l0Y2hfZHJpdmVyCithbmQgYSByZWZlcmVuY2UgdG8gdGhlIGJhY2tpbmcgZHNhX3N3aXRjaF9vcHMKIAotZHNhX3N3aXRjaF9kcml2ZXI6IHN0cnVjdHVyZSByZWZlcmVuY2luZyBmdW5jdGlvbiBwb2ludGVycywgc2VlIGJlbG93IGZvciBhIGZ1bGwKK2RzYV9zd2l0Y2hfb3BzOiBzdHJ1Y3R1cmUgcmVmZXJlbmNpbmcgZnVuY3Rpb24gcG9pbnRlcnMsIHNlZSBiZWxvdyBmb3IgYSBmdWxsCiBkZXNjcmlwdGlvbi4KIAogRGVzaWduIGxpbWl0YXRpb25zCkBAIC0zNTcsMTAgKzM1NywxMCBAQAogRHJpdmVyIGRldmVsb3BtZW50CiA9PT09PT09PT09PT09PT09PT0KIAotRFNBIHN3aXRjaCBkcml2ZXJzIG5lZWQgdG8gaW1wbGVtZW50IGEgZHNhX3N3aXRjaF9kcml2ZXIgc3RydWN0dXJlIHdoaWNoIHdpbGwKK0RTQSBzd2l0Y2ggZHJpdmVycyBuZWVkIHRvIGltcGxlbWVudCBhIGRzYV9zd2l0Y2hfb3BzIHN0cnVjdHVyZSB3aGljaCB3aWxsCiBjb250YWluIHRoZSB2YXJpb3VzIG1lbWJlcnMgZGVzY3JpYmVkIGJlbG93LgogCi1yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCkgcmVnaXN0ZXJzIHRoaXMgZHNhX3N3aXRjaF9kcml2ZXIgaW4gaXRzIGludGVybmFsIGxpc3QKK3JlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoKSByZWdpc3RlcnMgdGhpcyBkc2Ffc3dpdGNoX29wcyBpbiBpdHMgaW50ZXJuYWwgbGlzdAogb2YgZHJpdmVycyB0byBwcm9iZSBmb3IuIHVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigpIGRvZXMgdGhlIGV4YWN0IG9wcG9zaXRlLgogCiBVbmxlc3MgcmVxdWVzdGVkIGRpZmZlcmVudGx5IGJ5IHNldHRpbmcgdGhlIHByaXZfc2l6ZSBtZW1iZXIgYWNjb3JkaW5nbHksIERTQQpAQCAtMzc5LDcgKzM3OSw3IEBACiAgIGJ1c2VzLCByZXR1cm4gYSBub24tTlVMTCBzdHJpbmcKIAogLSBzZXR1cDogc2V0dXAgZnVuY3Rpb24gZm9yIHRoZSBzd2l0Y2gsIHRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcKLSAgdXAgdGhlIGRzYV9zd2l0Y2hfZHJpdmVyIHByaXZhdGUgc3RydWN0dXJlIHdpdGggYWxsIGl0IG5lZWRzOiByZWdpc3RlciBtYXBzLAorICB1cCB0aGUgZHNhX3N3aXRjaF9vcHMgcHJpdmF0ZSBzdHJ1Y3R1cmUgd2l0aCBhbGwgaXQgbmVlZHM6IHJlZ2lzdGVyIG1hcHMsCiAgIGludGVycnVwdHMsIG11dGV4ZXMsIGxvY2tzIGV0Yy4uIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBleHBlY3RlZCB0byBwcm9wZXJseQogICBjb25maWd1cmUgdGhlIHN3aXRjaCB0byBzZXBhcmF0ZSBhbGwgbmV0d29yayBpbnRlcmZhY2VzIGZyb20gZWFjaCBvdGhlciwgdGhhdAogICBpcywgdGhleSBzaG91bGQgYmUgaXNvbGF0ZWQgYnkgdGhlIHN3aXRjaCBoYXJkd2FyZSBpdHNlbGYsIHR5cGljYWxseSBieSBjcmVhdGluZwpAQCAtNTg0LDI5ICs1ODQsMzIgQEAKICAgZnVuY3Rpb24gdGhhdCB0aGUgZHJpdmVyIGhhcyB0byBjYWxsIGZvciBlYWNoIE1BQyBhZGRyZXNzIGtub3duIHRvIGJlIGJlaGluZAogICB0aGUgZ2l2ZW4gcG9ydC4gQSBzd2l0Y2hkZXYgb2JqZWN0IGlzIHVzZWQgdG8gY2FycnkgdGhlIFZJRCBhbmQgRkRCIGluZm8uCiAKKy0gcG9ydF9tZGJfcHJlcGFyZTogYnJpZGdlIGxheWVyIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgYnJpZGdlIHByZXBhcmVzIHRoZQorICBpbnN0YWxsYXRpb24gb2YgYSBtdWx0aWNhc3QgZGF0YWJhc2UgZW50cnkuIElmIHRoZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCwKKyAgdGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIC1FT1BOT1RTVVBQIHRvIGluZm9ybSB0aGUgYnJpZGdlIGNvZGUgdG8gZmFsbGJhY2sKKyAgdG8gYSBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbi4gTm8gaGFyZHdhcmUgc2V0dXAgbXVzdCBiZSBkb25lIGluIHRoaXMgZnVuY3Rpb24uCisgIFNlZSBwb3J0X2ZkYl9hZGQgZm9yIHRoaXMgYW5kIGRldGFpbHMuCisKKy0gcG9ydF9tZGJfYWRkOiBicmlkZ2UgbGF5ZXIgZnVuY3Rpb24gaW52b2tlZCB3aGVuIHRoZSBicmlkZ2Ugd2FudHMgdG8gaW5zdGFsbAorICBhIG11bHRpY2FzdCBkYXRhYmFzZSBlbnRyeSwgdGhlIHN3aXRjaCBoYXJkd2FyZSBzaG91bGQgYmUgcHJvZ3JhbW1lZCB3aXRoIHRoZQorICBzcGVjaWZpZWQgYWRkcmVzcyBpbiB0aGUgc3BlY2lmaWVkIFZMQU4gSUQgaW4gdGhlIGZvcndhcmRpbmcgZGF0YWJhc2UKKyAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgVkxBTiBJRC4KKworTm90ZTogVkxBTiBJRCAwIGNvcnJlc3BvbmRzIHRvIHRoZSBwb3J0IHByaXZhdGUgZGF0YWJhc2UsIHdoaWNoLCBpbiB0aGUgY29udGV4dAorb2YgRFNBLCB3b3VsZCBiZSB0aGUgaXRzIHBvcnQtYmFzZWQgVkxBTiwgdXNlZCBieSB0aGUgYXNzb2NpYXRlZCBicmlkZ2UgZGV2aWNlLgorCistIHBvcnRfbWRiX2RlbDogYnJpZGdlIGxheWVyIGZ1bmN0aW9uIGludm9rZWQgd2hlbiB0aGUgYnJpZGdlIHdhbnRzIHRvIHJlbW92ZSBhCisgIG11bHRpY2FzdCBkYXRhYmFzZSBlbnRyeSwgdGhlIHN3aXRjaCBoYXJkd2FyZSBzaG91bGQgYmUgcHJvZ3JhbW1lZCB0byBkZWxldGUKKyAgdGhlIHNwZWNpZmllZCBNQUMgYWRkcmVzcyBmcm9tIHRoZSBzcGVjaWZpZWQgVkxBTiBJRCBpZiBpdCB3YXMgbWFwcGVkIGludG8KKyAgdGhpcyBwb3J0IGZvcndhcmRpbmcgZGF0YWJhc2UuCisKKy0gcG9ydF9tZGJfZHVtcDogYnJpZGdlIGxheWVyIGZ1bmN0aW9uIGludm9rZWQgd2l0aCBhIHN3aXRjaGRldiBjYWxsYmFjaworICBmdW5jdGlvbiB0aGF0IHRoZSBkcml2ZXIgaGFzIHRvIGNhbGwgZm9yIGVhY2ggTUFDIGFkZHJlc3Mga25vd24gdG8gYmUgYmVoaW5kCisgIHRoZSBnaXZlbiBwb3J0LiBBIHN3aXRjaGRldiBvYmplY3QgaXMgdXNlZCB0byBjYXJyeSB0aGUgVklEIGFuZCBNREIgaW5mby4KKwogVE9ETwogPT09PQogCi1UaGUgcGxhdGZvcm0gZGV2aWNlIHByb2JsZW0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRFNBIGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBhcyBhIHBsYXRmb3JtIGRldmljZSBkcml2ZXIgd2hpY2ggaXMgZmFyIGZyb20gaWRlYWwKLWFzIHdhcyBkaXNjdXNzZWQgaW4gdGhpcyB0aHJlYWQ6Ci0KLWh0dHA6Ly9wZXJtYWxpbmsuZ21hbmUub3JnL2dtYW5lLmxpbnV4Lm5ldHdvcmsvMzI5ODQ4Ci0KLVRoaXMgYmFzaWNhbGx5IHByZXZlbnRzIHRoZSBkZXZpY2UgZHJpdmVyIG1vZGVsIHRvIGJlIHByb3Blcmx5IHVzZWQgYW5kIGFwcGxpZWQsCi1hbmQgc3VwcG9ydCBub24tTURJTywgbm9uLU1NSU8gRXRoZXJuZXQgY29ubmVjdGVkIHN3aXRjaGVzLgotCi1Bbm90aGVyIHByb2JsZW0gd2l0aCB0aGUgcGxhdGZvcm0gZGV2aWNlIGRyaXZlciBhcHByb2FjaCBpcyB0aGF0IGl0IHByZXZlbnRzIHRoZQotdXNlIG9mIGEgbW9kdWxhciBzd2l0Y2ggZHJpdmVycyBidWlsZCBkdWUgdG8gYSBjaXJjdWxhciBkZXBlbmRlbmN5LCBpbGx1c3RyYXRlZAotaGVyZToKLQotaHR0cDovL2NvbW1lbnRzLmdtYW5lLm9yZy9nbWFuZS5saW51eC5uZXR3b3JrLzM0NTgwMwotCi1BdHRlbXB0cyBvZiByZXdvcmtpbmcgdGhpcyBoYXMgYmVlbiBkb25lIGhlcmU6Ci0KLWh0dHBzOi8vbHduLm5ldC9BcnRpY2xlcy82NDMxNDkvCi0KIE1ha2luZyBTV0lUQ0hERVYgYW5kIERTQSBjb252ZXJnZSB0b3dhcmRzIGFuIHVuaWZpZWQgY29kZWJhc2UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2VuYS50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZW5hLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjRiNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2VuYS50eHQKQEAgLTAsMCArMSwzMDUgQEAKK0xpbnV4IGtlcm5lbCBkcml2ZXIgZm9yIEVsYXN0aWMgTmV0d29yayBBZGFwdGVyIChFTkEpIGZhbWlseToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworT3ZlcnZpZXc6Cis9PT09PT09PT0KK0VOQSBpcyBhIG5ldHdvcmtpbmcgaW50ZXJmYWNlIGRlc2lnbmVkIHRvIG1ha2UgZ29vZCB1c2Ugb2YgbW9kZXJuIENQVQorZmVhdHVyZXMgYW5kIHN5c3RlbSBhcmNoaXRlY3R1cmVzLgorCitUaGUgRU5BIGRldmljZSBleHBvc2VzIGEgbGlnaHR3ZWlnaHQgbWFuYWdlbWVudCBpbnRlcmZhY2Ugd2l0aCBhCittaW5pbWFsIHNldCBvZiBtZW1vcnkgbWFwcGVkIHJlZ2lzdGVycyBhbmQgZXh0ZW5kYWJsZSBjb21tYW5kIHNldAordGhyb3VnaCBhbiBBZG1pbiBRdWV1ZS4KKworVGhlIGRyaXZlciBzdXBwb3J0cyBhIHJhbmdlIG9mIEVOQSBkZXZpY2VzLCBpcyBsaW5rLXNwZWVkIGluZGVwZW5kZW50CisoaS5lLiwgdGhlIHNhbWUgZHJpdmVyIGlzIHVzZWQgZm9yIDEwR2JFLCAyNUdiRSwgNDBHYkUsIGV0Yy4pLCBhbmQgaGFzCithIG5lZ290aWF0ZWQgYW5kIGV4dGVuZGFibGUgZmVhdHVyZSBzZXQuCisKK1NvbWUgRU5BIGRldmljZXMgc3VwcG9ydCBTUi1JT1YuIFRoaXMgZHJpdmVyIGlzIHVzZWQgZm9yIGJvdGggdGhlCitTUi1JT1YgUGh5c2ljYWwgRnVuY3Rpb24gKFBGKSBhbmQgVmlydHVhbCBGdW5jdGlvbiAoVkYpIGRldmljZXMuCisKK0VOQSBkZXZpY2VzIGVuYWJsZSBoaWdoIHNwZWVkIGFuZCBsb3cgb3ZlcmhlYWQgbmV0d29yayB0cmFmZmljCitwcm9jZXNzaW5nIGJ5IHByb3ZpZGluZyBtdWx0aXBsZSBUeC9SeCBxdWV1ZSBwYWlycyAodGhlIG1heGltdW0gbnVtYmVyCitpcyBhZHZlcnRpc2VkIGJ5IHRoZSBkZXZpY2UgdmlhIHRoZSBBZG1pbiBRdWV1ZSksIGEgZGVkaWNhdGVkIE1TSS1YCitpbnRlcnJ1cHQgdmVjdG9yIHBlciBUeC9SeCBxdWV1ZSBwYWlyLCBhZGFwdGl2ZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiwKK2FuZCBDUFUgY2FjaGVsaW5lIG9wdGltaXplZCBkYXRhIHBsYWNlbWVudC4KKworVGhlIEVOQSBkcml2ZXIgc3VwcG9ydHMgaW5kdXN0cnkgc3RhbmRhcmQgVENQL0lQIG9mZmxvYWQgZmVhdHVyZXMgc3VjaAorYXMgY2hlY2tzdW0gb2ZmbG9hZCBhbmQgVENQIHRyYW5zbWl0IHNlZ21lbnRhdGlvbiBvZmZsb2FkIChUU08pLgorUmVjZWl2ZS1zaWRlIHNjYWxpbmcgKFJTUykgaXMgc3VwcG9ydGVkIGZvciBtdWx0aS1jb3JlIHNjYWxpbmcuCisKK1RoZSBFTkEgZHJpdmVyIGFuZCBpdHMgY29ycmVzcG9uZGluZyBkZXZpY2VzIGltcGxlbWVudCBoZWFsdGgKK21vbml0b3JpbmcgbWVjaGFuaXNtcyBzdWNoIGFzIHdhdGNoZG9nLCBlbmFibGluZyB0aGUgZGV2aWNlIGFuZCBkcml2ZXIKK3RvIHJlY292ZXIgaW4gYSBtYW5uZXIgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLCBhcyB3ZWxsIGFzCitkZWJ1ZyBsb2dzLgorCitTb21lIG9mIHRoZSBFTkEgZGV2aWNlcyBzdXBwb3J0IGEgd29ya2luZyBtb2RlIGNhbGxlZCBMb3ctbGF0ZW5jeQorUXVldWUgKExMUSksIHdoaWNoIHNhdmVzIHNldmVyYWwgbW9yZSBtaWNyb3NlY29uZHMuCisKK1N1cHBvcnRlZCBQQ0kgdmVuZG9yIElEL2RldmljZSBJRHM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorMWQwZjowZWMyIC0gRU5BIFBGCisxZDBmOjFlYzIgLSBFTkEgUEYgd2l0aCBMTFEgc3VwcG9ydAorMWQwZjplYzIwIC0gRU5BIFZGCisxZDBmOmVjMjEgLSBFTkEgVkYgd2l0aCBMTFEgc3VwcG9ydAorCitFTkEgU291cmNlIENvZGUgRGlyZWN0b3J5IFN0cnVjdHVyZToKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorZW5hX2NvbS5bY2hdICAgICAgLSBNYW5hZ2VtZW50IGNvbW11bmljYXRpb24gbGF5ZXIuIFRoaXMgbGF5ZXIgaXMKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2libGUgZm9yIHRoZSBoYW5kbGluZyBhbGwgdGhlIG1hbmFnZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgKGFkbWluKSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGRldmljZSBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgIGRyaXZlci4KK2VuYV9ldGhfY29tLltjaF0gIC0gVHgvUnggZGF0YSBwYXRoLgorZW5hX2FkbWluX2RlZnMuaCAgLSBEZWZpbml0aW9uIG9mIEVOQSBtYW5hZ2VtZW50IGludGVyZmFjZS4KK2VuYV9ldGhfaW9fZGVmcy5oIC0gRGVmaW5pdGlvbiBvZiBFTkEgZGF0YSBwYXRoIGludGVyZmFjZS4KK2VuYV9jb21tb25fZGVmcy5oIC0gQ29tbW9uIGRlZmluaXRpb25zIGZvciBlbmFfY29tIGxheWVyLgorZW5hX3JlZ3NfZGVmcy5oICAgLSBEZWZpbml0aW9uIG9mIEVOQSBQQ0kgbWVtb3J5LW1hcHBlZCAoTU1JTykgcmVnaXN0ZXJzLgorZW5hX25ldGRldi5bY2hdICAgLSBNYWluIExpbnV4IGtlcm5lbCBkcml2ZXIuCitlbmFfc3lmc2ZzLltjaF0gICAtIFN5c2ZzIGZpbGVzLgorZW5hX2V0aHRvb2wuYyAgICAgLSBldGh0b29sIGNhbGxiYWNrcy4KK2VuYV9wY2lfaWRfdGJsLmggIC0gU3VwcG9ydGVkIGRldmljZSBJRHMuCisKK01hbmFnZW1lbnQgSW50ZXJmYWNlOgorPT09PT09PT09PT09PT09PT09PT09CitFTkEgbWFuYWdlbWVudCBpbnRlcmZhY2UgaXMgZXhwb3NlZCBieSBtZWFucyBvZjoKKy0gUENJZSBDb25maWd1cmF0aW9uIFNwYWNlCistIERldmljZSBSZWdpc3RlcnMKKy0gQWRtaW4gUXVldWUgKEFRKSBhbmQgQWRtaW4gQ29tcGxldGlvbiBRdWV1ZSAoQUNRKQorLSBBc3luY2hyb25vdXMgRXZlbnQgTm90aWZpY2F0aW9uIFF1ZXVlIChBRU5RKQorCitFTkEgZGV2aWNlIE1NSU8gUmVnaXN0ZXJzIGFyZSBhY2Nlc3NlZCBvbmx5IGR1cmluZyBkcml2ZXIKK2luaXRpYWxpemF0aW9uIGFuZCBhcmUgbm90IGludm9sdmVkIGluIGZ1cnRoZXIgbm9ybWFsIGRldmljZQorb3BlcmF0aW9uLgorCitBUSBpcyB1c2VkIGZvciBzdWJtaXR0aW5nIG1hbmFnZW1lbnQgY29tbWFuZHMsIGFuZCB0aGUKK3Jlc3VsdHMvcmVzcG9uc2VzIGFyZSByZXBvcnRlZCBhc3luY2hyb25vdXNseSB0aHJvdWdoIEFDUS4KKworRU5BIGludHJvZHVjZXMgYSB2ZXJ5IHNtYWxsIHNldCBvZiBtYW5hZ2VtZW50IGNvbW1hbmRzIHdpdGggcm9vbSBmb3IKK3ZlbmRvci1zcGVjaWZpYyBleHRlbnNpb25zLiBNb3N0IG9mIHRoZSBtYW5hZ2VtZW50IG9wZXJhdGlvbnMgYXJlCitmcmFtZWQgaW4gYSBnZW5lcmljIEdldC9TZXQgZmVhdHVyZSBjb21tYW5kLgorCitUaGUgZm9sbG93aW5nIGFkbWluIHF1ZXVlIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQ6CistIENyZWF0ZSBJL08gc3VibWlzc2lvbiBxdWV1ZQorLSBDcmVhdGUgSS9PIGNvbXBsZXRpb24gcXVldWUKKy0gRGVzdHJveSBJL08gc3VibWlzc2lvbiBxdWV1ZQorLSBEZXN0cm95IEkvTyBjb21wbGV0aW9uIHF1ZXVlCistIEdldCBmZWF0dXJlCistIFNldCBmZWF0dXJlCistIENvbmZpZ3VyZSBBRU5RCistIEdldCBzdGF0aXN0aWNzCisKK1JlZmVyIHRvIGVuYV9hZG1pbl9kZWZzLmggZm9yIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBHZXQvU2V0IEZlYXR1cmUKK3Byb3BlcnRpZXMuCisKK1RoZSBBc3luY2hyb25vdXMgRXZlbnQgTm90aWZpY2F0aW9uIFF1ZXVlIChBRU5RKSBpcyBhIHVuaS1kaXJlY3Rpb25hbAorcXVldWUgdXNlZCBieSB0aGUgRU5BIGRldmljZSB0byBzZW5kIHRvIHRoZSBkcml2ZXIgZXZlbnRzIHRoYXQgY2Fubm90CitiZSByZXBvcnRlZCB1c2luZyBBQ1EuIEFFTlEgZXZlbnRzIGFyZSBzdWJkaXZpZGVkIGludG8gZ3JvdXBzLiBFYWNoCitncm91cCBtYXkgaGF2ZSBtdWx0aXBsZSBzeW5kcm9tZXMsIGFzIHNob3duIGJlbG93CisKK1RoZSBldmVudHMgYXJlOgorCUdyb3VwCQkJU3luZHJvbWUKKwlMaW5rIHN0YXRlIGNoYW5nZQktIFggLQorCUZhdGFsIGVycm9yCQktIFggLQorCU5vdGlmaWNhdGlvbgkJU3VzcGVuZCB0cmFmZmljCisJTm90aWZpY2F0aW9uCQlSZXN1bWUgdHJhZmZpYworCUtlZXAtQWxpdmUJCS0gWCAtCisKK0FDUSBhbmQgQUVOUSBzaGFyZSB0aGUgc2FtZSBNU0ktWCB2ZWN0b3IuCisKK0tlZXAtQWxpdmUgaXMgYSBzcGVjaWFsIG1lY2hhbmlzbSB0aGF0IGFsbG93cyBtb25pdG9yaW5nIG9mIHRoZQorZGV2aWNlJ3MgaGVhbHRoLiBUaGUgZHJpdmVyIG1haW50YWlucyBhIHdhdGNoZG9nIChXRCkgaGFuZGxlciB3aGljaCwKK2lmIGZpcmVkLCBsb2dzIHRoZSBjdXJyZW50IHN0YXRlIGFuZCBzdGF0aXN0aWNzIHRoZW4gcmVzZXRzIGFuZAorcmVzdGFydHMgdGhlIEVOQSBkZXZpY2UgYW5kIGRyaXZlci4gQSBLZWVwLUFsaXZlIGV2ZW50IGlzIGRlbGl2ZXJlZCBieQordGhlIGRldmljZSBldmVyeSBzZWNvbmQuIFRoZSBkcml2ZXIgcmUtYXJtcyB0aGUgV0QgdXBvbiByZWNlcHRpb24gb2YgYQorS2VlcC1BbGl2ZSBldmVudC4gQSBtaXNzZWQgS2VlcC1BbGl2ZSBldmVudCBjYXVzZXMgdGhlIFdEIGhhbmRsZXIgdG8KK2ZpcmUuCisKK0RhdGEgUGF0aCBJbnRlcmZhY2U6Cis9PT09PT09PT09PT09PT09PT09PQorSS9PIG9wZXJhdGlvbnMgYXJlIGJhc2VkIG9uIFR4IGFuZCBSeCBTdWJtaXNzaW9uIFF1ZXVlcyAoVHggU1EgYW5kIFJ4CitTUSBjb3JyZXNwb25kaW5nbHkpLiBFYWNoIFNRIGhhcyBhIGNvbXBsZXRpb24gcXVldWUgKENRKSBhc3NvY2lhdGVkCit3aXRoIGl0LgorCitUaGUgU1FzIGFuZCBDUXMgYXJlIGltcGxlbWVudGVkIGFzIGRlc2NyaXB0b3IgcmluZ3MgaW4gY29udGlndW91cworcGh5c2ljYWwgbWVtb3J5LgorCitUaGUgRU5BIGRyaXZlciBzdXBwb3J0cyB0d28gUXVldWUgT3BlcmF0aW9uIG1vZGVzIGZvciBUeCBTUXM6CistIFJlZ3VsYXIgbW9kZQorICAqIEluIHRoaXMgbW9kZSB0aGUgVHggU1FzIHJlc2lkZSBpbiB0aGUgaG9zdCdzIG1lbW9yeS4gVGhlIEVOQQorICAgIGRldmljZSBmZXRjaGVzIHRoZSBFTkEgVHggZGVzY3JpcHRvcnMgYW5kIHBhY2tldCBkYXRhIGZyb20gaG9zdAorICAgIG1lbW9yeS4KKy0gTG93IExhdGVuY3kgUXVldWUgKExMUSkgbW9kZSBvciAicHVzaC1tb2RlIi4KKyAgKiBJbiB0aGlzIG1vZGUgdGhlIGRyaXZlciBwdXNoZXMgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3JzIGFuZCB0aGUKKyAgICBmaXJzdCAxMjggYnl0ZXMgb2YgdGhlIHBhY2tldCBkaXJlY3RseSB0byB0aGUgRU5BIGRldmljZSBtZW1vcnkKKyAgICBzcGFjZS4gVGhlIHJlc3Qgb2YgdGhlIHBhY2tldCBwYXlsb2FkIGlzIGZldGNoZWQgYnkgdGhlCisgICAgZGV2aWNlLiBGb3IgdGhpcyBvcGVyYXRpb24gbW9kZSwgdGhlIGRyaXZlciB1c2VzIGEgZGVkaWNhdGVkIFBDSQorICAgIGRldmljZSBtZW1vcnkgQkFSLCB3aGljaCBpcyBtYXBwZWQgd2l0aCB3cml0ZS1jb21iaW5lIGNhcGFiaWxpdHkuCisKK1RoZSBSeCBTUXMgc3VwcG9ydCBvbmx5IHRoZSByZWd1bGFyIG1vZGUuCisKK05vdGU6IE5vdCBhbGwgRU5BIGRldmljZXMgc3VwcG9ydCBMTFEsIGFuZCB0aGlzIGZlYXR1cmUgaXMgbmVnb3RpYXRlZAorICAgICAgd2l0aCB0aGUgZGV2aWNlIHVwb24gaW5pdGlhbGl6YXRpb24uIElmIHRoZSBFTkEgZGV2aWNlIGRvZXMgbm90CisgICAgICBzdXBwb3J0IExMUSBtb2RlLCB0aGUgZHJpdmVyIGZhbGxzIGJhY2sgdG8gdGhlIHJlZ3VsYXIgbW9kZS4KKworVGhlIGRyaXZlciBzdXBwb3J0cyBtdWx0aS1xdWV1ZSBmb3IgYm90aCBUeCBhbmQgUnguIFRoaXMgaGFzIHZhcmlvdXMKK2JlbmVmaXRzOgorLSBSZWR1Y2VkIENQVS90aHJlYWQvcHJvY2VzcyBjb250ZW50aW9uIG9uIGEgZ2l2ZW4gRXRoZXJuZXQgaW50ZXJmYWNlLgorLSBDYWNoZSBtaXNzIHJhdGUgb24gY29tcGxldGlvbiBpcyByZWR1Y2VkLCBwYXJ0aWN1bGFybHkgZm9yIGRhdGEKKyAgY2FjaGUgbGluZXMgdGhhdCBob2xkIHRoZSBza19idWZmIHN0cnVjdHVyZXMuCistIEluY3JlYXNlZCBwcm9jZXNzLWxldmVsIHBhcmFsbGVsaXNtIHdoZW4gaGFuZGxpbmcgcmVjZWl2ZWQgcGFja2V0cy4KKy0gSW5jcmVhc2VkIGRhdGEgY2FjaGUgaGl0IHJhdGUsIGJ5IHN0ZWVyaW5nIGtlcm5lbCBwcm9jZXNzaW5nIG9mCisgIHBhY2tldHMgdG8gdGhlIENQVSwgd2hlcmUgdGhlIGFwcGxpY2F0aW9uIHRocmVhZCBjb25zdW1pbmcgdGhlCisgIHBhY2tldCBpcyBydW5uaW5nLgorLSBJbiBoYXJkd2FyZSBpbnRlcnJ1cHQgcmUtZGlyZWN0aW9uLgorCitJbnRlcnJ1cHQgTW9kZXM6Cis9PT09PT09PT09PT09PT09CitUaGUgZHJpdmVyIGFzc2lnbnMgYSBzaW5nbGUgTVNJLVggdmVjdG9yIHBlciBxdWV1ZSBwYWlyIChmb3IgYm90aCBUeAorYW5kIFJ4IGRpcmVjdGlvbnMpLiBUaGUgZHJpdmVyIGFzc2lnbnMgYW4gYWRkaXRpb25hbCBkZWRpY2F0ZWQgTVNJLVggdmVjdG9yCitmb3IgbWFuYWdlbWVudCAoZm9yIEFDUSBhbmQgQUVOUSkuCisKK01hbmFnZW1lbnQgaW50ZXJydXB0IHJlZ2lzdHJhdGlvbiBpcyBwZXJmb3JtZWQgd2hlbiB0aGUgTGludXgga2VybmVsCitwcm9iZXMgdGhlIGFkYXB0ZXIsIGFuZCBpdCBpcyBkZS1yZWdpc3RlcmVkIHdoZW4gdGhlIGFkYXB0ZXIgaXMKK3JlbW92ZWQuIEkvTyBxdWV1ZSBpbnRlcnJ1cHQgcmVnaXN0cmF0aW9uIGlzIHBlcmZvcm1lZCB3aGVuIHRoZSBMaW51eAoraW50ZXJmYWNlIG9mIHRoZSBhZGFwdGVyIGlzIG9wZW5lZCwgYW5kIGl0IGlzIGRlLXJlZ2lzdGVyZWQgd2hlbiB0aGUKK2ludGVyZmFjZSBpcyBjbG9zZWQuCisKK1RoZSBtYW5hZ2VtZW50IGludGVycnVwdCBpcyBuYW1lZDoKKyAgIGVuYS1tZ21udEBwY2k6PFBDSSBkb21haW46YnVzOnNsb3QuZnVuY3Rpb24+CithbmQgZm9yIGVhY2ggcXVldWUgcGFpciwgYW4gaW50ZXJydXB0IGlzIG5hbWVkOgorICAgPGludGVyZmFjZSBuYW1lPi1UeC1SeC08cXVldWUgaW5kZXg+CisKK1RoZSBFTkEgZGV2aWNlIG9wZXJhdGVzIGluIGF1dG8tbWFzayBhbmQgYXV0by1jbGVhciBpbnRlcnJ1cHQKK21vZGVzLiBUaGF0IGlzLCBvbmNlIE1TSS1YIGlzIGRlbGl2ZXJlZCB0byB0aGUgaG9zdCwgaXRzIENhdXNlIGJpdCBpcworYXV0b21hdGljYWxseSBjbGVhcmVkIGFuZCB0aGUgaW50ZXJydXB0IGlzIG1hc2tlZC4gVGhlIGludGVycnVwdCBpcwordW5tYXNrZWQgYnkgdGhlIGRyaXZlciBhZnRlciBOQVBJIHByb2Nlc3NpbmcgaXMgY29tcGxldGUuCisKK0ludGVycnVwdCBNb2RlcmF0aW9uOgorPT09PT09PT09PT09PT09PT09PT09CitFTkEgZHJpdmVyIGFuZCBkZXZpY2UgY2FuIG9wZXJhdGUgaW4gY29udmVudGlvbmFsIG9yIGFkYXB0aXZlIGludGVycnVwdAorbW9kZXJhdGlvbiBtb2RlLgorCitJbiBjb252ZW50aW9uYWwgbW9kZSB0aGUgZHJpdmVyIGluc3RydWN0cyBkZXZpY2UgdG8gcG9zdHBvbmUgaW50ZXJydXB0Citwb3N0aW5nIGFjY29yZGluZyB0byBzdGF0aWMgaW50ZXJydXB0IGRlbGF5IHZhbHVlLiBUaGUgaW50ZXJydXB0IGRlbGF5Cit2YWx1ZSBjYW4gYmUgY29uZmlndXJlZCB0aHJvdWdoIGV0aHRvb2woOCkuIFRoZSBmb2xsb3dpbmcgZXRodG9vbAorcGFyYW1ldGVycyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXI6IHR4LXVzZWNzLCByeC11c2VjcworCitJbiBhZGFwdGl2ZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBtb2RlIHRoZSBpbnRlcnJ1cHQgZGVsYXkgdmFsdWUgaXMKK3VwZGF0ZWQgYnkgdGhlIGRyaXZlciBkeW5hbWljYWxseSBhbmQgYWRqdXN0ZWQgZXZlcnkgTkFQSSBjeWNsZQorYWNjb3JkaW5nIHRvIHRoZSB0cmFmZmljIG5hdHVyZS4KKworQnkgZGVmYXVsdCBFTkEgZHJpdmVyIGFwcGxpZXMgYWRhcHRpdmUgY29hbGVzY2luZyBvbiBSeCB0cmFmZmljIGFuZAorY29udmVudGlvbmFsIGNvYWxlc2Npbmcgb24gVHggdHJhZmZpYy4KKworQWRhcHRpdmUgY29hbGVzY2luZyBjYW4gYmUgc3dpdGNoZWQgb24vb2ZmIHRocm91Z2ggZXRodG9vbCg4KQorYWRhcHRpdmVfcnggb258b2ZmIHBhcmFtZXRlci4KKworVGhlIGRyaXZlciBjaG9vc2VzIGludGVycnVwdCBkZWxheSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZgorYnl0ZXMgYW5kIHBhY2tldHMgcmVjZWl2ZWQgYmV0d2VlbiBpbnRlcnJ1cHQgdW5tYXNraW5nIGFuZCBpbnRlcnJ1cHQKK3Bvc3RpbmcuIFRoZSBkcml2ZXIgdXNlcyBpbnRlcnJ1cHQgZGVsYXkgdGFibGUgdGhhdCBzdWJkaXZpZGVzIHRoZQorcmFuZ2Ugb2YgcmVjZWl2ZWQgYnl0ZXMvcGFja2V0cyBpbnRvIDUgbGV2ZWxzIGFuZCBhc3NpZ25zIGludGVycnVwdAorZGVsYXkgdmFsdWUgdG8gZWFjaCBsZXZlbC4KKworVGhlIHVzZXIgY2FuIGVuYWJsZS9kaXNhYmxlIGFkYXB0aXZlIG1vZGVyYXRpb24sIG1vZGlmeSB0aGUgaW50ZXJydXB0CitkZWxheSB0YWJsZSBhbmQgcmVzdG9yZSBpdHMgZGVmYXVsdCB2YWx1ZXMgdGhyb3VnaCBzeXNmcy4KKworVGhlIHJ4X2NvcHlicmVhayBpcyBpbml0aWFsaXplZCBieSBkZWZhdWx0IHRvIEVOQV9ERUZBVUxUX1JYX0NPUFlCUkVBSworYW5kIGNhbiBiZSBjb25maWd1cmVkIGJ5IHRoZSBFVEhUT09MX1NUVU5BQkxFIGNvbW1hbmQgb2YgdGhlCitTSU9DRVRIVE9PTCBpb2N0bC4KKworU0tCOgorVGhlIGRyaXZlci1hbGxvY2F0ZWQgU0tCIGZvciBmcmFtZXMgcmVjZWl2ZWQgZnJvbSBSeCBoYW5kbGluZyB1c2luZworTkFQSSBjb250ZXh0LiBUaGUgYWxsb2NhdGlvbiBtZXRob2QgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGUgcGFja2V0LgorSWYgdGhlIGZyYW1lIGxlbmd0aCBpcyBsYXJnZXIgdGhhbiByeF9jb3B5YnJlYWssIG5hcGlfZ2V0X2ZyYWdzKCkKK2lzIHVzZWQsIG90aGVyd2lzZSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKCkgaXMgdXNlZCwgdGhlIGJ1ZmZlcgorY29udGVudCBpcyBjb3BpZWQgKGJ5IENQVSkgdG8gdGhlIFNLQiwgYW5kIHRoZSBidWZmZXIgaXMgcmVjeWNsZWQuCisKK1N0YXRpc3RpY3M6Cis9PT09PT09PT09PQorVGhlIHVzZXIgY2FuIG9idGFpbiBFTkEgZGV2aWNlIGFuZCBkcml2ZXIgc3RhdGlzdGljcyB1c2luZyBldGh0b29sLgorVGhlIGRyaXZlciBjYW4gY29sbGVjdCByZWd1bGFyIG9yIGV4dGVuZGVkIHN0YXRpc3RpY3MgKGluY2x1ZGluZworcGVyLXF1ZXVlIHN0YXRzKSBmcm9tIHRoZSBkZXZpY2UuCisKK0luIGFkZGl0aW9uIHRoZSBkcml2ZXIgbG9ncyB0aGUgc3RhdHMgdG8gc3lzbG9nIHVwb24gZGV2aWNlIHJlc2V0LgorCitNVFU6Cis9PT09CitUaGUgZHJpdmVyIHN1cHBvcnRzIGFuIGFyYml0cmFyaWx5IGxhcmdlIE1UVSB3aXRoIGEgbWF4aW11bSB0aGF0IGlzCituZWdvdGlhdGVkIHdpdGggdGhlIGRldmljZS4gVGhlIGRyaXZlciBjb25maWd1cmVzIE1UVSB1c2luZyB0aGUKK1NldEZlYXR1cmUgY29tbWFuZCAoRU5BX0FETUlOX01UVSBwcm9wZXJ0eSkuIFRoZSB1c2VyIGNhbiBjaGFuZ2UgTVRVCit2aWEgaXAoOCkgYW5kIHNpbWlsYXIgbGVnYWN5IHRvb2xzLgorCitTdGF0ZWxlc3MgT2ZmbG9hZHM6Cis9PT09PT09PT09PT09PT09PT09CitUaGUgRU5BIGRyaXZlciBzdXBwb3J0czoKKy0gVFNPIG92ZXIgSVB2NC9JUHY2CistIFRTTyB3aXRoIEVDTgorLSBJUHY0IGhlYWRlciBjaGVja3N1bSBvZmZsb2FkCistIFRDUC9VRFAgb3ZlciBJUHY0L0lQdjYgY2hlY2tzdW0gb2ZmbG9hZHMKKworUlNTOgorPT09PQorLSBUaGUgRU5BIGRldmljZSBzdXBwb3J0cyBSU1MgdGhhdCBhbGxvd3MgZmxleGlibGUgUnggdHJhZmZpYworICBzdGVlcmluZy4KKy0gVG9lcGxpdHogYW5kIENSQzMyIGhhc2ggZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQuCistIERpZmZlcmVudCBjb21iaW5hdGlvbnMgb2YgTDIvTDMvTDQgZmllbGRzIGNhbiBiZSBjb25maWd1cmVkIGFzCisgIGlucHV0cyBmb3IgaGFzaCBmdW5jdGlvbnMuCistIFRoZSBkcml2ZXIgY29uZmlndXJlcyBSU1Mgc2V0dGluZ3MgdXNpbmcgdGhlIEFRIFNldEZlYXR1cmUgY29tbWFuZAorICAoRU5BX0FETUlOX1JTU19IQVNIX0ZVTkNUSU9OLCBFTkFfQURNSU5fUlNTX0hBU0hfSU5QVVQgYW5kCisgIEVOQV9BRE1JTl9SU1NfUkVESVJFQ1RJT05fVEFCTEVfQ09ORklHIHByb3BlcnRpZXMpLgorLSBJZiB0aGUgTkVUSUZfRl9SWEhBU0ggZmxhZyBpcyBzZXQsIHRoZSAzMi1iaXQgcmVzdWx0IG9mIHRoZSBoYXNoCisgIGZ1bmN0aW9uIGRlbGl2ZXJlZCBpbiB0aGUgUnggQ1EgZGVzY3JpcHRvciBpcyBzZXQgaW4gdGhlIHJlY2VpdmVkCisgIFNLQi4KKy0gVGhlIHVzZXIgY2FuIHByb3ZpZGUgYSBoYXNoIGtleSwgaGFzaCBmdW5jdGlvbiwgYW5kIGNvbmZpZ3VyZSB0aGUKKyAgaW5kaXJlY3Rpb24gdGFibGUgdGhyb3VnaCBldGh0b29sKDgpLgorCitEQVRBIFBBVEg6Cis9PT09PT09PT09CitUeDoKKy0tLQorZW5kX3N0YXJ0X3htaXQoKSBpcyBjYWxsZWQgYnkgdGhlIHN0YWNrLiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIGZvbGxvd2luZzoKKy0gTWFwcyBkYXRhIGJ1ZmZlcnMgKHNrYi0+ZGF0YSBhbmQgZnJhZ3MpLgorLSBQb3B1bGF0ZXMgZW5hX2J1ZiBmb3IgdGhlIHB1c2ggYnVmZmVyIChpZiB0aGUgZHJpdmVyIGFuZCBkZXZpY2UgYXJlCisgIGluIHB1c2ggbW9kZS4pCistIFByZXBhcmVzIEVOQSBidWZzIGZvciB0aGUgcmVtYWluaW5nIGZyYWdzLgorLSBBbGxvY2F0ZXMgYSBuZXcgcmVxdWVzdCBJRCBmcm9tIHRoZSBlbXB0eSByZXFfaWQgcmluZy4gVGhlIHJlcXVlc3QKKyAgSUQgaXMgdGhlIGluZGV4IG9mIHRoZSBwYWNrZXQgaW4gdGhlIFR4IGluZm8uIFRoaXMgaXMgdXNlZCBmb3IKKyAgb3V0LW9mLW9yZGVyIFRYIGNvbXBsZXRpb25zLgorLSBBZGRzIHRoZSBwYWNrZXQgdG8gdGhlIHByb3BlciBwbGFjZSBpbiB0aGUgVHggcmluZy4KKy0gQ2FsbHMgZW5hX2NvbV9wcmVwYXJlX3R4KCksIGFuIEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHRoYXQgY29udmVydHMKKyAgdGhlIGVuYV9idWZzIHRvIEVOQSBkZXNjcmlwdG9ycyAoYW5kIGFkZHMgbWV0YSBFTkEgZGVzY3JpcHRvcnMgYXMKKyAgbmVlZGVkLikKKyAgKiBUaGlzIGZ1bmN0aW9uIGFsc28gY29waWVzIHRoZSBFTkEgZGVzY3JpcHRvcnMgYW5kIHRoZSBwdXNoIGJ1ZmZlcgorICAgIHRvIHRoZSBEZXZpY2UgbWVtb3J5IHNwYWNlIChpZiBpbiBwdXNoIG1vZGUuKQorLSBXcml0ZXMgZG9vcmJlbGwgdG8gdGhlIEVOQSBkZXZpY2UuCistIFdoZW4gdGhlIEVOQSBkZXZpY2UgZmluaXNoZXMgc2VuZGluZyB0aGUgcGFja2V0LCBhIGNvbXBsZXRpb24KKyAgaW50ZXJydXB0IGlzIHJhaXNlZC4KKy0gVGhlIGludGVycnVwdCBoYW5kbGVyIHNjaGVkdWxlcyBOQVBJLgorLSBUaGUgZW5hX2NsZWFuX3R4X2lycSgpIGZ1bmN0aW9uIGlzIGNhbGxlZC4gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZQorICBjb21wbGV0aW9uIGRlc2NyaXB0b3JzIGdlbmVyYXRlZCBieSB0aGUgRU5BLCB3aXRoIGEgc2luZ2xlCisgIGNvbXBsZXRpb24gZGVzY3JpcHRvciBwZXIgY29tcGxldGVkIHBhY2tldC4KKyAgKiByZXFfaWQgaXMgcmV0cmlldmVkIGZyb20gdGhlIGNvbXBsZXRpb24gZGVzY3JpcHRvci4gVGhlIHR4X2luZm8gb2YKKyAgICB0aGUgcGFja2V0IGlzIHJldHJpZXZlZCB2aWEgdGhlIHJlcV9pZC4gVGhlIGRhdGEgYnVmZmVycyBhcmUKKyAgICB1bm1hcHBlZCBhbmQgcmVxX2lkIGlzIHJldHVybmVkIHRvIHRoZSBlbXB0eSByZXFfaWQgcmluZy4KKyAgKiBUaGUgZnVuY3Rpb24gc3RvcHMgd2hlbiB0aGUgY29tcGxldGlvbiBkZXNjcmlwdG9ycyBhcmUgY29tcGxldGVkIG9yCisgICAgdGhlIGJ1ZGdldCBpcyByZWFjaGVkLgorCitSeDoKKy0tLQorLSBXaGVuIGEgcGFja2V0IGlzIHJlY2VpdmVkIGZyb20gdGhlIEVOQSBkZXZpY2UuCistIFRoZSBpbnRlcnJ1cHQgaGFuZGxlciBzY2hlZHVsZXMgTkFQSS4KKy0gVGhlIGVuYV9jbGVhbl9yeF9pcnEoKSBmdW5jdGlvbiBpcyBjYWxsZWQuIFRoaXMgZnVuY3Rpb24gY2FsbHMKKyAgZW5hX3J4X3BrdCgpLCBhbiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyB0aGUKKyAgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHVzZWQgZm9yIGEgbmV3IHVuaGFuZGxlZCBwYWNrZXQsIGFuZCB6ZXJvIGlmCisgIG5vIG5ldyBwYWNrZXQgaXMgZm91bmQuCistIFRoZW4gaXQgY2FsbHMgdGhlIGVuYV9jbGVhbl9yeF9pcnEoKSBmdW5jdGlvbi4KKy0gZW5hX2V0aF9yeF9za2IoKSBjaGVja3MgcGFja2V0IGxlbmd0aDoKKyAgKiBJZiB0aGUgcGFja2V0IGlzIHNtYWxsIChsZW4gPCByeF9jb3B5YnJlYWspLCB0aGUgZHJpdmVyIGFsbG9jYXRlcworICAgIGEgU0tCIGZvciB0aGUgbmV3IHBhY2tldCwgYW5kIGNvcGllcyB0aGUgcGFja2V0IHBheWxvYWQgaW50byB0aGUKKyAgICBTS0IgZGF0YSBidWZmZXIuCisgICAgLSBJbiB0aGlzIHdheSB0aGUgb3JpZ2luYWwgZGF0YSBidWZmZXIgaXMgbm90IHBhc3NlZCB0byB0aGUgc3RhY2sKKyAgICAgIGFuZCBpcyByZXVzZWQgZm9yIGZ1dHVyZSBSeCBwYWNrZXRzLgorICAqIE90aGVyd2lzZSB0aGUgZnVuY3Rpb24gdW5tYXBzIHRoZSBSeCBidWZmZXIsIHRoZW4gYWxsb2NhdGVzIHRoZQorICAgIG5ldyBTS0Igc3RydWN0dXJlIGFuZCBob29rcyB0aGUgUnggYnVmZmVyIHRvIHRoZSBTS0IgZnJhZ3MuCistIFRoZSBuZXcgU0tCIGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIChwcm90b2NvbCwKKyAgY2hlY2tzdW0gaHcgdmVyaWZ5IHJlc3VsdCwgZXRjLiksIGFuZCB0aGVuIHBhc3NlZCB0byB0aGUgbmV0d29yaworICBzdGFjaywgdXNpbmcgdGhlIE5BUEkgaW50ZXJmYWNlIGZ1bmN0aW9uIG5hcGlfZ3JvX3JlY2VpdmUoKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQKaW5kZXggOWFlOTI5My4uM2RiOGM2NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwLXN5c2N0bC50eHQKQEAgLTU3NSwzMiArNTc1LDMzIEBACiAJdW5jb25kaXRpb25hbGx5IGdlbmVyYXRpb24gb2Ygc3luY29va2llcy4KIAogdGNwX2Zhc3RvcGVuIC0gSU5URUdFUgotCUVuYWJsZSBUQ1AgRmFzdCBPcGVuIGZlYXR1cmUgKGRyYWZ0LWlldGYtdGNwbS1mYXN0b3BlbikgdG8gc2VuZCBkYXRhCi0JaW4gdGhlIG9wZW5pbmcgU1lOIHBhY2tldC4gVG8gdXNlIHRoaXMgZmVhdHVyZSwgdGhlIGNsaWVudCBhcHBsaWNhdGlvbgotCW11c3QgdXNlIHNlbmRtc2coKSBvciBzZW5kdG8oKSB3aXRoIE1TR19GQVNUT1BFTiBmbGFnIHJhdGhlciB0aGFuCi0JY29ubmVjdCgpIHRvIHBlcmZvcm0gYSBUQ1AgaGFuZHNoYWtlIGF1dG9tYXRpY2FsbHkuCisJRW5hYmxlIFRDUCBGYXN0IE9wZW4gKFJGQzc0MTMpIHRvIHNlbmQgYW5kIGFjY2VwdCBkYXRhIGluIHRoZSBvcGVuaW5nCisJU1lOIHBhY2tldC4KKworCVRoZSBjbGllbnQgc3VwcG9ydCBpcyBlbmFibGVkIGJ5IGZsYWcgMHgxIChvbiBieSBkZWZhdWx0KS4gVGhlIGNsaWVudAorCXRoZW4gbXVzdCB1c2Ugc2VuZG1zZygpIG9yIHNlbmR0bygpIHdpdGggdGhlIE1TR19GQVNUT1BFTiBmbGFnLAorCXJhdGhlciB0aGFuIGNvbm5lY3QoKSB0byBzZW5kIGRhdGEgaW4gU1lOLgorCisJVGhlIHNlcnZlciBzdXBwb3J0IGlzIGVuYWJsZWQgYnkgZmxhZyAweDIgKG9mZiBieSBkZWZhdWx0KS4gVGhlbgorCWVpdGhlciBlbmFibGUgZm9yIGFsbCBsaXN0ZW5lcnMgd2l0aCBhbm90aGVyIGZsYWcgKDB4NDAwKSBvcgorCWVuYWJsZSBpbmRpdmlkdWFsIGxpc3RlbmVycyB2aWEgVENQX0ZBU1RPUEVOIHNvY2tldCBvcHRpb24gd2l0aAorCXRoZSBvcHRpb24gdmFsdWUgYmVpbmcgdGhlIGxlbmd0aCBvZiB0aGUgc3luLWRhdGEgYmFja2xvZy4KIAogCVRoZSB2YWx1ZXMgKGJpdG1hcCkgYXJlCi0JMTogRW5hYmxlcyBzZW5kaW5nIGRhdGEgaW4gdGhlIG9wZW5pbmcgU1lOIG9uIHRoZSBjbGllbnQgdy8gTVNHX0ZBU1RPUEVOLgotCTI6IEVuYWJsZXMgVENQIEZhc3QgT3BlbiBvbiB0aGUgc2VydmVyIHNpZGUsIGkuZS4sIGFsbG93aW5nIGRhdGEgaW4KLQkgICBhIFNZTiBwYWNrZXQgdG8gYmUgYWNjZXB0ZWQgYW5kIHBhc3NlZCB0byB0aGUgYXBwbGljYXRpb24gYmVmb3JlCi0JICAgMy13YXkgaGFuZCBzaGFrZSBmaW5pc2hlcy4KLQk0OiBTZW5kIGRhdGEgaW4gdGhlIG9wZW5pbmcgU1lOIHJlZ2FyZGxlc3Mgb2YgY29va2llIGF2YWlsYWJpbGl0eSBhbmQKLQkgICB3aXRob3V0IGEgY29va2llIG9wdGlvbi4KLQkweDEwMDogQWNjZXB0IFNZTiBkYXRhIHcvbyB2YWxpZGF0aW5nIHRoZSBjb29raWUuCi0JMHgyMDA6IEFjY2VwdCBkYXRhLWluLVNZTiB3L28gYW55IGNvb2tpZSBvcHRpb24gcHJlc2VudC4KLQkweDQwMC8weDgwMDogRW5hYmxlIEZhc3QgT3BlbiBvbiBhbGwgbGlzdGVuZXJzIHJlZ2FyZGxlc3Mgb2YgdGhlCi0JICAgVENQX0ZBU1RPUEVOIHNvY2tldCBvcHRpb24uIFRoZSB0d28gZGlmZmVyZW50IGZsYWdzIGRlc2lnbmF0ZSB0d28KLQkgICBkaWZmZXJlbnQgd2F5cyBvZiBzZXR0aW5nIG1heF9xbGVuIHdpdGhvdXQgdGhlIFRDUF9GQVNUT1BFTiBzb2NrZXQKLQkgICBvcHRpb24uCisJICAweDE6IChjbGllbnQpIGVuYWJsZXMgc2VuZGluZyBkYXRhIGluIHRoZSBvcGVuaW5nIFNZTiBvbiB0aGUgY2xpZW50LgorCSAgMHgyOiAoc2VydmVyKSBlbmFibGVzIHRoZSBzZXJ2ZXIgc3VwcG9ydCwgaS5lLiwgYWxsb3dpbmcgZGF0YSBpbgorCQkJYSBTWU4gcGFja2V0IHRvIGJlIGFjY2VwdGVkIGFuZCBwYXNzZWQgdG8gdGhlCisJCQlhcHBsaWNhdGlvbiBiZWZvcmUgMy13YXkgaGFuZHNoYWtlIGZpbmlzaGVzLgorCSAgMHg0OiAoY2xpZW50KSBzZW5kIGRhdGEgaW4gdGhlIG9wZW5pbmcgU1lOIHJlZ2FyZGxlc3Mgb2YgY29va2llCisJCQlhdmFpbGFiaWxpdHkgYW5kIHdpdGhvdXQgYSBjb29raWUgb3B0aW9uLgorCTB4MjAwOiAoc2VydmVyKSBhY2NlcHQgZGF0YS1pbi1TWU4gdy9vIGFueSBjb29raWUgb3B0aW9uIHByZXNlbnQuCisJMHg0MDA6IChzZXJ2ZXIpIGVuYWJsZSBhbGwgbGlzdGVuZXJzIHRvIHN1cHBvcnQgRmFzdCBPcGVuIGJ5CisJCQlkZWZhdWx0IHdpdGhvdXQgZXhwbGljaXQgVENQX0ZBU1RPUEVOIHNvY2tldCBvcHRpb24uCiAKLQlEZWZhdWx0OiAxCisJRGVmYXVsdDogMHgxCiAKLQlOb3RlIHRoYXQgdGhlIGNsaWVudCAmIHNlcnZlciBzaWRlIEZhc3QgT3BlbiBmbGFncyAoMSBhbmQgMgotCXJlc3BlY3RpdmVseSkgbXVzdCBiZSBhbHNvIGVuYWJsZWQgYmVmb3JlIHRoZSByZXN0IG9mIGZsYWdzIGNhbiB0YWtlCi0JZWZmZWN0LgotCi0JU2VlIGluY2x1ZGUvbmV0L3RjcC5oIGFuZCB0aGUgY29kZSBmb3IgbW9yZSBkZXRhaWxzLgorCU5vdGUgdGhhdCB0aGF0IGFkZGl0aW9uYWwgY2xpZW50IG9yIHNlcnZlciBmZWF0dXJlcyBhcmUgb25seQorCWVmZmVjdGl2ZSBpZiB0aGUgYmFzaWMgc3VwcG9ydCAoMHgxIGFuZCAweDIpIGFyZSBlbmFibGVkIHJlc3BlY3RpdmVseS4KIAogdGNwX3N5bl9yZXRyaWVzIC0gSU5URUdFUgogCU51bWJlciBvZiB0aW1lcyBpbml0aWFsIFNZTnMgZm9yIGFuIGFjdGl2ZSBUQ1AgY29ubmVjdGlvbiBhdHRlbXB0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXB2bGFuLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcHZsYW4udHh0CmluZGV4IDE0NDIyZjguLjI0MTk2Y2UgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcHZsYW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcHZsYW4udHh0CkBAIC0yMiw3ICsyMiw3IEBACiAJVGhlcmUgYXJlIG5vIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGRyaXZlciBhbmQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQKIHVzaW5nIElQcm91dGUyL2lwIHV0aWxpdHkuCiAKLQlpcCBsaW5rIGFkZCBsaW5rIDxtYXN0ZXItZGV2PiA8c2xhdmUtZGV2PiB0eXBlIGlwdmxhbiBtb2RlIHsgbDIgfCBMMyB9CisJaXAgbGluayBhZGQgbGluayA8bWFzdGVyLWRldj4gPHNsYXZlLWRldj4gdHlwZSBpcHZsYW4gbW9kZSB7IGwyIHwgbDMgfCBsM3MgfQogCiAJZS5nLiBpcCBsaW5rIGFkZCBsaW5rIGlwdmwwIGV0aDAgdHlwZSBpcHZsYW4gbW9kZSBsMgogCkBAIC00OCw2ICs0OCwxMSBAQAogdXNlZCBiZWZvcmUgcGFja2V0cyBhcmUgcXVldWVkIG9uIHRoZSBvdXRib3VuZCBkZXZpY2UuIEluIHRoaXMgbW9kZSB0aGUgc2xhdmVzCiB3aWxsIG5vdCByZWNlaXZlIG5vciBjYW4gc2VuZCBtdWx0aWNhc3QgLyBicm9hZGNhc3QgdHJhZmZpYy4KIAorNC4zIEwzUyBtb2RlOgorCVRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBMMyBtb2RlIGV4Y2VwdCB0aGF0IGlwdGFibGVzIChjb25uLXRyYWNraW5nKQord29ya3MgaW4gdGhpcyBtb2RlIGFuZCBoZW5jZSBpdCBpcyBMMy1zeW1tZXRyaWMgKEwzcykuIFRoaXMgd2lsbCBoYXZlIHNsaWdodGx5IGxlc3MKK3BlcmZvcm1hbmNlIGJ1dCB0aGF0IHNob3VsZG4ndCBtYXR0ZXIgc2luY2UgeW91IGFyZSBjaG9vc2luZyB0aGlzIG1vZGUgb3ZlciBwbGFpbi1MMworbW9kZSB0byBtYWtlIGNvbm4tdHJhY2tpbmcgd29yay4KIAogNS4gV2hhdCB0byBjaG9vc2UgKG1hY3ZsYW4gdnMuIGlwdmxhbik/CiAJVGhlc2UgdHdvIGRldmljZXMgYXJlIHZlcnkgc2ltaWxhciBpbiBtYW55IHJlZ2FyZHMgYW5kIHRoZSBzcGVjaWZpYyB1c2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcnhycGMudHh0CmluZGV4IDcwYzkyNmEuLjFiNjNiYmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yeHJwYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dApAQCAtNzI1LDcgKzcyNSw4IEBACiAKICAoKikgRW5kIGEgY2xpZW50IGNhbGwuCiAKLQl2b2lkIHJ4cnBjX2tlcm5lbF9lbmRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CisJdm9pZCByeHJwY19rZXJuZWxfZW5kX2NhbGwoc3RydWN0IHNvY2tldCAqc29jaywKKwkJCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CiAKICAgICAgVGhpcyBpcyB1c2VkIHRvIGVuZCBhIHByZXZpb3VzbHkgYmVndW4gY2FsbC4gIFRoZSB1c2VyX2NhbGxfSUQgaXMgZXhwdW5nZWQKICAgICAgZnJvbSBBRl9SWFJQQydzIGtub3dsZWRnZSBhbmQgd2lsbCBub3QgYmUgc2VlbiBhZ2FpbiBpbiBhc3NvY2lhdGlvbiB3aXRoCkBAIC03MzMsNyArNzM0LDkgQEAKIAogICgqKSBTZW5kIGRhdGEgdGhyb3VnaCBhIGNhbGwuCiAKLQlpbnQgcnhycGNfa2VybmVsX3NlbmRfZGF0YShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IG1zZ2hkciAqbXNnLAorCWludCByeHJwY19rZXJuZWxfc2VuZF9kYXRhKHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLAogCQkJCSAgIHNpemVfdCBsZW4pOwogCiAgICAgIFRoaXMgaXMgdXNlZCB0byBzdXBwbHkgZWl0aGVyIHRoZSByZXF1ZXN0IHBhcnQgb2YgYSBjbGllbnQgY2FsbCBvciB0aGUKQEAgLTc0NSw5ICs3NDgsNDIgQEAKICAgICAgVGhlIG1zZyBtdXN0IG5vdCBzcGVjaWZ5IGEgZGVzdGluYXRpb24gYWRkcmVzcywgY29udHJvbCBkYXRhIG9yIGFueSBmbGFncwogICAgICBvdGhlciB0aGFuIE1TR19NT1JFLiAgbGVuIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZGF0YSB0byB0cmFuc21pdC4KIAorICgqKSBSZWNlaXZlIGRhdGEgZnJvbSBhIGNhbGwuCisKKwlpbnQgcnhycGNfa2VybmVsX3JlY3ZfZGF0YShzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCSAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgIHZvaWQgKmJ1ZiwKKwkJCQkgICBzaXplX3Qgc2l6ZSwKKwkJCQkgICBzaXplX3QgKl9vZmZzZXQsCisJCQkJICAgYm9vbCB3YW50X21vcmUsCisJCQkJICAgdTMyICpfYWJvcnQpCisKKyAgICAgIFRoaXMgaXMgdXNlZCB0byByZWNlaXZlIGRhdGEgZnJvbSBlaXRoZXIgdGhlIHJlcGx5IHBhcnQgb2YgYSBjbGllbnQgY2FsbAorICAgICAgb3IgdGhlIHJlcXVlc3QgcGFydCBvZiBhIHNlcnZpY2UgY2FsbC4gIGJ1ZiBhbmQgc2l6ZSBzcGVjaWZ5IGhvdyBtdWNoCisgICAgICBkYXRhIGlzIGRlc2lyZWQgYW5kIHdoZXJlIHRvIHN0b3JlIGl0LiAgKl9vZmZzZXQgaXMgYWRkZWQgb24gdG8gYnVmIGFuZAorICAgICAgc3VidHJhY3RlZCBmcm9tIHNpemUgaW50ZXJuYWxseTsgdGhlIGFtb3VudCBjb3BpZWQgaW50byB0aGUgYnVmZmVyIGlzCisgICAgICBhZGRlZCB0byAqX29mZnNldCBiZWZvcmUgcmV0dXJuaW5nLgorCisgICAgICB3YW50X21vcmUgc2hvdWxkIGJlIHRydWUgaWYgZnVydGhlciBkYXRhIHdpbGwgYmUgcmVxdWlyZWQgYWZ0ZXIgdGhpcyBpcworICAgICAgc2F0aXNmaWVkIGFuZCBmYWxzZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIHJlY2VpdmUgcGhhc2UuCisKKyAgICAgIFRoZXJlIGFyZSB0aHJlZSBub3JtYWwgcmV0dXJuczogMCBpZiB0aGUgYnVmZmVyIHdhcyBmaWxsZWQgYW5kIHdhbnRfbW9yZQorICAgICAgd2FzIHRydWU7IDEgaWYgdGhlIGJ1ZmZlciB3YXMgZmlsbGVkLCB0aGUgbGFzdCBEQVRBIHBhY2tldCBoYXMgYmVlbgorICAgICAgZW1wdGllZCBhbmQgd2FudF9tb3JlIHdhcyBmYWxzZTsgYW5kIC1FQUdBSU4gaWYgdGhlIGZ1bmN0aW9uIG5lZWRzIHRvIGJlCisgICAgICBjYWxsZWQgYWdhaW4uCisKKyAgICAgIElmIHRoZSBsYXN0IERBVEEgcGFja2V0IGlzIHByb2Nlc3NlZCBidXQgdGhlIGJ1ZmZlciBjb250YWlucyBsZXNzIHRoYW4KKyAgICAgIHRoZSBhbW91bnQgcmVxdWVzdGVkLCBFQkFETVNHIGlzIHJldHVybmVkLiAgSWYgd2FudF9tb3JlIHdhc24ndCBzZXQsIGJ1dAorICAgICAgbW9yZSBkYXRhIHdhcyBhdmFpbGFibGUsIEVNU0dTSVpFIGlzIHJldHVybmVkLgorCisgICAgICBJZiBhIHJlbW90ZSBBQk9SVCBpcyBkZXRlY3RlZCwgdGhlIGFib3J0IGNvZGUgcmVjZWl2ZWQgd2lsbCBiZSBzdG9yZWQgaW4KKyAgICAgICpfYWJvcnQgYW5kIEVDT05OQUJPUlRFRCB3aWxsIGJlIHJldHVybmVkLgorCiAgKCopIEFib3J0IGEgY2FsbC4KIAotCXZvaWQgcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHUzMiBhYm9ydF9jb2RlKTsKKwl2b2lkIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJICAgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgIHUzMiBhYm9ydF9jb2RlKTsKIAogICAgICBUaGlzIGlzIHVzZWQgdG8gYWJvcnQgYSBjYWxsIGlmIGl0J3Mgc3RpbGwgaW4gYW4gYWJvcnRhYmxlIHN0YXRlLiAgVGhlCiAgICAgIGFib3J0IGNvZGUgc3BlY2lmaWVkIHdpbGwgYmUgcGxhY2VkIGluIHRoZSBBQk9SVCBtZXNzYWdlIHNlbnQuCkBAIC04MjAsNDcgKzg1Niw2IEBACiAgICAgIE90aGVyIGVycm9ycyBtYXkgYmUgcmV0dXJuZWQgaWYgdGhlIGNhbGwgaGFkIGJlZW4gYWJvcnRlZCAoLUVDT05OQUJPUlRFRCkKICAgICAgb3IgaGFkIHRpbWVkIG91dCAoLUVUSU1FKS4KIAotICgqKSBSZWNvcmQgdGhlIGRlbGl2ZXJ5IG9mIGEgZGF0YSBtZXNzYWdlLgotCi0Jdm9pZCByeHJwY19rZXJuZWxfZGF0YV9jb25zdW1lZChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLSAgICAgVGhpcyBpcyB1c2VkIHRvIHJlY29yZCBhIGRhdGEgbWVzc2FnZSBhcyBoYXZpbmcgYmVlbiBjb25zdW1lZCBhbmQgdG8KLSAgICAgdXBkYXRlIHRoZSBBQ0sgc3RhdGUgZm9yIHRoZSBjYWxsLiAgVGhlIG1lc3NhZ2UgbXVzdCBzdGlsbCBiZSBwYXNzZWQgdG8KLSAgICAgcnhycGNfa2VybmVsX2ZyZWVfc2tiKCkgZm9yIGRpc3Bvc2FsIGJ5IHRoZSBjYWxsZXIuCi0KLSAoKikgRnJlZSBhIG1lc3NhZ2UuCi0KLQl2b2lkIHJ4cnBjX2tlcm5lbF9mcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotICAgICBUaGlzIGlzIHVzZWQgdG8gZnJlZSBhIG5vbi1EQVRBIHNvY2tldCBidWZmZXIgaW50ZXJjZXB0ZWQgZnJvbSBhbiBBRl9SWFJQQwotICAgICBzb2NrZXQuCi0KLSAoKikgRGV0ZXJtaW5lIGlmIGEgZGF0YSBtZXNzYWdlIGlzIHRoZSBsYXN0IG9uZSBvbiBhIGNhbGwuCi0KLQlib29sIHJ4cnBjX2tlcm5lbF9pc19kYXRhX2xhc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLSAgICAgVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBhIHNvY2tldCBidWZmZXIgaG9sZHMgdGhlIGxhc3QgZGF0YSBtZXNzYWdlCi0gICAgIHRvIGJlIHJlY2VpdmVkIGZvciBhIGNhbGwgKHRydWUgd2lsbCBiZSByZXR1cm5lZCBpZiBpdCBkb2VzLCBmYWxzZQotICAgICBpZiBub3QpLgotCi0gICAgIFRoZSBkYXRhIG1lc3NhZ2Ugd2lsbCBiZSBwYXJ0IG9mIHRoZSByZXBseSBvbiBhIGNsaWVudCBjYWxsIGFuZCB0aGUKLSAgICAgcmVxdWVzdCBvbiBhbiBpbmNvbWluZyBjYWxsLiAgSW4gdGhlIGxhdHRlciBjYXNlIHRoZXJlIHdpbGwgYmUgbW9yZQotICAgICBtZXNzYWdlcywgYnV0IGluIHRoZSBmb3JtZXIgY2FzZSB0aGVyZSB3aWxsIG5vdC4KLQotICgqKSBHZXQgdGhlIGFib3J0IGNvZGUgZnJvbSBhbiBhYm9ydCBtZXNzYWdlLgotCi0JdTMyIHJ4cnBjX2tlcm5lbF9nZXRfYWJvcnRfY29kZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotICAgICBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgYWJvcnQgY29kZSBmcm9tIGEgcmVtb3RlIGFib3J0IG1lc3NhZ2UuCi0KLSAoKikgR2V0IHRoZSBlcnJvciBudW1iZXIgZnJvbSBhIGxvY2FsIG9yIG5ldHdvcmsgZXJyb3IgbWVzc2FnZS4KLQotCWludCByeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQotICAgICBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgZXJyb3IgbnVtYmVyIGZyb20gYSBtZXNzYWdlIGluZGljYXRpbmcgZWl0aGVyCi0gICAgIGEgbG9jYWwgZXJyb3Igb2NjdXJyZWQgb3IgYSBuZXR3b3JrIGVycm9yIG9jY3VycmVkLgotCiAgKCopIEFsbG9jYXRlIGEgbnVsbCBrZXkgZm9yIGRvaW5nIGFub255bW91cyBzZWN1cml0eS4KIAogCXN0cnVjdCBrZXkgKnJ4cnBjX2dldF9udWxsX2tleShjb25zdCBjaGFyICprZXluYW1lKTsKQEAgLTg2OCw2ICs4NjMsMTMgQEAKICAgICAgVGhpcyBpcyB1c2VkIHRvIGFsbG9jYXRlIGEgbnVsbCBSeFJQQyBrZXkgdGhhdCBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZQogICAgICBhbm9ueW1vdXMgc2VjdXJpdHkgZm9yIGEgcGFydGljdWxhciBkb21haW4uCiAKKyAoKikgR2V0IHRoZSBwZWVyIGFkZHJlc3Mgb2YgYSBjYWxsLgorCisJdm9pZCByeHJwY19rZXJuZWxfZ2V0X3BlZXIoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICpfc3J4KTsKKworICAgICBUaGlzIGlzIHVzZWQgdG8gZmluZCB0aGUgcmVtb3RlIHBlZXIgYWRkcmVzcyBvZiBhIGNhbGwuCisKIAogPT09PT09PT09PT09PT09PT09PT09PT0KIENPTkZJR1VSQUJMRSBQQVJBTUVURVJTCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc3RycGFyc2VyLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zdHJwYXJzZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYmY1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc3RycGFyc2VyLnR4dApAQCAtMCwwICsxLDEzNiBAQAorU3RyZWFtIFBhcnNlcgorLS0tLS0tLS0tLS0tLQorCitUaGUgc3RyZWFtIHBhcnNlciAoc3RycGFyc2VyKSBpcyBhIHV0aWxpdHkgdGhhdCBwYXJzZXMgbWVzc2FnZXMgb2YgYW4KK2FwcGxpY2F0aW9uIGxheWVyIHByb3RvY29sIHJ1bm5pbmcgb3ZlciBhIFRDUCBjb25uZWN0aW9uLiBUaGUgc3RyZWFtCitwYXJzZXIgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCBhbiB1cHBlciBsYXllciBpbiB0aGUga2VybmVsIHRvIHByb3ZpZGUKK2tlcm5lbCBzdXBwb3J0IGZvciBhcHBsaWNhdGlvbiBsYXllciBtZXNzYWdlcy4gRm9yIGluc3RhbmNlLCBLZXJuZWwKK0Nvbm5lY3Rpb24gTXVsdGlwbGV4b3IgKEtDTSkgdXNlcyB0aGUgU3RyZWFtIFBhcnNlciB0byBwYXJzZSBtZXNzYWdlcwordXNpbmcgYSBCUEYgcHJvZ3JhbS4KKworSW50ZXJmYWNlCistLS0tLS0tLS0KKworVGhlIEFQSSBpbmNsdWRlcyBhIGNvbnRleHQgc3RydWN0dXJlLCBhIHNldCBvZiBjYWxsYmFja3MsIHV0aWxpdHkKK2Z1bmN0aW9ucywgYW5kIGEgZGF0YV9yZWFkeSBmdW5jdGlvbi4gVGhlIGNhbGxiYWNrcyBpbmNsdWRlCithIHBhcnNlX21zZyBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBwZXJmb3JtIHBhcnNpbmcgKGUuZy4KK0JQRiBwYXJzaW5nIGluIGNhc2Ugb2YgS0NNKSwgYW5kIGEgcmN2X21zZyBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZAord2hlbiBhIGZ1bGwgbWVzc2FnZSBoYXMgYmVlbiBjb21wbGV0ZWQuCisKK0Egc3RyZWFtIHBhcnNlciBjYW4gYmUgaW5zdGFudGlhdGVkIGZvciBhIFRDUCBjb25uZWN0aW9uLiBUaGlzIGlzIGRvbmUKK2J5OgorCitzdHJwX2luaXQoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgc3RydWN0IHNvY2sgKmNzaywKKwkgIHN0cnVjdCBzdHJwX2NhbGxiYWNrcyAqY2IpCisKK3N0cnAgaXMgYSBzdHJ1Y3Qgb2YgdHlwZSBzdHJwYXJzZXIgdGhhdCBpcyBhbGxvY2F0ZWQgYnkgdGhlIHVwcGVyIGxheWVyLgorY3NrIGlzIHRoZSBUQ1Agc29ja2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyZWFtIHBhcnNlci4gQ2FsbGJhY2tzIGFyZQorY2FsbGVkIGJ5IHRoZSBzdHJlYW0gcGFyc2VyLgorCitDYWxsYmFja3MKKy0tLS0tLS0tLQorCitUaGVyZSBhcmUgZm91ciBjYWxsYmFja3M6CisKK2ludCAoKnBhcnNlX21zZykoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKyAgICBwYXJzZV9tc2cgaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBuZXh0IG1lc3NhZ2UKKyAgICBpbiB0aGUgc3RyZWFtLiBUaGUgdXBwZXIgbGF5ZXIgbXVzdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbi4gSXQKKyAgICBzaG91bGQgcGFyc2UgdGhlIHNrX2J1ZmYgYXMgY29udGFpbmluZyB0aGUgaGVhZGVycyBmb3IgdGhlCisgICAgbmV4dCBhcHBsaWNhdGlvbiBsYXllciBtZXNzYWdlcyBpbiB0aGUgc3RyZWFtLgorCisgICAgVGhlIHNrYi0+Y2IgaW4gdGhlIGlucHV0IHNrYiBpcyBhIHN0cnVjdCBzdHJwX3J4X21zZy4gT25seQorICAgIHRoZSBvZmZzZXQgZmllbGQgaXMgcmVsZXZhbnQgaW4gcGFyc2VfbXNnIGFuZCBnaXZlcyB0aGUgb2Zmc2V0CisgICAgd2hlcmUgdGhlIG1lc3NhZ2Ugc3RhcnRzIGluIHRoZSBza2IuCisKKyAgICBUaGUgcmV0dXJuIHZhbHVlcyBvZiB0aGlzIGZ1bmN0aW9uIGFyZToKKworICAgID4wIDogaW5kaWNhdGVzIGxlbmd0aCBvZiBzdWNjZXNzZnVsbHkgcGFyc2VkIG1lc3NhZ2UKKyAgICAwICA6IGluZGljYXRlcyBtb3JlIGRhdGEgbXVzdCBiZSByZWNlaXZlZCB0byBwYXJzZSB0aGUgbWVzc2FnZQorICAgIC1FU1RSUElQRSA6IGN1cnJlbnQgbWVzc2FnZSBzaG91bGQgbm90IGJlIHByb2Nlc3NlZCBieSB0aGUKKyAgICAgICAgICBrZXJuZWwsIHJldHVybiBjb250cm9sIG9mIHRoZSBzb2NrZXQgdG8gdXNlcnNwYWNlIHdoaWNoCisgICAgICAgICAgY2FuIHByb2NlZWQgdG8gcmVhZCB0aGUgbWVzc2FnZXMgaXRzZWxmCisgICAgb3RoZXIgPCAwIDogRXJyb3IgaXMgcGFyc2luZywgZ2l2ZSBjb250cm9sIGJhY2sgdG8gdXNlcnNwYWNlCisgICAgICAgICAgYXNzdW1pbmcgdGhhdCBzeW5jaHJvbml6YXRpb24gaXMgbG9zdCBhbmQgdGhlIHN0cmVhbQorICAgICAgICAgIGlzIHVucmVjb3ZlcmFibGUgKGFwcGxpY2F0aW9uIGV4cGVjdGVkIHRvIGNsb3NlIFRDUCBzb2NrZXQpCisKKyAgICBJbiB0aGUgY2FzZSB0aGF0IGFuIGVycm9yIGlzIHJldHVybmVkIChyZXR1cm4gdmFsdWUgaXMgbGVzcyB0aGFuCisgICAgemVybykgdGhlIHN0cmVhbSBwYXJzZXIgd2lsbCBzZXQgdGhlIGVycm9yIG9uIFRDUCBzb2NrZXQgYW5kIHdha2UKKyAgICBpdCB1cC4gSWYgcGFyc2VfbXNnIHJldHVybmVkIC1FU1RSUElQRSBhbmQgdGhlIHN0cmVhbSBwYXJzZXIgaGFkCisgICAgcHJldmlvdXNseSByZWFkIHNvbWUgYnl0ZXMgZm9yIHRoZSBjdXJyZW50IG1lc3NhZ2UsIHRoZW4gdGhlIGVycm9yCisgICAgc2V0IG9uIHRoZSBhdHRhY2hlZCBzb2NrZXQgaXMgRU5PREFUQSBzaW5jZSB0aGUgc3RyZWFtIGlzCisgICAgdW5yZWNvdmVyYWJsZSBpbiB0aGF0IGNhc2UuCisKK3ZvaWQgKCpyY3ZfbXNnKShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKworICAgIHJjdl9tc2cgaXMgY2FsbGVkIHdoZW4gYSBmdWxsIG1lc3NhZ2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kCisgICAgaXMgcXVldWVkLiBUaGUgY2FsbGVlIG11c3QgY29uc3VtZSB0aGUgc2tfYnVmZjsgaXQgY2FuCisgICAgY2FsbCBzdHJwX3BhdXNlIHRvIHByZXZlbnQgYW55IGZ1cnRoZXIgbWVzc2FnZXMgZnJvbSBiZWluZworICAgIHJlY2VpdmVkIGluIHJjdl9tc2cgKHNlZSBzdHJwX3BhdXNlIGJlbG93KS4gVGhpcyBjYWxsYmFjaworICAgIG11c3QgYmUgc2V0LgorCisgICAgVGhlIHNrYi0+Y2IgaW4gdGhlIGlucHV0IHNrYiBpcyBhIHN0cnVjdCBzdHJwX3J4X21zZy4gVGhpcworICAgIHN0cnVjdCBjb250YWlucyB0d28gZmllbGRzOiBvZmZzZXQgYW5kIGZ1bGxfbGVuLiBPZmZzZXQgaXMKKyAgICB3aGVyZSB0aGUgbWVzc2FnZSBzdGFydHMgaW4gdGhlIHNrYiwgYW5kIGZ1bGxfbGVuIGlzIHRoZQorICAgIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UuIHNrYi0+bGVuIC0gb2Zmc2V0IG1heSBiZSBncmVhdGVyCisgICAgdGhlbiBmdWxsX2xlbiBzaW5jZSBzdHJwYXJzZXIgZG9lcyBub3QgdHJpbSB0aGUgc2tiLgorCitpbnQgKCpyZWFkX3NvY2tfZG9uZSkoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgaW50IGVycik7CisKKyAgICAgcmVhZF9zb2NrX2RvbmUgaXMgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBwYXJzZXIgaXMgZG9uZSByZWFkaW5nCisgICAgIHRoZSBUQ1Agc29ja2V0LiBUaGUgc3RyZWFtIHBhcnNlciBtYXkgcmVhZCBtdWx0aXBsZSBtZXNzYWdlcworICAgICBpbiBhIGxvb3AgYW5kIHRoaXMgZnVuY3Rpb24gYWxsb3dzIGNsZWFudXAgdG8gb2NjdXIgd2hlbiBleGlzdGluZworICAgICB0aGUgbG9vcC4gSWYgdGhlIGNhbGxiYWNrIGlzIG5vdCBzZXQgKE5VTEwgaW4gc3RycF9pbml0KSBhCisgICAgIGRlZmF1bHQgZnVuY3Rpb24gaXMgdXNlZC4KKwordm9pZCAoKmFib3J0X3BhcnNlcikoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgaW50IGVycik7CisKKyAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBzdHJlYW0gcGFyc2VyIGVuY291bnRlcnMgYW4gZXJyb3IKKyAgICAgaW4gcGFyc2luZy4gVGhlIGRlZmF1bHQgZnVuY3Rpb24gc3RvcHMgdGhlIHN0cmVhbSBwYXJzZXIgZm9yIHRoZQorICAgICBUQ1Agc29ja2V0IGFuZCBzZXRzIHRoZSBlcnJvciBpbiB0aGUgc29ja2V0LiBUaGUgZGVmYXVsdCBmdW5jdGlvbgorICAgICBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nIHRoZSBjYWxsYmFjayB0byBub24tTlVMTCBpbiBzdHJwX2luaXQuCisKK0Z1bmN0aW9ucworLS0tLS0tLS0tCisKK1RoZSB1cHBlciBsYXllciBjYWxscyBzdHJwX3RjcF9kYXRhX3JlYWR5IHdoZW4gZGF0YSBpcyByZWFkeSBvbiB0aGUgbG93ZXIKK3NvY2tldCBmb3Igc3RycGFyc2VyIHRvIHByb2Nlc3MuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGEgZGF0YV9yZWFkeQorY2FsbGJhY2sgdGhhdCBpcyBzZXQgb24gdGhlIHNvY2tldC4KKworc3RycF9zdG9wIGlzIGNhbGxlZCB0byBjb21wbGV0ZWx5IHN0b3Agc3RyZWFtIHBhcnNlciBvcGVyYXRpb25zLiBUaGlzCitpcyBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIHRoZSBzdHJlYW0gcGFyc2VyIGVuY291bnRlcnMgYW4gZXJyb3IsIGFuZAoraXQgaXMgY2FsbGVkIGZyb20gdGhlIHVwcGVyIGxheWVyIHdoZW4gdW5hdHRhY2hpbmcgYSBUQ1Agc29ja2V0LgorCitzdHJwX2RvbmUgaXMgY2FsbGVkIHRvIHVuYXR0YWNoIHRoZSBzdHJlYW0gcGFyc2VyIGZyb20gdGhlIFRDUCBzb2NrZXQuCitUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBzdHJlYW0gcHJvY2Vzc29yIGhhcyBiZSBzdG9wcGVkLgorCitzdHJwX2NoZWNrX3JjdiBpcyBjYWxsZWQgdG8gY2hlY2sgZm9yIG5ldyBtZXNzYWdlcyBvbiB0aGUgc29ja2V0LiBUaGlzCitpcyBub3JtYWxseSBjYWxsZWQgYXQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGEgc3RyZWFtIHBhcnNlciBpbnN0YW5jZQorb2YgYWZ0ZXIgc3RycF91bnBhdXNlLgorCitTdGF0aXN0aWNzCistLS0tLS0tLS0tCisKK1ZhcmlvdXMgY291bnRlcnMgYXJlIGtlcHQgZm9yIGVhY2ggc3RyZWFtIHBhcnNlciBmb3IgYSBUQ1Agc29ja2V0LgorVGhlc2UgYXJlIGluIHRoZSBzdHJwX3N0YXRzIHN0cnVjdHVyZS4gc3RycF9hZ2dyX3N0YXRzIGlzIGEgY29udmVuaWVuY2UKK3N0cnVjdHVyZSBmb3IgYWNjdW11bGF0aW5nIHN0YXRpc3RpY3MgZm9yIG11bHRpcGxlIHN0cmVhbSBwYXJzZXIKK2luc3RhbmNlcy4gc2F2ZV9zdHJwX3N0YXRzIGFuZCBhZ2dyZWdhdGVfc3RycF9zdGF0cyBhcmUgaGVscGVyIGZ1bmN0aW9ucwordG8gc2F2ZSBhbmQgYWdncmVnYXRlIHN0YXRpc3RpY3MuCisKK01lc3NhZ2UgYXNzZW1ibHkgbGltaXRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgc3RyZWFtIHBhcnNlciBwcm92aWRlIG1lY2hhbmlzbXMgdG8gbGltaXQgdGhlIHJlc291cmNlcyBjb25zdW1lZCBieQorbWVzc2FnZSBhc3NlbWJseS4KKworQSB0aW1lciBpcyBzZXQgd2hlbiBhc3NlbWJseSBzdGFydHMgZm9yIGEgbmV3IG1lc3NhZ2UuIFRoZSBtZXNzYWdlCit0aW1lb3V0IGlzIHRha2VuIGZyb20gcmN2dGltZSBmb3IgdGhlIGFzc29jaWF0ZWQgVENQIHNvY2tldC4gSWYgdGhlCit0aW1lciBmaXJlcyBiZWZvcmUgYXNzZW1ibHkgY29tcGxldGVzIHRoZSBzdHJlYW0gcGFyc2VyIGlzIGFib3J0ZWQKK2FuZCB0aGUgRVRJTUVET1VUIGVycm9yIGlzIHNldCBvbiB0aGUgVENQIHNvY2tldC4KKworTWVzc2FnZSBsZW5ndGggaXMgbGltaXRlZCB0byB0aGUgcmVjZWl2ZSBidWZmZXIgc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZAorVENQIHNvY2tldC4gSWYgdGhlIGxlbmd0aCByZXR1cm5lZCBieSBwYXJzZV9tc2cgaXMgZ3JlYXRlciB0aGFuCit0aGUgc29ja2V0IGJ1ZmZlciBzaXplIHRoZW4gdGhlIHN0cmVhbSBwYXJzZXIgaXMgYWJvcnRlZCB3aXRoCitFTVNHU0laRSBlcnJvciBzZXQgb24gdGhlIFRDUCBzb2NrZXQuIE5vdGUgdGhhdCB0aGlzIG1ha2VzIHRoZQorbWF4aW11bSBzaXplIG9mIHJlY2VpdmUgc2tidWZmcyBmb3IgYSBzb2NrZXQgd2l0aCBhIHN0cmVhbSBwYXJzZXIKK3RvIGJlIDIqc2tfcmN2YnVmIG9mIHRoZSBUQ1Agc29ja2V0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3N3aXRjaGRldi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc3dpdGNoZGV2LnR4dAppbmRleCAzMWMzOTExLi4yYmJhYzA1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc3dpdGNoZGV2LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc3dpdGNoZGV2LnR4dApAQCAtMjgzLDE1ICsyODMsMTAgQEAKIGJyaWRnZSBzaG91bGQgbm90IHJlZmxvb2QgdGhlIHBhY2tldCB0byB0aGUgc2FtZSBwb3J0cyB0aGUgZGV2aWNlIGZsb29kZWQsCiBvdGhlcndpc2UgdGhlcmUgd2lsbCBiZSBkdXBsaWNhdGUgcGFja2V0cyBvbiB0aGUgd2lyZS4KIAotVG8gYXZvaWQgZHVwbGljYXRlIHBhY2tldHMsIHRoZSBkZXZpY2UvZHJpdmVyIHNob3VsZCBtYXJrIGEgcGFja2V0IGFzIGFscmVhZHkKLWZvcndhcmRlZCB1c2luZyBza2ItPm9mZmxvYWRfZndkX21hcmsuICBUaGUgc2FtZSBtYXJrIGlzIHNldCBvbiB0aGUgZGV2aWNlCi1wb3J0cyBpbiB0aGUgZG9tYWluIHVzaW5nIGRldi0+b2ZmbG9hZF9md2RfbWFyay4gIElmIHRoZSBza2ItPm9mZmxvYWRfZndkX21hcmsKLWlzIG5vbi16ZXJvIGFuZCBtYXRjaGVzIHRoZSBmb3J3YXJkaW5nIGVncmVzcyBwb3J0J3MgZGV2LT5za2JfbWFyaywgdGhlIGtlcm5lbAotd2lsbCBkcm9wIHRoZSBza2IgcmlnaHQgYmVmb3JlIHRyYW5zbWl0IG9uIHRoZSBlZ3Jlc3MgcG9ydCwgd2l0aCB0aGUKLXVuZGVyc3RhbmRpbmcgdGhhdCB0aGUgZGV2aWNlIGFscmVhZHkgZm9yd2FyZGVkIHRoZSBwYWNrZXQgb24gc2FtZSBlZ3Jlc3MgcG9ydC4KLVRoZSBkcml2ZXIgY2FuIHVzZSBzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19zZXQoKSB0byBzZXQgYSBnbG9iYWxseSB1bmlxdWUgbWFyawotZm9yIHBvcnQncyBkZXYtPm9mZmxvYWRfZndkX21hcmssIGJhc2VkIG9uIHRoZSBwb3J0J3MgcGFyZW50IElEIChzd2l0Y2ggSUQpIGFuZAotYSBncm91cCBpZmluZGV4LgorVG8gYXZvaWQgZHVwbGljYXRlIHBhY2tldHMsIHRoZSBzd2l0Y2ggZHJpdmVyIHNob3VsZCBtYXJrIGEgcGFja2V0IGFzIGFscmVhZHkKK2ZvcndhcmRlZCBieSBzZXR0aW5nIHRoZSBza2ItPm9mZmxvYWRfZndkX21hcmsgYml0LiBUaGUgYnJpZGdlIGRyaXZlciB3aWxsIG1hcmsKK3RoZSBza2IgdXNpbmcgdGhlIGluZ3Jlc3MgYnJpZGdlIHBvcnQncyBtYXJrIGFuZCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgZm9yd2FyZGVkCit0aHJvdWdoIGFueSBicmlkZ2UgcG9ydCB3aXRoIHRoZSBzYW1lIG1hcmsuCiAKIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgc3dpdGNoIGRldmljZSB0byBub3QgaGFuZGxlIGZsb29kaW5nIGFuZCBwdXNoIHRoZQogcGFja2V0cyB1cCB0byB0aGUgYnJpZGdlIGRyaXZlciBmb3IgZmxvb2RpbmcuICBUaGlzIGlzIG5vdCBpZGVhbCBhcyB0aGUgbnVtYmVyCkBAIC0zMTksMzAgKzMxNCwyOSBAQAogZG9lcyBhIGxvbmdlc3QgcHJlZml4IG1hdGNoIChMUE0pIG9uIEZJQiBlbnRyaWVzIG1hdGNoaW5nIHJvdXRlIHByZWZpeCBhbmQKIGZvcndhcmRzIHRoZSBwYWNrZXQgdG8gdGhlIG1hdGNoaW5nIEZJQiBlbnRyeSdzIG5leHRob3AocykgZWdyZXNzIHBvcnRzLgogCi1UbyBwcm9ncmFtIHRoZSBkZXZpY2UsIHRoZSBkcml2ZXIgaW1wbGVtZW50cyBzdXBwb3J0IGZvcgotU1dJVENIREVWX09CSl9JUFZbNHw2XV9GSUIgb2JqZWN0IHVzaW5nIHN3aXRjaGRldl9wb3J0X29ial94eHggb3BzLgotc3dpdGNoZGV2X3BvcnRfb2JqX2FkZCBpcyB1c2VkIGZvciBib3RoIGFkZGluZyBhIG5ldyBGSUIgZW50cnkgdG8gdGhlIGRldmljZSwKLW9yIG1vZGlmeWluZyBhbiBleGlzdGluZyBlbnRyeSBvbiB0aGUgZGV2aWNlLgorVG8gcHJvZ3JhbSB0aGUgZGV2aWNlLCB0aGUgZHJpdmVyIGhhcyB0byByZWdpc3RlciBhIEZJQiBub3RpZmllciBoYW5kbGVyCit1c2luZyByZWdpc3Rlcl9maWJfbm90aWZpZXIuIFRoZSBmb2xsb3dpbmcgZXZlbnRzIGFyZSBhdmFpbGFibGU6CitGSUJfRVZFTlRfRU5UUllfQUREOiB1c2VkIGZvciBib3RoIGFkZGluZyBhIG5ldyBGSUIgZW50cnkgdG8gdGhlIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgIG9yIG1vZGlmeWluZyBhbiBleGlzdGluZyBlbnRyeSBvbiB0aGUgZGV2aWNlLgorRklCX0VWRU5UX0VOVFJZX0RFTDogdXNlZCBmb3IgcmVtb3ZpbmcgYSBGSUIgZW50cnkKK0ZJQl9FVkVOVF9SVUxFX0FERCwgRklCX0VWRU5UX1JVTEVfREVMOiB1c2VkIHRvIHByb3BhZ2F0ZSBGSUIgcnVsZSBjaGFuZ2VzCiAKLVhYWDogQ3VycmVudGx5LCBvbmx5IFNXSVRDSERFVl9PQkpfSURfSVBWNF9GSUIgb2JqZWN0cyBhcmUgc3VwcG9ydGVkLgorRklCX0VWRU5UX0VOVFJZX0FERCBhbmQgRklCX0VWRU5UX0VOVFJZX0RFTCBldmVudHMgcGFzczoKIAotU1dJVENIREVWX09CSl9JRF9JUFY0X0ZJQiBvYmplY3QgcGFzc2VzOgotCi0Jc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgeyAgICAgICAgIC8qIElQVjRfRklCICovCisJc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvIHsKKwkJc3RydWN0IGZpYl9ub3RpZmllcl9pbmZvIGluZm87IC8qIG11c3QgYmUgZmlyc3QgKi8KIAkJdTMyIGRzdDsKIAkJaW50IGRzdF9sZW47CiAJCXN0cnVjdCBmaWJfaW5mbyAqZmk7CiAJCXU4IHRvczsKIAkJdTggdHlwZTsKLQkJdTMyIG5sZmxhZ3M7CiAJCXUzMiB0Yl9pZDsKLQl9IGlwdjRfZmliOworCQl1MzIgbmxmbGFnczsKKwl9OwogCiB0byBhZGQvbW9kaWZ5L2RlbGV0ZSBJUHY0IGRzdC9kZXN0X2xlbiBwcmVmaXggb24gdGFibGUgdGJfaWQuICBUaGUgKmZpCiBzdHJ1Y3R1cmUgaG9sZHMgZGV0YWlscyBvbiB0aGUgcm91dGUgYW5kIHJvdXRlJ3MgbmV4dGhvcHMuICAqZGV2IGlzIG9uZSBvZiB0aGUKLXBvcnQgbmV0ZGV2cyBtZW50aW9uZWQgaW4gdGhlIHJvdXRlcyBuZXh0IGhvcCBsaXN0LiAgSWYgdGhlIG91dHB1dCBwb3J0IG5ldGRldnMKLXJlZmVyZW5jZWQgaW4gdGhlIHJvdXRlJ3MgbmV4dGhvcCBsaXN0IGRvbid0IGFsbCBoYXZlIHRoZSBzYW1lIHN3aXRjaCBJRCwgdGhlCi1kcml2ZXIgaXMgbm90IGNhbGxlZCB0byBhZGQvbW9kaWZ5L2RlbGV0ZSB0aGUgRklCIGVudHJ5LgorcG9ydCBuZXRkZXZzIG1lbnRpb25lZCBpbiB0aGUgcm91dGUncyBuZXh0IGhvcCBsaXN0LgogCiBSb3V0ZXMgb2ZmbG9hZGVkIHRvIHRoZSBkZXZpY2UgYXJlIGxhYmVsZWQgd2l0aCAib2ZmbG9hZCIgaW4gdGhlIGlwIHJvdXRlCiBsaXN0aW5nOgpAQCAtMzYwLDYgKzM1NCw4IEBACiAJMTIuMC4wLjQgdmlhIDExLjAuMC45IGRldiBzdzFwMiAgcHJvdG8gemVicmEgIG1ldHJpYyAyMCBvZmZsb2FkCiAJMTkyLjE2OC4wLjAvMjQgZGV2IGV0aDAgIHByb3RvIGtlcm5lbCAgc2NvcGUgbGluayAgc3JjIDE5Mi4xNjguMC4xNQogCitUaGUgIm9mZmxvYWQiIGZsYWcgaXMgc2V0IGluIGNhc2UgYXQgbGVhc3Qgb25lIGRldmljZSBvZmZsb2FkcyB0aGUgRklCIGVudHJ5LgorCiBYWFg6IGFkZC9tb2QvZGVsIElQdjYgRklCIEFQSQogCiBOZXh0aG9wIFJlc29sdXRpb24KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvcG93ZXJfc3VwcGx5X2NsYXNzLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvcG93ZXJfc3VwcGx5X2NsYXNzLnR4dAppbmRleCA4MmRhY2MwLi4wYzcyNTg4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3Bvd2VyX3N1cHBseV9jbGFzcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9wb3dlcl9zdXBwbHlfY2xhc3MudHh0CkBAIC0zOSw4ICszOSw4IEBACiBtYW5uZXIuIFJlc3VsdHMgZm9yIGRpZmZlcmVudCBwb3dlciBzdXBwbGllcyBhbmQgbWFjaGluZXMgYXJlIGFsc28gZGlyZWN0bHkKIGNvbXBhcmFibGUuCiAKLVNlZSBkcml2ZXJzL3Bvd2VyL2RzMjc2MF9iYXR0ZXJ5LmMgYW5kIGRyaXZlcnMvcG93ZXIvcGRhX3Bvd2VyLmMgZm9yIHRoZQotZXhhbXBsZSBob3cgdG8gZGVjbGFyZSBhbmQgaGFuZGxlIGF0dHJpYnV0ZXMuCitTZWUgZHJpdmVycy9wb3dlci9zdXBwbHkvZHMyNzYwX2JhdHRlcnkuYyBhbmQgZHJpdmVycy9wb3dlci9zdXBwbHkvcGRhX3Bvd2VyLmMKK2ZvciB0aGUgZXhhbXBsZSBob3cgdG8gZGVjbGFyZSBhbmQgaGFuZGxlIGF0dHJpYnV0ZXMuCiAKIAogVW5pdHMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9jeGxmbGFzaC50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvY3hsZmxhc2gudHh0CmluZGV4IDQyMDJkMWIuLjZkOWEyZWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy9jeGxmbGFzaC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2N4bGZsYXNoLnR4dApAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgYmVsb3cuCiAKICAgICBUaGUgYmxvY2sgbGlicmFyeSBjYW4gYmUgZm91bmQgb24gR2l0SHViOgotICAgIGh0dHA6Ly93d3cuZ2l0aHViLmNvbS9taWtlaG9sbGluZ2VyL2libWNhcGlrdgorICAgIGh0dHA6Ly9naXRodWIuY29tL29wZW4tcG93ZXIvY2FwaWZsYXNoCiAKIAogQ1hMIEZsYXNoIERyaXZlciBJT0NUTHMKQEAgLTE3MSwxMSArMTcxLDMwIEBACiAgICAgICAgICAgZGVzdHJveWVkLCB0aGUgdG9rZW5zIGFyZSB0byBiZSBjb25zaWRlcmVkIHN0YWxlIGFuZCBzdWJzZXF1ZW50CiAgICAgICAgICAgdXNhZ2Ugd2lsbCByZXN1bHQgaW4gZXJyb3JzLgogCi0gICAgICAgIC0gV2hlbiBhIGNvbnRleHQgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgdGhlIHVzZXIgc2hhbGwgZGV0YWNoIGZyb20KLSAgICAgICAgICB0aGUgY29udGV4dCB2aWEgdGhlIERLX0NYTEZMQVNIX0RFVEFDSCBpb2N0bC4KKwktIEEgdmFsaWQgYWRhcHRlciBmaWxlIGRlc2NyaXB0b3IgKGZkMiA+PSAwKSBpcyBvbmx5IHJldHVybmVkIG9uCisJICB0aGUgaW5pdGlhbCBhdHRhY2ggZm9yIGEgY29udGV4dC4gU3Vic2VxdWVudCBhdHRhY2hlcyB0byBhbgorCSAgZXhpc3RpbmcgY29udGV4dCAoREtfQ1hMRkxBU0hfQVRUQUNIX1JFVVNFX0NPTlRFWFQgZmxhZyBwcmVzZW50KQorCSAgZG8gbm90IHByb3ZpZGUgdGhlIGFkYXB0ZXIgZmlsZSBkZXNjcmlwdG9yIGFzIGl0IHdhcyBwcmV2aW91c2x5CisJICBtYWRlIGtub3duIHRvIHRoZSBhcHBsaWNhdGlvbi4KIAotICAgICAgICAtIEEgY2xvc2Ugb24gZmQyIHdpbGwgaW52YWxpZGF0ZSB0aGUgdG9rZW5zLiBUaGlzIG9wZXJhdGlvbiBpcyBub3QKLSAgICAgICAgICByZXF1aXJlZCBieSB0aGUgdXNlci4KKyAgICAgICAgLSBXaGVuIGEgY29udGV4dCBpcyBubyBsb25nZXIgbmVlZGVkLCB0aGUgdXNlciBzaGFsbCBkZXRhY2ggZnJvbQorICAgICAgICAgIHRoZSBjb250ZXh0IHZpYSB0aGUgREtfQ1hMRkxBU0hfREVUQUNIIGlvY3RsLiBXaGVuIHRoaXMgaW9jdGwKKwkgIHJldHVybnMgd2l0aCBhIHZhbGlkIGFkYXB0ZXIgZmlsZSBkZXNjcmlwdG9yIGFuZCB0aGUgcmV0dXJuIGZsYWcKKwkgIERLX0NYTEZMQVNIX0FQUF9DTE9TRV9BREFQX0ZEIGlzIHByZXNlbnQsIHRoZSBhcHBsaWNhdGlvbiBfbXVzdF8KKwkgIGNsb3NlIHRoZSBhZGFwdGVyIGZpbGUgZGVzY3JpcHRvciBmb2xsb3dpbmcgYSBzdWNjZXNzZnVsIGRldGFjaC4KKworCS0gV2hlbiB0aGlzIGlvY3RsIHJldHVybnMgd2l0aCBhIHZhbGlkIGZkMiBhbmQgdGhlIHJldHVybiBmbGFnCisJICBES19DWExGTEFTSF9BUFBfQ0xPU0VfQURBUF9GRCBpcyBwcmVzZW50LCB0aGUgYXBwbGljYXRpb24gX211c3RfCisJICBjbG9zZSBmZDIgaW4gdGhlIGZvbGxvd2luZyBjaXJjdW1zdGFuY2VzOgorCisJCSsgRm9sbG93aW5nIGEgc3VjY2Vzc2Z1bCBkZXRhY2ggb2YgdGhlIGxhc3QgdXNlciBvZiB0aGUgY29udGV4dAorCQkrIEZvbGxvd2luZyBhIHN1Y2Nlc3NmdWwgcmVjb3Zlcnkgb24gdGhlIGNvbnRleHQncyBvcmlnaW5hbCBmZDIKKwkJKyBJbiB0aGUgY2hpbGQgcHJvY2VzcyBvZiBhIGZvcmsoKSwgZm9sbG93aW5nIGEgY2xvbmUgaW9jdGwsCisJCSAgb24gdGhlIGZkMiBhc3NvY2lhdGVkIHdpdGggdGhlIHNvdXJjZSBjb250ZXh0CisKKyAgICAgICAgLSBBdCBhbnkgdGltZSwgYSBjbG9zZSBvbiBmZDIgd2lsbCBpbnZhbGlkYXRlIHRoZSB0b2tlbnMuIEFwcGxpY2F0aW9ucworCSAgc2hvdWxkIGV4ZXJjaXNlIGNhdXRpb24gdG8gb25seSBjbG9zZSBmZDIgd2hlbiBhcHByb3ByaWF0ZSAob3V0bGluZWQKKwkgIGluIHRoZSBwcmV2aW91cyBidWxsZXQpIHRvIGF2b2lkIHByZW1hdHVyZSBsb3NzIG9mIEkvTy4KIAogREtfQ1hMRkxBU0hfVVNFUl9ESVJFQ1QKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNTQsNiArMjczLDEwIEBACiAgICAgc3VjY2VzcywgYWxsICJ0b2tlbnMiIHdoaWNoIGhhZCBiZWVuIHByb3ZpZGVkIHRvIHRoZSB1c2VyIGZyb20gdGhlCiAgICAgREtfQ1hMRkxBU0hfQVRUQUNIIG9ud2FyZCBhcmUgbm8gbG9uZ2VyIHZhbGlkLgogCisgICAgV2hlbiB0aGUgREtfQ1hMRkxBU0hfQVBQX0NMT1NFX0FEQVBfRkQgZmxhZyB3YXMgcmV0dXJuZWQgb24gYSBzdWNjZXNzZnVsCisgICAgYXR0YWNoLCB0aGUgYXBwbGljYXRpb24gX211c3RfIGNsb3NlIHRoZSBmZDIgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0CisgICAgZm9sbG93aW5nIHRoZSBkZXRhY2ggb2YgdGhlIGZpbmFsIHVzZXIgb2YgdGhlIGNvbnRleHQuCisKIERLX0NYTEZMQVNIX1ZMVU5fQ0xPTkUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBUaGlzIGlvY3RsIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9uaW5nIGEgcHJldmlvdXNseSBjcmVhdGVkCkBAIC0yNjEsNyArMjg0LDcgQEAKICAgICBzdXBwb3J0IG1haW50YWluaW5nIHVzZXIgc3BhY2UgYWNjZXNzIHRvIHN0b3JhZ2UgYWZ0ZXIgYSBwcm9jZXNzCiAgICAgZm9ya3MuIFVwb24gc3VjY2VzcywgdGhlIGNoaWxkIHByb2Nlc3MgKHdoaWNoIGludm9rZWQgdGhlIGlvY3RsKQogICAgIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gdGhlIHNhbWUgTFVOcyB2aWEgdGhlIHNhbWUgcmVzb3VyY2UgaGFuZGxlKHMpCi0gICAgYW5kIGZkMiBhcyB0aGUgcGFyZW50LCBidXQgdW5kZXIgYSBkaWZmZXJlbnQgY29udGV4dC4KKyAgICBhcyB0aGUgcGFyZW50LCBidXQgdW5kZXIgYSBkaWZmZXJlbnQgY29udGV4dC4KIAogICAgIENvbnRleHQgc2hhcmluZyBhY3Jvc3MgcHJvY2Vzc2VzIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBDWEwgYW5kCiAgICAgdGhlcmVmb3JlIGVhY2ggZm9yayBtdXN0IGJlIG1ldCB3aXRoIGVzdGFibGlzaGluZyBhIG5ldyBjb250ZXh0CkBAIC0yNzUsNiArMjk4LDEyIEBACiAgICAgdHJhbnNsYXRpb24gdGFibGVzIGFyZSBjb3BpZWQgZnJvbSB0aGUgcGFyZW50IGNvbnRleHQgdG8gdGhlIGNoaWxkJ3MKICAgICBhbmQgdGhlbiBzeW5jZWQgd2l0aCB0aGUgQUZVLgogCisgICAgV2hlbiB0aGUgREtfQ1hMRkxBU0hfQVBQX0NMT1NFX0FEQVBfRkQgZmxhZyB3YXMgcmV0dXJuZWQgb24gYSBzdWNjZXNzZnVsCisgICAgYXR0YWNoLCB0aGUgYXBwbGljYXRpb24gX211c3RfIGNsb3NlIHRoZSBmZDIgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb3VyY2UKKyAgICBjb250ZXh0IChzdGlsbCByZXNpZGVudC9hY2Nlc3NpYmxlIGluIHRoZSBwYXJlbnQgcHJvY2VzcykgZm9sbG93aW5nIHRoZQorICAgIGNsb25lLiBUaGlzIGlzIHRvIGF2b2lkIGEgc3RhbGUgZW50cnkgaW4gdGhlIGZpbGUgZGVzY3JpcHRvciB0YWJsZSBvZiB0aGUKKyAgICBjaGlsZCBwcm9jZXNzLgorCiBES19DWExGTEFTSF9WRVJJRlkKIC0tLS0tLS0tLS0tLS0tLS0tLQogICAgIFRoaXMgaW9jdGwgaXMgdXNlZCB0byBkZXRlY3QgdmFyaW91cyBjaGFuZ2VzIHN1Y2ggYXMgdGhlIGNhcGFjaXR5IG9mCkBAIC0zMDksNiArMzM4LDExIEBACiAgICAgYXQgd2hpY2ggdGltZSB0aGUgY29udGV4dC9yZXNvdXJjZXMgdGhleSBoZWxkIHdpbGwgYmUgZnJlZWQgYXMgcGFydCBvZgogICAgIHRoZSByZWxlYXNlIGZvcC4KIAorICAgIFdoZW4gdGhlIERLX0NYTEZMQVNIX0FQUF9DTE9TRV9BREFQX0ZEIGZsYWcgd2FzIHJldHVybmVkIG9uIGEgc3VjY2Vzc2Z1bAorICAgIGF0dGFjaCwgdGhlIGFwcGxpY2F0aW9uIF9tdXN0XyB1bm1hcCBhbmQgY2xvc2UgdGhlIGZkMiBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgb3JpZ2luYWwgY29udGV4dCBmb2xsb3dpbmcgdGhpcyBpb2N0bCByZXR1cm5pbmcgc3VjY2VzcyBhbmQgaW5kaWNhdGluZyB0aGF0CisgICAgdGhlIGNvbnRleHQgd2FzIHJlY292ZXJlZCAoREtfQ1hMRkxBU0hfUkVDT1ZFUl9BRlVfQ09OVEVYVF9SRVNFVCkuCisKIERLX0NYTEZMQVNIX01BTkFHRV9MVU4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBUaGlzIGlvY3RsIGlzIHVzZWQgdG8gc3dpdGNoIGEgTFVOIGZyb20gYSBtb2RlIHdoZXJlIGl0IGlzIGF2YWlsYWJsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL3N5c2NhbGw2NC1hYmkudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL3N5c2NhbGw2NC1hYmkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzE2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvc3lzY2FsbDY0LWFiaS50eHQKQEAgLTAsMCArMSwxMDUgQEAKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitQb3dlciBBcmNoaXRlY3R1cmUgNjQtYml0IExpbnV4IHN5c3RlbSBjYWxsIEFCSQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3lzY2FsbAorPT09PT09PQorCitzeXNjYWxsIGNhbGxpbmcgc2VxdWVuY2VbKl0gbWF0Y2hlcyB0aGUgUG93ZXIgQXJjaGl0ZWN0dXJlIDY0LWJpdCBFTEYgQUJJCitzcGVjaWZpY2F0aW9uIEMgZnVuY3Rpb24gY2FsbGluZyBzZXF1ZW5jZSwgaW5jbHVkaW5nIHJlZ2lzdGVyIHByZXNlcnZhdGlvbgorcnVsZXMsIHdpdGggdGhlIGZvbGxvd2luZyBkaWZmZXJlbmNlcy4KKworWypdIFNvbWUgc3lzY2FsbHMgKHR5cGljYWxseSBsb3ctbGV2ZWwgbWFuYWdlbWVudCBmdW5jdGlvbnMpIG1heSBoYXZlCisgICAgZGlmZmVyZW50IGNhbGxpbmcgc2VxdWVuY2VzIChlLmcuLCBydF9zaWdyZXR1cm4pLgorCitQYXJhbWV0ZXJzIGFuZCByZXR1cm4gdmFsdWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIHN5c3RlbSBjYWxsIG51bWJlciBpcyBzcGVjaWZpZWQgaW4gcjAuCisKK1RoZXJlIGlzIGEgbWF4aW11bSBvZiA2IGludGVnZXIgcGFyYW1ldGVycyB0byBhIHN5c2NhbGwsIHBhc3NlZCBpbiByMy1yOC4KKworQm90aCBhIHJldHVybiB2YWx1ZSBhbmQgYSByZXR1cm4gZXJyb3IgY29kZSBhcmUgcmV0dXJuZWQuIGNyMC5TTyBpcyB0aGUgcmV0dXJuCitlcnJvciBjb2RlLCBhbmQgcjMgaXMgdGhlIHJldHVybiB2YWx1ZSBvciBlcnJvciBjb2RlLiBXaGVuIGNyMC5TTyBpcyBjbGVhciwKK3RoZSBzeXNjYWxsIHN1Y2NlZWRlZCBhbmQgcjMgaXMgdGhlIHJldHVybiB2YWx1ZS4gV2hlbiBjcjAuU08gaXMgc2V0LCB0aGUKK3N5c2NhbGwgZmFpbGVkIGFuZCByMyBpcyB0aGUgZXJyb3IgY29kZSB0aGF0IGdlbmVyYWxseSBjb3JyZXNwb25kcyB0byBlcnJuby4KKworU3RhY2sKKy0tLS0tCitTeXN0ZW0gY2FsbHMgZG8gbm90IG1vZGlmeSB0aGUgY2FsbGVyJ3Mgc3RhY2sgZnJhbWUuIEZvciBleGFtcGxlLCB0aGUgY2FsbGVyJ3MKK3N0YWNrIGZyYW1lIExSIGFuZCBDUiBzYXZlIGZpZWxkcyBhcmUgbm90IHVzZWQuCisKK1JlZ2lzdGVyIHByZXNlcnZhdGlvbiBydWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZWdpc3RlciBwcmVzZXJ2YXRpb24gcnVsZXMgbWF0Y2ggdGhlIEVMRiBBQkkgY2FsbGluZyBzZXF1ZW5jZSB3aXRoIHRoZQorZm9sbG93aW5nIGRpZmZlcmVuY2VzOgorCityMDogICAgICAgICBWb2xhdGlsZS4gICAoU3lzdGVtIGNhbGwgbnVtYmVyLikKK3IzOiAgICAgICAgIFZvbGF0aWxlLiAgIChQYXJhbWV0ZXIgMSwgYW5kIHJldHVybiB2YWx1ZS4pCityNC1yODogICAgICBWb2xhdGlsZS4gICAoUGFyYW1ldGVycyAyLTYuKQorY3IwOiAgICAgICAgVm9sYXRpbGUgICAgKGNyMC5TTyBpcyB0aGUgcmV0dXJuIGVycm9yIGNvbmRpdGlvbikKK2NyMSwgY3I1LTc6IE5vbnZvbGF0aWxlLgorbHI6ICAgICAgICAgTm9udm9sYXRpbGUuCisKK0FsbCBmbG9hdGluZyBwb2ludCBhbmQgdmVjdG9yIGRhdGEgcmVnaXN0ZXJzIGFzIHdlbGwgYXMgY29udHJvbCBhbmQgc3RhdHVzCityZWdpc3RlcnMgYXJlIG5vbnZvbGF0aWxlLgorCitJbnZvY2F0aW9uCistLS0tLS0tLS0tCitUaGUgc3lzY2FsbCBpcyBwZXJmb3JtZWQgd2l0aCB0aGUgc2MgaW5zdHJ1Y3Rpb24sIGFuZCByZXR1cm5zIHdpdGggZXhlY3V0aW9uCitjb250aW51aW5nIGF0IHRoZSBpbnN0cnVjdGlvbiBmb2xsb3dpbmcgdGhlIHNjIGluc3RydWN0aW9uLgorCitUcmFuc2FjdGlvbmFsIE1lbW9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N5c2NhbGwgYmVoYXZpb3IgY2FuIGNoYW5nZSBpZiB0aGUgcHJvY2Vzc29yIGlzIGluIHRyYW5zYWN0aW9uYWwgb3Igc3VzcGVuZGVkCit0cmFuc2FjdGlvbiBzdGF0ZSwgYW5kIHRoZSBzeXNjYWxsIGNhbiBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mIHRoZSB0cmFuc2FjdGlvbi4KKworSWYgdGhlIHByb2Nlc3NvciBpcyBpbiBzdXNwZW5kZWQgc3RhdGUgd2hlbiBhIHN5c2NhbGwgaXMgbWFkZSwgdGhlIHN5c2NhbGwKK3dpbGwgYmUgcGVyZm9ybWVkIGFzIG5vcm1hbCwgYW5kIHdpbGwgcmV0dXJuIGFzIG5vcm1hbC4gVGhlIHN5c2NhbGwgd2lsbCBiZQorcGVyZm9ybWVkIGluIHN1c3BlbmRlZCBzdGF0ZSwgc28gaXRzIHNpZGUgZWZmZWN0cyB3aWxsIGJlIHBlcnNpc3RlbnQgYWNjb3JkaW5nCit0byB0aGUgdXN1YWwgdHJhbnNhY3Rpb25hbCBtZW1vcnkgc2VtYW50aWNzLiBBIHN5c2NhbGwgbWF5IG9yIG1heSBub3QgcmVzdWx0CitpbiB0aGUgdHJhbnNhY3Rpb24gYmVpbmcgZG9vbWVkIGJ5IGhhcmR3YXJlLgorCitJZiB0aGUgcHJvY2Vzc29yIGlzIGluIHRyYW5zYWN0aW9uYWwgc3RhdGUgd2hlbiBhIHN5c2NhbGwgaXMgbWFkZSwgdGhlbiB0aGUKK2JlaGF2aW9yIGRlcGVuZHMgb24gdGhlIHByZXNlbmNlIG9mIFBQQ19GRUFUVVJFMl9IVE1fTk9TQyBpbiB0aGUgQVRfSFdDQVAyIEVMRgorYXV4aWxpYXJ5IHZlY3Rvci4KKworLSBJZiBwcmVzZW50LCB3aGljaCBpcyB0aGUgY2FzZSBmb3IgbmV3ZXIga2VybmVscywgdGhlbiB0aGUgc3lzY2FsbCB3aWxsIG5vdAorICBiZSBwZXJmb3JtZWQgYW5kIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIGRvb21lZCBieSB0aGUga2VybmVsIHdpdGggdGhlCisgIGZhaWx1cmUgY29kZSBUTV9DQVVTRV9TWVNDQUxMIHwgVE1fQ0FVU0VfUEVSU0lTVEVOVCBpbiB0aGUgVEVYQVNSIFNQUi4KKworLSBJZiBub3QgcHJlc2VudCAob2xkZXIga2VybmVscyksIHRoZW4gdGhlIGtlcm5lbCB3aWxsIHN1c3BlbmQgdGhlCisgIHRyYW5zYWN0aW9uYWwgc3RhdGUgYW5kIHRoZSBzeXNjYWxsIHdpbGwgcHJvY2VlZCBhcyBpbiB0aGUgY2FzZSBvZiBhCisgIHN1c3BlbmRlZCBzdGF0ZSBzeXNjYWxsLCBhbmQgd2lsbCByZXN1bWUgdGhlIHRyYW5zYWN0aW9uYWwgc3RhdGUgYmVmb3JlCisgIHJldHVybmluZyB0byB0aGUgY2FsbGVyLiBUaGlzIGNhc2UgaXMgbm90IHdlbGwgZGVmaW5lZCBvciBzdXBwb3J0ZWQsIHNvIHRoaXMKKyAgYmVoYXZpb3Igc2hvdWxkIG5vdCBiZSByZWxpZWQgdXBvbi4KKworCit2c3lzY2FsbAorPT09PT09PT0KKwordnN5c2NhbGwgY2FsbGluZyBzZXF1ZW5jZSBtYXRjaGVzIHRoZSBzeXNjYWxsIGNhbGxpbmcgc2VxdWVuY2UsIHdpdGggdGhlCitmb2xsb3dpbmcgZGlmZmVyZW5jZXMuIFNvbWUgdnN5c2NhbGxzIG1heSBoYXZlIGRpZmZlcmVudCBjYWxsaW5nIHNlcXVlbmNlcy4KKworUGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3IwIGlzIG5vdCB1c2VkIGFzIGFuIGlucHV0LiBUaGUgdnN5c2NhbGwgaXMgc2VsZWN0ZWQgYnkgaXRzIGFkZHJlc3MuCisKK1N0YWNrCistLS0tLQorVGhlIHZzeXNjYWxsIG1heSBvciBtYXkgbm90IHVzZSB0aGUgY2FsbGVyJ3Mgc3RhY2sgZnJhbWUgc2F2ZSBhcmVhcy4KKworUmVnaXN0ZXIgcHJlc2VydmF0aW9uIHJ1bGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3IwOiBWb2xhdGlsZS4KK2NyMSwgY3I1LTc6IFZvbGF0aWxlLgorbHI6IFZvbGF0aWxlLgorCitJbnZvY2F0aW9uCistLS0tLS0tLS0tCitUaGUgdnN5c2NhbGwgaXMgcGVyZm9ybWVkIHdpdGggYSBicmFuY2gtd2l0aC1saW5rIGluc3RydWN0aW9uIHRvIHRoZSB2c3lzY2FsbAorZnVuY3Rpb24gYWRkcmVzcy4KKworVHJhbnNhY3Rpb25hbCBNZW1vcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCit2c3lzY2FsbHMgd2lsbCBydW4gaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb25hbCBzdGF0ZSBhcyB0aGUgY2FsbGVyLiBBIHZzeXNjYWxsCittYXkgb3IgbWF5IG5vdCByZXN1bHQgaW4gdGhlIHRyYW5zYWN0aW9uIGJlaW5nIGRvb21lZCBieSBoYXJkd2FyZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy90cmFuc2FjdGlvbmFsX21lbW9yeS50eHQgYi9Eb2N1bWVudGF0aW9uL3Bvd2VycGMvdHJhbnNhY3Rpb25hbF9tZW1vcnkudHh0CmluZGV4IGJhMGEyYTQuLmUzMmZkYmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXJwYy90cmFuc2FjdGlvbmFsX21lbW9yeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlcnBjL3RyYW5zYWN0aW9uYWxfbWVtb3J5LnR4dApAQCAtMTY3LDYgKzE2Nyw4IEBACiBGb3Igc2lnbmFscyB0YWtlbiBpbiBub24tVE0gb3Igc3VzcGVuZGVkIG1vZGUsIHdlIHVzZSB0aGUKIG5vcm1hbC9ub24tY2hlY2twb2ludGVkIHN0YWNrIHBvaW50ZXIuCiAKK0FueSB0cmFuc2FjdGlvbiBpbml0aWF0ZWQgaW5zaWRlIGEgc2lnaGFuZGxlciBhbmQgc3VzcGVuZGVkIG9uIHJldHVybgorZnJvbSB0aGUgc2lnaGFuZGxlciB0byB0aGUga2VybmVsIHdpbGwgZ2V0IHJlY2xhaW1lZCBhbmQgZGlzY2FyZGVkLgogCiBGYWlsdXJlIGNhdXNlIGNvZGVzIHVzZWQgYnkga2VybmVsCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3JhcGlkaW8vbXBvcnRfY2Rldi50eHQgYi9Eb2N1bWVudGF0aW9uL3JhcGlkaW8vbXBvcnRfY2Rldi50eHQKaW5kZXggNmU0OTFhNi4uYTUzZjc4NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9yYXBpZGlvL21wb3J0X2NkZXYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcmFwaWRpby9tcG9ydF9jZGV2LnR4dApAQCAtODAsNiArODAsMTAgQEAKIAogSUlJLiBNb2R1bGUgcGFyYW1ldGVycwogCistICdkbWFfdGltZW91dCcgLSBETUEgdHJhbnNmZXIgY29tcGxldGlvbiB0aW1lb3V0IChpbiBtc2VjLCBkZWZhdWx0IHZhbHVlIDMwMDApLgorICAgICAgICBUaGlzIHBhcmFtZXRlciBzZXQgYSBtYXhpbXVtIGNvbXBsZXRpb24gd2FpdCB0aW1lIGZvciBTWU5DIG1vZGUgRE1BCisgICAgICAgIHRyYW5zZmVyIHJlcXVlc3RzIGFuZCBmb3IgUklPX1dBSVRfRk9SX0FTWU5DIGlvY3RsIHJlcXVlc3RzLgorCiAtICdkYmdfbGV2ZWwnIC0gVGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHRvIGNvbnRyb2wgYW1vdW50IG9mIGRlYnVnIGluZm9ybWF0aW9uCiAgICAgICAgIGdlbmVyYXRlZCBieSB0aGlzIGRldmljZSBkcml2ZXIuIFRoaXMgcGFyYW1ldGVyIGlzIGZvcm1lZCBieSBzZXQgb2YKICAgICAgICAgYml0IG1hc2tzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgc3BlY2lmaWMgZnVuY3Rpb25hbCBibG9ja3MuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3JlbW90ZXByb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9yZW1vdGVwcm9jLnR4dAppbmRleCBlZjAyMTlmLi5mMDc1OTc0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3JlbW90ZXByb2MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcmVtb3RlcHJvYy50eHQKQEAgLTEwMSw5ICsxMDEsOSBAQAogICAgICAgT24gc3VjY2VzcywgdGhlIG5ldyBycHJvYyBpcyByZXR1cm5lZCwgYW5kIG9uIGZhaWx1cmUsIE5VTEwuCiAKICAgICAgIE5vdGU6IF9uZXZlcl8gZGlyZWN0bHkgZGVhbGxvY2F0ZSBAcnByb2MsIGV2ZW4gaWYgaXQgd2FzIG5vdCByZWdpc3RlcmVkCi0gICAgICB5ZXQuIEluc3RlYWQsIHdoZW4geW91IG5lZWQgdG8gdW5yb2xsIHJwcm9jX2FsbG9jKCksIHVzZSBycHJvY19wdXQoKS4KKyAgICAgIHlldC4gSW5zdGVhZCwgd2hlbiB5b3UgbmVlZCB0byB1bnJvbGwgcnByb2NfYWxsb2MoKSwgdXNlIHJwcm9jX2ZyZWUoKS4KIAotICB2b2lkIHJwcm9jX3B1dChzdHJ1Y3QgcnByb2MgKnJwcm9jKQorICB2b2lkIHJwcm9jX2ZyZWUoc3RydWN0IHJwcm9jICpycHJvYykKICAgICAtIEZyZWUgYW4gcnByb2MgaGFuZGxlIHRoYXQgd2FzIGFsbG9jYXRlZCBieSBycHJvY19hbGxvYy4KICAgICAgIFRoaXMgZnVuY3Rpb24gZXNzZW50aWFsbHkgdW5yb2xscyBycHJvY19hbGxvYygpLCBieSBkZWNyZW1lbnRpbmcgdGhlCiAgICAgICBycHJvYydzIHJlZmNvdW50LiBJdCBkb2Vzbid0IGRpcmVjdGx5IGZyZWUgcnByb2M7IHRoYXQgd291bGQgaGFwcGVuCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgogCiAgICAgICBBZnRlciBycHJvY19kZWwoKSByZXR1cm5zLCBAcnByb2MgaXMgc3RpbGwgdmFsaWQsIGFuZCBpdHMKLSAgICAgIGxhc3QgcmVmY291bnQgc2hvdWxkIGJlIGRlY3JlbWVudGVkIGJ5IGNhbGxpbmcgcnByb2NfcHV0KCkuCisgICAgICBsYXN0IHJlZmNvdW50IHNob3VsZCBiZSBkZWNyZW1lbnRlZCBieSBjYWxsaW5nIHJwcm9jX2ZyZWUoKS4KIAogICAgICAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIC1FSU5WQUwgaWYgQHJwcm9jIGlzbid0IHZhbGlkLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZWFkbGluZS50eHQgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1kZWFkbGluZS50eHQKaW5kZXggNTNhMmZlMS4uOGUzN2IwYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtZGVhZGxpbmUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLWRlYWRsaW5lLnR4dApAQCAtMTYsNiArMTYsNyBAQAogICAgNC4xIFN5c3RlbS13aWRlIHNldHRpbmdzCiAgICA0LjIgVGFzayBpbnRlcmZhY2UKICAgIDQuMyBEZWZhdWx0IGJlaGF2aW9yCisgICA0LjQgQmVoYXZpb3Igb2Ygc2NoZWRfeWllbGQoKQogIDUuIFRhc2tzIENQVSBhZmZpbml0eQogICAgNS4xIFNDSEVEX0RFQURMSU5FIGFuZCBjcHVzZXRzIEhPV1RPCiAgNi4gRnV0dXJlIHBsYW5zCkBAIC00MjYsNiArNDI3LDIzIEBACiAgRmluYWxseSwgbm90aWNlIHRoYXQgaW4gb3JkZXIgbm90IHRvIGplb3BhcmRpemUgdGhlIGFkbWlzc2lvbiBjb250cm9sIGEKICAtZGVhZGxpbmUgdGFzayBjYW5ub3QgZm9yay4KIAorCis0LjQgQmVoYXZpb3Igb2Ygc2NoZWRfeWllbGQoKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIFdoZW4gYSBTQ0hFRF9ERUFETElORSB0YXNrIGNhbGxzIHNjaGVkX3lpZWxkKCksIGl0IGdpdmVzIHVwIGl0cworIHJlbWFpbmluZyBydW50aW1lIGFuZCBpcyBpbW1lZGlhdGVseSB0aHJvdHRsZWQsIHVudGlsIHRoZSBuZXh0CisgcGVyaW9kLCB3aGVuIGl0cyBydW50aW1lIHdpbGwgYmUgcmVwbGVuaXNoZWQgKGEgc3BlY2lhbCBmbGFnCisgZGxfeWllbGRlZCBpcyBzZXQgYW5kIHVzZWQgdG8gaGFuZGxlIGNvcnJlY3RseSB0aHJvdHRsaW5nIGFuZCBydW50aW1lCisgcmVwbGVuaXNobWVudCBhZnRlciBhIGNhbGwgdG8gc2NoZWRfeWllbGQoKSkuCisKKyBUaGlzIGJlaGF2aW9yIG9mIHNjaGVkX3lpZWxkKCkgYWxsb3dzIHRoZSB0YXNrIHRvIHdha2UtdXAgZXhhY3RseSBhdAorIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcGVyaW9kLiBBbHNvLCB0aGlzIG1heSBiZSB1c2VmdWwgaW4gdGhlCisgZnV0dXJlIHdpdGggYmFuZHdpZHRoIHJlY2xhaW1pbmcgbWVjaGFuaXNtcywgd2hlcmUgc2NoZWRfeWllbGQoKSB3aWxsCisgbWFrZSB0aGUgbGVmdG9ldmVyIHJ1bnRpbWUgYXZhaWxhYmxlIGZvciByZWNsYW1hdGlvbiBieSBvdGhlcgorIFNDSEVEX0RFQURMSU5FIHRhc2tzLgorCisKIDUuIFRhc2tzIENQVSBhZmZpbml0eQogPT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vc2NzaS8wMC1JTkRFWAppbmRleCBjNGI5NzhhLi5iYjRhNzZmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpLzAwLUlOREVYCkBAIC02NCw4ICs2NCw2IEBACiAJLSBIUCBTbWFydCBBcnJheSBDb250cm9sbGVyIFNDU0kgZHJpdmVyLgogaHB0aW9wLnR4dAogCS0gSElHSFBPSU5UIFJPQ0tFVFJBSUQgM3h4eCBSQUlEIERSSVZFUgotaW4yMDAwLnR4dAotCS0gaW5mbyBvbiBpbjIwMDAgZHJpdmVyCiBsaWJzYXMudHh0CiAJLSBTZXJpYWwgQXR0YWNoZWQgU0NTSSBtYW5hZ2VtZW50IGxheWVyLgogbGlua19wb3dlcl9tYW5hZ2VtZW50X3BvbGljeS50eHQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9kdGMzeDgwLnR4dCBiL0RvY3VtZW50YXRpb24vc2NzaS9kdGMzeDgwLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3YWY5Zi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvZHRjM3g4MC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1SRUFETUUgZmlsZSBmb3IgdGhlIExpbnV4IERUQzMxODAvMzI4MCBzY3NpIGRyaXZlci4KLWJ5IFJheSBWYW4gVGFzc2xlIChyYXl2dEBjb21tLm1vdC5jb20pICBNYXJjaCAxOTk2Ci1CYXNlZCBvbiB0aGUgZ2VuZXJpYyAmIGNvcmUgTkNSNTM4MCBjb2RlIGJ5IERyZXcgRWNraGFyZAotCi1TQ1NJIGRldmljZSBkcml2ZXIgZm9yIHRoZSBEVEMgMzE4MC8zMjgwLgotRGF0YSBUZWNobm9sb2d5IENvcnAtLS1hIGRpdmlzaW9uIG9mIFF1bWUuCi0KLVRoZSAzMjgwIGhhcyBhIHN0YW5kYXJkIGZsb3BweSBpbnRlcmZhY2UuCi0KLVRoZSAzMTgwIGRvZXMgbm90LiAgT3RoZXJ3aXNlLCB0aGV5IGFyZSBpZGVudGljYWwuCi0KLVRoZSBEVEMzeDgwIGRvZXMgbm90IHN1cHBvcnQgRE1BIGJ1dCBpdCBkb2VzIGhhdmUgUHNldWRvLURNQSB3aGljaCBpcwotc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIuCi0KLUl0cyBEVEM0MDYgc2NzaSBjaGlwIGlzIHN1cHBvc2VkbHkgY29tcGF0aWJsZSB3aXRoIHRoZSBOQ1IgNTNDNDAwLgotSXQgaXMgbWVtb3J5IG1hcHBlZCwgdXNlcyBhbiBJUlEsIGJ1dCBubyBkbWEgb3IgaW8tcG9ydC4gIFRoZXJlIGlzCi1pbnRlcm5hbCBETUEsIGJldHdlZW4gU0NTSSBidXMgYW5kIGFuIG9uLWNoaXAgMTI4LWJ5dGUgYnVmZmVyLiAgRG91YmxlCi1idWZmZXJpbmcgaXMgZG9uZSBhdXRvbWFnaWNhbGx5IGJ5IHRoZSBjaGlwLiAgRGF0YSBpcyB0cmFuc2ZlcnJlZAotYmV0d2VlbiB0aGUgb24tY2hpcCBidWZmZXIgYW5kIENQVS9SQU0gdmlhIG1lbW9yeSBtb3Zlcy4KLQotVGhlIGRyaXZlciBkZXRlY3RzIHRoZSBwb3NzaWJsZSBtZW1vcnkgYWRkcmVzc2VzIChqdW1wZXIgc2VsZWN0YWJsZSk6Ci0JQ0MwMCwgREMwMCwgQzgwMCwgYW5kIEQ4MDAKLVRoZSBwb3NzaWJsZSBJUlEncyAoanVtcGVyIHNlbGVjdGFibGUpIGFyZToKLQlJUlEgMTAsIDExLCAxMiwgMTUKLVBhcml0eSBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAsIGJ1dCBub3QgYnkgdGhpcyBkcml2ZXIuCi1JbmZvcm1hdGlvbiBjYW4gYmUgb2J0YWluZWQgZnJvbSAvcHJvYy9zY3NpL2R0YzNjODAvTi4KLQotTm90ZSBvbiBpbnRlcnJ1cHRzOgotCi1UaGUgZG9jdW1lbnRhdGlvbiBzYXlzIHRoYXQgaXQgY2FuIGJlIHNldCB0byBpbnRlcnJ1cHQgd2hlbmV2ZXIgdGhlCi1vbi1jaGlwIGJ1ZmZlciBuZWVkcyBDUFUgYXR0ZW50aW9uLiAgSSBjb3VsZG4ndCBnZXQgdGhpcyB0byB3b3JrLiAgU28KLXRoZSBkcml2ZXIgcG9sbHMgZm9yIGRhdGEtcmVhZHkgaW4gdGhlIHBzZXVkby1ETUEgdHJhbnNmZXIgcm91dGluZS4KLVRoZSBpbnRlcnJ1cHQgc3VwcG9ydCByb3V0aW5lcyBpbiB0aGUgTkNSMzI4MC5jIGNvcmUgbW9kdWxlcyBoYW5kbGUKLXNjc2kgZGlzY29ubmVjdC9yZWNvbm5lY3QsIGFuZCB0aGlzIChtb3N0bHkpIHdvcmtzLiAgSG93ZXZlci4uLi4uICBJCi1oYXZlIHRlc3RlZCBpdCB3aXRoIDQgdG90YWxseSBkaWZmZXJlbnQgaGFyZCBkcml2ZXMgKGJvdGggU0NTSS0xIGFuZAotU0NTSS0yKSwgYW5kIG9uZSBDRFJPTSBkcml2ZS4gIEludGVycnVwdHMgd29ya3MgZ3JlYXQgZm9yIGFsbCBidXQgb25lCi1zcGVjaWZpYyBoYXJkIGRyaXZlLiAgRm9yIHRoaXMgb25lLCB0aGUgZHJpdmVyIHdpbGwgZXZlbnR1YWxseSBoYW5nIGluCi10aGUgdHJhbnNmZXIgc3RhdGUuICBJIGhhdmUgdGVzdGVkIHdpdGg6ICJkZCBicz00ayBjb3VudD0yawotb2Y9L2Rldi9udWxsIGlmPS9kZXYvc2RiIi4gIEl0IHJlYWRzIG9rIGZvciBhIHdoaWxlLCB0aGVuIGhhbmdzLgotQWZ0ZXIgYmVhdGluZyBteSBoZWFkIGFnYWluc3QgdGhpcyBmb3IgYSBjb3VwbGUgb2Ygd2Vla3MsIGdldHRpbmcKLW5vd2hlcmUsIEkgZ2l2ZSB1cC4gIFNvLi4uLi5UaGlzIGRyaXZlciBkb2VzIE5PVCB1c2UgaW50ZXJydXB0cywgZXZlbgotaWYgeW91IGhhdmUgdGhlIGNhcmQganVtcGVyZWQgdG8gYW4gSVJRLiAgUHJvYmFibHkgbm9ib2R5IHdpbGwgZXZlcgotY2FyZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2NzaS9pbjIwMDAudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL2luMjAwMC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTJhOTAuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL2luMjAwMC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi1VUERBVEUgTkVXUzogdmVyc2lvbiAxLjMzIC0gMjYgQXVnIDk4Ci0KLSAgIEludGVycnVwdCBtYW5hZ2VtZW50IGluIHRoaXMgZHJpdmVyIGhhcyBiZWNvbWUsIG92ZXIKLSAgIHRpbWUsIGluY3JlYXNpbmdseSBvZGQgYW5kIGRpZmZpY3VsdCB0byBleHBsYWluIC0gdGhpcwotICAgaGFzIGJlZW4gbW9zdGx5IGR1ZSB0byBteSBvd24gbWVudGFsIGluYWRlcXVhY2llcy4gSW4KLSAgIHJlY2VudCBrZXJuZWxzLCBpdCBoYXMgZmFpbGVkIHRvIGZ1bmN0aW9uIGF0IGFsbCB3aGVuCi0gICBjb21waWxlZCBmb3IgU01QLiBJJ3ZlIGZpeGVkIHRoYXQgcHJvYmxlbSwgYW5kIGFmdGVyCi0gICB0YWtpbmcgYSBmcmVzaCBsb29rIGF0IGludGVycnVwdHMgaW4gZ2VuZXJhbCwgZ3JlYXRseQotICAgcmVkdWNlZCB0aGUgbnVtYmVyIG9mIHBsYWNlcyB3aGVyZSB0aGV5J3JlIGZpZGRsZWQKLSAgIHdpdGguIERvbmUgc29tZSBoZWF2eSB0ZXN0aW5nIGFuZCBpdCBsb29rcyB2ZXJ5IGdvb2QuCi0gICBUaGUgZHJpdmVyIG5vdyBtYWtlcyB1c2Ugb2YgdGhlIF9faW5pdGZ1bmMoKSBhbmQKLSAgIF9faW5pdGRhdGEgbWFjcm9zIHRvIHNhdmUgYWJvdXQgNGsgb2Yga2VybmVsIG1lbW9yeS4KLSAgIE9uY2UgYWdhaW4sIHRoZSBzYW1lIGNvZGUgd29ya3MgZm9yIGJvdGggMi4wLnh4IGFuZAotICAgMi4xLnh4IGtlcm5lbHMuCi0KLVVQREFURSBORVdTOiB2ZXJzaW9uIDEuMzIgLSAyOCBNYXIgOTgKLQotICAgUmVtb3ZlZCB0aGUgY2hlY2sgZm9yIGxlZ2FsIElOMjAwMCBoYXJkd2FyZSB2ZXJzaW9uczoKLSAgIEl0IGFwcGVhcnMgdGhhdCB0aGUgZHJpdmVyIHdvcmtzIGZpbmUgd2l0aCBzZXJpYWwKLSAgIEVQUk9NcyAodGhlIDgtcGluIGNoaXAgdGhhdCBkZWZpbmVzIGhhcmR3YXJlIHJldikgYXMKLSAgIG9sZCBhcyAyLjEsIHNvIHdlJ2xsIGFzc3VtZSB0aGF0IGFsbCBjYXJkcyBhcmUgT0suCi0KLVVQREFURSBORVdTOiB2ZXJzaW9uIDEuMzEgLSA2IEp1bCA5NwotCi0gICBGaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBpbmNvcnJlY3QgU0NTSSBzdGF0dXMgYnl0ZXMgdG8gYmUKLSAgIHJldHVybmVkIGZyb20gY29tbWFuZHMgc2VudCB0byBMVU5zIGdyZWF0ZXIgdGhhbiAwLiBUaGlzCi0gICBtZWFucyB0aGF0IENEUk9NIGNoYW5nZXJzIHdvcmsgbm93ISBGaXhlZCBhIGJ1ZyBpbiB0aGUKLSAgIGhhbmRsaW5nIG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgd2hlbiBsb2FkZWQgYXMgYSBtb2R1bGUuCi0gICBBbHNvIHB1dCBhbGwgdGhlIGhlYWRlciBkYXRhIGluIGluMjAwMC5oIHdoZXJlIGl0IGJlbG9uZ3MuCi0gICBUaGVyZSBhcmUgbm8gbG9uZ2VyIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgZHJpdmVyIGluCi0gICB0aGUgMi4xLnh4IHNvdXJjZSB0cmVlIGFuZCB0aGUgMi4wLnh4IHRyZWUsIGFzIG9mIDIuMC4zMQotICAgYW5kIDIuMS40NSAob3IgaXMgaXQgLjQ2PykgLSB0aGlzIG1ha2VzIHRoaW5ncyBtdWNoIGVhc2llcgotICAgZm9yIG1lLi4uCi0KLVVQREFURSBORVdTOiB2ZXJzaW9uIDEuMzAgLSAxNCBPY3QgOTYKLQotICAgRml4ZWQgYSBidWcgaW4gdGhlIGNvZGUgdGhhdCBzZXRzIHRoZSB0cmFuc2ZlciBkaXJlY3Rpb24KLSAgIGJpdCAoREVTVElEX0RQRCBpbiB0aGUgV0RfREVTVElOQVRJT05fSUQgcmVnaXN0ZXIpLiBUaGVyZQotICAgYXJlIHF1aXRlIGEgZmV3IFNDU0kgY29tbWFuZHMgdGhhdCBkbyBhIHdyaXRlLXRvLWRldmljZTsKLSAgIG5vdyB3ZSBkZWFsIHdpdGggYWxsIG9mIHRoZW0gY29ycmVjdGx5LiBUaGFua3MgdG8gSm9lcmcKLSAgIERvcmNoYWluIGZvciBjYXRjaGluZyB0aGlzIG9uZS4KLQotVVBEQVRFIE5FV1M6IHZlcnNpb24gMS4yOSAtIDI0IFNlcCA5NgotCi0gICBUaGUgbWVtb3J5LW1hcHBlZCBoYXJkd2FyZSBvbiB0aGUgY2FyZCBpcyBub3cgYWNjZXNzZWQgdmlhCi0gICB0aGUgJ3JlYWRiKCknIGFuZCAncmVhZGwoKScgbWFjcm9zIC0gcmVxdWlyZWQgYnkgdGhlIG5ldwotICAgbWVtb3J5IG1hbmFnZW1lbnQgc2NoZW1lIGluIHRoZSAyLjEueCBrZXJuZWwgc2VyaWVzLgotICAgQXMgc3VnZ2VzdGVkIGJ5IEFuZHJpZXMgQnJvdXdlciwgJ2Jpb3NfcGFyYW0oKScgbm8gbG9uZ2VyCi0gICBmb3JjZXMgYW4gYXJ0aWZpY2lhbCAxMDIzIHRyYWNrIGxpbWl0IG9uIGRyaXZlcy4gQWxzbwotICAgcmVtb3ZlZCBzb21lIGtsdWRnZS1jb2RlIGxlZnQgb3ZlciBmcm9tIHN0cnVnZ2xlcyB3aXRoCi0gICBvbGRlciAoYnVnZ3kpIGNvbXBpbGVycy4KLQotVVBEQVRFIE5FV1M6IHZlcnNpb24gMS4yOCAtIDA3IE1heSA5NgotCi0gICBUaWdodGVuZWQgdXAgdGhlICJpbnRlcnJ1cHRzIGVuYWJsZWQvZGlzYWJsZWQiIGRpc2NpcGxpbmUKLSAgIGluICdpbjIwMDBfcXVldWVjb21tYW5kKCknIGFuZCBtYXliZSAxIG9yIDIgb3RoZXIgcGxhY2VzLgotICAgSSBfdGhpbmtfIGl0IG1heSBoYXZlIGJlZW4gYSBsaXR0bGUgdG9vIGxheCwgY2F1c2luZyBhbgotICAgb2NjYXNpb25hbCBjcmFzaCBkdXJpbmcgZnVsbCBtb29uLiBBIGZ1bGx5IGZ1bmN0aW9uYWwKLSAgIC9wcm9jIGludGVyZmFjZSBpcyBub3cgaW4gcGxhY2UgLSBpZiB5b3Ugd2FudCB0byBwbGF5Ci0gICB3aXRoIGl0LCBzdGFydCBieSBkb2luZyAnY2F0IC9wcm9jL3Njc2kvaW4yMDAwLzAnLiBZb3UKLSAgIGNhbiBhbHNvIHVzZSBpdCB0byBjaGFuZ2UgYSBmZXcgcnVuLXRpbWUgcGFyYW1ldGVycyBvbgotICAgdGhlIGZseSwgYnV0IGl0J3MgbW9zdGx5IGZvciBkZWJ1Z2dpbmcuIFRoZSBjdXJpb3VzCi0gICBzaG91bGQgdGFrZSBhIGdvb2QgbG9vayBhdCAnaW4yMDAwX3Byb2NfaW5mbygpJyBpbiB0aGUKLSAgIGluMjAwMC5jIGZpbGUgdG8gZ2V0IGFuIHVuZGVyc3RhbmRpbmcgb2Ygd2hhdCBpdCdzIGFsbAotICAgYWJvdXQ7IEkgZmlndXJlIHRoYXQgcGVvcGxlIHdobyBhcmUgcmVhbGx5IGludG8gaXQgd2lsbAotICAgd2FudCB0byBhZGQgZmVhdHVyZXMgc3VpdGVkIHRvIHRoZWlyIG93biBuZWVkcy4uLgotICAgQWxzbywgc3luYyBpcyBub3cgRElTQUJMRUQgYnkgZGVmYXVsdC4KLQotVVBEQVRFIE5FV1M6IHZlcnNpb24gMS4yNyAtIDEwIEFwciA5NgotCi0gICBGaXhlZCBhIHdlbGwtaGlkZGVuIGJ1ZyBpbiB0aGUgYWRhcHRpdmUtZGlzY29ubmVjdCBjb2RlCi0gICB0aGF0IHdvdWxkIHNob3cgdXAgZXZlcnkgbm93IGFuZCB0aGVuIGR1cmluZyBleHRyZW1lCi0gICBoZWF2eSBsb2FkcyBpbnZvbHZpbmcgMiBvciBtb3JlIHNpbXVsdGFuZW91c2x5IGFjdGl2ZQotICAgZGV2aWNlcy4gVGhhbmtzIHRvIEpvZSBNYWNrIGZvciBrZWVwaW5nIG15IG5vc2UgdG8gdGhlCi0gICBncmluZHN0b25lIG9uIHRoaXMgb25lLgotCi1VUERBVEUgTkVXUzogdmVyc2lvbiAxLjI2IC0gMDcgTWFyIDk2Ci0KLSAgIDEuMjUgaGFkIGEgbmFzdHkgYnVnIHRoYXQgYml0IHBlb3BsZSB3aXRoIHN3YXAgcGFydGl0aW9ucwotICAgYW5kIHRhcGUgZHJpdmVzLiBBbHNvLCBpbiBteSBhdHRlbXB0IHRvIGd1ZXNzIG15IHdheQotICAgdGhyb3VnaCBJbnRlbCBhc3NlbWJseSBsYW5ndWFnZSwgSSBtYWRlIGFuIGVycm9yIGluIHRoZQotICAgaW5saW5lIGNvZGUgZm9yIElPIHdyaXRlcy4gTWFkZSBhIGZldyBvdGhlciBjaGFuZ2VzIGFuZAotICAgcmVwYWlycyAtIHRoaXMgdmVyc2lvbiAoZmluZ2VycyBjcm9zc2VkKSBzaG91bGQgd29yayB3ZWxsLgotCi1VUERBVEUgTkVXUzogdmVyc2lvbiAxLjI1IC0gMDUgTWFyIDk2Ci0KLSAgIEtlcm5lbCAxLjMuNzAgaW50ZXJydXB0IG1vZHMgYWRkZWQ7IG9sZCBrZXJuZWxzIHN0aWxsIE9LLgotICAgQmlnIGhlbHAgZnJvbSBCaWxsIEVhcm5lc3QgYW5kIERhdmlkIFdpbGxtb3JlIG9uIHNwZWVkCi0gICB0ZXN0aW5nIGFuZCBvcHRpbWl6aW5nOiBJIHRoaW5rIHRoZXJlJ3MgYSByZWFsIGltcHJvdmVtZW50Ci0gICBpbiB0aGlzIGFyZWEuCi0gICBOZXchIFVzZXItZnJpZW5kbHkgY29tbWFuZC1saW5lIGludGVyZmFjZSBmb3IgTElMTyBhbmQKLSAgIG1vZHVsZSBsb2FkaW5nIC0gdGhlIG9sZCBtZXRob2QgaXMgZ29uZSwgc28geW91J2xsIG5lZWQKLSAgIHRvIHJlYWQgdGhlIGNvbW1lbnRzIGZvciAnc2V0dXBfc3RyaW5ncycgbmVhciB0aGUgdG9wCi0gICBvZiBpbjIwMDAuYy4gRm9yIHBlb3BsZSB3aXRoIENEUk9NJ3Mgb3Igb3RoZXIgZGV2aWNlcwotICAgdGhhdCBoYXZlIGEgdG91Z2ggdGltZSB3aXRoIHN5bmMgbmVnb3RpYXRpb24sIHlvdSBjYW4KLSAgIG5vdyBzZWxlY3RpdmVseSBkaXNhYmxlIHN5bmMgb24gaW5kaXZpZHVhbCBkZXZpY2VzIC0KLSAgIHNlYXJjaCBmb3IgdGhlICdub3N5bmMnIGtleXdvcmQgaW4gdGhlIGNvbW1hbmQtbGluZQotICAgY29tbWVudHMuIFNvbWUgb2YgeW91IGRpc2FibGUgdGhlIEJJT1Mgb24gdGhlIGNhcmQsIHdoaWNoCi0gICBjYXVzZWQgdGhlIGF1dG8tZGV0ZWN0IGZ1bmN0aW9uIHRvIGZhaWw7IHRoZXJlIGlzIG5vdyBhCi0gICBjb21tYW5kLWxpbmUgb3B0aW9uIHRvIGZvcmNlIGRldGVjdGlvbiBvZiBhIFJPTS1sZXNzIGNhcmQuCi0KLVVQREFURSBORVdTOiB2ZXJzaW9uIDEuMjRhIC0gMjQgRmViIDk2Ci0KLSAgIFRoZXJlIHdhcyBhIGJ1ZyBpbiB0aGUgc3luY2hyb25vdXMgdHJhbnNmZXIgY29kZS4gT25seQotICAgYSBmZXcgcGVvcGxlIGRvd25sb2FkZWQgYmVmb3JlIEkgY2F1Z2h0IGl0IC0gY291bGQgaGF2ZQotICAgYmVlbiB3b3JzZS4KLQotVVBEQVRFIE5FV1M6IHZlcnNpb24gMS4yNCAtIDIzIEZlYiA5NgotCi0gICBMb3RzIG9mIGdvb2QgY2hhbmdlcy4gQWR2aWNlIGZyb20gQmlsbCBFYXJuZXN0IHJlc3VsdGVkCi0gICBpbiBtdWNoIGJldHRlciBkZXRlY3Rpb24gb2YgY2FyZHMsIG1vcmUgZWZmaWNpZW50IHVzYWdlCi0gICBvZiB0aGUgZmlmbywgYW5kIChob3BlZnVsbHkpIGZhc3RlciBkYXRhIHRyYW5zZmVycy4gVGhlCi0gICBqdXJ5IGlzIHN0aWxsIG91dCBvbiBzcGVlZCAtIEkgaG9wZSBpdCdzIGltcHJvdmVkIHNvbWUuCi0gICBPbmUgbmlmdHkgbmV3IGZlYXR1cmUgaXMgYSBjb29sIHdheSBvZiBkb2luZyBkaXNjb25uZWN0LwotICAgcmVzZWxlY3QuIFRoZSBkcml2ZXIgZGVmYXVsdHMgdG8gd2hhdCBJJ20gY2FsbGluZwotICAgJ2FkYXB0aXZlIGRpc2Nvbm5lY3QnIC0gbWVhbmluZyB0aGF0IGVhY2ggY29tbWFuZCBpcwotICAgZXZhbHVhdGVkIGluZGl2aWR1YWxseSBhcyB0byB3aGV0aGVyIG9yIG5vdCBpdCBzaG91bGQgYmUKLSAgIHJ1biB3aXRoIHRoZSBvcHRpb24gdG8gZGlzY29ubmVjdC9yZXNlbGVjdCAoaWYgdGhlIGRldmljZQotICAgY2hvb3NlcyksIG9yIGFzIGEgIlNDU0ktYnVzLWhvZyIuIFdoZW4gc2V2ZXJhbCBkZXZpY2VzCi0gICBhcmUgb3BlcmF0aW5nIHNpbXVsdGFuZW91c2x5LCBkaXNjb25uZWN0cyBhcmUgdXN1YWxseSBhbgotICAgYWR2YW50YWdlLiBJbiBhIHNpbmdsZSBkZXZpY2Ugc3lzdGVtLCBvciBpZiBvbmx5IDEgZGV2aWNlCi0gICBpcyBiZWluZyBhY2Nlc3NlZCwgdHJhbnNmZXJzIHVzdWFsbHkgZ28gZmFzdGVyIGlmIGRpc2Nvbm5lY3RzCi0gICBhcmUgbm90IGFsbG93ZWQuCi0KLQotCi1UaGUgZGVmYXVsdCBhcmd1bWVudHMgKHlvdSBnZXQgdGhlc2Ugd2hlbiB5b3UgZG9uJ3QgZ2l2ZSBhbiAnaW4yMDAwJwotY29tbWFuZC1saW5lIGFyZ3VtZW50LCBvciB5b3UgZ2l2ZSBhIGJsYW5rIGFyZ3VtZW50KSB3aWxsIGNhdXNlCi10aGUgZHJpdmVyIHRvIGRvIGFkYXB0aXZlIGRpc2Nvbm5lY3QsIHN5bmNocm9ub3VzIHRyYW5zZmVycywgYW5kIGEKLW1pbmltdW0gb2YgZGVidWcgbWVzc2FnZXMuIElmIHlvdSB3YW50IHRvIGZvb2wgd2l0aCB0aGUgb3B0aW9ucywKLXNlYXJjaCBmb3IgJ3NldHVwX3N0cmluZ3MnIG5lYXIgdGhlIHRvcCBvZiB0aGUgaW4yMDAwLmMgZmlsZSBhbmQKLWNoZWNrIHRoZSAnaG9zdGRhdGEtPmFyZ3MnIHNlY3Rpb24gaW4gaW4yMDAwLmggLSBidXQgYmUgd2FybmVkISBOb3QKLWV2ZXJ5dGhpbmcgaXMgd29ya2luZyB5ZXQgKHNvbWUgdGhpbmdzIHdpbGwgbmV2ZXIgd29yaywgcHJvYmFibHkpLgotSSBiZWxpZXZlIHRoYXQgZGlzYWJsaW5nIGRpc2Nvbm5lY3RzIChESVNfTkVWRVIpIHdpbGwgYWxsb3cgeW91Ci10byBjaG9vc2UgYSBMRVZFTDIgdmFsdWUgaGlnaGVyIHRoYW4gJ0wyX0JBU0lDJywgYnV0IEkgaGF2ZW4ndAotc3BlbnQgYSBsb3Qgb2YgdGltZSB0ZXN0aW5nIHRoaXMuIFlvdSBtaWdodCB0cnkgJ0VOQUJMRV9DTFVTVEVSSU5HJwotdG8gc2VlIHdoYXQgaGFwcGVuczogbXkgdGVzdHMgc2hvd2VkIGxpdHRsZSBkaWZmZXJlbmNlIGVpdGhlciB3YXkuCi1UaGVyZSdzIGFsc28gYSBkZWZpbmUgY2FsbGVkICdERUZBVUxUX1NYX1BFUic7IHRoaXMgc2V0cyB0aGUgZGF0YQotdHJhbnNmZXIgc3BlZWQgZm9yIHRoZSBhc3luY2hyb25vdXMgbW9kZS4gSSd2ZSBwdXQgaXQgYXQgNTAwIG5zCi1kZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlIGNhcmQgY291bGQgaGFuZGxlIHNldHRpbmdzIG9mIDM3NiBvcgotMjUyLCBiZWNhdXNlIGhpZ2hlciBzcGVlZHMgbWF5IGJlIGEgcHJvYmxlbSB3aXRoIHBvb3IgcXVhbGl0eQotY2FibGVzIG9yIGltcHJvcGVyIHRlcm1pbmF0aW9uOyA1MDAgbnMgaXMgYSBjb21wcm9taXNlLiBZb3UgY2FuCi1jaG9vc2UgeW91ciBvd24gZGVmYXVsdCB0aHJvdWdoIHRoZSBjb21tYW5kLWxpbmUgd2l0aCB0aGUKLSdwZXJpb2QnIGtleXdvcmQuCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qKioqKioqKioqKiAgRElQIHN3aXRjaCBzZXR0aW5ncyAgKioqKioqKioqKioqKioKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICBzdzEtMSBzdzEtMiAgICBCSU9TIGFkZHJlc3MgKGhleCkKLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgb2ZmICAgb2ZmICAgICBDODAwMCAtIENCRkYwCi0gICAgb24gICAgb2ZmICAgICBEODAwMCAtIERCRkYwCi0gICAgb2ZmICAgb24gICAgICBEMDAwMCAtIEQzRkYwCi0gICAgb24gICAgb24gICAgICBCSU9TIGRpc2FibGVkCi0KLSAgIHN3MS0zIHN3MS00ICAgIElPIHBvcnQgYWRkcmVzcyAoaGV4KQotICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgb2ZmICAgb2ZmICAgICAyMjAgLSAyMkYKLSAgICBvbiAgICBvZmYgICAgIDIwMCAtIDIwRgotICAgIG9mZiAgIG9uICAgICAgMTEwIC0gMTFGCi0gICAgb24gICAgb24gICAgICAxMDAgLSAxMEYKLQotICAgc3cxLTUgc3cxLTYgc3cxLTcgICAgSW50ZXJydXB0Ci0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBvZmYgICBvZmYgICBvZmYgICAgIDE1Ci0gICAgb2ZmICAgb24gICAgb2ZmICAgICAxNAotICAgIG9mZiAgIG9mZiAgIG9uICAgICAgMTEKLSAgICBvZmYgICBvbiAgICBvbiAgICAgIDEwCi0gICAgb24gICAgLSAgICAgLSAgICAgICBkaXNhYmxlZAotCi0gICBzdzEtOCBmdW5jdGlvbiBkZXBlbmRzIG9uIEJJT1MgdmVyc2lvbi4gSW4gZWFybGllciB2ZXJzaW9ucyB0aGlzCi0gICBjb250cm9sbGVkIHN5bmNocm9ub3VzIGRhdGEgdHJhbnNmZXIgc3VwcG9ydCBmb3IgTVNET1M6Ci0gICAgICBvZmYgPSBkaXNhYmxlZAotICAgICAgb24gID0gZW5hYmxlZAotICAgSW4gbGF0ZXIgUk9NcyAoc3RhcnRpbmcgd2l0aCAwMS4zIGluIEFwcmlsIDE5OTQpIHN3MS04IGNvbnRyb2xzCi0gICB0aGUgImdyZWF0ZXIgdGhhbiAyIGRpc2sgZHJpdmUiIGZlYXR1cmUgdGhhdCBmaXJzdCBhcHBlYXJlZCBpbgotICAgTVNET1MgNS4wIChpZ25vcmVkIGJ5IExpbnV4KToKLSAgICAgIG9mZiA9IDIgZHJpdmVzIG1heGltdW0KLSAgICAgIG9uICA9IDcgZHJpdmVzIG1heGltdW0KLQotICAgc3cxLTkgICAgRmxvcHB5IGNvbnRyb2xsZXIKLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgb2ZmICAgICBkaXNhYmxlZAotICAgIG9uICAgICAgZW5hYmxlZAotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgSSBzaG91bGQgbWVudGlvbiB0aGF0IERyZXcgRWNraGFyZHQncyAnR2VuZXJpYyBOQ1I1MzgwJyBzb3VyY2VzCi0gICB3ZXJlIG15IG1haW4gaW5zcGlyYXRpb24sIHdpdGggbG90cyBvZiByZWZlcmVuY2UgdG8gdGhlIElOMjAwMAotICAgZHJpdmVyIGN1cnJlbnRseSBkaXN0cmlidXRlZCBpbiB0aGUga2VybmVsIHNvdXJjZS4gSSBhbHNvIG93ZQotICAgbXVjaCB0byBhIGRyaXZlciB3cml0dGVuIGJ5IEhhbWlzaCBNYWNkb25hbGQgZm9yIExpbnV4LW02OGsoISkuCi0gICBBbmQgdG8gRXJpYyBXcmlnaHQgZm9yIGJlaW5nIGFuIEFMUEhBIGd1aW5lYSBwaWcuIEFuZCB0byBCaWxsCi0gICBFYXJuZXN0IGZvciAyIHRvbnMgb2YgZ3JlYXQgaW5wdXQgYW5kIGluZm9ybWF0aW9uLiBBbmQgdG8gRGF2aWQKLSAgIFdpbGxtb3JlIGZvciBleHRlbnNpdmUgJ2Jvbm5pZScgdGVzdGluZy4gQW5kIHRvIEpvZSBNYWNrIGZvcgotICAgY29udGludWFsIHRlc3RpbmcgYW5kIGZlZWRiYWNrLgotCi0KLSAgICAgICAgICAgIEpvaG4gU2hpZmZsZXR0ICAgIGpzaGlmZmxlQG5ldGNvbS5jb20KLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Njc2ktcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1wYXJhbWV0ZXJzLnR4dAppbmRleCAxMjQxYWMxLi44ZTY2ZGFmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvc2NzaS1wYXJhbWV0ZXJzLnR4dApAQCAtMzQsOSArMzQsNiBAQAogCQkJU2VlIGRyaXZlcnMvc2NzaS9CdXNMb2dpYy5jLCBjb21tZW50IGJlZm9yZSBmdW5jdGlvbgogCQkJQnVzTG9naWNfUGFyc2VEcml2ZXJPcHRpb25zKCkuCiAKLQlkdGMzMTgxZT0JW0hXLFNDU0ldCi0JCQlTZWUgRG9jdW1lbnRhdGlvbi9zY3NpL2dfTkNSNTM4MC50eHQuCi0KIAllYXRhPQkJW0hXLFNDU0ldCiAKIAlmZG9tYWluPQlbSFcsU0NTSV0KQEAgLTQ3LDkgKzQ0LDYgQEAKIAogCWd2cDExPQkJW0hXLFNDU0ldCiAKLQlpbjIwMDA9CQlbSFcsU0NTSV0KLQkJCVNlZSBoZWFkZXIgb2YgZHJpdmVycy9zY3NpL2luMjAwMC5jLgotCiAJaXBzPQkJW0hXLFNDU0ldIEFkYXB0ZWMgLyBJQk0gU2VydmVSQUlEIGNvbnRyb2xsZXIKIAkJCVNlZSBoZWFkZXIgb2YgZHJpdmVycy9zY3NpL2lwcy5jLgogCkBAIC03OSwxNSArNzMsMTAgQEAKIAogCW5jcjUzYzh4eD0JW0hXLFNDU0ldCiAKLQlub2Rpc2Nvbm5lY3QJW0hXLFNDU0ksTTY4S10gRGlzYWJsZXMgU0NTSSBkaXNjb25uZWN0cy4KLQogCW9zc3Q9CQlbSFcsU0NTSV0gU0NTSSBUYXBlIERyaXZlcgogCQkJRm9ybWF0OiA8YnVmZmVyX3NpemU+LDx3cml0ZV90aHJlc2hvbGQ+CiAJCQlTZWUgYWxzbyBEb2N1bWVudGF0aW9uL3Njc2kvc3QudHh0LgogCi0JcGFzMTY9CQlbSFcsU0NTSV0KLQkJCVNlZSBoZWFkZXIgb2YgZHJpdmVycy9zY3NpL3BhczE2LmMuCi0KIAlzY3NpX2RlYnVnXyo9CVtTQ1NJXQogCQkJU2VlIGRyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMuCiAKQEAgLTEyMSwxOCArMTEwLDkgQEAKIAlzeW01M2M0MTY9CVtIVyxTQ1NJXQogCQkJU2VlIGhlYWRlciBvZiBkcml2ZXJzL3Njc2kvc3ltNTNjNDE2LmMuCiAKLQl0MTI4PQkJW0hXLFNDU0ldCi0JCQlTZWUgaGVhZGVyIG9mIGRyaXZlcnMvc2NzaS90MTI4LmMuCi0KIAl0bXNjc2ltPQlbSFcsU0NTSV0KIAkJCVNlZSBjb21tZW50IGJlZm9yZSBmdW5jdGlvbiBkYzM5MF9zZXR1cCgpIGluCiAJCQlkcml2ZXJzL3Njc2kvdG1zY3NpbS5jLgogCi0JdTE0LTM0Zj0JW0hXLFNDU0ldIFVsdHJhU3RvciAxNEYvMzRGIFNDU0kgaG9zdCBhZGFwdGVyCi0JCQlTZWUgaGVhZGVyIG9mIGRyaXZlcnMvc2NzaS91MTQtMzRmLmMuCi0KIAl3ZDMzYzkzPQlbSFcsU0NTSV0KIAkJCVNlZSBoZWFkZXIgb2YgZHJpdmVycy9zY3NpL3dkMzNjOTMuYy4KLQotCXdkNzAwMD0JCVtIVyxTQ1NJXQotCQkJU2VlIGhlYWRlciBvZiBkcml2ZXJzL3Njc2kvd2Q3MDAwLmMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvc21hcnRwcWkudHh0IGIvRG9jdW1lbnRhdGlvbi9zY3NpL3NtYXJ0cHFpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjM3N2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zY3NpL3NtYXJ0cHFpLnR4dApAQCAtMCwwICsxLDgwIEBACisKK1NNQVJUUFFJIC0gTWljcm9zZW1pIFNtYXJ0IFBRSSBEcml2ZXIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNtYXJ0cHFpIFNDU0kgZHJpdmVyIGZvciBNaWNyb3NlbWkKKyhodHRwOi8vd3d3Lm1pY3Jvc2VtaS5jb20pIFBRSSBjb250cm9sbGVycy4gVGhlIHNtYXJ0cHFpIGRyaXZlcgoraXMgdGhlIG5leHQgZ2VuZXJhdGlvbiBTQ1NJIGRyaXZlciBmb3IgTWljcm9zZW1pIENvcnAuIFRoZSBzbWFydHBxaQorZHJpdmVyIGlzIHRoZSBmaXJzdCBTQ1NJIGRyaXZlciB0byBpbXBsZW1lbnQgdGhlIFBRSSBxdWV1aW5nIG1vZGVsLgorCitUaGUgc21hcnRwcWkgZHJpdmVyIHdpbGwgcmVwbGFjZSB0aGUgYWFjcmFpZCBkcml2ZXIgZm9yIEFkYXB0ZWMgU2VyaWVzIDkKK2NvbnRyb2xsZXJzLiBDdXN0b21lcnMgcnVubmluZyBhbiBvbGRlciBrZXJuZWwgKFByZS00LjkpIHVzaW5nIGFuIEFkYXB0ZWMKK1NlcmllcyA5IGNvbnRyb2xsZXIgd2lsbCBoYXZlIHRvIGNvbmZpZ3VyZSB0aGUgc21hcnRwcWkgZHJpdmVyIG9yIHRoZWlyCit2b2x1bWVzIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSBPUy4KKworRm9yIE1pY3Jvc2VtaSBzbWFydHBxaSBjb250cm9sbGVyIHN1cHBvcnQsIGVuYWJsZSB0aGUgc21hcnRwcWkgZHJpdmVyCit3aGVuIGNvbmZpZ3VyaW5nIHRoZSBrZXJuZWwuCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBQUUkgUXVldWluZyBJbnRlcmZhY2UsIHBsZWFzZSBzZWU6CitodHRwOi8vd3d3LnQxMC5vcmcvZHJhZnRzLmh0bQoraHR0cDovL3d3dy50MTAub3JnL21lbWJlcnMvd19wcWkyLmh0bQorCitTdXBwb3J0ZWQgZGV2aWNlczoKKy0tLS0tLS0tLS0tLS0tLS0tLQorPENvbnRyb2xsZXIgbmFtZXMgdG8gYmUgYWRkZWQgYXMgdGhleSBiZWNvbWUgcHVibGljYWxseSBhdmFpbGFibGUuPgorCitzbWFydHBxaSBzcGVjaWZpYyBlbnRyaWVzIGluIC9zeXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgc21hcnRwcWkgaG9zdCBhdHRyaWJ1dGVzOgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC9zeXMvY2xhc3Mvc2NzaV9ob3N0L2hvc3QqL3Jlc2NhbgorICAvc3lzL2NsYXNzL3Njc2lfaG9zdC9ob3N0Ki92ZXJzaW9uCisKKyAgVGhlIGhvc3QgcmVzY2FuIGF0dHJpYnV0ZSBpcyBhIHdyaXRlIG9ubHkgYXR0cmlidXRlLiBXcml0aW5nIHRvIHRoaXMKKyAgYXR0cmlidXRlIHdpbGwgdHJpZ2dlciB0aGUgZHJpdmVyIHRvIHNjYW4gZm9yIG5ldywgY2hhbmdlZCwgb3IgcmVtb3ZlZAorICBkZXZpY2VzIGFuZCBub3RpZnkgdGhlIFNDU0kgbWlkLWxheWVyIG9mIGFueSBjaGFuZ2VzIGRldGVjdGVkLgorCisgIFRoZSB2ZXJzaW9uIGF0dHJpYnV0ZSBpcyByZWFkLW9ubHkgYW5kIHdpbGwgcmV0dXJuIHRoZSBkcml2ZXIgdmVyc2lvbgorICBhbmQgdGhlIGNvbnRyb2xsZXIgZmlybXdhcmUgdmVyc2lvbi4KKyAgRm9yIGV4YW1wbGU6CisgICAgICAgICAgICAgIGRyaXZlcjogMC45LjEzLTM3MAorICAgICAgICAgICAgICBmaXJtd2FyZTogMC4wMS01MjIKKworICBzbWFydHBxaSBzYXMgZGV2aWNlIGF0dHJpYnV0ZXMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIEhCQSBkZXZpY2VzIGFyZSBhZGRlZCB0byB0aGUgU0FTIHRyYW5zcG9ydCBsYXllci4gVGhlc2UgYXR0cmlidXRlcyBhcmUKKyAgYXV0b21hdGljYWxseSBhZGRlZCBieSB0aGUgU0FTIHRyYW5zcG9ydCBsYXllci4KKworICAvc3lzL2NsYXNzL3Nhc19kZXZpY2UvZW5kX2RldmljZS1YOlgvc2FzX2FkZHJlc3MKKyAgL3N5cy9jbGFzcy9zYXNfZGV2aWNlL2VuZF9kZXZpY2UtWDpYL2VuY2xvc3VyZV9pZGVudGlmaWVyCisgIC9zeXMvY2xhc3Mvc2FzX2RldmljZS9lbmRfZGV2aWNlLVg6WC9zY3NpX3RhcmdldF9pZAorCitzbWFydHBxaSBzcGVjaWZpYyBpb2N0bHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhcHBsaWNhdGlvbnMgd3JpdHRlbiBmb3IgdGhlIGNjaXNzIHByb3RvY29sLgorCisgIENDSVNTX0RFUkVHRElTSworICBDQ0lTU19SRUdORVdESVNLCisgIENDSVNTX1JFR05FV0QKKworICBUaGUgYWJvdmUgdGhyZWUgaW9jdGxzIGFsbCBkbyBleGFjdGx5IHRoZSBzYW1lIHRoaW5nLCB3aGljaCBpcyB0byBjYXVzZSB0aGUgZHJpdmVyCisgIHRvIHJlc2NhbiBmb3IgbmV3IGRldmljZXMuICBUaGlzIGRvZXMgZXhhY3RseSB0aGUgc2FtZSB0aGluZyBhcyB3cml0aW5nIHRvIHRoZQorICBzbWFydHBxaSBzcGVjaWZpYyBob3N0ICJyZXNjYW4iIGF0dHJpYnV0ZS4KKworICBDQ0lTU19HRVRQQ0lJTkZPCisKKwlSZXR1cm5zIFBDSSBkb21haW4sIGJ1cywgZGV2aWNlIGFuZCBmdW5jdGlvbiBhbmQgImJvYXJkIElEIiAoUENJIHN1YnN5c3RlbSBJRCkuCisKKyAgQ0NJU1NfR0VURFJJVlZFUgorCisJUmV0dXJucyBkcml2ZXIgdmVyc2lvbiBpbiB0aHJlZSBieXRlcyBlbmNvZGVkIGFzOgorCShEUklWRVJfTUFKT1IgPDwgMjgpIHwgKERSSVZFUl9NSU5PUiA8PCAyNCkgfCAoRFJJVkVSX1JFTEVBU0UgPDwgMTYpIHwgRFJJVkVSX1JFVklTSU9OOworCisgIENDSVNTX1BBU1NUSFJVCisKKwlBbGxvd3MgIkJNSUMiIGFuZCAiQ0lTUyIgY29tbWFuZHMgdG8gYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIFNtYXJ0IFN0b3JhZ2UgQXJyYXkuCisJVGhlc2UgYXJlIHVzZWQgZXh0ZW5zaXZlbHkgYnkgdGhlIFNTQSBBcnJheSBDb25maWd1cmF0aW9uIFV0aWxpdHksIFNOTVAgc3RvcmFnZQorCWFnZW50cywgZXRjLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NlcmlhbC9zZXJpYWwtcnM0ODUudHh0IGIvRG9jdW1lbnRhdGlvbi9zZXJpYWwvc2VyaWFsLXJzNDg1LnR4dAppbmRleCAyMjUzYjhiLi4zODlmY2Q0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NlcmlhbC9zZXJpYWwtcnM0ODUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2VyaWFsL3NlcmlhbC1yczQ4NS50eHQKQEAgLTQ1LDkgKzQ1LDggQEAKIAogCSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KIAotCS8qIFJTNDg1IGlvY3RsczogKi8KLQkjZGVmaW5lIFRJT0NHUlM0ODUgICAgICAweDU0MkUKLQkjZGVmaW5lIFRJT0NTUlM0ODUgICAgICAweDU0MkYKKwkvKiBJbmNsdWRlIGRlZmluaXRpb24gZm9yIFJTNDg1IGlvY3RsczogVElPQ0dSUzQ4NSBhbmQgVElPQ1NSUzQ4NSAqLworCSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KIAogCS8qIE9wZW4geW91ciBzcGVjaWZpYyBkZXZpY2UgKGUuZy4sIC9kZXYvbXlkZXZpY2UpOiAqLwogCWludCBmZCA9IG9wZW4gKCIvZGV2L215ZGV2aWNlIiwgT19SRFdSKTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BhcnNlLnR4dCBiL0RvY3VtZW50YXRpb24vc3BhcnNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNlYWIxMy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwYXJzZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotQ29weXJpZ2h0IDIwMDQgTGludXMgVG9ydmFsZHMKLUNvcHlyaWdodCAyMDA0IFBhdmVsIE1hY2hlayA8cGF2ZWxAdWN3LmN6PgotQ29weXJpZ2h0IDIwMDYgQm9iIENvcGVsYW5kIDxtZUBib2Jjb3BlbGFuZC5jb20+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+fn4KLQotRG8gYSBrZXJuZWwgbWFrZSB3aXRoICJtYWtlIEM9MSIgdG8gcnVuIHNwYXJzZSBvbiBhbGwgdGhlIEMgZmlsZXMgdGhhdCBnZXQKLXJlY29tcGlsZWQsIG9yIHVzZSAibWFrZSBDPTIiIHRvIHJ1biBzcGFyc2Ugb24gdGhlIGZpbGVzIHdoZXRoZXIgdGhleSBuZWVkIHRvCi1iZSByZWNvbXBpbGVkIG9yIG5vdC4gIFRoZSBsYXR0ZXIgaXMgYSBmYXN0IHdheSB0byBjaGVjayB0aGUgd2hvbGUgdHJlZSBpZiB5b3UKLWhhdmUgYWxyZWFkeSBidWlsdCBpdC4KLQotVGhlIG9wdGlvbmFsIG1ha2UgdmFyaWFibGUgQ0YgY2FuIGJlIHVzZWQgdG8gcGFzcyBhcmd1bWVudHMgdG8gc3BhcnNlLiAgVGhlCi1idWlsZCBzeXN0ZW0gcGFzc2VzIC1XYml0d2lzZSB0byBzcGFyc2UgYXV0b21hdGljYWxseS4gIFRvIHBlcmZvcm0gZW5kaWFubmVzcwotY2hlY2tzLCB5b3UgbWF5IGRlZmluZSBfX0NIRUNLX0VORElBTl9fOgotCi0gICAgICAgIG1ha2UgQz0yIENGPSItRF9fQ0hFQ0tfRU5ESUFOX18iCi0KLVRoZXNlIGNoZWNrcyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCBhcyB0aGV5IGdlbmVyYXRlIGEgaG9zdCBvZiB3YXJuaW5ncy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BoaW54LXN0YXRpYy90aGVtZV9vdmVycmlkZXMuY3NzIGIvRG9jdW1lbnRhdGlvbi9zcGhpbngtc3RhdGljL3RoZW1lX292ZXJyaWRlcy5jc3MKaW5kZXggZTg4NDYxYy4uZDU3NjRhNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGhpbngtc3RhdGljL3RoZW1lX292ZXJyaWRlcy5jc3MKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGhpbngtc3RhdGljL3RoZW1lX292ZXJyaWRlcy5jc3MKQEAgLTQyLDYgKzQyLDIwIEBACiAgICAgY2FwdGlvbiBhLmhlYWRlcmxpbmsgeyBvcGFjaXR5OiAwOyB9CiAgICAgY2FwdGlvbiBhLmhlYWRlcmxpbms6aG92ZXIgeyBvcGFjaXR5OiAxOyB9CiAKKyAgICAvKiBNZW51IHNlbGVjdGlvbiBhbmQga2V5c3Ryb2tlcyAqLworCisgICAgc3Bhbi5tZW51c2VsZWN0aW9uIHsKKwljb2xvcjogYmx1ZTsKKwlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlCisgICAgfQorCisgICAgY29kZS5rYmQsIGNvZGUua2JkIHNwYW4geworCWNvbG9yOiB3aGl0ZTsKKwliYWNrZ3JvdW5kLWNvbG9yOiBkYXJrYmx1ZTsKKwlmb250LXdlaWdodDogYm9sZDsKKwlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IiwgQ291cmllciwgbW9ub3NwYWNlCisgICAgfQorCiAgICAgLyogaW5saW5lIGxpdGVyYWw6IGRyb3AgdGhlIGJvcmRlcmJveCwgcGFkZGluZyBhbmQgcmVkIGNvbG9yICovCiAKICAgICBjb2RlLCAucnN0LWNvbnRlbnQgdHQsIC5yc3QtY29udGVudCBjb2RlIHsKQEAgLTU1LDUgKzY5LDQgQEAKICAgICAucnN0LWNvbnRlbnQgdHQubGl0ZXJhbCwucnN0LWNvbnRlbnQgdHQubGl0ZXJhbCwucnN0LWNvbnRlbnQgY29kZS5saXRlcmFsIHsKICAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaGlueC9jZG9tYWluLnB5IGIvRG9jdW1lbnRhdGlvbi9zcGhpbngvY2RvbWFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjA0MTljCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGhpbngvY2RvbWFpbi5weQpAQCAtMCwwICsxLDE2NSBAQAorIyAtKi0gY29kaW5nOiB1dGYtODsgbW9kZTogcHl0aG9uIC0qLQorIyBweWxpbnQ6IGRpc2FibGU9VzAxNDEsQzAxMTMsQzAxMDMsQzAzMjUKK3UiIiIKKyAgICBjZG9tYWluCisgICAgfn5+fn5+fgorCisgICAgUmVwbGFjZW1lbnQgZm9yIHRoZSBzcGhpbnggYy1kb21haW4uCisKKyAgICA6Y29weXJpZ2h0OiAgQ29weXJpZ2h0IChDKSAyMDE2ICBNYXJrdXMgSGVpc2VyCisgICAgOmxpY2Vuc2U6ICAgIEdQTCBWZXJzaW9uIDIsIEp1bmUgMTk5MSBzZWUgTGludXgvQ09QWUlORyBmb3IgZGV0YWlscy4KKworICAgIExpc3Qgb2YgY3VzdG9taXphdGlvbnM6CisKKyAgICAqIE1vdmVkIHRoZSAqZHVwbGljYXRlIEMgb2JqZWN0IGRlc2NyaXB0aW9uKiB3YXJuaW5ncyBmb3IgZnVuY3Rpb24KKyAgICAgIGRlY2xhcmF0aW9ucyBpbiB0aGUgbml0cGlja3kgbW9kZS4gU2VlIFNwaGlueCBkb2N1bWVudGF0aW9uIGZvcgorICAgICAgdGhlIGNvbmZpZyB2YWx1ZXMgZm9yIGBgbml0cGlja2BgIGFuZCBgYG5pdHBpY2tfaWdub3JlYGAuCisKKyAgICAqIEFkZCBvcHRpb24gJ25hbWUnIHRvIHRoZSAiYzpmdW5jdGlvbjoiIGRpcmVjdGl2ZS4gIFdpdGggb3B0aW9uICduYW1lJyB0aGUKKyAgICAgIHJlZi1uYW1lIG9mIGEgZnVuY3Rpb24gY2FuIGJlIG1vZGlmaWVkLiBFLmcuOjoKKworICAgICAgICAgIC4uIGM6ZnVuY3Rpb246OiBpbnQgaW9jdGwoIGludCBmZCwgaW50IHJlcXVlc3QgKQorICAgICAgICAgICAgIDpuYW1lOiBWSURJT0NfTE9HX1NUQVRVUworCisgICAgICBUaGUgZnVuYy1uYW1lIChlLmcuIGlvY3RsKSByZW1haW5zIGluIHRoZSBvdXRwdXQgYnV0IHRoZSByZWYtbmFtZSBjaGFuZ2VkCisgICAgICBmcm9tICdpb2N0bCcgdG8gJ1ZJRElPQ19MT0dfU1RBVFVTJy4gVGhlIGZ1bmN0aW9uIGlzIHJlZmVyZW5jZWQgYnk6OgorCisgICAgICAgICAgKiA6YzpmdW5jOmBWSURJT0NfTE9HX1NUQVRVU2Agb3IKKyAgICAgICAgICAqIDphbnk6YFZJRElPQ19MT0dfU1RBVFVTYCAoYGA6YW55OmBgIG5lZWRzIHNwaGlueCAxLjMpCisKKyAgICAgKiBIYW5kbGUgc2lnbmF0dXJlcyBvZiBmdW5jdGlvbi1saWtlIG1hY3JvcyB3ZWxsLiBEb24ndCB0cnkgdG8gZGVkdWNlCisgICAgICAgYXJndW1lbnRzIHR5cGVzIG9mIGZ1bmN0aW9uLWxpa2UgbWFjcm9zLgorCisiIiIKKworZnJvbSBkb2N1dGlscyBpbXBvcnQgbm9kZXMKK2Zyb20gZG9jdXRpbHMucGFyc2Vycy5yc3QgaW1wb3J0IGRpcmVjdGl2ZXMKKworaW1wb3J0IHNwaGlueAorZnJvbSBzcGhpbnggaW1wb3J0IGFkZG5vZGVzCitmcm9tIHNwaGlueC5kb21haW5zLmMgaW1wb3J0IGNfZnVuY3B0cl9zaWdfcmUsIGNfc2lnX3JlCitmcm9tIHNwaGlueC5kb21haW5zLmMgaW1wb3J0IENPYmplY3QgYXMgQmFzZV9DT2JqZWN0Citmcm9tIHNwaGlueC5kb21haW5zLmMgaW1wb3J0IENEb21haW4gYXMgQmFzZV9DRG9tYWluCisKK19fdmVyc2lvbl9fICA9ICcxLjAnCisKKyMgR2V0IFNwaGlueCB2ZXJzaW9uCittYWpvciwgbWlub3IsIHBhdGNoID0gbWFwKGludCwgc3BoaW54Ll9fdmVyc2lvbl9fLnNwbGl0KCIuIikpCisKK2RlZiBzZXR1cChhcHApOgorCisgICAgYXBwLm92ZXJyaWRlX2RvbWFpbihDRG9tYWluKQorCisgICAgcmV0dXJuIGRpY3QoCisgICAgICAgIHZlcnNpb24gPSBfX3ZlcnNpb25fXywKKyAgICAgICAgcGFyYWxsZWxfcmVhZF9zYWZlID0gVHJ1ZSwKKyAgICAgICAgcGFyYWxsZWxfd3JpdGVfc2FmZSA9IFRydWUKKyAgICApCisKK2NsYXNzIENPYmplY3QoQmFzZV9DT2JqZWN0KToKKworICAgICIiIgorICAgIERlc2NyaXB0aW9uIG9mIGEgQyBsYW5ndWFnZSBvYmplY3QuCisgICAgIiIiCisgICAgb3B0aW9uX3NwZWMgPSB7CisgICAgICAgICJuYW1lIiA6IGRpcmVjdGl2ZXMudW5jaGFuZ2VkCisgICAgfQorCisgICAgZGVmIGhhbmRsZV9mdW5jX2xpa2VfbWFjcm8oc2VsZiwgc2lnLCBzaWdub2RlKToKKyAgICAgICAgdSIiIkhhbmRsZXMgc2lnbmF0dXJlcyBvZiBmdW5jdGlvbi1saWtlIG1hY3Jvcy4KKworICAgICAgICBJZiB0aGUgb2JqdHlwZSBpcyAnZnVuY3Rpb24nIGFuZCB0aGUgdGhlIHNpZ25hdHVyZSBgYHNpZ2BgIGlzIGEKKyAgICAgICAgZnVuY3Rpb24tbGlrZSBtYWNybywgdGhlIG5hbWUgb2YgdGhlIG1hY3JvIGlzIHJldHVybmVkLiBPdGhlcndpc2UKKyAgICAgICAgYGBGYWxzZWBgIGlzIHJldHVybmVkLiAgIiIiCisKKyAgICAgICAgaWYgbm90IHNlbGYub2JqdHlwZSA9PSAnZnVuY3Rpb24nOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgbSA9IGNfZnVuY3B0cl9zaWdfcmUubWF0Y2goc2lnKQorICAgICAgICBpZiBtIGlzIE5vbmU6CisgICAgICAgICAgICBtID0gY19zaWdfcmUubWF0Y2goc2lnKQorICAgICAgICAgICAgaWYgbSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ25vIG1hdGNoJykKKworICAgICAgICByZXR0eXBlLCBmdWxsbmFtZSwgYXJnbGlzdCwgX2NvbnN0ID0gbS5ncm91cHMoKQorICAgICAgICBhcmdsaXN0ID0gYXJnbGlzdC5zdHJpcCgpCisgICAgICAgIGlmIHJldHR5cGUgb3Igbm90IGFyZ2xpc3Q6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBhcmdsaXN0ID0gYXJnbGlzdC5yZXBsYWNlKCdgJywgJycpLnJlcGxhY2UoJ1xcICcsICcnKSAjIHJlbW92ZSBtYXJrdXAKKyAgICAgICAgYXJnbGlzdCA9IFthLnN0cmlwKCkgZm9yIGEgaW4gYXJnbGlzdC5zcGxpdCgiLCIpXQorCisgICAgICAgICMgaGFzIHRoZSBmaXJzdCBhcmd1bWVudCBhIHR5cGU/CisgICAgICAgIGlmIGxlbihhcmdsaXN0WzBdLnNwbGl0KCIgIikpID4gMToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMgVGhpcyBpcyBhIGZ1bmN0aW9uLWxpa2UgbWFjcm8sIGl0J3MgYXJndW1lbnRzIGFyZSB0eXBlbGVzcyEKKyAgICAgICAgc2lnbm9kZSAgKz0gYWRkbm9kZXMuZGVzY19uYW1lKGZ1bGxuYW1lLCBmdWxsbmFtZSkKKyAgICAgICAgcGFyYW1saXN0ID0gYWRkbm9kZXMuZGVzY19wYXJhbWV0ZXJsaXN0KCkKKyAgICAgICAgc2lnbm9kZSAgKz0gcGFyYW1saXN0CisKKyAgICAgICAgZm9yIGFyZ25hbWUgaW4gYXJnbGlzdDoKKyAgICAgICAgICAgIHBhcmFtID0gYWRkbm9kZXMuZGVzY19wYXJhbWV0ZXIoJycsICcnLCBub2VtcGg9VHJ1ZSkKKyAgICAgICAgICAgICMgc2VwYXJhdGUgYnkgbm9uLWJyZWFraW5nIHNwYWNlIGluIHRoZSBvdXRwdXQKKyAgICAgICAgICAgIHBhcmFtICs9IG5vZGVzLmVtcGhhc2lzKGFyZ25hbWUsIGFyZ25hbWUpCisgICAgICAgICAgICBwYXJhbWxpc3QgKz0gcGFyYW0KKworICAgICAgICByZXR1cm4gZnVsbG5hbWUKKworICAgIGRlZiBoYW5kbGVfc2lnbmF0dXJlKHNlbGYsIHNpZywgc2lnbm9kZSk6CisgICAgICAgICIiIlRyYW5zZm9ybSBhIEMgc2lnbmF0dXJlIGludG8gUlNUIG5vZGVzLiIiIgorCisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5oYW5kbGVfZnVuY19saWtlX21hY3JvKHNpZywgc2lnbm9kZSkKKyAgICAgICAgaWYgbm90IGZ1bGxuYW1lOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBzdXBlcihDT2JqZWN0LCBzZWxmKS5oYW5kbGVfc2lnbmF0dXJlKHNpZywgc2lnbm9kZSkKKworICAgICAgICBpZiAibmFtZSIgaW4gc2VsZi5vcHRpb25zOgorICAgICAgICAgICAgaWYgc2VsZi5vYmp0eXBlID09ICdmdW5jdGlvbic6CisgICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBzZWxmLm9wdGlvbnNbIm5hbWUiXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEZJWE1FOiBoYW5kbGUgOm5hbWU6IHZhbHVlIG9mIG90aGVyIGRlY2xhcmF0aW9uIHR5cGVzPworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIGZ1bGxuYW1lCisKKyAgICBkZWYgYWRkX3RhcmdldF9hbmRfaW5kZXgoc2VsZiwgbmFtZSwgc2lnLCBzaWdub2RlKToKKyAgICAgICAgIyBmb3IgQyBBUEkgaXRlbXMgd2UgYWRkIGEgcHJlZml4IHNpbmNlIG5hbWVzIGFyZSB1c3VhbGx5IG5vdCBxdWFsaWZpZWQKKyAgICAgICAgIyBieSBhIG1vZHVsZSBuYW1lIGFuZCBzbyBlYXNpbHkgY2xhc2ggd2l0aCBlLmcuIHNlY3Rpb24gdGl0bGVzCisgICAgICAgIHRhcmdldG5hbWUgPSAnYy4nICsgbmFtZQorICAgICAgICBpZiB0YXJnZXRuYW1lIG5vdCBpbiBzZWxmLnN0YXRlLmRvY3VtZW50LmlkczoKKyAgICAgICAgICAgIHNpZ25vZGVbJ25hbWVzJ10uYXBwZW5kKHRhcmdldG5hbWUpCisgICAgICAgICAgICBzaWdub2RlWydpZHMnXS5hcHBlbmQodGFyZ2V0bmFtZSkKKyAgICAgICAgICAgIHNpZ25vZGVbJ2ZpcnN0J10gPSAobm90IHNlbGYubmFtZXMpCisgICAgICAgICAgICBzZWxmLnN0YXRlLmRvY3VtZW50Lm5vdGVfZXhwbGljaXRfdGFyZ2V0KHNpZ25vZGUpCisgICAgICAgICAgICBpbnYgPSBzZWxmLmVudi5kb21haW5kYXRhWydjJ11bJ29iamVjdHMnXQorICAgICAgICAgICAgaWYgKG5hbWUgaW4gaW52IGFuZCBzZWxmLmVudi5jb25maWcubml0cGlja3kpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYub2JqdHlwZSA9PSAnZnVuY3Rpb24nOgorICAgICAgICAgICAgICAgICAgICBpZiAoJ2M6ZnVuYycsIG5hbWUpIG5vdCBpbiBzZWxmLmVudi5jb25maWcubml0cGlja19pZ25vcmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlX21hY2hpbmUucmVwb3J0ZXIud2FybmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHVwbGljYXRlIEMgb2JqZWN0IGRlc2NyaXB0aW9uIG9mICVzLCAnICUgbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ290aGVyIGluc3RhbmNlIGluICcgKyBzZWxmLmVudi5kb2MycGF0aChpbnZbbmFtZV1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU9c2VsZi5saW5lbm8pCisgICAgICAgICAgICBpbnZbbmFtZV0gPSAoc2VsZi5lbnYuZG9jbmFtZSwgc2VsZi5vYmp0eXBlKQorCisgICAgICAgIGluZGV4dGV4dCA9IHNlbGYuZ2V0X2luZGV4X3RleHQobmFtZSkKKyAgICAgICAgaWYgaW5kZXh0ZXh0OgorICAgICAgICAgICAgaWYgbWFqb3IgPT0gMSBhbmQgbWlub3IgPCA0OgorICAgICAgICAgICAgICAgICMgaW5kZXhub2RlJ3MgdHVwbGUgY2hhbmdlZCBpbiAxLjQKKyAgICAgICAgICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9zcGhpbngtZG9jL3NwaGlueC9jb21taXQvZTZhNWEzYTkyZTkzOGZjZDc1ODY2YjQyMjdkYjllMDUyNGQ1OGY3YworICAgICAgICAgICAgICAgIHNlbGYuaW5kZXhub2RlWydlbnRyaWVzJ10uYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAoJ3NpbmdsZScsIGluZGV4dGV4dCwgdGFyZ2V0bmFtZSwgJycpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4bm9kZVsnZW50cmllcyddLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgKCdzaW5nbGUnLCBpbmRleHRleHQsIHRhcmdldG5hbWUsICcnLCBOb25lKSkKKworY2xhc3MgQ0RvbWFpbihCYXNlX0NEb21haW4pOgorCisgICAgIiIiQyBsYW5ndWFnZSBkb21haW4uIiIiCisgICAgbmFtZSA9ICdjJworICAgIGxhYmVsID0gJ0MnCisgICAgZGlyZWN0aXZlcyA9IHsKKyAgICAgICAgJ2Z1bmN0aW9uJzogQ09iamVjdCwKKyAgICAgICAgJ21lbWJlcic6ICAgQ09iamVjdCwKKyAgICAgICAgJ21hY3JvJzogICAgQ09iamVjdCwKKyAgICAgICAgJ3R5cGUnOiAgICAgQ09iamVjdCwKKyAgICAgICAgJ3Zhcic6ICAgICAgQ09iamVjdCwKKyAgICB9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwaGlueC9rZXJuZWwtZG9jLnB5IGIvRG9jdW1lbnRhdGlvbi9zcGhpbngva2VybmVsLWRvYy5weQppbmRleCBmNjkyMGMwLi5kMTVlMDdmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwaGlueC9rZXJuZWwtZG9jLnB5CisrKyBiL0RvY3VtZW50YXRpb24vc3BoaW54L2tlcm5lbC1kb2MucHkKQEAgLTM5LDYgKzM5LDggQEAKIGZyb20gc3BoaW54LnV0aWwuY29tcGF0IGltcG9ydCBEaXJlY3RpdmUKIGZyb20gc3BoaW54LmV4dC5hdXRvZG9jIGltcG9ydCBBdXRvZG9jUmVwb3J0ZXIKIAorX192ZXJzaW9uX18gID0gJzEuMCcKKwogY2xhc3MgS2VybmVsRG9jRGlyZWN0aXZlKERpcmVjdGl2ZSk6CiAgICAgIiIiRXh0cmFjdCBrZXJuZWwtZG9jIGNvbW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlIiIiCiAgICAgcmVxdWlyZWRfYXJndW1lbnQgPSAxCkBAIC0xMzksMyArMTQxLDkgQEAKICAgICBhcHAuYWRkX2NvbmZpZ192YWx1ZSgna2VybmVsZG9jX3ZlcmJvc2l0eScsIDEsICdlbnYnKQogCiAgICAgYXBwLmFkZF9kaXJlY3RpdmUoJ2tlcm5lbC1kb2MnLCBLZXJuZWxEb2NEaXJlY3RpdmUpCisKKyAgICByZXR1cm4gZGljdCgKKyAgICAgICAgdmVyc2lvbiA9IF9fdmVyc2lvbl9fLAorICAgICAgICBwYXJhbGxlbF9yZWFkX3NhZmUgPSBUcnVlLAorICAgICAgICBwYXJhbGxlbF93cml0ZV9zYWZlID0gVHJ1ZQorICAgICkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BoaW54L2tlcm5lbF9pbmNsdWRlLnB5IGIvRG9jdW1lbnRhdGlvbi9zcGhpbngva2VybmVsX2luY2x1ZGUucHkKaW5kZXggZGI1NzM4Mi4uZjUyM2FhNiAxMDA3NTUKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGhpbngva2VybmVsX2luY2x1ZGUucHkKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGhpbngva2VybmVsX2luY2x1ZGUucHkKQEAgLTM5LDExICszOSwxOCBAQAogZnJvbSBkb2N1dGlscy5wYXJzZXJzLnJzdC5kaXJlY3RpdmVzLmJvZHkgaW1wb3J0IENvZGVCbG9jaywgTnVtYmVyTGluZXMKIGZyb20gZG9jdXRpbHMucGFyc2Vycy5yc3QuZGlyZWN0aXZlcy5taXNjIGltcG9ydCBJbmNsdWRlCiAKK19fdmVyc2lvbl9fICA9ICcxLjAnCisKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBkZWYgc2V0dXAoYXBwKToKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICAgICBhcHAuYWRkX2RpcmVjdGl2ZSgia2VybmVsLWluY2x1ZGUiLCBLZXJuZWxJbmNsdWRlKQorICAgIHJldHVybiBkaWN0KAorICAgICAgICB2ZXJzaW9uID0gX192ZXJzaW9uX18sCisgICAgICAgIHBhcmFsbGVsX3JlYWRfc2FmZSA9IFRydWUsCisgICAgICAgIHBhcmFsbGVsX3dyaXRlX3NhZmUgPSBUcnVlCisgICAgKQogCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogY2xhc3MgS2VybmVsSW5jbHVkZShJbmNsdWRlKToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BoaW54L2xvYWRfY29uZmlnLnB5IGIvRG9jdW1lbnRhdGlvbi9zcGhpbngvbG9hZF9jb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxYTIxYQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc3BoaW54L2xvYWRfY29uZmlnLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyMgLSotIGNvZGluZzogdXRmLTg7IG1vZGU6IHB5dGhvbiAtKi0KKyMgcHlsaW50OiBkaXNhYmxlPVIwOTAzLCBDMDMzMCwgUjA5MTQsIFIwOTEyLCBFMDQwMQorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gc3BoaW54LnV0aWwucHljb21wYXQgaW1wb3J0IGV4ZWNmaWxlXworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmIGxvYWRDb25maWcobmFtZXNwYWNlKToKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICB1IiIiTG9hZCBhbiBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBpbnRvICpuYW1lc3BhY2UqLgorCisgICAgVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB0YWtlbiBmcm9tIHRoZSBlbnZpcm9ubWVudAorICAgIGBgU1BISU5YX0NPTkZgYC4gVGhlIGV4dGVybmFsIGNvbmZpZ3VyYXRpb24gZmlsZSBleHRlbmRzIChvciBvdmVyd3JpdGVzKSB0aGUKKyAgICBjb25maWd1cmF0aW9uIHZhbHVlcyBmcm9tIHRoZSBvcmlnaW4gYGBjb25mLnB5YGAuICBXaXRoIHRoaXMgeW91IGFyZSBhYmxlIHRvCisgICAgbWFpbnRhaW4gKmJ1aWxkIHRoZW1lcyouICAiIiIKKworICAgIGNvbmZpZ19maWxlID0gb3MuZW52aXJvbi5nZXQoIlNQSElOWF9DT05GIiwgTm9uZSkKKyAgICBpZiAoY29uZmlnX2ZpbGUgaXMgbm90IE5vbmUKKyAgICAgICAgYW5kIG9zLnBhdGgubm9ybXBhdGgobmFtZXNwYWNlWyJfX2ZpbGVfXyJdKSAhPSBvcy5wYXRoLm5vcm1wYXRoKGNvbmZpZ19maWxlKSApOgorICAgICAgICBjb25maWdfZmlsZSA9IG9zLnBhdGguYWJzcGF0aChjb25maWdfZmlsZSkKKworICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShjb25maWdfZmlsZSk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJsb2FkIGFkZGl0aW9uYWwgc3BoaW54LWNvbmZpZzogJXNcbiIgJSBjb25maWdfZmlsZSkKKyAgICAgICAgICAgIGNvbmZpZyA9IG5hbWVzcGFjZS5jb3B5KCkKKyAgICAgICAgICAgIGNvbmZpZ1snX19maWxlX18nXSA9IGNvbmZpZ19maWxlCisgICAgICAgICAgICBleGVjZmlsZV8oY29uZmlnX2ZpbGUsIGNvbmZpZykKKyAgICAgICAgICAgIGRlbCBjb25maWdbJ19fZmlsZV9fJ10KKyAgICAgICAgICAgIG5hbWVzcGFjZS51cGRhdGUoY29uZmlnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV0FSTklORzogYWRkaXRpb25hbCBzcGhpbngtY29uZmlnIG5vdCBmb3VuZDogJXNcbiIgJSBjb25maWdfZmlsZSkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BoaW54L3BhcnNlLWhlYWRlcnMucGwgYi9Eb2N1bWVudGF0aW9uL3NwaGlueC9wYXJzZS1oZWFkZXJzLnBsCmluZGV4IDM0YmQ5ZTIuLjc0MDg5YjAgMTAwNzU1Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BoaW54L3BhcnNlLWhlYWRlcnMucGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGhpbngvcGFyc2UtaGVhZGVycy5wbApAQCAtMjIwLDcgKzIyMCw3IEBACiAjCiAjIEFkZCBlc2NhcGUgY29kZXMgZm9yIHNwZWNpYWwgY2hhcmFjdGVycwogIwotJGRhdGEgPX4gcywoW1xfXGBcKlw8XD5cJlxcXFw6XC9cfF0pLFxcJDEsZzsKKyRkYXRhID1+IHMsKFtcX1xgXCpcPFw+XCZcXFxcOlwvXHxcJVwkXCNce1x9XH5cXl0pLFxcJDEsZzsKIAogJGRhdGEgPX4gcyxERVBSRUNBVEVELCoqREVQUkVDQVRFRCoqLGc7CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BoaW54L3JzdEZsYXRUYWJsZS5weSBiL0RvY3VtZW50YXRpb24vc3BoaW54L3JzdEZsYXRUYWJsZS5weQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDI2ZGI4NTIuLjU1ZjI3NTcKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGhpbngvcnN0RmxhdFRhYmxlLnB5CisrKyBiL0RvY3VtZW50YXRpb24vc3BoaW54L3JzdEZsYXRUYWJsZS5weQpAQCAtNzMsNiArNzMsMTIgQEAKICAgICByb2xlcy5yZWdpc3Rlcl9sb2NhbF9yb2xlKCdjc3BhbicsIGNfc3BhbikKICAgICByb2xlcy5yZWdpc3Rlcl9sb2NhbF9yb2xlKCdyc3BhbicsIHJfc3BhbikKIAorICAgIHJldHVybiBkaWN0KAorICAgICAgICB2ZXJzaW9uID0gX192ZXJzaW9uX18sCisgICAgICAgIHBhcmFsbGVsX3JlYWRfc2FmZSA9IFRydWUsCisgICAgICAgIHBhcmFsbGVsX3dyaXRlX3NhZmUgPSBUcnVlCisgICAgKQorCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogZGVmIGNfc3BhbihuYW1lLCByYXd0ZXh0LCB0ZXh0LCBsaW5lbm8sIGlubGluZXIsIG9wdGlvbnM9Tm9uZSwgY29udGVudD1Ob25lKToKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N0YWJsZV9hcGlfbm9uc2Vuc2UudHh0IGIvRG9jdW1lbnRhdGlvbi9zdGFibGVfYXBpX25vbnNlbnNlLnR4dAppbmRleCBkYjNiZTg5Li4yNGY1YWVlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N0YWJsZV9hcGlfbm9uc2Vuc2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3RhYmxlX2FwaV9ub25zZW5zZS50eHQKQEAgLTEsMTcgKzEsMjYgQEAKKy4uIF9zdGFibGVfYXBpX25vbnNlbnNlOgorCiBUaGUgTGludXggS2VybmVsIERyaXZlciBJbnRlcmZhY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwogKGFsbCBvZiB5b3VyIHF1ZXN0aW9ucyBhbnN3ZXJlZCBhbmQgdGhlbiBzb21lKQogCiBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgogCi1UaGlzIGlzIGJlaW5nIHdyaXR0ZW4gdG8gdHJ5IHRvIGV4cGxhaW4gd2h5IExpbnV4IGRvZXMgbm90IGhhdmUgYSBiaW5hcnkKLWtlcm5lbCBpbnRlcmZhY2UsIG5vciBkb2VzIGl0IGhhdmUgYSBzdGFibGUga2VybmVsIGludGVyZmFjZS4gIFBsZWFzZQotcmVhbGl6ZSB0aGF0IHRoaXMgYXJ0aWNsZSBkZXNjcmliZXMgdGhlIF9pbiBrZXJuZWxfIGludGVyZmFjZXMsIG5vdCB0aGUKLWtlcm5lbCB0byB1c2Vyc3BhY2UgaW50ZXJmYWNlcy4gIFRoZSBrZXJuZWwgdG8gdXNlcnNwYWNlIGludGVyZmFjZSBpcwotdGhlIG9uZSB0aGF0IGFwcGxpY2F0aW9uIHByb2dyYW1zIHVzZSwgdGhlIHN5c2NhbGwgaW50ZXJmYWNlLiAgVGhhdAotaW50ZXJmYWNlIGlzIF92ZXJ5XyBzdGFibGUgb3ZlciB0aW1lLCBhbmQgd2lsbCBub3QgYnJlYWsuICBJIGhhdmUgb2xkCi1wcm9ncmFtcyB0aGF0IHdlcmUgYnVpbHQgb24gYSBwcmUgMC45c29tZXRoaW5nIGtlcm5lbCB0aGF0IHN0aWxsIHdvcmsKLWp1c3QgZmluZSBvbiB0aGUgbGF0ZXN0IDIuNiBrZXJuZWwgcmVsZWFzZS4gIFRoYXQgaW50ZXJmYWNlIGlzIHRoZSBvbmUKLXRoYXQgdXNlcnMgYW5kIGFwcGxpY2F0aW9uIHByb2dyYW1tZXJzIGNhbiBjb3VudCBvbiBiZWluZyBzdGFibGUuCitUaGlzIGlzIGJlaW5nIHdyaXR0ZW4gdG8gdHJ5IHRvIGV4cGxhaW4gd2h5IExpbnV4ICoqZG9lcyBub3QgaGF2ZSBhIGJpbmFyeQora2VybmVsIGludGVyZmFjZSwgbm9yIGRvZXMgaXQgaGF2ZSBhIHN0YWJsZSBrZXJuZWwgaW50ZXJmYWNlKiouCisKKy4uIG5vdGU6OgorCisgIFBsZWFzZSByZWFsaXplIHRoYXQgdGhpcyBhcnRpY2xlIGRlc2NyaWJlcyB0aGUgKippbiBrZXJuZWwqKiBpbnRlcmZhY2VzLCBub3QKKyAgdGhlIGtlcm5lbCB0byB1c2Vyc3BhY2UgaW50ZXJmYWNlcy4KKworICBUaGUga2VybmVsIHRvIHVzZXJzcGFjZSBpbnRlcmZhY2UgaXMgdGhlIG9uZSB0aGF0IGFwcGxpY2F0aW9uIHByb2dyYW1zIHVzZSwKKyAgdGhlIHN5c2NhbGwgaW50ZXJmYWNlLiAgVGhhdCBpbnRlcmZhY2UgaXMgKip2ZXJ5Kiogc3RhYmxlIG92ZXIgdGltZSwgYW5kCisgIHdpbGwgbm90IGJyZWFrLiAgSSBoYXZlIG9sZCBwcm9ncmFtcyB0aGF0IHdlcmUgYnVpbHQgb24gYSBwcmUgMC45c29tZXRoaW5nCisgIGtlcm5lbCB0aGF0IHN0aWxsIHdvcmsganVzdCBmaW5lIG9uIHRoZSBsYXRlc3QgMi42IGtlcm5lbCByZWxlYXNlLgorICBUaGF0IGludGVyZmFjZSBpcyB0aGUgb25lIHRoYXQgdXNlcnMgYW5kIGFwcGxpY2F0aW9uIHByb2dyYW1tZXJzIGNhbiBjb3VudAorICBvbiBiZWluZyBzdGFibGUuCiAKIAogRXhlY3V0aXZlIFN1bW1hcnkKQEAgLTMzLDcgKzQyLDcgQEAKIHRoZSB3b3JsZCwgdGhleSBuZWl0aGVyIHNlZSB0aGlzIGludGVyZmFjZSwgbm9yIGRvIHRoZXkgY2FyZSBhYm91dCBpdCBhdAogYWxsLgogCi1GaXJzdCBvZmYsIEknbSBub3QgZ29pbmcgdG8gYWRkcmVzcyBfYW55XyBsZWdhbCBpc3N1ZXMgYWJvdXQgY2xvc2VkCitGaXJzdCBvZmYsIEknbSBub3QgZ29pbmcgdG8gYWRkcmVzcyAqKmFueSoqIGxlZ2FsIGlzc3VlcyBhYm91dCBjbG9zZWQKIHNvdXJjZSwgaGlkZGVuIHNvdXJjZSwgYmluYXJ5IGJsb2JzLCBzb3VyY2Ugd3JhcHBlcnMsIG9yIGFueSBvdGhlciB0ZXJtCiB0aGF0IGRlc2NyaWJlcyBrZXJuZWwgZHJpdmVycyB0aGF0IGRvIG5vdCBoYXZlIHRoZWlyIHNvdXJjZSBjb2RlCiByZWxlYXNlZCB1bmRlciB0aGUgR1BMLiAgUGxlYXNlIGNvbnN1bHQgYSBsYXd5ZXIgaWYgeW91IGhhdmUgYW55IGxlZ2FsCkBAIC01MSwxOSArNjAsMjMgQEAKIEFzc3VtaW5nIHRoYXQgd2UgaGFkIGEgc3RhYmxlIGtlcm5lbCBzb3VyY2UgaW50ZXJmYWNlIGZvciB0aGUga2VybmVsLCBhCiBiaW5hcnkgaW50ZXJmYWNlIHdvdWxkIG5hdHVyYWxseSBoYXBwZW4gdG9vLCByaWdodD8gIFdyb25nLiAgUGxlYXNlCiBjb25zaWRlciB0aGUgZm9sbG93aW5nIGZhY3RzIGFib3V0IHRoZSBMaW51eCBrZXJuZWw6CisKICAgLSBEZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gb2YgdGhlIEMgY29tcGlsZXIgeW91IHVzZSwgZGlmZmVyZW50IGtlcm5lbAogICAgIGRhdGEgc3RydWN0dXJlcyB3aWxsIGNvbnRhaW4gZGlmZmVyZW50IGFsaWdubWVudCBvZiBzdHJ1Y3R1cmVzLCBhbmQKICAgICBwb3NzaWJseSBpbmNsdWRlIGRpZmZlcmVudCBmdW5jdGlvbnMgaW4gZGlmZmVyZW50IHdheXMgKHB1dHRpbmcKICAgICBmdW5jdGlvbnMgaW5saW5lIG9yIG5vdC4pICBUaGUgaW5kaXZpZHVhbCBmdW5jdGlvbiBvcmdhbml6YXRpb24KICAgICBpc24ndCB0aGF0IGltcG9ydGFudCwgYnV0IHRoZSBkaWZmZXJlbnQgZGF0YSBzdHJ1Y3R1cmUgcGFkZGluZyBpcwogICAgIHZlcnkgaW1wb3J0YW50LgorCiAgIC0gRGVwZW5kaW5nIG9uIHdoYXQga2VybmVsIGJ1aWxkIG9wdGlvbnMgeW91IHNlbGVjdCwgYSB3aWRlIHJhbmdlIG9mCiAgICAgZGlmZmVyZW50IHRoaW5ncyBjYW4gYmUgYXNzdW1lZCBieSB0aGUga2VybmVsOgorCiAgICAgICAtIGRpZmZlcmVudCBzdHJ1Y3R1cmVzIGNhbiBjb250YWluIGRpZmZlcmVudCBmaWVsZHMKICAgICAgIC0gU29tZSBmdW5jdGlvbnMgbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBhdCBhbGwsIChpLmUuIHNvbWUgbG9ja3MKIAljb21waWxlIGF3YXkgdG8gbm90aGluZyBmb3Igbm9uLVNNUCBidWlsZHMuKQogICAgICAgLSBNZW1vcnkgd2l0aGluIHRoZSBrZXJuZWwgY2FuIGJlIGFsaWduZWQgaW4gZGlmZmVyZW50IHdheXMsCiAJZGVwZW5kaW5nIG9uIHRoZSBidWlsZCBvcHRpb25zLgorCiAgIC0gTGludXggcnVucyBvbiBhIHdpZGUgcmFuZ2Ugb2YgZGlmZmVyZW50IHByb2Nlc3NvciBhcmNoaXRlY3R1cmVzLgogICAgIFRoZXJlIGlzIG5vIHdheSB0aGF0IGJpbmFyeSBkcml2ZXJzIGZyb20gb25lIGFyY2hpdGVjdHVyZSB3aWxsIHJ1bgogICAgIG9uIGFub3RoZXIgYXJjaGl0ZWN0dXJlIHByb3Blcmx5LgpAQCAtMTA1LDYgKzExOCw3IEBACiB1bmRlcmdvbmUgYXQgbGVhc3QgdGhyZWUgZGlmZmVyZW50IHJld29ya3Mgb3ZlciB0aGUgbGlmZXRpbWUgb2YgdGhpcwogc3Vic3lzdGVtLiAgVGhlc2UgcmV3b3JrcyB3ZXJlIGRvbmUgdG8gYWRkcmVzcyBhIG51bWJlciBvZiBkaWZmZXJlbnQKIGlzc3VlczoKKwogICAtIEEgY2hhbmdlIGZyb20gYSBzeW5jaHJvbm91cyBtb2RlbCBvZiBkYXRhIHN0cmVhbXMgdG8gYW4gYXN5bmNocm9ub3VzCiAgICAgb25lLiAgVGhpcyByZWR1Y2VkIHRoZSBjb21wbGV4aXR5IG9mIGEgbnVtYmVyIG9mIGRyaXZlcnMgYW5kCiAgICAgaW5jcmVhc2VkIHRoZSB0aHJvdWdocHV0IG9mIGFsbCBVU0IgZHJpdmVycyBzdWNoIHRoYXQgd2UgYXJlIG5vdwpAQCAtMTY2LDYgKzE4MCw3IEBACiAKIFRoZSB2ZXJ5IGdvb2Qgc2lkZSBlZmZlY3RzIG9mIGhhdmluZyB5b3VyIGRyaXZlciBpbiB0aGUgbWFpbiBrZXJuZWwgdHJlZQogYXJlOgorCiAgIC0gVGhlIHF1YWxpdHkgb2YgdGhlIGRyaXZlciB3aWxsIHJpc2UgYXMgdGhlIG1haW50ZW5hbmNlIGNvc3RzICh0byB0aGUKICAgICBvcmlnaW5hbCBkZXZlbG9wZXIpIHdpbGwgZGVjcmVhc2UuCiAgIC0gT3RoZXIgZGV2ZWxvcGVycyB3aWxsIGFkZCBmZWF0dXJlcyB0byB5b3VyIGRyaXZlci4KQEAgLTE3NSw3ICsxOTAsNyBAQAogICAgIGNoYW5nZXMgcmVxdWlyZSBpdC4KICAgLSBUaGUgZHJpdmVyIGF1dG9tYXRpY2FsbHkgZ2V0cyBzaGlwcGVkIGluIGFsbCBMaW51eCBkaXN0cmlidXRpb25zCiAgICAgd2l0aG91dCBoYXZpbmcgdG8gYXNrIHRoZSBkaXN0cm9zIHRvIGFkZCBpdC4KLSAgICAKKwogQXMgTGludXggc3VwcG9ydHMgYSBsYXJnZXIgbnVtYmVyIG9mIGRpZmZlcmVudCBkZXZpY2VzICJvdXQgb2YgdGhlIGJveCIKIHRoYW4gYW55IG90aGVyIG9wZXJhdGluZyBzeXN0ZW0sIGFuZCBpdCBzdXBwb3J0cyB0aGVzZSBkZXZpY2VzIG9uIG1vcmUKIGRpZmZlcmVudCBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlcyB0aGFuIGFueSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtLCB0aGlzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dAppbmRleCBmZmQ0NTc1Li40ZDgyZTMxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQKQEAgLTEsNCArMSw3IEBACi1FdmVyeXRoaW5nIHlvdSBldmVyIHdhbnRlZCB0byBrbm93IGFib3V0IExpbnV4IC1zdGFibGUgcmVsZWFzZXMuCisuLiBfc3RhYmxlX2tlcm5lbF9ydWxlczoKKworRXZlcnl0aGluZyB5b3UgZXZlciB3YW50ZWQgdG8ga25vdyBhYm91dCBMaW51eCAtc3RhYmxlIHJlbGVhc2VzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogUnVsZXMgb24gd2hhdCBraW5kIG9mIHBhdGNoZXMgYXJlIGFjY2VwdGVkLCBhbmQgd2hpY2ggb25lcyBhcmUgbm90LCBpbnRvIHRoZQogIi1zdGFibGUiIHRyZWU6CkBAIC0yMyw2OCArMjYsOTQgQEAKICAgIHJhY2UgY2FuIGJlIGV4cGxvaXRlZCBpcyBhbHNvIHByb3ZpZGVkLgogIC0gSXQgY2Fubm90IGNvbnRhaW4gYW55ICJ0cml2aWFsIiBmaXhlcyBpbiBpdCAoc3BlbGxpbmcgY2hhbmdlcywKICAgIHdoaXRlc3BhY2UgY2xlYW51cHMsIGV0YykuCi0gLSBJdCBtdXN0IGZvbGxvdyB0aGUgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBydWxlcy4KKyAtIEl0IG11c3QgZm9sbG93IHRoZQorICAgOnJlZjpgRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyA8c3VibWl0dGluZ3BhdGNoZXM+YAorICAgcnVsZXMuCiAgLSBJdCBvciBhbiBlcXVpdmFsZW50IGZpeCBtdXN0IGFscmVhZHkgZXhpc3QgaW4gTGludXMnIHRyZWUgKHVwc3RyZWFtKS4KIAogCi1Qcm9jZWR1cmUgZm9yIHN1Ym1pdHRpbmcgcGF0Y2hlcyB0byB0aGUgLXN0YWJsZSB0cmVlOgorUHJvY2VkdXJlIGZvciBzdWJtaXR0aW5nIHBhdGNoZXMgdG8gdGhlIC1zdGFibGUgdHJlZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgLSBJZiB0aGUgcGF0Y2ggY292ZXJzIGZpbGVzIGluIG5ldC8gb3IgZHJpdmVycy9uZXQgcGxlYXNlIGZvbGxvdyBuZXRkZXYgc3RhYmxlCiAgICBzdWJtaXNzaW9uIGd1aWRlbGluZXMgYXMgZGVzY3JpYmVkIGluCiAgICBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0ZGV2LUZBUS50eHQKICAtIFNlY3VyaXR5IHBhdGNoZXMgc2hvdWxkIG5vdCBiZSBoYW5kbGVkIChzb2xlbHkpIGJ5IHRoZSAtc3RhYmxlIHJldmlldwotICAgcHJvY2VzcyBidXQgc2hvdWxkIGZvbGxvdyB0aGUgcHJvY2VkdXJlcyBpbiBEb2N1bWVudGF0aW9uL1NlY3VyaXR5QnVncy4KKyAgIHByb2Nlc3MgYnV0IHNob3VsZCBmb2xsb3cgdGhlIHByb2NlZHVyZXMgaW4KKyAgIDpyZWY6YERvY3VtZW50YXRpb24vU2VjdXJpdHlCdWdzIDxzZWN1cml0eWJ1Z3M+YC4KIAotRm9yIGFsbCBvdGhlciBzdWJtaXNzaW9ucywgY2hvb3NlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHByb2NlZHVyZXM6CitGb3IgYWxsIG90aGVyIHN1Ym1pc3Npb25zLCBjaG9vc2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgcHJvY2VkdXJlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgLS0tIE9wdGlvbiAxIC0tLQorLi4gX29wdGlvbl8xOgogCi0gICBUbyBoYXZlIHRoZSBwYXRjaCBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIHRoZSBzdGFibGUgdHJlZSwgYWRkIHRoZSB0YWcKK09wdGlvbiAxCisqKioqKioqKgorCitUbyBoYXZlIHRoZSBwYXRjaCBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIHRoZSBzdGFibGUgdHJlZSwgYWRkIHRoZSB0YWcKKworLi4gY29kZS1ibG9jazo6IG5vbmUKKwogICAgICBDYzogc3RhYmxlQHZnZXIua2VybmVsLm9yZwotICAgaW4gdGhlIHNpZ24tb2ZmIGFyZWEuIE9uY2UgdGhlIHBhdGNoIGlzIG1lcmdlZCBpdCB3aWxsIGJlIGFwcGxpZWQgdG8KLSAgIHRoZSBzdGFibGUgdHJlZSB3aXRob3V0IGFueXRoaW5nIGVsc2UgbmVlZGluZyB0byBiZSBkb25lIGJ5IHRoZSBhdXRob3IKLSAgIG9yIHN1YnN5c3RlbSBtYWludGFpbmVyLgogCi0gICAtLS0gT3B0aW9uIDIgLS0tCitpbiB0aGUgc2lnbi1vZmYgYXJlYS4gT25jZSB0aGUgcGF0Y2ggaXMgbWVyZ2VkIGl0IHdpbGwgYmUgYXBwbGllZCB0bwordGhlIHN0YWJsZSB0cmVlIHdpdGhvdXQgYW55dGhpbmcgZWxzZSBuZWVkaW5nIHRvIGJlIGRvbmUgYnkgdGhlIGF1dGhvcgorb3Igc3Vic3lzdGVtIG1haW50YWluZXIuCiAKLSAgIEFmdGVyIHRoZSBwYXRjaCBoYXMgYmVlbiBtZXJnZWQgdG8gTGludXMnIHRyZWUsIHNlbmQgYW4gZW1haWwgdG8KLSAgIHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmcgY29udGFpbmluZyB0aGUgc3ViamVjdCBvZiB0aGUgcGF0Y2gsIHRoZSBjb21taXQgSUQsCi0gICB3aHkgeW91IHRoaW5rIGl0IHNob3VsZCBiZSBhcHBsaWVkLCBhbmQgd2hhdCBrZXJuZWwgdmVyc2lvbiB5b3Ugd2lzaCBpdCB0bwotICAgYmUgYXBwbGllZCB0by4KKy4uIF9vcHRpb25fMjoKIAotICAgLS0tIE9wdGlvbiAzIC0tLQorT3B0aW9uIDIKKyoqKioqKioqCiAKLSAgIFNlbmQgdGhlIHBhdGNoLCBhZnRlciB2ZXJpZnlpbmcgdGhhdCBpdCBmb2xsb3dzIHRoZSBhYm92ZSBydWxlcywgdG8KLSAgIHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmcuICBZb3UgbXVzdCBub3RlIHRoZSB1cHN0cmVhbSBjb21taXQgSUQgaW4gdGhlCi0gICBjaGFuZ2Vsb2cgb2YgeW91ciBzdWJtaXNzaW9uLCBhcyB3ZWxsIGFzIHRoZSBrZXJuZWwgdmVyc2lvbiB5b3Ugd2lzaAotICAgaXQgdG8gYmUgYXBwbGllZCB0by4KK0FmdGVyIHRoZSBwYXRjaCBoYXMgYmVlbiBtZXJnZWQgdG8gTGludXMnIHRyZWUsIHNlbmQgYW4gZW1haWwgdG8KK3N0YWJsZUB2Z2VyLmtlcm5lbC5vcmcgY29udGFpbmluZyB0aGUgc3ViamVjdCBvZiB0aGUgcGF0Y2gsIHRoZSBjb21taXQgSUQsCit3aHkgeW91IHRoaW5rIGl0IHNob3VsZCBiZSBhcHBsaWVkLCBhbmQgd2hhdCBrZXJuZWwgdmVyc2lvbiB5b3Ugd2lzaCBpdCB0bworYmUgYXBwbGllZCB0by4KIAotT3B0aW9uIDEgaXMgKnN0cm9uZ2x5KiBwcmVmZXJyZWQsIGlzIHRoZSBlYXNpZXN0IGFuZCBtb3N0IGNvbW1vbi4gIE9wdGlvbnMgMiBhbmQKLTMgYXJlIG1vcmUgdXNlZnVsIGlmIHRoZSBwYXRjaCBpc24ndCBkZWVtZWQgd29ydGh5IGF0IHRoZSB0aW1lIGl0IGlzIGFwcGxpZWQgdG8KLWEgcHVibGljIGdpdCB0cmVlIChmb3IgaW5zdGFuY2UsIGJlY2F1c2UgaXQgZGVzZXJ2ZXMgbW9yZSByZWdyZXNzaW9uIHRlc3RpbmcKLWZpcnN0KS4gIE9wdGlvbiAzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHRoZSBwYXRjaCBuZWVkcyBzb21lIHNwZWNpYWwgaGFuZGxpbmcKLXRvIGFwcGx5IHRvIGFuIG9sZGVyIGtlcm5lbCAoZS5nLiwgaWYgQVBJJ3MgaGF2ZSBjaGFuZ2VkIGluIHRoZSBtZWFudGltZSkuCisuLiBfb3B0aW9uXzM6CiAKLU5vdGUgdGhhdCBmb3IgT3B0aW9uIDMsIGlmIHRoZSBwYXRjaCBkZXZpYXRlcyBmcm9tIHRoZSBvcmlnaW5hbCB1cHN0cmVhbSBwYXRjaAotKGZvciBleGFtcGxlIGJlY2F1c2UgaXQgaGFkIHRvIGJlIGJhY2twb3J0ZWQpIHRoaXMgbXVzdCBiZSB2ZXJ5IGNsZWFybHkKLWRvY3VtZW50ZWQgYW5kIGp1c3RpZmllZCBpbiB0aGUgcGF0Y2ggZGVzY3JpcHRpb24uCitPcHRpb24gMworKioqKioqKioKKworU2VuZCB0aGUgcGF0Y2gsIGFmdGVyIHZlcmlmeWluZyB0aGF0IGl0IGZvbGxvd3MgdGhlIGFib3ZlIHJ1bGVzLCB0bworc3RhYmxlQHZnZXIua2VybmVsLm9yZy4gIFlvdSBtdXN0IG5vdGUgdGhlIHVwc3RyZWFtIGNvbW1pdCBJRCBpbiB0aGUKK2NoYW5nZWxvZyBvZiB5b3VyIHN1Ym1pc3Npb24sIGFzIHdlbGwgYXMgdGhlIGtlcm5lbCB2ZXJzaW9uIHlvdSB3aXNoCitpdCB0byBiZSBhcHBsaWVkIHRvLgorCis6cmVmOmBvcHRpb25fMWAgaXMgKipzdHJvbmdseSoqIHByZWZlcnJlZCwgaXMgdGhlIGVhc2llc3QgYW5kIG1vc3QgY29tbW9uLgorOnJlZjpgb3B0aW9uXzJgIGFuZCA6cmVmOmBvcHRpb25fM2AgYXJlIG1vcmUgdXNlZnVsIGlmIHRoZSBwYXRjaCBpc24ndCBkZWVtZWQKK3dvcnRoeSBhdCB0aGUgdGltZSBpdCBpcyBhcHBsaWVkIHRvIGEgcHVibGljIGdpdCB0cmVlIChmb3IgaW5zdGFuY2UsIGJlY2F1c2UKK2l0IGRlc2VydmVzIG1vcmUgcmVncmVzc2lvbiB0ZXN0aW5nIGZpcnN0KS4gIDpyZWY6YG9wdGlvbl8zYCBpcyBlc3BlY2lhbGx5Cit1c2VmdWwgaWYgdGhlIHBhdGNoIG5lZWRzIHNvbWUgc3BlY2lhbCBoYW5kbGluZyB0byBhcHBseSB0byBhbiBvbGRlciBrZXJuZWwKKyhlLmcuLCBpZiBBUEkncyBoYXZlIGNoYW5nZWQgaW4gdGhlIG1lYW50aW1lKS4KKworTm90ZSB0aGF0IGZvciA6cmVmOmBvcHRpb25fM2AsIGlmIHRoZSBwYXRjaCBkZXZpYXRlcyBmcm9tIHRoZSBvcmlnaW5hbAordXBzdHJlYW0gcGF0Y2ggKGZvciBleGFtcGxlIGJlY2F1c2UgaXQgaGFkIHRvIGJlIGJhY2twb3J0ZWQpIHRoaXMgbXVzdCBiZSB2ZXJ5CitjbGVhcmx5IGRvY3VtZW50ZWQgYW5kIGp1c3RpZmllZCBpbiB0aGUgcGF0Y2ggZGVzY3JpcHRpb24uCiAKIFRoZSB1cHN0cmVhbSBjb21taXQgSUQgbXVzdCBiZSBzcGVjaWZpZWQgd2l0aCBhIHNlcGFyYXRlIGxpbmUgYWJvdmUgdGhlIGNvbW1pdAogdGV4dCwgbGlrZSB0aGlzOgogCisuLiBjb2RlLWJsb2NrOjogbm9uZQorCiAgICAgY29tbWl0IDxzaGExPiB1cHN0cmVhbS4KIAogQWRkaXRpb25hbGx5LCBzb21lIHBhdGNoZXMgc3VibWl0dGVkIHZpYSBPcHRpb24gMSBtYXkgaGF2ZSBhZGRpdGlvbmFsIHBhdGNoCiBwcmVyZXF1aXNpdGVzIHdoaWNoIGNhbiBiZSBjaGVycnktcGlja2VkLiBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIGZvbGxvd2luZwogZm9ybWF0IGluIHRoZSBzaWduLW9mZiBhcmVhOgogCisuLiBjb2RlLWJsb2NrOjogbm9uZQorCiAgICAgIENjOiA8c3RhYmxlQHZnZXIua2VybmVsLm9yZz4gIyAzLjMueDogYTFmODRhMzogc2NoZWQ6IENoZWNrIGZvciBpZGxlCiAgICAgIENjOiA8c3RhYmxlQHZnZXIua2VybmVsLm9yZz4gIyAzLjMueDogMWI5NTA4Zjogc2NoZWQ6IFJhdGUtbGltaXQgbmV3aWRsZQogICAgICBDYzogPHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmc+ICMgMy4zLng6IGZkMjEwNzM6IHNjaGVkOiBGaXggYWZmaW5pdHkgbG9naWMKICAgICAgQ2M6IDxzdGFibGVAdmdlci5rZXJuZWwub3JnPiAjIDMuMy54Ci0gICAgU2lnbmVkLW9mZi1ieTogSW5nbyBNb2xuYXIgPG1pbmdvQGVsdGUuaHU+CisgICAgIFNpZ25lZC1vZmYtYnk6IEluZ28gTW9sbmFyIDxtaW5nb0BlbHRlLmh1PgogCi0gICBUaGUgdGFnIHNlcXVlbmNlIGhhcyB0aGUgbWVhbmluZyBvZjoKK1RoZSB0YWcgc2VxdWVuY2UgaGFzIHRoZSBtZWFuaW5nIG9mOgorCisuLiBjb2RlLWJsb2NrOjogbm9uZQorCiAgICAgIGdpdCBjaGVycnktcGljayBhMWY4NGEzCiAgICAgIGdpdCBjaGVycnktcGljayAxYjk1MDhmCiAgICAgIGdpdCBjaGVycnktcGljayBmZDIxMDczCkBAIC05MywxMiArMTIyLDE3IEBACiBBbHNvLCBzb21lIHBhdGNoZXMgbWF5IGhhdmUga2VybmVsIHZlcnNpb24gcHJlcmVxdWlzaXRlcy4gIFRoaXMgY2FuIGJlCiBzcGVjaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQgaW4gdGhlIHNpZ24tb2ZmIGFyZWE6CiAKKy4uIGNvZGUtYmxvY2s6OiBub25lCisKICAgICAgQ2M6IDxzdGFibGVAdmdlci5rZXJuZWwub3JnPiAjIDMuMy54LQogCi0gICBUaGUgdGFnIGhhcyB0aGUgbWVhbmluZyBvZjoKK1RoZSB0YWcgaGFzIHRoZSBtZWFuaW5nIG9mOgorCisuLiBjb2RlLWJsb2NrOjogbm9uZQorCiAgICAgIGdpdCBjaGVycnktcGljayA8dGhpcyBjb21taXQ+CiAKLSAgIEZvciBlYWNoICItc3RhYmxlIiB0cmVlIHN0YXJ0aW5nIHdpdGggdGhlIHNwZWNpZmllZCB2ZXJzaW9uLgorRm9yIGVhY2ggIi1zdGFibGUiIHRyZWUgc3RhcnRpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIHZlcnNpb24uCiAKIEZvbGxvd2luZyB0aGUgc3VibWlzc2lvbjoKIApAQCAtMTA5LDcgKzE0Myw4IEBACiAgICBvdGhlciBkZXZlbG9wZXJzIGFuZCBieSB0aGUgcmVsZXZhbnQgc3Vic3lzdGVtIG1haW50YWluZXIuCiAKIAotUmV2aWV3IGN5Y2xlOgorUmV2aWV3IGN5Y2xlCistLS0tLS0tLS0tLS0KIAogIC0gV2hlbiB0aGUgLXN0YWJsZSBtYWludGFpbmVycyBkZWNpZGUgZm9yIGEgcmV2aWV3IGN5Y2xlLCB0aGUgcGF0Y2hlcyB3aWxsIGJlCiAgICBzZW50IHRvIHRoZSByZXZpZXcgY29tbWl0dGVlLCBhbmQgdGhlIG1haW50YWluZXIgb2YgdGhlIGFmZmVjdGVkIGFyZWEgb2YKQEAgLTEyNSwxNyArMTYwLDIyIEBACiAgICBzZWN1cml0eSBrZXJuZWwgdGVhbSwgYW5kIG5vdCBnbyB0aHJvdWdoIHRoZSBub3JtYWwgcmV2aWV3IGN5Y2xlLgogICAgQ29udGFjdCB0aGUga2VybmVsIHNlY3VyaXR5IHRlYW0gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGlzIHByb2NlZHVyZS4KIAotVHJlZXM6CitUcmVlcworLS0tLS0KIAogIC0gVGhlIHF1ZXVlcyBvZiBwYXRjaGVzLCBmb3IgYm90aCBjb21wbGV0ZWQgdmVyc2lvbnMgYW5kIGluIHByb2dyZXNzCiAgICB2ZXJzaW9ucyBjYW4gYmUgZm91bmQgYXQ6CisKIAlodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC9zdGFibGUvc3RhYmxlLXF1ZXVlLmdpdAorCiAgLSBUaGUgZmluYWxpemVkIGFuZCB0YWdnZWQgcmVsZWFzZXMgb2YgYWxsIHN0YWJsZSBrZXJuZWxzIGNhbiBiZSBmb3VuZAogICAgaW4gc2VwYXJhdGUgYnJhbmNoZXMgcGVyIHZlcnNpb24gYXQ6CisKIAlodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC9zdGFibGUvbGludXgtc3RhYmxlLmdpdAogCiAKLVJldmlldyBjb21taXR0ZWU6CitSZXZpZXcgY29tbWl0dGVlCistLS0tLS0tLS0tLS0tLS0tCiAKICAtIFRoaXMgaXMgbWFkZSB1cCBvZiBhIG51bWJlciBvZiBrZXJuZWwgZGV2ZWxvcGVycyB3aG8gaGF2ZSB2b2x1bnRlZXJlZCBmb3IKICAgIHRoaXMgdGFzaywgYW5kIGEgZmV3IHRoYXQgaGF2ZW4ndC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3RhdGljLWtleXMudHh0IGIvRG9jdW1lbnRhdGlvbi9zdGF0aWMta2V5cy50eHQKaW5kZXggNDc3OTI3Yi4uZWE4ZDdiNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zdGF0aWMta2V5cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zdGF0aWMta2V5cy50eHQKQEAgLTE1LDYgKzE1LDggQEAKIAogREVGSU5FX1NUQVRJQ19LRVlfVFJVRShrZXkpOwogREVGSU5FX1NUQVRJQ19LRVlfRkFMU0Uoa2V5KTsKK0RFRklORV9TVEFUSUNfS0VZX0FSUkFZX1RSVUUoa2V5cywgY291bnQpOworREVGSU5FX1NUQVRJQ19LRVlfQVJSQVlfRkFMU0Uoa2V5cywgY291bnQpOwogc3RhdGljX2JyYW5jaF9saWtlbHkoKQogc3RhdGljX2JyYW5jaF91bmxpa2VseSgpCiAKQEAgLTE0MCw2ICsxNDIsMTMgQEAKIGtleSBpcyBpbml0aWFsaXplZCBmYWxzZSwgYSAnc3RhdGljX2JyYW5jaF9pbmMoKScsIHdpbGwgY2hhbmdlIHRoZSBicmFuY2ggdG8KIHRydWUuIEFuZCB0aGVuIGEgJ3N0YXRpY19icmFuY2hfZGVjKCknLCB3aWxsIGFnYWluIG1ha2UgdGhlIGJyYW5jaCBmYWxzZS4KIAorV2hlcmUgYW4gYXJyYXkgb2Yga2V5cyBpcyByZXF1aXJlZCwgaXQgY2FuIGJlIGRlZmluZWQgYXM6CisKKwlERUZJTkVfU1RBVElDX0tFWV9BUlJBWV9UUlVFKGtleXMsIGNvdW50KTsKKworb3I6CisKKwlERUZJTkVfU1RBVElDX0tFWV9BUlJBWV9GQUxTRShrZXlzLCBjb3VudCk7CiAKIDQpIEFyY2hpdGVjdHVyZSBsZXZlbCBjb2RlIHBhdGNoaW5nIGludGVyZmFjZSwgJ2p1bXAgbGFiZWxzJwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9SRUFETUUgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9SRUFETUUKaW5kZXggOGMzMzA2ZS4uOTFmNTRmZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvUkVBRE1FCisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL1JFQURNRQpAQCAtNjksNiArNjksNyBAQAogc3VucnBjLwkJU1VOIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCAoTkZTKQogdm0vCQltZW1vcnkgbWFuYWdlbWVudCB0dW5pbmcKIAkJYnVmZmVyIGFuZCBjYWNoZSBtYW5hZ2VtZW50Cit1c2VyLwkJUGVyIHVzZXIgcGVyIHVzZXIgbmFtZXNwYWNlIGxpbWl0cwogCiBUaGVzZSBhcmUgdGhlIHN1YmRpcnMgSSBoYXZlIG9uIG15IHN5c3RlbS4gVGhlcmUgbWlnaHQgYmUgbW9yZQogb3Igb3RoZXIgc3ViZGlycyBpbiBhbm90aGVyIHNldHVwLiBJZiB5b3Ugc2VlIGFub3RoZXIgZGlyLCBJJ2QKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2ZzLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2ZzLnR4dAppbmRleCAzMDJiNWVkLi4zNWUxN2Y3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9mcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvZnMudHh0CkBAIC0yNjUsNiArMjY1LDEzIEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKK21vdW50LW1heDoKKworVGhpcyBkZW5vdGVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtb3VudHMgdGhhdCBtYXkgZXhpc3QKK2luIGEgbW91bnQgbmFtZXNwYWNlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiAKIDIuIC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdXNlci50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC91c2VyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjkxYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdXNlci50eHQKQEAgLTAsMCArMSw2NiBAQAorRG9jdW1lbnRhdGlvbiBmb3IgL3Byb2Mvc3lzL3VzZXIvKglrZXJuZWwgdmVyc2lvbiA0LjkuMAorCShjKSAyMDE2CQlFcmljIEJpZWRlcm1hbiA8ZWJpZWRlcm1AeG1pc3Npb24uY29tPgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRvY3VtZXRhdGlvbiBmb3IgdGhlIHN5c2N0bCBmaWxlcyBpbgorL3Byb2Mvc3lzL3VzZXIuCisKK1RoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdAorbGltaXRzIG9uIHRoZSBudW1iZXIgb2YgbmFtZXNwYWNlcyBhbmQgb3RoZXIgb2JqZWN0cyB0aGF0IGhhdmUKK3BlciB1c2VyIHBlciB1c2VyIG5hbWVzcGFjZSBsaW1pdHMuCisKK1RoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhlc2UgbGltaXRzIGlzIHRvIHN0b3AgcHJvZ3JhbXMgdGhhdAorbWFsZnVuY3Rpb24gYW5kIGF0dGVtcHQgdG8gY3JlYXRlIGEgcmlkaWN1bG91cyBudW1iZXIgb2Ygb2JqZWN0cywKK2JlZm9yZSB0aGUgbWFsZnVuY3Rpb24gYmVjb21lcyBhIHN5c3RlbSB3aWRlIHByb2JsZW0uICBJdCBpcyB0aGUKK2ludGVudGlvbiB0aGF0IHRoZSBkZWZhdWx0cyBvZiB0aGVzZSBsaW1pdHMgYXJlIHNldCBoaWdoIGVub3VnaCB0aGF0CitubyBwcm9ncmFtIGluIG5vcm1hbCBvcGVyYXRpb24gc2hvdWxkIHJ1biBpbnRvIHRoZXNlIGxpbWl0cy4KKworVGhlIGNyZWF0aW9uIG9mIHBlciB1c2VyIHBlciB1c2VyIG5hbWVzcGFjZSBvYmplY3RzIGFyZSBjaGFyZ2VkIHRvCit0aGUgdXNlciBpbiB0aGUgdXNlciBuYW1lc3BhY2Ugd2hvIGNyZWF0ZWQgdGhlIG9iamVjdCBhbmQKK3ZlcmlmaWVkIHRvIGJlIGJlbG93IHRoZSBwZXIgdXNlciBsaW1pdCBpbiB0aGF0IHVzZXIgbmFtZXNwYWNlLgorCitUaGUgY3JlYXRpb24gb2Ygb2JqZWN0cyBpcyBhbHNvIGNoYXJnZWQgdG8gYWxsIG9mIHRoZSB1c2Vycword2hvIGNyZWF0ZWQgdXNlciBuYW1lc3BhY2VzIHRoZSBjcmVhdGlvbiBvZiB0aGUgb2JqZWN0IGhhcHBlbnMKK2luICh1c2VyIG5hbWVzcGFjZXMgY2FuIGJlIG5lc3RlZCkgYW5kIHZlcmlmaWVkIHRvIGJlIGJlbG93IHRoZSBwZXIgdXNlcgorbGltaXRzIGluIHRoZSB1c2VyIG5hbWVzcGFjZXMgb2YgdGhvc2UgdXNlcnMuCisKK1RoaXMgcmVjdXJzaXZlIGNvdW50aW5nIG9mIGNyZWF0ZWQgb2JqZWN0cyBlbnN1cmVzIHRoYXQgY3JlYXRpbmcgYQordXNlciBuYW1lc3BhY2UgZG9lcyBub3QgYWxsb3cgYSB1c2VyIHRvIGVzY2FwZSB0aGVpciBjdXJyZW50IGxpbWl0cy4KKworQ3VycmVudGx5LCB0aGVzZSBmaWxlcyBhcmUgaW4gL3Byb2Mvc3lzL3VzZXI6CisKKy0gbWF4X2Nncm91cF9uYW1lc3BhY2VzCisKKyAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNncm91cCBuYW1lc3BhY2VzIHRoYXQgYW55IHVzZXIgaW4gdGhlIGN1cnJlbnQKKyAgdXNlciBuYW1lc3BhY2UgbWF5IGNyZWF0ZS4KKworLSBtYXhfaXBjX25hbWVzcGFjZXMKKworICBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXBjIG5hbWVzcGFjZXMgdGhhdCBhbnkgdXNlciBpbiB0aGUgY3VycmVudAorICB1c2VyIG5hbWVzcGFjZSBtYXkgY3JlYXRlLgorCistIG1heF9tbnRfbmFtZXNwYWNlcworCisgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtb3VudCBuYW1lc3BhY2VzIHRoYXQgYW55IHVzZXIgaW4gdGhlIGN1cnJlbnQKKyAgdXNlciBuYW1lc3BhY2UgbWF5IGNyZWF0ZS4KKworLSBtYXhfbmV0X25hbWVzcGFjZXMKKworICBUaGUgbWF4aW11bSBudW1iZXIgb2YgbmV0d29yayBuYW1lc3BhY2VzIHRoYXQgYW55IHVzZXIgaW4gdGhlCisgIGN1cnJlbnQgdXNlciBuYW1lc3BhY2UgbWF5IGNyZWF0ZS4KKworLSBtYXhfcGlkX25hbWVzcGFjZXMKKworICBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGlkIG5hbWVzcGFjZXMgdGhhdCBhbnkgdXNlciBpbiB0aGUgY3VycmVudAorICB1c2VyIG5hbWVzcGFjZSBtYXkgY3JlYXRlLgorCistIG1heF91c2VyX25hbWVzcGFjZXMKKworICBUaGUgbWF4aW11bSBudW1iZXIgb2YgdXNlciBuYW1lc3BhY2VzIHRoYXQgYW55IHVzZXIgaW4gdGhlIGN1cnJlbnQKKyAgdXNlciBuYW1lc3BhY2UgbWF5IGNyZWF0ZS4KKworLSBtYXhfdXRzX25hbWVzcGFjZXMKKworICBUaGUgbWF4aW11bSBudW1iZXIgb2YgdXNlciBuYW1lc3BhY2VzIHRoYXQgYW55IHVzZXIgaW4gdGhlIGN1cnJlbnQKKyAgdXNlciBuYW1lc3BhY2UgbWF5IGNyZWF0ZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLWRlc2lnbi50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS1kZXNpZ24udHh0CmluZGV4IGRkNWY5MTYuLmEyNzNkZDAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLWRlc2lnbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UtZGVzaWduLnR4dApAQCAtMjAzLDYgKzIwMywxNyBAQAogCiBTaW1pbGFybHksIHdoZW4geW91IGNhbGwgZnRyYWNlX3JldHVybl90b19oYW5kbGVyKCksIHBhc3MgaXQgdGhlIGZyYW1lIHBvaW50ZXIuCiAKK0hBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBbiBhcmNoIG1heSBwYXNzIGluIGEgcG9pbnRlciB0byB0aGUgcmV0dXJuIGFkZHJlc3Mgb24gdGhlIHN0YWNrLiAgVGhpcworcHJldmVudHMgcG90ZW50aWFsIHN0YWNrIHVud2luZGluZyBpc3N1ZXMgd2hlcmUgdGhlIHVud2luZGVyIGdldHMgb3V0IG9mCitzeW5jIHdpdGggcmV0X3N0YWNrIGFuZCB0aGUgd3JvbmcgYWRkcmVzc2VzIGFyZSByZXBvcnRlZCBieQorZnRyYWNlX2dyYXBoX3JldF9hZGRyKCkuCisKK0FkZGluZyBzdXBwb3J0IGZvciBpdCBpcyBlYXN5OiBqdXN0IGRlZmluZSB0aGUgbWFjcm8gaW4gYXNtL2Z0cmFjZS5oIGFuZAorcGFzcyB0aGUgcmV0dXJuIGFkZHJlc3MgcG9pbnRlciBhcyB0aGUgJ3JldHAnIGFyZ3VtZW50IHRvCitmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UoKS4KIAogSEFWRV9GVFJBQ0VfTk1JX0VOVEVSCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLnR4dCBiL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLnR4dAppbmRleCBhNmIzNzA1Li4xODVjMzlmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UudHh0CkBAIC04NTgsMTEgKzg1OCwxMSBAQAogCSAgICAgICBXaGVuIGVuYWJsZWQsIGl0IHdpbGwgYWNjb3VudCB0aW1lIHRoZSB0YXNrIGhhcyBiZWVuCiAJICAgICAgIHNjaGVkdWxlZCBvdXQgYXMgcGFydCBvZiB0aGUgZnVuY3Rpb24gY2FsbC4KIAotICBncmFwaC10aW1lIC0gV2hlbiBydW5uaW5nIGZ1bmN0aW9uIGdyYXBoIHRyYWNlciwgdG8gaW5jbHVkZSB0aGUKLSAgCSAgICAgICB0aW1lIHRvIGNhbGwgbmVzdGVkIGZ1bmN0aW9ucy4gV2hlbiB0aGlzIGlzIG5vdCBzZXQsCi0JICAgICAgIHRoZSB0aW1lIHJlcG9ydGVkIGZvciB0aGUgZnVuY3Rpb24gd2lsbCBvbmx5IGluY2x1ZGUKLQkgICAgICAgdGhlIHRpbWUgdGhlIGZ1bmN0aW9uIGl0c2VsZiBleGVjdXRlZCBmb3IsIG5vdCB0aGUgdGltZQotCSAgICAgICBmb3IgZnVuY3Rpb25zIHRoYXQgaXQgY2FsbGVkLgorICBncmFwaC10aW1lIC0gV2hlbiBydW5uaW5nIGZ1bmN0aW9uIHByb2ZpbGVyIHdpdGggZnVuY3Rpb24gZ3JhcGggdHJhY2VyLAorCSAgICAgICB0byBpbmNsdWRlIHRoZSB0aW1lIHRvIGNhbGwgbmVzdGVkIGZ1bmN0aW9ucy4gV2hlbiB0aGlzIGlzCisJICAgICAgIG5vdCBzZXQsIHRoZSB0aW1lIHJlcG9ydGVkIGZvciB0aGUgZnVuY3Rpb24gd2lsbCBvbmx5CisJICAgICAgIGluY2x1ZGUgdGhlIHRpbWUgdGhlIGZ1bmN0aW9uIGl0c2VsZiBleGVjdXRlZCBmb3IsIG5vdCB0aGUKKwkgICAgICAgdGltZSBmb3IgZnVuY3Rpb25zIHRoYXQgaXQgY2FsbGVkLgogCiAgIHJlY29yZC1jbWQgLSBXaGVuIGFueSBldmVudCBvciB0cmFjZXIgaXMgZW5hYmxlZCwgYSBob29rIGlzIGVuYWJsZWQKICAgCSAgICAgICBpbiB0aGUgc2NoZWRfc3dpdGNoIHRyYWNlIHBvaW50IHRvIGZpbGwgY29tbSBjYWNoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFjZS9od2xhdF9kZXRlY3Rvci50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2h3bGF0X2RldGVjdG9yLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjA3NzE3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9od2xhdF9kZXRlY3Rvci50eHQKQEAgLTAsMCArMSw3OSBAQAorSW50cm9kdWN0aW9uOgorLS0tLS0tLS0tLS0tLQorCitUaGUgdHJhY2VyIGh3bGF0X2RldGVjdG9yIGlzIGEgc3BlY2lhbCBwdXJwb3NlIHRyYWNlciB0aGF0IGlzIHVzZWQgdG8KK2RldGVjdCBsYXJnZSBzeXN0ZW0gbGF0ZW5jaWVzIGluZHVjZWQgYnkgdGhlIGJlaGF2aW9yIG9mIGNlcnRhaW4gdW5kZXJseWluZworaGFyZHdhcmUgb3IgZmlybXdhcmUsIGluZGVwZW5kZW50IG9mIExpbnV4IGl0c2VsZi4gVGhlIGNvZGUgd2FzIGRldmVsb3BlZAorb3JpZ2luYWxseSB0byBkZXRlY3QgU01JcyAoU3lzdGVtIE1hbmFnZW1lbnQgSW50ZXJydXB0cykgb24geDg2IHN5c3RlbXMsCitob3dldmVyIHRoZXJlIGlzIG5vdGhpbmcgeDg2IHNwZWNpZmljIGFib3V0IHRoaXMgcGF0Y2hzZXQuIEl0IHdhcworb3JpZ2luYWxseSB3cml0dGVuIGZvciB1c2UgYnkgdGhlICJSVCIgcGF0Y2ggc2luY2UgdGhlIFJlYWwgVGltZQora2VybmVsIGlzIGhpZ2hseSBsYXRlbmN5IHNlbnNpdGl2ZS4KKworU01JcyBhcmUgbm90IHNlcnZpY2VkIGJ5IHRoZSBMaW51eCBrZXJuZWwsIHdoaWNoIG1lYW5zIHRoYXQgaXQgZG9lcyBub3QKK2V2ZW4ga25vdyB0aGF0IHRoZXkgYXJlIG9jY3VyaW5nLiBTTUlzIGFyZSBpbnN0ZWFkIHNldCB1cCBieSBCSU9TIGNvZGUKK2FuZCBhcmUgc2VydmljZWQgYnkgQklPUyBjb2RlLCB1c3VhbGx5IGZvciAiY3JpdGljYWwiIGV2ZW50cyBzdWNoIGFzCittYW5hZ2VtZW50IG9mIHRoZXJtYWwgc2Vuc29ycyBhbmQgZmFucy4gU29tZXRpbWVzIHRob3VnaCwgU01JcyBhcmUgdXNlZCBmb3IKK290aGVyIHRhc2tzIGFuZCB0aG9zZSB0YXNrcyBjYW4gc3BlbmQgYW4gaW5vcmRpbmF0ZSBhbW91bnQgb2YgdGltZSBpbiB0aGUKK2hhbmRsZXIgKHNvbWV0aW1lcyBtZWFzdXJlZCBpbiBtaWxsaXNlY29uZHMpLiBPYnZpb3VzbHkgdGhpcyBpcyBhIHByb2JsZW0gaWYKK3lvdSBhcmUgdHJ5aW5nIHRvIGtlZXAgZXZlbnQgc2VydmljZSBsYXRlbmNpZXMgZG93biBpbiB0aGUgbWljcm9zZWNvbmQgcmFuZ2UuCisKK1RoZSBoYXJkd2FyZSBsYXRlbmN5IGRldGVjdG9yIHdvcmtzIGJ5IGhvZ2dpbmcgb25lIG9mIHRoZSBjcHVzIGZvciBjb25maWd1cmFibGUKK2Ftb3VudHMgb2YgdGltZSAod2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkKSwgcG9sbGluZyB0aGUgQ1BVIFRpbWUgU3RhbXAgQ291bnRlcgorZm9yIHNvbWUgcGVyaW9kLCB0aGVuIGxvb2tpbmcgZm9yIGdhcHMgaW4gdGhlIFRTQyBkYXRhLiBBbnkgZ2FwIGluZGljYXRlcyBhCit0aW1lIHdoZW4gdGhlIHBvbGxpbmcgd2FzIGludGVycnVwdGVkIGFuZCBzaW5jZSB0aGUgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsCit0aGUgb25seSB0aGluZyB0aGF0IGNvdWxkIGRvIHRoYXQgd291bGQgYmUgYW4gU01JIG9yIG90aGVyIGhhcmR3YXJlIGhpY2N1cAorKG9yIGFuIE5NSSwgYnV0IHRob3NlIGNhbiBiZSB0cmFja2VkKS4KKworTm90ZSB0aGF0IHRoZSBod2xhdCBkZXRlY3RvciBzaG91bGQgKk5FVkVSKiBiZSB1c2VkIGluIGEgcHJvZHVjdGlvbiBlbnZpcm9ubWVudC4KK0l0IGlzIGludGVuZGVkIHRvIGJlIHJ1biBtYW51YWxseSB0byBkZXRlcm1pbmUgaWYgdGhlIGhhcmR3YXJlIHBsYXRmb3JtIGhhcyBhCitwcm9ibGVtIHdpdGggbG9uZyBzeXN0ZW0gZmlybXdhcmUgc2VydmljZSByb3V0aW5lcy4KKworVXNhZ2U6CistLS0tLS0KKworV3JpdGUgdGhlIEFTQ0lJIHRleHQgImh3bGF0IiBpbnRvIHRoZSBjdXJyZW50X3RyYWNlciBmaWxlIG9mIHRoZSB0cmFjaW5nIHN5c3RlbQorKG1vdW50ZWQgYXQgL3N5cy9rZXJuZWwvdHJhY2luZyBvciAvc3lzL2tlcm5lbC90cmFjaW5nKS4gSXQgaXMgcG9zc2libGUgdG8KK3JlZGVmaW5lIHRoZSB0aHJlc2hvbGQgaW4gbWljcm9zZWNvbmRzICh1cykgYWJvdmUgd2hpY2ggbGF0ZW5jeSBzcGlrZXMgd2lsbAorYmUgdGFrZW4gaW50byBhY2NvdW50LgorCitFeGFtcGxlOgorCisJIyBlY2hvIGh3bGF0ID4gL3N5cy9rZXJuZWwvdHJhY2luZy9jdXJyZW50X3RyYWNlcgorCSMgZWNobyAxMDAgPiAvc3lzL2tlcm5lbC90cmFjaW5nL3RyYWNpbmdfdGhyZXNoCisKK1RoZSAvc3lzL2tlcm5lbC90cmFjaW5nL2h3bGF0X2RldGVjdG9yIGludGVyZmFjZSBjb250YWlucyB0aGUgZm9sbG93aW5nIGZpbGVzOgorCit3aWR0aAkJCS0gdGltZSBwZXJpb2QgdG8gc2FtcGxlIHdpdGggQ1BVcyBoZWxkICh1c2VjcykKKwkJCSAgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIHRvdGFsIHdpbmRvdyBzaXplIChlbmZvcmNlZCkKK3dpbmRvdwkJCS0gdG90YWwgcGVyaW9kIG9mIHNhbXBsaW5nLCB3aWR0aCBiZWluZyBpbnNpZGUgKHVzZWNzKQorCitCeSBkZWZhdWx0IHRoZSB3aWR0aCBpcyBzZXQgdG8gNTAwLDAwMCBhbmQgd2luZG93IHRvIDEsMDAwLDAwMCwgbWVhbmluZyB0aGF0Citmb3IgZXZlcnkgMSwwMDAsMDAwIHVzZWNzICgxcykgdGhlIGh3bGF0IGRldGVjdG9yIHdpbGwgc3BpbiBmb3IgNTAwLDAwMCB1c2VjcworKDAuNXMpLiBJZiB0cmFjaW5nX3RocmVzaCBjb250YWlucyB6ZXJvIHdoZW4gaHdsYXQgdHJhY2VyIGlzIGVuYWJsZWQsIGl0IHdpbGwKK2NoYW5nZSB0byBhIGRlZmF1bHQgb2YgMTAgdXNlY3MuIElmIGFueSBsYXRlbmNpZXMgdGhhdCBleGNlZWQgdGhlIHRocmVzaG9sZCBpcworb2JzZXJ2ZWQgdGhlbiB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHRyYWNpbmcgcmluZyBidWZmZXIuCisKK1RoZSBtaW5pbXVtIHNsZWVwIHRpbWUgYmV0d2VlbiBwZXJpb2RzIGlzIDEgbWlsbGlzZWNvbmQuIEV2ZW4gaWYgd2lkdGgKK2lzIGxlc3MgdGhhbiAxIG1pbGxpc2Vjb25kIGFwYXJ0IGZyb20gd2luZG93LCB0byBhbGxvdyB0aGUgc3lzdGVtIHRvIG5vdAorYmUgdG90YWxseSBzdGFydmVkLgorCitJZiB0cmFjaW5nX3RocmVzaCB3YXMgemVybyB3aGVuIGh3bGF0IGRldGVjdG9yIHdhcyBzdGFydGVkLCBpdCB3aWxsIGJlIHNldAorYmFjayB0byB6ZXJvIGlmIGFub3RoZXIgdHJhY2VyIGlzIGxvYWRlZC4gTm90ZSwgdGhlIGxhc3QgdmFsdWUgaW4KK3RyYWNpbmdfdGhyZXNoIHRoYXQgaHdsYXQgZGV0ZWN0b3IgaGFkIHdpbGwgYmUgc2F2ZWQgYW5kIHRoaXMgdmFsdWUgd2lsbAorYmUgcmVzdG9yZWQgaW4gdHJhY2luZ190aHJlc2ggaWYgaXQgaXMgc3RpbGwgemVybyB3aGVuIGh3bGF0IGRldGVjdG9yIGlzCitzdGFydGVkIGFnYWluLgorCitUaGUgZm9sbG93aW5nIHRyYWNpbmcgZGlyZWN0b3J5IGZpbGVzIGFyZSB1c2VkIGJ5IHRoZSBod2xhdF9kZXRlY3RvcjoKKworaW4gL3N5cy9rZXJuZWwvdHJhY2luZzoKKworIHRyYWNpbmdfdGhyZXNob2xkCS0gbWluaW11bSBsYXRlbmN5IHZhbHVlIHRvIGJlIGNvbnNpZGVyZWQgKHVzZWNzKQorIHRyYWNpbmdfbWF4X2xhdGVuY3kJLSBtYXhpbXVtIGhhcmR3YXJlIGxhdGVuY3kgYWN0dWFsbHkgb2JzZXJ2ZWQgKHVzZWNzKQorIHRyYWNpbmdfY3B1bWFzawktIHRoZSBDUFVzIHRvIG1vdmUgdGhlIGh3bGF0IHRocmVhZCBhY3Jvc3MKKyBod2xhdF9kZXRlY3Rvci93aWR0aAktIHNwZWNpZmllZCBhbW91bnQgb2YgdGltZSB0byBzcGluIHdpdGhpbiB3aW5kb3cgKHVzZWNzKQorIGh3bGF0X2RldGVjdG9yL3dpbmRvdwktIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gKHdpZHRoKSBydW5zICh1c2VjcykKKworVGhlIGh3bGF0IGRldGVjdG9yJ3Mga2VybmVsIHRocmVhZCB3aWxsIG1pZ3JhdGUgYWNyb3NzIGVhY2ggQ1BVIHNwZWNpZmllZCBpbgordHJhY2luZ19jcHVtYXNrIGJldHdlZW4gZWFjaCB3aW5kb3cuIFRvIGxpbWl0IHRoZSBtaWdyYXRpb24sIGVpdGhlciBtb2RpZnkKK3RyYWNpbmdfY3B1bWFzaywgb3IgbW9kaWZ5IHRoZSBod2xhdCBrZXJuZWwgdGhyZWFkIChuYW1lZCBbaHdsYXRkXSkgQ1BVCithZmZpbml0eSBkaXJlY3RseSwgYW5kIHRoZSBtaWdyYXRpb24gd2lsbCBzdG9wLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFjZS9rcHJvYmV0cmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2twcm9iZXRyYWNlLnR4dAppbmRleCBlYTUyZWMxLi5lNDk5MWZiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2twcm9iZXRyYWNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2twcm9iZXRyYWNlLnR4dApAQCAtNDQsOCArNDQsOCBAQAogICArfC1vZmZzKEZFVENIQVJHKSA6IEZldGNoIG1lbW9yeSBhdCBGRVRDSEFSRyArfC0gb2ZmcyBhZGRyZXNzLigqKikKICAgTkFNRT1GRVRDSEFSRyA6IFNldCBOQU1FIGFzIHRoZSBhcmd1bWVudCBuYW1lIG9mIEZFVENIQVJHLgogICBGRVRDSEFSRzpUWVBFIDogU2V0IFRZUEUgYXMgdGhlIHR5cGUgb2YgRkVUQ0hBUkcuIEN1cnJlbnRseSwgYmFzaWMgdHlwZXMKLQkJICAodTgvdTE2L3UzMi91NjQvczgvczE2L3MzMi9zNjQpLCAic3RyaW5nIiBhbmQgYml0ZmllbGQKLQkJICBhcmUgc3VwcG9ydGVkLgorCQkgICh1OC91MTYvdTMyL3U2NC9zOC9zMTYvczMyL3M2NCksIGhleGFkZWNpbWFsIHR5cGVzCisJCSAgKHg4L3gxNi94MzIveDY0KSwgInN0cmluZyIgYW5kIGJpdGZpZWxkIGFyZSBzdXBwb3J0ZWQuCiAKICAgKCopIG9ubHkgZm9yIHJldHVybiBwcm9iZS4KICAgKCoqKSB0aGlzIGlzIHVzZWZ1bCBmb3IgZmV0Y2hpbmcgYSBmaWVsZCBvZiBkYXRhIHN0cnVjdHVyZXMuCkBAIC01NCw3ICs1NCwxMCBAQAogLS0tLS0KIFNldmVyYWwgdHlwZXMgYXJlIHN1cHBvcnRlZCBmb3IgZmV0Y2gtYXJncy4gS3Byb2JlIHRyYWNlciB3aWxsIGFjY2VzcyBtZW1vcnkKIGJ5IGdpdmVuIHR5cGUuIFByZWZpeCAncycgYW5kICd1JyBtZWFucyB0aG9zZSB0eXBlcyBhcmUgc2lnbmVkIGFuZCB1bnNpZ25lZAotcmVzcGVjdGl2ZWx5LiBUcmFjZWQgYXJndW1lbnRzIGFyZSBzaG93biBpbiBkZWNpbWFsIChzaWduZWQpIG9yIGhleCAodW5zaWduZWQpLgorcmVzcGVjdGl2ZWx5LiAneCcgcHJlZml4IGltcGxpZXMgaXQgaXMgdW5zaWduZWQuIFRyYWNlZCBhcmd1bWVudHMgYXJlIHNob3duCitpbiBkZWNpbWFsICgncycgYW5kICd1Jykgb3IgaGV4YWRlY2ltYWwgKCd4JykuIFdpdGhvdXQgdHlwZSBjYXN0aW5nLCAneDMyJworb3IgJ3g2NCcgaXMgdXNlZCBkZXBlbmRzIG9uIHRoZSBhcmNoaXRlY3R1cmUgKGUuZy4geDg2LTMyIHVzZXMgeDMyLCBhbmQKK3g4Ni02NCB1c2VzIHg2NCkuCiBTdHJpbmcgdHlwZSBpcyBhIHNwZWNpYWwgdHlwZSwgd2hpY2ggZmV0Y2hlcyBhICJudWxsLXRlcm1pbmF0ZWQiIHN0cmluZyBmcm9tCiBrZXJuZWwgc3BhY2UuIFRoaXMgbWVhbnMgaXQgd2lsbCBmYWlsIGFuZCBzdG9yZSBOVUxMIGlmIHRoZSBzdHJpbmcgY29udGFpbmVyCiBoYXMgYmVlbiBwYWdlZCBvdXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RyYWNlL3Vwcm9iZXRyYWNlci50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL3Vwcm9iZXRyYWNlci50eHQKaW5kZXggNzJkMWNkNC4uOTRiNmI0NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90cmFjZS91cHJvYmV0cmFjZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdHJhY2UvdXByb2JldHJhY2VyLnR4dApAQCAtNDAsOCArNDAsOCBAQAogICAgK3wtb2ZmcyhGRVRDSEFSRykgOiBGZXRjaCBtZW1vcnkgYXQgRkVUQ0hBUkcgK3wtIG9mZnMgYWRkcmVzcy4oKiopCiAgICBOQU1FPUZFVENIQVJHICAgICA6IFNldCBOQU1FIGFzIHRoZSBhcmd1bWVudCBuYW1lIG9mIEZFVENIQVJHLgogICAgRkVUQ0hBUkc6VFlQRSAgICAgOiBTZXQgVFlQRSBhcyB0aGUgdHlwZSBvZiBGRVRDSEFSRy4gQ3VycmVudGx5LCBiYXNpYyB0eXBlcwotCQkgICAgICAgKHU4L3UxNi91MzIvdTY0L3M4L3MxNi9zMzIvczY0KSwgInN0cmluZyIgYW5kIGJpdGZpZWxkCi0JCSAgICAgICBhcmUgc3VwcG9ydGVkLgorCQkgICAgICAgKHU4L3UxNi91MzIvdTY0L3M4L3MxNi9zMzIvczY0KSwgaGV4YWRlY2ltYWwgdHlwZXMKKwkJICAgICAgICh4OC94MTYveDMyL3g2NCksICJzdHJpbmciIGFuZCBiaXRmaWVsZCBhcmUgc3VwcG9ydGVkLgogCiAgICgqKSBvbmx5IGZvciByZXR1cm4gcHJvYmUuCiAgICgqKikgdGhpcyBpcyB1c2VmdWwgZm9yIGZldGNoaW5nIGEgZmllbGQgb2YgZGF0YSBzdHJ1Y3R1cmVzLgpAQCAtNTAsNyArNTAsMTAgQEAKIC0tLS0tCiBTZXZlcmFsIHR5cGVzIGFyZSBzdXBwb3J0ZWQgZm9yIGZldGNoLWFyZ3MuIFVwcm9iZSB0cmFjZXIgd2lsbCBhY2Nlc3MgbWVtb3J5CiBieSBnaXZlbiB0eXBlLiBQcmVmaXggJ3MnIGFuZCAndScgbWVhbnMgdGhvc2UgdHlwZXMgYXJlIHNpZ25lZCBhbmQgdW5zaWduZWQKLXJlc3BlY3RpdmVseS4gVHJhY2VkIGFyZ3VtZW50cyBhcmUgc2hvd24gaW4gZGVjaW1hbCAoc2lnbmVkKSBvciBoZXggKHVuc2lnbmVkKS4KK3Jlc3BlY3RpdmVseS4gJ3gnIHByZWZpeCBpbXBsaWVzIGl0IGlzIHVuc2lnbmVkLiBUcmFjZWQgYXJndW1lbnRzIGFyZSBzaG93bgoraW4gZGVjaW1hbCAoJ3MnIGFuZCAndScpIG9yIGhleGFkZWNpbWFsICgneCcpLiBXaXRob3V0IHR5cGUgY2FzdGluZywgJ3gzMicKK29yICd4NjQnIGlzIHVzZWQgZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlIChlLmcuIHg4Ni0zMiB1c2VzIHgzMiwgYW5kCit4ODYtNjQgdXNlcyB4NjQpLgogU3RyaW5nIHR5cGUgaXMgYSBzcGVjaWFsIHR5cGUsIHdoaWNoIGZldGNoZXMgYSAibnVsbC10ZXJtaW5hdGVkIiBzdHJpbmcgZnJvbQogdXNlciBzcGFjZS4KIEJpdGZpZWxkIGlzIGFub3RoZXIgc3BlY2lhbCB0eXBlLCB3aGljaCB0YWtlcyAzIHBhcmFtZXRlcnMsIGJpdC13aWR0aCwgYml0LQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91YnNhbi50eHQgYi9Eb2N1bWVudGF0aW9uL3Vic2FuLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4MjE1ZS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL3Vic2FuLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLVVuZGVmaW5lZCBCZWhhdmlvciBTYW5pdGl6ZXIgLSBVQlNBTgotCi1PdmVydmlldwotLS0tLS0tLS0KLQotVUJTQU4gaXMgYSBydW50aW1lIHVuZGVmaW5lZCBiZWhhdmlvdXIgY2hlY2tlci4KLQotVUJTQU4gdXNlcyBjb21waWxlLXRpbWUgaW5zdHJ1bWVudGF0aW9uIHRvIGNhdGNoIHVuZGVmaW5lZCBiZWhhdmlvciAoVUIpLgotQ29tcGlsZXIgaW5zZXJ0cyBjb2RlIHRoYXQgcGVyZm9ybSBjZXJ0YWluIGtpbmRzIG9mIGNoZWNrcyBiZWZvcmUgb3BlcmF0aW9ucwotdGhhdCBtYXkgY2F1c2UgVUIuIElmIGNoZWNrIGZhaWxzIChpLmUuIFVCIGRldGVjdGVkKSBfX3Vic2FuX2hhbmRsZV8qCi1mdW5jdGlvbiBjYWxsZWQgdG8gcHJpbnQgZXJyb3IgbWVzc2FnZS4KLQotR0NDIGhhcyB0aGF0IGZlYXR1cmUgc2luY2UgNC45LnggWzFdIChzZWUgLWZzYW5pdGl6ZT11bmRlZmluZWQgb3B0aW9uIGFuZAotaXRzIHN1Ym9wdGlvbnMpLiBHQ0MgNS54IGhhcyBtb3JlIGNoZWNrZXJzIGltcGxlbWVudGVkIFsyXS4KLQotUmVwb3J0IGV4YW1wbGUKLS0tLS0tLS0tLS0tLS0tLQotCi0JID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0JIFVCU0FOOiBVbmRlZmluZWQgYmVoYXZpb3VyIGluIC4uL2luY2x1ZGUvbGludXgvYml0b3BzLmg6MTEwOjMzCi0JIHNoaWZ0IGV4cG9uZW50IDMyIGlzIHRvIGxhcmdlIGZvciAzMi1iaXQgdHlwZSAndW5zaWduZWQgaW50JwotCSBDUFU6IDAgUElEOiAwIENvbW06IHN3YXBwZXIgTm90IHRhaW50ZWQgNC40LjAtcmMxKyAjMjYKLQkgIDAwMDAwMDAwMDAwMDAwMDAgZmZmZmZmZmY4MjQwM2NjOCBmZmZmZmZmZjgxNWU2Y2Q2IDAwMDAwMDAwMDAwMDAwMDEKLQkgIGZmZmZmZmZmODI0MDNjZjggZmZmZmZmZmY4MjQwM2NlMCBmZmZmZmZmZjgxNjNhNWVkIDAwMDAwMDAwMDAwMDAwMjAKLQkgIGZmZmZmZmZmODI0MDNkNzggZmZmZmZmZmY4MTYzYWMyYiBmZmZmZmZmZjgxNWYwMDAxIDAwMDAwMDAwMDAwMDAwMDIKLQkgQ2FsbCBUcmFjZToKLQkgIFs8ZmZmZmZmZmY4MTVlNmNkNj5dIGR1bXBfc3RhY2srMHg0NS8weDVmCi0JICBbPGZmZmZmZmZmODE2M2E1ZWQ+XSB1YnNhbl9lcGlsb2d1ZSsweGQvMHg0MAotCSAgWzxmZmZmZmZmZjgxNjNhYzJiPl0gX191YnNhbl9oYW5kbGVfc2hpZnRfb3V0X29mX2JvdW5kcysweGViLzB4MTMwCi0JICBbPGZmZmZmZmZmODE1ZjAwMDE+XSA/IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdCsweDUxLzB4MTUwCi0JICBbPGZmZmZmZmZmODE3M2M1ODY+XSBfbWl4X3Bvb2xfYnl0ZXMrMHgxZTYvMHg0ODAKLQkgIFs8ZmZmZmZmZmY4MzEwNTY1Mz5dID8gZG1pX3dhbGtfZWFybHkrMHg0OC8weDVjCi0JICBbPGZmZmZmZmZmODE3M2M4ODE+XSBhZGRfZGV2aWNlX3JhbmRvbW5lc3MrMHg2MS8weDEzMAotCSAgWzxmZmZmZmZmZjgzMTA1YjM1Pl0gPyBkbWlfc2F2ZV9vbmVfZGV2aWNlKzB4YWEvMHhhYQotCSAgWzxmZmZmZmZmZjgzMTA1NjUzPl0gZG1pX3dhbGtfZWFybHkrMHg0OC8weDVjCi0JICBbPGZmZmZmZmZmODMxMDY2YWU+XSBkbWlfc2Nhbl9tYWNoaW5lKzB4Mjc4LzB4NGI0Ci0JICBbPGZmZmZmZmZmODExMWQ1OGE+XSA/IHZwcmludGtfZGVmYXVsdCsweDFhLzB4MjAKLQkgIFs8ZmZmZmZmZmY4MzBhZDEyMD5dID8gZWFybHlfaWR0X2hhbmRsZXJfYXJyYXkrMHgxMjAvMHgxMjAKLQkgIFs8ZmZmZmZmZmY4MzBiMjI0MD5dIHNldHVwX2FyY2grMHg0MDUvMHhjMmMKLQkgIFs8ZmZmZmZmZmY4MzBhZDEyMD5dID8gZWFybHlfaWR0X2hhbmRsZXJfYXJyYXkrMHgxMjAvMHgxMjAKLQkgIFs8ZmZmZmZmZmY4MzBhZTA1Mz5dIHN0YXJ0X2tlcm5lbCsweDgzLzB4NDlhCi0JICBbPGZmZmZmZmZmODMwYWQxMjA+XSA/IGVhcmx5X2lkdF9oYW5kbGVyX2FycmF5KzB4MTIwLzB4MTIwCi0JICBbPGZmZmZmZmZmODMwYWQzODY+XSB4ODZfNjRfc3RhcnRfcmVzZXJ2YXRpb25zKzB4MmEvMHgyYwotCSAgWzxmZmZmZmZmZjgzMGFkNGYzPl0geDg2XzY0X3N0YXJ0X2tlcm5lbCsweDE2Yi8weDE3YQotCSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Vc2FnZQotLS0tLS0KLQotVG8gZW5hYmxlIFVCU0FOIGNvbmZpZ3VyZSBrZXJuZWwgd2l0aDoKLQotCUNPTkZJR19VQlNBTj15Ci0KLWFuZCB0byBjaGVjayB0aGUgZW50aXJlIGtlcm5lbDoKLQotICAgICAgICBDT05GSUdfVUJTQU5fU0FOSVRJWkVfQUxMPXkKLQotVG8gZW5hYmxlIGluc3RydW1lbnRhdGlvbiBmb3Igc3BlY2lmaWMgZmlsZXMgb3IgZGlyZWN0b3JpZXMsIGFkZCBhIGxpbmUKLXNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyB0byB0aGUgcmVzcGVjdGl2ZSBrZXJuZWwgTWFrZWZpbGU6Ci0KLSAgICAgICAgRm9yIGEgc2luZ2xlIGZpbGUgKGUuZy4gbWFpbi5vKToKLSAgICAgICAgICAgICAgICBVQlNBTl9TQU5JVElaRV9tYWluLm8gOj0geQotCi0gICAgICAgIEZvciBhbGwgZmlsZXMgaW4gb25lIGRpcmVjdG9yeToKLSAgICAgICAgICAgICAgICBVQlNBTl9TQU5JVElaRSA6PSB5Ci0KLVRvIGV4Y2x1ZGUgZmlsZXMgZnJvbSBiZWluZyBpbnN0cnVtZW50ZWQgZXZlbiBpZgotQ09ORklHX1VCU0FOX1NBTklUSVpFX0FMTD15LCB1c2U6Ci0KLSAgICAgICAgICAgICAgICBVQlNBTl9TQU5JVElaRV9tYWluLm8gOj0gbgotICAgICAgICBhbmQ6Ci0gICAgICAgICAgICAgICAgVUJTQU5fU0FOSVRJWkUgOj0gbgotCi1EZXRlY3Rpb24gb2YgdW5hbGlnbmVkIGFjY2Vzc2VzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgc2VwYXJhdGUgb3B0aW9uIC0KLUNPTkZJR19VQlNBTl9BTElHTk1FTlQuIEl0J3Mgb2ZmIGJ5IGRlZmF1bHQgb24gYXJjaGl0ZWN0dXJlcyB0aGF0IHN1cHBvcnQKLXVuYWxpZ25lZCBhY2Nlc3NlcyAoQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1M9eSkuIE9uZSBjb3VsZAotc3RpbGwgZW5hYmxlIGl0IGluIGNvbmZpZywganVzdCBub3RlIHRoYXQgaXQgd2lsbCBwcm9kdWNlIGEgbG90IG9mIFVCU0FOCi1yZXBvcnRzLgotCi1SZWZlcmVuY2VzCi0tLS0tLS0tLS0tCi0KLVsxXSAtIGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MtNC45LjAvZ2NjL0RlYnVnZ2luZy1PcHRpb25zLmh0bWwKLVsyXSAtIGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9nY2MvRGVidWdnaW5nLU9wdGlvbnMuaHRtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL2FybS12Z2ljLWl0cy50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2RldmljZXMvYXJtLXZnaWMtaXRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDgxYTViCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL2FybS12Z2ljLWl0cy50eHQKQEAgLTAsMCArMSwzOCBAQAorQVJNIFZpcnR1YWwgSW50ZXJydXB0IFRyYW5zbGF0aW9uIFNlcnZpY2UgKElUUykKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0RldmljZSB0eXBlcyBzdXBwb3J0ZWQ6CisgIEtWTV9ERVZfVFlQRV9BUk1fVkdJQ19JVFMgICAgQVJNIEludGVycnVwdCBUcmFuc2xhdGlvbiBTZXJ2aWNlIENvbnRyb2xsZXIKKworVGhlIElUUyBhbGxvd3MgTVNJKC1YKSBpbnRlcnJ1cHRzIHRvIGJlIGluamVjdGVkIGludG8gZ3Vlc3RzLiBUaGlzIGV4dGVuc2lvbiBpcworb3B0aW9uYWwuICBDcmVhdGluZyBhIHZpcnR1YWwgSVRTIGNvbnRyb2xsZXIgYWxzbyByZXF1aXJlcyBhIGhvc3QgR0lDdjMgKHNlZQorYXJtLXZnaWMtdjMudHh0KSwgYnV0IGRvZXMgbm90IGRlcGVuZCBvbiBoYXZpbmcgcGh5c2ljYWwgSVRTIGNvbnRyb2xsZXJzLgorCitUaGVyZSBjYW4gYmUgbXVsdGlwbGUgSVRTIGNvbnRyb2xsZXJzIHBlciBndWVzdCwgZWFjaCBvZiB0aGVtIGhhcyB0byBoYXZlCithIHNlcGFyYXRlLCBub24tb3ZlcmxhcHBpbmcgTU1JTyByZWdpb24uCisKKworR3JvdXBzOgorICBLVk1fREVWX0FSTV9WR0lDX0dSUF9BRERSCisgIEF0dHJpYnV0ZXM6CisgICAgS1ZNX1ZHSUNfSVRTX0FERFJfVFlQRSAocncsIDY0LWJpdCkKKyAgICAgIEJhc2UgYWRkcmVzcyBpbiB0aGUgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBvZiB0aGUgR0lDdjMgSVRTCisgICAgICBjb250cm9sIHJlZ2lzdGVyIGZyYW1lLgorICAgICAgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIDY0SyBhbGlnbmVkIGFuZCB0aGUgcmVnaW9uIGNvdmVycyAxMjhLLgorICBFcnJvcnM6CisgICAgLUUyQklHOiAgQWRkcmVzcyBvdXRzaWRlIG9mIGFkZHJlc3NhYmxlIElQQSByYW5nZQorICAgIC1FSU5WQUw6IEluY29ycmVjdGx5IGFsaWduZWQgYWRkcmVzcworICAgIC1FRVhJU1Q6IEFkZHJlc3MgYWxyZWFkeSBjb25maWd1cmVkCisgICAgLUVGQVVMVDogSW52YWxpZCB1c2VyIHBvaW50ZXIgZm9yIGF0dHItPmFkZHIuCisgICAgLUVOT0RFVjogSW5jb3JyZWN0IGF0dHJpYnV0ZSBvciB0aGUgSVRTIGlzIG5vdCBzdXBwb3J0ZWQuCisKKworICBLVk1fREVWX0FSTV9WR0lDX0dSUF9DVFJMCisgIEF0dHJpYnV0ZXM6CisgICAgS1ZNX0RFVl9BUk1fVkdJQ19DVFJMX0lOSVQKKyAgICAgIHJlcXVlc3QgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBJVFMsIG5vIGFkZGl0aW9uYWwgcGFyYW1ldGVyIGluCisgICAgICBrdm1fZGV2aWNlX2F0dHIuYWRkci4KKyAgRXJyb3JzOgorICAgIC1FTlhJTzogIElUUyBub3QgcHJvcGVybHkgY29uZmlndXJlZCBhcyByZXF1aXJlZCBwcmlvciB0byBzZXR0aW5nCisgICAgICAgICAgICAgdGhpcyBhdHRyaWJ1dGUKKyAgICAtRU5PTUVNOiBNZW1vcnkgc2hvcnRhZ2Ugd2hlbiBhbGxvY2F0aW5nIElUUyBpbnRlcm5hbCBkYXRhCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2RldmljZXMvYXJtLXZnaWMtdjMudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL2FybS12Z2ljLXYzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQ4YjNjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL2FybS12Z2ljLXYzLnR4dApAQCAtMCwwICsxLDIwNiBAQAorQVJNIFZpcnR1YWwgR2VuZXJpYyBJbnRlcnJ1cHQgQ29udHJvbGxlciB2MyBhbmQgbGF0ZXIgKFZHSUN2MykKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworRGV2aWNlIHR5cGVzIHN1cHBvcnRlZDoKKyAgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YzICAgICBBUk0gR2VuZXJpYyBJbnRlcnJ1cHQgQ29udHJvbGxlciB2My4wCisKK09ubHkgb25lIFZHSUMgaW5zdGFuY2UgbWF5IGJlIGluc3RhbnRpYXRlZCB0aHJvdWdoIHRoaXMgQVBJLiAgVGhlIGNyZWF0ZWQgVkdJQword2lsbCBhY3QgYXMgdGhlIFZNIGludGVycnVwdCBjb250cm9sbGVyLCByZXF1aXJpbmcgZW11bGF0ZWQgdXNlci1zcGFjZSBkZXZpY2VzCit0byBpbmplY3QgaW50ZXJydXB0cyB0byB0aGUgVkdJQyBpbnN0ZWFkIG9mIGRpcmVjdGx5IHRvIENQVXMuICBJdCBpcyBub3QKK3Bvc3NpYmxlIHRvIGNyZWF0ZSBib3RoIGEgR0lDdjMgYW5kIEdJQ3YyIG9uIHRoZSBzYW1lIFZNLgorCitDcmVhdGluZyBhIGd1ZXN0IEdJQ3YzIGRldmljZSByZXF1aXJlcyBhIGhvc3QgR0lDdjMgYXMgd2VsbC4KKworCitHcm91cHM6CisgIEtWTV9ERVZfQVJNX1ZHSUNfR1JQX0FERFIKKyAgQXR0cmlidXRlczoKKyAgICBLVk1fVkdJQ19WM19BRERSX1RZUEVfRElTVCAocncsIDY0LWJpdCkKKyAgICAgIEJhc2UgYWRkcmVzcyBpbiB0aGUgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBvZiB0aGUgR0lDdjMgZGlzdHJpYnV0b3IKKyAgICAgIHJlZ2lzdGVyIG1hcHBpbmdzLiBPbmx5IHZhbGlkIGZvciBLVk1fREVWX1RZUEVfQVJNX1ZHSUNfVjMuCisgICAgICBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgNjRLIGFsaWduZWQgYW5kIHRoZSByZWdpb24gY292ZXJzIDY0IEtCeXRlLgorCisgICAgS1ZNX1ZHSUNfVjNfQUREUl9UWVBFX1JFRElTVCAocncsIDY0LWJpdCkKKyAgICAgIEJhc2UgYWRkcmVzcyBpbiB0aGUgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBvZiB0aGUgR0lDdjMKKyAgICAgIHJlZGlzdHJpYnV0b3IgcmVnaXN0ZXIgbWFwcGluZ3MuIFRoZXJlIGFyZSB0d28gNjRLIHBhZ2VzIGZvciBlYWNoCisgICAgICBWQ1BVIGFuZCBhbGwgb2YgdGhlIHJlZGlzdHJpYnV0b3IgcGFnZXMgYXJlIGNvbnRpZ3VvdXMuCisgICAgICBPbmx5IHZhbGlkIGZvciBLVk1fREVWX1RZUEVfQVJNX1ZHSUNfVjMuCisgICAgICBUaGlzIGFkZHJlc3MgbmVlZHMgdG8gYmUgNjRLIGFsaWduZWQuCisgIEVycm9yczoKKyAgICAtRTJCSUc6ICBBZGRyZXNzIG91dHNpZGUgb2YgYWRkcmVzc2FibGUgSVBBIHJhbmdlCisgICAgLUVJTlZBTDogSW5jb3JyZWN0bHkgYWxpZ25lZCBhZGRyZXNzCisgICAgLUVFWElTVDogQWRkcmVzcyBhbHJlYWR5IGNvbmZpZ3VyZWQKKyAgICAtRU5YSU86ICBUaGUgZ3JvdXAgb3IgYXR0cmlidXRlIGlzIHVua25vd24vdW5zdXBwb3J0ZWQgZm9yIHRoaXMgZGV2aWNlCisgICAgICAgICAgICAgb3IgaGFyZHdhcmUgc3VwcG9ydCBpcyBtaXNzaW5nLgorICAgIC1FRkFVTFQ6IEludmFsaWQgdXNlciBwb2ludGVyIGZvciBhdHRyLT5hZGRyLgorCisKKworICBLVk1fREVWX0FSTV9WR0lDX0dSUF9ESVNUX1JFR1MKKyAgS1ZNX0RFVl9BUk1fVkdJQ19HUlBfUkVESVNUX1JFR1MKKyAgQXR0cmlidXRlczoKKyAgICBUaGUgYXR0ciBmaWVsZCBvZiBrdm1fZGV2aWNlX2F0dHIgZW5jb2RlcyB0d28gdmFsdWVzOgorICAgIGJpdHM6ICAgICB8IDYzICAgLi4uLiAgMzIgIHwgIDMxICAgLi4uLiAgICAwIHwKKyAgICB2YWx1ZXM6ICAgfCAgICAgIG1waWRyICAgICB8ICAgICAgb2Zmc2V0ICAgICB8CisKKyAgICBBbGwgZGlzdHJpYnV0b3IgcmVncyBhcmUgKHJ3LCAzMi1iaXQpIGFuZCBrdm1fZGV2aWNlX2F0dHIuYWRkciBwb2ludHMgdG8gYQorICAgIF9fdTMyIHZhbHVlLiAgNjQtYml0IHJlZ2lzdGVycyBtdXN0IGJlIGFjY2Vzc2VkIGJ5IHNlcGFyYXRlbHkgYWNjZXNzaW5nIHRoZQorICAgIGxvd2VyIGFuZCBoaWdoZXIgd29yZC4KKworICAgIFdyaXRlcyB0byByZWFkLW9ubHkgcmVnaXN0ZXJzIGFyZSBpZ25vcmVkIGJ5IHRoZSBrZXJuZWwuCisKKyAgICBLVk1fREVWX0FSTV9WR0lDX0dSUF9ESVNUX1JFR1MgYWNjZXNzZXMgdGhlIG1haW4gZGlzdHJpYnV0b3IgcmVnaXN0ZXJzLgorICAgIEtWTV9ERVZfQVJNX1ZHSUNfR1JQX1JFRElTVF9SRUdTIGFjY2Vzc2VzIHRoZSByZWRpc3RyaWJ1dG9yIG9mIHRoZSBDUFUKKyAgICBzcGVjaWZpZWQgYnkgdGhlIG1waWRyLgorCisgICAgVGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgIltSZV1EaXN0cmlidXRvciBiYXNlIGFkZHJlc3MiIGFzIGRlZmluZWQKKyAgICBpbiB0aGUgR0lDdjMvNCBzcGVjcy4gIEdldHRpbmcgb3Igc2V0dGluZyBzdWNoIGEgcmVnaXN0ZXIgaGFzIHRoZSBzYW1lCisgICAgZWZmZWN0IGFzIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXIgb24gcmVhbCBoYXJkd2FyZSwgZXhjZXB0IGZvciB0aGUKKyAgICBmb2xsb3dpbmcgcmVnaXN0ZXJzOiBHSUNEX1NUQVRVU1IsIEdJQ1JfU1RBVFVTUiwgR0lDRF9JU1BFTkRSLAorICAgIEdJQ1JfSVNQRU5EUjAsIEdJQ0RfSUNQRU5EUiwgYW5kIEdJQ1JfSUNQRU5EUjAuICBUaGVzZSByZWdpc3RlcnMgYmVoYXZlCisgICAgZGlmZmVyZW50bHkgd2hlbiBhY2Nlc3NlZCB2aWEgdGhpcyBpbnRlcmZhY2UgY29tcGFyZWQgdG8gdGhlaXIKKyAgICBhcmNoaXRlY3R1cmFsbHkgZGVmaW5lZCBiZWhhdmlvciB0byBhbGxvdyBzb2Z0d2FyZSBhIGZ1bGwgdmlldyBvZiB0aGUKKyAgICBWR0lDJ3MgaW50ZXJuYWwgc3RhdGUuCisKKyAgICBUaGUgbXBpZHIgZmllbGQgaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoCisgICAgcmVkaXN0cmlidXRvciBpcyBhY2Nlc3NlZC4gIFRoZSBtcGlkciBpcyBpZ25vcmVkIGZvciB0aGUgZGlzdHJpYnV0b3IuCisKKyAgICBUaGUgbXBpZHIgZW5jb2RpbmcgaXMgYmFzZWQgb24gdGhlIGFmZmluaXR5IGluZm9ybWF0aW9uIGluIHRoZQorICAgIGFyY2hpdGVjdHVyZSBkZWZpbmVkIE1QSURSLCBhbmQgdGhlIGZpZWxkIGlzIGVuY29kZWQgYXMgZm9sbG93czoKKyAgICAgIHwgNjMgLi4uLiA1NiB8IDU1IC4uLi4gNDggfCA0NyAuLi4uIDQwIHwgMzkgLi4uLiAzMiB8CisgICAgICB8ICAgIEFmZjMgICAgfCAgICBBZmYyICAgIHwgICAgQWZmMSAgICB8ICAgIEFmZjAgICAgfAorCisgICAgTm90ZSB0aGF0IGRpc3RyaWJ1dG9yIGZpZWxkcyBhcmUgbm90IGJhbmtlZCwgYnV0IHJldHVybiB0aGUgc2FtZSB2YWx1ZQorICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIG1waWRyIHVzZWQgdG8gYWNjZXNzIHRoZSByZWdpc3Rlci4KKworICAgIFRoZSBHSUNEX1NUQVRVU1IgYW5kIEdJQ1JfU1RBVFVTUiByZWdpc3RlcnMgYXJlIGFyY2hpdGVjdHVyYWxseSBkZWZpbmVkIHN1Y2gKKyAgICB0aGF0IGEgd3JpdGUgb2YgYSBjbGVhciBiaXQgaGFzIG5vIGVmZmVjdCwgd2hlcmVhcyBhIHdyaXRlIHdpdGggYSBzZXQgYml0CisgICAgY2xlYXJzIHRoYXQgdmFsdWUuICBUbyBhbGxvdyB1c2Vyc3BhY2UgdG8gZnJlZWx5IHNldCB0aGUgdmFsdWVzIG9mIHRoZXNlIHR3bworICAgIHJlZ2lzdGVycywgc2V0dGluZyB0aGUgYXR0cmlidXRlcyB3aXRoIHRoZSByZWdpc3RlciBvZmZzZXRzIGZvciB0aGVzZSB0d28KKyAgICByZWdpc3RlcnMgc2ltcGx5IHNldHMgdGhlIG5vbi1yZXNlcnZlZCBiaXRzIHRvIHRoZSB2YWx1ZSB3cml0dGVuLgorCisKKyAgICBBY2Nlc3NlcyAocmVhZHMgYW5kIHdyaXRlcykgdG8gdGhlIEdJQ0RfSVNQRU5EUiByZWdpc3RlciByZWdpb24gYW5kCisgICAgR0lDUl9JU1BFTkRSMCByZWdpc3RlcnMgZ2V0L3NldCB0aGUgdmFsdWUgb2YgdGhlIGxhdGNoZWQgcGVuZGluZyBzdGF0ZSBmb3IKKyAgICB0aGUgaW50ZXJydXB0cy4KKworICAgIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBhIGd1ZXN0IHJlYWQgZnJvbSBJU1BFTkRSIGZvciBhbgorICAgIGVkZ2UgdHJpZ2dlcmVkIGludGVycnVwdCwgYnV0IG1heSBkaWZmZXIgZm9yIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzLgorICAgIEZvciBlZGdlIHRyaWdnZXJlZCBpbnRlcnJ1cHRzLCBvbmNlIGFuIGludGVycnVwdCBiZWNvbWVzIHBlbmRpbmcgKHdoZXRoZXIKKyAgICBiZWNhdXNlIG9mIGFuIGVkZ2UgZGV0ZWN0ZWQgb24gdGhlIGlucHV0IGxpbmUgb3IgYmVjYXVzZSBvZiBhIGd1ZXN0IHdyaXRlCisgICAgdG8gSVNQRU5EUikgdGhpcyBzdGF0ZSBpcyAibGF0Y2hlZCIsIGFuZCBvbmx5IGNsZWFyZWQgd2hlbiBlaXRoZXIgdGhlCisgICAgaW50ZXJydXB0IGlzIGFjdGl2YXRlZCBvciB3aGVuIHRoZSBndWVzdCB3cml0ZXMgdG8gSUNQRU5EUi4gQSBsZXZlbAorICAgIHRyaWdnZXJlZCBpbnRlcnJ1cHQgbWF5IGJlIHBlbmRpbmcgZWl0aGVyIGJlY2F1c2UgdGhlIGxldmVsIGlucHV0IGlzIGhlbGQKKyAgICBoaWdoIGJ5IGEgZGV2aWNlLCBvciBiZWNhdXNlIG9mIGEgZ3Vlc3Qgd3JpdGUgdG8gdGhlIElTUEVORFIgcmVnaXN0ZXIuIE9ubHkKKyAgICBJU1BFTkRSIHdyaXRlcyBhcmUgbGF0Y2hlZDsgaWYgdGhlIGRldmljZSBsb3dlcnMgdGhlIGxpbmUgbGV2ZWwgdGhlbiB0aGUKKyAgICBpbnRlcnJ1cHQgaXMgbm8gbG9uZ2VyIHBlbmRpbmcgdW5sZXNzIHRoZSBndWVzdCBhbHNvIHdyb3RlIHRvIElTUEVORFIsIGFuZAorICAgIGNvbnZlcnNlbHkgd3JpdGVzIHRvIElDUEVORFIgb3IgYWN0aXZhdGlvbnMgb2YgdGhlIGludGVycnVwdCBkbyBub3QgY2xlYXIKKyAgICB0aGUgcGVuZGluZyBzdGF0dXMgaWYgdGhlIGxpbmUgbGV2ZWwgaXMgc3RpbGwgYmVpbmcgaGVsZCBoaWdoLiAgKFRoZXNlCisgICAgcnVsZXMgYXJlIGRvY3VtZW50ZWQgaW4gdGhlIEdJQ3YzIHNwZWNpZmljYXRpb24gZGVzY3JpcHRpb25zIG9mIHRoZSBJQ1BFTkRSCisgICAgYW5kIElTUEVORFIgcmVnaXN0ZXJzLikgRm9yIGEgbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdCB0aGUgdmFsdWUgYWNjZXNzZWQKKyAgICBoZXJlIGlzIHRoYXQgb2YgdGhlIGxhdGNoIHdoaWNoIGlzIHNldCBieSBJU1BFTkRSIGFuZCBjbGVhcmVkIGJ5IElDUEVORFIgb3IKKyAgICBpbnRlcnJ1cHQgYWN0aXZhdGlvbiwgd2hlcmVhcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgYSBndWVzdCByZWFkIGZyb20KKyAgICBJU1BFTkRSIGlzIHRoZSBsb2dpY2FsIE9SIG9mIHRoZSBsYXRjaCB2YWx1ZSBhbmQgdGhlIGlucHV0IGxpbmUgbGV2ZWwuCisKKyAgICBSYXcgYWNjZXNzIHRvIHRoZSBsYXRjaCBzdGF0ZSBpcyBwcm92aWRlZCB0byB1c2Vyc3BhY2Ugc28gdGhhdCBpdCBjYW4gc2F2ZQorICAgIGFuZCByZXN0b3JlIHRoZSBlbnRpcmUgR0lDIGludGVybmFsIHN0YXRlICh3aGljaCBpcyBkZWZpbmVkIGJ5IHRoZQorICAgIGNvbWJpbmF0aW9uIG9mIHRoZSBjdXJyZW50IGlucHV0IGxpbmUgbGV2ZWwgYW5kIHRoZSBsYXRjaCBzdGF0ZSwgYW5kIGNhbm5vdAorICAgIGJlIGRlZHVjZWQgZnJvbSBwdXJlbHkgdGhlIGxpbmUgbGV2ZWwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgSVNQRU5EUgorICAgIHJlZ2lzdGVycykuCisKKyAgICBBY2Nlc3NlcyB0byBHSUNEX0lDUEVORFIgcmVnaXN0ZXIgcmVnaW9uIGFuZCBHSUNSX0lDUEVORFIwIHJlZ2lzdGVycyBoYXZlCisgICAgUkFaL1dJIHNlbWFudGljcywgbWVhbmluZyB0aGF0IHJlYWRzIGFsd2F5cyByZXR1cm4gMCBhbmQgd3JpdGVzIGFyZSBhbHdheXMKKyAgICBpZ25vcmVkLgorCisgIEVycm9yczoKKyAgICAtRU5YSU86IEdldHRpbmcgb3Igc2V0dGluZyB0aGlzIHJlZ2lzdGVyIGlzIG5vdCB5ZXQgc3VwcG9ydGVkCisgICAgLUVCVVNZOiBPbmUgb3IgbW9yZSBWQ1BVcyBhcmUgcnVubmluZworCisKKyAgS1ZNX0RFVl9BUk1fVkdJQ19DUFVfU1lTUkVHUworICBBdHRyaWJ1dGVzOgorICAgIFRoZSBhdHRyIGZpZWxkIG9mIGt2bV9kZXZpY2VfYXR0ciBlbmNvZGVzIHR3byB2YWx1ZXM6CisgICAgYml0czogICAgIHwgNjMgICAgICAuLi4uICAgICAgIDMyIHwgMzEgIC4uLi4gIDE2IHwgMTUgIC4uLi4gIDAgfAorICAgIHZhbHVlczogICB8ICAgICAgICAgbXBpZHIgICAgICAgICB8ICAgICAgUkVTICAgICB8ICAgIGluc3RyICAgIHwKKworICAgIFRoZSBtcGlkciBmaWVsZCBlbmNvZGVzIHRoZSBDUFUgSUQgYmFzZWQgb24gdGhlIGFmZmluaXR5IGluZm9ybWF0aW9uIGluIHRoZQorICAgIGFyY2hpdGVjdHVyZSBkZWZpbmVkIE1QSURSLCBhbmQgdGhlIGZpZWxkIGlzIGVuY29kZWQgYXMgZm9sbG93czoKKyAgICAgIHwgNjMgLi4uLiA1NiB8IDU1IC4uLi4gNDggfCA0NyAuLi4uIDQwIHwgMzkgLi4uLiAzMiB8CisgICAgICB8ICAgIEFmZjMgICAgfCAgICBBZmYyICAgIHwgICAgQWZmMSAgICB8ICAgIEFmZjAgICAgfAorCisgICAgVGhlIGluc3RyIGZpZWxkIGVuY29kZXMgdGhlIHN5c3RlbSByZWdpc3RlciB0byBhY2Nlc3MgYmFzZWQgb24gdGhlIGZpZWxkcworICAgIGRlZmluZWQgaW4gdGhlIEE2NCBpbnN0cnVjdGlvbiBzZXQgZW5jb2RpbmcgZm9yIHN5c3RlbSByZWdpc3RlciBhY2Nlc3MKKyAgICAoUkVTIG1lYW5zIHRoZSBiaXRzIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgc2hvdWxkIGJlIHplcm8pOgorCisgICAgICB8IDE1IC4uLiAxNCB8IDEzIC4uLiAxMSB8IDEwIC4uLiA3IHwgNiAuLi4gMyB8IDIgLi4uIDAgfAorICAgICAgfCAgIE9wIDAgICAgfCAgICBPcDEgICAgfCAgICBDUm4gICB8ICAgQ1JtICAgfCAgIE9wMiAgIHwKKworICAgIEFsbCBzeXN0ZW0gcmVncyBhY2Nlc3NlZCB0aHJvdWdoIHRoaXMgQVBJIGFyZSAocncsIDY0LWJpdCkgYW5kCisgICAga3ZtX2RldmljZV9hdHRyLmFkZHIgcG9pbnRzIHRvIGEgX191NjQgdmFsdWUuCisKKyAgICBLVk1fREVWX0FSTV9WR0lDX0NQVV9TWVNSRUdTIGFjY2Vzc2VzIHRoZSBDUFUgaW50ZXJmYWNlIHJlZ2lzdGVycyBmb3IgdGhlCisgICAgQ1BVIHNwZWNpZmllZCBieSB0aGUgbXBpZHIgZmllbGQuCisKKyAgRXJyb3JzOgorICAgIC1FTlhJTzogR2V0dGluZyBvciBzZXR0aW5nIHRoaXMgcmVnaXN0ZXIgaXMgbm90IHlldCBzdXBwb3J0ZWQKKyAgICAtRUJVU1k6IFZDUFUgaXMgcnVubmluZworICAgIC1FSU5WQUw6IEludmFsaWQgbXBpZHIgc3VwcGxpZWQKKworCisgIEtWTV9ERVZfQVJNX1ZHSUNfR1JQX05SX0lSUVMKKyAgQXR0cmlidXRlczoKKyAgICBBIHZhbHVlIGRlc2NyaWJpbmcgdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzIChTR0ksIFBQSSBhbmQgU1BJKSBmb3IKKyAgICB0aGlzIEdJQyBpbnN0YW5jZSwgcmFuZ2luZyBmcm9tIDY0IHRvIDEwMjQsIGluIGluY3JlbWVudHMgb2YgMzIuCisKKyAgICBrdm1fZGV2aWNlX2F0dHIuYWRkciBwb2ludHMgdG8gYSBfX3UzMiB2YWx1ZS4KKworICBFcnJvcnM6CisgICAgLUVJTlZBTDogVmFsdWUgc2V0IGlzIG91dCBvZiB0aGUgZXhwZWN0ZWQgcmFuZ2UKKyAgICAtRUJVU1k6IFZhbHVlIGhhcyBhbHJlYWR5IGJlIHNldC4KKworCisgIEtWTV9ERVZfQVJNX1ZHSUNfR1JQX0NUUkwKKyAgQXR0cmlidXRlczoKKyAgICBLVk1fREVWX0FSTV9WR0lDX0NUUkxfSU5JVAorICAgICAgcmVxdWVzdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIFZHSUMsIG5vIGFkZGl0aW9uYWwgcGFyYW1ldGVyIGluCisgICAgICBrdm1fZGV2aWNlX2F0dHIuYWRkci4KKyAgRXJyb3JzOgorICAgIC1FTlhJTzogVkdJQyBub3QgcHJvcGVybHkgY29uZmlndXJlZCBhcyByZXF1aXJlZCBwcmlvciB0byBjYWxsaW5nCisgICAgIHRoaXMgYXR0cmlidXRlCisgICAgLUVOT0RFVjogbm8gb25saW5lIFZDUFUKKyAgICAtRU5PTUVNOiBtZW1vcnkgc2hvcnRhZ2Ugd2hlbiBhbGxvY2F0aW5nIHZnaWMgaW50ZXJuYWwgZGF0YQorCisKKyAgS1ZNX0RFVl9BUk1fVkdJQ19HUlBfTEVWRUxfSU5GTworICBBdHRyaWJ1dGVzOgorICAgIFRoZSBhdHRyIGZpZWxkIG9mIGt2bV9kZXZpY2VfYXR0ciBlbmNvZGVzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgIGJpdHM6ICAgICB8IDYzICAgICAgLi4uLiAgICAgICAzMiB8IDMxICAgLi4uLiAgICAxMCB8IDkgIC4uLi4gIDAgfAorICAgIHZhbHVlczogICB8ICAgICAgICAgbXBpZHIgICAgICAgICB8ICAgICAgaW5mbyAgICAgICB8ICAgdklOVElEICAgfAorCisgICAgVGhlIHZJTlRJRCBzcGVjaWZpZXMgd2hpY2ggc2V0IG9mIElSUXMgaXMgcmVwb3J0ZWQgb24uCisKKyAgICBUaGUgaW5mbyBmaWVsZCBzcGVjaWZpZXMgd2hpY2ggaW5mb3JtYXRpb24gdXNlcnNwYWNlIHdhbnRzIHRvIGdldCBvciBzZXQKKyAgICB1c2luZyB0aGlzIGludGVyZmFjZS4gIEN1cnJlbnRseSB3ZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgaW5mbyB2YWx1ZXM6CisKKyAgICAgIFZHSUNfTEVWRUxfSU5GT19MSU5FX0xFVkVMOgorCUdldC9TZXQgdGhlIGlucHV0IGxldmVsIG9mIHRoZSBJUlEgbGluZSBmb3IgYSBzZXQgb2YgMzIgY29udGlndW91c2x5CisJbnVtYmVyZWQgaW50ZXJydXB0cy4KKwl2SU5USUQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLgorCisJa3ZtX2RldmljZV9hdHRyLmFkZHIgcG9pbnRzIHRvIGEgX191MzIgdmFsdWUgd2hpY2ggd2lsbCBjb250YWluIGEKKwliaXRtYXAgd2hlcmUgYSBzZXQgYml0IG1lYW5zIHRoZSBpbnRlcnJ1cHQgbGV2ZWwgaXMgYXNzZXJ0ZWQuCisKKwlCaXRbbl0gaW5kaWNhdGVzIHRoZSBzdGF0dXMgZm9yIGludGVycnVwdCB2SU5USUQgKyBuLgorCisgICAgU0dJcyBhbmQgYW55IGludGVycnVwdCB3aXRoIGEgaGlnaGVyIElEIHRoYW4gdGhlIG51bWJlciBvZiBpbnRlcnJ1cHRzCisgICAgc3VwcG9ydGVkLCB3aWxsIGJlIFJBWi9XSS4gIExQSXMgYXJlIGFsd2F5cyBlZGdlLXRyaWdnZXJlZCBhbmQgYXJlCisgICAgdGhlcmVmb3JlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbnRlcmZhY2UuCisKKyAgICBQUElzIGFyZSByZXBvcnRlZCBwZXIgVkNQVSBhcyBzcGVjaWZpZWQgaW4gdGhlIG1waWRyIGZpZWxkLCBhbmQgU1BJcyBhcmUKKyAgICByZXBvcnRlZCB3aXRoIHRoZSBzYW1lIHZhbHVlIHJlZ2FyZGxlc3Mgb2YgdGhlIG1waWRyIHNwZWNpZmllZC4KKworICAgIFRoZSBtcGlkciBmaWVsZCBlbmNvZGVzIHRoZSBDUFUgSUQgYmFzZWQgb24gdGhlIGFmZmluaXR5IGluZm9ybWF0aW9uIGluIHRoZQorICAgIGFyY2hpdGVjdHVyZSBkZWZpbmVkIE1QSURSLCBhbmQgdGhlIGZpZWxkIGlzIGVuY29kZWQgYXMgZm9sbG93czoKKyAgICAgIHwgNjMgLi4uLiA1NiB8IDU1IC4uLi4gNDggfCA0NyAuLi4uIDQwIHwgMzkgLi4uLiAzMiB8CisgICAgICB8ICAgIEFmZjMgICAgfCAgICBBZmYyICAgIHwgICAgQWZmMSAgICB8ICAgIEFmZjAgICAgfApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL2FybS12Z2ljLnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vZGV2aWNlcy9hcm0tdmdpYy50eHQKaW5kZXggODkxODJmOC4uNzZlNjFjOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL2FybS12Z2ljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2RldmljZXMvYXJtLXZnaWMudHh0CkBAIC0xLDI0ICsxLDE5IEBACi1BUk0gVmlydHVhbCBHZW5lcmljIEludGVycnVwdCBDb250cm9sbGVyIChWR0lDKQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0FSTSBWaXJ0dWFsIEdlbmVyaWMgSW50ZXJydXB0IENvbnRyb2xsZXIgdjIgKFZHSUMpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBEZXZpY2UgdHlwZXMgc3VwcG9ydGVkOgogICBLVk1fREVWX1RZUEVfQVJNX1ZHSUNfVjIgICAgIEFSTSBHZW5lcmljIEludGVycnVwdCBDb250cm9sbGVyIHYyLjAKLSAgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YzICAgICBBUk0gR2VuZXJpYyBJbnRlcnJ1cHQgQ29udHJvbGxlciB2My4wCi0gIEtWTV9ERVZfVFlQRV9BUk1fVkdJQ19JVFMgICAgQVJNIEludGVycnVwdCBUcmFuc2xhdGlvbiBTZXJ2aWNlIENvbnRyb2xsZXIKIAotT25seSBvbmUgVkdJQyBpbnN0YW5jZSBvZiB0aGUgVjIvVjMgdHlwZXMgYWJvdmUgbWF5IGJlIGluc3RhbnRpYXRlZCB0aHJvdWdoCi1laXRoZXIgdGhpcyBBUEkgb3IgdGhlIGxlZ2FjeSBLVk1fQ1JFQVRFX0lSUUNISVAgYXBpLiAgVGhlIGNyZWF0ZWQgVkdJQyB3aWxsCi1hY3QgYXMgdGhlIFZNIGludGVycnVwdCBjb250cm9sbGVyLCByZXF1aXJpbmcgZW11bGF0ZWQgdXNlci1zcGFjZSBkZXZpY2VzIHRvCi1pbmplY3QgaW50ZXJydXB0cyB0byB0aGUgVkdJQyBpbnN0ZWFkIG9mIGRpcmVjdGx5IHRvIENQVXMuCitPbmx5IG9uZSBWR0lDIGluc3RhbmNlIG1heSBiZSBpbnN0YW50aWF0ZWQgdGhyb3VnaCBlaXRoZXIgdGhpcyBBUEkgb3IgdGhlCitsZWdhY3kgS1ZNX0NSRUFURV9JUlFDSElQIEFQSS4gIFRoZSBjcmVhdGVkIFZHSUMgd2lsbCBhY3QgYXMgdGhlIFZNIGludGVycnVwdAorY29udHJvbGxlciwgcmVxdWlyaW5nIGVtdWxhdGVkIHVzZXItc3BhY2UgZGV2aWNlcyB0byBpbmplY3QgaW50ZXJydXB0cyB0byB0aGUKK1ZHSUMgaW5zdGVhZCBvZiBkaXJlY3RseSB0byBDUFVzLgogCi1DcmVhdGluZyBhIGd1ZXN0IEdJQ3YzIGRldmljZSByZXF1aXJlcyBhIGhvc3QgR0lDdjMgYXMgd2VsbC4KLUdJQ3YzIGltcGxlbWVudGF0aW9ucyB3aXRoIGhhcmR3YXJlIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBhbGxvdyBhIGd1ZXN0IEdJQ3YyCi1hcyB3ZWxsLgorR0lDdjMgaW1wbGVtZW50YXRpb25zIHdpdGggaGFyZHdhcmUgY29tcGF0aWJpbGl0eSBzdXBwb3J0IGFsbG93IGNyZWF0aW5nIGEKK2d1ZXN0IEdJQ3YyIHRocm91Z2ggdGhpcyBpbnRlcmZhY2UuICBGb3IgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgYSBndWVzdCBHSUN2MworZGV2aWNlIGFuZCBndWVzdCBJVFMgZGV2aWNlcywgc2VlIGFybS12Z2ljLXYzLnR4dC4gIEl0IGlzIG5vdCBwb3NzaWJsZSB0bworY3JlYXRlIGJvdGggYSBHSUN2MyBhbmQgR0lDdjIgZGV2aWNlIG9uIHRoZSBzYW1lIFZNLgogCi1DcmVhdGluZyBhIHZpcnR1YWwgSVRTIGNvbnRyb2xsZXIgcmVxdWlyZXMgYSBob3N0IEdJQ3YzIChidXQgZG9lcyBub3QgZGVwZW5kCi1vbiBoYXZpbmcgcGh5c2ljYWwgSVRTIGNvbnRyb2xsZXJzKS4KLVRoZXJlIGNhbiBiZSBtdWx0aXBsZSBJVFMgY29udHJvbGxlcnMgcGVyIGd1ZXN0LCBlYWNoIG9mIHRoZW0gaGFzIHRvIGhhdmUKLWEgc2VwYXJhdGUsIG5vbi1vdmVybGFwcGluZyBNTUlPIHJlZ2lvbi4KIAogR3JvdXBzOgogICBLVk1fREVWX0FSTV9WR0lDX0dSUF9BRERSCkBAIC0zMiwyNiArMjcsMTMgQEAKICAgICAgIEJhc2UgYWRkcmVzcyBpbiB0aGUgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBvZiB0aGUgR0lDIHZpcnR1YWwgY3B1CiAgICAgICBpbnRlcmZhY2UgcmVnaXN0ZXIgbWFwcGluZ3MuIE9ubHkgdmFsaWQgZm9yIEtWTV9ERVZfVFlQRV9BUk1fVkdJQ19WMi4KICAgICAgIFRoaXMgYWRkcmVzcyBuZWVkcyB0byBiZSA0SyBhbGlnbmVkIGFuZCB0aGUgcmVnaW9uIGNvdmVycyA0IEtCeXRlLgotCi0gICAgS1ZNX1ZHSUNfVjNfQUREUl9UWVBFX0RJU1QgKHJ3LCA2NC1iaXQpCi0gICAgICBCYXNlIGFkZHJlc3MgaW4gdGhlIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIEdJQ3YzIGRpc3RyaWJ1dG9yCi0gICAgICByZWdpc3RlciBtYXBwaW5ncy4gT25seSB2YWxpZCBmb3IgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YzLgotICAgICAgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIDY0SyBhbGlnbmVkIGFuZCB0aGUgcmVnaW9uIGNvdmVycyA2NCBLQnl0ZS4KLQotICAgIEtWTV9WR0lDX1YzX0FERFJfVFlQRV9SRURJU1QgKHJ3LCA2NC1iaXQpCi0gICAgICBCYXNlIGFkZHJlc3MgaW4gdGhlIGd1ZXN0IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIEdJQ3YzCi0gICAgICByZWRpc3RyaWJ1dG9yIHJlZ2lzdGVyIG1hcHBpbmdzLiBUaGVyZSBhcmUgdHdvIDY0SyBwYWdlcyBmb3IgZWFjaAotICAgICAgVkNQVSBhbmQgYWxsIG9mIHRoZSByZWRpc3RyaWJ1dG9yIHBhZ2VzIGFyZSBjb250aWd1b3VzLgotICAgICAgT25seSB2YWxpZCBmb3IgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YzLgotICAgICAgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIDY0SyBhbGlnbmVkLgotCi0gICAgS1ZNX1ZHSUNfVjNfQUREUl9UWVBFX0lUUyAocncsIDY0LWJpdCkKLSAgICAgIEJhc2UgYWRkcmVzcyBpbiB0aGUgZ3Vlc3QgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSBvZiB0aGUgR0lDdjMgSVRTCi0gICAgICBjb250cm9sIHJlZ2lzdGVyIGZyYW1lLiBUaGUgSVRTIGFsbG93cyBNU0koLVgpIGludGVycnVwdHMgdG8gYmUKLSAgICAgIGluamVjdGVkIGludG8gZ3Vlc3RzLiBUaGlzIGV4dGVuc2lvbiBpcyBvcHRpb25hbC4gSWYgdGhlIGtlcm5lbAotICAgICAgZG9lcyBub3Qgc3VwcG9ydCB0aGUgSVRTLCB0aGUgY2FsbCByZXR1cm5zIC1FTk9ERVYuCi0gICAgICBPbmx5IHZhbGlkIGZvciBLVk1fREVWX1RZUEVfQVJNX1ZHSUNfSVRTLgotICAgICAgVGhpcyBhZGRyZXNzIG5lZWRzIHRvIGJlIDY0SyBhbGlnbmVkIGFuZCB0aGUgcmVnaW9uIGNvdmVycyAxMjhLLgorICBFcnJvcnM6CisgICAgLUUyQklHOiAgQWRkcmVzcyBvdXRzaWRlIG9mIGFkZHJlc3NhYmxlIElQQSByYW5nZQorICAgIC1FSU5WQUw6IEluY29ycmVjdGx5IGFsaWduZWQgYWRkcmVzcworICAgIC1FRVhJU1Q6IEFkZHJlc3MgYWxyZWFkeSBjb25maWd1cmVkCisgICAgLUVOWElPOiAgVGhlIGdyb3VwIG9yIGF0dHJpYnV0ZSBpcyB1bmtub3duL3Vuc3VwcG9ydGVkIGZvciB0aGlzIGRldmljZQorICAgICAgICAgICAgIG9yIGhhcmR3YXJlIHN1cHBvcnQgaXMgbWlzc2luZy4KKyAgICAtRUZBVUxUOiBJbnZhbGlkIHVzZXIgcG9pbnRlciBmb3IgYXR0ci0+YWRkci4KIAogICBLVk1fREVWX0FSTV9WR0lDX0dSUF9ESVNUX1JFR1MKICAgQXR0cmlidXRlczoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vZGV2aWNlcy92Y3B1LnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vZGV2aWNlcy92Y3B1LnR4dAppbmRleCBjMDQxNjU4Li4wMmY1MDY4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2RldmljZXMvdmNwdS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL3ZjcHUudHh0CkBAIC0zMCw0ICszMCw2IEBACiAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZQogICAgICAgICAgLUVCVVNZOiBQTVV2MyBhbHJlYWR5IGluaXRpYWxpemVkCiAKLVJlcXVlc3QgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBQTVV2My4KK1JlcXVlc3QgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBQTVV2My4gIFRoaXMgbXVzdCBiZSBkb25lIGFmdGVyIGNyZWF0aW5nIHRoZQoraW4ta2VybmVsIGlycWNoaXAuICBDcmVhdGluZyBhIFBNVSB3aXRoIGEgdXNlcnNwYWNlIGlycWNoaXAgaXMgY3VycmVudGx5IG5vdAorc3VwcG9ydGVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bWVfYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vdm1lX2FwaS50eHQKaW5kZXggY2E1YjgyNy4uOTAwMDY1NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92bWVfYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZtZV9hcGkudHh0CkBAIC04LDEzICs4LDE0IEBACiB3aXRoIHRoZSBWTUUgc3Vic3lzdGVtLCB0eXBpY2FsbHkgY2FsbGVkIGZyb20gdGhlIGRldmljZXMgaW5pdCByb3V0aW5lLiAgVGhpcyBpcwogYWNoaWV2ZWQgdmlhIGEgY2FsbCB0byB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uOgogCi0JaW50IHZtZV9yZWdpc3Rlcl9kcml2ZXIgKHN0cnVjdCB2bWVfZHJpdmVyICpkcml2ZXIpOworCWludCB2bWVfcmVnaXN0ZXJfZHJpdmVyIChzdHJ1Y3Qgdm1lX2RyaXZlciAqZHJpdmVyLCB1bnNpZ25lZCBpbnQgbmRldnMpOwogCiBJZiBkcml2ZXIgcmVnaXN0cmF0aW9uIGlzIHN1Y2Nlc3NmdWwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8sIGlmIGFuIGVycm9yCiBvY2N1cnJlZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgd2lsbCBiZSByZXR1cm5lZC4KIAogQSBwb2ludGVyIHRvIGEgc3RydWN0dXJlIG9mIHR5cGUgJ3ZtZV9kcml2ZXInIG11c3QgYmUgcHJvdmlkZWQgdG8gdGhlCi1yZWdpc3RyYXRpb24gZnVuY3Rpb24uIFRoZSBzdHJ1Y3R1cmUgaXMgYXMgZm9sbG93czoKK3JlZ2lzdHJhdGlvbiBmdW5jdGlvbi4gQWxvbmcgd2l0aCBuZGV2cywgd2hpY2ggaXMgdGhlIG51bWJlciBvZiBkZXZpY2VzIHlvdXIKK2RyaXZlciBpcyBhYmxlIHRvIHN1cHBvcnQuIFRoZSBzdHJ1Y3R1cmUgaXMgYXMgZm9sbG93czoKIAogCXN0cnVjdCB2bWVfZHJpdmVyIHsKIAkJc3RydWN0IGxpc3RfaGVhZCBub2RlOwpAQCAtMzIsOCArMzMsOCBAQAogc2hvdWxkIGJlIGNvcnJlY3RseSBzZXQuIFRoZSAnLm5hbWUnIGVsZW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGhvbGRpbmcKIHRoZSBkZXZpY2UgZHJpdmVyJ3MgbmFtZS4KIAotVGhlICcubWF0Y2gnIGZ1bmN0aW9uIGFsbG93cyBjb250cm9sbGluZyB0aGUgbnVtYmVyIG9mIGRldmljZXMgdGhhdCBuZWVkIHRvCi1iZSByZWdpc3RlcmVkLiBUaGUgbWF0Y2ggZnVuY3Rpb24gc2hvdWxkIHJldHVybiAxIGlmIGEgZGV2aWNlIHNob3VsZCBiZQorVGhlICcubWF0Y2gnIGZ1bmN0aW9uIGFsbG93cyBjb250cm9sIG92ZXIgd2hpY2ggVk1FIGRldmljZXMgc2hvdWxkIGJlIHJlZ2lzdGVyZWQKK3dpdGggdGhlIGRyaXZlci4gVGhlIG1hdGNoIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gMSBpZiBhIGRldmljZSBzaG91bGQgYmUKIHByb2JlZCBhbmQgMCBvdGhlcndpc2UuIFRoaXMgZXhhbXBsZSBtYXRjaCBmdW5jdGlvbiAoZnJvbSB2bWVfdXNlci5jKSBsaW1pdHMKIHRoZSBudW1iZXIgb2YgZGV2aWNlcyBwcm9iZWQgdG8gb25lOgogCkBAIC0zODUsMTMgKzM4NiwxMyBAQAogYWRqYWNlbnQgbG9jYXRpb25zOgogCiAJaW50IHZtZV9sbV9hdHRhY2goc3RydWN0IHZtZV9yZXNvdXJjZSAqcmVzLCBpbnQgbnVtLAotCQl2b2lkICgqY2FsbGJhY2spKGludCkpOworCQl2b2lkICgqY2FsbGJhY2spKHZvaWQgKikpOwogCiAJaW50IHZtZV9sbV9kZXRhY2goc3RydWN0IHZtZV9yZXNvdXJjZSAqcmVzLCBpbnQgbnVtKTsKIAogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFzIGZvbGxvd3MuCiAKLQl2b2lkIGNhbGxiYWNrKGludCBudW0pOworCXZvaWQgY2FsbGJhY2sodm9pZCAqZGF0YSk7CiAKIAogU2xvdCBEZXRlY3Rpb24KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24veDg2L3g4Nl82NC9tbS50eHQgYi9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvbW0udHh0CmluZGV4IDhjN2RkNTk1Li41NzI0MDkyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvbW0udHh0CisrKyBiL0RvY3VtZW50YXRpb24veDg2L3g4Nl82NC9tbS50eHQKQEAgLTEyLDEzICsxMiwxMyBAQAogZmZmZmU5MDAwMDAwMDAwMCAtIGZmZmZlOWZmZmZmZmZmZmYgKD00MCBiaXRzKSBob2xlCiBmZmZmZWEwMDAwMDAwMDAwIC0gZmZmZmVhZmZmZmZmZmZmZiAoPTQwIGJpdHMpIHZpcnR1YWwgbWVtb3J5IG1hcCAoMVRCKQogLi4uIHVudXNlZCBob2xlIC4uLgotZmZmZmVjMDAwMDAwMDAwMCAtIGZmZmZmYzAwMDAwMDAwMDAgKD00NCBiaXRzKSBrYXNhbiBzaGFkb3cgbWVtb3J5ICgxNlRCKQorZmZmZmVjMDAwMDAwMDAwMCAtIGZmZmZmYmZmZmZmZmZmZmYgKD00NCBiaXRzKSBrYXNhbiBzaGFkb3cgbWVtb3J5ICgxNlRCKQogLi4uIHVudXNlZCBob2xlIC4uLgogZmZmZmZmMDAwMDAwMDAwMCAtIGZmZmZmZjdmZmZmZmZmZmYgKD0zOSBiaXRzKSAlZXNwIGZpeHVwIHN0YWNrcwogLi4uIHVudXNlZCBob2xlIC4uLgotZmZmZmZmZWYwMDAwMDAwMCAtIGZmZmZmZmZmMDAwMDAwMDAgKD02NCBHQikgRUZJIHJlZ2lvbiBtYXBwaW5nIHNwYWNlCitmZmZmZmZlZjAwMDAwMDAwIC0gZmZmZmZmZmVmZmZmZmZmZiAoPTY0IEdCKSBFRkkgcmVnaW9uIG1hcHBpbmcgc3BhY2UKIC4uLiB1bnVzZWQgaG9sZSAuLi4KLWZmZmZmZmZmODAwMDAwMDAgLSBmZmZmZmZmZmEwMDAwMDAwICg9NTEyIE1CKSAga2VybmVsIHRleHQgbWFwcGluZywgZnJvbSBwaHlzIDAKK2ZmZmZmZmZmODAwMDAwMDAgLSBmZmZmZmZmZjlmZmZmZmZmICg9NTEyIE1CKSAga2VybmVsIHRleHQgbWFwcGluZywgZnJvbSBwaHlzIDAKIGZmZmZmZmZmYTAwMDAwMDAgLSBmZmZmZmZmZmZmNWZmZmZmICg9MTUyNiBNQikgbW9kdWxlIG1hcHBpbmcgc3BhY2UKIGZmZmZmZmZmZmY2MDAwMDAgLSBmZmZmZmZmZmZmZGZmZmZmICg9OCBNQikgdnN5c2NhbGxzCiBmZmZmZmZmZmZmZTAwMDAwIC0gZmZmZmZmZmZmZmZmZmZmZiAoPTIgTUIpIHVudXNlZCBob2xlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3h0ZW5zYS9tbXUudHh0IGIvRG9jdW1lbnRhdGlvbi94dGVuc2EvbW11LnR4dAppbmRleCAwMzEyZmU2Li4yMjJhMmM2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3h0ZW5zYS9tbXUudHh0CisrKyBiL0RvY3VtZW50YXRpb24veHRlbnNhL21tdS50eHQKQEAgLTMsMTUgKzMsOCBAQAogVGhlIGNvZGUgaW4gdGhlIGluaXRpYWxpemVfbW11IG1hY3JvIHNldHMgdXAgTU1VdjMgbWVtb3J5IG1hcHBpbmcKIGlkZW50aWNhbGx5IHRvIE1NVXYyIGZpeGVkIG1lbW9yeSBtYXBwaW5nLiBEZXBlbmRpbmcgb24KIENPTkZJR19JTklUSUFMSVpFX1hURU5TQV9NTVVfSU5TSURFX1ZNTElOVVggc3ltYm9sIHRoaXMgY29kZSBpcwotbG9jYXRlZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBhZGRyZXNzIHJhbmdlczoKLQotICAgIDB4RjAwMDAwMDAuLjB4RkZGRkZGRkYgKHdpbGwga2VlcCBzYW1lIGFkZHJlc3MgaW4gTU1VIHYyIGxheW91dDsKLSAgICAJCQkgdHlwaWNhbGx5IFJPTSkKLSAgICAweDAwMDAwMDAwLi4weDA3RkZGRkZGIChzeXN0ZW0gUkFNOyB0aGlzIGNvZGUgaXMgYWN0dWFsbHkgbGlua2VkCi0gICAgCQkJIGF0IDB4RDAwMDAwMDAuLjB4RDdGRkZGRkYgW2NhY2hlZF0KLSAgICAJCQkgb3IgMHhEODAwMDAwMC4uMHhERkZGRkZGRiBbdW5jYWNoZWRdOwotICAgIAkJCSBpbiBhbnkgY2FzZSwgaW5pdGlhbGx5IHJ1bnMgZWxzZXdoZXJlCi0gICAgCQkJIHRoYW4gbGlua2VkLCBzbyBoYXZlIHRvIGJlIGNhcmVmdWwpCitsb2NhdGVkIGluIGFkZHJlc3NlcyBpdCB3YXMgbGlua2VkIGZvciAoc3ltYm9sIHVuZGVmaW5lZCksIG9yIG5vdAorKHN5bWJvbCBkZWZpbmVkKSwgc28gaXQgbmVlZHMgdG8gYmUgcG9zaXRpb24taW5kZXBlbmRlbnQuCiAKIFRoZSBjb2RlIGhhcyB0aGUgZm9sbG93aW5nIGFzc3VtcHRpb25zOgogICBUaGlzIGNvZGUgZnJhZ21lbnQgaXMgcnVuIG9ubHkgb24gYW4gTU1VIHYzLgpAQCAtMjgsMjQgKzIxLDI2IEBACiAgICAgUEEgPSBwaHlzaWNhbCBhZGRyZXNzICh0d28gdXBwZXIgbmliYmxlcyBvZiBpdCk7CiAgICAgcGMgPSBwaHlzaWNhbCByYW5nZSB0aGF0IGNvbnRhaW5zIHRoaXMgY29kZTsKIAotQWZ0ZXIgc3RlcCAyLCB3ZSBqdW1wIHRvIHZpcnR1YWwgYWRkcmVzcyBpbiAweDQwMDAwMDAwLi4weDVmZmZmZmZmCi10aGF0IGNvcnJlc3BvbmRzIHRvIG5leHQgaW5zdHJ1Y3Rpb24gdG8gZXhlY3V0ZSBpbiB0aGlzIGNvZGUuCi1BZnRlciBzdGVwIDQsIHdlIGp1bXAgdG8gaW50ZW5kZWQgKGxpbmtlZCkgYWRkcmVzcyBvZiB0aGlzIGNvZGUuCitBZnRlciBzdGVwIDIsIHdlIGp1bXAgdG8gdmlydHVhbCBhZGRyZXNzIGluIHRoZSByYW5nZSAweDQwMDAwMDAwLi4weDVmZmZmZmZmCitvciAweDAwMDAwMDAwLi4weDFmZmZmZmZmLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUga2VybmVsIHdhcyBsb2FkZWQgYmVsb3cKKzB4NDAwMDAwMDAgb3IgYWJvdmUuIFRoYXQgYWRkcmVzcyBjb3JyZXNwb25kcyB0byBuZXh0IGluc3RydWN0aW9uIHRvIGV4ZWN1dGUKK2luIHRoaXMgY29kZS4gQWZ0ZXIgc3RlcCA0LCB3ZSBqdW1wIHRvIGludGVuZGVkIChsaW5rZWQpIGFkZHJlc3Mgb2YgdGhpcyBjb2RlLgorVGhlIHNjaGVtZSBiZWxvdyBhc3N1bWVzIHRoYXQgdGhlIGtlcm5lbCBpcyBsb2FkZWQgYmVsb3cgMHg0MDAwMDAwMC4KIAotICAgIFN0ZXAgMCAgICAgU3RlcDEgICAgIFN0ZXAgMiAgICAgU3RlcDMgICAgIFN0ZXAgNCAgICAgU3RlcDUKLSA9PT09PT09PT09PT0gID09PT09ICA9PT09PT09PT09PT0gID09PT09ICA9PT09PT09PT09PT0gID09PT09Ci0gICBWQSAgICAgIFBBICAgICBQQSAgICBWQSAgICAgIFBBICAgICBQQSAgICBWQSAgICAgIFBBICAgICBQQQotIC0tLS0tLSAgICAtLSAgICAgLS0gIC0tLS0tLSAgICAtLSAgICAgLS0gIC0tLS0tLSAgICAtLSAgICAgLS0KLSBFMC4uRkYgLT4gRTAgIC0+IEUwICBFMC4uRkYgLT4gRTAgICAgICAgICBGMC4uRkYgLT4gRjAgIC0+IEYwCi0gQzAuLkRGIC0+IEMwICAtPiBDMCAgQzAuLkRGIC0+IEMwICAgICAgICAgRTAuLkVGIC0+IEYwICAtPiBGMAotIEEwLi5CRiAtPiBBMCAgLT4gQTAgIEEwLi5CRiAtPiBBMCAgICAgICAgIEQ4Li5ERiAtPiAwMCAgLT4gMDAKLSA4MC4uOUYgLT4gODAgIC0+IDgwICA4MC4uOUYgLT4gODAgICAgICAgICBEMC4uRDcgLT4gMDAgIC0+IDAwCi0gNjAuLjdGIC0+IDYwICAtPiA2MCAgNjAuLjdGIC0+IDYwCi0gNDAuLjVGIC0+IDQwICAgICAgICAgNDAuLjVGIC0+IHBjICAtPiBwYyAgNDAuLjVGIC0+IHBjCi0gMjAuLjNGIC0+IDIwICAtPiAyMCAgMjAuLjNGIC0+IDIwCi0gMDAuLjFGIC0+IDAwICAtPiAwMCAgMDAuLjFGIC0+IDAwCisgICAgICAgIFN0ZXAwICBTdGVwMSAgU3RlcDIgIFN0ZXAzICAgICAgICAgIFN0ZXA0ICBTdGVwNQorICAgICAgICA9PT09PSAgPT09PT0gID09PT09ICA9PT09PSAgICAgICAgICA9PT09PSAgPT09PT0KKyAgIFZBICAgICAgUEEgICAgIFBBICAgICBQQSAgICAgUEEgICAgIFZBICAgICAgUEEgICAgIFBBCisgLS0tLS0tICAgIC0tICAgICAtLSAgICAgLS0gICAgIC0tICAgLS0tLS0tICAgIC0tICAgICAtLQorIEUwLi5GRiAtPiBFMCAgLT4gRTAgIC0+IEUwICAgICAgICAgIEYwLi5GRiAtPiBGMCAgLT4gRjAKKyBDMC4uREYgLT4gQzAgIC0+IEMwICAtPiBDMCAgICAgICAgICBFMC4uRUYgLT4gRjAgIC0+IEYwCisgQTAuLkJGIC0+IEEwICAtPiBBMCAgLT4gQTAgICAgICAgICAgRDguLkRGIC0+IDAwICAtPiAwMAorIDgwLi45RiAtPiA4MCAgLT4gODAgIC0+IDgwICAgICAgICAgIEQwLi5ENyAtPiAwMCAgLT4gMDAKKyA2MC4uN0YgLT4gNjAgIC0+IDYwICAtPiA2MAorIDQwLi41RiAtPiA0MCAgICAgICAgIC0+IHBjICAtPiBwYyAgIDQwLi41RiAtPiBwYworIDIwLi4zRiAtPiAyMCAgLT4gMjAgIC0+IDIwCisgMDAuLjFGIC0+IDAwICAtPiAwMCAgLT4gMDAKIAotVGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgSU8gcGVyaXBoZXJhbHMgaXMgYWJvdmUgMHhmMDAwMDAwMC4gVGhpcyBtYXkgY2hhbmdlCitUaGUgZGVmYXVsdCBsb2NhdGlvbiBvZiBJTyBwZXJpcGhlcmFscyBpcyBhYm92ZSAweGYwMDAwMDAwLiBUaGlzIG1heSBiZSBjaGFuZ2VkCiB1c2luZyBhICJyYW5nZXMiIHByb3BlcnR5IGluIGEgZGV2aWNlIHRyZWUgc2ltcGxlLWJ1cyBub2RlLiBTZWUgZVBBUFIgMS4xLCDCpzYuNQogZm9yIGRldGFpbHMgb24gdGhlIHN5bnRheCBhbmQgc2VtYW50aWMgb2Ygc2ltcGxlLWJ1cyBub2Rlcy4gVGhlIGZvbGxvd2luZwogbGltaXRhdGlvbnMgYXBwbHk6CkBAIC02MiwzICs1NywxMjcgQEAKIAogNi4gVGhlIElPIGFyZWEgY292ZXJzIHRoZSBlbnRpcmUgMjU2TUIgc2VnbWVudCBvZiBwYXJlbnQtYnVzLWFkZHJlc3M7IHRoZQogICAgInJhbmdlcyIgdHJpcGxldCBsZW5ndGggZmllbGQgaXMgaWdub3JlZAorCisKK01NVXYzIGFkZHJlc3Mgc3BhY2UgbGF5b3V0cy4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRGVmYXVsdCBNTVV2Mi1jb21wYXRpYmxlIGxheW91dC4KKworICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbCAgICAgICAgICAgICAgICAgICBWQUREUiAgICAgICBTaXplCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBVc2Vyc3BhY2UgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwICBUQVNLX1NJWkUKKystLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgUGFnZSB0YWJsZSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNDAwMDAwCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBLTUFQIGFyZWEgICAgICAgIHwgIFBLTUFQX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJTX1BFUl9QVEUgKgorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0FDSEVfTl9DT0xPUlMgKgorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX1NJWkUKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDRNQiAqIERDQUNIRV9OX0NPTE9SUykKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IEF0b21pYyBLTUFQIGFyZWEgfCAgRklYQUREUl9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgIEtNX1RZUEVfTlIgKgorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUl9DUFVTICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENBQ0hFX05fQ09MT1JTICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFCisrLS0tLS0tLS0tLS0tLS0tLS0tKyAgRklYQUREUl9UT1AgICAgICAgICAgICAgIDB4YmZmZmYwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFZNQUxMT0MgYXJlYSAgICAgfCAgVk1BTExPQ19TVEFSVCAgICAgICAgICAgIDB4YzAwMDAwMDAgIDEyOE1CIC0gNjRLQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsgIFZNQUxMT0NfRU5ECit8IENhY2hlIGFsaWFzaW5nICAgfCAgVExCVEVNUF9CQVNFXzEgICAgICAgICAgIDB4YzdmZjAwMDAgIERDQUNIRV9XQVlfU0laRQorfCByZW1hcCBhcmVhIDEgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IENhY2hlIGFsaWFzaW5nICAgfCAgVExCVEVNUF9CQVNFXzIgICAgICAgICAgICAgICAgICAgICAgIERDQUNIRV9XQVlfU0laRQorfCByZW1hcCBhcmVhIDIgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0rCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDYWNoZWQgS1NFRyAgICAgIHwgIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSICAweGQwMDAwMDAwICAxMjhNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVW5jYWNoZWQgS1NFRyAgICB8ICBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUiAgMHhkODAwMDAwMCAgMTI4TUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IENhY2hlZCBLSU8gICAgICAgfCAgWENIQUxfS0lPX0NBQ0hFRF9WQUREUiAgIDB4ZTAwMDAwMDAgIDI1Nk1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBVbmNhY2hlZCBLSU8gICAgIHwgIFhDSEFMX0tJT19CWVBBU1NfVkFERFIgICAweGYwMDAwMDAwICAyNTZNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKKworCisyNTZNQiBjYWNoZWQgKyAyNTZNQiB1bmNhY2hlZCBsYXlvdXQuCisKKyAgICAgICAgICAgICAgICAgICAgICBTeW1ib2wgICAgICAgICAgICAgICAgICAgVkFERFIgICAgICAgU2l6ZQorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVXNlcnNwYWNlICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMCAgVEFTS19TSVpFCisrLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFBhZ2UgdGFibGUgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDQwMDAwMAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgS01BUCBhcmVhICAgICAgICB8ICBQS01BUF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRSU19QRVJfUFRFICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENBQ0hFX05fQ09MT1JTICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0TUIgKiBEQ0FDSEVfTl9DT0xPUlMpCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBBdG9taWMgS01BUCBhcmVhIHwgIEZJWEFERFJfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICBLTV9UWVBFX05SICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlJfQ1BVUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERDQUNIRV9OX0NPTE9SUyAqCit8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfU0laRQorKy0tLS0tLS0tLS0tLS0tLS0tLSsgIEZJWEFERFJfVE9QICAgICAgICAgICAgICAweDlmZmZmMDAwCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBWTUFMTE9DIGFyZWEgICAgIHwgIFZNQUxMT0NfU1RBUlQgICAgICAgICAgICAweGEwMDAwMDAwICAxMjhNQiAtIDY0S0IKKystLS0tLS0tLS0tLS0tLS0tLS0rICBWTUFMTE9DX0VORAorfCBDYWNoZSBhbGlhc2luZyAgIHwgIFRMQlRFTVBfQkFTRV8xICAgICAgICAgICAweGE3ZmYwMDAwICBEQ0FDSEVfV0FZX1NJWkUKK3wgcmVtYXAgYXJlYSAxICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDYWNoZSBhbGlhc2luZyAgIHwgIFRMQlRFTVBfQkFTRV8yICAgICAgICAgICAgICAgICAgICAgICBEQ0FDSEVfV0FZX1NJWkUKK3wgcmVtYXAgYXJlYSAyICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLS0tKworKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQ2FjaGVkIEtTRUcgICAgICB8ICBYQ0hBTF9LU0VHX0NBQ0hFRF9WQUREUiAgMHhiMDAwMDAwMCAgMjU2TUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFVuY2FjaGVkIEtTRUcgICAgfCAgWENIQUxfS1NFR19CWVBBU1NfVkFERFIgIDB4YzAwMDAwMDAgIDI1Nk1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgQ2FjaGVkIEtJTyAgICAgICB8ICBYQ0hBTF9LSU9fQ0FDSEVEX1ZBRERSICAgMHhlMDAwMDAwMCAgMjU2TUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFVuY2FjaGVkIEtJTyAgICAgfCAgWENIQUxfS0lPX0JZUEFTU19WQUREUiAgIDB4ZjAwMDAwMDAgIDI1Nk1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworCisKKzUxMk1CIGNhY2hlZCArIDUxMk1CIHVuY2FjaGVkIGxheW91dC4KKworICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbCAgICAgICAgICAgICAgICAgICBWQUREUiAgICAgICBTaXplCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBVc2Vyc3BhY2UgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwICBUQVNLX1NJWkUKKystLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgUGFnZSB0YWJsZSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorKy0tLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwNDAwMDAwCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBLTUFQIGFyZWEgICAgICAgIHwgIFBLTUFQX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJTX1BFUl9QVEUgKgorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQ0FDSEVfTl9DT0xPUlMgKgorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX1NJWkUKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDRNQiAqIERDQUNIRV9OX0NPTE9SUykKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IEF0b21pYyBLTUFQIGFyZWEgfCAgRklYQUREUl9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgIEtNX1RZUEVfTlIgKgorfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUl9DUFVTICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRENBQ0hFX05fQ09MT1JTICoKK3wgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRV9TSVpFCisrLS0tLS0tLS0tLS0tLS0tLS0tKyAgRklYQUREUl9UT1AgICAgICAgICAgICAgIDB4OGZmZmYwMDAKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IFZNQUxMT0MgYXJlYSAgICAgfCAgVk1BTExPQ19TVEFSVCAgICAgICAgICAgIDB4OTAwMDAwMDAgIDEyOE1CIC0gNjRLQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsgIFZNQUxMT0NfRU5ECit8IENhY2hlIGFsaWFzaW5nICAgfCAgVExCVEVNUF9CQVNFXzEgICAgICAgICAgIDB4OTdmZjAwMDAgIERDQUNIRV9XQVlfU0laRQorfCByZW1hcCBhcmVhIDEgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IENhY2hlIGFsaWFzaW5nICAgfCAgVExCVEVNUF9CQVNFXzIgICAgICAgICAgICAgICAgICAgICAgIERDQUNIRV9XQVlfU0laRQorfCByZW1hcCBhcmVhIDIgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tLS0rCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBDYWNoZWQgS1NFRyAgICAgIHwgIFhDSEFMX0tTRUdfQ0FDSEVEX1ZBRERSICAweGEwMDAwMDAwICA1MTJNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKK3wgVW5jYWNoZWQgS1NFRyAgICB8ICBYQ0hBTF9LU0VHX0JZUEFTU19WQUREUiAgMHhjMDAwMDAwMCAgNTEyTUIKKystLS0tLS0tLS0tLS0tLS0tLS0rCit8IENhY2hlZCBLSU8gICAgICAgfCAgWENIQUxfS0lPX0NBQ0hFRF9WQUREUiAgIDB4ZTAwMDAwMDAgIDI1Nk1CCisrLS0tLS0tLS0tLS0tLS0tLS0tKworfCBVbmNhY2hlZCBLSU8gICAgIHwgIFhDSEFMX0tJT19CWVBBU1NfVkFERFIgICAweGYwMDAwMDAwICAyNTZNQgorKy0tLS0tLS0tLS0tLS0tLS0tLSsKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggYjdkNGRlNi4uY2EwNDU4MzIgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC02MzYsNiArNjM2LDE1IEBACiBGOglpbmNsdWRlL2xpbnV4L2FsdGVyYV91YXJ0LmgKIEY6CWluY2x1ZGUvbGludXgvYWx0ZXJhX2p0YWd1YXJ0LmgKIAorQU1BWk9OIEVUSEVSTkVUIERSSVZFUlMKK006CU5ldGFuZWwgQmVsZ2F6YWwgPG5ldGFuZWxAYW5uYXB1cm5hbGFicy5jb20+CitSOglTYWVlZCBCaXNoYXJhIDxzYWVlZEBhbm5hcHVybmFsYWJzLmNvbT4KK1I6CVpvcmlrIE1hY2h1bHNreSA8em9yaWtAYW5uYXB1cm5hbGFicy5jb20+CitMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitTOglTdXBwb3J0ZWQKK0Y6CURvY3VtZW50YXRpb24vbmV0d29ya2luZy9lbmEudHh0CitGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vCisKIEFNRCBDUllQVE9HUkFQSElDIENPUFJPQ0VTU09SIChDQ1ApIERSSVZFUgogTToJVG9tIExlbmRhY2t5IDx0aG9tYXMubGVuZGFja3lAYW1kLmNvbT4KIE06CUdhcnkgSG9vayA8Z2FyeS5ob29rQGFtZC5jb20+CkBAIC03OTgsNiArODA3LDcgQEAKIE06CVN1bWl0IFNlbXdhbCA8c3VtaXQuc2Vtd2FsQGxpbmFyby5vcmc+CiBMOglkZXZlbEBkcml2ZXJkZXYub3N1b3NsLm9yZwogUzoJU3VwcG9ydGVkCitGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3RhZ2luZy9pb24vCiBGOglkcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24KIEY6CWRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvaW9uLmgKIEY6CWRyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3VhcGkvaW9uX3Rlc3QuaApAQCAtODA5LDExICs4MTksMTEgQEAKIFM6CU1haW50YWluZWQKIEY6CXNvdW5kL2FvYS8KIAotQVBFWCBFTUJFRERFRCBTWVNURU1TIFNUWDEwNCBEQUMgRFJJVkVSCitBUEVYIEVNQkVEREVEIFNZU1RFTVMgU1RYMTA0IElJTyBEUklWRVIKIE06CVdpbGxpYW0gQnJlYXRoaXR0IEdyYXkgPHZpbGhlbG0uZ3JheUBnbWFpbC5jb20+CiBMOglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCi1GOglkcml2ZXJzL2lpby9kYWMvc3R4MTA0LmMKK0Y6CWRyaXZlcnMvaWlvL2FkYy9zdHgxMDQuYwogCiBBUE0gRFJJVkVSCiBNOglKaXJpIEtvc2luYSA8amlrb3NAa2VybmVsLm9yZz4KQEAgLTkxMiwxNSArOTIyLDE3IEBACiAKIEFSTSBQTVUgUFJPRklMSU5HIEFORCBERUJVR0dJTkcKIE06CVdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgotUjoJTWFyayBSdXRsYW5kIDxtYXJrLnJ1dGxhbmRAYXJtLmNvbT4KK006CU1hcmsgUnV0bGFuZCA8bWFyay5ydXRsYW5kQGFybS5jb20+CiBTOglNYWludGFpbmVkCitMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogRjoJYXJjaC9hcm0qL2tlcm5lbC9wZXJmXyoKIEY6CWFyY2gvYXJtL29wcm9maWxlL2NvbW1vbi5jCiBGOglhcmNoL2FybSova2VybmVsL2h3X2JyZWFrcG9pbnQuYwogRjoJYXJjaC9hcm0qL2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaAogRjoJYXJjaC9hcm0qL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaAotRjoJZHJpdmVycy9wZXJmL2FybV9wbXUuYworRjoJZHJpdmVycy9wZXJmLyoKIEY6CWluY2x1ZGUvbGludXgvcGVyZi9hcm1fcG11LmgKK0Y6CURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vcG11LnR4dAogCiBBUk0gUE9SVAogTToJUnVzc2VsbCBLaW5nIDxsaW51eEBhcm1saW51eC5vcmcudWs+CkBAIC0xMTIzLDYgKzExMzUsMTEgQEAKIEY6CURvY3VtZW50YXRpb24vdHJhY2UvY29yZXNpZ2h0LnR4dAogRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9jb3Jlc2lnaHQudHh0CiBGOglEb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1jb3Jlc2lnaHQtZGV2aWNlcy0qCitGOgl0b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvcG11LmMKK0Y6CXRvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9hdXh0cmFjZS5jCitGOgl0b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvY3MtZXRtLmMKK0Y6CXRvb2xzL3BlcmYvYXJjaC9hcm0vdXRpbC9jcy1ldG0uaAorRjoJdG9vbHMvcGVyZi91dGlsL2NzLWV0bS5oCiAKIEFSTS9DT1JHSSBNQUNISU5FIFNVUFBPUlQKIE06CVJpY2hhcmQgUHVyZGllIDxycHVyZGllQHJwc3lzLm5ldD4KQEAgLTE2MjUsNyArMTY0Miw4IEBACiAKIEFSTS9TQU1TVU5HIEVYWU5PUyBBUk0gQVJDSElURUNUVVJFUwogTToJS3VramluIEtpbSA8a2dlbmVAa2VybmVsLm9yZz4KLU06CUtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgorTToJS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgorUjoJSmF2aWVyIE1hcnRpbmV6IENhbmlsbGFzIDxqYXZpZXJAb3NnLnNhbXN1bmcuY29tPgogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIEw6CWxpbnV4LXNhbXN1bmctc29jQHZnZXIua2VybmVsLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBTOglNYWludGFpbmVkCkBAIC0xNjQ1LDcgKzE2NjMsNiBAQAogRjoJZHJpdmVycy8qLypzNXB2MjEwKgogRjoJZHJpdmVycy9tZW1vcnkvc2Ftc3VuZy8qCiBGOglkcml2ZXJzL3NvYy9zYW1zdW5nLyoKLUY6CWRyaXZlcnMvc3BpL3NwaS1zM2MqCiBGOglEb2N1bWVudGF0aW9uL2FybS9TYW1zdW5nLwogRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9zYW1zdW5nLwogRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NyYW0vc2Ftc3VuZy1zcmFtLnR4dApAQCAtMTgzMyw2ICsxODUwLDcgQEAKIEFSTS9VTklQSElFUiBBUkNISVRFQ1RVUkUKIE06CU1hc2FoaXJvIFlhbWFkYSA8eWFtYWRhLm1hc2FoaXJvQHNvY2lvbmV4dC5jb20+CiBMOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9tYXNhaGlyb3kvbGludXgtdW5pcGhpZXIuZ2l0CiBTOglNYWludGFpbmVkCiBGOglhcmNoL2FybS9ib290L2R0cy91bmlwaGllcioKIEY6CWFyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2NhY2hlLXVuaXBoaWVyLmgKQEAgLTE4NDAsNiArMTg1OCw3IEBACiBGOglhcmNoL2FybS9tbS9jYWNoZS11bmlwaGllci5jCiBGOglhcmNoL2FybTY0L2Jvb3QvZHRzL3NvY2lvbmV4dC8KIEY6CWRyaXZlcnMvYnVzL3VuaXBoaWVyLXN5c3RlbS1idXMuYworRjoJZHJpdmVycy9jbGsvdW5pcGhpZXIvCiBGOglkcml2ZXJzL2kyYy9idXNzZXMvaTJjLXVuaXBoaWVyKgogRjoJZHJpdmVycy9waW5jdHJsL3VuaXBoaWVyLwogRjoJZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF91bmlwaGllci5jCkBAIC0xOTc2LDYgKzE5OTUsMTMgQEAKIEY6CWRyaXZlcnMvbWVkaWEvaTJjL2FzMzY0NWEuYwogRjoJaW5jbHVkZS9tZWRpYS9pMmMvYXMzNjQ1YS5oCiAKK0FTQUhJIEtBU0VJIEFLODk3NCBEUklWRVIKK006CUxpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAbGluYXJvLm9yZz4KK0w6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cuYWttLmNvbS8KK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL2FrODk3NC5jCisKIEFTQzc2MjEgSEFSRFdBUkUgTU9OSVRPUiBEUklWRVIKIE06CUdlb3JnZSBKb3NlcGggPGdlb3JnZS5qb3NlcGhAZmFpcnZpZXc1LmNvbT4KIEw6CWxpbnV4LWh3bW9uQHZnZXIua2VybmVsLm9yZwpAQCAtMjExNCwxMSArMjE0MCw2IEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS5jCiAKLUFUTUVMIEFUOTEgLyBBVDMyIFNFUklBTCBEUklWRVIKLU06CU5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYXRtZWwuY29tPgotUzoJU3VwcG9ydGVkCi1GOglkcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKLQogQVRNRUwgQVQ5MSBTQU1BNUQyLUNvbXBhdGlibGUgU2h1dGRvd24gQ29udHJvbGxlcgogTToJTmljb2xhcyBGZXJyZSA8bmljb2xhcy5mZXJyZUBhdG1lbC5jb20+CiBTOglTdXBwb3J0ZWQKQEAgLTI0NTMsNiArMjQ3NCw3IEBACiBTOglNYWludGFpbmVkCiBGOglibG9jay8KIEY6CWtlcm5lbC90cmFjZS9ibGt0cmFjZS5jCitGOglsaWIvc2JpdG1hcC5jCiAKIEJMT0NLMk1URCBEUklWRVIKIE06CUpvZXJuIEVuZ2VsIDxqb2VybkBsYXp5YmFzdGFyZC5vcmc+CkBAIC0yNDg2LDcgKzI1MDgsNyBAQAogQk9ORElORyBEUklWRVIKIE06CUpheSBWb3NidXJnaCA8ai52b3NidXJnaEBnbWFpbC5jb20+CiBNOglWZWFjZXNsYXYgRmFsaWNvIDx2ZmFsaWNvQGdtYWlsLmNvbT4KLU06CUFuZHkgR29zcG9kYXJlayA8Z29zcG9AY3VtdWx1c25ldHdvcmtzLmNvbT4KK006CUFuZHkgR29zcG9kYXJlayA8YW5keUBncmV5aG91c2UubmV0PgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9ib25kaW5nLwogUzoJU3VwcG9ydGVkCkBAIC0yNTAxLDcgKzI1MjMsNyBAQAogRjoJa2VybmVsL2JwZi8KIAogQlJPQURDT00gQjQ0IDEwLzEwMCBFVEhFUk5FVCBEUklWRVIKLU06CUdhcnkgWmFtYnJhbm8gPHphbWJyYW5vQGJyb2FkY29tLmNvbT4KK006CU1pY2hhZWwgQ2hhbiA8bWljaGFlbC5jaGFuQGJyb2FkY29tLmNvbT4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LioKQEAgLTI4OTYsNiArMjkxOCwxNCBAQAogRjoJZHJpdmVycy9paW8vbGlnaHQvY20qCiBGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQKIAorQ0FWSVVNIEkyQyBEUklWRVIKK006CUphbiBHbGF1YmVyIDxqZ2xhdWJlckBjYXZpdW0uY29tPgorTToJRGF2aWQgRGFuZXkgPGRhdmlkLmRhbmV5QGNhdml1bS5jb20+CitXOglodHRwOi8vd3d3LmNhdml1bS5jb20KK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY3Rlb24qCitGOglkcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRodW5kZXJ4KgorCiBDQVZJVU0gTElRVUlESU8gTkVUV09SSyBEUklWRVIKIE06ICAgICBEZXJlayBDaGlja2xlcyA8ZGVyZWsuY2hpY2tsZXNAY2F2aXVtbmV0d29ya3MuY29tPgogTTogICAgIFNhdGFuYW5kIEJ1cmxhIDxzYXRhbmFuZGEuYnVybGFAY2F2aXVtbmV0d29ya3MuY29tPgpAQCAtMzE0Myw3ICszMTczLDcgQEAKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbW1hcmVrL2tidWlsZC5naXQgbWlzYwogVzoJaHR0cDovL2NvY2NpbmVsbGUubGlwNi5mci8KIFM6CVN1cHBvcnRlZAotRjoJRG9jdW1lbnRhdGlvbi9jb2NjaW5lbGxlLnR4dAorRjoJRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMvY29jY2luZWxsZS5yc3QKIEY6CXNjcmlwdHMvY29jY2luZWxsZS8KIEY6CXNjcmlwdHMvY29jY2ljaGVjawogCkBAIC0zMTY5LDYgKzMxOTksNyBAQAogTToJTWljaGFlbCBUdXJxdWV0dGUgPG10dXJxdWV0dGVAYmF5bGlicmUuY29tPgogTToJU3RlcGhlbiBCb3lkIDxzYm95ZEBjb2RlYXVyb3JhLm9yZz4KIEw6CWxpbnV4LWNsa0B2Z2VyLmtlcm5lbC5vcmcKK1E6CWh0dHA6Ly9wYXRjaHdvcmsua2VybmVsLm9yZy9wcm9qZWN0L2xpbnV4LWNsay9saXN0LwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9jbGsvbGludXguZ2l0CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svCkBAIC0zMjU2LDcgKzMyODcsNyBAQAogQ09OVFJPTCBHUk9VUCAtIE1FTU9SWSBSRVNPVVJDRSBDT05UUk9MTEVSIChNRU1DRykKIE06CUpvaGFubmVzIFdlaW5lciA8aGFubmVzQGNtcHhjaGcub3JnPgogTToJTWljaGFsIEhvY2tvIDxtaG9ja29Aa2VybmVsLm9yZz4KLU06CVZsYWRpbWlyIERhdnlkb3YgPHZkYXZ5ZG92QHZpcnR1b3p6by5jb20+CitNOglWbGFkaW1pciBEYXZ5ZG92IDx2ZGF2eWRvdi5kZXZAZ21haWwuY29tPgogTDoJY2dyb3Vwc0B2Z2VyLmtlcm5lbC5vcmcKIEw6CWxpbnV4LW1tQGt2YWNrLm9yZwogUzoJTWFpbnRhaW5lZApAQCAtMzI3Nyw3ICszMzA4LDcgQEAKIEY6CWRyaXZlcnMvbmV0L3dhbi9jb3NhKgogCiBDUE1BQyBFVEhFUk5FVCBEUklWRVIKLU06CUZsb3JpYW4gRmFpbmVsbGkgPGZsb3JpYW5Ab3BlbndydC5vcmc+CitNOglGbG9yaWFuIEZhaW5lbGxpIDxmLmZhaW5lbGxpQGdtYWlsLmNvbT4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2NwbWFjLmMKQEAgLTMyODksNiArMzMyMCw3IEBACiBTOglNYWludGFpbmVkCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3JhZmFlbC9saW51eC1wbS5naXQKIFQ6CWdpdCBnaXQ6Ly9naXQubGluYXJvLm9yZy9wZW9wbGUvdmlyZXNoay9saW51eC5naXQgKEZvciBBUk0gVXBkYXRlcykKK0Y6CURvY3VtZW50YXRpb24vY3B1LWZyZXEvCiBGOglkcml2ZXJzL2NwdWZyZXEvCiBGOglpbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAogCkBAIC0zNTAwLDE0ICszNTMyLDE0IEBACiAKIENYTCAoSUJNIENvaGVyZW50IEFjY2VsZXJhdG9yIFByb2Nlc3NvciBJbnRlcmZhY2UgQ0FQSSkgRFJJVkVSCiBNOglJYW4gTXVuc2llIDxpbXVuc2llQGF1MS5pYm0uY29tPgotTToJTWljaGFlbCBOZXVsaW5nIDxtaWtleUBuZXVsaW5nLm9yZz4KK006CUZyZWRlcmljIEJhcnJhdCA8ZmJhcnJhdEBsaW51eC52bmV0LmlibS5jb20+CiBMOglsaW51eHBwYy1kZXZAbGlzdHMub3psYWJzLm9yZwogUzoJU3VwcG9ydGVkCitGOglhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLWN4bC5jCiBGOglkcml2ZXJzL21pc2MvY3hsLwogRjoJaW5jbHVkZS9taXNjL2N4bCoKIEY6CWluY2x1ZGUvdWFwaS9taXNjL2N4bC5oCiBGOglEb2N1bWVudGF0aW9uL3Bvd2VycGMvY3hsLnR4dAotRjoJRG9jdW1lbnRhdGlvbi9wb3dlcnBjL2N4bC50eHQKIEY6CURvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtY3hsCiAKIENYTEZMQVNIIChJQk0gQ29oZXJlbnQgQWNjZWxlcmF0b3IgUHJvY2Vzc29yIEludGVyZmFjZSBDQVBJIEZsYXNoKSBTQ1NJIERSSVZFUgpAQCAtMzc3MCw4ICszODAyLDggQEAKIEY6CWRyaXZlcnMvbWZkL2RhOTAzeC5jCiBGOglkcml2ZXJzL21mZC9kYTkwPz8tKi5jCiBGOglkcml2ZXJzL21mZC9kYTkxPz8tKi5jCi1GOglkcml2ZXJzL3Bvd2VyL2RhOTA1Mi1iYXR0ZXJ5LmMKLUY6CWRyaXZlcnMvcG93ZXIvZGE5MT8/LSouYworRjoJZHJpdmVycy9wb3dlci9zdXBwbHkvZGE5MDUyLWJhdHRlcnkuYworRjoJZHJpdmVycy9wb3dlci9zdXBwbHkvZGE5MT8/LSouYwogRjoJZHJpdmVycy9yZWd1bGF0b3IvZGE5MDN4LmMKIEY6CWRyaXZlcnMvcmVndWxhdG9yL2RhOT8/Py1yZWd1bGF0b3IuW2NoXQogRjoJZHJpdmVycy9ydGMvcnRjLWRhOTA/Py5jCkBAIC0zNzg3LDYgKzM4MTksMTIgQEAKIEY6CWluY2x1ZGUvc291bmQvZGFbNzldKi5oCiBGOglzb3VuZC9zb2MvY29kZWNzL2RhWzc5XSouW2NoXQogCitESUFNT05EIFNZU1RFTVMgR1BJTy1NTSBHUElPIERSSVZFUgorTToJV2lsbGlhbSBCcmVhdGhpdHQgR3JheSA8dmlsaGVsbS5ncmF5QGdtYWlsLmNvbT4KK0w6CWxpbnV4LWdwaW9Admdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2dwaW8vZ3Bpby1ncGlvLW1tLmMKKwogRElHSSBORU8gQU5EIENMQVNTSUMgUENJIFBST0RVQ1RTCiBNOglMaWR6YSBMb3VpbmEgPGxpZHphLmxvdWluYUBnbWFpbC5jb20+CiBNOglNYXJrIEhvdW5zY2hlbGwgPG1hcmtoQGNvbXByby5uZXQ+CkBAIC00NDEyLDcgKzQ0NTAsNiBAQAogRjoJZnMvZWNyeXB0ZnMvCiAKIEVEQUMtQ09SRQotTToJRG91ZyBUaG9tcHNvbiA8ZG91Z3Rob21wc29uQHhtaXNzaW9uLmNvbT4KIE06CUJvcmlzbGF2IFBldGtvdiA8YnBAYWxpZW44LmRlPgogTToJTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQHMtb3BlbnNvdXJjZS5jb20+CiBNOglNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAa2VybmVsLm9yZz4KQEAgLTQ0MjUsMTQgKzQ0NjIsMTIgQEAKIEY6CWluY2x1ZGUvbGludXgvZWRhYy5oCiAKIEVEQUMtQU1ENjQKLU06CURvdWcgVGhvbXBzb24gPGRvdWd0aG9tcHNvbkB4bWlzc2lvbi5jb20+CiBNOglCb3Jpc2xhdiBQZXRrb3YgPGJwQGFsaWVuOC5kZT4KIEw6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2VkYWMvYW1kNjRfZWRhYyoKIAogRURBQy1DQUxYRURBCi1NOglEb3VnIFRob21wc29uIDxkb3VndGhvbXBzb25AeG1pc3Npb24uY29tPgogTToJUm9iZXJ0IFJpY2h0ZXIgPHJyaWNAa2VybmVsLm9yZz4KIEw6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCkBAIC00NDQ4LDE3ICs0NDgzLDIxIEBACiAKIEVEQUMtRTc1MlgKIE06CU1hcmsgR3Jvc3MgPG1hcmsuZ3Jvc3NAaW50ZWwuY29tPgotTToJRG91ZyBUaG9tcHNvbiA8ZG91Z3Rob21wc29uQHhtaXNzaW9uLmNvbT4KIEw6CWxpbnV4LWVkYWNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2VkYWMvZTc1MnhfZWRhYy5jCiAKIEVEQUMtRTdYWFgKLU06CURvdWcgVGhvbXBzb24gPGRvdWd0aG9tcHNvbkB4bWlzc2lvbi5jb20+CiBMOglsaW51eC1lZGFjQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9lZGFjL2U3eHh4X2VkYWMuYwogCitFREFDLUZTTF9ERFIKK006CVlvcmsgU3VuIDx5b3JrLnN1bkBueHAuY29tPgorTDoJbGludXgtZWRhY0B2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvZWRhYy9mc2xfZGRyX2VkYWMuKgorCiBFREFDLUdIRVMKIE06CU1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBzLW9wZW5zb3VyY2UuY29tPgogTToJTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGtlcm5lbC5vcmc+CkBAIC00NDczLDEzICs0NTEyLDExIEBACiBGOglkcml2ZXJzL2VkYWMvaTgyNDQzYnhneF9lZGFjLmMKIAogRURBQy1JMzAwMAotTToJSmFzb24gVWhsZW5rb3R0IDxqdWhsZW5rb0Bha2FtYWkuY29tPgogTDoJbGludXgtZWRhY0B2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKK1M6CU9ycGhhbgogRjoJZHJpdmVycy9lZGFjL2kzMDAwX2VkYWMuYwogCiBFREFDLUk1MDAwCi1NOglEb3VnIFRob21wc29uIDxkb3VndGhvbXBzb25AeG1pc3Npb24uY29tPgogTDoJbGludXgtZWRhY0B2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvZWRhYy9pNTAwMF9lZGFjLmMKQEAgLTQ1OTEsNiArNDYyOCwxMyBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy92aWRlby9mYmRldi9lZmlmYi5jCiAKK0VGSSBURVNUIERSSVZFUgorTDoJbGludXgtZWZpQHZnZXIua2VybmVsLm9yZworTToJSXZhbiBIdSA8aXZhbi5odUBjYW5vbmljYWwuY29tPgorTToJTWF0dCBGbGVtaW5nIDxtYXR0QGNvZGVibHVlcHJpbnQuY28udWs+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2Zpcm13YXJlL2VmaS90ZXN0LworCiBFRlMgRklMRVNZU1RFTQogVzoJaHR0cDovL2Flc2NoaS5jaC5ldS5vcmcvZWZzLwogUzoJT3JwaGFuCkBAIC00ODU4LDYgKzQ5MDIsNyBAQAogCiBGSVJNV0FSRSBMT0FERVIgKHJlcXVlc3RfZmlybXdhcmUpCiBNOglNaW5nIExlaSA8bWluZy5sZWlAY2Fub25pY2FsLmNvbT4KK006CUx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAa2VybmVsLm9yZz4KIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vZmlybXdhcmVfY2xhc3MvCkBAIC01MDc4LDEwICs1MTIzLDkgQEAKIAogRjJGUyBGSUxFIFNZU1RFTQogTToJSmFlZ2V1ayBLaW0gPGphZWdldWtAa2VybmVsLm9yZz4KLU06CUNoYW5nbWFuIExlZSA8Y20yMjQubGVlQHNhbXN1bmcuY29tPgotUjoJQ2hhbyBZdSA8eXVjaGFvMEBodWF3ZWkuY29tPgorTToJQ2hhbyBZdSA8eXVjaGFvMEBodWF3ZWkuY29tPgogTDoJbGludXgtZjJmcy1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKLVc6CWh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRjJGUworVzoJaHR0cHM6Ly9mMmZzLndpa2kua2VybmVsLm9yZy8KIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamFlZ2V1ay9mMmZzLmdpdAogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mMmZzLnR4dApAQCAtNTE0Myw3ICs1MTg3LDcgQEAKIE06CVBldGVyIE9iZXJwYXJsZWl0ZXIgPG9iZXJwYXJAbGludXgudm5ldC5pYm0uY29tPgogUzoJTWFpbnRhaW5lZAogRjoJa2VybmVsL2djb3YvCi1GOglEb2N1bWVudGF0aW9uL2djb3YudHh0CitGOglEb2N1bWVudGF0aW9uL2Rldi10b29scy9nY292LnJzdAogCiBHRFQgU0NTSSBESVNLIEFSUkFZIENPTlRST0xMRVIgRFJJVkVSCiBNOglBY2hpbSBMZXVibmVyIDxhY2hpbV9sZXVibmVyQGFkYXB0ZWMuY29tPgpAQCAtNTI2MCw2ICs1MzA0LDEzIEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2dvb2RpeC5jCiAKK0dQSU8gTU9DS1VQIERSSVZFUgorTToJQmFtdm9yIEppYW4gWmhhbmcgPGJhbXZvci56aGFuZ2ppYW5AbGluYXJvLm9yZz4KK0w6CWxpbnV4LWdwaW9Admdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2dwaW8vZ3Bpby1tb2NrdXAuYworRjoJdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZ3Bpby8KKwogR1BJTyBTVUJTWVNURU0KIE06CUxpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAbGluYXJvLm9yZz4KIE06CUFsZXhhbmRyZSBDb3VyYm90IDxnbnVyb3VAZ21haWwuY29tPgpAQCAtNTI5MSw2ICs1MzQyLDc3IEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC8KIAorR1JFWUJVUyBTVUJTWVNURU0KK006CUpvaGFuIEhvdm9sZCA8am9oYW5Aa2VybmVsLm9yZz4KK006CUFsZXggRWxkZXIgPGVsZGVyQGtlcm5lbC5vcmc+CitNOglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvCisKK0dSRVlCVVMgQVVESU8gUFJPVE9DT0xTIERSSVZFUlMKK006CVZhaWJoYXYgQWdhcndhbCA8dmFpYmhhdi5zckBnbWFpbC5jb20+CitNOglNYXJrIEdyZWVyIDxtZ3JlZXJAYW5pbWFsY3JlZWsuY29tPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fYXBicmlkZ2VhLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX2FwYnJpZGdlYS5oCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19jb2RlYy5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19jb2RlYy5oCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19nYi5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9hdWRpb19tYW5hZ2VyLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXIuaAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlcl9tb2R1bGUuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbWFuYWdlcl9wcml2YXRlLmgKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX21hbmFnZXJfc3lzZnMuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXVkaW9fbW9kdWxlLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2F1ZGlvX3RvcG9sb2d5LmMKKworR1JFWUJVUyBQUk9UT0NPTFMgRFJJVkVSUworTToJUnVpIE1pZ3VlbCBTaWx2YSA8cm1mcmZzQGdtYWlsLmNvbT4KK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NkaW8uYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvbGlnaHQuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3Bpby5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9wb3dlcl9zdXBwbHkuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaWxpYi5jCisKK0dSRVlCVVMgUFJPVE9DT0xTIERSSVZFUlMKK006CUJyeWFuIE8nRG9ub2dodWUgPHB1cmUubG9naWNAbmV4dXMtc29mdHdhcmUuaWU+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9sb29wYmFjay5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90aW1lc3luYy5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy90aW1lc3luY19wbGF0Zm9ybS5jCisKK0dSRVlCVVMgUFJPVE9DT0xTIERSSVZFUlMKK006CVZpcmVzaCBLdW1hciA8dmlyZXNoa0BrZXJuZWwub3JnPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXV0aGVudGljYXRpb24uYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYm9vdHJvbS5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9maXJtd2FyZS5oCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9mdy1jb3JlLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LWRvd25sb2FkLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2Z3LW1hbmFnYW1lbnQuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvZ3JleWJ1c19hdXRoZW50aWNhdGlvbi5oCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9ncmV5YnVzX2Zpcm13YXJlLmgKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2hpZC5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9pMmMuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvc3BpLmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL3NwaWxpYi5jCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy9zcGlsaWIuaAorCitHUkVZQlVTIFBST1RPQ09MUyBEUklWRVJTCitNOglEYXZpZCBMaW4gPGR0d2xpbkBnbWFpbC5jb20+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3N0YWdpbmcvZ3JleWJ1cy91YXJ0LmMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ncmV5YnVzL2xvZy5jCisKK0dSRVlCVVMgUExBVEZPUk0gRFJJVkVSUworTToJVmFpYmhhdiBIaXJlbWF0aCA8aHZhaWJoYXYubGludXhAZ21haWwuY29tPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGUtcGxhdGZvcm0uYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGUtYXBiLWN0cmwuYworRjoJZHJpdmVycy9zdGFnaW5nL2dyZXlidXMvYXJjaGVfcGxhdGZvcm0uaAorCiBHU1BDQSBGSU5FUElYIFNVQkRSSVZFUgogTToJRnJhbmsgWmFnbyA8ZnJhbmtAemFnby5uZXQ+CiBMOglsaW51eC1tZWRpYUB2Z2VyLmtlcm5lbC5vcmcKQEAgLTU1OTEsMTAgKzU3MTMsOSBAQAogCiBIT1NUIEFQIERSSVZFUgogTToJSm91bmkgTWFsaW5lbiA8akB3MS5maT4KLUw6CWhvc3RhcEBzaG1vby5jb20gKHN1YnNjcmliZXJzLW9ubHkpCiBMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly9ob3N0YXAuZXBpdGVzdC5maS8KLVM6CU1haW50YWluZWQKK1c6CWh0dHA6Ly93MS5maS9ob3N0YXAtZHJpdmVyLmh0bWwKK1M6CU9ic29sZXRlCiBGOglkcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9ob3N0YXAvCiAKIEhQIENPTVBBUSBUQzExMDAgVEFCTEVUIFdNSSBFWFRSQVMgRFJJVkVSCkBAIC01NjMxLDcgKzU3NTIsNyBAQAogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zcmUvbGludXgtaHNpLmdpdAogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtaHNpCi1GOglEb2N1bWVudGF0aW9uL2hzaS50eHQKK0Y6CURvY3VtZW50YXRpb24vZGV2aWNlLWRyaXZlcnMvc2VyaWFsLWludGVyZmFjZXMucnN0CiBGOglkcml2ZXJzL2hzaS8KIEY6CWluY2x1ZGUvbGludXgvaHNpLwogRjoJaW5jbHVkZS91YXBpL2xpbnV4L2hzaS8KQEAgLTU2ODUsNiArNTgwNiw4IEBACiBGOglEb2N1bWVudGF0aW9uL2kyYy9pMmMtdG9wb2xvZ3kKIEY6CURvY3VtZW50YXRpb24vaTJjL211eGVzLwogRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtbXV4KgorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtYXJiKgorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtZ2F0ZSoKIEY6CWRyaXZlcnMvaTJjL2kyYy1tdXguYwogRjoJZHJpdmVycy9pMmMvbXV4ZXMvCiBGOglpbmNsdWRlL2xpbnV4L2kyYy1tdXguaApAQCAtNjEwMiw2ICs2MjI1LDEzIEBACiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvaWRsZS9pbnRlbF9pZGxlLmMKIAorSU5URUwgSU5URUdSQVRFRCBTRU5TT1IgSFVCIERSSVZFUgorTToJU3Jpbml2YXMgUGFuZHJ1dmFkYSA8c3Jpbml2YXMucGFuZHJ1dmFkYUBsaW51eC5pbnRlbC5jb20+CitNOglKaXJpIEtvc2luYSA8amlrb3NAa2VybmVsLm9yZz4KK0w6CWxpbnV4LWlucHV0QHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC8KKwogSU5URUwgUFNUQVRFIERSSVZFUgogTToJU3Jpbml2YXMgUGFuZHJ1dmFkYSA8c3Jpbml2YXMucGFuZHJ1dmFkYUBsaW51eC5pbnRlbC5jb20+CiBNOglMZW4gQnJvd24gPGxlbmJAa2VybmVsLm9yZz4KQEAgLTYxMTAsNyArNjI0MCw3IEBACiBGOglkcml2ZXJzL2NwdWZyZXEvaW50ZWxfcHN0YXRlLmMKIAogSU5URUwgRlJBTUVCVUZGRVIgRFJJVkVSIChleGNsdWRpbmcgODEwIGFuZCA4MTUpCi1NOglNYWlrIEJyb2VtbWUgPG1icm9lbW1lQHBsdXNzZXJ2ZXIuZGU+CitNOglNYWlrIEJyb2VtbWUgPG1icm9lbW1lQGxpYm1wcS5vcmc+CiBMOglsaW51eC1mYmRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vZmIvaW50ZWxmYi50eHQKQEAgLTY2MTIsNyArNjc0Miw3IEBACiBTOglNYWludGFpbmVkCiBGOglhcmNoLyovaW5jbHVkZS9hc20va2FzYW4uaAogRjoJYXJjaC8qL21tL2thc2FuX2luaXQqCi1GOglEb2N1bWVudGF0aW9uL2thc2FuLnR4dAorRjoJRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva2FzYW4ucnN0CiBGOglpbmNsdWRlL2xpbnV4L2thc2FuKi5oCiBGOglsaWIvdGVzdF9rYXNhbi5jCiBGOgltbS9rYXNhbi8KQEAgLTY4MjgsNyArNjk1OCw3IEBACiBNOglWZWdhcmQgTm9zc3VtIDx2ZWdhcmRub0BpZmkudWlvLm5vPgogTToJUGVra2EgRW5iZXJnIDxwZW5iZXJnQGtlcm5lbC5vcmc+CiBTOglNYWludGFpbmVkCi1GOglEb2N1bWVudGF0aW9uL2ttZW1jaGVjay50eHQKK0Y6CURvY3VtZW50YXRpb24vZGV2LXRvb2xzL2ttZW1jaGVjay5yc3QKIEY6CWFyY2gveDg2L2luY2x1ZGUvYXNtL2ttZW1jaGVjay5oCiBGOglhcmNoL3g4Ni9tbS9rbWVtY2hlY2svCiBGOglpbmNsdWRlL2xpbnV4L2ttZW1jaGVjay5oCkBAIC02ODM3LDcgKzY5NjcsNyBAQAogS01FTUxFQUsKIE06CUNhdGFsaW4gTWFyaW5hcyA8Y2F0YWxpbi5tYXJpbmFzQGFybS5jb20+CiBTOglNYWludGFpbmVkCi1GOglEb2N1bWVudGF0aW9uL2ttZW1sZWFrLnR4dAorRjoJRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva21lbWxlYWsucnN0CiBGOglpbmNsdWRlL2xpbnV4L2ttZW1sZWFrLmgKIEY6CW1tL2ttZW1sZWFrLmMKIEY6CW1tL2ttZW1sZWFrLXRlc3QuYwpAQCAtNzQ1MCw5ICs3NTgwLDggQEAKIEY6CWRyaXZlcnMvaHdtb24vbWF4MjA3NTEuYwogCiBNQVg2NjUwIEhBUkRXQVJFIE1PTklUT1IgQU5EIEZBTiBDT05UUk9MTEVSIERSSVZFUgotTToJIkhhbnMgSi4gS29jaCIgPGhqa0BoYW5zamtvY2guZGU+CiBMOglsaW51eC1od21vbkB2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKK1M6CU9ycGhhbgogRjoJRG9jdW1lbnRhdGlvbi9od21vbi9tYXg2NjUwCiBGOglkcml2ZXJzL2h3bW9uL21heDY2NTAuYwogCkBAIC03NDczLDExICs3NjAyLDEyIEBACiBGOglzb3VuZC9zb2MvY29kZWNzL21heDk4NjAuKgogCiBNQVhJTSBNVUlDIENIQVJHRVIgRFJJVkVSUyBGT1IgRVhZTk9TIEJBU0VEIEJPQVJEUwotTToJS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CitNOglLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CitNOglCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxiLnpvbG5pZXJraWVAc2Ftc3VuZy5jb20+CiBMOglsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAotRjoJZHJpdmVycy9wb3dlci9tYXgxNDU3N19jaGFyZ2VyLmMKLUY6CWRyaXZlcnMvcG93ZXIvbWF4Nzc2OTNfY2hhcmdlci5jCitGOglkcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXgxNDU3N19jaGFyZ2VyLmMKK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5L21heDc3NjkzX2NoYXJnZXIuYwogCiBNQVhJTSBNQVg3NzgwMiBNVUxUSUZVTkNUSU9OIFBNSUMgREVWSUNFIERSSVZFUlMKIE06CUphdmllciBNYXJ0aW5leiBDYW5pbGxhcyA8amF2aWVyQG9zZy5zYW1zdW5nLmNvbT4KQEAgLTc0ODksNyArNzYxOSw4IEBACiAKIE1BWElNIFBNSUMgQU5EIE1VSUMgRFJJVkVSUyBGT1IgRVhZTk9TIEJBU0VEIEJPQVJEUwogTToJQ2hhbndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+Ci1NOglLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KK006CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KK006CUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGIuem9sbmllcmtpZUBzYW1zdW5nLmNvbT4KIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy8qL21heDE0NTc3Ki5jCkBAIC03NTIxLDYgKzc2NTIsMTIgQEAKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvaWlvL3BvdGVudGlvbWV0ZXIvbWNwNDUzMS5jCiAKK01FQVNVUkVNRU5UIENPTVBVVElORyBDSU8tREFDIElJTyBEUklWRVIKK006CVdpbGxpYW0gQnJlYXRoaXR0IEdyYXkgPHZpbGhlbG0uZ3JheUBnbWFpbC5jb20+CitMOglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2lpby9kYWMvY2lvLWRhYy5jCisKIE1FRElBIERSSVZFUlMgRk9SIFJFTkVTQVMgLSBGQ1AKIE06CUxhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQucGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbT4KIEw6CWxpbnV4LW1lZGlhQHZnZXIua2VybmVsLm9yZwpAQCAtNzY3Myw2ICs3ODEwLDE5IEBACiBROglodHRwOi8vcGF0Y2h3b3JrLm96bGFicy5vcmcvcHJvamVjdC9uZXRkZXYvbGlzdC8KIEY6CWRyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3LwogCitNRUxMQU5PWCBNTFhDUExEIExFRCBEUklWRVIKK006CVZhZGltIFBhc3Rlcm5hayA8dmFkaW1wQG1lbGxhbm94LmNvbT4KK0w6CWxpbnV4LWxlZHNAdmdlci5rZXJuZWwub3JnCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvbGVkcy9sZWRzLW1seGNwbGQuYworRjoJRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHMtbWx4Y3BsZC50eHQKKworTUVMTEFOT1ggUExBVEZPUk0gRFJJVkVSCitNOiAgICAgIFZhZGltIFBhc3Rlcm5hayA8dmFkaW1wQG1lbGxhbm94LmNvbT4KK0w6ICAgICAgcGxhdGZvcm0tZHJpdmVyLXg4NkB2Z2VyLmtlcm5lbC5vcmcKK1M6ICAgICAgU3VwcG9ydGVkCitGOiAgICAgIGFyY2gveDg2L3BsYXRmb3JtL21lbGxhbm94L21seC1wbGF0Zm9ybS5jCisKIFNPRlQtUk9DRSBEUklWRVIgKHJ4ZSkKIE06CU1vbmkgU2hvdWEgPG1vbmlzQG1lbGxhbm94LmNvbT4KIEw6CWxpbnV4LXJkbWFAdmdlci5rZXJuZWwub3JnCkBAIC03NzU4LDYgKzc5MDgsMTIgQEAKIFM6CVN1cHBvcnRlZAogRjoJYXJjaC9taWNyb2JsYXplLwogCitNSUNST0NISVAgLyBBVE1FTCBBVDkxIC8gQVQzMiBTRVJJQUwgRFJJVkVSCitNOglSaWNoYXJkIEdlbm91ZCA8cmljaGFyZC5nZW5vdWRAZ21haWwuY29tPgorUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCitGOglpbmNsdWRlL2xpbnV4L2F0bWVsX3NlcmlhbC5oCisKIE1JQ1JPU09GVCBTVVJGQUNFIFBSTyAzIEJVVFRPTiBEUklWRVIKIE06CUNoZW4gWXUgPHl1LmMuY2hlbkBpbnRlbC5jb20+CiBMOglwbGF0Zm9ybS1kcml2ZXIteDg2QHZnZXIua2VybmVsLm9yZwpAQCAtNzg0NCw2ICs4MDAwLDE4IEBACiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL21seDkwNjE0LmMKIAorTUlDUk9TRU1JIFNNQVJUIEFSUkFZIFNNQVJUUFFJIERSSVZFUiAoc21hcnRwcWkpCitNOglEb24gQnJhY2UgPGRvbi5icmFjZUBtaWNyb3NlbWkuY29tPgorTDoJZXNjLnN0b3JhZ2VkZXZAbWljcm9zZW1pLmNvbQorTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9zY3NpL3NtYXJ0cHFpL3NtYXJ0cHFpKi5bY2hdCitGOglkcml2ZXJzL3Njc2kvc21hcnRwcWkvS2NvbmZpZworRjoJZHJpdmVycy9zY3NpL3NtYXJ0cHFpL01ha2VmaWxlCitGOglpbmNsdWRlL2xpbnV4L2NjaXNzKi5oCitGOglpbmNsdWRlL3VhcGkvbGludXgvY2Npc3MqLmgKK0Y6CURvY3VtZW50YXRpb24vc2NzaS9zbWFydHBxaS50eHQKKwogTU44ODQ3MiBNRURJQSBEUklWRVIKIE06CUFudHRpIFBhbG9zYWFyaSA8Y3JvcGVAaWtpLmZpPgogTDoJbGludXgtbWVkaWFAdmdlci5rZXJuZWwub3JnCkBAIC03OTY5LDYgKzgxMzcsNyBAQAogTToJTGVlIEpvbmVzIDxsZWUuam9uZXNAbGluYXJvLm9yZz4KIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvbGVlL21mZC5naXQKIFM6CVN1cHBvcnRlZAorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC8KIEY6CWRyaXZlcnMvbWZkLwogRjoJaW5jbHVkZS9saW51eC9tZmQvCiAKQEAgLTgwNTUsMjAgKzgyMjQsMTYgQEAKIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL3Njc2kvZ19OQ1I1MzgwLnR4dAotRjoJRG9jdW1lbnRhdGlvbi9zY3NpL2R0YzN4ODAudHh0CiBGOglkcml2ZXJzL3Njc2kvTkNSNTM4MC4qCiBGOglkcml2ZXJzL3Njc2kvYXJtL2N1bWFuYV8xLmMKIEY6CWRyaXZlcnMvc2NzaS9hcm0vb2FrLmMKIEY6CWRyaXZlcnMvc2NzaS9hdGFyaV9zY3NpLioKIEY6CWRyaXZlcnMvc2NzaS9kbXgzMTkxZC5jCi1GOglkcml2ZXJzL3Njc2kvZHRjLioKIEY6CWRyaXZlcnMvc2NzaS9nX05DUjUzODAuKgogRjoJZHJpdmVycy9zY3NpL2dfTkNSNTM4MF9tbWlvLmMKIEY6CWRyaXZlcnMvc2NzaS9tYWNfc2NzaS4qCi1GOglkcml2ZXJzL3Njc2kvcGFzMTYuKgogRjoJZHJpdmVycy9zY3NpL3N1bjNfc2NzaS4qCiBGOglkcml2ZXJzL3Njc2kvc3VuM19zY3NpX3ZtZS5jCi1GOglkcml2ZXJzL3Njc2kvdDEyOC4qCiAKIE5DUiBEVUFMIDcwMCBTQ1NJIERSSVZFUiAoTUlDUk9DSEFOTkVMKQogTToJIkphbWVzIEUuSi4gQm90dG9tbGV5IiA8SmFtZXMuQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbT4KQEAgLTgxNjYsNiArODMzMSwxNSBAQAogVzoJaHR0cHM6Ly9mZWRvcmFob3N0ZWQub3JnL2Ryb3B3YXRjaC8KIEY6CW5ldC9jb3JlL2Ryb3BfbW9uaXRvci5jCiAKK05FVFdPUktJTkcgW0RTQV0KK006CUFuZHJldyBMdW5uIDxhbmRyZXdAbHVubi5jaD4KK006CVZpdmllbiBEaWRlbG90IDx2aXZpZW4uZGlkZWxvdEBzYXZvaXJmYWlyZWxpbnV4LmNvbT4KK006CUZsb3JpYW4gRmFpbmVsbGkgPGYuZmFpbmVsbGlAZ21haWwuY29tPgorUzoJTWFpbnRhaW5lZAorRjoJbmV0L2RzYS8KK0Y6CWluY2x1ZGUvbmV0L2RzYS5oCitGOglkcml2ZXJzL25ldC9kc2EvCisKIE5FVFdPUktJTkcgW0dFTkVSQUxdCiBNOgkiRGF2aWQgUy4gTWlsbGVyIiA8ZGF2ZW1AZGF2ZW1sb2Z0Lm5ldD4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKQEAgLTgzNDgsMTEgKzg1MjIsMTEgQEAKIEY6CWluY2x1ZGUvbGludXgvcG93ZXIvYnEyNDE1eF9jaGFyZ2VyLmgKIEY6CWluY2x1ZGUvbGludXgvcG93ZXIvYnEyN3h4eF9iYXR0ZXJ5LmgKIEY6CWluY2x1ZGUvbGludXgvcG93ZXIvaXNwMTcwNF9jaGFyZ2VyLmgKLUY6CWRyaXZlcnMvcG93ZXIvYnEyNDE1eF9jaGFyZ2VyLmMKLUY6CWRyaXZlcnMvcG93ZXIvYnEyN3h4eF9iYXR0ZXJ5LmMKLUY6CWRyaXZlcnMvcG93ZXIvYnEyN3h4eF9iYXR0ZXJ5X2kyYy5jCi1GOglkcml2ZXJzL3Bvd2VyL2lzcDE3MDRfY2hhcmdlci5jCi1GOglkcml2ZXJzL3Bvd2VyL3J4NTFfYmF0dGVyeS5jCitGOglkcml2ZXJzL3Bvd2VyL3N1cHBseS9icTI0MTV4X2NoYXJnZXIuYworRjoJZHJpdmVycy9wb3dlci9zdXBwbHkvYnEyN3h4eF9iYXR0ZXJ5LmMKK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5L2JxMjd4eHhfYmF0dGVyeV9pMmMuYworRjoJZHJpdmVycy9wb3dlci9zdXBwbHkvaXNwMTcwNF9jaGFyZ2VyLmMKK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5L3J4NTFfYmF0dGVyeS5jCiAKIE5UQiBEUklWRVIgQ09SRQogTToJSm9uIE1hc29uIDxqZG1hc29uQGt1ZHp1LnVzPgpAQCAtODc0MSw3ICs4OTE1LDcgQEAKIEY6CWluY2x1ZGUvbGludXgvb3Byb2ZpbGUuaAogCiBPUkFDTEUgQ0xVU1RFUiBGSUxFU1lTVEVNIDIgKE9DRlMyKQotTToJTWFyayBGYXNoZWggPG1mYXNoZWhAc3VzZS5jb20+CitNOglNYXJrIEZhc2hlaCA8bWZhc2hlaEB2ZXJzaXR5LmNvbT4KIE06CUpvZWwgQmVja2VyIDxqbGJlY0BldmlscGxhbi5vcmc+CiBMOglvY2ZzMi1kZXZlbEBvc3Mub3JhY2xlLmNvbSAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBXOglodHRwOi8vb2NmczIud2lraS5rZXJuZWwub3JnCkBAIC04ODUzLDYgKzkwMjcsNyBAQAogRjoJRG9jdW1lbnRhdGlvbi92aXJ0dWFsL3BhcmF2aXJ0X29wcy50eHQKIEY6CWFyY2gvKi9rZXJuZWwvcGFyYXZpcnQqCiBGOglhcmNoLyovaW5jbHVkZS9hc20vcGFyYXZpcnQuaAorRjoJaW5jbHVkZS9saW51eC9oeXBlcnZpc29yLmgKIAogUEFSSURFIERSSVZFUlMgRk9SIFBBUkFMTEVMIFBPUlQgSURFIERFVklDRVMKIE06CVRpbSBXYXVnaCA8dGltQGN5YmVyZWxrLm5ldD4KQEAgLTkxMDgsNiArOTI4MywxNSBAQAogRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9oaXNpbGljb24tcGNpZS50eHQKIEY6CWRyaXZlcnMvcGNpL2hvc3QvcGNpZS1oaXNpLmMKIAorUENJRSBEUklWRVIgRk9SIFJPQ0tDSElQCitNOglTaGF3biBMaW4gPHNoYXduLmxpbkByb2NrLWNoaXBzLmNvbT4KK006CVdlbnJ1aSBMaSA8d2VucnVpLmxpQHJvY2stY2hpcHMuY29tPgorTDoJbGludXgtcGNpQHZnZXIua2VybmVsLm9yZworTDoJbGludXgtcm9ja2NoaXBAbGlzdHMuaW5mcmFkZWFkLm9yZworUzoJTWFpbnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9yb2NrY2hpcC1wY2llLnR4dAorRjoJZHJpdmVycy9wY2kvaG9zdC9wY2llLXJvY2tjaGlwLmMKKwogUENJRSBEUklWRVIgRk9SIFFVQUxDT01NIE1TTQogTTogICAgIFN0YW5pbWlyIFZhcmJhbm92IDxzdmFyYmFub3ZAbW0tc29sLmNvbT4KIEw6ICAgICBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnCkBAIC05MjU1LDcgKzk0MzksNyBAQAogCiBQSU4gQ09OVFJPTExFUiAtIFNBTVNVTkcKIE06CVRvbWFzeiBGaWdhIDx0b21hc3ouZmlnYUBnbWFpbC5jb20+Ci1NOglLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KK006CUtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KIE06CVN5bHdlc3RlciBOYXdyb2NraSA8cy5uYXdyb2NraUBzYW1zdW5nLmNvbT4KIEw6CWxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBMOglsaW51eC1zYW1zdW5nLXNvY0B2Z2VyLmtlcm5lbC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQpAQCAtOTM1MSwxNiArOTUzNSwxMiBAQAogCiBQT1dFUiBTVVBQTFkgQ0xBU1MvU1VCU1lTVEVNIGFuZCBEUklWRVJTCiBNOglTZWJhc3RpYW4gUmVpY2hlbCA8c3JlQGtlcm5lbC5vcmc+Ci1NOglEbWl0cnkgRXJlbWluLVNvbGVuaWtvdiA8ZGJhcnlzaGtvdkBnbWFpbC5jb20+Ci1NOglEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CiBMOglsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmcKLVQ6CWdpdCBnaXQ6Ly9naXQuaW5mcmFkZWFkLm9yZy9iYXR0ZXJ5LTIuNi5naXQKK1Q6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvc3JlL2xpbnV4LXBvd2VyLXN1cHBseS5naXQKIFM6CU1haW50YWluZWQKLUY6CURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci8KLUY6CURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcl9zdXBwbHkvCitGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvc3VwcGx5LwogRjoJaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaAotRjoJZHJpdmVycy9wb3dlci8KLVg6CWRyaXZlcnMvcG93ZXIvYXZzLworRjoJZHJpdmVycy9wb3dlci9zdXBwbHkvCiAKIFBPV0VSIFNUQVRFIENPT1JESU5BVElPTiBJTlRFUkZBQ0UgKFBTQ0kpCiBNOglNYXJrIFJ1dGxhbmQgPG1hcmsucnV0bGFuZEBhcm0uY29tPgpAQCAtOTY5Niw2ICs5ODc2LDEyIEBACiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvCiAKK1FVQUxDT01NIEVNQUMgR0lHQUJJVCBFVEhFUk5FVCBEUklWRVIKK006CVRpbXVyIFRhYmkgPHRpbXVyQGNvZGVhdXJvcmEub3JnPgorTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjLworCiBRVUFMQ09NTSBIRVhBR09OIEFSQ0hJVEVDVFVSRQogTToJUmljaGFyZCBLdW8gPHJrdW9AY29kZWF1cm9yYS5vcmc+CiBMOglsaW51eC1oZXhhZ29uQHZnZXIua2VybmVsLm9yZwpAQCAtOTkxNiw2ICsxMDEwMiwxMiBAQAogRjoJRG9jdW1lbnRhdGlvbi9ycG1zZy50eHQKIEY6CWluY2x1ZGUvbGludXgvcnBtc2cuaAogCitSRU5FU0FTIENMT0NLIERSSVZFUlMKK006CUdlZXJ0IFV5dHRlcmhvZXZlbiA8Z2VlcnQrcmVuZXNhc0BnbGlkZXIuYmU+CitMOglsaW51eC1yZW5lc2FzLXNvY0B2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9jbGsvcmVuZXNhcy8KKwogUkVORVNBUyBFVEhFUk5FVCBEUklWRVJTCiBSOglTZXJnZWkgU2h0eWx5b3YgPHNlcmdlaS5zaHR5bHlvdkBjb2dlbnRlbWJlZGRlZC5jb20+CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCkBAIC05OTUxLDYgKzEwMTQzLDcgQEAKIAogUkhBU0hUQUJMRQogTToJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CitNOglIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglsaWIvcmhhc2h0YWJsZS5jCkBAIC0xMDA5NCw4ICsxMDI4Nyw4IEBACiBGOglkcml2ZXJzL3MzOTAvY2lvLwogCiBTMzkwIERBU0QgRFJJVkVSCi1NOglTdGVmYW4gV2Vpbmh1YmVyIDx3ZWluQGRlLmlibS5jb20+Ci1NOglTdGVmYW4gSGFiZXJsYW5kIDxzdGVmYW4uaGFiZXJsYW5kQGRlLmlibS5jb20+CitNOglTdGVmYW4gSGFiZXJsYW5kIDxzdGhAbGludXgudm5ldC5pYm0uY29tPgorTToJSmFuIEhvZXBwbmVyIDxob2VwcG5lckBsaW51eC52bmV0LmlibS5jb20+CiBMOglsaW51eC1zMzkwQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpbnV4L2xpbnV4MzkwLwogUzoJU3VwcG9ydGVkCkBAIC0xMDE4OCw3ICsxMDM4MSw3IEBACiBGOglkcml2ZXJzL3BsYXRmb3JtL3g4Ni9zYW1zdW5nLWxhcHRvcC5jCiAKIFNBTVNVTkcgQVVESU8gKEFTb0MpIERSSVZFUlMKLU06CUtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgorTToJS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgogTToJU2FuZ2Jlb20gS2ltIDxzYmtpbTczQHNhbXN1bmcuY29tPgogTToJU3lsd2VzdGVyIE5hd3JvY2tpIDxzLm5hd3JvY2tpQHNhbXN1bmcuY29tPgogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKQEAgLTEwMjAzLDcgKzEwMzk2LDggQEAKIAogU0FNU1VORyBNVUxUSUZVTkNUSU9OIFBNSUMgREVWSUNFIERSSVZFUlMKIE06CVNhbmdiZW9tIEtpbSA8c2JraW03M0BzYW1zdW5nLmNvbT4KLU06CUtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgorTToJS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgorTToJQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Yi56b2xuaWVya2llQHNhbXN1bmcuY29tPgogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogTDoJbGludXgtc2Ftc3VuZy1zb2NAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKQEAgLTEwMjU4LDkgKzEwNDUyLDIzIEBACiBTQU1TVU5HIFNPQyBDTE9DSyBEUklWRVJTCiBNOglTeWx3ZXN0ZXIgTmF3cm9ja2kgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+CiBNOglUb21hc3ogRmlnYSA8dG9tYXN6LmZpZ2FAZ21haWwuY29tPgorTToJQ2hhbndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+CiBTOglTdXBwb3J0ZWQKIEw6CWxpbnV4LXNhbXN1bmctc29jQHZnZXIua2VybmVsLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCiBGOglkcml2ZXJzL2Nsay9zYW1zdW5nLworRjoJaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3MqLmgKK0Y6CURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9leHlub3MqLnR4dAorCitTQU1TVU5HIFNQSSBEUklWRVJTCitNOglLdWtqaW4gS2ltIDxrZ2VuZUBrZXJuZWwub3JnPgorTToJS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgorTToJQW5kaSBTaHl0aSA8YW5kaS5zaHl0aUBzYW1zdW5nLmNvbT4KK0w6CWxpbnV4LXNwaUB2Z2VyLmtlcm5lbC5vcmcKK0w6CWxpbnV4LXNhbXN1bmctc29jQHZnZXIua2VybmVsLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitTOglNYWludGFpbmVkCitGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1zYW1zdW5nLnR4dAorRjoJZHJpdmVycy9zcGkvc3BpLXMzYyoKK0Y6CWluY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9zcGktczNjNjR4eC5oCiAKIFNBTVNVTkcgU1hHQkUgRFJJVkVSUwogTToJQnl1bmdobyBBbiA8Ymg3NC5hbkBzYW1zdW5nLmNvbT4KQEAgLTEwMzQ3LDggKzEwNTU1LDggQEAKIFRJIEJRMjdYWFggUE9XRVIgU1VQUExZIERSSVZFUgogUjoJQW5kcmV3IEYuIERhdmlzIDxhZmRAdGkuY29tPgogRjoJaW5jbHVkZS9saW51eC9wb3dlci9icTI3eHh4X2JhdHRlcnkuaAotRjoJZHJpdmVycy9wb3dlci9icTI3eHh4X2JhdHRlcnkuYwotRjoJZHJpdmVycy9wb3dlci9icTI3eHh4X2JhdHRlcnlfaTJjLmMKK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5L2JxMjd4eHhfYmF0dGVyeS5jCitGOglkcml2ZXJzL3Bvd2VyL3N1cHBseS9icTI3eHh4X2JhdHRlcnlfaTJjLmMKIAogVElNRUtFRVBJTkcsIENMT0NLU09VUkNFIENPUkUsIE5UUCwgQUxBUk1USU1FUgogTToJSm9obiBTdHVsdHogPGpvaG4uc3R1bHR6QGxpbmFyby5vcmc+CkBAIC0xMDU3NiwxMiArMTA3ODQsMTIgQEAKIEY6CWRyaXZlcnMvbWlzYy9waGFudG9tLmMKIEY6CWluY2x1ZGUvdWFwaS9saW51eC9waGFudG9tLmgKIAotU0VSVkVSIEVOR0lORVMgMTBHYnBzIGlTQ1NJIC0gQmxhZGVFbmdpbmUgMiBEUklWRVIKLU06CUpheWFtb2hhbiBLYWxsaWNrYWwgPGpheWFtb2hhbi5rYWxsaWNrYWxAYXZhZ290ZWNoLmNvbT4KLU06CUtldGFuIE11a2FkYW0gPGtldGFuLm11a2FkYW1AYXZhZ290ZWNoLmNvbT4KLU06CUpvaG4gU29uaSBKb3NlIDxzb255LmpvaG5AYXZhZ290ZWNoLmNvbT4KK0VtdWxleCAxMEdicHMgaVNDU0kgLSBPbmVDb25uZWN0IERSSVZFUgorTToJU3ViYnUgU2VldGhhcmFtYW4gPHN1YmJ1LnNlZXRoYXJhbWFuQGJyb2FkY29tLmNvbT4KK006CUtldGFuIE11a2FkYW0gPGtldGFuLm11a2FkYW1AYnJvYWRjb20uY29tPgorTToJSml0ZW5kcmEgQmhpdmFyZSA8aml0ZW5kcmEuYmhpdmFyZUBicm9hZGNvbS5jb20+CiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwotVzoJaHR0cDovL3d3dy5hdmFnb3RlY2guY29tCitXOglodHRwOi8vd3d3LmJyb2FkY29tLmNvbQogUzoJU3VwcG9ydGVkCiBGOglkcml2ZXJzL3Njc2kvYmUyaXNjc2kvCiAKQEAgLTExMTA4LDYgKzExMzE2LDcgQEAKIEY6CWRyaXZlcnMvc3BpLwogRjoJaW5jbHVkZS9saW51eC9zcGkvCiBGOglpbmNsdWRlL3VhcGkvbGludXgvc3BpLworRjoJdG9vbHMvc3BpLwogCiBTUElERVJORVQgTkVUV09SSyBEUklWRVIgZm9yIENFTEwKIE06CUlzaGl6YWtpIEtvdSA8a291LmlzaGl6YWtpQHRvc2hpYmEuY28uanA+CkBAIC0xMTE3OCw2ICsxMTM4Nyw3IEBACiBTVEFHSU5HIC0gTFVTVFJFIFBBUkFMTEVMIEZJTEVTWVNURU0KIE06CU9sZWcgRHJva2luIDxvbGVnLmRyb2tpbkBpbnRlbC5jb20+CiBNOglBbmRyZWFzIERpbGdlciA8YW5kcmVhcy5kaWxnZXJAaW50ZWwuY29tPgorTToJSmFtZXMgU2ltbW9ucyA8anNpbW1vbnNAaW5mcmFkZWFkLm9yZz4KIEw6CWx1c3RyZS1kZXZlbEBsaXN0cy5sdXN0cmUub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFc6CWh0dHA6Ly93aWtpLmx1c3RyZS5vcmcvCiBTOglNYWludGFpbmVkCkBAIC0xMTIwNCwxMyArMTE0MTQsNiBAQAogUzoJT2RkIEZpeGVzCiBGOglkcml2ZXJzL3N0YWdpbmcvcnRsODcxMi8KIAotU1RBR0lORyAtIFJFQUxURUsgUlRMODcyM1UgV0lSRUxFU1MgRFJJVkVSCi1NOglMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+Ci1NOglKZXMgU29yZW5zZW4gPEplcy5Tb3JlbnNlbkByZWRoYXQuY29tPgotTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi1GOglkcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1LwotCiBTVEFHSU5HIC0gU0lMSUNPTiBNT1RJT04gU003NTAgRlJBTUUgQlVGRkVSIERSSVZFUgogTToJU3VkaXAgTXVraGVyamVlIDxzdWRpcG0ubXVraGVyamVlQGdtYWlsLmNvbT4KIE06CVRlZGR5IFdhbmcgPHRlZGR5LndhbmdAc2lsaWNvbm1vdGlvbi5jb20+CkBAIC0xMTI0MSwxMiArMTE0NDQsOCBAQAogRjoJZHJpdmVycy9zdGFnaW5nL3Z0NjY1Py8KIAogU1RBR0lORyAtIFdJTEMxMDAwIFdJRkkgRFJJVkVSCi1NOglKb2hubnkgS2ltIDxqb2hubnkua2ltQGF0bWVsLmNvbT4KLU06CUF1c3RpbiBTaGluIDxhdXN0aW4uc2hpbkBhdG1lbC5jb20+Ci1NOglDaHJpcyBQYXJrIDxjaHJpcy5wYXJrQGF0bWVsLmNvbT4KLU06CVRvbnkgQ2hvIDx0b255LmNob0BhdG1lbC5jb20+Ci1NOglHbGVuIExlZSA8Z2xlbi5sZWVAYXRtZWwuY29tPgotTToJTGVvIEtpbSA8bGVvLmtpbUBhdG1lbC5jb20+CitNOglBZGl0eWEgU2hhbmthciA8YWRpdHlhLnNoYW5rYXJAbWljcm9jaGlwLmNvbT4KK006CUdhbmVzaCBLcmlzaG5hIDxnYW5lc2gua3Jpc2huYUBtaWNyb2NoaXAuY29tPgogTDoJbGludXgtd2lyZWxlc3NAdmdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC8KQEAgLTExMzU0LDYgKzExNTUzLDE0IEBACiBTOglTdXBwb3J0ZWQKIEY6CWRyaXZlcnMvbWZkL3N5c2Nvbi5jCiAKK1NZU1RFTSBSRVNFVC9TSFVURE9XTiBEUklWRVJTCitNOglTZWJhc3RpYW4gUmVpY2hlbCA8c3JlQGtlcm5lbC5vcmc+CitMOglsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmcKK1Q6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvc3JlL2xpbnV4LXBvd2VyLXN1cHBseS5naXQKK1M6CU1haW50YWluZWQKK0Y6CURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlci9yZXNldC8KK0Y6CWRyaXZlcnMvcG93ZXIvcmVzZXQvCisKIFNZU1YgRklMRVNZU1RFTQogTToJQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgogUzoJTWFpbnRhaW5lZApAQCAtMTE2MTQsNyArMTE4MjEsNyBAQAogVEhFUk1BTC9DUFVfQ09PTElORwogTToJQW1pdCBEYW5pZWwgS2FjaGhhcCA8YW1pdC5rYWNoaGFwQGdtYWlsLmNvbT4KIE06CVZpcmVzaCBLdW1hciA8dmlyZXNoLmt1bWFyQGxpbmFyby5vcmc+Ci1NOglKYXZpIE1lcmlubyA8amF2aS5tZXJpbm9AYXJtLmNvbT4KK006CUphdmkgTWVyaW5vIDxqYXZpLm1lcmlub0BrZXJuZWwub3JnPgogTDoJbGludXgtcG1Admdlci5rZXJuZWwub3JnCiBTOglTdXBwb3J0ZWQKIEY6CURvY3VtZW50YXRpb24vdGhlcm1hbC9jcHUtY29vbGluZy1hcGkudHh0CkBAIC0xMTcwMiw3ICsxMTkwOSw3IEBACiBUSSBMUDg3MjcgQ0hBUkdFUiBEUklWRVIKIE06CU1pbG8gS2ltIDxtaWxvLmtpbUB0aS5jb20+CiBTOglNYWludGFpbmVkCi1GOglkcml2ZXJzL3Bvd2VyL2xwODcyN19jaGFyZ2VyLmMKK0Y6CWRyaXZlcnMvcG93ZXIvc3VwcGx5L2xwODcyN19jaGFyZ2VyLmMKIEY6CWluY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9scDg3MjcuaAogCiBUSSBMUDg3ODggTUZEIERSSVZFUgpAQCAtMTE3MTEsNyArMTE5MTgsNyBAQAogRjoJZHJpdmVycy9paW8vYWRjL2xwODc4OF9hZGMuYwogRjoJZHJpdmVycy9sZWRzL2xlZHMtbHA4Nzg4LmMKIEY6CWRyaXZlcnMvbWZkL2xwODc4OCouYwotRjoJZHJpdmVycy9wb3dlci9scDg3ODgtY2hhcmdlci5jCitGOglkcml2ZXJzL3Bvd2VyL3N1cHBseS9scDg3ODgtY2hhcmdlci5jCiBGOglkcml2ZXJzL3JlZ3VsYXRvci9scDg3ODgtKi5jCiBGOglpbmNsdWRlL2xpbnV4L21mZC9scDg3ODgqLmgKIApAQCAtMTE5ODAsMTIgKzEyMTg3LDYgQEAKIEY6CWRyaXZlcnMvdGMvCiBGOglpbmNsdWRlL2xpbnV4L3RjLmgKIAotVTE0LTM0RiBTQ1NJIERSSVZFUgotTToJRGFyaW8gQmFsbGFiaW8gPGJhbGxhYmlvX2RhcmlvQGVtYy5jb20+Ci1MOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwotUzoJTWFpbnRhaW5lZAotRjoJZHJpdmVycy9zY3NpL3UxNC0zNGYuYwotCiBVQkkgRklMRSBTWVNURU0gKFVCSUZTKQogTToJUmljaGFyZCBXZWluYmVyZ2VyIDxyaWNoYXJkQG5vZC5hdD4KIE06CUFydGVtIEJpdHl1dHNraXkgPGRlZGVraW5kMUBnbWFpbC5jb20+CkBAIC0xMjE4MSw3ICsxMjM4Miw3IEBACiBGOglkcml2ZXJzL25ldC91c2IvbGFuNzh4eC4qCiAKIFVTQiBNQVNTIFNUT1JBR0UgRFJJVkVSCi1NOglNYXR0aGV3IERoYXJtIDxtZGhhcm0tdXNiQG9uZS1leWVkLWFsaWVuLm5ldD4KK006CUFsYW4gU3Rlcm4gPHN0ZXJuQHJvd2xhbmQuaGFydmFyZC5lZHU+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCiBMOgl1c2Itc3RvcmFnZUBsaXN0cy5vbmUtZXllZC1hbGllbi5uZXQKIFM6CU1haW50YWluZWQKQEAgLTEyMjY1LDYgKzEyNDY2LDcgQEAKIFVTQiBTRVJJQUwgU1VCU1lTVEVNCiBNOglKb2hhbiBIb3ZvbGQgPGpvaGFuQGtlcm5lbC5vcmc+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2pvaGFuL3VzYi1zZXJpYWwuZ2l0CiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dAogRjoJZHJpdmVycy91c2Ivc2VyaWFsLwpAQCAtMTIyNzgsNiArMTI0ODAsNyBAQAogCiBVU0IgU01TQzk1WFggRVRIRVJORVQgRFJJVkVSCiBNOglTdGV2ZSBHbGVuZGlubmluZyA8c3RldmUuZ2xlbmRpbm5pbmdAc2hhd2VsbC5uZXQ+CitNOglNaWNyb2NoaXAgTGludXggRHJpdmVyIFN1cHBvcnQgPFVOR0xpbnV4RHJpdmVyQG1pY3JvY2hpcC5jb20+CiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL25ldC91c2Ivc21zYzk1eHguKgpAQCAtMTIzODQsNyArMTI1ODcsNiBAQAogRjoJZnMvaHBwZnMvCiAKIFVTRVJTUEFDRSBJL08gKFVJTykKLU06CSJIYW5zIEouIEtvY2giIDxoamtAaGFuc2prb2NoLmRlPgogTToJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4KIFM6CU1haW50YWluZWQKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvZ3JlZ2toL2NoYXItbWlzYy5naXQKQEAgLTEyNTY2LDcgKzEyNzY4LDcgQEAKIEY6CW5ldC84MDIxcS8KIAogVkxZTlEgQlVTCi1NOglGbG9yaWFuIEZhaW5lbGxpIDxmbG9yaWFuQG9wZW53cnQub3JnPgorTToJRmxvcmlhbiBGYWluZWxsaSA8Zi5mYWluZWxsaUBnbWFpbC5jb20+CiBMOglvcGVud3J0LWRldmVsQGxpc3RzLm9wZW53cnQub3JnIChzdWJzY3JpYmVycy1vbmx5KQogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy92bHlucS92bHlucS5jCkBAIC0xMjcxMiwxMiArMTI5MTQsNiBAQAogRjoJaW5jbHVkZS9saW51eC93YXRjaGRvZy5oCiBGOglpbmNsdWRlL3VhcGkvbGludXgvd2F0Y2hkb2cuaAogCi1XRDcwMDAgU0NTSSBEUklWRVIKLU06CU1pcm9zbGF2IFphZ29yYWMgPHphZ2FAZmx5LmNjLmZlci5ocj4KLUw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCi1TOglNYWludGFpbmVkCi1GOglkcml2ZXJzL3Njc2kvd2Q3MDAwLmMKLQogV0lJTU9URSBISUQgRFJJVkVSCiBNOglEYXZpZCBIZXJybWFubiA8ZGguaGVycm1hbm5AZ29vZ2xlbWFpbC5jb20+CiBMOglsaW51eC1pbnB1dEB2Z2VyLmtlcm5lbC5vcmcKQEAgLTEyNzg3LDcgKzEyOTgzLDcgQEAKIEY6CWRyaXZlcnMvbWZkL2FyaXpvbmEqCiBGOglkcml2ZXJzL21mZC93bSouYwogRjoJZHJpdmVycy9tZmQvY3M0N2wyNCoKLUY6CWRyaXZlcnMvcG93ZXIvd204MyouYworRjoJZHJpdmVycy9wb3dlci9zdXBwbHkvd204MyouYwogRjoJZHJpdmVycy9ydGMvcnRjLXdtODMqLmMKIEY6CWRyaXZlcnMvcmVndWxhdG9yL3dtOCouYwogRjoJZHJpdmVycy92aWRlby9iYWNrbGlnaHQvd204MypfYmwuYwpAQCAtMTI5MzksMTEgKzEzMTM1LDEwIEBACiBGOglkcml2ZXJzL3hlbi8qc3dpb3RsYioKIAogWEZTIEZJTEVTWVNURU0KLVA6CVNpbGljb24gR3JhcGhpY3MgSW5jCiBNOglEYXZlIENoaW5uZXIgPGRhdmlkQGZyb21vcmJpdC5jb20+Ci1NOgl4ZnNAb3NzLnNnaS5jb20KLUw6CXhmc0Bvc3Muc2dpLmNvbQotVzoJaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL3hmcworTToJbGludXgteGZzQHZnZXIua2VybmVsLm9yZworTDoJbGludXgteGZzQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3hmcy5vcmcvCiBUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2RnYy9saW51eC14ZnMuZ2l0CiBTOglTdXBwb3J0ZWQKIEY6CURvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMveGZzLnR4dApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCA2N2Y0MmQ1Li5hZGRiMjM1IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKIFZFUlNJT04gPSA0CiBQQVRDSExFVkVMID0gOAogU1VCTEVWRUwgPSAwCi1FWFRSQVZFUlNJT04gPSAtcmM0CitFWFRSQVZFUlNJT04gPQogTkFNRSA9IFBzeWNob3RpYyBTdG9uZWQgU2hlZXAKIAogIyAqRE9DVU1FTlRBVElPTioKQEAgLTE0MjUsNyArMTQyNSw3IEBACiAKICMgRG9jdW1lbnRhdGlvbiB0YXJnZXRzCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRE9DX1RBUkdFVFMgOj0geG1sZG9jcyBzZ21sZG9jcyBwc2RvY3MgcGRmZG9jcyBodG1sZG9jcyBtYW5kb2NzIGluc3RhbGxtYW5kb2NzIGVwdWJkb2NzIGNsZWFuZG9jcworRE9DX1RBUkdFVFMgOj0geG1sZG9jcyBzZ21sZG9jcyBwc2RvY3MgbGF0ZXhkb2NzIHBkZmRvY3MgaHRtbGRvY3MgbWFuZG9jcyBpbnN0YWxsbWFuZG9jcyBlcHViZG9jcyBjbGVhbmRvY3MKIFBIT05ZICs9ICQoRE9DX1RBUkdFVFMpCiAkKERPQ19UQVJHRVRTKTogc2NyaXB0c19iYXNpYyBGT1JDRQogCSQoUSkkKE1BS0UpICQoYnVpbGQpPXNjcmlwdHMgYnVpbGRfZG9jcHJvYyBidWlsZF9jaGVjay1sY19jdHlwZQpkaWZmIC0tZ2l0IGEvUkVBRE1FIGIvUkVBRE1FCmluZGV4IGU4YzhhNmQuLjA5ZjM0ZjcgMTAwNjQ0Ci0tLSBhL1JFQURNRQorKysgYi9SRUFETUUKQEAgLTIyOSwxMCArMjI5LDYgQEAKICAgICAgIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyBsZWFkIHRvIHByb2JsZW1zOiBwcm9iaW5nIGZvciBhCiAgICAgICBub25leGlzdGVudCBjb250cm9sbGVyIGNhcmQgbWF5IGNvbmZ1c2UgeW91ciBvdGhlciBjb250cm9sbGVycwogCi0gICAgLSBDb21waWxpbmcgdGhlIGtlcm5lbCB3aXRoICJQcm9jZXNzb3IgdHlwZSIgc2V0IGhpZ2hlciB0aGFuIDM4NgotICAgICAgd2lsbCByZXN1bHQgaW4gYSBrZXJuZWwgdGhhdCBkb2VzIE5PVCB3b3JrIG9uIGEgMzg2LiAgVGhlCi0gICAgICBrZXJuZWwgd2lsbCBkZXRlY3QgdGhpcyBvbiBib290dXAsIGFuZCBnaXZlIHVwLgotCiAgICAgLSBBIGtlcm5lbCB3aXRoIG1hdGgtZW11bGF0aW9uIGNvbXBpbGVkIGluIHdpbGwgc3RpbGwgdXNlIHRoZQogICAgICAgY29wcm9jZXNzb3IgaWYgb25lIGlzIHByZXNlbnQ6IHRoZSBtYXRoIGVtdWxhdGlvbiB3aWxsIGp1c3QKICAgICAgIG5ldmVyIGdldCB1c2VkIGluIHRoYXQgY2FzZS4gIFRoZSBrZXJuZWwgd2lsbCBiZSBzbGlnaHRseSBsYXJnZXIsCkBAIC0yODksNyArMjg1LDcgQEAKICAgIExPQ0FMVkVSU0lPTiBjYW4gYmUgc2V0IGluIHRoZSAiR2VuZXJhbCBTZXR1cCIgbWVudS4KIAogIC0gSW4gb3JkZXIgdG8gYm9vdCB5b3VyIG5ldyBrZXJuZWwsIHlvdSdsbCBuZWVkIHRvIGNvcHkgdGhlIGtlcm5lbAotICAgaW1hZ2UgKGUuZy4gLi4uL2xpbnV4L2FyY2gvaTM4Ni9ib290L2J6SW1hZ2UgYWZ0ZXIgY29tcGlsYXRpb24pCisgICBpbWFnZSAoZS5nLiAuLi4vbGludXgvYXJjaC94ODYvYm9vdC9iekltYWdlIGFmdGVyIGNvbXBpbGF0aW9uKQogICAgdG8gdGhlIHBsYWNlIHdoZXJlIHlvdXIgcmVndWxhciBib290YWJsZSBrZXJuZWwgaXMgZm91bmQuCiAKICAtIEJvb3RpbmcgYSBrZXJuZWwgZGlyZWN0bHkgZnJvbSBhIGZsb3BweSB3aXRob3V0IHRoZSBhc3Npc3RhbmNlIG9mIGEKQEAgLTM5MSw3ICszODcsNyBAQAogCiAgLSBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSBnZGIgb24gYSBydW5uaW5nIGtlcm5lbC4gKHJlYWQtb25seTsgaS5lLiB5b3UKICAgIGNhbm5vdCBjaGFuZ2UgdmFsdWVzIG9yIHNldCBicmVhayBwb2ludHMuKSBUbyBkbyB0aGlzLCBmaXJzdCBjb21waWxlIHRoZQotICAga2VybmVsIHdpdGggLWc7IGVkaXQgYXJjaC9pMzg2L01ha2VmaWxlIGFwcHJvcHJpYXRlbHksIHRoZW4gZG8gYSAibWFrZQorICAga2VybmVsIHdpdGggLWc7IGVkaXQgYXJjaC94ODYvTWFrZWZpbGUgYXBwcm9wcmlhdGVseSwgdGhlbiBkbyBhICJtYWtlCiAgICBjbGVhbiIuIFlvdSdsbCBhbHNvIG5lZWQgdG8gZW5hYmxlIENPTkZJR19QUk9DX0ZTICh2aWEgIm1ha2UgY29uZmlnIikuCiAKICAgIEFmdGVyIHlvdSd2ZSByZWJvb3RlZCB3aXRoIHRoZSBuZXcga2VybmVsLCBkbyAiZ2RiIHZtbGludXggL3Byb2Mva2NvcmUiLgpkaWZmIC0tZ2l0IGEvYXJjaC9LY29uZmlnIGIvYXJjaC9LY29uZmlnCmluZGV4IGU5YzkzMzQuLjE4MGVhMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvS2NvbmZpZworKysgYi9hcmNoL0tjb25maWcKQEAgLTMzNiwxNyArMzM2LDYgQEAKIAkgICAgcmVzdWx0cyBpbiB0aGUgc3lzdGVtIGNhbGwgYmVpbmcgc2tpcHBlZCBpbW1lZGlhdGVseS4KIAkgIC0gc2VjY29tcCBzeXNjYWxsIHdpcmVkIHVwCiAKLQkgIEZvciBiZXN0IHBlcmZvcm1hbmNlLCBhbiBhcmNoIHNob3VsZCB1c2Ugc2VjY29tcF9waGFzZTEgYW5kCi0JICBzZWNjb21wX3BoYXNlMiBkaXJlY3RseS4gIEl0IHNob3VsZCBjYWxsIHNlY2NvbXBfcGhhc2UxIGZvciBhbGwKLQkgIHN5c2NhbGxzIGlmIFRJRl9TRUNDT01QIGlzIHNldCwgYnV0IHNlY2NvbXBfcGhhc2UxIGRvZXMgbm90Ci0JICBuZWVkIHRvIGJlIGNhbGxlZCBmcm9tIGEgcHRyYWNlLXNhZmUgY29udGV4dC4gIEl0IG11c3QgdGhlbgotCSAgY2FsbCBzZWNjb21wX3BoYXNlMiBpZiBzZWNjb21wX3BoYXNlMSByZXR1cm5zIGFueXRoaW5nIG90aGVyCi0JICB0aGFuIFNFQ0NPTVBfUEhBU0UxX09LIG9yIFNFQ0NPTVBfUEhBU0UxX1NLSVAuCi0KLQkgIEFzIGFuIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9uLCBhbiBhcmNoIG1heSBwcm92aWRlIHNlY2NvbXBfZGF0YQotCSAgZGlyZWN0bHkgdG8gc2VjY29tcF9waGFzZTE7IHRoaXMgYXZvaWRzIG11bHRpcGxlIGNhbGxzCi0JICB0byB0aGUgc3lzY2FsbF94eXogaGVscGVycyBmb3IgZXZlcnkgc3lzY2FsbC4KLQogY29uZmlnIFNFQ0NPTVBfRklMVEVSCiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gSEFWRV9BUkNIX1NFQ0NPTVBfRklMVEVSICYmIFNFQ0NPTVAgJiYgTkVUCkBAIC03MDcsNCArNjk2LDM4IEBACiBjb25maWcgQ1BVX05PX0VGRklDSUVOVF9GRlMKIAlkZWZfYm9vbCBuCiAKK2NvbmZpZyBIQVZFX0FSQ0hfVk1BUF9TVEFDSworCWRlZl9ib29sIG4KKwloZWxwCisJICBBbiBhcmNoIHNob3VsZCBzZWxlY3QgdGhpcyBzeW1ib2wgaWYgaXQgY2FuIHN1cHBvcnQga2VybmVsIHN0YWNrcworCSAgaW4gdm1hbGxvYyBzcGFjZS4gIFRoaXMgbWVhbnM6CisKKwkgIC0gdm1hbGxvYyBzcGFjZSBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIG1hbnkga2VybmVsIHN0YWNrcy4KKwkgICAgVGhpcyBtYXkgcnVsZSBvdXQgbWFueSAzMi1iaXQgYXJjaGl0ZWN0dXJlcy4KKworCSAgLSBTdGFja3MgaW4gdm1hbGxvYyBzcGFjZSBuZWVkIHRvIHdvcmsgcmVsaWFibHkuICBGb3IgZXhhbXBsZSwgaWYKKwkgICAgdm1hcCBwYWdlIHRhYmxlcyBhcmUgY3JlYXRlZCBvbiBkZW1hbmQsIGVpdGhlciB0aGlzIG1lY2hhbmlzbQorCSAgICBuZWVkcyB0byB3b3JrIHdoaWxlIHRoZSBzdGFjayBwb2ludHMgdG8gYSB2aXJ0dWFsIGFkZHJlc3Mgd2l0aAorCSAgICB1bnBvcHVsYXRlZCBwYWdlIHRhYmxlcyBvciBhcmNoIGNvZGUgKHN3aXRjaF90bygpIGFuZCBzd2l0Y2hfbW0oKSwKKwkgICAgbW9zdCBsaWtlbHkpIG5lZWRzIHRvIGVuc3VyZSB0aGF0IHRoZSBzdGFjaydzIHBhZ2UgdGFibGUgZW50cmllcworCSAgICBhcmUgcG9wdWxhdGVkIGJlZm9yZSBydW5uaW5nIG9uIGEgcG9zc2libHkgdW5wb3B1bGF0ZWQgc3RhY2suCisKKwkgIC0gSWYgdGhlIHN0YWNrIG92ZXJmbG93cyBpbnRvIGEgZ3VhcmQgcGFnZSwgc29tZXRoaW5nIHJlYXNvbmFibGUKKwkgICAgc2hvdWxkIGhhcHBlbi4gIFRoZSBkZWZpbml0aW9uIG9mICJyZWFzb25hYmxlIiBpcyBmbGV4aWJsZSwgYnV0CisJICAgIGluc3RhbnRseSByZWJvb3Rpbmcgd2l0aG91dCBsb2dnaW5nIGFueXRoaW5nIHdvdWxkIGJlIHVuZnJpZW5kbHkuCisKK2NvbmZpZyBWTUFQX1NUQUNLCisJZGVmYXVsdCB5CisJYm9vbCAiVXNlIGEgdmlydHVhbGx5LW1hcHBlZCBzdGFjayIKKwlkZXBlbmRzIG9uIEhBVkVfQVJDSF9WTUFQX1NUQUNLICYmICFLQVNBTgorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSB0aGlzIGlmIHlvdSB3YW50IHRoZSB1c2UgdmlydHVhbGx5LW1hcHBlZCBrZXJuZWwgc3RhY2tzCisJICB3aXRoIGd1YXJkIHBhZ2VzLiAgVGhpcyBjYXVzZXMga2VybmVsIHN0YWNrIG92ZXJmbG93cyB0byBiZQorCSAgY2F1Z2h0IGltbWVkaWF0ZWx5IHJhdGhlciB0aGFuIGNhdXNpbmcgZGlmZmljdWx0LXRvLWRpYWdub3NlCisJICBjb3JydXB0aW9uLgorCisJICBUaGlzIGlzIHByZXNlbnRseSBpbmNvbXBhdGlibGUgd2l0aCBLQVNBTiBiZWNhdXNlIEtBU0FOIGV4cGVjdHMKKwkgIHRoZSBzdGFjayB0byBtYXAgZGlyZWN0bHkgdG8gdGhlIEtBU0FOIHNoYWRvdyBtYXAgdXNpbmcgYSBmb3JtdWxhCisJICB0aGF0IGlzIGluY29ycmVjdCBpZiB0aGUgc3RhY2sgaXMgaW4gdm1hbGxvYyBzcGFjZS4KKwogc291cmNlICJrZXJuZWwvZ2Nvdi9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBjNDE5YjQzLi40NjZlNDJlIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMzcxLDE0ICszNzEsNiBAQAogCXJldHVybiBfX2N1X2xlbjsKIH0KIAotZXh0ZXJuIGlubGluZSBsb25nCi1fX2NvcHlfdG9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGxvbmcgbGVuLCBjb25zdCB2b2lkIF9fdXNlciAqdmFsaWRhdGUpCi17Ci0JaWYgKF9fYWNjZXNzX29rKCh1bnNpZ25lZCBsb25nKXZhbGlkYXRlLCBsZW4sIGdldF9mcygpKSkKLQkJbGVuID0gX19jb3B5X3RvZnJvbV91c2VyX25vY2hlY2sodG8sIGZyb20sIGxlbik7Ci0JcmV0dXJuIGxlbjsKLX0KLQogI2RlZmluZSBfX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbikJCQkJCVwKICh7CQkJCQkJCQkJXAogCV9fY2hrX3VzZXJfcHRyKHRvKTsJCQkJCQlcCkBAIC0zOTMsMTcgKzM4NSwyMiBAQAogI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKIAotCiBleHRlcm4gaW5saW5lIGxvbmcKIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIGxvbmcgbikKIHsKLQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKChfX2ZvcmNlIHZvaWQgKil0bywgZnJvbSwgbiwgdG8pOworCWlmIChsaWtlbHkoX19hY2Nlc3Nfb2soKHVuc2lnbmVkIGxvbmcpdG8sIG4sIGdldF9mcygpKSkpCisJCW4gPSBfX2NvcHlfdG9mcm9tX3VzZXJfbm9jaGVjaygoX19mb3JjZSB2b2lkICopdG8sIGZyb20sIG4pOworCXJldHVybiBuOwogfQogCiBleHRlcm4gaW5saW5lIGxvbmcKIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgbG9uZyBuKQogewotCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIChfX2ZvcmNlIHZvaWQgKilmcm9tLCBuLCBmcm9tKTsKKwlpZiAobGlrZWx5KF9fYWNjZXNzX29rKCh1bnNpZ25lZCBsb25nKWZyb20sIG4sIGdldF9mcygpKSkpCisJCW4gPSBfX2NvcHlfdG9mcm9tX3VzZXJfbm9jaGVjayh0bywgKF9fZm9yY2Ugdm9pZCAqKWZyb20sIG4pOworCWVsc2UKKwkJbWVtc2V0KHRvLCAwLCBuKTsKKwlyZXR1cm4gbjsKIH0KIAogZXh0ZXJuIHZvaWQgX19kb19jbGVhcl91c2VyKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvS2NvbmZpZyBiL2FyY2gvYXJjL0tjb25maWcKaW5kZXggMGQzZTU5Zi4uZWNkMTIzNyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvS2NvbmZpZworKysgYi9hcmNoL2FyYy9LY29uZmlnCkBAIC0xMyw3ICsxMyw3IEBACiAJc2VsZWN0IENMS1NSQ19PRgogCXNlbGVjdCBDTE9ORV9CQUNLV0FSRFMKIAlzZWxlY3QgQ09NTU9OX0NMSwotCXNlbGVjdCBHRU5FUklDX0FUT01JQzY0CisJc2VsZWN0IEdFTkVSSUNfQVRPTUlDNjQgaWYgIUlTQV9BUkNWMiB8fCAhKEFSQ19IQVNfTEw2NCAmJiBBUkNfSEFTX0xMU0MpCiAJc2VsZWN0IEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlzZWxlY3QgR0VORVJJQ19GSU5EX0ZJUlNUX0JJVAogCSMgZm9yIG5vdywgd2UgZG9uJ3QgbmVlZCBHRU5FUklDX0lSUV9QUk9CRSwgQ09ORklHX0dFTkVSSUNfSVJRX0NISVAKQEAgLTM1Myw4ICszNTMsOCBAQAogCiBjb25maWcgTk9ERVNfU0hJRlQKIAlpbnQgIk1heGltdW0gTlVNQSBOb2RlcyAoYXMgYSBwb3dlciBvZiAyKSIKLQlkZWZhdWx0ICIxIiBpZiAhRElTQ09OVElHTUVNCi0JZGVmYXVsdCAiMiIgaWYgRElTQ09OVElHTUVNCisJZGVmYXVsdCAiMCIgaWYgIURJU0NPTlRJR01FTQorCWRlZmF1bHQgIjEiIGlmIERJU0NPTlRJR01FTQogCWRlcGVuZHMgb24gTkVFRF9NVUxUSVBMRV9OT0RFUwogCS0tLWhlbHAtLS0KIAkgIEFjY2Vzc2luZyBtZW1vcnkgYmV5b25kIDFHQiAod2l0aCBvciB3L28gUEFFKSByZXF1aXJlcyAyIG1lbW9yeQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvTWFrZWZpbGUgYi9hcmNoL2FyYy9NYWtlZmlsZQppbmRleCA2MDFlZDE3Li5hYTgyZDEzIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9NYWtlZmlsZQorKysgYi9hcmNoL2FyYy9NYWtlZmlsZQpAQCAtNDcsNyArNDcsNiBAQAogCiB1cHRvX2djYzQ0ICAgIDo9ICAkKGNhbGwgY2MtaWZ2ZXJzaW9uLCAtbGUsIDA0MDQsIHkpCiBhdGxlYXN0X2djYzQ0IDo9ICAkKGNhbGwgY2MtaWZ2ZXJzaW9uLCAtZ2UsIDA0MDQsIHkpCi1hdGxlYXN0X2djYzQ4IDo9ICAkKGNhbGwgY2MtaWZ2ZXJzaW9uLCAtZ2UsIDA0MDgsIHkpCiAKIGNmbGFncy0kKGF0bGVhc3RfZ2NjNDQpCQkJKz0gLWZzZWN0aW9uLWFuY2hvcnMKIApAQCAtNjYsMTAgKzY1LDggQEAKIAogZW5kaWYKIAotIyBCeSBkZWZhdWx0IGdjYyA0LjggZ2VuZXJhdGVzIGR3YXJmNCB3aGljaCBrZXJuZWwgdW53aW5kZXIgY2FuJ3QgZ3JvawotaWZlcSAoJChhdGxlYXN0X2djYzQ4KSx5KQotY2ZsYWdzLSQoQ09ORklHX0FSQ19EVzJfVU5XSU5EKQkJKz0gLWdkd2FyZi0yCi1lbmRpZgorY2ZpIDo9ICQoY2FsbCBhcy1pbnN0ciwuY2ZpX3N0YXJ0cHJvY1xuLmNmaV9lbmRwcm9jLC1EQVJDX0RXMl9VTldJTkRfQVNfQ0ZJKQorY2ZsYWdzLSQoQ09ORklHX0FSQ19EVzJfVU5XSU5EKQkJKz0gLWZhc3luY2hyb25vdXMtdW53aW5kLXRhYmxlcyAkKGNmaSkKIAogaWZuZGVmIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRQogIyBHZW5lcmljIGJ1aWxkIHN5c3RlbSB1c2VzIC1PMiwgd2Ugd2FudCAtTzMKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL2FiaWxpc190YjEwMF9kdmsuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvYWJpbGlzX3RiMTAwX2R2ay5kdHMKaW5kZXggM2RkNmVkOS4uM2FjZjA0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvYWJpbGlzX3RiMTAwX2R2ay5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvYWJpbGlzX3RiMTAwX2R2ay5kdHMKQEAgLTI0LDYgKzI0LDcgQEAKIC9pbmNsdWRlLyAiYWJpbGlzX3RiMTAwLmR0c2kiCiAKIC8geworCW1vZGVsID0gImFiaWxpcyx0YjEwMCI7CiAJY2hvc2VuIHsKIAkJYm9vdGFyZ3MgPSAiZWFybHljb249dWFydDgyNTAsbW1pbzMyLDB4ZmYxMDAwMDAsOTYwMG44IGNvbnNvbGU9dHR5UzAsOTYwMG44IjsKIAl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvYWJpbGlzX3RiMTAxX2R2ay5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy9hYmlsaXNfdGIxMDFfZHZrLmR0cwppbmRleCAxY2Y1MWMyLi4zN2Q4OGM1IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9ib290L2R0cy9hYmlsaXNfdGIxMDFfZHZrLmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy9hYmlsaXNfdGIxMDFfZHZrLmR0cwpAQCAtMjQsNiArMjQsNyBAQAogL2luY2x1ZGUvICJhYmlsaXNfdGIxMDEuZHRzaSIKIAogLyB7CisJbW9kZWwgPSAiYWJpbGlzLHRiMTAxIjsKIAljaG9zZW4gewogCQlib290YXJncyA9ICJlYXJseWNvbj11YXJ0ODI1MCxtbWlvMzIsMHhmZjEwMDAwMCw5NjAwbjggY29uc29sZT10dHlTMCw5NjAwbjgiOwogCX07CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9heHMxMDEuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAxLmR0cwppbmRleCAzZjliMDU4Li5kOWI5YjlkIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9ib290L2R0cy9heHMxMDEuZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwMS5kdHMKQEAgLTEzLDYgKzEzLDcgQEAKIC9pbmNsdWRlLyAiYXhzMTB4X21iLmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsYXhzMTAxIjsKIAljb21wYXRpYmxlID0gInNucHMsYXhzMTAxIiwgInNucHMsYXJjLXNkcCI7CiAKIAljaG9zZW4gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAzLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwMy5kdHMKaW5kZXggZTZkMGUzMS4uZWM3ZmIyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAzLmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy9heHMxMDMuZHRzCkBAIC0xNiw2ICsxNiw3IEBACiAvaW5jbHVkZS8gImF4czEweF9tYi5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJzbnBzLGF4czEwMyI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLGF4czEwMyIsICJzbnBzLGFyYy1zZHAiOwogCiAJY2hvc2VuIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL2F4czEwM19pZHUuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAzX2lkdS5kdHMKaW5kZXggZjk5OWZlZi4uMDcwYzI5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAzX2lkdS5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvYXhzMTAzX2lkdS5kdHMKQEAgLTE2LDYgKzE2LDcgQEAKIC9pbmNsdWRlLyAiYXhzMTB4X21iLmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsYXhzMTAzLXNtcCI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLGF4czEwMyIsICJzbnBzLGFyYy1zZHAiOwogCiAJY2hvc2VuIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1fNzAwLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1fNzAwLmR0cwppbmRleCA2Mzk3MDUxLi5jZTBjY2QyMCAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbV83MDAuZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1fNzAwLmR0cwpAQCAtMTAsNiArMTAsNyBAQAogL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJzbnBzLG5zaW0iOwogCWNvbXBhdGlibGUgPSAic25wcyxuc2ltIjsKIAkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkjc2l6ZS1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1faHMuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbV9ocy5kdHMKaW5kZXggYmYwNWZlNS4uMzc3MmM0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbV9ocy5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbV9ocy5kdHMKQEAgLTEwLDYgKzEwLDcgQEAKIC9pbmNsdWRlLyAic2tlbGV0b25faHMuZHRzaSIKIAogLyB7CisJbW9kZWwgPSAic25wcyxuc2ltX2hzIjsKIAljb21wYXRpYmxlID0gInNucHMsbnNpbV9ocyI7CiAJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CiAJI3NpemUtY2VsbHMgPSA8Mj47CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltX2hzX2lkdS5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy9uc2ltX2hzX2lkdS5kdHMKaW5kZXggOTllYWJlMS4uNDg0MzRkN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1faHNfaWR1LmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy9uc2ltX2hzX2lkdS5kdHMKQEAgLTEwLDYgKzEwLDcgQEAKIC9pbmNsdWRlLyAic2tlbGV0b25faHNfaWR1LmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsbnNpbV9ocy1zbXAiOwogCWNvbXBhdGlibGUgPSAic25wcyxuc2ltX2hzIjsKIAlpbnRlcnJ1cHQtcGFyZW50ID0gPCZjb3JlX2ludGM+OwogCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaS5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaS5kdHMKaW5kZXggZTY1OWEzNC4uYmNmNjAzMSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2kuZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpLmR0cwpAQCAtMTAsNiArMTAsNyBAQAogL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgogCiAvIHsKKwltb2RlbCA9ICJzbnBzLG5zaW1vc2NpIjsKIAljb21wYXRpYmxlID0gInNucHMsbnNpbW9zY2kiOwogCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCSNzaXplLWNlbGxzID0gPDE+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2lfaHMuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2lfaHMuZHRzCmluZGV4IDE2Y2U1ZDYuLjE0YTcyN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpX2hzLmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaV9ocy5kdHMKQEAgLTEwLDYgKzEwLDcgQEAKIC9pbmNsdWRlLyAic2tlbGV0b25faHMuZHRzaSIKIAogLyB7CisJbW9kZWwgPSAic25wcyxuc2ltb3NjaV9ocyI7CiAJY29tcGF0aWJsZSA9ICJzbnBzLG5zaW1vc2NpX2hzIjsKIAkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkjc2l6ZS1jZWxscyA9IDwxPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpX2hzX2lkdS5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy9uc2ltb3NjaV9oc19pZHUuZHRzCmluZGV4IGNlOGRmYmMuLmNiZjY1YjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2Jvb3QvZHRzL25zaW1vc2NpX2hzX2lkdS5kdHMKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvbnNpbW9zY2lfaHNfaWR1LmR0cwpAQCAtMTAsNiArMTAsNyBAQAogL2luY2x1ZGUvICJza2VsZXRvbl9oc19pZHUuZHRzaSIKIAogLyB7CisJbW9kZWwgPSAic25wcyxuc2ltb3NjaV9ocy1zbXAiOwogCWNvbXBhdGlibGUgPSAic25wcyxuc2ltb3NjaV9ocyI7CiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MT47CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy92ZGtfaHMzOC5kdHMgYi9hcmNoL2FyYy9ib290L2R0cy92ZGtfaHMzOC5kdHMKaW5kZXggNWQ4MDNkZC4uM2M1MTEwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvdmRrX2hzMzguZHRzCisrKyBiL2FyY2gvYXJjL2Jvb3QvZHRzL3Zka19oczM4LmR0cwpAQCAtMTMsNiArMTMsNyBAQAogL2luY2x1ZGUvICJ2ZGtfYXhzMTB4X21iLmR0c2kiCiAKIC8geworCW1vZGVsID0gInNucHMsdmRrX2FyY2hzIjsKIAljb21wYXRpYmxlID0gInNucHMsYXhzMTAzIjsKIAogCWNob3NlbiB7CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy92ZGtfaHMzOF9zbXAuZHRzIGIvYXJjaC9hcmMvYm9vdC9kdHMvdmRrX2hzMzhfc21wLmR0cwppbmRleCAyYmE2MGMzOS4uNmJlNjgwMCAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvYm9vdC9kdHMvdmRrX2hzMzhfc21wLmR0cworKysgYi9hcmNoL2FyYy9ib290L2R0cy92ZGtfaHMzOF9zbXAuZHRzCkBAIC0xMyw2ICsxMyw3IEBACiAvaW5jbHVkZS8gInZka19heHMxMHhfbWIuZHRzaSIKIAogLyB7CisJbW9kZWwgPSAic25wcyx2ZGtfYXJjaHMtc21wIjsKIAljb21wYXRpYmxlID0gInNucHMsYXhzMTAzIjsKIAogCWNob3NlbiB7CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9ib290L2R0cy96ZWJ1X2hzLmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL3plYnVfaHMuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMTMyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FyYy9ib290L2R0cy96ZWJ1X2hzLmR0cwpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2LTIwMTQgU3lub3BzeXMsIEluYy4gKHd3dy5zeW5vcHN5cy5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworL2R0cy12MS87CisKKy9pbmNsdWRlLyAic2tlbGV0b25faHMuZHRzaSIKKworLyB7CisJbW9kZWwgPSAic25wcyx6ZWJ1X2hzIjsKKwljb21wYXRpYmxlID0gInNucHMsemVidV9ocyI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmY29yZV9pbnRjPjsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDgwMDAwMDAwIDB4MjAwMDAwMDA+OwkvKiA1MTIgKi8KKwl9OworCisJY2hvc2VuIHsKKwkJYm9vdGFyZ3MgPSAiZWFybHljb249dWFydDgyNTAsbW1pbzMyLDB4ZjAwMDAwMDAsMTE1MjAwbjggY29uc29sZT10dHlTMCwxMTUyMDBuOCBkZWJ1ZyBwcmludC1mYXRhbC1zaWduYWxzPTEiOworCX07CisKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZ1YXJ0MDsKKwl9OworCisJZnBnYSB7CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKworCQkvKiBjaGlsZCBhbmQgcGFyZW50IGFkZHJlc3Mgc3BhY2UgMToxIG1hcHBlZCAqLworCQlyYW5nZXM7CisKKwkJY29yZV9jbGs6IGNvcmVfY2xrIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDUwMDAwMDAwPjsKKwkJfTsKKworCQljb3JlX2ludGM6IGludGVycnVwdC1jb250cm9sbGVyIHsKKwkJCWNvbXBhdGlibGUgPSAic25wcyxhcmNocy1pbnRjIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJfTsKKworCQl1YXJ0MDogc2VyaWFsQGYwMDAwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAibnM4MjUwIjsKKwkJCXJlZyA9IDwweGYwMDAwMDAwIDB4MjAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDI0PjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47CisJCQliYXVkID0gPDExNTIwMD47CisJCQlyZWctc2hpZnQgPSA8Mj47CisJCQlyZWctaW8td2lkdGggPSA8ND47CisJCQluby1sb29wYmFjay10ZXN0ID0gPDE+OworCQl9OworCisJCWFyY3BjdDA6IHBjdCB7CisJCQljb21wYXRpYmxlID0gInNucHMsYXJjaHMtcGN0IjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQlpbnRlcnJ1cHRzID0gPDIwPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2Jvb3QvZHRzL3plYnVfaHNfaWR1LmR0cyBiL2FyY2gvYXJjL2Jvb3QvZHRzL3plYnVfaHNfaWR1LmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTIwNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcmMvYm9vdC9kdHMvemVidV9oc19pZHUuZHRzCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYtMjAxNCBTeW5vcHN5cywgSW5jLiAod3d3LnN5bm9wc3lzLmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisvZHRzLXYxLzsKKworL2luY2x1ZGUvICJza2VsZXRvbl9oc19pZHUuZHRzaSIKKworLyB7CisJbW9kZWwgPSAic25wcyx6ZWJ1X2hzLXNtcCI7CisJY29tcGF0aWJsZSA9ICJzbnBzLHplYnVfaHMiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmNvcmVfaW50Yz47CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8MHg4MDAwMDAwMCAweDIwMDAwMDAwPjsJLyogNTEyICovCisJfTsKKworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gImVhcmx5Y29uPXVhcnQ4MjUwLG1taW8zMiwweGYwMDAwMDAwLDExNTIwMG44IGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggZGVidWciOworCX07CisKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZ1YXJ0MDsKKwl9OworCisJZnBnYSB7CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKworCQkvKiBjaGlsZCBhbmQgcGFyZW50IGFkZHJlc3Mgc3BhY2UgMToxIG1hcHBlZCAqLworCQlyYW5nZXM7CisKKwkJY29yZV9jbGs6IGNvcmVfY2xrIHsKKwkJCSNjbG9jay1jZWxscyA9IDwwPjsKKwkJCWNvbXBhdGlibGUgPSAiZml4ZWQtY2xvY2siOworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDUwMDAwMDAwPjsJLyogNTAgTUhaICovCisJCX07CisKKwkJY29yZV9pbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlciB7CisJCQljb21wYXRpYmxlID0gInNucHMsYXJjaHMtaW50YyI7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisvKgkJCWludGVycnVwdHMgPSA8MTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjU+OyAqLworCQl9OworCisJCWlkdV9pbnRjOiBpZHUtaW50ZXJydXB0LWNvbnRyb2xsZXIgeworCQkJY29tcGF0aWJsZSA9ICJzbnBzLGFyY2hzLWlkdS1pbnRjIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmY29yZV9pbnRjPjsKKwkJCS8qIDxod2lycSAgZGlzdHJpYnV0aW9uPgorCQkJZGlzdHJpYnV0aW9uOiAwPVJSOyAxPWNwdTAsIDI9Y3B1MSwgND1jcHUyLCA4PWNwdTMgKi8KKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQlpbnRlcnJ1cHRzID0gPDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxPjsKKworCQl9OworCisJCXVhcnQwOiBzZXJpYWxAZjAwMDAwMDAgeworCQkJLyogY29tcGF0aWJsZSA9ICJuczgyNTAiOyBEb2Vzbid0IHVzZSBGSUZPcyAqLworCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwYSI7CisJCQlyZWcgPSA8MHhmMDAwMDAwMCAweDIwMDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaWR1X2ludGM+OworCQkJLyogaW50ZXJydXB0cyA9IDwwIDE+OyAgREVTVD0xKi8KKwkJCS8qIGludGVycnVwdHMgPSA8MCAyPjsgIERFU1Q9MiovCisJCQlpbnRlcnJ1cHRzID0gPDAgMD47ICAvKiBSUiovCisJCQljbG9jay1mcmVxdWVuY3kgPSA8NTAwMDAwMDA+OworCQkJYmF1ZCA9IDwxMTUyMDA+OworCQkJcmVnLXNoaWZ0ID0gPDI+OworCQkJcmVnLWlvLXdpZHRoID0gPDQ+OworCQkJbm8tbG9vcGJhY2stdGVzdCA9IDwxPjsKKwkJfTsKKworCQlhcmNwY3QwOiBwY3QgeworCQkJY29tcGF0aWJsZSA9ICJzbnBzLGFyY2hzLXBjdCI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJaW50ZXJydXB0cyA9IDwyMD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9jb25maWdzL2F4czEwMV9kZWZjb25maWcgYi9hcmNoL2FyYy9jb25maWdzL2F4czEwMV9kZWZjb25maWcKaW5kZXggNmNkZmZlYS4uMGEwZWFmMCAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvY29uZmlncy9heHMxMDFfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJjL2NvbmZpZ3MvYXhzMTAxX2RlZmNvbmZpZwpAQCAtMTgsNiArMTgsOSBAQAogIyBDT05GSUdfU0xVQl9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRD15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CiBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKIENPTkZJR19BUkNfUExBVF9BWFMxMFg9eQogQ09ORklHX0FYUzEwMT15CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9jb25maWdzL2F4czEwM19kZWZjb25maWcgYi9hcmNoL2FyYy9jb25maWdzL2F4czEwM19kZWZjb25maWcKaW5kZXggNDkxYjNiNS4uMjIzM2Y1NyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvY29uZmlncy9heHMxMDNfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJjL2NvbmZpZ3MvYXhzMTAzX2RlZmNvbmZpZwpAQCAtMTgsNiArMTgsOSBAQAogIyBDT05GSUdfU0xVQl9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRD15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CitDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15CiBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKIENPTkZJR19BUkNfUExBVF9BWFMxMFg9eQogQ09ORklHX0FYUzEwMz15CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9jb25maWdzL2F4czEwM19zbXBfZGVmY29uZmlnIGIvYXJjaC9hcmMvY29uZmlncy9heHMxMDNfc21wX2RlZmNvbmZpZwppbmRleCBiMjVlZTczLi4xMTA4NzQ3IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9jb25maWdzL2F4czEwM19zbXBfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJjL2NvbmZpZ3MvYXhzMTAzX3NtcF9kZWZjb25maWcKQEAgLTE4LDYgKzE4LDkgQEAKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogQ09ORklHX1NMQUI9eQogQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQogQ09ORklHX0FSQ19QTEFUX0FYUzEwWD15CiBDT05GSUdfQVhTMTAzPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2NvbmZpZ3MvbnNpbV9oc19kZWZjb25maWcgYi9hcmNoL2FyYy9jb25maWdzL25zaW1faHNfZGVmY29uZmlnCmluZGV4IGE5OWRjN2EuLjY1YWI5ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2NvbmZpZ3MvbnNpbV9oc19kZWZjb25maWcKKysrIGIvYXJjaC9hcmMvY29uZmlncy9uc2ltX2hzX2RlZmNvbmZpZwpAQCAtMTEsMTMgKzExLDE2IEBACiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lOSVRSRD15Ci1DT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iLi4vYXJjX2luaXRyYW1mc19ocy8iCitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iLi4vLi4vYXJjX2luaXRyYW1mc19ocy8iCiBDT05GSUdfS0FMTFNZTVNfQUxMPXkKIENPTkZJR19FTUJFRERFRD15CiAjIENPTkZJR19TTFVCX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogQ09ORklHX0tQUk9CRVM9eQogQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKICMgQ09ORklHX0xCREFGIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvY29uZmlncy9uc2ltX2hzX3NtcF9kZWZjb25maWcgYi9hcmNoL2FyYy9jb25maWdzL25zaW1faHNfc21wX2RlZmNvbmZpZwppbmRleCA1OWYyMjFmLi4zYjM5OTBjIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9jb25maWdzL25zaW1faHNfc21wX2RlZmNvbmZpZworKysgYi9hcmNoL2FyYy9jb25maWdzL25zaW1faHNfc21wX2RlZmNvbmZpZwpAQCAtMTYsNiArMTYsOSBAQAogIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfS1BST0JFUz15CiBDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX0ZPUkNFX0xPQUQ9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQogIyBDT05GSUdfTEJEQUYgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9jb25maWdzL3plYnVfaHNfZGVmY29uZmlnIGIvYXJjaC9hcmMvY29uZmlncy96ZWJ1X2hzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjYxNjZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcmMvY29uZmlncy96ZWJ1X2hzX2RlZmNvbmZpZwpAQCAtMCwwICsxLDg2IEBACitDT05GSUdfREVGQVVMVF9IT1NUTkFNRT0iQVJDTGludXgiCisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQorIyBDT05GSUdfQ1JPU1NfTUVNT1JZX0FUVEFDSCBpcyBub3Qgc2V0CitDT05GSUdfTk9fSFpfSURMRT15CitDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTkFNRVNQQUNFUz15CisjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAorIyBDT05GSUdfUElEX05TIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lOSVRSRD15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iLi4vLi4vYXJjX2luaXRyYW1mc19ocy8iCitDT05GSUdfRVhQRVJUPXkKK0NPTkZJR19QRVJGX0VWRU5UUz15CisjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKK0NPTkZJR19TTEFCPXkKK0NPTkZJR19NT0RVTEVTPXkKKyMgQ09ORklHX0xCREFGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorQ09ORklHX0FSQ19QTEFUX1NJTT15CitDT05GSUdfSVNBX0FSQ1YyPXkKK0NPTkZJR19BUkNfQlVJTFRJTl9EVEJfTkFNRT0iemVidV9ocyIKK0NPTkZJR19QUkVFTVBUPXkKKyMgQ09ORklHX0NPTVBBQ1RJT04gaXMgbm90IHNldAorQ09ORklHX05FVD15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfRElBRz15CitDT05GSUdfVU5JWD15CitDT05GSUdfVU5JWF9ESUFHPXkKK0NPTkZJR19ORVRfS0VZPXkKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZUTVBGUz15CisjIENPTkZJR19TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAorIyBDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVYgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfTkVUX1ZFTkRPUl9BUkMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9CUk9BRENPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0lOVEVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfTUFSVkVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX01JQ1JFTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TRUVRIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU1RNSUNSTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1dJWk5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9FVkRFVj15CitDT05GSUdfTU9VU0VfUFMyX1RPVUNIS0lUPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0FSQ19QUzI9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorIyBDT05GSUdfREVWS01FTSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTEKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTEKK0NPTkZJR19TRVJJQUxfODI1MF9EVz15CitDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNPXkKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CitDT05GSUdfRkI9eQorQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQorQ09ORklHX0xPR089eQorIyBDT05GSUdfSElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPTU1VX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX01JU0NfRklMRVNZU1RFTVMgaXMgbm90IHNldAorQ09ORklHX05GU19GUz15CisjIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CisjIENPTkZJR19ERUJVR19QUkVFTVBUIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2NvbmZpZ3MvemVidV9oc19zbXBfZGVmY29uZmlnIGIvYXJjaC9hcmMvY29uZmlncy96ZWJ1X2hzX3NtcF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlOTY5MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJjL2NvbmZpZ3MvemVidV9oc19zbXBfZGVmY29uZmlnCkBAIC0wLDAgKzEsODkgQEAKK0NPTkZJR19ERUZBVUxUX0hPU1ROQU1FPSJBUkNMaW51eCIKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CisjIENPTkZJR19DUk9TU19NRU1PUllfQVRUQUNIIGlzIG5vdCBzZXQKK0NPTkZJR19OT19IWl9JRExFPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0lLQ09ORklHPXkKK0NPTkZJR19JS0NPTkZJR19QUk9DPXkKK0NPTkZJR19OQU1FU1BBQ0VTPXkKKyMgQ09ORklHX1VUU19OUyBpcyBub3Qgc2V0CisjIENPTkZJR19QSURfTlMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIuLi8uLi9hcmNfaW5pdHJhbWZzX2hzLyIKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfUEVSRl9FVkVOVFM9eQorIyBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CitDT05GSUdfS1BST0JFUz15CitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19MQkRBRiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19BUkNfUExBVF9TSU09eQorQ09ORklHX0lTQV9BUkNWMj15CitDT05GSUdfU01QPXkKK0NPTkZJR19BUkNfQlVJTFRJTl9EVEJfTkFNRT0iemVidV9oc19pZHUiCitDT05GSUdfUFJFRU1QVD15CisjIENPTkZJR19DT01QQUNUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19ORVQ9eQorQ09ORklHX1BBQ0tFVD15CitDT05GSUdfUEFDS0VUX0RJQUc9eQorQ09ORklHX1VOSVg9eQorQ09ORklHX1VOSVhfRElBRz15CitDT05GSUdfTkVUX0tFWT15CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19XSVJFTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfREVWVE1QRlM9eQorIyBDT05GSUdfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJUk1XQVJFX0lOX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRERVZJQ0VTPXkKKyMgQ09ORklHX05FVF9WRU5ET1JfQVJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfQlJPQURDT00gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9JTlRFTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX01BUlZFTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NSUNSRUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU0VFUSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NUTUlDUk8gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9XSVpORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorQ09ORklHX01PVVNFX1BTMl9UT1VDSEtJVD15CisjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19BUkNfUFMyPXkKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0xCitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz0xCitDT05GSUdfU0VSSUFMXzgyNTBfRFc9eQorQ09ORklHX1NFUklBTF9PRl9QTEFURk9STT15CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorQ09ORklHX0ZCPXkKK0NPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFPXkKK0NPTkZJR19MT0dPPXkKKyMgQ09ORklHX0hJRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JT01NVV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19NSVNDX0ZJTEVTWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfRlM9eQorIyBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfTE9DS1VQX0RFVEVDVE9SPXkKKyMgQ09ORklHX0RFQlVHX1BSRUVNUFQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDBiMTBlZjIuLmMzMzI2MDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTI1LDYgKzI1LDcgQEAKIGdlbmVyaWMteSArPSBtbS1hcmNoLWhvb2tzLmgKIGdlbmVyaWMteSArPSBtbWFuLmgKIGdlbmVyaWMteSArPSBtc2didWYuaAorZ2VuZXJpYy15ICs9IG1zaS5oCiBnZW5lcmljLXkgKz0gcGFyYW0uaAogZ2VuZXJpYy15ICs9IHBhcnBvcnQuaAogZ2VuZXJpYy15ICs9IHBjaS5oCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9hcmNyZWdzLmggYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9hcmNyZWdzLmgKaW5kZXggN2ZiYWVhMC4uZGIyNWM2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vYXJjcmVncy5oCisrKyBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2FyY3JlZ3MuaApAQCAtOTUsNyArOTUsNyBAQAogLyogQXV4aWxpYXJ5IHJlZ2lzdGVycyAqLwogI2RlZmluZSBBVVhfSURFTlRJVFkJCTQKICNkZWZpbmUgQVVYX0lOVFJfVkVDX0JBU0UJMHgyNQotI2RlZmluZSBBVVhfTk9OX1ZPTAkJMHg1ZQorI2RlZmluZSBBVVhfVk9MCQkJMHg1ZQogCiAvKgogICogRmxvYXRpbmcgUHQgUmVnaXN0ZXJzCkBAIC0yNDAsMTQgKzI0MCw2IEBACiAjZW5kaWYKIH07CiAKLXN0cnVjdCBiY3JfcGVyaXAgewotI2lmZGVmIENPTkZJR19DUFVfQklHX0VORElBTgotCXVuc2lnbmVkIGludCBzdGFydDo4LCBwYWQyOjgsIHN6OjgsIHZlcjo4OwotI2Vsc2UKLQl1bnNpZ25lZCBpbnQgdmVyOjgsIHN6OjgsIHBhZDI6OCwgc3RhcnQ6ODsKLSNlbmRpZgotfTsKLQogc3RydWN0IGJjcl9pY2NtX2FyY29tcGFjdCB7CiAjaWZkZWYgQ09ORklHX0NQVV9CSUdfRU5ESUFOCiAJdW5zaWduZWQgaW50IGJhc2U6MTYsIHBhZDo1LCBzejozLCB2ZXI6ODsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggNGUzYzFiNi4uYjY1OTMwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpZm5kZWYgQ09ORklHX0FSQ19QTEFUX0VaTlBTCiAKICNkZWZpbmUgYXRvbWljX3JlYWQodikgIFJFQURfT05DRSgodiktPmNvdW50ZXIpCisjZGVmaW5lIEFUT01JQ19JTklUKGkpCXsgKGkpIH0KIAogI2lmZGVmIENPTkZJR19BUkNfSEFTX0xMU0MKIApAQCAtMjg0LDYgKzI4NSw3IEBACiBBVE9NSUNfT1BTKGFkZCwgKz0sIENUT1BfSU5TVF9BQUREX0RJX1IyX1IyX1IzKQogI2RlZmluZSBhdG9taWNfc3ViKGksIHYpIGF0b21pY19hZGQoLShpKSwgKHYpKQogI2RlZmluZSBhdG9taWNfc3ViX3JldHVybihpLCB2KSBhdG9taWNfYWRkX3JldHVybigtKGkpLCAodikpCisjZGVmaW5lIGF0b21pY19mZXRjaF9zdWIoaSwgdikgYXRvbWljX2ZldGNoX2FkZCgtKGkpLCAodikpCiAKICN1bmRlZiBBVE9NSUNfT1BTCiAjZGVmaW5lIEFUT01JQ19PUFMob3AsIGNfb3AsIGFzbV9vcCkJCQkJCVwKQEAgLTI5Miw2ICsyOTQsNyBAQAogCiBBVE9NSUNfT1BTKGFuZCwgJj0sIENUT1BfSU5TVF9BQU5EX0RJX1IyX1IyX1IzKQogI2RlZmluZSBhdG9taWNfYW5kbm90KG1hc2ssIHYpIGF0b21pY19hbmQofihtYXNrKSwgKHYpKQorI2RlZmluZSBhdG9taWNfZmV0Y2hfYW5kbm90KG1hc2ssIHYpIGF0b21pY19mZXRjaF9hbmQofihtYXNrKSwgKHYpKQogQVRPTUlDX09QUyhvciwgfD0sIENUT1BfSU5TVF9BT1JfRElfUjJfUjJfUjMpCiBBVE9NSUNfT1BTKHhvciwgXj0sIENUT1BfSU5TVF9BWE9SX0RJX1IyX1IyX1IzKQogCkBAIC0zNDMsMTAgKzM0NiwyNjYgQEAKIAogI2RlZmluZSBhdG9taWNfYWRkX25lZ2F0aXZlKGksIHYpCShhdG9taWNfYWRkX3JldHVybihpLCB2KSA8IDApCiAKLSNkZWZpbmUgQVRPTUlDX0lOSVQoaSkJCQl7IChpKSB9CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19BVE9NSUM2NAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXRvbWljNjQuaD4KIAotI2VuZGlmCisjZWxzZQkvKiBLY29uZmlnIGVuc3VyZXMgdGhpcyBpcyBvbmx5IGVuYWJsZWQgd2l0aCBuZWVkZWQgaC93IGFzc2lzdCAqLworCisvKgorICogQVJDdjIgc3VwcG9ydHMgNjQtYml0IGV4Y2x1c2l2ZSBsb2FkIChMTE9DS0QpIC8gc3RvcmUgKFNDT05ERCkKKyAqICAtIFRoZSBhZGRyZXNzIEhBUyB0byBiZSA2NC1iaXQgYWxpZ25lZAorICogIC0gVGhlcmUgYXJlIDIgc2VtYW50aWNzIGludm9sdmVkIGhlcmU6CisgKiAgICA9IGV4Y2x1c2l2ZSBpbXBsaWVzIG5vIGludGVyaW0gdXBkYXRlIGJldHdlZW4gbG9hZC9zdG9yZSB0byBzYW1lIGFkZHIKKyAqICAgID0gYm90aCB3b3JkcyBhcmUgb2JzZXJ2ZWQvdXBkYXRlZCB0b2dldGhlcjogdGhpcyBpcyBndWFyYW50ZWVkIGV2ZW4KKyAqICAgICAgZm9yIHJlZ3VsYXIgNjQtYml0IGxvYWQgKExERCkgLyBzdG9yZSAoU1REKS4gVGh1cyBhdG9taWM2NF9zZXQoKQorICogICAgICBpcyBOT1QgcmVxdWlyZWQgdG8gdXNlIExMT0NLRCtTQ09OREQsIFNURCBzdWZmaWNlcworICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlhbGlnbmVkX3U2NCBjb3VudGVyOworfSBhdG9taWM2NF90OworCisjZGVmaW5lIEFUT01JQzY0X0lOSVQoYSkgeyAoYSkgfQorCitzdGF0aWMgaW5saW5lIGxvbmcgbG9uZyBhdG9taWM2NF9yZWFkKGNvbnN0IGF0b21pYzY0X3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIJbGRkICAgJTAsIFslMV0JXG4iCisJOiAiPXIiKHZhbCkKKwk6ICJyIigmdi0+Y291bnRlcikpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pYzY0X3NldChhdG9taWM2NF90ICp2LCBsb25nIGxvbmcgYSkKK3sKKwkvKgorCSAqIFRoaXMgY291bGQgaGF2ZSBiZWVuIGEgc2ltcGxlIGFzc2lnbm1lbnQgaW4gIkMiIGJ1dCB3b3VsZCBuZWVkCisJICogZXhwbGljaXQgdm9sYXRpbGUuIE90aGVyd2lzZSBnY2Mgb3B0aW1pemVycyBjb3VsZCBlbGlkZSB0aGUgc3RvcmUKKwkgKiB3aGljaCBib3JrZWQgYXRvbWljNjQgc2VsZi10ZXN0CisJICogSW4gdGhlIGlubGluZSBhc20gdmVyc2lvbiwgbWVtb3J5IGNsb2JiZXIgbmVlZGVkIGZvciBleGFjdCBzYW1lCisJICogcmVhc29uLCB0byB0ZWxsIGdjYyBhYm91dCB0aGUgc3RvcmUuCisJICoKKwkgKiBUaGlzIGhvd2V2ZXIgaXMgbm90IG5lZWRlZCBmb3Igc2libGluZyBhdG9taWM2NF9hZGQoKSBldGMgc2luY2UgYm90aAorCSAqIGxvYWQvc3RvcmUgYXJlIGV4cGxpY2l0bHkgZG9uZSBpbiBpbmxpbmUgYXNtLiBBcyBsb25nIGFzIEFQSSBpcyB1c2VkCisJICogZm9yIGVhY2ggYWNjZXNzLCBnY2MgaGFzIG5vIHdheSB0byBvcHRpbWl6ZSBhd2F5IGFueSBsb2FkL3N0b3JlCisJICovCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJIglzdGQgICAlMCwgWyUxXQlcbiIKKwk6CisJOiAiciIoYSksICJyIigmdi0+Y291bnRlcikKKwk6ICJtZW1vcnkiKTsKK30KKworI2RlZmluZSBBVE9NSUM2NF9PUChvcCwgb3AxLCBvcDIpCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljNjRfIyNvcChsb25nIGxvbmcgYSwgYXRvbWljNjRfdCAqdikJCVwKK3sJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsJCQkJCQlcCisJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCSIxOgkJCQlcbiIJCQkJXAorCSIJbGxvY2tkICAlMCwgWyUxXQlcbiIJCQkJXAorCSIJIiAjb3AxICIgJUwwLCAlTDAsICVMMglcbiIJCQkJXAorCSIJIiAjb3AyICIgJUgwLCAlSDAsICVIMglcbiIJCQkJXAorCSIJc2NvbmRkICAgJTAsIFslMV0JXG4iCQkJCVwKKwkiCWJueiAgICAgMWIJCVxuIgkJCQlcCisJOiAiPSZyIih2YWwpCQkJCQkJCVwKKwk6ICJyIigmdi0+Y291bnRlciksICJpciIoYSkJCQkJCVwKKwk6ICJjYyIpOwkJCQkJCVwKK30JCQkJCQkJCQlcCisKKyNkZWZpbmUgQVRPTUlDNjRfT1BfUkVUVVJOKG9wLCBvcDEsIG9wMikJCSAgICAgICAgCVwKK3N0YXRpYyBpbmxpbmUgbG9uZyBsb25nIGF0b21pYzY0XyMjb3AjI19yZXR1cm4obG9uZyBsb25nIGEsIGF0b21pYzY0X3QgKnYpCVwKK3sJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsJCQkJCQlcCisJCQkJCQkJCQlcCisJc21wX21iKCk7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIjE6CQkJCVxuIgkJCQlcCisJIglsbG9ja2QgICAlMCwgWyUxXQlcbiIJCQkJXAorCSIJIiAjb3AxICIgJUwwLCAlTDAsICVMMglcbiIJCQkJXAorCSIJIiAjb3AyICIgJUgwLCAlSDAsICVIMglcbiIJCQkJXAorCSIJc2NvbmRkICAgJTAsIFslMV0JXG4iCQkJCVwKKwkiCWJueiAgICAgMWIJCVxuIgkJCQlcCisJOiBbdmFsXSAiPSZyIih2YWwpCQkJCQkJXAorCTogInIiKCZ2LT5jb3VudGVyKSwgImlyIihhKQkJCQkJXAorCTogImNjIik7CS8qIG1lbW9yeSBjbG9iYmVyIGNvbWVzIGZyb20gc21wX21iKCkgKi8JXAorCQkJCQkJCQkJXAorCXNtcF9tYigpOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIHZhbDsJCQkJCQkJXAorfQorCisjZGVmaW5lIEFUT01JQzY0X0ZFVENIX09QKG9wLCBvcDEsIG9wMikJCSAgICAgICAgCQlcCitzdGF0aWMgaW5saW5lIGxvbmcgbG9uZyBhdG9taWM2NF9mZXRjaF8jI29wKGxvbmcgbG9uZyBhLCBhdG9taWM2NF90ICp2KQlcCit7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWwsIG9yaWc7CQkJCQlcCisJCQkJCQkJCQlcCisJc21wX21iKCk7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCisJIjE6CQkJCVxuIgkJCQlcCisJIglsbG9ja2QgICAlMCwgWyUyXQlcbiIJCQkJXAorCSIJIiAjb3AxICIgJUwxLCAlTDAsICVMMwlcbiIJCQkJXAorCSIJIiAjb3AyICIgJUgxLCAlSDAsICVIMwlcbiIJCQkJXAorCSIJc2NvbmRkICAgJTEsIFslMl0JXG4iCQkJCVwKKwkiCWJueiAgICAgMWIJCVxuIgkJCQlcCisJOiAiPSZyIihvcmlnKSwgIj0mciIodmFsKQkJCQkJXAorCTogInIiKCZ2LT5jb3VudGVyKSwgImlyIihhKQkJCQkJXAorCTogImNjIik7CS8qIG1lbW9yeSBjbG9iYmVyIGNvbWVzIGZyb20gc21wX21iKCkgKi8JXAorCQkJCQkJCQkJXAorCXNtcF9tYigpOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIG9yaWc7CQkJCQkJCVwKK30KKworI2RlZmluZSBBVE9NSUM2NF9PUFMob3AsIG9wMSwgb3AyKQkJCQkJXAorCUFUT01JQzY0X09QKG9wLCBvcDEsIG9wMikJCQkJCVwKKwlBVE9NSUM2NF9PUF9SRVRVUk4ob3AsIG9wMSwgb3AyKQkJCQlcCisJQVRPTUlDNjRfRkVUQ0hfT1Aob3AsIG9wMSwgb3AyKQorCisjZGVmaW5lIGF0b21pYzY0X2FuZG5vdCBhdG9taWM2NF9hbmRub3QKKworQVRPTUlDNjRfT1BTKGFkZCwgYWRkLmYsIGFkYykKK0FUT01JQzY0X09QUyhzdWIsIHN1Yi5mLCBzYmMpCitBVE9NSUM2NF9PUFMoYW5kLCBhbmQsIGFuZCkKK0FUT01JQzY0X09QUyhhbmRub3QsIGJpYywgYmljKQorQVRPTUlDNjRfT1BTKG9yLCBvciwgb3IpCitBVE9NSUM2NF9PUFMoeG9yLCB4b3IsIHhvcikKKworI3VuZGVmIEFUT01JQzY0X09QUworI3VuZGVmIEFUT01JQzY0X0ZFVENIX09QCisjdW5kZWYgQVRPTUlDNjRfT1BfUkVUVVJOCisjdW5kZWYgQVRPTUlDNjRfT1AKKworc3RhdGljIGlubGluZSBsb25nIGxvbmcKK2F0b21pYzY0X2NtcHhjaGcoYXRvbWljNjRfdCAqcHRyLCBsb25nIGxvbmcgZXhwZWN0ZWQsIGxvbmcgbG9uZyBuZXcpCit7CisJbG9uZyBsb25nIHByZXY7CisKKwlzbXBfbWIoKTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCSIxOglsbG9ja2QgICUwLCBbJTFdCVxuIgorCSIJYnJuZSAgICAlTDAsICVMMiwgMmYJXG4iCisJIglicm5lICAgICVIMCwgJUgyLCAyZglcbiIKKwkiCXNjb25kZCAgJTMsIFslMV0JXG4iCisJIglibnogICAgIDFiCQlcbiIKKwkiMjoJCQkJXG4iCisJOiAiPSZyIihwcmV2KQorCTogInIiKHB0ciksICJpciIoZXhwZWN0ZWQpLCAiciIobmV3KQorCTogImNjIik7CS8qIG1lbW9yeSBjbG9iYmVyIGNvbWVzIGZyb20gc21wX21iKCkgKi8KKworCXNtcF9tYigpOworCisJcmV0dXJuIHByZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBsb25nIGF0b21pYzY0X3hjaGcoYXRvbWljNjRfdCAqcHRyLCBsb25nIGxvbmcgbmV3KQoreworCWxvbmcgbG9uZyBwcmV2OworCisJc21wX21iKCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiMToJbGxvY2tkICAlMCwgWyUxXQlcbiIKKwkiCXNjb25kZCAgJTIsIFslMV0JXG4iCisJIglibnogICAgIDFiCQlcbiIKKwkiMjoJCQkJXG4iCisJOiAiPSZyIihwcmV2KQorCTogInIiKHB0ciksICJyIihuZXcpCisJOiAiY2MiKTsJLyogbWVtb3J5IGNsb2JiZXIgY29tZXMgZnJvbSBzbXBfbWIoKSAqLworCisJc21wX21iKCk7CisKKwlyZXR1cm4gcHJldjsKK30KKworLyoqCisgKiBhdG9taWM2NF9kZWNfaWZfcG9zaXRpdmUgLSBkZWNyZW1lbnQgYnkgMSBpZiBvbGQgdmFsdWUgcG9zaXRpdmUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljNjRfdAorICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBvbGQgdmFsdWUgb2YgKnYgbWludXMgMSwgZXZlbiBpZgorICogdGhlIGF0b21pYyB2YXJpYWJsZSwgdiwgd2FzIG5vdCBkZWNyZW1lbnRlZC4KKyAqLworCitzdGF0aWMgaW5saW5lIGxvbmcgbG9uZyBhdG9taWM2NF9kZWNfaWZfcG9zaXRpdmUoYXRvbWljNjRfdCAqdikKK3sKKwlsb25nIGxvbmcgdmFsOworCisJc21wX21iKCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiMToJbGxvY2tkICAlMCwgWyUxXQlcbiIKKwkiCXN1Yi5mICAgJUwwLCAlTDAsIDEJIyB3MCAtIDEsIHNldCBDIG9uIGJvcnJvd1xuIgorCSIJc3ViLmMgICAlSDAsICVIMCwgMQkjIGlmIEMgc2V0LCB3MSAtIDFcbiIKKwkiCWJybHQgICAgJUgwLCAwLCAyZglcbiIKKwkiCXNjb25kZCAgJTAsIFslMV0JXG4iCisJIglibnogICAgIDFiCQlcbiIKKwkiMjoJCQkJXG4iCisJOiAiPSZyIih2YWwpCisJOiAiciIoJnYtPmNvdW50ZXIpCisJOiAiY2MiKTsJLyogbWVtb3J5IGNsb2JiZXIgY29tZXMgZnJvbSBzbXBfbWIoKSAqLworCisJc21wX21iKCk7CisKKwlyZXR1cm4gdmFsOworfQorCisvKioKKyAqIGF0b21pYzY0X2FkZF91bmxlc3MgLSBhZGQgdW5sZXNzIHRoZSBudW1iZXIgaXMgYSBnaXZlbiB2YWx1ZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWM2NF90CisgKiBAYTogdGhlIGFtb3VudCB0byBhZGQgdG8gdi4uLgorICogQHU6IC4uLnVubGVzcyB2IGlzIGVxdWFsIHRvIHUuCisgKgorICogaWYgKHYgIT0gdSkgeyB2ICs9IGE7IHJldCA9IDF9IGVsc2Uge3JldCA9IDB9CisgKiBSZXR1cm5zIDEgaWZmIEB2IHdhcyBub3QgQHUgKGkuZS4gaWYgYWRkIGFjdHVhbGx5IGhhcHBlbmVkKQorICovCitzdGF0aWMgaW5saW5lIGludCBhdG9taWM2NF9hZGRfdW5sZXNzKGF0b21pYzY0X3QgKnYsIGxvbmcgbG9uZyBhLCBsb25nIGxvbmcgdSkKK3sKKwlsb25nIGxvbmcgdmFsOworCWludCBvcF9kb25lOworCisJc21wX21iKCk7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkiMToJbGxvY2tkICAlMCwgWyUyXQlcbiIKKwkiCW1vdgklMSwgMQkJXG4iCisJIglicm5lCSVMMCwgJUw0LCAyZgkjIGNvbnRpbnVlIHRvIGFkZCBzaW5jZSB2ICE9IHUgXG4iCisJIglicmVxLmQJJUgwLCAlSDQsIDNmCSMgcmV0dXJuIHNpbmNlIHYgPT0gdSBcbiIKKwkiCW1vdgklMSwgMAkJXG4iCisJIjI6CQkJCVxuIgorCSIJYWRkLmYgICAlTDAsICVMMCwgJUwzCVxuIgorCSIJYWRjICAgICAlSDAsICVIMCwgJUgzCVxuIgorCSIJc2NvbmRkICAlMCwgWyUyXQlcbiIKKwkiCWJueiAgICAgMWIJCVxuIgorCSIzOgkJCQlcbiIKKwk6ICI9JnIiKHZhbCksICI9JnIiIChvcF9kb25lKQorCTogInIiKCZ2LT5jb3VudGVyKSwgInIiKGEpLCAiciIodSkKKwk6ICJjYyIpOwkvKiBtZW1vcnkgY2xvYmJlciBjb21lcyBmcm9tIHNtcF9tYigpICovCisKKwlzbXBfbWIoKTsKKworCXJldHVybiBvcF9kb25lOworfQorCisjZGVmaW5lIGF0b21pYzY0X2FkZF9uZWdhdGl2ZShhLCB2KQkoYXRvbWljNjRfYWRkX3JldHVybigoYSksICh2KSkgPCAwKQorI2RlZmluZSBhdG9taWM2NF9pbmModikJCQlhdG9taWM2NF9hZGQoMUxMLCAodikpCisjZGVmaW5lIGF0b21pYzY0X2luY19yZXR1cm4odikJCWF0b21pYzY0X2FkZF9yZXR1cm4oMUxMLCAodikpCisjZGVmaW5lIGF0b21pYzY0X2luY19hbmRfdGVzdCh2KQkoYXRvbWljNjRfaW5jX3JldHVybih2KSA9PSAwKQorI2RlZmluZSBhdG9taWM2NF9zdWJfYW5kX3Rlc3QoYSwgdikJKGF0b21pYzY0X3N1Yl9yZXR1cm4oKGEpLCAodikpID09IDApCisjZGVmaW5lIGF0b21pYzY0X2RlYyh2KQkJCWF0b21pYzY0X3N1YigxTEwsICh2KSkKKyNkZWZpbmUgYXRvbWljNjRfZGVjX3JldHVybih2KQkJYXRvbWljNjRfc3ViX3JldHVybigxTEwsICh2KSkKKyNkZWZpbmUgYXRvbWljNjRfZGVjX2FuZF90ZXN0KHYpCShhdG9taWM2NF9kZWNfcmV0dXJuKCh2KSkgPT0gMCkKKyNkZWZpbmUgYXRvbWljNjRfaW5jX25vdF96ZXJvKHYpCWF0b21pYzY0X2FkZF91bmxlc3MoKHYpLCAxTEwsIDBMTCkKKworI2VuZGlmCS8qICFDT05GSUdfR0VORVJJQ19BVE9NSUM2NCAqLworCisjZW5kaWYJLyogIV9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2NhY2hlLmggYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9jYWNoZS5oCmluZGV4IDIzNzA2YzYuLmZiNzgxZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2NhY2hlLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vY2FjaGUuaApAQCAtNTQsNyArNTQsNyBAQAogZXh0ZXJuIHZvaWQgcmVhZF9kZWNvZGVfY2FjaGVfYmNyKHZvaWQpOwogCiBleHRlcm4gaW50IGlvY19leGlzdHM7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBwZXJpcF9iYXNlOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGVyaXBfYmFzZSwgcGVyaXBfZW5kOwogCiAjZW5kaWYJLyogIV9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9kd2FyZi5oIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vZHdhcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjdiZGJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vZHdhcmYuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2LTE3IFN5bm9wc3lzLCBJbmMuICh3d3cuc3lub3BzeXMuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX0FSQ19EV0FSRl9ICisjZGVmaW5lIF9BU01fQVJDX0RXQVJGX0gKKworI2lmZGVmIF9fQVNTRU1CTFlfXworCisjaWZkZWYgQVJDX0RXMl9VTldJTkRfQVNfQ0ZJCisKKyNkZWZpbmUgQ0ZJX1NUQVJUUFJPQwkuY2ZpX3N0YXJ0cHJvYworI2RlZmluZSBDRklfRU5EUFJPQwkuY2ZpX2VuZHByb2MKKyNkZWZpbmUgQ0ZJX0RFRl9DRkEJLmNmaV9kZWZfY2ZhCisjZGVmaW5lIENGSV9SRUdJU1RFUgkuY2ZpX3JlZ2lzdGVyCisjZGVmaW5lIENGSV9SRUxfT0ZGU0VUCS5jZmlfcmVsX29mZnNldAorI2RlZmluZSBDRklfVU5ERUZJTkVECS5jZmlfdW5kZWZpbmVkCisKKyNlbHNlCisKKyNkZWZpbmUgQ0ZJX0lHTk9SRQkjCisKKyNkZWZpbmUgQ0ZJX1NUQVJUUFJPQwlDRklfSUdOT1JFCisjZGVmaW5lIENGSV9FTkRQUk9DCUNGSV9JR05PUkUKKyNkZWZpbmUgQ0ZJX0RFRl9DRkEJQ0ZJX0lHTk9SRQorI2RlZmluZSBDRklfUkVHSVNURVIJQ0ZJX0lHTk9SRQorI2RlZmluZSBDRklfUkVMX09GRlNFVAlDRklfSUdOT1JFCisjZGVmaW5lIENGSV9VTkRFRklORUQJQ0ZJX0lHTk9SRQorCisjZW5kaWYJLyogIUFSQ19EVzJfVU5XSU5EX0FTX0NGSSAqLworCisjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZgkvKiBfQVNNX0FSQ19EV0FSRl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IDUxYTk5ZTIuLjcwOTZmOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC0yMyw4ICsyMyw3IEBACiAvKiBBUkMgUmVsb2NhdGlvbnMgKGtlcm5lbCBNb2R1bGVzIG9ubHkpICovCiAjZGVmaW5lICBSX0FSQ18zMgkJMHg0CiAjZGVmaW5lICBSX0FSQ18zMl9NRQkJMHgxQgotI2RlZmluZSAgUl9BUkNfUzI1SF9QQ1JFTAkweDEwCi0jZGVmaW5lICBSX0FSQ19TMjVXX1BDUkVMCTB4MTEKKyNkZWZpbmUgIFJfQVJDXzMyX1BDUkVMCQkweDMxCiAKIC8qdG8gc2V0IHBhcmFtZXRlcnMgaW4gdGhlIGNvcmUgZHVtcHMgKi8KICNkZWZpbmUgRUxGX0FSQ0gJCUVNX0FSQ09NUEFDVApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3MtYXJjdjIuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2lycWZsYWdzLWFyY3YyLmgKaW5kZXggZDFlYzdmNi4uZTg4MGRmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vaXJxZmxhZ3MtYXJjdjIuaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9pcnFmbGFncy1hcmN2Mi5oCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkgKi8KIAl0ZW1wID0gKDEgPDwgNSkgfAogCQkoKCEhKHRlbXAgJiBTVEFUVVNfSUVfTUFTSykpIDw8IENMUklfU1RBVFVTX0lFX0JJVCkgfAotCQkodGVtcCAmIENMUklfU1RBVFVTX0VfTUFTSyk7CisJCSgodGVtcCA+PiAxKSAmIENMUklfU1RBVFVTX0VfTUFTSyk7CiAJcmV0dXJuIHRlbXA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2xpbmthZ2UuaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL2xpbmthZ2UuaAppbmRleCA1ZmFhZDE3Li5iMjlmMWE5IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9saW5rYWdlLmgKKysrIGIvYXJjaC9hcmMvaW5jbHVkZS9hc20vbGlua2FnZS5oCkBAIC05LDYgKzksOCBAQAogI2lmbmRlZiBfX0FTTV9MSU5LQUdFX0gKICNkZWZpbmUgX19BU01fTElOS0FHRV9ICiAKKyNpbmNsdWRlIDxhc20vZHdhcmYuaD4KKwogI2lmZGVmIF9fQVNTRU1CTFlfXwogCiAjZGVmaW5lIEFTTV9OTAkJIGAJLyogdXNlICdgJyB0byBtYXJrIG5ldyBsaW5lIGluIG1hY3JvICovCkBAIC0zMiw2ICszNCwxNiBAQAogI2VuZGlmCiAuZW5kbQogCisjZGVmaW5lIEVOVFJZX0NGSShuYW1lKQkJXAorCS5nbG9ibCBuYW1lIEFTTV9OTAlcCisJQUxJR04gQVNNX05MIAkJXAorCW5hbWU6IEFTTV9OTAkJXAorCUNGSV9TVEFSVFBST0MgQVNNX05MCisKKyNkZWZpbmUgRU5EX0NGSShuYW1lKSAJCVwKKwlDRklfRU5EUFJPQyBBU01fTkwJXAorCS5zaXplIG5hbWUsIC4tbmFtZQorCiAjZWxzZQkvKiAhX19BU1NFTUJMWV9fICovCiAKICNpZmRlZiBDT05GSUdfQVJDX0hBU19JQ0NNCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmggYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmgKaW5kZXggNWYwNzE3Ni4uOTE4NTU0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCisrKyBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaApAQCAtMTE4LDYgKzExOCw5IEBACiAJW1BFUkZfQ09VTlRfQVJDX0lDTV0gPSAiaWNtIiwJCS8qIEktY2FjaGUgTWlzcyAqLwogCVtQRVJGX0NPVU5UX0FSQ19FRFRMQl0gPSAiZWR0bGIiLAkvKiBELVRMQiBNaXNzICovCiAJW1BFUkZfQ09VTlRfQVJDX0VJVExCXSA9ICJlaXRsYiIsCS8qIEktVExCIE1pc3MgKi8KKworCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVNdID0gImltZW1yZGMiLAkvKiBJbnN0cjogbWVtIHJlYWQgY2FjaGVkICovCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXSA9ICJkY2xtIiwJCS8qIEQtY2FjaGUgTG9hZCBNaXNzICovCiB9OwogCiAjZGVmaW5lIEMoX3gpCQkJUEVSRl9DT1VOVF9IV19DQUNIRV8jI194CmRpZmYgLS1naXQgYS9hcmNoL2FyYy9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggYTc4ZDU2Ny4uNDFmYWYxNyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtODMsNyArODMsMTAgQEAKIAkiMjoJO25vcFxuIgkJCQlcCiAJIgkuc2VjdGlvbiAuZml4dXAsIFwiYXhcIlxuIglcCiAJIgkuYWxpZ24gNFxuIgkJCVwKLQkiMzoJbW92ICUwLCAlM1xuIgkJCVwKKwkiMzoJIyByZXR1cm4gLUVGQVVMVFxuIgkJXAorCSIJbW92ICUwLCAlM1xuIgkJCVwKKwkiCSMgemVybyBvdXQgZHN0IHB0clxuIgkJXAorCSIJbW92ICUxLCAgMFxuIgkJCVwKIAkiCWogICAyYlxuIgkJCVwKIAkiCS5wcmV2aW91c1xuIgkJCVwKIAkiCS5zZWN0aW9uIF9fZXhfdGFibGUsIFwiYVwiXG4iCVwKQEAgLTEwMSw3ICsxMDQsMTEgQEAKIAkiMjoJO25vcFxuIgkJCQlcCiAJIgkuc2VjdGlvbiAuZml4dXAsIFwiYXhcIlxuIglcCiAJIgkuYWxpZ24gNFxuIgkJCVwKLQkiMzoJbW92ICUwLCAlM1xuIgkJCVwKKwkiMzoJIyByZXR1cm4gLUVGQVVMVFxuIgkJXAorCSIJbW92ICUwLCAlM1xuIgkJCVwKKwkiCSMgemVybyBvdXQgZHN0IHB0clxuIgkJXAorCSIJbW92ICUxLCAgMFxuIgkJCVwKKwkiCW1vdiAlUjEsIDBcbiIJCQlcCiAJIglqICAgMmJcbiIJCQlcCiAJIgkucHJldmlvdXNcbiIJCQlcCiAJIgkuc2VjdGlvbiBfX2V4X3RhYmxlLCBcImFcIlxuIglcCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9rZXJuZWwvY3R4X3N3X2FzbS5TIGIvYXJjaC9hcmMva2VybmVsL2N0eF9zd19hc20uUwppbmRleCBlNjg5MGIxLi43YzFmMzY1IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvY3R4X3N3X2FzbS5TCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9jdHhfc3dfYXNtLlMKQEAgLTIzLDYgKzIzLDcgQEAKIAkuZ2xvYmFsIF9fc3dpdGNoX3RvCiAJLnR5cGUgICBfX3N3aXRjaF90bywgQGZ1bmN0aW9uCiBfX3N3aXRjaF90bzoKKwlDRklfU1RBUlRQUk9DCiAKIAkvKiBTYXZlIHJlZ3Mgb24ga2VybmVsIG1vZGUgc3RhY2sgb2YgdGFzayAqLwogCXN0LmEgICAgYmxpbmssIFtzcCwgLTRdCkBAIC01OSw0ICs2MCw0IEBACiAJbGQuYWIgICBibGluaywgW3NwLCA0XQogCWogICAgICAgW2JsaW5rXQogCi1FTkQoX19zd2l0Y2hfdG8pCitFTkRfQ0ZJKF9fc3dpdGNoX3RvKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL2VudHJ5LlMgYi9hcmNoL2FyYy9rZXJuZWwvZW50cnkuUwppbmRleCAyZWZiMDYyNS4uMWVlYTk5YiAxMDA2NDQKLS0tIGEvYXJjaC9hcmMva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9hcmMva2VybmVsL2VudHJ5LlMKQEAgLTM1LDcgKzM1LDcgQEAKIAlidHN0IHIxMCwgVElGX1NZU0NBTExfVFJBQ0UKIAlibnogIHRyYWNlc3lzX2V4aXQKIAotCWIgcmV0X2Zyb21fc3lzdGVtX2NhbGwKKwliIC5McmV0X2Zyb21fc3lzdGVtX2NhbGwKIEVORChzeXNfY2xvbmVfd3JhcHBlcikKIAogRU5UUlkocmV0X2Zyb21fZm9yaykKQEAgLTYxLDE4ICs2MSw2IEBACiAJYiAgICByZXRfZnJvbV9leGNlcHRpb24KIEVORChyZXRfZnJvbV9mb3JrKQogCi0jaWZkZWYgQ09ORklHX0FSQ19EVzJfVU5XSU5ECi07IFdvcmthcm91bmQgZm9yIGJ1ZyA5NDE3OSAoU1RBUiApOgotOyBEZXNwaXRlIC1mYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMsIGxpbmtlciBpcyBub3QgbWFraW5nIGR3YXJmMiB1bndpbmRlcgotOyBzZWN0aW9uICguZGVidWdfZnJhbWUpIGFzIGxvYWRhYmxlLiBTbyB3ZSBmb3JjZSBpdCBoZXJlLgotOyBUaGlzIGFsc28gZml4ZXMgU1RBUiA5MDAwNDg3OTMzIHdoZXJlIHRoZSBwcmV2LXdvcmthcm91bmQgKG9iamNvcHkgLS1zZXRmbGFnKQotOyB3b3VsZCBub3Qgd29yayBhZnRlciBhIGNsZWFuIGJ1aWxkIGR1ZSB0byBrZXJuZWwgYnVpbGQgc3lzdGVtIGRlcGVuZGVuY2llcy4KLS5zZWN0aW9uIC5kZWJ1Z19mcmFtZSwgIndhIixAcHJvZ2JpdHMKLQotOyBSZXNldCB0byAudGV4dCBhcyB0aGlzIGZpbGUgaXMgaW5jbHVkZWQgaW4gZW50cnktPGlzYT4uUwotLnNlY3Rpb24gLnRleHQsICJheCIsQHByb2diaXRzCi0jZW5kaWYKLQogOyMjIyMjIyMjIyMjIyMjIyMjIyMgTm9uIFRMQiBFeGNlcHRpb24gSGFuZGxpbmcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogOyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI2MCwyMCArMjQ4LDE4IEBACiAJOyBzeXNjYWxsIG51bSBzaGQgbm90IGV4Y2VlZCB0aGUgdG90YWwgc3lzdGVtIGNhbGxzIGF2YWlsCiAJY21wICAgICByOCwgIE5SX3N5c2NhbGxzCiAJbW92LmhpICByMCwgLUVOT1NZUwotCWJoaSAgICAgcmV0X2Zyb21fc3lzdGVtX2NhbGwKKwliaGkgICAgIC5McmV0X2Zyb21fc3lzdGVtX2NhbGwKIAogCTsgT2Zmc2V0IGludG8gdGhlIHN5c2NhbGxfdGFibGUgYW5kIGNhbGwgaGFuZGxlcgogCWxkLmFzICAgcjksW3N5c19jYWxsX3RhYmxlLCByOF0KIAlqbCAgICAgIFtyOV0gICAgICAgIDsgRW50cnkgaW50byBTeXMgQ2FsbCBIYW5kbGVyCiAKLQk7IGZhbGwgdGhyb3VnaCB0byByZXRfZnJvbV9zeXN0ZW1fY2FsbAotRU5EKEVWX1RyYXApCi0KLUVOVFJZKHJldF9mcm9tX3N5c3RlbV9jYWxsKQorLkxyZXRfZnJvbV9zeXN0ZW1fY2FsbDoKIAogCXN0ICByMCwgW3NwLCBQVF9yMF0gICAgIDsgc3lzIGNhbGwgcmV0dXJuIHZhbHVlIGluIHB0X3JlZ3MKIAotCTsgZmFsbCB0aHJvdWdoIHlldCBhZ2FpbiB0byByZXRfZnJvbV9leGNlcHRpb24KKwk7IGZhbGwgdGhyb3VnaCB0byByZXRfZnJvbV9leGNlcHRpb24KK0VORChFVl9UcmFwKQogCiA7IyMjIyMjIyMjIyMjIyBSZXR1cm4gZnJvbSBJbnRyL0V4Y3AvVHJhcCAoTGludXggU3BlY2lmaWNzKSAjIyMjIyMjIyMjIyMjIwogOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL2ludGMtYXJjdjIuYyBiL2FyY2gvYXJjL2tlcm5lbC9pbnRjLWFyY3YyLmMKaW5kZXggNmMyNGZhZi4uNjJiNTk0MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2tlcm5lbC9pbnRjLWFyY3YyLmMKKysrIGIvYXJjaC9hcmMva2VybmVsL2ludGMtYXJjdjIuYwpAQCAtNzQsNyArNzQsNyBAQAogCXRtcCA9IHJlYWRfYXV4X3JlZygweGEpOwogCXRtcCB8PSBTVEFUVVNfQURfTUFTSyB8IChpcnFfcHJpbyA8PCAxKTsKIAl0bXAgJj0gflNUQVRVU19JRV9NQVNLOwotCWFzbSB2b2xhdGlsZSgiZmxhZyAlMAlcbiI6OiJyIih0bXApKTsKKwlhc20gdm9sYXRpbGUoImtmbGFnICUwCVxuIjo6InIiKHRtcCkpOwogfQogCiBzdGF0aWMgdm9pZCBhcmN2Ml9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL2FyYy9rZXJuZWwvbW9kdWxlLmMKaW5kZXggMzc2ZTA0Ni4uOWEyODQ5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMva2VybmVsL21vZHVsZS5jCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9tb2R1bGUuYwpAQCAtMjIsMTMgKzIyLDkgQEAKIAkqKGFkZHIgKyAxKSA9ICh2YWx1ZSAmIDB4ZmZmZik7CiB9CiAKLS8qIEFSQyBzcGVjaWZpYyBzZWN0aW9uIHF1aXJrcyAtIGJlZm9yZSByZWxvY2F0aW9uIGxvb3AgaW4gZ2VuZXJpYyBsb2FkZXIKLSAqCi0gKiBGb3IgZHdhcmYgdW53aW5kaW5nIG91dCBvZiBtb2R1bGVzLCB0aGlzIG5lZWRzIHRvCi0gKiAxLiBFbnN1cmUgdGhlIC5kZWJ1Z19mcmFtZSBpcyBhbGxvY2F0YWJsZSAoQVJDIExpbmtlciBidWc6IGRlc3BpdGUKLSAqICAgIC1mYXN5bmNocm9ub3VzLXVud2luZC10YWJsZXMgaXQgZG9lc24ndCkuCi0gKiAyLiBTaW5jZSB3ZSBhcmUgaXRlcmF0aW5nIHRocnUgc2VjIGhkciB0YmwgYW55d2F5cywgbWFrZSBhIG5vdGUgb2YKLSAqICAgIHRoZSBleGFjdCBzZWN0aW9uIGluZGV4LCBmb3IgbGF0ZXIgdXNlLgorLyoKKyAqIFRoaXMgZ2V0cyBjYWxsZWQgYmVmb3JlIHJlbG9jYXRpb24gbG9vcCBpbiBnZW5lcmljIGxvYWRlcgorICogTWFrZSBhIG5vdGUgb2YgdGhlIHNlY3Rpb24gaW5kZXggb2YgdW53aW5kaW5nIHNlY3Rpb24KICAqLwogaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmhkciwgRWxmX1NoZHIgKnNlY2hkcnMsCiAJCQkgICAgICBjaGFyICpzZWNzdHIsIHN0cnVjdCBtb2R1bGUgKm1vZCkKQEAgLTQwLDggKzM2LDcgQEAKIAltb2QtPmFyY2gudW53X2luZm8gPSBOVUxMOwogCiAJZm9yIChpID0gMTsgaSA8IGhkci0+ZV9zaG51bTsgaSsrKSB7Ci0JCWlmIChzdHJjbXAoc2Vjc3RyK3NlY2hkcnNbaV0uc2hfbmFtZSwgIi5kZWJ1Z19mcmFtZSIpID09IDApIHsKLQkJCXNlY2hkcnNbaV0uc2hfZmxhZ3MgfD0gU0hGX0FMTE9DOworCQlpZiAoc3RyY21wKHNlY3N0citzZWNoZHJzW2ldLnNoX25hbWUsICIuZWhfZnJhbWUiKSA9PSAwKSB7CiAJCQltb2QtPmFyY2gudW53X3NlY19pZHggPSBpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTEwNiwxMCArMTAxLDEyIEBACiAJCSAqLwogCQlyZWxvX3R5cGUgPSBFTEYzMl9SX1RZUEUocmVsX2VudHJ5W2ldLnJfaW5mbyk7CiAKLQkJaWYgKGxpa2VseShSX0FSQ18zMl9NRSA9PSByZWxvX3R5cGUpKQorCQlpZiAobGlrZWx5KFJfQVJDXzMyX01FID09IHJlbG9fdHlwZSkpCS8qIE1FICggUyArIEEgKSAqLwogCQkJYXJjX3dyaXRlX21lKCh1bnNpZ25lZCBzaG9ydCAqKWxvY2F0aW9uLCByZWxvY2F0aW9uKTsKLQkJZWxzZSBpZiAoUl9BUkNfMzIgPT0gcmVsb190eXBlKQorCQllbHNlIGlmIChSX0FSQ18zMiA9PSByZWxvX3R5cGUpCQkvKiAoIFMgKyBBICkgKi8KIAkJCSooKEVsZjMyX0FkZHIgKikgbG9jYXRpb24pID0gcmVsb2NhdGlvbjsKKwkJZWxzZSBpZiAoUl9BUkNfMzJfUENSRUwgPT0gcmVsb190eXBlKQkvKiAoIFMgKyBBICkgLSBQREFUQSApICovCisJCQkqKChFbGYzMl9BZGRyICopIGxvY2F0aW9uKSA9IHJlbG9jYXRpb24gLSBsb2NhdGlvbjsKIAkJZWxzZQogCQkJZ290byByZWxvX2VycjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvYXJjL2tlcm5lbC9wZXJmX2V2ZW50LmMKaW5kZXggMDhmMDNkOS4uMmNlMjRlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMva2VybmVsL3BlcmZfZXZlbnQuYworKysgYi9hcmNoL2FyYy9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC0xNzksOCArMTc5LDggQEAKIAkJaWYgKGFyY19wbXUtPmV2X2h3X2lkeFtldmVudC0+YXR0ci5jb25maWddIDwgMCkKIAkJCXJldHVybiAtRU5PRU5UOwogCQlod2MtPmNvbmZpZyB8PSBhcmNfcG11LT5ldl9od19pZHhbZXZlbnQtPmF0dHIuY29uZmlnXTsKLQkJcHJfZGVidWcoImluaXQgZXZlbnQgJWQgd2l0aCBoL3cgJWQgXCclc1wnXG4iLAotCQkJIChpbnQpIGV2ZW50LT5hdHRyLmNvbmZpZywgKGludCkgaHdjLT5jb25maWcsCisJCXByX2RlYnVnKCJpbml0IGV2ZW50ICVkIHdpdGggaC93ICUwOHggXCclc1wnXG4iLAorCQkJIChpbnQpZXZlbnQtPmF0dHIuY29uZmlnLCAoaW50KWh3Yy0+Y29uZmlnLAogCQkJIGFyY19wbXVfZXZfaHdfbWFwW2V2ZW50LT5hdHRyLmNvbmZpZ10pOwogCQlyZXR1cm4gMDsKIApAQCAtMTg5LDYgKzE4OSw4IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJaHdjLT5jb25maWcgfD0gYXJjX3BtdS0+ZXZfaHdfaWR4W3JldF07CisJCXByX2RlYnVnKCJpbml0IGNhY2hlIGV2ZW50IHdpdGggaC93ICUwOHggXCclc1wnXG4iLAorCQkJIChpbnQpaHdjLT5jb25maWcsIGFyY19wbXVfZXZfaHdfbWFwW3JldF0pOwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0VOVDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcmMva2VybmVsL3NldHVwLmMKaW5kZXggZjUyYTBkMGQuLjNkZjdmOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9zZXR1cC5jCkBAIC0xNzEsNiArMTcxLDcgQEAKICNlbHNlCiAJeyB7MHg1MCwgIkFSQyBIUzM4IFIyLjAifSwgMHg1MX0sCiAJeyB7MHg1MiwgIkFSQyBIUzM4IFIyLjEifSwgMHg1Mn0sCisJeyB7MHg1MywgIkFSQyBIUzM4IFIzLjAifSwgMHg1M30sCiAjZW5kaWYKIAl7IHsweDAwLCBOVUxMCQl9IH0KIH07CkBAIC0yNzIsOCArMjczLDggQEAKIAlGSVhfUFRSKGNwdSk7CiAKIAluICs9IHNjbnByaW50ZihidWYgKyBuLCBsZW4gLSBuLAotCQkgICAgICAgIlZlY3RvciBUYWJsZVx0OiAlI3hcblVuY2FjaGVkIEJhc2VcdDogJSNseFxuIiwKLQkJICAgICAgIGNwdS0+dmVjX2Jhc2UsIHBlcmlwX2Jhc2UpOworCQkgICAgICAgIlZlY3RvciBUYWJsZVx0OiAlI3hcblBlcmlwaGVyYWxzXHQ6ICUjbHg6JSNseFxuIiwKKwkJICAgICAgIGNwdS0+dmVjX2Jhc2UsIHBlcmlwX2Jhc2UsIHBlcmlwX2VuZCk7CiAKIAlpZiAoY3B1LT5leHRuLmZwdV9zcCB8fCBjcHUtPmV4dG4uZnB1X2RwKQogCQluICs9IHNjbnByaW50ZihidWYgKyBuLCBsZW4gLSBuLCAiRlBVXHRcdDogJXMlc1xuIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2tlcm5lbC91bndpbmQuYyBiL2FyY2gvYXJjL2tlcm5lbC91bndpbmQuYwppbmRleCAwNTg3YmYxLi42MWZkMWNlIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvdW53aW5kLmMKKysrIGIvYXJjaC9hcmMva2VybmVsL3Vud2luZC5jCkBAIC0xMTEsNiArMTExLDggQEAKICNkZWZpbmUgRFdfRUhfUEVfaW5kaXJlY3QgMHg4MAogI2RlZmluZSBEV19FSF9QRV9vbWl0ICAgICAweGZmCiAKKyNkZWZpbmUgQ0lFX0lECTAKKwogdHlwZWRlZiB1bnNpZ25lZCBsb25nIHVsZWIxMjhfdDsKIHR5cGVkZWYgc2lnbmVkIGxvbmcgc2xlYjEyOF90OwogCkBAIC0yMzIsNiArMjM0LDcgQEAKIAogc3RhdGljIGNvbnN0IHUzMiBiYWRfY2llLCBub3RfZmRlOwogc3RhdGljIGNvbnN0IHUzMiAqY2llX2Zvcl9mZGUoY29uc3QgdTMyICpmZGUsIGNvbnN0IHN0cnVjdCB1bndpbmRfdGFibGUgKik7CitzdGF0aWMgY29uc3QgdTMyICpfX2NpZV9mb3JfZmRlKGNvbnN0IHUzMiAqZmRlKTsKIHN0YXRpYyBzaWduZWQgZmRlX3BvaW50ZXJfdHlwZShjb25zdCB1MzIgKmNpZSk7CiAKIHN0cnVjdCBlaF9mcmFtZV9oZHJfdGFibGVfZW50cnkgewpAQCAtMzM4LDEwICszNDEsOSBAQAogCWZvciAoZmRlID0gdGFibGUtPmFkZHJlc3MsIHRhYmxlU2l6ZSA9IHRhYmxlLT5zaXplLCBuID0gMDsKIAkgICAgIHRhYmxlU2l6ZTsKIAkgICAgIHRhYmxlU2l6ZSAtPSBzaXplb2YoKmZkZSkgKyAqZmRlLCBmZGUgKz0gMSArICpmZGUgLyBzaXplb2YoKmZkZSkpIHsKLQkJLyogY29uc3QgdTMyICpjaWUgPSBmZGUgKyAxIC0gZmRlWzFdIC8gc2l6ZW9mKCpmZGUpOyAqLwotCQljb25zdCB1MzIgKmNpZSA9IChjb25zdCB1MzIgKikoZmRlWzFdKTsKKwkJY29uc3QgdTMyICpjaWUgPSBfX2NpZV9mb3JfZmRlKGZkZSk7CiAKLQkJaWYgKGZkZVsxXSA9PSAweGZmZmZmZmZmKQorCQlpZiAoZmRlWzFdID09IENJRV9JRCkKIAkJCWNvbnRpbnVlOwkvKiB0aGlzIGlzIGEgQ0lFICovCiAJCXB0ciA9IChjb25zdCB1OCAqKShmZGUgKyAyKTsKIAkJaGVhZGVyLT50YWJsZVtuXS5zdGFydCA9IHJlYWRfcG9pbnRlcigmcHRyLApAQCAtNTA0LDYgKzUwNiwxNSBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAorc3RhdGljIGNvbnN0IHUzMiAqX19jaWVfZm9yX2ZkZShjb25zdCB1MzIgKmZkZSkKK3sKKwljb25zdCB1MzIgKmNpZTsKKworCWNpZSA9IGZkZSArIDEgLSBmZGVbMV0gLyBzaXplb2YoKmZkZSk7CisKKwlyZXR1cm4gY2llOworfQorCiBzdGF0aWMgY29uc3QgdTMyICpjaWVfZm9yX2ZkZShjb25zdCB1MzIgKmZkZSwgY29uc3Qgc3RydWN0IHVud2luZF90YWJsZSAqdGFibGUpCiB7CiAJY29uc3QgdTMyICpjaWU7CkBAIC01MTEsMTkgKzUyMiwxOCBAQAogCWlmICghKmZkZSB8fCAoKmZkZSAmIChzaXplb2YoKmZkZSkgLSAxKSkpCiAJCXJldHVybiAmYmFkX2NpZTsKIAotCWlmIChmZGVbMV0gPT0gMHhmZmZmZmZmZikKKwlpZiAoZmRlWzFdID09IENJRV9JRCkKIAkJcmV0dXJuICZub3RfZmRlOwkvKiB0aGlzIGlzIGEgQ0lFICovCiAKIAlpZiAoKGZkZVsxXSAmIChzaXplb2YoKmZkZSkgLSAxKSkpCiAvKiB8fCBmZGVbMV0gPiAodW5zaWduZWQgbG9uZykoZmRlICsgMSkgLSAodW5zaWduZWQgbG9uZyl0YWJsZS0+YWRkcmVzcykgKi8KIAkJcmV0dXJuIE5VTEw7CS8qIHRoaXMgaXMgbm90IGEgdmFsaWQgRkRFICovCiAKLQkvKiBjaWUgPSBmZGUgKyAxIC0gZmRlWzFdIC8gc2l6ZW9mKCpmZGUpOyAqLwotCWNpZSA9ICh1MzIgKikgZmRlWzFdOworCWNpZSA9IF9fY2llX2Zvcl9mZGUoZmRlKTsKIAogCWlmICgqY2llIDw9IHNpemVvZigqY2llKSArIDQgfHwgKmNpZSA+PSBmZGVbMV0gLSBzaXplb2YoKmZkZSkKIAkgICAgfHwgKCpjaWUgJiAoc2l6ZW9mKCpjaWUpIC0gMSkpCi0JICAgIHx8IChjaWVbMV0gIT0gMHhmZmZmZmZmZikpCisJICAgIHx8IChjaWVbMV0gIT0gQ0lFX0lEKSkKIAkJcmV0dXJuIE5VTEw7CS8qIHRoaXMgaXMgbm90IGEgKHZhbGlkKSBDSUUgKi8KIAlyZXR1cm4gY2llOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2FyYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA4OTRlNjk2Li4zNjYxMTA3IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2FyYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtODIsMTQgKzgyLDYgQEAKIAogCVBFUkNQVV9TRUNUSU9OKEwxX0NBQ0hFX0JZVEVTKQogCi0JLyoKLQkgKiAuZXhpdC50ZXh0IGlzIGRpc2NhcmQgYXQgcnVudGltZSwgbm90IGxpbmsgdGltZSwgdG8gZGVhbCB3aXRoCi0JICogcmVmZXJlbmNlcyBmcm9tIC5kZWJ1Z19mcmFtZQotCSAqIEl0IHdpbGwgYmUgaW5pdCBmcmVlZCwgYmVpbmcgaW5zaWRlIFtfX2luaXRfc3RhcnQgOiBfX2luaXRfZW5kXQotCSAqLwotCS5leGl0LnRleHQgOiB7IEVYSVRfVEVYVCB9Ci0JLmV4aXQuZGF0YSA6IHsgRVhJVF9EQVRBIH0KLQogCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCV9faW5pdF9lbmQgPSAuOwogCkBAIC0xMjAsMTggKzExMiwxMyBAQAogCiAjaWZkZWYgQ09ORklHX0FSQ19EVzJfVU5XSU5ECiAJLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JLmRlYnVnX2ZyYW1lICA6IHsKKwkuZWhfZnJhbWUgIDogewogCQlfX3N0YXJ0X3Vud2luZCA9IC47Ci0JCSooLmRlYnVnX2ZyYW1lKQorCQkqKC5laF9mcmFtZSkKIAkJX19lbmRfdW53aW5kID0gLjsKIAl9Ci0JLyoKLQkgKiBnY2MgNC44IGdlbmVyYXRlcyB0aGlzIGZvciAtZmFzeW5jaG9ub3VzLXVud2luZC10YWJsZXMsCi0JICogd2hpbGUgd2Ugc3RpbGwgdXNlIHRoZSAuZGVidWdfZnJhbWUgYmFzZWQgdW53aW5kZXIKLQkgKi8KLQkvRElTQ0FSRC8gOiB7CSooLmVoX2ZyYW1lKSB9CiAjZWxzZQotCS9ESVNDQVJELyA6IHsJKiguZGVidWdfZnJhbWUpIH0KKwkvRElTQ0FSRC8gOiB7CSooLmVoX2ZyYW1lKSB9CiAjZW5kaWYKIAogCU5PVEVTCkBAIC0xNDgsNyArMTM1LDcgQEAKIAl9CiAKICNpZm5kZWYgQ09ORklHX0RFQlVHX0lORk8KLQkvKiBvcGVuLWNvZGVkIGJlY2F1c2Ugd2UgbmVlZCAuZGVidWdfZnJhbWUgc2VwZXJhdGVseSBmb3IgdW53aW5kaW5nICovCisJL0RJU0NBUkQvIDogeyAqKC5kZWJ1Z19mcmFtZSkgfQogCS9ESVNDQVJELyA6IHsgKiguZGVidWdfYXJhbmdlcykgfQogCS9ESVNDQVJELyA6IHsgKiguZGVidWdfcHVibmFtZXMpIH0KIAkvRElTQ0FSRC8gOiB7ICooLmRlYnVnX2luZm8pIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2xpYi9tZW1jbXAuUyBiL2FyY2gvYXJjL2xpYi9tZW1jbXAuUwppbmRleCBhNDAxNWU3Li4yMWExMDMwIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9saWIvbWVtY21wLlMKKysrIGIvYXJjaC9hcmMvbGliL21lbWNtcC5TCkBAIC0xNiw3ICsxNiw3IEBACiAjZGVmaW5lIFNISUZUIHIyCiAjZW5kaWYKIAotRU5UUlkobWVtY21wKQorRU5UUllfQ0ZJKG1lbWNtcCkKIAlvcglyMTIscjAscjEKIAlhc2xfcwlyMTIscjEyLDMwCiAJc3ViCXIzLHIyLDEKQEAgLTE0OSw0ICsxNDksNCBAQAogLkxuaWw6CiAJal9zLmQJW2JsaW5rXQogCW1vdglyMCwwCi1FTkQobWVtY21wKQorRU5EX0NGSShtZW1jbXApCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9saWIvbWVtY3B5LTcwMC5TIGIvYXJjaC9hcmMvbGliL21lbWNweS03MDAuUwppbmRleCAzMjIyNTczLi5iYTBiZWNjIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9saWIvbWVtY3B5LTcwMC5TCisrKyBiL2FyY2gvYXJjL2xpYi9tZW1jcHktNzAwLlMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKG1lbWNweSkKK0VOVFJZX0NGSShtZW1jcHkpCiAJb3IJcjMscjAscjEKIAlhc2xfcwlyMyxyMywzMAogCW1vdl9zCXI1LHIwCkBAIC02Myw0ICs2Myw0IEBACiAuTGVuZGJsb29wOgogCWpfcy5kCVtibGlua10KIAlzdGIJcjEyLFtyNSwwXQotRU5EKG1lbWNweSkKK0VORF9DRkkobWVtY3B5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL21lbWNweS1hcmNocy5TIGIvYXJjaC9hcmMvbGliL21lbWNweS1hcmNocy5TCmluZGV4IGY5NmM3NWUuLmQ2MTA0NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2xpYi9tZW1jcHktYXJjaHMuUworKysgYi9hcmNoL2FyYy9saWIvbWVtY3B5LWFyY2hzLlMKQEAgLTQwLDcgKzQwLDcgQEAKICMgZGVmaW5lIFpPTEFORAkJCTB4RgogI2VuZGlmCiAKLUVOVFJZKG1lbWNweSkKK0VOVFJZX0NGSShtZW1jcHkpCiAJcHJlZmV0Y2ggW3IxXQkJOyBQcmVmZXRjaCB0aGUgcmVhZCBsb2NhdGlvbgogCXByZWZldGNodyBbcjBdCQk7IFByZWZldGNoIHRoZSB3cml0ZSBsb2NhdGlvbgogCW1vdi5mCTAsIHIyCkBAIC0yMzMsNCArMjMzLDQgQEAKIC5MY29weWJ5dGV3aXNlXzM6CiAJaglbYmxpbmtdCiAKLUVORChtZW1jcHkpCitFTkRfQ0ZJKG1lbWNweSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2xpYi9tZW1zZXQtYXJjaHMuUyBiL2FyY2gvYXJjL2xpYi9tZW1zZXQtYXJjaHMuUwppbmRleCAzNjViMTgzLi42MmFkNGJjIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9saWIvbWVtc2V0LWFyY2hzLlMKKysrIGIvYXJjaC9hcmMvbGliL21lbXNldC1hcmNocy5TCkBAIC0xMCw3ICsxMCw3IEBACiAKICN1bmRlZiBQUkVBTExPQ19OT1RfQVZBSUwKIAotRU5UUlkobWVtc2V0KQorRU5UUllfQ0ZJKG1lbXNldCkKIAlwcmVmZXRjaHcgW3IwXQkJOyBQcmVmZXRjaCB0aGUgd3JpdGUgbG9jYXRpb24KIAltb3YuZgkwLCByMgogOzs7IGlmIHNpemUgaXMgemVybwpAQCAtMTEyLDExICsxMTIsMTEgQEAKIAogCWoJW2JsaW5rXQogCi1FTkQobWVtc2V0KQorRU5EX0NGSShtZW1zZXQpCiAKLUVOVFJZKG1lbXplcm8pCitFTlRSWV9DRkkobWVtemVybykKICAgICA7IGFkanVzdCBiemVybyBhcmdzIHRvIG1lbXNldCBhcmdzCiAgICAgbW92IHIyLCByMQogICAgIGIuZCAgbWVtc2V0ICAgIDt0YWlsIGNhbGwgc28gbmVlZCB0byB0aW5rZXIgd2l0aCBibGluawogICAgIG1vdiByMSwgMAotRU5EKG1lbXplcm8pCitFTkRfQ0ZJKG1lbXplcm8pCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9saWIvbWVtc2V0LlMgYi9hcmNoL2FyYy9saWIvbWVtc2V0LlMKaW5kZXggZDM2YmQ0My4uY2Y3MzZmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL21lbXNldC5TCisrKyBiL2FyY2gvYXJjL2xpYi9tZW1zZXQuUwpAQCAtMTAsNyArMTAsNyBAQAogCiAjZGVmaW5lIFNNQUxMCTcgLyogTXVzdCBiZSBhdCBsZWFzdCA2IHRvIGRlYWwgd2l0aCBhbGlnbm1lbnQvbG9vcCBpc3N1ZXMuICAqLwogCi1FTlRSWShtZW1zZXQpCitFTlRSWV9DRkkobWVtc2V0KQogCW1vdl9zCXI0LHIwCiAJb3IJcjEyLHIwLHIyCiAJYm1zay5mCXIxMixyMTIsMQpAQCAtNDYsMTQgKzQ2LDE0IEBACiAJc3RiLmFiCXIxLFtyNCwxXQogLkx0aW55X2VuZDoKIAlqX3MJW2JsaW5rXQotRU5EKG1lbXNldCkKK0VORF9DRkkobWVtc2V0KQogCiA7IG1lbXplcm86IEByMCA9IG1lbSwgQHIxID0gc2l6ZV90CiA7IG1lbXNldDogIEByMCA9IG1lbSwgQHIxID0gY2hhciwgQHIyID0gc2l6ZV90CiAKLUVOVFJZKG1lbXplcm8pCitFTlRSWV9DRkkobWVtemVybykKICAgICA7IGFkanVzdCBiemVybyBhcmdzIHRvIG1lbXNldCBhcmdzCiAgICAgbW92IHIyLCByMQogICAgIG1vdiByMSwgMAogICAgIGIgIG1lbXNldCAgICA7dGFpbCBjYWxsIHNvIG5lZWQgdG8gdGlua2VyIHdpdGggYmxpbmsKLUVORChtZW16ZXJvKQorRU5EX0NGSShtZW16ZXJvKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmNoci03MDAuUyBiL2FyY2gvYXJjL2xpYi9zdHJjaHItNzAwLlMKaW5kZXggYjcyNWQ1OC4uMmQzMDBkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL3N0cmNoci03MDAuUworKysgYi9hcmNoL2FyYy9saWIvc3RyY2hyLTcwMC5TCkBAIC0xMyw3ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmNocikKK0VOVFJZX0NGSShzdHJjaHIpCiAJZXh0Yl9zCXIxLHIxCiAJYXNsCXI1LHIxLDgKIAlibXNrCXIyLHIwLDEKQEAgLTEzMCw0ICsxMzAsNCBAQAogCWpfcy5kCVtibGlua10KIAltb3YubWkJcjAsMAogI2VuZGlmIC8qIEVORElBTiAqLwotRU5EKHN0cmNocikKK0VORF9DRkkoc3RyY2hyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmNtcC1hcmNocy5TIGIvYXJjaC9hcmMvbGliL3N0cmNtcC1hcmNocy5TCmluZGV4IDRmMzM4ZWUuLmZhZTllODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2xpYi9zdHJjbXAtYXJjaHMuUworKysgYi9hcmNoL2FyYy9saWIvc3RyY21wLWFyY2hzLlMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmNtcCkKK0VOVFJZX0NGSShzdHJjbXApCiAJb3IJcjIsIHIwLCByMQogCWJtc2tfcwlyMiwgcjIsIDEKIAlicm5lCXIyLCAwLCBALkxjaGFybG9vcApAQCAtNzUsNCArNzUsNCBAQAogLkxjbXBlbmQ6CiAJal9zLmQJW2JsaW5rXQogCXN1YglyMCwgcjIsIHIzCi1FTkQoc3RyY21wKQorRU5EX0NGSShzdHJjbXApCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9saWIvc3RyY21wLlMgYi9hcmNoL2FyYy9saWIvc3RyY21wLlMKaW5kZXggMzU0NDYwMC4uZmIyMDA5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL3N0cmNtcC5TCisrKyBiL2FyY2gvYXJjL2xpYi9zdHJjbXAuUwpAQCAtMTUsNyArMTUsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogCi1FTlRSWShzdHJjbXApCitFTlRSWV9DRkkoc3RyY21wKQogCW9yCXIyLHIwLHIxCiAJYm1za19zCXIyLHIyLDEKIAlicm5lCXIyLDAsLkxjaGFybG9vcApAQCAtOTMsNCArOTMsNCBAQAogLkxjbXBlbmQ6CiAJal9zLmQJW2JsaW5rXQogCXN1YglyMCxyMixyMwotRU5EKHN0cmNtcCkKK0VORF9DRkkoc3RyY21wKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmNweS03MDAuUyBiL2FyY2gvYXJjL2xpYi9zdHJjcHktNzAwLlMKaW5kZXggODQyMmYzOC4uNmE2YzE1NSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbGliL3N0cmNweS03MDAuUworKysgYi9hcmNoL2FyYy9saWIvc3RyY3B5LTcwMC5TCkBAIC0xOCw3ICsxOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmNweSkKK0VOVFJZX0NGSShzdHJjcHkpCiAJb3IJcjIscjAscjEKIAlibXNrX3MJcjIscjIsMQogCWJybmUuZAlyMiwwLGNoYXJsb29wCkBAIC02Nyw0ICs2Nyw0IEBACiAJYnJuZS5kCXIzLDAsY2hhcmxvb3AKIAlzdGIuYWIJcjMsW3IxMCwxXQogCWoJW2JsaW5rXQotRU5EKHN0cmNweSkKK0VORF9DRkkoc3RyY3B5KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvbGliL3N0cmxlbi5TIGIvYXJjaC9hcmMvbGliL3N0cmxlbi5TCmluZGV4IDUzY2ZkNTYuLjgzOWI0NGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2xpYi9zdHJsZW4uUworKysgYi9hcmNoL2FyYy9saWIvc3RybGVuLlMKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLUVOVFJZKHN0cmxlbikKK0VOVFJZX0NGSShzdHJsZW4pCiAJb3IJcjMscjAsNwogCWxkCXIyLFtyMywtN10KIAlsZC5hCXI2LFtyMywtM10KQEAgLTgwLDQgKzgwLDQgQEAKIC5MZWFybHlfZW5kOgogCWIuZAkuTGVuZAogCXN1Yl9zLm5lIHIxLHIxLHIxCi1FTkQoc3RybGVuKQorRU5EX0NGSShzdHJsZW4pCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9tbS9jYWNoZS5jIGIvYXJjaC9hcmMvbW0vY2FjaGUuYwppbmRleCAwYjEwZWZlLi45N2RkZGJlIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9tbS9jYWNoZS5jCisrKyBiL2FyY2gvYXJjL21tL2NhY2hlLmMKQEAgLTI1LDYgKzI1LDcgQEAKIGludCBpb2NfZXhpc3RzOwogdm9sYXRpbGUgaW50IHNsY19lbmFibGUgPSAxLCBpb2NfZW5hYmxlID0gMTsKIHVuc2lnbmVkIGxvbmcgcGVyaXBfYmFzZSA9IEFSQ19VTkNBQ0hFRF9BRERSX1NQQUNFOyAvKiBsZWdhY3kgdmFsdWUgZm9yIGJvb3QgKi8KK3Vuc2lnbmVkIGxvbmcgcGVyaXBfZW5kID0gMHhGRkZGRkZGRjsgLyogbGVnYWN5IHZhbHVlICovCiAKIHZvaWQgKCpfY2FjaGVfbGluZV9sb29wX2ljX2ZuKShwaHlzX2FkZHJfdCBwYWRkciwgdW5zaWduZWQgbG9uZyB2YWRkciwKIAkJCSAgICAgICB1bnNpZ25lZCBsb25nIHN6LCBjb25zdCBpbnQgY2FjaGVvcCk7CkBAIC03Niw3ICs3Nyw2IEBACiBzdGF0aWMgdm9pZCByZWFkX2RlY29kZV9jYWNoZV9iY3JfYXJjdjIoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY3B1aW5mb19hcmNfY2FjaGUgKnBfc2xjID0gJmNwdWluZm9fYXJjNzAwW2NwdV0uc2xjOwotCXN0cnVjdCBiY3JfZ2VuZXJpYyB1bmNhY2hlZF9zcGFjZTsKIAlzdHJ1Y3QgYmNyX2dlbmVyaWMgc2JjcjsKIAogCXN0cnVjdCBiY3Jfc2xjX2NmZyB7CkBAIC05NSw2ICs5NSwxNSBAQAogI2VuZGlmCiAJfSBjYmNyOwogCisJc3RydWN0IGJjcl92b2xhdGlsZSB7CisjaWZkZWYgQ09ORklHX0NQVV9CSUdfRU5ESUFOCisJCXVuc2lnbmVkIGludCBzdGFydDo0LCBsaW1pdDo0LCBwYWQ6MjIsIG9yZGVyOjEsIGRpc2FibGU6MTsKKyNlbHNlCisJCXVuc2lnbmVkIGludCBkaXNhYmxlOjEsIG9yZGVyOjEsIHBhZDoyMiwgbGltaXQ6NCwgc3RhcnQ6NDsKKyNlbmRpZgorCX0gdm9sOworCisKIAlSRUFEX0JDUihBUkNfUkVHX1NMQ19CQ1IsIHNiY3IpOwogCWlmIChzYmNyLnZlcikgewogCQlSRUFEX0JDUihBUkNfUkVHX1NMQ19DRkcsIHNsY19jZmcpOwpAQCAtMTA3LDEwICsxMTYsMTQgQEAKIAlpZiAoY2Jjci5jICYmIGlvY19lbmFibGUpCiAJCWlvY19leGlzdHMgPSAxOwogCi0JLyogTGVnYWN5IERhdGEgVW5jYWNoZWQgQkNSIGlzIGRlcHJlY2F0ZWQgZnJvbSB2MyBvbndhcmRzICovCi0JUkVBRF9CQ1IoQVJDX1JFR19EX1VOQ0FDSF9CQ1IsIHVuY2FjaGVkX3NwYWNlKTsKLQlpZiAodW5jYWNoZWRfc3BhY2UudmVyID4gMikKLQkJcGVyaXBfYmFzZSA9IHJlYWRfYXV4X3JlZyhBVVhfTk9OX1ZPTCkgJiAweEYwMDAwMDAwOworCS8qIEhTIDIuMCBkaWRuJ3QgaGF2ZSBBVVhfVk9MICovCisJaWYgKGNwdWluZm9fYXJjNzAwW2NwdV0uY29yZS5mYW1pbHkgPiAweDUxKSB7CisJCVJFQURfQkNSKEFVWF9WT0wsIHZvbCk7CisJCXBlcmlwX2Jhc2UgPSB2b2wuc3RhcnQgPDwgMjg7CisJCS8qIEhTIDMuMCBoYXMgbGltaXQgYW5kIHN0cmljdC1vcmRlcmluZyBmaWVsZHMgKi8KKwkJaWYgKGNwdWluZm9fYXJjNzAwW2NwdV0uY29yZS5mYW1pbHkgPiAweDUyKQorCQkJcGVyaXBfZW5kID0gKHZvbC5saW1pdCA8PCAyOCkgLSAxOworCX0KIH0KIAogdm9pZCByZWFkX2RlY29kZV9jYWNoZV9iY3Iodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL21tL2lvcmVtYXAuYyBiL2FyY2gvYXJjL21tL2lvcmVtYXAuYwppbmRleCBmNTJiN2RiNi4uOTg4MWJkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvbW0vaW9yZW1hcC5jCisrKyBiL2FyY2gvYXJjL21tL2lvcmVtYXAuYwpAQCAtMTksNyArMTksNyBAQAogCWlmIChpc19pc2FfYXJjb21wYWN0KCkpIHsKIAkJaWYgKHBhZGRyID49IEFSQ19VTkNBQ0hFRF9BRERSX1NQQUNFKQogCQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIGlmIChwYWRkciA+PSBwZXJpcF9iYXNlICYmIHBhZGRyIDw9IDB4RkZGRkZGRkYpIHsKKwl9IGVsc2UgaWYgKHBhZGRyID49IHBlcmlwX2Jhc2UgJiYgcGFkZHIgPD0gcGVyaXBfZW5kKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvcGxhdC1zaW0vcGxhdGZvcm0uYyBiL2FyY2gvYXJjL3BsYXQtc2ltL3BsYXRmb3JtLmMKaW5kZXggZTRmZTUxNC4uYWVhODczOCAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvcGxhdC1zaW0vcGxhdGZvcm0uYworKysgYi9hcmNoL2FyYy9wbGF0LXNpbS9wbGF0Zm9ybS5jCkBAIC0yNCw2ICsyNCw3IEBACiAJInNucHMsbnNpbV9ocyIsCiAJInNucHMsbnNpbW9zY2kiLAogCSJzbnBzLG5zaW1vc2NpX2hzIiwKKwkic25wcyx6ZWJ1X2hzIiwKIAlOVUxMLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vS2NvbmZpZyBiL2FyY2gvYXJtL0tjb25maWcKaW5kZXggYTljNGU0OC4uMTI1NjU3YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vS2NvbmZpZworKysgYi9hcmNoL2FybS9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIEFSTQogCWJvb2wKIAlkZWZhdWx0IHkKKwlzZWxlY3QgQVJDSF9DTE9DS1NPVVJDRV9EQVRBCiAJc2VsZWN0IEFSQ0hfSEFTX0FUT01JQzY0X0RFQ19JRl9QT1NJVElWRQogCXNlbGVjdCBBUkNIX0hBU19ERVZNRU1fSVNfQUxMT1dFRAogCXNlbGVjdCBBUkNIX0hBU19FTEZfUkFORE9NSVpFCkBAIC0yNzgsMTAgKzI3OSw5IEBACiAJCQlBUkNIX0lOVEVHUkFUT1IgfHwgXAogCQkJQVJDSF9JT1AxM1hYIHx8IFwKIAkJCUFSQ0hfS1M4Njk1IHx8IFwKLQkJCShBUkNIX1JFQUxWSUVXICYmICFSRUFMVklFV19ISUdIX1BIWVNfT0ZGU0VUKQorCQkJQVJDSF9SRUFMVklFVwogCWRlZmF1bHQgMHgxMDAwMDAwMCBpZiBBUkNIX09NQVAxIHx8IEFSQ0hfUlBDCiAJZGVmYXVsdCAweDIwMDAwMDAwIGlmIEFSQ0hfUzVQVjIxMAotCWRlZmF1bHQgMHg3MDAwMDAwMCBpZiBSRUFMVklFV19ISUdIX1BIWVNfT0ZGU0VUCiAJZGVmYXVsdCAweGMwMDAwMDAwIGlmIEFSQ0hfU0ExMTAwCiAJaGVscAogCSAgUGxlYXNlIHByb3ZpZGUgdGhlIHBoeXNpY2FsIGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0aGUKQEAgLTMzNyw2ICszMzcsNyBAQAogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IE1JR0hUX0hBVkVfUENJCiAJc2VsZWN0IE1VTFRJX0lSUV9IQU5ETEVSCisJc2VsZWN0IFBDSV9ET01BSU5TIGlmIFBDSQogCXNlbGVjdCBTUEFSU0VfSVJRCiAJc2VsZWN0IFVTRV9PRgogCkBAIC04NzgsNiArODc5LDcgQEAKIAlzZWxlY3QgQ0xLU1JDX1NUTTMyCiAJc2VsZWN0IFBJTkNUUkwKIAlzZWxlY3QgUkVTRVRfQ09OVFJPTExFUgorCXNlbGVjdCBTVE0zMl9FWFRJCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgU1RNaWNyb2VsZWN0cm9uaWNzIFNUTTMyIHByb2Nlc3NvcnMuCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggNjFmNmNjYy4uNmJlOWVlMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTIzLDcgKzIzLDYgQEAKIExERkxBR1NfTU9EVUxFCSs9IC1UICQoc3JjdHJlZSkvYXJjaC9hcm0va2VybmVsL21vZHVsZS5sZHMKIGVuZGlmCiAKLU9CSkNPUFlGTEFHUwk6PS1PIGJpbmFyeSAtUiAuY29tbWVudCAtUwogR1pGTEFHUwkJOj0tOQogI0tCVUlMRF9DRkxBR1MJKz0tcGlwZQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L01ha2VmaWxlIGIvYXJjaC9hcm0vYm9vdC9NYWtlZmlsZQppbmRleCBiZGMxZDVhLi41MGY4ZDFiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUKQEAgLTExLDYgKzExLDggQEAKICMgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDIgUnVzc2VsbCBLaW5nCiAjCiAKK09CSkNPUFlGTEFHUwk6PS1PIGJpbmFyeSAtUiAuY29tbWVudCAtUworCiBpZm5lcSAoJChNQUNISU5FKSwpCiBpbmNsdWRlICQoTUFDSElORSkvTWFrZWZpbGUuYm9vdAogZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IGFmMTFjMmYuLmZjNmQ1NDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtNzc5LDcgKzc3OSw3IEBACiAJCW9ycm5lCXIwLCByMCwgIzEJCUAgTU1VIGVuYWJsZWQKIAkJbW92bmUJcjEsICMweGZmZmZmZmZkCQlAIGRvbWFpbiAwID0gY2xpZW50CiAJCWJpYyAgICAgcjYsIHI2LCAjMSA8PCAzMSAgICAgICAgQCAzMi1iaXQgdHJhbnNsYXRpb24gc3lzdGVtCi0JCWJpYyAgICAgcjYsIHI2LCAjMyA8PCAwICAgICAgICAgQCB1c2Ugb25seSB0dGJyMAorCQliaWMgICAgIHI2LCByNiwgIyg3IDw8IDApIHwgKDEgPDwgNCkJQCB1c2Ugb25seSB0dGJyMAogCQltY3JuZQlwMTUsIDAsIHIzLCBjMiwgYzAsIDAJQCBsb2FkIHBhZ2UgdGFibGUgcG9pbnRlcgogCQltY3JuZQlwMTUsIDAsIHIxLCBjMywgYzAsIDAJQCBsb2FkIGRvbWFpbiBhY2Nlc3MgY29udHJvbAogCQltY3JuZSAgIHAxNSwgMCwgcjYsIGMyLCBjMCwgMiAgIEAgbG9hZCB0dGIgY29udHJvbApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWJhbHRvcy5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW0zMzV4LWJhbHRvcy5kdHNpCmluZGV4IGM4NjA5ZDguLmI2ODkxNzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FtMzM1eC1iYWx0b3MuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9hbTMzNXgtYmFsdG9zLmR0c2kKQEAgLTIyNiw3ICsyMjYsNyBAQAogCiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+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+ZHJpdmVyKTsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTQwMSw3ICsxNDg3LDcgQEAKIHN0YXRpYyBpbnQgc2ExMTExX25vdGlmaWVyX2NhbGwoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKIAl2b2lkICpkYXRhKQogewotCXN0cnVjdCBzYTExMTFfZGV2ICpkZXYgPSBTQTExMTFfREVWKGRhdGEpOworCXN0cnVjdCBzYTExMTFfZGV2ICpkZXYgPSB0b19zYTExMTFfZGV2aWNlKGRhdGEpOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIEJVU19OT1RJRllfQUREX0RFVklDRToKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvZXh5bm9zX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvZXh5bm9zX2RlZmNvbmZpZwppbmRleCAwMTk4NmRlLi4zNmNjN2NjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2V4eW5vc19kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9leHlub3NfZGVmY29uZmlnCkBAIC0yOCw3ICsyOCw3IEBACiBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRT1tCi1DT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD1tCitDT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD15CiBDT05GSUdfQ1BVRlJFUV9EVD15CiBDT05GSUdfQ1BVX0lETEU9eQogQ09ORklHX0FSTV9FWFlOT1NfQ1BVSURMRT15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2lteF92NF92NV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2lteF92NF92NV9kZWZjb25maWcKaW5kZXggOTA4MzM5OS4uNWYwMTNjOWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvaW14X3Y0X3Y1X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2lteF92NF92NV9kZWZjb25maWcKQEAgLTIyLDE0ICsyMiwxMyBAQAogQ09ORklHX0FSQ0hfTVVMVElfVjU9eQogIyBDT05GSUdfQVJDSF9NVUxUSV9WNyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9NWEM9eQotQ09ORklHX01BQ0hfU0NCOTMyOD15Ci1DT05GSUdfTUFDSF9BUEY5MzI4PXkKIENPTkZJR19NQUNIX01YMjFBRFM9eQogQ09ORklHX01BQ0hfTVgyN0FEUz15CiBDT05GSUdfTUFDSF9NWDI3XzNEUz15CiBDT05GSUdfTUFDSF9JTVgyN19WSVNTVFJJTV9NMTA9eQogQ09ORklHX01BQ0hfUENBMTAwPXkKIENPTkZJR19NQUNIX0lNWDI3X0RUPXkKK0NPTkZJR19TT0NfSU1YMT15CiBDT05GSUdfU09DX0lNWDI1PXkKIENPTkZJR19QUkVFTVBUPXkKIENPTkZJR19BRUFCST15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2tleXN0b25lX2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3Mva2V5c3RvbmVfZGVmY29uZmlnCmluZGV4IDcxYjQyZTYuLjc4Y2QyZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3Mva2V5c3RvbmVfZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3Mva2V5c3RvbmVfZGVmY29uZmlnCkBAIC0xNjEsNiArMTYxLDcgQEAKIENPTkZJR19VU0JfWEhDSV9IQ0Q9eQogQ09ORklHX1VTQl9TVE9SQUdFPXkKIENPTkZJR19VU0JfRFdDMz15CitDT05GSUdfTk9QX1VTQl9YQ0VJVj15CiBDT05GSUdfS0VZU1RPTkVfVVNCX1BIWT15CiBDT05GSUdfTkVXX0xFRFM9eQogQ09ORklHX0xFRFNfQ0xBU1M9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9tdWx0aV92NHRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9tdWx0aV92NHRfZGVmY29uZmlnCmluZGV4IDQzM2VlYmIuLjlhNjM5MGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvbXVsdGlfdjR0X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL211bHRpX3Y0dF9kZWZjb25maWcKQEAgLTIwLDkgKzIwLDcgQEAKIENPTkZJR19JTlRFR1JBVE9SX0NNOTIwVD15CiBDT05GSUdfSU5URUdSQVRPUl9DTTkyMlRfWEExMD15CiBDT05GSUdfQVJDSF9NWEM9eQotQ09ORklHX01BQ0hfU0NCOTMyOD15Ci1DT05GSUdfTUFDSF9BUEY5MzI4PXkKLUNPTkZJR19NQUNIX0lNWDFfRFQ9eQorQ09ORklHX1NPQ19JTVgxPXkKIENPTkZJR19BUkNIX05TUElSRT15CiBDT05GSUdfQUVBQkk9eQogIyBDT05GSUdfQVRBR1MgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9tdWx0aV92N19kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZwppbmRleCAyYzg2NjVjLi41ODQ1OTEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL211bHRpX3Y3X2RlZmNvbmZpZwpAQCAtMTM1LDcgKzEzNSw3IEBACiBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT1tCiBDT05GSUdfQ1BVX0ZSRVFfR09WX0NPTlNFUlZBVElWRT1tCi1DT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD1tCitDT05GSUdfQ1BVX0ZSRVFfR09WX1NDSEVEVVRJTD15CiBDT05GSUdfUU9SSVFfQ1BVRlJFUT15CiBDT05GSUdfQ1BVX0lETEU9eQogQ09ORklHX0FSTV9DUFVJRExFPXkKQEAgLTc4MSw3ICs3ODEsNyBAQAogQ09ORklHX0RNQV9CQ00yODM1PXkKIENPTkZJR19ETUFfT01BUD15CiBDT05GSUdfUUNPTV9CQU1fRE1BPXkKLUNPTkZJR19YSUxJTlhfVkRNQT15CitDT05GSUdfWElMSU5YX0RNQT15CiBDT05GSUdfRE1BX1NVTjZJPXkKIENPTkZJR19TVEFHSU5HPXkKIENPTkZJR19TRU5TT1JTX0lTTDI5MDE4PXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NyeXB0by9hZXMtY2UtZ2x1ZS5jIGIvYXJjaC9hcm0vY3J5cHRvL2Flcy1jZS1nbHVlLmMKaW5kZXggZGEzYzA0Mi4uYWVmMDIyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY3J5cHRvL2Flcy1jZS1nbHVlLmMKKysrIGIvYXJjaC9hcm0vY3J5cHRvL2Flcy1jZS1nbHVlLmMKQEAgLTI4NCw3ICsyODQsNyBAQAogCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLAogCQkJCQkgIHdhbGsubmJ5dGVzICUgQUVTX0JMT0NLX1NJWkUpOwogCX0KLQlpZiAobmJ5dGVzKSB7CisJaWYgKHdhbGsubmJ5dGVzICUgQUVTX0JMT0NLX1NJWkUpIHsKIAkJdTggKnRkc3QgPSB3YWxrLmRzdC52aXJ0LmFkZHIgKyBibG9ja3MgKiBBRVNfQkxPQ0tfU0laRTsKIAkJdTggKnRzcmMgPSB3YWxrLnNyYy52aXJ0LmFkZHIgKyBibG9ja3MgKiBBRVNfQkxPQ0tfU0laRTsKIAkJdTggX19hbGlnbmVkKDgpIHRhaWxbQUVTX0JMT0NLX1NJWkVdOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXJjaF9naWN2My5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXJjaF9naWN2My5oCmluZGV4IGUwOGQxNTEuLmE4MDg4MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hcmNoX2dpY3YzLmgKQEAgLTIyLDkgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KLQotI2RlZmluZSBfX0FDQ0VTU19DUDE1KENSbiwgT3AxLCBDUm0sIE9wMikJcDE1LCBPcDEsICUwLCBDUm4sIENSbSwgT3AyCi0jZGVmaW5lIF9fQUNDRVNTX0NQMTVfNjQoT3AxLCBDUm0pCQlwMTUsIE9wMSwgJVEwLCAlUjAsIENSbQorI2luY2x1ZGUgPGFzbS9jcDE1Lmg+CiAKICNkZWZpbmUgSUNDX0VPSVIxCQkJX19BQ0NFU1NfQ1AxNShjMTIsIDAsIGMxMiwgMSkKICNkZWZpbmUgSUNDX0RJUgkJCQlfX0FDQ0VTU19DUDE1KGMxMiwgMCwgYzExLCAxKQpAQCAtMzQsNiArMzIsNyBAQAogI2RlZmluZSBJQ0NfQ1RMUgkJCV9fQUNDRVNTX0NQMTUoYzEyLCAwLCBjMTIsIDQpCiAjZGVmaW5lIElDQ19TUkUJCQkJX19BQ0NFU1NfQ1AxNShjMTIsIDAsIGMxMiwgNSkKICNkZWZpbmUgSUNDX0lHUlBFTjEJCQlfX0FDQ0VTU19DUDE1KGMxMiwgMCwgYzEyLCA3KQorI2RlZmluZSBJQ0NfQlBSMQkJCV9fQUNDRVNTX0NQMTUoYzEyLCAwLCBjMTIsIDMpCiAKICNkZWZpbmUgSUNDX0hTUkUJCQlfX0FDQ0VTU19DUDE1KGMxMiwgNCwgYzksIDUpCiAKQEAgLTk4LDY1ICs5NywxMzEgQEAKICNkZWZpbmUgSUNIX0FQMVIyCQkJX19BUDFSeCgyKQogI2RlZmluZSBJQ0hfQVAxUjMJCQlfX0FQMVJ4KDMpCiAKKy8qIEEzMi10by1BNjQgbWFwcGluZ3MgdXNlZCBieSBWR0lDIHNhdmUvcmVzdG9yZSAqLworCisjZGVmaW5lIENQVUlGX01BUChhMzIsIGE2NCkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfICMjIGE2NCh1MzIgdmFsKQlcCit7CQkJCQkJXAorCXdyaXRlX3N5c3JlZyh2YWwsIGEzMik7CQkJXAorfQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfICMjIGE2NCh2b2lkKQkJXAorewkJCQkJCVwKKwlyZXR1cm4gcmVhZF9zeXNyZWcoYTMyKTsgCQlcCit9CQkJCQkJXAorCisjZGVmaW5lIENQVUlGX01BUF9MT19ISShhMzJsbywgYTMyaGksIGE2NCkJXAorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlXyAjIyBhNjQodTY0IHZhbCkJXAorewkJCQkJCVwKKwl3cml0ZV9zeXNyZWcobG93ZXJfMzJfYml0cyh2YWwpLCBhMzJsbyk7XAorCXdyaXRlX3N5c3JlZyh1cHBlcl8zMl9iaXRzKHZhbCksIGEzMmhpKTtcCit9CQkJCQkJXAorc3RhdGljIGlubGluZSB1NjQgcmVhZF8gIyMgYTY0KHZvaWQpCQlcCit7CQkJCQkJXAorCXU2NCB2YWwgPSByZWFkX3N5c3JlZyhhMzJsbyk7CQlcCisJCQkJCQlcCisJdmFsIHw9CSh1NjQpcmVhZF9zeXNyZWcoYTMyaGkpIDw8IDMyOwlcCisJCQkJCQlcCisJcmV0dXJuIHZhbDsgCQkJCVwKK30KKworQ1BVSUZfTUFQKElDSF9IQ1IsIElDSF9IQ1JfRUwyKQorQ1BVSUZfTUFQKElDSF9WVFIsIElDSF9WVFJfRUwyKQorQ1BVSUZfTUFQKElDSF9NSVNSLCBJQ0hfTUlTUl9FTDIpCitDUFVJRl9NQVAoSUNIX0VJU1IsIElDSF9FSVNSX0VMMikKK0NQVUlGX01BUChJQ0hfRUxTUiwgSUNIX0VMU1JfRUwyKQorQ1BVSUZfTUFQKElDSF9WTUNSLCBJQ0hfVk1DUl9FTDIpCitDUFVJRl9NQVAoSUNIX0FQMFIzLCBJQ0hfQVAwUjNfRUwyKQorQ1BVSUZfTUFQKElDSF9BUDBSMiwgSUNIX0FQMFIyX0VMMikKK0NQVUlGX01BUChJQ0hfQVAwUjEsIElDSF9BUDBSMV9FTDIpCitDUFVJRl9NQVAoSUNIX0FQMFIwLCBJQ0hfQVAwUjBfRUwyKQorQ1BVSUZfTUFQKElDSF9BUDFSMywgSUNIX0FQMVIzX0VMMikKK0NQVUlGX01BUChJQ0hfQVAxUjIsIElDSF9BUDFSMl9FTDIpCitDUFVJRl9NQVAoSUNIX0FQMVIxLCBJQ0hfQVAxUjFfRUwyKQorQ1BVSUZfTUFQKElDSF9BUDFSMCwgSUNIX0FQMVIwX0VMMikKK0NQVUlGX01BUChJQ0NfSFNSRSwgSUNDX1NSRV9FTDIpCitDUFVJRl9NQVAoSUNDX1NSRSwgSUNDX1NSRV9FTDEpCisKK0NQVUlGX01BUF9MT19ISShJQ0hfTFIxNSwgSUNIX0xSQzE1LCBJQ0hfTFIxNV9FTDIpCitDUFVJRl9NQVBfTE9fSEkoSUNIX0xSMTQsIElDSF9MUkMxNCwgSUNIX0xSMTRfRUwyKQorQ1BVSUZfTUFQX0xPX0hJKElDSF9MUjEzLCBJQ0hfTFJDMTMsIElDSF9MUjEzX0VMMikKK0NQVUlGX01BUF9MT19ISShJQ0hfTFIxMiwgSUNIX0xSQzEyLCBJQ0hfTFIxMl9FTDIpCitDUFVJRl9NQVBfTE9fSEkoSUNIX0xSMTEsIElDSF9MUkMxMSwgSUNIX0xSMTFfRUwyKQorQ1BVSUZfTUFQX0xPX0hJKElDSF9MUjEwLCBJQ0hfTFJDMTAsIElDSF9MUjEwX0VMMikKK0NQVUlGX01BUF9MT19ISShJQ0hfTFI5LCBJQ0hfTFJDOSwgSUNIX0xSOV9FTDIpCitDUFVJRl9NQVBfTE9fSEkoSUNIX0xSOCwgSUNIX0xSQzgsIElDSF9MUjhfRUwyKQorQ1BVSUZfTUFQX0xPX0hJKElDSF9MUjcsIElDSF9MUkM3LCBJQ0hfTFI3X0VMMikKK0NQVUlGX01BUF9MT19ISShJQ0hfTFI2LCBJQ0hfTFJDNiwgSUNIX0xSNl9FTDIpCitDUFVJRl9NQVBfTE9fSEkoSUNIX0xSNSwgSUNIX0xSQzUsIElDSF9MUjVfRUwyKQorQ1BVSUZfTUFQX0xPX0hJKElDSF9MUjQsIElDSF9MUkM0LCBJQ0hfTFI0X0VMMikKK0NQVUlGX01BUF9MT19ISShJQ0hfTFIzLCBJQ0hfTFJDMywgSUNIX0xSM19FTDIpCitDUFVJRl9NQVBfTE9fSEkoSUNIX0xSMiwgSUNIX0xSQzIsIElDSF9MUjJfRUwyKQorQ1BVSUZfTUFQX0xPX0hJKElDSF9MUjEsIElDSF9MUkMxLCBJQ0hfTFIxX0VMMikKK0NQVUlGX01BUF9MT19ISShJQ0hfTFIwLCBJQ0hfTFJDMCwgSUNIX0xSMF9FTDIpCisKKyNkZWZpbmUgcmVhZF9naWNyZWcocikgICAgICAgICAgICAgICAgIHJlYWRfIyNyKCkKKyNkZWZpbmUgd3JpdGVfZ2ljcmVnKHYsIHIpICAgICAgICAgICAgIHdyaXRlXyMjcih2KQorCiAvKiBMb3ctbGV2ZWwgYWNjZXNzb3JzICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBnaWNfd3JpdGVfZW9pcih1MzIgaXJxKQogewotCWFzbSB2b2xhdGlsZSgibWNyICIgX19zdHJpbmdpZnkoSUNDX0VPSVIxKSA6IDogInIiIChpcnEpKTsKKwl3cml0ZV9zeXNyZWcoaXJxLCBJQ0NfRU9JUjEpOwogCWlzYigpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2ljX3dyaXRlX2Rpcih1MzIgdmFsKQogewotCWFzbSB2b2xhdGlsZSgibWNyICIgX19zdHJpbmdpZnkoSUNDX0RJUikgOiA6ICJyIiAodmFsKSk7CisJd3JpdGVfc3lzcmVnKHZhbCwgSUNDX0RJUik7CiAJaXNiKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGdpY19yZWFkX2lhcih2b2lkKQogewotCXUzMiBpcnFzdGF0OworCXUzMiBpcnFzdGF0ID0gcmVhZF9zeXNyZWcoSUNDX0lBUjEpOwogCi0JYXNtIHZvbGF0aWxlKCJtcmMgIiBfX3N0cmluZ2lmeShJQ0NfSUFSMSkgOiAiPXIiIChpcnFzdGF0KSk7CiAJZHNiKHN5KTsKKwogCXJldHVybiBpcnFzdGF0OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2ljX3dyaXRlX3Btcih1MzIgdmFsKQogewotCWFzbSB2b2xhdGlsZSgibWNyICIgX19zdHJpbmdpZnkoSUNDX1BNUikgOiA6ICJyIiAodmFsKSk7CisJd3JpdGVfc3lzcmVnKHZhbCwgSUNDX1BNUik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBnaWNfd3JpdGVfY3Rscih1MzIgdmFsKQogewotCWFzbSB2b2xhdGlsZSgibWNyICIgX19zdHJpbmdpZnkoSUNDX0NUTFIpIDogOiAiciIgKHZhbCkpOworCXdyaXRlX3N5c3JlZyh2YWwsIElDQ19DVExSKTsKIAlpc2IoKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGdpY193cml0ZV9ncnBlbjEodTMyIHZhbCkKIHsKLQlhc20gdm9sYXRpbGUoIm1jciAiIF9fc3RyaW5naWZ5KElDQ19JR1JQRU4xKSA6IDogInIiICh2YWwpKTsKKwl3cml0ZV9zeXNyZWcodmFsLCBJQ0NfSUdSUEVOMSk7CiAJaXNiKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBnaWNfd3JpdGVfc2dpMXIodTY0IHZhbCkKIHsKLQlhc20gdm9sYXRpbGUoIm1jcnIgIiBfX3N0cmluZ2lmeShJQ0NfU0dJMVIpIDogOiAiciIgKHZhbCkpOworCXdyaXRlX3N5c3JlZyh2YWwsIElDQ19TR0kxUik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGdpY19yZWFkX3NyZSh2b2lkKQogewotCXUzMiB2YWw7Ci0KLQlhc20gdm9sYXRpbGUoIm1yYyAiIF9fc3RyaW5naWZ5KElDQ19TUkUpIDogIj1yIiAodmFsKSk7Ci0JcmV0dXJuIHZhbDsKKwlyZXR1cm4gcmVhZF9zeXNyZWcoSUNDX1NSRSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBnaWNfd3JpdGVfc3JlKHUzMiB2YWwpCiB7Ci0JYXNtIHZvbGF0aWxlKCJtY3IgIiBfX3N0cmluZ2lmeShJQ0NfU1JFKSA6IDogInIiICh2YWwpKTsKKwl3cml0ZV9zeXNyZWcodmFsLCBJQ0NfU1JFKTsKIAlpc2IoKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGdpY193cml0ZV9icHIxKHUzMiB2YWwpCit7CisJd3JpdGVfc3lzcmVnKHZhbCwgSUNDX0JQUjEpOworfQorCiAvKgogICogRXZlbiBpbiAzMmJpdCBzeXN0ZW1zIHRoYXQgdXNlIExQQUUsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBJL08KICAqIGludGVyZmFjZSBwcm92aWRlcyB0cnVlIDY0Yml0IGF0b21pYyBhY2Nlc3Nlcywgc28gdXNpbmcgc3RyZC9sZHJkIGRvZXNuJ3QKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKaW5kZXggNGVhZWEyMS4uNjhiMDZmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKQEAgLTE1OSw3ICsxNTksMTEgQEAKIAkuZW5kbQogCiAJLm1hY3JvCXNhdmVfYW5kX2Rpc2FibGVfaXJxc19ub3RyYWNlLCBvbGRjcHNyCisjaWZkZWYgQ09ORklHX0NQVV9WN00KKwltcnMJXG9sZGNwc3IsIHByaW1hc2sKKyNlbHNlCiAJbXJzCVxvbGRjcHNyLCBjcHNyCisjZW5kaWYKIAlkaXNhYmxlX2lycV9ub3RyYWNlCiAJLmVuZG0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IDkxNTZmYzMuLmJkZDI4M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTUwMSwyMSArNTAxLDQgQEAKIHZvaWQgZmx1c2hfdXByb2JlX3hvbF9hY2Nlc3Moc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgdWFkZHIsCiAJCQkgICAgIHZvaWQgKmthZGRyLCB1bnNpZ25lZCBsb25nIGxlbik7CiAKLS8qKgotICogc2VjdXJlX2ZsdXNoX2FyZWEgLSBlbnN1cmUgY29oZXJlbmN5IGFjcm9zcyB0aGUgc2VjdXJlIGJvdW5kYXJ5Ci0gKiBAYWRkcjogdmlydHVhbCBhZGRyZXNzCi0gKiBAc2l6ZTogc2l6ZSBvZiByZWdpb24KLSAqCi0gKiBFbnN1cmUgdGhhdCB0aGUgc3BlY2lmaWVkIGFyZWEgb2YgbWVtb3J5IGlzIGNvaGVyZW50IGFjcm9zcyB0aGUgc2VjdXJlCi0gKiBib3VuZGFyeSBmcm9tIHRoZSBub24tc2VjdXJlIHNpZGUuICBUaGlzIGlzIHVzZWQgd2hlbiBjYWxsaW5nIHNlY3VyZQotICogZmlybXdhcmUgd2hlcmUgdGhlIHNlY3VyZSBmaXJtd2FyZSBkb2VzIG5vdCBlbnN1cmUgY29oZXJlbmN5LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJlX2ZsdXNoX2FyZWEoY29uc3Qgdm9pZCAqYWRkciwgc2l6ZV90IHNpemUpCi17Ci0JcGh5c19hZGRyX3QgcGh5cyA9IF9fcGEoYWRkcik7Ci0KLQlfX2NwdWNfZmx1c2hfZGNhY2hlX2FyZWEoKHZvaWQgKilhZGRyLCBzaXplKTsKLQlvdXRlcl9mbHVzaF9yYW5nZShwaHlzLCBwaHlzICsgc2l6ZSk7Ci19Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2FjaGV0eXBlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZXR5cGUuaAppbmRleCA3ZWE3ODE0Li4wMTUwOWFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZXR5cGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jYWNoZXR5cGUuaApAQCAtNTYsNCArNTYsNDMgQEAKIAkgICAgICAgKH5fX0NBQ0hFSURfTkVWRVIgJiBfX0NBQ0hFSURfQVJDSF9NSU4gJiBtYXNrICYgY2FjaGVpZCk7CiB9CiAKKyNkZWZpbmUgQ1NTRUxSX0lDQUNIRQkxCisjZGVmaW5lIENTU0VMUl9EQ0FDSEUJMAorCisjZGVmaW5lIENTU0VMUl9MMQkoMCA8PCAxKQorI2RlZmluZSBDU1NFTFJfTDIJKDEgPDwgMSkKKyNkZWZpbmUgQ1NTRUxSX0wzCSgyIDw8IDEpCisjZGVmaW5lIENTU0VMUl9MNAkoMyA8PCAxKQorI2RlZmluZSBDU1NFTFJfTDUJKDQgPDwgMSkKKyNkZWZpbmUgQ1NTRUxSX0w2CSg1IDw8IDEpCisjZGVmaW5lIENTU0VMUl9MNwkoNiA8PCAxKQorCisjaWZuZGVmIENPTkZJR19DUFVfVjdNCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2Nzc2Vscih1bnNpZ25lZCBpbnQgY2FjaGVfc2VsZWN0b3IpCit7CisJYXNtIHZvbGF0aWxlKCJtY3IgcDE1LCAyLCAlMCwgYzAsIGMwLCAwIiA6IDogInIiIChjYWNoZV9zZWxlY3RvcikpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWFkX2Njc2lkcih2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDEsICUwLCBjMCwgYzAsIDAiIDogIj1yIiAodmFsKSk7CisJcmV0dXJuIHZhbDsKK30KKyNlbHNlIC8qIENPTkZJR19DUFVfVjdNICovCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlICJhc20vdjdtLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3NzZWxyKHVuc2lnbmVkIGludCBjYWNoZV9zZWxlY3RvcikKK3sKKwl3cml0ZWwoY2FjaGVfc2VsZWN0b3IsIEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NUUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHJlYWRfY2NzaWRyKHZvaWQpCit7CisJcmV0dXJuIHJlYWRsKEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NDU0lEUik7Cit9CisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9jbG9ja3NvdXJjZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjM1MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX0FTTV9DTE9DS1NPVVJDRV9ICisjZGVmaW5lIF9BU01fQ0xPQ0tTT1VSQ0VfSAorCitzdHJ1Y3QgYXJjaF9jbG9ja3NvdXJjZV9kYXRhIHsKKwlib29sIHZkc29fZGlyZWN0OwkvKiBVc2FibGUgZm9yIGRpcmVjdCBWRFNPIGFjY2Vzcz8gKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3AxNS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3AxNS5oCmluZGV4IGMzZjExNTIuLmRiZGJjZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NwMTUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcDE1LmgKQEAgLTQ5LDYgKzQ5LDIxIEBACiAKICNpZmRlZiBDT05GSUdfQ1BVX0NQMTUKIAorI2RlZmluZSBfX0FDQ0VTU19DUDE1KENSbiwgT3AxLCBDUm0sIE9wMikJXAorCSJtcmMiLCAibWNyIiwgX19zdHJpbmdpZnkocDE1LCBPcDEsICUwLCBDUm4sIENSbSwgT3AyKSwgdTMyCisjZGVmaW5lIF9fQUNDRVNTX0NQMTVfNjQoT3AxLCBDUm0pCQlcCisJIm1ycmMiLCAibWNyciIsIF9fc3RyaW5naWZ5KHAxNSwgT3AxLCAlUTAsICVSMCwgQ1JtKSwgdTY0CisKKyNkZWZpbmUgX19yZWFkX3N5c3JlZyhyLCB3LCBjLCB0KSAoewkJCQlcCisJdCBfX3ZhbDsJCQkJCQlcCisJYXNtIHZvbGF0aWxlKHIgIiAiIGMgOiAiPXIiIChfX3ZhbCkpOwkJCVwKKwlfX3ZhbDsJCQkJCQkJXAorfSkKKyNkZWZpbmUgcmVhZF9zeXNyZWcoLi4uKQkJX19yZWFkX3N5c3JlZyhfX1ZBX0FSR1NfXykKKworI2RlZmluZSBfX3dyaXRlX3N5c3JlZyh2LCByLCB3LCBjLCB0KQlhc20gdm9sYXRpbGUodyAiICIgYyA6IDogInIiICgodCkodikpKQorI2RlZmluZSB3cml0ZV9zeXNyZWcodiwgLi4uKQkJX193cml0ZV9zeXNyZWcodiwgX19WQV9BUkdTX18pCisKIGV4dGVybiB1bnNpZ25lZCBsb25nIGNyX2FsaWdubWVudDsJLyogZGVmaW5lZCBpbiBlbnRyeS1hcm12LlMgKi8KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9jcih2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1dHlwZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1dHlwZS5oCmluZGV4IDFlZTk0YzcuLjUyMmI1ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NwdXR5cGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcHV0eXBlLmgKQEAgLTU1LDExICs1NSwxMyBAQAogCiAjZGVmaW5lIE1QSURSX0xFVkVMX0JJVFMgOAogI2RlZmluZSBNUElEUl9MRVZFTF9NQVNLICgoMSA8PCBNUElEUl9MRVZFTF9CSVRTKSAtIDEpCisjZGVmaW5lIE1QSURSX0xFVkVMX1NISUZUKGxldmVsKSAoTVBJRFJfTEVWRUxfQklUUyAqIGxldmVsKQogCiAjZGVmaW5lIE1QSURSX0FGRklOSVRZX0xFVkVMKG1waWRyLCBsZXZlbCkgXAogCSgobXBpZHIgPj4gKE1QSURSX0xFVkVMX0JJVFMgKiBsZXZlbCkpICYgTVBJRFJfTEVWRUxfTUFTSykKIAogI2RlZmluZSBBUk1fQ1BVX0lNUF9BUk0JCQkweDQxCisjZGVmaW5lIEFSTV9DUFVfSU1QX0RFQwkJCTB4NDQKICNkZWZpbmUgQVJNX0NQVV9JTVBfSU5URUwJCTB4NjkKIAogLyogQVJNIGltcGxlbWVudGVkIHByb2Nlc3NvcnMgKi8KQEAgLTc2LDYgKzc4LDE3IEBACiAjZGVmaW5lIEFSTV9DUFVfUEFSVF9DT1JURVhfQTE1CQkweDQxMDBjMGYwCiAjZGVmaW5lIEFSTV9DUFVfUEFSVF9NQVNLCQkweGZmMDBmZmYwCiAKKy8qIERFQyBpbXBsZW1lbnRlZCBjb3JlcyAqLworI2RlZmluZSBBUk1fQ1BVX1BBUlRfU0ExMTAwCQkweDQ0MDBhMTEwCisKKy8qIEludGVsIGltcGxlbWVudGVkIGNvcmVzICovCisjZGVmaW5lIEFSTV9DUFVfUEFSVF9TQTExMTAJCTB4NjkwMGIxMTAKKyNkZWZpbmUgQVJNX0NQVV9SRVZfU0ExMTEwX0EwCQkwCisjZGVmaW5lIEFSTV9DUFVfUkVWX1NBMTExMF9CMAkJNAorI2RlZmluZSBBUk1fQ1BVX1JFVl9TQTExMTBfQjEJCTUKKyNkZWZpbmUgQVJNX0NQVV9SRVZfU0ExMTEwX0IyCQk2CisjZGVmaW5lIEFSTV9DUFVfUkVWX1NBMTExMF9CNAkJOAorCiAjZGVmaW5lIEFSTV9DUFVfWFNDQUxFX0FSQ0hfTUFTSwkweGUwMDAKICNkZWZpbmUgQVJNX0NQVV9YU0NBTEVfQVJDSF9WMQkJMHgyMDAwCiAjZGVmaW5lIEFSTV9DUFVfWFNDQUxFX0FSQ0hfVjIJCTB4NDAwMApAQCAtMTUyLDYgKzE2NSwxMSBAQAogCXJldHVybiByZWFkX2NwdWlkKENQVUlEX0lEKTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfY29uc3RfXyByZWFkX2NwdWlkX2NhY2hldHlwZSh2b2lkKQoreworCXJldHVybiByZWFkX2NwdWlkKENQVUlEX0NBQ0hFVFlQRSk7Cit9CisKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9WN00pCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18gcmVhZF9jcHVpZF9pZCh2b2lkKQpAQCAtMTU5LDYgKzE3NywxMSBAQAogCXJldHVybiByZWFkbChCQVNFQUREUl9WN01fU0NCICsgVjdNX1NDQl9DUFVJRCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18gcmVhZF9jcHVpZF9jYWNoZXR5cGUodm9pZCkKK3sKKwlyZXR1cm4gcmVhZGwoQkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ1RSKTsKK30KKwogI2Vsc2UgLyogaWZkZWYgQ09ORklHX0NQVV9DUDE1IC8gZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfVjdNKSAqLwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIHJlYWRfY3B1aWRfaWQodm9pZCkKQEAgLTE3Myw2ICsxOTYsMTEgQEAKIAlyZXR1cm4gKHJlYWRfY3B1aWRfaWQoKSAmIDB4RkYwMDAwMDApID4+IDI0OwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIHJlYWRfY3B1aWRfcmV2aXNpb24odm9pZCkKK3sKKwlyZXR1cm4gcmVhZF9jcHVpZF9pZCgpICYgMHgwMDAwMDAwZjsKK30KKwogLyoKICAqIFRoZSBDUFUgcGFydCBudW1iZXIgaXMgbWVhbmluZ2xlc3Mgd2l0aG91dCByZWZlcnJpbmcgdG8gdGhlIENQVQogICogaW1wbGVtZW50ZXI6IGltcGxlbWVudGVycyBhcmUgZnJlZSB0byBkZWZpbmUgdGhlaXIgb3duIHBhcnQgbnVtYmVycwpAQCAtMTkzLDExICsyMjEsNiBAQAogCXJldHVybiByZWFkX2NwdWlkX2lkKCkgJiBBUk1fQ1BVX1hTQ0FMRV9BUkNIX01BU0s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18gcmVhZF9jcHVpZF9jYWNoZXR5cGUodm9pZCkKLXsKLQlyZXR1cm4gcmVhZF9jcHVpZChDUFVJRF9DQUNIRVRZUEUpOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIHJlYWRfY3B1aWRfdGNtc3RhdHVzKHZvaWQpCiB7CiAJcmV0dXJuIHJlYWRfY3B1aWQoQ1BVSURfVENNKTsKQEAgLTIwOCw2ICsyMzEsMTAgQEAKIAlyZXR1cm4gcmVhZF9jcHVpZChDUFVJRF9NUElEUik7CiB9CiAKKy8qIFN0cm9uZ0FSTS0xMXgwIENQVXMgKi8KKyNkZWZpbmUgY3B1X2lzX3NhMTEwMCgpIChyZWFkX2NwdWlkX3BhcnQoKSA9PSBBUk1fQ1BVX1BBUlRfU0ExMTAwKQorI2RlZmluZSBjcHVfaXNfc2ExMTEwKCkgKHJlYWRfY3B1aWRfcGFydCgpID09IEFSTV9DUFVfUEFSVF9TQTExMTApCisKIC8qCiAgKiBJbnRlbCdzIFhTY2FsZTMgY29yZSBzdXBwb3J0cyBzb21lIHY2IGZlYXR1cmVzIChzdXBlcnNlY3Rpb25zLCBMMikKICAqIGJ1dCBhZHZlcnRpc2VzIGl0c2VsZiBhcyB2NSBhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSB2NiBJU0EuICBGb3IKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RlbGF5LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9kZWxheS5oCmluZGV4IGI3YTQyODEuLmIxY2UwMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RlbGF5LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZGVsYXkuaApAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgkvKiBIWiAqLwogCiAjZGVmaW5lIE1BWF9VREVMQVlfTVMJMgotI2RlZmluZSBVREVMQVlfTVVMVAlVTCgyMDQ3ICogSFogKyA0ODM2NDggKiBIWiAvIDEwMDAwMDApCisjZGVmaW5lIFVERUxBWV9NVUxUCVVMKDIxNDcgKiBIWiArIDQ4MzY0OCAqIEhaIC8gMTAwMDAwMCkKICNkZWZpbmUgVURFTEFZX1NISUZUCTMxCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZG1hLW1hcHBpbmcuaAppbmRleCBkMDA5Zjc5Li5iZjAyZGJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9kbWEtbWFwcGluZy5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2RtYS1tYXBwaW5nLmgKQEAgLTExMSw3ICsxMTEsNyBAQAogLyogVGhlIEFSTSBvdmVycmlkZSBmb3IgZG1hX21heF9wZm4oKSAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRtYV9tYXhfcGZuKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gUEhZU19QRk5fT0ZGU0VUICsgZG1hX3RvX3BmbihkZXYsICpkZXYtPmRtYV9tYXNrKTsKKwlyZXR1cm4gZG1hX3RvX3BmbihkZXYsICpkZXYtPmRtYV9tYXNrKTsKIH0KICNkZWZpbmUgZG1hX21heF9wZm4oZGV2KSBkbWFfbWF4X3BmbihkZXYpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2ZsYXQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2ZsYXQuaAppbmRleCBlODQ3ZDIzLi5hY2YxZDE0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9mbGF0LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZmxhdC5oCkBAIC04LDggKzgsOSBAQAogI2RlZmluZQlmbGF0X2FyZ3ZwX2VudnBfb25fc3RhY2soKQkJMQogI2RlZmluZQlmbGF0X29sZF9yYW1fZmxhZyhmbGFncykJCShmbGFncykKICNkZWZpbmUJZmxhdF9yZWxvY192YWxpZChyZWxvYywgc2l6ZSkJCSgocmVsb2MpIDw9IChzaXplKSkKLSNkZWZpbmUJZmxhdF9nZXRfYWRkcl9mcm9tX3JwKHJwLCByZWx2YWwsIGZsYWdzLCBwZXJzaXN0ZW50KSAoKHZvaWQpcGVyc2lzdGVudCxnZXRfdW5hbGlnbmVkKHJwKSkKLSNkZWZpbmUJZmxhdF9wdXRfYWRkcl9hdF9ycChycCwgdmFsLCByZWx2YWwpCXB1dF91bmFsaWduZWQodmFsLHJwKQorI2RlZmluZQlmbGF0X2dldF9hZGRyX2Zyb21fcnAocnAsIHJlbHZhbCwgZmxhZ3MsIHBlcnNpc3RlbnQpIFwKKwkoeyB1bnNpZ25lZCBsb25nIF9fdmFsOyBfX2dldF91c2VyX3VuYWxpZ25lZChfX3ZhbCwgcnApOyBfX3ZhbDsgfSkKKyNkZWZpbmUJZmxhdF9wdXRfYWRkcl9hdF9ycChycCwgdmFsLCByZWx2YWwpCV9fcHV0X3VzZXJfdW5hbGlnbmVkKHZhbCwgcnApCiAjZGVmaW5lCWZsYXRfZ2V0X3JlbG9jYXRlX2FkZHIocmVsKQkJKHJlbCkKICNkZWZpbmUJZmxhdF9zZXRfcGVyc2lzdGVudChyZWx2YWwsIHApCQkwCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2dsdWUtY2FjaGUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2dsdWUtY2FjaGUuaAppbmRleCBjYWIwN2Y2Li4wMWMzZDkyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9nbHVlLWNhY2hlLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZ2x1ZS1jYWNoZS5oCkBAIC0xMTgsMTEgKzExOCw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9WN00pCi0jIGlmZGVmIF9DQUNIRQogIyAgZGVmaW5lIE1VTFRJX0NBQ0hFIDEKLSMgZWxzZQotIyAgZGVmaW5lIF9DQUNIRSBub3AKLSMgZW5kaWYKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoX0NBQ0hFKSAmJiAhZGVmaW5lZChNVUxUSV9DQUNIRSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaAppbmRleCAzYTVlYzFjLi43MzYyOTJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oCkBAIC04Nyw2ICs4NywxNSBAQAogI2RlZmluZSBMMzEwX0NBQ0hFX0lEX1JUTF9SM1AyCQkweDA4CiAjZGVmaW5lIEwzMTBfQ0FDSEVfSURfUlRMX1IzUDMJCTB4MDkKIAorI2RlZmluZSBMMlgwX0VWRU5UX0NOVF9DVFJMX0VOQUJMRQlCSVQoMCkKKworI2RlZmluZSBMMlgwX0VWRU5UX0NOVF9DRkdfU1JDX1NISUZUCTIKKyNkZWZpbmUgTDJYMF9FVkVOVF9DTlRfQ0ZHX1NSQ19NQVNLCTB4ZgorI2RlZmluZSBMMlgwX0VWRU5UX0NOVF9DRkdfU1JDX0RJU0FCTEVECTAKKyNkZWZpbmUgTDJYMF9FVkVOVF9DTlRfQ0ZHX0lOVF9ESVNBQkxFRAkwCisjZGVmaW5lIEwyWDBfRVZFTlRfQ05UX0NGR19JTlRfSU5DUgkxCisjZGVmaW5lIEwyWDBfRVZFTlRfQ05UX0NGR19JTlRfT1ZFUkZMT1cJMgorCiAvKiBMMkMgYXV4aWxpYXJ5IGNvbnRyb2wgcmVnaXN0ZXIgLSBiaXRzIGNvbW1vbiB0byBMMkMtMjEwLzIyMC8zMTAgKi8KICNkZWZpbmUgTDJDX0FVWF9DVFJMX1dBWV9TSVpFX1NISUZUCQkxNwogI2RlZmluZSBMMkNfQVVYX0NUUkxfV0FZX1NJWkVfTUFTSwkJKDcgPDwgMTcpCkBAIC0xNTcsNiArMTY2LDE2IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwX1BNVQordm9pZCBsMngwX3BtdV9yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiBwYXJ0KTsKK3ZvaWQgbDJ4MF9wbXVfc3VzcGVuZCh2b2lkKTsKK3ZvaWQgbDJ4MF9wbXVfcmVzdW1lKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBsMngwX3BtdV9yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsIHUzMiBwYXJ0KSB7fQorc3RhdGljIGlubGluZSB2b2lkIGwyeDBfcG11X3N1c3BlbmQodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBsMngwX3BtdV9yZXN1bWUodm9pZCkge30KKyNlbmRpZgorCiBzdHJ1Y3QgbDJ4MF9yZWdzIHsKIAl1bnNpZ25lZCBsb25nIHBoeV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgYXV4X2N0cmw7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9zYTExMTEuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL3NhMTExMS5oCmluZGV4IDdjMmJiYzcuLjg5NzlmYTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL3NhMTExMS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2hhcmR3YXJlL3NhMTExMS5oCkBAIC00MjAsNyArNDIwLDcgQEAKIAl1NjQJCWRtYV9tYXNrOwogfTsKIAotI2RlZmluZSBTQTExMTFfREVWKF9kKQljb250YWluZXJfb2YoKF9kKSwgc3RydWN0IHNhMTExMV9kZXYsIGRldikKKyNkZWZpbmUgdG9fc2ExMTExX2RldmljZSh4KQljb250YWluZXJfb2YoeCwgc3RydWN0IHNhMTExMV9kZXYsIGRldikKIAogI2RlZmluZSBzYTExMTFfZ2V0X2RydmRhdGEoZCkJZGV2X2dldF9kcnZkYXRhKCYoZCktPmRldikKICNkZWZpbmUgc2ExMTExX3NldF9kcnZkYXRhKGQscCkJZGV2X3NldF9kcnZkYXRhKCYoZCktPmRldiwgcCkKQEAgLTQ0Niw2ICs0NDYsOCBAQAogaW50IHNhMTExMV9lbmFibGVfZGV2aWNlKHN0cnVjdCBzYTExMTFfZGV2ICopOwogdm9pZCBzYTExMTFfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IHNhMTExMV9kZXYgKik7CiAKK2ludCBzYTExMTFfZ2V0X2lycShzdHJ1Y3Qgc2ExMTExX2RldiAqLCB1bnNpZ25lZCBudW0pOworCiB1bnNpZ25lZCBpbnQgc2ExMTExX3BsbF9jbG9jayhzdHJ1Y3Qgc2ExMTExX2RldiAqKTsKIAogI2RlZmluZSBTQTExMTFfQVVESU9fQUNMSU5LCTAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2h3X2JyZWFrcG9pbnQuaAppbmRleCA4ZTQyN2M3Li5hZmNhZjhiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oCkBAIC0xMTQsNyArMTE0LDYgQEAKIHN0cnVjdCBwZXJmX2V2ZW50Owogc3RydWN0IHBtdTsKIAotZXh0ZXJuIHN0cnVjdCBwbXUgcGVyZl9vcHNfYnA7CiBleHRlcm4gaW50IGFyY2hfYnBfZ2VuZXJpY19maWVsZHMoc3RydWN0IGFyY2hfaHdfYnJlYWtwb2ludF9jdHJsIGN0cmwsCiAJCQkJICBpbnQgKmdlbl9sZW4sIGludCAqZ2VuX3R5cGUpOwogZXh0ZXJuIGludCBhcmNoX2NoZWNrX2JwX2luX2tlcm5lbHNwYWNlKHN0cnVjdCBwZXJmX2V2ZW50ICpicCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fYXNtLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fYXNtLmgKaW5kZXggNThmYWZmNS4uZDdlYTZiYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2FzbS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9hc20uaApAQCAtMjEsNiArMjEsMTAgQEAKIAogI2luY2x1ZGUgPGFzbS92aXJ0Lmg+CiAKKyNkZWZpbmUgQVJNX0VYSVRfV0lUSF9BQk9SVF9CSVQgIDMxCisjZGVmaW5lIEFSTV9FWENFUFRJT05fQ09ERSh4KQkgICgoeCkgJiB+KDFVIDw8IEFSTV9FWElUX1dJVEhfQUJPUlRfQklUKSkKKyNkZWZpbmUgQVJNX0FCT1JUX1BFTkRJTkcoeCkJICAhISgoeCkgJiAoMVUgPDwgQVJNX0VYSVRfV0lUSF9BQk9SVF9CSVQpKQorCiAjZGVmaW5lIEFSTV9FWENFUFRJT05fUkVTRVQJICAwCiAjZGVmaW5lIEFSTV9FWENFUFRJT05fVU5ERUZJTkVEICAgMQogI2RlZmluZSBBUk1fRVhDRVBUSU9OX1NPRlRXQVJFICAgIDIKQEAgLTY4LDYgKzcyLDkgQEAKIGV4dGVybiB2b2lkIF9faW5pdF9zdGFnZTJfdHJhbnNsYXRpb24odm9pZCk7CiAKIGV4dGVybiB2b2lkIF9fa3ZtX2h5cF9yZXNldCh1bnNpZ25lZCBsb25nKTsKKworZXh0ZXJuIHU2NCBfX3ZnaWNfdjNfZ2V0X2ljaF92dHJfZWwyKHZvaWQpOworZXh0ZXJuIHZvaWQgX192Z2ljX3YzX2luaXRfbHJzKHZvaWQpOwogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0FSTV9LVk1fQVNNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmgKaW5kZXggZWU1MzI4Zi4uOWE4YTQ1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCkBAIC00MCwxOCArNDAsMjkgQEAKIAkqdmNwdV9yZWcodmNwdSwgcmVnX251bSkgPSB2YWw7CiB9CiAKLWJvb2wga3ZtX2NvbmRpdGlvbl92YWxpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwotdm9pZCBrdm1fc2tpcF9pbnN0cihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgaXNfd2lkZV9pbnN0cik7Citib29sIGt2bV9jb25kaXRpb25fdmFsaWQzMihjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwordm9pZCBrdm1fc2tpcF9pbnN0cjMyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgYm9vbCBpc193aWRlX2luc3RyKTsKIHZvaWQga3ZtX2luamVjdF91bmRlZmluZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK3ZvaWQga3ZtX2luamVjdF92YWJ0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9pbmplY3RfZGFidChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcik7CiB2b2lkIGt2bV9pbmplY3RfcGFidChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcik7CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1fY29uZGl0aW9uX3ZhbGlkKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4ga3ZtX2NvbmRpdGlvbl92YWxpZDMyKHZjcHUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3NraXBfaW5zdHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sIGlzX3dpZGVfaW5zdHIpCit7CisJa3ZtX3NraXBfaW5zdHIzMih2Y3B1LCBpc193aWRlX2luc3RyKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHZjcHVfcmVzZXRfaGNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAl2Y3B1LT5hcmNoLmhjciA9IEhDUl9HVUVTVF9NQVNLOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmNwdV9nZXRfaGNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2Y3B1X2dldF9oY3IoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXJldHVybiB2Y3B1LT5hcmNoLmhjcjsKIH0KQEAgLTYxLDcgKzcyLDcgQEAKIAl2Y3B1LT5hcmNoLmhjciA9IGhjcjsKIH0KIAotc3RhdGljIGlubGluZSBib29sIHZjcHVfbW9kZV9pc18zMmJpdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgaW5saW5lIGJvb2wgdmNwdV9tb2RlX2lzXzMyYml0KGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlyZXR1cm4gMTsKIH0KQEAgLTcxLDkgKzgyLDkgQEAKIAlyZXR1cm4gJnZjcHUtPmFyY2guY3R4dC5ncF9yZWdzLnVzcl9yZWdzLkFSTV9wYzsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICp2Y3B1X2Nwc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICp2Y3B1X2Nwc3IoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXJldHVybiAmdmNwdS0+YXJjaC5jdHh0LmdwX3JlZ3MudXNyX3JlZ3MuQVJNX2Nwc3I7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nICopJnZjcHUtPmFyY2guY3R4dC5ncF9yZWdzLnVzcl9yZWdzLkFSTV9jcHNyOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdmNwdV9zZXRfdGh1bWIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtOTMsMTEgKzEwNCwyMSBAQAogCXJldHVybiBjcHNyX21vZGUgPiBVU1JfTU9ERTs7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGt2bV92Y3B1X2dldF9oc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIGlubGluZSB1MzIga3ZtX3ZjcHVfZ2V0X2hzcihjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJcmV0dXJuIHZjcHUtPmFyY2guZmF1bHQuaHNyOwogfQogCitzdGF0aWMgaW5saW5lIGludCBrdm1fdmNwdV9nZXRfY29uZGl0aW9uKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1MzIgaHNyID0ga3ZtX3ZjcHVfZ2V0X2hzcih2Y3B1KTsKKworCWlmIChoc3IgJiBIU1JfQ1YpCisJCXJldHVybiAoaHNyICYgSFNSX0NPTkQpID4+IEhTUl9DT05EX1NISUZUOworCisJcmV0dXJuIC0xOworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcga3ZtX3ZjcHVfZ2V0X2hmYXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXJldHVybiB2Y3B1LT5hcmNoLmZhdWx0Lmh4ZmFyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggZGUzMzhkOS4uMmQxOWUwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2hvc3QuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0zOSw3ICszOSwxMiBAQAogCiAjaW5jbHVkZSA8a3ZtL2FybV92Z2ljLmg+CiAKKworI2lmZGVmIENPTkZJR19BUk1fR0lDX1YzCisjZGVmaW5lIEtWTV9NQVhfVkNQVVMgVkdJQ19WM19NQVhfQ1BVUworI2Vsc2UKICNkZWZpbmUgS1ZNX01BWF9WQ1BVUyBWR0lDX1YyX01BWF9DUFVTCisjZW5kaWYKIAogI2RlZmluZSBLVk1fUkVRX1ZDUFVfRVhJVAk4CiAKQEAgLTE4MywxNSArMTg4LDE1IEBACiB9OwogCiBzdHJ1Y3Qga3ZtX3ZtX3N0YXQgewotCXUzMiByZW1vdGVfdGxiX2ZsdXNoOworCXVsb25nIHJlbW90ZV90bGJfZmx1c2g7CiB9OwogCiBzdHJ1Y3Qga3ZtX3ZjcHVfc3RhdCB7Ci0JdTMyIGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOwotCXUzMiBoYWx0X2F0dGVtcHRlZF9wb2xsOwotCXUzMiBoYWx0X3BvbGxfaW52YWxpZDsKLQl1MzIgaGFsdF93YWtldXA7Ci0JdTMyIGh2Y19leGl0X3N0YXQ7CisJdTY0IGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOworCXU2NCBoYWx0X2F0dGVtcHRlZF9wb2xsOworCXU2NCBoYWx0X3BvbGxfaW52YWxpZDsKKwl1NjQgaGFsdF93YWtldXA7CisJdTY0IGh2Y19leGl0X3N0YXQ7CiAJdTY0IHdmZV9leGl0X3N0YXQ7CiAJdTY0IHdmaV9leGl0X3N0YXQ7CiAJdTY0IG1taW9fZXhpdF91c2VyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2h5cC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2h5cC5oCmluZGV4IDZlYWZmMjguLjM0MzEzNWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9oeXAuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faHlwLmgKQEAgLTIwLDI4ICsyMCwxNSBAQAogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGFzbS9jcDE1Lmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9tbXUuaD4KICNpbmNsdWRlIDxhc20vdmZwLmg+CiAKICNkZWZpbmUgX19oeXBfdGV4dCBfX3NlY3Rpb24oLmh5cC50ZXh0KSBub3RyYWNlCiAKLSNkZWZpbmUgX19BQ0NFU1NfQ1AxNShDUm4sIE9wMSwgQ1JtLCBPcDIpCVwKLQkibXJjIiwgIm1jciIsIF9fc3RyaW5naWZ5KHAxNSwgT3AxLCAlMCwgQ1JuLCBDUm0sIE9wMiksIHUzMgotI2RlZmluZSBfX0FDQ0VTU19DUDE1XzY0KE9wMSwgQ1JtKQkJXAotCSJtcnJjIiwgIm1jcnIiLCBfX3N0cmluZ2lmeShwMTUsIE9wMSwgJVEwLCAlUjAsIENSbSksIHU2NAogI2RlZmluZSBfX0FDQ0VTU19WRlAoQ1JuKQkJCVwKIAkibXJjIiwgIm1jciIsIF9fc3RyaW5naWZ5KHAxMCwgNywgJTAsIENSbiwgY3IwLCAwKSwgdTMyCiAKLSNkZWZpbmUgX193cml0ZV9zeXNyZWcodiwgciwgdywgYywgdCkJYXNtIHZvbGF0aWxlKHcgIiAiIGMgOiA6ICJyIiAoKHQpKHYpKSkKLSNkZWZpbmUgd3JpdGVfc3lzcmVnKHYsIC4uLikJCV9fd3JpdGVfc3lzcmVnKHYsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIF9fcmVhZF9zeXNyZWcociwgdywgYywgdCkgKHsJCQkJXAotCXQgX192YWw7CQkJCQkJXAotCWFzbSB2b2xhdGlsZShyICIgIiBjIDogIj1yIiAoX192YWwpKTsJCQlcCi0JX192YWw7CQkJCQkJCVwKLX0pCi0jZGVmaW5lIHJlYWRfc3lzcmVnKC4uLikJCV9fcmVhZF9zeXNyZWcoX19WQV9BUkdTX18pCi0KICNkZWZpbmUgd3JpdGVfc3BlY2lhbCh2LCByKQkJCQkJXAogCWFzbSB2b2xhdGlsZSgibXNyICIgX19zdHJpbmdpZnkocikgIiwgJTAiIDogOiAiciIgKHYpKQogI2RlZmluZSByZWFkX3NwZWNpYWwocikgKHsJCQkJCVwKQEAgLTExOSw2ICsxMDYsOSBAQAogdm9pZCBfX3N5c3JlZ19zYXZlX3N0YXRlKHN0cnVjdCBrdm1fY3B1X2NvbnRleHQgKmN0eHQpOwogdm9pZCBfX3N5c3JlZ19yZXN0b3JlX3N0YXRlKHN0cnVjdCBrdm1fY3B1X2NvbnRleHQgKmN0eHQpOwogCit2b2lkIF9fdmdpY192M19zYXZlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Cit2b2lkIF9fdmdpY192M19yZXN0b3JlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisKIHZvaWQgYXNtbGlua2FnZSBfX3ZmcF9zYXZlX3N0YXRlKHN0cnVjdCB2ZnBfaGFyZF9zdHJ1Y3QgKnZmcCk7CiB2b2lkIGFzbWxpbmthZ2UgX192ZnBfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgdmZwX2hhcmRfc3RydWN0ICp2ZnApOwogc3RhdGljIGlubGluZSBib29sIF9fdmZwX2VuYWJsZWQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9tbXUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9tbXUuaAppbmRleCAzYmI4MDNkLi43NGE0NDcyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX21tdS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9tbXUuaApAQCAtNjMsMzcgKzYzLDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3NldF9wbWQocG1kX3QgKnBtZCwgcG1kX3QgbmV3X3BtZCkKIHsKIAkqcG1kID0gbmV3X3BtZDsKLQlmbHVzaF9wbWRfZW50cnkocG1kKTsKKwlkc2IoaXNoc3QpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX3NldF9wdGUocHRlX3QgKnB0ZSwgcHRlX3QgbmV3X3B0ZSkKIHsKIAkqcHRlID0gbmV3X3B0ZTsKLQkvKgotCSAqIGZsdXNoX3BtZF9lbnRyeSBqdXN0IHRha2VzIGEgdm9pZCBwb2ludGVyIGFuZCBjbGVhbnMgdGhlIG5lY2Vzc2FyeQotCSAqIGNhY2hlIGVudHJpZXMsIHNvIHdlIGNhbiByZXVzZSB0aGUgZnVuY3Rpb24gZm9yIHB0ZXMuCi0JICovCi0JZmx1c2hfcG1kX2VudHJ5KHB0ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fY2xlYW5fcGdkKHBnZF90ICpwZ2QpCi17Ci0JY2xlYW5fZGNhY2hlX2FyZWEocGdkLCBQVFJTX1BFUl9TMl9QR0QgKiBzaXplb2YocGdkX3QpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGt2bV9jbGVhbl9wbWQocG1kX3QgKnBtZCkKLXsKLQljbGVhbl9kY2FjaGVfYXJlYShwbWQsIFBUUlNfUEVSX1BNRCAqIHNpemVvZihwbWRfdCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2NsZWFuX3BtZF9lbnRyeShwbWRfdCAqcG1kKQotewotCWNsZWFuX3BtZF9lbnRyeShwbWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2NsZWFuX3B0ZShwdGVfdCAqcHRlKQotewotCWNsZWFuX3B0ZV90YWJsZShwdGUpOworCWRzYihpc2hzdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgcHRlX3Qga3ZtX3MycHRlX21rd3JpdGUocHRlX3QgcHRlKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWVtb3J5LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaAppbmRleCAzMWMwN2EyLi43NmNiZDljIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tZW1vcnkuaApAQCAtMTU5LDEzICsxNTksOCBAQAogICogUEZOcyBhcmUgdXNlZCB0byBkZXNjcmliZSBhbnkgcGh5c2ljYWwgcGFnZTsgdGhpcyBtZWFucwogICogUEZOIDAgPT0gcGh5c2ljYWwgYWRkcmVzcyAwLgogICovCi0jaWYgZGVmaW5lZChfX3ZpcnRfdG9fcGh5cykKLSNkZWZpbmUgUEhZU19PRkZTRVQJUExBVF9QSFlTX09GRlNFVAotI2RlZmluZSBQSFlTX1BGTl9PRkZTRVQJKCh1bnNpZ25lZCBsb25nKShQSFlTX09GRlNFVCA+PiBQQUdFX1NISUZUKSkKIAotI2RlZmluZSB2aXJ0X3RvX3BmbihrYWRkcikgKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSTV9QQVRDSF9QSFlTX1ZJUlQpCisjaWYgZGVmaW5lZChDT05GSUdfQVJNX1BBVENIX1BIWVNfVklSVCkKIAogLyoKICAqIENvbnN0YW50cyB1c2VkIHRvIGZvcmNlIHRoZSByaWdodCBpbnN0cnVjdGlvbiBlbmNvZGluZ3MgYW5kIHNoaWZ0cwpAQCAtMTgyLDEwICsxNzcsNiBAQAogI2RlZmluZSBQSFlTX09GRlNFVAkoKHBoeXNfYWRkcl90KV9fcHZfcGh5c19wZm5fb2Zmc2V0IDw8IFBBR0VfU0hJRlQpCiAjZGVmaW5lIFBIWVNfUEZOX09GRlNFVAkoX19wdl9waHlzX3Bmbl9vZmZzZXQpCiAKLSNkZWZpbmUgdmlydF90b19wZm4oa2FkZHIpIFwKLQkoKCgodW5zaWduZWQgbG9uZykoa2FkZHIpIC0gUEFHRV9PRkZTRVQpID4+IFBBR0VfU0hJRlQpICsgXAotCSBQSFlTX1BGTl9PRkZTRVQpCi0KICNkZWZpbmUgX19wdl9zdHViKGZyb20sdG8saW5zdHIsdHlwZSkJCQlcCiAJX19hc21fXygiQCBfX3B2X3N0dWJcbiIJCQkJXAogCSIxOgkiIGluc3RyICIJJTAsICUxLCAlMlxuIgkJXApAQCAtMjU3LDEyICsyNDgsMTIgQEAKIAlyZXR1cm4geCAtIFBIWVNfT0ZGU0VUICsgUEFHRV9PRkZTRVQ7CiB9CiAKKyNlbmRpZgorCiAjZGVmaW5lIHZpcnRfdG9fcGZuKGthZGRyKSBcCiAJKCgoKHVuc2lnbmVkIGxvbmcpKGthZGRyKSAtIFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZUKSArIFwKIAkgUEhZU19QRk5fT0ZGU0VUKQogCi0jZW5kaWYKLQogLyoKICAqIFRoZXNlIGFyZSAqb25seSogdmFsaWQgb24gdGhlIGtlcm5lbCBkaXJlY3QgbWFwcGVkIFJBTSBtZW1vcnkuCiAgKiBOb3RlOiBEcml2ZXJzIHNob3VsZCBOT1QgdXNlIHRoZXNlLiAgVGhleSBhcmUgdGhlIHdyb25nCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tb2R1bGUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21vZHVsZS5oCmluZGV4IGUzNThiNzkuLjQ2NDc0OGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21vZHVsZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21vZHVsZS5oCkBAIC0yMywxMCArMjMsOCBAQAogCXN0cnVjdCB1bndpbmRfdGFibGUgKnVud2luZFtBUk1fU0VDX01BWF07CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVJNX01PRFVMRV9QTFRTCi0Jc3RydWN0IGVsZjMyX3NoZHIgICAqY29yZV9wbHQ7Ci0Jc3RydWN0IGVsZjMyX3NoZHIgICAqaW5pdF9wbHQ7Ci0JaW50CQkgICAgY29yZV9wbHRfY291bnQ7Ci0JaW50CQkgICAgaW5pdF9wbHRfY291bnQ7CisJc3RydWN0IGVsZjMyX3NoZHIgICAqcGx0OworCWludAkJICAgIHBsdF9jb3VudDsKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWwtaHdkZWYuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUtMmxldmVsLWh3ZGVmLmgKaW5kZXggZDAxMzFlZS4uM2Y4MmU5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWwtaHdkZWYuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTJsZXZlbC1od2RlZi5oCkBAIC00Nyw2ICs0Nyw3IEBACiAjZGVmaW5lIFBNRF9TRUNUX1dCCQkoUE1EX1NFQ1RfQ0FDSEVBQkxFIHwgUE1EX1NFQ1RfQlVGRkVSQUJMRSkKICNkZWZpbmUgUE1EX1NFQ1RfTUlOSUNBQ0hFCShQTURfU0VDVF9URVgoMSkgfCBQTURfU0VDVF9DQUNIRUFCTEUpCiAjZGVmaW5lIFBNRF9TRUNUX1dCV0EJCShQTURfU0VDVF9URVgoMSkgfCBQTURfU0VDVF9DQUNIRUFCTEUgfCBQTURfU0VDVF9CVUZGRVJBQkxFKQorI2RlZmluZSBQTURfU0VDVF9DQUNIRV9NQVNLCShQTURfU0VDVF9URVgoMSkgfCBQTURfU0VDVF9DQUNIRUFCTEUgfCBQTURfU0VDVF9CVUZGRVJBQkxFKQogI2RlZmluZSBQTURfU0VDVF9OT05TSEFSRURfREVWCShQTURfU0VDVF9URVgoMikpCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTNsZXZlbC1od2RlZi5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcGd0YWJsZS0zbGV2ZWwtaHdkZWYuaAppbmRleCBmOGYxY2ZmLi40Y2Q2NjRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wZ3RhYmxlLTNsZXZlbC1od2RlZi5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BndGFibGUtM2xldmVsLWh3ZGVmLmgKQEAgLTYyLDYgKzYyLDcgQEAKICNkZWZpbmUgUE1EX1NFQ1RfV1QJCShfQVQocG1kdmFsX3QsIDIpIDw8IDIpCS8qIG5vcm1hbCBpbm5lciB3cml0ZS10aHJvdWdoICovCiAjZGVmaW5lIFBNRF9TRUNUX1dCCQkoX0FUKHBtZHZhbF90LCAzKSA8PCAyKQkvKiBub3JtYWwgaW5uZXIgd3JpdGUtYmFjayAqLwogI2RlZmluZSBQTURfU0VDVF9XQldBCQkoX0FUKHBtZHZhbF90LCA3KSA8PCAyKQkvKiBub3JtYWwgaW5uZXIgd3JpdGUtYWxsb2MgKi8KKyNkZWZpbmUgUE1EX1NFQ1RfQ0FDSEVfTUFTSwkoX0FUKHBtZHZhbF90LCA3KSA8PCAyKQogCiAvKgogICogKyBMZXZlbCAzIGRlc2NyaXB0b3IgKFBURSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Y3bS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdjdtLmgKaW5kZXggNjE1NzgxYy4uMWZkNzc1YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdjdtLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdjdtLmgKQEAgLTI0LDYgKzI0LDkgQEAKIAogI2RlZmluZSBWN01fU0NCX0NDUgkJCTB4MTQKICNkZWZpbmUgVjdNX1NDQl9DQ1JfU1RLQUxJR04JCQkoMSA8PCA5KQorI2RlZmluZSBWN01fU0NCX0NDUl9EQwkJCQkoMSA8PCAxNikKKyNkZWZpbmUgVjdNX1NDQl9DQ1JfSUMJCQkJKDEgPDwgMTcpCisjZGVmaW5lIFY3TV9TQ0JfQ0NSX0JQCQkJCSgxIDw8IDE4KQogCiAjZGVmaW5lIFY3TV9TQ0JfU0hQUjIJCQkweDFjCiAjZGVmaW5lIFY3TV9TQ0JfU0hQUjMJCQkweDIwCkBAIC00Nyw2ICs1MCwyNSBAQAogI2RlZmluZSBFWENfUkVUX1NUQUNLX01BU0sJCQkweDAwMDAwMDA0CiAjZGVmaW5lIEVYQ19SRVRfVEhSRUFETU9ERV9QUk9DRVNTU1RBQ0sJCTB4ZmZmZmZmZmQKIAorLyogQ2FjaGUgcmVsYXRlZCBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lCVY3TV9TQ0JfQ0xJRFIJCTB4NzgJLyogQ2FjaGUgTGV2ZWwgSUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJVjdNX1NDQl9DVFIJCTB4N2MJLyogQ2FjaGUgVHlwZSByZWdpc3RlciAqLworI2RlZmluZQlWN01fU0NCX0NDU0lEUgkJMHg4MAkvKiBDYWNoZSBzaXplIElEIHJlZ2lzdGVyICovCisjZGVmaW5lCVY3TV9TQ0JfQ1NTRUxSCQkweDg0CS8qIENhY2hlIHNpemUgc2VsZWN0aW9uIHJlZ2lzdGVyICovCisKKy8qIENhY2hlIG9wZWFydGlvbnMgKi8KKyNkZWZpbmUJVjdNX1NDQl9JQ0lBTExVCQkweDI1MAkvKiBJLWNhY2hlIGludmFsaWRhdGUgYWxsIHRvIFBvVSAqLworI2RlZmluZQlWN01fU0NCX0lDSU1WQVUJCTB4MjU4CS8qIEktY2FjaGUgaW52YWxpZGF0ZSBieSBNVkEgdG8gUG9VICovCisjZGVmaW5lCVY3TV9TQ0JfRENJTVZBQwkJMHgyNWMJLyogRC1jYWNoZSBpbnZhbGlkYXRlIGJ5IE1WQSB0byBQb0MgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0lTVwkJMHgyNjAJLyogRC1jYWNoZSBpbnZhbGlkYXRlIGJ5IHNldC13YXkgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0NNVkFVCQkweDI2NAkvKiBELWNhY2hlIGNsZWFuIGJ5IE1WQSB0byBQb1UgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0NNVkFDCQkweDI2OAkvKiBELWNhY2hlIGNsZWFuIGJ5IE1WQSB0byBQb0MgKi8KKyNkZWZpbmUJVjdNX1NDQl9EQ0NTVwkJMHgyNmMJLyogRC1jYWNoZSBjbGVhbiBieSBzZXQtd2F5ICovCisjZGVmaW5lCVY3TV9TQ0JfRENDSU1WQUMJMHgyNzAJLyogRC1jYWNoZSBjbGVhbiBhbmQgaW52YWxpZGF0ZSBieSBNVkEgdG8gUG9DICovCisjZGVmaW5lCVY3TV9TQ0JfRENDSVNXCQkweDI3NAkvKiBELWNhY2hlIGNsZWFuIGFuZCBpbnZhbGlkYXRlIGJ5IHNldC13YXkgKi8KKyNkZWZpbmUJVjdNX1NDQl9CUElBTEwJCTB4Mjc4CS8qIEQtY2FjaGUgY2xlYW4gYW5kIGludmFsaWRhdGUgYnkgc2V0LXdheSAqLworCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiBlbnVtIHJlYm9vdF9tb2RlOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9rdm0uaCBiL2FyY2gvYXJtL2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKaW5kZXggYTJiM2ViMy4uYjM4YzEwYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9rdm0uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCkBAIC04NCw2ICs4NCwxMyBAQAogI2RlZmluZSBLVk1fVkdJQ19WMl9ESVNUX1NJWkUJCTB4MTAwMAogI2RlZmluZSBLVk1fVkdJQ19WMl9DUFVfU0laRQkJMHgyMDAwCiAKKy8qIFN1cHBvcnRlZCBWR0lDdjMgYWRkcmVzcyB0eXBlcyAgKi8KKyNkZWZpbmUgS1ZNX1ZHSUNfVjNfQUREUl9UWVBFX0RJU1QJMgorI2RlZmluZSBLVk1fVkdJQ19WM19BRERSX1RZUEVfUkVESVNUCTMKKworI2RlZmluZSBLVk1fVkdJQ19WM19ESVNUX1NJWkUJCVNaXzY0SworI2RlZmluZSBLVk1fVkdJQ19WM19SRURJU1RfU0laRQkJKDIgKiBTWl82NEspCisKICNkZWZpbmUgS1ZNX0FSTV9WQ1BVX1BPV0VSX09GRgkJMCAvKiBDUFUgaXMgc3RhcnRlZCBpbiBPRkYgc3RhdGUgKi8KICNkZWZpbmUgS1ZNX0FSTV9WQ1BVX1BTQ0lfMF8yCQkxIC8qIENQVSB1c2VzIFBTQ0kgdjAuMiAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvY3B1aWRsZS5jIGIvYXJjaC9hcm0va2VybmVsL2NwdWlkbGUuYwppbmRleCA3ZGNjYzk2Li5hMzMwOGFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvY3B1aWRsZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9jcHVpZGxlLmMKQEAgLTE5LDcgKzE5LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfY3B1aWRsZV9tZXRob2QgX19jcHVpZGxlX21ldGhvZF9vZl90YWJsZV9zZW50aW5lbAogCV9fdXNlZCBfX3NlY3Rpb24oX19jcHVpZGxlX21ldGhvZF9vZl90YWJsZV9lbmQpOwogCi1zdGF0aWMgc3RydWN0IGNwdWlkbGVfb3BzIGNwdWlkbGVfb3BzW05SX0NQVVNdOworc3RhdGljIHN0cnVjdCBjcHVpZGxlX29wcyBjcHVpZGxlX29wc1tOUl9DUFVTXSBfX3JvX2FmdGVyX2luaXQ7CiAKIC8qKgogICogYXJtX2NwdWlkbGVfc2ltcGxlX2VudGVyKCkgLSBhIHdyYXBwZXIgdG8gY3B1X2RvX2lkbGUoKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYyBiL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMKaW5kZXggNDBlY2Q1Zi4uZjY3NmZlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jCkBAIC04OCw2ICs4OCw4IEBACiAJCXJldHVybjsKIAogCWZvcl9lYWNoX2NoaWxkX29mX25vZGUoY3B1cywgY3B1KSB7CisJCWNvbnN0IF9fYmUzMiAqY2VsbDsKKwkJaW50IHByb3BfYnl0ZXM7CiAJCXUzMiBod2lkOwogCiAJCWlmIChvZl9ub2RlX2NtcChjcHUtPnR5cGUsICJjcHUiKSkKQEAgLTk5LDcgKzEwMSw4IEBACiAJCSAqIHByb3BlcnRpZXMgaXMgY29uc2lkZXJlZCBpbnZhbGlkIHRvIGJ1aWxkIHRoZQogCQkgKiBjcHVfbG9naWNhbF9tYXAuCiAJCSAqLwotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIoY3B1LCAicmVnIiwgJmh3aWQpKSB7CisJCWNlbGwgPSBvZl9nZXRfcHJvcGVydHkoY3B1LCAicmVnIiwgJnByb3BfYnl0ZXMpOworCQlpZiAoIWNlbGwgfHwgcHJvcF9ieXRlcyA8IHNpemVvZigqY2VsbCkpIHsKIAkJCXByX2RlYnVnKCIgKiAlcyBtaXNzaW5nIHJlZyBwcm9wZXJ0eVxuIiwKIAkJCQkgICAgIGNwdS0+ZnVsbF9uYW1lKTsKIAkJCW9mX25vZGVfcHV0KGNwdSk7CkBAIC0xMDcsMTAgKzExMCwxNSBAQAogCQl9CiAKIAkJLyoKLQkJICogOCBNU0JzIG11c3QgYmUgc2V0IHRvIDAgaW4gdGhlIERUIHNpbmNlIHRoZSByZWcgcHJvcGVydHkKKwkJICogQml0cyBuOjI0IG11c3QgYmUgc2V0IHRvIDAgaW4gdGhlIERUIHNpbmNlIHRoZSByZWcgcHJvcGVydHkKIAkJICogZGVmaW5lcyB0aGUgTVBJRFJbMjM6MF0uCiAJCSAqLwotCQlpZiAoaHdpZCAmIH5NUElEUl9IV0lEX0JJVE1BU0spIHsKKwkJZG8geworCQkJaHdpZCA9IGJlMzJfdG9fY3B1KCpjZWxsKyspOworCQkJcHJvcF9ieXRlcyAtPSBzaXplb2YoKmNlbGwpOworCQl9IHdoaWxlICghaHdpZCAmJiBwcm9wX2J5dGVzID4gMCk7CisKKwkJaWYgKHByb3BfYnl0ZXMgfHwgKGh3aWQgJiB+TVBJRFJfSFdJRF9CSVRNQVNLKSkgewogCQkJb2Zfbm9kZV9wdXQoY3B1KTsKIAkJCXJldHVybjsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2Z0cmFjZS5jIGIvYXJjaC9hcm0va2VybmVsL2Z0cmFjZS5jCmluZGV4IDcwOWVlMWQuLjNmMTc1OTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL2FybS9rZXJuZWwvZnRyYWNlLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCX0KIAogCWVyciA9IGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLAotCQkJCSAgICAgICBmcmFtZV9wb2ludGVyKTsKKwkJCQkgICAgICAgZnJhbWVfcG9pbnRlciwgTlVMTCk7CiAJaWYgKGVyciA9PSAtRUJVU1kpIHsKIAkJKnBhcmVudCA9IG9sZDsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2hlYWQtbm9tbXUuUyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLW5vbW11LlMKaW5kZXggZmIxYTY5ZS4uNmI0ZWIyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2hlYWQtbm9tbXUuUworKysgYi9hcmNoL2FybS9rZXJuZWwvaGVhZC1ub21tdS5TCkBAIC0xNTgsNyArMTU4LDIxIEBACiAJYmljCXIwLCByMCwgI0NSX1YKICNlbmRpZgogCW1jcglwMTUsIDAsIHIwLCBjMSwgYzAsIDAJCUAgd3JpdGUgY29udHJvbCByZWcKLSNlbmRpZiAvKiBDT05GSUdfQ1BVX0NQMTUgKi8KKyNlbGlmIGRlZmluZWQgKENPTkZJR19DUFVfVjdNKQorCS8qIEZvciBWN00gc3lzdGVtcyB3ZSB3YW50IHRvIG1vZGlmeSB0aGUgQ0NSIHNpbWlsYXJseSB0byB0aGUgU0NUTFIgKi8KKyNpZmRlZiBDT05GSUdfQ1BVX0RDQUNIRV9ESVNBQkxFCisJYmljCXIwLCByMCwgI1Y3TV9TQ0JfQ0NSX0RDCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1BVX0JQUkVESUNUX0RJU0FCTEUKKwliaWMJcjAsIHIwLCAjVjdNX1NDQl9DQ1JfQlAKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUFVfSUNBQ0hFX0RJU0FCTEUKKwliaWMJcjAsIHIwLCAjVjdNX1NDQl9DQ1JfSUMKKyNlbmRpZgorCW1vdncJcjMsICM6bG93ZXIxNjooQkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ0NSKQorCW1vdnQJcjMsICM6dXBwZXIxNjooQkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ0NSKQorCXN0cglyMCwgW3IzXQorI2VuZGlmIC8qIENPTkZJR19DUFVfQ1AxNSBlbGlmIENPTkZJR19DUFVfVjdNICovCiAJcmV0CWxyCiBFTkRQUk9DKF9fYWZ0ZXJfcHJvY19pbml0KQogCS5sdG9yZwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2h5cC1zdHViLlMgYi9hcmNoL2FybS9rZXJuZWwvaHlwLXN0dWIuUwppbmRleCAwYjFlNGE5Li4xNWQwNzNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaHlwLXN0dWIuUworKysgYi9hcmNoL2FybS9rZXJuZWwvaHlwLXN0dWIuUwpAQCAtMTQyLDYgKzE0MiwxOSBAQAogCWFuZAlyNywgIzB4MWYJCUAgUHJlc2VydmUgSFBNTgogCW1jcglwMTUsIDQsIHI3LCBjMSwgYzEsIDEJQCBIRENSCiAKKwlAIE1ha2Ugc3VyZSBOUy1TVkMgaXMgaW5pdGlhbGlzZWQgYXBwcm9wcmlhdGVseQorCW1yYwlwMTUsIDAsIHI3LCBjMSwgYzAsIDAJQCBTQ1RMUgorCW9ycglyNywgIygxIDw8IDUpCQlAIENQMTUgYmFycmllcnMgZW5hYmxlZAorCWJpYwlyNywgIygzIDw8IDcpCQlAIENsZWFyIFNFRC9JVEQgZm9yIHY4IChSRVMwIGZvciB2NykKKwliaWMJcjcsICMoMyA8PCAxOSkJCUAgV1hOIGFuZCBVV1hOIGRpc2FibGVkCisJbWNyCXAxNSwgMCwgcjcsIGMxLCBjMCwgMAlAIFNDVExSCisKKwltcmMJcDE1LCAwLCByNywgYzAsIGMwLCAwCUAgTUlEUgorCW1jcglwMTUsIDQsIHI3LCBjMCwgYzAsIDAJQCBWUElEUgorCisJbXJjCXAxNSwgMCwgcjcsIGMwLCBjMCwgNQlAIE1QSURSCisJbWNyCXAxNSwgNCwgcjcsIGMwLCBjMCwgNQlAIFZNUElEUgorCiAjaWYgIWRlZmluZWQoWklNQUdFKSAmJiBkZWZpbmVkKENPTkZJR19BUk1fQVJDSF9USU1FUikKIAlAIG1ha2UgQ05UUF8qIGFuZCBDTlRQQ1QgYWNjZXNzaWJsZSBmcm9tIFBMMQogCW1yYwlwMTUsIDAsIHI3LCBjMCwgYzEsIDEJQCBJRF9QRlIxCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLXBsdHMuYyBiL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUtcGx0cy5jCmluZGV4IDBjN2VmYzMuLjNhNWNiYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUtcGx0cy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUtcGx0cy5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9vcGNvZGVzLmg+CkBAIC0zMCwxNTQgKzMxLDE5OCBAQAogCXUzMglsaXRbUExUX0VOVF9DT1VOVF07CiB9OwogCi1zdGF0aWMgYm9vbCBpbl9pbml0KGNvbnN0IHN0cnVjdCBtb2R1bGUgKm1vZCwgdTMyIGFkZHIpCi17Ci0JcmV0dXJuIGFkZHIgLSAodTMyKW1vZC0+aW5pdF9sYXlvdXQuYmFzZSA8IG1vZC0+aW5pdF9sYXlvdXQuc2l6ZTsKLX0KLQogdTMyIGdldF9tb2R1bGVfcGx0KHN0cnVjdCBtb2R1bGUgKm1vZCwgdW5zaWduZWQgbG9uZyBsb2MsIEVsZjMyX0FkZHIgdmFsKQogewotCXN0cnVjdCBwbHRfZW50cmllcyAqcGx0LCAqcGx0X2VuZDsKLQlpbnQgYywgKmNvdW50OworCXN0cnVjdCBwbHRfZW50cmllcyAqcGx0ID0gKHN0cnVjdCBwbHRfZW50cmllcyAqKW1vZC0+YXJjaC5wbHQtPnNoX2FkZHI7CisJaW50IGlkeCA9IDA7CiAKLQlpZiAoaW5faW5pdChtb2QsIGxvYykpIHsKLQkJcGx0ID0gKHZvaWQgKiltb2QtPmFyY2guaW5pdF9wbHQtPnNoX2FkZHI7Ci0JCXBsdF9lbmQgPSAodm9pZCAqKXBsdCArIG1vZC0+YXJjaC5pbml0X3BsdC0+c2hfc2l6ZTsKLQkJY291bnQgPSAmbW9kLT5hcmNoLmluaXRfcGx0X2NvdW50OwotCX0gZWxzZSB7Ci0JCXBsdCA9ICh2b2lkICopbW9kLT5hcmNoLmNvcmVfcGx0LT5zaF9hZGRyOwotCQlwbHRfZW5kID0gKHZvaWQgKilwbHQgKyBtb2QtPmFyY2guY29yZV9wbHQtPnNoX3NpemU7Ci0JCWNvdW50ID0gJm1vZC0+YXJjaC5jb3JlX3BsdF9jb3VudDsKKwkvKgorCSAqIExvb2sgZm9yIGFuIGV4aXN0aW5nIGVudHJ5IHBvaW50aW5nIHRvICd2YWwnLiBHaXZlbiB0aGF0IHRoZQorCSAqIHJlbG9jYXRpb25zIGFyZSBzb3J0ZWQsIHRoaXMgd2lsbCBiZSB0aGUgbGFzdCBlbnRyeSB3ZSBhbGxvY2F0ZWQuCisJICogKGlmIG9uZSBleGlzdHMpLgorCSAqLworCWlmIChtb2QtPmFyY2gucGx0X2NvdW50ID4gMCkgeworCQlwbHQgKz0gKG1vZC0+YXJjaC5wbHRfY291bnQgLSAxKSAvIFBMVF9FTlRfQ09VTlQ7CisJCWlkeCA9IChtb2QtPmFyY2gucGx0X2NvdW50IC0gMSkgJSBQTFRfRU5UX0NPVU5UOworCisJCWlmIChwbHQtPmxpdFtpZHhdID09IHZhbCkKKwkJCXJldHVybiAodTMyKSZwbHQtPmxkcltpZHhdOworCisJCWlkeCA9IChpZHggKyAxKSAlIFBMVF9FTlRfQ09VTlQ7CisJCWlmICghaWR4KQorCQkJcGx0Kys7CiAJfQogCi0JLyogTG9vayBmb3IgYW4gZXhpc3RpbmcgZW50cnkgcG9pbnRpbmcgdG8gJ3ZhbCcgKi8KLQlmb3IgKGMgPSAqY291bnQ7IHBsdCA8IHBsdF9lbmQ7IGMgLT0gUExUX0VOVF9DT1VOVCwgcGx0KyspIHsKLQkJaW50IGk7CisJbW9kLT5hcmNoLnBsdF9jb3VudCsrOworCUJVR19PTihtb2QtPmFyY2gucGx0X2NvdW50ICogUExUX0VOVF9TSVpFID4gbW9kLT5hcmNoLnBsdC0+c2hfc2l6ZSk7CiAKLQkJaWYgKCFjKSB7Ci0JCQkvKiBQb3B1bGF0ZSBhIG5ldyBzZXQgb2YgZW50cmllcyAqLwotCQkJKnBsdCA9IChzdHJ1Y3QgcGx0X2VudHJpZXMpewotCQkJCXsgWzAgLi4uIFBMVF9FTlRfQ09VTlQgLSAxXSA9IFBMVF9FTlRfTERSLCB9LAotCQkJCXsgdmFsLCB9Ci0JCQl9OwotCQkJKysqY291bnQ7Ci0JCQlyZXR1cm4gKHUzMilwbHQtPmxkcjsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgUExUX0VOVF9DT1VOVDsgaSsrKSB7Ci0JCQlpZiAoIXBsdC0+bGl0W2ldKSB7Ci0JCQkJcGx0LT5saXRbaV0gPSB2YWw7Ci0JCQkJKysqY291bnQ7Ci0JCQl9Ci0JCQlpZiAocGx0LT5saXRbaV0gPT0gdmFsKQotCQkJCXJldHVybiAodTMyKSZwbHQtPmxkcltpXTsKLQkJfQorCWlmICghaWR4KQorCQkvKiBQb3B1bGF0ZSBhIG5ldyBzZXQgb2YgZW50cmllcyAqLworCQkqcGx0ID0gKHN0cnVjdCBwbHRfZW50cmllcyl7CisJCQl7IFswIC4uLiBQTFRfRU5UX0NPVU5UIC0gMV0gPSBQTFRfRU5UX0xEUiwgfSwKKwkJCXsgdmFsLCB9CisJCX07CisJZWxzZQorCQlwbHQtPmxpdFtpZHhdID0gdmFsOworCisJcmV0dXJuICh1MzIpJnBsdC0+bGRyW2lkeF07Cit9CisKKyNkZWZpbmUgY21wXzN3YXkoYSxiKQkoKGEpIDwgKGIpID8gLTEgOiAoYSkgPiAoYikpCisKK3N0YXRpYyBpbnQgY21wX3JlbChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IEVsZjMyX1JlbCAqeCA9IGEsICp5ID0gYjsKKwlpbnQgaTsKKworCS8qIHNvcnQgYnkgdHlwZSBhbmQgc3ltYm9sIGluZGV4ICovCisJaSA9IGNtcF8zd2F5KEVMRjMyX1JfVFlQRSh4LT5yX2luZm8pLCBFTEYzMl9SX1RZUEUoeS0+cl9pbmZvKSk7CisJaWYgKGkgPT0gMCkKKwkJaSA9IGNtcF8zd2F5KEVMRjMyX1JfU1lNKHgtPnJfaW5mbyksIEVMRjMyX1JfU1lNKHktPnJfaW5mbykpOworCXJldHVybiBpOworfQorCitzdGF0aWMgYm9vbCBpc196ZXJvX2FkZGVuZF9yZWxvY2F0aW9uKEVsZjMyX0FkZHIgYmFzZSwgY29uc3QgRWxmMzJfUmVsICpyZWwpCit7CisJdTMyICp0dmFsID0gKHUzMiAqKShiYXNlICsgcmVsLT5yX29mZnNldCk7CisKKwkvKgorCSAqIERvIGEgYml0d2lzZSBjb21wYXJlIG9uIHRoZSByYXcgYWRkZW5kIHJhdGhlciB0aGFuIGZ1bGx5IGRlY29kaW5nCisJICogdGhlIG9mZnNldCBhbmQgZG9pbmcgYW4gYXJpdGhtZXRpYyBjb21wYXJpc29uLgorCSAqIE5vdGUgdGhhdCBhIHplcm8tYWRkZW5kIGp1bXAvY2FsbCByZWxvY2F0aW9uIGlzIGVuY29kZWQgdGFraW5nIHRoZQorCSAqIFBDIGJpYXMgaW50byBhY2NvdW50LCBpLmUuLCAtOCBmb3IgQVJNIGFuZCAtNCBmb3IgVGh1bWIyLgorCSAqLworCXN3aXRjaCAoRUxGMzJfUl9UWVBFKHJlbC0+cl9pbmZvKSkgeworCQl1MTYgdXBwZXIsIGxvd2VyOworCisJY2FzZSBSX0FSTV9USE1fQ0FMTDoKKwljYXNlIFJfQVJNX1RITV9KVU1QMjQ6CisJCXVwcGVyID0gX19tZW1fdG9fb3Bjb2RlX3RodW1iMTYoKCh1MTYgKil0dmFsKVswXSk7CisJCWxvd2VyID0gX19tZW1fdG9fb3Bjb2RlX3RodW1iMTYoKCh1MTYgKil0dmFsKVsxXSk7CisKKwkJcmV0dXJuICh1cHBlciAmIDB4N2ZmKSA9PSAweDdmZiAmJiAobG93ZXIgJiAweDJmZmYpID09IDB4MmZmZTsKKworCWNhc2UgUl9BUk1fQ0FMTDoKKwljYXNlIFJfQVJNX1BDMjQ6CisJY2FzZSBSX0FSTV9KVU1QMjQ6CisJCXJldHVybiAoX19tZW1fdG9fb3Bjb2RlX2FybSgqdHZhbCkgJiAweGZmZmZmZikgPT0gMHhmZmZmZmU7CiAJfQogCUJVRygpOwogfQogCi1zdGF0aWMgaW50IGR1cGxpY2F0ZV9yZWwoRWxmMzJfQWRkciBiYXNlLCBjb25zdCBFbGYzMl9SZWwgKnJlbCwgaW50IG51bSwKLQkJCSAgIHUzMiBtYXNrKQorc3RhdGljIGJvb2wgZHVwbGljYXRlX3JlbChFbGYzMl9BZGRyIGJhc2UsIGNvbnN0IEVsZjMyX1JlbCAqcmVsLCBpbnQgbnVtKQogewotCXUzMiAqbG9jMSwgKmxvYzI7Ci0JaW50IGk7CisJY29uc3QgRWxmMzJfUmVsICpwcmV2OwogCi0JZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCWlmIChyZWxbaV0ucl9pbmZvICE9IHJlbFtudW1dLnJfaW5mbykKLQkJCWNvbnRpbnVlOworCS8qCisJICogRW50cmllcyBhcmUgc29ydGVkIGJ5IHR5cGUgYW5kIHN5bWJvbCBpbmRleC4gVGhhdCBtZWFucyB0aGF0LAorCSAqIGlmIGEgZHVwbGljYXRlIGVudHJ5IGV4aXN0cywgaXQgbXVzdCBiZSBpbiB0aGUgcHJlY2VkaW5nCisJICogc2xvdC4KKwkgKi8KKwlpZiAoIW51bSkKKwkJcmV0dXJuIGZhbHNlOwogCi0JCS8qCi0JCSAqIElkZW50aWNhbCByZWxvY2F0aW9uIHR5cGVzIGFnYWluc3QgaWRlbnRpY2FsIHN5bWJvbHMgY2FuCi0JCSAqIHN0aWxsIHJlc3VsdCBpbiBkaWZmZXJlbnQgUExUIGVudHJpZXMgaWYgdGhlIGFkZGVuZCBpbiB0aGUKLQkJICogcGxhY2UgaXMgZGlmZmVyZW50LiBTbyByZXNvbHZlIHRoZSB0YXJnZXQgb2YgdGhlIHJlbG9jYXRpb24KLQkJICogdG8gY29tcGFyZSB0aGUgdmFsdWVzLgotCQkgKi8KLQkJbG9jMSA9ICh1MzIgKikoYmFzZSArIHJlbFtpXS5yX29mZnNldCk7Ci0JCWxvYzIgPSAodTMyICopKGJhc2UgKyByZWxbbnVtXS5yX29mZnNldCk7Ci0JCWlmICgoKCpsb2MxIF4gKmxvYzIpICYgbWFzaykgPT0gMCkKLQkJCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKwlwcmV2ID0gcmVsICsgbnVtIC0gMTsKKwlyZXR1cm4gY21wX3JlbChyZWwgKyBudW0sIHByZXYpID09IDAgJiYKKwkgICAgICAgaXNfemVyb19hZGRlbmRfcmVsb2NhdGlvbihiYXNlLCBwcmV2KTsKIH0KIAogLyogQ291bnQgaG93IG1hbnkgUExUIGVudHJpZXMgd2UgbWF5IG5lZWQgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY291bnRfcGx0cyhFbGYzMl9BZGRyIGJhc2UsIGNvbnN0IEVsZjMyX1JlbCAqcmVsLCBpbnQgbnVtKQorc3RhdGljIHVuc2lnbmVkIGludCBjb3VudF9wbHRzKGNvbnN0IEVsZjMyX1N5bSAqc3ltcywgRWxmMzJfQWRkciBiYXNlLAorCQkJICAgICAgIGNvbnN0IEVsZjMyX1JlbCAqcmVsLCBpbnQgbnVtKQogewogCXVuc2lnbmVkIGludCByZXQgPSAwOworCWNvbnN0IEVsZjMyX1N5bSAqczsKIAlpbnQgaTsKIAotCS8qCi0JICogU3VyZSwgdGhpcyBpcyBvcmRlcihuXjIpLCBidXQgaXQncyB1c3VhbGx5IHNob3J0LCBhbmQgbm90Ci0JICogdGltZSBjcml0aWNhbAotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJc3dpdGNoIChFTEYzMl9SX1RZUEUocmVsW2ldLnJfaW5mbykpIHsKIAkJY2FzZSBSX0FSTV9DQUxMOgogCQljYXNlIFJfQVJNX1BDMjQ6CiAJCWNhc2UgUl9BUk1fSlVNUDI0OgotCQkJaWYgKCFkdXBsaWNhdGVfcmVsKGJhc2UsIHJlbCwgaSwKLQkJCQkJICAgX19vcGNvZGVfdG9fbWVtX2FybSgweDAwZmZmZmZmKSkpCi0JCQkJcmV0Kys7Ci0JCQlicmVhazsKLSNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAogCQljYXNlIFJfQVJNX1RITV9DQUxMOgogCQljYXNlIFJfQVJNX1RITV9KVU1QMjQ6Ci0JCQlpZiAoIWR1cGxpY2F0ZV9yZWwoYmFzZSwgcmVsLCBpLAotCQkJCQkgICBfX29wY29kZV90b19tZW1fdGh1bWIzMigweDA3ZmYyZmZmKSkpCisJCQkvKgorCQkJICogV2Ugb25seSBoYXZlIHRvIGNvbnNpZGVyIGJyYW5jaCB0YXJnZXRzIHRoYXQgcmVzb2x2ZQorCQkJICogdG8gdW5kZWZpbmVkIHN5bWJvbHMuIFRoaXMgaXMgbm90IHNpbXBseSBhIGhldXJpc3RpYywKKwkJCSAqIGl0IGlzIGEgZnVuZGFtZW50YWwgbGltaXRhdGlvbiwgc2luY2UgdGhlIFBMVCBpdHNlbGYKKwkJCSAqIGlzIHBhcnQgb2YgdGhlIG1vZHVsZSwgYW5kIG5lZWRzIHRvIGJlIHdpdGhpbiByYW5nZQorCQkJICogYXMgd2VsbCwgc28gbW9kdWxlcyBjYW4gbmV2ZXIgZ3JvdyBiZXlvbmQgdGhhdCBsaW1pdC4KKwkJCSAqLworCQkJcyA9IHN5bXMgKyBFTEYzMl9SX1NZTShyZWxbaV0ucl9pbmZvKTsKKwkJCWlmIChzLT5zdF9zaG5keCAhPSBTSE5fVU5ERUYpCisJCQkJYnJlYWs7CisKKwkJCS8qCisJCQkgKiBKdW1wIHJlbG9jYXRpb25zIHdpdGggbm9uLXplcm8gYWRkZW5kcyBhZ2FpbnN0CisJCQkgKiB1bmRlZmluZWQgc3ltYm9scyBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBFTEYgc3BlYywgYnV0CisJCQkgKiBkbyBub3Qgb2NjdXIgaW4gcHJhY3RpY2UgKGUuZy4sICdqdW1wIG4gYnl0ZXMgcGFzdAorCQkJICogdGhlIGVudHJ5IHBvaW50IG9mIHVuZGVmaW5lZCBmdW5jdGlvbiBzeW1ib2wgZicpLgorCQkJICogU28gd2UgbmVlZCB0byBzdXBwb3J0IHRoZW0sIGJ1dCB0aGVyZSBpcyBubyBuZWVkIHRvCisJCQkgKiB0YWtlIHRoZW0gaW50byBjb25zaWRlcmF0aW9uIHdoZW4gdHJ5aW5nIHRvIG9wdGltaXplCisJCQkgKiB0aGlzIGNvZGUuIFNvIGxldCdzIG9ubHkgY2hlY2sgZm9yIGR1cGxpY2F0ZXMgd2hlbgorCQkJICogdGhlIGFkZGVuZCBpcyB6ZXJvLgorCQkJICovCisJCQlpZiAoIWlzX3plcm9fYWRkZW5kX3JlbG9jYXRpb24oYmFzZSwgcmVsICsgaSkgfHwKKwkJCSAgICAhZHVwbGljYXRlX3JlbChiYXNlLCByZWwsIGkpKQogCQkJCXJldCsrOwotI2VuZGlmCiAJCX0KKwl9CiAJcmV0dXJuIHJldDsKIH0KIAogaW50IG1vZHVsZV9mcm9iX2FyY2hfc2VjdGlvbnMoRWxmX0VoZHIgKmVoZHIsIEVsZl9TaGRyICpzZWNoZHJzLAogCQkJICAgICAgY2hhciAqc2Vjc3RyaW5ncywgc3RydWN0IG1vZHVsZSAqbW9kKQogewotCXVuc2lnbmVkIGxvbmcgY29yZV9wbHRzID0gMCwgaW5pdF9wbHRzID0gMDsKKwl1bnNpZ25lZCBsb25nIHBsdHMgPSAwOwogCUVsZjMyX1NoZHIgKnMsICpzZWNoZHJzX2VuZCA9IHNlY2hkcnMgKyBlaGRyLT5lX3NobnVtOworCUVsZjMyX1N5bSAqc3ltcyA9IE5VTEw7CiAKIAkvKgogCSAqIFRvIHN0b3JlIHRoZSBQTFRzLCB3ZSBleHBhbmQgdGhlIC50ZXh0IHNlY3Rpb24gZm9yIGNvcmUgbW9kdWxlIGNvZGUKLQkgKiBhbmQgdGhlIC5pbml0LnRleHQgc2VjdGlvbiBmb3IgaW5pdGlhbGl6YXRpb24gY29kZS4KKwkgKiBhbmQgZm9yIGluaXRpYWxpemF0aW9uIGNvZGUuCiAJICovCi0JZm9yIChzID0gc2VjaGRyczsgcyA8IHNlY2hkcnNfZW5kOyArK3MpCi0JCWlmIChzdHJjbXAoIi5jb3JlLnBsdCIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKSA9PSAwKQotCQkJbW9kLT5hcmNoLmNvcmVfcGx0ID0gczsKLQkJZWxzZSBpZiAoc3RyY21wKCIuaW5pdC5wbHQiLCBzZWNzdHJpbmdzICsgcy0+c2hfbmFtZSkgPT0gMCkKLQkJCW1vZC0+YXJjaC5pbml0X3BsdCA9IHM7CisJZm9yIChzID0gc2VjaGRyczsgcyA8IHNlY2hkcnNfZW5kOyArK3MpIHsKKwkJaWYgKHN0cmNtcCgiLnBsdCIsIHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lKSA9PSAwKQorCQkJbW9kLT5hcmNoLnBsdCA9IHM7CisJCWVsc2UgaWYgKHMtPnNoX3R5cGUgPT0gU0hUX1NZTVRBQikKKwkJCXN5bXMgPSAoRWxmMzJfU3ltICopcy0+c2hfYWRkcjsKKwl9CiAKLQlpZiAoIW1vZC0+YXJjaC5jb3JlX3BsdCB8fCAhbW9kLT5hcmNoLmluaXRfcGx0KSB7Ci0JCXByX2VycigiJXM6IHNlY3Rpb25zIG1pc3NpbmdcbiIsIG1vZC0+bmFtZSk7CisJaWYgKCFtb2QtPmFyY2gucGx0KSB7CisJCXByX2VycigiJXM6IG1vZHVsZSBQTFQgc2VjdGlvbiBtaXNzaW5nXG4iLCBtb2QtPm5hbWUpOworCQlyZXR1cm4gLUVOT0VYRUM7CisJfQorCWlmICghc3ltcykgeworCQlwcl9lcnIoIiVzOiBtb2R1bGUgc3ltdGFiIHNlY3Rpb24gbWlzc2luZ1xuIiwgbW9kLT5uYW1lKTsKIAkJcmV0dXJuIC1FTk9FWEVDOwogCX0KIAogCWZvciAocyA9IHNlY2hkcnMgKyAxOyBzIDwgc2VjaGRyc19lbmQ7ICsrcykgewotCQljb25zdCBFbGYzMl9SZWwgKnJlbHMgPSAodm9pZCAqKWVoZHIgKyBzLT5zaF9vZmZzZXQ7CisJCUVsZjMyX1JlbCAqcmVscyA9ICh2b2lkICopZWhkciArIHMtPnNoX29mZnNldDsKIAkJaW50IG51bXJlbHMgPSBzLT5zaF9zaXplIC8gc2l6ZW9mKEVsZjMyX1JlbCk7CiAJCUVsZjMyX1NoZHIgKmRzdHNlYyA9IHNlY2hkcnMgKyBzLT5zaF9pbmZvOwogCiAJCWlmIChzLT5zaF90eXBlICE9IFNIVF9SRUwpCiAJCQljb250aW51ZTsKIAotCQlpZiAoc3Ryc3RyKHNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lLCAiLmluaXQiKSkKLQkJCWluaXRfcGx0cyArPSBjb3VudF9wbHRzKGRzdHNlYy0+c2hfYWRkciwgcmVscywgbnVtcmVscyk7Ci0JCWVsc2UKLQkJCWNvcmVfcGx0cyArPSBjb3VudF9wbHRzKGRzdHNlYy0+c2hfYWRkciwgcmVscywgbnVtcmVscyk7CisJCS8qIGlnbm9yZSByZWxvY2F0aW9ucyB0aGF0IG9wZXJhdGUgb24gbm9uLWV4ZWMgc2VjdGlvbnMgKi8KKwkJaWYgKCEoZHN0c2VjLT5zaF9mbGFncyAmIFNIRl9FWEVDSU5TVFIpKQorCQkJY29udGludWU7CisKKwkJLyogc29ydCBieSB0eXBlIGFuZCBzeW1ib2wgaW5kZXggKi8KKwkJc29ydChyZWxzLCBudW1yZWxzLCBzaXplb2YoRWxmMzJfUmVsKSwgY21wX3JlbCwgTlVMTCk7CisKKwkJcGx0cyArPSBjb3VudF9wbHRzKHN5bXMsIGRzdHNlYy0+c2hfYWRkciwgcmVscywgbnVtcmVscyk7CiAJfQogCi0JbW9kLT5hcmNoLmNvcmVfcGx0LT5zaF90eXBlID0gU0hUX05PQklUUzsKLQltb2QtPmFyY2guY29yZV9wbHQtPnNoX2ZsYWdzID0gU0hGX0VYRUNJTlNUUiB8IFNIRl9BTExPQzsKLQltb2QtPmFyY2guY29yZV9wbHQtPnNoX2FkZHJhbGlnbiA9IEwxX0NBQ0hFX0JZVEVTOwotCW1vZC0+YXJjaC5jb3JlX3BsdC0+c2hfc2l6ZSA9IHJvdW5kX3VwKGNvcmVfcGx0cyAqIFBMVF9FTlRfU0laRSwKLQkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcGx0X2VudHJpZXMpKTsKLQltb2QtPmFyY2guY29yZV9wbHRfY291bnQgPSAwOworCW1vZC0+YXJjaC5wbHQtPnNoX3R5cGUgPSBTSFRfTk9CSVRTOworCW1vZC0+YXJjaC5wbHQtPnNoX2ZsYWdzID0gU0hGX0VYRUNJTlNUUiB8IFNIRl9BTExPQzsKKwltb2QtPmFyY2gucGx0LT5zaF9hZGRyYWxpZ24gPSBMMV9DQUNIRV9CWVRFUzsKKwltb2QtPmFyY2gucGx0LT5zaF9zaXplID0gcm91bmRfdXAocGx0cyAqIFBMVF9FTlRfU0laRSwKKwkJCQkJICBzaXplb2Yoc3RydWN0IHBsdF9lbnRyaWVzKSk7CisJbW9kLT5hcmNoLnBsdF9jb3VudCA9IDA7CiAKLQltb2QtPmFyY2guaW5pdF9wbHQtPnNoX3R5cGUgPSBTSFRfTk9CSVRTOwotCW1vZC0+YXJjaC5pbml0X3BsdC0+c2hfZmxhZ3MgPSBTSEZfRVhFQ0lOU1RSIHwgU0hGX0FMTE9DOwotCW1vZC0+YXJjaC5pbml0X3BsdC0+c2hfYWRkcmFsaWduID0gTDFfQ0FDSEVfQllURVM7Ci0JbW9kLT5hcmNoLmluaXRfcGx0LT5zaF9zaXplID0gcm91bmRfdXAoaW5pdF9wbHRzICogUExUX0VOVF9TSVpFLAotCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwbHRfZW50cmllcykpOwotCW1vZC0+YXJjaC5pbml0X3BsdF9jb3VudCA9IDA7Ci0JcHJfZGVidWcoIiVzOiBjb3JlLnBsdD0leCwgaW5pdC5wbHQ9JXhcbiIsIF9fZnVuY19fLAotCQkgbW9kLT5hcmNoLmNvcmVfcGx0LT5zaF9zaXplLCBtb2QtPmFyY2guaW5pdF9wbHQtPnNoX3NpemUpOworCXByX2RlYnVnKCIlczogcGx0PSV4XG4iLCBfX2Z1bmNfXywgbW9kLT5hcmNoLnBsdC0+c2hfc2l6ZSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmxkcyBiL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUubGRzCmluZGV4IDM2ODJmYTEuLjA1ODgxZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUubGRzCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUubGRzCkBAIC0xLDQgKzEsMyBAQAogU0VDVElPTlMgewotICAgICAgICAuY29yZS5wbHQgOiB7IEJZVEUoMCkgfQotICAgICAgICAuaW5pdC5wbHQgOiB7IEJZVEUoMCkgfQorCS5wbHQgOiB7IEJZVEUoMCkgfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjcuYyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y3LmMKaW5kZXggMTUwNjM4NS4uYjk0MjM0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjcuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ny5jCkBAIC01OTYsMTIgKzU5Niw2IEBACiAJLmF0dHJzID0gYXJtdjdfcG11djFfZXZlbnRfYXR0cnMsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXJtdjdfcG11djFfYXR0cl9ncm91cHNbXSA9IHsKLQkmYXJtdjdfcG11djFfZXZlbnRzX2F0dHJfZ3JvdXAsCi0JJmFybXY3X3BtdV9mb3JtYXRfYXR0cl9ncm91cCwKLQlOVUxMLAotfTsKLQogQVJNVjdfRVZFTlRfQVRUUihtZW1fYWNjZXNzLCBBUk1WN19QRVJGQ1RSX01FTV9BQ0NFU1MpOwogQVJNVjdfRVZFTlRfQVRUUihsMWlfY2FjaGUsIEFSTVY3X1BFUkZDVFJfTDFfSUNBQ0hFX0FDQ0VTUyk7CiBBUk1WN19FVkVOVF9BVFRSKGwxZF9jYWNoZV93YiwgQVJNVjdfUEVSRkNUUl9MMV9EQ0FDSEVfV0IpOwpAQCAtNjUzLDEyICs2NDcsNiBAQAogCS5hdHRycyA9IGFybXY3X3BtdXYyX2V2ZW50X2F0dHJzLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmFybXY3X3BtdXYyX2F0dHJfZ3JvdXBzW10gPSB7Ci0JJmFybXY3X3BtdXYyX2V2ZW50c19hdHRyX2dyb3VwLAotCSZhcm12N19wbXVfZm9ybWF0X2F0dHJfZ3JvdXAsCi0JTlVMTCwKLX07Ci0KIC8qCiAgKiBQZXJmIEV2ZW50cycgaW5kaWNlcwogICovCkBAIC0xMjA4LDcgKzExOTYsMTAgQEAKIAlhcm12N3BtdV9pbml0KGNwdV9wbXUpOwogCWNwdV9wbXUtPm5hbWUJCT0gImFybXY3X2NvcnRleF9hOCI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CT0gYXJtdjdfYThfbWFwX2V2ZW50OwotCWNwdV9wbXUtPnBtdS5hdHRyX2dyb3VwcyA9IGFybXY3X3BtdXYxX2F0dHJfZ3JvdXBzOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0VWRU5UU10gPQorCQkmYXJtdjdfcG11djFfZXZlbnRzX2F0dHJfZ3JvdXA7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRk9STUFUU10gPQorCQkmYXJtdjdfcG11X2Zvcm1hdF9hdHRyX2dyb3VwOwogCXJldHVybiBhcm12N19wcm9iZV9udW1fZXZlbnRzKGNwdV9wbXUpOwogfQogCkBAIC0xMjE3LDcgKzEyMDgsMTAgQEAKIAlhcm12N3BtdV9pbml0KGNwdV9wbXUpOwogCWNwdV9wbXUtPm5hbWUJCT0gImFybXY3X2NvcnRleF9hOSI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CT0gYXJtdjdfYTlfbWFwX2V2ZW50OwotCWNwdV9wbXUtPnBtdS5hdHRyX2dyb3VwcyA9IGFybXY3X3BtdXYxX2F0dHJfZ3JvdXBzOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0VWRU5UU10gPQorCQkmYXJtdjdfcG11djFfZXZlbnRzX2F0dHJfZ3JvdXA7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRk9STUFUU10gPQorCQkmYXJtdjdfcG11X2Zvcm1hdF9hdHRyX2dyb3VwOwogCXJldHVybiBhcm12N19wcm9iZV9udW1fZXZlbnRzKGNwdV9wbXUpOwogfQogCkBAIC0xMjI2LDcgKzEyMjAsMTAgQEAKIAlhcm12N3BtdV9pbml0KGNwdV9wbXUpOwogCWNwdV9wbXUtPm5hbWUJCT0gImFybXY3X2NvcnRleF9hNSI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CT0gYXJtdjdfYTVfbWFwX2V2ZW50OwotCWNwdV9wbXUtPnBtdS5hdHRyX2dyb3VwcyA9IGFybXY3X3BtdXYxX2F0dHJfZ3JvdXBzOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0VWRU5UU10gPQorCQkmYXJtdjdfcG11djFfZXZlbnRzX2F0dHJfZ3JvdXA7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRk9STUFUU10gPQorCQkmYXJtdjdfcG11X2Zvcm1hdF9hdHRyX2dyb3VwOwogCXJldHVybiBhcm12N19wcm9iZV9udW1fZXZlbnRzKGNwdV9wbXUpOwogfQogCkBAIC0xMjM2LDcgKzEyMzMsMTAgQEAKIAljcHVfcG11LT5uYW1lCQk9ICJhcm12N19jb3J0ZXhfYTE1IjsKIAljcHVfcG11LT5tYXBfZXZlbnQJPSBhcm12N19hMTVfbWFwX2V2ZW50OwogCWNwdV9wbXUtPnNldF9ldmVudF9maWx0ZXIgPSBhcm12N3BtdV9zZXRfZXZlbnRfZmlsdGVyOwotCWNwdV9wbXUtPnBtdS5hdHRyX2dyb3VwcyA9IGFybXY3X3BtdXYyX2F0dHJfZ3JvdXBzOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0VWRU5UU10gPQorCQkmYXJtdjdfcG11djJfZXZlbnRzX2F0dHJfZ3JvdXA7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRk9STUFUU10gPQorCQkmYXJtdjdfcG11X2Zvcm1hdF9hdHRyX2dyb3VwOwogCXJldHVybiBhcm12N19wcm9iZV9udW1fZXZlbnRzKGNwdV9wbXUpOwogfQogCkBAIC0xMjQ2LDcgKzEyNDYsMTAgQEAKIAljcHVfcG11LT5uYW1lCQk9ICJhcm12N19jb3J0ZXhfYTciOwogCWNwdV9wbXUtPm1hcF9ldmVudAk9IGFybXY3X2E3X21hcF9ldmVudDsKIAljcHVfcG11LT5zZXRfZXZlbnRfZmlsdGVyID0gYXJtdjdwbXVfc2V0X2V2ZW50X2ZpbHRlcjsKLQljcHVfcG11LT5wbXUuYXR0cl9ncm91cHMgPSBhcm12N19wbXV2Ml9hdHRyX2dyb3VwczsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9FVkVOVFNdID0KKwkJJmFybXY3X3BtdXYyX2V2ZW50c19hdHRyX2dyb3VwOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0ZPUk1BVFNdID0KKwkJJmFybXY3X3BtdV9mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjdfcHJvYmVfbnVtX2V2ZW50cyhjcHVfcG11KTsKIH0KIApAQCAtMTI1Niw3ICsxMjU5LDEwIEBACiAJY3B1X3BtdS0+bmFtZQkJPSAiYXJtdjdfY29ydGV4X2ExMiI7CiAJY3B1X3BtdS0+bWFwX2V2ZW50CT0gYXJtdjdfYTEyX21hcF9ldmVudDsKIAljcHVfcG11LT5zZXRfZXZlbnRfZmlsdGVyID0gYXJtdjdwbXVfc2V0X2V2ZW50X2ZpbHRlcjsKLQljcHVfcG11LT5wbXUuYXR0cl9ncm91cHMgPSBhcm12N19wbXV2Ml9hdHRyX2dyb3VwczsKKwljcHVfcG11LT5hdHRyX2dyb3Vwc1tBUk1QTVVfQVRUUl9HUk9VUF9FVkVOVFNdID0KKwkJJmFybXY3X3BtdXYyX2V2ZW50c19hdHRyX2dyb3VwOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0ZPUk1BVFNdID0KKwkJJmFybXY3X3BtdV9mb3JtYXRfYXR0cl9ncm91cDsKIAlyZXR1cm4gYXJtdjdfcHJvYmVfbnVtX2V2ZW50cyhjcHVfcG11KTsKIH0KIApAQCAtMTI2NCw3ICsxMjcwLDEwIEBACiB7CiAJaW50IHJldCA9IGFybXY3X2ExMl9wbXVfaW5pdChjcHVfcG11KTsKIAljcHVfcG11LT5uYW1lID0gImFybXY3X2NvcnRleF9hMTciOwotCWNwdV9wbXUtPnBtdS5hdHRyX2dyb3VwcyA9IGFybXY3X3BtdXYyX2F0dHJfZ3JvdXBzOworCWNwdV9wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0VWRU5UU10gPQorCQkmYXJtdjdfcG11djJfZXZlbnRzX2F0dHJfZ3JvdXA7CisJY3B1X3BtdS0+YXR0cl9ncm91cHNbQVJNUE1VX0FUVFJfR1JPVVBfRk9STUFUU10gPQorCQkmYXJtdjdfcG11X2Zvcm1hdF9hdHRyX2dyb3VwOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKaW5kZXggZGY3ZjJhNy4uMzRlM2YzYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NldHVwLmMKQEAgLTExNCwxOSArMTE0LDE5IEBACiAKIAogI2lmZGVmIE1VTFRJX0NQVQotc3RydWN0IHByb2Nlc3NvciBwcm9jZXNzb3IgX19yZWFkX21vc3RseTsKK3N0cnVjdCBwcm9jZXNzb3IgcHJvY2Vzc29yIF9fcm9fYWZ0ZXJfaW5pdDsKICNlbmRpZgogI2lmZGVmIE1VTFRJX1RMQgotc3RydWN0IGNwdV90bGJfZm5zIGNwdV90bGIgX19yZWFkX21vc3RseTsKK3N0cnVjdCBjcHVfdGxiX2ZucyBjcHVfdGxiIF9fcm9fYWZ0ZXJfaW5pdDsKICNlbmRpZgogI2lmZGVmIE1VTFRJX1VTRVIKLXN0cnVjdCBjcHVfdXNlcl9mbnMgY3B1X3VzZXIgX19yZWFkX21vc3RseTsKK3N0cnVjdCBjcHVfdXNlcl9mbnMgY3B1X3VzZXIgX19yb19hZnRlcl9pbml0OwogI2VuZGlmCiAjaWZkZWYgTVVMVElfQ0FDSEUKLXN0cnVjdCBjcHVfY2FjaGVfZm5zIGNwdV9jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RydWN0IGNwdV9jYWNoZV9mbnMgY3B1X2NhY2hlIF9fcm9fYWZ0ZXJfaW5pdDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19PVVRFUl9DQUNIRQotc3RydWN0IG91dGVyX2NhY2hlX2ZucyBvdXRlcl9jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RydWN0IG91dGVyX2NhY2hlX2ZucyBvdXRlcl9jYWNoZSBfX3JvX2FmdGVyX2luaXQ7CiBFWFBPUlRfU1lNQk9MKG91dGVyX2NhY2hlKTsKICNlbmRpZgogCkBAIC0yOTAsMTIgKzI5MCw5IEBACiAJLyogYXJjaCBzcGVjaWZpZXMgdGhlIHJlZ2lzdGVyIGZvcm1hdCAqLwogCXN3aXRjaCAoYXJjaCkgewogCWNhc2UgQ1BVX0FSQ0hfQVJNdjc6Ci0JCWFzbSgibWNyCXAxNSwgMiwgJTAsIGMwLCBjMCwgMCBAIHNldCBDU1NFTFIiCi0JCSAgICA6IC8qIE5vIG91dHB1dCBvcGVyYW5kcyAqLwotCQkgICAgOiAiciIgKDEpKTsKKwkJc2V0X2Nzc2VscihDU1NFTFJfSUNBQ0hFIHwgQ1NTRUxSX0wxKTsKIAkJaXNiKCk7Ci0JCWFzbSgibXJjCXAxNSwgMSwgJTAsIGMwLCBjMCwgMCBAIHJlYWQgQ0NTSURSIgotCQkgICAgOiAiPXIiIChpZF9yZWcpKTsKKwkJaWRfcmVnID0gcmVhZF9jY3NpZHIoKTsKIAkJbGluZV9zaXplID0gNCA8PCAoKGlkX3JlZyAmIDB4NykgKyAyKTsKIAkJbnVtX3NldHMgPSAoKGlkX3JlZyA+PiAxMykgJiAweDdmZmYpICsgMTsKIAkJYWxpYXNpbmdfaWNhY2hlID0gKGxpbmVfc2l6ZSAqIG51bV9zZXRzKSA+IFBBR0VfU0laRTsKQEAgLTMxNSwxMSArMzEyLDEyIEBACiB7CiAJdW5zaWduZWQgaW50IGFyY2ggPSBjcHVfYXJjaGl0ZWN0dXJlKCk7CiAKLQlpZiAoYXJjaCA9PSBDUFVfQVJDSF9BUk12N00pIHsKLQkJY2FjaGVpZCA9IDA7Ci0JfSBlbHNlIGlmIChhcmNoID49IENQVV9BUkNIX0FSTXY2KSB7CisJaWYgKGFyY2ggPj0gQ1BVX0FSQ0hfQVJNdjYpIHsKIAkJdW5zaWduZWQgaW50IGNhY2hldHlwZSA9IHJlYWRfY3B1aWRfY2FjaGV0eXBlKCk7Ci0JCWlmICgoY2FjaGV0eXBlICYgKDcgPDwgMjkpKSA9PSA0IDw8IDI5KSB7CisKKwkJaWYgKChhcmNoID09IENQVV9BUkNIX0FSTXY3TSkgJiYgIWNhY2hldHlwZSkgeworCQkJY2FjaGVpZCA9IDA7CisJCX0gZWxzZSBpZiAoKGNhY2hldHlwZSAmICg3IDw8IDI5KSkgPT0gNCA8PCAyOSkgewogCQkJLyogQVJNdjcgcmVnaXN0ZXIgZm9ybWF0ICovCiAJCQlhcmNoID0gQ1BVX0FSQ0hfQVJNdjc7CiAJCQljYWNoZWlkID0gQ0FDSEVJRF9WSVBUX05PTkFMSUFTSU5HOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NtcC5jIGIvYXJjaC9hcm0va2VybmVsL3NtcC5jCmluZGV4IDg2MTUyMTYuLjkzN2M4OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAogc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihjcHVfcnVubmluZyk7CiAKLXN0YXRpYyBzdHJ1Y3Qgc21wX29wZXJhdGlvbnMgc21wX29wczsKK3N0YXRpYyBzdHJ1Y3Qgc21wX29wZXJhdGlvbnMgc21wX29wcyBfX3JvX2FmdGVyX2luaXQ7CiAKIHZvaWQgX19pbml0IHNtcF9zZXRfb3BzKGNvbnN0IHN0cnVjdCBzbXBfb3BlcmF0aW9ucyAqb3BzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Zkc28uYyBiL2FyY2gvYXJtL2tlcm5lbC92ZHNvLmMKaW5kZXggOTk0ZTk3MS4uNTNjZjg2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3Zkc28uYworKysgYi9hcmNoL2FybS9rZXJuZWwvdmRzby5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM5LDcgKzQwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqKnZkc29fdGV4dF9wYWdlbGlzdDsKIAogLyogVG90YWwgbnVtYmVyIG9mIHBhZ2VzIG5lZWRlZCBmb3IgdGhlIGRhdGEgYW5kIHRleHQgcG9ydGlvbnMgb2YgdGhlIFZEU08uICovCi11bnNpZ25lZCBpbnQgdmRzb190b3RhbF9wYWdlcyBfX3JlYWRfbW9zdGx5OwordW5zaWduZWQgaW50IHZkc29fdG90YWxfcGFnZXMgX19yb19hZnRlcl9pbml0OwogCiAvKgogICogVGhlIFZEU08gZGF0YSBwYWdlLgpAQCAtNDcsMTMgKzQ4LDEzIEBACiBzdGF0aWMgdW5pb24gdmRzb19kYXRhX3N0b3JlIHZkc29fZGF0YV9zdG9yZSBfX3BhZ2VfYWxpZ25lZF9kYXRhOwogc3RhdGljIHN0cnVjdCB2ZHNvX2RhdGEgKnZkc29fZGF0YSA9ICZ2ZHNvX2RhdGFfc3RvcmUuZGF0YTsKIAotc3RhdGljIHN0cnVjdCBwYWdlICp2ZHNvX2RhdGFfcGFnZTsKLXN0YXRpYyBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nIHZkc29fZGF0YV9tYXBwaW5nID0geworc3RhdGljIHN0cnVjdCBwYWdlICp2ZHNvX2RhdGFfcGFnZSBfX3JvX2FmdGVyX2luaXQ7CitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2ZHNvX2RhdGFfbWFwcGluZyA9IHsKIAkubmFtZSA9ICJbdnZhcl0iLAogCS5wYWdlcyA9ICZ2ZHNvX2RhdGFfcGFnZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nIHZkc29fdGV4dF9tYXBwaW5nID0geworc3RhdGljIHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgdmRzb190ZXh0X21hcHBpbmcgX19yb19hZnRlcl9pbml0ID0gewogCS5uYW1lID0gIlt2ZHNvXSIsCiB9OwogCkBAIC02Nyw3ICs2OCw3IEBACiAvKiBDYWNoZWQgcmVzdWx0IG9mIGJvb3QtdGltZSBjaGVjayBmb3Igd2hldGhlciB0aGUgYXJjaCB0aW1lciBleGlzdHMsCiAgKiBhbmQgaWYgc28sIHdoZXRoZXIgdGhlIHZpcnR1YWwgY291bnRlciBpcyB1c2VhYmxlLgogICovCi1zdGF0aWMgYm9vbCBjbnR2Y3Rfb2sgX19yZWFkX21vc3RseTsKK3N0YXRpYyBib29sIGNudHZjdF9vayBfX3JvX2FmdGVyX2luaXQ7CiAKIHN0YXRpYyBib29sIF9faW5pdCBjbnR2Y3RfZnVuY3Rpb25hbCh2b2lkKQogewpAQCAtMjcwLDcgKzI3MSw3IEBACiAJaWYgKCFJU19FTkFCTEVEKENPTkZJR19BUk1fQVJDSF9USU1FUikpCiAJCXJldHVybiBmYWxzZTsKIAotCWlmIChzdHJjbXAodGstPnRrcl9tb25vLmNsb2NrLT5uYW1lLCAiYXJjaF9zeXNfY291bnRlciIpICE9IDApCisJaWYgKCF0ay0+dGtyX21vbm8uY2xvY2stPmFyY2hkYXRhLnZkc29fZGlyZWN0KQogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2t2bS9NYWtlZmlsZSBiL2FyY2gvYXJtL2t2bS9NYWtlZmlsZQppbmRleCAxMGQ3N2E2Li5mMTk4NDJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rdm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0va3ZtL01ha2VmaWxlCkBAIC0yMSwxMyArMjEsMTYgQEAKIG9iai15ICs9IGt2bS1hcm0ubyBpbml0Lm8gaW50ZXJydXB0cy5vCiBvYmoteSArPSBhcm0ubyBoYW5kbGVfZXhpdC5vIGd1ZXN0Lm8gbW11Lm8gZW11bGF0ZS5vIHJlc2V0Lm8KIG9iai15ICs9IGNvcHJvYy5vIGNvcHJvY19hMTUubyBjb3Byb2NfYTcubyBtbWlvLm8gcHNjaS5vIHBlcmYubworb2JqLXkgKz0gJChLVk0pL2FybS9hYXJjaDMyLm8KIAogb2JqLXkgKz0gJChLVk0pL2FybS92Z2ljL3ZnaWMubwogb2JqLXkgKz0gJChLVk0pL2FybS92Z2ljL3ZnaWMtaW5pdC5vCiBvYmoteSArPSAkKEtWTSkvYXJtL3ZnaWMvdmdpYy1pcnFmZC5vCiBvYmoteSArPSAkKEtWTSkvYXJtL3ZnaWMvdmdpYy12Mi5vCitvYmoteSArPSAkKEtWTSkvYXJtL3ZnaWMvdmdpYy12My5vCiBvYmoteSArPSAkKEtWTSkvYXJtL3ZnaWMvdmdpYy1tbWlvLm8KIG9iai15ICs9ICQoS1ZNKS9hcm0vdmdpYy92Z2ljLW1taW8tdjIubworb2JqLXkgKz0gJChLVk0pL2FybS92Z2ljL3ZnaWMtbW1pby12My5vCiBvYmoteSArPSAkKEtWTSkvYXJtL3ZnaWMvdmdpYy1rdm0tZGV2aWNlLm8KIG9iai15ICs9ICQoS1ZNKS9pcnFjaGlwLm8KIG9iai15ICs9ICQoS1ZNKS9hcm0vYXJjaF90aW1lci5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vYXJtLmMgYi9hcmNoL2FybS9rdm0vYXJtLmMKaW5kZXggNzVmMTMwZS4uMDNlOTI3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL2FybS5jCisrKyBiL2FyY2gvYXJtL2t2bS9hcm0uYwpAQCAtMTQ0LDYgKzE0NCwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKK2Jvb2wga3ZtX2FyY2hfaGFzX3ZjcHVfZGVidWdmcyh2b2lkKQoreworCXJldHVybiBmYWxzZTsKK30KKworaW50IGt2bV9hcmNoX2NyZWF0ZV92Y3B1X2RlYnVnZnMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiAwOworfQorCiBpbnQga3ZtX2FyY2hfdmNwdV9mYXVsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQogewogCXJldHVybiBWTV9GQVVMVF9TSUdCVVM7CkBAIC0xNTgsOCArMTY4LDYgQEAKIHsKIAlpbnQgaTsKIAotCWt2bV9mcmVlX3N0YWdlMl9wZ2Qoa3ZtKTsKLQogCWZvciAoaSA9IDA7IGkgPCBLVk1fTUFYX1ZDUFVTOyArK2kpIHsKIAkJaWYgKGt2bS0+dmNwdXNbaV0pIHsKIAkJCWt2bV9hcmNoX3ZjcHVfZnJlZShrdm0tPnZjcHVzW2ldKTsKQEAgLTExNzgsNiArMTE4NiwxMCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwkvKiBzZXQgc2l6ZSBvZiBWTUlEIHN1cHBvcnRlZCBieSBDUFUgKi8KKwlrdm1fdm1pZF9iaXRzID0ga3ZtX2dldF92bWlkX2JpdHMoKTsKKwlrdm1faW5mbygiJWQtYml0IFZNSURcbiIsIGt2bV92bWlkX2JpdHMpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyNDMsMTAgKzEyNTUsNiBAQAogCiBzdGF0aWMgaW50IGluaXRfdmhlX21vZGUodm9pZCkKIHsKLQkvKiBzZXQgc2l6ZSBvZiBWTUlEIHN1cHBvcnRlZCBieSBDUFUgKi8KLQlrdm1fdm1pZF9iaXRzID0ga3ZtX2dldF92bWlkX2JpdHMoKTsKLQlrdm1faW5mbygiJWQtYml0IFZNSURcbiIsIGt2bV92bWlkX2JpdHMpOwotCiAJa3ZtX2luZm8oIlZIRSBtb2RlIGluaXRpYWxpemVkIHN1Y2Nlc3NmdWxseVxuIik7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMzMwLDEwICsxMzM4LDYgQEAKIAkJfQogCX0KIAotCS8qIHNldCBzaXplIG9mIFZNSUQgc3VwcG9ydGVkIGJ5IENQVSAqLwotCWt2bV92bWlkX2JpdHMgPSBrdm1fZ2V0X3ZtaWRfYml0cygpOwotCWt2bV9pbmZvKCIlZC1iaXQgVk1JRFxuIiwga3ZtX3ZtaWRfYml0cyk7Ci0KIAlrdm1faW5mbygiSHlwIG1vZGUgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL2NvcHJvYy5jIGIvYXJjaC9hcm0va3ZtL2NvcHJvYy5jCmluZGV4IDFiYjJiNzkuLjNlNWU0MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9jb3Byb2MuYworKysgYi9hcmNoL2FybS9rdm0vY29wcm9jLmMKQEAgLTIyOCw2ICsyMjgsMzUgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGJvb2wgYWNjZXNzX2dpY19zZ2koc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJICAgY29uc3Qgc3RydWN0IGNvcHJvY19wYXJhbXMgKnAsCisJCQkgICBjb25zdCBzdHJ1Y3QgY29wcm9jX3JlZyAqcikKK3sKKwl1NjQgcmVnOworCisJaWYgKCFwLT5pc193cml0ZSkKKwkJcmV0dXJuIHJlYWRfZnJvbV93cml0ZV9vbmx5KHZjcHUsIHApOworCisJcmVnID0gKHU2NCkqdmNwdV9yZWcodmNwdSwgcC0+UnQyKSA8PCAzMjsKKwlyZWcgfD0gKnZjcHVfcmVnKHZjcHUsIHAtPlJ0MSkgOworCisJdmdpY192M19kaXNwYXRjaF9zZ2kodmNwdSwgcmVnKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBhY2Nlc3NfZ2ljX3NyZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkgICBjb25zdCBzdHJ1Y3QgY29wcm9jX3BhcmFtcyAqcCwKKwkJCSAgIGNvbnN0IHN0cnVjdCBjb3Byb2NfcmVnICpyKQoreworCWlmIChwLT5pc193cml0ZSkKKwkJcmV0dXJuIGlnbm9yZV93cml0ZSh2Y3B1LCBwKTsKKworCSp2Y3B1X3JlZyh2Y3B1LCBwLT5SdDEpID0gdmNwdS0+YXJjaC52Z2ljX2NwdS52Z2ljX3YzLnZnaWNfc3JlOworCisJcmV0dXJuIHRydWU7Cit9CisKIC8qCiAgKiBXZSBjb3VsZCB0cmFwIElEX0RGUjAgYW5kIHRlbGwgdGhlIGd1ZXN0IHdlIGRvbid0IHN1cHBvcnQgcGVyZm9ybWFuY2UKICAqIG1vbml0b3JpbmcuICBVbmZvcnR1bmF0ZWx5IHRoZSBwYXRjaCB0byBtYWtlIHRoZSBrZXJuZWwgY2hlY2sgSURfREZSMCB3YXMKQEAgLTM2MSwxMCArMzkwLDE2IEBACiAJeyBDUm4oMTApLCBDUm0oIDMpLCBPcDEoIDApLCBPcDIoIDEpLCBpczMyLAogCQkJYWNjZXNzX3ZtX3JlZywgcmVzZXRfdW5rbm93biwgYzEwX0FNQUlSMX0sCiAKKwkvKiBJQ0NfU0dJMVIgKi8KKwl7IENSbTY0KDEyKSwgT3AxKCAwKSwgaXM2NCwgYWNjZXNzX2dpY19zZ2l9LAorCiAJLyogVkJBUjogc3dhcHBlZCBieSBpbnRlcnJ1cHQuUy4gKi8KIAl7IENSbigxMiksIENSbSggMCksIE9wMSggMCksIE9wMiggMCksIGlzMzIsCiAJCQlOVUxMLCByZXNldF92YWwsIGMxMl9WQkFSLCAweDAwMDAwMDAwIH0sCiAKKwkvKiBJQ0NfU1JFICovCisJeyBDUm4oMTIpLCBDUm0oMTIpLCBPcDEoIDApLCBPcDIoNSksIGlzMzIsIGFjY2Vzc19naWNfc3JlIH0sCisKIAkvKiBDT05URVhUSURSL1RQSURSVVJXL1RQSURSVVJPL1RQSURSUFJXOiBzd2FwcGVkIGJ5IGludGVycnVwdC5TLiAqLwogCXsgQ1JuKDEzKSwgQ1JtKCAwKSwgT3AxKCAwKSwgT3AyKCAxKSwgaXMzMiwKIAkJCWFjY2Vzc192bV9yZWcsIHJlc2V0X3ZhbCwgYzEzX0NJRCwgMHgwMDAwMDAwMCB9LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL2VtdWxhdGUuYyBiL2FyY2gvYXJtL2t2bS9lbXVsYXRlLmMKaW5kZXggYWY5M2UzZi4uMDA2NGI4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL2VtdWxhdGUuYworKysgYi9hcmNoL2FybS9rdm0vZW11bGF0ZS5jCkBAIC0xNjEsMTA1ICsxNjEsNiBAQAogCX0KIH0KIAotLyoKLSAqIEEgY29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb24gaXMgYWxsb3dlZCB0byB0cmFwLCBldmVuIHRob3VnaCBpdAotICogd291bGRuJ3QgYmUgZXhlY3V0ZWQuICBTbyBsZXQncyByZS1pbXBsZW1lbnQgdGhlIGhhcmR3YXJlLCBpbgotICogc29mdHdhcmUhCi0gKi8KLWJvb2wga3ZtX2NvbmRpdGlvbl92YWxpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0JdW5zaWduZWQgbG9uZyBjcHNyLCBjb25kLCBpbnNuOwotCi0JLyoKLQkgKiBFeGNlcHRpb24gQ29kZSAwIGNhbiBvbmx5IGhhcHBlbiBpZiB3ZSBzZXQgSENSLlRHRSB0byAxLCB0bwotCSAqIGNhdGNoIHVuZGVmaW5lZCBpbnN0cnVjdGlvbnMsIGFuZCB0aGVuIHdlIHdvbid0IGdldCBwYXN0Ci0JICogdGhlIGFybV9leGl0X2hhbmRsZXJzIHRlc3QgYW55d2F5LgotCSAqLwotCUJVR19PTigha3ZtX3ZjcHVfdHJhcF9nZXRfY2xhc3ModmNwdSkpOwotCi0JLyogVG9wIHR3byBiaXRzIG5vbi16ZXJvPyAgVW5jb25kaXRpb25hbC4gKi8KLQlpZiAoa3ZtX3ZjcHVfZ2V0X2hzcih2Y3B1KSA+PiAzMCkKLQkJcmV0dXJuIHRydWU7Ci0KLQljcHNyID0gKnZjcHVfY3Bzcih2Y3B1KTsKLQotCS8qIElzIGNvbmRpdGlvbiBmaWVsZCB2YWxpZD8gKi8KLQlpZiAoKGt2bV92Y3B1X2dldF9oc3IodmNwdSkgJiBIU1JfQ1YpID4+IEhTUl9DVl9TSElGVCkKLQkJY29uZCA9IChrdm1fdmNwdV9nZXRfaHNyKHZjcHUpICYgSFNSX0NPTkQpID4+IEhTUl9DT05EX1NISUZUOwotCWVsc2UgewotCQkvKiBUaGlzIGNhbiBoYXBwZW4gaW4gVGh1bWIgbW9kZTogZXhhbWluZSBJVCBzdGF0ZS4gKi8KLQkJdW5zaWduZWQgbG9uZyBpdDsKLQotCQlpdCA9ICgoY3BzciA+PiA4KSAmIDB4RkMpIHwgKChjcHNyID4+IDI1KSAmIDB4Myk7Ci0KLQkJLyogaXQgPT0gMCA9PiB1bmNvbmRpdGlvbmFsLiAqLwotCQlpZiAoaXQgPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8qIFRoZSBjb25kIGZvciB0aGlzIGluc24gd29ya3Mgb3V0IGFzIHRoZSB0b3AgNCBiaXRzLiAqLwotCQljb25kID0gKGl0ID4+IDQpOwotCX0KLQotCS8qIFNoaWZ0IG1ha2VzIGl0IGxvb2sgbGlrZSBhbiBBUk0tbW9kZSBpbnN0cnVjdGlvbiAqLwotCWluc24gPSBjb25kIDw8IDI4OwotCXJldHVybiBhcm1fY2hlY2tfY29uZGl0aW9uKGluc24sIGNwc3IpICE9IEFSTV9PUENPREVfQ09ORFRFU1RfRkFJTDsKLX0KLQotLyoqCi0gKiBhZGp1c3RfaXRzdGF0ZSAtIGFkanVzdCBJVFNUQVRFIHdoZW4gZW11bGF0aW5nIGluc3RydWN0aW9ucyBpbiBJVC1ibG9jawotICogQHZjcHU6CVRoZSBWQ1BVIHBvaW50ZXIKLSAqCi0gKiBXaGVuIGV4Y2VwdGlvbnMgb2NjdXIgd2hpbGUgaW5zdHJ1Y3Rpb25zIGFyZSBleGVjdXRlZCBpbiBUaHVtYiBJRi1USEVOCi0gKiBibG9ja3MsIHRoZSBJVFNUQVRFIGZpZWxkIG9mIHRoZSBDUFNSIGlzIG5vdCBhZHZhbmNlZCAodXBkYXRlZCksIHNvIHdlIGhhdmUKLSAqIHRvIGRvIHRoaXMgbGl0dGxlIGJpdCBvZiB3b3JrIG1hbnVhbGx5LiBUaGUgZmllbGRzIG1hcCBsaWtlIHRoaXM6Ci0gKgotICogSVRbNzowXSAtPiBDUFNSWzI2OjI1XSxDUFNSWzE1OjEwXQotICovCi1zdGF0aWMgdm9pZCBrdm1fYWRqdXN0X2l0c3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXVuc2lnbmVkIGxvbmcgaXRiaXRzLCBjb25kOwotCXVuc2lnbmVkIGxvbmcgY3BzciA9ICp2Y3B1X2Nwc3IodmNwdSk7Ci0JYm9vbCBpc19hcm0gPSAhKGNwc3IgJiBQU1JfVF9CSVQpOwotCi0JQlVHX09OKGlzX2FybSAmJiAoY3BzciAmIFBTUl9JVF9NQVNLKSk7Ci0KLQlpZiAoIShjcHNyICYgUFNSX0lUX01BU0spKQotCQlyZXR1cm47Ci0KLQljb25kID0gKGNwc3IgJiAweGUwMDApID4+IDEzOwotCWl0Yml0cyA9IChjcHNyICYgMHgxYzAwKSA+PiAoMTAgLSAyKTsKLQlpdGJpdHMgfD0gKGNwc3IgJiAoMHgzIDw8IDI1KSkgPj4gMjU7Ci0KLQkvKiBQZXJmb3JtIElUQWR2YW5jZSAoc2VlIHBhZ2UgQS01MiBpbiBBUk0gRERJIDA0MDZDKSAqLwotCWlmICgoaXRiaXRzICYgMHg3KSA9PSAwKQotCQlpdGJpdHMgPSBjb25kID0gMDsKLQllbHNlCi0JCWl0Yml0cyA9IChpdGJpdHMgPDwgMSkgJiAweDFmOwotCi0JY3BzciAmPSB+UFNSX0lUX01BU0s7Ci0JY3BzciB8PSBjb25kIDw8IDEzOwotCWNwc3IgfD0gKGl0Yml0cyAmIDB4MWMpIDw8ICgxMCAtIDIpOwotCWNwc3IgfD0gKGl0Yml0cyAmIDB4MykgPDwgMjU7Ci0JKnZjcHVfY3Bzcih2Y3B1KSA9IGNwc3I7Ci19Ci0KLS8qKgotICoga3ZtX3NraXBfaW5zdHIgLSBza2lwIGEgdHJhcHBlZCBpbnN0cnVjdGlvbiBhbmQgcHJvY2VlZCB0byB0aGUgbmV4dAotICogQHZjcHU6IFRoZSB2Y3B1IHBvaW50ZXIKLSAqLwotdm9pZCBrdm1fc2tpcF9pbnN0cihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgaXNfd2lkZV9pbnN0cikKLXsKLQlib29sIGlzX3RodW1iOwotCi0JaXNfdGh1bWIgPSAhISgqdmNwdV9jcHNyKHZjcHUpICYgUFNSX1RfQklUKTsKLQlpZiAoaXNfdGh1bWIgJiYgIWlzX3dpZGVfaW5zdHIpCi0JCSp2Y3B1X3BjKHZjcHUpICs9IDI7Ci0JZWxzZQotCQkqdmNwdV9wYyh2Y3B1KSArPSA0OwotCWt2bV9hZGp1c3RfaXRzdGF0ZSh2Y3B1KTsKLX0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBJbmplY3QgZXhjZXB0aW9ucyBpbnRvIHRoZSBndWVzdAogICovCkBAIC00MDIsMyArMzAzLDE1IEBACiB7CiAJaW5qZWN0X2FidCh2Y3B1LCB0cnVlLCBhZGRyKTsKIH0KKworLyoqCisgKiBrdm1faW5qZWN0X3ZhYnQgLSBpbmplY3QgYW4gYXN5bmMgYWJvcnQgLyBTRXJyb3IgaW50byB0aGUgZ3Vlc3QKKyAqIEB2Y3B1OiBUaGUgVkNQVSB0byByZWNlaXZlIHRoZSBleGNlcHRpb24KKyAqCisgKiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhpcyBjb2RlIGlzIGNhbGxlZCBmcm9tIHRoZSBWQ1BVIHRocmVhZCBhbmQgdGhhdCB0aGUKKyAqIFZDUFUgdGhlcmVmb3JlIGlzIG5vdCBjdXJyZW50bHkgZXhlY3V0aW5nIGd1ZXN0IGNvZGUuCisgKi8KK3ZvaWQga3ZtX2luamVjdF92YWJ0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl2Y3B1X3NldF9oY3IodmNwdSwgdmNwdV9nZXRfaGNyKHZjcHUpIHwgSENSX1ZBKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2t2bS9oYW5kbGVfZXhpdC5jIGIvYXJjaC9hcm0va3ZtL2hhbmRsZV9leGl0LmMKaW5kZXggM2YxZWYwZC4uNGU0MGQxOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL2hhbmRsZV9leGl0LmMKKysrIGIvYXJjaC9hcm0va3ZtL2hhbmRsZV9leGl0LmMKQEAgLTI4LDE0ICsyOCw2IEBACiAKIHR5cGVkZWYgaW50ICgqZXhpdF9oYW5kbGVfZm4pKHN0cnVjdCBrdm1fdmNwdSAqLCBzdHJ1Y3Qga3ZtX3J1biAqKTsKIAotc3RhdGljIGludCBoYW5kbGVfc3ZjX2h5cChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4pCi17Ci0JLyogU1ZDIGNhbGxlZCBmcm9tIEh5cCBtb2RlIHNob3VsZCBuZXZlciBnZXQgaGVyZSAqLwotCWt2bV9kZWJ1ZygiU1ZDIGNhbGxlZCBmcm9tIEh5cCBtb2RlIHNob3VsZG4ndCBnbyBoZXJlXG4iKTsKLQlCVUcoKTsKLQlyZXR1cm4gLUVJTlZBTDsgLyogU3F1YXNoIHdhcm5pbmcgKi8KLX0KLQogc3RhdGljIGludCBoYW5kbGVfaHZjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bikKIHsKIAlpbnQgcmV0OwpAQCAtNTksMjIgKzUxLDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBoYW5kbGVfcGFidF9oeXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuKQotewotCS8qIFRoZSBoeXBlcnZpc29yIHNob3VsZCBuZXZlciBjYXVzZSBhYm9ydHMgKi8KLQlrdm1fZXJyKCJQcmVmZXRjaCBBYm9ydCB0YWtlbiBmcm9tIEh5cCBtb2RlIGF0ICUjMDhseCAoSFNSOiAlIzA4eClcbiIsCi0JCWt2bV92Y3B1X2dldF9oZmFyKHZjcHUpLCBrdm1fdmNwdV9nZXRfaHNyKHZjcHUpKTsKLQlyZXR1cm4gLUVGQVVMVDsKLX0KLQotc3RhdGljIGludCBoYW5kbGVfZGFidF9oeXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuKQotewotCS8qIFRoaXMgaXMgZWl0aGVyIGFuIGVycm9yIGluIHRoZSB3cy4gY29kZSBvciBhbiBleHRlcm5hbCBhYm9ydCAqLwotCWt2bV9lcnIoIkRhdGEgQWJvcnQgdGFrZW4gZnJvbSBIeXAgbW9kZSBhdCAlIzA4bHggKEhTUjogJSMwOHgpXG4iLAotCQlrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSwga3ZtX3ZjcHVfZ2V0X2hzcih2Y3B1KSk7Ci0JcmV0dXJuIC1FRkFVTFQ7Ci19Ci0KIC8qKgogICoga3ZtX2hhbmRsZV93ZnggLSBoYW5kbGUgYSBXRkkgb3IgV0ZFIGluc3RydWN0aW9ucyB0cmFwcGVkIGluIGd1ZXN0cwogICogQHZjcHU6CXRoZSB2Y3B1IHBvaW50ZXIKQEAgLTExMiwxMyArODgsMTAgQEAKIAlbSFNSX0VDX0NQMTRfNjRdCT0ga3ZtX2hhbmRsZV9jcDE0X2FjY2VzcywKIAlbSFNSX0VDX0NQXzBfMTNdCT0ga3ZtX2hhbmRsZV9jcF8wXzEzX2FjY2VzcywKIAlbSFNSX0VDX0NQMTBfSURdCT0ga3ZtX2hhbmRsZV9jcDEwX2lkLAotCVtIU1JfRUNfU1ZDX0hZUF0JPSBoYW5kbGVfc3ZjX2h5cCwKIAlbSFNSX0VDX0hWQ10JCT0gaGFuZGxlX2h2YywKIAlbSFNSX0VDX1NNQ10JCT0gaGFuZGxlX3NtYywKIAlbSFNSX0VDX0lBQlRdCQk9IGt2bV9oYW5kbGVfZ3Vlc3RfYWJvcnQsCi0JW0hTUl9FQ19JQUJUX0hZUF0JPSBoYW5kbGVfcGFidF9oeXAsCiAJW0hTUl9FQ19EQUJUXQkJPSBrdm1faGFuZGxlX2d1ZXN0X2Fib3J0LAotCVtIU1JfRUNfREFCVF9IWVBdCT0gaGFuZGxlX2RhYnRfaHlwLAogfTsKIAogc3RhdGljIGV4aXRfaGFuZGxlX2ZuIGt2bV9nZXRfZXhpdF9oYW5kbGVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTE0NCw2ICsxMTcsMjUgQEAKIHsKIAlleGl0X2hhbmRsZV9mbiBleGl0X2hhbmRsZXI7CiAKKwlpZiAoQVJNX0FCT1JUX1BFTkRJTkcoZXhjZXB0aW9uX2luZGV4KSkgeworCQl1OCBoc3JfZWMgPSBrdm1fdmNwdV90cmFwX2dldF9jbGFzcyh2Y3B1KTsKKworCQkvKgorCQkgKiBIVkMvU01DIGFscmVhZHkgaGF2ZSBhbiBhZGp1c3RlZCBQQywgd2hpY2ggd2UgbmVlZAorCQkgKiB0byBjb3JyZWN0IGluIG9yZGVyIHRvIHJldHVybiB0byBhZnRlciBoYXZpbmcKKwkJICogaW5qZWN0ZWQgdGhlIGFib3J0LgorCQkgKi8KKwkJaWYgKGhzcl9lYyA9PSBIU1JfRUNfSFZDIHx8IGhzcl9lYyA9PSBIU1JfRUNfU01DKSB7CisJCQl1MzIgYWRqID0gIGt2bV92Y3B1X3RyYXBfaWxfaXMzMmJpdCh2Y3B1KSA/IDQgOiAyOworCQkJKnZjcHVfcGModmNwdSkgLT0gYWRqOworCQl9CisKKwkJa3ZtX2luamVjdF92YWJ0KHZjcHUpOworCQlyZXR1cm4gMTsKKwl9CisKKwlleGNlcHRpb25faW5kZXggPSBBUk1fRVhDRVBUSU9OX0NPREUoZXhjZXB0aW9uX2luZGV4KTsKKwogCXN3aXRjaCAoZXhjZXB0aW9uX2luZGV4KSB7CiAJY2FzZSBBUk1fRVhDRVBUSU9OX0lSUToKIAkJcmV0dXJuIDE7CkBAIC0xNjAsNiArMTUyLDkgQEAKIAkJZXhpdF9oYW5kbGVyID0ga3ZtX2dldF9leGl0X2hhbmRsZXIodmNwdSk7CiAKIAkJcmV0dXJuIGV4aXRfaGFuZGxlcih2Y3B1LCBydW4pOworCWNhc2UgQVJNX0VYQ0VQVElPTl9EQVRBX0FCT1JUOgorCQlrdm1faW5qZWN0X3ZhYnQodmNwdSk7CisJCXJldHVybiAxOwogCWRlZmF1bHQ6CiAJCWt2bV9wcl91bmltcGwoIlVuc3VwcG9ydGVkIGV4Y2VwdGlvbiB0eXBlOiAlZCIsCiAJCQkgICAgICBleGNlcHRpb25faW5kZXgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL2h5cC9NYWtlZmlsZSBiL2FyY2gvYXJtL2t2bS9oeXAvTWFrZWZpbGUKaW5kZXggOGRmYTVmNy4uMzAyM2JiNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL2h5cC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9rdm0vaHlwL01ha2VmaWxlCkBAIC01LDYgKzUsNyBAQAogS1ZNPS4uLy4uLy4uLy4uL3ZpcnQva3ZtCiAKIG9iai0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoS1ZNKS9hcm0vaHlwL3ZnaWMtdjItc3Iubworb2JqLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChLVk0pL2FybS9oeXAvdmdpYy12My1zci5vCiBvYmotJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSAkKEtWTSkvYXJtL2h5cC90aW1lci1zci5vCiAKIG9iai0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9IHRsYi5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vaHlwL2VudHJ5LlMgYi9hcmNoL2FybS9rdm0vaHlwL2VudHJ5LlMKaW5kZXggMjFjMjM4OC4uNjA3ODNmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL2h5cC9lbnRyeS5TCisrKyBiL2FyY2gvYXJtL2t2bS9oeXAvZW50cnkuUwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20va3ZtX2FybS5oPgorI2luY2x1ZGUgPGFzbS9rdm1fYXNtLmg+CiAKIAkuYXJjaF9leHRlbnNpb24gICAgIHZpcnQKIApAQCAtNjMsNiArNjQsMzYgQEAKIAlsZHIJbHIsIFtyMCwgIzRdCiAKIAltb3YJcjAsIHIxCisJbXJzCXIxLCBTUFNSCisJbXJzCXIyLCBFTFJfaHlwCisJbXJjCXAxNSwgNCwgcjMsIGM1LCBjMiwgMAlAIEhTUgorCisJLyoKKwkgKiBGb3JjZSBsb2FkcyBhbmQgc3RvcmVzIHRvIGNvbXBsZXRlIGJlZm9yZSB1bm1hc2tpbmcgYWJvcnRzCisJICogYW5kIGZvcmNpbmcgdGhlIGRlbGl2ZXJ5IG9mIHRoZSBleGNlcHRpb24uIFRoaXMgZ2l2ZXMgdXMgYQorCSAqIHNpbmdsZSBpbnN0cnVjdGlvbiB3aW5kb3csIHdoaWNoIHRoZSBoYW5kbGVyIHdpbGwgdHJ5IHRvCisJICogbWF0Y2guCisJICovCisJZHNiCXN5CisJY3BzaWUJYQorCisJLmdsb2JhbAlhYm9ydF9ndWVzdF9leGl0X3N0YXJ0CithYm9ydF9ndWVzdF9leGl0X3N0YXJ0OgorCisJaXNiCisKKwkuZ2xvYmFsCWFib3J0X2d1ZXN0X2V4aXRfZW5kCithYm9ydF9ndWVzdF9leGl0X2VuZDoKKworCS8qCisJICogSWYgd2UgdG9vayBhbiBhYm9ydCwgcjBbMzFdIHdpbGwgYmUgc2V0LCBhbmQgY21wIHdpbGwgc2V0CisJICogdGhlIE4gYml0IGluIFBTVEFURS4KKwkgKi8KKwljbXAJcjAsICMwCisJbXNybWkJU1BTUl9jeHNmLCByMQorCW1zcm1pCUVMUl9oeXAsIHIyCisJbWNybWkJcDE1LCA0LCByMywgYzUsIGMyLCAwCUAgSFNSCisKIAlieAlscgogRU5EUFJPQyhfX2d1ZXN0X2V4aXQpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2t2bS9oeXAvaHlwLWVudHJ5LlMgYi9hcmNoL2FybS9rdm0vaHlwL2h5cC1lbnRyeS5TCmluZGV4IDc4MDkxMzguLjk2YmViNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9oeXAvaHlwLWVudHJ5LlMKKysrIGIvYXJjaC9hcm0va3ZtL2h5cC9oeXAtZW50cnkuUwpAQCAtODEsNyArODEsNiBAQAogCWludmFsaWRfdmVjdG9yCWh5cF91bmRlZglBUk1fRVhDRVBUSU9OX1VOREVGSU5FRAogCWludmFsaWRfdmVjdG9yCWh5cF9zdmMJCUFSTV9FWENFUFRJT05fU09GVFdBUkUKIAlpbnZhbGlkX3ZlY3RvcgloeXBfcGFidAlBUk1fRVhDRVBUSU9OX1BSRUZfQUJPUlQKLQlpbnZhbGlkX3ZlY3RvcgloeXBfZGFidAlBUk1fRVhDRVBUSU9OX0RBVEFfQUJPUlQKIAlpbnZhbGlkX3ZlY3RvcgloeXBfZmlxCQlBUk1fRVhDRVBUSU9OX0ZJUQogCiBFTlRSWShfX2h5cF9kb19wYW5pYykKQEAgLTE2NCw2ICsxNjMsMjEgQEAKIAlsb2FkX3ZjcHUgcjAJCQlAIExvYWQgVkNQVSBwb2ludGVyIHRvIHIwCiAJYglfX2d1ZXN0X2V4aXQKIAoraHlwX2RhYnQ6CisJcHVzaAl7cjAsIHIxfQorCW1ycwlyMCwgRUxSX2h5cAorCWxkcglyMSwgPWFib3J0X2d1ZXN0X2V4aXRfc3RhcnQKK1RIVU1CKAlhZGQJcjEsIHIxLCAjMSkKKwljbXAJcjAsIHIxCisJbGRybmUJcjEsID1hYm9ydF9ndWVzdF9leGl0X2VuZAorVEhVTUIoCWFkZG5lCXIxLCByMSwgIzEpCisJY21wbmUJcjAsIHIxCisJcG9wCXtyMCwgcjF9CisJYm5lCV9faHlwX3BhbmljCisKKwlvcnIJcjAsIHIwLCAjKDEgPDwgQVJNX0VYSVRfV0lUSF9BQk9SVF9CSVQpCisJZXJldAorCiAJLmx0b3JnCiAKIAkucG9wc2VjdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL2h5cC9zd2l0Y2guYyBiL2FyY2gvYXJtL2t2bS9oeXAvc3dpdGNoLmMKaW5kZXggYjEzY2FhOS4uOTI2NzhiNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL2h5cC9zd2l0Y2guYworKysgYi9hcmNoL2FybS9rdm0vaHlwL3N3aXRjaC5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAKICNpbmNsdWRlIDxhc20va3ZtX2FzbS5oPgogI2luY2x1ZGUgPGFzbS9rdm1faHlwLmg+CkBAIC01NCw2ICs1NSwxNSBAQAogewogCXUzMiB2YWw7CiAKKwkvKgorCSAqIElmIHdlIHBlbmRlZCBhIHZpcnR1YWwgYWJvcnQsIHByZXNlcnZlIGl0IHVudGlsIGl0IGdldHMKKwkgKiBjbGVhcmVkLiBTZWUgQjEuOS45IChWaXJ0dWFsIEFib3J0IGV4Y2VwdGlvbikgZm9yIGRldGFpbHMsCisJICogYnV0IHRoZSBjcnVjaWFsIGJpdCBpcyB0aGUgemVyb2luZyBvZiBIQ1IuVkEgaW4gdGhlCisJICogcHNldWRvY29kZS4KKwkgKi8KKwlpZiAodmNwdS0+YXJjaC5oY3IgJiBIQ1JfVkEpCisJCXZjcHUtPmFyY2guaGNyID0gcmVhZF9zeXNyZWcoSENSKTsKKwogCXdyaXRlX3N5c3JlZygwLCBIQ1IpOwogCXdyaXRlX3N5c3JlZygwLCBIU1RSKTsKIAl2YWwgPSByZWFkX3N5c3JlZyhIRENSKTsKQEAgLTc0LDE0ICs4NCwyMSBAQAogCXdyaXRlX3N5c3JlZyhyZWFkX3N5c3JlZyhNSURSKSwgVlBJRFIpOwogfQogCisKIHN0YXRpYyB2b2lkIF9faHlwX3RleHQgX192Z2ljX3NhdmVfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCV9fdmdpY192Ml9zYXZlX3N0YXRlKHZjcHUpOworCWlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZrdm1fdmdpY19nbG9iYWxfc3RhdGUuZ2ljdjNfY3B1aWYpKQorCQlfX3ZnaWNfdjNfc2F2ZV9zdGF0ZSh2Y3B1KTsKKwllbHNlCisJCV9fdmdpY192Ml9zYXZlX3N0YXRlKHZjcHUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2h5cF90ZXh0IF9fdmdpY19yZXN0b3JlX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlfX3ZnaWNfdjJfcmVzdG9yZV9zdGF0ZSh2Y3B1KTsKKwlpZiAoc3RhdGljX2JyYW5jaF91bmxpa2VseSgma3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLmdpY3YzX2NwdWlmKSkKKwkJX192Z2ljX3YzX3Jlc3RvcmVfc3RhdGUodmNwdSk7CisJZWxzZQorCQlfX3ZnaWNfdjJfcmVzdG9yZV9zdGF0ZSh2Y3B1KTsKIH0KIAogc3RhdGljIGJvb2wgX19oeXBfdGV4dCBfX3BvcHVsYXRlX2ZhdWx0X2luZm8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMTM0LDcgKzE1MSw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgX19oeXBfdGV4dCBfX2d1ZXN0X3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitpbnQgX19oeXBfdGV4dCBfX2t2bV92Y3B1X3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV9jcHVfY29udGV4dCAqaG9zdF9jdHh0OwogCXN0cnVjdCBrdm1fY3B1X2NvbnRleHQgKmd1ZXN0X2N0eHQ7CkBAIC0xOTEsOCArMjA4LDYgQEAKIAlyZXR1cm4gZXhpdF9jb2RlOwogfQogCi1fX2FsaWFzKF9fZ3Vlc3RfcnVuKSBpbnQgX19rdm1fdmNwdV9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKLQogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBfX2h5cF9wYW5pY19zdHJpbmdbXSA9IHsKIAlbQVJNX0VYQ0VQVElPTl9SRVNFVF0gICAgICA9ICJcbkhZUCBwYW5pYzogUlNUICAgUEM6JTA4eCBDUFNSOiUwOHgiLAogCVtBUk1fRVhDRVBUSU9OX1VOREVGSU5FRF0gID0gIlxuSFlQIHBhbmljOiBVTkRFRiBQQzolMDh4IENQU1I6JTA4eCIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vaHlwL3RsYi5jIGIvYXJjaC9hcm0va3ZtL2h5cC90bGIuYwppbmRleCBhMjYzNjAwLi43Mjk2NTI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rdm0vaHlwL3RsYi5jCisrKyBiL2FyY2gvYXJtL2t2bS9oeXAvdGxiLmMKQEAgLTM0LDcgKzM0LDcgQEAKICAqIEFzIHY3IGRvZXMgbm90IHN1cHBvcnQgZmx1c2hpbmcgcGVyIElQQSwganVzdCBudWtlIHRoZSB3aG9sZSBUTEIKICAqIGluc3RlYWQsIGlnbm9yaW5nIHRoZSBpcGEgdmFsdWUuCiAgKi8KLXN0YXRpYyB2b2lkIF9faHlwX3RleHQgX190bGJfZmx1c2hfdm1pZChzdHJ1Y3Qga3ZtICprdm0pCit2b2lkIF9faHlwX3RleHQgX19rdm1fdGxiX2ZsdXNoX3ZtaWQoc3RydWN0IGt2bSAqa3ZtKQogewogCWRzYihpc2hzdCk7CiAKQEAgLTUwLDIxICs1MCwxNCBAQAogCXdyaXRlX3N5c3JlZygwLCBWVFRCUik7CiB9CiAKLV9fYWxpYXMoX190bGJfZmx1c2hfdm1pZCkgdm9pZCBfX2t2bV90bGJfZmx1c2hfdm1pZChzdHJ1Y3Qga3ZtICprdm0pOwotCi1zdGF0aWMgdm9pZCBfX2h5cF90ZXh0IF9fdGxiX2ZsdXNoX3ZtaWRfaXBhKHN0cnVjdCBrdm0gKmt2bSwgcGh5c19hZGRyX3QgaXBhKQordm9pZCBfX2h5cF90ZXh0IF9fa3ZtX3RsYl9mbHVzaF92bWlkX2lwYShzdHJ1Y3Qga3ZtICprdm0sIHBoeXNfYWRkcl90IGlwYSkKIHsKLQlfX3RsYl9mbHVzaF92bWlkKGt2bSk7CisJX19rdm1fdGxiX2ZsdXNoX3ZtaWQoa3ZtKTsKIH0KIAotX19hbGlhcyhfX3RsYl9mbHVzaF92bWlkX2lwYSkgdm9pZCBfX2t2bV90bGJfZmx1c2hfdm1pZF9pcGEoc3RydWN0IGt2bSAqa3ZtLAotCQkJCQkJCSAgICBwaHlzX2FkZHJfdCBpcGEpOwotCi1zdGF0aWMgdm9pZCBfX2h5cF90ZXh0IF9fdGxiX2ZsdXNoX3ZtX2NvbnRleHQodm9pZCkKK3ZvaWQgX19oeXBfdGV4dCBfX2t2bV9mbHVzaF92bV9jb250ZXh0KHZvaWQpCiB7CiAJd3JpdGVfc3lzcmVnKDAsIFRMQklBTExOU05ISVMpOwogCXdyaXRlX3N5c3JlZygwLCBJQ0lBTExVSVMpOwogCWRzYihpc2gpOwogfQotCi1fX2FsaWFzKF9fdGxiX2ZsdXNoX3ZtX2NvbnRleHQpIHZvaWQgX19rdm1fZmx1c2hfdm1fY29udGV4dCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2t2bS9tbWlvLmMgYi9hcmNoL2FybS9rdm0vbW1pby5jCmluZGV4IDEwZjgwYTYuLmI2ZTcxNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9tbWlvLmMKKysrIGIvYXJjaC9hcm0va3ZtL21taW8uYwpAQCAtMTI2LDEyICsxMjYsNiBAQAogCWludCBhY2Nlc3Nfc2l6ZTsKIAlib29sIHNpZ25fZXh0ZW5kOwogCi0JaWYgKGt2bV92Y3B1X2RhYnRfaXNleHRhYnQodmNwdSkpIHsKLQkJLyogY2FjaGUgb3BlcmF0aW9uIG9uIEkvTyBhZGRyLCB0ZWxsIGd1ZXN0IHVuc3VwcG9ydGVkICovCi0JCWt2bV9pbmplY3RfZGFidCh2Y3B1LCBrdm1fdmNwdV9nZXRfaGZhcih2Y3B1KSk7Ci0JCXJldHVybiAxOwotCX0KLQogCWlmIChrdm1fdmNwdV9kYWJ0X2lzczF0dyh2Y3B1KSkgewogCQkvKiBwYWdlIHRhYmxlIGFjY2Vzc2VzIElPIG1lbTogdGVsbCBndWVzdCB0byBmaXggaXRzIFRUQlIgKi8KIAkJa3ZtX2luamVjdF9kYWJ0KHZjcHUsIGt2bV92Y3B1X2dldF9oZmFyKHZjcHUpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2t2bS9tbXUuYyBiL2FyY2gvYXJtL2t2bS9tbXUuYwppbmRleCAyOWQwYjIzLi5hNTI2NWVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rdm0vbW11LmMKKysrIGIvYXJjaC9hcm0va3ZtL21tdS5jCkBAIC03NDQsNyArNzQ0LDYgQEAKIAlpZiAoIXBnZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlrdm1fY2xlYW5fcGdkKHBnZCk7CiAJa3ZtLT5hcmNoLnBnZCA9IHBnZDsKIAlyZXR1cm4gMDsKIH0KQEAgLTkzNiw3ICs5MzUsNiBAQAogCQlpZiAoIWNhY2hlKQogCQkJcmV0dXJuIDA7IC8qIGlnbm9yZSBjYWxscyBmcm9tIGt2bV9zZXRfc3B0ZV9odmEgKi8KIAkJcHRlID0gbW11X21lbW9yeV9jYWNoZV9hbGxvYyhjYWNoZSk7Ci0JCWt2bV9jbGVhbl9wdGUocHRlKTsKIAkJcG1kX3BvcHVsYXRlX2tlcm5lbChOVUxMLCBwbWQsIHB0ZSk7CiAJCWdldF9wYWdlKHZpcnRfdG9fcGFnZShwbWQpKTsKIAl9CkBAIC0xNDM0LDYgKzE0MzIsMTEgQEAKIAlpbnQgcmV0LCBpZHg7CiAKIAlpc19pYWJ0ID0ga3ZtX3ZjcHVfdHJhcF9pc19pYWJ0KHZjcHUpOworCWlmICh1bmxpa2VseSghaXNfaWFidCAmJiBrdm1fdmNwdV9kYWJ0X2lzZXh0YWJ0KHZjcHUpKSkgeworCQlrdm1faW5qZWN0X3ZhYnQodmNwdSk7CisJCXJldHVybiAxOworCX0KKwogCWZhdWx0X2lwYSA9IGt2bV92Y3B1X2dldF9mYXVsdF9pcGEodmNwdSk7CiAKIAl0cmFjZV9rdm1fZ3Vlc3RfZmF1bHQoKnZjcHVfcGModmNwdSksIGt2bV92Y3B1X2dldF9oc3IodmNwdSksCkBAIC0xNzE0LDcgKzE3MTcsOCBAQAogCQkga2Vybl9oeXBfdmEoUEFHRV9PRkZTRVQpLCBrZXJuX2h5cF92YSh+MFVMKSk7CiAKIAlpZiAoaHlwX2lkbWFwX3N0YXJ0ID49IGtlcm5faHlwX3ZhKFBBR0VfT0ZGU0VUKSAmJgotCSAgICBoeXBfaWRtYXBfc3RhcnQgPCAga2Vybl9oeXBfdmEofjBVTCkpIHsKKwkgICAgaHlwX2lkbWFwX3N0YXJ0IDwgIGtlcm5faHlwX3ZhKH4wVUwpICYmCisJICAgIGh5cF9pZG1hcF9zdGFydCAhPSAodW5zaWduZWQgbG9uZylfX2h5cF9pZG1hcF90ZXh0X3N0YXJ0KSB7CiAJCS8qCiAJCSAqIFRoZSBpZG1hcCBwYWdlIGlzIGludGVyc2VjdGluZyB3aXRoIHRoZSBWQSBzcGFjZSwKIAkJICogaXQgaXMgbm90IHNhZmUgdG8gY29udGludWUgZnVydGhlci4KQEAgLTE4OTMsNiArMTg5Nyw3IEBACiAKIHZvaWQga3ZtX2FyY2hfZmx1c2hfc2hhZG93X2FsbChzdHJ1Y3Qga3ZtICprdm0pCiB7CisJa3ZtX2ZyZWVfc3RhZ2UyX3BnZChrdm0pOwogfQogCiB2b2lkIGt2bV9hcmNoX2ZsdXNoX3NoYWRvd19tZW1zbG90KHN0cnVjdCBrdm0gKmt2bSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9kZWxheS5jIGIvYXJjaC9hcm0vbGliL2RlbGF5LmMKaW5kZXggODA0NDU5MS4uMmNlZjExOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2RlbGF5LmMKKysrIGIvYXJjaC9hcm0vbGliL2RlbGF5LmMKQEAgLTI5LDcgKzI5LDcgQEAKIC8qCiAgKiBEZWZhdWx0IHRvIHRoZSBsb29wLWJhc2VkIGRlbGF5IGltcGxlbWVudGF0aW9uLgogICovCi1zdHJ1Y3QgYXJtX2RlbGF5X29wcyBhcm1fZGVsYXlfb3BzID0geworc3RydWN0IGFybV9kZWxheV9vcHMgYXJtX2RlbGF5X29wcyBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLmRlbGF5CQk9IF9fbG9vcF9kZWxheSwKIAkuY29uc3RfdWRlbGF5CT0gX19sb29wX2NvbnN0X3VkZWxheSwKIAkudWRlbGF5CQk9IF9fbG9vcF91ZGVsYXksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9LY29uZmlnCmluZGV4IDUyMDQzOTUuLjg0MWU5MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9LY29uZmlnCkBAIC01NSw3ICs1NSw2IEBACiAJc2VsZWN0IEFUTUVMX1NUCiAJc2VsZWN0IENQVV9BUk05MjBUCiAJc2VsZWN0IEhBVkVfQVQ5MV9VU0JfQ0xLCi0Jc2VsZWN0IE1JR0hUX0hBVkVfUENJCiAJc2VsZWN0IFBJTkNUUkxfQVQ5MQogCXNlbGVjdCBTT0NfU0FNX1Y0X1Y1CiAJc2VsZWN0IFNSQU0gaWYgUE0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXh4aWEvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtYXh4aWEvS2NvbmZpZwppbmRleCA2YzZkNWU3Li5mZTYyN2NiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF4eGlhL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1heHhpYS9LY29uZmlnCkBAIC03LDggKzcsNiBAQAogCXNlbGVjdCBBUk1fVElNRVJfU1A4MDQKIAlzZWxlY3QgSEFWRV9BUk1fQVJDSF9USU1FUgogCXNlbGVjdCBNRkRfU1lTQ09OCi0Jc2VsZWN0IE1JR0hUX0hBVkVfUENJCi0Jc2VsZWN0IFBDSV9ET01BSU5TIGlmIFBDSQogCXNlbGVjdCBaT05FX0RNQQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTFNJIEF4eGlhIGRldmljZXMuCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWJjbS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1iY20vS2NvbmZpZwppbmRleCA2YTYzMDJkLi5hMGU2NmQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWJjbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtYmNtL0tjb25maWcKQEAgLTE1LDcgKzE1LDYgQEAKIAlzZWxlY3QgSEFWRV9BUk1fU0NVIGlmIFNNUAogCXNlbGVjdCBIQVZFX0FSTV9UV0QgaWYgU01QCiAJc2VsZWN0IEFSTV9HTE9CQUxfVElNRVIKLQlzZWxlY3QgQ09NTU9OX0NMS19JUFJPQwogCXNlbGVjdCBDTEtTUkNfTU1JTwogCXNlbGVjdCBHUElPTElCCiAJc2VsZWN0IEFSTV9BTUJBCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L01ha2VmaWxlLmJvb3QgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L01ha2VmaWxlLmJvb3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9NYWtlZmlsZS5ib290CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYm9hcmQtYXV0Y3B1MTIuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYm9hcmQtYXV0Y3B1MTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzZDdkMS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2JvYXJkLWF1dGNwdTEyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2F1dGNwdTEyLmMKLSAqCi0gKiAoYykgMjAwMSBUaG9tYXMgR2xlaXhuZXIsIGF1dHJvbml4IGF1dG9tYXRpb24gPGdsZWl4bmVyQGF1dHJvbml4LmRlPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGxhdC1yYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9uYW5kLWdwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0jaW5jbHVkZSAiZGV2aWNlcy5oIgotCi0vKiBOT1IgZmxhc2ggKi8KLSNkZWZpbmUgQVVUQ1BVMTJfRkxBU0hfQkFTRQkoQ1MwX1BIWVNfQkFTRSkKLQotLyogQm9hcmQgc3BlY2lmaWMgaGFyZHdhcmUgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgQVVUQ1BVMTJfQ0hBUl9MQ0RfQkFTRQkoQ1MxX1BIWVNfQkFTRSArIDB4MDAwMDAwMDApCi0jZGVmaW5lIEFVVENQVTEyX0NTQVVYMV9CQVNFCShDUzFfUEhZU19CQVNFICsgMHgwNDAwMDAwMCkKLSNkZWZpbmUgQVVUQ1BVMTJfQ0FOX0JBU0UJKENTMV9QSFlTX0JBU0UgKyAweDA4MDAwMDAwKQotI2RlZmluZSBBVVRDUFUxMl9UT1VDSF9CQVNFCShDUzFfUEhZU19CQVNFICsgMHgwYTAwMDAwMCkKLSNkZWZpbmUgQVVUQ1BVMTJfSU9fQkFTRQkoQ1MxX1BIWVNfQkFTRSArIDB4MGMwMDAwMDApCi0jZGVmaW5lIEFVVENQVTEyX0xQVF9CQVNFCShDUzFfUEhZU19CQVNFICsgMHgwZTAwMDAwMCkKLQotLyogTlZSQU0gKi8KLSNkZWZpbmUgQVVUQ1BVMTJfTlZSQU1fQkFTRQkoQ1MxX1BIWVNfQkFTRSArIDB4MDIwMDAwMDApCi0KLS8qIFNtYXJ0TWVkaWEgZmxhc2ggKi8KLSNkZWZpbmUgQVVUQ1BVMTJfU01DX0JBU0UJKENTMV9QSFlTX0JBU0UgKyAweDA2MDAwMDAwKQotI2RlZmluZSBBVVRDUFUxMl9TTUNfU0VMX0JBU0UJKEFVVENQVTEyX1NNQ19CQVNFICsgMHgxMCkKLQotLyogRXRoZXJuZXQgKi8KLSNkZWZpbmUgQVVUQ1BVMTJfQ1M4OTAwX0JBU0UJKENTMl9QSFlTX0JBU0UgKyAweDMwMCkKLSNkZWZpbmUgQVVUQ1BVMTJfQ1M4OTAwX0lSUQkoSVJRX0VJTlQzKQotCi0vKiBOQU5EIGZsYXNoICovCi0jZGVmaW5lIEFVVENQVTEyX01NR1BJT19CQVNFCShDTFBTNzExWF9OUl9HUElPKQotI2RlZmluZSBBVVRDUFUxMl9TTUNfTkNFCShBVVRDUFUxMl9NTUdQSU9fQkFTRSArIDApIC8qIEJpdCAwICovCi0jZGVmaW5lIEFVVENQVTEyX1NNQ19SRFkJQ0xQUzcxMVhfR1BJTygxLCAyKQotI2RlZmluZSBBVVRDUFUxMl9TTUNfQUxFCUNMUFM3MTFYX0dQSU8oMSwgMykKLSNkZWZpbmUgQVVUQ1BVMTJfU01DX0NMRQlDTFBTNzExWF9HUElPKDEsIDQpCi0KLS8qIExDRCBjb250cmFzdCBkaWdpdGFsIHBvdGVudGlvbWV0ZXIgKi8KLSNkZWZpbmUgQVVUQ1BVMTJfRFBPVF9DUwlDTFBTNzExWF9HUElPKDQsIDApCi0jZGVmaW5lIEFVVENQVTEyX0RQT1RfQ0xLCUNMUFM3MTFYX0dQSU8oNCwgMSkKLSNkZWZpbmUgQVVUQ1BVMTJfRFBPVF9VRAlDTFBTNzExWF9HUElPKDQsIDIpCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXV0Y3B1MTJfY3M4OTAwX3Jlc291cmNlW10gX19pbml0ZGF0YSA9IHsKLQlERUZJTkVfUkVTX01FTShBVVRDUFUxMl9DUzg5MDBfQkFTRSwgU1pfMUspLAotCURFRklORV9SRVNfSVJRKEFVVENQVTEyX0NTODkwMF9JUlEpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhdXRjcHUxMl9uYW5kX3Jlc291cmNlW10gX19pbml0ZGF0YSA9IHsKLQlERUZJTkVfUkVTX01FTShBVVRDUFUxMl9TTUNfQkFTRSwgU1pfMTYpLAotfTsKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGF1dGNwdTEyX25hbmRfcGFydHNbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLm5hbWUJPSAiRmxhc2ggcGFydGl0aW9uIDEiLAotCQkub2Zmc2V0CT0gMCwKLQkJLnNpemUJPSBTWl84TSwKLQl9LAotCXsKLQkJLm5hbWUJPSAiRmxhc2ggcGFydGl0aW9uIDIiLAotCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfQVBQRU5ELAotCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBhdXRjcHUxMl9hZGp1c3RfcGFydHMoc3RydWN0IGdwaW9fbmFuZF9wbGF0ZGF0YSAqcGRhdGEsCi0JCQkJCSBzaXplX3Qgc3opCi17Ci0Jc3dpdGNoIChzeikgewotCWNhc2UgU1pfMTZNOgotCWNhc2UgU1pfMzJNOgotCQlicmVhazsKLQljYXNlIFNaXzY0TToKLQljYXNlIFNaXzEyOE06Ci0JCXBkYXRhLT5wYXJ0c1swXS5zaXplID0gU1pfMTZNOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl93YXJuKCJVbnN1cHBvcnRlZCBTbWFydE1lZGlhIGRldmljZSBzaXplICV1XG4iLCBzeik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBncGlvX25hbmRfcGxhdGRhdGEgYXV0Y3B1MTJfbmFuZF9wZGF0YSBfX2luaXRkYXRhID0gewotCS5ncGlvX3JkeQk9IEFVVENQVTEyX1NNQ19SRFksCi0JLmdwaW9fbmNlCT0gQVVUQ1BVMTJfU01DX05DRSwKLQkuZ3Bpb19hbGUJPSBBVVRDUFUxMl9TTUNfQUxFLAotCS5ncGlvX2NsZQk9IEFVVENQVTEyX1NNQ19DTEUsCi0JLmdwaW9fbndwCT0gLTEsCi0JLmNoaXBfZGVsYXkJPSAyMCwKLQkucGFydHMJCT0gYXV0Y3B1MTJfbmFuZF9wYXJ0cywKLQkubnVtX3BhcnRzCT0gQVJSQVlfU0laRShhdXRjcHUxMl9uYW5kX3BhcnRzKSwKLQkuYWRqdXN0X3BhcnRzCT0gYXV0Y3B1MTJfYWRqdXN0X3BhcnRzLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXV0Y3B1MTJfbmFuZF9wZGV2IF9faW5pdGRhdGEgPSB7Ci0JLm5hbWUJCT0gImdwaW8tbmFuZCIsCi0JLmlkCQk9IC0xLAotCS5yZXNvdXJjZQk9IGF1dGNwdTEyX25hbmRfcmVzb3VyY2UsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1dGNwdTEyX25hbmRfcmVzb3VyY2UpLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZhdXRjcHUxMl9uYW5kX3BkYXRhLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF1dGNwdTEyX21tZ3Bpb19yZXNvdXJjZVtdIF9faW5pdGRhdGEgPSB7Ci0JREVGSU5FX1JFU19NRU1fTkFNRUQoQVVUQ1BVMTJfU01DX1NFTF9CQVNFLCBTWl8xLCAiZGF0IiksCi19OwotCi1zdGF0aWMgc3RydWN0IGJncGlvX3BkYXRhIGF1dGNwdTEyX21tZ3Bpb19wZGF0YSBfX2luaXRkYXRhID0gewotCS5iYXNlCT0gQVVUQ1BVMTJfTU1HUElPX0JBU0UsCi0JLm5ncGlvCT0gOCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF1dGNwdTEyX21tZ3Bpb19wZGV2IF9faW5pdGRhdGEgPSB7Ci0JLm5hbWUJCT0gImJhc2ljLW1taW8tZ3BpbyIsCi0JLmlkCQk9IC0xLAotCS5yZXNvdXJjZQk9IGF1dGNwdTEyX21tZ3Bpb19yZXNvdXJjZSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoYXV0Y3B1MTJfbW1ncGlvX3Jlc291cmNlKSwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmYXV0Y3B1MTJfbW1ncGlvX3BkYXRhLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGdwaW8gY29uc3QgYXV0Y3B1MTJfZ3Bpb3NbXSBfX2luaXRjb25zdCA9IHsKLQl7IEFVVENQVTEyX0RQT1RfQ1MsCUdQSU9GX09VVF9JTklUX0hJR0gsCSJEUE9UIENTIiB9LAotCXsgQVVUQ1BVMTJfRFBPVF9DTEssCUdQSU9GX09VVF9JTklUX0xPVywJIkRQT1QgQ0xLIiB9LAotCXsgQVVUQ1BVMTJfRFBPVF9VRCwJR1BJT0ZfT1VUX0lOSVRfTE9XLAkiRFBPVCBVRCIgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBhdXRjcHUxMl9mbGFzaF9wYXJ0aXRpb25zW10gPSB7Ci0JewotCQkubmFtZQk9ICJOT1IuMCIsCi0JCS5vZmZzZXQJPSAwLAotCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGF1dGNwdTEyX2ZsYXNoX3BkYXRhID0gewotCS53aWR0aAkJPSA0LAotCS5wYXJ0cwkJPSBhdXRjcHUxMl9mbGFzaF9wYXJ0aXRpb25zLAotCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoYXV0Y3B1MTJfZmxhc2hfcGFydGl0aW9ucyksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF1dGNwdTEyX2ZsYXNoX3Jlc291cmNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JREVGSU5FX1JFU19NRU0oQVVUQ1BVMTJfRkxBU0hfQkFTRSwgU1pfOE0pLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXV0Y3B1MTJfZmxhc2hfcGRldiBfX2luaXRkYXRhID0gewotCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKLQkuaWQJCT0gMCwKLQkucmVzb3VyY2UJPSBhdXRjcHUxMl9mbGFzaF9yZXNvdXJjZXMsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1dGNwdTEyX2ZsYXNoX3Jlc291cmNlcyksCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmF1dGNwdTEyX2ZsYXNoX3BkYXRhLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGF1dGNwdTEyX252cmFtX3Jlc291cmNlW10gX19pbml0ZGF0YSA9IHsKLQlERUZJTkVfUkVTX01FTShBVVRDUFUxMl9OVlJBTV9CQVNFLCAwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGRhdGFfbXRkX3JhbSBhdXRjcHUxMl9udnJhbV9wZGF0YSA9IHsKLQkuYmFua3dpZHRoCT0gNCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGF1dGNwdTEyX252cmFtX3BkZXYgX19pbml0ZGF0YSA9IHsKLQkubmFtZQkJPSAibXRkLXJhbSIsCi0JLmlkCQk9IDAsCi0JLnJlc291cmNlCT0gYXV0Y3B1MTJfbnZyYW1fcmVzb3VyY2UsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGF1dGNwdTEyX252cmFtX3Jlc291cmNlKSwKLQkuZGV2CQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmYXV0Y3B1MTJfbnZyYW1fcGRhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBhdXRjcHUxMl9udnJhbV9pbml0KHZvaWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpudnJhbTsKLQl1bnNpZ25lZCBpbnQgc2F2ZVsyXTsKLQlyZXNvdXJjZV9zaXplX3QgbnZyYW1fc2l6ZSA9IFNaXzEyOEs7Ci0KLQkvKgotCSAqIENoZWNrIGZvciAzMksvMTI4SwotCSAqIFJlYWQgb2ZzIDBLCi0JICogUmVhZCBvZnMgNjRLCi0JICogV3JpdGUgY29tcGxlbWVudCB0byBvZnMgNjRLCi0JICogUmVhZCBhbmQgY2hlY2sgcmVzdWx0IG9uIG9mcyAwSwotCSAqIFJlc3RvcmUgY29udGVudHMKLQkgKi8KLQludnJhbSA9IGlvcmVtYXAoYXV0Y3B1MTJfbnZyYW1fcmVzb3VyY2VbMF0uc3RhcnQsIFNaXzEyOEspOwotCWlmIChudnJhbSkgewotCQlzYXZlWzBdID0gcmVhZGwobnZyYW0gKyAwKTsKLQkJc2F2ZVsxXSA9IHJlYWRsKG52cmFtICsgU1pfNjRLKTsKLQkJd3JpdGVsKH5zYXZlWzBdLCBudnJhbSArIFNaXzY0Syk7Ci0JCWlmIChyZWFkbChudnJhbSArIDApICE9IHNhdmVbMF0pIHsKLQkJCXdyaXRlbChzYXZlWzBdLCBudnJhbSArIDApOwotCQkJbnZyYW1fc2l6ZSA9IFNaXzMySzsKLQkJfSBlbHNlCi0JCQl3cml0ZWwoc2F2ZVsxXSwgbnZyYW0gKyBTWl82NEspOwotCQlpb3VubWFwKG52cmFtKTsKLQotCQlhdXRjcHUxMl9udnJhbV9yZXNvdXJjZVswXS5lbmQgPQotCQkJYXV0Y3B1MTJfbnZyYW1fcmVzb3VyY2VbMF0uc3RhcnQgKyBudnJhbV9zaXplIC0gMTsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdXRjcHUxMl9udnJhbV9wZGV2KTsKLQl9IGVsc2UKLQkJcHJfZXJyKCJGYWlsZWQgdG8gcmVtYXAgTlZSQU0gcmVzb3VyY2VcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXV0Y3B1MTJfaW5pdCh2b2lkKQotewotCWNscHM3MTF4X2RldmljZXNfaW5pdCgpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmYXV0Y3B1MTJfZmxhc2hfcGRldik7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgidmlkZW8tY2xwczcxMXgiLCAwLCBOVUxMLCAwKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJjczg5eDAiLCAwLCBhdXRjcHUxMl9jczg5MDBfcmVzb3VyY2UsCi0JCQkJCUFSUkFZX1NJWkUoYXV0Y3B1MTJfY3M4OTAwX3Jlc291cmNlKSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdXRjcHUxMl9tbWdwaW9fcGRldik7Ci0JYXV0Y3B1MTJfbnZyYW1faW5pdCgpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXV0Y3B1MTJfaW5pdF9sYXRlKHZvaWQpCi17Ci0JZ3Bpb19yZXF1ZXN0X2FycmF5KGF1dGNwdTEyX2dwaW9zLCBBUlJBWV9TSVpFKGF1dGNwdTEyX2dwaW9zKSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZhdXRjcHUxMl9uYW5kX3BkZXYpOwotfQotCi1NQUNISU5FX1NUQVJUKEFVVENQVTEyLCAiYXV0cm9uaXggYXV0Y3B1MTIiKQotCS8qIE1haW50YWluZXI6IFRob21hcyBHbGVpeG5lciAqLwotCS5hdGFnX29mZnNldAk9IDB4MjAwMDAsCi0JLm1hcF9pbwkJPSBjbHBzNzExeF9tYXBfaW8sCi0JLmluaXRfaXJxCT0gY2xwczcxMXhfaW5pdF9pcnEsCi0JLmluaXRfdGltZQk9IGNscHM3MTF4X3RpbWVyX2luaXQsCi0JLmluaXRfbWFjaGluZQk9IGF1dGNwdTEyX2luaXQsCi0JLmluaXRfbGF0ZQk9IGF1dGNwdTEyX2luaXRfbGF0ZSwKLQkucmVzdGFydAk9IGNscHM3MTF4X3Jlc3RhcnQsCi1NQUNISU5FX0VORAotCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2JvYXJkLWNkYjg5NzEyLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2JvYXJkLWNkYjg5NzEyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MmFiZGIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9ib2FyZC1jZGI4OTcxMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiAgbGludXgvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jZGI4OTcxMi5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGxhdC1yYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotI2luY2x1ZGUgImRldmljZXMuaCIKLQotI2RlZmluZSBDREI4OTcxMl9DUzg5MDBfQkFTRQkoQ1MyX1BIWVNfQkFTRSArIDB4MzAwKQotI2RlZmluZSBDREI4OTcxMl9DUzg5MDBfSVJRCShJUlFfRUlOVDMpCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2RiODk3MTJfY3M4OTAwX3Jlc291cmNlW10gX19pbml0ZGF0YSA9IHsKLQlERUZJTkVfUkVTX01FTShDREI4OTcxMl9DUzg5MDBfQkFTRSwgU1pfMUspLAotCURFRklORV9SRVNfSVJRKENEQjg5NzEyX0NTODkwMF9JUlEpLAotfTsKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIGNkYjg5NzEyX2ZsYXNoX3BhcnRpdGlvbnNbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLm5hbWUJPSAiRmxhc2giLAotCQkub2Zmc2V0CT0gMCwKLQkJLnNpemUJPSBNVERQQVJUX1NJWl9GVUxMLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBjZGI4OTcxMl9mbGFzaF9wZGF0YSBfX2luaXRkYXRhID0gewotCS53aWR0aAkJPSA0LAotCS5wcm9iZV90eXBlCT0gIm1hcF9yb20iLAotCS5wYXJ0cwkJPSBjZGI4OTcxMl9mbGFzaF9wYXJ0aXRpb25zLAotCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoY2RiODk3MTJfZmxhc2hfcGFydGl0aW9ucyksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGNkYjg5NzEyX2ZsYXNoX3Jlc291cmNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JREVGSU5FX1JFU19NRU0oQ1MwX1BIWVNfQkFTRSwgU1pfOE0pLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY2RiODk3MTJfZmxhc2hfcGRldiBfX2luaXRkYXRhID0gewotCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKLQkuaWQJCT0gMCwKLQkucmVzb3VyY2UJPSBjZGI4OTcxMl9mbGFzaF9yZXNvdXJjZXMsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNkYjg5NzEyX2ZsYXNoX3Jlc291cmNlcyksCi0JLmRldgk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmY2RiODk3MTJfZmxhc2hfcGRhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBjZGI4OTcxMl9ib290cm9tX3BhcnRpdGlvbnNbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLm5hbWUJPSAiQm9vdFJPTSIsCi0JCS5vZmZzZXQJPSAwLAotCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGNkYjg5NzEyX2Jvb3Ryb21fcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkud2lkdGgJCT0gNCwKLQkucHJvYmVfdHlwZQk9ICJtYXBfcm9tIiwKLQkucGFydHMJCT0gY2RiODk3MTJfYm9vdHJvbV9wYXJ0aXRpb25zLAotCS5ucl9wYXJ0cwk9IEFSUkFZX1NJWkUoY2RiODk3MTJfYm9vdHJvbV9wYXJ0aXRpb25zKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2RiODk3MTJfYm9vdHJvbV9yZXNvdXJjZXNbXSBfX2luaXRkYXRhID0gewotCURFRklORV9SRVNfTkFNRUQoQ1M3X1BIWVNfQkFTRSwgU1pfMTI4LCAiQk9PVFJPTSIsIElPUkVTT1VSQ0VfTUVNIHwKLQkJCSBJT1JFU09VUkNFX1JFQURPTkxZKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNkYjg5NzEyX2Jvb3Ryb21fcGRldiBfX2luaXRkYXRhID0gewotCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKLQkuaWQJCT0gMSwKLQkucmVzb3VyY2UJPSBjZGI4OTcxMl9ib290cm9tX3Jlc291cmNlcywKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY2RiODk3MTJfYm9vdHJvbV9yZXNvdXJjZXMpLAotCS5kZXYJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmNkYjg5NzEyX2Jvb3Ryb21fcGRhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGRhdGFfbXRkX3JhbSBjZGI4OTcxMl9zcmFtX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLmJhbmt3aWR0aAk9IDQsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGNkYjg5NzEyX3NyYW1fcmVzb3VyY2VzW10gX19pbml0ZGF0YSA9IHsKLQlERUZJTkVfUkVTX01FTShDTFBTNzExWF9TUkFNX0JBU0UsIENMUFM3MTFYX1NSQU1fU0laRSksCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjZGI4OTcxMl9zcmFtX3BkZXYgX19pbml0ZGF0YSA9IHsKLQkubmFtZQkJPSAibXRkLXJhbSIsCi0JLmlkCQk9IDAsCi0JLnJlc291cmNlCT0gY2RiODk3MTJfc3JhbV9yZXNvdXJjZXMsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNkYjg5NzEyX3NyYW1fcmVzb3VyY2VzKSwKLQkuZGV2CT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZjZGI4OTcxMl9zcmFtX3BkYXRhLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgY2RiODk3MTJfaW5pdCh2b2lkKQotewotCWNscHM3MTF4X2RldmljZXNfaW5pdCgpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmY2RiODk3MTJfZmxhc2hfcGRldik7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZjZGI4OTcxMl9ib290cm9tX3BkZXYpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmY2RiODk3MTJfc3JhbV9wZGV2KTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJjczg5eDAiLCAwLCBjZGI4OTcxMl9jczg5MDBfcmVzb3VyY2UsCi0JCQkJCUFSUkFZX1NJWkUoY2RiODk3MTJfY3M4OTAwX3Jlc291cmNlKSk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoQ0RCODk3MTIsICJDaXJydXMtQ0RCODk3MTIiKQotCS8qIE1haW50YWluZXI6IFJheSBMZWh0aW5pZW1pICovCi0JLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCi0JLm1hcF9pbwkJPSBjbHBzNzExeF9tYXBfaW8sCi0JLmluaXRfaXJxCT0gY2xwczcxMXhfaW5pdF9pcnEsCi0JLmluaXRfdGltZQk9IGNscHM3MTF4X3RpbWVyX2luaXQsCi0JLmluaXRfbWFjaGluZQk9IGNkYjg5NzEyX2luaXQsCi0JLnJlc3RhcnQJPSBjbHBzNzExeF9yZXN0YXJ0LAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYm9hcmQtY2xlcDczMTIuYyBiL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYm9hcmQtY2xlcDczMTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljYTIyYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2JvYXJkLWNsZXA3MzEyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY2xlcDczMTIuYwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+Ci0KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotI2luY2x1ZGUgImRldmljZXMuaCIKLQotc3RhdGljIHZvaWQgX19pbml0Ci1maXh1cF9jbGVwNzMxMihzdHJ1Y3QgdGFnICp0YWdzLCBjaGFyICoqY21kbGluZSkKLXsKLQltZW1ibG9ja19hZGQoMHhjMDAwMDAwMCwgMHgwMTAwMDAwMCk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoQ0xFUDcyMTIsICJDaXJydXMgTG9naWMgNzIxMi83MzEyIikKLQkvKiBNYWludGFpbmVyOiBOb2JvZHkgKi8KLQkuYXRhZ19vZmZzZXQJPSAweDAxMDAsCi0JLmZpeHVwCQk9IGZpeHVwX2NsZXA3MzEyLAotCS5tYXBfaW8JCT0gY2xwczcxMXhfbWFwX2lvLAotCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAotCS5pbml0X3RpbWUJPSBjbHBzNzExeF90aW1lcl9pbml0LAotCS5pbml0X21hY2hpbmUJPSBjbHBzNzExeF9kZXZpY2VzX2luaXQsCi0JLnJlc3RhcnQJPSBjbHBzNzExeF9yZXN0YXJ0LAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYm9hcmQtZWRiNzIxMS5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9ib2FyZC1lZGI3MjExLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMzk3OTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9ib2FyZC1lZGI3MjExLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEgQmx1ZSBNdWcsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3B3bS5oPgotI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgotCi0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgotCi0jaW5jbHVkZSA8YXNtL3NldHVwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0KLSNpbmNsdWRlIDx2aWRlby9wbGF0Zm9ybV9sY2QuaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotI2luY2x1ZGUgImRldmljZXMuaCIKLQotI2RlZmluZSBWSURFT1JBTV9TSVpFCQlTWl8xMjhLCi0KLSNkZWZpbmUgRURCNzIxMV9MQ0RfRENfRENfRU4JQ0xQUzcxMVhfR1BJTygzLCAxKQotI2RlZmluZSBFREI3MjExX0xDREVOCQlDTFBTNzExWF9HUElPKDMsIDIpCi0jZGVmaW5lIEVEQjcyMTFfTENEQkwJCUNMUFM3MTFYX0dQSU8oMywgMykKLQotI2RlZmluZSBFREI3MjExX0kyQ19TREEJCUNMUFM3MTFYX0dQSU8oMywgNCkKLSNkZWZpbmUgRURCNzIxMV9JMkNfU0NMCQlDTFBTNzExWF9HUElPKDMsIDUpCi0KLSNkZWZpbmUgRURCNzIxMV9GTEFTSDBfQkFTRQkoQ1MwX1BIWVNfQkFTRSkKLSNkZWZpbmUgRURCNzIxMV9GTEFTSDFfQkFTRQkoQ1MxX1BIWVNfQkFTRSkKLQotI2RlZmluZSBFREI3MjExX0NTODkwMF9CQVNFCShDUzJfUEhZU19CQVNFICsgMHgzMDApCi0jZGVmaW5lIEVEQjcyMTFfQ1M4OTAwX0lSUQkoSVJRX0VJTlQzKQotCi0vKiBUaGUgZXh0cmEgOCBsaW5lcyBvZiB0aGUga2V5Ym9hcmQgbWF0cml4ICovCi0jZGVmaW5lIEVEQjcyMTFfRVhUS0JEX0JBU0UJKENTM19QSFlTX0JBU0UpCi0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2dwaW9fcGxhdGZvcm1fZGF0YSBlZGI3MjExX2kyY19wZGF0YSBfX2luaXRkYXRhID0gewotCS5zZGFfcGluCT0gRURCNzIxMV9JMkNfU0RBLAotCS5zY2xfcGluCT0gRURCNzIxMV9JMkNfU0NMLAotCS5zY2xfaXNfb3V0cHV0X29ubHkgPSAxLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlZGI3MjExX2NzODkwMF9yZXNvdXJjZVtdIF9faW5pdGRhdGEgPSB7Ci0JREVGSU5FX1JFU19NRU0oRURCNzIxMV9DUzg5MDBfQkFTRSwgU1pfMUspLAotCURFRklORV9SRVNfSVJRKEVEQjcyMTFfQ1M4OTAwX0lSUSksCi19OwotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gZWRiNzIxMV9mbGFzaF9wYXJ0aXRpb25zW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS5uYW1lCT0gIkZsYXNoIiwKLQkJLm9mZnNldAk9IDAsCi0JCS5zaXplCT0gTVREUEFSVF9TSVpfRlVMTCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgZWRiNzIxMV9mbGFzaF9wZGF0YSBfX2luaXRkYXRhID0gewotCS53aWR0aAkJPSA0LAotCS5wYXJ0cwkJPSBlZGI3MjExX2ZsYXNoX3BhcnRpdGlvbnMsCi0JLm5yX3BhcnRzCT0gQVJSQVlfU0laRShlZGI3MjExX2ZsYXNoX3BhcnRpdGlvbnMpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlZGI3MjExX2ZsYXNoX3Jlc291cmNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JREVGSU5FX1JFU19NRU0oRURCNzIxMV9GTEFTSDBfQkFTRSwgU1pfOE0pLAotCURFRklORV9SRVNfTUVNKEVEQjcyMTFfRkxBU0gxX0JBU0UsIFNaXzhNKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGVkYjcyMTFfZmxhc2hfcGRldiBfX2luaXRkYXRhID0gewotCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKLQkuaWQJCT0gMCwKLQkucmVzb3VyY2UJPSBlZGI3MjExX2ZsYXNoX3Jlc291cmNlcywKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZWRiNzIxMV9mbGFzaF9yZXNvdXJjZXMpLAotCS5kZXYJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmVkYjcyMTFfZmxhc2hfcGRhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIGVkYjcyMTFfbGNkX3Bvd2VyX3NldChzdHJ1Y3QgcGxhdF9sY2RfZGF0YSAqcGQsIHVuc2lnbmVkIGludCBwb3dlcikKLXsKLQlpZiAocG93ZXIpIHsKLQkJZ3Bpb19zZXRfdmFsdWUoRURCNzIxMV9MQ0RFTiwgMSk7Ci0JCXVkZWxheSgxMDApOwotCQlncGlvX3NldF92YWx1ZShFREI3MjExX0xDRF9EQ19EQ19FTiwgMSk7Ci0JfSBlbHNlIHsKLQkJZ3Bpb19zZXRfdmFsdWUoRURCNzIxMV9MQ0RfRENfRENfRU4sIDApOwotCQl1ZGVsYXkoMTAwKTsKLQkJZ3Bpb19zZXRfdmFsdWUoRURCNzIxMV9MQ0RFTiwgMCk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRfbGNkX2RhdGEgZWRiNzIxMV9sY2RfcG93ZXJfcGRhdGEgPSB7Ci0JLnNldF9wb3dlcgk9IGVkYjcyMTFfbGNkX3Bvd2VyX3NldCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcHdtX2xvb2t1cCBlZGI3MjExX3B3bV9sb29rdXBbXSA9IHsKLQlQV01fTE9PS1VQKCJjbHBzNzExeC1wd20iLCAwLCAicHdtLWJhY2tsaWdodC4wIiwgTlVMTCwKLQkJICAgMCwgUFdNX1BPTEFSSVRZX05PUk1BTCksCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX3B3bV9iYWNrbGlnaHRfZGF0YSBwd21fYmxfcGRhdGEgPSB7Ci0JLmRmdF9icmlnaHRuZXNzCT0gMHgwMSwKLQkubWF4X2JyaWdodG5lc3MJPSAweDBmLAotCS5lbmFibGVfZ3Bpbwk9IEVEQjcyMTFfTENEQkwsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGNscHM3MTF4X3B3bV9yZXMgPQotCURFRklORV9SRVNfTUVNKENMUFM3MTFYX1BIWVNfQkFTRSArIFBNUENPTiwgU1pfNCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3BpbyBlZGI3MjExX2dwaW9zW10gX19pbml0Y29uc3QgPSB7Ci0JeyBFREI3MjExX0xDRF9EQ19EQ19FTiwJR1BJT0ZfT1VUX0lOSVRfTE9XLAkiTENEIERDLURDIiB9LAotCXsgRURCNzIxMV9MQ0RFTiwJR1BJT0ZfT1VUX0lOSVRfTE9XLAkiTENEIFBPV0VSIiB9LAotfTsKLQotLyogUmVzZXJ2ZSBzY3JlZW4gbWVtb3J5IHJlZ2lvbiBhdCB0aGUgc3RhcnQgb2YgbWFpbiBzeXN0ZW0gbWVtb3J5LiAqLwotc3RhdGljIHZvaWQgX19pbml0IGVkYjcyMTFfcmVzZXJ2ZSh2b2lkKQotewotCW1lbWJsb2NrX3Jlc2VydmUoUEhZU19PRkZTRVQsIFZJREVPUkFNX1NJWkUpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQKLWZpeHVwX2VkYjcyMTEoc3RydWN0IHRhZyAqdGFncywgY2hhciAqKmNtZGxpbmUpCi17Ci0JLyoKLQkgKiBCYW5rIHN0YXJ0IGFkZHJlc3NlcyBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGluZm9ybWF0aW9uCi0JICogcGFzc2VkIGluIGZyb20gdGhlIGJvb3QgbG9hZGVyLiAgV2UgY291bGQgcG90ZW50aWFsbHkKLQkgKiBkZXRlY3QgdGhlbSwgYnV0IGluc3RlYWQgd2UgaGFyZC1jb2RlIHRoZW0uCi0JICoKLQkgKiBCYW5rcyBzaXplcyBfYXJlXyBwcmVzZW50IGluIHRoZSBwYXJhbSBibG9jaywgYnV0IHdlJ3JlCi0JICogbm90IHVzaW5nIHRoYXQgaW5mb3JtYXRpb24geWV0LgotCSAqLwotCW1lbWJsb2NrX2FkZCgweGMwMDAwMDAwLCBTWl84TSk7Ci0JbWVtYmxvY2tfYWRkKDB4YzEwMDAwMDAsIFNaXzhNKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGVkYjcyMTFfaW5pdF9sYXRlKHZvaWQpCi17Ci0JZ3Bpb19yZXF1ZXN0X2FycmF5KGVkYjcyMTFfZ3Bpb3MsIEFSUkFZX1NJWkUoZWRiNzIxMV9ncGlvcykpOwotCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlZGI3MjExX2ZsYXNoX3BkZXYpOwotCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoTlVMTCwgInBsYXRmb3JtLWxjZCIsIDAsCi0JCQkJICAgICAgJmVkYjcyMTFfbGNkX3Bvd2VyX3BkYXRhLAotCQkJCSAgICAgIHNpemVvZihlZGI3MjExX2xjZF9wb3dlcl9wZGF0YSkpOwotCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiY2xwczcxMXgtcHdtIiwgUExBVEZPUk1fREVWSURfTk9ORSwKLQkJCQkJJmNscHM3MTF4X3B3bV9yZXMsIDEpOwotCXB3bV9hZGRfdGFibGUoZWRiNzIxMV9wd21fbG9va3VwLCBBUlJBWV9TSVpFKGVkYjcyMTFfcHdtX2xvb2t1cCkpOwotCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoJnBsYXRmb3JtX2J1cywgInB3bS1iYWNrbGlnaHQiLCAwLAotCQkJCSAgICAgICZwd21fYmxfcGRhdGEsIHNpemVvZihwd21fYmxfcGRhdGEpKTsKLQotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInZpZGVvLWNscHM3MTF4IiwgMCwgTlVMTCwgMCk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiY3M4OXgwIiwgMCwgZWRiNzIxMV9jczg5MDBfcmVzb3VyY2UsCi0JCQkJCUFSUkFZX1NJWkUoZWRiNzIxMV9jczg5MDBfcmVzb3VyY2UpKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShOVUxMLCAiaTJjLWdwaW8iLCAwLAotCQkJCSAgICAgICZlZGI3MjExX2kyY19wZGF0YSwKLQkJCQkgICAgICBzaXplb2YoZWRiNzIxMV9pMmNfcGRhdGEpKTsKLX0KLQotTUFDSElORV9TVEFSVChFREI3MjExLCAiQ0wtRURCNzIxMSAoRVA3MjExIGV2YWwgYm9hcmQpIikKLQkvKiBNYWludGFpbmVyOiBKb24gTWNDbGludG9jayAqLwotCS5hdGFnX29mZnNldAk9IFZJREVPUkFNX1NJWkUgKyAweDEwMCwKLQkuZml4dXAJCT0gZml4dXBfZWRiNzIxMSwKLQkucmVzZXJ2ZQk9IGVkYjcyMTFfcmVzZXJ2ZSwKLQkubWFwX2lvCQk9IGNscHM3MTF4X21hcF9pbywKLQkuaW5pdF9pcnEJPSBjbHBzNzExeF9pbml0X2lycSwKLQkuaW5pdF90aW1lCT0gY2xwczcxMXhfdGltZXJfaW5pdCwKLQkuaW5pdF9tYWNoaW5lCT0gY2xwczcxMXhfZGV2aWNlc19pbml0LAotCS5pbml0X2xhdGUJPSBlZGI3MjExX2luaXRfbGF0ZSwKLQkucmVzdGFydAk9IGNscHM3MTF4X3Jlc3RhcnQsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9ib2FyZC1wNzIwdC5jIGIvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9ib2FyZC1wNzIwdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGExNmE4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvYm9hcmQtcDcyMHQuYworKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY2xwczcxMXgvcDcyMHQuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgotI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8vZHJpdmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC1ncGlvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSA8dmlkZW8vcGxhdGZvcm1fbGNkLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKLSNpbmNsdWRlICJkZXZpY2VzLmgiCi0KLSNkZWZpbmUgUDcyMFRfVVNFUkxFRAkJQ0xQUzcxMVhfR1BJTygzLCAwKQotI2RlZmluZSBQNzIwVF9OQU5EX0NMRQkJQ0xQUzcxMVhfR1BJTyg0LCAwKQotI2RlZmluZSBQNzIwVF9OQU5EX0FMRQkJQ0xQUzcxMVhfR1BJTyg0LCAxKQotI2RlZmluZSBQNzIwVF9OQU5EX05DRQkJQ0xQUzcxMVhfR1BJTyg0LCAyKQotCi0jZGVmaW5lIFA3MjBUX05BTkRfQkFTRQkJKENMUFM3MTFYX1NEUkFNMV9CQVNFKQotCi0jZGVmaW5lIFA3MjBUX01NR1BJT19CQVNFCShDTFBTNzExWF9OUl9HUElPKQotCi0jZGVmaW5lIFNZU1BMRF9QSFlTX0JBU0UJSU9NRU0oQ1MxX1BIWVNfQkFTRSkKLQotI2RlZmluZSBQTERfSU5UCQkJKFNZU1BMRF9QSFlTX0JBU0UgKyAweDAwMDAwMCkKLSNkZWZpbmUgUExEX0lOVF9NTUdQSU9fQkFTRQkoUDcyMFRfTU1HUElPX0JBU0UgKyAwKQotI2RlZmluZSBQTERfSU5UX1BFTklSUQkJKFBMRF9JTlRfTU1HUElPX0JBU0UgKyA1KQotI2RlZmluZSBQTERfSU5UX1VDQl9JUlEJCShQTERfSU5UX01NR1BJT19CQVNFICsgMSkKLSNkZWZpbmUgUExEX0lOVF9LQkRfQVROCQkoUExEX0lOVF9NTUdQSU9fQkFTRSArIDApIC8qIEVJTlQxICovCi0KLSNkZWZpbmUgUExEX1BXUgkJCShTWVNQTERfUEhZU19CQVNFICsgMHgwMDAwMDQpCi0jZGVmaW5lIFBMRF9QV1JfTU1HUElPX0JBU0UJKFA3MjBUX01NR1BJT19CQVNFICsgOCkKLSNkZWZpbmUgUExEX1BXUl9FWFQJCShQTERfUFdSX01NR1BJT19CQVNFICsgNSkKLSNkZWZpbmUgUExEX1BXUl9NT0RFCQkoUExEX1BXUl9NTUdQSU9fQkFTRSArIDQpIC8qIDEgPSBQV00sIDAgPSBQRk0gKi8KLSNkZWZpbmUgUExEX1M0X09OCQkoUExEX1BXUl9NTUdQSU9fQkFTRSArIDMpIC8qIExDRCBiaWFzIHZvbHRhZ2UgZW5hYmxlICovCi0jZGVmaW5lIFBMRF9TM19PTgkJKFBMRF9QV1JfTU1HUElPX0JBU0UgKyAyKSAvKiBMQ0QgYmFja2xpZ2h0IGVuYWJsZSAqLwotI2RlZmluZSBQTERfUzJfT04JCShQTERfUFdSX01NR1BJT19CQVNFICsgMSkgLyogTENEIDNWMyBzdXBwbHkgZW5hYmxlICovCi0jZGVmaW5lIFBMRF9TMV9PTgkJKFBMRF9QV1JfTU1HUElPX0JBU0UgKyAwKSAvKiBMQ0QgM1Ygc3VwcGx5IGVuYWJsZSAqLwotCi0jZGVmaW5lIFBMRF9LQkQJCQkoU1lTUExEX1BIWVNfQkFTRSArIDB4MDAwMDA4KQotI2RlZmluZSBQTERfS0JEX01NR1BJT19CQVNFCShQNzIwVF9NTUdQSU9fQkFTRSArIDE2KQotI2RlZmluZSBQTERfS0JEX1dBS0UJCShQTERfS0JEX01NR1BJT19CQVNFICsgMSkKLSNkZWZpbmUgUExEX0tCRF9FTgkJKFBMRF9LQkRfTU1HUElPX0JBU0UgKyAwKQotCi0jZGVmaW5lIFBMRF9TUEkJCQkoU1lTUExEX1BIWVNfQkFTRSArIDB4MDAwMDBjKQotI2RlZmluZSBQTERfU1BJX01NR1BJT19CQVNFCShQNzIwVF9NTUdQSU9fQkFTRSArIDI0KQotI2RlZmluZSBQTERfU1BJX0VOCQkoUExEX1NQSV9NTUdQSU9fQkFTRSArIDApCi0KLSNkZWZpbmUgUExEX0lPCQkJKFNZU1BMRF9QSFlTX0JBU0UgKyAweDAwMDAxMCkKLSNkZWZpbmUgUExEX0lPX01NR1BJT19CQVNFCShQNzIwVF9NTUdQSU9fQkFTRSArIDMyKQotI2RlZmluZSBQTERfSU9fQk9PVFNFTAkJKFBMRF9JT19NTUdQSU9fQkFTRSArIDYpIC8qIEJvb3Qgc2VsIHN3aXRjaCAqLwotI2RlZmluZSBQTERfSU9fVVNFUgkJKFBMRF9JT19NTUdQSU9fQkFTRSArIDUpIC8qIFVzZXIgZGVmaW5lZCBzd2l0Y2ggKi8KLSNkZWZpbmUgUExEX0lPX0xFRDMJCShQTERfSU9fTU1HUElPX0JBU0UgKyA0KQotI2RlZmluZSBQTERfSU9fTEVEMgkJKFBMRF9JT19NTUdQSU9fQkFTRSArIDMpCi0jZGVmaW5lIFBMRF9JT19MRUQxCQkoUExEX0lPX01NR1BJT19CQVNFICsgMikKLSNkZWZpbmUgUExEX0lPX0xFRDAJCShQTERfSU9fTU1HUElPX0JBU0UgKyAxKQotI2RlZmluZSBQTERfSU9fTEVERU4JCShQTERfSU9fTU1HUElPX0JBU0UgKyAwKQotCi0jZGVmaW5lIFBMRF9JUkRBCQkoU1lTUExEX1BIWVNfQkFTRSArIDB4MDAwMDE0KQotI2RlZmluZSBQTERfSVJEQV9NTUdQSU9fQkFTRQkoUDcyMFRfTU1HUElPX0JBU0UgKyA0MCkKLSNkZWZpbmUgUExEX0lSREFfRU4JCShQTERfSVJEQV9NTUdQSU9fQkFTRSArIDApCi0KLSNkZWZpbmUgUExEX0NPTTIJCShTWVNQTERfUEhZU19CQVNFICsgMHgwMDAwMTgpCi0jZGVmaW5lIFBMRF9DT00yX01NR1BJT19CQVNFCShQNzIwVF9NTUdQSU9fQkFTRSArIDQ4KQotI2RlZmluZSBQTERfQ09NMl9FTgkJKFBMRF9DT00yX01NR1BJT19CQVNFICsgMCkKLQotI2RlZmluZSBQTERfQ09NMQkJKFNZU1BMRF9QSFlTX0JBU0UgKyAweDAwMDAxYykKLSNkZWZpbmUgUExEX0NPTTFfTU1HUElPX0JBU0UJKFA3MjBUX01NR1BJT19CQVNFICsgNTYpCi0jZGVmaW5lIFBMRF9DT00xX0VOCQkoUExEX0NPTTFfTU1HUElPX0JBU0UgKyAwKQotCi0jZGVmaW5lIFBMRF9BVUQJCQkoU1lTUExEX1BIWVNfQkFTRSArIDB4MDAwMDIwKQotI2RlZmluZSBQTERfQVVEX01NR1BJT19CQVNFCShQNzIwVF9NTUdQSU9fQkFTRSArIDY0KQotI2RlZmluZSBQTERfQVVEX0RJVjEJCShQTERfQVVEX01NR1BJT19CQVNFICsgNikKLSNkZWZpbmUgUExEX0FVRF9ESVYwCQkoUExEX0FVRF9NTUdQSU9fQkFTRSArIDUpCi0jZGVmaW5lIFBMRF9BVURfQ0xLX1NFTDEJKFBMRF9BVURfTU1HUElPX0JBU0UgKyA0KQotI2RlZmluZSBQTERfQVVEX0NMS19TRUwwCShQTERfQVVEX01NR1BJT19CQVNFICsgMykKLSNkZWZpbmUgUExEX0FVRF9NSUNfUFdSCQkoUExEX0FVRF9NTUdQSU9fQkFTRSArIDIpCi0jZGVmaW5lIFBMRF9BVURfTUlDX0dBSU4JKFBMRF9BVURfTU1HUElPX0JBU0UgKyAxKQotI2RlZmluZSBQTERfQVVEX0NPREVDX0VOCShQTERfQVVEX01NR1BJT19CQVNFICsgMCkKLQotI2RlZmluZSBQTERfQ0YJCQkoU1lTUExEX1BIWVNfQkFTRSArIDB4MDAwMDI0KQotI2RlZmluZSBQTERfQ0ZfTU1HUElPX0JBU0UJKFA3MjBUX01NR1BJT19CQVNFICsgNzIpCi0jZGVmaW5lIFBMRF9DRjJfU0xFRVAJCShQTERfQ0ZfTU1HUElPX0JBU0UgKyA1KQotI2RlZmluZSBQTERfQ0YxX1NMRUVQCQkoUExEX0NGX01NR1BJT19CQVNFICsgNCkKLSNkZWZpbmUgUExEX0NGMl9uUERSRVEJCShQTERfQ0ZfTU1HUElPX0JBU0UgKyAzKQotI2RlZmluZSBQTERfQ0YxX25QRFJFUQkJKFBMRF9DRl9NTUdQSU9fQkFTRSArIDIpCi0jZGVmaW5lIFBMRF9DRjJfbklSUQkJKFBMRF9DRl9NTUdQSU9fQkFTRSArIDEpCi0jZGVmaW5lIFBMRF9DRjFfbklSUQkJKFBMRF9DRl9NTUdQSU9fQkFTRSArIDApCi0KLSNkZWZpbmUgUExEX1NEQwkJCShTWVNQTERfUEhZU19CQVNFICsgMHgwMDAwMjgpCi0jZGVmaW5lIFBMRF9TRENfTU1HUElPX0JBU0UJKFA3MjBUX01NR1BJT19CQVNFICsgODApCi0jZGVmaW5lIFBMRF9TRENfSU5UX0VOCQkoUExEX1NEQ19NTUdQSU9fQkFTRSArIDIpCi0jZGVmaW5lIFBMRF9TRENfV1AJCShQTERfU0RDX01NR1BJT19CQVNFICsgMSkKLSNkZWZpbmUgUExEX1NEQ19DRAkJKFBMRF9TRENfTU1HUElPX0JBU0UgKyAwKQotCi0jZGVmaW5lIFBMRF9DT0RFQwkJKFNZU1BMRF9QSFlTX0JBU0UgKyAweDQwMDAwMCkKLSNkZWZpbmUgUExEX0NPREVDX01NR1BJT19CQVNFCShQNzIwVF9NTUdQSU9fQkFTRSArIDg4KQotI2RlZmluZSBQTERfQ09ERUNfSVJRMwkJKFBMRF9DT0RFQ19NTUdQSU9fQkFTRSArIDQpCi0jZGVmaW5lIFBMRF9DT0RFQ19JUlEyCQkoUExEX0NPREVDX01NR1BJT19CQVNFICsgMykKLSNkZWZpbmUgUExEX0NPREVDX0lSUTEJCShQTERfQ09ERUNfTU1HUElPX0JBU0UgKyAyKQotI2RlZmluZSBQTERfQ09ERUNfRU4JCShQTERfQ09ERUNfTU1HUElPX0JBU0UgKyAwKQotCi0jZGVmaW5lIFBMRF9CUklURQkJKFNZU1BMRF9QSFlTX0JBU0UgKyAweDQwMDAwNCkKLSNkZWZpbmUgUExEX0JSSVRFX01NR1BJT19CQVNFCShQNzIwVF9NTUdQSU9fQkFTRSArIDk2KQotI2RlZmluZSBQTERfQlJJVEVfVVAJCShQTERfQlJJVEVfTU1HUElPX0JBU0UgKyAxKQotI2RlZmluZSBQTERfQlJJVEVfRE4JCShQTERfQlJJVEVfTU1HUElPX0JBU0UgKyAwKQotCi0jZGVmaW5lIFBMRF9MQ0RFTgkJKFNZU1BMRF9QSFlTX0JBU0UgKyAweDQwMDAwOCkKLSNkZWZpbmUgUExEX0xDREVOX01NR1BJT19CQVNFCShQNzIwVF9NTUdQSU9fQkFTRSArIDEwNCkKLSNkZWZpbmUgUExEX0xDREVOX0VOCQkoUExEX0xDREVOX01NR1BJT19CQVNFICsgMCkKLQotI2RlZmluZSBQTERfVENICQkJKFNZU1BMRF9QSFlTX0JBU0UgKyAweDQwMDAxMCkKLSNkZWZpbmUgUExEX1RDSF9NTUdQSU9fQkFTRQkoUDcyMFRfTU1HUElPX0JBU0UgKyAxMTIpCi0jZGVmaW5lIFBMRF9UQ0hfUEVOSVJRCQkoUExEX1RDSF9NTUdQSU9fQkFTRSArIDEpCi0jZGVmaW5lIFBMRF9UQ0hfRU4JCShQTERfVENIX01NR1BJT19CQVNFICsgMCkKLQotI2RlZmluZSBQTERfR1BJTwkJKFNZU1BMRF9QSFlTX0JBU0UgKyAweDQwMDAxNCkKLSNkZWZpbmUgUExEX0dQSU9fTU1HUElPX0JBU0UJKFA3MjBUX01NR1BJT19CQVNFICsgMTIwKQotI2RlZmluZSBQTERfR1BJTzIJCShQTERfR1BJT19NTUdQSU9fQkFTRSArIDIpCi0jZGVmaW5lIFBMRF9HUElPMQkJKFBMRF9HUElPX01NR1BJT19CQVNFICsgMSkKLSNkZWZpbmUgUExEX0dQSU8wCQkoUExEX0dQSU9fTU1HUElPX0JBU0UgKyAwKQotCi1zdGF0aWMgc3RydWN0IGdwaW8gcDcyMHRfZ3Bpb3NbXSBfX2luaXRjb25zdCA9IHsKLQl7IFBMRF9TMV9PTiwJR1BJT0ZfT1VUX0lOSVRfTE9XLAkiUExEX1MxX09OIiB9LAotCXsgUExEX1MyX09OLAlHUElPRl9PVVRfSU5JVF9MT1csCSJQTERfUzJfT04iIH0sCi0JeyBQTERfUzNfT04sCUdQSU9GX09VVF9JTklUX0xPVywJIlBMRF9TM19PTiIgfSwKLQl7IFBMRF9TNF9PTiwJR1BJT0ZfT1VUX0lOSVRfTE9XLAkiUExEX1M0X09OIiB9LAotCXsgUExEX0tCRF9FTiwJR1BJT0ZfT1VUX0lOSVRfTE9XLAkiUExEX0tCRF9FTiIgfSwKLQl7IFBMRF9TUElfRU4sCUdQSU9GX09VVF9JTklUX0xPVywJIlBMRF9TUElfRU4iIH0sCi0JeyBQTERfSU9fVVNFUiwJR1BJT0ZfT1VUX0lOSVRfTE9XLAkiUExEX0lPX1VTRVIiIH0sCi0JeyBQTERfSU9fTEVEMCwJR1BJT0ZfT1VUX0lOSVRfTE9XLAkiUExEX0lPX0xFRDAiIH0sCi0JeyBQTERfSU9fTEVEMSwJR1BJT0ZfT1VUX0lOSVRfTE9XLAkiUExEX0lPX0xFRDEiIH0sCi0JeyBQTERfSU9fTEVEMiwJR1BJT0ZfT1VUX0lOSVRfTE9XLAkiUExEX0lPX0xFRDIiIH0sCi0JeyBQTERfSU9fTEVEMywJR1BJT0ZfT1VUX0lOSVRfTE9XLAkiUExEX0lPX0xFRDMiIH0sCi0JeyBQTERfSU9fTEVERU4sCUdQSU9GX09VVF9JTklUX0xPVywJIlBMRF9JT19MRURFTiIgfSwKLQl7IFBMRF9JUkRBX0VOLAlHUElPRl9PVVRfSU5JVF9MT1csCSJQTERfSVJEQV9FTiIgfSwKLQl7IFBMRF9DT00xX0VOLAlHUElPRl9PVVRfSU5JVF9ISUdILAkiUExEX0NPTTFfRU4iIH0sCi0JeyBQTERfQ09NMl9FTiwJR1BJT0ZfT1VUX0lOSVRfSElHSCwJIlBMRF9DT00yX0VOIiB9LAotCXsgUExEX0NPREVDX0VOLAlHUElPRl9PVVRfSU5JVF9MT1csCSJQTERfQ09ERUNfRU4iIH0sCi0JeyBQTERfTENERU5fRU4sCUdQSU9GX09VVF9JTklUX0xPVywJIlBMRF9MQ0RFTl9FTiIgfSwKLQl7IFBMRF9UQ0hfRU4sCUdQSU9GX09VVF9JTklUX0xPVywJIlBMRF9UQ0hfRU4iIH0sCi0JeyBQNzIwVF9VU0VSTEVELEdQSU9GX09VVF9JTklUX0xPVywJIlVTRVJfTEVEIiB9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwNzIwdF9tbWdwaW9fcmVzb3VyY2VbXSBfX2luaXRkYXRhID0gewotCURFRklORV9SRVNfTUVNX05BTUVEKDAsIDQsICJkYXQiKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYmdwaW9fcGRhdGEgcDcyMHRfbW1ncGlvX3BkYXRhID0gewotCS5uZ3Bpbwk9IDgsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwNzIwdF9tbWdwaW8gX19pbml0ZGF0YSA9IHsKLQkubmFtZQkJPSAiYmFzaWMtbW1pby1ncGlvIiwKLQkuaWQJCT0gLTEsCi0JLnJlc291cmNlCT0gcDcyMHRfbW1ncGlvX3Jlc291cmNlLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShwNzIwdF9tbWdwaW9fcmVzb3VyY2UpLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZwNzIwdF9tbWdwaW9fcGRhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBwNzIwdF9tbWdwaW9faW5pdCh2b2lkIF9faW9tZW0gKmFkZHJiYXNlLCBpbnQgZ3Bpb2Jhc2UpCi17Ci0JcDcyMHRfbW1ncGlvX3Jlc291cmNlWzBdLnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpYWRkcmJhc2U7Ci0JcDcyMHRfbW1ncGlvX3BkYXRhLmJhc2UgPSBncGlvYmFzZTsKLQotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcDcyMHRfbW1ncGlvKTsKLX0KLQotc3RhdGljIHN0cnVjdCB7Ci0Jdm9pZCBfX2lvbWVtCSphZGRyYmFzZTsKLQlpbnQJCWdwaW9iYXNlOwotfSBtbWdwaW9zW10gX19pbml0Y29uc3QgPSB7Ci0JeyBQTERfSU5ULAlQTERfSU5UX01NR1BJT19CQVNFIH0sCi0JeyBQTERfUFdSLAlQTERfUFdSX01NR1BJT19CQVNFIH0sCi0JeyBQTERfS0JELAlQTERfS0JEX01NR1BJT19CQVNFIH0sCi0JeyBQTERfU1BJLAlQTERfU1BJX01NR1BJT19CQVNFIH0sCi0JeyBQTERfSU8sCVBMRF9JT19NTUdQSU9fQkFTRSB9LAotCXsgUExEX0lSREEsCVBMRF9JUkRBX01NR1BJT19CQVNFIH0sCi0JeyBQTERfQ09NMiwJUExEX0NPTTJfTU1HUElPX0JBU0UgfSwKLQl7IFBMRF9DT00xLAlQTERfQ09NMV9NTUdQSU9fQkFTRSB9LAotCXsgUExEX0FVRCwJUExEX0FVRF9NTUdQSU9fQkFTRSB9LAotCXsgUExEX0NGLAlQTERfQ0ZfTU1HUElPX0JBU0UgfSwKLQl7IFBMRF9TREMsCVBMRF9TRENfTU1HUElPX0JBU0UgfSwKLQl7IFBMRF9DT0RFQywJUExEX0NPREVDX01NR1BJT19CQVNFIH0sCi0JeyBQTERfQlJJVEUsCVBMRF9CUklURV9NTUdQSU9fQkFTRSB9LAotCXsgUExEX0xDREVOLAlQTERfTENERU5fTU1HUElPX0JBU0UgfSwKLQl7IFBMRF9UQ0gsCVBMRF9UQ0hfTU1HUElPX0JBU0UgfSwKLQl7IFBMRF9HUElPLAlQTERfR1BJT19NTUdQSU9fQkFTRSB9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwNzIwdF9uYW5kX3Jlc291cmNlW10gX19pbml0ZGF0YSA9IHsKLQlERUZJTkVfUkVTX01FTShQNzIwVF9OQU5EX0JBU0UsIFNaXzQpLAotfTsKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIHA3MjB0X25hbmRfcGFydHNbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLm5hbWUJPSAiRmxhc2ggcGFydGl0aW9uIDEiLAotCQkub2Zmc2V0CT0gMCwKLQkJLnNpemUJPSBTWl8yTSwKLQl9LAotCXsKLQkJLm5hbWUJPSAiRmxhc2ggcGFydGl0aW9uIDIiLAotCQkub2Zmc2V0CT0gTVREUEFSVF9PRlNfQVBQRU5ELAotCQkuc2l6ZQk9IE1URFBBUlRfU0laX0ZVTEwsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19uYW5kX3BsYXRkYXRhIHA3MjB0X25hbmRfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuZ3Bpb19yZHkJPSAtMSwKLQkuZ3Bpb19uY2UJPSBQNzIwVF9OQU5EX05DRSwKLQkuZ3Bpb19hbGUJPSBQNzIwVF9OQU5EX0FMRSwKLQkuZ3Bpb19jbGUJPSBQNzIwVF9OQU5EX0NMRSwKLQkuZ3Bpb19ud3AJPSAtMSwKLQkuY2hpcF9kZWxheQk9IDE1LAotCS5wYXJ0cwkJPSBwNzIwdF9uYW5kX3BhcnRzLAotCS5udW1fcGFydHMJPSBBUlJBWV9TSVpFKHA3MjB0X25hbmRfcGFydHMpLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcDcyMHRfbmFuZF9wZGV2IF9faW5pdGRhdGEgPSB7Ci0JLm5hbWUJCT0gImdwaW8tbmFuZCIsCi0JLmlkCQk9IC0xLAotCS5yZXNvdXJjZQk9IHA3MjB0X25hbmRfcmVzb3VyY2UsCi0JLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHA3MjB0X25hbmRfcmVzb3VyY2UpLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZwNzIwdF9uYW5kX3BkYXRhLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBwNzIwdF9sY2RfcG93ZXJfc2V0KHN0cnVjdCBwbGF0X2xjZF9kYXRhICpwZCwgdW5zaWduZWQgaW50IHBvd2VyKQotewotCWlmIChwb3dlcikgewotCQlncGlvX3NldF92YWx1ZShQTERfTENERU5fRU4sIDEpOwotCQlncGlvX3NldF92YWx1ZShQTERfUzFfT04sIDEpOwotCQlncGlvX3NldF92YWx1ZShQTERfUzJfT04sIDEpOwotCQlncGlvX3NldF92YWx1ZShQTERfUzRfT04sIDEpOwotCX0gZWxzZSB7Ci0JCWdwaW9fc2V0X3ZhbHVlKFBMRF9TMV9PTiwgMCk7Ci0JCWdwaW9fc2V0X3ZhbHVlKFBMRF9TMl9PTiwgMCk7Ci0JCWdwaW9fc2V0X3ZhbHVlKFBMRF9TNF9PTiwgMCk7Ci0JCWdwaW9fc2V0X3ZhbHVlKFBMRF9MQ0RFTl9FTiwgMCk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRfbGNkX2RhdGEgcDcyMHRfbGNkX3Bvd2VyX3BkYXRhID0gewotCS5zZXRfcG93ZXIJPSBwNzIwdF9sY2RfcG93ZXJfc2V0LAotfTsKLQotc3RhdGljIHZvaWQgcDcyMHRfbGNkX2JhY2tsaWdodF9zZXRfaW50ZW5zaXR5KGludCBpbnRlbnNpdHkpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoUExEX1MzX09OLCBpbnRlbnNpdHkpOwotfQotCi1zdGF0aWMgc3RydWN0IGdlbmVyaWNfYmxfaW5mbyBwNzIwdF9sY2RfYmFja2xpZ2h0X3BkYXRhID0gewotCS5uYW1lCQkJPSAibGNkLWJhY2tsaWdodC4wIiwKLQkuZGVmYXVsdF9pbnRlbnNpdHkJPSAweDAxLAotCS5tYXhfaW50ZW5zaXR5CQk9IDB4MDEsCi0JLnNldF9ibF9pbnRlbnNpdHkJPSBwNzIwdF9sY2RfYmFja2xpZ2h0X3NldF9pbnRlbnNpdHksCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQKLWZpeHVwX3A3MjB0KHN0cnVjdCB0YWcgKnRhZywgY2hhciAqKmNtZGxpbmUpCi17Ci0JLyoKLQkgKiBPdXIgYm9vdGxvYWRlciBkb2Vzbid0IHNldHVwIGFueSB0YWdzICh5ZXQpLgotCSAqLwotCWlmICh0YWctPmhkci50YWcgIT0gQVRBR19DT1JFKSB7Ci0JCXRhZy0+aGRyLnRhZyA9IEFUQUdfQ09SRTsKLQkJdGFnLT5oZHIuc2l6ZSA9IHRhZ19zaXplKHRhZ19jb3JlKTsKLQkJdGFnLT51LmNvcmUuZmxhZ3MgPSAwOwotCQl0YWctPnUuY29yZS5wYWdlc2l6ZSA9IFBBR0VfU0laRTsKLQkJdGFnLT51LmNvcmUucm9vdGRldiA9IDB4MDEwMDsKLQotCQl0YWcgPSB0YWdfbmV4dCh0YWcpOwotCQl0YWctPmhkci50YWcgPSBBVEFHX01FTTsKLQkJdGFnLT5oZHIuc2l6ZSA9IHRhZ19zaXplKHRhZ19tZW0zMik7Ci0JCXRhZy0+dS5tZW0uc2l6ZSA9IDQwOTY7Ci0JCXRhZy0+dS5tZW0uc3RhcnQgPSBQSFlTX09GRlNFVDsKLQotCQl0YWcgPSB0YWdfbmV4dCh0YWcpOwotCQl0YWctPmhkci50YWcgPSBBVEFHX05PTkU7Ci0JCXRhZy0+aGRyLnNpemUgPSAwOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBncGlvX2xlZCBwNzIwdF9ncGlvX2xlZHNbXSA9IHsKLQl7Ci0JCS5uYW1lCQkJPSAiVXNlciBMRUQiLAotCQkuZGVmYXVsdF90cmlnZ2VyCT0gImhlYXJ0YmVhdCIsCi0JCS5ncGlvCQkJPSBQNzIwVF9VU0VSTEVELAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IGdwaW9fbGVkX3BsYXRmb3JtX2RhdGEgcDcyMHRfZ3Bpb19sZWRfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkubGVkcwkJPSBwNzIwdF9ncGlvX2xlZHMsCi0JLm51bV9sZWRzCT0gQVJSQVlfU0laRShwNzIwdF9ncGlvX2xlZHMpLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHA3MjB0X2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWNscHM3MTF4X2RldmljZXNfaW5pdCgpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW1ncGlvcyk7IGkrKykKLQkJcDcyMHRfbW1ncGlvX2luaXQobW1ncGlvc1tpXS5hZGRyYmFzZSwgbW1ncGlvc1tpXS5ncGlvYmFzZSk7Ci0KLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnA3MjB0X25hbmRfcGRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBwNzIwdF9pbml0X2xhdGUodm9pZCkKLXsKLQlXQVJOX09OKGdwaW9fcmVxdWVzdF9hcnJheShwNzIwdF9ncGlvcywgQVJSQVlfU0laRShwNzIwdF9ncGlvcykpKTsKLQotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKE5VTEwsICJwbGF0Zm9ybS1sY2QiLCAwLAotCQkJCSAgICAgICZwNzIwdF9sY2RfcG93ZXJfcGRhdGEsCi0JCQkJICAgICAgc2l6ZW9mKHA3MjB0X2xjZF9wb3dlcl9wZGF0YSkpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKE5VTEwsICJnZW5lcmljLWJsIiwgMCwKLQkJCQkgICAgICAmcDcyMHRfbGNkX2JhY2tsaWdodF9wZGF0YSwKLQkJCQkgICAgICBzaXplb2YocDcyMHRfbGNkX2JhY2tsaWdodF9wZGF0YSkpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInZpZGVvLWNscHM3MTF4IiwgMCwgTlVMTCwgMCk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoTlVMTCwgImxlZHMtZ3BpbyIsIDAsCi0JCQkJICAgICAgJnA3MjB0X2dwaW9fbGVkX3BkYXRhLAotCQkJCSAgICAgIHNpemVvZihwNzIwdF9ncGlvX2xlZF9wZGF0YSkpOwotfQotCi1NQUNISU5FX1NUQVJUKFA3MjBULCAiQVJNLVByb3NwZWN0b3I3MjBUIikKLQkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCi0JLmZpeHVwCQk9IGZpeHVwX3A3MjB0LAotCS5tYXBfaW8JCT0gY2xwczcxMXhfbWFwX2lvLAotCS5pbml0X2lycQk9IGNscHM3MTF4X2luaXRfaXJxLAotCS5pbml0X3RpbWUJPSBjbHBzNzExeF90aW1lcl9pbml0LAotCS5pbml0X21hY2hpbmUJPSBwNzIwdF9pbml0LAotCS5pbml0X2xhdGUJPSBwNzIwdF9pbml0X2xhdGUsCi0JLnJlc3RhcnQJPSBjbHBzNzExeF9yZXN0YXJ0LAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NvbW1vbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDY2ZGE4Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY29tbW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY29yZS5jCi0gKgotICogIENvcmUgc3VwcG9ydCBmb3IgdGhlIENMUFM3MTF4LWJhc2VkIG1hY2hpbmVzLgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEsMjAxMSBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtX21pc2MuaD4KLQotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KLQotI2luY2x1ZGUgImNvbW1vbi5oIgotCi0vKgotICogVGhpcyBtYXBzIHRoZSBnZW5lcmljIENMUFM3MTF4IHJlZ2lzdGVycwotICovCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGNscHM3MTF4X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSAodW5zaWduZWQgbG9uZylDTFBTNzExWF9WSVJUX0JBU0UsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihDTFBTNzExWF9QSFlTX0JBU0UpLAotCQkubGVuZ3RoCQk9IDQ4ICogU1pfMUssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9Ci19OwotCi12b2lkIF9faW5pdCBjbHBzNzExeF9tYXBfaW8odm9pZCkKLXsKLQlpb3RhYmxlX2luaXQoY2xwczcxMXhfaW9fZGVzYywgQVJSQVlfU0laRShjbHBzNzExeF9pb19kZXNjKSk7Ci19Ci0KLXZvaWQgX19pbml0IGNscHM3MTF4X2luaXRfaXJxKHZvaWQpCi17Ci0JY2xwczcxMXhfaW50Y19pbml0KENMUFM3MTFYX1BIWVNfQkFTRSwgU1pfMTZLKTsKLX0KLQotdm9pZCBfX2luaXQgY2xwczcxMXhfdGltZXJfaW5pdCh2b2lkKQotewotCWNscHM3MTF4X2Nsa19pbml0KENMUFM3MTFYX1ZJUlRfQkFTRSk7Ci0JY2xwczcxMXhfY2xrc3JjX2luaXQoQ0xQUzcxMVhfVklSVF9CQVNFICsgVEMxRCwKLQkJCSAgICAgQ0xQUzcxMVhfVklSVF9CQVNFICsgVEMyRCwgSVJRX1RDMk9JKTsKLX0KLQotdm9pZCBjbHBzNzExeF9yZXN0YXJ0KGVudW0gcmVib290X21vZGUgbW9kZSwgY29uc3QgY2hhciAqY21kKQotewotCXNvZnRfcmVzdGFydCgwKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2NvbW1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzAyMDBiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtY2xwczcxMXgvY29tbW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9jb21tb24uaAotICoKLSAqIENvbW1vbiBiaXRzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLQotI2RlZmluZSBDTFBTNzExWF9OUl9HUElPCSg0ICogOCArIDMpCi0jZGVmaW5lIENMUFM3MTFYX0dQSU8ocHJ0LCBiaXQpCSgocHJ0KSAqIDggKyAoYml0KSkKLQotZXh0ZXJuIHZvaWQgY2xwczcxMXhfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgY2xwczcxMXhfaW5pdF9pcnEodm9pZCk7Ci1leHRlcm4gdm9pZCBjbHBzNzExeF90aW1lcl9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgY2xwczcxMXhfcmVzdGFydChlbnVtIHJlYm9vdF9tb2RlIG1vZGUsIGNvbnN0IGNoYXIgKmNtZCk7Ci0KLS8qIGRyaXZlcnMvaXJxY2hpcC9pcnEtY2xwczcxMXguYyAqLwotdm9pZCBjbHBzNzExeF9pbnRjX2luaXQocGh5c19hZGRyX3QsIHJlc291cmNlX3NpemVfdCk7Ci0vKiBkcml2ZXJzL2Nsay9jbGstY2xwczcxMXguYyAqLwotdm9pZCBjbHBzNzExeF9jbGtfaW5pdCh2b2lkIF9faW9tZW0gKmJhc2UpOwotLyogZHJpdmVycy9jbG9ja3NvdXJjZS9jbHBzNzExeC10aW1lci5jICovCi12b2lkIGNscHM3MTF4X2Nsa3NyY19pbml0KHZvaWQgX19pb21lbSAqdGMxX2Jhc2UsIHZvaWQgX19pb21lbSAqdGMyX2Jhc2UsCi0JCQkgIHVuc2lnbmVkIGludCBpcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2RldmljZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhOTYxNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2RldmljZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogIENMUFM3MTFYIGNvbW1vbiBkZXZpY2VzIGRlZmluaXRpb25zCi0gKgotICogIEF1dGhvcjogQWxleGFuZGVyIFNoaXlhbiA8c2hjX3dvcmtAbWFpbC5ydT4sIDIwMTMtMjAxNAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzX3NvYy5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbV9pbmZvLmg+Ci0KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgY2xwczcxMXhfY3B1aWRsZV9yZXMgX19pbml0Y29uc3QgPQotCURFRklORV9SRVNfTUVNKENMUFM3MTFYX1BIWVNfQkFTRSArIEhBTFQsIFNaXzEyOCk7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBjbHBzNzExeF9hZGRfY3B1aWRsZSh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImNscHM3MTF4LWNwdWlkbGUiLCBQTEFURk9STV9ERVZJRF9OT05FLAotCQkJCQkmY2xwczcxMXhfY3B1aWRsZV9yZXMsIDEpOwotfQotCi1zdGF0aWMgY29uc3QgcGh5c19hZGRyX3QgY2xwczcxMXhfZ3Bpb3NbXVsyXSBfX2luaXRjb25zdCA9IHsKLQl7IFBBRFIsIFBBRERSIH0sCi0JeyBQQkRSLCBQQkREUiB9LAotCXsgUENEUiwgUENERFIgfSwKLQl7IFBERFIsIFBERERSIH0sCi0JeyBQRURSLCBQRUREUiB9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGNscHM3MTF4X2FkZF9ncGlvKHZvaWQpCi17Ci0JdW5zaWduZWQgaTsKLQlzdHJ1Y3QgcmVzb3VyY2UgZ3Bpb19yZXNbMl07Ci0KLQltZW1zZXQoZ3Bpb19yZXMsIDAsIHNpemVvZihncGlvX3JlcykpOwotCi0JZ3Bpb19yZXNbMF0uZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKLQlncGlvX3Jlc1sxXS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2xwczcxMXhfZ3Bpb3MpOyBpKyspIHsKLQkJZ3Bpb19yZXNbMF0uc3RhcnQgPSBDTFBTNzExWF9QSFlTX0JBU0UgKyBjbHBzNzExeF9ncGlvc1tpXVswXTsKLQkJZ3Bpb19yZXNbMF0uZW5kID0gZ3Bpb19yZXNbMF0uc3RhcnQ7Ci0JCWdwaW9fcmVzWzFdLnN0YXJ0ID0gQ0xQUzcxMVhfUEhZU19CQVNFICsgY2xwczcxMXhfZ3Bpb3NbaV1bMV07Ci0JCWdwaW9fcmVzWzFdLmVuZCA9IGdwaW9fcmVzWzFdLnN0YXJ0OwotCi0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImNscHM3MTF4LWdwaW8iLCBpLAotCQkJCQkJZ3Bpb19yZXMsIEFSUkFZX1NJWkUoZ3Bpb19yZXMpKTsKLQl9Ci19Ci0KLWNvbnN0IHN0cnVjdCByZXNvdXJjZSBjbHBzNzExeF9zeXNjb25fcmVzW10gX19pbml0Y29uc3QgPSB7Ci0JLyogU1lTQ09OMSwgU1lTRkxHMSAqLwotCURFRklORV9SRVNfTUVNKENMUFM3MTFYX1BIWVNfQkFTRSArIFNZU0NPTjEsIFNaXzEyOCksCi0JLyogU1lTQ09OMiwgU1lTRkxHMiAqLwotCURFRklORV9SRVNfTUVNKENMUFM3MTFYX1BIWVNfQkFTRSArIFNZU0NPTjIsIFNaXzEyOCksCi0JLyogU1lTQ09OMyAqLwotCURFRklORV9SRVNfTUVNKENMUFM3MTFYX1BIWVNfQkFTRSArIFNZU0NPTjMsIFNaXzY0KSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBjbHBzNzExeF9hZGRfc3lzY29uKHZvaWQpCi17Ci0JdW5zaWduZWQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNscHM3MTF4X3N5c2Nvbl9yZXMpOyBpKyspCi0JCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInN5c2NvbiIsIGkgKyAxLAotCQkJCQkJJmNscHM3MTF4X3N5c2Nvbl9yZXNbaV0sIDEpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlc291cmNlIGNscHM3MTF4X3VhcnQxX3Jlc1tdIF9faW5pdGNvbnN0ID0gewotCURFRklORV9SRVNfTUVNKENMUFM3MTFYX1BIWVNfQkFTRSArIFVBUlREUjEsIFNaXzEyOCksCi0JREVGSU5FX1JFU19JUlEoSVJRX1VUWElOVDEpLAotCURFRklORV9SRVNfSVJRKElSUV9VUlhJTlQxKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgY2xwczcxMXhfdWFydDJfcmVzW10gX19pbml0Y29uc3QgPSB7Ci0JREVGSU5FX1JFU19NRU0oQ0xQUzcxMVhfUEhZU19CQVNFICsgVUFSVERSMiwgU1pfMTI4KSwKLQlERUZJTkVfUkVTX0lSUShJUlFfVVRYSU5UMiksCi0JREVGSU5FX1JFU19JUlEoSVJRX1VSWElOVDIpLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGNscHM3MTF4X2FkZF91YXJ0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgiY2xwczcxMXgtdWFydCIsIDAsIGNscHM3MTF4X3VhcnQxX3JlcywKLQkJCQkJQVJSQVlfU0laRShjbHBzNzExeF91YXJ0MV9yZXMpKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJjbHBzNzExeC11YXJ0IiwgMSwgY2xwczcxMXhfdWFydDJfcmVzLAotCQkJCQlBUlJBWV9TSVpFKGNscHM3MTF4X3VhcnQyX3JlcykpOwotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGNscHM3MTF4X3NvY19pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHNvY19kZXZpY2VfYXR0cmlidXRlICpzb2NfZGV2X2F0dHI7Ci0Jc3RydWN0IHNvY19kZXZpY2UgKnNvY19kZXY7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwotCXUzMiBpZFs1XTsKLQotCWJhc2UgPSBpb3JlbWFwKENMUFM3MTFYX1BIWVNfQkFTRSwgU1pfMzJLKTsKLQlpZiAoIWJhc2UpCi0JCXJldHVybjsKLQotCWlkWzBdID0gcmVhZGwoYmFzZSArIFVOSVFJRCk7Ci0JaWRbMV0gPSByZWFkbChiYXNlICsgUkFORElEMCk7Ci0JaWRbMl0gPSByZWFkbChiYXNlICsgUkFORElEMSk7Ci0JaWRbM10gPSByZWFkbChiYXNlICsgUkFORElEMik7Ci0JaWRbNF0gPSByZWFkbChiYXNlICsgUkFORElEMyk7Ci0Jc3lzdGVtX3JldiA9IFNZU0ZMRzFfVkVSSUQocmVhZGwoYmFzZSArIFNZU0ZMRzEpKTsKLQotCWFkZF9kZXZpY2VfcmFuZG9tbmVzcyhpZCwgc2l6ZW9mKGlkKSk7Ci0KLQlzeXN0ZW1fc2VyaWFsX2xvdyA9IGlkWzBdOwotCi0Jc29jX2Rldl9hdHRyID0ga3phbGxvYyhzaXplb2YoKnNvY19kZXZfYXR0ciksIEdGUF9LRVJORUwpOwotCWlmICghc29jX2Rldl9hdHRyKQotCQlnb3RvIG91dF91bm1hcDsKLQotCXNvY19kZXZfYXR0ci0+bWFjaGluZSA9IG9mX2ZsYXRfZHRfZ2V0X21hY2hpbmVfbmFtZSgpOwotCXNvY19kZXZfYXR0ci0+ZmFtaWx5ID0gIkNpcnJ1cyBMb2dpYyBDTFBTNzExWCI7Ci0Jc29jX2Rldl9hdHRyLT5yZXZpc2lvbiA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXUiLCBzeXN0ZW1fcmV2KTsKLQlzb2NfZGV2X2F0dHItPnNvY19pZCA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJTA4eCIsIGlkWzBdKTsKLQotCXNvY19kZXYgPSBzb2NfZGV2aWNlX3JlZ2lzdGVyKHNvY19kZXZfYXR0cik7Ci0JaWYgKElTX0VSUihzb2NfZGV2KSkgewotCQlrZnJlZShzb2NfZGV2X2F0dHItPnJldmlzaW9uKTsKLQkJa2ZyZWUoc29jX2Rldl9hdHRyLT5zb2NfaWQpOwotCQlrZnJlZShzb2NfZGV2X2F0dHIpOwotCX0KLQotb3V0X3VubWFwOgotCWlvdW5tYXAoYmFzZSk7Ci19Ci0KLXZvaWQgX19pbml0IGNscHM3MTF4X2RldmljZXNfaW5pdCh2b2lkKQotewotCWNscHM3MTF4X2FkZF9jcHVpZGxlKCk7Ci0JY2xwczcxMXhfYWRkX2dwaW8oKTsKLQljbHBzNzExeF9hZGRfc3lzY29uKCk7Ci0JY2xwczcxMXhfYWRkX3VhcnQoKTsKLQljbHBzNzExeF9zb2NfaW5pdCgpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbHBzNzExeC9kZXZpY2VzLmggYi9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2RldmljZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVlZmMxNy4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWNscHM3MTF4L2RldmljZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8qCi0gKiAgQ0xQUzcxMVggY29tbW9uIGRldmljZXMgZGVmaW5pdGlvbnMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEzIEFsZXhhbmRlciBTaGl5YW4gPHNoY193b3JrQG1haWwucnU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi12b2lkIGNscHM3MTF4X2RldmljZXNfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtY25zM3h4eC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L0tjb25maWcKaW5kZXggZWIxNGEwZi4uNWZkODM2YiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L0tjb25maWcKQEAgLTIsNyArMiw2IEBACiAJYm9vbCAiQ2F2aXVtIE5ldHdvcmtzIENOUzNYWFggZmFtaWx5IgogCWRlcGVuZHMgb24gQVJDSF9NVUxUSV9WNgogCXNlbGVjdCBBUk1fR0lDCi0Jc2VsZWN0IFBDSV9ET01BSU5TIGlmIFBDSQogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIENhdml1bSBOZXR3b3JrcyBDTlMzWFhYIHBsYXRmb3JtLgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvS2NvbmZpZwppbmRleCBiMDg1ODU1Li4wYmI2M2I4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL0tjb25maWcKQEAgLTEyNyw4ICsxMjcsNiBAQAogCXNlbGVjdCBBUkNIX0RNQV9BRERSX1RfNjRCSVQgaWYgQVJNX0xQQUUKIAlzZWxlY3QgSEFWRV9BUk1fQVJDSF9USU1FUgogCXNlbGVjdCBBVVRPX1pSRUxBRERSCi0Jc2VsZWN0IE1JR0hUX0hBVkVfUENJCi0Jc2VsZWN0IFBDSV9ET01BSU5TIGlmIFBDSQogCXNlbGVjdCBQSU5DVFJMX0VYWU5PUzU0NDAKIAlzZWxlY3QgUE1fT1BQCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3Mvc3VzcGVuZC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc3VzcGVuZC5jCmluZGV4IDM3NTA1NzUuLjA2MzMyZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL3N1c3BlbmQuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zdXNwZW5kLmMKQEAgLTI1NSw2ICsyNTUsMTIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJLyoKKwkgKiBDbGVhciB0aGUgT0ZfUE9QVUxBVEVEIGZsYWcgc2V0IGluIG9mX2lycV9pbml0IHNvIHRoYXQKKwkgKiBsYXRlciB0aGUgRXh5bm9zIFBNVSBwbGF0Zm9ybSBkZXZpY2Ugd29uJ3QgYmUgc2tpcHBlZC4KKwkgKi8KKwlvZl9ub2RlX2NsZWFyX2ZsYWcobm9kZSwgT0ZfUE9QVUxBVEVEKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKaW5kZXggMDJmNmQ3YS4uMjBkNWFkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtNTksNyArNTksNyBAQAogI2RlZmluZSBYQlVTX1NXSVRDSF9KMTdfMTEJKCgqWEJVU19TV0lUQ0gpICYgKDEgPDwgNSkpCiAjZGVmaW5lIFhCVVNfU1dJVENIX0oxN185CSgoKlhCVVNfU1dJVENIKSAmICgxIDw8IDYpKQogCi0jZGVmaW5lIFVOQ0FDSEVBQkxFX0FERFIJKEFSTUNTUl9CQVNFICsgMHgxMDgpCisjZGVmaW5lIFVOQ0FDSEVBQkxFX0FERFIJKEFSTUNTUl9CQVNFICsgMHgxMDgpCS8qIENTUl9ST01CQVNFTUFTSyAqLwogCiAKIC8qIFBJQyBpcnEgY29udHJvbCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtaW14L0tjb25maWcKaW5kZXggZWU5YTMxOC4uOTE1NWI2MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWlteC9LY29uZmlnCkBAIC02NCwxMyArNjQsNiBAQAogY29uZmlnIEFSQ0hfTVhDX0lPTVVYX1YzCiAJYm9vbAogCi1jb25maWcgU09DX0lNWDEKLQlib29sCi0Jc2VsZWN0IENQVV9BUk05MjBUCi0Jc2VsZWN0IElNWF9IQVZFX0lPTVVYX1YxCi0Jc2VsZWN0IE1YQ19BVklDCi0Jc2VsZWN0IFBJTkNUUkxfSU1YMQotCiBjb25maWcgU09DX0lNWDIxCiAJYm9vbAogCXNlbGVjdCBDUFVfQVJNOTI2VApAQCAtODgsNyArODEsNiBAQAogCWJvb2wKIAlzZWxlY3QgQ1BVX1Y2CiAJc2VsZWN0IE1YQ19BVklDCi0Jc2VsZWN0IFNNUF9PTl9VUCBpZiBTTVAKIAogY29uZmlnIFNPQ19JTVgzNQogCWJvb2wKQEAgLTk2LDM1ICs4OCw2IEBACiAJc2VsZWN0IEhBVkVfRVBJVAogCXNlbGVjdCBNWENfQVZJQwogCXNlbGVjdCBQSU5DVFJMX0lNWDM1Ci0Jc2VsZWN0IFNNUF9PTl9VUCBpZiBTTVAKLQotaWYgQVJDSF9NVUxUSV9WNFQKLQotY29tbWVudCAiTVgxIHBsYXRmb3JtczoiCi0KLWNvbmZpZyBNQUNIX1NDQjkzMjgKLQlib29sICJTeW5lcnRyb25peHggc2NiOTMyOCIKLQlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX1VBUlQKLQlzZWxlY3QgU09DX0lNWDEKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgdXNpbmcgYSBTeW5lcnRyb25peHggc2NiOTMyOCBib2FyZAotCi1jb25maWcgTUFDSF9BUEY5MzI4Ci0JYm9vbCAiQVBGOTMyOCIKLQlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fSU1YX0kyQwotCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9JTVhfVUFSVAotCXNlbGVjdCBTT0NfSU1YMQotCWhlbHAKLQkgIFNheSBZZXMgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBBcm1hZGV1cyBBUEY5MzI4IGRldmVsb3BtZW50IGJvYXJkCi0KLWNvbmZpZyBNQUNIX0lNWDFfRFQKLQlib29sICJTdXBwb3J0IGkuTVgxIHBsYXRmb3JtcyBmcm9tIGRldmljZSB0cmVlIgotCXNlbGVjdCBTT0NfSU1YMQotCWhlbHAKLQkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgRnJlZXNjYWxlIGkuTVgxIGJhc2VkIHBsYXRmb3JtcwotCSAgdXNpbmcgdGhlIGRldmljZSB0cmVlIGZvciBkaXNjb3ZlcnkuCi0KLWVuZGlmCiAKIGlmIEFSQ0hfTVVMVElfVjUKIApAQCAtNDYxLDYgKzQyNCwxOCBAQAogCiBjb21tZW50ICJEZXZpY2UgdHJlZSBvbmx5IgogCitpZiBBUkNIX01VTFRJX1Y0VAorCitjb25maWcgU09DX0lNWDEKKwlib29sICJpLk1YMSBzdXBwb3J0IgorCXNlbGVjdCBDUFVfQVJNOTIwVAorCXNlbGVjdCBNWENfQVZJQworCXNlbGVjdCBQSU5DVFJMX0lNWDEKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgRnJlZXNjYWxlIGkuTVgxIHByb2Nlc3NvcgorCitlbmRpZgorCiBpZiBBUkNIX01VTFRJX1Y1CiAKIGNvbmZpZyBTT0NfSU1YMjUKQEAgLTUyMyw3ICs0OTgsNiBAQAogCXNlbGVjdCBBUk1fRVJSQVRBXzc2NDM2OSBpZiBTTVAKIAlzZWxlY3QgSEFWRV9BUk1fU0NVIGlmIFNNUAogCXNlbGVjdCBIQVZFX0FSTV9UV0QKLQlzZWxlY3QgUENJX0RPTUFJTlMgaWYgUENJCiAJc2VsZWN0IFBJTkNUUkxfSU1YNlEKIAlzZWxlY3QgU09DX0lNWDYKIApAQCAtNTY5LDcgKzU0Myw2IEBACiAJYm9vbCAiRnJlZXNjYWxlIExTMTAyMUEgc3VwcG9ydCIKIAlzZWxlY3QgQVJNX0dJQwogCXNlbGVjdCBIQVZFX0FSTV9BUkNIX1RJTUVSCi0Jc2VsZWN0IFBDSV9ET01BSU5TIGlmIFBDSQogCXNlbGVjdCBaT05FX0RNQSBpZiBBUk1fTFBBRQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBGcmVlc2NhbGUgTFMxMDIxQSBwcm9jZXNzb3IuCkBAIC01ODUsNyArNTU4LDYgQEAKIAlzZWxlY3QgQVJNX0dJQyBpZiBBUkNIX01VTFRJX1Y3CiAJc2VsZWN0IFBJTkNUUkxfVkY2MTAKIAlzZWxlY3QgUEwzMTBfRVJSQVRBXzc2OTQxOSBpZiBDQUNIRV9MMlgwCi0Jc2VsZWN0IFNNUF9PTl9VUCBpZiBTTVAKIAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBGcmVlc2NhbGUgVnlicmlkIFZGNjEwIHByb2Nlc3Nvci4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUKaW5kZXggNTc0ZTViOC4uY2FiMTI4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUKQEAgLTEsNiArMSw1IEBACiBvYmoteSA6PSBjcHUubyBzeXN0ZW0ubyBpcnEtY29tbW9uLm8KIAotb2JqLSQoQ09ORklHX1NPQ19JTVgxKSArPSBtbS1pbXgxLm8KIG9iai0kKENPTkZJR19TT0NfSU1YMjEpICs9IG1tLWlteDIxLm8KIAogb2JqLSQoQ09ORklHX1NPQ19JTVgyNSkgKz0gY3B1LWlteDI1Lm8gbWFjaC1pbXgyNS5vIHBtLWlteDI1Lm8KQEAgLTM2LDExICszNSw2IEBACiBvYmoteSArPSBzc2ktZmlxLWtzeW0ubwogZW5kaWYKIAotIyBpLk1YMSBiYXNlZCBtYWNoaW5lcwotb2JqLSQoQ09ORklHX01BQ0hfU0NCOTMyOCkgKz0gbWFjaC1zY2I5MzI4Lm8KLW9iai0kKENPTkZJR19NQUNIX0FQRjkzMjgpICs9IG1hY2gtYXBmOTMyOC5vCi1vYmotJChDT05GSUdfTUFDSF9JTVgxX0RUKSArPSBpbXgxLWR0Lm8KLQogIyBpLk1YMjEgYmFzZWQgbWFjaGluZXMKIG9iai0kKENPTkZJR19NQUNIX01YMjFBRFMpICs9IG1hY2gtbXgyMWFkcy5vCiAKQEAgLTk0LDYgKzg4LDcgQEAKIGVuZGlmCiBvYmotJChDT05GSUdfU09DX0lNWDYpICs9IHBtLWlteDYubwogCitvYmotJChDT05GSUdfU09DX0lNWDEpICs9IG1hY2gtaW14MS5vCiBvYmotJChDT05GSUdfU09DX0lNWDUwKSArPSBtYWNoLWlteDUwLm8KIG9iai0kKENPTkZJR19TT0NfSU1YNTEpICs9IG1hY2gtaW14NTEubwogb2JqLSQoQ09ORklHX1NPQ19JTVg1MykgKz0gbWFjaC1pbXg1My5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jb21tb24uaCBiL2FyY2gvYXJtL21hY2gtaW14L2NvbW1vbi5oCmluZGV4IGZiNjQ0MzAuLmM0NDM2ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2NvbW1vbi5oCkBAIC0yMSwyOSArMjEsMjQgQEAKIGVudW0gbXhjX2NwdV9wd3JfbW9kZTsKIHN0cnVjdCBvZl9kZXZpY2VfaWQ7CiAKLXZvaWQgbXgxX21hcF9pbyh2b2lkKTsKIHZvaWQgbXgyMV9tYXBfaW8odm9pZCk7CiB2b2lkIG14MjdfbWFwX2lvKHZvaWQpOwogdm9pZCBteDMxX21hcF9pbyh2b2lkKTsKIHZvaWQgbXgzNV9tYXBfaW8odm9pZCk7Ci12b2lkIGlteDFfaW5pdF9lYXJseSh2b2lkKTsKIHZvaWQgaW14MjFfaW5pdF9lYXJseSh2b2lkKTsKIHZvaWQgaW14MjdfaW5pdF9lYXJseSh2b2lkKTsKIHZvaWQgaW14MzFfaW5pdF9lYXJseSh2b2lkKTsKIHZvaWQgaW14MzVfaW5pdF9lYXJseSh2b2lkKTsKIHZvaWQgbXhjX2luaXRfaXJxKHZvaWQgX19pb21lbSAqKTsKLXZvaWQgbXgxX2luaXRfaXJxKHZvaWQpOwogdm9pZCBteDIxX2luaXRfaXJxKHZvaWQpOwogdm9pZCBteDI3X2luaXRfaXJxKHZvaWQpOwogdm9pZCBteDMxX2luaXRfaXJxKHZvaWQpOwogdm9pZCBteDM1X2luaXRfaXJxKHZvaWQpOwotdm9pZCBpbXgxX3NvY19pbml0KHZvaWQpOwogdm9pZCBpbXgyMV9zb2NfaW5pdCh2b2lkKTsKIHZvaWQgaW14Mjdfc29jX2luaXQodm9pZCk7CiB2b2lkIGlteDMxX3NvY19pbml0KHZvaWQpOwogdm9pZCBpbXgzNV9zb2NfaW5pdCh2b2lkKTsKIHZvaWQgZXBpdF90aW1lcl9pbml0KHZvaWQgX19pb21lbSAqYmFzZSwgaW50IGlycSk7Ci1pbnQgbXgxX2Nsb2Nrc19pbml0KHVuc2lnbmVkIGxvbmcgZnJlZik7CiBpbnQgbXgyMV9jbG9ja3NfaW5pdCh1bnNpZ25lZCBsb25nIGxyZWYsIHVuc2lnbmVkIGxvbmcgZnJlZik7CiBpbnQgbXgyN19jbG9ja3NfaW5pdCh1bnNpZ25lZCBsb25nIGZyZWYpOwogaW50IG14MzFfY2xvY2tzX2luaXQodW5zaWduZWQgbG9uZyBmcmVmKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMtaW14MS5oIGIvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YjVhZmMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy1pbXgxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFBlbmd1dHJvbml4Ci0gKiBVd2UgS2xlaW5lLUtvZW5pZyA8dS5rbGVpbmUta29lbmlnQHBlbmd1dHJvbml4LmRlPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi0gKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpbmNsdWRlICJkZXZpY2VzL2RldmljZXMtY29tbW9uLmgiCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW14X2lteF9mYl9kYXRhIGlteDFfaW14X2ZiX2RhdGE7Ci0jZGVmaW5lIGlteDFfYWRkX2lteF9mYihwZGF0YSkgXAotICAgIGlteF9hZGRfaW14X2ZiKCZpbXgxX2lteF9mYl9kYXRhLCBwZGF0YSkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbXhfaW14X2kyY19kYXRhIGlteDFfaW14X2kyY19kYXRhOwotI2RlZmluZSBpbXgxX2FkZF9pbXhfaTJjKHBkYXRhKQkJXAotCWlteF9hZGRfaW14X2kyYygmaW14MV9pbXhfaTJjX2RhdGEsIHBkYXRhKQotCi1leHRlcm4gY29uc3Qgc3RydWN0IGlteF9pbXhfdWFydF8zaXJxX2RhdGEgaW14MV9pbXhfdWFydF9kYXRhW107Ci0jZGVmaW5lIGlteDFfYWRkX2lteF91YXJ0KGlkLCBwZGF0YSkJXAotCWlteF9hZGRfaW14X3VhcnRfM2lycSgmaW14MV9pbXhfdWFydF9kYXRhW2lkXSwgcGRhdGEpCi0jZGVmaW5lIGlteDFfYWRkX2lteF91YXJ0MChwZGF0YSkJaW14MV9hZGRfaW14X3VhcnQoMCwgcGRhdGEpCi0jZGVmaW5lIGlteDFfYWRkX2lteF91YXJ0MShwZGF0YSkJaW14MV9hZGRfaW14X3VhcnQoMSwgcGRhdGEpCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaW14X3NwaV9pbXhfZGF0YSBpbXgxX2NzcGlfZGF0YVtdOwotI2RlZmluZSBpbXgxX2FkZF9jc3BpKGlkLCBwZGF0YSkgICBcCi0JaW14X2FkZF9zcGlfaW14KCZpbXgxX2NzcGlfZGF0YVtpZF0sIHBkYXRhKQotCi0jZGVmaW5lIGlteDFfYWRkX3NwaV9pbXgwKHBkYXRhKSBpbXgxX2FkZF9jc3BpKDAsIHBkYXRhKQotI2RlZmluZSBpbXgxX2FkZF9zcGlfaW14MShwZGF0YSkgaW14MV9hZGRfY3NwaSgxLCBwZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzL01ha2VmaWxlCmluZGV4IGU1Y2Y1ODcuLmFhNmNlZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy9NYWtlZmlsZQpAQCAtMjAsNyArMjAsNiBAQAogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX01YQ19FSENJKSArPSBwbGF0Zm9ybS1teGMtZWhjaS5vCiBvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fTVhDX01NQykgKz0gcGxhdGZvcm0tbXhjLW1tYy5vCiBvYmotJChDT05GSUdfSU1YX0hBVkVfUExBVEZPUk1fTVhDX05BTkQpICs9IHBsYXRmb3JtLW14Y19uYW5kLm8KLW9iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9NWENfUk5HQSkgKz0gcGxhdGZvcm0tbXhjX3JuZ2Eubwogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX01YQ19SVEMpICs9IHBsYXRmb3JtLW14Y19ydGMubwogb2JqLSQoQ09ORklHX0lNWF9IQVZFX1BMQVRGT1JNX01YQ19XMSkgKz0gcGxhdGZvcm0tbXhjX3cxLm8KIG9iai0kKENPTkZJR19JTVhfSEFWRV9QTEFURk9STV9TREhDSV9FU0RIQ19JTVgpICs9IHBsYXRmb3JtLXNkaGNpLWVzZGhjLWlteC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzL2RldmljZXMtY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzL2RldmljZXMtY29tbW9uLmgKaW5kZXggMDljZWJkOC4uNjkyMGUzNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy9kZXZpY2VzLWNvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMvZGV2aWNlcy1jb21tb24uaApAQCAtMTU0LDE4ICsxNTQsNiBAQAogCQljb25zdCBzdHJ1Y3QgaW14X3NzaV9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CiAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3NlcmlhbC1pbXguaD4KLXN0cnVjdCBpbXhfaW14X3VhcnRfM2lycV9kYXRhIHsKLQlpbnQgaWQ7Ci0JcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZTsKLQlyZXNvdXJjZV9zaXplX3QgaW9zaXplOwotCXJlc291cmNlX3NpemVfdCBpcnFyeDsKLQlyZXNvdXJjZV9zaXplX3QgaXJxdHg7Ci0JcmVzb3VyY2Vfc2l6ZV90IGlycXJ0czsKLX07Ci1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9pbXhfdWFydF8zaXJxKAotCQljb25zdCBzdHJ1Y3QgaW14X2lteF91YXJ0XzNpcnFfZGF0YSAqZGF0YSwKLQkJY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpOwotCiBzdHJ1Y3QgaW14X2lteF91YXJ0XzFpcnFfZGF0YSB7CiAJaW50IGlkOwogCXJlc291cmNlX3NpemVfdCBpb2Jhc2U7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzL3BsYXRmb3JtLWlteC1mYi5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtZmIuYwppbmRleCA3ZGY2MzI4Li5hYTAwMjcyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzL3BsYXRmb3JtLWlteC1mYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMvcGxhdGZvcm0taW14LWZiLmMKQEAgLTE5LDExICsxOSw2IEBACiAJCS5pcnEgPSBzb2MgIyMgX0lOVF9MQ0RDLAkJCQlcCiAJfQogCi0jaWZkZWYgQ09ORklHX1NPQ19JTVgxCi1jb25zdCBzdHJ1Y3QgaW14X2lteF9mYl9kYXRhIGlteDFfaW14X2ZiX2RhdGEgX19pbml0Y29uc3QgPQotCWlteF9pbXhfZmJfZGF0YV9lbnRyeV9zaW5nbGUoTVgxLCAiaW14MS1mYiIsIFNaXzRLKTsKLSNlbmRpZiAvKiBpZmRlZiBDT05GSUdfU09DX0lNWDEgKi8KLQogI2lmZGVmIENPTkZJR19TT0NfSU1YMjEKIGNvbnN0IHN0cnVjdCBpbXhfaW14X2ZiX2RhdGEgaW14MjFfaW14X2ZiX2RhdGEgX19pbml0Y29uc3QgPQogCWlteF9pbXhfZmJfZGF0YV9lbnRyeV9zaW5nbGUoTVgyMSwgImlteDIxLWZiIiwgU1pfNEspOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtaTJjLmMgYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzL3BsYXRmb3JtLWlteC1pMmMuYwppbmRleCBhZTk3OTE1Li45ODIyYmVkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzL3BsYXRmb3JtLWlteC1pMmMuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzL3BsYXRmb3JtLWlteC1pMmMuYwpAQCAtMjEsMTEgKzIxLDYgQEAKICNkZWZpbmUgaW14X2lteF9pMmNfZGF0YV9lbnRyeShzb2MsIF9kZXZpZCwgX2lkLCBfaHdpZCwgX3NpemUpCQlcCiAJW19pZF0gPSBpbXhfaW14X2kyY19kYXRhX2VudHJ5X3NpbmdsZShzb2MsIF9kZXZpZCwgX2lkLCBfaHdpZCwgX3NpemUpCiAKLSNpZmRlZiBDT05GSUdfU09DX0lNWDEKLWNvbnN0IHN0cnVjdCBpbXhfaW14X2kyY19kYXRhIGlteDFfaW14X2kyY19kYXRhIF9faW5pdGNvbnN0ID0KLQlpbXhfaW14X2kyY19kYXRhX2VudHJ5X3NpbmdsZShNWDEsICJpbXgxLWkyYyIsIDAsICwgU1pfNEspOwotI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YMSAqLwotCiAjaWZkZWYgQ09ORklHX1NPQ19JTVgyMQogY29uc3Qgc3RydWN0IGlteF9pbXhfaTJjX2RhdGEgaW14MjFfaW14X2kyY19kYXRhIF9faW5pdGNvbnN0ID0KIAlpbXhfaW14X2kyY19kYXRhX2VudHJ5X3NpbmdsZShNWDIxLCAiaW14MjEtaTJjIiwgMCwgLCBTWl80Syk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzL3BsYXRmb3JtLWlteC11YXJ0LmMgYi9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzL3BsYXRmb3JtLWlteC11YXJ0LmMKaW5kZXggNjk2MmNmZi4uZTNjODllOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvZGV2aWNlcy9wbGF0Zm9ybS1pbXgtdWFydC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMvcGxhdGZvcm0taW14LXVhcnQuYwpAQCAtMjcsMTUgKzI3LDYgQEAKIAkJLmlycSA9IHNvYyAjIyBfSU5UX1VBUlQgIyMgX2h3aWQsCQkJXAogCX0KIAotI2lmZGVmIENPTkZJR19TT0NfSU1YMQotY29uc3Qgc3RydWN0IGlteF9pbXhfdWFydF8zaXJxX2RhdGEgaW14MV9pbXhfdWFydF9kYXRhW10gX19pbml0Y29uc3QgPSB7Ci0jZGVmaW5lIGlteDFfaW14X3VhcnRfZGF0YV9lbnRyeShfaWQsIF9od2lkKQkJCQlcCi0JaW14X2lteF91YXJ0XzNpcnFfZGF0YV9lbnRyeShNWDEsIF9pZCwgX2h3aWQsIDB4ZDApCi0JaW14MV9pbXhfdWFydF9kYXRhX2VudHJ5KDAsIDEpLAotCWlteDFfaW14X3VhcnRfZGF0YV9lbnRyeSgxLCAyKSwKLX07Ci0jZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVgxICovCi0KICNpZmRlZiBDT05GSUdfU09DX0lNWDIxCiBjb25zdCBzdHJ1Y3QgaW14X2lteF91YXJ0XzFpcnFfZGF0YSBpbXgyMV9pbXhfdWFydF9kYXRhW10gX19pbml0Y29uc3QgPSB7CiAjZGVmaW5lIGlteDIxX2lteF91YXJ0X2RhdGFfZW50cnkoX2lkLCBfaHdpZCkJCQkJXApAQCAtODIsMzQgKzczLDYgQEAKIH07CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVgzNSAqLwogCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9pbXhfdWFydF8zaXJxKAotCQljb25zdCBzdHJ1Y3QgaW14X2lteF91YXJ0XzNpcnFfZGF0YSAqZGF0YSwKLQkJY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCi17Ci0Jc3RydWN0IHJlc291cmNlIHJlc1tdID0gewotCQl7Ci0JCQkuc3RhcnQgPSBkYXRhLT5pb2Jhc2UsCi0JCQkuZW5kID0gZGF0YS0+aW9iYXNlICsgZGF0YS0+aW9zaXplIC0gMSwKLQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAotCQl9LCB7Ci0JCQkuc3RhcnQgPSBkYXRhLT5pcnFyeCwKLQkJCS5lbmQgPSBkYXRhLT5pcnFyeCwKLQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCQl9LCB7Ci0JCQkuc3RhcnQgPSBkYXRhLT5pcnF0eCwKLQkJCS5lbmQgPSBkYXRhLT5pcnF0eCwKLQkJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCQl9LCB7Ci0JCQkuc3RhcnQgPSBkYXRhLT5pcnFydHMsCi0JCQkuZW5kID0gZGF0YS0+aXJxcngsCi0JCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQkJfSwKLQl9OwotCi0JcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKCJpbXgxLXVhcnQiLCBkYXRhLT5pZCwgcmVzLAotCQkJQVJSQVlfU0laRShyZXMpLCBwZGF0YSwgc2l6ZW9mKCpwZGF0YSkpOwotfQotCiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQgaW14X2FkZF9pbXhfdWFydF8xaXJxKAogCQljb25zdCBzdHJ1Y3QgaW14X2lteF91YXJ0XzFpcnFfZGF0YSAqZGF0YSwKIAkJY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9kZXZpY2VzL3BsYXRmb3JtLXNwaV9pbXguYyBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMvcGxhdGZvcm0tc3BpX2lteC5jCmluZGV4IDVlOTcwN2IuLmQ5M2M0NDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMvcGxhdGZvcm0tc3BpX2lteC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2RldmljZXMvcGxhdGZvcm0tc3BpX2lteC5jCkBAIC0yMSwxNSArMjEsNiBAQAogI2RlZmluZSBpbXhfc3BpX2lteF9kYXRhX2VudHJ5KHNvYywgdHlwZSwgZGV2aWQsIGlkLCBod2lkLCBzaXplKQlcCiAJW2lkXSA9IGlteF9zcGlfaW14X2RhdGFfZW50cnlfc2luZ2xlKHNvYywgdHlwZSwgZGV2aWQsIGlkLCBod2lkLCBzaXplKQogCi0jaWZkZWYgQ09ORklHX1NPQ19JTVgxCi1jb25zdCBzdHJ1Y3QgaW14X3NwaV9pbXhfZGF0YSBpbXgxX2NzcGlfZGF0YVtdIF9faW5pdGNvbnN0ID0gewotI2RlZmluZSBpbXgxX2NzcGlfZGF0YV9lbnRyeShfaWQsIF9od2lkKSBcCi0JaW14X3NwaV9pbXhfZGF0YV9lbnRyeShNWDEsIENTUEksICJpbXgxLWNzcGkiLCBfaWQsIF9od2lkLCBTWl80SykKLQlpbXgxX2NzcGlfZGF0YV9lbnRyeSgwLCAxKSwKLQlpbXgxX2NzcGlfZGF0YV9lbnRyeSgxLCAyKSwKLX07Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19TT0NfSU1YMjEKIGNvbnN0IHN0cnVjdCBpbXhfc3BpX2lteF9kYXRhIGlteDIxX2NzcGlfZGF0YVtdIF9faW5pdGNvbnN0ID0gewogI2RlZmluZSBpbXgyMV9jc3BpX2RhdGFfZW50cnkoX2lkLCBfaHdpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtaW14L2hhcmR3YXJlLmgKaW5kZXggZDczN2Y5NS4uOTBlMTBjYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9oYXJkd2FyZS5oCkBAIC0xMTIsNyArMTEyLDYgQEAKICNpbmNsdWRlICJteDJ4LmgiCiAjaW5jbHVkZSAibXgyMS5oIgogI2luY2x1ZGUgIm14MjcuaCIKLSNpbmNsdWRlICJteDEuaCIKIAogI2RlZmluZSBpbXhfbWFwX2VudHJ5KHNvYywgbmFtZSwgX3R5cGUpCXsJCQkJXAogCS52aXJ0dWFsID0gc29jICMjIF9JT19QMlYoc29jICMjIF8gIyMgbmFtZSAjIyBfQkFTRV9BRERSKSwJXApAQCAtMTIxLDcgKzEyMCw3IEBACiAJLnR5cGUgPSBfdHlwZSwJCQkJCQkJXAogfQogCi0vKiBUaGVyZSdzIGEgb2ZmLWJ5LW9uZSBiZXR3ZWVtIHRoZSBncGlvIGJhbmsgbnVtYmVyIGFuZCB0aGUgZ3Bpb2NoaXAgKi8KKy8qIFRoZXJlJ3MgYW4gb2ZmLWJ5LW9uZSBiZXR3ZWVuIHRoZSBncGlvIGJhbmsgbnVtYmVyIGFuZCB0aGUgZ3Bpb2NoaXAgKi8KIC8qIHJhbmdlIGUuZy4gR1BJT18xXzUgaXMgZ3BpbyA1IHVuZGVyIGxpbnV4ICovCiAjZGVmaW5lIElNWF9HUElPX05SKGJhbmssIG5yKQkJKCgoYmFuaykgLSAxKSAqIDMyICsgKG5yKSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvaW14MS1kdC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvaW14MS1kdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjkxNWIwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2lteDEtZHQuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiAgQ29weXJpZ2h0IChDKSAyMDE0IEFsZXhhbmRlciBTaGl5YW4gPHNoY193b3JrQG1haWwucnU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpbXgxX2R0X2JvYXJkX2NvbXBhdFtdIF9faW5pdGNvbnN0ID0gewotCSJmc2wsaW14MSIsCi0JTlVMTAotfTsKLQotRFRfTUFDSElORV9TVEFSVChJTVgxX0RULCAiRnJlZXNjYWxlIGkuTVgxIChEZXZpY2UgVHJlZSBTdXBwb3J0KSIpCi0JLm1hcF9pbwkJPSBteDFfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gaW14MV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG14MV9pbml0X2lycSwKLQkuZHRfY29tcGF0CT0gaW14MV9kdF9ib2FyZF9jb21wYXQsCi0JLnJlc3RhcnQJPSBteGNfcmVzdGFydCwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9pb211eC1teDEuaCBiL2FyY2gvYXJtL21hY2gtaW14L2lvbXV4LW14MS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY0NjgxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2lvbXV4LW14MS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgU2FzY2hhIEhhdWVyIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCi0gKiBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLSNpZm5kZWYgX19NQUNIX0lPTVVYX01YMV9IX18KLSNkZWZpbmUgX19NQUNIX0lPTVVYX01YMV9IX18KLQotI2luY2x1ZGUgImlvbXV4LXYxLmgiCi0KLSNkZWZpbmUgUEEwX0FJTl9TUEkyX0NMSwkoR1BJT19QT1JUQSB8IEdQSU9fQUlOIHwgR1BJT19PVVQgfCAwKQotI2RlZmluZSBQQTBfQUZfRVRNVFJBQ0VTWU5DCShHUElPX1BPUlRBIHwgR1BJT19BRiB8IDApCi0jZGVmaW5lIFBBMV9BT1VUX1NQSTJfUlhECShHUElPX1BPUlRBIHwgR1BJT19BT1VUIHwgR1BJT19JTiB8IDEpCi0jZGVmaW5lIFBBMV9QRl9USU4JCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDEpCi0jZGVmaW5lIFBBMl9QRl9QV00wCQkoR1BJT19QT1JUQSB8IEdQSU9fUEYgfCBHUElPX09VVCB8IDIpCi0jZGVmaW5lIFBBM19QRl9DU0lfTUNMSwkJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgMykKLSNkZWZpbmUgUEE0X1BGX0NTSV9EMAkJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgNCkKLSNkZWZpbmUgUEE1X1BGX0NTSV9EMQkJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgNSkKLSNkZWZpbmUgUEE2X1BGX0NTSV9EMgkJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgNikKLSNkZWZpbmUgUEE3X1BGX0NTSV9EMwkJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgNykKLSNkZWZpbmUgUEE4X1BGX0NTSV9ENAkJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgOCkKLSNkZWZpbmUgUEE5X1BGX0NTSV9ENQkJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgOSkKLSNkZWZpbmUgUEExMF9QRl9DU0lfRDYJCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDEwKQotI2RlZmluZSBQQTExX1BGX0NTSV9ENwkJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgMTEpCi0jZGVmaW5lIFBBMTJfUEZfQ1NJX1ZTWU5DCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDEyKQotI2RlZmluZSBQQTEzX1BGX0NTSV9IU1lOQwkoR1BJT19QT1JUQSB8IEdQSU9fUEYgfCAxMykKLSNkZWZpbmUgUEExNF9QRl9DU0lfUElYQ0xLCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDE0KQotI2RlZmluZSBQQTE1X1BGX0kyQ19TREEJCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IEdQSU9fT1VUIHwgMTUpCi0jZGVmaW5lIFBBMTZfUEZfSTJDX1NDTAkJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgR1BJT19PVVQgfCAxNikKLSNkZWZpbmUgUEExN19BRl9FVE1UUkFDRVBLVDQJKEdQSU9fUE9SVEEgfCBHUElPX0FGIHwgMTcpCi0jZGVmaW5lIFBBMTdfQUlOX1NQSTJfU1MJKEdQSU9fUE9SVEEgfCBHUElPX0FJTiB8IEdQSU9fT1VUIHwgMTcpCi0jZGVmaW5lIFBBMThfQUZfRVRNVFJBQ0VQS1Q1CShHUElPX1BPUlRBIHwgR1BJT19BRiB8IDE4KQotI2RlZmluZSBQQTE5X0FGX0VUTVRSQUNFUEtUNgkoR1BJT19QT1JUQSB8IEdQSU9fQUYgfCAxOSkKLSNkZWZpbmUgUEEyMF9BRl9FVE1UUkFDRVBLVDcJKEdQSU9fUE9SVEEgfCBHUElPX0FGIHwgMjApCi0jZGVmaW5lIFBBMjFfUEZfQTAJCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDIxKQotI2RlZmluZSBQQTIyX1BGX0NTNAkJKEdQSU9fUE9SVEEgfCBHUElPX1BGIHwgMjIpCi0jZGVmaW5lIFBBMjNfUEZfQ1M1CQkoR1BJT19QT1JUQSB8IEdQSU9fUEYgfCAyMykKLSNkZWZpbmUgUEEyNF9QRl9BMTYJCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDI0KQotI2RlZmluZSBQQTI0X0FGX0VUTVRSQUNFUEtUMAkoR1BJT19QT1JUQSB8IEdQSU9fQUYgfCAyNCkKLSNkZWZpbmUgUEEyNV9QRl9BMTcJCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDI1KQotI2RlZmluZSBQQTI1X0FGX0VUTVRSQUNFUEtUMQkoR1BJT19QT1JUQSB8IEdQSU9fQUYgfCAyNSkKLSNkZWZpbmUgUEEyNl9QRl9BMTgJCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDI2KQotI2RlZmluZSBQQTI2X0FGX0VUTVRSQUNFUEtUMgkoR1BJT19QT1JUQSB8IEdQSU9fQUYgfCAyNikKLSNkZWZpbmUgUEEyN19QRl9BMTkJCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDI3KQotI2RlZmluZSBQQTI3X0FGX0VUTVRSQUNFUEtUMwkoR1BJT19QT1JUQSB8IEdQSU9fQUYgfCAyNykKLSNkZWZpbmUgUEEyOF9QRl9BMjAJCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDI4KQotI2RlZmluZSBQQTI4X0FGX0VUTVBJUEVTVEFUMAkoR1BJT19QT1JUQSB8IEdQSU9fQUYgfCAyOCkKLSNkZWZpbmUgUEEyOV9QRl9BMjEJCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDI5KQotI2RlZmluZSBQQTI5X0FGX0VUTVBJUEVTVEFUMQkoR1BJT19QT1JUQSB8IEdQSU9fQUYgfCAyOSkKLSNkZWZpbmUgUEEzMF9QRl9BMjIJCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDMwKQotI2RlZmluZSBQQTMwX0FGX0VUTVBJUEVTVEFUMgkoR1BJT19QT1JUQSB8IEdQSU9fQUYgfCAzMCkKLSNkZWZpbmUgUEEzMV9QRl9BMjMJCShHUElPX1BPUlRBIHwgR1BJT19QRiB8IDMxKQotI2RlZmluZSBQQTMxX0FGX0VUTVRSQUNFQ0xLCShHUElPX1BPUlRBIHwgR1BJT19BRiB8IDMxKQotI2RlZmluZSBQQjhfUEZfU0RfREFUMAkJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgR1BJT19QVUVOIHwgOCkKLSNkZWZpbmUgUEI4X0FGX01TX1BJTwkJKEdQSU9fUE9SVEIgfCBHUElPX0FGIHwgOCkKLSNkZWZpbmUgUEI5X1BGX1NEX0RBVDEJCShHUElPX1BPUlRCIHwgR1BJT19QRiB8IEdQSU9fUFVFTiB8IDkpCi0jZGVmaW5lIFBCOV9BRl9NU19QSTEJCShHUElPX1BPUlRCIHwgR1BJT19BRiB8IDkpCi0jZGVmaW5lIFBCMTBfUEZfU0RfREFUMgkJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgR1BJT19QVUVOIHwgMTApCi0jZGVmaW5lIFBCMTBfQUZfTVNfU0NMS0kJKEdQSU9fUE9SVEIgfCBHUElPX0FGIHwgMTApCi0jZGVmaW5lIFBCMTFfUEZfU0RfREFUMwkJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgMTEpCi0jZGVmaW5lIFBCMTFfQUZfTVNfU0RJTwkJKEdQSU9fUE9SVEIgfCBHUElPX0FGIHwgMTEpCi0jZGVmaW5lIFBCMTJfUEZfU0RfQ0xLCQkoR1BJT19QT1JUQiB8IEdQSU9fUEYgfCAxMikKLSNkZWZpbmUgUEIxMl9BRl9NU19TQ0xLMAkoR1BJT19QT1JUQiB8IEdQSU9fQUYgfCAxMikKLSNkZWZpbmUgUEIxM19QRl9TRF9DTUQJCShHUElPX1BPUlRCIHwgR1BJT19QRiB8IEdQSU9fUFVFTiB8IDEzKQotI2RlZmluZSBQQjEzX0FGX01TX0JTCQkoR1BJT19QT1JUQiB8IEdQSU9fQUYgfCAxMykKLSNkZWZpbmUgUEIxNF9BRl9TU0lfUlhGUwkoR1BJT19QT1JUQiB8IEdQSU9fQUYgfCAxNCkKLSNkZWZpbmUgUEIxNV9BRl9TU0lfUlhDTEsJKEdQSU9fUE9SVEIgfCBHUElPX0FGIHwgMTUpCi0jZGVmaW5lIFBCMTZfQUZfU1NJX1JYREFUCShHUElPX1BPUlRCIHwgR1BJT19BRiB8IEdQSU9fSU4gfCAxNikKLSNkZWZpbmUgUEIxN19BRl9TU0lfVFhEQVQJKEdQSU9fUE9SVEIgfCBHUElPX0FGIHwgR1BJT19PVVQgfCAxNykKLSNkZWZpbmUgUEIxOF9BRl9TU0lfVFhGUwkoR1BJT19QT1JUQiB8IEdQSU9fQUYgfCAxOCkKLSNkZWZpbmUgUEIxOV9BRl9TU0lfVFhDTEsJKEdQSU9fUE9SVEIgfCBHUElPX0FGIHwgMTkpCi0jZGVmaW5lIFBCMjBfUEZfVVNCRF9BRkUJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgMjApCi0jZGVmaW5lIFBCMjFfUEZfVVNCRF9PRQkJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgMjEpCi0jZGVmaW5lIFBCMjJfUEZfVVNCRF9SQ1YJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgMjIpCi0jZGVmaW5lIFBCMjNfUEZfVVNCRF9TVVNQTkQJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgMjMpCi0jZGVmaW5lIFBCMjRfUEZfVVNCRF9WUAkJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgMjQpCi0jZGVmaW5lIFBCMjVfUEZfVVNCRF9WTQkJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgMjUpCi0jZGVmaW5lIFBCMjZfUEZfVVNCRF9WUE8JKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgMjYpCi0jZGVmaW5lIFBCMjdfUEZfVVNCRF9WTU8JKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgMjcpCi0jZGVmaW5lIFBCMjhfUEZfVUFSVDJfQ1RTCShHUElPX1BPUlRCIHwgR1BJT19QRiB8IEdQSU9fT1VUIHwgMjgpCi0jZGVmaW5lIFBCMjlfUEZfVUFSVDJfUlRTCShHUElPX1BPUlRCIHwgR1BJT19QRiB8IEdQSU9fSU4gfCAyOSkKLSNkZWZpbmUgUEIzMF9QRl9VQVJUMl9UWEQJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgR1BJT19PVVQgfCAzMCkKLSNkZWZpbmUgUEIzMV9QRl9VQVJUMl9SWEQJKEdQSU9fUE9SVEIgfCBHUElPX1BGIHwgR1BJT19JTiB8IDMxKQotI2RlZmluZSBQQzNfUEZfU1NJX1JYRlMJCShHUElPX1BPUlRDIHwgR1BJT19QRiB8IDMpCi0jZGVmaW5lIFBDNF9QRl9TU0lfUlhDTEsJKEdQSU9fUE9SVEMgfCBHUElPX1BGIHwgNCkKLSNkZWZpbmUgUEM1X1BGX1NTSV9SWERBVAkoR1BJT19QT1JUQyB8IEdQSU9fUEYgfCBHUElPX0lOIHwgNSkKLSNkZWZpbmUgUEM2X1BGX1NTSV9UWERBVAkoR1BJT19QT1JUQyB8IEdQSU9fUEYgfCBHUElPX09VVCB8IDYpCi0jZGVmaW5lIFBDN19QRl9TU0lfVFhGUwkJKEdQSU9fUE9SVEMgfCBHUElPX1BGIHwgNykKLSNkZWZpbmUgUEM4X1BGX1NTSV9UWENMSwkoR1BJT19QT1JUQyB8IEdQSU9fUEYgfCA4KQotI2RlZmluZSBQQzlfUEZfVUFSVDFfQ1RTCShHUElPX1BPUlRDIHwgR1BJT19QRiB8IEdQSU9fT1VUIHwgOSkKLSNkZWZpbmUgUEMxMF9QRl9VQVJUMV9SVFMJKEdQSU9fUE9SVEMgfCBHUElPX1BGIHwgR1BJT19JTiB8IDEwKQotI2RlZmluZSBQQzExX1BGX1VBUlQxX1RYRAkoR1BJT19QT1JUQyB8IEdQSU9fUEYgfCBHUElPX09VVCB8IDExKQotI2RlZmluZSBQQzEyX1BGX1VBUlQxX1JYRAkoR1BJT19QT1JUQyB8IEdQSU9fUEYgfCBHUElPX0lOIHwgMTIpCi0jZGVmaW5lIFBDMTNfUEZfU1BJMV9TUElfUkRZCShHUElPX1BPUlRDIHwgR1BJT19QRiB8IDEzKQotI2RlZmluZSBQQzE0X1BGX1NQSTFfU0NMSwkoR1BJT19QT1JUQyB8IEdQSU9fUEYgfCAxNCkKLSNkZWZpbmUgUEMxNV9QRl9TUEkxX1NTCQkoR1BJT19QT1JUQyB8IEdQSU9fUEYgfCAxNSkKLSNkZWZpbmUgUEMxNl9QRl9TUEkxX01JU08JKEdQSU9fUE9SVEMgfCBHUElPX1BGIHwgMTYpCi0jZGVmaW5lIFBDMTdfUEZfU1BJMV9NT1NJCShHUElPX1BPUlRDIHwgR1BJT19QRiB8IDE3KQotI2RlZmluZSBQQzI0X0JJTl9VQVJUM19SSQkoR1BJT19QT1JUQyB8IEdQSU9fQklOIHwgR1BJT19PVVQgfCAyNCkKLSNkZWZpbmUgUEMyNV9CSU5fVUFSVDNfRFNSCShHUElPX1BPUlRDIHwgR1BJT19CSU4gfCBHUElPX09VVCB8IDI1KQotI2RlZmluZSBQQzI2X0FPVVRfVUFSVDNfRFRSCShHUElPX1BPUlRDIHwgR1BJT19BT1VUIHwgR1BJT19JTiB8IDI2KQotI2RlZmluZSBQQzI3X0JJTl9VQVJUM19EQ0QJKEdQSU9fUE9SVEMgfCBHUElPX0JJTiB8IEdQSU9fT1VUIHwgMjcpCi0jZGVmaW5lIFBDMjhfQklOX1VBUlQzX0NUUwkoR1BJT19QT1JUQyB8IEdQSU9fQklOIHwgR1BJT19PVVQgfCAyOCkKLSNkZWZpbmUgUEMyOV9BT1VUX1VBUlQzX1JUUwkoR1BJT19QT1JUQyB8IEdQSU9fQU9VVCB8IEdQSU9fSU4gfCAyOSkKLSNkZWZpbmUgUEMzMF9CSU5fVUFSVDNfVFgJKEdQSU9fUE9SVEMgfCBHUElPX0JJTiB8IDMwKQotI2RlZmluZSBQQzMxX0FPVVRfVUFSVDNfUlgJKEdQSU9fUE9SVEMgfCBHUElPX0FPVVQgfCBHUElPX0lOIHwgMzEpCi0jZGVmaW5lIFBENl9QRl9MU0NMSwkJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgR1BJT19PVVQgfCA2KQotI2RlZmluZSBQRDdfUEZfUkVWCQkoR1BJT19QT1JURCB8IEdQSU9fUEYgfCA3KQotI2RlZmluZSBQRDdfQUZfVUFSVDJfRFRSCShHUElPX1BPUlREIHwgR1BJT19BRiB8IEdQSU9fSU4gfCA3KQotI2RlZmluZSBQRDdfQUlOX1NQSTJfU0NMSwkoR1BJT19QT1JURCB8IEdQSU9fQUlOIHwgNykKLSNkZWZpbmUgUEQ4X1BGX0NMUwkJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgOCkKLSNkZWZpbmUgUEQ4X0FGX1VBUlQyX0RDRAkoR1BJT19QT1JURCB8IEdQSU9fQUYgfCBHUElPX09VVCB8IDgpCi0jZGVmaW5lIFBEOF9BSU5fU1BJMl9TUwkJKEdQSU9fUE9SVEQgfCBHUElPX0FJTiB8IDgpCi0jZGVmaW5lIFBEOV9QRl9QUwkJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgOSkKLSNkZWZpbmUgUEQ5X0FGX1VBUlQyX1JJCQkoR1BJT19QT1JURCB8IEdQSU9fQUYgfCBHUElPX09VVCB8IDkpCi0jZGVmaW5lIFBEOV9BT1VUX1NQSTJfUlhECShHUElPX1BPUlREIHwgR1BJT19BT1VUIHwgR1BJT19JTiB8IDkpCi0jZGVmaW5lIFBEMTBfUEZfU1BMX1NQUgkJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgR1BJT19PVVQgfCAxMCkKLSNkZWZpbmUgUEQxMF9BRl9VQVJUMl9EU1IJKEdQSU9fUE9SVEQgfCBHUElPX0FGIHwgR1BJT19PVVQgfCAxMCkKLSNkZWZpbmUgUEQxMF9BSU5fU1BJMl9UWEQJKEdQSU9fUE9SVEQgfCBHUElPX0FJTiB8IEdQSU9fT1VUIHwgMTApCi0jZGVmaW5lIFBEMTFfUEZfQ09OVFJBU1QJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgR1BJT19PVVQgfCAxMSkKLSNkZWZpbmUgUEQxMl9QRl9BQ0RfT0UJCShHUElPX1BPUlREIHwgR1BJT19QRiB8IEdQSU9fT1VUIHwgMTIpCi0jZGVmaW5lIFBEMTNfUEZfTFBfSFNZTkMJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgR1BJT19PVVQgfCAxMykKLSNkZWZpbmUgUEQxNF9QRl9GTE1fVlNZTkMJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgR1BJT19PVVQgfCAxNCkKLSNkZWZpbmUgUEQxNV9QRl9MRDAJCShHUElPX1BPUlREIHwgR1BJT19QRiB8IEdQSU9fT1VUIHwgMTUpCi0jZGVmaW5lIFBEMTZfUEZfTEQxCQkoR1BJT19QT1JURCB8IEdQSU9fUEYgfCBHUElPX09VVCB8IDE2KQotI2RlZmluZSBQRDE3X1BGX0xEMgkJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgR1BJT19PVVQgfCAxNykKLSNkZWZpbmUgUEQxOF9QRl9MRDMJCShHUElPX1BPUlREIHwgR1BJT19QRiB8IEdQSU9fT1VUIHwgMTgpCi0jZGVmaW5lIFBEMTlfUEZfTEQ0CQkoR1BJT19QT1JURCB8IEdQSU9fUEYgfCBHUElPX09VVCB8IDE5KQotI2RlZmluZSBQRDIwX1BGX0xENQkJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgR1BJT19PVVQgfCAyMCkKLSNkZWZpbmUgUEQyMV9QRl9MRDYJCShHUElPX1BPUlREIHwgR1BJT19QRiB8IEdQSU9fT1VUIHwgMjEpCi0jZGVmaW5lIFBEMjJfUEZfTEQ3CQkoR1BJT19QT1JURCB8IEdQSU9fUEYgfCBHUElPX09VVCB8IDIyKQotI2RlZmluZSBQRDIzX1BGX0xEOAkJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgR1BJT19PVVQgfCAyMykKLSNkZWZpbmUgUEQyNF9QRl9MRDkJCShHUElPX1BPUlREIHwgR1BJT19QRiB8IEdQSU9fT1VUIHwgMjQpCi0jZGVmaW5lIFBEMjVfUEZfTEQxMAkJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgR1BJT19PVVQgfCAyNSkKLSNkZWZpbmUgUEQyNl9QRl9MRDExCQkoR1BJT19QT1JURCB8IEdQSU9fUEYgfCBHUElPX09VVCB8IDI2KQotI2RlZmluZSBQRDI3X1BGX0xEMTIJCShHUElPX1BPUlREIHwgR1BJT19QRiB8IEdQSU9fT1VUIHwgMjcpCi0jZGVmaW5lIFBEMjhfUEZfTEQxMwkJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgR1BJT19PVVQgfCAyOCkKLSNkZWZpbmUgUEQyOV9QRl9MRDE0CQkoR1BJT19QT1JURCB8IEdQSU9fUEYgfCBHUElPX09VVCB8IDI5KQotI2RlZmluZSBQRDMwX1BGX0xEMTUJCShHUElPX1BPUlREIHwgR1BJT19QRiB8IEdQSU9fT1VUIHwgMzApCi0jZGVmaW5lIFBEMzFfUEZfVE1SMk9VVAkJKEdQSU9fUE9SVEQgfCBHUElPX1BGIHwgMzEpCi0jZGVmaW5lIFBEMzFfQklOX1NQSTJfVFhECShHUElPX1BPUlREIHwgR1BJT19CSU4gfCAzMSkKLQotI2VuZGlmIC8qIGlmbmRlZiBfX01BQ0hfSU9NVVhfTVgxX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvaW9tdXgtbXgzLmggYi9hcmNoL2FybS9tYWNoLWlteC9pb211eC1teDMuaAppbmRleCAyZTRhMGRkLi4zNjg2NjdiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9pb211eC1teDMuaAorKysgYi9hcmNoL2FybS9tYWNoLWlteC9pb211eC1teDMuaApAQCAtNTk4LDEwICs1OTgsNyBAQAogI2RlZmluZSBNWDMxX1BJTl9DT05UUkFTVF9fQ09OVFJBU1QJSU9NVVhfTU9ERShNWDMxX1BJTl9DT05UUkFTVCwgSU9NVVhfQ09ORklHX0ZVTkMpCiAjZGVmaW5lIE1YMzFfUElOX0QzX1NQTF9fRDNfU1BMCQlJT01VWF9NT0RFKE1YMzFfUElOX0QzX1NQTCwgSU9NVVhfQ09ORklHX0ZVTkMpCiAjZGVmaW5lIE1YMzFfUElOX0QzX0NMU19fRDNfQ0xTCQlJT01VWF9NT0RFKE1YMzFfUElOX0QzX0NMUywgSU9NVVhfQ09ORklHX0ZVTkMpCi0jZGVmaW5lIE1YMzFfUElOX0xDUzBfX0dQSTAzXzIzCQlJT01VWF9NT0RFKE1YMzFfUElOX0xDUzAsIElPTVVYX0NPTkZJR19HUElPKQogI2RlZmluZSBNWDMxX1BJTl9HUElPMV8xX19HUElPICAgICAgICAgIElPTVVYX01PREUoTVgzMV9QSU5fR1BJTzFfMSwgSU9NVVhfQ09ORklHX0dQSU8pCi0jZGVmaW5lIE1YMzFfUElOX0kyQ19DTEtfX1NDTAkJSU9NVVhfTU9ERShNWDMxX1BJTl9JMkNfQ0xLLCBJT01VWF9DT05GSUdfRlVOQykKLSNkZWZpbmUgTVgzMV9QSU5fSTJDX0RBVF9fU0RBCQlJT01VWF9NT0RFKE1YMzFfUElOX0kyQ19EQVQsIElPTVVYX0NPTkZJR19GVU5DKQogI2RlZmluZSBNWDMxX1BJTl9EQ0RfRFRFMV9fSTJDMl9TREEJSU9NVVhfTU9ERShNWDMxX1BJTl9EQ0RfRFRFMSwgSU9NVVhfQ09ORklHX0FMVDIpCiAjZGVmaW5lIE1YMzFfUElOX1JJX0RURTFfX0kyQzJfU0NMCUlPTVVYX01PREUoTVgzMV9QSU5fUklfRFRFMSwgSU9NVVhfQ09ORklHX0FMVDIpCiAjZGVmaW5lIE1YMzFfUElOX0NTUEkyX1NTMl9fSTJDM19TREEJSU9NVVhfTU9ERShNWDMxX1BJTl9DU1BJMl9TUzIsIElPTVVYX0NPTkZJR19BTFQxKQpAQCAtNjY1LDM3ICs2NjIsNiBAQAogI2RlZmluZSBNWDMxX1BJTl9VU0JfT0NfX0dQSU8xXzMwCUlPTVVYX01PREUoTVgzMV9QSU5fVVNCX09DLCBJT01VWF9DT05GSUdfR1BJTykKICNkZWZpbmUgTVgzMV9QSU5fSTJDX0RBVF9fSTJDMV9TREEJSU9NVVhfTU9ERShNWDMxX1BJTl9JMkNfREFULCBJT01VWF9DT05GSUdfRlVOQykKICNkZWZpbmUgTVgzMV9QSU5fSTJDX0NMS19fSTJDMV9TQ0wJSU9NVVhfTU9ERShNWDMxX1BJTl9JMkNfQ0xLLCBJT01VWF9DT05GSUdfRlVOQykKLSNkZWZpbmUgTVgzMV9QSU5fRENEX0RURTFfX0kyQzJfU0RBCUlPTVVYX01PREUoTVgzMV9QSU5fRENEX0RURTEsIElPTVVYX0NPTkZJR19BTFQyKQotI2RlZmluZSBNWDMxX1BJTl9SSV9EVEUxX19JMkMyX1NDTAlJT01VWF9NT0RFKE1YMzFfUElOX1JJX0RURTEsIElPTVVYX0NPTkZJR19BTFQyKQotI2RlZmluZSBNWDMxX1BJTl9BVEFfQ1MwX19HUElPM18yNglJT01VWF9NT0RFKE1YMzFfUElOX0FUQV9DUzAsIElPTVVYX0NPTkZJR19HUElPKQotI2RlZmluZSBNWDMxX1BJTl9BVEFfQ1MxX19HUElPM18yNwlJT01VWF9NT0RFKE1YMzFfUElOX0FUQV9DUzEsIElPTVVYX0NPTkZJR19HUElPKQotI2RlZmluZSBNWDMxX1BJTl9QQ19QV1JPTl9fU0QyX0RBVEEzCUlPTVVYX01PREUoTVgzMV9QSU5fUENfUFdST04sIElPTVVYX0NPTkZJR19BTFQxKQotI2RlZmluZSBNWDMxX1BJTl9QQ19WUzFfX1NEMl9EQVRBMglJT01VWF9NT0RFKE1YMzFfUElOX1BDX1ZTMSwgSU9NVVhfQ09ORklHX0FMVDEpCi0jZGVmaW5lIE1YMzFfUElOX1BDX1JFQURZX19TRDJfREFUQTEJSU9NVVhfTU9ERShNWDMxX1BJTl9QQ19SRUFEWSwgSU9NVVhfQ09ORklHX0FMVDEpCi0jZGVmaW5lIE1YMzFfUElOX1BDX1dBSVRfQl9fU0QyX0RBVEEwCUlPTVVYX01PREUoTVgzMV9QSU5fUENfV0FJVF9CLCBJT01VWF9DT05GSUdfQUxUMSkKLSNkZWZpbmUgTVgzMV9QSU5fUENfQ0QyX0JfX1NEMl9DTEsJSU9NVVhfTU9ERShNWDMxX1BJTl9QQ19DRDJfQiwgSU9NVVhfQ09ORklHX0FMVDEpCi0jZGVmaW5lIE1YMzFfUElOX1BDX0NEMV9CX19TRDJfQ01ECUlPTVVYX01PREUoTVgzMV9QSU5fUENfQ0QxX0IsIElPTVVYX0NPTkZJR19BTFQxKQotI2RlZmluZSBNWDMxX1BJTl9BVEFfRElPUl9fR1BJTzNfMjgJSU9NVVhfTU9ERShNWDMxX1BJTl9BVEFfRElPUiwgSU9NVVhfQ09ORklHX0dQSU8pCi0jZGVmaW5lIE1YMzFfUElOX0FUQV9ESU9XX19HUElPM18yOQlJT01VWF9NT0RFKE1YMzFfUElOX0FUQV9ESU9XLCBJT01VWF9DT05GSUdfR1BJTykKLSNkZWZpbmUgTVgzMV9QSU5fQ1NJX0Q0X19DU0lfRDQJCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NJX0Q0LCBJT01VWF9DT05GSUdfRlVOQykKLSNkZWZpbmUgTVgzMV9QSU5fQ1NJX0Q1X19DU0lfRDUJCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NJX0Q1LCBJT01VWF9DT05GSUdfRlVOQykKLSNkZWZpbmUgTVgzMV9QSU5fQ1NJX0Q2X19DU0lfRDYJCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NJX0Q2LCBJT01VWF9DT05GSUdfRlVOQykKLSNkZWZpbmUgTVgzMV9QSU5fQ1NJX0Q3X19DU0lfRDcJCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NJX0Q3LCBJT01VWF9DT05GSUdfRlVOQykKLSNkZWZpbmUgTVgzMV9QSU5fQ1NJX0Q4X19DU0lfRDgJCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NJX0Q4LCBJT01VWF9DT05GSUdfRlVOQykKLSNkZWZpbmUgTVgzMV9QSU5fQ1NJX0Q5X19DU0lfRDkJCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NJX0Q5LCBJT01VWF9DT05GSUdfRlVOQykKLSNkZWZpbmUgTVgzMV9QSU5fQ1NJX0QxMF9fQ1NJX0QxMAlJT01VWF9NT0RFKE1YMzFfUElOX0NTSV9EMTAsIElPTVVYX0NPTkZJR19GVU5DKQotI2RlZmluZSBNWDMxX1BJTl9DU0lfRDExX19DU0lfRDExCUlPTVVYX01PREUoTVgzMV9QSU5fQ1NJX0QxMSwgSU9NVVhfQ09ORklHX0ZVTkMpCi0jZGVmaW5lIE1YMzFfUElOX0NTSV9EMTJfX0NTSV9EMTIJSU9NVVhfTU9ERShNWDMxX1BJTl9DU0lfRDEyLCBJT01VWF9DT05GSUdfRlVOQykKLSNkZWZpbmUgTVgzMV9QSU5fQ1NJX0QxM19fQ1NJX0QxMwlJT01VWF9NT0RFKE1YMzFfUElOX0NTSV9EMTMsIElPTVVYX0NPTkZJR19GVU5DKQotI2RlZmluZSBNWDMxX1BJTl9DU0lfRDE0X19DU0lfRDE0CUlPTVVYX01PREUoTVgzMV9QSU5fQ1NJX0QxNCwgSU9NVVhfQ09ORklHX0ZVTkMpCi0jZGVmaW5lIE1YMzFfUElOX0NTSV9EMTVfX0NTSV9EMTUJSU9NVVhfTU9ERShNWDMxX1BJTl9DU0lfRDE1LCBJT01VWF9DT05GSUdfRlVOQykKLSNkZWZpbmUgTVgzMV9QSU5fQ1NJX0hTWU5DX19DU0lfSFNZTkMJSU9NVVhfTU9ERShNWDMxX1BJTl9DU0lfSFNZTkMsIElPTVVYX0NPTkZJR19GVU5DKQotI2RlZmluZSBNWDMxX1BJTl9DU0lfTUNMS19fQ1NJX01DTEsJSU9NVVhfTU9ERShNWDMxX1BJTl9DU0lfTUNMSywgSU9NVVhfQ09ORklHX0ZVTkMpCi0jZGVmaW5lIE1YMzFfUElOX0NTSV9QSVhDTEtfX0NTSV9QSVhDTEsJSU9NVVhfTU9ERShNWDMxX1BJTl9DU0lfUElYQ0xLLCBJT01VWF9DT05GSUdfRlVOQykKLSNkZWZpbmUgTVgzMV9QSU5fQ1NJX1ZTWU5DX19DU0lfVlNZTkMJSU9NVVhfTU9ERShNWDMxX1BJTl9DU0lfVlNZTkMsIElPTVVYX0NPTkZJR19GVU5DKQotI2RlZmluZSBNWDMxX1BJTl9HUElPM18wX19HUElPM18wCUlPTVVYX01PREUoTVgzMV9QSU5fR1BJTzNfMCwgSU9NVVhfQ09ORklHX0dQSU8pCi0jZGVmaW5lIE1YMzFfUElOX0dQSU8zXzFfX0dQSU8zXzEJSU9NVVhfTU9ERShNWDMxX1BJTl9HUElPM18xLCBJT01VWF9DT05GSUdfR1BJTykKLSNkZWZpbmUgTVgzMV9QSU5fVFhEMl9fR1BJTzFfMjgJCUlPTVVYX01PREUoTVgzMV9QSU5fVFhEMiwgSU9NVVhfQ09ORklHX0dQSU8pCiAjZGVmaW5lIE1YMzFfUElOX0dQSU8xXzBfX0dQSU8xXzAJSU9NVVhfTU9ERShNWDMxX1BJTl9HUElPMV8wLCBJT01VWF9DT05GSUdfR1BJTykKICNkZWZpbmUgTVgzMV9QSU5fU1ZFTjBfX0dQSU8yXzAJCUlPTVVYX01PREUoTVgzMV9QSU5fU1ZFTjAsIElPTVVYX0NPTkZJR19HUElPKQogI2RlZmluZSBNWDMxX1BJTl9TVFgwX19HUElPMl8xCQlJT01VWF9NT0RFKE1YMzFfUElOX1NUWDAsIElPTVVYX0NPTkZJR19HUElPKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1hcGY5MzI4LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWFwZjkzMjguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiYjVhYi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWFwZjkzMjguYworKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1hcGY5MzI4LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMSBBUk1hZGV1cyBzeXN0ZW1zIDxzdXBwb3J0QGFybWFkZXVzLmNvbT4KLSAqCi0gKiBUaGlzIHdvcmsgaXMgYmFzZWQgb24gbWFjaC1zY2I5MzI4LmMgd2hpY2ggaXM6Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2FzY2hhIEhhdWVyIDxzYXNjaGFoYXVlckB3ZWIuZGU+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBKdWVyZ2VuIEJlaXNlcnQgPGpiZWlzZXJ0QG5ldHNjYXBlLm5ldD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvZG05MDAwLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0jaW5jbHVkZSAiZGV2aWNlcy1pbXgxLmgiCi0jaW5jbHVkZSAiaGFyZHdhcmUuaCIKLSNpbmNsdWRlICJpb211eC1teDEuaCIKLQotc3RhdGljIGNvbnN0IGludCBhcGY5MzI4X3BpbnNbXSBfX2luaXRjb25zdCA9IHsKLQkvKiBVQVJUMSAqLwotCVBDOV9QRl9VQVJUMV9DVFMsCi0JUEMxMF9QRl9VQVJUMV9SVFMsCi0JUEMxMV9QRl9VQVJUMV9UWEQsCi0JUEMxMl9QRl9VQVJUMV9SWEQsCi0JLyogVUFSVDIgKi8KLQlQQjI4X1BGX1VBUlQyX0NUUywKLQlQQjI5X1BGX1VBUlQyX1JUUywKLQlQQjMwX1BGX1VBUlQyX1RYRCwKLQlQQjMxX1BGX1VBUlQyX1JYRCwKLQkvKiBJMkMgKi8KLQlQQTE1X1BGX0kyQ19TREEsCi0JUEExNl9QRl9JMkNfU0NMLAotfTsKLQotLyoKLSAqIFRoZSBBUEY5MzI4IGNhbiBoYXZlIHVwIHRvIDMyTUIgTk9SIEZsYXNoCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CT0gTVgxX0NTMF9QSFlTLAotCS5lbmQJPSBNWDFfQ1MwX1BIWVMgKyBTWl8zMk0gLSAxLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgYXBmOTMyOF9mbGFzaF9kYXRhID0gewotCS53aWR0aCAgPSAyLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgYXBmOTMyOF9mbGFzaF9kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAotCS5pZAkJPSAwLAotCS5kZXYgPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhID0gJmFwZjkzMjhfZmxhc2hfZGF0YSwKLQl9LAotCS5yZXNvdXJjZSA9ICZmbGFzaF9yZXNvdXJjZSwKLQkubnVtX3Jlc291cmNlcyA9IDEsCi19OwotCi0vKgotICogQVBGOTMyOCBoYXMgYSBETTkwMDAgRXRoZXJuZXQgY29udHJvbGxlcgotICovCi1zdGF0aWMgc3RydWN0IGRtOTAwMF9wbGF0X2RhdGEgZG05MDAwX3NldHVwID0gewotCS5mbGFncyAgICAgICAgICA9IERNOTAwMF9QTEFURl8xNkJJVE9OTFkKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZG05MDAwX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0ICA9IE1YMV9DUzRfUEhZUyArIDB4MDBDMDAwMDAsCi0JCS5lbmQgICAgPSBNWDFfQ1M0X1BIWVMgKyAweDAwQzAwMDAxLAotCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwgewotCQkuc3RhcnQgID0gTVgxX0NTNF9QSFlTICsgMHgwMEMwMDAwMiwKLQkJLmVuZCAgICA9IE1YMV9DUzRfUEhZUyArIDB4MDBDMDAwMDMsCi0JCS5mbGFncyAgPSBJT1JFU09VUkNFX01FTSwKLQl9LCB7Ci0JCS8qIGlycSBudW1iZXIgaXMgcnVuLXRpbWUgYXNzaWduZWQgKi8KLQkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9JUlFfTE9XTEVWRUwsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRtOTAwMHhfZGV2aWNlID0gewotCS5uYW1lCQk9ICJkbTkwMDAiLAotCS5pZAkJPSAwLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShkbTkwMDBfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPSBkbTkwMDBfcmVzb3VyY2VzLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZkbTkwMDBfc2V0dXAsCi0JfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgdWFydDFfcGRhdGEgX19pbml0Y29uc3QgPSB7Ci0JLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW14aTJjX3BsYXRmb3JtX2RhdGEgYXBmOTMyOF9pMmNfZGF0YSBfX2luaXRjb25zdCA9IHsKLQkuYml0cmF0ZSA9IDEwMDAwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKLQkmYXBmOTMyOF9mbGFzaF9kZXZpY2UsCi0JJmRtOTAwMHhfZGV2aWNlLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGFwZjkzMjhfaW5pdCh2b2lkKQotewotCWlteDFfc29jX2luaXQoKTsKLQotCW14Y19ncGlvX3NldHVwX211bHRpcGxlX3BpbnMoYXBmOTMyOF9waW5zLAotCQkJQVJSQVlfU0laRShhcGY5MzI4X3BpbnMpLAotCQkJIkFQRjkzMjgiKTsKLQotCWlteDFfYWRkX2lteF91YXJ0MChOVUxMKTsKLQlpbXgxX2FkZF9pbXhfdWFydDEoJnVhcnQxX3BkYXRhKTsKLQotCWlteDFfYWRkX2lteF9pMmMoJmFwZjkzMjhfaTJjX2RhdGEpOwotCi0JZG05MDAwX3Jlc291cmNlc1syXS5zdGFydCA9IGdwaW9fdG9faXJxKElNWF9HUElPX05SKDIsIDE0KSk7Ci0JZG05MDAwX3Jlc291cmNlc1syXS5lbmQgPSBncGlvX3RvX2lycShJTVhfR1BJT19OUigyLCAxNCkpOwotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXBmOTMyOF90aW1lcl9pbml0KHZvaWQpCi17Ci0JbXgxX2Nsb2Nrc19pbml0KDMyNzY4KTsKLX0KLQotTUFDSElORV9TVEFSVChBUEY5MzI4LCAiQXJtYWRldXMgQVBGOTMyOCIpCi0JLyogTWFpbnRhaW5lcjogR3dlbmhhZWwgR29hdmVjLU1lcm91LCBBUk1hZGV1cyBTeXN0ZW1zICovCi0JLm1hcF9pbyAgICAgICA9IG14MV9tYXBfaW8sCi0JLmluaXRfZWFybHkgICA9IGlteDFfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEgICAgID0gbXgxX2luaXRfaXJxLAotCS5pbml0X3RpbWUJPSBhcGY5MzI4X3RpbWVyX2luaXQsCi0JLmluaXRfbWFjaGluZSA9IGFwZjkzMjhfaW5pdCwKLQkucmVzdGFydAk9IG14Y19yZXN0YXJ0LAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14MS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXgxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1YWI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14MS5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDE0IEFsZXhhbmRlciBTaGl5YW4gPHNoY193b3JrQG1haWwucnU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJoYXJkd2FyZS5oIgorCisjZGVmaW5lIE1YMV9BVklDX0FERFIJMHgwMDIyMzAwMAorCitzdGF0aWMgdm9pZCBfX2luaXQgaW14MV9pbml0X2Vhcmx5KHZvaWQpCit7CisJbXhjX3NldF9jcHVfdHlwZShNWENfQ1BVX01YMSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbXgxX2luaXRfaXJxKHZvaWQpCit7CisJdm9pZCBfX2lvbWVtICphdmljX2FkZHI7CisKKwlhdmljX2FkZHIgPSBpb3JlbWFwKE1YMV9BVklDX0FERFIsIFNaXzRLKTsKKwlXQVJOX09OKCFhdmljX2FkZHIpOworCisJbXhjX2luaXRfaXJxKGF2aWNfYWRkcik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaW14MV9kdF9ib2FyZF9jb21wYXRbXSBfX2luaXRjb25zdCA9IHsKKwkiZnNsLGlteDEiLAorCU5VTEwKK307CisKK0RUX01BQ0hJTkVfU1RBUlQoSU1YMV9EVCwgIkZyZWVzY2FsZSBpLk1YMSAoRGV2aWNlIFRyZWUgU3VwcG9ydCkiKQorCS5tYXBfaW8JCT0gZGVidWdfbGxfaW9faW5pdCwKKwkuaW5pdF9lYXJseQk9IGlteDFfaW5pdF9lYXJseSwKKwkuaW5pdF9pcnEJPSBpbXgxX2luaXRfaXJxLAorCS5kdF9jb21wYXQJPSBpbXgxX2R0X2JvYXJkX2NvbXBhdCwKKwkucmVzdGFydAk9IG14Y19yZXN0YXJ0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14NnVsLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDZ1bC5jCmluZGV4IDA4MzA4YTEuLjU4YTJiODggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14NnVsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXg2dWwuYwpAQCAtNjUsNiArNjUsNyBAQAogCWlmIChwYXJlbnQgPT0gTlVMTCkKIAkJcHJfd2FybigiZmFpbGVkIHRvIGluaXRpYWxpemUgc29jIGRldmljZVxuIik7CiAKKwlvZl9wbGF0Zm9ybV9kZWZhdWx0X3BvcHVsYXRlKE5VTEwsIE5VTEwsIHBhcmVudCk7CiAJaW14NnVsX2VuZXRfaW5pdCgpOwogCWlteF9hbmF0b3BfaW5pdCgpOwogCWlteDZ1bF9wbV9pbml0KCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWt6bV9hcm0xMV8wMS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1rem1fYXJtMTFfMDEuYwppbmRleCA4Mjg4YWNmLi5hYjg0N2UyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWt6bV9hcm0xMV8wMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gta3ptX2FybTExXzAxLmMKQEAgLTYzLDcgKzYzLDcgQEAKICAqLwogI2RlZmluZSBLWk1fQVJNMTFfMTY1NTAJCShNWDMxX0NTNF9CQVNFX0FERFIgKyAweDEwNTApCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfODI1MCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMXzgyNTBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NFUklBTF84MjUwKQogLyoKICAqIEtaTS1BUk0xMS0wMSBoYXMgYW4gZXh0ZXJuYWwgVUFSVCBvbiBGUEdBCiAgKi8KQEAgLTE0MSw3ICsxNDEsNyBAQAogLyoKICAqIFNNU0MgTEFOOTExOAogICovCi0jaWYgZGVmaW5lZChDT05GSUdfU01TQzkxMVgpIHx8IGRlZmluZWQoQ09ORklHX1NNU0M5MTFYX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTVNDOTExWCkKIHN0YXRpYyBzdHJ1Y3Qgc21zYzkxMXhfcGxhdGZvcm1fY29uZmlnIGt6bV9zbXNjOTExOF9jb25maWcgPSB7CiAJLnBoeV9pbnRlcmZhY2UJPSBQSFlfSU5URVJGQUNFX01PREVfTUlJLAogCS5pcnFfcG9sYXJpdHkJPSBTTVNDOTExWF9JUlFfUE9MQVJJVFlfQUNUSVZFX0hJR0gsCkBAIC0yMDEsNyArMjAxLDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX0lNWCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX0lNWF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU0VSSUFMX0lNWCkKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW14dWFydF9wbGF0Zm9ybV9kYXRhIHVhcnRfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLmZsYWdzID0gSU1YVUFSVF9IQVZFX1JUU0NUUywKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzNy5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1wY20wMzcuYwppbmRleCBkMDcxY2VkLi45ZjBmNTViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTAzNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDM3LmMKQEAgLTE0OSw3ICsxNDksNyBAQAogCU1YMzFfUElOX0NPTlRSQVNUX19DT05UUkFTVCwKIAlNWDMxX1BJTl9EM19TUExfX0QzX1NQTCwKIAlNWDMxX1BJTl9EM19DTFNfX0QzX0NMUywKLQlNWDMxX1BJTl9MQ1MwX19HUEkwM18yMywKKwlNWDMxX1BJTl9MQ1MwX19HUElPM18yMywKIAkvKiBDU0kgKi8KIAlJT01VWF9NT0RFKE1YMzFfUElOX0NTSV9ENSwgSU9NVVhfQ09ORklHX0dQSU8pLAogCU1YMzFfUElOX0NTSV9ENl9fQ1NJX0Q2LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1zY2I5MzI4LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXNjYjkzMjguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2YmMzZi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXNjYjkzMjguYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9hcm0vbWFjaC1teDEvbWFjaC1zY2I5MzI4LmMKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2FzY2hhIEhhdWVyIDxzYXNjaGFoYXVlckB3ZWIuZGU+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBKdWVyZ2VuIEJlaXNlcnQgPGpiZWlzZXJ0QG5ldHNjYXBlLm5ldD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kbTkwMDAuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKLSNpbmNsdWRlICJkZXZpY2VzLWlteDEuaCIKLSNpbmNsdWRlICJoYXJkd2FyZS5oIgotI2luY2x1ZGUgImlvbXV4LW14MS5oIgotCi0vKgotICogVGhpcyBzY2I5MzI4IGhhcyBhIDMyTWlCIGZsYXNoCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZmxhc2hfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CT0gTVgxX0NTMF9QSFlTLAotCS5lbmQJPSBNWDFfQ1MwX1BIWVMgKyAoMzIgKiAxMDI0ICogMTAyNCkgLSAxLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgc2NiX2ZsYXNoX2RhdGEgPSB7Ci0JLndpZHRoICA9IDIsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2JfZmxhc2hfZGV2aWNlID0gewotCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKLQkuaWQJCT0gMCwKLQkuZGV2ID0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZzY2JfZmxhc2hfZGF0YSwKLQl9LAotCS5yZXNvdXJjZSA9ICZmbGFzaF9yZXNvdXJjZSwKLQkubnVtX3Jlc291cmNlcyA9IDEsCi19OwotCi0vKgotICogc2NiOTMyOCBoYXMgYSBETTkwMDAgbmV0d29yayBjb250cm9sbGVyCi0gKiBjb25uZWN0ZWQgdG8gQ1M1LCB3aXRoIDE2IGJpdCBkYXRhIHBhdGgKLSAqIGFuZCBpbnRlcnJ1cHQgY29ubmVjdGVkIHRvIEdQSU8gMwotICovCi0KLS8qCi0gKiBpbnRlcm5hbCBkYXRhcGF0aCBpcyBmaXhlZCAxNiBiaXQKLSAqLwotc3RhdGljIHN0cnVjdCBkbTkwMDBfcGxhdF9kYXRhIGRtOTAwMF9wbGF0ZGF0YSA9IHsKLQkuZmxhZ3MJPSBETTkwMDBfUExBVEZfMTZCSVRPTkxZLAotfTsKLQotLyoKLSAqIHRoZSBETTkwMDAgZHJpdmVycyB3YW50cyB0d28gZGVmaW5lZCBhZGRyZXNzIHNwYWNlcwotICogdG8gZ2FpbiBhY2Nlc3MgdG8gYWRkcmVzcyBsYXRjaCByZWdpc3RlcnMgYW5kIHRoZSBkYXRhIHBhdGguCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZG05MDAweF9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5uYW1lCT0gImFkZHJlc3MgYXJlYSIsCi0JCS5zdGFydAk9IE1YMV9DUzVfUEhZUywKLQkJLmVuZAk9IE1YMV9DUzVfUEhZUyArIDEsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAkvKiBhZGRyZXNzIGFjY2VzcyAqLwotCX0sIHsKLQkJLm5hbWUJPSAiZGF0YSBhcmVhIiwKLQkJLnN0YXJ0CT0gTVgxX0NTNV9QSFlTICsgNCwKLQkJLmVuZAk9IE1YMV9DUzVfUEhZUyArIDUsCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAkvKiBkYXRhIGFjY2VzcyAqLwotCX0sIHsKLQkJLyogaXJxIG51bWJlciBpcyBydW4tdGltZSBhc3NpZ25lZCAqLwotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSB8IElPUkVTT1VSQ0VfSVJRX0xPV0xFVkVMLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBkbTkwMDB4X2RldmljZSA9IHsKLQkubmFtZQkJPSAiZG05MDAwIiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZG05MDAweF9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IGRtOTAwMHhfcmVzb3VyY2VzLAotCS5kZXYJCT0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZkbTkwMDBfcGxhdGRhdGEsCi0JfQotfTsKLQotc3RhdGljIGNvbnN0IGludCBteGNfdWFydDFfcGluc1tdID0gewotCVBDOV9QRl9VQVJUMV9DVFMsCi0JUEMxMF9QRl9VQVJUMV9SVFMsCi0JUEMxMV9QRl9VQVJUMV9UWEQsCi0JUEMxMl9QRl9VQVJUMV9SWEQsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB1YXJ0X3BkYXRhIF9faW5pdGNvbnN0ID0gewotCS5mbGFncyA9IElNWFVBUlRfSEFWRV9SVFNDVFMsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JJnNjYl9mbGFzaF9kZXZpY2UsCi0JJmRtOTAwMHhfZGV2aWNlLAotfTsKLQotLyoKLSAqIHNjYjkzMjhfaW5pdCAtIEluaXQgdGhlIENQVSBjYXJkIGl0c2VsZgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgc2NiOTMyOF9pbml0KHZvaWQpCi17Ci0JaW14MV9zb2NfaW5pdCgpOwotCi0JbXhjX2dwaW9fc2V0dXBfbXVsdGlwbGVfcGlucyhteGNfdWFydDFfcGlucywKLQkJCUFSUkFZX1NJWkUobXhjX3VhcnQxX3BpbnMpLCAiVUFSVDEiKTsKLQotCWlteDFfYWRkX2lteF91YXJ0MCgmdWFydF9wZGF0YSk7Ci0KLQlwcmludGsoS0VSTl9JTkZPIlNjYjkzMjg6IEFkZGluZyBkZXZpY2VzXG4iKTsKLQlkbTkwMDB4X3Jlc291cmNlc1syXS5zdGFydCA9IGdwaW9fdG9faXJxKElNWF9HUElPX05SKDMsIDMpKTsKLQlkbTkwMDB4X3Jlc291cmNlc1syXS5lbmQgPSBncGlvX3RvX2lycShJTVhfR1BJT19OUigzLCAzKSk7Ci0JcGxhdGZvcm1fYWRkX2RldmljZXMoZGV2aWNlcywgQVJSQVlfU0laRShkZXZpY2VzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzY2I5MzI4X3RpbWVyX2luaXQodm9pZCkKLXsKLQlteDFfY2xvY2tzX2luaXQoMzIwMDApOwotfQotCi1NQUNISU5FX1NUQVJUKFNDQjkzMjgsICJTeW5lcnRyb25peHggc2NiOTMyOCIpCi0JLyogU2FzY2hhIEhhdWVyICovCi0JLmF0YWdfb2Zmc2V0ID0gMTAwLAotCS5tYXBfaW8gPSBteDFfbWFwX2lvLAotCS5pbml0X2Vhcmx5ID0gaW14MV9pbml0X2Vhcmx5LAotCS5pbml0X2lycSA9IG14MV9pbml0X2lycSwKLQkuaW5pdF90aW1lCT0gc2NiOTMyOF90aW1lcl9pbml0LAotCS5pbml0X21hY2hpbmUgPSBzY2I5MzI4X2luaXQsCi0JLnJlc3RhcnQJPSBteGNfcmVzdGFydCwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDJmMTkuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqICBhdXRob3I6IFNhc2NoYSBIYXVlcgotICogIENyZWF0ZWQ6IGFwcmlsIDIwdGgsIDIwMDQKLSAqICBDb3B5cmlnaHQ6IFN5bmVydHJvbml4eCBHbWJICi0gKgotICogIENvbW1vbiBjb2RlIGZvciBpLk1YMSBtYWNoaW5lcwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvbWFjaGluZS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKLSNpbmNsdWRlICJkZXZpY2VzL2RldmljZXMtY29tbW9uLmgiCi0jaW5jbHVkZSAiaGFyZHdhcmUuaCIKLSNpbmNsdWRlICJpb211eC12MS5oIgotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGlteF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQlpbXhfbWFwX2VudHJ5KE1YMSwgSU8sIE1UX0RFVklDRSksCi19OwotCi12b2lkIF9faW5pdCBteDFfbWFwX2lvKHZvaWQpCi17Ci0JaW90YWJsZV9pbml0KGlteF9pb19kZXNjLCBBUlJBWV9TSVpFKGlteF9pb19kZXNjKSk7Ci19Ci0KLXZvaWQgX19pbml0IGlteDFfaW5pdF9lYXJseSh2b2lkKQotewotCW14Y19zZXRfY3B1X3R5cGUoTVhDX0NQVV9NWDEpOwotCWlteF9pb211eHYxX2luaXQoTVgxX0lPX0FERFJFU1MoTVgxX0dQSU9fQkFTRV9BRERSKSwKLQkJCU1YMV9OVU1fR1BJT19QT1JUKTsKLX0KLQotdm9pZCBfX2luaXQgbXgxX2luaXRfaXJxKHZvaWQpCi17Ci0JbXhjX2luaXRfaXJxKE1YMV9JT19BRERSRVNTKE1YMV9BVklDX0JBU0VfQUREUikpOwotfQotCi12b2lkIF9faW5pdCBpbXgxX3NvY19pbml0KHZvaWQpCi17Ci0JaW14MV9yZXNldF9pbml0KE1YMV9JT19BRERSRVNTKE1YMV9XRFRfQkFTRV9BRERSKSk7Ci0JbXhjX2RldmljZV9pbml0KCk7Ci0KLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MS1ncGlvIiwgMCwgTVgxX0dQSU8xX0JBU0VfQUREUiwgU1pfMjU2LAotCQkJCQkJTVgxX0dQSU9fSU5UX1BPUlRBLCAwKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MS1ncGlvIiwgMSwgTVgxX0dQSU8yX0JBU0VfQUREUiwgU1pfMjU2LAotCQkJCQkJTVgxX0dQSU9fSU5UX1BPUlRCLCAwKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MS1ncGlvIiwgMiwgTVgxX0dQSU8zX0JBU0VfQUREUiwgU1pfMjU2LAotCQkJCQkJTVgxX0dQSU9fSU5UX1BPUlRDLCAwKTsKLQlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MS1ncGlvIiwgMywgTVgxX0dQSU80X0JBU0VfQUREUiwgU1pfMjU2LAotCQkJCQkJTVgxX0dQSU9fSU5UX1BPUlRELCAwKTsKLQlpbXhfYWRkX2lteF9kbWEoImlteDEtZG1hIiwgTVgxX0RNQV9CQVNFX0FERFIsCi0JCQlNWDFfRE1BX0lOVCwgTVgxX0RNQV9FUlIpOwotCXBpbmN0cmxfcHJvdmlkZV9kdW1taWVzKCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9teDEuaCBiL2FyY2gvYXJtL21hY2gtaW14L214MS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWJkMzFjLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtaW14L214MS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTcsMTk5OCBSdXNzZWxsIEtpbmcKLSAqIENvcHlyaWdodCAoQykgMTk5OSBBUk0gTGltaXRlZAotICogQ29weXJpZ2h0IDIwMDQtMjAwNyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICogQ29weXJpZ2h0IChjKSAyMDA4IFBhdWxpdXMgWmFsZWNrYXMgPHBhdWxpdXMuemFsZWNrYXNAdGVsdG9uaWthLmx0PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBfX01BQ0hfTVgxX0hfXwotI2RlZmluZSBfX01BQ0hfTVgxX0hfXwotCi0vKgotICogTWVtb3J5IG1hcAotICovCi0jZGVmaW5lIE1YMV9JT19CQVNFX0FERFIJMHgwMDIwMDAwMAotI2RlZmluZSBNWDFfSU9fU0laRQkJU1pfMU0KLQotI2RlZmluZSBNWDFfQ1MwX1BIWVMJCTB4MTAwMDAwMDAKLSNkZWZpbmUgTVgxX0NTMF9TSVpFCQkweDAyMDAwMDAwCi0KLSNkZWZpbmUgTVgxX0NTMV9QSFlTCQkweDEyMDAwMDAwCi0jZGVmaW5lIE1YMV9DUzFfU0laRQkJMHgwMTAwMDAwMAotCi0jZGVmaW5lIE1YMV9DUzJfUEhZUwkJMHgxMzAwMDAwMAotI2RlZmluZSBNWDFfQ1MyX1NJWkUJCTB4MDEwMDAwMDAKLQotI2RlZmluZSBNWDFfQ1MzX1BIWVMJCTB4MTQwMDAwMDAKLSNkZWZpbmUgTVgxX0NTM19TSVpFCQkweDAxMDAwMDAwCi0KLSNkZWZpbmUgTVgxX0NTNF9QSFlTCQkweDE1MDAwMDAwCi0jZGVmaW5lIE1YMV9DUzRfU0laRQkJMHgwMTAwMDAwMAotCi0jZGVmaW5lIE1YMV9DUzVfUEhZUwkJMHgxNjAwMDAwMAotI2RlZmluZSBNWDFfQ1M1X1NJWkUJCTB4MDEwMDAwMDAKLQotLyoKLSAqICBSZWdpc3RlciBCQVNFcywgYmFzZWQgb24gT0ZGU0VUcwotICovCi0jZGVmaW5lIE1YMV9BSVBJMV9CQVNFX0FERFIJCSgweDAwMDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX1dEVF9CQVNFX0FERFIJCSgweDAxMDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX1RJTTFfQkFTRV9BRERSCQkoMHgwMjAwMCArIE1YMV9JT19CQVNFX0FERFIpCi0jZGVmaW5lIE1YMV9USU0yX0JBU0VfQUREUgkJKDB4MDMwMDAgKyBNWDFfSU9fQkFTRV9BRERSKQotI2RlZmluZSBNWDFfUlRDX0JBU0VfQUREUgkJKDB4MDQwMDAgKyBNWDFfSU9fQkFTRV9BRERSKQotI2RlZmluZSBNWDFfTENEQ19CQVNFX0FERFIJCSgweDA1MDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX1VBUlQxX0JBU0VfQUREUgkJKDB4MDYwMDAgKyBNWDFfSU9fQkFTRV9BRERSKQotI2RlZmluZSBNWDFfVUFSVDJfQkFTRV9BRERSCQkoMHgwNzAwMCArIE1YMV9JT19CQVNFX0FERFIpCi0jZGVmaW5lIE1YMV9QV01fQkFTRV9BRERSCQkoMHgwODAwMCArIE1YMV9JT19CQVNFX0FERFIpCi0jZGVmaW5lIE1YMV9ETUFfQkFTRV9BRERSCQkoMHgwOTAwMCArIE1YMV9JT19CQVNFX0FERFIpCi0jZGVmaW5lIE1YMV9BSVBJMl9CQVNFX0FERFIJCSgweDEwMDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX1NJTV9CQVNFX0FERFIJCSgweDExMDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX1VTQkRfQkFTRV9BRERSCQkoMHgxMjAwMCArIE1YMV9JT19CQVNFX0FERFIpCi0jZGVmaW5lIE1YMV9DU1BJMV9CQVNFX0FERFIJCSgweDEzMDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX01NQ19CQVNFX0FERFIJCSgweDE0MDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX0FTUF9CQVNFX0FERFIJCSgweDE1MDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX0JUQV9CQVNFX0FERFIJCSgweDE2MDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX0kyQ19CQVNFX0FERFIJCSgweDE3MDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX1NTSV9CQVNFX0FERFIJCSgweDE4MDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX0NTUEkyX0JBU0VfQUREUgkJKDB4MTkwMDAgKyBNWDFfSU9fQkFTRV9BRERSKQotI2RlZmluZSBNWDFfTVNIQ19CQVNFX0FERFIJCSgweDFBMDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX0NDTV9CQVNFX0FERFIJCSgweDFCMDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX1NDTV9CQVNFX0FERFIJCSgweDFCODA0ICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX0dQSU9fQkFTRV9BRERSCQkoMHgxQzAwMCArIE1YMV9JT19CQVNFX0FERFIpCi0jZGVmaW5lIE1YMV9HUElPMV9CQVNFX0FERFIJCSgweDFDMDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX0dQSU8yX0JBU0VfQUREUgkJKDB4MUMxMDAgKyBNWDFfSU9fQkFTRV9BRERSKQotI2RlZmluZSBNWDFfR1BJTzNfQkFTRV9BRERSCQkoMHgxQzIwMCArIE1YMV9JT19CQVNFX0FERFIpCi0jZGVmaW5lIE1YMV9HUElPNF9CQVNFX0FERFIJCSgweDFDMzAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX0VJTV9CQVNFX0FERFIJCSgweDIwMDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX1NEUkFNQ19CQVNFX0FERFIJCSgweDIxMDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX01NQV9CQVNFX0FERFIJCSgweDIyMDAwICsgTVgxX0lPX0JBU0VfQUREUikKLSNkZWZpbmUgTVgxX0FWSUNfQkFTRV9BRERSCQkoMHgyMzAwMCArIE1YMV9JT19CQVNFX0FERFIpCi0jZGVmaW5lIE1YMV9DU0lfQkFTRV9BRERSCQkoMHgyNDAwMCArIE1YMV9JT19CQVNFX0FERFIpCi0KLS8qIG1hY3JvIHRvIGdldCBhdCBJTyBzcGFjZSB3aGVuIHJ1bm5pbmcgdmlydHVhbGx5ICovCi0jZGVmaW5lIE1YMV9JT19QMlYoeCkJCQlJTVhfSU9fUDJWKHgpCi0jZGVmaW5lIE1YMV9JT19BRERSRVNTKHgpCQlJT01FTShNWDFfSU9fUDJWKHgpKQotCi0vKiBmaXhlZCBpbnRlcnJwdXQgbnVtYmVycyAqLwotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNkZWZpbmUgTVgxX0lOVF9TT0ZUSU5UCQkoTlJfSVJRU19MRUdBQ1kgKyAwKQotI2RlZmluZSBNWDFfSU5UX0NTSQkJKE5SX0lSUVNfTEVHQUNZICsgNikKLSNkZWZpbmUgTVgxX0RTUEFfTUFDX0lOVAkoTlJfSVJRU19MRUdBQ1kgKyA3KQotI2RlZmluZSBNWDFfRFNQQV9JTlQJCShOUl9JUlFTX0xFR0FDWSArIDgpCi0jZGVmaW5lIE1YMV9DT01QX0lOVAkJKE5SX0lSUVNfTEVHQUNZICsgOSkKLSNkZWZpbmUgTVgxX01TSENfWElOVAkJKE5SX0lSUVNfTEVHQUNZICsgMTApCi0jZGVmaW5lIE1YMV9HUElPX0lOVF9QT1JUQQkoTlJfSVJRU19MRUdBQ1kgKyAxMSkKLSNkZWZpbmUgTVgxX0dQSU9fSU5UX1BPUlRCCShOUl9JUlFTX0xFR0FDWSArIDEyKQotI2RlZmluZSBNWDFfR1BJT19JTlRfUE9SVEMJKE5SX0lSUVNfTEVHQUNZICsgMTMpCi0jZGVmaW5lIE1YMV9JTlRfTENEQwkJKE5SX0lSUVNfTEVHQUNZICsgMTQpCi0jZGVmaW5lIE1YMV9TSU1fSU5UCQkoTlJfSVJRU19MRUdBQ1kgKyAxNSkKLSNkZWZpbmUgTVgxX1NJTV9EQVRBX0lOVAkoTlJfSVJRU19MRUdBQ1kgKyAxNikKLSNkZWZpbmUgTVgxX1JUQ19JTlQJCShOUl9JUlFTX0xFR0FDWSArIDE3KQotI2RlZmluZSBNWDFfUlRDX1NBTUlOVAkJKE5SX0lSUVNfTEVHQUNZICsgMTgpCi0jZGVmaW5lIE1YMV9JTlRfVUFSVDJQRkVSUgkoTlJfSVJRU19MRUdBQ1kgKyAxOSkKLSNkZWZpbmUgTVgxX0lOVF9VQVJUMlJUUwkoTlJfSVJRU19MRUdBQ1kgKyAyMCkKLSNkZWZpbmUgTVgxX0lOVF9VQVJUMkRUUgkoTlJfSVJRU19MRUdBQ1kgKyAyMSkKLSNkZWZpbmUgTVgxX0lOVF9VQVJUMlVBUlRDCShOUl9JUlFTX0xFR0FDWSArIDIyKQotI2RlZmluZSBNWDFfSU5UX1VBUlQyVFgJCShOUl9JUlFTX0xFR0FDWSArIDIzKQotI2RlZmluZSBNWDFfSU5UX1VBUlQyUlgJCShOUl9JUlFTX0xFR0FDWSArIDI0KQotI2RlZmluZSBNWDFfSU5UX1VBUlQxUEZFUlIJKE5SX0lSUVNfTEVHQUNZICsgMjUpCi0jZGVmaW5lIE1YMV9JTlRfVUFSVDFSVFMJKE5SX0lSUVNfTEVHQUNZICsgMjYpCi0jZGVmaW5lIE1YMV9JTlRfVUFSVDFEVFIJKE5SX0lSUVNfTEVHQUNZICsgMjcpCi0jZGVmaW5lIE1YMV9JTlRfVUFSVDFVQVJUQwkoTlJfSVJRU19MRUdBQ1kgKyAyOCkKLSNkZWZpbmUgTVgxX0lOVF9VQVJUMVRYCQkoTlJfSVJRU19MRUdBQ1kgKyAyOSkKLSNkZWZpbmUgTVgxX0lOVF9VQVJUMVJYCQkoTlJfSVJRU19MRUdBQ1kgKyAzMCkKLSNkZWZpbmUgTVgxX1ZPSUNFX0RBQ19JTlQJKE5SX0lSUVNfTEVHQUNZICsgMzEpCi0jZGVmaW5lIE1YMV9WT0lDRV9BRENfSU5UCShOUl9JUlFTX0xFR0FDWSArIDMyKQotI2RlZmluZSBNWDFfUEVOX0RBVEFfSU5UCShOUl9JUlFTX0xFR0FDWSArIDMzKQotI2RlZmluZSBNWDFfUFdNX0lOVAkJKE5SX0lSUVNfTEVHQUNZICsgMzQpCi0jZGVmaW5lIE1YMV9TREhDX0lOVAkJKE5SX0lSUVNfTEVHQUNZICsgMzUpCi0jZGVmaW5lIE1YMV9JTlRfSTJDCQkoTlJfSVJRU19MRUdBQ1kgKyAzOSkKLSNkZWZpbmUgTVgxX0lOVF9DU1BJMgkJKE5SX0lSUVNfTEVHQUNZICsgNDApCi0jZGVmaW5lIE1YMV9JTlRfQ1NQSTEJCShOUl9JUlFTX0xFR0FDWSArIDQxKQotI2RlZmluZSBNWDFfU1NJX1RYX0lOVAkJKE5SX0lSUVNfTEVHQUNZICsgNDIpCi0jZGVmaW5lIE1YMV9TU0lfVFhfRVJSX0lOVAkoTlJfSVJRU19MRUdBQ1kgKyA0MykKLSNkZWZpbmUgTVgxX1NTSV9SWF9JTlQJCShOUl9JUlFTX0xFR0FDWSArIDQ0KQotI2RlZmluZSBNWDFfU1NJX1JYX0VSUl9JTlQJKE5SX0lSUVNfTEVHQUNZICsgNDUpCi0jZGVmaW5lIE1YMV9UT1VDSF9JTlQJCShOUl9JUlFTX0xFR0FDWSArIDQ2KQotI2RlZmluZSBNWDFfSU5UX1VTQkQwCQkoTlJfSVJRU19MRUdBQ1kgKyA0NykKLSNkZWZpbmUgTVgxX0lOVF9VU0JEMQkJKE5SX0lSUVNfTEVHQUNZICsgNDgpCi0jZGVmaW5lIE1YMV9JTlRfVVNCRDIJCShOUl9JUlFTX0xFR0FDWSArIDQ5KQotI2RlZmluZSBNWDFfSU5UX1VTQkQzCQkoTlJfSVJRU19MRUdBQ1kgKyA1MCkKLSNkZWZpbmUgTVgxX0lOVF9VU0JENAkJKE5SX0lSUVNfTEVHQUNZICsgNTEpCi0jZGVmaW5lIE1YMV9JTlRfVVNCRDUJCShOUl9JUlFTX0xFR0FDWSArIDUyKQotI2RlZmluZSBNWDFfSU5UX1VTQkQ2CQkoTlJfSVJRU19MRUdBQ1kgKyA1MykKLSNkZWZpbmUgTVgxX0JUU1lTX0lOVAkJKE5SX0lSUVNfTEVHQUNZICsgNTUpCi0jZGVmaW5lIE1YMV9CVFRJTV9JTlQJCShOUl9JUlFTX0xFR0FDWSArIDU2KQotI2RlZmluZSBNWDFfQlRXVUlfSU5UCQkoTlJfSVJRU19MRUdBQ1kgKyA1NykKLSNkZWZpbmUgTVgxX1RJTTJfSU5UCQkoTlJfSVJRU19MRUdBQ1kgKyA1OCkKLSNkZWZpbmUgTVgxX1RJTTFfSU5UCQkoTlJfSVJRU19MRUdBQ1kgKyA1OSkKLSNkZWZpbmUgTVgxX0RNQV9FUlIJCShOUl9JUlFTX0xFR0FDWSArIDYwKQotI2RlZmluZSBNWDFfRE1BX0lOVAkJKE5SX0lSUVNfTEVHQUNZICsgNjEpCi0jZGVmaW5lIE1YMV9HUElPX0lOVF9QT1JURAkoTlJfSVJRU19MRUdBQ1kgKyA2MikKLSNkZWZpbmUgTVgxX1dEVF9JTlQJCShOUl9JUlFTX0xFR0FDWSArIDYzKQotCi0vKiBETUEgKi8KLSNkZWZpbmUgTVgxX0RNQV9SRVFfVUFSVDNfVAkJMgotI2RlZmluZSBNWDFfRE1BX1JFUV9VQVJUM19SCQkzCi0jZGVmaW5lIE1YMV9ETUFfUkVRX1NTSTJfVAkJNAotI2RlZmluZSBNWDFfRE1BX1JFUV9TU0kyX1IJCTUKLSNkZWZpbmUgTVgxX0RNQV9SRVFfQ1NJX1NUQVQJCTYKLSNkZWZpbmUgTVgxX0RNQV9SRVFfQ1NJX1IJCTcKLSNkZWZpbmUgTVgxX0RNQV9SRVFfTVNIQwkJOAotI2RlZmluZSBNWDFfRE1BX1JFUV9EU1BBX0RDVF9ET1VUCTkKLSNkZWZpbmUgTVgxX0RNQV9SRVFfRFNQQV9EQ1RfRElOCTEwCi0jZGVmaW5lIE1YMV9ETUFfUkVRX0RTUEFfTUFDCQkxMQotI2RlZmluZSBNWDFfRE1BX1JFUV9FWFQJCQkxMgotI2RlZmluZSBNWDFfRE1BX1JFUV9TREhDCQkxMwotI2RlZmluZSBNWDFfRE1BX1JFUV9TUEkxX1IJCTE0Ci0jZGVmaW5lIE1YMV9ETUFfUkVRX1NQSTFfVAkJMTUKLSNkZWZpbmUgTVgxX0RNQV9SRVFfU1NJX1QJCTE2Ci0jZGVmaW5lIE1YMV9ETUFfUkVRX1NTSV9SCQkxNwotI2RlZmluZSBNWDFfRE1BX1JFUV9BU1BfREFDCQkxOAotI2RlZmluZSBNWDFfRE1BX1JFUV9BU1BfQURDCQkxOQotI2RlZmluZSBNWDFfRE1BX1JFUV9VU1BfRVAoeCkJCSgyMCArICh4KSkKLSNkZWZpbmUgTVgxX0RNQV9SRVFfU1BJMl9SCQkyNgotI2RlZmluZSBNWDFfRE1BX1JFUV9TUEkyX1QJCTI3Ci0jZGVmaW5lIE1YMV9ETUFfUkVRX1VBUlQyX1QJCTI4Ci0jZGVmaW5lIE1YMV9ETUFfUkVRX1VBUlQyX1IJCTI5Ci0jZGVmaW5lIE1YMV9ETUFfUkVRX1VBUlQxX1QJCTMwCi0jZGVmaW5lIE1YMV9ETUFfUkVRX1VBUlQxX1IJCTMxCi0KLS8qCi0gKiBUaGlzIGRvZXNuJ3QgZGVwZW5kIG9uIElNWF9ORUVEU19ERVBSRUNBVEVEX1NZTUJPTFMKLSAqIHRvIG5vdCBicmVhayBkcml2ZXJzL3VzYi9nYWRnZXQvaW14X3VkYy4gIFNob3VsZCBnbwotICogYXdheSBhZnRlciB0aGlzIGRyaXZlciB1c2VzIHRoZSBuZXcgbmFtZS4KLSAqLwotI2RlZmluZSBVU0JEX0lOVDAJCU1YMV9JTlRfVVNCRDAKLQotI2VuZGlmIC8qIGlmbmRlZiBfX01BQ0hfTVgxX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14Ni5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvcG0taW14Ni5jCmluZGV4IDU0OTY0ODMuLjE1MTVlNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L3BtLWlteDYuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9wbS1pbXg2LmMKQEAgLTI5NSw3ICsyOTUsNyBAQAogCQl2YWwgJj0gfkJNX0NMUENSX1NCWU9TOwogCQlpZiAoY3B1X2lzX2lteDZzbCgpKQogCQkJdmFsIHw9IEJNX0NMUENSX0JZUEFTU19QTUlDX1JFQURZOwotCQlpZiAoY3B1X2lzX2lteDZzbCgpIHx8IGNwdV9pc19pbXg2c3goKSkKKwkJaWYgKGNwdV9pc19pbXg2c2woKSB8fCBjcHVfaXNfaW14NnN4KCkgfHwgY3B1X2lzX2lteDZ1bCgpKQogCQkJdmFsIHw9IEJNX0NMUENSX0JZUF9NTURDX0NIMF9MUE1fSFM7CiAJCWVsc2UKIAkJCXZhbCB8PSBCTV9DTFBDUl9CWVBfTU1EQ19DSDFfTFBNX0hTOwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJCXZhbCB8PSAweDMgPDwgQlBfQ0xQQ1JfU1RCWV9DT1VOVDsKIAkJdmFsIHw9IEJNX0NMUENSX1ZTVEJZOwogCQl2YWwgfD0gQk1fQ0xQQ1JfU0JZT1M7Ci0JCWlmIChjcHVfaXNfaW14NnNsKCkpCisJCWlmIChjcHVfaXNfaW14NnNsKCkgfHwgY3B1X2lzX2lteDZzeCgpKQogCQkJdmFsIHw9IEJNX0NMUENSX0JZUEFTU19QTUlDX1JFQURZOwogCQlpZiAoY3B1X2lzX2lteDZzbCgpIHx8IGNwdV9pc19pbXg2c3goKSB8fCBjcHVfaXNfaW14NnVsKCkpCiAJCQl2YWwgfD0gQk1fQ0xQQ1JfQllQX01NRENfQ0gwX0xQTV9IUzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL0tjb25maWcKaW5kZXggNTk5Zjk3My4uY2VmZTQ0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL0tjb25maWcKQEAgLTIxLDcgKzIxLDYgQEAKIGNvbmZpZyBBUkNIX0lOVEVHUkFUT1JfQVAKIAlib29sICJTdXBwb3J0IEludGVncmF0b3IvQVAgYW5kIEludGVncmF0b3IvUFAyIHBsYXRmb3JtcyIKIAlzZWxlY3QgSU5URUdSQVRPUl9BUF9USU1FUgotCXNlbGVjdCBNSUdIVF9IQVZFX1BDSQogCXNlbGVjdCBTRVJJQUxfQU1CQV9QTDAxMCBpZiBUVFkKIAlzZWxlY3QgU0VSSUFMX0FNQkFfUEwwMTBfQ09OU09MRSBpZiBUVFkKIAlzZWxlY3QgU09DX0JVUwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1rZXlzdG9uZS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1rZXlzdG9uZS9LY29uZmlnCmluZGV4IDhmZjYxYmUuLjI0YmQ2NGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2V5c3RvbmUvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWtleXN0b25lL0tjb25maWcKQEAgLTgsOCArOCw2IEBACiAJc2VsZWN0IENPTU1PTl9DTEtfS0VZU1RPTkUKIAlzZWxlY3QgQVJDSF9TVVBQT1JUU19CSUdfRU5ESUFOCiAJc2VsZWN0IFpPTkVfRE1BIGlmIEFSTV9MUEFFCi0Jc2VsZWN0IE1JR0hUX0hBVkVfUENJCi0Jc2VsZWN0IFBDSV9ET01BSU5TIGlmIFBDSQogCXNlbGVjdCBQSU5DVFJMCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgYm9hcmRzIGJhc2VkIG9uIHRoZSBUZXhhcyBJbnN0cnVtZW50cyBLZXlzdG9uZSBmYW1pbHkgb2YKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtbXhzLmMgYi9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW14cy5jCmluZGV4IDBiN2ZlNzQuLmU0ZjIxMDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtbXhzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1teHMuYwpAQCAtMjY4LDgwICsyNjgsNiBAQAogCQkJCQkgICBhcHg0ZGV2a2l0X3BoeV9maXh1cCk7CiB9CiAKLSNkZWZpbmUgRU5FVDBfTURDX19HUElPXzRfMAlNWFNfR1BJT19OUig0LCAwKQotI2RlZmluZSBFTkVUMF9NRElPX19HUElPXzRfMQlNWFNfR1BJT19OUig0LCAxKQotI2RlZmluZSBFTkVUMF9SWF9FTl9fR1BJT180XzIJTVhTX0dQSU9fTlIoNCwgMikKLSNkZWZpbmUgRU5FVDBfUlhEMF9fR1BJT180XzMJTVhTX0dQSU9fTlIoNCwgMykKLSNkZWZpbmUgRU5FVDBfUlhEMV9fR1BJT180XzQJTVhTX0dQSU9fTlIoNCwgNCkKLSNkZWZpbmUgRU5FVDBfVFhfRU5fX0dQSU9fNF82CU1YU19HUElPX05SKDQsIDYpCi0jZGVmaW5lIEVORVQwX1RYRDBfX0dQSU9fNF83CU1YU19HUElPX05SKDQsIDcpCi0jZGVmaW5lIEVORVQwX1RYRDFfX0dQSU9fNF84CU1YU19HUElPX05SKDQsIDgpCi0jZGVmaW5lIEVORVRfQ0xLX19HUElPXzRfMTYJTVhTX0dQSU9fTlIoNCwgMTYpCi0KLSNkZWZpbmUgVFgyOF9GRUNfUEhZX1BPV0VSCU1YU19HUElPX05SKDMsIDI5KQotI2RlZmluZSBUWDI4X0ZFQ19QSFlfUkVTRVQJTVhTX0dQSU9fTlIoNCwgMTMpCi0jZGVmaW5lIFRYMjhfRkVDX25JTlQJCU1YU19HUElPX05SKDQsIDUpCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZ3BpbyBjb25zdCB0eDI4X2dwaW9zW10gX19pbml0Y29uc3QgPSB7Ci0JeyBFTkVUMF9NRENfX0dQSU9fNF8wLCBHUElPRl9PVVRfSU5JVF9MT1csICJHUElPXzRfMCIgfSwKLQl7IEVORVQwX01ESU9fX0dQSU9fNF8xLCBHUElPRl9PVVRfSU5JVF9MT1csICJHUElPXzRfMSIgfSwKLQl7IEVORVQwX1JYX0VOX19HUElPXzRfMiwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiR1BJT180XzIiIH0sCi0JeyBFTkVUMF9SWEQwX19HUElPXzRfMywgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiR1BJT180XzMiIH0sCi0JeyBFTkVUMF9SWEQxX19HUElPXzRfNCwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiR1BJT180XzQiIH0sCi0JeyBFTkVUMF9UWF9FTl9fR1BJT180XzYsIEdQSU9GX09VVF9JTklUX0xPVywgIkdQSU9fNF82IiB9LAotCXsgRU5FVDBfVFhEMF9fR1BJT180XzcsIEdQSU9GX09VVF9JTklUX0xPVywgIkdQSU9fNF83IiB9LAotCXsgRU5FVDBfVFhEMV9fR1BJT180XzgsIEdQSU9GX09VVF9JTklUX0xPVywgIkdQSU9fNF84IiB9LAotCXsgRU5FVF9DTEtfX0dQSU9fNF8xNiwgR1BJT0ZfT1VUX0lOSVRfTE9XLCAiR1BJT180XzE2IiB9LAotCXsgVFgyOF9GRUNfUEhZX1BPV0VSLCBHUElPRl9PVVRfSU5JVF9MT1csICJmZWMtcGh5LXBvd2VyIiB9LAotCXsgVFgyOF9GRUNfUEhZX1JFU0VULCBHUElPRl9PVVRfSU5JVF9MT1csICJmZWMtcGh5LXJlc2V0IiB9LAotCXsgVFgyOF9GRUNfbklOVCwgR1BJT0ZfRElSX0lOLCAiZmVjLWludCIgfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB0eDI4X3Bvc3RfaW5pdCh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQlzdHJ1Y3QgcGluY3RybCAqcGN0bDsKLQlpbnQgcmV0OwotCi0JZW5hYmxlX2Nsa19lbmV0X291dCgpOwotCi0JbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLGlteDI4LWZlYyIpOwotCXBkZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKG5wKTsKLQlpZiAoIXBkZXYpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGZpbmQgZmVjIGRldmljZVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JcGN0bCA9IHBpbmN0cmxfZ2V0X3NlbGVjdCgmcGRldi0+ZGV2LCAiZ3Bpb19tb2RlIik7Ci0JaWYgKElTX0VSUihwY3RsKSkgewotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZ2V0IHBpbmN0cmwgc3RhdGVcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXJldCA9IGdwaW9fcmVxdWVzdF9hcnJheSh0eDI4X2dwaW9zLCBBUlJBWV9TSVpFKHR4MjhfZ3Bpb3MpKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiJXM6IGZhaWxlZCB0byByZXF1ZXN0IGdwaW9zOiAlZFxuIiwgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBQb3dlciB1cCBmZWMgcGh5ICovCi0JZ3Bpb19zZXRfdmFsdWUoVFgyOF9GRUNfUEhZX1BPV0VSLCAxKTsKLQltc2xlZXAoMjYpOyAvKiAyNW1zIGFjY29yZGluZyB0byBkYXRhIHNoZWV0ICovCi0KLQkvKiBNb2RlIHN0cmFwIHBpbnMgKi8KLQlncGlvX3NldF92YWx1ZShFTkVUMF9SWF9FTl9fR1BJT180XzIsIDEpOwotCWdwaW9fc2V0X3ZhbHVlKEVORVQwX1JYRDBfX0dQSU9fNF8zLCAxKTsKLQlncGlvX3NldF92YWx1ZShFTkVUMF9SWEQxX19HUElPXzRfNCwgMSk7Ci0KLQl1ZGVsYXkoMTAwKTsgLyogbWluaW11bSBhc3NlcnRpb24gdGltZSBmb3IgblJTVCAqLwotCi0JLyogRGVhc3NlcnRpbmcgRkVDIFBIWSBSRVNFVCAqLwotCWdwaW9fc2V0X3ZhbHVlKFRYMjhfRkVDX1BIWV9SRVNFVCwgMSk7Ci0KLQlwaW5jdHJsX3B1dChwY3RsKTsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IGNyeXN0YWxmb250el9pbml0KHZvaWQpCiB7CiAJdXBkYXRlX2ZlY19tYWNfcHJvcChPVUlfQ1JZU1RBTEZPTlRaKTsKQEAgLTUwMSw5ICs0MjcsNiBAQAogCW9mX3BsYXRmb3JtX2RlZmF1bHRfcG9wdWxhdGUoTlVMTCwgTlVMTCwgcGFyZW50KTsKIAogCW14c19yZXN0YXJ0X2luaXQoKTsKLQotCWlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImthcm8sdHgyOCIpKQotCQl0eDI4X3Bvc3RfaW5pdCgpOwogfQogCiAjZGVmaW5lIE1YU19DTEtDVFJMX1JFU0VUX0NISVAJCSgxIDw8IDEpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLW1tYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi1tbWMuYwppbmRleCA3MTE5ZWYyLi4zNTdiZTJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLW1tYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDItbW1jLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlICJib2FyZC1oMi5oIgogI2luY2x1ZGUgIm1tYy5oIgogCi0jaWYgZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19NTUNfT01BUCkKIAogc3RhdGljIGludCBtbWNfc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QsIGludCBwb3dlcl9vbiwKIAkJCQlpbnQgdmRkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMi5jCmluZGV4IGNkMTQ2ZWQuLjY3NTI1NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDIuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgyLmMKQEAgLTM0OSw3ICszNDksNyBAQAogI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9PTUFQKQogCS5obWNfbW9kZQk9IDE5LAkvKiAwOmhvc3Qob2ZmKSAxOmRldnxvdGcgMjpkaXNhYmxlZCAqLwogCS8qIC5obWNfbW9kZQk9IDIxLCovCS8qIDA6aG9zdChvZmYpIDE6ZGV2KGxvb3BiYWNrKSAyOmhvc3QobG9vcGJhY2spICovCi0jZWxpZglkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0QpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRF9NT0RVTEUpCisjZWxpZglJU19FTkFCTEVEKENPTkZJR19VU0JfT0hDSV9IQ0QpCiAJLyogbmVlZHMgT1RHIGNhYmxlLCBvciBOT05TVEFOREFSRCAoQi10by1NaW5pQikgKi8KIAkuaG1jX21vZGUJPSAyMCwJLyogMTpkZXZ8b3RnKG9mZikgMTpob3N0IDI6ZGlzYWJsZWQgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy1tbWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMtbW1jLmMKaW5kZXggNDNhYWI2My4uNGY1OGJmYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy1tbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLW1tYy5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSAiYm9hcmQtaDMuaCIKICNpbmNsdWRlICJtbWMuaCIKIAotI2lmIGRlZmluZWQoQ09ORklHX01NQ19PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTU1DX09NQVApCiAKIHN0YXRpYyBpbnQgbW1jX3NldF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzbG90LCBpbnQgcG93ZXJfb24sCiAJCQkJaW50IHZkZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaDMuYwppbmRleCBmN2M4YzYzLi5lNjJmOWQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWgzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1oMy5jCkBAIC0zNjgsNyArMzY4LDcgQEAKIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9PTUFQKQogCS5obWNfbW9kZSAgICAgICA9IDE5LCAgIC8qIDA6aG9zdChvZmYpIDE6ZGV2fG90ZyAyOmRpc2FibGVkICovCi0jZWxpZiAgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorI2VsaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCX09IQ0lfSENEKQogCS8qIE5PTlNUQU5EQVJEIENBQkxFIE5FRURFRCAoQi10by1NaW5pLUIpICovCiAJLmhtY19tb2RlICAgICAgID0gMjAsICAgLyogMTpkZXZ8b3RnKG9mZikgMTpob3N0IDI6ZGlzYWJsZWQgKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1odGNoZXJhbGQuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaHRjaGVyYWxkLmMKaW5kZXggOTUyNWVmOS4uZTQyNGRmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1odGNoZXJhbGQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWh0Y2hlcmFsZC5jCkBAIC00MDEsNyArNDAxLDcgQEAKIH07CiAKIC8qIE1NQyBDYXJkICovCi0jaWYgZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19NTUNfT01BUCkKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSBodGNfbW1jMV9kYXRhID0gewogCS5ucl9zbG90cyAgICAgICAgICAgICAgICAgICAgICAgPSAxLAogCS5zd2l0Y2hfc2xvdCAgICAgICAgICAgICAgICAgICAgPSBOVUxMLApAQCAtNTg2LDcgKzU4Niw3IEBACiAKIAlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMSwgMTAwLCBOVUxMLCAwKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01NQ19PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTU1DX09NQVApCiAJaHRjX21tY19kYXRhWzBdID0gJmh0Y19tbWMxX2RhdGE7CiAJb21hcDFfaW5pdF9tbWMoaHRjX21tY19kYXRhLCAxKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtaW5ub3ZhdG9yLmMKaW5kZXggYWU5MGJkMC4uNjdlMTg4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1pbm5vdmF0b3IuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWlubm92YXRvci5jCkBAIC0zMTUsNyArMzE1LDcgQEAKICNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfT01BUCkKIAkuaG1jX21vZGUJPSAxOSwJLyogMDpob3N0KG9mZikgMTpkZXZ8b3RnIDI6ZGlzYWJsZWQgKi8KIAkvKiAuaG1jX21vZGUJPSAyMSwqLwkvKiAwOmhvc3Qob2ZmKSAxOmRldihsb29wYmFjaykgMjpob3N0KGxvb3BiYWNrKSAqLwotI2VsaWYJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorI2VsaWYJSVNfRU5BQkxFRChDT05GSUdfVVNCX09IQ0lfSENEKQogCS8qIE5PTlNUQU5EQVJEIENBQkxFIE5FRURFRCAoQi10by1NaW5pLUIpICovCiAJLmhtY19tb2RlCT0gMjAsCS8qIDE6ZGV2fG90ZyhvZmYpIDE6aG9zdCAyOmRpc2FibGVkICovCiAjZW5kaWYKQEAgLTMyOCw3ICszMjgsNyBAQAogfTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19NTUNfT01BUCkKIAogc3RhdGljIGludCBtbWNfc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QsIGludCBwb3dlcl9vbiwKIAkJCQlpbnQgdmRkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1ub2tpYTc3MC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1ub2tpYTc3MC5jCmluZGV4IGRkM2EzYWQuLmVlOGQ5ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtbm9raWE3NzAuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLW5va2lhNzcwLmMKQEAgLTE1OSw3ICsxNTksNyBAQAogCS5leHRjb24JCT0gInRhaHZvLXVzYiIsCiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19NTUNfT01BUCkKIAogI2RlZmluZSBOT0tJQTc3MF9HUElPX01NQ19QT1dFUgkJNDEKICNkZWZpbmUgTk9LSUE3NzBfR1BJT19NTUNfU1dJVENICTIzCkBAIC0yMTYsNyArMjE2LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfSTJDX0NCVVNfR1BJTykgfHwgZGVmaW5lZChDT05GSUdfSTJDX0NCVVNfR1BJT19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDX0NCVVNfR1BJTykKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NidXNfcGxhdGZvcm1fZGF0YSBub2tpYTc3MF9jYnVzX2RhdGEgPSB7CiAJLmNsa19ncGlvID0gT01BUF9NUFVJTyg5KSwKIAkuZGF0X2dwaW8gPSBPTUFQX01QVUlPKDEwKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtc3gxLW1tYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEtbW1jLmMKaW5kZXggYTkzNzM1Ny4uNzlmMGFmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEtbW1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1zeDEtbW1jLmMKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2luY2x1ZGUgIm1tYy5oIgogCi0jaWYgZGVmaW5lZChDT05GSUdfTU1DX09NQVApIHx8IGRlZmluZWQoQ09ORklHX01NQ19PTUFQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19NTUNfT01BUCkKIAogc3RhdGljIGludCBtbWNfc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHNsb3QsIGludCBwb3dlcl9vbiwKIAkJCQlpbnQgdmRkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYwppbmRleCA4YzhiZTg2Li5iYWFmOTAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2RldmljZXMuYwpAQCAtMzMsNyArMzMsNyBAQAogI2luY2x1ZGUgIm1tYy5oIgogI2luY2x1ZGUgInNyYW0uaCIKIAotI2lmIGRlZmluZWQoQ09ORklHX1JUQ19EUlZfT01BUCkgfHwgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9PTUFQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19SVENfRFJWX09NQVApCiAKICNkZWZpbmUJT01BUF9SVENfQkFTRQkJMHhmZmZiNDgwMAogCkBAIC03Miw3ICs3Miw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19NTUNfT01BUCkgfHwgZGVmaW5lZChDT05GSUdfTU1DX09NQVBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX01NQ19PTUFQKQogCiBzdGF0aWMgaW5saW5lIHZvaWQgb21hcDFfbW1jX211eChzdHJ1Y3Qgb21hcF9tbWNfcGxhdGZvcm1fZGF0YSAqbW1jX2NvbnRyb2xsZXIsCiAJCQlpbnQgY29udHJvbGxlcl9ucikKQEAgLTIzMCw3ICsyMzAsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogT01BUDd4eCBTUEkgc3VwcG9ydCAqLwotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9PTUFQXzEwMEspIHx8IGRlZmluZWQoQ09ORklHX1NQSV9PTUFQXzEwMEtfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NQSV9PTUFQXzEwMEspCiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcF9zcGkxID0gewogCS5uYW1lICAgICAgICAgICA9ICJvbWFwMV9zcGkxMDBrIiwKQEAgLTMxMiw3ICszMTIsNyBAQAogICogbWNic3AxLi4zCT0gNS4uNwogICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfT01BUF9VV0lSRSkgfHwgZGVmaW5lZChDT05GSUdfU1BJX09NQVBfVVdJUkVfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NQSV9PTUFQX1VXSVJFKQogCiAjZGVmaW5lCU9NQVBfVVdJUkVfQkFTRQkJMHhmZmZiMzAwMAogCkBAIC00MTgsNyArNDE4LDcgQEAKIH0KIGFyY2hfaW5pdGNhbGwob21hcDFfaW5pdF9kZXZpY2VzKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX09NQVBfV0FUQ0hET0cpIHx8IGRlZmluZWQoQ09ORklHX09NQVBfV0FUQ0hET0dfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX09NQVBfV0FUQ0hET0cpCiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugd2R0X3Jlc291cmNlc1tdID0gewogCXsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvZmIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvZmIuYwppbmRleCBjNzcwZDQ1Li5kZGFiMDQwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL2ZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9mYi5jCkBAIC0zMyw3ICszMyw3IEBACiAKICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0ZCX09NQVApIHx8IGRlZmluZWQoQ09ORklHX0ZCX09NQVBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0ZCX09NQVApCiAKIHN0YXRpYyBib29sIG9tYXBmYl9sY2RfY29uZmlndXJlZDsKIHN0YXRpYyBzdHJ1Y3Qgb21hcGZiX3BsYXRmb3JtX2RhdGEgb21hcGZiX2NvbmZpZzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvaW5jbHVkZS9tYWNoL3VzYi5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvdXNiLmgKaW5kZXggMmMyNjMwNS4uYTdjNTU1OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvdXNiLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9pbmNsdWRlL21hY2gvdXNiLmgKQEAgLTEyLDcgKzEyLDcgQEAKIAogdm9pZCBvbWFwX290Z19pbml0KHN0cnVjdCBvbWFwX3VzYl9jb25maWcgKmNvbmZpZyk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19VU0IpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVVNCKQogdm9pZCBvbWFwMV91c2JfaW5pdChzdHJ1Y3Qgb21hcF91c2JfY29uZmlnICpwZGF0YSk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIG9tYXAxX3VzYl9pbml0KHN0cnVjdCBvbWFwX3VzYl9jb25maWcgKnBkYXRhKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9tbWMuaCBiL2FyY2gvYXJtL21hY2gtb21hcDEvbW1jLmgKaW5kZXggMzljMmIxMy4uZDdiNDY4OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMS9tbWMuaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAxL21tYy5oCkBAIC03LDcgKzcsNyBAQAogI2RlZmluZSBPTUFQMV9NTUMxX0JBU0UJCTB4ZmZmYjc4MDAKICNkZWZpbmUgT01BUDFfTU1DMl9CQVNFCQkweGZmZmI3YzAwCS8qIG9tYXAxNnh4IG9ubHkgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX01NQ19PTUFQKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTU1DX09NQVApCiB2b2lkIG9tYXAxX2luaXRfbW1jKHN0cnVjdCBvbWFwX21tY19wbGF0Zm9ybV9kYXRhICoqbW1jX2RhdGEsCiAJCQkJaW50IG5yX2NvbnRyb2xsZXJzKTsKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL3VzYi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS91c2IuYwppbmRleCA0MTE4ZGI1Li4yNTA2ZTU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAxL3VzYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvdXNiLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCX0KICNlbmRpZgogCi0jaWYJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorI2lmCUlTX0VOQUJMRUQoQ09ORklHX1VTQl9PSENJX0hDRCkKIAlpZiAoY29uZmlnLT5vdGcgfHwgY29uZmlnLT5yZWdpc3Rlcl9ob3N0KSB7CiAJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9oY2lfZGV2aWNlID0gY29uZmlnLT5vaGNpX2RldmljZTsKIAkJaW50IHN0YXR1czsKQEAgLTIyMSw3ICsyMjEsNyBAQAogCiAjZW5kaWYKIAotI2lmCWRlZmluZWQoQ09ORklHX1VTQl9PSENJX0hDRCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEX01PRFVMRSkKKyNpZglJU19FTkFCTEVEKENPTkZJR19VU0JfT0hDSV9IQ0QpCiAKIC8qIFRoZSBkbWFtYXNrIG11c3QgYmUgc2V0IGZvciBPSENJIHRvIHdvcmsgKi8KIHN0YXRpYyB1NjQgb2hjaV9kbWFtYXNrID0gfih1MzIpMDsKQEAgLTYxMiw3ICs2MTIsNyBAQAogCX0KICNlbmRpZgogCi0jaWYJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorI2lmCUlTX0VOQUJMRUQoQ09ORklHX1VTQl9PSENJX0hDRCkKIAlpZiAoY29uZmlnLT5yZWdpc3Rlcl9ob3N0KSB7CiAJCWludCBzdGF0dXM7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtb21hcDIvS2NvbmZpZwppbmRleCA1YTBiMzgwLi5hOWFmZWViIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9LY29uZmlnCkBAIC0xOTIsMTIgKzE5Miw2IEBACiAJZGVwZW5kcyBvbiBBUkNIX09NQVAyICYmIFNPQ19PTUFQMjQyMAogCWRlZmF1bHQgeSBpZiBNQUNIX05PS0lBX044WDAKIAotY29uZmlnIE1BQ0hfT01BUF9MRFAKLQlib29sICJPTUFQMyBMRFAgYm9hcmQiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAzCi0JZGVmYXVsdCB5Ci0Jc2VsZWN0IE9NQVBfUEFDS0FHRV9DQkIKLQogY29uZmlnIE1BQ0hfT01BUDM1MTdFVk0KIAlib29sICJPTUFQMzUxNy8gQU0zNTE3IEVWTSBib2FyZCIKIAlkZXBlbmRzIG9uIEFSQ0hfT01BUDMKQEAgLTIyMiwxMiArMjE2LDYgQEAKIAlzZWxlY3QgTUFDSF9OT0tJQV9OODEwCiAJc2VsZWN0IE1BQ0hfTk9LSUFfTjgxMF9XSU1BWAogCi1jb25maWcgTUFDSF9OT0tJQV9SWDUxCi0JYm9vbCAiTm9raWEgTjkwMCAoUlgtNTEpIHBob25lIgotCWRlcGVuZHMgb24gQVJDSF9PTUFQMwotCWRlZmF1bHQgeQotCXNlbGVjdCBPTUFQX1BBQ0tBR0VfQ0JCCi0KIGNvbmZpZyBPTUFQM19TRFJDX0FDX1RJTUlORwogCWJvb2wgIkVuYWJsZSBTRFJDIEFDIHRpbWluZyByZWdpc3RlciBjaGFuZ2VzIgogCWRlcGVuZHMgb24gQVJDSF9PTUFQMwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtb21hcDIvTWFrZWZpbGUKaW5kZXggYTdmMmQwNS4uNWIzN2VjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL01ha2VmaWxlCkBAIC0yMzEsMTEgKzIzMSw3IEBACiAKICMgU3BlY2lmaWMgYm9hcmQgc3VwcG9ydAogb2JqLSQoQ09ORklHX01BQ0hfT01BUF9HRU5FUklDKQkJKz0gYm9hcmQtZ2VuZXJpYy5vIHBkYXRhLXF1aXJrcy5vCi1vYmotJChDT05GSUdfTUFDSF9PTUFQX0xEUCkJCSs9IGJvYXJkLWxkcC5vCiBvYmotJChDT05GSUdfTUFDSF9OT0tJQV9OOFgwKQkJKz0gYm9hcmQtbjh4MC5vCi1vYmotJChDT05GSUdfTUFDSF9OT0tJQV9SWDUxKQkJKz0gYm9hcmQtcng1MS5vIHNkcmFtLW5va2lhLm8KLW9iai0kKENPTkZJR19NQUNIX05PS0lBX1JYNTEpCQkrPSBib2FyZC1yeDUxLXBlcmlwaGVyYWxzLm8KLW9iai0kKENPTkZJR19NQUNIX05PS0lBX1JYNTEpCQkrPSBib2FyZC1yeDUxLXZpZGVvLm8KIAogIyBQbGF0Zm9ybSBzcGVjaWZpYyBkZXZpY2UgaW5pdCBjb2RlCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZmxhc2guYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZmxhc2guYwppbmRleCA3MGIyMWNjLi4yMTg4ZGMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWZsYXNoLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1mbGFzaC5jCkBAIC04MSw4ICs4MSw3IEBACiAJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIE5PUiBkZXZpY2VcbiIpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX09ORU5BTkRfT01BUDIpIHx8IFwKLQkJZGVmaW5lZChDT05GSUdfTVREX09ORU5BTkRfT01BUDJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX01URF9PTkVOQU5EX09NQVAyKQogc3RhdGljIHN0cnVjdCBvbWFwX29uZW5hbmRfcGxhdGZvcm1fZGF0YSBib2FyZF9vbmVuYW5kX2RhdGEgPSB7CiAJLmRtYV9jaGFubmVsCT0gLTEsICAgLyogZGlzYWJsZSBETUEgaW4gT01BUCBPbmVOQU5EIGRyaXZlciAqLwogfTsKQEAgLTk3LDEwICs5Niw5IEBACiAKIAlncG1jX29uZW5hbmRfaW5pdCgmYm9hcmRfb25lbmFuZF9kYXRhKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfTVREX09ORU5BTkRfT01BUDIgfHwgQ09ORklHX01URF9PTkVOQU5EX09NQVAyX01PRFVMRSAqLworI2VuZGlmIC8qIElTX0VOQUJMRUQoQ09ORklHX01URF9PTkVOQU5EX09NQVAyKSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX05BTkRfT01BUDIpIHx8IFwKLQkJZGVmaW5lZChDT05GSUdfTVREX05BTkRfT01BUDJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX01URF9OQU5EX09NQVAyKQogCiAvKiBOb3RlIHRoYXQgYWxsIHZhbHVlcyBpbiB0aGlzIHN0cnVjdCBhcmUgaW4gbmFub3NlY29uZHMgKi8KIHN0cnVjdCBncG1jX3RpbWluZ3MgbmFuZF9kZWZhdWx0X3RpbWluZ3NbMV0gPSB7CkBAIC0xNDQsNyArMTQyLDcgQEAKIAlib2FyZF9uYW5kX2RhdGEuZWNjX29wdCA9IE9NQVBfRUNDX0hBTTFfQ09ERV9TVzsKIAlncG1jX25hbmRfaW5pdCgmYm9hcmRfbmFuZF9kYXRhLCBncG1jX3QpOwogfQotI2VuZGlmIC8qIENPTkZJR19NVERfTkFORF9PTUFQMiB8fCBDT05GSUdfTVREX05BTkRfT01BUDJfTU9EVUxFICovCisjZW5kaWYgLyogSVNfRU5BQkxFRChDT05GSUdfTVREX05BTkRfT01BUDIpICovCiAKIC8qKgogICogZ2V0X2dwbWMwX3R5cGUgLSBSZWFkcyB0aGUgRlBHQSBESVBfU1dJVENIX0lOUFVUX1JFR0lTVEVSMiB0byBnZXQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZmxhc2guaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtZmxhc2guaAppbmRleCBlYTlhYWViLi44YjM5ZWVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWZsYXNoLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1mbGFzaC5oCkBAIC0yMywxMCArMjMsNyBAQAogCWludCBucl9wYXJ0czsKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMikgfHwgXAotCQlkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMl9NT0RVTEUpIHx8IFwKLQkJZGVmaW5lZChDT05GSUdfTVREX09ORU5BTkRfT01BUDIpIHx8IFwKLQkJZGVmaW5lZChDT05GSUdfTVREX09ORU5BTkRfT01BUDJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX01URF9OQU5EX09NQVAyKSB8fCBJU19FTkFCTEVEKENPTkZJR19NVERfT05FTkFORF9PTUFQMikKIGV4dGVybiB2b2lkIGJvYXJkX2ZsYXNoX2luaXQoc3RydWN0IGZsYXNoX3BhcnRpdGlvbnMgW10sCiAJCQkJY2hhciBjaGlwX3NlbFtdW0dQTUNfQ1NfTlVNXSwgaW50IG5hbmRfdHlwZSk7CiAjZWxzZQpAQCAtMzYsOCArMzMsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMikgfHwgXAotCQlkZWZpbmVkKENPTkZJR19NVERfTkFORF9PTUFQMl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTVREX05BTkRfT01BUDIpCiBleHRlcm4gdm9pZCBib2FyZF9uYW5kX2luaXQoc3RydWN0IG10ZF9wYXJ0aXRpb24gKm5hbmRfcGFydHMsCiAJCXU4IG5yX3BhcnRzLCB1OCBjcywgaW50IG5hbmRfdHlwZSwgc3RydWN0IGdwbWNfdGltaW5ncyAqZ3BtY190KTsKIGV4dGVybiBzdHJ1Y3QgZ3BtY190aW1pbmdzIG5hbmRfZGVmYXVsdF90aW1pbmdzW107CkBAIC00OSw4ICs0NSw3IEBACiAjZGVmaW5lCW5hbmRfZGVmYXVsdF90aW1pbmdzCU5VTEwKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfTVREX09ORU5BTkRfT01BUDIpIHx8IFwKLQkJZGVmaW5lZChDT05GSUdfTVREX09ORU5BTkRfT01BUDJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX01URF9PTkVOQU5EX09NQVAyKQogZXh0ZXJuIHZvaWQgYm9hcmRfb25lbmFuZF9pbml0KHN0cnVjdCBtdGRfcGFydGl0aW9uICpuYW5kX3BhcnRzLAogCQkJCQl1OCBucl9wYXJ0cywgdTggY3MpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLWxkcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTA3OTViLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbGRwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGV4YXMgSW5zdHJ1bWVudHMgSW5jLgotICogTmlzaGFudCBLYW1hdCA8bnNrYW1hdEB0aS5jb20+Ci0gKgotICogTW9kaWZpZWQgZnJvbSBtYWNoLW9tYXAyL2JvYXJkLTM0MzBzZHAuYwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpb19rZXlzLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9maXhlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjL3R3bC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc21zYzkxMXguaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9waHkuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3NwaS1vbWFwMi1tY3NwaS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlICJjb21tb24uaCIKLSNpbmNsdWRlICJncG1jLmgiCi0jaW5jbHVkZSAiZ3BtYy1zbXNjOTExeC5oIgotCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9vbWFwZHNzLmg+Ci0jaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1kYXRhLmg+Ci0KLSNpbmNsdWRlICJib2FyZC1mbGFzaC5oIgotI2luY2x1ZGUgIm11eC5oIgotI2luY2x1ZGUgImhzbW1jLmgiCi0jaW5jbHVkZSAiY29udHJvbC5oIgotI2luY2x1ZGUgImNvbW1vbi1ib2FyZC1kZXZpY2VzLmgiCi0jaW5jbHVkZSAiZGlzcGxheS5oIgotCi0jZGVmaW5lIExEUF9TTVNDOTExWF9DUwkJMQotI2RlZmluZSBMRFBfU01TQzkxMVhfR1BJTwkxNTIKLSNkZWZpbmUgREVCVUdfQkFTRQkJMHgwODAwMDAwMAotI2RlZmluZSBMRFBfRVRIUl9TVEFSVAkJREVCVUdfQkFTRQotCi1zdGF0aWMgdWludDMyX3QgYm9hcmRfa2V5bWFwW10gPSB7Ci0JS0VZKDAsIDAsIEtFWV8xKSwKLQlLRVkoMSwgMCwgS0VZXzIpLAotCUtFWSgyLCAwLCBLRVlfMyksCi0JS0VZKDAsIDEsIEtFWV80KSwKLQlLRVkoMSwgMSwgS0VZXzUpLAotCUtFWSgyLCAxLCBLRVlfNiksCi0JS0VZKDMsIDEsIEtFWV9GNSksCi0JS0VZKDAsIDIsIEtFWV83KSwKLQlLRVkoMSwgMiwgS0VZXzgpLAotCUtFWSgyLCAyLCBLRVlfOSksCi0JS0VZKDMsIDIsIEtFWV9GNiksCi0JS0VZKDAsIDMsIEtFWV9GNyksCi0JS0VZKDEsIDMsIEtFWV8wKSwKLQlLRVkoMiwgMywgS0VZX0Y4KSwKLQlQRVJTSVNURU5UX0tFWSg0LCA1KSwKLQlLRVkoNCwgNCwgS0VZX1ZPTFVNRVVQKSwKLQlLRVkoNSwgNSwgS0VZX1ZPTFVNRURPV04pLAotCTAKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhIGJvYXJkX21hcF9kYXRhID0gewotCS5rZXltYXAJCQk9IGJvYXJkX2tleW1hcCwKLQkua2V5bWFwX3NpemUJCT0gQVJSQVlfU0laRShib2FyZF9rZXltYXApLAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX2tleXBhZF9kYXRhIGxkcF9rcF90d2w0MDMwX2RhdGEgPSB7Ci0JLmtleW1hcF9kYXRhCT0gJmJvYXJkX21hcF9kYXRhLAotCS5yb3dzCQk9IDYsCi0JLmNvbHMJCT0gNiwKLQkucmVwCQk9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IGdwaW9fa2V5c19idXR0b24gbGRwX2dwaW9fa2V5c19idXR0b25zW10gPSB7Ci0JWzBdID0gewotCQkuY29kZQkJCT0gS0VZX0VOVEVSLAotCQkuZ3BpbwkJCT0gMTAxLAotCQkuZGVzYwkJCT0gImVudGVyIHN3IiwKLQkJLmFjdGl2ZV9sb3cJCT0gMSwKLQkJLmRlYm91bmNlX2ludGVydmFsCT0gMzAsCi0JfSwKLQlbMV0gPSB7Ci0JCS5jb2RlCQkJPSBLRVlfRjEsCi0JCS5ncGlvCQkJPSAxMDIsCi0JCS5kZXNjCQkJPSAiZnVuYyAxIiwKLQkJLmFjdGl2ZV9sb3cJCT0gMSwKLQkJLmRlYm91bmNlX2ludGVydmFsCT0gMzAsCi0JfSwKLQlbMl0gPSB7Ci0JCS5jb2RlCQkJPSBLRVlfRjIsCi0JCS5ncGlvCQkJPSAxMDMsCi0JCS5kZXNjCQkJPSAiZnVuYyAyIiwKLQkJLmFjdGl2ZV9sb3cJCT0gMSwKLQkJLmRlYm91bmNlX2ludGVydmFsCT0gMzAsCi0JfSwKLQlbM10gPSB7Ci0JCS5jb2RlCQkJPSBLRVlfRjMsCi0JCS5ncGlvCQkJPSAxMDQsCi0JCS5kZXNjCQkJPSAiZnVuYyAzIiwKLQkJLmFjdGl2ZV9sb3cJCT0gMSwKLQkJLmRlYm91bmNlX2ludGVydmFsIAk9IDMwLAotCX0sCi0JWzRdID0gewotCQkuY29kZQkJCT0gS0VZX0Y0LAotCQkuZ3BpbwkJCT0gMTA1LAotCQkuZGVzYwkJCT0gImZ1bmMgNCIsCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDMwLAotCX0sCi0JWzVdID0gewotCQkuY29kZQkJCT0gS0VZX0xFRlQsCi0JCS5ncGlvCQkJPSAxMDYsCi0JCS5kZXNjCQkJPSAibGVmdCBzdyIsCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IDMwLAotCX0sCi0JWzZdID0gewotCQkuY29kZQkJCT0gS0VZX1JJR0hULAotCQkuZ3BpbwkJCT0gMTA3LAotCQkuZGVzYwkJCT0gInJpZ2h0IHN3IiwKLQkJLmFjdGl2ZV9sb3cJCT0gMSwKLQkJLmRlYm91bmNlX2ludGVydmFsCT0gMzAsCi0JfSwKLQlbN10gPSB7Ci0JCS5jb2RlCQkJPSBLRVlfVVAsCi0JCS5ncGlvCQkJPSAxMDgsCi0JCS5kZXNjCQkJPSAidXAgc3ciLAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAzMCwKLQl9LAotCVs4XSA9IHsKLQkJLmNvZGUJCQk9IEtFWV9ET1dOLAotCQkuZ3BpbwkJCT0gMTA5LAotCQkuZGVzYwkJCT0gImRvd24gc3ciLAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSAzMCwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvX2tleXNfcGxhdGZvcm1fZGF0YSBsZHBfZ3Bpb19rZXlzID0gewotCS5idXR0b25zCQk9IGxkcF9ncGlvX2tleXNfYnV0dG9ucywKLQkubmJ1dHRvbnMJCT0gQVJSQVlfU0laRShsZHBfZ3Bpb19rZXlzX2J1dHRvbnMpLAotCS5yZXAJCQk9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsZHBfZ3Bpb19rZXlzX2RldmljZSA9IHsKLQkubmFtZQkJPSAiZ3Bpby1rZXlzIiwKLQkuaWQJCT0gLTEsCi0JLmRldgkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJmxkcF9ncGlvX2tleXMsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9zbXNjOTExeF9wbGF0Zm9ybV9kYXRhIHNtc2M5MTF4X2NmZyA9IHsKLQkuY3MgICAgICAgICAgICAgPSBMRFBfU01TQzkxMVhfQ1MsCi0JLmdwaW9faXJxICAgICAgID0gTERQX1NNU0M5MTFYX0dQSU8sCi0JLmdwaW9fcmVzZXQgICAgID0gLUVJTlZBTCwKLQkuZmxhZ3MJCT0gU01TQzkxMVhfVVNFXzMyQklULAotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCBsZHBfaW5pdF9zbXNjOTExeCh2b2lkKQotewotCWdwbWNfc21zYzkxMXhfaW5pdCgmc21zYzkxMXhfY2ZnKTsKLX0KLQotLyogTENEICovCi0KLSNkZWZpbmUgTENEX1BBTkVMX1JFU0VUX0dQSU8JCTU1Ci0jZGVmaW5lIExDRF9QQU5FTF9RVkdBX0dQSU8JCTU2Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGlzcGxheV90aW1pbmcgbGRwX2xjZF92aWRlb21vZGUgPSB7Ci0JLnBpeGVsY2xvY2sJPSB7IDAsIDU0MDAwMDAsIDAgfSwKLQotCS5oYWN0aXZlID0geyAwLCAyNDAsIDAgfSwKLQkuaGZyb250X3BvcmNoID0geyAwLCAzLCAwIH0sCi0JLmhiYWNrX3BvcmNoID0geyAwLCAzOSwgMCB9LAotCS5oc3luY19sZW4gPSB7IDAsIDMsIDAgfSwKLQotCS52YWN0aXZlID0geyAwLCAzMjAsIDAgfSwKLQkudmZyb250X3BvcmNoID0geyAwLCAyLCAwIH0sCi0JLnZiYWNrX3BvcmNoID0geyAwLCA3LCAwIH0sCi0JLnZzeW5jX2xlbiA9IHsgMCwgMSwgMCB9LAotCi0JLmZsYWdzID0gRElTUExBWV9GTEFHU19IU1lOQ19MT1cgfCBESVNQTEFZX0ZMQUdTX1ZTWU5DX0xPVyB8Ci0JCURJU1BMQVlfRkxBR1NfREVfSElHSCB8IERJU1BMQVlfRkxBR1NfUElYREFUQV9QT1NFREdFLAotfTsKLQotc3RhdGljIHN0cnVjdCBwYW5lbF9kcGlfcGxhdGZvcm1fZGF0YSBsZHBfbGNkX3BkYXRhID0gewotCS5uYW1lICAgICAgICAgICAgICAgICAgID0gImxjZCIsCi0JLnNvdXJjZSAgICAgICAgICAgICAgICAgPSAiZHBpLjAiLAotCi0JLmRhdGFfbGluZXMJCT0gMTgsCi0KLQkuZGlzcGxheV90aW1pbmcJCT0gJmxkcF9sY2RfdmlkZW9tb2RlLAotCi0JLmVuYWJsZV9ncGlvCQk9IC0xLAkvKiBmaWxsZWQgaW4gY29kZSAqLwotCS5iYWNrbGlnaHRfZ3BpbwkJPSAtMSwJLyogZmlsbGVkIGluIGNvZGUgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxkcF9sY2RfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICAgICAgICAgID0gInBhbmVsLWRwaSIsCi0JLmlkICAgICAgICAgICAgICAgICAgICAgPSAwLAotCS5kZXYucGxhdGZvcm1fZGF0YSAgICAgID0gJmxkcF9sY2RfcGRhdGEsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfZHNzX2JvYXJkX2luZm8gbGRwX2Rzc19kYXRhID0gewotCS5kZWZhdWx0X2Rpc3BsYXlfbmFtZSA9ICJsY2QiLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGxkcF9kaXNwbGF5X2luaXQodm9pZCkKLXsKLQlpbnQgcjsKLQotCXN0YXRpYyBzdHJ1Y3QgZ3BpbyBncGlvc1tdIF9faW5pdGRhdGEgPSB7Ci0JCXtMQ0RfUEFORUxfUkVTRVRfR1BJTywgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIkxDRCBSRVNFVCJ9LAotCQl7TENEX1BBTkVMX1FWR0FfR1BJTywgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIkxDRCBRVkdBIn0sCi0JfTsKLQotCXIgPSBncGlvX3JlcXVlc3RfYXJyYXkoZ3Bpb3MsIEFSUkFZX1NJWkUoZ3Bpb3MpKTsKLQlpZiAocikgewotCQlwcl9lcnIoIkNhbm5vdCByZXF1ZXN0IExDRCBHUElPcywgZXJyb3IgJWRcbiIsIHIpOwotCQlyZXR1cm47Ci0JfQotCi0Jb21hcF9kaXNwbGF5X2luaXQoJmxkcF9kc3NfZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgbGRwX3R3bF9ncGlvX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgZ3BpbywgdW5zaWduZWQgbmdwaW8pCi17Ci0JaW50IHJlczsKLQotCS8qIExDRCBlbmFibGUgR1BJTyAqLwotCWxkcF9sY2RfcGRhdGEuZW5hYmxlX2dwaW8gPSBncGlvICsgNzsKLQotCS8qIEJhY2tsaWdodCBlbmFibGUgR1BJTyAqLwotCWxkcF9sY2RfcGRhdGEuYmFja2xpZ2h0X2dwaW8gPSBncGlvICsgMTU7Ci0KLQlyZXMgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmxkcF9sY2RfZGV2aWNlKTsKLQlpZiAocmVzKQotCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciBMQ0Q6ICVkXG4iLCByZXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9ncGlvX3BsYXRmb3JtX2RhdGEgbGRwX2dwaW9fZGF0YSA9IHsKLQkuc2V0dXAJCT0gbGRwX3R3bF9ncGlvX3NldHVwLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxkcF92bW1jMV9zdXBwbHlbXSA9IHsKLQlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgIm9tYXBfaHNtbWMuMCIpLAotfTsKLQotLyogVk1NQzEgZm9yIE1NQzEgcGlucyBDTUQsIENMSywgREFUMC4uREFUMyAoMjAgbUEsIHBsdXMgY2FyZCA9PSBtYXggMjIwIG1BKSAqLwotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxkcF92bW1jMSA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5taW5fdVYJCQk9IDE4NTAwMDAsCi0JCS5tYXhfdVYJCQk9IDMxNTAwMDAsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfVk9MVEFHRQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUobGRwX3ZtbWMxX3N1cHBseSksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbGRwX3ZtbWMxX3N1cHBseSwKLX07Ci0KLS8qIGFkczc4NDYgb24gU1BJICovCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgbGRwX3ZhdXgxX3N1cHBsaWVzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidmNjIiwgInNwaTEuMCIpLAotfTsKLQotLyogVkFVWDEgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSBsZHBfdmF1eDEgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWCQkJPSAzMDAwMDAwLAotCQkubWF4X3VWCQkJPSAzMDAwMDAwLAotCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCQk9IEFSUkFZX1NJWkUobGRwX3ZhdXgxX3N1cHBsaWVzKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJCT0gbGRwX3ZhdXgxX3N1cHBsaWVzLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IGxkcF92cGxsMl9zdXBwbGllc1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfZHNpIiwgIm9tYXBkc3MiKSwKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2RzaSIsICJvbWFwZHNzX2RwaS4wIiksCi0JUkVHVUxBVE9SX1NVUFBMWSgidmRkc19kc2kiLCAib21hcGRzc19kc2kuMCIpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIGxkcF92cGxsMiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVkRWSSIsCi0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKGxkcF92cGxsMl9zdXBwbGllcyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gbGRwX3ZwbGwyX3N1cHBsaWVzLAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX3BsYXRmb3JtX2RhdGEgbGRwX3R3bGRhdGEgPSB7Ci0JLyogcGxhdGZvcm1fZGF0YSBmb3IgY2hpbGRyZW4gZ29lcyBoZXJlICovCi0JLnZtbWMxCQk9ICZsZHBfdm1tYzEsCi0JLnZhdXgxCQk9ICZsZHBfdmF1eDEsCi0JLnZwbGwyCQk9ICZsZHBfdnBsbDIsCi0JLmdwaW8JCT0gJmxkcF9ncGlvX2RhdGEsCi0JLmtleXBhZAkJPSAmbGRwX2twX3R3bDQwMzBfZGF0YSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG9tYXBfaTJjX2luaXQodm9pZCkKLXsKLQlvbWFwM19wbWljX2dldF9jb25maWcoJmxkcF90d2xkYXRhLAotCQkJICBUV0xfQ09NTU9OX1BEQVRBX1VTQiB8IFRXTF9DT01NT05fUERBVEFfTUFEQywgMCk7Ci0Jb21hcDNfcG1pY19pbml0KCJ0d2w0MDMwIiwgJmxkcF90d2xkYXRhKTsKLQlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMiwgNDAwLCBOVUxMLCAwKTsKLQlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMywgNDAwLCBOVUxMLCAwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBvbWFwMl9oc21tY19pbmZvIG1tY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkubW1jCQk9IDEsCi0JCS5jYXBzCQk9IE1NQ19DQVBfNF9CSVRfREFUQSwKLQkJLmdwaW9fY2QJPSAtRUlOVkFMLAotCQkuZ3Bpb193cAk9IC1FSU5WQUwsCi0JfSwKLQl7fQkvKiBUZXJtaW5hdG9yICovCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbGRwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewotCSZsZHBfZ3Bpb19rZXlzX2RldmljZSwKLX07Ci0KLSNpZmRlZiBDT05GSUdfT01BUF9NVVgKLXN0YXRpYyBzdHJ1Y3Qgb21hcF9ib2FyZF9tdXggYm9hcmRfbXV4W10gX19pbml0ZGF0YSA9IHsKLQl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAotfTsKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IG10ZF9wYXJ0aXRpb24gbGRwX25hbmRfcGFydGl0aW9uc1tdID0gewotCS8qIEFsbCB0aGUgcGFydGl0aW9uIHNpemVzIGFyZSBsaXN0ZWQgaW4gdGVybXMgb2YgTkFORCBibG9jayBzaXplICovCi0JewotCQkubmFtZQkJPSAiWC1Mb2FkZXItTkFORCIsCi0JCS5vZmZzZXQJCT0gMCwKLQkJLnNpemUJCT0gNCAqICg2NCAqIDIwNDgpLAkvKiA1MTJLQiwgMHg4MDAwMCAqLwotCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsCS8qIGZvcmNlIHJlYWQtb25seSAqLwotCX0sCi0JewotCQkubmFtZQkJPSAiVS1Cb290LU5BTkQiLAotCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwJLyogT2Zmc2V0ID0gMHg4MDAwMCAqLwotCQkuc2l6ZQkJPSAxMCAqICg2NCAqIDIwNDgpLAkvKiAxLjI1TUIsIDB4MTQwMDAwICovCi0JCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwJLyogZm9yY2UgcmVhZC1vbmx5ICovCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJCb290IEVudi1OQU5EIiwKLQkJLm9mZnNldAkJPSBNVERQQVJUX09GU19BUFBFTkQsICAgLyogT2Zmc2V0ID0gMHgxYzAwMDAgKi8KLQkJLnNpemUJCT0gMiAqICg2NCAqIDIwNDgpLAkvKiAyNTZLQiwgMHg0MDAwMCAqLwotCX0sCi0JewotCQkubmFtZQkJPSAiS2VybmVsLU5BTkQiLAotCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwJLyogT2Zmc2V0ID0gMHgwMjAwMDAwKi8KLQkJLnNpemUJCT0gMjQwICogKDY0ICogMjA0OCksCS8qIDMwTSwgMHgxRTAwMDAwICovCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJGaWxlIFN5c3RlbSAtIE5BTkQiLAotCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX0FQUEVORCwJLyogT2Zmc2V0ID0gMHgyMDAwMDAwICovCi0JCS5zaXplCQk9IE1URFBBUlRfU0laX0ZVTEwsCS8qIDk2TUIsIDB4NjAwMDAwMCAqLwotCX0sCi0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBkdW1teV9zdXBwbGllc1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZHZhcmlvIiwgInNtc2M5MTF4LjAiKSwKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGQzM2EiLCAic21zYzkxMXguMCIpLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IG9tYXBfbGRwX2luaXQodm9pZCkKLXsKLQlyZWd1bGF0b3JfcmVnaXN0ZXJfZml4ZWQoMCwgZHVtbXlfc3VwcGxpZXMsIEFSUkFZX1NJWkUoZHVtbXlfc3VwcGxpZXMpKTsKLQlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DQkIpOwotCWxkcF9pbml0X3Ntc2M5MTF4KCk7Ci0Jb21hcF9pMmNfaW5pdCgpOwotCXBsYXRmb3JtX2FkZF9kZXZpY2VzKGxkcF9kZXZpY2VzLCBBUlJBWV9TSVpFKGxkcF9kZXZpY2VzKSk7Ci0Jb21hcF9hZHM3ODQ2X2luaXQoMSwgNTQsIDMxMCwgTlVMTCk7Ci0Jb21hcF9zZXJpYWxfaW5pdCgpOwotCW9tYXBfc2RyY19pbml0KE5VTEwsIE5VTEwpOwotCXVzYl9iaW5kX3BoeSgibXVzYi1oZHJjLjAuYXV0byIsIDAsICJ0d2w0MDMwX3VzYiIpOwotCXVzYl9tdXNiX2luaXQoTlVMTCk7Ci0JYm9hcmRfbmFuZF9pbml0KGxkcF9uYW5kX3BhcnRpdGlvbnMsIEFSUkFZX1NJWkUobGRwX25hbmRfcGFydGl0aW9ucyksCi0JCQkwLCAwLCBuYW5kX2RlZmF1bHRfdGltaW5ncyk7Ci0KLQlvbWFwX2hzbW1jX2luaXQobW1jKTsKLQlsZHBfZGlzcGxheV9pbml0KCk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoT01BUF9MRFAsICJPTUFQIExEUCBib2FyZCIpCi0JLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCi0JLnJlc2VydmUJPSBvbWFwX3Jlc2VydmUsCi0JLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwMzQzMF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAotCS5pbml0X21hY2hpbmUJPSBvbWFwX2xkcF9pbml0LAotCS5pbml0X2xhdGUJPSBvbWFwMzQzMF9pbml0X2xhdGUsCi0JLmluaXRfdGltZQk9IG9tYXBfaW5pdF90aW1lLAotCS5yZXN0YXJ0CT0gb21hcDN4eHhfcmVzdGFydCwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLW44eDAuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbjh4MC5jCmluZGV4IGI2NDQzYTQuLjZiNmZkYTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbjh4MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtbjh4MC5jCkBAIC02Niw3ICs2Niw3IEBACiAJCXByX2VycigiVW5rbm93biBib2FyZFxuIik7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfTVVTQl9UVVNCNjAxMCkgfHwgZGVmaW5lZChDT05GSUdfVVNCX01VU0JfVFVTQjYwMTBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9NVVNCX1RVU0I2MDEwKQogLyoKICAqIEVuYWJsZSBvciBkaXNhYmxlIHBvd2VyIHRvIFRVU0I2MDEwLiBXaGVuIGVuYWJsaW5nLCB0dXJuIG9uIDMuMyBWIGFuZAogICogMS41IFYgdm9sdGFnZSByZWd1bGF0b3JzIG9mIFBNIGNvbXBhbmlvbiBjaGlwLiBDb21wYW5pb24gY2hpcCB3aWxsIHRoZW4KQEAgLTE2Myw4ICsxNjMsNyBAQAogCX0sCiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfTUVORUxBVVMpICYmCQkJCQkJXAotCShkZWZpbmVkKENPTkZJR19NTUNfT01BUCkgfHwgZGVmaW5lZChDT05GSUdfTU1DX09NQVBfTU9EVUxFKSkKKyNpZiBkZWZpbmVkKENPTkZJR19NRU5FTEFVUykgJiYgSVNfRU5BQkxFRChDT05GSUdfTU1DX09NQVApCiAKIC8qCiAgKiBPbiBib3RoIE44MDAgYW5kIE44MTAsIG9ubHkgdGhlIGZpcnN0IG9mIHRoZSB0d28gTU1DIGNvbnRyb2xsZXJzIGlzIGluIHVzZS4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YWI3MTIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEyICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IE5va2lhCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQvbWF0cml4X2tleXBhZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC93bDEyeHguaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvdHNjMjAwNS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy90d2wuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8vbWFjaGluZS5oPgotI2luY2x1ZGUgPGxpbnV4L29tYXAtZ3BtYy5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG93ZXIvaXNwMTcwNF9jaGFyZ2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9zcGktb21hcDItbWNzcGkuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL210ZC1vbmVuYW5kLW9tYXAyLmg+Ci0KLSNpbmNsdWRlIDxwbGF0L2RtdGltZXIuaD4KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW1faW5mby5oPgotCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0jaW5jbHVkZSA8bGludXgvb21hcC1kbWEuaD4KLQotI2luY2x1ZGUgImJvYXJkLXJ4NTEuaCIKLQotI2luY2x1ZGUgPHNvdW5kL3RsdjMyMGFpYzN4Lmg+Ci0jaW5jbHVkZSA8c291bmQvdHBhNjEzMGEyLXBsYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL21lZGlhL3NpNDcxMy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvbGVkcy1scDU1eHguaD4KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvdHNsMjU2My5oPgotI2luY2x1ZGUgPGxpbnV4L2xpczNsdjAyZC5oPgotCi0jaW5jbHVkZSA8dmlkZW8vb21hcC1wYW5lbC1kYXRhLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3B3bV9vbWFwX2RtdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL21lZGlhL2lyLXJ4NTEuaD4KLQotI2luY2x1ZGUgIm11eC5oIgotI2luY2x1ZGUgIm9tYXAtcG0uaCIKLSNpbmNsdWRlICJoc21tYy5oIgotI2luY2x1ZGUgImNvbW1vbi1ib2FyZC1kZXZpY2VzLmgiCi0jaW5jbHVkZSAic29jLmgiCi0jaW5jbHVkZSAib21hcC1zZWN1cmUuaCIKLQotI2RlZmluZSBTWVNURU1fUkVWX0JfVVNFU19WQVVYMwkweDE2OTkKLSNkZWZpbmUgU1lTVEVNX1JFVl9TX1VTRVNfVkFVWDMgMHg4Ci0KLSNkZWZpbmUgUlg1MV9XTDEyNTFfUE9XRVJfR1BJTwkJODcKLSNkZWZpbmUgUlg1MV9XTDEyNTFfSVJRX0dQSU8JCTQyCi0jZGVmaW5lIFJYNTFfRk1UWF9SRVNFVF9HUElPCQkxNjMKLSNkZWZpbmUgUlg1MV9GTVRYX0lSUQkJCTUzCi0jZGVmaW5lIFJYNTFfTFA1NTIzX0NISVBfRU5fR1BJTwk0MQotCi0jZGVmaW5lIFJYNTFfVVNCX1RSQU5TQ0VJVkVSX1JTVF9HUElPCTY3Ci0KLSNkZWZpbmUgUlg1MV9UU0MyMDA1X1JFU0VUX0dQSU8gICAgICAgICAxMDQKLSNkZWZpbmUgUlg1MV9UU0MyMDA1X0lSUV9HUElPICAgICAgICAgICAxMDAKLQotI2RlZmluZSBMSVMzMDJfSVJRMV9HUElPIDE4MQotI2RlZmluZSBMSVMzMDJfSVJRMl9HUElPIDE4MCAgLyogTm90IHlldCBpbiB1c2UgKi8KLQotLyogTGlzdCBhbGwgU1BJIGRldmljZXMgaGVyZS4gTm90ZSB0aGF0IHRoZSBsaXN0L3Byb2JlIG9yZGVyIHNlZW1zIHRvIG1hdHRlciEgKi8KLWVudW0gewotCVJYNTFfU1BJX1dMMTI1MSwKLQlSWDUxX1NQSV9UU0MyMDA1LAkvKiBUb3VjaCBDb250cm9sbGVyICovCi0JUlg1MV9TUElfTUlQSUQsCQkvKiBMQ0QgcGFuZWwgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgd2wxMjUxX3BsYXRmb3JtX2RhdGEgd2wxMjUxX3BkYXRhOwotc3RhdGljIHN0cnVjdCB0c2MyMDA1X3BsYXRmb3JtX2RhdGEgdHNjMjAwNV9wZGF0YTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1NFTlNPUlNfTElTM19JMkMpIHx8IGRlZmluZWQoQ09ORklHX1NFTlNPUlNfTElTM19JMkNfTU9EVUxFKQotc3RhdGljIGludCBsaXMzMDJfc2V0dXAodm9pZCkKLXsKLQlpbnQgZXJyOwotCWludCBpcnExID0gTElTMzAyX0lSUTFfR1BJTzsKLQlpbnQgaXJxMiA9IExJUzMwMl9JUlEyX0dQSU87Ci0KLQkvKiBncGlvIGZvciBpbnRlcnJ1cHQgcGluIDEgKi8KLQllcnIgPSBncGlvX3JlcXVlc3QoaXJxMSwgImxpczNsdjAyZGxfaXJxMSIpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJsaXMzbHYwMmRsOiBncGlvIHJlcXVlc3QgZmFpbGVkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogZ3BpbyBmb3IgaW50ZXJydXB0IHBpbiAyICovCi0JZXJyID0gZ3Bpb19yZXF1ZXN0KGlycTIsICJsaXMzbHYwMmRsX2lycTIiKTsKLQlpZiAoZXJyKSB7Ci0JCWdwaW9fZnJlZShpcnExKTsKLQkJcHJpbnRrKEtFUk5fRVJSICJsaXMzbHYwMmRsOiBncGlvIHJlcXVlc3QgZmFpbGVkXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZ3Bpb19kaXJlY3Rpb25faW5wdXQoaXJxMSk7Ci0JZ3Bpb19kaXJlY3Rpb25faW5wdXQoaXJxMik7Ci0KLW91dDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGxpczMwMl9yZWxlYXNlKHZvaWQpCi17Ci0JZ3Bpb19mcmVlKExJUzMwMl9JUlExX0dQSU8pOwotCWdwaW9fZnJlZShMSVMzMDJfSVJRMl9HUElPKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IGxpczNsdjAyZF9wbGF0Zm9ybV9kYXRhIHJ4NTFfbGlzM2x2MDJkX2RhdGEgPSB7Ci0JLmNsaWNrX2ZsYWdzICAgID0gTElTM19DTElDS19TSU5HTEVfWCB8IExJUzNfQ0xJQ0tfU0lOR0xFX1kgfAotCQkJICBMSVMzX0NMSUNLX1NJTkdMRV9aLAotCS8qIExpbWl0cyBhcmUgMC41ZyAqIHZhbHVlICovCi0JLmNsaWNrX3RocmVzaF94ID0gOCwKLQkuY2xpY2tfdGhyZXNoX3kgPSA4LAotCS5jbGlja190aHJlc2hfeiA9IDEwLAotCS8qIENsaWNrIG11c3QgYmUgbG9uZ2VyIHRoYW4gdGltZSBsaW1pdCAqLwotCS5jbGlja190aW1lX2xpbWl0ID0gOSwKLQkvKiBLaW5kIG9mIGRlYm91bmNlIGZpbHRlciAqLwotCS5jbGlja19sYXRlbmN5ICAgID0gNTAsCi0KLQkvKiBMaW1pdHMgZm9yIGFsbCBheGlzLiBtaWxsaWctdmFsdWUgLyAxOCB0byBnZXQgSFcgdmFsdWVzICovCi0JLndha2V1cF9mbGFncyA9IExJUzNfV0FLRVVQX1hfSEkgfCBMSVMzX1dBS0VVUF9ZX0hJLAotCS53YWtldXBfdGhyZXNoID0gODAwIC8gMTgsCi0JLndha2V1cF9mbGFnczIgPSBMSVMzX1dBS0VVUF9aX0hJICwKLQkud2FrZXVwX3RocmVzaDIgPSA5MDAgLyAxOCwKLQotCS5oaXBhc3NfY3RybCA9IExJUzNfSElQQVNTMV9ESVNBQkxFIHwgTElTM19ISVBBU1MyX0RJU0FCTEUsCi0KLQkvKiBJbnRlcnJ1cHQgbGluZSAyIGZvciBjbGljayBkZXRlY3Rpb24sIGxpbmUgMSBmb3IgdGhyZXNob2xkcyAqLwotCS5pcnFfY2ZnID0gTElTM19JUlEyX0NMSUNLIHwgTElTM19JUlExX0ZGX1dVXzEyLAotCi0JLmF4aXNfeCA9IExJUzNfREVWX1gsCi0JLmF4aXNfeSA9IExJUzNfSU5WX0RFVl9ZLAotCS5heGlzX3ogPSBMSVMzX0lOVl9ERVZfWiwKLQkuc2V0dXBfcmVzb3VyY2VzID0gbGlzMzAyX3NldHVwLAotCS5yZWxlYXNlX3Jlc291cmNlcyA9IGxpczMwMl9yZWxlYXNlLAotCS5zdF9taW5fbGltaXRzID0gey0zMiwgMywgM30sCi0JLnN0X21heF9saW1pdHMgPSB7LTMsIDMyLCAzMn0sCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TRU5TT1JTX1RTTDI1NjMpIHx8IGRlZmluZWQoQ09ORklHX1NFTlNPUlNfVFNMMjU2M19NT0RVTEUpCi1zdGF0aWMgc3RydWN0IHRzbDI1NjNfcGxhdGZvcm1fZGF0YSByeDUxX3RzbDI1NjNfcGxhdGZvcm1fZGF0YSA9IHsKLQkuY292ZXJfY29tcF9nYWluID0gMTYsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19MRURTX0xQNTUyMykgfHwgZGVmaW5lZChDT05GSUdfTEVEU19MUDU1MjNfTU9EVUxFKQotc3RhdGljIHN0cnVjdCBscDU1eHhfbGVkX2NvbmZpZyByeDUxX2xwNTUyM19sZWRfY29uZmlnW10gPSB7Ci0JewotCQkubmFtZQkJPSAibHA1NTIzOmtiMSIsCi0JCS5jaGFuX25yCT0gMCwKLQkJLmxlZF9jdXJyZW50CT0gNTAsCi0JCS5tYXhfY3VycmVudAk9IDEwMCwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJscDU1MjM6a2IyIiwKLQkJLmNoYW5fbnIJPSAxLAotCQkubGVkX2N1cnJlbnQJPSA1MCwKLQkJLm1heF9jdXJyZW50CT0gMTAwLAotCX0sIHsKLQkJLm5hbWUJCT0gImxwNTUyMzprYjMiLAotCQkuY2hhbl9ucgk9IDIsCi0JCS5sZWRfY3VycmVudAk9IDUwLAotCQkubWF4X2N1cnJlbnQJPSAxMDAsCi0JfSwgewotCQkubmFtZQkJPSAibHA1NTIzOmtiNCIsCi0JCS5jaGFuX25yCT0gMywKLQkJLmxlZF9jdXJyZW50CT0gNTAsCi0JCS5tYXhfY3VycmVudAk9IDEwMCwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJscDU1MjM6YiIsCi0JCS5jaGFuX25yCT0gNCwKLQkJLmxlZF9jdXJyZW50CT0gNTAsCi0JCS5tYXhfY3VycmVudAk9IDEwMCwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJscDU1MjM6ZyIsCi0JCS5jaGFuX25yCT0gNSwKLQkJLmxlZF9jdXJyZW50CT0gNTAsCi0JCS5tYXhfY3VycmVudAk9IDEwMCwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJscDU1MjM6ciIsCi0JCS5jaGFuX25yCT0gNiwKLQkJLmxlZF9jdXJyZW50CT0gNTAsCi0JCS5tYXhfY3VycmVudAk9IDEwMCwKLQl9LCB7Ci0JCS5uYW1lCQk9ICJscDU1MjM6a2I1IiwKLQkJLmNoYW5fbnIJPSA3LAotCQkubGVkX2N1cnJlbnQJPSA1MCwKLQkJLm1heF9jdXJyZW50CT0gMTAwLAotCX0sIHsKLQkJLm5hbWUJCT0gImxwNTUyMzprYjYiLAotCQkuY2hhbl9ucgk9IDgsCi0JCS5sZWRfY3VycmVudAk9IDUwLAotCQkubWF4X2N1cnJlbnQJPSAxMDAsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBscDU1eHhfcGxhdGZvcm1fZGF0YSByeDUxX2xwNTUyM19wbGF0Zm9ybV9kYXRhID0gewotCS5sZWRfY29uZmlnCQk9IHJ4NTFfbHA1NTIzX2xlZF9jb25maWcsCi0JLm51bV9jaGFubmVscwkJPSBBUlJBWV9TSVpFKHJ4NTFfbHA1NTIzX2xlZF9jb25maWcpLAotCS5jbG9ja19tb2RlCQk9IExQNTVYWF9DTE9DS19BVVRPLAotCS5lbmFibGVfZ3BpbwkJPSBSWDUxX0xQNTUyM19DSElQX0VOX0dQSU8sCi19OwotI2VuZGlmCi0KLSNkZWZpbmUgUlg1MV9MQ0RfUkVTRVRfR1BJTwk5MAotCi1zdGF0aWMgc3RydWN0IHBhbmVsX2FjeDU2NWFrbV9wbGF0Zm9ybV9kYXRhIGFjeF9wZGF0YSA9IHsKLQkubmFtZQkJPSAibGNkIiwKLQkuc291cmNlCQk9ICJzZGkuMCIsCi0JLnJlc2V0X2dwaW8JPSBSWDUxX0xDRF9SRVNFVF9HUElPLAotCS5kYXRhcGFpcnMJPSAyLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwMl9tY3NwaV9kZXZpY2VfY29uZmlnIHdsMTI1MV9tY3NwaV9jb25maWcgPSB7Ci0JLnR1cmJvX21vZGUJPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBvbWFwMl9tY3NwaV9kZXZpY2VfY29uZmlnIG1pcGlkX21jc3BpX2NvbmZpZyA9IHsKLQkudHVyYm9fbW9kZQk9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXAyX21jc3BpX2RldmljZV9jb25maWcgdHNjMjAwNV9tY3NwaV9jb25maWcgPSB7Ci0JLnR1cmJvX21vZGUJPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyByeDUxX3BlcmlwaGVyYWxzX3NwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKLQlbUlg1MV9TUElfV0wxMjUxXSA9IHsKLQkJLm1vZGFsaWFzCQk9ICJ3bDEyNTEiLAotCQkuYnVzX251bQkJPSA0LAotCQkuY2hpcF9zZWxlY3QJCT0gMCwKLQkJLm1heF9zcGVlZF9oeiAgIAk9IDQ4MDAwMDAwLAotCQkubW9kZSAgICAgICAgICAgICAgICAgICA9IFNQSV9NT0RFXzMsCi0JCS5jb250cm9sbGVyX2RhdGEJPSAmd2wxMjUxX21jc3BpX2NvbmZpZywKLQkJLnBsYXRmb3JtX2RhdGEJCT0gJndsMTI1MV9wZGF0YSwKLQl9LAotCVtSWDUxX1NQSV9NSVBJRF0gPSB7Ci0JCS5tb2RhbGlhcwkJPSAiYWN4NTY1YWttIiwKLQkJLmJ1c19udW0JCT0gMSwKLQkJLmNoaXBfc2VsZWN0CQk9IDIsCi0JCS5tYXhfc3BlZWRfaHoJCT0gNjAwMDAwMCwKLQkJLmNvbnRyb2xsZXJfZGF0YQk9ICZtaXBpZF9tY3NwaV9jb25maWcsCi0JCS5wbGF0Zm9ybV9kYXRhCQk9ICZhY3hfcGRhdGEsCi0JfSwKLQlbUlg1MV9TUElfVFNDMjAwNV0gPSB7Ci0JCS5tb2RhbGlhcwkJPSAidHNjMjAwNSIsCi0JCS5idXNfbnVtCQk9IDEsCi0JCS5jaGlwX3NlbGVjdAkJPSAwLAotCQkubWF4X3NwZWVkX2h6CQk9IDYwMDAwMDAsCi0JCS5jb250cm9sbGVyX2RhdGEJPSAmdHNjMjAwNV9tY3NwaV9jb25maWcsCi0JCS5wbGF0Zm9ybV9kYXRhCQk9ICZ0c2MyMDA1X3BkYXRhLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByeDUxX2JhdHRlcnlfZGV2aWNlID0gewotCS5uYW1lCT0gInJ4NTEtYmF0dGVyeSIsCi0JLmlkCT0gLTEsCi19OwotCi1zdGF0aWMgdm9pZCByeDUxX2NoYXJnZXJfc2V0X3Bvd2VyKGJvb2wgb24pCi17Ci0JZ3Bpb19zZXRfdmFsdWUoUlg1MV9VU0JfVFJBTlNDRUlWRVJfUlNUX0dQSU8sIG9uKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpc3AxNzA0X2NoYXJnZXJfZGF0YSByeDUxX2NoYXJnZXJfZGF0YSA9IHsKLQkuc2V0X3Bvd2VyCT0gcng1MV9jaGFyZ2VyX3NldF9wb3dlciwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJ4NTFfY2hhcmdlcl9kZXZpY2UgPSB7Ci0JLm5hbWUJPSAiaXNwMTcwNF9jaGFyZ2VyIiwKLQkuZGV2CT0gewotCQkucGxhdGZvcm1fZGF0YSA9ICZyeDUxX2NoYXJnZXJfZGF0YSwKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHJ4NTFfY2hhcmdlcl9pbml0KHZvaWQpCi17Ci0JV0FSTl9PTihncGlvX3JlcXVlc3Rfb25lKFJYNTFfVVNCX1RSQU5TQ0VJVkVSX1JTVF9HUElPLAotCQlHUElPRl9PVVRfSU5JVF9ISUdILCAiaXNwMTcwNF9yZXNldCIpKTsKLQotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmcng1MV9iYXR0ZXJ5X2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyeDUxX2NoYXJnZXJfZGV2aWNlKTsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU8pIHx8IGRlZmluZWQoQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFKQotCi0jZGVmaW5lIFJYNTFfR1BJT19DQU1FUkFfTEVOU19DT1ZFUgkxMTAKLSNkZWZpbmUgUlg1MV9HUElPX0NBTUVSQV9GT0NVUwkJNjgKLSNkZWZpbmUgUlg1MV9HUElPX0NBTUVSQV9DQVBUVVJFCTY5Ci0jZGVmaW5lIFJYNTFfR1BJT19LRVlQQURfU0xJREUJCTcxCi0jZGVmaW5lIFJYNTFfR1BJT19MT0NLX0JVVFRPTgkJMTEzCi0jZGVmaW5lIFJYNTFfR1BJT19QUk9YSU1JVFkJCTg5Ci0KLSNkZWZpbmUgUlg1MV9HUElPX0RFQk9VTkNFX1RJTUVPVVQJMTAKLQotc3RhdGljIHN0cnVjdCBncGlvX2tleXNfYnV0dG9uIHJ4NTFfZ3Bpb19rZXlzW10gPSB7Ci0JewotCQkuZGVzYwkJCT0gIkNhbWVyYSBMZW5zIENvdmVyIiwKLQkJLnR5cGUJCQk9IEVWX1NXLAotCQkuY29kZQkJCT0gU1dfQ0FNRVJBX0xFTlNfQ09WRVIsCi0JCS5ncGlvCQkJPSBSWDUxX0dQSU9fQ0FNRVJBX0xFTlNfQ09WRVIsCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IFJYNTFfR1BJT19ERUJPVU5DRV9USU1FT1VULAotCX0sIHsKLQkJLmRlc2MJCQk9ICJDYW1lcmEgRm9jdXMiLAotCQkudHlwZQkJCT0gRVZfS0VZLAotCQkuY29kZQkJCT0gS0VZX0NBTUVSQV9GT0NVUywKLQkJLmdwaW8JCQk9IFJYNTFfR1BJT19DQU1FUkFfRk9DVVMsCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IFJYNTFfR1BJT19ERUJPVU5DRV9USU1FT1VULAotCX0sIHsKLQkJLmRlc2MJCQk9ICJDYW1lcmEgQ2FwdHVyZSIsCi0JCS50eXBlCQkJPSBFVl9LRVksCi0JCS5jb2RlCQkJPSBLRVlfQ0FNRVJBLAotCQkuZ3BpbwkJCT0gUlg1MV9HUElPX0NBTUVSQV9DQVBUVVJFLAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSBSWDUxX0dQSU9fREVCT1VOQ0VfVElNRU9VVCwKLQl9LCB7Ci0JCS5kZXNjCQkJPSAiTG9jayBCdXR0b24iLAotCQkudHlwZQkJCT0gRVZfS0VZLAotCQkuY29kZQkJCT0gS0VZX1NDUkVFTkxPQ0ssCi0JCS5ncGlvCQkJPSBSWDUxX0dQSU9fTE9DS19CVVRUT04sCi0JCS5hY3RpdmVfbG93CQk9IDEsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IFJYNTFfR1BJT19ERUJPVU5DRV9USU1FT1VULAotCX0sIHsKLQkJLmRlc2MJCQk9ICJLZXlwYWQgU2xpZGUiLAotCQkudHlwZQkJCT0gRVZfU1csCi0JCS5jb2RlCQkJPSBTV19LRVlQQURfU0xJREUsCi0JCS5ncGlvCQkJPSBSWDUxX0dQSU9fS0VZUEFEX1NMSURFLAotCQkuYWN0aXZlX2xvdwkJPSAxLAotCQkuZGVib3VuY2VfaW50ZXJ2YWwJPSBSWDUxX0dQSU9fREVCT1VOQ0VfVElNRU9VVCwKLQl9LCB7Ci0JCS5kZXNjCQkJPSAiUHJveGltaXR5IFNlbnNvciIsCi0JCS50eXBlCQkJPSBFVl9TVywKLQkJLmNvZGUJCQk9IFNXX0ZST05UX1BST1hJTUlUWSwKLQkJLmdwaW8JCQk9IFJYNTFfR1BJT19QUk9YSU1JVFksCi0JCS5hY3RpdmVfbG93CQk9IDAsCi0JCS5kZWJvdW5jZV9pbnRlcnZhbAk9IFJYNTFfR1BJT19ERUJPVU5DRV9USU1FT1VULAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19rZXlzX3BsYXRmb3JtX2RhdGEgcng1MV9ncGlvX2tleXNfZGF0YSA9IHsKLQkuYnV0dG9ucwk9IHJ4NTFfZ3Bpb19rZXlzLAotCS5uYnV0dG9ucwk9IEFSUkFZX1NJWkUocng1MV9ncGlvX2tleXMpLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugcng1MV9ncGlvX2tleXNfZGV2aWNlID0gewotCS5uYW1lCT0gImdwaW8ta2V5cyIsCi0JLmlkCT0gLTEsCi0JLmRldgk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmcng1MV9ncGlvX2tleXNfZGF0YSwKLQl9LAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHJ4NTFfYWRkX2dwaW9fa2V5cyh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmcng1MV9ncGlvX2tleXNfZGV2aWNlKTsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCBfX2luaXQgcng1MV9hZGRfZ3Bpb19rZXlzKHZvaWQpCi17Ci19Ci0jZW5kaWYgLyogQ09ORklHX0tFWUJPQVJEX0dQSU8gfHwgQ09ORklHX0tFWUJPQVJEX0dQSU9fTU9EVUxFICovCi0KLXN0YXRpYyB1aW50MzJfdCBib2FyZF9rZXltYXBbXSA9IHsKLQkvKgotCSAqIE5vdGUgdGhhdCBLRVkoeCwgOCwgS0VZX1hYWCkgZW50cmllcyByZXByZXNlbnQgImVudHJpcmUgcm93Ci0JICogY29ubmVjdGVkIHRvIHRoZSBncm91bmQiIG1hdHJpeCBzdGF0ZS4KLQkgKi8KLQlLRVkoMCwgMCwgS0VZX1EpLAotCUtFWSgwLCAxLCBLRVlfTyksCi0JS0VZKDAsIDIsIEtFWV9QKSwKLQlLRVkoMCwgMywgS0VZX0NPTU1BKSwKLQlLRVkoMCwgNCwgS0VZX0JBQ0tTUEFDRSksCi0JS0VZKDAsIDYsIEtFWV9BKSwKLQlLRVkoMCwgNywgS0VZX1MpLAotCi0JS0VZKDEsIDAsIEtFWV9XKSwKLQlLRVkoMSwgMSwgS0VZX0QpLAotCUtFWSgxLCAyLCBLRVlfRiksCi0JS0VZKDEsIDMsIEtFWV9HKSwKLQlLRVkoMSwgNCwgS0VZX0gpLAotCUtFWSgxLCA1LCBLRVlfSiksCi0JS0VZKDEsIDYsIEtFWV9LKSwKLQlLRVkoMSwgNywgS0VZX0wpLAotCi0JS0VZKDIsIDAsIEtFWV9FKSwKLQlLRVkoMiwgMSwgS0VZX0RPVCksCi0JS0VZKDIsIDIsIEtFWV9VUCksCi0JS0VZKDIsIDMsIEtFWV9FTlRFUiksCi0JS0VZKDIsIDUsIEtFWV9aKSwKLQlLRVkoMiwgNiwgS0VZX1gpLAotCUtFWSgyLCA3LCBLRVlfQyksCi0JS0VZKDIsIDgsIEtFWV9GOSksCi0KLQlLRVkoMywgMCwgS0VZX1IpLAotCUtFWSgzLCAxLCBLRVlfViksCi0JS0VZKDMsIDIsIEtFWV9CKSwKLQlLRVkoMywgMywgS0VZX04pLAotCUtFWSgzLCA0LCBLRVlfTSksCi0JS0VZKDMsIDUsIEtFWV9TUEFDRSksCi0JS0VZKDMsIDYsIEtFWV9TUEFDRSksCi0JS0VZKDMsIDcsIEtFWV9MRUZUKSwKLQotCUtFWSg0LCAwLCBLRVlfVCksCi0JS0VZKDQsIDEsIEtFWV9ET1dOKSwKLQlLRVkoNCwgMiwgS0VZX1JJR0hUKSwKLQlLRVkoNCwgNCwgS0VZX0xFRlRDVFJMKSwKLQlLRVkoNCwgNSwgS0VZX1JJR0hUQUxUKSwKLQlLRVkoNCwgNiwgS0VZX0xFRlRTSElGVCksCi0JS0VZKDQsIDgsIEtFWV9GMTApLAotCi0JS0VZKDUsIDAsIEtFWV9ZKSwKLQlLRVkoNSwgOCwgS0VZX0YxMSksCi0KLQlLRVkoNiwgMCwgS0VZX1UpLAotCi0JS0VZKDcsIDAsIEtFWV9JKSwKLQlLRVkoNywgMSwgS0VZX0Y3KSwKLQlLRVkoNywgMiwgS0VZX0Y4KSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWF0cml4X2tleW1hcF9kYXRhIGJvYXJkX21hcF9kYXRhID0gewotCS5rZXltYXAJCQk9IGJvYXJkX2tleW1hcCwKLQkua2V5bWFwX3NpemUJCT0gQVJSQVlfU0laRShib2FyZF9rZXltYXApLAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX2tleXBhZF9kYXRhIHJ4NTFfa3BfZGF0YSA9IHsKLQkua2V5bWFwX2RhdGEJPSAmYm9hcmRfbWFwX2RhdGEsCi0JLnJvd3MJCT0gOCwKLQkuY29scwkJPSA4LAotCS5yZXAJCT0gMSwKLX07Ci0KLS8qIEVuYWJsZSBpbnB1dCBsb2dpYyBhbmQgcHVsbCBhbGwgbGluZXMgdXAgd2hlbiBlTU1DIGlzIG9uLiAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX211eCByeDUxX21tYzJfb25fbXV4W10gPSB7Ci0JT01BUDNfTVVYKFNETU1DMl9DTUQsIE9NQVBfUElOX0lOUFVUX1BVTExVUCB8IE9NQVBfTVVYX01PREUwKSwKLQlPTUFQM19NVVgoU0RNTUMyX0RBVDAsIE9NQVBfUElOX0lOUFVUX1BVTExVUCB8IE9NQVBfTVVYX01PREUwKSwKLQlPTUFQM19NVVgoU0RNTUMyX0RBVDEsIE9NQVBfUElOX0lOUFVUX1BVTExVUCB8IE9NQVBfTVVYX01PREUwKSwKLQlPTUFQM19NVVgoU0RNTUMyX0RBVDIsIE9NQVBfUElOX0lOUFVUX1BVTExVUCB8IE9NQVBfTVVYX01PREUwKSwKLQlPTUFQM19NVVgoU0RNTUMyX0RBVDMsIE9NQVBfUElOX0lOUFVUX1BVTExVUCB8IE9NQVBfTVVYX01PREUwKSwKLQlPTUFQM19NVVgoU0RNTUMyX0RBVDQsIE9NQVBfUElOX0lOUFVUX1BVTExVUCB8IE9NQVBfTVVYX01PREUwKSwKLQlPTUFQM19NVVgoU0RNTUMyX0RBVDUsIE9NQVBfUElOX0lOUFVUX1BVTExVUCB8IE9NQVBfTVVYX01PREUwKSwKLQlPTUFQM19NVVgoU0RNTUMyX0RBVDYsIE9NQVBfUElOX0lOUFVUX1BVTExVUCB8IE9NQVBfTVVYX01PREUwKSwKLQlPTUFQM19NVVgoU0RNTUMyX0RBVDcsIE9NQVBfUElOX0lOUFVUX1BVTExVUCB8IE9NQVBfTVVYX01PREUwKSwKLQl7IC5yZWdfb2Zmc2V0ID0gT01BUF9NVVhfVEVSTUlOQVRPUiB9LAotfTsKLQotLyogRGlzYWJsZSBpbnB1dCBsb2dpYyBhbmQgcHVsbCBhbGwgbGluZXMgZG93biB3aGVuIGVNTUMgaXMgb2ZmLiAqLwotc3RhdGljIHN0cnVjdCBvbWFwX2JvYXJkX211eCByeDUxX21tYzJfb2ZmX211eFtdID0gewotCU9NQVAzX01VWChTRE1NQzJfQ01ELCBPTUFQX1BVTExfRU5BIHwgT01BUF9NVVhfTU9ERTApLAotCU9NQVAzX01VWChTRE1NQzJfREFUMCwgT01BUF9QVUxMX0VOQSB8IE9NQVBfTVVYX01PREUwKSwKLQlPTUFQM19NVVgoU0RNTUMyX0RBVDEsIE9NQVBfUFVMTF9FTkEgfCBPTUFQX01VWF9NT0RFMCksCi0JT01BUDNfTVVYKFNETU1DMl9EQVQyLCBPTUFQX1BVTExfRU5BIHwgT01BUF9NVVhfTU9ERTApLAotCU9NQVAzX01VWChTRE1NQzJfREFUMywgT01BUF9QVUxMX0VOQSB8IE9NQVBfTVVYX01PREUwKSwKLQlPTUFQM19NVVgoU0RNTUMyX0RBVDQsIE9NQVBfUFVMTF9FTkEgfCBPTUFQX01VWF9NT0RFMCksCi0JT01BUDNfTVVYKFNETU1DMl9EQVQ1LCBPTUFQX1BVTExfRU5BIHwgT01BUF9NVVhfTU9ERTApLAotCU9NQVAzX01VWChTRE1NQzJfREFUNiwgT01BUF9QVUxMX0VOQSB8IE9NQVBfTVVYX01PREUwKSwKLQlPTUFQM19NVVgoU0RNTUMyX0RBVDcsIE9NQVBfUFVMTF9FTkEgfCBPTUFQX01VWF9NT0RFMCksCi0JeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9tdXhfcGFydGl0aW9uICpwYXJ0aXRpb247Ci0KLS8qCi0gKiBDdXJyZW50IGZsb3dzIHRvIGVNTUMgd2hlbiBlTU1DIGlzIG9mZiBhbmQgdGhlIGRhdGEgbGluZXMgYXJlIHB1bGxlZCB1cCwKLSAqIHNvIHB1bGwgdGhlbSBkb3duLiBOLkIuIHdlIHB1bGwgOCBsaW5lcyBiZWNhdXNlIHdlIGFyZSB1c2luZyA4IGxpbmVzLgotICovCi1zdGF0aWMgdm9pZCByeDUxX21tYzJfcmVtdXgoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgcG93ZXJfb24pCi17Ci0JaWYgKHBvd2VyX29uKQotCQlvbWFwX211eF93cml0ZV9hcnJheShwYXJ0aXRpb24sIHJ4NTFfbW1jMl9vbl9tdXgpOwotCWVsc2UKLQkJb21hcF9tdXhfd3JpdGVfYXJyYXkocGFydGl0aW9uLCByeDUxX21tYzJfb2ZmX211eCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcDJfaHNtbWNfaW5mbyBtbWNbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLm5hbWUJCT0gImV4dGVybmFsIiwKLQkJLm1tYwkJPSAxLAotCQkuY2FwcwkJPSBNTUNfQ0FQXzRfQklUX0RBVEEsCi0JCS5jb3Zlcl9vbmx5CT0gdHJ1ZSwKLQkJLmdwaW9fY2QJPSAxNjAsCi0JCS5ncGlvX3dwCT0gLUVJTlZBTCwKLQl9LAotCXsKLQkJLm5hbWUJCT0gImludGVybmFsIiwKLQkJLm1tYwkJPSAyLAotCQkuY2FwcwkJPSBNTUNfQ0FQXzRfQklUX0RBVEEgfCBNTUNfQ0FQXzhfQklUX0RBVEEsCi0JCQkJCQkvKiBTZWUgYWxzbyByeDUxX21tYzJfcmVtdXggKi8KLQkJLmdwaW9fY2QJPSAtRUlOVkFMLAotCQkuZ3Bpb193cAk9IC1FSU5WQUwsCi0JCS5ub25yZW1vdmFibGUJPSB0cnVlLAotCQkucmVtdXgJCT0gcng1MV9tbWMyX3JlbXV4LAotCX0sCi0Je30JLyogVGVybWluYXRvciAqLwotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHJ4NTFfdm1tYzFfc3VwcGx5W10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjAiKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSByeDUxX3ZhdXgyX3N1cHBseVtdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfY3NpYiIsICJvbWFwM2lzcCIpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHJ4NTFfdmF1eDNfc3VwcGx5W10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJvbWFwX2hzbW1jLjEiKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSByeDUxX3ZzaW1fc3VwcGx5W10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tY19hdXgiLCAib21hcF9oc21tYy4xIiksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcng1MV92bW1jMl9zdXBwbGllc1tdID0gewotCS8qIHRsdjMyMGFpYzN4IGFuYWxvZyBzdXBwbGllcyAqLwotCVJFR1VMQVRPUl9TVVBQTFkoIkFWREQiLCAiMi0wMDE4IiksCi0JUkVHVUxBVE9SX1NVUFBMWSgiRFJWREQiLCAiMi0wMDE4IiksCi0JUkVHVUxBVE9SX1NVUFBMWSgiQVZERCIsICIyLTAwMTkiKSwKLQlSRUdVTEFUT1JfU1VQUExZKCJEUlZERCIsICIyLTAwMTkiKSwKLQkvKiB0cGE2MTMwYTIgKi8KLQlSRUdVTEFUT1JfU1VQUExZKCJWZGQiLCAiMi0wMDYwIiksCi0JLyogS2VlcCB2bW1jIGFzIGxhc3QgaXRlbS4gSXQgaXMgbm90IGl0ZXJhdGVkIGZvciBuZXdlciBib2FyZHMgKi8KLQlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgIm9tYXBfaHNtbWMuMSIpLAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfY29uc3VtZXJfc3VwcGx5IHJ4NTFfdmlvX3N1cHBsaWVzW10gPSB7Ci0JLyogdGx2MzIwYWljM3ggZGlnaXRhbCBzdXBwbGllcyAqLwotCVJFR1VMQVRPUl9TVVBQTFkoIklPVkREIiwgIjItMDAxOCIpLAotCVJFR1VMQVRPUl9TVVBQTFkoIkRWREQiLCAiMi0wMDE4IiksCi0JUkVHVUxBVE9SX1NVUFBMWSgiSU9WREQiLCAiMi0wMDE5IiksCi0JUkVHVUxBVE9SX1NVUFBMWSgiRFZERCIsICIyLTAwMTkiKSwKLQkvKiBTaTQ3MTMgSU8gc3VwcGx5ICovCi0JUkVHVUxBVE9SX1NVUFBMWSgidmlvIiwgIjItMDA2MyIpLAotCS8qIGxpczNsdjAyZCAqLwotCVJFR1VMQVRPUl9TVVBQTFkoIlZkZF9JTyIsICIzLTAwMWQiKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSByeDUxX3ZhdXgxX2NvbnN1bWVyc1tdID0gewotCVJFR1VMQVRPUl9TVVBQTFkoInZkZHNfc2RpIiwgIm9tYXBkc3MiKSwKLQlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX3NkaSIsICJvbWFwZHNzX3NkaS4wIiksCi0JLyogU2k0NzEzIHN1cHBseSAqLwotCVJFR1VMQVRPUl9TVVBQTFkoInZkZCIsICIyLTAwNjMiKSwKLQkvKiBsaXMzbHYwMmQgKi8KLQlSRUdVTEFUT1JfU1VQUExZKCJWZGQiLCAiMy0wMDFkIiksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcng1MV92YXV4MSA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVjI4IiwKLQkJLm1pbl91VgkJCT0gMjgwMDAwMCwKLQkJLm1heF91VgkJCT0gMjgwMDAwMCwKLQkJLmFsd2F5c19vbgkJPSB0cnVlLCAvKiBkdWUgYmF0dGVyeSBjb3ZlciBzZW5zb3IgKi8KLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShyeDUxX3ZhdXgxX2NvbnN1bWVycyksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gcng1MV92YXV4MV9jb25zdW1lcnMsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcng1MV92YXV4MiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVkNTSSIsCi0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERQotCQkJCQl8IFJFR1VMQVRPUl9DSEFOR0VfU1RBVFVTLAotCX0sCi0JLm51bV9jb25zdW1lcl9zdXBwbGllcwk9IEFSUkFZX1NJWkUocng1MV92YXV4Ml9zdXBwbHkpLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IHJ4NTFfdmF1eDJfc3VwcGx5LAotfTsKLQotLyogVkFVWDMgLSBhZGRzIG1vcmUgcG93ZXIgdG8gVklPXzE4IHJhaWwgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSByeDUxX3ZhdXgzX2NhbSA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVkNBTV9ESUdfMTgiLAotCQkubWluX3VWCQkJPSAxODAwMDAwLAotCQkubWF4X3VWCQkJPSAxODAwMDAwLAotCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSByeDUxX3ZhdXgzX21tYyA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVk1NQzJfMzAiLAotCQkubWluX3VWCQkJPSAyODAwMDAwLAotCQkubWF4X3VWCQkJPSAzMDAwMDAwLAotCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShyeDUxX3ZhdXgzX3N1cHBseSksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gcng1MV92YXV4M19zdXBwbHksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcng1MV92YXV4NCA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVkNBTV9BTkFfMjgiLAotCQkubWluX3VWCQkJPSAyODAwMDAwLAotCQkubWF4X3VWCQkJPSAyODAwMDAwLAotCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSByeDUxX3ZtbWMxID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm1pbl91VgkJCT0gMTg1MDAwMCwKLQkJLm1heF91VgkJCT0gMzE1MDAwMCwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9WT0xUQUdFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9NT0RFCi0JCQkJCXwgUkVHVUxBVE9SX0NIQU5HRV9TVEFUVVMsCi0JfSwKLQkubnVtX2NvbnN1bWVyX3N1cHBsaWVzCT0gQVJSQVlfU0laRShyeDUxX3ZtbWMxX3N1cHBseSksCi0JLmNvbnN1bWVyX3N1cHBsaWVzCT0gcng1MV92bW1jMV9zdXBwbHksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcng1MV92bW1jMiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVjI4X0EiLAotCQkubWluX3VWCQkJPSAyODAwMDAwLAotCQkubWF4X3VWCQkJPSAzMDAwMDAwLAotCQkuYWx3YXlzX29uCQk9IHRydWUsIC8qIGR1ZSBWSU8gbGVhayB0byBBSUMzNCBWRERzICovCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHJ4NTFfdm1tYzJfc3VwcGxpZXMpLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IHJ4NTFfdm1tYzJfc3VwcGxpZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcng1MV92cGxsMSA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVlBMTCIsCi0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkuYWx3YXlzX29uCQk9IHRydWUsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhIHJ4NTFfdnBsbDIgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubmFtZQkJCT0gIlZTRElfQ1NJIiwKLQkJLm1pbl91VgkJCT0gMTgwMDAwMCwKLQkJLm1heF91VgkJCT0gMTgwMDAwMCwKLQkJLmFwcGx5X3VWCQk9IHRydWUsCi0JCS5hbHdheXNfb24JCT0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcng1MV92c2ltID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm5hbWUJCQk9ICJWTU1DMl9JT18xOCIsCi0JCS5taW5fdVYJCQk9IDE4MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE4MDAwMDAsCi0JCS5hcHBseV91VgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHJ4NTFfdnNpbV9zdXBwbHkpLAotCS5jb25zdW1lcl9zdXBwbGllcwk9IHJ4NTFfdnNpbV9zdXBwbHksCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcng1MV92aW8gPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubWluX3VWCQkJPSAxODAwMDAwLAotCQkubWF4X3VWCQkJPSAxODAwMDAwLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX1ZPTFRBR0UKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX01PREUKLQkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKLQl9LAotCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHJ4NTFfdmlvX3N1cHBsaWVzKSwKLQkuY29uc3VtZXJfc3VwcGxpZXMJPSByeDUxX3Zpb19zdXBwbGllcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSByeDUxX3ZpbnRhbmExID0gewotCS5jb25zdHJhaW50cyA9IHsKLQkJLm5hbWUJCQk9ICJWSU5UQU5BMSIsCi0JCS5taW5fdVYJCQk9IDE1MDAwMDAsCi0JCS5tYXhfdVYJCQk9IDE1MDAwMDAsCi0JCS5hbHdheXNfb24JCT0gdHJ1ZSwKLQkJLnZhbGlkX21vZGVzX21hc2sJPSBSRUdVTEFUT1JfTU9ERV9OT1JNQUwKLQkJCQkJfCBSRUdVTEFUT1JfTU9ERV9TVEFOREJZLAotCQkudmFsaWRfb3BzX21hc2sJCT0gUkVHVUxBVE9SX0NIQU5HRV9NT0RFLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgcng1MV92aW50YW5hMiA9IHsKLQkuY29uc3RyYWludHMgPSB7Ci0JCS5uYW1lCQkJPSAiVklOVEFOQTIiLAotCQkubWluX3VWCQkJPSAyNzUwMDAwLAotCQkubWF4X3VWCQkJPSAyNzUwMDAwLAotCQkuYXBwbHlfdVYJCT0gdHJ1ZSwKLQkJLmFsd2F5c19vbgkJPSB0cnVlLAotCQkudmFsaWRfbW9kZXNfbWFzawk9IFJFR1VMQVRPUl9NT0RFX05PUk1BTAotCQkJCQl8IFJFR1VMQVRPUl9NT0RFX1NUQU5EQlksCi0JCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSByeDUxX3ZpbnRkaWcgPSB7Ci0JLmNvbnN0cmFpbnRzID0gewotCQkubmFtZQkJCT0gIlZJTlRESUciLAotCQkubWluX3VWCQkJPSAxNTAwMDAwLAotCQkubWF4X3VWCQkJPSAxNTAwMDAwLAotCQkuYWx3YXlzX29uCQk9IHRydWUsCi0JCS52YWxpZF9tb2Rlc19tYXNrCT0gUkVHVUxBVE9SX01PREVfTk9STUFMCi0JCQkJCXwgUkVHVUxBVE9SX01PREVfU1RBTkRCWSwKLQkJLnZhbGlkX29wc19tYXNrCQk9IFJFR1VMQVRPUl9DSEFOR0VfTU9ERSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvZF9sb29rdXBfdGFibGUgcng1MV9mbXR4X2dwaW9zX3RhYmxlID0gewotCS5kZXZfaWQgPSAiMi0wMDYzIiwKLQkudGFibGUgPSB7Ci0JCUdQSU9fTE9PS1VQKCJncGlvLjYiLCAzLCAicmVzZXQiLCBHUElPX0FDVElWRV9ISUdIKSwgLyogMTYzICovCi0JCXsgfSwKLQl9LAotfTsKLQotc3RhdGljIF9faW5pdCB2b2lkIHJ4NTFfZ3Bpb19pbml0KHZvaWQpCi17Ci0JZ3Bpb2RfYWRkX2xvb2t1cF90YWJsZSgmcng1MV9mbXR4X2dwaW9zX3RhYmxlKTsKLX0KLQotc3RhdGljIGludCByeDUxX3R3bGdwaW9fc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBncGlvLCB1bnNpZ25lZCBuKQotewotCS8qIEZJWE1FIHRoaXMgZ3BpbyBzZXR1cCBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIG5vdyAqLwotCWdwaW9fcmVxdWVzdF9vbmUoZ3BpbyArIDYsIEdQSU9GX09VVF9JTklUX0xPVywgImJhY2tsaWdodF9wd20iKTsKLQlncGlvX3JlcXVlc3Rfb25lKGdwaW8gKyA3LCBHUElPRl9PVVRfSU5JVF9MT1csICJzcGVha2VyX2VuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX2dwaW9fcGxhdGZvcm1fZGF0YSByeDUxX2dwaW9fZGF0YSA9IHsKLQkucHVsbGRvd25zCQk9IEJJVCgwKSB8IEJJVCgxKSB8IEJJVCgyKSB8IEJJVCgzKQotCQkJCXwgQklUKDQpIHwgQklUKDUpCi0JCQkJfCBCSVQoOCkgfCBCSVQoOSkgfCBCSVQoMTApIHwgQklUKDExKQotCQkJCXwgQklUKDEyKSB8IEJJVCgxMykgfCBCSVQoMTQpIHwgQklUKDE1KQotCQkJCXwgQklUKDE2KSB8IEJJVCgxNykgLAotCS5zZXR1cAkJCT0gcng1MV90d2xncGlvX3NldHVwLAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX2lucyBzbGVlcF9vbl9zZXFbXSBfX2luaXRkYXRhID0gewotLyoKLSAqIFR1cm4gb2ZmIGV2ZXJ5dGhpbmcKLSAqLwotCXtNU0dfQlJPQURDQVNUKERFVl9HUlBfTlVMTCwgUkVTX0dSUF9BTEwsIDEsIDAsIFJFU19TVEFURV9TTEVFUCksIDJ9LAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX3NjcmlwdCBzbGVlcF9vbl9zY3JpcHQgX19pbml0ZGF0YSA9IHsKLQkuc2NyaXB0ID0gc2xlZXBfb25fc2VxLAotCS5zaXplICAgPSBBUlJBWV9TSVpFKHNsZWVwX29uX3NlcSksCi0JLmZsYWdzICA9IFRXTDQwMzBfU0xFRVBfU0NSSVBULAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX2lucyB3YWtldXBfc2VxW10gX19pbml0ZGF0YSA9IHsKLS8qCi0gKiBSZWVuYWJsZSBldmVyeXRoaW5nCi0gKi8KLQl7TVNHX0JST0FEQ0FTVChERVZfR1JQX05VTEwsIFJFU19HUlBfQUxMLCAxLCAwLCBSRVNfU1RBVEVfQUNUSVZFKSwgMn0sCi19OwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfc2NyaXB0IHdha2V1cF9zY3JpcHQgX19pbml0ZGF0YSA9IHsKLQkuc2NyaXB0CT0gd2FrZXVwX3NlcSwKLQkuc2l6ZQk9IEFSUkFZX1NJWkUod2FrZXVwX3NlcSksCi0JLmZsYWdzCT0gVFdMNDAzMF9XQUtFVVAxMl9TQ1JJUFQsCi19OwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfaW5zIHdha2V1cF9wM19zZXFbXSBfX2luaXRkYXRhID0gewotLyoKLSAqIFJlZW5hYmxlIGV2ZXJ5dGhpbmcKLSAqLwotCXtNU0dfQlJPQURDQVNUKERFVl9HUlBfTlVMTCwgUkVTX0dSUF9BTEwsIDEsIDAsIFJFU19TVEFURV9BQ1RJVkUpLCAyfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9zY3JpcHQgd2FrZXVwX3AzX3NjcmlwdCBfX2luaXRkYXRhID0gewotCS5zY3JpcHQJPSB3YWtldXBfcDNfc2VxLAotCS5zaXplCT0gQVJSQVlfU0laRSh3YWtldXBfcDNfc2VxKSwKLQkuZmxhZ3MJPSBUV0w0MDMwX1dBS0VVUDNfU0NSSVBULAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX2lucyB3cnN0X3NlcVtdIF9faW5pdGRhdGEgPSB7Ci0vKgotICogUmVzZXQgdHdsNDAzMC4KLSAqIFJlc2V0IFZERDEgcmVndWxhdG9yLgotICogUmVzZXQgVkREMiByZWd1bGF0b3IuCi0gKiBSZXNldCBWUExMMSByZWd1bGF0b3IuCi0gKiBFbmFibGUgc3lzY2xrIG91dHB1dC4KLSAqIFJlZW5hYmxlIHR3bDQwMzAuCi0gKi8KLQl7TVNHX1NJTkdVTEFSKERFVl9HUlBfTlVMTCwgUkVTX1JFU0VULCBSRVNfU1RBVEVfT0ZGKSwgMn0sCi0Je01TR19CUk9BRENBU1QoREVWX0dSUF9OVUxMLCBSRVNfR1JQX0FMTCwgMCwgMSwgUkVTX1NUQVRFX0FDVElWRSksCi0JCTB4MTN9LAotCXtNU0dfQlJPQURDQVNUKERFVl9HUlBfTlVMTCwgUkVTX0dSUF9QUCwgMCwgMywgUkVTX1NUQVRFX09GRiksIDB4MTN9LAotCXtNU0dfU0lOR1VMQVIoREVWX0dSUF9OVUxMLCBSRVNfVkREMSwgUkVTX1NUQVRFX1dSU1QpLCAweDEzfSwKLQl7TVNHX1NJTkdVTEFSKERFVl9HUlBfTlVMTCwgUkVTX1ZERDIsIFJFU19TVEFURV9XUlNUKSwgMHgxM30sCi0Je01TR19TSU5HVUxBUihERVZfR1JQX05VTEwsIFJFU19WUExMMSwgUkVTX1NUQVRFX1dSU1QpLCAweDM1fSwKLQl7TVNHX1NJTkdVTEFSKERFVl9HUlBfUDMsIFJFU19IRkNMS09VVCwgUkVTX1NUQVRFX0FDVElWRSksIDJ9LAotCXtNU0dfU0lOR1VMQVIoREVWX0dSUF9OVUxMLCBSRVNfUkVTRVQsIFJFU19TVEFURV9BQ1RJVkUpLCAyfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9zY3JpcHQgd3JzdF9zY3JpcHQgX19pbml0ZGF0YSA9IHsKLQkuc2NyaXB0ID0gd3JzdF9zZXEsCi0JLnNpemUgICA9IEFSUkFZX1NJWkUod3JzdF9zZXEpLAotCS5mbGFncyAgPSBUV0w0MDMwX1dSU1RfU0NSSVBULAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX3NjcmlwdCAqdHdsNDAzMF9zY3JpcHRzW10gX19pbml0ZGF0YSA9IHsKLQkvKiB3YWtldXAxMiBzY3JpcHQgc2hvdWxkIGJlIGxvYWRlZCBiZWZvcmUgc2xlZXAgc2NyaXB0LCBvdGhlcndpc2UgYQotCSAgIGJvYXJkIG1pZ2h0IGhpdCByZXRlbnRpb24gYmVmb3JlIGxvYWRpbmcgb2Ygd2FrZXVwIHNjcmlwdCBpcwotCSAgIGNvbXBsZXRlZC4gVGhpcyBjYW4gY2F1c2UgYm9vdCBmYWlsdXJlcyBkZXBlbmRpbmcgb24gdGltaW5nIGlzc3Vlcy4KLQkqLwotCSZ3YWtldXBfc2NyaXB0LAotCSZzbGVlcF9vbl9zY3JpcHQsCi0JJndha2V1cF9wM19zY3JpcHQsCi0JJndyc3Rfc2NyaXB0LAotfTsKLQotc3RhdGljIHN0cnVjdCB0d2w0MDMwX3Jlc2NvbmZpZyB0d2w0MDMwX3Jjb25maWdbXSBfX2luaXRkYXRhID0gewotCXsgLnJlc291cmNlID0gUkVTX1ZERDEsIC5kZXZncm91cCA9IC0xLAotCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IFJFU19TVEFURV9PRkYsCi0JICAucmVtYXBfc2xlZXAgPSBSRVNfU1RBVEVfT0ZGCi0JfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WREQyLCAuZGV2Z3JvdXAgPSAtMSwKLQkgIC50eXBlID0gMSwgLnR5cGUyID0gLTEsIC5yZW1hcF9vZmYgPSBSRVNfU1RBVEVfT0ZGLAotCSAgLnJlbWFwX3NsZWVwID0gUkVTX1NUQVRFX09GRgotCX0sCi0JeyAucmVzb3VyY2UgPSBSRVNfVlBMTDEsIC5kZXZncm91cCA9IC0xLAotCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IFJFU19TVEFURV9PRkYsCi0JICAucmVtYXBfc2xlZXAgPSBSRVNfU1RBVEVfT0ZGCi0JfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WUExMMiwgLmRldmdyb3VwID0gLTEsCi0JICAudHlwZSA9IC0xLCAudHlwZTIgPSAzLCAucmVtYXBfb2ZmID0gLTEsIC5yZW1hcF9zbGVlcCA9IC0xCi0JfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WQVVYMSwgLmRldmdyb3VwID0gLTEsCi0JICAudHlwZSA9IC0xLCAudHlwZTIgPSAzLCAucmVtYXBfb2ZmID0gLTEsIC5yZW1hcF9zbGVlcCA9IC0xCi0JfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WQVVYMiwgLmRldmdyb3VwID0gLTEsCi0JICAudHlwZSA9IC0xLCAudHlwZTIgPSAzLCAucmVtYXBfb2ZmID0gLTEsIC5yZW1hcF9zbGVlcCA9IC0xCi0JfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WQVVYMywgLmRldmdyb3VwID0gLTEsCi0JICAudHlwZSA9IC0xLCAudHlwZTIgPSAzLCAucmVtYXBfb2ZmID0gLTEsIC5yZW1hcF9zbGVlcCA9IC0xCi0JfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WQVVYNCwgLmRldmdyb3VwID0gLTEsCi0JICAudHlwZSA9IC0xLCAudHlwZTIgPSAzLCAucmVtYXBfb2ZmID0gLTEsIC5yZW1hcF9zbGVlcCA9IC0xCi0JfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WTU1DMSwgLmRldmdyb3VwID0gLTEsCi0JICAudHlwZSA9IC0xLCAudHlwZTIgPSAzLCAucmVtYXBfb2ZmID0gLTEsIC5yZW1hcF9zbGVlcCA9IC0xCi0JfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WTU1DMiwgLmRldmdyb3VwID0gLTEsCi0JICAudHlwZSA9IC0xLCAudHlwZTIgPSAzLCAucmVtYXBfb2ZmID0gLTEsIC5yZW1hcF9zbGVlcCA9IC0xCi0JfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19WREFDLCAuZGV2Z3JvdXAgPSAtMSwKLQkgIC50eXBlID0gLTEsIC50eXBlMiA9IDMsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKLQl9LAotCXsgLnJlc291cmNlID0gUkVTX1ZTSU0sIC5kZXZncm91cCA9IC0xLAotCSAgLnR5cGUgPSAtMSwgLnR5cGUyID0gMywgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQotCX0sCi0JeyAucmVzb3VyY2UgPSBSRVNfVklOVEFOQTEsIC5kZXZncm91cCA9IERFVl9HUlBfUDEgfCBERVZfR1JQX1AzLAotCSAgLnR5cGUgPSAtMSwgLnR5cGUyID0gLTEsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKLQl9LAotCXsgLnJlc291cmNlID0gUkVTX1ZJTlRBTkEyLCAuZGV2Z3JvdXAgPSBERVZfR1JQX1AxIHwgREVWX0dSUF9QMywKLQkgIC50eXBlID0gMSwgLnR5cGUyID0gLTEsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKLQl9LAotCXsgLnJlc291cmNlID0gUkVTX1ZJTlRESUcsIC5kZXZncm91cCA9IERFVl9HUlBfUDEgfCBERVZfR1JQX1AzLAotCSAgLnR5cGUgPSAtMSwgLnR5cGUyID0gLTEsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKLQl9LAotCXsgLnJlc291cmNlID0gUkVTX1ZJTywgLmRldmdyb3VwID0gREVWX0dSUF9QMywKLQkgIC50eXBlID0gMSwgLnR5cGUyID0gLTEsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKLQl9LAotCXsgLnJlc291cmNlID0gUkVTX0NMS0VOLCAuZGV2Z3JvdXAgPSBERVZfR1JQX1AxIHwgREVWX0dSUF9QMywKLQkgIC50eXBlID0gMSwgLnR5cGUyID0gLTEgLCAucmVtYXBfb2ZmID0gLTEsIC5yZW1hcF9zbGVlcCA9IC0xCi0JfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19SRUdFTiwgLmRldmdyb3VwID0gREVWX0dSUF9QMSB8IERFVl9HUlBfUDMsCi0JICAudHlwZSA9IDEsIC50eXBlMiA9IC0xLCAucmVtYXBfb2ZmID0gLTEsIC5yZW1hcF9zbGVlcCA9IC0xCi0JfSwKLQl7IC5yZXNvdXJjZSA9IFJFU19OUkVTX1BXUk9OLCAuZGV2Z3JvdXAgPSBERVZfR1JQX1AxIHwgREVWX0dSUF9QMywKLQkgIC50eXBlID0gMSwgLnR5cGUyID0gLTEsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKLQl9LAotCXsgLnJlc291cmNlID0gUkVTX1NZU0VOLCAuZGV2Z3JvdXAgPSBERVZfR1JQX1AxIHwgREVWX0dSUF9QMywKLQkgIC50eXBlID0gMSwgLnR5cGUyID0gLTEsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKLQl9LAotCXsgLnJlc291cmNlID0gUkVTX0hGQ0xLT1VULCAuZGV2Z3JvdXAgPSBERVZfR1JQX1AzLAotCSAgLnR5cGUgPSAxLCAudHlwZTIgPSAtMSwgLnJlbWFwX29mZiA9IC0xLCAucmVtYXBfc2xlZXAgPSAtMQotCX0sCi0JeyAucmVzb3VyY2UgPSBSRVNfMzJLQ0xLT1VULCAuZGV2Z3JvdXAgPSAtMSwKLQkgIC50eXBlID0gMSwgLnR5cGUyID0gLTEsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKLQl9LAotCXsgLnJlc291cmNlID0gUkVTX1JFU0VULCAuZGV2Z3JvdXAgPSAtMSwKLQkgIC50eXBlID0gMSwgLnR5cGUyID0gLTEsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKLQl9LAotCXsgLnJlc291cmNlID0gUkVTX01BSU5fUkVGLCAuZGV2Z3JvdXAgPSAtMSwKLQkgIC50eXBlID0gMSwgLnR5cGUyID0gLTEsIC5yZW1hcF9vZmYgPSAtMSwgLnJlbWFwX3NsZWVwID0gLTEKLQl9LAotCXsgMCwgMH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfcG93ZXJfZGF0YSByeDUxX3Qyc2NyaXB0c19kYXRhIF9faW5pdGRhdGEgPSB7Ci0JLnNjcmlwdHMgICAgICAgID0gdHdsNDAzMF9zY3JpcHRzLAotCS5udW0gPSBBUlJBWV9TSVpFKHR3bDQwMzBfc2NyaXB0cyksCi0JLnJlc291cmNlX2NvbmZpZyA9IHR3bDQwMzBfcmNvbmZpZywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF92aWJyYV9kYXRhIHJ4NTFfdmlicmFfZGF0YSBfX2luaXRkYXRhID0gewotCS5jb2V4aXN0CT0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHdsNDAzMF9hdWRpb19kYXRhIHJ4NTFfYXVkaW9fZGF0YSBfX2luaXRkYXRhID0gewotCS5hdWRpb19tY2xrCT0gMjYwMDAwMDAsCi0JLnZpYnJhCQk9ICZyeDUxX3ZpYnJhX2RhdGEsCi19OwotCi1zdGF0aWMgc3RydWN0IHR3bDQwMzBfcGxhdGZvcm1fZGF0YSByeDUxX3R3bGRhdGEgX19pbml0ZGF0YSA9IHsKLQkvKiBwbGF0Zm9ybV9kYXRhIGZvciBjaGlsZHJlbiBnb2VzIGhlcmUgKi8KLQkuZ3BpbwkJCT0gJnJ4NTFfZ3Bpb19kYXRhLAotCS5rZXlwYWQJCQk9ICZyeDUxX2twX2RhdGEsCi0JLnBvd2VyCQkJPSAmcng1MV90MnNjcmlwdHNfZGF0YSwKLQkuYXVkaW8JCQk9ICZyeDUxX2F1ZGlvX2RhdGEsCi0KLQkudmF1eDEJCQk9ICZyeDUxX3ZhdXgxLAotCS52YXV4MgkJCT0gJnJ4NTFfdmF1eDIsCi0JLnZhdXg0CQkJPSAmcng1MV92YXV4NCwKLQkudm1tYzEJCQk9ICZyeDUxX3ZtbWMxLAotCS52cGxsMQkJCT0gJnJ4NTFfdnBsbDEsCi0JLnZwbGwyCQkJPSAmcng1MV92cGxsMiwKLQkudnNpbQkJCT0gJnJ4NTFfdnNpbSwKLQkudmludGFuYTEJCT0gJnJ4NTFfdmludGFuYTEsCi0JLnZpbnRhbmEyCQk9ICZyeDUxX3ZpbnRhbmEyLAotCS52aW50ZGlnCQk9ICZyeDUxX3ZpbnRkaWcsCi0JLnZpbwkJCT0gJnJ4NTFfdmlvLAotfTsKLQotc3RhdGljIHN0cnVjdCB0cGE2MTMwYTJfcGxhdGZvcm1fZGF0YSByeDUxX3RwYTYxMzBhMl9kYXRhIF9faW5pdGRhdGFfb3JfbW9kdWxlID0gewotCS5wb3dlcl9ncGlvCQk9IDk4LAotfTsKLQotLyogQXVkaW8gc2V0dXAgZGF0YSAqLwotc3RhdGljIHN0cnVjdCBhaWMzeF9zZXR1cF9kYXRhIHJ4NTFfYWljMzRfc2V0dXAgPSB7Ci0JLmdwaW9fZnVuY1swXSA9IEFJQzNYX0dQSU8xX0ZVTkNfRElTQUJMRUQsCi0JLmdwaW9fZnVuY1sxXSA9IEFJQzNYX0dQSU8yX0ZVTkNfRElHSVRBTF9NSUNfSU5QVVQsCi19OwotCi1zdGF0aWMgc3RydWN0IGFpYzN4X3BkYXRhIHJ4NTFfYWljM3hfZGF0YSA9IHsKLQkuc2V0dXAgPSAmcng1MV9haWMzNF9zZXR1cCwKLQkuZ3Bpb19yZXNldCA9IDYwLAotfTsKLQotc3RhdGljIHN0cnVjdCBhaWMzeF9wZGF0YSByeDUxX2FpYzN4X2RhdGEyID0gewotCS5ncGlvX3Jlc2V0ID0gNjAsCi19OwotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDX1NJNDcxMykgJiYgSVNfRU5BQkxFRChDT05GSUdfUExBVEZPUk1fU0k0NzEzKQotc3RhdGljIHN0cnVjdCBzaTQ3MTNfcGxhdGZvcm1fZGF0YSByeDUxX3NpNDcxM19wbGF0Zm9ybV9kYXRhID0gewotCS5pc19wbGF0Zm9ybV9kZXZpY2UgPSB0cnVlCi19OwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSByeDUxX3BlcmlwaGVyYWxzX2kyY19ib2FyZF9pbmZvXzJbXSA9IHsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JMkNfU0k0NzEzKSAmJiBJU19FTkFCTEVEKENPTkZJR19QTEFURk9STV9TSTQ3MTMpCi0JewotCQlJMkNfQk9BUkRfSU5GTygic2k0NzEzIiwgMHg2MyksCi0JCS5wbGF0Zm9ybV9kYXRhID0gJnJ4NTFfc2k0NzEzX3BsYXRmb3JtX2RhdGEsCi0JfSwKLSNlbmRpZgotCXsKLQkJSTJDX0JPQVJEX0lORk8oInRsdjMyMGFpYzN4IiwgMHgxOCksCi0JCS5wbGF0Zm9ybV9kYXRhID0gJnJ4NTFfYWljM3hfZGF0YSwKLQl9LAotCXsKLQkJSTJDX0JPQVJEX0lORk8oInRsdjMyMGFpYzN4IiwgMHgxOSksCi0JCS5wbGF0Zm9ybV9kYXRhID0gJnJ4NTFfYWljM3hfZGF0YTIsCi0JfSwKLSNpZiBkZWZpbmVkKENPTkZJR19TRU5TT1JTX1RTTDI1NjMpIHx8IGRlZmluZWQoQ09ORklHX1NFTlNPUlNfVFNMMjU2M19NT0RVTEUpCi0JewotCQlJMkNfQk9BUkRfSU5GTygidHNsMjU2MyIsIDB4MjkpLAotCQkucGxhdGZvcm1fZGF0YSA9ICZyeDUxX3RzbDI1NjNfcGxhdGZvcm1fZGF0YSwKLQl9LAotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfTEVEU19MUDU1MjMpIHx8IGRlZmluZWQoQ09ORklHX0xFRFNfTFA1NTIzX01PRFVMRSkKLQl7Ci0JCUkyQ19CT0FSRF9JTkZPKCJscDU1MjMiLCAweDMyKSwKLQkJLnBsYXRmb3JtX2RhdGEgID0gJnJ4NTFfbHA1NTIzX3BsYXRmb3JtX2RhdGEsCi0JfSwKLSNlbmRpZgotCXsKLQkJSTJDX0JPQVJEX0lORk8oImJxMjcyMDAiLCAweDU1KSwKLQl9LAotCXsKLQkJSTJDX0JPQVJEX0lORk8oInRwYTYxMzBhMiIsIDB4NjApLAotCQkucGxhdGZvcm1fZGF0YSA9ICZyeDUxX3RwYTYxMzBhMl9kYXRhLAotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gX19pbml0ZGF0YSByeDUxX3BlcmlwaGVyYWxzX2kyY19ib2FyZF9pbmZvXzNbXSA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19TRU5TT1JTX0xJUzNfSTJDKSB8fCBkZWZpbmVkKENPTkZJR19TRU5TT1JTX0xJUzNfSTJDX01PRFVMRSkKLQl7Ci0JCUkyQ19CT0FSRF9JTkZPKCJsaXMzbHYwMmQiLCAweDFkKSwKLQkJLnBsYXRmb3JtX2RhdGEgPSAmcng1MV9saXMzbHYwMmRfZGF0YSwKLQl9LAotI2VuZGlmCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCByeDUxX2kyY19pbml0KHZvaWQpCi17Ci0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDX1NJNDcxMykgJiYgSVNfRU5BQkxFRChDT05GSUdfUExBVEZPUk1fU0k0NzEzKQotCWludCBlcnI7Ci0jZW5kaWYKLQotCWlmICgoc3lzdGVtX3JldiA+PSBTWVNURU1fUkVWX1NfVVNFU19WQVVYMyAmJiBzeXN0ZW1fcmV2IDwgMHgxMDApIHx8Ci0JICAgIHN5c3RlbV9yZXYgPj0gU1lTVEVNX1JFVl9CX1VTRVNfVkFVWDMpIHsKLQkJcng1MV90d2xkYXRhLnZhdXgzID0gJnJ4NTFfdmF1eDNfbW1jOwotCQkvKiBPbmx5IG9sZGVyIGJvYXJkcyB1c2UgVk1NQzIgZm9yIGludGVybmFsIE1NQyAqLwotCQlyeDUxX3ZtbWMyLm51bV9jb25zdW1lcl9zdXBwbGllcy0tOwotCX0gZWxzZSB7Ci0JCXJ4NTFfdHdsZGF0YS52YXV4MyA9ICZyeDUxX3ZhdXgzX2NhbTsKLQl9Ci0Jcng1MV90d2xkYXRhLnZtbWMyID0gJnJ4NTFfdm1tYzI7Ci0Jb21hcDNfcG1pY19nZXRfY29uZmlnKCZyeDUxX3R3bGRhdGEsCi0JCQlUV0xfQ09NTU9OX1BEQVRBX1VTQiB8IFRXTF9DT01NT05fUERBVEFfTUFEQywKLQkJCVRXTF9DT01NT05fUkVHVUxBVE9SX1ZEQUMpOwotCi0Jcng1MV90d2xkYXRhLnZkYWMtPmNvbnN0cmFpbnRzLmFwcGx5X3VWID0gdHJ1ZTsKLQlyeDUxX3R3bGRhdGEudmRhYy0+Y29uc3RyYWludHMubmFtZSA9ICJWREFDIjsKLQotCW9tYXBfcG1pY19pbml0KDEsIDIyMDAsICJ0d2w1MDMwIiwgNyArIE9NQVBfSU5UQ19TVEFSVCwgJnJ4NTFfdHdsZGF0YSk7Ci0jaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDX1NJNDcxMykgJiYgSVNfRU5BQkxFRChDT05GSUdfUExBVEZPUk1fU0k0NzEzKQotCWVyciA9IGdwaW9fcmVxdWVzdF9vbmUoUlg1MV9GTVRYX0lSUSwgR1BJT0ZfRElSX0lOLCAic2k0NzEzIGlycSIpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW5ub3QgcmVxdWVzdCBzaTQ3MTMgaXJxIGdwaW8uICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlyeDUxX3BlcmlwaGVyYWxzX2kyY19ib2FyZF9pbmZvXzJbMF0uaXJxID0gZ3Bpb190b19pcnEoUlg1MV9GTVRYX0lSUSk7Ci0jZW5kaWYKLQlvbWFwX3JlZ2lzdGVyX2kyY19idXMoMiwgMTAwLCByeDUxX3BlcmlwaGVyYWxzX2kyY19ib2FyZF9pbmZvXzIsCi0JCQkgICAgICBBUlJBWV9TSVpFKHJ4NTFfcGVyaXBoZXJhbHNfaTJjX2JvYXJkX2luZm9fMikpOwotI2lmIGRlZmluZWQoQ09ORklHX1NFTlNPUlNfTElTM19JMkMpIHx8IGRlZmluZWQoQ09ORklHX1NFTlNPUlNfTElTM19JMkNfTU9EVUxFKQotCXJ4NTFfbGlzM2x2MDJkX2RhdGEuaXJxMiA9IGdwaW9fdG9faXJxKExJUzMwMl9JUlEyX0dQSU8pOwotCXJ4NTFfcGVyaXBoZXJhbHNfaTJjX2JvYXJkX2luZm9fM1swXS5pcnEgPSBncGlvX3RvX2lycShMSVMzMDJfSVJRMV9HUElPKTsKLSNlbmRpZgotCW9tYXBfcmVnaXN0ZXJfaTJjX2J1cygzLCA0MDAsIHJ4NTFfcGVyaXBoZXJhbHNfaTJjX2JvYXJkX2luZm9fMywKLQkJCSAgICAgIEFSUkFZX1NJWkUocng1MV9wZXJpcGhlcmFsc19pMmNfYm9hcmRfaW5mb18zKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19NVERfT05FTkFORF9PTUFQMikgfHwgXAotCWRlZmluZWQoQ09ORklHX01URF9PTkVOQU5EX09NQVAyX01PRFVMRSkKLQotc3RhdGljIHN0cnVjdCBtdGRfcGFydGl0aW9uIG9uZW5hbmRfcGFydGl0aW9uc1tdID0gewotCXsKLQkJLm5hbWUgICAgICAgICAgID0gImJvb3Rsb2FkZXIiLAotCQkub2Zmc2V0ICAgICAgICAgPSAwLAotCQkuc2l6ZSAgICAgICAgICAgPSAweDIwMDAwLAotCQkubWFza19mbGFncyAgICAgPSBNVERfV1JJVEVBQkxFLAkvKiBGb3JjZSByZWFkLW9ubHkgKi8KLQl9LAotCXsKLQkJLm5hbWUgICAgICAgICAgID0gImNvbmZpZyIsCi0JCS5vZmZzZXQgICAgICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLQkJLnNpemUgICAgICAgICAgID0gMHg2MDAwMCwKLQl9LAotCXsKLQkJLm5hbWUgICAgICAgICAgID0gImxvZyIsCi0JCS5vZmZzZXQgICAgICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLQkJLnNpemUgICAgICAgICAgID0gMHg0MDAwMCwKLQl9LAotCXsKLQkJLm5hbWUgICAgICAgICAgID0gImtlcm5lbCIsCi0JCS5vZmZzZXQgICAgICAgICA9IE1URFBBUlRfT0ZTX0FQUEVORCwKLQkJLnNpemUgICAgICAgICAgID0gMHgyMDAwMDAsCi0JfSwKLQl7Ci0JCS5uYW1lICAgICAgICAgICA9ICJpbml0ZnMiLAotCQkub2Zmc2V0ICAgICAgICAgPSBNVERQQVJUX09GU19BUFBFTkQsCi0JCS5zaXplICAgICAgICAgICA9IDB4MjAwMDAwLAotCX0sCi0JewotCQkubmFtZSAgICAgICAgICAgPSAicm9vdGZzIiwKLQkJLm9mZnNldCAgICAgICAgID0gTVREUEFSVF9PRlNfQVBQRU5ELAotCQkuc2l6ZSAgICAgICAgICAgPSBNVERQQVJUX1NJWl9GVUxMLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG9tYXBfb25lbmFuZF9wbGF0Zm9ybV9kYXRhIGJvYXJkX29uZW5hbmRfZGF0YVtdID0gewotCXsKLQkJLmNzCQk9IDAsCi0JCS5ncGlvX2lycQk9IDY1LAotCQkucGFydHMJCT0gb25lbmFuZF9wYXJ0aXRpb25zLAotCQkubnJfcGFydHMJPSBBUlJBWV9TSVpFKG9uZW5hbmRfcGFydGl0aW9ucyksCi0JCS5mbGFncwkJPSBPTkVOQU5EX1NZTkNfUkVBRFdSSVRFLAotCX0KLX07Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBncGlvIHJ4NTFfd2wxMjUxX2dwaW9zW10gX19pbml0ZGF0YSA9IHsKLQl7IFJYNTFfV0wxMjUxX0lSUV9HUElPLAkgIEdQSU9GX0lOLAkJIndsMTI1MSBpcnEiCX0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgcng1MV9pbml0X3dsMTI1MSh2b2lkKQotewotCWludCBpcnEsIHJldDsKLQotCXJldCA9IGdwaW9fcmVxdWVzdF9hcnJheShyeDUxX3dsMTI1MV9ncGlvcywKLQkJCQkgQVJSQVlfU0laRShyeDUxX3dsMTI1MV9ncGlvcykpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JaXJxID0gZ3Bpb190b19pcnEoUlg1MV9XTDEyNTFfSVJRX0dQSU8pOwotCWlmIChpcnEgPCAwKQotCQlnb3RvIGVycl9pcnE7Ci0KLQl3bDEyNTFfcGRhdGEucG93ZXJfZ3BpbyA9IFJYNTFfV0wxMjUxX1BPV0VSX0dQSU87Ci0Jcng1MV9wZXJpcGhlcmFsc19zcGlfYm9hcmRfaW5mb1tSWDUxX1NQSV9XTDEyNTFdLmlycSA9IGlycTsKLQotCXJldHVybjsKLQotZXJyX2lycToKLQlncGlvX2ZyZWUoUlg1MV9XTDEyNTFfSVJRX0dQSU8pOwotZXJyb3I6Ci0JcHJpbnRrKEtFUk5fRVJSICJ3bDEyNTEgYm9hcmQgaW5pdGlhbGlzYXRpb24gZmFpbGVkXG4iKTsKLQl3bDEyNTFfcGRhdGEucG93ZXJfZ3BpbyA9IC0xOwotCi0JLyoKLQkgKiBOb3cgcng1MV9wZXJpcGhlcmFsc19zcGlfYm9hcmRfaW5mb1sxXS5pcnEgaXMgemVybyBhbmQKLQkgKiBzZXRfcG93ZXIgaXMgbnVsbCwgYW5kIHdsMTI1MV9wcm9iZSgpIHdpbGwgZmFpbC4KLQkgKi8KLX0KLQotc3RhdGljIHN0cnVjdCB0c2MyMDA1X3BsYXRmb3JtX2RhdGEgdHNjMjAwNV9wZGF0YSA9IHsKLQkudHNfcHJlc3N1cmVfbWF4CT0gMjA0OCwKLQkudHNfcHJlc3N1cmVfZnVkZ2UJPSAyLAotCS50c194X21heAkJPSA0MDk2LAotCS50c194X2Z1ZGdlCQk9IDQsCi0JLnRzX3lfbWF4CQk9IDQwOTYsCi0JLnRzX3lfZnVkZ2UJCT0gNywKLQkudHNfeF9wbGF0ZV9vaG0JCT0gMjgwLAotCS5lc2RfdGltZW91dF9tcwkJPSA4MDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBncGlvIHJ4NTFfdHNjMjAwNV9ncGlvc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyBSWDUxX1RTQzIwMDVfSVJRX0dQSU8sICAgR1BJT0ZfSU4sCQkidHNjMjAwNSBJUlEiCX0sCi0JeyBSWDUxX1RTQzIwMDVfUkVTRVRfR1BJTywgR1BJT0ZfT1VUX0lOSVRfSElHSCwJInRzYzIwMDUgcmVzZXQiCX0sCi19OwotCi1zdGF0aWMgdm9pZCByeDUxX3RzYzIwMDVfc2V0X3Jlc2V0KGJvb2wgZW5hYmxlKQotewotCWdwaW9fc2V0X3ZhbHVlKFJYNTFfVFNDMjAwNV9SRVNFVF9HUElPLCBlbmFibGUpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgcng1MV9pbml0X3RzYzIwMDUodm9pZCkKLXsKLQlpbnQgcjsKLQotCW9tYXBfbXV4X2luaXRfZ3BpbyhSWDUxX1RTQzIwMDVfUkVTRVRfR1BJTywgT01BUF9QSU5fT1VUUFVUKTsKLQlvbWFwX211eF9pbml0X2dwaW8oUlg1MV9UU0MyMDA1X0lSUV9HUElPLCBPTUFQX1BJTl9JTlBVVF9QVUxMVVApOwotCi0JciA9IGdwaW9fcmVxdWVzdF9hcnJheShyeDUxX3RzYzIwMDVfZ3Bpb3MsCi0JCQkgICAgICAgQVJSQVlfU0laRShyeDUxX3RzYzIwMDVfZ3Bpb3MpKTsKLQlpZiAociA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0c2MyMDA1IGJvYXJkIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7Ci0JCXRzYzIwMDVfcGRhdGEuZXNkX3RpbWVvdXRfbXMgPSAwOwotCQlyZXR1cm47Ci0JfQotCi0JdHNjMjAwNV9wZGF0YS5zZXRfcmVzZXQgPSByeDUxX3RzYzIwMDVfc2V0X3Jlc2V0OwotCXJ4NTFfcGVyaXBoZXJhbHNfc3BpX2JvYXJkX2luZm9bUlg1MV9TUElfVFNDMjAwNV0uaXJxID0KLQkJCQlncGlvX3RvX2lycShSWDUxX1RTQzIwMDVfSVJRX0dQSU8pOwotfQotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfT01BUF9ETV9USU1FUikKLXN0YXRpYyBzdHJ1Y3QgcHdtX29tYXBfZG10aW1lcl9wZGF0YSBfX21heWJlX3VudXNlZCBwd21fZG10aW1lcl9wZGF0YSA9IHsKLQkucmVxdWVzdF9ieV9ub2RlID0gb21hcF9kbV90aW1lcl9yZXF1ZXN0X2J5X25vZGUsCi0JLnJlcXVlc3Rfc3BlY2lmaWMgPSBvbWFwX2RtX3RpbWVyX3JlcXVlc3Rfc3BlY2lmaWMsCi0JLnJlcXVlc3QgPSBvbWFwX2RtX3RpbWVyX3JlcXVlc3QsCi0JLnNldF9zb3VyY2UgPSBvbWFwX2RtX3RpbWVyX3NldF9zb3VyY2UsCi0JLmdldF9pcnEgPSBvbWFwX2RtX3RpbWVyX2dldF9pcnEsCi0JLnNldF9pbnRfZW5hYmxlID0gb21hcF9kbV90aW1lcl9zZXRfaW50X2VuYWJsZSwKLQkuc2V0X2ludF9kaXNhYmxlID0gb21hcF9kbV90aW1lcl9zZXRfaW50X2Rpc2FibGUsCi0JLmZyZWUgPSBvbWFwX2RtX3RpbWVyX2ZyZWUsCi0JLmVuYWJsZSA9IG9tYXBfZG1fdGltZXJfZW5hYmxlLAotCS5kaXNhYmxlID0gb21hcF9kbV90aW1lcl9kaXNhYmxlLAotCS5nZXRfZmNsayA9IG9tYXBfZG1fdGltZXJfZ2V0X2ZjbGssCi0JLnN0YXJ0ID0gb21hcF9kbV90aW1lcl9zdGFydCwKLQkuc3RvcCA9IG9tYXBfZG1fdGltZXJfc3RvcCwKLQkuc2V0X2xvYWQgPSBvbWFwX2RtX3RpbWVyX3NldF9sb2FkLAotCS5zZXRfbWF0Y2ggPSBvbWFwX2RtX3RpbWVyX3NldF9tYXRjaCwKLQkuc2V0X3B3bSA9IG9tYXBfZG1fdGltZXJfc2V0X3B3bSwKLQkuc2V0X3ByZXNjYWxlciA9IG9tYXBfZG1fdGltZXJfc2V0X3ByZXNjYWxlciwKLQkucmVhZF9jb3VudGVyID0gb21hcF9kbV90aW1lcl9yZWFkX2NvdW50ZXIsCi0JLndyaXRlX2NvdW50ZXIgPSBvbWFwX2RtX3RpbWVyX3dyaXRlX2NvdW50ZXIsCi0JLnJlYWRfc3RhdHVzID0gb21hcF9kbV90aW1lcl9yZWFkX3N0YXR1cywKLQkud3JpdGVfc3RhdHVzID0gb21hcF9kbV90aW1lcl93cml0ZV9zdGF0dXMsCi19OwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19JUl9SWDUxKSB8fCBkZWZpbmVkKENPTkZJR19JUl9SWDUxX01PRFVMRSkKLXN0YXRpYyBzdHJ1Y3QgbGlyY19yeDUxX3BsYXRmb3JtX2RhdGEgcng1MV9saXJjX2RhdGEgPSB7Ci0JLnNldF9tYXhfbXB1X3dha2V1cF9sYXQgPSBvbWFwX3BtX3NldF9tYXhfbXB1X3dha2V1cF9sYXQsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByeDUxX2xpcmNfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICA9ICJsaXJjX3J4NTEiLAotCS5pZCAgICAgICAgICAgICA9IC0xLAotCS5kZXYgICAgICAgICAgICA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmcng1MV9saXJjX2RhdGEsCi0JfSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCByeDUxX2luaXRfbGlyYyh2b2lkKQotewotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmcng1MV9saXJjX2RldmljZSk7Ci19Ci0jZWxzZQotc3RhdGljIHZvaWQgX19pbml0IHJ4NTFfaW5pdF9saXJjKHZvaWQpCi17Ci19Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbWFkY19od21vbiA9IHsKLQkubmFtZQk9ICJ0d2w0MDMwX21hZGNfaHdtb24iLAotCS5pZAk9IC0xLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHJ4NTFfaW5pdF90d2w0MDMwX2h3bW9uKHZvaWQpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZtYWRjX2h3bW9uKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcDNfcm9tX3JuZ19kZXZpY2UgPSB7Ci0JLm5hbWUJCT0gIm9tYXAzLXJvbS1ybmciLAotCS5pZAkJPSAtMSwKLQkuZGV2CT0gewotCQkucGxhdGZvcm1fZGF0YQk9IHJ4NTFfc2VjdXJlX3JuZ19jYWxsLAotCX0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgcng1MV9pbml0X29tYXAzX3JvbV9ybmcodm9pZCkKLXsKLQlpZiAob21hcF90eXBlKCkgPT0gT01BUDJfREVWSUNFX1RZUEVfU0VDKSB7Ci0JCXByX2luZm8oIlJYLTUxOiBSZWdpc3RlcmluZyBPTUFQMyBIV1JORyBkZXZpY2VcbiIpOwotCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm9tYXAzX3JvbV9ybmdfZGV2aWNlKTsKLQl9Ci19Ci0KLXZvaWQgX19pbml0IHJ4NTFfcGVyaXBoZXJhbHNfaW5pdCh2b2lkKQotewotCXJ4NTFfZ3Bpb19pbml0KCk7Ci0Jcng1MV9pMmNfaW5pdCgpOwotCXJlZ3VsYXRvcl9oYXNfZnVsbF9jb25zdHJhaW50cygpOwotCWdwbWNfb25lbmFuZF9pbml0KGJvYXJkX29uZW5hbmRfZGF0YSk7Ci0Jcng1MV9hZGRfZ3Bpb19rZXlzKCk7Ci0Jcng1MV9pbml0X3dsMTI1MSgpOwotCXJ4NTFfaW5pdF90c2MyMDA1KCk7Ci0Jcng1MV9pbml0X2xpcmMoKTsKLQlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhyeDUxX3BlcmlwaGVyYWxzX3NwaV9ib2FyZF9pbmZvLAotCQkJCUFSUkFZX1NJWkUocng1MV9wZXJpcGhlcmFsc19zcGlfYm9hcmRfaW5mbykpOwotCi0JcGFydGl0aW9uID0gb21hcF9tdXhfZ2V0KCJjb3JlIik7Ci0JaWYgKHBhcnRpdGlvbikKLQkJb21hcF9oc21tY19pbml0KG1tYyk7Ci0KLQlyeDUxX2NoYXJnZXJfaW5pdCgpOwotCXJ4NTFfaW5pdF90d2w0MDMwX2h3bW9uKCk7Ci0Jcng1MV9pbml0X29tYXAzX3JvbV9ybmcoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXZpZGVvLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtdmlkZW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwYzZhYS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtdmlkZW8uYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtdmlkZW8uYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL29tYXBkc3MuaD4KLSNpbmNsdWRlIDx2aWRlby9vbWFwLXBhbmVsLWRhdGEuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvc3BpLW9tYXAyLW1jc3BpLmg+Ci0KLSNpbmNsdWRlICJzb2MuaCIKLSNpbmNsdWRlICJib2FyZC1yeDUxLmgiCi0jaW5jbHVkZSAiZGlzcGxheS5oIgotCi0jaW5jbHVkZSAibXV4LmgiCi0KLSNkZWZpbmUgUlg1MV9MQ0RfUkVTRVRfR1BJTwk5MAotCi0jaWYgZGVmaW5lZChDT05GSUdfRkJfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0ZCX09NQVAyX01PRFVMRSkKLQotc3RhdGljIHN0cnVjdCBjb25uZWN0b3JfYXR2X3BsYXRmb3JtX2RhdGEgcng1MV90dl9wZGF0YSA9IHsKLQkubmFtZSA9ICJ0diIsCi0JLnNvdXJjZSA9ICJ2ZW5jLjAiLAotCS5pbnZlcnRfcG9sYXJpdHkgPSBmYWxzZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJ4NTFfdHZfY29ubmVjdG9yX2RldmljZSA9IHsKLQkubmFtZSAgICAgICAgICAgICAgICAgICA9ICJjb25uZWN0b3ItYW5hbG9nLXR2IiwKLQkuaWQgICAgICAgICAgICAgICAgICAgICA9IDAsCi0JLmRldi5wbGF0Zm9ybV9kYXRhICAgICAgPSAmcng1MV90dl9wZGF0YSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfYm9hcmRfaW5mbyByeDUxX2Rzc19ib2FyZF9pbmZvID0gewotCS5kZWZhdWx0X2Rpc3BsYXlfbmFtZSA9ICJsY2QiLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcng1MV92aWRlb19pbml0KHZvaWQpCi17Ci0JaWYgKCFtYWNoaW5lX2lzX25va2lhX3J4NTEoKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAob21hcF9tdXhfaW5pdF9ncGlvKFJYNTFfTENEX1JFU0VUX0dQSU8sIE9NQVBfUElOX09VVFBVVCkpIHsKLQkJcHJfZXJyKCIlcyBjYW5ub3QgY29uZmlndXJlIE1VWCBmb3IgTENEIFJFU0VUXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQotCW9tYXBfZGlzcGxheV9pbml0KCZyeDUxX2Rzc19ib2FyZF9pbmZvKTsKLQotCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmcng1MV90dl9jb25uZWN0b3JfZGV2aWNlKTsKLQotCXJldHVybiAwOwotfQotCi1vbWFwX3N1YnN5c19pbml0Y2FsbChyeDUxX3ZpZGVvX2luaXQpOwotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0ZCX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19GQl9PTUFQMl9NT0RVTEUpICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTE2MWNhOS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKgotICogQm9hcmQgc3VwcG9ydCBmaWxlIGZvciBOb2tpYSBOOTAwIChha2EgUlgtNTEpLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBOb2tpYQotICogQ29weXJpZ2h0IChDKSAyMDEyIEl2YXlsbyBEaW1pdHJvdiA8ZnJlZW1hbmdvcmRvbkBhYnYuYmc+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgUGFsaSBSb2jDoXIgPHBhbGkucm9oYXJAZ21haWwuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IvcGh5Lmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiL211c2IuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3NwaS1vbWFwMi1tY3NwaS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9vbWFwLWRtYS5oPgotCi0jaW5jbHVkZSAiY29tbW9uLmgiCi0jaW5jbHVkZSAibXV4LmgiCi0jaW5jbHVkZSAiZ3BtYy5oIgotI2luY2x1ZGUgInBtLmgiCi0jaW5jbHVkZSAic29jLmgiCi0jaW5jbHVkZSAic2RyYW0tbm9raWEuaCIKLSNpbmNsdWRlICJvbWFwLXNlY3VyZS5oIgotCi0jZGVmaW5lIFJYNTFfR1BJT19TTEVFUF9JTkQgMTYyCi0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZ3Bpb19sZWRzW10gPSB7Ci0JewotCQkubmFtZQk9ICJzbGVlcF9pbmQiLAotCQkuZ3Bpbwk9IFJYNTFfR1BJT19TTEVFUF9JTkQsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWRfcGxhdGZvcm1fZGF0YSBncGlvX2xlZF9pbmZvID0gewotCS5sZWRzCQk9IGdwaW9fbGVkcywKLQkubnVtX2xlZHMJPSBBUlJBWV9TSVpFKGdwaW9fbGVkcyksCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsZWRzX2dwaW8gPSB7Ci0JLm5hbWUJPSAibGVkcy1ncGlvIiwKLQkuaWQJPSAtMSwKLQkuZGV2CT0gewotCQkucGxhdGZvcm1fZGF0YQk9ICZncGlvX2xlZF9pbmZvLAotCX0sCi19OwotCi0vKgotICogY3B1aWRsZSBDLXN0YXRlcyBkZWZpbml0aW9uIGZvciByeDUxLgotICoKLSAqIFRoZSAnZXhpdF9sYXRlbmN5JyBmaWVsZCBpcyB0aGUgc3VtIG9mIHNsZWVwCi0gKiBhbmQgd2FrZS11cCBsYXRlbmNpZXMuCi0KLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIHwgc3RhdGUgfCAgZXhpdF9sYXRlbmN5ICB8ICB0YXJnZXRfcmVzaWRlbmN5ICB8Ci0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICB8ICBDMSAgIHwgICAgMTEwICsgMTYyICAgfCAgICAgICAgICAgIDUgICAgICAgfAotICAgfCAgQzIgICB8ICAgIDEwNiArIDE4MCAgIHwgICAgICAgICAgMzA5ICAgICAgIHwKLSAgIHwgIEMzICAgfCAgICAxMDcgKyA0MTAgICB8ICAgICAgICA0NjA1NyAgICAgICB8Ci0gICB8ICBDNCAgIHwgICAgMTIxICsgMzM3NCAgfCAgICAgICAgNDYwNTcgICAgICAgfAotICAgfCAgQzUgICB8ICAgIDg1NSArIDExNDYgIHwgICAgICAgIDQ2MDU3ICAgICAgIHwKLSAgIHwgIEM2ICAgfCAgIDc1ODAgKyA0MTM0ICB8ICAgICAgIDQ4NDMyOSAgICAgICB8Ci0gICB8ICBDNyAgIHwgICA3NTA1ICsgMTUyNzQgfCAgICAgICA0ODQzMjkgICAgICAgfAotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0qLwotCi1leHRlcm4gdm9pZCBfX2luaXQgcng1MV9wZXJpcGhlcmFsc19pbml0KHZvaWQpOwotCi0jaWZkZWYgQ09ORklHX09NQVBfTVVYCi1zdGF0aWMgc3RydWN0IG9tYXBfYm9hcmRfbXV4IGJvYXJkX211eFtdIF9faW5pdGRhdGEgPSB7Ci0JeyAucmVnX29mZnNldCA9IE9NQVBfTVVYX1RFUk1JTkFUT1IgfSwKLX07Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBvbWFwX211c2JfYm9hcmRfZGF0YSBtdXNiX2JvYXJkX2RhdGEgPSB7Ci0JLmludGVyZmFjZV90eXBlCQk9IE1VU0JfSU5URVJGQUNFX1VMUEksCi0JLm1vZGUJCQk9IE1VU0JfT1RHLAotCS5wb3dlcgkJCT0gMCwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCByeDUxX2luaXQodm9pZCkKLXsKLQlzdHJ1Y3Qgb21hcF9zZHJjX3BhcmFtcyAqc2RyY19wYXJhbXM7Ci0KLQlvbWFwM19tdXhfaW5pdChib2FyZF9tdXgsIE9NQVBfUEFDS0FHRV9DQkIpOwotCW9tYXBfc2VyaWFsX2luaXQoKTsKLQotCXNkcmNfcGFyYW1zID0gbm9raWFfZ2V0X3NkcmFtX3RpbWluZ3MoKTsKLQlvbWFwX3NkcmNfaW5pdChzZHJjX3BhcmFtcywgc2RyY19wYXJhbXMpOwotCi0JdXNiX2JpbmRfcGh5KCJtdXNiLWhkcmMuMC5hdXRvIiwgMCwgInR3bDQwMzBfdXNiIik7Ci0JdXNiX211c2JfaW5pdCgmbXVzYl9ib2FyZF9kYXRhKTsKLQlyeDUxX3BlcmlwaGVyYWxzX2luaXQoKTsKLQotCWlmIChvbWFwX3R5cGUoKSA9PSBPTUFQMl9ERVZJQ0VfVFlQRV9TRUMpIHsKLSNpZmRlZiBDT05GSUdfQVJNX0VSUkFUQV80MzA5NzMKLQkJcHJfaW5mbygiUlgtNTE6IEVuYWJsaW5nIEFSTSBlcnJhdGEgNDMwOTczIHdvcmthcm91bmRcbiIpOwotCQkvKiBzZXQgSUJFIHRvIDEgKi8KLQkJcng1MV9zZWN1cmVfdXBkYXRlX2F1eF9jcihCSVQoNiksIDApOwotI2VuZGlmCi0JfQotCi0JLyogRW5zdXJlIFNEUkMgcGlucyBhcmUgbXV4J2QgZm9yIHNlbGYtcmVmcmVzaCAqLwotCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZHJjX2NrZTAiLCBPTUFQX1BJTl9PVVRQVVQpOwotCW9tYXBfbXV4X2luaXRfc2lnbmFsKCJzZHJjX2NrZTEiLCBPTUFQX1BJTl9PVVRQVVQpOwotCi0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZsZWRzX2dwaW8pOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgcng1MV9yZXNlcnZlKHZvaWQpCi17Ci0Jb21hcF9yZXNlcnZlKCk7Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoTk9LSUFfUlg1MSwgIk5va2lhIFJYLTUxIGJvYXJkIikKLQkvKiBNYWludGFpbmVyOiBMYXVyaSBMZXVra3VuZW4gPGxhdXJpLmxldWtrdW5lbkBub2tpYS5jb20+ICovCi0JLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCi0JLnJlc2VydmUJPSByeDUxX3Jlc2VydmUsCi0JLm1hcF9pbwkJPSBvbWFwM19tYXBfaW8sCi0JLmluaXRfZWFybHkJPSBvbWFwMzQzMF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9tYXAzX2luaXRfaXJxLAotCS5pbml0X21hY2hpbmUJPSByeDUxX2luaXQsCi0JLmluaXRfbGF0ZQk9IG9tYXAzNDMwX2luaXRfbGF0ZSwKLQkuaW5pdF90aW1lCT0gb21hcF9pbml0X3RpbWUsCi0JLnJlc3RhcnQJPSBvbWFwM3h4eF9yZXN0YXJ0LAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NmY0OWUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi0vKgotICogRGVmaW5lcyBmb3Igcng1MSBib2FyZHMKLSAqLwotCi0jaWZuZGVmIF9PTUFQX0JPQVJEX1JYNTFfSAotI2RlZmluZSBfT01BUF9CT0FSRF9SWDUxX0gKLQotZXh0ZXJuIHZvaWQgX19pbml0IHJ4NTFfcGVyaXBoZXJhbHNfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCByeDUxX3ZpZGVvX21lbV9pbml0KHZvaWQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY20zM3h4LmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NtMzN4eC5jCmluZGV4IGMwNzNmYjUuLjZmMmQwYWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY20zM3h4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbTMzeHguYwpAQCAtMjIwLDkgKzIyMCw2IEBACiB7CiAJaW50IGkgPSAwOwogCi0JaWYgKCFjbGtjdHJsX29mZnMpCi0JCXJldHVybiAwOwotCiAJb21hcF90ZXN0X3RpbWVvdXQoX2lzX21vZHVsZV9yZWFkeShpbnN0LCBjbGtjdHJsX29mZnMpLAogCQkJICBNQVhfTU9EVUxFX1JFQURZX1RJTUUsIGkpOwogCkBAIC0yNDYsOSArMjQzLDYgQEAKIHsKIAlpbnQgaSA9IDA7CiAKLQlpZiAoIWNsa2N0cmxfb2ZmcykKLQkJcmV0dXJuIDA7Ci0KIAlvbWFwX3Rlc3RfdGltZW91dCgoX2Nsa2N0cmxfaWRsZXN0KGluc3QsIGNsa2N0cmxfb2ZmcykgPT0KIAkJCQlDTEtDVFJMX0lETEVTVF9ESVNBQkxFRCksCiAJCQkJTUFYX01PRFVMRV9SRUFEWV9USU1FLCBpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY21pbnN0NDR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbWluc3Q0NHh4LmMKaW5kZXggMmMwZTA3ZS4uMmFiMjdhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbWluc3Q0NHh4LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jbWluc3Q0NHh4LmMKQEAgLTI3OCw5ICsyNzgsNiBAQAogewogCWludCBpID0gMDsKIAotCWlmICghY2xrY3RybF9vZmZzKQotCQlyZXR1cm4gMDsKLQogCW9tYXBfdGVzdF90aW1lb3V0KF9pc19tb2R1bGVfcmVhZHkocGFydCwgaW5zdCwgY2xrY3RybF9vZmZzKSwKIAkJCSAgTUFYX01PRFVMRV9SRUFEWV9USU1FLCBpKTsKIApAQCAtMzA0LDkgKzMwMSw2IEBACiB7CiAJaW50IGkgPSAwOwogCi0JaWYgKCFjbGtjdHJsX29mZnMpCi0JCXJldHVybiAwOwotCiAJb21hcF90ZXN0X3RpbWVvdXQoKF9jbGtjdHJsX2lkbGVzdChwYXJ0LCBpbnN0LCBjbGtjdHJsX29mZnMpID09CiAJCQkgICBDTEtDVFJMX0lETEVTVF9ESVNBQkxFRCksCiAJCQkgIE1BWF9NT0RVTEVfRElTQUJMRV9USU1FLCBpKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLWJvYXJkLWRldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvY29tbW9uLWJvYXJkLWRldmljZXMuYwppbmRleCBkMjQ2ZWZkLi41Mzg4ZmNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2NvbW1vbi1ib2FyZC1kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jb21tb24tYm9hcmQtZGV2aWNlcy5jCkBAIC0yOSw4ICsyOSw3IEBACiAjaW5jbHVkZSAiY29tbW9uLmgiCiAjaW5jbHVkZSAiY29tbW9uLWJvYXJkLWRldmljZXMuaCIKIAotI2lmIGRlZmluZWQoQ09ORklHX1RPVUNIU0NSRUVOX0FEUzc4NDYpIHx8IFwKLQlkZWZpbmVkKENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19UT1VDSFNDUkVFTl9BRFM3ODQ2KQogc3RhdGljIHN0cnVjdCBvbWFwMl9tY3NwaV9kZXZpY2VfY29uZmlnIGFkczc4NDZfbWNzcGlfY29uZmlnID0gewogCS50dXJib19tb2RlCT0gMCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCmluZGV4IGQ3ZjFkNjkuLjYwYTIwZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGV2aWNlcy5jCkBAIC02Nyw3ICs2Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwX2luaXRfc3RpKHZvaWQpIHt9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TUElfT01BUDI0WFgpIHx8IGRlZmluZWQoQ09ORklHX1NQSV9PTUFQMjRYWF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU1BJX09NQVAyNFhYKQogCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9zcGktb21hcDItbWNzcGkuaD4KIApAQCAtMTYzLDkgKzE2Myw4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19WSURFT19PTUFQMl9WT1VUKSB8fCBcCi0JZGVmaW5lZChDT05GSUdfVklERU9fT01BUDJfVk9VVF9NT0RVTEUpCi0jaWYgZGVmaW5lZChDT05GSUdfRkJfT01BUDIpIHx8IGRlZmluZWQoQ09ORklHX0ZCX09NQVAyX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WSURFT19PTUFQMl9WT1VUKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0ZCX09NQVAyKQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBvbWFwX3ZvdXRfcmVzb3VyY2VbMyAtIENPTkZJR19GQl9PTUFQMl9OVU1fRkJTXSA9IHsKIH07CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kcm0uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZHJtLmMKaW5kZXggZmFjZDc0MC4uNDRmZWY5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9kcm0uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2RybS5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSAic29jLmgiCiAjaW5jbHVkZSAiZGlzcGxheS5oIgogCi0jaWYgZGVmaW5lZChDT05GSUdfRFJNX09NQVApIHx8IGRlZmluZWQoQ09ORklHX0RSTV9PTUFQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fT01BUCkKIAogc3RhdGljIHN0cnVjdCBvbWFwX2RybV9wbGF0Zm9ybV9kYXRhIHBsYXRmb3JtX2RhdGE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvZmIuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZmIuYwppbmRleCAxZjFlY2Y4Li5lY2QwMGI2MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9mYi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZmIuYwpAQCAtOTAsNyArOTAsNyBAQAogaW50IF9faW5pdCBvbWFwX2luaXRfdnJmYih2b2lkKSB7IHJldHVybiAwOyB9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0ZCX09NQVAyKSB8fCBkZWZpbmVkKENPTkZJR19GQl9PTUFQMl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfRkJfT01BUDIpCiAKIHN0YXRpYyB1NjQgb21hcF9mYl9kbWFfbWFzayA9IH4odTMyKTA7CiBzdGF0aWMgc3RydWN0IG9tYXBmYl9wbGF0Zm9ybV9kYXRhIG9tYXBmYl9jb25maWc7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2dwbWMtc21zYzkxMXguaCBiL2FyY2gvYXJtL21hY2gtb21hcDIvZ3BtYy1zbXNjOTExeC5oCmluZGV4IGVhNmM5YzguLjk5YTA1YjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZ3BtYy1zbXNjOTExeC5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZ3BtYy1zbXNjOTExeC5oCkBAIC0yMSw3ICsyMSw3IEBACiAJdTMyCWZsYWdzOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1NNU0M5MTFYKSB8fCBkZWZpbmVkKENPTkZJR19TTVNDOTExWF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU01TQzkxMVgpCiAKIGV4dGVybiB2b2lkIGdwbWNfc21zYzkxMXhfaW5pdChzdHJ1Y3Qgb21hcF9zbXNjOTExeF9wbGF0Zm9ybV9kYXRhICpkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5jCmluZGV4IGNmZjA3OWUuLjQ3ODA5NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlICJoc21tYy5oIgogI2luY2x1ZGUgImNvbnRyb2wuaCIKIAotI2lmIGRlZmluZWQoQ09ORklHX01NQ19PTUFQX0hTKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9IU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTU1DX09NQVBfSFMpCiAKIHN0YXRpYyB1MTYgY29udHJvbF9wYmlhc19vZmZzZXQ7CiBzdGF0aWMgdTE2IGNvbnRyb2xfZGV2Y29uZjFfb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5oIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5oCmluZGV4IDE0OGNkOWIuLjY5YjYxOWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmgKQEAgLTI4LDcgKzI4LDcgQEAKIAl2b2lkICgqaW5pdF9jYXJkKShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01NQ19PTUFQX0hTKSB8fCBkZWZpbmVkKENPTkZJR19NTUNfT01BUF9IU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTU1DX09NQVBfSFMpCiAKIHZvaWQgb21hcF9oc21tY19pbml0KHN0cnVjdCBvbWFwMl9oc21tY19pbmZvICopOwogdm9pZCBvbWFwX2hzbW1jX2xhdGVfaW5pdChzdHJ1Y3Qgb21hcDJfaHNtbWNfaW5mbyAqKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC13YWtldXBnZW4uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC13YWtldXBnZW4uYwppbmRleCAwYzQ3NTQzLi4zNjlmOTVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtd2FrZXVwZ2VuLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXdha2V1cGdlbi5jCkBAIC0zMjIsMzQgKzMyMiwyNSBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLXN0YXRpYyBpbnQgaXJxX2NwdV9ob3RwbHVnX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgb21hcF93YWtldXBnZW5fY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgaW50KWhjcHU7Ci0KLQkvKgotCSAqIENvcnJlc3BvbmRpbmcgRlJPWkVOIHRyYW5zaXRpb25zIGRvIG5vdCBoYXZlIHRvIGJlIGhhbmRsZWQsCi0JICogdGhleSBhcmUgaGFuZGxlZCBieSBhdCBhIGhpZ2hlciBsZXZlbAotCSAqIChkcml2ZXJzL2NwdWlkbGUvY291cGxlZC5jKS4KLQkgKi8KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX09OTElORToKLQkJd2FrZXVwZ2VuX2lycW1hc2tfYWxsKGNwdSwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RFQUQ6Ci0JCXdha2V1cGdlbl9pcnFtYXNrX2FsbChjcHUsIDEpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwl3YWtldXBnZW5faXJxbWFza19hbGwoY3B1LCAwKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBpcnFfaG90cGx1Z19ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbCA9IGlycV9jcHVfaG90cGx1Z19ub3RpZnksCi19Oworc3RhdGljIGludCBvbWFwX3dha2V1cGdlbl9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXdha2V1cGdlbl9pcnFtYXNrX2FsbChjcHUsIDEpOworCXJldHVybiAwOworfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgaXJxX2hvdHBsdWdfaW5pdCh2b2lkKQogewotCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmaXJxX2hvdHBsdWdfbm90aWZpZXIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwgImFybS9vbWFwLXdha2U6b25saW5lIiwKKwkJCQkgIG9tYXBfd2FrZXVwZ2VuX2NwdV9vbmxpbmUsIE5VTEwpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVJNX09NQVBfV0FLRV9ERUFELAorCQkJCSAgImFybS9vbWFwLXdha2U6ZGVhZCIsIE5VTEwsCisJCQkJICBvbWFwX3dha2V1cGdlbl9jcHVfZGVhZCk7CiB9CiAjZWxzZQogc3RhdGljIHZvaWQgX19pbml0IGlycV9ob3RwbHVnX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKaW5kZXggNWI3MDkzOC4uMTA1MmIyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmMKQEAgLTEwNTMsNiArMTA1MywxMCBAQAogCWlmIChvaC0+ZmxhZ3MgJiBIV01PRF9OT19JRExFU1QpCiAJCXJldHVybiAwOwogCisJaWYgKCFvaC0+cHJjbS5vbWFwNC5jbGtjdHJsX29mZnMgJiYKKwkgICAgIShvaC0+cHJjbS5vbWFwNC5mbGFncyAmIEhXTU9EX09NQVA0X1pFUk9fQ0xLQ1RSTF9PRkZTRVQpKQorCQlyZXR1cm4gMDsKKwogCXJldHVybiBvbWFwX2NtX3dhaXRfbW9kdWxlX2lkbGUob2gtPmNsa2RtLT5wcmNtX3BhcnRpdGlvbiwKIAkJCQkJb2gtPmNsa2RtLT5jbV9pbnN0LAogCQkJCQlvaC0+cHJjbS5vbWFwNC5jbGtjdHJsX29mZnMsIDApOwpAQCAtMjk3MSw2ICsyOTc1LDEwIEBACiAJaWYgKCFfZmluZF9tcHVfcnRfcG9ydChvaCkpCiAJCXJldHVybiAwOwogCisJaWYgKCFvaC0+cHJjbS5vbWFwNC5jbGtjdHJsX29mZnMgJiYKKwkgICAgIShvaC0+cHJjbS5vbWFwNC5mbGFncyAmIEhXTU9EX09NQVA0X1pFUk9fQ0xLQ1RSTF9PRkZTRVQpKQorCQlyZXR1cm4gMDsKKwogCS8qIFhYWCBjaGVjayBtb2R1bGUgU0lETEVNT0RFLCBoYXJkcmVzZXQgc3RhdHVzICovCiAKIAlyZXR1cm4gb21hcF9jbV93YWl0X21vZHVsZV9yZWFkeShvaC0+Y2xrZG0tPnByY21fcGFydGl0aW9uLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuaAppbmRleCA0MDQxYmFkLi43ODkwNDAxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuaAorKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2QuaApAQCAtNDQzLDggKzQ0MywxMiBAQAogICogSFdNT0RfT01BUDRfTk9fQ09OVEVYVF9MT1NTX0JJVDogU29tZSBJUCBibG9ja3MgZG9uJ3QgaGF2ZSBhIFBSQ00KICAqICAgICBtb2R1bGUtbGV2ZWwgY29udGV4dCBsb3NzIHJlZ2lzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGVtOyB0aGlzCiAgKiAgICAgZmxhZyBiaXQgc2hvdWxkIGJlIHNldCBpbiB0aG9zZSBjYXNlcworICogSFdNT0RfT01BUDRfWkVST19DTEtDVFJMX09GRlNFVDogU29tZSBJUCBibG9ja3MgaGF2ZSBhIHZhbGlkIENMS0NUUkwKKyAqCW9mZnNldCBvZiB6ZXJvOyB0aGlzIGZsYWcgYml0IHNob3VsZCBiZSBzZXQgaW4gdGhvc2UgY2FzZXMgdG8KKyAqCWRpc3Rpbmd1aXNoIGZyb20gaHdtb2RzIHRoYXQgaGF2ZSBubyBjbGtjdHJsIG9mZnNldC4KICAqLwogI2RlZmluZSBIV01PRF9PTUFQNF9OT19DT05URVhUX0xPU1NfQklUCQkoMSA8PCAwKQorI2RlZmluZSBIV01PRF9PTUFQNF9aRVJPX0NMS0NUUkxfT0ZGU0VUCQkoMSA8PCAxKQogCiAvKioKICAqIHN0cnVjdCBvbWFwX2h3bW9kX29tYXA0X3ByY20gLSBPTUFQNC1zcGVjaWZpYyBQUkNNIGRhdGEKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zM3h4XzQzeHhfaXBibG9ja19kYXRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfMzN4eF80M3h4X2lwYmxvY2tfZGF0YS5jCmluZGV4IDU1YzU4NzguLmUyZDg0YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zM3h4XzQzeHhfaXBibG9ja19kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzMzeHhfNDN4eF9pcGJsb2NrX2RhdGEuYwpAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBDTEtDVFJMKG9oLCBjbGtjdHJsKSAoKG9oKS5wcmNtLm9tYXA0LmNsa2N0cmxfb2ZmcyA9IChjbGtjdHJsKSkKICNkZWZpbmUgUlNUQ1RSTChvaCwgcnN0Y3RybCkgKChvaCkucHJjbS5vbWFwNC5yc3RjdHJsX29mZnMgPSAocnN0Y3RybCkpCiAjZGVmaW5lIFJTVFNUKG9oLCByc3RzdCkgKChvaCkucHJjbS5vbWFwNC5yc3RzdF9vZmZzID0gKHJzdHN0KSkKKyNkZWZpbmUgUFJDTV9GTEFHUyhvaCwgZmxhZykgKChvaCkucHJjbS5vbWFwNC5mbGFncyA9IChmbGFnKSkKIAogLyoKICAqICdsMycgY2xhc3MKQEAgLTEyOTYsNiArMTI5Nyw3IEBACiAJQ0xLQ1RSTChhbTMzeHhfaTJjMV9od21vZCwgQU0zM1hYX0NNX1dLVVBfSTJDMF9DTEtDVFJMX09GRlNFVCk7CiAJQ0xLQ1RSTChhbTMzeHhfd2RfdGltZXIxX2h3bW9kLCBBTTMzWFhfQ01fV0tVUF9XRFQxX0NMS0NUUkxfT0ZGU0VUKTsKIAlDTEtDVFJMKGFtMzN4eF9ydGNfaHdtb2QsIEFNMzNYWF9DTV9SVENfUlRDX0NMS0NUUkxfT0ZGU0VUKTsKKwlQUkNNX0ZMQUdTKGFtMzN4eF9ydGNfaHdtb2QsIEhXTU9EX09NQVA0X1pFUk9fQ0xLQ1RSTF9PRkZTRVQpOwogCUNMS0NUUkwoYW0zM3h4X21tYzJfaHdtb2QsIEFNMzNYWF9DTV9QRVJfTU1DMl9DTEtDVFJMX09GRlNFVCk7CiAJQ0xLQ1RSTChhbTMzeHhfZ3BtY19od21vZCwgQU0zM1hYX0NNX1BFUl9HUE1DX0NMS0NUUkxfT0ZGU0VUKTsKIAlDTEtDVFJMKGFtMzN4eF9sNF9sc19od21vZCwgQU0zM1hYX0NNX1BFUl9MNExTX0NMS0NUUkxfT0ZGU0VUKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYwppbmRleCBkNzJlZTYxLi4xY2M0YTZmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfM3h4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzN4eHhfZGF0YS5jCkBAIC03MjIsOCArNzIyLDIwIEBACiAgKiBkaXNwbGF5IHNlcmlhbCBpbnRlcmZhY2UgY29udHJvbGxlcgogICovCiAKK3N0YXRpYyBzdHJ1Y3Qgb21hcF9od21vZF9jbGFzc19zeXNjb25maWcgb21hcDN4eHhfZHNpX3N5c2MgPSB7CisJLnJldl9vZmZzCT0gMHgwMDAwLAorCS5zeXNjX29mZnMJPSAweDAwMTAsCisJLnN5c3Nfb2Zmcwk9IDB4MDAxNCwKKwkuc3lzY19mbGFncwk9IChTWVNDX0hBU19BVVRPSURMRSB8IFNZU0NfSEFTX0NMT0NLQUNUSVZJVFkgfAorCQkJICAgU1lTQ19IQVNfRU5BV0FLRVVQIHwgU1lTQ19IQVNfU0lETEVNT0RFIHwKKwkJCSAgIFNZU0NfSEFTX1NPRlRSRVNFVCB8IFNZU1NfSEFTX1JFU0VUX1NUQVRVUyksCisJLmlkbGVtb2Rlcwk9IChTSURMRV9GT1JDRSB8IFNJRExFX05PIHwgU0lETEVfU01BUlQpLAorCS5zeXNjX2ZpZWxkcwk9ICZvbWFwX2h3bW9kX3N5c2NfdHlwZTEsCit9OworCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfY2xhc3Mgb21hcDN4eHhfZHNpX2h3bW9kX2NsYXNzID0gewogCS5uYW1lID0gImRzaSIsCisJLnN5c2MJPSAmb21hcDN4eHhfZHNpX3N5c2MsCiB9OwogCiBzdGF0aWMgc3RydWN0IG9tYXBfaHdtb2RfaXJxX2luZm8gb21hcDN4eHhfZHNpMV9pcnFzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL3R3bC1jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdHdsLWNvbW1vbi5jCmluZGV4IDI5MmVjYTAuLmE3MjczOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvdHdsLWNvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvdHdsLWNvbW1vbi5jCkBAIC01MzIsOCArNTMyLDcgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfQVJDSF9PTUFQNCAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX09NQVBfVFdMNDAzMCkgfHwgXAotCWRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQX1RXTDQwMzBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQX1RXTDQwMzApCiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9vbWFwLXR3bDQwMzAuaD4KIAogLyogQ29tbW9ubHkgdXNlZCBjb25maWd1cmF0aW9uICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9oeDQ3MDAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2h4NDcwMC5jCmluZGV4IDRhMmY5YWIuLjY2MTg0ZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2h4NDcwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2h4NDcwMC5jCkBAIC0yNCwxMCArMjQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L25hdnBvaW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbGNkLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2h0Yy1lZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9hc2ljMy5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGRhX3Bvd2VyLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9ncGlvLWh0Yy1lZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L3B3bS5oPgogI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9pZHAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCmluZGV4IGM0MTBkODQuLjY2MDcwYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2lkcC5jCkBAIC04Myw3ICs4Myw4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBzbWM5MXhfcGxhdGRhdGEgPSB7Ci0JLmZsYWdzID0gU01DOTFYX1VTRV8zMkJJVCB8IFNNQzkxWF9VU0VfRE1BIHwgU01DOTFYX05PV0FJVCwKKwkuZmxhZ3MgPSBTTUM5MVhfVVNFXzhCSVQgfCBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX1VTRV8zMkJJVCB8CisJCSBTTUM5MVhfVVNFX0RNQSB8IFNNQzkxWF9OT1dBSVQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jIGIvYXJjaC9hcm0vbWFjaC1weGEvbHViYm9jay5jCmluZGV4IDcyNDVmMzMuLmQ2MTU5ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2x1YmJvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9sdWJib2NrLmMKQEAgLTEzNyw2ICsxMzcsMTggQEAKIAkvLyBubyBEKyBwdWxsdXA7IGx1YmJvY2sgY2FuJ3QgY29ubmVjdC9kaXNjb25uZWN0IGluIHNvZnR3YXJlCiB9OwogCitzdGF0aWMgdm9pZCBsdWJib2NrX2luaXRfcGNtY2lhKHZvaWQpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJLyogQWRkIGFuIGFsaWFzIGZvciB0aGUgU0ExMTExIFBDTUNJQSBjbG9jayAqLworCWNsayA9IGNsa19nZXRfc3lzKCJweGEyeHgtcGNtY2lhIiwgTlVMTCk7CisJaWYgKCFJU19FUlIoY2xrKSkgeworCQljbGtkZXZfY3JlYXRlKGNsaywgTlVMTCwgIjE4MDAiKTsKKwkJY2xrX3B1dChjbGspOworCX0KK30KKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzYTExMTFfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewogCQkuc3RhcnQJPSAweDEwMDAwMDAwLApAQCAtNDY3LDYgKzQ3OSw4IEBACiAJcHhhX3NldF9idHVhcnRfaW5mbyhOVUxMKTsKIAlweGFfc2V0X3N0dWFydF9pbmZvKE5VTEwpOwogCisJbHViYm9ja19pbml0X3BjbWNpYSgpOworCiAJY2xrX2FkZF9hbGlhcygiU0ExMTExX0NMSyIsIE5VTEwsICJHUElPMTFfQ0xLIiwgTlVMTCk7CiAJcHhhX3NldF91ZGNfaW5mbygmdWRjX2luZm8pOwogCXB4YV9zZXRfZmJfaW5mbyhOVUxMLCAmc2hhcnBfbG04djMxKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9tYWdpY2lhbi5jCmluZGV4IDZmODgzN2UuLmI0MTNlMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL21hZ2ljaWFuLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvbWFnaWNpYW4uYwpAQCAtMjAsMTAgKzIwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2h0Yy1lZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9odGMtcGFzaWMzLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9wZGFfcG93ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2dwaW8taHRjLWVncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtX2JhY2tsaWdodC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL3hjZXAuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3hjZXAuYwppbmRleCAzZjA2Y2Q5Li4wNTYzNjllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS94Y2VwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEveGNlcC5jCkBAIC0xMjAsNyArMTIwLDggQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIHhjZXBfc21jOTF4X2luZm8gPSB7Ci0JLmZsYWdzCT0gU01DOTFYX1VTRV8zMkJJVCB8IFNNQzkxWF9OT1dBSVQgfCBTTUM5MVhfVVNFX0RNQSwKKwkuZmxhZ3MJPSBTTUM5MVhfVVNFXzhCSVQgfCBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX1VTRV8zMkJJVCB8CisJCSAgU01DOTFYX05PV0FJVCB8IFNNQzkxWF9VU0VfRE1BLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc21jOTF4X2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvS2NvbmZpZwppbmRleCA3MGFiNGEyLi4xZDdjODNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9LY29uZmlnCkBAIC0yLDM1ICsyLDMwIEBACiAJYm9vbCAiQVJNIEx0ZC4gUmVhbFZpZXcgZmFtaWx5IgogCWRlcGVuZHMgb24gQVJDSF9NVUxUSV9WNSB8fCBBUkNIX01VTFRJX1Y2IHx8IEFSQ0hfTVVMVElfVjcKIAlzZWxlY3QgQVJNX0FNQkEKKwlzZWxlY3QgQVJNX0dJQwogCXNlbGVjdCBBUk1fVElNRVJfU1A4MDQKKwlzZWxlY3QgQ0xLX1NQODEwCiAJc2VsZWN0IENPTU1PTl9DTEtfVkVSU0FUSUxFCiAJc2VsZWN0IEdQSU9fUEwwNjEgaWYgR1BJT0xJQgorCXNlbGVjdCBIQVZFX0FSTV9TQ1UgaWYgU01QCisJc2VsZWN0IEhBVkVfQVJNX1RXRCBpZiBTTVAKKwlzZWxlY3QgSEFWRV9QQVRBX1BMQVRGT1JNCisJc2VsZWN0IEhBVkVfVENNCiAJc2VsZWN0IElDU1QKKwlzZWxlY3QgTUFDSF9SRUFMVklFV19FQiBpZiBBUkNIX01VTFRJX1Y1CisJc2VsZWN0IE1GRF9TWVNDT04KIAlzZWxlY3QgUExBVF9WRVJTQVRJTEUKIAlzZWxlY3QgUExBVF9WRVJTQVRJTEVfU0NIRURfQ0xPQ0sKKwlzZWxlY3QgUE9XRVJfUkVTRVQKKwlzZWxlY3QgUE9XRVJfUkVTRVRfVkVSU0FUSUxFCisJc2VsZWN0IFBPV0VSX1NVUFBMWQorCXNlbGVjdCBTT0NfUkVBTFZJRVcKKwlzZWxlY3QgVVNFX09GCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIEFSTSBMdGQgUmVhbFZpZXcgYm9hcmRzLgogCiBpZiBBUkNIX1JFQUxWSUVXCiAKLWNvbmZpZyBSRUFMVklFV19EVAotCWJvb2wgIlN1cHBvcnQgUmVhbFZpZXcoUikgRGV2aWNlIFRyZWUgYmFzZWQgYm9vdCIKLQlzZWxlY3QgQVJNX0dJQwotCXNlbGVjdCBDTEtfU1A4MTAKLQlzZWxlY3QgSEFWRV9TTVAKLQlzZWxlY3QgSUNTVAotCXNlbGVjdCBNQUNIX1JFQUxWSUVXX0VCIGlmIEFSQ0hfTVVMVElfVjUKLQlzZWxlY3QgTUZEX1NZU0NPTgotCXNlbGVjdCBQT1dFUl9SRVNFVAotCXNlbGVjdCBQT1dFUl9SRVNFVF9WRVJTQVRJTEUKLQlzZWxlY3QgUE9XRVJfU1VQUExZCi0Jc2VsZWN0IFNNUF9PTl9VUCBpZiBTTVAKLQlzZWxlY3QgU09DX1JFQUxWSUVXCi0Jc2VsZWN0IFVTRV9PRgotCWhlbHAKLQkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgYm9vdGluZyB0aGUgQVJNKFIpIFJlYWxWaWV3KFIpIGV2YWx1YXRpb24KLQkgIGJvYXJkcyB1c2luZyBhIGRldmljZSB0cmVlIG1hY2hpbmUgZGVzY3JpcHRpb24uCi0KIGNvbmZpZyBNQUNIX1JFQUxWSUVXX0VCCiAJYm9vbCAiU3VwcG9ydCBSZWFsVmlldyhSKSBFbXVsYXRpb24gQmFzZWJvYXJkIgogCXNlbGVjdCBBUk1fR0lDCkBAIC02MCw4ICs1NSw2IEBACiBjb25maWcgUkVBTFZJRVdfRUJfQTlNUAogCWJvb2wgIlN1cHBvcnQgTXVsdGljb3JlIENvcnRleC1BOSBUaWxlIgogCWRlcGVuZHMgb24gTUFDSF9SRUFMVklFV19FQiAmJiBBUkNIX01VTFRJX1Y3Ci0Jc2VsZWN0IEhBVkVfQVJNX1NDVSBpZiBTTVAKLQlzZWxlY3QgSEFWRV9BUk1fVFdEIGlmIFNNUAogCXNlbGVjdCBIQVZFX1NNUAogCXNlbGVjdCBNSUdIVF9IQVZFX0NBQ0hFX0wyWDAKIAloZWxwCkBAIC03MSwzMCArNjQsMTUgQEAKIGNvbmZpZyBSRUFMVklFV19FQl9BUk0xMU1QCiAJYm9vbCAiU3VwcG9ydCBBUk0xMU1QQ29yZSBUaWxlIgogCWRlcGVuZHMgb24gTUFDSF9SRUFMVklFV19FQiAmJiBBUkNIX01VTFRJX1Y2Ci0Jc2VsZWN0IEhBVkVfQVJNX1NDVSBpZiBTTVAKLQlzZWxlY3QgSEFWRV9BUk1fVFdEIGlmIFNNUAogCXNlbGVjdCBIQVZFX1NNUAogCXNlbGVjdCBNSUdIVF9IQVZFX0NBQ0hFX0wyWDAKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIEFSTTExTVBDb3JlIHRpbGUgZml0dGVkIHRvIHRoZSBSZWFsdmlldyhSKQogCSAgRW11bGF0aW9uIEJhc2Vib2FyZCBwbGF0Zm9ybS4KIAotY29uZmlnIFJFQUxWSUVXX0VCX0FSTTExTVBfUkVWQgotCWJvb2wgIlN1cHBvcnQgQVJNMTFNUENvcmUgUmV2QiBUaWxlIgotCWRlcGVuZHMgb24gUkVBTFZJRVdfRUJfQVJNMTFNUCAmJiBBUkNIX01VTFRJX1Y2Ci0JaGVscAotCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBBUk0xMU1QQ29yZSBSZXZpc2lvbiBCIHRpbGUgb24gdGhlCi0JICBSZWFsdmlldyhSKSBFbXVsYXRpb24gQmFzZWJvYXJkIHBsYXRmb3JtLiBTaW5jZSB0aGVyZSBhcmUgZGV2aWNlCi0JICBhZGRyZXNzIGRpZmZlcmVuY2VzLCBhIGtlcm5lbCBidWlsdCB3aXRoIHRoaXMgb3B0aW9uIGVuYWJsZWQgaXMKLQkgIG5vdCBjb21wYXRpYmxlIHdpdGggb3RoZXIgcmV2aXNpb25zIG9mIHRoZSBBUk0xMU1QQ29yZSB0aWxlLgotCiBjb25maWcgTUFDSF9SRUFMVklFV19QQjExTVAKIAlib29sICJTdXBwb3J0IFJlYWxWaWV3KFIpIFBsYXRmb3JtIEJhc2Vib2FyZCBmb3IgQVJNMTFNUENvcmUiCiAJZGVwZW5kcyBvbiBBUkNIX01VTFRJX1Y2Ci0Jc2VsZWN0IEFSTV9HSUMKLQlzZWxlY3QgSEFWRV9BUk1fU0NVIGlmIFNNUAotCXNlbGVjdCBIQVZFX0FSTV9UV0QgaWYgU01QCi0Jc2VsZWN0IEhBVkVfUEFUQV9QTEFURk9STQogCXNlbGVjdCBIQVZFX1NNUAogCXNlbGVjdCBNSUdIVF9IQVZFX0NBQ0hFX0wyWDAKIAloZWxwCkBAIC0xMDYsNyArODQsNiBAQAogY29uZmlnIE1BQ0hfUkVBTFZJRVdfUEIxMTc2CiAJYm9vbCAiU3VwcG9ydCBSZWFsVmlldyhSKSBQbGF0Zm9ybSBCYXNlYm9hcmQgZm9yIEFSTTExNzZKWkYtUyIKIAlkZXBlbmRzIG9uIEFSQ0hfTVVMVElfVjYKLQlzZWxlY3QgQVJNX0dJQwogCXNlbGVjdCBDUFVfVjYKIAlzZWxlY3QgSEFWRV9UQ00KIAlzZWxlY3QgTUlHSFRfSEFWRV9DQUNIRV9MMlgwCkBAIC0xMTQsMjAgKzkxLDkgQEAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEFSTShSKSBSZWFsVmlldyhSKSBQbGF0Zm9ybSBCYXNlYm9hcmQgZm9yCiAJICBBUk0xMTc2SlpGLVMuCiAKLWNvbmZpZyBSRUFMVklFV19QQjExNzZfU0VDVVJFX0ZMQVNICi0JYm9vbCAiQWxsb3cgYWNjZXNzIHRvIHRoZSBzZWN1cmUgZmxhc2ggbWVtb3J5IGJsb2NrIgotCWRlcGVuZHMgb24gTUFDSF9SRUFMVklFV19QQjExNzYKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBTZWxlY3QgdGhpcyBvcHRpb24gaWYgTGludXggd2lsbCBvbmx5IHJ1biBpbiBzZWN1cmUgbW9kZSBvbiB0aGUKLQkgIFJlYWxWaWV3IFBCMTE3NiBwbGF0Zm9ybSBhbmQgYWNjZXNzIHRvIHRoZSBzZWN1cmUgZmxhc2ggbWVtb3J5Ci0JICBibG9jayAoNjRNQiBAIDB4M2MwMDAwMDApIGlzIHJlcXVpcmVkLgotCiBjb25maWcgTUFDSF9SRUFMVklFV19QQkE4CiAJYm9vbCAiU3VwcG9ydCBSZWFsVmlldyhSKSBQbGF0Zm9ybSBCYXNlYm9hcmQgZm9yIENvcnRleCh0bSktQTggcGxhdGZvcm0iCiAJZGVwZW5kcyBvbiBBUkNIX01VTFRJX1Y3Ci0Jc2VsZWN0IEFSTV9HSUMKLQlzZWxlY3QgSEFWRV9QQVRBX1BMQVRGT1JNCiAJaGVscAogCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgQVJNKFIpIFJlYWxWaWV3IFBsYXRmb3JtIEJhc2Vib2FyZCBmb3IKIAkgIENvcnRleCh0bSktQTguICBUaGlzIHBsYXRmb3JtIGhhcyBhbiBvbi1ib2FyZCBDb3J0ZXgtQTggYW5kIGhhcwpAQCAtMTM2LDEwICsxMDIsNiBAQAogY29uZmlnIE1BQ0hfUkVBTFZJRVdfUEJYCiAJYm9vbCAiU3VwcG9ydCBSZWFsVmlldyhSKSBQbGF0Zm9ybSBCYXNlYm9hcmQgRXhwbG9yZSBmb3IgQ29ydGV4LUE5IgogCWRlcGVuZHMgb24gQVJDSF9NVUxUSV9WNwotCXNlbGVjdCBBUk1fR0lDCi0Jc2VsZWN0IEhBVkVfQVJNX1NDVSBpZiBTTVAKLQlzZWxlY3QgSEFWRV9BUk1fVFdEIGlmIFNNUAotCXNlbGVjdCBIQVZFX1BBVEFfUExBVEZPUk0KIAlzZWxlY3QgSEFWRV9TTVAKIAlzZWxlY3QgTUlHSFRfSEFWRV9DQUNIRV9MMlgwCiAJc2VsZWN0IFpPTkVfRE1BCkBAIC0xNDcsMTYgKzEwOSw0IEBACiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBBUk0oUikgUmVhbFZpZXcoUikgUGxhdGZvcm0gQmFzZWJvYXJkCiAJICBFeHBsb3JlLgogCi1jb25maWcgUkVBTFZJRVdfSElHSF9QSFlTX09GRlNFVAotCWJvb2wgIkhpZ2ggcGh5c2ljYWwgYmFzZSBhZGRyZXNzIGZvciB0aGUgUmVhbFZpZXcgcGxhdGZvcm0iCi0JZGVwZW5kcyBvbiBNTVUgJiYgIU1BQ0hfUkVBTFZJRVdfUEIxMTc2Ci0JZGVmYXVsdCB5Ci0JaGVscAotCSAgUmVhbFZpZXcgYm9hcmRzIG90aGVyIHRoYW4gUEIxMTc2IGhhdmUgdGhlIFJBTSBhdmFpbGFibGUgYXQKLQkgIDB4NzAwMDAwMDAsIDI1Nk1CIG9mIHdoaWNoIGJlaW5nIG1pcnJvcmVkIGF0IDB4MDAwMDAwMDAuIElmCi0JICB0aGUgYm9hcmQgc3VwcG9ydHMgNTEyTUIgb2YgUkFNLCB0aGlzIG9wdGlvbiBhbGxvd3MgdGhlCi0JICBtZW1vcnkgdG8gYmUgYWNjZXNzZWQgY29udGlndW91c2x5IGF0IHRoZSBoaWdoIHBoeXNpY2FsCi0JICBvZmZzZXQuIE9uIHRoZSBQQlggYm9hcmQsIGRpc2FibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgMUdCIG9mCi0JICBSQU0gdG8gYmUgdXNlZCB3aXRoIEhJR0hNRU0uCi0KIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9NYWtlZmlsZQppbmRleCA0MDQ4ODIxLi5hZGYzOWFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvTWFrZWZpbGUKQEAgLTMsMTYgKzMsNiBAQAogIwogY2NmbGFncy0kKENPTkZJR19BUkNIX01VTFRJUExBVEZPUk0pIDo9IC1JJChzcmN0cmVlKS9hcmNoL2FybS9wbGF0LXZlcnNhdGlsZS9pbmNsdWRlCiAKLW9iai15CQkJCQk6PSBjb3JlLm8KLW9iai0kKENPTkZJR19SRUFMVklFV19EVCkJCSs9IHJlYWx2aWV3LWR0Lm8KK29iai15CQkJCQkrPSByZWFsdmlldy1kdC5vCiBvYmotJChDT05GSUdfU01QKQkJCSs9IHBsYXRzbXAtZHQubwotCi1pZmRlZiBDT05GSUdfQVRBR1MKLW9iai0kKENPTkZJR19NQUNIX1JFQUxWSUVXX0VCKQkJKz0gcmVhbHZpZXdfZWIubwotb2JqLSQoQ09ORklHX01BQ0hfUkVBTFZJRVdfUEIxMU1QKQkrPSByZWFsdmlld19wYjExbXAubwotb2JqLSQoQ09ORklHX01BQ0hfUkVBTFZJRVdfUEIxMTc2KQkrPSByZWFsdmlld19wYjExNzYubwotb2JqLSQoQ09ORklHX01BQ0hfUkVBTFZJRVdfUEJBOCkJKz0gcmVhbHZpZXdfcGJhOC5vCi1vYmotJChDT05GSUdfTUFDSF9SRUFMVklFV19QQlgpCQkrPSByZWFsdmlld19wYngubwotb2JqLSQoQ09ORklHX1NNUCkJCQkrPSBwbGF0c21wLm8KLWVuZGlmCiBvYmotJChDT05GSUdfSE9UUExVR19DUFUpCQkrPSBob3RwbHVnLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvYm9hcmQtZWIuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvYm9hcmQtZWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1MGFlNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2JvYXJkLWViLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3IEFSTSBMaW1pdGVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAotICogTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9CT0FSRF9FQl9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfQk9BUkRfRUJfSAotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotLyoKLSAqIFJlYWxWaWV3IEVCICsgQVJNMTFNUENvcmUgcGVyaXBoZXJhbCBhZGRyZXNzZXMKLSAqLwotI2RlZmluZSBSRUFMVklFV19FQl9VQVJUMF9CQVNFCQkweDEwMDA5MDAwCS8qIFVBUlQgMCAqLwotI2RlZmluZSBSRUFMVklFV19FQl9VQVJUMV9CQVNFCQkweDEwMDBBMDAwCS8qIFVBUlQgMSAqLwotI2RlZmluZSBSRUFMVklFV19FQl9VQVJUMl9CQVNFCQkweDEwMDBCMDAwCS8qIFVBUlQgMiAqLwotI2RlZmluZSBSRUFMVklFV19FQl9VQVJUM19CQVNFCQkweDEwMDBDMDAwCS8qIFVBUlQgMyAqLwotI2RlZmluZSBSRUFMVklFV19FQl9TU1BfQkFTRQkJMHgxMDAwRDAwMAkvKiBTeW5jaHJvbm91cyBTZXJpYWwgUG9ydCAqLwotI2RlZmluZSBSRUFMVklFV19FQl9XQVRDSERPR19CQVNFCTB4MTAwMTAwMDAJLyogd2F0Y2hkb2cgaW50ZXJmYWNlICovCi0jZGVmaW5lIFJFQUxWSUVXX0VCX1RJTUVSMF8xX0JBU0UJMHgxMDAxMTAwMAkvKiBUaW1lciAwIGFuZCAxICovCi0jZGVmaW5lIFJFQUxWSUVXX0VCX1RJTUVSMl8zX0JBU0UJMHgxMDAxMjAwMAkvKiBUaW1lciAyIGFuZCAzICovCi0jZGVmaW5lIFJFQUxWSUVXX0VCX0dQSU8wX0JBU0UJCTB4MTAwMTMwMDAJLyogR1BJTyBwb3J0IDAgKi8KLSNkZWZpbmUgUkVBTFZJRVdfRUJfUlRDX0JBU0UJCTB4MTAwMTcwMDAJLyogUmVhbCBUaW1lIENsb2NrICovCi0jZGVmaW5lIFJFQUxWSUVXX0VCX0NMQ0RfQkFTRQkJMHgxMDAyMDAwMAkvKiBDTENEICovCi0jZGVmaW5lIFJFQUxWSUVXX0VCX0dJQ19DUFVfQkFTRQkweDEwMDQwMDAwCS8qIEdlbmVyaWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgQ1BVIGludGVyZmFjZSAqLwotI2RlZmluZSBSRUFMVklFV19FQl9HSUNfRElTVF9CQVNFCTB4MTAwNDEwMDAJLyogR2VuZXJpYyBpbnRlcnJ1cHQgY29udHJvbGxlciBkaXN0cmlidXRvciAqLwotI2RlZmluZSBSRUFMVklFV19FQl9TTUNfQkFTRQkJMHgxMDA4MDAwMAkvKiBTdGF0aWMgbWVtb3J5IGNvbnRyb2xsZXIgKi8KLQotI2RlZmluZSBSRUFMVklFV19FQl9GTEFTSF9CQVNFCQkweDQwMDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX0VCX0ZMQVNIX1NJWkUJCVNaXzY0TQotI2RlZmluZSBSRUFMVklFV19FQl9FVEhfQkFTRQkJMHg0RTAwMDAwMAkvKiBFdGhlcm5ldCAqLwotI2RlZmluZSBSRUFMVklFV19FQl9VU0JfQkFTRQkJMHg0RjAwMDAwMAkvKiBVU0IgKi8KLQotI2lmZGVmIENPTkZJR19SRUFMVklFV19FQl9BUk0xMU1QX1JFVkIKLSNkZWZpbmUgUkVBTFZJRVdfRUIxMU1QX1BSSVZfTUVNX0JBU0UJMHgxMDEwMDAwMAotI2RlZmluZSBSRUFMVklFV19FQjExTVBfTDIyMF9CQVNFCTB4MTAxMDIwMDAJLyogTDIyMCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUkVBTFZJRVdfRUIxMU1QX1NZU19QTERfQ1RSTDEJMHhEOAkJLyogUmVnaXN0ZXIgb2Zmc2V0IGZvciBNUENvcmUgc3lzY3RsICovCi0jZWxzZQotI2RlZmluZSBSRUFMVklFV19FQjExTVBfUFJJVl9NRU1fQkFTRQkweDFGMDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9MMjIwX0JBU0UJMHgxRjAwMjAwMAkvKiBMMjIwIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSRUFMVklFV19FQjExTVBfU1lTX1BMRF9DVFJMMQkweDc0CQkvKiBSZWdpc3RlciBvZmZzZXQgZm9yIE1QQ29yZSBzeXNjdGwgKi8KLSNlbmRpZgotCi0jZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9QUklWX01FTV9TSVpFCVNaXzhLCi0jZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9QUklWX01FTV9PRkYoeCkJKFJFQUxWSUVXX0VCMTFNUF9QUklWX01FTV9CQVNFICsgKHgpKQotCi0jZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9TQ1VfQkFTRQlSRUFMVklFV19FQjExTVBfUFJJVl9NRU1fT0ZGKDApCQkvKiBTQ1UgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9HSUNfQ1BVX0JBU0UJUkVBTFZJRVdfRUIxMU1QX1BSSVZfTUVNX09GRigweDAxMDApCS8qIEdlbmVyaWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgQ1BVIGludGVyZmFjZSAqLwotI2RlZmluZSBSRUFMVklFV19FQjExTVBfVFdEX0JBU0UJUkVBTFZJRVdfRUIxMU1QX1BSSVZfTUVNX09GRigweDA2MDApCi0jZGVmaW5lIFJFQUxWSUVXX0VCMTFNUF9HSUNfRElTVF9CQVNFCVJFQUxWSUVXX0VCMTFNUF9QUklWX01FTV9PRkYoMHgxMDAwKQkvKiBHZW5lcmljIGludGVycnVwdCBjb250cm9sbGVyIGRpc3RyaWJ1dG9yICovCi0KLS8qCi0gKiBDb3JlIHRpbGUgaWRlbnRpZmljYXRpb24gKFJFQUxWSUVXX1NZU19QUk9DSUQpCi0gKi8KLSNkZWZpbmUgUkVBTFZJRVdfRUJfUFJPQ19NQVNLCQkweEZGMDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX0VCX1BST0NfQVJNN1RETUkJMHgwMDAwMDAwMAotI2RlZmluZSBSRUFMVklFV19FQl9QUk9DX0FSTTkJCTB4MDIwMDAwMDAKLSNkZWZpbmUgUkVBTFZJRVdfRUJfUFJPQ19BUk0xMQkJMHgwNDAwMDAwMAotI2RlZmluZSBSRUFMVklFV19FQl9QUk9DX0FSTTExTVAJMHgwNjAwMDAwMAotI2RlZmluZSBSRUFMVklFV19FQl9QUk9DX0E5TVAJCTB4MEMwMDAwMDAKLQotI2RlZmluZSBjaGVja19lYl9wcm9jKHByb2NfdHlwZSkJCQkJCQlcCi0JKChyZWFkbChfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX1BST0NJRCkpICYgUkVBTFZJRVdfRUJfUFJPQ19NQVNLKQlcCi0JID09IHByb2NfdHlwZSkKLQotI2lmZGVmIENPTkZJR19SRUFMVklFV19FQl9BUk0xMU1QCi0jZGVmaW5lIGNvcmVfdGlsZV9lYjExbXAoKQljaGVja19lYl9wcm9jKFJFQUxWSUVXX0VCX1BST0NfQVJNMTFNUCkKLSNlbHNlCi0jZGVmaW5lIGNvcmVfdGlsZV9lYjExbXAoKQkwCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19SRUFMVklFV19FQl9BOU1QCi0jZGVmaW5lIGNvcmVfdGlsZV9hOW1wKCkJY2hlY2tfZWJfcHJvYyhSRUFMVklFV19FQl9QUk9DX0E5TVApCi0jZWxzZQotI2RlZmluZSBjb3JlX3RpbGVfYTltcCgpCTAKLSNlbmRpZgotCi0jZGVmaW5lIG1hY2hpbmVfaXNfcmVhbHZpZXdfZWJfbXAoKSBcCi0JKG1hY2hpbmVfaXNfcmVhbHZpZXdfZWIoKSAmJiAoY29yZV90aWxlX2ViMTFtcCgpIHx8IGNvcmVfdGlsZV9hOW1wKCkpKQotCi0jZW5kaWYJLyogX19BU01fQVJDSF9CT0FSRF9FQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2JvYXJkLXBiMTE3Ni5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9ib2FyZC1wYjExNzYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljMDRhOS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2JvYXJkLXBiMTE3Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKLSAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfQk9BUkRfUEIxMTc2X0gKLSNkZWZpbmUgX19BU01fQVJDSF9CT0FSRF9QQjExNzZfSAotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotLyoKLSAqIFBlcmlwaGVyYWwgYWRkcmVzc2VzCi0gKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1VBUlQ0X0JBU0UJCTB4MTAwMDkwMDAgLyogVUFSVCA0ICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9TQ1RMX0JBU0UJCTB4MTAxMDAwMDAgLyogU3lzdGVtIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1NNQ19CQVNFCQkweDEwMTExMDAwIC8qIFNNQyAqLwotI2RlZmluZSBSRUFMVklFV19QQjExNzZfRE1DX0JBU0UJCTB4MTAxMDkwMDAgLyogRE1DIGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1NEUkFNNjdfQkFTRQkJMHg3MDAwMDAwMCAvKiBTRFJBTSBiYW5rcyA2IGFuZCA3ICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9GTEFTSF9CQVNFCQkweDMwMDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9GTEFTSF9TSVpFCQlTWl82NE0KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1NFQ19GTEFTSF9CQVNFCQkweDNDMDAwMDAwIC8qIFNlY3VyZSBmbGFzaCAqLwotI2RlZmluZSBSRUFMVklFV19QQjExNzZfU0VDX0ZMQVNIX1NJWkUJCVNaXzY0TQotCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9USU1FUjBfMV9CQVNFCQkweDEwMTA0MDAwIC8qIFRpbWVyIDAgYW5kIDEgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1RJTUVSMl8zX0JBU0UJCTB4MTAxMDUwMDAgLyogVGltZXIgMiBhbmQgMyAqLwotI2RlZmluZSBSRUFMVklFV19QQjExNzZfVElNRVI0XzVfQkFTRQkJMHgxMDEwNjAwMCAvKiBUaW1lciA0IGFuZCA1ICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9XQVRDSERPR19CQVNFCQkweDEwMTA3MDAwIC8qIHdhdGNoZG9nIGludGVyZmFjZSAqLwotI2RlZmluZSBSRUFMVklFV19QQjExNzZfUlRDX0JBU0UJCTB4MTAxMDgwMDAgLyogUmVhbCBUaW1lIENsb2NrICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9HUElPMF9CQVNFCQkweDEwMTBBMDAwIC8qIEdQSU8gcG9ydCAwICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9TU1BfQkFTRQkJMHgxMDEwQjAwMCAvKiBTeW5jaHJvbm91cyBTZXJpYWwgUG9ydCAqLwotI2RlZmluZSBSRUFMVklFV19QQjExNzZfVUFSVDBfQkFTRQkJMHgxMDEwQzAwMCAvKiBVQVJUIDAgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1VBUlQxX0JBU0UJCTB4MTAxMEQwMDAgLyogVUFSVCAxICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9VQVJUMl9CQVNFCQkweDEwMTBFMDAwIC8qIFVBUlQgMiAqLwotI2RlZmluZSBSRUFMVklFV19QQjExNzZfVUFSVDNfQkFTRQkJMHgxMDEwRjAwMCAvKiBVQVJUIDMgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X0NMQ0RfQkFTRQkJMHgxMDExMjAwMCAvKiBDTENEICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9FVEhfQkFTRQkJMHgzQTAwMDAwMCAvKiBFdGhlcm5ldCAqLwotI2RlZmluZSBSRUFMVklFV19QQjExNzZfVVNCX0JBU0UJCTB4M0IwMDAwMDAgLyogVVNCICovCi0KLS8qCi0gKiBQQ0kgcmVnaW9ucwotICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9QQ0lfQkFTRQkJMHg2MDAwMDAwMCAvKiBQQ0kgc2VsZiBjb25maWcgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1BDSV9DRkdfQkFTRQkJMHg2MTAwMDAwMCAvKiBQQ0kgY29uZmlnICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9QQ0lfSU9fQkFTRTAJCTB4NjIwMDAwMDAgLyogUENJIElPIHJlZ2lvbiAqLwotI2RlZmluZSBSRUFMVklFV19QQjExNzZfUENJX01FTV9CQVNFMAkJMHg2MzAwMDAwMCAvKiBNZW1vcnkgcmVnaW9uIDEgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1BDSV9NRU1fQkFTRTEJCTB4NjQwMDAwMDAgLyogTWVtb3J5IHJlZ2lvbiAyICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9QQ0lfTUVNX0JBU0UyCQkweDY4MDAwMDAwIC8qIE1lbW9yeSByZWdpb24gMyAqLwotCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9QQ0lfQkFTRV9TSVpFCQkweDAxMDAwMDAwIC8qIDE2TUIgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1BDSV9DRkdfQkFTRV9TSVpFCTB4MDEwMDAwMDAgLyogMTZNQiAqLwotI2RlZmluZSBSRUFMVklFV19QQjExNzZfUENJX0lPX0JBU0UwX1NJWkUJMHgwMTAwMDAwMCAvKiAxNk1CICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9QQ0lfTUVNX0JBU0UwX1NJWkUJMHgwMTAwMDAwMCAvKiAxNk1CICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9QQ0lfTUVNX0JBU0UxX1NJWkUJMHgwNDAwMDAwMCAvKiA2NE1CICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTE3Nl9QQ0lfTUVNX0JBU0UyX1NJWkUJMHgwODAwMDAwMCAvKiAxMjhNQiAqLwotCi0jZGVmaW5lIFJFQUxWSUVXX0RDMTE3Nl9HSUNfQ1BVX0JBU0UJCTB4MTAxMjAwMDAgLyogR0lDIENQVSBpbnRlcmZhY2UsIG9uIGRldmNoaXAgKi8KLSNkZWZpbmUgUkVBTFZJRVdfREMxMTc2X0dJQ19ESVNUX0JBU0UJCTB4MTAxMjEwMDAgLyogR0lDIGRpc3RyaWJ1dG9yLCBvbiBkZXZjaGlwICovCi0jZGVmaW5lIFJFQUxWSUVXX0RDMTE3Nl9ST01fQkFTRQkJMHgxMDIwMDAwMCAvKiAxNktpQiBOUkFNIHByZXVkby1ST00sIG9uIGRldmNoaXAgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X0dJQ19DUFVfQkFTRQkJMHgxMDA0MDAwMCAvKiBHSUMgQ1BVIGludGVyZmFjZSwgb24gRlBHQSAqLwotI2RlZmluZSBSRUFMVklFV19QQjExNzZfR0lDX0RJU1RfQkFTRQkJMHgxMDA0MTAwMCAvKiBHSUMgZGlzdHJpYnV0b3IsIG9uIEZQR0EgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X0wyMjBfQkFTRQkJMHgxMDExMDAwMCAvKiBMMjIwIHJlZ2lzdGVycyAqLwotCi0vKgotICogQ29udHJvbCByZWdpc3RlciBTWVNfUkVTRVRDVEwgQml0IDggaXMgc2V0IHRvIDEgdG8gZm9yY2UgYSBzb2Z0IHJlc2V0Ci0gKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMTc2X1NZU19TT0ZUX1JFU0VUICAgIDB4MDEwMAotCi0jZW5kaWYJLyogX19BU01fQVJDSF9CT0FSRF9QQjExNzZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9ib2FyZC1wYjExbXAuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvYm9hcmQtcGIxMW1wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNmU2ZTg1Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvYm9hcmQtcGIxMW1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEFSTSBMaW1pdGVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAotICogTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9CT0FSRF9QQjExTVBfSAotI2RlZmluZSBfX0FTTV9BUkNIX0JPQVJEX1BCMTFNUF9ICi0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi0vKgotICogUGVyaXBoZXJhbCBhZGRyZXNzZXMKLSAqLwotI2RlZmluZSBSRUFMVklFV19QQjExTVBfVUFSVDBfQkFTRQkJMHgxMDAwOTAwMAkvKiBVQVJUIDAgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1VBUlQxX0JBU0UJCTB4MTAwMEEwMDAJLyogVUFSVCAxICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9VQVJUMl9CQVNFCQkweDEwMDBCMDAwCS8qIFVBUlQgMiAqLwotI2RlZmluZSBSRUFMVklFV19QQjExTVBfVUFSVDNfQkFTRQkJMHgxMDAwQzAwMAkvKiBVQVJUIDMgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1NTUF9CQVNFCQkweDEwMDBEMDAwCS8qIFN5bmNocm9ub3VzIFNlcmlhbCBQb3J0ICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9XQVRDSERPRzBfQkFTRQkJMHgxMDAwRjAwMAkvKiBXYXRjaGRvZyAwICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9XQVRDSERPR19CQVNFCQkweDEwMDEwMDAwCS8qIHdhdGNoZG9nIGludGVyZmFjZSAqLwotI2RlZmluZSBSRUFMVklFV19QQjExTVBfVElNRVIwXzFfQkFTRQkJMHgxMDAxMTAwMAkvKiBUaW1lciAwIGFuZCAxICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9USU1FUjJfM19CQVNFCQkweDEwMDEyMDAwCS8qIFRpbWVyIDIgYW5kIDMgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX0dQSU8wX0JBU0UJCTB4MTAwMTMwMDAJLyogR1BJTyBwb3J0IDAgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1JUQ19CQVNFCQkweDEwMDE3MDAwCS8qIFJlYWwgVGltZSBDbG9jayAqLwotI2RlZmluZSBSRUFMVklFV19QQjExTVBfVElNRVI0XzVfQkFTRQkJMHgxMDAxODAwMAkvKiBUaW1lciA0LzUgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1RJTUVSNl83X0JBU0UJCTB4MTAwMTkwMDAJLyogVGltZXIgNi83ICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9TQ1RMX0JBU0UJCTB4MTAwMUEwMDAJLyogU3lzdGVtIENvbnRyb2xsZXIgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX0NMQ0RfQkFTRQkJMHgxMDAyMDAwMAkvKiBDTENEICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9PTkJfU1JBTV9CQVNFCQkweDEwMDYwMDAwCS8qIE9uLWJvYXJkIFNSQU0gKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX0RNQ19CQVNFCQkweDEwMEUwMDAwCS8qIERNQyBjb25maWd1cmF0aW9uICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9TTUNfQkFTRQkJMHgxMDBFMTAwMAkvKiBTTUMgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBSRUFMVklFV19QQjExTVBfQ0FOX0JBU0UJCTB4MTAwRTIwMDAJLyogQ0FOIGJ1cyAqLwotI2RlZmluZSBSRUFMVklFV19QQjExTVBfQ0ZfQkFTRQkJCTB4MTgwMDAwMDAJLyogQ29tcGFjdCBmbGFzaCAqLwotI2RlZmluZSBSRUFMVklFV19QQjExTVBfQ0ZfTUVNX0JBU0UJCTB4MTgwMDMwMDAJLyogU01DIGZvciBDb21wYWN0IGZsYXNoICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9HSUNfQ1BVX0JBU0UJCTB4MUUwMDAwMDAJLyogR2VuZXJpYyBpbnRlcnJ1cHQgY29udHJvbGxlciBDUFUgaW50ZXJmYWNlICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9GTEFTSDBfQkFTRQkJMHg0MDAwMDAwMAotI2RlZmluZSBSRUFMVklFV19QQjExTVBfRkxBU0gwX1NJWkUJCVNaXzY0TQotI2RlZmluZSBSRUFMVklFV19QQjExTVBfRkxBU0gxX0JBU0UJCTB4NDQwMDAwMDAKLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX0ZMQVNIMV9TSVpFCQlTWl82NE0KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX0VUSF9CQVNFCQkweDRFMDAwMDAwCS8qIEV0aGVybmV0ICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9VU0JfQkFTRQkJMHg0RjAwMDAwMAkvKiBVU0IgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX0dJQ19ESVNUX0JBU0UJCTB4MUUwMDEwMDAJLyogR2VuZXJpYyBpbnRlcnJ1cHQgY29udHJvbGxlciBkaXN0cmlidXRvciAqLwotI2RlZmluZSBSRUFMVklFV19QQjExTVBfTFRfQkFTRQkJCTB4QzAwMDAwMDAJLyogTG9naWMgVGlsZSBleHBhbnNpb24gKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1NEUkFNNl9CQVNFCQkweDcwMDAwMDAwCS8qIFNEUkFNIGJhbmsgNiAyNTZNQiAqLwotI2RlZmluZSBSRUFMVklFV19QQjExTVBfU0RSQU03X0JBU0UJCTB4ODAwMDAwMDAJLyogU0RSQU0gYmFuayA3IDI1Nk1CICovCi0KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1NZU19QTERfQ1RSTDEJCTB4NzQKLQotLyoKLSAqIFBCMTFNUENvcmUgUENJIHJlZ2lvbnMKLSAqLwotI2RlZmluZSBSRUFMVklFV19QQjExTVBfUENJX0JBU0UJCTB4OTAwNDAwMDAJLyogUENJLVggVW5pdCBiYXNlICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9QQ0lfSU9fQkFTRQkJMHg5MDA1MDAwMAkvKiBJTyBSZWdpb24gb24gQUhCICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9QQ0lfTUVNX0JBU0UJCTB4QTAwMDAwMDAJLyogTUVNIFJlZ2lvbiBvbiBBSEIgKi8KLQotI2RlZmluZSBSRUFMVklFV19QQjExTVBfUENJX0JBU0VfU0laRQkJMHgxMDAwMAkJLyogMTYgS2IgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1BDSV9JT19TSVpFCQkweDEwMDAJCS8qIDQgS2IgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1BDSV9NRU1fU0laRQkJMHgyMDAwMDAwMAkvKiA1MTIgTUIgKi8KLQotLyoKLSAqIFRlc3RjaGlwIHBlcmlwaGVyYWwgYW5kIGZwZ2EgZ2ljIHJlZ2lvbnMKLSAqLwotI2RlZmluZSBSRUFMVklFV19UQzExTVBfUFJJVl9NRU1fQkFTRQkJMHgxRjAwMDAwMAotI2RlZmluZSBSRUFMVklFV19UQzExTVBfUFJJVl9NRU1fU0laRQkJU1pfOEsKLSNkZWZpbmUgUkVBTFZJRVdfVEMxMU1QX1NDVV9CQVNFCQkweDFGMDAwMDAwCS8qIElSUSwgVGVzdCBjaGlwICovCi0jZGVmaW5lIFJFQUxWSUVXX1RDMTFNUF9HSUNfQ1BVX0JBU0UJCTB4MUYwMDAxMDAJLyogVGVzdCBjaGlwIGludGVycnVwdCBjb250cm9sbGVyIENQVSBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgUkVBTFZJRVdfVEMxMU1QX1RXRF9CQVNFCQkweDFGMDAwNjAwCi0jZGVmaW5lIFJFQUxWSUVXX1RDMTFNUF9HSUNfRElTVF9CQVNFCQkweDFGMDAxMDAwCS8qIFRlc3QgY2hpcCBpbnRlcnJ1cHQgY29udHJvbGxlciBkaXN0cmlidXRvciAqLwotI2RlZmluZSBSRUFMVklFV19UQzExTVBfTDIyMF9CQVNFCQkweDFGMDAyMDAwCS8qIEwyMjAgcmVnaXN0ZXJzICovCi0KLSAvKgotICogVmFsdWVzIGZvciBSRUFMVklFV19TWVNfUkVTRVRfQ1RSTAotICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9TWVNfQ1RSTF9SRVNFVF9DT05GSUdDTFIgICAgMHgwMQotI2RlZmluZSBSRUFMVklFV19QQjExTVBfU1lTX0NUUkxfUkVTRVRfQ09ORklHSU5JVCAgIDB4MDIKLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1NZU19DVFJMX1JFU0VUX0RMTFJFU0VUICAgICAweDAzCi0jZGVmaW5lIFJFQUxWSUVXX1BCMTFNUF9TWVNfQ1RSTF9SRVNFVF9QTExSRVNFVCAgICAgMHgwNAotI2RlZmluZSBSRUFMVklFV19QQjExTVBfU1lTX0NUUkxfUkVTRVRfUE9SICAgICAgICAgIDB4MDUKLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1NZU19DVFJMX1JFU0VUX0RvQyAgICAgICAgICAweDA2Ci0KLSNkZWZpbmUgUkVBTFZJRVdfUEIxMU1QX1NZU19DVFJMX0xFRCAgICAgICAgICgxIDw8IDApCi0KLSNlbmRpZgkvKiBfX0FTTV9BUkNIX0JPQVJEX1BCMTFNUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2JvYXJkLXBiYTguaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvYm9hcmQtcGJhOC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTEzOTFmLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvYm9hcmQtcGJhOC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBBUk0gTGltaXRlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKLSAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfQk9BUkRfUEJBOF9ICi0jZGVmaW5lIF9fQVNNX0FSQ0hfQk9BUkRfUEJBOF9ICi0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi0vKgotICogUGVyaXBoZXJhbCBhZGRyZXNzZXMKLSAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X1VBUlQwX0JBU0UJCTB4MTAwMDkwMDAJLyogVUFSVCAwICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfVUFSVDFfQkFTRQkJMHgxMDAwQTAwMAkvKiBVQVJUIDEgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJBOF9VQVJUMl9CQVNFCQkweDEwMDBCMDAwCS8qIFVBUlQgMiAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X1VBUlQzX0JBU0UJCTB4MTAwMEMwMDAJLyogVUFSVCAzICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfU1NQX0JBU0UJCQkweDEwMDBEMDAwCS8qIFN5bmNocm9ub3VzIFNlcmlhbCBQb3J0ICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfV0FUQ0hET0cwX0JBU0UJCTB4MTAwMEYwMDAJLyogV2F0Y2hkb2cgMCAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X1dBVENIRE9HX0JBU0UJCTB4MTAwMTAwMDAJLyogd2F0Y2hkb2cgaW50ZXJmYWNlICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfVElNRVIwXzFfQkFTRQkJMHgxMDAxMTAwMAkvKiBUaW1lciAwIGFuZCAxICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfVElNRVIyXzNfQkFTRQkJMHgxMDAxMjAwMAkvKiBUaW1lciAyIGFuZCAzICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfR1BJTzBfQkFTRQkJMHgxMDAxMzAwMAkvKiBHUElPIHBvcnQgMCAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X1JUQ19CQVNFCQkJMHgxMDAxNzAwMAkvKiBSZWFsIFRpbWUgQ2xvY2sgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJBOF9USU1FUjRfNV9CQVNFCQkweDEwMDE4MDAwCS8qIFRpbWVyIDQvNSAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X1RJTUVSNl83X0JBU0UJCTB4MTAwMTkwMDAJLyogVGltZXIgNi83ICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfU0NUTF9CQVNFCQkJMHgxMDAxQTAwMAkvKiBTeXN0ZW0gQ29udHJvbGxlciAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X0NMQ0RfQkFTRQkJCTB4MTAwMjAwMDAJLyogQ0xDRCAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X09OQl9TUkFNX0JBU0UJCTB4MTAwNjAwMDAJLyogT24tYm9hcmQgU1JBTSAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X0RNQ19CQVNFCQkJMHgxMDBFMDAwMAkvKiBETUMgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X1NNQ19CQVNFCQkJMHgxMDBFMTAwMAkvKiBTTUMgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X0NBTl9CQVNFCQkJMHgxMDBFMjAwMAkvKiBDQU4gYnVzICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfR0lDX0NQVV9CQVNFCQkweDFFMDAwMDAwCS8qIEdlbmVyaWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgQ1BVIGludGVyZmFjZSAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X0ZMQVNIMF9CQVNFCQkweDQwMDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfRkxBU0gwX1NJWkUJCVNaXzY0TQotI2RlZmluZSBSRUFMVklFV19QQkE4X0ZMQVNIMV9CQVNFCQkweDQ0MDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfRkxBU0gxX1NJWkUJCVNaXzY0TQotI2RlZmluZSBSRUFMVklFV19QQkE4X0VUSF9CQVNFCQkJMHg0RTAwMDAwMAkvKiBFdGhlcm5ldCAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X1VTQl9CQVNFCQkJMHg0RjAwMDAwMAkvKiBVU0IgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJBOF9HSUNfRElTVF9CQVNFCQkweDFFMDAxMDAwCS8qIEdlbmVyaWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgZGlzdHJpYnV0b3IgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJBOF9MVF9CQVNFCQkJMHhDMDAwMDAwMAkvKiBMb2dpYyBUaWxlIGV4cGFuc2lvbiAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X1NEUkFNNl9CQVNFCQkweDcwMDAwMDAwCS8qIFNEUkFNIGJhbmsgNiAyNTZNQiAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X1NEUkFNN19CQVNFCQkweDgwMDAwMDAwCS8qIFNEUkFNIGJhbmsgNyAyNTZNQiAqLwotCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfU1lTX1BMRF9DVFJMMQkJMHg3NAotCi0vKgotICogUEJBOCBQQ0kgcmVnaW9ucwotICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfUENJX0JBU0UJCQkweDkwMDQwMDAwCS8qIFBDSS1YIFVuaXQgYmFzZSAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X1BDSV9JT19CQVNFCQkweDkwMDUwMDAwCS8qIElPIFJlZ2lvbiBvbiBBSEIgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJBOF9QQ0lfTUVNX0JBU0UJCTB4QTAwMDAwMDAJLyogTUVNIFJlZ2lvbiBvbiBBSEIgKi8KLQotI2RlZmluZSBSRUFMVklFV19QQkE4X1BDSV9CQVNFX1NJWkUJCTB4MTAwMDAJCS8qIDE2IEtiICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCQThfUENJX0lPX1NJWkUJCTB4MTAwMAkJLyogNCBLYiAqLwotI2RlZmluZSBSRUFMVklFV19QQkE4X1BDSV9NRU1fU0laRQkJMHgyMDAwMDAwMAkvKiA1MTIgTUIgKi8KLQotI2VuZGlmCS8qIF9fQVNNX0FSQ0hfQk9BUkRfUEJBOF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2JvYXJkLXBieC5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9ib2FyZC1wYnguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkYTQ4MC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2JvYXJkLXBieC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQVJNIExpbWl0ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLSNpZm5kZWYgX19BU01fQVJDSF9CT0FSRF9QQlhfSAotI2RlZmluZSBfX0FTTV9BUkNIX0JPQVJEX1BCWF9ICi0KLSNpbmNsdWRlICJwbGF0Zm9ybS5oIgotCi0vKgotICogUGVyaXBoZXJhbCBhZGRyZXNzZXMKLSAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfVUFSVDBfQkFTRQkJCTB4MTAwMDkwMDAJLyogVUFSVCAwICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9VQVJUMV9CQVNFCQkJMHgxMDAwQTAwMAkvKiBVQVJUIDEgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1VBUlQyX0JBU0UJCQkweDEwMDBCMDAwCS8qIFVBUlQgMiAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfVUFSVDNfQkFTRQkJCTB4MTAwMEMwMDAJLyogVUFSVCAzICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9TU1BfQkFTRQkJCTB4MTAwMEQwMDAJLyogU3luY2hyb25vdXMgU2VyaWFsIFBvcnQgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1dBVENIRE9HMF9CQVNFCQkweDEwMDBGMDAwCS8qIFdhdGNoZG9nIDAgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1dBVENIRE9HX0JBU0UJCTB4MTAwMTAwMDAJLyogd2F0Y2hkb2cgaW50ZXJmYWNlICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9USU1FUjBfMV9CQVNFCQkweDEwMDExMDAwCS8qIFRpbWVyIDAgYW5kIDEgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1RJTUVSMl8zX0JBU0UJCTB4MTAwMTIwMDAJLyogVGltZXIgMiBhbmQgMyAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfR1BJTzBfQkFTRQkJCTB4MTAwMTMwMDAJLyogR1BJTyBwb3J0IDAgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1JUQ19CQVNFCQkJMHgxMDAxNzAwMAkvKiBSZWFsIFRpbWUgQ2xvY2sgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1RJTUVSNF81X0JBU0UJCTB4MTAwMTgwMDAJLyogVGltZXIgNC81ICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9USU1FUjZfN19CQVNFCQkweDEwMDE5MDAwCS8qIFRpbWVyIDYvNyAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfU0NUTF9CQVNFCQkJMHgxMDAxQTAwMAkvKiBTeXN0ZW0gQ29udHJvbGxlciAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfQ0xDRF9CQVNFCQkJMHgxMDAyMDAwMAkvKiBDTENEICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9PTkJfU1JBTV9CQVNFCQkweDEwMDYwMDAwCS8qIE9uLWJvYXJkIFNSQU0gKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX0RNQ19CQVNFCQkJMHgxMDBFMDAwMAkvKiBETUMgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfU01DX0JBU0UJCQkweDEwMEUxMDAwCS8qIFNNQyBjb25maWd1cmF0aW9uICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9DQU5fQkFTRQkJCTB4MTAwRTIwMDAJLyogQ0FOIGJ1cyAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfR0lDX0NQVV9CQVNFCQkweDFFMDAwMDAwCS8qIEdlbmVyaWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgQ1BVIGludGVyZmFjZSAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfRkxBU0gwX0JBU0UJCTB4NDAwMDAwMDAKLSNkZWZpbmUgUkVBTFZJRVdfUEJYX0ZMQVNIMF9TSVpFCQlTWl82NE0KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX0ZMQVNIMV9CQVNFCQkweDQ0MDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9GTEFTSDFfU0laRQkJU1pfNjRNCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9FVEhfQkFTRQkJCTB4NEUwMDAwMDAJLyogRXRoZXJuZXQgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1VTQl9CQVNFCQkJMHg0RjAwMDAwMAkvKiBVU0IgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX0dJQ19ESVNUX0JBU0UJCTB4MUUwMDEwMDAJLyogR2VuZXJpYyBpbnRlcnJ1cHQgY29udHJvbGxlciBkaXN0cmlidXRvciAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfTFRfQkFTRQkJCTB4QzAwMDAwMDAJLyogTG9naWMgVGlsZSBleHBhbnNpb24gKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1NEUkFNNl9CQVNFCQkweDcwMDAwMDAwCS8qIFNEUkFNIGJhbmsgNiAyNTZNQiAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfU0RSQU03X0JBU0UJCTB4ODAwMDAwMDAJLyogU0RSQU0gYmFuayA3IDI1Nk1CICovCi0KLS8qCi0gKiBUaWxlLXNwZWNpZmljIGFkZHJlc3NlcwotICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9USUxFX1NDVV9CQVNFCQkweDFGMDAwMDAwICAgICAgLyogU0NVIHJlZ2lzdGVycyAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfVElMRV9HSUNfQ1BVX0JBU0UJCTB4MUYwMDAxMDAgICAgICAvKiBQcml2YXRlIEdlbmVyaWMgaW50ZXJydXB0IGNvbnRyb2xsZXIgQ1BVIGludGVyZmFjZSAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfVElMRV9UV0RfQkFTRQkJMHgxRjAwMDYwMAotI2RlZmluZSBSRUFMVklFV19QQlhfVElMRV9UV0RfUEVSQ1BVX0JBU0UJMHgxRjAwMDcwMAotI2RlZmluZSBSRUFMVklFV19QQlhfVElMRV9UV0RfU0laRQkJMHgwMDAwMDEwMAotI2RlZmluZSBSRUFMVklFV19QQlhfVElMRV9HSUNfRElTVF9CQVNFCQkweDFGMDAxMDAwICAgICAgLyogUHJpdmF0ZSBHZW5lcmljIGludGVycnVwdCBjb250cm9sbGVyIGRpc3RyaWJ1dG9yICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9USUxFX0wyMjBfQkFTRQkJMHgxRjAwMjAwMCAgICAgIC8qIEwyMjAgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1NZU19QTERfQ1RSTDEJCTB4NzQKLQotLyoKLSAqIFBCWCBQQ0kgcmVnaW9ucwotICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9QQ0lfQkFTRQkJCTB4OTAwNDAwMDAJLyogUENJLVggVW5pdCBiYXNlICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9QQ0lfSU9fQkFTRQkJMHg5MDA1MDAwMAkvKiBJTyBSZWdpb24gb24gQUhCICovCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9QQ0lfTUVNX0JBU0UJCTB4QTAwMDAwMDAJLyogTUVNIFJlZ2lvbiBvbiBBSEIgKi8KLQotI2RlZmluZSBSRUFMVklFV19QQlhfUENJX0JBU0VfU0laRQkJMHgxMDAwMAkJLyogMTYgS2IgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1BDSV9JT19TSVpFCQkweDEwMDAJCS8qIDQgS2IgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1BDSV9NRU1fU0laRQkJMHgyMDAwMDAwMAkvKiA1MTIgTUIgKi8KLQotLyoKLSAqIENvcmUgdGlsZSBpZGVudGlmaWNhdGlvbiAoUkVBTFZJRVdfU1lTX1BST0NJRCkKLSAqLwotI2RlZmluZSBSRUFMVklFV19QQlhfUFJPQ19NQVNLICAgICAgICAgIDB4RkYwMDAwMDAKLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1BST0NfQVJNN1RETUkgICAgICAweDAwMDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9QUk9DX0FSTTkgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBSRUFMVklFV19QQlhfUFJPQ19BUk0xMSAgICAgICAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgUkVBTFZJRVdfUEJYX1BST0NfQVJNMTFNUCAgICAgICAweDA2MDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX1BCWF9QUk9DX0E5TVAgICAgICAgICAgMHgwQzAwMDAwMAotI2RlZmluZSBSRUFMVklFV19QQlhfUFJPQ19BOCAgICAgICAgICAgIDB4MEUwMDAwMDAKLQotI2RlZmluZSBjaGVja19wYnhfcHJvYyhwcm9jX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JKChyZWFkbChfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX1BST0NJRCkpICYgUkVBTFZJRVdfUEJYX1BST0NfTUFTSykgXAotCT09IHByb2NfdHlwZSkKLQotI2lmZGVmIENPTkZJR19NQUNIX1JFQUxWSUVXX1BCWAotI2RlZmluZSBjb3JlX3RpbGVfcGJ4MTFtcCgpICAgICBjaGVja19wYnhfcHJvYyhSRUFMVklFV19QQlhfUFJPQ19BUk0xMU1QKQotI2RlZmluZSBjb3JlX3RpbGVfcGJ4YTltcCgpICAgICBjaGVja19wYnhfcHJvYyhSRUFMVklFV19QQlhfUFJPQ19BOU1QKQotI2RlZmluZSBjb3JlX3RpbGVfcGJ4YTgoKSAgICAgICBjaGVja19wYnhfcHJvYyhSRUFMVklFV19QQlhfUFJPQ19BOCkKLSNlbHNlCi0jZGVmaW5lIGNvcmVfdGlsZV9wYngxMW1wKCkgICAgIDAKLSNkZWZpbmUgY29yZV90aWxlX3BieGE5bXAoKSAgICAgMAotI2RlZmluZSBjb3JlX3RpbGVfcGJ4YTgoKSAgICAgICAwCi0jZW5kaWYKLQotI2VuZGlmCS8qIF9fQVNNX0FSQ0hfQk9BUkRfUEJYX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjE3NDUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDQgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTkgLSAyMDAzIEFSTSBMaW1pdGVkCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KLSNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3ZpZGVvLWNsY2QtdmVyc2F0aWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbXNjOTExeC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgotI2luY2x1ZGUgPGxpbnV4L2F0YV9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGxpbnV4L2FtYmEvbW1jaS5oPgotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KLQotI2luY2x1ZGUgPGNsb2Nrc291cmNlL3RpbWVyLXNwODA0Lmg+Ci0jaW5jbHVkZSAiaGFyZHdhcmUuaCIKLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvaWNzdC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotCi0jaW5jbHVkZSAicGxhdGZvcm0uaCIKLQotI2luY2x1ZGUgPHBsYXQvc2NoZWRfY2xvY2suaD4KLQotI2luY2x1ZGUgImNvcmUuaCIKLQotI2RlZmluZSBSRUFMVklFV19GTEFTSENUUkwgICAgKF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfQkFTRSkgKyBSRUFMVklFV19TWVNfRkxBU0hfT0ZGU0VUKQotCi1zdGF0aWMgdm9pZCByZWFsdmlld19mbGFzaF9zZXRfdnBwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCBvbikKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gX19yYXdfcmVhZGwoUkVBTFZJRVdfRkxBU0hDVFJMKTsKLQlpZiAob24pCi0JCXZhbCB8PSBSRUFMVklFV19GTEFTSFBST0dfRkxWUFBFTjsKLQllbHNlCi0JCXZhbCAmPSB+UkVBTFZJRVdfRkxBU0hQUk9HX0ZMVlBQRU47Ci0JX19yYXdfd3JpdGVsKHZhbCwgUkVBTFZJRVdfRkxBU0hDVFJMKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgcmVhbHZpZXdfZmxhc2hfZGF0YSA9IHsKLQkud2lkdGgJCQk9IDQsCi0JLnNldF92cHAJCT0gcmVhbHZpZXdfZmxhc2hfc2V0X3ZwcCwKLX07Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcmVhbHZpZXdfZmxhc2hfZGV2aWNlID0gewotCS5uYW1lCQkJPSAicGh5c21hcC1mbGFzaCIsCi0JLmlkCQkJPSAwLAotCS5kZXYJCQk9IHsKLQkJLnBsYXRmb3JtX2RhdGEJPSAmcmVhbHZpZXdfZmxhc2hfZGF0YSwKLQl9LAotfTsKLQotaW50IHJlYWx2aWV3X2ZsYXNoX3JlZ2lzdGVyKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1MzIgbnVtKQotewotCXJlYWx2aWV3X2ZsYXNoX2RldmljZS5yZXNvdXJjZSA9IHJlczsKLQlyZWFsdmlld19mbGFzaF9kZXZpY2UubnVtX3Jlc291cmNlcyA9IG51bTsKLQlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyZWFsdmlld19mbGFzaF9kZXZpY2UpOwotfQotCi1zdGF0aWMgc3RydWN0IHNtc2M5MTF4X3BsYXRmb3JtX2NvbmZpZyBzbXNjOTExeF9jb25maWcgPSB7Ci0JLmZsYWdzCQk9IFNNU0M5MTFYX1VTRV8zMkJJVCwKLQkuaXJxX3BvbGFyaXR5CT0gU01TQzkxMVhfSVJRX1BPTEFSSVRZX0FDVElWRV9ISUdILAotCS5pcnFfdHlwZQk9IFNNU0M5MTFYX0lSUV9UWVBFX1BVU0hfUFVMTCwKLQkucGh5X2ludGVyZmFjZQk9IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUksCi19OwotCi1zdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBzbWM5MXhfcGxhdGRhdGEgPSB7Ci0JLmZsYWdzID0gU01DOTFYX1VTRV8zMkJJVCB8IFNNQzkxWF9OT1dBSVQsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19ldGhfZGV2aWNlID0gewotCS5uYW1lCQk9ICJzbXNjOTExeCIsCi0JLmlkCQk9IDAsCi0JLm51bV9yZXNvdXJjZXMJPSAyLAotfTsKLQotaW50IHJlYWx2aWV3X2V0aF9yZWdpc3Rlcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKLXsKLQlpZiAobmFtZSkKLQkJcmVhbHZpZXdfZXRoX2RldmljZS5uYW1lID0gbmFtZTsKLQlyZWFsdmlld19ldGhfZGV2aWNlLnJlc291cmNlID0gcmVzOwotCWlmIChzdHJjbXAocmVhbHZpZXdfZXRoX2RldmljZS5uYW1lLCAic21zYzkxMXgiKSA9PSAwKQotCQlyZWFsdmlld19ldGhfZGV2aWNlLmRldi5wbGF0Zm9ybV9kYXRhID0gJnNtc2M5MTF4X2NvbmZpZzsKLQllbHNlCi0JCXJlYWx2aWV3X2V0aF9kZXZpY2UuZGV2LnBsYXRmb3JtX2RhdGEgPSAmc21jOTF4X3BsYXRkYXRhOwotCi0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfZXRoX2RldmljZSk7Ci19Ci0KLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcmVhbHZpZXdfdXNiX2RldmljZSA9IHsKLQkubmFtZQkJCT0gImlzcDE3NjAiLAotCS5udW1fcmVzb3VyY2VzCQk9IDIsCi19OwotCi1pbnQgcmVhbHZpZXdfdXNiX3JlZ2lzdGVyKHN0cnVjdCByZXNvdXJjZSAqcmVzKQotewotCXJlYWx2aWV3X3VzYl9kZXZpY2UucmVzb3VyY2UgPSByZXM7Ci0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfdXNiX2RldmljZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGF0YV9wbGF0Zm9ybV9pbmZvIHBhdGFfcGxhdGZvcm1fZGF0YSA9IHsKLQkuaW9wb3J0X3NoaWZ0CQk9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHBhdGFfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJCT0gUkVBTFZJRVdfQ0ZfQkFTRSwKLQkJLmVuZAkJPSBSRUFMVklFV19DRl9CQVNFICsgMHhmZiwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJCT0gUkVBTFZJRVdfQ0ZfQkFTRSArIDB4MTAwLAotCQkuZW5kCQk9IFJFQUxWSUVXX0NGX0JBU0UgKyBTWl80SyAtIDEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19jZl9kZXZpY2UgPSB7Ci0JLm5hbWUJCQk9ICJwYXRhX3BsYXRmb3JtIiwKLQkuaWQJCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUocGF0YV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQkJPSBwYXRhX3Jlc291cmNlcywKLQkuZGV2CQkJPSB7Ci0JCS5wbGF0Zm9ybV9kYXRhCT0gJnBhdGFfcGxhdGZvcm1fZGF0YSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSByZWFsdmlld19sZWRzX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0CT0gUkVBTFZJRVdfU1lTX0JBU0UgKyBSRUFMVklFV19TWVNfTEVEX09GRlNFVCwKLQkJLmVuZAk9IFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX0xFRF9PRkZTRVQgKyA0LAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19sZWRzX2RldmljZSA9IHsKLQkubmFtZQkJPSAidmVyc2F0aWxlLWxlZHMiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocmVhbHZpZXdfbGVkc19yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQk9IHJlYWx2aWV3X2xlZHNfcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSByZWFsdmlld19pMmNfcmVzb3VyY2UgPSB7Ci0JLnN0YXJ0CQk9IFJFQUxWSUVXX0kyQ19CQVNFLAotCS5lbmQJCT0gUkVBTFZJRVdfSTJDX0JBU0UgKyBTWl80SyAtIDEsCi0JLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19pMmNfZGV2aWNlID0gewotCS5uYW1lCQk9ICJ2ZXJzYXRpbGUtaTJjIiwKLQkuaWQJCT0gMCwKLQkubnVtX3Jlc291cmNlcwk9IDEsCi0JLnJlc291cmNlCT0gJnJlYWx2aWV3X2kyY19yZXNvdXJjZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gcmVhbHZpZXdfaTJjX2JvYXJkX2luZm9bXSA9IHsKLQl7Ci0JCUkyQ19CT0FSRF9JTkZPKCJkczEzMzgiLCAweGQwID4+IDEpLAotCX0sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCByZWFsdmlld19pMmNfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfcmVnaXN0ZXJfYm9hcmRfaW5mbygwLCByZWFsdmlld19pMmNfYm9hcmRfaW5mbywKLQkJCQkgICAgICAgQVJSQVlfU0laRShyZWFsdmlld19pMmNfYm9hcmRfaW5mbykpOwotfQotYXJjaF9pbml0Y2FsbChyZWFsdmlld19pMmNfaW5pdCk7Ci0KLSNkZWZpbmUgUkVBTFZJRVdfU1lTTUNJCShfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0JBU0UpICsgUkVBTFZJRVdfU1lTX01DSV9PRkZTRVQpCi0KLS8qCi0gKiBUaGlzIGlzIG9ubHkgdXNlZCBpZiBHUElPTElCIHN1cHBvcnQgaXMgZGlzYWJsZWQKLSAqLwotc3RhdGljIHVuc2lnbmVkIGludCByZWFsdmlld19tbWNfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgYW1iYV9kZXZpY2UsIGRldik7Ci0JdTMyIG1hc2s7Ci0KLQlpZiAobWFjaGluZV9pc19yZWFsdmlld19wYjExNzYoKSkgewotCQlzdGF0aWMgYm9vbCBpbnNlcnRlZCA9IGZhbHNlOwotCi0JCS8qCi0JCSAqIFRoZSBQQjExNzYgZG9lcyBub3QgaGF2ZSB0aGUgc3RhdHVzIHJlZ2lzdGVyLAotCQkgKiBhc3N1bWUgaXQgaXMgaW5zZXJ0ZWQgYXQgc3RhcnR1cCwgdGhlbiBpbnZlcnQKLQkJICogZm9yIGVhY2ggY2FsbCBzbyBjYXJkIGluc2VydGlvbi9yZW1vdmFsIHdpbGwKLQkJICogYmUgZGV0ZWN0ZWQgYW55d2F5LiBUaGlzIHdpbGwgbm90IGJlIGNhbGxlZCBpZgotCQkgKiBHUElPIG9uIFBMMDYxIGlzIGFjdGl2ZSwgd2hpY2ggaXMgdGhlIHByb3BlcgotCQkgKiB3YXkgdG8gZG8gdGhpcyBvbiB0aGUgUEIxMTc2LgotCQkgKi8KLQkJaW5zZXJ0ZWQgPSAhaW5zZXJ0ZWQ7Ci0JCXJldHVybiBpbnNlcnRlZCA/IDAgOiAxOwotCX0KLQotCWlmIChhZGV2LT5yZXMuc3RhcnQgPT0gUkVBTFZJRVdfTU1DSTBfQkFTRSkKLQkJbWFzayA9IDE7Ci0JZWxzZQotCQltYXNrID0gMjsKLQotCXJldHVybiByZWFkbChSRUFMVklFV19TWVNNQ0kpICYgbWFzazsKLX0KLQotc3RydWN0IG1tY2lfcGxhdGZvcm1fZGF0YSByZWFsdmlld19tbWMwX3BsYXRfZGF0YSA9IHsKLQkub2NyX21hc2sJPSBNTUNfVkREXzMyXzMzfE1NQ19WRERfMzNfMzQsCi0JLnN0YXR1cwkJPSByZWFsdmlld19tbWNfc3RhdHVzLAotCS5ncGlvX3dwCT0gMTcsCi0JLmdwaW9fY2QJPSAxNiwKLQkuY2RfaW52ZXJ0CT0gdHJ1ZSwKLX07Ci0KLXN0cnVjdCBtbWNpX3BsYXRmb3JtX2RhdGEgcmVhbHZpZXdfbW1jMV9wbGF0X2RhdGEgPSB7Ci0JLm9jcl9tYXNrCT0gTU1DX1ZERF8zMl8zM3xNTUNfVkREXzMzXzM0LAotCS5zdGF0dXMJCT0gcmVhbHZpZXdfbW1jX3N0YXR1cywKLQkuZ3Bpb193cAk9IDE5LAotCS5ncGlvX2NkCT0gMTgsCi0JLmNkX2ludmVydAk9IHRydWUsCi19OwotCi12b2lkIF9faW5pdCByZWFsdmlld19pbml0X2Vhcmx5KHZvaWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpzeXMgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0JBU0UpOwotCi0JdmVyc2F0aWxlX3NjaGVkX2Nsb2NrX2luaXQoc3lzICsgUkVBTFZJRVdfU1lTXzI0TUh6X09GRlNFVCwgMjQwMDAwMDApOwotfQotCi0vKgotICogQ0xDRCBzdXBwb3J0LgotICovCi0jZGVmaW5lIFNZU19DTENEX05MQ0RJT09OCSgxIDw8IDIpCi0jZGVmaW5lIFNZU19DTENEX1ZERFBPU1NXSVRDSAkoMSA8PCAzKQotI2RlZmluZSBTWVNfQ0xDRF9QV1IzVjVTV0lUQ0gJKDEgPDwgNCkKLSNkZWZpbmUgU1lTX0NMQ0RfSURfTUFTSwkoMHgxZiA8PCA4KQotI2RlZmluZSBTWVNfQ0xDRF9JRF9TQU5ZT18zXzgJKDB4MDAgPDwgOCkKLSNkZWZpbmUgU1lTX0NMQ0RfSURfVU5LTk9XTl84XzQJKDB4MDEgPDwgOCkKLSNkZWZpbmUgU1lTX0NMQ0RfSURfRVBTT05fMl8yCSgweDAyIDw8IDgpCi0jZGVmaW5lIFNZU19DTENEX0lEX1NBTllPXzJfNQkoMHgwNyA8PCA4KQotI2RlZmluZSBTWVNfQ0xDRF9JRF9WR0EJCSgweDFmIDw8IDgpCi0KLS8qCi0gKiBEaXNhYmxlIGFsbCBkaXNwbGF5IGNvbm5lY3RvcnMgb24gdGhlIGludGVyZmFjZSBtb2R1bGUuCi0gKi8KLXN0YXRpYyB2b2lkIHJlYWx2aWV3X2NsY2RfZGlzYWJsZShzdHJ1Y3QgY2xjZF9mYiAqZmIpCi17Ci0Jdm9pZCBfX2lvbWVtICpzeXNfY2xjZCA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfQkFTRSkgKyBSRUFMVklFV19TWVNfQ0xDRF9PRkZTRVQ7Ci0JdTMyIHZhbDsKLQotCXZhbCA9IHJlYWRsKHN5c19jbGNkKTsKLQl2YWwgJj0gflNZU19DTENEX05MQ0RJT09OIHwgU1lTX0NMQ0RfUFdSM1Y1U1dJVENIOwotCXdyaXRlbCh2YWwsIHN5c19jbGNkKTsKLX0KLQotLyoKLSAqIEVuYWJsZSB0aGUgcmVsZXZhbnQgY29ubmVjdG9yIG9uIHRoZSBpbnRlcmZhY2UgbW9kdWxlLgotICovCi1zdGF0aWMgdm9pZCByZWFsdmlld19jbGNkX2VuYWJsZShzdHJ1Y3QgY2xjZF9mYiAqZmIpCi17Ci0Jdm9pZCBfX2lvbWVtICpzeXNfY2xjZCA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfQkFTRSkgKyBSRUFMVklFV19TWVNfQ0xDRF9PRkZTRVQ7Ci0JdTMyIHZhbDsKLQotCS8qCi0JICogRW5hYmxlIHRoZSBQU1VzCi0JICovCi0JdmFsID0gcmVhZGwoc3lzX2NsY2QpOwotCXZhbCB8PSBTWVNfQ0xDRF9OTENESU9PTiB8IFNZU19DTENEX1BXUjNWNVNXSVRDSDsKLQl3cml0ZWwodmFsLCBzeXNfY2xjZCk7Ci19Ci0KLS8qCi0gKiBEZXRlY3Qgd2hpY2ggTENEIHBhbmVsIGlzIGNvbm5lY3RlZCwgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUKLSAqIGNsY2RfcGFuZWwgc3RydWN0dXJlLiAgTm90ZTogd2UgZG8gbm90IGhhdmUgYW55IGluZm9ybWF0aW9uIG9uCi0gKiB0aGUgcmVxdWlyZWQgdGltaW5ncyBmb3IgdGhlIDguNGluIHBhbmVsLCBzbyB3ZSBwcmVzZW50bHkgYXNzdW1lCi0gKiBWR0EgdGltaW5ncy4KLSAqLwotc3RhdGljIGludCByZWFsdmlld19jbGNkX3NldHVwKHN0cnVjdCBjbGNkX2ZiICpmYikKLXsKLQl2b2lkIF9faW9tZW0gKnN5c19jbGNkID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19CQVNFKSArIFJFQUxWSUVXX1NZU19DTENEX09GRlNFVDsKLQljb25zdCBjaGFyICpwYW5lbF9uYW1lLCAqdmdhX3BhbmVsX25hbWU7Ci0JdW5zaWduZWQgbG9uZyBmcmFtZXNpemU7Ci0JdTMyIHZhbDsKLQotCWlmIChtYWNoaW5lX2lzX3JlYWx2aWV3X2ViKCkpIHsKLQkJLyogVkdBLCAxNmJwcCAqLwotCQlmcmFtZXNpemUgPSA2NDAgKiA0ODAgKiAyOwotCQl2Z2FfcGFuZWxfbmFtZSA9ICJWR0EiOwotCX0gZWxzZSB7Ci0JCS8qIFhWR0EsIDE2YnBwICovCi0JCWZyYW1lc2l6ZSA9IDEwMjQgKiA3NjggKiAyOwotCQl2Z2FfcGFuZWxfbmFtZSA9ICJYVkdBIjsKLQl9Ci0KLQl2YWwgPSByZWFkbChzeXNfY2xjZCkgJiBTWVNfQ0xDRF9JRF9NQVNLOwotCWlmICh2YWwgPT0gU1lTX0NMQ0RfSURfU0FOWU9fM184KQotCQlwYW5lbF9uYW1lID0gIlNhbnlvIFRNMzhRVjY3QTAyQSI7Ci0JZWxzZSBpZiAodmFsID09IFNZU19DTENEX0lEX1NBTllPXzJfNSkKLQkJcGFuZWxfbmFtZSA9ICJTYW55byBRVkdBIFBvcnRyYWl0IjsKLQllbHNlIGlmICh2YWwgPT0gU1lTX0NMQ0RfSURfRVBTT05fMl8yKQotCQlwYW5lbF9uYW1lID0gIkVwc29uIEwyRjUwMTEzVDAwIjsKLQllbHNlIGlmICh2YWwgPT0gU1lTX0NMQ0RfSURfVkdBKQotCQlwYW5lbF9uYW1lID0gdmdhX3BhbmVsX25hbWU7Ci0JZWxzZSB7Ci0JCXByX2VycigiQ0xDRDogdW5rbm93biBMQ0QgcGFuZWwgSUQgMHglMDh4LCB1c2luZyBWR0FcbiIsIHZhbCk7Ci0JCXBhbmVsX25hbWUgPSB2Z2FfcGFuZWxfbmFtZTsKLQl9Ci0KLQlmYi0+cGFuZWwgPSB2ZXJzYXRpbGVfY2xjZF9nZXRfcGFuZWwocGFuZWxfbmFtZSk7Ci0JaWYgKCFmYi0+cGFuZWwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIHZlcnNhdGlsZV9jbGNkX3NldHVwX2RtYShmYiwgZnJhbWVzaXplKTsKLX0KLQotc3RydWN0IGNsY2RfYm9hcmQgY2xjZF9wbGF0X2RhdGEgPSB7Ci0JLm5hbWUJCT0gIlJlYWxWaWV3IiwKLQkuY2FwcwkJPSBDTENEX0NBUF9BTEwsCi0JLmNoZWNrCQk9IGNsY2RmYl9jaGVjaywKLQkuZGVjb2RlCQk9IGNsY2RmYl9kZWNvZGUsCi0JLmRpc2FibGUJPSByZWFsdmlld19jbGNkX2Rpc2FibGUsCi0JLmVuYWJsZQkJPSByZWFsdmlld19jbGNkX2VuYWJsZSwKLQkuc2V0dXAJCT0gcmVhbHZpZXdfY2xjZF9zZXR1cCwKLQkubW1hcAkJPSB2ZXJzYXRpbGVfY2xjZF9tbWFwX2RtYSwKLQkucmVtb3ZlCQk9IHZlcnNhdGlsZV9jbGNkX3JlbW92ZV9kbWEsCi19OwotCi0vKgotICogV2hlcmUgaXMgdGhlIHRpbWVyIChWQSk/Ci0gKi8KLXZvaWQgX19pb21lbSAqdGltZXIwX3ZhX2Jhc2U7Ci12b2lkIF9faW9tZW0gKnRpbWVyMV92YV9iYXNlOwotdm9pZCBfX2lvbWVtICp0aW1lcjJfdmFfYmFzZTsKLXZvaWQgX19pb21lbSAqdGltZXIzX3ZhX2Jhc2U7Ci0KLS8qCi0gKiBTZXQgdXAgdGhlIGNsb2NrIHNvdXJjZSBhbmQgY2xvY2sgZXZlbnRzIGRldmljZXMKLSAqLwotdm9pZCBfX2luaXQgcmVhbHZpZXdfdGltZXJfaW5pdCh1bnNpZ25lZCBpbnQgdGltZXJfaXJxKQotewotCXUzMiB2YWw7Ci0KLQkvKiAKLQkgKiBzZXQgY2xvY2sgZnJlcXVlbmN5OiAKLQkgKglSRUFMVklFV19SRUZDTEsgaXMgMzJLSHoKLQkgKglSRUFMVklFV19USU1DTEsgaXMgMU1IegotCSAqLwotCXZhbCA9IHJlYWRsKF9faW9fYWRkcmVzcyhSRUFMVklFV19TQ1RMX0JBU0UpKTsKLQl3cml0ZWwoKFJFQUxWSUVXX1RJTUNMSyA8PCBSRUFMVklFV19USU1FUjFfRW5TZWwpIHwKLQkgICAgICAgKFJFQUxWSUVXX1RJTUNMSyA8PCBSRUFMVklFV19USU1FUjJfRW5TZWwpIHwgCi0JICAgICAgIChSRUFMVklFV19USU1DTEsgPDwgUkVBTFZJRVdfVElNRVIzX0VuU2VsKSB8Ci0JICAgICAgIChSRUFMVklFV19USU1DTEsgPDwgUkVBTFZJRVdfVElNRVI0X0VuU2VsKSB8IHZhbCwKLQkgICAgICAgX19pb19hZGRyZXNzKFJFQUxWSUVXX1NDVExfQkFTRSkpOwotCi0JLyoKLQkgKiBJbml0aWFsaXNlIHRvIGEga25vd24gc3RhdGUgKGFsbCB0aW1lcnMgb2ZmKQotCSAqLwotCXNwODA0X3RpbWVyX2Rpc2FibGUodGltZXIwX3ZhX2Jhc2UpOwotCXNwODA0X3RpbWVyX2Rpc2FibGUodGltZXIxX3ZhX2Jhc2UpOwotCXNwODA0X3RpbWVyX2Rpc2FibGUodGltZXIyX3ZhX2Jhc2UpOwotCXNwODA0X3RpbWVyX2Rpc2FibGUodGltZXIzX3ZhX2Jhc2UpOwotCi0Jc3A4MDRfY2xvY2tzb3VyY2VfaW5pdCh0aW1lcjNfdmFfYmFzZSwgInRpbWVyMyIpOwotCXNwODA0X2Nsb2NrZXZlbnRzX2luaXQodGltZXIwX3ZhX2Jhc2UsIHRpbWVyX2lycSwgInRpbWVyMCIpOwotfQotCi0vKgotICogU2V0dXAgdGhlIG1lbW9yeSBiYW5rcy4KLSAqLwotdm9pZCByZWFsdmlld19maXh1cChzdHJ1Y3QgdGFnICp0YWdzLCBjaGFyICoqZnJvbSkKLXsKLQkvKgotCSAqIE1vc3QgUmVhbFZpZXcgcGxhdGZvcm1zIGhhdmUgNTEyTUIgY29udGlndW91cyBSQU0gYXQgMHg3MDAwMDAwMC4KLQkgKiBIYWxmIG9mIHRoaXMgaXMgbWlycm9yZWQgYXQgMC4KLQkgKi8KLSNpZmRlZiBDT05GSUdfUkVBTFZJRVdfSElHSF9QSFlTX09GRlNFVAotCW1lbWJsb2NrX2FkZCgweDcwMDAwMDAwLCBTWl81MTJNKTsKLSNlbHNlCi0JbWVtYmxvY2tfYWRkKDAsIFNaXzI1Nk0pOwotI2VuZGlmCi19CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2NvcmUuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWE5OTVlLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQgQVJNIExpbWl0ZWQKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2lmbmRlZiBfX0FTTV9BUkNIX1JFQUxWSUVXX0gKLSNkZWZpbmUgX19BU01fQVJDSF9SRUFMVklFV19ICi0KLSNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLQotI2RlZmluZSBBUEJfREVWSUNFKG5hbWUsIGJ1c2lkLCBiYXNlLCBwbGF0KQkJCVwKLXN0YXRpYyBBTUJBX0FQQl9ERVZJQ0UobmFtZSwgYnVzaWQsIDAsIFJFQUxWSUVXXyMjYmFzZSMjX0JBU0UsIGJhc2UjI19JUlEsIHBsYXQpCi0KLSNkZWZpbmUgQUhCX0RFVklDRShuYW1lLCBidXNpZCwgYmFzZSwgcGxhdCkJCQlcCi1zdGF0aWMgQU1CQV9BSEJfREVWSUNFKG5hbWUsIGJ1c2lkLCAwLCBSRUFMVklFV18jI2Jhc2UjI19CQVNFLCBiYXNlIyNfSVJRLCBwbGF0KQotCi1zdHJ1Y3QgbWFjaGluZV9kZXNjOwotCi1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19mbGFzaF9kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19jZl9kZXZpY2U7Ci1leHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSByZWFsdmlld19sZWRzX2RldmljZTsKLWV4dGVybiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHJlYWx2aWV3X2kyY19kZXZpY2U7Ci1leHRlcm4gc3RydWN0IG1tY2lfcGxhdGZvcm1fZGF0YSByZWFsdmlld19tbWMwX3BsYXRfZGF0YTsKLWV4dGVybiBzdHJ1Y3QgbW1jaV9wbGF0Zm9ybV9kYXRhIHJlYWx2aWV3X21tYzFfcGxhdF9kYXRhOwotZXh0ZXJuIHN0cnVjdCBjbGNkX2JvYXJkIGNsY2RfcGxhdF9kYXRhOwotZXh0ZXJuIHZvaWQgX19pb21lbSAqdGltZXIwX3ZhX2Jhc2U7Ci1leHRlcm4gdm9pZCBfX2lvbWVtICp0aW1lcjFfdmFfYmFzZTsKLWV4dGVybiB2b2lkIF9faW9tZW0gKnRpbWVyMl92YV9iYXNlOwotZXh0ZXJuIHZvaWQgX19pb21lbSAqdGltZXIzX3ZhX2Jhc2U7Ci0KLWV4dGVybiB2b2lkIHJlYWx2aWV3X3RpbWVyX2luaXQodW5zaWduZWQgaW50IHRpbWVyX2lycSk7Ci1leHRlcm4gaW50IHJlYWx2aWV3X2ZsYXNoX3JlZ2lzdGVyKHN0cnVjdCByZXNvdXJjZSAqcmVzLCB1MzIgbnVtKTsKLWV4dGVybiBpbnQgcmVhbHZpZXdfZXRoX3JlZ2lzdGVyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKLWV4dGVybiBpbnQgcmVhbHZpZXdfdXNiX3JlZ2lzdGVyKHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKLWV4dGVybiB2b2lkIHJlYWx2aWV3X2luaXRfZWFybHkodm9pZCk7Ci1leHRlcm4gdm9pZCByZWFsdmlld19maXh1cChzdHJ1Y3QgdGFnICp0YWdzLCBjaGFyICoqZnJvbSk7Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3Qgc21wX29wZXJhdGlvbnMgcmVhbHZpZXdfc21wX29wczsKLWV4dGVybiB2b2lkIHJlYWx2aWV3X2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9oYXJkd2FyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTdhMjMwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaGFyZHdhcmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBoYXJkd2FyZSBkZWZpbml0aW9ucyBvZiB0aGUgUmVhbFZpZXcgYm9hcmRzLgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMgQVJNIExpbWl0ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0jaWZuZGVmIF9fQVNNX0FSQ0hfSEFSRFdBUkVfSAotI2RlZmluZSBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKLQotI2luY2x1ZGUgPGFzbS9zaXplcy5oPgotCi0vKiBtYWNybyB0byBnZXQgYXQgSU8gc3BhY2Ugd2hlbiBydW5uaW5nIHZpcnR1YWxseSAqLwotI2lmZGVmIENPTkZJR19NTVUKLS8qCi0gKiBTdGF0aWNhbGx5IG1hcHBlZCBhZGRyZXNzZXM6Ci0gKgotICogMTB4eCB4eHh4IC0+IGZieHggeHh4eAotICogMWV4eCB4eHh4IC0+IGZkeHggeHh4eAotICogMWZ4eCB4eHh4IC0+IGZleHggeHh4eAotICovCi0jZGVmaW5lIElPX0FERFJFU1MoeCkJCSgoKHgpICYgMHgwM2ZmZmZmZikgKyAweGZiMDAwMDAwKQotI2Vsc2UKLSNkZWZpbmUgSU9fQUREUkVTUyh4KQkJKHgpCi0jZW5kaWYKLSNkZWZpbmUgX19pb19hZGRyZXNzKG4pCQlJT01FTShJT19BRERSRVNTKG4pKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaG90cGx1Zy5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9ob3RwbHVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjZDdhNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaG90cGx1Zy5oCkBAIC0wLDAgKzEgQEAKK3ZvaWQgcmVhbHZpZXdfY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaXJxcy1lYi5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pcnFzLWViLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZTMxNjguLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pcnFzLWViLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBBUk0gTGltaXRlZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwKLSAqIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9JUlFTX0VCX0gKLSNkZWZpbmUgX19NQUNIX0lSUVNfRUJfSAotCi0jZGVmaW5lIElSUV9MT0NBTFRJTUVSCQkyOQotI2RlZmluZSBJUlFfRUJfR0lDX1NUQVJUCTMyCi0KLS8qCi0gKiBSZWFsVmlldyBFQiBpbnRlcnJ1cHQgc291cmNlcwotICovCi0jZGVmaW5lIElSUV9FQl9XRE9HCQkoSVJRX0VCX0dJQ19TVEFSVCArIDApCQkvKiBXYXRjaGRvZyB0aW1lciAqLwotI2RlZmluZSBJUlFfRUJfU09GVAkJKElSUV9FQl9HSUNfU1RBUlQgKyAxKQkJLyogU29mdHdhcmUgaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9FQl9DT01NUngJCShJUlFfRUJfR0lDX1NUQVJUICsgMikJCS8qIERlYnVnIENvbW0gUnggaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9FQl9DT01NVHgJCShJUlFfRUJfR0lDX1NUQVJUICsgMykJCS8qIERlYnVnIENvbW0gVHggaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9FQl9USU1FUjBfMQkJKElSUV9FQl9HSUNfU1RBUlQgKyA0KQkJLyogVGltZXIgMCBhbmQgMSAqLwotI2RlZmluZSBJUlFfRUJfVElNRVIyXzMJCShJUlFfRUJfR0lDX1NUQVJUICsgNSkJCS8qIFRpbWVyIDIgYW5kIDMgKi8KLSNkZWZpbmUgSVJRX0VCX0dQSU8wCQkoSVJRX0VCX0dJQ19TVEFSVCArIDYpCQkvKiBHUElPIDAgKi8KLSNkZWZpbmUgSVJRX0VCX0dQSU8xCQkoSVJRX0VCX0dJQ19TVEFSVCArIDcpCQkvKiBHUElPIDEgKi8KLSNkZWZpbmUgSVJRX0VCX0dQSU8yCQkoSVJRX0VCX0dJQ19TVEFSVCArIDgpCQkvKiBHUElPIDIgKi8KLQkJCQkJCQkJLyogOSByZXNlcnZlZCAqLwotI2RlZmluZSBJUlFfRUJfUlRDCQkoSVJRX0VCX0dJQ19TVEFSVCArIDEwKQkJLyogUmVhbCBUaW1lIENsb2NrICovCi0jZGVmaW5lIElSUV9FQl9TU1AJCShJUlFfRUJfR0lDX1NUQVJUICsgMTEpCQkvKiBTeW5jaHJvbm91cyBTZXJpYWwgUG9ydCAqLwotI2RlZmluZSBJUlFfRUJfVUFSVDAJCShJUlFfRUJfR0lDX1NUQVJUICsgMTIpCQkvKiBVQVJUIDAgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfRUJfVUFSVDEJCShJUlFfRUJfR0lDX1NUQVJUICsgMTMpCQkvKiBVQVJUIDEgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfRUJfVUFSVDIJCShJUlFfRUJfR0lDX1NUQVJUICsgMTQpCQkvKiBVQVJUIDIgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfRUJfVUFSVDMJCShJUlFfRUJfR0lDX1NUQVJUICsgMTUpCQkvKiBVQVJUIDMgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfRUJfU0NJCQkoSVJRX0VCX0dJQ19TVEFSVCArIDE2KQkJLyogU21hcnQgQ2FyZCBJbnRlcmZhY2UgKi8KLSNkZWZpbmUgSVJRX0VCX01NQ0kwQQkJKElSUV9FQl9HSUNfU1RBUlQgKyAxNykJCS8qIE11bHRpbWVkaWEgQ2FyZCAwQSAqLwotI2RlZmluZSBJUlFfRUJfTU1DSTBCCQkoSVJRX0VCX0dJQ19TVEFSVCArIDE4KQkJLyogTXVsdGltZWRpYSBDYXJkIDBCICovCi0jZGVmaW5lIElSUV9FQl9BQUNJCQkoSVJRX0VCX0dJQ19TVEFSVCArIDE5KQkJLyogQXVkaW8gQ29kZWMgKi8KLSNkZWZpbmUgSVJRX0VCX0tNSTAJCShJUlFfRUJfR0lDX1NUQVJUICsgMjApCQkvKiBLZXlib2FyZC9Nb3VzZSBwb3J0IDAgKi8KLSNkZWZpbmUgSVJRX0VCX0tNSTEJCShJUlFfRUJfR0lDX1NUQVJUICsgMjEpCQkvKiBLZXlib2FyZC9Nb3VzZSBwb3J0IDEgKi8KLSNkZWZpbmUgSVJRX0VCX0NIQVJMQ0QJCShJUlFfRUJfR0lDX1NUQVJUICsgMjIpCQkvKiBDaGFyYWN0ZXIgTENEICovCi0jZGVmaW5lIElSUV9FQl9DTENECQkoSVJRX0VCX0dJQ19TVEFSVCArIDIzKQkJLyogQ0xDRCBjb250cm9sbGVyICovCi0jZGVmaW5lIElSUV9FQl9ETUEJCShJUlFfRUJfR0lDX1NUQVJUICsgMjQpCQkvKiBETUEgY29udHJvbGxlciAqLwotI2RlZmluZSBJUlFfRUJfUFdSRkFJTAkJKElSUV9FQl9HSUNfU1RBUlQgKyAyNSkJCS8qIFBvd2VyIGZhaWx1cmUgKi8KLSNkZWZpbmUgSVJRX0VCX1BJU01PCQkoSVJRX0VCX0dJQ19TVEFSVCArIDI2KQkJLyogUElTTU8gaW50ZXJmYWNlICovCi0jZGVmaW5lIElSUV9FQl9Eb0MJCShJUlFfRUJfR0lDX1NUQVJUICsgMjcpCQkvKiBEaXNrIG9uIENoaXAgbWVtb3J5IGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSVJRX0VCX0VUSAkJKElSUV9FQl9HSUNfU1RBUlQgKyAyOCkJCS8qIEV0aGVybmV0IGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSVJRX0VCX1VTQgkJKElSUV9FQl9HSUNfU1RBUlQgKyAyOSkJCS8qIFVTQiBjb250cm9sbGVyICovCi0jZGVmaW5lIElSUV9FQl9UU1BFTgkJKElSUV9FQl9HSUNfU1RBUlQgKyAzMCkJCS8qIFRvdWNoc2NyZWVuIHBlbiAqLwotI2RlZmluZSBJUlFfRUJfVFNLUEFECQkoSVJRX0VCX0dJQ19TVEFSVCArIDMxKQkJLyogVG91Y2hzY3JlZW4ga2V5cGFkICovCi0KLS8qCi0gKiBSZWFsVmlldyBFQiArIEFSTTExTVBDb3JlIGludGVycnVwdCBzb3VyY2VzIChwcmltYXJ5IEdJQyBvbiB0aGUgY29yZSB0aWxlKQotICovCi0jZGVmaW5lIElSUV9FQjExTVBfQUFDSQkJKElSUV9FQl9HSUNfU1RBUlQgKyAwKQotI2RlZmluZSBJUlFfRUIxMU1QX1RJTUVSMF8xCShJUlFfRUJfR0lDX1NUQVJUICsgMSkKLSNkZWZpbmUgSVJRX0VCMTFNUF9USU1FUjJfMwkoSVJRX0VCX0dJQ19TVEFSVCArIDIpCi0jZGVmaW5lIElSUV9FQjExTVBfVVNCCQkoSVJRX0VCX0dJQ19TVEFSVCArIDMpCi0jZGVmaW5lIElSUV9FQjExTVBfVUFSVDAJKElSUV9FQl9HSUNfU1RBUlQgKyA0KQotI2RlZmluZSBJUlFfRUIxMU1QX1VBUlQxCShJUlFfRUJfR0lDX1NUQVJUICsgNSkKLSNkZWZpbmUgSVJRX0VCMTFNUF9SVEMJCShJUlFfRUJfR0lDX1NUQVJUICsgNikKLSNkZWZpbmUgSVJRX0VCMTFNUF9LTUkwCQkoSVJRX0VCX0dJQ19TVEFSVCArIDcpCi0jZGVmaW5lIElSUV9FQjExTVBfS01JMQkJKElSUV9FQl9HSUNfU1RBUlQgKyA4KQotI2RlZmluZSBJUlFfRUIxMU1QX0VUSAkJKElSUV9FQl9HSUNfU1RBUlQgKyA5KQotI2RlZmluZSBJUlFfRUIxMU1QX0VCX0lSUTEJKElSUV9FQl9HSUNfU1RBUlQgKyAxMCkJCS8qIG1haW4gR0lDICovCi0jZGVmaW5lIElSUV9FQjExTVBfRUJfSVJRMgkoSVJRX0VCX0dJQ19TVEFSVCArIDExKQkJLyogdGlsZSBHSUMgKi8KLSNkZWZpbmUgSVJRX0VCMTFNUF9FQl9GSVExCShJUlFfRUJfR0lDX1NUQVJUICsgMTIpCQkvKiBtYWluIEdJQyAqLwotI2RlZmluZSBJUlFfRUIxMU1QX0VCX0ZJUTIJKElSUV9FQl9HSUNfU1RBUlQgKyAxMykJCS8qIHRpbGUgR0lDICovCi0jZGVmaW5lIElSUV9FQjExTVBfTU1DSTBBCShJUlFfRUJfR0lDX1NUQVJUICsgMTQpCi0jZGVmaW5lIElSUV9FQjExTVBfTU1DSTBCCShJUlFfRUJfR0lDX1NUQVJUICsgMTUpCi0KLSNkZWZpbmUgSVJRX0VCMTFNUF9QTVVfQ1BVMAkoSVJRX0VCX0dJQ19TVEFSVCArIDE3KQotI2RlZmluZSBJUlFfRUIxMU1QX1BNVV9DUFUxCShJUlFfRUJfR0lDX1NUQVJUICsgMTgpCi0jZGVmaW5lIElSUV9FQjExTVBfUE1VX0NQVTIJKElSUV9FQl9HSUNfU1RBUlQgKyAxOSkKLSNkZWZpbmUgSVJRX0VCMTFNUF9QTVVfQ1BVMwkoSVJRX0VCX0dJQ19TVEFSVCArIDIwKQotI2RlZmluZSBJUlFfRUIxMU1QX1BNVV9TQ1UwCShJUlFfRUJfR0lDX1NUQVJUICsgMjEpCi0jZGVmaW5lIElSUV9FQjExTVBfUE1VX1NDVTEJKElSUV9FQl9HSUNfU1RBUlQgKyAyMikKLSNkZWZpbmUgSVJRX0VCMTFNUF9QTVVfU0NVMgkoSVJRX0VCX0dJQ19TVEFSVCArIDIzKQotI2RlZmluZSBJUlFfRUIxMU1QX1BNVV9TQ1UzCShJUlFfRUJfR0lDX1NUQVJUICsgMjQpCi0jZGVmaW5lIElSUV9FQjExTVBfUE1VX1NDVTQJKElSUV9FQl9HSUNfU1RBUlQgKyAyNSkKLSNkZWZpbmUgSVJRX0VCMTFNUF9QTVVfU0NVNQkoSVJRX0VCX0dJQ19TVEFSVCArIDI2KQotI2RlZmluZSBJUlFfRUIxMU1QX1BNVV9TQ1U2CShJUlFfRUJfR0lDX1NUQVJUICsgMjcpCi0jZGVmaW5lIElSUV9FQjExTVBfUE1VX1NDVTcJKElSUV9FQl9HSUNfU1RBUlQgKyAyOCkKLQotI2RlZmluZSBJUlFfRUIxMU1QX0wyMjBfRVZFTlQJKElSUV9FQl9HSUNfU1RBUlQgKyAyOSkKLSNkZWZpbmUgSVJRX0VCMTFNUF9MMjIwX1NMQVZFCShJUlFfRUJfR0lDX1NUQVJUICsgMzApCi0jZGVmaW5lIElSUV9FQjExTVBfTDIyMF9ERUNPREUJKElSUV9FQl9HSUNfU1RBUlQgKyAzMSkKLQotLyoKLSAqIFRoZSAxMU1QY29yZSB0aWxlIGxlYXZlcyB0aGUgZm9sbG93aW5nIHVuY29ubmVjdGVkLgotICovCi0jZGVmaW5lIElSUV9FQjExTVBfVUFSVDIJMAotI2RlZmluZSBJUlFfRUIxMU1QX1VBUlQzCTAKLSNkZWZpbmUgSVJRX0VCMTFNUF9DTENECQkwCi0jZGVmaW5lIElSUV9FQjExTVBfRE1BCQkwCi0jZGVmaW5lIElSUV9FQjExTVBfV0RPRwkJMAotI2RlZmluZSBJUlFfRUIxMU1QX0dQSU8wCTAKLSNkZWZpbmUgSVJRX0VCMTFNUF9HUElPMQkwCi0jZGVmaW5lIElSUV9FQjExTVBfR1BJTzIJMAotI2RlZmluZSBJUlFfRUIxMU1QX1NDSQkJMAotI2RlZmluZSBJUlFfRUIxMU1QX1NTUAkJMAotCi0jZGVmaW5lIE5SX0dJQ19FQjExTVAJCTIKLQotI2VuZGlmCS8qIF9fTUFDSF9JUlFTX0VCX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaXJxcy1wYjExNzYuaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaXJxcy1wYjExNzYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4ZWRmZC4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2lycXMtcGIxMTc2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEFSTSBMaW1pdGVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAotICogTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpZm5kZWYgX19NQUNIX0lSUVNfUEIxMTc2X0gKLSNkZWZpbmUgX19NQUNIX0lSUVNfUEIxMTc2X0gKLQotI2RlZmluZSBJUlFfREMxMTc2X0dJQ19TVEFSVAkJCTMyCi0jZGVmaW5lIElSUV9QQjExNzZfR0lDX1NUQVJUCQkJNjQKLQotLyoKLSAqIEFSTTExNzYgRGV2Q2hpcCBpbnRlcnJ1cHQgc291cmNlcyAocHJpbWFyeSBHSUMpCi0gKi8KLSNkZWZpbmUgSVJRX0RDMTE3Nl9XQVRDSERPRwkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAwKQkvKiBXYXRjaGRvZyB0aW1lciAqLwotI2RlZmluZSBJUlFfREMxMTc2X1NPRlRJTlQJKElSUV9EQzExNzZfR0lDX1NUQVJUICsgMSkJLyogU29mdHdhcmUgaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9EQzExNzZfQ09NTVJ4CShJUlFfREMxMTc2X0dJQ19TVEFSVCArIDIpCS8qIERlYnVnIENvbW0gUnggaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9EQzExNzZfQ09NTVR4CShJUlFfREMxMTc2X0dJQ19TVEFSVCArIDMpCS8qIERlYnVnIENvbW0gVHggaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9EQzExNzZfQ09SRV9QTVUJKElSUV9EQzExNzZfR0lDX1NUQVJUICsgNykJLyogQ29yZSBQTVUgaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9EQzExNzZfVElNRVIwCShJUlFfREMxMTc2X0dJQ19TVEFSVCArIDgpCS8qIFRpbWVyIDAgKi8KLSNkZWZpbmUgSVJRX0RDMTE3Nl9USU1FUjEJKElSUV9EQzExNzZfR0lDX1NUQVJUICsgOSkJLyogVGltZXIgMSAqLwotI2RlZmluZSBJUlFfREMxMTc2X1RJTUVSMgkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAxMCkJLyogVGltZXIgMiAqLwotI2RlZmluZSBJUlFfREMxMTc2X0FQQwkJKElSUV9EQzExNzZfR0lDX1NUQVJUICsgMTEpCi0jZGVmaW5lIElSUV9EQzExNzZfSUVDCQkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAxMikKLSNkZWZpbmUgSVJRX0RDMTE3Nl9MMkNDCQkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAxMykKLSNkZWZpbmUgSVJRX0RDMTE3Nl9SVEMJCShJUlFfREMxMTc2X0dJQ19TVEFSVCArIDE0KQotI2RlZmluZSBJUlFfREMxMTc2X0NMQ0QJCShJUlFfREMxMTc2X0dJQ19TVEFSVCArIDE1KQkvKiBDTENEIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSVJRX0RDMTE3Nl9HUElPMAkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAxNikKLSNkZWZpbmUgSVJRX0RDMTE3Nl9TU1AJCShJUlFfREMxMTc2X0dJQ19TVEFSVCArIDE3KQkvKiBTU1AgcG9ydCAqLwotI2RlZmluZSBJUlFfREMxMTc2X1VBUlQwCShJUlFfREMxMTc2X0dJQ19TVEFSVCArIDE4KQkvKiBVQVJUIDAgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfREMxMTc2X1VBUlQxCShJUlFfREMxMTc2X0dJQ19TVEFSVCArIDE5KQkvKiBVQVJUIDEgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfREMxMTc2X1VBUlQyCShJUlFfREMxMTc2X0dJQ19TVEFSVCArIDIwKQkvKiBVQVJUIDIgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfREMxMTc2X1VBUlQzCShJUlFfREMxMTc2X0dJQ19TVEFSVCArIDIxKQkvKiBVQVJUIDMgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotCi0jZGVmaW5lIElSUV9EQzExNzZfUEJfSVJRMgkoSVJRX0RDMTE3Nl9HSUNfU1RBUlQgKyAzMCkJLyogdGlsZSBHSUMgKi8KLSNkZWZpbmUgSVJRX0RDMTE3Nl9QQl9JUlExCShJUlFfREMxMTc2X0dJQ19TVEFSVCArIDMxKQkvKiBtYWluIEdJQyAqLwotCi0vKgotICogUmVhbFZpZXcgUEIxMTc2IGludGVycnVwdCBzb3VyY2VzIChzZWNvbmRhcnkgR0lDKQotICovCi0jZGVmaW5lIElSUV9QQjExNzZfTU1DSTBBCShJUlFfUEIxMTc2X0dJQ19TVEFSVCArIDEpCS8qIE11bHRpbWVkaWEgQ2FyZCAwQSAqLwotI2RlZmluZSBJUlFfUEIxMTc2X01NQ0kwQgkoSVJRX1BCMTE3Nl9HSUNfU1RBUlQgKyAyKQkvKiBNdWx0aW1lZGlhIENhcmQgMEEgKi8KLSNkZWZpbmUgSVJRX1BCMTE3Nl9LTUkwCQkoSVJRX1BCMTE3Nl9HSUNfU1RBUlQgKyAzKQkvKiBLZXlib2FyZC9Nb3VzZSBwb3J0IDAgKi8KLSNkZWZpbmUgSVJRX1BCMTE3Nl9LTUkxCQkoSVJRX1BCMTE3Nl9HSUNfU1RBUlQgKyA0KQkvKiBLZXlib2FyZC9Nb3VzZSBwb3J0IDEgKi8KLSNkZWZpbmUgSVJRX1BCMTE3Nl9TQ0kJCShJUlFfUEIxMTc2X0dJQ19TVEFSVCArIDUpCi0jZGVmaW5lIElSUV9QQjExNzZfVUFSVDQJKElSUV9QQjExNzZfR0lDX1NUQVJUICsgNikJLyogVUFSVCA0IG9uIGJhc2Vib2FyZCAqLwotI2RlZmluZSBJUlFfUEIxMTc2X0NIQVJMQ0QJKElSUV9QQjExNzZfR0lDX1NUQVJUICsgNykJLyogQ2hhcmFjdGVyIExDRCAqLwotI2RlZmluZSBJUlFfUEIxMTc2X0dQSU8xCShJUlFfUEIxMTc2X0dJQ19TVEFSVCArIDgpCi0jZGVmaW5lIElSUV9QQjExNzZfR1BJTzIJKElSUV9QQjExNzZfR0lDX1NUQVJUICsgOSkKLSNkZWZpbmUgSVJRX1BCMTE3Nl9FVEgJCShJUlFfUEIxMTc2X0dJQ19TVEFSVCArIDEwKQkvKiBFdGhlcm5ldCBjb250cm9sbGVyICovCi0jZGVmaW5lIElSUV9QQjExNzZfVVNCCQkoSVJRX1BCMTE3Nl9HSUNfU1RBUlQgKyAxMSkJLyogVVNCIGNvbnRyb2xsZXIgKi8KLQotI2RlZmluZSBJUlFfUEIxMTc2X1BJU01PCShJUlFfUEIxMTc2X0dJQ19TVEFSVCArIDE2KQotCi0jZGVmaW5lIElSUV9QQjExNzZfQUFDSQkJKElSUV9QQjExNzZfR0lDX1NUQVJUICsgMTkpCS8qIEF1ZGlvIENvZGVjICovCi0KLSNkZWZpbmUgSVJRX1BCMTE3Nl9USU1FUjBfMQkoSVJRX1BCMTE3Nl9HSUNfU1RBUlQgKyAyMikKLSNkZWZpbmUgSVJRX1BCMTE3Nl9USU1FUjJfMwkoSVJRX1BCMTE3Nl9HSUNfU1RBUlQgKyAyMykKLSNkZWZpbmUgSVJRX1BCMTE3Nl9ETUFDCQkoSVJRX1BCMTE3Nl9HSUNfU1RBUlQgKyAyNCkJLyogRE1BIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSVJRX1BCMTE3Nl9SVEMJCShJUlFfUEIxMTc2X0dJQ19TVEFSVCArIDI1KQkvKiBSZWFsIFRpbWUgQ2xvY2sgKi8KLQotI2RlZmluZSBJUlFfUEIxMTc2X1NDVEwJCS0xCi0KLSNlbmRpZgkvKiBfX01BQ0hfSVJRU19QQjExNzZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pcnFzLXBiMTFtcC5oIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9pcnFzLXBiMTFtcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzg4OThhLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaXJxcy1wYjExbXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggQVJNIExpbWl0ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sCi0gKiBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2lmbmRlZiBfX01BQ0hfSVJRU19QQjExTVBfSAotI2RlZmluZSBfX01BQ0hfSVJRU19QQjExTVBfSAotCi0jZGVmaW5lIElSUV9MT0NBTFRJTUVSCQkJCTI5Ci0jZGVmaW5lIElSUV9UQzExTVBfR0lDX1NUQVJUCQkJMzIKLSNkZWZpbmUgSVJRX1BCMTFNUF9HSUNfU1RBUlQJCQk2NAotCi0vKgotICogQVJNMTFNUENvcmUgdGVzdCBjaGlwIGludGVycnVwdCBzb3VyY2VzIChwcmltYXJ5IEdJQyBvbiB0aGUgdGVzdCBjaGlwKQotICovCi0jZGVmaW5lIElSUV9UQzExTVBfQUFDSQkJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMCkKLSNkZWZpbmUgSVJRX1RDMTFNUF9USU1FUjBfMQkoSVJRX1RDMTFNUF9HSUNfU1RBUlQgKyAxKQotI2RlZmluZSBJUlFfVEMxMU1QX1RJTUVSMl8zCShJUlFfVEMxMU1QX0dJQ19TVEFSVCArIDIpCi0jZGVmaW5lIElSUV9UQzExTVBfVVNCCQkoSVJRX1RDMTFNUF9HSUNfU1RBUlQgKyAzKQotI2RlZmluZSBJUlFfVEMxMU1QX1VBUlQwCShJUlFfVEMxMU1QX0dJQ19TVEFSVCArIDQpCi0jZGVmaW5lIElSUV9UQzExTVBfVUFSVDEJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgNSkKLSNkZWZpbmUgSVJRX1RDMTFNUF9SVEMJCShJUlFfVEMxMU1QX0dJQ19TVEFSVCArIDYpCi0jZGVmaW5lIElSUV9UQzExTVBfS01JMAkJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgNykKLSNkZWZpbmUgSVJRX1RDMTFNUF9LTUkxCQkoSVJRX1RDMTFNUF9HSUNfU1RBUlQgKyA4KQotI2RlZmluZSBJUlFfVEMxMU1QX0VUSAkJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgOSkKLSNkZWZpbmUgSVJRX1RDMTFNUF9QQl9JUlExCShJUlFfVEMxMU1QX0dJQ19TVEFSVCArIDEwKQkJLyogbWFpbiBHSUMgKi8KLSNkZWZpbmUgSVJRX1RDMTFNUF9QQl9JUlEyCShJUlFfVEMxMU1QX0dJQ19TVEFSVCArIDExKQkJLyogdGlsZSBHSUMgKi8KLSNkZWZpbmUgSVJRX1RDMTFNUF9QQl9GSVExCShJUlFfVEMxMU1QX0dJQ19TVEFSVCArIDEyKQkJLyogbWFpbiBHSUMgKi8KLSNkZWZpbmUgSVJRX1RDMTFNUF9QQl9GSVEyCShJUlFfVEMxMU1QX0dJQ19TVEFSVCArIDEzKQkJLyogdGlsZSBHSUMgKi8KLSNkZWZpbmUgSVJRX1RDMTFNUF9NTUNJMEEJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMTQpCi0jZGVmaW5lIElSUV9UQzExTVBfTU1DSTBCCShJUlFfVEMxMU1QX0dJQ19TVEFSVCArIDE1KQotCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX0NQVTAJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMTcpCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX0NQVTEJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMTgpCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX0NQVTIJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMTkpCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX0NQVTMJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMjApCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX1NDVTAJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMjEpCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX1NDVTEJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMjIpCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX1NDVTIJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMjMpCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX1NDVTMJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMjQpCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX1NDVTQJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMjUpCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX1NDVTUJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMjYpCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX1NDVTYJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMjcpCi0jZGVmaW5lIElSUV9UQzExTVBfUE1VX1NDVTcJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMjgpCi0KLSNkZWZpbmUgSVJRX1RDMTFNUF9MMjIwX0VWRU5UCShJUlFfVEMxMU1QX0dJQ19TVEFSVCArIDI5KQotI2RlZmluZSBJUlFfVEMxMU1QX0wyMjBfU0xBVkUJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMzApCi0jZGVmaW5lIElSUV9UQzExTVBfTDIyMF9ERUNPREUJKElSUV9UQzExTVBfR0lDX1NUQVJUICsgMzEpCi0KLS8qCi0gKiBSZWFsVmlldyBQQjExTVBDb3JlIEdJQyBpbnRlcnJ1cHQgc291cmNlcyAoc2Vjb25kYXJ5IEdJQyBvbiB0aGUgYm9hcmQpCi0gKi8KLSNkZWZpbmUgSVJRX1BCMTFNUF9XQVRDSERPRwkoSVJRX1BCMTFNUF9HSUNfU1RBUlQgKyAwKQkvKiBXYXRjaGRvZyB0aW1lciAqLwotI2RlZmluZSBJUlFfUEIxMU1QX1NPRlQJCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDEpCS8qIFNvZnR3YXJlIGludGVycnVwdCAqLwotI2RlZmluZSBJUlFfUEIxMU1QX0NPTU1SeAkoSVJRX1BCMTFNUF9HSUNfU1RBUlQgKyAyKQkvKiBEZWJ1ZyBDb21tIFJ4IGludGVycnVwdCAqLwotI2RlZmluZSBJUlFfUEIxMU1QX0NPTU1UeAkoSVJRX1BCMTFNUF9HSUNfU1RBUlQgKyAzKQkvKiBEZWJ1ZyBDb21tIFR4IGludGVycnVwdCAqLwotI2RlZmluZSBJUlFfUEIxMU1QX0dQSU8wCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDYpCS8qIEdQSU8gMCAqLwotI2RlZmluZSBJUlFfUEIxMU1QX0dQSU8xCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDcpCS8qIEdQSU8gMSAqLwotI2RlZmluZSBJUlFfUEIxMU1QX0dQSU8yCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDgpCS8qIEdQSU8gMiAqLwotCQkJCQkJCQkvKiA5IHJlc2VydmVkICovCi0jZGVmaW5lIElSUV9QQjExTVBfUlRDX0dJQzEJKElSUV9QQjExTVBfR0lDX1NUQVJUICsgMTApCS8qIFJlYWwgVGltZSBDbG9jayAqLwotI2RlZmluZSBJUlFfUEIxMU1QX1NTUAkJKElSUV9QQjExTVBfR0lDX1NUQVJUICsgMTEpCS8qIFN5bmNocm9ub3VzIFNlcmlhbCBQb3J0ICovCi0jZGVmaW5lIElSUV9QQjExTVBfVUFSVDBfR0lDMQkoSVJRX1BCMTFNUF9HSUNfU1RBUlQgKyAxMikJLyogVUFSVCAwIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KLSNkZWZpbmUgSVJRX1BCMTFNUF9VQVJUMV9HSUMxCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDEzKQkvKiBVQVJUIDEgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfUEIxMU1QX1VBUlQyCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDE0KQkvKiBVQVJUIDIgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfUEIxMU1QX1VBUlQzCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDE1KQkvKiBVQVJUIDMgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfUEIxMU1QX1NDSQkJKElSUV9QQjExTVBfR0lDX1NUQVJUICsgMTYpCS8qIFNtYXJ0IENhcmQgSW50ZXJmYWNlICovCi0jZGVmaW5lIElSUV9QQjExTVBfTU1DSTBBX0dJQzEJKElSUV9QQjExTVBfR0lDX1NUQVJUICsgMTcpCS8qIE11bHRpbWVkaWEgQ2FyZCAwQSAqLwotI2RlZmluZSBJUlFfUEIxMU1QX01NQ0kwQl9HSUMxCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDE4KQkvKiBNdWx0aW1lZGlhIENhcmQgMEIgKi8KLSNkZWZpbmUgSVJRX1BCMTFNUF9BQUNJX0dJQzEJKElSUV9QQjExTVBfR0lDX1NUQVJUICsgMTkpCS8qIEF1ZGlvIENvZGVjICovCi0jZGVmaW5lIElSUV9QQjExTVBfS01JMF9HSUMxCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDIwKQkvKiBLZXlib2FyZC9Nb3VzZSBwb3J0IDAgKi8KLSNkZWZpbmUgSVJRX1BCMTFNUF9LTUkxX0dJQzEJKElSUV9QQjExTVBfR0lDX1NUQVJUICsgMjEpCS8qIEtleWJvYXJkL01vdXNlIHBvcnQgMSAqLwotI2RlZmluZSBJUlFfUEIxMU1QX0NIQVJMQ0QJKElSUV9QQjExTVBfR0lDX1NUQVJUICsgMjIpCS8qIENoYXJhY3RlciBMQ0QgKi8KLSNkZWZpbmUgSVJRX1BCMTFNUF9DTENECQkoSVJRX1BCMTFNUF9HSUNfU1RBUlQgKyAyMykJLyogQ0xDRCBjb250cm9sbGVyICovCi0jZGVmaW5lIElSUV9QQjExTVBfRE1BQwkJKElSUV9QQjExTVBfR0lDX1NUQVJUICsgMjQpCS8qIERNQSBjb250cm9sbGVyICovCi0jZGVmaW5lIElSUV9QQjExTVBfUFdSRkFJTAkoSVJRX1BCMTFNUF9HSUNfU1RBUlQgKyAyNSkJLyogUG93ZXIgZmFpbHVyZSAqLwotI2RlZmluZSBJUlFfUEIxMU1QX1BJU01PCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDI2KQkvKiBQSVNNTyBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgSVJRX1BCMTFNUF9Eb0MJCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDI3KQkvKiBEaXNrIG9uIENoaXAgbWVtb3J5IGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSVJRX1BCMTFNUF9FVEhfR0lDMQkoSVJRX1BCMTFNUF9HSUNfU1RBUlQgKyAyOCkJLyogRXRoZXJuZXQgY29udHJvbGxlciAqLwotI2RlZmluZSBJUlFfUEIxMU1QX1VTQl9HSUMxCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDI5KQkvKiBVU0IgY29udHJvbGxlciAqLwotI2RlZmluZSBJUlFfUEIxMU1QX1RTUEVOCShJUlFfUEIxMU1QX0dJQ19TVEFSVCArIDMwKQkvKiBUb3VjaHNjcmVlbiBwZW4gKi8KLSNkZWZpbmUgSVJRX1BCMTFNUF9UU0tQQUQJKElSUV9QQjExTVBfR0lDX1NUQVJUICsgMzEpCS8qIFRvdWNoc2NyZWVuIGtleXBhZCAqLwotCi0jZW5kaWYJLyogX19NQUNIX0lSUVNfUEIxMU1QX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaXJxcy1wYmE4LmggYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2lycXMtcGJhOC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjJlMzIxLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaXJxcy1wYmE4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEFSTSBMaW1pdGVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAotICogTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpZm5kZWYgX19NQUNIX0lSUVNfUEJBOF9ICi0jZGVmaW5lIF9fTUFDSF9JUlFTX1BCQThfSAotCi0jZGVmaW5lIElSUV9QQkE4X0dJQ19TVEFSVAkJCTMyCi0KLS8qCi0gKiBQQi1BOCBvbi1ib2FyZCBnaWMgaXJxIHNvdXJjZXMKLSAqLwotI2RlZmluZSBJUlFfUEJBOF9XQVRDSERPRwkoSVJRX1BCQThfR0lDX1NUQVJUICsgMCkJLyogV2F0Y2hkb2cgdGltZXIgKi8KLSNkZWZpbmUgSVJRX1BCQThfU09GVAkJKElSUV9QQkE4X0dJQ19TVEFSVCArIDEpCS8qIFNvZnR3YXJlIGludGVycnVwdCAqLwotI2RlZmluZSBJUlFfUEJBOF9DT01NUngJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyKQkvKiBEZWJ1ZyBDb21tIFJ4IGludGVycnVwdCAqLwotI2RlZmluZSBJUlFfUEJBOF9DT01NVHgJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAzKQkvKiBEZWJ1ZyBDb21tIFR4IGludGVycnVwdCAqLwotI2RlZmluZSBJUlFfUEJBOF9USU1FUjBfMQkoSVJRX1BCQThfR0lDX1NUQVJUICsgNCkJLyogVGltZXIgMC8xIChkZWZhdWx0IHRpbWVyKSAqLwotI2RlZmluZSBJUlFfUEJBOF9USU1FUjJfMwkoSVJRX1BCQThfR0lDX1NUQVJUICsgNSkJLyogVGltZXIgMi8zICovCi0jZGVmaW5lIElSUV9QQkE4X0dQSU8wCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgNikJLyogR1BJTyAwICovCi0jZGVmaW5lIElSUV9QQkE4X0dQSU8xCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgNykJLyogR1BJTyAxICovCi0jZGVmaW5lIElSUV9QQkE4X0dQSU8yCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgOCkJLyogR1BJTyAyICovCi0JCQkJCQkJCS8qIDkgcmVzZXJ2ZWQgKi8KLSNkZWZpbmUgSVJRX1BCQThfUlRDCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMTApCS8qIFJlYWwgVGltZSBDbG9jayAqLwotI2RlZmluZSBJUlFfUEJBOF9TU1AJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAxMSkJLyogU3luY2hyb25vdXMgU2VyaWFsIFBvcnQgKi8KLSNkZWZpbmUgSVJRX1BCQThfVUFSVDAJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAxMikJLyogVUFSVCAwIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KLSNkZWZpbmUgSVJRX1BCQThfVUFSVDEJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAxMykJLyogVUFSVCAxIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KLSNkZWZpbmUgSVJRX1BCQThfVUFSVDIJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAxNCkJLyogVUFSVCAyIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KLSNkZWZpbmUgSVJRX1BCQThfVUFSVDMJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAxNSkJLyogVUFSVCAzIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KLSNkZWZpbmUgSVJRX1BCQThfU0NJCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMTYpCS8qIFNtYXJ0IENhcmQgSW50ZXJmYWNlICovCi0jZGVmaW5lIElSUV9QQkE4X01NQ0kwQQkJKElSUV9QQkE4X0dJQ19TVEFSVCArIDE3KQkvKiBNdWx0aW1lZGlhIENhcmQgMEEgKi8KLSNkZWZpbmUgSVJRX1BCQThfTU1DSTBCCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMTgpCS8qIE11bHRpbWVkaWEgQ2FyZCAwQiAqLwotI2RlZmluZSBJUlFfUEJBOF9BQUNJCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMTkpCS8qIEF1ZGlvIENvZGVjICovCi0jZGVmaW5lIElSUV9QQkE4X0tNSTAJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyMCkJLyogS2V5Ym9hcmQvTW91c2UgcG9ydCAwICovCi0jZGVmaW5lIElSUV9QQkE4X0tNSTEJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyMSkJLyogS2V5Ym9hcmQvTW91c2UgcG9ydCAxICovCi0jZGVmaW5lIElSUV9QQkE4X0NIQVJMQ0QJKElSUV9QQkE4X0dJQ19TVEFSVCArIDIyKQkvKiBDaGFyYWN0ZXIgTENEICovCi0jZGVmaW5lIElSUV9QQkE4X0NMQ0QJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyMykJLyogQ0xDRCBjb250cm9sbGVyICovCi0jZGVmaW5lIElSUV9QQkE4X0RNQUMJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyNCkJLyogRE1BIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSVJRX1BCQThfUFdSRkFJTAkoSVJRX1BCQThfR0lDX1NUQVJUICsgMjUpCS8qIFBvd2VyIGZhaWx1cmUgKi8KLSNkZWZpbmUgSVJRX1BCQThfUElTTU8JCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAyNikJLyogUElTTU8gaW50ZXJmYWNlICovCi0jZGVmaW5lIElSUV9QQkE4X0RvQwkJKElSUV9QQkE4X0dJQ19TVEFSVCArIDI3KQkvKiBEaXNrIG9uIENoaXAgbWVtb3J5IGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSVJRX1BCQThfRVRICQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMjgpCS8qIEV0aGVybmV0IGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSVJRX1BCQThfVVNCCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMjkpCS8qIFVTQiBjb250cm9sbGVyICovCi0jZGVmaW5lIElSUV9QQkE4X1RTUEVOCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgMzApCS8qIFRvdWNoc2NyZWVuIHBlbiAqLwotI2RlZmluZSBJUlFfUEJBOF9UU0tQQUQJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyAzMSkJLyogVG91Y2hzY3JlZW4ga2V5cGFkICovCi0KLSNkZWZpbmUgSVJRX1BCQThfUE1VCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgNDcpCS8qIENvcnRleC1BOCBQTVUgKi8KLQotLyogLi4uICovCi0jZGVmaW5lIElSUV9QQkE4X1BDSTAJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyA1MCkKLSNkZWZpbmUgSVJRX1BCQThfUENJMQkJKElSUV9QQkE4X0dJQ19TVEFSVCArIDUxKQotI2RlZmluZSBJUlFfUEJBOF9QQ0kyCQkoSVJRX1BCQThfR0lDX1NUQVJUICsgNTIpCi0jZGVmaW5lIElSUV9QQkE4X1BDSTMJCShJUlFfUEJBOF9HSUNfU1RBUlQgKyA1MykKLQotI2RlZmluZSBJUlFfUEJBOF9TTUMJCS0xCi0jZGVmaW5lIElSUV9QQkE4X1NDVEwJCS0xCi0KLSNlbmRpZgkvKiBfX01BQ0hfSVJRU19QQkE4X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaXJxcy1wYnguaCBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvaXJxcy1wYnguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmMDU2Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L2lycXMtcGJ4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEFSTSBMaW1pdGVkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9JUlFTX1BCWF9ICi0jZGVmaW5lIF9fTUFDSF9JUlFTX1BCWF9ICi0KLSNkZWZpbmUgSVJRX0xPQ0FMVElNRVIJCQkJMjkKLSNkZWZpbmUgSVJRX1BCWF9HSUNfU1RBUlQJCQkzMgotCi0vKgotICogUEJYIG9uLWJvYXJkIGdpYyBpcnEgc291cmNlcwotICovCi0jZGVmaW5lIElSUV9QQlhfV0FUQ0hET0cJKElSUV9QQlhfR0lDX1NUQVJUICsgMCkJLyogV2F0Y2hkb2cgdGltZXIgKi8KLSNkZWZpbmUgSVJRX1BCWF9TT0ZUCQkoSVJRX1BCWF9HSUNfU1RBUlQgKyAxKQkvKiBTb2Z0d2FyZSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRX1BCWF9DT01NUngJCShJUlFfUEJYX0dJQ19TVEFSVCArIDIpCS8qIERlYnVnIENvbW0gUnggaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9QQlhfQ09NTVR4CQkoSVJRX1BCWF9HSUNfU1RBUlQgKyAzKQkvKiBEZWJ1ZyBDb21tIFR4IGludGVycnVwdCAqLwotI2RlZmluZSBJUlFfUEJYX1RJTUVSMF8xCShJUlFfUEJYX0dJQ19TVEFSVCArIDQpCS8qIFRpbWVyIDAvMSAoZGVmYXVsdCB0aW1lcikgKi8KLSNkZWZpbmUgSVJRX1BCWF9USU1FUjJfMwkoSVJRX1BCWF9HSUNfU1RBUlQgKyA1KQkvKiBUaW1lciAyLzMgKi8KLSNkZWZpbmUgSVJRX1BCWF9HUElPMAkJKElSUV9QQlhfR0lDX1NUQVJUICsgNikJLyogR1BJTyAwICovCi0jZGVmaW5lIElSUV9QQlhfR1BJTzEJCShJUlFfUEJYX0dJQ19TVEFSVCArIDcpCS8qIEdQSU8gMSAqLwotI2RlZmluZSBJUlFfUEJYX0dQSU8yCQkoSVJRX1BCWF9HSUNfU1RBUlQgKyA4KQkvKiBHUElPIDIgKi8KLQkJCQkJCQkJLyogOSByZXNlcnZlZCAqLwotI2RlZmluZSBJUlFfUEJYX1JUQwkJKElSUV9QQlhfR0lDX1NUQVJUICsgMTApCS8qIFJlYWwgVGltZSBDbG9jayAqLwotI2RlZmluZSBJUlFfUEJYX1NTUAkJKElSUV9QQlhfR0lDX1NUQVJUICsgMTEpCS8qIFN5bmNocm9ub3VzIFNlcmlhbCBQb3J0ICovCi0jZGVmaW5lIElSUV9QQlhfVUFSVDAJCShJUlFfUEJYX0dJQ19TVEFSVCArIDEyKQkvKiBVQVJUIDAgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfUEJYX1VBUlQxCQkoSVJRX1BCWF9HSUNfU1RBUlQgKyAxMykJLyogVUFSVCAxIG9uIGRldmVsb3BtZW50IGNoaXAgKi8KLSNkZWZpbmUgSVJRX1BCWF9VQVJUMgkJKElSUV9QQlhfR0lDX1NUQVJUICsgMTQpCS8qIFVBUlQgMiBvbiBkZXZlbG9wbWVudCBjaGlwICovCi0jZGVmaW5lIElSUV9QQlhfVUFSVDMJCShJUlFfUEJYX0dJQ19TVEFSVCArIDE1KQkvKiBVQVJUIDMgb24gZGV2ZWxvcG1lbnQgY2hpcCAqLwotI2RlZmluZSBJUlFfUEJYX1NDSQkJKElSUV9QQlhfR0lDX1NUQVJUICsgMTYpCS8qIFNtYXJ0IENhcmQgSW50ZXJmYWNlICovCi0jZGVmaW5lIElSUV9QQlhfTU1DSTBBCQkoSVJRX1BCWF9HSUNfU1RBUlQgKyAxNykJLyogTXVsdGltZWRpYSBDYXJkIDBBICovCi0jZGVmaW5lIElSUV9QQlhfTU1DSTBCCQkoSVJRX1BCWF9HSUNfU1RBUlQgKyAxOCkJLyogTXVsdGltZWRpYSBDYXJkIDBCICovCi0jZGVmaW5lIElSUV9QQlhfQUFDSQkJKElSUV9QQlhfR0lDX1NUQVJUICsgMTkpCS8qIEF1ZGlvIENvZGVjICovCi0jZGVmaW5lIElSUV9QQlhfS01JMAkJKElSUV9QQlhfR0lDX1NUQVJUICsgMjApCS8qIEtleWJvYXJkL01vdXNlIHBvcnQgMCAqLwotI2RlZmluZSBJUlFfUEJYX0tNSTEJCShJUlFfUEJYX0dJQ19TVEFSVCArIDIxKQkvKiBLZXlib2FyZC9Nb3VzZSBwb3J0IDEgKi8KLSNkZWZpbmUgSVJRX1BCWF9DSEFSTENECQkoSVJRX1BCWF9HSUNfU1RBUlQgKyAyMikJLyogQ2hhcmFjdGVyIExDRCAqLwotI2RlZmluZSBJUlFfUEJYX0NMQ0QJCShJUlFfUEJYX0dJQ19TVEFSVCArIDIzKQkvKiBDTENEIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSVJRX1BCWF9ETUFDCQkoSVJRX1BCWF9HSUNfU1RBUlQgKyAyNCkJLyogRE1BIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgSVJRX1BCWF9QV1JGQUlMCQkoSVJRX1BCWF9HSUNfU1RBUlQgKyAyNSkJLyogUG93ZXIgZmFpbHVyZSAqLwotI2RlZmluZSBJUlFfUEJYX1BJU01PCQkoSVJRX1BCWF9HSUNfU1RBUlQgKyAyNikJLyogUElTTU8gaW50ZXJmYWNlICovCi0jZGVmaW5lIElSUV9QQlhfRG9DCQkoSVJRX1BCWF9HSUNfU1RBUlQgKyAyNykJLyogRGlzayBvbiBDaGlwIG1lbW9yeSBjb250cm9sbGVyICovCi0jZGVmaW5lIElSUV9QQlhfRVRICQkoSVJRX1BCWF9HSUNfU1RBUlQgKyAyOCkJLyogRXRoZXJuZXQgY29udHJvbGxlciAqLwotI2RlZmluZSBJUlFfUEJYX1VTQgkJKElSUV9QQlhfR0lDX1NUQVJUICsgMjkpCS8qIFVTQiBjb250cm9sbGVyICovCi0jZGVmaW5lIElSUV9QQlhfVFNQRU4JCShJUlFfUEJYX0dJQ19TVEFSVCArIDMwKQkvKiBUb3VjaHNjcmVlbiBwZW4gKi8KLSNkZWZpbmUgSVJRX1BCWF9UU0tQQUQJCShJUlFfUEJYX0dJQ19TVEFSVCArIDMxKQkvKiBUb3VjaHNjcmVlbiBrZXlwYWQgKi8KLQotI2RlZmluZSBJUlFfUEJYX1BNVV9TQ1UwICAgICAgICAoSVJRX1BCWF9HSUNfU1RBUlQgKyAzMikgICAgICAgIC8qIFNDVSBQTVUgSW50ZXJydXB0cyAoMTFtcCkgKi8KLSNkZWZpbmUgSVJRX1BCWF9QTVVfU0NVMSAgICAgICAgKElSUV9QQlhfR0lDX1NUQVJUICsgMzMpCi0jZGVmaW5lIElSUV9QQlhfUE1VX1NDVTIgICAgICAgIChJUlFfUEJYX0dJQ19TVEFSVCArIDM0KQotI2RlZmluZSBJUlFfUEJYX1BNVV9TQ1UzICAgICAgICAoSVJRX1BCWF9HSUNfU1RBUlQgKyAzNSkKLSNkZWZpbmUgSVJRX1BCWF9QTVVfU0NVNCAgICAgICAgKElSUV9QQlhfR0lDX1NUQVJUICsgMzYpCi0jZGVmaW5lIElSUV9QQlhfUE1VX1NDVTUgICAgICAgIChJUlFfUEJYX0dJQ19TVEFSVCArIDM3KQotI2RlZmluZSBJUlFfUEJYX1BNVV9TQ1U2ICAgICAgICAoSVJRX1BCWF9HSUNfU1RBUlQgKyAzOCkKLSNkZWZpbmUgSVJRX1BCWF9QTVVfU0NVNyAgICAgICAgKElSUV9QQlhfR0lDX1NUQVJUICsgMzkpCi0KLSNkZWZpbmUgSVJRX1BCWF9XQVRDSERPRzEgICAgICAgKElSUV9QQlhfR0lDX1NUQVJUICsgNDApICAgICAgICAvKiBXYXRjaGRvZzEgdGltZXIgKi8KLSNkZWZpbmUgSVJRX1BCWF9USU1FUjRfNSAgICAgICAgKElSUV9QQlhfR0lDX1NUQVJUICsgNDEpICAgICAgICAvKiBUaW1lciAwLzEgKGRlZmF1bHQgdGltZXIpICovCi0jZGVmaW5lIElSUV9QQlhfVElNRVI2XzcgICAgICAgIChJUlFfUEJYX0dJQ19TVEFSVCArIDQyKSAgICAgICAgLyogVGltZXIgMi8zICovCi0vKiAuLi4gKi8KLSNkZWZpbmUgSVJRX1BCWF9QTVVfQ1BVMCAgICAgICAgKElSUV9QQlhfR0lDX1NUQVJUICsgNDQpICAgICAgICAvKiBDUFUgUE1VIEludGVycnVwdHMgKi8KLSNkZWZpbmUgSVJRX1BCWF9QTVVfQ1BVMSAgICAgICAgKElSUV9QQlhfR0lDX1NUQVJUICsgNDUpCi0jZGVmaW5lIElSUV9QQlhfUE1VX0NQVTIgICAgICAgIChJUlFfUEJYX0dJQ19TVEFSVCArIDQ2KQotI2RlZmluZSBJUlFfUEJYX1BNVV9DUFUzICAgICAgICAoSVJRX1BCWF9HSUNfU1RBUlQgKyA0NykKLQotLyogLi4uICovCi0jZGVmaW5lIElSUV9QQlhfUENJMAkJKElSUV9QQlhfR0lDX1NUQVJUICsgNTApCi0jZGVmaW5lIElSUV9QQlhfUENJMQkJKElSUV9QQlhfR0lDX1NUQVJUICsgNTEpCi0jZGVmaW5lIElSUV9QQlhfUENJMgkJKElSUV9QQlhfR0lDX1NUQVJUICsgNTIpCi0jZGVmaW5lIElSUV9QQlhfUENJMwkJKElSUV9QQlhfR0lDX1NUQVJUICsgNTMpCi0KLSNkZWZpbmUgSVJRX1BCWF9TTUMJCS0xCi0jZGVmaW5lIElSUV9QQlhfU0NUTAkJLTEKLQotI2VuZGlmCS8qIF9fTUFDSF9JUlFTX1BCWF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRmb3JtLmggYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRmb3JtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTIxNzMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9wbGF0Zm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIEFSTSBMaW1pdGVkIDIwMDMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaWZuZGVmIF9fQVNNX0FSQ0hfUExBVEZPUk1fSAotI2RlZmluZSBfX0FTTV9BUkNIX1BMQVRGT1JNX0gKLQotLyoKLSAqIE1lbW9yeSBkZWZpbml0aW9ucwotICovCi0jZGVmaW5lIFJFQUxWSUVXX0JPT1RfUk9NX0xPICAgICAgICAgIDB4MzAwMDAwMDAJCS8qIERvQyBCYXNlICg2NE1iKS4uLiovCi0jZGVmaW5lIFJFQUxWSUVXX0JPT1RfUk9NX0hJICAgICAgICAgIDB4MzAwMDAwMDAKLSNkZWZpbmUgUkVBTFZJRVdfQk9PVF9ST01fQkFTRSAgICAgICAgUkVBTFZJRVdfQk9PVF9ST01fSEkJIC8qICBOb3JtYWwgcG9zaXRpb24gKi8KLSNkZWZpbmUgUkVBTFZJRVdfQk9PVF9ST01fU0laRSAgICAgICAgU1pfNjRNCi0KLSNkZWZpbmUgUkVBTFZJRVdfU1NSQU1fQkFTRSAgICAgICAgICAgLyogUkVBTFZJRVdfU1NNQ19CQVNFID8gKi8KLSNkZWZpbmUgUkVBTFZJRVdfU1NSQU1fU0laRSAgICAgICAgICAgU1pfMk0KLQotLyogCi0gKiAgU0RSQU0KLSAqLwotI2RlZmluZSBSRUFMVklFV19TRFJBTV9CQVNFICAgICAgICAgICAweDAwMDAwMDAwCi0KLS8qIAotICogIExvZ2ljIGV4cGFuc2lvbiBtb2R1bGVzCi0gKiAKLSAqLwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogIFJlYWxWaWV3IFJlZ2lzdGVycwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAKLSAqLwotI2RlZmluZSBSRUFMVklFV19TWVNfSURfT0ZGU0VUICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBSRUFMVklFV19TWVNfU1dfT0ZGU0VUICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBSRUFMVklFV19TWVNfTEVEX09GRlNFVCAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBSRUFMVklFV19TWVNfT1NDMF9PRkZTRVQgICAgICAgICAgICAgMHgwQwotCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19PU0MxX09GRlNFVCAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19PU0MyX09GRlNFVCAgICAgICAgICAgICAweDE0Ci0jZGVmaW5lIFJFQUxWSUVXX1NZU19PU0MzX09GRlNFVCAgICAgICAgICAgICAweDE4Ci0jZGVmaW5lIFJFQUxWSUVXX1NZU19PU0M0X09GRlNFVCAgICAgICAgICAgICAweDFDCS8qIE9TQzEgZm9yIFJlYWxWaWV3L0FCICovCi0KLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0xPQ0tfT0ZGU0VUICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgUkVBTFZJRVdfU1lTXzEwMEhaX09GRlNFVCAgICAgICAgICAgIDB4MjQKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0NGR0RBVEExX09GRlNFVCAgICAgICAgIDB4MjgKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0NGR0RBVEEyX09GRlNFVCAgICAgICAgIDB4MkMKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0ZMQUdTX09GRlNFVCAgICAgICAgICAgIDB4MzAKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0ZMQUdTU0VUX09GRlNFVCAgICAgICAgIDB4MzAKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0ZMQUdTQ0xSX09GRlNFVCAgICAgICAgIDB4MzQKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX05WRkxBR1NfT0ZGU0VUICAgICAgICAgIDB4MzgKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX05WRkxBR1NTRVRfT0ZGU0VUICAgICAgIDB4MzgKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX05WRkxBR1NDTFJfT0ZGU0VUICAgICAgIDB4M0MKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1JFU0VUQ1RMX09GRlNFVCAgICAgICAgIDB4NDAKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1BDSUNUTF9PRkZTRVQgICAgICAgICAgIDB4NDQKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX01DSV9PRkZTRVQgICAgICAgICAgICAgIDB4NDgKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0ZMQVNIX09GRlNFVCAgICAgICAgICAgIDB4NEMKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0NMQ0RfT0ZGU0VUICAgICAgICAgICAgIDB4NTAKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0NMQ0RTRVJfT0ZGU0VUICAgICAgICAgIDB4NTQKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0JPT1RDU19PRkZTRVQgICAgICAgICAgIDB4NTgKLSNkZWZpbmUgUkVBTFZJRVdfU1lTXzI0TUh6X09GRlNFVCAgICAgICAgICAgIDB4NUMKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX01JU0NfT0ZGU0VUICAgICAgICAgICAgIDB4NjAKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0lPU0VMX09GRlNFVCAgICAgICAgICAgIDB4NzAKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1BST0NJRF9PRkZTRVQgICAgICAgICAgIDB4ODQKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1RFU1RfT1NDMF9PRkZTRVQgICAgICAgIDB4QzAKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1RFU1RfT1NDMV9PRkZTRVQgICAgICAgIDB4QzQKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1RFU1RfT1NDMl9PRkZTRVQgICAgICAgIDB4QzgKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1RFU1RfT1NDM19PRkZTRVQgICAgICAgIDB4Q0MKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1RFU1RfT1NDNF9PRkZTRVQgICAgICAgIDB4RDAKLQotI2RlZmluZSBSRUFMVklFV19TWVNfQkFTRSAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBSRUFMVklFV19TWVNfSUQgICAgICAgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX0lEX09GRlNFVCkKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1NXICAgICAgICAgICAgICAgICAgICAgIChSRUFMVklFV19TWVNfQkFTRSArIFJFQUxWSUVXX1NZU19TV19PRkZTRVQpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19MRUQgICAgICAgICAgICAgICAgICAgICAoUkVBTFZJRVdfU1lTX0JBU0UgKyBSRUFMVklFV19TWVNfTEVEX09GRlNFVCkKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX09TQzAgICAgICAgICAgICAgICAgICAgIChSRUFMVklFV19TWVNfQkFTRSArIFJFQUxWSUVXX1NZU19PU0MwX09GRlNFVCkKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX09TQzEgICAgICAgICAgICAgICAgICAgIChSRUFMVklFV19TWVNfQkFTRSArIFJFQUxWSUVXX1NZU19PU0MxX09GRlNFVCkKLQotI2RlZmluZSBSRUFMVklFV19TWVNfTE9DSyAgICAgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX0xPQ0tfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfMTAwSFogICAgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTXzEwMEhaX09GRlNFVCkKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0NGR0RBVEExICAgICAgICAgICAgICAgIChSRUFMVklFV19TWVNfQkFTRSArIFJFQUxWSUVXX1NZU19DRkdEQVRBMV9PRkZTRVQpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19DRkdEQVRBMiAgICAgICAgICAgICAgICAoUkVBTFZJRVdfU1lTX0JBU0UgKyBSRUFMVklFV19TWVNfQ0ZHREFUQTJfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfRkxBR1MgICAgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX0ZMQUdTX09GRlNFVCkKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0ZMQUdTU0VUICAgICAgICAgICAgICAgIChSRUFMVklFV19TWVNfQkFTRSArIFJFQUxWSUVXX1NZU19GTEFHU1NFVF9PRkZTRVQpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19GTEFHU0NMUiAgICAgICAgICAgICAgICAoUkVBTFZJRVdfU1lTX0JBU0UgKyBSRUFMVklFV19TWVNfRkxBR1NDTFJfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfTlZGTEFHUyAgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX05WRkxBR1NfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfTlZGTEFHU1NFVCAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX05WRkxBR1NTRVRfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfTlZGTEFHU0NMUiAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX05WRkxBR1NDTFJfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfUkVTRVRDVEwgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX1JFU0VUQ1RMX09GRlNFVCkKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1BDSUNUTCAgICAgICAgICAgICAgICAgIChSRUFMVklFV19TWVNfQkFTRSArIFJFQUxWSUVXX1NZU19QQ0lDVExfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfTUNJICAgICAgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX01DSV9PRkZTRVQpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19GTEFTSCAgICAgICAgICAgICAgICAgICAoUkVBTFZJRVdfU1lTX0JBU0UgKyBSRUFMVklFV19TWVNfRkxBU0hfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfQ0xDRCAgICAgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX0NMQ0RfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfQ0xDRFNFUiAgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX0NMQ0RTRVJfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfQk9PVENTICAgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX0JPT1RDU19PRkZTRVQpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU18yNE1IeiAgICAgICAgICAgICAgICAgICAoUkVBTFZJRVdfU1lTX0JBU0UgKyBSRUFMVklFV19TWVNfMjRNSHpfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfTUlTQyAgICAgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX01JU0NfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfSU9TRUwgICAgICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX0lPU0VMX09GRlNFVCkKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1BST0NJRCAgICAgICAgICAgICAgICAgIChSRUFMVklFV19TWVNfQkFTRSArIFJFQUxWSUVXX1NZU19QUk9DSURfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfVEVTVF9PU0MwICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX1RFU1RfT1NDMF9PRkZTRVQpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19URVNUX09TQzEgICAgICAgICAgICAgICAoUkVBTFZJRVdfU1lTX0JBU0UgKyBSRUFMVklFV19TWVNfVEVTVF9PU0MxX09GRlNFVCkKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX1RFU1RfT1NDMiAgICAgICAgICAgICAgIChSRUFMVklFV19TWVNfQkFTRSArIFJFQUxWSUVXX1NZU19URVNUX09TQzJfT0ZGU0VUKQotI2RlZmluZSBSRUFMVklFV19TWVNfVEVTVF9PU0MzICAgICAgICAgICAgICAgKFJFQUxWSUVXX1NZU19CQVNFICsgUkVBTFZJRVdfU1lTX1RFU1RfT1NDM19PRkZTRVQpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19URVNUX09TQzQgICAgICAgICAgICAgICAoUkVBTFZJRVdfU1lTX0JBU0UgKyBSRUFMVklFV19TWVNfVEVTVF9PU0M0X09GRlNFVCkKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgUmVhbFZpZXcgY29udHJvbCByZWdpc3RlcnMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0KLS8qIAotICogUkVBTFZJRVdfSURGSUVMRAotICoKLSAqIDMxOjI0ID0gbWFudWZhY3R1cmVyICgweDQxID0gQVJNKQotICogMjM6MTYgPSBhcmNoaXRlY3R1cmUgKDB4MDggPSBBSEIgc3lzdGVtIGJ1cywgQVNCIHByb2Nlc3NvciBidXMpCi0gKiAxNToxMiA9IEZQR0EgKDB4MyA9IFhWQzYwMCBvciBYVkM2MDBFKQotICogMTE6NCAgPSBidWlsZCB2YWx1ZQotICogMzowICAgPSByZXZpc2lvbiBudW1iZXIgKDB4MSA9IHJldiBCIChBSEIpKQotICovCi0KLS8qCi0gKiBSRUFMVklFV19TWVNfTE9DSwotICogICAgIGNvbnRyb2wgYWNjZXNzIHRvIFNZU19PU0N4LCBTWVNfQ0ZHREFUQXgsIFNZU19SRVNFVENUTCwgCi0gKiAgICAgU1lTX0NMRCwgU1lTX0JPT1RDUwotICovCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19MT0NLX0xPQ0tFRCAgICAoMSA8PCAxNikKLSNkZWZpbmUgUkVBTFZJRVdfU1lTX0xPQ0tfVkFMCTB4QTA1RgkgICAgICAgLyogRW5hYmxlIHdyaXRlIGFjY2VzcyAqLwotCi0vKgotICogUkVBTFZJRVdfU1lTX0ZMQVNICi0gKi8KLSNkZWZpbmUgUkVBTFZJRVdfRkxBU0hQUk9HX0ZMVlBQRU4JKDEgPDwgMCkJLyogRW5hYmxlIHdyaXRpbmcgdG8gZmxhc2ggKi8KLQotLyoKLSAqIFJFQUxWSUVXX0lOVFJFRwotICogICAgIC0gdXNlZCB0byBhY2tub3dsZWRnZSBhbmQgY29udHJvbCBNTUNJIGFuZCBVQVJUIGludGVycnVwdHMgCi0gKi8KLSNkZWZpbmUgUkVBTFZJRVdfSU5UUkVHX1dQUk9UICAgICAgICAweDAwICAgIC8qIE1NQyBwcm90ZWN0aW9uIHN0YXR1cyAobm8gaW50ZXJydXB0IGdlbmVyYXRlZCkgKi8KLSNkZWZpbmUgUkVBTFZJRVdfSU5UUkVHX1JJMCAgICAgICAgICAweDAxICAgIC8qIFJpbmcgaW5kaWNhdG9yIFVBUlQwIGlzIGFzc2VydGVkLCAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUkVBTFZJRVdfSU5UUkVHX0NBUkRJTiAgICAgICAweDA4ICAgIC8qIE1NQ0kgY2FyZCBpbiBkZXRlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIDEgdG8gYWNrbm93bGVkZ2UgYW5kIGNsZWFyICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUkVBTFZJRVdfSU5UUkVHX1JJMSAgICAgICAgICAweDAyICAgIC8qIFJpbmcgaW5kaWNhdG9yIFVBUlQxIGlzIGFzc2VydGVkLCAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUkVBTFZJRVdfSU5UUkVHX0NBUkRJTlNFUlQgICAweDAzICAgIC8qIFNpZ25hbCBpbnNlcnRpb24gb2YgTU1DIGNhcmQgICAgICAgICAgICAgICAgICAgKi8KLQotLyoKLSAqIFJlYWxWaWV3IGNvbW1vbiBwZXJpcGhlcmFsIGFkZHJlc3NlcwotICovCi0jZGVmaW5lIFJFQUxWSUVXX1NDVExfQkFTRSAgICAgICAgICAgIDB4MTAwMDEwMDAJLyogU3lzdGVtIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgUkVBTFZJRVdfSTJDX0JBU0UgICAgICAgICAgICAgMHgxMDAwMjAwMAkvKiBJMkMgY29udHJvbCAqLwotI2RlZmluZSBSRUFMVklFV19BQUNJX0JBU0UgICAgICAgICAgICAweDEwMDA0MDAwCS8qIEF1ZGlvICovCi0jZGVmaW5lIFJFQUxWSUVXX01NQ0kwX0JBU0UgICAgICAgICAgIDB4MTAwMDUwMDAJLyogTU1DIGludGVyZmFjZSAqLwotI2RlZmluZSBSRUFMVklFV19LTUkwX0JBU0UgICAgICAgICAgICAweDEwMDA2MDAwCS8qIEtNSSBpbnRlcmZhY2UgKi8KLSNkZWZpbmUgUkVBTFZJRVdfS01JMV9CQVNFICAgICAgICAgICAgMHgxMDAwNzAwMAkvKiBLTUkgMm5kIGludGVyZmFjZSAqLwotI2RlZmluZSBSRUFMVklFV19DSEFSX0xDRF9CQVNFICAgICAgICAweDEwMDA4MDAwCS8qIENoYXJhY3RlciBMQ0QgKi8KLSNkZWZpbmUgUkVBTFZJRVdfU0NJX0JBU0UgICAgICAgICAgICAgMHgxMDAwRTAwMAkvKiBTbWFydCBjYXJkIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgUkVBTFZJRVdfR1BJTzFfQkFTRSAgICAgICAgICAgMHgxMDAxNDAwMAkvKiBHUElPIHBvcnQgMSAqLwotI2RlZmluZSBSRUFMVklFV19HUElPMl9CQVNFICAgICAgICAgICAweDEwMDE1MDAwCS8qIEdQSU8gcG9ydCAyICovCi0jZGVmaW5lIFJFQUxWSUVXX0RNQ19CQVNFICAgICAgICAgICAgIDB4MTAwMTgwMDAJLyogRE1DIGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgUkVBTFZJRVdfRE1BQ19CQVNFICAgICAgICAgICAgMHgxMDAzMDAwMAkvKiBETUEgY29udHJvbGxlciAqLwotCi0vKiBQQ0kgc3BhY2UgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUENJX0JBU0UgICAgICAgICAgICAgMHg0MTAwMDAwMAkvKiBQQ0kgSW50ZXJmYWNlICovCi0jZGVmaW5lIFJFQUxWSUVXX1BDSV9DRkdfQkFTRQkgICAgICAweDQyMDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX1BDSV9NRU1fQkFTRTAgICAgICAgIDB4NDQwMDAwMDAKLSNkZWZpbmUgUkVBTFZJRVdfUENJX01FTV9CQVNFMSAgICAgICAgMHg1MDAwMDAwMAotI2RlZmluZSBSRUFMVklFV19QQ0lfTUVNX0JBU0UyICAgICAgICAweDYwMDAwMDAwCi0vKiBTaXplcyBvZiBhYm92ZSBtYXBzICovCi0jZGVmaW5lIFJFQUxWSUVXX1BDSV9CQVNFX1NJWkUJICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgUkVBTFZJRVdfUENJX0NGR19CQVNFX1NJWkUgICAgMHgwMjAwMDAwMAotI2RlZmluZSBSRUFMVklFV19QQ0lfTUVNX0JBU0UwX1NJWkUgICAweDBjMDAwMDAwCS8qIDMyTWIgKi8KLSNkZWZpbmUgUkVBTFZJRVdfUENJX01FTV9CQVNFMV9TSVpFICAgMHgxMDAwMDAwMAkvKiAyNTZNYiAqLwotI2RlZmluZSBSRUFMVklFV19QQ0lfTUVNX0JBU0UyX1NJWkUgICAweDEwMDAwMDAwCS8qIDI1Nk1iICovCi0KLSNkZWZpbmUgUkVBTFZJRVdfU0RSQU02N19CQVNFICAgICAgICAgMHg3MDAwMDAwMAkvKiBTRFJBTSBiYW5rcyA2IGFuZCA3ICovCi0jZGVmaW5lIFJFQUxWSUVXX0xUX0JBU0UgICAgICAgICAgICAgIDB4ODAwMDAwMDAJLyogTG9naWMgVGlsZSBleHBhbnNpb24gKi8KLQotLyoKLSAqIENvbXBhY3RGbGFzaAotICovCi0jZGVmaW5lIFJFQUxWSUVXX0NGX0JBU0UJCTB4MTgwMDAwMDAJLyogQ29tcGFjdEZsYXNoICovCi0jZGVmaW5lIFJFQUxWSUVXX0NGX01FTV9CQVNFCQkweDE4MDAzMDAwCS8qIFNNQyBmb3IgQ29tcGFjdEZsYXNoICovCi0KLS8qCi0gKiBEaXNrIG9uIENoaXAKLSAqLwotI2RlZmluZSBSRUFMVklFV19ET0NfQkFTRSAgICAgICAgICAgICAweDJDMDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX0RPQ19TSVpFICAgICAgICAgICAgICgxNiA8PCAyMCkKLSNkZWZpbmUgUkVBTFZJRVdfRE9DX1BBR0VfU0laRSAgICAgICAgNTEyCi0jZGVmaW5lIFJFQUxWSUVXX0RPQ19UT1RBTF9QQUdFUyAgICAgKERPQ19TSVpFIC8gUEFHRV9TSVpFKQotCi0jZGVmaW5lIEVSQVNFX1VOSVRfUEFHRVMgICAgMzIKLSNkZWZpbmUgU1RBUlRfUEFHRSAgICAgICAgICAweDgwCi0KLS8qIAotICogIExFRCBzZXR0aW5ncywgYml0cyBbNzowXQotICovCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19MRUQwICAgICAgICAgICAgICgxIDw8IDApCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19MRUQxICAgICAgICAgICAgICgxIDw8IDEpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19MRUQyICAgICAgICAgICAgICgxIDw8IDIpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19MRUQzICAgICAgICAgICAgICgxIDw8IDMpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19MRUQ0ICAgICAgICAgICAgICgxIDw8IDQpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19MRUQ1ICAgICAgICAgICAgICgxIDw8IDUpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19MRUQ2ICAgICAgICAgICAgICgxIDw8IDYpCi0jZGVmaW5lIFJFQUxWSUVXX1NZU19MRUQ3ICAgICAgICAgICAgICgxIDw8IDcpCi0KLSNkZWZpbmUgQUxMX0xFRFMgICAgICAgICAgICAgICAgICAweEZGCi0KLSNkZWZpbmUgTEVEX0JBTksgICAgICAgICAgICAgICAgICBSRUFMVklFV19TWVNfTEVECi0KLS8qIAotICogQ29udHJvbCByZWdpc3RlcnMKLSAqLwotI2RlZmluZSBSRUFMVklFV19JREZJRUxEX09GRlNFVAkweDAJLyogUmVhbFZpZXcgYnVpbGQgaW5mb3JtYXRpb24gKi8KLSNkZWZpbmUgUkVBTFZJRVdfRkxBU0hQUk9HX09GRlNFVAkweDQJLyogRmxhc2ggZGV2aWNlcyAqLwotI2RlZmluZSBSRUFMVklFV19JTlRSRUdfT0ZGU0VUCQkweDgJLyogSW50ZXJydXB0IGNvbnRyb2wgKi8KLSNkZWZpbmUgUkVBTFZJRVdfREVDT0RFX09GRlNFVAkJMHhDCS8qIEZpdHRlZCBsb2dpYyBtb2R1bGVzICovCi0KLS8qCi0gKiBTeXN0ZW0gY29udHJvbGxlciBiaXQgYXNzaWdubWVudAotICovCi0jZGVmaW5lIFJFQUxWSUVXX1JFRkNMSwkwCi0jZGVmaW5lIFJFQUxWSUVXX1RJTUNMSwkxCi0KLSNkZWZpbmUgUkVBTFZJRVdfVElNRVIxX0VuU2VsCTE1Ci0jZGVmaW5lIFJFQUxWSUVXX1RJTUVSMl9FblNlbAkxNwotI2RlZmluZSBSRUFMVklFV19USU1FUjNfRW5TZWwJMTkKLSNkZWZpbmUgUkVBTFZJRVdfVElNRVI0X0VuU2VsCTIxCi0KLQotI2RlZmluZSBSRUFMVklFV19DU1JfQkFTRSAgICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIFJFQUxWSUVXX0NTUl9TSVpFICAgICAgICAgICAgIDB4MTAwMDAwMDAKLQotI2VuZGlmCS8qIF9fQVNNX0FSQ0hfUExBVEZPUk1fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9wbGF0c21wLWR0LmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAtZHQuYwppbmRleCA2OTY0ZTg4Li43MGNhOTllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAtZHQuYworKysgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3BsYXRzbXAtZHQuYwpAQCAtMTcsOCArMTcsNyBAQAogI2luY2x1ZGUgPGFzbS9zbXBfc2N1Lmg+CiAKICNpbmNsdWRlIDxwbGF0L3BsYXRzbXAuaD4KLQotI2luY2x1ZGUgImNvcmUuaCIKKyNpbmNsdWRlICJob3RwbHVnLmgiCiAKICNkZWZpbmUgUkVBTFZJRVdfU1lTX0ZMQUdTU0VUX09GRlNFVAkweDMwCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jIGIvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9wbGF0c21wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWI2OWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9wbGF0c21wLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcGxhdHNtcC5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwMiBBUk0gTHRkLgotICogIEFsbCBSaWdodHMgUmVzZXJ2ZWQKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgImhhcmR3YXJlLmgiCi0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vc21wX3NjdS5oPgotCi0jaW5jbHVkZSAiYm9hcmQtZWIuaCIKLSNpbmNsdWRlICJib2FyZC1wYjExbXAuaCIKLSNpbmNsdWRlICJib2FyZC1wYnguaCIKLQotI2luY2x1ZGUgPHBsYXQvcGxhdHNtcC5oPgotCi0jaW5jbHVkZSAiY29yZS5oIgotCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpzY3VfYmFzZV9hZGRyKHZvaWQpCi17Ci0JaWYgKG1hY2hpbmVfaXNfcmVhbHZpZXdfZWJfbXAoKSkKLQkJcmV0dXJuIF9faW9fYWRkcmVzcyhSRUFMVklFV19FQjExTVBfU0NVX0JBU0UpOwotCWVsc2UgaWYgKG1hY2hpbmVfaXNfcmVhbHZpZXdfcGIxMW1wKCkpCi0JCXJldHVybiBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfVEMxMU1QX1NDVV9CQVNFKTsKLQllbHNlIGlmIChtYWNoaW5lX2lzX3JlYWx2aWV3X3BieCgpICYmCi0JCSAoY29yZV90aWxlX3BieDExbXAoKSB8fCBjb3JlX3RpbGVfcGJ4YTltcCgpKSkKLQkJcmV0dXJuIF9faW9fYWRkcmVzcyhSRUFMVklFV19QQlhfVElMRV9TQ1VfQkFTRSk7Ci0JZWxzZQotCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKTA7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXNlIHRoZSBDUFUgcG9zc2libGUgbWFwIGVhcmx5IC0gdGhpcyBkZXNjcmliZXMgdGhlIENQVXMKLSAqIHdoaWNoIG1heSBiZSBwcmVzZW50IG9yIGJlY29tZSBwcmVzZW50IGluIHRoZSBzeXN0ZW0uCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCByZWFsdmlld19zbXBfaW5pdF9jcHVzKHZvaWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpzY3VfYmFzZSA9IHNjdV9iYXNlX2FkZHIoKTsKLQl1bnNpZ25lZCBpbnQgaSwgbmNvcmVzOwotCi0JbmNvcmVzID0gc2N1X2Jhc2UgPyBzY3VfZ2V0X2NvcmVfY291bnQoc2N1X2Jhc2UpIDogMTsKLQotCS8qIHNhbml0eSBjaGVjayAqLwotCWlmIChuY29yZXMgPiBucl9jcHVfaWRzKSB7Ci0JCXByX3dhcm4oIlNNUDogJXUgY29yZXMgZ3JlYXRlciB0aGFuIG1heGltdW0gKCV1KSwgY2xpcHBpbmdcbiIsCi0JCQluY29yZXMsIG5yX2NwdV9pZHMpOwotCQluY29yZXMgPSBucl9jcHVfaWRzOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBuY29yZXM7IGkrKykKLQkJc2V0X2NwdV9wb3NzaWJsZShpLCB0cnVlKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHJlYWx2aWV3X3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQotewotCi0Jc2N1X2VuYWJsZShzY3VfYmFzZV9hZGRyKCkpOwotCi0JLyoKLQkgKiBXcml0ZSB0aGUgYWRkcmVzcyBvZiBzZWNvbmRhcnkgc3RhcnR1cCBpbnRvIHRoZQotCSAqIHN5c3RlbS13aWRlIGZsYWdzIHJlZ2lzdGVyLiBUaGUgQm9vdE1vbml0b3Igd2FpdHMKLQkgKiB1bnRpbCBpdCByZWNlaXZlcyBhIHNvZnQgaW50ZXJydXB0LCBhbmQgdGhlbiB0aGUKLQkgKiBzZWNvbmRhcnkgQ1BVIGJyYW5jaGVzIHRvIHRoaXMgYWRkcmVzcy4KLQkgKi8KLQlfX3Jhd193cml0ZWwodmlydF90b19waHlzKHZlcnNhdGlsZV9zZWNvbmRhcnlfc3RhcnR1cCksCi0JCSAgICAgX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19GTEFHU1NFVCkpOwotfQotCi1jb25zdCBzdHJ1Y3Qgc21wX29wZXJhdGlvbnMgcmVhbHZpZXdfc21wX29wcyBfX2luaXRjb25zdCA9IHsKLQkuc21wX2luaXRfY3B1cwkJPSByZWFsdmlld19zbXBfaW5pdF9jcHVzLAotCS5zbXBfcHJlcGFyZV9jcHVzCT0gcmVhbHZpZXdfc21wX3ByZXBhcmVfY3B1cywKLQkuc21wX3NlY29uZGFyeV9pbml0CT0gdmVyc2F0aWxlX3NlY29uZGFyeV9pbml0LAotCS5zbXBfYm9vdF9zZWNvbmRhcnkJPSB2ZXJzYXRpbGVfYm9vdF9zZWNvbmRhcnksCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JLmNwdV9kaWUJCT0gcmVhbHZpZXdfY3B1X2RpZSwKLSNlbmRpZgotfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfZWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0MmZhNi4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X2ViLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA0IEFSTSBMaW1pdGVkCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KLSNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9tbWNpLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9wbDAyMi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxY2hpcC9hcm0tZ2ljLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9jbGstcmVhbHZpZXcuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLQotI2luY2x1ZGUgImhhcmR3YXJlLmgiCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgotI2luY2x1ZGUgPGFzbS9zbXBfdHdkLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbV9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL291dGVyY2FjaGUuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0KLSNpbmNsdWRlICJib2FyZC1lYi5oIgotI2luY2x1ZGUgImlycXMtZWIuaCIKLQotI2luY2x1ZGUgImNvcmUuaCIKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyByZWFsdmlld19lYl9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19TWVNfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19TWVNfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19FQl9HSUNfQ1BVX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfRUJfR0lDX0NQVV9CQVNFKSwKLQkJLmxlbmd0aAkJPSBTWl80SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX0VCX0dJQ19ESVNUX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfRUJfR0lDX0RJU1RfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19TQ1RMX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfU0NUTF9CQVNFKSwKLQkJLmxlbmd0aAkJPSBTWl80SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX0VCX1RJTUVSMF8xX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfRUJfVElNRVIwXzFfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19FQl9USU1FUjJfM19CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX0VCX1RJTUVSMl8zX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLSNpZmRlZiBDT05GSUdfREVCVUdfTEwKLQl7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19FQl9VQVJUMF9CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX0VCX1VBUlQwX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfQotI2VuZGlmCi19OwotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIHJlYWx2aWV3X2ViMTFtcF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19FQjExTVBfUFJJVl9NRU1fQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19FQjExTVBfUFJJVl9NRU1fQkFTRSksCi0JCS5sZW5ndGgJCT0gUkVBTFZJRVdfRUIxMU1QX1BSSVZfTUVNX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19FQjExTVBfTDIyMF9CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX0VCMTFNUF9MMjIwX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzhLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfQotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHJlYWx2aWV3X2ViX21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChyZWFsdmlld19lYl9pb19kZXNjLCBBUlJBWV9TSVpFKHJlYWx2aWV3X2ViX2lvX2Rlc2MpKTsKLQlpZiAoY29yZV90aWxlX2ViMTFtcCgpIHx8IGNvcmVfdGlsZV9hOW1wKCkpCi0JCWlvdGFibGVfaW5pdChyZWFsdmlld19lYjExbXBfaW9fZGVzYywgQVJSQVlfU0laRShyZWFsdmlld19lYjExbXBfaW9fZGVzYykpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsMDYxX3BsYXRmb3JtX2RhdGEgZ3BpbzBfcGxhdF9kYXRhID0gewotCS5ncGlvX2Jhc2UJPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbDA2MV9wbGF0Zm9ybV9kYXRhIGdwaW8xX3BsYXRfZGF0YSA9IHsKLQkuZ3Bpb19iYXNlCT0gOCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGwwNjFfcGxhdGZvcm1fZGF0YSBncGlvMl9wbGF0X2RhdGEgPSB7Ci0JLmdwaW9fYmFzZQk9IDE2LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbDAyMl9zc3BfY29udHJvbGxlciBzc3AwX3BsYXRfZGF0YSA9IHsKLQkuYnVzX2lkID0gMCwKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLm51bV9jaGlwc2VsZWN0ID0gMSwKLX07Ci0KLS8qCi0gKiBSZWFsVmlldyBFQiBBTUJBIGRldmljZXMKLSAqLwotCi0vKgotICogVGhlc2UgZGV2aWNlcyBhcmUgY29ubmVjdGVkIHZpYSB0aGUgY29yZSBBUEIgYnJpZGdlCi0gKi8KLSNkZWZpbmUgR1BJTzJfSVJRCXsgSVJRX0VCX0dQSU8yIH0KLSNkZWZpbmUgR1BJTzNfSVJRCXsgSVJRX0VCX0dQSU8zIH0KLQotI2RlZmluZSBBQUNJX0lSUQl7IElSUV9FQl9BQUNJIH0KLSNkZWZpbmUgTU1DSTBfSVJRCXsgSVJRX0VCX01NQ0kwQSwgSVJRX0VCX01NQ0kwQiB9Ci0jZGVmaW5lIEtNSTBfSVJRCXsgSVJRX0VCX0tNSTAgfQotI2RlZmluZSBLTUkxX0lSUQl7IElSUV9FQl9LTUkxIH0KLQotLyoKLSAqIFRoZXNlIGRldmljZXMgYXJlIGNvbm5lY3RlZCBkaXJlY3RseSB0byB0aGUgbXVsdGktbGF5ZXIgQUhCIHN3aXRjaAotICovCi0jZGVmaW5lIEVCX1NNQ19JUlEJeyB9Ci0jZGVmaW5lIE1QTUNfSVJRCXsgfQotI2RlZmluZSBFQl9DTENEX0lSUQl7IElSUV9FQl9DTENEIH0KLSNkZWZpbmUgRE1BQ19JUlEJeyBJUlFfRUJfRE1BIH0KLQotLyoKLSAqIFRoZXNlIGRldmljZXMgYXJlIGNvbm5lY3RlZCB2aWEgdGhlIGNvcmUgQVBCIGJyaWRnZQotICovCi0jZGVmaW5lIFNDVExfSVJRCXsgfQotI2RlZmluZSBFQl9XQVRDSERPR19JUlEJeyBJUlFfRUJfV0RPRyB9Ci0jZGVmaW5lIEVCX0dQSU8wX0lSUQl7IElSUV9FQl9HUElPMCB9Ci0jZGVmaW5lIEdQSU8xX0lSUQl7IElSUV9FQl9HUElPMSB9Ci0jZGVmaW5lIEVCX1JUQ19JUlEJeyBJUlFfRUJfUlRDIH0KLQotLyoKLSAqIFRoZXNlIGRldmljZXMgYXJlIGNvbm5lY3RlZCB2aWEgdGhlIERNQSBBUEIgYnJpZGdlCi0gKi8KLSNkZWZpbmUgU0NJX0lSUQkJeyBJUlFfRUJfU0NJIH0KLSNkZWZpbmUgRUJfVUFSVDBfSVJRCXsgSVJRX0VCX1VBUlQwIH0KLSNkZWZpbmUgRUJfVUFSVDFfSVJRCXsgSVJRX0VCX1VBUlQxIH0KLSNkZWZpbmUgRUJfVUFSVDJfSVJRCXsgSVJRX0VCX1VBUlQyIH0KLSNkZWZpbmUgRUJfVUFSVDNfSVJRCXsgSVJRX0VCX1VBUlQzIH0KLSNkZWZpbmUgRUJfU1NQX0lSUQl7IElSUV9FQl9TU1AgfQotCi0vKiBGUEdBIFByaW1lY2VsbHMgKi8KLUFQQl9ERVZJQ0UoYWFjaSwgICJmcGdhOmFhY2kiLCAgQUFDSSwgICAgIE5VTEwpOwotQVBCX0RFVklDRShtbWMwLCAgImZwZ2E6bW1jMCIsICBNTUNJMCwgICAgJnJlYWx2aWV3X21tYzBfcGxhdF9kYXRhKTsKLUFQQl9ERVZJQ0Uoa21pMCwgICJmcGdhOmttaTAiLCAgS01JMCwgICAgIE5VTEwpOwotQVBCX0RFVklDRShrbWkxLCAgImZwZ2E6a21pMSIsICBLTUkxLCAgICAgTlVMTCk7Ci1BUEJfREVWSUNFKHVhcnQzLCAiZnBnYTp1YXJ0MyIsIEVCX1VBUlQzLCBOVUxMKTsKLQotLyogRGV2Q2hpcCBQcmltZWNlbGxzICovCi1BSEJfREVWSUNFKHNtYywgICAiZGV2OnNtYyIsICAgRUJfU01DLCAgIE5VTEwpOwotQUhCX0RFVklDRShjbGNkLCAgImRldjpjbGNkIiwgIEVCX0NMQ0QsICAmY2xjZF9wbGF0X2RhdGEpOwotQUhCX0RFVklDRShkbWFjLCAgImRldjpkbWFjIiwgIERNQUMsICAgICBOVUxMKTsKLUFIQl9ERVZJQ0Uoc2N0bCwgICJkZXY6c2N0bCIsICBTQ1RMLCAgICAgTlVMTCk7Ci1BUEJfREVWSUNFKHdkb2csICAiZGV2Ondkb2ciLCAgRUJfV0FUQ0hET0csIE5VTEwpOwotQVBCX0RFVklDRShncGlvMCwgImRldjpncGlvMCIsIEVCX0dQSU8wLCAmZ3BpbzBfcGxhdF9kYXRhKTsKLUFQQl9ERVZJQ0UoZ3BpbzEsICJkZXY6Z3BpbzEiLCBHUElPMSwgICAgJmdwaW8xX3BsYXRfZGF0YSk7Ci1BUEJfREVWSUNFKGdwaW8yLCAiZGV2OmdwaW8yIiwgR1BJTzIsICAgICZncGlvMl9wbGF0X2RhdGEpOwotQVBCX0RFVklDRShydGMsICAgImRldjpydGMiLCAgIEVCX1JUQywgICBOVUxMKTsKLUFQQl9ERVZJQ0Uoc2NpMCwgICJkZXY6c2NpMCIsICBTQ0ksICAgICAgTlVMTCk7Ci1BUEJfREVWSUNFKHVhcnQwLCAiZGV2OnVhcnQwIiwgRUJfVUFSVDAsIE5VTEwpOwotQVBCX0RFVklDRSh1YXJ0MSwgImRldjp1YXJ0MSIsIEVCX1VBUlQxLCBOVUxMKTsKLUFQQl9ERVZJQ0UodWFydDIsICJkZXY6dWFydDIiLCBFQl9VQVJUMiwgTlVMTCk7Ci1BUEJfREVWSUNFKHNzcDAsICAiZGV2OnNzcDAiLCAgRUJfU1NQLCAgICZzc3AwX3BsYXRfZGF0YSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFtYmFfZGV2c1tdIF9faW5pdGRhdGEgPSB7Ci0JJmRtYWNfZGV2aWNlLAotCSZ1YXJ0MF9kZXZpY2UsCi0JJnVhcnQxX2RldmljZSwKLQkmdWFydDJfZGV2aWNlLAotCSZ1YXJ0M19kZXZpY2UsCi0JJnNtY19kZXZpY2UsCi0JJmNsY2RfZGV2aWNlLAotCSZzY3RsX2RldmljZSwKLQkmd2RvZ19kZXZpY2UsCi0JJmdwaW8wX2RldmljZSwKLQkmZ3BpbzFfZGV2aWNlLAotCSZncGlvMl9kZXZpY2UsCi0JJnJ0Y19kZXZpY2UsCi0JJnNjaTBfZGV2aWNlLAotCSZzc3AwX2RldmljZSwKLQkmYWFjaV9kZXZpY2UsCi0JJm1tYzBfZGV2aWNlLAotCSZrbWkwX2RldmljZSwKLQkma21pMV9kZXZpY2UsCi19OwotCi0vKgotICogUmVhbFZpZXcgRUIgcGxhdGZvcm0gZGV2aWNlcwotICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHJlYWx2aWV3X2ViX2ZsYXNoX3Jlc291cmNlID0gewotCS5zdGFydAkJCT0gUkVBTFZJRVdfRUJfRkxBU0hfQkFTRSwKLQkuZW5kCQkJPSBSRUFMVklFV19FQl9GTEFTSF9CQVNFICsgUkVBTFZJRVdfRUJfRkxBU0hfU0laRSAtIDEsCi0JLmZsYWdzCQkJPSBJT1JFU09VUkNFX01FTSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcmVhbHZpZXdfZWJfZXRoX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CQk9IFJFQUxWSUVXX0VCX0VUSF9CQVNFLAotCQkuZW5kCQk9IFJFQUxWSUVXX0VCX0VUSF9CQVNFICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJCT0gSVJRX0VCX0VUSCwKLQkJLmVuZAkJPSBJUlFfRUJfRVRILAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEgfCBJT1JFU09VUkNFX0lSUV9ISUdIRURHRSwKLQl9LAotfTsKLQotLyoKLSAqIERldGVjdCBhbmQgcmVnaXN0ZXIgdGhlIGNvcnJlY3QgRXRoZXJuZXQgZGV2aWNlLiBSZWFsVmlldy9FQiByZXYgRAotICogcGxhdGZvcm1zIHVzZSB0aGUgbmV3ZXIgU01TQyBMQU45MTE4IEV0aGVybmV0IGNoaXAKLSAqLwotc3RhdGljIGludCBldGhfZGV2aWNlX3JlZ2lzdGVyKHZvaWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpldGhfYWRkciA9IGlvcmVtYXAoUkVBTFZJRVdfRUJfRVRIX0JBU0UsIFNaXzRLKTsKLQljb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLQl1MzIgaWRyZXY7Ci0KLQlpZiAoIWV0aF9hZGRyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlkcmV2ID0gcmVhZGwoZXRoX2FkZHIgKyAweDUwKTsKLQlpZiAoKGlkcmV2ICYgMHhGRkZGMDAwMCkgIT0gMHgwMTE4MDAwMCkKLQkJLyogU01TQyBMQU45MTE4IG5vdCBwcmVzZW50LCB1c2UgTEFOOTFDMTExIGluc3RlYWQgKi8KLQkJbmFtZSA9ICJzbWM5MXgiOwotCi0JaW91bm1hcChldGhfYWRkcik7Ci0JcmV0dXJuIHJlYWx2aWV3X2V0aF9yZWdpc3RlcihuYW1lLCByZWFsdmlld19lYl9ldGhfcmVzb3VyY2VzKTsKLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSByZWFsdmlld19lYl9pc3AxNzYxX3Jlc291cmNlc1tdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CQk9IFJFQUxWSUVXX0VCX1VTQl9CQVNFLAotCQkuZW5kCQk9IFJFQUxWSUVXX0VCX1VTQl9CQVNFICsgU1pfMTI4SyAtIDEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CQk9IElSUV9FQl9VU0IsCi0JCS5lbmQJCT0gSVJRX0VCX1VTQiwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHBtdV9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAkJPSBJUlFfRUIxMU1QX1BNVV9DUFUwLAotCQkuZW5kCQk9IElSUV9FQjExTVBfUE1VX0NQVTAsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CQk9IElSUV9FQjExTVBfUE1VX0NQVTEsCi0JCS5lbmQJCT0gSVJRX0VCMTFNUF9QTVVfQ1BVMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzJdID0gewotCQkuc3RhcnQJCT0gSVJRX0VCMTFNUF9QTVVfQ1BVMiwKLQkJLmVuZAkJPSBJUlFfRUIxMU1QX1BNVV9DUFUyLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbM10gPSB7Ci0JCS5zdGFydAkJPSBJUlFfRUIxMU1QX1BNVV9DUFUzLAotCQkuZW5kCQk9IElSUV9FQjExTVBfUE1VX0NQVTMsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcG11X2RldmljZSA9IHsKLQkuaWQJCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUocG11X3Jlc291cmNlcyksCi0JLnJlc291cmNlCQk9IHBtdV9yZXNvdXJjZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGNoYXJfbGNkX3Jlc291cmNlc1tdID0gewotCXsKLQkJLnN0YXJ0ID0gUkVBTFZJRVdfQ0hBUl9MQ0RfQkFTRSwKLQkJLmVuZCAgID0gKFJFQUxWSUVXX0NIQVJfTENEX0JBU0UgKyBTWl80SyAtIDEpLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCXsKLQkJLnN0YXJ0CT0gSVJRX0VCX0NIQVJMQ0QsCi0JCS5lbmQJPSBJUlFfRUJfQ0hBUkxDRCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNoYXJfbGNkX2RldmljZSA9IHsKLQkubmFtZQkJPQkiYXJtLWNoYXJsY2QiLAotCS5pZAkJPQktMSwKLQkubnVtX3Jlc291cmNlcwk9CUFSUkFZX1NJWkUoY2hhcl9sY2RfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPQljaGFyX2xjZF9yZXNvdXJjZXMsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2ljX2luaXRfaXJxKHZvaWQpCi17Ci0JaWYgKGNvcmVfdGlsZV9lYjExbXAoKSB8fCBjb3JlX3RpbGVfYTltcCgpKSB7Ci0JCXVuc2lnbmVkIGludCBwbGRjdHJsOwotCi0JCS8qIG5ldyBpcnEgbW9kZSAqLwotCQl3cml0ZWwoMHgwMDAwYTA1ZiwgX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19MT0NLKSk7Ci0JCXBsZGN0cmwgPSByZWFkbChfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0JBU0UpCSsgUkVBTFZJRVdfRUIxMU1QX1NZU19QTERfQ1RSTDEpOwotCQlwbGRjdHJsIHw9IDB4MDA4MDAwMDA7Ci0JCXdyaXRlbChwbGRjdHJsLCBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0JBU0UpICsgUkVBTFZJRVdfRUIxMU1QX1NZU19QTERfQ1RSTDEpOwotCQl3cml0ZWwoMHgwMDAwMDAwMCwgX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19MT0NLKSk7Ci0KLQkJLyogY29yZSB0aWxlIEdJQywgcHJpbWFyeSAqLwotCQlnaWNfaW5pdCgwLCAyOSwgX19pb19hZGRyZXNzKFJFQUxWSUVXX0VCMTFNUF9HSUNfRElTVF9CQVNFKSwKLQkJCSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfRUIxMU1QX0dJQ19DUFVfQkFTRSkpOwotCi0jaWZuZGVmIENPTkZJR19SRUFMVklFV19FQl9BUk0xMU1QX1JFVkIKLQkJLyogYm9hcmQgR0lDLCBzZWNvbmRhcnkgKi8KLQkJZ2ljX2luaXQoMSwgOTYsIF9faW9fYWRkcmVzcyhSRUFMVklFV19FQl9HSUNfRElTVF9CQVNFKSwKLQkJCSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfRUJfR0lDX0NQVV9CQVNFKSk7Ci0JCWdpY19jYXNjYWRlX2lycSgxLCBJUlFfRUIxMU1QX0VCX0lSUTEpOwotI2VuZGlmCi0JfSBlbHNlIHsKLQkJLyogYm9hcmQgR0lDLCBwcmltYXJ5ICovCi0JCWdpY19pbml0KDAsIDI5LCBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfRUJfR0lDX0RJU1RfQkFTRSksCi0JCQkgX19pb19hZGRyZXNzKFJFQUxWSUVXX0VCX0dJQ19DUFVfQkFTRSkpOwotCX0KLX0KLQotLyoKLSAqIEZpeCB1cCB0aGUgSVJRIG51bWJlcnMgZm9yIHRoZSBSZWFsVmlldyBFQi9BUk0xMU1QQ29yZSB0aWxlCi0gKi8KLXN0YXRpYyB2b2lkIHJlYWx2aWV3X2ViMTFtcF9maXh1cCh2b2lkKQotewotCS8qIEFNQkEgZGV2aWNlcyAqLwotCWRtYWNfZGV2aWNlLmlycVswXQk9IElSUV9FQjExTVBfRE1BOwotCXVhcnQwX2RldmljZS5pcnFbMF0JPSBJUlFfRUIxMU1QX1VBUlQwOwotCXVhcnQxX2RldmljZS5pcnFbMF0JPSBJUlFfRUIxMU1QX1VBUlQxOwotCXVhcnQyX2RldmljZS5pcnFbMF0JPSBJUlFfRUIxMU1QX1VBUlQyOwotCXVhcnQzX2RldmljZS5pcnFbMF0JPSBJUlFfRUIxMU1QX1VBUlQzOwotCWNsY2RfZGV2aWNlLmlycVswXQk9IElSUV9FQjExTVBfQ0xDRDsKLQl3ZG9nX2RldmljZS5pcnFbMF0JPSBJUlFfRUIxMU1QX1dET0c7Ci0JZ3BpbzBfZGV2aWNlLmlycVswXQk9IElSUV9FQjExTVBfR1BJTzA7Ci0JZ3BpbzFfZGV2aWNlLmlycVswXQk9IElSUV9FQjExTVBfR1BJTzE7Ci0JZ3BpbzJfZGV2aWNlLmlycVswXQk9IElSUV9FQjExTVBfR1BJTzI7Ci0JcnRjX2RldmljZS5pcnFbMF0JPSBJUlFfRUIxMU1QX1JUQzsKLQlzY2kwX2RldmljZS5pcnFbMF0JPSBJUlFfRUIxMU1QX1NDSTsKLQlzc3AwX2RldmljZS5pcnFbMF0JPSBJUlFfRUIxMU1QX1NTUDsKLQlhYWNpX2RldmljZS5pcnFbMF0JPSBJUlFfRUIxMU1QX0FBQ0k7Ci0JbW1jMF9kZXZpY2UuaXJxWzBdCT0gSVJRX0VCMTFNUF9NTUNJMEE7Ci0JbW1jMF9kZXZpY2UuaXJxWzFdCT0gSVJRX0VCMTFNUF9NTUNJMEI7Ci0Ja21pMF9kZXZpY2UuaXJxWzBdCT0gSVJRX0VCMTFNUF9LTUkwOwotCWttaTFfZGV2aWNlLmlycVswXQk9IElSUV9FQjExTVBfS01JMTsKLQotCS8qIHBsYXRmb3JtIGRldmljZXMgKi8KLQlyZWFsdmlld19lYl9ldGhfcmVzb3VyY2VzWzFdLnN0YXJ0CT0gSVJRX0VCMTFNUF9FVEg7Ci0JcmVhbHZpZXdfZWJfZXRoX3Jlc291cmNlc1sxXS5lbmQJPSBJUlFfRUIxMU1QX0VUSDsKLQlyZWFsdmlld19lYl9pc3AxNzYxX3Jlc291cmNlc1sxXS5zdGFydAk9IElSUV9FQjExTVBfVVNCOwotCXJlYWx2aWV3X2ViX2lzcDE3NjFfcmVzb3VyY2VzWzFdLmVuZAk9IElSUV9FQjExTVBfVVNCOwotfQotCi0jaWZkZWYgQ09ORklHX0hBVkVfQVJNX1RXRAotc3RhdGljIERFRklORV9UV0RfTE9DQUxfVElNRVIodHdkX2xvY2FsX3RpbWVyLAotCQkJICAgICAgUkVBTFZJRVdfRUIxMU1QX1RXRF9CQVNFLAotCQkJICAgICAgSVJRX0xPQ0FMVElNRVIpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVhbHZpZXdfZWJfdHdkX2luaXQodm9pZCkKLXsKLQlpZiAoY29yZV90aWxlX2ViMTFtcCgpIHx8IGNvcmVfdGlsZV9hOW1wKCkpIHsKLQkJaW50IGVyciA9IHR3ZF9sb2NhbF90aW1lcl9yZWdpc3RlcigmdHdkX2xvY2FsX3RpbWVyKTsKLQkJaWYgKGVycikKLQkJCXByX2VycigidHdkX2xvY2FsX3RpbWVyX3JlZ2lzdGVyIGZhaWxlZCAlZFxuIiwgZXJyKTsKLQl9Ci19Ci0jZWxzZQotI2RlZmluZSByZWFsdmlld19lYl90d2RfaW5pdCgpCWRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIF9faW5pdCByZWFsdmlld19lYl90aW1lcl9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHRpbWVyX2lycTsKLQotCXRpbWVyMF92YV9iYXNlID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX0VCX1RJTUVSMF8xX0JBU0UpOwotCXRpbWVyMV92YV9iYXNlID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX0VCX1RJTUVSMF8xX0JBU0UpICsgMHgyMDsKLQl0aW1lcjJfdmFfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19FQl9USU1FUjJfM19CQVNFKTsKLQl0aW1lcjNfdmFfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19FQl9USU1FUjJfM19CQVNFKSArIDB4MjA7Ci0KLQlpZiAoY29yZV90aWxlX2ViMTFtcCgpIHx8IGNvcmVfdGlsZV9hOW1wKCkpCi0JCXRpbWVyX2lycSA9IElSUV9FQjExTVBfVElNRVIwXzE7Ci0JZWxzZQotCQl0aW1lcl9pcnEgPSBJUlFfRUJfVElNRVIwXzE7Ci0KLQlyZWFsdmlld19jbGtfaW5pdChfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0JBU0UpLCBmYWxzZSk7Ci0JcmVhbHZpZXdfdGltZXJfaW5pdCh0aW1lcl9pcnEpOwotCXJlYWx2aWV3X2ViX3R3ZF9pbml0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWx2aWV3X2ViX3Jlc3RhcnQoZW51bSByZWJvb3RfbW9kZSBtb2RlLCBjb25zdCBjaGFyICpjbWQpCi17Ci0Jdm9pZCBfX2lvbWVtICpyZXNldF9jdHJsID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19SRVNFVENUTCk7Ci0Jdm9pZCBfX2lvbWVtICpsb2NrX2N0cmwgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0xPQ0spOwotCi0JLyoKLQkgKiBUbyByZXNldCwgd2UgaGl0IHRoZSBvbi1ib2FyZCByZXNldCByZWdpc3RlcgotCSAqIGluIHRoZSBzeXN0ZW0gRlBHQQotCSAqLwotCV9fcmF3X3dyaXRlbChSRUFMVklFV19TWVNfTE9DS19WQUwsIGxvY2tfY3RybCk7Ci0JaWYgKGNvcmVfdGlsZV9lYjExbXAoKSkKLQkJX19yYXdfd3JpdGVsKDB4MDAwOCwgcmVzZXRfY3RybCk7Ci0JZHNiKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCByZWFsdmlld19lYl9pbml0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpZiAoY29yZV90aWxlX2ViMTFtcCgpIHx8IGNvcmVfdGlsZV9hOW1wKCkpIHsKLQkJcmVhbHZpZXdfZWIxMW1wX2ZpeHVwKCk7Ci0KLSNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAotCQkvKgotCQkgKiBUaGUgUEwyMjAgbmVlZHMgdG8gYmUgbWFudWFsbHkgY29uZmlndXJlZCBhcyB0aGUgaGFyZHdhcmUKLQkJICogZG9lc24ndCByZXBvcnQgdGhlIGNvcnJlY3Qgc2l6ZXMuCi0JCSAqIDFNQiAoMTI4S0Ivd2F5KSwgOC13YXkgYXNzb2NpYXRpdml0eSwgZXZlbnQgbW9uaXRvciBhbmQKLQkJICogcGFyaXR5IGVuYWJsZWQsIGlnbm9yZSBzaGFyZSBiaXQsIG5vIGZvcmNlIHdyaXRlIGFsbG9jYXRlCi0JCSAqIEJpdHM6ICAuLi4uIC4uLjAgMDExMSAxMDAxIDAwMDAgLi4uLiAuLi4uIC4uLi4KLQkJICovCi0JCWwyeDBfaW5pdChfX2lvX2FkZHJlc3MoUkVBTFZJRVdfRUIxMU1QX0wyMjBfQkFTRSksIDB4MDA3OTAwMDAsIDB4ZmUwMDBmZmYpOwotCi0JCS8qCi0JCSAqIGR1ZSB0byBhIGJ1ZyBpbiB0aGUgbDIyMCBjYWNoZSBjb250cm9sbGVyLCB3ZSBtdXN0IG5vdCBjYWxsCi0JCSAqIHRoZSBzeW5jIGZ1bmN0aW9uLiBzdHViIGl0IG91dCBoZXJlIGluc3RlYWQhCi0JCSAqLwotCQlvdXRlcl9jYWNoZS5zeW5jID0gTlVMTDsKLSNlbmRpZgotCQlwbXVfZGV2aWNlLm5hbWUgPSBjb3JlX3RpbGVfYTltcCgpID8gImFybXY3LXBtdSIgOiAiYXJtdjYtcG11IjsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwbXVfZGV2aWNlKTsKLQl9Ci0KLQlyZWFsdmlld19mbGFzaF9yZWdpc3RlcigmcmVhbHZpZXdfZWJfZmxhc2hfcmVzb3VyY2UsIDEpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfaTJjX2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZjaGFyX2xjZF9kZXZpY2UpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfbGVkc19kZXZpY2UpOwotCWV0aF9kZXZpY2VfcmVnaXN0ZXIoKTsKLQlyZWFsdmlld191c2JfcmVnaXN0ZXIocmVhbHZpZXdfZWJfaXNwMTc2MV9yZXNvdXJjZXMpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYW1iYV9kZXZzKTsgaSsrKSB7Ci0JCXN0cnVjdCBhbWJhX2RldmljZSAqZCA9IGFtYmFfZGV2c1tpXTsKLQkJYW1iYV9kZXZpY2VfcmVnaXN0ZXIoZCwgJmlvbWVtX3Jlc291cmNlKTsKLQl9Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoUkVBTFZJRVdfRUIsICJBUk0tUmVhbFZpZXcgRUIiKQotCS8qIE1haW50YWluZXI6IEFSTSBMdGQvRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQgKi8KLQkuYXRhZ19vZmZzZXQJPSAweDEwMCwKLQkuc21wCQk9IHNtcF9vcHMocmVhbHZpZXdfc21wX29wcyksCi0JLmZpeHVwCQk9IHJlYWx2aWV3X2ZpeHVwLAotCS5tYXBfaW8JCT0gcmVhbHZpZXdfZWJfbWFwX2lvLAotCS5pbml0X2Vhcmx5CT0gcmVhbHZpZXdfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBnaWNfaW5pdF9pcnEsCi0JLmluaXRfdGltZQk9IHJlYWx2aWV3X2ViX3RpbWVyX2luaXQsCi0JLmluaXRfbWFjaGluZQk9IHJlYWx2aWV3X2ViX2luaXQsCi0jaWZkZWYgQ09ORklHX1pPTkVfRE1BCi0JLmRtYV96b25lX3NpemUJPSBTWl8yNTZNLAotI2VuZGlmCi0JLnJlc3RhcnQJPSByZWFsdmlld19lYl9yZXN0YXJ0LAotTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMTc2LmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTE3Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzdmMzg3Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMTc2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiMTE3Ni5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOCBBUk0gTGltaXRlZAotICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9wbDA2MS5oPgotI2luY2x1ZGUgPGxpbnV4L2FtYmEvbW1jaS5oPgotI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwMjIuaD4KLSNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2FybS1naWMuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2Nsay1yZWFsdmlldy5oPgotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgotI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+Ci0KLSNpbmNsdWRlICJoYXJkd2FyZS5oIgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2NhY2hlLWwyeDAuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9mbGFzaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLQotI2luY2x1ZGUgImJvYXJkLXBiMTE3Ni5oIgotI2luY2x1ZGUgImlycXMtcGIxMTc2LmgiCi0KLSNpbmNsdWRlICJjb3JlLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgcmVhbHZpZXdfcGIxMTc2X2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX1NZU19CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1NZU19CQVNFKSwKLQkJLmxlbmd0aAkJPSBTWl80SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX1BCMTE3Nl9HSUNfQ1BVX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfUEIxMTc2X0dJQ19DUFVfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQjExNzZfR0lDX0RJU1RfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQjExNzZfR0lDX0RJU1RfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19EQzExNzZfR0lDX0NQVV9CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX0RDMTE3Nl9HSUNfQ1BVX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfREMxMTc2X0dJQ19ESVNUX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfREMxMTc2X0dJQ19ESVNUX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfU0NUTF9CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1NDVExfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQjExNzZfVElNRVIwXzFfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQjExNzZfVElNRVIwXzFfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQjExNzZfVElNRVIyXzNfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQjExNzZfVElNRVIyXzNfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQjExNzZfTDIyMF9CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1BCMTE3Nl9MMjIwX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzhLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLSNpZmRlZiBDT05GSUdfREVCVUdfTEwKLQl7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQjExNzZfVUFSVDBfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQjExNzZfVUFSVDBfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LAotI2VuZGlmCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVhbHZpZXdfcGIxMTc2X21hcF9pbyh2b2lkKQotewotCWlvdGFibGVfaW5pdChyZWFsdmlld19wYjExNzZfaW9fZGVzYywgQVJSQVlfU0laRShyZWFsdmlld19wYjExNzZfaW9fZGVzYykpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsMDYxX3BsYXRmb3JtX2RhdGEgZ3BpbzBfcGxhdF9kYXRhID0gewotCS5ncGlvX2Jhc2UJPSAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbDA2MV9wbGF0Zm9ybV9kYXRhIGdwaW8xX3BsYXRfZGF0YSA9IHsKLQkuZ3Bpb19iYXNlCT0gOCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGwwNjFfcGxhdGZvcm1fZGF0YSBncGlvMl9wbGF0X2RhdGEgPSB7Ci0JLmdwaW9fYmFzZQk9IDE2LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbDAyMl9zc3BfY29udHJvbGxlciBzc3AwX3BsYXRfZGF0YSA9IHsKLQkuYnVzX2lkID0gMCwKLQkuZW5hYmxlX2RtYSA9IDAsCi0JLm51bV9jaGlwc2VsZWN0ID0gMSwKLX07Ci0KLS8qCi0gKiBSZWFsVmlldyBQQjExNzYgQU1CQSBkZXZpY2VzCi0gKi8KLSNkZWZpbmUgR1BJTzJfSVJRCXsgSVJRX1BCMTE3Nl9HUElPMiB9Ci0jZGVmaW5lIEdQSU8zX0lSUQl7IElSUV9QQjExNzZfR1BJTzMgfQotI2RlZmluZSBBQUNJX0lSUQl7IElSUV9QQjExNzZfQUFDSSB9Ci0jZGVmaW5lIE1NQ0kwX0lSUQl7IElSUV9QQjExNzZfTU1DSTBBLCBJUlFfUEIxMTc2X01NQ0kwQiB9Ci0jZGVmaW5lIEtNSTBfSVJRCXsgSVJRX1BCMTE3Nl9LTUkwIH0KLSNkZWZpbmUgS01JMV9JUlEJeyBJUlFfUEIxMTc2X0tNSTEgfQotI2RlZmluZSBQQjExNzZfU01DX0lSUQl7IH0KLSNkZWZpbmUgTVBNQ19JUlEJeyB9Ci0jZGVmaW5lIFBCMTE3Nl9DTENEX0lSUQl7IElSUV9EQzExNzZfQ0xDRCB9Ci0jZGVmaW5lIFNDVExfSVJRCXsgfQotI2RlZmluZSBQQjExNzZfV0FUQ0hET0dfSVJRCXsgSVJRX0RDMTE3Nl9XQVRDSERPRyB9Ci0jZGVmaW5lIFBCMTE3Nl9HUElPMF9JUlEJeyBJUlFfREMxMTc2X0dQSU8wIH0KLSNkZWZpbmUgR1BJTzFfSVJRCXsgSVJRX1BCMTE3Nl9HUElPMSB9Ci0jZGVmaW5lIFBCMTE3Nl9SVENfSVJRCXsgSVJRX0RDMTE3Nl9SVEMgfQotI2RlZmluZSBTQ0lfSVJRCQl7IElSUV9QQjExNzZfU0NJIH0KLSNkZWZpbmUgUEIxMTc2X1VBUlQwX0lSUQl7IElSUV9EQzExNzZfVUFSVDAgfQotI2RlZmluZSBQQjExNzZfVUFSVDFfSVJRCXsgSVJRX0RDMTE3Nl9VQVJUMSB9Ci0jZGVmaW5lIFBCMTE3Nl9VQVJUMl9JUlEJeyBJUlFfREMxMTc2X1VBUlQyIH0KLSNkZWZpbmUgUEIxMTc2X1VBUlQzX0lSUQl7IElSUV9EQzExNzZfVUFSVDMgfQotI2RlZmluZSBQQjExNzZfVUFSVDRfSVJRCXsgSVJRX1BCMTE3Nl9VQVJUNCB9Ci0jZGVmaW5lIFBCMTE3Nl9TU1BfSVJRCQl7IElSUV9EQzExNzZfU1NQIH0KLQotLyogRlBHQSBQcmltZWNlbGxzICovCi1BUEJfREVWSUNFKGFhY2ksCSJmcGdhOmFhY2kiLAlBQUNJLAkJTlVMTCk7Ci1BUEJfREVWSUNFKG1tYzAsCSJmcGdhOm1tYzAiLAlNTUNJMCwJCSZyZWFsdmlld19tbWMwX3BsYXRfZGF0YSk7Ci1BUEJfREVWSUNFKGttaTAsCSJmcGdhOmttaTAiLAlLTUkwLAkJTlVMTCk7Ci1BUEJfREVWSUNFKGttaTEsCSJmcGdhOmttaTEiLAlLTUkxLAkJTlVMTCk7Ci1BUEJfREVWSUNFKHVhcnQ0LAkiZnBnYTp1YXJ0NCIsCVBCMTE3Nl9VQVJUNCwJTlVMTCk7Ci0KLS8qIERldkNoaXAgUHJpbWVjZWxscyAqLwotQUhCX0RFVklDRShzbWMsCQkiZGV2OnNtYyIsCVBCMTE3Nl9TTUMsCU5VTEwpOwotQUhCX0RFVklDRShzY3RsLAkiZGV2OnNjdGwiLAlTQ1RMLAkJTlVMTCk7Ci1BUEJfREVWSUNFKHdkb2csCSJkZXY6d2RvZyIsCVBCMTE3Nl9XQVRDSERPRywJTlVMTCk7Ci1BUEJfREVWSUNFKGdwaW8wLAkiZGV2OmdwaW8wIiwJUEIxMTc2X0dQSU8wLAkmZ3BpbzBfcGxhdF9kYXRhKTsKLUFQQl9ERVZJQ0UoZ3BpbzEsCSJkZXY6Z3BpbzEiLAlHUElPMSwJCSZncGlvMV9wbGF0X2RhdGEpOwotQVBCX0RFVklDRShncGlvMiwJImRldjpncGlvMiIsCUdQSU8yLAkJJmdwaW8yX3BsYXRfZGF0YSk7Ci1BUEJfREVWSUNFKHJ0YywJCSJkZXY6cnRjIiwJUEIxMTc2X1JUQywJTlVMTCk7Ci1BUEJfREVWSUNFKHNjaTAsCSJkZXY6c2NpMCIsCVNDSSwJCU5VTEwpOwotQVBCX0RFVklDRSh1YXJ0MCwJImRldjp1YXJ0MCIsCVBCMTE3Nl9VQVJUMCwJTlVMTCk7Ci1BUEJfREVWSUNFKHVhcnQxLAkiZGV2OnVhcnQxIiwJUEIxMTc2X1VBUlQxLAlOVUxMKTsKLUFQQl9ERVZJQ0UodWFydDIsCSJkZXY6dWFydDIiLAlQQjExNzZfVUFSVDIsCU5VTEwpOwotQVBCX0RFVklDRSh1YXJ0MywJImRldjp1YXJ0MyIsCVBCMTE3Nl9VQVJUMywJTlVMTCk7Ci1BUEJfREVWSUNFKHNzcDAsCSJkZXY6c3NwMCIsCVBCMTE3Nl9TU1AsCSZzc3AwX3BsYXRfZGF0YSk7Ci1BSEJfREVWSUNFKGNsY2QsCSJkZXY6Y2xjZCIsCVBCMTE3Nl9DTENELAkmY2xjZF9wbGF0X2RhdGEpOwotCi1zdGF0aWMgc3RydWN0IGFtYmFfZGV2aWNlICphbWJhX2RldnNbXSBfX2luaXRkYXRhID0gewotCSZ1YXJ0MF9kZXZpY2UsCi0JJnVhcnQxX2RldmljZSwKLQkmdWFydDJfZGV2aWNlLAotCSZ1YXJ0M19kZXZpY2UsCi0JJnVhcnQ0X2RldmljZSwKLQkmc21jX2RldmljZSwKLQkmY2xjZF9kZXZpY2UsCi0JJnNjdGxfZGV2aWNlLAotCSZ3ZG9nX2RldmljZSwKLQkmZ3BpbzBfZGV2aWNlLAotCSZncGlvMV9kZXZpY2UsCi0JJmdwaW8yX2RldmljZSwKLQkmcnRjX2RldmljZSwKLQkmc2NpMF9kZXZpY2UsCi0JJnNzcDBfZGV2aWNlLAotCSZhYWNpX2RldmljZSwKLQkmbW1jMF9kZXZpY2UsCi0JJmttaTBfZGV2aWNlLAotCSZrbWkxX2RldmljZSwKLX07Ci0KLS8qCi0gKiBSZWFsVmlldyBQQjExNzYgcGxhdGZvcm0gZGV2aWNlcwotICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHJlYWx2aWV3X3BiMTE3Nl9mbGFzaF9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydAkJPSBSRUFMVklFV19QQjExNzZfRkxBU0hfQkFTRSwKLQkJLmVuZAkJPSBSRUFMVklFV19QQjExNzZfRkxBU0hfQkFTRSArIFJFQUxWSUVXX1BCMTE3Nl9GTEFTSF9TSVpFIC0gMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0jaWZkZWYgQ09ORklHX1JFQUxWSUVXX1BCMTE3Nl9TRUNVUkVfRkxBU0gKLQl7Ci0JCS5zdGFydAkJPSBSRUFMVklFV19QQjExNzZfU0VDX0ZMQVNIX0JBU0UsCi0JCS5lbmQJCT0gUkVBTFZJRVdfUEIxMTc2X1NFQ19GTEFTSF9CQVNFICsgUkVBTFZJRVdfUEIxMTc2X1NFQ19GTEFTSF9TSVpFIC0gMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIHBiMTE3Nl9yb21fcGRhdGEgPSB7Ci0JLnByb2JlX3R5cGUJPSAibWFwX3JvbSIsCi0JLndpZHRoCQk9IDQsCi0JLm5yX3BhcnRzCT0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGIxMTc2X3JvbV9yZXNvdXJjZXNbXSA9IHsKLQkvKgotCSAqIFRoaXMgZXhwb3NlcyB0aGUgUEIxMTc2IERldkNoaXAgUk9NIGFzIGFuIE1URCBST00gbWFwcGluZy4KLQkgKiBUaGUgcmVmZXJlbmNlIG1hbnVhbCBzdGF0ZXMgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgcHNldWRvLVJPTQotCSAqIHByb2dyYW1tZWQgaW4gTlZSQU0uCi0JICovCi0JewotCQkuc3RhcnQJCT0gUkVBTFZJRVdfREMxMTc2X1JPTV9CQVNFLAotCQkuZW5kCQk9IFJFQUxWSUVXX0RDMTE3Nl9ST01fQkFTRSArIFNaXzE2SyAtIDEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBwYjExNzZfcm9tX2RldmljZSA9IHsKLQkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCi0JLmlkCQk9IC0xLAotCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShwYjExNzZfcm9tX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gcGIxMTc2X3JvbV9yZXNvdXJjZXMsCi0JLmRldiA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmcGIxMTc2X3JvbV9wZGF0YSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSByZWFsdmlld19wYjExNzZfc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJCT0gUkVBTFZJRVdfUEIxMTc2X0VUSF9CQVNFLAotCQkuZW5kCQk9IFJFQUxWSUVXX1BCMTE3Nl9FVEhfQkFTRSArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CQk9IElSUV9QQjExNzZfRVRILAotCQkuZW5kCQk9IElSUV9QQjExNzZfRVRILAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcmVhbHZpZXdfcGIxMTc2X2lzcDE3NjFfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJCT0gUkVBTFZJRVdfUEIxMTc2X1VTQl9CQVNFLAotCQkuZW5kCQk9IFJFQUxWSUVXX1BCMTE3Nl9VU0JfQkFTRSArIFNaXzEyOEsgLSAxLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAkJPSBJUlFfUEIxMTc2X1VTQiwKLQkJLmVuZAkJPSBJUlFfUEIxMTc2X1VTQiwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHBtdV9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gSVJRX0RDMTE3Nl9DT1JFX1BNVSwKLQkuZW5kCQk9IElSUV9EQzExNzZfQ09SRV9QTVUsCi0JLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcG11X2RldmljZSA9IHsKLQkubmFtZQkJCT0gImFybXY2LXBtdSIsCi0JLmlkCQkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwkJPSAxLAotCS5yZXNvdXJjZQkJPSAmcG11X3Jlc291cmNlLAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjaGFyX2xjZF9yZXNvdXJjZXNbXSA9IHsKLQl7Ci0JCS5zdGFydCA9IFJFQUxWSUVXX0NIQVJfTENEX0JBU0UsCi0JCS5lbmQgICA9IChSRUFMVklFV19DSEFSX0xDRF9CQVNFICsgU1pfNEsgLSAxKSwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQl7Ci0JCS5zdGFydAk9IElSUV9QQjExNzZfQ0hBUkxDRCwKLQkJLmVuZAk9IElSUV9QQjExNzZfQ0hBUkxDRCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNoYXJfbGNkX2RldmljZSA9IHsKLQkubmFtZQkJPQkiYXJtLWNoYXJsY2QiLAotCS5pZAkJPQktMSwKLQkubnVtX3Jlc291cmNlcwk9CUFSUkFZX1NJWkUoY2hhcl9sY2RfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJPQljaGFyX2xjZF9yZXNvdXJjZXMsCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2ljX2luaXRfaXJxKHZvaWQpCi17Ci0JLyogQVJNMTE3NiBEZXZDaGlwIEdJQywgcHJpbWFyeSAqLwotCWdpY19pbml0KDAsIElSUV9EQzExNzZfR0lDX1NUQVJULAotCQkgX19pb19hZGRyZXNzKFJFQUxWSUVXX0RDMTE3Nl9HSUNfRElTVF9CQVNFKSwKLQkJIF9faW9fYWRkcmVzcyhSRUFMVklFV19EQzExNzZfR0lDX0NQVV9CQVNFKSk7Ci0KLQkvKiBib2FyZCBHSUMsIHNlY29uZGFyeSAqLwotCWdpY19pbml0KDEsIElSUV9QQjExNzZfR0lDX1NUQVJULAotCQkgX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCMTE3Nl9HSUNfRElTVF9CQVNFKSwKLQkJIF9faW9fYWRkcmVzcyhSRUFMVklFV19QQjExNzZfR0lDX0NQVV9CQVNFKSk7Ci0JZ2ljX2Nhc2NhZGVfaXJxKDEsIElSUV9EQzExNzZfUEJfSVJRMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCByZWFsdmlld19wYjExNzZfdGltZXJfaW5pdCh2b2lkKQotewotCXRpbWVyMF92YV9iYXNlID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCMTE3Nl9USU1FUjBfMV9CQVNFKTsKLQl0aW1lcjFfdmFfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19QQjExNzZfVElNRVIwXzFfQkFTRSkgKyAweDIwOwotCXRpbWVyMl92YV9iYXNlID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCMTE3Nl9USU1FUjJfM19CQVNFKTsKLQl0aW1lcjNfdmFfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19QQjExNzZfVElNRVIyXzNfQkFTRSkgKyAweDIwOwotCi0JcmVhbHZpZXdfY2xrX2luaXQoX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19CQVNFKSwgdHJ1ZSk7Ci0JcmVhbHZpZXdfdGltZXJfaW5pdChJUlFfREMxMTc2X1RJTUVSMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWx2aWV3X3BiMTE3Nl9yZXN0YXJ0KGVudW0gcmVib290X21vZGUgbW9kZSwgY29uc3QgY2hhciAqY21kKQotewotCXZvaWQgX19pb21lbSAqcmVzZXRfY3RybCA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfUkVTRVRDVEwpOwotCXZvaWQgX19pb21lbSAqbG9ja19jdHJsID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19MT0NLKTsKLQlfX3Jhd193cml0ZWwoUkVBTFZJRVdfU1lTX0xPQ0tfVkFMLCBsb2NrX2N0cmwpOwotCV9fcmF3X3dyaXRlbChSRUFMVklFV19QQjExNzZfU1lTX1NPRlRfUkVTRVQsIHJlc2V0X2N0cmwpOwotCWRzYigpOwotfQotCi1zdGF0aWMgdm9pZCByZWFsdmlld19wYjExNzZfZml4dXAoc3RydWN0IHRhZyAqdGFncywgY2hhciAqKmZyb20pCi17Ci0JLyoKLQkgKiBSZWFsVmlldyBQQjExNzYgb25seSBoYXMgMTI4TUIgb2YgUkFNIG1hcHBlZCBhdCAwLgotCSAqLwotCW1lbWJsb2NrX2FkZCgwLCBTWl8xMjhNKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHJlYWx2aWV3X3BiMTE3Nl9pbml0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLSNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAotCS8qCi0JICogVGhlIFBMMjIwIG5lZWRzIHRvIGJlIG1hbnVhbGx5IGNvbmZpZ3VyZWQgYXMgdGhlIGhhcmR3YXJlCi0JICogZG9lc24ndCByZXBvcnQgdGhlIGNvcnJlY3Qgc2l6ZXMuCi0JICogMTI4a0IgKDE2a0Ivd2F5KSwgOC13YXkgYXNzb2NpYXRpdml0eSwgZXZlbnQgbW9uaXRvciBhbmQKLQkgKiBwYXJpdHkgZW5hYmxlZCwgaWdub3JlIHNoYXJlIGJpdCwgbm8gZm9yY2Ugd3JpdGUgYWxsb2NhdGUKLQkgKiBCaXRzOiAgLi4uLiAuLi4wIDAxMTEgMDAxMSAwMDAwIC4uLi4gLi4uLiAuLi4uCi0JICovCi0JbDJ4MF9pbml0KF9faW9fYWRkcmVzcyhSRUFMVklFV19QQjExNzZfTDIyMF9CQVNFKSwgMHgwMDczMDAwMCwgMHhmZTAwMGZmZik7Ci0jZW5kaWYKLQotCXJlYWx2aWV3X2ZsYXNoX3JlZ2lzdGVyKHJlYWx2aWV3X3BiMTE3Nl9mbGFzaF9yZXNvdXJjZXMsCi0JCQkJQVJSQVlfU0laRShyZWFsdmlld19wYjExNzZfZmxhc2hfcmVzb3VyY2VzKSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwYjExNzZfcm9tX2RldmljZSk7Ci0JcmVhbHZpZXdfZXRoX3JlZ2lzdGVyKE5VTEwsIHJlYWx2aWV3X3BiMTE3Nl9zbXNjOTExeF9yZXNvdXJjZXMpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfaTJjX2RldmljZSk7Ci0JcmVhbHZpZXdfdXNiX3JlZ2lzdGVyKHJlYWx2aWV3X3BiMTE3Nl9pc3AxNzYxX3Jlc291cmNlcyk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwbXVfZGV2aWNlKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmNoYXJfbGNkX2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyZWFsdmlld19sZWRzX2RldmljZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbWJhX2RldnMpOyBpKyspIHsKLQkJc3RydWN0IGFtYmFfZGV2aWNlICpkID0gYW1iYV9kZXZzW2ldOwotCQlhbWJhX2RldmljZV9yZWdpc3RlcihkLCAmaW9tZW1fcmVzb3VyY2UpOwotCX0KLX0KLQotTUFDSElORV9TVEFSVChSRUFMVklFV19QQjExNzYsICJBUk0tUmVhbFZpZXcgUEIxMTc2IikKLQkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCi0JLmZpeHVwCQk9IHJlYWx2aWV3X3BiMTE3Nl9maXh1cCwKLQkubWFwX2lvCQk9IHJlYWx2aWV3X3BiMTE3Nl9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSByZWFsdmlld19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGdpY19pbml0X2lycSwKLQkuaW5pdF90aW1lCT0gcmVhbHZpZXdfcGIxMTc2X3RpbWVyX2luaXQsCi0JLmluaXRfbWFjaGluZQk9IHJlYWx2aWV3X3BiMTE3Nl9pbml0LAotI2lmZGVmIENPTkZJR19aT05FX0RNQQotCS5kbWFfem9uZV9zaXplCT0gU1pfMjU2TSwKLSNlbmRpZgotCS5yZXN0YXJ0CT0gcmVhbHZpZXdfcGIxMTc2X3Jlc3RhcnQsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMW1wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MGEwNzUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYjExbXAuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGIxMW1wLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA4IEFSTSBMaW1pdGVkCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KLSNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9tbWNpLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9wbDAyMi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxY2hpcC9hcm0tZ2ljLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9jbGstcmVhbHZpZXcuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLQotI2luY2x1ZGUgImhhcmR3YXJlLmgiCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2FjaGUtbDJ4MC5oPgotI2luY2x1ZGUgPGFzbS9zbXBfdHdkLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvZmxhc2guaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL291dGVyY2FjaGUuaD4KLQotI2luY2x1ZGUgImJvYXJkLXBiMTFtcC5oIgotI2luY2x1ZGUgImlycXMtcGIxMW1wLmgiCi0KLSNpbmNsdWRlICJjb3JlLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgcmVhbHZpZXdfcGIxMW1wX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX1NZU19CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1NZU19CQVNFKSwKLQkJLmxlbmd0aAkJPSBTWl80SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX1BCMTFNUF9HSUNfQ1BVX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfUEIxMU1QX0dJQ19DUFVfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQjExTVBfR0lDX0RJU1RfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQjExTVBfR0lDX0RJU1RfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7CS8qIE1hcHMgdGhlIFNDVSwgR0lDIENQVSBpbnRlcmZhY2UsIFRXRCwgR0lDIERJU1QgKi8KLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX1RDMTFNUF9QUklWX01FTV9CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1RDMTFNUF9QUklWX01FTV9CQVNFKSwKLQkJLmxlbmd0aAkJPSBSRUFMVklFV19UQzExTVBfUFJJVl9NRU1fU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX1NDVExfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19TQ1RMX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfUEIxMU1QX1RJTUVSMF8xX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfUEIxMU1QX1RJTUVSMF8xX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfUEIxMU1QX1RJTUVSMl8zX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfUEIxMU1QX1RJTUVSMl8zX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfVEMxMU1QX0wyMjBfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19UQzExTVBfTDIyMF9CQVNFKSwKLQkJLmxlbmd0aAkJPSBTWl84SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi0jaWZkZWYgQ09ORklHX0RFQlVHX0xMCi0JewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfUEIxMU1QX1VBUlQwX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfUEIxMU1QX1VBUlQwX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLSNlbmRpZgotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHJlYWx2aWV3X3BiMTFtcF9tYXBfaW8odm9pZCkKLXsKLQlpb3RhYmxlX2luaXQocmVhbHZpZXdfcGIxMW1wX2lvX2Rlc2MsIEFSUkFZX1NJWkUocmVhbHZpZXdfcGIxMW1wX2lvX2Rlc2MpKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbDA2MV9wbGF0Zm9ybV9kYXRhIGdwaW8wX3BsYXRfZGF0YSA9IHsKLQkuZ3Bpb19iYXNlCT0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGwwNjFfcGxhdGZvcm1fZGF0YSBncGlvMV9wbGF0X2RhdGEgPSB7Ci0JLmdwaW9fYmFzZQk9IDgsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsMDYxX3BsYXRmb3JtX2RhdGEgZ3BpbzJfcGxhdF9kYXRhID0gewotCS5ncGlvX2Jhc2UJPSAxNiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGwwMjJfc3NwX2NvbnRyb2xsZXIgc3NwMF9wbGF0X2RhdGEgPSB7Ci0JLmJ1c19pZCA9IDAsCi0JLmVuYWJsZV9kbWEgPSAwLAotCS5udW1fY2hpcHNlbGVjdCA9IDEsCi19OwotCi0vKgotICogUmVhbFZpZXcgUEIxMU1QQ29yZSBBTUJBIGRldmljZXMKLSAqLwotCi0jZGVmaW5lIEdQSU8yX0lSUQkJeyBJUlFfUEIxMU1QX0dQSU8yIH0KLSNkZWZpbmUgR1BJTzNfSVJRCQl7IElSUV9QQjExTVBfR1BJTzMgfQotI2RlZmluZSBBQUNJX0lSUQkJeyBJUlFfVEMxMU1QX0FBQ0kgfQotI2RlZmluZSBNTUNJMF9JUlEJCXsgSVJRX1RDMTFNUF9NTUNJMEEsIElSUV9UQzExTVBfTU1DSTBCIH0KLSNkZWZpbmUgS01JMF9JUlEJCXsgSVJRX1RDMTFNUF9LTUkwIH0KLSNkZWZpbmUgS01JMV9JUlEJCXsgSVJRX1RDMTFNUF9LTUkxIH0KLSNkZWZpbmUgUEIxMU1QX1NNQ19JUlEJCXsgfQotI2RlZmluZSBNUE1DX0lSUQkJeyB9Ci0jZGVmaW5lIFBCMTFNUF9DTENEX0lSUQkJeyBJUlFfUEIxMU1QX0NMQ0QgfQotI2RlZmluZSBETUFDX0lSUQkJeyBJUlFfUEIxMU1QX0RNQUMgfQotI2RlZmluZSBTQ1RMX0lSUQkJeyB9Ci0jZGVmaW5lIFBCMTFNUF9XQVRDSERPR19JUlEJeyBJUlFfUEIxMU1QX1dBVENIRE9HIH0KLSNkZWZpbmUgUEIxMU1QX0dQSU8wX0lSUQl7IElSUV9QQjExTVBfR1BJTzAgfQotI2RlZmluZSBHUElPMV9JUlEJCXsgSVJRX1BCMTFNUF9HUElPMSB9Ci0jZGVmaW5lIFBCMTFNUF9SVENfSVJRCQl7IElSUV9UQzExTVBfUlRDIH0KLSNkZWZpbmUgU0NJX0lSUQkJCXsgSVJRX1BCMTFNUF9TQ0kgfQotI2RlZmluZSBQQjExTVBfVUFSVDBfSVJRCXsgSVJRX1RDMTFNUF9VQVJUMCB9Ci0jZGVmaW5lIFBCMTFNUF9VQVJUMV9JUlEJeyBJUlFfVEMxMU1QX1VBUlQxIH0KLSNkZWZpbmUgUEIxMU1QX1VBUlQyX0lSUQl7IElSUV9QQjExTVBfVUFSVDIgfQotI2RlZmluZSBQQjExTVBfVUFSVDNfSVJRCXsgSVJRX1BCMTFNUF9VQVJUMyB9Ci0jZGVmaW5lIFBCMTFNUF9TU1BfSVJRCQl7IElSUV9QQjExTVBfU1NQIH0KLQotLyogRlBHQSBQcmltZWNlbGxzICovCi1BUEJfREVWSUNFKGFhY2ksCSJmcGdhOmFhY2kiLAlBQUNJLAkJTlVMTCk7Ci1BUEJfREVWSUNFKG1tYzAsCSJmcGdhOm1tYzAiLAlNTUNJMCwJCSZyZWFsdmlld19tbWMwX3BsYXRfZGF0YSk7Ci1BUEJfREVWSUNFKGttaTAsCSJmcGdhOmttaTAiLAlLTUkwLAkJTlVMTCk7Ci1BUEJfREVWSUNFKGttaTEsCSJmcGdhOmttaTEiLAlLTUkxLAkJTlVMTCk7Ci1BUEJfREVWSUNFKHVhcnQzLAkiZnBnYTp1YXJ0MyIsCVBCMTFNUF9VQVJUMywJTlVMTCk7Ci0KLS8qIERldkNoaXAgUHJpbWVjZWxscyAqLwotQUhCX0RFVklDRShzbWMsCQkiZGV2OnNtYyIsCVBCMTFNUF9TTUMsCU5VTEwpOwotQUhCX0RFVklDRShzY3RsLAkiZGV2OnNjdGwiLAlTQ1RMLAkJTlVMTCk7Ci1BUEJfREVWSUNFKHdkb2csCSJkZXY6d2RvZyIsCVBCMTFNUF9XQVRDSERPRywgTlVMTCk7Ci1BUEJfREVWSUNFKGdwaW8wLAkiZGV2OmdwaW8wIiwJUEIxMU1QX0dQSU8wLAkmZ3BpbzBfcGxhdF9kYXRhKTsKLUFQQl9ERVZJQ0UoZ3BpbzEsCSJkZXY6Z3BpbzEiLAlHUElPMSwJCSZncGlvMV9wbGF0X2RhdGEpOwotQVBCX0RFVklDRShncGlvMiwJImRldjpncGlvMiIsCUdQSU8yLAkJJmdwaW8yX3BsYXRfZGF0YSk7Ci1BUEJfREVWSUNFKHJ0YywJCSJkZXY6cnRjIiwJUEIxMU1QX1JUQywJTlVMTCk7Ci1BUEJfREVWSUNFKHNjaTAsCSJkZXY6c2NpMCIsCVNDSSwJCU5VTEwpOwotQVBCX0RFVklDRSh1YXJ0MCwJImRldjp1YXJ0MCIsCVBCMTFNUF9VQVJUMCwJTlVMTCk7Ci1BUEJfREVWSUNFKHVhcnQxLAkiZGV2OnVhcnQxIiwJUEIxMU1QX1VBUlQxLAlOVUxMKTsKLUFQQl9ERVZJQ0UodWFydDIsCSJkZXY6dWFydDIiLAlQQjExTVBfVUFSVDIsCU5VTEwpOwotQVBCX0RFVklDRShzc3AwLAkiZGV2OnNzcDAiLAlQQjExTVBfU1NQLAkmc3NwMF9wbGF0X2RhdGEpOwotCi0vKiBQcmltZWNlbGxzIG9uIHRoZSBORUMgSVNTUCBjaGlwICovCi1BSEJfREVWSUNFKGNsY2QsCSJpc3NwOmNsY2QiLAlQQjExTVBfQ0xDRCwJJmNsY2RfcGxhdF9kYXRhKTsKLUFIQl9ERVZJQ0UoZG1hYywJImlzc3A6ZG1hYyIsCURNQUMsCQlOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSAqYW1iYV9kZXZzW10gX19pbml0ZGF0YSA9IHsKLQkmZG1hY19kZXZpY2UsCi0JJnVhcnQwX2RldmljZSwKLQkmdWFydDFfZGV2aWNlLAotCSZ1YXJ0Ml9kZXZpY2UsCi0JJnVhcnQzX2RldmljZSwKLQkmc21jX2RldmljZSwKLQkmY2xjZF9kZXZpY2UsCi0JJnNjdGxfZGV2aWNlLAotCSZ3ZG9nX2RldmljZSwKLQkmZ3BpbzBfZGV2aWNlLAotCSZncGlvMV9kZXZpY2UsCi0JJmdwaW8yX2RldmljZSwKLQkmcnRjX2RldmljZSwKLQkmc2NpMF9kZXZpY2UsCi0JJnNzcDBfZGV2aWNlLAotCSZhYWNpX2RldmljZSwKLQkmbW1jMF9kZXZpY2UsCi0JJmttaTBfZGV2aWNlLAotCSZrbWkxX2RldmljZSwKLX07Ci0KLS8qCi0gKiBSZWFsVmlldyBQQjExTVBDb3JlIHBsYXRmb3JtIGRldmljZXMKLSAqLwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSByZWFsdmlld19wYjExbXBfZmxhc2hfcmVzb3VyY2VbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAkJPSBSRUFMVklFV19QQjExTVBfRkxBU0gwX0JBU0UsCi0JCS5lbmQJCT0gUkVBTFZJRVdfUEIxMU1QX0ZMQVNIMF9CQVNFICsgUkVBTFZJRVdfUEIxMU1QX0ZMQVNIMF9TSVpFIC0gMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJCT0gUkVBTFZJRVdfUEIxMU1QX0ZMQVNIMV9CQVNFLAotCQkuZW5kCQk9IFJFQUxWSUVXX1BCMTFNUF9GTEFTSDFfQkFTRSArIFJFQUxWSUVXX1BCMTFNUF9GTEFTSDFfU0laRSAtIDEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSByZWFsdmlld19wYjExbXBfc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJCT0gUkVBTFZJRVdfUEIxMU1QX0VUSF9CQVNFLAotCQkuZW5kCQk9IFJFQUxWSUVXX1BCMTFNUF9FVEhfQkFTRSArIFNaXzY0SyAtIDEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CQk9IElSUV9UQzExTVBfRVRILAotCQkuZW5kCQk9IElSUV9UQzExTVBfRVRILAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcmVhbHZpZXdfcGIxMW1wX2lzcDE3NjFfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJCT0gUkVBTFZJRVdfUEIxMU1QX1VTQl9CQVNFLAotCQkuZW5kCQk9IFJFQUxWSUVXX1BCMTFNUF9VU0JfQkFTRSArIFNaXzEyOEsgLSAxLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAkJPSBJUlFfVEMxMU1QX1VTQiwKLQkJLmVuZAkJPSBJUlFfVEMxMU1QX1VTQiwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHBtdV9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAkJPSBJUlFfVEMxMU1QX1BNVV9DUFUwLAotCQkuZW5kCQk9IElSUV9UQzExTVBfUE1VX0NQVTAsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CQk9IElSUV9UQzExTVBfUE1VX0NQVTEsCi0JCS5lbmQJCT0gSVJRX1RDMTFNUF9QTVVfQ1BVMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzJdID0gewotCQkuc3RhcnQJCT0gSVJRX1RDMTFNUF9QTVVfQ1BVMiwKLQkJLmVuZAkJPSBJUlFfVEMxMU1QX1BNVV9DUFUyLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbM10gPSB7Ci0JCS5zdGFydAkJPSBJUlFfVEMxMU1QX1BNVV9DUFUzLAotCQkuZW5kCQk9IElSUV9UQzExTVBfUE1VX0NQVTMsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcG11X2RldmljZSA9IHsKLQkubmFtZQkJCT0gImFybXY2LXBtdSIsCi0JLmlkCQkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwkJPSBBUlJBWV9TSVpFKHBtdV9yZXNvdXJjZXMpLAotCS5yZXNvdXJjZQkJPSBwbXVfcmVzb3VyY2VzLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IGdpY19pbml0X2lycSh2b2lkKQotewotCXVuc2lnbmVkIGludCBwbGRjdHJsOwotCi0JLyogbmV3IGlycSBtb2RlIHdpdGggbm8gRENDICovCi0Jd3JpdGVsKDB4MDAwMGEwNWYsIF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfTE9DSykpOwotCXBsZGN0cmwgPSByZWFkbChfX2lvX2FkZHJlc3MoUkVBTFZJRVdfU1lTX0JBU0UpCSsgUkVBTFZJRVdfUEIxMU1QX1NZU19QTERfQ1RSTDEpOwotCXBsZGN0cmwgfD0gMiA8PCAyMjsKLQl3cml0ZWwocGxkY3RybCwgX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19CQVNFKSArIFJFQUxWSUVXX1BCMTFNUF9TWVNfUExEX0NUUkwxKTsKLQl3cml0ZWwoMHgwMDAwMDAwMCwgX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19MT0NLKSk7Ci0KLQkvKiBBUk0xMU1QQ29yZSB0ZXN0IGNoaXAgR0lDLCBwcmltYXJ5ICovCi0JZ2ljX2luaXQoMCwgMjksIF9faW9fYWRkcmVzcyhSRUFMVklFV19UQzExTVBfR0lDX0RJU1RfQkFTRSksCi0JCSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfVEMxMU1QX0dJQ19DUFVfQkFTRSkpOwotCi0JLyogYm9hcmQgR0lDLCBzZWNvbmRhcnkgKi8KLQlnaWNfaW5pdCgxLCBJUlFfUEIxMU1QX0dJQ19TVEFSVCwKLQkJIF9faW9fYWRkcmVzcyhSRUFMVklFV19QQjExTVBfR0lDX0RJU1RfQkFTRSksCi0JCSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfUEIxMU1QX0dJQ19DUFVfQkFTRSkpOwotCWdpY19jYXNjYWRlX2lycSgxLCBJUlFfVEMxMU1QX1BCX0lSUTEpOwotfQotCi0jaWZkZWYgQ09ORklHX0hBVkVfQVJNX1RXRAotc3RhdGljIERFRklORV9UV0RfTE9DQUxfVElNRVIodHdkX2xvY2FsX3RpbWVyLAotCQkJICAgICAgUkVBTFZJRVdfVEMxMU1QX1RXRF9CQVNFLAotCQkJICAgICAgSVJRX0xPQ0FMVElNRVIpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVhbHZpZXdfcGIxMW1wX3R3ZF9pbml0KHZvaWQpCi17Ci0JaW50IGVyciA9IHR3ZF9sb2NhbF90aW1lcl9yZWdpc3RlcigmdHdkX2xvY2FsX3RpbWVyKTsKLQlpZiAoZXJyKQotCQlwcl9lcnIoInR3ZF9sb2NhbF90aW1lcl9yZWdpc3RlciBmYWlsZWQgJWRcbiIsIGVycik7Ci19Ci0jZWxzZQotI2RlZmluZSByZWFsdmlld19wYjExbXBfdHdkX2luaXQoKQlkbyB7fSB3aGlsZSgwKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIF9faW5pdCByZWFsdmlld19wYjExbXBfdGltZXJfaW5pdCh2b2lkKQotewotCXRpbWVyMF92YV9iYXNlID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCMTFNUF9USU1FUjBfMV9CQVNFKTsKLQl0aW1lcjFfdmFfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19QQjExTVBfVElNRVIwXzFfQkFTRSkgKyAweDIwOwotCXRpbWVyMl92YV9iYXNlID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCMTFNUF9USU1FUjJfM19CQVNFKTsKLQl0aW1lcjNfdmFfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19QQjExTVBfVElNRVIyXzNfQkFTRSkgKyAweDIwOwotCi0JcmVhbHZpZXdfY2xrX2luaXQoX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19CQVNFKSwgZmFsc2UpOwotCXJlYWx2aWV3X3RpbWVyX2luaXQoSVJRX1RDMTFNUF9USU1FUjBfMSk7Ci0JcmVhbHZpZXdfcGIxMW1wX3R3ZF9pbml0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWx2aWV3X3BiMTFtcF9yZXN0YXJ0KGVudW0gcmVib290X21vZGUgbW9kZSwgY29uc3QgY2hhciAqY21kKQotewotCXZvaWQgX19pb21lbSAqcmVzZXRfY3RybCA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfUkVTRVRDVEwpOwotCXZvaWQgX19pb21lbSAqbG9ja19jdHJsID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19MT0NLKTsKLQotCS8qCi0JICogVG8gcmVzZXQsIHdlIGhpdCB0aGUgb24tYm9hcmQgcmVzZXQgcmVnaXN0ZXIKLQkgKiBpbiB0aGUgc3lzdGVtIEZQR0EKLQkgKi8KLQlfX3Jhd193cml0ZWwoUkVBTFZJRVdfU1lTX0xPQ0tfVkFMLCBsb2NrX2N0cmwpOwotCV9fcmF3X3dyaXRlbCgweDAwMDAsIHJlc2V0X2N0cmwpOwotCV9fcmF3X3dyaXRlbCgweDAwMDQsIHJlc2V0X2N0cmwpOwotCWRzYigpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVhbHZpZXdfcGIxMW1wX2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwCi0JLyoKLQkgKiBUaGUgUEwyMjAgbmVlZHMgdG8gYmUgbWFudWFsbHkgY29uZmlndXJlZCBhcyB0aGUgaGFyZHdhcmUKLQkgKiBkb2Vzbid0IHJlcG9ydCB0aGUgY29ycmVjdCBzaXplcy4KLQkgKiAxTUIgKDEyOEtCL3dheSksIDgtd2F5IGFzc29jaWF0aXZpdHksIGV2ZW50IG1vbml0b3IgYW5kCi0JICogcGFyaXR5IGVuYWJsZWQsIGlnbm9yZSBzaGFyZSBiaXQsIG5vIGZvcmNlIHdyaXRlIGFsbG9jYXRlCi0JICogQml0czogIC4uLi4gLi4uMCAwMTExIDEwMDEgMDAwMCAuLi4uIC4uLi4gLi4uLgotCSAqLwotCWwyeDBfaW5pdChfX2lvX2FkZHJlc3MoUkVBTFZJRVdfVEMxMU1QX0wyMjBfQkFTRSksIDB4MDA3OTAwMDAsIDB4ZmUwMDBmZmYpOwotCS8qCi0JICogZHVlIHRvIGEgYnVnIGluIHRoZSBsMjIwIGNhY2hlIGNvbnRyb2xsZXIsIHdlIG11c3Qgbm90IGNhbGwKLQkgKiB0aGUgc3luYyBmdW5jdGlvbi4gc3R1YiBpdCBvdXQgaGVyZSBpbnN0ZWFkIQotCSAqLwotCW91dGVyX2NhY2hlLnN5bmMgPSBOVUxMOwotI2VuZGlmCi0KLQlyZWFsdmlld19mbGFzaF9yZWdpc3RlcihyZWFsdmlld19wYjExbXBfZmxhc2hfcmVzb3VyY2UsCi0JCQkJQVJSQVlfU0laRShyZWFsdmlld19wYjExbXBfZmxhc2hfcmVzb3VyY2UpKTsKLQlyZWFsdmlld19ldGhfcmVnaXN0ZXIoTlVMTCwgcmVhbHZpZXdfcGIxMW1wX3Ntc2M5MTF4X3Jlc291cmNlcyk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyZWFsdmlld19pMmNfZGV2aWNlKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJlYWx2aWV3X2NmX2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyZWFsdmlld19sZWRzX2RldmljZSk7Ci0JcmVhbHZpZXdfdXNiX3JlZ2lzdGVyKHJlYWx2aWV3X3BiMTFtcF9pc3AxNzYxX3Jlc291cmNlcyk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwbXVfZGV2aWNlKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFtYmFfZGV2cyk7IGkrKykgewotCQlzdHJ1Y3QgYW1iYV9kZXZpY2UgKmQgPSBhbWJhX2RldnNbaV07Ci0JCWFtYmFfZGV2aWNlX3JlZ2lzdGVyKGQsICZpb21lbV9yZXNvdXJjZSk7Ci0JfQotfQotCi1NQUNISU5FX1NUQVJUKFJFQUxWSUVXX1BCMTFNUCwgIkFSTS1SZWFsVmlldyBQQjExTVBDb3JlIikKLQkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCi0JLnNtcAkJPSBzbXBfb3BzKHJlYWx2aWV3X3NtcF9vcHMpLAotCS5maXh1cAkJPSByZWFsdmlld19maXh1cCwKLQkubWFwX2lvCQk9IHJlYWx2aWV3X3BiMTFtcF9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSByZWFsdmlld19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGdpY19pbml0X2lycSwKLQkuaW5pdF90aW1lCT0gcmVhbHZpZXdfcGIxMW1wX3RpbWVyX2luaXQsCi0JLmluaXRfbWFjaGluZQk9IHJlYWx2aWV3X3BiMTFtcF9pbml0LAotI2lmZGVmIENPTkZJR19aT05FX0RNQQotCS5kbWFfem9uZV9zaXplCT0gU1pfMjU2TSwKLSNlbmRpZgotCS5yZXN0YXJ0CT0gcmVhbHZpZXdfcGIxMW1wX3Jlc3RhcnQsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYmE4LmMgYi9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiYTguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhZmI2Ny4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9tYWNoLXJlYWx2aWV3L3JlYWx2aWV3X3BiYTguYworKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJhOC5jCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOCBBUk0gTGltaXRlZAotICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9wbDA2MS5oPgotI2luY2x1ZGUgPGxpbnV4L2FtYmEvbW1jaS5oPgotI2luY2x1ZGUgPGxpbnV4L2FtYmEvcGwwMjIuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvYXJtLWdpYy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvY2xrLXJlYWx2aWV3Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmVib290Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KLQotI2luY2x1ZGUgImhhcmR3YXJlLmgiCi0jaW5jbHVkZSAiYm9hcmQtcGJhOC5oIgotI2luY2x1ZGUgImlycXMtcGJhOC5oIgotCi0jaW5jbHVkZSAiY29yZS5oIgotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIHJlYWx2aWV3X3BiYThfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfU1lTX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfU1lTX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfUEJBOF9HSUNfQ1BVX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfUEJBOF9HSUNfQ1BVX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfUEJBOF9HSUNfRElTVF9CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1BCQThfR0lDX0RJU1RfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19TQ1RMX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfU0NUTF9CQVNFKSwKLQkJLmxlbmd0aAkJPSBTWl80SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX1BCQThfVElNRVIwXzFfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQkE4X1RJTUVSMF8xX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfUEJBOF9USU1FUjJfM19CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1BCQThfVElNRVIyXzNfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LAotI2lmZGVmIENPTkZJR19ERUJVR19MTAotCXsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX1BCQThfVUFSVDBfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQkE4X1VBUlQwX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLSNlbmRpZgotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHJlYWx2aWV3X3BiYThfbWFwX2lvKHZvaWQpCi17Ci0JaW90YWJsZV9pbml0KHJlYWx2aWV3X3BiYThfaW9fZGVzYywgQVJSQVlfU0laRShyZWFsdmlld19wYmE4X2lvX2Rlc2MpKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbDA2MV9wbGF0Zm9ybV9kYXRhIGdwaW8wX3BsYXRfZGF0YSA9IHsKLQkuZ3Bpb19iYXNlCT0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGwwNjFfcGxhdGZvcm1fZGF0YSBncGlvMV9wbGF0X2RhdGEgPSB7Ci0JLmdwaW9fYmFzZQk9IDgsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsMDYxX3BsYXRmb3JtX2RhdGEgZ3BpbzJfcGxhdF9kYXRhID0gewotCS5ncGlvX2Jhc2UJPSAxNiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGwwMjJfc3NwX2NvbnRyb2xsZXIgc3NwMF9wbGF0X2RhdGEgPSB7Ci0JLmJ1c19pZCA9IDAsCi0JLmVuYWJsZV9kbWEgPSAwLAotCS5udW1fY2hpcHNlbGVjdCA9IDEsCi19OwotCi0vKgotICogUmVhbFZpZXcgUEJBOENvcmUgQU1CQSBkZXZpY2VzCi0gKi8KLQotI2RlZmluZSBHUElPMl9JUlEJCXsgSVJRX1BCQThfR1BJTzIgfQotI2RlZmluZSBHUElPM19JUlEJCXsgSVJRX1BCQThfR1BJTzMgfQotI2RlZmluZSBBQUNJX0lSUQkJeyBJUlFfUEJBOF9BQUNJIH0KLSNkZWZpbmUgTU1DSTBfSVJRCQl7IElSUV9QQkE4X01NQ0kwQSwgSVJRX1BCQThfTU1DSTBCIH0KLSNkZWZpbmUgS01JMF9JUlEJCXsgSVJRX1BCQThfS01JMCB9Ci0jZGVmaW5lIEtNSTFfSVJRCQl7IElSUV9QQkE4X0tNSTEgfQotI2RlZmluZSBQQkE4X1NNQ19JUlEJCXsgfQotI2RlZmluZSBNUE1DX0lSUQkJeyB9Ci0jZGVmaW5lIFBCQThfQ0xDRF9JUlEJCXsgSVJRX1BCQThfQ0xDRCB9Ci0jZGVmaW5lIERNQUNfSVJRCQl7IElSUV9QQkE4X0RNQUMgfQotI2RlZmluZSBTQ1RMX0lSUQkJeyB9Ci0jZGVmaW5lIFBCQThfV0FUQ0hET0dfSVJRCXsgSVJRX1BCQThfV0FUQ0hET0cgfQotI2RlZmluZSBQQkE4X0dQSU8wX0lSUQkJeyBJUlFfUEJBOF9HUElPMCB9Ci0jZGVmaW5lIEdQSU8xX0lSUQkJeyBJUlFfUEJBOF9HUElPMSB9Ci0jZGVmaW5lIFBCQThfUlRDX0lSUQkJeyBJUlFfUEJBOF9SVEMgfQotI2RlZmluZSBTQ0lfSVJRCQkJeyBJUlFfUEJBOF9TQ0kgfQotI2RlZmluZSBQQkE4X1VBUlQwX0lSUQkJeyBJUlFfUEJBOF9VQVJUMCB9Ci0jZGVmaW5lIFBCQThfVUFSVDFfSVJRCQl7IElSUV9QQkE4X1VBUlQxIH0KLSNkZWZpbmUgUEJBOF9VQVJUMl9JUlEJCXsgSVJRX1BCQThfVUFSVDIgfQotI2RlZmluZSBQQkE4X1VBUlQzX0lSUQkJeyBJUlFfUEJBOF9VQVJUMyB9Ci0jZGVmaW5lIFBCQThfU1NQX0lSUQkJeyBJUlFfUEJBOF9TU1AgfQotCi0vKiBGUEdBIFByaW1lY2VsbHMgKi8KLUFQQl9ERVZJQ0UoYWFjaSwJImZwZ2E6YWFjaSIsCUFBQ0ksCQlOVUxMKTsKLUFQQl9ERVZJQ0UobW1jMCwJImZwZ2E6bW1jMCIsCU1NQ0kwLAkJJnJlYWx2aWV3X21tYzBfcGxhdF9kYXRhKTsKLUFQQl9ERVZJQ0Uoa21pMCwJImZwZ2E6a21pMCIsCUtNSTAsCQlOVUxMKTsKLUFQQl9ERVZJQ0Uoa21pMSwJImZwZ2E6a21pMSIsCUtNSTEsCQlOVUxMKTsKLUFQQl9ERVZJQ0UodWFydDMsCSJmcGdhOnVhcnQzIiwJUEJBOF9VQVJUMywJTlVMTCk7Ci0KLS8qIERldkNoaXAgUHJpbWVjZWxscyAqLwotQUhCX0RFVklDRShzbWMsCQkiZGV2OnNtYyIsCVBCQThfU01DLAlOVUxMKTsKLUFIQl9ERVZJQ0Uoc2N0bCwJImRldjpzY3RsIiwJU0NUTCwJCU5VTEwpOwotQVBCX0RFVklDRSh3ZG9nLAkiZGV2Ondkb2ciLAlQQkE4X1dBVENIRE9HLCBOVUxMKTsKLUFQQl9ERVZJQ0UoZ3BpbzAsCSJkZXY6Z3BpbzAiLAlQQkE4X0dQSU8wLAkmZ3BpbzBfcGxhdF9kYXRhKTsKLUFQQl9ERVZJQ0UoZ3BpbzEsCSJkZXY6Z3BpbzEiLAlHUElPMSwJCSZncGlvMV9wbGF0X2RhdGEpOwotQVBCX0RFVklDRShncGlvMiwJImRldjpncGlvMiIsCUdQSU8yLAkJJmdwaW8yX3BsYXRfZGF0YSk7Ci1BUEJfREVWSUNFKHJ0YywJCSJkZXY6cnRjIiwJUEJBOF9SVEMsCU5VTEwpOwotQVBCX0RFVklDRShzY2kwLAkiZGV2OnNjaTAiLAlTQ0ksCQlOVUxMKTsKLUFQQl9ERVZJQ0UodWFydDAsCSJkZXY6dWFydDAiLAlQQkE4X1VBUlQwLAlOVUxMKTsKLUFQQl9ERVZJQ0UodWFydDEsCSJkZXY6dWFydDEiLAlQQkE4X1VBUlQxLAlOVUxMKTsKLUFQQl9ERVZJQ0UodWFydDIsCSJkZXY6dWFydDIiLAlQQkE4X1VBUlQyLAlOVUxMKTsKLUFQQl9ERVZJQ0Uoc3NwMCwJImRldjpzc3AwIiwJUEJBOF9TU1AsCSZzc3AwX3BsYXRfZGF0YSk7Ci0KLS8qIFByaW1lY2VsbHMgb24gdGhlIE5FQyBJU1NQIGNoaXAgKi8KLUFIQl9ERVZJQ0UoY2xjZCwJImlzc3A6Y2xjZCIsCVBCQThfQ0xDRCwJJmNsY2RfcGxhdF9kYXRhKTsKLUFIQl9ERVZJQ0UoZG1hYywJImlzc3A6ZG1hYyIsCURNQUMsCQlOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSAqYW1iYV9kZXZzW10gX19pbml0ZGF0YSA9IHsKLQkmZG1hY19kZXZpY2UsCi0JJnVhcnQwX2RldmljZSwKLQkmdWFydDFfZGV2aWNlLAotCSZ1YXJ0Ml9kZXZpY2UsCi0JJnVhcnQzX2RldmljZSwKLQkmc21jX2RldmljZSwKLQkmY2xjZF9kZXZpY2UsCi0JJnNjdGxfZGV2aWNlLAotCSZ3ZG9nX2RldmljZSwKLQkmZ3BpbzBfZGV2aWNlLAotCSZncGlvMV9kZXZpY2UsCi0JJmdwaW8yX2RldmljZSwKLQkmcnRjX2RldmljZSwKLQkmc2NpMF9kZXZpY2UsCi0JJnNzcDBfZGV2aWNlLAotCSZhYWNpX2RldmljZSwKLQkmbW1jMF9kZXZpY2UsCi0JJmttaTBfZGV2aWNlLAotCSZrbWkxX2RldmljZSwKLX07Ci0KLS8qCi0gKiBSZWFsVmlldyBQQi1BOCBwbGF0Zm9ybSBkZXZpY2VzCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcmVhbHZpZXdfcGJhOF9mbGFzaF9yZXNvdXJjZVtdID0gewotCVswXSA9IHsKLQkJLnN0YXJ0CQk9IFJFQUxWSUVXX1BCQThfRkxBU0gwX0JBU0UsCi0JCS5lbmQJCT0gUkVBTFZJRVdfUEJBOF9GTEFTSDBfQkFTRSArIFJFQUxWSUVXX1BCQThfRkxBU0gwX1NJWkUgLSAxLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAkJPSBSRUFMVklFV19QQkE4X0ZMQVNIMV9CQVNFLAotCQkuZW5kCQk9IFJFQUxWSUVXX1BCQThfRkxBU0gxX0JBU0UgKyBSRUFMVklFV19QQkE4X0ZMQVNIMV9TSVpFIC0gMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHJlYWx2aWV3X3BiYThfc21zYzkxMXhfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJCT0gUkVBTFZJRVdfUEJBOF9FVEhfQkFTRSwKLQkJLmVuZAkJPSBSRUFMVklFV19QQkE4X0VUSF9CQVNFICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJCT0gSVJRX1BCQThfRVRILAotCQkuZW5kCQk9IElSUV9QQkE4X0VUSCwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHJlYWx2aWV3X3BiYThfaXNwMTc2MV9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAkJPSBSRUFMVklFV19QQkE4X1VTQl9CQVNFLAotCQkuZW5kCQk9IFJFQUxWSUVXX1BCQThfVVNCX0JBU0UgKyBTWl8xMjhLIC0gMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJCT0gSVJRX1BCQThfVVNCLAotCQkuZW5kCQk9IElSUV9QQkE4X1VTQiwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHBtdV9yZXNvdXJjZSA9IHsKLQkuc3RhcnQJCT0gSVJRX1BCQThfUE1VLAotCS5lbmQJCT0gSVJRX1BCQThfUE1VLAotCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBtdV9kZXZpY2UgPSB7Ci0JLm5hbWUJCQk9ICJhcm12Ny1wbXUiLAotCS5pZAkJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJCT0gMSwKLQkucmVzb3VyY2UJCT0gJnBtdV9yZXNvdXJjZSwKLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBnaWNfaW5pdF9pcnEodm9pZCkKLXsKLQkvKiBBUk0gUEItQTggb24tYm9hcmQgR0lDICovCi0JZ2ljX2luaXQoMCwgSVJRX1BCQThfR0lDX1NUQVJULAotCQkgX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCQThfR0lDX0RJU1RfQkFTRSksCi0JCSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfUEJBOF9HSUNfQ1BVX0JBU0UpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHJlYWx2aWV3X3BiYThfdGltZXJfaW5pdCh2b2lkKQotewotCXRpbWVyMF92YV9iYXNlID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCQThfVElNRVIwXzFfQkFTRSk7Ci0JdGltZXIxX3ZhX2Jhc2UgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfUEJBOF9USU1FUjBfMV9CQVNFKSArIDB4MjA7Ci0JdGltZXIyX3ZhX2Jhc2UgPSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfUEJBOF9USU1FUjJfM19CQVNFKTsKLQl0aW1lcjNfdmFfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19QQkE4X1RJTUVSMl8zX0JBU0UpICsgMHgyMDsKLQotCXJlYWx2aWV3X2Nsa19pbml0KF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfQkFTRSksIGZhbHNlKTsKLQlyZWFsdmlld190aW1lcl9pbml0KElSUV9QQkE4X1RJTUVSMF8xKTsKLX0KLQotc3RhdGljIHZvaWQgcmVhbHZpZXdfcGJhOF9yZXN0YXJ0KGVudW0gcmVib290X21vZGUgbW9kZSwgY29uc3QgY2hhciAqY21kKQotewotCXZvaWQgX19pb21lbSAqcmVzZXRfY3RybCA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfUkVTRVRDVEwpOwotCXZvaWQgX19pb21lbSAqbG9ja19jdHJsID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19MT0NLKTsKLQotCS8qCi0JICogVG8gcmVzZXQsIHdlIGhpdCB0aGUgb24tYm9hcmQgcmVzZXQgcmVnaXN0ZXIKLQkgKiBpbiB0aGUgc3lzdGVtIEZQR0EKLQkgKi8KLQlfX3Jhd193cml0ZWwoUkVBTFZJRVdfU1lTX0xPQ0tfVkFMLCBsb2NrX2N0cmwpOwotCV9fcmF3X3dyaXRlbCgweDAwMDAsIHJlc2V0X2N0cmwpOwotCV9fcmF3X3dyaXRlbCgweDAwMDQsIHJlc2V0X2N0cmwpOwotCWRzYigpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVhbHZpZXdfcGJhOF9pbml0KHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlyZWFsdmlld19mbGFzaF9yZWdpc3RlcihyZWFsdmlld19wYmE4X2ZsYXNoX3Jlc291cmNlLAotCQkJCUFSUkFZX1NJWkUocmVhbHZpZXdfcGJhOF9mbGFzaF9yZXNvdXJjZSkpOwotCXJlYWx2aWV3X2V0aF9yZWdpc3RlcihOVUxMLCByZWFsdmlld19wYmE4X3Ntc2M5MTF4X3Jlc291cmNlcyk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyZWFsdmlld19pMmNfZGV2aWNlKTsKLQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJlYWx2aWV3X2NmX2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyZWFsdmlld19sZWRzX2RldmljZSk7Ci0JcmVhbHZpZXdfdXNiX3JlZ2lzdGVyKHJlYWx2aWV3X3BiYThfaXNwMTc2MV9yZXNvdXJjZXMpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcG11X2RldmljZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhbWJhX2RldnMpOyBpKyspIHsKLQkJc3RydWN0IGFtYmFfZGV2aWNlICpkID0gYW1iYV9kZXZzW2ldOwotCQlhbWJhX2RldmljZV9yZWdpc3RlcihkLCAmaW9tZW1fcmVzb3VyY2UpOwotCX0KLX0KLQotTUFDSElORV9TVEFSVChSRUFMVklFV19QQkE4LCAiQVJNLVJlYWxWaWV3IFBCLUE4IikKLQkvKiBNYWludGFpbmVyOiBBUk0gTHRkL0RlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkICovCi0JLmF0YWdfb2Zmc2V0CT0gMHgxMDAsCi0JLmZpeHVwCQk9IHJlYWx2aWV3X2ZpeHVwLAotCS5tYXBfaW8JCT0gcmVhbHZpZXdfcGJhOF9tYXBfaW8sCi0JLmluaXRfZWFybHkJPSByZWFsdmlld19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGdpY19pbml0X2lycSwKLQkuaW5pdF90aW1lCT0gcmVhbHZpZXdfcGJhOF90aW1lcl9pbml0LAotCS5pbml0X21hY2hpbmUJPSByZWFsdmlld19wYmE4X2luaXQsCi0jaWZkZWYgQ09ORklHX1pPTkVfRE1BCi0JLmRtYV96b25lX3NpemUJPSBTWl8yNTZNLAotI2VuZGlmCi0JLnJlc3RhcnQJPSByZWFsdmlld19wYmE4X3Jlc3RhcnQsCi1NQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYnguYyBiL2FyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMWNlYzUuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm0vbWFjaC1yZWFsdmlldy9yZWFsdmlld19wYnguYworKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKgotICogIGFyY2gvYXJtL21hY2gtcmVhbHZpZXcvcmVhbHZpZXdfcGJ4LmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA5IEFSTSBMaW1pdGVkCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwIERlZXAgQmx1ZSBTb2x1dGlvbnMgTHRkCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KLSNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9tbWNpLmg+Ci0jaW5jbHVkZSA8bGludXgvYW1iYS9wbDAyMi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxY2hpcC9hcm0tZ2ljLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9jbGstcmVhbHZpZXcuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgotCi0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcF90d2QuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgotCi0jaW5jbHVkZSAiaGFyZHdhcmUuaCIKLSNpbmNsdWRlICJib2FyZC1wYnguaCIKLSNpbmNsdWRlICJpcnFzLXBieC5oIgotCi0jaW5jbHVkZSAiY29yZS5oIgotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIHJlYWx2aWV3X3BieF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19TWVNfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19TWVNfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQlhfR0lDX0NQVV9CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1BCWF9HSUNfQ1BVX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfUEJYX0dJQ19ESVNUX0JBU0UpLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oUkVBTFZJRVdfUEJYX0dJQ19ESVNUX0JBU0UpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IElPX0FERFJFU1MoUkVBTFZJRVdfU0NUTF9CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1NDVExfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQlhfVElNRVIwXzFfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQlhfVElNRVIwXzFfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gSU9fQUREUkVTUyhSRUFMVklFV19QQlhfVElNRVIyXzNfQkFTRSksCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQlhfVElNRVIyXzNfQkFTRSksCi0JCS5sZW5ndGgJCT0gU1pfNEssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LAotI2lmZGVmIENPTkZJR19ERUJVR19MTAotCXsKLQkJLnZpcnR1YWwJPSBJT19BRERSRVNTKFJFQUxWSUVXX1BCWF9VQVJUMF9CQVNFKSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1BCWF9VQVJUMF9CQVNFKSwKLQkJLmxlbmd0aAkJPSBTWl80SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgcmVhbHZpZXdfbG9jYWxfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbCAgICAgICAgPSBJT19BRERSRVNTKFJFQUxWSUVXX1BCWF9USUxFX1NDVV9CQVNFKSwKLQkJLnBmbiAgICAgICAgICAgID0gX19waHlzX3RvX3BmbihSRUFMVklFV19QQlhfVElMRV9TQ1VfQkFTRSksCi0JCS5sZW5ndGggICAgICAgICA9IFNaXzRLLAotCQkudHlwZSAgICAgICAgICAgPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbCAgICAgICAgPSBJT19BRERSRVNTKFJFQUxWSUVXX1BCWF9USUxFX0dJQ19ESVNUX0JBU0UpLAotCQkucGZuICAgICAgICAgICAgPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1BCWF9USUxFX0dJQ19ESVNUX0JBU0UpLAotCQkubGVuZ3RoICAgICAgICAgPSBTWl80SywKLQkJLnR5cGUgICAgICAgICAgID0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwgICAgICAgID0gSU9fQUREUkVTUyhSRUFMVklFV19QQlhfVElMRV9MMjIwX0JBU0UpLAotCQkucGZuICAgICAgICAgICAgPSBfX3BoeXNfdG9fcGZuKFJFQUxWSUVXX1BCWF9USUxFX0wyMjBfQkFTRSksCi0JCS5sZW5ndGggICAgICAgICA9IFNaXzhLLAotCQkudHlwZSAgICAgICAgICAgPSBNVF9ERVZJQ0UsCi0JfQotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHJlYWx2aWV3X3BieF9tYXBfaW8odm9pZCkKLXsKLQlpb3RhYmxlX2luaXQocmVhbHZpZXdfcGJ4X2lvX2Rlc2MsIEFSUkFZX1NJWkUocmVhbHZpZXdfcGJ4X2lvX2Rlc2MpKTsKLQlpZiAoY29yZV90aWxlX3BieDExbXAoKSB8fCBjb3JlX3RpbGVfcGJ4YTltcCgpKQotCQlpb3RhYmxlX2luaXQocmVhbHZpZXdfbG9jYWxfaW9fZGVzYywgQVJSQVlfU0laRShyZWFsdmlld19sb2NhbF9pb19kZXNjKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGwwNjFfcGxhdGZvcm1fZGF0YSBncGlvMF9wbGF0X2RhdGEgPSB7Ci0JLmdwaW9fYmFzZQk9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsMDYxX3BsYXRmb3JtX2RhdGEgZ3BpbzFfcGxhdF9kYXRhID0gewotCS5ncGlvX2Jhc2UJPSA4LAotfTsKLQotc3RhdGljIHN0cnVjdCBwbDA2MV9wbGF0Zm9ybV9kYXRhIGdwaW8yX3BsYXRfZGF0YSA9IHsKLQkuZ3Bpb19iYXNlCT0gMTYsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsMDIyX3NzcF9jb250cm9sbGVyIHNzcDBfcGxhdF9kYXRhID0gewotCS5idXNfaWQgPSAwLAotCS5lbmFibGVfZG1hID0gMCwKLQkubnVtX2NoaXBzZWxlY3QgPSAxLAotfTsKLQotLyoKLSAqIFJlYWxWaWV3IFBCWENvcmUgQU1CQSBkZXZpY2VzCi0gKi8KLQotI2RlZmluZSBHUElPMl9JUlEJCXsgSVJRX1BCWF9HUElPMiB9Ci0jZGVmaW5lIEdQSU8zX0lSUQkJeyBJUlFfUEJYX0dQSU8zIH0KLSNkZWZpbmUgQUFDSV9JUlEJCXsgSVJRX1BCWF9BQUNJIH0KLSNkZWZpbmUgTU1DSTBfSVJRCQl7IElSUV9QQlhfTU1DSTBBLCBJUlFfUEJYX01NQ0kwQiB9Ci0jZGVmaW5lIEtNSTBfSVJRCQl7IElSUV9QQlhfS01JMCB9Ci0jZGVmaW5lIEtNSTFfSVJRCQl7IElSUV9QQlhfS01JMSB9Ci0jZGVmaW5lIFBCWF9TTUNfSVJRCQl7IH0KLSNkZWZpbmUgTVBNQ19JUlEJCXsgfQotI2RlZmluZSBQQlhfQ0xDRF9JUlEJCXsgSVJRX1BCWF9DTENEIH0KLSNkZWZpbmUgRE1BQ19JUlEJCXsgSVJRX1BCWF9ETUFDIH0KLSNkZWZpbmUgU0NUTF9JUlEJCXsgfQotI2RlZmluZSBQQlhfV0FUQ0hET0dfSVJRCXsgSVJRX1BCWF9XQVRDSERPRyB9Ci0jZGVmaW5lIFBCWF9HUElPMF9JUlEJCXsgSVJRX1BCWF9HUElPMCB9Ci0jZGVmaW5lIEdQSU8xX0lSUQkJeyBJUlFfUEJYX0dQSU8xIH0KLSNkZWZpbmUgUEJYX1JUQ19JUlEJCXsgSVJRX1BCWF9SVEMgfQotI2RlZmluZSBTQ0lfSVJRCQkJeyBJUlFfUEJYX1NDSSB9Ci0jZGVmaW5lIFBCWF9VQVJUMF9JUlEJCXsgSVJRX1BCWF9VQVJUMCB9Ci0jZGVmaW5lIFBCWF9VQVJUMV9JUlEJCXsgSVJRX1BCWF9VQVJUMSB9Ci0jZGVmaW5lIFBCWF9VQVJUMl9JUlEJCXsgSVJRX1BCWF9VQVJUMiB9Ci0jZGVmaW5lIFBCWF9VQVJUM19JUlEJCXsgSVJRX1BCWF9VQVJUMyB9Ci0jZGVmaW5lIFBCWF9TU1BfSVJRCQl7IElSUV9QQlhfU1NQIH0KLQotLyogRlBHQSBQcmltZWNlbGxzICovCi1BUEJfREVWSUNFKGFhY2ksCSJmcGdhOmFhY2kiLAlBQUNJLAkJTlVMTCk7Ci1BUEJfREVWSUNFKG1tYzAsCSJmcGdhOm1tYzAiLAlNTUNJMCwJCSZyZWFsdmlld19tbWMwX3BsYXRfZGF0YSk7Ci1BUEJfREVWSUNFKGttaTAsCSJmcGdhOmttaTAiLAlLTUkwLAkJTlVMTCk7Ci1BUEJfREVWSUNFKGttaTEsCSJmcGdhOmttaTEiLAlLTUkxLAkJTlVMTCk7Ci1BUEJfREVWSUNFKHVhcnQzLAkiZnBnYTp1YXJ0MyIsCVBCWF9VQVJUMywJTlVMTCk7Ci0KLS8qIERldkNoaXAgUHJpbWVjZWxscyAqLwotQUhCX0RFVklDRShzbWMsCSJkZXY6c21jIiwJUEJYX1NNQywJTlVMTCk7Ci1BSEJfREVWSUNFKHNjdGwsCSJkZXY6c2N0bCIsCVNDVEwsCQlOVUxMKTsKLUFQQl9ERVZJQ0Uod2RvZywJImRldjp3ZG9nIiwJUEJYX1dBVENIRE9HLCAJTlVMTCk7Ci1BUEJfREVWSUNFKGdwaW8wLAkiZGV2OmdwaW8wIiwJUEJYX0dQSU8wLAkmZ3BpbzBfcGxhdF9kYXRhKTsKLUFQQl9ERVZJQ0UoZ3BpbzEsCSJkZXY6Z3BpbzEiLAlHUElPMSwJCSZncGlvMV9wbGF0X2RhdGEpOwotQVBCX0RFVklDRShncGlvMiwJImRldjpncGlvMiIsCUdQSU8yLAkJJmdwaW8yX3BsYXRfZGF0YSk7Ci1BUEJfREVWSUNFKHJ0YywJCSJkZXY6cnRjIiwJUEJYX1JUQywJTlVMTCk7Ci1BUEJfREVWSUNFKHNjaTAsCSJkZXY6c2NpMCIsCVNDSSwJCU5VTEwpOwotQVBCX0RFVklDRSh1YXJ0MCwJImRldjp1YXJ0MCIsCVBCWF9VQVJUMCwJTlVMTCk7Ci1BUEJfREVWSUNFKHVhcnQxLAkiZGV2OnVhcnQxIiwJUEJYX1VBUlQxLAlOVUxMKTsKLUFQQl9ERVZJQ0UodWFydDIsCSJkZXY6dWFydDIiLAlQQlhfVUFSVDIsCU5VTEwpOwotQVBCX0RFVklDRShzc3AwLAkiZGV2OnNzcDAiLAlQQlhfU1NQLAkmc3NwMF9wbGF0X2RhdGEpOwotCi0vKiBQcmltZWNlbGxzIG9uIHRoZSBORUMgSVNTUCBjaGlwICovCi1BSEJfREVWSUNFKGNsY2QsCSJpc3NwOmNsY2QiLAlQQlhfQ0xDRCwJJmNsY2RfcGxhdF9kYXRhKTsKLUFIQl9ERVZJQ0UoZG1hYywJImlzc3A6ZG1hYyIsCURNQUMsCQlOVUxMKTsKLQotc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSAqYW1iYV9kZXZzW10gX19pbml0ZGF0YSA9IHsKLQkmZG1hY19kZXZpY2UsCi0JJnVhcnQwX2RldmljZSwKLQkmdWFydDFfZGV2aWNlLAotCSZ1YXJ0Ml9kZXZpY2UsCi0JJnVhcnQzX2RldmljZSwKLQkmc21jX2RldmljZSwKLQkmY2xjZF9kZXZpY2UsCi0JJnNjdGxfZGV2aWNlLAotCSZ3ZG9nX2RldmljZSwKLQkmZ3BpbzBfZGV2aWNlLAotCSZncGlvMV9kZXZpY2UsCi0JJmdwaW8yX2RldmljZSwKLQkmcnRjX2RldmljZSwKLQkmc2NpMF9kZXZpY2UsCi0JJnNzcDBfZGV2aWNlLAotCSZhYWNpX2RldmljZSwKLQkmbW1jMF9kZXZpY2UsCi0JJmttaTBfZGV2aWNlLAotCSZrbWkxX2RldmljZSwKLX07Ci0KLS8qCi0gKiBSZWFsVmlldyBQQi1YIHBsYXRmb3JtIGRldmljZXMKLSAqLwotc3RhdGljIHN0cnVjdCByZXNvdXJjZSByZWFsdmlld19wYnhfZmxhc2hfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQgICAgICAgICAgPSBSRUFMVklFV19QQlhfRkxBU0gwX0JBU0UsCi0JCS5lbmQgICAgICAgICAgICA9IFJFQUxWSUVXX1BCWF9GTEFTSDBfQkFTRSArIFJFQUxWSUVXX1BCWF9GTEFTSDBfU0laRSAtIDEsCi0JCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQgICAgICAgICAgPSBSRUFMVklFV19QQlhfRkxBU0gxX0JBU0UsCi0JCS5lbmQgICAgICAgICAgICA9IFJFQUxWSUVXX1BCWF9GTEFTSDFfQkFTRSArIFJFQUxWSUVXX1BCWF9GTEFTSDFfU0laRSAtIDEsCi0JCS5mbGFncyAgICAgICAgICA9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHJlYWx2aWV3X3BieF9zbXNjOTExeF9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAkJPSBSRUFMVklFV19QQlhfRVRIX0JBU0UsCi0JCS5lbmQJCT0gUkVBTFZJRVdfUEJYX0VUSF9CQVNFICsgU1pfNjRLIC0gMSwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotCX0sCi0JWzFdID0gewotCQkuc3RhcnQJCT0gSVJRX1BCWF9FVEgsCi0JCS5lbmQJCT0gSVJRX1BCWF9FVEgsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSByZWFsdmlld19wYnhfaXNwMTc2MV9yZXNvdXJjZXNbXSA9IHsKLQlbMF0gPSB7Ci0JCS5zdGFydAkJPSBSRUFMVklFV19QQlhfVVNCX0JBU0UsCi0JCS5lbmQJCT0gUkVBTFZJRVdfUEJYX1VTQl9CQVNFICsgU1pfMTI4SyAtIDEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKLQl9LAotCVsxXSA9IHsKLQkJLnN0YXJ0CQk9IElSUV9QQlhfVVNCLAotCQkuZW5kCQk9IElSUV9QQlhfVVNCLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLSNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwbXVfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkuc3RhcnQJCT0gSVJRX1BCWF9QTVVfQ1BVMCwKLQkJLmVuZAkJPSBJUlFfUEJYX1BNVV9DUFUwLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMV0gPSB7Ci0JCS5zdGFydAkJPSBJUlFfUEJYX1BNVV9DUFUxLAotCQkuZW5kCQk9IElSUV9QQlhfUE1VX0NQVTEsCi0JCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVsyXSA9IHsKLQkJLnN0YXJ0CQk9IElSUV9QQlhfUE1VX0NQVTIsCi0JCS5lbmQJCT0gSVJRX1BCWF9QTVVfQ1BVMiwKLQkJLmZsYWdzCQk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JWzNdID0gewotCQkuc3RhcnQJCT0gSVJRX1BCWF9QTVVfQ1BVMywKLQkJLmVuZAkJPSBJUlFfUEJYX1BNVV9DUFUzLAotCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBtdV9kZXZpY2UgPSB7Ci0JLm5hbWUJCQk9ICJhcm12Ny1wbXUiLAotCS5pZAkJCT0gLTEsCi0JLm51bV9yZXNvdXJjZXMJCT0gQVJSQVlfU0laRShwbXVfcmVzb3VyY2VzKSwKLQkucmVzb3VyY2UJCT0gcG11X3Jlc291cmNlcywKLX07Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgX19pbml0IGdpY19pbml0X2lycSh2b2lkKQotewotCS8qIEFSTSBQQlggb24tYm9hcmQgR0lDICovCi0JaWYgKGNvcmVfdGlsZV9wYngxMW1wKCkgfHwgY29yZV90aWxlX3BieGE5bXAoKSkgewotCQlnaWNfaW5pdCgwLCAyOSwgX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCWF9USUxFX0dJQ19ESVNUX0JBU0UpLAotCQkJIF9faW9fYWRkcmVzcyhSRUFMVklFV19QQlhfVElMRV9HSUNfQ1BVX0JBU0UpKTsKLQl9IGVsc2UgewotCQlnaWNfaW5pdCgwLCBJUlFfUEJYX0dJQ19TVEFSVCwKLQkJCSBfX2lvX2FkZHJlc3MoUkVBTFZJRVdfUEJYX0dJQ19ESVNUX0JBU0UpLAotCQkJIF9faW9fYWRkcmVzcyhSRUFMVklFV19QQlhfR0lDX0NQVV9CQVNFKSk7Ci0JfQotfQotCi0jaWZkZWYgQ09ORklHX0hBVkVfQVJNX1RXRAotc3RhdGljIERFRklORV9UV0RfTE9DQUxfVElNRVIodHdkX2xvY2FsX3RpbWVyLAotCQkJICAgICAgUkVBTFZJRVdfUEJYX1RJTEVfVFdEX0JBU0UsCi0JCQkgICAgICBJUlFfTE9DQUxUSU1FUik7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCByZWFsdmlld19wYnhfdHdkX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyID0gdHdkX2xvY2FsX3RpbWVyX3JlZ2lzdGVyKCZ0d2RfbG9jYWxfdGltZXIpOwotCWlmIChlcnIpCi0JCXByX2VycigidHdkX2xvY2FsX3RpbWVyX3JlZ2lzdGVyIGZhaWxlZCAlZFxuIiwgZXJyKTsKLX0KLSNlbHNlCi0jZGVmaW5lIHJlYWx2aWV3X3BieF90d2RfaW5pdCgpCWRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIF9faW5pdCByZWFsdmlld19wYnhfdGltZXJfaW5pdCh2b2lkKQotewotCXRpbWVyMF92YV9iYXNlID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCWF9USU1FUjBfMV9CQVNFKTsKLQl0aW1lcjFfdmFfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19QQlhfVElNRVIwXzFfQkFTRSkgKyAweDIwOwotCXRpbWVyMl92YV9iYXNlID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCWF9USU1FUjJfM19CQVNFKTsKLQl0aW1lcjNfdmFfYmFzZSA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19QQlhfVElNRVIyXzNfQkFTRSkgKyAweDIwOwotCi0JcmVhbHZpZXdfY2xrX2luaXQoX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19CQVNFKSwgZmFsc2UpOwotCXJlYWx2aWV3X3RpbWVyX2luaXQoSVJRX1BCWF9USU1FUjBfMSk7Ci0JcmVhbHZpZXdfcGJ4X3R3ZF9pbml0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWx2aWV3X3BieF9maXh1cChzdHJ1Y3QgdGFnICp0YWdzLCBjaGFyICoqZnJvbSkKLXsKLSNpZmRlZiBDT05GSUdfU1BBUlNFTUVNCi0JLyoKLQkgKiBNZW1vcnkgY29uZmlndXJhdGlvbiB3aXRoIFNQQVJTRU1FTSBlbmFibGVkIG9uIFJlYWxWaWV3IFBCWCAoc2VlCi0JICogYXNtL21hY2gvbWVtb3J5LmggZm9yIG1vcmUgaW5mb3JtYXRpb24pLgotCSAqLwotCi0JbWVtYmxvY2tfYWRkKDAsIFNaXzI1Nk0pOwotCW1lbWJsb2NrX2FkZCgweDIwMDAwMDAwLCBTWl81MTJNKTsKLQltZW1ibG9ja19hZGQoMHg4MDAwMDAwMCwgU1pfMjU2TSk7Ci0jZWxzZQotCXJlYWx2aWV3X2ZpeHVwKHRhZ3MsIGZyb20pOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIHJlYWx2aWV3X3BieF9yZXN0YXJ0KGVudW0gcmVib290X21vZGUgbW9kZSwgY29uc3QgY2hhciAqY21kKQotewotCXZvaWQgX19pb21lbSAqcmVzZXRfY3RybCA9IF9faW9fYWRkcmVzcyhSRUFMVklFV19TWVNfUkVTRVRDVEwpOwotCXZvaWQgX19pb21lbSAqbG9ja19jdHJsID0gX19pb19hZGRyZXNzKFJFQUxWSUVXX1NZU19MT0NLKTsKLQotCS8qCi0JICogVG8gcmVzZXQsIHdlIGhpdCB0aGUgb24tYm9hcmQgcmVzZXQgcmVnaXN0ZXIKLQkgKiBpbiB0aGUgc3lzdGVtIEZQR0EKLQkgKi8KLQlfX3Jhd193cml0ZWwoUkVBTFZJRVdfU1lTX0xPQ0tfVkFMLCBsb2NrX2N0cmwpOwotCV9fcmF3X3dyaXRlbCgweDAwRjAsIHJlc2V0X2N0cmwpOwotCV9fcmF3X3dyaXRlbCgweDAwRjQsIHJlc2V0X2N0cmwpOwotCWRzYigpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVhbHZpZXdfcGJ4X2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotI2lmZGVmIENPTkZJR19DQUNIRV9MMlgwCi0JaWYgKGNvcmVfdGlsZV9wYnhhOW1wKCkpIHsKLQkJdm9pZCBfX2lvbWVtICpsMngwX2Jhc2UgPQotCQkJX19pb19hZGRyZXNzKFJFQUxWSUVXX1BCWF9USUxFX0wyMjBfQkFTRSk7Ci0KLQkJLyogc2V0IFJBTSBsYXRlbmNpZXMgdG8gMSBjeWNsZSBmb3IgZUFTSUMgKi8KLQkJd3JpdGVsKDAsIGwyeDBfYmFzZSArIEwzMTBfVEFHX0xBVEVOQ1lfQ1RSTCk7Ci0JCXdyaXRlbCgwLCBsMngwX2Jhc2UgKyBMMzEwX0RBVEFfTEFURU5DWV9DVFJMKTsKLQotCQkvKiAxNktCIHdheSBzaXplLCA4LXdheSBhc3NvY2lhdGl2aXR5LCBwYXJpdHkgZGlzYWJsZWQKLQkJICogQml0czogIC4uIDAgMCAwIDAgMSAwMCAxIDAgMSAwMDEgMCAwMDAgMCAuLi4uIC4uLi4gLi4uLiAqLwotCQlsMngwX2luaXQobDJ4MF9iYXNlLCAweDAyNTIwMDAwLCAweGMwMDAwZmZmKTsKLQkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwbXVfZGV2aWNlKTsKLQl9Ci0jZW5kaWYKLQotCXJlYWx2aWV3X2ZsYXNoX3JlZ2lzdGVyKHJlYWx2aWV3X3BieF9mbGFzaF9yZXNvdXJjZXMsCi0JCQkJQVJSQVlfU0laRShyZWFsdmlld19wYnhfZmxhc2hfcmVzb3VyY2VzKSk7Ci0JcmVhbHZpZXdfZXRoX3JlZ2lzdGVyKE5VTEwsIHJlYWx2aWV3X3BieF9zbXNjOTExeF9yZXNvdXJjZXMpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfaTJjX2RldmljZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZyZWFsdmlld19jZl9kZXZpY2UpOwotCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcmVhbHZpZXdfbGVkc19kZXZpY2UpOwotCXJlYWx2aWV3X3VzYl9yZWdpc3RlcihyZWFsdmlld19wYnhfaXNwMTc2MV9yZXNvdXJjZXMpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYW1iYV9kZXZzKTsgaSsrKSB7Ci0JCXN0cnVjdCBhbWJhX2RldmljZSAqZCA9IGFtYmFfZGV2c1tpXTsKLQkJYW1iYV9kZXZpY2VfcmVnaXN0ZXIoZCwgJmlvbWVtX3Jlc291cmNlKTsKLQl9Ci19Ci0KLU1BQ0hJTkVfU1RBUlQoUkVBTFZJRVdfUEJYLCAiQVJNLVJlYWxWaWV3IFBCWCIpCi0JLyogTWFpbnRhaW5lcjogQVJNIEx0ZC9EZWVwIEJsdWUgU29sdXRpb25zIEx0ZCAqLwotCS5hdGFnX29mZnNldAk9IDB4MTAwLAotCS5zbXAJCT0gc21wX29wcyhyZWFsdmlld19zbXBfb3BzKSwKLQkuZml4dXAJCT0gcmVhbHZpZXdfcGJ4X2ZpeHVwLAotCS5tYXBfaW8JCT0gcmVhbHZpZXdfcGJ4X21hcF9pbywKLQkuaW5pdF9lYXJseQk9IHJlYWx2aWV3X2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZ2ljX2luaXRfaXJxLAotCS5pbml0X3RpbWUJPSByZWFsdmlld19wYnhfdGltZXJfaW5pdCwKLQkuaW5pdF9tYWNoaW5lCT0gcmVhbHZpZXdfcGJ4X2luaXQsCi0jaWZkZWYgQ09ORklHX1pPTkVfRE1BCi0JLmRtYV96b25lX3NpemUJPSBTWl8yNTZNLAotI2VuZGlmCi0JLnJlc3RhcnQJPSByZWFsdmlld19wYnhfcmVzdGFydCwKLU1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXJwYy9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaCBiL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCmluZGV4IDI1NzE2NmIuLmFhNzlmYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtcnBjL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCkBAIC00MCw3ICs0MCw3IEBACiAjZGVmaW5lIFNDUkVFTl9FTkQJCTB4ZGZjMDAwMDAKICNkZWZpbmUgU0NSRUVOX0JBU0UJCTB4ZGY4MDAwMDAKIAotI2RlZmluZSBVTkNBQ0hFQUJMRV9BRERSCTB4ZGYwMTAwMDAKKyNkZWZpbmUgVU5DQUNIRUFCTEVfQUREUgkoRkxVU0hfQkFTRSArIDB4MTAwMDApCiAKIC8qCiAgKiBJTyBBZGRyZXNzZXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjR4eC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtczNjMjR4eC9jb21tb24uYwppbmRleCBmZTc0ODVkLi5mNmMzZjE1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0eHgvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNHh4L2NvbW1vbi5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLXMzYzI0eHguaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3JlZ3MtY2xvY2suaD4KQEAgLTQ0NSwxMCArNDQ2LDQ0IEBACiAJW0RNQUNIX1VTQl9FUDRdID0geyBTM0MyNFhYX0RNQV9BUEIsIHRydWUsIFMzQzI0WFhfRE1BX0NIQU5SRVEoNCwgMyksIH0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGRtYV9zbGF2ZV9tYXAgczNjMjQ0MF9kbWFfc2xhdmVfbWFwW10gPSB7CisJLyogVE9ETzogRE1BQ0hfWEQwICovCisJLyogVE9ETzogRE1BQ0hfWEQxICovCisJeyAiczNjMjQ0MC1zZGkiLCAicngtdHgiLCAodm9pZCAqKURNQUNIX1NESSB9LAorCXsgInMzYzI0MTAtc3BpLjAiLCAicngiLCAodm9pZCAqKURNQUNIX1NQSTAgfSwKKwl7ICJzM2MyNDEwLXNwaS4wIiwgInR4IiwgKHZvaWQgKilETUFDSF9TUEkwIH0sCisJeyAiczNjMjQxMC1zcGkuMSIsICJyeCIsICh2b2lkICopRE1BQ0hfU1BJMSB9LAorCXsgInMzYzI0MTAtc3BpLjEiLCAidHgiLCAodm9pZCAqKURNQUNIX1NQSTEgfSwKKwl7ICJzM2MyNDQwLXVhcnQuMCIsICJyeCIsICh2b2lkICopRE1BQ0hfVUFSVDAgfSwKKwl7ICJzM2MyNDQwLXVhcnQuMCIsICJ0eCIsICh2b2lkICopRE1BQ0hfVUFSVDAgfSwKKwl7ICJzM2MyNDQwLXVhcnQuMSIsICJyeCIsICh2b2lkICopRE1BQ0hfVUFSVDEgfSwKKwl7ICJzM2MyNDQwLXVhcnQuMSIsICJ0eCIsICh2b2lkICopRE1BQ0hfVUFSVDEgfSwKKwl7ICJzM2MyNDQwLXVhcnQuMiIsICJyeCIsICh2b2lkICopRE1BQ0hfVUFSVDIgfSwKKwl7ICJzM2MyNDQwLXVhcnQuMiIsICJ0eCIsICh2b2lkICopRE1BQ0hfVUFSVDIgfSwKKwl7ICJzM2MyNDQwLXVhcnQuMyIsICJyeCIsICh2b2lkICopRE1BQ0hfVUFSVDMgfSwKKwl7ICJzM2MyNDQwLXVhcnQuMyIsICJ0eCIsICh2b2lkICopRE1BQ0hfVUFSVDMgfSwKKwkvKiBUT0RPOiBETUFDSF9USU1FUiAqLworCXsgInMzYzI0eHgtaWlzIiwgInJ4IiwgKHZvaWQgKilETUFDSF9JMlNfSU4gfSwKKwl7ICJzM2MyNHh4LWlpcyIsICJ0eCIsICh2b2lkICopRE1BQ0hfSTJTX09VVCB9LAorCXsgInNhbXN1bmctYWM5NyIsICJyeCIsICh2b2lkICopRE1BQ0hfUENNX0lOIH0sCisJeyAic2Ftc3VuZy1hYzk3IiwgInR4IiwgKHZvaWQgKilETUFDSF9QQ01fT1VUIH0sCisJeyAic2Ftc3VuZy1hYzk3IiwgInJ4IiwgKHZvaWQgKilETUFDSF9NSUNfSU4gfSwKKwl7ICJzM2MtaHN1ZGMiLCAicngwIiwgKHZvaWQgKilETUFDSF9VU0JfRVAxIH0sCisJeyAiczNjLWhzdWRjIiwgInJ4MSIsICh2b2lkICopRE1BQ0hfVVNCX0VQMiB9LAorCXsgInMzYy1oc3VkYyIsICJyeDIiLCAodm9pZCAqKURNQUNIX1VTQl9FUDMgfSwKKwl7ICJzM2MtaHN1ZGMiLCAicngzIiwgKHZvaWQgKilETUFDSF9VU0JfRVA0IH0sCisJeyAiczNjLWhzdWRjIiwgInR4MCIsICh2b2lkICopRE1BQ0hfVVNCX0VQMSB9LAorCXsgInMzYy1oc3VkYyIsICJ0eDEiLCAodm9pZCAqKURNQUNIX1VTQl9FUDIgfSwKKwl7ICJzM2MtaHN1ZGMiLCAidHgyIiwgKHZvaWQgKilETUFDSF9VU0JfRVAzIH0sCisJeyAiczNjLWhzdWRjIiwgInR4MyIsICh2b2lkICopRE1BQ0hfVVNCX0VQNCB9Cit9OworCiBzdGF0aWMgc3RydWN0IHMzYzI0eHhfZG1hX3BsYXRkYXRhIHMzYzI0NDBfZG1hX3BsYXRkYXRhID0gewogCS5udW1fcGh5X2NoYW5uZWxzID0gNCwKIAkuY2hhbm5lbHMgPSBzM2MyNDQwX2RtYV9jaGFubmVscywKIAkubnVtX2NoYW5uZWxzID0gRE1BQ0hfTUFYLAorCS5zbGF2ZV9tYXAgPSBzM2MyNDQwX2RtYV9zbGF2ZV9tYXAsCisJLnNsYXZlY250ID0gQVJSQVlfU0laRShzM2MyNDQwX2RtYV9zbGF2ZV9tYXApLAogfTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSBzM2MyNDQwX2RldmljZV9kbWEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0eHgvbWFjaC1taW5pMjQ0MC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNHh4L21hY2gtbWluaTI0NDAuYwppbmRleCBiYmY0MTMyLi5lYzYwYmQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0eHgvbWFjaC1taW5pMjQ0MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjR4eC9tYWNoLW1pbmkyNDQwLmMKQEAgLTQ5Nyw5ICs0OTcsMjggQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCB1ZGExMzR4X3BsYXRmb3JtX2RhdGEgczNjMjR4eF91ZGExMzR4ID0geworCS5sMyA9IHsKKwkJLmdwaW9fY2xrID0gUzNDMjQxMF9HUEIoNCksCisJCS5ncGlvX2RhdGEgPSBTM0MyNDEwX0dQQigzKSwKKwkJLmdwaW9fbW9kZSA9IFMzQzI0MTBfR1BCKDIpLAorCQkudXNlX2dwaW9zID0gMSwKKwkJLmRhdGFfaG9sZCA9IDEsCisJCS5kYXRhX3NldHVwID0gMSwKKwkJLmNsb2NrX2hpZ2ggPSAxLAorCQkubW9kZV9ob2xkID0gMSwKKwkJLm1vZGUgPSAxLAorCQkubW9kZV9zZXR1cCA9IDEsCisJfSwKKwkubW9kZWwgPSBVREExMzRYX1VEQTEzNDEsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB1ZGExMzQwX2NvZGVjID0gewogCQkubmFtZSA9ICJ1ZGExMzR4LWNvZGVjIiwKIAkJLmlkID0gLTEsCisJCS5kZXYgPSB7CisJCQkucGxhdGZvcm1fZGF0YQk9ICZzM2MyNHh4X3VkYTEzNHgsCisJCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWluaTI0NDBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvY2xvY2suYwppbmRleCBjYmY1M2JiLi4wZGI0Njg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2Nsb2NrLmMKQEAgLTEyNSw2ICsxMjUsOCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGNsa29wcyBjbGtfMzY4NjRfb3BzID0geworCS5lbmFibGUJCT0gY2xrX2NwdV9lbmFibGUsCisJLmRpc2FibGUJPSBjbGtfY3B1X2Rpc2FibGUsCiAJLmdldF9yYXRlCT0gY2xrXzM2ODY0X2dldF9yYXRlLAogfTsKIApAQCAtMTQwLDkgKzE0Miw4IEBACiAJQ0xLREVWX0lOSVQoTlVMTCwgIk9TVElNRVIwIiwgJmNsa18zNjg2NCksCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBzYTExeHhfY2xrX2luaXQodm9pZCkKK2ludCBfX2luaXQgc2ExMXh4X2Nsa19pbml0KHZvaWQpCiB7CiAJY2xrZGV2X2FkZF90YWJsZShzYTExeHhfY2xrcmVncywgQVJSQVlfU0laRShzYTExeHhfY2xrcmVncykpOwogCXJldHVybiAwOwogfQotY29yZV9pbml0Y2FsbChzYTExeHhfY2xrX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5jCmluZGV4IDM0NWU2M2YuLjNlMDliZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9nZW5lcmljLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL2lycXMuaD4KKyNpbmNsdWRlIDxtYWNoL3Jlc2V0Lmg+CiAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSA8Y2xvY2tzb3VyY2UvcHhhLmg+CkBAIC05NSw2ICs5Niw4IEBACiAKIHZvaWQgc2ExMXgwX3Jlc3RhcnQoZW51bSByZWJvb3RfbW9kZSBtb2RlLCBjb25zdCBjaGFyICpjbWQpCiB7CisJY2xlYXJfcmVzZXRfc3RhdHVzKFJFU0VUX1NUQVRVU19BTEwpOworCiAJaWYgKG1vZGUgPT0gUkVCT09UX1NPRlQpIHsKIAkJLyogSnVtcCBpbnRvIFJPTSBhdCBhZGRyZXNzIDAgKi8KIAkJc29mdF9yZXN0YXJ0KDApOwpAQCAtMzg4LDYgKzM5MSw3IEBACiAJc2ExMXgwX2luaXRfaXJxX25vZHQoSVJRX0dQSU8wX1NDLCBpcnFfcmVzb3VyY2Uuc3RhcnQpOwogCiAJc2ExMTAwX2luaXRfZ3BpbygpOworCXNhMTF4eF9jbGtfaW5pdCgpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5oIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5oCmluZGV4IDBkOTJlMTEuLjY4MTk5YjYwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvZ2VuZXJpYy5oCisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2dlbmVyaWMuaApAQCAtNDQsMyArNDQsNSBAQAogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IHNhMTF4MF9wbV9pbml0KHZvaWQpIHsgcmV0dXJuIDA7IH0KICNlbmRpZgorCitpbnQgc2ExMXh4X2Nsa19pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDN4eHguYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL2gzeHh4LmMKaW5kZXggYjFkNGZhYS4uYjY5ZTc2NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaDN4eHguYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9oM3h4eC5jCkBAIC0xNCw5ICsxNCw5IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW9fa2V5cy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2h0Yy1lZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGFydGl0aW9ucy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1odGMtZWdwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3NhMTF4MC1zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmggYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAppbmRleCBjYmVkZDc1Li5kOTQ0ZmQ3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaApAQCAtMTMsNyArMTMsNyBAQAogI2RlZmluZSBfX0FTTV9BUkNIX0hBUkRXQVJFX0gKIAogCi0jZGVmaW5lIFVOQ0FDSEVBQkxFX0FERFIJMHhmYTA1MDAwMAorI2RlZmluZSBVTkNBQ0hFQUJMRV9BRERSCTB4ZmEwNTAwMDAJLyogSUNJUCAqLwogCiAKIC8qCkBAIC0zNiwyOCArMzYsMTAgQEAKICNkZWZpbmUgaW9fdjJwKCB4ICkgICAgICAgICAgICAgXAogICAgKCAoKCh4KSYweDAwZmZmZmZmKSB8ICgoKHgpJigweDMwMDAwMDAwPj5WSU9fU0hJRlQpKTw8VklPX1NISUZUKSkgKyBQSU9fU1RBUlQgKQogCi0jZGVmaW5lIENQVV9TQTExMTBfQTAJKDApCi0jZGVmaW5lIENQVV9TQTExMTBfQjAJKDQpCi0jZGVmaW5lIENQVV9TQTExMTBfQjEJKDUpCi0jZGVmaW5lIENQVV9TQTExMTBfQjIJKDYpCi0jZGVmaW5lIENQVV9TQTExMTBfQjQJKDgpCi0KLSNkZWZpbmUgQ1BVX1NBMTEwMF9JRAkoMHg0NDAxYTExMCkKLSNkZWZpbmUgQ1BVX1NBMTEwMF9NQVNLCSgweGZmZmZmZmYwKQotI2RlZmluZSBDUFVfU0ExMTEwX0lECSgweDY5MDFiMTEwKQotI2RlZmluZSBDUFVfU0ExMTEwX01BU0sJKDB4ZmZmZmZmZjApCi0KICNkZWZpbmUgX19NUkVHKHgpCUlPTUVNKGlvX3Aydih4KSkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+Ci0KLSNkZWZpbmUgQ1BVX1JFVklTSU9OCShyZWFkX2NwdWlkX2lkKCkgJiAxNSkKLQotI2RlZmluZSBjcHVfaXNfc2ExMTAwKCkJKChyZWFkX2NwdWlkX2lkKCkgJiBDUFVfU0ExMTAwX01BU0spID09IENQVV9TQTExMDBfSUQpCi0jZGVmaW5lIGNwdV9pc19zYTExMTAoKQkoKHJlYWRfY3B1aWRfaWQoKSAmIENQVV9TQTExMTBfTUFTSykgPT0gQ1BVX1NBMTExMF9JRCkKLQogIyBkZWZpbmUgX19SRUcoeCkJKCooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgX19pb21lbSAqKWlvX3Aydih4KSkpCiAjIGRlZmluZSBfX1BSRUcoeCkJKGlvX3YycCgodW5zaWduZWQgbG9uZykmKHgpKSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvam9ybmFkYTcyMC5jCmluZGV4IGMwYjFmNWIuLjBhMmNhOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL2pvcm5hZGE3MjAuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9qb3JuYWRhNzIwLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvc2ExMXgwLXNlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpAQCAtMjE3LDkgKzIxOCwyMiBAQAogCS5pZCAgICAgICAgICAgICA9IC0xLAogfTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBqb3JuYWRhX2tiZF9yZXNvdXJjZXNbXSA9IHsKKwlERUZJTkVfUkVTX0lSUShJUlFfR1BJTzApLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugam9ybmFkYV9rYmRfZGV2aWNlID0gewogCS5uYW1lCQk9ICJqb3JuYWRhNzIwX2tiZCIsCiAJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShqb3JuYWRhX2tiZF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGpvcm5hZGFfa2JkX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb2RfbG9va3VwX3RhYmxlIGpvcm5hZGFfdHNfZ3Bpb2RfdGFibGUgPSB7CisJLmRldl9pZAkJPSAiam9ybmFkYV90cyIsCisJLnRhYmxlCQk9IHsKKwkJR1BJT19MT09LVVAoImdwaW8iLCA5LCAicGVudXAiLCBHUElPX0FDVElWRV9ISUdIKSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugam9ybmFkYV90c19kZXZpY2UgPSB7CkBAIC0yNTAsNiArMjY0LDggQEAKIAkJR1BTUiA9IEdQSU9fR1BJTzIwOwkvKiByZXN0YXJ0IGdwaW8yMCAqLwogCQl1ZGVsYXkoMjApOwkJLyogZ2l2ZSBpdCBzb21lIHRpbWUgdG8gcmVzdGFydCAqLwogCisJCWdwaW9kX2FkZF9sb29rdXBfdGFibGUoJmpvcm5hZGFfdHNfZ3Bpb2RfdGFibGUpOworCiAJCXJldCA9IHBsYXRmb3JtX2FkZF9kZXZpY2VzKGRldmljZXMsIEFSUkFZX1NJWkUoZGV2aWNlcykpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jIGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGxlYi5jCmluZGV4IDE1MjVkN2IuLjg4MTQ5ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BsZWIuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9wbGViLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIHNtYzkxeF9wbGF0ZGF0YSA9IHsKLQkuZmxhZ3MgPSBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX05PV0FJVCwKKwkuZmxhZ3MgPSBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX1VTRV84QklUIHwgU01DOTFYX05PV0FJVCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL0tjb25maWcKaW5kZXggNGE0OGM5Zi4uMDk4MTdiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvS2NvbmZpZwpAQCAtMjIsNyArMjIsNiBAQAogCXNlbGVjdCBQTV9HRU5FUklDX0RPTUFJTlMKIAlzZWxlY3QgUkVORVNBU19JUlFDCiAJc2VsZWN0IFNZU19TVVBQT1JUU19TSF9DTVQKLQlzZWxlY3QgUENJX0RPTUFJTlMgaWYgUENJCiAKIGNvbmZpZyBBUkNIX1JNT0JJTEUKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BsYXRzbXAtc2N1LmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3BsYXRzbXAtc2N1LmMKaW5kZXggOGQ0NzhmMS4uZDFlY2FmMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9wbGF0c21wLXNjdS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcGxhdHNtcC1zY3UuYwpAQCAtMjEsMjYgKzIxLDE0IEBACiBzdGF0aWMgcGh5c19hZGRyX3Qgc2htb2JpbGVfc2N1X2Jhc2VfcGh5czsKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnNobW9iaWxlX3NjdV9iYXNlOwogCi1zdGF0aWMgaW50IHNobW9iaWxlX3NtcF9zY3Vfbm90aWZpZXJfY2FsbChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgc2htb2JpbGVfc2N1X2NwdV9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9IChsb25nKWhjcHU7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX1VQX1BSRVBBUkU6Ci0JCS8qIEZvciB0aGlzIHBhcnRpY3VsYXIgQ1BVIHJlZ2lzdGVyIFNDVSBTTVAgYm9vdCB2ZWN0b3IgKi8KLQkJc2htb2JpbGVfc21wX2hvb2soY3B1LCB2aXJ0X3RvX3BoeXMoc2htb2JpbGVfYm9vdF9zY3UpLAotCQkJCSAgc2htb2JpbGVfc2N1X2Jhc2VfcGh5cyk7Ci0JCWJyZWFrOwotCX07Ci0KLQlyZXR1cm4gTk9USUZZX09LOworCS8qIEZvciB0aGlzIHBhcnRpY3VsYXIgQ1BVIHJlZ2lzdGVyIFNDVSBTTVAgYm9vdCB2ZWN0b3IgKi8KKwlzaG1vYmlsZV9zbXBfaG9vayhjcHUsIHZpcnRfdG9fcGh5cyhzaG1vYmlsZV9ib290X3NjdSksCisJCQkgIHNobW9iaWxlX3NjdV9iYXNlX3BoeXMpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNobW9iaWxlX3NtcF9zY3Vfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBzaG1vYmlsZV9zbXBfc2N1X25vdGlmaWVyX2NhbGwsCi19OwotCiB2b2lkIF9faW5pdCBzaG1vYmlsZV9zbXBfc2N1X3ByZXBhcmVfY3B1cyhwaHlzX2FkZHJfdCBzY3VfYmFzZV9waHlzLAogCQkJCQkgIHVuc2lnbmVkIGludCBtYXhfY3B1cykKIHsKQEAgLTU0LDcgKzQyLDkgQEAKIAlzY3VfcG93ZXJfbW9kZShzaG1vYmlsZV9zY3VfYmFzZSwgU0NVX1BNX05PUk1BTCk7CiAKIAkvKiBVc2UgQ1BVIG5vdGlmaWVyIGZvciByZXNldCB2ZWN0b3IgY29udHJvbCAqLwotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc2htb2JpbGVfc21wX3NjdV9ub3RpZmllcik7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUk1fU0hNT0JJTEVfU0NVX1BSRVBBUkUsCisJCQkJICAiYXJtL3NobW9iaWxlLXNjdTpwcmVwYXJlIiwKKwkJCQkgIHNobW9iaWxlX3NjdV9jcHVfcHJlcGFyZSwgTlVMTCk7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvcmVndWxhdG9yLXF1aXJrLXJjYXItZ2VuMi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9yZWd1bGF0b3ItcXVpcmstcmNhci1nZW4yLmMKaW5kZXggNjI0MzdiNS4uNzNlM2FkYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9yZWd1bGF0b3ItcXVpcmstcmNhci1nZW4yLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9yZWd1bGF0b3ItcXVpcmstcmNhci1nZW4yLmMKQEAgLTQxLDQwICs0MSwyNyBAQAogCiAjZGVmaW5lIFJFR1VMQVRPUl9JUlFfTUFTSwlCSVQoMikJLyogSVJRMiwgYWN0aXZlIGxvdyAqLwogCisvKiBzdGFydCBvZiBEQTkyMTAgU3lzdGVtIENvbnRyb2wgYW5kIEV2ZW50IFJlZ2lzdGVycyAqLworI2RlZmluZSBEQTkyMTBfUkVHX01BU0tfQQkJMHg1NAorCiBzdGF0aWMgdm9pZCBfX2lvbWVtICppcnFjOwogCi1zdGF0aWMgY29uc3QgdTggZGE5MDYzX21hc2tfcmVnc1tdID0gewotCURBOTA2M19SRUdfSVJRX01BU0tfQSwKLQlEQTkwNjNfUkVHX0lSUV9NQVNLX0IsCi0JREE5MDYzX1JFR19JUlFfTUFTS19DLAotCURBOTA2M19SRUdfSVJRX01BU0tfRCwKKy8qIGZpcnN0IGJ5dGUgc2V0cyB0aGUgbWVtb3J5IHBvaW50ZXIsIGZvbGxvd2luZyBhcmUgY29uc2VjdXRpdmUgcmVnIHZhbHVlcyAqLworc3RhdGljIHU4IGRhOTA2M19pcnFfY2xyW10gPSB7IERBOTA2M19SRUdfSVJRX01BU0tfQSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9Oworc3RhdGljIHU4IGRhOTIxMF9pcnFfY2xyW10gPSB7IERBOTIxMF9SRUdfTUFTS19BLCAweGZmLCAweGZmIH07CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX21zZyBkYTl4eHhfbXNnc1syXSA9IHsKKwl7CisJCS5hZGRyID0gMHg1OCwKKwkJLmxlbiA9IEFSUkFZX1NJWkUoZGE5MDYzX2lycV9jbHIpLAorCQkuYnVmID0gZGE5MDYzX2lycV9jbHIsCisJfSwgeworCQkuYWRkciA9IDB4NjgsCisJCS5sZW4gPSBBUlJBWV9TSVpFKGRhOTIxMF9pcnFfY2xyKSwKKwkJLmJ1ZiA9IGRhOTIxMF9pcnFfY2xyLAorCX0sCiB9OwogCi0vKiBEQTkyMTAgU3lzdGVtIENvbnRyb2wgYW5kIEV2ZW50IFJlZ2lzdGVycyAqLwotI2RlZmluZSBEQTkyMTBfUkVHX01BU0tfQQkJMHg1NAotI2RlZmluZSBEQTkyMTBfUkVHX01BU0tfQgkJMHg1NQotCi1zdGF0aWMgY29uc3QgdTggZGE5MjEwX21hc2tfcmVnc1tdID0gewotCURBOTIxMF9SRUdfTUFTS19BLAotCURBOTIxMF9SRUdfTUFTS19CLAotfTsKLQotc3RhdGljIHZvaWQgZGE5eHh4X21hc2tfaXJxcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCB1OCByZWdzW10sCi0JCQkgICAgIHVuc2lnbmVkIGludCBucmVncykKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIk1hc2tpbmcgJXMgaW50ZXJydXB0IHNvdXJjZXNcbiIsIGNsaWVudC0+bmFtZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJlZ3M7IGkrKykgewotCQlpbnQgZXJyb3IgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnc1tpXSwgfjApOwotCQlpZiAoZXJyb3IpIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaTJjIGVycm9yICVkXG4iLCBlcnJvcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci19Ci0KIHN0YXRpYyBpbnQgcmVndWxhdG9yX3F1aXJrX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCiB7CkBAIC05MywxMiArODAsMTUgQEAKIAljbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJZGV2X2RiZyhkZXYsICJEZXRlY3RlZCAlc1xuIiwgY2xpZW50LT5uYW1lKTsKIAotCWlmICgoY2xpZW50LT5hZGRyID09IDB4NTggJiYgIXN0cmNtcChjbGllbnQtPm5hbWUsICJkYTkwNjMiKSkpCi0JCWRhOXh4eF9tYXNrX2lycXMoY2xpZW50LCBkYTkwNjNfbWFza19yZWdzLAotCQkJCSBBUlJBWV9TSVpFKGRhOTA2M19tYXNrX3JlZ3MpKTsKLQllbHNlIGlmIChjbGllbnQtPmFkZHIgPT0gMHg2OCAmJiAhc3RyY21wKGNsaWVudC0+bmFtZSwgImRhOTIxMCIpKQotCQlkYTl4eHhfbWFza19pcnFzKGNsaWVudCwgZGE5MjEwX21hc2tfcmVncywKLQkJCQkgQVJSQVlfU0laRShkYTkyMTBfbWFza19yZWdzKSk7CisJaWYgKChjbGllbnQtPmFkZHIgPT0gMHg1OCAmJiAhc3RyY21wKGNsaWVudC0+bmFtZSwgImRhOTA2MyIpKSB8fAorCSAgICAoY2xpZW50LT5hZGRyID09IDB4NjggJiYgIXN0cmNtcChjbGllbnQtPm5hbWUsICJkYTkyMTAiKSkpIHsKKwkJaW50IHJldDsKKworCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJjbGVhcmluZyBkYTkwNjMvZGE5MjEwIGludGVycnVwdHNcbiIpOworCQlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBkYTl4eHhfbXNncywgQVJSQVlfU0laRShkYTl4eHhfbXNncykpOworCQlpZiAocmV0ICE9IEFSUkFZX1NJWkUoZGE5eHh4X21zZ3MpKQorCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpMmMgZXJyb3IgJWRcbiIsIHJldCk7CisJfQogCiAJbW9uID0gaW9yZWFkMzIoaXJxYyArIElSUUNfTU9OSVRPUik7CiAJaWYgKG1vbiAmIFJFR1VMQVRPUl9JUlFfTUFTSykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc3BlYXIvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtc3BlYXIvS2NvbmZpZwppbmRleCBiNzI2MGMyLi4xYjZjYWU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNwZWFyL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zcGVhci9LY29uZmlnCkBAIC0yMCw3ICsyMCw2IEBACiAJc2VsZWN0IEhBVkVfQVJNX1RXRCBpZiBTTVAKIAlzZWxlY3QgUElOQ1RSTAogCXNlbGVjdCBNRkRfU1lTQ09OCi0Jc2VsZWN0IE1JR0hUX0hBVkVfUENJCiAJaGVscAogCSAgU3VwcG9ydHMgZm9yIEFSTSdzIFNQRUFSMTNYWCBmYW1pbHkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL0tjb25maWcKaW5kZXggYjBjYzI2Mi4uYzI1N2Q0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9LY29uZmlnCkBAIC05LDcgKzksNiBAQAogCXNlbGVjdCBDUFVfQVJNOTI2VAogCXNlbGVjdCBJQ1NUCiAJc2VsZWN0IE1GRF9TWVNDT04KLQlzZWxlY3QgTUlHSFRfSEFWRV9QQ0kKIAlzZWxlY3QgUExBVF9WRVJTQVRJTEUKIAlzZWxlY3QgUE9XRVJfUkVTRVQKIAlzZWxlY3QgUE9XRVJfUkVTRVRfVkVSU0FUSUxFCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9LY29uZmlnIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwppbmRleCBkMTVhN2ZlLi5jMTc5OWRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21tL0tjb25maWcKQEAgLTQwMyw2ICs0MDMsNyBAQAogCWJvb2wKIAlzZWxlY3QgQ1BVXzMydjdNCiAJc2VsZWN0IENQVV9BQlJUX05PTU1VCisJc2VsZWN0IENQVV9DQUNIRV9WN00KIAlzZWxlY3QgQ1BVX0NBQ0hFX05PUAogCXNlbGVjdCBDUFVfUEFCUlRfTEVHQUNZCiAJc2VsZWN0IENQVV9USFVNQk9OTFkKQEAgLTUxOCw2ICs1MTksOSBAQAogY29uZmlnIENQVV9DQUNIRV9GQQogCWJvb2wKIAorY29uZmlnIENQVV9DQUNIRV9WN00KKwlib29sCisKIGlmIE1NVQogIyBUaGUgY29weS1wYWdlIG1vZGVsCiBjb25maWcgQ1BVX0NPUFlfVjRXVApAQCAtNzUwLDE0ICs3NTQsMTQgQEAKIAogY29uZmlnIENQVV9JQ0FDSEVfRElTQUJMRQogCWJvb2wgIkRpc2FibGUgSS1DYWNoZSAoSS1iaXQpIgotCWRlcGVuZHMgb24gQ1BVX0NQMTUgJiYgIShDUFVfQVJNNzIwVCB8fCBDUFVfQVJNNzQwVCB8fCBDUFVfWFNDQUxFIHx8IENQVV9YU0MzKQorCWRlcGVuZHMgb24gKENQVV9DUDE1ICYmICEoQ1BVX0FSTTcyMFQgfHwgQ1BVX0FSTTc0MFQgfHwgQ1BVX1hTQ0FMRSB8fCBDUFVfWFNDMykpIHx8IENQVV9WN00KIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGRpc2FibGUgdGhlIHByb2Nlc3NvciBpbnN0cnVjdGlvbiBjYWNoZS4gVW5sZXNzCiAJICB5b3UgaGF2ZSBhIHJlYXNvbiBub3QgdG8gb3IgYXJlIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBDUFVfRENBQ0hFX0RJU0FCTEUKIAlib29sICJEaXNhYmxlIEQtQ2FjaGUgKEMtYml0KSIKLQlkZXBlbmRzIG9uIENQVV9DUDE1ICYmICFTTVAKKwlkZXBlbmRzIG9uIChDUFVfQ1AxNSAmJiAhU01QKSB8fCBDUFVfVjdNCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBkaXNhYmxlIHRoZSBwcm9jZXNzb3IgZGF0YSBjYWNoZS4gVW5sZXNzCiAJICB5b3UgaGF2ZSBhIHJlYXNvbiBub3QgdG8gb3IgYXJlIHVuc3VyZSwgc2F5IE4uCkBAIC03OTIsNyArNzk2LDcgQEAKIAogY29uZmlnIENQVV9CUFJFRElDVF9ESVNBQkxFCiAJYm9vbCAiRGlzYWJsZSBicmFuY2ggcHJlZGljdGlvbiIKLQlkZXBlbmRzIG9uIENQVV9BUk0xMDIwIHx8IENQVV9WNiB8fCBDUFVfVjZLIHx8IENQVV9NT0hBV0sgfHwgQ1BVX1hTQzMgfHwgQ1BVX1Y3IHx8IENQVV9GQTUyNgorCWRlcGVuZHMgb24gQ1BVX0FSTTEwMjAgfHwgQ1BVX1Y2IHx8IENQVV9WNksgfHwgQ1BVX01PSEFXSyB8fCBDUFVfWFNDMyB8fCBDUFVfVjcgfHwgQ1BVX0ZBNTI2IHx8IENQVV9WN00KIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGRpc2FibGUgYnJhbmNoIHByZWRpY3Rpb24uICBJZiB1bnN1cmUsIHNheSBOLgogCkBAIC05MTYsNiArOTIwLDEzIEBACiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgTDJ4MCBQcmltZUNlbGwuCiAKK2NvbmZpZyBDQUNIRV9MMlgwX1BNVQorCWJvb2wgIkwyeDAgcGVyZm9ybWFuY2UgbW9uaXRvciBzdXBwb3J0IiBpZiBDQUNIRV9MMlgwCisJZGVwZW5kcyBvbiBQRVJGX0VWRU5UUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZmVhdHVyZXMKKwkgIG9mIHRoZSBMMjIwIGFuZCBQTDMxMCBvdXRlciBjYWNoZSBjb250cm9sbGVycy4KKwogaWYgQ0FDSEVfTDJYMAogCiBjb25maWcgUEwzMTBfRVJSQVRBXzU4ODM2OQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vTWFrZWZpbGUgYi9hcmNoL2FybS9tbS9NYWtlZmlsZQppbmRleCA3Zjc2ZDk2Li5lODY5ODI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tbS9NYWtlZmlsZQpAQCAtNDMsOSArNDMsMTEgQEAKIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfVjcpCSs9IGNhY2hlLXY3Lm8KIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfRkEpCSs9IGNhY2hlLWZhLm8KIG9iai0kKENPTkZJR19DUFVfQ0FDSEVfTk9QKQkrPSBjYWNoZS1ub3Aubworb2JqLSQoQ09ORklHX0NQVV9DQUNIRV9WN00pCSs9IGNhY2hlLXY3bS5vCiAKIEFGTEFHU19jYWNoZS12Ni5vCTo9LVdhLC1tYXJjaD1hcm12NgogQUZMQUdTX2NhY2hlLXY3Lm8JOj0tV2EsLW1hcmNoPWFybXY3LWEKK0FGTEFHU19jYWNoZS12N20ubwk6PS1XYSwtbWFyY2g9YXJtdjctbQogCiBvYmotJChDT05GSUdfQ1BVX0NPUFlfVjRXVCkJKz0gY29weXBhZ2UtdjR3dC5vCiBvYmotJChDT05GSUdfQ1BVX0NPUFlfVjRXQikJKz0gY29weXBhZ2UtdjR3Yi5vCkBAIC0xMDEsNiArMTAzLDcgQEAKIG9iai0kKENPTkZJR19PVVRFUl9DQUNIRSkJKz0gbDJjLWNvbW1vbi5vCiBvYmotJChDT05GSUdfQ0FDSEVfRkVST0NFT05fTDIpCSs9IGNhY2hlLWZlcm9jZW9uLWwyLm8KIG9iai0kKENPTkZJR19DQUNIRV9MMlgwKQkrPSBjYWNoZS1sMngwLm8gbDJjLWwyeDAtcmVzdW1lLm8KK29iai0kKENPTkZJR19DQUNIRV9MMlgwX1BNVSkJKz0gY2FjaGUtbDJ4MC1wbXUubwogb2JqLSQoQ09ORklHX0NBQ0hFX1hTQzNMMikJKz0gY2FjaGUteHNjM2wyLm8KIG9iai0kKENPTkZJR19DQUNIRV9UQVVST1MyKQkrPSBjYWNoZS10YXVyb3MyLm8KIG9iai0kKENPTkZJR19DQUNIRV9VTklQSElFUikJKz0gY2FjaGUtdW5pcGhpZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC1wbXUuYyBiL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAtcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2ZDMwNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAtcG11LmMKQEAgLTAsMCArMSw1ODQgQEAKKy8qCisgKiBMMjIwL0wzMTAgY2FjaGUgY29udHJvbGxlciBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFSTSBMaW1pdGVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+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+UEFHRV9NQVNLOworCXNpemVfdCBsZW4gPSBQQUdFX0FMSUdOKHNpemUgKyBvZmZzZXQpOworCisJaWYgKCFpb3ZhKQorCQlyZXR1cm47CisKKwlpb21tdV91bm1hcChtYXBwaW5nLT5kb21haW4sIGlvdmEsIGxlbik7CisJX19mcmVlX2lvdmEobWFwcGluZywgaW92YSwgbGVuKTsKK30KKwogc3RhdGljIHZvaWQgYXJtX2lvbW11X3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAogCQlkbWFfYWRkcl90IGhhbmRsZSwgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKQEAgLTIwNTcsNiArMjExNCw5IEBACiAJLnVubWFwX3NnCQk9IGFybV9pb21tdV91bm1hcF9zZywKIAkuc3luY19zZ19mb3JfY3B1CT0gYXJtX2lvbW11X3N5bmNfc2dfZm9yX2NwdSwKIAkuc3luY19zZ19mb3JfZGV2aWNlCT0gYXJtX2lvbW11X3N5bmNfc2dfZm9yX2RldmljZSwKKworCS5tYXBfcmVzb3VyY2UJCT0gYXJtX2lvbW11X21hcF9yZXNvdXJjZSwKKwkudW5tYXBfcmVzb3VyY2UJCT0gYXJtX2lvbW11X3VubWFwX3Jlc291cmNlLAogfTsKIAogc3RydWN0IGRtYV9tYXBfb3BzIGlvbW11X2NvaGVyZW50X29wcyA9IHsKQEAgLTIwNzAsNiArMjEzMCw5IEBACiAKIAkubWFwX3NnCQk9IGFybV9jb2hlcmVudF9pb21tdV9tYXBfc2csCiAJLnVubWFwX3NnCT0gYXJtX2NvaGVyZW50X2lvbW11X3VubWFwX3NnLAorCisJLm1hcF9yZXNvdXJjZQk9IGFybV9pb21tdV9tYXBfcmVzb3VyY2UsCisJLnVubWFwX3Jlc291cmNlCT0gYXJtX2lvbW11X3VubWFwX3Jlc291cmNlLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbXUuYyBiL2FyY2gvYXJtL21tL21tdS5jCmluZGV4IDYzNDQ5MTMuLjQwMDFkZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL21tdS5jCisrKyBiL2FyY2gvYXJtL21tL21tdS5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIAogCWluaXRpYWxfcG1kX3ZhbHVlID0gcG1kOwogCi0JcG1kICY9IFBNRF9TRUNUX1RFWCgxKSB8IFBNRF9TRUNUX0JVRkZFUkFCTEUgfCBQTURfU0VDVF9DQUNIRUFCTEU7CisJcG1kICY9IFBNRF9TRUNUX0NBQ0hFX01BU0s7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjYWNoZV9wb2xpY2llcyk7IGkrKykKIAkJaWYgKGNhY2hlX3BvbGljaWVzW2ldLnBtZCA9PSBwbWQpIHsKQEAgLTI0Myw3ICsyNDMsNyBAQAogI2RlZmluZSBQUk9UX1BURV9TMl9ERVZJQ0UJUFJPVF9QVEVfREVWSUNFCiAjZGVmaW5lIFBST1RfU0VDVF9ERVZJQ0UJUE1EX1RZUEVfU0VDVHxQTURfU0VDVF9BUF9XUklURQogCi1zdGF0aWMgc3RydWN0IG1lbV90eXBlIG1lbV90eXBlc1tdID0geworc3RhdGljIHN0cnVjdCBtZW1fdHlwZSBtZW1fdHlwZXNbXSBfX3JvX2FmdGVyX2luaXQgPSB7CiAJW01UX0RFVklDRV0gPSB7CQkgIC8qIFN0cm9uZ2x5IG9yZGVyZWQgLyBBUk12NiBzaGFyZWQgZGV2aWNlICovCiAJCS5wcm90X3B0ZQk9IFBST1RfUFRFX0RFVklDRSB8IExfUFRFX01UX0RFVl9TSEFSRUQgfAogCQkJCSAgTF9QVEVfU0hBUkVELApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUyBiL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMKaW5kZXggYzY3MWYzNC4uMGQ0MGMyOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLW1hY3Jvcy5TCkBAIC03LDYgKzcsMTAgQEAKICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KIAorI2lmZGVmIENPTkZJR19DUFVfVjdNCisjaW5jbHVkZSA8YXNtL3Y3bS5oPgorI2VuZGlmCisKIC8qCiAgKiB2bWFfdm1fbW0gLSBnZXQgbW0gcG9pbnRlciBmcm9tIHZtYSBwb2ludGVyICh2bWEtPnZtX21tKQogICovCkBAIC03MCw3ICs3NCwxMyBAQAogICogb24gQVJNdjcuCiAgKi8KIAkubWFjcm8JZGNhY2hlX2xpbmVfc2l6ZSwgcmVnLCB0bXAKKyNpZmRlZiBDT05GSUdfQ1BVX1Y3TQorCW1vdncJXHRtcCwgIzpsb3dlcjE2OkJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NUUgorCW1vdnQJXHRtcCwgIzp1cHBlcjE2OkJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NUUgorCWxkciAgICAgXHRtcCwgW1x0bXBdCisjZWxzZQogCW1yYwlwMTUsIDAsIFx0bXAsIGMwLCBjMCwgMQkJQCByZWFkIGN0cgorI2VuZGlmCiAJbHNyCVx0bXAsIFx0bXAsICMxNgogCWFuZAlcdG1wLCBcdG1wLCAjMHhmCQlAIGNhY2hlIGxpbmUgc2l6ZSBlbmNvZGluZwogCW1vdglccmVnLCAjNAkJCUAgYnl0ZXMgcGVyIHdvcmQKQEAgLTgyLDcgKzkyLDEzIEBACiAgKiBvbiBBUk12Ny4KICAqLwogCS5tYWNybwlpY2FjaGVfbGluZV9zaXplLCByZWcsIHRtcAorI2lmZGVmIENPTkZJR19DUFVfVjdNCisJbW92dwlcdG1wLCAjOmxvd2VyMTY6QkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ1RSCisJbW92dAlcdG1wLCAjOnVwcGVyMTY6QkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfQ1RSCisJbGRyICAgICBcdG1wLCBbXHRtcF0KKyNlbHNlCiAJbXJjCXAxNSwgMCwgXHRtcCwgYzAsIGMwLCAxCQlAIHJlYWQgY3RyCisjZW5kaWYKIAlhbmQJXHRtcCwgXHRtcCwgIzB4ZgkJQCBjYWNoZSBsaW5lIHNpemUgZW5jb2RpbmcKIAltb3YJXHJlZywgIzQJCQlAIGJ5dGVzIHBlciB3b3JkCiAJbW92CVxyZWcsIFxyZWcsIGxzbCBcdG1wCQlAIGFjdHVhbCBjYWNoZSBsaW5lIHNpemUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwppbmRleCBhNzEyM2I0Li5kMDBkNTJjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL2h3Y2FwLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUtaHdkZWYuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KIAogI2luY2x1ZGUgInByb2MtbWFjcm9zLlMiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjdtLlMgYi9hcmNoL2FybS9tbS9wcm9jLXY3bS5TCmluZGV4IDcyMjlkOGQuLmY2ZDMzM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtdjdtLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12N20uUwpAQCAtNzQsMTQgKzc0LDQyIEBACiBFTkRQUk9DKGNwdV92N21fZG9fcmVzdW1lKQogI2VuZGlmCiAKK0VOVFJZKGNwdV9jbTdfZGNhY2hlX2NsZWFuX2FyZWEpCisJZGNhY2hlX2xpbmVfc2l6ZSByMiwgcjMKKwltb3Z3CXIzLCAjOmxvd2VyMTY6QkFTRUFERFJfVjdNX1NDQiArIFY3TV9TQ0JfRENDTVZBQworCW1vdnQJcjMsICM6dXBwZXIxNjpCQVNFQUREUl9WN01fU0NCICsgVjdNX1NDQl9EQ0NNVkFDCisKKzE6CXN0cglyMCwgW3IzXQkJQCBjbGVhbiBEIGVudHJ5CisJYWRkCXIwLCByMCwgcjIKKwlzdWJzCXIxLCByMSwgcjIKKwliaGkJMWIKKwlkc2IKKwlyZXQJbHIKK0VORFBST0MoY3B1X2NtN19kY2FjaGVfY2xlYW5fYXJlYSkKKworRU5UUlkoY3B1X2NtN19wcm9jX2ZpbikKKwltb3Z3CXIyLCAjOmxvd2VyMTY6KEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NDUikKKwltb3Z0CXIyLCAjOnVwcGVyMTY6KEJBU0VBRERSX1Y3TV9TQ0IgKyBWN01fU0NCX0NDUikKKwlsZHIJcjAsIFtyMl0KKwliaWMJcjAsIHIwLCAjKFY3TV9TQ0JfQ0NSX0RDIHwgVjdNX1NDQl9DQ1JfSUMpCisJc3RyCXIwLCBbcjJdCisJcmV0CWxyCitFTkRQUk9DKGNwdV9jbTdfcHJvY19maW4pCisKIAkuc2VjdGlvbiAiLnRleHQuaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgogCitfX3Y3bV9jbTdfc2V0dXA6CisJbW92CXI4LCAjKFY3TV9TQ0JfQ0NSX0RDIHwgVjdNX1NDQl9DQ1JfSUN8IFY3TV9TQ0JfQ0NSX0JQKQorCWIJX192N21fc2V0dXBfY29udAogLyoKICAqCV9fdjdtX3NldHVwCiAgKgogICoJVGhpcyBzaG91bGQgYmUgYWJsZSB0byBjb3ZlciBhbGwgQVJNdjctTSBjb3Jlcy4KICAqLwogX192N21fc2V0dXA6CisJbW92CXI4LCAwCisKK19fdjdtX3NldHVwX2NvbnQ6CiAJQCBDb25maWd1cmUgdGhlIHZlY3RvciB0YWJsZSBiYXNlIGFkZHJlc3MKIAlsZHIJcjAsID1CQVNFQUREUl9WN01fU0NCCiAJbGRyCXIxMiwgPXZlY3Rvcl90YWJsZQpAQCAtMTA0LDYgKzEzMiw3IEBACiAJYmFkcglyMSwgMWYKIAlsZHIJcjUsIFtyMTIsICMxMSAqIDRdCUAgcmVhZCB0aGUgU1ZDIHZlY3RvciBlbnRyeQogCXN0cglyMSwgW3IxMiwgIzExICogNF0JQCB3cml0ZSB0aGUgdGVtcG9yYXJ5IFNWQyB2ZWN0b3IgZW50cnkKKwlkc2IKIAltb3YJcjYsIGxyCQkJQCBzYXZlIExSCiAJbGRyCXNwLCA9aW5pdF90aHJlYWRfdW5pb24gKyBUSFJFQURfU1RBUlRfU1AKIAljcHNpZQlpCkBAIC0xMTYsMTUgKzE0NSwzMiBAQAogCW1vdglyMSwgIzEKIAltc3IJY29udHJvbCwgcjEJCUAgVGhyZWFkIG1vZGUgaGFzIHVucHJpdmlsZWRnZWQgYWNjZXNzCiAKKwlAIENvbmZpZ3VyZSBjYWNoZXMgKGlmIGltcGxlbWVudGVkKQorCXRlcSAgICAgcjgsICMwCisJc3RtbmVpYQlyMTIsIHtyMC1yNiwgbHJ9CUAgdjdtX2ludmFsaWRhdGVfbDEgdG91Y2hlcyByMC1yNgorCWJsbmUJdjdtX2ludmFsaWRhdGVfbDEKKwl0ZXEgICAgIHI4LCAjMAkJCUAgcmUtZXZhbHV0YWUgY29uZGl0aW9uCisJbGRtbmVpYQlyMTIsIHtyMC1yNiwgbHJ9CisKIAlAIENvbmZpZ3VyZSB0aGUgU3lzdGVtIENvbnRyb2wgUmVnaXN0ZXIgdG8gZW5zdXJlIDgtYnl0ZSBzdGFjayBhbGlnbm1lbnQKIAlAIE5vdGUgdGhlIFNUS0FMSUdOIGJpdCBpcyBlaXRoZXIgUlcgb3IgUkFPLgotCWxkcglyMTIsIFtyMCwgVjdNX1NDQl9DQ1JdCUAgc3lzdGVtIGNvbnRyb2wgcmVnaXN0ZXIKLQlvcnIJcjEyLCAjVjdNX1NDQl9DQ1JfU1RLQUxJR04KLQlzdHIJcjEyLCBbcjAsIFY3TV9TQ0JfQ0NSXQorCWxkcglyMCwgW3IwLCBWN01fU0NCX0NDUl0gICBAIHN5c3RlbSBjb250cm9sIHJlZ2lzdGVyCisJb3JyCXIwLCAjVjdNX1NDQl9DQ1JfU1RLQUxJR04KKwlvcnIJcjAsIHIwLCByOAorCiAJcmV0CWxyCiBFTkRQUk9DKF9fdjdtX3NldHVwKQogCisvKgorICogQ29ydGV4LU03IHByb2Nlc3NvciBmdW5jdGlvbnMKKyAqLworCWdsb2JsX2VxdQljcHVfY203X3Byb2NfaW5pdCwJY3B1X3Y3bV9wcm9jX2luaXQKKwlnbG9ibF9lcXUJY3B1X2NtN19yZXNldCwJCWNwdV92N21fcmVzZXQKKwlnbG9ibF9lcXUJY3B1X2NtN19kb19pZGxlLAljcHVfdjdtX2RvX2lkbGUKKwlnbG9ibF9lcXUJY3B1X2NtN19zd2l0Y2hfbW0sCWNwdV92N21fc3dpdGNoX21tCisKIAlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyB2N20sIGRhYm9ydD1ub21tdV9lYXJseV9hYm9ydCwgcGFib3J0PWxlZ2FjeV9wYWJvcnQsIG5vbW11PTEKKwlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBjbTcsIGRhYm9ydD1ub21tdV9lYXJseV9hYm9ydCwgcGFib3J0PWxlZ2FjeV9wYWJvcnQsIG5vbW11PTEKIAogCS5zZWN0aW9uICIucm9kYXRhIgogCXN0cmluZyBjcHVfYXJjaF9uYW1lLCAiYXJtdjdtIgpAQCAtMTMzLDYgKzE3OSw1MCBAQAogCiAJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYwogCisubWFjcm8gX192N21fcHJvYyBuYW1lLCBpbml0ZnVuYywgY2FjaGVfZm5zID0gbm9wX2NhY2hlX2ZucywgaHdjYXBzID0gMCwgIHByb2NfZm5zID0gdjdtX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkubG9uZwkwCQkJLyogcHJvY19pbmZvX2xpc3QuX19jcHVfbW1fbW11X2ZsYWdzICovCisJLmxvbmcJMAkJCS8qIHByb2NfaW5mb19saXN0Ll9fY3B1X2lvX21tdV9mbGFncyAqLworCWluaXRmbglcaW5pdGZ1bmMsIFxuYW1lCisJLmxvbmcJY3B1X2FyY2hfbmFtZQorCS5sb25nCWNwdV9lbGZfbmFtZQorCS5sb25nCUhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQiB8IEhXQ0FQX0ZBU1RfTVVMVCB8IFxod2NhcHMKKwkubG9uZwljcHVfdjdtX25hbWUKKwkubG9uZyAgIFxwcm9jX2ZucworCS5sb25nCTAJCQkvKiBwcm9jX2luZm9fbGlzdC50bGIgKi8KKwkubG9uZwkwCQkJLyogcHJvY19pbmZvX2xpc3QudXNlciAqLworCS5sb25nCVxjYWNoZV9mbnMKKy5lbmRtCisKKwkvKgorCSAqIE1hdGNoIEFSTSBDb3J0ZXgtTTcgcHJvY2Vzc29yLgorCSAqLworCS50eXBlCV9fdjdtX2NtN19wcm9jX2luZm8sICNvYmplY3QKK19fdjdtX2NtN19wcm9jX2luZm86CisJLmxvbmcJMHg0MTBmYzI3MAkJLyogQVJNIENvcnRleC1NNyAweEMyNyAqLworCS5sb25nCTB4ZmYwZmZmZjAJCS8qIE1hc2sgb2ZmIHJldmlzaW9uLCBwYXRjaCByZWxlYXNlICovCisJX192N21fcHJvYyBfX3Y3bV9jbTdfcHJvY19pbmZvLCBfX3Y3bV9jbTdfc2V0dXAsIGh3Y2FwcyA9IEhXQ0FQX0VEU1AsIGNhY2hlX2ZucyA9IHY3bV9jYWNoZV9mbnMsIHByb2NfZm5zID0gY203X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkuc2l6ZQlfX3Y3bV9jbTdfcHJvY19pbmZvLCAuIC0gX192N21fY203X3Byb2NfaW5mbworCisJLyoKKwkgKiBNYXRjaCBBUk0gQ29ydGV4LU00IHByb2Nlc3Nvci4KKwkgKi8KKwkudHlwZQlfX3Y3bV9jbTRfcHJvY19pbmZvLCAjb2JqZWN0CitfX3Y3bV9jbTRfcHJvY19pbmZvOgorCS5sb25nCTB4NDEwZmMyNDAJCS8qIEFSTSBDb3J0ZXgtTTQgMHhDMjQgKi8KKwkubG9uZwkweGZmMGZmZmYwCQkvKiBNYXNrIG9mZiByZXZpc2lvbiwgcGF0Y2ggcmVsZWFzZSAqLworCV9fdjdtX3Byb2MgX192N21fY200X3Byb2NfaW5mbywgX192N21fc2V0dXAsIGh3Y2FwcyA9IEhXQ0FQX0VEU1AKKwkuc2l6ZQlfX3Y3bV9jbTRfcHJvY19pbmZvLCAuIC0gX192N21fY200X3Byb2NfaW5mbworCisJLyoKKwkgKiBNYXRjaCBBUk0gQ29ydGV4LU0zIHByb2Nlc3Nvci4KKwkgKi8KKwkudHlwZQlfX3Y3bV9jbTNfcHJvY19pbmZvLCAjb2JqZWN0CitfX3Y3bV9jbTNfcHJvY19pbmZvOgorCS5sb25nCTB4NDEwZmMyMzAJCS8qIEFSTSBDb3J0ZXgtTTMgMHhDMjMgKi8KKwkubG9uZwkweGZmMGZmZmYwCQkvKiBNYXNrIG9mZiByZXZpc2lvbiwgcGF0Y2ggcmVsZWFzZSAqLworCV9fdjdtX3Byb2MgX192N21fY20zX3Byb2NfaW5mbywgX192N21fc2V0dXAKKwkuc2l6ZQlfX3Y3bV9jbTNfcHJvY19pbmZvLCAuIC0gX192N21fY20zX3Byb2NfaW5mbworCiAJLyoKIAkgKiBNYXRjaCBhbnkgQVJNdjctTSBwcm9jZXNzb3IgY29yZS4KIAkgKi8KQEAgLTE0MCwxNiArMjMwLDYgQEAKIF9fdjdtX3Byb2NfaW5mbzoKIAkubG9uZwkweDAwMGYwMDAwCQlAIFJlcXVpcmVkIElEIHZhbHVlCiAJLmxvbmcJMHgwMDBmMDAwMAkJQCBNYXNrIGZvciBJRAotCS5sb25nICAgMAkJCUAgcHJvY19pbmZvX2xpc3QuX19jcHVfbW1fbW11X2ZsYWdzCi0JLmxvbmcgICAwCQkJQCBwcm9jX2luZm9fbGlzdC5fX2NwdV9pb19tbXVfZmxhZ3MKLQlpbml0Zm4JX192N21fc2V0dXAsIF9fdjdtX3Byb2NfaW5mbwlAIHByb2NfaW5mb19saXN0Ll9fY3B1X2ZsdXNoCi0JLmxvbmcJY3B1X2FyY2hfbmFtZQotCS5sb25nCWNwdV9lbGZfbmFtZQotCS5sb25nCUhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUCi0JLmxvbmcJY3B1X3Y3bV9uYW1lCi0JLmxvbmcJdjdtX3Byb2Nlc3Nvcl9mdW5jdGlvbnMJQCBwcm9jX2luZm9fbGlzdC5wcm9jCi0JLmxvbmcJMAkJCUAgcHJvY19pbmZvX2xpc3QudGxiCi0JLmxvbmcJMAkJCUAgcHJvY19pbmZvX2xpc3QudXNlcgotCS5sb25nCW5vcF9jYWNoZV9mbnMJCUAgcHJvY19pbmZvX2xpc3QuY2FjaGUKKwlfX3Y3bV9wcm9jIF9fdjdtX3Byb2NfaW5mbywgX192N21fc2V0dXAKIAkuc2l6ZQlfX3Y3bV9wcm9jX2luZm8sIC4gLSBfX3Y3bV9wcm9jX2luZm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0veGVuL2VubGlnaHRlbi5jIGIvYXJjaC9hcm0veGVuL2VubGlnaHRlbi5jCmluZGV4IDNkMmNlZjYuLmYxOTM0MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3hlbi9lbmxpZ2h0ZW4uYworKysgYi9hcmNoL2FybS94ZW4vZW5saWdodGVuLmMKQEAgLTE3MCw5ICsxNzAsNiBAQAogCXByX2luZm8oIlhlbjogaW5pdGlhbGl6aW5nIGNwdSVkXG4iLCBjcHUpOwogCXZjcHVwID0gcGVyX2NwdV9wdHIoeGVuX3ZjcHVfaW5mbywgY3B1KTsKIAotCS8qIERpcmVjdCB2Q1BVIGlkIG1hcHBpbmcgZm9yIEFSTSBndWVzdHMuICovCi0JcGVyX2NwdSh4ZW5fdmNwdV9pZCwgY3B1KSA9IGNwdTsKLQogCWluZm8ubWZuID0gdmlydF90b19nZm4odmNwdXApOwogCWluZm8ub2Zmc2V0ID0geGVuX29mZnNldF9pbl9wYWdlKHZjcHVwKTsKIApAQCAtMzMwLDYgKzMyNyw3IEBACiB7CiAJc3RydWN0IHhlbl9hZGRfdG9fcGh5c21hcCB4YXRwOwogCXN0cnVjdCBzaGFyZWRfaW5mbyAqc2hhcmVkX2luZm9fcGFnZSA9IE5VTEw7CisJaW50IGNwdTsKIAogCWlmICgheGVuX2RvbWFpbigpKQogCQlyZXR1cm4gMDsKQEAgLTM4MCw3ICszNzgsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIERpcmVjdCB2Q1BVIGlkIG1hcHBpbmcgZm9yIEFSTSBndWVzdHMuICovCi0JcGVyX2NwdSh4ZW5fdmNwdV9pZCwgMCkgPSAwOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCXBlcl9jcHUoeGVuX3ZjcHVfaWQsIGNwdSkgPSBjcHU7CiAKIAl4ZW5fYXV0b194bGF0X2dyYW50X2ZyYW1lcy5jb3VudCA9IGdudHRhYl9tYXhfZ3JhbnRfZnJhbWVzKCk7CiAJaWYgKHhlbl94bGF0ZV9tYXBfYmFsbG9vbmVkX3BhZ2VzKCZ4ZW5fYXV0b194bGF0X2dyYW50X2ZyYW1lcy5wZm4sCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcgYi9hcmNoL2FybTY0L0tjb25maWcKaW5kZXggYmMzZjAwZi4uMDE2MDA0MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9LY29uZmlnCisrKyBiL2FyY2gvYXJtNjQvS2NvbmZpZwpAQCAtNCw2ICs0LDggQEAKIAlzZWxlY3QgQUNQSV9HRU5FUklDX0dTSSBpZiBBQ1BJCiAJc2VsZWN0IEFDUElfUkVEVUNFRF9IQVJEV0FSRV9PTkxZIGlmIEFDUEkKIAlzZWxlY3QgQUNQSV9NQ0ZHIGlmIEFDUEkKKwlzZWxlY3QgQUNQSV9TUENSX1RBQkxFIGlmIEFDUEkKKwlzZWxlY3QgQVJDSF9DTE9DS1NPVVJDRV9EQVRBCiAJc2VsZWN0IEFSQ0hfSEFTX0RFVk1FTV9JU19BTExPV0VECiAJc2VsZWN0IEFSQ0hfSEFTX0FDUElfVEFCTEVfVVBHUkFERSBpZiBBQ1BJCiAJc2VsZWN0IEFSQ0hfSEFTX0FUT01JQzY0X0RFQ19JRl9QT1NJVElWRQpAQCAtMTUsNyArMTcsNiBAQAogCXNlbGVjdCBBUkNIX1VTRV9DTVBYQ0hHX0xPQ0tSRUYKIAlzZWxlY3QgQVJDSF9TVVBQT1JUU19BVE9NSUNfUk1XCiAJc2VsZWN0IEFSQ0hfU1VQUE9SVFNfTlVNQV9CQUxBTkNJTkcKLQlzZWxlY3QgQVJDSF9XQU5UX09QVElPTkFMX0dQSU9MSUIKIAlzZWxlY3QgQVJDSF9XQU5UX0NPTVBBVF9JUENfUEFSU0VfVkVSU0lPTgogCXNlbGVjdCBBUkNIX1dBTlRfRlJBTUVfUE9JTlRFUlMKIAlzZWxlY3QgQVJDSF9IQVNfVUJTQU5fU0FOSVRJWkVfQUxMCkBAIC0xMDIsMTAgKzEwMyw4IEBACiAJc2VsZWN0IE5PX0JPT1RNRU0KIAlzZWxlY3QgT0YKIAlzZWxlY3QgT0ZfRUFSTFlfRkxBVFRSRUUKLQlzZWxlY3QgT0ZfTlVNQSBpZiBOVU1BICYmIE9GCiAJc2VsZWN0IE9GX1JFU0VSVkVEX01FTQogCXNlbGVjdCBQQ0lfRUNBTSBpZiBBQ1BJCi0Jc2VsZWN0IFBFUkZfVVNFX1ZNQUxMT0MKIAlzZWxlY3QgUE9XRVJfUkVTRVQKIAlzZWxlY3QgUE9XRVJfU1VQUExZCiAJc2VsZWN0IFNQQVJTRV9JUlEKQEAgLTEyMiw2ICsxMjEsOSBAQAogY29uZmlnIE1NVQogCWRlZl9ib29sIHkKIAorY29uZmlnIERFQlVHX1JPREFUQQorCWRlZl9ib29sIHkKKwogY29uZmlnIEFSTTY0X1BBR0VfU0hJRlQKIAlpbnQKIAlkZWZhdWx0IDE2IGlmIEFSTTY0XzY0S19QQUdFUwpAQCAtNDE1LDE4ICs0MTcsMTMgQEAKIAogY29uZmlnIEFSTTY0X0VSUkFUVU1fODQzNDE5CiAJYm9vbCAiQ29ydGV4LUE1MzogODQzNDE5OiBBIGxvYWQgb3Igc3RvcmUgbWlnaHQgYWNjZXNzIGFuIGluY29ycmVjdCBhZGRyZXNzIgotCWRlcGVuZHMgb24gTU9EVUxFUwogCWRlZmF1bHQgeQotCXNlbGVjdCBBUk02NF9NT0RVTEVfQ01PREVMX0xBUkdFCisJc2VsZWN0IEFSTTY0X01PRFVMRV9DTU9ERUxfTEFSR0UgaWYgTU9EVUxFUwogCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGJ1aWxkcyBrZXJuZWwgbW9kdWxlcyB1c2luZyB0aGUgbGFyZ2UgbWVtb3J5IG1vZGVsIGluCi0JICBvcmRlciB0byBhdm9pZCB0aGUgdXNlIG9mIHRoZSBBRFJQIGluc3RydWN0aW9uLCB3aGljaCBjYW4gY2F1c2UKLQkgIGEgc3Vic2VxdWVudCBtZW1vcnkgYWNjZXNzIHRvIHVzZSBhbiBpbmNvcnJlY3QgYWRkcmVzcyBvbiBDb3J0ZXgtQTUzCi0JICBwYXJ0cyB1cCB0byByMHA0LgotCi0JICBOb3RlIHRoYXQgdGhlIGtlcm5lbCBpdHNlbGYgbXVzdCBiZSBsaW5rZWQgd2l0aCBhIHZlcnNpb24gb2YgbGQKLQkgIHdoaWNoIGZpeGVzIHBvdGVudGlhbGx5IGFmZmVjdGVkIEFEUlAgaW5zdHJ1Y3Rpb25zIHRocm91Z2ggdGhlCi0JICB1c2Ugb2YgdmVuZWVycy4KKwkgIFRoaXMgb3B0aW9uIGxpbmtzIHRoZSBrZXJuZWwgd2l0aCAnLS1maXgtY29ydGV4LWE1My04NDM0MTknIGFuZAorCSAgYnVpbGRzIG1vZHVsZXMgdXNpbmcgdGhlIGxhcmdlIG1lbW9yeSBtb2RlbCBpbiBvcmRlciB0byBhdm9pZCB0aGUgdXNlCisJICBvZiB0aGUgQURSUCBpbnN0cnVjdGlvbiwgd2hpY2ggY2FuIGNhdXNlIGEgc3Vic2VxdWVudCBtZW1vcnkgYWNjZXNzCisJICB0byB1c2UgYW4gaW5jb3JyZWN0IGFkZHJlc3Mgb24gQ29ydGV4LUE1MyBwYXJ0cyB1cCB0byByMHA0LgogCiAJICBJZiB1bnN1cmUsIHNheSBZLgogCkBAIC01ODIsNyArNTc5LDggQEAKICMgQ29tbW9uIE5VTUEgRmVhdHVyZXMKIGNvbmZpZyBOVU1BCiAJYm9vbCAiTnVtYSBNZW1vcnkgQWxsb2NhdGlvbiBhbmQgU2NoZWR1bGVyIFN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTTVAKKwlzZWxlY3QgQUNQSV9OVU1BIGlmIEFDUEkKKwlzZWxlY3QgT0ZfTlVNQQogCWhlbHAKIAkgIEVuYWJsZSBOVU1BIChOb24gVW5pZm9ybSBNZW1vcnkgQWNjZXNzKSBzdXBwb3J0LgogCkBAIC02MDMsMTEgKzYwMSwxOCBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIE5VTUEKIAorY29uZmlnIEhBVkVfU0VUVVBfUEVSX0NQVV9BUkVBCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gTlVNQQorCitjb25maWcgTkVFRF9QRVJfQ1BVX0VNQkVEX0ZJUlNUX0NIVU5LCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gTlVNQQorCiBzb3VyY2Uga2VybmVsL0tjb25maWcucHJlZW1wdAogc291cmNlIGtlcm5lbC9LY29uZmlnLmh6CiAKIGNvbmZpZyBBUkNIX1NVUFBPUlRTX0RFQlVHX1BBR0VBTExPQwotCWRlcGVuZHMgb24gIUhJQkVSTkFUSU9OCiAJZGVmX2Jvb2wgeQogCiBjb25maWcgQVJDSF9IQVNfSE9MRVNfTUVNT1JZTU9ERUwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvYXJtNjQvS2NvbmZpZy5kZWJ1ZwppbmRleCAwY2M3NThjLi5iNjYxZmU3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9hcm02NC9LY29uZmlnLmRlYnVnCkBAIC00OSwxNiArNDksNiBAQAogCiAJICBJZiBpbiBkb3VidCwgc2F5IFkuCiAKLWNvbmZpZyBERUJVR19ST0RBVEEKLQlib29sICJNYWtlIGtlcm5lbCB0ZXh0IGFuZCByb2RhdGEgcmVhZC1vbmx5IgotCWRlZmF1bHQgeQotCWhlbHAKLQkgIElmIHRoaXMgaXMgc2V0LCBrZXJuZWwgdGV4dCBhbmQgcm9kYXRhIHdpbGwgYmUgbWFkZSByZWFkLW9ubHkuIFRoaXMKLQkgIGlzIHRvIGhlbHAgY2F0Y2ggYWNjaWRlbnRhbCBvciBtYWxpY2lvdXMgYXR0ZW1wdHMgdG8gY2hhbmdlIHRoZQotCSAga2VybmVsJ3MgZXhlY3V0YWJsZSBjb2RlLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IFkuCi0KIGNvbmZpZyBERUJVR19BTElHTl9ST0RBVEEKIAlkZXBlbmRzIG9uIERFQlVHX1JPREFUQQogCWJvb2wgIkFsaWduIGxpbmtlciBzZWN0aW9ucyB1cCB0byBTRUNUSU9OX1NJWkUiCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L0tjb25maWcucGxhdGZvcm1zIGIvYXJjaC9hcm02NC9LY29uZmlnLnBsYXRmb3JtcwppbmRleCBiZTVkODI0Li5iNmIzNjU3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L0tjb25maWcucGxhdGZvcm1zCisrKyBiL2FyY2gvYXJtNjQvS2NvbmZpZy5wbGF0Zm9ybXMKQEAgLTE1LDggKzE1LDggQEAKIAogY29uZmlnIEFSQ0hfQkNNMjgzNQogCWJvb2wgIkJyb2FkY29tIEJDTTI4MzUgZmFtaWx5IgotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCXNlbGVjdCBDTEtTUkNfT0YKKwlzZWxlY3QgR1BJT0xJQgogCXNlbGVjdCBQSU5DVFJMCiAJc2VsZWN0IFBJTkNUUkxfQkNNMjgzNQogCXNlbGVjdCBBUk1fQU1CQQpAQCAtMjksMTUgKzI5LDE1IEBACiBjb25maWcgQVJDSF9CQ01fSVBST0MKIAlib29sICJCcm9hZGNvbSBpUHJvYyBTb0MgRmFtaWx5IgogCXNlbGVjdCBDT01NT05fQ0xLX0lQUk9DCisJc2VsZWN0IEdQSU9MSUIKIAlzZWxlY3QgUElOQ1RSTAotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBCcm9hZGNvbSBpUHJvYyBiYXNlZCBTb0NzCiAKIGNvbmZpZyBBUkNIX0JFUkxJTgogCWJvb2wgIk1hcnZlbGwgQmVybGluIFNvQyBGYW1pbHkiCi0Jc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJc2VsZWN0IERXX0FQQl9JQ1RMCisJc2VsZWN0IEdQSU9MSUIKIAlzZWxlY3QgUElOQ1RSTAogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBNYXJ2ZWxsIEJlcmxpbiBTb0MgRmFtaWx5CkBAIC01NSw2ICs1NSw3IEBACiAKIGNvbmZpZyBBUkNIX0xBWUVSU0NBUEUKIAlib29sICJBUk12OCBiYXNlZCBGcmVlc2NhbGUgTGF5ZXJzY2FwZSBTb0MgZmFtaWx5IgorCXNlbGVjdCBFREFDX1NVUFBPUlQKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEZyZWVzY2FsZSBMYXllcnNjYXBlIFNvQyBmYW1pbHkuCiAKQEAgLTkzLDYgKzk0LDcgQEAKIAlzZWxlY3QgQVJNQURBX0NQMTEwX1NZU0NPTgogCXNlbGVjdCBBUk1BREFfMzdYWF9DTEsKIAlzZWxlY3QgTVZFQlVfT0RNSQorCXNlbGVjdCBNVkVCVV9QSUMKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgTWFydmVsbCBFQlUgZmFtaWxseSwgaW5jbHVkaW5nOgogCSAgIC0gQXJtYWRhIDM3MDAgU29DIEZhbWlseQpAQCAtMTA4LDcgKzExMCw3IEBACiBjb25maWcgQVJDSF9ST0NLQ0hJUAogCWJvb2wgIlJvY2tjaGlwIFBsYXRmb3JtcyIKIAlzZWxlY3QgQVJDSF9IQVNfUkVTRVRfQ09OVFJPTExFUgotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCXNlbGVjdCBHUElPTElCCiAJc2VsZWN0IFBJTkNUUkwKIAlzZWxlY3QgUElOQ1RSTF9ST0NLQ0hJUAogCXNlbGVjdCBST0NLQ0hJUF9USU1FUgpAQCAtMTU0LDEyICsxNTYsMTEgQEAKIGNvbmZpZyBBUkNIX1RFR1JBCiAJYm9vbCAiTlZJRElBIFRlZ3JhIFNvQyBGYW1pbHkiCiAJc2VsZWN0IEFSQ0hfSEFTX1JFU0VUX0NPTlRST0xMRVIKLQlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKIAlzZWxlY3QgQ0xLREVWX0xPT0tVUAogCXNlbGVjdCBDTEtTUkNfTU1JTwogCXNlbGVjdCBDTEtTUkNfT0YKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwotCXNlbGVjdCBIQVZFX0NMSworCXNlbGVjdCBHUElPTElCCiAJc2VsZWN0IFBJTkNUUkwKIAlzZWxlY3QgUkVTRVRfQ09OVFJPTExFUgogCWhlbHAKQEAgLTE4Myw4ICsxODQsOCBAQAogCiBjb25maWcgQVJDSF9WRVhQUkVTUwogCWJvb2wgIkFSTXY4IHNvZnR3YXJlIG1vZGVsIChWZXJzYXRpbGUgRXhwcmVzcykiCi0Jc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCiAJc2VsZWN0IENPTU1PTl9DTEtfVkVSU0FUSUxFCisJc2VsZWN0IEdQSU9MSUIKIAlzZWxlY3QgUE0KIAlzZWxlY3QgUE1fR0VORVJJQ19ET01BSU5TCiAJc2VsZWN0IFBPV0VSX1JFU0VUX1ZFWFBSRVNTCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L01ha2VmaWxlIGIvYXJjaC9hcm02NC9NYWtlZmlsZQppbmRleCA1YjU0ZjhjLi5hYjUxYWVkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtNjQvTWFrZWZpbGUKQEAgLTE4LDYgKzE4LDE0IEBACiBMREZMQUdTX3ZtbGludXgJCSs9IC1waWUgLUJzeW1ib2xpYwogZW5kaWYKIAoraWZlcSAoJChDT05GSUdfQVJNNjRfRVJSQVRVTV84NDM0MTkpLHkpCisgIGlmZXEgKCQoY2FsbCBsZC1vcHRpb24sIC0tZml4LWNvcnRleC1hNTMtODQzNDE5KSwpCiskKHdhcm5pbmcgbGQgZG9lcyBub3Qgc3VwcG9ydCAtLWZpeC1jb3J0ZXgtYTUzLTg0MzQxOTsga2VybmVsIG1heSBiZSBzdXNjZXB0aWJsZSB0byBlcnJhdHVtKQorICBlbHNlCitMREZMQUdTX3ZtbGludXgJKz0gLS1maXgtY29ydGV4LWE1My04NDM0MTkKKyAgZW5kaWYKK2VuZGlmCisKIEtCVUlMRF9ERUZDT05GSUcgOj0gZGVmY29uZmlnCiAKICMgQ2hlY2sgZm9yIGJpbnV0aWxzIHN1cHBvcnQgZm9yIHNwZWNpZmljIGV4dGVuc2lvbnMKQEAgLTM4LDEwICs0NiwxMiBAQAogS0JVSUxEX0NQUEZMQUdTCSs9IC1tYmlnLWVuZGlhbgogQVMJCSs9IC1FQgogTEQJCSs9IC1FQgorVVRTX01BQ0hJTkUJOj0gYWFyY2g2NF9iZQogZWxzZQogS0JVSUxEX0NQUEZMQUdTCSs9IC1tbGl0dGxlLWVuZGlhbgogQVMJCSs9IC1FTAogTEQJCSs9IC1FTAorVVRTX01BQ0hJTkUJOj0gYWFyY2g2NAogZW5kaWYKIAogQ0hFQ0tGTEFHUwkrPSAtRF9fYWFyY2g2NF9fCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FsdGVyYS9zb2NmcGdhX3N0cmF0aXgxMC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9hbHRlcmEvc29jZnBnYV9zdHJhdGl4MTAuZHRzaQppbmRleCA0NDVhYTY3Li5jMmI5YmNiIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FsdGVyYS9zb2NmcGdhX3N0cmF0aXgxMC5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYWx0ZXJhL3NvY2ZwZ2Ffc3RyYXRpeDEwLmR0c2kKQEAgLTI1NSwxMCArMjU1LDEwIEBACiAJCS8qIExvY2FsIHRpbWVyICovCiAJCXRpbWVyIHsKIAkJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKLQkJCWludGVycnVwdHMgPSA8MSAxMyAweGYwMT4sCi0JCQkJICAgICA8MSAxNCAweGYwMT4sCi0JCQkJICAgICA8MSAxMSAweGYwMT4sCi0JCQkJICAgICA8MSAxMCAweGYwMT47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmMDg+LAorCQkJCSAgICAgPDEgMTQgMHhmMDg+LAorCQkJCSAgICAgPDEgMTEgMHhmMDg+LAorCQkJCSAgICAgPDEgMTAgMHhmMDg+OwogCQl9OwogCiAJCXRpbWVyMDogdGltZXIwQGZmYzAzMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYW1sb2dpYy9tZXNvbi1neGJiLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2FtbG9naWMvbWVzb24tZ3hiYi5kdHNpCmluZGV4IGU1MDJjMjQuLmJmNmM4ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYW1sb2dpYy9tZXNvbi1neGJiLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9hbWxvZ2ljL21lc29uLWd4YmIuZHRzaQpAQCAtMTAyLDEzICsxMDIsMTMgQEAKIAl0aW1lciB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfUFBJIDEzCi0JCQkoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8IElSUV9UWVBFX0VER0VfUklTSU5HKT4sCisJCQkoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+LAogCQkJICAgICA8R0lDX1BQSSAxNAotCQkJKEdJQ19DUFVfTUFTS19SQVcoMHhmZikgfCBJUlFfVFlQRV9FREdFX1JJU0lORyk+LAorCQkJKEdJQ19DUFVfTUFTS19SQVcoMHhmZikgfCBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKIAkJCSAgICAgPEdJQ19QUEkgMTEKLQkJCShHSUNfQ1BVX01BU0tfUkFXKDB4ZmYpIHwgSVJRX1RZUEVfRURHRV9SSVNJTkcpPiwKKwkJCShHSUNfQ1BVX01BU0tfUkFXKDB4ZmYpIHwgSVJRX1RZUEVfTEVWRUxfTE9XKT4sCiAJCQkgICAgIDxHSUNfUFBJIDEwCi0JCQkoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8IElSUV9UWVBFX0VER0VfUklTSU5HKT47CisJCQkoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+OwogCX07CiAKIAl4dGFsOiB4dGFsLWNsayB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FwbS9hcG0tbXVzdGFuZy5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2FwbS9hcG0tbXVzdGFuZy5kdHMKaW5kZXggYjdmYjVkOS4uMzJhOTYxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9hcG0vYXBtLW11c3RhbmcuZHRzCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1tdXN0YW5nLmR0cwpAQCAtNzQsNiArNzQsNyBAQAogCiAmeGdlbmV0IHsKIAlzdGF0dXMgPSAib2siOworCXJ4bG9zLWdwaW9zID0gPCZzYmdwaW8gMTIgMT47CiB9OwogCiAmbW1jMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FwbS9hcG0tc3Rvcm0uZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1zdG9ybS5kdHNpCmluZGV4IGYxYzJjNzEuLjMxZWE3MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1zdG9ybS5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1zdG9ybS5kdHNpCkBAIC0xMTAsMTAgKzExMCwxMCBAQAogCiAJdGltZXIgewogCQljb21wYXRpYmxlID0gImFybSxhcm12OC10aW1lciI7Ci0JCWludGVycnVwdHMgPSA8MSAwIDB4ZmYwMT4sCS8qIFNlY3VyZSBQaHlzIElSUSAqLwotCQkJICAgICA8MSAxMyAweGZmMDE+LAkvKiBOb24tc2VjdXJlIFBoeXMgSVJRICovCi0JCQkgICAgIDwxIDE0IDB4ZmYwMT4sCS8qIFZpcnQgSVJRICovCi0JCQkgICAgIDwxIDE1IDB4ZmYwMT47CS8qIEh5cCBJUlEgKi8KKwkJaW50ZXJydXB0cyA9IDwxIDAgMHhmZjA4PiwJLyogU2VjdXJlIFBoeXMgSVJRICovCisJCQkgICAgIDwxIDEzIDB4ZmYwOD4sCS8qIE5vbi1zZWN1cmUgUGh5cyBJUlEgKi8KKwkJCSAgICAgPDEgMTQgMHhmZjA4PiwJLyogVmlydCBJUlEgKi8KKwkJCSAgICAgPDEgMTUgMHhmZjA4PjsJLyogSHlwIElSUSAqLwogCQljbG9jay1mcmVxdWVuY3kgPSA8NTAwMDAwMDA+OwogCX07CiAKQEAgLTkyMyw3ICs5MjMsNyBAQAogCQkJLyogbWFjIGFkZHJlc3Mgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSB0aGUgYm9vdGxvYWRlciAqLwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbMDAgMDAgMDAgMDAgMDAgMDBdOwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paSI7Ci0JCQlwaHktaGFuZGxlID0gPCZtZW5ldDBwaHk+LDwmbWVuZXRwaHk+OworCQkJcGh5LWhhbmRsZSA9IDwmbWVuZXRwaHk+LDwmbWVuZXQwcGh5PjsKIAkJCW1kaW8gewogCQkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLW1kaW8iOwogCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODM1LXJwaS5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODM1LXJwaS5kdHNpCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjM5MzdiNzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4MzUtcnBpLmR0c2kKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vLi4vYXJtL2Jvb3QvZHRzL2JjbTI4MzUtcnBpLmR0c2kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4MzctcnBpLTMtYi5kdHMgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4MzctcnBpLTMtYi5kdHMKaW5kZXggNmY0N2RkMi4uNzg0MWI3MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODM3LXJwaS0zLWIuZHRzCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNy1ycGktMy1iLmR0cwpAQCAtMSw3ICsxLDcgQEAKIC9kdHMtdjEvOwogI2luY2x1ZGUgImJjbTI4MzcuZHRzaSIKLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9hcm0vYm9vdC9kdHMvYmNtMjgzNS1ycGkuZHRzaSIKLSNpbmNsdWRlICIuLi8uLi8uLi8uLi9hcm0vYm9vdC9kdHMvYmNtMjgzeC1ycGktc21zYzk1MTQuZHRzaSIKKyNpbmNsdWRlICJiY20yODM1LXJwaS5kdHNpIgorI2luY2x1ZGUgImJjbTI4M3gtcnBpLXNtc2M5NTE0LmR0c2kiCiAKIC8gewogCWNvbXBhdGlibGUgPSAicmFzcGJlcnJ5cGksMy1tb2RlbC1iIiwgImJyY20sYmNtMjgzNyI7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4MzcuZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNy5kdHNpCmluZGV4IGYyYTMxZDAuLjgyMTZiYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNy5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzNy5kdHNpCkBAIC0xLDQgKzEsNCBAQAotI2luY2x1ZGUgIi4uLy4uLy4uLy4uL2FybS9ib290L2R0cy9iY20yODN4LmR0c2kiCisjaW5jbHVkZSAiYmNtMjgzeC5kdHNpIgogCiAvIHsKIAljb21wYXRpYmxlID0gImJyY20sYmNtMjgzNiI7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4M3gtcnBpLXNtc2M5NTE0LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL2JjbTI4M3gtcnBpLXNtc2M5NTE0LmR0c2kKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uZGNhN2MwNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzeC1ycGktc21zYzk1MTQuZHRzaQpAQCAtMCwwICsxIEBACisuLi8uLi8uLi8uLi9hcm0vYm9vdC9kdHMvYmNtMjgzeC1ycGktc21zYzk1MTQuZHRzaQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzeC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9iY20yODN4LmR0c2kKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNWY1NGU0YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vYmNtMjgzeC5kdHNpCkBAIC0wLDAgKzEgQEAKKy4uLy4uLy4uLy4uL2FybS9ib290L2R0cy9iY20yODN4LmR0c2kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL25zMi5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9icm9hZGNvbS9uczIuZHRzaQppbmRleCBmNTNiMDk1Li5kNGExMmZhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Jyb2FkY29tL25zMi5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYnJvYWRjb20vbnMyLmR0c2kKQEAgLTg4LDEzICs4OCwxMyBAQAogCXRpbWVyIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwogCQlpbnRlcnJ1cHRzID0gPEdJQ19QUEkgMTMgKEdJQ19DUFVfTUFTS19SQVcoMHhmZikgfAotCQkJICAgICAgSVJRX1RZUEVfRURHRV9SSVNJTkcpPiwKKwkJCSAgICAgIElSUV9UWVBFX0xFVkVMX0xPVyk+LAogCQkJICAgICA8R0lDX1BQSSAxNCAoR0lDX0NQVV9NQVNLX1JBVygweGZmKSB8Ci0JCQkgICAgICBJUlFfVFlQRV9FREdFX1JJU0lORyk+LAorCQkJICAgICAgSVJRX1RZUEVfTEVWRUxfTE9XKT4sCiAJCQkgICAgIDxHSUNfUFBJIDExIChHSUNfQ1BVX01BU0tfUkFXKDB4ZmYpIHwKLQkJCSAgICAgIElSUV9UWVBFX0VER0VfUklTSU5HKT4sCisJCQkgICAgICBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKIAkJCSAgICAgPEdJQ19QUEkgMTAgKEdJQ19DUFVfTUFTS19SQVcoMHhmZikgfAotCQkJICAgICAgSVJRX1RZUEVfRURHRV9SSVNJTkcpPjsKKwkJCSAgICAgIElSUV9UWVBFX0xFVkVMX0xPVyk+OwogCX07CiAKIAlwbXUgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9jYXZpdW0vdGh1bmRlci04OHh4LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Nhdml1bS90aHVuZGVyLTg4eHguZHRzaQppbmRleCAyZWI5YjIyLi4wNGRjOGE4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2Nhdml1bS90aHVuZGVyLTg4eHguZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2Nhdml1bS90aHVuZGVyLTg4eHguZHRzaQpAQCAtMzU0LDEwICszNTQsMTAgQEAKIAogCXRpbWVyIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwotCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmZjAxPiwKLQkJICAgICAgICAgICAgIDwxIDE0IDB4ZmYwMT4sCi0JCSAgICAgICAgICAgICA8MSAxMSAweGZmMDE+LAotCQkgICAgICAgICAgICAgPDEgMTAgMHhmZjAxPjsKKwkJaW50ZXJydXB0cyA9IDwxIDEzIDQ+LAorCQkgICAgICAgICAgICAgPDEgMTQgND4sCisJCSAgICAgICAgICAgICA8MSAxMSA0PiwKKwkJICAgICAgICAgICAgIDwxIDEwIDQ+OwogCX07CiAKIAlwbXUgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9leHlub3MvZXh5bm9zNy5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9leHlub3MvZXh5bm9zNy5kdHNpCmluZGV4IGNhNjYzZGYuLjE2MjgzMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvZXh5bm9zL2V4eW5vczcuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2V4eW5vcy9leHlub3M3LmR0c2kKQEAgLTQ3MywxMCArNDczLDEwIEBACiAKIAkJdGltZXIgewogCQkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwotCQkJaW50ZXJydXB0cyA9IDwxIDEzIDB4ZmYwMT4sCi0JCQkJICAgICA8MSAxNCAweGZmMDE+LAotCQkJCSAgICAgPDEgMTEgMHhmZjAxPiwKLQkJCQkgICAgIDwxIDEwIDB4ZmYwMT47CisJCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmZjA4PiwKKwkJCQkgICAgIDwxIDE0IDB4ZmYwOD4sCisJCQkJICAgICA8MSAxMSAweGZmMDg+LAorCQkJCSAgICAgPDEgMTAgMHhmZjA4PjsKIAkJfTsKIAogCQlwbXVfc3lzdGVtX2NvbnRyb2xsZXI6IHN5c3RlbS1jb250cm9sbGVyQDEwNWMwMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvZnJlZXNjYWxlL2ZzbC1sczEwNDNhLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2ZyZWVzY2FsZS9mc2wtbHMxMDQzYS5kdHNpCmluZGV4IGU2NjlmYmQuLmE2N2UyMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvZnJlZXNjYWxlL2ZzbC1sczEwNDNhLmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9mcmVlc2NhbGUvZnNsLWxzMTA0M2EuZHRzaQpAQCAtMTE5LDEwICsxMTksMTAgQEAKIAogCXRpbWVyIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sYXJtdjgtdGltZXIiOwotCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHgxPiwgLyogUGh5c2ljYWwgU2VjdXJlIFBQSSAqLwotCQkJICAgICA8MSAxNCAweDE+LCAvKiBQaHlzaWNhbCBOb24tU2VjdXJlIFBQSSAqLwotCQkJICAgICA8MSAxMSAweDE+LCAvKiBWaXJ0dWFsIFBQSSAqLwotCQkJICAgICA8MSAxMCAweDE+OyAvKiBIeXBlcnZpc29yIFBQSSAqLworCQlpbnRlcnJ1cHRzID0gPDEgMTMgMHhmMDg+LCAvKiBQaHlzaWNhbCBTZWN1cmUgUFBJICovCisJCQkgICAgIDwxIDE0IDB4ZjA4PiwgLyogUGh5c2ljYWwgTm9uLVNlY3VyZSBQUEkgKi8KKwkJCSAgICAgPDEgMTEgMHhmMDg+LCAvKiBWaXJ0dWFsIFBQSSAqLworCQkJICAgICA8MSAxMCAweGYwOD47IC8qIEh5cGVydmlzb3IgUFBJICovCiAJfTsKIAogCXBtdSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2ZyZWVzY2FsZS9mc2wtbHMyMDgwYS5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9mcmVlc2NhbGUvZnNsLWxzMjA4MGEuZHRzaQppbmRleCAyMTAyM2EzLi5lM2I2MDM0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2ZyZWVzY2FsZS9mc2wtbHMyMDgwYS5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvZnJlZXNjYWxlL2ZzbC1sczIwODBhLmR0c2kKQEAgLTE5MSwxMCArMTkxLDEwIEBACiAKIAl0aW1lciB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKLQkJaW50ZXJydXB0cyA9IDwxIDEzIDB4OD4sIC8qIFBoeXNpY2FsIFNlY3VyZSBQUEksIGFjdGl2ZS1sb3cgKi8KLQkJCSAgICAgPDEgMTQgMHg4PiwgLyogUGh5c2ljYWwgTm9uLVNlY3VyZSBQUEksIGFjdGl2ZS1sb3cgKi8KLQkJCSAgICAgPDEgMTEgMHg4PiwgLyogVmlydHVhbCBQUEksIGFjdGl2ZS1sb3cgKi8KLQkJCSAgICAgPDEgMTAgMHg4PjsgLyogSHlwZXJ2aXNvciBQUEksIGFjdGl2ZS1sb3cgKi8KKwkJaW50ZXJydXB0cyA9IDwxIDEzIDQ+LCAvKiBQaHlzaWNhbCBTZWN1cmUgUFBJLCBhY3RpdmUtbG93ICovCisJCQkgICAgIDwxIDE0IDQ+LCAvKiBQaHlzaWNhbCBOb24tU2VjdXJlIFBQSSwgYWN0aXZlLWxvdyAqLworCQkJICAgICA8MSAxMSA0PiwgLyogVmlydHVhbCBQUEksIGFjdGl2ZS1sb3cgKi8KKwkJCSAgICAgPDEgMTAgND47IC8qIEh5cGVydmlzb3IgUFBJLCBhY3RpdmUtbG93ICovCiAJfTsKIAogCXBtdSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL21hcnZlbGwvYXJtYWRhLWFwODA2LmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL21hcnZlbGwvYXJtYWRhLWFwODA2LmR0c2kKaW5kZXggZWFiMWE0Mi4uYzJhNjc0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9ib290L2R0cy9tYXJ2ZWxsL2FybWFkYS1hcDgwNi5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvbWFydmVsbC9hcm1hZGEtYXA4MDYuZHRzaQpAQCAtMTIyLDEwICsxMjIsMTAgQEAKIAogCQkJdGltZXIgewogCQkJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKLQkJCQlpbnRlcnJ1cHRzID0gPEdJQ19QUEkgMTMgKEdJQ19DUFVfTUFTS19TSU1QTEUoNCkgfCBJUlFfVFlQRV9FREdFX1JJU0lORyk+LAotCQkJCQkgICAgIDxHSUNfUFBJIDE0IChHSUNfQ1BVX01BU0tfU0lNUExFKDQpIHwgSVJRX1RZUEVfRURHRV9SSVNJTkcpPiwKLQkJCQkJICAgICA8R0lDX1BQSSAxMSAoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0VER0VfUklTSU5HKT4sCi0JCQkJCSAgICAgPEdJQ19QUEkgMTAgKEdJQ19DUFVfTUFTS19TSU1QTEUoNCkgfCBJUlFfVFlQRV9FREdFX1JJU0lORyk+OworCQkJCWludGVycnVwdHMgPSA8R0lDX1BQSSAxMyAoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+LAorCQkJCQkgICAgIDxHSUNfUFBJIDE0IChHSUNfQ1BVX01BU0tfU0lNUExFKDQpIHwgSVJRX1RZUEVfTEVWRUxfTE9XKT4sCisJCQkJCSAgICAgPEdJQ19QUEkgMTEgKEdJQ19DUFVfTUFTS19TSU1QTEUoNCkgfCBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKKwkJCQkJICAgICA8R0lDX1BQSSAxMCAoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+OwogCQkJfTsKIAogCQkJb2RtaTogb2RtaUAzMDAwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9yb2NrY2hpcC9yazMzNjguZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvcm9ja2NoaXAvcmszMzY4LmR0c2kKaW5kZXggZDAyYTkwMDMuLjRmNDRkMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvcm9ja2NoaXAvcmszMzY4LmR0c2kKKysrIGIvYXJjaC9hcm02NC9ib290L2R0cy9yb2NrY2hpcC9yazMzNjguZHRzaQpAQCAtMjcwLDYgKzI3MCw4IEBACiAJCSNpby1jaGFubmVsLWNlbGxzID0gPDE+OwogCQljbG9ja3MgPSA8JmNydSBTQ0xLX1NBUkFEQz4sIDwmY3J1IFBDTEtfU0FSQURDPjsKIAkJY2xvY2stbmFtZXMgPSAic2FyYWRjIiwgImFwYl9wY2xrIjsKKwkJcmVzZXRzID0gPCZjcnUgU1JTVF9TQVJBREM+OworCQlyZXNldC1uYW1lcyA9ICJzYXJhZGMtYXBiIjsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3NvY2lvbmV4dC91bmlwaGllci1waDEtbGQyMC5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9zb2Npb25leHQvdW5pcGhpZXItcGgxLWxkMjAuZHRzaQppbmRleCBjMjIzOTE1Li5kNzNiZGM4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3NvY2lvbmV4dC91bmlwaGllci1waDEtbGQyMC5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvc29jaW9uZXh0L3VuaXBoaWVyLXBoMS1sZDIwLmR0c2kKQEAgLTEyOSwxMCArMTI5LDEwIEBACiAKIAl0aW1lciB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGFybXY4LXRpbWVyIjsKLQkJaW50ZXJydXB0cyA9IDwxIDEzIDB4ZjAxPiwKLQkJCSAgICAgPDEgMTQgMHhmMDE+LAotCQkJICAgICA8MSAxMSAweGYwMT4sCi0JCQkgICAgIDwxIDEwIDB4ZjAxPjsKKwkJaW50ZXJydXB0cyA9IDwxIDEzIDQ+LAorCQkJICAgICA8MSAxNCA0PiwKKwkJCSAgICAgPDEgMTEgND4sCisJCQkgICAgIDwxIDEwIDQ+OwogCX07CiAKIAlzb2MgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy94aWxpbngvenlucW1wLmR0c2kgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3hpbGlueC96eW5xbXAuZHRzaQppbmRleCBlNTk1ZjIyLi4zZTJlNTFmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL3hpbGlueC96eW5xbXAuZHRzaQorKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL3hpbGlueC96eW5xbXAuZHRzaQpAQCAtNjUsMTAgKzY1LDEwIEBACiAJdGltZXIgewogCQljb21wYXRpYmxlID0gImFybSxhcm12OC10aW1lciI7CiAJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47Ci0JCWludGVycnVwdHMgPSA8MSAxMyAweGYwMT4sCi0JCQkgICAgIDwxIDE0IDB4ZjAxPiwKLQkJCSAgICAgPDEgMTEgMHhmMDE+LAotCQkJICAgICA8MSAxMCAweGYwMT47CisJCWludGVycnVwdHMgPSA8MSAxMyAweGYwOD4sCisJCQkgICAgIDwxIDE0IDB4ZjA4PiwKKwkJCSAgICAgPDEgMTEgMHhmMDg+LAorCQkJICAgICA8MSAxMCAweGYwOD47CiAJfTsKIAogCWFtYmFfYXB1IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvY3J5cHRvL2Flcy1nbHVlLmMgYi9hcmNoL2FybTY0L2NyeXB0by9hZXMtZ2x1ZS5jCmluZGV4IDVjODg4MDQuLjZiMmFhMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvY3J5cHRvL2Flcy1nbHVlLmMKKysrIGIvYXJjaC9hcm02NC9jcnlwdG8vYWVzLWdsdWUuYwpAQCAtMjE2LDcgKzIxNiw3IEBACiAJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgJndhbGssCiAJCQkJCSAgd2Fsay5uYnl0ZXMgJSBBRVNfQkxPQ0tfU0laRSk7CiAJfQotCWlmIChuYnl0ZXMpIHsKKwlpZiAod2Fsay5uYnl0ZXMgJSBBRVNfQkxPQ0tfU0laRSkgewogCQl1OCAqdGRzdCA9IHdhbGsuZHN0LnZpcnQuYWRkciArIGJsb2NrcyAqIEFFU19CTE9DS19TSVpFOwogCQl1OCAqdHNyYyA9IHdhbGsuc3JjLnZpcnQuYWRkciArIGJsb2NrcyAqIEFFU19CTE9DS19TSVpFOwogCQl1OCBfX2FsaWduZWQoOCkgdGFpbFtBRVNfQkxPQ0tfU0laRV07CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL0tidWlsZCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGY0M2QyYzQuLjQ0ZTFkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vS2J1aWxkCkBAIC0xLDQgKzEsMyBAQAotZ2VuZXJpYy15ICs9IGJ1Zy5oCiBnZW5lcmljLXkgKz0gYnVncy5oCiBnZW5lcmljLXkgKz0gY2xrZGV2LmgKIGdlbmVyaWMteSArPSBjcHV0aW1lLmgKQEAgLTEwLDcgKzksNiBAQAogZ2VuZXJpYy15ICs9IGVhcmx5X2lvcmVtYXAuaAogZ2VuZXJpYy15ICs9IGVtZXJnZW5jeS1yZXN0YXJ0LmgKIGdlbmVyaWMteSArPSBlcnJuby5oCi1nZW5lcmljLXkgKz0gZnRyYWNlLmgKIGdlbmVyaWMteSArPSBod19pcnEuaAogZ2VuZXJpYy15ICs9IGlvY3RsLmgKIGdlbmVyaWMteSArPSBpb2N0bHMuaApAQCAtMjcsMTIgKzI1LDEwIEBACiBnZW5lcmljLXkgKz0gbXNnYnVmLmgKIGdlbmVyaWMteSArPSBtc2kuaAogZ2VuZXJpYy15ICs9IG11dGV4LmgKLWdlbmVyaWMteSArPSBwY2kuaAogZ2VuZXJpYy15ICs9IHBvbGwuaAogZ2VuZXJpYy15ICs9IHByZWVtcHQuaAogZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKIGdlbmVyaWMteSArPSByd3NlbS5oCi1nZW5lcmljLXkgKz0gc2VjdGlvbnMuaAogZ2VuZXJpYy15ICs9IHNlZ21lbnQuaAogZ2VuZXJpYy15ICs9IHNlbWJ1Zi5oCiBnZW5lcmljLXkgKz0gc2VyaWFsLmgKQEAgLTQ1LDcgKzQxLDYgQEAKIGdlbmVyaWMteSArPSBzd2l0Y2hfdG8uaAogZ2VuZXJpYy15ICs9IHRlcm1iaXRzLmgKIGdlbmVyaWMteSArPSB0ZXJtaW9zLmgKLWdlbmVyaWMteSArPSB0b3BvbG9neS5oCiBnZW5lcmljLXkgKz0gdHJhY2VfY2xvY2suaAogZ2VuZXJpYy15ICs9IHR5cGVzLmgKIGdlbmVyaWMteSArPSB1bmFsaWduZWQuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hY3BpLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FjcGkuaAppbmRleCA1NDIwY2IwLi5lNTE3MDg4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FjcGkuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FjcGkuaApAQCAtMTIsNyArMTIsNyBAQAogI2lmbmRlZiBfQVNNX0FDUElfSAogI2RlZmluZSBfQVNNX0FDUElfSAogCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3BzY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CkBAIC0zMiw3ICszMiwxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmFjcGlfb3NfaW9yZW1hcChhY3BpX3BoeXNpY2FsX2FkZHJlc3MgcGh5cywKIAkJCQkJICAgIGFjcGlfc2l6ZSBzaXplKQogewotCWlmICghcGFnZV9pc19yYW0ocGh5cyA+PiBQQUdFX1NISUZUKSkKKwkvKgorCSAqIEVGSSdzIHJlc2VydmVfcmVnaW9ucygpIGNhbGwgYWRkcyBtZW1vcnkgd2l0aCB0aGUgV0IgYXR0cmlidXRlCisJICogdG8gbWVtYmxvY2sgdmlhIGVhcmx5X2luaXRfZHRfYWRkX21lbW9yeV9hcmNoKCkuCisJICovCisJaWYgKCFtZW1ibG9ja19pc19tZW1vcnkocGh5cykpCiAJCXJldHVybiBpb3JlbWFwKHBoeXMsIHNpemUpOwogCiAJcmV0dXJuIGlvcmVtYXBfY2FjaGUocGh5cywgc2l6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmgKaW5kZXggODc0NmZmNi4uNTUxMDFiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX19BU01fQUxURVJOQVRJVkVfSAogCiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vaW5zbi5oPgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC05MCwyNCArOTEsMTUgQEAKIC5lbmRtCiAKIC8qCi0gKiBCZWdpbiBhbiBhbHRlcm5hdGl2ZSBjb2RlIHNlcXVlbmNlLgorICogQWx0ZXJuYXRpdmUgc2VxdWVuY2VzCiAgKgotICogVGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoaXMgbWFjcm8gd2lsbCBiZSBhc3NlbWJsZWQgYW5kIGxpbmtlZCBhcwotICogbm9ybWFsLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoaXMgY29kZS4KLSAqLwotLm1hY3JvIGFsdGVybmF0aXZlX2lmX25vdCBjYXAKLQkucHVzaHNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywgImEiCi0JYWx0aW5zdHJ1Y3Rpb25fZW50cnkgNjYxZiwgNjYzZiwgXGNhcCwgNjYyZi02NjFmLCA2NjRmLTY2M2YKLQkucG9wc2VjdGlvbgotNjYxOgotLmVuZG0KLQotLyoKLSAqIFByb3ZpZGUgdGhlIGFsdGVybmF0aXZlIGNvZGUgc2VxdWVuY2UuCisgKiBUaGUgY29kZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhcGFiaWxpdHkgaXMgbm90IHByZXNlbnQgd2lsbCBiZQorICogYXNzZW1ibGVkIGFuZCBsaW5rZWQgYXMgbm9ybWFsLiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoaXMKKyAqIGNvZGUuCiAgKgotICogVGhlIGNvZGUgdGhhdCBmb2xsb3dzIHRoaXMgbWFjcm8gaXMgYXNzZW1ibGVkIGludG8gYSBzcGVjaWFsCi0gKiBzZWN0aW9uIHRvIGJlIHVzZWQgZm9yIGR5bmFtaWMgcGF0Y2hpbmcuIENvZGUgdGhhdCBmb2xsb3dzIHRoaXMKLSAqIG1hY3JvIG11c3Q6CisgKiBUaGUgY29kZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGNhcGFiaWxpdHkgaXMgcHJlc2VudCB3aWxsIGJlCisgKiBhc3NlbWJsZWQgaW50byBhIHNwZWNpYWwgc2VjdGlvbiB0byBiZSB1c2VkIGZvciBkeW5hbWljIHBhdGNoaW5nLgorICogQ29kZSBmb3IgdGhhdCBjYXNlIG11c3Q6CiAgKgogICogMS4gQmUgZXhhY3RseSB0aGUgc2FtZSBsZW5ndGggKGluIGJ5dGVzKSBhcyB0aGUgZGVmYXVsdCBjb2RlCiAgKiAgICBzZXF1ZW5jZS4KQEAgLTExNiw4ICsxMDgsMzggQEAKICAqICAgIGFsdGVybmF0aXZlIHNlcXVlbmNlIGl0IGlzIGRlZmluZWQgaW4gKGJyYW5jaGVzIGludG8gYW4KICAqICAgIGFsdGVybmF0aXZlIHNlcXVlbmNlIGFyZSBub3QgZml4ZWQgdXApLgogICovCisKKy8qCisgKiBCZWdpbiBhbiBhbHRlcm5hdGl2ZSBjb2RlIHNlcXVlbmNlLgorICovCisubWFjcm8gYWx0ZXJuYXRpdmVfaWZfbm90IGNhcAorCS5zZXQgLkxhc21fYWx0X21vZGUsIDAKKwkucHVzaHNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywgImEiCisJYWx0aW5zdHJ1Y3Rpb25fZW50cnkgNjYxZiwgNjYzZiwgXGNhcCwgNjYyZi02NjFmLCA2NjRmLTY2M2YKKwkucG9wc2VjdGlvbgorNjYxOgorLmVuZG0KKworLm1hY3JvIGFsdGVybmF0aXZlX2lmIGNhcAorCS5zZXQgLkxhc21fYWx0X21vZGUsIDEKKwkucHVzaHNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywgImEiCisJYWx0aW5zdHJ1Y3Rpb25fZW50cnkgNjYzZiwgNjYxZiwgXGNhcCwgNjY0Zi02NjNmLCA2NjJmLTY2MWYKKwkucG9wc2VjdGlvbgorCS5wdXNoc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsICJheCIKKwkuYWxpZ24gMgkvKiBTbyBHQVMga25vd3MgbGFiZWwgNjYxIGlzIHN1aXRhYmx5IGFsaWduZWQgKi8KKzY2MToKKy5lbmRtCisKKy8qCisgKiBQcm92aWRlIHRoZSBvdGhlciBoYWxmIG9mIHRoZSBhbHRlcm5hdGl2ZSBjb2RlIHNlcXVlbmNlLgorICovCiAubWFjcm8gYWx0ZXJuYXRpdmVfZWxzZQotNjYyOgkucHVzaHNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCAiYXgiCis2NjI6CisJLmlmIC5MYXNtX2FsdF9tb2RlPT0wCisJLnB1c2hzZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwgImF4IgorCS5lbHNlCisJLnBvcHNlY3Rpb24KKwkuZW5kaWYKIDY2MzoKIC5lbmRtCiAKQEAgLTEyNSwxMSArMTQ3LDI1IEBACiAgKiBDb21wbGV0ZSBhbiBhbHRlcm5hdGl2ZSBjb2RlIHNlcXVlbmNlLgogICovCiAubWFjcm8gYWx0ZXJuYXRpdmVfZW5kaWYKLTY2NDoJLnBvcHNlY3Rpb24KKzY2NDoKKwkuaWYgLkxhc21fYWx0X21vZGU9PTAKKwkucG9wc2VjdGlvbgorCS5lbmRpZgogCS5vcmcJLiAtICg2NjRiLTY2M2IpICsgKDY2MmItNjYxYikKIAkub3JnCS4gLSAoNjYyYi02NjFiKSArICg2NjRiLTY2M2IpCiAuZW5kbQogCisvKgorICogUHJvdmlkZXMgYSB0cml2aWFsIGFsdGVybmF0aXZlIG9yIGRlZmF1bHQgc2VxdWVuY2UgY29uc2lzdGluZyBzb2xlbHkKKyAqIG9mIE5PUHMuIFRoZSBudW1iZXIgb2YgTk9QcyBpcyBjaG9zZW4gYXV0b21hdGljYWxseSB0byBtYXRjaCB0aGUKKyAqIHByZXZpb3VzIGNhc2UuCisgKi8KKy5tYWNybyBhbHRlcm5hdGl2ZV9lbHNlX25vcF9lbmRpZgorYWx0ZXJuYXRpdmVfZWxzZQorCW5vcHMJKDY2MmItNjYxYikgLyBBQVJDSDY0X0lOU05fU0laRQorYWx0ZXJuYXRpdmVfZW5kaWYKKy5lbmRtCisKICNkZWZpbmUgX0FMVEVSTkFUSVZFX0NGRyhpbnNuMSwgaW5zbjIsIGNhcCwgY2ZnLCAuLi4pCVwKIAlhbHRlcm5hdGl2ZV9pbnNuIGluc24xLCBpbnNuMiwgY2FwLCBJU19FTkFCTEVEKGNmZykKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hcmNoX2dpY3YzLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaAppbmRleCA4ZWM4OGU1Li5mOGFlNmQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfZ2ljdjMuaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmluZSBJQ0NfQ1RMUl9FTDEJCQlzeXNfcmVnKDMsIDAsIDEyLCAxMiwgNCkKICNkZWZpbmUgSUNDX1NSRV9FTDEJCQlzeXNfcmVnKDMsIDAsIDEyLCAxMiwgNSkKICNkZWZpbmUgSUNDX0dSUEVOMV9FTDEJCQlzeXNfcmVnKDMsIDAsIDEyLCAxMiwgNykKKyNkZWZpbmUgSUNDX0JQUjFfRUwxCQkJc3lzX3JlZygzLCAwLCAxMiwgMTIsIDMpCiAKICNkZWZpbmUgSUNDX1NSRV9FTDIJCQlzeXNfcmVnKDMsIDQsIDEyLCA5LCA1KQogCkBAIC03OSw2ICs4MCwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CiAKKyNkZWZpbmUgcmVhZF9naWNyZWcocikJCQkJCQkJXAorCSh7CQkJCQkJCQlcCisJCXU2NCByZWc7CQkJCQkJXAorCQlhc20gdm9sYXRpbGUoIm1yc19zICUwLCAiIF9fc3RyaW5naWZ5KHIpIDogIj1yIiAocmVnKSk7CVwKKwkJcmVnOwkJCQkJCQlcCisJfSkKKworI2RlZmluZSB3cml0ZV9naWNyZWcodixyKQkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCXU2NCBfX3ZhbCA9ICh2KTsJCQkJCVwKKwkJYXNtIHZvbGF0aWxlKCJtc3JfcyAiIF9fc3RyaW5naWZ5KHIpICIsICUwIiA6IDogInIiIChfX3ZhbCkpO1wKKwl9IHdoaWxlICgwKQorCiAvKgogICogTG93LWxldmVsIGFjY2Vzc29ycwogICoKQEAgLTE2NSw2ICsxNzksMTEgQEAKIAlpc2IoKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGdpY193cml0ZV9icHIxKHUzMiB2YWwpCit7CisJYXNtIHZvbGF0aWxlKCJtc3JfcyAiIF9fc3RyaW5naWZ5KElDQ19CUFIxX0VMMSkgIiwgJTAiIDogOiAiciIgKHZhbCkpOworfQorCiAjZGVmaW5lIGdpY19yZWFkX3R5cGVyKGMpCQlyZWFkcV9yZWxheGVkKGMpCiAjZGVmaW5lIGdpY193cml0ZV9pcm91dGVyKHYsIGMpCQl3cml0ZXFfcmVsYXhlZCh2LCBjKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2FyY2hfdGltZXIuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXJjaF90aW1lci5oCmluZGV4IGZiZTBjYTMuLmVhYTViYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXJjaF90aW1lci5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXJjaF90aW1lci5oCkBAIC0yMCwxMyArMjAsNTUgQEAKICNkZWZpbmUgX19BU01fQVJDSF9USU1FUl9ICiAKICNpbmNsdWRlIDxhc20vYmFycmllci5oPgorI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGNsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmg+CiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19GU0xfRVJSQVRVTV9BMDA4NTg1KQorZXh0ZXJuIHN0cnVjdCBzdGF0aWNfa2V5X2ZhbHNlIGFyY2hfdGltZXJfcmVhZF9vb2xfZW5hYmxlZDsKKyNkZWZpbmUgbmVlZHNfZnNsX2EwMDg1ODVfd29ya2Fyb3VuZCgpIFwKKwlzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhcmNoX3RpbWVyX3JlYWRfb29sX2VuYWJsZWQpCisjZWxzZQorI2RlZmluZSBuZWVkc19mc2xfYTAwODU4NV93b3JrYXJvdW5kKCkgIGZhbHNlCisjZW5kaWYKKwordTMyIF9fZnNsX2EwMDg1ODVfcmVhZF9jbnRwX3R2YWxfZWwwKHZvaWQpOwordTMyIF9fZnNsX2EwMDg1ODVfcmVhZF9jbnR2X3R2YWxfZWwwKHZvaWQpOwordTY0IF9fZnNsX2EwMDg1ODVfcmVhZF9jbnR2Y3RfZWwwKHZvaWQpOworCisvKgorICogVGhlIG51bWJlciBvZiByZXRyaWVzIGlzIGFuIGFyYml0cmFyeSB2YWx1ZSB3ZWxsIGJleW9uZCB0aGUgaGlnaGVzdCBudW1iZXIKKyAqIG9mIGl0ZXJhdGlvbnMgdGhlIGxvb3AgaGFzIGJlZW4gb2JzZXJ2ZWQgdG8gdGFrZS4KKyAqLworI2RlZmluZSBfX2ZzbF9hMDA4NTg1X3JlYWRfcmVnKHJlZykgKHsJCQlcCisJdTY0IF9vbGQsIF9uZXc7CQkJCQlcCisJaW50IF9yZXRyaWVzID0gMjAwOwkJCQlcCisJCQkJCQkJXAorCWRvIHsJCQkJCQlcCisJCV9vbGQgPSByZWFkX3N5c3JlZyhyZWcpOwkJXAorCQlfbmV3ID0gcmVhZF9zeXNyZWcocmVnKTsJCVwKKwkJX3JldHJpZXMtLTsJCQkJXAorCX0gd2hpbGUgKHVubGlrZWx5KF9vbGQgIT0gX25ldykgJiYgX3JldHJpZXMpOwlcCisJCQkJCQkJXAorCVdBUk5fT05fT05DRSghX3JldHJpZXMpOwkJCVwKKwlfbmV3OwkJCQkJCVwKK30pCisKKyNkZWZpbmUgYXJjaF90aW1lcl9yZWdfcmVhZF9zdGFibGUocmVnKSAJCVwKKyh7CQkJCQkJCVwKKwl1NjQgX3ZhbDsJCQkJCVwKKwlpZiAobmVlZHNfZnNsX2EwMDg1ODVfd29ya2Fyb3VuZCgpKQkJXAorCQlfdmFsID0gX19mc2xfYTAwODU4NV9yZWFkXyMjcmVnKCk7CVwKKwllbHNlCQkJCQkJXAorCQlfdmFsID0gcmVhZF9zeXNyZWcocmVnKTsJCVwKKwlfdmFsOwkJCQkJCVwKK30pCisKIC8qCiAgKiBUaGVzZSByZWdpc3RlciBhY2Nlc3NvcnMgYXJlIG1hcmtlZCBpbmxpbmUgc28gdGhlIGNvbXBpbGVyIGNhbgogICogbmljZWx5IHdvcmsgb3V0IHdoaWNoIHJlZ2lzdGVyIHdlIHdhbnQsIGFuZCBjaHVjayBhd2F5IHRoZSByZXN0IG9mCkBAIC0zOCwxOSArODAsMTkgQEAKIAlpZiAoYWNjZXNzID09IEFSQ0hfVElNRVJfUEhZU19BQ0NFU1MpIHsKIAkJc3dpdGNoIChyZWcpIHsKIAkJY2FzZSBBUkNIX1RJTUVSX1JFR19DVFJMOgotCQkJYXNtIHZvbGF0aWxlKCJtc3IgY250cF9jdGxfZWwwLCAgJTAiIDogOiAiciIgKHZhbCkpOworCQkJd3JpdGVfc3lzcmVnKHZhbCwgY250cF9jdGxfZWwwKTsKIAkJCWJyZWFrOwogCQljYXNlIEFSQ0hfVElNRVJfUkVHX1RWQUw6Ci0JCQlhc20gdm9sYXRpbGUoIm1zciBjbnRwX3R2YWxfZWwwLCAlMCIgOiA6ICJyIiAodmFsKSk7CisJCQl3cml0ZV9zeXNyZWcodmFsLCBjbnRwX3R2YWxfZWwwKTsKIAkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIGlmIChhY2Nlc3MgPT0gQVJDSF9USU1FUl9WSVJUX0FDQ0VTUykgewogCQlzd2l0Y2ggKHJlZykgewogCQljYXNlIEFSQ0hfVElNRVJfUkVHX0NUUkw6Ci0JCQlhc20gdm9sYXRpbGUoIm1zciBjbnR2X2N0bF9lbDAsICAlMCIgOiA6ICJyIiAodmFsKSk7CisJCQl3cml0ZV9zeXNyZWcodmFsLCBjbnR2X2N0bF9lbDApOwogCQkJYnJlYWs7CiAJCWNhc2UgQVJDSF9USU1FUl9SRUdfVFZBTDoKLQkJCWFzbSB2b2xhdGlsZSgibXNyIGNudHZfdHZhbF9lbDAsICUwIiA6IDogInIiICh2YWwpKTsKKwkJCXdyaXRlX3N5c3JlZyh2YWwsIGNudHZfdHZhbF9lbDApOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC02MSw0OCArMTAzLDM4IEBACiBzdGF0aWMgX19hbHdheXNfaW5saW5lCiB1MzIgYXJjaF90aW1lcl9yZWdfcmVhZF9jcDE1KGludCBhY2Nlc3MsIGVudW0gYXJjaF90aW1lcl9yZWcgcmVnKQogewotCXUzMiB2YWw7Ci0KIAlpZiAoYWNjZXNzID09IEFSQ0hfVElNRVJfUEhZU19BQ0NFU1MpIHsKIAkJc3dpdGNoIChyZWcpIHsKIAkJY2FzZSBBUkNIX1RJTUVSX1JFR19DVFJMOgotCQkJYXNtIHZvbGF0aWxlKCJtcnMgJTAsICBjbnRwX2N0bF9lbDAiIDogIj1yIiAodmFsKSk7Ci0JCQlicmVhazsKKwkJCXJldHVybiByZWFkX3N5c3JlZyhjbnRwX2N0bF9lbDApOwogCQljYXNlIEFSQ0hfVElNRVJfUkVHX1RWQUw6Ci0JCQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgY250cF90dmFsX2VsMCIgOiAiPXIiICh2YWwpKTsKLQkJCWJyZWFrOworCQkJcmV0dXJuIGFyY2hfdGltZXJfcmVnX3JlYWRfc3RhYmxlKGNudHBfdHZhbF9lbDApOwogCQl9CiAJfSBlbHNlIGlmIChhY2Nlc3MgPT0gQVJDSF9USU1FUl9WSVJUX0FDQ0VTUykgewogCQlzd2l0Y2ggKHJlZykgewogCQljYXNlIEFSQ0hfVElNRVJfUkVHX0NUUkw6Ci0JCQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgIGNudHZfY3RsX2VsMCIgOiAiPXIiICh2YWwpKTsKLQkJCWJyZWFrOworCQkJcmV0dXJuIHJlYWRfc3lzcmVnKGNudHZfY3RsX2VsMCk7CiAJCWNhc2UgQVJDSF9USU1FUl9SRUdfVFZBTDoKLQkJCWFzbSB2b2xhdGlsZSgibXJzICUwLCBjbnR2X3R2YWxfZWwwIiA6ICI9ciIgKHZhbCkpOwotCQkJYnJlYWs7CisJCQlyZXR1cm4gYXJjaF90aW1lcl9yZWdfcmVhZF9zdGFibGUoY250dl90dmFsX2VsMCk7CiAJCX0KIAl9CiAKLQlyZXR1cm4gdmFsOworCUJVRygpOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBhcmNoX3RpbWVyX2dldF9jbnRmcnEodm9pZCkKIHsKLQl1MzIgdmFsOwotCWFzbSB2b2xhdGlsZSgibXJzICUwLCAgIGNudGZycV9lbDAiIDogIj1yIiAodmFsKSk7Ci0JcmV0dXJuIHZhbDsKKwlyZXR1cm4gcmVhZF9zeXNyZWcoY250ZnJxX2VsMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGFyY2hfdGltZXJfZ2V0X2NudGtjdGwodm9pZCkKIHsKLQl1MzIgY250a2N0bDsKLQlhc20gdm9sYXRpbGUoIm1ycwklMCwgY250a2N0bF9lbDEiIDogIj1yIiAoY250a2N0bCkpOwotCXJldHVybiBjbnRrY3RsOworCXJldHVybiByZWFkX3N5c3JlZyhjbnRrY3RsX2VsMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3RpbWVyX3NldF9jbnRrY3RsKHUzMiBjbnRrY3RsKQogewotCWFzbSB2b2xhdGlsZSgibXNyCWNudGtjdGxfZWwxLCAlMCIgOiA6ICJyIiAoY250a2N0bCkpOworCXdyaXRlX3N5c3JlZyhjbnRrY3RsLCBjbnRrY3RsX2VsMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTY0IGFyY2hfY291bnRlcl9nZXRfY250cGN0KHZvaWQpCkBAIC0xMTYsMTIgKzE0OCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdTY0IGFyY2hfY291bnRlcl9nZXRfY250dmN0KHZvaWQpCiB7Ci0JdTY0IGN2YWw7Ci0KIAlpc2IoKTsKLQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgY250dmN0X2VsMCIgOiAiPXIiIChjdmFsKSk7Ci0KLQlyZXR1cm4gY3ZhbDsKKwlyZXR1cm4gYXJjaF90aW1lcl9yZWdfcmVhZF9zdGFibGUoY250dmN0X2VsMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFyY2hfdGltZXJfYXJjaF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hc3NlbWJsZXIuaAppbmRleCBkNTAyNWM2Li4yOGJmZTYxIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Fzc2VtYmxlci5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgKQEAgLTg3LDYgKzg3LDE1IEBACiAJLmVuZG0KIAogLyoKKyAqIE5PUCBzZXF1ZW5jZQorICovCisJLm1hY3JvCW5vcHMsIG51bQorCS5yZXB0CVxudW0KKwlub3AKKwkuZW5kcgorCS5lbmRtCisKKy8qCiAgKiBFbWl0IGFuIGVudHJ5IGludG8gdGhlIGV4Y2VwdGlvbiB0YWJsZQogICovCiAJLm1hY3JvCQlfYXNtX2V4dGFibGUsIGZyb20sIHRvCkBAIC0yMTYsMTEgKzIyNSwyNiBAQAogCS5tYWNybwltbWlkLCByZCwgcm4KIAlsZHIJXHJkLCBbXHJuLCAjTU1fQ09OVEVYVF9JRF0KIAkuZW5kbQorLyoKKyAqIHJlYWRfY3RyIC0gcmVhZCBDVFJfRUwwLiBJZiB0aGUgc3lzdGVtIGhhcyBtaXNtYXRjaGVkCisgKiBjYWNoZSBsaW5lIHNpemVzLCBwcm92aWRlIHRoZSBzeXN0ZW0gd2lkZSBzYWZlIHZhbHVlCisgKiBmcm9tIGFybTY0X2Z0cl9yZWdfY3RyZWwwLnN5c192YWwKKyAqLworCS5tYWNybwlyZWFkX2N0ciwgcmVnCithbHRlcm5hdGl2ZV9pZl9ub3QgQVJNNjRfTUlTTUFUQ0hFRF9DQUNIRV9MSU5FX1NJWkUKKwltcnMJXHJlZywgY3RyX2VsMAkJCS8vIHJlYWQgQ1RSCisJbm9wCithbHRlcm5hdGl2ZV9lbHNlCisJbGRyX2wJXHJlZywgYXJtNjRfZnRyX3JlZ19jdHJlbDAgKyBBUk02NF9GVFJfU1lTVkFMCithbHRlcm5hdGl2ZV9lbmRpZgorCS5lbmRtCisKIAogLyoKLSAqIGRjYWNoZV9saW5lX3NpemUgLSBnZXQgdGhlIG1pbmltdW0gRC1jYWNoZSBsaW5lIHNpemUgZnJvbSB0aGUgQ1RSIHJlZ2lzdGVyLgorICogcmF3X2RjYWNoZV9saW5lX3NpemUgLSBnZXQgdGhlIG1pbmltdW0gRC1jYWNoZSBsaW5lIHNpemUgb24gdGhpcyBDUFUKKyAqIGZyb20gdGhlIENUUiByZWdpc3Rlci4KICAqLwotCS5tYWNybwlkY2FjaGVfbGluZV9zaXplLCByZWcsIHRtcAorCS5tYWNybwlyYXdfZGNhY2hlX2xpbmVfc2l6ZSwgcmVnLCB0bXAKIAltcnMJXHRtcCwgY3RyX2VsMAkJCS8vIHJlYWQgQ1RSCiAJdWJmbQlcdG1wLCBcdG1wLCAjMTYsICMxOQkJLy8gY2FjaGUgbGluZSBzaXplIGVuY29kaW5nCiAJbW92CVxyZWcsICM0CQkJLy8gYnl0ZXMgcGVyIHdvcmQKQEAgLTIyOCw5ICsyNTIsMjAgQEAKIAkuZW5kbQogCiAvKgotICogaWNhY2hlX2xpbmVfc2l6ZSAtIGdldCB0aGUgbWluaW11bSBJLWNhY2hlIGxpbmUgc2l6ZSBmcm9tIHRoZSBDVFIgcmVnaXN0ZXIuCisgKiBkY2FjaGVfbGluZV9zaXplIC0gZ2V0IHRoZSBzYWZlIEQtY2FjaGUgbGluZSBzaXplIGFjcm9zcyBhbGwgQ1BVcwogICovCi0JLm1hY3JvCWljYWNoZV9saW5lX3NpemUsIHJlZywgdG1wCisJLm1hY3JvCWRjYWNoZV9saW5lX3NpemUsIHJlZywgdG1wCisJcmVhZF9jdHIJXHRtcAorCXViZm0JCVx0bXAsIFx0bXAsICMxNiwgIzE5CS8vIGNhY2hlIGxpbmUgc2l6ZSBlbmNvZGluZworCW1vdgkJXHJlZywgIzQJCS8vIGJ5dGVzIHBlciB3b3JkCisJbHNsCQlccmVnLCBccmVnLCBcdG1wCS8vIGFjdHVhbCBjYWNoZSBsaW5lIHNpemUKKwkuZW5kbQorCisvKgorICogcmF3X2ljYWNoZV9saW5lX3NpemUgLSBnZXQgdGhlIG1pbmltdW0gSS1jYWNoZSBsaW5lIHNpemUgb24gdGhpcyBDUFUKKyAqIGZyb20gdGhlIENUUiByZWdpc3Rlci4KKyAqLworCS5tYWNybwlyYXdfaWNhY2hlX2xpbmVfc2l6ZSwgcmVnLCB0bXAKIAltcnMJXHRtcCwgY3RyX2VsMAkJCS8vIHJlYWQgQ1RSCiAJYW5kCVx0bXAsIFx0bXAsICMweGYJCS8vIGNhY2hlIGxpbmUgc2l6ZSBlbmNvZGluZwogCW1vdglccmVnLCAjNAkJCS8vIGJ5dGVzIHBlciB3b3JkCkBAIC0yMzgsNiArMjczLDE2IEBACiAJLmVuZG0KIAogLyoKKyAqIGljYWNoZV9saW5lX3NpemUgLSBnZXQgdGhlIHNhZmUgSS1jYWNoZSBsaW5lIHNpemUgYWNyb3NzIGFsbCBDUFVzCisgKi8KKwkubWFjcm8JaWNhY2hlX2xpbmVfc2l6ZSwgcmVnLCB0bXAKKwlyZWFkX2N0cglcdG1wCisJYW5kCQlcdG1wLCBcdG1wLCAjMHhmCS8vIGNhY2hlIGxpbmUgc2l6ZSBlbmNvZGluZworCW1vdgkJXHJlZywgIzQJCS8vIGJ5dGVzIHBlciB3b3JkCisJbHNsCQlccmVnLCBccmVnLCBcdG1wCS8vIGFjdHVhbCBjYWNoZSBsaW5lIHNpemUKKwkuZW5kbQorCisvKgogICogdGNyX3NldF9pZG1hcF90MHN6IC0gdXBkYXRlIFRDUi5UMFNaIHNvIHRoYXQgd2UgY2FuIGxvYWQgdGhlIElEIG1hcAogICovCiAJLm1hY3JvCXRjcl9zZXRfaWRtYXBfdDBzeiwgdmFscmVnLCB0bXByZWcKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYXRvbWljX2xzZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hdG9taWNfbHNlLmgKaW5kZXggYjU4OTBiZS4uNzQ1N2NlMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hdG9taWNfbHNlLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9hdG9taWNfbHNlLmgKQEAgLTg2LDggKzg2LDggQEAKIAkJCQkJCQkJCVwKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAkJCQlcCiAJLyogTEwvU0MgKi8JCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKLQlfX0xMX1NDX0FUT01JQyhhZGRfcmV0dXJuIyNuYW1lKSwJCQkJXAorCV9fTExfU0NfQVRPTUlDKGFkZF9yZXR1cm4jI25hbWUpCQkJCVwKKwlfX25vcHMoMSksCQkJCQkJCVwKIAkvKiBMU0UgYXRvbWljcyAqLwkJCQkJCVwKIAkiCWxkYWRkIiAjbWIgIgkld1tpXSwgdzMwLCAlW3ZdXG4iCQkJXAogCSIJYWRkCSV3W2ldLCAld1tpXSwgdzMwIikJCQkJXApAQCAtMTEyLDggKzExMiw4IEBACiAKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAogCS8qIExML1NDICovCi0JIglub3BcbiIKLQlfX0xMX1NDX0FUT01JQyhhbmQpLAorCV9fTExfU0NfQVRPTUlDKGFuZCkKKwlfX25vcHMoMSksCiAJLyogTFNFIGF0b21pY3MgKi8KIAkiCW12bgkld1tpXSwgJXdbaV1cbiIKIAkiCXN0Y2xyCSV3W2ldLCAlW3ZdIikKQEAgLTEzMCw4ICsxMzAsOCBAQAogCQkJCQkJCQkJXAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCQkJCVwKIAkvKiBMTC9TQyAqLwkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAotCV9fTExfU0NfQVRPTUlDKGZldGNoX2FuZCMjbmFtZSksCQkJCVwKKwlfX0xMX1NDX0FUT01JQyhmZXRjaF9hbmQjI25hbWUpCQkJCQlcCisJX19ub3BzKDEpLAkJCQkJCQlcCiAJLyogTFNFIGF0b21pY3MgKi8JCQkJCQlcCiAJIgltdm4JJXdbaV0sICV3W2ldXG4iCQkJCQlcCiAJIglsZGNsciIgI21iICIJJXdbaV0sICV3W2ldLCAlW3ZdIikJCQlcCkBAIC0xNTYsOCArMTU2LDggQEAKIAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCiAJLyogTEwvU0MgKi8KLQkiCW5vcFxuIgotCV9fTExfU0NfQVRPTUlDKHN1YiksCisJX19MTF9TQ19BVE9NSUMoc3ViKQorCV9fbm9wcygxKSwKIAkvKiBMU0UgYXRvbWljcyAqLwogCSIJbmVnCSV3W2ldLCAld1tpXVxuIgogCSIJc3RhZGQJJXdbaV0sICVbdl0iKQpAQCAtMTc0LDkgKzE3NCw4IEBACiAJCQkJCQkJCQlcCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigJCQkJXAogCS8qIExML1NDICovCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCiAJX19MTF9TQ19BVE9NSUMoc3ViX3JldHVybiMjbmFtZSkJCQkJXAotCSIJbm9wIiwJCQkJCQkJXAorCV9fbm9wcygyKSwJCQkJCQkJXAogCS8qIExTRSBhdG9taWNzICovCQkJCQkJXAogCSIJbmVnCSV3W2ldLCAld1tpXVxuIgkJCQkJXAogCSIJbGRhZGQiICNtYiAiCSV3W2ldLCB3MzAsICVbdl1cbiIJCQlcCkBAIC0yMDMsOCArMjAyLDggQEAKIAkJCQkJCQkJCVwKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAkJCQlcCiAJLyogTEwvU0MgKi8JCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKLQlfX0xMX1NDX0FUT01JQyhmZXRjaF9zdWIjI25hbWUpLAkJCQlcCisJX19MTF9TQ19BVE9NSUMoZmV0Y2hfc3ViIyNuYW1lKQkJCQkJXAorCV9fbm9wcygxKSwJCQkJCQkJXAogCS8qIExTRSBhdG9taWNzICovCQkJCQkJXAogCSIJbmVnCSV3W2ldLCAld1tpXVxuIgkJCQkJXAogCSIJbGRhZGQiICNtYiAiCSV3W2ldLCAld1tpXSwgJVt2XSIpCQkJXApAQCAtMjg0LDggKzI4Myw4IEBACiAJCQkJCQkJCQlcCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigJCQkJXAogCS8qIExML1NDICovCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCi0JX19MTF9TQ19BVE9NSUM2NChhZGRfcmV0dXJuIyNuYW1lKSwJCQkJXAorCV9fTExfU0NfQVRPTUlDNjQoYWRkX3JldHVybiMjbmFtZSkJCQkJXAorCV9fbm9wcygxKSwJCQkJCQkJXAogCS8qIExTRSBhdG9taWNzICovCQkJCQkJXAogCSIJbGRhZGQiICNtYiAiCSVbaV0sIHgzMCwgJVt2XVxuIgkJCVwKIAkiCWFkZAklW2ldLCAlW2ldLCB4MzAiKQkJCQlcCkBAIC0zMTAsOCArMzA5LDggQEAKIAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCiAJLyogTEwvU0MgKi8KLQkiCW5vcFxuIgotCV9fTExfU0NfQVRPTUlDNjQoYW5kKSwKKwlfX0xMX1NDX0FUT01JQzY0KGFuZCkKKwlfX25vcHMoMSksCiAJLyogTFNFIGF0b21pY3MgKi8KIAkiCW12bgklW2ldLCAlW2ldXG4iCiAJIglzdGNscgklW2ldLCAlW3ZdIikKQEAgLTMyOCw4ICszMjcsOCBAQAogCQkJCQkJCQkJXAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCQkJCVwKIAkvKiBMTC9TQyAqLwkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAotCV9fTExfU0NfQVRPTUlDNjQoZmV0Y2hfYW5kIyNuYW1lKSwJCQkJXAorCV9fTExfU0NfQVRPTUlDNjQoZmV0Y2hfYW5kIyNuYW1lKQkJCQlcCisJX19ub3BzKDEpLAkJCQkJCQlcCiAJLyogTFNFIGF0b21pY3MgKi8JCQkJCQlcCiAJIgltdm4JJVtpXSwgJVtpXVxuIgkJCQkJXAogCSIJbGRjbHIiICNtYiAiCSVbaV0sICVbaV0sICVbdl0iKQkJCVwKQEAgLTM1NCw4ICszNTMsOCBAQAogCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigKIAkvKiBMTC9TQyAqLwotCSIJbm9wXG4iCi0JX19MTF9TQ19BVE9NSUM2NChzdWIpLAorCV9fTExfU0NfQVRPTUlDNjQoc3ViKQorCV9fbm9wcygxKSwKIAkvKiBMU0UgYXRvbWljcyAqLwogCSIJbmVnCSVbaV0sICVbaV1cbiIKIAkiCXN0YWRkCSVbaV0sICVbdl0iKQpAQCAtMzcyLDkgKzM3MSw4IEBACiAJCQkJCQkJCQlcCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigJCQkJXAogCS8qIExML1NDICovCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCiAJX19MTF9TQ19BVE9NSUM2NChzdWJfcmV0dXJuIyNuYW1lKQkJCQlcCi0JIglub3AiLAkJCQkJCQlcCisJX19ub3BzKDIpLAkJCQkJCQlcCiAJLyogTFNFIGF0b21pY3MgKi8JCQkJCQlcCiAJIgluZWcJJVtpXSwgJVtpXVxuIgkJCQkJXAogCSIJbGRhZGQiICNtYiAiCSVbaV0sIHgzMCwgJVt2XVxuIgkJCVwKQEAgLTQwMSw4ICszOTksOCBAQAogCQkJCQkJCQkJXAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCQkJCVwKIAkvKiBMTC9TQyAqLwkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAotCV9fTExfU0NfQVRPTUlDNjQoZmV0Y2hfc3ViIyNuYW1lKSwJCQkJXAorCV9fTExfU0NfQVRPTUlDNjQoZmV0Y2hfc3ViIyNuYW1lKQkJCQlcCisJX19ub3BzKDEpLAkJCQkJCQlcCiAJLyogTFNFIGF0b21pY3MgKi8JCQkJCQlcCiAJIgluZWcJJVtpXSwgJVtpXVxuIgkJCQkJXAogCSIJbGRhZGQiICNtYiAiCSVbaV0sICVbaV0sICVbdl0iKQkJCVwKQEAgLTQyNiwxMyArNDI0LDggQEAKIAogCWFzbSB2b2xhdGlsZShBUk02NF9MU0VfQVRPTUlDX0lOU04oCiAJLyogTEwvU0MgKi8KLQkiCW5vcFxuIgogCV9fTExfU0NfQVRPTUlDNjQoZGVjX2lmX3Bvc2l0aXZlKQotCSIJbm9wXG4iCi0JIglub3BcbiIKLQkiCW5vcFxuIgotCSIJbm9wXG4iCi0JIglub3AiLAorCV9fbm9wcyg2KSwKIAkvKiBMU0UgYXRvbWljcyAqLwogCSIxOglsZHIJeDMwLCAlW3ZdXG4iCiAJIglzdWJzCSVbcmV0XSwgeDMwLCAjMVxuIgpAQCAtNDY0LDkgKzQ1Nyw4IEBACiAJCQkJCQkJCQlcCiAJYXNtIHZvbGF0aWxlKEFSTTY0X0xTRV9BVE9NSUNfSU5TTigJCQkJXAogCS8qIExML1NDICovCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCi0JCV9fTExfU0NfQ01QWENIRyhuYW1lKQkJCQkJXAotCSIJbm9wIiwJCQkJCQkJXAorCV9fTExfU0NfQ01QWENIRyhuYW1lKQkJCQkJCVwKKwlfX25vcHMoMiksCQkJCQkJCVwKIAkvKiBMU0UgYXRvbWljcyAqLwkJCQkJCVwKIAkiCW1vdgkiICN3ICIzMCwgJSIgI3cgIltvbGRdXG4iCQkJXAogCSIJY2FzIiAjbWIgI3N6ICJcdCIgI3cgIjMwLCAlIiAjdyAiW25ld10sICVbdl1cbiIJCVwKQEAgLTUxNywxMCArNTA5LDggQEAKIAkJCQkJCQkJCVwKIAlhc20gdm9sYXRpbGUoQVJNNjRfTFNFX0FUT01JQ19JTlNOKAkJCQlcCiAJLyogTEwvU0MgKi8JCQkJCQkJXAotCSIJbm9wXG4iCQkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAotCV9fTExfU0NfQ01QWENIR19EQkwobmFtZSksCQkJCQlcCisJX19MTF9TQ19DTVBYQ0hHX0RCTChuYW1lKQkJCQkJXAorCV9fbm9wcygzKSwJCQkJCQkJXAogCS8qIExTRSBhdG9taWNzICovCQkJCQkJXAogCSIJY2FzcCIgI21iICJcdCVbb2xkMV0sICVbb2xkMl0sICVbbmV3MV0sICVbbmV3Ml0sICVbdl1cbiJcCiAJIgllb3IJJVtvbGQxXSwgJVtvbGQxXSwgJVtvbGR2YWwxXVxuIgkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vYmFycmllci5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9iYXJyaWVyLmgKaW5kZXggNGVlYTdmNi4uNGUwNDk3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9iYXJyaWVyLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9iYXJyaWVyLmgKQEAgLTIwLDYgKzIwLDkgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAorI2RlZmluZSBfX25vcHMobikJIi5yZXB0CSIgI24gIlxubm9wXG4uZW5kclxuIgorI2RlZmluZSBub3BzKG4pCQlhc20gdm9sYXRpbGUoX19ub3BzKG4pKQorCiAjZGVmaW5lIHNldigpCQlhc20gdm9sYXRpbGUoInNldiIgOiA6IDogIm1lbW9yeSIpCiAjZGVmaW5lIHdmZSgpCQlhc20gdm9sYXRpbGUoIndmZSIgOiA6IDogIm1lbW9yeSIpCiAjZGVmaW5lIHdmaSgpCQlhc20gdm9sYXRpbGUoIndmaSIgOiA6IDogIm1lbW9yeSIpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NhY2hlZmx1c2guaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCmluZGV4IGM2NDI2OGQuLjJlNWZiOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oCkBAIC02OCw2ICs2OCw3IEBACiBleHRlcm4gdm9pZCBmbHVzaF9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogZXh0ZXJuIHZvaWQgZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKIGV4dGVybiB2b2lkIF9fZmx1c2hfZGNhY2hlX2FyZWEodm9pZCAqYWRkciwgc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCBfX2NsZWFuX2RjYWNoZV9hcmVhX3BvYyh2b2lkICphZGRyLCBzaXplX3QgbGVuKTsKIGV4dGVybiB2b2lkIF9fY2xlYW5fZGNhY2hlX2FyZWFfcG91KHZvaWQgKmFkZHIsIHNpemVfdCBsZW4pOwogZXh0ZXJuIGxvbmcgX19mbHVzaF9jYWNoZV91c2VyX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKIApAQCAtODUsNyArODYsNyBAQAogICovCiBleHRlcm4gdm9pZCBfX2RtYV9tYXBfYXJlYShjb25zdCB2b2lkICosIHNpemVfdCwgaW50KTsKIGV4dGVybiB2b2lkIF9fZG1hX3VubWFwX2FyZWEoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7Ci1leHRlcm4gdm9pZCBfX2RtYV9mbHVzaF9yYW5nZShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7CitleHRlcm4gdm9pZCBfX2RtYV9mbHVzaF9hcmVhKGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKIAogLyoKICAqIENvcHkgdXNlciBkYXRhIGZyb20vdG8gYSBwYWdlIHdoaWNoIGlzIG1hcHBlZCBpbnRvIGEgZGlmZmVyZW50CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Nsb2Nrc291cmNlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Nsb2Nrc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzNTBhNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY2xvY2tzb3VyY2UuaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgX0FTTV9DTE9DS1NPVVJDRV9ICisjZGVmaW5lIF9BU01fQ0xPQ0tTT1VSQ0VfSAorCitzdHJ1Y3QgYXJjaF9jbG9ja3NvdXJjZV9kYXRhIHsKKwlib29sIHZkc29fZGlyZWN0OwkvKiBVc2FibGUgZm9yIGRpcmVjdCBWRFNPIGFjY2Vzcz8gKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jbXB4Y2hnLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NtcHhjaGcuaAppbmRleCBiZDg2YTc5Li45MWIyNmQyIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NtcHhjaGcuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NtcHhjaGcuaApAQCAtNDMsMTAgKzQzLDggQEAKIAkiCWNibnoJJXcxLCAxYlxuIgkJCQkJXAogCSIJIiAjbWIsCQkJCQkJCVwKIAkvKiBMU0UgYXRvbWljcyAqLwkJCQkJCVwKLQkiCW5vcFxuIgkJCQkJCQlcCi0JIglub3BcbiIJCQkJCQkJXAogCSIJc3dwIiAjYWNxX2xzZSAjcmVsICNzeiAiXHQlIiAjdyAiMywgJSIgI3cgIjAsICUyXG4iCVwKLQkiCW5vcFxuIgkJCQkJCQlcCisJCV9fbm9wcygzKQkJCQkJCVwKIAkiCSIgI25vcF9sc2UpCQkJCQkJXAogCTogIj0mciIgKHJldCksICI9JnIiICh0bXApLCAiK1EiICgqKHU4ICopcHRyKQkJCVwKIAk6ICJyIiAoeCkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAppbmRleCA3MDk5ZjI2Li43NThkNzRmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaApAQCAtOSw2ICs5LDggQEAKICNpZm5kZWYgX19BU01fQ1BVRkVBVFVSRV9ICiAjZGVmaW5lIF9fQVNNX0NQVUZFQVRVUkVfSAogCisjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgorCiAjaW5jbHVkZSA8YXNtL2h3Y2FwLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogCkBAIC0zNyw4ICszOSw5IEBACiAjZGVmaW5lIEFSTTY0X1dPUktBUk9VTkRfQ0FWSVVNXzI3NDU2CQkxMgogI2RlZmluZSBBUk02NF9IQVNfMzJCSVRfRUwwCQkJMTMKICNkZWZpbmUgQVJNNjRfSFlQX09GRlNFVF9MT1cJCQkxNAorI2RlZmluZSBBUk02NF9NSVNNQVRDSEVEX0NBQ0hFX0xJTkVfU0laRQkxNQogCi0jZGVmaW5lIEFSTTY0X05DQVBTCQkJCTE1CisjZGVmaW5lIEFSTTY0X05DQVBTCQkJCTE2CiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTYzLDcgKzY2LDcgQEAKIAllbnVtIGZ0cl90eXBlCXR5cGU7CiAJdTgJCXNoaWZ0OwogCXU4CQl3aWR0aDsKLQlzNjQJCXNhZmVfdmFsOyAvKiBzYWZlIHZhbHVlIGZvciBkaXNjcmV0ZSBmZWF0dXJlcyAqLworCXM2NAkJc2FmZV92YWw7IC8qIHNhZmUgdmFsdWUgZm9yIEZUUl9FWEFDVCBmZWF0dXJlcyAqLwogfTsKIAogLyoKQEAgLTcyLDEzICs3NSwxNCBAQAogICogQHN5c192YWwJCVNhZmUgdmFsdWUgYWNyb3NzIHRoZSBDUFVzIChzeXN0ZW0gdmlldykKICAqLwogc3RydWN0IGFybTY0X2Z0cl9yZWcgewotCXUzMgkJCXN5c19pZDsKLQljb25zdCBjaGFyCQkqbmFtZTsKLQl1NjQJCQlzdHJpY3RfbWFzazsKLQl1NjQJCQlzeXNfdmFsOwotCXN0cnVjdCBhcm02NF9mdHJfYml0cwkqZnRyX2JpdHM7CisJY29uc3QgY2hhcgkJCSpuYW1lOworCXU2NAkJCQlzdHJpY3RfbWFzazsKKwl1NjQJCQkJc3lzX3ZhbDsKKwljb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMJKmZ0cl9iaXRzOwogfTsKIAorZXh0ZXJuIHN0cnVjdCBhcm02NF9mdHJfcmVnIGFybTY0X2Z0cl9yZWdfY3RyZWwwOworCiAvKiBzY29wZSBvZiBjYXBhYmlsaXR5IGNoZWNrICovCiBlbnVtIHsKIAlTQ09QRV9TWVNURU0sCkBAIC0xMDksNiArMTEzLDcgQEAKIH07CiAKIGV4dGVybiBERUNMQVJFX0JJVE1BUChjcHVfaHdjYXBzLCBBUk02NF9OQ0FQUyk7CitleHRlcm4gc3RydWN0IHN0YXRpY19rZXlfZmFsc2UgY3B1X2h3Y2FwX2tleXNbQVJNNjRfTkNBUFNdOwogCiBib29sIHRoaXNfY3B1X2hhc19jYXAodW5zaWduZWQgaW50IGNhcCk7CiAKQEAgLTEyMSwxNiArMTI2LDIxIEBACiB7CiAJaWYgKG51bSA+PSBBUk02NF9OQ0FQUykKIAkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0ZXN0X2JpdChudW0sIGNwdV9od2NhcHMpOworCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChudW0pKQorCQlyZXR1cm4gc3RhdGljX2JyYW5jaF91bmxpa2VseSgmY3B1X2h3Y2FwX2tleXNbbnVtXSk7CisJZWxzZQorCQlyZXR1cm4gdGVzdF9iaXQobnVtLCBjcHVfaHdjYXBzKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNwdXNfc2V0X2NhcCh1bnNpZ25lZCBpbnQgbnVtKQogewotCWlmIChudW0gPj0gQVJNNjRfTkNBUFMpCisJaWYgKG51bSA+PSBBUk02NF9OQ0FQUykgewogCQlwcl93YXJuKCJBdHRlbXB0IHRvIHNldCBhbiBpbGxlZ2FsIENQVSBjYXBhYmlsaXR5ICglZCA+PSAlZClcbiIsCiAJCQludW0sIEFSTTY0X05DQVBTKTsKLQllbHNlCisJfSBlbHNlIHsKIAkJX19zZXRfYml0KG51bSwgY3B1X2h3Y2Fwcyk7CisJCXN0YXRpY19icmFuY2hfZW5hYmxlKCZjcHVfaHdjYXBfa2V5c1tudW1dKTsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fYXR0cmlidXRlX2NvbnN0X18KQEAgLTE1Nyw3ICsxNjcsNyBAQAogCXJldHVybiBjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGRfd2lkdGgoZmVhdHVyZXMsIGZpZWxkLCA0KTsKIH0KIAotc3RhdGljIGlubGluZSB1NjQgYXJtNjRfZnRyX21hc2soc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwKQorc3RhdGljIGlubGluZSB1NjQgYXJtNjRfZnRyX21hc2soY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwKQogewogCXJldHVybiAodTY0KUdFTk1BU0soZnRycC0+c2hpZnQgKyBmdHJwLT53aWR0aCAtIDEsIGZ0cnAtPnNoaWZ0KTsKIH0KQEAgLTE3MCw3ICsxODAsNyBAQAogCQljcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoZmVhdHVyZXMsIGZpZWxkKTsKIH0KIAotc3RhdGljIGlubGluZSBzNjQgYXJtNjRfZnRyX3ZhbHVlKHN0cnVjdCBhcm02NF9mdHJfYml0cyAqZnRycCwgdTY0IHZhbCkKK3N0YXRpYyBpbmxpbmUgczY0IGFybTY0X2Z0cl92YWx1ZShjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnAsIHU2NCB2YWwpCiB7CiAJcmV0dXJuIChzNjQpY3B1aWRfZmVhdHVyZV9leHRyYWN0X2ZpZWxkKHZhbCwgZnRycC0+c2hpZnQsIGZ0cnAtPnNpZ24pOwogfQpAQCAtMTkzLDExICsyMDMsMTEgQEAKIHZvaWQgdXBkYXRlX2NwdV9jYXBhYmlsaXRpZXMoY29uc3Qgc3RydWN0IGFybTY0X2NwdV9jYXBhYmlsaXRpZXMgKmNhcHMsCiAJCQkgICAgY29uc3QgY2hhciAqaW5mbyk7CiB2b2lkIGVuYWJsZV9jcHVfY2FwYWJpbGl0aWVzKGNvbnN0IHN0cnVjdCBhcm02NF9jcHVfY2FwYWJpbGl0aWVzICpjYXBzKTsKLXZvaWQgY2hlY2tfbG9jYWxfY3B1X2VycmF0YSh2b2lkKTsKLXZvaWQgX19pbml0IGVuYWJsZV9lcnJhdGFfd29ya2Fyb3VuZHModm9pZCk7Cit2b2lkIGNoZWNrX2xvY2FsX2NwdV9jYXBhYmlsaXRpZXModm9pZCk7CiAKLXZvaWQgdmVyaWZ5X2xvY2FsX2NwdV9lcnJhdGEodm9pZCk7Ci12b2lkIHZlcmlmeV9sb2NhbF9jcHVfY2FwYWJpbGl0aWVzKHZvaWQpOwordm9pZCB1cGRhdGVfY3B1X2VycmF0YV93b3JrYXJvdW5kcyh2b2lkKTsKK3ZvaWQgX19pbml0IGVuYWJsZV9lcnJhdGFfd29ya2Fyb3VuZHModm9pZCk7Cit2b2lkIHZlcmlmeV9sb2NhbF9jcHVfZXJyYXRhX3dvcmthcm91bmRzKHZvaWQpOwogCiB1NjQgcmVhZF9zeXN0ZW1fcmVnKHUzMiBpZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vY3B1dHlwZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jcHV0eXBlLmgKaW5kZXggOWQ5ZmQ0Yi4uMjZhNjhkZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jcHV0eXBlLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jcHV0eXBlLmgKQEAgLTkzLDExICs5Myw3IEBACiAKICNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CiAKLSNkZWZpbmUgcmVhZF9jcHVpZChyZWcpICh7CQkJCQkJXAotCXU2NCBfX3ZhbDsJCQkJCQkJXAotCWFzbSgibXJzX3MJJTAsICIgX19zdHJpbmdpZnkoU1lTXyAjIyByZWcpIDogIj1yIiAoX192YWwpKTsJXAotCV9fdmFsOwkJCQkJCQkJXAotfSkKKyNkZWZpbmUgcmVhZF9jcHVpZChyZWcpCQkJcmVhZF9zeXNyZWdfcyhTWVNfICMjIHJlZykKIAogLyoKICAqIFRoZSBDUFUgSUQgbmV2ZXIgY2hhbmdlcyBhdCBydW4gdGltZSwgc28gd2UgbWlnaHQgYXMgd2VsbCB0ZWxsIHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kY2MuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGNjLmgKaW5kZXggNjVlMDE5MC4uODM2YjA1NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kY2MuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RjYy5oCkBAIC0yMSwyMSArMjEsMTYgQEAKICNkZWZpbmUgX19BU01fRENDX0gKIAogI2luY2x1ZGUgPGFzbS9iYXJyaWVyLmg+CisjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogCiBzdGF0aWMgaW5saW5lIHUzMiBfX2RjY19nZXRzdGF0dXModm9pZCkKIHsKLQl1MzIgcmV0OwotCi0JYXNtIHZvbGF0aWxlKCJtcnMgJTAsIG1kY2Nzcl9lbDAiIDogIj1yIiAocmV0KSk7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiByZWFkX3N5c3JlZyhtZGNjc3JfZWwwKTsKIH0KIAogc3RhdGljIGlubGluZSBjaGFyIF9fZGNjX2dldGNoYXIodm9pZCkKIHsKLQljaGFyIGM7Ci0KLQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgZGJnZHRycnhfZWwwIiA6ICI9ciIgKGMpKTsKKwljaGFyIGMgPSByZWFkX3N5c3JlZyhkYmdkdHJyeF9lbDApOwogCWlzYigpOwogCiAJcmV0dXJuIGM7CkBAIC00Nyw4ICs0Miw3IEBACiAJICogVGhlIHR5cGVjYXN0IGlzIHRvIG1ha2UgYWJzb2x1dGVseSBjZXJ0YWluIHRoYXQgJ2MnIGlzCiAJICogemVyby1leHRlbmRlZC4KIAkgKi8KLQlhc20gdm9sYXRpbGUoIm1zciBkYmdkdHJ0eF9lbDAsICUwIgotCQkJOiA6ICJyIiAoKHVuc2lnbmVkIGxvbmcpKHVuc2lnbmVkIGNoYXIpYykpOworCXdyaXRlX3N5c3JlZygodW5zaWduZWQgY2hhciljLCBkYmdkdHJ0eF9lbDApOwogCWlzYigpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RlYnVnLW1vbml0b3JzLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2RlYnVnLW1vbml0b3JzLmgKaW5kZXggNGI2YjNmNy4uYjcxNDIwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9kZWJ1Zy1tb25pdG9ycy5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZGVidWctbW9uaXRvcnMuaApAQCAtNjEsOCArNjEsNiBAQAogCiAjZGVmaW5lIEFBUkNINjRfQlJFQUtfS0dEQl9EWU5fREJHCVwKIAkoQUFSQ0g2NF9CUkVBS19NT04gfCAoS0dEQl9EWU5fREJHX0JSS19JTU0gPDwgNSkpCi0jZGVmaW5lIEtHREJfRFlOX0JSS19JTlNfQllURSh4KQlcCi0JKChBQVJDSDY0X0JSRUFLX0tHREJfRFlOX0RCRyA+PiAoOCAqICh4KSkpICYgMHhmZikKIAogI2RlZmluZSBDQUNIRV9GTFVTSF9JU19TQUZFCQkxCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oCmluZGV4IGY3NzJlMTUuLmQxNGM0NzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaApAQCAtNzgsNiArNzgsMjMgQEAKIAogI2RlZmluZSBFU1JfRUx4X0lMCQkoVUwoMSkgPDwgMjUpCiAjZGVmaW5lIEVTUl9FTHhfSVNTX01BU0sJKEVTUl9FTHhfSUwgLSAxKQorCisvKiBJU1MgZmllbGQgZGVmaW5pdGlvbnMgc2hhcmVkIGJ5IGRpZmZlcmVudCBjbGFzc2VzICovCisjZGVmaW5lIEVTUl9FTHhfV05SCQkoVUwoMSkgPDwgNikKKworLyogU2hhcmVkIElTUyBmaWVsZCBkZWZpbml0aW9ucyBmb3IgRGF0YS9JbnN0cnVjdGlvbiBhYm9ydHMgKi8KKyNkZWZpbmUgRVNSX0VMeF9FQQkJKFVMKDEpIDw8IDkpCisjZGVmaW5lIEVTUl9FTHhfUzFQVFcJCShVTCgxKSA8PCA3KQorCisvKiBTaGFyZWQgSVNTIGZhdWx0IHN0YXR1cyBjb2RlKElGU0MvREZTQykgZm9yIERhdGEvSW5zdHJ1Y3Rpb24gYWJvcnRzICovCisjZGVmaW5lIEVTUl9FTHhfRlNDCQkoMHgzRikKKyNkZWZpbmUgRVNSX0VMeF9GU0NfVFlQRQkoMHgzQykKKyNkZWZpbmUgRVNSX0VMeF9GU0NfRVhUQUJUCSgweDEwKQorI2RlZmluZSBFU1JfRUx4X0ZTQ19BQ0NFU1MJKDB4MDgpCisjZGVmaW5lIEVTUl9FTHhfRlNDX0ZBVUxUCSgweDA0KQorI2RlZmluZSBFU1JfRUx4X0ZTQ19QRVJNCSgweDBDKQorCisvKiBJU1MgZmllbGQgZGVmaW5pdGlvbnMgZm9yIERhdGEgQWJvcnRzICovCiAjZGVmaW5lIEVTUl9FTHhfSVNWCQkoVUwoMSkgPDwgMjQpCiAjZGVmaW5lIEVTUl9FTHhfU0FTX1NISUZUCSgyMikKICNkZWZpbmUgRVNSX0VMeF9TQVMJCShVTCgzKSA8PCBFU1JfRUx4X1NBU19TSElGVCkKQEAgLTg2LDE2ICsxMDMsOSBAQAogI2RlZmluZSBFU1JfRUx4X1NSVF9NQVNLCShVTCgweDFGKSA8PCBFU1JfRUx4X1NSVF9TSElGVCkKICNkZWZpbmUgRVNSX0VMeF9TRiAJCShVTCgxKSA8PCAxNSkKICNkZWZpbmUgRVNSX0VMeF9BUiAJCShVTCgxKSA8PCAxNCkKLSNkZWZpbmUgRVNSX0VMeF9FQSAJCShVTCgxKSA8PCA5KQogI2RlZmluZSBFU1JfRUx4X0NNIAkJKFVMKDEpIDw8IDgpCi0jZGVmaW5lIEVTUl9FTHhfUzFQVFcgCQkoVUwoMSkgPDwgNykKLSNkZWZpbmUgRVNSX0VMeF9XTlIJCShVTCgxKSA8PCA2KQotI2RlZmluZSBFU1JfRUx4X0ZTQwkJKDB4M0YpCi0jZGVmaW5lIEVTUl9FTHhfRlNDX1RZUEUJKDB4M0MpCi0jZGVmaW5lIEVTUl9FTHhfRlNDX0VYVEFCVAkoMHgxMCkKLSNkZWZpbmUgRVNSX0VMeF9GU0NfQUNDRVNTCSgweDA4KQotI2RlZmluZSBFU1JfRUx4X0ZTQ19GQVVMVAkoMHgwNCkKLSNkZWZpbmUgRVNSX0VMeF9GU0NfUEVSTQkoMHgwQykKKworLyogSVNTIGZpZWxkIGRlZmluaXRpb25zIGZvciBleGNlcHRpb25zIHRha2VuIGluIHRvIEh5cCAqLwogI2RlZmluZSBFU1JfRUx4X0NWCQkoVUwoMSkgPDwgMjQpCiAjZGVmaW5lIEVTUl9FTHhfQ09ORF9TSElGVAkoMjApCiAjZGVmaW5lIEVTUl9FTHhfQ09ORF9NQVNLCShVTCgweEYpIDw8IEVTUl9FTHhfQ09ORF9TSElGVCkKQEAgLTEwOSw2ICsxMTksNjIgQEAKIAkoKEVTUl9FTHhfRUNfQlJLNjQgPDwgRVNSX0VMeF9FQ19TSElGVCkgfCBFU1JfRUx4X0lMIHwJXAogCSAoKGltbSkgJiAweGZmZmYpKQogCisvKiBJU1MgZmllbGQgZGVmaW5pdGlvbnMgZm9yIFN5c3RlbSBpbnN0cnVjdGlvbiB0cmFwcyAqLworI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19SRVMwX1NISUZUCTIyCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX1JFUzBfTUFTSwkoVUwoMHg3KSA8PCBFU1JfRUx4X1NZUzY0X0lTU19SRVMwX1NISUZUKQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19ESVJfTUFTSwkweDEKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfRElSX1JFQUQJMHgxCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0RJUl9XUklURQkweDAKKworI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19SVF9TSElGVAk1CisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX1JUX01BU0sJKFVMKDB4MWYpIDw8IEVTUl9FTHhfU1lTNjRfSVNTX1JUX1NISUZUKQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fU0hJRlQJMQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fTUFTSwkoVUwoMHhmKSA8PCBFU1JfRUx4X1NZUzY0X0lTU19DUk1fU0hJRlQpCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0NSTl9TSElGVAkxMAorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19DUk5fTUFTSwkoVUwoMHhmKSA8PCBFU1JfRUx4X1NZUzY0X0lTU19DUk5fU0hJRlQpCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX09QMV9TSElGVAkxNAorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19PUDFfTUFTSwkoVUwoMHg3KSA8PCBFU1JfRUx4X1NZUzY0X0lTU19PUDFfU0hJRlQpCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX09QMl9TSElGVAkxNworI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19PUDJfTUFTSwkoVUwoMHg3KSA8PCBFU1JfRUx4X1NZUzY0X0lTU19PUDJfU0hJRlQpCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX09QMF9TSElGVAkyMAorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19PUDBfTUFTSwkoVUwoMHgzKSA8PCBFU1JfRUx4X1NZUzY0X0lTU19PUDBfU0hJRlQpCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX1NZU19NQVNLCShFU1JfRUx4X1NZUzY0X0lTU19PUDBfTUFTSyB8IFwKKwkJCQkJIEVTUl9FTHhfU1lTNjRfSVNTX09QMV9NQVNLIHwgXAorCQkJCQkgRVNSX0VMeF9TWVM2NF9JU1NfT1AyX01BU0sgfCBcCisJCQkJCSBFU1JfRUx4X1NZUzY0X0lTU19DUk5fTUFTSyB8IFwKKwkJCQkJIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9NQVNLKQorI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19TWVNfVkFMKG9wMCwgb3AxLCBvcDIsIGNybiwgY3JtKSBcCisJCQkJCSgoKG9wMCkgPDwgRVNSX0VMeF9TWVM2NF9JU1NfT1AwX1NISUZUKSB8IFwKKwkJCQkJICgob3AxKSA8PCBFU1JfRUx4X1NZUzY0X0lTU19PUDFfU0hJRlQpIHwgXAorCQkJCQkgKChvcDIpIDw8IEVTUl9FTHhfU1lTNjRfSVNTX09QMl9TSElGVCkgfCBcCisJCQkJCSAoKGNybikgPDwgRVNSX0VMeF9TWVM2NF9JU1NfQ1JOX1NISUZUKSB8IFwKKwkJCQkJICgoY3JtKSA8PCBFU1JfRUx4X1NZUzY0X0lTU19DUk1fU0hJRlQpKQorCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX1NZU19PUF9NQVNLCShFU1JfRUx4X1NZUzY0X0lTU19TWVNfTUFTSyB8IFwKKwkJCQkJIEVTUl9FTHhfU1lTNjRfSVNTX0RJUl9NQVNLKQorLyoKKyAqIFVzZXIgc3BhY2UgY2FjaGUgb3BlcmF0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgc3lzcmVnIGVuY29kaW5nCisgKiBpbiBTeXN0ZW0gaW5zdHJ1Y3Rpb25zLgorICogb3AwPTEsIG9wMT0zLCBvcDI9MSwgY3JuPTcsIGNybT17IDUsIDEwLCAxMSwgMTQgfSwgV1JJVEUgKEw9MCkKKyAqLworI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19DUk1fRENfQ0lWQUMJMTQKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX0RDX0NWQVUJMTEKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX0RDX0NWQUMJMTAKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX0lDX0lWQVUJNQorCisjZGVmaW5lIEVTUl9FTHhfU1lTNjRfSVNTX0VMMF9DQUNIRV9PUF9NQVNLCShFU1JfRUx4X1NZUzY0X0lTU19PUDBfTUFTSyB8IFwKKwkJCQkJCSBFU1JfRUx4X1NZUzY0X0lTU19PUDFfTUFTSyB8IFwKKwkJCQkJCSBFU1JfRUx4X1NZUzY0X0lTU19PUDJfTUFTSyB8IFwKKwkJCQkJCSBFU1JfRUx4X1NZUzY0X0lTU19DUk5fTUFTSyB8IFwKKwkJCQkJCSBFU1JfRUx4X1NZUzY0X0lTU19ESVJfTUFTSykKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfRUwwX0NBQ0hFX09QX1ZBTCBcCisJCQkJKEVTUl9FTHhfU1lTNjRfSVNTX1NZU19WQUwoMSwgMywgMSwgNywgMCkgfCBcCisJCQkJIEVTUl9FTHhfU1lTNjRfSVNTX0RJUl9XUklURSkKKworI2RlZmluZSBFU1JfRUx4X1NZUzY0X0lTU19TWVNfQ1RSCUVTUl9FTHhfU1lTNjRfSVNTX1NZU19WQUwoMywgMywgMSwgMCwgMCkKKyNkZWZpbmUgRVNSX0VMeF9TWVM2NF9JU1NfU1lTX0NUUl9SRUFECShFU1JfRUx4X1NZUzY0X0lTU19TWVNfQ1RSIHwgXAorCQkJCQkgRVNSX0VMeF9TWVM2NF9JU1NfRElSX1JFQUQpCisKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaHdfYnJlYWtwb2ludC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmgKaW5kZXggMTE1ZWEyYS4uOTUxMGFjZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9od19icmVha3BvaW50LmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CiAjaW5jbHVkZSA8YXNtL3ZpcnQuaD4KIAogI2lmZGVmIF9fS0VSTkVMX18KQEAgLTk4LDE4ICs5OSwxOCBAQAogI2RlZmluZSBBQVJDSDY0X0RCR19SRUdfV0NSCShBQVJDSDY0X0RCR19SRUdfV1ZSICsgQVJNX01BWF9XUlApCiAKIC8qIERlYnVnIHJlZ2lzdGVyIG5hbWVzLiAqLwotI2RlZmluZSBBQVJDSDY0X0RCR19SRUdfTkFNRV9CVlIJImJ2ciIKLSNkZWZpbmUgQUFSQ0g2NF9EQkdfUkVHX05BTUVfQkNSCSJiY3IiCi0jZGVmaW5lIEFBUkNINjRfREJHX1JFR19OQU1FX1dWUgkid3ZyIgotI2RlZmluZSBBQVJDSDY0X0RCR19SRUdfTkFNRV9XQ1IJIndjciIKKyNkZWZpbmUgQUFSQ0g2NF9EQkdfUkVHX05BTUVfQlZSCWJ2cgorI2RlZmluZSBBQVJDSDY0X0RCR19SRUdfTkFNRV9CQ1IJYmNyCisjZGVmaW5lIEFBUkNINjRfREJHX1JFR19OQU1FX1dWUgl3dnIKKyNkZWZpbmUgQUFSQ0g2NF9EQkdfUkVHX05BTUVfV0NSCXdjcgogCiAvKiBBY2Nlc3NvciBtYWNyb3MgZm9yIHRoZSBkZWJ1ZyByZWdpc3RlcnMuICovCiAjZGVmaW5lIEFBUkNINjRfREJHX1JFQUQoTiwgUkVHLCBWQUwpIGRvIHtcCi0JYXNtIHZvbGF0aWxlKCJtcnMgJTAsIGRiZyIgUkVHICNOICJfZWwxIiA6ICI9ciIgKFZBTCkpO1wKKwlWQUwgPSByZWFkX3N5c3JlZyhkYmcjI1JFRyMjTiMjX2VsMSk7XAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBBQVJDSDY0X0RCR19XUklURShOLCBSRUcsIFZBTCkgZG8ge1wKLQlhc20gdm9sYXRpbGUoIm1zciBkYmciIFJFRyAjTiAiX2VsMSwgJTAiIDo6ICJyIiAoVkFMKSk7XAorCXdyaXRlX3N5c3JlZyhWQUwsIGRiZyMjUkVHIyNOIyNfZWwxKTtcCiB9IHdoaWxlICgwKQogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CkBAIC0xNDEsOCArMTQyLDYgQEAKIH0KICNlbmRpZgogCi1leHRlcm4gc3RydWN0IHBtdSBwZXJmX29wc19icDsKLQogLyogRGV0ZXJtaW5lIG51bWJlciBvZiBCUlAgcmVnaXN0ZXJzIGF2YWlsYWJsZS4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGdldF9udW1fYnJwcyh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pbnNuLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2luc24uaAppbmRleCAxZGJhYTkwLi5iYzg1MzY2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2luc24uaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2luc24uaApAQCAtMjQ2LDcgKzI0Niw4IEBACiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHUzMiBhYXJjaDY0X2luc25fZ2V0XyMjYWJiciMjX3ZhbHVlKHZvaWQpIFwKIHsgcmV0dXJuICh2YWwpOyB9CiAKLV9fQUFSQ0g2NF9JTlNOX0ZVTkNTKGFkcl9hZHJwLAkweDFGMDAwMDAwLCAweDEwMDAwMDAwKQorX19BQVJDSDY0X0lOU05fRlVOQ1MoYWRyLAkweDlGMDAwMDAwLCAweDEwMDAwMDAwKQorX19BQVJDSDY0X0lOU05fRlVOQ1MoYWRycCwJMHg5RjAwMDAwMCwgMHg5MDAwMDAwMCkKIF9fQUFSQ0g2NF9JTlNOX0ZVTkNTKHByZm1fbGl0LAkweEZGMDAwMDAwLCAweEQ4MDAwMDAwKQogX19BQVJDSDY0X0lOU05fRlVOQ1Moc3RyX3JlZywJMHgzRkUwRUMwMCwgMHgzODIwNjgwMCkKIF9fQUFSQ0g2NF9JTlNOX0ZVTkNTKGxkcl9yZWcsCTB4M0ZFMEVDMDAsIDB4Mzg2MDY4MDApCkBAIC0zMTgsNiArMzE5LDExIEBACiBib29sIGFhcmNoNjRfaW5zbl9pc19ub3AodTMyIGluc24pOwogYm9vbCBhYXJjaDY0X2luc25faXNfYnJhbmNoX2ltbSh1MzIgaW5zbik7CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBhYXJjaDY0X2luc25faXNfYWRyX2FkcnAodTMyIGluc24pCit7CisJcmV0dXJuIGFhcmNoNjRfaW5zbl9pc19hZHIoaW5zbikgfHwgYWFyY2g2NF9pbnNuX2lzX2FkcnAoaW5zbik7Cit9CisKIGludCBhYXJjaDY0X2luc25fcmVhZCh2b2lkICphZGRyLCB1MzIgKmluc25wKTsKIGludCBhYXJjaDY0X2luc25fd3JpdGUodm9pZCAqYWRkciwgdTMyIGluc24pOwogZW51bSBhYXJjaDY0X2luc25fZW5jb2RpbmdfY2xhc3MgYWFyY2g2NF9nZXRfaW5zbl9jbGFzcyh1MzIgaW5zbik7CkBAIC0zOTgsNiArNDA0LDkgQEAKIGludCBhYXJjaDY0X2luc25fcGF0Y2hfdGV4dF9zeW5jKHZvaWQgKmFkZHJzW10sIHUzMiBpbnNuc1tdLCBpbnQgY250KTsKIGludCBhYXJjaDY0X2luc25fcGF0Y2hfdGV4dCh2b2lkICphZGRyc1tdLCB1MzIgaW5zbnNbXSwgaW50IGNudCk7CiAKK3MzMiBhYXJjaDY0X2luc25fYWRycF9nZXRfb2Zmc2V0KHUzMiBpbnNuKTsKK3UzMiBhYXJjaDY0X2luc25fYWRycF9zZXRfb2Zmc2V0KHUzMiBpbnNuLCBzMzIgb2Zmc2V0KTsKKwogYm9vbCBhYXJjaDMyX2luc25faXNfd2lkZSh1MzIgaW5zbik7CiAKICNkZWZpbmUgQTMyX1JOX09GRlNFVAkxNgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9pby5oCmluZGV4IDliNmU0MDguLjBiYmE0MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vaW8uaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2lvLmgKQEAgLTQwLDI1ICs0MCwyNSBAQAogI2RlZmluZSBfX3Jhd193cml0ZWIgX19yYXdfd3JpdGViCiBzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGViKHU4IHZhbCwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCWFzbSB2b2xhdGlsZSgic3RyYiAldzAsIFslMV0iIDogOiAiciIgKHZhbCksICJyIiAoYWRkcikpOworCWFzbSB2b2xhdGlsZSgic3RyYiAldzAsIFslMV0iIDogOiAicloiICh2YWwpLCAiciIgKGFkZHIpKTsKIH0KIAogI2RlZmluZSBfX3Jhd193cml0ZXcgX19yYXdfd3JpdGV3CiBzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGV3KHUxNiB2YWwsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlhc20gdm9sYXRpbGUoInN0cmggJXcwLCBbJTFdIiA6IDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsKKwlhc20gdm9sYXRpbGUoInN0cmggJXcwLCBbJTFdIiA6IDogInJaIiAodmFsKSwgInIiIChhZGRyKSk7CiB9CiAKICNkZWZpbmUgX19yYXdfd3JpdGVsIF9fcmF3X3dyaXRlbAogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlbCh1MzIgdmFsLCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JYXNtIHZvbGF0aWxlKCJzdHIgJXcwLCBbJTFdIiA6IDogInIiICh2YWwpLCAiciIgKGFkZHIpKTsKKwlhc20gdm9sYXRpbGUoInN0ciAldzAsIFslMV0iIDogOiAicloiICh2YWwpLCAiciIgKGFkZHIpKTsKIH0KIAogI2RlZmluZSBfX3Jhd193cml0ZXEgX19yYXdfd3JpdGVxCiBzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVxKHU2NCB2YWwsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQlhc20gdm9sYXRpbGUoInN0ciAlMCwgWyUxXSIgOiA6ICJyIiAodmFsKSwgInIiIChhZGRyKSk7CisJYXNtIHZvbGF0aWxlKCJzdHIgJXgwLCBbJTFdIiA6IDogInJaIiAodmFsKSwgInIiIChhZGRyKSk7CiB9CiAKICNkZWZpbmUgX19yYXdfcmVhZGIgX19yYXdfcmVhZGIKQEAgLTE4NCwxNyArMTg0LDYgQEAKICNkZWZpbmUgaW93cml0ZTMyYmUodixwKQkoeyBfX2lvd21iKCk7IF9fcmF3X3dyaXRlbCgoX19mb3JjZSBfX3UzMiljcHVfdG9fYmUzMih2KSwgcCk7IH0pCiAjZGVmaW5lIGlvd3JpdGU2NGJlKHYscCkJKHsgX19pb3dtYigpOyBfX3Jhd193cml0ZXEoKF9fZm9yY2UgX191NjQpY3B1X3RvX2JlNjQodiksIHApOyB9KQogCi0vKgotICogQ29udmVydCBhIHBoeXNpY2FsIHBvaW50ZXIgdG8gYSB2aXJ0dWFsIGtlcm5lbCBwb2ludGVyIGZvciAvZGV2L21lbQotICogYWNjZXNzCi0gKi8KLSNkZWZpbmUgeGxhdGVfZGV2X21lbV9wdHIocCkJX192YShwKQotCi0vKgotICogQ29udmVydCBhIHZpcnR1YWwgY2FjaGVkIHBvaW50ZXIgdG8gYW4gdW5jYWNoZWQgcG9pbnRlcgotICovCi0jZGVmaW5lIHhsYXRlX2Rldl9rbWVtX3B0cihwKQlwCi0KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pby5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fYXJtLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hcm0uaAppbmRleCA0YjVjOTc3Li4yYTI3NTJiIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hcm0uaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hcm0uaApAQCAtNTAsNyArNTAsNyBAQAogI2RlZmluZSBIQ1JfQlNVCQkoMyA8PCAxMCkKICNkZWZpbmUgSENSX0JTVV9JUwkoVUwoMSkgPDwgMTApCiAjZGVmaW5lIEhDUl9GQgkJKFVMKDEpIDw8IDkpCi0jZGVmaW5lIEhDUl9WQQkJKFVMKDEpIDw8IDgpCisjZGVmaW5lIEhDUl9WU0UJCShVTCgxKSA8PCA4KQogI2RlZmluZSBIQ1JfVkkJCShVTCgxKSA8PCA3KQogI2RlZmluZSBIQ1JfVkYJCShVTCgxKSA8PCA2KQogI2RlZmluZSBIQ1JfQU1PCQkoVUwoMSkgPDwgNSkKQEAgLTgwLDcgKzgwLDcgQEAKICNkZWZpbmUgSENSX0dVRVNUX0ZMQUdTIChIQ1JfVFNDIHwgSENSX1RTVyB8IEhDUl9UV0UgfCBIQ1JfVFdJIHwgSENSX1ZNIHwgXAogCQkJIEhDUl9UVk0gfCBIQ1JfQlNVX0lTIHwgSENSX0ZCIHwgSENSX1RBQyB8IFwKIAkJCSBIQ1JfQU1PIHwgSENSX1NXSU8gfCBIQ1JfVElEQ1AgfCBIQ1JfUlcpCi0jZGVmaW5lIEhDUl9WSVJUX0VYQ1BfTUFTSyAoSENSX1ZBIHwgSENSX1ZJIHwgSENSX1ZGKQorI2RlZmluZSBIQ1JfVklSVF9FWENQX01BU0sgKEhDUl9WU0UgfCBIQ1JfVkkgfCBIQ1JfVkYpCiAjZGVmaW5lIEhDUl9JTlRfT1ZFUlJJREUgICAoSENSX0ZNTyB8IEhDUl9JTU8pCiAjZGVmaW5lIEhDUl9IT1NUX1ZIRV9GTEFHUyAoSENSX1JXIHwgSENSX1RHRSB8IEhDUl9FMkgpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2FzbS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fYXNtLmgKaW5kZXggNzU2MWY2My4uMThmNzQ2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fYXNtLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fYXNtLmgKQEAgLTIwLDEwICsyMCwxNSBAQAogCiAjaW5jbHVkZSA8YXNtL3ZpcnQuaD4KIAorI2RlZmluZSBBUk1fRVhJVF9XSVRIX1NFUlJPUl9CSVQgIDMxCisjZGVmaW5lIEFSTV9FWENFUFRJT05fQ09ERSh4KQkgICgoeCkgJiB+KDFVIDw8IEFSTV9FWElUX1dJVEhfU0VSUk9SX0JJVCkpCisjZGVmaW5lIEFSTV9TRVJST1JfUEVORElORyh4KQkgICEhKCh4KSAmICgxVSA8PCBBUk1fRVhJVF9XSVRIX1NFUlJPUl9CSVQpKQorCiAjZGVmaW5lIEFSTV9FWENFUFRJT05fSVJRCSAgMAotI2RlZmluZSBBUk1fRVhDRVBUSU9OX1RSQVAJICAxCisjZGVmaW5lIEFSTV9FWENFUFRJT05fRUwxX1NFUlJPUiAgMQorI2RlZmluZSBBUk1fRVhDRVBUSU9OX1RSQVAJICAyCiAvKiBUaGUgaHlwLXN0dWIgd2lsbCByZXR1cm4gdGhpcyBmb3IgYW55IGt2bV9jYWxsX2h5cCgpIGNhbGwgKi8KLSNkZWZpbmUgQVJNX0VYQ0VQVElPTl9IWVBfR09ORQkgIDIKKyNkZWZpbmUgQVJNX0VYQ0VQVElPTl9IWVBfR09ORQkgIDMKIAogI2RlZmluZSBLVk1fQVJNNjRfREVCVUdfRElSVFlfU0hJRlQJMAogI2RlZmluZSBLVk1fQVJNNjRfREVCVUdfRElSVFkJCSgxIDw8IEtWTV9BUk02NF9ERUJVR19ESVJUWV9TSElGVCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2VtdWxhdGUuaAppbmRleCA0Y2RlYWUzLi5mZDlkNWZkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9lbXVsYXRlLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fZW11bGF0ZS5oCkBAIC0zOCw2ICszOCw3IEBACiB2b2lkIGt2bV9za2lwX2luc3RyMzIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sIGlzX3dpZGVfaW5zdHIpOwogCiB2b2lkIGt2bV9pbmplY3RfdW5kZWZpbmVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Cit2b2lkIGt2bV9pbmplY3RfdmFidChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1faW5qZWN0X2RhYnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGFkZHIpOwogdm9pZCBrdm1faW5qZWN0X3BhYnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGFkZHIpOwogCkBAIC0xNDcsNiArMTQ4LDE2IEBACiAJcmV0dXJuIHZjcHUtPmFyY2guZmF1bHQuZXNyX2VsMjsKIH0KIAorc3RhdGljIGlubGluZSBpbnQga3ZtX3ZjcHVfZ2V0X2NvbmRpdGlvbihjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdTMyIGVzciA9IGt2bV92Y3B1X2dldF9oc3IodmNwdSk7CisKKwlpZiAoZXNyICYgRVNSX0VMeF9DVikKKwkJcmV0dXJuIChlc3IgJiBFU1JfRUx4X0NPTkRfTUFTSykgPj4gRVNSX0VMeF9DT05EX1NISUZUOworCisJcmV0dXJuIC0xOworfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcga3ZtX3ZjcHVfZ2V0X2hmYXIoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXJldHVybiB2Y3B1LT5hcmNoLmZhdWx0LmZhcl9lbDI7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggM2VkYTk3NS4uYmQ5NGU2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaApAQCAtMjkwLDE1ICsyOTAsMTUgQEAKICNlbmRpZgogCiBzdHJ1Y3Qga3ZtX3ZtX3N0YXQgewotCXUzMiByZW1vdGVfdGxiX2ZsdXNoOworCXVsb25nIHJlbW90ZV90bGJfZmx1c2g7CiB9OwogCiBzdHJ1Y3Qga3ZtX3ZjcHVfc3RhdCB7Ci0JdTMyIGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOwotCXUzMiBoYWx0X2F0dGVtcHRlZF9wb2xsOwotCXUzMiBoYWx0X3BvbGxfaW52YWxpZDsKLQl1MzIgaGFsdF93YWtldXA7Ci0JdTMyIGh2Y19leGl0X3N0YXQ7CisJdTY0IGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOworCXU2NCBoYWx0X2F0dGVtcHRlZF9wb2xsOworCXU2NCBoYWx0X3BvbGxfaW52YWxpZDsKKwl1NjQgaGFsdF93YWtldXA7CisJdTY0IGh2Y19leGl0X3N0YXQ7CiAJdTY0IHdmZV9leGl0X3N0YXQ7CiAJdTY0IHdmaV9leGl0X3N0YXQ7CiAJdTY0IG1taW9fZXhpdF91c2VyOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1faHlwLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9oeXAuaAppbmRleCBjZmY1MTA1Li5iMThlODUyIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9oeXAuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9oeXAuaApAQCAtMTIzLDYgKzEyMyw3IEBACiAKIHZvaWQgX192Z2ljX3YyX3NhdmVfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQgX192Z2ljX3YyX3Jlc3RvcmVfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK2ludCBfX3ZnaWNfdjJfcGVyZm9ybV9jcHVpZl9hY2Nlc3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAogdm9pZCBfX3ZnaWNfdjNfc2F2ZV9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBfX3ZnaWNfdjNfcmVzdG9yZV9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW11LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9tbXUuaAppbmRleCBiNmJiODM0Li5hNzliOTY5IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9tbXUuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9tbXUuaApAQCAtOTksMTQgKzk5LDEwIEBACiAubWFjcm8ga2Vybl9oeXBfdmEJcmVnCiBhbHRlcm5hdGl2ZV9pZl9ub3QgQVJNNjRfSEFTX1ZJUlRfSE9TVF9FWFROCiAJYW5kICAgICBccmVnLCBccmVnLCAjSFlQX1BBR0VfT0ZGU0VUX0hJR0hfTUFTSwotYWx0ZXJuYXRpdmVfZWxzZQotCW5vcAotYWx0ZXJuYXRpdmVfZW5kaWYKLWFsdGVybmF0aXZlX2lmX25vdCBBUk02NF9IWVBfT0ZGU0VUX0xPVwotCW5vcAotYWx0ZXJuYXRpdmVfZWxzZQorYWx0ZXJuYXRpdmVfZWxzZV9ub3BfZW5kaWYKK2FsdGVybmF0aXZlX2lmIEFSTTY0X0hZUF9PRkZTRVRfTE9XCiAJYW5kICAgICBccmVnLCBccmVnLCAjSFlQX1BBR0VfT0ZGU0VUX0xPV19NQVNLCi1hbHRlcm5hdGl2ZV9lbmRpZgorYWx0ZXJuYXRpdmVfZWxzZV9ub3BfZW5kaWYKIC5lbmRtCiAKICNlbHNlCkBAIC0xNjYsMTIgKzE2Miw2IEBACiAjZGVmaW5lCWt2bV9zZXRfcHRlKHB0ZXAsIHB0ZSkJCXNldF9wdGUocHRlcCwgcHRlKQogI2RlZmluZQlrdm1fc2V0X3BtZChwbWRwLCBwbWQpCQlzZXRfcG1kKHBtZHAsIHBtZCkKIAotc3RhdGljIGlubGluZSB2b2lkIGt2bV9jbGVhbl9wZ2QocGdkX3QgKnBnZCkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fY2xlYW5fcG1kKHBtZF90ICpwbWQpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2NsZWFuX3BtZF9lbnRyeShwbWRfdCAqcG1kKSB7fQotc3RhdGljIGlubGluZSB2b2lkIGt2bV9jbGVhbl9wdGUocHRlX3QgKnB0ZSkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fY2xlYW5fcHRlX2VudHJ5KHB0ZV90ICpwdGUpIHt9Ci0KIHN0YXRpYyBpbmxpbmUgcHRlX3Qga3ZtX3MycHRlX21rd3JpdGUocHRlX3QgcHRlKQogewogCXB0ZV92YWwocHRlKSB8PSBQVEVfUzJfUkRXUjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vbWVtb3J5LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL21lbW9yeS5oCmluZGV4IDMxYjczMjIuLmJhNjJkZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vbWVtb3J5LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tZW1vcnkuaApAQCAtMjE0LDcgKzIxNCw3IEBACiAKICNpZm5kZWYgQ09ORklHX1NQQVJTRU1FTV9WTUVNTUFQCiAjZGVmaW5lIHZpcnRfdG9fcGFnZShrYWRkcikJcGZuX3RvX3BhZ2UoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKLSNkZWZpbmUgdmlydF9hZGRyX3ZhbGlkKGthZGRyKQlwZm5fdmFsaWQoX19wYShrYWRkcikgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgX3ZpcnRfYWRkcl92YWxpZChrYWRkcikJcGZuX3ZhbGlkKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCiAjZWxzZQogI2RlZmluZSBfX3ZpcnRfdG9fcGdvZmYoa2FkZHIpCSgoKHU2NCkoa2FkZHIpICYgflBBR0VfT0ZGU0VUKSAvIFBBR0VfU0laRSAqIHNpemVvZihzdHJ1Y3QgcGFnZSkpCiAjZGVmaW5lIF9fcGFnZV90b192b2ZmKGthZGRyKQkoKCh1NjQpKHBhZ2UpICYgflZNRU1NQVBfU1RBUlQpICogUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBwYWdlKSkKQEAgLTIyMiwxMSArMjIyLDE1IEBACiAjZGVmaW5lIHBhZ2VfdG9fdmlydChwYWdlKQkoKHZvaWQgKikoKF9fcGFnZV90b192b2ZmKHBhZ2UpKSB8IFBBR0VfT0ZGU0VUKSkKICNkZWZpbmUgdmlydF90b19wYWdlKHZhZGRyKQkoKHN0cnVjdCBwYWdlICopKChfX3ZpcnRfdG9fcGdvZmYodmFkZHIpKSB8IFZNRU1NQVBfU1RBUlQpKQogCi0jZGVmaW5lIHZpcnRfYWRkcl92YWxpZChrYWRkcikJcGZuX3ZhbGlkKCgoKHU2NCkoa2FkZHIpICYgflBBR0VfT0ZGU0VUKSBcCisjZGVmaW5lIF92aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCXBmbl92YWxpZCgoKCh1NjQpKGthZGRyKSAmIH5QQUdFX09GRlNFVCkgXAogCQkJCQkgICArIFBIWVNfT0ZGU0VUKSA+PiBQQUdFX1NISUZUKQogI2VuZGlmCiAjZW5kaWYKIAorI2RlZmluZSBfdmlydF9hZGRyX2lzX2xpbmVhcihrYWRkcikJKCgodTY0KShrYWRkcikpID49IFBBR0VfT0ZGU0VUKQorI2RlZmluZSB2aXJ0X2FkZHJfdmFsaWQoa2FkZHIpCQkoX3ZpcnRfYWRkcl9pc19saW5lYXIoa2FkZHIpICYmIFwKKwkJCQkJIF92aXJ0X2FkZHJfdmFsaWQoa2FkZHIpKQorCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmg+CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCmluZGV4IGIxODkyYTAuLmE1MDE4NTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTI3LDIyICsyNywxNyBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL21tX2hvb2tzLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAotI2lmZGVmIENPTkZJR19QSURfSU5fQ09OVEVYVElEUgogc3RhdGljIGlubGluZSB2b2lkIGNvbnRleHRpZHJfdGhyZWFkX3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCiB7Ci0JYXNtKAotCSIJbXNyCWNvbnRleHRpZHJfZWwxLCAlMFxuIgotCSIJaXNiIgotCToKLQk6ICJyIiAodGFza19waWRfbnIobmV4dCkpKTsKKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX1BJRF9JTl9DT05URVhUSURSKSkKKwkJcmV0dXJuOworCisJd3JpdGVfc3lzcmVnKHRhc2tfcGlkX25yKG5leHQpLCBjb250ZXh0aWRyX2VsMSk7CisJaXNiKCk7CiB9Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGNvbnRleHRpZHJfdGhyZWFkX3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCi17Ci19Ci0jZW5kaWYKIAogLyoKICAqIFNldCBUVEJSMCB0byBlbXB0eV96ZXJvX3BhZ2UuIE5vIHRyYW5zbGF0aW9ucyB3aWxsIGJlIHBvc3NpYmxlIHZpYSBUVEJSMC4KQEAgLTUxLDExICs0Niw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0dGJyID0gdmlydF90b19waHlzKGVtcHR5X3plcm9fcGFnZSk7CiAKLQlhc20oCi0JIgltc3IJdHRicjBfZWwxLCAlMAkJCS8vIHNldCBUVEJSMFxuIgotCSIJaXNiIgotCToKLQk6ICJyIiAodHRicikpOworCXdyaXRlX3N5c3JlZyh0dGJyLCB0dGJyMF9lbDEpOworCWlzYigpOwogfQogCiAvKgpAQCAtODEsMTMgKzczLDExIEBACiAJaWYgKCFfX2NwdV91c2VzX2V4dGVuZGVkX2lkbWFwKCkpCiAJCXJldHVybjsKIAotCWFzbSB2b2xhdGlsZSAoCi0JIgltcnMJJTAsIHRjcl9lbDEJOyIKLQkiCWJmaQklMCwgJTEsICUyLCAlMwk7IgotCSIJbXNyCXRjcl9lbDEsICUwCTsiCi0JIglpc2IiCi0JOiAiPSZyIiAodGNyKQotCTogInIiKHQwc3opLCAiSSIoVENSX1QwU1pfT0ZGU0VUKSwgIkkiKFRDUl9UeFNaX1dJRFRIKSk7CisJdGNyID0gcmVhZF9zeXNyZWcodGNyX2VsMSk7CisJdGNyICY9IH5UQ1JfVDBTWl9NQVNLOworCXRjciB8PSB0MHN6IDw8IFRDUl9UMFNaX09GRlNFVDsKKwl3cml0ZV9zeXNyZWcodGNyLCB0Y3JfZWwxKTsKKwlpc2IoKTsKIH0KIAogI2RlZmluZSBjcHVfc2V0X2RlZmF1bHRfdGNyX3Qwc3ooKQlfX2NwdV9zZXRfdGNyX3Qwc3ooVENSX1QwU1ooVkFfQklUUykpCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BlcmNwdS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZXJjcHUuaAppbmRleCAwYTQ1NmJlLi4yZmVlMmY1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BlcmNwdS5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGVyY3B1LmgKQEAgLTE5OSwxOSArMTk5LDE5IEBACiAjZGVmaW5lIF9wZXJjcHVfcmVhZChwY3ApCQkJCQkJXAogKHsJCQkJCQkJCQlcCiAJdHlwZW9mKHBjcCkgX19yZXR2YWw7CQkJCQkJXAotCXByZWVtcHRfZGlzYWJsZSgpOwkJCQkJCVwKKwlwcmVlbXB0X2Rpc2FibGVfbm90cmFjZSgpOwkJCQkJXAogCV9fcmV0dmFsID0gKHR5cGVvZihwY3ApKV9fcGVyY3B1X3JlYWQocmF3X2NwdV9wdHIoJihwY3ApKSwgCVwKIAkJCQkJICAgICAgc2l6ZW9mKHBjcCkpOwkJXAotCXByZWVtcHRfZW5hYmxlKCk7CQkJCQkJXAorCXByZWVtcHRfZW5hYmxlX25vdHJhY2UoKTsJCQkJCVwKIAlfX3JldHZhbDsJCQkJCQkJXAogfSkKIAogI2RlZmluZSBfcGVyY3B1X3dyaXRlKHBjcCwgdmFsKQkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JcHJlZW1wdF9kaXNhYmxlKCk7CQkJCQkJXAorCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7CQkJCQlcCiAJX19wZXJjcHVfd3JpdGUocmF3X2NwdV9wdHIoJihwY3ApKSwgKHVuc2lnbmVkIGxvbmcpKHZhbCksIAlcCiAJCQkJc2l6ZW9mKHBjcCkpOwkJCQlcCi0JcHJlZW1wdF9lbmFibGUoKTsJCQkJCQlcCisJcHJlZW1wdF9lbmFibGVfbm90cmFjZSgpOwkJCQkJXAogfSB3aGlsZSgwKQkJCQkJCQkJXAogCiAjZGVmaW5lIF9wY3BfcHJvdGVjdChvcGVyYXRpb24sIHBjcCwgdmFsKQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS1od2RlZi5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLWh3ZGVmLmgKaW5kZXggYzNhZTIzOS4uZWIwYzJiZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLWh3ZGVmLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLWh3ZGVmLmgKQEAgLTIwOCw2ICsyMDgsNyBAQAogI2RlZmluZSBUQ1JfVDFTWih4KQkJKChVTCg2NCkgLSAoeCkpIDw8IFRDUl9UMVNaX09GRlNFVCkKICNkZWZpbmUgVENSX1R4U1ooeCkJCShUQ1JfVDBTWih4KSB8IFRDUl9UMVNaKHgpKQogI2RlZmluZSBUQ1JfVHhTWl9XSURUSAkJNgorI2RlZmluZSBUQ1JfVDBTWl9NQVNLCQkoKChVTCgxKSA8PCBUQ1JfVHhTWl9XSURUSCkgLSAxKSA8PCBUQ1JfVDBTWl9PRkZTRVQpCiAKICNkZWZpbmUgVENSX0lSR04wX1NISUZUCQk4CiAjZGVmaW5lIFRDUl9JUkdOMF9NQVNLCQkoVUwoMykgPDwgVENSX0lSR04wX1NISUZUKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLXByb3QuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS1wcm90LmgKaW5kZXggMzlmNTI1Mi4uMjE0MmM3NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLXByb3QuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtcHJvdC5oCkBAIC03MCwxMiArNzAsMTMgQEAKICNkZWZpbmUgUEFHRV9DT1BZX0VYRUMJCV9fcGdwcm90KF9QQUdFX0RFRkFVTFQgfCBQVEVfVVNFUiB8IFBURV9ORyB8IFBURV9QWE4pCiAjZGVmaW5lIFBBR0VfUkVBRE9OTFkJCV9fcGdwcm90KF9QQUdFX0RFRkFVTFQgfCBQVEVfVVNFUiB8IFBURV9ORyB8IFBURV9QWE4gfCBQVEVfVVhOKQogI2RlZmluZSBQQUdFX1JFQURPTkxZX0VYRUMJX19wZ3Byb3QoX1BBR0VfREVGQVVMVCB8IFBURV9VU0VSIHwgUFRFX05HIHwgUFRFX1BYTikKKyNkZWZpbmUgUEFHRV9FWEVDT05MWQkJX19wZ3Byb3QoX1BBR0VfREVGQVVMVCB8IFBURV9ORyB8IFBURV9QWE4pCiAKICNkZWZpbmUgX19QMDAwICBQQUdFX05PTkUKICNkZWZpbmUgX19QMDAxICBQQUdFX1JFQURPTkxZCiAjZGVmaW5lIF9fUDAxMCAgUEFHRV9DT1BZCiAjZGVmaW5lIF9fUDAxMSAgUEFHRV9DT1BZCi0jZGVmaW5lIF9fUDEwMCAgUEFHRV9SRUFET05MWV9FWEVDCisjZGVmaW5lIF9fUDEwMCAgUEFHRV9FWEVDT05MWQogI2RlZmluZSBfX1AxMDEgIFBBR0VfUkVBRE9OTFlfRVhFQwogI2RlZmluZSBfX1AxMTAgIFBBR0VfQ09QWV9FWEVDCiAjZGVmaW5lIF9fUDExMSAgUEFHRV9DT1BZX0VYRUMKQEAgLTg0LDcgKzg1LDcgQEAKICNkZWZpbmUgX19TMDAxICBQQUdFX1JFQURPTkxZCiAjZGVmaW5lIF9fUzAxMCAgUEFHRV9TSEFSRUQKICNkZWZpbmUgX19TMDExICBQQUdFX1NIQVJFRAotI2RlZmluZSBfX1MxMDAgIFBBR0VfUkVBRE9OTFlfRVhFQworI2RlZmluZSBfX1MxMDAgIFBBR0VfRVhFQ09OTFkKICNkZWZpbmUgX19TMTAxICBQQUdFX1JFQURPTkxZX0VYRUMKICNkZWZpbmUgX19TMTEwICBQQUdFX1NIQVJFRF9FWEVDCiAjZGVmaW5lIF9fUzExMSAgUEFHRV9TSEFSRURfRVhFQwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCBlMjBiZDQzLi5mZmJiOWE1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtNzMsNyArNzMsNyBAQAogI2RlZmluZSBwdGVfd3JpdGUocHRlKQkJKCEhKHB0ZV92YWwocHRlKSAmIFBURV9XUklURSkpCiAjZGVmaW5lIHB0ZV9leGVjKHB0ZSkJCSghKHB0ZV92YWwocHRlKSAmIFBURV9VWE4pKQogI2RlZmluZSBwdGVfY29udChwdGUpCQkoISEocHRlX3ZhbChwdGUpICYgUFRFX0NPTlQpKQotI2RlZmluZSBwdGVfdXNlcihwdGUpCQkoISEocHRlX3ZhbChwdGUpICYgUFRFX1VTRVIpKQorI2RlZmluZSBwdGVfbmcocHRlKQkJKCEhKHB0ZV92YWwocHRlKSAmIFBURV9ORykpCiAKICNpZmRlZiBDT05GSUdfQVJNNjRfSFdfQUZEQk0KICNkZWZpbmUgcHRlX2h3X2RpcnR5KHB0ZSkJKHB0ZV93cml0ZShwdGUpICYmICEocHRlX3ZhbChwdGUpICYgUFRFX1JET05MWSkpCkBAIC04NCw4ICs4NCw4IEBACiAjZGVmaW5lIHB0ZV9kaXJ0eShwdGUpCQkocHRlX3N3X2RpcnR5KHB0ZSkgfHwgcHRlX2h3X2RpcnR5KHB0ZSkpCiAKICNkZWZpbmUgcHRlX3ZhbGlkKHB0ZSkJCSghIShwdGVfdmFsKHB0ZSkgJiBQVEVfVkFMSUQpKQotI2RlZmluZSBwdGVfdmFsaWRfbm90X3VzZXIocHRlKSBcCi0JKChwdGVfdmFsKHB0ZSkgJiAoUFRFX1ZBTElEIHwgUFRFX1VTRVIpKSA9PSBQVEVfVkFMSUQpCisjZGVmaW5lIHB0ZV92YWxpZF9nbG9iYWwocHRlKSBcCisJKChwdGVfdmFsKHB0ZSkgJiAoUFRFX1ZBTElEIHwgUFRFX05HKSkgPT0gUFRFX1ZBTElEKQogI2RlZmluZSBwdGVfdmFsaWRfeW91bmcocHRlKSBcCiAJKChwdGVfdmFsKHB0ZSkgJiAoUFRFX1ZBTElEIHwgUFRFX0FGKSkgPT0gKFBURV9WQUxJRCB8IFBURV9BRikpCiAKQEAgLTE1NSw2ICsxNTUsMTYgQEAKIAlyZXR1cm4gY2xlYXJfcHRlX2JpdChwdGUsIF9fcGdwcm90KFBURV9DT05UKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX2NsZWFyX3Jkb25seShwdGVfdCBwdGUpCit7CisJcmV0dXJuIGNsZWFyX3B0ZV9iaXQocHRlLCBfX3BncHJvdChQVEVfUkRPTkxZKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcHJlc2VudChwdGVfdCBwdGUpCit7CisJcmV0dXJuIHNldF9wdGVfYml0KHB0ZSwgX19wZ3Byb3QoUFRFX1ZBTElEKSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgcG1kX3QgcG1kX21rY29udChwbWRfdCBwbWQpCiB7CiAJcmV0dXJuIF9fcG1kKHBtZF92YWwocG1kKSB8IFBNRF9TRUNUX0NPTlQpOwpAQCAtMTY4LDcgKzE3OCw3IEBACiAJICogT25seSBpZiB0aGUgbmV3IHB0ZSBpcyB2YWxpZCBhbmQga2VybmVsLCBvdGhlcndpc2UgVExCIG1haW50ZW5hbmNlCiAJICogb3IgdXBkYXRlX21tdV9jYWNoZSgpIGhhdmUgdGhlIG5lY2Vzc2FyeSBiYXJyaWVycy4KIAkgKi8KLQlpZiAocHRlX3ZhbGlkX25vdF91c2VyKHB0ZSkpIHsKKwlpZiAocHRlX3ZhbGlkX2dsb2JhbChwdGUpKSB7CiAJCWRzYihpc2hzdCk7CiAJCWlzYigpOwogCX0KQEAgLTIwMiw3ICsyMTIsNyBAQAogCQkJcHRlX3ZhbChwdGUpICY9IH5QVEVfUkRPTkxZOwogCQllbHNlCiAJCQlwdGVfdmFsKHB0ZSkgfD0gUFRFX1JET05MWTsKLQkJaWYgKHB0ZV91c2VyKHB0ZSkgJiYgcHRlX2V4ZWMocHRlKSAmJiAhcHRlX3NwZWNpYWwocHRlKSkKKwkJaWYgKHB0ZV9uZyhwdGUpICYmIHB0ZV9leGVjKHB0ZSkgJiYgIXB0ZV9zcGVjaWFsKHB0ZSkpCiAJCQlfX3N5bmNfaWNhY2hlX2RjYWNoZShwdGUsIGFkZHIpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggYWNlMGE5Ni4uZGYyZTUzZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCi0jaWZkZWYgX19LRVJORUxfXwogI2RlZmluZSBTVEFDS19UT1BfTUFYCQlUQVNLX1NJWkVfNjQKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAjZGVmaW5lIEFBUkNIMzJfVkVDVE9SU19CQVNFCTB4ZmZmZjAwMDAKQEAgLTQ5LDcgKzQ4LDYgQEAKIAogZXh0ZXJuIHBoeXNfYWRkcl90IGFybTY0X2RtYV9waHlzX2xpbWl0OwogI2RlZmluZSBBUkNIX0xPV19BRERSRVNTX0xJTUlUCShhcm02NF9kbWFfcGh5c19saW1pdCAtIDEpCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiBzdHJ1Y3QgZGVidWdfaW5mbyB7CiAJLyogSGF2ZSB3ZSBzdXNwZW5kZWQgc3RlcHBpbmcgYnkgYSBkZWJ1Z2dlcj8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc2VjdGlvbnMuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc2VjdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdlNzA2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zZWN0aW9ucy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQVJNIExpbWl0ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaWZuZGVmIF9fQVNNX1NFQ1RJT05TX0gKKyNkZWZpbmUgX19BU01fU0VDVElPTlNfSAorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2VjdGlvbnMuaD4KKworZXh0ZXJuIGNoYXIgX19hbHRfaW5zdHJ1Y3Rpb25zW10sIF9fYWx0X2luc3RydWN0aW9uc19lbmRbXTsKK2V4dGVybiBjaGFyIF9fZXhjZXB0aW9uX3RleHRfc3RhcnRbXSwgX19leGNlcHRpb25fdGV4dF9lbmRbXTsKK2V4dGVybiBjaGFyIF9faGliZXJuYXRlX2V4aXRfdGV4dF9zdGFydFtdLCBfX2hpYmVybmF0ZV9leGl0X3RleHRfZW5kW107CitleHRlcm4gY2hhciBfX2h5cF9pZG1hcF90ZXh0X3N0YXJ0W10sIF9faHlwX2lkbWFwX3RleHRfZW5kW107CitleHRlcm4gY2hhciBfX2h5cF90ZXh0X3N0YXJ0W10sIF9faHlwX3RleHRfZW5kW107CitleHRlcm4gY2hhciBfX2lkbWFwX3RleHRfc3RhcnRbXSwgX19pZG1hcF90ZXh0X2VuZFtdOworZXh0ZXJuIGNoYXIgX19pcnFlbnRyeV90ZXh0X3N0YXJ0W10sIF9faXJxZW50cnlfdGV4dF9lbmRbXTsKK2V4dGVybiBjaGFyIF9fbW11b2ZmX2RhdGFfc3RhcnRbXSwgX19tbXVvZmZfZGF0YV9lbmRbXTsKKworI2VuZGlmIC8qIF9fQVNNX1NFQ1RJT05TX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3BpbmxvY2suaAppbmRleCBlODc1YTVhLi5jYWUzMzFkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zcGlubG9jay5oCkBAIC02Niw4ICs2Niw3IEBACiAJQVJNNjRfTFNFX0FUT01JQ19JTlNOKAogCS8qIExML1NDICovCiAiCXN0eHIJJXcxLCAldzAsICUyXG4iCi0iCW5vcFxuIgotIglub3BcbiIsCisJX19ub3BzKDIpLAogCS8qIExTRSBhdG9taWNzICovCiAiCW1vdgkldzEsICV3MFxuIgogIgljYXMJJXcwLCAldzAsICUyXG4iCkBAIC05OSw5ICs5OCw3IEBACiAJLyogTFNFIGF0b21pY3MgKi8KICIJbW92CSV3MiwgJXc1XG4iCiAiCWxkYWRkYQkldzIsICV3MCwgJTNcbiIKLSIJbm9wXG4iCi0iCW5vcFxuIgotIglub3BcbiIKKwlfX25vcHMoMykKIAkpCiAKIAkvKiBEaWQgd2UgZ2V0IHRoZSBsb2NrPyAqLwpAQCAtMTY1LDggKzE2Miw4IEBACiAJIglzdGxyaAkldzEsICUwIiwKIAkvKiBMU0UgYXRvbWljcyAqLwogCSIJbW92CSV3MSwgIzFcbiIKLQkiCW5vcFxuIgotCSIJc3RhZGRsaAkldzEsICUwIikKKwkiCXN0YWRkbGgJJXcxLCAlMFxuIgorCV9fbm9wcygxKSkKIAk6ICI9USIgKGxvY2stPm93bmVyKSwgIj0mciIgKHRtcCkKIAk6CiAJOiAibWVtb3J5Iik7CkBAIC0yMTIsNyArMjA5LDcgQEAKIAkiCWNibnoJJXcwLCAxYlxuIgogCSIJc3R4cgkldzAsICV3MiwgJTFcbiIKIAkiCWNibnoJJXcwLCAyYlxuIgotCSIJbm9wIiwKKwlfX25vcHMoMSksCiAJLyogTFNFIGF0b21pY3MgKi8KIAkiMToJbW92CSV3MCwgd3pyXG4iCiAJIjI6CWNhc2EJJXcwLCAldzIsICUxXG4iCkBAIC0yNDEsOCArMjM4LDcgQEAKIAkvKiBMU0UgYXRvbWljcyAqLwogCSIJbW92CSV3MCwgd3pyXG4iCiAJIgljYXNhCSV3MCwgJXcyLCAlMVxuIgotCSIJbm9wXG4iCi0JIglub3AiKQorCV9fbm9wcygyKSkKIAk6ICI9JnIiICh0bXApLCAiK1EiIChydy0+bG9jaykKIAk6ICJyIiAoMHg4MDAwMDAwMCkKIAk6ICJtZW1vcnkiKTsKQEAgLTI5MCw4ICsyODYsOCBAQAogCSIJYWRkCSV3MCwgJXcwLCAjMVxuIgogCSIJdGJuegkldzAsICMzMSwgMWJcbiIKIAkiCXN0eHIJJXcxLCAldzAsICUyXG4iCi0JIglub3BcbiIKLQkiCWNibnoJJXcxLCAyYiIsCisJIgljYm56CSV3MSwgMmJcbiIKKwlfX25vcHMoMSksCiAJLyogTFNFIGF0b21pY3MgKi8KIAkiMToJd2ZlXG4iCiAJIjI6CWxkeHIJJXcwLCAlMlxuIgpAQCAtMzE3LDkgKzMxMyw4IEBACiAJIgljYm56CSV3MSwgMWIiLAogCS8qIExTRSBhdG9taWNzICovCiAJIgltb3ZuCSV3MCwgIzBcbiIKLQkiCW5vcFxuIgotCSIJbm9wXG4iCi0JIglzdGFkZGwJJXcwLCAlMiIpCisJIglzdGFkZGwJJXcwLCAlMlxuIgorCV9fbm9wcygyKSkKIAk6ICI9JnIiICh0bXApLCAiPSZyIiAodG1wMiksICIrUSIgKHJ3LT5sb2NrKQogCToKIAk6ICJtZW1vcnkiKTsKQEAgLTM0NCw3ICszMzksNyBAQAogCSIJdGJuegkldzEsICMzMSwgMWZcbiIKIAkiCWNhc2EJJXcwLCAldzEsICUyXG4iCiAJIglzYmMJJXcxLCAldzEsICV3MFxuIgotCSIJbm9wXG4iCisJX19ub3BzKDEpCiAJIjE6IikKIAk6ICI9JnIiICh0bXApLCAiPSZyIiAodG1wMiksICIrUSIgKHJ3LT5sb2NrKQogCToKQEAgLTM2Myw0ICszNTgsMTQgQEAKICNkZWZpbmUgYXJjaF9yZWFkX3JlbGF4KGxvY2spCWNwdV9yZWxheCgpCiAjZGVmaW5lIGFyY2hfd3JpdGVfcmVsYXgobG9jaykJY3B1X3JlbGF4KCkKIAorLyoKKyAqIEFjY2Vzc2VzIGFwcGVhcmluZyBpbiBwcm9ncmFtIG9yZGVyIGJlZm9yZSBhIHNwaW5fbG9jaygpIG9wZXJhdGlvbgorICogY2FuIGJlIHJlb3JkZXJlZCB3aXRoIGFjY2Vzc2VzIGluc2lkZSB0aGUgY3JpdGljYWwgc2VjdGlvbiwgYnkgdmlydHVlCisgKiBvZiBhcmNoX3NwaW5fbG9jayBiZWluZyBjb25zdHJ1Y3RlZCB1c2luZyBhY3F1aXJlIHNlbWFudGljcy4KKyAqCisgKiBJbiBjYXNlcyB3aGVyZSB0aGlzIGlzIHByb2JsZW1hdGljIChlLmcuIHRyeV90b193YWtlX3VwKSwgYW4KKyAqIHNtcF9tYl9fYmVmb3JlX3NwaW5sb2NrKCkgY2FuIHJlc3RvcmUgdGhlIHJlcXVpcmVkIG9yZGVyaW5nLgorICovCisjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX3NwaW5sb2NrKCkJc21wX21iKCkKKwogI2VuZGlmIC8qIF9fQVNNX1NQSU5MT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3VzcGVuZC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zdXNwZW5kLmgKaW5kZXggMDI0ZDYyMy4uYjhhMzEzZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zdXNwZW5kLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zdXNwZW5kLmgKQEAgLTQ3LDQgKzQ3LDcgQEAKIGludCBhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9zYXZlKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBtYXhfc2l6ZSk7CiBpbnQgYXJjaF9oaWJlcm5hdGlvbl9oZWFkZXJfcmVzdG9yZSh2b2lkICphZGRyKTsKIAorLyogVXNlZCB0byByZXN1bWUgb24gdGhlIENQVSB3ZSBoaWJlcm5hdGVkIG9uICovCitpbnQgaGliZXJuYXRlX3Jlc3VtZV9ub25ib290X2NwdV9kaXNhYmxlKHZvaWQpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3lzcmVnLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N5c3JlZy5oCmluZGV4IGNjMDY3OTQuLmU4ZDQ2ZTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3lzcmVnLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zeXNyZWcuaApAQCAtMTAwLDYgKzEwMCw3IEBACiAvKiBTQ1RMUl9FTDEgc3BlY2lmaWMgZmxhZ3MuICovCiAjZGVmaW5lIFNDVExSX0VMMV9VQ0kJCSgxIDw8IDI2KQogI2RlZmluZSBTQ1RMUl9FTDFfU1BBTgkJKDEgPDwgMjMpCisjZGVmaW5lIFNDVExSX0VMMV9VQ1QJCSgxIDw8IDE1KQogI2RlZmluZSBTQ1RMUl9FTDFfU0VECQkoMSA8PCA4KQogI2RlZmluZSBTQ1RMUl9FTDFfQ1AxNUJFTgkoMSA8PCA1KQogCkBAIC0yNTMsMTYgKzI1NCw2IEBACiAiCS5lbmRtXG4iCiApOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29uZmlnX3NjdGxyX2VsMSh1MzIgY2xlYXIsIHUzMiBzZXQpCi17Ci0JdTMyIHZhbDsKLQotCWFzbSB2b2xhdGlsZSgibXJzICUwLCBzY3Rscl9lbDEiIDogIj1yIiAodmFsKSk7Ci0JdmFsICY9IH5jbGVhcjsKLQl2YWwgfD0gc2V0OwotCWFzbSB2b2xhdGlsZSgibXNyIHNjdGxyX2VsMSwgJTAiIDogOiAiciIgKHZhbCkpOwotfQotCiAvKgogICogVW5saWtlIHJlYWRfY3B1aWQsIGNhbGxzIHRvIHJlYWRfc3lzcmVnIGFyZSBuZXZlciBleHBlY3RlZCB0byBiZQogICogb3B0aW1pemVkIGF3YXkgb3IgcmVwbGFjZWQgd2l0aCBzeW50aGV0aWMgdmFsdWVzLgpAQCAtMjczLDEyICsyNjQsNDEgQEAKIAlfX3ZhbDsJCQkJCQkJXAogfSkKIAorLyoKKyAqIFRoZSAiWiIgY29uc3RyYWludCBub3JtYWxseSBtZWFucyBhIHplcm8gaW1tZWRpYXRlLCBidXQgd2hlbiBjb21iaW5lZCB3aXRoCisgKiB0aGUgIiV4MCIgdGVtcGxhdGUgbWVhbnMgWFpSLgorICovCiAjZGVmaW5lIHdyaXRlX3N5c3JlZyh2LCByKSBkbyB7CQkJCQlcCiAJdTY0IF9fdmFsID0gKHU2NCl2OwkJCQkJXAotCWFzbSB2b2xhdGlsZSgibXNyICIgX19zdHJpbmdpZnkocikgIiwgJTAiCQlcCi0JCSAgICAgOiA6ICJyIiAoX192YWwpKTsJCQkJXAorCWFzbSB2b2xhdGlsZSgibXNyICIgX19zdHJpbmdpZnkocikgIiwgJXgwIgkJXAorCQkgICAgIDogOiAicloiIChfX3ZhbCkpOwkJCQlcCiB9IHdoaWxlICgwKQogCisvKgorICogRm9yIHJlZ2lzdGVycyB3aXRob3V0IGFyY2hpdGVjdHVyYWwgbmFtZXMsIG9yIHNpbXBseSB1bnN1cHBvcnRlZCBieQorICogR0FTLgorICovCisjZGVmaW5lIHJlYWRfc3lzcmVnX3MocikgKHsJCQkJCQlcCisJdTY0IF9fdmFsOwkJCQkJCQlcCisJYXNtIHZvbGF0aWxlKCJtcnNfcyAlMCwgIiBfX3N0cmluZ2lmeShyKSA6ICI9ciIgKF9fdmFsKSk7CVwKKwlfX3ZhbDsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgd3JpdGVfc3lzcmVnX3ModiwgcikgZG8gewkJCQkJXAorCXU2NCBfX3ZhbCA9ICh1NjQpdjsJCQkJCQlcCisJYXNtIHZvbGF0aWxlKCJtc3JfcyAiIF9fc3RyaW5naWZ5KHIpICIsICUwIiA6IDogInJaIiAoX192YWwpKTsJXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSB2b2lkIGNvbmZpZ19zY3Rscl9lbDEodTMyIGNsZWFyLCB1MzIgc2V0KQoreworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkX3N5c3JlZyhzY3Rscl9lbDEpOworCXZhbCAmPSB+Y2xlYXI7CisJdmFsIHw9IHNldDsKKwl3cml0ZV9zeXNyZWcodmFsLCBzY3Rscl9lbDEpOworfQorCiAjZW5kaWYKIAogI2VuZGlmCS8qIF9fQVNNX1NZU1JFR19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N5c3RlbV9taXNjLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3N5c3RlbV9taXNjLmgKaW5kZXggNTdmMTEwYi4uYmM4MTI0MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9zeXN0ZW1fbWlzYy5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vc3lzdGVtX21pc2MuaApAQCAtNTYsMTIgKzU2LDYgQEAKIAlfX3Nob3dfcmF0ZWxpbWl0ZWQ7CQkJCQkJXAogfSkKIAotI2RlZmluZSBVREJHX1VOREVGSU5FRAkoMSA8PCAwKQotI2RlZmluZSBVREJHX1NZU0NBTEwJKDEgPDwgMSkKLSNkZWZpbmUgVURCR19CQURBQk9SVAkoMSA8PCAyKQotI2RlZmluZSBVREJHX1NFR1YJKDEgPDwgMykKLSNkZWZpbmUgVURCR19CVVMJKDEgPDwgNCkKLQogI2VuZGlmCS8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYJLyogX19BU01fU1lTVEVNX01JU0NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IGFiZDY0YmQuLmU5ZWE1YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTc1LDYgKzc1LDkgQEAKIAogLyoKICAqIHN0cnVjdCB0aHJlYWRfaW5mbyBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgdmlhIHNwX2VsMC4KKyAqCisgKiBXZSBkb24ndCB1c2UgcmVhZF9zeXNyZWcoKSBhcyB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjYWNoZSB0aGUgdmFsdWUgd2hlcmUKKyAqIHBvc3NpYmxlLgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCmluZGV4IGI0NjBhZTIuLmRlYWI1MjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdGxiZmx1c2guaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKQEAgLTI1LDYgKzI1LDI0IEBACiAjaW5jbHVkZSA8YXNtL2NwdXR5cGUuaD4KIAogLyoKKyAqIFJhdyBUTEJJIG9wZXJhdGlvbnMuCisgKgorICogV2hlcmUgbmVjZXNzYXJ5LCB1c2UgdGhlIF9fdGxiaSgpIG1hY3JvIHRvIGF2b2lkIGFzbSgpCisgKiBib2lsZXJwbGF0ZS4gRHJpdmVycyBhbmQgbW9zdCBrZXJuZWwgY29kZSBzaG91bGQgdXNlIHRoZSBUTEIKKyAqIG1hbmFnZW1lbnQgcm91dGluZXMgaW4gcHJlZmVyZW5jZSB0byB0aGUgbWFjcm8gYmVsb3cuCisgKgorICogVGhlIG1hY3JvIGNhbiBiZSB1c2VkIGFzIF9fdGxiaShvcCkgb3IgX190bGJpKG9wLCBhcmcpLCBkZXBlbmRpbmcKKyAqIG9uIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIFRMQkkgb3BlcmF0aW9uIHRha2VzIGFuIGFyZ3VtZW50IG9yCisgKiBub3QuIFRoZSBtYWNyb3MgaGFuZGxlcyBpbnZva2luZyB0aGUgYXNtIHdpdGggb3Igd2l0aG91dCB0aGUKKyAqIHJlZ2lzdGVyIGFyZ3VtZW50IGFzIGFwcHJvcHJpYXRlLgorICovCisjZGVmaW5lIF9fVExCSV8wKG9wLCBhcmcpCQlhc20gKCJ0bGJpICIgI29wKQorI2RlZmluZSBfX1RMQklfMShvcCwgYXJnKQkJYXNtICgidGxiaSAiICNvcCAiLCAlMCIgOiA6ICJyIiAoYXJnKSkKKyNkZWZpbmUgX19UTEJJX04ob3AsIGFyZywgbiwgLi4uKQlfX1RMQklfIyNuKG9wLCBhcmcpCisKKyNkZWZpbmUgX190bGJpKG9wLCAuLi4pCQlfX1RMQklfTihvcCwgIyNfX1ZBX0FSR1NfXywgMSwgMCkKKworLyoKICAqCVRMQiBNYW5hZ2VtZW50CiAgKgk9PT09PT09PT09PT09PQogICoKQEAgLTY2LDcgKzg0LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsb2NhbF9mbHVzaF90bGJfYWxsKHZvaWQpCiB7CiAJZHNiKG5zaHN0KTsKLQlhc20oInRsYmkJdm1hbGxlMSIpOworCV9fdGxiaSh2bWFsbGUxKTsKIAlkc2IobnNoKTsKIAlpc2IoKTsKIH0KQEAgLTc0LDcgKzkyLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpCiB7CiAJZHNiKGlzaHN0KTsKLQlhc20oInRsYmkJdm1hbGxlMWlzIik7CisJX190bGJpKHZtYWxsZTFpcyk7CiAJZHNiKGlzaCk7CiAJaXNiKCk7CiB9CkBAIC04NCw3ICsxMDIsNyBAQAogCXVuc2lnbmVkIGxvbmcgYXNpZCA9IEFTSUQobW0pIDw8IDQ4OwogCiAJZHNiKGlzaHN0KTsKLQlhc20oInRsYmkJYXNpZGUxaXMsICUwIiA6IDogInIiIChhc2lkKSk7CisJX190bGJpKGFzaWRlMWlzLCBhc2lkKTsKIAlkc2IoaXNoKTsKIH0KIApAQCAtOTQsNyArMTEyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSB1YWRkciA+PiAxMiB8IChBU0lEKHZtYS0+dm1fbW0pIDw8IDQ4KTsKIAogCWRzYihpc2hzdCk7Ci0JYXNtKCJ0bGJpCXZhbGUxaXMsICUwIiA6IDogInIiIChhZGRyKSk7CisJX190bGJpKHZhbGUxaXMsIGFkZHIpOwogCWRzYihpc2gpOwogfQogCkBAIC0xMjIsOSArMTQwLDkgQEAKIAlkc2IoaXNoc3QpOwogCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IDEgPDwgKFBBR0VfU0hJRlQgLSAxMikpIHsKIAkJaWYgKGxhc3RfbGV2ZWwpCi0JCQlhc20oInRsYmkgdmFsZTFpcywgJTAiIDogOiAiciIoYWRkcikpOworCQkJX190bGJpKHZhbGUxaXMsIGFkZHIpOwogCQllbHNlCi0JCQlhc20oInRsYmkgdmFlMWlzLCAlMCIgOiA6ICJyIihhZGRyKSk7CisJCQlfX3RsYmkodmFlMWlzLCBhZGRyKTsKIAl9CiAJZHNiKGlzaCk7CiB9CkBAIC0xNDksNyArMTY3LDcgQEAKIAogCWRzYihpc2hzdCk7CiAJZm9yIChhZGRyID0gc3RhcnQ7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gMSA8PCAoUEFHRV9TSElGVCAtIDEyKSkKLQkJYXNtKCJ0bGJpIHZhYWUxaXMsICUwIiA6IDogInIiKGFkZHIpKTsKKwkJX190bGJpKHZhYWUxaXMsIGFkZHIpOwogCWRzYihpc2gpOwogCWlzYigpOwogfQpAQCAtMTYzLDcgKzE4MSw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gdWFkZHIgPj4gMTIgfCAoQVNJRChtbSkgPDwgNDgpOwogCi0JYXNtKCJ0bGJpCXZhZTFpcywgJTAiIDogOiAiciIgKGFkZHIpKTsKKwlfX3RsYmkodmFlMWlzLCBhZGRyKTsKIAlkc2IoaXNoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90cmFwcy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90cmFwcy5oCmluZGV4IDljZDAzZjMuLjAyZTkwMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdHJhcHMuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RyYXBzLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNkZWZpbmUgX19BU01fVFJBUF9ICiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKIHN0cnVjdCBwdF9yZWdzOwogCkBAIC0zOSw5ICs0MCw2IEBACiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgogc3RhdGljIGlubGluZSBpbnQgX19pbl9pcnFlbnRyeV90ZXh0KHVuc2lnbmVkIGxvbmcgcHRyKQogewotCWV4dGVybiBjaGFyIF9faXJxZW50cnlfdGV4dF9zdGFydFtdOwotCWV4dGVybiBjaGFyIF9faXJxZW50cnlfdGV4dF9lbmRbXTsKLQogCXJldHVybiBwdHIgPj0gKHVuc2lnbmVkIGxvbmcpJl9faXJxZW50cnlfdGV4dF9zdGFydCAmJgogCSAgICAgICBwdHIgPCAodW5zaWduZWQgbG9uZykmX19pcnFlbnRyeV90ZXh0X2VuZDsKIH0KQEAgLTU0LDggKzUyLDYgQEAKIAogc3RhdGljIGlubGluZSBpbnQgaW5fZXhjZXB0aW9uX3RleHQodW5zaWduZWQgbG9uZyBwdHIpCiB7Ci0JZXh0ZXJuIGNoYXIgX19leGNlcHRpb25fdGV4dF9zdGFydFtdOwotCWV4dGVybiBjaGFyIF9fZXhjZXB0aW9uX3RleHRfZW5kW107CiAJaW50IGluOwogCiAJaW4gPSBwdHIgPj0gKHVuc2lnbmVkIGxvbmcpJl9fZXhjZXB0aW9uX3RleHRfc3RhcnQgJiYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdmlydC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS92aXJ0LmgKaW5kZXggMTc4ODU0NS4uZmVhMTA3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS92aXJ0LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS92aXJ0LmgKQEAgLTQ1LDYgKzQ1LDggQEAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL3N5c3JlZy5oPgogCiAvKgogICogX19ib290X2NwdV9tb2RlIHJlY29yZHMgd2hhdCBtb2RlIENQVXMgd2VyZSBib290ZWQgaW4uCkBAIC03NSwxMCArNzcsNyBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfa2VybmVsX2luX2h5cF9tb2RlKHZvaWQpCiB7Ci0JdTY0IGVsOwotCi0JYXNtKCJtcnMgJTAsIEN1cnJlbnRFTCIgOiAiPXIiIChlbCkpOwotCXJldHVybiBlbCA9PSBDdXJyZW50RUxfRUwyOworCXJldHVybiByZWFkX3N5c3JlZyhDdXJyZW50RUwpID09IEN1cnJlbnRFTF9FTDI7CiB9CiAKICNpZmRlZiBDT05GSUdfQVJNNjRfVkhFCkBAIC04NywxNCArODYsNiBAQAogc3RhdGljIGlubGluZSB2b2lkIHZlcmlmeV9jcHVfcnVuX2VsKHZvaWQpIHt9CiAjZW5kaWYKIAotLyogVGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgaHlwZXJ2aXNvciBpZG1hcCB0ZXh0ICovCi1leHRlcm4gY2hhciBfX2h5cF9pZG1hcF90ZXh0X3N0YXJ0W107Ci1leHRlcm4gY2hhciBfX2h5cF9pZG1hcF90ZXh0X2VuZFtdOwotCi0vKiBUaGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBoeXBlcnZpc29yIHRleHQgKi8KLWV4dGVybiBjaGFyIF9faHlwX3RleHRfc3RhcnRbXTsKLWV4dGVybiBjaGFyIF9faHlwX3RleHRfZW5kW107Ci0KICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmIC8qICEgX19BU01fX1ZJUlRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZQppbmRleCAxNGY3YjY1Li43ZDY2YmJhIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL2FybTY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMTAsNiArMTAsOCBAQAogQ0ZMQUdTX1JFTU9WRV9pbnNuLm8gPSAtcGcKIENGTEFHU19SRU1PVkVfcmV0dXJuX2FkZHJlc3MubyA9IC1wZwogCitDRkxBR1Nfc2V0dXAubyA9IC1EVVRTX01BQ0hJTkU9JyIkKFVUU19NQUNISU5FKSInCisKICMgT2JqZWN0IGZpbGUgbGlzdHMuCiBhcm02NC1vYmoteQkJOj0gZGVidWctbW9uaXRvcnMubyBlbnRyeS5vIGlycS5vIGZwc2ltZC5vCQlcCiAJCQkgICBlbnRyeS1mcHNpbWQubyBwcm9jZXNzLm8gcHRyYWNlLm8gc2V0dXAubyBzaWduYWwubwlcCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9hY3BpLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9hY3BpLmMKaW5kZXggM2U0ZjFhNC4uMjUyYTZkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvYWNwaS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2FjcGkuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHV0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL2NwdV9vcHMuaD4KQEAgLTIwNiw3ICsyMDcsNyBAQAogCWlmIChwYXJhbV9hY3BpX29mZiB8fAogCSAgICAoIXBhcmFtX2FjcGlfb24gJiYgIXBhcmFtX2FjcGlfZm9yY2UgJiYKIAkgICAgIG9mX3NjYW5fZmxhdF9kdChkdF9zY2FuX2RlcHRoMV9ub2RlcywgTlVMTCkpKQotCQlyZXR1cm47CisJCWdvdG8gZG9uZTsKIAogCS8qCiAJICogQUNQSSBpcyBkaXNhYmxlZCBhdCB0aGlzIHBvaW50LiBFbmFibGUgaXQgaW4gb3JkZXIgdG8gcGFyc2UKQEAgLTIyNiw2ICsyMjcsMTQgQEAKIAkJaWYgKCFwYXJhbV9hY3BpX2ZvcmNlKQogCQkJZGlzYWJsZV9hY3BpKCk7CiAJfQorCitkb25lOgorCWlmIChhY3BpX2Rpc2FibGVkKSB7CisJCWlmIChlYXJseWNvbl9pbml0X2lzX2RlZmVycmVkKQorCQkJZWFybHlfaW5pdF9kdF9zY2FuX2Nob3Nlbl9zdGRvdXQoKTsKKwl9IGVsc2UgeworCQlwYXJzZV9zcGNyKGVhcmx5Y29uX2luaXRfaXNfZGVmZXJyZWQpOworCX0KIH0KIAogI2lmZGVmIENPTkZJR19BQ1BJX0FQRUkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2FjcGlfbnVtYS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvYWNwaV9udW1hLmMKaW5kZXggZjg1MTQ5Yy4uZjAxZmFiNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvYWNwaV9udW1hLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvYWNwaV9udW1hLmMKQEAgLTEwNSw4ICsxMDUsMTAgQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gYWNwaV9udW1hX2luaXQoKTsKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKKwkJcHJfaW5mbygiRmFpbGVkIHRvIGluaXRpYWxpc2UgZnJvbSBmaXJtd2FyZVxuIik7CiAJCXJldHVybiByZXQ7CisJfQogCiAJcmV0dXJuIHNyYXRfZGlzYWJsZWQoKSA/IC1FSU5WQUwgOiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvYWx0ZXJuYXRpdmUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2FsdGVybmF0aXZlLmMKaW5kZXggZDJlZTFiMi4uMDZkNjUwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvYWx0ZXJuYXRpdmUuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9hbHRlcm5hdGl2ZS5jCkBAIC0yNSwxNCArMjUsMTMgQEAKICNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUuaD4KICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9pbnNuLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CiAKICNkZWZpbmUgX19BTFRfUFRSKGEsZikJCSh1MzIgKikoKHZvaWQgKikmKGEpLT5mICsgKGEpLT5mKQogI2RlZmluZSBBTFRfT1JJR19QVFIoYSkJCV9fQUxUX1BUUihhLCBvcmlnX29mZnNldCkKICNkZWZpbmUgQUxUX1JFUExfUFRSKGEpCQlfX0FMVF9QVFIoYSwgYWx0X29mZnNldCkKIAotZXh0ZXJuIHN0cnVjdCBhbHRfaW5zdHIgX19hbHRfaW5zdHJ1Y3Rpb25zW10sIF9fYWx0X2luc3RydWN0aW9uc19lbmRbXTsKLQogc3RydWN0IGFsdF9yZWdpb24gewogCXN0cnVjdCBhbHRfaW5zdHIgKmJlZ2luOwogCXN0cnVjdCBhbHRfaW5zdHIgKmVuZDsKQEAgLTU5LDYgKzU4LDggQEAKIAlCVUcoKTsKIH0KIAorI2RlZmluZSBhbGlnbl9kb3duKHgsIGEpCSgodW5zaWduZWQgbG9uZykoeCkgJiB+KCgodW5zaWduZWQgbG9uZykoYSkpIC0gMSkpCisKIHN0YXRpYyB1MzIgZ2V0X2FsdF9pbnNuKHN0cnVjdCBhbHRfaW5zdHIgKmFsdCwgdTMyICppbnNucHRyLCB1MzIgKmFsdGluc25wdHIpCiB7CiAJdTMyIGluc247CkBAIC04MCw2ICs4MSwyNSBAQAogCQkJb2Zmc2V0ID0gdGFyZ2V0IC0gKHVuc2lnbmVkIGxvbmcpaW5zbnB0cjsKIAkJCWluc24gPSBhYXJjaDY0X3NldF9icmFuY2hfb2Zmc2V0KGluc24sIG9mZnNldCk7CiAJCX0KKwl9IGVsc2UgaWYgKGFhcmNoNjRfaW5zbl9pc19hZHJwKGluc24pKSB7CisJCXMzMiBvcmlnX29mZnNldCwgbmV3X29mZnNldDsKKwkJdW5zaWduZWQgbG9uZyB0YXJnZXQ7CisKKwkJLyoKKwkJICogSWYgd2UncmUgcmVwbGFjaW5nIGFuIGFkcnAgaW5zdHJ1Y3Rpb24sIHdoaWNoIHVzZXMgUEMtcmVsYXRpdmUKKwkJICogaW1tZWRpYXRlIGFkZHJlc3NpbmcsIGFkanVzdCB0aGUgb2Zmc2V0IHRvIHJlZmxlY3QgdGhlIG5ldworCQkgKiBQQy4gYWRycCBvcGVyYXRlcyBvbiA0SyBhbGlnbmVkIGFkZHJlc3Nlcy4KKwkJICovCisJCW9yaWdfb2Zmc2V0ICA9IGFhcmNoNjRfaW5zbl9hZHJwX2dldF9vZmZzZXQoaW5zbik7CisJCXRhcmdldCA9IGFsaWduX2Rvd24oYWx0aW5zbnB0ciwgU1pfNEspICsgb3JpZ19vZmZzZXQ7CisJCW5ld19vZmZzZXQgPSB0YXJnZXQgLSBhbGlnbl9kb3duKGluc25wdHIsIFNaXzRLKTsKKwkJaW5zbiA9IGFhcmNoNjRfaW5zbl9hZHJwX3NldF9vZmZzZXQoaW5zbiwgbmV3X29mZnNldCk7CisJfSBlbHNlIGlmIChhYXJjaDY0X2luc25fdXNlc19saXRlcmFsKGluc24pKSB7CisJCS8qCisJCSAqIERpc2FsbG93IHBhdGNoaW5nIHVuaGFuZGxlZCBpbnN0cnVjdGlvbnMgdXNpbmcgUEMgcmVsYXRpdmUKKwkJICogbGl0ZXJhbCBhZGRyZXNzZXMKKwkJICovCisJCUJVRygpOwogCX0KIAogCXJldHVybiBpbnNuOwpAQCAtMTI0LDggKzE0NCw4IEBACiB7CiAJc3RhdGljIGludCBwYXRjaGVkID0gMDsKIAlzdHJ1Y3QgYWx0X3JlZ2lvbiByZWdpb24gPSB7Ci0JCS5iZWdpbgk9IF9fYWx0X2luc3RydWN0aW9ucywKLQkJLmVuZAk9IF9fYWx0X2luc3RydWN0aW9uc19lbmQsCisJCS5iZWdpbgk9IChzdHJ1Y3QgYWx0X2luc3RyICopX19hbHRfaW5zdHJ1Y3Rpb25zLAorCQkuZW5kCT0gKHN0cnVjdCBhbHRfaW5zdHIgKilfX2FsdF9pbnN0cnVjdGlvbnNfZW5kLAogCX07CiAKIAkvKiBXZSBhbHdheXMgaGF2ZSBhIENQVSAwIGF0IHRoaXMgcG9pbnQgKF9faW5pdCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDA1MDcwYjcuLjRhMmYwZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CiAjaW5jbHVkZSA8YXNtL3NtcF9wbGF0Lmg+CkBAIC0xNDUsNSArMTQ2LDYgQEAKICAgREVGSU5FKEhJQkVSTl9QQkVfT1JJRywJb2Zmc2V0b2Yoc3RydWN0IHBiZSwgb3JpZ19hZGRyZXNzKSk7CiAgIERFRklORShISUJFUk5fUEJFX0FERFIsCW9mZnNldG9mKHN0cnVjdCBwYmUsIGFkZHJlc3MpKTsKICAgREVGSU5FKEhJQkVSTl9QQkVfTkVYVCwJb2Zmc2V0b2Yoc3RydWN0IHBiZSwgbmV4dCkpOworICBERUZJTkUoQVJNNjRfRlRSX1NZU1ZBTCwJb2Zmc2V0b2Yoc3RydWN0IGFybTY0X2Z0cl9yZWcsIHN5c192YWwpKTsKICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jYWNoZWluZm8uYyBiL2FyY2gvYXJtNjQva2VybmVsL2NhY2hlaW5mby5jCmluZGV4IGI4NjI5ZDUuLjk2MTczMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2NhY2hlaW5mby5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2NhY2hlaW5mby5jCkBAIC0zOSw3ICszOSw3IEBACiAKIAlpZiAobGV2ZWwgPiBNQVhfQ0FDSEVfTEVWRUwpCiAJCXJldHVybiBDQUNIRV9UWVBFX05PQ0FDSEU7Ci0JYXNtIHZvbGF0aWxlICgibXJzICAgICAleDAsIGNsaWRyX2VsMSIgOiAiPXIiIChjbGlkcikpOworCWNsaWRyID0gcmVhZF9zeXNyZWcoY2xpZHJfZWwxKTsKIAlyZXR1cm4gQ0xJRFJfQ1RZUEUoY2xpZHIsIGxldmVsKTsKIH0KIApAQCAtNTUsMTEgKzU1LDkgQEAKIAogCVdBUk5fT04ocHJlZW1wdGlibGUoKSk7CiAKLQkvKiBQdXQgdmFsdWUgaW50byBDU1NFTFIgKi8KLQlhc20gdm9sYXRpbGUoIm1zciBjc3NlbHJfZWwxLCAleDAiIDogOiAiciIgKGNzc2VscikpOworCXdyaXRlX3N5c3JlZyhjc3NlbHIsIGNzc2Vscl9lbDEpOwogCWlzYigpOwotCS8qIFJlYWQgcmVzdWx0IG91dCBvZiBDQ1NJRFIgKi8KLQlhc20gdm9sYXRpbGUoIm1ycyAleDAsIGNjc2lkcl9lbDEiIDogIj1yIiAoY2NzaWRyKSk7CisJY2NzaWRyID0gcmVhZF9zeXNyZWcoY2NzaWRyX2VsMSk7CiAKIAlyZXR1cm4gY2NzaWRyOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1X2VycmF0YS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1X2VycmF0YS5jCmluZGV4IDgyYjBmYzIuLjAxNTAzOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2NwdV9lcnJhdGEuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVfZXJyYXRhLmMKQEAgLTMwLDYgKzMwLDIxIEBACiAJCQkJICAgICAgIGVudHJ5LT5taWRyX3JhbmdlX21heCk7CiB9CiAKK3N0YXRpYyBib29sCitoYXNfbWlzbWF0Y2hlZF9jYWNoZV9saW5lX3NpemUoY29uc3Qgc3RydWN0IGFybTY0X2NwdV9jYXBhYmlsaXRpZXMgKmVudHJ5LAorCQkJCWludCBzY29wZSkKK3sKKwlXQVJOX09OKHNjb3BlICE9IFNDT1BFX0xPQ0FMX0NQVSB8fCBwcmVlbXB0aWJsZSgpKTsKKwlyZXR1cm4gKHJlYWRfY3B1aWRfY2FjaGV0eXBlKCkgJiBhcm02NF9mdHJfcmVnX2N0cmVsMC5zdHJpY3RfbWFzaykgIT0KKwkJKGFybTY0X2Z0cl9yZWdfY3RyZWwwLnN5c192YWwgJiBhcm02NF9mdHJfcmVnX2N0cmVsMC5zdHJpY3RfbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGNwdV9lbmFibGVfdHJhcF9jdHJfYWNjZXNzKHZvaWQgKl9fdW51c2VkKQoreworCS8qIENsZWFyIFNDVExSX0VMMS5VQ1QgKi8KKwljb25maWdfc2N0bHJfZWwxKFNDVExSX0VMMV9VQ1QsIDApOworfQorCiAjZGVmaW5lIE1JRFJfUkFOR0UobW9kZWwsIG1pbiwgbWF4KSBcCiAJLmRlZl9zY29wZSA9IFNDT1BFX0xPQ0FMX0NQVSwgXAogCS5tYXRjaGVzID0gaXNfYWZmZWN0ZWRfbWlkcl9yYW5nZSwgXApAQCAtMTA4LDYgKzEyMywxMyBAQAogCX0sCiAjZW5kaWYKIAl7CisJCS5kZXNjID0gIk1pc21hdGNoZWQgY2FjaGUgbGluZSBzaXplIiwKKwkJLmNhcGFiaWxpdHkgPSBBUk02NF9NSVNNQVRDSEVEX0NBQ0hFX0xJTkVfU0laRSwKKwkJLm1hdGNoZXMgPSBoYXNfbWlzbWF0Y2hlZF9jYWNoZV9saW5lX3NpemUsCisJCS5kZWZfc2NvcGUgPSBTQ09QRV9MT0NBTF9DUFUsCisJCS5lbmFibGUgPSBjcHVfZW5hYmxlX3RyYXBfY3RyX2FjY2VzcywKKwl9LAorCXsKIAl9CiB9OwogCkBAIC0xMTYsNyArMTM4LDcgQEAKICAqIGFuZCB0aGUgcmVsYXRlZCBpbmZvcm1hdGlvbiBpcyBmcmVlZCBzb29uIGFmdGVyLiBJZiB0aGUgbmV3IENQVSByZXF1aXJlcwogICogYW4gZXJyYXRhIG5vdCBkZXRlY3RlZCBhdCBib290LCBmYWlsIHRoaXMgQ1BVLgogICovCi12b2lkIHZlcmlmeV9sb2NhbF9jcHVfZXJyYXRhKHZvaWQpCit2b2lkIHZlcmlmeV9sb2NhbF9jcHVfZXJyYXRhX3dvcmthcm91bmRzKHZvaWQpCiB7CiAJY29uc3Qgc3RydWN0IGFybTY0X2NwdV9jYXBhYmlsaXRpZXMgKmNhcHMgPSBhcm02NF9lcnJhdGE7CiAKQEAgLTEzMSw3ICsxNTMsNyBAQAogCQl9CiB9CiAKLXZvaWQgY2hlY2tfbG9jYWxfY3B1X2VycmF0YSh2b2lkKQordm9pZCB1cGRhdGVfY3B1X2VycmF0YV93b3JrYXJvdW5kcyh2b2lkKQogewogCXVwZGF0ZV9jcHVfY2FwYWJpbGl0aWVzKGFybTY0X2VycmF0YSwgImVuYWJsaW5nIHdvcmthcm91bmQgZm9yIik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVfb3BzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVfb3BzLmMKaW5kZXggYzdjZmI4Zi4uZTEzN2NlYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1X29wcy5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdV9vcHMuYwpAQCAtMTcsNiArMTcsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC0yOCw3ICsyOSw3IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGNwdV9vcGVyYXRpb25zIGFjcGlfcGFya2luZ19wcm90b2NvbF9vcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGNwdV9vcGVyYXRpb25zIGNwdV9wc2NpX29wczsKIAotY29uc3Qgc3RydWN0IGNwdV9vcGVyYXRpb25zICpjcHVfb3BzW05SX0NQVVNdOworY29uc3Qgc3RydWN0IGNwdV9vcGVyYXRpb25zICpjcHVfb3BzW05SX0NQVVNdIF9fcm9fYWZ0ZXJfaW5pdDsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVfb3BlcmF0aW9ucyAqZHRfc3VwcG9ydGVkX2NwdV9vcHNbXSBfX2luaXRjb25zdCA9IHsKIAkmc21wX3NwaW5fdGFibGVfb3BzLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvY3B1ZmVhdHVyZS5jCmluZGV4IDYyMjcyZWEuLmQ1NzdmMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2NwdWZlYXR1cmUuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVmZWF0dXJlLmMKQEAgLTQ2LDYgKzQ2LDkgQEAKIAogREVDTEFSRV9CSVRNQVAoY3B1X2h3Y2FwcywgQVJNNjRfTkNBUFMpOwogCitERUZJTkVfU1RBVElDX0tFWV9BUlJBWV9GQUxTRShjcHVfaHdjYXBfa2V5cywgQVJNNjRfTkNBUFMpOworRVhQT1JUX1NZTUJPTChjcHVfaHdjYXBfa2V5cyk7CisKICNkZWZpbmUgX19BUk02NF9GVFJfQklUUyhTSUdORUQsIFNUUklDVCwgVFlQRSwgU0hJRlQsIFdJRFRILCBTQUZFX1ZBTCkgXAogCXsJCQkJCQlcCiAJCS5zaWduID0gU0lHTkVELAkJCQlcCkBAIC03NCw3ICs3Nyw3IEBACiBjcHVmZWF0dXJlX3Bhbl9ub3RfdWFvKGNvbnN0IHN0cnVjdCBhcm02NF9jcHVfY2FwYWJpbGl0aWVzICplbnRyeSwgaW50IF9fdW51c2VkKTsKIAogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0aXNhcjBbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRpc2FyMFtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMzIsIDMyLCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIElEX0FBNjRJU0FSMF9SRE1fU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMjQsIDQsIDApLApAQCAtODcsNyArOTAsNyBAQAogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0cGZyMFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NHBmcjBbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDMyLCAzMiwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAyOCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9BQTY0UEZSMF9HSUNfU0hJRlQsIDQsIDApLApAQCAtMTAxLDcgKzEwNCw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRtbWZyMFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfYWE2NG1tZnIwW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAzMiwgMzIsIDApLAogCVNfQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9BQTY0TU1GUjBfVEdSQU40X1NISUZULCA0LCBJRF9BQTY0TU1GUjBfVEdSQU40X05JKSwKIAlTX0FSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgSURfQUE2NE1NRlIwX1RHUkFONjRfU0hJRlQsIDQsIElEX0FBNjRNTUZSMF9UR1JBTjY0X05JKSwKQEAgLTExOSw3ICsxMjIsNyBAQAogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0bW1mcjFbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRtbWZyMVtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMzIsIDMyLCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NE1NRlIxX1BBTl9TSElGVCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9BQTY0TU1GUjFfTE9SX1NISUZULCA0LCAwKSwKQEAgLTEzMCw3ICsxMzMsNyBAQAogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0bW1mcjJbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRtbWZyMltdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgSURfQUE2NE1NRlIyX0xWQV9TSElGVCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9BQTY0TU1GUjJfSUVTQl9TSElGVCwgNCwgMCksCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9BQTY0TU1GUjJfTFNNX1NISUZULCA0LCAwKSwKQEAgLTEzOSw3ICsxNDIsNyBAQAogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9jdHJbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2N0cltdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMzEsIDEsIDEpLAkvKiBSQU8gKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDI4LCAzLCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfSElHSEVSX1NBRkUsIDI0LCA0LCAwKSwJLyogQ1dHICovCkBAIC0xNDcsMTUgKzE1MCwyMSBAQAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCAxNiwgNCwgMSksCS8qIERtaW5MaW5lICovCiAJLyoKIAkgKiBMaW51eCBjYW4gaGFuZGxlIGRpZmZlcmluZyBJLWNhY2hlIHBvbGljaWVzLiBVc2Vyc3BhY2UgSklUcyB3aWxsCi0JICogbWFrZSB1c2Ugb2YgKm1pbkxpbmUKKwkgKiBtYWtlIHVzZSBvZiAqbWluTGluZS4KKwkgKiBJZiB3ZSBoYXZlIGRpZmZlcmluZyBJLWNhY2hlIHBvbGljaWVzLCByZXBvcnQgaXQgYXMgdGhlIHdlYWtlc3QgLSBBSVZJVlQuCiAJICovCi0JQVJNNjRfRlRSX0JJVFMoRlRSX05PTlNUUklDVCwgRlRSX0VYQUNULCAxNCwgMiwgMCksCS8qIEwxSXAgKi8KKwlBUk02NF9GVFJfQklUUyhGVFJfTk9OU1RSSUNULCBGVFJfRVhBQ1QsIDE0LCAyLCBJQ0FDSEVfUE9MSUNZX0FJVklWVCksCS8qIEwxSXAgKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDQsIDEwLCAwKSwJLyogUkFaICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDAsIDQsIDApLAkvKiBJbWluTGluZSAqLwogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9tbWZyMFtdID0geworc3RydWN0IGFybTY0X2Z0cl9yZWcgYXJtNjRfZnRyX3JlZ19jdHJlbDAgPSB7CisJLm5hbWUJCT0gIlNZU19DVFJfRUwwIiwKKwkuZnRyX2JpdHMJPSBmdHJfY3RyCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9tbWZyMFtdID0gewogCVNfQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAyOCwgNCwgMHhmKSwJLyogSW5uZXJTaHIgKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDI0LCA0LCAwKSwJLyogRkNTRSAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9OT05TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCAyMCwgNCwgMCksCS8qIEF1eFJlZyAqLwpAQCAtMTY3LDcgKzE3Niw3IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2FhNjRkZnIwW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9hYTY0ZGZyMFtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMzIsIDMyLCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgSURfQUE2NERGUjBfQ1RYX0NNUFNfU0hJRlQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCBJRF9BQTY0REZSMF9XUlBTX1NISUZULCA0LCAwKSwKQEAgLTE3OCwxNCArMTg3LDE0IEBACiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX212ZnIyW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9tdmZyMltdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgOCwgMjQsIDApLAkvKiBSQVogKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDQsIDQsIDApLAkJLyogRlBNaXNjICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAwLCA0LCAwKSwJCS8qIFNJTURNaXNjICovCiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2RjemlkW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9kY3ppZFtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgNSwgMjcsIDApLAkvKiBSQVogKi8KIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDQsIDEsIDEpLAkJLyogRFpQICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDAsIDQsIDApLAkvKiBCUyAqLwpAQCAtMTkzLDcgKzIwMiw3IEBACiB9OwogCiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2lkX2lzYXI1W10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9pc2FyNVtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgSURfSVNBUjVfUkRNX1NISUZULCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDIwLCA0LCAwKSwJLyogUkFaICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCBJRF9JU0FSNV9DUkMzMl9TSElGVCwgNCwgMCksCkBAIC0yMDQsMTQgKzIxMywxNCBAQAogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9tbWZyNFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfbW1mcjRbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDgsIDI0LCAwKSwJLyogUkFaICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCA0LCA0LCAwKSwJCS8qIGFjMiAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMCwgNCwgMCksCQkvKiBSQVogKi8KIAlBUk02NF9GVFJfRU5ELAogfTsKIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfcGZyMFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfaWRfcGZyMFtdID0gewogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgMTYsIDE2LCAwKSwJLyogUkFaICovCiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAxMiwgNCwgMCksCS8qIFN0YXRlMyAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9FWEFDVCwgOCwgNCwgMCksCQkvKiBTdGF0ZTIgKi8KQEAgLTIyMCw3ICsyMjksNyBAQAogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9kZnIwW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9pZF9kZnIwW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDI4LCA0LCAwKSwKIAlTX0FSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCAyNCwgNCwgMHhmKSwJLyogUGVyZk1vbiAqLwogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCAyMCwgNCwgMCksCkBAIC0yMzgsNyArMjQ3LDcgQEAKICAqIDAuIENvdmVycyB0aGUgZm9sbG93aW5nIDMyYml0IHJlZ2lzdGVyczoKICAqIGlkX2lzYXJbMC00XSwgaWRfbW1mclsxLTNdLCBpZF9wZnIxLCBtdmZyWzAtMV0KICAqLwotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfZ2VuZXJpY18zMmJpdHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2dlbmVyaWNfMzJiaXRzW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0xPV0VSX1NBRkUsIDI4LCA0LCAwKSwKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfTE9XRVJfU0FGRSwgMjQsIDQsIDApLAogCUFSTTY0X0ZUUl9CSVRTKEZUUl9TVFJJQ1QsIEZUUl9MT1dFUl9TQUZFLCAyMCwgNCwgMCksCkBAIC0yNTAsMjkgKzI1OSwzMiBAQAogCUFSTTY0X0ZUUl9FTkQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9nZW5lcmljW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzIGZ0cl9nZW5lcmljW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAwLCA2NCwgMCksCiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2dlbmVyaWMzMltdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyBmdHJfZ2VuZXJpYzMyW10gPSB7CiAJQVJNNjRfRlRSX0JJVFMoRlRSX1NUUklDVCwgRlRSX0VYQUNULCAwLCAzMiwgMCksCiAJQVJNNjRfRlRSX0VORCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2FhNjRyYXpbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgZnRyX2FhNjRyYXpbXSA9IHsKIAlBUk02NF9GVFJfQklUUyhGVFJfU1RSSUNULCBGVFJfRVhBQ1QsIDAsIDY0LCAwKSwKIAlBUk02NF9GVFJfRU5ELAogfTsKIAotI2RlZmluZSBBUk02NF9GVFJfUkVHKGlkLCB0YWJsZSkJCVwKLQl7CQkJCQlcCi0JCS5zeXNfaWQgPSBpZCwJCQlcCisjZGVmaW5lIEFSTTY0X0ZUUl9SRUcoaWQsIHRhYmxlKSB7CQlcCisJLnN5c19pZCA9IGlkLAkJCQlcCisJLnJlZyA9IAkmKHN0cnVjdCBhcm02NF9mdHJfcmVnKXsJXAogCQkubmFtZSA9ICNpZCwJCQlcCiAJCS5mdHJfYml0cyA9ICYoKHRhYmxlKVswXSksCVwKLQl9CisJfX0KIAotc3RhdGljIHN0cnVjdCBhcm02NF9mdHJfcmVnIGFybTY0X2Z0cl9yZWdzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IF9fZnRyX3JlZ19lbnRyeSB7CisJdTMyCQkJc3lzX2lkOworCXN0cnVjdCBhcm02NF9mdHJfcmVnIAkqcmVnOworfSBhcm02NF9mdHJfcmVnc1tdID0gewogCiAJLyogT3AxID0gMCwgQ1JuID0gMCwgQ1JtID0gMSAqLwogCUFSTTY0X0ZUUl9SRUcoU1lTX0lEX1BGUjBfRUwxLCBmdHJfaWRfcGZyMCksCkBAIC0zMTUsNyArMzI3LDcgQEAKIAlBUk02NF9GVFJfUkVHKFNZU19JRF9BQTY0TU1GUjJfRUwxLCBmdHJfaWRfYWE2NG1tZnIyKSwKIAogCS8qIE9wMSA9IDMsIENSbiA9IDAsIENSbSA9IDAgKi8KLQlBUk02NF9GVFJfUkVHKFNZU19DVFJfRUwwLCBmdHJfY3RyKSwKKwl7IFNZU19DVFJfRUwwLCAmYXJtNjRfZnRyX3JlZ19jdHJlbDAgfSwKIAlBUk02NF9GVFJfUkVHKFNZU19EQ1pJRF9FTDAsIGZ0cl9kY3ppZCksCiAKIAkvKiBPcDEgPSAzLCBDUm4gPSAxNCwgQ1JtID0gMCAqLwpAQCAtMzI0LDcgKzMzNiw3IEBACiAKIHN0YXRpYyBpbnQgc2VhcmNoX2NtcF9mdHJfcmVnKGNvbnN0IHZvaWQgKmlkLCBjb25zdCB2b2lkICpyZWdwKQogewotCXJldHVybiAoaW50KSh1bnNpZ25lZCBsb25nKWlkIC0gKGludCkoKGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfcmVnICopcmVncCktPnN5c19pZDsKKwlyZXR1cm4gKGludCkodW5zaWduZWQgbG9uZylpZCAtIChpbnQpKChjb25zdCBzdHJ1Y3QgX19mdHJfcmVnX2VudHJ5ICopcmVncCktPnN5c19pZDsKIH0KIAogLyoKQEAgLTMzOSwxNCArMzUxLDIwIEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgYXJtNjRfZnRyX3JlZyAqZ2V0X2FybTY0X2Z0cl9yZWcodTMyIHN5c19pZCkKIHsKLQlyZXR1cm4gYnNlYXJjaCgoY29uc3Qgdm9pZCAqKSh1bnNpZ25lZCBsb25nKXN5c19pZCwKKwljb25zdCBzdHJ1Y3QgX19mdHJfcmVnX2VudHJ5ICpyZXQ7CisKKwlyZXQgPSBic2VhcmNoKChjb25zdCB2b2lkICopKHVuc2lnbmVkIGxvbmcpc3lzX2lkLAogCQkJYXJtNjRfZnRyX3JlZ3MsCiAJCQlBUlJBWV9TSVpFKGFybTY0X2Z0cl9yZWdzKSwKIAkJCXNpemVvZihhcm02NF9mdHJfcmVnc1swXSksCiAJCQlzZWFyY2hfY21wX2Z0cl9yZWcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQtPnJlZzsKKwlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHU2NCBhcm02NF9mdHJfc2V0X3ZhbHVlKHN0cnVjdCBhcm02NF9mdHJfYml0cyAqZnRycCwgczY0IHJlZywgczY0IGZ0cl92YWwpCitzdGF0aWMgdTY0IGFybTY0X2Z0cl9zZXRfdmFsdWUoY29uc3Qgc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwLCBzNjQgcmVnLAorCQkJICAgICAgIHM2NCBmdHJfdmFsKQogewogCXU2NCBtYXNrID0gYXJtNjRfZnRyX21hc2soZnRycCk7CiAKQEAgLTM1NSw3ICszNzMsOCBAQAogCXJldHVybiByZWc7CiB9CiAKLXN0YXRpYyBzNjQgYXJtNjRfZnRyX3NhZmVfdmFsdWUoc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwLCBzNjQgbmV3LCBzNjQgY3VyKQorc3RhdGljIHM2NCBhcm02NF9mdHJfc2FmZV92YWx1ZShjb25zdCBzdHJ1Y3QgYXJtNjRfZnRyX2JpdHMgKmZ0cnAsIHM2NCBuZXcsCisJCQkJczY0IGN1cikKIHsKIAlzNjQgcmV0ID0gMDsKIApAQCAtMzc2LDI3ICszOTUsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzb3J0X2NtcF9mdHJfcmVncyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotCXJldHVybiAoKGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfcmVnICopYSktPnN5c19pZCAtCi0JCSAoKGNvbnN0IHN0cnVjdCBhcm02NF9mdHJfcmVnICopYiktPnN5c19pZDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHN3YXBfZnRyX3JlZ3Modm9pZCAqYSwgdm9pZCAqYiwgaW50IHNpemUpCi17Ci0Jc3RydWN0IGFybTY0X2Z0cl9yZWcgdG1wID0gKihzdHJ1Y3QgYXJtNjRfZnRyX3JlZyAqKWE7Ci0JKihzdHJ1Y3QgYXJtNjRfZnRyX3JlZyAqKWEgPSAqKHN0cnVjdCBhcm02NF9mdHJfcmVnICopYjsKLQkqKHN0cnVjdCBhcm02NF9mdHJfcmVnICopYiA9IHRtcDsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IHNvcnRfZnRyX3JlZ3Modm9pZCkKIHsKLQkvKiBLZWVwIHRoZSBhcnJheSBzb3J0ZWQgc28gdGhhdCB3ZSBjYW4gZG8gdGhlIGJpbmFyeSBzZWFyY2ggKi8KLQlzb3J0KGFybTY0X2Z0cl9yZWdzLAotCQlBUlJBWV9TSVpFKGFybTY0X2Z0cl9yZWdzKSwKLQkJc2l6ZW9mKGFybTY0X2Z0cl9yZWdzWzBdKSwKLQkJc29ydF9jbXBfZnRyX3JlZ3MsCi0JCXN3YXBfZnRyX3JlZ3MpOworCWludCBpOworCisJLyogQ2hlY2sgdGhhdCB0aGUgYXJyYXkgaXMgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGRvIHRoZSBiaW5hcnkgc2VhcmNoICovCisJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUoYXJtNjRfZnRyX3JlZ3MpOyBpKyspCisJCUJVR19PTihhcm02NF9mdHJfcmVnc1tpXS5zeXNfaWQgPCBhcm02NF9mdHJfcmVnc1tpIC0gMV0uc3lzX2lkKTsKIH0KIAogLyoKQEAgLTQwNyw3ICs0MTIsNyBAQAogewogCXU2NCB2YWwgPSAwOwogCXU2NCBzdHJpY3RfbWFzayA9IH4weDBVTEw7Ci0Jc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwOworCWNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyAqZnRycDsKIAlzdHJ1Y3QgYXJtNjRfZnRyX3JlZyAqcmVnID0gZ2V0X2FybTY0X2Z0cl9yZWcoc3lzX3JlZyk7CiAKIAlCVUdfT04oIXJlZyk7CkBAIC00NjQsNyArNDY5LDcgQEAKIAogc3RhdGljIHZvaWQgdXBkYXRlX2NwdV9mdHJfcmVnKHN0cnVjdCBhcm02NF9mdHJfcmVnICpyZWcsIHU2NCBuZXcpCiB7Ci0Jc3RydWN0IGFybTY0X2Z0cl9iaXRzICpmdHJwOworCWNvbnN0IHN0cnVjdCBhcm02NF9mdHJfYml0cyAqZnRycDsKIAogCWZvciAoZnRycCA9IHJlZy0+ZnRyX2JpdHM7IGZ0cnAtPndpZHRoOyBmdHJwKyspIHsKIAkJczY0IGZ0cl9jdXIgPSBhcm02NF9mdHJfdmFsdWUoZnRycCwgcmVnLT5zeXNfdmFsKTsKQEAgLTEwMDQsMjUgKzEwMDksMzUgQEAKICAqIGNhbm5vdCBkbyBhbnl0aGluZyB0byBmaXggaXQgdXAgYW5kIGNvdWxkIGNhdXNlIHVuZXhwZWN0ZWQgZmFpbHVyZXMuIFNvCiAgKiB3ZSBwYXJrIHRoZSBDUFUuCiAgKi8KLXZvaWQgdmVyaWZ5X2xvY2FsX2NwdV9jYXBhYmlsaXRpZXModm9pZCkKK3N0YXRpYyB2b2lkIHZlcmlmeV9sb2NhbF9jcHVfY2FwYWJpbGl0aWVzKHZvaWQpCiB7Ci0KLQljaGVja19lYXJseV9jcHVfZmVhdHVyZXMoKTsKLQotCS8qCi0JICogSWYgd2UgaGF2ZW4ndCBjb21wdXRlZCB0aGUgc3lzdGVtIGNhcGFiaWxpdGllcywgdGhlcmUgaXMgbm90aGluZwotCSAqIHRvIHZlcmlmeS4KLQkgKi8KLQlpZiAoIXN5c19jYXBzX2luaXRpYWxpc2VkKQotCQlyZXR1cm47Ci0KLQl2ZXJpZnlfbG9jYWxfY3B1X2VycmF0YSgpOworCXZlcmlmeV9sb2NhbF9jcHVfZXJyYXRhX3dvcmthcm91bmRzKCk7CiAJdmVyaWZ5X2xvY2FsX2NwdV9mZWF0dXJlcyhhcm02NF9mZWF0dXJlcyk7CiAJdmVyaWZ5X2xvY2FsX2VsZl9od2NhcHMoYXJtNjRfZWxmX2h3Y2Fwcyk7CiAJaWYgKHN5c3RlbV9zdXBwb3J0c18zMmJpdF9lbDAoKSkKIAkJdmVyaWZ5X2xvY2FsX2VsZl9od2NhcHMoY29tcGF0X2VsZl9od2NhcHMpOwogfQogCit2b2lkIGNoZWNrX2xvY2FsX2NwdV9jYXBhYmlsaXRpZXModm9pZCkKK3sKKwkvKgorCSAqIEFsbCBzZWNvbmRhcnkgQ1BVcyBzaG91bGQgY29uZm9ybSB0byB0aGUgZWFybHkgQ1BVIGZlYXR1cmVzCisJICogaW4gdXNlIGJ5IHRoZSBrZXJuZWwgYmFzZWQgb24gYm9vdCBDUFUuCisJICovCisJY2hlY2tfZWFybHlfY3B1X2ZlYXR1cmVzKCk7CisKKwkvKgorCSAqIElmIHdlIGhhdmVuJ3QgZmluYWxpc2VkIHRoZSBzeXN0ZW0gY2FwYWJpbGl0aWVzLCB0aGlzIENQVSBnZXRzCisJICogYSBjaGFuY2UgdG8gdXBkYXRlIHRoZSBlcnJhdGEgd29yayBhcm91bmRzLgorCSAqIE90aGVyd2lzZSwgdGhpcyBDUFUgc2hvdWxkIHZlcmlmeSB0aGF0IGl0IGhhcyBhbGwgdGhlIHN5c3RlbQorCSAqIGFkdmVydGlzZWQgY2FwYWJpbGl0aWVzLgorCSAqLworCWlmICghc3lzX2NhcHNfaW5pdGlhbGlzZWQpCisJCXVwZGF0ZV9jcHVfZXJyYXRhX3dvcmthcm91bmRzKCk7CisJZWxzZQorCQl2ZXJpZnlfbG9jYWxfY3B1X2NhcGFiaWxpdGllcygpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfZmVhdHVyZV9jYXBhYmlsaXRpZXModm9pZCkKIHsKIAl1cGRhdGVfY3B1X2NhcGFiaWxpdGllcyhhcm02NF9mZWF0dXJlcywgImRldGVjdGVkIGZlYXR1cmU6Iik7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVpbmZvLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVpbmZvLmMKaW5kZXggZWQxYjg0Zi4uYjNkNWIzZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1aW5mby5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWluZm8uYwpAQCAtMzYzLDggKzM2Myw2IEBACiAJfQogCiAJY3B1aW5mb19kZXRlY3RfaWNhY2hlX3BvbGljeShpbmZvKTsKLQotCWNoZWNrX2xvY2FsX2NwdV9lcnJhdGEoKTsKIH0KIAogdm9pZCBjcHVpbmZvX3N0b3JlX2NwdSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvZGVidWctbW9uaXRvcnMuYyBiL2FyY2gvYXJtNjQva2VybmVsL2RlYnVnLW1vbml0b3JzLmMKaW5kZXggOTFmZmY0OC4uNzNhZTkwZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvZGVidWctbW9uaXRvcnMuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9kZWJ1Zy1tb25pdG9ycy5jCkBAIC00NiwxNiArNDYsMTQgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWxvY2FsX2RiZ19zYXZlKGZsYWdzKTsKLQlhc20gdm9sYXRpbGUoIm1zciBtZHNjcl9lbDEsICUwIiA6OiAiciIgKG1kc2NyKSk7CisJd3JpdGVfc3lzcmVnKG1kc2NyLCBtZHNjcl9lbDEpOwogCWxvY2FsX2RiZ19yZXN0b3JlKGZsYWdzKTsKIH0KIE5PS1BST0JFX1NZTUJPTChtZHNjcl93cml0ZSk7CiAKIHN0YXRpYyB1MzIgbWRzY3JfcmVhZCh2b2lkKQogewotCXUzMiBtZHNjcjsKLQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgbWRzY3JfZWwxIiA6ICI9ciIgKG1kc2NyKSk7Ci0JcmV0dXJuIG1kc2NyOworCXJldHVybiByZWFkX3N5c3JlZyhtZHNjcl9lbDEpOwogfQogTk9LUFJPQkVfU1lNQk9MKG1kc2NyX3JlYWQpOwogCkBAIC0xMzIsMzYgKzEzMCwxOCBAQAogLyoKICAqIE9TIGxvY2sgY2xlYXJpbmcuCiAgKi8KLXN0YXRpYyB2b2lkIGNsZWFyX29zX2xvY2sodm9pZCAqdW51c2VkKQorc3RhdGljIGludCBjbGVhcl9vc19sb2NrKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JYXNtIHZvbGF0aWxlKCJtc3Igb3NsYXJfZWwxLCAlMCIgOiA6ICJyIiAoMCkpOworCXdyaXRlX3N5c3JlZygwLCBvc2xhcl9lbDEpOworCWlzYigpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9zX2xvY2tfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCi17Ci0JaWYgKChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgPT0gQ1BVX09OTElORSkKLQkJY2xlYXJfb3NfbG9jayhOVUxMKTsKLQlyZXR1cm4gTk9USUZZX09LOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG9zX2xvY2tfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBvc19sb2NrX25vdGlmeSwKLX07Ci0KIHN0YXRpYyBpbnQgZGVidWdfbW9uaXRvcnNfaW5pdCh2b2lkKQogewotCWNwdV9ub3RpZmllcl9yZWdpc3Rlcl9iZWdpbigpOwotCi0JLyogQ2xlYXIgdGhlIE9TIGxvY2suICovCi0Jb25fZWFjaF9jcHUoY2xlYXJfb3NfbG9jaywgTlVMTCwgMSk7Ci0JaXNiKCk7Ci0KLQkvKiBSZWdpc3RlciBob3RwbHVnIGhhbmRsZXIuICovCi0JX19yZWdpc3Rlcl9jcHVfbm90aWZpZXIoJm9zX2xvY2tfbmIpOwotCi0JY3B1X25vdGlmaWVyX3JlZ2lzdGVyX2RvbmUoKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfQVJNNjRfREVCVUdfTU9OSVRPUlNfU1RBUlRJTkcsCisJCQkJICJDUFVIUF9BUF9BUk02NF9ERUJVR19NT05JVE9SU19TVEFSVElORyIsCisJCQkJIGNsZWFyX29zX2xvY2ssIE5VTEwpOwogfQogcG9zdGNvcmVfaW5pdGNhbGwoZGVidWdfbW9uaXRvcnNfaW5pdCk7CiAKQEAgLTI1NCw3ICsyMzQsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmICh1c2VyX21vZGUocmVncykpIHsKLQkJc2VuZF91c2VyX3NpZ3RyYXAoVFJBUF9IV0JLUFQpOworCQlzZW5kX3VzZXJfc2lndHJhcChUUkFQX1RSQUNFKTsKIAogCQkvKgogCQkgKiBwdHJhY2Ugd2lsbCBkaXNhYmxlIHNpbmdsZSBzdGVwIHVubGVzcyBleHBsaWNpdGx5CkBAIC0zODIsNyArMzYyLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGRlYnVnX3RyYXBzX2luaXQodm9pZCkKIHsKIAlob29rX2RlYnVnX2ZhdWx0X2NvZGUoREJHX0VTUl9FVlRfSFdTUywgc2luZ2xlX3N0ZXBfaGFuZGxlciwgU0lHVFJBUCwKLQkJCSAgICAgIFRSQVBfSFdCS1BULCAic2luZ2xlLXN0ZXAgaGFuZGxlciIpOworCQkJICAgICAgVFJBUF9UUkFDRSwgInNpbmdsZS1zdGVwIGhhbmRsZXIiKTsKIAlob29rX2RlYnVnX2ZhdWx0X2NvZGUoREJHX0VTUl9FVlRfQlJLLCBicmtfaGFuZGxlciwgU0lHVFJBUCwKIAkJCSAgICAgIFRSQVBfQlJLUFQsICJwdHJhY2UgQlJLIGhhbmRsZXIiKTsKIAlyZXR1cm4gMDsKQEAgLTQzNSw4ICs0MTUsMTAgQEAKIC8qIHB0cmFjZSBBUEkgKi8KIHZvaWQgdXNlcl9lbmFibGVfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXNldF90aV90aHJlYWRfZmxhZyh0YXNrX3RocmVhZF9pbmZvKHRhc2spLCBUSUZfU0lOR0xFU1RFUCk7Ci0Jc2V0X3JlZ3Nfc3Bzcl9zcyh0YXNrX3B0X3JlZ3ModGFzaykpOworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSB0YXNrX3RocmVhZF9pbmZvKHRhc2spOworCisJaWYgKCF0ZXN0X2FuZF9zZXRfdGlfdGhyZWFkX2ZsYWcodGksIFRJRl9TSU5HTEVTVEVQKSkKKwkJc2V0X3JlZ3Nfc3Bzcl9zcyh0YXNrX3B0X3JlZ3ModGFzaykpOwogfQogTk9LUFJPQkVfU1lNQk9MKHVzZXJfZW5hYmxlX3NpbmdsZV9zdGVwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvZW50cnktZnRyYWNlLlMgYi9hcmNoL2FybTY0L2tlcm5lbC9lbnRyeS1mdHJhY2UuUwppbmRleCAwZjAzYThmLi5hZWYwMmQyIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9lbnRyeS1mdHJhY2UuUworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9lbnRyeS1mdHJhY2UuUwpAQCAtMjE5LDcgKzIxOSw3IEBACiAgKgogICogUnVuIGZ0cmFjZV9yZXR1cm5fdG9faGFuZGxlcigpIGJlZm9yZSBnb2luZyBiYWNrIHRvIHBhcmVudC4KICAqIEBmcCBpcyBjaGVja2VkIGFnYWluc3QgdGhlIHZhbHVlIHBhc3NlZCBieSBmdHJhY2VfZ3JhcGhfY2FsbGVyKCkKLSAqIG9ubHkgd2hlbiBDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUIGlzIGVuYWJsZWQuCisgKiBvbmx5IHdoZW4gSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUIGlzIGVuYWJsZWQuCiAgKi8KIEVOVFJZKHJldHVybl90b19oYW5kbGVyKQogCXNhdmVfcmV0dXJuX3JlZ3MKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2VudHJ5LlMgYi9hcmNoL2FybTY0L2tlcm5lbC9lbnRyeS5TCmluZGV4IDQ0MTQyMGMuLjIyM2Q1NGEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvZW50cnkuUwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJc3RyCXgyMCwgW3NwLCAjU19PUklHX0FERFJfTElNSVRdCiAJbW92CXgyMCwgI1RBU0tfU0laRV82NAogCXN0cgl4MjAsIFt0c2ssICNUSV9BRERSX0xJTUlUXQotCUFMVEVSTkFUSVZFKG5vcCwgU0VUX1BTVEFURV9VQU8oMCksIEFSTTY0X0hBU19VQU8sIENPTkZJR19BUk02NF9VQU8pCisJLyogTm8gbmVlZCB0byByZXNldCBQU1RBVEUuVUFPLCBoYXJkd2FyZSdzIGFscmVhZHkgc2V0IGl0IHRvIDAgZm9yIHVzICovCiAJLmVuZGlmIC8qIFxlbCA9PSAwICovCiAJbXJzCXgyMiwgZWxyX2VsMQogCW1ycwl4MjMsIHNwc3JfZWwxCkBAIC0xNTAsMTMgKzE1MCw3IEBACiAJbGRyCXgyMywgW3NwLCAjU19TUF0JCS8vIGxvYWQgcmV0dXJuIHN0YWNrIHBvaW50ZXIKIAltc3IJc3BfZWwwLCB4MjMKICNpZmRlZiBDT05GSUdfQVJNNjRfRVJSQVRVTV84NDU3MTkKLWFsdGVybmF0aXZlX2lmX25vdCBBUk02NF9XT1JLQVJPVU5EXzg0NTcxOQotCW5vcAotCW5vcAotI2lmZGVmIENPTkZJR19QSURfSU5fQ09OVEVYVElEUgotCW5vcAotI2VuZGlmCi1hbHRlcm5hdGl2ZV9lbHNlCithbHRlcm5hdGl2ZV9pZiBBUk02NF9XT1JLQVJPVU5EXzg0NTcxOQogCXRiegl4MjIsICM0LCAxZgogI2lmZGVmIENPTkZJR19QSURfSU5fQ09OVEVYVElEUgogCW1ycwl4MjksIGNvbnRleHRpZHJfZWwxCkBAIC0xNjUsNyArMTU5LDcgQEAKIAltc3IgY29udGV4dGlkcl9lbDEsIHh6cgogI2VuZGlmCiAxOgotYWx0ZXJuYXRpdmVfZW5kaWYKK2FsdGVybmF0aXZlX2Vsc2Vfbm9wX2VuZGlmCiAjZW5kaWYKIAkuZW5kaWYKIAltc3IJZWxyX2VsMSwgeDIxCQkJLy8gc2V0IHVwIHRoZSByZXR1cm4gZGF0YQpAQCAtNzA3LDE4ICs3MDEsMTMgQEAKICAqIE9rLCB3ZSBuZWVkIHRvIGRvIGV4dHJhIHByb2Nlc3NpbmcsIGVudGVyIHRoZSBzbG93IHBhdGguCiAgKi8KIHdvcmtfcGVuZGluZzoKLQl0Ym56CXgxLCAjVElGX05FRURfUkVTQ0hFRCwgd29ya19yZXNjaGVkCi0JLyogVElGX1NJR1BFTkRJTkcsIFRJRl9OT1RJRllfUkVTVU1FIG9yIFRJRl9GT1JFSUdOX0ZQU1RBVEUgY2FzZSAqLwogCW1vdgl4MCwgc3AJCQkJLy8gJ3JlZ3MnCi0JZW5hYmxlX2lycQkJCQkvLyBlbmFibGUgaW50ZXJydXB0cyBmb3IgZG9fbm90aWZ5X3Jlc3VtZSgpCiAJYmwJZG9fbm90aWZ5X3Jlc3VtZQotCWIJcmV0X3RvX3VzZXIKLXdvcmtfcmVzY2hlZDoKICNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKLQlibAl0cmFjZV9oYXJkaXJxc19vZmYJCS8vIHRoZSBJUlFzIGFyZSBvZmYgaGVyZSwgaW5mb3JtIHRoZSB0cmFjaW5nIGNvZGUKKwlibAl0cmFjZV9oYXJkaXJxc19vbgkJLy8gZW5hYmxlZCB3aGlsZSBpbiB1c2Vyc3BhY2UKICNlbmRpZgotCWJsCXNjaGVkdWxlCi0KKwlsZHIJeDEsIFt0c2ssICNUSV9GTEFHU10JCS8vIHJlLWNoZWNrIGZvciBzaW5nbGUtc3RlcAorCWIJZmluaXNoX3JldF90b191c2VyCiAvKgogICogInNsb3ciIHN5c2NhbGwgcmV0dXJuIHBhdGguCiAgKi8KQEAgLTcyNyw2ICs3MTYsNyBAQAogCWxkcgl4MSwgW3RzaywgI1RJX0ZMQUdTXQogCWFuZAl4MiwgeDEsICNfVElGX1dPUktfTUFTSwogCWNibnoJeDIsIHdvcmtfcGVuZGluZworZmluaXNoX3JldF90b191c2VyOgogCWVuYWJsZV9zdGVwX3RzayB4MSwgeDIKIAlrZXJuZWxfZXhpdCAwCiBFTkRQUk9DKHJldF90b191c2VyKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvZnBzaW1kLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9mcHNpbWQuYwppbmRleCA5NzViMjc0Li4zOTRjNjFkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9mcHNpbWQuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9mcHNpbWQuYwpAQCAtMjk5LDI4ICsyOTksMTYgQEAKICNlbmRpZiAvKiBDT05GSUdfQ1BVX1BNICovCiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLXN0YXRpYyBpbnQgZnBzaW1kX2NwdV9ob3RwbHVnX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCQkgICAgICAgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgZnBzaW1kX2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9IChsb25nKWhjcHU7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCXBlcl9jcHUoZnBzaW1kX2xhc3Rfc3RhdGUsIGNwdSkgPSBOVUxMOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlwZXJfY3B1KGZwc2ltZF9sYXN0X3N0YXRlLCBjcHUpID0gTlVMTDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBmcHNpbWRfY3B1X2hvdHBsdWdfbm90aWZpZXJfYmxvY2sgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBmcHNpbWRfY3B1X2hvdHBsdWdfbm90aWZpZXIsCi19OwotCiBzdGF0aWMgaW5saW5lIHZvaWQgZnBzaW1kX2hvdHBsdWdfaW5pdCh2b2lkKQogewotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmZnBzaW1kX2NwdV9ob3RwbHVnX25vdGlmaWVyX2Jsb2NrKTsKKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FSTTY0X0ZQU0lNRF9ERUFELCAiYXJtNjQvZnBzaW1kOmRlYWQiLAorCQkJCSAgTlVMTCwgZnBzaW1kX2NwdV9kZWFkKTsKIH0KIAogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2Z0cmFjZS5jIGIvYXJjaC9hcm02NC9rZXJuZWwvZnRyYWNlLmMKaW5kZXggZWJlY2Y5YS4uNDBhZDA4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvZnRyYWNlLmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCQlyZXR1cm47CiAKIAllcnIgPSBmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2Uob2xkLCBzZWxmX2FkZHIsICZ0cmFjZS5kZXB0aCwKLQkJCQkgICAgICAgZnJhbWVfcG9pbnRlcik7CisJCQkJICAgICAgIGZyYW1lX3BvaW50ZXIsIE5VTEwpOwogCWlmIChlcnIgPT0gLUVCVVNZKQogCQlyZXR1cm47CiAJZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvaGVhZC5TIGIvYXJjaC9hcm02NC9rZXJuZWwvaGVhZC5TCmluZGV4IDNlN2IwNTAuLjQyN2Y2ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2hlYWQuUworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9oZWFkLlMKQEAgLTIwOCwxMyArMjA4LDIzIEBACiAKIAlfX0lOSVQKIAorCS8qCisJICogVGhlIGZvbGxvd2luZyBjYWxsZWUgc2F2ZWQgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyBhcmUgdXNlZCBvbiB0aGUKKwkgKiBwcmltYXJ5IGxvd2xldmVsIGJvb3QgcGF0aDoKKwkgKgorCSAqICBSZWdpc3RlciAgIFNjb3BlICAgICAgICAgICAgICAgICAgICAgIFB1cnBvc2UKKwkgKiAgeDIxICAgICAgICBzdGV4dCgpIC4uIHN0YXJ0X2tlcm5lbCgpICBGRFQgcG9pbnRlciBwYXNzZWQgYXQgYm9vdCBpbiB4MAorCSAqICB4MjMgICAgICAgIHN0ZXh0KCkgLi4gc3RhcnRfa2VybmVsKCkgIHBoeXNpY2FsIG1pc2FsaWdubWVudC9LQVNMUiBvZmZzZXQKKwkgKiAgeDI4ICAgICAgICBfX2NyZWF0ZV9wYWdlX3RhYmxlcygpICAgICBjYWxsZWUgcHJlc2VydmVkIHRlbXAgcmVnaXN0ZXIKKwkgKiAgeDE5L3gyMCAgICBfX3ByaW1hcnlfc3dpdGNoKCkgICAgICAgICBjYWxsZWUgcHJlc2VydmVkIHRlbXAgcmVnaXN0ZXJzCisJICovCiBFTlRSWShzdGV4dCkKIAlibAlwcmVzZXJ2ZV9ib290X2FyZ3MKLQlibAllbDJfc2V0dXAJCQkvLyBEcm9wIHRvIEVMMSwgdzIwPWNwdV9ib290X21vZGUKLQlhZHJwCXgyNCwgX19QSFlTX09GRlNFVAotCWFuZAl4MjMsIHgyNCwgTUlOX0tJTUdfQUxJR04gLSAxCS8vIEtBU0xSIG9mZnNldCwgZGVmYXVsdHMgdG8gMAorCWJsCWVsMl9zZXR1cAkJCS8vIERyb3AgdG8gRUwxLCB3MD1jcHVfYm9vdF9tb2RlCisJYWRycAl4MjMsIF9fUEhZU19PRkZTRVQKKwlhbmQJeDIzLCB4MjMsIE1JTl9LSU1HX0FMSUdOIC0gMQkvLyBLQVNMUiBvZmZzZXQsIGRlZmF1bHRzIHRvIDAKIAlibAlzZXRfY3B1X2Jvb3RfbW9kZV9mbGFnCi0JYmwJX19jcmVhdGVfcGFnZV90YWJsZXMJCS8vIHgyNT1UVEJSMCwgeDI2PVRUQlIxCisJYmwJX19jcmVhdGVfcGFnZV90YWJsZXMKIAkvKgogCSAqIFRoZSBmb2xsb3dpbmcgY2FsbHMgQ1BVIHNldHVwIGNvZGUsIHNlZSBhcmNoL2FybTY0L21tL3Byb2MuUyBmb3IKIAkgKiBkZXRhaWxzLgpAQCAtMjIyLDkgKzIzMiw3IEBACiAJICogdGhlIFRDUiB3aWxsIGhhdmUgYmVlbiBzZXQuCiAJICovCiAJYmwJX19jcHVfc2V0dXAJCQkvLyBpbml0aWFsaXNlIHByb2Nlc3NvcgotCWFkcl9sCXgyNywgX19wcmltYXJ5X3N3aXRjaAkJLy8gYWRkcmVzcyB0byBqdW1wIHRvIGFmdGVyCi0JCQkJCQkvLyBNTVUgaGFzIGJlZW4gZW5hYmxlZAotCWIJX19lbmFibGVfbW11CisJYglfX3ByaW1hcnlfc3dpdGNoCiBFTkRQUk9DKHN0ZXh0KQogCiAvKgpAQCAtMzExLDIzICszMTksMjEgQEAKICAqICAgICBiZWVuIGVuYWJsZWQKICAqLwogX19jcmVhdGVfcGFnZV90YWJsZXM6Ci0JYWRycAl4MjUsIGlkbWFwX3BnX2RpcgotCWFkcnAJeDI2LCBzd2FwcGVyX3BnX2RpcgogCW1vdgl4MjgsIGxyCiAKIAkvKgogCSAqIEludmFsaWRhdGUgdGhlIGlkbWFwIGFuZCBzd2FwcGVyIHBhZ2UgdGFibGVzIHRvIGF2b2lkIHBvdGVudGlhbAogCSAqIGRpcnR5IGNhY2hlIGxpbmVzIGJlaW5nIGV2aWN0ZWQuCiAJICovCi0JbW92CXgwLCB4MjUKLQlhZGQJeDEsIHgyNiwgI1NXQVBQRVJfRElSX1NJWkUKKwlhZHJwCXgwLCBpZG1hcF9wZ19kaXIKKwlhZHJwCXgxLCBzd2FwcGVyX3BnX2RpciArIFNXQVBQRVJfRElSX1NJWkUKIAlibAlfX2ludmFsX2NhY2hlX3JhbmdlCiAKIAkvKgogCSAqIENsZWFyIHRoZSBpZG1hcCBhbmQgc3dhcHBlciBwYWdlIHRhYmxlcy4KIAkgKi8KLQltb3YJeDAsIHgyNQotCWFkZAl4NiwgeDI2LCAjU1dBUFBFUl9ESVJfU0laRQorCWFkcnAJeDAsIGlkbWFwX3BnX2RpcgorCWFkcnAJeDYsIHN3YXBwZXJfcGdfZGlyICsgU1dBUFBFUl9ESVJfU0laRQogMToJc3RwCXh6ciwgeHpyLCBbeDBdLCAjMTYKIAlzdHAJeHpyLCB4enIsIFt4MF0sICMxNgogCXN0cAl4enIsIHh6ciwgW3gwXSwgIzE2CkBAIC0zNDAsNyArMzQ2LDcgQEAKIAkvKgogCSAqIENyZWF0ZSB0aGUgaWRlbnRpdHkgbWFwcGluZy4KIAkgKi8KLQltb3YJeDAsIHgyNQkJCQkvLyBpZG1hcF9wZ19kaXIKKwlhZHJwCXgwLCBpZG1hcF9wZ19kaXIKIAlhZHJwCXgzLCBfX2lkbWFwX3RleHRfc3RhcnQJCS8vIF9fcGEoX19pZG1hcF90ZXh0X3N0YXJ0KQogCiAjaWZuZGVmIENPTkZJR19BUk02NF9WQV9CSVRTXzQ4CkBAIC0zOTAsNyArMzk2LDcgQEAKIAkvKgogCSAqIE1hcCB0aGUga2VybmVsIGltYWdlIChzdGFydGluZyB3aXRoIFBIWVNfT0ZGU0VUKS4KIAkgKi8KLQltb3YJeDAsIHgyNgkJCQkvLyBzd2FwcGVyX3BnX2RpcgorCWFkcnAJeDAsIHN3YXBwZXJfcGdfZGlyCiAJbW92X3EJeDUsIEtJTUFHRV9WQUREUiArIFRFWFRfT0ZGU0VUCS8vIGNvbXBpbGUgdGltZSBfX3ZhKF90ZXh0KQogCWFkZAl4NSwgeDUsIHgyMwkJCS8vIGFkZCBLQVNMUiBkaXNwbGFjZW1lbnQKIAljcmVhdGVfcGdkX2VudHJ5IHgwLCB4NSwgeDMsIHg2CkBAIC00MDUsOCArNDExLDggQEAKIAkgKiBhY2Nlc3NlcyAoTU1VIGRpc2FibGVkKSwgaW52YWxpZGF0ZSB0aGUgaWRtYXAgYW5kIHN3YXBwZXIgcGFnZQogCSAqIHRhYmxlcyBhZ2FpbiB0byByZW1vdmUgYW55IHNwZWN1bGF0aXZlbHkgbG9hZGVkIGNhY2hlIGxpbmVzLgogCSAqLwotCW1vdgl4MCwgeDI1Ci0JYWRkCXgxLCB4MjYsICNTV0FQUEVSX0RJUl9TSVpFCisJYWRycAl4MCwgaWRtYXBfcGdfZGlyCisJYWRycAl4MSwgc3dhcHBlcl9wZ19kaXIgKyBTV0FQUEVSX0RJUl9TSVpFCiAJZG1iCXN5CiAJYmwJX19pbnZhbF9jYWNoZV9yYW5nZQogCkBAIC00MTYsMTQgKzQyMiwyNyBAQAogCiAvKgogICogVGhlIGZvbGxvd2luZyBmcmFnbWVudCBvZiBjb2RlIGlzIGV4ZWN1dGVkIHdpdGggdGhlIE1NVSBlbmFibGVkLgorICoKKyAqICAgeDAgPSBfX1BIWVNfT0ZGU0VUCiAgKi8KLQkuc2V0CWluaXRpYWxfc3AsIGluaXRfdGhyZWFkX3VuaW9uICsgVEhSRUFEX1NUQVJUX1NQCiBfX3ByaW1hcnlfc3dpdGNoZWQ6Ci0JbW92CXgyOCwgbHIJCQkJLy8gcHJlc2VydmUgTFIKKwlhZHJwCXg0LCBpbml0X3RocmVhZF91bmlvbgorCWFkZAlzcCwgeDQsICNUSFJFQURfU0laRQorCW1zcglzcF9lbDAsIHg0CQkJLy8gU2F2ZSB0aHJlYWRfaW5mbworCiAJYWRyX2wJeDgsIHZlY3RvcnMJCQkvLyBsb2FkIFZCQVJfRUwxIHdpdGggdmlydHVhbAogCW1zcgl2YmFyX2VsMSwgeDgJCQkvLyB2ZWN0b3IgdGFibGUgYWRkcmVzcwogCWlzYgogCisJc3RwCXh6ciwgeDMwLCBbc3AsICMtMTZdIQorCW1vdgl4MjksIHNwCisKKwlzdHJfbAl4MjEsIF9fZmR0X3BvaW50ZXIsIHg1CQkvLyBTYXZlIEZEVCBwb2ludGVyCisKKwlsZHJfbAl4NCwga2ltYWdlX3ZhZGRyCQkvLyBTYXZlIHRoZSBvZmZzZXQgYmV0d2VlbgorCXN1Ygl4NCwgeDQsIHgwCQkJLy8gdGhlIGtlcm5lbCB2aXJ0dWFsIGFuZAorCXN0cl9sCXg0LCBraW1hZ2Vfdm9mZnNldCwgeDUJCS8vIHBoeXNpY2FsIG1hcHBpbmdzCisKIAkvLyBDbGVhciBCU1MKIAlhZHJfbAl4MCwgX19ic3Nfc3RhcnQKIAltb3YJeDEsIHh6cgpAQCAtNDMyLDE3ICs0NTEsNiBAQAogCWJsCV9fcGlfbWVtc2V0CiAJZHNiCWlzaHN0CQkJCS8vIE1ha2UgemVybyBwYWdlIHZpc2libGUgdG8gUFRXCiAKLQlhZHJfbAlzcCwgaW5pdGlhbF9zcCwgeDQKLQltb3YJeDQsIHNwCi0JYW5kCXg0LCB4NCwgI34oVEhSRUFEX1NJWkUgLSAxKQotCW1zcglzcF9lbDAsIHg0CQkJLy8gU2F2ZSB0aHJlYWRfaW5mbwotCXN0cl9sCXgyMSwgX19mZHRfcG9pbnRlciwgeDUJCS8vIFNhdmUgRkRUIHBvaW50ZXIKLQotCWxkcl9sCXg0LCBraW1hZ2VfdmFkZHIJCS8vIFNhdmUgdGhlIG9mZnNldCBiZXR3ZWVuCi0Jc3ViCXg0LCB4NCwgeDI0CQkJLy8gdGhlIGtlcm5lbCB2aXJ0dWFsIGFuZAotCXN0cl9sCXg0LCBraW1hZ2Vfdm9mZnNldCwgeDUJCS8vIHBoeXNpY2FsIG1hcHBpbmdzCi0KLQltb3YJeDI5LCAjMAogI2lmZGVmIENPTkZJR19LQVNBTgogCWJsCWthc2FuX2Vhcmx5X2luaXQKICNlbmRpZgpAQCAtNDU0LDggKzQ2Miw4IEBACiAJYmwJa2FzbHJfZWFybHlfaW5pdAkJLy8gcGFyc2UgRkRUIGZvciBLQVNMUiBvcHRpb25zCiAJY2J6CXgwLCAwZgkJCQkvLyBLQVNMUiBkaXNhYmxlZD8ganVzdCBwcm9jZWVkCiAJb3JyCXgyMywgeDIzLCB4MAkJCS8vIHJlY29yZCBLQVNMUiBvZmZzZXQKLQlyZXQJeDI4CQkJCS8vIHdlIG11c3QgZW5hYmxlIEtBU0xSLCByZXR1cm4KLQkJCQkJCS8vIHRvIF9fZW5hYmxlX21tdSgpCisJbGRwCXgyOSwgeDMwLCBbc3BdLCAjMTYJCS8vIHdlIG11c3QgZW5hYmxlIEtBU0xSLCByZXR1cm4KKwlyZXQJCQkJCS8vIHRvIF9fcHJpbWFyeV9zd2l0Y2goKQogMDoKICNlbmRpZgogCWIJc3RhcnRfa2VybmVsCkBAIC00NjUsNyArNDczLDcgQEAKICAqIGVuZCBlYXJseSBoZWFkIHNlY3Rpb24sIGJlZ2luIGhlYWQgY29kZSB0aGF0IGlzIGFsc28gdXNlZCBmb3IKICAqIGhvdHBsdWcgYW5kIG5lZWRzIHRvIGhhdmUgdGhlIHNhbWUgcHJvdGVjdGlvbnMgYXMgdGhlIHRleHQgcmVnaW9uCiAgKi8KLQkuc2VjdGlvbiAiLnRleHQiLCJheCIKKwkuc2VjdGlvbiAiLmlkbWFwLnRleHQiLCJheCIKIAogRU5UUlkoa2ltYWdlX3ZhZGRyKQogCS5xdWFkCQlfdGV4dCAtIFRFWFRfT0ZGU0VUCkBAIC00OTAsNyArNDk4LDcgQEAKIENQVV9CRSgJb3JyCXgwLCB4MCwgIygzIDw8IDI0KQkpCS8vIFNldCB0aGUgRUUgYW5kIEUwRSBiaXRzIGZvciBFTDEKIENQVV9MRSgJYmljCXgwLCB4MCwgIygzIDw8IDI0KQkpCS8vIENsZWFyIHRoZSBFRSBhbmQgRTBFIGJpdHMgZm9yIEVMMQogCW1zcglzY3Rscl9lbDEsIHgwCi0JbW92CXcyMCwgI0JPT1RfQ1BVX01PREVfRUwxCQkvLyBUaGlzIGNwdSBib290ZWQgaW4gRUwxCisJbW92CXcwLCAjQk9PVF9DUFVfTU9ERV9FTDEJCS8vIFRoaXMgY3B1IGJvb3RlZCBpbiBFTDEKIAlpc2IKIAlyZXQKIApAQCAtNTg2LDcgKzU5NCw3IEBACiAKIAljYnoJeDIsIGluc3RhbGxfZWwyX3N0dWIKIAotCW1vdgl3MjAsICNCT09UX0NQVV9NT0RFX0VMMgkJLy8gVGhpcyBDUFUgYm9vdGVkIGluIEVMMgorCW1vdgl3MCwgI0JPT1RfQ1BVX01PREVfRUwyCQkvLyBUaGlzIENQVSBib290ZWQgaW4gRUwyCiAJaXNiCiAJcmV0CiAKQEAgLTYwMSw3ICs2MDksNyBAQAogCQkgICAgICBQU1JfTU9ERV9FTDFoKQogCW1zcglzcHNyX2VsMiwgeDAKIAltc3IJZWxyX2VsMiwgbHIKLQltb3YJdzIwLCAjQk9PVF9DUFVfTU9ERV9FTDIJCS8vIFRoaXMgQ1BVIGJvb3RlZCBpbiBFTDIKKwltb3YJdzAsICNCT09UX0NQVV9NT0RFX0VMMgkJLy8gVGhpcyBDUFUgYm9vdGVkIGluIEVMMgogCWVyZXQKIEVORFBST0MoZWwyX3NldHVwKQogCkBAIC02MTEsMjcgKzYxOSwzOSBAQAogICovCiBzZXRfY3B1X2Jvb3RfbW9kZV9mbGFnOgogCWFkcl9sCXgxLCBfX2Jvb3RfY3B1X21vZGUKLQljbXAJdzIwLCAjQk9PVF9DUFVfTU9ERV9FTDIKKwljbXAJdzAsICNCT09UX0NQVV9NT0RFX0VMMgogCWIubmUJMWYKIAlhZGQJeDEsIHgxLCAjNAotMToJc3RyCXcyMCwgW3gxXQkJCS8vIFRoaXMgQ1BVIGhhcyBib290ZWQgaW4gRUwxCisxOglzdHIJdzAsIFt4MV0JCQkvLyBUaGlzIENQVSBoYXMgYm9vdGVkIGluIEVMMQogCWRtYglzeQogCWRjCWl2YWMsIHgxCQkJLy8gSW52YWxpZGF0ZSBwb3RlbnRpYWxseSBzdGFsZSBjYWNoZSBsaW5lCiAJcmV0CiBFTkRQUk9DKHNldF9jcHVfYm9vdF9tb2RlX2ZsYWcpCiAKIC8qCisgKiBUaGVzZSB2YWx1ZXMgYXJlIHdyaXR0ZW4gd2l0aCB0aGUgTU1VIG9mZiwgYnV0IHJlYWQgd2l0aCB0aGUgTU1VIG9uLgorICogV3JpdGVycyB3aWxsIGludmFsaWRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgYWRkcmVzcywgZGlzY2FyZGluZyB1cCB0byBhCisgKiAnQ2FjaGUgV3JpdGViYWNrIEdyYW51bGUnIChDV0cpIHdvcnRoIG9mIGRhdGEuIFRoZSBsaW5rZXIgc2NyaXB0IGVuc3VyZXMKKyAqIHN1ZmZpY2llbnQgYWxpZ25tZW50IHRoYXQgdGhlIENXRyBkb2Vzbid0IG92ZXJsYXAgYW5vdGhlciBzZWN0aW9uLgorICovCisJLnB1c2hzZWN0aW9uICIubW11b2ZmLmRhdGEud3JpdGUiLCAiYXciCisvKgogICogV2UgbmVlZCB0byBmaW5kIG91dCB0aGUgQ1BVIGJvb3QgbW9kZSBsb25nIGFmdGVyIGJvb3QsIHNvIHdlIG5lZWQgdG8KICAqIHN0b3JlIGl0IGluIGEgd3JpdGFibGUgdmFyaWFibGUuCiAgKgogICogVGhpcyBpcyBub3QgaW4gLmJzcywgYmVjYXVzZSB3ZSBzZXQgaXQgc3VmZmljaWVudGx5IGVhcmx5IHRoYXQgdGhlIGJvb3QtdGltZQogICogemVyb2luZyBvZiAuYnNzIHdvdWxkIGNsb2JiZXIgaXQuCiAgKi8KLQkucHVzaHNlY3Rpb24JLmRhdGEuLmNhY2hlbGluZV9hbGlnbmVkCi0JLmFsaWduCUwxX0NBQ0hFX1NISUZUCiBFTlRSWShfX2Jvb3RfY3B1X21vZGUpCiAJLmxvbmcJQk9PVF9DUFVfTU9ERV9FTDIKIAkubG9uZwlCT09UX0NQVV9NT0RFX0VMMQorLyoKKyAqIFRoZSBib290aW5nIENQVSB1cGRhdGVzIHRoZSBmYWlsZWQgc3RhdHVzIEBfX2Vhcmx5X2NwdV9ib290X3N0YXR1cywKKyAqIHdpdGggTU1VIHR1cm5lZCBvZmYuCisgKi8KK0VOVFJZKF9fZWFybHlfY3B1X2Jvb3Rfc3RhdHVzKQorCS5sb25nIAkwCisKIAkucG9wc2VjdGlvbgogCiAJLyoKQEAgLTYzOSw3ICs2NTksNyBAQAogCSAqIGNvcmVzIGFyZSBoZWxkIHVudGlsIHdlJ3JlIHJlYWR5IGZvciB0aGVtIHRvIGluaXRpYWxpc2UuCiAJICovCiBFTlRSWShzZWNvbmRhcnlfaG9sZGluZ19wZW4pCi0JYmwJZWwyX3NldHVwCQkJLy8gRHJvcCB0byBFTDEsIHcyMD1jcHVfYm9vdF9tb2RlCisJYmwJZWwyX3NldHVwCQkJLy8gRHJvcCB0byBFTDEsIHcwPWNwdV9ib290X21vZGUKIAlibAlzZXRfY3B1X2Jvb3RfbW9kZV9mbGFnCiAJbXJzCXgwLCBtcGlkcl9lbDEKIAltb3ZfcQl4MSwgTVBJRFJfSFdJRF9CSVRNQVNLCkBAIC02NjYsMTIgKzY4NiwxMCBAQAogCS8qCiAJICogQ29tbW9uIGVudHJ5IHBvaW50IGZvciBzZWNvbmRhcnkgQ1BVcy4KIAkgKi8KLQlhZHJwCXgyNSwgaWRtYXBfcGdfZGlyCi0JYWRycAl4MjYsIHN3YXBwZXJfcGdfZGlyCiAJYmwJX19jcHVfc2V0dXAJCQkvLyBpbml0aWFsaXNlIHByb2Nlc3NvcgotCi0JYWRyX2wJeDI3LCBfX3NlY29uZGFyeV9zd2l0Y2gJCS8vIGFkZHJlc3MgdG8ganVtcCB0byBhZnRlciBlbmFibGluZyB0aGUgTU1VCi0JYglfX2VuYWJsZV9tbXUKKwlibAlfX2VuYWJsZV9tbXUKKwlsZHIJeDgsID1fX3NlY29uZGFyeV9zd2l0Y2hlZAorCWJyCXg4CiBFTkRQUk9DKHNlY29uZGFyeV9zdGFydHVwKQogCiBfX3NlY29uZGFyeV9zd2l0Y2hlZDoKQEAgLTcwNiwzMyArNzI0LDI3IEBACiAJZGMJaXZhYywgXHRtcDEJCQkvLyBJbnZhbGlkYXRlIHBvdGVudGlhbGx5IHN0YWxlIGNhY2hlIGxpbmUKIAkuZW5kbQogCi0JLnB1c2hzZWN0aW9uCS5kYXRhLi5jYWNoZWxpbmVfYWxpZ25lZAotCS5hbGlnbglMMV9DQUNIRV9TSElGVAotRU5UUlkoX19lYXJseV9jcHVfYm9vdF9zdGF0dXMpCi0JLmxvbmcgCTAKLQkucG9wc2VjdGlvbgotCiAvKgogICogRW5hYmxlIHRoZSBNTVUuCiAgKgogICogIHgwICA9IFNDVExSX0VMMSB2YWx1ZSBmb3IgdHVybmluZyBvbiB0aGUgTU1VLgotICogIHgyNyA9ICp2aXJ0dWFsKiBhZGRyZXNzIHRvIGp1bXAgdG8gdXBvbiBjb21wbGV0aW9uCiAgKgotICogT3RoZXIgcmVnaXN0ZXJzIGRlcGVuZCBvbiB0aGUgZnVuY3Rpb24gY2FsbGVkIHVwb24gY29tcGxldGlvbi4KKyAqIFJldHVybnMgdG8gdGhlIGNhbGxlciB2aWEgeDMwL2xyLiBUaGlzIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYmUgY292ZXJlZAorICogYnkgdGhlIC5pZG1hcC50ZXh0IHNlY3Rpb24uCiAgKgogICogQ2hlY2tzIGlmIHRoZSBzZWxlY3RlZCBncmFudWxlIHNpemUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBDUFUuCiAgKiBJZiBpdCBpc24ndCwgcGFyayB0aGUgQ1BVCiAgKi8KLQkuc2VjdGlvbgkiLmlkbWFwLnRleHQiLCAiYXgiCiBFTlRSWShfX2VuYWJsZV9tbXUpCi0JbXJzCXgyMiwgc2N0bHJfZWwxCQkJLy8gcHJlc2VydmUgb2xkIFNDVExSX0VMMSB2YWx1ZQogCW1ycwl4MSwgSURfQUE2NE1NRlIwX0VMMQogCXViZngJeDIsIHgxLCAjSURfQUE2NE1NRlIwX1RHUkFOX1NISUZULCA0CiAJY21wCXgyLCAjSURfQUE2NE1NRlIwX1RHUkFOX1NVUFBPUlRFRAogCWIubmUJX19ub19ncmFudWxlX3N1cHBvcnQKIAl1cGRhdGVfZWFybHlfY3B1X2Jvb3Rfc3RhdHVzIDAsIHgxLCB4MgotCW1zcgl0dGJyMF9lbDEsIHgyNQkJCS8vIGxvYWQgVFRCUjAKLQltc3IJdHRicjFfZWwxLCB4MjYJCQkvLyBsb2FkIFRUQlIxCisJYWRycAl4MSwgaWRtYXBfcGdfZGlyCisJYWRycAl4Miwgc3dhcHBlcl9wZ19kaXIKKwltc3IJdHRicjBfZWwxLCB4MQkJCS8vIGxvYWQgVFRCUjAKKwltc3IJdHRicjFfZWwxLCB4MgkJCS8vIGxvYWQgVFRCUjEKIAlpc2IKIAltc3IJc2N0bHJfZWwxLCB4MAogCWlzYgpAQCAtNzQ0LDI5ICs3NTYsNyBAQAogCWljCWlhbGx1CiAJZHNiCW5zaAogCWlzYgotI2lmZGVmIENPTkZJR19SQU5ET01JWkVfQkFTRQotCW1vdgl4MTksIHgwCQkJCS8vIHByZXNlcnZlIG5ldyBTQ1RMUl9FTDEgdmFsdWUKLQlibHIJeDI3Ci0KLQkvKgotCSAqIElmIHdlIHJldHVybiBoZXJlLCB3ZSBoYXZlIGEgS0FTTFIgZGlzcGxhY2VtZW50IGluIHgyMyB3aGljaCB3ZSBuZWVkCi0JICogdG8gdGFrZSBpbnRvIGFjY291bnQgYnkgZGlzY2FyZGluZyB0aGUgY3VycmVudCBrZXJuZWwgbWFwcGluZyBhbmQKLQkgKiBjcmVhdGluZyBhIG5ldyBvbmUuCi0JICovCi0JbXNyCXNjdGxyX2VsMSwgeDIyCQkJLy8gZGlzYWJsZSB0aGUgTU1VCi0JaXNiCi0JYmwJX19jcmVhdGVfcGFnZV90YWJsZXMJCS8vIHJlY3JlYXRlIGtlcm5lbCBtYXBwaW5nCi0KLQl0bGJpCXZtYWxsZTEJCQkJLy8gUmVtb3ZlIGFueSBzdGFsZSBUTEIgZW50cmllcwotCWRzYgluc2gKLQotCW1zcglzY3Rscl9lbDEsIHgxOQkJCS8vIHJlLWVuYWJsZSB0aGUgTU1VCi0JaXNiCi0JaWMJaWFsbHUJCQkJLy8gZmx1c2ggaW5zdHJ1Y3Rpb25zIGZldGNoZWQKLQlkc2IJbnNoCQkJCS8vIHZpYSBvbGQgbWFwcGluZwotCWlzYgotI2VuZGlmCi0JYnIJeDI3CisJcmV0CiBFTkRQUk9DKF9fZW5hYmxlX21tdSkKIAogX19ub19ncmFudWxlX3N1cHBvcnQ6CkBAIC03NzUsMTEgKzc2NSwxMSBAQAogMToKIAl3ZmUKIAl3ZmkKLQliIDFiCisJYgkxYgogRU5EUFJPQyhfX25vX2dyYW51bGVfc3VwcG9ydCkKIAotX19wcmltYXJ5X3N3aXRjaDoKICNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKK19fcmVsb2NhdGVfa2VybmVsOgogCS8qCiAJICogSXRlcmF0ZSBvdmVyIGVhY2ggZW50cnkgaW4gdGhlIHJlbG9jYXRpb24gdGFibGUsIGFuZCBhcHBseSB0aGUKIAkgKiByZWxvY2F0aW9ucyBpbiBwbGFjZS4KQEAgLTgwMSwxNCArNzkxLDQ2IEBACiAJYWRkCXgxMywgeDEzLCB4MjMJCQkvLyByZWxvY2F0ZQogCXN0cgl4MTMsIFt4MTEsIHgyM10KIAliCTBiCisxOglyZXQKK0VORFBST0MoX19yZWxvY2F0ZV9rZXJuZWwpCisjZW5kaWYKIAotMToKK19fcHJpbWFyeV9zd2l0Y2g6CisjaWZkZWYgQ09ORklHX1JBTkRPTUlaRV9CQVNFCisJbW92CXgxOSwgeDAJCQkJLy8gcHJlc2VydmUgbmV3IFNDVExSX0VMMSB2YWx1ZQorCW1ycwl4MjAsIHNjdGxyX2VsMQkJCS8vIHByZXNlcnZlIG9sZCBTQ1RMUl9FTDEgdmFsdWUKKyNlbmRpZgorCisJYmwJX19lbmFibGVfbW11CisjaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCisJYmwJX19yZWxvY2F0ZV9rZXJuZWwKKyNpZmRlZiBDT05GSUdfUkFORE9NSVpFX0JBU0UKKwlsZHIJeDgsID1fX3ByaW1hcnlfc3dpdGNoZWQKKwlhZHJwCXgwLCBfX1BIWVNfT0ZGU0VUCisJYmxyCXg4CisKKwkvKgorCSAqIElmIHdlIHJldHVybiBoZXJlLCB3ZSBoYXZlIGEgS0FTTFIgZGlzcGxhY2VtZW50IGluIHgyMyB3aGljaCB3ZSBuZWVkCisJICogdG8gdGFrZSBpbnRvIGFjY291bnQgYnkgZGlzY2FyZGluZyB0aGUgY3VycmVudCBrZXJuZWwgbWFwcGluZyBhbmQKKwkgKiBjcmVhdGluZyBhIG5ldyBvbmUuCisJICovCisJbXNyCXNjdGxyX2VsMSwgeDIwCQkJLy8gZGlzYWJsZSB0aGUgTU1VCisJaXNiCisJYmwJX19jcmVhdGVfcGFnZV90YWJsZXMJCS8vIHJlY3JlYXRlIGtlcm5lbCBtYXBwaW5nCisKKwl0bGJpCXZtYWxsZTEJCQkJLy8gUmVtb3ZlIGFueSBzdGFsZSBUTEIgZW50cmllcworCWRzYgluc2gKKworCW1zcglzY3Rscl9lbDEsIHgxOQkJCS8vIHJlLWVuYWJsZSB0aGUgTU1VCisJaXNiCisJaWMJaWFsbHUJCQkJLy8gZmx1c2ggaW5zdHJ1Y3Rpb25zIGZldGNoZWQKKwlkc2IJbnNoCQkJCS8vIHZpYSBvbGQgbWFwcGluZworCWlzYgorCisJYmwJX19yZWxvY2F0ZV9rZXJuZWwKKyNlbmRpZgogI2VuZGlmCiAJbGRyCXg4LCA9X19wcmltYXJ5X3N3aXRjaGVkCisJYWRycAl4MCwgX19QSFlTX09GRlNFVAogCWJyCXg4CiBFTkRQUk9DKF9fcHJpbWFyeV9zd2l0Y2gpCi0KLV9fc2Vjb25kYXJ5X3N3aXRjaDoKLQlsZHIJeDgsID1fX3NlY29uZGFyeV9zd2l0Y2hlZAotCWJyCXg4Ci1FTkRQUk9DKF9fc2Vjb25kYXJ5X3N3aXRjaCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS1hc20uUyBiL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS1hc20uUwppbmRleCA0NmYyOWI2Li5lNTZkODQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9oaWJlcm5hdGUtYXNtLlMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvaGliZXJuYXRlLWFzbS5TCkBAIC0zNiw4ICszNiw4IEBACiAubWFjcm8gYnJlYWtfYmVmb3JlX21ha2VfdHRicl9zd2l0Y2ggemVyb19wYWdlLCBwYWdlX3RhYmxlCiAJbXNyCXR0YnIxX2VsMSwgXHplcm9fcGFnZQogCWlzYgotCXRsYmkJdm1hbGxlMWlzCi0JZHNiCWlzaAorCXRsYmkJdm1hbGxlMQorCWRzYgluc2gKIAltc3IJdHRicjFfZWwxLCBccGFnZV90YWJsZQogCWlzYgogLmVuZG0KQEAgLTk2LDcgKzk2LDcgQEAKIAogCWFkZAl4MSwgeDEwLCAjUEFHRV9TSVpFCiAJLyogQ2xlYW4gdGhlIGNvcGllZCBwYWdlIHRvIFBvVSAtIGJhc2VkIG9uIGZsdXNoX2ljYWNoZV9yYW5nZSgpICovCi0JZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKKwlyYXdfZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKIAlzdWIJeDMsIHgyLCAjMQogCWJpYwl4NCwgeDEwLCB4MwogMjoJZGMJY3ZhdSwgeDQJLyogY2xlYW4gRCBsaW5lIC8gdW5pZmllZCBsaW5lICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9oaWJlcm5hdGUuYyBiL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS5jCmluZGV4IDY1ZDgxZjkuLmQ1NWE3YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2hpYmVybmF0ZS5jCkBAIC0xNSw5ICsxNSw5IEBACiAgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKICAqLwogI2RlZmluZSBwcl9mbXQoeCkgImhpYmVybmF0ZTogIiB4CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+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+bWFjaGluZSwgRUxGX1BMQVRGT1JNKTsKKwlzcHJpbnRmKGluaXRfdXRzbmFtZSgpLT5tYWNoaW5lLCBVVFNfTUFDSElORSk7CiAJaW5pdF9tbS5zdGFydF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpIF90ZXh0OwogCWluaXRfbW0uZW5kX2NvZGUgICA9ICh1bnNpZ25lZCBsb25nKSBfZXRleHQ7CiAJaW5pdF9tbS5lbmRfZGF0YSAgID0gKHVuc2lnbmVkIGxvbmcpIF9lZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9hcm02NC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYThlYWZkYi4uNDA0ZGQ2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc2lnbmFsLmMKQEAgLTQwMiwxNSArNDAyLDMxIEBACiBhc21saW5rYWdlIHZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJCQkgdW5zaWduZWQgaW50IHRocmVhZF9mbGFncykKIHsKLQlpZiAodGhyZWFkX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQotCQlkb19zaWduYWwocmVncyk7CisJLyoKKwkgKiBUaGUgYXNzZW1ibHkgY29kZSBlbnRlcnMgdXMgd2l0aCBJUlFzIG9mZiwgYnV0IGl0IGhhc24ndAorCSAqIGluZm9ybWVkIHRoZSB0cmFjaW5nIGNvZGUgb2YgdGhhdCBmb3IgZWZmaWNpZW5jeSByZWFzb25zLgorCSAqIFVwZGF0ZSB0aGUgdHJhY2UgY29kZSB3aXRoIHRoZSBjdXJyZW50IHN0YXR1cy4KKwkgKi8KKwl0cmFjZV9oYXJkaXJxc19vZmYoKTsKKwlkbyB7CisJCWlmICh0aHJlYWRfZmxhZ3MgJiBfVElGX05FRURfUkVTQ0hFRCkgeworCQkJc2NoZWR1bGUoKTsKKwkJfSBlbHNlIHsKKwkJCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCWlmICh0aHJlYWRfZmxhZ3MgJiBfVElGX05PVElGWV9SRVNVTUUpIHsKLQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05PVElGWV9SRVNVTUUpOwotCQl0cmFjZWhvb2tfbm90aWZ5X3Jlc3VtZShyZWdzKTsKLQl9CisJCQlpZiAodGhyZWFkX2ZsYWdzICYgX1RJRl9TSUdQRU5ESU5HKQorCQkJCWRvX3NpZ25hbChyZWdzKTsKIAotCWlmICh0aHJlYWRfZmxhZ3MgJiBfVElGX0ZPUkVJR05fRlBTVEFURSkKLQkJZnBzaW1kX3Jlc3RvcmVfY3VycmVudF9zdGF0ZSgpOworCQkJaWYgKHRocmVhZF9mbGFncyAmIF9USUZfTk9USUZZX1JFU1VNRSkgeworCQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9OT1RJRllfUkVTVU1FKTsKKwkJCQl0cmFjZWhvb2tfbm90aWZ5X3Jlc3VtZShyZWdzKTsKKwkJCX0KIAorCQkJaWYgKHRocmVhZF9mbGFncyAmIF9USUZfRk9SRUlHTl9GUFNUQVRFKQorCQkJCWZwc2ltZF9yZXN0b3JlX2N1cnJlbnRfc3RhdGUoKTsKKwkJfQorCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCXRocmVhZF9mbGFncyA9IFJFQURfT05DRShjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKTsKKwl9IHdoaWxlICh0aHJlYWRfZmxhZ3MgJiBfVElGX1dPUktfTUFTSyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zbGVlcC5TIGIvYXJjaC9hcm02NC9rZXJuZWwvc2xlZXAuUwppbmRleCBjY2Y3OWQ4Li5iODc5OWU3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9zbGVlcC5TCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3NsZWVwLlMKQEAgLTczLDEwICs3Myw5IEBACiAJc3RyCXgyLCBbeDAsICNTTEVFUF9TVEFDS19EQVRBX1NZU1RFTV9SRUdTICsgQ1BVX0NUWF9TUF0KIAogCS8qIGZpbmQgdGhlIG1waWRyX2hhc2ggKi8KLQlsZHIJeDEsID1zbGVlcF9zYXZlX3N0YXNoCi0JbGRyCXgxLCBbeDFdCisJbGRyX2wJeDEsIHNsZWVwX3NhdmVfc3Rhc2gKIAltcnMJeDcsIG1waWRyX2VsMQotCWxkcgl4OSwgPW1waWRyX2hhc2gKKwlhZHJfbAl4OSwgbXBpZHJfaGFzaAogCWxkcgl4MTAsIFt4OSwgI01QSURSX0hBU0hfTUFTS10KIAkvKgogCSAqIEZvbGxvd2luZyBjb2RlIHJlbGllcyBvbiB0aGUgc3RydWN0IG1waWRyX2hhc2gKQEAgLTk1LDM2ICs5NCwzMCBAQAogCW1vdgl4MCwgIzEKIAlyZXQKIEVORFBST0MoX19jcHVfc3VzcGVuZF9lbnRlcikKLQkubHRvcmcKIAorCS5wdXNoc2VjdGlvbiAiLmlkbWFwLnRleHQiLCAiYXgiCiBFTlRSWShjcHVfcmVzdW1lKQogCWJsCWVsMl9zZXR1cAkJLy8gaWYgaW4gRUwyIGRyb3AgdG8gRUwxIGNsZWFubHkKKwlibAlfX2NwdV9zZXR1cAogCS8qIGVuYWJsZSB0aGUgTU1VIGVhcmx5IC0gc28gd2UgY2FuIGFjY2VzcyBzbGVlcF9zYXZlX3N0YXNoIGJ5IHZhICovCi0JYWRyX2wJbHIsIF9fZW5hYmxlX21tdQkvKiBfX2NwdV9zZXR1cCB3aWxsIHJldHVybiBoZXJlICovCi0JYWRyX2wJeDI3LCBfcmVzdW1lX3N3aXRjaGVkCS8qIF9fZW5hYmxlX21tdSB3aWxsIGJyYW5jaCBoZXJlICovCi0JYWRycAl4MjUsIGlkbWFwX3BnX2RpcgotCWFkcnAJeDI2LCBzd2FwcGVyX3BnX2RpcgotCWIJX19jcHVfc2V0dXAKLUVORFBST0MoY3B1X3Jlc3VtZSkKLQotCS5wdXNoc2VjdGlvbgkiLmlkbWFwLnRleHQiLCAiYXgiCi1fcmVzdW1lX3N3aXRjaGVkOgorCWJsCV9fZW5hYmxlX21tdQogCWxkcgl4OCwgPV9jcHVfcmVzdW1lCiAJYnIJeDgKLUVORFBST0MoX3Jlc3VtZV9zd2l0Y2hlZCkKK0VORFBST0MoY3B1X3Jlc3VtZSkKIAkubHRvcmcKIAkucG9wc2VjdGlvbgogCiBFTlRSWShfY3B1X3Jlc3VtZSkKIAltcnMJeDEsIG1waWRyX2VsMQotCWFkcnAJeDgsIG1waWRyX2hhc2gKLQlhZGQgeDgsIHg4LCAjOmxvMTI6bXBpZHJfaGFzaCAvLyB4OCA9IHN0cnVjdCBtcGlkcl9oYXNoIHBoeXMgYWRkcmVzcwotICAgICAgICAvKiByZXRyaWV2ZSBtcGlkcl9oYXNoIG1lbWJlcnMgdG8gY29tcHV0ZSB0aGUgaGFzaCAqLworCWFkcl9sCXg4LCBtcGlkcl9oYXNoCQkvLyB4OCA9IHN0cnVjdCBtcGlkcl9oYXNoIHZpcnQgYWRkcmVzcworCisJLyogcmV0cmlldmUgbXBpZHJfaGFzaCBtZW1iZXJzIHRvIGNvbXB1dGUgdGhlIGhhc2ggKi8KIAlsZHIJeDIsIFt4OCwgI01QSURSX0hBU0hfTUFTS10KIAlsZHAJdzMsIHc0LCBbeDgsICNNUElEUl9IQVNIX1NISUZUU10KIAlsZHAJdzUsIHc2LCBbeDgsICMoTVBJRFJfSEFTSF9TSElGVFMgKyA4KV0KIAljb21wdXRlX21waWRyX2hhc2ggeDcsIHgzLCB4NCwgeDUsIHg2LCB4MSwgeDIKLSAgICAgICAgLyogeDcgY29udGFpbnMgaGFzaCBpbmRleCwgbGV0J3MgdXNlIGl0IHRvIGdyYWIgY29udGV4dCBwb2ludGVyICovCisKKwkvKiB4NyBjb250YWlucyBoYXNoIGluZGV4LCBsZXQncyB1c2UgaXQgdG8gZ3JhYiBjb250ZXh0IHBvaW50ZXIgKi8KIAlsZHJfbAl4MCwgc2xlZXBfc2F2ZV9zdGFzaAogCWxkcgl4MCwgW3gwLCB4NywgbHNsICMzXQogCWFkZAl4MjksIHgwLCAjU0xFRVBfU1RBQ0tfREFUQV9DQUxMRUVfUkVHUwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvc21wLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zbXAuYwppbmRleCBkOTNkNDMzLi5kM2YxNTFjIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9zbXAuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9zbXAuYwpAQCAtMjAxLDEyICsyMDEsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHNtcF9zdG9yZV9jcHVfaW5mbyh1bnNpZ25lZCBpbnQgY3B1aWQpCi17Ci0Jc3RvcmVfY3B1X3RvcG9sb2d5KGNwdWlkKTsKLQludW1hX3N0b3JlX2NwdV9pbmZvKGNwdWlkKTsKLX0KLQogLyoKICAqIFRoaXMgaXMgdGhlIHNlY29uZGFyeSBDUFUgYm9vdCBlbnRyeS4gIFdlJ3JlIHVzaW5nIHRoaXMgQ1BVcwogICogaWRsZSB0aHJlYWQgc3RhY2ssIGJ1dCBhIHNldCBvZiB0ZW1wb3JhcnkgcGFnZSB0YWJsZXMuCkBAIC0yMzksNyArMjMzLDcgQEAKIAkgKiB0aGlzIENQVSB0aWNrcyBhbGwgb2YgdGhvc2UuIElmIGl0IGRvZXNuJ3QsIHRoZSBDUFUgd2lsbAogCSAqIGZhaWwgdG8gY29tZSBvbmxpbmUuCiAJICovCi0JdmVyaWZ5X2xvY2FsX2NwdV9jYXBhYmlsaXRpZXMoKTsKKwljaGVja19sb2NhbF9jcHVfY2FwYWJpbGl0aWVzKCk7CiAKIAlpZiAoY3B1X29wc1tjcHVdLT5jcHVfcG9zdGJvb3QpCiAJCWNwdV9vcHNbY3B1XS0+Y3B1X3Bvc3Rib290KCk7CkBAIC0yNTQsNyArMjQ4LDcgQEAKIAkgKi8KIAlub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdSk7CiAKLQlzbXBfc3RvcmVfY3B1X2luZm8oY3B1KTsKKwlzdG9yZV9jcHVfdG9wb2xvZ3koY3B1KTsKIAogCS8qCiAJICogT0ssIG5vdyBpdCdzIHNhZmUgdG8gbGV0IHRoZSBib290IENQVSBjb250aW51ZS4gIFdhaXQgZm9yCkBAIC00MzcsOCArNDMxLDE5IEBACiB2b2lkIF9faW5pdCBzbXBfcHJlcGFyZV9ib290X2NwdSh2b2lkKQogewogCXNldF9teV9jcHVfb2Zmc2V0KHBlcl9jcHVfb2Zmc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSkpOworCS8qCisJICogSW5pdGlhbGlzZSB0aGUgc3RhdGljIGtleXMgZWFybHkgYXMgdGhleSBtYXkgYmUgZW5hYmxlZCBieSB0aGUKKwkgKiBjcHVmZWF0dXJlIGNvZGUuCisJICovCisJanVtcF9sYWJlbF9pbml0KCk7CiAJY3B1aW5mb19zdG9yZV9ib290X2NwdSgpOwogCXNhdmVfYm9vdF9jcHVfcnVuX2VsKCk7CisJLyoKKwkgKiBSdW4gdGhlIGVycmF0YSB3b3JrIGFyb3VuZCBjaGVja3Mgb24gdGhlIGJvb3QgQ1BVLCBvbmNlIHdlIGhhdmUKKwkgKiBpbml0aWFsaXNlZCB0aGUgY3B1IGZlYXR1cmUgaW5mcmFzdHJ1Y3R1cmUgZnJvbQorCSAqIGNwdWluZm9fc3RvcmVfYm9vdF9jcHUoKSBhYm92ZS4KKwkgKi8KKwl1cGRhdGVfY3B1X2VycmF0YV93b3JrYXJvdW5kcygpOwogfQogCiBzdGF0aWMgdTY0IF9faW5pdCBvZl9nZXRfY3B1X21waWRyKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4pCkBAIC02MTksNiArNjI0LDcgQEAKIAkJCX0KIAogCQkJYm9vdGNwdV92YWxpZCA9IHRydWU7CisJCQllYXJseV9tYXBfY3B1X3RvX25vZGUoMCwgb2Zfbm9kZV90b19uaWQoZG4pKTsKIAogCQkJLyoKIAkJCSAqIGNwdV9sb2dpY2FsX21hcCBoYXMgYWxyZWFkeSBiZWVuCkBAIC02ODksMTAgKzY5NSwxMyBAQAogewogCWludCBlcnI7CiAJdW5zaWduZWQgaW50IGNwdTsKKwl1bnNpZ25lZCBpbnQgdGhpc19jcHU7CiAKIAlpbml0X2NwdV90b3BvbG9neSgpOwogCi0Jc21wX3N0b3JlX2NwdV9pbmZvKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RvcmVfY3B1X3RvcG9sb2d5KHRoaXNfY3B1KTsKKwludW1hX3N0b3JlX2NwdV9pbmZvKHRoaXNfY3B1KTsKIAogCS8qCiAJICogSWYgVVAgaXMgbWFuZGF0ZWQgYnkgIm5vc21wIiAod2hpY2ggaW1wbGllcyAibWF4Y3B1cz0wIiksIGRvbid0IHNldApAQCAtNzE5LDYgKzcyOCw3IEBACiAJCQljb250aW51ZTsKIAogCQlzZXRfY3B1X3ByZXNlbnQoY3B1LCB0cnVlKTsKKwkJbnVtYV9zdG9yZV9jcHVfaW5mbyhjcHUpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvc21wX3NwaW5fdGFibGUuYyBiL2FyY2gvYXJtNjQva2VybmVsL3NtcF9zcGluX3RhYmxlLmMKaW5kZXggMThhNzFiYy4uOWEwMGVlZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc21wX3NwaW5fdGFibGUuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC9zbXBfc3Bpbl90YWJsZS5jCkBAIC0yOSw3ICsyOSw4IEBACiAjaW5jbHVkZSA8YXNtL3NtcF9wbGF0Lmg+CiAKIGV4dGVybiB2b2lkIHNlY29uZGFyeV9ob2xkaW5nX3Blbih2b2lkKTsKLXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgc2Vjb25kYXJ5X2hvbGRpbmdfcGVuX3JlbGVhc2UgPSBJTlZBTElEX0hXSUQ7Cit2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9fc2VjdGlvbigiLm1tdW9mZi5kYXRhLnJlYWQiKQorc2Vjb25kYXJ5X2hvbGRpbmdfcGVuX3JlbGVhc2UgPSBJTlZBTElEX0hXSUQ7CiAKIHN0YXRpYyBwaHlzX2FkZHJfdCBjcHVfcmVsZWFzZV9hZGRyW05SX0NQVVNdOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zdGFja3RyYWNlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggZDk3NTFhNC4uYzJlZmRkZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc3RhY2t0cmFjZS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3N0YWNrdHJhY2UuYwpAQCAtNDMsNiArNDMsOSBAQAogCXVuc2lnbmVkIGxvbmcgZnAgPSBmcmFtZS0+ZnA7CiAJdW5zaWduZWQgbG9uZyBpcnFfc3RhY2tfcHRyOwogCisJaWYgKCF0c2spCisJCXRzayA9IGN1cnJlbnQ7CisKIAkvKgogCSAqIFN3aXRjaGluZyBiZXR3ZWVuIHN0YWNrcyBpcyB2YWxpZCB3aGVuIHRyYWNpbmcgY3VycmVudCBhbmQgaW4KIAkgKiBub24tcHJlZW1wdGlibGUgY29udGV4dC4KQEAgLTY3LDcgKzcwLDcgQEAKIAlmcmFtZS0+cGMgPSBSRUFEX09OQ0VfTk9DSEVDSygqKHVuc2lnbmVkIGxvbmcgKikoZnAgKyA4KSk7CiAKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCi0JaWYgKHRzayAmJiB0c2stPnJldF9zdGFjayAmJgorCWlmICh0c2stPnJldF9zdGFjayAmJgogCQkJKGZyYW1lLT5wYyA9PSAodW5zaWduZWQgbG9uZylyZXR1cm5fdG9faGFuZGxlcikpIHsKIAkJLyoKIAkJICogVGhpcyBpcyBhIGNhc2Ugd2hlcmUgZnVuY3Rpb24gZ3JhcGggdHJhY2VyIGhhcwpAQCAtMTUyLDYgKzE1NSwyNyBAQAogCXJldHVybiB0cmFjZS0+bnJfZW50cmllcyA+PSB0cmFjZS0+bWF4X2VudHJpZXM7CiB9CiAKK3ZvaWQgc2F2ZV9zdGFja190cmFjZV9yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQoreworCXN0cnVjdCBzdGFja190cmFjZV9kYXRhIGRhdGE7CisJc3RydWN0IHN0YWNrZnJhbWUgZnJhbWU7CisKKwlkYXRhLnRyYWNlID0gdHJhY2U7CisJZGF0YS5za2lwID0gdHJhY2UtPnNraXA7CisJZGF0YS5ub19zY2hlZF9mdW5jdGlvbnMgPSAwOworCisJZnJhbWUuZnAgPSByZWdzLT5yZWdzWzI5XTsKKwlmcmFtZS5zcCA9IHJlZ3MtPnNwOworCWZyYW1lLnBjID0gcmVncy0+cGM7CisjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgorCWZyYW1lLmdyYXBoID0gY3VycmVudC0+Y3Vycl9yZXRfc3RhY2s7CisjZW5kaWYKKworCXdhbGtfc3RhY2tmcmFtZShjdXJyZW50LCAmZnJhbWUsIHNhdmVfdHJhY2UsICZkYXRhKTsKKwlpZiAodHJhY2UtPm5yX2VudHJpZXMgPCB0cmFjZS0+bWF4X2VudHJpZXMpCisJCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gVUxPTkdfTUFYOworfQorCiB2b2lkIHNhdmVfc3RhY2tfdHJhY2VfdHNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQogewogCXN0cnVjdCBzdGFja190cmFjZV9kYXRhIGRhdGE7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zdXNwZW5kLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9zdXNwZW5kLmMKaW5kZXggYjYxNmUzNi4uYWQ3MzQxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc3VzcGVuZC5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3N1c3BlbmQuYwpAQCAtMjMsOCArMjMsOCBAQAogICogdGltZSB0aGUgbm90aWZpZXIgcnVucyBkZWJ1ZyBleGNlcHRpb25zIG1pZ2h0IGhhdmUgYmVlbiBlbmFibGVkIGFscmVhZHksCiAgKiB3aXRoIEhXIGJyZWFrcG9pbnRzIHJlZ2lzdGVycyBjb250ZW50IHN0aWxsIGluIGFuIHVua25vd24gc3RhdGUuCiAgKi8KLXN0YXRpYyB2b2lkICgqaHdfYnJlYWtwb2ludF9yZXN0b3JlKSh2b2lkICopOwotdm9pZCBfX2luaXQgY3B1X3N1c3BlbmRfc2V0X2RiZ19yZXN0b3Jlcih2b2lkICgqaHdfYnBfcmVzdG9yZSkodm9pZCAqKSkKK3N0YXRpYyBpbnQgKCpod19icmVha3BvaW50X3Jlc3RvcmUpKHVuc2lnbmVkIGludCk7Cit2b2lkIF9faW5pdCBjcHVfc3VzcGVuZF9zZXRfZGJnX3Jlc3RvcmVyKGludCAoKmh3X2JwX3Jlc3RvcmUpKHVuc2lnbmVkIGludCkpCiB7CiAJLyogUHJldmVudCBtdWx0aXBsZSByZXN0b3JlIGhvb2sgaW5pdGlhbGl6YXRpb25zICovCiAJaWYgKFdBUk5fT04oaHdfYnJlYWtwb2ludF9yZXN0b3JlKSkKQEAgLTM0LDYgKzM0LDggQEAKIAogdm9pZCBub3RyYWNlIF9fY3B1X3N1c3BlbmRfZXhpdCh2b2lkKQogeworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKIAkvKgogCSAqIFdlIGFyZSByZXN1bWluZyBmcm9tIHJlc2V0IHdpdGggdGhlIGlkbWFwIGFjdGl2ZSBpbiBUVEJSMF9FTDEuCiAJICogV2UgbXVzdCB1bmluc3RhbGwgdGhlIGlkbWFwIGFuZCByZXN0b3JlIHRoZSBleHBlY3RlZCBNTVUKQEAgLTQ1LDcgKzQ3LDcgQEAKIAkgKiBSZXN0b3JlIHBlci1jcHUgb2Zmc2V0IGJlZm9yZSBhbnkga2VybmVsCiAJICogc3Vic3lzdGVtIHJlbHlpbmcgb24gaXQgaGFzIGEgY2hhbmNlIHRvIHJ1bi4KIAkgKi8KLQlzZXRfbXlfY3B1X29mZnNldChwZXJfY3B1X29mZnNldChzbXBfcHJvY2Vzc29yX2lkKCkpKTsKKwlzZXRfbXlfY3B1X29mZnNldChwZXJfY3B1X29mZnNldChjcHUpKTsKIAogCS8qCiAJICogUmVzdG9yZSBIVyBicmVha3BvaW50IHJlZ2lzdGVycyB0byBzYW5lIHZhbHVlcwpAQCAtNTMsNyArNTUsNyBAQAogCSAqIHRocm91Z2ggbG9jYWxfZGJnX3Jlc3RvcmUuCiAJICovCiAJaWYgKGh3X2JyZWFrcG9pbnRfcmVzdG9yZSkKLQkJaHdfYnJlYWtwb2ludF9yZXN0b3JlKE5VTEwpOworCQlod19icmVha3BvaW50X3Jlc3RvcmUoY3B1KTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3N5c19jb21wYXQuYyBiL2FyY2gvYXJtNjQva2VybmVsL3N5c19jb21wYXQuYwppbmRleCAyOGM1MTFiLi5hYmFmNTgyIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC9zeXNfY29tcGF0LmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvc3lzX2NvbXBhdC5jCkBAIC05NCw3ICs5NCw3IEBACiAJCSAqIFNlZSBjb21tZW50IGluIHRsc190aHJlYWRfZmx1c2guCiAJCSAqLwogCQliYXJyaWVyKCk7Ci0JCWFzbSAoIm1zciB0cGlkcnJvX2VsMCwgJTAiIDogOiAiciIgKHJlZ3MtPnJlZ3NbMF0pKTsKKwkJd3JpdGVfc3lzcmVnKHJlZ3MtPnJlZ3NbMF0sIHRwaWRycm9fZWwwKTsKIAkJcmV0dXJuIDA7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXJtNjQva2VybmVsL3RyYXBzLmMKaW5kZXggZTA0ZjgzOC4uNWZmMDIwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC90cmFwcy5jCkBAIC0xNDIsNiArMTQyLDExIEBACiAJdW5zaWduZWQgbG9uZyBpcnFfc3RhY2tfcHRyOwogCWludCBza2lwOwogCisJcHJfZGVidWcoIiVzKHJlZ3MgPSAlcCB0c2sgPSAlcClcbiIsIF9fZnVuY19fLCByZWdzLCB0c2spOworCisJaWYgKCF0c2spCisJCXRzayA9IGN1cnJlbnQ7CisKIAkvKgogCSAqIFN3aXRjaGluZyBiZXR3ZWVuIHN0YWNrcyBpcyB2YWxpZCB3aGVuIHRyYWNpbmcgY3VycmVudCBhbmQgaW4KIAkgKiBub24tcHJlZW1wdGlibGUgY29udGV4dC4KQEAgLTE1MSwxMSArMTU2LDYgQEAKIAllbHNlCiAJCWlycV9zdGFja19wdHIgPSAwOwogCi0JcHJfZGVidWcoIiVzKHJlZ3MgPSAlcCB0c2sgPSAlcClcbiIsIF9fZnVuY19fLCByZWdzLCB0c2spOwotCi0JaWYgKCF0c2spCi0JCXRzayA9IGN1cnJlbnQ7Ci0KIAlpZiAodHNrID09IGN1cnJlbnQpIHsKIAkJZnJhbWUuZnAgPSAodW5zaWduZWQgbG9uZylfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKIAkJZnJhbWUuc3AgPSBjdXJyZW50X3N0YWNrX3BvaW50ZXI7CkBAIC00NDcsMzYgKzQ0NywyOSBAQAogCQk6ICI9ciIgKHJlcykJCQkJCVwKIAkJOiAiciIgKGFkZHJlc3MpLCAiaSIgKC1FRkFVTFQpICkKIAotYXNtbGlua2FnZSB2b2lkIF9fZXhjZXB0aW9uIGRvX3N5c2luc3RyKHVuc2lnbmVkIGludCBlc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgdXNlcl9jYWNoZV9tYWludF9oYW5kbGVyKHVuc2lnbmVkIGludCBlc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLQlpbnQgcmV0OworCWludCBydCA9IChlc3IgJiBFU1JfRUx4X1NZUzY0X0lTU19SVF9NQVNLKSA+PiBFU1JfRUx4X1NZUzY0X0lTU19SVF9TSElGVDsKKwlpbnQgY3JtID0gKGVzciAmIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9NQVNLKSA+PiBFU1JfRUx4X1NZUzY0X0lTU19DUk1fU0hJRlQ7CisJaW50IHJldCA9IDA7CiAKLQkvKiBpZiB0aGlzIGlzIGEgd3JpdGUgd2l0aDogT3AwPTEsIE9wMj0xLCBPcDE9MywgQ1JuPTcgKi8KLQlpZiAoKGVzciAmIDB4MDFmZmZjMDEpID09IDB4MDAxMmRjMDApIHsKLQkJaW50IHJ0ID0gKGVzciA+PiA1KSAmIDB4MWY7Ci0JCWludCBjcm0gPSAoZXNyID4+IDEpICYgMHgwZjsKKwlhZGRyZXNzID0gKHJ0ID09IDMxKSA/IDAgOiByZWdzLT5yZWdzW3J0XTsKIAotCQlhZGRyZXNzID0gKHJ0ID09IDMxKSA/IDAgOiByZWdzLT5yZWdzW3J0XTsKLQotCQlzd2l0Y2ggKGNybSkgewotCQljYXNlIDExOgkJLyogREMgQ1ZBVSwgZ2V0cyBwcm9tb3RlZCAqLwotCQkJX191c2VyX2NhY2hlX21haW50KCJkYyBjaXZhYyIsIGFkZHJlc3MsIHJldCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMDoJCS8qIERDIENWQUMsIGdldHMgcHJvbW90ZWQgKi8KLQkJCV9fdXNlcl9jYWNoZV9tYWludCgiZGMgY2l2YWMiLCBhZGRyZXNzLCByZXQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTQ6CQkvKiBEQyBDSVZBQyAqLwotCQkJX191c2VyX2NhY2hlX21haW50KCJkYyBjaXZhYyIsIGFkZHJlc3MsIHJldCk7Ci0JCQlicmVhazsKLQkJY2FzZSA1OgkJCS8qIElDIElWQVUgKi8KLQkJCV9fdXNlcl9jYWNoZV9tYWludCgiaWMgaXZhdSIsIGFkZHJlc3MsIHJldCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWZvcmNlX3NpZ25hbF9pbmplY3QoU0lHSUxMLCBJTExfSUxMT1BDLCByZWdzLCAwKTsKLQkJCXJldHVybjsKLQkJfQotCX0gZWxzZSB7CisJc3dpdGNoIChjcm0pIHsKKwljYXNlIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9EQ19DVkFVOgkvKiBEQyBDVkFVLCBnZXRzIHByb21vdGVkICovCisJCV9fdXNlcl9jYWNoZV9tYWludCgiZGMgY2l2YWMiLCBhZGRyZXNzLCByZXQpOworCQlicmVhazsKKwljYXNlIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9EQ19DVkFDOgkvKiBEQyBDVkFDLCBnZXRzIHByb21vdGVkICovCisJCV9fdXNlcl9jYWNoZV9tYWludCgiZGMgY2l2YWMiLCBhZGRyZXNzLCByZXQpOworCQlicmVhazsKKwljYXNlIEVTUl9FTHhfU1lTNjRfSVNTX0NSTV9EQ19DSVZBQzoJLyogREMgQ0lWQUMgKi8KKwkJX191c2VyX2NhY2hlX21haW50KCJkYyBjaXZhYyIsIGFkZHJlc3MsIHJldCk7CisJCWJyZWFrOworCWNhc2UgRVNSX0VMeF9TWVM2NF9JU1NfQ1JNX0lDX0lWQVU6CS8qIElDIElWQVUgKi8KKwkJX191c2VyX2NhY2hlX21haW50KCJpYyBpdmF1IiwgYWRkcmVzcywgcmV0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJZm9yY2Vfc2lnbmFsX2luamVjdChTSUdJTEwsIElMTF9JTExPUEMsIHJlZ3MsIDApOwogCQlyZXR1cm47CiAJfQpAQCAtNDg3LDYgKzQ4MCw0OCBAQAogCQlyZWdzLT5wYyArPSA0OwogfQogCitzdGF0aWMgdm9pZCBjdHJfcmVhZF9oYW5kbGVyKHVuc2lnbmVkIGludCBlc3IsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBydCA9IChlc3IgJiBFU1JfRUx4X1NZUzY0X0lTU19SVF9NQVNLKSA+PiBFU1JfRUx4X1NZUzY0X0lTU19SVF9TSElGVDsKKworCXJlZ3MtPnJlZ3NbcnRdID0gYXJtNjRfZnRyX3JlZ19jdHJlbDAuc3lzX3ZhbDsKKwlyZWdzLT5wYyArPSA0OworfQorCitzdHJ1Y3Qgc3lzNjRfaG9vayB7CisJdW5zaWduZWQgaW50IGVzcl9tYXNrOworCXVuc2lnbmVkIGludCBlc3JfdmFsOworCXZvaWQgKCpoYW5kbGVyKSh1bnNpZ25lZCBpbnQgZXNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Cit9OworCitzdGF0aWMgc3RydWN0IHN5czY0X2hvb2sgc3lzNjRfaG9va3NbXSA9IHsKKwl7CisJCS5lc3JfbWFzayA9IEVTUl9FTHhfU1lTNjRfSVNTX0VMMF9DQUNIRV9PUF9NQVNLLAorCQkuZXNyX3ZhbCA9IEVTUl9FTHhfU1lTNjRfSVNTX0VMMF9DQUNIRV9PUF9WQUwsCisJCS5oYW5kbGVyID0gdXNlcl9jYWNoZV9tYWludF9oYW5kbGVyLAorCX0sCisJeworCQkvKiBUcmFwIHJlYWQgYWNjZXNzIHRvIENUUl9FTDAgKi8KKwkJLmVzcl9tYXNrID0gRVNSX0VMeF9TWVM2NF9JU1NfU1lTX09QX01BU0ssCisJCS5lc3JfdmFsID0gRVNSX0VMeF9TWVM2NF9JU1NfU1lTX0NUUl9SRUFELAorCQkuaGFuZGxlciA9IGN0cl9yZWFkX2hhbmRsZXIsCisJfSwKKwl7fSwKK307CisKK2FzbWxpbmthZ2Ugdm9pZCBfX2V4Y2VwdGlvbiBkb19zeXNpbnN0cih1bnNpZ25lZCBpbnQgZXNyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc3lzNjRfaG9vayAqaG9vazsKKworCWZvciAoaG9vayA9IHN5czY0X2hvb2tzOyBob29rLT5oYW5kbGVyOyBob29rKyspCisJCWlmICgoaG9vay0+ZXNyX21hc2sgJiBlc3IpID09IGhvb2stPmVzcl92YWwpIHsKKwkJCWhvb2stPmhhbmRsZXIoZXNyLCByZWdzKTsKKwkJCXJldHVybjsKKwkJfQorCisJZm9yY2Vfc2lnbmFsX2luamVjdChTSUdJTEwsIElMTF9JTExPUEMsIHJlZ3MsIDApOworfQorCiBsb25nIGNvbXBhdF9hcm1fc3lzY2FsbChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiAKIGFzbWxpbmthZ2UgbG9uZyBkb19uaV9zeXNjYWxsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvdmRzby5jIGIvYXJjaC9hcm02NC9rZXJuZWwvdmRzby5jCmluZGV4IDA3NjMxMmIuLmEyYzI0NzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYworKysgYi9hcmNoL2FybTY0L2tlcm5lbC92ZHNvLmMKQEAgLTE4LDEyICsxOCwxMyBAQAogICogQXV0aG9yOiBXaWxsIERlYWNvbiA8d2lsbC5kZWFjb25AYXJtLmNvbT4KICAqLwogCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgpAQCAtMzcsOCArMzgsNyBAQAogI2luY2x1ZGUgPGFzbS92ZHNvX2RhdGFwYWdlLmg+CiAKIGV4dGVybiBjaGFyIHZkc29fc3RhcnQsIHZkc29fZW5kOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgdmRzb19wYWdlczsKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqKnZkc29fcGFnZWxpc3Q7CitzdGF0aWMgdW5zaWduZWQgbG9uZyB2ZHNvX3BhZ2VzIF9fcm9fYWZ0ZXJfaW5pdDsKIAogLyoKICAqIFRoZSB2RFNPIGRhdGEgcGFnZS4KQEAgLTUzLDkgKzUzLDkgQEAKIC8qCiAgKiBDcmVhdGUgYW5kIG1hcCB0aGUgdmVjdG9ycyBwYWdlIGZvciBBQXJjaDMyIHRhc2tzLgogICovCi1zdGF0aWMgc3RydWN0IHBhZ2UgKnZlY3RvcnNfcGFnZVsxXTsKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqdmVjdG9yc19wYWdlWzFdIF9fcm9fYWZ0ZXJfaW5pdDsKIAotc3RhdGljIGludCBhbGxvY192ZWN0b3JzX3BhZ2Uodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFsbG9jX3ZlY3RvcnNfcGFnZSh2b2lkKQogewogCWV4dGVybiBjaGFyIF9fa3VzZXJfaGVscGVyX3N0YXJ0W10sIF9fa3VzZXJfaGVscGVyX2VuZFtdOwogCWV4dGVybiBjaGFyIF9fYWFyY2gzMl9zaWdyZXRfY29kZV9zdGFydFtdLCBfX2FhcmNoMzJfc2lncmV0X2NvZGVfZW5kW107CkBAIC04OCw3ICs4OCw3IEBACiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSBBQVJDSDMyX1ZFQ1RPUlNfQkFTRTsKLQlzdGF0aWMgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyBzcGVjID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nIHNwZWMgPSB7CiAJCS5uYW1lCT0gIlt2ZWN0b3JzXSIsCiAJCS5wYWdlcwk9IHZlY3RvcnNfcGFnZSwKIApAQCAtMTEwLDExICsxMTAsMTkgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfQ09NUEFUICovCiAKLXN0YXRpYyBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nIHZkc29fc3BlY1syXTsKK3N0YXRpYyBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nIHZkc29fc3BlY1syXSBfX3JvX2FmdGVyX2luaXQgPSB7CisJeworCQkubmFtZQk9ICJbdnZhcl0iLAorCX0sCisJeworCQkubmFtZQk9ICJbdmRzb10iLAorCX0sCit9OwogCiBzdGF0aWMgaW50IF9faW5pdCB2ZHNvX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKKwlzdHJ1Y3QgcGFnZSAqKnZkc29fcGFnZWxpc3Q7CiAKIAlpZiAobWVtY21wKCZ2ZHNvX3N0YXJ0LCAiXDE3N0VMRiIsIDQpKSB7CiAJCXByX2VycigidkRTTyBpcyBub3QgYSB2YWxpZCBFTEYgb2JqZWN0IVxuIik7CkBAIC0xMzgsMTYgKzE0Niw4IEBACiAJZm9yIChpID0gMDsgaSA8IHZkc29fcGFnZXM7IGkrKykKIAkJdmRzb19wYWdlbGlzdFtpICsgMV0gPSBwZm5fdG9fcGFnZShQSFlTX1BGTihfX3BhKCZ2ZHNvX3N0YXJ0KSkgKyBpKTsKIAotCS8qIFBvcHVsYXRlIHRoZSBzcGVjaWFsIG1hcHBpbmcgc3RydWN0dXJlcyAqLwotCXZkc29fc3BlY1swXSA9IChzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nKSB7Ci0JCS5uYW1lCT0gIlt2dmFyXSIsCi0JCS5wYWdlcwk9IHZkc29fcGFnZWxpc3QsCi0JfTsKLQotCXZkc29fc3BlY1sxXSA9IChzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nKSB7Ci0JCS5uYW1lCT0gIlt2ZHNvXSIsCi0JCS5wYWdlcwk9ICZ2ZHNvX3BhZ2VsaXN0WzFdLAotCX07CisJdmRzb19zcGVjWzBdLnBhZ2VzID0gJnZkc29fcGFnZWxpc3RbMF07CisJdmRzb19zcGVjWzFdLnBhZ2VzID0gJnZkc29fcGFnZWxpc3RbMV07CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMSw3ICsyMDEsNyBAQAogICovCiB2b2lkIHVwZGF0ZV92c3lzY2FsbChzdHJ1Y3QgdGltZWtlZXBlciAqdGspCiB7Ci0JdTMyIHVzZV9zeXNjYWxsID0gc3RyY21wKHRrLT50a3JfbW9uby5jbG9jay0+bmFtZSwgImFyY2hfc3lzX2NvdW50ZXIiKTsKKwl1MzIgdXNlX3N5c2NhbGwgPSAhdGstPnRrcl9tb25vLmNsb2NrLT5hcmNoZGF0YS52ZHNvX2RpcmVjdDsKIAogCSsrdmRzb19kYXRhLT50Yl9zZXFfY291bnQ7CiAJc21wX3dtYigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvYXJtNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggNjU5OTYzZC4uNWNlOWIyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2FybTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xODUsNiArMTg1LDI1IEBACiAJX2RhdGEgPSAuOwogCV9zZGF0YSA9IC47CiAJUldfREFUQV9TRUNUSU9OKEwxX0NBQ0hFX0JZVEVTLCBQQUdFX1NJWkUsIFRIUkVBRF9TSVpFKQorCisJLyoKKwkgKiBEYXRhIHdyaXR0ZW4gd2l0aCB0aGUgTU1VIG9mZiBidXQgcmVhZCB3aXRoIHRoZSBNTVUgb24gcmVxdWlyZXMKKwkgKiBjYWNoZSBsaW5lcyB0byBiZSBpbnZhbGlkYXRlZCwgZGlzY2FyZGluZyB1cCB0byBhIENhY2hlIFdyaXRlYmFjaworCSAqIEdyYW51bGUgKENXRykgb2YgZGF0YSBmcm9tIHRoZSBjYWNoZS4gS2VlcCB0aGUgc2VjdGlvbiB0aGF0CisJICogcmVxdWlyZXMgdGhpcyB0eXBlIG9mIG1haW50ZW5hbmNlIHRvIGJlIGluIGl0cyBvd24gQ2FjaGUgV3JpdGViYWNrCisJICogR3JhbnVsZSAoQ1dHKSBhcmVhIHNvIHRoZSBjYWNoZSBtYWludGVuYW5jZSBvcGVyYXRpb25zIGRvbid0CisJICogaW50ZXJmZXJlIHdpdGggYWRqYWNlbnQgZGF0YS4KKwkgKi8KKwkubW11b2ZmLmRhdGEud3JpdGUgOiBBTElHTihTWl8ySykgeworCQlfX21tdW9mZl9kYXRhX3N0YXJ0ID0gLjsKKwkJKigubW11b2ZmLmRhdGEud3JpdGUpCisJfQorCS4gPSBBTElHTihTWl8ySyk7CisJLm1tdW9mZi5kYXRhLnJlYWQgOiB7CisJCSooLm1tdW9mZi5kYXRhLnJlYWQpCisJCV9fbW11b2ZmX2RhdGFfZW5kID0gLjsKKwl9CisKIAlQRUNPRkZfRURBVEFfUEFERElORwogCV9lZGF0YSA9IC47CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL0tjb25maWcgYi9hcmNoL2FybTY0L2t2bS9LY29uZmlnCmluZGV4IDljOWVkYzkuLjZlYWYxMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL0tjb25maWcKKysrIGIvYXJjaC9hcm02NC9rdm0vS2NvbmZpZwpAQCAtMTYsNyArMTYsNyBAQAogCiBpZiBWSVJUVUFMSVpBVElPTgogCi1jb25maWcgS1ZNX0FSTV9WR0lDX1YzCitjb25maWcgS1ZNX0FSTV9WR0lDX1YzX0lUUwogCWJvb2wKIAogY29uZmlnIEtWTQpAQCAtMzQsNyArMzQsNyBAQAogCXNlbGVjdCBLVk1fVkZJTwogCXNlbGVjdCBIQVZFX0tWTV9FVkVOVEZECiAJc2VsZWN0IEhBVkVfS1ZNX0lSUUZECi0Jc2VsZWN0IEtWTV9BUk1fVkdJQ19WMworCXNlbGVjdCBLVk1fQVJNX1ZHSUNfVjNfSVRTCiAJc2VsZWN0IEtWTV9BUk1fUE1VIGlmIEhXX1BFUkZfRVZFTlRTCiAJc2VsZWN0IEhBVkVfS1ZNX01TSQogCXNlbGVjdCBIQVZFX0tWTV9JUlFDSElQCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9NYWtlZmlsZSBiL2FyY2gvYXJtNjQva3ZtL01ha2VmaWxlCmluZGV4IDY5NWViM2MuLmQ1MGE4MmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtNjQva3ZtL01ha2VmaWxlCkBAIC0xNiw5ICsxNiwxMCBAQAoga3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChBUk0pL2FybS5vICQoQVJNKS9tbXUubyAkKEFSTSkvbW1pby5vCiBrdm0tJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSAkKEFSTSkvcHNjaS5vICQoQVJNKS9wZXJmLm8KIAota3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gZW11bGF0ZS5vIGluamVjdF9mYXVsdC5vIHJlZ21hcC5vCitrdm0tJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSBpbmplY3RfZmF1bHQubyByZWdtYXAubwoga3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gaHlwLm8gaHlwLWluaXQubyBoYW5kbGVfZXhpdC5vCiBrdm0tJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSBndWVzdC5vIGRlYnVnLm8gcmVzZXQubyBzeXNfcmVncy5vIHN5c19yZWdzX2dlbmVyaWNfdjgubwora3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChLVk0pL2FybS9hYXJjaDMyLm8KIAoga3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChLVk0pL2FybS92Z2ljL3ZnaWMubwoga3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChLVk0pL2FybS92Z2ljL3ZnaWMtaW5pdC5vCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9lbXVsYXRlLmMgYi9hcmNoL2FybTY0L2t2bS9lbXVsYXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4N2Q4ZmIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm02NC9rdm0vZW11bGF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiAobm90IG11Y2ggb2YgYW4pIEVtdWxhdGlvbiBsYXllciBmb3IgMzJiaXQgZ3Vlc3RzLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiwyMDEzIC0gQVJNIEx0ZAotICogQXV0aG9yOiBNYXJjIFp5bmdpZXIgPG1hcmMuenluZ2llckBhcm0uY29tPgotICoKLSAqIGJhc2VkIG9uIGFyY2gvYXJtL2t2bS9lbXVsYXRlLmMKLSAqIENvcHlyaWdodCAoQykgMjAxMiAtIFZpcnR1YWwgT3BlbiBTeXN0ZW1zIGFuZCBDb2x1bWJpYSBVbml2ZXJzaXR5Ci0gKiBBdXRob3I6IENocmlzdG9mZmVyIERhbGwgPGMuZGFsbEB2aXJ0dWFsb3BlbnN5c3RlbXMuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+Ci0jaW5jbHVkZSA8YXNtL2Vzci5oPgotI2luY2x1ZGUgPGFzbS9rdm1fZW11bGF0ZS5oPgotCi0vKgotICogc3RvbGVuIGZyb20gYXJjaC9hcm0va2VybmVsL29wY29kZXMuYwotICoKLSAqIGNvbmRpdGlvbiBjb2RlIGxvb2t1cCB0YWJsZQotICogaW5kZXggaW50byB0aGUgdGFibGUgaXMgdGVzdCBjb2RlOiBFUSwgTkUsIC4uLiBMVCwgR1QsIEFMLCBOVgotICoKLSAqIGJpdCBwb3NpdGlvbiBpbiBzaG9ydCBpcyBjb25kaXRpb24gY29kZTogTlpDVgotICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgY2NfbWFwWzE2XSA9IHsKLQkweEYwRjAsCQkJLyogRVEgPT0gWiBzZXQgICAgICAgICAgICAqLwotCTB4MEYwRiwJCQkvKiBORSAgICAgICAgICAgICAgICAgICAgICovCi0JMHhDQ0NDLAkJCS8qIENTID09IEMgc2V0ICAgICAgICAgICAgKi8KLQkweDMzMzMsCQkJLyogQ0MgICAgICAgICAgICAgICAgICAgICAqLwotCTB4RkYwMCwJCQkvKiBNSSA9PSBOIHNldCAgICAgICAgICAgICovCi0JMHgwMEZGLAkJCS8qIFBMICAgICAgICAgICAgICAgICAgICAgKi8KLQkweEFBQUEsCQkJLyogVlMgPT0gViBzZXQgICAgICAgICAgICAqLwotCTB4NTU1NSwJCQkvKiBWQyAgICAgICAgICAgICAgICAgICAgICovCi0JMHgwQzBDLAkJCS8qIEhJID09IEMgc2V0ICYmIFogY2xlYXIgKi8KLQkweEYzRjMsCQkJLyogTFMgPT0gQyBjbGVhciB8fCBaIHNldCAqLwotCTB4QUE1NSwJCQkvKiBHRSA9PSAoTj09VikgICAgICAgICAgICovCi0JMHg1NUFBLAkJCS8qIExUID09IChOIT1WKSAgICAgICAgICAgKi8KLQkweDBBMDUsCQkJLyogR1QgPT0gKCFaICYmIChOPT1WKSkgICAqLwotCTB4RjVGQSwJCQkvKiBMRSA9PSAoWiB8fCAoTiE9VikpICAgICovCi0JMHhGRkZGLAkJCS8qIEFMIGFsd2F5cyAgICAgICAgICAgICAgKi8KLQkwCQkJLyogTlYgICAgICAgICAgICAgICAgICAgICAqLwotfTsKLQotc3RhdGljIGludCBrdm1fdmNwdV9nZXRfY29uZGl0aW9uKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQl1MzIgZXNyID0ga3ZtX3ZjcHVfZ2V0X2hzcih2Y3B1KTsKLQotCWlmIChlc3IgJiBFU1JfRUx4X0NWKQotCQlyZXR1cm4gKGVzciAmIEVTUl9FTHhfQ09ORF9NQVNLKSA+PiBFU1JfRUx4X0NPTkRfU0hJRlQ7Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKiBDaGVjayBpZiBhIHRyYXBwZWQgaW5zdHJ1Y3Rpb24gc2hvdWxkIGhhdmUgYmVlbiBleGVjdXRlZCBvciBub3QuCi0gKi8KLWJvb2wga3ZtX2NvbmRpdGlvbl92YWxpZDMyKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQl1bnNpZ25lZCBsb25nIGNwc3I7Ci0JdTMyIGNwc3JfY29uZDsKLQlpbnQgY29uZDsKLQotCS8qIFRvcCB0d28gYml0cyBub24temVybz8gIFVuY29uZGl0aW9uYWwuICovCi0JaWYgKGt2bV92Y3B1X2dldF9oc3IodmNwdSkgPj4gMzApCi0JCXJldHVybiB0cnVlOwotCi0JLyogSXMgY29uZGl0aW9uIGZpZWxkIHZhbGlkPyAqLwotCWNvbmQgPSBrdm1fdmNwdV9nZXRfY29uZGl0aW9uKHZjcHUpOwotCWlmIChjb25kID09IDB4RSkKLQkJcmV0dXJuIHRydWU7Ci0KLQljcHNyID0gKnZjcHVfY3Bzcih2Y3B1KTsKLQotCWlmIChjb25kIDwgMCkgewotCQkvKiBUaGlzIGNhbiBoYXBwZW4gaW4gVGh1bWIgbW9kZTogZXhhbWluZSBJVCBzdGF0ZS4gKi8KLQkJdW5zaWduZWQgbG9uZyBpdDsKLQotCQlpdCA9ICgoY3BzciA+PiA4KSAmIDB4RkMpIHwgKChjcHNyID4+IDI1KSAmIDB4Myk7Ci0KLQkJLyogaXQgPT0gMCA9PiB1bmNvbmRpdGlvbmFsLiAqLwotCQlpZiAoaXQgPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8qIFRoZSBjb25kIGZvciB0aGlzIGluc24gd29ya3Mgb3V0IGFzIHRoZSB0b3AgNCBiaXRzLiAqLwotCQljb25kID0gKGl0ID4+IDQpOwotCX0KLQotCWNwc3JfY29uZCA9IGNwc3IgPj4gMjg7Ci0KLQlpZiAoISgoY2NfbWFwW2NvbmRdID4+IGNwc3JfY29uZCkgJiAxKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogYWRqdXN0X2l0c3RhdGUgLSBhZGp1c3QgSVRTVEFURSB3aGVuIGVtdWxhdGluZyBpbnN0cnVjdGlvbnMgaW4gSVQtYmxvY2sKLSAqIEB2Y3B1OglUaGUgVkNQVSBwb2ludGVyCi0gKgotICogV2hlbiBleGNlcHRpb25zIG9jY3VyIHdoaWxlIGluc3RydWN0aW9ucyBhcmUgZXhlY3V0ZWQgaW4gVGh1bWIgSUYtVEhFTgotICogYmxvY2tzLCB0aGUgSVRTVEFURSBmaWVsZCBvZiB0aGUgQ1BTUiBpcyBub3QgYWR2YW5jZWQgKHVwZGF0ZWQpLCBzbyB3ZSBoYXZlCi0gKiB0byBkbyB0aGlzIGxpdHRsZSBiaXQgb2Ygd29yayBtYW51YWxseS4gVGhlIGZpZWxkcyBtYXAgbGlrZSB0aGlzOgotICoKLSAqIElUWzc6MF0gLT4gQ1BTUlsyNjoyNV0sQ1BTUlsxNToxMF0KLSAqLwotc3RhdGljIHZvaWQga3ZtX2FkanVzdF9pdHN0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQl1bnNpZ25lZCBsb25nIGl0Yml0cywgY29uZDsKLQl1bnNpZ25lZCBsb25nIGNwc3IgPSAqdmNwdV9jcHNyKHZjcHUpOwotCWJvb2wgaXNfYXJtID0gIShjcHNyICYgQ09NUEFUX1BTUl9UX0JJVCk7Ci0KLQlCVUdfT04oaXNfYXJtICYmIChjcHNyICYgQ09NUEFUX1BTUl9JVF9NQVNLKSk7Ci0KLQlpZiAoIShjcHNyICYgQ09NUEFUX1BTUl9JVF9NQVNLKSkKLQkJcmV0dXJuOwotCi0JY29uZCA9IChjcHNyICYgMHhlMDAwKSA+PiAxMzsKLQlpdGJpdHMgPSAoY3BzciAmIDB4MWMwMCkgPj4gKDEwIC0gMik7Ci0JaXRiaXRzIHw9IChjcHNyICYgKDB4MyA8PCAyNSkpID4+IDI1OwotCi0JLyogUGVyZm9ybSBJVEFkdmFuY2UgKHNlZSBwYWdlIEEyLTUyIGluIEFSTSBEREkgMDQwNkMpICovCi0JaWYgKChpdGJpdHMgJiAweDcpID09IDApCi0JCWl0Yml0cyA9IGNvbmQgPSAwOwotCWVsc2UKLQkJaXRiaXRzID0gKGl0Yml0cyA8PCAxKSAmIDB4MWY7Ci0KLQljcHNyICY9IH5DT01QQVRfUFNSX0lUX01BU0s7Ci0JY3BzciB8PSBjb25kIDw8IDEzOwotCWNwc3IgfD0gKGl0Yml0cyAmIDB4MWMpIDw8ICgxMCAtIDIpOwotCWNwc3IgfD0gKGl0Yml0cyAmIDB4MykgPDwgMjU7Ci0JKnZjcHVfY3Bzcih2Y3B1KSA9IGNwc3I7Ci19Ci0KLS8qKgotICoga3ZtX3NraXBfaW5zdHIgLSBza2lwIGEgdHJhcHBlZCBpbnN0cnVjdGlvbiBhbmQgcHJvY2VlZCB0byB0aGUgbmV4dAotICogQHZjcHU6IFRoZSB2Y3B1IHBvaW50ZXIKLSAqLwotdm9pZCBrdm1fc2tpcF9pbnN0cjMyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgYm9vbCBpc193aWRlX2luc3RyKQotewotCWJvb2wgaXNfdGh1bWI7Ci0KLQlpc190aHVtYiA9ICEhKCp2Y3B1X2Nwc3IodmNwdSkgJiBDT01QQVRfUFNSX1RfQklUKTsKLQlpZiAoaXNfdGh1bWIgJiYgIWlzX3dpZGVfaW5zdHIpCi0JCSp2Y3B1X3BjKHZjcHUpICs9IDI7Ci0JZWxzZQotCQkqdmNwdV9wYyh2Y3B1KSArPSA0OwotCWt2bV9hZGp1c3RfaXRzdGF0ZSh2Y3B1KTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2hhbmRsZV9leGl0LmMgYi9hcmNoL2FybTY0L2t2bS9oYW5kbGVfZXhpdC5jCmluZGV4IGZhOTZmZTIuLmEyMDRhZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL2hhbmRsZV9leGl0LmMKKysrIGIvYXJjaC9hcm02NC9rdm0vaGFuZGxlX2V4aXQuYwpAQCAtMTcwLDkgKzE3MCwzMiBAQAogewogCWV4aXRfaGFuZGxlX2ZuIGV4aXRfaGFuZGxlcjsKIAorCWlmIChBUk1fU0VSUk9SX1BFTkRJTkcoZXhjZXB0aW9uX2luZGV4KSkgeworCQl1OCBoc3JfZWMgPSBFU1JfRUx4X0VDKGt2bV92Y3B1X2dldF9oc3IodmNwdSkpOworCisJCS8qCisJCSAqIEhWQy9TTUMgYWxyZWFkeSBoYXZlIGFuIGFkanVzdGVkIFBDLCB3aGljaCB3ZSBuZWVkCisJCSAqIHRvIGNvcnJlY3QgaW4gb3JkZXIgdG8gcmV0dXJuIHRvIGFmdGVyIGhhdmluZworCQkgKiBpbmplY3RlZCB0aGUgU0Vycm9yLgorCQkgKi8KKwkJaWYgKGhzcl9lYyA9PSBFU1JfRUx4X0VDX0hWQzMyIHx8IGhzcl9lYyA9PSBFU1JfRUx4X0VDX0hWQzY0IHx8CisJCSAgICBoc3JfZWMgPT0gRVNSX0VMeF9FQ19TTUMzMiB8fCBoc3JfZWMgPT0gRVNSX0VMeF9FQ19TTUM2NCkgeworCQkJdTMyIGFkaiA9ICBrdm1fdmNwdV90cmFwX2lsX2lzMzJiaXQodmNwdSkgPyA0IDogMjsKKwkJCSp2Y3B1X3BjKHZjcHUpIC09IGFkajsKKwkJfQorCisJCWt2bV9pbmplY3RfdmFidCh2Y3B1KTsKKwkJcmV0dXJuIDE7CisJfQorCisJZXhjZXB0aW9uX2luZGV4ID0gQVJNX0VYQ0VQVElPTl9DT0RFKGV4Y2VwdGlvbl9pbmRleCk7CisKIAlzd2l0Y2ggKGV4Y2VwdGlvbl9pbmRleCkgewogCWNhc2UgQVJNX0VYQ0VQVElPTl9JUlE6CiAJCXJldHVybiAxOworCWNhc2UgQVJNX0VYQ0VQVElPTl9FTDFfU0VSUk9SOgorCQlrdm1faW5qZWN0X3ZhYnQodmNwdSk7CisJCXJldHVybiAxOwogCWNhc2UgQVJNX0VYQ0VQVElPTl9UUkFQOgogCQkvKgogCQkgKiBTZWUgQVJNIEFSTSBCMS4xNC4xOiAiSHlwIHRyYXBzIG9uIGluc3RydWN0aW9ucwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwLlMgYi9hcmNoL2FybTY0L2t2bS9oeXAuUwppbmRleCA3Y2U5MzE1Li4yNzI2NjM1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAuUworKysgYi9hcmNoL2FybTY0L2t2bS9oeXAuUwpAQCAtNDYsMTAgKzQ2LDYgQEAKIAlodmMJIzAKIAlsZHIgICAgIGxyLCBbc3BdLCAjMTYKIAlyZXQKLWFsdGVybmF0aXZlX2Vsc2UKK2FsdGVybmF0aXZlX2Vsc2Vfbm9wX2VuZGlmCiAJYglfX3ZoZV9oeXBfY2FsbAotCW5vcAotCW5vcAotCW5vcAotYWx0ZXJuYXRpdmVfZW5kaWYKIEVORFBST0MoX19rdm1fY2FsbF9oeXApCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvTWFrZWZpbGUgYi9hcmNoL2FybTY0L2t2bS9oeXAvTWFrZWZpbGUKaW5kZXggMGM4NWZlYi4uYWFmNDJhZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9NYWtlZmlsZQpAQCAtNSw5ICs1LDkgQEAKIEtWTT0uLi8uLi8uLi8uLi92aXJ0L2t2bQogCiBvYmotJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSAkKEtWTSkvYXJtL2h5cC92Z2ljLXYyLXNyLm8KK29iai0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoS1ZNKS9hcm0vaHlwL3ZnaWMtdjMtc3Iubwogb2JqLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChLVk0pL2FybS9oeXAvdGltZXItc3IubwogCi1vYmotJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSB2Z2ljLXYzLXNyLm8KIG9iai0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9IHN5c3JlZy1zci5vCiBvYmotJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSBkZWJ1Zy1zci5vCiBvYmotJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSBlbnRyeS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2t2bS9oeXAvZGVidWctc3IuYyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9kZWJ1Zy1zci5jCmluZGV4IDMzMzQyYTcuLjRiYTVjOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9kZWJ1Zy1zci5jCisrKyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9kZWJ1Zy1zci5jCkBAIC0xMzEsOSArMTMxLDcgQEAKIAkJdmNwdS0+YXJjaC5kZWJ1Z19mbGFncyAmPSB+S1ZNX0FSTTY0X0RFQlVHX0RJUlRZOwogfQogCi1zdGF0aWMgdTMyIF9faHlwX3RleHQgX19kZWJ1Z19yZWFkX21kY3JfZWwyKHZvaWQpCit1MzIgX19oeXBfdGV4dCBfX2t2bV9nZXRfbWRjcl9lbDIodm9pZCkKIHsKIAlyZXR1cm4gcmVhZF9zeXNyZWcobWRjcl9lbDIpOwogfQotCi1fX2FsaWFzKF9fZGVidWdfcmVhZF9tZGNyX2VsMikgdTMyIF9fa3ZtX2dldF9tZGNyX2VsMih2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9lbnRyeS5TIGIvYXJjaC9hcm02NC9rdm0vaHlwL2VudHJ5LlMKaW5kZXggY2U5ZTVlNS4uMTJlZTYyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL2VudHJ5LlMKKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL2VudHJ5LlMKQEAgLTU1LDc5ICs1NSwxMTEgQEAKICAqLwogRU5UUlkoX19ndWVzdF9lbnRlcikKIAkvLyB4MDogdmNwdQotCS8vIHgxOiBob3N0L2d1ZXN0IGNvbnRleHQKLQkvLyB4Mi14MTg6IGNsb2JiZXJlZCBieSBtYWNyb3MKKwkvLyB4MTogaG9zdCBjb250ZXh0CisJLy8geDIteDE3OiBjbG9iYmVyZWQgYnkgbWFjcm9zCisJLy8geDE4OiBndWVzdCBjb250ZXh0CiAKIAkvLyBTdG9yZSB0aGUgaG9zdCByZWdzCiAJc2F2ZV9jYWxsZWVfc2F2ZWRfcmVncyB4MQogCi0JLy8gUHJlc2VydmUgdmNwdSAmIGhvc3RfY3R4dCBmb3IgdXNlIGF0IGV4aXQgdGltZQotCXN0cAl4MCwgeDEsIFtzcCwgIy0xNl0hCisJLy8gU3RvcmUgdGhlIGhvc3RfY3R4dCBmb3IgdXNlIGF0IGV4aXQgdGltZQorCXN0cgl4MSwgW3NwLCAjLTE2XSEKIAotCWFkZAl4MSwgeDAsICNWQ1BVX0NPTlRFWFQKKwlhZGQJeDE4LCB4MCwgI1ZDUFVfQ09OVEVYVAogCi0JLy8gUHJlcGFyZSB4MC14MSBmb3IgbGF0ZXIgcmVzdG9yZSBieSBwdXNoaW5nIHRoZW0gb250byB0aGUgc3RhY2sKLQlsZHAJeDIsIHgzLCBbeDEsICNDUFVfWFJFR19PRkZTRVQoMCldCi0Jc3RwCXgyLCB4MywgW3NwLCAjLTE2XSEKKwkvLyBSZXN0b3JlIGd1ZXN0IHJlZ3MgeDAteDE3CisJbGRwCXgwLCB4MSwgICBbeDE4LCAjQ1BVX1hSRUdfT0ZGU0VUKDApXQorCWxkcAl4MiwgeDMsICAgW3gxOCwgI0NQVV9YUkVHX09GRlNFVCgyKV0KKwlsZHAJeDQsIHg1LCAgIFt4MTgsICNDUFVfWFJFR19PRkZTRVQoNCldCisJbGRwCXg2LCB4NywgICBbeDE4LCAjQ1BVX1hSRUdfT0ZGU0VUKDYpXQorCWxkcAl4OCwgeDksICAgW3gxOCwgI0NQVV9YUkVHX09GRlNFVCg4KV0KKwlsZHAJeDEwLCB4MTEsIFt4MTgsICNDUFVfWFJFR19PRkZTRVQoMTApXQorCWxkcAl4MTIsIHgxMywgW3gxOCwgI0NQVV9YUkVHX09GRlNFVCgxMildCisJbGRwCXgxNCwgeDE1LCBbeDE4LCAjQ1BVX1hSRUdfT0ZGU0VUKDE0KV0KKwlsZHAJeDE2LCB4MTcsIFt4MTgsICNDUFVfWFJFR19PRkZTRVQoMTYpXQogCi0JLy8geDIteDE4Ci0JbGRwCXgyLCB4MywgICBbeDEsICNDUFVfWFJFR19PRkZTRVQoMildCi0JbGRwCXg0LCB4NSwgICBbeDEsICNDUFVfWFJFR19PRkZTRVQoNCldCi0JbGRwCXg2LCB4NywgICBbeDEsICNDUFVfWFJFR19PRkZTRVQoNildCi0JbGRwCXg4LCB4OSwgICBbeDEsICNDUFVfWFJFR19PRkZTRVQoOCldCi0JbGRwCXgxMCwgeDExLCBbeDEsICNDUFVfWFJFR19PRkZTRVQoMTApXQotCWxkcAl4MTIsIHgxMywgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDEyKV0KLQlsZHAJeDE0LCB4MTUsIFt4MSwgI0NQVV9YUkVHX09GRlNFVCgxNCldCi0JbGRwCXgxNiwgeDE3LCBbeDEsICNDUFVfWFJFR19PRkZTRVQoMTYpXQotCWxkcgl4MTgsICAgICAgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDE4KV0KKwkvLyBSZXN0b3JlIGd1ZXN0IHJlZ3MgeDE5LXgyOSwgbHIKKwlyZXN0b3JlX2NhbGxlZV9zYXZlZF9yZWdzIHgxOAogCi0JLy8geDE5LXgyOSwgbHIKLQlyZXN0b3JlX2NhbGxlZV9zYXZlZF9yZWdzIHgxCi0KLQkvLyBMYXN0IGJpdHMgb2YgdGhlIDY0Yml0IHN0YXRlCi0JbGRwCXgwLCB4MSwgW3NwXSwgIzE2CisJLy8gUmVzdG9yZSBndWVzdCByZWcgeDE4CisJbGRyCXgxOCwgICAgICBbeDE4LCAjQ1BVX1hSRUdfT0ZGU0VUKDE4KV0KIAogCS8vIERvIG5vdCB0b3VjaCBhbnkgcmVnaXN0ZXIgYWZ0ZXIgdGhpcyEKIAllcmV0CiBFTkRQUk9DKF9fZ3Vlc3RfZW50ZXIpCiAKIEVOVFJZKF9fZ3Vlc3RfZXhpdCkKLQkvLyB4MDogdmNwdQotCS8vIHgxOiByZXR1cm4gY29kZQotCS8vIHgyLXgzOiBmcmVlCi0JLy8geDQteDI5LGxyOiB2Y3B1IHJlZ3MKLQkvLyB2Y3B1IHgwLXgzIG9uIHRoZSBzdGFjaworCS8vIHgwOiByZXR1cm4gY29kZQorCS8vIHgxOiB2Y3B1CisJLy8geDIteDI5LGxyOiB2Y3B1IHJlZ3MKKwkvLyB2Y3B1IHgwLXgxIG9uIHRoZSBzdGFjawogCi0JYWRkCXgyLCB4MCwgI1ZDUFVfQ09OVEVYVAorCWFkZAl4MSwgeDEsICNWQ1BVX0NPTlRFWFQKIAotCXN0cAl4NCwgeDUsICAgW3gyLCAjQ1BVX1hSRUdfT0ZGU0VUKDQpXQotCXN0cAl4NiwgeDcsICAgW3gyLCAjQ1BVX1hSRUdfT0ZGU0VUKDYpXQotCXN0cAl4OCwgeDksICAgW3gyLCAjQ1BVX1hSRUdfT0ZGU0VUKDgpXQotCXN0cAl4MTAsIHgxMSwgW3gyLCAjQ1BVX1hSRUdfT0ZGU0VUKDEwKV0KLQlzdHAJeDEyLCB4MTMsIFt4MiwgI0NQVV9YUkVHX09GRlNFVCgxMildCi0Jc3RwCXgxNCwgeDE1LCBbeDIsICNDUFVfWFJFR19PRkZTRVQoMTQpXQotCXN0cAl4MTYsIHgxNywgW3gyLCAjQ1BVX1hSRUdfT0ZGU0VUKDE2KV0KLQlzdHIJeDE4LCAgICAgIFt4MiwgI0NQVV9YUkVHX09GRlNFVCgxOCldCisJQUxURVJOQVRJVkUobm9wLCBTRVRfUFNUQVRFX1BBTigxKSwgQVJNNjRfSEFTX1BBTiwgQ09ORklHX0FSTTY0X1BBTikKIAotCWxkcAl4NiwgeDcsIFtzcF0sICMxNgkvLyB4MiwgeDMKLQlsZHAJeDQsIHg1LCBbc3BdLCAjMTYJLy8geDAsIHgxCisJLy8gU3RvcmUgdGhlIGd1ZXN0IHJlZ3MgeDIgYW5kIHgzCisJc3RwCXgyLCB4MywgICBbeDEsICNDUFVfWFJFR19PRkZTRVQoMildCiAKLQlzdHAJeDQsIHg1LCBbeDIsICNDUFVfWFJFR19PRkZTRVQoMCldCi0Jc3RwCXg2LCB4NywgW3gyLCAjQ1BVX1hSRUdfT0ZGU0VUKDIpXQorCS8vIFJldHJpZXZlIHRoZSBndWVzdCByZWdzIHgwLXgxIGZyb20gdGhlIHN0YWNrCisJbGRwCXgyLCB4MywgW3NwXSwgIzE2CS8vIHgwLCB4MQogCi0Jc2F2ZV9jYWxsZWVfc2F2ZWRfcmVncyB4MgorCS8vIFN0b3JlIHRoZSBndWVzdCByZWdzIHgwLXgxIGFuZCB4NC14MTgKKwlzdHAJeDIsIHgzLCAgIFt4MSwgI0NQVV9YUkVHX09GRlNFVCgwKV0KKwlzdHAJeDQsIHg1LCAgIFt4MSwgI0NQVV9YUkVHX09GRlNFVCg0KV0KKwlzdHAJeDYsIHg3LCAgIFt4MSwgI0NQVV9YUkVHX09GRlNFVCg2KV0KKwlzdHAJeDgsIHg5LCAgIFt4MSwgI0NQVV9YUkVHX09GRlNFVCg4KV0KKwlzdHAJeDEwLCB4MTEsIFt4MSwgI0NQVV9YUkVHX09GRlNFVCgxMCldCisJc3RwCXgxMiwgeDEzLCBbeDEsICNDUFVfWFJFR19PRkZTRVQoMTIpXQorCXN0cAl4MTQsIHgxNSwgW3gxLCAjQ1BVX1hSRUdfT0ZGU0VUKDE0KV0KKwlzdHAJeDE2LCB4MTcsIFt4MSwgI0NQVV9YUkVHX09GRlNFVCgxNildCisJc3RyCXgxOCwgICAgICBbeDEsICNDUFVfWFJFR19PRkZTRVQoMTgpXQogCi0JLy8gUmVzdG9yZSB2Y3B1ICYgaG9zdF9jdHh0IGZyb20gdGhlIHN0YWNrCi0JLy8gKHByZXNlcnZpbmcgcmV0dXJuIGNvZGUgaW4geDEpCi0JbGRwCXgwLCB4MiwgW3NwXSwgIzE2CisJLy8gU3RvcmUgdGhlIGd1ZXN0IHJlZ3MgeDE5LXgyOSwgbHIKKwlzYXZlX2NhbGxlZV9zYXZlZF9yZWdzIHgxCisKKwkvLyBSZXN0b3JlIHRoZSBob3N0X2N0eHQgZnJvbSB0aGUgc3RhY2sKKwlsZHIJeDIsIFtzcF0sICMxNgorCiAJLy8gTm93IHJlc3RvcmUgdGhlIGhvc3QgcmVncwogCXJlc3RvcmVfY2FsbGVlX3NhdmVkX3JlZ3MgeDIKIAotCW1vdgl4MCwgeDEKLQlyZXQKKwkvLyBJZiB3ZSBoYXZlIGEgcGVuZGluZyBhc3luY2hyb25vdXMgYWJvcnQsIG5vdyBpcyB0aGUKKwkvLyB0aW1lIHRvIGZpbmQgb3V0LiBGcm9tIHlvdXIgVkFYb3JjaXN0IGJvb2ssIHBhZ2UgNjY2OgorCS8vICJUaHJlYXRlbiBtZSBub3QsIG9oIEV2aWwgb25lISAgRm9yIEkgc3BlYWsgd2l0aAorCS8vIHRoZSBwb3dlciBvZiBERUMsIGFuZCBJIGNvbW1hbmQgdGhlZSB0byBzaG93IHRoeXNlbGYhIgorCW1ycwl4MiwgZWxyX2VsMgorCW1ycwl4MywgZXNyX2VsMgorCW1ycwl4NCwgc3Bzcl9lbDIKKwltb3YJeDUsIHgwCisKKwlkc2IJc3kJCS8vIFN5bmNocm9uaXplIGFnYWluc3QgaW4tZmxpZ2h0IGxkL3N0CisJbXNyCWRhaWZjbHIsICM0CS8vIFVubWFzayBhYm9ydHMKKworCS8vIFRoaXMgaXMgb3VyIHNpbmdsZSBpbnN0cnVjdGlvbiBleGNlcHRpb24gd2luZG93LiBBIHBlbmRpbmcKKwkvLyBTRXJyb3IgaXMgZ3VhcmFudGVlZCB0byBvY2N1ciBhdCB0aGUgZWFybGllc3Qgd2hlbiB3ZSB1bm1hc2sKKwkvLyBpdCwgYW5kIGF0IHRoZSBsYXRlc3QganVzdCBhZnRlciB0aGUgSVNCLgorCS5nbG9iYWwJYWJvcnRfZ3Vlc3RfZXhpdF9zdGFydAorYWJvcnRfZ3Vlc3RfZXhpdF9zdGFydDoKKworCWlzYgorCisJLmdsb2JhbAlhYm9ydF9ndWVzdF9leGl0X2VuZAorYWJvcnRfZ3Vlc3RfZXhpdF9lbmQ6CisKKwkvLyBJZiB0aGUgZXhjZXB0aW9uIHRvb2sgcGxhY2UsIHJlc3RvcmUgdGhlIEVMMSBleGNlcHRpb24KKwkvLyBjb250ZXh0IHNvIHRoYXQgd2UgY2FuIHJlcG9ydCBzb21lIGluZm9ybWF0aW9uLgorCS8vIE1lcmdlIHRoZSBleGNlcHRpb24gY29kZSB3aXRoIHRoZSBTRXJyb3IgcGVuZGluZyBiaXQuCisJdGJ6CXgwLCAjQVJNX0VYSVRfV0lUSF9TRVJST1JfQklULCAxZgorCW1zcgllbHJfZWwyLCB4MgorCW1zcgllc3JfZWwyLCB4MworCW1zcglzcHNyX2VsMiwgeDQKKwlvcnIJeDAsIHgwLCB4NQorMToJcmV0CiBFTkRQUk9DKF9fZ3Vlc3RfZXhpdCkKIAogRU5UUlkoX19mcHNpbWRfZ3Vlc3RfcmVzdG9yZSkKKwlzdHAJeDIsIHgzLCBbc3AsICMtMTZdIQogCXN0cAl4NCwgbHIsIFtzcCwgIy0xNl0hCiAKIGFsdGVybmF0aXZlX2lmX25vdCBBUk02NF9IQVNfVklSVF9IT1NUX0VYVE4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9oeXAtZW50cnkuUyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9oeXAtZW50cnkuUwppbmRleCBmNmQ5Njk0Li40ZTkyMzk5IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvaHlwLWVudHJ5LlMKKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL2h5cC1lbnRyeS5TCkBAIC0yNywxNiArMjcsNiBAQAogCS50ZXh0CiAJLnB1c2hzZWN0aW9uCS5oeXAudGV4dCwgImF4IgogCi0ubWFjcm8Jc2F2ZV94MF90b194MwotCXN0cAl4MCwgeDEsIFtzcCwgIy0xNl0hCi0Jc3RwCXgyLCB4MywgW3NwLCAjLTE2XSEKLS5lbmRtCi0KLS5tYWNybwlyZXN0b3JlX3gwX3RvX3gzCi0JbGRwCXgyLCB4MywgW3NwXSwgIzE2Ci0JbGRwCXgwLCB4MSwgW3NwXSwgIzE2Ci0uZW5kbQotCiAubWFjcm8gZG9fZWwyX2NhbGwKIAkvKgogCSAqIFNodWZmbGUgdGhlIHBhcmFtZXRlcnMgYmVmb3JlIGNhbGxpbmcgdGhlIGZ1bmN0aW9uCkBAIC03OSwyMyArNjksMjMgQEAKIEVORFBST0MoX19rdm1faHlwX3RlYXJkb3duKQogCQogZWwxX3N5bmM6CQkJCS8vIEd1ZXN0IHRyYXBwZWQgaW50byBFTDIKLQlzYXZlX3gwX3RvX3gzCisJc3RwCXgwLCB4MSwgW3NwLCAjLTE2XSEKIAogYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X0hBU19WSVJUX0hPU1RfRVhUTgogCW1ycwl4MSwgZXNyX2VsMgogYWx0ZXJuYXRpdmVfZWxzZQogCW1ycwl4MSwgZXNyX2VsMQogYWx0ZXJuYXRpdmVfZW5kaWYKLQlsc3IJeDIsIHgxLCAjRVNSX0VMeF9FQ19TSElGVAorCWxzcgl4MCwgeDEsICNFU1JfRUx4X0VDX1NISUZUCiAKLQljbXAJeDIsICNFU1JfRUx4X0VDX0hWQzY0CisJY21wCXgwLCAjRVNSX0VMeF9FQ19IVkM2NAogCWIubmUJZWwxX3RyYXAKIAotCW1ycwl4MywgdnR0YnJfZWwyCQkvLyBJZiB2dHRiciBpcyB2YWxpZCwgdGhlIDY0Yml0IGd1ZXN0Ci0JY2Juegl4MywgZWwxX3RyYXAJCS8vIGNhbGxlZCBIVkMKKwltcnMJeDEsIHZ0dGJyX2VsMgkJLy8gSWYgdnR0YnIgaXMgdmFsaWQsIHRoZSA2NGJpdCBndWVzdAorCWNibnoJeDEsIGVsMV90cmFwCQkvLyBjYWxsZWQgSFZDCiAKIAkvKiBIZXJlLCB3ZSdyZSBwcmV0dHkgc3VyZSB0aGUgaG9zdCBjYWxsZWQgSFZDLiAqLwotCXJlc3RvcmVfeDBfdG9feDMKKwlsZHAJeDAsIHgxLCBbc3BdLCAjMTYKIAogCWNtcAl4MCwgI0hWQ19HRVRfVkVDVE9SUwogCWIubmUJMWYKQEAgLTExMywyNCArMTAzLDUxIEBACiAKIGVsMV90cmFwOgogCS8qCi0JICogeDE6IEVTUgotCSAqIHgyOiBFU1JfRUMKKwkgKiB4MDogRVNSX0VDCiAJICovCiAKIAkvKiBHdWVzdCBhY2Nlc3NlZCBWRlAvU0lNRCByZWdpc3RlcnMsIHNhdmUgaG9zdCwgcmVzdG9yZSBHdWVzdCAqLwotCWNtcAl4MiwgI0VTUl9FTHhfRUNfRlBfQVNJTUQKKwljbXAJeDAsICNFU1JfRUx4X0VDX0ZQX0FTSU1ECiAJYi5lcQlfX2Zwc2ltZF9ndWVzdF9yZXN0b3JlCiAKLQltcnMJeDAsIHRwaWRyX2VsMgotCW1vdgl4MSwgI0FSTV9FWENFUFRJT05fVFJBUAorCW1ycwl4MSwgdHBpZHJfZWwyCisJbW92CXgwLCAjQVJNX0VYQ0VQVElPTl9UUkFQCiAJYglfX2d1ZXN0X2V4aXQKIAogZWwxX2lycToKLQlzYXZlX3gwX3RvX3gzCi0JbXJzCXgwLCB0cGlkcl9lbDIKLQltb3YJeDEsICNBUk1fRVhDRVBUSU9OX0lSUQorCXN0cCAgICAgeDAsIHgxLCBbc3AsICMtMTZdIQorCW1ycwl4MSwgdHBpZHJfZWwyCisJbW92CXgwLCAjQVJNX0VYQ0VQVElPTl9JUlEKIAliCV9fZ3Vlc3RfZXhpdAogCitlbDFfZXJyb3I6CisJc3RwICAgICB4MCwgeDEsIFtzcCwgIy0xNl0hCisJbXJzCXgxLCB0cGlkcl9lbDIKKwltb3YJeDAsICNBUk1fRVhDRVBUSU9OX0VMMV9TRVJST1IKKwliCV9fZ3Vlc3RfZXhpdAorCitlbDJfZXJyb3I6CisJLyoKKwkgKiBPbmx5IHR3byBwb3NzaWJpbGl0aWVzOgorCSAqIDEpIEVpdGhlciB3ZSBjb21lIGZyb20gdGhlIGV4aXQgcGF0aCwgaGF2aW5nIGp1c3QgdW5tYXNrZWQKKwkgKiAgICBQU1RBVEUuQTogY2hhbmdlIHRoZSByZXR1cm4gY29kZSB0byBhbiBFTDIgZmF1bHQsIGFuZAorCSAqICAgIGNhcnJ5IG9uLCBhcyB3ZSdyZSBhbHJlYWR5IGluIGEgc2FuZSBzdGF0ZSB0byBoYW5kbGUgaXQuCisJICogMikgT3Igd2UgY29tZSBmcm9tIGFueXdoZXJlIGVsc2UsIGFuZCB0aGF0J3MgYSBidWc6IHdlIHBhbmljLgorCSAqCisJICogRm9yICgxKSwgeDAgY29udGFpbnMgdGhlIG9yaWdpbmFsIHJldHVybiBjb2RlIGFuZCB4MSBkb2Vzbid0CisJICogY29udGFpbiBhbnl0aGluZyBtZWFuaW5nZnVsIGF0IHRoYXQgc3RhZ2UuIFdlIGNhbiByZXVzZSB0aGVtCisJICogYXMgdGVtcCByZWdpc3RlcnMuCisJICogRm9yICgyKSwgd2hvIGNhcmVzPworCSAqLworCW1ycwl4MCwgZWxyX2VsMgorCWFkcgl4MSwgYWJvcnRfZ3Vlc3RfZXhpdF9zdGFydAorCWNtcAl4MCwgeDEKKwlhZHIJeDEsIGFib3J0X2d1ZXN0X2V4aXRfZW5kCisJY2NtcAl4MCwgeDEsICM0LCBuZQorCWIubmUJX19oeXBfcGFuaWMKKwltb3YJeDAsICMoMSA8PCBBUk1fRVhJVF9XSVRIX1NFUlJPUl9CSVQpCisJZXJldAorCiBFTlRSWShfX2h5cF9kb19wYW5pYykKIAltb3YJbHIsICMoUFNSX0ZfQklUIHwgUFNSX0lfQklUIHwgUFNSX0FfQklUIHwgUFNSX0RfQklUIHxcCiAJCSAgICAgIFBTUl9NT0RFX0VMMWgpCkBAIC0xNTUsMTEgKzE3Miw5IEBACiAJaW52YWxpZF92ZWN0b3IJZWwyaF9zeW5jX2ludmFsaWQKIAlpbnZhbGlkX3ZlY3RvcgllbDJoX2lycV9pbnZhbGlkCiAJaW52YWxpZF92ZWN0b3IJZWwyaF9maXFfaW52YWxpZAotCWludmFsaWRfdmVjdG9yCWVsMmhfZXJyb3JfaW52YWxpZAogCWludmFsaWRfdmVjdG9yCWVsMV9zeW5jX2ludmFsaWQKIAlpbnZhbGlkX3ZlY3RvcgllbDFfaXJxX2ludmFsaWQKIAlpbnZhbGlkX3ZlY3RvcgllbDFfZmlxX2ludmFsaWQKLQlpbnZhbGlkX3ZlY3RvcgllbDFfZXJyb3JfaW52YWxpZAogCiAJLmx0b3JnCiAKQEAgLTE3NCwxNSArMTg5LDE1IEBACiAJdmVudHJ5CWVsMmhfc3luY19pbnZhbGlkCQkvLyBTeW5jaHJvbm91cyBFTDJoCiAJdmVudHJ5CWVsMmhfaXJxX2ludmFsaWQJCS8vIElSUSBFTDJoCiAJdmVudHJ5CWVsMmhfZmlxX2ludmFsaWQJCS8vIEZJUSBFTDJoCi0JdmVudHJ5CWVsMmhfZXJyb3JfaW52YWxpZAkJLy8gRXJyb3IgRUwyaAorCXZlbnRyeQllbDJfZXJyb3IJCQkvLyBFcnJvciBFTDJoCiAKIAl2ZW50cnkJZWwxX3N5bmMJCQkvLyBTeW5jaHJvbm91cyA2NC1iaXQgRUwxCiAJdmVudHJ5CWVsMV9pcnEJCQkJLy8gSVJRIDY0LWJpdCBFTDEKIAl2ZW50cnkJZWwxX2ZpcV9pbnZhbGlkCQkJLy8gRklRIDY0LWJpdCBFTDEKLQl2ZW50cnkJZWwxX2Vycm9yX2ludmFsaWQJCS8vIEVycm9yIDY0LWJpdCBFTDEKKwl2ZW50cnkJZWwxX2Vycm9yCQkJLy8gRXJyb3IgNjQtYml0IEVMMQogCiAJdmVudHJ5CWVsMV9zeW5jCQkJLy8gU3luY2hyb25vdXMgMzItYml0IEVMMQogCXZlbnRyeQllbDFfaXJxCQkJCS8vIElSUSAzMi1iaXQgRUwxCiAJdmVudHJ5CWVsMV9maXFfaW52YWxpZAkJCS8vIEZJUSAzMi1iaXQgRUwxCi0JdmVudHJ5CWVsMV9lcnJvcl9pbnZhbGlkCQkvLyBFcnJvciAzMi1iaXQgRUwxCisJdmVudHJ5CWVsMV9lcnJvcgkJCS8vIEVycm9yIDMyLWJpdCBFTDEKIEVORFBST0MoX19rdm1faHlwX3ZlY3RvcikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC9zd2l0Y2guYyBiL2FyY2gvYXJtNjQva3ZtL2h5cC9zd2l0Y2guYwppbmRleCA1YTg0YjQ1Li44MzAzN2NkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvc3dpdGNoLmMKKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL3N3aXRjaC5jCkBAIC0xNiw3ICsxNiwxMCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KKwogI2luY2x1ZGUgPGFzbS9rdm1fYXNtLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9lbXVsYXRlLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9oeXAuaD4KIAogc3RhdGljIGJvb2wgX19oeXBfdGV4dCBfX2Zwc2ltZF9lbmFibGVkX252aGUodm9pZCkKQEAgLTEwOSw2ICsxMTIsMTUgQEAKIAogc3RhdGljIHZvaWQgX19oeXBfdGV4dCBfX2RlYWN0aXZhdGVfdHJhcHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCS8qCisJICogSWYgd2UgcGVuZGVkIGEgdmlydHVhbCBhYm9ydCwgcHJlc2VydmUgaXQgdW50aWwgaXQgZ2V0cworCSAqIGNsZWFyZWQuIFNlZSBEMS4xNC4zIChWaXJ0dWFsIEludGVycnVwdHMpIGZvciBkZXRhaWxzLCBidXQKKwkgKiB0aGUgY3J1Y2lhbCBiaXQgaXMgIk9uIHRha2luZyBhIHZTRXJyb3IgaW50ZXJydXB0LAorCSAqIEhDUl9FTDIuVlNFIGlzIGNsZWFyZWQgdG8gMC4iCisJICovCisJaWYgKHZjcHUtPmFyY2guaGNyX2VsMiAmIEhDUl9WU0UpCisJCXZjcHUtPmFyY2guaGNyX2VsMiA9IHJlYWRfc3lzcmVnKGhjcl9lbDIpOworCiAJX19kZWFjdGl2YXRlX3RyYXBzX2FyY2goKSgpOwogCXdyaXRlX3N5c3JlZygwLCBoc3RyX2VsMik7CiAJd3JpdGVfc3lzcmVnKHJlYWRfc3lzcmVnKG1kY3JfZWwyKSAmIE1EQ1JfRUwyX0hQTU5fTUFTSywgbWRjcl9lbDIpOwpAQCAtMTI2LDE3ICsxMzgsMTMgQEAKIAl3cml0ZV9zeXNyZWcoMCwgdnR0YnJfZWwyKTsKIH0KIAotc3RhdGljIGh5cF9hbHRlcm5hdGVfc2VsZWN0KF9fdmdpY19jYWxsX3NhdmVfc3RhdGUsCi0JCQkgICAgX192Z2ljX3YyX3NhdmVfc3RhdGUsIF9fdmdpY192M19zYXZlX3N0YXRlLAotCQkJICAgIEFSTTY0X0hBU19TWVNSRUdfR0lDX0NQVUlGKTsKLQotc3RhdGljIGh5cF9hbHRlcm5hdGVfc2VsZWN0KF9fdmdpY19jYWxsX3Jlc3RvcmVfc3RhdGUsCi0JCQkgICAgX192Z2ljX3YyX3Jlc3RvcmVfc3RhdGUsIF9fdmdpY192M19yZXN0b3JlX3N0YXRlLAotCQkJICAgIEFSTTY0X0hBU19TWVNSRUdfR0lDX0NQVUlGKTsKLQogc3RhdGljIHZvaWQgX19oeXBfdGV4dCBfX3ZnaWNfc2F2ZV9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JX192Z2ljX2NhbGxfc2F2ZV9zdGF0ZSgpKHZjcHUpOworCWlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZrdm1fdmdpY19nbG9iYWxfc3RhdGUuZ2ljdjNfY3B1aWYpKQorCQlfX3ZnaWNfdjNfc2F2ZV9zdGF0ZSh2Y3B1KTsKKwllbHNlCisJCV9fdmdpY192Ml9zYXZlX3N0YXRlKHZjcHUpOworCiAJd3JpdGVfc3lzcmVnKHJlYWRfc3lzcmVnKGhjcl9lbDIpICYgfkhDUl9JTlRfT1ZFUlJJREUsIGhjcl9lbDIpOwogfQogCkBAIC0xNDksNyArMTU3LDEwIEBACiAJdmFsIHw9IHZjcHUtPmFyY2guaXJxX2xpbmVzOwogCXdyaXRlX3N5c3JlZyh2YWwsIGhjcl9lbDIpOwogCi0JX192Z2ljX2NhbGxfcmVzdG9yZV9zdGF0ZSgpKHZjcHUpOworCWlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZrdm1fdmdpY19nbG9iYWxfc3RhdGUuZ2ljdjNfY3B1aWYpKQorCQlfX3ZnaWNfdjNfcmVzdG9yZV9zdGF0ZSh2Y3B1KTsKKwllbHNlCisJCV9fdmdpY192Ml9yZXN0b3JlX3N0YXRlKHZjcHUpOwogfQogCiBzdGF0aWMgYm9vbCBfX2h5cF90ZXh0IF9fdHJ1ZV92YWx1ZSh2b2lkKQpAQCAtMjMyLDcgKzI0MywyMiBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IF9faHlwX3RleHQgX19ndWVzdF9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIHZvaWQgX19oeXBfdGV4dCBfX3NraXBfaW5zdHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCSp2Y3B1X3BjKHZjcHUpID0gcmVhZF9zeXNyZWdfZWwyKGVscik7CisKKwlpZiAodmNwdV9tb2RlX2lzXzMyYml0KHZjcHUpKSB7CisJCXZjcHUtPmFyY2guY3R4dC5ncF9yZWdzLnJlZ3MucHN0YXRlID0gcmVhZF9zeXNyZWdfZWwyKHNwc3IpOworCQlrdm1fc2tpcF9pbnN0cjMyKHZjcHUsIGt2bV92Y3B1X3RyYXBfaWxfaXMzMmJpdCh2Y3B1KSk7CisJCXdyaXRlX3N5c3JlZ19lbDIodmNwdS0+YXJjaC5jdHh0LmdwX3JlZ3MucmVncy5wc3RhdGUsIHNwc3IpOworCX0gZWxzZSB7CisJCSp2Y3B1X3BjKHZjcHUpICs9IDQ7CisJfQorCisJd3JpdGVfc3lzcmVnX2VsMigqdmNwdV9wYyh2Y3B1KSwgZWxyKTsKK30KKworaW50IF9faHlwX3RleHQgX19rdm1fdmNwdV9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCBrdm1fY3B1X2NvbnRleHQgKmhvc3RfY3R4dDsKIAlzdHJ1Y3Qga3ZtX2NwdV9jb250ZXh0ICpndWVzdF9jdHh0OwpAQCAtMjY3LDkgKzI5Myw0MyBAQAogCWV4aXRfY29kZSA9IF9fZ3Vlc3RfZW50ZXIodmNwdSwgaG9zdF9jdHh0KTsKIAkvKiBBbmQgd2UncmUgYmFhYWNrISAqLwogCisJLyoKKwkgKiBXZSdyZSB1c2luZyB0aGUgcmF3IGV4Y2VwdGlvbiBjb2RlIGluIG9yZGVyIHRvIG9ubHkgcHJvY2VzcworCSAqIHRoZSB0cmFwIGlmIG5vIFNFcnJvciBpcyBwZW5kaW5nLiBXZSB3aWxsIGNvbWUgYmFjayB0byB0aGUKKwkgKiBzYW1lIFBDIG9uY2UgdGhlIFNFcnJvciBoYXMgYmVlbiBpbmplY3RlZCwgYW5kIHJlcGxheSB0aGUKKwkgKiB0cmFwcGluZyBpbnN0cnVjdGlvbi4KKwkgKi8KIAlpZiAoZXhpdF9jb2RlID09IEFSTV9FWENFUFRJT05fVFJBUCAmJiAhX19wb3B1bGF0ZV9mYXVsdF9pbmZvKHZjcHUpKQogCQlnb3RvIGFnYWluOwogCisJaWYgKHN0YXRpY19icmFuY2hfdW5saWtlbHkoJnZnaWNfdjJfY3B1aWZfdHJhcCkgJiYKKwkgICAgZXhpdF9jb2RlID09IEFSTV9FWENFUFRJT05fVFJBUCkgeworCQlib29sIHZhbGlkOworCisJCXZhbGlkID0ga3ZtX3ZjcHVfdHJhcF9nZXRfY2xhc3ModmNwdSkgPT0gRVNSX0VMeF9FQ19EQUJUX0xPVyAmJgorCQkJa3ZtX3ZjcHVfdHJhcF9nZXRfZmF1bHRfdHlwZSh2Y3B1KSA9PSBGU0NfRkFVTFQgJiYKKwkJCWt2bV92Y3B1X2RhYnRfaXN2YWxpZCh2Y3B1KSAmJgorCQkJIWt2bV92Y3B1X2RhYnRfaXNleHRhYnQodmNwdSkgJiYKKwkJCSFrdm1fdmNwdV9kYWJ0X2lzczF0dyh2Y3B1KTsKKworCQlpZiAodmFsaWQpIHsKKwkJCWludCByZXQgPSBfX3ZnaWNfdjJfcGVyZm9ybV9jcHVpZl9hY2Nlc3ModmNwdSk7CisKKwkJCWlmIChyZXQgPT0gMSkgeworCQkJCV9fc2tpcF9pbnN0cih2Y3B1KTsKKwkJCQlnb3RvIGFnYWluOworCQkJfQorCisJCQlpZiAocmV0ID09IC0xKSB7CisJCQkJLyogUHJvbW90ZSBhbiBpbGxlZ2FsIGFjY2VzcyB0byBhbiBTRXJyb3IgKi8KKwkJCQlfX3NraXBfaW5zdHIodmNwdSk7CisJCQkJZXhpdF9jb2RlID0gQVJNX0VYQ0VQVElPTl9FTDFfU0VSUk9SOworCQkJfQorCisJCQkvKiAwIGZhbGxzIHRocm91Z2ggdG8gYmUgaGFuZGxlciBvdXQgb2YgRUwyICovCisJCX0KKwl9CisKIAlmcF9lbmFibGVkID0gX19mcHNpbWRfZW5hYmxlZCgpOwogCiAJX19zeXNyZWdfc2F2ZV9ndWVzdF9zdGF0ZShndWVzdF9jdHh0KTsKQEAgLTI5Myw4ICszNTMsNiBAQAogCXJldHVybiBleGl0X2NvZGU7CiB9CiAKLV9fYWxpYXMoX19ndWVzdF9ydW4pIGludCBfX2t2bV92Y3B1X3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwotCiBzdGF0aWMgY29uc3QgY2hhciBfX2h5cF9wYW5pY19zdHJpbmdbXSA9ICJIWVAgcGFuaWM6XG5QUzolMDhsbHggUEM6JTAxNmxseCBFU1I6JTA4bGx4XG5GQVI6JTAxNmxseCBIUEZBUjolMDE2bGx4IFBBUjolMDE2bGx4XG5WQ1BVOiVwXG4iOwogCiBzdGF0aWMgdm9pZCBfX2h5cF90ZXh0IF9faHlwX2NhbGxfcGFuaWNfbnZoZSh1NjQgc3BzciwgdTY0IGVsciwgdTY0IHBhcikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL2h5cC90bGIuYyBiL2FyY2gvYXJtNjQva3ZtL2h5cC90bGIuYwppbmRleCBiZTgxNzdjLi45Y2MwZWE3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9oeXAvdGxiLmMKKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL3RsYi5jCkBAIC0xNyw3ICsxNyw3IEBACiAKICNpbmNsdWRlIDxhc20va3ZtX2h5cC5oPgogCi1zdGF0aWMgdm9pZCBfX2h5cF90ZXh0IF9fdGxiX2ZsdXNoX3ZtaWRfaXBhKHN0cnVjdCBrdm0gKmt2bSwgcGh5c19hZGRyX3QgaXBhKQordm9pZCBfX2h5cF90ZXh0IF9fa3ZtX3RsYl9mbHVzaF92bWlkX2lwYShzdHJ1Y3Qga3ZtICprdm0sIHBoeXNfYWRkcl90IGlwYSkKIHsKIAlkc2IoaXNoc3QpOwogCkBAIC00OCwxMCArNDgsNyBAQAogCXdyaXRlX3N5c3JlZygwLCB2dHRicl9lbDIpOwogfQogCi1fX2FsaWFzKF9fdGxiX2ZsdXNoX3ZtaWRfaXBhKSB2b2lkIF9fa3ZtX3RsYl9mbHVzaF92bWlkX2lwYShzdHJ1Y3Qga3ZtICprdm0sCi0JCQkJCQkJICAgIHBoeXNfYWRkcl90IGlwYSk7Ci0KLXN0YXRpYyB2b2lkIF9faHlwX3RleHQgX190bGJfZmx1c2hfdm1pZChzdHJ1Y3Qga3ZtICprdm0pCit2b2lkIF9faHlwX3RleHQgX19rdm1fdGxiX2ZsdXNoX3ZtaWQoc3RydWN0IGt2bSAqa3ZtKQogewogCWRzYihpc2hzdCk7CiAKQEAgLTY3LDE0ICs2NCwxMCBAQAogCXdyaXRlX3N5c3JlZygwLCB2dHRicl9lbDIpOwogfQogCi1fX2FsaWFzKF9fdGxiX2ZsdXNoX3ZtaWQpIHZvaWQgX19rdm1fdGxiX2ZsdXNoX3ZtaWQoc3RydWN0IGt2bSAqa3ZtKTsKLQotc3RhdGljIHZvaWQgX19oeXBfdGV4dCBfX3RsYl9mbHVzaF92bV9jb250ZXh0KHZvaWQpCit2b2lkIF9faHlwX3RleHQgX19rdm1fZmx1c2hfdm1fY29udGV4dCh2b2lkKQogewogCWRzYihpc2hzdCk7CiAJYXNtIHZvbGF0aWxlKCJ0bGJpIGFsbGUxaXMJXG4iCiAJCSAgICAgImljIGlhbGx1aXMJICAiOiA6ICk7CiAJZHNiKGlzaCk7CiB9Ci0KLV9fYWxpYXMoX190bGJfZmx1c2hfdm1fY29udGV4dCkgdm9pZCBfX2t2bV9mbHVzaF92bV9jb250ZXh0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwL3ZnaWMtdjMtc3IuYyBiL2FyY2gvYXJtNjQva3ZtL2h5cC92Z2ljLXYzLXNyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOGY4MGIuLjAwMDAwMDAKLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL3ZnaWMtdjMtc3IuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTUgLSBBUk0gTHRkCi0gKiBBdXRob3I6IE1hcmMgWnluZ2llciA8bWFyYy56eW5naWVyQGFybS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2FybS1naWMtdjMuaD4KLSNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgotCi0jaW5jbHVkZSA8YXNtL2t2bV9oeXAuaD4KLQotI2RlZmluZSB2dHJfdG9fbWF4X2xyX2lkeCh2KQkJKCh2KSAmIDB4ZikKLSNkZWZpbmUgdnRyX3RvX25yX3ByaV9iaXRzKHYpCQkoKCh1MzIpKHYpID4+IDI5KSArIDEpCi0KLSNkZWZpbmUgcmVhZF9naWNyZWcocikJCQkJCQkJXAotCSh7CQkJCQkJCQlcCi0JCXU2NCByZWc7CQkJCQkJXAotCQlhc20gdm9sYXRpbGUoIm1yc19zICUwLCAiIF9fc3RyaW5naWZ5KHIpIDogIj1yIiAocmVnKSk7CVwKLQkJcmVnOwkJCQkJCQlcCi0JfSkKLQotI2RlZmluZSB3cml0ZV9naWNyZWcodixyKQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCXU2NCBfX3ZhbCA9ICh2KTsJCQkJCVwKLQkJYXNtIHZvbGF0aWxlKCJtc3JfcyAiIF9fc3RyaW5naWZ5KHIpICIsICUwIiA6IDogInIiIChfX3ZhbCkpO1wKLQl9IHdoaWxlICgwKQotCi1zdGF0aWMgdTY0IF9faHlwX3RleHQgX19naWNfdjNfZ2V0X2xyKHVuc2lnbmVkIGludCBscikKLXsKLQlzd2l0Y2ggKGxyICYgMHhmKSB7Ci0JY2FzZSAwOgotCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSMF9FTDIpOwotCWNhc2UgMToKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjFfRUwyKTsKLQljYXNlIDI6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIyX0VMMik7Ci0JY2FzZSAzOgotCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSM19FTDIpOwotCWNhc2UgNDoKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjRfRUwyKTsKLQljYXNlIDU6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFI1X0VMMik7Ci0JY2FzZSA2OgotCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSNl9FTDIpOwotCWNhc2UgNzoKLQkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjdfRUwyKTsKLQljYXNlIDg6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFI4X0VMMik7Ci0JY2FzZSA5OgotCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSOV9FTDIpOwotCWNhc2UgMTA6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIxMF9FTDIpOwotCWNhc2UgMTE6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIxMV9FTDIpOwotCWNhc2UgMTI6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIxMl9FTDIpOwotCWNhc2UgMTM6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIxM19FTDIpOwotCWNhc2UgMTQ6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIxNF9FTDIpOwotCWNhc2UgMTU6Ci0JCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIxNV9FTDIpOwotCX0KLQotCXVucmVhY2hhYmxlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faHlwX3RleHQgX19naWNfdjNfc2V0X2xyKHU2NCB2YWwsIGludCBscikKLXsKLQlzd2l0Y2ggKGxyICYgMHhmKSB7Ci0JY2FzZSAwOgotCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFIwX0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMV9FTDIpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjJfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFIzX0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSNF9FTDIpOwotCQlicmVhazsKLQljYXNlIDU6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjVfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFI2X0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgNzoKLQkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSN19FTDIpOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjhfRUwyKTsKLQkJYnJlYWs7Ci0JY2FzZSA5OgotCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFI5X0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgMTA6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjEwX0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgMTE6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjExX0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgMTI6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjEyX0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgMTM6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjEzX0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgMTQ6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjE0X0VMMik7Ci0JCWJyZWFrOwotCWNhc2UgMTU6Ci0JCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjE1X0VMMik7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19oeXBfdGV4dCBzYXZlX21haW50X2ludF9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBucl9scikKLXsKLQlzdHJ1Y3QgdmdpY192M19jcHVfaWYgKmNwdV9pZiA9ICZ2Y3B1LT5hcmNoLnZnaWNfY3B1LnZnaWNfdjM7Ci0JaW50IGk7Ci0JYm9vbCBleHBlY3RfbWk7Ci0KLQlleHBlY3RfbWkgPSAhIShjcHVfaWYtPnZnaWNfaGNyICYgSUNIX0hDUl9VSUUpOwotCi0JZm9yIChpID0gMDsgaSA8IG5yX2xyOyBpKyspIHsKLQkJaWYgKCEodmNwdS0+YXJjaC52Z2ljX2NwdS5saXZlX2xycyAmICgxVUwgPDwgaSkpKQotCQkJCWNvbnRpbnVlOwotCi0JCWV4cGVjdF9taSB8PSAoIShjcHVfaWYtPnZnaWNfbHJbaV0gJiBJQ0hfTFJfSFcpICYmCi0JCQkgICAgICAoY3B1X2lmLT52Z2ljX2xyW2ldICYgSUNIX0xSX0VPSSkpOwotCX0KLQotCWlmIChleHBlY3RfbWkpIHsKLQkJY3B1X2lmLT52Z2ljX21pc3IgID0gcmVhZF9naWNyZWcoSUNIX01JU1JfRUwyKTsKLQotCQlpZiAoY3B1X2lmLT52Z2ljX21pc3IgJiBJQ0hfTUlTUl9FT0kpCi0JCQljcHVfaWYtPnZnaWNfZWlzciA9IHJlYWRfZ2ljcmVnKElDSF9FSVNSX0VMMik7Ci0JCWVsc2UKLQkJCWNwdV9pZi0+dmdpY19laXNyID0gMDsKLQl9IGVsc2UgewotCQljcHVfaWYtPnZnaWNfbWlzciA9IDA7Ci0JCWNwdV9pZi0+dmdpY19laXNyID0gMDsKLQl9Ci19Ci0KLXZvaWQgX19oeXBfdGV4dCBfX3ZnaWNfdjNfc2F2ZV9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0Jc3RydWN0IHZnaWNfdjNfY3B1X2lmICpjcHVfaWYgPSAmdmNwdS0+YXJjaC52Z2ljX2NwdS52Z2ljX3YzOwotCXU2NCB2YWw7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSBzdG9yZXMgdG8gdGhlIEdJQyB2aWEgdGhlIG1lbW9yeSBtYXBwZWQgaW50ZXJmYWNlCi0JICogYXJlIG5vdyB2aXNpYmxlIHRvIHRoZSBzeXN0ZW0gcmVnaXN0ZXIgaW50ZXJmYWNlLgotCSAqLwotCWlmICghY3B1X2lmLT52Z2ljX3NyZSkKLQkJZHNiKHN0KTsKLQotCWNwdV9pZi0+dmdpY192bWNyICA9IHJlYWRfZ2ljcmVnKElDSF9WTUNSX0VMMik7Ci0KLQlpZiAodmNwdS0+YXJjaC52Z2ljX2NwdS5saXZlX2xycykgewotCQlpbnQgaTsKLQkJdTMyIG1heF9scl9pZHgsIG5yX3ByaV9iaXRzOwotCi0JCWNwdV9pZi0+dmdpY19lbHJzciA9IHJlYWRfZ2ljcmVnKElDSF9FTFNSX0VMMik7Ci0KLQkJd3JpdGVfZ2ljcmVnKDAsIElDSF9IQ1JfRUwyKTsKLQkJdmFsID0gcmVhZF9naWNyZWcoSUNIX1ZUUl9FTDIpOwotCQltYXhfbHJfaWR4ID0gdnRyX3RvX21heF9scl9pZHgodmFsKTsKLQkJbnJfcHJpX2JpdHMgPSB2dHJfdG9fbnJfcHJpX2JpdHModmFsKTsKLQotCQlzYXZlX21haW50X2ludF9zdGF0ZSh2Y3B1LCBtYXhfbHJfaWR4ICsgMSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8PSBtYXhfbHJfaWR4OyBpKyspIHsKLQkJCWlmICghKHZjcHUtPmFyY2gudmdpY19jcHUubGl2ZV9scnMgJiAoMVVMIDw8IGkpKSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKGNwdV9pZi0+dmdpY19lbHJzciAmICgxIDw8IGkpKQotCQkJCWNwdV9pZi0+dmdpY19scltpXSAmPSB+SUNIX0xSX1NUQVRFOwotCQkJZWxzZQotCQkJCWNwdV9pZi0+dmdpY19scltpXSA9IF9fZ2ljX3YzX2dldF9scihpKTsKLQotCQkJX19naWNfdjNfc2V0X2xyKDAsIGkpOwotCQl9Ci0KLQkJc3dpdGNoIChucl9wcmlfYml0cykgewotCQljYXNlIDc6Ci0JCQljcHVfaWYtPnZnaWNfYXAwclszXSA9IHJlYWRfZ2ljcmVnKElDSF9BUDBSM19FTDIpOwotCQkJY3B1X2lmLT52Z2ljX2FwMHJbMl0gPSByZWFkX2dpY3JlZyhJQ0hfQVAwUjJfRUwyKTsKLQkJY2FzZSA2OgotCQkJY3B1X2lmLT52Z2ljX2FwMHJbMV0gPSByZWFkX2dpY3JlZyhJQ0hfQVAwUjFfRUwyKTsKLQkJZGVmYXVsdDoKLQkJCWNwdV9pZi0+dmdpY19hcDByWzBdID0gcmVhZF9naWNyZWcoSUNIX0FQMFIwX0VMMik7Ci0JCX0KLQotCQlzd2l0Y2ggKG5yX3ByaV9iaXRzKSB7Ci0JCWNhc2UgNzoKLQkJCWNwdV9pZi0+dmdpY19hcDFyWzNdID0gcmVhZF9naWNyZWcoSUNIX0FQMVIzX0VMMik7Ci0JCQljcHVfaWYtPnZnaWNfYXAxclsyXSA9IHJlYWRfZ2ljcmVnKElDSF9BUDFSMl9FTDIpOwotCQljYXNlIDY6Ci0JCQljcHVfaWYtPnZnaWNfYXAxclsxXSA9IHJlYWRfZ2ljcmVnKElDSF9BUDFSMV9FTDIpOwotCQlkZWZhdWx0OgotCQkJY3B1X2lmLT52Z2ljX2FwMXJbMF0gPSByZWFkX2dpY3JlZyhJQ0hfQVAxUjBfRUwyKTsKLQkJfQotCi0JCXZjcHUtPmFyY2gudmdpY19jcHUubGl2ZV9scnMgPSAwOwotCX0gZWxzZSB7Ci0JCWNwdV9pZi0+dmdpY19taXNyICA9IDA7Ci0JCWNwdV9pZi0+dmdpY19laXNyICA9IDA7Ci0JCWNwdV9pZi0+dmdpY19lbHJzciA9IDB4ZmZmZjsKLQkJY3B1X2lmLT52Z2ljX2FwMHJbMF0gPSAwOwotCQljcHVfaWYtPnZnaWNfYXAwclsxXSA9IDA7Ci0JCWNwdV9pZi0+dmdpY19hcDByWzJdID0gMDsKLQkJY3B1X2lmLT52Z2ljX2FwMHJbM10gPSAwOwotCQljcHVfaWYtPnZnaWNfYXAxclswXSA9IDA7Ci0JCWNwdV9pZi0+dmdpY19hcDFyWzFdID0gMDsKLQkJY3B1X2lmLT52Z2ljX2FwMXJbMl0gPSAwOwotCQljcHVfaWYtPnZnaWNfYXAxclszXSA9IDA7Ci0JfQotCi0JdmFsID0gcmVhZF9naWNyZWcoSUNDX1NSRV9FTDIpOwotCXdyaXRlX2dpY3JlZyh2YWwgfCBJQ0NfU1JFX0VMMl9FTkFCTEUsIElDQ19TUkVfRUwyKTsKLQotCWlmICghY3B1X2lmLT52Z2ljX3NyZSkgewotCQkvKiBNYWtlIHN1cmUgRU5BQkxFIGlzIHNldCBhdCBFTDIgYmVmb3JlIHNldHRpbmcgU1JFIGF0IEVMMSAqLwotCQlpc2IoKTsKLQkJd3JpdGVfZ2ljcmVnKDEsIElDQ19TUkVfRUwxKTsKLQl9Ci19Ci0KLXZvaWQgX19oeXBfdGV4dCBfX3ZnaWNfdjNfcmVzdG9yZV9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0Jc3RydWN0IHZnaWNfdjNfY3B1X2lmICpjcHVfaWYgPSAmdmNwdS0+YXJjaC52Z2ljX2NwdS52Z2ljX3YzOwotCXU2NCB2YWw7Ci0JdTMyIG1heF9scl9pZHgsIG5yX3ByaV9iaXRzOwotCXUxNiBsaXZlX2xycyA9IDA7Ci0JaW50IGk7Ci0KLQkvKgotCSAqIFZGSVFFbiBpcyBSRVMxIGlmIElDQ19TUkVfRUwxLlNSRSBpcyAxLiBUaGlzIGNhdXNlcyBhCi0JICogR3JvdXAwIGludGVycnVwdCAoYXMgZ2VuZXJhdGVkIGluIEdJQ3YyIG1vZGUpIHRvIGJlCi0JICogZGVsaXZlcmVkIGFzIGEgRklRIHRvIHRoZSBndWVzdCwgd2l0aCBwb3RlbnRpYWxseSBmYXRhbAotCSAqIGNvbnNlcXVlbmNlcy4gU28gd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCBJQ0NfU1JFX0VMMSBoYXMKLQkgKiBiZWVuIGFjdHVhbGx5IHByb2dyYW1tZWQgd2l0aCB0aGUgdmFsdWUgd2Ugd2FudCBiZWZvcmUKLQkgKiBzdGFydGluZyB0byBtZXNzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIEdJQy4KLQkgKi8KLQlpZiAoIWNwdV9pZi0+dmdpY19zcmUpIHsKLQkJd3JpdGVfZ2ljcmVnKDAsIElDQ19TUkVfRUwxKTsKLQkJaXNiKCk7Ci0JfQotCi0JdmFsID0gcmVhZF9naWNyZWcoSUNIX1ZUUl9FTDIpOwotCW1heF9scl9pZHggPSB2dHJfdG9fbWF4X2xyX2lkeCh2YWwpOwotCW5yX3ByaV9iaXRzID0gdnRyX3RvX25yX3ByaV9iaXRzKHZhbCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IG1heF9scl9pZHg7IGkrKykgewotCQlpZiAoY3B1X2lmLT52Z2ljX2xyW2ldICYgSUNIX0xSX1NUQVRFKQotCQkJbGl2ZV9scnMgfD0gKDEgPDwgaSk7Ci0JfQotCi0Jd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY192bWNyLCBJQ0hfVk1DUl9FTDIpOwotCi0JaWYgKGxpdmVfbHJzKSB7Ci0JCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfaGNyLCBJQ0hfSENSX0VMMik7Ci0KLQkJc3dpdGNoIChucl9wcmlfYml0cykgewotCQljYXNlIDc6Ci0JCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2FwMHJbM10sIElDSF9BUDBSM19FTDIpOwotCQkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19hcDByWzJdLCBJQ0hfQVAwUjJfRUwyKTsKLQkJY2FzZSA2OgotCQkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19hcDByWzFdLCBJQ0hfQVAwUjFfRUwyKTsKLQkJZGVmYXVsdDoKLQkJCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfYXAwclswXSwgSUNIX0FQMFIwX0VMMik7Ci0JCX0KLQotCQlzd2l0Y2ggKG5yX3ByaV9iaXRzKSB7Ci0JCWNhc2UgNzoKLQkJCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfYXAxclszXSwgSUNIX0FQMVIzX0VMMik7Ci0JCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2FwMXJbMl0sIElDSF9BUDFSMl9FTDIpOwotCQljYXNlIDY6Ci0JCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2FwMXJbMV0sIElDSF9BUDFSMV9FTDIpOwotCQlkZWZhdWx0OgotCQkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19hcDFyWzBdLCBJQ0hfQVAxUjBfRUwyKTsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPD0gbWF4X2xyX2lkeDsgaSsrKSB7Ci0JCQlpZiAoIShsaXZlX2xycyAmICgxIDw8IGkpKSkKLQkJCQljb250aW51ZTsKLQotCQkJX19naWNfdjNfc2V0X2xyKGNwdV9pZi0+dmdpY19scltpXSwgaSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEVuc3VyZXMgdGhhdCB0aGUgYWJvdmUgd2lsbCBoYXZlIHJlYWNoZWQgdGhlCi0JICogKHJlKWRpc3RyaWJ1dG9ycy4gVGhpcyBlbnN1cmUgdGhlIGd1ZXN0IHdpbGwgcmVhZCB0aGUKLQkgKiBjb3JyZWN0IHZhbHVlcyBmcm9tIHRoZSBtZW1vcnktbWFwcGVkIGludGVyZmFjZS4KLQkgKi8KLQlpZiAoIWNwdV9pZi0+dmdpY19zcmUpIHsKLQkJaXNiKCk7Ci0JCWRzYihzeSk7Ci0JfQotCXZjcHUtPmFyY2gudmdpY19jcHUubGl2ZV9scnMgPSBsaXZlX2xyczsKLQotCS8qCi0JICogUHJldmVudCB0aGUgZ3Vlc3QgZnJvbSB0b3VjaGluZyB0aGUgR0lDIHN5c3RlbSByZWdpc3RlcnMgaWYKLQkgKiBTUkUgaXNuJ3QgZW5hYmxlZCBmb3IgR0lDdjMgZW11bGF0aW9uLgotCSAqLwotCXdyaXRlX2dpY3JlZyhyZWFkX2dpY3JlZyhJQ0NfU1JFX0VMMikgJiB+SUNDX1NSRV9FTDJfRU5BQkxFLAotCQkgICAgIElDQ19TUkVfRUwyKTsKLX0KLQotdm9pZCBfX2h5cF90ZXh0IF9fdmdpY192M19pbml0X2xycyh2b2lkKQotewotCWludCBtYXhfbHJfaWR4ID0gdnRyX3RvX21heF9scl9pZHgocmVhZF9naWNyZWcoSUNIX1ZUUl9FTDIpKTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPD0gbWF4X2xyX2lkeDsgaSsrKQotCQlfX2dpY192M19zZXRfbHIoMCwgaSk7Ci19Ci0KLXN0YXRpYyB1NjQgX19oeXBfdGV4dCBfX3ZnaWNfdjNfcmVhZF9pY2hfdnRyX2VsMih2b2lkKQotewotCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfVlRSX0VMMik7Ci19Ci0KLV9fYWxpYXMoX192Z2ljX3YzX3JlYWRfaWNoX3Z0cl9lbDIpIHU2NCBfX3ZnaWNfdjNfZ2V0X2ljaF92dHJfZWwyKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaW5qZWN0X2ZhdWx0LmMgYi9hcmNoL2FybTY0L2t2bS9pbmplY3RfZmF1bHQuYwppbmRleCA4OThjMGU2Li5kYTZhOGNmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9pbmplY3RfZmF1bHQuYworKysgYi9hcmNoL2FybTY0L2t2bS9pbmplY3RfZmF1bHQuYwpAQCAtMjMxLDMgKzIzMSwxNSBAQAogCWVsc2UKIAkJaW5qZWN0X3VuZGVmNjQodmNwdSk7CiB9CisKKy8qKgorICoga3ZtX2luamVjdF92YWJ0IC0gaW5qZWN0IGFuIGFzeW5jIGFib3J0IC8gU0Vycm9yIGludG8gdGhlIGd1ZXN0CisgKiBAdmNwdTogVGhlIFZDUFUgdG8gcmVjZWl2ZSB0aGUgZXhjZXB0aW9uCisgKgorICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgY29kZSBpcyBjYWxsZWQgZnJvbSB0aGUgVkNQVSB0aHJlYWQgYW5kIHRoYXQgdGhlCisgKiBWQ1BVIHRoZXJlZm9yZSBpcyBub3QgY3VycmVudGx5IGV4ZWN1dGluZyBndWVzdCBjb2RlLgorICovCit2b2lkIGt2bV9pbmplY3RfdmFidChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdmNwdV9zZXRfaGNyKHZjcHUsIHZjcHVfZ2V0X2hjcih2Y3B1KSB8IEhDUl9WU0UpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vc3lzX3JlZ3MuYyBiL2FyY2gvYXJtNjQva3ZtL3N5c19yZWdzLmMKaW5kZXggZTUxMzY3ZC4uZjMwMmZkYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vc3lzX3JlZ3MuYworKysgYi9hcmNoL2FybTY0L2t2bS9zeXNfcmVncy5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8YXNtL2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9tbXUuaD4KICNpbmNsdWRlIDxhc20vcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGFzbS9zeXNyZWcuaD4KIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9rdm0uaD4KIApAQCAtNjcsMTEgKzY4LDkgQEAKIAogCS8qIE1ha2Ugc3VyZSBub29uZSBlbHNlIGNoYW5nZXMgQ1NTRUxSIGR1cmluZyB0aGlzISAqLwogCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JLyogUHV0IHZhbHVlIGludG8gQ1NTRUxSICovCi0JYXNtIHZvbGF0aWxlKCJtc3IgY3NzZWxyX2VsMSwgJXgwIiA6IDogInIiIChjc3NlbHIpKTsKKwl3cml0ZV9zeXNyZWcoY3NzZWxyLCBjc3NlbHJfZWwxKTsKIAlpc2IoKTsKLQkvKiBSZWFkIHJlc3VsdCBvdXQgb2YgQ0NTSURSICovCi0JYXNtIHZvbGF0aWxlKCJtcnMgJTAsIGNjc2lkcl9lbDEiIDogIj1yIiAoY2NzaWRyKSk7CisJY2NzaWRyID0gcmVhZF9zeXNyZWcoY2NzaWRyX2VsMSk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJcmV0dXJuIGNjc2lkcjsKQEAgLTE3NCw5ICsxNzMsNyBAQAogCWlmIChwLT5pc193cml0ZSkgewogCQlyZXR1cm4gaWdub3JlX3dyaXRlKHZjcHUsIHApOwogCX0gZWxzZSB7Ci0JCXUzMiB2YWw7Ci0JCWFzbSB2b2xhdGlsZSgibXJzICUwLCBkYmdhdXRoc3RhdHVzX2VsMSIgOiAiPXIiICh2YWwpKTsKLQkJcC0+cmVndmFsID0gdmFsOworCQlwLT5yZWd2YWwgPSByZWFkX3N5c3JlZyhkYmdhdXRoc3RhdHVzX2VsMSk7CiAJCXJldHVybiB0cnVlOwogCX0KIH0KQEAgLTQyOSwxMCArNDI2LDcgQEAKIAogc3RhdGljIHZvaWQgcmVzZXRfYW1haXJfZWwxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgY29uc3Qgc3RydWN0IHN5c19yZWdfZGVzYyAqcikKIHsKLQl1NjQgYW1haXI7Ci0KLQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgYW1haXJfZWwxXG4iIDogIj1yIiAoYW1haXIpKTsKLQl2Y3B1X3N5c19yZWcodmNwdSwgQU1BSVJfRUwxKSA9IGFtYWlyOworCXZjcHVfc3lzX3JlZyh2Y3B1LCBBTUFJUl9FTDEpID0gcmVhZF9zeXNyZWcoYW1haXJfZWwxKTsKIH0KIAogc3RhdGljIHZvaWQgcmVzZXRfbXBpZHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBjb25zdCBzdHJ1Y3Qgc3lzX3JlZ19kZXNjICpyKQpAQCAtNDU2LDggKzQ1MCw5IEBACiB7CiAJdTY0IHBtY3IsIHZhbDsKIAotCWFzbSB2b2xhdGlsZSgibXJzICUwLCBwbWNyX2VsMFxuIiA6ICI9ciIgKHBtY3IpKTsKLQkvKiBXcml0YWJsZSBiaXRzIG9mIFBNQ1JfRUwwIChBUk1WOF9QTVVfUE1DUl9NQVNLKSBpcyByZXNldCB0byBVTktOT1dOCisJcG1jciA9IHJlYWRfc3lzcmVnKHBtY3JfZWwwKTsKKwkvKgorCSAqIFdyaXRhYmxlIGJpdHMgb2YgUE1DUl9FTDAgKEFSTVY4X1BNVV9QTUNSX01BU0spIGFyZSByZXNldCB0byBVTktOT1dOCiAJICogZXhjZXB0IFBNQ1IuRSByZXNldHRpbmcgdG8gemVyby4KIAkgKi8KIAl2YWwgPSAoKHBtY3IgJiB+QVJNVjhfUE1VX1BNQ1JfTUFTSykKQEAgLTU1Nyw5ICs1NTIsOSBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAoIShwLT5PcDIgJiAxKSkKLQkJYXNtIHZvbGF0aWxlKCJtcnMgJTAsIHBtY2VpZDBfZWwwXG4iIDogIj1yIiAocG1jZWlkKSk7CisJCXBtY2VpZCA9IHJlYWRfc3lzcmVnKHBtY2VpZDBfZWwwKTsKIAllbHNlCi0JCWFzbSB2b2xhdGlsZSgibXJzICUwLCBwbWNlaWQxX2VsMFxuIiA6ICI9ciIgKHBtY2VpZCkpOworCQlwbWNlaWQgPSByZWFkX3N5c3JlZyhwbWNlaWQxX2VsMCk7CiAKIAlwLT5yZWd2YWwgPSBwbWNlaWQ7CiAKQEAgLTE4MzMsMTEgKzE4MjgsNyBAQAogCXN0YXRpYyB2b2lkIGdldF8jI3JlZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnYsCQkJXAogCQkJICAgICAgY29uc3Qgc3RydWN0IHN5c19yZWdfZGVzYyAqcikJCVwKIAl7CQkJCQkJCQlcCi0JCXU2NCB2YWw7CQkJCQkJXAotCQkJCQkJCQkJXAotCQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgIiBfX3N0cmluZ2lmeShyZWcpICJcbiIJCVwKLQkJCSAgICAgOiAiPXIiICh2YWwpKTsJCQkJXAotCQkoKHN0cnVjdCBzeXNfcmVnX2Rlc2MgKilyKS0+dmFsID0gdmFsOwkJCVwKKwkJKChzdHJ1Y3Qgc3lzX3JlZ19kZXNjICopciktPnZhbCA9IHJlYWRfc3lzcmVnKHJlZyk7CVwKIAl9CiAKIEZVTkNUSU9OX0lOVkFSSUFOVChtaWRyX2VsMSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva3ZtL3N5c19yZWdzX2dlbmVyaWNfdjguYyBiL2FyY2gvYXJtNjQva3ZtL3N5c19yZWdzX2dlbmVyaWNfdjguYwppbmRleCBlZDkwNTc4Li40NmFmNzE4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9zeXNfcmVnc19nZW5lcmljX3Y4LmMKKysrIGIvYXJjaC9hcm02NC9rdm0vc3lzX3JlZ3NfZ2VuZXJpY192OC5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8YXNtL2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9lbXVsYXRlLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9jb3Byb2MuaD4KKyNpbmNsdWRlIDxhc20vc3lzcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCiAjaW5jbHVkZSAic3lzX3JlZ3MuaCIKQEAgLTQzLDEwICs0NCw3IEBACiAKIHN0YXRpYyB2b2lkIHJlc2V0X2FjdGxyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgY29uc3Qgc3RydWN0IHN5c19yZWdfZGVzYyAqcikKIHsKLQl1NjQgYWN0bHI7Ci0KLQlhc20gdm9sYXRpbGUoIm1ycyAlMCwgYWN0bHJfZWwxXG4iIDogIj1yIiAoYWN0bHIpKTsKLQl2Y3B1X3N5c19yZWcodmNwdSwgQUNUTFJfRUwxKSA9IGFjdGxyOworCXZjcHVfc3lzX3JlZyh2Y3B1LCBBQ1RMUl9FTDEpID0gcmVhZF9zeXNyZWcoYWN0bHJfZWwxKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbGliL2NvcHlfcGFnZS5TIGIvYXJjaC9hcm02NC9saWIvY29weV9wYWdlLlMKaW5kZXggNGMxZTcwMC4uYzNjZDY1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9saWIvY29weV9wYWdlLlMKKysrIGIvYXJjaC9hcm02NC9saWIvY29weV9wYWdlLlMKQEAgLTI5LDE0ICsyOSwxMSBAQAogICoJeDEgLSBzcmMKICAqLwogRU5UUlkoY29weV9wYWdlKQotYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X0hBU19OT19IV19QUkVGRVRDSAotCW5vcAotCW5vcAotYWx0ZXJuYXRpdmVfZWxzZQorYWx0ZXJuYXRpdmVfaWYgQVJNNjRfSEFTX05PX0hXX1BSRUZFVENICiAJIyBQcmVmZXRjaCB0d28gY2FjaGUgbGluZXMgYWhlYWQuCiAJcHJmbSAgICBwbGRsMXN0cm0sIFt4MSwgIzEyOF0KIAlwcmZtICAgIHBsZGwxc3RybSwgW3gxLCAjMjU2XQotYWx0ZXJuYXRpdmVfZW5kaWYKK2FsdGVybmF0aXZlX2Vsc2Vfbm9wX2VuZGlmCiAKIAlsZHAJeDIsIHgzLCBbeDFdCiAJbGRwCXg0LCB4NSwgW3gxLCAjMTZdCkBAIC01MiwxMSArNDksOSBAQAogMToKIAlzdWJzCXgxOCwgeDE4LCAjMTI4CiAKLWFsdGVybmF0aXZlX2lmX25vdCBBUk02NF9IQVNfTk9fSFdfUFJFRkVUQ0gKLQlub3AKLWFsdGVybmF0aXZlX2Vsc2UKK2FsdGVybmF0aXZlX2lmIEFSTTY0X0hBU19OT19IV19QUkVGRVRDSAogCXByZm0gICAgcGxkbDFzdHJtLCBbeDEsICMzODRdCi1hbHRlcm5hdGl2ZV9lbmRpZgorYWx0ZXJuYXRpdmVfZWxzZV9ub3BfZW5kaWYKIAogCXN0bnAJeDIsIHgzLCBbeDBdCiAJbGRwCXgyLCB4MywgW3gxXQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9jYWNoZS5TIGIvYXJjaC9hcm02NC9tbS9jYWNoZS5TCmluZGV4IDA3ZDczNTIuLjU4YjVhOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vY2FjaGUuUworKysgYi9hcmNoL2FybTY0L21tL2NhY2hlLlMKQEAgLTEwNSwxOSArMTA1LDIwIEBACiBFTkRQUk9DKF9fY2xlYW5fZGNhY2hlX2FyZWFfcG91KQogCiAvKgorICoJX19kbWFfaW52X2FyZWEoc3RhcnQsIHNpemUpCisgKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCisgKgktIHNpemUgICAgLSBzaXplIGluIHF1ZXN0aW9uCisgKi8KK19fZG1hX2ludl9hcmVhOgorCWFkZAl4MSwgeDEsIHgwCisJLyogRkFMTFRIUk9VR0ggKi8KKworLyoKICAqCV9faW52YWxfY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCkKICAqCS0gc3RhcnQgICAtIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCiAgKgktIGVuZCAgICAgLSBlbmQgYWRkcmVzcyBvZiByZWdpb24KICAqLwogRU5UUlkoX19pbnZhbF9jYWNoZV9yYW5nZSkKLQkvKiBGQUxMVEhST1VHSCAqLwotCi0vKgotICoJX19kbWFfaW52X3JhbmdlKHN0YXJ0LCBlbmQpCi0gKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCi0gKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgotICovCi1fX2RtYV9pbnZfcmFuZ2U6CiAJZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKIAlzdWIJeDMsIHgyLCAjMQogCXRzdAl4MSwgeDMJCQkJLy8gZW5kIGNhY2hlIGxpbmUgYWxpZ25lZD8KQEAgLTEzNiw0NiArMTM3LDQzIEBACiAJZHNiCXN5CiAJcmV0CiBFTkRQSVBST0MoX19pbnZhbF9jYWNoZV9yYW5nZSkKLUVORFBST0MoX19kbWFfaW52X3JhbmdlKQorRU5EUFJPQyhfX2RtYV9pbnZfYXJlYSkKIAogLyoKLSAqCV9fZG1hX2NsZWFuX3JhbmdlKHN0YXJ0LCBlbmQpCi0gKgktIHN0YXJ0ICAgLSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3Mgb2YgcmVnaW9uCi0gKgktIGVuZCAgICAgLSB2aXJ0dWFsIGVuZCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJX19jbGVhbl9kY2FjaGVfYXJlYV9wb2Moa2FkZHIsIHNpemUpCisgKgorICogCUVuc3VyZSB0aGF0IGFueSBELWNhY2hlIGxpbmVzIGZvciB0aGUgaW50ZXJ2YWwgW2thZGRyLCBrYWRkcitzaXplKQorICogCWFyZSBjbGVhbmVkIHRvIHRoZSBQb0MuCisgKgorICoJLSBrYWRkciAgIC0ga2VybmVsIGFkZHJlc3MKKyAqCS0gc2l6ZSAgICAtIHNpemUgaW4gcXVlc3Rpb24KICAqLwotX19kbWFfY2xlYW5fcmFuZ2U6Ci0JZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKLQlzdWIJeDMsIHgyLCAjMQotCWJpYwl4MCwgeDAsIHgzCi0xOgotYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X1dPUktBUk9VTkRfQ0xFQU5fQ0FDSEUKLQlkYwljdmFjLCB4MAotYWx0ZXJuYXRpdmVfZWxzZQotCWRjCWNpdmFjLCB4MAotYWx0ZXJuYXRpdmVfZW5kaWYKLQlhZGQJeDAsIHgwLCB4MgotCWNtcAl4MCwgeDEKLQliLmxvCTFiCi0JZHNiCXN5Ci0JcmV0Ci1FTkRQUk9DKF9fZG1hX2NsZWFuX3JhbmdlKQorRU5UUlkoX19jbGVhbl9kY2FjaGVfYXJlYV9wb2MpCisJLyogRkFMTFRIUk9VR0ggKi8KIAogLyoKLSAqCV9fZG1hX2ZsdXNoX3JhbmdlKHN0YXJ0LCBlbmQpCisgKglfX2RtYV9jbGVhbl9hcmVhKHN0YXJ0LCBzaXplKQogICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgotICoJLSBlbmQgICAgIC0gdmlydHVhbCBlbmQgYWRkcmVzcyBvZiByZWdpb24KKyAqCS0gc2l6ZSAgICAtIHNpemUgaW4gcXVlc3Rpb24KICAqLwotRU5UUlkoX19kbWFfZmx1c2hfcmFuZ2UpCi0JZGNhY2hlX2xpbmVfc2l6ZSB4MiwgeDMKLQlzdWIJeDMsIHgyLCAjMQotCWJpYwl4MCwgeDAsIHgzCi0xOglkYwljaXZhYywgeDAJCQkvLyBjbGVhbiAmIGludmFsaWRhdGUgRCAvIFUgbGluZQotCWFkZAl4MCwgeDAsIHgyCi0JY21wCXgwLCB4MQotCWIubG8JMWIKLQlkc2IJc3kKK19fZG1hX2NsZWFuX2FyZWE6CisJZGNhY2hlX2J5X2xpbmVfb3AgY3ZhYywgc3ksIHgwLCB4MSwgeDIsIHgzCiAJcmV0Ci1FTkRQSVBST0MoX19kbWFfZmx1c2hfcmFuZ2UpCitFTkRQSVBST0MoX19jbGVhbl9kY2FjaGVfYXJlYV9wb2MpCitFTkRQUk9DKF9fZG1hX2NsZWFuX2FyZWEpCisKKy8qCisgKglfX2RtYV9mbHVzaF9hcmVhKHN0YXJ0LCBzaXplKQorICoKKyAqCWNsZWFuICYgaW52YWxpZGF0ZSBEIC8gVSBsaW5lCisgKgorICoJLSBzdGFydCAgIC0gdmlydHVhbCBzdGFydCBhZGRyZXNzIG9mIHJlZ2lvbgorICoJLSBzaXplICAgIC0gc2l6ZSBpbiBxdWVzdGlvbgorICovCitFTlRSWShfX2RtYV9mbHVzaF9hcmVhKQorCWRjYWNoZV9ieV9saW5lX29wIGNpdmFjLCBzeSwgeDAsIHgxLCB4MiwgeDMKKwlyZXQKK0VORFBJUFJPQyhfX2RtYV9mbHVzaF9hcmVhKQogCiAvKgogICoJX19kbWFfbWFwX2FyZWEoc3RhcnQsIHNpemUsIGRpcikKQEAgLTE4NCwxMCArMTgyLDkgQEAKICAqCS0gZGlyCS0gRE1BIGRpcmVjdGlvbgogICovCiBFTlRSWShfX2RtYV9tYXBfYXJlYSkKLQlhZGQJeDEsIHgxLCB4MAogCWNtcAl3MiwgI0RNQV9GUk9NX0RFVklDRQotCWIuZXEJX19kbWFfaW52X3JhbmdlCi0JYglfX2RtYV9jbGVhbl9yYW5nZQorCWIuZXEJX19kbWFfaW52X2FyZWEKKwliCV9fZG1hX2NsZWFuX2FyZWEKIEVORFBJUFJPQyhfX2RtYV9tYXBfYXJlYSkKIAogLyoKQEAgLTE5Nyw4ICsxOTQsNyBAQAogICoJLSBkaXIJLSBETUEgZGlyZWN0aW9uCiAgKi8KIEVOVFJZKF9fZG1hX3VubWFwX2FyZWEpCi0JYWRkCXgxLCB4MSwgeDAKIAljbXAJdzIsICNETUFfVE9fREVWSUNFCi0JYi5uZQlfX2RtYV9pbnZfcmFuZ2UKKwliLm5lCV9fZG1hX2ludl9hcmVhCiAJcmV0CiBFTkRQSVBST0MoX19kbWFfdW5tYXBfYXJlYSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYyBiL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYwppbmRleCBjNDI4NGM0Li5iZGFjZWFkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2RtYS1tYXBwaW5nLmMKKysrIGIvYXJjaC9hcm02NC9tbS9kbWEtbWFwcGluZy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgpAQCAtMzAsNyArMzEsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotc3RhdGljIGludCBzd2lvdGxiIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW50IHN3aW90bGIgX19yb19hZnRlcl9pbml0OwogCiBzdGF0aWMgcGdwcm90X3QgX19nZXRfZG1hX3BncHJvdCh1bnNpZ25lZCBsb25nIGF0dHJzLCBwZ3Byb3RfdCBwcm90LAogCQkJCSBib29sIGNvaGVyZW50KQpAQCAtMTY4LDcgKzE2OSw3IEBACiAJCXJldHVybiBwdHI7CiAKIAkvKiByZW1vdmUgYW55IGRpcnR5IGNhY2hlIGxpbmVzIG9uIHRoZSBrZXJuZWwgYWxpYXMgKi8KLQlfX2RtYV9mbHVzaF9yYW5nZShwdHIsIHB0ciArIHNpemUpOworCV9fZG1hX2ZsdXNoX2FyZWEocHRyLCBzaXplKTsKIAogCS8qIGNyZWF0ZSBhIGNvaGVyZW50IG1hcHBpbmcgKi8KIAlwYWdlID0gdmlydF90b19wYWdlKHB0cik7CkBAIC0zODcsNyArMzg4LDcgQEAKIAkJdm9pZCAqcGFnZV9hZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwogCiAJCW1lbXNldChwYWdlX2FkZHIsIDAsIGF0b21pY19wb29sX3NpemUpOwotCQlfX2RtYV9mbHVzaF9yYW5nZShwYWdlX2FkZHIsIHBhZ2VfYWRkciArIGF0b21pY19wb29sX3NpemUpOworCQlfX2RtYV9mbHVzaF9hcmVhKHBhZ2VfYWRkciwgYXRvbWljX3Bvb2xfc2l6ZSk7CiAKIAkJYXRvbWljX3Bvb2wgPSBnZW5fcG9vbF9jcmVhdGUoUEFHRV9TSElGVCwgLTEpOwogCQlpZiAoIWF0b21pY19wb29sKQpAQCAtNTQ4LDcgKzU0OSw3IEBACiAvKiBUaGFua2Z1bGx5LCBhbGwgY2FjaGUgb3BzIGFyZSBieSBWQSBzbyB3ZSBjYW4gaWdub3JlIHBoeXMgaGVyZSAqLwogc3RhdGljIHZvaWQgZmx1c2hfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQgKnZpcnQsIHBoeXNfYWRkcl90IHBoeXMpCiB7Ci0JX19kbWFfZmx1c2hfcmFuZ2UodmlydCwgdmlydCArIFBBR0VfU0laRSk7CisJX19kbWFfZmx1c2hfYXJlYSh2aXJ0LCBQQUdFX1NJWkUpOwogfQogCiBzdGF0aWMgdm9pZCAqX19pb21tdV9hbGxvY19hdHRycyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9leHRhYmxlLmMgYi9hcmNoL2FybTY0L21tL2V4dGFibGUuYwppbmRleCA4MWFjZDQ3Li5jOWYxMThjIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2V4dGFibGUuYworKysgYi9hcmNoL2FybTY0L21tL2V4dGFibGUuYwpAQCAtMiw3ICsyLDcgQEAKICAqIEJhc2VkIG9uIGFyY2gvYXJtL21tL2V4dGFibGUuYwogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiBpbnQgZml4dXBfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9mYXVsdC5jIGIvYXJjaC9hcm02NC9tbS9mYXVsdC5jCmluZGV4IDA1ZDJiZDcuLjUzZDkxNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vZmF1bHQuYworKysgYi9hcmNoL2FybTY0L21tL2ZhdWx0LmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CkBAIC0yNTEsOCArMjUxLDcgQEAKIGdvb2RfYXJlYToKIAkvKgogCSAqIENoZWNrIHRoYXQgdGhlIHBlcm1pc3Npb25zIG9uIHRoZSBWTUEgYWxsb3cgZm9yIHRoZSBmYXVsdCB3aGljaAotCSAqIG9jY3VycmVkLiBJZiB3ZSBlbmNvdW50ZXJlZCBhIHdyaXRlIG9yIGV4ZWMgZmF1bHQsIHdlIG11c3QgaGF2ZQotCSAqIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zLCBvdGhlcndpc2Ugd2UgYWxsb3cgYW55IHBlcm1pc3Npb24uCisJICogb2NjdXJyZWQuCiAJICovCiAJaWYgKCEodm1hLT52bV9mbGFncyAmIHZtX2ZsYWdzKSkgewogCQlmYXVsdCA9IFZNX0ZBVUxUX0JBREFDQ0VTUzsKQEAgLTI4OCw3ICsyODcsNyBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwogCWludCBmYXVsdCwgc2lnLCBjb2RlOwotCXVuc2lnbmVkIGxvbmcgdm1fZmxhZ3MgPSBWTV9SRUFEIHwgVk1fV1JJVEUgfCBWTV9FWEVDOworCXVuc2lnbmVkIGxvbmcgdm1fZmxhZ3MgPSBWTV9SRUFEIHwgVk1fV1JJVEU7CiAJdW5zaWduZWQgaW50IG1tX2ZsYWdzID0gRkFVTFRfRkxBR19BTExPV19SRVRSWSB8IEZBVUxUX0ZMQUdfS0lMTEFCTEU7CiAKIAlpZiAobm90aWZ5X3BhZ2VfZmF1bHQocmVncywgZXNyKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vZmx1c2guYyBiL2FyY2gvYXJtNjQvbW0vZmx1c2guYwppbmRleCA0M2E3NmIwLi44Mzc3MzI5IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2ZsdXNoLmMKKysrIGIvYXJjaC9hcm02NC9tbS9mbHVzaC5jCkBAIC0yNSw4ICsyNSw2IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hldHlwZS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCi0jaW5jbHVkZSAibW0uaCIKLQogdm9pZCBmbHVzaF9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKIAkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9pbml0LmMgYi9hcmNoL2FybTY0L21tL2luaXQuYwppbmRleCBiYmI3ZWU3Li4yMWM0ODliIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL2luaXQuYworKysgYi9hcmNoL2FybTY0L21tL2luaXQuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CkBAIC0zNCw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1hLWNvbnRpZ3VvdXMuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9zd2lvdGxiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSA8YXNtL2Jvb3QuaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CkBAIC00NywxNiArNDksMTQgQEAKICNpbmNsdWRlIDxhc20vdGxiLmg+CiAjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLmg+CiAKLSNpbmNsdWRlICJtbS5oIgotCiAvKgogICogV2UgbmVlZCB0byBiZSBhYmxlIHRvIGNhdGNoIGluYWR2ZXJ0ZW50IHJlZmVyZW5jZXMgdG8gbWVtc3RhcnRfYWRkcgogICogdGhhdCBvY2N1ciAocG90ZW50aWFsbHkgaW4gZ2VuZXJpYyBjb2RlKSBiZWZvcmUgYXJtNjRfbWVtYmxvY2tfaW5pdCgpCiAgKiBleGVjdXRlcywgd2hpY2ggYXNzaWducyBpdCBpdHMgYWN0dWFsIHZhbHVlLiBTbyB1c2UgYSBkZWZhdWx0IHZhbHVlCiAgKiB0aGF0IGNhbm5vdCBiZSBtaXN0YWtlbiBmb3IgYSByZWFsIHBoeXNpY2FsIGFkZHJlc3MuCiAgKi8KLXM2NCBtZW1zdGFydF9hZGRyIF9fcmVhZF9tb3N0bHkgPSAtMTsKLXBoeXNfYWRkcl90IGFybTY0X2RtYV9waHlzX2xpbWl0IF9fcmVhZF9tb3N0bHk7CitzNjQgbWVtc3RhcnRfYWRkciBfX3JvX2FmdGVyX2luaXQgPSAtMTsKK3BoeXNfYWRkcl90IGFybTY0X2RtYV9waHlzX2xpbWl0IF9fcm9fYWZ0ZXJfaW5pdDsKIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogc3RhdGljIGludCBfX2luaXQgZWFybHlfaW5pdHJkKGNoYXIgKnApCkBAIC00ODUsNyArNDg1LDEyIEBACiB7CiAJZnJlZV9yZXNlcnZlZF9hcmVhKF9fdmEoX19wYShfX2luaXRfYmVnaW4pKSwgX192YShfX3BhKF9faW5pdF9lbmQpKSwKIAkJCSAgIDAsICJ1bnVzZWQga2VybmVsIik7Ci0JZml4dXBfaW5pdCgpOworCS8qCisJICogVW5tYXAgdGhlIF9faW5pdCByZWdpb24gYnV0IGxlYXZlIHRoZSBWTSBhcmVhIGluIHBsYWNlLiBUaGlzCisJICogcHJldmVudHMgdGhlIHJlZ2lvbiBmcm9tIGJlaW5nIHJldXNlZCBmb3Iga2VybmVsIG1vZHVsZXMsIHdoaWNoCisJICogaXMgbm90IHN1cHBvcnRlZCBieSBrYWxsc3ltcy4KKwkgKi8KKwl1bm1hcF9rZXJuZWxfcmFuZ2UoKHU2NClfX2luaXRfYmVnaW4sICh1NjQpKF9faW5pdF9lbmQgLSBfX2luaXRfYmVnaW4pKTsKIH0KIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9tbS5oIGIvYXJjaC9hcm02NC9tbS9tbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWZlOTg5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtNjQvbW0vbW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotCi12b2lkIGZpeHVwX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL21tdS5jIGIvYXJjaC9hcm02NC9tbS9tbXUuYwppbmRleCA0OTg5OTQ4Li4wNTYxNWEzIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL21tdS5jCisrKyBiL2FyY2gvYXJtNjQvbW0vbW11LmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC00MiwxMSArNDMsOSBAQAogI2luY2x1ZGUgPGFzbS9tZW1ibG9jay5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogCi0jaW5jbHVkZSAibW0uaCIKLQogdTY0IGlkbWFwX3Qwc3ogPSBUQ1JfVDBTWihWQV9CSVRTKTsKIAotdTY0IGtpbWFnZV92b2Zmc2V0IF9fcmVhZF9tb3N0bHk7Cit1NjQga2ltYWdlX3ZvZmZzZXQgX19yb19hZnRlcl9pbml0OwogRVhQT1JUX1NZTUJPTChraW1hZ2Vfdm9mZnNldCk7CiAKIC8qCkBAIC0zOTksMTYgKzM5OCw2IEBACiAJCQkgICAgc2VjdGlvbl9zaXplLCBQQUdFX0tFUk5FTF9STyk7CiB9CiAKLXZvaWQgZml4dXBfaW5pdCh2b2lkKQotewotCS8qCi0JICogVW5tYXAgdGhlIF9faW5pdCByZWdpb24gYnV0IGxlYXZlIHRoZSBWTSBhcmVhIGluIHBsYWNlLiBUaGlzCi0JICogcHJldmVudHMgdGhlIHJlZ2lvbiBmcm9tIGJlaW5nIHJldXNlZCBmb3Iga2VybmVsIG1vZHVsZXMsIHdoaWNoCi0JICogaXMgbm90IHN1cHBvcnRlZCBieSBrYWxsc3ltcy4KLQkgKi8KLQl1bm1hcF9rZXJuZWxfcmFuZ2UoKHU2NClfX2luaXRfYmVnaW4sICh1NjQpKF9faW5pdF9lbmQgLSBfX2luaXRfYmVnaW4pKTsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IG1hcF9rZXJuZWxfc2VnbWVudChwZ2RfdCAqcGdkLCB2b2lkICp2YV9zdGFydCwgdm9pZCAqdmFfZW5kLAogCQkJCSAgICAgIHBncHJvdF90IHByb3QsIHN0cnVjdCB2bV9zdHJ1Y3QgKnZtYSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vbnVtYS5jIGIvYXJjaC9hcm02NC9tbS9udW1hLmMKaW5kZXggNWJiMTVlYS4uNzc4YTk4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9udW1hLmMKKysrIGIvYXJjaC9hcm02NC9tbS9udW1hLmMKQEAgLTE3LDYgKzE3LDggQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgIk5VTUE6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CkBAIC0yNCw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogI2luY2x1ZGUgPGFzbS9hY3BpLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKIHN0cnVjdCBwZ2xpc3RfZGF0YSAqbm9kZV9kYXRhW01BWF9OVU1OT0RFU10gX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0wobm9kZV9kYXRhKTsKQEAgLTM4LDEwICs0MSw5IEBACiB7CiAJaWYgKCFvcHQpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghc3RybmNtcChvcHQsICJvZmYiLCAzKSkgewotCQlwcl9pbmZvKCIlc1xuIiwgIk5VTUEgdHVybmVkIG9mZiIpOworCWlmICghc3RybmNtcChvcHQsICJvZmYiLCAzKSkKIAkJbnVtYV9vZmYgPSB0cnVlOwotCX0KKwogCXJldHVybiAwOwogfQogZWFybHlfcGFyYW0oIm51bWEiLCBudW1hX3BhcnNlX2Vhcmx5X3BhcmFtKTsKQEAgLTkzLDcgKzk1LDYgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IHNldHVwX25vZGVfdG9fY3B1bWFza19tYXAodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgY3B1OwogCWludCBub2RlOwogCiAJLyogc2V0dXAgbnJfbm9kZV9pZHMgaWYgbm90IGRvbmUgeWV0ICovCkBAIC0xMDYsMTEgKzEwNyw4IEBACiAJCWNwdW1hc2tfY2xlYXIobm9kZV90b19jcHVtYXNrX21hcFtub2RlXSk7CiAJfQogCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJc2V0X2NwdV9udW1hX25vZGUoY3B1LCBOVU1BX05PX05PREUpOwotCiAJLyogY3B1bWFza19vZl9ub2RlKCkgd2lsbCBub3cgd29yayAqLwotCXByX2RlYnVnKCJOVU1BOiBOb2RlIHRvIGNwdW1hc2sgbWFwIGZvciAlZCBub2Rlc1xuIiwgbnJfbm9kZV9pZHMpOworCXByX2RlYnVnKCJOb2RlIHRvIGNwdW1hc2sgbWFwIGZvciAlZCBub2Rlc1xuIiwgbnJfbm9kZV9pZHMpOwogfQogCiAvKgpAQCAtMTE4LDE4ICsxMTYsNzcgQEAKICAqLwogdm9pZCBudW1hX3N0b3JlX2NwdV9pbmZvKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JbWFwX2NwdV90b19ub2RlKGNwdSwgbnVtYV9vZmYgPyAwIDogY3B1X3RvX25vZGVfbWFwW2NwdV0pOworCW1hcF9jcHVfdG9fbm9kZShjcHUsIGNwdV90b19ub2RlX21hcFtjcHVdKTsKIH0KIAogdm9pZCBfX2luaXQgZWFybHlfbWFwX2NwdV90b19ub2RlKHVuc2lnbmVkIGludCBjcHUsIGludCBuaWQpCiB7CiAJLyogZmFsbGJhY2sgdG8gbm9kZSAwICovCi0JaWYgKG5pZCA8IDAgfHwgbmlkID49IE1BWF9OVU1OT0RFUykKKwlpZiAobmlkIDwgMCB8fCBuaWQgPj0gTUFYX05VTU5PREVTIHx8IG51bWFfb2ZmKQogCQluaWQgPSAwOwogCiAJY3B1X3RvX25vZGVfbWFwW2NwdV0gPSBuaWQ7CisKKwkvKgorCSAqIFdlIHNob3VsZCBzZXQgdGhlIG51bWEgbm9kZSBvZiBjcHUwIGFzIHNvb24gYXMgcG9zc2libGUsIGJlY2F1c2UgaXQKKwkgKiBoYXMgYWxyZWFkeSBiZWVuIHNldCB1cCBvbmxpbmUgYmVmb3JlLiBjcHVfdG9fbm9kZSgwKSB3aWxsIHNvb24gYmUKKwkgKiBjYWxsZWQuCisJICovCisJaWYgKCFjcHUpCisJCXNldF9jcHVfbnVtYV9ub2RlKGNwdSwgbmlkKTsKIH0KIAorI2lmZGVmIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQQordW5zaWduZWQgbG9uZyBfX3Blcl9jcHVfb2Zmc2V0W05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MKF9fcGVyX2NwdV9vZmZzZXQpOworCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9jcHVfdG9fbm9kZShpbnQgY3B1KQoreworCXJldHVybiBjcHVfdG9fbm9kZV9tYXBbY3B1XTsKK30KKworc3RhdGljIGludCBfX2luaXQgcGNwdV9jcHVfZGlzdGFuY2UodW5zaWduZWQgaW50IGZyb20sIHVuc2lnbmVkIGludCB0bykKK3sKKwlyZXR1cm4gbm9kZV9kaXN0YW5jZShmcm9tLCB0byk7Cit9CisKK3N0YXRpYyB2b2lkICogX19pbml0IHBjcHVfZmNfYWxsb2ModW5zaWduZWQgaW50IGNwdSwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIHNpemVfdCBhbGlnbikKK3sKKwlpbnQgbmlkID0gZWFybHlfY3B1X3RvX25vZGUoY3B1KTsKKworCXJldHVybiAgbWVtYmxvY2tfdmlydF9hbGxvY190cnlfbmlkKHNpemUsIGFsaWduLAorCQkJX19wYShNQVhfRE1BX0FERFJFU1MpLCBNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFLCBuaWQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcGNwdV9mY19mcmVlKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit7CisJbWVtYmxvY2tfZnJlZV9lYXJseShfX3BhKHB0ciksIHNpemUpOworfQorCit2b2lkIF9faW5pdCBzZXR1cF9wZXJfY3B1X2FyZWFzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBkZWx0YTsKKwl1bnNpZ25lZCBpbnQgY3B1OworCWludCByYzsKKworCS8qCisJICogQWx3YXlzIHJlc2VydmUgYXJlYSBmb3IgbW9kdWxlIHBlcmNwdSB2YXJpYWJsZXMuICBUaGF0J3MKKwkgKiB3aGF0IHRoZSBsZWdhY3kgYWxsb2NhdG9yIGRpZC4KKwkgKi8KKwlyYyA9IHBjcHVfZW1iZWRfZmlyc3RfY2h1bmsoUEVSQ1BVX01PRFVMRV9SRVNFUlZFLAorCQkJCSAgICBQRVJDUFVfRFlOQU1JQ19SRVNFUlZFLCBQQUdFX1NJWkUsCisJCQkJICAgIHBjcHVfY3B1X2Rpc3RhbmNlLAorCQkJCSAgICBwY3B1X2ZjX2FsbG9jLCBwY3B1X2ZjX2ZyZWUpOworCWlmIChyYyA8IDApCisJCXBhbmljKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBwZXJjcHUgYXJlYXMuIik7CisKKwlkZWx0YSA9ICh1bnNpZ25lZCBsb25nKXBjcHVfYmFzZV9hZGRyIC0gKHVuc2lnbmVkIGxvbmcpX19wZXJfY3B1X3N0YXJ0OworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCV9fcGVyX2NwdV9vZmZzZXRbY3B1XSA9IGRlbHRhICsgcGNwdV91bml0X29mZnNldHNbY3B1XTsKK30KKyNlbmRpZgorCiAvKioKICAqIG51bWFfYWRkX21lbWJsayAtIFNldCBub2RlIGlkIHRvIG1lbWJsawogICogQG5pZDogTlVNQSBub2RlIElEIG9mIHRoZSBuZXcgbWVtYmxrCkBAIC0xNDUsMTMgKzIwMiwxMyBAQAogCiAJcmV0ID0gbWVtYmxvY2tfc2V0X25vZGUoc3RhcnQsIChlbmQgLSBzdGFydCksICZtZW1ibG9jay5tZW1vcnksIG5pZCk7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJOVU1BOiBtZW1ibG9jayBbMHglbGx4IC0gMHglbGx4XSBmYWlsZWQgdG8gYWRkIG9uIG5vZGUgJWRcbiIsCisJCXByX2VycigibWVtYmxvY2sgWzB4JWxseCAtIDB4JWxseF0gZmFpbGVkIHRvIGFkZCBvbiBub2RlICVkXG4iLAogCQkJc3RhcnQsIChlbmQgLSAxKSwgbmlkKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlub2RlX3NldChuaWQsIG51bWFfbm9kZXNfcGFyc2VkKTsKLQlwcl9pbmZvKCJOVU1BOiBBZGRpbmcgbWVtYmxvY2sgWzB4JWxseCAtIDB4JWxseF0gb24gbm9kZSAlZFxuIiwKKwlwcl9pbmZvKCJBZGRpbmcgbWVtYmxvY2sgWzB4JWxseCAtIDB4JWxseF0gb24gbm9kZSAlZFxuIiwKIAkJCXN0YXJ0LCAoZW5kIC0gMSksIG5pZCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2NiwxOSArMjIzLDE4IEBACiAJdm9pZCAqbmQ7CiAJaW50IHRuaWQ7CiAKLQlwcl9pbmZvKCJOVU1BOiBJbml0bWVtIHNldHVwIG5vZGUgJWQgW21lbSAlIzAxMEx4LSUjMDEwTHhdXG4iLAotCQkJbmlkLCBzdGFydF9wZm4gPDwgUEFHRV9TSElGVCwKLQkJCShlbmRfcGZuIDw8IFBBR0VfU0hJRlQpIC0gMSk7CisJcHJfaW5mbygiSW5pdG1lbSBzZXR1cCBub2RlICVkIFttZW0gJSMwMTBMeC0lIzAxMEx4XVxuIiwKKwkJbmlkLCBzdGFydF9wZm4gPDwgUEFHRV9TSElGVCwgKGVuZF9wZm4gPDwgUEFHRV9TSElGVCkgLSAxKTsKIAogCW5kX3BhID0gbWVtYmxvY2tfYWxsb2NfdHJ5X25pZChuZF9zaXplLCBTTVBfQ0FDSEVfQllURVMsIG5pZCk7CiAJbmQgPSBfX3ZhKG5kX3BhKTsKIAogCS8qIHJlcG9ydCBhbmQgaW5pdGlhbGl6ZSAqLwotCXByX2luZm8oIk5VTUE6IE5PREVfREFUQSBbbWVtICUjMDEwTHgtJSMwMTBMeF1cbiIsCisJcHJfaW5mbygiTk9ERV9EQVRBIFttZW0gJSMwMTBMeC0lIzAxMEx4XVxuIiwKIAkJbmRfcGEsIG5kX3BhICsgbmRfc2l6ZSAtIDEpOwogCXRuaWQgPSBlYXJseV9wZm5fdG9fbmlkKG5kX3BhID4+IFBBR0VfU0hJRlQpOwogCWlmICh0bmlkICE9IG5pZCkKLQkJcHJfaW5mbygiTlVNQTogTk9ERV9EQVRBKCVkKSBvbiBub2RlICVkXG4iLCBuaWQsIHRuaWQpOworCQlwcl9pbmZvKCJOT0RFX0RBVEEoJWQpIG9uIG5vZGUgJWRcbiIsIG5pZCwgdG5pZCk7CiAKIAlub2RlX2RhdGFbbmlkXSA9IG5kOwogCW1lbXNldChOT0RFX0RBVEEobmlkKSwgMCwgc2l6ZW9mKHBnX2RhdGFfdCkpOwpAQCAtMjM1LDggKzI5MSw3IEBACiAJCQludW1hX2Rpc3RhbmNlW2kgKiBudW1hX2Rpc3RhbmNlX2NudCArIGpdID0gaSA9PSBqID8KIAkJCQlMT0NBTF9ESVNUQU5DRSA6IFJFTU9URV9ESVNUQU5DRTsKIAotCXByX2RlYnVnKCJOVU1BOiBJbml0aWFsaXplZCBkaXN0YW5jZSB0YWJsZSwgY250PSVkXG4iLAotCQkJbnVtYV9kaXN0YW5jZV9jbnQpOworCXByX2RlYnVnKCJJbml0aWFsaXplZCBkaXN0YW5jZSB0YWJsZSwgY250PSVkXG4iLCBudW1hX2Rpc3RhbmNlX2NudCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI1NywyMCArMzEyLDIwIEBACiB2b2lkIF9faW5pdCBudW1hX3NldF9kaXN0YW5jZShpbnQgZnJvbSwgaW50IHRvLCBpbnQgZGlzdGFuY2UpCiB7CiAJaWYgKCFudW1hX2Rpc3RhbmNlKSB7Ci0JCXByX3dhcm5fb25jZSgiTlVNQTogV2FybmluZzogZGlzdGFuY2UgdGFibGUgbm90IGFsbG9jYXRlZCB5ZXRcbiIpOworCQlwcl93YXJuX29uY2UoIldhcm5pbmc6IGRpc3RhbmNlIHRhYmxlIG5vdCBhbGxvY2F0ZWQgeWV0XG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChmcm9tID49IG51bWFfZGlzdGFuY2VfY250IHx8IHRvID49IG51bWFfZGlzdGFuY2VfY250IHx8CiAJCQlmcm9tIDwgMCB8fCB0byA8IDApIHsKLQkJcHJfd2Fybl9vbmNlKCJOVU1BOiBXYXJuaW5nOiBub2RlIGlkcyBhcmUgb3V0IG9mIGJvdW5kLCBmcm9tPSVkIHRvPSVkIGRpc3RhbmNlPSVkXG4iLAorCQlwcl93YXJuX29uY2UoIldhcm5pbmc6IG5vZGUgaWRzIGFyZSBvdXQgb2YgYm91bmQsIGZyb209JWQgdG89JWQgZGlzdGFuY2U9JWRcbiIsCiAJCQkgICAgZnJvbSwgdG8sIGRpc3RhbmNlKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICgodTgpZGlzdGFuY2UgIT0gZGlzdGFuY2UgfHwKIAkgICAgKGZyb20gPT0gdG8gJiYgZGlzdGFuY2UgIT0gTE9DQUxfRElTVEFOQ0UpKSB7Ci0JCXByX3dhcm5fb25jZSgiTlVNQTogV2FybmluZzogaW52YWxpZCBkaXN0YW5jZSBwYXJhbWV0ZXIsIGZyb209JWQgdG89JWQgZGlzdGFuY2U9JWRcbiIsCisJCXByX3dhcm5fb25jZSgiV2FybmluZzogaW52YWxpZCBkaXN0YW5jZSBwYXJhbWV0ZXIsIGZyb209JWQgdG89JWQgZGlzdGFuY2U9JWRcbiIsCiAJCQkgICAgIGZyb20sIHRvLCBkaXN0YW5jZSk7CiAJCXJldHVybjsKIAl9CkBAIC0yOTcsNyArMzUyLDcgQEAKIAkvKiBDaGVjayB0aGF0IHZhbGlkIG5pZCBpcyBzZXQgdG8gbWVtYmxrcyAqLwogCWZvcl9lYWNoX21lbWJsb2NrKG1lbW9yeSwgbWJsaykKIAkJaWYgKG1ibGstPm5pZCA9PSBOVU1BX05PX05PREUgfHwgbWJsay0+bmlkID49IE1BWF9OVU1OT0RFUykgewotCQkJcHJfd2FybigiTlVNQTogV2FybmluZzogaW52YWxpZCBtZW1ibGsgbm9kZSAlZCBbbWVtICUjMDEwTHgtJSMwMTBMeF1cbiIsCisJCQlwcl93YXJuKCJXYXJuaW5nOiBpbnZhbGlkIG1lbWJsayBub2RlICVkIFttZW0gJSMwMTBMeC0lIzAxMEx4XVxuIiwKIAkJCQltYmxrLT5uaWQsIG1ibGstPmJhc2UsCiAJCQkJbWJsay0+YmFzZSArIG1ibGstPnNpemUgLSAxKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMzM1LDggKzM5MCwxMCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKG5vZGVzX2VtcHR5KG51bWFfbm9kZXNfcGFyc2VkKSkKKwlpZiAobm9kZXNfZW1wdHkobnVtYV9ub2Rlc19wYXJzZWQpKSB7CisJCXByX2luZm8oIk5vIE5VTUEgY29uZmlndXJhdGlvbiBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJldCA9IG51bWFfcmVnaXN0ZXJfbm9kZXMoKTsKIAlpZiAocmV0IDwgMCkKQEAgLTM0NCwxMCArNDAxLDYgQEAKIAogCXNldHVwX25vZGVfdG9fY3B1bWFza19tYXAoKTsKIAotCS8qIGluaXQgYm9vdCBwcm9jZXNzb3IgKi8KLQljcHVfdG9fbm9kZV9tYXBbMF0gPSAwOwotCW1hcF9jcHVfdG9fbm9kZSgwLCAwKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0zNjcsMTAgKzQyMCw4IEBACiAKIAlpZiAobnVtYV9vZmYpCiAJCXByX2luZm8oIk5VTUEgZGlzYWJsZWRcbiIpOyAvKiBGb3JjZWQgb2ZmIG9uIGNvbW1hbmQgbGluZS4gKi8KLQllbHNlCi0JCXByX2luZm8oIk5vIE5VTUEgY29uZmlndXJhdGlvbiBmb3VuZFxuIik7Ci0JcHJfaW5mbygiTlVNQTogRmFraW5nIGEgbm9kZSBhdCBbbWVtICUjMDE4THgtJSMwMThMeF1cbiIsCi0JICAgICAgIDBMTFUsIFBGTl9QSFlTKG1heF9wZm4pIC0gMSk7CisJcHJfaW5mbygiRmFraW5nIGEgbm9kZSBhdCBbbWVtICUjMDE4THgtJSMwMThMeF1cbiIsCisJCTBMTFUsIFBGTl9QSFlTKG1heF9wZm4pIC0gMSk7CiAKIAlmb3JfZWFjaF9tZW1ibG9jayhtZW1vcnksIG1ibGspIHsKIAkJcmV0ID0gbnVtYV9hZGRfbWVtYmxrKDAsIG1ibGstPmJhc2UsIG1ibGstPmJhc2UgKyBtYmxrLT5zaXplKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vcGFnZWF0dHIuYyBiL2FyY2gvYXJtNjQvbW0vcGFnZWF0dHIuYwppbmRleCBjYTZkMjY4Li44ZGVmNTVlIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC9hcm02NC9tbS9wYWdlYXR0ci5jCkBAIC0xMzksNCArMTM5LDQzIEBACiAJCQkJCV9fcGdwcm90KDApLAogCQkJCQlfX3BncHJvdChQVEVfVkFMSUQpKTsKIH0KLSNlbmRpZgorI2lmZGVmIENPTkZJR19ISUJFUk5BVElPTgorLyoKKyAqIFdoZW4gYnVpbHQgd2l0aCBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGFuZCBDT05GSUdfSElCRVJOQVRJT04sIHRoaXMgZnVuY3Rpb24KKyAqIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgbGluZWFyIG1hcCBwYWdlIGhhcyBiZWVuIG1hcmtlZCBhcyBub3QtdmFsaWQgYnkKKyAqIENPTkZJR19ERUJVR19QQUdFQUxMT0MuIFdhbGsgdGhlIHBhZ2UgdGFibGUgYW5kIGNoZWNrIHRoZSBQVEVfVkFMSUQgYml0LgorICogVGhpcyBpcyBiYXNlZCBvbiBrZXJuX2FkZHJfdmFsaWQoKSwgd2hpY2ggYWxtb3N0IGRvZXMgd2hhdCB3ZSBuZWVkLgorICoKKyAqIEJlY2F1c2UgdGhpcyBpcyBvbmx5IGNhbGxlZCBvbiB0aGUga2VybmVsIGxpbmVhciBtYXAsICBwP2Rfc2VjdCgpIGltcGxpZXMKKyAqIHA/ZF9wcmVzZW50KCkuIFdoZW4gZGVidWdfcGFnZWFsbG9jIGlzIGVuYWJsZWQsIHNlY3Rpb25zIG1hcHBpbmdzIGFyZQorICogZGlzYWJsZWQuCisgKi8KK2Jvb2wga2VybmVsX3BhZ2VfcHJlc2VudChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKworCXBnZCA9IHBnZF9vZmZzZXRfayhhZGRyKTsKKwlpZiAocGdkX25vbmUoKnBnZCkpCisJCXJldHVybiBmYWxzZTsKKworCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyKTsKKwlpZiAocHVkX25vbmUoKnB1ZCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAocHVkX3NlY3QoKnB1ZCkpCisJCXJldHVybiB0cnVlOworCisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworCWlmIChwbWRfbm9uZSgqcG1kKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChwbWRfc2VjdCgqcG1kKSkKKwkJcmV0dXJuIHRydWU7CisKKwlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGFkZHIpOworCXJldHVybiBwdGVfdmFsaWQoKnB0ZSk7Cit9CisjZW5kaWYgLyogQ09ORklHX0hJQkVSTkFUSU9OICovCisjZW5kaWYgLyogQ09ORklHX0RFQlVHX1BBR0VBTExPQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9wZ2QuYyBiL2FyY2gvYXJtNjQvbW0vcGdkLmMKaW5kZXggYWUxMWQ0ZS4uMzcxYzVmMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9wZ2QuYworKysgYi9hcmNoL2FybTY0L21tL3BnZC5jCkBAIC0yNiw4ICsyNiw2IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAotI2luY2x1ZGUgIm1tLmgiCi0KIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcGdkX2NhY2hlOwogCiBwZ2RfdCAqcGdkX2FsbG9jKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9wcm9jLlMgYi9hcmNoL2FybTY0L21tL3Byb2MuUwppbmRleCA1YmI2MWRlLi4zNTJjNzNiIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L21tL3Byb2MuUworKysgYi9hcmNoL2FybTY0L21tL3Byb2MuUwpAQCAtODMsNiArODMsNyBAQAogICoKICAqIHgwOiBBZGRyZXNzIG9mIGNvbnRleHQgcG9pbnRlcgogICovCisJLnB1c2hzZWN0aW9uICIuaWRtYXAudGV4dCIsICJheCIKIEVOVFJZKGNwdV9kb19yZXN1bWUpCiAJbGRwCXgyLCB4MywgW3gwXQogCWxkcAl4NCwgeDUsIFt4MCwgIzE2XQpAQCAtMTAwLDcgKzEwMSwxNiBAQAogCiAJbXNyCXRjcl9lbDEsIHg4CiAJbXNyCXZiYXJfZWwxLCB4OQorCisJLyoKKwkgKiBfX2NwdV9zZXR1cCgpIGNsZWFyZWQgTURTQ1JfRUwxLk1ERSBhbmQgZnJpZW5kcywgYmVmb3JlIHVubWFza2luZworCSAqIGRlYnVnIGV4Y2VwdGlvbnMuIEJ5IHJlc3RvcmluZyBNRFNDUl9FTDEgaGVyZSwgd2UgbWF5IHRha2UgYSBkZWJ1ZworCSAqIGV4Y2VwdGlvbi4gTWFzayB0aGVtIHVudGlsIGxvY2FsX2RiZ19yZXN0b3JlKCkgaW4gY3B1X3N1c3BlbmQoKQorCSAqIHJlc2V0cyB0aGVtLgorCSAqLworCWRpc2FibGVfZGJnCiAJbXNyCW1kc2NyX2VsMSwgeDEwCisKIAltc3IJc2N0bHJfZWwxLCB4MTIKIAkvKgogCSAqIFJlc3RvcmUgb3Nsc3JfZWwxIGJ5IHdyaXRpbmcgb3NsYXJfZWwxCkBAIC0xMTEsNiArMTIxLDcgQEAKIAlpc2IKIAlyZXQKIEVORFBST0MoY3B1X2RvX3Jlc3VtZSkKKwkucG9wc2VjdGlvbgogI2VuZGlmCiAKIC8qCkBAIC0xMjUsMTcgKzEzNiwxMiBAQAogCWJmaQl4MCwgeDEsICM0OCwgIzE2CQkvLyBzZXQgdGhlIEFTSUQKIAltc3IJdHRicjBfZWwxLCB4MAkJCS8vIHNldCBUVEJSMAogCWlzYgotYWx0ZXJuYXRpdmVfaWZfbm90IEFSTTY0X1dPUktBUk9VTkRfQ0FWSVVNXzI3NDU2Ci0JcmV0Ci0Jbm9wCi0Jbm9wCi0Jbm9wCi1hbHRlcm5hdGl2ZV9lbHNlCithbHRlcm5hdGl2ZV9pZiBBUk02NF9XT1JLQVJPVU5EX0NBVklVTV8yNzQ1NgogCWljCWlhbGx1CiAJZHNiCW5zaAogCWlzYgorYWx0ZXJuYXRpdmVfZWxzZV9ub3BfZW5kaWYKIAlyZXQKLWFsdGVybmF0aXZlX2VuZGlmCiBFTkRQUk9DKGNwdV9kb19zd2l0Y2hfbW0pCiAKIAkucHVzaHNlY3Rpb24gIi5pZG1hcC50ZXh0IiwgImF4IgpAQCAtMTcyLDYgKzE3OCw3IEBACiAgKglJbml0aWFsaXNlIHRoZSBwcm9jZXNzb3IgZm9yIHR1cm5pbmcgdGhlIE1NVSBvbi4gIFJldHVybiBpbiB4MCB0aGUKICAqCXZhbHVlIG9mIHRoZSBTQ1RMUl9FTDEgcmVnaXN0ZXIuCiAgKi8KKwkucHVzaHNlY3Rpb24gIi5pZG1hcC50ZXh0IiwgImF4IgogRU5UUlkoX19jcHVfc2V0dXApCiAJdGxiaQl2bWFsbGUxCQkJCS8vIEludmFsaWRhdGUgbG9jYWwgVExCCiAJZHNiCW5zaApAQCAtMjU3LDMgKzI2NCw0IEBACiBjcnZhbDoKIAkud29yZAkweGZjZmZmZmZmCQkJLy8gY2xlYXIKIAkud29yZAkweDM0ZDVkOTFkCQkJLy8gc2V0CisJLnBvcHNlY3Rpb24KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggNjhjZjYzOC4uYjFlYzFmYSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTc0LDcgKzc0LDcgQEAKIAogZXh0ZXJuIF9fa2VybmVsX3NpemVfdCBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLAogCQkJCSAgICBfX2tlcm5lbF9zaXplX3Qgbik7Ci1leHRlcm4gX19rZXJuZWxfc2l6ZV90IGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwKK2V4dGVybiBfX2tlcm5lbF9zaXplX3QgX19fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAogCQkJCSAgICAgIF9fa2VybmVsX3NpemVfdCBuKTsKIAogc3RhdGljIGlubGluZSBfX2tlcm5lbF9zaXplX3QgX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLApAQCAtODgsNiArODgsMTUgQEAKIHsKIAlyZXR1cm4gX19jb3B5X3VzZXIodG8sIChjb25zdCB2b2lkIF9fZm9yY2UgKilmcm9tLCBuKTsKIH0KK3N0YXRpYyBpbmxpbmUgX19rZXJuZWxfc2l6ZV90IGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLAorCQkJCQkgICAgICAgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCisJCQkJCSAgICAgICBfX2tlcm5lbF9zaXplX3QgbikKK3sKKwlzaXplX3QgcmVzID0gX19fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCWlmICh1bmxpa2VseShyZXMpKQorCQltZW1zZXQodG8gKyAobiAtIHJlcyksIDAsIHJlcyk7CisJcmV0dXJuIHJlczsKK30KIAogI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL2F2cjMyX2tzeW1zLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9hdnIzMl9rc3ltcy5jCmluZGV4IGQ5M2VhZDAuLjdjNmNmMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL2F2cjMyX2tzeW1zLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvYXZyMzJfa3N5bXMuYwpAQCAtMzYsNyArMzYsNyBAQAogLyoKICAqIFVzZXJzcGFjZSBhY2Nlc3Mgc3R1ZmYuCiAgKi8KLUVYUE9SVF9TWU1CT0woY29weV9mcm9tX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX19jb3B5X2Zyb21fdXNlcik7CiBFWFBPUlRfU1lNQk9MKGNvcHlfdG9fdXNlcik7CiBFWFBPUlRfU1lNQk9MKF9fY29weV91c2VyKTsKIEVYUE9SVF9TWU1CT0woc3RybmNweV9mcm9tX3VzZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYXZyMzIva2VybmVsL3RyYXBzLmMKaW5kZXggNjgyYjI0Ny4uZWI0YTNmYyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC90cmFwcy5jCkBAIC0xMSw3ICsxMSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBwcmludF9tb2R1bGVzICovCiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbGliL2NvcHlfdXNlci5TIGIvYXJjaC9hdnIzMi9saWIvY29weV91c2VyLlMKaW5kZXggZWE1OWMwNC4uMDc1MzczNCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9saWIvY29weV91c2VyLlMKKysrIGIvYXJjaC9hdnIzMi9saWIvY29weV91c2VyLlMKQEAgLTIzLDEzICsyMywxMyBAQAogCSAqLwogCS50ZXh0CiAJLmFsaWduCTEKLQkuZ2xvYmFsCWNvcHlfZnJvbV91c2VyCi0JLnR5cGUJY29weV9mcm9tX3VzZXIsIEBmdW5jdGlvbgotY29weV9mcm9tX3VzZXI6CisJLmdsb2JhbAlfX19jb3B5X2Zyb21fdXNlcgorCS50eXBlCV9fX2NvcHlfZnJvbV91c2VyLCBAZnVuY3Rpb24KK19fX2NvcHlfZnJvbV91c2VyOgogCWJyYW5jaF9pZl9rZXJuZWwgcjgsIF9fY29weV91c2VyCiAJcmV0X2lmX3ByaXZpbGVnZWQgcjgsIHIxMSwgcjEwLCByMTAKIAlyam1wCV9fY29weV91c2VyCi0JLnNpemUJY29weV9mcm9tX3VzZXIsIC4gLSBjb3B5X2Zyb21fdXNlcgorCS5zaXplCV9fX2NvcHlfZnJvbV91c2VyLCAuIC0gX19fY29weV9mcm9tX3VzZXIKIAogCS5nbG9iYWwJY29weV90b191c2VyCiAJLnR5cGUJY29weV90b191c2VyLCBAZnVuY3Rpb24KZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbW0vZmF1bHQuYyBiL2FyY2gvYXZyMzIvbW0vZmF1bHQuYwppbmRleCBhNGI3ZWRhLi5iMzk3N2U5IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9hdnIzMi9tbS9mYXVsdC5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL0tjb25maWcgYi9hcmNoL2JsYWNrZmluL0tjb25maWcKaW5kZXggMjhjNjNmZS4uM2MxYmQ2NCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9LY29uZmlnCisrKyBiL2FyY2gvYmxhY2tmaW4vS2NvbmZpZwpAQCAtMjYsNyArMjYsNyBAQAogCXNlbGVjdCBIQVZFX09QUk9GSUxFCiAJc2VsZWN0IEhBVkVfUEVSRl9FVkVOVFMKIAlzZWxlY3QgQVJDSF9IQVZFX0NVU1RPTV9HUElPX0gKLQlzZWxlY3QgQVJDSF9SRVFVSVJFX0dQSU9MSUIKKwlzZWxlY3QgR1BJT0xJQgogCXNlbGVjdCBIQVZFX1VJRDE2CiAJc2VsZWN0IEhBVkVfVU5ERVJTQ09SRV9TWU1CT0xfUFJFRklYCiAJc2VsZWN0IFZJUlRfVE9fQlVTCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDEyZjVkNjguLjBhMmE3MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xNzEsMTEgKzE3MSwxMiBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0JaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpCisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKSkgewogCQltZW1jcHkodG8sIChjb25zdCB2b2lkIF9fZm9yY2UgKilmcm9tLCBuKTsKLQllbHNlCi0JCXJldHVybiBuOwotCXJldHVybiAwOworCQlyZXR1cm4gMDsKKwl9CisJbWVtc2V0KHRvLCAwLCBuKTsKKwlyZXR1cm4gbjsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZnRyYWNlLWVudHJ5LlMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9mdHJhY2UtZW50cnkuUwppbmRleCAyOGQwNTk1Li4zYjhiZGNiIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9mdHJhY2UtZW50cnkuUworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9mdHJhY2UtZW50cnkuUwpAQCAtMTY5LDcgKzE2OSw3IEBACiAJcjAgPSBzcDsJLyogdW5zaWduZWQgbG9uZyAqcGFyZW50ICovCiAJcjEgPSBbc3BdOwkvKiB1bnNpZ25lZCBsb25nIHNlbGZfYWRkciAqLwogIyBlbmRpZgotIyBpZmRlZiBDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUCisjIGlmZGVmIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogCXIyID0gZnA7CS8qIHVuc2lnbmVkIGxvbmcgZnJhbWVfcG9pbnRlciAqLwogIyBlbmRpZgogCXIwICs9IDE2OwkvKiBza2lwIHRoZSA0IGxvY2FsIHJlZ3Mgb24gc3RhY2sgKi8KQEAgLTE5MCw3ICsxOTAsNyBAQAogCVstLXNwXSA9IHIxOwogCiAJLyogZ2V0IG9yaWdpbmFsIHJldHVybiBhZGRyZXNzICovCi0jIGlmZGVmIENPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKKyMgaWZkZWYgSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUCiAJcjAgPSBmcDsJLyogQmxhY2tmaW4gaXMgc2FuZSwgc28gb21pdCB0aGlzICovCiAjIGVuZGlmCiAJY2FsbCBfZnRyYWNlX3JldHVybl90b19oYW5kbGVyOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9mdHJhY2UuYwppbmRleCAwOTVkZTBmLi44ZGFkNzU4IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC9mdHJhY2UuYwpAQCAtMTA3LDcgKzEwNyw3IEBACiAJCXJldHVybjsKIAogCWlmIChmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UoKnBhcmVudCwgc2VsZl9hZGRyLCAmdHJhY2UuZGVwdGgsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9wb2ludGVyKSA9PSAtRUJVU1kpCisJCQkJICAgICBmcmFtZV9wb2ludGVyLCBOVUxMKSA9PSAtRUJVU1kpCiAJCXJldHVybjsKIAogCXRyYWNlLmZ1bmMgPSBzZWxmX2FkZHI7CmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2NtX2JmNTYxLmMKaW5kZXggYzZkYjUyYi4uMTBjNTc3NyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9jbV9iZjU2MS5jCisrKyBiL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvY21fYmY1NjEuYwpAQCAtMTQ2LDcgKzE0Niw4IEBACiAjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CiAKIHN0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIHNtYzkxeF9pbmZvID0gewotCS5mbGFncyA9IFNNQzkxWF9VU0VfMzJCSVQgfCBTTUM5MVhfTk9XQUlULAorCS5mbGFncyA9IFNNQzkxWF9VU0VfOEJJVCB8IFNNQzkxWF9VU0VfMTZCSVQgfCBTTUM5MVhfVVNFXzMyQklUIHwKKwkJIFNNQzkxWF9OT1dBSVQsCiAJLmxlZGEgPSBSUENfTEVEXzEwMF8xMCwKIAkubGVkYiA9IFJQQ19MRURfVFhfUlgsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2JvYXJkcy9lemtpdC5jCmluZGV4IGYzNTUyNWIuLjU3ZDFjNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9ib2FyZHMvZXpraXQuYworKysgYi9hcmNoL2JsYWNrZmluL21hY2gtYmY1NjEvYm9hcmRzL2V6a2l0LmMKQEAgLTEzNCw3ICsxMzQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgogCiBzdGF0aWMgc3RydWN0IHNtYzkxeF9wbGF0ZGF0YSBzbWM5MXhfaW5mbyA9IHsKLQkuZmxhZ3MgPSBTTUM5MVhfVVNFXzMyQklUIHwgU01DOTFYX05PV0FJVCwKKwkuZmxhZ3MgPSBTTUM5MVhfVVNFXzhCSVQgfCBTTUM5MVhfVVNFXzE2QklUIHwgU01DOTFYX1VTRV8zMkJJVCB8CisJCSBTTUM5MVhfTk9XQUlULAogCS5sZWRhID0gUlBDX0xFRF8xMDBfMTAsCiAJLmxlZGIgPSBSUENfTEVEX1RYX1JYLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1iZjU2MS9jb3JlYi5jIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2NvcmViLmMKaW5kZXggNzhlY2I1MC4uOGEyNTQzYyAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2NvcmViLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWJmNTYxL2NvcmViLmMKQEAgLTU5LDE4ICs1OSw3IEBACiAJLm5hbWUgID0gImNvcmViIiwKIAkuZm9wcyAgPSAmY29yZWJfZm9wcywKIH07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJmNTYxX2NvcmViX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3RlcigmY29yZWJfZGV2KTsKLX0KLW1vZHVsZV9pbml0KGJmNTYxX2NvcmViX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYmY1NjFfY29yZWJfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3RlcigmY29yZWJfZGV2KTsKLX0KLW1vZHVsZV9leGl0KGJmNTYxX2NvcmViX2V4aXQpOworbW9kdWxlX21pc2NfZGV2aWNlKGNvcmViX2Rldik7CiAKIE1PRFVMRV9BVVRIT1IoIkJhcyBWZXJtZXVsZW4gPGJ2ZXJtZXVsQGJsYWNrc3Rhci54czRhbGwubmw+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkJGNTYxIENvcmUgQiBTdXBwb3J0Iik7CmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBlMzUzMGQwLi41NmM3ZDU3IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTE5NCwzMCArMTk0LDYgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fY29weV91c2VyX3plcm9pbmcodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19kb19jbGVhcl91c2VyKHZvaWQgX191c2VyICp0bywgdW5zaWduZWQgbG9uZyBuKTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1fX2dlbmVyaWNfY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQotewotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpCi0JCXJldHVybiBfX2NvcHlfdXNlcih0bywgZnJvbSwgbik7Ci0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotX19nZW5lcmljX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQotewotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQotCQlyZXR1cm4gX19jb3B5X3VzZXJfemVyb2luZyh0bywgZnJvbSwgbik7Ci0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotX19nZW5lcmljX2NsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCi17Ci0JaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBuKSkKLQkJcmV0dXJuIF9fZG9fY2xlYXJfdXNlcih0bywgbik7Ci0JcmV0dXJuIG47Ci19Ci0KIHN0YXRpYyBpbmxpbmUgbG9uZwogX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpCiB7CkBAIC0yODIsNyArMjU4LDcgQEAKIAllbHNlIGlmIChuID09IDI0KQogCQlfX2FzbV9jb3B5X2Zyb21fdXNlcl8yNCh0bywgZnJvbSwgcmV0KTsKIAllbHNlCi0JCXJldCA9IF9fZ2VuZXJpY19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CisJCXJldCA9IF9fY29weV91c2VyX3plcm9pbmcodG8sIGZyb20sIG4pOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTMzMyw3ICszMDksNyBAQAogCWVsc2UgaWYgKG4gPT0gMjQpCiAJCV9fYXNtX2NvcHlfdG9fdXNlcl8yNCh0bywgZnJvbSwgcmV0KTsKIAllbHNlCi0JCXJldCA9IF9fZ2VuZXJpY19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pOworCQlyZXQgPSBfX2NvcHlfdXNlcih0bywgZnJvbSwgbik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzY2LDI2ICszNDIsNDMgQEAKIAllbHNlIGlmIChuID09IDI0KQogCQlfX2FzbV9jbGVhcl8yNCh0bywgcmV0KTsKIAllbHNlCi0JCXJldCA9IF9fZ2VuZXJpY19jbGVhcl91c2VyKHRvLCBuKTsKKwkJcmV0ID0gX19kb19jbGVhcl91c2VyKHRvLCBuKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIAotI2RlZmluZSBjbGVhcl91c2VyKHRvLCBuKQkJCQlcCi0JKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8JCQlcCi0JIF9fY29uc3RhbnRfY2xlYXJfdXNlcih0bywgbikgOgkJCVwKLQkgX19nZW5lcmljX2NsZWFyX3VzZXIodG8sIG4pKQorc3RhdGljIGlubGluZSBzaXplX3QgY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHNpemVfdCBuKQoreworCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKSkKKwkJcmV0dXJuIG47CisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQorCQlyZXR1cm4gX19jb25zdGFudF9jbGVhcl91c2VyKHRvLCBuKTsKKwllbHNlCisJCXJldHVybiBfX2RvX2NsZWFyX3VzZXIodG8sIG4pOworfQogCi0jZGVmaW5lIGNvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQkJCVwKLQkoX19idWlsdGluX2NvbnN0YW50X3AobikgPwkJCVwKLQkgX19jb25zdGFudF9jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikgOglcCi0JIF9fZ2VuZXJpY19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikpCitzdGF0aWMgaW5saW5lIHNpemVfdCBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHNpemVfdCBuKQoreworCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkpIHsKKwkJbWVtc2V0KHRvLCAwLCBuKTsKKwkJcmV0dXJuIG47CisJfQorCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKKwkJcmV0dXJuIF9fY29uc3RhbnRfY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCWVsc2UKKwkJcmV0dXJuIF9fY29weV91c2VyX3plcm9pbmcodG8sIGZyb20sIG4pOworfQogCi0jZGVmaW5lIGNvcHlfdG9fdXNlcih0bywgZnJvbSwgbikJCQlcCi0JKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8JCQlcCi0JIF9fY29uc3RhbnRfY29weV90b191c2VyKHRvLCBmcm9tLCBuKSA6CQlcCi0JIF9fZ2VuZXJpY19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pKQorc3RhdGljIGlubGluZSBzaXplX3QgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgc2l6ZV90IG4pCit7CisJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpKQorCQlyZXR1cm4gbjsKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpCisJCXJldHVybiBfX2NvbnN0YW50X2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbik7CisJZWxzZQorCQlyZXR1cm4gX19jb3B5X3VzZXIodG8sIGZyb20sIG4pOworfQogCiAvKiBXZSBsZXQgdGhlIF9fIHZlcnNpb25zIG9mIGNvcHlfZnJvbS90b191c2VyIGlubGluZSwgYmVjYXVzZSB0aGV5J3JlIG9mdGVuCiAgKiB1c2VkIGluIGZhc3QgcGF0aHMgYW5kIGhhdmUgb25seSBhIHNtYWxsIHNwYWNlIG92ZXJoZWFkLgpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDNhYzlhNTkuLjg3ZDllMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL2Zydi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTI2MywxOSArMjYzLDI1IEBACiBleHRlcm4gbG9uZyBfX21lbXNldF91c2VyKHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCk7CiBleHRlcm4gbG9uZyBfX21lbWNweV91c2VyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIAotI2RlZmluZSBjbGVhcl91c2VyKGRzdCxjb3VudCkJCQlfX21lbXNldF91c2VyKF9fX19mb3JjZShkc3QpLCAoY291bnQpKQorI2RlZmluZSBfX2NsZWFyX3VzZXIoZHN0LGNvdW50KQkJCV9fbWVtc2V0X3VzZXIoX19fX2ZvcmNlKGRzdCksIChjb3VudCkpCiAjZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCV9fbWVtY3B5X3VzZXIoKHRvKSwgX19fX2ZvcmNlKGZyb20pLCAobikpCiAjZGVmaW5lIF9fY29weV90b191c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKQlfX21lbWNweV91c2VyKF9fX19mb3JjZSh0byksIChmcm9tKSwgKG4pKQogCiAjZWxzZQogCi0jZGVmaW5lIGNsZWFyX3VzZXIoZHN0LGNvdW50KQkJCShtZW1zZXQoX19fX2ZvcmNlKGRzdCksIDAsIChjb3VudCkpLCAwKQorI2RlZmluZSBfX2NsZWFyX3VzZXIoZHN0LGNvdW50KQkJCShtZW1zZXQoX19fX2ZvcmNlKGRzdCksIDAsIChjb3VudCkpLCAwKQogI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKQkobWVtY3B5KCh0byksIF9fX19mb3JjZShmcm9tKSwgKG4pKSwgMCkKICNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCShtZW1jcHkoX19fX2ZvcmNlKHRvKSwgKGZyb20pLCAobikpLCAwKQogCiAjZW5kaWYKIAotI2RlZmluZSBfX2NsZWFyX3VzZXIgY2xlYXJfdXNlcgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlpZiAobGlrZWx5KF9fYWNjZXNzX29rKHRvLCBuKSkpCisJCW4gPSBfX2NsZWFyX3VzZXIodG8sIG4pOworCXJldHVybiBuOworfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCiBfX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL2hleGFnb24vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IGYwMDBhMzguLmY2MWNmYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTAzLDcgKzEwMyw4IEBACiB7CiAJbG9uZyByZXMgPSBfX3N0cm5sZW5fdXNlcihzcmMsIG4pOwogCi0JLyogcmV0dXJuIGZyb20gc3RybmxlbiBjYW4ndCBiZSB6ZXJvIC0tIHRoYXQgd291bGQgYmUgcnViYmlzaC4gKi8KKwlpZiAodW5saWtlbHkoIXJlcykpCisJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKHJlcyA+IG4pIHsKIAkJY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIG4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCAyOWJkNTk3Li5jNzAyNjQyIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtNTYsNyArNTYsNyBAQAogI2RlZmluZSBhbGxvY190aHJlYWRfc3RhY2tfbm9kZSh0c2ssIG5vZGUpCSgodW5zaWduZWQgbG9uZyAqKSAwKQogI2RlZmluZSB0YXNrX3RocmVhZF9pbmZvKHRzaykJKChzdHJ1Y3QgdGhyZWFkX2luZm8gKikgMCkKICNlbmRpZgotI2RlZmluZSBmcmVlX3RocmVhZF9zdGFjayh0aSkJLyogbm90aGluZyAqLworI2RlZmluZSBmcmVlX3RocmVhZF9zdGFjayh0c2spCS8qIG5vdGhpbmcgKi8KICNkZWZpbmUgdGFza19zdGFja19wYWdlKHRzaykJKCh2b2lkICopKHRzaykpCiAKICNkZWZpbmUgX19IQVZFX1RIUkVBRF9GVU5DVElPTlMKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDQ2NWM3MDkuLmJmZTEzMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMjQxLDggKzI0MSw3IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIF9fY29weV90b191c2VyICh2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChjb3VudCkpCi0JCWNoZWNrX29iamVjdF9zaXplKGZyb20sIGNvdW50LCB0cnVlKTsKKwljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBjb3VudCwgdHJ1ZSk7CiAKIAlyZXR1cm4gX19jb3B5X3VzZXIodG8sIChfX2ZvcmNlIHZvaWQgX191c2VyICopIGZyb20sIGNvdW50KTsKIH0KQEAgLTI1MCw4ICsyNDksNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBfX2NvcHlfZnJvbV91c2VyICh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChjb3VudCkpCi0JCWNoZWNrX29iamVjdF9zaXplKHRvLCBjb3VudCwgZmFsc2UpOworCWNoZWNrX29iamVjdF9zaXplKHRvLCBjb3VudCwgZmFsc2UpOwogCiAJcmV0dXJuIF9fY29weV91c2VyKChfX2ZvcmNlIHZvaWQgX191c2VyICopIHRvLCBmcm9tLCBjb3VudCk7CiB9CkBAIC0yNjUsMjcgKzI2MywyMiBAQAogCWxvbmcgX19jdV9sZW4gPSAobik7CQkJCQkJCQlcCiAJCQkJCQkJCQkJCVwKIAlpZiAoX19hY2Nlc3Nfb2soX19jdV90bywgX19jdV9sZW4sIGdldF9mcygpKSkgewkJCQkJXAotCQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQkJCQkJCVwKLQkJCWNoZWNrX29iamVjdF9zaXplKF9fY3VfZnJvbSwgX19jdV9sZW4sIHRydWUpOwkJCVwKKwkJY2hlY2tfb2JqZWN0X3NpemUoX19jdV9mcm9tLCBfX2N1X2xlbiwgdHJ1ZSk7CQkJXAogCQlfX2N1X2xlbiA9IF9fY29weV91c2VyKF9fY3VfdG8sIChfX2ZvcmNlIHZvaWQgX191c2VyICopICBfX2N1X2Zyb20sIF9fY3VfbGVuKTsJXAogCX0JCQkJCQkJCQkJXAogCV9fY3VfbGVuOwkJCQkJCQkJCVwKIH0pCiAKLSNkZWZpbmUgY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pCQkJCQkJCVwKLSh7CQkJCQkJCQkJCQlcCi0Jdm9pZCAqX19jdV90byA9ICh0byk7CQkJCQkJCQlcCi0JY29uc3Qgdm9pZCBfX3VzZXIgKl9fY3VfZnJvbSA9IChmcm9tKTsJCQkJCQlcCi0JbG9uZyBfX2N1X2xlbiA9IChuKTsJCQkJCQkJCVwKLQkJCQkJCQkJCQkJXAotCV9fY2hrX3VzZXJfcHRyKF9fY3VfZnJvbSk7CQkJCQkJCVwKLQlpZiAoX19hY2Nlc3Nfb2soX19jdV9mcm9tLCBfX2N1X2xlbiwgZ2V0X2ZzKCkpKSB7CQkJCVwKLQkJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkJCQkJCQlcCi0JCQljaGVja19vYmplY3Rfc2l6ZShfX2N1X3RvLCBfX2N1X2xlbiwgZmFsc2UpOwkJCVwKLQkJX19jdV9sZW4gPSBfX2NvcHlfdXNlcigoX19mb3JjZSB2b2lkIF9fdXNlciAqKSBfX2N1X3RvLCBfX2N1X2Zyb20sIF9fY3VfbGVuKTsJXAotCX0JCQkJCQkJCQkJXAotCV9fY3VfbGVuOwkJCQkJCQkJCVwKLX0pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCWNoZWNrX29iamVjdF9zaXplKHRvLCBuLCBmYWxzZSk7CisJaWYgKGxpa2VseShfX2FjY2Vzc19vayhmcm9tLCBuLCBnZXRfZnMoKSkpKQorCQluID0gX19jb3B5X3VzZXIoKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKikgdG8sIGZyb20sIG4pOworCWVsc2UKKwkJbWVtc2V0KHRvLCAwLCBuKTsKKwlyZXR1cm4gbjsKK30KIAogI2RlZmluZSBfX2NvcHlfaW5fdXNlcih0bywgZnJvbSwgc2l6ZSkJX19jb3B5X3VzZXIoKHRvKSwgKGZyb20pLCAoc2l6ZSkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKaW5kZXggOTJiN2JjOS4uOTI3M2UwMyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKQEAgLTc5Niw3ICs3OTYsNyBAQAogICogIEFDUEkgYmFzZWQgaG90cGx1ZyBDUFUgc3VwcG9ydAogICovCiAjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19DUFUKLXN0YXRpYyBpbnQgYWNwaV9tYXBfY3B1Mm5vZGUoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgY3B1LCBpbnQgcGh5c2lkKQoraW50IGFjcGlfbWFwX2NwdTJub2RlKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IGNwdSwgaW50IHBoeXNpZCkKIHsKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCmluZGV4IGViOTIyMGMuLjk1MDljYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwpAQCAtOTg2LDcgKzk4Niw3IEBACiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCXByZXZpb3VzX2N1cnJlbnQgPSBjdXJyX3Rhc2soY3B1KTsKLQlzZXRfY3Vycl90YXNrKGNwdSwgY3VycmVudCk7CisJaWE2NF9zZXRfY3Vycl90YXNrKGNwdSwgY3VycmVudCk7CiAJaWYgKChwID0gc3RyY2hyKGN1cnJlbnQtPmNvbW0sICcgJykpKQogCQkqcCA9ICdcMCc7CiAKQEAgLTEzNjAsMTQgKzEzNjAsMTQgQEAKIAkJCQljcHVtYXNrX2NsZWFyX2NwdShpLCAmbWNhX2NwdSk7CS8qIHdha2UgbmV4dCBjcHUgKi8KIAkJCQl3aGlsZSAobW9uYXJjaF9jcHUgIT0gLTEpCiAJCQkJCWNwdV9yZWxheCgpOwkvKiBzcGluIHVudGlsIGxhc3QgY3B1IGxlYXZlcyAqLwotCQkJCXNldF9jdXJyX3Rhc2soY3B1LCBwcmV2aW91c19jdXJyZW50KTsKKwkJCQlpYTY0X3NldF9jdXJyX3Rhc2soY3B1LCBwcmV2aW91c19jdXJyZW50KTsKIAkJCQlpYTY0X21jX2luZm8uaW1pX3JlbmRlel9jaGVja2luW2NwdV0KIAkJCQkJCT0gSUE2NF9NQ0FfUkVOREVaX0NIRUNLSU5fTk9URE9ORTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCX0KIAl9Ci0Jc2V0X2N1cnJfdGFzayhjcHUsIHByZXZpb3VzX2N1cnJlbnQpOworCWlhNjRfc2V0X2N1cnJfdGFzayhjcHUsIHByZXZpb3VzX2N1cnJlbnQpOwogCWlhNjRfbWNfaW5mby5pbWlfcmVuZGV6X2NoZWNraW5bY3B1XSA9IElBNjRfTUNBX1JFTkRFWl9DSEVDS0lOX05PVERPTkU7CiAJbW9uYXJjaF9jcHUgPSAtMTsJLyogVGhpcyBmcmVlcyB0aGUgc2xhdmVzIGFuZCBwcmV2aW91cyBtb25hcmNocyAqLwogfQpAQCAtMTcyOSw3ICsxNzI5LDcgQEAKIAkJTk9USUZZX0lOSVQoRElFX0lOSVRfU0xBVkVfTEVBVkUsIHJlZ3MsIChsb25nKSZuZCwgMSk7CiAKIAkJbXByaW50aygiU2xhdmUgb24gY3B1ICVkIHJldHVybmluZyB0byBub3JtYWwgc2VydmljZS5cbiIsIGNwdSk7Ci0JCXNldF9jdXJyX3Rhc2soY3B1LCBwcmV2aW91c19jdXJyZW50KTsKKwkJaWE2NF9zZXRfY3Vycl90YXNrKGNwdSwgcHJldmlvdXNfY3VycmVudCk7CiAJCWlhNjRfbWNfaW5mby5pbWlfcmVuZGV6X2NoZWNraW5bY3B1XSA9IElBNjRfTUNBX1JFTkRFWl9DSEVDS0lOX05PVERPTkU7CiAJCWF0b21pY19kZWMoJnNsYXZlcyk7CiAJCXJldHVybjsKQEAgLTE3NTYsNyArMTc1Niw3IEBACiAKIAltcHJpbnRrKCJcbklOSVQgZHVtcCBjb21wbGV0ZS4gIE1vbmFyY2ggb24gY3B1ICVkIHJldHVybmluZyB0byBub3JtYWwgc2VydmljZS5cbiIsIGNwdSk7CiAJYXRvbWljX2RlYygmbW9uYXJjaHMpOwotCXNldF9jdXJyX3Rhc2soY3B1LCBwcmV2aW91c19jdXJyZW50KTsKKwlpYTY0X3NldF9jdXJyX3Rhc2soY3B1LCBwcmV2aW91c19jdXJyZW50KTsKIAltb25hcmNoX2NwdSA9IC0xOwogCXJldHVybjsKIH0KQEAgLTE4OTAsNyArMTg5MCw3IEBACiAJCQkJCQkJICAgICAgUEFHRV9LRVJORUwpKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGlhNjRfbWNhX2NtY192ZWN0b3JfYWRqdXN0KHZvaWQgKmR1bW15KQorc3RhdGljIGludCBpYTY0X21jYV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTg5OCwyNSArMTg5OCw5IEBACiAJaWYgKCFjbWNfcG9sbGluZ19lbmFibGVkKQogCQlpYTY0X21jYV9jbWNfdmVjdG9yX2VuYWJsZShOVUxMKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWNhX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCQkgICAgICB2b2lkICpoY3B1KQotewotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JCWlhNjRfbWNhX2NtY192ZWN0b3JfYWRqdXN0KE5VTEwpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtY2FfY3B1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gbWNhX2NwdV9jYWxsYmFjawotfTsKLQogLyoKICAqIGlhNjRfbWNhX2luaXQKICAqCkBAIC0yMTExLDE1ICsyMDk1LDEzIEBACiAJaWYgKCFtY2FfaW5pdCkKIAkJcmV0dXJuIDA7CiAKLQlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm1jYV9jcHVfbm90aWZpZXIpOwotCiAJLyogU2V0dXAgdGhlIENNQ0kvUCB2ZWN0b3IgYW5kIGhhbmRsZXIgKi8KIAlzZXR1cF90aW1lcigmY21jX3BvbGxfdGltZXIsIGlhNjRfbWNhX2NtY19wb2xsLCAwVUwpOwogCiAJLyogVW5tYXNrL2VuYWJsZSB0aGUgdmVjdG9yICovCiAJY21jX3BvbGxpbmdfZW5hYmxlZCA9IDA7Ci0Jc2NoZWR1bGVfd29yaygmY21jX2VuYWJsZV93b3JrKTsKLQorCWNwdWhwX3NldHVwX3N0YXRlKENQVUhQX0FQX09OTElORV9EWU4sICJpYTY0L21jYTpvbmxpbmUiLAorCQkJICBpYTY0X21jYV9jcHVfb25saW5lLCBOVUxMKTsKIAlJQTY0X01DQV9ERUJVRygiJXM6IENNQ0kvUCBzZXR1cCBhbmQgZW5hYmxlZC5cbiIsIF9fZnVuY19fKTsKIAogI2lmZGVmIENPTkZJR19BQ1BJCmRpZmYgLS1naXQgYS9hcmNoL20zMnIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBjYWM3MDE0Li42Zjg5ODIxIDEwMDY0NAotLS0gYS9hcmNoL20zMnIvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTIxOSw3ICsyMTksNyBAQAogI2RlZmluZSBfX2dldF91c2VyX25vY2hlY2soeCwgcHRyLCBzaXplKQkJCQlcCiAoewkJCQkJCQkJCVwKIAlsb25nIF9fZ3VfZXJyID0gMDsJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBfX2d1X3ZhbDsJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBfX2d1X3ZhbCA9IDA7CQkJCQlcCiAJbWlnaHRfZmF1bHQoKTsJCQkJCQkJXAogCV9fZ2V0X3VzZXJfc2l6ZShfX2d1X3ZhbCwgKHB0ciksIChzaXplKSwgX19ndV9lcnIpOwkJXAogCSh4KSA9IChfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSlfX2d1X3ZhbDsJCQlcCmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IDQ5OGI1NjcuLmQxNDAyMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC0xNCw3ICsxNCw2IEBACiAJc2VsZWN0IEdFTkVSSUNfSU9NQVAKIAlzZWxlY3QgR0VORVJJQ19TVFJOQ1BZX0ZST01fVVNFUiBpZiBNTVUKIAlzZWxlY3QgR0VORVJJQ19TVFJOTEVOX1VTRVIgaWYgTU1VCi0Jc2VsZWN0IEZQVSBpZiBNTVUKIAlzZWxlY3QgQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAJc2VsZWN0IEFSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUIGlmIE1NVSAmJiAhQ09MREZJUkUKIAlzZWxlY3QgSEFWRV9GVVRFWF9DTVBYQ0hHIGlmIE1NVSAmJiBGVVRFWApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcuY3B1IGIvYXJjaC9tNjhrL0tjb25maWcuY3B1CmluZGV4IDk2NzI2MGYuLmQyMjE5ZjMwIDEwMDY0NAotLS0gYS9hcmNoL202OGsvS2NvbmZpZy5jcHUKKysrIGIvYXJjaC9tNjhrL0tjb25maWcuY3B1CkBAIC02Miw2ICs2Miw3IEBACiBjb25maWcgTTY4MDIwCiAJYm9vbCAiNjgwMjAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1NVQorCXNlbGVjdCBGUFUKIAlzZWxlY3QgQ1BVX0hBU19BRERSRVNTX1NQQUNFUwogCWhlbHAKIAkgIElmIHlvdSBhbnRpY2lwYXRlIHJ1bm5pbmcgdGhpcyBrZXJuZWwgb24gYSBjb21wdXRlciB3aXRoIGEgTUM2ODAyMApAQCAtNzIsNiArNzMsNyBAQAogY29uZmlnIE02ODAzMAogCWJvb2wgIjY4MDMwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNTVUgJiYgIU1NVV9TVU4zCisJc2VsZWN0IEZQVQogCXNlbGVjdCBDUFVfSEFTX0FERFJFU1NfU1BBQ0VTCiAJaGVscAogCSAgSWYgeW91IGFudGljaXBhdGUgcnVubmluZyB0aGlzIGtlcm5lbCBvbiBhIGNvbXB1dGVyIHdpdGggYSBNQzY4MDMwCkBAIC04MSw2ICs4Myw3IEBACiBjb25maWcgTTY4MDQwCiAJYm9vbCAiNjgwNDAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1NVSAmJiAhTU1VX1NVTjMKKwlzZWxlY3QgRlBVCiAJc2VsZWN0IENQVV9IQVNfQUREUkVTU19TUEFDRVMKIAloZWxwCiAJICBJZiB5b3UgYW50aWNpcGF0ZSBydW5uaW5nIHRoaXMga2VybmVsIG9uIGEgY29tcHV0ZXIgd2l0aCBhIE1DNjhMQzA0MApAQCAtOTEsNiArOTQsNyBAQAogY29uZmlnIE02ODA2MAogCWJvb2wgIjY4MDYwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNTVUgJiYgIU1NVV9TVU4zCisJc2VsZWN0IEZQVQogCXNlbGVjdCBDUFVfSEFTX0FERFJFU1NfU1BBQ0VTCiAJaGVscAogCSAgSWYgeW91IGFudGljaXBhdGUgcnVubmluZyB0aGlzIGtlcm5lbCBvbiBhIGNvbXB1dGVyIHdpdGggYSBNQzY4MDYwCkBAIC0yNTksNiArMjYzLDcgQEAKIAlib29sICJNQ0Y1NDd4IgogCXNlbGVjdCBNNTR4eAogCXNlbGVjdCBNTVVfQ09MREZJUkUgaWYgTU1VCisJc2VsZWN0IEZQVSBpZiBNTVUKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCXNlbGVjdCBIQVZFX01CQVIKIAlzZWxlY3QgQ1BVX05PX0VGRklDSUVOVF9GRlMKQEAgLTI2OCw2ICsyNzMsNyBAQAogY29uZmlnIE01NDh4CiAJYm9vbCAiTUNGNTQ4eCIKIAlzZWxlY3QgTU1VX0NPTERGSVJFIGlmIE1NVQorCXNlbGVjdCBGUFUgaWYgTU1VCiAJc2VsZWN0IE01NHh4CiAJc2VsZWN0IEhBVkVfQ0FDSEVfQ0IKIAlzZWxlY3QgSEFWRV9NQkFSCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMgYi9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMKaW5kZXggZWM5Y2MxZi4uZGRiODE5MiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYwpAQCAtMzk2LDcgKzM5Niw3IEBACiAJbWFjaF9tYXhfZG1hX2FkZHJlc3MgPSAweGZmZmZmZmZmOwogCiAJbWFjaF9yZXNldCAgICAgICAgICAgPSBhbWlnYV9yZXNldDsKLSNpZiBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVApIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5QVVRfTTY4S19CRUVQKQogCW1hY2hfYmVlcCAgICAgICAgICAgID0gYW1pZ2FfbWtzb3VuZDsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMgYi9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMKaW5kZXggY2JkNTk5MS4uOTdhM2MzOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2F0YXJpL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYwpAQCAtMjExLDcgKzIxMSw3IEBACiAJYXJjaF9nZXR0aW1lb2Zmc2V0ICAgPSBhdGFyaV9nZXR0aW1lb2Zmc2V0OwogCW1hY2hfcmVzZXQgICAgICAgICAgID0gYXRhcmlfcmVzZXQ7CiAJbWFjaF9tYXhfZG1hX2FkZHJlc3MgPSAweGZmZmZmZjsKLSNpZiBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVApIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5QVVRfTTY4S19CRUVQKQogCW1hY2hfYmVlcCAgICAgICAgICA9IGF0YXJpX21rc291bmQ7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29sZGZpcmUvY2xrLmMgYi9hcmNoL202OGsvY29sZGZpcmUvY2xrLmMKaW5kZXggZmRkZmRjYy4uMWUzYzdlOSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbGRmaXJlL2Nsay5jCisrKyBiL2FyY2gvbTY4ay9jb2xkZmlyZS9jbGsuYwpAQCAtMTAxLDYgKzEwMSwxMCBAQAogdm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghY2xrKQorCQlyZXR1cm47CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2xrX2xvY2ssIGZsYWdzKTsKIAlpZiAoKC0tY2xrLT5lbmFibGVkID09IDApICYmIGNsay0+Y2xrX29wcykKIAkJY2xrLT5jbGtfb3BzLT5kaXNhYmxlKGNsayk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29sZGZpcmUvaGVhZC5TIGIvYXJjaC9tNjhrL2NvbGRmaXJlL2hlYWQuUwppbmRleCA3M2Q5MmVhLi5iZGI0NzJjIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29sZGZpcmUvaGVhZC5TCisrKyBiL2FyY2gvbTY4ay9jb2xkZmlyZS9oZWFkLlMKQEAgLTI4MCwxMCArMjgwLDEwIEBACiAJbW92ZWwJJWQwLG02OGtfY3B1dHlwZQkJLyogTWFyayB1cyBhcyBhIENvbGRGaXJlICovCiAJbW92ZWwJI01NVV9DT0xERklSRSwlZDAKIAltb3ZlbAklZDAsbTY4a19tbXV0eXBlCi0JbW92ZWwJI0ZQVV9DT0xERklSRSwlZDAKLQltb3ZlbAklZDAsbTY4a19mcHV0eXBlCi0JbW92ZWwJI01BQ0hfTTU0WFgsJWQwCi0JbW92ZWwJJWQwLG02OGtfbWFjaHR5cGUJCS8qIE1hcmsgdXMgYXMgYSA1NHh4IG1hY2hpbmUgKi8KKwltb3ZlbAkjRlBVVFlQRSwlZDAKKwltb3ZlbAklZDAsbTY4a19mcHV0eXBlCQkvKiBNYXJrIEZQVSB0eXBlICovCisJbW92ZWwJI01BQ0hJTkUsJWQwCisJbW92ZWwJJWQwLG02OGtfbWFjaHR5cGUJCS8qIE1hcmsgbWFjaGluZSB0eXBlICovCiAJbGVhCWluaXRfdGFzaywlYTIJCQkvKiBTZXQgImN1cnJlbnQiIGluaXQgdGFzayAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTI4eC5jIGIvYXJjaC9tNjhrL2NvbGRmaXJlL201Mjh4LmMKaW5kZXggNDVlOTQ3YS4uMTJmOWUzNyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbGRmaXJlL201Mjh4LmMKKysrIGIvYXJjaC9tNjhrL2NvbGRmaXJlL201Mjh4LmMKQEAgLTEwMiwxNCArMTAyLDE0IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiV2lsZEZpcmVNb2QgaGliZXJuYXRpbmcuLi5cbiIpOwogCiAJLyogU2V0IHBvcnRFLjUgdG8gRGlnaXRhbCBJTyAqLwotCU1DRjUyODJfR1BJT19QRVBBUiAmPSB+KDEgPDwgKDUgKiAyKSk7CisJd3JpdGV3KHJlYWR3KE1DRkdQSU9fUEVQQVIpICYgfigxIDw8ICg1ICogMikpLCBNQ0ZHUElPX1BFUEFSKTsKIAogCS8qIE1ha2UgcG9ydEUuNSBhbiBvdXRwdXQgKi8KLQlNQ0Y1MjgyX0dQSU9fRERSRSB8PSAoMSA8PCA1KTsKKwl3cml0ZWIocmVhZGIoTUNGR1BJT19QRERSX0UpIHwgKDEgPDwgNSksIE1DRkdQSU9fUEREUl9FKTsKIAogCS8qIE5vdyB0b2dnbGUgcG9ydEUuNSBmcm9tIGxvdyB0byBoaWdoICovCi0JTUNGNTI4Ml9HUElPX1BPUlRFICY9IH4oMSA8PCA1KTsKLQlNQ0Y1MjgyX0dQSU9fUE9SVEUgfD0gKDEgPDwgNSk7CisJd3JpdGViKHJlYWRiKE1DRkdQSU9fUE9EUl9FKSAmIH4oMSA8PCA1KSwgTUNGR1BJT19QT0RSX0UpOworCXdyaXRlYihyZWFkYihNQ0ZHUElPX1BPRFJfRSkgfCAoMSA8PCA1KSwgTUNGR1BJT19QT0RSX0UpOwogCiAJcHJpbnRrKEtFUk5fRU1FUkcgIkZhaWxlZCB0byBoaWJlcm5hdGUuIEhhbHRpbmchXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTN4eC5jIGIvYXJjaC9tNjhrL2NvbGRmaXJlL201M3h4LmMKaW5kZXggODA4NzlhNy4uMjUwMmY2MyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbGRmaXJlL201M3h4LmMKKysrIGIvYXJjaC9tNjhrL2NvbGRmaXJlL201M3h4LmMKQEAgLTI3MSw5ICsyNzEsNiBAQAogCiAjZGVmaW5lIE5BTkRfRkxBU0hfQUREUkVTUwkoMHhEMDAwMDAwMCkKIAotaW50IHN5c19jbGtfa2h6ID0gMDsKLWludCBzeXNfY2xrX21oeiA9IDA7Ci0KIHZvaWQgd3RtX2luaXQodm9pZCk7CiB2b2lkIHNjbV9pbml0KHZvaWQpOwogdm9pZCBncGlvX2luaXQodm9pZCk7CkBAIC0yODYsOSArMjgzLDggQEAKIAogYXNtbGlua2FnZSB2b2lkIF9faW5pdCBzeXNpbml0KHZvaWQpCiB7Ci0Jc3lzX2Nsa19raHogPSBjbG9ja19wbGwoMCwgMCk7Ci0Jc3lzX2Nsa19taHogPSBzeXNfY2xrX2toei8xMDAwOwotCQorCWNsb2NrX3BsbCgwLCAwKTsKKwogCXd0bV9pbml0KCk7CiAJc2NtX2luaXQoKTsKIAlncGlvX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb2xkZmlyZS9tNTR4eC5jIGIvYXJjaC9tNjhrL2NvbGRmaXJlL201NHh4LmMKaW5kZXggYzMyZjc2Ny4uMzg2ZGYzYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbGRmaXJlL201NHh4LmMKKysrIGIvYXJjaC9tNjhrL2NvbGRmaXJlL201NHh4LmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxhc20vbTU0eHhncHQuaD4KICNpZmRlZiBDT05GSUdfTU1VCiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGZuLmg+CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTc4LDQ3ICs3NywxMCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZkZWYgQ09ORklHX01NVQotCi11bnNpZ25lZCBsb25nIG51bV9wYWdlczsKLQotc3RhdGljIHZvaWQgX19pbml0IG1jZjU0eHhfYm9vdG1lbV9hbGxvYyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOwotCXVuc2lnbmVkIGxvbmcgbWVtc3RhcnQ7Ci0KLQkvKiBfcmFtYmFzZSBhbmQgX3JhbWVuZCB3aWxsIGJlIG5hdHVyYWxseSBwYWdlIGFsaWduZWQgKi8KLQltNjhrX21lbW9yeVswXS5hZGRyID0gX3JhbWJhc2U7Ci0JbTY4a19tZW1vcnlbMF0uc2l6ZSA9IF9yYW1lbmQgLSBfcmFtYmFzZTsKLQotCS8qIGNvbXB1dGUgdG90YWwgcGFnZXMgaW4gc3lzdGVtICovCi0JbnVtX3BhZ2VzID0gUEZOX0RPV04oX3JhbWVuZCAtIF9yYW1iYXNlKTsKLQotCS8qIHBhZ2UgbnVtYmVycyAqLwotCW1lbXN0YXJ0ID0gUEFHRV9BTElHTihfcmFtc3RhcnQpOwotCW1pbl9sb3dfcGZuID0gUEZOX0RPV04oX3JhbWJhc2UpOwotCXN0YXJ0X3BmbiA9IFBGTl9ET1dOKG1lbXN0YXJ0KTsKLQltYXhfcGZuID0gbWF4X2xvd19wZm4gPSBQRk5fRE9XTihfcmFtZW5kKTsKLQloaWdoX21lbW9yeSA9ICh2b2lkICopX3JhbWVuZDsKLQotCW02OGtfdmlydF90b19ub2RlX3NoaWZ0ID0gZmxzKF9yYW1lbmQgLSBfcmFtYmFzZSAtIDEpIC0gNjsKLQltb2R1bGVfZml4dXAoTlVMTCwgX19zdGFydF9maXh1cCwgX19zdG9wX2ZpeHVwKTsKLQotCS8qIHNldHVwIGJvb3RtZW0gZGF0YSAqLwotCW02OGtfc2V0dXBfbm9kZSgwKTsKLQltZW1zdGFydCArPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIHN0YXJ0X3BmbiwKLQkJbWluX2xvd19wZm4sIG1heF9sb3dfcGZuKTsKLQlmcmVlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIG1lbXN0YXJ0LCBfcmFtZW5kIC0gbWVtc3RhcnQpOwotfQotCi0jZW5kaWYgLyogQ09ORklHX01NVSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiB2b2lkIF9faW5pdCBjb25maWdfQlNQKGNoYXIgKmNvbW1hbmRwLCBpbnQgc2l6ZSkKIHsKICNpZmRlZiBDT05GSUdfTU1VCi0JbWNmNTR4eF9ib290bWVtX2FsbG9jKCk7CisJY2ZfYm9vdG1lbV9hbGxvYygpOwogCW1tdV9jb250ZXh0X2luaXQoKTsKICNlbmRpZgogCW1hY2hfcmVzZXQgPSBtY2Y1NHh4X3Jlc2V0OwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvYW1pZ2FfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYW1pZ2FfZGVmY29uZmlnCmluZGV4IDhmNWI2ZjcuLjU1YmU3ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2FtaWdhX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9hbWlnYV9kZWZjb25maWcKQEAgLTU2Niw2ICs1NjYsOCBAQAogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTU4NCw2ICs1ODYsNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvYXBvbGxvX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2Fwb2xsb19kZWZjb25maWcKaW5kZXggMzFiZGVkOS4uMzY1ZGRhNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2Fwb2xsb19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYXBvbGxvX2RlZmNvbmZpZwpAQCAtNTI1LDYgKzUyNSw4IEBACiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNTQzLDYgKzU0NSw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9hdGFyaV9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9hdGFyaV9kZWZjb25maWcKaW5kZXggMGQ3NzM5ZS4uY2UzY2JmZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvYXRhcmlfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL2F0YXJpX2RlZmNvbmZpZwpAQCAtNTQ2LDYgKzU0Niw4IEBACiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNTY0LDYgKzU2Niw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9idm1lNjAwMF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9idm1lNjAwMF9kZWZjb25maWcKaW5kZXggMmNiYjVjNC4uOGRiNDk2YSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvYnZtZTYwMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL2J2bWU2MDAwX2RlZmNvbmZpZwpAQCAtNTE3LDYgKzUxNyw4IEBACiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNTM1LDYgKzUzNyw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9ocDMwMF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9ocDMwMF9kZWZjb25maWcKaW5kZXggOTYxMDJhNC4uODMxNDE1NiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvaHAzMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL2hwMzAwX2RlZmNvbmZpZwpAQCAtNTI3LDYgKzUyNyw4IEBACiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNTQ1LDYgKzU0Nyw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9tYWNfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbWFjX2RlZmNvbmZpZwppbmRleCA5N2Q4OGY3Li42NjAwMjcwIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9tYWNfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL21hY19kZWZjb25maWcKQEAgLTU0OSw2ICs1NDksOCBAQAogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTU2Nyw2ICs1NjksNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXVsdGlfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvbXVsdGlfZGVmY29uZmlnCmluZGV4IGJlMjVlZjIuLjkwYWJmZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL211bHRpX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9tdWx0aV9kZWZjb25maWcKQEAgLTYyOSw2ICs2MjksOCBAQAogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTY0Nyw2ICs2NDksNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTQ3X2RlZmNvbmZpZwppbmRleCBhMDA4MzQ0Li4wZDUwMmMyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9tdm1lMTQ3X2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTQ3X2RlZmNvbmZpZwpAQCAtNTE3LDYgKzUxNyw4IEBACiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNTM1LDYgKzUzNyw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL212bWUxNnhfZGVmY29uZmlnCmluZGV4IDY3MzVhMjUuLjU5MzBlOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL212bWUxNnhfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL212bWUxNnhfZGVmY29uZmlnCkBAIC01MTcsNiArNTE3LDggQEAKIENPTkZJR19URVNUX1NUQVRJQ19LRVlTPW0KIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NSWVBUT19SU0E9bQorQ09ORklHX0NSWVBUT19ESD1tCitDT05GSUdfQ1JZUFRPX0VDREg9bQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fVVNFUj1tCiBDT05GSUdfQ1JZUFRPX0NSWVBURD1tCkBAIC01MzUsNiArNTM3LDcgQEAKIENPTkZJR19DUllQVE9fUk1EMjU2PW0KIENPTkZJR19DUllQVE9fUk1EMzIwPW0KIENPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fU0hBMz1tCiBDT05GSUdfQ1JZUFRPX1RHUjE5Mj1tCiBDT05GSUdfQ1JZUFRPX1dQNTEyPW0KIENPTkZJR19DUllQVE9fQU5VQklTPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL3E0MF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9xNDBfZGVmY29uZmlnCmluZGV4IDc4MGM2ZTkuLjc0ZTNhZDggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL3E0MF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvcTQwX2RlZmNvbmZpZwpAQCAtNTQwLDYgKzU0MCw4IEBACiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DUllQVE9fUlNBPW0KK0NPTkZJR19DUllQVE9fREg9bQorQ09ORklHX0NSWVBUT19FQ0RIPW0KIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX1VTRVI9bQogQ09ORklHX0NSWVBUT19DUllQVEQ9bQpAQCAtNTU4LDYgKzU2MCw3IEBACiBDT05GSUdfQ1JZUFRPX1JNRDI1Nj1tCiBDT05GSUdfQ1JZUFRPX1JNRDMyMD1tCiBDT05GSUdfQ1JZUFRPX1NIQTUxMj1tCitDT05GSUdfQ1JZUFRPX1NIQTM9bQogQ09ORklHX0NSWVBUT19UR1IxOTI9bQogQ09ORklHX0NSWVBUT19XUDUxMj1tCiBDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9zdW4zX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL3N1bjNfZGVmY29uZmlnCmluZGV4IDQ0NjkzY2YuLjRiYTg2MDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL3N1bjNfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL3N1bjNfZGVmY29uZmlnCkBAIC01MTgsNiArNTE4LDggQEAKIENPTkZJR19URVNUX1VERUxBWT1tCiBDT05GSUdfVEVTVF9TVEFUSUNfS0VZUz1tCiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTUzNiw2ICs1MzgsNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM3hfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM3hfZGVmY29uZmlnCmluZGV4IGVmMDA3MWQuLmM2ZjQ5NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL3N1bjN4X2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9zdW4zeF9kZWZjb25maWcKQEAgLTUxOSw2ICs1MTksOCBAQAogQ09ORklHX1RFU1RfU1RBVElDX0tFWVM9bQogQ09ORklHX0VBUkxZX1BSSU5USz15CiBDT05GSUdfQ1JZUFRPX1JTQT1tCitDT05GSUdfQ1JZUFRPX0RIPW0KK0NPTkZJR19DUllQVE9fRUNESD1tCiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19VU0VSPW0KIENPTkZJR19DUllQVE9fQ1JZUFREPW0KQEAgLTUzNyw2ICs1MzksNyBAQAogQ09ORklHX0NSWVBUT19STUQyNTY9bQogQ09ORklHX0NSWVBUT19STUQzMjA9bQogQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19TSEEzPW0KIENPTkZJR19DUllQVE9fVEdSMTkyPW0KIENPTkZJR19DUllQVE9fV1A1MTI9bQogQ09ORklHX0NSWVBUT19BTlVCSVM9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2Jvb3RpbmZvLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vYm9vdGluZm8uaAppbmRleCA4ZTIxMzI2Li44MWM5MWFmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYm9vdGluZm8uaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vYm9vdGluZm8uaApAQCAtMjIsNiArMjIsMTIgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX2Jvb3RpbmZvKGNvbnN0IHN0cnVjdCBiaV9yZWNvcmQgKmJpKSB7fQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVUJPT1QKK3ZvaWQgcHJvY2Vzc191Ym9vdF9jb21tYW5kbGluZShjaGFyICpjb21tYW5kcCwgaW50IHNpemUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcm9jZXNzX3Vib290X2NvbW1hbmRsaW5lKGNoYXIgKmNvbW1hbmRwLCBpbnQgc2l6ZSkge30KKyNlbmRpZgorCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NDQxeHNpbS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NDQxeHNpbS5oCmluZGV4IGNjNzk4YWIuLjY0ZjYwYmUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTQ0MXhzaW0uaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0NDF4c2ltLmgKQEAgLTEwLDYgKzEwLDEwIEBACiAjZGVmaW5lIENQVV9OQU1FCQkiQ09MREZJUkUobTU0NDF4KSIKICNkZWZpbmUgQ1BVX0lOU1RSX1BFUl9KSUZGWQkyCiAjZGVmaW5lIE1DRl9CVVNDTEsJCShNQ0ZfQ0xLIC8gMikKKyNkZWZpbmUgTUFDSElORQkJCU1BQ0hfTTU0NDFYCisjZGVmaW5lIEZQVVRZUEUJCQkwCisjZGVmaW5lIElPTUVNQkFTRQkJMHhlMDAwMDAwMAorI2RlZmluZSBJT01FTVNJWkUJCTB4MjAwMDAwMDAKIAogI2luY2x1ZGUgPGFzbS9tNTR4eGFjci5oPgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0eHhhY3IuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTR4eGFjci5oCmluZGV4IDU5ZTE3MTAuLmM2YWMwNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTR4eGFjci5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTR4eGFjci5oCkBAIC05NCw3ICs5NCw3IEBACiAgKglyZWdpc3RlciByZWdpb24gYXMgbm9uLWNhY2hlYWJsZS4gQW5kIHRoZW4gd2UgbWFwIGFsbCBvdXIgUkFNIGFzCiAgKgljYWNoZWFibGUgYW5kIHN1cGVydmlzb3IgYWNjZXNzIG9ubHkuCiAgKi8KLSNkZWZpbmUgQUNSMF9NT0RFCShBQ1JfQkEoQ09ORklHX01CQVIpK0FDUl9BRE1TSygweDEwMDAwMDApKyBcCisjZGVmaW5lIEFDUjBfTU9ERQkoQUNSX0JBKElPTUVNQkFTRSkrQUNSX0FETVNLKElPTUVNU0laRSkrIFwKIAkJCSBBQ1JfRU5BQkxFK0FDUl9TVVBFUitBQ1JfQ01fT0ZGX1BSRStBQ1JfU1ApCiAjaWYgZGVmaW5lZChDT05GSUdfQ0FDSEVfQ09QWUJBQ0spCiAjZGVmaW5lIEFDUjFfTU9ERQkoQUNSX0JBKENPTkZJR19SQU1CQVNFKStBQ1JfQURNU0soQ09ORklHX1JBTVNJWkUpKyBcCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbTU0eHhzaW0uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTR4eHNpbS5oCmluZGV4IGE1ZmJkMTcuLjczZDkzN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTR4eHNpbS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTR4eHNpbS5oCkBAIC04LDYgKzgsMTAgQEAKICNkZWZpbmUJQ1BVX05BTUUJCSJDT0xERklSRShtNTR4eCkiCiAjZGVmaW5lCUNQVV9JTlNUUl9QRVJfSklGRlkJMgogI2RlZmluZQlNQ0ZfQlVTQ0xLCQkoTUNGX0NMSyAvIDIpCisjZGVmaW5lCU1BQ0hJTkUJCQlNQUNIX001NFhYCisjZGVmaW5lCUZQVVRZUEUJCQlGUFVfQ09MREZJUkUKKyNkZWZpbmUJSU9NRU1CQVNFCQlNQ0ZfTUJBUgorI2RlZmluZQlJT01FTVNJWkUJCTB4MDEwMDAwMDAKIAogI2luY2x1ZGUgPGFzbS9tNTR4eGFjci5oPgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbWNmbW11LmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbWNmbW11LmgKaW5kZXggODgyNDIzNi4uMTBmOTkzMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21jZm1tdS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tY2ZtbXUuaApAQCAtMTA1LDYgKzEwNSw3IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJub3AiKTsKIH0KIAordm9pZCBjZl9ib290bWVtX2FsbG9jKHZvaWQpOwogaW50IGNmX3RsYl9taXNzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgd3JpdGUsIGludCBkdGxiLCBpbnQgZXh0ZW5zaW9uX3dvcmQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9uZXR0ZWwuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9uZXR0ZWwuaAppbmRleCAyYTdhNzY2Li45MjYzNzVkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbmV0dGVsLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL25ldHRlbC5oCkBAIC05Miw3ICs5Miw3IEBACiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgbWNmX3NldHBwZGF0YSh1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IGJpdHMpCiB7Ci0Jd3JpdGUoKHJlYWR3KE1DRlNJTV9QQkRBVCkgJiB+bWFzaykgfCBiaXRzLCBNQ0ZTSU1fUEJEQVQpOworCXdyaXRldygocmVhZHcoTUNGU0lNX1BCREFUKSAmIH5tYXNrKSB8IGJpdHMsIE1DRlNJTV9QQkRBVCk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvdWFwaS9hc20vYm9vdGluZm8uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL3VhcGkvYXNtL2Jvb3RpbmZvLmgKaW5kZXggY2RlYjI2YTAuLmE0OGNmNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL3VhcGkvYXNtL2Jvb3RpbmZvLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvdWFwaS9hc20vYm9vdGluZm8uaApAQCAtODEsNiArODEsNyBAQAogI2RlZmluZSBNQUNIX1E0MAkJMTAKICNkZWZpbmUgTUFDSF9TVU4zWAkJMTEKICNkZWZpbmUgTUFDSF9NNTRYWAkJMTIKKyNkZWZpbmUgTUFDSF9NNTQ0MVgJCTEzCiAKIAogICAgIC8qCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL01ha2VmaWxlIGIvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZQppbmRleCBlNDc3NzhmLi44YTFjNGQzIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGUKQEAgLTI0LDYgKzI0LDcgQEAKIAogb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhlYy5vIHJlbG9jYXRlX2tlcm5lbC5vCiBvYmotJChDT05GSUdfQk9PVElORk9fUFJPQykJKz0gYm9vdGluZm9fcHJvYy5vCitvYmotJChDT05GSUdfVUJPT1QpCQkrPSB1Ym9vdC5vCiAKIG9iai0kKENPTkZJR19FQVJMWV9QUklOVEspCSs9IGVhcmx5X3ByaW50ay5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYzU1ZmY3MS4uNGJhMWFlNyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTIwMywxMSArMjAzLDggQEAKIH0KIAogLyogRmlsbCBpbiB0aGUgZnB1IHN0cnVjdHVyZSBmb3IgYSBjb3JlIGR1bXAuICAqLwotI2lmZGVmIENPTkZJR19GUFUKIGludCBkdW1wX2ZwdSAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCB1c2VyX202OGtmcF9zdHJ1Y3QgKmZwdSkKIHsKLQljaGFyIGZwdXN0YXRlWzIxNl07Ci0KIAlpZiAoRlBVX0lTX0VNVSkgewogCQlpbnQgaTsKIApAQCAtMjIyLDM3ICsyMTksNDAgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JLyogRmlyc3QgZHVtcCB0aGUgZnB1IGNvbnRleHQgdG8gYXZvaWQgcHJvdG9jb2wgdmlvbGF0aW9uLiAgKi8KLQlhc20gdm9sYXRpbGUgKCJmc2F2ZSAlMCIgOjogIm0iIChmcHVzdGF0ZVswXSkgOiAibWVtb3J5Iik7Ci0JaWYgKCFDUFVfSVNfMDYwID8gIWZwdXN0YXRlWzBdIDogIWZwdXN0YXRlWzJdKQotCQlyZXR1cm4gMDsKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfRlBVKSkgeworCQljaGFyIGZwdXN0YXRlWzIxNl07CiAKLQlpZiAoQ1BVX0lTX0NPTERGSVJFKSB7Ci0JCWFzbSB2b2xhdGlsZSAoImZtb3ZlbCAlL2ZwaWFyLCUwXG5cdCIKLQkJCSAgICAgICJmbW92ZWwgJS9mcGNyLCUxXG5cdCIKLQkJCSAgICAgICJmbW92ZWwgJS9mcHNyLCUyXG5cdCIKLQkJCSAgICAgICJmbW92ZW1kICUvZnAwLSUvZnA3LCUzIgotCQkJICAgICAgOgotCQkJICAgICAgOiAibSIgKGZwdS0+ZnBjbnRsWzBdKSwKLQkJCQkibSIgKGZwdS0+ZnBjbnRsWzFdKSwKLQkJCQkibSIgKGZwdS0+ZnBjbnRsWzJdKSwKLQkJCQkibSIgKGZwdS0+ZnByZWdzWzBdKQotCQkJICAgICAgOiAibWVtb3J5Iik7Ci0JfSBlbHNlIHsKLQkJYXNtIHZvbGF0aWxlICgiZm1vdmVtICUvZnBpYXIvJS9mcGNyLyUvZnBzciwlMCIKLQkJCSAgICAgIDoKLQkJCSAgICAgIDogIm0iIChmcHUtPmZwY250bFswXSkKLQkJCSAgICAgIDogIm1lbW9yeSIpOwotCQlhc20gdm9sYXRpbGUgKCJmbW92ZW14ICUvZnAwLSUvZnA3LCUwIgotCQkJICAgICAgOgotCQkJICAgICAgOiAibSIgKGZwdS0+ZnByZWdzWzBdKQotCQkJICAgICAgOiAibWVtb3J5Iik7CisJCS8qIEZpcnN0IGR1bXAgdGhlIGZwdSBjb250ZXh0IHRvIGF2b2lkIHByb3RvY29sIHZpb2xhdGlvbi4gICovCisJCWFzbSB2b2xhdGlsZSAoImZzYXZlICUwIiA6OiAibSIgKGZwdXN0YXRlWzBdKSA6ICJtZW1vcnkiKTsKKwkJaWYgKCFDUFVfSVNfMDYwID8gIWZwdXN0YXRlWzBdIDogIWZwdXN0YXRlWzJdKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKENQVV9JU19DT0xERklSRSkgeworCQkJYXNtIHZvbGF0aWxlICgiZm1vdmVsICUvZnBpYXIsJTBcblx0IgorCQkJCSAgICAgICJmbW92ZWwgJS9mcGNyLCUxXG5cdCIKKwkJCQkgICAgICAiZm1vdmVsICUvZnBzciwlMlxuXHQiCisJCQkJICAgICAgImZtb3ZlbWQgJS9mcDAtJS9mcDcsJTMiCisJCQkJICAgICAgOgorCQkJCSAgICAgIDogIm0iIChmcHUtPmZwY250bFswXSksCisJCQkJCSJtIiAoZnB1LT5mcGNudGxbMV0pLAorCQkJCQkibSIgKGZwdS0+ZnBjbnRsWzJdKSwKKwkJCQkJIm0iIChmcHUtPmZwcmVnc1swXSkKKwkJCQkgICAgICA6ICJtZW1vcnkiKTsKKwkJfSBlbHNlIHsKKwkJCWFzbSB2b2xhdGlsZSAoImZtb3ZlbSAlL2ZwaWFyLyUvZnBjci8lL2Zwc3IsJTAiCisJCQkJICAgICAgOgorCQkJCSAgICAgIDogIm0iIChmcHUtPmZwY250bFswXSkKKwkJCQkgICAgICA6ICJtZW1vcnkiKTsKKwkJCWFzbSB2b2xhdGlsZSAoImZtb3ZlbXggJS9mcDAtJS9mcDcsJTAiCisJCQkJICAgICAgOgorCQkJCSAgICAgIDogIm0iIChmcHUtPmZwcmVnc1swXSkKKwkJCQkgICAgICA6ICJtZW1vcnkiKTsKKwkJfQogCX0KIAogCXJldHVybiAxOwogfQogRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7Ci0jZW5kaWYgLyogQ09ORklHX0ZQVSAqLwogCiB1bnNpZ25lZCBsb25nIGdldF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3NldHVwX21tLmMgYi9hcmNoL202OGsva2VybmVsL3NldHVwX21tLmMKaW5kZXggNWI4ZWM0ZC4uN2EyYzIxMiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9tbS5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbW0uYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAjaWZkZWYgQ09ORklHX002OEtfTDJfQ0FDSEUKIHZvaWQgKCptYWNoX2wyX2ZsdXNoKSAoaW50KTsKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkgfHwgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTlBVVF9NNjhLX0JFRVApCiB2b2lkICgqbWFjaF9iZWVwKSh1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CiBFWFBPUlRfU1lNQk9MKG1hY2hfYmVlcCk7CiAjZW5kaWYKQEAgLTI0NSw3ICsyNDUsNyBAQAogCSAqIFdlIHNob3VsZCByZWFsbHkgZG8gb3VyIG93biBGUFUgY2hlY2sgYXQgc3RhcnR1cC4KIAkgKiBbd2hhdCBkbyB3ZSBkbyB3aXRoIGJ1Z2d5IDY4TEMwNDBzPyBpZiB3ZSBoYXZlIHByb2JsZW1zCiAJICogIHdpdGggdGhlbSwgd2Ugc2hvdWxkIGFkZCBhIHRlc3QgdG8gY2hlY2tfYnVncygpIGJlbG93XSAqLwotI2lmbmRlZiBDT05GSUdfTTY4S0ZQVV9FTVVfT05MWQorI2lmIGRlZmluZWQoQ09ORklHX0ZQVSkgJiYgIWRlZmluZWQoQ09ORklHX002OEtGUFVfRU1VX09OTFkpCiAJLyogY2xlYXIgdGhlIGZwdSBpZiB3ZSBoYXZlIG9uZSAqLwogCWlmIChtNjhrX2ZwdXR5cGUgJiAoRlBVXzY4ODgxfEZQVV82ODg4MnxGUFVfNjgwNDB8RlBVXzY4MDYwfEZQVV9DT0xERklSRSkpIHsKIAkJdm9sYXRpbGUgaW50IHplcm8gPSAwOwpAQCAtMjc0LDYgKzI3NCw3IEBACiAJc3RybmNweShtNjhrX2NvbW1hbmRfbGluZSwgQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcsIENMX1NJWkUpOwogCW02OGtfY29tbWFuZF9saW5lW0NMX1NJWkUgLSAxXSA9IDA7CiAjZW5kaWYgLyogQ09ORklHX0JPT1RQQVJBTSAqLworCXByb2Nlc3NfdWJvb3RfY29tbWFuZGxpbmUoJm02OGtfY29tbWFuZF9saW5lWzBdLCBDTF9TSVpFKTsKIAkqY21kbGluZV9wID0gbTY4a19jb21tYW5kX2xpbmU7CiAJbWVtY3B5KGJvb3RfY29tbWFuZF9saW5lLCAqY21kbGluZV9wLCBDTF9TSVpFKTsKIApAQCAtMzQxLDYgKzM0Miw3IEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQ09MREZJUkUKIAljYXNlIE1BQ0hfTTU0WFg6CisJY2FzZSBNQUNIX001NDQxWDoKIAkJY29uZmlnX0JTUChOVUxMLCAwKTsKIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTU0OCw3ICs1NTAsNyBAQAogCiB2b2lkIGNoZWNrX2J1Z3Modm9pZCkKIHsKLSNpZm5kZWYgQ09ORklHX002OEtGUFVfRU1VCisjaWYgZGVmaW5lZChDT05GSUdfRlBVKSAmJiAhZGVmaW5lZChDT05GSUdfTTY4S0ZQVV9FTVUpCiAJaWYgKG02OGtfZnB1dHlwZSA9PSAwKSB7CiAJCXByX2VtZXJnKCIqKiogWU9VIERPIE5PVCBIQVZFIEEgRkxPQVRJTkcgUE9JTlQgVU5JVCwgIgogCQkJIldISUNIIElTIFJFUVVJUkVEIEJZIExJTlVYL002OEsgKioqXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbm8uYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbm8uYwppbmRleCA5MzA5Nzg5Li44YWZlNmY2IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NldHVwX25vLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9uby5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtODIsNjkgKzgzLDYgQEAKICNkZWZpbmUJQ1BVX0lOU1RSX1BFUl9KSUZGWQkxNgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19VQk9PVCkKLS8qCi0gKiBwYXJzZV91Ym9vdF9jb21tYW5kbGluZQotICoKLSAqIENvcGllcyB1LWJvb3QgY29tbWFuZGxpbmUgYXJndW1lbnRzIGFuZCBzdG9yZSB0aGVtIGluIHRoZSBwcm9wZXIgbGludXgKLSAqIHZhcmlhYmxlcy4KLSAqCi0gKiBBc3N1bWVzOgotICoJX2luaXRfc3AgZ2xvYmFsIGNvbnRhaW5zIHRoZSBhZGRyZXNzIGluIHRoZSBzdGFjayBwb2ludGVyIHdoZW4gdGhlCi0gKglrZXJuZWwgc3RhcnRzIChzZWUgaGVhZC5TOjpfc3RhcnQpCi0gKgotICoJVS1Cb290IGNhbGxpbmcgY29udmVudGlvbjoKLSAqCSgqa2VybmVsKSAoa2JkLCBpbml0cmRfc3RhcnQsIGluaXRyZF9lbmQsIGNtZF9zdGFydCwgY21kX2VuZCk7Ci0gKgotICoJX2luaXRfc3AgY2FuIGJlIHBhcnNlZCBhcyBzdWNoCi0gKgotICoJX2luaXRfc3ArMDAgPSB1LWJvb3QgY21kIGFmdGVyIGpzciBpbnRvIGtlcm5lbCAoc2tpcCkKLSAqCV9pbml0X3NwKzA0ID0gJmtlcm5lbCBib2FyZF9pbmZvIChyZXNpZHVhbCBkYXRhKQotICoJX2luaXRfc3ArMDggPSAmaW5pdHJkX3N0YXJ0Ci0gKglfaW5pdF9zcCsxMiA9ICZpbml0cmRfZW5kCi0gKglfaW5pdF9zcCsxNiA9ICZjbWRfc3RhcnQKLSAqCV9pbml0X3NwKzIwID0gJmNtZF9lbmQKLSAqCi0gKglUaGlzIGFsc28gYXNzdW1lcyB0aGF0IHRoZSBtZW1vcnkgbG9jYXRpb25zIHBvaW50ZWQgdG8gYXJlIHN0aWxsCi0gKgl1bm1vZGlmaWVkLiBVLWJvb3QgcGxhY2VzIHRoZW0gbmVhciB0aGUgZW5kIG9mIGV4dGVybmFsIFNEUkFNLgotICoKLSAqIEFyZ3VtZW50KHMpOgotICoJY29tbWFuZHAgPSB0aGUgbGludXggY29tbWFuZGxpbmUgYXJnIGNvbnRhaW5lciB0byBmaWxsLgotICoJc2l6ZSAgICAgPSB0aGUgc2l6ZW9mIGNvbW1hbmRwLgotICoKLSAqIFJldHVybnM6Ci0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV91Ym9vdF9jb21tYW5kbGluZShjaGFyICpjb21tYW5kcCwgaW50IHNpemUpCi17Ci0JZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX2luaXRfc3A7Ci0JdW5zaWduZWQgbG9uZyAqc3A7Ci0JdW5zaWduZWQgbG9uZyB1Ym9vdF9rYmQ7Ci0JdW5zaWduZWQgbG9uZyB1Ym9vdF9pbml0cmRfc3RhcnQsIHVib290X2luaXRyZF9lbmQ7Ci0JdW5zaWduZWQgbG9uZyB1Ym9vdF9jbWRfc3RhcnQsIHVib290X2NtZF9lbmQ7Ci0KLQotCXNwID0gKHVuc2lnbmVkIGxvbmcgKilfaW5pdF9zcDsKLQl1Ym9vdF9rYmQgPSBzcFsxXTsKLQl1Ym9vdF9pbml0cmRfc3RhcnQgPSBzcFsyXTsKLQl1Ym9vdF9pbml0cmRfZW5kID0gc3BbM107Ci0JdWJvb3RfY21kX3N0YXJ0ID0gc3BbNF07Ci0JdWJvb3RfY21kX2VuZCA9IHNwWzVdOwotCi0JaWYgKHVib290X2NtZF9zdGFydCAmJiB1Ym9vdF9jbWRfZW5kKQotCQlzdHJuY3B5KGNvbW1hbmRwLCAoY29uc3QgY2hhciAqKXVib290X2NtZF9zdGFydCwgc2l6ZSk7Ci0jaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTklUUkQpCi0JaWYgKHVib290X2luaXRyZF9zdGFydCAmJiB1Ym9vdF9pbml0cmRfZW5kICYmCi0JCSh1Ym9vdF9pbml0cmRfZW5kID4gdWJvb3RfaW5pdHJkX3N0YXJ0KSkgewotCQlpbml0cmRfc3RhcnQgPSB1Ym9vdF9pbml0cmRfc3RhcnQ7Ci0JCWluaXRyZF9lbmQgPSB1Ym9vdF9pbml0cmRfZW5kOwotCQlST09UX0RFViA9IFJvb3RfUkFNMDsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaW5pdHJkIGF0IDB4JWx4OjB4JWx4XG4iLAotCQkJaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kKTsKLQl9Ci0jZW5kaWYgLyogaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTklUUkQpICovCi19Ci0jZW5kaWYgLyogI2lmIGRlZmluZWQoQ09ORklHX1VCT09UKSAqLwotCiB2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCiB7CiAJaW50IGJvb3RtYXBfc2l6ZTsKQEAgLTE2NCw1MyArMTAyLDM4IEBACiAJY29tbWFuZF9saW5lW3NpemVvZihjb21tYW5kX2xpbmUpIC0gMV0gPSAwOwogI2VuZGlmIC8qIENPTkZJR19CT09UUEFSQU0gKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1VCT09UKQotCS8qIENPTkZJR19VQk9PVCBhbmQgQ09ORklHX0JPT1RQQVJBTSBkZWZpbmVkLCBjb25jYXRlbmF0ZSBjbWRsaW5lICovCi0JI2lmIGRlZmluZWQoQ09ORklHX0JPT1RQQVJBTSkKLQkJLyogQWRkIHRoZSB3aGl0ZXNwYWNlIHNlcGFyYXRvciAqLwotCQljb21tYW5kX2xpbmVbc3RybGVuKENPTkZJR19CT09UUEFSQU1fU1RSSU5HKV0gPSAnICc7Ci0JCS8qIFBhcnNlIHVib290IGNvbW1hbmQgbGluZSBpbnRvIHRoZSByZXN0IG9mIHRoZSBidWZmZXIgKi8KLQkJcGFyc2VfdWJvb3RfY29tbWFuZGxpbmUoCi0JCQkmY29tbWFuZF9saW5lWyhzdHJsZW4oQ09ORklHX0JPT1RQQVJBTV9TVFJJTkcpKzEpXSwKLQkJCShzaXplb2YoY29tbWFuZF9saW5lKSAtCi0JCQkoc3RybGVuKENPTkZJR19CT09UUEFSQU1fU1RSSU5HKSsxKSkpOwotCS8qIE9ubHkgQ09ORklHX1VCT09UIGRlZmluZWQsIGNyZWF0ZSBjbWRsaW5lICovCi0JI2Vsc2UKLQkJcGFyc2VfdWJvb3RfY29tbWFuZGxpbmUoJmNvbW1hbmRfbGluZVswXSwgc2l6ZW9mKGNvbW1hbmRfbGluZSkpOwotCSNlbmRpZiAvKiBDT05GSUdfQk9PVFBBUkFNICovCi0JY29tbWFuZF9saW5lW3NpemVvZihjb21tYW5kX2xpbmUpIC0gMV0gPSAwOwotI2VuZGlmIC8qIENPTkZJR19VQk9PVCAqLworCXByb2Nlc3NfdWJvb3RfY29tbWFuZGxpbmUoJmNvbW1hbmRfbGluZVswXSwgc2l6ZW9mKGNvbW1hbmRfbGluZSkpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiXHgwRlxyXG5cbnVDbGludXgvIiBDUFVfTkFNRSAiXG4iKTsKKwlwcl9pbmZvKCJ1Q2xpbnV4IHdpdGggQ1BVICIgQ1BVX05BTUUgIlxuIik7CiAKICNpZmRlZiBDT05GSUdfVUNESU1NCi0JcHJpbnRrKEtFUk5fSU5GTyAidUNkaW1tIGJ5IExpbmVvLCBJbmMuIDx3d3cubGluZW8uY29tPlxuIik7CisJcHJfaW5mbygidUNkaW1tIGJ5IExpbmVvLCBJbmMuIDx3d3cubGluZW8uY29tPlxuIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTTY4VlozMjgKLQlwcmludGsoS0VSTl9JTkZPICJNNjhWWjMyOCBzdXBwb3J0IGJ5IEV2YW4gU3Rhd255Y3p5IDxlQGxpbmVvLmNhPlxuIik7CisJcHJfaW5mbygiTTY4VlozMjggc3VwcG9ydCBieSBFdmFuIFN0YXdueWN6eSA8ZUBsaW5lby5jYT5cbiIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NPTERGSVJFCi0JcHJpbnRrKEtFUk5fSU5GTyAiQ09MREZJUkUgcG9ydCBkb25lIGJ5IEdyZWcgVW5nZXJlciwgZ2VyZ0BzbmFwZ2Vhci5jb21cbiIpOworCXByX2luZm8oIkNPTERGSVJFIHBvcnQgZG9uZSBieSBHcmVnIFVuZ2VyZXIsIGdlcmdAc25hcGdlYXIuY29tXG4iKTsKICNpZmRlZiBDT05GSUdfTTUzMDcKLQlwcmludGsoS0VSTl9JTkZPICJNb2RpZmllZCBmb3IgTTUzMDcgYnkgRGF2ZSBNaWxsZXIsIGRtaWxsZXJAaW50ZWxsaXN0b3IuY29tXG4iKTsKKwlwcl9pbmZvKCJNb2RpZmllZCBmb3IgTTUzMDcgYnkgRGF2ZSBNaWxsZXIsIGRtaWxsZXJAaW50ZWxsaXN0b3IuY29tXG4iKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19FTElURQotCXByaW50ayhLRVJOX0lORk8gIk1vZGlmaWVkIGZvciBNNTIwNmVMSVRFIGJ5IFJvYiBTY290dCwgcnNjb3R0QG10cm9iLmZkbnMubmV0XG4iKTsKKwlwcl9pbmZvKCJNb2RpZmllZCBmb3IgTTUyMDZlTElURSBieSBSb2IgU2NvdHQsIHJzY290dEBtdHJvYi5mZG5zLm5ldFxuIik7CiAjZW5kaWYKICNlbmRpZgotCXByaW50ayhLRVJOX0lORk8gIkZsYXQgbW9kZWwgc3VwcG9ydCAoQykgMTk5OCwxOTk5IEtlbm5ldGggQWxiYW5vd3NraSwgRC4gSmVmZiBEaW9ubmVcbiIpOworCXByX2luZm8oIkZsYXQgbW9kZWwgc3VwcG9ydCAoQykgMTk5OCwxOTk5IEtlbm5ldGggQWxiYW5vd3NraSwgRC4gSmVmZiBEaW9ubmVcbiIpOwogCiAjaWYgZGVmaW5lZCggQ09ORklHX1BJTE9UICkgJiYgZGVmaW5lZCggQ09ORklHX002ODMyOCApCi0JcHJpbnRrKEtFUk5fSU5GTyAiVFJHIFN1cGVyUGlsb3QgRkxBU0ggY2FyZCBzdXBwb3J0IDxpbmZvQHRyZ25ldC5jb20+XG4iKTsKKwlwcl9pbmZvKCJUUkcgU3VwZXJQaWxvdCBGTEFTSCBjYXJkIHN1cHBvcnQgPGluZm9AdHJnbmV0LmNvbT5cbiIpOwogI2VuZGlmCiAjaWYgZGVmaW5lZCggQ09ORklHX1BJTE9UICkgJiYgZGVmaW5lZCggQ09ORklHX002OEVaMzI4ICkKLQlwcmludGsoS0VSTl9JTkZPICJQYWxtViBzdXBwb3J0IGJ5IExpbmVvIEluYy4gPGplZmZAdWNsaW51eC5jb20+XG4iKTsKKwlwcl9pbmZvKCJQYWxtViBzdXBwb3J0IGJ5IExpbmVvIEluYy4gPGplZmZAdWNsaW51eC5jb20+XG4iKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19EUkFHRU4yCi0JcHJpbnRrKEtFUk5fSU5GTyAiRHJhZ29uRW5naW5lIElJIGJvYXJkIHN1cHBvcnQgYnkgR2VvcmdlcyBNZW5pZVxuIik7CisJcHJfaW5mbygiRHJhZ29uRW5naW5lIElJIGJvYXJkIHN1cHBvcnQgYnkgR2VvcmdlcyBNZW5pZVxuIik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTTUyMzVFVkIKLQlwcmludGsoS0VSTl9JTkZPICJNb3Rvcm9sYSBNNTIzNUVWQiBzdXBwb3J0IChDKTIwMDUgU3luLXRlY2ggU3lzdGVtcywgSW5jLiAoSmF0ZSBTdWpqYXZhbmljaClcbiIpOworCXByX2luZm8oIk1vdG9yb2xhIE01MjM1RVZCIHN1cHBvcnQgKEMpMjAwNSBTeW4tdGVjaCBTeXN0ZW1zLCBJbmMuIChKYXRlIFN1amphdmFuaWNoKVxuIik7CiAjZW5kaWYKIAogCXByX2RlYnVnKCJLRVJORUwgLT4gVEVYVD0weCVwLTB4JXAgREFUQT0weCVwLTB4JXAgQlNTPTB4JXAtMHglcFxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jCmluZGV4IDkyMDJmODIuLjU4NTA3ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYwpAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC91Ym9vdC5jIGIvYXJjaC9tNjhrL2tlcm5lbC91Ym9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNTM2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL202OGsva2VybmVsL3Vib290LmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiB1Ym9vdC5jIC0tIHVib290IGFyZ3VtZW50cyBzdXBwb3J0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKworLyoKKyAqIHBhcnNlX3Vib290X2NvbW1hbmRsaW5lCisgKgorICogQ29waWVzIHUtYm9vdCBjb21tYW5kbGluZSBhcmd1bWVudHMgYW5kIHN0b3JlIHRoZW0gaW4gdGhlIHByb3BlciBsaW51eAorICogdmFyaWFibGVzLgorICoKKyAqIEFzc3VtZXM6CisgKglfaW5pdF9zcCBnbG9iYWwgY29udGFpbnMgdGhlIGFkZHJlc3MgaW4gdGhlIHN0YWNrIHBvaW50ZXIgd2hlbiB0aGUKKyAqCWtlcm5lbCBzdGFydHMgKHNlZSBoZWFkLlM6Ol9zdGFydCkKKyAqCisgKglVLUJvb3QgY2FsbGluZyBjb252ZW50aW9uOgorICoJKCprZXJuZWwpIChrYmQsIGluaXRyZF9zdGFydCwgaW5pdHJkX2VuZCwgY21kX3N0YXJ0LCBjbWRfZW5kKTsKKyAqCisgKglfaW5pdF9zcCBjYW4gYmUgcGFyc2VkIGFzIHN1Y2gKKyAqCisgKglfaW5pdF9zcCswMCA9IHUtYm9vdCBjbWQgYWZ0ZXIganNyIGludG8ga2VybmVsIChza2lwKQorICoJX2luaXRfc3ArMDQgPSAma2VybmVsIGJvYXJkX2luZm8gKHJlc2lkdWFsIGRhdGEpCisgKglfaW5pdF9zcCswOCA9ICZpbml0cmRfc3RhcnQKKyAqCV9pbml0X3NwKzEyID0gJmluaXRyZF9lbmQKKyAqCV9pbml0X3NwKzE2ID0gJmNtZF9zdGFydAorICoJX2luaXRfc3ArMjAgPSAmY21kX2VuZAorICoKKyAqCVRoaXMgYWxzbyBhc3N1bWVzIHRoYXQgdGhlIG1lbW9yeSBsb2NhdGlvbnMgcG9pbnRlZCB0byBhcmUgc3RpbGwKKyAqCXVubW9kaWZpZWQuIFUtYm9vdCBwbGFjZXMgdGhlbSBuZWFyIHRoZSBlbmQgb2YgZXh0ZXJuYWwgU0RSQU0uCisgKgorICogQXJndW1lbnQocyk6CisgKgljb21tYW5kcCA9IHRoZSBsaW51eCBjb21tYW5kbGluZSBhcmcgY29udGFpbmVyIHRvIGZpbGwuCisgKglzaXplICAgICA9IHRoZSBzaXplb2YgY29tbWFuZHAuCisgKgorICogUmV0dXJuczoKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHBhcnNlX3Vib290X2NvbW1hbmRsaW5lKGNoYXIgKmNvbW1hbmRwLCBpbnQgc2l6ZSkKK3sKKwlleHRlcm4gdW5zaWduZWQgbG9uZyBfaW5pdF9zcDsKKwl1bnNpZ25lZCBsb25nICpzcDsKKwl1bnNpZ25lZCBsb25nIHVib290X2tiZDsKKwl1bnNpZ25lZCBsb25nIHVib290X2luaXRyZF9zdGFydCwgdWJvb3RfaW5pdHJkX2VuZDsKKwl1bnNpZ25lZCBsb25nIHVib290X2NtZF9zdGFydCwgdWJvb3RfY21kX2VuZDsKKworCXNwID0gKHVuc2lnbmVkIGxvbmcgKilfaW5pdF9zcDsKKwl1Ym9vdF9rYmQgPSBzcFsxXTsKKwl1Ym9vdF9pbml0cmRfc3RhcnQgPSBzcFsyXTsKKwl1Ym9vdF9pbml0cmRfZW5kID0gc3BbM107CisJdWJvb3RfY21kX3N0YXJ0ID0gc3BbNF07CisJdWJvb3RfY21kX2VuZCA9IHNwWzVdOworCisJaWYgKHVib290X2NtZF9zdGFydCAmJiB1Ym9vdF9jbWRfZW5kKQorCQlzdHJuY3B5KGNvbW1hbmRwLCAoY29uc3QgY2hhciAqKXVib290X2NtZF9zdGFydCwgc2l6ZSk7CisjaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTklUUkQpCisJaWYgKHVib290X2luaXRyZF9zdGFydCAmJiB1Ym9vdF9pbml0cmRfZW5kICYmCisJICAgICh1Ym9vdF9pbml0cmRfZW5kID4gdWJvb3RfaW5pdHJkX3N0YXJ0KSkgeworCQlpbml0cmRfc3RhcnQgPSB1Ym9vdF9pbml0cmRfc3RhcnQ7CisJCWluaXRyZF9lbmQgPSB1Ym9vdF9pbml0cmRfZW5kOworCQlST09UX0RFViA9IFJvb3RfUkFNMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaW5pdHJkIGF0IDB4JWx4OjB4JWx4XG4iLAorCQkJaW5pdHJkX3N0YXJ0LCBpbml0cmRfZW5kKTsKKwl9CisjZW5kaWYgLyogaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTklUUkQpICovCit9CisKK19faW5pdCB2b2lkIHByb2Nlc3NfdWJvb3RfY29tbWFuZGxpbmUoY2hhciAqY29tbWFuZHAsIGludCBzaXplKQoreworCWludCBsZW4sIG47CisKKwluID0gc3Rybmxlbihjb21tYW5kcCwgc2l6ZSk7CisJY29tbWFuZHAgKz0gbjsKKwlsZW4gPSBzaXplIC0gbjsKKwlpZiAobGVuKSB7CisJCS8qIEFkZCB0aGUgd2hpdGVzcGFjZSBzZXBhcmF0b3IgKi8KKwkJKmNvbW1hbmRwKysgPSAnICc7CisJCWxlbi0tOworCX0KKworCXBhcnNlX3Vib290X2NvbW1hbmRsaW5lKGNvbW1hbmRwLCBsZW4pOworCWNvbW1hbmRwW3NpemUgLSAxXSA9IDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL2NvbmZpZy5jIGIvYXJjaC9tNjhrL21hYy9jb25maWcuYwppbmRleCAyZjMzYTMzLi5lNDY4OTUzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCW1hY2hfaGFsdCA9IG1hY19wb3dlcm9mZjsKIAltYWNoX3Bvd2VyX29mZiA9IG1hY19wb3dlcm9mZjsKIAltYWNoX21heF9kbWFfYWRkcmVzcyA9IDB4ZmZmZmZmZmY7Ci0jaWYgZGVmaW5lZChDT05GSUdfSU5QVVRfTTY4S19CRUVQKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkKIAltYWNoX2JlZXAgPSBtYWNfbWtzb3VuZDsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0vbWNmbW11LmMgYi9hcmNoL202OGsvbW0vbWNmbW11LmMKaW5kZXggZjU4ZmFmZS4uODcxMzFjZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL21jZm1tdS5jCisrKyBiL2FyY2gvbTY4ay9tbS9tY2ZtbXUuYwpAQCAtMjcsNyArMjcsNyBAQAogdW5zaWduZWQgbG9uZyBjb250ZXh0X21hcFtMQVNUX0NPTlRFWFQgLyBCSVRTX1BFUl9MT05HICsgMV07CiBhdG9taWNfdCBucl9mcmVlX2NvbnRleHRzOwogc3RydWN0IG1tX3N0cnVjdCAqY29udGV4dF9tbVtMQVNUX0NPTlRFWFQrMV07Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBudW1fcGFnZXM7Cit1bnNpZ25lZCBsb25nIG51bV9wYWdlczsKIAogLyoKICAqIENvbGRGaXJlIHBhZ2luZ19pbml0IGRlcml2ZWQgZnJvbSBzdW4zLgpAQCAtMTUwLDYgKzE1MCwzNSBAQAogCXJldHVybiAwOwogfQogCit2b2lkIF9faW5pdCBjZl9ib290bWVtX2FsbG9jKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm47CisJdW5zaWduZWQgbG9uZyBtZW1zdGFydDsKKworCS8qIF9yYW1iYXNlIGFuZCBfcmFtZW5kIHdpbGwgYmUgbmF0dXJhbGx5IHBhZ2UgYWxpZ25lZCAqLworCW02OGtfbWVtb3J5WzBdLmFkZHIgPSBfcmFtYmFzZTsKKwltNjhrX21lbW9yeVswXS5zaXplID0gX3JhbWVuZCAtIF9yYW1iYXNlOworCisJLyogY29tcHV0ZSB0b3RhbCBwYWdlcyBpbiBzeXN0ZW0gKi8KKwludW1fcGFnZXMgPSBQRk5fRE9XTihfcmFtZW5kIC0gX3JhbWJhc2UpOworCisJLyogcGFnZSBudW1iZXJzICovCisJbWVtc3RhcnQgPSBQQUdFX0FMSUdOKF9yYW1zdGFydCk7CisJbWluX2xvd19wZm4gPSBQRk5fRE9XTihfcmFtYmFzZSk7CisJc3RhcnRfcGZuID0gUEZOX0RPV04obWVtc3RhcnQpOworCW1heF9wZm4gPSBtYXhfbG93X3BmbiA9IFBGTl9ET1dOKF9yYW1lbmQpOworCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKilfcmFtZW5kOworCisJbTY4a192aXJ0X3RvX25vZGVfc2hpZnQgPSBmbHMoX3JhbWVuZCAtIF9yYW1iYXNlIC0gMSkgLSA2OworCW1vZHVsZV9maXh1cChOVUxMLCBfX3N0YXJ0X2ZpeHVwLCBfX3N0b3BfZml4dXApOworCisJLyogc2V0dXAgYm9vdG1lbSBkYXRhICovCisJbTY4a19zZXR1cF9ub2RlKDApOworCW1lbXN0YXJ0ICs9IGluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgc3RhcnRfcGZuLAorCQltaW5fbG93X3BmbiwgbWF4X2xvd19wZm4pOworCWZyZWVfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgbWVtc3RhcnQsIF9yYW1lbmQgLSBtZW1zdGFydCk7Cit9CisKIC8qCiAgKiBJbml0aWFsaXplIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgc3R1ZmYuCiAgKiBUaGUgZm9sbG93aW5nIHdhcyB0YWtlbiBmcm9tIGFyY2gvcHBjL21tdV9jb250ZXh0LmMKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMgYi9hcmNoL202OGsvcTQwL2NvbmZpZy5jCmluZGV4IGZjYjdmMDUuLmVhODlhMjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL3E0MC9jb25maWcuYwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJbWFjaF9yZXNldCA9IHE0MF9yZXNldDsKIAltYWNoX2dldF9tb2RlbCA9IHE0MF9nZXRfbW9kZWw7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JTlBVVF9NNjhLX0JFRVApIHx8IGRlZmluZWQoQ09ORklHX0lOUFVUX002OEtfQkVFUF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSU5QVVRfTTY4S19CRUVQKQogCW1hY2hfYmVlcCA9IHE0MF9ta3NvdW5kOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVApkaWZmIC0tZ2l0IGEvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCA4MjgyY2JjLi4yNzNlNjEyIDEwMDY0NAotLS0gYS9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMjA0LDggKzIwNCw5IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQorCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkpCiAJCXJldHVybiBfX2NvcHlfdXNlcl96ZXJvaW5nKHRvLCBmcm9tLCBuKTsKKwltZW1zZXQodG8sIDAsIG4pOwogCXJldHVybiBuOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCAzMzFiMGQzLi44MjY2NzY3IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTIyNyw3ICsyMjcsNyBAQAogCiAjZGVmaW5lIF9fZ2V0X3VzZXIoeCwgcHRyKQkJCQkJCVwKICh7CQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgX19ndV92YWw7CQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19ndV92YWwgPSAwOwkJCQkJXAogCS8qdW5zaWduZWQgbG9uZyBfX2d1X3B0ciA9ICh1bnNpZ25lZCBsb25nKShwdHIpOyovCQlcCiAJbG9uZyBfX2d1X2VycjsJCQkJCQkJXAogCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJCVwKQEAgLTM3MywxMCArMzczLDEzIEBACiBzdGF0aWMgaW5saW5lIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sCiAJCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CisJdW5zaWduZWQgbG9uZyByZXMgPSBuOwogCW1pZ2h0X2ZhdWx0KCk7Ci0JaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpCi0JCXJldHVybiBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKLQlyZXR1cm4gbjsKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpKQorCQlyZXMgPSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwlpZiAodW5saWtlbHkocmVzKSkKKwkJbWVtc2V0KHRvICsgKG4gLSByZXMpLCAwLCByZXMpOworCXJldHVybiByZXM7CiB9CiAKICNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2Z0cmFjZS5jCmluZGV4IGZjN2I0OGEuLmQ1NzU2M2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9mdHJhY2UuYwpAQCAtNjMsNyArNjMsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JZXJyID0gZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKG9sZCwgc2VsZl9hZGRyLCAmdHJhY2UuZGVwdGgsIDApOworCWVyciA9IGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLCAwLCBOVUxMKTsKIAlpZiAoZXJyID09IC1FQlVTWSkgewogCQkqcGFyZW50ID0gb2xkOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCmluZGV4IDgxNTU2YjguLjdmNjk2ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCkBAIC02MzIsMTAgKzYzMiwxMCBAQAogCX0KIH0KIAotLyogRGVjaWRlIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgZG9tYWluIG51bWJlciBpbiAvcHJvYyAqLworLyogRGlzcGxheSB0aGUgZG9tYWluIG51bWJlciBpbiAvcHJvYyAqLwogaW50IHBjaV9wcm9jX2RvbWFpbihzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewotCXJldHVybiAwOworCXJldHVybiBwY2lfZG9tYWluX25yKGJ1cyk7CiB9CiAKIC8qIFRoaXMgaGVhZGVyIGZpeHVwIHdpbGwgZG8gdGhlIHJlc291cmNlIGZpeHVwIGZvciBhbGwgZGV2aWNlcyBhcyB0aGV5IGFyZQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCAyNjM4ODU2Li4yMTJmZjkyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtNjUsNiArNjUsNyBAQAogCXNlbGVjdCBBUkNIX0NMT0NLU09VUkNFX0RBVEEKIAlzZWxlY3QgSEFORExFX0RPTUFJTl9JUlEKIAlzZWxlY3QgSEFWRV9FWElUX1RIUkVBRAorCXNlbGVjdCBIQVZFX1JFR1NfQU5EX1NUQUNLX0FDQ0VTU19BUEkKIAogbWVudSAiTWFjaGluZSBzZWxlY3Rpb24iCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9LY29uZmlnLmRlYnVnIGIvYXJjaC9taXBzL0tjb25maWcuZGVidWcKaW5kZXggZjBlMzE0Yy4uN2Y5NzViMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9taXBzL0tjb25maWcuZGVidWcKQEAgLTExMyw0MiArMTEzLDYgQEAKIAloZWxwCiAJICBBZGQgc2V2ZXJhbCBmaWxlcyB0byB0aGUgZGVidWdmcyB0byB0ZXN0IHNwaW5sb2NrIHNwZWVkLgogCi1pZiBDUFVfTUlQU1I2Ci0KLWNob2ljZQotCXByb21wdCAiQ29tcGFjdCBicmFuY2ggcG9saWN5IgotCWRlZmF1bHQgTUlQU19DT01QQUNUX0JSQU5DSEVTX09QVElNQUwKLQotY29uZmlnIE1JUFNfQ09NUEFDVF9CUkFOQ0hFU19ORVZFUgotCWJvb2wgIk5ldmVyIChmb3JjZSBkZWxheSBzbG90IGJyYW5jaGVzKSIKLQloZWxwCi0JICBQYXNzIHRoZSAtbWNvbXBhY3QtYnJhbmNoZXM9bmV2ZXIgZmxhZyB0byB0aGUgY29tcGlsZXIgaW4gb3JkZXIgdG8KLQkgIGZvcmNlIGl0IHRvIGFsd2F5cyBlbWl0IGJyYW5jaGVzIHdpdGggZGVsYXkgc2xvdHMsIGFuZCBtYWtlIG5vIHVzZQotCSAgb2YgdGhlIGNvbXBhY3QgYnJhbmNoIGluc3RydWN0aW9ucyBpbnRyb2R1Y2VkIGJ5IE1JUFNyNi4gVGhpcyBpcwotCSAgdXNlZnVsIGlmIHlvdSBzdXNwZWN0IHRoZXJlIG1heSBiZSBhbiBpc3N1ZSB3aXRoIGNvbXBhY3QgYnJhbmNoZXMgaW4KLQkgIGVpdGhlciB0aGUgY29tcGlsZXIgb3IgdGhlIENQVS4KLQotY29uZmlnIE1JUFNfQ09NUEFDVF9CUkFOQ0hFU19PUFRJTUFMCi0JYm9vbCAiT3B0aW1hbCAodXNlIHdoZXJlIGJlbmVmaWNpYWwpIgotCWhlbHAKLQkgIFBhc3MgdGhlIC1tY29tcGFjdC1icmFuY2hlcz1vcHRpbWFsIGZsYWcgdG8gdGhlIGNvbXBpbGVyIGluIG9yZGVyIGZvcgotCSAgaXQgdG8gbWFrZSB1c2Ugb2YgY29tcGFjdCBicmFuY2ggaW5zdHJ1Y3Rpb25zIHdoZXJlIGl0IGRlZW1zIHRoZW0KLQkgIGJlbmVmaWNpYWwsIGFuZCB1c2UgYnJhbmNoZXMgd2l0aCBkZWxheSBzbG90cyBlbHNld2hlcmUuIFRoaXMgaXMgdGhlCi0JICBkZWZhdWx0IGNvbXBpbGVyIGJlaGF2aW91ciwgYW5kIHNob3VsZCBiZSB1c2VkIHVubGVzcyB5b3UgaGF2ZSBhCi0JICByZWFzb24gdG8gY2hvb3NlIG90aGVyd2lzZS4KLQotY29uZmlnIE1JUFNfQ09NUEFDVF9CUkFOQ0hFU19BTFdBWVMKLQlib29sICJBbHdheXMgKGZvcmNlIGNvbXBhY3QgYnJhbmNoZXMpIgotCWhlbHAKLQkgIFBhc3MgdGhlIC1tY29tcGFjdC1icmFuY2hlcz1hbHdheXMgZmxhZyB0byB0aGUgY29tcGlsZXIgaW4gb3JkZXIgdG8KLQkgIGZvcmNlIGl0IHRvIGFsd2F5cyBlbWl0IGNvbXBhY3QgYnJhbmNoZXMsIG1ha2luZyBubyB1c2Ugb2YgYnJhbmNoCi0JICBpbnN0cnVjdGlvbnMgd2l0aCBkZWxheSBzbG90cy4gVGhpcyBjYW4gcmVzdWx0IGluIG1vcmUgY29tcGFjdCBjb2RlCi0JICB3aGljaCBtYXkgYmUgYmVuZWZpY2lhbCBpbiBzb21lIHNjZW5hcmlvcy4KLQotZW5kY2hvaWNlCi0KLWVuZGlmICMgQ1BVX01JUFNSNgotCiBjb25maWcgU0NBQ0hFX0RFQlVHRlMKIAlib29sICJMMiBjYWNoZSBkZWJ1Z2ZzIGVudHJpZXMiCiAJZGVwZW5kcyBvbiBERUJVR19GUwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL01ha2VmaWxlIGIvYXJjaC9taXBzL01ha2VmaWxlCmluZGV4IGVmZDdhOWQuLjU5OGFiMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvTWFrZWZpbGUKQEAgLTIwMywxMCArMjAzLDYgQEAKIHRvb2xjaGFpbi12aXJ0CQkJCTo9ICQoY2FsbCBjYy1vcHRpb24teW4sJChtaXBzLWNmbGFncykgLW12aXJ0KQogY2ZsYWdzLSQodG9vbGNoYWluLXZpcnQpCQkrPSAtRFRPT0xDSEFJTl9TVVBQT1JUU19WSVJUCiAKLWNmbGFncy0kKENPTkZJR19NSVBTX0NPTVBBQ1RfQlJBTkNIRVNfTkVWRVIpCSs9IC1tY29tcGFjdC1icmFuY2hlcz1uZXZlcgotY2ZsYWdzLSQoQ09ORklHX01JUFNfQ09NUEFDVF9CUkFOQ0hFU19PUFRJTUFMKQkrPSAtbWNvbXBhY3QtYnJhbmNoZXM9b3B0aW1hbAotY2ZsYWdzLSQoQ09ORklHX01JUFNfQ09NUEFDVF9CUkFOQ0hFU19BTFdBWVMpCSs9IC1tY29tcGFjdC1icmFuY2hlcz1hbHdheXMKLQogIwogIyBGaXJtd2FyZSBzdXBwb3J0CiAjCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXRoNzkvY2xvY2suYyBiL2FyY2gvbWlwcy9hdGg3OS9jbG9jay5jCmluZGV4IDJlNzM3ODQuLmNjM2ExZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9hdGg3OS9jbG9jay5jCisrKyBiL2FyY2gvbWlwcy9hdGg3OS9jbG9jay5jCkBAIC05Niw3ICs5Niw3IEBACiAJc3RydWN0IGNsayAqY2xrOwogCiAJY2xrID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCBuYW1lLCBwYXJlbnRfbmFtZSwgMCwgbXVsdCwgZGl2KTsKLQlpZiAoIWNsaykKKwlpZiAoSVNfRVJSKGNsaykpCiAJCXBhbmljKCJmYWlsZWQgdG8gYWxsb2NhdGUgJXMgY2xvY2sgc3RydWN0dXJlIiwgbmFtZSk7CiAKIAlyZXR1cm4gY2xrOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jCmluZGV4IDVhOWI4N2IuLmMxZWIxZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMKQEAgLTE2MTksNiArMTYxOSwxMiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwkvKgorCSAqIENsZWFyIHRoZSBPRl9QT1BVTEFURUQgZmxhZyB0aGF0IHdhcyBzZXQgYnkgb2ZfaXJxX2luaXQoKQorCSAqIHNvIHRoYXQgYWxsIEdQSU8gZGV2aWNlcyB3aWxsIGJlIHByb2JlZC4KKwkgKi8KKwlvZl9ub2RlX2NsZWFyX2ZsYWcoZ3Bpb19ub2RlLCBPRl9QT1BVTEFURUQpOworCiAJcmV0dXJuIDA7CiB9CiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLXBsYXRmb3JtLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24tcGxhdGZvcm0uYwppbmRleCBiMzFmYmM5Li4zN2E5MzJkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24tcGxhdGZvcm0uYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24tcGxhdGZvcm0uYwpAQCAtMTA1OSw3ICsxMDU5LDcgQEAKIHsKIAlyZXR1cm4gb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG9jdGVvbl9pZHMsIE5VTEwpOwogfQotZGV2aWNlX2luaXRjYWxsKG9jdGVvbl9wdWJsaXNoX2RldmljZXMpOworYXJjaF9pbml0Y2FsbChvY3Rlb25fcHVibGlzaF9kZXZpY2VzKTsKIAogTU9EVUxFX0FVVEhPUigiRGF2aWQgRGFuZXkgPGRkYW5leUBjYXZpdW1uZXR3b3Jrcy5jb20+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL3NtcC5jCmluZGV4IDRkNDU3ZDYwLi4yNTZmZTZmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9zbXAuYwpAQCAtMzgwLDI5ICszODAsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvY3Rlb25fY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQotewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwotCi0Jc3dpdGNoIChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgewotCWNhc2UgQ1BVX1VQX1BSRVBBUkU6Ci0JCW9jdGVvbl91cGRhdGVfYm9vdF92ZWN0b3IoY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfT05MSU5FOgotCQlwcl9pbmZvKCJDcHUgJWQgb25saW5lXG4iLCBjcHUpOwotCQlicmVhazsKLQljYXNlIENQVV9ERUFEOgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gTk9USUZZX09LOwotfQotCiBzdGF0aWMgaW50IHJlZ2lzdGVyX2Nhdml1bV9ub3RpZmllcih2b2lkKQogewotCWhvdGNwdV9ub3RpZmllcihvY3Rlb25fY3B1X2NhbGxiYWNrLCAwKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9NSVBTX1NPQ19QUkVQQVJFLAorCQkJCQkgIm1pcHMvY2F2aXVtOnByZXBhcmUiLAorCQkJCQkgb2N0ZW9uX3VwZGF0ZV9ib290X3ZlY3RvciwgTlVMTCk7CiB9CiBsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX2Nhdml1bV9ub3RpZmllcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9kZWMvaW50LWhhbmRsZXIuUyBiL2FyY2gvbWlwcy9kZWMvaW50LWhhbmRsZXIuUwppbmRleCBkN2I5OTE4Li4xOTEwMjIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvZGVjL2ludC1oYW5kbGVyLlMKKysrIGIvYXJjaC9taXBzL2RlYy9pbnQtaGFuZGxlci5TCkBAIC0xNDYsNyArMTQ2LDI1IEBACiAJCS8qCiAJCSAqIEZpbmQgaXJxIHdpdGggaGlnaGVzdCBwcmlvcml0eQogCQkgKi8KLQkJIFBUUl9MQQl0MSxjcHVfbWFza19ucl90YmwKKwkJIyBvcGVuIGNvZGVkIFBUUl9MQSB0MSwgY3B1X21hc2tfbnJfdGJsCisjaWYgKF9NSVBTX1NaUFRSID09IDMyKQorCQkjIG9wZW4gY29kZWQgbGEgdDEsIGNwdV9tYXNrX25yX3RibAorCQlsdWkJdDEsICVoaShjcHVfbWFza19ucl90YmwpCisJCWFkZGl1CXQxLCAlbG8oY3B1X21hc2tfbnJfdGJsKQorCisjZW5kaWYKKyNpZiAoX01JUFNfU1pQVFIgPT0gNjQpCisJCSMgb3BlbiBjb2RlZCBkbGEgdDEsIGNwdV9tYXNrX25yX3RibAorCQkuc2V0CXB1c2gKKwkJLnNldAlub2F0CisJCWx1aQl0MSwgJWhpZ2hlc3QoY3B1X21hc2tfbnJfdGJsKQorCQlsdWkJQVQsICVoaShjcHVfbWFza19ucl90YmwpCisJCWRhZGRpdQl0MSwgdDEsICVoaWdoZXIoY3B1X21hc2tfbnJfdGJsKQorCQlkYWRkaXUJQVQsIEFULCAlbG8oY3B1X21hc2tfbnJfdGJsKQorCQlkc2xsCXQxLCAzMgorCQlkYWRkdQl0MSwgdDEsIEFUCisJCS5zZXQJcG9wCisjZW5kaWYKIDE6CQlsdwl0MiwodDEpCiAJCW5vcAogCQlhbmQJdDIsdDAKQEAgLTE5NSw3ICsyMTMsMjUgQEAKIAkJLyoKIAkJICogRmluZCBpcnEgd2l0aCBoaWdoZXN0IHByaW9yaXR5CiAJCSAqLwotCQkgUFRSX0xBCXQxLGFzaWNfbWFza19ucl90YmwKKwkJIyBvcGVuIGNvZGVkIFBUUl9MQSB0MSxhc2ljX21hc2tfbnJfdGJsCisjaWYgKF9NSVBTX1NaUFRSID09IDMyKQorCQkjIG9wZW4gY29kZWQgbGEgdDEsIGFzaWNfbWFza19ucl90YmwKKwkJbHVpCXQxLCAlaGkoYXNpY19tYXNrX25yX3RibCkKKwkJYWRkaXUJdDEsICVsbyhhc2ljX21hc2tfbnJfdGJsKQorCisjZW5kaWYKKyNpZiAoX01JUFNfU1pQVFIgPT0gNjQpCisJCSMgb3BlbiBjb2RlZCBkbGEgdDEsIGFzaWNfbWFza19ucl90YmwKKwkJLnNldAlwdXNoCisJCS5zZXQJbm9hdAorCQlsdWkJdDEsICVoaWdoZXN0KGFzaWNfbWFza19ucl90YmwpCisJCWx1aQlBVCwgJWhpKGFzaWNfbWFza19ucl90YmwpCisJCWRhZGRpdQl0MSwgdDEsICVoaWdoZXIoYXNpY19tYXNrX25yX3RibCkKKwkJZGFkZGl1CUFULCBBVCwgJWxvKGFzaWNfbWFza19ucl90YmwpCisJCWRzbGwJdDEsIDMyCisJCWRhZGR1CXQxLCB0MSwgQVQKKwkJLnNldAlwb3AKKyNlbmRpZgogMjoJCWx3CXQyLCh0MSkKIAkJbm9wCiAJCWFuZAl0Mix0MApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaAppbmRleCA1NjU4NGE2Li44MzA1NGY3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaApAQCAtMTU3LDYgKzE1Nyw3IEBACiAJbGRjMQkkZjI4LCBUSFJFQURfRlBSMjgoXHRocmVhZCkKIAlsZGMxCSRmMzAsIFRIUkVBRF9GUFIzMChcdGhyZWFkKQogCWN0YzEJXHRtcCwgZmNyMzEKKwkuc2V0CXBvcAogCS5lbmRtCiAKIAkubWFjcm8JZnB1X3Jlc3RvcmVfMTZvZGQgdGhyZWFkCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IGI1NGJjYWQuLjA3ZjU4Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0xMDcsMzUgKzEwNyw0OSBAQAogI2RlZmluZSBLVk1fSU5WQUxJRF9JTlNUCQkweGRlYWRiZWVmCiAjZGVmaW5lIEtWTV9JTlZBTElEX0FERFIJCTB4ZGVhZGJlZWYKIAorLyoKKyAqIEVWQSBoYXMgb3ZlcmxhcHBpbmcgdXNlciAmIGtlcm5lbCBhZGRyZXNzIHNwYWNlcywgc28gdXNlciBWQXMgbWF5IGJlID4KKyAqIFBBR0VfT0ZGU0VULiBGb3IgdGhpcyByZWFzb24gd2UgY2FuJ3QgdXNlIHRoZSBkZWZhdWx0IEtWTV9IVkFfRVJSX0JBRCBvZgorICogUEFHRV9PRkZTRVQuCisgKi8KKworI2RlZmluZSBLVk1fSFZBX0VSUl9CQUQJCQkoLTFVTCkKKyNkZWZpbmUgS1ZNX0hWQV9FUlJfUk9fQkFECQkoLTJVTCkKKworc3RhdGljIGlubGluZSBib29sIGt2bV9pc19lcnJvcl9odmEodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiBJU19FUlJfVkFMVUUoYWRkcik7Cit9CisKIGV4dGVybiBhdG9taWNfdCBrdm1fbWlwc19pbnN0YW5jZTsKIAogc3RydWN0IGt2bV92bV9zdGF0IHsKLQl1MzIgcmVtb3RlX3RsYl9mbHVzaDsKKwl1bG9uZyByZW1vdGVfdGxiX2ZsdXNoOwogfTsKIAogc3RydWN0IGt2bV92Y3B1X3N0YXQgewotCXUzMiB3YWl0X2V4aXRzOwotCXUzMiBjYWNoZV9leGl0czsKLQl1MzIgc2lnbmFsX2V4aXRzOwotCXUzMiBpbnRfZXhpdHM7Ci0JdTMyIGNvcF91bnVzYWJsZV9leGl0czsKLQl1MzIgdGxibW9kX2V4aXRzOwotCXUzMiB0bGJtaXNzX2xkX2V4aXRzOwotCXUzMiB0bGJtaXNzX3N0X2V4aXRzOwotCXUzMiBhZGRyZXJyX3N0X2V4aXRzOwotCXUzMiBhZGRyZXJyX2xkX2V4aXRzOwotCXUzMiBzeXNjYWxsX2V4aXRzOwotCXUzMiByZXN2ZF9pbnN0X2V4aXRzOwotCXUzMiBicmVha19pbnN0X2V4aXRzOwotCXUzMiB0cmFwX2luc3RfZXhpdHM7Ci0JdTMyIG1zYV9mcGVfZXhpdHM7Ci0JdTMyIGZwZV9leGl0czsKLQl1MzIgbXNhX2Rpc2FibGVkX2V4aXRzOwotCXUzMiBmbHVzaF9kY2FjaGVfZXhpdHM7Ci0JdTMyIGhhbHRfc3VjY2Vzc2Z1bF9wb2xsOwotCXUzMiBoYWx0X2F0dGVtcHRlZF9wb2xsOwotCXUzMiBoYWx0X3BvbGxfaW52YWxpZDsKLQl1MzIgaGFsdF93YWtldXA7CisJdTY0IHdhaXRfZXhpdHM7CisJdTY0IGNhY2hlX2V4aXRzOworCXU2NCBzaWduYWxfZXhpdHM7CisJdTY0IGludF9leGl0czsKKwl1NjQgY29wX3VudXNhYmxlX2V4aXRzOworCXU2NCB0bGJtb2RfZXhpdHM7CisJdTY0IHRsYm1pc3NfbGRfZXhpdHM7CisJdTY0IHRsYm1pc3Nfc3RfZXhpdHM7CisJdTY0IGFkZHJlcnJfc3RfZXhpdHM7CisJdTY0IGFkZHJlcnJfbGRfZXhpdHM7CisJdTY0IHN5c2NhbGxfZXhpdHM7CisJdTY0IHJlc3ZkX2luc3RfZXhpdHM7CisJdTY0IGJyZWFrX2luc3RfZXhpdHM7CisJdTY0IHRyYXBfaW5zdF9leGl0czsKKwl1NjQgbXNhX2ZwZV9leGl0czsKKwl1NjQgZnBlX2V4aXRzOworCXU2NCBtc2FfZGlzYWJsZWRfZXhpdHM7CisJdTY0IGZsdXNoX2RjYWNoZV9leGl0czsKKwl1NjQgaGFsdF9zdWNjZXNzZnVsX3BvbGw7CisJdTY0IGhhbHRfYXR0ZW1wdGVkX3BvbGw7CisJdTY0IGhhbHRfcG9sbF9pbnZhbGlkOworCXU2NCBoYWx0X3dha2V1cDsKIH07CiAKIHN0cnVjdCBrdm1fYXJjaF9tZW1vcnlfc2xvdCB7CkBAIC0zMTQsNiArMzI4LDkgQEAKIAl1MzIgZ3Vlc3Rfa2VybmVsX2FzaWRbTlJfQ1BVU107CiAJc3RydWN0IG1tX3N0cnVjdCBndWVzdF9rZXJuZWxfbW0sIGd1ZXN0X3VzZXJfbW07CiAKKwkvKiBHdWVzdCBBU0lEIG9mIGxhc3QgdXNlciBtb2RlIGV4ZWN1dGlvbiAqLworCXVuc2lnbmVkIGludCBsYXN0X3VzZXJfZ2FzaWQ7CisKIAlpbnQgbGFzdF9zY2hlZF9jcHU7CiAKIAkvKiBXQUlUIGV4ZWN1dGVkICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL21hbmdsZS1wb3J0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL21hbmdsZS1wb3J0LmgKaW5kZXggMGNmNWFjMS4uOGZmMmNiZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWNhdml1bS1vY3Rlb24vbWFuZ2xlLXBvcnQuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1jYXZpdW0tb2N0ZW9uL21hbmdsZS1wb3J0LmgKQEAgLTE1LDggKzE1LDggQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBfX3Nob3VsZF9zd2l6emxlX2JpdHModm9sYXRpbGUgdm9pZCAqYSkKIHsKIAlleHRlcm4gY29uc3QgYm9vbCBvY3Rlb25fc2hvdWxkX3N3aXp6bGVfdGFibGVbXTsKKwl1NjQgZGlkID0gKCh1NjQpKHVpbnRwdHJfdClhID4+IDQwKSAmIDB4ZmY7CiAKLQl1bnNpZ25lZCBsb25nIGRpZCA9ICgodW5zaWduZWQgbG9uZylhID4+IDQwKSAmIDB4ZmY7CiAJcmV0dXJuIG9jdGVvbl9zaG91bGRfc3dpenpsZV90YWJsZVtkaWRdOwogfQogCkBAIC0yOSw3ICsyOSw3IEBACiAKICNkZWZpbmUgX19zaG91bGRfc3dpenpsZV9iaXRzKGEpCWZhbHNlCiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBfX3Nob3VsZF9zd2l6emxlX2FkZHIodW5zaWduZWQgbG9uZyBwKQorc3RhdGljIGlubGluZSBib29sIF9fc2hvdWxkX3N3aXp6bGVfYWRkcih1NjQgcCkKIHsKIAkvKiBib290IGJ1cz8gKi8KIAlyZXR1cm4gKChwID4+IDQwKSAmIDB4ZmYpID09IDA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYXJhdmlydC9rZXJuZWwtZW50cnktaW5pdC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtcGFyYXZpcnQva2VybmVsLWVudHJ5LWluaXQuaAppbmRleCAyZjgyYmZhLi5jOWY1NzY5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1wYXJhdmlydC9rZXJuZWwtZW50cnktaW5pdC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLXBhcmF2aXJ0L2tlcm5lbC1lbnRyeS1pbml0LmgKQEAgLTExLDExICsxMSwxMyBAQAogI2RlZmluZSBDUDBfRUJBU0UgJDE1LCAxCiAKIAkubWFjcm8gIGtlcm5lbF9lbnRyeV9zZXR1cAorI2lmZGVmIENPTkZJR19TTVAKIAltZmMwCXQwLCBDUDBfRUJBU0UKIAlhbmRpCXQwLCB0MCwgMHgzZmYJCSMgQ1BVTnVtCiAJYmVxegl0MCwgMWYKIAkjIENQVXMgb3RoZXIgdGhhbiB6ZXJvIGdvdG8gc21wX2Jvb3RzdHJhcAogCWoJc21wX2Jvb3RzdHJhcAorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogMToKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtY20uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9taXBzLWNtLmgKaW5kZXggNThlNzg3NC4uNGZhZmVlZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHMtY20uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwcy1jbS5oCkBAIC00NTgsMTAgKzQ1OCwyMSBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbWlwc19jbV9tYXhfdnBfd2lkdGgodm9pZCkKIHsKIAlleHRlcm4gaW50IHNtcF9udW1fc2libGluZ3M7CisJdWludDMyX3QgY2ZnOwogCiAJaWYgKG1pcHNfY21fcmV2aXNpb24oKSA+PSBDTV9SRVZfQ00zKQogCQlyZXR1cm4gcmVhZF9nY3Jfc3lzX2NvbmZpZzIoKSAmIENNX0dDUl9TWVNfQ09ORklHMl9NQVhWUFdfTVNLOwogCisJaWYgKG1pcHNfY21fcHJlc2VudCgpKSB7CisJCS8qCisJCSAqIFdlIHByZXN1bWUgdGhhdCBhbGwgY29yZXMgaW4gdGhlIHN5c3RlbSB3aWxsIGhhdmUgdGhlIHNhbWUKKwkJICogbnVtYmVyIG9mIFZQKEUpcywgYW5kIGlmIHRoYXQgZXZlciBjaGFuZ2VzIHRoZW4gdGhpcyB3aWxsCisJCSAqIG5lZWQgcmV2aXNpdGluZy4KKwkJICovCisJCWNmZyA9IHJlYWRfZ2NyX2NsX2NvbmZpZygpICYgQ01fR0NSX0N4X0NPTkZJR19QVlBFX01TSzsKKwkJcmV0dXJuIChjZmcgPj4gQ01fR0NSX0N4X0NPTkZJR19QVlBFX1NIRikgKyAxOworCX0KKwogCWlmIChJU19FTkFCTEVEKENPTkZJR19TTVApKQogCQlyZXR1cm4gc21wX251bV9zaWJsaW5nczsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21pcHNyZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaAppbmRleCBkZWY5ZDhkLi43ZGQyZGQ0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWlwc3JlZ3MuaApAQCAtNjYwLDggKzY2MCw2IEBACiAKICNkZWZpbmUgTUlQU19DT05GN19JQVIJCShfVUxDQVNUXygxKSA8PCAxMCkKICNkZWZpbmUgTUlQU19DT05GN19BUgkJKF9VTENBU1RfKDEpIDw8IDE2KQotLyogRlRMQiBwcm9iYWJpbGl0eSBiaXRzIGZvciBSNiAqLwotI2RlZmluZSBNSVBTX0NPTkY3X0ZUTEJQX1NISUZUCSgxOCkKIAogLyogV2F0Y2hMbyogcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgTUlQU19XQVRDSExPX0lSVwkoX1VMQ0FTVF8oMHg3KSA8PCAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggMTFiOTY1Zi4uMjFhMmFhYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGFzbS9hc20tZXZhLmg+CiAKIC8qCkBAIC0xMTcwLDYgKzExNzEsOCBAQAogCQkJX19jdV9sZW4gPSBfX2ludm9rZV9jb3B5X2Zyb21fdXNlcihfX2N1X3RvLAlcCiAJCQkJCQkJICAgX19jdV9mcm9tLAlcCiAJCQkJCQkJICAgX19jdV9sZW4pOyAgIFwKKwkJfSBlbHNlIHsJCQkJCQlcCisJCQltZW1zZXQoX19jdV90bywgMCwgX19jdV9sZW4pOwkJCVwKIAkJfQkJCQkJCQlcCiAJfQkJCQkJCQkJXAogCV9fY3VfbGVuOwkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdXByb2Jlcy5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Vwcm9iZXMuaAppbmRleCAzNGMzMjVjLi43MGE0YTJmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdXByb2Jlcy5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS91cHJvYmVzLmgKQEAgLTM2LDcgKzM2LDYgQEAKIAl1bnNpZ25lZCBsb25nCXJlc3VtZV9lcGM7CiAJdTMyCWluc25bMl07CiAJdTMyCWl4b2xbMl07Ci0JdW5pb24JbWlwc19pbnN0cnVjdGlvbiBvcmlnX2luc3RbTUFYX1VJTlNOX0JZVEVTIC8gNF07CiB9OwogCiBzdHJ1Y3QgYXJjaF91cHJvYmVfdGFzayB7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jIGIvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYwppbmRleCBhODhkNDQyLi5kZDMxNzU0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKQEAgLTM1Miw3ICszNTIsMTIgQEAKIHN0YXRpYyBpbnQgbWlwc19mdGxiX2Rpc2FibGVkOwogc3RhdGljIGludCBtaXBzX2hhc19mdGxiX2NvbmZpZ3VyZWQ7CiAKLXN0YXRpYyBpbnQgc2V0X2Z0bGJfZW5hYmxlKHN0cnVjdCBjcHVpbmZvX21pcHMgKmMsIGludCBlbmFibGUpOworZW51bSBmdGxiX2ZsYWdzIHsKKwlGVExCX0VOCQk9IDEgPDwgMCwKKwlGVExCX1NFVF9QUk9CCT0gMSA8PCAxLAorfTsKKworc3RhdGljIGludCBzZXRfZnRsYl9lbmFibGUoc3RydWN0IGNwdWluZm9fbWlwcyAqYywgZW51bSBmdGxiX2ZsYWdzIGZsYWdzKTsKIAogc3RhdGljIGludCBfX2luaXQgZnRsYl9kaXNhYmxlKGNoYXIgKnMpCiB7CkBAIC0zNzEsOCArMzc2LDYgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JYmFja190b19iYWNrX2MwX2hhemFyZCgpOwotCiAJY29uZmlnNCA9IHJlYWRfYzBfY29uZmlnNCgpOwogCiAJLyogQ2hlY2sgdGhhdCBGVExCIGhhcyBiZWVuIGRpc2FibGVkICovCkBAIC01MzEsNyArNTM0LDcgQEAKIAkJcmV0dXJuIDM7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X2Z0bGJfZW5hYmxlKHN0cnVjdCBjcHVpbmZvX21pcHMgKmMsIGludCBlbmFibGUpCitzdGF0aWMgaW50IHNldF9mdGxiX2VuYWJsZShzdHJ1Y3QgY3B1aW5mb19taXBzICpjLCBlbnVtIGZ0bGJfZmxhZ3MgZmxhZ3MpCiB7CiAJdW5zaWduZWQgaW50IGNvbmZpZzsKIApAQCAtNTQyLDMzICs1NDUsMzMgQEAKIAljYXNlIENQVV9QNjYwMDoKIAkJLyogcHJvQXB0aXYgJiByZWxhdGVkIGNvcmVzIHVzZSBDb25maWc2IHRvIGVuYWJsZSB0aGUgRlRMQiAqLwogCQljb25maWcgPSByZWFkX2MwX2NvbmZpZzYoKTsKLQkJLyogQ2xlYXIgdGhlIG9sZCBwcm9iYWJpbGl0eSB2YWx1ZSAqLwotCQljb25maWcgJj0gfigzIDw8IE1JUFNfQ09ORjZfRlRMQlBfU0hJRlQpOwotCQlpZiAoZW5hYmxlKQotCQkJLyogRW5hYmxlIEZUTEIgKi8KLQkJCXdyaXRlX2MwX2NvbmZpZzYoY29uZmlnIHwKLQkJCQkJIChjYWxjdWxhdGVfZnRsYl9wcm9iYWJpbGl0eShjKQotCQkJCQkgIDw8IE1JUFNfQ09ORjZfRlRMQlBfU0hJRlQpCi0JCQkJCSB8IE1JUFNfQ09ORjZfRlRMQkVOKTsKKworCQlpZiAoZmxhZ3MgJiBGVExCX0VOKQorCQkJY29uZmlnIHw9IE1JUFNfQ09ORjZfRlRMQkVOOwogCQllbHNlCi0JCQkvKiBEaXNhYmxlIEZUTEIgKi8KLQkJCXdyaXRlX2MwX2NvbmZpZzYoY29uZmlnICYgIH5NSVBTX0NPTkY2X0ZUTEJFTik7CisJCQljb25maWcgJj0gfk1JUFNfQ09ORjZfRlRMQkVOOworCisJCWlmIChmbGFncyAmIEZUTEJfU0VUX1BST0IpIHsKKwkJCWNvbmZpZyAmPSB+KDMgPDwgTUlQU19DT05GNl9GVExCUF9TSElGVCk7CisJCQljb25maWcgfD0gY2FsY3VsYXRlX2Z0bGJfcHJvYmFiaWxpdHkoYykKKwkJCQkgIDw8IE1JUFNfQ09ORjZfRlRMQlBfU0hJRlQ7CisJCX0KKworCQl3cml0ZV9jMF9jb25maWc2KGNvbmZpZyk7CisJCWJhY2tfdG9fYmFja19jMF9oYXphcmQoKTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfSTY0MDA6Ci0JCS8qIEk2NDAwICYgcmVsYXRlZCBjb3JlcyB1c2UgQ29uZmlnNyB0byBjb25maWd1cmUgRlRMQiAqLwotCQljb25maWcgPSByZWFkX2MwX2NvbmZpZzcoKTsKLQkJLyogQ2xlYXIgdGhlIG9sZCBwcm9iYWJpbGl0eSB2YWx1ZSAqLwotCQljb25maWcgJj0gfigzIDw8IE1JUFNfQ09ORjdfRlRMQlBfU0hJRlQpOwotCQl3cml0ZV9jMF9jb25maWc3KGNvbmZpZyB8IChjYWxjdWxhdGVfZnRsYl9wcm9iYWJpbGl0eShjKQotCQkJCQkgICA8PCBNSVBTX0NPTkY3X0ZUTEJQX1NISUZUKSk7Ci0JCWJyZWFrOworCQkvKiBUaGVyZSdzIG5vIHdheSB0byBkaXNhYmxlIHRoZSBGVExCICovCisJCWlmICghKGZsYWdzICYgRlRMQl9FTikpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBDUFVfTE9PTkdTT04zOgogCQkvKiBGbHVzaCBJVExCLCBEVExCLCBWVExCIGFuZCBGVExCICovCiAJCXdyaXRlX2MwX2RpYWcoTE9PTkdTT05fRElBR19JVExCIHwgTE9PTkdTT05fRElBR19EVExCIHwKIAkJCSAgICAgIExPT05HU09OX0RJQUdfVlRMQiB8IExPT05HU09OX0RJQUdfRlRMQik7CiAJCS8qIExvb25nc29uLTMgY29yZXMgdXNlIENvbmZpZzYgdG8gZW5hYmxlIHRoZSBGVExCICovCiAJCWNvbmZpZyA9IHJlYWRfYzBfY29uZmlnNigpOwotCQlpZiAoZW5hYmxlKQorCQlpZiAoZmxhZ3MgJiBGVExCX0VOKQogCQkJLyogRW5hYmxlIEZUTEIgKi8KIAkJCXdyaXRlX2MwX2NvbmZpZzYoY29uZmlnICYgfk1JUFNfQ09ORjZfRlRMQkRJUyk7CiAJCWVsc2UKQEAgLTc4OCw2ICs3OTEsNyBAQAogCQkJCSAgICAgICBQQUdFX1NJWkUsIGNvbmZpZzQpOwogCQkJCS8qIFN3aXRjaCBGVExCIG9mZiAqLwogCQkJCXNldF9mdGxiX2VuYWJsZShjLCAwKTsKKwkJCQltaXBzX2Z0bGJfZGlzYWJsZWQgPSAxOwogCQkJCWJyZWFrOwogCQkJfQogCQkJYy0+dGxic2l6ZWZ0bGJzZXRzID0gMSA8PApAQCAtODUyLDcgKzg1Niw3IEBACiAJYy0+c2NhY2hlLmZsYWdzID0gTUlQU19DQUNIRV9OT1RfUFJFU0VOVDsKIAogCS8qIEVuYWJsZSBGVExCIGlmIHByZXNlbnQgYW5kIG5vdCBkaXNhYmxlZCAqLwotCXNldF9mdGxiX2VuYWJsZShjLCAhbWlwc19mdGxiX2Rpc2FibGVkKTsKKwlzZXRfZnRsYl9lbmFibGUoYywgbWlwc19mdGxiX2Rpc2FibGVkID8gMCA6IEZUTEJfRU4pOwogCiAJb2sgPSBkZWNvZGVfY29uZmlnMChjKTsJCQkvKiBSZWFkIENvbmZpZyByZWdpc3RlcnMuICAqLwogCUJVR19PTighb2spOwkJCQkvKiBBcmNoIHNwZWMgdmlvbGF0aW9uIQkgKi8KQEAgLTkwMiw2ICs5MDYsOSBAQAogCQl9CiAJfQogCisJLyogY29uZmlndXJlIHRoZSBGVExCIHdyaXRlIHByb2JhYmlsaXR5ICovCisJc2V0X2Z0bGJfZW5hYmxlKGMsIChtaXBzX2Z0bGJfZGlzYWJsZWQgPyAwIDogRlRMQl9FTikgfCBGVExCX1NFVF9QUk9CKTsKKwogCW1pcHNfcHJvYmVfd2F0Y2hfcmVnaXN0ZXJzKGMpOwogCiAjaWZuZGVmIENPTkZJR19NSVBTX0NQUwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvZnRyYWNlLmMKaW5kZXggOTM3YzU0Yi4uMzBhM2I3NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL21pcHMva2VybmVsL2Z0cmFjZS5jCkBAIC0zODIsOCArMzgyLDggQEAKIAlpZiAodW5saWtlbHkoZmF1bHRlZCkpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGRfcGFyZW50X3JhLCBzZWxmX3JhLCAmdHJhY2UuZGVwdGgsIGZwKQotCSAgICA9PSAtRUJVU1kpIHsKKwlpZiAoZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKG9sZF9wYXJlbnRfcmEsIHNlbGZfcmEsICZ0cmFjZS5kZXB0aCwgZnAsCisJCQkJICAgICBOVUxMKSA9PSAtRUJVU1kpIHsKIAkJKnBhcmVudF9yYV9hZGRyID0gb2xkX3BhcmVudF9yYTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUyBiL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUwppbmRleCAxNzMyNmE5Li5kYzBiMjk2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCkBAIC0xNDIsOSArMTQyLDggQEAKIAlQVFJfTEEJazEsIF9fcjRrX3dhaXQKIAlvcmkJazAsIDB4MWYJLyogMzIgYnl0ZSByb2xsYmFjayByZWdpb24gKi8KIAl4b3JpCWswLCAweDFmCi0JYm5lCWswLCBrMSwgOWYKKwlibmUJazAsIGsxLCBcaGFuZGxlcgogCU1UQzAJazAsIENQMF9FUEMKLTk6CiAJLnNldCBwb3AKIAkuZW5kbQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL21pcHMtcjItdG8tcjYtZW11bC5jIGIvYXJjaC9taXBzL2tlcm5lbC9taXBzLXIyLXRvLXI2LWVtdWwuYwppbmRleCBjMzM3MmNhLi4wYTdlMTBiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL21pcHMtcjItdG8tcjYtZW11bC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvbWlwcy1yMi10by1yNi1lbXVsLmMKQEAgLTExNjQsNyArMTE2NCw5IEBACiAJCXJlZ3MtPnJlZ3NbMzFdID0gcjMxOwogCQlyZWdzLT5jcDBfZXBjID0gZXBjOwogCQlpZiAoIXVzZWRfbWF0aCgpKSB7ICAgICAvKiBGaXJzdCB0aW1lIEZQVSB1c2VyLiAgKi8KKwkJCXByZWVtcHRfZGlzYWJsZSgpOwogCQkJZXJyID0gaW5pdF9mcHUoKTsKKwkJCXByZWVtcHRfZW5hYmxlKCk7CiAJCQlzZXRfdXNlZF9tYXRoKCk7CiAJCX0KIAkJbG9zZV9mcHUoMSk7ICAgIC8qIFNhdmUgRlBVIHN0YXRlIGZvciB0aGUgZW11bGF0b3IuICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDc0MjlhZDAuLmQyZDA2MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC02MDUsMTQgKzYwNSwxNCBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBBdm9pZCBpbmFkdmVydGVudGx5IHRyaWdnZXJpbmcgZW11bGF0aW9uICovCi0JaWYgKCh2YWx1ZSAmIFBSX0ZQX01PREVfRlIpICYmIGNwdV9oYXNfZnB1ICYmCi0JICAgICEoY3VycmVudF9jcHVfZGF0YS5mcHVfaWQgJiBNSVBTX0ZQSVJfRjY0KSkKKwlpZiAoKHZhbHVlICYgUFJfRlBfTU9ERV9GUikgJiYgcmF3X2NwdV9oYXNfZnB1ICYmCisJICAgICEocmF3X2N1cnJlbnRfY3B1X2RhdGEuZnB1X2lkICYgTUlQU19GUElSX0Y2NCkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKLQlpZiAoKHZhbHVlICYgUFJfRlBfTU9ERV9GUkUpICYmIGNwdV9oYXNfZnB1ICYmICFjcHVfaGFzX2ZyZSkKKwlpZiAoKHZhbHVlICYgUFJfRlBfTU9ERV9GUkUpICYmIHJhd19jcHVfaGFzX2ZwdSAmJiAhY3B1X2hhc19mcmUpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCS8qIEZSID0gMCBub3Qgc3VwcG9ydGVkIGluIE1JUFMgUjYgKi8KLQlpZiAoISh2YWx1ZSAmIFBSX0ZQX01PREVfRlIpICYmIGNwdV9oYXNfZnB1ICYmIGNwdV9oYXNfbWlwc19yNikKKwlpZiAoISh2YWx1ZSAmIFBSX0ZQX01PREVfRlIpICYmIHJhd19jcHVfaGFzX2ZwdSAmJiBjcHVfaGFzX21pcHNfcjYpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCS8qIFByb2NlZWQgd2l0aCB0aGUgbW9kZSBzd2l0Y2ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYwppbmRleCAzNmNmOGQ2Li4wZDU3OTA5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCkBAIC04Nyw2ICs4NywxMyBAQAogCWludCB4ID0gYm9vdF9tZW1fbWFwLm5yX21hcDsKIAlpbnQgaTsKIAorCS8qCisJICogSWYgdGhlIHJlZ2lvbiByZWFjaGVzIHRoZSB0b3Agb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UsIGFkanVzdAorCSAqIHRoZSBzaXplIHNsaWdodGx5IHNvIHRoYXQgKHN0YXJ0ICsgc2l6ZSkgZG9lc24ndCBvdmVyZmxvdworCSAqLworCWlmIChzdGFydCArIHNpemUgLSAxID09IChwaHlzX2FkZHJfdClVTExPTkdfTUFYKQorCQktLXNpemU7CisKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAoc3RhcnQgKyBzaXplIDwgc3RhcnQpIHsKIAkJcHJfd2FybigiVHJ5aW5nIHRvIGFkZCBhbiBpbnZhbGlkIG1lbW9yeSByZWdpb24sIHNraXBwZWRcbiIpOwpAQCAtNzU3LDcgKzc2NCw2IEBACiAJZGV2aWNlX3RyZWVfaW5pdCgpOwogCXNwYXJzZV9pbml0KCk7CiAJcGxhdF9zd2lvdGxiX3NldHVwKCk7Ci0JcGFnaW5nX2luaXQoKTsKIAogCWRtYV9jb250aWd1b3VzX3Jlc2VydmUoUEZOX1BIWVMobWF4X2xvd19wZm4pKTsKIAkvKiBUZWxsIGJvb3RtZW0gYWJvdXQgY21hIHJlc2VydmVkIG1lbWJsb2NrIHNlY3Rpb24gKi8KQEAgLTg3MCw2ICs4NzYsNyBAQAogCXByZWZpbGxfcG9zc2libGVfbWFwKCk7CiAKIAljcHVfY2FjaGVfaW5pdCgpOworCXBhZ2luZ19pbml0KCk7CiB9CiAKIHVuc2lnbmVkIGxvbmcga2VybmVsc3BbTlJfQ1BVU107CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtcC1jcHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLWNwcy5jCmluZGV4IGU5ZDlmYzYuLjYxODNhZDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc21wLWNwcy5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLWNwcy5jCkBAIC01MTMsNyArNTEzLDcgQEAKIAkJICogaW4gd2hpY2ggY2FzZSB0aGUgQ1BDIHdpbGwgcmVmdXNlIHRvIHBvd2VyIGRvd24gdGhlIGNvcmUuCiAJCSAqLwogCQlkbyB7Ci0JCQltaXBzX2NtX2xvY2tfb3RoZXIoY29yZSwgdnBlX2lkKTsKKwkJCW1pcHNfY21fbG9ja19vdGhlcihjb3JlLCAwKTsKIAkJCW1pcHNfY3BjX2xvY2tfb3RoZXIoY29yZSk7CiAJCQlzdGF0ID0gcmVhZF9jcGNfY29fc3RhdF9jb25mKCk7CiAJCQlzdGF0ICY9IENQQ19DeF9TVEFUX0NPTkZfU0VRU1RBVEVfTVNLOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zbXAuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLmMKaW5kZXggZjk1ZjA5NC4uYjBiYWY0OCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NtcC5jCkBAIC0zMjIsNiArMzIyLDkgQEAKIAljcHVtYXNrX3NldF9jcHUoY3B1LCAmY3B1X2NvaGVyZW50X21hc2spOwogCW5vdGlmeV9jcHVfc3RhcnRpbmcoY3B1KTsKIAorCWNwdW1hc2tfc2V0X2NwdShjcHUsICZjcHVfY2FsbGluX21hcCk7CisJc3luY2hyb25pc2VfY291bnRfc2xhdmUoY3B1KTsKKwogCXNldF9jcHVfb25saW5lKGNwdSwgdHJ1ZSk7CiAKIAlzZXRfY3B1X3NpYmxpbmdfbWFwKGNwdSk7CkBAIC0zMjksMTAgKzMzMiw2IEBACiAKIAljYWxjdWxhdGVfY3B1X2ZvcmVpZ25fbWFwKCk7CiAKLQljcHVtYXNrX3NldF9jcHUoY3B1LCAmY3B1X2NhbGxpbl9tYXApOwotCi0Jc3luY2hyb25pc2VfY291bnRfc2xhdmUoY3B1KTsKLQogCS8qCiAJICogaXJxIHdpbGwgYmUgZW5hYmxlZCBpbiAtPnNtcF9maW5pc2goKSwgZW5hYmxpbmcgaXQgdG9vIGVhcmx5CiAJICogaXMgZGFuZ2Vyb3VzLgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC91cHJvYmVzLmMgYi9hcmNoL21pcHMva2VybmVsL3Vwcm9iZXMuYwppbmRleCA4NDUyZDkzLi40YzdjMTU1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3Vwcm9iZXMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3Vwcm9iZXMuYwpAQCAtMTU3LDcgKzE1Nyw2IEBACiBpbnQgYXJjaF91cHJvYmVfcHJlX3hvbChzdHJ1Y3QgYXJjaF91cHJvYmUgKmF1cCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IHVwcm9iZV90YXNrICp1dGFzayA9IGN1cnJlbnQtPnV0YXNrOwotCXVuaW9uIG1pcHNfaW5zdHJ1Y3Rpb24gaW5zbjsKIAogCS8qCiAJICogTm93IGZpbmQgdGhlIEVQQyB3aGVyZSB0byByZXN1bWUgYWZ0ZXIgdGhlIGJyZWFrcG9pbnQgaGFzIGJlZW4KQEAgLTE2OCwxMCArMTY3LDEwIEBACiAJCXVuc2lnbmVkIGxvbmcgZXBjOwogCiAJCWVwYyA9IHJlZ3MtPmNwMF9lcGM7Ci0JCV9fY29tcHV0ZV9yZXR1cm5fZXBjX2Zvcl9pbnNuKHJlZ3MsIGluc24pOworCQlfX2NvbXB1dGVfcmV0dXJuX2VwY19mb3JfaW5zbihyZWdzLAorCQkJKHVuaW9uIG1pcHNfaW5zdHJ1Y3Rpb24pIGF1cC0+aW5zblswXSk7CiAJCWF1cC0+cmVzdW1lX2VwYyA9IHJlZ3MtPmNwMF9lcGM7CiAJfQotCiAJdXRhc2stPmF1dGFzay5zYXZlZF90cmFwX25yID0gY3VycmVudC0+dGhyZWFkLnRyYXBfbnI7CiAJY3VycmVudC0+dGhyZWFkLnRyYXBfbnIgPSBVUFJPQkVfVFJBUF9OUjsKIAlyZWdzLT5jcDBfZXBjID0gY3VycmVudC0+dXRhc2stPnhvbF92YWRkcjsKQEAgLTIyMiw3ICsyMjEsNyBAQAogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAlzd2l0Y2ggKHZhbCkgewotCWNhc2UgRElFX0JSRUFLOgorCWNhc2UgRElFX1VQUk9CRToKIAkJaWYgKHVwcm9iZV9wcmVfc3N0ZXBfbm90aWZpZXIocmVncykpCiAJCQlyZXR1cm4gTk9USUZZX1NUT1A7CiAJCWJyZWFrOwpAQCAtMjU3LDcgKzI1Niw3IEBACiAJcmEgPSByZWdzLT5yZWdzWzMxXTsKIAogCS8qIFJlcGxhY2UgdGhlIHJldHVybiBhZGRyZXNzIHdpdGggdGhlIHRyYW1wb2xpbmUgYWRkcmVzcyAqLwotCXJlZ3MtPnJlZ3NbMzFdID0gcmE7CisJcmVncy0+cmVnc1szMV0gPSB0cmFtcG9saW5lX3ZhZGRyOwogCiAJcmV0dXJuIHJhOwogfQpAQCAtMjgwLDI0ICsyNzksNiBAQAogCXJldHVybiB1cHJvYmVfd3JpdGVfb3Bjb2RlKG1tLCB2YWRkciwgVVBST0JFX1NXQlBfSU5TTik7CiB9CiAKLS8qKgotICogc2V0X29yaWdfaW5zbiAtIFJlc3RvcmUgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uLgotICogQG1tOiB0aGUgcHJvYmVkIHByb2Nlc3MgYWRkcmVzcyBzcGFjZS4KLSAqIEBhdXByb2JlOiBhcmNoIHNwZWNpZmljIHByb2JlcG9pbnQgaW5mb3JtYXRpb24uCi0gKiBAdmFkZHI6IHRoZSB2aXJ0dWFsIGFkZHJlc3MgdG8gaW5zZXJ0IHRoZSBvcGNvZGUuCi0gKgotICogRm9yIG1tIEBtbSwgcmVzdG9yZSB0aGUgb3JpZ2luYWwgb3Bjb2RlIChvcGNvZGUpIGF0IEB2YWRkci4KLSAqIFJldHVybiAwIChzdWNjZXNzKSBvciBhIG5lZ2F0aXZlIGVycm5vLgotICoKLSAqIFRoaXMgb3ZlcnJpZGVzIHRoZSB3ZWFrIHZlcnNpb24gaW4ga2VybmVsL2V2ZW50cy91cHJvYmVzLmMuCi0gKi8KLWludCBzZXRfb3JpZ19pbnNuKHN0cnVjdCBhcmNoX3Vwcm9iZSAqYXVwcm9iZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCSB1bnNpZ25lZCBsb25nIHZhZGRyKQotewotCXJldHVybiB1cHJvYmVfd3JpdGVfb3Bjb2RlKG1tLCB2YWRkciwKLQkJCSoodXByb2JlX29wY29kZV90ICopJmF1cHJvYmUtPm9yaWdfaW5zdFswXS53b3JkKTsKLX0KLQogdm9pZCBfX3dlYWsgYXJjaF91cHJvYmVfY29weV9peG9sKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHZhZGRyLAogCQkJCSAgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvdmRzby5jIGIvYXJjaC9taXBzL2tlcm5lbC92ZHNvLmMKaW5kZXggOWFiZTQ0Ny4uZjlkYmZiMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC92ZHNvLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC92ZHNvLmMKQEAgLTM5LDE2ICszOSwxNiBAQAogc3RhdGljIHZvaWQgX19pbml0IGluaXRfdmRzb19pbWFnZShzdHJ1Y3QgbWlwc192ZHNvX2ltYWdlICppbWFnZSkKIHsKIAl1bnNpZ25lZCBsb25nIG51bV9wYWdlcywgaTsKKwl1bnNpZ25lZCBsb25nIGRhdGFfcGZuOwogCiAJQlVHX09OKCFQQUdFX0FMSUdORUQoaW1hZ2UtPmRhdGEpKTsKIAlCVUdfT04oIVBBR0VfQUxJR05FRChpbWFnZS0+c2l6ZSkpOwogCiAJbnVtX3BhZ2VzID0gaW1hZ2UtPnNpemUgLyBQQUdFX1NJWkU7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKLQkJaW1hZ2UtPm1hcHBpbmcucGFnZXNbaV0gPQotCQkJdmlydF90b19wYWdlKGltYWdlLT5kYXRhICsgKGkgKiBQQUdFX1NJWkUpKTsKLQl9CisJZGF0YV9wZm4gPSBfX3BoeXNfdG9fcGZuKF9fcGFfc3ltYm9sKGltYWdlLT5kYXRhKSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKQorCQlpbWFnZS0+bWFwcGluZy5wYWdlc1tpXSA9IHBmbl90b19wYWdlKGRhdGFfcGZuICsgaSk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfdmRzbyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2t2bS9lbXVsYXRlLmMgYi9hcmNoL21pcHMva3ZtL2VtdWxhdGUuYwppbmRleCBlNzg4NTE1Li40ZGI0YzAzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva3ZtL2VtdWxhdGUuYworKysgYi9hcmNoL21pcHMva3ZtL2VtdWxhdGUuYwpAQCAtODQ2LDYgKzg0Niw0NyBAQAogCXJldHVybiBFTVVMQVRFX0ZBSUw7CiB9CiAKKy8qKgorICoga3ZtX21pcHNfaW52YWxpZGF0ZV9ndWVzdF90bGIoKSAtIEluZGljYXRlcyBhIGNoYW5nZSBpbiBndWVzdCBNTVUgbWFwLgorICogQHZjcHU6CVZDUFUgd2l0aCBjaGFuZ2VkIG1hcHBpbmdzLgorICogQHRsYjoJVExCIGVudHJ5IGJlaW5nIHJlbW92ZWQuCisgKgorICogVGhpcyBpcyBjYWxsZWQgdG8gaW5kaWNhdGUgYSBzaW5nbGUgY2hhbmdlIGluIGd1ZXN0IE1NVSBtYXBwaW5ncywgc28gdGhhdCB3ZQorICogY2FuIGFycmFuZ2UgVExCIGZsdXNoZXMgb24gdGhpcyBhbmQgb3RoZXIgQ1BVcy4KKyAqLworc3RhdGljIHZvaWQga3ZtX21pcHNfaW52YWxpZGF0ZV9ndWVzdF90bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCQkgIHN0cnVjdCBrdm1fbWlwc190bGIgKnRsYikKK3sKKwlpbnQgY3B1LCBpOworCWJvb2wgdXNlcjsKKworCS8qIE5vIG5lZWQgdG8gZmx1c2ggZm9yIGVudHJpZXMgd2hpY2ggYXJlIGFscmVhZHkgaW52YWxpZCAqLworCWlmICghKCh0bGItPnRsYl9sb1swXSB8IHRsYi0+dGxiX2xvWzFdKSAmIEVOVFJZTE9fVikpCisJCXJldHVybjsKKwkvKiBVc2VyIGFkZHJlc3Mgc3BhY2UgZG9lc24ndCBuZWVkIGZsdXNoaW5nIGZvciBLU2VnMi8zIGNoYW5nZXMgKi8KKwl1c2VyID0gdGxiLT50bGJfaGkgPCBLVk1fR1VFU1RfS1NFRzA7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCS8qCisJICogUHJvYmUgdGhlIHNoYWRvdyBob3N0IFRMQiBmb3IgdGhlIGVudHJ5IGJlaW5nIG92ZXJ3cml0dGVuLCBpZiBvbmUKKwkgKiBtYXRjaGVzLCBpbnZhbGlkYXRlIGl0CisJICovCisJa3ZtX21pcHNfaG9zdF90bGJfaW52KHZjcHUsIHRsYi0+dGxiX2hpKTsKKworCS8qIEludmFsaWRhdGUgdGhlIHdob2xlIEFTSUQgb24gb3RoZXIgQ1BVcyAqLworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlpZiAoaSA9PSBjcHUpCisJCQljb250aW51ZTsKKwkJaWYgKHVzZXIpCisJCQl2Y3B1LT5hcmNoLmd1ZXN0X3VzZXJfYXNpZFtpXSA9IDA7CisJCXZjcHUtPmFyY2guZ3Vlc3Rfa2VybmVsX2FzaWRbaV0gPSAwOworCX0KKworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKIC8qIFdyaXRlIEd1ZXN0IFRMQiBFbnRyeSBAIEluZGV4ICovCiBlbnVtIGVtdWxhdGlvbl9yZXN1bHQga3ZtX21pcHNfZW11bF90bGJ3aShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CkBAIC04NjUsMTEgKzkwNiw4IEBACiAJfQogCiAJdGxiID0gJnZjcHUtPmFyY2guZ3Vlc3RfdGxiW2luZGV4XTsKLQkvKgotCSAqIFByb2JlIHRoZSBzaGFkb3cgaG9zdCBUTEIgZm9yIHRoZSBlbnRyeSBiZWluZyBvdmVyd3JpdHRlbiwgaWYgb25lCi0JICogbWF0Y2hlcywgaW52YWxpZGF0ZSBpdAotCSAqLwotCWt2bV9taXBzX2hvc3RfdGxiX2ludih2Y3B1LCB0bGItPnRsYl9oaSk7CisKKwlrdm1fbWlwc19pbnZhbGlkYXRlX2d1ZXN0X3RsYih2Y3B1LCB0bGIpOwogCiAJdGxiLT50bGJfbWFzayA9IGt2bV9yZWFkX2MwX2d1ZXN0X3BhZ2VtYXNrKGNvcDApOwogCXRsYi0+dGxiX2hpID0ga3ZtX3JlYWRfYzBfZ3Vlc3RfZW50cnloaShjb3AwKTsKQEAgLTg5OCwxMSArOTM2LDcgQEAKIAogCXRsYiA9ICZ2Y3B1LT5hcmNoLmd1ZXN0X3RsYltpbmRleF07CiAKLQkvKgotCSAqIFByb2JlIHRoZSBzaGFkb3cgaG9zdCBUTEIgZm9yIHRoZSBlbnRyeSBiZWluZyBvdmVyd3JpdHRlbiwgaWYgb25lCi0JICogbWF0Y2hlcywgaW52YWxpZGF0ZSBpdAotCSAqLwotCWt2bV9taXBzX2hvc3RfdGxiX2ludih2Y3B1LCB0bGItPnRsYl9oaSk7CisJa3ZtX21pcHNfaW52YWxpZGF0ZV9ndWVzdF90bGIodmNwdSwgdGxiKTsKIAogCXRsYi0+dGxiX21hc2sgPSBrdm1fcmVhZF9jMF9ndWVzdF9wYWdlbWFzayhjb3AwKTsKIAl0bGItPnRsYl9oaSA9IGt2bV9yZWFkX2MwX2d1ZXN0X2VudHJ5aGkoY29wMCk7CkBAIC0xMDI2LDYgKzEwNjAsNyBAQAogCWVudW0gZW11bGF0aW9uX3Jlc3VsdCBlciA9IEVNVUxBVEVfRE9ORTsKIAl1MzIgcnQsIHJkLCBzZWw7CiAJdW5zaWduZWQgbG9uZyBjdXJyX3BjOworCWludCBjcHUsIGk7CiAKIAkvKgogCSAqIFVwZGF0ZSBQQyBhbmQgaG9sZCBvbnRvIGN1cnJlbnQgUEMgaW4gY2FzZSB0aGVyZSBpcwpAQCAtMTEyNywxNiArMTE2MiwzMSBAQAogCQkJfSBlbHNlIGlmIChyZCA9PSBNSVBTX0NQMF9UTEJfSEkgJiYgc2VsID09IDApIHsKIAkJCQl1MzIgbmFzaWQgPQogCQkJCQl2Y3B1LT5hcmNoLmdwcnNbcnRdICYgS1ZNX0VOVFJZSElfQVNJRDsKLQkJCQlpZiAoKEtTRUdYKHZjcHUtPmFyY2guZ3Byc1tydF0pICE9IENLU0VHMCkgJiYKLQkJCQkgICAgKChrdm1fcmVhZF9jMF9ndWVzdF9lbnRyeWhpKGNvcDApICYKKwkJCQlpZiAoKChrdm1fcmVhZF9jMF9ndWVzdF9lbnRyeWhpKGNvcDApICYKIAkJCQkgICAgICBLVk1fRU5UUllISV9BU0lEKSAhPSBuYXNpZCkpIHsKIAkJCQkJdHJhY2Vfa3ZtX2FzaWRfY2hhbmdlKHZjcHUsCiAJCQkJCQlrdm1fcmVhZF9jMF9ndWVzdF9lbnRyeWhpKGNvcDApCiAJCQkJCQkJJiBLVk1fRU5UUllISV9BU0lELAogCQkJCQkJbmFzaWQpOwogCi0JCQkJCS8qIEJsb3cgYXdheSB0aGUgc2hhZG93IGhvc3QgVExCcyAqLwotCQkJCQlrdm1fbWlwc19mbHVzaF9ob3N0X3RsYigxKTsKKwkJCQkJLyoKKwkJCQkJICogUmVnZW5lcmF0ZS9pbnZhbGlkYXRlIGtlcm5lbCBNTVUKKwkJCQkJICogY29udGV4dC4KKwkJCQkJICogVGhlIHVzZXIgTU1VIGNvbnRleHQgd2lsbCBiZQorCQkJCQkgKiByZWdlbmVyYXRlZCBsYXppbHkgb24gcmUtZW50cnkgdG8KKwkJCQkJICogZ3Vlc3QgdXNlciBpZiB0aGUgZ3Vlc3QgQVNJRCBhY3R1YWxseQorCQkJCQkgKiBjaGFuZ2VzLgorCQkJCQkgKi8KKwkJCQkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCQkJCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJCQkJa3ZtX2dldF9uZXdfbW11X2NvbnRleHQoJnZjcHUtPmFyY2guZ3Vlc3Rfa2VybmVsX21tLAorCQkJCQkJCQljcHUsIHZjcHUpOworCQkJCQl2Y3B1LT5hcmNoLmd1ZXN0X2tlcm5lbF9hc2lkW2NwdV0gPQorCQkJCQkJdmNwdS0+YXJjaC5ndWVzdF9rZXJuZWxfbW0uY29udGV4dC5hc2lkW2NwdV07CisJCQkJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQorCQkJCQkJaWYgKGkgIT0gY3B1KQorCQkJCQkJCXZjcHUtPmFyY2guZ3Vlc3Rfa2VybmVsX2FzaWRbaV0gPSAwOworCQkJCQlwcmVlbXB0X2VuYWJsZSgpOwogCQkJCX0KIAkJCQlrdm1fd3JpdGVfYzBfZ3Vlc3RfZW50cnloaShjb3AwLAogCQkJCQkJCSAgIHZjcHUtPmFyY2guZ3Byc1tydF0pOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2t2bS9taXBzLmMgYi9hcmNoL21pcHMva3ZtL21pcHMuYwppbmRleCBhNmVhMDg0Li5jZTk2MTQ5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva3ZtL21pcHMuYworKysgYi9hcmNoL21pcHMva3ZtL21pcHMuYwpAQCAtMTQwLDYgKzE0MCwxNiBAQAogCXJldHVybiAwOwogfQogCitib29sIGt2bV9hcmNoX2hhc192Y3B1X2RlYnVnZnModm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2ludCBrdm1fYXJjaF9jcmVhdGVfdmNwdV9kZWJ1Z2ZzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBrdm1fbWlwc19mcmVlX3ZjcHVzKHN0cnVjdCBrdm0gKmt2bSkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTQxMSw2ICs0MjEsMzEgQEAKIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogfQogCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQsIGp1c3QgYmVmb3JlIGVudGVyaW5nIGd1ZXN0ICovCitzdGF0aWMgdm9pZCBrdm1fbWlwc19jaGVja19hc2lkcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IG1pcHNfY29wcm9jICpjb3AwID0gdmNwdS0+YXJjaC5jb3AwOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgaW50IGdhc2lkOworCisJLyoKKwkgKiBMYXp5IGhvc3QgQVNJRCByZWdlbmVyYXRpb24gZm9yIGd1ZXN0IHVzZXIgbW9kZS4KKwkgKiBJZiB0aGUgZ3Vlc3QgQVNJRCBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBndWVzdCB1c2VybW9kZQorCSAqIGV4ZWN1dGlvbiwgcmVnZW5lcmF0ZSB0aGUgaG9zdCBBU0lEIHNvIGFzIHRvIGludmFsaWRhdGUgc3RhbGUgVExCCisJICogZW50cmllcy4KKwkgKi8KKwlpZiAoIUtWTV9HVUVTVF9LRVJORUxfTU9ERSh2Y3B1KSkgeworCQlnYXNpZCA9IGt2bV9yZWFkX2MwX2d1ZXN0X2VudHJ5aGkoY29wMCkgJiBLVk1fRU5UUllISV9BU0lEOworCQlpZiAoZ2FzaWQgIT0gdmNwdS0+YXJjaC5sYXN0X3VzZXJfZ2FzaWQpIHsKKwkJCWt2bV9nZXRfbmV3X21tdV9jb250ZXh0KCZ2Y3B1LT5hcmNoLmd1ZXN0X3VzZXJfbW0sIGNwdSwKKwkJCQkJCXZjcHUpOworCQkJdmNwdS0+YXJjaC5ndWVzdF91c2VyX2FzaWRbY3B1XSA9CisJCQkJdmNwdS0+YXJjaC5ndWVzdF91c2VyX21tLmNvbnRleHQuYXNpZFtjcHVdOworCQkJdmNwdS0+YXJjaC5sYXN0X3VzZXJfZ2FzaWQgPSBnYXNpZDsKKwkJfQorCX0KK30KKwogaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bikKIHsKIAlpbnQgciA9IDA7CkBAIC00MzgsNiArNDczLDkgQEAKIAlodHdfc3RvcCgpOwogCiAJdHJhY2Vfa3ZtX2VudGVyKHZjcHUpOworCisJa3ZtX21pcHNfY2hlY2tfYXNpZHModmNwdSk7CisKIAlyID0gdmNwdS0+YXJjaC52Y3B1X3J1bihydW4sIHZjcHUpOwogCXRyYWNlX2t2bV9vdXQodmNwdSk7CiAKQEAgLTE1NTEsNiArMTU4OSw4IEBACiAJaWYgKHJldCA9PSBSRVNVTUVfR1VFU1QpIHsKIAkJdHJhY2Vfa3ZtX3JlZW50ZXIodmNwdSk7CiAKKwkJa3ZtX21pcHNfY2hlY2tfYXNpZHModmNwdSk7CisKIAkJLyoKIAkJICogSWYgRlBVIC8gTVNBIGFyZSBlbmFibGVkIChpLmUuIHRoZSBndWVzdCdzIEZQVSAvIE1TQSBjb250ZXh0CiAJCSAqIGlzIGxpdmUpLCByZXN0b3JlIEZDUjMxIC8gTVNBQ1NSLgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2t2bS9tbXUuYyBiL2FyY2gvbWlwcy9rdm0vbW11LmMKaW5kZXggMTIxMDA4Yy4uMDM4ODNiYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2t2bS9tbXUuYworKysgYi9hcmNoL21pcHMva3ZtL21tdS5jCkBAIC0yNTAsMTUgKzI1MCwyNyBAQAogCQlrdm1fZ2V0X25ld19tbXVfY29udGV4dCgmdmNwdS0+YXJjaC5ndWVzdF9rZXJuZWxfbW0sIGNwdSwgdmNwdSk7CiAJCXZjcHUtPmFyY2guZ3Vlc3Rfa2VybmVsX2FzaWRbY3B1XSA9CiAJCSAgICB2Y3B1LT5hcmNoLmd1ZXN0X2tlcm5lbF9tbS5jb250ZXh0LmFzaWRbY3B1XTsKLQkJa3ZtX2dldF9uZXdfbW11X2NvbnRleHQoJnZjcHUtPmFyY2guZ3Vlc3RfdXNlcl9tbSwgY3B1LCB2Y3B1KTsKLQkJdmNwdS0+YXJjaC5ndWVzdF91c2VyX2FzaWRbY3B1XSA9Ci0JCSAgICB2Y3B1LT5hcmNoLmd1ZXN0X3VzZXJfbW0uY29udGV4dC5hc2lkW2NwdV07CiAJCW5ld2FzaWQrKzsKIAogCQlrdm1fZGVidWcoIlslZF06IGNwdV9jb250ZXh0OiAlI2x4XG4iLCBjcHUsCiAJCQkgIGNwdV9jb250ZXh0KGNwdSwgY3VycmVudC0+bW0pKTsKIAkJa3ZtX2RlYnVnKCJbJWRdOiBBbGxvY2F0ZWQgbmV3IEFTSUQgZm9yIEd1ZXN0IEtlcm5lbDogJSN4XG4iLAogCQkJICBjcHUsIHZjcHUtPmFyY2guZ3Vlc3Rfa2VybmVsX2FzaWRbY3B1XSk7CisJfQorCisJaWYgKCh2Y3B1LT5hcmNoLmd1ZXN0X3VzZXJfYXNpZFtjcHVdIF4gYXNpZF9jYWNoZShjcHUpKSAmCisJCQkJCQlhc2lkX3ZlcnNpb25fbWFzayhjcHUpKSB7CisJCXUzMiBnYXNpZCA9IGt2bV9yZWFkX2MwX2d1ZXN0X2VudHJ5aGkodmNwdS0+YXJjaC5jb3AwKSAmCisJCQkJS1ZNX0VOVFJZSElfQVNJRDsKKworCQlrdm1fZ2V0X25ld19tbXVfY29udGV4dCgmdmNwdS0+YXJjaC5ndWVzdF91c2VyX21tLCBjcHUsIHZjcHUpOworCQl2Y3B1LT5hcmNoLmd1ZXN0X3VzZXJfYXNpZFtjcHVdID0KKwkJICAgIHZjcHUtPmFyY2guZ3Vlc3RfdXNlcl9tbS5jb250ZXh0LmFzaWRbY3B1XTsKKwkJdmNwdS0+YXJjaC5sYXN0X3VzZXJfZ2FzaWQgPSBnYXNpZDsKKwkJbmV3YXNpZCsrOworCisJCWt2bV9kZWJ1ZygiWyVkXTogY3B1X2NvbnRleHQ6ICUjbHhcbiIsIGNwdSwKKwkJCSAgY3B1X2NvbnRleHQoY3B1LCBjdXJyZW50LT5tbSkpOwogCQlrdm1fZGVidWcoIlslZF06IEFsbG9jYXRlZCBuZXcgQVNJRCBmb3IgR3Vlc3QgVXNlcjogJSN4XG4iLCBjcHUsCiAJCQkgIHZjcHUtPmFyY2guZ3Vlc3RfdXNlcl9hc2lkW2NwdV0pOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rdm0vdHJhcF9lbXVsLmMgYi9hcmNoL21pcHMva3ZtL3RyYXBfZW11bC5jCmluZGV4IDA5MTU1MzkuLjNhNTQ4NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rdm0vdHJhcF9lbXVsLmMKKysrIGIvYXJjaC9taXBzL2t2bS90cmFwX2VtdWwuYwpAQCAtMTc1LDYgKzE3NSwyNCBAQAogCQkJcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVEVSTkFMX0VSUk9SOwogCQkJcmV0ID0gUkVTVU1FX0hPU1Q7CiAJCX0KKwl9IGVsc2UgaWYgKEtWTV9HVUVTVF9LRVJORUxfTU9ERSh2Y3B1KQorCQkgICAmJiAoS1NFR1goYmFkdmFkZHIpID09IENLU0VHMCB8fCBLU0VHWChiYWR2YWRkcikgPT0gQ0tTRUcxKSkgeworCQkvKgorCQkgKiBXaXRoIEVWQSB3ZSBtYXkgZ2V0IGEgVExCIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIGFuIGFkZHJlc3MKKwkJICogZXJyb3Igd2hlbiB0aGUgZ3Vlc3QgcGVyZm9ybXMgTU1JTyB0byBLU2VnMSBhZGRyZXNzZXMuCisJCSAqLworCQlrdm1fZGVidWcoIkVtdWxhdGUgJXMgTU1JTyBzcGFjZVxuIiwKKwkJCSAgc3RvcmUgPyAiU3RvcmUgdG8iIDogIkxvYWQgZnJvbSIpOworCQllciA9IGt2bV9taXBzX2VtdWxhdGVfaW5zdChjYXVzZSwgb3BjLCBydW4sIHZjcHUpOworCQlpZiAoZXIgPT0gRU1VTEFURV9GQUlMKSB7CisJCQlrdm1fZXJyKCJFbXVsYXRlICVzIE1NSU8gc3BhY2UgZmFpbGVkXG4iLAorCQkJCXN0b3JlID8gIlN0b3JlIHRvIiA6ICJMb2FkIGZyb20iKTsKKwkJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKKwkJCXJldCA9IFJFU1VNRV9IT1NUOworCQl9IGVsc2UgeworCQkJcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX01NSU87CisJCQlyZXQgPSBSRVNVTUVfSE9TVDsKKwkJfQogCX0gZWxzZSB7CiAJCWt2bV9lcnIoIklsbGVnYWwgVExCICVzIGZhdWx0IGFkZHJlc3MgLCBjYXVzZSAlI3gsIFBDOiAlcCwgQmFkVmFkZHI6ICUjbHhcbiIsCiAJCQlzdG9yZSA/ICJTVCIgOiAiTEQiLCBjYXVzZSwgb3BjLCBiYWR2YWRkcik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb242NC9sb29uZ3Nvbi0zL3NtcC5jIGIvYXJjaC9taXBzL2xvb25nc29uNjQvbG9vbmdzb24tMy9zbXAuYwppbmRleCAyZmVjNmY3Li45OWFhYjlmIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbG9vbmdzb242NC9sb29uZ3Nvbi0zL3NtcC5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3NvbjY0L2xvb25nc29uLTMvc21wLmMKQEAgLTY3Nyw3ICs2NzcsNyBAQAogCXBsYXlfZGVhZF9hdF9ja3NlZzEoc3RhdGVfYWRkcik7CiB9CiAKLXZvaWQgbG9vbmdzb24zX2Rpc2FibGVfY2xvY2soaW50IGNwdSkKK3N0YXRpYyBpbnQgbG9vbmdzb24zX2Rpc2FibGVfY2xvY2sodW5zaWduZWQgaW50IGNwdSkKIHsKIAl1aW50NjRfdCBjb3JlX2lkID0gY3B1X2RhdGFbY3B1XS5jb3JlOwogCXVpbnQ2NF90IHBhY2thZ2VfaWQgPSBjcHVfZGF0YVtjcHVdLnBhY2thZ2U7CkBAIC02ODgsOSArNjg4LDEwIEBACiAJCWlmICghKGxvb25nc29uX3N5c2NvbmYud29ya2Fyb3VuZHMgJiBXT1JLQVJPVU5EX0NQVUhPVFBMVUcpKQogCQkJTE9PTkdTT05fRlJFUUNUUkwocGFja2FnZV9pZCkgJj0gfigxIDw8IChjb3JlX2lkICogNCArIDMpKTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbG9vbmdzb24zX2VuYWJsZV9jbG9jayhpbnQgY3B1KQorc3RhdGljIGludCBsb29uZ3NvbjNfZW5hYmxlX2Nsb2NrKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJdWludDY0X3QgY29yZV9pZCA9IGNwdV9kYXRhW2NwdV0uY29yZTsKIAl1aW50NjRfdCBwYWNrYWdlX2lkID0gY3B1X2RhdGFbY3B1XS5wYWNrYWdlOwpAQCAtNzAxLDM0ICs3MDIsMTUgQEAKIAkJaWYgKCEobG9vbmdzb25fc3lzY29uZi53b3JrYXJvdW5kcyAmIFdPUktBUk9VTkRfQ1BVSE9UUExVRykpCiAJCQlMT09OR1NPTl9GUkVRQ1RSTChwYWNrYWdlX2lkKSB8PSAxIDw8IChjb3JlX2lkICogNCArIDMpOwogCX0KLX0KLQotI2RlZmluZSBDUFVfUE9TVF9ERUFEX0ZST1pFTgkoQ1BVX1BPU1RfREVBRCB8IENQVV9UQVNLU19GUk9aRU4pCi1zdGF0aWMgaW50IGxvb25nc29uM19jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCi17Ci0JdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX1BPU1RfREVBRDoKLQljYXNlIENQVV9QT1NUX0RFQURfRlJPWkVOOgotCQlwcl9pbmZvKCJEaXNhYmxlIGNsb2NrIGZvciBDUFUjJWRcbiIsIGNwdSk7Ci0JCWxvb25nc29uM19kaXNhYmxlX2Nsb2NrKGNwdSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX1VQX1BSRVBBUkU6Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRV9GUk9aRU46Ci0JCXByX2luZm8oIkVuYWJsZSBjbG9jayBmb3IgQ1BVIyVkXG4iLCBjcHUpOwotCQlsb29uZ3NvbjNfZW5hYmxlX2Nsb2NrKGNwdSk7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBOT1RJRllfT0s7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcmVnaXN0ZXJfbG9vbmdzb24zX25vdGlmaWVyKHZvaWQpCiB7Ci0JaG90Y3B1X25vdGlmaWVyKGxvb25nc29uM19jcHVfY2FsbGJhY2ssIDApOwotCXJldHVybiAwOworCXJldHVybiBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX01JUFNfU09DX1BSRVBBUkUsCisJCQkJCSAibWlwcy9sb29uZ3NvbjpwcmVwYXJlIiwKKwkJCQkJIGxvb25nc29uM19lbmFibGVfY2xvY2ssCisJCQkJCSBsb29uZ3NvbjNfZGlzYWJsZV9jbG9jayk7CiB9CiBlYXJseV9pbml0Y2FsbChyZWdpc3Rlcl9sb29uZ3NvbjNfbm90aWZpZXIpOwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbWF0aC1lbXUvZHNlbXVsLmMgYi9hcmNoL21pcHMvbWF0aC1lbXUvZHNlbXVsLmMKaW5kZXggNzJhNDY0Mi4uNGEwOTRmNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21hdGgtZW11L2RzZW11bC5jCisrKyBiL2FyY2gvbWlwcy9tYXRoLWVtdS9kc2VtdWwuYwpAQCAtMjk4LDUgKzI5OCw2IEBACiAJLyogU2V0IEVQQyB0byByZXR1cm4gdG8gcG9zdC1icmFuY2ggaW5zdHJ1Y3Rpb24gKi8KIAl4Y3AtPmNwMF9lcGMgPSBjdXJyZW50LT50aHJlYWQuYmRfZW11X2NvbnRfcGM7CiAJcHJfZGVidWcoImRzZW11bHJldCB0byAweCUwOGx4XG4iLCB4Y3AtPmNwMF9lcGMpOworCU1JUFNfRlBVX0VNVV9JTkNfU1RBVFMoZHNfZW11bCk7CiAJcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vYy1yNGsuYyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCmluZGV4IGNkNzI4MDUuLmZhN2Q4ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXI0ay5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCkBAIC04MDAsNyArODAwLDcgQEAKIAkJICogSWYgYWRkcmVzcy1iYXNlZCBjYWNoZSBvcHMgZG9uJ3QgcmVxdWlyZSBhbiBTTVAgY2FsbCwgdGhlbgogCQkgKiB1c2UgdGhlbSBleGNsdXNpdmVseSBmb3Igc21hbGwgZmx1c2hlcy4KIAkJICovCi0JCXNpemUgPSBzdGFydCAtIGVuZDsKKwkJc2l6ZSA9IGVuZCAtIHN0YXJ0OwogCQljYWNoZV9zaXplID0gaWNhY2hlX3NpemU7CiAJCWlmICghY3B1X2hhc19pY19maWxsc19mX2RjKSB7CiAJCQlzaXplICo9IDI7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vaW5pdC5jIGIvYXJjaC9taXBzL21tL2luaXQuYwppbmRleCBhNTUwOWU3Li43MmY3NDc4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vaW5pdC5jCisrKyBiL2FyY2gvbWlwcy9tbS9pbml0LmMKQEAgLTI2MSw3ICsyNjEsNiBAQAogewogCXN0cnVjdCBtYWFyX2NvbmZpZyBjZmdbQk9PVF9NRU1fTUFQX01BWF07CiAJdW5zaWduZWQgaSwgbnVtX2NvbmZpZ3VyZWQsIG51bV9jZmcgPSAwOwotCXBoeXNfYWRkcl90IHNraXA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYm9vdF9tZW1fbWFwLm5yX21hcDsgaSsrKSB7CiAJCXN3aXRjaCAoYm9vdF9tZW1fbWFwLm1hcFtpXS50eXBlKSB7CkBAIC0yNzIsMTQgKzI3MSwxNCBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQlza2lwID0gMHgxMDAwMCAtIChib290X21lbV9tYXAubWFwW2ldLmFkZHIgJiAweGZmZmYpOwotCisJCS8qIFJvdW5kIGxvd2VyIHVwICovCiAJCWNmZ1tudW1fY2ZnXS5sb3dlciA9IGJvb3RfbWVtX21hcC5tYXBbaV0uYWRkcjsKLQkJY2ZnW251bV9jZmddLmxvd2VyICs9IHNraXA7CisJCWNmZ1tudW1fY2ZnXS5sb3dlciA9IChjZmdbbnVtX2NmZ10ubG93ZXIgKyAweGZmZmYpICYgfjB4ZmZmZjsKIAotCQljZmdbbnVtX2NmZ10udXBwZXIgPSBjZmdbbnVtX2NmZ10ubG93ZXI7Ci0JCWNmZ1tudW1fY2ZnXS51cHBlciArPSBib290X21lbV9tYXAubWFwW2ldLnNpemUgLSAxOwotCQljZmdbbnVtX2NmZ10udXBwZXIgLT0gc2tpcDsKKwkJLyogUm91bmQgdXBwZXIgZG93biAqLworCQljZmdbbnVtX2NmZ10udXBwZXIgPSBib290X21lbV9tYXAubWFwW2ldLmFkZHIgKworCQkJCQlib290X21lbV9tYXAubWFwW2ldLnNpemU7CisJCWNmZ1tudW1fY2ZnXS51cHBlciA9IChjZmdbbnVtX2NmZ10udXBwZXIgJiB+MHhmZmZmKSAtIDE7CiAKIAkJY2ZnW251bV9jZmddLmF0dHJzID0gTUlQU19NQUFSX1M7CiAJCW51bV9jZmcrKzsKQEAgLTQ0MSw2ICs0NDAsOSBAQAogI2lmZGVmIENPTkZJR19ISUdITUVNCiAJdW5zaWduZWQgbG9uZyB0bXA7CiAKKwlpZiAoY3B1X2hhc19kY19hbGlhc2VzKQorCQlyZXR1cm47CisKIAlmb3IgKHRtcCA9IGhpZ2hzdGFydF9wZm47IHRtcCA8IGhpZ2hlbmRfcGZuOyB0bXArKykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBmbl90b19wYWdlKHRtcCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc2V0dXAuYyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc2V0dXAuYwppbmRleCBlYzViMjE2Li43ZTczNjRiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLXNldHVwLmMKKysrIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zZXR1cC5jCkBAIC0zOSw2ICszOSw5IEBACiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2VuZGlmCiAKKyNkZWZpbmUgUk9DSVRfQ09ORklHX0dFTjAJCTB4MWY0MDMwMDAKKyNkZWZpbmUgIFJPQ0lUX0NPTkZJR19HRU4wX1BDSV9JT0NVCUJJVCg3KQorCiBleHRlcm4gdm9pZCBtYWx0YV9iZV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBtYWx0YV9iZV9oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgaXNfZml4dXApOwogCkBAIC0xMDcsNiArMTEwLDggQEAKIHN0YXRpYyBpbnQgX19pbml0IHBsYXRfZW5hYmxlX2lvY29oZXJlbmN5KHZvaWQpCiB7CiAJaW50IHN1cHBvcnRlZCA9IDA7CisJdTMyIGNmZzsKKwogCWlmIChtaXBzX3JldmlzaW9uX3Njb25pZCA9PSBNSVBTX1JFVklTSU9OX1NDT05fQk9OSVRPKSB7CiAJCWlmIChCT05JVE9fUENJQ0FDSEVDVFJMICYgQk9OSVRPX1BDSUNBQ0hFQ1RSTF9DUFVDT0hfUFJFUykgewogCQkJQk9OSVRPX1BDSUNBQ0hFQ1RSTCB8PSBCT05JVE9fUENJQ0FDSEVDVFJMX0NQVUNPSF9FTjsKQEAgLTEyOSw3ICsxMzQsOCBAQAogCX0gZWxzZSBpZiAobWlwc19jbV9udW1pb2N1KCkgIT0gMCkgewogCQkvKiBOb3RoaW5nIHNwZWNpYWwgbmVlZHMgdG8gYmUgZG9uZSB0byBlbmFibGUgY29oZXJlbmN5ICovCiAJCXByX2luZm8oIkNNUCBJT0NVIGRldGVjdGVkXG4iKTsKLQkJaWYgKCgqKHVuc2lnbmVkIGludCAqKTB4YmY0MDMwMDAgJiAweDgxKSAhPSAweDgxKSB7CisJCWNmZyA9IF9fcmF3X3JlYWRsKCh1MzIgKilDS1NFRzFBRERSKFJPQ0lUX0NPTkZJR19HRU4wKSk7CisJCWlmICghKGNmZyAmIFJPQ0lUX0NPTkZJR19HRU4wX1BDSV9JT0NVKSkgewogCQkJcHJfY3JpdCgiSU9DVSBPUEVSQVRJT04gRElTQUJMRUQgQlkgU1dJVENIIC0gREVGQVVMVElORyBUTyBTVyBJTyBDT0hFUkVOQ1lcbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDIwZjdiZjYuLmQwMTJlODcgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTY2LDYgKzE2Niw3IEBACiAJCSIyOlxuIgkJCQkJCVwKIAkJIgkuc2VjdGlvbgkuZml4dXAsXCJheFwiXG4iCVwKIAkJIjM6XG5cdCIJCQkJCVwKKwkJIgltb3YJCTAsJTFcbiIJCQlcCiAJCSIJbW92CQklMywlMFxuIgkJXAogCQkiCWptcAkJMmJcbiIJCQlcCiAJCSIJLnByZXZpb3VzXG4iCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9saWIvdXNlcmNvcHkuYyBiL2FyY2gvbW4xMDMwMC9saWIvdXNlcmNvcHkuYwppbmRleCA3ODI2ZTZjLi5jZTg4OTllIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAvbGliL3VzZXJjb3B5LmMKKysrIGIvYXJjaC9tbjEwMzAwL2xpYi91c2VyY29weS5jCkBAIC05LDcgKzksNyBAQAogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKIHVuc2lnbmVkIGxvbmcKIF9fZ2VuZXJpY19jb3B5X3RvX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKQEAgLTI0LDYgKzI0LDggQEAKIHsKIAlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKIAkJX19jb3B5X3VzZXJfemVyb2luZyh0bywgZnJvbSwgbik7CisJZWxzZQorCQltZW1zZXQodG8sIDAsIG4pOwogCXJldHVybiBuOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL25pb3MyL2Jvb3QvZHRzLzEwbTUwX2RldmJvYXJkLmR0cyBiL2FyY2gvbmlvczIvYm9vdC9kdHMvMTBtNTBfZGV2Ym9hcmQuZHRzCmluZGV4IDNlNDExYzYuLmYzNjJiMjIgMTAwNzU1Ci0tLSBhL2FyY2gvbmlvczIvYm9vdC9kdHMvMTBtNTBfZGV2Ym9hcmQuZHRzCisrKyBiL2FyY2gvbmlvczIvYm9vdC9kdHMvMTBtNTBfZGV2Ym9hcmQuZHRzCkBAIC04Myw2ICs4Myw3IEBACiAJCQlmaWZvLXNpemUgPSA8MzI+OwogCQkJcmVnLWlvLXdpZHRoID0gPDQ+OwogCQkJcmVnLXNoaWZ0ID0gPDI+OworCQkJdHgtdGhyZXNob2xkID0gPDE2PjsKIAkJfTsKIAogCQlzeXNpZDogc3lzaWRAMTgwMDE1MjggewpkaWZmIC0tZ2l0IGEvYXJjaC9uaW9zMi9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL25pb3MyL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBjYWE1MWZmLi4wYWI4MjMyIDEwMDY0NAotLS0gYS9hcmNoL25pb3MyL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL25pb3MyL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTAyLDkgKzEwMiwxMiBAQAogc3RhdGljIGlubGluZSBsb25nIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwKIAkJCQl1bnNpZ25lZCBsb25nIG4pCiB7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQotCQlyZXR1cm4gbjsKLQlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CisJdW5zaWduZWQgbG9uZyByZXMgPSBuOworCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQorCQlyZXMgPSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwlpZiAodW5saWtlbHkocmVzKSkKKwkJbWVtc2V0KHRvICsgKG4gLSByZXMpLCAwLCByZXMpOworCXJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgbG9uZyBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLApAQCAtMTM5LDcgKzE0Miw3IEBACiAKICNkZWZpbmUgX19nZXRfdXNlcl91bmtub3duKHZhbCwgc2l6ZSwgcHRyLCBlcnIpIGRvIHsJCQlcCiAJZXJyID0gMDsJCQkJCQkJXAotCWlmIChjb3B5X2Zyb21fdXNlcigmKHZhbCksIHB0ciwgc2l6ZSkpIHsJCQlcCisJaWYgKF9fY29weV9mcm9tX3VzZXIoJih2YWwpLCBwdHIsIHNpemUpKSB7CQkJXAogCQllcnIgPSAtRUZBVUxUOwkJCQkJCVwKIAl9CQkJCQkJCQlcCiAJfSB3aGlsZSAoMCkKQEAgLTE2Niw3ICsxNjksNyBAQAogCSh7CQkJCQkJCQlcCiAJbG9uZyBfX2d1X2VyciA9IC1FRkFVTFQ7CQkJCQlcCiAJY29uc3QgX190eXBlb2ZfXygqKHB0cikpIF9fdXNlciAqX19ndV9wdHIgPSAocHRyKTsJCVwKLQl1bnNpZ25lZCBsb25nIF9fZ3VfdmFsOwkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF9fZ3VfdmFsID0gMDsJCQkJCVwKIAlfX2dldF91c2VyX2NvbW1vbihfX2d1X3ZhbCwgc2l6ZW9mKCoocHRyKSksIF9fZ3VfcHRyLCBfX2d1X2Vycik7XAogCSh4KSA9IChfX2ZvcmNlIF9fdHlwZW9mX18oeCkpX19ndV92YWw7CQkJCVwKIAlfX2d1X2VycjsJCQkJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBhNmJkMDdjLi41Y2M2YjRmIDEwMDY0NAotLS0gYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMjczLDI4ICsyNzMsMjAgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKLQl1bnNpZ25lZCBsb25nIG92ZXI7CisJdW5zaWduZWQgbG9uZyByZXMgPSBuOwogCi0JaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpCi0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwotCWlmICgodW5zaWduZWQgbG9uZylmcm9tIDwgVEFTS19TSVpFKSB7Ci0JCW92ZXIgPSAodW5zaWduZWQgbG9uZylmcm9tICsgbiAtIFRBU0tfU0laRTsKLQkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbiAtIG92ZXIpICsgb3ZlcjsKLQl9Ci0JcmV0dXJuIG47CisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKSkKKwkJcmVzID0gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwlpZiAodW5saWtlbHkocmVzKSkKKwkJbWVtc2V0KHRvICsgKG4gLSByZXMpLCAwLCByZXMpOworCXJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogY29weV90b191c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0JdW5zaWduZWQgbG9uZyBvdmVyOwotCi0JaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBuKSkKLQkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbik7Ci0JaWYgKCh1bnNpZ25lZCBsb25nKXRvIDwgVEFTS19TSVpFKSB7Ci0JCW92ZXIgPSAodW5zaWduZWQgbG9uZyl0byArIG4gLSBUQVNLX1NJWkU7Ci0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIG4gLSBvdmVyKSArIG92ZXI7Ci0JfQorCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKSkKKwkJbiA9IF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbik7CiAJcmV0dXJuIG47CiB9CiAKQEAgLTMwMywxMyArMjk1LDggQEAKIHN0YXRpYyBpbmxpbmUgX19tdXN0X2NoZWNrIHVuc2lnbmVkIGxvbmcKIGNsZWFyX3VzZXIodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCi0JaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFkZHIsIHNpemUpKQotCQlyZXR1cm4gX19jbGVhcl91c2VyKGFkZHIsIHNpemUpOwotCWlmICgodW5zaWduZWQgbG9uZylhZGRyIDwgVEFTS19TSVpFKSB7Ci0JCXVuc2lnbmVkIGxvbmcgb3ZlciA9ICh1bnNpZ25lZCBsb25nKWFkZHIgKyBzaXplIC0gVEFTS19TSVpFOwotCQlyZXR1cm4gX19jbGVhcl91c2VyKGFkZHIsIHNpemUgLSBvdmVyKSArIG92ZXI7Ci0JfQorCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9XUklURSwgYWRkciwgc2l6ZSkpKQorCQlzaXplID0gX19jbGVhcl91c2VyKGFkZHIsIHNpemUpOwogCXJldHVybiBzaXplOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9LY29uZmlnIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwppbmRleCBjZDg3NzgxLi4yYTAzMzlhIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9LY29uZmlnCisrKyBiL2FyY2gvcGFyaXNjL0tjb25maWcKQEAgLTEsNiArMSw1IEBACiBjb25maWcgUEFSSVNDCiAJZGVmX2Jvb2wgeQotCXNlbGVjdCBBUkNIX0hBU19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwogCXNlbGVjdCBBUkNIX01JR0hUX0hBVkVfUENfUEFSUE9SVAogCXNlbGVjdCBIQVZFX0lERQogCXNlbGVjdCBIQVZFX09QUk9GSUxFCkBAIC0xMSwxMiArMTAsMTMgQEAKIAlzZWxlY3QgUlRDX0NMQVNTCiAJc2VsZWN0IFJUQ19EUlZfR0VORVJJQwogCXNlbGVjdCBJTklUX0FMTF9QT1NTSUJMRQorCXNlbGVjdCBIQVZFX01FTUJMT0NLCisJc2VsZWN0IE5PX0JPT1RNRU0KIAlzZWxlY3QgQlVHCiAJc2VsZWN0IEJVSUxEVElNRV9FWFRBQkxFX1NPUlQKIAlzZWxlY3QgSEFWRV9QRVJGX0VWRU5UUwogCXNlbGVjdCBHRU5FUklDX0FUT01JQzY0IGlmICE2NEJJVAogCXNlbGVjdCBBUkNIX0hBU19BVE9NSUM2NF9ERUNfSUZfUE9TSVRJVkUKLQlzZWxlY3QgQlJPS0VOX1JPREFUQQogCXNlbGVjdCBHRU5FUklDX0lSUV9QUk9CRQogCXNlbGVjdCBHRU5FUklDX1BDSV9JT01BUAogCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRwpAQCAtMjUsNiArMjUsNyBAQAogCXNlbGVjdCBTWVNDVExfQVJDSF9VTkFMSUdOX0FMTE9XCiAJc2VsZWN0IFNZU0NUTF9FWENFUFRJT05fVFJBQ0UKIAlzZWxlY3QgSEFWRV9NT0RfQVJDSF9TUEVDSUZJQworCXNlbGVjdCBIQVZFX0FSQ0hfSEFSREVORURfVVNFUkNPUFkKIAlzZWxlY3QgVklSVF9UT19CVVMKIAlzZWxlY3QgTU9EVUxFU19VU0VfRUxGX1JFTEEKIAlzZWxlY3QgQ0xPTkVfQkFDS1dBUkRTCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9jb25maWdzL2M4MDAwX2RlZmNvbmZpZyBiL2FyY2gvcGFyaXNjL2NvbmZpZ3MvYzgwMDBfZGVmY29uZmlnCmluZGV4IDFhOGY2Zjk1Li5mNmE0YzAxIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9jb25maWdzL2M4MDAwX2RlZmNvbmZpZworKysgYi9hcmNoL3BhcmlzYy9jb25maWdzL2M4MDAwX2RlZmNvbmZpZwpAQCAtMjQ1LDcgKzI0NSw2IEBACiBDT05GSUdfUFJPVkVfUkNVX0RFTEFZPXkKIENPTkZJR19ERUJVR19CTE9DS19FWFRfREVWVD15CiBDT05GSUdfTEFURU5DWVRPUD15Ci1DT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1M9eQogQ09ORklHX0tFWVM9eQogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKIENPTkZJR19GT05UUz15CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9jb25maWdzL2dlbmVyaWMtNjRiaXRfZGVmY29uZmlnIGIvYXJjaC9wYXJpc2MvY29uZmlncy9nZW5lcmljLTY0Yml0X2RlZmNvbmZpZwppbmRleCA3ZTA3OTI2Li5jNTY0ZTZlIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9jb25maWdzL2dlbmVyaWMtNjRiaXRfZGVmY29uZmlnCisrKyBiL2FyY2gvcGFyaXNjL2NvbmZpZ3MvZ2VuZXJpYy02NGJpdF9kZWZjb25maWcKQEAgLTI5MSw3ICsyOTEsNiBAQAogQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUM9eQogIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAogQ09ORklHX1RJTUVSX1NUQVRTPXkKLUNPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUz15CiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19FQ0I9bQogQ09ORklHX0NSWVBUT19QQ0JDPW0KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2R3YXJmLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9kd2FyZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZTdkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9kd2FyZi5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSGVsZ2UgRGVsbGVyIDxkZWxsZXJAZ214LmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfQVNNX1BBUklTQ19EV0FSRl9ICisjZGVmaW5lIF9BU01fUEFSSVNDX0RXQVJGX0gKKworI2lmZGVmIF9fQVNTRU1CTFlfXworCisjZGVmaW5lIENGSV9TVEFSVFBST0MJLmNmaV9zdGFydHByb2MKKyNkZWZpbmUgQ0ZJX0VORFBST0MJLmNmaV9lbmRwcm9jCisjZGVmaW5lIENGSV9ERUZfQ0ZBCS5jZmlfZGVmX2NmYQorI2RlZmluZSBDRklfUkVHSVNURVIJLmNmaV9yZWdpc3RlcgorI2RlZmluZSBDRklfUkVMX09GRlNFVAkuY2ZpX3JlbF9vZmZzZXQKKyNkZWZpbmUgQ0ZJX1VOREVGSU5FRAkuY2ZpX3VuZGVmaW5lZAorCisjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZgkvKiBfQVNNX1BBUklTQ19EV0FSRl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9saW5rYWdlLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9saW5rYWdlLmgKaW5kZXggMGIxOWE3Mi4uNjdlNmI0MyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vbGlua2FnZS5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2xpbmthZ2UuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgX19BU01fUEFSSVNDX0xJTktBR0VfSAogI2RlZmluZSBfX0FTTV9QQVJJU0NfTElOS0FHRV9ICiAKKyNpbmNsdWRlIDxhc20vZHdhcmYuaD4KKwogI2lmbmRlZiBfX0FMSUdOCiAjZGVmaW5lIF9fQUxJR04gICAgICAgICAuYWxpZ24gNAogI2RlZmluZSBfX0FMSUdOX1NUUiAgICAgIi5hbGlnbiA0IgpAQCAtMTAsNiArMTIsOCBAQAogICogSW4gcGFyaXNjIGFzc2VtYmx5IGEgc2VtaWNvbG9uIG1hcmtzIGEgY29tbWVudCB3aGlsZSBhCiAgKiBleGNsYW1hdGlvbiBtYXJrIGlzIHVzZWQgdG8gc2VwYXJhdGUgaW5kZXBlbmRlbnQgbGluZXMuCiAgKi8KKyNkZWZpbmUgQVNNX05MCSEKKwogI2lmZGVmIF9fQVNTRU1CTFlfXwogCiAjZGVmaW5lIEVOVFJZKG5hbWUpIFwKQEAgLTI2LDYgKzMwLDE0IEBACiAJRU5EKG5hbWUpCiAjZW5kaWYKIAorI2RlZmluZSBFTlRSWV9DRkkobmFtZSkgXAorCUVOVFJZKG5hbWUpCUFTTV9OTFwKKwlDRklfU1RBUlRQUk9DCisKKyNkZWZpbmUgRU5EUFJPQ19DRkkobmFtZSkgXAorCUVORFBST0MobmFtZSkJQVNNX05MXAorCUNGSV9FTkRQUk9DCisKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmICAvKiBfX0FTTV9QQVJJU0NfTElOS0FHRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggMjkxY2VlMi4uZTQ0YmRiOSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtODMsNyArODMsNyBAQAogCXByaW50aygiJXM6JWQ6IGJhZCBwZ2QgJTA4bHguXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sICh1bnNpZ25lZCBsb25nKXBnZF92YWwoZSkpCiAKIC8qIFRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIGluaXRpYWxseSBtYXBwZWQga2VybmVsIG1lbW9yeSAqLwotI2lmZGVmIENPTkZJR182NEJJVAorI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSB8fCBkZWZpbmVkKENPTkZJR19TTVApCiAjZGVmaW5lIEtFUk5FTF9JTklUSUFMX09SREVSCTI1CS8qIDE8PDI1ID0gMzJNQiAqLwogI2Vsc2UKICNkZWZpbmUgS0VSTkVMX0lOSVRJQUxfT1JERVIJMjQJLyogMTw8MjQgPSAxNk1CICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggMGY1OWZkOS4uOWEyYWVlMSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTAsNiArMTAsOCBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3VhY2Nlc3MtdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgogCiAjZGVmaW5lIFZFUklGWV9SRUFEIDAKICNkZWZpbmUgVkVSSUZZX1dSSVRFIDEKQEAgLTIwMCwzNSArMjAyLDU4IEBACiAjZGVmaW5lIGNsZWFyX3VzZXIgbGNsZWFyX3VzZXIKICNkZWZpbmUgX19jbGVhcl91c2VyIGxjbGVhcl91c2VyCiAKLXVuc2lnbmVkIGxvbmcgY29weV90b191c2VyKHZvaWQgX191c2VyICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBsZW4pOwotI2RlZmluZSBfX2NvcHlfdG9fdXNlciBjb3B5X3RvX3VzZXIKLXVuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcih2b2lkICpkc3QsIGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHVuc2lnbmVkIGxvbmcgbGVuKTsKLXVuc2lnbmVkIGxvbmcgY29weV9pbl91c2VyKHZvaWQgX191c2VyICpkc3QsIGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHVuc2lnbmVkIGxvbmcgbGVuKTsKK3Vuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIF9fY29weV90b191c2VyKHZvaWQgX191c2VyICpkc3QsIGNvbnN0IHZvaWQgKnNyYywKKwkJCQkJICB1bnNpZ25lZCBsb25nIGxlbik7Cit1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBfX2NvcHlfZnJvbV91c2VyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywKKwkJCQkJICB1bnNpZ25lZCBsb25nIGxlbik7Cit1bnNpZ25lZCBsb25nIGNvcHlfaW5fdXNlcih2b2lkIF9fdXNlciAqZHN0LCBjb25zdCB2b2lkIF9fdXNlciAqc3JjLAorCQkJICAgdW5zaWduZWQgbG9uZyBsZW4pOwogI2RlZmluZSBfX2NvcHlfaW5fdXNlciBjb3B5X2luX3VzZXIKICNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWMgX19jb3B5X3RvX3VzZXIKICNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyBfX2NvcHlfZnJvbV91c2VyCiAKLWV4dGVybiB2b2lkIGNvcHlfZnJvbV91c2VyX292ZXJmbG93KHZvaWQpCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCi0gICAgICAgIF9fY29tcGlsZXRpbWVfZXJyb3IoImNvcHlfZnJvbV91c2VyKCkgYnVmZmVyIHNpemUgaXMgbm90IHByb3ZhYmx5IGNvcnJlY3QiKQotI2Vsc2UKLSAgICAgICAgX19jb21waWxldGltZV93YXJuaW5nKCJjb3B5X2Zyb21fdXNlcigpIGJ1ZmZlciBzaXplIGlzIG5vdCBwcm92YWJseSBjb3JyZWN0IikKLSNlbmRpZgotOworZXh0ZXJuIHZvaWQgX19jb21waWxldGltZV9lcnJvcigidXNlcmNvcHkgYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsIikKK19fYmFkX2NvcHlfdXNlcih2b2lkKTsKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuKQorc3RhdGljIGlubGluZSB2b2lkIGNvcHlfdXNlcl9vdmVyZmxvdyhpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLSAgICAgICAgaW50IHN6ID0gX19jb21waWxldGltZV9vYmplY3Rfc2l6ZSh0byk7Ci0gICAgICAgIGludCByZXQgPSAtRUZBVUxUOworCVdBUk4oMSwgIkJ1ZmZlciBvdmVyZmxvdyBkZXRlY3RlZCAoJWQgPCAlbHUpIVxuIiwgc2l6ZSwgY291bnQpOworfQogCi0gICAgICAgIGlmIChsaWtlbHkoc3ogPT0gLTEgfHwgIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pIHx8IHN6ID49IG4pKQotICAgICAgICAgICAgICAgIHJldCA9IF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY29weV9mcm9tX3VzZXJfb3ZlcmZsb3coKTsKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKK2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCWludCBzeiA9IF9fY29tcGlsZXRpbWVfb2JqZWN0X3NpemUodG8pOworCXVuc2lnbmVkIGxvbmcgcmV0ID0gbjsKIAotICAgICAgICByZXR1cm4gcmV0OworCWlmIChsaWtlbHkoc3ogPCAwIHx8IHN6ID49IG4pKSB7CisJCWNoZWNrX29iamVjdF9zaXplKHRvLCBuLCBmYWxzZSk7CisJCXJldCA9IF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCX0gZWxzZSBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQorCQljb3B5X3VzZXJfb3ZlcmZsb3coc3osIG4pOworCWVsc2UKKwkJX19iYWRfY29weV91c2VyKCk7CisKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJbWVtc2V0KHRvICsgKG4gLSByZXQpLCAwLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCWludCBzeiA9IF9fY29tcGlsZXRpbWVfb2JqZWN0X3NpemUoZnJvbSk7CisKKwlpZiAobGlrZWx5KHN6IDwgMCB8fCBzeiA+PSBuKSkgeworCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKKwkJbiA9IF9fY29weV90b191c2VyKHRvLCBmcm9tLCBuKTsKKwl9IGVsc2UgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKKwkJY29weV91c2VyX292ZXJmbG93KHN6LCBuKTsKKwllbHNlCisJCV9fYmFkX2NvcHlfdXNlcigpOworCisJcmV0dXJuIG47CiB9CiAKIHN0cnVjdCBwdF9yZWdzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2VudHJ5LlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUwppbmRleCBiYWEzZDlkLi40ZmNmZjJkIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUwpAQCAtNzY2LDcgKzc2Niw3IEBACiAJICogY29weV90aHJlYWQgbW92ZWQgYXJncyBpbnRvIHRhc2sgc2F2ZSBhcmVhLgogCSAqLwogCi1FTlRSWShyZXRfZnJvbV9rZXJuZWxfdGhyZWFkKQorRU5UUllfQ0ZJKHJldF9mcm9tX2tlcm5lbF90aHJlYWQpCiAKIAkvKiBDYWxsIHNjaGVkdWxlX3RhaWwgZmlyc3QgdGhvdWdoICovCiAJQkwJc2NoZWR1bGVfdGFpbCwgJXIyCkBAIC03ODIsNyArNzgyLDcgQEAKIAljb3B5CSVyMzEsICVyMgogCWIJZmluaXNoX2NoaWxkX3JldHVybgogCW5vcAotRU5EUFJPQyhyZXRfZnJvbV9rZXJuZWxfdGhyZWFkKQorRU5EUFJPQ19DRkkocmV0X2Zyb21fa2VybmVsX3RocmVhZCkKIAogCiAJLyoKQEAgLTc5MCw3ICs3OTAsNyBAQAogCSAqCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIAkgKgogCSAqIHN3aXRjaCBrZXJuZWwgc3RhY2tzIGFuZCByZXR1cm4gcHJldiAqLwotRU5UUlkoX3N3aXRjaF90bykKK0VOVFJZX0NGSShfc3dpdGNoX3RvKQogCVNUUkVHCSAlcjIsIC1SUF9PRkZTRVQoJXIzMCkKIAogCWNhbGxlZV9zYXZlX2Zsb2F0CkBAIC04MTUsNyArODE1LDcgQEAKIAlMRFJFRwktUlBfT0ZGU0VUKCVyMzApLCAlcjIKIAlidgklcjAoJXIyKQogCWNvcHkJJXIyNiwgJXIyOAotRU5EUFJPQyhfc3dpdGNoX3RvKQorRU5EUFJPQ19DRkkoX3N3aXRjaF90bykKIAogCS8qCiAJICogQ29tbW9uIHJmaSByZXR1cm4gcGF0aCBmb3IgaW50ZXJydXB0aW9ucywga2VybmVsIGV4ZWN2ZSwgYW5kCkBAIC04MzMsNyArODMzLDcgQEAKIAogCS5hbGlnbglQQUdFX1NJWkUKIAotRU5UUlkoc3lzY2FsbF9leGl0X3JmaSkKK0VOVFJZX0NGSShzeXNjYWxsX2V4aXRfcmZpKQogCW1mY3RsICAgJWNyMzAsJXIxNgogCUxEUkVHCVRJX1RBU0soJXIxNiksICVyMTYJLyogdGhyZWFkX2luZm8gLT4gdGFza19zdHJ1Y3QgKi8KIAlsZG8JVEFTS19SRUdTKCVyMTYpLCVyMTYKQEAgLTEwMzcsMTIgKzEwMzcsMTIgQEAKIAogCWIJZG9fY3B1X2lycV9tYXNrCiAJbGRvCVIlaW50cl9yZXR1cm4oJXIyKSwgJXIyCS8qIHJldHVybiB0byBpbnRyX3JldHVybiwgbm90IGhlcmUgKi8KLUVORFBST0Moc3lzY2FsbF9leGl0X3JmaSkKK0VORFBST0NfQ0ZJKHN5c2NhbGxfZXhpdF9yZmkpCiAKIAogCS8qIEdlbmVyaWMgaW50ZXJydXB0aW9ucyAoaWxsZWdhbCBpbnNuLCB1bmFsaWduZWQsIHBhZ2UgZmF1bHQsIGV0YykgKi8KIAotRU5UUlkoaW50cl9zYXZlKQkJLyogZm9yIG9zX2hwbWMgKi8KK0VOVFJZX0NGSShpbnRyX3NhdmUpCQkvKiBmb3Igb3NfaHBtYyAqLwogCW1mc3AgICAgJXNyNywlcjE2CiAJY21waWIsQ09ORCg9KSxuIDAsJXIxNiwxZgogCWdldF9zdGFja191c2VfY3IzMApAQCAtMTExNyw3ICsxMTE3LDcgQEAKIAogCWIJCWhhbmRsZV9pbnRlcnJ1cHRpb24KIAlsZG8JCVIlaW50cl9jaGVja19zaWcoJXIyKSwgJXIyCi1FTkRQUk9DKGludHJfc2F2ZSkKK0VORFBST0NfQ0ZJKGludHJfc2F2ZSkKIAogCiAJLyoKQEAgLTE3MjAsNyArMTcyMCw3IEBACiAJLmVuZG0KIAogCS5tYWNybwlmb3JrX2xpa2UgbmFtZQotRU5UUlkoc3lzX1xuYW1lXCgpX3dyYXBwZXIpCitFTlRSWV9DRkkoc3lzX1xuYW1lXCgpX3dyYXBwZXIpCiAJTERSRUcJVElfVEFTSy1USFJFQURfU1pfQUxHTi1GUkFNRV9TSVpFKCVyMzApLCAlcjEKIAlsZG8JVEFTS19SRUdTKCVyMSksJXIxCiAJcmVnX3NhdmUgJXIxCkBAIC0xNzI4LDcgKzE3MjgsNyBAQAogCWxkaWwJTCVzeXNfXG5hbWUsICVyMzEKIAliZQlSJXN5c19cbmFtZSglc3I0LCVyMzEpCiAJU1RSRUcJJXIyOCwgUFRfQ1IyNyglcjEpCi1FTkRQUk9DKHN5c19cbmFtZVwoKV93cmFwcGVyKQorRU5EUFJPQ19DRkkoc3lzX1xuYW1lXCgpX3dyYXBwZXIpCiAJLmVuZG0KIAogZm9ya19saWtlIGNsb25lCkBAIC0xNzM2LDcgKzE3MzYsNyBAQAogZm9ya19saWtlIHZmb3JrCiAKIAkvKiBTZXQgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIGNoaWxkICovCi1FTlRSWShjaGlsZF9yZXR1cm4pCitFTlRSWV9DRkkoY2hpbGRfcmV0dXJuKQogCUJMCXNjaGVkdWxlX3RhaWwsICVyMgogCW5vcAogZmluaXNoX2NoaWxkX3JldHVybjoKQEAgLTE3NDgsOSArMTc0OCw5IEBACiAJcmVnX3Jlc3RvcmUgJXIxCiAJYglzeXNjYWxsX2V4aXQKIAljb3B5CSVyMCwlcjI4Ci1FTkRQUk9DKGNoaWxkX3JldHVybikKK0VORFBST0NfQ0ZJKGNoaWxkX3JldHVybikKIAotRU5UUlkoc3lzX3J0X3NpZ3JldHVybl93cmFwcGVyKQorRU5UUllfQ0ZJKHN5c19ydF9zaWdyZXR1cm5fd3JhcHBlcikKIAlMRFJFRwlUSV9UQVNLLVRIUkVBRF9TWl9BTEdOLUZSQU1FX1NJWkUoJXIzMCksJXIyNgogCWxkbwlUQVNLX1JFR1MoJXIyNiksJXIyNgkvKiBnZXQgcHQgcmVncyAqLwogCS8qIERvbid0IHNhdmUgcmVncywgd2UgYXJlIGdvaW5nIHRvIHJlc3RvcmUgdGhlbSBmcm9tIHNpZ2NvbnRleHQuICovCkBAIC0xNzc4LDkgKzE3NzgsOSBAQAogCSAqLwogCWJ2CSVyMCglcjIpCiAJTERSRUcJUFRfR1IyOCglcjEpLCVyMjggIC8qIHJlbG9hZCBvcmlnaW5hbCByMjggZm9yIHN5c2NhbGxfZXhpdCAqLwotRU5EUFJPQyhzeXNfcnRfc2lncmV0dXJuX3dyYXBwZXIpCitFTkRQUk9DX0NGSShzeXNfcnRfc2lncmV0dXJuX3dyYXBwZXIpCiAKLUVOVFJZKHN5c2NhbGxfZXhpdCkKK0VOVFJZX0NGSShzeXNjYWxsX2V4aXQpCiAJLyogTk9URTogTm90IGFsbCBzeXNjYWxscyBleGl0IHRoaXMgd2F5LiAgcnRfc2lncmV0dXJuIHdpbGwgZXhpdAogCSAqIHZpYSBzeXNjYWxsX2V4aXRfcmZpIGlmIHRoZSBzaWduYWwgd2FzIHJlY2VpdmVkIHdoaWxlIHRoZSBwcm9jZXNzCiAJICogd2FzIHJ1bm5pbmcuCkBAIC0xOTc5LDcgKzE5NzksNyBAQAogI2Vsc2UKIAlub3AKICNlbmRpZgotRU5EUFJPQyhzeXNjYWxsX2V4aXQpCitFTkRQUk9DX0NGSShzeXNjYWxsX2V4aXQpCiAKIAogI2lmZGVmIENPTkZJR19GVU5DVElPTl9UUkFDRVIKQEAgLTIwMjMsNyArMjAyMyw3IEBACiAJLmFsaWduIDgKIAkuZ2xvYmwgcmV0dXJuX3RvX2hhbmRsZXIKIAkudHlwZSAgcmV0dXJuX3RvX2hhbmRsZXIsIEBmdW5jdGlvbgotRU5UUlkocmV0dXJuX3RvX2hhbmRsZXIpCitFTlRSWV9DRkkocmV0dXJuX3RvX2hhbmRsZXIpCiAJLnByb2MKIAkuY2FsbGluZm8gY2FsbGVyLGZyYW1lPUZSQU1FX1NJWkUKIAkuZW50cnkKQEAgLTIwNjcsNyArMjA2Nyw3IEBACiAJTERSRUdNIC1GUkFNRV9TSVpFKCVzcCksJXIzCiAJLmV4aXQKIAkucHJvY2VuZAotRU5EUFJPQyhyZXR1cm5fdG9faGFuZGxlcikKK0VORFBST0NfQ0ZJKHJldHVybl90b19oYW5kbGVyKQogCiAjZW5kaWYgLyogQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiAqLwogCkBAIC0yMDc2LDcgKzIwNzYsNyBAQAogI2lmZGVmIENPTkZJR19JUlFTVEFDS1MKIC8qIHZvaWQgY2FsbF9vbl9zdGFjayh1bnNpZ25lZCBsb25nIHBhcmFtMSwgdm9pZCAqZnVuYywKIAkJICAgICAgdW5zaWduZWQgbG9uZyBuZXdfc3RhY2spICovCi1FTlRSWShjYWxsX29uX3N0YWNrKQorRU5UUllfQ0ZJKGNhbGxfb25fc3RhY2spCiAJY29weQklc3AsICVyMQogCiAJLyogUmVnYXJkaW5nIHRoZSBIUFBBIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLApAQCAtMjExMiwxMCArMjExMiwxMCBAQAogCWJ2CSglcnApCiAJTERSRUcJLTY4KCVzcCksICVzcAogIyBlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLUVORFBST0MoY2FsbF9vbl9zdGFjaykKK0VORFBST0NfQ0ZJKGNhbGxfb25fc3RhY2spCiAjZW5kaWYgLyogQ09ORklHX0lSUVNUQUNLUyAqLwogCi1nZXRfcmVnaXN0ZXI6CitFTlRSWV9DRkkoZ2V0X3JlZ2lzdGVyKQogCS8qCiAJICogZ2V0X3JlZ2lzdGVyIGlzIHVzZWQgYnkgdGhlIG5vbiBhY2Nlc3MgdGxiIG1pc3MgaGFuZGxlcnMgdG8KIAkgKiBjb3B5IHRoZSB2YWx1ZSBvZiB0aGUgZ2VuZXJhbCByZWdpc3RlciBzcGVjaWZpZWQgaW4gcjggaW50bwpAQCAtMjE5Miw5ICsyMTkyLDEwIEBACiAJY29weSAgICAlcjMwLCVyMQogCWJ2ICAgICAgJXIwKCVyMjUpICAgIC8qIHIzMSAqLwogCWNvcHkgICAgJXIzMSwlcjEKK0VORFBST0NfQ0ZJKGdldF9yZWdpc3RlcikKIAogCi1zZXRfcmVnaXN0ZXI6CitFTlRSWV9DRkkoc2V0X3JlZ2lzdGVyKQogCS8qCiAJICogc2V0X3JlZ2lzdGVyIGlzIHVzZWQgYnkgdGhlIG5vbiBhY2Nlc3MgdGxiIG1pc3MgaGFuZGxlcnMgdG8KIAkgKiBjb3B5IHRoZSB2YWx1ZSBvZiByMSBpbnRvIHRoZSBnZW5lcmFsIHJlZ2lzdGVyIHNwZWNpZmllZCBpbgpAQCAtMjI2Niw0ICsyMjY3LDUgQEAKIAljb3B5ICAgICVyMSwlcjMwCiAJYnYgICAgICAlcjAoJXIyNSkgICAgLyogcjMxICovCiAJY29weSAgICAlcjEsJXIzMQorRU5EUFJPQ19DRkkoc2V0X3JlZ2lzdGVyKQogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZnRyYWNlLmMKaW5kZXggYTgyOGEwYS4uNWE1NTA2YSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9mdHJhY2UuYwpAQCAtNDgsNyArNDgsNyBAQAogCQlyZXR1cm47CiAKICAgICAgICAgaWYgKGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShvbGQsIHNlbGZfYWRkciwgJnRyYWNlLmRlcHRoLAotCQkJMCApID09IC1FQlVTWSkKKwkJCQkgICAgIDAsIE5VTEwpID09IC1FQlVTWSkKICAgICAgICAgICAgICAgICByZXR1cm47CiAKIAkvKiBhY3RpdmF0ZSBwYXJpc2NfcmV0dXJuX3RvX2hhbmRsZXIoKSBhcyByZXR1cm4gcG9pbnQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9ocG1jLlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaHBtYy5TCmluZGV4IGUxNThiNmYuLjBmYmQwYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9ocG1jLlMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2hwbWMuUwpAQCAtNDEsMTIgKzQxLDEyIEBACiAgKi8KIAogCS5sZXZlbAkJMS4xCi0JLmRhdGEKIAogI2luY2x1ZGUgPGFzbS9hc3NlbWJseS5oPgogI2luY2x1ZGUgPGFzbS9wZGMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAKIAkvKgogCSAqIHN0YWNrIGZvciBvc19ocG1jLCB0aGUgSFBNQyBoYW5kbGVyLgpAQCAtNTUsMjIgKzU1LDI2IEBACiAJICogSU9EQyByZXF1aXJlcyA3SyBieXRlIHN0YWNrLiAgVGhhdCBsZWF2ZXMgMUsgYnl0ZSBmb3Igb3NfaHBtYy4KIAkgKi8KIAorCV9fUEFHRV9BTElHTkVEX0JTUwogCS5hbGlnbiA0MDk2CiBocG1jX3N0YWNrOgogCS5ibG9jayAxNjM4NAogCiAjZGVmaW5lIEhQTUNfSU9EQ19CVUZfU0laRSAweDgwMDAKIAorCV9fUEFHRV9BTElHTkVEX0JTUwogCS5hbGlnbiA0MDk2CiBocG1jX2lvZGNfYnVmOgogCS5ibG9jayBIUE1DX0lPRENfQlVGX1NJWkUKIAorCS5zZWN0aW9uIC5ic3MKIAkuYWxpZ24gOAogaHBtY19yYWRkcjoKIAkuYmxvY2sgMTI4CiAKICNkZWZpbmUgSFBNQ19QSU1fREFUQV9TSVpFIDg5NiAvKiBFbm91Z2ggdG8gaG9sZCBhbGwgYXJjaGl0ZWN0ZWQgMi4wIHN0YXRlICovCiAKKwkuc2VjdGlvbiAuYnNzCiAJLmFsaWduIDgKIEVOVFJZKGhwbWNfcGltX2RhdGEpCiAJLmJsb2NrIEhQTUNfUElNX0RBVEFfU0laRQpAQCAtNzksNyArODMsNyBAQAogCS50ZXh0CiAKIAkuaW1wb3J0IGludHJfc2F2ZSwgY29kZQotRU5UUlkob3NfaHBtYykKK0VOVFJZX0NGSShvc19ocG1jKQogLm9zX2hwbWM6CiAKIAkvKgpAQCAtMjk1LDExICsyOTksMTEgQEAKIAogCWIgLgogCW5vcAotRU5EUFJPQyhvc19ocG1jKQorRU5EUFJPQ19DRkkob3NfaHBtYykKIC5vc19ocG1jX2VuZDoKLQlub3AKLS5kYXRhCi0uYWxpZ24gNAorCisKKwlfX0lOSVRST0RBVEEKIAkuZXhwb3J0IG9zX2hwbWNfc2l6ZQogb3NfaHBtY19zaXplOgogCS53b3JkIC5vc19ocG1jX2VuZC0ub3NfaHBtYwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2ludmVudG9yeS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL2ludmVudG9yeS5jCmluZGV4IGYwYjY3MjIuLjU0NWY5ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9pbnZlbnRvcnkuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaW52ZW50b3J5LmMKQEAgLTUwNiw3ICs1MDYsNyBAQAogCWxvbmcgc3RhdHVzOwogCXN0cnVjdCBwZGNfc3lzdGVtX21hcF9hZGRyX2luZm8gYWRkcl9yZXN1bHQ7CiAKLQlkZXYtPmFkZHIgPSBrbWFsbG9jKG51bV9hZGRycyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0tFUk5FTCk7CisJZGV2LT5hZGRyID0ga21hbGxvY19hcnJheShudW1fYWRkcnMsIHNpemVvZigqZGV2LT5hZGRyKSwgR0ZQX0tFUk5FTCk7CiAJaWYoIWRldi0+YWRkcikgewogCQlwcmludGsoS0VSTl9FUlIgIiVzICVzKCk6IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmVcbiIsCiAJCSAgICAgICBfX0ZJTEVfXywgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3BhY2FjaGUuUyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9wYWNhY2hlLlMKaW5kZXggYjc0M2E4MC4uOTg1ZTA2ZCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3BhY2FjaGUuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvcGFjYWNoZS5TCkBAIC00MSw3ICs0MSw3IEBACiAJLnRleHQKIAkuYWxpZ24JMTI4CiAKLUVOVFJZKGZsdXNoX3RsYl9hbGxfbG9jYWwpCitFTlRSWV9DRkkoZmx1c2hfdGxiX2FsbF9sb2NhbCkKIAkucHJvYwogCS5jYWxsaW5mbyBOT19DQUxMUwogCS5lbnRyeQpAQCAtMTkwLDExICsxOTAsMTEgQEAKIAogCS5leGl0CiAJLnByb2NlbmQKLUVORFBST0MoZmx1c2hfdGxiX2FsbF9sb2NhbCkKK0VORFBST0NfQ0ZJKGZsdXNoX3RsYl9hbGxfbG9jYWwpCiAKIAkuaW1wb3J0IGNhY2hlX2luZm8sZGF0YQogCi1FTlRSWShmbHVzaF9pbnN0cnVjdGlvbl9jYWNoZV9sb2NhbCkKK0VOVFJZX0NGSShmbHVzaF9pbnN0cnVjdGlvbl9jYWNoZV9sb2NhbCkKIAkucHJvYwogCS5jYWxsaW5mbyBOT19DQUxMUwogCS5lbnRyeQpAQCAtMjU3LDExICsyNTcsMTEgQEAKIAkuZXhpdAogCiAJLnByb2NlbmQKLUVORFBST0MoZmx1c2hfaW5zdHJ1Y3Rpb25fY2FjaGVfbG9jYWwpCitFTkRQUk9DX0NGSShmbHVzaF9pbnN0cnVjdGlvbl9jYWNoZV9sb2NhbCkKIAogCiAJLmltcG9ydCBjYWNoZV9pbmZvLCBkYXRhCi1FTlRSWShmbHVzaF9kYXRhX2NhY2hlX2xvY2FsKQorRU5UUllfQ0ZJKGZsdXNoX2RhdGFfY2FjaGVfbG9jYWwpCiAJLnByb2MKIAkuY2FsbGluZm8gTk9fQ0FMTFMKIAkuZW50cnkKQEAgLTMyNSw3ICszMjUsNyBAQAogCS5leGl0CiAKIAkucHJvY2VuZAotRU5EUFJPQyhmbHVzaF9kYXRhX2NhY2hlX2xvY2FsKQorRU5EUFJPQ19DRkkoZmx1c2hfZGF0YV9jYWNoZV9sb2NhbCkKIAogCS5hbGlnbgkxNgogCkBAIC0zNTYsNyArMzU2LDcgQEAKIAogLyogQ2xlYXIgcGFnZSB1c2luZyBrZXJuZWwgbWFwcGluZy4gICovCiAKLUVOVFJZKGNsZWFyX3BhZ2VfYXNtKQorRU5UUllfQ0ZJKGNsZWFyX3BhZ2VfYXNtKQogCS5wcm9jCiAJLmNhbGxpbmZvIE5PX0NBTExTCiAJLmVudHJ5CkBAIC00MjIsMTEgKzQyMiwxMSBAQAogCS5leGl0CiAKIAkucHJvY2VuZAotRU5EUFJPQyhjbGVhcl9wYWdlX2FzbSkKK0VORFBST0NfQ0ZJKGNsZWFyX3BhZ2VfYXNtKQogCiAvKiBDb3B5IHBhZ2UgdXNpbmcga2VybmVsIG1hcHBpbmcuICAqLwogCi1FTlRSWShjb3B5X3BhZ2VfYXNtKQorRU5UUllfQ0ZJKGNvcHlfcGFnZV9hc20pCiAJLnByb2MKIAkuY2FsbGluZm8gTk9fQ0FMTFMKIAkuZW50cnkKQEAgLTU0MCw3ICs1NDAsNyBAQAogCS5leGl0CiAKIAkucHJvY2VuZAotRU5EUFJPQyhjb3B5X3BhZ2VfYXNtKQorRU5EUFJPQ19DRkkoY29weV9wYWdlX2FzbSkKIAogLyoKICAqIE5PVEU6IENvZGUgaW4gY2xlYXJfdXNlcl9wYWdlIGhhcyBhIGhhcmQgY29kZWQgZGVwZW5kZW5jeSBvbiB0aGUKQEAgLTU3MywxMSArNTczLDE3IEBACiAJLmVuZG0KIAogCS8qCi0JICogV2UgY2FuJ3QgZG8gdGhpcyBzaW5jZSBjb3B5X3VzZXJfcGFnZSBpcyB1c2VkIHRvIGJyaW5nIGluCi0JICogZmlsZSBkYXRhIHRoYXQgbWlnaHQgaGF2ZSBpbnN0cnVjdGlvbnMuIFNpbmNlIHRoZSBkYXRhIHdvdWxkCi0JICogdGhlbiBuZWVkIHRvIGJlIGZsdXNoZWQgb3V0IHNvIHRoZSBpLWZldGNoIGNhbiBzZWUgaXQsIGl0Ci0JICogbWFrZXMgbW9yZSBzZW5zZSB0byBqdXN0IGNvcHkgdGhyb3VnaCB0aGUga2VybmVsIHRyYW5zbGF0aW9uCi0JICogYW5kIGZsdXNoIGl0LgorCSAqIGNvcHlfdXNlcl9wYWdlX2FzbSgpIHBlcmZvcm1zIGEgcGFnZSBjb3B5IHVzaW5nIG1hcHBpbmdzCisJICogZXF1aXZhbGVudCB0byB0aGUgdXNlciBwYWdlIG1hcHBpbmdzLiAgSXQgY2FuIGJlIHVzZWQgdG8KKwkgKiBpbXBsZW1lbnQgY29weV91c2VyX3BhZ2UoKSBidXQgdW5mb3J0dW5hdGVseSBib3RoIHRoZSBgZnJvbScKKwkgKiBhbmQgYHRvJyBwYWdlcyBuZWVkIHRvIGJlIGZsdXNoZWQgdGhyb3VnaCBtYXBwaW5ncyBlcXVpdmFsZW50CisJICogdG8gdGhlIHVzZXIgbWFwcGluZ3MgYWZ0ZXIgdGhlIGNvcHkgYmVjYXVzZSB0aGUga2VybmVsIGFjY2Vzc2VzCisJICogdGhlIGBmcm9tJyBwYWdlIHRocm91Z2ggdGhlIGttYXAga2VybmVsIG1hcHBpbmcgYW5kIHRoZSBgdG8nCisJICogcGFnZSBuZWVkcyB0byBiZSBmbHVzaGVkIHNpbmNlIGNvZGUgY2FuIGJlIGNvcGllZC4gIEFzIGEKKwkgKiByZXN1bHQsIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbGVzcyBlZmZpY2llbnQgdGhhbiB0aGUgc2ltcGxlcgorCSAqIGNvcHkgdXNpbmcgdGhlIGtlcm5lbCBtYXBwaW5nLiAgSXQgb25seSBuZWVkcyB0aGUgYGZyb20nIHBhZ2UKKwkgKiB0byBmbHVzaGVkIHZpYSB0aGUgdXNlciBtYXBwaW5nLiAgVGhlIGt1bm1hcCByb3V0aW5lcyBoYW5kbGUKKwkgKiB0aGUgZmx1c2hlcyBuZWVkZWQgZm9yIHRoZSBrZXJuZWwgbWFwcGluZy4KIAkgKgogCSAqIEknbSBzdGlsbCBrZWVwaW5nIHRoaXMgYXJvdW5kIGJlY2F1c2UgaXQgbWF5IGJlIHBvc3NpYmxlIHRvCiAJICogdXNlIGl0IGlmIG1vcmUgaW5mb3JtYXRpb24gaXMgcGFzc2VkIGludG8gY29weV91c2VyX3BhZ2UoKS4KQEAgLTU4Niw3ICs1OTIsNyBAQAogCSAqCiAJICovCiAKLUVOVFJZKGNvcHlfdXNlcl9wYWdlX2FzbSkKK0VOVFJZX0NGSShjb3B5X3VzZXJfcGFnZV9hc20pCiAJLnByb2MKIAkuY2FsbGluZm8gTk9fQ0FMTFMKIAkuZW50cnkKQEAgLTc0Miw5ICs3NDgsOSBAQAogCS5leGl0CiAKIAkucHJvY2VuZAotRU5EUFJPQyhjb3B5X3VzZXJfcGFnZV9hc20pCitFTkRQUk9DX0NGSShjb3B5X3VzZXJfcGFnZV9hc20pCiAKLUVOVFJZKGNsZWFyX3VzZXJfcGFnZV9hc20pCitFTlRSWV9DRkkoY2xlYXJfdXNlcl9wYWdlX2FzbSkKIAkucHJvYwogCS5jYWxsaW5mbyBOT19DQUxMUwogCS5lbnRyeQpAQCAtODI4LDkgKzgzNCw5IEBACiAJLmV4aXQKIAogCS5wcm9jZW5kCi1FTkRQUk9DKGNsZWFyX3VzZXJfcGFnZV9hc20pCitFTkRQUk9DX0NGSShjbGVhcl91c2VyX3BhZ2VfYXNtKQogCi1FTlRSWShmbHVzaF9kY2FjaGVfcGFnZV9hc20pCitFTlRSWV9DRkkoZmx1c2hfZGNhY2hlX3BhZ2VfYXNtKQogCS5wcm9jCiAJLmNhbGxpbmZvIE5PX0NBTExTCiAJLmVudHJ5CkBAIC05MDQsOSArOTEwLDkgQEAKIAkuZXhpdAogCiAJLnByb2NlbmQKLUVORFBST0MoZmx1c2hfZGNhY2hlX3BhZ2VfYXNtKQorRU5EUFJPQ19DRkkoZmx1c2hfZGNhY2hlX3BhZ2VfYXNtKQogCi1FTlRSWShmbHVzaF9pY2FjaGVfcGFnZV9hc20pCitFTlRSWV9DRkkoZmx1c2hfaWNhY2hlX3BhZ2VfYXNtKQogCS5wcm9jCiAJLmNhbGxpbmZvIE5PX0NBTExTCiAJLmVudHJ5CkBAIC05ODIsOSArOTg4LDkgQEAKIAkuZXhpdAogCiAJLnByb2NlbmQKLUVORFBST0MoZmx1c2hfaWNhY2hlX3BhZ2VfYXNtKQorRU5EUFJPQ19DRkkoZmx1c2hfaWNhY2hlX3BhZ2VfYXNtKQogCi1FTlRSWShmbHVzaF9rZXJuZWxfZGNhY2hlX3BhZ2VfYXNtKQorRU5UUllfQ0ZJKGZsdXNoX2tlcm5lbF9kY2FjaGVfcGFnZV9hc20pCiAJLnByb2MKIAkuY2FsbGluZm8gTk9fQ0FMTFMKIAkuZW50cnkKQEAgLTEwMjUsOSArMTAzMSw5IEBACiAJLmV4aXQKIAogCS5wcm9jZW5kCi1FTkRQUk9DKGZsdXNoX2tlcm5lbF9kY2FjaGVfcGFnZV9hc20pCitFTkRQUk9DX0NGSShmbHVzaF9rZXJuZWxfZGNhY2hlX3BhZ2VfYXNtKQogCi1FTlRSWShwdXJnZV9rZXJuZWxfZGNhY2hlX3BhZ2VfYXNtKQorRU5UUllfQ0ZJKHB1cmdlX2tlcm5lbF9kY2FjaGVfcGFnZV9hc20pCiAJLnByb2MKIAkuY2FsbGluZm8gTk9fQ0FMTFMKIAkuZW50cnkKQEAgLTEwNjcsOSArMTA3Myw5IEBACiAJLmV4aXQKIAogCS5wcm9jZW5kCi1FTkRQUk9DKHB1cmdlX2tlcm5lbF9kY2FjaGVfcGFnZV9hc20pCitFTkRQUk9DX0NGSShwdXJnZV9rZXJuZWxfZGNhY2hlX3BhZ2VfYXNtKQogCi1FTlRSWShmbHVzaF91c2VyX2RjYWNoZV9yYW5nZV9hc20pCitFTlRSWV9DRkkoZmx1c2hfdXNlcl9kY2FjaGVfcmFuZ2VfYXNtKQogCS5wcm9jCiAJLmNhbGxpbmZvIE5PX0NBTExTCiAJLmVudHJ5CkBAIC0xMDg4LDkgKzEwOTQsOSBAQAogCS5leGl0CiAKIAkucHJvY2VuZAotRU5EUFJPQyhmbHVzaF91c2VyX2RjYWNoZV9yYW5nZV9hc20pCitFTkRQUk9DX0NGSShmbHVzaF91c2VyX2RjYWNoZV9yYW5nZV9hc20pCiAKLUVOVFJZKGZsdXNoX2tlcm5lbF9kY2FjaGVfcmFuZ2VfYXNtKQorRU5UUllfQ0ZJKGZsdXNoX2tlcm5lbF9kY2FjaGVfcmFuZ2VfYXNtKQogCS5wcm9jCiAJLmNhbGxpbmZvIE5PX0NBTExTCiAJLmVudHJ5CkBAIC0xMTEwLDkgKzExMTYsOSBAQAogCS5leGl0CiAKIAkucHJvY2VuZAotRU5EUFJPQyhmbHVzaF9rZXJuZWxfZGNhY2hlX3JhbmdlX2FzbSkKK0VORFBST0NfQ0ZJKGZsdXNoX2tlcm5lbF9kY2FjaGVfcmFuZ2VfYXNtKQogCi1FTlRSWShmbHVzaF91c2VyX2ljYWNoZV9yYW5nZV9hc20pCitFTlRSWV9DRkkoZmx1c2hfdXNlcl9pY2FjaGVfcmFuZ2VfYXNtKQogCS5wcm9jCiAJLmNhbGxpbmZvIE5PX0NBTExTCiAJLmVudHJ5CkBAIC0xMTMxLDkgKzExMzcsOSBAQAogCS5leGl0CiAKIAkucHJvY2VuZAotRU5EUFJPQyhmbHVzaF91c2VyX2ljYWNoZV9yYW5nZV9hc20pCitFTkRQUk9DX0NGSShmbHVzaF91c2VyX2ljYWNoZV9yYW5nZV9hc20pCiAKLUVOVFJZKGZsdXNoX2tlcm5lbF9pY2FjaGVfcGFnZSkKK0VOVFJZX0NGSShmbHVzaF9rZXJuZWxfaWNhY2hlX3BhZ2UpCiAJLnByb2MKIAkuY2FsbGluZm8gTk9fQ0FMTFMKIAkuZW50cnkKQEAgLTExNzQsOSArMTE4MCw5IEBACiAJLmV4aXQKIAogCS5wcm9jZW5kCi1FTkRQUk9DKGZsdXNoX2tlcm5lbF9pY2FjaGVfcGFnZSkKK0VORFBST0NfQ0ZJKGZsdXNoX2tlcm5lbF9pY2FjaGVfcGFnZSkKIAotRU5UUlkoZmx1c2hfa2VybmVsX2ljYWNoZV9yYW5nZV9hc20pCitFTlRSWV9DRkkoZmx1c2hfa2VybmVsX2ljYWNoZV9yYW5nZV9hc20pCiAJLnByb2MKIAkuY2FsbGluZm8gTk9fQ0FMTFMKIAkuZW50cnkKQEAgLTExOTQsMTMgKzEyMDAsMTMgQEAKIAlub3AKIAkuZXhpdAogCS5wcm9jZW5kCi1FTkRQUk9DKGZsdXNoX2tlcm5lbF9pY2FjaGVfcmFuZ2VfYXNtKQorRU5EUFJPQ19DRkkoZmx1c2hfa2VybmVsX2ljYWNoZV9yYW5nZV9hc20pCiAKIAkvKiBhbGlnbiBzaG91bGQgY292ZXIgdXNlIG9mIHJmaSBpbiBkaXNhYmxlX3NyX2hhc2hpbmdfYXNtIGFuZAogCSAqIHNyZGlzX2RvbmUuCiAJICovCiAJLmFsaWduCTI1NgotRU5UUlkoZGlzYWJsZV9zcl9oYXNoaW5nX2FzbSkKK0VOVFJZX0NGSShkaXNhYmxlX3NyX2hhc2hpbmdfYXNtKQogCS5wcm9jCiAJLmNhbGxpbmZvIE5PX0NBTExTCiAJLmVudHJ5CkBAIC0xMjg5LDYgKzEyOTUsNiBAQAogCS5leGl0CiAKIAkucHJvY2VuZAotRU5EUFJPQyhkaXNhYmxlX3NyX2hhc2hpbmdfYXNtKQorRU5EUFJPQ19DRkkoZGlzYWJsZV9zcl9oYXNoaW5nX2FzbSkKIAogCS5lbmQKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9yZWFsMi5TIGIvYXJjaC9wYXJpc2Mva2VybmVsL3JlYWwyLlMKaW5kZXggNWYzZDNhMS4uMWRiNThlNSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3JlYWwyLlMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3JlYWwyLlMKQEAgLTYxLDcgKzYxLDcgQEAKIAkgKglpb2RjX2ZuIGlzIHRoZSBJT0RDIGZ1bmN0aW9uIHRvIGNhbGwKIAkgKi8KIAotRU5UUlkocmVhbDMyX2NhbGxfYXNtKQorRU5UUllfQ0ZJKHJlYWwzMl9jYWxsX2FzbSkKIAlTVFJFRwklcnAsIC1SUF9PRkZTRVQoJXNwKQkvKiBzYXZlIFJQICovCiAjaWZkZWYgQ09ORklHXzY0QklUCiAJY2FsbGVlX3NhdmUKQEAgLTExOSwxNCArMTE5LDE0IEBACiAJTERSRUcJLVJQX09GRlNFVCglc3ApLCAlcnAJLyogcmVzdG9yZSBSUCAqLwogCWJ2CTAoJXJwKQogCW5vcAotRU5EUFJPQyhyZWFsMzJfY2FsbF9hc20pCitFTkRQUk9DX0NGSShyZWFsMzJfY2FsbF9hc20pCiAKIAogIyAgZGVmaW5lIFBVU0hfQ1Iociwgd2hlcmUpIG1mY3RsIHIsICVyMSAhIFNUUkVHLG1hICVyMSwgUkVHX1NaKHdoZXJlKQogIyAgZGVmaW5lIFBPUF9DUihyLCB3aGVyZSkgTERSRUcsbWIgLVJFR19TWih3aGVyZSksICVyMSAhIG10Y3RsICVyMSwgcgogCiAJLnRleHQKLXNhdmVfY29udHJvbF9yZWdzOgorRU5UUllfQ0ZJKHNhdmVfY29udHJvbF9yZWdzKQogCWxvYWQzMglQQShzYXZlX2NyX3NwYWNlKSwgJXIyOAogCVBVU0hfQ1IoJWNyMjQsICVyMjgpCiAJUFVTSF9DUiglY3IyNSwgJXIyOCkKQEAgLTEzOSw4ICsxMzksOSBAQAogCVBVU0hfQ1IoJWNyMTUsICVyMjgpCiAJYnYgMCglcjIpCiAJbm9wCitFTkRQUk9DX0NGSShzYXZlX2NvbnRyb2xfcmVncykKIAotcmVzdG9yZV9jb250cm9sX3JlZ3M6CitFTlRSWV9DRkkocmVzdG9yZV9jb250cm9sX3JlZ3MpCiAJbG9hZDMyCVBBKHNhdmVfY3JfZW5kKSwgJXIyNgogCVBPUF9DUiglY3IxNSwgJXIyNikKIAlQT1BfQ1IoJWNyMzEsICVyMjYpCkBAIC0xNTMsMTMgKzE1NCwxNCBAQAogCVBPUF9DUiglY3IyNCwgJXIyNikKIAlidiAwKCVyMikKIAlub3AKK0VORFBST0NfQ0ZJKHJlc3RvcmVfY29udHJvbF9yZWdzKQogCiAvKiByZmlfdmlydDJyZWFsKCkgYW5kIHJmaV9yZWFsMnZpcnQoKSBjb3VsZCBwZXJoYXBzIGJlIGFkYXB0ZWQgZm9yCiAgKiBtb3JlIGdlbmVyYWwtcHVycG9zZSB1c2UgYnkgdGhlIHNldmVyYWwgcGxhY2VzIHdoaWNoIG5lZWQgUkZJcwogICovCiAJLnRleHQKIAkuYWxpZ24gMTI4Ci1yZmlfdmlydDJyZWFsOgorRU5UUllfQ0ZJKHJmaV92aXJ0MnJlYWwpCiAJLyogc3dpdGNoIHRvIHJlYWwgbW9kZS4uLiAqLwogCXJzbQkJUFNXX1NNX0ksJXIwCiAJbG9hZDMyCQlQQShyZmlfdjJyXzEpLCAlcjEKQEAgLTE5MSwxMCArMTkzLDExIEBACiAJdG9waHlzX3IxICVyMgogCWJ2CTAoJXIyKQogCW5vcAorRU5EUFJPQ19DRkkocmZpX3ZpcnQycmVhbCkKIAogCS50ZXh0CiAJLmFsaWduIDEyOAotcmZpX3JlYWwydmlydDoKK0VOVFJZX0NGSShyZmlfcmVhbDJ2aXJ0KQogCXJzbQkJUFNXX1NNX0ksJXIwCiAJbG9hZDMyCQkocmZpX3Iydl8xKSwgJXIxCiAJbm9wCkBAIC0yMjUsNiArMjI4LDcgQEAKIAl0b3ZpcnRfcjEgJXIyCiAJYnYJMCglcjIpCiAJbm9wCitFTkRQUk9DX0NGSShyZmlfcmVhbDJ2aXJ0KQogCiAjaWZkZWYgQ09ORklHXzY0QklUCiAKQEAgLTIzOCw3ICsyNDIsNyBAQAogCSAqCWFyZzBwIHBvaW50cyB0byB3aGVyZSBzYXZlZCBhcmcgdmFsdWVzIG1heSBiZSBmb3VuZAogCSAqCWlvZGNfZm4gaXMgdGhlIElPREMgZnVuY3Rpb24gdG8gY2FsbAogCSAqLwotRU5UUlkocmVhbDY0X2NhbGxfYXNtKQorRU5UUllfQ0ZJKHJlYWw2NF9jYWxsX2FzbSkKIAlzdGQJJXJwLCAtMHgxMCglc3ApCQkvKiBzYXZlIFJQICovCiAJc3RkCSVzcCwgLTgoJWFyZzApCQkvKiBzYXZlIFNQIG9uIHJlYWwtbW9kZSBzdGFjayAqLwogCWNvcHkJJWFyZzAsICVzcAkJLyogYWRvcHQgdGhlIHJlYWwtbW9kZSBTUCAqLwpAQCAtMjg0LDcgKzI4OCw3IEBACiAJbGRkCS0weDEwKCVzcCksICVycAkJLyogcmVzdG9yZSBSUCAqLwogCWJ2CTAoJXJwKQogCW5vcAotRU5EUFJPQyhyZWFsNjRfY2FsbF9hc20pCitFTkRQUk9DX0NGSShyZWFsNjRfY2FsbF9hc20pCiAKICNlbmRpZgogCkBAIC0yOTMsMTIgKzI5NywxMiBAQAogCSoqCUdDQyAzLjMgYW5kIGxhdGVyIGhhcyBhIG5ldyBmdW5jdGlvbiBpbiBsaWJnY2MuYSBmb3IKIAkqKgljb21wYXJpbmcgZnVuY3Rpb24gcG9pbnRlcnMuCiAJKi8KLUVOVFJZKF9fY2Fub25pY2FsaXplX2Z1bmNwdHJfZm9yX2NvbXBhcmUpCitFTlRSWV9DRkkoX19jYW5vbmljYWxpemVfZnVuY3B0cl9mb3JfY29tcGFyZSkKICNpZmRlZiBDT05GSUdfNjRCSVQKIAlidmUgKCVyMikKICNlbHNlCiAJYnYgJXIwKCVyMikKICNlbmRpZgogCWNvcHkgJXIyNiwlcjI4Ci1FTkRQUk9DKF9fY2Fub25pY2FsaXplX2Z1bmNwdHJfZm9yX2NvbXBhcmUpCitFTkRQUk9DX0NGSShfX2Nhbm9uaWNhbGl6ZV9mdW5jcHRyX2Zvcl9jb21wYXJlKQogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCmluZGV4IGY3ZWE2MjYuLjgxZDZmNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zZXR1cC5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL3BkYy5oPgogI2luY2x1ZGUgPGFzbS9sZWQuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgkvKiBmb3IgcGE3MzAwbGNfaW5pdCgpIHByb3RvICovCkBAIC0xNDAsNiArMTQxLDEzIEBACiAjZW5kaWYKIAlwcmludGsoS0VSTl9DT05UICIuXG4iKTsKIAorCS8qCisJICogQ2hlY2sgaWYgaW5pdGlhbCBrZXJuZWwgcGFnZSBtYXBwaW5ncyBhcmUgc3VmZmljaWVudC4KKwkgKiBwYW5pYyBlYXJseSBpZiBub3QsIGVsc2Ugd2UgbWF5IGFjY2VzcyBrZXJuZWwgZnVuY3Rpb25zCisJICogYW5kIHZhcmlhYmxlcyB3aGljaCBjYW4ndCBiZSByZWFjaGVkLgorCSAqLworCWlmIChfX3BhKCh1bnNpZ25lZCBsb25nKSAmX2VuZCkgPj0gS0VSTkVMX0lOSVRJQUxfU0laRSkKKwkJcGFuaWMoIktFUk5FTF9JTklUSUFMX09SREVSIHRvbyBzbWFsbCEiKTsKIAogCXBkY19jb25zb2xlX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3NtcC5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3NtcC5jCmluZGV4IGMyYTljYzUuLjc1ZGFiMjggMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc21wLmMKQEAgLTQxMiw4ICs0MTIsOCBAQAogCiBpbnQgX19jcHVfdXAodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICp0aWRsZSkKIHsKLQlpZiAoY3B1ICE9IDAgJiYgY3B1IDwgcGFyaXNjX21heF9jcHVzKQotCQlzbXBfYm9vdF9vbmVfY3B1KGNwdSwgdGlkbGUpOworCWlmIChjcHUgIT0gMCAmJiBjcHUgPCBwYXJpc2NfbWF4X2NwdXMgJiYgc21wX2Jvb3Rfb25lX2NwdShjcHUsIHRpZGxlKSkKKwkJcmV0dXJuIC1FTk9TWVM7CiAKIAlyZXR1cm4gY3B1X29ubGluZShjcHUpID8gMCA6IC1FTk9TWVM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL3RpbWUuYwppbmRleCA0YjBiOTYzLi45YjYzYjg3IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC90aW1lLmMKQEAgLTIyNiwxMiArMjI2LDYgQEAKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXVuc2lnbmVkIGxvbmcgbmV4dF90aWNrID0gbWZjdGwoMTYpICsgY2xvY2t0aWNrOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSEFWRV9VTlNUQUJMRV9TQ0hFRF9DTE9DSykgJiYgZGVmaW5lZChDT05GSUdfNjRCSVQpCi0JLyogV2l0aCBtdWx0aXBsZSA2NGJpdCBDUFVzIG9ubGluZSwgdGhlIGNyMTYncyBhcmUgbm90IHN5bmNyb25pemVkLiAqLwotCWlmIChjcHUgIT0gMCkKLQkJY2xlYXJfc2NoZWRfY2xvY2tfc3RhYmxlKCk7Ci0jZW5kaWYKLQogCW10Y3RsKG5leHRfdGljaywgMTYpOwkJLyoga2ljayBvZmYgSW50ZXJ2YWwgVGltZXIgKENSMTYpICovCiAKIAlwZXJfY3B1KGNwdV9kYXRhLCBjcHUpLml0X3ZhbHVlID0gbmV4dF90aWNrOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBmM2VhZDBiLi41YjhmYWU4IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTM4LDggKzEzOCw2IEBACiAJLyogQlNTICovCiAJQlNTX1NFQ1RJT04oUEFHRV9TSVpFLCBQQUdFX1NJWkUsIFBBR0VfU0laRSkKIAotCS8qIGJvb3RtYXAgaXMgYWxsb2NhdGVkIGluIHNldHVwX2Jvb3RtZW0oKSBkaXJlY3RseSBiZWhpbmQgYnNzLiAqLwotCiAJLiA9IEFMSUdOKEhVR0VQQUdFX1NJWkUpOwogCV9lbmQgPSAuIDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbGliL2ZpeHVwLlMgYi9hcmNoL3BhcmlzYy9saWIvZml4dXAuUwppbmRleCAxMDUyYjc0Li5hNWI3MmYyIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9saWIvZml4dXAuUworKysgYi9hcmNoL3BhcmlzYy9saWIvZml4dXAuUwpAQCAtNjUsMzQgKzY1LDM0IEBACiAJLnNlY3Rpb24gLmZpeHVwLCAiYXgiCiAKIAkvKiBnZXRfdXNlcigpIGZpeHVwcywgc3RvcmUgLUVGQVVMVCBpbiByOCwgYW5kIDAgaW4gcjkgKi8KLUVOVFJZKGZpeHVwX2dldF91c2VyX3NraXBfMSkKK0VOVFJZX0NGSShmaXh1cF9nZXRfdXNlcl9za2lwXzEpCiAJZ2V0X2ZhdWx0X2lwICVyMSwlcjgKIAlsZG8gNCglcjEpLCAlcjEKIAlsZGkgLUVGQVVMVCwgJXI4CiAJYnYgJXIwKCVyMSkKIAljb3B5ICVyMCwgJXI5Ci1FTkRQUk9DKGZpeHVwX2dldF91c2VyX3NraXBfMSkKK0VORFBST0NfQ0ZJKGZpeHVwX2dldF91c2VyX3NraXBfMSkKIAotRU5UUlkoZml4dXBfZ2V0X3VzZXJfc2tpcF8yKQorRU5UUllfQ0ZJKGZpeHVwX2dldF91c2VyX3NraXBfMikKIAlnZXRfZmF1bHRfaXAgJXIxLCVyOAogCWxkbyA4KCVyMSksICVyMQogCWxkaSAtRUZBVUxULCAlcjgKIAlidiAlcjAoJXIxKQogCWNvcHkgJXIwLCAlcjkKLUVORFBST0MoZml4dXBfZ2V0X3VzZXJfc2tpcF8yKQorRU5EUFJPQ19DRkkoZml4dXBfZ2V0X3VzZXJfc2tpcF8yKQogCiAJLyogcHV0X3VzZXIoKSBmaXh1cHMsIHN0b3JlIC1FRkFVTFQgaW4gcjggKi8KLUVOVFJZKGZpeHVwX3B1dF91c2VyX3NraXBfMSkKK0VOVFJZX0NGSShmaXh1cF9wdXRfdXNlcl9za2lwXzEpCiAJZ2V0X2ZhdWx0X2lwICVyMSwlcjgKIAlsZG8gNCglcjEpLCAlcjEKIAlidiAlcjAoJXIxKQogCWxkaSAtRUZBVUxULCAlcjgKLUVORFBST0MoZml4dXBfcHV0X3VzZXJfc2tpcF8xKQorRU5EUFJPQ19DRkkoZml4dXBfcHV0X3VzZXJfc2tpcF8xKQogCi1FTlRSWShmaXh1cF9wdXRfdXNlcl9za2lwXzIpCitFTlRSWV9DRkkoZml4dXBfcHV0X3VzZXJfc2tpcF8yKQogCWdldF9mYXVsdF9pcCAlcjEsJXI4CiAJbGRvIDgoJXIxKSwgJXIxCiAJYnYgJXIwKCVyMSkKIAlsZGkgLUVGQVVMVCwgJXI4Ci1FTkRQUk9DKGZpeHVwX3B1dF91c2VyX3NraXBfMikKK0VORFBST0NfQ0ZJKGZpeHVwX3B1dF91c2VyX3NraXBfMikKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbGliL2x1c2VyY29weS5TIGIvYXJjaC9wYXJpc2MvbGliL2x1c2VyY29weS5TCmluZGV4IGE1MTJmMDcuLjU2ODQ1ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2xpYi9sdXNlcmNvcHkuUworKysgYi9hcmNoL3BhcmlzYy9saWIvbHVzZXJjb3B5LlMKQEAgLTY3LDcgKzY3LDcgQEAKIAkgKiBvdGhlcndpc2UsIHJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIG5vdCB0cmFuc2ZlcnJlZC4KIAkgKi8KIAotRU5UUlkobGNsZWFyX3VzZXIpCitFTlRSWV9DRkkobGNsZWFyX3VzZXIpCiAJLnByb2MKIAkuY2FsbGluZm8gTk9fQ0FMTFMKIAkuZW50cnkKQEAgLTgxLDcgKzgxLDcgQEAKIAlidiAgICAgICAgICAlcjAoJXIyKQogCWNvcHkgICAgICAgICVyMjUsJXIyOAogCS5leGl0Ci1FTkRQUk9DKGxjbGVhcl91c2VyKQorRU5EUFJPQ19DRkkobGNsZWFyX3VzZXIpCiAKIAkuc2VjdGlvbiAuZml4dXAsImF4IgogMjogICAgICBmaXh1cF9icmFuY2ggJGxjbHVfZG9uZQpAQCAtMTAwLDcgKzEwMCw3IEBACiAJICogICAgICAgICBlbHNlIHN0cmxlbiArIDEgKGkuZS4gaW5jbHVkZXMgemVybyBieXRlKS4KIAkgKi8KIAotRU5UUlkobHN0cm5sZW5fdXNlcikKK0VOVFJZX0NGSShsc3Rybmxlbl91c2VyKQogCS5wcm9jCiAJLmNhbGxpbmZvIE5PX0NBTExTCiAJLmVudHJ5CkBAIC0xMjAsNyArMTIwLDcgQEAKICRsc2xlbl9uemVybzoKIAliICAgICAgICAgICAkbHNsZW5fZG9uZQogCWxkbyAgICAgICAgIDEoJXIyNiksJXIyNiAvKiBzcGVjaWFsIGNhc2UgZm9yIE4gPT0gMCAqLwotRU5EUFJPQyhsc3Rybmxlbl91c2VyKQorRU5EUFJPQ19DRkkobHN0cm5sZW5fdXNlcikKIAogCS5zZWN0aW9uIC5maXh1cCwiYXgiCiAzOiAgICAgIGZpeHVwX2JyYW5jaCAkbHNsZW5fZG9uZQpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvbGliL21lbWNweS5jIGIvYXJjaC9wYXJpc2MvbGliL21lbWNweS5jCmluZGV4IGIyYjQ0MWIuLmY4MmZmMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2xpYi9tZW1jcHkuYworKysgYi9hcmNoL3BhcmlzYy9saWIvbWVtY3B5LmMKQEAgLTQ4OSwyMCArNDg5LDIzIEBACiB9CiAKICNpZmRlZiBfX0tFUk5FTF9fCi11bnNpZ25lZCBsb25nIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgbGVuKQordW5zaWduZWQgbG9uZyBfX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqZHN0LCBjb25zdCB2b2lkICpzcmMsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCW10c3AoZ2V0X2tlcm5lbF9zcGFjZSgpLCAxKTsKIAltdHNwKGdldF91c2VyX3NwYWNlKCksIDIpOwogCXJldHVybiBwYV9tZW1jcHkoKHZvaWQgX19mb3JjZSAqKWRzdCwgc3JjLCBsZW4pOwogfQorRVhQT1JUX1NZTUJPTChfX2NvcHlfdG9fdXNlcik7CiAKLUVYUE9SVF9TWU1CT0woX19jb3B5X2Zyb21fdXNlcik7Ci11bnNpZ25lZCBsb25nIF9fY29weV9mcm9tX3VzZXIodm9pZCAqZHN0LCBjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBsb25nIGxlbikKK3Vuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcih2b2lkICpkc3QsIGNvbnN0IHZvaWQgX191c2VyICpzcmMsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJbXRzcChnZXRfdXNlcl9zcGFjZSgpLCAxKTsKIAltdHNwKGdldF9rZXJuZWxfc3BhY2UoKSwgMik7CiAJcmV0dXJuIHBhX21lbWNweShkc3QsICh2b2lkIF9fZm9yY2UgKilzcmMsIGxlbik7CiB9CitFWFBPUlRfU1lNQk9MKF9fY29weV9mcm9tX3VzZXIpOwogCiB1bnNpZ25lZCBsb25nIGNvcHlfaW5fdXNlcih2b2lkIF9fdXNlciAqZHN0LCBjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKQEAgLTUyMCw4ICs1MjMsNiBAQAogCXJldHVybiBkc3Q7CiB9CiAKLUVYUE9SVF9TWU1CT0woY29weV90b191c2VyKTsKLUVYUE9SVF9TWU1CT0woY29weV9mcm9tX3VzZXIpOwogRVhQT1JUX1NZTUJPTChjb3B5X2luX3VzZXIpOwogRVhQT1JUX1NZTUJPTChtZW1jcHkpOwogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9tbS9mYXVsdC5jIGIvYXJjaC9wYXJpc2MvbW0vZmF1bHQuYwppbmRleCAxNjNhZjJjLi40N2E2Y2E0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvcGFyaXNjL21tL2ZhdWx0LmMKQEAgLTE2OCw2ICsxNjgsNDMgQEAKIH0KIAogLyoKKyAqIHBhcmlzYyBoYXJkd2FyZSB0cmFwIGxpc3QKKyAqCisgKiBEb2N1bWVudGVkIGluIHNlY3Rpb24gMyAiQWRkcmVzc2luZyBhbmQgQWNjZXNzIENvbnRyb2wiIG9mIHRoZQorICogIlBBLVJJU0MgMS4xIEFyY2hpdGVjdHVyZSBhbmQgSW5zdHJ1Y3Rpb24gU2V0IFJlZmVyZW5jZSBNYW51YWwiCisgKiBodHRwczovL3BhcmlzYy53aWtpLmtlcm5lbC5vcmcvaW5kZXgucGhwL0ZpbGU6UGExMV9hY2QucGRmCisgKgorICogRm9yIGltcGxlbWVudGF0aW9uIHNlZSBoYW5kbGVfaW50ZXJydXB0aW9uKCkgaW4gdHJhcHMuYworICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRyYXBfZGVzY3JpcHRpb25bXSA9IHsKKwlbMV0gIkhpZ2gtcHJpb3JpdHkgbWFjaGluZSBjaGVjayAoSFBNQykiLAorCVsyXSAiUG93ZXIgZmFpbHVyZSBpbnRlcnJ1cHQiLAorCVszXSAiUmVjb3ZlcnkgY291bnRlciB0cmFwIiwKKwlbNV0gIkxvdy1wcmlvcml0eSBtYWNoaW5lIGNoZWNrIiwKKwlbNl0gIkluc3RydWN0aW9uIFRMQiBtaXNzIGZhdWx0IiwKKwlbN10gIkluc3RydWN0aW9uIGFjY2VzcyByaWdodHMgLyBwcm90ZWN0aW9uIHRyYXAiLAorCVs4XSAiSWxsZWdhbCBpbnN0cnVjdGlvbiB0cmFwIiwKKwlbOV0gIkJyZWFrIGluc3RydWN0aW9uIHRyYXAiLAorCVsxMF0gIlByaXZpbGVnZWQgb3BlcmF0aW9uIHRyYXAiLAorCVsxMV0gIlByaXZpbGVnZWQgcmVnaXN0ZXIgdHJhcCIsCisJWzEyXSAiT3ZlcmZsb3cgdHJhcCIsCisJWzEzXSAiQ29uZGl0aW9uYWwgdHJhcCIsCisJWzE0XSAiRlAgQXNzaXN0IEV4Y2VwdGlvbiB0cmFwIiwKKwlbMTVdICJEYXRhIFRMQiBtaXNzIGZhdWx0IiwKKwlbMTZdICJOb24tYWNjZXNzIElUTEIgbWlzcyBmYXVsdCIsCisJWzE3XSAiTm9uLWFjY2VzcyBEVExCIG1pc3MgZmF1bHQiLAorCVsxOF0gIkRhdGEgbWVtb3J5IHByb3RlY3Rpb24vdW5hbGlnbmVkIGFjY2VzcyB0cmFwIiwKKwlbMTldICJEYXRhIG1lbW9yeSBicmVhayB0cmFwIiwKKwlbMjBdICJUTEIgZGlydHkgYml0IHRyYXAiLAorCVsyMV0gIlBhZ2UgcmVmZXJlbmNlIHRyYXAiLAorCVsyMl0gIkFzc2lzdCBlbXVsYXRpb24gdHJhcCIsCisJWzI1XSAiVGFrZW4gYnJhbmNoIHRyYXAiLAorCVsyNl0gIkRhdGEgbWVtb3J5IGFjY2VzcyByaWdodHMgdHJhcCIsCisJWzI3XSAiRGF0YSBtZW1vcnkgcHJvdGVjdGlvbiBJRCB0cmFwIiwKKwlbMjhdICJVbmFsaWduZWQgZGF0YSByZWZlcmVuY2UgdHJhcCIsCit9OworCisvKgogICogUHJpbnQgb3V0IGluZm8gYWJvdXQgZmF0YWwgc2VnZmF1bHRzLCBpZiB0aGUgc2hvd191bmhhbmRsZWRfc2lnbmFscwogICogc3lzY3RsIGlzIHNldDoKICAqLwpAQCAtMTc2LDYgKzIxMyw4IEBACiAJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogeworCWNvbnN0IGNoYXIgKnRyYXBfbmFtZSA9IE5VTEw7CisKIAlpZiAoIXVuaGFuZGxlZF9zaWduYWwodHNrLCBTSUdTRUdWKSkKIAkJcmV0dXJuOwogCkBAIC0xODYsOCArMjI1LDE1IEBACiAJcHJfd2FybigiZG9fcGFnZV9mYXVsdCgpIGNvbW1hbmQ9JyVzJyB0eXBlPSVsdSBhZGRyZXNzPTB4JTA4bHgiLAogCSAgICB0c2stPmNvbW0sIGNvZGUsIGFkZHJlc3MpOwogCXByaW50X3ZtYV9hZGRyKEtFUk5fQ09OVCAiIGluICIsIHJlZ3MtPmlhb3FbMF0pOworCisJaWYgKGNvZGUgPCBBUlJBWV9TSVpFKHRyYXBfZGVzY3JpcHRpb24pKQorCQl0cmFwX25hbWUgPSB0cmFwX2Rlc2NyaXB0aW9uW2NvZGVdOworCXByX3dhcm4oS0VSTl9DT05UICIgdHJhcCAjJWx1OiAlcyVjIiwgY29kZSwKKwkJdHJhcF9uYW1lID8gdHJhcF9uYW1lIDogInVua25vd24iLAorCQl2bWEgPyAnLCc6J1xuJyk7CisKIAlpZiAodm1hKQotCQlwcl93YXJuKCIgdm1fc3RhcnQgPSAweCUwOGx4LCB2bV9lbmQgPSAweCUwOGx4XG4iLAorCQlwcl93YXJuKEtFUk5fQ09OVCAiIHZtX3N0YXJ0ID0gMHglMDhseCwgdm1fZW5kID0gMHglMDhseFxuIiwKIAkJCQl2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCk7CiAKIAlzaG93X3JlZ3MocmVncyk7CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9tbS9pbml0LmMgYi9hcmNoL3BhcmlzYy9tbS9pbml0LmMKaW5kZXggNmIzZTdjNi4uMzU2ZjM4NCAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvbW0vaW5pdC5jCisrKyBiL2FyY2gvcGFyaXNjL21tL2luaXQuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC03OSw2ICs4MCwzNCBAQAogcGh5c21lbV9yYW5nZV90IHBtZW1fcmFuZ2VzW01BWF9QSFlTTUVNX1JBTkdFU10gX19yZWFkX21vc3RseTsKIGludCBucG1lbV9yYW5nZXMgX19yZWFkX21vc3RseTsKIAorLyoKKyAqIGdldF9tZW1ibG9jaygpIGFsbG9jYXRlcyBwYWdlcyB2aWEgbWVtYmxvY2suCisgKiBXZSBjYW4ndCB1c2UgbWVtYmxvY2tfZmluZF9pbl9yYW5nZSgwLCBLRVJORUxfSU5JVElBTF9TSVpFKSBoZXJlIHNpbmNlIGl0CisgKiBkb2Vzbid0IGFsbG9jYXRlIGZyb20gYm90dG9tIHRvIHRvcCB3aGljaCBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBvbmx5IGNyZWF0ZWQKKyAqIHRoZSBpbml0aWFsIG1hcHBpbmcgdXAgdG8gS0VSTkVMX0lOSVRJQUxfU0laRSBpbiB0aGUgYXNzZW1ibHkgYm9vdHVwIGNvZGUuCisgKi8KK3N0YXRpYyB2b2lkICogX19pbml0IGdldF9tZW1ibG9jayh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RhdGljIHBoeXNfYWRkcl90IHNlYXJjaF9hZGRyIF9faW5pdGRhdGE7CisJcGh5c19hZGRyX3QgcGh5czsKKworCWlmICghc2VhcmNoX2FkZHIpCisJCXNlYXJjaF9hZGRyID0gUEFHRV9BTElHTihfX3BhKCh1bnNpZ25lZCBsb25nKSAmX2VuZCkpOworCXNlYXJjaF9hZGRyID0gQUxJR04oc2VhcmNoX2FkZHIsIHNpemUpOworCXdoaWxlICghbWVtYmxvY2tfaXNfcmVnaW9uX21lbW9yeShzZWFyY2hfYWRkciwgc2l6ZSkgfHwKKwkJbWVtYmxvY2tfaXNfcmVnaW9uX3Jlc2VydmVkKHNlYXJjaF9hZGRyLCBzaXplKSkgeworCQlzZWFyY2hfYWRkciArPSBzaXplOworCX0KKwlwaHlzID0gc2VhcmNoX2FkZHI7CisKKwlpZiAocGh5cykKKwkJbWVtYmxvY2tfcmVzZXJ2ZShwaHlzLCBzaXplKTsKKwllbHNlCisJCXBhbmljKCJnZXRfbWVtYmxvY2soKSBmYWlsZWQuXG4iKTsKKworCXJldHVybiBfX3ZhKHBoeXMpOworfQorCiAjaWZkZWYgQ09ORklHXzY0QklUCiAjZGVmaW5lIE1BWF9NRU0gICAgICAgICAofjBVTCkKICNlbHNlIC8qICFDT05GSUdfNjRCSVQgKi8KQEAgLTExOCwxMSArMTQ3LDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW0odm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGJvb3RtYXBfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIG1lbV9tYXg7Ci0JdW5zaWduZWQgbG9uZyBib290bWFwX3BhZ2VzOwotCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9zdGFydF9wZm47Ci0JdW5zaWduZWQgbG9uZyBib290bWFwX3BmbjsKICNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTQogCXBoeXNtZW1fcmFuZ2VfdCBwbWVtX2hvbGVzW01BWF9QSFlTTUVNX1JBTkdFUyAtIDFdOwogCWludCBucG1lbV9ob2xlczsKQEAgLTE3OCwzMyArMjAzLDI5IEBACiAJfQogI2VuZGlmCiAKLQlpZiAobnBtZW1fcmFuZ2VzID4gMSkgeworCS8qIFByaW50IHRoZSBtZW1vcnkgcmFuZ2VzICovCisJcHJfaW5mbygiTWVtb3J5IFJhbmdlczpcbiIpOwogCi0JCS8qIFByaW50IHRoZSBtZW1vcnkgcmFuZ2VzICovCi0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiTWVtb3J5IFJhbmdlczpcbiIpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBucG1lbV9yYW5nZXM7IGkrKykgewotCQkJdW5zaWduZWQgbG9uZyBzdGFydDsKLQkJCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQotCQkJc2l6ZSA9IChwbWVtX3Jhbmdlc1tpXS5wYWdlcyA8PCBQQUdFX1NISUZUKTsKLQkJCXN0YXJ0ID0gKHBtZW1fcmFuZ2VzW2ldLnN0YXJ0X3BmbiA8PCBQQUdFX1NISUZUKTsKLQkJCXByaW50ayhLRVJOX0lORk8gIiUyZCkgU3RhcnQgMHglMDE2bHggRW5kIDB4JTAxNmx4IFNpemUgJTZsZCBNQlxuIiwKLQkJCQlpLHN0YXJ0LCBzdGFydCArIChzaXplIC0gMSksIHNpemUgPj4gMjApOwotCQl9Ci0JfQotCi0Jc3lzcmFtX3Jlc291cmNlX2NvdW50ID0gbnBtZW1fcmFuZ2VzOwotCWZvciAoaSA9IDA7IGkgPCBzeXNyYW1fcmVzb3VyY2VfY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBucG1lbV9yYW5nZXM7IGkrKykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZzeXNyYW1fcmVzb3VyY2VzW2ldOworCQl1bnNpZ25lZCBsb25nIHN0YXJ0OworCQl1bnNpZ25lZCBsb25nIHNpemU7CisKKwkJc2l6ZSA9IChwbWVtX3Jhbmdlc1tpXS5wYWdlcyA8PCBQQUdFX1NISUZUKTsKKwkJc3RhcnQgPSAocG1lbV9yYW5nZXNbaV0uc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQpOworCQlwcl9pbmZvKCIlMmQpIFN0YXJ0IDB4JTAxNmx4IEVuZCAweCUwMTZseCBTaXplICU2bGQgTUJcbiIsCisJCQlpLCBzdGFydCwgc3RhcnQgKyAoc2l6ZSAtIDEpLCBzaXplID4+IDIwKTsKKworCQkvKiByZXF1ZXN0IG1lbW9yeSByZXNvdXJjZSAqLwogCQlyZXMtPm5hbWUgPSAiU3lzdGVtIFJBTSI7Ci0JCXJlcy0+c3RhcnQgPSBwbWVtX3Jhbmdlc1tpXS5zdGFydF9wZm4gPDwgUEFHRV9TSElGVDsKLQkJcmVzLT5lbmQgPSByZXMtPnN0YXJ0ICsgKHBtZW1fcmFuZ2VzW2ldLnBhZ2VzIDw8IFBBR0VfU0hJRlQpLTE7CisJCXJlcy0+c3RhcnQgPSBzdGFydDsKKwkJcmVzLT5lbmQgPSBzdGFydCArIHNpemUgLSAxOwogCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9TWVNURU1fUkFNIHwgSU9SRVNPVVJDRV9CVVNZOwogCQlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgcmVzKTsKIAl9CiAKKwlzeXNyYW1fcmVzb3VyY2VfY291bnQgPSBucG1lbV9yYW5nZXM7CisKIAkvKgogCSAqIEZvciAzMiBiaXQga2VybmVscyB3ZSBsaW1pdCB0aGUgYW1vdW50IG9mIG1lbW9yeSB3ZSBjYW4KIAkgKiBzdXBwb3J0LCBpbiBvcmRlciB0byBwcmVzZXJ2ZSBlbm91Z2gga2VybmVsIGFkZHJlc3Mgc3BhY2UKQEAgLTI2MywxNiArMjg0LDkgQEAKIAl9CiAjZW5kaWYKIAotCWJvb3RtYXBfcGFnZXMgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBucG1lbV9yYW5nZXM7IGkrKykKLQkJYm9vdG1hcF9wYWdlcyArPSBib290bWVtX2Jvb3RtYXBfcGFnZXMocG1lbV9yYW5nZXNbaV0ucGFnZXMpOwotCi0JYm9vdG1hcF9zdGFydF9wZm4gPSBQQUdFX0FMSUdOKF9fcGEoKHVuc2lnbmVkIGxvbmcpICZfZW5kKSkgPj4gUEFHRV9TSElGVDsKLQogI2lmZGVmIENPTkZJR19ESVNDT05USUdNRU0KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1BIWVNNRU1fUkFOR0VTOyBpKyspIHsKIAkJbWVtc2V0KE5PREVfREFUQShpKSwgMCwgc2l6ZW9mKHBnX2RhdGFfdCkpOwotCQlOT0RFX0RBVEEoaSktPmJkYXRhID0gJmJvb3RtZW1fbm9kZV9kYXRhW2ldOwogCX0KIAltZW1zZXQocGZubmlkX21hcCwgMHhmZiwgc2l6ZW9mKHBmbm5pZF9tYXApKTsKIApAQCAtMjg0LDI4ICsyOTgsMjQgQEAKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBhbmQgZnJlZSB0aGUgZnVsbCByYW5nZSBvZiBtZW1vcnkgaW4gZWFjaCByYW5nZS4KLQkgKiBOb3RlIHRoYXQgdGhlIG9ubHkgd3JpdGluZyB0aGVzZSByb3V0aW5lcyBkbyBhcmUgdG8gdGhlIGJvb3RtYXAsCi0JICogYW5kIHdlJ3ZlIG1hZGUgc3VyZSB0byBsb2NhdGUgdGhlIGJvb3RtYXAgcHJvcGVybHkgc28gdGhhdCB0aGV5Ci0JICogd29uJ3QgYmUgd3JpdGluZyBvdmVyIGFueXRoaW5nIGltcG9ydGFudC4KIAkgKi8KIAotCWJvb3RtYXBfcGZuID0gYm9vdG1hcF9zdGFydF9wZm47CiAJbWF4X3BmbiA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG5wbWVtX3JhbmdlczsgaSsrKSB7CiAJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOwogCQl1bnNpZ25lZCBsb25nIG5wYWdlczsKKwkJdW5zaWduZWQgbG9uZyBzdGFydDsKKwkJdW5zaWduZWQgbG9uZyBzaXplOwogCiAJCXN0YXJ0X3BmbiA9IHBtZW1fcmFuZ2VzW2ldLnN0YXJ0X3BmbjsKIAkJbnBhZ2VzID0gcG1lbV9yYW5nZXNbaV0ucGFnZXM7CiAKLQkJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtX25vZGUoTk9ERV9EQVRBKGkpLAotCQkJCQkJYm9vdG1hcF9wZm4sCi0JCQkJCQlzdGFydF9wZm4sCi0JCQkJCQkoc3RhcnRfcGZuICsgbnBhZ2VzKSApOwotCQlmcmVlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoaSksCi0JCQkJICAoc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQpLAotCQkJCSAgKG5wYWdlcyA8PCBQQUdFX1NISUZUKSApOwotCQlib290bWFwX3BmbiArPSAoYm9vdG1hcF9zaXplICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwkJc3RhcnQgPSBzdGFydF9wZm4gPDwgUEFHRV9TSElGVDsKKwkJc2l6ZSA9IG5wYWdlcyA8PCBQQUdFX1NISUZUOworCisJCS8qIGFkZCBzeXN0ZW0gUkFNIG1lbWJsb2NrICovCisJCW1lbWJsb2NrX2FkZChzdGFydCwgc2l6ZSk7CisKIAkJaWYgKChzdGFydF9wZm4gKyBucGFnZXMpID4gbWF4X3BmbikKIAkJCW1heF9wZm4gPSBzdGFydF9wZm4gKyBucGFnZXM7CiAJfQpAQCAtMzE3LDMyICszMjcsMjIgQEAKIAkgKi8KIAltYXhfbG93X3BmbiA9IG1heF9wZm47CiAKLQkvKiBib290bWFwIHNpemluZyBtZXNzZWQgdXA/ICovCi0JQlVHX09OKChib290bWFwX3BmbiAtIGJvb3RtYXBfc3RhcnRfcGZuKSAhPSBib290bWFwX3BhZ2VzKTsKLQogCS8qIHJlc2VydmUgUEFHRTAgcGRjIG1lbW9yeSwga2VybmVsIHRleHQvZGF0YS9ic3MgJiBib290bWFwICovCiAKICNkZWZpbmUgUERDX0NPTlNPTEVfSU9fSU9EQ19TSVpFIDMyNzY4CiAKLQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIDBVTCwKLQkJCSh1bnNpZ25lZCBsb25nKShQQUdFMC0+bWVtX2ZyZWUgKwotCQkJCVBEQ19DT05TT0xFX0lPX0lPRENfU0laRSksIEJPT1RNRU1fREVGQVVMVCk7Ci0JcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLCBfX3BhKEtFUk5FTF9CSU5BUllfVEVYVF9TVEFSVCksCi0JCQkodW5zaWduZWQgbG9uZykoX2VuZCAtIEtFUk5FTF9CSU5BUllfVEVYVF9TVEFSVCksCi0JCQlCT09UTUVNX0RFRkFVTFQpOwotCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgKGJvb3RtYXBfc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQpLAotCQkJKChib290bWFwX3BmbiAtIGJvb3RtYXBfc3RhcnRfcGZuKSA8PCBQQUdFX1NISUZUKSwKLQkJCUJPT1RNRU1fREVGQVVMVCk7CisJbWVtYmxvY2tfcmVzZXJ2ZSgwVUwsICh1bnNpZ25lZCBsb25nKShQQUdFMC0+bWVtX2ZyZWUgKworCQkJCVBEQ19DT05TT0xFX0lPX0lPRENfU0laRSkpOworCW1lbWJsb2NrX3Jlc2VydmUoX19wYShLRVJORUxfQklOQVJZX1RFWFRfU1RBUlQpLAorCQkJKHVuc2lnbmVkIGxvbmcpKF9lbmQgLSBLRVJORUxfQklOQVJZX1RFWFRfU1RBUlQpKTsKIAogI2lmbmRlZiBDT05GSUdfRElTQ09OVElHTUVNCiAKIAkvKiByZXNlcnZlIHRoZSBob2xlcyAqLwogCiAJZm9yIChpID0gMDsgaSA8IG5wbWVtX2hvbGVzOyBpKyspIHsKLQkJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKDApLAotCQkJCShwbWVtX2hvbGVzW2ldLnN0YXJ0X3BmbiA8PCBQQUdFX1NISUZUKSwKLQkJCQkocG1lbV9ob2xlc1tpXS5wYWdlcyA8PCBQQUdFX1NISUZUKSwKLQkJCQlCT09UTUVNX0RFRkFVTFQpOworCQltZW1ibG9ja19yZXNlcnZlKChwbWVtX2hvbGVzW2ldLnN0YXJ0X3BmbiA8PCBQQUdFX1NISUZUKSwKKwkJCQkocG1lbV9ob2xlc1tpXS5wYWdlcyA8PCBQQUdFX1NISUZUKSk7CiAJfQogI2VuZGlmCiAKQEAgLTM2MCw4ICszNjAsNyBAQAogCQkJaW5pdHJkX2JlbG93X3N0YXJ0X29rID0gMTsKIAkJCXByaW50ayhLRVJOX0lORk8gImluaXRyZDogcmVzZXJ2aW5nICUwOGx4LSUwOGx4IChtZW1fbWF4ICUwOGx4KVxuIiwgX19wYShpbml0cmRfc3RhcnQpLCBfX3BhKGluaXRyZF9zdGFydCkgKyBpbml0cmRfcmVzZXJ2ZSwgbWVtX21heCk7CiAKLQkJCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgX19wYShpbml0cmRfc3RhcnQpLAotCQkJCQlpbml0cmRfcmVzZXJ2ZSwgQk9PVE1FTV9ERUZBVUxUKTsKKwkJCW1lbWJsb2NrX3Jlc2VydmUoX19wYShpbml0cmRfc3RhcnQpLCBpbml0cmRfcmVzZXJ2ZSk7CiAJCX0KIAl9CiAjZW5kaWYKQEAgLTQzOSw3ICs0MzgsNyBAQAogCQkgKi8KIAogCQlpZiAoIXBtZCkgewotCQkJcG1kID0gKHBtZF90ICopIGFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzX25vZGUoTk9ERV9EQVRBKDApLCBQQUdFX1NJWkUgPDwgUE1EX09SREVSKTsKKwkJCXBtZCA9IChwbWRfdCAqKSBnZXRfbWVtYmxvY2soUEFHRV9TSVpFIDw8IFBNRF9PUkRFUik7CiAJCQlwbWQgPSAocG1kX3QgKikgX19wYShwbWQpOwogCQl9CiAKQEAgLTQ1OCw4ICs0NTcsNyBAQAogCiAJCQlwZ190YWJsZSA9IChwdGVfdCAqKXBtZF9hZGRyZXNzKCpwbWQpOwogCQkJaWYgKCFwZ190YWJsZSkgewotCQkJCXBnX3RhYmxlID0gKHB0ZV90ICopCi0JCQkJCWFsbG9jX2Jvb3RtZW1fbG93X3BhZ2VzX25vZGUoTk9ERV9EQVRBKDApLCBQQUdFX1NJWkUpOworCQkJCXBnX3RhYmxlID0gKHB0ZV90ICopIGdldF9tZW1ibG9jayhQQUdFX1NJWkUpOwogCQkJCXBnX3RhYmxlID0gKHB0ZV90ICopIF9fcGEocGdfdGFibGUpOwogCQkJfQogCkBAIC03MzcsNyArNzM1LDcgQEAKIAl9CiAjZW5kaWYKIAotCWVtcHR5X3plcm9fcGFnZSA9IGFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9TSVpFKTsKKwllbXB0eV96ZXJvX3BhZ2UgPSBnZXRfbWVtYmxvY2soUEFHRV9TSVpFKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGdhdGV3YXlfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwppbmRleCA5MjdkMmFiLi41NjliNGY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwpAQCAtMTIsMTEgKzEyLDYgQEAKIAlib29sCiAJZGVmYXVsdCB5IGlmIFBQQzY0CiAKLWNvbmZpZyBXT1JEX1NJWkUKLQlpbnQKLQlkZWZhdWx0IDY0IGlmIFBQQzY0Ci0JZGVmYXVsdCAzMiBpZiAhUFBDNjQKLQogY29uZmlnIEFSQ0hfUEhZU19BRERSX1RfNjRCSVQKICAgICAgICBkZWZfYm9vbCBQUEM2NCB8fCBQSFlTXzY0QklUCiAKQEAgLTEwMSw3ICs5Niw3IEBACiAJc2VsZWN0IFZJUlRfVE9fQlVTIGlmICFQUEM2NAogCXNlbGVjdCBIQVZFX0lERQogCXNlbGVjdCBIQVZFX0lPUkVNQVBfUFJPVAotCXNlbGVjdCBIQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlmICFDUFVfTElUVExFX0VORElBTgorCXNlbGVjdCBIQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTIGlmICEoQ1BVX0xJVFRMRV9FTkRJQU4gJiYgUE9XRVI3X0NQVSkKIAlzZWxlY3QgSEFWRV9LUFJPQkVTCiAJc2VsZWN0IEhBVkVfQVJDSF9LR0RCCiAJc2VsZWN0IEhBVkVfS1JFVFBST0JFUwpAQCAtMTY3LDYgKzE2Miw3IEBACiAJc2VsZWN0IEdFTkVSSUNfQ1BVX0FVVE9QUk9CRQogCXNlbGVjdCBIQVZFX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIAlzZWxlY3QgSEFWRV9BUkNIX0hBUkRFTkVEX1VTRVJDT1BZCisJc2VsZWN0IEhBVkVfS0VSTkVMX0daSVAKIAogY29uZmlnIEdFTkVSSUNfQ1NVTQogCWRlZl9ib29sIENQVV9MSVRUTEVfRU5ESUFOCkBAIC02MzcsNyArNjMzLDcgQEAKIAlpbnQgIk1heGltdW0gem9uZSBvcmRlciIKIAlyYW5nZSA4IDkgaWYgUFBDNjQgJiYgUFBDXzY0S19QQUdFUwogCWRlZmF1bHQgIjkiIGlmIFBQQzY0ICYmIFBQQ182NEtfUEFHRVMKLQlyYW5nZSA5IDEzIGlmIFBQQzY0ICYmICFQUENfNjRLX1BBR0VTCisJcmFuZ2UgMTMgMTMgaWYgUFBDNjQgJiYgIVBQQ182NEtfUEFHRVMKIAlkZWZhdWx0ICIxMyIgaWYgUFBDNjQgJiYgIVBQQ182NEtfUEFHRVMKIAlyYW5nZSA5IDY0IGlmIFBQQzMyICYmIFBQQ18xNktfUEFHRVMKIAlkZWZhdWx0ICI5IiBpZiBQUEMzMiAmJiBQUENfMTZLX1BBR0VTCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggMTkzNDcwNy4uNTBkMDIwYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQpAQCAtNDMsMzEgKzQzLDI0IEBACiBlbmRpZgogZW5kaWYKIAotaWZlcSAoJChDT05GSUdfUFBDNjQpLHkpCi1pZmVxICgkKENPTkZJR19DUFVfTElUVExFX0VORElBTikseSkKLU9MREFSQ0gJOj0gcHBjNjRsZQorIyBCSVRTIGlzIHVzZWQgYXMgZXh0ZW5zaW9uIGZvciBmaWxlcyB3aGljaCBhcmUgYXZhaWxhYmxlIGluIGEgMzIgYml0CisjIGFuZCBhIDY0IGJpdCB2ZXJzaW9uIHRvIHNpbXBsaWZ5IHNoYXJlZCBNYWtlZmlsZXMuCisjIGUuZy46IG9iai15ICs9IGZvb18kKEJJVFMpLm8KK2V4cG9ydCBCSVRTCisKK2lmZGVmIENPTkZJR19QUEM2NAorICAgICAgICBCSVRTIDo9IDY0CiBlbHNlCi1PTERBUkNICTo9IHBwYzY0Ci1lbmRpZgotZWxzZQotaWZlcSAoJChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pLHkpCi1PTERBUkNICTo9IHBwY2xlCi1lbHNlCi1PTERBUkNICTo9IHBwYwotZW5kaWYKKyAgICAgICAgQklUUyA6PSAzMgogZW5kaWYKIAotIyBJdCBzZWVtcyB0aGVyZSBhcmUgdGltZXMgd2UgdXNlIHRoaXMgTWFrZWZpbGUgd2l0aG91dAotIyBpbmNsdWRpbmcgdGhlIGNvbmZpZyBmaWxlLCBidXQgdGhpcyByZXBsaWNhdGVzIHRoZSBvbGQgYmVoYXZpb3VyCi1pZmVxICgkKENPTkZJR19XT1JEX1NJWkUpLCkKLUNPTkZJR19XT1JEX1NJWkUgOj0gMzIKLWVuZGlmCi0KLVVUU19NQUNISU5FIDo9ICQoT0xEQVJDSCkKK21hY2hpbmUteSA9IHBwYworbWFjaGluZS0kKENPTkZJR19QUEM2NCkgKz0gNjQKK21hY2hpbmUtJChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pICs9IGxlCitVVFNfTUFDSElORSA6PSAkKHN1YnN0ICQoc3BhY2UpLCwkKG1hY2hpbmUteSkpCiAKIGlmZXEgKCQoQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOKSx5KQogb3ZlcnJpZGUgTEQJKz0gLUVMCi1vdmVycmlkZSBDUk9TUzMyQVMgKz0gLW1saXR0bGUtZW5kaWFuCiBMREVNVUxBVElPTgk6PSBscHBjCiBHTlVUQVJHRVQJOj0gcG93ZXJwY2xlCiBNVUxUSVBMRVdPUkQJOj0gLW1uby1tdWx0aXBsZQpAQCAtODksMTAgKzgyLDEwIEBACiBhZmxhZ3MtJChDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4pCSs9IC1tbGl0dGxlLWVuZGlhbgogCiBpZmVxICgkKEhBU19CSUFSQ0gpLHkpCi1vdmVycmlkZSBBUwkrPSAtYSQoQ09ORklHX1dPUkRfU0laRSkKLW92ZXJyaWRlIExECSs9IC1tIGVsZiQoQ09ORklHX1dPUkRfU0laRSkkKExERU1VTEFUSU9OKQotb3ZlcnJpZGUgQ0MJKz0gLW0kKENPTkZJR19XT1JEX1NJWkUpCi1vdmVycmlkZSBBUgk6PSBHTlVUQVJHRVQ9ZWxmJChDT05GSUdfV09SRF9TSVpFKS0kKEdOVVRBUkdFVCkgJChBUikKK292ZXJyaWRlIEFTCSs9IC1hJChCSVRTKQorb3ZlcnJpZGUgTEQJKz0gLW0gZWxmJChCSVRTKSQoTERFTVVMQVRJT04pCitvdmVycmlkZSBDQwkrPSAtbSQoQklUUykKK292ZXJyaWRlIEFSCTo9IEdOVVRBUkdFVD1lbGYkKEJJVFMpLSQoR05VVEFSR0VUKSAkKEFSKQogZW5kaWYKIAogTERGTEFHU192bWxpbnV4LXkgOj0gLUJzdGF0aWMKQEAgLTE3OSw3ICsxNzIsNyBAQAogS0JVSUxEX0NGTEFHUwkrPSAtcGlwZSAtSWFyY2gvJChBUkNIKSAkKENGTEFHUy15KQogQ1BQCQk9ICQoQ0MpIC1FICQoS0JVSUxEX0NGTEFHUykKIAotQ0hFQ0tGTEFHUwkrPSAtbSQoQ09ORklHX1dPUkRfU0laRSkgLURfX3Bvd2VycGNfXyAtRF9fcG93ZXJwYyQoQ09ORklHX1dPUkRfU0laRSlfXworQ0hFQ0tGTEFHUwkrPSAtbSQoQklUUykgLURfX3Bvd2VycGNfXyAtRF9fcG93ZXJwYyQoQklUUylfXwogaWZkZWYgQ09ORklHX0NQVV9CSUdfRU5ESUFOCiBDSEVDS0ZMQUdTCSs9IC1EX19CSUdfRU5ESUFOX18KIGVsc2UKQEAgLTIzNCw3ICsyMjcsNyBAQAogS0JVSUxEX0FGTEFHUyArPSAkKGFmbGFncy15KQogS0JVSUxEX0NGTEFHUyArPSAkKGNmbGFncy15KQogCi1oZWFkLXkJCQkJOj0gYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXyQoQ09ORklHX1dPUkRfU0laRSkubworaGVhZC15CQkJCTo9IGFyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8kKEJJVFMpLm8KIGhlYWQtJChDT05GSUdfOHh4KQkJOj0gYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzh4eC5vCiBoZWFkLSQoQ09ORklHXzQweCkJCTo9IGFyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80MHgubwogaGVhZC0kKENPTkZJR180NHgpCQk6PSBhcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDR4Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKaW5kZXggMWEyYTZlOC4uZWFlMmRjOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUKQEAgLTE5LDEwICsxOSwxNSBAQAogCiBhbGw6ICQob2JqKS96SW1hZ2UKIAorY29tcHJlc3MtJChDT05GSUdfS0VSTkVMX0daSVApIDo9IENPTkZJR19LRVJORUxfR1pJUAorY29tcHJlc3MtJChDT05GSUdfS0VSTkVMX1haKSAgIDo9IENPTkZJR19LRVJORUxfWFoKKwogQk9PVENGTEFHUyAgICA6PSAtV2FsbCAtV3VuZGVmIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVduby10cmlncmFwaHMgXAogCQkgLWZuby1zdHJpY3QtYWxpYXNpbmcgLU9zIC1tc29mdC1mbG9hdCAtcGlwZSBcCiAJCSAtZm9taXQtZnJhbWUtcG9pbnRlciAtZm5vLWJ1aWx0aW4gLWZQSUMgLW5vc3RkaW5jIFwKLQkJIC1pc3lzdGVtICQoc2hlbGwgJChDUk9TUzMyQ0MpIC1wcmludC1maWxlLW5hbWU9aW5jbHVkZSkKKwkJIC1pc3lzdGVtICQoc2hlbGwgJChDUk9TUzMyQ0MpIC1wcmludC1maWxlLW5hbWU9aW5jbHVkZSkgXAorCQkgLUQkKGNvbXByZXNzLXkpCisKIGlmZGVmIENPTkZJR19QUEM2NF9CT09UX1dSQVBQRVIKIEJPT1RDRkxBR1MJKz0gLW02NAogZW5kaWYKQEAgLTU5LDEzICs2NCwzMCBAQAogJChvYmopL3RyZWVib290LWFrZWJvbm8ubzogQk9PVENGTEFHUyArPSAtbWNwdT00MDUKICQob2JqKS92aXJ0ZXg0MDUtaGVhZC5vOiBCT09UQUZMQUdTICs9IC1tY3B1PTQwNQogCisjIFRoZSBwcmUtYm9vdCBkZWNvbXByZXNzb3JzIHB1bGwgaW4gYSBsb3Qgb2Yga2VybmVsIGhlYWRlcnMgYW5kIG90aGVyIHNvdXJjZQorIyBmaWxlcy4gVGhpcyBjcmVhdGVzIGEgYml0IG9mIGEgZGVwZW5kZW5jeSBoZWFkYWNoZSBzaW5jZSB3ZSBuZWVkIHRvIGNvcHkKKyMgdGhlc2UgZmlsZXMgaW50byB0aGUgYnVpbGQgZGlyLCBmaXggdXAgYW55IGluY2x1ZGVzIGFuZCBlbnN1cmUgdGhhdCBkZXBlbmRlbnQKKyMgZmlsZXMgYXJlIGNvcGllZCBpbiB0aGUgcmlnaHQgb3JkZXIuCiAKLXpsaWIgICAgICAgOj0gaW5mZmFzdC5jIGluZmxhdGUuYyBpbmZ0cmVlcy5jCi16bGliaGVhZGVyIDo9IGluZmZhc3QuaCBpbmZmaXhlZC5oIGluZmxhdGUuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaAotemxpYmxpbnV4aGVhZGVyIDo9IHpsaWIuaCB6Y29uZi5oIHp1dGlsLmgKKyMgdGhlc2UgbmVlZCB0byBiZSBzZXBlcmF0ZSB2YXJpYWJsZXMgYmVjYXVzZSB0aGV5IGFyZSBjb3BpZWQgb3V0IG9mIGRpZmZlcmVudAorIyBkaXJlY3RvcmllcyBpbiB0aGUga2VybmVsIHRyZWUuIFN1cmUgeW91IENPVUxkIG1lcmdlIHRoZW0sIGJ1dCBpdCdzIGEKKyMgY3VyZS1pcy13b3JzZS10aGFuLWRpc2Vhc2Ugc2l0dWF0aW9uLgoremxpYi1kZWNvbXAtJChDT05GSUdfS0VSTkVMX0daSVApIDo9IGRlY29tcHJlc3NfaW5mbGF0ZS5jCit6bGliLSQoQ09ORklHX0tFUk5FTF9HWklQKSA6PSBpbmZmYXN0LmMgaW5mbGF0ZS5jIGluZnRyZWVzLmMKK3psaWJoZWFkZXItJChDT05GSUdfS0VSTkVMX0daSVApIDo9IGluZmZhc3QuaCBpbmZmaXhlZC5oIGluZmxhdGUuaCBpbmZ0cmVlcy5oIGluZnV0aWwuaAoremxpYmxpbnV4aGVhZGVyLSQoQ09ORklHX0tFUk5FTF9HWklQKSA6PSB6bGliLmggemNvbmYuaCB6dXRpbC5oCiAKLSQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliKSBjdWJvb3QtYzJrLm8gZ3VuemlwX3V0aWwubyBtYWluLm8pOiBcCi0JJChhZGRwcmVmaXggJChvYmopLywkKHpsaWJsaW51eGhlYWRlcikpICQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliaGVhZGVyKSkKKyQoYWRkcHJlZml4ICQob2JqKS8sIGRlY29tcHJlc3Mubyk6IFwKKwkkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYi1kZWNvbXAteSkpCisKKyQoYWRkcHJlZml4ICQob2JqKS8sICQoemxpYi1kZWNvbXAteSkpOiBcCisJJChhZGRwcmVmaXggJChvYmopLywkKHpsaWJsaW51eGhlYWRlci15KSkgXAorCSQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliaGVhZGVyLXkpKSBcCisJJChhZGRwcmVmaXggJChvYmopLywkKHpsaWIteSkpCisKKyQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliLXkpKTogXAorCSQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGlibGludXhoZWFkZXIteSkpIFwKKwkkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmhlYWRlci15KSkKIAogbGliZmR0ICAgICAgIDo9IGZkdC5jIGZkdF9yby5jIGZkdF93aXAuYyBmZHRfc3cuYyBmZHRfcncuYyBmZHRfc3RyZXJyb3IuYwogbGliZmR0aGVhZGVyIDo9IGZkdC5oIGxpYmZkdC5oIGxpYmZkdF9pbnRlcm5hbC5oCkBAIC03MywxMCArOTUsMTAgQEAKICQoYWRkcHJlZml4ICQob2JqKS8sJChsaWJmZHQpIGxpYmZkdC13cmFwcGVyLm8gc2ltcGxlYm9vdC5vIGVwYXByLm8gb3BhbC5vKTogXAogCSQoYWRkcHJlZml4ICQob2JqKS8sJChsaWJmZHRoZWFkZXIpKQogCi1zcmMtd2xpYi15IDo9IHN0cmluZy5TIGNydDAuUyBjcnRzYXZyZXMuUyBzdGRpby5jIG1haW4uYyBcCitzcmMtd2xpYi15IDo9IHN0cmluZy5TIGNydDAuUyBjcnRzYXZyZXMuUyBzdGRpby5jIGRlY29tcHJlc3MuYyBtYWluLmMgXAogCQkkKGxpYmZkdCkgbGliZmR0LXdyYXBwZXIuYyBcCiAJCW5zMTY1NTAuYyBzZXJpYWwuYyBzaW1wbGVfYWxsb2MuYyBkaXY2NC5TIHV0aWwuUyBcCi0JCWd1bnppcF91dGlsLmMgZWxmX3V0aWwuYyAkKHpsaWIpIGRldnRyZWUuYyBzdGRsaWIuYyBcCisJCWVsZl91dGlsLmMgJCh6bGliLXkpIGRldnRyZWUuYyBzdGRsaWIuYyBcCiAJCW9mbGliLmMgb2Zjb25zb2xlLmMgY3Vib290LmMgbXBzYy5jIGNwbS1zZXJpYWwuYyBcCiAJCXVhcnRsaXRlLmMgbXBjNTJ4eC1wc2MuYyBvcGFsLmMgb3BhbC1jYWxscy5TCiBzcmMtd2xpYi0kKENPTkZJR180MHgpICs9IDR4eC5jIHBsYW5ldGNvcmUuYwpAQCAtMTI1LDIzICsxNDcsMjAgQEAKIG9iai1wbGF0IDo9ICQoYWRkc3VmZml4IC5vLCAkKGJhc2VuYW1lICQoYWRkcHJlZml4ICQob2JqKS8sICQoc3JjLXBsYXQpKSkpCiBvYmotcGxhdDogJChsaWJmZHQpCiAKLXF1aWV0X2NtZF9jb3B5X3psaWIgPSBDT1BZICAgICRACi0gICAgICBjbWRfY29weV96bGliID0gc2VkICJzQF9fdXNlZEBAO3NAPGxpbnV4L1woW14+XSpcKS4qQFwiXDFcIkAiICQ8ID4gJEAKK3F1aWV0X2NtZF9jb3B5X2tlcm5fc3JjID0gQ09QWSAgICAkQAorICAgICAgY21kX2NvcHlfa2Vybl9zcmMgPSBzZWQgLWYgJChzcmN0cmVlKS9hcmNoL3Bvd2VycGMvYm9vdC9maXh1cC1oZWFkZXJzLnNlZCAkPCA+ICRACiAKLXF1aWV0X2NtZF9jb3B5X3psaWJoZWFkZXIgPSBDT1BZICAgICRACi0gICAgICBjbWRfY29weV96bGliaGVhZGVyID0gc2VkICJzQDxsaW51eC9cKFtePl0qXCkuKkBcIlwxXCJAIiAkPCA+ICRACi0jIHN0ZGRlZi5oIGZvciBOVUxMCi1xdWlldF9jbWRfY29weV96bGlibGludXhoZWFkZXIgPSBDT1BZICAgICRACi0gICAgICBjbWRfY29weV96bGlibGludXhoZWFkZXIgPSBzZWQgInNAPGxpbnV4L3N0cmluZy5oPkBcInN0cmluZy5oXCJAO3NAPGxpbnV4L2tlcm5lbC5oPkA8c3RkZGVmLmg+QDtzQDxsaW51eC9cKFtePl0qXCkuKkBcIlwxXCJAIiAkPCA+ICRACiskKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYi15KSk6ICQob2JqKS8lOiAkKHNyY3RyZWUpL2xpYi96bGliX2luZmxhdGUvJQorCSQoY2FsbCBjbWQsY29weV9rZXJuX3NyYykKIAotJChhZGRwcmVmaXggJChvYmopLywkKHpsaWIpKTogJChvYmopLyU6ICQoc3JjdHJlZSkvbGliL3psaWJfaW5mbGF0ZS8lCi0JJChjYWxsIGNtZCxjb3B5X3psaWIpCiskKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmhlYWRlci15KSk6ICQob2JqKS8lOiAkKHNyY3RyZWUpL2xpYi96bGliX2luZmxhdGUvJQorCSQoY2FsbCBjbWQsY29weV9rZXJuX3NyYykKIAotJChhZGRwcmVmaXggJChvYmopLywkKHpsaWJoZWFkZXIpKTogJChvYmopLyU6ICQoc3JjdHJlZSkvbGliL3psaWJfaW5mbGF0ZS8lCi0JJChjYWxsIGNtZCxjb3B5X3psaWJoZWFkZXIpCiskKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmxpbnV4aGVhZGVyLXkpKTogJChvYmopLyU6ICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC8lCisJJChjYWxsIGNtZCxjb3B5X2tlcm5fc3JjKQogCi0kKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmxpbnV4aGVhZGVyKSk6ICQob2JqKS8lOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvJQotCSQoY2FsbCBjbWQsY29weV96bGlibGludXhoZWFkZXIpCiskKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYi1kZWNvbXAteSkpOiAkKG9iaikvJTogJChzcmN0cmVlKS9saWIvJQorCSQoY2FsbCBjbWQsY29weV9rZXJuX3NyYykKIAogcXVpZXRfY21kX2NvcHlfbGliZmR0ID0gQ09QWSAgICAkQAogICAgICAgY21kX2NvcHlfbGliZmR0ID0gY3AgJDwgJEAKQEAgLTE1MCwxNyArMTY5LDE3IEBACiAJJChjYWxsIGNtZCxjb3B5X2xpYmZkdCkKIAogJChvYmopL2VtcHR5LmM6Ci0JQHRvdWNoICRACisJJChRKXRvdWNoICRACiAKICQob2JqKS96SW1hZ2UubGRzOiAkKG9iaikvJTogJChzcmN0cmVlKS8kKHNyYykvJS5TCiAJJChDUk9TUzMyQ0MpICQoY3BwX2ZsYWdzKSAtRSAtV3AsLU1ELCQoZGVwZmlsZSkgLVAgLVVwb3dlcnBjIFwKIAkJLURfX0FTU0VNQkxZX18gLURMSU5LRVJfU0NSSVBUIC1vICRAICQ8CiAKICQob2JqKS96SW1hZ2UuY29mZi5sZHMgJChvYmopL3pJbWFnZS5wczMubGRzIDogJChvYmopLyU6ICQoc3JjdHJlZSkvJChzcmMpLyUuUwotCUBjcCAkPCAkQAorCSQoUSljcCAkPCAkQAogCi1jbGVhbi1maWxlcyA6PSAkKHpsaWIpICQoemxpYmhlYWRlcikgJCh6bGlibGludXhoZWFkZXIpIFwKLQkJJChsaWJmZHQpICQobGliZmR0aGVhZGVyKSBcCitjbGVhbi1maWxlcyA6PSAkKHpsaWItKSAkKHpsaWJoZWFkZXItKSAkKHpsaWJsaW51eGhlYWRlci0pIFwKKwkJJCh6bGliLWRlY29tcC0pICQobGliZmR0KSAkKGxpYmZkdGhlYWRlcikgXAogCQllbXB0eS5jIHpJbWFnZS5jb2ZmLmxkcyB6SW1hZ2UucHMzLmxkcyB6SW1hZ2UubGRzCiAKIHF1aWV0X2NtZF9ib290Y2MgPSBCT09UQ0MgICRACkBAIC0yMDcsMTAgKzIyNiwxNCBAQAogZW5kaWYKIGVuZGlmCiAKK2NvbXByZXNzb3ItJChDT05GSUdfS0VSTkVMX0daSVApIDo9IGd6Citjb21wcmVzc29yLSQoQ09ORklHX0tFUk5FTF9YWikgICA6PSB4egorCiAjIGFyZ3MgKHRvIGlmX2NoYW5nZWQpOiAxID0gKHRoaXMgcnVsZSksIDIgPSBwbGF0Zm9ybSwgMyA9IGR0cyA0PWR0YiA1PWluaXRyZAogcXVpZXRfY21kX3dyYXAJPSBXUkFQICAgICRACi0gICAgICBjbWRfd3JhcAk9JChDT05GSUdfU0hFTEwpICQod3JhcHBlcikgLWMgLW8gJEAgLXAgJDIgJChDUk9TU1dSQVApIFwKLQkJJChpZiAkMywgLXMgJDMpJChpZiAkNCwgLWQgJDQpJChpZiAkNSwgLWkgJDUpIHZtbGludXgKKyAgICAgIGNtZF93cmFwCT0kKENPTkZJR19TSEVMTCkgJCh3cmFwcGVyKSAtWiAkKGNvbXByZXNzb3IteSkgLWMgLW8gJEAgLXAgJDIgXAorCQkkKENST1NTV1JBUCkgJChpZiAkMywgLXMgJDMpJChpZiAkNCwgLWQgJDQpJChpZiAkNSwgLWkgJDUpIFwKKwkJdm1saW51eAogCiBpbWFnZS0kKENPTkZJR19QUENfUFNFUklFUykJCSs9IHpJbWFnZS5wc2VyaWVzCiBpbWFnZS0kKENPTkZJR19QUENfUE9XRVJOVikJCSs9IHpJbWFnZS5wc2VyaWVzCkBAIC0zOTEsOSArNDE0LDkgQEAKIGVuZGlmCiAKICQob2JqKS96SW1hZ2U6CQkkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQotCUBybSAtZiAkQDsgbG4gJDwgJEAKKwkkKFEpcm0gLWYgJEA7IGxuICQ8ICRACiAkKG9iaikvekltYWdlLmluaXRyZDoJJChhZGRwcmVmaXggJChvYmopLywgJChpbml0cmQteSkpCi0JQHJtIC1mICRAOyBsbiAkPCAkQAorCSQoUSlybSAtZiAkQDsgbG4gJDwgJEAKIAogIyBPbmx5IGluc3RhbGwgdGhlIHZtbGludXgKIGluc3RhbGw6ICQoQ09ORklHVVJFKSAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGltYWdlLXkpKQpAQCAtNDEwLDggKzQzMyw5IEBACiAJekltYWdlLm1hcGxlIHNpbXBsZUltYWdlLiogb3RoZXJvcy5ibGQgKi5kdGIKIAogIyBjbGVhbiB1cCBmaWxlcyBjYWNoZWQgYnkgd3JhcHBlcgotY2xlYW4ta2VybmVsIDo9IHZtbGludXguc3RyaXAgdm1saW51eC5iaW4KLWNsZWFuLWtlcm5lbCArPSAkKGFkZHN1ZmZpeCAuZ3osJChjbGVhbi1rZXJuZWwpKQorY2xlYW4ta2VybmVsLWJhc2UgOj0gdm1saW51eC5zdHJpcCB2bWxpbnV4LmJpbgorY2xlYW4ta2VybmVsIDo9ICQoYWRkc3VmZml4IC5neiwkKGNsZWFuLWtlcm5lbC1iYXNlKSkKK2NsZWFuLWtlcm5lbCArPSAkKGFkZHN1ZmZpeCAueHosJChjbGVhbi1rZXJuZWwtYmFzZSkpCiAjIElmIG5vdCBhYnNvbHV0ZSBjbGVhbi1maWxlcyBhcmUgcmVsYXRpdmUgdG8gJChvYmopLgogY2xlYW4tZmlsZXMgKz0gJChhZGRwcmVmaXggJChvYmp0cmVlKS8sICQoY2xlYW4ta2VybmVsKSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LWMyay5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvY3Vib290LWMyay5jCmluZGV4IGU0MzU5NDkuLjkzMDljNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2N1Ym9vdC1jMmsuYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9jdWJvb3QtYzJrLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlICJpby5oIgogI2luY2x1ZGUgIm9wcy5oIgogI2luY2x1ZGUgImVsZi5oIgotI2luY2x1ZGUgImd1bnppcF91dGlsLmgiCiAjaW5jbHVkZSAibXY2NHg2MC5oIgogI2luY2x1ZGUgImN1Ym9vdC5oIgogI2luY2x1ZGUgInBwY2Jvb3QuaCIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2RlY29tcHJlc3MuYyBiL2FyY2gvcG93ZXJwYy9ib290L2RlY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWZmNDQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGVjb21wcmVzcy5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogV3JhcHBlciBhcm91bmQgdGhlIGtlcm5lbCdzIHByZS1ib290IGRlY29tcHJlc3Npb24gbGlicmFyeS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiAyMDE2LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgImVsZi5oIgorI2luY2x1ZGUgInBhZ2UuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzdGRpby5oIgorI2luY2x1ZGUgIm9wcy5oIgorI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisKKy8qCisgKiBUaGUgZGVjb21wcmVzc29yXyouYyBmaWxlcyBwbGF5ICNpZmRlZiBnYW1lcyBzbyB0aGV5IGNhbiBiZSB1c2VkIGluIGJvdGgKKyAqIHByZS1ib290IGFuZCByZWd1bGFyIGtlcm5lbCBjb2RlLiBXZSBuZWVkIHRoZXNlIGRlZmluaXRpb25zIHRvIG1ha2UgdGhlCisgKiBpbmNsdWRlcyB3b3JrLgorICovCisKKyNkZWZpbmUgU1RBVElDIHN0YXRpYworI2RlZmluZSBJTklUCisjZGVmaW5lIF9fYWx3YXlzX2lubGluZSBpbmxpbmUKKworLyoKKyAqIFRoZSBidWlsZCBwcm9jZXNzIHdpbGwgY29weSB0aGUgcmVxdWlyZWQgemxpYiBzb3VyY2UgZmlsZXMgYW5kIGhlYWRlcnMKKyAqIG91dCBvZiBsaWIvIGFuZCAiZml4IiB0aGUgaW5jbHVkZXMgc28gdGhleSBkbyBub3QgcHVsbCBpbiBvdGhlciBrZXJuZWwKKyAqIGhlYWRlcnMuCisgKi8KKworI2lmZGVmIENPTkZJR19LRVJORUxfR1pJUAorIwlpbmNsdWRlICJkZWNvbXByZXNzX2luZmxhdGUuYyIKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0tFUk5FTF9YWgorIwlpbmNsdWRlICJ4el9jb25maWcuaCIKKyMJaW5jbHVkZSAiLi4vLi4vLi4vbGliL2RlY29tcHJlc3NfdW54ei5jIgorI2VuZGlmCisKKy8qIGdsb2JhbHMgZm9yIHRyYWNraW5nIHRoZSBzdGF0ZSBvZiB0aGUgZGVjb21wcmVzc2lvbiAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVjb21wcmVzc2VkX2J5dGVzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbGltaXQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBza2lwOworc3RhdGljIGNoYXIgKm91dHB1dF9idWZmZXI7CisKKy8qCisgKiBmbHVzaCgpIGlzIGNhbGxlZCBieSBfX2RlY29tcHJlc3MoKSB3aGVuIHRoZSBkZWNvbXByZXNzb3IncyBzY3JhdGNoIGJ1ZmZlciBpcworICogZnVsbC4KKyAqLworc3RhdGljIGxvbmcgZmx1c2godm9pZCAqdiwgdW5zaWduZWQgbG9uZyBidWZmZXJfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGVuZCA9IGRlY29tcHJlc3NlZF9ieXRlcyArIGJ1ZmZlcl9zaXplOworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGJ1ZmZlcl9zaXplOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKwljaGFyICppbiA9IHY7CisJY2hhciAqb3V0OworCisJLyoKKwkgKiBpZiB3ZSBoaXQgb3VyIGRlY29tcHJlc3Npb24gbGltaXQsIHdlIG5lZWQgdG8gZmFrZSBhbiBlcnJvciB0byBhYm9ydAorCSAqIHRoZSBpbi1wcm9ncmVzcyBkZWNvbXByZXNzaW9uLgorCSAqLworCWlmIChkZWNvbXByZXNzZWRfYnl0ZXMgPj0gbGltaXQpCisJCXJldHVybiAtMTsKKworCS8qIHNraXAgdGhpcyBlbnRpcmUgYmxvY2sgKi8KKwlpZiAoZW5kIDw9IHNraXApIHsKKwkJZGVjb21wcmVzc2VkX2J5dGVzICs9IGJ1ZmZlcl9zaXplOworCQlyZXR1cm4gYnVmZmVyX3NpemU7CisJfQorCisJLyogc2tpcCBzb21lIGRhdGEgYXQgdGhlIHN0YXJ0LCBidXQga2VlcCB0aGUgcmVzdCBvZiB0aGUgYmxvY2sgKi8KKwlpZiAoZGVjb21wcmVzc2VkX2J5dGVzIDwgc2tpcCAmJiBlbmQgPiBza2lwKSB7CisJCW9mZnNldCA9IHNraXAgLSBkZWNvbXByZXNzZWRfYnl0ZXM7CisKKwkJaW4gKz0gb2Zmc2V0OworCQlzaXplIC09IG9mZnNldDsKKwkJZGVjb21wcmVzc2VkX2J5dGVzICs9IG9mZnNldDsKKwl9CisKKwlvdXQgPSAmb3V0cHV0X2J1ZmZlcltkZWNvbXByZXNzZWRfYnl0ZXMgLSBza2lwXTsKKwlzaXplID0gbWluKGRlY29tcHJlc3NlZF9ieXRlcyArIHNpemUsIGxpbWl0KSAtIGRlY29tcHJlc3NlZF9ieXRlczsKKworCW1lbWNweShvdXQsIGluLCBzaXplKTsKKwlkZWNvbXByZXNzZWRfYnl0ZXMgKz0gc2l6ZTsKKworCXJldHVybiBidWZmZXJfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZXJyKGNoYXIgKnMpCit7CisJLyogc3VwcHJlc3MgdGhlICJlcnJvciIgd2hlbiB3ZSB0ZXJtaW5hdGUgdGhlIGRlY29tcHJlc3NvciAqLworCWlmIChkZWNvbXByZXNzZWRfYnl0ZXMgPj0gbGltaXQpCisJCXJldHVybjsKKworCXByaW50ZigiRGVjb21wcmVzc2lvbiBlcnJvcjogJyVzJ1xuXHIiLCBzKTsKK30KKworLyoqCisgKiBwYXJ0aWFsX2RlY29tcHJlc3MgLSBkZWNvbXByZXNzZXMgcGFydCBvciBhbGwgb2YgYSBjb21wcmVzc2VkIGJ1ZmZlcgorICogQGluYnVmOiAgICAgICBpbnB1dCBidWZmZXIKKyAqIEBpbnB1dF9zaXplOiAgbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIKKyAqIEBvdXRidWY6ICAgICAgaW5wdXQgYnVmZmVyCisgKiBAb3V0cHV0X3NpemU6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyCisgKiBAc2tpcCAgICAgICAgIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgdG8gaWdub3JlCisgKgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBjb21wcmVzc2VkIGRhdGEgZnJvbSBpbmJ1ZiwgZGVjb21wcmVzc2VzIGFuZCB3cml0ZSBpdCB0bworICogb3V0YnVmLiBPbmNlIG91dHB1dF9zaXplIGJ5dGVzIGFyZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBvciB0aGUKKyAqIHN0cmVhbSBpcyBleGhhdXN0ZWQgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlCisgKiBkZWNvbXByZXNzZWQuIE90aGVyd2lzZSBpdCB3aWxsIHJldHVybiB3aGF0ZXZlciBlcnJvciBjb2RlIHRoZSBkZWNvbXByZXNzb3IKKyAqIHJlcG9ydGVkIChOQjogVGhpcyBpcyBzcGVjaWZpYyB0byBlYWNoIGRlY29tcHJlc3NvciB0eXBlKS4KKyAqCisgKiBUaGUgc2tpcCBmdW5jdGlvbmFsaXR5IGlzIG1haW5seSB0aGVyZSBzbyB0aGUgcHJvZ3JhbSBhbmQgZGlzY292ZXIKKyAqIHRoZSBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGltYWdlIHNvIHRoYXQgaXQgY2FuIGFzayBmaXJtd2FyZSAoaWYgcHJlc2VudCkKKyAqIGZvciBhbiBhcHByb3ByaWF0ZWx5IHNpemVkIGJ1ZmZlci4KKyAqLworbG9uZyBwYXJ0aWFsX2RlY29tcHJlc3Modm9pZCAqaW5idWYsIHVuc2lnbmVkIGxvbmcgaW5wdXRfc2l6ZSwKKwl2b2lkICpvdXRidWYsIHVuc2lnbmVkIGxvbmcgb3V0cHV0X3NpemUsIHVuc2lnbmVkIGxvbmcgX3NraXApCit7CisJaW50IHJldDsKKworCS8qCisJICogVGhlIHNraXBwZWQgYnl0ZXMgbmVlZHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHNpemUgb2YgZGF0YSB3ZSB3YW50CisJICogdG8gZGVjb21wcmVzcy4KKwkgKi8KKwlvdXRwdXRfc2l6ZSArPSBfc2tpcDsKKworCWRlY29tcHJlc3NlZF9ieXRlcyA9IDA7CisJb3V0cHV0X2J1ZmZlciA9IG91dGJ1ZjsKKwlsaW1pdCA9IG91dHB1dF9zaXplOworCXNraXAgPSBfc2tpcDsKKworCXJldCA9IF9fZGVjb21wcmVzcyhpbmJ1ZiwgaW5wdXRfc2l6ZSwgTlVMTCwgZmx1c2gsIG91dGJ1ZiwKKwkJb3V0cHV0X3NpemUsIE5VTEwsIHByaW50X2Vycik7CisKKwkvKgorCSAqIElmIGRlY29tcHJlc3Npb24gd2FzIGFib3J0ZWQgZHVlIHRvIGFuIGFjdHVhbCBlcnJvciByYXRoZXIgdGhhbgorCSAqIGEgZmFrZSBlcnJvciB0aGF0IHdlIHVzZWQgdG8gYWJvcnQsIHRoZW4gd2Ugc2hvdWxkIHJlcG9ydCBpdC4KKwkgKi8KKwlpZiAoZGVjb21wcmVzc2VkX2J5dGVzIDwgbGltaXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gZGVjb21wcmVzc2VkX2J5dGVzIC0gc2tpcDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2ZpeHVwLWhlYWRlcnMuc2VkIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZml4dXAtaGVhZGVycy5zZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYzNjI0MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2ZpeHVwLWhlYWRlcnMuc2VkCkBAIC0wLDAgKzEsMTIgQEAKKyMgQ29weXJpZ2h0IDIwMTYgSUJNIENvcnBvcmF0aW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvciBsYXRlciBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworc0AjaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy9tbVwuaD5AQDsKK3NAXCJ6bGliX2luZmxhdGUvXChbXlwiXSpcKS4qQCJcMSJAOworc0A8bGludXgva2VybmVsLmg+QDxzdGRkZWYuaD5AOworCitzQF9fdXNlZEBAOworc0A8bGludXgvXChbXj5dKlwpLipAIlwxIkA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9ndW56aXBfdXRpbC5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZ3VuemlwX3V0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjNTI1MC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9ndW56aXBfdXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNyBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KLSAqIEJhc2VkIG9uIGVhcmxpZXIgd29yaywgQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAxOTk3LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgInN0cmluZy5oIgotI2luY2x1ZGUgInN0ZGlvLmgiCi0jaW5jbHVkZSAib3BzLmgiCi0jaW5jbHVkZSAiZ3VuemlwX3V0aWwuaCIKLQotI2RlZmluZSBIRUFEX0NSQwkyCi0jZGVmaW5lIEVYVFJBX0ZJRUxECTQKLSNkZWZpbmUgT1JJR19OQU1FCTgKLSNkZWZpbmUgQ09NTUVOVAkJMHgxMAotI2RlZmluZSBSRVNFUlZFRAkweGUwCi0KLS8qKgotICogZ3VuemlwX3N0YXJ0IC0gcHJlcGFyZSB0byBkZWNvbXByZXNzIGd6aXAgZGF0YQotICogQHN0YXRlOiAgICAgZGVjb21wcmVzc29yIHN0YXRlIHN0cnVjdHVyZSB0byBiZSBpbml0aWFsaXplZAotICogQHNyYzogICAgICAgYnVmZmVyIGNvbnRhaW5pbmcgZ3ppcCBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCBkYXRhCi0gKiBAc3JjbGVuOiAgICBzaXplIGluIGJ5dGVzIG9mIHRoZSBidWZmZXIgYXQgc3JjCi0gKgotICogSWYgdGhlIGJ1ZmZlciBhdCBAc3JjIGNvbnRhaW5zIGEgZ3ppcCBoZWFkZXIsIHRoaXMgZnVuY3Rpb24KLSAqIGluaXRpYWxpemVzIHpsaWIgdG8gZGVjb21wcmVzcyB0aGUgZGF0YSwgc3RvcmluZyB0aGUgZGVjb21wcmVzc2lvbgotICogc3RhdGUgaW4gQHN0YXRlLiAgVGhlIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgY2FuIHRoZW4gYmUgdXNlZAotICogdG8gZGVjb21wcmVzcyBkYXRhIGZyb20gdGhlIGd6aXBwZWQgc3RyZWFtLgotICoKLSAqIElmIHRoZSBidWZmZXIgYXQgQHNyYyBkb2VzIG5vdCBjb250YWluIGEgZ3ppcCBoZWFkZXIsIGl0IGlzIGFzc3VtZWQKLSAqIHRvIGNvbnRhaW4gdW5jb21wcmVzc2VkIGRhdGEuICBUaGUgYnVmZmVyIGluZm9ybWF0aW9uIGlzIHJlY29yZGVkCi0gKiBpbiBAc3RhdGUgYW5kIHRoZSBvdGhlciBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIHdpbGwgc2ltcGx5IGNvcHkKLSAqIGRhdGEgZnJvbSB0aGUgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtIGF0IEBzcmMuCi0gKgotICogQW55IGVycm9ycywgc3VjaCBhcyBiYWQgY29tcHJlc3NlZCBkYXRhLCBjYXVzZSBhbiBlcnJvciB0byBiZQotICogcHJpbnRlZCBhbiB0aGUgcGxhdGZvcm0ncyBleGl0KCkgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLgotICovCi12b2lkIGd1bnppcF9zdGFydChzdHJ1Y3QgZ3VuemlwX3N0YXRlICpzdGF0ZSwgdm9pZCAqc3JjLCBpbnQgc3JjbGVuKQotewotCWNoYXIgKmhkciA9IHNyYzsKLQlpbnQgaGRybGVuID0gMDsKLQotCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKCpzdGF0ZSkpOwotCi0JLyogQ2hlY2sgZm9yIGd6aXAgbWFnaWMgbnVtYmVyICovCi0JaWYgKChoZHJbMF0gPT0gMHgxZikgJiYgKGhkclsxXSA9PSAweDhiKSkgewotCQkvKiBnemlwIGRhdGEsIGluaXRpYWxpemUgemxpYiBwYXJhbWV0ZXJzICovCi0JCWludCByLCBmbGFnczsKLQotCQlzdGF0ZS0+cy53b3Jrc3BhY2UgPSBzdGF0ZS0+c2NyYXRjaDsKLQkJaWYgKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCkgPiBzaXplb2Yoc3RhdGUtPnNjcmF0Y2gpKQotCQkJZmF0YWwoImluc3VmZmljaWVudCBzY3JhdGNoIHNwYWNlIGZvciBndW56aXBcblxyIik7Ci0KLQkJLyogc2tpcCBoZWFkZXIgKi8KLQkJaGRybGVuID0gMTA7Ci0JCWZsYWdzID0gaGRyWzNdOwotCQlpZiAoaGRyWzJdICE9IFpfREVGTEFURUQgfHwgKGZsYWdzICYgUkVTRVJWRUQpICE9IDApCi0JCQlmYXRhbCgiYmFkIGd6aXBwZWQgZGF0YVxuXHIiKTsKLQkJaWYgKChmbGFncyAmIEVYVFJBX0ZJRUxEKSAhPSAwKQotCQkJaGRybGVuID0gMTIgKyBoZHJbMTBdICsgKGhkclsxMV0gPDwgOCk7Ci0JCWlmICgoZmxhZ3MgJiBPUklHX05BTUUpICE9IDApCi0JCQl3aGlsZSAoaGRyW2hkcmxlbisrXSAhPSAwKQotCQkJCTsKLQkJaWYgKChmbGFncyAmIENPTU1FTlQpICE9IDApCi0JCQl3aGlsZSAoaGRyW2hkcmxlbisrXSAhPSAwKQotCQkJCTsKLQkJaWYgKChmbGFncyAmIEhFQURfQ1JDKSAhPSAwKQotCQkJaGRybGVuICs9IDI7Ci0JCWlmIChoZHJsZW4gPj0gc3JjbGVuKQotCQkJZmF0YWwoImd1bnppcF9zdGFydDogcmFuIG91dCBvZiBkYXRhIGluIGhlYWRlclxuXHIiKTsKLQotCQlyID0gemxpYl9pbmZsYXRlSW5pdDIoJnN0YXRlLT5zLCAtTUFYX1dCSVRTKTsKLQkJaWYgKHIgIT0gWl9PSykKLQkJCWZhdGFsKCJpbmZsYXRlSW5pdDIgcmV0dXJuZWQgJWRcblxyIiwgcik7Ci0JfQotCi0Jc3RhdGUtPnMudG90YWxfaW4gPSBoZHJsZW47Ci0Jc3RhdGUtPnMubmV4dF9pbiA9IHNyYyArIGhkcmxlbjsKLQlzdGF0ZS0+cy5hdmFpbF9pbiA9IHNyY2xlbiAtIGhkcmxlbjsKLX0KLQotLyoqCi0gKiBndW56aXBfcGFydGlhbCAtIGV4dHJhY3QgYnl0ZXMgZnJvbSBhIGd6aXAgZGF0YSBzdHJlYW0KLSAqIEBzdGF0ZTogICAgIGd6aXAgc3RhdGUgc3RydWN0dXJlIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgZ3VuemlwX3N0YXJ0KCkKLSAqIEBkc3Q6ICAgICAgIGJ1ZmZlciB0byBzdG9yZSBleHRyYWN0ZWQgZGF0YQotICogQGRzdGxlbjogICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gZXh0cmFjdAotICoKLSAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgYXQgbW9zdCBAZHN0bGVuIGJ5dGVzIGZyb20gdGhlIGRhdGEgc3RyZWFtCi0gKiBwcmV2aW91c2x5IGFzc29jaWF0ZWQgd2l0aCBAc3RhdGUgYnkgZ3VuemlwX3N0YXJ0KCksIGRlY29tcHJlc3NpbmcKLSAqIGlmIG5lY2Vzc2FyeS4gIEV4YWN0bHkgQGRzdGxlbiBieXRlcyBhcmUgZXh0cmFjdGVkIHVubGVzcyB0aGUgZGF0YQotICogc3RyZWFtIGRvZXNuJ3QgY29udGFpbiBlbm91Z2ggYnl0ZXMsIGluIHdoaWNoIGNhc2UgdGhlIGVudGlyZQotICogcmVtYWluZGVyIG9mIHRoZSBzdHJlYW0gaXMgZGVjb21wcmVzc2VkLgotICoKLSAqIFJldHVybnMgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgZXh0cmFjdGVkLiAgSWYgYW55IGVycm9ycyBvY2N1ciwKLSAqIHN1Y2ggYXMgYSBjb3JydXB0ZWQgY29tcHJlc3NlZCBzdHJlYW0sIGFuIGVycm9yIGlzIHByaW50ZWQgYW4gdGhlCi0gKiBwbGF0Zm9ybSdzIGV4aXQoKSBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gKi8KLWludCBndW56aXBfcGFydGlhbChzdHJ1Y3QgZ3VuemlwX3N0YXRlICpzdGF0ZSwgdm9pZCAqZHN0LCBpbnQgZHN0bGVuKQotewotCWludCBsZW47Ci0KLQlpZiAoc3RhdGUtPnMud29ya3NwYWNlKSB7Ci0JCS8qIGd1bnppcHBpbmcgKi8KLQkJaW50IHI7Ci0KLQkJc3RhdGUtPnMubmV4dF9vdXQgPSBkc3Q7Ci0JCXN0YXRlLT5zLmF2YWlsX291dCA9IGRzdGxlbjsKLQkJciA9IHpsaWJfaW5mbGF0ZSgmc3RhdGUtPnMsIFpfRlVMTF9GTFVTSCk7Ci0JCWlmIChyICE9IFpfT0sgJiYgciAhPSBaX1NUUkVBTV9FTkQpCi0JCQlmYXRhbCgiaW5mbGF0ZSByZXR1cm5lZCAlZCBtc2c6ICVzXG5cciIsIHIsIHN0YXRlLT5zLm1zZyk7Ci0JCWxlbiA9IHN0YXRlLT5zLm5leHRfb3V0IC0gKEJ5dGUgKilkc3Q7Ci0JfSBlbHNlIHsKLQkJLyogdW5jb21wcmVzc2VkIGltYWdlICovCi0JCWxlbiA9IG1pbihzdGF0ZS0+cy5hdmFpbF9pbiwgKHVMb25nKWRzdGxlbik7Ci0JCW1lbWNweShkc3QsIHN0YXRlLT5zLm5leHRfaW4sIGxlbik7Ci0JCXN0YXRlLT5zLm5leHRfaW4gKz0gbGVuOwotCQlzdGF0ZS0+cy5hdmFpbF9pbiAtPSBsZW47Ci0JfQotCXJldHVybiBsZW47Ci19Ci0KLS8qKgotICogZ3VuemlwX2V4YWN0bHkgLSBleHRyYWN0IGEgZml4ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYSBnemlwIGRhdGEgc3RyZWFtCi0gKiBAc3RhdGU6ICAgICBnemlwIHN0YXRlIHN0cnVjdHVyZSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGJ5IGd1bnppcF9zdGFydCgpCi0gKiBAZHN0OiAgICAgICBidWZmZXIgdG8gc3RvcmUgZXh0cmFjdGVkIGRhdGEKLSAqIEBkc3RsZW46ICAgIG51bWJlciBvZiBieXRlcyB0byBleHRyYWN0Ci0gKgotICogVGhpcyBmdW5jdGlvbiBleHRyYWN0cyBleGFjdGx5IEBkc3RsZW4gYnl0ZXMgZnJvbSB0aGUgZGF0YSBzdHJlYW0KLSAqIHByZXZpb3VzbHkgYXNzb2NpYXRlZCB3aXRoIEBzdGF0ZSBieSBndW56aXBfc3RhcnQoKSwgZGVjb21wcmVzc2luZwotICogaWYgbmVjZXNzYXJ5LgotICoKLSAqIElmIHRoZXJlIGFyZSBsZXNzIEBkc3RsZW4gYnl0ZXMgYXZhaWxhYmxlIGluIHRoZSBkYXRhIHN0cmVhbSwgb3IgaWYKLSAqIGFueSBvdGhlciBlcnJvcnMgb2NjdXIsIHN1Y2ggYXMgYSBjb3JydXB0ZWQgY29tcHJlc3NlZCBzdHJlYW0sIGFuCi0gKiBlcnJvciBpcyBwcmludGVkIGFuIHRoZSBwbGF0Zm9ybSdzIGV4aXQoKSBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gKi8KLXZvaWQgZ3VuemlwX2V4YWN0bHkoc3RydWN0IGd1bnppcF9zdGF0ZSAqc3RhdGUsIHZvaWQgKmRzdCwgaW50IGRzdGxlbikKLXsKLQlpbnQgbGVuOwotCi0JbGVuICA9IGd1bnppcF9wYXJ0aWFsKHN0YXRlLCBkc3QsIGRzdGxlbik7Ci0JaWYgKGxlbiA8IGRzdGxlbikKLQkJZmF0YWwoIlxuXHJndW56aXBfZXhhY3RseTogcmFuIG91dCBvZiBkYXRhISIKLQkJCQkiIFdhbnRlZCAlZCwgZ290ICVkLlxuXHIiLCBkc3RsZW4sIGxlbik7Ci19Ci0KLS8qKgotICogZ3VuemlwX2Rpc2NhcmQgLSBkaXNjYXJkIGJ5dGVzIGZyb20gYSBnemlwIGRhdGEgc3RyZWFtCi0gKiBAc3RhdGU6ICAgICBnemlwIHN0YXRlIHN0cnVjdHVyZSBwcmV2aW91c2x5IGluaXRpYWxpemVkIGJ5IGd1bnppcF9zdGFydCgpCi0gKiBAbGVuOiAgICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gZGlzY2FyZAotICoKLSAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMsIHRoZW4gZGlzY2FyZHMgZXhhY3RseSBAbGVuIGJ5dGVzIGZyb20gdGhlCi0gKiBkYXRhIHN0cmVhbSBwcmV2aW91c2x5IGFzc29jaWF0ZWQgd2l0aCBAc3RhdGUgYnkgZ3VuemlwX3N0YXJ0KCkuCi0gKiBTdWJzZXF1ZW50IGd1bnppcF9wYXJ0aWFsKCksIGd1bnppcF9leGFjdGx5KCkgb3IgZ3VuemlwX2ZpbmlzaCgpCi0gKiBjYWxscyB3aWxsIGV4dHJhY3QgdGhlIGRhdGEgZm9sbG93aW5nIHRoZSBkaXNjYXJkZWQgYnl0ZXMgaW4gdGhlCi0gKiBkYXRhIHN0cmVhbS4KLSAqCi0gKiBJZiB0aGVyZSBhcmUgbGVzcyBAbGVuIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgZGF0YSBzdHJlYW0sIG9yIGlmCi0gKiBhbnkgb3RoZXIgZXJyb3JzIG9jY3VyLCBzdWNoIGFzIGEgY29ycnVwdGVkIGNvbXByZXNzZWQgc3RyZWFtLCBhbgotICogZXJyb3IgaXMgcHJpbnRlZCBhbiB0aGUgcGxhdGZvcm0ncyBleGl0KCkgZnVuY3Rpb24gaXMgY2FsbGVkLgotICovCi12b2lkIGd1bnppcF9kaXNjYXJkKHN0cnVjdCBndW56aXBfc3RhdGUgKnN0YXRlLCBpbnQgbGVuKQotewotCXN0YXRpYyBjaGFyIGRpc2NhcmRfYnVmWzEyOF07Ci0KLQl3aGlsZSAobGVuID4gc2l6ZW9mKGRpc2NhcmRfYnVmKSkgewotCQlndW56aXBfZXhhY3RseShzdGF0ZSwgZGlzY2FyZF9idWYsIHNpemVvZihkaXNjYXJkX2J1ZikpOwotCQlsZW4gLT0gc2l6ZW9mKGRpc2NhcmRfYnVmKTsKLQl9Ci0KLQlpZiAobGVuID4gMCkKLQkJZ3VuemlwX2V4YWN0bHkoc3RhdGUsIGRpc2NhcmRfYnVmLCBsZW4pOwotfQotCi0vKioKLSAqIGd1bnppcF9maW5pc2ggLSBleHRyYWN0IGFsbCByZW1haW5pbmcgYnl0ZXMgZnJvbSBhIGd6aXAgZGF0YSBzdHJlYW0KLSAqIEBzdGF0ZTogICAgIGd6aXAgc3RhdGUgc3RydWN0dXJlIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgZ3VuemlwX3N0YXJ0KCkKLSAqIEBkc3Q6ICAgICAgIGJ1ZmZlciB0byBzdG9yZSBleHRyYWN0ZWQgZGF0YQotICogQGRzdGxlbjogICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gZXh0cmFjdAotICoKLSAqIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgYWxsIHJlbWFpbmluZyBkYXRhLCBvciBhdCBtb3N0IEBkc3RsZW4KLSAqIGJ5dGVzLCBmcm9tIHRoZSBzdHJlYW0gcHJldmlvdXNseSBhc3NvY2lhdGVkIHdpdGggQHN0YXRlIGJ5Ci0gKiBndW56aXBfc3RhcnQoKS4gIHpsaWIgaXMgdGhlbiBzaHV0IGRvd24sIHNvIGl0IGlzIGFuIGVycm9yIHRvIHVzZQotICogYW55IG9mIHRoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIG9uIEBzdGF0ZSB1bnRpbCBpdCBpcwotICogcmUtaW5pdGlhbGl6ZWQgd2l0aCBhbm90aGVyIGNhbGwgdG8gZ3VuemlwX3N0YXJ0KCkuCi0gKgotICogSWYgYW55IGVycm9ycyBvY2N1ciwgc3VjaCBhcyBhIGNvcnJ1cHRlZCBjb21wcmVzc2VkIHN0cmVhbSwgYW4KLSAqIGVycm9yIGlzIHByaW50ZWQgYW4gdGhlIHBsYXRmb3JtJ3MgZXhpdCgpIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAqLwotaW50IGd1bnppcF9maW5pc2goc3RydWN0IGd1bnppcF9zdGF0ZSAqc3RhdGUsIHZvaWQgKmRzdCwgaW50IGRzdGxlbikKLXsKLQlpbnQgbGVuOwotCi0JbGVuID0gZ3VuemlwX3BhcnRpYWwoc3RhdGUsIGRzdCwgZHN0bGVuKTsKLQotCWlmIChzdGF0ZS0+cy53b3Jrc3BhY2UpIHsKLQkJemxpYl9pbmZsYXRlRW5kKCZzdGF0ZS0+cyk7Ci0JfQotCi0JcmV0dXJuIGxlbjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2d1bnppcF91dGlsLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9ndW56aXBfdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2RmYTZlLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2d1bnppcF91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogRGVjb21wcmVzc2lvbiBjb252ZW5pZW5jZSBmdW5jdGlvbnMKLSAqCi0gKiBDb3B5cmlnaHQgMjAwNyBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKLSAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqLwotI2lmbmRlZiBfUFBDX0JPT1RfR1VOWklQX1VUSUxfSF8KLSNkZWZpbmUgX1BQQ19CT09UX0dVTlpJUF9VVElMX0hfCi0KLSNpbmNsdWRlICJ6bGliLmgiCi0KLS8qCi0gKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIHRvIG1ha2UgbGlmZSBlYXN5IGZvciBkZWNvbXByZXNzaW5nCi0gKiBrZXJuZWwgaW1hZ2VzLCBpbml0cmQgaW1hZ2VzIG9yIGFueSBvdGhlciBnemlwIGNvbXByZXNzZWQgaW1hZ2UsCi0gKiBwYXJ0aWN1bGFybHkgaWYgaXRzIHVzZWZ1bCB0byBkZWNvbXByZXNzIHBhcnQgb2YgdGhlIGltYWdlIChlLmcuIHRvCi0gKiBleGFtaW5lIGhlYWRlcnMpIGJlZm9yZSBkZWNvbXByZXNzaW5nIHRoZSByZW1haW5kZXIuCi0gKgotICogVG8gdXNlOgotICogICAgIC0gZGVjbGFyZSBhIGd1bnppcF9zdGF0ZSBzdHJ1Y3R1cmUKLSAqICAgICAtIHVzZSBndW56aXBfc3RhcnQoKSB0byBpbml0aWFsaXplIHRoZSBzdGF0ZSwgYXNzb2NpYXRpbmcgaXQKLSAqICAgICAgIHdpdGggYSBzdHJlYW0gb2YgY29tcHJlc3NlZCBkYXRhCi0gKiAgICAgLSB1c2UgZ3VuemlwX3BhcnRpYWwoKSwgZ3VuemlwX2V4YWN0bHkoKSBhbmQgZ3VuemlwX2Rpc2NhcmQoKQotICogICAgICAgaW4gYW55IGNvbWJpbmF0aW9uIHRvIGV4dHJhY3QgcGllY2VzIG9mIGRhdGEgZnJvbSB0aGUgc3RyZWFtCi0gKiAgICAgLSBGaW5hbGx5IHVzZSBndW56aXBfZmluaXNoKCkgdG8gZXh0cmFjdCB0aGUgdGFpbCBvZiB0aGUKLSAqICAgICAgIGNvbXByZXNzZWQgc3RyZWFtIGFuZCB3aW5kIHVwIHpsaWIKLSAqLwotCi0vKiBzY3JhdGNoIHNwYWNlIGZvciBndW56aXA7IDQ2OTEyIGlzIGZyb20gemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSAqLwotI2RlZmluZSBHVU5aSVBfU0NSQVRDSF9TSVpFCTQ2OTEyCi0KLXN0cnVjdCBndW56aXBfc3RhdGUgewotCXpfc3RyZWFtIHM7Ci0JY2hhciBzY3JhdGNoWzQ2OTEyXTsKLX07Ci0KLXZvaWQgZ3VuemlwX3N0YXJ0KHN0cnVjdCBndW56aXBfc3RhdGUgKnN0YXRlLCB2b2lkICpzcmMsIGludCBzcmNsZW4pOwotaW50IGd1bnppcF9wYXJ0aWFsKHN0cnVjdCBndW56aXBfc3RhdGUgKnN0YXRlLCB2b2lkICpkc3QsIGludCBkc3RsZW4pOwotdm9pZCBndW56aXBfZXhhY3RseShzdHJ1Y3QgZ3VuemlwX3N0YXRlICpzdGF0ZSwgdm9pZCAqZHN0LCBpbnQgbGVuKTsKLXZvaWQgZ3VuemlwX2Rpc2NhcmQoc3RydWN0IGd1bnppcF9zdGF0ZSAqc3RhdGUsIGludCBsZW4pOwotaW50IGd1bnppcF9maW5pc2goc3RydWN0IGd1bnppcF9zdGF0ZSAqc3RhdGUsIHZvaWQgKmRzdCwgaW50IGxlbik7Ci0KLSNlbmRpZiAvKiBfUFBDX0JPT1RfR1VOWklQX1VUSUxfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L21haW4uYyBiL2FyY2gvcG93ZXJwYy9ib290L21haW4uYwppbmRleCBkODAxNjFiLi5mN2ExODRiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCkBAIC0xNSwxMSArMTUsOCBAQAogI2luY2x1ZGUgInN0cmluZy5oIgogI2luY2x1ZGUgInN0ZGlvLmgiCiAjaW5jbHVkZSAib3BzLmgiCi0jaW5jbHVkZSAiZ3VuemlwX3V0aWwuaCIKICNpbmNsdWRlICJyZWcuaCIKIAotc3RhdGljIHN0cnVjdCBndW56aXBfc3RhdGUgZ3pzdGF0ZTsKLQogc3RydWN0IGFkZHJfcmFuZ2UgewogCXZvaWQgKmFkZHI7CiAJdW5zaWduZWQgbG9uZyBzaXplOwpAQCAtMzAsMTUgKzI3LDE0IEBACiBzdGF0aWMgc3RydWN0IGFkZHJfcmFuZ2UgcHJlcF9rZXJuZWwodm9pZCkKIHsKIAljaGFyIGVsZmhlYWRlclsyNTZdOwotCXZvaWQgKnZtbGludXpfYWRkciA9IF92bWxpbnV4X3N0YXJ0OworCXVuc2lnbmVkIGNoYXIgKnZtbGludXpfYWRkciA9ICh1bnNpZ25lZCBjaGFyICopX3ZtbGludXhfc3RhcnQ7CiAJdW5zaWduZWQgbG9uZyB2bWxpbnV6X3NpemUgPSBfdm1saW51eF9lbmQgLSBfdm1saW51eF9zdGFydDsKIAl2b2lkICphZGRyID0gMDsKIAlzdHJ1Y3QgZWxmX2luZm8gZWk7Ci0JaW50IGxlbjsKKwlsb25nIGxlbjsKIAotCS8qIGd1bnppcCB0aGUgRUxGIGhlYWRlciBvZiB0aGUga2VybmVsICovCi0JZ3VuemlwX3N0YXJ0KCZnenN0YXRlLCB2bWxpbnV6X2FkZHIsIHZtbGludXpfc2l6ZSk7Ci0JZ3VuemlwX2V4YWN0bHkoJmd6c3RhdGUsIGVsZmhlYWRlciwgc2l6ZW9mKGVsZmhlYWRlcikpOworCXBhcnRpYWxfZGVjb21wcmVzcyh2bWxpbnV6X2FkZHIsIHZtbGludXpfc2l6ZSwKKwkJZWxmaGVhZGVyLCBzaXplb2YoZWxmaGVhZGVyKSwgMCk7CiAKIAlpZiAoIXBhcnNlX2VsZjY0KGVsZmhlYWRlciwgJmVpKSAmJiAhcGFyc2VfZWxmMzIoZWxmaGVhZGVyLCAmZWkpKQogCQlmYXRhbCgiRXJyb3I6IG5vdCBhIHZhbGlkIFBQQzMyIG9yIFBQQzY0IEVMRiBmaWxlIVxuXHIiKTsKQEAgLTUxLDcgKzQ3LDcgQEAKIAkgKiB0aGUga2VybmVsIGJzcyBtdXN0IGJlIGNsYWltZWQgKGl0IHdpbGwgYmUgemVybydkIGJ5IHRoZQogCSAqIGtlcm5lbCBpdHNlbGYpCiAJICovCi0JcHJpbnRmKCJBbGxvY2F0aW5nIDB4JWx4IGJ5dGVzIGZvciBrZXJuZWwgLi4uXG5cciIsIGVpLm1lbXNpemUpOworCXByaW50ZigiQWxsb2NhdGluZyAweCVseCBieXRlcyBmb3Iga2VybmVsLi4uXG5cciIsIGVpLm1lbXNpemUpOwogCiAJaWYgKHBsYXRmb3JtX29wcy52bWxpbnV4X2FsbG9jKSB7CiAJCWFkZHIgPSBwbGF0Zm9ybV9vcHMudm1saW51eF9hbGxvYyhlaS5tZW1zaXplKTsKQEAgLTcxLDE2ICs2NywyMSBAQAogCQkJCQkiZGV2aWNlIHRyZWVcblxyIik7CiAJfQogCi0JLyogRmluYWxseSwgZ3VuemlwIHRoZSBrZXJuZWwgKi8KLQlwcmludGYoImd1bnppcHBpbmcgKDB4JXAgPC0gMHglcDoweCVwKS4uLiIsIGFkZHIsCisJLyogRmluYWxseSwgZGVjb21wcmVzcyB0aGUga2VybmVsICovCisJcHJpbnRmKCJEZWNvbXByZXNzaW5nICgweCVwIDwtIDB4JXA6MHglcCkuLi5cblxyIiwgYWRkciwKIAkgICAgICAgdm1saW51el9hZGRyLCB2bWxpbnV6X2FkZHIrdm1saW51el9zaXplKTsKLQkvKiBkaXNjYXJkIHVwIHRvIHRoZSBhY3R1YWwgbG9hZCBkYXRhICovCi0JZ3VuemlwX2Rpc2NhcmQoJmd6c3RhdGUsIGVpLmVsZm9mZnNldCAtIHNpemVvZihlbGZoZWFkZXIpKTsKLQlsZW4gPSBndW56aXBfZmluaXNoKCZnenN0YXRlLCBhZGRyLCBlaS5sb2Fkc2l6ZSk7CisKKwlsZW4gPSBwYXJ0aWFsX2RlY29tcHJlc3Modm1saW51el9hZGRyLCB2bWxpbnV6X3NpemUsCisJCWFkZHIsIGVpLmxvYWRzaXplLCBlaS5lbGZvZmZzZXQpOworCisJaWYgKGxlbiA8IDApCisJCWZhdGFsKCJEZWNvbXByZXNzaW9uIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWxkXG5cciIsIGxlbik7CisKIAlpZiAobGVuICE9IGVpLmxvYWRzaXplKQotCQlmYXRhbCgicmFuIG91dCBvZiBkYXRhISAgb25seSBnb3QgMHgleCBvZiAweCVseCBieXRlcy5cblxyIiwKLQkJCQlsZW4sIGVpLmxvYWRzaXplKTsKLQlwcmludGYoImRvbmUgMHgleCBieXRlc1xuXHIiLCBsZW4pOworCQkgZmF0YWwoIkRlY29tcHJlc3Npb24gZXJyb3I6IGdvdCAweCVseCBieXRlcywgZXhwZWN0ZWQgMHglbHguXG5cciIsCisJCQkgbGVuLCBlaS5sb2Fkc2l6ZSk7CisKKwlwcmludGYoIkRvbmUhIERlY29tcHJlc3NlZCAweCVseCBieXRlc1xuXHIiLCBsZW4pOwogCiAJZmx1c2hfY2FjaGUoYWRkciwgZWkubG9hZHNpemUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9vcHMuaCBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCmluZGV4IGUxOWI2NGUuLjMwOWQxYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L29wcy5oCkBAIC0yNjAsNCArMjYwLDcgQEAKIAlyZXR1cm4gMzEgLSBiaXQ7CiB9CiAKK2xvbmcgcGFydGlhbF9kZWNvbXByZXNzKHZvaWQgKmluYnVmLCB1bnNpZ25lZCBsb25nIGlucHV0X3NpemUsIHZvaWQgKm91dGJ1ZiwKKwl1bnNpZ25lZCBsb25nIG91dHB1dF9zaXplLCB1bnNpZ25lZCBsb25nIHNraXApOworCiAjZW5kaWYgLyogX1BQQ19CT09UX09QU19IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkYm9vbC5oIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvc3RkYm9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MThlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRib29sLmgKQEAgLTAsMCArMSwxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uIDIwMTYuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgb25seSBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIG9mIHRoZSBwcmUtYm9vdCBkZWNvbXByZXNzb3JzCisgKiBleHBlY3Qgc3RkYm9vbC5oIHRvIGJlIGF2YWlsYWJsZS4KKyAqCisgKi8KKworI2luY2x1ZGUgInR5cGVzLmgiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpbnQuaCBiL2FyY2gvcG93ZXJwYy9ib290L3N0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzg1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9zdGRpbnQuaApAQCAtMCwwICsxLDEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSBJQk0gQ29ycG9yYXRpb24gMjAxNi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBvbmx5IG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgb2YgdGhlIHByZS1ib290IGRlY29tcHJlc3NvcnMKKyAqIGV4cGVjdCBzdGRpbnQuaCB0byBiZSBhdmFpbGFibGUuCisgKi8KKworI2luY2x1ZGUgInR5cGVzLmgiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC90eXBlcy5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvdHlwZXMuaAppbmRleCA4NTU2NWE4Li5hZjZiNjZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC90eXBlcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3R5cGVzLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9UWVBFU19IXwogI2RlZmluZSBfVFlQRVNfSF8KIAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKwogI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKHgpWzBdKSkKIAogdHlwZWRlZiB1bnNpZ25lZCBjaGFyCQl1ODsKQEAgLTM0LDQgKzM2LDE2IEBACiAJKHZvaWQpICgmX3ggPT0gJl95KTsJXAogCV94ID4gX3kgPyBfeCA6IF95OyB9KQogCisjZGVmaW5lIG1pbl90KHR5cGUsIGEsIGIpIG1pbigoKHR5cGUpIGEpLCAoKHR5cGUpIGIpKQorI2RlZmluZSBtYXhfdCh0eXBlLCBhLCBiKSBtYXgoKCh0eXBlKSBhKSwgKCh0eXBlKSBiKSkKKwordHlwZWRlZiBpbnQgYm9vbDsKKworI2lmbmRlZiB0cnVlCisjZGVmaW5lIHRydWUgMQorI2VuZGlmCisKKyNpZm5kZWYgZmFsc2UKKyNkZWZpbmUgZmFsc2UgMAorI2VuZGlmCiAjZW5kaWYgLyogX1RZUEVTX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgppbmRleCA2NjgxZWMzLi40MDRiM2FhIDEwMDc1NQotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKQEAgLTIwLDYgKzIwLDggQEAKICMgLUQgZGlyCXNwZWNpZnkgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZGF0YSBmaWxlcyB1c2VkIGJ5IHNjcmlwdAogIwkJKGRlZmF1bHQgLi9hcmNoL3Bvd2VycGMvYm9vdCkKICMgLVcgZGlyCXNwZWNpZnkgd29ya2luZyBkaXJlY3RvcnkgZm9yIHRlbXBvcmFyeSBmaWxlcyAoZGVmYXVsdCAuKQorIyAtegkJdXNlIGd6aXAgKGxlZ2FjeSkKKyMgLVogenN1ZmZpeCAgICBjb21wcmVzc2lvbiB0byB1c2UgKGd6LCB4eiBvciBub25lKQogCiAjIFN0b3AgZXhlY3V0aW9uIGlmIGFueSBjb21tYW5kIGZhaWxzCiBzZXQgLWUKQEAgLTM4LDcgKzQwLDcgQEAKIGR0cz0KIGNhY2hlaXQ9CiBiaW5hcnk9Ci1nemlwPS5negorY29tcHJlc3Npb249Lmd6CiBwaWU9CiBmb3JtYXQ9CiAKQEAgLTU5LDcgKzYxLDggQEAKIHVzYWdlKCkgewogICAgIGVjaG8gJ1VzYWdlOiB3cmFwcGVyIFstbyBvdXRwdXRdIFstcCBwbGF0Zm9ybV0gWy1pIGluaXRyZF0nID4mMgogICAgIGVjaG8gJyAgICAgICBbLWQgZGV2dHJlZV0gWy1zIHRyZWUuZHRzXSBbLWNdIFstQyBjcm9zcy1wcmVmaXhdJyA+JjIKLSAgICBlY2hvICcgICAgICAgWy1EIGRhdGFkaXJdIFstVyB3b3JraW5nZGlyXSBbLS1uby1nemlwXSBbdm1saW51eF0nID4mMgorICAgIGVjaG8gJyAgICAgICBbLUQgZGF0YWRpcl0gWy1XIHdvcmtpbmdkaXJdIFstWiAoZ3p8eHp8bm9uZSldJyA+JjIKKyAgICBlY2hvICcgICAgICAgWy0tbm8tY29tcHJlc3Npb25dIFt2bWxpbnV4XScgPiYyCiAgICAgZXhpdCAxCiB9CiAKQEAgLTEyNiw4ICsxMjksMjQgQEAKIAlbICIkIyIgLWd0IDAgXSB8fCB1c2FnZQogCXRtcGRpcj0iJDEiCiAJOzsKKyAgICAteikKKwljb21wcmVzc2lvbj0uZ3oKKwk7OworICAgIC1aKQorCXNoaWZ0CisJWyAiJCMiIC1ndCAwIF0gfHwgdXNhZ2UKKyAgICAgICAgWyAiJDEiICE9ICJneiIgLW8gIiQxIiAhPSAieHoiIC1vICIkMSIgIT0gIm5vbmUiIF0gfHwgdXNhZ2UKKworCWNvbXByZXNzaW9uPSIuJDEiCisKKyAgICAgICAgaWYgWyAkY29tcHJlc3Npb24gPSAiLm5vbmUiIF07IHRoZW4KKyAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj0KKyAgICAgICAgZmkKKwk7OwogICAgIC0tbm8tZ3ppcCkKLSAgICAgICAgZ3ppcD0KKyAgICAgICAgIyBhICJmZWF0dXJlIiBvZiB0aGUgdGhlIHdyYXBwZXIgc2NyaXB0IGlzIHRoYXQgaXQgY2FuIGJlIHVzZWQgb3V0c2lkZQorICAgICAgICAjIHRoZSBrZXJuZWwgdHJlZS4gU28ga2VlcGluZyB0aGlzIGFyb3VuZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAgICAgIGNvbXByZXNzaW9uPQogICAgICAgICA7OwogICAgIC0/KQogCXVzYWdlCkBAIC0xNDAsNiArMTU5LDcgQEAKICAgICBzaGlmdAogZG9uZQogCisKIGlmIFsgLW4gIiRkdHMiIF07IHRoZW4KICAgICBpZiBbICEgLXIgIiRkdHMiIC1hIC1yICIkb2JqZWN0L2R0cy8kZHRzIiBdOyB0aGVuCiAJZHRzPSIkb2JqZWN0L2R0cy8kZHRzIgpAQCAtMjEyLDcgKzIzMiw3IEBACiAgICAgOzsKIGN1Ym9vdCopCiAgICAgYmluYXJ5PXkKLSAgICBnemlwPQorICAgIGNvbXByZXNzaW9uPQogICAgIGNhc2UgIiRwbGF0Zm9ybSIgaW4KICAgICAqLW1wYzg2NmFkc3wqLW1wYzg4NWFkc3wqLWFkZGVyODc1KnwqLWVwODh4YykKICAgICAgICAgcGxhdGZvcm1vPSRvYmplY3QvY3Vib290LTh4eC5vCkBAIC0yNDMsNyArMjYzLDcgQEAKIHBzMykKICAgICBwbGF0Zm9ybW89IiRvYmplY3QvcHMzLWhlYWQubyAkb2JqZWN0L3BzMy1odmNhbGwubyAkb2JqZWN0L3BzMy5vIgogICAgIGxkcz0kb2JqZWN0L3pJbWFnZS5wczMubGRzCi0gICAgZ3ppcD0KKyAgICBjb21wcmVzc2lvbj0KICAgICBleHQ9YmluCiAgICAgb2JqZmxhZ3M9Ii1PIGJpbmFyeSAtLXNldC1zZWN0aW9uLWZsYWdzPS5ic3M9Y29udGVudHMsYWxsb2MsbG9hZCxkYXRhIgogICAgIGtzZWN0aW9uPS5rZXJuZWw6dm1saW51eC5iaW4KQEAgLTMxMCwyNyArMzMwLDM3IEBACiBlc2FjCiAKIHZtej0iJHRtcGRpci9gYmFzZW5hbWUgXCIka2VybmVsXCJgLiRleHQiCi1pZiBbIC16ICIkY2FjaGVpdCIgLW8gISAtZiAiJHZteiRnemlwIiAtbyAiJHZteiRnemlwIiAtb3QgIiRrZXJuZWwiIF07IHRoZW4KLSAgICAke0NST1NTfW9iamNvcHkgJG9iamZsYWdzICIka2VybmVsIiAiJHZtei4kJCIKIAotICAgIHN0cmlwX3NpemU9JChzdGF0IC1jICVzICR2bXouJCQpCisjIENhbGN1bGF0ZSB0aGUgdm1saW51eC5zdHJpcCBzaXplCiske0NST1NTfW9iamNvcHkgJG9iamZsYWdzICIka2VybmVsIiAiJHZtei4kJCIKK3N0cmlwX3NpemU9JChzdGF0IC1jICVzICR2bXouJCQpCiAKLSAgICBpZiBbIC1uICIkZ3ppcCIgXTsgdGhlbgoraWYgWyAteiAiJGNhY2hlaXQiIC1vICEgLWYgIiR2bXokY29tcHJlc3Npb24iIC1vICIkdm16JGNvbXByZXNzaW9uIiAtb3QgIiRrZXJuZWwiIF07IHRoZW4KKyAgICAjIHJlY29tcHJlc3MgdGhlIGltYWdlIGlmIHdlIG5lZWQgdG8KKyAgICBjYXNlICRjb21wcmVzc2lvbiBpbgorICAgIC54eikKKyAgICAgICAgeHogLS1jaGVjaz1jcmMzMiAtZiAtNiAiJHZtei4kJCIKKyAgICAgICAgOzsKKyAgICAuZ3opCiAgICAgICAgIGd6aXAgLW4gLWYgLTkgIiR2bXouJCQiCi0gICAgZmkKKyAgICAgICAgOzsKKyAgICAqKQorICAgICAgICAjIGRyb3AgdGhlIGNvbXByZXNzaW9uIHN1ZmZpeCBzbyB0aGUgc3RyaXBwZWQgdm1saW51eCBpcyB1c2VkCisgICAgICAgIGNvbXByZXNzaW9uPQorCTs7CisgICAgZXNhYwogCiAgICAgaWYgWyAtbiAiJGNhY2hlaXQiIF07IHRoZW4KLQltdiAtZiAiJHZtei4kJCRnemlwIiAiJHZteiRnemlwIgorCW12IC1mICIkdm16LiQkJGNvbXByZXNzaW9uIiAiJHZteiRjb21wcmVzc2lvbiIKICAgICBlbHNlCiAJdm16PSIkdm16LiQkIgogICAgIGZpCiBlbHNlCi0gICAgIyBDYWxjdWxhdGUgdGhlIHZtbGludXguc3RyaXAgc2l6ZQotICAgICR7Q1JPU1N9b2JqY29weSAkb2JqZmxhZ3MgIiRrZXJuZWwiICIkdm16LiQkIgotICAgIHN0cmlwX3NpemU9JChzdGF0IC1jICVzICR2bXouJCQpCiAgICAgcm0gLWYgJHZtei4kJAogZmkKIAordm16PSIkdm16JGNvbXByZXNzaW9uIgorCiBpZiBbICIkbWFrZV9zcGFjZSIgPSAieSIgXTsgdGhlbgogCSMgUm91bmQgdGhlIHNpemUgdG8gbmV4dCBoaWdoZXIgTUIgbGltaXQKIAlyb3VuZF9zaXplPSQoKChzdHJpcF9zaXplICsgMHhmZmZmZikgJiAweGZmZjAwMDAwKSkKQEAgLTM0Niw4ICszNzYsNiBAQAogCWZpCiBmaQogCi12bXo9IiR2bXokZ3ppcCIKLQogIyBFeHRyYWN0IGtlcm5lbCB2ZXJzaW9uIGluZm9ybWF0aW9uLCBzb21lIHBsYXRmb3JtcyB3YW50IHRvIGluY2x1ZGUKICMgaXQgaW4gdGhlIGltYWdlIGhlYWRlcgogdmVyc2lvbj1gJHtDUk9TU31zdHJpbmdzICIka2VybmVsIiB8IGdyZXAgJ15MaW51eCB2ZXJzaW9uIFstMC05Ll0nIHwgXApAQCAtNDE3LDYgKzQ0NSw3IEBACiAgICAgaWYgWyAtbiAiJGxpbmtfYWRkcmVzcyIgXSA7IHRoZW4KICAgICAgICAgdGV4dF9zdGFydD0iLVR0ZXh0ICRsaW5rX2FkZHJlc3MiCiAgICAgZmkKKyNsaW5rIGV2ZXJ5dGhpbmcKICAgICAke0NST1NTfWxkIC1tICRmb3JtYXQgLVQgJGxkcyAkdGV4dF9zdGFydCAkcGllIC1vICIkb2ZpbGUiIFwKIAkkcGxhdGZvcm1vICR0bXAgJG9iamVjdC93cmFwcGVyLmEKICAgICBybSAkdG1wCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC94el9jb25maWcuaCBiL2FyY2gvcG93ZXJwYy9ib290L3h6X2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNmFmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC94el9jb25maWcuaApAQCAtMCwwICsxLDM5IEBACisjaWZuZGVmIF9fWFpfQ09ORklHX0hfXworI2RlZmluZSBfX1haX0NPTkZJR19IX18KKworLyoKKyAqIG1vc3Qgb2YgdGhpcyBpcyBjb3BpZWQgZnJvbSBsaWIveHoveHpfcHJpdmF0ZS5oLCB3ZSBjYW4ndCB1c2UgdGhlaXIgZGVmaW5lcworICogc2luY2UgdGhlIGJvb3Qgd3JhcHBlciBpcyBub3QgYnVpbHQgaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgYXMgdGhlIHJlc3Qgb2YKKyAqIHRoZSBrZXJuZWwuCisgKi8KKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAic3dhYi5oIgorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHN3YWIzMnAodm9pZCAqcCkKK3sKKwl1aW50MzJfdCAqcSA9IHA7CisKKwlyZXR1cm4gc3dhYjMyKCpxKTsKK30KKworI2lmZGVmIF9fTElUVExFX0VORElBTl9fCisjZGVmaW5lIGdldF9sZTMyKHApICgqKCh1aW50MzJfdCAqKSAocCkpKQorI2Vsc2UKKyNkZWZpbmUgZ2V0X2xlMzIocCkgc3dhYjMycChwKQorI2VuZGlmCisKKyNkZWZpbmUgbWVtZXEoYSwgYiwgc2l6ZSkgKG1lbWNtcChhLCBiLCBzaXplKSA9PSAwKQorI2RlZmluZSBtZW16ZXJvKGJ1Ziwgc2l6ZSkgbWVtc2V0KGJ1ZiwgMCwgc2l6ZSkKKworLyogcHJldmVudCB0aGUgaW5jbHVzaW9uIG9mIHRoZSB4ei1wcmVib290IE1NIGhlYWRlcnMgKi8KKyNkZWZpbmUgREVDT01QUl9NTV9ICisjZGVmaW5lIG1lbW1vdmUgbWVtbW92ZQorI2RlZmluZSBYWl9FWFRFUk4gc3RhdGljCisKKy8qIHh6LmggbmVlZHMgdG8gYmUgaW5jbHVkZWQgZGlyZWN0bHkgc2luY2Ugd2UgbmVlZCBlbnVtIHh6X21vZGUgKi8KKyNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2xpbnV4L3h6LmgiCisKKyN1bmRlZiBYWl9FWFRFUk4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wb3dlcm52X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3Bvd2VybnZfZGVmY29uZmlnCmluZGV4IGRjZTM1MmUuLmQ5OGI2ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3Bvd2VybnZfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3Bvd2VybnZfZGVmY29uZmlnCkBAIC0xNSw2ICsxNSw4IEBACiBDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HPXkKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xOAorQ09ORklHX0xPR19DUFVfTUFYX0JVRl9TSElGVD0xMwogQ09ORklHX05VTUFfQkFMQU5DSU5HPXkKIENPTkZJR19DR1JPVVBTPXkKIENPTkZJR19NRU1DRz15CkBAIC05NSw3ICs5Nyw3IEBACiBDT05GSUdfQkxLX0RFVl9HRU5FUklDPXkKIENPTkZJR19CTEtfREVWX0FNRDc0WFg9eQogQ09ORklHX0JMS19ERVZfU0Q9eQotQ09ORklHX0NIUl9ERVZfU1Q9eQorQ09ORklHX0NIUl9ERVZfU1Q9bQogQ09ORklHX0JMS19ERVZfU1I9eQogQ09ORklHX0JMS19ERVZfU1JfVkVORE9SPXkKIENPTkZJR19DSFJfREVWX1NHPXkKQEAgLTEwNyw3ICsxMDksNyBAQAogQ09ORklHX1NDU0lfQk5YMl9JU0NTST1tCiBDT05GSUdfQkUySVNDU0k9bQogQ09ORklHX1NDU0lfTVBUMlNBUz1tCi1DT05GSUdfU0NTSV9TWU01M0M4WFhfMj15CitDT05GSUdfU0NTSV9TWU01M0M4WFhfMj1tCiBDT05GSUdfU0NTSV9TWU01M0M4WFhfRE1BX0FERFJFU1NJTkdfTU9ERT0wCiBDT05GSUdfU0NTSV9JUFI9eQogQ09ORklHX1NDU0lfUUxBX0ZDPW0KQEAgLTE0OSwxMCArMTUxLDEwIEBACiBDT05GSUdfVkVUSD1tCiBDT05GSUdfVklSVElPX05FVD1tCiBDT05GSUdfVkhPU1RfTkVUPW0KLUNPTkZJR19WT1JURVg9eQorQ09ORklHX1ZPUlRFWD1tCiBDT05GSUdfQUNFTklDPW0KIENPTkZJR19BQ0VOSUNfT01JVF9USUdPTl9JPXkKLUNPTkZJR19QQ05FVDMyPXkKK0NPTkZJR19QQ05FVDMyPW0KIENPTkZJR19USUdPTjM9eQogQ09ORklHX0JOWDJYPW0KIENPTkZJR19DSEVMU0lPX1QxPW0KQEAgLTE2Myw2ICsxNjUsNyBAQAogQ09ORklHX0UxMDAwRT15CiBDT05GSUdfSVhHQj1tCiBDT05GSUdfSVhHQkU9bQorQ09ORklHX0k0MEU9bQogQ09ORklHX01MWDRfRU49bQogQ09ORklHX01ZUkkxMEdFPW0KIENPTkZJR19RTEdFPW0KQEAgLTIzOCw3ICsyNDEsNyBAQAogQ09ORklHX0VYVDRfRlM9eQogQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMPXkKIENPTkZJR19FWFQ0X0ZTX1NFQ1VSSVRZPXkKLUNPTkZJR19SRUlTRVJGU19GUz15CitDT05GSUdfUkVJU0VSRlNfRlM9bQogQ09ORklHX1JFSVNFUkZTX0ZTX1hBVFRSPXkKIENPTkZJR19SRUlTRVJGU19GU19QT1NJWF9BQ0w9eQogQ09ORklHX1JFSVNFUkZTX0ZTX1NFQ1VSSVRZPXkKQEAgLTI1MywxMCArMjU2LDEwIEBACiBDT05GSUdfQVVUT0ZTNF9GUz1tCiBDT05GSUdfRlVTRV9GUz1tCiBDT05GSUdfT1ZFUkxBWV9GUz1tCi1DT05GSUdfSVNPOTY2MF9GUz15CitDT05GSUdfSVNPOTY2MF9GUz1tCiBDT05GSUdfVURGX0ZTPW0KIENPTkZJR19NU0RPU19GUz15Ci1DT05GSUdfVkZBVF9GUz15CitDT05GSUdfVkZBVF9GUz1tCiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfVE1QRlM9eQogQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15CkBAIC0zMTAsNiArMzEzLDggQEAKIENPTkZJR19DUllQVE9fVFdPRklTSD1tCiBDT05GSUdfQ1JZUFRPX0xaTz1tCiBDT05GSUdfQ1JZUFRPX0RFVl9OWD15CitDT05GSUdfQ1JZUFRPX0RFVl9WTVg9eQorQ09ORklHX0NSWVBUT19ERVZfVk1YX0VOQ1JZUFQ9bQogQ09ORklHX1ZJUlRVQUxJWkFUSU9OPXkKIENPTkZJR19LVk1fQk9PSzNTXzY0PW0KIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWPW0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZwppbmRleCAwYThkMjUwLi41OGE5OGQ0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCkBAIC0xMCw2ICsxMCw4IEBACiBDT05GSUdfVEFTS19ERUxBWV9BQ0NUPXkKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xOAorQ09ORklHX0xPR19DUFVfTUFYX0JVRl9TSElGVD0xMwogQ09ORklHX0NHUk9VUFM9eQogQ09ORklHX0NQVVNFVFM9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKQEAgLTkwLDcgKzkyLDcgQEAKIENPTkZJR19CTEtfREVWX0lERV9QTUFDPXkKIENPTkZJR19CTEtfREVWX0lERV9QTUFDX0FUQTEwMEZJUlNUPXkKIENPTkZJR19CTEtfREVWX1NEPXkKLUNPTkZJR19DSFJfREVWX1NUPXkKK0NPTkZJR19DSFJfREVWX1NUPW0KIENPTkZJR19CTEtfREVWX1NSPXkKIENPTkZJR19CTEtfREVWX1NSX1ZFTkRPUj15CiBDT05GSUdfQ0hSX0RFVl9TRz15CkBAIC0xMDMsNyArMTA1LDcgQEAKIENPTkZJR19TQ1NJX01QVDJTQVM9bQogQ09ORklHX1NDU0lfSUJNVlNDU0k9eQogQ09ORklHX1NDU0lfSUJNVkZDPW0KLUNPTkZJR19TQ1NJX1NZTTUzQzhYWF8yPXkKK0NPTkZJR19TQ1NJX1NZTTUzQzhYWF8yPW0KIENPTkZJR19TQ1NJX1NZTTUzQzhYWF9ETUFfQUREUkVTU0lOR19NT0RFPTAKIENPTkZJR19TQ1NJX0lQUj15CiBDT05GSUdfU0NTSV9RTEFfRkM9bQpAQCAtMTQ5LDEwICsxNTEsMTAgQEAKIENPTkZJR19UVU49bQogQ09ORklHX1ZJUlRJT19ORVQ9bQogQ09ORklHX1ZIT1NUX05FVD1tCi1DT05GSUdfVk9SVEVYPXkKK0NPTkZJR19WT1JURVg9bQogQ09ORklHX0FDRU5JQz1tCiBDT05GSUdfQUNFTklDX09NSVRfVElHT05fST15Ci1DT05GSUdfUENORVQzMj15CitDT05GSUdfUENORVQzMj1tCiBDT05GSUdfVElHT04zPXkKIENPTkZJR19CTlgyWD1tCiBDT05GSUdfQ0hFTFNJT19UMT1tCkBAIC0xNjUsNiArMTY3LDcgQEAKIENPTkZJR19FMTAwMEU9eQogQ09ORklHX0lYR0I9bQogQ09ORklHX0lYR0JFPW0KK0NPTkZJR19JNDBFPW0KIENPTkZJR19NTFg0X0VOPW0KIENPTkZJR19NWVJJMTBHRT1tCiBDT05GSUdfUEFTRU1JX01BQz15CkBAIC0yNjksNyArMjcyLDcgQEAKIENPTkZJR19FWFQ0X0ZTPXkKIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTD15CiBDT05GSUdfRVhUNF9GU19TRUNVUklUWT15Ci1DT05GSUdfUkVJU0VSRlNfRlM9eQorQ09ORklHX1JFSVNFUkZTX0ZTPW0KIENPTkZJR19SRUlTRVJGU19GU19YQVRUUj15CiBDT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMPXkKIENPTkZJR19SRUlTRVJGU19GU19TRUNVUklUWT15CkBAIC0yODQsMTAgKzI4NywxMCBAQAogQ09ORklHX0FVVE9GUzRfRlM9bQogQ09ORklHX0ZVU0VfRlM9bQogQ09ORklHX09WRVJMQVlfRlM9bQotQ09ORklHX0lTTzk2NjBfRlM9eQorQ09ORklHX0lTTzk2NjBfRlM9bQogQ09ORklHX1VERl9GUz1tCiBDT05GSUdfTVNET1NfRlM9eQotQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX1ZGQVRfRlM9bQogQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1RNUEZTPXkKIENPTkZJR19UTVBGU19QT1NJWF9BQ0w9eQpAQCAtMzQ3LDYgKzM1MCw4IEBACiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0RFVl9OWD15CiBDT05GSUdfQ1JZUFRPX0RFVl9OWF9FTkNSWVBUPW0KK0NPTkZJR19DUllQVE9fREVWX1ZNWD15CitDT05GSUdfQ1JZUFRPX0RFVl9WTVhfRU5DUllQVD1tCiBDT05GSUdfVklSVFVBTElaQVRJT049eQogQ09ORklHX0tWTV9CT09LM1NfNjQ9bQogQ09ORklHX0tWTV9CT09LM1NfNjRfSFY9bQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZwppbmRleCA2NTRhZWZmLi44YTNiYzAxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZwpAQCAtMTUsNiArMTUsOCBAQAogQ09ORklHX1RBU0tfSU9fQUNDT1VOVElORz15CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTgKK0NPTkZJR19MT0dfQ1BVX01BWF9CVUZfU0hJRlQ9MTMKIENPTkZJR19OVU1BX0JBTEFOQ0lORz15CiBDT05GSUdfTlVNQV9CQUxBTkNJTkdfREVGQVVMVF9FTkFCTEVEPXkKIENPTkZJR19DR1JPVVBTPXkKQEAgLTk1LDcgKzk3LDcgQEAKIENPTkZJR19CTEtfREVWX0dFTkVSSUM9eQogQ09ORklHX0JMS19ERVZfQU1ENzRYWD15CiBDT05GSUdfQkxLX0RFVl9TRD15Ci1DT05GSUdfQ0hSX0RFVl9TVD15CitDT05GSUdfQ0hSX0RFVl9TVD1tCiBDT05GSUdfQkxLX0RFVl9TUj15CiBDT05GSUdfQkxLX0RFVl9TUl9WRU5ET1I9eQogQ09ORklHX0NIUl9ERVZfU0c9eQpAQCAtMTA4LDcgKzExMCw3IEBACiBDT05GSUdfU0NTSV9NUFQyU0FTPW0KIENPTkZJR19TQ1NJX0lCTVZTQ1NJPXkKIENPTkZJR19TQ1NJX0lCTVZGQz1tCi1DT05GSUdfU0NTSV9TWU01M0M4WFhfMj15CitDT05GSUdfU0NTSV9TWU01M0M4WFhfMj1tCiBDT05GSUdfU0NTSV9TWU01M0M4WFhfRE1BX0FERFJFU1NJTkdfTU9ERT0wCiBDT05GSUdfU0NTSV9JUFI9eQogQ09ORklHX1NDU0lfUUxBX0ZDPW0KQEAgLTE1MCwxMCArMTUyLDEwIEBACiBDT05GSUdfVkVUSD1tCiBDT05GSUdfVklSVElPX05FVD1tCiBDT05GSUdfVkhPU1RfTkVUPW0KLUNPTkZJR19WT1JURVg9eQorQ09ORklHX1ZPUlRFWD1tCiBDT05GSUdfQUNFTklDPW0KIENPTkZJR19BQ0VOSUNfT01JVF9USUdPTl9JPXkKLUNPTkZJR19QQ05FVDMyPXkKK0NPTkZJR19QQ05FVDMyPW0KIENPTkZJR19USUdPTjM9eQogQ09ORklHX0JOWDJYPW0KIENPTkZJR19DSEVMU0lPX1QxPW0KQEAgLTE2Niw2ICsxNjgsNyBAQAogQ09ORklHX0UxMDAwRT15CiBDT05GSUdfSVhHQj1tCiBDT05GSUdfSVhHQkU9bQorQ09ORklHX0k0MEU9bQogQ09ORklHX01MWDRfRU49bQogQ09ORklHX01ZUkkxMEdFPW0KIENPTkZJR19RTEdFPW0KQEAgLTI0MSw3ICsyNDQsNyBAQAogQ09ORklHX0VYVDRfRlM9eQogQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMPXkKIENPTkZJR19FWFQ0X0ZTX1NFQ1VSSVRZPXkKLUNPTkZJR19SRUlTRVJGU19GUz15CitDT05GSUdfUkVJU0VSRlNfRlM9bQogQ09ORklHX1JFSVNFUkZTX0ZTX1hBVFRSPXkKIENPTkZJR19SRUlTRVJGU19GU19QT1NJWF9BQ0w9eQogQ09ORklHX1JFSVNFUkZTX0ZTX1NFQ1VSSVRZPXkKQEAgLTI1NiwxMCArMjU5LDEwIEBACiBDT05GSUdfQVVUT0ZTNF9GUz1tCiBDT05GSUdfRlVTRV9GUz1tCiBDT05GSUdfT1ZFUkxBWV9GUz1tCi1DT05GSUdfSVNPOTY2MF9GUz15CitDT05GSUdfSVNPOTY2MF9GUz1tCiBDT05GSUdfVURGX0ZTPW0KIENPTkZJR19NU0RPU19GUz15Ci1DT05GSUdfVkZBVF9GUz15CitDT05GSUdfVkZBVF9GUz1tCiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfVE1QRlM9eQogQ09ORklHX1RNUEZTX1BPU0lYX0FDTD15CkBAIC0zMTQsNiArMzE3LDggQEAKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fREVWX05YPXkKIENPTkZJR19DUllQVE9fREVWX05YX0VOQ1JZUFQ9bQorQ09ORklHX0NSWVBUT19ERVZfVk1YPXkKK0NPTkZJR19DUllQVE9fREVWX1ZNWF9FTkNSWVBUPW0KIENPTkZJR19WSVJUVUFMSVpBVElPTj15CiBDT05GSUdfS1ZNX0JPT0szU182ND1tCiBDT05GSUdfS1ZNX0JPT0szU182NF9IVj1tCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYXNtLXByb3RvdHlwZXMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hc20tcHJvdG90eXBlcy5oCmluZGV4IGU3MWI5MDkuLmQxNDkyNzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hc20tcHJvdG90eXBlcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hc20tcHJvdG90eXBlcy5oCkBAIC0xNSw2ICsxNSw4IEBACiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KIAorI2luY2x1ZGUgPHVhcGkvYXNtL3Vjb250ZXh0Lmg+CisKIC8qIFNNUCAqLwogZXh0ZXJuIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF9zZXRbTlJfQ1BVU107CiBleHRlcm4gc3RydWN0IHRocmVhZF9pbmZvICpzZWNvbmRhcnlfdGk7CkBAIC01Miw4ICs1NCw4IEBACiB2b2lkIGhhbmRsZV9obWlfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHZvaWQgaW5zdHJ1Y3Rpb25fYnJlYWtwb2ludF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogdm9pZCBSdW5Nb2RlRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXZvaWQgX19rcHJvYmVzIHNpbmdsZV9zdGVwX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci12b2lkIF9fa3Byb2JlcyBwcm9ncmFtX2NoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Cit2b2lkIHNpbmdsZV9zdGVwX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Cit2b2lkIHByb2dyYW1fY2hlY2tfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHZvaWQgYWxpZ25tZW50X2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiB2b2lkIFN0YWNrT3ZlcmZsb3coc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogdm9pZCBub25yZWNvdmVyYWJsZV9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwpAQCAtNzAsNiArNzIsNDEgQEAKIHZvaWQga2VybmVsX2JhZF9zdGFjayhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiB2b2lkIHN5c3RlbV9yZXNldF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogdm9pZCBtYWNoaW5lX2NoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci12b2lkIF9fa3Byb2JlcyBlbXVsYXRpb25fYXNzaXN0X2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Cit2b2lkIGVtdWxhdGlvbl9hc3Npc3RfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyogc2lnbmFscywgc3lzY2FsbHMgYW5kIGludGVycnVwdHMgKi8KKyNpZmRlZiBDT05GSUdfUFBDNjQKK2ludCBzeXNfc3dhcGNvbnRleHQoc3RydWN0IHVjb250ZXh0IF9fdXNlciAqb2xkX2N0eCwKKwkJICAgIHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKm5ld19jdHgsCisJCSAgICBsb25nIGN0eF9zaXplLCBsb25nIHI2LCBsb25nIHI3LCBsb25nIHI4LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjZWxzZQorbG9uZyBzeXNfc3dhcGNvbnRleHQoc3RydWN0IHVjb250ZXh0IF9fdXNlciAqb2xkX2N0eCwKKwkJICAgIHN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKm5ld19jdHgsCisJCSAgICBpbnQgY3R4X3NpemUsIGludCByNiwgaW50IHI3LCBpbnQgcjgsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKyNlbmRpZgorbG9uZyBzeXNfc3dpdGNoX2VuZGlhbih2b2lkKTsKK25vdHJhY2UgdW5zaWduZWQgaW50IF9fY2hlY2tfaXJxX3JlcGxheSh2b2lkKTsKK3ZvaWQgbm90cmFjZSByZXN0b3JlX2ludGVycnVwdHModm9pZCk7CisKKy8qIHB0cmFjZSAqLworbG9uZyBkb19zeXNjYWxsX3RyYWNlX2VudGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3ZvaWQgZG9fc3lzY2FsbF90cmFjZV9sZWF2ZShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qIHByb2Nlc3MgKi8KK3ZvaWQgcmVzdG9yZV9tYXRoKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3ZvaWQgcmVzdG9yZV90bV9zdGF0ZShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qIHByb21faW5pdCAoT3BlbkZpcm13YXJlKSAqLwordW5zaWduZWQgbG9uZyBfX2luaXQgcHJvbV9pbml0KHVuc2lnbmVkIGxvbmcgcjMsIHVuc2lnbmVkIGxvbmcgcjQsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBwcCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcga2Jhc2UpOworCisvKiBzZXR1cCAqLwordm9pZCBfX2luaXQgZWFybHlfc2V0dXAodW5zaWduZWQgbG9uZyBkdF9wdHIpOwordm9pZCBlYXJseV9zZXR1cF9zZWNvbmRhcnkodm9pZCk7CisKKy8qIHRpbWUgKi8KK3ZvaWQgYWNjdW11bGF0ZV9zdG9sZW5fdGltZSh2b2lkKTsKIAogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19BU01fUFJPVE9UWVBFU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggZjA4ZDU2Ny4uMmI5MDMzNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMjMzLDcgKzIzMyw3IEBACiAJUFBDX0FUT01JQ19FTlRSWV9CQVJSSUVSCiAiMToJbHdhcngJJTAsMCwlMQkJIyBfX2F0b21pY19hZGRfdW5sZXNzXG5cCiAJY21wdwkwLCUwLCUzIFxuXAotCWJlcS0JMmYgXG5cCisJYmVxCTJmIFxuXAogCWFkZAklMCwlMiwlMCBcbiIKIAlQUEM0MDVfRVJSNzcoMCwlMikKICIJc3R3Y3guCSUwLDAsJTEgXG5cCkBAIC01MzksNyArNTM5LDcgQEAKIAlQUENfQVRPTUlDX0VOVFJZX0JBUlJJRVIKICIxOglsZGFyeAklMCwwLCUxCQkjIF9fYXRvbWljX2FkZF91bmxlc3NcblwKIAljbXBkCTAsJTAsJTMgXG5cCi0JYmVxLQkyZiBcblwKKwliZXEJMmYgXG5cCiAJYWRkCSUwLCUyLCUwIFxuIgogIglzdGRjeC4JJTAsMCwlMSBcblwKIAlibmUtCTFiIFxuIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Jvb2szcy8zMi9wZ3RhYmxlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYm9vazNzLzMyL3BndGFibGUuaAppbmRleCAzOGIzM2RjLi42YjhiMmQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYm9vazNzLzMyL3BndGFibGUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYm9vazNzLzMyL3BndGFibGUuaApAQCAtMjIzLDcgKzIyMyw4IEBACiB9CiAKIAotc3RhdGljIGlubGluZSB2b2lkIF9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHB0ZV90ICpwdGVwLCBwdGVfdCBlbnRyeSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfc2V0X2FjY2Vzc19mbGFncyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJICAgcHRlX3QgKnB0ZXAsIHB0ZV90IGVudHJ5KQogewogCXVuc2lnbmVkIGxvbmcgc2V0ID0gcHRlX3ZhbChlbnRyeSkgJgogCQkoX1BBR0VfRElSVFkgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX1JXIHwgX1BBR0VfRVhFQyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYm9vazNzLzY0L21tdS1oYXNoLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYm9vazNzLzY0L21tdS1oYXNoLmgKaW5kZXggMjg3YTY1Ni4uZTQwN2FmMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Jvb2szcy82NC9tbXUtaGFzaC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ib29rM3MvNjQvbW11LWhhc2guaApAQCAtMjQ1LDYgKzI0NSw0MyBAQAogfQogCiAvKgorICogVGhpcyBhcnJheSBpcyBpbmRleGVkIGJ5IHRoZSBMUCBmaWVsZCBvZiB0aGUgSFBURSBzZWNvbmQgZHdvcmQuCisgKiBTaW5jZSB0aGlzIGZpZWxkIG1heSBjb250YWluIHNvbWUgUlBOIGJpdHMsIHNvbWUgZW50cmllcyBhcmUKKyAqIHJlcGxpY2F0ZWQgc28gdGhhdCB3ZSBnZXQgdGhlIHNhbWUgdmFsdWUgaXJyZXNwZWN0aXZlIG9mIFJQTi4KKyAqIFRoZSB0b3AgNCBiaXRzIGFyZSB0aGUgcGFnZSBzaXplIGluZGV4IChNTVVfUEFHRV8qKSBmb3IgdGhlCisgKiBhY3R1YWwgcGFnZSBzaXplLCB0aGUgYm90dG9tIDQgYml0cyBhcmUgdGhlIGJhc2UgcGFnZSBzaXplLgorICovCitleHRlcm4gdTggaHB0ZV9wYWdlX3NpemVzWzEgPDwgTFBfQklUU107CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2hwdGVfcGFnZV9zaXplKHVuc2lnbmVkIGxvbmcgaCwgdW5zaWduZWQgbG9uZyBsLAorCQkJCQkgICAgIGJvb2wgaXNfYmFzZV9zaXplKQoreworCXVuc2lnbmVkIGludCBpLCBscDsKKworCWlmICghKGggJiBIUFRFX1ZfTEFSR0UpKQorCQlyZXR1cm4gMXVsIDw8IDEyOworCisJLyogTG9vayBhdCB0aGUgOCBiaXQgTFAgdmFsdWUgKi8KKwlscCA9IChsID4+IExQX1NISUZUKSAmICgoMSA8PCBMUF9CSVRTKSAtIDEpOworCWkgPSBocHRlX3BhZ2Vfc2l6ZXNbbHBdOworCWlmICghaSkKKwkJcmV0dXJuIDA7CisJaWYgKCFpc19iYXNlX3NpemUpCisJCWkgPj49IDQ7CisJcmV0dXJuIDF1bCA8PCBtbXVfcHNpemVfZGVmc1tpICYgMHhmXS5zaGlmdDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhwdGVfcGFnZV9zaXplKHVuc2lnbmVkIGxvbmcgaCwgdW5zaWduZWQgbG9uZyBsKQoreworCXJldHVybiBfX2hwdGVfcGFnZV9zaXplKGgsIGwsIDApOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaHB0ZV9iYXNlX3BhZ2Vfc2l6ZSh1bnNpZ25lZCBsb25nIGgsIHVuc2lnbmVkIGxvbmcgbCkKK3sKKwlyZXR1cm4gX19ocHRlX3BhZ2Vfc2l6ZShoLCBsLCAxKTsKK30KKworLyoKICAqIFRoZSBjdXJyZW50IHN5c3RlbSBwYWdlIGFuZCBzZWdtZW50IHNpemVzCiAgKi8KIGV4dGVybiBpbnQgbW11X2tlcm5lbF9zc2l6ZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ib29rM3MvNjQvcGd0YWJsZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Jvb2szcy82NC9wZ3RhYmxlLmgKaW5kZXggMjYzYmYzOS4uOWZkNzdmOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Jvb2szcy82NC9wZ3RhYmxlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Jvb2szcy82NC9wZ3RhYmxlLmgKQEAgLTYsNiArNiw4IEBACiAgKi8KICNkZWZpbmUgX1BBR0VfQklUX1NXQVBfVFlQRQkwCiAKKyNkZWZpbmUgX1BBR0VfUk8JCTAKKwogI2RlZmluZSBfUEFHRV9FWEVDCQkweDAwMDAxIC8qIGV4ZWN1dGUgcGVybWlzc2lvbiAqLwogI2RlZmluZSBfUEFHRV9XUklURQkJMHgwMDAwMiAvKiB3cml0ZSBhY2Nlc3MgYWxsb3dlZCAqLwogI2RlZmluZSBfUEFHRV9SRUFECQkweDAwMDA0CS8qIHJlYWQgYWNjZXNzIGFsbG93ZWQgKi8KQEAgLTU2NSwxMCArNTY3LDExIEBACiAgKiBHZW5lcmljIGZ1bmN0aW9ucyB3aXRoIGhhc2gvcmFkaXggY2FsbGJhY2tzCiAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIF9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHB0ZV90ICpwdGVwLCBwdGVfdCBlbnRyeSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfc2V0X2FjY2Vzc19mbGFncyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJICAgcHRlX3QgKnB0ZXAsIHB0ZV90IGVudHJ5KQogewogCWlmIChyYWRpeF9lbmFibGVkKCkpCi0JCXJldHVybiByYWRpeF9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHB0ZXAsIGVudHJ5KTsKKwkJcmV0dXJuIHJhZGl4X19wdGVwX3NldF9hY2Nlc3NfZmxhZ3MobW0sIHB0ZXAsIGVudHJ5KTsKIAlyZXR1cm4gaGFzaF9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHB0ZXAsIGVudHJ5KTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Jvb2szcy82NC9yYWRpeC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Jvb2szcy82NC9yYWRpeC5oCmluZGV4IGRmMjk0MjIuLjJhNDZkZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ib29rM3MvNjQvcmFkaXguaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYm9vazNzLzY0L3JhZGl4LmgKQEAgLTExLDYgKzExLDExIEBACiAjaW5jbHVkZSA8YXNtL2Jvb2szcy82NC9yYWRpeC00ay5oPgogI2VuZGlmCiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisjaW5jbHVkZSA8YXNtL2Jvb2szcy82NC90bGJmbHVzaC1yYWRpeC5oPgorI2luY2x1ZGUgPGFzbS9jcHVfaGFzX2ZlYXR1cmUuaD4KKyNlbmRpZgorCiAvKiBBbiBlbXB0eSBQVEUgY2FuIHN0aWxsIGhhdmUgYSBSIG9yIEMgd3JpdGViYWNrICovCiAjZGVmaW5lIFJBRElYX1BURV9OT05FX01BU0sJCShfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEKQogCkBAIC0xMDUsMTEgKzExMCw4IEBACiAjZGVmaW5lIFJBRElYX1BVRF9UQUJMRV9TSVpFCShzaXplb2YocHVkX3QpIDw8IFJBRElYX1BVRF9JTkRFWF9TSVpFKQogI2RlZmluZSBSQURJWF9QR0RfVEFCTEVfU0laRQkoc2l6ZW9mKHBnZF90KSA8PCBSQURJWF9QR0RfSU5ERVhfU0laRSkKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJhZGl4X19wdGVfdXBkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAotCQkJCQl1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQkJCXB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nIGNsciwKLQkJCQkJdW5zaWduZWQgbG9uZyBzZXQsCi0JCQkJCWludCBodWdlKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmFkaXhfcHRlX3VwZGF0ZShwdGVfdCAqcHRlcCwgdW5zaWduZWQgbG9uZyBjbHIsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNldCkKIHsKIAlwdGVfdCBwdGU7CiAJdW5zaWduZWQgbG9uZyBvbGRfcHRlLCBuZXdfcHRlOwpAQCAtMTIxLDkgKzEyMywzOSBAQAogCiAJfSB3aGlsZSAoIXB0ZV94Y2hnKHB0ZXAsIF9fcHRlKG9sZF9wdGUpLCBfX3B0ZShuZXdfcHRlKSkpOwogCi0JLyogV2UgYWxyZWFkeSBkbyBhIHN5bmMgaW4gY21weGNoZywgaXMgcHRlc3luYyBuZWVkZWQgPyovCisJcmV0dXJuIG9sZF9wdGU7Cit9CisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJhZGl4X19wdGVfdXBkYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQl1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCXB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nIGNsciwKKwkJCQkJdW5zaWduZWQgbG9uZyBzZXQsCisJCQkJCWludCBodWdlKQoreworCXVuc2lnbmVkIGxvbmcgb2xkX3B0ZTsKKworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QT1dFUjlfREQxKSkgeworCisJCXVuc2lnbmVkIGxvbmcgbmV3X3B0ZTsKKworCQlvbGRfcHRlID0gX19yYWRpeF9wdGVfdXBkYXRlKHB0ZXAsIH4wLCAwKTsKKwkJYXNtIHZvbGF0aWxlKCJwdGVzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJCS8qCisJCSAqIG5ldyB2YWx1ZSBvZiBwdGUKKwkJICovCisJCW5ld19wdGUgPSAob2xkX3B0ZSB8IHNldCkgJiB+Y2xyOworCisJCS8qCisJCSAqIEZvciBub3cgbGV0J3MgZG8gaGVhdnkgcGlkIGZsdXNoCisJCSAqIHJhZGl4X19mbHVzaF90bGJfcGFnZV9wc2l6ZShtbSwgYWRkciwgbW11X3ZpcnR1YWxfcHNpemUpOworCQkgKi8KKwkJcmFkaXhfX2ZsdXNoX3RsYl9tbShtbSk7CisKKwkJX19yYWRpeF9wdGVfdXBkYXRlKHB0ZXAsIDAsIG5ld19wdGUpOworCX0gZWxzZQorCQlvbGRfcHRlID0gX19yYWRpeF9wdGVfdXBkYXRlKHB0ZXAsIGNsciwgc2V0KTsKIAlhc20gdm9sYXRpbGUoInB0ZXN5bmMiIDogOiA6ICJtZW1vcnkiKTsKLQkvKiBodWdlIHBhZ2VzIHVzZSB0aGUgb2xkIHBhZ2UgdGFibGUgbG9jayAqLwogCWlmICghaHVnZSkKIAkJYXNzZXJ0X3B0ZV9sb2NrZWQobW0sIGFkZHIpOwogCkBAIC0xMzQsMjAgKzE2NiwzMyBAQAogICogU2V0IHRoZSBkaXJ0eSBhbmQvb3IgYWNjZXNzZWQgYml0cyBhdG9taWNhbGx5IGluIGEgbGludXggUFRFLCB0aGlzCiAgKiBmdW5jdGlvbiBkb2Vzbid0IG5lZWQgdG8gaW52YWxpZGF0ZSB0bGIuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCByYWRpeF9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHB0ZV90ICpwdGVwLCBwdGVfdCBlbnRyeSkKK3N0YXRpYyBpbmxpbmUgdm9pZCByYWRpeF9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkJcHRlX3QgKnB0ZXAsIHB0ZV90IGVudHJ5KQogewotCXB0ZV90IHB0ZTsKLQl1bnNpZ25lZCBsb25nIG9sZF9wdGUsIG5ld19wdGU7CisKIAl1bnNpZ25lZCBsb25nIHNldCA9IHB0ZV92YWwoZW50cnkpICYgKF9QQUdFX0RJUlRZIHwgX1BBR0VfQUNDRVNTRUQgfAogCQkJCQkgICAgICBfUEFHRV9SVyB8IF9QQUdFX0VYRUMpOwotCWRvIHsKLQkJcHRlID0gUkVBRF9PTkNFKCpwdGVwKTsKLQkJb2xkX3B0ZSA9IHB0ZV92YWwocHRlKTsKKworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QT1dFUjlfREQxKSkgeworCisJCXVuc2lnbmVkIGxvbmcgb2xkX3B0ZSwgbmV3X3B0ZTsKKworCQlvbGRfcHRlID0gX19yYWRpeF9wdGVfdXBkYXRlKHB0ZXAsIH4wLCAwKTsKKwkJYXNtIHZvbGF0aWxlKCJwdGVzeW5jIiA6IDogOiAibWVtb3J5Iik7CisJCS8qCisJCSAqIG5ldyB2YWx1ZSBvZiBwdGUKKwkJICovCiAJCW5ld19wdGUgPSBvbGRfcHRlIHwgc2V0OwogCi0JfSB3aGlsZSAoIXB0ZV94Y2hnKHB0ZXAsIF9fcHRlKG9sZF9wdGUpLCBfX3B0ZShuZXdfcHRlKSkpOworCQkvKgorCQkgKiBGb3Igbm93IGxldCdzIGRvIGhlYXZ5IHBpZCBmbHVzaAorCQkgKiByYWRpeF9fZmx1c2hfdGxiX3BhZ2VfcHNpemUobW0sIGFkZHIsIG1tdV92aXJ0dWFsX3BzaXplKTsKKwkJICovCisJCXJhZGl4X19mbHVzaF90bGJfbW0obW0pOwogCi0JLyogV2UgYWxyZWFkeSBkbyBhIHN5bmMgaW4gY21weGNoZywgaXMgcHRlc3luYyBuZWVkZWQgPyovCisJCV9fcmFkaXhfcHRlX3VwZGF0ZShwdGVwLCAwLCBuZXdfcHRlKTsKKwl9IGVsc2UKKwkJX19yYWRpeF9wdGVfdXBkYXRlKHB0ZXAsIDAsIHNldCk7CiAJYXNtIHZvbGF0aWxlKCJwdGVzeW5jIiA6IDogOiAibWVtb3J5Iik7CiB9CiAKQEAgLTIzMywxNCArMjc4LDE5IEBACiB7CiAJdW5zaWduZWQgbG9uZyBydHNfZmllbGQ7CiAJLyoKLQkgKiB3ZSBzdXBwb3J0IDUyIGJpdHMsIGhlbmNlIDUyLTMxID0gMjEsIDBiMTAxMDEKKwkgKiBXZSBzdXBwb3J0IDUyIGJpdHMsIGhlbmNlOgorCSAqICBERDEgICAgNTItMjggPSAyNCwgMGIxMTAwMAorCSAqICBPdGhlcnMgNTItMzEgPSAyMSwgMGIxMDEwMQogCSAqIFJUUyBlbmNvZGluZyBkZXRhaWxzCiAJICogYml0cyAwIC0gMyBvZiBydHMgLT4gYml0cyA2IC0gOCB1bnNpZ25lZCBsb25nCiAJICogYml0cyA0IC0gNSBvZiBydHMgLT4gYml0cyA2MiAtIDYzIG9mIHVuc2lnbmVkIGxvbmcKIAkgKi8KLQlydHNfZmllbGQgPSAoMHg1VUwgPDwgNSk7IC8qIDYgLSA4IGJpdHMgKi8KLQlydHNfZmllbGQgfD0gKDB4MlVMIDw8IDYxKTsKLQorCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QT1dFUjlfREQxKSkKKwkJcnRzX2ZpZWxkID0gKDB4M1VMIDw8IDYxKTsKKwllbHNlIHsKKwkJcnRzX2ZpZWxkID0gKDB4NVVMIDw8IDUpOyAvKiA2IC0gOCBiaXRzICovCisJCXJ0c19maWVsZCB8PSAoMHgyVUwgPDwgNjEpOworCX0KIAlyZXR1cm4gcnRzX2ZpZWxkOwogfQogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Jvb2szcy82NC90bGJmbHVzaC1yYWRpeC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2Jvb2szcy82NC90bGJmbHVzaC1yYWRpeC5oCmluZGV4IDY1MDM3NzYuLmE5ZTE5Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ib29rM3MvNjQvdGxiZmx1c2gtcmFkaXguaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYm9vazNzLzY0L3RsYmZsdXNoLXJhZGl4LmgKQEAgLTQxLDQgKzQxLDUgQEAKIGV4dGVybiB2b2lkIHJhZGl4X19mbHVzaF90bGJfbHBpZF92YSh1bnNpZ25lZCBsb25nIGxwaWQsIHVuc2lnbmVkIGxvbmcgZ3BhLAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBwYWdlX3NpemUpOwogZXh0ZXJuIHZvaWQgcmFkaXhfX2ZsdXNoX3RsYl9scGlkKHVuc2lnbmVkIGxvbmcgbHBpZCk7CitleHRlcm4gdm9pZCByYWRpeF9fZmx1c2hfdGxiX2FsbCh2b2lkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdV9oYXNfZmVhdHVyZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdV9oYXNfZmVhdHVyZS5oCmluZGV4IDJlZjU1ZjguLmIzMTJiMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHVfaGFzX2ZlYXR1cmUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1X2hhc19mZWF0dXJlLmgKQEAgLTE1LDcgKzE1LDcgQEAKICNpZmRlZiBDT05GSUdfSlVNUF9MQUJFTF9GRUFUVVJFX0NIRUNLUwogI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KIAotI2RlZmluZSBOVU1fQ1BVX0ZUUl9LRVlTCTY0CisjZGVmaW5lIE5VTV9DUFVfRlRSX0tFWVMJQklUU19QRVJfTE9ORwogCiBleHRlcm4gc3RydWN0IHN0YXRpY19rZXlfdHJ1ZSBjcHVfZmVhdHVyZV9rZXlzW05VTV9DUFVfRlRSX0tFWVNdOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGFibGUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oCmluZGV4IDgyMDI2YjQuLmY3NTJlNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oCkBAIC0yMTIsNiArMjEyLDcgQEAKICNkZWZpbmUgQ1BVX0ZUUl9EQUJSWAkJCUxPTkdfQVNNX0NPTlNUKDB4MDgwMDAwMDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9QTUFPX0JVRwkJTE9OR19BU01fQ09OU1QoMHgxMDAwMDAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1NVQkNPUkUJCQlMT05HX0FTTV9DT05TVCgweDIwMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIENQVV9GVFJfUE9XRVI5X0REMQkJTE9OR19BU01fQ09OU1QoMHg0MDAwMDAwMDAwMDAwMDAwKQogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC00NzIsNiArNDczLDcgQEAKIAkgICAgQ1BVX0ZUUl9JQ1NXWCB8IENQVV9GVFJfQ0ZBUiB8IENQVV9GVFJfSFZNT0RFIHwgQ1BVX0ZUUl9WTVhfQ09QWSB8IFwKIAkgICAgQ1BVX0ZUUl9EQkVMTCB8IENQVV9GVFJfSEFTX1BQUiB8IENQVV9GVFJfREFXUiB8IFwKIAkgICAgQ1BVX0ZUUl9BUkNIXzIwN1MgfCBDUFVfRlRSX1RNX0NPTVAgfCBDUFVfRlRSX0FSQ0hfMzAwKQorI2RlZmluZSBDUFVfRlRSU19QT1dFUjlfREQxIChDUFVfRlRSU19QT1dFUjkgfCBDUFVfRlRSX1BPV0VSOV9ERDEpCiAjZGVmaW5lIENQVV9GVFJTX0NFTEwJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MV1NZTkMgfCBcCiAJICAgIENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IENQVV9GVFJfQ1RSTCB8IFwKIAkgICAgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCkBAIC00OTAsNyArNDkyLDcgQEAKIAkgICAgKENQVV9GVFJTX1BPV0VSNCB8IENQVV9GVFJTX1BQQzk3MCB8IENQVV9GVFJTX1BPV0VSNSB8IFwKIAkgICAgIENQVV9GVFJTX1BPV0VSNiB8IENQVV9GVFJTX1BPV0VSNyB8IENQVV9GVFJTX1BPV0VSOEUgfCBcCiAJICAgICBDUFVfRlRSU19QT1dFUjggfCBDUFVfRlRSU19QT1dFUjhfREQxIHwgQ1BVX0ZUUlNfQ0VMTCB8IFwKLQkgICAgIENQVV9GVFJTX1BBNlQgfCBDUFVfRlRSX1ZTWCB8IENQVV9GVFJTX1BPV0VSOSkKKwkgICAgIENQVV9GVFJTX1BBNlQgfCBDUFVfRlRSX1ZTWCB8IENQVV9GVFJTX1BPV0VSOSB8IENQVV9GVFJTX1BPV0VSOV9ERDEpCiAjZW5kaWYKICNlbHNlCiBlbnVtIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0aHJlYWRzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGhyZWFkcy5oCmluZGV4IDY2NmJlZjRlLi45Mzc3YmRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGhyZWFkcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0aHJlYWRzLmgKQEAgLTMsNiArMyw3IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGFzbS9jcHVfaGFzX2ZlYXR1cmUuaD4KIAogLyoKICAqIE1hcHBpbmcgb2YgdGhyZWFkcyB0byBjb3JlcwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi02NHMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9leGNlcHRpb24tNjRzLmgKaW5kZXggYmVkNjZlNS4uMmU0ZTdkOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2V4Y2VwdGlvbi02NHMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZXhjZXB0aW9uLTY0cy5oCkBAIC0zNCw2ICszNCw3IEBACiAgKiBleGNlcHRpb24gaGFuZGxlcnMgKGluY2x1ZGluZyBwU2VyaWVzIExQQVIpIGFuZCBpU2VyaWVzIExQQVIKICAqIGltcGxlbWVudGF0aW9ucyBhcyBwb3NzaWJsZS4KICAqLworI2luY2x1ZGUgPGFzbS9oZWFkLTY0Lmg+CiAKICNkZWZpbmUgRVhfUjkJCTAKICNkZWZpbmUgRVhfUjEwCQk4CkBAIC01Miw3ICs1Myw2IEBACiAKICNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKICNkZWZpbmUgX19FWENFUFRJT05fUkVMT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCwgaCkJCQlcCi0JbGQJcjEyLFBBQ0FLQkFTRShyMTMpOwkvKiBnZXQgaGlnaCBwYXJ0IG9mICZsYWJlbCAqLwlcCiAJbWZzcHIJcjExLFNQUk5fIyNoIyNTUlIwOwkvKiBzYXZlIFNSUjAgKi8JCQlcCiAJTE9BRF9IQU5ETEVSKHIxMixsYWJlbCk7CQkJCQlcCiAJbXRjdHIJcjEyOwkJCQkJCQlcCkBAIC04NCwxMyArODQsMTQgQEAKIAogLyoKICAqIFdlJ3JlIHNob3J0IG9uIHNwYWNlIGFuZCB0aW1lIGluIHRoZSBleGNlcHRpb24gcHJvbG9nLCBzbyB3ZSBjYW4ndAotICogdXNlIHRoZSBub3JtYWwgU0VUX1JFR19JTU1FRElBVEUgbWFjcm8uIE5vcm1hbGx5IHdlIGp1c3QgbmVlZCB0aGUKLSAqIGxvdyBoYWxmd29yZCBvZiB0aGUgYWRkcmVzcywgYnV0IGZvciBLZHVtcCB3ZSBuZWVkIHRoZSB3aG9sZSBsb3cKLSAqIHdvcmQuCisgKiB1c2UgdGhlIG5vcm1hbCBMT0FEX1JFR19JTU1FRElBVEUgbWFjcm8gdG8gbG9hZCB0aGUgYWRkcmVzcyBvZiBsYWJlbC4KKyAqIEluc3RlYWQgd2UgZ2V0IHRoZSBiYXNlIG9mIHRoZSBrZXJuZWwgZnJvbSBwYWNhLT5rZXJuZWxiYXNlIGFuZCBvciBpbiB0aGUgbG93CisgKiBwYXJ0IG9mIGxhYmVsLiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGxhYmVsIGJlIHdpdGhpbiA2NEtCIG9mIGtlcm5lbGJhc2UsIGFuZAorICogdGhhdCBrZXJuZWxiYXNlIGJlIDY0SyBhbGlnbmVkLgogICovCiAjZGVmaW5lIExPQURfSEFORExFUihyZWcsIGxhYmVsKQkJCQkJXAotCS8qIEhhbmRsZXJzIG11c3QgYmUgd2l0aGluIDY0SyBvZiBrYmFzZSwgd2hpY2ggbXVzdCBiZSA2NGsgYWxpZ25lZCAqLyBcCi0Jb3JpCXJlZyxyZWcsKGxhYmVsKS1fc3RleHQ7CS8qIHZpcnQgYWRkciBvZiBoYW5kbGVyIC4uLiAqLworCWxkCXJlZyxQQUNBS0JBU0UocjEzKTsJLyogZ2V0IGhpZ2ggcGFydCBvZiAmbGFiZWwgKi8JXAorCW9yaQlyZWcscmVnLChGSVhFRF9TWU1CT0xfQUJTX0FERFIobGFiZWwpKUBsOwogCiAvKiBFeGNlcHRpb24gcmVnaXN0ZXIgcHJlZml4ZXMgKi8KICNkZWZpbmUgRVhDX0hWCUgKQEAgLTE3NSw3ICsxNzYsNiBAQAogCV9fRVhDRVBUSU9OX1BST0xPR18xKGFyZWEsIGV4dHJhLCB2ZWMpCiAKICNkZWZpbmUgX19FWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCwgaCkJCQkJXAotCWxkCXIxMixQQUNBS0JBU0UocjEzKTsJLyogZ2V0IGhpZ2ggcGFydCBvZiAmbGFiZWwgKi8JXAogCWxkCXIxMCxQQUNBS01TUihyMTMpOwkvKiBnZXQgTVNSIHZhbHVlIGZvciBrZXJuZWwgKi8JXAogCW1mc3ByCXIxMSxTUFJOXyMjaCMjU1JSMDsJLyogc2F2ZSBTUlIwICovCQkJXAogCUxPQURfSEFORExFUihyMTIsbGFiZWwpCQkJCQkJXApAQCAtMTkyLDEwICsxOTIsMTAgQEAKIAlFWENFUFRJT05fUFJPTE9HXzEoYXJlYSwgZXh0cmEsIHZlYyk7CQkJCVwKIAlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCwgaCk7CiAKLSNkZWZpbmUgX19LVk1URVNUKG4pCQkJCQkJCVwKLQlsYnoJcjEwLEhTVEFURV9JTl9HVUVTVChyMTMpOwkJCVwKKyNkZWZpbmUgX19LVk1URVNUKGgsIG4pCQkJCQkJCVwKKwlsYnoJcjEwLEhTVEFURV9JTl9HVUVTVChyMTMpOwkJCQlcCiAJY21wd2kJcjEwLDA7CQkJCQkJCVwKLQlibmUJZG9fa3ZtXyMjbgorCWJuZQlkb19rdm1fIyNoIyNuCiAKICNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19IVl9QT1NTSUJMRQogLyoKQEAgLTIwOCw4ICsyMDgsNyBAQAogI2RlZmluZSBrdm1wcGNfaW50ZXJydXB0IGt2bXBwY19pbnRlcnJ1cHRfcHIKICNlbmRpZgogCi0jZGVmaW5lIF9fS1ZNX0hBTkRMRVIoYXJlYSwgaCwgbikJCQkJCVwKLWRvX2t2bV8jI246CQkJCQkJCQlcCisjZGVmaW5lIF9fS1ZNX0hBTkRMRVJfUFJPTE9HKGFyZWEsIG4pCQkJCQlcCiAJQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDk0NykJCQkJCVwKIAlsZAlyMTAsYXJlYStFWF9DRkFSKHIxMyk7CQkJCQlcCiAJc3RkCXIxMCxIU1RBVEVfQ0ZBUihyMTMpOwkJCQkJXApAQCAtMjIyLDIxICsyMjEsMjMgQEAKIAlzdHcJcjksSFNUQVRFX1NDUkFUQ0gxKHIxMyk7CQkJCVwKIAlsZAlyOSxhcmVhK0VYX1I5KHIxMyk7CQkJCQlcCiAJc3RkCXIxMixIU1RBVEVfU0NSQVRDSDAocjEzKTsJCQkJXAorCisjZGVmaW5lIF9fS1ZNX0hBTkRMRVIoYXJlYSwgaCwgbikJCQkJCVwKKwlfX0tWTV9IQU5ETEVSX1BST0xPRyhhcmVhLCBuKQkJCQkJXAogCWxpCXIxMixuOwkJCQkJCQlcCiAJYglrdm1wcGNfaW50ZXJydXB0CiAKICNkZWZpbmUgX19LVk1fSEFORExFUl9TS0lQKGFyZWEsIGgsIG4pCQkJCQlcCi1kb19rdm1fIyNuOgkJCQkJCQkJXAogCWNtcHdpCXIxMCxLVk1fR1VFU1RfTU9ERV9TS0lQOwkJCQlcCiAJbGQJcjEwLGFyZWErRVhfUjEwKHIxMyk7CQkJCQlcCiAJYmVxCTg5ZjsJCQkJCQkJXAotCXN0dwlyOSxIU1RBVEVfU0NSQVRDSDEocjEzKTsJCQlcCisJc3R3CXI5LEhTVEFURV9TQ1JBVENIMShyMTMpOwkJCQlcCiAJQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDk0OCkJCQkJCVwKIAlsZAlyOSxhcmVhK0VYX1BQUihyMTMpOwkJCQkJXAogCXN0ZAlyOSxIU1RBVEVfUFBSKHIxMyk7CQkJCQlcCiAJRU5EX0ZUUl9TRUNUSU9OX05FU1RFRChDUFVfRlRSX0hBU19QUFIsQ1BVX0ZUUl9IQVNfUFBSLDk0OCk7CVwKIAlsZAlyOSxhcmVhK0VYX1I5KHIxMyk7CQkJCQlcCi0Jc3RkCXIxMixIU1RBVEVfU0NSQVRDSDAocjEzKTsJCQlcCisJc3RkCXIxMixIU1RBVEVfU0NSQVRDSDAocjEzKTsJCQkJXAogCWxpCXIxMixuOwkJCQkJCQlcCiAJYglrdm1wcGNfaW50ZXJydXB0OwkJCQkJXAogODk6CW10b2NyZgkweDgwLHI5OwkJCQkJCVwKQEAgLTI0NCwxMiArMjQ1LDEyIEBACiAJYglrdm1wcGNfc2tpcF8jI2gjI2ludGVycnVwdAogCiAjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSEFORExFUgotI2RlZmluZSBLVk1URVNUKG4pCQkJX19LVk1URVNUKG4pCisjZGVmaW5lIEtWTVRFU1QoaCwgbikJCQlfX0tWTVRFU1QoaCwgbikKICNkZWZpbmUgS1ZNX0hBTkRMRVIoYXJlYSwgaCwgbikJCV9fS1ZNX0hBTkRMRVIoYXJlYSwgaCwgbikKICNkZWZpbmUgS1ZNX0hBTkRMRVJfU0tJUChhcmVhLCBoLCBuKQlfX0tWTV9IQU5ETEVSX1NLSVAoYXJlYSwgaCwgbikKIAogI2Vsc2UKLSNkZWZpbmUgS1ZNVEVTVChuKQorI2RlZmluZSBLVk1URVNUKGgsIG4pCiAjZGVmaW5lIEtWTV9IQU5ETEVSKGFyZWEsIGgsIG4pCiAjZGVmaW5lIEtWTV9IQU5ETEVSX1NLSVAoYXJlYSwgaCwgbikKICNlbmRpZgpAQCAtMzMzLDk0ICszMzQsNzkgQEAKIC8qCiAgKiBFeGNlcHRpb24gdmVjdG9ycy4KICAqLwotI2RlZmluZSBTVERfRVhDRVBUSU9OX1BTRVJJRVModmVjLCBsYWJlbCkJCVwKLQkuID0gdmVjOwkJCQkJXAotCS5nbG9ibCBsYWJlbCMjX3BTZXJpZXM7CQkJCVwKLWxhYmVsIyNfcFNlcmllczoJCQkJCVwKKyNkZWZpbmUgU1REX0VYQ0VQVElPTl9QU0VSSUVTKHZlYywgbGFiZWwpCQkJXAogCVNFVF9TQ1JBVENIMChyMTMpOwkJLyogc2F2ZSByMTMgKi8JCVwKLQlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWEdFTiwgbGFiZWwjI19jb21tb24sCVwKLQkJCQkgRVhDX1NURCwgS1ZNVEVTVCwgdmVjKQorCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBsYWJlbCwJCVwKKwkJCQkgRVhDX1NURCwgS1ZNVEVTVF9QUiwgdmVjKTsJXAogCiAvKiBWZXJzaW9uIG9mIGFib3ZlIGZvciB3aGVuIHdlIGhhdmUgdG8gYnJhbmNoIG91dC1vZi1saW5lICovCisjZGVmaW5lIF9fT09MX0VYQ0VQVElPTih2ZWMsIGxhYmVsLCBoZGxyKQkJCVwKKwlTRVRfU0NSQVRDSDAocjEzKQkJCQkJXAorCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYR0VOKQkJCQlcCisJYiBoZGxyOworCiAjZGVmaW5lIFNURF9FWENFUFRJT05fUFNFUklFU19PT0wodmVjLCBsYWJlbCkJCQlcCi0JLmdsb2JsIGxhYmVsIyNfcFNlcmllczsJCQkJCVwKLWxhYmVsIyNfcFNlcmllczoJCQkJCQlcCi0JRVhDRVBUSU9OX1BST0xPR18xKFBBQ0FfRVhHRU4sIEtWTVRFU1QsIHZlYyk7CVwKLQlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCMjX2NvbW1vbiwgRVhDX1NURCkKKwlFWENFUFRJT05fUFJPTE9HXzEoUEFDQV9FWEdFTiwgS1ZNVEVTVF9QUiwgdmVjKTsJXAorCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFU18xKGxhYmVsLCBFWENfU1REKQogCi0jZGVmaW5lIFNURF9FWENFUFRJT05fSFYobG9jLCB2ZWMsIGxhYmVsKQkJXAotCS4gPSBsb2M7CQkJCQlcCi0JLmdsb2JsIGxhYmVsIyNfaHY7CQkJCVwKLWxhYmVsIyNfaHY6CQkJCQkJXAorI2RlZmluZSBTVERfRVhDRVBUSU9OX0hWKGxvYywgdmVjLCBsYWJlbCkJCQlcCiAJU0VUX1NDUkFUQ0gwKHIxMyk7CS8qIHNhdmUgcjEzICovCQkJXAotCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBsYWJlbCMjX2NvbW1vbiwJXAotCQkJCSBFWENfSFYsIEtWTVRFU1QsIHZlYykKKwlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWEdFTiwgbGFiZWwsCQlcCisJCQkJIEVYQ19IViwgS1ZNVEVTVF9IViwgdmVjKTsKIAotLyogVmVyc2lvbiBvZiBhYm92ZSBmb3Igd2hlbiB3ZSBoYXZlIHRvIGJyYW5jaCBvdXQtb2YtbGluZSAqLwotI2RlZmluZSBTVERfRVhDRVBUSU9OX0hWX09PTCh2ZWMsIGxhYmVsKQkJXAotCS5nbG9ibCBsYWJlbCMjX2h2OwkJCQlcCi1sYWJlbCMjX2h2OgkJCQkJCVwKLQlFWENFUFRJT05fUFJPTE9HXzEoUEFDQV9FWEdFTiwgS1ZNVEVTVCwgdmVjKTsJXAotCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFU18xKGxhYmVsIyNfY29tbW9uLCBFWENfSFYpCisjZGVmaW5lIFNURF9FWENFUFRJT05fSFZfT09MKHZlYywgbGFiZWwpCQkJXAorCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYR0VOLCBLVk1URVNUX0hWLCB2ZWMpOwlcCisJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTXzEobGFiZWwsIEVYQ19IVikKIAogI2RlZmluZSBTVERfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVMobG9jLCB2ZWMsIGxhYmVsKQlcCi0JLiA9IGxvYzsJCQkJCVwKLQkuZ2xvYmwgbGFiZWwjI19yZWxvbl9wU2VyaWVzOwkJCVwKLWxhYmVsIyNfcmVsb25fcFNlcmllczoJCQkJCVwKIAkvKiBObyBndWVzdCBpbnRlcnJ1cHRzIGNvbWUgdGhyb3VnaCBoZXJlICovCVwKIAlTRVRfU0NSQVRDSDAocjEzKTsJCS8qIHNhdmUgcjEzICovCVwKLQlFWENFUFRJT05fUkVMT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWEdFTiwgbGFiZWwjI19jb21tb24sIFwKLQkJCQkgICAgICAgRVhDX1NURCwgTk9URVNULCB2ZWMpCisJRVhDRVBUSU9OX1JFTE9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhHRU4sIGxhYmVsLCBFWENfU1RELCBOT1RFU1QsIHZlYyk7CiAKICNkZWZpbmUgU1REX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTX09PTCh2ZWMsIGxhYmVsKQkJXAotCS5nbG9ibCBsYWJlbCMjX3JlbG9uX3BTZXJpZXM7CQkJCVwKLWxhYmVsIyNfcmVsb25fcFNlcmllczoJCQkJCQlcCiAJRVhDRVBUSU9OX1BST0xPR18xKFBBQ0FfRVhHRU4sIE5PVEVTVCwgdmVjKTsJCVwKLQlFWENFUFRJT05fUkVMT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCMjX2NvbW1vbiwgRVhDX1NURCkKKwlFWENFUFRJT05fUkVMT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCwgRVhDX1NURCkKIAogI2RlZmluZSBTVERfUkVMT05fRVhDRVBUSU9OX0hWKGxvYywgdmVjLCBsYWJlbCkJCVwKLQkuID0gbG9jOwkJCQkJXAotCS5nbG9ibCBsYWJlbCMjX3JlbG9uX2h2OwkJCVwKLWxhYmVsIyNfcmVsb25faHY6CQkJCQlcCiAJLyogTm8gZ3Vlc3QgaW50ZXJydXB0cyBjb21lIHRocm91Z2ggaGVyZSAqLwlcCiAJU0VUX1NDUkFUQ0gwKHIxMyk7CS8qIHNhdmUgcjEzICovCQlcCi0JRVhDRVBUSU9OX1JFTE9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhHRU4sIGxhYmVsIyNfY29tbW9uLCBcCi0JCQkJICAgICAgIEVYQ19IViwgTk9URVNULCB2ZWMpCisJRVhDRVBUSU9OX1JFTE9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhHRU4sIGxhYmVsLCBFWENfSFYsIE5PVEVTVCwgdmVjKTsKIAogI2RlZmluZSBTVERfUkVMT05fRVhDRVBUSU9OX0hWX09PTCh2ZWMsIGxhYmVsKQkJCVwKLQkuZ2xvYmwgbGFiZWwjI19yZWxvbl9odjsJCQkJXAotbGFiZWwjI19yZWxvbl9odjoJCQkJCQlcCiAJRVhDRVBUSU9OX1BST0xPR18xKFBBQ0FfRVhHRU4sIE5PVEVTVCwgdmVjKTsJCVwKLQlFWENFUFRJT05fUkVMT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCMjX2NvbW1vbiwgRVhDX0hWKQorCUVYQ0VQVElPTl9SRUxPTl9QUk9MT0dfUFNFUklFU18xKGxhYmVsLCBFWENfSFYpCiAKIC8qIFRoaXMgYXNzb2NpYXRlIHZlY3RvciBudW1iZXJzIHdpdGggYml0cyBpbiBwYWNhLT5pcnFfaGFwcGVuZWQgKi8KICNkZWZpbmUgU09GVEVOX1ZBTFVFXzB4NTAwCVBBQ0FfSVJRX0VFCi0jZGVmaW5lIFNPRlRFTl9WQUxVRV8weDUwMglQQUNBX0lSUV9FRQogI2RlZmluZSBTT0ZURU5fVkFMVUVfMHg5MDAJUEFDQV9JUlFfREVDCi0jZGVmaW5lIFNPRlRFTl9WQUxVRV8weDk4MglQQUNBX0lSUV9ERUMKKyNkZWZpbmUgU09GVEVOX1ZBTFVFXzB4OTgwCVBBQ0FfSVJRX0RFQwogI2RlZmluZSBTT0ZURU5fVkFMVUVfMHhhMDAJUEFDQV9JUlFfREJFTEwKICNkZWZpbmUgU09GVEVOX1ZBTFVFXzB4ZTgwCVBBQ0FfSVJRX0RCRUxMCi0jZGVmaW5lIFNPRlRFTl9WQUxVRV8weGU4MglQQUNBX0lSUV9EQkVMTAogI2RlZmluZSBTT0ZURU5fVkFMVUVfMHhlNjAJUEFDQV9JUlFfSE1JCi0jZGVmaW5lIFNPRlRFTl9WQUxVRV8weGU2MglQQUNBX0lSUV9ITUkKICNkZWZpbmUgU09GVEVOX1ZBTFVFXzB4ZWEwCVBBQ0FfSVJRX0VFCi0jZGVmaW5lIFNPRlRFTl9WQUxVRV8weGVhMglQQUNBX0lSUV9FRQogCiAjZGVmaW5lIF9fU09GVEVOX1RFU1QoaCwgdmVjKQkJCQkJCVwKIAlsYnoJcjEwLFBBQ0FTT0ZUSVJRRU4ocjEzKTsJCQkJCVwKIAljbXB3aQlyMTAsMDsJCQkJCQkJXAogCWxpCXIxMCxTT0ZURU5fVkFMVUVfIyN2ZWM7CQkJCQlcCiAJYmVxCW1hc2tlZF8jI2gjI2ludGVycnVwdAorCiAjZGVmaW5lIF9TT0ZURU5fVEVTVChoLCB2ZWMpCV9fU09GVEVOX1RFU1QoaCwgdmVjKQogCiAjZGVmaW5lIFNPRlRFTl9URVNUX1BSKHZlYykJCQkJCQlcCi0JS1ZNVEVTVCh2ZWMpOwkJCQkJCQlcCisJS1ZNVEVTVChFWENfU1RELCB2ZWMpOwkJCQkJCVwKIAlfU09GVEVOX1RFU1QoRVhDX1NURCwgdmVjKQogCiAjZGVmaW5lIFNPRlRFTl9URVNUX0hWKHZlYykJCQkJCQlcCi0JS1ZNVEVTVCh2ZWMpOwkJCQkJCQlcCisJS1ZNVEVTVChFWENfSFYsIHZlYyk7CQkJCQkJXAogCV9TT0ZURU5fVEVTVChFWENfSFYsIHZlYykKIAorI2RlZmluZSBLVk1URVNUX1BSKHZlYykJCQkJCQkJXAorCUtWTVRFU1QoRVhDX1NURCwgdmVjKQorCisjZGVmaW5lIEtWTVRFU1RfSFYodmVjKQkJCQkJCQlcCisJS1ZNVEVTVChFWENfSFYsIHZlYykKKwogI2RlZmluZSBTT0ZURU5fTk9URVNUX1BSKHZlYykJCV9TT0ZURU5fVEVTVChFWENfU1RELCB2ZWMpCiAjZGVmaW5lIFNPRlRFTl9OT1RFU1RfSFYodmVjKQkJX1NPRlRFTl9URVNUKEVYQ19IViwgdmVjKQogCkBAIC00MjgsNTggKzQxNCw0NyBAQAogCVNFVF9TQ1JBVENIMChyMTMpOyAgICAvKiBzYXZlIHIxMyAqLwkJCQlcCiAJRVhDRVBUSU9OX1BST0xPR18wKFBBQ0FfRVhHRU4pOwkJCQkJXAogCV9fRVhDRVBUSU9OX1BST0xPR18xKFBBQ0FfRVhHRU4sIGV4dHJhLCB2ZWMpOwkJCVwKLQlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCMjX2NvbW1vbiwgaCk7CisJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTXzEobGFiZWwsIGgpOwogCiAjZGVmaW5lIF9NQVNLQUJMRV9FWENFUFRJT05fUFNFUklFUyh2ZWMsIGxhYmVsLCBoLCBleHRyYSkJCVwKIAlfX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKHZlYywgbGFiZWwsIGgsIGV4dHJhKQogCiAjZGVmaW5lIE1BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKGxvYywgdmVjLCBsYWJlbCkJCQlcCi0JLiA9IGxvYzsJCQkJCQkJXAotCS5nbG9ibCBsYWJlbCMjX3BTZXJpZXM7CQkJCQkJXAotbGFiZWwjI19wU2VyaWVzOgkJCQkJCQlcCiAJX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKHZlYywgbGFiZWwsCQkJCVwKIAkJCQkgICAgRVhDX1NURCwgU09GVEVOX1RFU1RfUFIpCiAKKyNkZWZpbmUgTUFTS0FCTEVfRVhDRVBUSU9OX1BTRVJJRVNfT09MKHZlYywgbGFiZWwpCQkJXAorCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYR0VOLCBTT0ZURU5fVEVTVF9QUiwgdmVjKTsJCVwKKwlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCwgRVhDX1NURCkKKwogI2RlZmluZSBNQVNLQUJMRV9FWENFUFRJT05fSFYobG9jLCB2ZWMsIGxhYmVsKQkJCQlcCi0JLiA9IGxvYzsJCQkJCQkJXAotCS5nbG9ibCBsYWJlbCMjX2h2OwkJCQkJCVwKLWxhYmVsIyNfaHY6CQkJCQkJCQlcCiAJX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKHZlYywgbGFiZWwsCQkJCVwKIAkJCQkgICAgRVhDX0hWLCBTT0ZURU5fVEVTVF9IVikKIAogI2RlZmluZSBNQVNLQUJMRV9FWENFUFRJT05fSFZfT09MKHZlYywgbGFiZWwpCQkJCVwKLQkuZ2xvYmwgbGFiZWwjI19odjsJCQkJCQlcCi1sYWJlbCMjX2h2OgkJCQkJCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYR0VOLCBTT0ZURU5fVEVTVF9IViwgdmVjKTsJCVwKLQlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCMjX2NvbW1vbiwgRVhDX0hWKTsKKwlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCwgRVhDX0hWKQogCiAjZGVmaW5lIF9fTUFTS0FCTEVfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVModmVjLCBsYWJlbCwgaCwgZXh0cmEpCVwKIAlTRVRfU0NSQVRDSDAocjEzKTsgICAgLyogc2F2ZSByMTMgKi8JCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYR0VOKTsJCQkJCVwKLQlfX0VYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYR0VOLCBleHRyYSwgdmVjKTsJCVwKLQlFWENFUFRJT05fUkVMT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCMjX2NvbW1vbiwgaCk7Ci0jZGVmaW5lIF9NQVNLQUJMRV9SRUxPTl9FWENFUFRJT05fUFNFUklFUyh2ZWMsIGxhYmVsLCBoLCBleHRyYSkJXAorCV9fRVhDRVBUSU9OX1BST0xPR18xKFBBQ0FfRVhHRU4sIGV4dHJhLCB2ZWMpOwkJCVwKKwlFWENFUFRJT05fUkVMT05fUFJPTE9HX1BTRVJJRVNfMShsYWJlbCwgaCkKKworI2RlZmluZSBfTUFTS0FCTEVfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVModmVjLCBsYWJlbCwgaCwgZXh0cmEpCQlcCiAJX19NQVNLQUJMRV9SRUxPTl9FWENFUFRJT05fUFNFUklFUyh2ZWMsIGxhYmVsLCBoLCBleHRyYSkKIAogI2RlZmluZSBNQVNLQUJMRV9SRUxPTl9FWENFUFRJT05fUFNFUklFUyhsb2MsIHZlYywgbGFiZWwpCQlcCi0JLiA9IGxvYzsJCQkJCQkJXAotCS5nbG9ibCBsYWJlbCMjX3JlbG9uX3BTZXJpZXM7CQkJCQlcCi1sYWJlbCMjX3JlbG9uX3BTZXJpZXM6CQkJCQkJCVwKIAlfTUFTS0FCTEVfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVModmVjLCBsYWJlbCwJCQlcCiAJCQkJCSAgRVhDX1NURCwgU09GVEVOX05PVEVTVF9QUikKIAogI2RlZmluZSBNQVNLQUJMRV9SRUxPTl9FWENFUFRJT05fSFYobG9jLCB2ZWMsIGxhYmVsKQkJCVwKLQkuID0gbG9jOwkJCQkJCQlcCi0JLmdsb2JsIGxhYmVsIyNfcmVsb25faHY7CQkJCQlcCi1sYWJlbCMjX3JlbG9uX2h2OgkJCQkJCQlcCiAJX01BU0tBQkxFX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTKHZlYywgbGFiZWwsCQkJXAogCQkJCQkgIEVYQ19IViwgU09GVEVOX05PVEVTVF9IVikKIAogI2RlZmluZSBNQVNLQUJMRV9SRUxPTl9FWENFUFRJT05fSFZfT09MKHZlYywgbGFiZWwpCQkJXAotCS5nbG9ibCBsYWJlbCMjX3JlbG9uX2h2OwkJCQkJXAotbGFiZWwjI19yZWxvbl9odjoJCQkJCQkJXAogCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYR0VOLCBTT0ZURU5fTk9URVNUX0hWLCB2ZWMpOwkJXAotCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFU18xKGxhYmVsIyNfY29tbW9uLCBFWENfSFYpOworCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFU18xKGxhYmVsLCBFWENfSFYpCiAKIC8qCiAgKiBPdXIgZXhjZXB0aW9uIGNvbW1vbiBjb2RlIGNhbiBiZSBwYXNzZWQgdmFyaW91cyAiYWRkaXRpb25zIgpAQCAtNTA1LDkgKzQ4MCw2IEBACiBFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9DVFJMKQogCiAjZGVmaW5lIEVYQ0VQVElPTl9DT01NT04odHJhcCwgbGFiZWwsIGhkbHIsIHJldCwgYWRkaXRpb25zKQlcCi0JLmFsaWduCTc7CQkJCQkJXAotCS5nbG9ibCBsYWJlbCMjX2NvbW1vbjsJCQkJCVwKLWxhYmVsIyNfY29tbW9uOgkJCQkJCQlcCiAJRVhDRVBUSU9OX1BST0xPR19DT01NT04odHJhcCwgUEFDQV9FWEdFTik7CQlcCiAJLyogVm9sYXRpbGUgcmVncyBhcmUgcG90ZW50aWFsbHkgY2xvYmJlcmVkIGhlcmUgKi8JXAogCWFkZGl0aW9uczsJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmFkdW1wLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZmFkdW1wLmgKaW5kZXggYjQ0MDdkMC4uMDAzMTgwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2ZhZHVtcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9mYWR1bXAuaApAQCAtNDUsMTAgKzQ1LDYgQEAKIAogI2RlZmluZSBtZW1ibG9ja19udW1fcmVnaW9ucyhtZW1ibG9ja190eXBlKQkobWVtYmxvY2subWVtYmxvY2tfdHlwZS5jbnQpCiAKLSNpZm5kZWYgRUxGX0NPUkVfRUZMQUdTCi0jZGVmaW5lIEVMRl9DT1JFX0VGTEFHUyAwCi0jZW5kaWYKLQogLyogRmlybXdhcmUgcHJvdmlkZWQgZHVtcCBzZWN0aW9ucyAqLwogI2RlZmluZSBGQURVTVBfQ1BVX1NUQVRFX0RBVEEJMHgwMDAxCiAjZGVmaW5lIEZBRFVNUF9IUFRFX1JFR0lPTgkweDAwMDIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9oZWFkLTY0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaGVhZC02NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOTBjMmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaGVhZC02NC5oCkBAIC0wLDAgKzEsMzkzIEBACisjaWZuZGVmIF9BU01fUE9XRVJQQ19IRUFEXzY0X0gKKyNkZWZpbmUgX0FTTV9QT1dFUlBDX0hFQURfNjRfSAorCisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisKKy8qCisgKiBXZSBjYW4ndCBkbyBDUFAgc3RyaW5naWZpY2F0aW9uIGFuZCBjb25jYXRpbmF0aW9uIGRpcmVjdGx5IGludG8gdGhlIHNlY3Rpb24KKyAqIG5hbWUgZm9yIHNvbWUgcmVhc29uLCBzbyB0aGVzZSBtYWNyb3MgY2FuIGRvIGl0IGZvciB1cy4KKyAqLworLm1hY3JvIGRlZmluZV9mdHNlYyBuYW1lCisJLnNlY3Rpb24gIi5oZWFkLnRleHQuXG5hbWVcKCkiLCJheCIsQHByb2diaXRzCisuZW5kbQorLm1hY3JvIGRlZmluZV9kYXRhX2Z0c2VjIG5hbWUKKwkuc2VjdGlvbiAiLmhlYWQuZGF0YS5cbmFtZVwoKSIsImEiLEBwcm9nYml0cworLmVuZG0KKy5tYWNybyB1c2VfZnRzZWMgbmFtZQorCS5zZWN0aW9uICIuaGVhZC50ZXh0LlxuYW1lXCgpIgorLmVuZG0KKworLyoKKyAqIEZpeGVkIChsb2NhdGlvbikgc2VjdGlvbnMgYXJlIHVzZWQgYnkgb3BlbmluZyBmaXhlZCBzZWN0aW9ucyBhbmQgZW1pdHRpbmcKKyAqIGZpeGVkIHNlY3Rpb24gZW50cmllcyBpbnRvIHRoZW0gYmVmb3JlIGNsb3NpbmcgdGhlbS4gTXVsdGlwbGUgZml4ZWQgc2VjdGlvbnMKKyAqIGNhbiBiZSBvcGVuIGF0IGFueSB0aW1lLgorICoKKyAqIEVhY2ggZml4ZWQgc2VjdGlvbiBjcmVhdGVkIGluIGEgLlMgZmlsZSBtdXN0IGhhdmUgY29ycmVzcG9uZGluZyBsaW5rYWdlCisgKiBkaXJlY3RpdmVzIGluY2x1ZGluZyBsb2NhdGlvbiwgYWRkZWQgdG8gIGFyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUworICoKKyAqIEZvciBlYWNoIGZpeGVkIHNlY3Rpb24sIGNvZGUgaXMgZ2VuZXJhdGVkIGludG8gaXQgaW4gdGhlIG9yZGVyIHdoaWNoIGl0CisgKiBhcHBlYXJzIGluIHRoZSBzb3VyY2UuICBGaXhlZCBzZWN0aW9uIGVudHJpZXMgY2FuIGJlIHBsYWNlZCBhdCBhIGZpeGVkCisgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIHNlY3Rpb24gdXNpbmcgX0xPQ0FUSU9OIHBvc3RpZnggdmFyaWFudHMuIFRoZXNlIG11c3QKKyAqIGJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHJlbGF0aXZlIHBsYWNlbWVudHMgd2l0aGluIHRoZSBzZWN0aW9uLgorICoKKyAqIE9QRU5fRklYRURfU0VDVElPTihzZWN0aW9uX25hbWUsIHN0YXJ0X2FkZHJlc3MsIGVuZF9hZGRyZXNzKQorICogRklYRURfU0VDVElPTl9FTlRSWV9CRUdJTihzZWN0aW9uX25hbWUsIGxhYmVsMSkKKyAqCisgKiBVU0VfRklYRURfU0VDVElPTihzZWN0aW9uX25hbWUpCisgKiBsYWJlbDM6CisgKiAgICAgbGkgIHIxMCwxMjgKKyAqICAgICBtdiAgcjExLHIxMAorCisgKiBGSVhFRF9TRUNUSU9OX0VOVFJZX0JFR0lOX0xPQ0FUSU9OKHNlY3Rpb25fbmFtZSwgbGFiZWwyLCBzdGFydF9hZGRyZXNzKQorICogRklYRURfU0VDVElPTl9FTlRSWV9FTkRfTE9DQVRJT04oc2VjdGlvbl9uYW1lLCBsYWJlbDIsIGVuZF9hZGRyZXNzKQorICogQ0xPU0VfRklYRURfU0VDVElPTihzZWN0aW9uX25hbWUpCisgKgorICogWkVST19GSVhFRF9TRUNUSU9OIGNhbiBiZSB1c2VkIHRvIGVtaXQgemVyb2VkIGRhdGEuCisgKgorICogVHJvdWJsZXNob290aW5nOgorICogLSBJZiB0aGUgYnVpbGQgZGllcyB3aXRoICJFcnJvcjogYXR0ZW1wdCB0byBtb3ZlIC5vcmcgYmFja3dhcmRzIiBhdAorICogICBDTE9TRV9GSVhFRF9TRUNUSU9OKCkgb3IgZWxzZXdoZXJlLCB0aGVyZSBtYXkgYmUgc29tZXRoaW5nCisgKiAgIHVuZXhwZWN0ZWQgYmVpbmcgYWRkZWQgdGhlcmUuIFJlbW92ZSB0aGUgJy4gPSB4X2xlbicgbGluZSwgcmVidWlsZCwgYW5kCisgKiAgIGNoZWNrIHdoYXQgaXMgcHVzaGluZyB0aGUgc2VjdGlvbiBkb3duLgorICogLSBJZiB0aGUgYnVpbGQgZGllcyBpbiBsaW5raW5nLCBjaGVjayBhcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKKyAqICAgZm9yIGluc3RydWN0aW9ucy4KKyAqIC0gSWYgdGhlIGtlcm5lbCBjcmFzaGVzIG9yIGhhbmdzIGluIHZlcnkgZWFybHkgYm9vdCwgaXQgY291bGQgYmUgbGlua2VyCisgKiAgIHN0dWJzIGF0IHRoZSBzdGFydCBvZiB0aGUgbWFpbiB0ZXh0LgorICovCisKKyNkZWZpbmUgT1BFTl9GSVhFRF9TRUNUSU9OKHNuYW1lLCBzdGFydCwgZW5kKQkJCVwKKwlzbmFtZSMjX3N0YXJ0ID0gKHN0YXJ0KTsJCQkJXAorCXNuYW1lIyNfZW5kID0gKGVuZCk7CQkJCQlcCisJc25hbWUjI19sZW4gPSAoZW5kKSAtIChzdGFydCk7CQkJCVwKKwlkZWZpbmVfZnRzZWMgc25hbWU7CQkJCQlcCisJLiA9IDB4MDsJCQkJCQlcCitzdGFydF8jI3NuYW1lOgorCisjZGVmaW5lIE9QRU5fVEVYVF9TRUNUSU9OKHN0YXJ0KQkJCQlcCisJdGV4dF9zdGFydCA9IChzdGFydCk7CQkJCQlcCisJLnNlY3Rpb24gIi50ZXh0IiwiYXgiLEBwcm9nYml0czsJCQlcCisJLiA9IDB4MDsJCQkJCQlcCitzdGFydF90ZXh0OgorCisjZGVmaW5lIFpFUk9fRklYRURfU0VDVElPTihzbmFtZSwgc3RhcnQsIGVuZCkJCQlcCisJc25hbWUjI19zdGFydCA9IChzdGFydCk7CQkJCVwKKwlzbmFtZSMjX2VuZCA9IChlbmQpOwkJCQkJXAorCXNuYW1lIyNfbGVuID0gKGVuZCkgLSAoc3RhcnQpOwkJCQlcCisJZGVmaW5lX2RhdGFfZnRzZWMgc25hbWU7CQkJCVwKKwkuID0gMHgwOwkJCQkJCVwKKwkuID0gc25hbWUjI19sZW47CisKKyNkZWZpbmUgVVNFX0ZJWEVEX1NFQ1RJT04oc25hbWUpCQkJCVwKKwlmc19sYWJlbCA9IHN0YXJ0XyMjc25hbWU7CQkJCVwKKwlmc19zdGFydCA9IHNuYW1lIyNfc3RhcnQ7CQkJCVwKKwl1c2VfZnRzZWMgc25hbWU7CisKKyNkZWZpbmUgVVNFX1RFWFRfU0VDVElPTigpCQkJCQlcCisJZnNfbGFiZWwgPSBzdGFydF90ZXh0OwkJCQkJXAorCWZzX3N0YXJ0ID0gdGV4dF9zdGFydDsJCQkJCVwKKwkudGV4dAorCisjZGVmaW5lIENMT1NFX0ZJWEVEX1NFQ1RJT04oc25hbWUpCQkJCVwKKwlVU0VfRklYRURfU0VDVElPTihzbmFtZSk7CQkJCVwKKwkuID0gc25hbWUjI19sZW47CQkJCQlcCitlbmRfIyNzbmFtZToKKworCisjZGVmaW5lIF9fRklYRURfU0VDVElPTl9FTlRSWV9CRUdJTihzbmFtZSwgbmFtZSwgX19hbGlnbikJXAorCVVTRV9GSVhFRF9TRUNUSU9OKHNuYW1lKTsJCQkJXAorCS5hbGlnbiBfX2FsaWduOwkJCQkJCVwKKwkuZ2xvYmFsIG5hbWU7CQkJCQkJXAorbmFtZToKKworI2RlZmluZSBGSVhFRF9TRUNUSU9OX0VOVFJZX0JFR0lOKHNuYW1lLCBuYW1lKQkJCVwKKwlfX0ZJWEVEX1NFQ1RJT05fRU5UUllfQkVHSU4oc25hbWUsIG5hbWUsIDApCisKKyNkZWZpbmUgRklYRURfU0VDVElPTl9FTlRSWV9CRUdJTl9MT0NBVElPTihzbmFtZSwgbmFtZSwgc3RhcnQpCQlcCisJVVNFX0ZJWEVEX1NFQ1RJT04oc25hbWUpOwkJCQlcCisJbmFtZSMjX3N0YXJ0ID0gKHN0YXJ0KTsJCQkJCVwKKwkuaWYgKHN0YXJ0KSA8IHNuYW1lIyNfc3RhcnQ7CQkJCVwKKwkuZXJyb3IgIkZpeGVkIHNlY3Rpb24gdW5kZXJmbG93IjsJCQlcCisJLmFib3J0OwkJCQkJCQlcCisJLmVuZGlmOwkJCQkJCQlcCisJLiA9IChzdGFydCkgLSBzbmFtZSMjX3N0YXJ0OwkJCQlcCisJLmdsb2JhbCBuYW1lOwkJCQkJCVwKK25hbWU6CisKKyNkZWZpbmUgRklYRURfU0VDVElPTl9FTlRSWV9FTkRfTE9DQVRJT04oc25hbWUsIG5hbWUsIGVuZCkJCVwKKwkuaWYgKGVuZCkgPiBzbmFtZSMjX2VuZDsJCQkJXAorCS5lcnJvciAiRml4ZWQgc2VjdGlvbiBvdmVyZmxvdyI7CQkJXAorCS5hYm9ydDsJCQkJCQkJXAorCS5lbmRpZjsJCQkJCQkJXAorCS5pZiAoLiAtIG5hbWUgPiBlbmQgLSBuYW1lIyNfc3RhcnQpOwkJCVwKKwkuZXJyb3IgIkZpeGVkIGVudHJ5IG92ZXJmbG93IjsJCQkJXAorCS5hYm9ydDsJCQkJCQkJXAorCS5lbmRpZjsJCQkJCQkJXAorCS4gPSAoKGVuZCkgLSBzbmFtZSMjX3N0YXJ0KTsJCQkJXAorCisKKy8qCisgKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgdG8gY2hhbmdlIHN5bWJvbHMgaW4gb3RoZXIgZml4ZWQgc2VjdGlvbnMgdG8gYmUKKyAqIGFic29sdXRlIG9yIHJlbGF0ZWQgdG8gb3VyIGN1cnJlbnQgZml4ZWQgc2VjdGlvbi4KKyAqCisgKiAtIERFRklORV9GSVhFRF9TWU1CT0wgLyBGSVhFRF9TWU1CT0xfQUJTX0FERFIgaXMgdXNlZCB0byBmaW5kIHRoZQorICogICBhYnNvbHV0ZSBhZGRyZXNzIG9mIGEgc3ltYm9sIHdpdGhpbiBhIGZpeGVkIHNlY3Rpb24sIGZyb20gYW55IHNlY3Rpb24uCisgKgorICogLSBBQlNfQUREUiBpcyB1c2VkIHRvIGZpbmQgdGhlIGFic29sdXRlIGFkZHJlc3Mgb2YgYW55IHN5bWJvbCwgZnJvbSB3aXRoaW4KKyAqICAgYSBmaXhlZCBzZWN0aW9uLgorICovCisjZGVmaW5lIERFRklORV9GSVhFRF9TWU1CT0wobGFiZWwpCQkJCVwKKwlsYWJlbCMjX2Fic29sdXRlID0gKGxhYmVsIC0gZnNfbGFiZWwgKyBmc19zdGFydCkKKworI2RlZmluZSBGSVhFRF9TWU1CT0xfQUJTX0FERFIobGFiZWwpCQkJCVwKKwkobGFiZWwjI19hYnNvbHV0ZSkKKworI2RlZmluZSBBQlNfQUREUihsYWJlbCkgKGxhYmVsIC0gZnNfbGFiZWwgKyBmc19zdGFydCkKKworLyoKKyAqIEZvbGxvd2luZyBhcmUgdGhlIEJPT0szUyBleGNlcHRpb24gaGFuZGxlciBoZWxwZXIgbWFjcm9zLgorICogSGFuZGxlcnMgY29tZSBpbiBhIG51bWJlciBvZiB0eXBlcywgYW5kIGVhY2ggdHlwZSBoYXMgYSBudW1iZXIgb2YgdmFyaWV0aWVzLgorICoKKyAqIEVYQ19SRUFMXyogICAgICAgIC0gcmVhbCwgdW5yZWxvY2F0ZWQgZXhjZXB0aW9uIHZlY3RvcnMKKyAqIEVYQ19WSVJUXyogICAgICAgIC0gdmlydCAoQUlMKSwgdW5yZWxvY2F0ZWQgZXhjZXB0aW9uIHZlY3RvcnMKKyAqIFRSQU1QX1JFQUxfKiAgIC0gcmVhbCwgdW5yZWxvY2F0ZWQgaGVscGVycyAodmlydCBjYW4gY2FsbCB0aGVzZSkKKyAqIFRSQU1QX1ZJUlRfKiAgLSB2aXJ0LCB1bnJlbG9jIGhlbHBlcnMgKGluIHByYWN0aWNlLCByZWFsIGNhbiB1c2UpCisgKiBUUkFNUF9LVk0gICAgICAgICAtIEtWTSBoYW5kbGVycyB0aGF0IGdldCBwdXQgaW50byByZWFsLCB1bnJlbG9jYXRlZAorICogRVhDX0NPTU1PTl8qICAtIHZpcnQsIHJlbG9jYXRlZCBjb21tb24gaGFuZGxlcnMKKyAqCisgKiBUaGUgRVhDIGhhbmRsZXJzIGFyZSBnaXZlbiBhIG5hbWUsIGFuZCBicmFuY2ggdG8gbmFtZV9jb21tb24sIG9yIHRoZQorICogYXBwcm9wcmlhdGUgS1ZNIG9yIG1hc2tpbmcgZnVuY3Rpb24uIFZlY3RvciBoYW5kbGVyIHZlcmlldGllcyBhcmUgYXMKKyAqIGZvbGxvd3M6CisgKgorICogRVhDX3tSRUFMfFZJUlR9X0JFR0lOL0VORCAtIHVzZWQgdG8gb3Blbi1jb2RlIHRoZSBleGNlcHRpb24KKyAqCisgKiBFWENfe1JFQUx8VklSVH0gIC0gc3RhbmRhcmQgZXhjZXB0aW9uCisgKgorICogRVhDX3tSRUFMfFZJUlR9X3N1ZmZpeAorICogICAgIHdoZXJlIF9zdWZmaXggaXM6CisgKiAgIC0gX01BU0tBQkxFICAgICAgICAgICAgICAgLSBtYXNrYWJsZSBleGNlcHRpb24KKyAqICAgLSBfT09MICAgICAgICAgICAgICAgICAgICAtIG91dCBvZiBsaW5lIHdpdGggdHJhbXBvbGluZSB0byBjb21tb24gaGFuZGxlcgorICogICAtIF9IViAgICAgICAgICAgICAgICAgICAgIC0gSFYgZXhjZXB0aW9uCisgKgorICogVGhlcmUgY2FuIGJlIGNvbWJpbmF0aW9ucywgZS5nLiwgRVhDX1ZJUlRfT09MX01BU0tBQkxFX0hWCisgKgorICogVGhlIG9uZSB1bnVzdWFsIGNhc2UgaXMgX19FWENfUkVBTF9PT0xfSFZfRElSRUNULCB3aGljaCBpcworICogYW4gT09MIHZlY3RvciB0aGF0IGJyYW5jaGVzIHRvIGEgc3BlY2lmaWVkIGhhbmRsZXIgcmF0aGVyIHRoYW4gdGhlIHVzdWFsCisgKiB0cmFtcG9saW5lIHRoYXQgZ29lcyB0byBjb21tb24uIEl0LCBhbmQgb3RoZXIgdW5kZXJzY29yZSBtYWNyb3MsIHNob3VsZAorICogYmUgdXNlZCB3aXRoIGNhcmUuCisgKgorICogS1ZNIGhhbmRsZXJzIGNvbWUgaW4gdGhlIGZvbGxvd2luZyB2ZXJpZXRpZXM6CisgKiBUUkFNUF9LVk0KKyAqIFRSQU1QX0tWTV9TS0lQCisgKiBUUkFNUF9LVk1fSFYKKyAqIFRSQU1QX0tWTV9IVl9TS0lQCisgKgorICogQ09NTU9OIGhhbmRsZXJzIGNvbWUgaW4gdGhlIGZvbGxvd2luZyB2ZXJpZXRpZXM6CisgKiBFWENfQ09NTU9OX0JFR0lOL0VORCAtIHVzZWQgdG8gb3Blbi1jb2RlIHRoZSBoYW5kbGVyCisgKiBFWENfQ09NTU9OCisgKiBFWENfQ09NTU9OX0FTWU5DCisgKiBFWENfQ09NTU9OX0hWCisgKgorICogVFJBTVBfUkVBTCBhbmQgVFJBTVBfVklSVCBjYW4gYmUgdXNlZCB3aXRoIEJFR0lOL0VORC4gS1ZNCisgKiBhbmQgT09MIGhhbmRsZXJzIGFyZSBpbXBsZW1lbnRlZCBhcyB0eXBlcyBvZiBUUkFNUCBhbmQgVFJBTVBfVklSVCBoYW5kbGVycy4KKyAqLworCisjZGVmaW5lIEVYQ19SRUFMX0JFR0lOKG5hbWUsIHN0YXJ0LCBlbmQpCQkJXAorCUZJWEVEX1NFQ1RJT05fRU5UUllfQkVHSU5fTE9DQVRJT04ocmVhbF92ZWN0b3JzLCBleGNfcmVhbF8jI3N0YXJ0IyNfIyNuYW1lLCBzdGFydCkKKworI2RlZmluZSBFWENfUkVBTF9FTkQobmFtZSwgc3RhcnQsIGVuZCkJCQlcCisJRklYRURfU0VDVElPTl9FTlRSWV9FTkRfTE9DQVRJT04ocmVhbF92ZWN0b3JzLCBleGNfcmVhbF8jI3N0YXJ0IyNfIyNuYW1lLCBlbmQpCisKKyNkZWZpbmUgRVhDX1ZJUlRfQkVHSU4obmFtZSwgc3RhcnQsIGVuZCkJCQlcCisJRklYRURfU0VDVElPTl9FTlRSWV9CRUdJTl9MT0NBVElPTih2aXJ0X3ZlY3RvcnMsIGV4Y192aXJ0XyMjc3RhcnQjI18jI25hbWUsIHN0YXJ0KQorCisjZGVmaW5lIEVYQ19WSVJUX0VORChuYW1lLCBzdGFydCwgZW5kKQkJCVwKKwlGSVhFRF9TRUNUSU9OX0VOVFJZX0VORF9MT0NBVElPTih2aXJ0X3ZlY3RvcnMsIGV4Y192aXJ0XyMjc3RhcnQjI18jI25hbWUsIGVuZCkKKworI2RlZmluZSBFWENfQ09NTU9OX0JFR0lOKG5hbWUpCQkJCQlcCisJVVNFX1RFWFRfU0VDVElPTigpOwkJCQkJCVwKKwkuYWxpZ24JNzsJCQkJCQkJXAorCS5nbG9iYWwgbmFtZTsJCQkJCQkJXAorCURFRklORV9GSVhFRF9TWU1CT0wobmFtZSk7CQkJCQlcCituYW1lOgorCisjZGVmaW5lIFRSQU1QX1JFQUxfQkVHSU4obmFtZSkJCQkJCVwKKwlGSVhFRF9TRUNUSU9OX0VOVFJZX0JFR0lOKHJlYWxfdHJhbXBvbGluZXMsIG5hbWUpCisKKyNkZWZpbmUgVFJBTVBfVklSVF9CRUdJTihuYW1lKQkJCQkJXAorCUZJWEVEX1NFQ1RJT05fRU5UUllfQkVHSU4odmlydF90cmFtcG9saW5lcywgbmFtZSkKKworI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hBTkRMRVIKKyNkZWZpbmUgVFJBTVBfS1ZNX0JFR0lOKG5hbWUpCQkJCQkJXAorCVRSQU1QX1JFQUxfQkVHSU4obmFtZSkKKyNlbHNlCisjZGVmaW5lIFRSQU1QX0tWTV9CRUdJTihuYW1lKQorI2VuZGlmCisKKyNkZWZpbmUgRVhDX1JFQUxfTk9ORShzdGFydCwgZW5kKQkJCQlcCisJRklYRURfU0VDVElPTl9FTlRSWV9CRUdJTl9MT0NBVElPTihyZWFsX3ZlY3RvcnMsIGV4Y19yZWFsXyMjc3RhcnQjI18jI3VudXNlZCwgc3RhcnQpOyBcCisJRklYRURfU0VDVElPTl9FTlRSWV9FTkRfTE9DQVRJT04ocmVhbF92ZWN0b3JzLCBleGNfcmVhbF8jI3N0YXJ0IyNfIyN1bnVzZWQsIGVuZCkKKworI2RlZmluZSBFWENfVklSVF9OT05FKHN0YXJ0LCBlbmQpCQkJCVwKKwlGSVhFRF9TRUNUSU9OX0VOVFJZX0JFR0lOX0xPQ0FUSU9OKHZpcnRfdmVjdG9ycywgZXhjX3ZpcnRfIyNzdGFydCMjXyMjdW51c2VkLCBzdGFydCk7IFwKKwlGSVhFRF9TRUNUSU9OX0VOVFJZX0VORF9MT0NBVElPTih2aXJ0X3ZlY3RvcnMsIGV4Y192aXJ0XyMjc3RhcnQjI18jI3VudXNlZCwgZW5kKTsKKworCisjZGVmaW5lIEVYQ19SRUFMKG5hbWUsIHN0YXJ0LCBlbmQpCQkJCVwKKwlFWENfUkVBTF9CRUdJTihuYW1lLCBzdGFydCwgZW5kKTsJCQlcCisJU1REX0VYQ0VQVElPTl9QU0VSSUVTKHN0YXJ0LCBuYW1lIyNfY29tbW9uKTsJCQlcCisJRVhDX1JFQUxfRU5EKG5hbWUsIHN0YXJ0LCBlbmQpOworCisjZGVmaW5lIEVYQ19WSVJUKG5hbWUsIHN0YXJ0LCBlbmQsIHJlYWx2ZWMpCQkJXAorCUVYQ19WSVJUX0JFR0lOKG5hbWUsIHN0YXJ0LCBlbmQpOwkJCVwKKwlTVERfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVMoc3RhcnQsIHJlYWx2ZWMsIG5hbWUjI19jb21tb24pOwlcCisJRVhDX1ZJUlRfRU5EKG5hbWUsIHN0YXJ0LCBlbmQpOworCisjZGVmaW5lIEVYQ19SRUFMX01BU0tBQkxFKG5hbWUsIHN0YXJ0LCBlbmQpCQkJXAorCUVYQ19SRUFMX0JFR0lOKG5hbWUsIHN0YXJ0LCBlbmQpOwkJCVwKKwlNQVNLQUJMRV9FWENFUFRJT05fUFNFUklFUyhzdGFydCwgc3RhcnQsIG5hbWUjI19jb21tb24pOwlcCisJRVhDX1JFQUxfRU5EKG5hbWUsIHN0YXJ0LCBlbmQpOworCisjZGVmaW5lIEVYQ19WSVJUX01BU0tBQkxFKG5hbWUsIHN0YXJ0LCBlbmQsIHJlYWx2ZWMpCQlcCisJRVhDX1ZJUlRfQkVHSU4obmFtZSwgc3RhcnQsIGVuZCk7CQkJXAorCU1BU0tBQkxFX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTKHN0YXJ0LCByZWFsdmVjLCBuYW1lIyNfY29tbW9uKTsgXAorCUVYQ19WSVJUX0VORChuYW1lLCBzdGFydCwgZW5kKTsKKworI2RlZmluZSBFWENfUkVBTF9IVihuYW1lLCBzdGFydCwgZW5kKQkJCVwKKwlFWENfUkVBTF9CRUdJTihuYW1lLCBzdGFydCwgZW5kKTsJCQlcCisJU1REX0VYQ0VQVElPTl9IVihzdGFydCwgc3RhcnQsIG5hbWUjI19jb21tb24pOwkJCVwKKwlFWENfUkVBTF9FTkQobmFtZSwgc3RhcnQsIGVuZCk7CisKKyNkZWZpbmUgRVhDX1ZJUlRfSFYobmFtZSwgc3RhcnQsIGVuZCwgcmVhbHZlYykJCVwKKwlFWENfVklSVF9CRUdJTihuYW1lLCBzdGFydCwgZW5kKTsJCQlcCisJU1REX1JFTE9OX0VYQ0VQVElPTl9IVihzdGFydCwgcmVhbHZlYywgbmFtZSMjX2NvbW1vbik7CQlcCisJRVhDX1ZJUlRfRU5EKG5hbWUsIHN0YXJ0LCBlbmQpOworCisjZGVmaW5lIF9fRVhDX1JFQUxfT09MKG5hbWUsIHN0YXJ0LCBlbmQpCQkJXAorCUVYQ19SRUFMX0JFR0lOKG5hbWUsIHN0YXJ0LCBlbmQpOwkJCVwKKwlfX09PTF9FWENFUFRJT04oc3RhcnQsIGxhYmVsLCB0cmFtcF9yZWFsXyMjbmFtZSk7CQlcCisJRVhDX1JFQUxfRU5EKG5hbWUsIHN0YXJ0LCBlbmQpOworCisjZGVmaW5lIF9fVFJBTVBfUkVBTF9SRUFMX09PTChuYW1lLCB2ZWMpCQkJCVwKKwlUUkFNUF9SRUFMX0JFR0lOKHRyYW1wX3JlYWxfIyNuYW1lKTsJCQkJXAorCVNURF9FWENFUFRJT05fUFNFUklFU19PT0wodmVjLCBuYW1lIyNfY29tbW9uKTsJCQlcCisKKyNkZWZpbmUgRVhDX1JFQUxfT09MKG5hbWUsIHN0YXJ0LCBlbmQpCQkJXAorCV9fRVhDX1JFQUxfT09MKG5hbWUsIHN0YXJ0LCBlbmQpOwkJCVwKKwlfX1RSQU1QX1JFQUxfUkVBTF9PT0wobmFtZSwgc3RhcnQpOworCisjZGVmaW5lIF9fRVhDX1JFQUxfT09MX01BU0tBQkxFKG5hbWUsIHN0YXJ0LCBlbmQpCQlcCisJX19FWENfUkVBTF9PT0wobmFtZSwgc3RhcnQsIGVuZCk7CisKKyNkZWZpbmUgX19UUkFNUF9SRUFMX1JFQUxfT09MX01BU0tBQkxFKG5hbWUsIHZlYykJCQlcCisJVFJBTVBfUkVBTF9CRUdJTih0cmFtcF9yZWFsXyMjbmFtZSk7CQkJCVwKKwlNQVNLQUJMRV9FWENFUFRJT05fUFNFUklFU19PT0wodmVjLCBuYW1lIyNfY29tbW9uKTsJCVwKKworI2RlZmluZSBFWENfUkVBTF9PT0xfTUFTS0FCTEUobmFtZSwgc3RhcnQsIGVuZCkJCVwKKwlfX0VYQ19SRUFMX09PTF9NQVNLQUJMRShuYW1lLCBzdGFydCwgZW5kKTsJCVwKKwlfX1RSQU1QX1JFQUxfUkVBTF9PT0xfTUFTS0FCTEUobmFtZSwgc3RhcnQpOworCisjZGVmaW5lIF9fRVhDX1JFQUxfT09MX0hWX0RJUkVDVChuYW1lLCBzdGFydCwgZW5kLCBoYW5kbGVyKQlcCisJRVhDX1JFQUxfQkVHSU4obmFtZSwgc3RhcnQsIGVuZCk7CQkJXAorCV9fT09MX0VYQ0VQVElPTihzdGFydCwgbGFiZWwsIGhhbmRsZXIpOwkJCQlcCisJRVhDX1JFQUxfRU5EKG5hbWUsIHN0YXJ0LCBlbmQpOworCisjZGVmaW5lIF9fRVhDX1JFQUxfT09MX0hWKG5hbWUsIHN0YXJ0LCBlbmQpCQkJXAorCV9fRVhDX1JFQUxfT09MKG5hbWUsIHN0YXJ0LCBlbmQpOworCisjZGVmaW5lIF9fVFJBTVBfUkVBTF9SRUFMX09PTF9IVihuYW1lLCB2ZWMpCQkJCVwKKwlUUkFNUF9SRUFMX0JFR0lOKHRyYW1wX3JlYWxfIyNuYW1lKTsJCQkJXAorCVNURF9FWENFUFRJT05fSFZfT09MKHZlYywgbmFtZSMjX2NvbW1vbik7CQkJXAorCisjZGVmaW5lIEVYQ19SRUFMX09PTF9IVihuYW1lLCBzdGFydCwgZW5kKQkJCVwKKwlfX0VYQ19SRUFMX09PTF9IVihuYW1lLCBzdGFydCwgZW5kKTsJCQlcCisJX19UUkFNUF9SRUFMX1JFQUxfT09MX0hWKG5hbWUsIHN0YXJ0KTsKKworI2RlZmluZSBfX0VYQ19SRUFMX09PTF9NQVNLQUJMRV9IVihuYW1lLCBzdGFydCwgZW5kKQkJXAorCV9fRVhDX1JFQUxfT09MKG5hbWUsIHN0YXJ0LCBlbmQpOworCisjZGVmaW5lIF9fVFJBTVBfUkVBTF9SRUFMX09PTF9NQVNLQUJMRV9IVihuYW1lLCB2ZWMpCQkJXAorCVRSQU1QX1JFQUxfQkVHSU4odHJhbXBfcmVhbF8jI25hbWUpOwkJCQlcCisJTUFTS0FCTEVfRVhDRVBUSU9OX0hWX09PTCh2ZWMsIG5hbWUjI19jb21tb24pOwkJCVwKKworI2RlZmluZSBFWENfUkVBTF9PT0xfTUFTS0FCTEVfSFYobmFtZSwgc3RhcnQsIGVuZCkJCVwKKwlfX0VYQ19SRUFMX09PTF9NQVNLQUJMRV9IVihuYW1lLCBzdGFydCwgZW5kKTsJXAorCV9fVFJBTVBfUkVBTF9SRUFMX09PTF9NQVNLQUJMRV9IVihuYW1lLCBzdGFydCk7CisKKyNkZWZpbmUgX19FWENfVklSVF9PT0wobmFtZSwgc3RhcnQsIGVuZCkJCQlcCisJRVhDX1ZJUlRfQkVHSU4obmFtZSwgc3RhcnQsIGVuZCk7CQkJXAorCV9fT09MX0VYQ0VQVElPTihzdGFydCwgbGFiZWwsIHRyYW1wX3ZpcnRfIyNuYW1lKTsJCVwKKwlFWENfVklSVF9FTkQobmFtZSwgc3RhcnQsIGVuZCk7CisKKyNkZWZpbmUgX19UUkFNUF9SRUFMX1ZJUlRfT09MKG5hbWUsIHJlYWx2ZWMpCQkJCVwKKwlUUkFNUF9WSVJUX0JFR0lOKHRyYW1wX3ZpcnRfIyNuYW1lKTsJCQlcCisJU1REX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTX09PTChyZWFsdmVjLCBuYW1lIyNfY29tbW9uKTsJXAorCisjZGVmaW5lIEVYQ19WSVJUX09PTChuYW1lLCBzdGFydCwgZW5kLCByZWFsdmVjKQkJXAorCV9fRVhDX1ZJUlRfT09MKG5hbWUsIHN0YXJ0LCBlbmQpOwkJCVwKKwlfX1RSQU1QX1JFQUxfVklSVF9PT0wobmFtZSwgcmVhbHZlYyk7CisKKyNkZWZpbmUgX19FWENfVklSVF9PT0xfTUFTS0FCTEUobmFtZSwgc3RhcnQsIGVuZCkJCVwKKwlfX0VYQ19WSVJUX09PTChuYW1lLCBzdGFydCwgZW5kKTsKKworI2RlZmluZSBfX1RSQU1QX1JFQUxfVklSVF9PT0xfTUFTS0FCTEUobmFtZSwgcmVhbHZlYykJCVwKKwlUUkFNUF9WSVJUX0JFR0lOKHRyYW1wX3ZpcnRfIyNuYW1lKTsJCQlcCisJTUFTS0FCTEVfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVNfT09MKHJlYWx2ZWMsIG5hbWUjI19jb21tb24pOwlcCisKKyNkZWZpbmUgRVhDX1ZJUlRfT09MX01BU0tBQkxFKG5hbWUsIHN0YXJ0LCBlbmQsIHJlYWx2ZWMpCVwKKwlfX0VYQ19WSVJUX09PTF9NQVNLQUJMRShuYW1lLCBzdGFydCwgZW5kKTsJCVwKKwlfX1RSQU1QX1JFQUxfVklSVF9PT0xfTUFTS0FCTEUobmFtZSwgcmVhbHZlYyk7CisKKyNkZWZpbmUgX19FWENfVklSVF9PT0xfSFYobmFtZSwgc3RhcnQsIGVuZCkJCQlcCisJX19FWENfVklSVF9PT0wobmFtZSwgc3RhcnQsIGVuZCk7CisKKyNkZWZpbmUgX19UUkFNUF9SRUFMX1ZJUlRfT09MX0hWKG5hbWUsIHJlYWx2ZWMpCQkJXAorCVRSQU1QX1ZJUlRfQkVHSU4odHJhbXBfdmlydF8jI25hbWUpOwkJCVwKKwlTVERfUkVMT05fRVhDRVBUSU9OX0hWX09PTChyZWFsdmVjLCBuYW1lIyNfY29tbW9uKTsJCVwKKworI2RlZmluZSBFWENfVklSVF9PT0xfSFYobmFtZSwgc3RhcnQsIGVuZCwgcmVhbHZlYykJCVwKKwlfX0VYQ19WSVJUX09PTF9IVihuYW1lLCBzdGFydCwgZW5kKTsJCQlcCisJX19UUkFNUF9SRUFMX1ZJUlRfT09MX0hWKG5hbWUsIHJlYWx2ZWMpOworCisjZGVmaW5lIF9fRVhDX1ZJUlRfT09MX01BU0tBQkxFX0hWKG5hbWUsIHN0YXJ0LCBlbmQpCQlcCisJX19FWENfVklSVF9PT0wobmFtZSwgc3RhcnQsIGVuZCk7CisKKyNkZWZpbmUgX19UUkFNUF9SRUFMX1ZJUlRfT09MX01BU0tBQkxFX0hWKG5hbWUsIHJlYWx2ZWMpCQlcCisJVFJBTVBfVklSVF9CRUdJTih0cmFtcF92aXJ0XyMjbmFtZSk7CQkJXAorCU1BU0tBQkxFX1JFTE9OX0VYQ0VQVElPTl9IVl9PT0wocmVhbHZlYywgbmFtZSMjX2NvbW1vbik7CVwKKworI2RlZmluZSBFWENfVklSVF9PT0xfTUFTS0FCTEVfSFYobmFtZSwgc3RhcnQsIGVuZCwgcmVhbHZlYykJXAorCV9fRVhDX1ZJUlRfT09MX01BU0tBQkxFX0hWKG5hbWUsIHN0YXJ0LCBlbmQpOwlcCisJX19UUkFNUF9SRUFMX1ZJUlRfT09MX01BU0tBQkxFX0hWKG5hbWUsIHJlYWx2ZWMpOworCisjZGVmaW5lIFRSQU1QX0tWTShhcmVhLCBuKQkJCQkJCVwKKwlUUkFNUF9LVk1fQkVHSU4oZG9fa3ZtXyMjbik7CQkJCQlcCisJS1ZNX0hBTkRMRVIoYXJlYSwgRVhDX1NURCwgbik7CQkJCQlcCisKKyNkZWZpbmUgVFJBTVBfS1ZNX1NLSVAoYXJlYSwgbikJCQkJCQlcCisJVFJBTVBfS1ZNX0JFR0lOKGRvX2t2bV8jI24pOwkJCQkJXAorCUtWTV9IQU5ETEVSX1NLSVAoYXJlYSwgRVhDX1NURCwgbik7CQkJCVwKKworLyoKKyAqIEhWIHZhcmlhbnQgZXhjZXB0aW9ucyBnZXQgdGhlIDB4MiBiaXQgYWRkZWQgdG8gdGhlaXIgdHJhcCBudW1iZXIuCisgKi8KKyNkZWZpbmUgVFJBTVBfS1ZNX0hWKGFyZWEsIG4pCQkJCQkJXAorCVRSQU1QX0tWTV9CRUdJTihkb19rdm1fSCMjbik7CQkJCQlcCisJS1ZNX0hBTkRMRVIoYXJlYSwgRVhDX0hWLCBuICsgMHgyKTsJCQkJXAorCisjZGVmaW5lIFRSQU1QX0tWTV9IVl9TS0lQKGFyZWEsIG4pCQkJCQlcCisJVFJBTVBfS1ZNX0JFR0lOKGRvX2t2bV9IIyNuKTsJCQkJCVwKKwlLVk1fSEFORExFUl9TS0lQKGFyZWEsIEVYQ19IViwgbiArIDB4Mik7CQkJXAorCisjZGVmaW5lIEVYQ19DT01NT04obmFtZSwgcmVhbHZlYywgaGRscikJCQkJXAorCUVYQ19DT01NT05fQkVHSU4obmFtZSk7CQkJCQlcCisJU1REX0VYQ0VQVElPTl9DT01NT04ocmVhbHZlYywgbmFtZSwgaGRscik7CQkJXAorCisjZGVmaW5lIEVYQ19DT01NT05fQVNZTkMobmFtZSwgcmVhbHZlYywgaGRscikJCQlcCisJRVhDX0NPTU1PTl9CRUdJTihuYW1lKTsJCQkJCVwKKwlTVERfRVhDRVBUSU9OX0NPTU1PTl9BU1lOQyhyZWFsdmVjLCBuYW1lLCBoZGxyKTsJCVwKKworI2RlZmluZSBFWENfQ09NTU9OX0hWKG5hbWUsIHJlYWx2ZWMsIGhkbHIpCQkJCVwKKwlFWENfQ09NTU9OX0JFR0lOKG5hbWUpOwkJCQkJXAorCVNURF9FWENFUFRJT05fQ09NTU9OKHJlYWx2ZWMgKyAweDIsIG5hbWUsIGhkbHIpOwkJXAorCisjZW5kaWYJLyogX0FTTV9QT1dFUlBDX0hFQURfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2htaS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2htaS5oCmluZGV4IDg4YjQ5MDEuLjg1YjdhMWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9obWkuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaG1pLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNpZm5kZWYgX19BU01fUFBDNjRfSE1JX0hfXwogI2RlZmluZSBfX0FTTV9QUEM2NF9ITUlfSF9fCiAKLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAorI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTX0hWX1BPU1NJQkxFCiAKICNkZWZpbmUJQ09SRV9UQl9SRVNZTkNfUkVRX0JJVAkJNjMKICNkZWZpbmUgTUFYX1NVQkNPUkVfUEVSX0NPUkUJCTQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9pby5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggMmZkMTY5MC4uZjZmZGE4NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2lvLmgKQEAgLTI0MSw2ICsyNDEsMzUgQEAKICNlbmRpZgogI2VuZGlmIC8qIF9fcG93ZXJwYzY0X18gKi8KIAorCisvKgorICogU2ltcGxlIENhY2hlIGluaGliaXRlZCBhY2Nlc3NvcnMKKyAqIFVubGlrZSB0aGUgREVGX01NSU9fKiBtYWNyb3MsIHRoZXNlIGRvbid0IGluY2x1ZGUgYW55IGgvdyBtZW1vcnkKKyAqIGJhcnJpZXJzLCBjYWxsZXJzIG5lZWQgdG8gbWFuYWdlIG1lbW9yeSBiYXJyaWVycyBvbiB0aGVpciBvd24uCisgKiBUaGVzZSBjYW4gb25seSBiZSB1c2VkIGluIGh5cGVydmlzb3IgcmVhbCBtb2RlLgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIF9sd3pjaXgodW5zaWduZWQgbG9uZyBhZGRyKQoreworCXUzMiByZXQ7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygibHd6Y2l4ICUwLDAsICUxIgorCQkJICAgICA6ICI9ciIgKHJldCkgOiAiciIgKGFkZHIpIDogIm1lbW9yeSIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3RiY2l4KHU2NCBhZGRyLCB1OCB2YWwpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oInN0YmNpeCAlMCwwLCUxIgorCQk6IDogInIiICh2YWwpLCAiciIgKGFkZHIpIDogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3N0d2NpeCh1NjQgYWRkciwgdTMyIHZhbCkKK3sKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygic3R3Y2l4ICUwLDAsJTEiCisJCTogOiAiciIgKHZhbCksICJyIiAoYWRkcikgOiAibWVtb3J5Iik7Cit9CisKIC8qCiAgKiBMb3cgbGV2ZWwgSU8gc3RyZWFtIGluc3RydWN0aW9ucyBhcmUgZGVmaW5lZCBvdXQgb2YgbGluZSBmb3Igbm93CiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYXNtLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2FzbS5oCmluZGV4IDViY2EyMjAuLjA1Y2FiZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYXNtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9hc20uaApAQCAtMTA1LDYgKzEwNSwxNSBAQAogI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX0ZBQ19VTkFWQUlMCTB4ZjYwCiAjZGVmaW5lIEJPT0szU19JTlRFUlJVUFRfSF9GQUNfVU5BVkFJTAkweGY4MAogCisvKiBib29rM3NfaHYgKi8KKworLyoKKyAqIFNwZWNpYWwgdHJhcCB1c2VkIHRvIGluZGljYXRlIHRvIGhvc3QgdGhhdCB0aGlzIGlzIGEKKyAqIHBhc3N0aHJvdWdoIGludGVycnVwdCB0aGF0IGNvdWxkIG5vdCBiZSBoYW5kbGVkCisgKiBjb21wbGV0ZWx5IGluIHRoZSBndWVzdC4KKyAqLworI2RlZmluZSBCT09LM1NfSU5URVJSVVBUX0hWX1JNX0hBUkQJMHg1NTU1CisKICNkZWZpbmUgQk9PSzNTX0lSUVBSSU9fU1lTVEVNX1JFU0VUCQkwCiAjZGVmaW5lIEJPT0szU19JUlFQUklPX0RBVEFfU0VHTUVOVAkJMQogI2RlZmluZSBCT09LM1NfSVJRUFJJT19JTlNUX1NFR01FTlQJCTIKQEAgLTEzNiw2ICsxNDUsNyBAQAogI2RlZmluZSBSRVNVTUVfRkxBR19OViAgICAgICAgICAoMTw8MCkgIC8qIFJlbG9hZCBndWVzdCBub252b2xhdGlsZSBzdGF0ZT8gKi8KICNkZWZpbmUgUkVTVU1FX0ZMQUdfSE9TVCAgICAgICAgKDE8PDEpICAvKiBSZXN1bWUgaG9zdD8gKi8KICNkZWZpbmUgUkVTVU1FX0ZMQUdfQVJDSDEJKDE8PDIpCisjZGVmaW5lIFJFU1VNRV9GTEFHX0FSQ0gyCSgxPDwzKQogCiAjZGVmaW5lIFJFU1VNRV9HVUVTVCAgICAgICAgICAgIDAKICNkZWZpbmUgUkVTVU1FX0dVRVNUX05WICAgICAgICAgUkVTVU1FX0ZMQUdfTlYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oCmluZGV4IDhmMzk3OTYuLjVjZjMwNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaApAQCAtNjksNiArNjksNDMgQEAKIAlpbnQgcGFnZXNpemU7CiB9OwogCisvKgorICogU3RydWN0IGZvciBhIHZpcnR1YWwgY29yZS4KKyAqIE5vdGU6IGVudHJ5X2V4aXRfbWFwIGNvbWJpbmVzIGEgYml0bWFwIG9mIHRocmVhZHMgdGhhdCBoYXZlIGVudGVyZWQKKyAqIGluIHRoZSBib3R0b20gOCBiaXRzIGFuZCBhIGJpdG1hcCBvZiB0aHJlYWRzIHRoYXQgaGF2ZSBleGl0ZWQgaW4gdGhlCisgKiBuZXh0IDggYml0cy4gIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4gYXRvbWljYWxseSBzZXQgdGhlIGVudHJ5IGJpdAorICogaWZmIHRoZSBleGl0IG1hcCBpcyAwIHdpdGhvdXQgdGFraW5nIGEgbG9jay4KKyAqLworc3RydWN0IGt2bXBwY192Y29yZSB7CisJaW50IG5fcnVubmFibGU7CisJaW50IG51bV90aHJlYWRzOworCWludCBlbnRyeV9leGl0X21hcDsKKwlpbnQgbmFwcGluZ190aHJlYWRzOworCWludCBmaXJzdF92Y3B1aWQ7CisJdTE2IHBjcHU7CisJdTE2IGxhc3RfY3B1OworCXU4IHZjb3JlX3N0YXRlOworCXU4IGluX2d1ZXN0OworCXN0cnVjdCBrdm1wcGNfdmNvcmUgKm1hc3Rlcl92Y29yZTsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnJ1bm5hYmxlX3RocmVhZHNbTUFYX1NNVF9USFJFQURTXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHByZWVtcHRfbGlzdDsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHN3YWl0X3F1ZXVlX2hlYWQgd3E7CisJc3BpbmxvY2tfdCBzdG9sdGJfbG9jazsJLyogcHJvdGVjdHMgc3RvbGVuX3RiIGFuZCBwcmVlbXB0X3RiICovCisJdTY0IHN0b2xlbl90YjsKKwl1NjQgcHJlZW1wdF90YjsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnJ1bm5lcjsKKwlzdHJ1Y3Qga3ZtICprdm07CisJdTY0IHRiX29mZnNldDsJCS8qIGd1ZXN0IHRpbWViYXNlIC0gaG9zdCB0aW1lYmFzZSAqLworCXVsb25nIGxwY3I7CisJdTMyIGFyY2hfY29tcGF0OworCXVsb25nIHBjcjsKKwl1bG9uZyBkcGRlczsJCS8qIGRvb3JiZWxsIHN0YXRlIChQT1dFUjgpICovCisJdWxvbmcgdnRiOwkJLyogdmlydHVhbCB0aW1lYmFzZSAqLworCXVsb25nIGNvbmZlcnJpbmdfdGhyZWFkczsKKwl1bnNpZ25lZCBpbnQgaGFsdF9wb2xsX25zOworfTsKKwogc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyB7CiAJc3RydWN0IGt2bXBwY19zaWRfbWFwIHNpZF9tYXBbU0lEX01BUF9OVU1dOwogCXN0cnVjdCB7CkBAIC04Myw2ICsxMjAsNyBAQAogCXU2NCBzZHIxOwogCXU2NCBoaW9yOwogCXU2NCBtc3JfbWFzazsKKwl1NjQgdnRiOwogI2lmZGVmIENPTkZJR19QUENfQk9PSzNTXzMyCiAJdTMyIHZzaWRfcG9vbFtWU0lEX1BPT0xfU0laRV07CiAJdTMyIHZzaWRfbmV4dDsKQEAgLTE5MSw2ICsyMjksNyBAQAogCQkJCSBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogZXh0ZXJuIHZvaWQga3ZtcHBjX2NvcHlfZnJvbV9zdmNwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkJICAgc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUgKnN2Y3B1KTsKK2V4dGVybiBpbnQga3ZtX2lycV9ieXBhc3M7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGt2bXBwY192Y3B1X2Jvb2szcyAqdG9fYm9vazNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzXzY0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc182NC5oCmluZGV4IDg4ZDE3YjQuLjg0ODI5MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzXzY0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfNjQuaApAQCAtMjAsNiArMjAsOCBAQAogI2lmbmRlZiBfX0FTTV9LVk1fQk9PSzNTXzY0X0hfXwogI2RlZmluZSBfX0FTTV9LVk1fQk9PSzNTXzY0X0hfXwogCisjaW5jbHVkZSA8YXNtL2Jvb2szcy82NC9tbXUtaGFzaC5oPgorCiAjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfUFJfUE9TU0lCTEUKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUgKnN2Y3B1X2dldChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CkBAIC05Nyw1NiArOTksMjAgQEAKIAlocHRlWzBdID0gY3B1X3RvX2JlNjQoaHB0ZV92KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX19ocHRlX2FjdHVhbF9wc2l6ZSh1bnNpZ25lZCBpbnQgbHAsIGludCBwc2l6ZSkKLXsKLQlpbnQgaSwgc2hpZnQ7Ci0JdW5zaWduZWQgaW50IG1hc2s7Ci0KLQkvKiBzdGFydCBmcm9tIDEgaWdub3JpbmcgTU1VX1BBR0VfNEsgKi8KLQlmb3IgKGkgPSAxOyBpIDwgTU1VX1BBR0VfQ09VTlQ7IGkrKykgewotCi0JCS8qIGludmFsaWQgcGVuYyAqLwotCQlpZiAobW11X3BzaXplX2RlZnNbcHNpemVdLnBlbmNbaV0gPT0gLTEpCi0JCQljb250aW51ZTsKLQkJLyoKLQkJICogZW5jb2RpbmcgYml0cyBwZXIgYWN0dWFsIHBhZ2Ugc2l6ZQotCQkgKiAgICAgICAgUFRFIExQICAgICBhY3R1YWwgcGFnZSBzaXplCi0JCSAqICAgIHJycnIgcnJyegkJPj04S0IKLQkJICogICAgcnJyciBycnp6CQk+PTE2S0IKLQkJICogICAgcnJyciByenp6CQk+PTMyS0IKLQkJICogICAgcnJyciB6enp6CQk+PTY0S0IKLQkJICogLi4uLi4uLgotCQkgKi8KLQkJc2hpZnQgPSBtbXVfcHNpemVfZGVmc1tpXS5zaGlmdCAtIExQX1NISUZUOwotCQlpZiAoc2hpZnQgPiBMUF9CSVRTKQotCQkJc2hpZnQgPSBMUF9CSVRTOwotCQltYXNrID0gKDEgPDwgc2hpZnQpIC0gMTsKLQkJaWYgKChscCAmIG1hc2spID09IG1tdV9wc2l6ZV9kZWZzW3BzaXplXS5wZW5jW2ldKQotCQkJcmV0dXJuIGk7Ci0JfQotCXJldHVybiAtMTsKLX0KLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvbXB1dGVfdGxiaWVfcmIodW5zaWduZWQgbG9uZyB2LCB1bnNpZ25lZCBsb25nIHIsCiAJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBwdGVfaW5kZXgpCiB7Ci0JaW50IGJfcHNpemUgPSBNTVVfUEFHRV80SywgYV9wc2l6ZSA9IE1NVV9QQUdFXzRLOworCWludCBpLCBiX3BzaXplID0gTU1VX1BBR0VfNEssIGFfcHNpemUgPSBNTVVfUEFHRV80SzsKIAl1bnNpZ25lZCBpbnQgcGVuYzsKIAl1bnNpZ25lZCBsb25nIHJiID0gMCwgdmFfbG93LCBzbGxwOwogCXVuc2lnbmVkIGludCBscCA9IChyID4+IExQX1NISUZUKSAmICgoMSA8PCBMUF9CSVRTKSAtIDEpOwogCiAJaWYgKHYgJiBIUFRFX1ZfTEFSR0UpIHsKLQkJZm9yIChiX3BzaXplID0gMDsgYl9wc2l6ZSA8IE1NVV9QQUdFX0NPVU5UOyBiX3BzaXplKyspIHsKLQotCQkJLyogdmFsaWQgZW50cmllcyBoYXZlIGEgc2hpZnQgdmFsdWUgKi8KLQkJCWlmICghbW11X3BzaXplX2RlZnNbYl9wc2l6ZV0uc2hpZnQpCi0JCQkJY29udGludWU7Ci0KLQkJCWFfcHNpemUgPSBfX2hwdGVfYWN0dWFsX3BzaXplKGxwLCBiX3BzaXplKTsKLQkJCWlmIChhX3BzaXplICE9IC0xKQotCQkJCWJyZWFrOwotCQl9CisJCWkgPSBocHRlX3BhZ2Vfc2l6ZXNbbHBdOworCQliX3BzaXplID0gaSAmIDB4ZjsKKwkJYV9wc2l6ZSA9IGkgPj4gNDsKIAl9CisKIAkvKgogCSAqIElnbm9yZSB0aGUgdG9wIDE0IGJpdHMgb2YgdmEKIAkgKiB2IGhhdmUgdG9wIHR3byBiaXRzIGNvdmVyaW5nIHNlZ21lbnQgc2l6ZSwgaGVuY2UgbW92ZQpAQCAtMTU5LDcgKzEyNSw2IEBACiAJLyogVGhpcyBjb3ZlcnMgMTQuLjU0IGJpdHMgb2YgdmEqLwogCXJiID0gKHYgJiB+MHg3ZlVMKSA8PCAxNjsJCS8qIEFWQSBmaWVsZCAqLwogCi0JcmIgfD0gKHYgPj4gSFBURV9WX1NTSVpFX1NISUZUKSA8PCA4OwkvKiAgQiBmaWVsZCAqLwogCS8qCiAJICogQVZBIGluIHYgaGFkIGNsZWFyZWQgbG93ZXIgMjMgYml0cy4gV2UgbmVlZCB0byBkZXJpdmUKIAkgKiB0aGF0IGZyb20gcHRlZyBpbmRleApAQCAtMjExLDQ5ICsxNzYsMTAgQEAKIAkJYnJlYWs7CiAJfQogCX0KLQlyYiB8PSAodiA+PiA1NCkgJiAweDMwMDsJCS8qIEIgZmllbGQgKi8KKwlyYiB8PSAodiA+PiBIUFRFX1ZfU1NJWkVfU0hJRlQpIDw8IDg7CS8qIEIgZmllbGQgKi8KIAlyZXR1cm4gcmI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2hwdGVfcGFnZV9zaXplKHVuc2lnbmVkIGxvbmcgaCwgdW5zaWduZWQgbG9uZyBsLAotCQkJCQkgICAgIGJvb2wgaXNfYmFzZV9zaXplKQotewotCi0JaW50IHNpemUsIGFfcHNpemU7Ci0JLyogTG9vayBhdCB0aGUgOCBiaXQgTFAgdmFsdWUgKi8KLQl1bnNpZ25lZCBpbnQgbHAgPSAobCA+PiBMUF9TSElGVCkgJiAoKDEgPDwgTFBfQklUUykgLSAxKTsKLQotCS8qIG9ubHkgaGFuZGxlIDRrLCA2NGsgYW5kIDE2TSBwYWdlcyBmb3Igbm93ICovCi0JaWYgKCEoaCAmIEhQVEVfVl9MQVJHRSkpCi0JCXJldHVybiAxdWwgPDwgMTI7Ci0JZWxzZSB7Ci0JCWZvciAoc2l6ZSA9IDA7IHNpemUgPCBNTVVfUEFHRV9DT1VOVDsgc2l6ZSsrKSB7Ci0JCQkvKiB2YWxpZCBlbnRyaWVzIGhhdmUgYSBzaGlmdCB2YWx1ZSAqLwotCQkJaWYgKCFtbXVfcHNpemVfZGVmc1tzaXplXS5zaGlmdCkKLQkJCQljb250aW51ZTsKLQotCQkJYV9wc2l6ZSA9IF9faHB0ZV9hY3R1YWxfcHNpemUobHAsIHNpemUpOwotCQkJaWYgKGFfcHNpemUgIT0gLTEpIHsKLQkJCQlpZiAoaXNfYmFzZV9zaXplKQotCQkJCQlyZXR1cm4gMXVsIDw8IG1tdV9wc2l6ZV9kZWZzW3NpemVdLnNoaWZ0OwotCQkJCXJldHVybiAxdWwgPDwgbW11X3BzaXplX2RlZnNbYV9wc2l6ZV0uc2hpZnQ7Ci0JCQl9Ci0JCX0KLQotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhwdGVfcGFnZV9zaXplKHVuc2lnbmVkIGxvbmcgaCwgdW5zaWduZWQgbG9uZyBsKQotewotCXJldHVybiBfX2hwdGVfcGFnZV9zaXplKGgsIGwsIDApOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgaHB0ZV9iYXNlX3BhZ2Vfc2l6ZSh1bnNpZ25lZCBsb25nIGgsIHVuc2lnbmVkIGxvbmcgbCkKLXsKLQlyZXR1cm4gX19ocHRlX3BhZ2Vfc2l6ZShoLCBsLCAxKTsKLX0KLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhwdGVfcnBuKHVuc2lnbmVkIGxvbmcgcHRlbCwgdW5zaWduZWQgbG9uZyBwc2l6ZSkKIHsKIAlyZXR1cm4gKChwdGVsICYgSFBURV9SX1JQTikgJiB+KHBzaXplIC0gMSkpID4+IFBBR0VfU0hJRlQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IGVjMzVhZjMuLjI4MzUwYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC00Myw2ICs0Myw4IEBACiAjaW5jbHVkZSA8YXNtL2NwdXRocmVhZHMuaD4KICNkZWZpbmUgS1ZNX01BWF9WQ1BVX0lEICAgICAgICAgICAgICAgICh0aHJlYWRzX3Blcl9zdWJjb3JlICogS1ZNX01BWF9WQ09SRVMpCiAKKyNkZWZpbmUgX19LVk1fSEFWRV9BUkNIX0lOVENfSU5JVElBTElaRUQKKwogI2lmZGVmIENPTkZJR19LVk1fTU1JTwogI2RlZmluZSBLVk1fQ09BTEVTQ0VEX01NSU9fUEFHRV9PRkZTRVQgMQogI2VuZGlmCkBAIC05NSw0MiArOTcsNDkgQEAKIHN0cnVjdCBrdm1wcGNfYm9vazNzX3NoYWRvd192Y3B1OwogCiBzdHJ1Y3Qga3ZtX3ZtX3N0YXQgewotCXUzMiByZW1vdGVfdGxiX2ZsdXNoOworCXVsb25nIHJlbW90ZV90bGJfZmx1c2g7CiB9OwogCiBzdHJ1Y3Qga3ZtX3ZjcHVfc3RhdCB7Ci0JdTMyIHN1bV9leGl0czsKLQl1MzIgbW1pb19leGl0czsKLQl1MzIgc2lnbmFsX2V4aXRzOwotCXUzMiBsaWdodF9leGl0czsKKwl1NjQgc3VtX2V4aXRzOworCXU2NCBtbWlvX2V4aXRzOworCXU2NCBzaWduYWxfZXhpdHM7CisJdTY0IGxpZ2h0X2V4aXRzOwogCS8qIEFjY291bnQgZm9yIHNwZWNpYWwgdHlwZXMgb2YgbGlnaHQgZXhpdHM6ICovCi0JdTMyIGl0bGJfcmVhbF9taXNzX2V4aXRzOwotCXUzMiBpdGxiX3ZpcnRfbWlzc19leGl0czsKLQl1MzIgZHRsYl9yZWFsX21pc3NfZXhpdHM7Ci0JdTMyIGR0bGJfdmlydF9taXNzX2V4aXRzOwotCXUzMiBzeXNjYWxsX2V4aXRzOwotCXUzMiBpc2lfZXhpdHM7Ci0JdTMyIGRzaV9leGl0czsKLQl1MzIgZW11bGF0ZWRfaW5zdF9leGl0czsKLQl1MzIgZGVjX2V4aXRzOwotCXUzMiBleHRfaW50cl9leGl0czsKLQl1MzIgaGFsdF9zdWNjZXNzZnVsX3BvbGw7Ci0JdTMyIGhhbHRfYXR0ZW1wdGVkX3BvbGw7Ci0JdTMyIGhhbHRfcG9sbF9pbnZhbGlkOwotCXUzMiBoYWx0X3dha2V1cDsKLQl1MzIgZGJlbGxfZXhpdHM7Ci0JdTMyIGdkYmVsbF9leGl0czsKLQl1MzIgbGQ7Ci0JdTMyIHN0OworCXU2NCBpdGxiX3JlYWxfbWlzc19leGl0czsKKwl1NjQgaXRsYl92aXJ0X21pc3NfZXhpdHM7CisJdTY0IGR0bGJfcmVhbF9taXNzX2V4aXRzOworCXU2NCBkdGxiX3ZpcnRfbWlzc19leGl0czsKKwl1NjQgc3lzY2FsbF9leGl0czsKKwl1NjQgaXNpX2V4aXRzOworCXU2NCBkc2lfZXhpdHM7CisJdTY0IGVtdWxhdGVkX2luc3RfZXhpdHM7CisJdTY0IGRlY19leGl0czsKKwl1NjQgZXh0X2ludHJfZXhpdHM7CisJdTY0IGhhbHRfcG9sbF9zdWNjZXNzX25zOworCXU2NCBoYWx0X3BvbGxfZmFpbF9uczsKKwl1NjQgaGFsdF93YWl0X25zOworCXU2NCBoYWx0X3N1Y2Nlc3NmdWxfcG9sbDsKKwl1NjQgaGFsdF9hdHRlbXB0ZWRfcG9sbDsKKwl1NjQgaGFsdF9zdWNjZXNzZnVsX3dhaXQ7CisJdTY0IGhhbHRfcG9sbF9pbnZhbGlkOworCXU2NCBoYWx0X3dha2V1cDsKKwl1NjQgZGJlbGxfZXhpdHM7CisJdTY0IGdkYmVsbF9leGl0czsKKwl1NjQgbGQ7CisJdTY0IHN0OwogI2lmZGVmIENPTkZJR19QUENfQk9PSzNTCi0JdTMyIHBmX3N0b3JhZ2U7Ci0JdTMyIHBmX2luc3RydWM7Ci0JdTMyIHNwX3N0b3JhZ2U7Ci0JdTMyIHNwX2luc3RydWM7Ci0JdTMyIHF1ZXVlX2ludHI7Ci0JdTMyIGxkX3Nsb3c7Ci0JdTMyIHN0X3Nsb3c7CisJdTY0IHBmX3N0b3JhZ2U7CisJdTY0IHBmX2luc3RydWM7CisJdTY0IHNwX3N0b3JhZ2U7CisJdTY0IHNwX2luc3RydWM7CisJdTY0IHF1ZXVlX2ludHI7CisJdTY0IGxkX3Nsb3c7CisJdTY0IHN0X3Nsb3c7CiAjZW5kaWYKKwl1NjQgcHRocnVfYWxsOworCXU2NCBwdGhydV9ob3N0OworCXU2NCBwdGhydV9iYWRfYWZmOwogfTsKIAogZW51bSBrdm1fZXhpdF90eXBlcyB7CkBAIC0xOTcsNiArMjA2LDggQEAKIHN0cnVjdCBrdm1wcGNfeGljczsKIHN0cnVjdCBrdm1wcGNfaWNwOwogCitzdHJ1Y3Qga3ZtcHBjX3Bhc3N0aHJ1X2lycW1hcDsKKwogLyoKICAqIFRoZSByZXZlcnNlIG1hcHBpbmcgYXJyYXkgaGFzIG9uZSBlbnRyeSBmb3IgZWFjaCBIUFRFLAogICogd2hpY2ggc3RvcmVzIHRoZSBndWVzdCdzIHZpZXcgb2YgdGhlIHNlY29uZCB3b3JkIG9mIHRoZSBIUFRFCkBAIC0yNjcsNiArMjc4LDcgQEAKICNlbmRpZgogI2lmZGVmIENPTkZJR19LVk1fWElDUwogCXN0cnVjdCBrdm1wcGNfeGljcyAqeGljczsKKwlzdHJ1Y3Qga3ZtcHBjX3Bhc3N0aHJ1X2lycW1hcCAqcGltYXA7CiAjZW5kaWYKIAlzdHJ1Y3Qga3ZtcHBjX29wcyAqa3ZtX29wczsKICNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19IVl9QT1NTSUJMRQpAQCAtMjc1LDQxICsyODcsNiBAQAogI2VuZGlmCiB9OwogCi0vKgotICogU3RydWN0IGZvciBhIHZpcnR1YWwgY29yZS4KLSAqIE5vdGU6IGVudHJ5X2V4aXRfbWFwIGNvbWJpbmVzIGEgYml0bWFwIG9mIHRocmVhZHMgdGhhdCBoYXZlIGVudGVyZWQKLSAqIGluIHRoZSBib3R0b20gOCBiaXRzIGFuZCBhIGJpdG1hcCBvZiB0aHJlYWRzIHRoYXQgaGF2ZSBleGl0ZWQgaW4gdGhlCi0gKiBuZXh0IDggYml0cy4gIFRoaXMgaXMgc28gdGhhdCB3ZSBjYW4gYXRvbWljYWxseSBzZXQgdGhlIGVudHJ5IGJpdAotICogaWZmIHRoZSBleGl0IG1hcCBpcyAwIHdpdGhvdXQgdGFraW5nIGEgbG9jay4KLSAqLwotc3RydWN0IGt2bXBwY192Y29yZSB7Ci0JaW50IG5fcnVubmFibGU7Ci0JaW50IG51bV90aHJlYWRzOwotCWludCBlbnRyeV9leGl0X21hcDsKLQlpbnQgbmFwcGluZ190aHJlYWRzOwotCWludCBmaXJzdF92Y3B1aWQ7Ci0JdTE2IHBjcHU7Ci0JdTE2IGxhc3RfY3B1OwotCXU4IHZjb3JlX3N0YXRlOwotCXU4IGluX2d1ZXN0OwotCXN0cnVjdCBrdm1wcGNfdmNvcmUgKm1hc3Rlcl92Y29yZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHJ1bm5hYmxlX3RocmVhZHM7Ci0Jc3RydWN0IGxpc3RfaGVhZCBwcmVlbXB0X2xpc3Q7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXN0cnVjdCBzd2FpdF9xdWV1ZV9oZWFkIHdxOwotCXNwaW5sb2NrX3Qgc3RvbHRiX2xvY2s7CS8qIHByb3RlY3RzIHN0b2xlbl90YiBhbmQgcHJlZW1wdF90YiAqLwotCXU2NCBzdG9sZW5fdGI7Ci0JdTY0IHByZWVtcHRfdGI7Ci0Jc3RydWN0IGt2bV92Y3B1ICpydW5uZXI7Ci0Jc3RydWN0IGt2bSAqa3ZtOwotCXU2NCB0Yl9vZmZzZXQ7CQkvKiBndWVzdCB0aW1lYmFzZSAtIGhvc3QgdGltZWJhc2UgKi8KLQl1bG9uZyBscGNyOwotCXUzMiBhcmNoX2NvbXBhdDsKLQl1bG9uZyBwY3I7Ci0JdWxvbmcgZHBkZXM7CQkvKiBkb29yYmVsbCBzdGF0ZSAoUE9XRVI4KSAqLwotCXVsb25nIGNvbmZlcnJpbmdfdGhyZWFkczsKLX07Ci0KICNkZWZpbmUgVkNPUkVfRU5UUllfTUFQKHZjKQkoKHZjKS0+ZW50cnlfZXhpdF9tYXAgJiAweGZmKQogI2RlZmluZSBWQ09SRV9FWElUX01BUCh2YykJKCh2YyktPmVudHJ5X2V4aXRfbWFwID4+IDgpCiAjZGVmaW5lIFZDT1JFX0lTX0VYSVRJTkcodmMpCShWQ09SRV9FWElUX01BUCh2YykgIT0gMCkKQEAgLTMyOSw2ICszMDYsNyBAQAogI2RlZmluZSBWQ09SRV9TTEVFUElORwkzCiAjZGVmaW5lIFZDT1JFX1JVTk5JTkcJNAogI2RlZmluZSBWQ09SRV9FWElUSU5HCTUKKyNkZWZpbmUgVkNPUkVfUE9MTElORwk2CiAKIC8qCiAgKiBTdHJ1Y3QgdXNlZCB0byBtYW5hZ2UgbWVtb3J5IGZvciBhIHZpcnR1YWwgcHJvY2Vzc29yIGFyZWEKQEAgLTM5Nyw2ICszNzUsMjAgQEAKIAl1NjQJdGJfbWF4OwkJLyogbWF4IHRpbWUgKi8KIH07CiAKKyNpZmRlZiBDT05GSUdfUFBDX0JPT0szU182NAorc3RydWN0IGt2bXBwY19pcnFfbWFwIHsKKwl1MzIJcl9od2lycTsKKwl1MzIJdl9od2lycTsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7Cit9OworCisjZGVmaW5lCUtWTVBQQ19QSVJRX01BUFBFRAkxMDI0CitzdHJ1Y3Qga3ZtcHBjX3Bhc3N0aHJ1X2lycW1hcCB7CisJaW50IG5fbWFwcGVkOworCXN0cnVjdCBrdm1wcGNfaXJxX21hcCBtYXBwZWRbS1ZNUFBDX1BJUlFfTUFQUEVEXTsKK307CisjZW5kaWYKKwogIyBpZmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKICNkZWZpbmUgS1ZNUFBDX0JPT0tFX0lBQ19OVU0JMgogI2RlZmluZSBLVk1QUENfQk9PS0VfREFDX05VTQkyCkBAIC00ODMsNyArNDc1LDYgQEAKIAl1bG9uZyBwdXJyOwogCXVsb25nIHNwdXJyOwogCXVsb25nIGljOwotCXVsb25nIHZ0YjsKIAl1bG9uZyBkc2NyOwogCXVsb25nIGFtcjsKIAl1bG9uZyB1YW1vcjsKQEAgLTY2OCw3ICs2NTksNiBAQAogCWxvbmcgcGdmYXVsdF9pbmRleDsKIAl1bnNpZ25lZCBsb25nIHBnZmF1bHRfaHB0ZVsyXTsKIAotCXN0cnVjdCBsaXN0X2hlYWQgcnVuX2xpc3Q7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpydW5fdGFzazsKIAlzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wcGMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fcHBjLmgKaW5kZXggMjU0NGVkYS4uZjZlNDk2NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9wcGMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX3BwYy5oCkBAIC0yODcsNiArMjg3LDEwIEBACiAJbG9uZyAoKmFyY2hfdm1faW9jdGwpKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgaW9jdGwsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFyZyk7CiAJaW50ICgqaGNhbGxfaW1wbGVtZW50ZWQpKHVuc2lnbmVkIGxvbmcgaGNhbGwpOworCWludCAoKmlycV9ieXBhc3NfYWRkX3Byb2R1Y2VyKShzdHJ1Y3QgaXJxX2J5cGFzc19jb25zdW1lciAqLAorCQkJCSAgICAgICBzdHJ1Y3QgaXJxX2J5cGFzc19wcm9kdWNlciAqKTsKKwl2b2lkICgqaXJxX2J5cGFzc19kZWxfcHJvZHVjZXIpKHN0cnVjdCBpcnFfYnlwYXNzX2NvbnN1bWVyICosCisJCQkJCXN0cnVjdCBpcnFfYnlwYXNzX3Byb2R1Y2VyICopOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBrdm1wcGNfb3BzICprdm1wcGNfaHZfb3BzOwpAQCAtNDUzLDggKzQ1NywxOSBAQAogewogCXJldHVybiB2Y3B1LT5hcmNoLmlycV90eXBlID09IEtWTVBQQ19JUlFfWElDUzsKIH0KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga3ZtcHBjX3Bhc3N0aHJ1X2lycW1hcCAqa3ZtcHBjX2dldF9wYXNzdGhydV9pcnFtYXAoCisJCQkJc3RydWN0IGt2bSAqa3ZtKQoreworCWlmIChrdm0gJiYga3ZtX2lycV9ieXBhc3MpCisJCXJldHVybiBrdm0tPmFyY2gucGltYXA7CisJcmV0dXJuIE5VTEw7Cit9CisKIGV4dGVybiB2b2lkIGt2bXBwY19hbGxvY19ob3N0X3JtX29wcyh2b2lkKTsKIGV4dGVybiB2b2lkIGt2bXBwY19mcmVlX2hvc3Rfcm1fb3BzKHZvaWQpOworZXh0ZXJuIHZvaWQga3ZtcHBjX2ZyZWVfcGltYXAoc3RydWN0IGt2bSAqa3ZtKTsKK2V4dGVybiBpbnQga3ZtcHBjX3hpY3Nfcm1fY29tcGxldGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgaGNhbGwpOwogZXh0ZXJuIHZvaWQga3ZtcHBjX3hpY3NfZnJlZV9pY3Aoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGV4dGVybiBpbnQga3ZtcHBjX3hpY3NfY3JlYXRlX2ljcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgc2VydmVyKTsKIGV4dGVybiBpbnQga3ZtX3ZtX2lvY3RsX3hpY3NfaXJxKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9pcnFfbGV2ZWwgKmFyZ3MpOwpAQCAtNDY0LDEwICs0NzksMjMgQEAKIGV4dGVybiBpbnQga3ZtcHBjX3hpY3NfY29ubmVjdF92Y3B1KHN0cnVjdCBrdm1fZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBjcHUpOwogZXh0ZXJuIHZvaWQga3ZtcHBjX3hpY3NfaXBpX2FjdGlvbih2b2lkKTsKK2V4dGVybiB2b2lkIGt2bXBwY194aWNzX3NldF9tYXBwZWQoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGd1ZXN0X2lycSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGhvc3RfaXJxKTsKK2V4dGVybiB2b2lkIGt2bXBwY194aWNzX2Nscl9tYXBwZWQoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGd1ZXN0X2lycSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGhvc3RfaXJxKTsKK2V4dGVybiBsb25nIGt2bXBwY19kZWxpdmVyX2lycV9wYXNzdGhydShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiB4aXJyLAorCQkJCSBzdHJ1Y3Qga3ZtcHBjX2lycV9tYXAgKmlycV9tYXAsCisJCQkJIHN0cnVjdCBrdm1wcGNfcGFzc3RocnVfaXJxbWFwICpwaW1hcCk7CiBleHRlcm4gaW50IGhfaXBpX3JlZGlyZWN0OwogI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGt2bXBwY19wYXNzdGhydV9pcnFtYXAgKmt2bXBwY19nZXRfcGFzc3RocnVfaXJxbWFwKAorCQkJCXN0cnVjdCBrdm0gKmt2bSkKKwl7IHJldHVybiBOVUxMOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX2FsbG9jX2hvc3Rfcm1fb3BzKHZvaWQpIHt9Owogc3RhdGljIGlubGluZSB2b2lkIGt2bXBwY19mcmVlX2hvc3Rfcm1fb3BzKHZvaWQpIHt9Oworc3RhdGljIGlubGluZSB2b2lkIGt2bXBwY19mcmVlX3BpbWFwKHN0cnVjdCBrdm0gKmt2bSkge307CitzdGF0aWMgaW5saW5lIGludCBrdm1wcGNfeGljc19ybV9jb21wbGV0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBoY2FsbCkKKwl7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCBrdm1wcGNfeGljc19lbmFibGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIAl7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtcHBjX3hpY3NfZnJlZV9pY3Aoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KSB7IH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oCmluZGV4IDA0MjBiMzguLmUwMmNiYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaApAQCAtNjEsNyArNjEsNyBAQAogCiAJdm9pZAkJKCppbml0X0lSUSkodm9pZCk7CiAKLQkvKiBSZXR1cm4gYW4gaXJxLCBvciBOT19JUlEgdG8gaW5kaWNhdGUgdGhlcmUgYXJlIG5vbmUgcGVuZGluZy4gKi8KKwkvKiBSZXR1cm4gYW4gaXJxLCBvciAwIHRvIGluZGljYXRlIHRoZXJlIGFyZSBub25lIHBlbmRpbmcuICovCiAJdW5zaWduZWQgaW50CSgqZ2V0X2lycSkodm9pZCk7CiAKIAkvKiBQQ0kgc3R1ZmYgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWJvb2szZS5oCmluZGV4IGNkNGYwNGEuLmI2MmE4ZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1ib29rM2UuaApAQCAtMzEzLDYgKzMxMyw5IEBACiAgKiByZXR1cm4gMSwgaW5kaWNhdGluZyB0aGF0IHRoZSB0bGIgcmVxdWlyZXMgcHJlbG9hZGluZy4KICAqLwogI2RlZmluZSBIVUdFVExCX05FRURfUFJFTE9BRAorCisjZGVmaW5lIG1tdV9jbGVhbnVwX2FsbCBOVUxMCisKICNlbmRpZgogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS5oCmluZGV4IGUyZmI0MDguLmU4ODM2ODMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LmgKQEAgLTIwNCw2ICsyMDQsMTAgQEAKICAqIG1ha2UgaXQgbWF0Y2ggdGhlIHNpemUgb3VyIG9mIGJvbHRlZCBUTEIgYXJlYQogICovCiBleHRlcm4gdTY0IHBwYzY0X3JtYV9zaXplOworCisvKiBDbGVhbnVwIGZ1bmN0aW9uIHVzZWQgYnkga2V4ZWMgKi8KK2V4dGVybiB2b2lkIG1tdV9jbGVhbnVwX2FsbCh2b2lkKTsKK2V4dGVybiB2b2lkIHJhZGl4X19tbXVfY2xlYW51cF9hbGwodm9pZCk7CiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKIHN0cnVjdCBtbV9zdHJ1Y3Q7CkBAIC0yNzEsNiArMjc1LDcgQEAKICNkZWZpbmUgTU1VX1BBR0VfMTZHCTEzCiAjZGVmaW5lIE1NVV9QQUdFXzY0RwkxNAogCisvKiBOLkIuIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSB0eXBlIG9mIGhwdGVfcGFnZV9zaXplcyBpZiB0aGlzIGdldHMgdG8gYmUgPiAxNiAqLwogI2RlZmluZSBNTVVfUEFHRV9DT1VOVAkxNQogCiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM1NfNjQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKaW5kZXggOWQyY2QwYy4uNWM0NTExNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpZmRlZiBDT05GSUdfU1BBUFJfVENFX0lPTU1VCiBzdHJ1Y3QgbW1faW9tbXVfdGFibGVfZ3JvdXBfbWVtX3Q7CiAKK2V4dGVybiBpbnQgaXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CS8qIGZyb20gaW50ZXJuYWwuaCAqLwogZXh0ZXJuIGJvb2wgbW1faW9tbXVfcHJlcmVnaXN0ZXJlZCh2b2lkKTsKIGV4dGVybiBsb25nIG1tX2lvbW11X2dldCh1bnNpZ25lZCBsb25nIHVhLCB1bnNpZ25lZCBsb25nIGVudHJpZXMsCiAJCXN0cnVjdCBtbV9pb21tdV90YWJsZV9ncm91cF9tZW1fdCAqKnBtZW0pOwpAQCAtNzEsNyArNzIsOCBAQAogCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAkvKiBNYXJrIHRoaXMgY29udGV4dCBoYXMgYmVlbiB1c2VkIG9uIHRoZSBuZXcgQ1BVICovCi0JY3B1bWFza19zZXRfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW1fY3B1bWFzayhuZXh0KSk7CisJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSwgbW1fY3B1bWFzayhuZXh0KSkpCisJCWNwdW1hc2tfc2V0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIG1tX2NwdW1hc2sobmV4dCkpOwogCiAJLyogMzItYml0IGtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IFBHRElSIGluIHRoZSB0aHJlYWQgc3RydWN0ICovCiAjaWZkZWYgQ09ORklHX1BQQzMyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBpY19tc2dyLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBpY19tc2dyLmgKaW5kZXggZDRmNDcxZi4uMDg4NDIwZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21waWNfbXNnci5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tcGljX21zZ3IuaApAQCAtMTIyLDkgKzEyMiw5IEBACiAgKiBAbXNncjoJdGhlIG1lc3NhZ2UgcmVnaXN0ZXIgd2hvc2UgSVJRIGlzIHRvIGJlIHJldHVybmVkCiAgKgogICogUmV0dXJucyB0aGUgSVJRIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgcmVnaXN0ZXIuCi0gKiBOT19JUlEgaXMgcmV0dXJuZWQgaWYgdGhpcyBtZXNzYWdlIHJlZ2lzdGVyIGlzIG5vdCBjYXBhYmxlIG9mCi0gKiByZWNlaXZpbmcgaW50ZXJydXB0cy4gIFdoYXQgbWVzc2FnZSByZWdpc3RlciBjYW4gYW5kIGNhbm5vdCByZWNlaXZlCi0gKiBpbnRlcnJ1cHRzIGlzIHNwZWNpZmllZCBpbiB0aGUgZGV2aWNlIHRyZWUgZm9yIHRoZSBzeXN0ZW0uCisgKiAwIGlzIHJldHVybmVkIGlmIHRoaXMgbWVzc2FnZSByZWdpc3RlciBpcyBub3QgY2FwYWJsZSBvZiByZWNlaXZpbmcKKyAqIGludGVycnVwdHMuICBXaGF0IG1lc3NhZ2UgcmVnaXN0ZXIgY2FuIGFuZCBjYW5ub3QgcmVjZWl2ZSBpbnRlcnJ1cHRzIGlzCisgKiBzcGVjaWZpZWQgaW4gdGhlIGRldmljZSB0cmVlIGZvciB0aGUgc3lzdGVtLgogICovCiBzdGF0aWMgaW5saW5lIGludCBtcGljX21zZ3JfZ2V0X2lycShzdHJ1Y3QgbXBpY19tc2dyICptc2dyKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL25vaGFzaC8zMi9wZ3RhYmxlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbm9oYXNoLzMyL3BndGFibGUuaAppbmRleCA3ODA4NDc1Li5jMjE5ZWY3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbm9oYXNoLzMyL3BndGFibGUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbm9oYXNoLzMyL3BndGFibGUuaApAQCAtMjY3LDcgKzI2Nyw4IEBACiB9CiAKIAotc3RhdGljIGlubGluZSB2b2lkIF9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHB0ZV90ICpwdGVwLCBwdGVfdCBlbnRyeSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfc2V0X2FjY2Vzc19mbGFncyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkJICAgcHRlX3QgKnB0ZXAsIHB0ZV90IGVudHJ5KQogewogCXVuc2lnbmVkIGxvbmcgc2V0ID0gcHRlX3ZhbChlbnRyeSkgJgogCQkoX1BBR0VfRElSVFkgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX1JXIHwgX1BBR0VfRVhFQyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbm9oYXNoLzY0L3BndGFibGUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ub2hhc2gvNjQvcGd0YWJsZS5oCmluZGV4IGQ0ZDgwOGMuLjY1M2ExODMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ub2hhc2gvNjQvcGd0YWJsZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ub2hhc2gvNjQvcGd0YWJsZS5oCkBAIC0zMDAsNyArMzAwLDggQEAKIC8qIFNldCB0aGUgZGlydHkgYW5kL29yIGFjY2Vzc2VkIGJpdHMgYXRvbWljYWxseSBpbiBhIGxpbnV4IFBURSwgdGhpcwogICogZnVuY3Rpb24gZG9lc24ndCBuZWVkIHRvIGZsdXNoIHRoZSBoYXNoIGVudHJ5CiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfc2V0X2FjY2Vzc19mbGFncyhwdGVfdCAqcHRlcCwgcHRlX3QgZW50cnkpCitzdGF0aWMgaW5saW5lIHZvaWQgX19wdGVwX3NldF9hY2Nlc3NfZmxhZ3Moc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQkJCSAgIHB0ZV90ICpwdGVwLCBwdGVfdCBlbnRyeSkKIHsKIAl1bnNpZ25lZCBsb25nIGJpdHMgPSBwdGVfdmFsKGVudHJ5KSAmCiAJCShfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfUlcgfCBfUEFHRV9FWEVDKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vcGFsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vb3BhbC5oCmluZGV4IGVlMDViZDIuLmU5NThiNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vcGFsLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaApAQCAtNjcsNiArNjcsNyBAQAogaW50NjRfdCBvcGFsX3BjaV9jb25maWdfd3JpdGVfd29yZCh1aW50NjRfdCBwaGJfaWQsIHVpbnQ2NF90IGJ1c19kZXZfZnVuYywKIAkJCQkgICB1aW50NjRfdCBvZmZzZXQsIHVpbnQzMl90IGRhdGEpOwogaW50NjRfdCBvcGFsX3NldF94aXZlKHVpbnQzMl90IGlzbiwgdWludDE2X3Qgc2VydmVyLCB1aW50OF90IHByaW9yaXR5KTsKK2ludDY0X3Qgb3BhbF9ybV9zZXRfeGl2ZSh1aW50MzJfdCBpc24sIHVpbnQxNl90IHNlcnZlciwgdWludDhfdCBwcmlvcml0eSk7CiBpbnQ2NF90IG9wYWxfZ2V0X3hpdmUodWludDMyX3QgaXNuLCBfX2JlMTYgKnNlcnZlciwgdWludDhfdCAqcHJpb3JpdHkpOwogaW50NjRfdCBvcGFsX3JlZ2lzdGVyX2V4Y2VwdGlvbl9oYW5kbGVyKHVpbnQ2NF90IG9wYWxfZXhjZXB0aW9uLAogCQkJCQl1aW50NjRfdCBoYW5kbGVyX2FkZHJlc3MsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaAppbmRleCAxNDgzMDNlNy4uNmE2NzkyYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCkBAIC0xODMsMTEgKzE4Myw2IEBACiAJICovCiAJdTE2IGluX21jZTsKIAl1OCBobWlfZXZlbnRfYXZhaWxhYmxlOwkJIC8qIEhNSSBldmVudCBpcyBhdmFpbGFibGUgKi8KLQkvKgotCSAqIEJpdG1hcCBmb3Igc2libGluZyBzdWJjb3JlIHN0YXR1cy4gU2VlIGt2bS9ib29rM3NfaHZfcmFzLmMgZm9yCi0JICogbW9yZSBkZXRhaWxzCi0JICovCi0Jc3RydWN0IHNpYmxpbmdfc3ViY29yZV9zdGF0ZSAqc2libGluZ19zdWJjb3JlX3N0YXRlOwogI2VuZGlmCiAKIAkvKiBTdHVmZiBmb3IgYWNjdXJhdGUgdGltZSBhY2NvdW50aW5nICovCkBAIC0yMDIsNiArMTk3LDEzIEBACiAJc3RydWN0IGt2bXBwY19ib29rM3Nfc2hhZG93X3ZjcHUgc2hhZG93X3ZjcHU7CiAjZW5kaWYKIAlzdHJ1Y3Qga3ZtcHBjX2hvc3Rfc3RhdGUga3ZtX2hzdGF0ZTsKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19IVl9QT1NTSUJMRQorCS8qCisJICogQml0bWFwIGZvciBzaWJsaW5nIHN1YmNvcmUgc3RhdHVzLiBTZWUga3ZtL2Jvb2szc19odl9yYXMuYyBmb3IKKwkgKiBtb3JlIGRldGFpbHMKKwkgKi8KKwlzdHJ1Y3Qgc2libGluZ19zdWJjb3JlX3N0YXRlICpzaWJsaW5nX3N1YmNvcmVfc3RhdGU7CisjZW5kaWYKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhcnBvcnQuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYXJwb3J0LmgKaW5kZXggYTQ1Mjk2OC4uNjU5NWFkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhcnBvcnQuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFycG9ydC5oCkBAIC0yOCw3ICsyOCw3IEBACiAJCWlvMSA9IHByb3BbMV07IGlvMiA9IHByb3BbMl07CiAKIAkJdmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQkJaWYgKHZpcnEgPT0gTk9fSVJRKQorCQlpZiAoIXZpcnEpCiAJCQljb250aW51ZTsKIAogCQlpZiAocGFycG9ydF9wY19wcm9iZV9wb3J0KGlvMSwgaW8yLCB2aXJxLCBhdXRvZG1hLCBOVUxMLCAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKaW5kZXggYjVlODhlNC4uYzAzMDljNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLWJyaWRnZS5oCkBAIC0zMDEsNiArMzAxLDcgQEAKIC8qIEFsbG9jYXRlICYgZnJlZSBhIFBDSSBob3N0IGJyaWRnZSBzdHJ1Y3R1cmUgKi8KIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBjaWJpb3NfYWxsb2NfY29udHJvbGxlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CiBleHRlcm4gdm9pZCBwY2liaW9zX2ZyZWVfY29udHJvbGxlcihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYik7CitleHRlcm4gdm9pZCBwY2liaW9zX2ZyZWVfY29udHJvbGxlcl9kZWZlcnJlZChzdHJ1Y3QgcGNpX2hvc3RfYnJpZGdlICpicmlkZ2UpOwogCiAjaWZkZWYgQ09ORklHX1BDSQogZXh0ZXJuIGludCBwY2liaW9zX3ZhZGRyX2lzX2lvcG9ydCh2b2lkIF9faW9tZW0gKmFkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Budi1wY2kuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wbnYtcGNpLmgKaW5kZXggMGNiZDgxMy4uNjk2NDM4ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Budi1wY2kuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcG52LXBjaS5oCkBAIC0xMiwxMCArMTIsMTEgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bWlzYy9jeGwtYmFzZS5oPgogI2luY2x1ZGUgPGFzbS9vcGFsLWFwaS5oPgogCi0jZGVmaW5lIFBDSV9TTE9UX0lEX1BSRUZJWAkweDgwMDAwMDAwMDAwMDAwMDAKKyNkZWZpbmUgUENJX1NMT1RfSURfUFJFRklYCSgxVUwgPDwgNjMpCiAjZGVmaW5lIFBDSV9TTE9UX0lEKHBoYl9pZCwgYmRmbikJXAogCShQQ0lfU0xPVF9JRF9QUkVGSVggfCAoKHVpbnQ2NF90KShiZGZuKSA8PCAxNikgfCAocGhiX2lkKSkKIApAQCAtMzMsNiArMzQsOCBAQAogdm9pZCBwbnZfY3hsX3JlbGVhc2VfaHdpcnFzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBod2lycSwgaW50IG51bSk7CiBpbnQgcG52X2N4bF9nZXRfaXJxX2NvdW50KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogc3RydWN0IGRldmljZV9ub2RlICpwbnZfcGNpX2dldF9waGJfbm9kZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2ludDY0X3QgcG52X29wYWxfcGNpX21zaV9lb2koc3RydWN0IGlycV9jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgaHdfaXJxKTsKK2Jvb2wgaXNfcG52X29wYWxfbXNpKHN0cnVjdCBpcnFfY2hpcCAqY2hpcCk7CiAKICNpZmRlZiBDT05GSUdfQ1hMX0JBU0UKIGludCBwbnZfY3hsX2FsbG9jX2h3aXJxX3JhbmdlcyhzdHJ1Y3QgY3hsX2lycV9yYW5nZXMgKmlycXMsCkBAIC02MCw2ICs2Myw4IEBACiAjZGVmaW5lIFBOVl9QSFBfU1RBVEVfUE9QVUxBVEVECQkyCiAjZGVmaW5lIFBOVl9QSFBfU1RBVEVfT0ZGTElORQkJMwogCWludAkJCQlzdGF0ZTsKKwlpbnQJCQkJaXJxOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CQkqd3E7CiAJc3RydWN0IGRldmljZV9ub2RlCQkqZG47CiAJc3RydWN0IHBjaV9kZXYJCQkqcGRldjsKIAlzdHJ1Y3QgcGNpX2J1cwkJCSpidXM7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjLW9wY29kZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwYy1vcGNvZGUuaAppbmRleCAxMjdlYmY1Li41NGZmOGNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjLW9wY29kZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGMtb3Bjb2RlLmgKQEAgLTIzNiw2ICsyMzYsNyBAQAogI2RlZmluZSBQUENfSU5TVF9TVFdVCQkJMHg5NDAwMDAwMAogI2RlZmluZSBQUENfSU5TVF9NRkxSCQkJMHg3YzA4MDJhNgogI2RlZmluZSBQUENfSU5TVF9NVExSCQkJMHg3YzA4MDNhNgorI2RlZmluZSBQUENfSU5TVF9NVENUUgkJCTB4N2MwOTAzYTYKICNkZWZpbmUgUFBDX0lOU1RfQ01QV0kJCQkweDJjMDAwMDAwCiAjZGVmaW5lIFBQQ19JTlNUX0NNUERJCQkJMHgyYzIwMDAwMAogI2RlZmluZSBQUENfSU5TVF9DTVBXCQkJMHg3YzAwMDAwMApAQCAtMjUwLDYgKzI1MSw3IEBACiAjZGVmaW5lIFBQQ19JTlNUX1NVQgkJCTB4N2MwMDAwNTAKICNkZWZpbmUgUFBDX0lOU1RfQkxSCQkJMHg0ZTgwMDAyMAogI2RlZmluZSBQUENfSU5TVF9CTFJMCQkJMHg0ZTgwMDAyMQorI2RlZmluZSBQUENfSU5TVF9CQ1RSCQkJMHg0ZTgwMDQyMAogI2RlZmluZSBQUENfSU5TVF9NVUxMRAkJCTB4N2MwMDAxZDIKICNkZWZpbmUgUFBDX0lOU1RfTVVMTFcJCQkweDdjMDAwMWQ2CiAjZGVmaW5lIFBQQ19JTlNUX01VTEhXVQkJCTB4N2MwMDAwMTYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGNfYXNtLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjX2FzbS5oCmluZGV4IGQ1ZDViNWUuLmM3Mzc1MGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGNfYXNtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwY19hc20uaApAQCAtMjAxLDE0ICsyMDEsMTIgQEAKICNpZmRlZiBQUEM2NF9FTEZfQUJJX3YyCiAKICNkZWZpbmUgX0dMT0JBTChuYW1lKSBcCi0JLnNlY3Rpb24gIi50ZXh0IjsgXAogCS5hbGlnbiAyIDsgXAogCS50eXBlIG5hbWUsQGZ1bmN0aW9uOyBcCiAJLmdsb2JsIG5hbWU7IFwKIG5hbWU6CiAKICNkZWZpbmUgX0dMT0JBTF9UT0MobmFtZSkgXAotCS5zZWN0aW9uICIudGV4dCI7IFwKIAkuYWxpZ24gMiA7IFwKIAkudHlwZSBuYW1lLEBmdW5jdGlvbjsgXAogCS5nbG9ibCBuYW1lOyBcCkBAIC0yMTcsMTMgKzIxNSw2IEBACiAJYWRkaSByMixyMiwoLlRPQy4tMGIpQGw7IFwKIAkubG9jYWxlbnRyeSBuYW1lLC4tbmFtZQogCi0jZGVmaW5lIF9LUFJPQkUobmFtZSkgXAotCS5zZWN0aW9uICIua3Byb2Jlcy50ZXh0IiwiYSI7IFwKLQkuYWxpZ24gMiA7IFwKLQkudHlwZSBuYW1lLEBmdW5jdGlvbjsgXAotCS5nbG9ibCBuYW1lOyBcCi1uYW1lOgotCiAjZGVmaW5lIERPVFNZTShhKQlhCiAKICNlbHNlCkBAIC0yMzIsMzUgKzIyMywyMCBAQAogI2RlZmluZSBHTFVFKGEsYikgWEdMVUUoYSxiKQogCiAjZGVmaW5lIF9HTE9CQUwobmFtZSkgXAotCS5zZWN0aW9uICIudGV4dCI7IFwKIAkuYWxpZ24gMiA7IFwKIAkuZ2xvYmwgbmFtZTsgXAogCS5nbG9ibCBHTFVFKC4sbmFtZSk7IFwKLQkuc2VjdGlvbiAiLm9wZCIsImF3IjsgXAorCS5wdXNoc2VjdGlvbiAiLm9wZCIsImF3IjsgXAogbmFtZTogXAogCS5xdWFkIEdMVUUoLixuYW1lKTsgXAogCS5xdWFkIC5UT0MuQHRvY2Jhc2U7IFwKIAkucXVhZCAwOyBcCi0JLnByZXZpb3VzOyBcCisJLnBvcHNlY3Rpb247IFwKIAkudHlwZSBHTFVFKC4sbmFtZSksQGZ1bmN0aW9uOyBcCiBHTFVFKC4sbmFtZSk6CiAKICNkZWZpbmUgX0dMT0JBTF9UT0MobmFtZSkgX0dMT0JBTChuYW1lKQogCi0jZGVmaW5lIF9LUFJPQkUobmFtZSkgXAotCS5zZWN0aW9uICIua3Byb2Jlcy50ZXh0IiwiYSI7IFwKLQkuYWxpZ24gMiA7IFwKLQkuZ2xvYmwgbmFtZTsgXAotCS5nbG9ibCBHTFVFKC4sbmFtZSk7IFwKLQkuc2VjdGlvbiAiLm9wZCIsImF3IjsgXAotbmFtZTogXAotCS5xdWFkIEdMVUUoLixuYW1lKTsgXAotCS5xdWFkIC5UT0MuQHRvY2Jhc2U7IFwKLQkucXVhZCAwOyBcCi0JLnByZXZpb3VzOyBcCi0JLnR5cGUgR0xVRSguLG5hbWUpLEBmdW5jdGlvbjsgXAotR0xVRSguLG5hbWUpOgotCiAjZGVmaW5lIERPVFNZTShhKQlHTFVFKC4sYSkKIAogI2VuZGlmCkBAIC0yNzIsMjAgKzI0OCwyOCBAQAogbjoKIAogI2RlZmluZSBfR0xPQkFMKG4pCVwKLQkudGV4dDsJCVwKIAkuc3RhYnMgX19zdHJpbmdpZnkobjpGLTEpLE5fRlVOLDAsMCxuO1wKIAkuZ2xvYmwgbjsJXAogbjoKIAogI2RlZmluZSBfR0xPQkFMX1RPQyhuYW1lKSBfR0xPQkFMKG5hbWUpCiAKLSNkZWZpbmUgX0tQUk9CRShuKQlcCi0JLnNlY3Rpb24gIi5rcHJvYmVzLnRleHQiLCJhIjsJXAotCS5nbG9ibAluOwlcCi1uOgotCiAjZW5kaWYKIAorLyoKKyAqIF9fa3Byb2JlcyAodGhlIEMgYW5ub3RhdGlvbikgcHV0cyB0aGUgc3ltYm9sIGludG8gdGhlIC5rcHJvYmVzLnRleHQKKyAqIHNlY3Rpb24sIHdoaWNoIGdldHMgZW1pdHRlZCBhdCB0aGUgZW5kIG9mIHJlZ3VsYXIgdGV4dC4KKyAqCisgKiBfQVNNX05PS1BST0JFX1NZTUJPTCBhbmQgTk9LUFJPQkVfU1lNQk9MIGp1c3QgYWRkcyB0aGUgc3ltYm9sIHRvCisgKiBhIGJsYWNrbGlzdC4gVGhlIGZvcm1lciBpcyBmb3IgY29yZSBrcHJvYmUgZnVuY3Rpb25zL2RhdGEsIHRoZQorICogbGF0dGVyIGlzIGZvciB0aG9zZSB0aGF0IGluY2RlbnRpYWxseSBtdXN0IGJlIGV4Y2x1ZGVkIGZyb20gcHJvYmluZworICogYW5kIGFsbG93cyB0aGVtIHRvIGJlIGxpbmtlZCBhdCBtb3JlIG9wdGltYWwgbG9jYXRpb24gd2l0aGluIHRleHQuCisgKi8KKyNkZWZpbmUgX0FTTV9OT0tQUk9CRV9TWU1CT0woZW50cnkpCQkJXAorCS5wdXNoc2VjdGlvbiAiX2twcm9iZV9ibGFja2xpc3QiLCJhdyI7CQlcCisJUFBDX0xPTkcgKGVudHJ5KSA7CQkJCVwKKwkucG9wc2VjdGlvbgorCiAjZGVmaW5lIEZVTkNfU1RBUlQobmFtZSkJX0dMT0JBTChuYW1lKQogI2RlZmluZSBGVU5DX0VORChuYW1lKQogCkBAIC01MjcsNyArNTExLDYgQEAKICNlbmRpZgogI2RlZmluZSBNVE1TUkQocikJbXRtc3IJcgogI2RlZmluZSBNVE1TUl9FRVJJKHJlZykJbXRtc3IJcmVnCi0jZGVmaW5lIENMUl9UT1AzMihyKQogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggNjhlM2JmNS4uYzA3YzMxYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTQ3LDcgKzE0Nyw3IEBACiB9IG1tX3NlZ21lbnRfdDsKIAogI2RlZmluZSBUU19GUFIoaSkgZnBfc3RhdGUuZnByW2ldW1RTX0ZQUk9GRlNFVF0KLSNkZWZpbmUgVFNfVFJBTlNfRlBSKGkpIHRyYW5zYWN0X2ZwLmZwcltpXVtUU19GUFJPRkZTRVRdCisjZGVmaW5lIFRTX0NLRlBSKGkpIGNrZnBfc3RhdGUuZnByW2ldW1RTX0ZQUk9GRlNFVF0KIAogLyogRlAgYW5kIFZTWCAwLTMxIHJlZ2lzdGVyIHNldCAqLwogc3RydWN0IHRocmVhZF9mcF9zdGF0ZSB7CkBAIC0yNTcsNiArMjU3LDcgQEAKIAlpbnQJCXVzZWRfc3BlOwkvKiBzZXQgaWYgcHJvY2VzcyBoYXMgdXNlZCBzcGUgKi8KICNlbmRpZiAvKiBDT05GSUdfU1BFICovCiAjaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQorCXU4CWxvYWRfdG07CiAJdTY0CQl0bV90ZmhhcjsJLyogVHJhbnNhY3Rpb24gZmFpbCBoYW5kbGVyIGFkZHIgKi8KIAl1NjQJCXRtX3RleGFzcjsJLyogVHJhbnNhY3Rpb24gZXhjZXB0aW9uICYgc3VtbWFyeSAqLwogCXU2NAkJdG1fdGZpYXI7CS8qIFRyYW5zYWN0aW9uIGZhaWwgaW5zdHIgYWRkcmVzcyByZWcgKi8KQEAgLTI2NywyMCArMjY4LDE3IEBACiAJdW5zaWduZWQgbG9uZwl0bV9kc2NyOwogCiAJLyoKLQkgKiBUcmFuc2FjdGlvbmFsIEZQIGFuZCBWU1ggMC0zMSByZWdpc3RlciBzZXQuCi0JICogTk9URTogdGhlIHNlbnNlIG9mIHRoZXNlIGlzIHRoZSBvcHBvc2l0ZSBvZiB0aGUgaW50ZWdlciBja3B0X3JlZ3MhCisJICogQ2hlY2twb2ludGVkIEZQIGFuZCBWU1ggMC0zMSByZWdpc3RlciBzZXQuCiAJICoKIAkgKiBXaGVuIGEgdHJhbnNhY3Rpb24gaXMgYWN0aXZlL3NpZ25hbGxlZC9zY2hlZHVsZWQgZXRjLiwgKnJlZ3MgaXMgdGhlCiAJICogbW9zdCByZWNlbnQgc2V0IG9mL3NwZWN1bGF0ZWQgR1BScyB3aXRoIGNrcHRfcmVncyBiZWluZyB0aGUgb2xkZXIKIAkgKiBjaGVja3BvaW50ZWQgcmVncyB0byB3aGljaCB3ZSByb2xsIGJhY2sgaWYgdHJhbnNhY3Rpb24gYWJvcnRzLgogCSAqCi0JICogSG93ZXZlciwgZnByW10gaXMgdGhlIGNoZWNrcG9pbnRlZCAnYmFzZSBzdGF0ZScgb2YgRlAgcmVncywgYW5kCi0JICogdHJhbnNhY3RfZnByW10gaXMgdGhlIG5ldyBzZXQgb2YgdHJhbnNhY3Rpb25hbCB2YWx1ZXMuCi0JICogVlJzIHdvcmsgdGhlIHNhbWUgd2F5LgorCSAqIFRoZXNlIGFyZSBhbmFsb2dvdXMgdG8gaG93IGNrcHRfcmVncyBhbmQgcHRfcmVncyB3b3JrCiAJICovCi0Jc3RydWN0IHRocmVhZF9mcF9zdGF0ZSB0cmFuc2FjdF9mcDsKLQlzdHJ1Y3QgdGhyZWFkX3ZyX3N0YXRlIHRyYW5zYWN0X3ZyOwotCXVuc2lnbmVkIGxvbmcJdHJhbnNhY3RfdnJzYXZlOworCXN0cnVjdCB0aHJlYWRfZnBfc3RhdGUgY2tmcF9zdGF0ZTsgLyogQ2hlY2twb2ludGVkIEZQIHN0YXRlICovCisJc3RydWN0IHRocmVhZF92cl9zdGF0ZSBja3ZyX3N0YXRlOyAvKiBDaGVja3BvaW50ZWQgVlIgc3RhdGUgKi8KKwl1bnNpZ25lZCBsb25nCWNrdnJzYXZlOyAvKiBDaGVja3BvaW50ZWQgVlJTQVZFICovCiAjZW5kaWYgLyogQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTSAqLwogI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzMyX0hBTkRMRVIKIAl2b2lkKgkJa3ZtX3NoYWRvd192Y3B1OyAvKiBLVk0gaW50ZXJuYWwgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oCmluZGV4IGY2OWY0MGYuLjJhNjIwNzggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmgKQEAgLTQ3NSw2ICs0NzUsOSBAQAogI2RlZmluZSBISUQwX1BPV0VSOF8xVE80TFBBUglfX01BU0soNTEpCiAjZGVmaW5lIEhJRDBfUE9XRVI4X0RZTkxQQVJESVMJX19NQVNLKDQ4KQogCisvKiBQT1dFUjkgSElEMCBiaXRzICovCisjZGVmaW5lIEhJRDBfUE9XRVI5X1JBRElYCV9fTUFTSyg2MyAtIDgpCisKICNkZWZpbmUgU1BSTl9ISUQxCTB4M0YxCQkvKiBIYXJkd2FyZSBJbXBsZW1lbnRhdGlvbiBSZWdpc3RlciAxICovCiAjaWZkZWYgQ09ORklHXzZ4eAogI2RlZmluZSBISUQxX0VNQ1AJKDE8PDMxKQkJLyogNzQ1MCBNYWNoaW5lIENoZWNrIFBpbiBFbmFibGUgKi8KQEAgLTczNyw2ICs3NDAsNyBAQAogI2RlZmluZSAgIE1NQ1IwX0ZDSFYJMHgwMDAwMDAwMVVMIC8qIGZyZWV6ZSBjb25kaXRpb25zIGluIGh5cGVydmlzb3IgbW9kZSAqLwogI2RlZmluZSBTUFJOX01NQ1IxCTc5OAogI2RlZmluZSBTUFJOX01NQ1IyCTc4NQorI2RlZmluZSBTUFJOX1VNTUNSMgk3NjkKICNkZWZpbmUgU1BSTl9NTUNSQQkweDMxMgogI2RlZmluZSAgIE1NQ1JBX1NEU1lOQwkweDgwMDAwMDAwVUwgLyogU0RBUiBzeW5jZWQgd2l0aCBTSUFSICovCiAjZGVmaW5lICAgTU1DUkFfU0RBUl9EQ0FDSEVfTUlTUyAweDQwMDAwMDAwVUwKQEAgLTEyNDcsNyArMTI1MSw3IEBACiAJCQkJICAgICA6ICJtZW1vcnkiKQogI2VuZGlmCiAKLWV4dGVybiB2b2lkIG1zcl9jaGVja19hbmRfc2V0KHVuc2lnbmVkIGxvbmcgYml0cyk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBtc3JfY2hlY2tfYW5kX3NldCh1bnNpZ25lZCBsb25nIGJpdHMpOwogZXh0ZXJuIGJvb2wgc3RyaWN0X21zcl9jb250cm9sOwogZXh0ZXJuIHZvaWQgX19tc3JfY2hlY2tfYW5kX2NsZWFyKHVuc2lnbmVkIGxvbmcgYml0cyk7CiBzdGF0aWMgaW5saW5lIHZvaWQgbXNyX2NoZWNrX2FuZF9jbGVhcih1bnNpZ25lZCBsb25nIGJpdHMpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc2lnbmFsLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc2lnbmFsLmgKaW5kZXggOTMyMmMyOC4uNWZmNzc3MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NpZ25hbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zaWduYWwuaApAQCAtNSw2ICs1LDQgQEAKICNpbmNsdWRlIDx1YXBpL2FzbS9zaWduYWwuaD4KICNpbmNsdWRlIDx1YXBpL2FzbS9wdHJhY2UuaD4KIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3RtX3N0YWNrcG9pbnRlcihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0KICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfU0lHTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90bS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RtLmgKaW5kZXggYzIyZDcwNC4uODJlMDZjYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RtLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RtLmgKQEAgLTksMTEgKzksNiBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCi0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotZXh0ZXJuIHZvaWQgZG9fbG9hZF91cF90cmFuc2FjdF9mcHUoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCk7Ci1leHRlcm4gdm9pZCBkb19sb2FkX3VwX3RyYW5zYWN0X2FsdGl2ZWMoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCk7Ci0jZW5kaWYKLQogZXh0ZXJuIHZvaWQgdG1fZW5hYmxlKHZvaWQpOwogZXh0ZXJuIHZvaWQgdG1fcmVjbGFpbShzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkLAogCQkgICAgICAgdW5zaWduZWQgbG9uZyBvcmlnX21zciwgdWludDhfdCBjYXVzZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCBjMWRjNmMxLi5jMjY2MjI3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTMwOCw0MCArMzA4LDIxIEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sCiAJCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0JdW5zaWduZWQgbG9uZyBvdmVyOwotCi0JaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpIHsKLQkJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKLQkJCWNoZWNrX29iamVjdF9zaXplKHRvLCBuLCBmYWxzZSk7CisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKSkgeworCQljaGVja19vYmplY3Rfc2l6ZSh0bywgbiwgZmFsc2UpOwogCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKChfX2ZvcmNlIHZvaWQgX191c2VyICopdG8sIGZyb20sIG4pOwogCX0KLQlpZiAoKHVuc2lnbmVkIGxvbmcpZnJvbSA8IFRBU0tfU0laRSkgewotCQlvdmVyID0gKHVuc2lnbmVkIGxvbmcpZnJvbSArIG4gLSBUQVNLX1NJWkU7Ci0JCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobiAtIG92ZXIpKQotCQkJY2hlY2tfb2JqZWN0X3NpemUodG8sIG4gLSBvdmVyLCBmYWxzZSk7Ci0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIoKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKil0bywgZnJvbSwKLQkJCQluIC0gb3ZlcikgKyBvdmVyOwotCX0KKwltZW1zZXQodG8sIDAsIG4pOwogCXJldHVybiBuOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywKIAkJY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotCXVuc2lnbmVkIGxvbmcgb3ZlcjsKLQogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpIHsKLQkJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKLQkJCWNoZWNrX29iamVjdF9zaXplKGZyb20sIG4sIHRydWUpOworCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKIAkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKilmcm9tLCBuKTsKIAl9Ci0JaWYgKCh1bnNpZ25lZCBsb25nKXRvIDwgVEFTS19TSVpFKSB7Ci0JCW92ZXIgPSAodW5zaWduZWQgbG9uZyl0byArIG4gLSBUQVNLX1NJWkU7Ci0JCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCi0JCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuIC0gb3ZlciwgdHJ1ZSk7Ci0JCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIChfX2ZvcmNlIHZvaWQgX191c2VyICopZnJvbSwKLQkJCQluIC0gb3ZlcikgKyBvdmVyOwotCX0KIAlyZXR1cm4gbjsKIH0KIApAQCAtMzgzLDggKzM2NCw3IEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQotCQljaGVja19vYmplY3Rfc2l6ZSh0bywgbiwgZmFsc2UpOworCWNoZWNrX29iamVjdF9zaXplKHRvLCBuLCBmYWxzZSk7CiAKIAlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKChfX2ZvcmNlIHZvaWQgX191c2VyICopdG8sIGZyb20sIG4pOwogfQpAQCAtNDEyLDggKzM5Miw4IEBACiAJCWlmIChyZXQgPT0gMCkKIAkJCXJldHVybiAwOwogCX0KLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQotCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKKworCWNoZWNrX29iamVjdF9zaXplKGZyb20sIG4sIHRydWUpOwogCiAJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgKF9fZm9yY2UgY29uc3Qgdm9pZCBfX3VzZXIgKilmcm9tLCBuKTsKIH0KQEAgLTQzOSwxMCArNDE5LDYgQEAKIAltaWdodF9mYXVsdCgpOwogCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9XUklURSwgYWRkciwgc2l6ZSkpKQogCQlyZXR1cm4gX19jbGVhcl91c2VyKGFkZHIsIHNpemUpOwotCWlmICgodW5zaWduZWQgbG9uZylhZGRyIDwgVEFTS19TSVpFKSB7Ci0JCXVuc2lnbmVkIGxvbmcgb3ZlciA9ICh1bnNpZ25lZCBsb25nKWFkZHIgKyBzaXplIC0gVEFTS19TSVpFOwotCQlyZXR1cm4gX19jbGVhcl91c2VyKGFkZHIsIHNpemUgLSBvdmVyKSArIG92ZXI7Ci0JfQogCXJldHVybiBzaXplOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCBiMjAyN2E1Li5hZGVkMjlhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTMxLDggKzMxLDcgQEAKIAkJCQkgICBwcm9jZXNzLm8gc3lzdGJsLm8gaWRsZS5vIFwKIAkJCQkgICBzaWduYWwubyBzeXNmcy5vIGNhY2hlaW5mby5vIHRpbWUubyBcCiAJCQkJICAgcHJvbS5vIHRyYXBzLm8gc2V0dXAtY29tbW9uLm8gXAotCQkJCSAgIHVkYmcubyBtaXNjLm8gaW8ubyBkbWEubyBcCi0JCQkJICAgbWlzY18kKENPTkZJR19XT1JEX1NJWkUpLm8gXAorCQkJCSAgIHVkYmcubyBtaXNjLm8gaW8ubyBkbWEubyBtaXNjXyQoQklUUykubyBcCiAJCQkJICAgb2ZfcGxhdGZvcm0ubyBwcm9tX3BhcnNlLm8KIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IHNldHVwXzY0Lm8gc3lzX3BwYzMyLm8gXAogCQkJCSAgIHNpZ25hbF82NC5vIHB0cmFjZTMyLm8gXApAQCAtNDEsNyArNDAsNyBAQAogb2JqLSQoQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVCkJKz0gaHdfYnJlYWtwb2ludC5vCiBvYmotJChDT05GSUdfUFBDX0JPT0szU182NCkJKz0gY3B1X3NldHVwX3BwYzk3MC5vIGNwdV9zZXR1cF9wYTZ0Lm8KIG9iai0kKENPTkZJR19QUENfQk9PSzNTXzY0KQkrPSBjcHVfc2V0dXBfcG93ZXIubwotb2JqLSQoQ09ORklHX1BQQ19CT09LM1NfNjQpCSs9IG1jZS5vIG1jZV9wb3dlci5vIGhtaS5vCitvYmotJChDT05GSUdfUFBDX0JPT0szU182NCkJKz0gbWNlLm8gbWNlX3Bvd2VyLm8KIG9iai0kKENPTkZJR19QUENfQk9PSzNFXzY0KQkrPSBleGNlcHRpb25zLTY0ZS5vIGlkbGVfYm9vazNlLm8KIG9iai0kKENPTkZJR19QUEM2NCkJCSs9IHZkc282NC8KIG9iai0kKENPTkZJR19BTFRJVkVDKQkJKz0gdmVjZW11Lm8KQEAgLTcwLDIzICs2OSwyMyBAQAogaWZlcSAoJChDT05GSUdfRlNMX0JPT0tFKSx5KQogb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkrPSBzd3N1c3BfYm9va2UubwogZWxzZQotb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkrPSBzd3N1c3BfJChDT05GSUdfV09SRF9TSVpFKS5vCitvYmotJChDT05GSUdfSElCRVJOQVRJT04pCSs9IHN3c3VzcF8kKEJJVFMpLm8KIGVuZGlmCiBvYmo2NC0kKENPTkZJR19ISUJFUk5BVElPTikJKz0gc3dzdXNwX2FzbTY0Lm8KLW9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8gbW9kdWxlXyQoQ09ORklHX1dPUkRfU0laRSkubworb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBtb2R1bGUubyBtb2R1bGVfJChCSVRTKS5vCiBvYmotJChDT05GSUdfNDR4KQkJKz0gY3B1X3NldHVwXzQ0eC5vCiBvYmotJChDT05GSUdfUFBDX0ZTTF9CT09LM0UpCSs9IGNwdV9zZXR1cF9mc2xfYm9va2Uubwogb2JqLSQoQ09ORklHX1BQQ19ET09SQkVMTCkJKz0gZGJlbGwubwogb2JqLSQoQ09ORklHX0pVTVBfTEFCRUwpCSs9IGp1bXBfbGFiZWwubwogCi1leHRyYS15CQkJCTo9IGhlYWRfJChDT05GSUdfV09SRF9TSVpFKS5vCitleHRyYS15CQkJCTo9IGhlYWRfJChCSVRTKS5vCiBleHRyYS0kKENPTkZJR180MHgpCQk6PSBoZWFkXzQweC5vCiBleHRyYS0kKENPTkZJR180NHgpCQk6PSBoZWFkXzQ0eC5vCiBleHRyYS0kKENPTkZJR19GU0xfQk9PS0UpCTo9IGhlYWRfZnNsX2Jvb2tlLm8KIGV4dHJhLSQoQ09ORklHXzh4eCkJCTo9IGhlYWRfOHh4Lm8KIGV4dHJhLXkJCQkJKz0gdm1saW51eC5sZHMKIAotb2JqLSQoQ09ORklHX1JFTE9DQVRBQkxFKQkrPSByZWxvY18kKENPTkZJR19XT1JEX1NJWkUpLm8KK29iai0kKENPTkZJR19SRUxPQ0FUQUJMRSkJKz0gcmVsb2NfJChCSVRTKS5vCiAKIG9iai0kKENPTkZJR19QUEMzMikJCSs9IGVudHJ5XzMyLm8gc2V0dXBfMzIubwogb2JqLSQoQ09ORklHX1BQQzY0KQkJKz0gZG1hLWlvbW11Lm8gaW9tbXUubwpAQCAtMTA0LDExICsxMDMsMTEgQEAKIG9iai0kKENPTkZJR19TV0lPVExCKQkJKz0gZG1hLXN3aW90bGIubwogCiBwY2k2NC0kKENPTkZJR19QUEM2NCkJCSs9IHBjaV9kbi5vIHBjaS1ob3RwbHVnLm8gaXNhLWJyaWRnZS5vCi1vYmotJChDT05GSUdfUENJKQkJKz0gcGNpXyQoQ09ORklHX1dPUkRfU0laRSkubyAkKHBjaTY0LXkpIFwKK29iai0kKENPTkZJR19QQ0kpCQkrPSBwY2lfJChCSVRTKS5vICQocGNpNjQteSkgXAogCQkJCSAgIHBjaS1jb21tb24ubyBwY2lfb2Zfc2Nhbi5vCiBvYmotJChDT05GSUdfUENJX01TSSkJCSs9IG1zaS5vCiBvYmotJChDT05GSUdfS0VYRUMpCQkrPSBtYWNoaW5lX2tleGVjLm8gY3Jhc2gubyBcCi0JCQkJICAgbWFjaGluZV9rZXhlY18kKENPTkZJR19XT1JEX1NJWkUpLm8KKwkJCQkgICBtYWNoaW5lX2tleGVjXyQoQklUUykubwogb2JqLSQoQ09ORklHX0FVRElUKQkJKz0gYXVkaXQubwogb2JqNjQtJChDT05GSUdfQVVESVQpCQkrPSBjb21wYXRfYXVkaXQubwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggYjg5ZDE0Yy4uY2FlYzdiZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMTQyLDEyICsxNDIsMTIgQEAKIAlERUZJTkUoVEhSRUFEX1RNX1BQUiwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIHRtX3BwcikpOwogCURFRklORShUSFJFQURfVE1fRFNDUiwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIHRtX2RzY3IpKTsKIAlERUZJTkUoUFRfQ0tQVF9SRUdTLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwgY2twdF9yZWdzKSk7Ci0JREVGSU5FKFRIUkVBRF9UUkFOU0FDVF9WUlNUQVRFLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwKLQkJCQkJCSB0cmFuc2FjdF92cikpOwotCURFRklORShUSFJFQURfVFJBTlNBQ1RfVlJTQVZFLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCwKLQkJCQkJICAgIHRyYW5zYWN0X3Zyc2F2ZSkpOwotCURFRklORShUSFJFQURfVFJBTlNBQ1RfRlBTVEFURSwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsCi0JCQkJCQkgdHJhbnNhY3RfZnApKTsKKwlERUZJTkUoVEhSRUFEX0NLVlJTVEFURSwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsCisJCQkJCQkgY2t2cl9zdGF0ZSkpOworCURFRklORShUSFJFQURfQ0tWUlNBVkUsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LAorCQkJCQkgICAgY2t2cnNhdmUpKTsKKwlERUZJTkUoVEhSRUFEX0NLRlBTVEFURSwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsCisJCQkJCQkgY2tmcF9zdGF0ZSkpOwogCS8qIExvY2FsIHB0X3JlZ3Mgb24gc3RhY2sgZm9yIFRyYW5zYWN0aW9uYWwgTWVtb3J5IGZ1bmNzLiAqLwogCURFRklORShUTV9GUkFNRV9TSVpFLCBTVEFDS19GUkFNRV9PVkVSSEVBRCArCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgcHRfcmVncykgKyAxNik7CkBAIC01MDYsNyArNTA2LDYgQEAKIAlERUZJTkUoVkNQVV9QVVJSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gucHVycikpOwogCURFRklORShWQ1BVX1NQVVJSLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guc3B1cnIpKTsKIAlERUZJTkUoVkNQVV9JQywgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmljKSk7Ci0JREVGSU5FKFZDUFVfVlRCLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudnRiKSk7CiAJREVGSU5FKFZDUFVfRFNDUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmRzY3IpKTsKIAlERUZJTkUoVkNQVV9BTVIsIG9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5hbXIpKTsKIAlERUZJTkUoVkNQVV9VQU1PUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnVhbW9yKSk7CkBAIC01NTcsNiArNTU2LDcgQEAKIAlERUZJTkUoVkNPUkVfTFBDUiwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY192Y29yZSwgbHBjcikpOwogCURFRklORShWQ09SRV9QQ1IsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfdmNvcmUsIHBjcikpOwogCURFRklORShWQ09SRV9EUERFUywgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY192Y29yZSwgZHBkZXMpKTsKKwlERUZJTkUoVkNPUkVfVlRCLCBvZmZzZXRvZihzdHJ1Y3Qga3ZtcHBjX3Zjb3JlLCB2dGIpKTsKIAlERUZJTkUoVkNQVV9TTEJfRSwgb2Zmc2V0b2Yoc3RydWN0IGt2bXBwY19zbGIsIG9yaWdlKSk7CiAJREVGSU5FKFZDUFVfU0xCX1YsIG9mZnNldG9mKHN0cnVjdCBrdm1wcGNfc2xiLCBvcmlndikpOwogCURFRklORShWQ1BVX1NMQl9TSVpFLCBzaXplb2Yoc3RydWN0IGt2bXBwY19zbGIpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwppbmRleCA3NDI0OGFiLi42YzQ2NDZhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCkBAIC01MDYsNiArNTA2LDI1IEBACiAJCS5tYWNoaW5lX2NoZWNrX2Vhcmx5CT0gX19tYWNoaW5lX2NoZWNrX2Vhcmx5X3JlYWxtb2RlX3A4LAogCQkucGxhdGZvcm0JCT0gInBvd2VyOCIsCiAJfSwKKwl7CS8qIFBvd2VyOSBERDEqLworCQkucHZyX21hc2sJCT0gMHhmZmZmZmYwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDAwNGUwMTAwLAorCQkuY3B1X25hbWUJCT0gIlBPV0VSOSAocmF3KSIsCisJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfUE9XRVI5X0REMSwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUE9XRVI5LAorCQkuY3B1X3VzZXJfZmVhdHVyZXMyCT0gQ09NTU9OX1VTRVIyX1BPV0VSOSwKKwkJLm1tdV9mZWF0dXJlcwkJPSBNTVVfRlRSU19QT1dFUjksCisJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAorCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDYsCisJCS5wbWNfdHlwZQkJPSBQUENfUE1DX0lCTSwKKwkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyOSIsCisJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9JTlZBTElELAorCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyOSwKKwkJLmNwdV9yZXN0b3JlCQk9IF9fcmVzdG9yZV9jcHVfcG93ZXI5LAorCQkuZmx1c2hfdGxiCQk9IF9fZmx1c2hfdGxiX3Bvd2VyOSwKKwkJLnBsYXRmb3JtCQk9ICJwb3dlcjkiLAorCX0sCiAJewkvKiBQb3dlcjkgKi8KIAkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCiAJCS5wdnJfdmFsdWUJCT0gMHgwMDRlMDAwMCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VlaC5jCmluZGV4IDc0Mjk1NTYuLmYyNTczMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lZWguYwpAQCAtMTE2LDYgKzExNiw3IEBACiAKIC8qIExvY2sgdG8gYXZvaWQgcmFjZXMgZHVlIHRvIG11bHRpcGxlIHJlcG9ydHMgb2YgYW4gZXJyb3IgKi8KIERFRklORV9SQVdfU1BJTkxPQ0soY29uZmlybV9lcnJvcl9sb2NrKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNvbmZpcm1fZXJyb3JfbG9jayk7CiAKIC8qIExvY2sgdG8gcHJvdGVjdCBwYXNzZWQgZmxhZ3MgKi8KIHN0YXRpYyBERUZJTkVfTVVURVgoZWVoX2Rldl9tdXRleCk7CkBAIC0xMDQ0LDcgKzEwNDUsNyBAQAogCWlmIChlZWhfZW5hYmxlZCgpKQogCQlwcl9pbmZvKCJFRUg6IFBDSSBFbmhhbmNlZCBJL08gRXJyb3IgSGFuZGxpbmcgRW5hYmxlZFxuIik7CiAJZWxzZQotCQlwcl93YXJuKCJFRUg6IE5vIGNhcGFibGUgYWRhcHRlcnMgZm91bmRcbiIpOworCQlwcl9pbmZvKCJFRUg6IE5vIGNhcGFibGUgYWRhcHRlcnMgZm91bmRcbiIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1MDIsNiArMTUwMyw3IEBACiAJCWJyZWFrOwogCWNhc2UgRUVIX09QVF9USEFXX01NSU86CiAJY2FzZSBFRUhfT1BUX1RIQVdfRE1BOgorCWNhc2UgRUVIX09QVF9GUkVFWkVfUEU6CiAJCWlmICghZWVoX29wcyB8fCAhZWVoX29wcy0+c2V0X29wdGlvbikgewogCQkJcmV0ID0gLUVOT0VOVDsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lZWhfZHJpdmVyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9kcml2ZXIuYwppbmRleCA1ZjM2ZThhLi5hNjJiZTcyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9kcml2ZXIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9kcml2ZXIuYwpAQCAtOTkzLDkgKzk5MywxNyBAQAogCiAJCQkJLyogTm90aWZ5IGFsbCBkZXZpY2VzIHRvIGJlIGRvd24gKi8KIAkJCQllZWhfcGVfc3RhdGVfY2xlYXIocGUsIEVFSF9QRV9QUklfQlVTKTsKLQkJCQlidXMgPSBlZWhfcGVfYnVzX2dldChwaGJfcGUpOwogCQkJCWVlaF9wZV9kZXZfdHJhdmVyc2UocGUsCiAJCQkJCWVlaF9yZXBvcnRfZmFpbHVyZSwgTlVMTCk7CisJCQkJYnVzID0gZWVoX3BlX2J1c19nZXQocGhiX3BlKTsKKwkJCQlpZiAoIWJ1cykgeworCQkJCQlwcl9lcnIoIiVzOiBDYW5ub3QgZmluZCBQQ0kgYnVzIGZvciAiCisJCQkJCSAgICAgICAiUEhCIyVkLVBFIyV4XG4iLAorCQkJCQkgICAgICAgX19mdW5jX18sCisJCQkJCSAgICAgICBwZS0+cGhiLT5nbG9iYWxfbnVtYmVyLAorCQkJCQkgICAgICAgcGUtPmFkZHIpOworCQkJCQlicmVhazsKKwkJCQl9CiAJCQkJcGNpX2hwX3JlbW92ZV9kZXZpY2VzKGJ1cyk7CiAJCQl9CiAJCQlwY2lfdW5sb2NrX3Jlc2Nhbl9yZW1vdmUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoX3BlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VlaF9wZS5jCmluZGV4IGYwNTIwZGEuLmRlN2QwOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZWVoX3BlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lZWhfcGUuYwpAQCAtNTgxLDYgKzU4MSw3IEBACiB7CiAJZWVoX3BlX3RyYXZlcnNlKHBlLCBfX2VlaF9wZV9zdGF0ZV9tYXJrLCAmc3RhdGUpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZWVoX3BlX3N0YXRlX21hcmspOwogCiBzdGF0aWMgdm9pZCAqX19lZWhfcGVfZGV2X21vZGVfbWFyayh2b2lkICpkYXRhLCB2b2lkICpmbGFnKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV8zMi5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV8zMi5TCmluZGV4IDk4OTkwMzIuLjgzNDI4YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzMyLlMKQEAgLTY1NCw3ICs2NTQsNiBAQAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogCXRvcGh5cyhyMCxyNCkKLQlDTFJfVE9QMzIocjApCiAJbXRzcHIJU1BSTl9TUFJHX1RIUkVBRCxyMAkvKiBVcGRhdGUgY3VycmVudCBUSFJFQUQgcGh5cyBhZGRyICovCiAJbHd6CXIxLEtTUChyNCkJLyogTG9hZCBuZXcgc3RhY2sgcG9pbnRlciAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKaW5kZXggNmI4YmMwZC4uNTFkZjgyYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUwpAQCAtMTM5LDcgKzEzOSw3IEBACiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKIAl3cnRlZWkJMQogI2Vsc2UKLQlsZAlyMTEsUEFDQUtNU1IocjEzKQorCWxpCXIxMSxNU1JfUkkKIAlvcmkJcjExLHIxMSxNU1JfRUUKIAltdG1zcmQJcjExLDEKICNlbmRpZiAvKiBDT05GSUdfUFBDX0JPT0szRSAqLwpAQCAtMTk1LDcgKzE5NSw2IEBACiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKIAl3cnRlZWkJMAogI2Vsc2UKLQlsZAlyMTAsUEFDQUtNU1IocjEzKQogCS8qCiAJICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgd2UgY2xlYXIgUkkgdGhlIHNhbWUgdGltZSB0aGF0IHdlCiAJICogY2xlYXIgRUUuIFdlIG9ubHkgbmVlZCB0byBjbGVhciBSSSBqdXN0IGJlZm9yZSB3ZSByZXN0b3JlIHIxMwpAQCAtMjAzLDggKzIwMiw3IEBACiAJICogV2UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIHJlc3RvcmUgUkkgaWYgd2UgYnJhbmNoIGFueXdoZXJlIGZyb20KIAkgKiBoZXJlIChlZyBzeXNjYWxsX2V4aXRfd29yaykuCiAJICovCi0JbGkJcjksTVNSX1JJCi0JYW5kYwlyMTEscjEwLHI5CisJbGkJcjExLDAKIAltdG1zcmQJcjExLDEKICNlbmRpZiAvKiBDT05GSUdfUFBDX0JPT0szRSAqLwogCkBAIC0yMjEsMTMgKzIxOSwxMiBAQAogI2VuZGlmCiAyOglhZGRpICAgIHIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM1MKKwlsaQlyMTAsTVNSX1JJCiAJbXRtc3JkCXIxMCwxCQkvKiBSZXN0b3JlIFJJICovCiAjZW5kaWYKIAlibAlyZXN0b3JlX21hdGgKICNpZmRlZiBDT05GSUdfUFBDX0JPT0szUwotCWxkCXIxMCxQQUNBS01TUihyMTMpCi0JbGkJcjksTVNSX1JJCi0JYW5kYwlyMTEscjEwLHI5IC8qIFJlLWNsZWFyIFJJICovCisJbGkJcjExLDAKIAltdG1zcmQJcjExLDEKICNlbmRpZgogCWxkCXI4LF9NU1IocjEpCkBAIC0zMDgsNiArMzA1LDcgQEAKIAkKIHN5c2NhbGxfZXhpdF93b3JrOgogI2lmZGVmIENPTkZJR19QUENfQk9PSzNTCisJbGkJcjEwLE1TUl9SSQogCW10bXNyZAlyMTAsMQkJLyogUmVzdG9yZSBSSSAqLwogI2VuZGlmCiAJLyogSWYgVElGX1JFU1RPUkVBTEwgaXMgc2V0LCBkb24ndCBzY3JpYmJsZSBvbiBlaXRoZXIgcjMgb3IgY2NyLgpAQCAtMzU0LDcgKzM1Miw3IEBACiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKIAl3cnRlZWkJMQogI2Vsc2UKLQlsZAlyMTAsUEFDQUtNU1IocjEzKQorCWxpCXIxMCxNU1JfUkkKIAlvcmkJcjEwLHIxMCxNU1JfRUUKIAltdG1zcmQJcjEwLDEKICNlbmRpZiAvKiBDT05GSUdfUFBDX0JPT0szRSAqLwpAQCAtMzY4LDEzICszNjYsMTMgQEAKIHRhYm9ydF9zeXNjYWxsOgogCS8qIEZpcnN0bHkgd2UgbmVlZCB0byBlbmFibGUgVE0gaW4gdGhlIGtlcm5lbCAqLwogCW1mbXNyCXIxMAotCWxpCXIxMywgMQotCXJsZGltaQlyMTAsIHIxMywgTVNSX1RNX0xHLCA2My1NU1JfVE1fTEcKKwlsaQlyOSwgMQorCXJsZGltaQlyMTAsIHI5LCBNU1JfVE1fTEcsIDYzLU1TUl9UTV9MRwogCW10bXNyZAlyMTAsIDAKIAogCS8qIHRhYm9ydCwgdGhpcyBkb29tcyB0aGUgdHJhbnNhY3Rpb24sIG5vdGhpbmcgZWxzZSAqLwotCWxpCXIxMywgKFRNX0NBVVNFX1NZU0NBTEx8VE1fQ0FVU0VfUEVSU0lTVEVOVCkKLQlUQUJPUlQoUjEzKQorCWxpCXI5LCAoVE1fQ0FVU0VfU1lTQ0FMTHxUTV9DQVVTRV9QRVJTSVNURU5UKQorCVRBQk9SVChSOSkKIAogCS8qCiAJICogUmV0dXJuIGRpcmVjdGx5IHRvIHVzZXJzcGFjZS4gV2UgaGF2ZSBjb3JydXB0ZWQgdXNlciByZWdpc3RlciBzdGF0ZSwKQEAgLTM4Miw4ICszODAsOCBAQAogCSAqIHJlc3VtZSBhZnRlciB0aGUgdGJlZ2luIG9mIHRoZSBhYm9ydGVkIHRyYW5zYWN0aW9uIHdpdGggdGhlCiAJICogY2hlY2twb2ludGVkIHJlZ2lzdGVyIHN0YXRlLgogCSAqLwotCWxpCXIxMywgTVNSX1JJCi0JYW5kYwlyMTAsIHIxMCwgcjEzCisJbGkJcjksIE1TUl9SSQorCWFuZGMJcjEwLCByMTAsIHI5CiAJbXRtc3JkCXIxMCwgMQogCW10c3ByCVNQUk5fU1JSMCwgcjExCiAJbXRzcHIJU1BSTl9TUlIxLCByMTIKQEAgLTYxOSw3ICs2MTcsNyBAQAogI2lmZGVmIENPTkZJR19QUENfQk9PSzNFCiAJd3J0ZWVpCTAKICNlbHNlCi0JbGQJcjEwLFBBQ0FLTVNSKHIxMykgLyogR2V0IGtlcm5lbCBNU1Igd2l0aG91dCBFRSAqLworCWxpCXIxMCxNU1JfUkkKIAltdG1zcmQJcjEwLDEJCSAgLyogVXBkYXRlIG1hY2hpbmUgc3RhdGUgKi8KICNlbmRpZiAvKiBDT05GSUdfUFBDX0JPT0szRSAqLwogCkBAIC03NTEsNyArNzQ5LDcgQEAKICNpZmRlZiBDT05GSUdfUFBDX0JPT0szRQogCXdydGVlaQkwCiAjZWxzZQotCWxkCXIxMCxQQUNBS01TUihyMTMpIC8qIEdldCBrZXJuZWwgTVNSIHdpdGhvdXQgRUUgKi8KKwlsaQlyMTAsTVNSX1JJCiAJbXRtc3JkCXIxMCwxCQkgIC8qIFVwZGF0ZSBtYWNoaW5lIHN0YXRlICovCiAjZW5kaWYgLyogQ09ORklHX1BQQ19CT09LM0UgKi8KICNlbmRpZiAvKiBDT05GSUdfUFJFRU1QVCAqLwpAQCAtODQxLDggKzgzOSw3IEBACiAJICogdXNlcnNwYWNlIGFuZCB3ZSB0YWtlIGFuIGV4Y2VwdGlvbiBhZnRlciByZXN0b3JpbmcgcjEzLAogCSAqIHdlIGVuZCB1cCBjb3JydXB0aW5nIHRoZSB1c2Vyc3BhY2UgcjEzIHZhbHVlLgogCSAqLwotCWxkCXI0LFBBQ0FLTVNSKHIxMykgLyogR2V0IGtlcm5lbCBNU1Igd2l0aG91dCBFRSAqLwotCWFuZGMJcjQscjQscjAJIC8qIHIwIGNvbnRhaW5zIE1TUl9SSSBoZXJlICovCisJbGkJcjQsMAogCW10bXNyZAlyNCwxCiAKICNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKaW5kZXggZGY2ZDQ1ZS4uMDg5OTJmOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUwpAQCAtMTYsNzIgKzE2LDcxIEBACiAjaW5jbHVkZSA8YXNtL2V4Y2VwdGlvbi02NHMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWlkbGUuaD4KKyNpbmNsdWRlIDxhc20vaGVhZC02NC5oPgogCiAvKgorICogVGhlcmUgYXJlIGEgZmV3IGNvbnN0cmFpbnRzIHRvIGJlIGNvbmNlcm5lZCB3aXRoLgorICogLSBSZWFsIG1vZGUgZXhjZXB0aW9ucyBjb2RlL2RhdGEgbXVzdCBiZSBsb2NhdGVkIGF0IHRoZWlyIHBoeXNpY2FsIGxvY2F0aW9uLgorICogLSBWaXJ0dWFsIG1vZGUgZXhjZXB0aW9ucyBtdXN0IGJlIG1hcHBlZCBhdCB0aGVpciAweGMwMDAuLi4gbG9jYXRpb24uCisgKiAtIEZpeGVkIGxvY2F0aW9uIGNvZGUgbXVzdCBub3QgY2FsbCBkaXJlY3RseSBiZXlvbmQgdGhlIF9fZW5kX2ludGVycnVwdHMKKyAqICAgYXJlYSB3aGVuIGJ1aWx0IHdpdGggQ09ORklHX1JFTE9DQVRBQkxFLiBMT0FEX0hBTkRMRVIgLyBiY3RyIHNlcXVlbmNlCisgKiAgIG11c3QgYmUgdXNlZC4KKyAqIC0gTE9BRF9IQU5ETEVSIHRhcmdldHMgbXVzdCBiZSB3aXRoaW4gZmlyc3QgNjRLIG9mIHBoeXNpY2FsIDAgLworICogICB2aXJ0dWFsIDB4YzAwLi4uCisgKiAtIENvbmRpdGlvbmFsIGJyYW5jaCB0YXJnZXRzIG11c3QgYmUgd2l0aGluICsvLTMySyBvZiBjYWxsZXIuCisgKgorICogIlZpcnR1YWwgZXhjZXB0aW9ucyIgcnVuIHdpdGggcmVsb2NhdGlvbiBvbiAoTVNSX0lSPTEsIE1TUl9EUj0xKSwgYW5kCisgKiB0aGVyZWZvcmUgZG9uJ3QgaGF2ZSB0byBydW4gaW4gcGh5c2ljYWxseSBsb2NhdGVkIGNvZGUgb3IgcmZpZCB0bworICogdmlydHVhbCBtb2RlIGtlcm5lbCBjb2RlLiBIb3dldmVyIG9uIHJlbG9jYXRhYmxlIGtlcm5lbHMgdGhleSBkbyBoYXZlCisgKiB0byBicmFuY2ggdG8gS0VSTkVMQkFTRSBvZmZzZXQgYmVjYXVzZSB0aGUgcmVzdCBvZiB0aGUga2VybmVsIChvdXRzaWRlCisgKiB0aGUgZXhjZXB0aW9uIHZlY3RvcnMpIG1heSBiZSBsb2NhdGVkIGVsc2V3aGVyZS4KKyAqCisgKiBWaXJ0dWFsIGV4Y2VwdGlvbnMgY29ycmVzcG9uZCB3aXRoIHBoeXNpY2FsLCBleGNlcHQgdGhlaXIgZW50cnkgcG9pbnRzCisgKiBhcmUgb2Zmc2V0IGJ5IDB4YzAwMDAwMDAwMDAwMDAwMCBhbmQgYWxzbyB0ZW5kIHRvIGdldCBhbiBhZGRlZCAweDQwMDAKKyAqIG9mZnNldCBhcHBsaWVkLiBWaXJ0dWFsIGV4Y2VwdGlvbnMgYXJlIGVuYWJsZWQgd2l0aCB0aGUgQWx0ZXJuYXRlCisgKiBJbnRlcnJ1cHQgTG9jYXRpb24gKEFJTCkgYml0IHNldCBpbiB0aGUgTFBDUi4gSG93ZXZlciB0aGlzIGRvZXMgbm90CisgKiBndWFyYW50ZWUgdGhleSB3aWxsIGJlIGRlbGl2ZXJlZCB2aXJ0dWFsbHkuIFNvbWUgY29uZGl0aW9ucyAoc2VlIHRoZSBJU0EpCisgKiBjYXVzZSBleGNlcHRpb25zIHRvIGJlIGRlbGl2ZXJlZCBpbiByZWFsIG1vZGUuCisgKgorICogSXQncyBpbXBvc3NpYmxlIHRvIHJlY2VpdmUgaW50ZXJydXB0cyBiZWxvdyAweDMwMCB2aWEgQUlMLgorICoKKyAqIEtWTTogTm9uZSBvZiB0aGUgdmlydHVhbCBleGNlcHRpb25zIGFyZSBmcm9tIHRoZSBndWVzdC4gQW55dGhpbmcgdGhhdAorICogZXNjYWxhdGVkIHRvIEhWPTEgZnJvbSBIVj0wIGlzIGRlbGl2ZXJlZCB2aWEgcmVhbCBtb2RlIGhhbmRsZXJzLgorICoKKyAqCiAgKiBXZSBsYXlvdXQgcGh5c2ljYWwgbWVtb3J5IGFzIGZvbGxvd3M6CiAgKiAweDAwMDAgLSAweDAwZmYgOiBTZWNvbmRhcnkgcHJvY2Vzc29yIHNwaW4gY29kZQotICogMHgwMTAwIC0gMHgxN2ZmIDogcFNlcmllcyBJbnRlcnJ1cHQgcHJvbG9ncwotICogMHgxODAwIC0gMHg0MDAwIDogaW50ZXJydXB0IHN1cHBvcnQgY29tbW9uIGludGVycnVwdCBwcm9sb2dzCi0gKiAweDQwMDAgLSAweDVmZmYgOiBwU2VyaWVzIGludGVycnVwdHMgd2l0aCBJUj0xLERSPTEKLSAqIDB4NjAwMCAtIDB4NmZmZiA6IG1vcmUgaW50ZXJydXB0IHN1cHBvcnQgaW5jbHVkaW5nIGZvciBJUj0xLERSPTEKKyAqIDB4MDEwMCAtIDB4MThmZiA6IFJlYWwgbW9kZSBwU2VyaWVzIGludGVycnVwdCB2ZWN0b3JzCisgKiAweDE5MDAgLSAweDNmZmYgOiBSZWFsIG1vZGUgdHJhbXBvbGluZXMKKyAqIDB4NDAwMCAtIDB4NThmZiA6IFJlbG9uIChJUj0xLERSPTEpIG1vZGUgcFNlcmllcyBpbnRlcnJ1cHQgdmVjdG9ycworICogMHg1OTAwIC0gMHg2ZmZmIDogUmVsb24gbW9kZSB0cmFtcG9saW5lcwogICogMHg3MDAwIC0gMHg3ZmZmIDogRldOTUkgZGF0YSBhcmVhCi0gKiAweDgwMDAgLSAweDhmZmYgOiBJbml0aWFsIChDUFUwKSBzZWdtZW50IHRhYmxlCi0gKiAweDkwMDAgLSAgICAgICAgOiBFYXJseSBpbml0IGFuZCBzdXBwb3J0IGNvZGUKKyAqIDB4ODAwMCAtICAgLi4uLiA6IENvbW1vbiBpbnRlcnJ1cHQgaGFuZGxlcnMsIHJlbWFpbmluZyBlYXJseQorICogICAgICAgICAgICAgICAgICAgc2V0dXAgY29kZSwgcmVzdCBvZiBrZXJuZWwuCisgKgorICogV2UgY291bGQgcmVjbGFpbSAweDQwMDAtMHg0MmZmIGZvciByZWFsIG1vZGUgdHJhbXBvbGluZXMgaWYgdGhlIHNwYWNlCisgKiBpcyBuZWNlc3NhcnkuIFVudGlsIHRoZW4gaXQncyBtb3JlIGNvbnNpc3RlbnQgdG8gZXhwbGljaXRseSBwdXQgVklSVF9OT05FCisgKiB2ZWN0b3JzIHRoZXJlLgogICovCi0JLyogU3lzY2FsbCByb3V0aW5lIGlzIHVzZWQgdHdpY2UsIGluIHJlbG9jLW9mZiBhbmQgcmVsb2Mtb24gcGF0aHMgKi8KLSNkZWZpbmUgU1lTQ0FMTF9QU0VSSUVTXzEgCQkJCQlcCi1CRUdJTl9GVFJfU0VDVElPTgkJCQkJCVwKLQljbXBkaQlyMCwweDFlYmUgOyAJCQkJCVwKLQliZXEtCTFmIDsJCQkJCQlcCi1FTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9SRUFMX0xFKQkJCQlcCi0JbXIJcjkscjEzIDsJCQkJCVwKLQlHRVRfUEFDQShyMTMpIDsJCQkJCQlcCi0JbWZzcHIJcjExLFNQUk5fU1JSMCA7CQkJCQlcCi0wOgotCi0jZGVmaW5lIFNZU0NBTExfUFNFUklFU18yX1JGSUQgCQkJCQlcCi0JbWZzcHIJcjEyLFNQUk5fU1JSMSA7CQkJCQlcCi0JbGQJcjEwLFBBQ0FLQkFTRShyMTMpIDsgCQkJCVwKLQlMT0FEX0hBTkRMRVIocjEwLCBzeXN0ZW1fY2FsbF9lbnRyeSkgOyAJCQlcCi0JbXRzcHIJU1BSTl9TUlIwLHIxMCA7IAkJCQlcCi0JbGQJcjEwLFBBQ0FLTVNSKHIxMykgOwkJCQlcCi0JbXRzcHIJU1BSTl9TUlIxLHIxMCA7IAkJCQlcCi0JcmZpZCA7IAkJCQkJCQlcCi0JYgkuIDsJLyogcHJldmVudCBzcGVjdWxhdGl2ZSBleGVjdXRpb24gKi8KLQotI2RlZmluZSBTWVNDQUxMX1BTRVJJRVNfMwkJCQkJXAotCS8qIEZhc3QgTEUvQkUgc3dpdGNoIHN5c3RlbSBjYWxsICovCQkJXAotMToJbWZzcHIJcjEyLFNQUk5fU1JSMSA7CQkJCQlcCi0JeG9yaQlyMTIscjEyLE1TUl9MRSA7CQkJCVwKLQltdHNwcglTUFJOX1NSUjEscjEyIDsJCQkJCVwKLQlyZmlkIDsJCS8qIHJldHVybiB0byB1c2Vyc3BhY2UgKi8JCVwKLQliCS4gOwkvKiBwcmV2ZW50IHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfUkVMT0NBVEFCTEUpCi0JLyoKLQkgKiBXZSBjYW4ndCBicmFuY2ggZGlyZWN0bHkgc28gd2UgZG8gaXQgdmlhIHRoZSBDVFIgd2hpY2gKLQkgKiBpcyB2b2xhdGlsZSBhY3Jvc3Mgc3lzdGVtIGNhbGxzLgotCSAqLwotI2RlZmluZSBTWVNDQUxMX1BTRVJJRVNfMl9ESVJFQ1QJCQkJXAotCW1mbHIJcjEwIDsJCQkJCQlcCi0JbGQJcjEyLFBBQ0FLQkFTRShyMTMpIDsgCQkJCVwKLQlMT0FEX0hBTkRMRVIocjEyLCBzeXN0ZW1fY2FsbF9lbnRyeSkgOwkJCVwKLQltdGN0cglyMTIgOwkJCQkJCVwKLQltZnNwcglyMTIsU1BSTl9TUlIxIDsJCQkJCVwKLQkvKiBSZS11c2Ugb2YgcjEzLi4uIE5vIHNwYXJlIHJlZ3MgdG8gZG8gdGhpcyAqLwlcCi0JbGkJcjEzLE1TUl9SSSA7CQkJCQlcCi0JbXRtc3JkIAlyMTMsMSA7CQkJCQkJXAotCUdFVF9QQUNBKHIxMykgOwkvKiBnZXQgcjEzIGJhY2sgKi8JCQlcCi0JYmN0ciA7CitPUEVOX0ZJWEVEX1NFQ1RJT04ocmVhbF92ZWN0b3JzLCAgICAgICAgMHgwMTAwLCAweDE5MDApCitPUEVOX0ZJWEVEX1NFQ1RJT04ocmVhbF90cmFtcG9saW5lcywgICAgMHgxOTAwLCAweDQwMDApCitPUEVOX0ZJWEVEX1NFQ1RJT04odmlydF92ZWN0b3JzLCAgICAgICAgMHg0MDAwLCAweDU5MDApCitPUEVOX0ZJWEVEX1NFQ1RJT04odmlydF90cmFtcG9saW5lcywgICAgMHg1OTAwLCAweDcwMDApCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX1BTRVJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1BQQ19QT1dFUk5WKQorLyoKKyAqIERhdGEgYXJlYSByZXNlcnZlZCBmb3IgRldOTUkgb3B0aW9uLgorICogVGhpcyBhZGRyZXNzICgweDcwMDApIGlzIGZpeGVkIGJ5IHRoZSBSUEEuCisgKiBwc2VyaWVzIGFuZCBwb3dlcm52IG5lZWQgdG8ga2VlcCB0aGUgd2hvbGUgcGFnZSBmcm9tCisgKiAweDcwMDAgdG8gMHg4MDAwIGZyZWUgZm9yIHVzZSBieSB0aGUgZmlybXdhcmUKKyAqLworWkVST19GSVhFRF9TRUNUSU9OKGZ3bm1pX3BhZ2UsICAgICAgICAgIDB4NzAwMCwgMHg4MDAwKQorT1BFTl9URVhUX1NFQ1RJT04oMHg4MDAwKQogI2Vsc2UKLQkvKiBXZSBjYW4gYnJhbmNoIGRpcmVjdGx5ICovCi0jZGVmaW5lIFNZU0NBTExfUFNFUklFU18yX0RJUkVDVAkJCQlcCi0JbWZzcHIJcjEyLFNQUk5fU1JSMSA7CQkJCQlcCi0JbGkJcjEwLE1TUl9SSSA7CQkJCQlcCi0JbXRtc3JkIAlyMTAsMSA7CQkJLyogU2V0IFJJIChFRT0wKSAqLwlcCi0JYglzeXN0ZW1fY2FsbF9jb21tb24gOworT1BFTl9URVhUX1NFQ1RJT04oMHg3MDAwKQogI2VuZGlmCiAKK1VTRV9GSVhFRF9TRUNUSU9OKHJlYWxfdmVjdG9ycykKKwogLyoKICAqIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcnMgZm9yIHBTZXJpZXMKICAqIFRoaXMgY29kZSBydW5zIHdpdGggcmVsb2NhdGlvbiBvZmYuCkBAIC05MCwxMiArODksMTMgQEAKICAqIFRoZXJlZm9yZSBhbnkgcmVsYXRpdmUgYnJhbmNoZXMgaW4gdGhpcyBzZWN0aW9uIG11c3Qgb25seQogICogYnJhbmNoIHRvIGxhYmVscyBpbiB0aGlzIHNlY3Rpb24uCiAgKi8KLQkuID0gMHgxMDAKIAkuZ2xvYmwgX19zdGFydF9pbnRlcnJ1cHRzCiBfX3N0YXJ0X2ludGVycnVwdHM6CiAKLQkuZ2xvYmwgc3lzdGVtX3Jlc2V0X3BTZXJpZXM7Ci1zeXN0ZW1fcmVzZXRfcFNlcmllczoKKy8qIE5vIHZpcnQgdmVjdG9ycyBjb3JyZXNwb25kaW5nIHdpdGggMHgwLi4weDEwMCAqLworRVhDX1ZJUlRfTk9ORSgweDQwMDAsIDB4NDEwMCkKKworRVhDX1JFQUxfQkVHSU4oc3lzdGVtX3Jlc2V0LCAweDEwMCwgMHgyMDApCiAJU0VUX1NDUkFUQ0gwKHIxMykKICNpZmRlZiBDT05GSUdfUFBDX1A3X05BUAogQkVHSU5fRlRSX1NFQ1RJT04KQEAgLTEzNiw5ICsxMzYsMjIgQEAKICNlbmRpZiAvKiBDT05GSUdfUFBDX1A3X05BUCAqLwogCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBzeXN0ZW1fcmVzZXRfY29tbW9uLCBFWENfU1RELAogCQkJCSBOT1RFU1QsIDB4MTAwKQorRVhDX1JFQUxfRU5EKHN5c3RlbV9yZXNldCwgMHgxMDAsIDB4MjAwKQorRVhDX1ZJUlRfTk9ORSgweDQxMDAsIDB4NDIwMCkKK0VYQ19DT01NT04oc3lzdGVtX3Jlc2V0X2NvbW1vbiwgMHgxMDAsIHN5c3RlbV9yZXNldF9leGNlcHRpb24pCiAKLQkuID0gMHgyMDAKLW1hY2hpbmVfY2hlY2tfcFNlcmllc18xOgorI2lmZGVmIENPTkZJR19QUENfUFNFUklFUworLyoKKyAqIFZlY3RvcnMgZm9yIHRoZSBGV05NSSBvcHRpb24uICBTaGFyZSBjb21tb24gY29kZS4KKyAqLworVFJBTVBfUkVBTF9CRUdJTihzeXN0ZW1fcmVzZXRfZndubWkpCisJU0VUX1NDUkFUQ0gwKHIxMykJCS8qIHNhdmUgcjEzICovCisJRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTKFBBQ0FfRVhHRU4sIHN5c3RlbV9yZXNldF9jb21tb24sIEVYQ19TVEQsCisJCQkJIE5PVEVTVCwgMHgxMDApCisjZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCisKKworRVhDX1JFQUxfQkVHSU4obWFjaGluZV9jaGVjaywgMHgyMDAsIDB4MzAwKQogCS8qIFRoaXMgaXMgbW92ZWQgb3V0IG9mIGxpbmUgYXMgaXQgY2FuIGJlIHBhdGNoZWQgYnkgRlcsIGJ1dAogCSAqIHNvbWUgY29kZSBwYXRoIG1pZ2h0IHN0aWxsIHdhbnQgdG8gYnJhbmNoIGludG8gdGhlIG9yaWdpbmFsCiAJICogdmVjdG9yCkBAIC0xNTgsMjUzICsxNzEsOSBAQAogRlRSX1NFQ1RJT05fRUxTRQogCWIJbWFjaGluZV9jaGVja19wU2VyaWVzXzAKIEFMVF9GVFJfU0VDVElPTl9FTkRfSUZTRVQoQ1BVX0ZUUl9IVk1PREUpCi0KLQkuID0gMHgzMDAKLQkuZ2xvYmwgZGF0YV9hY2Nlc3NfcFNlcmllcwotZGF0YV9hY2Nlc3NfcFNlcmllczoKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBkYXRhX2FjY2Vzc19jb21tb24sIEVYQ19TVEQsCi0JCQkJIEtWTVRFU1QsIDB4MzAwKQotCi0JLiA9IDB4MzgwCi0JLmdsb2JsIGRhdGFfYWNjZXNzX3NsYl9wU2VyaWVzCi1kYXRhX2FjY2Vzc19zbGJfcFNlcmllczoKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYU0xCKQotCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYU0xCLCBLVk1URVNULCAweDM4MCkKLQlzdGQJcjMsUEFDQV9FWFNMQitFWF9SMyhyMTMpCi0JbWZzcHIJcjMsU1BSTl9EQVIKLQltZnNwcglyMTIsU1BSTl9TUlIxCi0jaWZuZGVmIENPTkZJR19SRUxPQ0FUQUJMRQotCWIJc2xiX21pc3NfcmVhbG1vZGUKLSNlbHNlCi0JLyoKLQkgKiBXZSBjYW4ndCBqdXN0IHVzZSBhIGRpcmVjdCBicmFuY2ggdG8gc2xiX21pc3NfcmVhbG1vZGUKLQkgKiBiZWNhdXNlIHRoZSBkaXN0YW5jZSBmcm9tIGhlcmUgdG8gdGhlcmUgZGVwZW5kcyBvbiB3aGVyZQotCSAqIHRoZSBrZXJuZWwgZW5kcyB1cCBiZWluZyBwdXQuCi0JICovCi0JbWZjdHIJcjExCi0JbGQJcjEwLFBBQ0FLQkFTRShyMTMpCi0JTE9BRF9IQU5ETEVSKHIxMCwgc2xiX21pc3NfcmVhbG1vZGUpCi0JbXRjdHIJcjEwCi0JYmN0cgotI2VuZGlmCi0KLQlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHg0MDAsIGluc3RydWN0aW9uX2FjY2VzcykKLQotCS4gPSAweDQ4MAotCS5nbG9ibCBpbnN0cnVjdGlvbl9hY2Nlc3Nfc2xiX3BTZXJpZXMKLWluc3RydWN0aW9uX2FjY2Vzc19zbGJfcFNlcmllczoKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYU0xCKQotCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYU0xCLCBLVk1URVNULCAweDQ4MCkKLQlzdGQJcjMsUEFDQV9FWFNMQitFWF9SMyhyMTMpCi0JbWZzcHIJcjMsU1BSTl9TUlIwCQkvKiBTUlIwIGlzIGZhdWx0aW5nIGFkZHJlc3MgKi8KLQltZnNwcglyMTIsU1BSTl9TUlIxCi0jaWZuZGVmIENPTkZJR19SRUxPQ0FUQUJMRQotCWIJc2xiX21pc3NfcmVhbG1vZGUKLSNlbHNlCi0JbWZjdHIJcjExCi0JbGQJcjEwLFBBQ0FLQkFTRShyMTMpCi0JTE9BRF9IQU5ETEVSKHIxMCwgc2xiX21pc3NfcmVhbG1vZGUpCi0JbXRjdHIJcjEwCi0JYmN0cgotI2VuZGlmCi0KLQkvKiBXZSBvcGVuIGNvZGUgdGhlc2UgYXMgd2UgY2FuJ3QgaGF2ZSBhICIuID0geCIgKGV2ZW4gd2l0aAotCSAqIHggPSAiLiIgd2l0aGluIGEgZmVhdHVyZSBzZWN0aW9uCi0JICovCi0JLiA9IDB4NTAwOwotCS5nbG9ibCBoYXJkd2FyZV9pbnRlcnJ1cHRfcFNlcmllczsKLQkuZ2xvYmwgaGFyZHdhcmVfaW50ZXJydXB0X2h2OwotaGFyZHdhcmVfaW50ZXJydXB0X3BTZXJpZXM6Ci1oYXJkd2FyZV9pbnRlcnJ1cHRfaHY6Ci0JQkVHSU5fRlRSX1NFQ1RJT04KLQkJX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKDB4NTAyLCBoYXJkd2FyZV9pbnRlcnJ1cHQsCi0JCQkJCSAgICBFWENfSFYsIFNPRlRFTl9URVNUX0hWKQotCQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfSFYsIDB4NTAyKQotCUZUUl9TRUNUSU9OX0VMU0UKLQkJX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKDB4NTAwLCBoYXJkd2FyZV9pbnRlcnJ1cHQsCi0JCQkJCSAgICBFWENfU1RELCBTT0ZURU5fVEVTVF9QUikKLQkJS1ZNX0hBTkRMRVIoUEFDQV9FWEdFTiwgRVhDX1NURCwgMHg1MDApCi0JQUxUX0ZUUl9TRUNUSU9OX0VORF9JRlNFVChDUFVfRlRSX0hWTU9ERSB8IENQVV9GVFJfQVJDSF8yMDYpCi0KLQlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHg2MDAsIGFsaWdubWVudCkKLQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfU1RELCAweDYwMCkKLQotCVNURF9FWENFUFRJT05fUFNFUklFUygweDcwMCwgcHJvZ3JhbV9jaGVjaykKLQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfU1RELCAweDcwMCkKLQotCVNURF9FWENFUFRJT05fUFNFUklFUygweDgwMCwgZnBfdW5hdmFpbGFibGUpCi0JS1ZNX0hBTkRMRVIoUEFDQV9FWEdFTiwgRVhDX1NURCwgMHg4MDApCi0KLQkuID0gMHg5MDAKLQkuZ2xvYmwgZGVjcmVtZW50ZXJfcFNlcmllcwotZGVjcmVtZW50ZXJfcFNlcmllczoKLQlfTUFTS0FCTEVfRVhDRVBUSU9OX1BTRVJJRVMoMHg5MDAsIGRlY3JlbWVudGVyLCBFWENfU1RELCBTT0ZURU5fVEVTVF9QUikKLQotCVNURF9FWENFUFRJT05fSFYoMHg5ODAsIDB4OTgyLCBoZGVjcmVtZW50ZXIpCi0KLQlNQVNLQUJMRV9FWENFUFRJT05fUFNFUklFUygweGEwMCwgMHhhMDAsIGRvb3JiZWxsX3N1cGVyKQotCUtWTV9IQU5ETEVSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4YTAwKQotCi0JU1REX0VYQ0VQVElPTl9QU0VSSUVTKDB4YjAwLCB0cmFwXzBiKQotCUtWTV9IQU5ETEVSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4YjAwKQotCi0JLiA9IDB4YzAwCi0JLmdsb2JsCXN5c3RlbV9jYWxsX3BTZXJpZXMKLXN5c3RlbV9jYWxsX3BTZXJpZXM6Ci0JIC8qCi0JICAqIElmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hBTkRMRVIgaXMgc2V0LCBzYXZlIHRoZSBQUFIgKG9uIHN5c3RlbXMKLQkgICogdGhhdCBzdXBwb3J0IGl0KSBiZWZvcmUgY2hhbmdpbmcgdG8gSE1UX01FRElVTS4gVGhhdCBhbGxvd3MgdGhlIEtWTQotCSAgKiBjb2RlIHRvIHNhdmUgdGhhdCB2YWx1ZSBpbnRvIHRoZSBndWVzdCBzdGF0ZSAoaXQgaXMgdGhlIGd1ZXN0J3MgUFBSCi0JICAqIHZhbHVlKS4gT3RoZXJ3aXNlIGp1c3QgY2hhbmdlIHRvIEhNVF9NRURJVU0gYXMgdXNlcnNwYWNlIGhhcwotCSAgKiBhbHJlYWR5IHNhdmVkIHRoZSBQUFIuCi0JICAqLwotI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hBTkRMRVIKLQlTRVRfU0NSQVRDSDAocjEzKQotCUdFVF9QQUNBKHIxMykKLQlzdGQJcjksUEFDQV9FWEdFTitFWF9SOShyMTMpCi0JT1BUX0dFVF9TUFIocjksIFNQUk5fUFBSLCBDUFVfRlRSX0hBU19QUFIpOwotCUhNVF9NRURJVU07Ci0Jc3RkCXIxMCxQQUNBX0VYR0VOK0VYX1IxMChyMTMpCi0JT1BUX1NBVkVfUkVHX1RPX1BBQ0EoUEFDQV9FWEdFTitFWF9QUFIsIHI5LCBDUFVfRlRSX0hBU19QUFIpOwotCW1mY3IJcjkKLQlLVk1URVNUKDB4YzAwKQotCUdFVF9TQ1JBVENIMChyMTMpCi0jZWxzZQotCUhNVF9NRURJVU07Ci0jZW5kaWYKLQlTWVNDQUxMX1BTRVJJRVNfMQotCVNZU0NBTExfUFNFUklFU18yX1JGSUQKLQlTWVNDQUxMX1BTRVJJRVNfMwotCUtWTV9IQU5ETEVSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4YzAwKQotCi0JU1REX0VYQ0VQVElPTl9QU0VSSUVTKDB4ZDAwLCBzaW5nbGVfc3RlcCkKLQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfU1RELCAweGQwMCkKLQotCS8qIEF0IDB4ZT8/PyB3ZSBoYXZlIGEgYnVuY2ggb2YgaHlwZXJ2aXNvciBleGNlcHRpb25zLCB3ZSBicmFuY2gKLQkgKiBvdXQgb2YgbGluZSB0byBoYW5kbGUgdGhlbQotCSAqLwotCS4gPSAweGUwMAotaHZfZGF0YV9zdG9yYWdlX3RyYW1wb2xpbmU6Ci0JU0VUX1NDUkFUQ0gwKHIxMykKLQlFWENFUFRJT05fUFJPTE9HXzAoUEFDQV9FWEdFTikKLQliCWhfZGF0YV9zdG9yYWdlX2h2Ci0KLQkuID0gMHhlMjAKLWh2X2luc3RyX3N0b3JhZ2VfdHJhbXBvbGluZToKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYR0VOKQotCWIJaF9pbnN0cl9zdG9yYWdlX2h2Ci0KLQkuID0gMHhlNDAKLWVtdWxhdGlvbl9hc3Npc3RfdHJhbXBvbGluZToKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYR0VOKQotCWIJZW11bGF0aW9uX2Fzc2lzdF9odgotCi0JLiA9IDB4ZTYwCi1odl9leGNlcHRpb25fdHJhbXBvbGluZToKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYR0VOKQotCWIJaG1pX2V4Y2VwdGlvbl9lYXJseQotCi0JLiA9IDB4ZTgwCi1odl9kb29yYmVsbF90cmFtcG9saW5lOgotCVNFVF9TQ1JBVENIMChyMTMpCi0JRVhDRVBUSU9OX1BST0xPR18wKFBBQ0FfRVhHRU4pCi0JYgloX2Rvb3JiZWxsX2h2Ci0KLQkuID0gMHhlYTAKLWh2X3ZpcnRfaXJxX3RyYW1wb2xpbmU6Ci0JU0VUX1NDUkFUQ0gwKHIxMykKLQlFWENFUFRJT05fUFJPTE9HXzAoUEFDQV9FWEdFTikKLQliCWhfdmlydF9pcnFfaHYKLQotCS8qIFdlIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSBBbHRpdmVjIHVuYXZhaWxhYmxlIGV4Y2VwdGlvbgotCSAqIGhlcmUgd2hpY2ggaXMgYXQgMHhmMjAsIHRodXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUKLQkgKiBwcm9sb2cgY29kZSBvZiB0aGUgUGVyZm9ybWFuY2VNb25pdG9yIG9uZS4gQSBsaXR0bGUKLQkgKiB0cmlja2VyeSBpcyB0aHVzIG5lY2Vzc2FyeQotCSAqLwotCS4gPSAweGYwMAotcGVyZm9ybWFuY2VfbW9uaXRvcl9wc2VyaWVzX3RyYW1wb2xpbmU6Ci0JU0VUX1NDUkFUQ0gwKHIxMykKLQlFWENFUFRJT05fUFJPTE9HXzAoUEFDQV9FWEdFTikKLQliCXBlcmZvcm1hbmNlX21vbml0b3JfcFNlcmllcwotCi0JLiA9IDB4ZjIwCi1hbHRpdmVjX3VuYXZhaWxhYmxlX3BzZXJpZXNfdHJhbXBvbGluZToKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYR0VOKQotCWIJYWx0aXZlY191bmF2YWlsYWJsZV9wU2VyaWVzCi0KLQkuID0gMHhmNDAKLXZzeF91bmF2YWlsYWJsZV9wc2VyaWVzX3RyYW1wb2xpbmU6Ci0JU0VUX1NDUkFUQ0gwKHIxMykKLQlFWENFUFRJT05fUFJPTE9HXzAoUEFDQV9FWEdFTikKLQliCXZzeF91bmF2YWlsYWJsZV9wU2VyaWVzCi0KLQkuID0gMHhmNjAKLWZhY2lsaXR5X3VuYXZhaWxhYmxlX3RyYW1wb2xpbmU6Ci0JU0VUX1NDUkFUQ0gwKHIxMykKLQlFWENFUFRJT05fUFJPTE9HXzAoUEFDQV9FWEdFTikKLQliCWZhY2lsaXR5X3VuYXZhaWxhYmxlX3BTZXJpZXMKLQotCS4gPSAweGY4MAotaHZfZmFjaWxpdHlfdW5hdmFpbGFibGVfdHJhbXBvbGluZToKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYR0VOKQotCWIJZmFjaWxpdHlfdW5hdmFpbGFibGVfaHYKLQotI2lmZGVmIENPTkZJR19DQkVfUkFTCi0JU1REX0VYQ0VQVElPTl9IVigweDEyMDAsIDB4MTIwMiwgY2JlX3N5c3RlbV9lcnJvcikKLQlLVk1fSEFORExFUl9TS0lQKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHgxMjAyKQotI2VuZGlmIC8qIENPTkZJR19DQkVfUkFTICovCi0KLQlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHgxMzAwLCBpbnN0cnVjdGlvbl9icmVha3BvaW50KQotCUtWTV9IQU5ETEVSX1NLSVAoUEFDQV9FWEdFTiwgRVhDX1NURCwgMHgxMzAwKQotCi0JLiA9IDB4MTUwMAotCS5nbG9iYWwgZGVub3JtX2V4Y2VwdGlvbl9odgotZGVub3JtX2V4Y2VwdGlvbl9odjoKLQltdHNwcglTUFJOX1NQUkdfSFNDUkFUQ0gwLHIxMwotCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYR0VOKQotCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYR0VOLCBOT1RFU1QsIDB4MTUwMCkKLQotI2lmZGVmIENPTkZJR19QUENfREVOT1JNQUxJU0FUSU9OCi0JbWZzcHIJcjEwLFNQUk5fSFNSUjEKLQltZnNwcglyMTEsU1BSTl9IU1JSMAkJLyogc2F2ZSBIU1JSMCAqLwotCWFuZGlzLglyMTAscjEwLChIU1JSMV9ERU5PUk0pQGggLyogZGVub3JtPyAqLwotCWFkZGkJcjExLHIxMSwtNAkJLyogSFNSUjAgaXMgbmV4dCBpbnN0cnVjdGlvbiAqLwotCWJuZSsJZGVub3JtX2Fzc2lzdAotI2VuZGlmCi0KLQlLVk1URVNUKDB4MTUwMCkKLQlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMShkZW5vcm1fY29tbW9uLCBFWENfSFYpCi0JS1ZNX0hBTkRMRVJfU0tJUChQQUNBX0VYR0VOLCBFWENfU1RELCAweDE1MDApCi0KLSNpZmRlZiBDT05GSUdfQ0JFX1JBUwotCVNURF9FWENFUFRJT05fSFYoMHgxNjAwLCAweDE2MDIsIGNiZV9tYWludGVuYW5jZSkKLQlLVk1fSEFORExFUl9TS0lQKFBBQ0FfRVhHRU4sIEVYQ19IViwgMHgxNjAyKQotI2VuZGlmIC8qIENPTkZJR19DQkVfUkFTICovCi0KLQlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHgxNzAwLCBhbHRpdmVjX2Fzc2lzdCkKLQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfU1RELCAweDE3MDApCi0KLSNpZmRlZiBDT05GSUdfQ0JFX1JBUwotCVNURF9FWENFUFRJT05fSFYoMHgxODAwLCAweDE4MDIsIGNiZV90aGVybWFsKQotCUtWTV9IQU5ETEVSX1NLSVAoUEFDQV9FWEdFTiwgRVhDX0hWLCAweDE4MDIpCi0jZWxzZQotCS4gPSAweDE4MDAKLSNlbmRpZiAvKiBDT05GSUdfQ0JFX1JBUyAqLwotCi0KLS8qKiogT3V0IG9mIGxpbmUgaW50ZXJydXB0cyBzdXBwb3J0ICoqKi8KLQotCS5hbGlnbgk3Ci0JLyogbW92ZWQgZnJvbSAweDIwMCAqLwotbWFjaGluZV9jaGVja19wb3dlcm52X2Vhcmx5OgorRVhDX1JFQUxfRU5EKG1hY2hpbmVfY2hlY2ssIDB4MjAwLCAweDMwMCkKK0VYQ19WSVJUX05PTkUoMHg0MjAwLCAweDQzMDApCitUUkFNUF9SRUFMX0JFR0lOKG1hY2hpbmVfY2hlY2tfcG93ZXJudl9lYXJseSkKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJRVhDRVBUSU9OX1BST0xPR18xKFBBQ0FfRVhNQywgTk9URVNULCAweDIwMCkKIAkvKgpAQCAtNDU3LDcgKzIyNiw2IEBACiAJbWZtc3IJcjExCQkJLyogZ2V0IE1TUiB2YWx1ZSAqLwogCW9yaQlyMTEscjExLE1TUl9NRQkJLyogdHVybiBvbiBNRSBiaXQgKi8KIAlvcmkJcjExLHIxMSxNU1JfUkkJCS8qIHR1cm4gb24gUkkgYml0ICovCi0JbGQJcjEyLFBBQ0FLQkFTRShyMTMpCS8qIGdldCBoaWdoIHBhcnQgb2YgJmxhYmVsICovCiAJTE9BRF9IQU5ETEVSKHIxMiwgbWFjaGluZV9jaGVja19oYW5kbGVfZWFybHkpCiAxOgltdHNwcglTUFJOX1NSUjAscjEyCiAJbXRzcHIJU1BSTl9TUlIxLHIxMQpAQCAtNDcwLDcgKzIzOCw2IEBACiAJICovCiAJYWRkaQlyMSxyMSxJTlRfRlJBTUVfU0laRQkvKiBnbyBiYWNrIHRvIHByZXZpb3VzIHN0YWNrIGZyYW1lICovCiAJbGQJcjExLFBBQ0FLTVNSKHIxMykKLQlsZAlyMTIsUEFDQUtCQVNFKHIxMykKIAlMT0FEX0hBTkRMRVIocjEyLCB1bnJlY292ZXJfbWNlKQogCWxpCXIxMCxNU1JfTUUKIAlhbmRjCXIxMSxyMTEscjEwCQkvKiBUdXJuIG9mZiBNU1JfTUUgKi8KQEAgLTQ3OCw1MDUgKzI0NSw0OCBAQAogCWIJLgkvKiBwcmV2ZW50IHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiAqLwogRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfSFZNT0RFKQogCi1tYWNoaW5lX2NoZWNrX3BTZXJpZXM6CitUUkFNUF9SRUFMX0JFR0lOKG1hY2hpbmVfY2hlY2tfcFNlcmllcykKIAkuZ2xvYmwgbWFjaGluZV9jaGVja19md25taQogbWFjaGluZV9jaGVja19md25taToKIAlTRVRfU0NSQVRDSDAocjEzKQkJLyogc2F2ZSByMTMgKi8KIAlFWENFUFRJT05fUFJPTE9HXzAoUEFDQV9FWE1DKQogbWFjaGluZV9jaGVja19wU2VyaWVzXzA6Ci0JRVhDRVBUSU9OX1BST0xPR18xKFBBQ0FfRVhNQywgS1ZNVEVTVCwgMHgyMDApCi0JRVhDRVBUSU9OX1BST0xPR19QU0VSSUVTXzEobWFjaGluZV9jaGVja19jb21tb24sIEVYQ19TVEQpCi0JS1ZNX0hBTkRMRVJfU0tJUChQQUNBX0VYTUMsIEVYQ19TVEQsIDB4MjAwKQotCUtWTV9IQU5ETEVSX1NLSVAoUEFDQV9FWEdFTiwgRVhDX1NURCwgMHgzMDApCi0JS1ZNX0hBTkRMRVJfU0tJUChQQUNBX0VYU0xCLCBFWENfU1RELCAweDM4MCkKLQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfU1RELCAweDQwMCkKLQlLVk1fSEFORExFUihQQUNBX0VYU0xCLCBFWENfU1RELCAweDQ4MCkKLQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfU1RELCAweDkwMCkKLQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfSFYsIDB4OTgyKQotCi0jaWZkZWYgQ09ORklHX1BQQ19ERU5PUk1BTElTQVRJT04KLWRlbm9ybV9hc3Npc3Q6Ci1CRUdJTl9GVFJfU0VDVElPTgotLyoKLSAqIFRvIGRlbm9ybWFsaXNlIHdlIG5lZWQgdG8gbW92ZSBhIGNvcHkgb2YgdGhlIHJlZ2lzdGVyIHRvIGl0c2VsZi4KLSAqIEZvciBQT1dFUjYgZG8gdGhhdCBoZXJlIGZvciBhbGwgRlAgcmVncy4KLSAqLwotCW1mbXNyCXIxMAotCW9yaQlyMTAscjEwLChNU1JfRlB8TVNSX0ZFMHxNU1JfRkUxKQotCXhvcmkJcjEwLHIxMCwoTVNSX0ZFMHxNU1JfRkUxKQotCW10bXNyZAlyMTAKLQlzeW5jCi0KLSNkZWZpbmUgRk1SMihuKSAgZm1yIChuKSwgKG4pIDsgZm1yIG4rMSwgbisxCi0jZGVmaW5lIEZNUjQobikgIEZNUjIobikgOyBGTVIyKG4rMikKLSNkZWZpbmUgRk1SOChuKSAgRk1SNChuKSA7IEZNUjQobis0KQotI2RlZmluZSBGTVIxNihuKSBGTVI4KG4pIDsgRk1SOChuKzgpCi0jZGVmaW5lIEZNUjMyKG4pIEZNUjE2KG4pIDsgRk1SMTYobisxNikKLQlGTVIzMigwKQotCi1GVFJfU0VDVElPTl9FTFNFCi0vKgotICogVG8gZGVub3JtYWxpc2Ugd2UgbmVlZCB0byBtb3ZlIGEgY29weSBvZiB0aGUgcmVnaXN0ZXIgdG8gaXRzZWxmLgotICogRm9yIFBPV0VSNyBkbyB0aGF0IGhlcmUgZm9yIHRoZSBmaXJzdCAzMiBWU1ggcmVnaXN0ZXJzIG9ubHkuCi0gKi8KLQltZm1zcglyMTAKLQlvcmlzCXIxMCxyMTAsTVNSX1ZTWEBoCi0JbXRtc3JkCXIxMAotCXN5bmMKLQotI2RlZmluZSBYVkNQU0dORFAyKG4pIFhWQ1BTR05EUChuLG4sbikgOyBYVkNQU0dORFAobisxLG4rMSxuKzEpCi0jZGVmaW5lIFhWQ1BTR05EUDQobikgWFZDUFNHTkRQMihuKSA7IFhWQ1BTR05EUDIobisyKQotI2RlZmluZSBYVkNQU0dORFA4KG4pIFhWQ1BTR05EUDQobikgOyBYVkNQU0dORFA0KG4rNCkKLSNkZWZpbmUgWFZDUFNHTkRQMTYobikgWFZDUFNHTkRQOChuKSA7IFhWQ1BTR05EUDgobis4KQotI2RlZmluZSBYVkNQU0dORFAzMihuKSBYVkNQU0dORFAxNihuKSA7IFhWQ1BTR05EUDE2KG4rMTYpCi0JWFZDUFNHTkRQMzIoMCkKLQotQUxUX0ZUUl9TRUNUSU9OX0VORF9JRkNMUihDUFVfRlRSX0FSQ0hfMjA2KQotCi1CRUdJTl9GVFJfU0VDVElPTgotCWIJZGVub3JtX2RvbmUKLUVORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX0FSQ0hfMjA3UykKLS8qCi0gKiBUbyBkZW5vcm1hbGlzZSB3ZSBuZWVkIHRvIG1vdmUgYSBjb3B5IG9mIHRoZSByZWdpc3RlciB0byBpdHNlbGYuCi0gKiBGb3IgUE9XRVI4IHdlIG5lZWQgdG8gZG8gdGhhdCBmb3IgYWxsIDY0IFZTWCByZWdpc3RlcnMKLSAqLwotCVhWQ1BTR05EUDMyKDMyKQotZGVub3JtX2RvbmU6Ci0JbXRzcHIJU1BSTl9IU1JSMCxyMTEKLQltdGNyZgkweDgwLHI5Ci0JbGQJcjksUEFDQV9FWEdFTitFWF9SOShyMTMpCi0JUkVTVE9SRV9QUFJfUEFDQShQQUNBX0VYR0VOLCByMTApCi1CRUdJTl9GVFJfU0VDVElPTgotCWxkCXIxMCxQQUNBX0VYR0VOK0VYX0NGQVIocjEzKQotCW10c3ByCVNQUk5fQ0ZBUixyMTAKLUVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX0NGQVIpCi0JbGQJcjEwLFBBQ0FfRVhHRU4rRVhfUjEwKHIxMykKLQlsZAlyMTEsUEFDQV9FWEdFTitFWF9SMTEocjEzKQotCWxkCXIxMixQQUNBX0VYR0VOK0VYX1IxMihyMTMpCi0JbGQJcjEzLFBBQ0FfRVhHRU4rRVhfUjEzKHIxMykKLQlIUkZJRAotCWIJLgotI2VuZGlmCi0KLQkuYWxpZ24JNwotCS8qIG1vdmVkIGZyb20gMHhlMDAgKi8KLQlTVERfRVhDRVBUSU9OX0hWX09PTCgweGUwMiwgaF9kYXRhX3N0b3JhZ2UpCi0JS1ZNX0hBTkRMRVJfU0tJUChQQUNBX0VYR0VOLCBFWENfSFYsIDB4ZTAyKQotCVNURF9FWENFUFRJT05fSFZfT09MKDB4ZTIyLCBoX2luc3RyX3N0b3JhZ2UpCi0JS1ZNX0hBTkRMRVIoUEFDQV9FWEdFTiwgRVhDX0hWLCAweGUyMikKLQlTVERfRVhDRVBUSU9OX0hWX09PTCgweGU0MiwgZW11bGF0aW9uX2Fzc2lzdCkKLQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfSFYsIDB4ZTQyKQotCU1BU0tBQkxFX0VYQ0VQVElPTl9IVl9PT0woMHhlNjIsIGhtaV9leGNlcHRpb24pCi0JS1ZNX0hBTkRMRVIoUEFDQV9FWEdFTiwgRVhDX0hWLCAweGU2MikKLQotCU1BU0tBQkxFX0VYQ0VQVElPTl9IVl9PT0woMHhlODIsIGhfZG9vcmJlbGwpCi0JS1ZNX0hBTkRMRVIoUEFDQV9FWEdFTiwgRVhDX0hWLCAweGU4MikKLQotCU1BU0tBQkxFX0VYQ0VQVElPTl9IVl9PT0woMHhlYTIsIGhfdmlydF9pcnEpCi0JS1ZNX0hBTkRMRVIoUEFDQV9FWEdFTiwgRVhDX0hWLCAweGVhMikKLQotCS8qIG1vdmVkIGZyb20gMHhmMDAgKi8KLQlTVERfRVhDRVBUSU9OX1BTRVJJRVNfT09MKDB4ZjAwLCBwZXJmb3JtYW5jZV9tb25pdG9yKQotCUtWTV9IQU5ETEVSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4ZjAwKQotCVNURF9FWENFUFRJT05fUFNFUklFU19PT0woMHhmMjAsIGFsdGl2ZWNfdW5hdmFpbGFibGUpCi0JS1ZNX0hBTkRMRVIoUEFDQV9FWEdFTiwgRVhDX1NURCwgMHhmMjApCi0JU1REX0VYQ0VQVElPTl9QU0VSSUVTX09PTCgweGY0MCwgdnN4X3VuYXZhaWxhYmxlKQotCUtWTV9IQU5ETEVSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4ZjQwKQotCVNURF9FWENFUFRJT05fUFNFUklFU19PT0woMHhmNjAsIGZhY2lsaXR5X3VuYXZhaWxhYmxlKQotCUtWTV9IQU5ETEVSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4ZjYwKQotCVNURF9FWENFUFRJT05fSFZfT09MKDB4ZjgyLCBmYWNpbGl0eV91bmF2YWlsYWJsZSkKLQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfSFYsIDB4ZjgyKQotCi0vKgotICogQW4gaW50ZXJydXB0IGNhbWUgaW4gd2hpbGUgc29mdC1kaXNhYmxlZC4gV2Ugc2V0IHBhY2EtPmlycV9oYXBwZW5lZCwgdGhlbjoKLSAqIC0gSWYgaXQgd2FzIGEgZGVjcmVtZW50ZXIgaW50ZXJydXB0LCB3ZSBidW1wIHRoZSBkZWMgdG8gbWF4IGFuZCBhbmQgcmV0dXJuLgotICogLSBJZiBpdCB3YXMgYSBkb29yYmVsbCB3ZSByZXR1cm4gaW1tZWRpYXRlbHkgc2luY2UgZG9vcmJlbGxzIGFyZSBlZGdlCi0gKiAgIHRyaWdnZXJlZCBhbmQgd29uJ3QgYXV0b21hdGljYWxseSByZWZpcmUuCi0gKiAtIElmIGl0IHdhcyBhIEhNSSB3ZSByZXR1cm4gaW1tZWRpYXRlbHkgc2luY2Ugd2UgaGFuZGxlZCBpdCBpbiByZWFsbW9kZQotICogICBhbmQgaXQgd29uJ3QgcmVmaXJlLgotICogLSBlbHNlIHdlIGhhcmQgZGlzYWJsZSBhbmQgcmV0dXJuLgotICogVGhpcyBpcyBjYWxsZWQgd2l0aCByMTAgY29udGFpbmluZyB0aGUgdmFsdWUgdG8gT1IgdG8gdGhlIHBhY2EgZmllbGQuCi0gKi8KLSNkZWZpbmUgTUFTS0VEX0lOVEVSUlVQVChfSCkJCQkJXAotbWFza2VkXyMjX0gjI2ludGVycnVwdDoJCQkJCVwKLQlzdGQJcjExLFBBQ0FfRVhHRU4rRVhfUjExKHIxMyk7CQlcCi0JbGJ6CXIxMSxQQUNBSVJRSEFQUEVORUQocjEzKTsJCVwKLQlvcglyMTEscjExLHIxMDsJCQkJXAotCXN0YglyMTEsUEFDQUlSUUhBUFBFTkVEKHIxMyk7CQlcCi0JY21wd2kJcjEwLFBBQ0FfSVJRX0RFQzsJCQlcCi0JYm5lCTFmOwkJCQkJXAotCWxpcwlyMTAsMHg3ZmZmOwkJCQlcCi0Jb3JpCXIxMCxyMTAsMHhmZmZmOwkJCQlcCi0JbXRzcHIJU1BSTl9ERUMscjEwOwkJCQlcCi0JYgkyZjsJCQkJCVwKLTE6CWNtcHdpCXIxMCxQQUNBX0lSUV9EQkVMTDsJCQlcCi0JYmVxCTJmOwkJCQkJXAotCWNtcHdpCXIxMCxQQUNBX0lSUV9ITUk7CQkJXAotCWJlcQkyZjsJCQkJCVwKLQltZnNwcglyMTAsU1BSTl8jI19IIyNTUlIxOwkJCVwKLQlybGRpY2wJcjEwLHIxMCw0OCwxOyAvKiBjbGVhciBNU1JfRUUgKi8JXAotCXJvdGxkaQlyMTAscjEwLDE2OwkJCQlcCi0JbXRzcHIJU1BSTl8jI19IIyNTUlIxLHIxMDsJCQlcCi0yOgltdGNyZgkweDgwLHI5OwkJCQlcCi0JbGQJcjksUEFDQV9FWEdFTitFWF9SOShyMTMpOwkJXAotCWxkCXIxMCxQQUNBX0VYR0VOK0VYX1IxMChyMTMpOwkJXAotCWxkCXIxMSxQQUNBX0VYR0VOK0VYX1IxMShyMTMpOwkJXAotCUdFVF9TQ1JBVENIMChyMTMpOwkJCQlcCi0JIyNfSCMjcmZpZDsJCQkJCVwKLQliCS4KLQkKLQlNQVNLRURfSU5URVJSVVBUKCkKLQlNQVNLRURfSU5URVJSVVBUKEgpCi0KLS8qCi0gKiBDYWxsZWQgZnJvbSBhcmNoX2xvY2FsX2lycV9lbmFibGUgd2hlbiBhbiBpbnRlcnJ1cHQgbmVlZHMKLSAqIHRvIGJlIHJlc2VudC4gcjMgY29udGFpbnMgMHg1MDAsIDB4OTAwLCAweGEwMCBvciAweGU4MCB0byBpbmRpY2F0ZQotICogd2hpY2gga2luZCBvZiBpbnRlcnJ1cHQuIE1TUjpFRSBpcyBhbHJlYWR5IG9mZi4gV2UgZ2VuZXJhdGUgYQotICogc3RhY2tmcmFtZSBsaWtlIGlmIGEgcmVhbCBpbnRlcnJ1cHQgaGFkIGhhcHBlbmVkLgotICoKLSAqIE5vdGU6IFdoaWxlIE1TUjpFRSBpcyBvZmYsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgX01TUgotICogaW4gdGhlIGdlbmVyYXRlZCBmcmFtZSBoYXMgRUUgc2V0IHRvIDEgb3IgdGhlIGV4Y2VwdGlvbgotICogaGFuZGxlciB3aWxsIG5vdCBwcm9wZXJseSByZS1lbmFibGUgdGhlbS4KLSAqLwotX0dMT0JBTChfX3JlcGxheV9pbnRlcnJ1cHQpCi0JLyogV2UgYXJlIGdvaW5nIHRvIGp1bXAgdG8gdGhlIGV4Y2VwdGlvbiBjb21tb24gY29kZSB3aGljaAotCSAqIHdpbGwgcmV0cmlldmUgdmFyaW91cyByZWdpc3RlciB2YWx1ZXMgZnJvbSB0aGUgUEFDQSB3aGljaAotCSAqIHdlIGRvbid0IGdpdmUgYSBkYW1uIGFib3V0LCBzbyB3ZSBkb24ndCBib3RoZXIgc3RvcmluZyB0aGVtLgotCSAqLwotCW1mbXNyCXIxMgotCW1mbHIJcjExCi0JbWZjcglyOQotCW9yaQlyMTIscjEyLE1TUl9FRQotCWNtcHdpCXIzLDB4OTAwCi0JYmVxCWRlY3JlbWVudGVyX2NvbW1vbgotCWNtcHdpCXIzLDB4NTAwCi0JYmVxCWhhcmR3YXJlX2ludGVycnVwdF9jb21tb24KLUJFR0lOX0ZUUl9TRUNUSU9OCi0JY21wd2kJcjMsMHhlODAKLQliZXEJaF9kb29yYmVsbF9jb21tb24KLQljbXB3aQlyMywweGVhMAotCWJlcQloX3ZpcnRfaXJxX2NvbW1vbgotCWNtcHdpCXIzLDB4ZTYwCi0JYmVxCWhtaV9leGNlcHRpb25fY29tbW9uCi1GVFJfU0VDVElPTl9FTFNFCi0JY21wd2kJcjMsMHhhMDAKLQliZXEJZG9vcmJlbGxfc3VwZXJfY29tbW9uCi1BTFRfRlRSX1NFQ1RJT05fRU5EX0lGU0VUKENQVV9GVFJfSFZNT0RFKQotCWJscgotCi0jaWZkZWYgQ09ORklHX1BQQ19QU0VSSUVTCi0vKgotICogVmVjdG9ycyBmb3IgdGhlIEZXTk1JIG9wdGlvbi4gIFNoYXJlIGNvbW1vbiBjb2RlLgotICovCi0JLmdsb2JsIHN5c3RlbV9yZXNldF9md25taQotICAgICAgLmFsaWduIDcKLXN5c3RlbV9yZXNldF9md25taToKLQlTRVRfU0NSQVRDSDAocjEzKQkJLyogc2F2ZSByMTMgKi8KLQlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWEdFTiwgc3lzdGVtX3Jlc2V0X2NvbW1vbiwgRVhDX1NURCwKLQkJCQkgTk9URVNULCAweDEwMCkKLQotI2VuZGlmIC8qIENPTkZJR19QUENfUFNFUklFUyAqLwotCi0jaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSEFORExFUgota3ZtcHBjX3NraXBfaW50ZXJydXB0OgorCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYTUMsIEtWTVRFU1RfUFIsIDB4MjAwKQogCS8qCi0JICogSGVyZSBhbGwgR1BScyBhcmUgdW5jaGFuZ2VkIGZyb20gd2hlbiB0aGUgaW50ZXJydXB0IGhhcHBlbmVkCi0JICogZXhjZXB0IGZvciByMTMsIHdoaWNoIGlzIHNhdmVkIGluIFNQUkdfU0NSQVRDSDAuCisJICogVGhlIGZvbGxvd2luZyBpcyBlc3NlbnRpYWxseSBFWENFUFRJT05fUFJPTE9HX1BTRVJJRVNfMSB3aXRoIHRoZQorCSAqIGRpZmZlcmVuY2UgdGhhdCBNU1JfUkkgaXMgbm90IGVuYWJsZWQsIGJlY2F1c2UgUEFDQV9FWE1DIGlzIGJlaW5nCisJICogdXNlZCwgc28gbmVzdGVkIG1hY2hpbmUgY2hlY2sgY29ycnVwdHMgaXQuIG1hY2hpbmVfY2hlY2tfY29tbW9uCisJICogZW5hYmxlcyBNU1JfUkkuCiAJICovCi0JbWZzcHIJcjEzLCBTUFJOX1NSUjAKLQlhZGRpCXIxMywgcjEzLCA0Ci0JbXRzcHIJU1BSTl9TUlIwLCByMTMKLQlHRVRfU0NSQVRDSDAocjEzKQorCWxkCXIxMCxQQUNBS01TUihyMTMpCisJeG9yaQlyMTAscjEwLE1TUl9SSQorCW1mc3ByCXIxMSxTUFJOX1NSUjAKKwlMT0FEX0hBTkRMRVIocjEyLCBtYWNoaW5lX2NoZWNrX2NvbW1vbikKKwltdHNwcglTUFJOX1NSUjAscjEyCisJbWZzcHIJcjEyLFNQUk5fU1JSMQorCW10c3ByCVNQUk5fU1JSMSxyMTAKIAlyZmlkCi0JYgkuCisJYgkuCS8qIHByZXZlbnQgc3BlY3VsYXRpdmUgZXhlY3V0aW9uICovCiAKLWt2bXBwY19za2lwX0hpbnRlcnJ1cHQ6Ci0JLyoKLQkgKiBIZXJlIGFsbCBHUFJzIGFyZSB1bmNoYW5nZWQgZnJvbSB3aGVuIHRoZSBpbnRlcnJ1cHQgaGFwcGVuZWQKLQkgKiBleGNlcHQgZm9yIHIxMywgd2hpY2ggaXMgc2F2ZWQgaW4gU1BSR19TQ1JBVENIMC4KLQkgKi8KLQltZnNwcglyMTMsIFNQUk5fSFNSUjAKLQlhZGRpCXIxMywgcjEzLCA0Ci0JbXRzcHIJU1BSTl9IU1JSMCwgcjEzCi0JR0VUX1NDUkFUQ0gwKHIxMykKLQlocmZpZAotCWIJLgotI2VuZGlmCitUUkFNUF9LVk1fU0tJUChQQUNBX0VYTUMsIDB4MjAwKQogCi0vKgotICogRW5zdXJlIHRoYXQgYW55IGhhbmRsZXJzIHRoYXQgZ2V0IGludm9rZWQgZnJvbSB0aGUgZXhjZXB0aW9uIHByb2xvZ3MKLSAqIGFib3ZlIGFyZSBiZWxvdyB0aGUgZmlyc3QgNjRLQiAoMHgxMDAwMCkgb2YgdGhlIGtlcm5lbCBpbWFnZSBiZWNhdXNlCi0gKiB0aGUgcHJvbG9ncyBhc3NlbWJsZSB0aGUgYWRkcmVzc2VzIG9mIHRoZXNlIGhhbmRsZXJzIHVzaW5nIHRoZQotICogTE9BRF9IQU5ETEVSIG1hY3JvLCB3aGljaCB1c2VzIGFuIG9yaSBpbnN0cnVjdGlvbi4KLSAqLwotCi0vKioqIENvbW1vbiBpbnRlcnJ1cHQgaGFuZGxlcnMgKioqLwotCi0JU1REX0VYQ0VQVElPTl9DT01NT04oMHgxMDAsIHN5c3RlbV9yZXNldCwgc3lzdGVtX3Jlc2V0X2V4Y2VwdGlvbikKLQotCVNURF9FWENFUFRJT05fQ09NTU9OX0FTWU5DKDB4NTAwLCBoYXJkd2FyZV9pbnRlcnJ1cHQsIGRvX0lSUSkKLQlTVERfRVhDRVBUSU9OX0NPTU1PTl9BU1lOQygweDkwMCwgZGVjcmVtZW50ZXIsIHRpbWVyX2ludGVycnVwdCkKLQlTVERfRVhDRVBUSU9OX0NPTU1PTigweDk4MCwgaGRlY3JlbWVudGVyLCBoZGVjX2ludGVycnVwdCkKLSNpZmRlZiBDT05GSUdfUFBDX0RPT1JCRUxMCi0JU1REX0VYQ0VQVElPTl9DT01NT05fQVNZTkMoMHhhMDAsIGRvb3JiZWxsX3N1cGVyLCBkb29yYmVsbF9leGNlcHRpb24pCi0jZWxzZQotCVNURF9FWENFUFRJT05fQ09NTU9OX0FTWU5DKDB4YTAwLCBkb29yYmVsbF9zdXBlciwgdW5rbm93bl9leGNlcHRpb24pCi0jZW5kaWYKLQlTVERfRVhDRVBUSU9OX0NPTU1PTigweGIwMCwgdHJhcF8wYiwgdW5rbm93bl9leGNlcHRpb24pCi0JU1REX0VYQ0VQVElPTl9DT01NT04oMHhkMDAsIHNpbmdsZV9zdGVwLCBzaW5nbGVfc3RlcF9leGNlcHRpb24pCi0JU1REX0VYQ0VQVElPTl9DT01NT04oMHhlMDAsIHRyYXBfMGUsIHVua25vd25fZXhjZXB0aW9uKQotCVNURF9FWENFUFRJT05fQ09NTU9OKDB4ZTQwLCBlbXVsYXRpb25fYXNzaXN0LCBlbXVsYXRpb25fYXNzaXN0X2ludGVycnVwdCkKLQlTVERfRVhDRVBUSU9OX0NPTU1PTl9BU1lOQygweGU2MCwgaG1pX2V4Y2VwdGlvbiwgaGFuZGxlX2htaV9leGNlcHRpb24pCi0jaWZkZWYgQ09ORklHX1BQQ19ET09SQkVMTAotCVNURF9FWENFUFRJT05fQ09NTU9OX0FTWU5DKDB4ZTgwLCBoX2Rvb3JiZWxsLCBkb29yYmVsbF9leGNlcHRpb24pCi0jZWxzZQotCVNURF9FWENFUFRJT05fQ09NTU9OX0FTWU5DKDB4ZTgwLCBoX2Rvb3JiZWxsLCB1bmtub3duX2V4Y2VwdGlvbikKLSNlbmRpZgotCVNURF9FWENFUFRJT05fQ09NTU9OX0FTWU5DKDB4ZWEwLCBoX3ZpcnRfaXJxLCBkb19JUlEpCi0JU1REX0VYQ0VQVElPTl9DT01NT05fQVNZTkMoMHhmMDAsIHBlcmZvcm1hbmNlX21vbml0b3IsIHBlcmZvcm1hbmNlX21vbml0b3JfZXhjZXB0aW9uKQotCVNURF9FWENFUFRJT05fQ09NTU9OKDB4MTMwMCwgaW5zdHJ1Y3Rpb25fYnJlYWtwb2ludCwgaW5zdHJ1Y3Rpb25fYnJlYWtwb2ludF9leGNlcHRpb24pCi0JU1REX0VYQ0VQVElPTl9DT01NT04oMHgxNTAyLCBkZW5vcm0sIHVua25vd25fZXhjZXB0aW9uKQotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0JU1REX0VYQ0VQVElPTl9DT01NT04oMHgxNzAwLCBhbHRpdmVjX2Fzc2lzdCwgYWx0aXZlY19hc3Npc3RfZXhjZXB0aW9uKQotI2Vsc2UKLQlTVERfRVhDRVBUSU9OX0NPTU1PTigweDE3MDAsIGFsdGl2ZWNfYXNzaXN0LCB1bmtub3duX2V4Y2VwdGlvbikKLSNlbmRpZgotCi0JLyoKLQkgKiBSZWxvY2F0aW9uLW9uIGludGVycnVwdHM6IEEgc3Vic2V0IG9mIHRoZSBpbnRlcnJ1cHRzIGNhbiBiZSBkZWxpdmVyZWQKLQkgKiB3aXRoIElSPTEvRFI9MSwgaWYgQUlMPT0yIGFuZCBNU1IuSFYgd29uJ3QgYmUgY2hhbmdlZCBieSBkZWxpdmVyaW5nCi0JICogaXQuICBBZGRyZXNzZXMgYXJlIHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCBpbnRlcnJ1cHQgYWRkcmVzc2VzLCBidXQKLQkgKiBvZmZzZXQgYnkgMHhjMDAwMDAwMDAwMDA0MDAwLgotCSAqIEl0J3MgaW1wb3NzaWJsZSB0byByZWNlaXZlIGludGVycnVwdHMgYmVsb3cgMHgzMDAgdmlhIHRoaXMgbWVjaGFuaXNtLgotCSAqIEtWTTogTm9uZSBvZiB0aGVzZSB0cmFwcyBhcmUgZnJvbSB0aGUgZ3Vlc3QgOyBhbnl0aGluZyB0aGF0IGVzY2FsYXRlZAotCSAqIHRvIEhWPTEgZnJvbSBIVj0wIGlzIGRlbGl2ZXJlZCB2aWEgcmVhbCBtb2RlIGhhbmRsZXJzLgotCSAqLwotCi0JLyoKLQkgKiBUaGlzIHVzZXMgdGhlIHN0YW5kYXJkIG1hY3JvLCBzaW5jZSB0aGUgb3JpZ2luYWwgMHgzMDAgdmVjdG9yCi0JICogb25seSBoYXMgZXh0cmEgZ3VmZiBmb3IgU1RBQi1iYXNlZCBwcm9jZXNzb3JzIC0tIHdoaWNoIG5ldmVyCi0JICogY29tZSBoZXJlLgotCSAqLwotCVNURF9SRUxPTl9FWENFUFRJT05fUFNFUklFUygweDQzMDAsIDB4MzAwLCBkYXRhX2FjY2VzcykKLQkuID0gMHg0MzgwCi0JLmdsb2JsIGRhdGFfYWNjZXNzX3NsYl9yZWxvbl9wU2VyaWVzCi1kYXRhX2FjY2Vzc19zbGJfcmVsb25fcFNlcmllczoKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYU0xCKQotCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYU0xCLCBOT1RFU1QsIDB4MzgwKQotCXN0ZAlyMyxQQUNBX0VYU0xCK0VYX1IzKHIxMykKLQltZnNwcglyMyxTUFJOX0RBUgotCW1mc3ByCXIxMixTUFJOX1NSUjEKLSNpZm5kZWYgQ09ORklHX1JFTE9DQVRBQkxFCi0JYglzbGJfbWlzc19yZWFsbW9kZQotI2Vsc2UKLQkvKgotCSAqIFdlIGNhbid0IGp1c3QgdXNlIGEgZGlyZWN0IGJyYW5jaCB0byBzbGJfbWlzc19yZWFsbW9kZQotCSAqIGJlY2F1c2UgdGhlIGRpc3RhbmNlIGZyb20gaGVyZSB0byB0aGVyZSBkZXBlbmRzIG9uIHdoZXJlCi0JICogdGhlIGtlcm5lbCBlbmRzIHVwIGJlaW5nIHB1dC4KLQkgKi8KLQltZmN0cglyMTEKLQlsZAlyMTAsUEFDQUtCQVNFKHIxMykKLQlMT0FEX0hBTkRMRVIocjEwLCBzbGJfbWlzc19yZWFsbW9kZSkKLQltdGN0cglyMTAKLQliY3RyCi0jZW5kaWYKLQotCVNURF9SRUxPTl9FWENFUFRJT05fUFNFUklFUygweDQ0MDAsIDB4NDAwLCBpbnN0cnVjdGlvbl9hY2Nlc3MpCi0JLiA9IDB4NDQ4MAotCS5nbG9ibCBpbnN0cnVjdGlvbl9hY2Nlc3Nfc2xiX3JlbG9uX3BTZXJpZXMKLWluc3RydWN0aW9uX2FjY2Vzc19zbGJfcmVsb25fcFNlcmllczoKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYU0xCKQotCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYU0xCLCBOT1RFU1QsIDB4NDgwKQotCXN0ZAlyMyxQQUNBX0VYU0xCK0VYX1IzKHIxMykKLQltZnNwcglyMyxTUFJOX1NSUjAJCS8qIFNSUjAgaXMgZmF1bHRpbmcgYWRkcmVzcyAqLwotCW1mc3ByCXIxMixTUFJOX1NSUjEKLSNpZm5kZWYgQ09ORklHX1JFTE9DQVRBQkxFCi0JYglzbGJfbWlzc19yZWFsbW9kZQotI2Vsc2UKLQltZmN0cglyMTEKLQlsZAlyMTAsUEFDQUtCQVNFKHIxMykKLQlMT0FEX0hBTkRMRVIocjEwLCBzbGJfbWlzc19yZWFsbW9kZSkKLQltdGN0cglyMTAKLQliY3RyCi0jZW5kaWYKLQotCS4gPSAweDQ1MDAKLQkuZ2xvYmwgaGFyZHdhcmVfaW50ZXJydXB0X3JlbG9uX3BTZXJpZXM7Ci0JLmdsb2JsIGhhcmR3YXJlX2ludGVycnVwdF9yZWxvbl9odjsKLWhhcmR3YXJlX2ludGVycnVwdF9yZWxvbl9wU2VyaWVzOgotaGFyZHdhcmVfaW50ZXJydXB0X3JlbG9uX2h2OgotCUJFR0lOX0ZUUl9TRUNUSU9OCi0JCV9NQVNLQUJMRV9SRUxPTl9FWENFUFRJT05fUFNFUklFUygweDUwMiwgaGFyZHdhcmVfaW50ZXJydXB0LCBFWENfSFYsIFNPRlRFTl9URVNUX0hWKQotCUZUUl9TRUNUSU9OX0VMU0UKLQkJX01BU0tBQkxFX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTKDB4NTAwLCBoYXJkd2FyZV9pbnRlcnJ1cHQsIEVYQ19TVEQsIFNPRlRFTl9URVNUX1BSKQotCUFMVF9GVFJfU0VDVElPTl9FTkRfSUZTRVQoQ1BVX0ZUUl9IVk1PREUpCi0JU1REX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTKDB4NDYwMCwgMHg2MDAsIGFsaWdubWVudCkKLQlTVERfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVMoMHg0NzAwLCAweDcwMCwgcHJvZ3JhbV9jaGVjaykKLQlTVERfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVMoMHg0ODAwLCAweDgwMCwgZnBfdW5hdmFpbGFibGUpCi0JTUFTS0FCTEVfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVMoMHg0OTAwLCAweDkwMCwgZGVjcmVtZW50ZXIpCi0JU1REX1JFTE9OX0VYQ0VQVElPTl9IVigweDQ5ODAsIDB4OTgyLCBoZGVjcmVtZW50ZXIpCi0JTUFTS0FCTEVfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVMoMHg0YTAwLCAweGEwMCwgZG9vcmJlbGxfc3VwZXIpCi0JU1REX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTKDB4NGIwMCwgMHhiMDAsIHRyYXBfMGIpCi0KLQkuID0gMHg0YzAwCi0JLmdsb2JsIHN5c3RlbV9jYWxsX3JlbG9uX3BTZXJpZXMKLXN5c3RlbV9jYWxsX3JlbG9uX3BTZXJpZXM6Ci0JSE1UX01FRElVTQotCVNZU0NBTExfUFNFUklFU18xCi0JU1lTQ0FMTF9QU0VSSUVTXzJfRElSRUNUCi0JU1lTQ0FMTF9QU0VSSUVTXzMKLQotCVNURF9SRUxPTl9FWENFUFRJT05fUFNFUklFUygweDRkMDAsIDB4ZDAwLCBzaW5nbGVfc3RlcCkKLQotCS4gPSAweDRlMDAKLQliCS4JLyogQ2FuJ3QgaGFwcGVuLCBzZWUgdjIuMDcgQm9vayBJSUktUyBzZWN0aW9uIDYuNSAqLwotCi0JLiA9IDB4NGUyMAotCWIJLgkvKiBDYW4ndCBoYXBwZW4sIHNlZSB2Mi4wNyBCb29rIElJSS1TIHNlY3Rpb24gNi41ICovCi0KLQkuID0gMHg0ZTQwCi1lbXVsYXRpb25fYXNzaXN0X3JlbG9uX3RyYW1wb2xpbmU6Ci0JU0VUX1NDUkFUQ0gwKHIxMykKLQlFWENFUFRJT05fUFJPTE9HXzAoUEFDQV9FWEdFTikKLQliCWVtdWxhdGlvbl9hc3Npc3RfcmVsb25faHYKLQotCS4gPSAweDRlNjAKLQliCS4JLyogQ2FuJ3QgaGFwcGVuLCBzZWUgdjIuMDcgQm9vayBJSUktUyBzZWN0aW9uIDYuNSAqLwotCi0JLiA9IDB4NGU4MAotaF9kb29yYmVsbF9yZWxvbl90cmFtcG9saW5lOgotCVNFVF9TQ1JBVENIMChyMTMpCi0JRVhDRVBUSU9OX1BST0xPR18wKFBBQ0FfRVhHRU4pCi0JYgloX2Rvb3JiZWxsX3JlbG9uX2h2Ci0KLQkuID0gMHg0ZWEwCi1oX3ZpcnRfaXJxX3JlbG9uX3RyYW1wb2xpbmU6Ci0JU0VUX1NDUkFUQ0gwKHIxMykKLQlFWENFUFRJT05fUFJPTE9HXzAoUEFDQV9FWEdFTikKLQliCWhfdmlydF9pcnFfcmVsb25faHYKLQotCS4gPSAweDRmMDAKLXBlcmZvcm1hbmNlX21vbml0b3JfcmVsb25fcHNlcmllc190cmFtcG9saW5lOgotCVNFVF9TQ1JBVENIMChyMTMpCi0JRVhDRVBUSU9OX1BST0xPR18wKFBBQ0FfRVhHRU4pCi0JYglwZXJmb3JtYW5jZV9tb25pdG9yX3JlbG9uX3BTZXJpZXMKLQotCS4gPSAweDRmMjAKLWFsdGl2ZWNfdW5hdmFpbGFibGVfcmVsb25fcHNlcmllc190cmFtcG9saW5lOgotCVNFVF9TQ1JBVENIMChyMTMpCi0JRVhDRVBUSU9OX1BST0xPR18wKFBBQ0FfRVhHRU4pCi0JYglhbHRpdmVjX3VuYXZhaWxhYmxlX3JlbG9uX3BTZXJpZXMKLQotCS4gPSAweDRmNDAKLXZzeF91bmF2YWlsYWJsZV9yZWxvbl9wc2VyaWVzX3RyYW1wb2xpbmU6Ci0JU0VUX1NDUkFUQ0gwKHIxMykKLQlFWENFUFRJT05fUFJPTE9HXzAoUEFDQV9FWEdFTikKLQliCXZzeF91bmF2YWlsYWJsZV9yZWxvbl9wU2VyaWVzCi0KLQkuID0gMHg0ZjYwCi1mYWNpbGl0eV91bmF2YWlsYWJsZV9yZWxvbl90cmFtcG9saW5lOgotCVNFVF9TQ1JBVENIMChyMTMpCi0JRVhDRVBUSU9OX1BST0xPR18wKFBBQ0FfRVhHRU4pCi0JYglmYWNpbGl0eV91bmF2YWlsYWJsZV9yZWxvbl9wU2VyaWVzCi0KLQkuID0gMHg0ZjgwCi1odl9mYWNpbGl0eV91bmF2YWlsYWJsZV9yZWxvbl90cmFtcG9saW5lOgotCVNFVF9TQ1JBVENIMChyMTMpCi0JRVhDRVBUSU9OX1BST0xPR18wKFBBQ0FfRVhHRU4pCi0JYglodl9mYWNpbGl0eV91bmF2YWlsYWJsZV9yZWxvbl9odgotCi0JU1REX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTKDB4NTMwMCwgMHgxMzAwLCBpbnN0cnVjdGlvbl9icmVha3BvaW50KQotI2lmZGVmIENPTkZJR19QUENfREVOT1JNQUxJU0FUSU9OCi0JLiA9IDB4NTUwMAotCWIJZGVub3JtX2V4Y2VwdGlvbl9odgotI2VuZGlmCi0JU1REX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTKDB4NTcwMCwgMHgxNzAwLCBhbHRpdmVjX2Fzc2lzdCkKLQotCS5hbGlnbgk3Ci1zeXN0ZW1fY2FsbF9lbnRyeToKLQliCXN5c3RlbV9jYWxsX2NvbW1vbgotCi1wcGM2NF9ydW5sYXRjaF9vbl90cmFtcG9saW5lOgotCWIJX19wcGM2NF9ydW5sYXRjaF9vbgotCi0vKgotICogSGVyZSByMTMgcG9pbnRzIHRvIHRoZSBwYWNhLCByOSBjb250YWlucyB0aGUgc2F2ZWQgQ1IsCi0gKiBTUlIwIGFuZCBTUlIxIGFyZSBzYXZlZCBpbiByMTEgYW5kIHIxMiwKLSAqIHI5IC0gcjEzIGFyZSBzYXZlZCBpbiBwYWNhLT5leGdlbi4KLSAqLwotCS5hbGlnbgk3Ci0JLmdsb2JsIGRhdGFfYWNjZXNzX2NvbW1vbgotZGF0YV9hY2Nlc3NfY29tbW9uOgotCW1mc3ByCXIxMCxTUFJOX0RBUgotCXN0ZAlyMTAsUEFDQV9FWEdFTitFWF9EQVIocjEzKQotCW1mc3ByCXIxMCxTUFJOX0RTSVNSCi0Jc3R3CXIxMCxQQUNBX0VYR0VOK0VYX0RTSVNSKHIxMykKLQlFWENFUFRJT05fUFJPTE9HX0NPTU1PTigweDMwMCwgUEFDQV9FWEdFTikKLQlSRUNPTkNJTEVfSVJRX1NUQVRFKHIxMCwgcjExKQotCWxkCXIxMixfTVNSKHIxKQotCWxkCXIzLFBBQ0FfRVhHRU4rRVhfREFSKHIxMykKLQlsd3oJcjQsUEFDQV9FWEdFTitFWF9EU0lTUihyMTMpCi0JbGkJcjUsMHgzMDAKLQlzdGQJcjMsX0RBUihyMSkKLQlzdGQJcjQsX0RTSVNSKHIxKQotQkVHSU5fTU1VX0ZUUl9TRUNUSU9OCi0JYglkb19oYXNoX3BhZ2UJCS8qIFRyeSB0byBoYW5kbGUgYXMgaHB0ZSBmYXVsdCAqLwotTU1VX0ZUUl9TRUNUSU9OX0VMU0UKLQliCWhhbmRsZV9wYWdlX2ZhdWx0Ci1BTFRfTU1VX0ZUUl9TRUNUSU9OX0VORF9JRkNMUihNTVVfRlRSX1RZUEVfUkFESVgpCi0KLQkuYWxpZ24gIDcKLQkuZ2xvYmwgIGhfZGF0YV9zdG9yYWdlX2NvbW1vbgotaF9kYXRhX3N0b3JhZ2VfY29tbW9uOgotCW1mc3ByICAgcjEwLFNQUk5fSERBUgotCXN0ZCAgICAgcjEwLFBBQ0FfRVhHRU4rRVhfREFSKHIxMykKLQltZnNwciAgIHIxMCxTUFJOX0hEU0lTUgotCXN0dyAgICAgcjEwLFBBQ0FfRVhHRU4rRVhfRFNJU1IocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OKDB4ZTAwLCBQQUNBX0VYR0VOKQotCWJsICAgICAgc2F2ZV9udmdwcnMKLQlSRUNPTkNJTEVfSVJRX1NUQVRFKHIxMCwgcjExKQotCWFkZGkgICAgcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLQlibCAgICAgIHVua25vd25fZXhjZXB0aW9uCi0JYiAgICAgICByZXRfZnJvbV9leGNlcHQKLQotCS5hbGlnbgk3Ci0JLmdsb2JsIGluc3RydWN0aW9uX2FjY2Vzc19jb21tb24KLWluc3RydWN0aW9uX2FjY2Vzc19jb21tb246Ci0JRVhDRVBUSU9OX1BST0xPR19DT01NT04oMHg0MDAsIFBBQ0FfRVhHRU4pCi0JUkVDT05DSUxFX0lSUV9TVEFURShyMTAsIHIxMSkKLQlsZAlyMTIsX01TUihyMSkKLQlsZAlyMyxfTklQKHIxKQotCWFuZGlzLglyNCxyMTIsMHg1ODIwCi0JbGkJcjUsMHg0MDAKLQlzdGQJcjMsX0RBUihyMSkKLQlzdGQJcjQsX0RTSVNSKHIxKQotQkVHSU5fTU1VX0ZUUl9TRUNUSU9OCi0JYglkb19oYXNoX3BhZ2UJCS8qIFRyeSB0byBoYW5kbGUgYXMgaHB0ZSBmYXVsdCAqLwotTU1VX0ZUUl9TRUNUSU9OX0VMU0UKLQliCWhhbmRsZV9wYWdlX2ZhdWx0Ci1BTFRfTU1VX0ZUUl9TRUNUSU9OX0VORF9JRkNMUihNTVVfRlRSX1RZUEVfUkFESVgpCi0KLQlTVERfRVhDRVBUSU9OX0NPTU1PTigweGUyMCwgaF9pbnN0cl9zdG9yYWdlLCB1bmtub3duX2V4Y2VwdGlvbikKLQorRVhDX0NPTU1PTl9CRUdJTihtYWNoaW5lX2NoZWNrX2NvbW1vbikKIAkvKgogCSAqIE1hY2hpbmUgY2hlY2sgaXMgZGlmZmVyZW50IGJlY2F1c2Ugd2UgdXNlIGEgZGlmZmVyZW50CiAJICogc2F2ZSBhcmVhOiBQQUNBX0VYTUMgaW5zdGVhZCBvZiBQQUNBX0VYR0VOLgogCSAqLwotCS5hbGlnbgk3Ci0JLmdsb2JsIG1hY2hpbmVfY2hlY2tfY29tbW9uCi1tYWNoaW5lX2NoZWNrX2NvbW1vbjoKLQogCW1mc3ByCXIxMCxTUFJOX0RBUgotCXN0ZAlyMTAsUEFDQV9FWEdFTitFWF9EQVIocjEzKQorCXN0ZAlyMTAsUEFDQV9FWE1DK0VYX0RBUihyMTMpCiAJbWZzcHIJcjEwLFNQUk5fRFNJU1IKLQlzdHcJcjEwLFBBQ0FfRVhHRU4rRVhfRFNJU1IocjEzKQorCXN0dwlyMTAsUEFDQV9FWE1DK0VYX0RTSVNSKHIxMykKIAlFWENFUFRJT05fUFJPTE9HX0NPTU1PTigweDIwMCwgUEFDQV9FWE1DKQogCUZJTklTSF9OQVAKIAlSRUNPTkNJTEVfSVJRX1NUQVRFKHIxMCwgcjExKQotCWxkCXIzLFBBQ0FfRVhHRU4rRVhfREFSKHIxMykKLQlsd3oJcjQsUEFDQV9FWEdFTitFWF9EU0lTUihyMTMpCisJbGQJcjMsUEFDQV9FWE1DK0VYX0RBUihyMTMpCisJbHd6CXI0LFBBQ0FfRVhNQytFWF9EU0lTUihyMTMpCisJLyogRW5hYmxlIE1TUl9SSSB3aGVuIGZpbmlzaGVkIHdpdGggUEFDQV9FWE1DICovCisJbGkJcjEwLE1TUl9SSQorCW10bXNyZCAJcjEwLDEKIAlzdGQJcjMsX0RBUihyMSkKIAlzdGQJcjQsX0RTSVNSKHIxKQogCWJsCXNhdmVfbnZncHJzCkBAIC05ODQsMjMwICsyOTQsNiBAQAogCWJsCW1hY2hpbmVfY2hlY2tfZXhjZXB0aW9uCiAJYglyZXRfZnJvbV9leGNlcHQKIAotCS5hbGlnbgk3Ci0JLmdsb2JsIGFsaWdubWVudF9jb21tb24KLWFsaWdubWVudF9jb21tb246Ci0JbWZzcHIJcjEwLFNQUk5fREFSCi0Jc3RkCXIxMCxQQUNBX0VYR0VOK0VYX0RBUihyMTMpCi0JbWZzcHIJcjEwLFNQUk5fRFNJU1IKLQlzdHcJcjEwLFBBQ0FfRVhHRU4rRVhfRFNJU1IocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OKDB4NjAwLCBQQUNBX0VYR0VOKQotCWxkCXIzLFBBQ0FfRVhHRU4rRVhfREFSKHIxMykKLQlsd3oJcjQsUEFDQV9FWEdFTitFWF9EU0lTUihyMTMpCi0Jc3RkCXIzLF9EQVIocjEpCi0Jc3RkCXI0LF9EU0lTUihyMSkKLQlibAlzYXZlX252Z3BycwotCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCi0JYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotCWJsCWFsaWdubWVudF9leGNlcHRpb24KLQliCXJldF9mcm9tX2V4Y2VwdAotCi0JLmFsaWduCTcKLQkuZ2xvYmwgcHJvZ3JhbV9jaGVja19jb21tb24KLXByb2dyYW1fY2hlY2tfY29tbW9uOgotCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OKDB4NzAwLCBQQUNBX0VYR0VOKQotCWJsCXNhdmVfbnZncHJzCi0JUkVDT05DSUxFX0lSUV9TVEFURShyMTAsIHIxMSkKLQlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECi0JYmwJcHJvZ3JhbV9jaGVja19leGNlcHRpb24KLQliCXJldF9mcm9tX2V4Y2VwdAotCi0JLmFsaWduCTcKLQkuZ2xvYmwgZnBfdW5hdmFpbGFibGVfY29tbW9uCi1mcF91bmF2YWlsYWJsZV9jb21tb246Ci0JRVhDRVBUSU9OX1BST0xPR19DT01NT04oMHg4MDAsIFBBQ0FfRVhHRU4pCi0JYm5lCTFmCQkJLyogaWYgZnJvbSB1c2VyLCBqdXN0IGxvYWQgaXQgdXAgKi8KLQlibAlzYXZlX252Z3BycwotCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCi0JYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotCWJsCWtlcm5lbF9mcF91bmF2YWlsYWJsZV9leGNlcHRpb24KLQlCVUdfT1BDT0RFCi0xOgotI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KLUJFR0lOX0ZUUl9TRUNUSU9OCi0JLyogVGVzdCBpZiAyIFRNIHN0YXRlIGJpdHMgYXJlIHplcm8uICBJZiBub24temVybyAoaWUuIHVzZXJzcGFjZSB3YXMgaW4KLQkgKiB0cmFuc2FjdGlvbiksIGdvIGRvIFRNIHN0dWZmCi0JICovCi0JcmxkaWNsLglyMCwgcjEyLCAoNjQtTVNSX1RTX0xHKSwgKDY0LTIpCi0JYm5lLQkyZgotRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfVE0pCi0jZW5kaWYKLQlibAlsb2FkX3VwX2ZwdQotCWIJZmFzdF9leGNlcHRpb25fcmV0dXJuCi0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotMjoJLyogVXNlciBwcm9jZXNzIHdhcyBpbiBhIHRyYW5zYWN0aW9uICovCi0JYmwJc2F2ZV9udmdwcnMKLQlSRUNPTkNJTEVfSVJRX1NUQVRFKHIxMCwgcjExKQotCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLQlibAlmcF91bmF2YWlsYWJsZV90bQotCWIJcmV0X2Zyb21fZXhjZXB0Ci0jZW5kaWYKLQkuYWxpZ24JNwotCS5nbG9ibCBhbHRpdmVjX3VuYXZhaWxhYmxlX2NvbW1vbgotYWx0aXZlY191bmF2YWlsYWJsZV9jb21tb246Ci0JRVhDRVBUSU9OX1BST0xPR19DT01NT04oMHhmMjAsIFBBQ0FfRVhHRU4pCi0jaWZkZWYgQ09ORklHX0FMVElWRUMKLUJFR0lOX0ZUUl9TRUNUSU9OCi0JYmVxCTFmCi0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotICBCRUdJTl9GVFJfU0VDVElPTl9ORVNURUQoNjkpCi0JLyogVGVzdCBpZiAyIFRNIHN0YXRlIGJpdHMgYXJlIHplcm8uICBJZiBub24temVybyAoaWUuIHVzZXJzcGFjZSB3YXMgaW4KLQkgKiB0cmFuc2FjdGlvbiksIGdvIGRvIFRNIHN0dWZmCi0JICovCi0JcmxkaWNsLglyMCwgcjEyLCAoNjQtTVNSX1RTX0xHKSwgKDY0LTIpCi0JYm5lLQkyZgotICBFTkRfRlRSX1NFQ1RJT05fTkVTVEVEKENQVV9GVFJfVE0sIENQVV9GVFJfVE0sIDY5KQotI2VuZGlmCi0JYmwJbG9hZF91cF9hbHRpdmVjCi0JYglmYXN0X2V4Y2VwdGlvbl9yZXR1cm4KLSNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCi0yOgkvKiBVc2VyIHByb2Nlc3Mgd2FzIGluIGEgdHJhbnNhY3Rpb24gKi8KLQlibAlzYXZlX252Z3BycwotCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCi0JYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotCWJsCWFsdGl2ZWNfdW5hdmFpbGFibGVfdG0KLQliCXJldF9mcm9tX2V4Y2VwdAotI2VuZGlmCi0xOgotRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQUxUSVZFQykKLSNlbmRpZgotCWJsCXNhdmVfbnZncHJzCi0JUkVDT05DSUxFX0lSUV9TVEFURShyMTAsIHIxMSkKLQlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECi0JYmwJYWx0aXZlY191bmF2YWlsYWJsZV9leGNlcHRpb24KLQliCXJldF9mcm9tX2V4Y2VwdAotCi0JLmFsaWduCTcKLQkuZ2xvYmwgdnN4X3VuYXZhaWxhYmxlX2NvbW1vbgotdnN4X3VuYXZhaWxhYmxlX2NvbW1vbjoKLQlFWENFUFRJT05fUFJPTE9HX0NPTU1PTigweGY0MCwgUEFDQV9FWEdFTikKLSNpZmRlZiBDT05GSUdfVlNYCi1CRUdJTl9GVFJfU0VDVElPTgotCWJlcQkxZgotI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KLSAgQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDY5KQotCS8qIFRlc3QgaWYgMiBUTSBzdGF0ZSBiaXRzIGFyZSB6ZXJvLiAgSWYgbm9uLXplcm8gKGllLiB1c2Vyc3BhY2Ugd2FzIGluCi0JICogdHJhbnNhY3Rpb24pLCBnbyBkbyBUTSBzdHVmZgotCSAqLwotCXJsZGljbC4JcjAsIHIxMiwgKDY0LU1TUl9UU19MRyksICg2NC0yKQotCWJuZS0JMmYKLSAgRU5EX0ZUUl9TRUNUSU9OX05FU1RFRChDUFVfRlRSX1RNLCBDUFVfRlRSX1RNLCA2OSkKLSNlbmRpZgotCWIJbG9hZF91cF92c3gKLSNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCi0yOgkvKiBVc2VyIHByb2Nlc3Mgd2FzIGluIGEgdHJhbnNhY3Rpb24gKi8KLQlibAlzYXZlX252Z3BycwotCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCi0JYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotCWJsCXZzeF91bmF2YWlsYWJsZV90bQotCWIJcmV0X2Zyb21fZXhjZXB0Ci0jZW5kaWYKLTE6Ci1FTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9WU1gpCi0jZW5kaWYKLQlibAlzYXZlX252Z3BycwotCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCi0JYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAotCWJsCXZzeF91bmF2YWlsYWJsZV9leGNlcHRpb24KLQliCXJldF9mcm9tX2V4Y2VwdAotCi0JLyogRXF1aXZhbGVudHMgdG8gdGhlIGFib3ZlIGhhbmRsZXJzIGZvciByZWxvY2F0aW9uLW9uIGludGVycnVwdCB2ZWN0b3JzICovCi0JU1REX1JFTE9OX0VYQ0VQVElPTl9IVl9PT0woMHhlNDAsIGVtdWxhdGlvbl9hc3Npc3QpCi0JTUFTS0FCTEVfUkVMT05fRVhDRVBUSU9OX0hWX09PTCgweGU4MCwgaF9kb29yYmVsbCkKLQlNQVNLQUJMRV9SRUxPTl9FWENFUFRJT05fSFZfT09MKDB4ZWEwLCBoX3ZpcnRfaXJxKQotCi0JU1REX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTX09PTCgweGYwMCwgcGVyZm9ybWFuY2VfbW9uaXRvcikKLQlTVERfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVNfT09MKDB4ZjIwLCBhbHRpdmVjX3VuYXZhaWxhYmxlKQotCVNURF9SRUxPTl9FWENFUFRJT05fUFNFUklFU19PT0woMHhmNDAsIHZzeF91bmF2YWlsYWJsZSkKLQlTVERfUkVMT05fRVhDRVBUSU9OX1BTRVJJRVNfT09MKDB4ZjYwLCBmYWNpbGl0eV91bmF2YWlsYWJsZSkKLQlTVERfUkVMT05fRVhDRVBUSU9OX0hWX09PTCgweGY4MCwgaHZfZmFjaWxpdHlfdW5hdmFpbGFibGUpCi0KLQkvKgotCSAqIFRoZSBfX2VuZF9pbnRlcnJ1cHRzIG1hcmtlciBtdXN0IGJlIHBhc3QgdGhlIG91dC1vZi1saW5lIChPT0wpCi0JICogaGFuZGxlcnMsIHNvIHRoYXQgdGhleSBhcmUgY29waWVkIHRvIHJlYWwgYWRkcmVzcyAweDEwMCB3aGVuIHJ1bm5pbmcKLQkgKiBhIHJlbG9jYXRhYmxlIGtlcm5lbC4gVGhpcyBlbnN1cmVzIHRoZXkgY2FuIGJlIHJlYWNoZWQgZnJvbSB0aGUgc2hvcnQKLQkgKiB0cmFtcG9saW5lIGhhbmRsZXJzIChsaWtlIDB4NGYwMCwgMHg0ZjIwLCBldGMuKSB3aGljaCBicmFuY2gKLQkgKiBkaXJlY3RseSwgd2l0aG91dCB1c2luZyBMT0FEX0hBTkRMRVIoKS4KLQkgKi8KLQkuYWxpZ24JNwotCS5nbG9ibAlfX2VuZF9pbnRlcnJ1cHRzCi1fX2VuZF9pbnRlcnJ1cHRzOgotCi0jaWYgZGVmaW5lZChDT05GSUdfUFBDX1BTRVJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1BQQ19QT1dFUk5WKQotLyoKLSAqIERhdGEgYXJlYSByZXNlcnZlZCBmb3IgRldOTUkgb3B0aW9uLgotICogVGhpcyBhZGRyZXNzICgweDcwMDApIGlzIGZpeGVkIGJ5IHRoZSBSUEEuCi0gKi8KLQkuPSAweDcwMDAKLQkuZ2xvYmwgZndubWlfZGF0YV9hcmVhCi1md25taV9kYXRhX2FyZWE6Ci0KLQkvKiBwc2VyaWVzIGFuZCBwb3dlcm52IG5lZWQgdG8ga2VlcCB0aGUgd2hvbGUgcGFnZSBmcm9tCi0JICogMHg3MDAwIHRvIDB4ODAwMCBmcmVlIGZvciB1c2UgYnkgdGhlIGZpcm13YXJlCi0JICovCi0JLiA9IDB4ODAwMAotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BQQ19QU0VSSUVTKSB8fCBkZWZpbmVkKENPTkZJR19QUENfUE9XRVJOVikgKi8KLQotCVNURF9FWENFUFRJT05fQ09NTU9OKDB4ZjYwLCBmYWNpbGl0eV91bmF2YWlsYWJsZSwgZmFjaWxpdHlfdW5hdmFpbGFibGVfZXhjZXB0aW9uKQotCVNURF9FWENFUFRJT05fQ09NTU9OKDB4ZjgwLCBodl9mYWNpbGl0eV91bmF2YWlsYWJsZSwgZmFjaWxpdHlfdW5hdmFpbGFibGVfZXhjZXB0aW9uKQotCi0jaWZkZWYgQ09ORklHX0NCRV9SQVMKLQlTVERfRVhDRVBUSU9OX0NPTU1PTigweDEyMDAsIGNiZV9zeXN0ZW1fZXJyb3IsIGNiZV9zeXN0ZW1fZXJyb3JfZXhjZXB0aW9uKQotCVNURF9FWENFUFRJT05fQ09NTU9OKDB4MTYwMCwgY2JlX21haW50ZW5hbmNlLCBjYmVfbWFpbnRlbmFuY2VfZXhjZXB0aW9uKQotCVNURF9FWENFUFRJT05fQ09NTU9OKDB4MTgwMCwgY2JlX3RoZXJtYWwsIGNiZV90aGVybWFsX2V4Y2VwdGlvbikKLSNlbmRpZiAvKiBDT05GSUdfQ0JFX1JBUyAqLwotCi0JLmdsb2JsIGhtaV9leGNlcHRpb25fZWFybHkKLWhtaV9leGNlcHRpb25fZWFybHk6Ci0JRVhDRVBUSU9OX1BST0xPR18xKFBBQ0FfRVhHRU4sIEtWTVRFU1QsIDB4ZTYyKQotCW1yCXIxMCxyMQkJCS8qIFNhdmUgcjEJCQkqLwotCWxkCXIxLFBBQ0FFTUVSR1NQKHIxMykJLyogVXNlIGVtZXJnZW5jeSBzdGFjawkJKi8KLQlzdWJpCXIxLHIxLElOVF9GUkFNRV9TSVpFCS8qIGFsbG9jIHN0YWNrIGZyYW1lCQkqLwotCXN0ZAlyOSxfQ0NSKHIxKQkJLyogc2F2ZSBDUiBpbiBzdGFja2ZyYW1lCSovCi0JbWZzcHIJcjExLFNQUk5fSFNSUjAJCS8qIFNhdmUgSFNSUjAgKi8KLQlzdGQJcjExLF9OSVAocjEpCQkvKiBzYXZlIEhTUlIwIGluIHN0YWNrZnJhbWUJKi8KLQltZnNwcglyMTIsU1BSTl9IU1JSMQkJLyogU2F2ZSBTUlIxICovCi0Jc3RkCXIxMixfTVNSKHIxKQkJLyogc2F2ZSBTUlIxIGluIHN0YWNrZnJhbWUJKi8KLQlzdGQJcjEwLDAocjEpCQkvKiBtYWtlIHN0YWNrIGNoYWluIHBvaW50ZXIJKi8KLQlzdGQJcjAsR1BSMChyMSkJCS8qIHNhdmUgcjAgaW4gc3RhY2tmcmFtZQkqLwotCXN0ZAlyMTAsR1BSMShyMSkJCS8qIHNhdmUgcjEgaW4gc3RhY2tmcmFtZQkqLwotCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OXzIoUEFDQV9FWEdFTikKLQlFWENFUFRJT05fUFJPTE9HX0NPTU1PTl8zKDB4ZTYwKQotCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLQlibAlobWlfZXhjZXB0aW9uX3JlYWxtb2RlCi0JLyogV2luZHVwIHRoZSBzdGFjay4gKi8KLQkvKiBNb3ZlIG9yaWdpbmFsIEhTUlIwIGFuZCBIU1JSMSBpbnRvIHRoZSByZXNwZWN0aXZlIHJlZ3MgKi8KLQlsZAlyOSxfTVNSKHIxKQotCW10c3ByCVNQUk5fSFNSUjEscjkKLQlsZAlyMyxfTklQKHIxKQotCW10c3ByCVNQUk5fSFNSUjAscjMKLQlsZAlyOSxfQ1RSKHIxKQotCW10Y3RyCXI5Ci0JbGQJcjksX1hFUihyMSkKLQltdHhlcglyOQotCWxkCXI5LF9MSU5LKHIxKQotCW10bHIJcjkKLQlSRVNUX0dQUigwLCByMSkKLQlSRVNUXzhHUFJTKDIsIHIxKQotCVJFU1RfR1BSKDEwLCByMSkKLQlsZAlyMTEsX0NDUihyMSkKLQltdGNyCXIxMQotCVJFU1RfR1BSKDExLCByMSkKLQlSRVNUXzJHUFJTKDEyLCByMSkKLQkvKiByZXN0b3JlIG9yaWdpbmFsIHIxLiAqLwotCWxkCXIxLEdQUjEocjEpCi0KLQkvKgotCSAqIEdvIHRvIHZpcnR1YWwgbW9kZSBhbmQgcHVsbCB0aGUgSE1JIGV2ZW50IGluZm9ybWF0aW9uIGZyb20KLQkgKiBmaXJtd2FyZS4KLQkgKi8KLQkuZ2xvYmwgaG1pX2V4Y2VwdGlvbl9hZnRlcl9yZWFsbW9kZQotaG1pX2V4Y2VwdGlvbl9hZnRlcl9yZWFsbW9kZToKLQlTRVRfU0NSQVRDSDAocjEzKQotCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYR0VOKQotCWIJaG1pX2V4Y2VwdGlvbl9odgotCi0KICNkZWZpbmUgTUFDSElORV9DSEVDS19IQU5ETEVSX1dJTkRVUAkJCVwKIAkvKiBDbGVhciBNU1JfUkkgYmVmb3JlIHNldHRpbmcgU1JSMCBhbmQgU1JSMS4gKi9cCiAJbGkJcjAsTVNSX1JJOwkJCQlcCkBAIC0xMjQzLDkgKzMyOSw3IEBACiAJICogSGFuZGxlIG1hY2hpbmUgY2hlY2sgZWFybHkgaW4gcmVhbCBtb2RlLiBXZSBjb21lIGhlcmUgd2l0aAogCSAqIE1FPTEsIE1NVSAoSVI9MCBhbmQgRFI9MCkgb2ZmIGFuZCB1c2luZyBNQyBlbWVyZ2VuY3kgc3RhY2suCiAJICovCi0JLmFsaWduCTcKLQkuZ2xvYmwgbWFjaGluZV9jaGVja19oYW5kbGVfZWFybHkKLW1hY2hpbmVfY2hlY2tfaGFuZGxlX2Vhcmx5OgorRVhDX0NPTU1PTl9CRUdJTihtYWNoaW5lX2NoZWNrX2hhbmRsZV9lYXJseSkKIAlzdGQJcjAsR1BSMChyMSkJLyogU2F2ZSByMCAqLwogCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OXzMoMHgyMDApCiAJYmwJc2F2ZV9udmdwcnMKQEAgLTEzMzQsNyArNDE4LDYgQEAKIAlhbmRpLglyMTEscjEyLE1TUl9SSQogCWJuZQkyZgogMToJbWZzcHIJcjExLFNQUk5fU1JSMAotCWxkCXIxMCxQQUNBS0JBU0UocjEzKQogCUxPQURfSEFORExFUihyMTAsdW5yZWNvdmVyX21jZSkKIAltdHNwcglTUFJOX1NSUjAscjEwCiAJbGQJcjEwLFBBQ0FLTVNSKHIxMykKQEAgLTEzNzIsNyArNDU1LDcgQEAKIAlNQUNISU5FX0NIRUNLX0hBTkRMRVJfV0lORFVQCiAJYgltYWNoaW5lX2NoZWNrX3BTZXJpZXMKIAotdW5yZWNvdmVyX21jZToKK0VYQ19DT01NT05fQkVHSU4odW5yZWNvdmVyX21jZSkKIAkvKiBJbnZva2UgbWFjaGluZV9jaGVja19leGNlcHRpb24gdG8gcHJpbnQgTUNFIGV2ZW50IGFuZCBwYW5pYy4gKi8KIAlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECiAJYmwJbWFjaGluZV9jaGVja19leGNlcHRpb24KQEAgLTEzODMsMTUgKzQ2NiwxNTUgQEAKIDE6CWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKIAlibAl1bnJlY292ZXJhYmxlX2V4Y2VwdGlvbgogCWIJMWIKLS8qCi0gKiByMTMgcG9pbnRzIHRvIHRoZSBQQUNBLCByOSBjb250YWlucyB0aGUgc2F2ZWQgQ1IsCi0gKiByMTIgY29udGFpbiB0aGUgc2F2ZWQgU1JSMSwgU1JSMCBpcyBzdGlsbCByZWFkeSBmb3IgcmV0dXJuCi0gKiByMyBoYXMgdGhlIGZhdWx0aW5nIGFkZHJlc3MKLSAqIHI5IC0gcjEzIGFyZSBzYXZlZCBpbiBwYWNhLT5leHNsYi4KLSAqIHIzIGlzIHNhdmVkIGluIHBhY2EtPnNsYl9yMwotICogV2UgYXNzdW1lIHdlIGFyZW4ndCBnb2luZyB0byB0YWtlIGFueSBleGNlcHRpb25zIGR1cmluZyB0aGlzIHByb2NlZHVyZS4KLSAqLwotc2xiX21pc3NfcmVhbG1vZGU6CisKKworRVhDX1JFQUwoZGF0YV9hY2Nlc3MsIDB4MzAwLCAweDM4MCkKK0VYQ19WSVJUKGRhdGFfYWNjZXNzLCAweDQzMDAsIDB4NDM4MCwgMHgzMDApCitUUkFNUF9LVk1fU0tJUChQQUNBX0VYR0VOLCAweDMwMCkKKworRVhDX0NPTU1PTl9CRUdJTihkYXRhX2FjY2Vzc19jb21tb24pCisJLyoKKwkgKiBIZXJlIHIxMyBwb2ludHMgdG8gdGhlIHBhY2EsIHI5IGNvbnRhaW5zIHRoZSBzYXZlZCBDUiwKKwkgKiBTUlIwIGFuZCBTUlIxIGFyZSBzYXZlZCBpbiByMTEgYW5kIHIxMiwKKwkgKiByOSAtIHIxMyBhcmUgc2F2ZWQgaW4gcGFjYS0+ZXhnZW4uCisJICovCisJbWZzcHIJcjEwLFNQUk5fREFSCisJc3RkCXIxMCxQQUNBX0VYR0VOK0VYX0RBUihyMTMpCisJbWZzcHIJcjEwLFNQUk5fRFNJU1IKKwlzdHcJcjEwLFBBQ0FfRVhHRU4rRVhfRFNJU1IocjEzKQorCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OKDB4MzAwLCBQQUNBX0VYR0VOKQorCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCisJbGQJcjEyLF9NU1IocjEpCisJbGQJcjMsUEFDQV9FWEdFTitFWF9EQVIocjEzKQorCWx3eglyNCxQQUNBX0VYR0VOK0VYX0RTSVNSKHIxMykKKwlsaQlyNSwweDMwMAorCXN0ZAlyMyxfREFSKHIxKQorCXN0ZAlyNCxfRFNJU1IocjEpCitCRUdJTl9NTVVfRlRSX1NFQ1RJT04KKwliCWRvX2hhc2hfcGFnZQkJLyogVHJ5IHRvIGhhbmRsZSBhcyBocHRlIGZhdWx0ICovCitNTVVfRlRSX1NFQ1RJT05fRUxTRQorCWIJaGFuZGxlX3BhZ2VfZmF1bHQKK0FMVF9NTVVfRlRSX1NFQ1RJT05fRU5EX0lGQ0xSKE1NVV9GVFJfVFlQRV9SQURJWCkKKworCitFWENfUkVBTF9CRUdJTihkYXRhX2FjY2Vzc19zbGIsIDB4MzgwLCAweDQwMCkKKwlTRVRfU0NSQVRDSDAocjEzKQorCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYU0xCKQorCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYU0xCLCBLVk1URVNUX1BSLCAweDM4MCkKKwlzdGQJcjMsUEFDQV9FWFNMQitFWF9SMyhyMTMpCisJbWZzcHIJcjMsU1BSTl9EQVIKKwltZnNwcglyMTIsU1BSTl9TUlIxCisJY3JzZXQJNCpjcjYrZXEKKyNpZm5kZWYgQ09ORklHX1JFTE9DQVRBQkxFCisJYglzbGJfbWlzc19yZWFsbW9kZQorI2Vsc2UKKwkvKgorCSAqIFdlIGNhbid0IGp1c3QgdXNlIGEgZGlyZWN0IGJyYW5jaCB0byBzbGJfbWlzc19yZWFsbW9kZQorCSAqIGJlY2F1c2UgdGhlIGRpc3RhbmNlIGZyb20gaGVyZSB0byB0aGVyZSBkZXBlbmRzIG9uIHdoZXJlCisJICogdGhlIGtlcm5lbCBlbmRzIHVwIGJlaW5nIHB1dC4KKwkgKi8KKwltZmN0cglyMTEKKwlMT0FEX0hBTkRMRVIocjEwLCBzbGJfbWlzc19yZWFsbW9kZSkKKwltdGN0cglyMTAKKwliY3RyCisjZW5kaWYKK0VYQ19SRUFMX0VORChkYXRhX2FjY2Vzc19zbGIsIDB4MzgwLCAweDQwMCkKKworRVhDX1ZJUlRfQkVHSU4oZGF0YV9hY2Nlc3Nfc2xiLCAweDQzODAsIDB4NDQwMCkKKwlTRVRfU0NSQVRDSDAocjEzKQorCUVYQ0VQVElPTl9QUk9MT0dfMChQQUNBX0VYU0xCKQorCUVYQ0VQVElPTl9QUk9MT0dfMShQQUNBX0VYU0xCLCBOT1RFU1QsIDB4MzgwKQorCXN0ZAlyMyxQQUNBX0VYU0xCK0VYX1IzKHIxMykKKwltZnNwcglyMyxTUFJOX0RBUgorCW1mc3ByCXIxMixTUFJOX1NSUjEKKwljcnNldAk0KmNyNitlcQorI2lmbmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKKwliCXNsYl9taXNzX3JlYWxtb2RlCisjZWxzZQorCS8qCisJICogV2UgY2FuJ3QganVzdCB1c2UgYSBkaXJlY3QgYnJhbmNoIHRvIHNsYl9taXNzX3JlYWxtb2RlCisJICogYmVjYXVzZSB0aGUgZGlzdGFuY2UgZnJvbSBoZXJlIHRvIHRoZXJlIGRlcGVuZHMgb24gd2hlcmUKKwkgKiB0aGUga2VybmVsIGVuZHMgdXAgYmVpbmcgcHV0LgorCSAqLworCW1mY3RyCXIxMQorCUxPQURfSEFORExFUihyMTAsIHNsYl9taXNzX3JlYWxtb2RlKQorCW10Y3RyCXIxMAorCWJjdHIKKyNlbmRpZgorRVhDX1ZJUlRfRU5EKGRhdGFfYWNjZXNzX3NsYiwgMHg0MzgwLCAweDQ0MDApCitUUkFNUF9LVk1fU0tJUChQQUNBX0VYU0xCLCAweDM4MCkKKworCitFWENfUkVBTChpbnN0cnVjdGlvbl9hY2Nlc3MsIDB4NDAwLCAweDQ4MCkKK0VYQ19WSVJUKGluc3RydWN0aW9uX2FjY2VzcywgMHg0NDAwLCAweDQ0ODAsIDB4NDAwKQorVFJBTVBfS1ZNKFBBQ0FfRVhHRU4sIDB4NDAwKQorCitFWENfQ09NTU9OX0JFR0lOKGluc3RydWN0aW9uX2FjY2Vzc19jb21tb24pCisJRVhDRVBUSU9OX1BST0xPR19DT01NT04oMHg0MDAsIFBBQ0FfRVhHRU4pCisJUkVDT05DSUxFX0lSUV9TVEFURShyMTAsIHIxMSkKKwlsZAlyMTIsX01TUihyMSkKKwlsZAlyMyxfTklQKHIxKQorCWFuZGlzLglyNCxyMTIsMHg1ODIwCisJbGkJcjUsMHg0MDAKKwlzdGQJcjMsX0RBUihyMSkKKwlzdGQJcjQsX0RTSVNSKHIxKQorQkVHSU5fTU1VX0ZUUl9TRUNUSU9OCisJYglkb19oYXNoX3BhZ2UJCS8qIFRyeSB0byBoYW5kbGUgYXMgaHB0ZSBmYXVsdCAqLworTU1VX0ZUUl9TRUNUSU9OX0VMU0UKKwliCWhhbmRsZV9wYWdlX2ZhdWx0CitBTFRfTU1VX0ZUUl9TRUNUSU9OX0VORF9JRkNMUihNTVVfRlRSX1RZUEVfUkFESVgpCisKKworRVhDX1JFQUxfQkVHSU4oaW5zdHJ1Y3Rpb25fYWNjZXNzX3NsYiwgMHg0ODAsIDB4NTAwKQorCVNFVF9TQ1JBVENIMChyMTMpCisJRVhDRVBUSU9OX1BST0xPR18wKFBBQ0FfRVhTTEIpCisJRVhDRVBUSU9OX1BST0xPR18xKFBBQ0FfRVhTTEIsIEtWTVRFU1RfUFIsIDB4NDgwKQorCXN0ZAlyMyxQQUNBX0VYU0xCK0VYX1IzKHIxMykKKwltZnNwcglyMyxTUFJOX1NSUjAJCS8qIFNSUjAgaXMgZmF1bHRpbmcgYWRkcmVzcyAqLworCW1mc3ByCXIxMixTUFJOX1NSUjEKKwljcmNscgk0KmNyNitlcQorI2lmbmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKKwliCXNsYl9taXNzX3JlYWxtb2RlCisjZWxzZQorCW1mY3RyCXIxMQorCUxPQURfSEFORExFUihyMTAsIHNsYl9taXNzX3JlYWxtb2RlKQorCW10Y3RyCXIxMAorCWJjdHIKKyNlbmRpZgorRVhDX1JFQUxfRU5EKGluc3RydWN0aW9uX2FjY2Vzc19zbGIsIDB4NDgwLCAweDUwMCkKKworRVhDX1ZJUlRfQkVHSU4oaW5zdHJ1Y3Rpb25fYWNjZXNzX3NsYiwgMHg0NDgwLCAweDQ1MDApCisJU0VUX1NDUkFUQ0gwKHIxMykKKwlFWENFUFRJT05fUFJPTE9HXzAoUEFDQV9FWFNMQikKKwlFWENFUFRJT05fUFJPTE9HXzEoUEFDQV9FWFNMQiwgTk9URVNULCAweDQ4MCkKKwlzdGQJcjMsUEFDQV9FWFNMQitFWF9SMyhyMTMpCisJbWZzcHIJcjMsU1BSTl9TUlIwCQkvKiBTUlIwIGlzIGZhdWx0aW5nIGFkZHJlc3MgKi8KKwltZnNwcglyMTIsU1BSTl9TUlIxCisJY3JjbHIJNCpjcjYrZXEKKyNpZm5kZWYgQ09ORklHX1JFTE9DQVRBQkxFCisJYglzbGJfbWlzc19yZWFsbW9kZQorI2Vsc2UKKwltZmN0cglyMTEKKwlMT0FEX0hBTkRMRVIocjEwLCBzbGJfbWlzc19yZWFsbW9kZSkKKwltdGN0cglyMTAKKwliY3RyCisjZW5kaWYKK0VYQ19WSVJUX0VORChpbnN0cnVjdGlvbl9hY2Nlc3Nfc2xiLCAweDQ0ODAsIDB4NDUwMCkKK1RSQU1QX0tWTShQQUNBX0VYU0xCLCAweDQ4MCkKKworCisvKiBUaGlzIGhhbmRsZXIgaXMgdXNlZCBieSBib3RoIDB4MzgwIGFuZCAweDQ4MCBzbGIgbWlzcyBpbnRlcnJ1cHRzICovCitFWENfQ09NTU9OX0JFR0lOKHNsYl9taXNzX3JlYWxtb2RlKQorCS8qCisJICogcjEzIHBvaW50cyB0byB0aGUgUEFDQSwgcjkgY29udGFpbnMgdGhlIHNhdmVkIENSLAorCSAqIHIxMiBjb250YWluIHRoZSBzYXZlZCBTUlIxLCBTUlIwIGlzIHN0aWxsIHJlYWR5IGZvciByZXR1cm4KKwkgKiByMyBoYXMgdGhlIGZhdWx0aW5nIGFkZHJlc3MKKwkgKiByOSAtIHIxMyBhcmUgc2F2ZWQgaW4gcGFjYS0+ZXhzbGIuCisJICogcjMgaXMgc2F2ZWQgaW4gcGFjYS0+c2xiX3IzCisgCSAqIGNyNi5lcSBpcyBzZXQgZm9yIGEgRC1TTEIgbWlzcywgY2xlYXIgZm9yIGEgSS1TTEIgbWlzcworCSAqIFdlIGFzc3VtZSB3ZSBhcmVuJ3QgZ29pbmcgdG8gdGFrZSBhbnkgZXhjZXB0aW9ucyBkdXJpbmcgdGhpcworCSAqIHByb2NlZHVyZS4KKwkgKi8KIAltZmxyCXIxMAogI2lmZGVmIENPTkZJR19SRUxPQ0FUQUJMRQogCW10Y3RyCXIxMQpAQCAtMTM5OSwyOSArNjIyLDMxIEBACiAKIAlzdHcJcjksUEFDQV9FWFNMQitFWF9DQ1IocjEzKQkvKiBzYXZlIENSIGluIGV4Yy4gZnJhbWUgKi8KIAlzdGQJcjEwLFBBQ0FfRVhTTEIrRVhfTFIocjEzKQkvKiBzYXZlIExSICovCisJc3RkCXIzLFBBQ0FfRVhTTEIrRVhfREFSKHIxMykKIAorCWNyc2V0CTQqY3IwK2VxCiAjaWZkZWYgQ09ORklHX1BQQ19TVERfTU1VXzY0CiBCRUdJTl9NTVVfRlRSX1NFQ1RJT04KIAlibAlzbGJfYWxsb2NhdGVfcmVhbG1vZGUKIEVORF9NTVVfRlRSX1NFQ1RJT05fSUZDTFIoTU1VX0ZUUl9UWVBFX1JBRElYKQogI2VuZGlmCi0JLyogQWxsIGRvbmUgLS0gcmV0dXJuIGZyb20gZXhjZXB0aW9uLiAqLwogCiAJbGQJcjEwLFBBQ0FfRVhTTEIrRVhfTFIocjEzKQogCWxkCXIzLFBBQ0FfRVhTTEIrRVhfUjMocjEzKQogCWx3eglyOSxQQUNBX0VYU0xCK0VYX0NDUihyMTMpCS8qIGdldCBzYXZlZCBDUiAqLwotCiAJbXRscglyMTAKKworCWJlcQk4ZgkJLyogaWYgYmFkIGFkZHJlc3MsIG1ha2UgZnVsbCBzdGFjayBmcmFtZSAqLworCiAJYW5kaS4JcjEwLHIxMixNU1JfUkkJLyogY2hlY2sgZm9yIHVucmVjb3ZlcmFibGUgZXhjZXB0aW9uICovCi1CRUdJTl9NTVVfRlRSX1NFQ1RJT04KIAliZXEtCTJmCi1GVFJfU0VDVElPTl9FTFNFCi0JYgkyZgotQUxUX01NVV9GVFJfU0VDVElPTl9FTkRfSUZDTFIoTU1VX0ZUUl9UWVBFX1JBRElYKQorCisJLyogQWxsIGRvbmUgLS0gcmV0dXJuIGZyb20gZXhjZXB0aW9uLiAqLwogCiAubWFjaGluZQlwdXNoCiAubWFjaGluZQkicG93ZXI0IgogCW10Y3JmCTB4ODAscjkKKwltdGNyZgkweDAyLHI5CQkvKiBJL0QgaW5kaWNhdGlvbiBpcyBpbiBjcjYgKi8KIAltdGNyZgkweDAxLHI5CQkvKiBzbGJfYWxsb2NhdGUgdXNlcyBjcjAgYW5kIGNyNyAqLwogLm1hY2hpbmUJcG9wCiAKQEAgLTE0MzUsNyArNjYwLDYgQEAKIAliCS4JLyogcHJldmVudCBzcGVjdWxhdGl2ZSBleGVjdXRpb24gKi8KIAogMjoJbWZzcHIJcjExLFNQUk5fU1JSMAotCWxkCXIxMCxQQUNBS0JBU0UocjEzKQogCUxPQURfSEFORExFUihyMTAsdW5yZWNvdl9zbGIpCiAJbXRzcHIJU1BSTl9TUlIwLHIxMAogCWxkCXIxMCxQQUNBS01TUihyMTMpCkBAIC0xNDQzLDcgKzY2NywxNSBAQAogCXJmaWQKIAliCS4KIAotdW5yZWNvdl9zbGI6Cis4OgltZnNwcglyMTEsU1BSTl9TUlIwCisJTE9BRF9IQU5ETEVSKHIxMCxiYWRfYWRkcl9zbGIpCisJbXRzcHIJU1BSTl9TUlIwLHIxMAorCWxkCXIxMCxQQUNBS01TUihyMTMpCisJbXRzcHIJU1BSTl9TUlIxLHIxMAorCXJmaWQKKwliCS4KKworRVhDX0NPTU1PTl9CRUdJTih1bnJlY292X3NsYikKIAlFWENFUFRJT05fUFJPTE9HX0NPTU1PTigweDQxMDAsIFBBQ0FfRVhTTEIpCiAJUkVDT05DSUxFX0lSUV9TVEFURShyMTAsIHIxMSkKIAlibAlzYXZlX252Z3BycwpAQCAtMTQ1MSw5ICs2ODMsNzAxIEBACiAJYmwJdW5yZWNvdmVyYWJsZV9leGNlcHRpb24KIAliCTFiCiAKK0VYQ19DT01NT05fQkVHSU4oYmFkX2FkZHJfc2xiKQorCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OKDB4MzgwLCBQQUNBX0VYU0xCKQorCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCisJbGQJcjMsIFBBQ0FfRVhTTEIrRVhfREFSKHIxMykKKwlzdGQJcjMsIF9EQVIocjEpCisJYmVxCWNyNiwgMmYKKwlsaQlyMTAsIDB4NDgwCQkvKiBmaXggdHJhcCBudW1iZXIgZm9yIEktU0xCIG1pc3MgKi8KKwlzdGQJcjEwLCBfVFJBUChyMSkKKzI6CWJsCXNhdmVfbnZncHJzCisJYWRkaQlyMywgcjEsIFNUQUNLX0ZSQU1FX09WRVJIRUFECisJYmwJc2xiX21pc3NfYmFkX2FkZHIKKwliCXJldF9mcm9tX2V4Y2VwdAorCitFWENfUkVBTF9CRUdJTihoYXJkd2FyZV9pbnRlcnJ1cHQsIDB4NTAwLCAweDYwMCkKKwkuZ2xvYmwgaGFyZHdhcmVfaW50ZXJydXB0X2h2OworaGFyZHdhcmVfaW50ZXJydXB0X2h2OgorCUJFR0lOX0ZUUl9TRUNUSU9OCisJCV9NQVNLQUJMRV9FWENFUFRJT05fUFNFUklFUygweDUwMCwgaGFyZHdhcmVfaW50ZXJydXB0X2NvbW1vbiwKKwkJCQkJICAgIEVYQ19IViwgU09GVEVOX1RFU1RfSFYpCitkb19rdm1fSDB4NTAwOgorCQlLVk1fSEFORExFUihQQUNBX0VYR0VOLCBFWENfSFYsIDB4NTAyKQorCUZUUl9TRUNUSU9OX0VMU0UKKwkJX01BU0tBQkxFX0VYQ0VQVElPTl9QU0VSSUVTKDB4NTAwLCBoYXJkd2FyZV9pbnRlcnJ1cHRfY29tbW9uLAorCQkJCQkgICAgRVhDX1NURCwgU09GVEVOX1RFU1RfUFIpCitkb19rdm1fMHg1MDA6CisJCUtWTV9IQU5ETEVSKFBBQ0FfRVhHRU4sIEVYQ19TVEQsIDB4NTAwKQorCUFMVF9GVFJfU0VDVElPTl9FTkRfSUZTRVQoQ1BVX0ZUUl9IVk1PREUgfCBDUFVfRlRSX0FSQ0hfMjA2KQorRVhDX1JFQUxfRU5EKGhhcmR3YXJlX2ludGVycnVwdCwgMHg1MDAsIDB4NjAwKQorCitFWENfVklSVF9CRUdJTihoYXJkd2FyZV9pbnRlcnJ1cHQsIDB4NDUwMCwgMHg0NjAwKQorCS5nbG9ibCBoYXJkd2FyZV9pbnRlcnJ1cHRfcmVsb25faHY7CitoYXJkd2FyZV9pbnRlcnJ1cHRfcmVsb25faHY6CisJQkVHSU5fRlRSX1NFQ1RJT04KKwkJX01BU0tBQkxFX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTKDB4NTAwLCBoYXJkd2FyZV9pbnRlcnJ1cHRfY29tbW9uLCBFWENfSFYsIFNPRlRFTl9URVNUX0hWKQorCUZUUl9TRUNUSU9OX0VMU0UKKwkJX01BU0tBQkxFX1JFTE9OX0VYQ0VQVElPTl9QU0VSSUVTKDB4NTAwLCBoYXJkd2FyZV9pbnRlcnJ1cHRfY29tbW9uLCBFWENfU1RELCBTT0ZURU5fVEVTVF9QUikKKwlBTFRfRlRSX1NFQ1RJT05fRU5EX0lGU0VUKENQVV9GVFJfSFZNT0RFKQorRVhDX1ZJUlRfRU5EKGhhcmR3YXJlX2ludGVycnVwdCwgMHg0NTAwLCAweDQ2MDApCisKK0VYQ19DT01NT05fQVNZTkMoaGFyZHdhcmVfaW50ZXJydXB0X2NvbW1vbiwgMHg1MDAsIGRvX0lSUSkKKworCitFWENfUkVBTChhbGlnbm1lbnQsIDB4NjAwLCAweDcwMCkKK0VYQ19WSVJUKGFsaWdubWVudCwgMHg0NjAwLCAweDQ3MDAsIDB4NjAwKQorVFJBTVBfS1ZNKFBBQ0FfRVhHRU4sIDB4NjAwKQorRVhDX0NPTU1PTl9CRUdJTihhbGlnbm1lbnRfY29tbW9uKQorCW1mc3ByCXIxMCxTUFJOX0RBUgorCXN0ZAlyMTAsUEFDQV9FWEdFTitFWF9EQVIocjEzKQorCW1mc3ByCXIxMCxTUFJOX0RTSVNSCisJc3R3CXIxMCxQQUNBX0VYR0VOK0VYX0RTSVNSKHIxMykKKwlFWENFUFRJT05fUFJPTE9HX0NPTU1PTigweDYwMCwgUEFDQV9FWEdFTikKKwlsZAlyMyxQQUNBX0VYR0VOK0VYX0RBUihyMTMpCisJbHd6CXI0LFBBQ0FfRVhHRU4rRVhfRFNJU1IocjEzKQorCXN0ZAlyMyxfREFSKHIxKQorCXN0ZAlyNCxfRFNJU1IocjEpCisJYmwJc2F2ZV9udmdwcnMKKwlSRUNPTkNJTEVfSVJRX1NUQVRFKHIxMCwgcjExKQorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlibAlhbGlnbm1lbnRfZXhjZXB0aW9uCisJYglyZXRfZnJvbV9leGNlcHQKKworCitFWENfUkVBTChwcm9ncmFtX2NoZWNrLCAweDcwMCwgMHg4MDApCitFWENfVklSVChwcm9ncmFtX2NoZWNrLCAweDQ3MDAsIDB4NDgwMCwgMHg3MDApCitUUkFNUF9LVk0oUEFDQV9FWEdFTiwgMHg3MDApCitFWENfQ09NTU9OX0JFR0lOKHByb2dyYW1fY2hlY2tfY29tbW9uKQorCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OKDB4NzAwLCBQQUNBX0VYR0VOKQorCWJsCXNhdmVfbnZncHJzCisJUkVDT05DSUxFX0lSUV9TVEFURShyMTAsIHIxMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJYmwJcHJvZ3JhbV9jaGVja19leGNlcHRpb24KKwliCXJldF9mcm9tX2V4Y2VwdAorCisKK0VYQ19SRUFMKGZwX3VuYXZhaWxhYmxlLCAweDgwMCwgMHg5MDApCitFWENfVklSVChmcF91bmF2YWlsYWJsZSwgMHg0ODAwLCAweDQ5MDAsIDB4ODAwKQorVFJBTVBfS1ZNKFBBQ0FfRVhHRU4sIDB4ODAwKQorRVhDX0NPTU1PTl9CRUdJTihmcF91bmF2YWlsYWJsZV9jb21tb24pCisJRVhDRVBUSU9OX1BST0xPR19DT01NT04oMHg4MDAsIFBBQ0FfRVhHRU4pCisJYm5lCTFmCQkJLyogaWYgZnJvbSB1c2VyLCBqdXN0IGxvYWQgaXQgdXAgKi8KKwlibAlzYXZlX252Z3BycworCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWJsCWtlcm5lbF9mcF91bmF2YWlsYWJsZV9leGNlcHRpb24KKwlCVUdfT1BDT0RFCisxOgorI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KK0JFR0lOX0ZUUl9TRUNUSU9OCisJLyogVGVzdCBpZiAyIFRNIHN0YXRlIGJpdHMgYXJlIHplcm8uICBJZiBub24temVybyAoaWUuIHVzZXJzcGFjZSB3YXMgaW4KKwkgKiB0cmFuc2FjdGlvbiksIGdvIGRvIFRNIHN0dWZmCisJICovCisJcmxkaWNsLglyMCwgcjEyLCAoNjQtTVNSX1RTX0xHKSwgKDY0LTIpCisJYm5lLQkyZgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfVE0pCisjZW5kaWYKKwlibAlsb2FkX3VwX2ZwdQorCWIJZmFzdF9leGNlcHRpb25fcmV0dXJuCisjaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQorMjoJLyogVXNlciBwcm9jZXNzIHdhcyBpbiBhIHRyYW5zYWN0aW9uICovCisJYmwJc2F2ZV9udmdwcnMKKwlSRUNPTkNJTEVfSVJRX1NUQVRFKHIxMCwgcjExKQorCWFkZGkJcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlibAlmcF91bmF2YWlsYWJsZV90bQorCWIJcmV0X2Zyb21fZXhjZXB0CisjZW5kaWYKKworCitFWENfUkVBTF9NQVNLQUJMRShkZWNyZW1lbnRlciwgMHg5MDAsIDB4OTgwKQorRVhDX1ZJUlRfTUFTS0FCTEUoZGVjcmVtZW50ZXIsIDB4NDkwMCwgMHg0OTgwLCAweDkwMCkKK1RSQU1QX0tWTShQQUNBX0VYR0VOLCAweDkwMCkKK0VYQ19DT01NT05fQVNZTkMoZGVjcmVtZW50ZXJfY29tbW9uLCAweDkwMCwgdGltZXJfaW50ZXJydXB0KQorCisKK0VYQ19SRUFMX0hWKGhkZWNyZW1lbnRlciwgMHg5ODAsIDB4YTAwKQorRVhDX1ZJUlRfSFYoaGRlY3JlbWVudGVyLCAweDQ5ODAsIDB4NGEwMCwgMHg5ODApCitUUkFNUF9LVk1fSFYoUEFDQV9FWEdFTiwgMHg5ODApCitFWENfQ09NTU9OKGhkZWNyZW1lbnRlcl9jb21tb24sIDB4OTgwLCBoZGVjX2ludGVycnVwdCkKKworCitFWENfUkVBTF9NQVNLQUJMRShkb29yYmVsbF9zdXBlciwgMHhhMDAsIDB4YjAwKQorRVhDX1ZJUlRfTUFTS0FCTEUoZG9vcmJlbGxfc3VwZXIsIDB4NGEwMCwgMHg0YjAwLCAweGEwMCkKK1RSQU1QX0tWTShQQUNBX0VYR0VOLCAweGEwMCkKKyNpZmRlZiBDT05GSUdfUFBDX0RPT1JCRUxMCitFWENfQ09NTU9OX0FTWU5DKGRvb3JiZWxsX3N1cGVyX2NvbW1vbiwgMHhhMDAsIGRvb3JiZWxsX2V4Y2VwdGlvbikKKyNlbHNlCitFWENfQ09NTU9OX0FTWU5DKGRvb3JiZWxsX3N1cGVyX2NvbW1vbiwgMHhhMDAsIHVua25vd25fZXhjZXB0aW9uKQorI2VuZGlmCisKKworRVhDX1JFQUwodHJhcF8wYiwgMHhiMDAsIDB4YzAwKQorRVhDX1ZJUlQodHJhcF8wYiwgMHg0YjAwLCAweDRjMDAsIDB4YjAwKQorVFJBTVBfS1ZNKFBBQ0FfRVhHRU4sIDB4YjAwKQorRVhDX0NPTU1PTih0cmFwXzBiX2NvbW1vbiwgMHhiMDAsIHVua25vd25fZXhjZXB0aW9uKQorCisKKyNkZWZpbmUgTE9BRF9TWVNDQUxMX0hBTkRMRVIocmVnKQkJCQlcCisJbGQJcmVnLFBBQ0FLQkFTRShyMTMpOwkJCQlcCisJb3JpCXJlZyxyZWcsKEFCU19BRERSKHN5c3RlbV9jYWxsX2NvbW1vbikpQGw7CisKKy8qIFN5c2NhbGwgcm91dGluZSBpcyB1c2VkIHR3aWNlLCBpbiByZWxvYy1vZmYgYW5kIHJlbG9jLW9uIHBhdGhzICovCisjZGVmaW5lIFNZU0NBTExfUFNFUklFU18xIAkJCQkJXAorQkVHSU5fRlRSX1NFQ1RJT04JCQkJCQlcCisJY21wZGkJcjAsMHgxZWJlIDsgCQkJCQlcCisJYmVxLQkxZiA7CQkJCQkJXAorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfUkVBTF9MRSkJCQkJXAorCW1yCXI5LHIxMyA7CQkJCQlcCisJR0VUX1BBQ0EocjEzKSA7CQkJCQkJXAorCW1mc3ByCXIxMSxTUFJOX1NSUjAgOwkJCQkJXAorMDoKKworI2RlZmluZSBTWVNDQUxMX1BTRVJJRVNfMl9SRklEIAkJCQkJXAorCW1mc3ByCXIxMixTUFJOX1NSUjEgOwkJCQkJXAorCUxPQURfU1lTQ0FMTF9IQU5ETEVSKHIxMCkgOyAJCQkJXAorCW10c3ByCVNQUk5fU1JSMCxyMTAgOyAJCQkJXAorCWxkCXIxMCxQQUNBS01TUihyMTMpIDsJCQkJXAorCW10c3ByCVNQUk5fU1JSMSxyMTAgOyAJCQkJXAorCXJmaWQgOyAJCQkJCQkJXAorCWIJLiA7CS8qIHByZXZlbnQgc3BlY3VsYXRpdmUgZXhlY3V0aW9uICovCisKKyNkZWZpbmUgU1lTQ0FMTF9QU0VSSUVTXzMJCQkJCVwKKwkvKiBGYXN0IExFL0JFIHN3aXRjaCBzeXN0ZW0gY2FsbCAqLwkJCVwKKzE6CW1mc3ByCXIxMixTUFJOX1NSUjEgOwkJCQkJXAorCXhvcmkJcjEyLHIxMixNU1JfTEUgOwkJCQlcCisJbXRzcHIJU1BSTl9TUlIxLHIxMiA7CQkJCQlcCisJcmZpZCA7CQkvKiByZXR1cm4gdG8gdXNlcnNwYWNlICovCQlcCisJYgkuIDsJLyogcHJldmVudCBzcGVjdWxhdGl2ZSBleGVjdXRpb24gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1JFTE9DQVRBQkxFKQorCS8qCisJICogV2UgY2FuJ3QgYnJhbmNoIGRpcmVjdGx5IHNvIHdlIGRvIGl0IHZpYSB0aGUgQ1RSIHdoaWNoCisJICogaXMgdm9sYXRpbGUgYWNyb3NzIHN5c3RlbSBjYWxscy4KKwkgKi8KKyNkZWZpbmUgU1lTQ0FMTF9QU0VSSUVTXzJfRElSRUNUCQkJCVwKKwlMT0FEX1NZU0NBTExfSEFORExFUihyMTIpIDsJCQkJXAorCW10Y3RyCXIxMiA7CQkJCQkJXAorCW1mc3ByCXIxMixTUFJOX1NSUjEgOwkJCQkJXAorCWxpCXIxMCxNU1JfUkkgOwkJCQkJXAorCW10bXNyZCAJcjEwLDEgOwkJCQkJCVwKKwliY3RyIDsKKyNlbHNlCisJLyogV2UgY2FuIGJyYW5jaCBkaXJlY3RseSAqLworI2RlZmluZSBTWVNDQUxMX1BTRVJJRVNfMl9ESVJFQ1QJCQkJXAorCW1mc3ByCXIxMixTUFJOX1NSUjEgOwkJCQkJXAorCWxpCXIxMCxNU1JfUkkgOwkJCQkJXAorCW10bXNyZCAJcjEwLDEgOwkJCS8qIFNldCBSSSAoRUU9MCkgKi8JXAorCWIJc3lzdGVtX2NhbGxfY29tbW9uIDsKKyNlbmRpZgorCitFWENfUkVBTF9CRUdJTihzeXN0ZW1fY2FsbCwgMHhjMDAsIDB4ZDAwKQorCSAvKgorCSAgKiBJZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSIGlzIHNldCwgc2F2ZSB0aGUgUFBSIChvbiBzeXN0ZW1zCisJICAqIHRoYXQgc3VwcG9ydCBpdCkgYmVmb3JlIGNoYW5naW5nIHRvIEhNVF9NRURJVU0uIFRoYXQgYWxsb3dzIHRoZSBLVk0KKwkgICogY29kZSB0byBzYXZlIHRoYXQgdmFsdWUgaW50byB0aGUgZ3Vlc3Qgc3RhdGUgKGl0IGlzIHRoZSBndWVzdCdzIFBQUgorCSAgKiB2YWx1ZSkuIE90aGVyd2lzZSBqdXN0IGNoYW5nZSB0byBITVRfTUVESVVNIGFzIHVzZXJzcGFjZSBoYXMKKwkgICogYWxyZWFkeSBzYXZlZCB0aGUgUFBSLgorCSAgKi8KKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSCisJU0VUX1NDUkFUQ0gwKHIxMykKKwlHRVRfUEFDQShyMTMpCisJc3RkCXI5LFBBQ0FfRVhHRU4rRVhfUjkocjEzKQorCU9QVF9HRVRfU1BSKHI5LCBTUFJOX1BQUiwgQ1BVX0ZUUl9IQVNfUFBSKTsKKwlITVRfTUVESVVNOworCXN0ZAlyMTAsUEFDQV9FWEdFTitFWF9SMTAocjEzKQorCU9QVF9TQVZFX1JFR19UT19QQUNBKFBBQ0FfRVhHRU4rRVhfUFBSLCByOSwgQ1BVX0ZUUl9IQVNfUFBSKTsKKwltZmNyCXI5CisJS1ZNVEVTVF9QUigweGMwMCkKKwlHRVRfU0NSQVRDSDAocjEzKQorI2Vsc2UKKwlITVRfTUVESVVNOworI2VuZGlmCisJU1lTQ0FMTF9QU0VSSUVTXzEKKwlTWVNDQUxMX1BTRVJJRVNfMl9SRklECisJU1lTQ0FMTF9QU0VSSUVTXzMKK0VYQ19SRUFMX0VORChzeXN0ZW1fY2FsbCwgMHhjMDAsIDB4ZDAwKQorCitFWENfVklSVF9CRUdJTihzeXN0ZW1fY2FsbCwgMHg0YzAwLCAweDRkMDApCisJSE1UX01FRElVTQorCVNZU0NBTExfUFNFUklFU18xCisJU1lTQ0FMTF9QU0VSSUVTXzJfRElSRUNUCisJU1lTQ0FMTF9QU0VSSUVTXzMKK0VYQ19WSVJUX0VORChzeXN0ZW1fY2FsbCwgMHg0YzAwLCAweDRkMDApCisKK1RSQU1QX0tWTShQQUNBX0VYR0VOLCAweGMwMCkKKworCitFWENfUkVBTChzaW5nbGVfc3RlcCwgMHhkMDAsIDB4ZTAwKQorRVhDX1ZJUlQoc2luZ2xlX3N0ZXAsIDB4NGQwMCwgMHg0ZTAwLCAweGQwMCkKK1RSQU1QX0tWTShQQUNBX0VYR0VOLCAweGQwMCkKK0VYQ19DT01NT04oc2luZ2xlX3N0ZXBfY29tbW9uLCAweGQwMCwgc2luZ2xlX3N0ZXBfZXhjZXB0aW9uKQorCitFWENfUkVBTF9PT0xfSFYoaF9kYXRhX3N0b3JhZ2UsIDB4ZTAwLCAweGUyMCkKK0VYQ19WSVJUX05PTkUoMHg0ZTAwLCAweDRlMjApCitUUkFNUF9LVk1fSFZfU0tJUChQQUNBX0VYR0VOLCAweGUwMCkKK0VYQ19DT01NT05fQkVHSU4oaF9kYXRhX3N0b3JhZ2VfY29tbW9uKQorCW1mc3ByICAgcjEwLFNQUk5fSERBUgorCXN0ZCAgICAgcjEwLFBBQ0FfRVhHRU4rRVhfREFSKHIxMykKKwltZnNwciAgIHIxMCxTUFJOX0hEU0lTUgorCXN0dyAgICAgcjEwLFBBQ0FfRVhHRU4rRVhfRFNJU1IocjEzKQorCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OKDB4ZTAwLCBQQUNBX0VYR0VOKQorCWJsICAgICAgc2F2ZV9udmdwcnMKKwlSRUNPTkNJTEVfSVJRX1NUQVRFKHIxMCwgcjExKQorCWFkZGkgICAgcjMscjEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKKwlibCAgICAgIHVua25vd25fZXhjZXB0aW9uCisJYiAgICAgICByZXRfZnJvbV9leGNlcHQKKworCitFWENfUkVBTF9PT0xfSFYoaF9pbnN0cl9zdG9yYWdlLCAweGUyMCwgMHhlNDApCitFWENfVklSVF9OT05FKDB4NGUyMCwgMHg0ZTQwKQorVFJBTVBfS1ZNX0hWKFBBQ0FfRVhHRU4sIDB4ZTIwKQorRVhDX0NPTU1PTihoX2luc3RyX3N0b3JhZ2VfY29tbW9uLCAweGUyMCwgdW5rbm93bl9leGNlcHRpb24pCisKKworRVhDX1JFQUxfT09MX0hWKGVtdWxhdGlvbl9hc3Npc3QsIDB4ZTQwLCAweGU2MCkKK0VYQ19WSVJUX09PTF9IVihlbXVsYXRpb25fYXNzaXN0LCAweDRlNDAsIDB4NGU2MCwgMHhlNDApCitUUkFNUF9LVk1fSFYoUEFDQV9FWEdFTiwgMHhlNDApCitFWENfQ09NTU9OKGVtdWxhdGlvbl9hc3Npc3RfY29tbW9uLCAweGU0MCwgZW11bGF0aW9uX2Fzc2lzdF9pbnRlcnJ1cHQpCisKKworLyoKKyAqIGhtaV9leGNlcHRpb24gdHJhbXBvbGluZSBpcyBhIHNwZWNpYWwgY2FzZS4gSXQganVtcHMgdG8gaG1pX2V4Y2VwdGlvbl9lYXJseQorICogZmlyc3QsIGFuZCB0aGVuIGV2ZW50YXVsbHkgZnJvbSB0aGVyZSB0byB0aGUgdHJhbXBvbGluZSB0byBnZXQgaW50byB2aXJ0dWFsCisgKiBtb2RlLgorICovCitfX0VYQ19SRUFMX09PTF9IVl9ESVJFQ1QoaG1pX2V4Y2VwdGlvbiwgMHhlNjAsIDB4ZTgwLCBobWlfZXhjZXB0aW9uX2Vhcmx5KQorX19UUkFNUF9SRUFMX1JFQUxfT09MX01BU0tBQkxFX0hWKGhtaV9leGNlcHRpb24sIDB4ZTYwKQorRVhDX1ZJUlRfTk9ORSgweDRlNjAsIDB4NGU4MCkKK1RSQU1QX0tWTV9IVihQQUNBX0VYR0VOLCAweGU2MCkKK1RSQU1QX1JFQUxfQkVHSU4oaG1pX2V4Y2VwdGlvbl9lYXJseSkKKwlFWENFUFRJT05fUFJPTE9HXzEoUEFDQV9FWEdFTiwgS1ZNVEVTVF9IViwgMHhlNjApCisJbXIJcjEwLHIxCQkJLyogU2F2ZSByMQkJCSovCisJbGQJcjEsUEFDQUVNRVJHU1AocjEzKQkvKiBVc2UgZW1lcmdlbmN5IHN0YWNrCQkqLworCXN1YmkJcjEscjEsSU5UX0ZSQU1FX1NJWkUJLyogYWxsb2Mgc3RhY2sgZnJhbWUJCSovCisJc3RkCXI5LF9DQ1IocjEpCQkvKiBzYXZlIENSIGluIHN0YWNrZnJhbWUJKi8KKwltZnNwcglyMTEsU1BSTl9IU1JSMAkJLyogU2F2ZSBIU1JSMCAqLworCXN0ZAlyMTEsX05JUChyMSkJCS8qIHNhdmUgSFNSUjAgaW4gc3RhY2tmcmFtZQkqLworCW1mc3ByCXIxMixTUFJOX0hTUlIxCQkvKiBTYXZlIFNSUjEgKi8KKwlzdGQJcjEyLF9NU1IocjEpCQkvKiBzYXZlIFNSUjEgaW4gc3RhY2tmcmFtZQkqLworCXN0ZAlyMTAsMChyMSkJCS8qIG1ha2Ugc3RhY2sgY2hhaW4gcG9pbnRlcgkqLworCXN0ZAlyMCxHUFIwKHIxKQkJLyogc2F2ZSByMCBpbiBzdGFja2ZyYW1lCSovCisJc3RkCXIxMCxHUFIxKHIxKQkJLyogc2F2ZSByMSBpbiBzdGFja2ZyYW1lCSovCisJRVhDRVBUSU9OX1BST0xPR19DT01NT05fMihQQUNBX0VYR0VOKQorCUVYQ0VQVElPTl9QUk9MT0dfQ09NTU9OXzMoMHhlNjApCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWJsCWhtaV9leGNlcHRpb25fcmVhbG1vZGUKKwkvKiBXaW5kdXAgdGhlIHN0YWNrLiAqLworCS8qIE1vdmUgb3JpZ2luYWwgSFNSUjAgYW5kIEhTUlIxIGludG8gdGhlIHJlc3BlY3RpdmUgcmVncyAqLworCWxkCXI5LF9NU1IocjEpCisJbXRzcHIJU1BSTl9IU1JSMSxyOQorCWxkCXIzLF9OSVAocjEpCisJbXRzcHIJU1BSTl9IU1JSMCxyMworCWxkCXI5LF9DVFIocjEpCisJbXRjdHIJcjkKKwlsZAlyOSxfWEVSKHIxKQorCW10eGVyCXI5CisJbGQJcjksX0xJTksocjEpCisJbXRscglyOQorCVJFU1RfR1BSKDAsIHIxKQorCVJFU1RfOEdQUlMoMiwgcjEpCisJUkVTVF9HUFIoMTAsIHIxKQorCWxkCXIxMSxfQ0NSKHIxKQorCW10Y3IJcjExCisJUkVTVF9HUFIoMTEsIHIxKQorCVJFU1RfMkdQUlMoMTIsIHIxKQorCS8qIHJlc3RvcmUgb3JpZ2luYWwgcjEuICovCisJbGQJcjEsR1BSMShyMSkKKworCS8qCisJICogR28gdG8gdmlydHVhbCBtb2RlIGFuZCBwdWxsIHRoZSBITUkgZXZlbnQgaW5mb3JtYXRpb24gZnJvbQorCSAqIGZpcm13YXJlLgorCSAqLworCS5nbG9ibCBobWlfZXhjZXB0aW9uX2FmdGVyX3JlYWxtb2RlCitobWlfZXhjZXB0aW9uX2FmdGVyX3JlYWxtb2RlOgorCVNFVF9TQ1JBVENIMChyMTMpCisJRVhDRVBUSU9OX1BST0xPR18wKFBBQ0FfRVhHRU4pCisJYgl0cmFtcF9yZWFsX2htaV9leGNlcHRpb24KKworRVhDX0NPTU1PTl9BU1lOQyhobWlfZXhjZXB0aW9uX2NvbW1vbiwgMHhlNjAsIGhhbmRsZV9obWlfZXhjZXB0aW9uKQorCisKK0VYQ19SRUFMX09PTF9NQVNLQUJMRV9IVihoX2Rvb3JiZWxsLCAweGU4MCwgMHhlYTApCitFWENfVklSVF9PT0xfTUFTS0FCTEVfSFYoaF9kb29yYmVsbCwgMHg0ZTgwLCAweDRlYTAsIDB4ZTgwKQorVFJBTVBfS1ZNX0hWKFBBQ0FfRVhHRU4sIDB4ZTgwKQorI2lmZGVmIENPTkZJR19QUENfRE9PUkJFTEwKK0VYQ19DT01NT05fQVNZTkMoaF9kb29yYmVsbF9jb21tb24sIDB4ZTgwLCBkb29yYmVsbF9leGNlcHRpb24pCisjZWxzZQorRVhDX0NPTU1PTl9BU1lOQyhoX2Rvb3JiZWxsX2NvbW1vbiwgMHhlODAsIHVua25vd25fZXhjZXB0aW9uKQorI2VuZGlmCisKKworRVhDX1JFQUxfT09MX01BU0tBQkxFX0hWKGhfdmlydF9pcnEsIDB4ZWEwLCAweGVjMCkKK0VYQ19WSVJUX09PTF9NQVNLQUJMRV9IVihoX3ZpcnRfaXJxLCAweDRlYTAsIDB4NGVjMCwgMHhlYTApCitUUkFNUF9LVk1fSFYoUEFDQV9FWEdFTiwgMHhlYTApCitFWENfQ09NTU9OX0FTWU5DKGhfdmlydF9pcnFfY29tbW9uLCAweGVhMCwgZG9fSVJRKQorCisKK0VYQ19SRUFMX05PTkUoMHhlYzAsIDB4ZjAwKQorRVhDX1ZJUlRfTk9ORSgweDRlYzAsIDB4NGYwMCkKKworCitFWENfUkVBTF9PT0wocGVyZm9ybWFuY2VfbW9uaXRvciwgMHhmMDAsIDB4ZjIwKQorRVhDX1ZJUlRfT09MKHBlcmZvcm1hbmNlX21vbml0b3IsIDB4NGYwMCwgMHg0ZjIwLCAweGYwMCkKK1RSQU1QX0tWTShQQUNBX0VYR0VOLCAweGYwMCkKK0VYQ19DT01NT05fQVNZTkMocGVyZm9ybWFuY2VfbW9uaXRvcl9jb21tb24sIDB4ZjAwLCBwZXJmb3JtYW5jZV9tb25pdG9yX2V4Y2VwdGlvbikKKworCitFWENfUkVBTF9PT0woYWx0aXZlY191bmF2YWlsYWJsZSwgMHhmMjAsIDB4ZjQwKQorRVhDX1ZJUlRfT09MKGFsdGl2ZWNfdW5hdmFpbGFibGUsIDB4NGYyMCwgMHg0ZjQwLCAweGYyMCkKK1RSQU1QX0tWTShQQUNBX0VYR0VOLCAweGYyMCkKK0VYQ19DT01NT05fQkVHSU4oYWx0aXZlY191bmF2YWlsYWJsZV9jb21tb24pCisJRVhDRVBUSU9OX1BST0xPR19DT01NT04oMHhmMjAsIFBBQ0FfRVhHRU4pCisjaWZkZWYgQ09ORklHX0FMVElWRUMKK0JFR0lOX0ZUUl9TRUNUSU9OCisJYmVxCTFmCisjaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQorICBCRUdJTl9GVFJfU0VDVElPTl9ORVNURUQoNjkpCisJLyogVGVzdCBpZiAyIFRNIHN0YXRlIGJpdHMgYXJlIHplcm8uICBJZiBub24temVybyAoaWUuIHVzZXJzcGFjZSB3YXMgaW4KKwkgKiB0cmFuc2FjdGlvbiksIGdvIGRvIFRNIHN0dWZmCisJICovCisJcmxkaWNsLglyMCwgcjEyLCAoNjQtTVNSX1RTX0xHKSwgKDY0LTIpCisJYm5lLQkyZgorICBFTkRfRlRSX1NFQ1RJT05fTkVTVEVEKENQVV9GVFJfVE0sIENQVV9GVFJfVE0sIDY5KQorI2VuZGlmCisJYmwJbG9hZF91cF9hbHRpdmVjCisJYglmYXN0X2V4Y2VwdGlvbl9yZXR1cm4KKyNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCisyOgkvKiBVc2VyIHByb2Nlc3Mgd2FzIGluIGEgdHJhbnNhY3Rpb24gKi8KKwlibAlzYXZlX252Z3BycworCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWJsCWFsdGl2ZWNfdW5hdmFpbGFibGVfdG0KKwliCXJldF9mcm9tX2V4Y2VwdAorI2VuZGlmCisxOgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfQUxUSVZFQykKKyNlbmRpZgorCWJsCXNhdmVfbnZncHJzCisJUkVDT05DSUxFX0lSUV9TVEFURShyMTAsIHIxMSkKKwlhZGRpCXIzLHIxLFNUQUNLX0ZSQU1FX09WRVJIRUFECisJYmwJYWx0aXZlY191bmF2YWlsYWJsZV9leGNlcHRpb24KKwliCXJldF9mcm9tX2V4Y2VwdAorCisKK0VYQ19SRUFMX09PTCh2c3hfdW5hdmFpbGFibGUsIDB4ZjQwLCAweGY2MCkKK0VYQ19WSVJUX09PTCh2c3hfdW5hdmFpbGFibGUsIDB4NGY0MCwgMHg0ZjYwLCAweGY0MCkKK1RSQU1QX0tWTShQQUNBX0VYR0VOLCAweGY0MCkKK0VYQ19DT01NT05fQkVHSU4odnN4X3VuYXZhaWxhYmxlX2NvbW1vbikKKwlFWENFUFRJT05fUFJPTE9HX0NPTU1PTigweGY0MCwgUEFDQV9FWEdFTikKKyNpZmRlZiBDT05GSUdfVlNYCitCRUdJTl9GVFJfU0VDVElPTgorCWJlcQkxZgorI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KKyAgQkVHSU5fRlRSX1NFQ1RJT05fTkVTVEVEKDY5KQorCS8qIFRlc3QgaWYgMiBUTSBzdGF0ZSBiaXRzIGFyZSB6ZXJvLiAgSWYgbm9uLXplcm8gKGllLiB1c2Vyc3BhY2Ugd2FzIGluCisJICogdHJhbnNhY3Rpb24pLCBnbyBkbyBUTSBzdHVmZgorCSAqLworCXJsZGljbC4JcjAsIHIxMiwgKDY0LU1TUl9UU19MRyksICg2NC0yKQorCWJuZS0JMmYKKyAgRU5EX0ZUUl9TRUNUSU9OX05FU1RFRChDUFVfRlRSX1RNLCBDUFVfRlRSX1RNLCA2OSkKKyNlbmRpZgorCWIJbG9hZF91cF92c3gKKyNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCisyOgkvKiBVc2VyIHByb2Nlc3Mgd2FzIGluIGEgdHJhbnNhY3Rpb24gKi8KKwlibAlzYXZlX252Z3BycworCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWJsCXZzeF91bmF2YWlsYWJsZV90bQorCWIJcmV0X2Zyb21fZXhjZXB0CisjZW5kaWYKKzE6CitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9WU1gpCisjZW5kaWYKKwlibAlzYXZlX252Z3BycworCVJFQ09OQ0lMRV9JUlFfU1RBVEUocjEwLCByMTEpCisJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAorCWJsCXZzeF91bmF2YWlsYWJsZV9leGNlcHRpb24KKwliCXJldF9mcm9tX2V4Y2VwdAorCisKK0VYQ19SRUFMX09PTChmYWNpbGl0eV91bmF2YWlsYWJsZSwgMHhmNjAsIDB4ZjgwKQorRVhDX1ZJUlRfT09MKGZhY2lsaXR5X3VuYXZhaWxhYmxlLCAweDRmNjAsIDB4NGY4MCwgMHhmNjApCitUUkFNUF9LVk0oUEFDQV9FWEdFTiwgMHhmNjApCitFWENfQ09NTU9OKGZhY2lsaXR5X3VuYXZhaWxhYmxlX2NvbW1vbiwgMHhmNjAsIGZhY2lsaXR5X3VuYXZhaWxhYmxlX2V4Y2VwdGlvbikKKworCitFWENfUkVBTF9PT0xfSFYoaF9mYWNpbGl0eV91bmF2YWlsYWJsZSwgMHhmODAsIDB4ZmEwKQorRVhDX1ZJUlRfT09MX0hWKGhfZmFjaWxpdHlfdW5hdmFpbGFibGUsIDB4NGY4MCwgMHg0ZmEwLCAweGY4MCkKK1RSQU1QX0tWTV9IVihQQUNBX0VYR0VOLCAweGY4MCkKK0VYQ19DT01NT04oaF9mYWNpbGl0eV91bmF2YWlsYWJsZV9jb21tb24sIDB4ZjgwLCBmYWNpbGl0eV91bmF2YWlsYWJsZV9leGNlcHRpb24pCisKKworRVhDX1JFQUxfTk9ORSgweGZhMCwgMHgxMjAwKQorRVhDX1ZJUlRfTk9ORSgweDRmYTAsIDB4NTIwMCkKKworI2lmZGVmIENPTkZJR19DQkVfUkFTCitFWENfUkVBTF9IVihjYmVfc3lzdGVtX2Vycm9yLCAweDEyMDAsIDB4MTMwMCkKK0VYQ19WSVJUX05PTkUoMHg1MjAwLCAweDUzMDApCitUUkFNUF9LVk1fSFZfU0tJUChQQUNBX0VYR0VOLCAweDEyMDApCitFWENfQ09NTU9OKGNiZV9zeXN0ZW1fZXJyb3JfY29tbW9uLCAweDEyMDAsIGNiZV9zeXN0ZW1fZXJyb3JfZXhjZXB0aW9uKQorI2Vsc2UgLyogQ09ORklHX0NCRV9SQVMgKi8KK0VYQ19SRUFMX05PTkUoMHgxMjAwLCAweDEzMDApCitFWENfVklSVF9OT05FKDB4NTIwMCwgMHg1MzAwKQorI2VuZGlmCisKKworRVhDX1JFQUwoaW5zdHJ1Y3Rpb25fYnJlYWtwb2ludCwgMHgxMzAwLCAweDE0MDApCitFWENfVklSVChpbnN0cnVjdGlvbl9icmVha3BvaW50LCAweDUzMDAsIDB4NTQwMCwgMHgxMzAwKQorVFJBTVBfS1ZNX1NLSVAoUEFDQV9FWEdFTiwgMHgxMzAwKQorRVhDX0NPTU1PTihpbnN0cnVjdGlvbl9icmVha3BvaW50X2NvbW1vbiwgMHgxMzAwLCBpbnN0cnVjdGlvbl9icmVha3BvaW50X2V4Y2VwdGlvbikKKworRVhDX1JFQUxfTk9ORSgweDE0MDAsIDB4MTUwMCkKK0VYQ19WSVJUX05PTkUoMHg1NDAwLCAweDU1MDApCisKK0VYQ19SRUFMX0JFR0lOKGRlbm9ybV9leGNlcHRpb25faHYsIDB4MTUwMCwgMHgxNjAwKQorCW10c3ByCVNQUk5fU1BSR19IU0NSQVRDSDAscjEzCisJRVhDRVBUSU9OX1BST0xPR18wKFBBQ0FfRVhHRU4pCisJRVhDRVBUSU9OX1BST0xPR18xKFBBQ0FfRVhHRU4sIE5PVEVTVCwgMHgxNTAwKQorCisjaWZkZWYgQ09ORklHX1BQQ19ERU5PUk1BTElTQVRJT04KKwltZnNwcglyMTAsU1BSTl9IU1JSMQorCW1mc3ByCXIxMSxTUFJOX0hTUlIwCQkvKiBzYXZlIEhTUlIwICovCisJYW5kaXMuCXIxMCxyMTAsKEhTUlIxX0RFTk9STSlAaCAvKiBkZW5vcm0/ICovCisJYWRkaQlyMTEscjExLC00CQkvKiBIU1JSMCBpcyBuZXh0IGluc3RydWN0aW9uICovCisJYm5lKwlkZW5vcm1fYXNzaXN0CisjZW5kaWYKKworCUtWTVRFU1RfUFIoMHgxNTAwKQorCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFU18xKGRlbm9ybV9jb21tb24sIEVYQ19IVikKK0VYQ19SRUFMX0VORChkZW5vcm1fZXhjZXB0aW9uX2h2LCAweDE1MDAsIDB4MTYwMCkKKworI2lmZGVmIENPTkZJR19QUENfREVOT1JNQUxJU0FUSU9OCitFWENfVklSVF9CRUdJTihkZW5vcm1fZXhjZXB0aW9uLCAweDU1MDAsIDB4NTYwMCkKKwliCWV4Y19yZWFsXzB4MTUwMF9kZW5vcm1fZXhjZXB0aW9uX2h2CitFWENfVklSVF9FTkQoZGVub3JtX2V4Y2VwdGlvbiwgMHg1NTAwLCAweDU2MDApCisjZWxzZQorRVhDX1ZJUlRfTk9ORSgweDU1MDAsIDB4NTYwMCkKKyNlbmRpZgorCitUUkFNUF9LVk1fU0tJUChQQUNBX0VYR0VOLCAweDE1MDApCisKKyNpZmRlZiBDT05GSUdfUFBDX0RFTk9STUFMSVNBVElPTgorVFJBTVBfUkVBTF9CRUdJTihkZW5vcm1fYXNzaXN0KQorQkVHSU5fRlRSX1NFQ1RJT04KKy8qCisgKiBUbyBkZW5vcm1hbGlzZSB3ZSBuZWVkIHRvIG1vdmUgYSBjb3B5IG9mIHRoZSByZWdpc3RlciB0byBpdHNlbGYuCisgKiBGb3IgUE9XRVI2IGRvIHRoYXQgaGVyZSBmb3IgYWxsIEZQIHJlZ3MuCisgKi8KKwltZm1zcglyMTAKKwlvcmkJcjEwLHIxMCwoTVNSX0ZQfE1TUl9GRTB8TVNSX0ZFMSkKKwl4b3JpCXIxMCxyMTAsKE1TUl9GRTB8TVNSX0ZFMSkKKwltdG1zcmQJcjEwCisJc3luYworCisjZGVmaW5lIEZNUjIobikgIGZtciAobiksIChuKSA7IGZtciBuKzEsIG4rMQorI2RlZmluZSBGTVI0KG4pICBGTVIyKG4pIDsgRk1SMihuKzIpCisjZGVmaW5lIEZNUjgobikgIEZNUjQobikgOyBGTVI0KG4rNCkKKyNkZWZpbmUgRk1SMTYobikgRk1SOChuKSA7IEZNUjgobis4KQorI2RlZmluZSBGTVIzMihuKSBGTVIxNihuKSA7IEZNUjE2KG4rMTYpCisJRk1SMzIoMCkKKworRlRSX1NFQ1RJT05fRUxTRQorLyoKKyAqIFRvIGRlbm9ybWFsaXNlIHdlIG5lZWQgdG8gbW92ZSBhIGNvcHkgb2YgdGhlIHJlZ2lzdGVyIHRvIGl0c2VsZi4KKyAqIEZvciBQT1dFUjcgZG8gdGhhdCBoZXJlIGZvciB0aGUgZmlyc3QgMzIgVlNYIHJlZ2lzdGVycyBvbmx5LgorICovCisJbWZtc3IJcjEwCisJb3JpcwlyMTAscjEwLE1TUl9WU1hAaAorCW10bXNyZAlyMTAKKwlzeW5jCisKKyNkZWZpbmUgWFZDUFNHTkRQMihuKSBYVkNQU0dORFAobixuLG4pIDsgWFZDUFNHTkRQKG4rMSxuKzEsbisxKQorI2RlZmluZSBYVkNQU0dORFA0KG4pIFhWQ1BTR05EUDIobikgOyBYVkNQU0dORFAyKG4rMikKKyNkZWZpbmUgWFZDUFNHTkRQOChuKSBYVkNQU0dORFA0KG4pIDsgWFZDUFNHTkRQNChuKzQpCisjZGVmaW5lIFhWQ1BTR05EUDE2KG4pIFhWQ1BTR05EUDgobikgOyBYVkNQU0dORFA4KG4rOCkKKyNkZWZpbmUgWFZDUFNHTkRQMzIobikgWFZDUFNHTkRQMTYobikgOyBYVkNQU0dORFAxNihuKzE2KQorCVhWQ1BTR05EUDMyKDApCisKK0FMVF9GVFJfU0VDVElPTl9FTkRfSUZDTFIoQ1BVX0ZUUl9BUkNIXzIwNikKKworQkVHSU5fRlRSX1NFQ1RJT04KKwliCWRlbm9ybV9kb25lCitFTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9BUkNIXzIwN1MpCisvKgorICogVG8gZGVub3JtYWxpc2Ugd2UgbmVlZCB0byBtb3ZlIGEgY29weSBvZiB0aGUgcmVnaXN0ZXIgdG8gaXRzZWxmLgorICogRm9yIFBPV0VSOCB3ZSBuZWVkIHRvIGRvIHRoYXQgZm9yIGFsbCA2NCBWU1ggcmVnaXN0ZXJzCisgKi8KKwlYVkNQU0dORFAzMigzMikKK2Rlbm9ybV9kb25lOgorCW10c3ByCVNQUk5fSFNSUjAscjExCisJbXRjcmYJMHg4MCxyOQorCWxkCXI5LFBBQ0FfRVhHRU4rRVhfUjkocjEzKQorCVJFU1RPUkVfUFBSX1BBQ0EoUEFDQV9FWEdFTiwgcjEwKQorQkVHSU5fRlRSX1NFQ1RJT04KKwlsZAlyMTAsUEFDQV9FWEdFTitFWF9DRkFSKHIxMykKKwltdHNwcglTUFJOX0NGQVIscjEwCitFTkRfRlRSX1NFQ1RJT05fSUZTRVQoQ1BVX0ZUUl9DRkFSKQorCWxkCXIxMCxQQUNBX0VYR0VOK0VYX1IxMChyMTMpCisJbGQJcjExLFBBQ0FfRVhHRU4rRVhfUjExKHIxMykKKwlsZAlyMTIsUEFDQV9FWEdFTitFWF9SMTIocjEzKQorCWxkCXIxMyxQQUNBX0VYR0VOK0VYX1IxMyhyMTMpCisJSFJGSUQKKwliCS4KKyNlbmRpZgorCitFWENfQ09NTU9OX0hWKGRlbm9ybV9jb21tb24sIDB4MTUwMCwgdW5rbm93bl9leGNlcHRpb24pCisKKworI2lmZGVmIENPTkZJR19DQkVfUkFTCitFWENfUkVBTF9IVihjYmVfbWFpbnRlbmFuY2UsIDB4MTYwMCwgMHgxNzAwKQorRVhDX1ZJUlRfTk9ORSgweDU2MDAsIDB4NTcwMCkKK1RSQU1QX0tWTV9IVl9TS0lQKFBBQ0FfRVhHRU4sIDB4MTYwMCkKK0VYQ19DT01NT04oY2JlX21haW50ZW5hbmNlX2NvbW1vbiwgMHgxNjAwLCBjYmVfbWFpbnRlbmFuY2VfZXhjZXB0aW9uKQorI2Vsc2UgLyogQ09ORklHX0NCRV9SQVMgKi8KK0VYQ19SRUFMX05PTkUoMHgxNjAwLCAweDE3MDApCitFWENfVklSVF9OT05FKDB4NTYwMCwgMHg1NzAwKQorI2VuZGlmCisKKworRVhDX1JFQUwoYWx0aXZlY19hc3Npc3QsIDB4MTcwMCwgMHgxODAwKQorRVhDX1ZJUlQoYWx0aXZlY19hc3Npc3QsIDB4NTcwMCwgMHg1ODAwLCAweDE3MDApCitUUkFNUF9LVk0oUEFDQV9FWEdFTiwgMHgxNzAwKQorI2lmZGVmIENPTkZJR19BTFRJVkVDCitFWENfQ09NTU9OKGFsdGl2ZWNfYXNzaXN0X2NvbW1vbiwgMHgxNzAwLCBhbHRpdmVjX2Fzc2lzdF9leGNlcHRpb24pCisjZWxzZQorRVhDX0NPTU1PTihhbHRpdmVjX2Fzc2lzdF9jb21tb24sIDB4MTcwMCwgdW5rbm93bl9leGNlcHRpb24pCisjZW5kaWYKKworCisjaWZkZWYgQ09ORklHX0NCRV9SQVMKK0VYQ19SRUFMX0hWKGNiZV90aGVybWFsLCAweDE4MDAsIDB4MTkwMCkKK0VYQ19WSVJUX05PTkUoMHg1ODAwLCAweDU5MDApCitUUkFNUF9LVk1fSFZfU0tJUChQQUNBX0VYR0VOLCAweDE4MDApCitFWENfQ09NTU9OKGNiZV90aGVybWFsX2NvbW1vbiwgMHgxODAwLCBjYmVfdGhlcm1hbF9leGNlcHRpb24pCisjZWxzZSAvKiBDT05GSUdfQ0JFX1JBUyAqLworRVhDX1JFQUxfTk9ORSgweDE4MDAsIDB4MTkwMCkKK0VYQ19WSVJUX05PTkUoMHg1ODAwLCAweDU5MDApCisjZW5kaWYKKworCisvKgorICogQW4gaW50ZXJydXB0IGNhbWUgaW4gd2hpbGUgc29mdC1kaXNhYmxlZC4gV2Ugc2V0IHBhY2EtPmlycV9oYXBwZW5lZCwgdGhlbjoKKyAqIC0gSWYgaXQgd2FzIGEgZGVjcmVtZW50ZXIgaW50ZXJydXB0LCB3ZSBidW1wIHRoZSBkZWMgdG8gbWF4IGFuZCBhbmQgcmV0dXJuLgorICogLSBJZiBpdCB3YXMgYSBkb29yYmVsbCB3ZSByZXR1cm4gaW1tZWRpYXRlbHkgc2luY2UgZG9vcmJlbGxzIGFyZSBlZGdlCisgKiAgIHRyaWdnZXJlZCBhbmQgd29uJ3QgYXV0b21hdGljYWxseSByZWZpcmUuCisgKiAtIElmIGl0IHdhcyBhIEhNSSB3ZSByZXR1cm4gaW1tZWRpYXRlbHkgc2luY2Ugd2UgaGFuZGxlZCBpdCBpbiByZWFsbW9kZQorICogICBhbmQgaXQgd29uJ3QgcmVmaXJlLgorICogLSBlbHNlIHdlIGhhcmQgZGlzYWJsZSBhbmQgcmV0dXJuLgorICogVGhpcyBpcyBjYWxsZWQgd2l0aCByMTAgY29udGFpbmluZyB0aGUgdmFsdWUgdG8gT1IgdG8gdGhlIHBhY2EgZmllbGQuCisgKi8KKyNkZWZpbmUgTUFTS0VEX0lOVEVSUlVQVChfSCkJCQkJXAorbWFza2VkXyMjX0gjI2ludGVycnVwdDoJCQkJCVwKKwlzdGQJcjExLFBBQ0FfRVhHRU4rRVhfUjExKHIxMyk7CQlcCisJbGJ6CXIxMSxQQUNBSVJRSEFQUEVORUQocjEzKTsJCVwKKwlvcglyMTEscjExLHIxMDsJCQkJXAorCXN0YglyMTEsUEFDQUlSUUhBUFBFTkVEKHIxMyk7CQlcCisJY21wd2kJcjEwLFBBQ0FfSVJRX0RFQzsJCQlcCisJYm5lCTFmOwkJCQkJXAorCWxpcwlyMTAsMHg3ZmZmOwkJCQlcCisJb3JpCXIxMCxyMTAsMHhmZmZmOwkJCQlcCisJbXRzcHIJU1BSTl9ERUMscjEwOwkJCQlcCisJYgkyZjsJCQkJCVwKKzE6CWNtcHdpCXIxMCxQQUNBX0lSUV9EQkVMTDsJCQlcCisJYmVxCTJmOwkJCQkJXAorCWNtcHdpCXIxMCxQQUNBX0lSUV9ITUk7CQkJXAorCWJlcQkyZjsJCQkJCVwKKwltZnNwcglyMTAsU1BSTl8jI19IIyNTUlIxOwkJCVwKKwlybGRpY2wJcjEwLHIxMCw0OCwxOyAvKiBjbGVhciBNU1JfRUUgKi8JXAorCXJvdGxkaQlyMTAscjEwLDE2OwkJCQlcCisJbXRzcHIJU1BSTl8jI19IIyNTUlIxLHIxMDsJCQlcCisyOgltdGNyZgkweDgwLHI5OwkJCQlcCisJbGQJcjksUEFDQV9FWEdFTitFWF9SOShyMTMpOwkJXAorCWxkCXIxMCxQQUNBX0VYR0VOK0VYX1IxMChyMTMpOwkJXAorCWxkCXIxMSxQQUNBX0VYR0VOK0VYX1IxMShyMTMpOwkJXAorCUdFVF9TQ1JBVENIMChyMTMpOwkJCQlcCisJIyNfSCMjcmZpZDsJCQkJCVwKKwliCS4KKworLyoKKyAqIFJlYWwgbW9kZSBleGNlcHRpb25zIGFjdHVhbGx5IHVzZSB0aGlzIHRvbywgYnV0IGFsdGVybmF0ZQorICogaW5zdHJ1Y3Rpb24gY29kZSBwYXRjaGVzICh3aGljaCBlbmQgdXAgaW4gdGhlIGNvbW1vbiAudGV4dCBhcmVhKQorICogY2Fubm90IHJlYWNoIHRoZXNlIGlmIHRoZXkgYXJlIHB1dCB0aGVyZS4KKyAqLworVVNFX0ZJWEVEX1NFQ1RJT04odmlydF90cmFtcG9saW5lcykKKwlNQVNLRURfSU5URVJSVVBUKCkKKwlNQVNLRURfSU5URVJSVVBUKEgpCisKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSCitUUkFNUF9SRUFMX0JFR0lOKGt2bXBwY19za2lwX2ludGVycnVwdCkKKwkvKgorCSAqIEhlcmUgYWxsIEdQUnMgYXJlIHVuY2hhbmdlZCBmcm9tIHdoZW4gdGhlIGludGVycnVwdCBoYXBwZW5lZAorCSAqIGV4Y2VwdCBmb3IgcjEzLCB3aGljaCBpcyBzYXZlZCBpbiBTUFJHX1NDUkFUQ0gwLgorCSAqLworCW1mc3ByCXIxMywgU1BSTl9TUlIwCisJYWRkaQlyMTMsIHIxMywgNAorCW10c3ByCVNQUk5fU1JSMCwgcjEzCisJR0VUX1NDUkFUQ0gwKHIxMykKKwlyZmlkCisJYgkuCisKK1RSQU1QX1JFQUxfQkVHSU4oa3ZtcHBjX3NraXBfSGludGVycnVwdCkKKwkvKgorCSAqIEhlcmUgYWxsIEdQUnMgYXJlIHVuY2hhbmdlZCBmcm9tIHdoZW4gdGhlIGludGVycnVwdCBoYXBwZW5lZAorCSAqIGV4Y2VwdCBmb3IgcjEzLCB3aGljaCBpcyBzYXZlZCBpbiBTUFJHX1NDUkFUQ0gwLgorCSAqLworCW1mc3ByCXIxMywgU1BSTl9IU1JSMAorCWFkZGkJcjEzLCByMTMsIDQKKwltdHNwcglTUFJOX0hTUlIwLCByMTMKKwlHRVRfU0NSQVRDSDAocjEzKQorCWhyZmlkCisJYgkuCisjZW5kaWYKKworLyoKKyAqIEVuc3VyZSB0aGF0IGFueSBoYW5kbGVycyB0aGF0IGdldCBpbnZva2VkIGZyb20gdGhlIGV4Y2VwdGlvbiBwcm9sb2dzCisgKiBhYm92ZSBhcmUgYmVsb3cgdGhlIGZpcnN0IDY0S0IgKDB4MTAwMDApIG9mIHRoZSBrZXJuZWwgaW1hZ2UgYmVjYXVzZQorICogdGhlIHByb2xvZ3MgYXNzZW1ibGUgdGhlIGFkZHJlc3NlcyBvZiB0aGVzZSBoYW5kbGVycyB1c2luZyB0aGUKKyAqIExPQURfSEFORExFUiBtYWNybywgd2hpY2ggdXNlcyBhbiBvcmkgaW5zdHJ1Y3Rpb24uCisgKi8KKworLyoqKiBDb21tb24gaW50ZXJydXB0IGhhbmRsZXJzICoqKi8KKworCisJLyoKKwkgKiBSZWxvY2F0aW9uLW9uIGludGVycnVwdHM6IEEgc3Vic2V0IG9mIHRoZSBpbnRlcnJ1cHRzIGNhbiBiZSBkZWxpdmVyZWQKKwkgKiB3aXRoIElSPTEvRFI9MSwgaWYgQUlMPT0yIGFuZCBNU1IuSFYgd29uJ3QgYmUgY2hhbmdlZCBieSBkZWxpdmVyaW5nCisJICogaXQuICBBZGRyZXNzZXMgYXJlIHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCBpbnRlcnJ1cHQgYWRkcmVzc2VzLCBidXQKKwkgKiBvZmZzZXQgYnkgMHhjMDAwMDAwMDAwMDA0MDAwLgorCSAqIEl0J3MgaW1wb3NzaWJsZSB0byByZWNlaXZlIGludGVycnVwdHMgYmVsb3cgMHgzMDAgdmlhIHRoaXMgbWVjaGFuaXNtLgorCSAqIEtWTTogTm9uZSBvZiB0aGVzZSB0cmFwcyBhcmUgZnJvbSB0aGUgZ3Vlc3QgOyBhbnl0aGluZyB0aGF0IGVzY2FsYXRlZAorCSAqIHRvIEhWPTEgZnJvbSBIVj0wIGlzIGRlbGl2ZXJlZCB2aWEgcmVhbCBtb2RlIGhhbmRsZXJzLgorCSAqLworCisJLyoKKwkgKiBUaGlzIHVzZXMgdGhlIHN0YW5kYXJkIG1hY3JvLCBzaW5jZSB0aGUgb3JpZ2luYWwgMHgzMDAgdmVjdG9yCisJICogb25seSBoYXMgZXh0cmEgZ3VmZiBmb3IgU1RBQi1iYXNlZCBwcm9jZXNzb3JzIC0tIHdoaWNoIG5ldmVyCisJICogY29tZSBoZXJlLgorCSAqLworCitFWENfQ09NTU9OX0JFR0lOKHBwYzY0X3J1bmxhdGNoX29uX3RyYW1wb2xpbmUpCisJYglfX3BwYzY0X3J1bmxhdGNoX29uCisKK1VTRV9GSVhFRF9TRUNUSU9OKHZpcnRfdHJhbXBvbGluZXMpCisJLyoKKwkgKiBUaGUgX19lbmRfaW50ZXJydXB0cyBtYXJrZXIgbXVzdCBiZSBwYXN0IHRoZSBvdXQtb2YtbGluZSAoT09MKQorCSAqIGhhbmRsZXJzLCBzbyB0aGF0IHRoZXkgYXJlIGNvcGllZCB0byByZWFsIGFkZHJlc3MgMHgxMDAgd2hlbiBydW5uaW5nCisJICogYSByZWxvY2F0YWJsZSBrZXJuZWwuIFRoaXMgZW5zdXJlcyB0aGV5IGNhbiBiZSByZWFjaGVkIGZyb20gdGhlIHNob3J0CisJICogdHJhbXBvbGluZSBoYW5kbGVycyAobGlrZSAweDRmMDAsIDB4NGYyMCwgZXRjLikgd2hpY2ggYnJhbmNoCisJICogZGlyZWN0bHksIHdpdGhvdXQgdXNpbmcgTE9BRF9IQU5ETEVSKCkuCisJICovCisJLmFsaWduCTcKKwkuZ2xvYmwJX19lbmRfaW50ZXJydXB0cworX19lbmRfaW50ZXJydXB0czoKK0RFRklORV9GSVhFRF9TWU1CT0woX19lbmRfaW50ZXJydXB0cykKIAogI2lmZGVmIENPTkZJR19QUENfOTcwX05BUAotcG93ZXI0X2ZpeHVwX25hcDoKK1RSQU1QX1JFQUxfQkVHSU4ocG93ZXI0X2ZpeHVwX25hcCkKIAlhbmRjCXI5LHI5LHIxMAogCXN0ZAlyOSxUSV9MT0NBTF9GTEFHUyhyMTEpCiAJbGQJcjEwLF9MSU5LKHIxKQkJLyogbWFrZSBpZGxlIHRhc2sgZG8gdGhlICovCkBAIC0xNDYxLDYgKzEzODUsMTMgQEAKIAlibHIKICNlbmRpZgogCitDTE9TRV9GSVhFRF9TRUNUSU9OKHJlYWxfdmVjdG9ycyk7CitDTE9TRV9GSVhFRF9TRUNUSU9OKHJlYWxfdHJhbXBvbGluZXMpOworQ0xPU0VfRklYRURfU0VDVElPTih2aXJ0X3ZlY3RvcnMpOworQ0xPU0VfRklYRURfU0VDVElPTih2aXJ0X3RyYW1wb2xpbmVzKTsKKworVVNFX1RFWFRfU0VDVElPTigpCisKIC8qCiAgKiBIYXNoIHRhYmxlIHN0dWZmCiAgKi8KQEAgLTE2MDYsMyArMTUzNywzOSBAQAogMToJYWRkaQlyMyxyMSxTVEFDS19GUkFNRV9PVkVSSEVBRAogCWJsCWtlcm5lbF9iYWRfc3RhY2sKIAliCTFiCisKKy8qCisgKiBDYWxsZWQgZnJvbSBhcmNoX2xvY2FsX2lycV9lbmFibGUgd2hlbiBhbiBpbnRlcnJ1cHQgbmVlZHMKKyAqIHRvIGJlIHJlc2VudC4gcjMgY29udGFpbnMgMHg1MDAsIDB4OTAwLCAweGEwMCBvciAweGU4MCB0byBpbmRpY2F0ZQorICogd2hpY2gga2luZCBvZiBpbnRlcnJ1cHQuIE1TUjpFRSBpcyBhbHJlYWR5IG9mZi4gV2UgZ2VuZXJhdGUgYQorICogc3RhY2tmcmFtZSBsaWtlIGlmIGEgcmVhbCBpbnRlcnJ1cHQgaGFkIGhhcHBlbmVkLgorICoKKyAqIE5vdGU6IFdoaWxlIE1TUjpFRSBpcyBvZmYsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgX01TUgorICogaW4gdGhlIGdlbmVyYXRlZCBmcmFtZSBoYXMgRUUgc2V0IHRvIDEgb3IgdGhlIGV4Y2VwdGlvbgorICogaGFuZGxlciB3aWxsIG5vdCBwcm9wZXJseSByZS1lbmFibGUgdGhlbS4KKyAqLworX0dMT0JBTChfX3JlcGxheV9pbnRlcnJ1cHQpCisJLyogV2UgYXJlIGdvaW5nIHRvIGp1bXAgdG8gdGhlIGV4Y2VwdGlvbiBjb21tb24gY29kZSB3aGljaAorCSAqIHdpbGwgcmV0cmlldmUgdmFyaW91cyByZWdpc3RlciB2YWx1ZXMgZnJvbSB0aGUgUEFDQSB3aGljaAorCSAqIHdlIGRvbid0IGdpdmUgYSBkYW1uIGFib3V0LCBzbyB3ZSBkb24ndCBib3RoZXIgc3RvcmluZyB0aGVtLgorCSAqLworCW1mbXNyCXIxMgorCW1mbHIJcjExCisJbWZjcglyOQorCW9yaQlyMTIscjEyLE1TUl9FRQorCWNtcHdpCXIzLDB4OTAwCisJYmVxCWRlY3JlbWVudGVyX2NvbW1vbgorCWNtcHdpCXIzLDB4NTAwCisJYmVxCWhhcmR3YXJlX2ludGVycnVwdF9jb21tb24KK0JFR0lOX0ZUUl9TRUNUSU9OCisJY21wd2kJcjMsMHhlODAKKwliZXEJaF9kb29yYmVsbF9jb21tb24KKwljbXB3aQlyMywweGVhMAorCWJlcQloX3ZpcnRfaXJxX2NvbW1vbgorCWNtcHdpCXIzLDB4ZTYwCisJYmVxCWhtaV9leGNlcHRpb25fY29tbW9uCitGVFJfU0VDVElPTl9FTFNFCisJY21wd2kJcjMsMHhhMDAKKwliZXEJZG9vcmJlbGxfc3VwZXJfY29tbW9uCitBTFRfRlRSX1NFQ1RJT05fRU5EX0lGU0VUKENQVV9GVFJfSFZNT0RFKQorCWJscgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9mYWR1bXAuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZmFkdW1wLmMKaW5kZXggYjNhNjYzMy4uOTYzOTE4ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9mYWR1bXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2ZhZHVtcC5jCkBAIC03NzgsNyArNzc4LDExIEBACiAJZWxmLT5lX2VudHJ5ID0gMDsKIAllbGYtPmVfcGhvZmYgPSBzaXplb2Yoc3RydWN0IGVsZmhkcik7CiAJZWxmLT5lX3Nob2ZmID0gMDsKLQllbGYtPmVfZmxhZ3MgPSBFTEZfQ09SRV9FRkxBR1M7CisjaWYgZGVmaW5lZChfQ0FMTF9FTEYpCisJZWxmLT5lX2ZsYWdzID0gX0NBTExfRUxGOworI2Vsc2UKKwllbGYtPmVfZmxhZ3MgPSAwOworI2VuZGlmCiAJZWxmLT5lX2Voc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZWxmaGRyKTsKIAllbGYtPmVfcGhlbnRzaXplID0gc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcik7CiAJZWxmLT5lX3BobnVtID0gMDsKQEAgLTExMDQsNyArMTEwOCw5IEBACiAJCSAqIFRha2UgYXdheSB0aGUgJy9wcm9jL3ZtY29yZScuIFdlIGFyZSByZWxlYXNpbmcgdGhlIGR1bXAKIAkJICogbWVtb3J5LCBoZW5jZSBpdCB3aWxsIG5vdCBiZSB2YWxpZCBhbnltb3JlLgogCQkgKi8KKyNpZmRlZiBDT05GSUdfUFJPQ19WTUNPUkUKIAkJdm1jb3JlX2NsZWFudXAoKTsKKyNlbmRpZgogCQlmYWR1bXBfaW52YWxpZGF0ZV9yZWxlYXNlX21lbSgpOwogCiAJfSBlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2ZwdS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9mcHUuUwppbmRleCAxNWRhMmI1Li4wOGQxNGIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2ZwdS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnB1LlMKQEAgLTUwLDMyICs1MCw2IEBACiAjZGVmaW5lIFJFU1RfMzJGUFZTUlMobixjLGJhc2UpIF9fUkVTVF8zMkZQVlNSUyhuLF9fUkVHXyMjYyxfX1JFR18jI2Jhc2UpCiAjZGVmaW5lIFNBVkVfMzJGUFZTUlMobixjLGJhc2UpIF9fU0FWRV8zMkZQVlNSUyhuLF9fUkVHXyMjYyxfX1JFR18jI2Jhc2UpCiAKLSNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCi0vKiB2b2lkIGRvX2xvYWRfdXBfdHJhbnNhY3RfZnB1KHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQpCi0gKgotICogVGhpcyBpcyBzaW1pbGFyIHRvIGxvYWRfdXBfZnB1IGJ1dCBmb3IgdGhlIHRyYW5zYWN0aW9uYWwgdmVyc2lvbiBvZiB0aGUgRlAKLSAqIHJlZ2lzdGVyIHNldC4gIEl0IGRvZXNuJ3QgbWVzcyB3aXRoIHRoZSB0YXNrIE1TUiBvciB2YWxpZCBmbGFncy4KLSAqIEZ1cnRoZXJtb3JlLCB3ZSBkb24ndCBkbyBsYXp5IEZQIHdpdGggVE0gY3VycmVudGx5LgotICovCi1fR0xPQkFMKGRvX2xvYWRfdXBfdHJhbnNhY3RfZnB1KQotCW1mbXNyCXI2Ci0Jb3JpCXI1LHI2LE1TUl9GUAotI2lmZGVmIENPTkZJR19WU1gKLUJFR0lOX0ZUUl9TRUNUSU9OCi0Jb3JpcwlyNSxyNSxNU1JfVlNYQGgKLUVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX1ZTWCkKLSNlbmRpZgotCVNZTkMKLQlNVE1TUkQocjUpCi0KLQlhZGRpCXI3LHIzLFRIUkVBRF9UUkFOU0FDVF9GUFNUQVRFCi0JbGZkCWZyMCxGUFNUQVRFX0ZQU0NSKHI3KQotCU1URlNGX0woZnIwKQotCVJFU1RfMzJGUFZTUlMoMCwgUjQsIFI3KQotCi0JYmxyCi0jZW5kaWYgLyogQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTSAqLwotCiAvKgogICogTG9hZCBzdGF0ZSBmcm9tIG1lbW9yeSBpbnRvIEZQIHJlZ2lzdGVycyBpbmNsdWRpbmcgRlBTQ1IuCiAgKiBBc3N1bWVzIHRoZSBjYWxsZXIgaGFzIGVuYWJsZWQgRlAgaW4gdGhlIE1TUi4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2Z0cmFjZS5jCmluZGV4IGNjNTJkOTcuLmE5NTYzOWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9mdHJhY2UuYwpAQCAtNTkzLDcgKzU5Myw4IEBACiAJaWYgKCFmdHJhY2VfZ3JhcGhfZW50cnkoJnRyYWNlKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKHBhcmVudCwgaXAsICZ0cmFjZS5kZXB0aCwgMCkgPT0gLUVCVVNZKQorCWlmIChmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UocGFyZW50LCBpcCwgJnRyYWNlLmRlcHRoLCAwLAorCQkJCSAgICAgTlVMTCkgPT0gLUVCVVNZKQogCQlnb3RvIG91dDsKIAogCXBhcmVudCA9IHJldHVybl9ob29rZXI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfMzIuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TCmluZGV4IGRjMDQ4OGIuLmEzZjgyMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF8zMi5TCkBAIC0yNjYsNyArMjY2LDYgQEAKIAogCiAjZGVmaW5lIEVYQ0VQVElPTl9QUk9MT0dfMglcCi0JQ0xSX1RPUDMyKHIxMSk7CQlcCiAJc3R3CXIxMCxfQ0NSKHIxMSk7CQkvKiBzYXZlIHJlZ2lzdGVycyAqLyBcCiAJc3R3CXIxMixHUFIxMihyMTEpOwlcCiAJc3R3CXI5LEdQUjkocjExKTsJXApAQCAtODYyLDcgKzg2MSw2IEBACiAJLyogcHRyIHRvIHBoeXMgY3VycmVudCB0aHJlYWQgKi8KIAl0b3BoeXMocjQscjIpCiAJYWRkaQlyNCxyNCxUSFJFQUQJLyogcGh5cyBhZGRyZXNzIG9mIG91ciB0aHJlYWRfc3RydWN0ICovCi0JQ0xSX1RPUDMyKHI0KQogCW10c3ByCVNQUk5fU1BSR19USFJFQUQscjQKIAlsaQlyMywwCiAJbXRzcHIJU1BSTl9TUFJHX1JUQVMscjMJLyogMCA9PiBub3QgaW4gUlRBUyAqLwpAQCAtOTQ5LDcgKzk0Nyw2IEBACiAJLyogcHRyIHRvIHBoeXMgY3VycmVudCB0aHJlYWQgKi8KIAl0b3BoeXMocjQscjIpCiAJYWRkaQlyNCxyNCxUSFJFQUQJLyogaW5pdCB0YXNrJ3MgVEhSRUFEICovCi0JQ0xSX1RPUDMyKHI0KQogCW10c3ByCVNQUk5fU1BSR19USFJFQUQscjQKIAlsaQlyMywwCiAJbXRzcHIJU1BSTl9TUFJHX1JUQVMscjMJLyogMCA9PiBub3QgaW4gUlRBUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNjQuUwppbmRleCBmNzY1YjA0Li43OWRhMDY0MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9oZWFkLTY0Lmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2J1Zy5oPgogI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgpAQCAtNjUsOSArNjYsMTQgQEAKICAqICAgMi4gVGhlIGtlcm5lbCBpcyBlbnRlcmVkIGF0IF9fc3RhcnQKICAqLwogCi0JLnRleHQKLQkuZ2xvYmwgIF9zdGV4dAotX3N0ZXh0OgorT1BFTl9GSVhFRF9TRUNUSU9OKGZpcnN0XzI1NkIsIDB4MCwgMHgxMDApCitVU0VfRklYRURfU0VDVElPTihmaXJzdF8yNTZCKQorCS8qCisJICogT2Zmc2V0cyBhcmUgcmVsYXRpdmUgZnJvbSB0aGUgc3RhcnQgb2YgZml4ZWQgc2VjdGlvbiwgYW5kCisJICogZmlyc3RfMjU2QiBzdGFydHMgYXQgMC4gT2Zmc2V0cyBhcmUgYSBiaXQgZWFzaWVyIHRvIHVzZSBoZXJlCisJICogdGhhbiB0aGUgZml4ZWQgc2VjdGlvbiBlbnRyeSBtYWNyb3MuCisJICovCisJLiA9IDB4MAogX0dMT0JBTChfX3N0YXJ0KQogCS8qIE5PUCB0aGlzIG91dCB1bmNvbmRpdGlvbmFsbHkgKi8KIEJFR0lOX0ZUUl9TRUNUSU9OCkBAIC0xMDQsNiArMTEwLDcgQEAKIAkuID0gMHg1YwogCS5nbG9ibAlfX3J1bl9hdF9sb2FkCiBfX3J1bl9hdF9sb2FkOgorREVGSU5FX0ZJWEVEX1NZTUJPTChfX3J1bl9hdF9sb2FkKQogCS5sb25nCTB4NzI3NTZlMzAJLyogInJ1bjAiIC0tIHJlbG9jYXRlIHRvIDAgYnkgZGVmYXVsdCAqLwogI2VuZGlmCiAKQEAgLTEzMyw3ICsxNDAsNyBAQAogCS8qIFRlbGwgdGhlIG1hc3RlciBjcHUgd2UncmUgaGVyZSAqLwogCS8qIFJlbG9jYXRpb24gaXMgb2ZmICYgd2UgYXJlIGxvY2F0ZWQgYXQgYW4gYWRkcmVzcyBsZXNzICovCiAJLyogdGhhbiAweDEwMCwgc28gb25seSBuZWVkIHRvIGdyYWIgbG93IG9yZGVyIG9mZnNldC4gICAgKi8KLQlzdGQJcjI0LF9fc2Vjb25kYXJ5X2hvbGRfYWNrbm93bGVkZ2UtX3N0ZXh0KDApCisJc3RkCXIyNCwoQUJTX0FERFIoX19zZWNvbmRhcnlfaG9sZF9hY2tub3dsZWRnZSkpKDApCiAJc3luYwogCiAJbGkJcjI2LDAKQEAgLTE0MSw3ICsxNDgsNyBAQAogCXRvdmlydChyMjYscjI2KQogI2VuZGlmCiAJLyogQWxsIHNlY29uZGFyeSBjcHVzIHdhaXQgaGVyZSB1bnRpbCB0b2xkIHRvIHN0YXJ0LiAqLwotMTAwOglsZAlyMTIsX19zZWNvbmRhcnlfaG9sZF9zcGlubG9vcC1fc3RleHQocjI2KQorMTAwOglsZAlyMTIsKEFCU19BRERSKF9fc2Vjb25kYXJ5X2hvbGRfc3Bpbmxvb3ApKShyMjYpCiAJY21wZGkJMCxyMTIsMAogCWJlcQkxMDBiCiAKQEAgLTE2NiwxMiArMTczLDEzIEBACiAjZWxzZQogCUJVR19PUENPREUKICNlbmRpZgorQ0xPU0VfRklYRURfU0VDVElPTihmaXJzdF8yNTZCKQogCiAvKiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gbWFyayBleGNlcHRpb24gZnJhbWVzIG9uIHRoZSBzdGFjay4gKi8KIAkuc2VjdGlvbiAiLnRvYyIsImF3IgogZXhjZXB0aW9uX21hcmtlcjoKIAkudGMJSURfNzI2NTY3NzNfNjg2NTcyNjVbVENdLDB4NzI2NTY3NzM2ODY1NzI2NQotCS50ZXh0CisJLnByZXZpb3VzCiAKIC8qCiAgKiBPbiBzZXJ2ZXIsIHdlIGluY2x1ZGUgdGhlIGV4Y2VwdGlvbiB2ZWN0b3JzIGNvZGUgaGVyZSBhcyBpdApAQCAtMTgwLDggKzE4OCwxMiBAQAogICovCiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM1MKICNpbmNsdWRlICJleGNlcHRpb25zLTY0cy5TIgorI2Vsc2UKK09QRU5fVEVYVF9TRUNUSU9OKDB4MTAwKQogI2VuZGlmCiAKK1VTRV9URVhUX1NFQ1RJT04oKQorCiAjaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKIC8qCiAgKiBUaGUgYm9vdGluZ190aHJlYWRfaHdpZCBob2xkcyB0aGUgdGhyZWFkIGlkIHdlIHdhbnQgdG8gYm9vdCBpbiBjcHUKQEAgLTU1OCw3ICs1NzAsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX1BQQ19CT09LM0UpCiAJdG92aXJ0KHIyNixyMjYpCQkvKiBvbiBib29rZSwgd2UgYWxyZWFkeSBydW4gYXQgUEFHRV9PRkZTRVQgKi8KICNlbmRpZgotCWx3eglyNyxfX3J1bl9hdF9sb2FkLV9zdGV4dChyMjYpCisJbHd6CXI3LChGSVhFRF9TWU1CT0xfQUJTX0FERFIoX19ydW5fYXRfbG9hZCkpKHIyNikKICNpZiBkZWZpbmVkKENPTkZJR19QUENfQk9PSzNFKQogCXRvcGh5cyhyMjYscjI2KQogI2VuZGlmCkBAIC02MDEsNyArNjEzLDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19QUENfQk9PSzNFKQogCXRvdmlydChyMjYscjI2KQkJLyogb24gYm9va2UsIHdlIGFscmVhZHkgcnVuIGF0IFBBR0VfT0ZGU0VUICovCiAjZW5kaWYKLQlsd3oJcjcsX19ydW5fYXRfbG9hZC1fc3RleHQocjI2KQorCWx3eglyNywoRklYRURfU1lNQk9MX0FCU19BRERSKF9fcnVuX2F0X2xvYWQpKShyMjYpCiAJY21wbHdpCWNyMCxyNywxCiAJYm5lCTNmCiAKQEAgLTYxMSwyOCArNjIzLDM1IEBACiAJc3ViCXI1LHI1LHIxMQogI2Vsc2UKIAkvKiBqdXN0IGNvcHkgaW50ZXJydXB0cyAqLwotCUxPQURfUkVHX0lNTUVESUFURShyNSwgX19lbmRfaW50ZXJydXB0cyAtIF9zdGV4dCkKKwlMT0FEX1JFR19JTU1FRElBVEUocjUsIEZJWEVEX1NZTUJPTF9BQlNfQUREUihfX2VuZF9pbnRlcnJ1cHRzKSkKICNlbmRpZgogCWIJNWYKIDM6CiAjZW5kaWYKLQlsaXMJcjUsKGNvcHlfdG9faGVyZSAtIF9zdGV4dClAaGEKLQlhZGRpCXI1LHI1LChjb3B5X3RvX2hlcmUgLSBfc3RleHQpQGwgLyogIyBieXRlcyBvZiBtZW1vcnkgdG8gY29weSAqLworCS8qICMgYnl0ZXMgb2YgbWVtb3J5IHRvIGNvcHkgKi8KKwlsaXMJcjUsKEFCU19BRERSKGNvcHlfdG9faGVyZSkpQGhhCisJYWRkaQlyNSxyNSwoQUJTX0FERFIoY29weV90b19oZXJlKSlAbAogCiAJYmwJY29weV9hbmRfZmx1c2gJCS8qIGNvcHkgdGhlIGZpcnN0IG4gYnl0ZXMJICovCiAJCQkJCS8qIHRoaXMgaW5jbHVkZXMgdGhlIGNvZGUgYmVpbmcJICovCiAJCQkJCS8qIGV4ZWN1dGVkIGhlcmUuCQkgKi8KLQlhZGRpcwlyOCxyMywoNGYgLSBfc3RleHQpQGhhCS8qIEp1bXAgdG8gdGhlIGNvcHkgb2YgdGhpcyBjb2RlICovCi0JYWRkaQlyMTIscjgsKDRmIC0gX3N0ZXh0KUBsCS8qIHRoYXQgd2UganVzdCBtYWRlICovCisJLyogSnVtcCB0byB0aGUgY29weSBvZiB0aGlzIGNvZGUgdGhhdCB3ZSBqdXN0IG1hZGUgKi8KKwlhZGRpcwlyOCxyMywoQUJTX0FERFIoNGYpKUBoYQorCWFkZGkJcjEyLHI4LChBQlNfQUREUig0ZikpQGwKIAltdGN0cglyMTIKIAliY3RyCiAKIC5iYWxpZ24gOAotcF9lbmQ6CS5sbG9uZwlfZW5kIC0gX3N0ZXh0CitwX2VuZDogLmxsb25nIF9lbmQgLSBjb3B5X3RvX2hlcmUKIAotNDoJLyogTm93IGNvcHkgdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbCB1cCB0byBfZW5kICovCi0JYWRkaXMJcjUscjI2LChwX2VuZCAtIF9zdGV4dClAaGEKLQlsZAlyNSwocF9lbmQgLSBfc3RleHQpQGwocjUpCS8qIGdldCBfZW5kICovCis0OgorCS8qCisJICogTm93IGNvcHkgdGhlIHJlc3Qgb2YgdGhlIGtlcm5lbCB1cCB0byBfZW5kLCBhZGQKKwkgKiBfZW5kIC0gY29weV90b19oZXJlIHRvIHRoZSBjb3B5IGxpbWl0IGFuZCBydW4gYWdhaW4uCisJICovCisJYWRkaXMgICByOCxyMjYsKEFCU19BRERSKHBfZW5kKSlAaGEKKwlsZCAgICAgIHI4LChBQlNfQUREUihwX2VuZCkpQGwocjgpCisJYWRkCXI1LHI1LHI4CiA1OglibAljb3B5X2FuZF9mbHVzaAkJLyogY29weSB0aGUgcmVzdCAqLwogCiA5OgliCXN0YXJ0X2hlcmVfbXVsdGlwbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzh4eC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzh4eC5TCmluZGV4IDQzZGRhYWUuLjNhMTg1YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF84eHguUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfOHh4LlMKQEAgLTE1MSw3ICsxNTEsNiBAQAogCiAKICNkZWZpbmUgRVhDRVBUSU9OX1BST0xPR18yCVwKLQlDTFJfVE9QMzIocjExKTsJCVwKIAlzdHcJcjEwLF9DQ1IocjExKTsJCS8qIHNhdmUgcmVnaXN0ZXJzICovIFwKIAlzdHcJcjEyLEdQUjEyKHIxMSk7CVwKIAlzdHcJcjksR1BSOShyMTEpOwlcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2h3X2JyZWFrcG9pbnQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCmluZGV4IGFlYzlhMWIuLjk3ODFjNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCkBAIC0yMDYsNyArMjA2LDcgQEAKIC8qCiAgKiBIYW5kbGUgZGVidWcgZXhjZXB0aW9uIG5vdGlmaWNhdGlvbnMuCiAgKi8KLWludCBfX2twcm9iZXMgaHdfYnJlYWtwb2ludF9oYW5kbGVyKHN0cnVjdCBkaWVfYXJncyAqYXJncykKK2ludCBod19icmVha3BvaW50X2hhbmRsZXIoc3RydWN0IGRpZV9hcmdzICphcmdzKQogewogCWludCByYyA9IE5PVElGWV9TVE9QOwogCXN0cnVjdCBwZXJmX2V2ZW50ICpicDsKQEAgLTI5MCwxMSArMjkwLDEyIEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJjOwogfQorTk9LUFJPQkVfU1lNQk9MKGh3X2JyZWFrcG9pbnRfaGFuZGxlcik7CiAKIC8qCiAgKiBIYW5kbGUgc2luZ2xlLXN0ZXAgZXhjZXB0aW9ucyBmb2xsb3dpbmcgYSBEQUJSIGhpdC4KICAqLwotc3RhdGljIGludCBfX2twcm9iZXMgc2luZ2xlX3N0ZXBfZGFicl9pbnN0cnVjdGlvbihzdHJ1Y3QgZGllX2FyZ3MgKmFyZ3MpCitzdGF0aWMgaW50IHNpbmdsZV9zdGVwX2RhYnJfaW5zdHJ1Y3Rpb24oc3RydWN0IGRpZV9hcmdzICphcmdzKQogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gYXJncy0+cmVnczsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqYnAgPSBOVUxMOwpAQCAtMzI5LDExICszMzAsMTIgQEAKIAogCXJldHVybiBOT1RJRllfU1RPUDsKIH0KK05PS1BST0JFX1NZTUJPTChzaW5nbGVfc3RlcF9kYWJyX2luc3RydWN0aW9uKTsKIAogLyoKICAqIEhhbmRsZSBkZWJ1ZyBleGNlcHRpb24gbm90aWZpY2F0aW9ucy4KICAqLwotaW50IF9fa3Byb2JlcyBod19icmVha3BvaW50X2V4Y2VwdGlvbnNfbm90aWZ5KAoraW50IGh3X2JyZWFrcG9pbnRfZXhjZXB0aW9uc19ub3RpZnkoCiAJCXN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLCB1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgcmV0ID0gTk9USUZZX0RPTkU7CkBAIC0zNDksNiArMzUxLDcgQEAKIAogCXJldHVybiByZXQ7CiB9CitOT0tQUk9CRV9TWU1CT0woaHdfYnJlYWtwb2ludF9leGNlcHRpb25zX25vdGlmeSk7CiAKIC8qCiAgKiBSZWxlYXNlIHRoZSB1c2VyIGJyZWFrcG9pbnRzIHVzZWQgYnkgcHRyYWNlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2libWVidXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWJtZWJ1cy5jCmluZGV4IGMxY2E5MjguLjZjYTlhMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWJtZWJ1cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWJtZWJ1cy5jCkBAIC0yMjcsNyArMjI3LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGlzdCk7CiAKLQlpZiAoaXJxID09IE5PX0lSUSkKKwlpZiAoIWlycSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gcmVxdWVzdF9pcnEoaXJxLCBoYW5kbGVyLCBpcnFfZmxhZ3MsIGRldm5hbWUsIGRldl9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfYm9vazNzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfYm9vazNzLlMKaW5kZXggMjI2NWM2My4uYmQ3MzlmZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX2Jvb2szcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9ib29rM3MuUwpAQCAtNDExLDcgKzQxMSw3IEBACiAgKgogICogcjEzIC0gUEFDQQogICogY3IzIC0gZ3QgaWYgd2FraW5nIHVwIHdpdGggcGFydGlhbC9jb21wbGV0ZSBoeXBlcnZpc29yIHN0YXRlIGxvc3MKLSAqIGNyNCAtIGVxIGlmIHdha2luZyB1cCBmcm9tIGNvbXBsZXRlIGh5cGVydmlzb3Igc3RhdGUgbG9zcy4KKyAqIGNyNCAtIGd0IG9yIGVxIGlmIHdha2luZyB1cCBmcm9tIGNvbXBsZXRlIGh5cGVydmlzb3Igc3RhdGUgbG9zcy4KICAqLwogX0dMT0JBTChwbnZfd2FrZXVwX3RiX2xvc3MpCiAJbGQJcjEsUEFDQVIxKHIxMykKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCSAqIEF0IHRoaXMgc3RhZ2UKIAkgKiBjcjIgLSBlcSBpZiBmaXJzdCB0aHJlYWQgdG8gd2FrZXVwIGluIGNvcmUKIAkgKiBjcjMtICBndCBpZiB3YWtpbmcgdXAgd2l0aCBwYXJ0aWFsL2NvbXBsZXRlIGh5cGVydmlzb3Igc3RhdGUgbG9zcwotCSAqIGNyNCAtIGVxIGlmIHdha2luZyB1cCBmcm9tIGNvbXBsZXRlIGh5cGVydmlzb3Igc3RhdGUgbG9zcy4KKwkgKiBjcjQgLSBndCBvciBlcSBpZiB3YWtpbmcgdXAgZnJvbSBjb21wbGV0ZSBoeXBlcnZpc29yIHN0YXRlIGxvc3MuCiAJICovCiAKIAlvcmkJcjE1LHIxNSxQTlZfQ09SRV9JRExFX0xPQ0tfQklUCkBAIC00ODEsNyArNDgxLDcgQEAKIAkgKiBJZiB3YWtpbmcgdXAgZnJvbSBzbGVlcCwgc3ViY29yZSBzdGF0ZSBpcyBub3QgbG9zdC4gSGVuY2UKIAkgKiBza2lwIHN1YmNvcmUgc3RhdGUgcmVzdG9yZQogCSAqLwotCWJuZQljcjQsc3ViY29yZV9zdGF0ZV9yZXN0b3JlZAorCWJsdAljcjQsc3ViY29yZV9zdGF0ZV9yZXN0b3JlZAogCiAJLyogUmVzdG9yZSBwZXItc3ViY29yZSBzdGF0ZSAqLwogCWxkICAgICAgcjQsX1NEUjEocjEpCkBAIC01MjYsNyArNTI2LDcgQEAKIAkgKiBJZiB3YWtpbmcgdXAgZnJvbSBzbGVlcCwgcGVyIGNvcmUgc3RhdGUgaXMgbm90IGxvc3QsIHNraXAgdG8KIAkgKiBjbGVhcl9sb2NrLgogCSAqLwotCWJuZQljcjQsY2xlYXJfbG9jaworCWJsdAljcjQsY2xlYXJfbG9jawogCiAJLyoKIAkgKiBGaXJzdCB0aHJlYWQgaW4gdGhlIGNvcmUgdG8gd2FrZSB1cCBhbmQgaXRzIHdha2luZyB1cCB3aXRoCkBAIC01NTcsNyArNTU3LDcgQEAKIAkgKiBJZiB3YWtpbmcgdXAgZnJvbSBzbGVlcCwgaHlwZXJ2aXNvciBzdGF0ZSBpcyBub3QgbG9zdC4gSGVuY2UKIAkgKiBza2lwIGh5cGVydmlzb3Igc3RhdGUgcmVzdG9yZS4KIAkgKi8KLQlibmUJY3I0LGh5cGVydmlzb3Jfc3RhdGVfcmVzdG9yZWQKKwlibHQJY3I0LGh5cGVydmlzb3Jfc3RhdGVfcmVzdG9yZWQKIAogCS8qIFdha2luZyB1cCBmcm9tIHdpbmtsZSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwppbmRleCAwODg4N2NmLi4zYzA1YzMxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKQEAgLTY3LDYgKzY3LDcgQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL2xpdmVwYXRjaC5oPgorI2luY2x1ZGUgPGFzbS9hc20tcHJvdG90eXBlcy5oPgogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjaW5jbHVkZSA8YXNtL3BhY2EuaD4KQEAgLTE1Niw2ICsxNTcsMTUgQEAKIAl9CiAKIAkvKgorCSAqIENoZWNrIGlmIGFuIGh5cGVydmlzb3IgTWFpbnRlbmFuY2UgaW50ZXJydXB0IGhhcHBlbmVkLgorCSAqIFRoaXMgaXMgYSBoaWdoZXIgcHJpb3JpdHkgaW50ZXJydXB0IHRoYW4gdGhlIG90aGVycywgc28KKwkgKiByZXBsYXkgaXQgZmlyc3QuCisJICovCisJbG9jYWxfcGFjYS0+aXJxX2hhcHBlbmVkICY9IH5QQUNBX0lSUV9ITUk7CisJaWYgKGhhcHBlbmVkICYgUEFDQV9JUlFfSE1JKQorCQlyZXR1cm4gMHhlNjA7CisKKwkvKgogCSAqIFdlIG1heSBoYXZlIG1pc3NlZCBhIGRlY3JlbWVudGVyIGludGVycnVwdC4gV2UgY2hlY2sgdGhlCiAJICogZGVjcmVtZW50ZXIgaXRzZWxmIHJhdGhlciB0aGFuIHRoZSBwYWNhIGlycV9oYXBwZW5lZCBmaWVsZAogCSAqIGluIGNhc2Ugd2UgYWxzbyBoYWQgYSByb2xsb3ZlciB3aGlsZSBoYXJkIGRpc2FibGVkCkBAIC0xOTAsMTEgKzIwMCw2IEBACiAJfQogI2VuZGlmIC8qIENPTkZJR19QUENfQk9PSzNFICovCiAKLQkvKiBDaGVjayBpZiBhbiBoeXBlcnZpc29yIE1haW50ZW5hbmNlIGludGVycnVwdCBoYXBwZW5lZCAqLwotCWxvY2FsX3BhY2EtPmlycV9oYXBwZW5lZCAmPSB+UEFDQV9JUlFfSE1JOwotCWlmIChoYXBwZW5lZCAmIFBBQ0FfSVJRX0hNSSkKLQkJcmV0dXJuIDB4ZTYwOwotCiAJLyogVGhlcmUgc2hvdWxkIGJlIG5vdGhpbmcgbGVmdCAhICovCiAJQlVHX09OKGxvY2FsX3BhY2EtPmlycV9oYXBwZW5lZCAhPSAwKTsKIApAQCAtNTE0LDcgKzUxOSw3IEBACiAJbWF5X2hhcmRfaXJxX2VuYWJsZSgpOwogCiAJLyogQW5kIGZpbmFsbHkgcHJvY2VzcyBpdCAqLwotCWlmICh1bmxpa2VseShpcnEgPT0gTk9fSVJRKSkKKwlpZiAodW5saWtlbHkoIWlycSkpCiAJCV9fdGhpc19jcHVfaW5jKGlycV9zdGF0LnNwdXJpb3VzX2lycXMpOwogCWVsc2UKIAkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IDNlZDhlYzA5Li5lNzg1Y2M5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2twcm9iZXMuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vY29kZS1wYXRjaGluZy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9sZWdhY3lfc2VyaWFsLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYwppbmRleCA3Yjc1MGM0Li5iYzUyNWVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xlZ2FjeV9zZXJpYWwuYwpAQCAtMTkzLDEwICsxOTMsMTAgQEAKIAkgKi8KIAlpZiAodHNpICYmICFzdHJjbXAodHNpLT50eXBlLCAidHNpLWJyaWRnZSIpKQogCQlyZXR1cm4gYWRkX2xlZ2FjeV9wb3J0KG5wLCAtMSwgVVBJT19UU0ksIGFkZHIsIGFkZHIsCi0JCQkJICAgICAgIE5PX0lSUSwgbGVnYWN5X3BvcnRfZmxhZ3MsIDApOworCQkJCSAgICAgICAwLCBsZWdhY3lfcG9ydF9mbGFncywgMCk7CiAJZWxzZQogCQlyZXR1cm4gYWRkX2xlZ2FjeV9wb3J0KG5wLCAtMSwgVVBJT19NRU0sIGFkZHIsIGFkZHIsCi0JCQkJICAgICAgIE5PX0lSUSwgbGVnYWN5X3BvcnRfZmxhZ3MsIDApOworCQkJCSAgICAgICAwLCBsZWdhY3lfcG9ydF9mbGFncywgMCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGFkZF9sZWdhY3lfaXNhX3BvcnQoc3RydWN0IGRldmljZV9ub2RlICpucCwKQEAgLTI0Miw3ICsyNDIsNyBAQAogCiAJLyogQWRkIHBvcnQsIGlycSB3aWxsIGJlIGRlYWx0IHdpdGggbGF0ZXIgKi8KIAlyZXR1cm4gYWRkX2xlZ2FjeV9wb3J0KG5wLCBpbmRleCwgVVBJT19QT1JULCBiZTMyX3RvX2NwdShyZWdbMV0pLAotCQkJICAgICAgIHRhZGRyLCBOT19JUlEsIGxlZ2FjeV9wb3J0X2ZsYWdzLCAwKTsKKwkJCSAgICAgICB0YWRkciwgMCwgbGVnYWN5X3BvcnRfZmxhZ3MsIDApOwogCiB9CiAKQEAgLTMxNCw3ICszMTQsNyBAQAogCS8qIEFkZCBwb3J0LCBpcnEgd2lsbCBiZSBkZWFsdCB3aXRoIGxhdGVyLiBXZSBwYXNzZWQgYSB0cmFuc2xhdGVkCiAJICogSU8gcG9ydCB2YWx1ZS4gSXQgd2lsbCBiZSBmaXhlZCB1cCBsYXRlciBhbG9uZyB3aXRoIHRoZSBpcnEKIAkgKi8KLQlyZXR1cm4gYWRkX2xlZ2FjeV9wb3J0KG5wLCBpbmRleCwgaW90eXBlLCBiYXNlLCBhZGRyLCBOT19JUlEsCisJcmV0dXJuIGFkZF9sZWdhY3lfcG9ydChucCwgaW5kZXgsIGlvdHlwZSwgYmFzZSwgYWRkciwgMCwKIAkJCSAgICAgICBsZWdhY3lfcG9ydF9mbGFncywgbnAgIT0gcGNpX2Rldik7CiB9CiAjZW5kaWYKQEAgLTQ2MiwxNCArNDYyLDE0IEBACiAJREJHKCJmaXh1cF9wb3J0X2lycSglZClcbiIsIGluZGV4KTsKIAogCXZpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7Ci0JaWYgKHZpcnEgPT0gTk9fSVJRICYmIGxlZ2FjeV9zZXJpYWxfaW5mb3NbaW5kZXhdLmlycV9jaGVja19wYXJlbnQpIHsKKwlpZiAoIXZpcnEgJiYgbGVnYWN5X3NlcmlhbF9pbmZvc1tpbmRleF0uaXJxX2NoZWNrX3BhcmVudCkgewogCQlucCA9IG9mX2dldF9wYXJlbnQobnApOwogCQlpZiAobnAgPT0gTlVMTCkKIAkJCXJldHVybjsKIAkJdmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKIAkJb2Zfbm9kZV9wdXQobnApOwogCX0KLQlpZiAodmlycSA9PSBOT19JUlEpCisJaWYgKCF2aXJxKQogCQlyZXR1cm47CiAKIAlwb3J0LT5pcnEgPSB2aXJxOwpAQCAtNTQzLDcgKzU0Myw3IEBACiAJCXN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCAqcG9ydCA9ICZsZWdhY3lfc2VyaWFsX3BvcnRzW2ldOwogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gbGVnYWN5X3NlcmlhbF9pbmZvc1tpXS5ucDsKIAotCQlpZiAocG9ydC0+aXJxID09IE5PX0lSUSkKKwkJaWYgKCFwb3J0LT5pcnEpCiAJCQlmaXh1cF9wb3J0X2lycShpLCBucCwgcG9ydCk7CiAJCWlmIChwb3J0LT5pb3R5cGUgPT0gVVBJT19QT1JUKQogCQkJZml4dXBfcG9ydF9waW8oaSwgbnAsIHBvcnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWNfNjQuYwppbmRleCA0Yzc4MGEzLi5hMjA1ZmEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWNfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWNfNjQuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9wYWNhLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgkvKiBfZW5kICovCkBAIC0zMSwyMSArMzIsNiBAQAogI2luY2x1ZGUgPGFzbS9od19icmVha3BvaW50Lmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1wcm90b3R5cGVzLmg+CiAKLSNpZmRlZiBDT05GSUdfUFBDX0JPT0szRQotaW50IGRlZmF1bHRfbWFjaGluZV9rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmltYWdlKQotewotCWludCBpOwotCS8qCi0JICogU2luY2Ugd2UgdXNlIHRoZSBrZXJuZWwgZmF1bHQgaGFuZGxlcnMgYW5kIHBhZ2luZyBjb2RlIHRvCi0JICogaGFuZGxlIHRoZSB2aXJ0dWFsIG1vZGUsIHdlIG11c3QgbWFrZSBzdXJlIG5vIGRlc3RpbmF0aW9uCi0JICogb3ZlcmxhcHMga2VybmVsIHN0YXRpYyBkYXRhIG9yIGJzcy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm5yX3NlZ21lbnRzOyBpKyspCi0JCWlmIChpbWFnZS0+c2VnbWVudFtpXS5tZW0gPCBfX3BhKF9lbmQpKQotCQkJcmV0dXJuIC1FVFhUQlNZOwotCXJldHVybiAwOwotfQotI2Vsc2UKIGludCBkZWZhdWx0X21hY2hpbmVfa2V4ZWNfcHJlcGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKIHsKIAlpbnQgaTsKQEAgLTU1LDkgKzQxLDYgQEAKIAljb25zdCB1bnNpZ25lZCBsb25nICpiYXNlcDsKIAljb25zdCB1bnNpZ25lZCBpbnQgKnNpemVwOwogCi0JaWYgKCFtbXVfaGFzaF9vcHMuaHB0ZV9jbGVhcl9hbGwpCi0JCXJldHVybiAtRU5PRU5UOwotCiAJLyoKIAkgKiBTaW5jZSB3ZSB1c2UgdGhlIGtlcm5lbCBmYXVsdCBoYW5kbGVycyBhbmQgcGFnaW5nIGNvZGUgdG8KIAkgKiBoYW5kbGUgdGhlIHZpcnR1YWwgbW9kZSwgd2UgbXVzdCBtYWtlIHN1cmUgbm8gZGVzdGluYXRpb24KQEAgLTY3LDMxICs1MCw2IEBACiAJCWlmIChpbWFnZS0+c2VnbWVudFtpXS5tZW0gPCBfX3BhKF9lbmQpKQogCQkJcmV0dXJuIC1FVFhUQlNZOwogCi0JLyoKLQkgKiBGb3Igbm9uLUxQQVIsIHdlIGFic29sdXRlbHkgY2FuIG5vdCBvdmVyd3JpdGUgdGhlIG1tdSBoYXNoCi0JICogdGFibGUsIHNpbmNlIHdlIGFyZSBzdGlsbCB1c2luZyB0aGUgYm9sdGVkIGVudHJpZXMgaW4gaXQgdG8KLQkgKiBkbyB0aGUgY29weS4gIENoZWNrIHRoYXQgaGVyZS4KLQkgKgotCSAqIEl0IGlzIHNhZmUgaWYgdGhlIGVuZCBpcyBiZWxvdyB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrZWQKLQkgKiByZWdpb24gKGVuZCA8PSBsb3cpLCBvciBpZiB0aGUgYmVnaW5uaW5nIGlzIGFmdGVyIHRoZQotCSAqIGVuZCBvZiB0aGUgYmxvY2tlZCByZWdpb24gKGJlZ2luID49IGhpZ2gpLiAgVXNlIHRoZQotCSAqIGJvb2xlYW4gaWRlbnRpdHkgIShhIHx8IGIpICA9PT0gKCFhICYmICFiKS4KLQkgKi8KLSNpZmRlZiBDT05GSUdfUFBDX1NURF9NTVVfNjQKLQlpZiAoaHRhYl9hZGRyZXNzKSB7Ci0JCWxvdyA9IF9fcGEoaHRhYl9hZGRyZXNzKTsKLQkJaGlnaCA9IGxvdyArIGh0YWJfc2l6ZV9ieXRlczsKLQotCQlmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm5yX3NlZ21lbnRzOyBpKyspIHsKLQkJCWJlZ2luID0gaW1hZ2UtPnNlZ21lbnRbaV0ubWVtOwotCQkJZW5kID0gYmVnaW4gKyBpbWFnZS0+c2VnbWVudFtpXS5tZW1zejsKLQotCQkJaWYgKChiZWdpbiA8IGhpZ2gpICYmIChlbmQgPiBsb3cpKQotCQkJCXJldHVybiAtRVRYVEJTWTsKLQkJfQotCX0KLSNlbmRpZiAvKiBDT05GSUdfUFBDX1NURF9NTVVfNjQgKi8KLQogCS8qIFdlIGFsc28gc2hvdWxkIG5vdCBvdmVyd3JpdGUgdGhlIHRjZSB0YWJsZXMgKi8KIAlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobm9kZSwgInBjaSIpIHsKIAkJYmFzZXAgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImxpbnV4LHRjZS1iYXNlIiwgTlVMTCk7CkBAIC0xMTMsNyArNzEsNiBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYgLyogIUNPTkZJR19QUENfQk9PSzNFICovCiAKIHN0YXRpYyB2b2lkIGNvcHlfc2VnbWVudHModW5zaWduZWQgbG9uZyBpbmQpCiB7CkBAIC0zMzIsMTEgKzI4OSwxNCBAQAogLyogT3VyIGFzc2VtYmx5IGhlbHBlciwgaW4gbWlzY182NC5TICovCiBleHRlcm4gdm9pZCBrZXhlY19zZXF1ZW5jZSh2b2lkICpuZXdzdGFjaywgdW5zaWduZWQgbG9uZyBzdGFydCwKIAkJCSAgIHZvaWQgKmltYWdlLCB2b2lkICpjb250cm9sLAotCQkJICAgdm9pZCAoKmNsZWFyX2FsbCkodm9pZCkpIF9fbm9yZXR1cm47CisJCQkgICB2b2lkICgqY2xlYXJfYWxsKSh2b2lkKSwKKwkJCSAgIGJvb2wgY29weV93aXRoX21tdV9vZmYpIF9fbm9yZXR1cm47CiAKIC8qIHRvbyBsYXRlIHRvIGZhaWwgaGVyZSAqLwogdm9pZCBkZWZhdWx0X21hY2hpbmVfa2V4ZWMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCiB7CisJYm9vbCBjb3B5X3dpdGhfbW11X29mZjsKKwogCS8qIHByZXBhcmUgY29udHJvbCBjb2RlIGlmIGFueSAqLwogCiAJLyoKQEAgLTM3NCwxOCArMzM0LDI5IEBACiAJLyogWFhYOiBJZiBhbnlvbmUgZG9lcyAnZHluYW1pYyBscHBhY2FzJyB0aGlzIHdpbGwgYWxzbyBuZWVkIHRvIGJlCiAJICogc3dpdGNoZWQgdG8gYSBzdGF0aWMgdmVyc2lvbiEKIAkgKi8KKwkvKgorCSAqIE9uIEJvb2szUywgdGhlIGNvcHkgbXVzdCBoYXBwZW4gd2l0aCB0aGUgTU1VIG9mZiBpZiB3ZSBhcmUgZWl0aGVyCisJICogdXNpbmcgUmFkaXggcGFnZSB0YWJsZXMgb3Igd2UgYXJlIG5vdCBpbiBhbiBMUEFSIHNpbmNlIHdlIGNhbgorCSAqIG92ZXJ3cml0ZSB0aGUgcGFnZSB0YWJsZXMgd2hpbGUgY29weWluZy4KKwkgKgorCSAqIEluIGFuIExQQVIsIHdlIGtlZXAgdGhlIE1NVSBvbiBvdGhlcndpc2Ugd2UgY2FuJ3QgYWNjZXNzIGJleW9uZAorCSAqIHRoZSBSTUEuIE9uIEJvb2tFIHRoZXJlIGlzIG5vIHJlYWwgTU1VIG9mZiBtb2RlLCBzbyB3ZSBoYXZlIHRvCisJICoga2VlcCBpdCBlbmFibGVkIGFzIHdlbGwgKGJ1dCB0aGVuIHdlIGhhdmUgYm9sdGVkIFRMQiBlbnRyaWVzKS4KKwkgKi8KKyNpZmRlZiBDT05GSUdfUFBDX0JPT0szRQorCWNvcHlfd2l0aF9tbXVfb2ZmID0gZmFsc2U7CisjZWxzZQorCWNvcHlfd2l0aF9tbXVfb2ZmID0gcmFkaXhfZW5hYmxlZCgpIHx8CisJCSEoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9MUEFSKSB8fAorCQkgIGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfUFMzX0xWMSkpOworI2VuZGlmCiAKIAkvKiBTb21lIHRoaW5ncyBhcmUgYmVzdCBkb25lIGluIGFzc2VtYmx5LiAgRmluZGluZyBnbG9iYWxzIHdpdGgKIAkgKiBhIHRvYyBpcyBlYXNpZXIgaW4gQywgc28gcGFzcyBpbiB3aGF0IHdlIGNhbi4KIAkgKi8KIAlrZXhlY19zZXF1ZW5jZSgma2V4ZWNfc3RhY2ssIGltYWdlLT5zdGFydCwgaW1hZ2UsCi0JCQlwYWdlX2FkZHJlc3MoaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKSwKLSNpZmRlZiBDT05GSUdfUFBDX1NURF9NTVUKLQkJCW1tdV9oYXNoX29wcy5ocHRlX2NsZWFyX2FsbAotI2Vsc2UKLQkJCU5VTEwKLSNlbmRpZgotCSk7CisJCSAgICAgICBwYWdlX2FkZHJlc3MoaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKSwKKwkJICAgICAgIG1tdV9jbGVhbnVwX2FsbCwgY29weV93aXRoX21tdV9vZmYpOwogCS8qIE5PVFJFQUNIRUQgKi8KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwppbmRleCBkOWM5MTJiLi4wMzc1NmZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwpAQCAtMzI4LDcgKzMyOCw3IEBACiAgKgogICogZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc3RvcCkKICAqLwotX0tQUk9CRShmbHVzaF9pY2FjaGVfcmFuZ2UpCitfR0xPQkFMKGZsdXNoX2ljYWNoZV9yYW5nZSkKIEJFR0lOX0ZUUl9TRUNUSU9OCiAJUFVSR0VfUFJFRkVUQ0hFRF9JTlMKIAlibHIJCQkJLyogZm9yIDYwMSwgZG8gbm90aGluZyAqLwpAQCAtMzU4LDYgKzM1OCw4IEBACiAJc3luYwkJCQkvKiBhZGRpdGlvbmFsIHN5bmMgbmVlZGVkIG9uIGc0ICovCiAJaXN5bmMKIAlibHIKK19BU01fTk9LUFJPQkVfU1lNQk9MKGZsdXNoX2ljYWNoZV9yYW5nZSkKKwogLyoKICAqIEZsdXNoIGEgcGFydGljdWxhciBwYWdlIGZyb20gdGhlIGRhdGEgY2FjaGUgdG8gUkFNLgogICogTm90ZTogdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUgZG9lcyAqbm90KgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUwppbmRleCBjYjE5NTE1Li45ZjBiZWQyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUwpAQCAtNjYsNyArNjYsNyBAQAogICogICBmbHVzaCBhbGwgYnl0ZXMgZnJvbSBzdGFydCB0aHJvdWdoIHN0b3AtMSBpbmNsdXNpdmUKICAqLwogCi1fS1BST0JFKGZsdXNoX2ljYWNoZV9yYW5nZSkKK19HTE9CQUwoZmx1c2hfaWNhY2hlX3JhbmdlKQogQkVHSU5fRlRSX1NFQ1RJT04KIAlQVVJHRV9QUkVGRVRDSEVEX0lOUwogCWJscgpAQCAtMTA5LDcgKzEwOSw4IEBACiAJYmRuegkyYgogCWlzeW5jCiAJYmxyCi0JLnByZXZpb3VzIC50ZXh0CitfQVNNX05PS1BST0JFX1NZTUJPTChmbHVzaF9pY2FjaGVfcmFuZ2UpCisKIC8qCiAgKiBMaWtlIGFib3ZlLCBidXQgb25seSBkbyB0aGUgRC1jYWNoZS4KICAqCkBAIC01OTEsNyArNTkyLDggQEAKICNlbmRpZgogCiAvKgotICoga2V4ZWNfc2VxdWVuY2UobmV3c3RhY2ssIHN0YXJ0LCBpbWFnZSwgY29udHJvbCwgY2xlYXJfYWxsKCkpCisgKiBrZXhlY19zZXF1ZW5jZShuZXdzdGFjaywgc3RhcnQsIGltYWdlLCBjb250cm9sLCBjbGVhcl9hbGwoKSwKKwkgICAgICAgICAgY29weV93aXRoX21tdV9vZmYpCiAgKgogICogZG9lcyB0aGUgZ3J1bmd5IHdvcmsgd2l0aCBzdGFjayBzd2l0Y2hpbmcgYW5kIHJlYWwgbW9kZSBzd2l0Y2hlcwogICogYWxzbyBkb2VzIHNpbXBsZSBjYWxscyB0byBvdGhlciBjb2RlCkBAIC02MjcsNyArNjI5LDcgQEAKIAltcglyMjkscjUJCQkvKiBpbWFnZSAodmlydCkgKi8KIAltcglyMjgscjYJCQkvKiBjb250cm9sLCB1bnVzZWQgKi8KIAltcglyMjcscjcJCQkvKiBjbGVhcl9hbGwoKSBmbiBkZXNjICovCi0JbXIJcjI2LHI4CQkJLyogc3BhcmUgKi8KKwltcglyMjYscjgJCQkvKiBjb3B5X3dpdGhfbW11X29mZiAqLwogCWxoeglyMjUsUEFDQUhXQ1BVSUQocjEzKQkvKiBnZXQgb3VyIHBoeXMgY3B1IGZyb20gcGFjYSAqLwogCiAJLyogZGlzYWJsZSBpbnRlcnJ1cHRzLCB3ZSBhcmUgb3ZlcndyaXRpbmcga2VybmVsIGRhdGEgbmV4dCAqLwpAQCAtNjM5LDE1ICs2NDEsMjQgQEAKIAltdG1zcmQJcjMsMQogI2VuZGlmCiAKKwkvKiBXZSBuZWVkIHRvIHR1cm4gdGhlIE1NVSBvZmYgdW5sZXNzIHdlIGFyZSBpbiBoYXNoIG1vZGUKKwkgKiB1bmRlciBhIGh5cGVydmlzb3IKKwkgKi8KKwljbXBkaQlyMjYsMAorCWJlcQkxZgorCWJsCXJlYWxfbW9kZQorMToKIAkvKiBjb3B5IGRlc3QgcGFnZXMsIGZsdXNoIHdob2xlIGRlc3QgaW1hZ2UgKi8KIAltcglyMyxyMjkKIAlibAlrZXhlY19jb3B5X2ZsdXNoCS8qIChpbWFnZSkgKi8KIAotCS8qIHR1cm4gb2ZmIG1tdSAqLworCS8qIHR1cm4gb2ZmIG1tdSBub3cgaWYgbm90IGRvbmUgZWFybGllciAqLworCWNtcGRpCXIyNiwwCisJYm5lCTFmCiAJYmwJcmVhbF9tb2RlCiAKIAkvKiBjb3B5ICAweDEwMCBieXRlcyBzdGFydGluZyBhdCBzdGFydCB0byAwICovCi0JbGkJcjMsMAorMToJbGkJcjMsMAogCW1yCXI0LHIzMAkJLyogc3RhcnQsIGFrYSBwaHlzIG1lbSBvZmZzZXQgKi8KIAlsaQlyNSwweDEwMAogCWxpCXI2LDAKQEAgLTY1OSw3ICs2NzAsOSBAQAogCWxpCXI2LDEKIAlzdHcJcjYsa2V4ZWNfZmxhZy0xYig1KQogCi0jaWZuZGVmIENPTkZJR19QUENfQk9PSzNFCisJY21wZGkJcjI3LDAKKwliZXEJMWYKKwogCS8qIGNsZWFyIG91dCBoYXJkd2FyZSBoYXNoIHBhZ2UgdGFibGUgYW5kIHRsYiAqLwogI2lmZGVmIFBQQzY0X0VMRl9BQklfdjEKIAlsZAlyMTIsMChyMjcpCQkvKiBkZXJlZiBmdW5jdGlvbiBkZXNjcmlwdG9yICovCkBAIC02NjgsNyArNjgxLDYgQEAKICNlbmRpZgogCW10Y3RyCXIxMgogCWJjdHJsCQkJCS8qIG1tdV9oYXNoX29wcy5ocHRlX2NsZWFyX2FsbCh2b2lkKTsgKi8KLSNlbmRpZiAvKiAhQ09ORklHX1BQQ19CT09LM0UgKi8KIAogLyoKICAqICAga2V4ZWMgaW1hZ2UgY2FsbGluZyBpczoKQEAgLTY5NSw3ICs3MDcsNyBAQAogICogICAgYXJlIHRoZSBib290IGNwdSA/Pz8/PwogICogICAgb3RoZXIgZGV2aWNlIHRyZWUgZGlmZmVyZW5jZXMgKHByb3Agc2l6ZXMsIHZhIHZzIHBhLCBldGMpLi4uCiAgKi8KLQltcglyMyxyMjUJIyBteSBwaHlzIGNwdQorMToJbXIJcjMscjI1CSMgbXkgcGh5cyBjcHUKIAltcglyNCxyMzAJIyBzdGFydCwgYWthIHBoeXMgbWVtIG9mZnNldAogCW10bHIJNAogCWxpCXI1LDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21vZHVsZS5jCmluZGV4IGQxZjFiMzUuLjMwYjg5ZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tb2R1bGUuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAotTElTVF9IRUFEKG1vZHVsZV9idWdfbGlzdCk7CitzdGF0aWMgTElTVF9IRUFEKG1vZHVsZV9idWdfbGlzdCk7CiAKIHN0YXRpYyBjb25zdCBFbGZfU2hkciAqZmluZF9zZWN0aW9uKGNvbnN0IEVsZl9FaGRyICpoZHIsCiAJCQkJICAgIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9udnJhbV82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9udnJhbV82NC5jCmluZGV4IDY0MTc0YmYuLjM0ZDJjNTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMKQEAgLTU0Miw5ICs1NDIsOSBAQAogCQkJdGltZS0+dHZfbnNlYyA9IDA7CiAJCX0KIAkJKmJ1ZiA9IGttZW1kdXAoYnVmZiArIGhkcl9zaXplLCBsZW5ndGgsIEdGUF9LRVJORUwpOworCQlrZnJlZShidWZmKTsKIAkJaWYgKCpidWYgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwotCQlrZnJlZShidWZmKTsKIAogCQkqZWNjX25vdGljZV9zaXplID0gMDsKIAkJaWYgKGVycl90eXBlID09IEVSUl9UWVBFX0tFUk5FTF9QQU5JQ19HWikKQEAgLTg1MSw3ICs4NTEsNyBAQAogCX0KIH0KIAotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBudnJhbV9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbnZyYW1fZm9wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLmxsc2VlawkJPSBkZXZfbnZyYW1fbGxzZWVrLAogCS5yZWFkCQk9IGRldl9udnJhbV9yZWFkLApAQCAtOTU2LDcgKzk1Niw3IEBACiAKIAkJLyogTWFrZSBwYXJ0aXRpb24gYSBmcmVlIHBhcnRpdGlvbiAqLwogCQlwYXJ0LT5oZWFkZXIuc2lnbmF0dXJlID0gTlZSQU1fU0lHX0ZSRUU7Ci0JCXN0cm5jcHkocGFydC0+aGVhZGVyLm5hbWUsICJ3d3d3d3d3d3d3d3ciLCAxMik7CisJCW1lbXNldChwYXJ0LT5oZWFkZXIubmFtZSwgJ3cnLCAxMik7CiAJCXBhcnQtPmhlYWRlci5jaGVja3N1bSA9IG52cmFtX2NoZWNrc3VtKCZwYXJ0LT5oZWFkZXIpOwogCQlyYyA9IG52cmFtX3dyaXRlX2hlYWRlcihwYXJ0KTsKIAkJaWYgKHJjIDw9IDApIHsKQEAgLTk3NCw4ICs5NzQsOCBAQAogCQl9CiAJCWlmIChwcmV2KSB7CiAJCQlwcmV2LT5oZWFkZXIubGVuZ3RoICs9IHBhcnQtPmhlYWRlci5sZW5ndGg7Ci0JCQlwcmV2LT5oZWFkZXIuY2hlY2tzdW0gPSBudnJhbV9jaGVja3N1bSgmcGFydC0+aGVhZGVyKTsKLQkJCXJjID0gbnZyYW1fd3JpdGVfaGVhZGVyKHBhcnQpOworCQkJcHJldi0+aGVhZGVyLmNoZWNrc3VtID0gbnZyYW1fY2hlY2tzdW0oJnByZXYtPmhlYWRlcik7CisJCQlyYyA9IG52cmFtX3dyaXRlX2hlYWRlcihwcmV2KTsKIAkJCWlmIChyYyA8PSAwKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSICJudnJhbV9yZW1vdmVfcGFydGl0aW9uOiBudnJhbV93cml0ZSBmYWlsZWQgKCVkKVxuIiwgcmMpOwogCQkJCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKaW5kZXggN2ZkZjMyNC4uOTVkMzc2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKQEAgLTE1NCw2ICsxNTQsNDIgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKTsKIAogLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjYWxsIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKCkKKyAqIGluIGEgZGVmZXJyZWQgbWFubmVyOiBhIGNhbGxiYWNrIGZyb20gdGhlIFBDSSBzdWJzeXN0ZW0uCisgKgorICogXypETyBOT1QqXyBjYWxsIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyKCkgZXhwbGljaXRseSBpZgorICogdGhpcyBpcyB1c2VkIChvciBpdCBtYXkgYWNjZXNzIGFuIGludmFsaWQgKnBoYiBwb2ludGVyKS4KKyAqCisgKiBUaGUgY2FsbGJhY2sgb2NjdXJzIHdoZW4gYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJvb3QgYnVzCisgKiBhcmUgZHJvcHBlZCAoZS5nLiwgY2hpbGQgYnVzZXMvZGV2aWNlcyBhbmQgdGhlaXIgdXNlcnMpLgorICoKKyAqIEl0J3MgY2FsbGVkIGFzIC5yZWxlYXNlX2ZuKCkgb2YgJ3N0cnVjdCBwY2lfaG9zdF9icmlkZ2UnCisgKiB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlICdzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIuYnVzJworICogKHJvb3QgYnVzKSAtIGl0IGV4cGVjdHMgLnJlbGVhc2VfZGF0YSB0byBob2xkIGEgcG9pbnRlcgorICogdG8gJ3N0cnVjdCBwY2lfY29udHJvbGxlcicuCisgKgorICogSW4gb3JkZXIgdG8gdXNlIGl0LCByZWdpc3RlciAucmVsZWFzZV9mbigpL3JlbGVhc2VfZGF0YQorICogbGlrZSB0aGlzOgorICoKKyAqIHBjaV9zZXRfaG9zdF9icmlkZ2VfcmVsZWFzZShicmlkZ2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXJfZGVmZXJyZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBwaGIpOworICoKKyAqIGUuZy4gaW4gdGhlIHBjaWJpb3Nfcm9vdF9icmlkZ2VfcHJlcGFyZSgpIGNhbGxiYWNrIGZyb20KKyAqIHBjaV9jcmVhdGVfcm9vdF9idXMoKS4KKyAqLwordm9pZCBwY2liaW9zX2ZyZWVfY29udHJvbGxlcl9kZWZlcnJlZChzdHJ1Y3QgcGNpX2hvc3RfYnJpZGdlICpicmlkZ2UpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIgPSAoc3RydWN0IHBjaV9jb250cm9sbGVyICopCisJCQkJCSBicmlkZ2UtPnJlbGVhc2VfZGF0YTsKKworCXByX2RlYnVnKCJkb21haW4gJWQsIGR5bmFtaWMgJWRcbiIsIHBoYi0+Z2xvYmFsX251bWJlciwgcGhiLT5pc19keW5hbWljKTsKKworCXBjaWJpb3NfZnJlZV9jb250cm9sbGVyKHBoYik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2liaW9zX2ZyZWVfY29udHJvbGxlcl9kZWZlcnJlZCk7CisKKy8qCiAgKiBUaGUgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG1pbmltYWwgYWxpZ25tZW50CiAgKiBmb3IgbWVtb3J5IG9yIEkvTyB3aW5kb3dzIG9mIHRoZSBhc3NvY2lhdGVkIFAyUCBicmlkZ2UuCiAgKiBCeSBkZWZhdWx0LCA0S2lCIGFsaWdubWVudCBmb3IgSS9PIHdpbmRvd3MgYW5kIDFNaUIgZm9yCkBAIC0zMjQsNyArMzYwLDcgQEAKIAkJCSBsaW5lLCBwaW4pOwogCiAJCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgbGluZSk7Ci0JCWlmICh2aXJxICE9IE5PX0lSUSkKKwkJaWYgKHZpcnEpCiAJCQlpcnFfc2V0X2lycV90eXBlKHZpcnEsIElSUV9UWVBFX0xFVkVMX0xPVyk7CiAJfSBlbHNlIHsKIAkJcHJfZGVidWcoIiBHb3Qgb25lLCBzcGVjICVkIGNlbGxzICgweCUwOHggMHglMDh4Li4uKSBvbiAlc1xuIiwKQEAgLTMzMyw3ICszNjksOCBAQAogCiAJCXZpcnEgPSBpcnFfY3JlYXRlX29mX21hcHBpbmcoJm9pcnEpOwogCX0KLQlpZih2aXJxID09IE5PX0lSUSkgeworCisJaWYgKCF2aXJxKSB7CiAJCXByX2RlYnVnKCIgRmFpbGVkIHRvIG1hcCAhXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX29mX3NjYW4uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX29mX3NjYW4uYwppbmRleCA1MjZhYzY3Li5lYTNkOTgxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9vZl9zY2FuLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfb2Zfc2Nhbi5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkJZGV2LT5oZHJfdHlwZSA9IFBDSV9IRUFERVJfVFlQRV9OT1JNQUw7CiAJCWRldi0+cm9tX2Jhc2VfcmVnID0gUENJX1JPTV9BRERSRVNTOwogCQkvKiBNYXliZSBkbyBhIGRlZmF1bHQgT0YgbWFwcGluZyBoZXJlICovCi0JCWRldi0+aXJxID0gTk9fSVJROworCQlkZXYtPmlycSA9IDA7CiAJfQogCiAJb2ZfcGNpX3BhcnNlX2FkZHJzKG5vZGUsIGRldik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDllZTI2MjMuLjllN2MxMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jCkBAIC01OSw2ICs1OSw3IEBACiAjaW5jbHVkZSA8YXNtL2V4ZWMuaD4KICNpbmNsdWRlIDxhc20vbGl2ZXBhdGNoLmg+CiAjaW5jbHVkZSA8YXNtL2NwdV9oYXNfZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9hc20tcHJvdG90eXBlcy5oPgogCiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgpAQCAtODgsNyArODksMTMgQEAKIAkJc2V0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1RNKTsKIAl9CiB9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBtc3JfdG1fYWN0aXZlKHVuc2lnbmVkIGxvbmcgbXNyKQoreworCXJldHVybiBNU1JfVE1fQUNUSVZFKG1zcik7Cit9CiAjZWxzZQorc3RhdGljIGlubGluZSBib29sIG1zcl90bV9hY3RpdmUodW5zaWduZWQgbG9uZyBtc3IpIHsgcmV0dXJuIGZhbHNlOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfaWZfdG1fcmVzdG9yZV9yZXF1aXJlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykgeyB9CiAjZW5kaWYgLyogQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTSAqLwogCkBAIC0xMDQsNyArMTExLDcgQEAKIH0KIGVhcmx5X3BhcmFtKCJwcGNfc3RyaWN0X2ZhY2lsaXR5X2VuYWJsZSIsIGVuYWJsZV9zdHJpY3RfbXNyX2NvbnRyb2wpOwogCi12b2lkIG1zcl9jaGVja19hbmRfc2V0KHVuc2lnbmVkIGxvbmcgYml0cykKK3Vuc2lnbmVkIGxvbmcgbXNyX2NoZWNrX2FuZF9zZXQodW5zaWduZWQgbG9uZyBiaXRzKQogewogCXVuc2lnbmVkIGxvbmcgb2xkbXNyID0gbWZtc3IoKTsKIAl1bnNpZ25lZCBsb25nIG5ld21zcjsKQEAgLTExOCw2ICsxMjUsOCBAQAogCiAJaWYgKG9sZG1zciAhPSBuZXdtc3IpCiAJCW10bXNyX2lzeW5jKG5ld21zcik7CisKKwlyZXR1cm4gbmV3bXNyOwogfQogCiB2b2lkIF9fbXNyX2NoZWNrX2FuZF9jbGVhcih1bnNpZ25lZCBsb25nIGJpdHMpCkBAIC0xOTYsMTkgKzIwNSwzMCBAQAogCiB2b2lkIGVuYWJsZV9rZXJuZWxfZnAodm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIGNwdW1zcjsKKwogCVdBUk5fT04ocHJlZW1wdGlibGUoKSk7CiAKLQltc3JfY2hlY2tfYW5kX3NldChNU1JfRlApOworCWNwdW1zciA9IG1zcl9jaGVja19hbmRfc2V0KE1TUl9GUCk7CiAKIAlpZiAoY3VycmVudC0+dGhyZWFkLnJlZ3MgJiYgKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfRlApKSB7CiAJCWNoZWNrX2lmX3RtX3Jlc3RvcmVfcmVxdWlyZWQoY3VycmVudCk7CisJCS8qCisJCSAqIElmIGEgdGhyZWFkIGhhcyBhbHJlYWR5IGJlZW4gcmVjbGFpbWVkIHRoZW4gdGhlCisJCSAqIGNoZWNrcG9pbnRlZCByZWdpc3RlcnMgYXJlIG9uIHRoZSBDUFUgYnV0IGhhdmUgZGVmaW5pdGVseQorCQkgKiBiZWVuIHNhdmVkIGJ5IHRoZSByZWNsYWltIGNvZGUuIERvbid0IG5lZWQgdG8gYW5kICpjYW5ub3QqCisJCSAqIGdpdmV1cCBhcyB0aGlzIHdvdWxkIHNhdmUgIHRvIHRoZSAnbGl2ZScgc3RydWN0dXJlIG5vdCB0aGUKKwkJICogY2hlY2twb2ludGVkIHN0cnVjdHVyZS4KKwkJICovCisJCWlmKCFtc3JfdG1fYWN0aXZlKGNwdW1zcikgJiYgbXNyX3RtX2FjdGl2ZShjdXJyZW50LT50aHJlYWQucmVncy0+bXNyKSkKKwkJCXJldHVybjsKIAkJX19naXZldXBfZnB1KGN1cnJlbnQpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0woZW5hYmxlX2tlcm5lbF9mcCk7CiAKIHN0YXRpYyBpbnQgcmVzdG9yZV9mcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykgewotCWlmICh0c2stPnRocmVhZC5sb2FkX2ZwKSB7CisJaWYgKHRzay0+dGhyZWFkLmxvYWRfZnAgfHwgbXNyX3RtX2FjdGl2ZSh0c2stPnRocmVhZC5yZWdzLT5tc3IpKSB7CiAJCWxvYWRfZnBfc3RhdGUoJmN1cnJlbnQtPnRocmVhZC5mcF9zdGF0ZSk7CiAJCWN1cnJlbnQtPnRocmVhZC5sb2FkX2ZwKys7CiAJCXJldHVybiAxOwpAQCAtMjQ4LDEyICsyNjgsMjMgQEAKIAogdm9pZCBlbmFibGVfa2VybmVsX2FsdGl2ZWModm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIGNwdW1zcjsKKwogCVdBUk5fT04ocHJlZW1wdGlibGUoKSk7CiAKLQltc3JfY2hlY2tfYW5kX3NldChNU1JfVkVDKTsKKwljcHVtc3IgPSBtc3JfY2hlY2tfYW5kX3NldChNU1JfVkVDKTsKIAogCWlmIChjdXJyZW50LT50aHJlYWQucmVncyAmJiAoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9WRUMpKSB7CiAJCWNoZWNrX2lmX3RtX3Jlc3RvcmVfcmVxdWlyZWQoY3VycmVudCk7CisJCS8qCisJCSAqIElmIGEgdGhyZWFkIGhhcyBhbHJlYWR5IGJlZW4gcmVjbGFpbWVkIHRoZW4gdGhlCisJCSAqIGNoZWNrcG9pbnRlZCByZWdpc3RlcnMgYXJlIG9uIHRoZSBDUFUgYnV0IGhhdmUgZGVmaW5pdGVseQorCQkgKiBiZWVuIHNhdmVkIGJ5IHRoZSByZWNsYWltIGNvZGUuIERvbid0IG5lZWQgdG8gYW5kICpjYW5ub3QqCisJCSAqIGdpdmV1cCBhcyB0aGlzIHdvdWxkIHNhdmUgIHRvIHRoZSAnbGl2ZScgc3RydWN0dXJlIG5vdCB0aGUKKwkJICogY2hlY2twb2ludGVkIHN0cnVjdHVyZS4KKwkJICovCisJCWlmKCFtc3JfdG1fYWN0aXZlKGNwdW1zcikgJiYgbXNyX3RtX2FjdGl2ZShjdXJyZW50LT50aHJlYWQucmVncy0+bXNyKSkKKwkJCXJldHVybjsKIAkJX19naXZldXBfYWx0aXZlYyhjdXJyZW50KTsKIAl9CiB9CkBAIC0yNzgsNyArMzA5LDggQEAKIAogc3RhdGljIGludCByZXN0b3JlX2FsdGl2ZWMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0JaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FMVElWRUMpICYmIHRzay0+dGhyZWFkLmxvYWRfdmVjKSB7CisJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FMVElWRUMpICYmCisJCSh0c2stPnRocmVhZC5sb2FkX3ZlYyB8fCBtc3JfdG1fYWN0aXZlKHRzay0+dGhyZWFkLnJlZ3MtPm1zcikpKSB7CiAJCWxvYWRfdnJfc3RhdGUoJnRzay0+dGhyZWFkLnZyX3N0YXRlKTsKIAkJdHNrLT50aHJlYWQudXNlZF92ciA9IDE7CiAJCXRzay0+dGhyZWFkLmxvYWRfdmVjKys7CkBAIC0zMjEsMTIgKzM1MywyMyBAQAogCiB2b2lkIGVuYWJsZV9rZXJuZWxfdnN4KHZvaWQpCiB7CisJdW5zaWduZWQgbG9uZyBjcHVtc3I7CisKIAlXQVJOX09OKHByZWVtcHRpYmxlKCkpOwogCi0JbXNyX2NoZWNrX2FuZF9zZXQoTVNSX0ZQfE1TUl9WRUN8TVNSX1ZTWCk7CisJY3B1bXNyID0gbXNyX2NoZWNrX2FuZF9zZXQoTVNSX0ZQfE1TUl9WRUN8TVNSX1ZTWCk7CiAKIAlpZiAoY3VycmVudC0+dGhyZWFkLnJlZ3MgJiYgKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfVlNYKSkgewogCQljaGVja19pZl90bV9yZXN0b3JlX3JlcXVpcmVkKGN1cnJlbnQpOworCQkvKgorCQkgKiBJZiBhIHRocmVhZCBoYXMgYWxyZWFkeSBiZWVuIHJlY2xhaW1lZCB0aGVuIHRoZQorCQkgKiBjaGVja3BvaW50ZWQgcmVnaXN0ZXJzIGFyZSBvbiB0aGUgQ1BVIGJ1dCBoYXZlIGRlZmluaXRlbHkKKwkJICogYmVlbiBzYXZlZCBieSB0aGUgcmVjbGFpbSBjb2RlLiBEb24ndCBuZWVkIHRvIGFuZCAqY2Fubm90KgorCQkgKiBnaXZldXAgYXMgdGhpcyB3b3VsZCBzYXZlICB0byB0aGUgJ2xpdmUnIHN0cnVjdHVyZSBub3QgdGhlCisJCSAqIGNoZWNrcG9pbnRlZCBzdHJ1Y3R1cmUuCisJCSAqLworCQlpZighbXNyX3RtX2FjdGl2ZShjcHVtc3IpICYmIG1zcl90bV9hY3RpdmUoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zcikpCisJCQlyZXR1cm47CiAJCWlmIChjdXJyZW50LT50aHJlYWQucmVncy0+bXNyICYgTVNSX0ZQKQogCQkJX19naXZldXBfZnB1KGN1cnJlbnQpOwogCQlpZiAoY3VycmVudC0+dGhyZWFkLnJlZ3MtPm1zciAmIE1TUl9WRUMpCkBAIC00MzgsNiArNDgxLDcgQEAKIAkJcmV0dXJuOwogCiAJbXNyX2NoZWNrX2FuZF9zZXQobXNyX2FsbF9hdmFpbGFibGUpOworCWNoZWNrX2lmX3RtX3Jlc3RvcmVfcmVxdWlyZWQodHNrKTsKIAogI2lmZGVmIENPTkZJR19QUENfRlBVCiAJaWYgKHVzZXJtc3IgJiBNU1JfRlApCkBAIC00NjQsNyArNTA4LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIG1zcjsKIAotCWlmICghY3VycmVudC0+dGhyZWFkLmxvYWRfZnAgJiYgIWxvYWR2ZWMoY3VycmVudC0+dGhyZWFkKSkKKwlpZiAoIW1zcl90bV9hY3RpdmUocmVncy0+bXNyKSAmJgorCQkhY3VycmVudC0+dGhyZWFkLmxvYWRfZnAgJiYgIWxvYWR2ZWMoY3VycmVudC0+dGhyZWFkKSkKIAkJcmV0dXJuOwogCiAJbXNyID0gcmVncy0+bXNyOwpAQCAtNzY3LDI5ICs4MTIsMTUgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KKworc3RhdGljIGlubGluZSBib29sIHRtX2VuYWJsZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJcmV0dXJuIHRzayAmJiB0c2stPnRocmVhZC5yZWdzICYmICh0c2stPnRocmVhZC5yZWdzLT5tc3IgJiBNU1JfVE0pOworfQorCiBzdGF0aWMgdm9pZCB0bV9yZWNsYWltX3RocmVhZChzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyLAogCQkJICAgICAgc3RydWN0IHRocmVhZF9pbmZvICp0aSwgdWludDhfdCBjYXVzZSkKIHsKLQl1bnNpZ25lZCBsb25nIG1zcl9kaWZmID0gMDsKLQotCS8qCi0JICogSWYgRlAvVlNYIHJlZ2lzdGVycyBoYXZlIGJlZW4gYWxyZWFkeSBzYXZlZCB0byB0aGUKLQkgKiB0aHJlYWRfc3RydWN0LCBtb3ZlIHRoZW0gdG8gdGhlIHRyYW5zYWN0X2ZwIGFycmF5LgotCSAqIFdlIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9UTSBiaXQgc2luY2UgYWZ0ZXIgdGhlIHJlY2xhaW0KLQkgKiB0aGUgdGhyZWFkIHdpbGwgbm8gbG9uZ2VyIGJlIHRyYW5zYWN0aW9uYWwuCi0JICovCi0JaWYgKHRlc3RfdGlfdGhyZWFkX2ZsYWcodGksIFRJRl9SRVNUT1JFX1RNKSkgewotCQltc3JfZGlmZiA9IHRoci0+Y2twdF9yZWdzLm1zciAmIH50aHItPnJlZ3MtPm1zcjsKLQkJaWYgKG1zcl9kaWZmICYgTVNSX0ZQKQotCQkJbWVtY3B5KCZ0aHItPnRyYW5zYWN0X2ZwLCAmdGhyLT5mcF9zdGF0ZSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHRocmVhZF9mcF9zdGF0ZSkpOwotCQlpZiAobXNyX2RpZmYgJiBNU1JfVkVDKQotCQkJbWVtY3B5KCZ0aHItPnRyYW5zYWN0X3ZyLCAmdGhyLT52cl9zdGF0ZSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHRocmVhZF92cl9zdGF0ZSkpOwotCQljbGVhcl90aV90aHJlYWRfZmxhZyh0aSwgVElGX1JFU1RPUkVfVE0pOwotCQltc3JfZGlmZiAmPSBNU1JfRlAgfCBNU1JfVkVDIHwgTVNSX1ZTWCB8IE1TUl9GRTAgfCBNU1JfRkUxOwotCX0KLQogCS8qCiAJICogVXNlIHRoZSBjdXJyZW50IE1TUiBUTSBzdXNwZW5kZWQgYml0IHRvIHRyYWNrIGlmIHdlIGhhdmUKIAkgKiBjaGVja3BvaW50ZWQgc3RhdGUgb3V0c3RhbmRpbmcuCkBAIC04MDgsMTUgKzgzOSw5IEBACiAJaWYgKCFNU1JfVE1fU1VTUEVOREVEKG1mbXNyKCkpKQogCQlyZXR1cm47CiAKLQl0bV9yZWNsYWltKHRociwgdGhyLT5yZWdzLT5tc3IsIGNhdXNlKTsKKwlnaXZldXBfYWxsKGNvbnRhaW5lcl9vZih0aHIsIHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkKSk7CiAKLQkvKiBIYXZpbmcgZG9uZSB0aGUgcmVjbGFpbSwgd2Ugbm93IGhhdmUgdGhlIGNoZWNrcG9pbnRlZAotCSAqIEZQL1ZTWCB2YWx1ZXMgaW4gdGhlIHJlZ2lzdGVycy4gIFRoZXNlIG1pZ2h0IGJlIHZhbGlkCi0JICogZXZlbiBpZiB3ZSBoYXZlIHByZXZpb3VzbHkgY2FsbGVkIGVuYWJsZV9rZXJuZWxfZnAoKSBvcgotCSAqIGZsdXNoX2ZwX3RvX3RocmVhZCgpLCBzbyB1cGRhdGUgdGhyLT5yZWdzLT5tc3IgdG8KLQkgKiBpbmRpY2F0ZSB0aGVpciBjdXJyZW50IHZhbGlkaXR5LgotCSAqLwotCXRoci0+cmVncy0+bXNyIHw9IG1zcl9kaWZmOworCXRtX3JlY2xhaW0odGhyLCB0aHItPmNrcHRfcmVncy5tc3IsIGNhdXNlKTsKIH0KIAogdm9pZCB0bV9yZWNsYWltX2N1cnJlbnQodWludDhfdCBjYXVzZSkKQEAgLTgzMiw4ICs4NTcsOCBAQAogCSAqCiAJICogSW4gc3dpdGNoaW5nIHdlIG5lZWQgdG8gbWFpbnRhaW4gYSAybmQgcmVnaXN0ZXIgc3RhdGUgYXMKIAkgKiBvbGR0YXNrLT50aHJlYWQuY2twdF9yZWdzLiAgV2UgdG1fcmVjbGFpbShvbGRwcm9jKTsgdGhpcyBzYXZlcyB0aGUKLQkgKiBjaGVja3BvaW50ZWQgKHRiZWdpbikgc3RhdGUgaW4gY2twdF9yZWdzIGFuZCBzYXZlcyB0aGUgdHJhbnNhY3Rpb25hbAotCSAqIChjdXJyZW50KSBGUFJzIGludG8gb2xkdGFzay0+dGhyZWFkLnRyYW5zYWN0X2ZwcltdLgorCSAqIGNoZWNrcG9pbnRlZCAodGJlZ2luKSBzdGF0ZSBpbiBja3B0X3JlZ3MsIGNrZnBfc3RhdGUgYW5kCisJICogY2t2cl9zdGF0ZQogCSAqCiAJICogV2UgYWxzbyBjb250ZXh0IHN3aXRjaCAoc2F2ZSkgVEZIQVIvVEVYQVNSL1RGSUFSIGluIGhlcmUuCiAJICovCkBAIC04NDUsMTQgKzg3MCw2IEBACiAJaWYgKCFNU1JfVE1fQUNUSVZFKHRoci0+cmVncy0+bXNyKSkKIAkJZ290byBvdXRfYW5kX3NhdmVyZWdzOwogCi0JLyogU3Rhc2ggdGhlIG9yaWdpbmFsIHRocmVhZCBNU1IsIGFzIGdpdmV1cF9mcHUgZXQgYWwgd2lsbAotCSAqIG1vZGlmeSBpdC4gIFdlIGhvbGQgb250byBpdCB0byBzZWUgd2hldGhlciB0aGUgdGFzayB1c2VkCi0JICogRlAgJiB2ZWN0b3IgcmVncy4gIElmIHRoZSBUSUZfUkVTVE9SRV9UTSBmbGFnIGlzIHNldCwKLQkgKiBja3B0X3JlZ3MubXNyIGlzIGFscmVhZHkgc2V0LgotCSAqLwotCWlmICghdGVzdF90aV90aHJlYWRfZmxhZyh0YXNrX3RocmVhZF9pbmZvKHRzayksIFRJRl9SRVNUT1JFX1RNKSkKLQkJdGhyLT5ja3B0X3JlZ3MubXNyID0gdGhyLT5yZWdzLT5tc3I7Ci0KIAlUTV9ERUJVRygiLS0tIHRtX3JlY2xhaW0gb24gcGlkICVkIChOSVA9JWx4LCAiCiAJCSAiY2NyPSVseCwgbXNyPSVseCwgdHJhcD0lbHgpXG4iLAogCQkgdHNrLT5waWQsIHRoci0+cmVncy0+bmlwLApAQCAtODgxLDYgKzg5OCw5IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmICghKHRocmVhZC0+cmVncy0+bXNyICYgTVNSX1RNKSkKKwkJcmV0dXJuOworCiAJLyogV2UgcmVhbGx5IGNhbid0IGJlIGludGVycnVwdGVkIGhlcmUgYXMgdGhlIFRFWEFTUiByZWdpc3RlcnMgY2FuJ3QKIAkgKiBjaGFuZ2UgYW5kIGxhdGVyIGluIHRoZSB0cmVjaGVja3BvaW50IGNvZGUsIHdlIGhhdmUgYSB1c2Vyc3BhY2UgUjEuCiAJICogU28gbGV0J3MgaGFyZCBkaXNhYmxlIG92ZXIgdGhpcyByZWdpb24uCkBAIC05MTAsMTAgKzkzMCwxMCBAQAogCSAqIElmIHRoZSB0YXNrIHdhcyB1c2luZyBGUCwgd2Ugbm9uLWxhemlseSByZWxvYWQgYm90aCB0aGUgb3JpZ2luYWwgYW5kCiAJICogdGhlIHNwZWN1bGF0aXZlIEZQIHJlZ2lzdGVyIHN0YXRlcy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUga2VybmVsCiAJICogZG9lc24ndCBzZWUgaWYvd2hlbiBhIFRNIHJvbGxiYWNrIG9jY3Vycywgc28gaWYgd2UgdGFrZSBhbiBGUAotCSAqIHVuYXZvaWRhYmxlIGxhdGVyLCB3ZSBhcmUgdW5hYmxlIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgRlAgcmVncworCSAqIHVuYXZhaWxhYmxlIGxhdGVyLCB3ZSBhcmUgdW5hYmxlIHRvIGRldGVybWluZSB3aGljaCBzZXQgb2YgRlAgcmVncwogCSAqIG5lZWQgdG8gYmUgcmVzdG9yZWQuCiAJICovCi0JaWYgKCFuZXctPnRocmVhZC5yZWdzKQorCWlmICghdG1fZW5hYmxlZChuZXcpKQogCQlyZXR1cm47CiAKIAlpZiAoIU1TUl9UTV9BQ1RJVkUobmV3LT50aHJlYWQucmVncy0+bXNyKSl7CkBAIC05MjYsMzUgKzk0NiwzNSBAQAogCQkgIihuZXctPm1zciAweCVseCwgbmV3LT5vcmlnbXNyIDB4JWx4KVxuIiwKIAkJIG5ldy0+cGlkLCBuZXctPnRocmVhZC5yZWdzLT5tc3IsIG1zcik7CiAKLQkvKiBUaGlzIGxvYWRzIHRoZSBjaGVja3BvaW50ZWQgRlAvVkVDIHN0YXRlLCBpZiB1c2VkICovCiAJdG1fcmVjaGVja3BvaW50KCZuZXctPnRocmVhZCwgbXNyKTsKIAotCS8qIFRoaXMgbG9hZHMgdGhlIHNwZWN1bGF0aXZlIEZQL1ZFQyBzdGF0ZSwgaWYgdXNlZCAqLwotCWlmIChtc3IgJiBNU1JfRlApIHsKLQkJZG9fbG9hZF91cF90cmFuc2FjdF9mcHUoJm5ldy0+dGhyZWFkKTsKLQkJbmV3LT50aHJlYWQucmVncy0+bXNyIHw9Ci0JCQkoTVNSX0ZQIHwgbmV3LT50aHJlYWQuZnBleGNfbW9kZSk7Ci0JfQotI2lmZGVmIENPTkZJR19BTFRJVkVDCi0JaWYgKG1zciAmIE1TUl9WRUMpIHsKLQkJZG9fbG9hZF91cF90cmFuc2FjdF9hbHRpdmVjKCZuZXctPnRocmVhZCk7Ci0JCW5ldy0+dGhyZWFkLnJlZ3MtPm1zciB8PSBNU1JfVkVDOwotCX0KLSNlbmRpZgotCS8qIFdlIG1heSBhcyB3ZWxsIHR1cm4gb24gVlNYIHRvbyBzaW5jZSBhbGwgdGhlIHN0YXRlIGlzIHJlc3RvcmVkIG5vdyAqLwotCWlmIChtc3IgJiBNU1JfVlNYKQotCQluZXctPnRocmVhZC5yZWdzLT5tc3IgfD0gTVNSX1ZTWDsKKwkvKgorCSAqIFRoZSBjaGVja3BvaW50ZWQgc3RhdGUgaGFzIGJlZW4gcmVzdG9yZWQgYnV0IHRoZSBsaXZlIHN0YXRlIGhhcworCSAqIG5vdCwgZW5zdXJlIGFsbCB0aGUgbWF0aCBmdW5jdGlvbmFsaXR5IGlzIHR1cm5lZCBvZmYgdG8gdHJpZ2dlcgorCSAqIHJlc3RvcmVfbWF0aCgpIHRvIHJlbG9hZC4KKwkgKi8KKwluZXctPnRocmVhZC5yZWdzLT5tc3IgJj0gfihNU1JfRlAgfCBNU1JfVkVDIHwgTVNSX1ZTWCk7CiAKIAlUTV9ERUJVRygiKioqIHRtX3JlY2hlY2twb2ludCBvZiBwaWQgJWQgY29tcGxldGUgIgogCQkgIihrZXJuZWwgbXNyIDB4JWx4KVxuIiwKIAkJIG5ldy0+cGlkLCBtZm1zcigpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9fc3dpdGNoX3RvX3RtKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N3aXRjaF90b190bShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsCisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3KQogewogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9UTSkpIHsKLQkJdG1fZW5hYmxlKCk7Ci0JCXRtX3JlY2xhaW1fdGFzayhwcmV2KTsKKwkJaWYgKHRtX2VuYWJsZWQocHJldikgfHwgdG1fZW5hYmxlZChuZXcpKQorCQkJdG1fZW5hYmxlKCk7CisKKwkJaWYgKHRtX2VuYWJsZWQocHJldikpIHsKKwkJCXByZXYtPnRocmVhZC5sb2FkX3RtKys7CisJCQl0bV9yZWNsYWltX3Rhc2socHJldik7CisJCQlpZiAoIU1TUl9UTV9BQ1RJVkUocHJldi0+dGhyZWFkLnJlZ3MtPm1zcikgJiYgcHJldi0+dGhyZWFkLmxvYWRfdG0gPT0gMCkKKwkJCQlwcmV2LT50aHJlYWQucmVncy0+bXNyICY9IH5NU1JfVE07CisJCX0KKworCQl0bV9yZWNoZWNrcG9pbnRfbmV3X3Rhc2sobmV3KTsKIAl9CiB9CiAKQEAgLTk3Niw2ICs5OTYsMTIgQEAKIHsKIAl1bnNpZ25lZCBsb25nIG1zcl9kaWZmOwogCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBvbmx5IG1vbWVudCB3ZSBzaG91bGQgY2xlYXIgVElGX1JFU1RPUkVfVE0gYXMKKwkgKiBpdCBpcyBoZXJlIHRoYXQgY2twdF9yZWdzLm1zciBhbmQgcHRfcmVncy5tc3IgYmVjb21lIHRoZSBzYW1lCisJICogYWdhaW4sIGFueXRoaW5nIGVsc2UgY291bGQgbGVhZCB0byBhbiBpbmNvcnJlY3QgY2twdF9tc3IgYmVpbmcKKwkgKiBzYXZlZCBhbmQgdGhlcmVmb3JlIGluY29ycmVjdCBzaWduYWwgY29udGV4dHMuCisJICovCiAJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfVE0pOwogCWlmICghTVNSX1RNX0FDVElWRShyZWdzLT5tc3IpKQogCQlyZXR1cm47CkBAIC05ODMsNiArMTAwOSwxMyBAQAogCW1zcl9kaWZmID0gY3VycmVudC0+dGhyZWFkLmNrcHRfcmVncy5tc3IgJiB+cmVncy0+bXNyOwogCW1zcl9kaWZmICY9IE1TUl9GUCB8IE1TUl9WRUMgfCBNU1JfVlNYOwogCisJLyogRW5zdXJlIHRoYXQgcmVzdG9yZV9tYXRoKCkgd2lsbCByZXN0b3JlICovCisJaWYgKG1zcl9kaWZmICYgTVNSX0ZQKQorCQljdXJyZW50LT50aHJlYWQubG9hZF9mcCA9IDE7CisjaWZkZWYgQ09ORklHX0FMSVZFQworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BTFRJVkVDKSAmJiBtc3JfZGlmZiAmIE1TUl9WRUMpCisJCWN1cnJlbnQtPnRocmVhZC5sb2FkX3ZlYyA9IDE7CisjZW5kaWYKIAlyZXN0b3JlX21hdGgocmVncyk7CiAKIAlyZWdzLT5tc3IgfD0gbXNyX2RpZmY7CkBAIC05OTAsNyArMTAyMyw3IEBACiAKICNlbHNlCiAjZGVmaW5lIHRtX3JlY2hlY2twb2ludF9uZXdfdGFzayhuZXcpCi0jZGVmaW5lIF9fc3dpdGNoX3RvX3RtKHByZXYpCisjZGVmaW5lIF9fc3dpdGNoX3RvX3RtKHByZXYsIG5ldykKICNlbmRpZiAvKiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX3NwcnMoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQpCkBAIC0xMTMxLDExICsxMTY0LDExIEBACiAJICovCiAJc2F2ZV9zcHJzKCZwcmV2LT50aHJlYWQpOwogCi0JX19zd2l0Y2hfdG9fdG0ocHJldik7Ci0KIAkvKiBTYXZlIEZQVSwgQWx0aXZlYywgVlNYIGFuZCBTUEUgc3RhdGUgKi8KIAlnaXZldXBfYWxsKHByZXYpOwogCisJX19zd2l0Y2hfdG9fdG0ocHJldiwgbmV3KTsKKwogCS8qCiAJICogV2UgY2FuJ3QgdGFrZSBhIFBNVSBleGNlcHRpb24gaW5zaWRlIF9zd2l0Y2goKSBzaW5jZSB0aGVyZSBpcyBhCiAJICogd2luZG93IHdoZXJlIHRoZSBrZXJuZWwgc3RhY2sgU0xCIGFuZCB0aGUga2VybmVsIHN0YWNrIGFyZSBvdXQKQEAgLTExNDMsOCArMTE3Niw2IEBACiAJICovCiAJaGFyZF9pcnFfZGlzYWJsZSgpOwogCi0JdG1fcmVjaGVja3BvaW50X25ld190YXNrKG5ldyk7Ci0KIAkvKgogCSAqIENhbGwgcmVzdG9yZV9zcHJzKCkgYmVmb3JlIGNhbGxpbmcgX3N3aXRjaCgpLiBJZiB3ZSBtb3ZlIGl0IGFmdGVyCiAJICogX3N3aXRjaCgpIHRoZW4gd2UgbWlzcyBvdXQgb24gY2FsbGluZyBpdCBmb3IgbmV3IHRhc2tzLiBUaGUgcmVhc29uCkBAIC0xMzc5LDkgKzE0MTAsMTEgQEAKIAkgKiB0cmFuc2l0aW9ucyB0aGUgQ1BVIG91dCBvZiBUTSBtb2RlLiAgSGVuY2Ugd2UgbmVlZCB0byBjYWxsCiAJICogdG1fcmVjaGVja3BvaW50X25ld190YXNrKCkgKG9uIHRoZSBzYW1lIHRhc2spIHRvIHJlc3RvcmUgdGhlCiAJICogY2hlY2twb2ludGVkIHN0YXRlIGJhY2sgYW5kIHRoZSBUTSBtb2RlLgorCSAqCisJICogQ2FuJ3QgcGFzcyBkc3QgYmVjYXVzZSBpdCBpc24ndCByZWFkeS4gRG9lc24ndCBtYXR0ZXIsIHBhc3NpbmcKKwkgKiBkc3QgaXMgb25seSBpbXBvcnRhbnQgZm9yIF9fc3dpdGNoX3RvKCkKIAkgKi8KLQlfX3N3aXRjaF90b190bShzcmMpOwotCXRtX3JlY2hlY2twb2ludF9uZXdfdGFzayhzcmMpOworCV9fc3dpdGNoX3RvX3RtKHNyYywgc3JjKTsKIAogCSpkc3QgPSAqc3JjOwogCkBAIC0xNjIzLDggKzE2NTYsNiBAQAogCWN1cnJlbnQtPnRocmVhZC51c2VkX3NwZSA9IDA7CiAjZW5kaWYgLyogQ09ORklHX1NQRSAqLwogI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KLQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfVE0pKQotCQlyZWdzLT5tc3IgfD0gTVNSX1RNOwogCWN1cnJlbnQtPnRocmVhZC50bV90ZmhhciA9IDA7CiAJY3VycmVudC0+dGhyZWFkLnRtX3RleGFzciA9IDA7CiAJY3VycmVudC0+dGhyZWFkLnRtX3RmaWFyID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCmluZGV4IDRlNzRmYzUuLjg4YWM5NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL29wYWwuaD4KKyNpbmNsdWRlIDxhc20vYXNtLXByb3RvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2xpbnV4X2xvZ28uaD4KIApAQCAtNjk1LDcgKzY5Niw3IEBACiAJT1Y0X01JTl9FTlRfQ0FQLAkJLyogbWluaW11bSBWUCBlbnRpdGxlZCBjYXBhY2l0eSAqLwogCiAJLyogb3B0aW9uIHZlY3RvciA1OiBQQVBSL09GIG9wdGlvbnMgKi8KLQlWRUNUT1JfTEVOR1RIKDE4KSwJCS8qIGxlbmd0aCAqLworCVZFQ1RPUl9MRU5HVEgoMjEpLAkJLyogbGVuZ3RoICovCiAJMCwJCQkJLyogZG9uJ3QgaWdub3JlLCBkb24ndCBoYWx0ICovCiAJT1Y1X0ZFQVQoT1Y1X0xQQVIpIHwgT1Y1X0ZFQVQoT1Y1X1NQTFBBUikgfCBPVjVfRkVBVChPVjVfTEFSR0VfUEFHRVMpIHwKIAlPVjVfRkVBVChPVjVfRFJDT05GX01FTU9SWSkgfCBPVjVfRkVBVChPVjVfRE9OQVRFX0RFRElDQVRFX0NQVSkgfApAQCAtNzI2LDggKzcyNywxMSBAQAogCTAsCiAJMCwKIAlPVjVfRkVBVChPVjVfUEZPX0hXX1JORykgfCBPVjVfRkVBVChPVjVfUEZPX0hXX0VOQ1IpIHwKLQlPVjVfRkVBVChPVjVfUEZPX0hXXzg0MiksCi0JT1Y1X0ZFQVQoT1Y1X1NVQl9QUk9DRVNTT1JTKSwKKwlPVjVfRkVBVChPVjVfUEZPX0hXXzg0MiksCQkJCS8qIEJ5dGUgMTcgKi8KKwkwLAkJCQkJCQkvKiBCeXRlIDE4ICovCisJMCwJCQkJCQkJLyogQnl0ZSAxOSAqLworCTAsCQkJCQkJCS8qIEJ5dGUgMjAgKi8KKwlPVjVfRkVBVChPVjVfU1VCX1BST0NFU1NPUlMpLAkJCQkvKiBCeXRlIDIxICovCiAKIAkvKiBvcHRpb24gdmVjdG9yIDY6IElCTSBQQVBSIGhpbnRzICovCiAJVkVDVE9SX0xFTkdUSCgzKSwJCS8qIGxlbmd0aCAqLwpAQCAtMjY0MCw2ICsyNjQ0LDg2IEBACiAjZGVmaW5lIGZpeHVwX2RldmljZV90cmVlX2VmaWthKCkKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BQQ19QQVNFTUlfTkVNTworLyoKKyAqIENGRSBzdXBwbGllZCBvbiBOZW1vIGlzIGJyb2tlbiBpbiBzZXZlcmFsIHdheXMsIGJpZ2dlc3QKKyAqIHByb2JsZW0gaXMgdGhhdCBpdCByZWFzc2lnbnMgSVNBIGludGVycnVwdHMgdG8gdW51c2VkIG1waWMgaW50cy4KKyAqIEFkZCBhbiBpbnRlcnJ1cHQtY29udHJvbGxlciBwcm9wZXJ0eSBmb3IgdGhlIGlvLWJyaWRnZSB0byB1c2UKKyAqIGFuZCBjb3JyZWN0IHRoZSBpbnRzIHNvIHdlIGNhbiBhdHRhY2ggdGhlbSB0byBhbiBpcnFfZG9tYWluCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBmaXh1cF9kZXZpY2VfdHJlZV9wYXNlbWkodm9pZCkKK3sKKwl1MzIgaW50ZXJydXB0c1syXSwgcGFyZW50LCBydmFsLCB2YWwgPSAwOworCWNoYXIgKm5hbWUsICpwY2lfbmFtZTsKKwlwaGFuZGxlIGlvYiwgbm9kZTsKKworCS8qIEZpbmQgdGhlIHJvb3QgcGNpIG5vZGUgKi8KKwluYW1lID0gIi9weHBAMCxlMDAwMDAwMCI7CisJaW9iID0gY2FsbF9wcm9tKCJmaW5kZGV2aWNlIiwgMSwgMSwgQUREUihuYW1lKSk7CisJaWYgKCFQSEFORExFX1ZBTElEKGlvYikpCisJCXJldHVybjsKKworCS8qIGNoZWNrIGlmIGludGVycnVwdC1jb250cm9sbGVyIG5vZGUgc2V0IHlldCAqLworCWlmIChwcm9tX2dldHByb3BsZW4oaW9iLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiKSAhPVBST01fRVJST1IpCisJCXJldHVybjsKKworCXByb21fcHJpbnRmKCJhZGRpbmcgaW50ZXJydXB0LWNvbnRyb2xsZXIgcHJvcGVydHkgZm9yIFNCNjAwLi4uXG4iKTsKKworCXByb21fc2V0cHJvcChpb2IsIG5hbWUsICJpbnRlcnJ1cHQtY29udHJvbGxlciIsICZ2YWwsIDApOworCisJcGNpX25hbWUgPSAiL3B4cEAwLGUwMDAwMDAwL3BjaUAxMSI7CisJbm9kZSA9IGNhbGxfcHJvbSgiZmluZGRldmljZSIsIDEsIDEsIEFERFIocGNpX25hbWUpKTsKKwlwYXJlbnQgPSBBRERSKGlvYik7CisKKwlmb3IoIDsgcHJvbV9uZXh0X25vZGUoJm5vZGUpOyApIHsKKwkJLyogc2NhbiBlYWNoIG5vZGUgZm9yIG9uZSB3aXRoIGFuIGludGVycnVwdCAqLworCQlpZiAoIVBIQU5ETEVfVkFMSUQobm9kZSkpCisJCQljb250aW51ZTsKKworCQlydmFsID0gcHJvbV9nZXRwcm9wbGVuKG5vZGUsICJpbnRlcnJ1cHRzIik7CisJCWlmIChydmFsID09IDAgfHwgcnZhbCA9PSBQUk9NX0VSUk9SKQorCQkJY29udGludWU7CisKKwkJcHJvbV9nZXRwcm9wKG5vZGUsICJpbnRlcnJ1cHRzIiwgJmludGVycnVwdHMsIHNpemVvZihpbnRlcnJ1cHRzKSk7CisJCWlmICgoaW50ZXJydXB0c1swXSA8IDIxMikgfHwgKGludGVycnVwdHNbMF0gPiAyMjIpKQorCQkJY29udGludWU7CisKKwkJLyogZm91bmQgYSBub2RlLCB1cGRhdGUgYm90aCBpbnRlcnJ1cHRzIGFuZCBpbnRlcnJ1cHQtcGFyZW50ICovCisJCWlmICgoaW50ZXJydXB0c1swXSA+PSAyMTIpICYmIChpbnRlcnJ1cHRzWzBdIDw9IDIxNSkpCisJCQlpbnRlcnJ1cHRzWzBdIC09IDIwMzsKKwkJaWYgKChpbnRlcnJ1cHRzWzBdID49IDIxNikgJiYgKGludGVycnVwdHNbMF0gPD0gMjIwKSkKKwkJCWludGVycnVwdHNbMF0gLT0gMjEzOworCQlpZiAoaW50ZXJydXB0c1swXSA9PSAyMjEpCisJCQlpbnRlcnJ1cHRzWzBdID0gMTQ7CisJCWlmIChpbnRlcnJ1cHRzWzBdID09IDIyMikKKwkJCWludGVycnVwdHNbMF0gPSA4OworCisJCXByb21fc2V0cHJvcChub2RlLCBwY2lfbmFtZSwgImludGVycnVwdHMiLCBpbnRlcnJ1cHRzLAorCQkJCQlzaXplb2YoaW50ZXJydXB0cykpOworCQlwcm9tX3NldHByb3Aobm9kZSwgcGNpX25hbWUsICJpbnRlcnJ1cHQtcGFyZW50IiwgJnBhcmVudCwKKwkJCQkJc2l6ZW9mKHBhcmVudCkpOworCX0KKworCS8qCisJICogVGhlIGlvLWJyaWRnZSBoYXMgZGV2aWNlX3R5cGUgc2V0IHRvICdpby1icmlkZ2UnIGNoYW5nZSBpdCB0byAnaXNhJworCSAqIHNvIHRoYXQgZ2VuZXJpYyBpc2EtYnJpZGdlIGNvZGUgY2FuIGFkZCB0aGUgU0I2MDAgYW5kIGl0cyBvbi1ib2FyZAorCSAqIHBlcmlwaGVyYWxzLgorCSAqLworCW5hbWUgPSAiL3B4cEAwLGUwMDAwMDAwL2lvLWJyaWRnZUAwIjsKKwlpb2IgPSBjYWxsX3Byb20oImZpbmRkZXZpY2UiLCAxLCAxLCBBRERSKG5hbWUpKTsKKwlpZiAoIVBIQU5ETEVfVkFMSUQoaW9iKSkKKwkJcmV0dXJuOworCisJLyogZGV2aWNlX3R5cGUgaXMgYWxyZWFkeSBzZXQsIGp1c3QgY2hhbmdlIGl0LiAqLworCisJcHJvbV9wcmludGYoIkNoYW5naW5nIGRldmljZV90eXBlIG9mIFNCNjAwIG5vZGUuLi5cbiIpOworCisJcHJvbV9zZXRwcm9wKGlvYiwgbmFtZSwgImRldmljZV90eXBlIiwgImlzYSIsIHNpemVvZigiaXNhIikpOworfQorI2Vsc2UJLyogIUNPTkZJR19QUENfUEFTRU1JX05FTU8gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmaXh1cF9kZXZpY2VfdHJlZV9wYXNlbWkodm9pZCkgeyB9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgX19pbml0IGZpeHVwX2RldmljZV90cmVlKHZvaWQpCiB7CiAJZml4dXBfZGV2aWNlX3RyZWVfbWFwbGUoKTsKQEAgLTI2NDcsNiArMjczMSw3IEBACiAJZml4dXBfZGV2aWNlX3RyZWVfY2hycCgpOwogCWZpeHVwX2RldmljZV90cmVlX3BtYWMoKTsKIAlmaXh1cF9kZXZpY2VfdHJlZV9lZmlrYSgpOworCWZpeHVwX2RldmljZV90cmVlX3Bhc2VtaSgpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgcHJvbV9maW5kX2Jvb3RfY3B1KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYwppbmRleCBiZjkxNjU4Li5iMWVjNjJmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zd2l0Y2hfdG8uaD4KICNpbmNsdWRlIDxhc20vdG0uaD4KKyNpbmNsdWRlIDxhc20vYXNtLXByb3RvdHlwZXMuaD4KIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3N5c2NhbGxzLmg+CkBAIC00MDIsMTMgKzQwMyw5IEBACiB9CiAKIC8qCi0gKiBXaGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhY3RpdmUsICd0cmFuc2FjdF9mcCcgaG9sZHMgdGhlIGN1cnJlbnQgcnVubmluZwotICogdmFsdWUgb2YgYWxsIEZQUiByZWdpc3RlcnMgYW5kICdmcF9zdGF0ZScgaG9sZHMgdGhlIGxhc3QgY2hlY2twb2ludGVkCi0gKiB2YWx1ZSBvZiBhbGwgRlBSIHJlZ2lzdGVycyBmb3IgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uIFdoZW4gdHJhbnNhY3Rpb24KLSAqIGlzIG5vdCBhY3RpdmUgJ2ZwX3N0YXRlJyBob2xkcyB0aGUgY3VycmVudCBydW5uaW5nIHN0YXRlIG9mIGFsbCB0aGUgRlBSCi0gKiByZWdpc3RlcnMuIFNvIHRoaXMgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyB0aGUgY3VycmVudCBydW5uaW5nIHZhbHVlcyBvZgotICogYWxsIHRoZSBGUFIgcmVnaXN0ZXJzLCBuZWVkcyB0byBrbm93IHdoZXRoZXIgYW55IHRyYW5zYWN0aW9uIGlzIGFjdGl2ZQotICogb3Igbm90LgorICogUmVnYXJkbGVzcyBvZiB0cmFuc2FjdGlvbnMsICdmcF9zdGF0ZScgaG9sZHMgdGhlIGN1cnJlbnQgcnVubmluZworICogdmFsdWUgb2YgYWxsIEZQUiByZWdpc3RlcnMgYW5kICdja2ZwX3N0YXRlJyBob2xkcyB0aGUgbGFzdCBjaGVja3BvaW50ZWQKKyAqIHZhbHVlIG9mIGFsbCBGUFIgcmVnaXN0ZXJzIGZvciB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KICAqCiAgKiBVc2Vyc3BhY2UgaW50ZXJmYWNlIGJ1ZmZlciBsYXlvdXQ6CiAgKgpAQCAtNDE2LDEzICs0MTMsNiBAQAogICoJdTY0CWZwclszMl07CiAgKgl1NjQJZnBzY3I7CiAgKiB9OwotICoKLSAqIFRoZXJlIGFyZSB0d28gY29uZmlnIG9wdGlvbnMgQ09ORklHX1ZTWCBhbmQgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotICogd2hpY2ggZGV0ZXJtaW5lcyB0aGUgZmluYWwgY29kZSBpbiB0aGlzIGZ1bmN0aW9uLiBBbGwgdGhlIGNvbWJpbmF0aW9ucyBvZgotICogdGhlc2UgdHdvIGNvbmZpZyBvcHRpb25zIGFyZSBwb3NzaWJsZSBleGNlcHQgdGhlIG9uZSBiZWxvdyBhcyB0cmFuc2FjdGlvbmFsCi0gKiBtZW1vcnkgY29uZmlnIHB1bGxzIGluIENPTkZJR19WU1ggYXV0b21hdGljYWxseS4KLSAqCi0gKgkhZGVmaW5lZChDT05GSUdfVlNYKSAmJiBkZWZpbmVkKENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0pCiAgKi8KIHN0YXRpYyBpbnQgZnByX2dldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCiAJCSAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKQEAgLTQzMSw1MCArNDIxLDI5IEBACiAjaWZkZWYgQ09ORklHX1ZTWAogCXU2NCBidWZbMzNdOwogCWludCBpOwotI2VuZGlmCisKIAlmbHVzaF9mcF90b190aHJlYWQodGFyZ2V0KTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1ZTWCkgJiYgZGVmaW5lZChDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNKQotCS8qIGNvcHkgdG8gbG9jYWwgYnVmZmVyIHRoZW4gd3JpdGUgdGhhdCBvdXQgKi8KLQlpZiAoTVNSX1RNX0FDVElWRSh0YXJnZXQtPnRocmVhZC5yZWdzLT5tc3IpKSB7Ci0JCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHRhcmdldCk7Ci0JCWZsdXNoX3RtcmVnc190b190aHJlYWQodGFyZ2V0KTsKLQkJZm9yIChpID0gMDsgaSA8IDMyIDsgaSsrKQotCQkJYnVmW2ldID0gdGFyZ2V0LT50aHJlYWQuVFNfVFJBTlNfRlBSKGkpOwotCQlidWZbMzJdID0gdGFyZ2V0LT50aHJlYWQudHJhbnNhY3RfZnAuZnBzY3I7Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IDMyIDsgaSsrKQotCQkJYnVmW2ldID0gdGFyZ2V0LT50aHJlYWQuVFNfRlBSKGkpOwotCQlidWZbMzJdID0gdGFyZ2V0LT50aHJlYWQuZnBfc3RhdGUuZnBzY3I7Ci0JfQotCXJldHVybiB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLCBidWYsIDAsIC0xKTsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfVlNYKSAmJiAhZGVmaW5lZChDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNKQogCS8qIGNvcHkgdG8gbG9jYWwgYnVmZmVyIHRoZW4gd3JpdGUgdGhhdCBvdXQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMzIgOyBpKyspCiAJCWJ1ZltpXSA9IHRhcmdldC0+dGhyZWFkLlRTX0ZQUihpKTsKIAlidWZbMzJdID0gdGFyZ2V0LT50aHJlYWQuZnBfc3RhdGUuZnBzY3I7CiAJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsIGJ1ZiwgMCwgLTEpOwotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChDT05GSUdfVlNYKSAmJiAhZGVmaW5lZChDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNKQorI2Vsc2UKIAlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9mcF9zdGF0ZSwgZnBzY3IpICE9CiAJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9mcF9zdGF0ZSwgZnByWzMyXSkpOwogCisJZmx1c2hfZnBfdG9fdGhyZWFkKHRhcmdldCk7CisKIAlyZXR1cm4gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKIAkJCQkgICAmdGFyZ2V0LT50aHJlYWQuZnBfc3RhdGUsIDAsIC0xKTsKICNlbmRpZgogfQogCiAvKgotICogV2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYWN0aXZlLCAndHJhbnNhY3RfZnAnIGhvbGRzIHRoZSBjdXJyZW50IHJ1bm5pbmcKLSAqIHZhbHVlIG9mIGFsbCBGUFIgcmVnaXN0ZXJzIGFuZCAnZnBfc3RhdGUnIGhvbGRzIHRoZSBsYXN0IGNoZWNrcG9pbnRlZAotICogdmFsdWUgb2YgYWxsIEZQUiByZWdpc3RlcnMgZm9yIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiBXaGVuIHRyYW5zYWN0aW9uCi0gKiBpcyBub3QgYWN0aXZlICdmcF9zdGF0ZScgaG9sZHMgdGhlIGN1cnJlbnQgcnVubmluZyBzdGF0ZSBvZiBhbGwgdGhlIEZQUgotICogcmVnaXN0ZXJzLiBTbyB0aGlzIGZ1bmN0aW9uIHdoaWNoIHNldHNzIHRoZSBjdXJyZW50IHJ1bm5pbmcgdmFsdWVzIG9mCi0gKiBhbGwgdGhlIEZQUiByZWdpc3RlcnMsIG5lZWRzIHRvIGtub3cgd2hldGhlciBhbnkgdHJhbnNhY3Rpb24gaXMgYWN0aXZlCi0gKiBvciBub3QuCisgKiBSZWdhcmRsZXNzIG9mIHRyYW5zYWN0aW9ucywgJ2ZwX3N0YXRlJyBob2xkcyB0aGUgY3VycmVudCBydW5uaW5nCisgKiB2YWx1ZSBvZiBhbGwgRlBSIHJlZ2lzdGVycyBhbmQgJ2NrZnBfc3RhdGUnIGhvbGRzIHRoZSBsYXN0IGNoZWNrcG9pbnRlZAorICogdmFsdWUgb2YgYWxsIEZQUiByZWdpc3RlcnMgZm9yIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgogICoKICAqIFVzZXJzcGFjZSBpbnRlcmZhY2UgYnVmZmVyIGxheW91dDoKICAqCkBAIC00ODMsMTIgKzQ1Miw2IEBACiAgKgl1NjQJZnBzY3I7CiAgKiB9OwogICoKLSAqIFRoZXJlIGFyZSB0d28gY29uZmlnIG9wdGlvbnMgQ09ORklHX1ZTWCBhbmQgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotICogd2hpY2ggZGV0ZXJtaW5lcyB0aGUgZmluYWwgY29kZSBpbiB0aGlzIGZ1bmN0aW9uLiBBbGwgdGhlIGNvbWJpbmF0aW9ucyBvZgotICogdGhlc2UgdHdvIGNvbmZpZyBvcHRpb25zIGFyZSBwb3NzaWJsZSBleGNlcHQgdGhlIG9uZSBiZWxvdyBhcyB0cmFuc2FjdGlvbmFsCi0gKiBtZW1vcnkgY29uZmlnIHB1bGxzIGluIENPTkZJR19WU1ggYXV0b21hdGljYWxseS4KLSAqCi0gKgkhZGVmaW5lZChDT05GSUdfVlNYKSAmJiBkZWZpbmVkKENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0pCiAgKi8KIHN0YXRpYyBpbnQgZnByX3NldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCiAJCSAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKQEAgLTQ5Nyw0NCArNDYwLDI0IEBACiAjaWZkZWYgQ09ORklHX1ZTWAogCXU2NCBidWZbMzNdOwogCWludCBpOwotI2VuZGlmCisKIAlmbHVzaF9mcF90b190aHJlYWQodGFyZ2V0KTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1ZTWCkgJiYgZGVmaW5lZChDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNKQogCS8qIGNvcHkgdG8gbG9jYWwgYnVmZmVyIHRoZW4gd3JpdGUgdGhhdCBvdXQgKi8KIAlpID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLCBidWYsIDAsIC0xKTsKIAlpZiAoaSkKIAkJcmV0dXJuIGk7CiAKLQlpZiAoTVNSX1RNX0FDVElWRSh0YXJnZXQtPnRocmVhZC5yZWdzLT5tc3IpKSB7Ci0JCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHRhcmdldCk7Ci0JCWZsdXNoX3RtcmVnc190b190aHJlYWQodGFyZ2V0KTsKLQkJZm9yIChpID0gMDsgaSA8IDMyIDsgaSsrKQotCQkJdGFyZ2V0LT50aHJlYWQuVFNfVFJBTlNfRlBSKGkpID0gYnVmW2ldOwotCQl0YXJnZXQtPnRocmVhZC50cmFuc2FjdF9mcC5mcHNjciA9IGJ1ZlszMl07Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IDMyIDsgaSsrKQotCQkJdGFyZ2V0LT50aHJlYWQuVFNfRlBSKGkpID0gYnVmW2ldOwotCQl0YXJnZXQtPnRocmVhZC5mcF9zdGF0ZS5mcHNjciA9IGJ1ZlszMl07Ci0JfQotCXJldHVybiAwOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19WU1gpICYmICFkZWZpbmVkKENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0pCi0JLyogY29weSB0byBsb2NhbCBidWZmZXIgdGhlbiB3cml0ZSB0aGF0IG91dCAqLwotCWkgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsIGJ1ZiwgMCwgLTEpOwotCWlmIChpKQotCQlyZXR1cm4gaTsKIAlmb3IgKGkgPSAwOyBpIDwgMzIgOyBpKyspCiAJCXRhcmdldC0+dGhyZWFkLlRTX0ZQUihpKSA9IGJ1ZltpXTsKIAl0YXJnZXQtPnRocmVhZC5mcF9zdGF0ZS5mcHNjciA9IGJ1ZlszMl07CiAJcmV0dXJuIDA7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKENPTkZJR19WU1gpICYmICFkZWZpbmVkKENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0pCisjZWxzZQogCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2ZwX3N0YXRlLCBmcHNjcikgIT0KIAkJICAgICBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2ZwX3N0YXRlLCBmcHJbMzJdKSk7CiAKKwlmbHVzaF9mcF90b190aHJlYWQodGFyZ2V0KTsKKwogCXJldHVybiB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCiAJCQkJICAmdGFyZ2V0LT50aHJlYWQuZnBfc3RhdGUsIDAsIC0xKTsKICNlbmRpZgpAQCAtNTYyLDEzICs1MDUsMTAgQEAKIH0KIAogLyoKLSAqIFdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSwgJ3RyYW5zYWN0X3ZyJyBob2xkcyB0aGUgY3VycmVudCBydW5uaW5nCi0gKiB2YWx1ZSBvZiBhbGwgdGhlIFZNWCByZWdpc3RlcnMgYW5kICd2cl9zdGF0ZScgaG9sZHMgdGhlIGxhc3QgY2hlY2twb2ludGVkCi0gKiB2YWx1ZSBvZiBhbGwgdGhlIFZNWCByZWdpc3RlcnMgZm9yIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHRvIGZhbGwgYmFjawotICogb24gaW4gY2FzZSBpdCBhYm9ydHMuIFdoZW4gdHJhbnNhY3Rpb24gaXMgbm90IGFjdGl2ZSAndnJfc3RhdGUnIGhvbGRzCi0gKiB0aGUgY3VycmVudCBydW5uaW5nIHN0YXRlIG9mIGFsbCB0aGUgVk1YIHJlZ2lzdGVycy4gU28gdGhpcyBmdW5jdGlvbiB3aGljaAotICogZ2V0cyB0aGUgY3VycmVudCBydW5uaW5nIHZhbHVlcyBvZiBhbGwgdGhlIFZNWCByZWdpc3RlcnMsIG5lZWRzIHRvIGtub3cKLSAqIHdoZXRoZXIgYW55IHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSBvciBub3QuCisgKiBSZWdhcmRsZXNzIG9mIHRyYW5zYWN0aW9ucywgJ3ZyX3N0YXRlJyBob2xkcyB0aGUgY3VycmVudCBydW5uaW5nCisgKiB2YWx1ZSBvZiBhbGwgdGhlIFZNWCByZWdpc3RlcnMgYW5kICdja3ZyX3N0YXRlJyBob2xkcyB0aGUgbGFzdAorICogY2hlY2twb2ludGVkIHZhbHVlIG9mIGFsbCB0aGUgVk1YIHJlZ2lzdGVycyBmb3IgdGhlIGN1cnJlbnQKKyAqIHRyYW5zYWN0aW9uIHRvIGZhbGwgYmFjayBvbiBpbiBjYXNlIGl0IGFib3J0cy4KICAqCiAgKiBVc2Vyc3BhY2UgaW50ZXJmYWNlIGJ1ZmZlciBsYXlvdXQ6CiAgKgpAQCAtNTgyLDcgKzUyMiw2IEBACiAJCSAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAogCQkgIHZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQogewotCXN0cnVjdCB0aHJlYWRfdnJfc3RhdGUgKmFkZHI7CiAJaW50IHJldDsKIAogCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHRhcmdldCk7CkBAIC01OTAsMTkgKzUyOSw4IEBACiAJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfdnJfc3RhdGUsIHZzY3IpICE9CiAJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF92cl9zdGF0ZSwgdnJbMzJdKSk7CiAKLSNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCi0JaWYgKE1TUl9UTV9BQ1RJVkUodGFyZ2V0LT50aHJlYWQucmVncy0+bXNyKSkgewotCQlmbHVzaF9mcF90b190aHJlYWQodGFyZ2V0KTsKLQkJZmx1c2hfdG1yZWdzX3RvX3RocmVhZCh0YXJnZXQpOwotCQlhZGRyID0gJnRhcmdldC0+dGhyZWFkLnRyYW5zYWN0X3ZyOwotCX0gZWxzZSB7Ci0JCWFkZHIgPSAmdGFyZ2V0LT50aHJlYWQudnJfc3RhdGU7Ci0JfQotI2Vsc2UKLQlhZGRyID0gJnRhcmdldC0+dGhyZWFkLnZyX3N0YXRlOwotI2VuZGlmCiAJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKLQkJCQkgIGFkZHIsIDAsCisJCQkJICAmdGFyZ2V0LT50aHJlYWQudnJfc3RhdGUsIDAsCiAJCQkJICAzMyAqIHNpemVvZih2ZWN0b3IxMjgpKTsKIAlpZiAoIXJldCkgewogCQkvKgpAQCAtNjE0LDE0ICs1NDIsNyBAQAogCQl9IHZyc2F2ZTsKIAkJbWVtc2V0KCZ2cnNhdmUsIDAsIHNpemVvZih2cnNhdmUpKTsKIAotI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KLQkJaWYgKE1TUl9UTV9BQ1RJVkUodGFyZ2V0LT50aHJlYWQucmVncy0+bXNyKSkKLQkJCXZyc2F2ZS53b3JkID0gdGFyZ2V0LT50aHJlYWQudHJhbnNhY3RfdnJzYXZlOwotCQllbHNlCi0JCQl2cnNhdmUud29yZCA9IHRhcmdldC0+dGhyZWFkLnZyc2F2ZTsKLSNlbHNlCiAJCXZyc2F2ZS53b3JkID0gdGFyZ2V0LT50aHJlYWQudnJzYXZlOwotI2VuZGlmCiAKIAkJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwgJnZyc2F2ZSwKIAkJCQkJICAzMyAqIHNpemVvZih2ZWN0b3IxMjgpLCAtMSk7CkBAIC02MzEsMTMgKzU1MiwxMCBAQAogfQogCiAvKgotICogV2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYWN0aXZlLCAndHJhbnNhY3RfdnInIGhvbGRzIHRoZSBjdXJyZW50IHJ1bm5pbmcKLSAqIHZhbHVlIG9mIGFsbCB0aGUgVk1YIHJlZ2lzdGVycyBhbmQgJ3ZyX3N0YXRlJyBob2xkcyB0aGUgbGFzdCBjaGVja3BvaW50ZWQKLSAqIHZhbHVlIG9mIGFsbCB0aGUgVk1YIHJlZ2lzdGVycyBmb3IgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gdG8gZmFsbCBiYWNrCi0gKiBvbiBpbiBjYXNlIGl0IGFib3J0cy4gV2hlbiB0cmFuc2FjdGlvbiBpcyBub3QgYWN0aXZlICd2cl9zdGF0ZScgaG9sZHMKLSAqIHRoZSBjdXJyZW50IHJ1bm5pbmcgc3RhdGUgb2YgYWxsIHRoZSBWTVggcmVnaXN0ZXJzLiBTbyB0aGlzIGZ1bmN0aW9uIHdoaWNoCi0gKiBzZXRzIHRoZSBjdXJyZW50IHJ1bm5pbmcgdmFsdWVzIG9mIGFsbCB0aGUgVk1YIHJlZ2lzdGVycywgbmVlZHMgdG8ga25vdwotICogd2hldGhlciBhbnkgdHJhbnNhY3Rpb24gaXMgYWN0aXZlIG9yIG5vdC4KKyAqIFJlZ2FyZGxlc3Mgb2YgdHJhbnNhY3Rpb25zLCAndnJfc3RhdGUnIGhvbGRzIHRoZSBjdXJyZW50IHJ1bm5pbmcKKyAqIHZhbHVlIG9mIGFsbCB0aGUgVk1YIHJlZ2lzdGVycyBhbmQgJ2NrdnJfc3RhdGUnIGhvbGRzIHRoZSBsYXN0CisgKiBjaGVja3BvaW50ZWQgdmFsdWUgb2YgYWxsIHRoZSBWTVggcmVnaXN0ZXJzIGZvciB0aGUgY3VycmVudAorICogdHJhbnNhY3Rpb24gdG8gZmFsbCBiYWNrIG9uIGluIGNhc2UgaXQgYWJvcnRzLgogICoKICAqIFVzZXJzcGFjZSBpbnRlcmZhY2UgYnVmZmVyIGxheW91dDoKICAqCkBAIC02NTEsNyArNTY5LDYgQEAKIAkJICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCiAJCSAgY29uc3Qgdm9pZCAqa2J1ZiwgY29uc3Qgdm9pZCBfX3VzZXIgKnVidWYpCiB7Ci0Jc3RydWN0IHRocmVhZF92cl9zdGF0ZSAqYWRkcjsKIAlpbnQgcmV0OwogCiAJZmx1c2hfYWx0aXZlY190b190aHJlYWQodGFyZ2V0KTsKQEAgLTY1OSwxOSArNTc2LDggQEAKIAlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHRocmVhZF92cl9zdGF0ZSwgdnNjcikgIT0KIAkJICAgICBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX3ZyX3N0YXRlLCB2clszMl0pKTsKIAotI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KLQlpZiAoTVNSX1RNX0FDVElWRSh0YXJnZXQtPnRocmVhZC5yZWdzLT5tc3IpKSB7Ci0JCWZsdXNoX2ZwX3RvX3RocmVhZCh0YXJnZXQpOwotCQlmbHVzaF90bXJlZ3NfdG9fdGhyZWFkKHRhcmdldCk7Ci0JCWFkZHIgPSAmdGFyZ2V0LT50aHJlYWQudHJhbnNhY3RfdnI7Ci0JfSBlbHNlIHsKLQkJYWRkciA9ICZ0YXJnZXQtPnRocmVhZC52cl9zdGF0ZTsKLQl9Ci0jZWxzZQotCWFkZHIgPSAmdGFyZ2V0LT50aHJlYWQudnJfc3RhdGU7Ci0jZW5kaWYKIAlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCi0JCQkJIGFkZHIsIDAsCisJCQkJICZ0YXJnZXQtPnRocmVhZC52cl9zdGF0ZSwgMCwKIAkJCQkgMzMgKiBzaXplb2YodmVjdG9yMTI4KSk7CiAJaWYgKCFyZXQgJiYgY291bnQgPiAwKSB7CiAJCS8qCkBAIC02ODMsMjcgKzU4OSwxMiBAQAogCQl9IHZyc2F2ZTsKIAkJbWVtc2V0KCZ2cnNhdmUsIDAsIHNpemVvZih2cnNhdmUpKTsKIAotI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KLQkJaWYgKE1TUl9UTV9BQ1RJVkUodGFyZ2V0LT50aHJlYWQucmVncy0+bXNyKSkKLQkJCXZyc2F2ZS53b3JkID0gdGFyZ2V0LT50aHJlYWQudHJhbnNhY3RfdnJzYXZlOwotCQllbHNlCi0JCQl2cnNhdmUud29yZCA9IHRhcmdldC0+dGhyZWFkLnZyc2F2ZTsKLSNlbHNlCiAJCXZyc2F2ZS53b3JkID0gdGFyZ2V0LT50aHJlYWQudnJzYXZlOwotI2VuZGlmCisKIAkJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLCAmdnJzYXZlLAogCQkJCQkgMzMgKiBzaXplb2YodmVjdG9yMTI4KSwgLTEpOwotCQlpZiAoIXJldCkgewotCi0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotCQkJaWYgKE1TUl9UTV9BQ1RJVkUodGFyZ2V0LT50aHJlYWQucmVncy0+bXNyKSkKLQkJCQl0YXJnZXQtPnRocmVhZC50cmFuc2FjdF92cnNhdmUgPSB2cnNhdmUud29yZDsKLQkJCWVsc2UKLQkJCQl0YXJnZXQtPnRocmVhZC52cnNhdmUgPSB2cnNhdmUud29yZDsKLSNlbHNlCisJCWlmICghcmV0KQogCQkJdGFyZ2V0LT50aHJlYWQudnJzYXZlID0gdnJzYXZlLndvcmQ7Ci0jZW5kaWYKLQkJfQogCX0KIAogCXJldHVybiByZXQ7CkBAIC03MjUsMTMgKzYxNiwxMCBAQAogfQogCiAvKgotICogV2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYWN0aXZlLCAndHJhbnNhY3RfZnAnIGhvbGRzIHRoZSBjdXJyZW50IHJ1bm5pbmcKLSAqIHZhbHVlIG9mIGFsbCBGUFIgcmVnaXN0ZXJzIGFuZCAnZnBfc3RhdGUnIGhvbGRzIHRoZSBsYXN0IGNoZWNrcG9pbnRlZAotICogdmFsdWUgb2YgYWxsIEZQUiByZWdpc3RlcnMgZm9yIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiBXaGVuIHRyYW5zYWN0aW9uCi0gKiBpcyBub3QgYWN0aXZlICdmcF9zdGF0ZScgaG9sZHMgdGhlIGN1cnJlbnQgcnVubmluZyBzdGF0ZSBvZiBhbGwgdGhlIEZQUgotICogcmVnaXN0ZXJzLiBTbyB0aGlzIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgdGhlIGN1cnJlbnQgcnVubmluZyB2YWx1ZXMgb2YKLSAqIGFsbCB0aGUgRlBSIHJlZ2lzdGVycywgbmVlZHMgdG8ga25vdyB3aGV0aGVyIGFueSB0cmFuc2FjdGlvbiBpcyBhY3RpdmUKLSAqIG9yIG5vdC4KKyAqIFJlZ2FyZGxlc3Mgb2YgdHJhbnNhY3Rpb25zLCAnZnBfc3RhdGUnIGhvbGRzIHRoZSBjdXJyZW50IHJ1bm5pbmcKKyAqIHZhbHVlIG9mIGFsbCBGUFIgcmVnaXN0ZXJzIGFuZCAnY2tmcF9zdGF0ZScgaG9sZHMgdGhlIGxhc3QKKyAqIGNoZWNrcG9pbnRlZCB2YWx1ZSBvZiBhbGwgRlBSIHJlZ2lzdGVycyBmb3IgdGhlIGN1cnJlbnQKKyAqIHRyYW5zYWN0aW9uLgogICoKICAqIFVzZXJzcGFjZSBpbnRlcmZhY2UgYnVmZmVyIGxheW91dDoKICAqCkBAIC03NDYsMjcgKzYzNCwxNCBAQAogCXU2NCBidWZbMzJdOwogCWludCByZXQsIGk7CiAKLSNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCisJZmx1c2hfdG1yZWdzX3RvX3RocmVhZCh0YXJnZXQpOwogCWZsdXNoX2ZwX3RvX3RocmVhZCh0YXJnZXQpOwogCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHRhcmdldCk7Ci0JZmx1c2hfdG1yZWdzX3RvX3RocmVhZCh0YXJnZXQpOwotI2VuZGlmCiAJZmx1c2hfdnN4X3RvX3RocmVhZCh0YXJnZXQpOwogCi0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotCWlmIChNU1JfVE1fQUNUSVZFKHRhcmdldC0+dGhyZWFkLnJlZ3MtPm1zcikpIHsKLQkJZm9yIChpID0gMDsgaSA8IDMyIDsgaSsrKQotCQkJYnVmW2ldID0gdGFyZ2V0LT50aHJlYWQuCi0JCQkJdHJhbnNhY3RfZnAuZnByW2ldW1RTX1ZTUkxPV09GRlNFVF07Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IDMyIDsgaSsrKQotCQkJYnVmW2ldID0gdGFyZ2V0LT50aHJlYWQuCi0JCQkJZnBfc3RhdGUuZnByW2ldW1RTX1ZTUkxPV09GRlNFVF07Ci0JfQotI2Vsc2UKIAlmb3IgKGkgPSAwOyBpIDwgMzIgOyBpKyspCiAJCWJ1ZltpXSA9IHRhcmdldC0+dGhyZWFkLmZwX3N0YXRlLmZwcltpXVtUU19WU1JMT1dPRkZTRVRdOwotI2VuZGlmCisKIAlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAogCQkJCSAgYnVmLCAwLCAzMiAqIHNpemVvZihkb3VibGUpKTsKIApAQCAtNzc0LDEyICs2NDksMTAgQEAKIH0KIAogLyoKLSAqIFdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSwgJ3RyYW5zYWN0X2ZwJyBob2xkcyB0aGUgY3VycmVudCBydW5uaW5nCi0gKiB2YWx1ZSBvZiBhbGwgRlBSIHJlZ2lzdGVycyBhbmQgJ2ZwX3N0YXRlJyBob2xkcyB0aGUgbGFzdCBjaGVja3BvaW50ZWQKLSAqIHZhbHVlIG9mIGFsbCBGUFIgcmVnaXN0ZXJzIGZvciB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gV2hlbiB0cmFuc2FjdGlvbgotICogaXMgbm90IGFjdGl2ZSAnZnBfc3RhdGUnIGhvbGRzIHRoZSBjdXJyZW50IHJ1bm5pbmcgc3RhdGUgb2YgYWxsIHRoZSBGUFIKLSAqIHJlZ2lzdGVycy4gU28gdGhpcyBmdW5jdGlvbiB3aGljaCBzZXRzIHRoZSBjdXJyZW50IHJ1bm5pbmcgdmFsdWVzIG9mIGFsbAotICogdGhlIEZQUiByZWdpc3RlcnMsIG5lZWRzIHRvIGtub3cgd2hldGhlciBhbnkgdHJhbnNhY3Rpb24gaXMgYWN0aXZlIG9yIG5vdC4KKyAqIFJlZ2FyZGxlc3Mgb2YgdHJhbnNhY3Rpb25zLCAnZnBfc3RhdGUnIGhvbGRzIHRoZSBjdXJyZW50IHJ1bm5pbmcKKyAqIHZhbHVlIG9mIGFsbCBGUFIgcmVnaXN0ZXJzIGFuZCAnY2tmcF9zdGF0ZScgaG9sZHMgdGhlIGxhc3QKKyAqIGNoZWNrcG9pbnRlZCB2YWx1ZSBvZiBhbGwgRlBSIHJlZ2lzdGVycyBmb3IgdGhlIGN1cnJlbnQKKyAqIHRyYW5zYWN0aW9uLgogICoKICAqIFVzZXJzcGFjZSBpbnRlcmZhY2UgYnVmZmVyIGxheW91dDoKICAqCkBAIC03OTQsMzEgKzY2NywxNiBAQAogCXU2NCBidWZbMzJdOwogCWludCByZXQsaTsKIAotI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KKwlmbHVzaF90bXJlZ3NfdG9fdGhyZWFkKHRhcmdldCk7CiAJZmx1c2hfZnBfdG9fdGhyZWFkKHRhcmdldCk7CiAJZmx1c2hfYWx0aXZlY190b190aHJlYWQodGFyZ2V0KTsKLQlmbHVzaF90bXJlZ3NfdG9fdGhyZWFkKHRhcmdldCk7Ci0jZW5kaWYKIAlmbHVzaF92c3hfdG9fdGhyZWFkKHRhcmdldCk7CiAKIAlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCiAJCQkJIGJ1ZiwgMCwgMzIgKiBzaXplb2YoZG91YmxlKSk7Ci0KLSNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCi0JaWYgKE1TUl9UTV9BQ1RJVkUodGFyZ2V0LT50aHJlYWQucmVncy0+bXNyKSkgeworCWlmICghcmV0KQogCQlmb3IgKGkgPSAwOyBpIDwgMzIgOyBpKyspCi0JCQl0YXJnZXQtPnRocmVhZC50cmFuc2FjdF9mcC4KLQkJCQlmcHJbaV1bVFNfVlNSTE9XT0ZGU0VUXSA9IGJ1ZltpXTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgMzIgOyBpKyspCi0JCQl0YXJnZXQtPnRocmVhZC5mcF9zdGF0ZS4KLQkJCQlmcHJbaV1bVFNfVlNSTE9XT0ZGU0VUXSA9IGJ1ZltpXTsKLQl9Ci0jZWxzZQotCWZvciAoaSA9IDA7IGkgPCAzMiA7IGkrKykKLQkJdGFyZ2V0LT50aHJlYWQuZnBfc3RhdGUuZnByW2ldW1RTX1ZTUkxPV09GRlNFVF0gPSBidWZbaV07Ci0jZW5kaWYKLQorCQkJdGFyZ2V0LT50aHJlYWQuZnBfc3RhdGUuZnByW2ldW1RTX1ZTUkxPV09GRlNFVF0gPSBidWZbaV07CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtOTQ0LDkgKzgwMiw5IEBACiAJaWYgKCFNU1JfVE1fQUNUSVZFKHRhcmdldC0+dGhyZWFkLnJlZ3MtPm1zcikpCiAJCXJldHVybiAtRU5PREFUQTsKIAorCWZsdXNoX3RtcmVnc190b190aHJlYWQodGFyZ2V0KTsKIAlmbHVzaF9mcF90b190aHJlYWQodGFyZ2V0KTsKIAlmbHVzaF9hbHRpdmVjX3RvX3RocmVhZCh0YXJnZXQpOwotCWZsdXNoX3RtcmVnc190b190aHJlYWQodGFyZ2V0KTsKIAogCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCiAJCQkJICAmdGFyZ2V0LT50aHJlYWQuY2twdF9yZWdzLApAQCAtMTAwOSw5ICs4NjcsOSBAQAogCWlmICghTVNSX1RNX0FDVElWRSh0YXJnZXQtPnRocmVhZC5yZWdzLT5tc3IpKQogCQlyZXR1cm4gLUVOT0RBVEE7CiAKKwlmbHVzaF90bXJlZ3NfdG9fdGhyZWFkKHRhcmdldCk7CiAJZmx1c2hfZnBfdG9fdGhyZWFkKHRhcmdldCk7CiAJZmx1c2hfYWx0aXZlY190b190aHJlYWQodGFyZ2V0KTsKLQlmbHVzaF90bXJlZ3NfdG9fdGhyZWFkKHRhcmdldCk7CiAKIAlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCiAJCQkJICZ0YXJnZXQtPnRocmVhZC5ja3B0X3JlZ3MsCkBAIC0xMDg3LDcgKzk0NSw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBnZXRzIGluIHRyYW5zYWN0aW9uIGNoZWNrcG9pbnRlZCBGUFIgcmVnaXN0ZXJzLgogICoKLSAqIFdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSAnZnBfc3RhdGUnIGhvbGRzIHRoZSBjaGVja3BvaW50ZWQKKyAqIFdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSAnY2tmcF9zdGF0ZScgaG9sZHMgdGhlIGNoZWNrcG9pbnRlZAogICogdmFsdWVzIGZvciB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiB0byBmYWxsIGJhY2sgb24gaWYgaXQgYWJvcnRzCiAgKiBpbiBiZXR3ZWVuLiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhvc2UgY2hlY2twb2ludGVkIEZQUiByZWdpc3RlcnMuCiAgKiBUaGUgdXNlcnNwYWNlIGludGVyZmFjZSBidWZmZXIgbGF5b3V0IGlzIGFzIGZvbGxvd3MuCkBAIC0xMTExLDE0ICs5NjksMTQgQEAKIAlpZiAoIU1TUl9UTV9BQ1RJVkUodGFyZ2V0LT50aHJlYWQucmVncy0+bXNyKSkKIAkJcmV0dXJuIC1FTk9EQVRBOwogCisJZmx1c2hfdG1yZWdzX3RvX3RocmVhZCh0YXJnZXQpOwogCWZsdXNoX2ZwX3RvX3RocmVhZCh0YXJnZXQpOwogCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHRhcmdldCk7Ci0JZmx1c2hfdG1yZWdzX3RvX3RocmVhZCh0YXJnZXQpOwogCiAJLyogY29weSB0byBsb2NhbCBidWZmZXIgdGhlbiB3cml0ZSB0aGF0IG91dCAqLwogCWZvciAoaSA9IDA7IGkgPCAzMiA7IGkrKykKLQkJYnVmW2ldID0gdGFyZ2V0LT50aHJlYWQuVFNfRlBSKGkpOwotCWJ1ZlszMl0gPSB0YXJnZXQtPnRocmVhZC5mcF9zdGF0ZS5mcHNjcjsKKwkJYnVmW2ldID0gdGFyZ2V0LT50aHJlYWQuVFNfQ0tGUFIoaSk7CisJYnVmWzMyXSA9IHRhcmdldC0+dGhyZWFkLmNrZnBfc3RhdGUuZnBzY3I7CiAJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsIGJ1ZiwgMCwgLTEpOwogfQogCkBAIC0xMTMzLDcgKzk5MSw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBzZXRzIGluIHRyYW5zYWN0aW9uIGNoZWNrcG9pbnRlZCBGUFIgcmVnaXN0ZXJzLgogICoKLSAqIFdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSAnZnBfc3RhdGUnIGhvbGRzIHRoZSBjaGVja3BvaW50ZWQKKyAqIFdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSAnY2tmcF9zdGF0ZScgaG9sZHMgdGhlIGNoZWNrcG9pbnRlZAogICogRlBSIHJlZ2lzdGVyIHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gdG8gZmFsbCBiYWNrIG9uCiAgKiBpZiBpdCBhYm9ydHMgaW4gYmV0d2Vlbi4gVGhpcyBmdW5jdGlvbiBzZXRzIHRoZXNlIGNoZWNrcG9pbnRlZAogICogRlBSIHJlZ2lzdGVycy4gVGhlIHVzZXJzcGFjZSBpbnRlcmZhY2UgYnVmZmVyIGxheW91dCBpcyBhcyBmb2xsb3dzLgpAQCAtMTE1NywxNyArMTAxNSwxNyBAQAogCWlmICghTVNSX1RNX0FDVElWRSh0YXJnZXQtPnRocmVhZC5yZWdzLT5tc3IpKQogCQlyZXR1cm4gLUVOT0RBVEE7CiAKKwlmbHVzaF90bXJlZ3NfdG9fdGhyZWFkKHRhcmdldCk7CiAJZmx1c2hfZnBfdG9fdGhyZWFkKHRhcmdldCk7CiAJZmx1c2hfYWx0aXZlY190b190aHJlYWQodGFyZ2V0KTsKLQlmbHVzaF90bXJlZ3NfdG9fdGhyZWFkKHRhcmdldCk7CiAKIAkvKiBjb3B5IHRvIGxvY2FsIGJ1ZmZlciB0aGVuIHdyaXRlIHRoYXQgb3V0ICovCiAJaSA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwgYnVmLCAwLCAtMSk7CiAJaWYgKGkpCiAJCXJldHVybiBpOwogCWZvciAoaSA9IDA7IGkgPCAzMiA7IGkrKykKLQkJdGFyZ2V0LT50aHJlYWQuVFNfRlBSKGkpID0gYnVmW2ldOwotCXRhcmdldC0+dGhyZWFkLmZwX3N0YXRlLmZwc2NyID0gYnVmWzMyXTsKKwkJdGFyZ2V0LT50aHJlYWQuVFNfQ0tGUFIoaSkgPSBidWZbaV07CisJdGFyZ2V0LT50aHJlYWQuY2tmcF9zdGF0ZS5mcHNjciA9IGJ1ZlszMl07CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyMDIsNyArMTA2MCw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBnZXRzIGluIHRyYW5zYWN0aW9uIGNoZWNrcG9pbnRlZCBWTVggcmVnaXN0ZXJzLgogICoKLSAqIFdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSAndnJfc3RhdGUnIGFuZCAndnJfc2F2ZScgaG9sZAorICogV2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYWN0aXZlICdja3ZyX3N0YXRlJyBhbmQgJ2NrdnJzYXZlJyBob2xkCiAgKiB0aGUgY2hlY2twb2ludGVkIHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gdG8gZmFsbAogICogYmFjayBvbiBpZiBpdCBhYm9ydHMgaW4gYmV0d2Vlbi4gVGhlIHVzZXJzcGFjZSBpbnRlcmZhY2UgYnVmZmVyCiAgKiBsYXlvdXQgaXMgYXMgZm9sbG93cy4KQEAgLTEyMjksMTIgKzEwODcsMTIgQEAKIAkJcmV0dXJuIC1FTk9EQVRBOwogCiAJLyogRmx1c2ggdGhlIHN0YXRlICovCisJZmx1c2hfdG1yZWdzX3RvX3RocmVhZCh0YXJnZXQpOwogCWZsdXNoX2ZwX3RvX3RocmVhZCh0YXJnZXQpOwogCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHRhcmdldCk7Ci0JZmx1c2hfdG1yZWdzX3RvX3RocmVhZCh0YXJnZXQpOwogCiAJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKLQkJCQkJJnRhcmdldC0+dGhyZWFkLnZyX3N0YXRlLCAwLAorCQkJCQkmdGFyZ2V0LT50aHJlYWQuY2t2cl9zdGF0ZSwgMCwKIAkJCQkJMzMgKiBzaXplb2YodmVjdG9yMTI4KSk7CiAJaWYgKCFyZXQpIHsKIAkJLyoKQEAgLTEyNDUsNyArMTEwMyw3IEBACiAJCQl1MzIgd29yZDsKIAkJfSB2cnNhdmU7CiAJCW1lbXNldCgmdnJzYXZlLCAwLCBzaXplb2YodnJzYXZlKSk7Ci0JCXZyc2F2ZS53b3JkID0gdGFyZ2V0LT50aHJlYWQudnJzYXZlOworCQl2cnNhdmUud29yZCA9IHRhcmdldC0+dGhyZWFkLmNrdnJzYXZlOwogCQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLCAmdnJzYXZlLAogCQkJCQkJMzMgKiBzaXplb2YodmVjdG9yMTI4KSwgLTEpOwogCX0KQEAgLTEyNjQsNyArMTEyMiw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBzZXRzIGluIHRyYW5zYWN0aW9uIGNoZWNrcG9pbnRlZCBWTVggcmVnaXN0ZXJzLgogICoKLSAqIFdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSAndnJfc3RhdGUnIGFuZCAndnJfc2F2ZScgaG9sZAorICogV2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgYWN0aXZlICdja3ZyX3N0YXRlJyBhbmQgJ2NrdnJzYXZlJyBob2xkCiAgKiB0aGUgY2hlY2twb2ludGVkIHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gdG8gZmFsbAogICogYmFjayBvbiBpZiBpdCBhYm9ydHMgaW4gYmV0d2Vlbi4gVGhlIHVzZXJzcGFjZSBpbnRlcmZhY2UgYnVmZmVyCiAgKiBsYXlvdXQgaXMgYXMgZm9sbG93cy4KQEAgLTEyOTAsMTIgKzExNDgsMTIgQEAKIAlpZiAoIU1TUl9UTV9BQ1RJVkUodGFyZ2V0LT50aHJlYWQucmVncy0+bXNyKSkKIAkJcmV0dXJuIC1FTk9EQVRBOwogCisJZmx1c2hfdG1yZWdzX3RvX3RocmVhZCh0YXJnZXQpOwogCWZsdXNoX2ZwX3RvX3RocmVhZCh0YXJnZXQpOwogCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHRhcmdldCk7Ci0JZmx1c2hfdG1yZWdzX3RvX3RocmVhZCh0YXJnZXQpOwogCiAJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAotCQkJCQkmdGFyZ2V0LT50aHJlYWQudnJfc3RhdGUsIDAsCisJCQkJCSZ0YXJnZXQtPnRocmVhZC5ja3ZyX3N0YXRlLCAwLAogCQkJCQkzMyAqIHNpemVvZih2ZWN0b3IxMjgpKTsKIAlpZiAoIXJldCAmJiBjb3VudCA+IDApIHsKIAkJLyoKQEAgLTEzMDYsMTEgKzExNjQsMTEgQEAKIAkJCXUzMiB3b3JkOwogCQl9IHZyc2F2ZTsKIAkJbWVtc2V0KCZ2cnNhdmUsIDAsIHNpemVvZih2cnNhdmUpKTsKLQkJdnJzYXZlLndvcmQgPSB0YXJnZXQtPnRocmVhZC52cnNhdmU7CisJCXZyc2F2ZS53b3JkID0gdGFyZ2V0LT50aHJlYWQuY2t2cnNhdmU7CiAJCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwgJnZyc2F2ZSwKIAkJCQkJCTMzICogc2l6ZW9mKHZlY3RvcjEyOCksIC0xKTsKIAkJaWYgKCFyZXQpCi0JCQl0YXJnZXQtPnRocmVhZC52cnNhdmUgPSB2cnNhdmUud29yZDsKKwkJCXRhcmdldC0+dGhyZWFkLmNrdnJzYXZlID0gdnJzYXZlLndvcmQ7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTEzNDgsNyArMTIwNiw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBnZXRzIGluIHRyYW5zYWN0aW9uIGNoZWNrcG9pbnRlZCBWU1ggcmVnaXN0ZXJzLgogICoKLSAqIFdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSAnZnBfc3RhdGUnIGhvbGRzIHRoZSBjaGVja3BvaW50ZWQKKyAqIFdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSAnY2tmcF9zdGF0ZScgaG9sZHMgdGhlIGNoZWNrcG9pbnRlZAogICogdmFsdWVzIGZvciB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiB0byBmYWxsIGJhY2sgb24gaWYgaXQgYWJvcnRzCiAgKiBpbiBiZXR3ZWVuLiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhvc2UgY2hlY2twb2ludGVkIFZTWCByZWdpc3RlcnMuCiAgKiBUaGUgdXNlcnNwYWNlIGludGVyZmFjZSBidWZmZXIgbGF5b3V0IGlzIGFzIGZvbGxvd3MuCkBAIC0xMzcyLDEzICsxMjMwLDEzIEBACiAJCXJldHVybiAtRU5PREFUQTsKIAogCS8qIEZsdXNoIHRoZSBzdGF0ZSAqLworCWZsdXNoX3RtcmVnc190b190aHJlYWQodGFyZ2V0KTsKIAlmbHVzaF9mcF90b190aHJlYWQodGFyZ2V0KTsKIAlmbHVzaF9hbHRpdmVjX3RvX3RocmVhZCh0YXJnZXQpOwotCWZsdXNoX3RtcmVnc190b190aHJlYWQodGFyZ2V0KTsKIAlmbHVzaF92c3hfdG9fdGhyZWFkKHRhcmdldCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzIgOyBpKyspCi0JCWJ1ZltpXSA9IHRhcmdldC0+dGhyZWFkLmZwX3N0YXRlLmZwcltpXVtUU19WU1JMT1dPRkZTRVRdOworCQlidWZbaV0gPSB0YXJnZXQtPnRocmVhZC5ja2ZwX3N0YXRlLmZwcltpXVtUU19WU1JMT1dPRkZTRVRdOwogCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlvdXQoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCiAJCQkJICBidWYsIDAsIDMyICogc2l6ZW9mKGRvdWJsZSkpOwogCkBAIC0xMzk2LDcgKzEyNTQsNyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gc2V0cyBpbiB0cmFuc2FjdGlvbiBjaGVja3BvaW50ZWQgVlNYIHJlZ2lzdGVycy4KICAqCi0gKiBXaGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhY3RpdmUgJ2ZwX3N0YXRlJyBob2xkcyB0aGUgY2hlY2twb2ludGVkCisgKiBXaGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBhY3RpdmUgJ2NrZnBfc3RhdGUnIGhvbGRzIHRoZSBjaGVja3BvaW50ZWQKICAqIFZTWCByZWdpc3RlciB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHRvIGZhbGwgYmFjayBvbgogICogaWYgaXQgYWJvcnRzIGluIGJldHdlZW4uIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGVzZSBjaGVja3BvaW50ZWQKICAqIEZQUiByZWdpc3RlcnMuIFRoZSB1c2Vyc3BhY2UgaW50ZXJmYWNlIGJ1ZmZlciBsYXlvdXQgaXMgYXMgZm9sbG93cy4KQEAgLTE0MjAsMTUgKzEyNzgsMTYgQEAKIAkJcmV0dXJuIC1FTk9EQVRBOwogCiAJLyogRmx1c2ggdGhlIHN0YXRlICovCisJZmx1c2hfdG1yZWdzX3RvX3RocmVhZCh0YXJnZXQpOwogCWZsdXNoX2ZwX3RvX3RocmVhZCh0YXJnZXQpOwogCWZsdXNoX2FsdGl2ZWNfdG9fdGhyZWFkKHRhcmdldCk7Ci0JZmx1c2hfdG1yZWdzX3RvX3RocmVhZCh0YXJnZXQpOwogCWZsdXNoX3ZzeF90b190aHJlYWQodGFyZ2V0KTsKIAogCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKIAkJCQkgYnVmLCAwLCAzMiAqIHNpemVvZihkb3VibGUpKTsKLQlmb3IgKGkgPSAwOyBpIDwgMzIgOyBpKyspCi0JCXRhcmdldC0+dGhyZWFkLmZwX3N0YXRlLmZwcltpXVtUU19WU1JMT1dPRkZTRVRdID0gYnVmW2ldOworCWlmICghcmV0KQorCQlmb3IgKGkgPSAwOyBpIDwgMzIgOyBpKyspCisJCQl0YXJnZXQtPnRocmVhZC5ja2ZwX3N0YXRlLmZwcltpXVtUU19WU1JMT1dPRkZTRVRdID0gYnVmW2ldOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0ODQsOSArMTM0Myw5IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogRmx1c2ggdGhlIHN0YXRlcyAqLworCWZsdXNoX3RtcmVnc190b190aHJlYWQodGFyZ2V0KTsKIAlmbHVzaF9mcF90b190aHJlYWQodGFyZ2V0KTsKIAlmbHVzaF9hbHRpdmVjX3RvX3RocmVhZCh0YXJnZXQpOwotCWZsdXNoX3RtcmVnc190b190aHJlYWQodGFyZ2V0KTsKIAogCS8qIFRGSEFSIHJlZ2lzdGVyICovCiAJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKQEAgLTE1NDAsOSArMTM5OSw5IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogRmx1c2ggdGhlIHN0YXRlcyAqLworCWZsdXNoX3RtcmVnc190b190aHJlYWQodGFyZ2V0KTsKIAlmbHVzaF9mcF90b190aHJlYWQodGFyZ2V0KTsKIAlmbHVzaF9hbHRpdmVjX3RvX3RocmVhZCh0YXJnZXQpOwotCWZsdXNoX3RtcmVnc190b190aHJlYWQodGFyZ2V0KTsKIAogCS8qIFRGSEFSIHJlZ2lzdGVyICovCiAJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLApAQCAtMjA2NSwzMyArMTkyNCwxMiBAQAogc3RhdGljIGludCBncHIzMl9nZXRfY29tbW9uKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAogCQkgICAgIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAogCQkgICAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKLQkJCSAgICB2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1ZiwgYm9vbCB0bV9hY3RpdmUpCisJCQkgICAgdm9pZCAqa2J1Ziwgdm9pZCBfX3VzZXIgKnVidWYsCisJCQkgICAgdW5zaWduZWQgbG9uZyAqcmVncykKIHsKLQljb25zdCB1bnNpZ25lZCBsb25nICpyZWdzID0gJnRhcmdldC0+dGhyZWFkLnJlZ3MtPmdwclswXTsKLQljb25zdCB1bnNpZ25lZCBsb25nICpja3B0X3JlZ3M7CiAJY29tcGF0X3Vsb25nX3QgKmsgPSBrYnVmOwogCWNvbXBhdF91bG9uZ190IF9fdXNlciAqdSA9IHVidWY7CiAJY29tcGF0X3Vsb25nX3QgcmVnOwotCWludCBpOwotCi0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotCWNrcHRfcmVncyA9ICZ0YXJnZXQtPnRocmVhZC5ja3B0X3JlZ3MuZ3ByWzBdOwotI2VuZGlmCi0JaWYgKHRtX2FjdGl2ZSkgewotCQlyZWdzID0gY2twdF9yZWdzOwotCX0gZWxzZSB7Ci0JCWlmICh0YXJnZXQtPnRocmVhZC5yZWdzID09IE5VTEwpCi0JCQlyZXR1cm4gLUVJTzsKLQotCQlpZiAoIUZVTExfUkVHUyh0YXJnZXQtPnRocmVhZC5yZWdzKSkgewotCQkJLyoKLQkJCSAqIFdlIGhhdmUgYSBwYXJ0aWFsIHJlZ2lzdGVyIHNldC4KLQkJCSAqIEZpbGwgMTQtMzEgd2l0aCBib2d1cyB2YWx1ZXMuCi0JCQkgKi8KLQkJCWZvciAoaSA9IDE0OyBpIDwgMzI7IGkrKykKLQkJCQl0YXJnZXQtPnRocmVhZC5yZWdzLT5ncHJbaV0gPSBOVl9SRUdfUE9JU09OOwotCQl9Ci0JfQogCiAJcG9zIC89IHNpemVvZihyZWcpOwogCWNvdW50IC89IHNpemVvZihyZWcpOwpAQCAtMjEzMywyOSArMTk3MSwxMyBAQAogc3RhdGljIGludCBncHIzMl9zZXRfY29tbW9uKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAogCQkgICAgIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAogCQkgICAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKLQkJICAgICBjb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZiwgYm9vbCB0bV9hY3RpdmUpCisJCSAgICAgY29uc3Qgdm9pZCAqa2J1ZiwgY29uc3Qgdm9pZCBfX3VzZXIgKnVidWYsCisJCSAgICAgdW5zaWduZWQgbG9uZyAqcmVncykKIHsKLQl1bnNpZ25lZCBsb25nICpyZWdzID0gJnRhcmdldC0+dGhyZWFkLnJlZ3MtPmdwclswXTsKLQl1bnNpZ25lZCBsb25nICpja3B0X3JlZ3M7CiAJY29uc3QgY29tcGF0X3Vsb25nX3QgKmsgPSBrYnVmOwogCWNvbnN0IGNvbXBhdF91bG9uZ190IF9fdXNlciAqdSA9IHVidWY7CiAJY29tcGF0X3Vsb25nX3QgcmVnOwogCi0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotCWNrcHRfcmVncyA9ICZ0YXJnZXQtPnRocmVhZC5ja3B0X3JlZ3MuZ3ByWzBdOwotI2VuZGlmCi0KLQlpZiAodG1fYWN0aXZlKSB7Ci0JCXJlZ3MgPSBja3B0X3JlZ3M7Ci0JfSBlbHNlIHsKLQkJcmVncyA9ICZ0YXJnZXQtPnRocmVhZC5yZWdzLT5ncHJbMF07Ci0KLQkJaWYgKHRhcmdldC0+dGhyZWFkLnJlZ3MgPT0gTlVMTCkKLQkJCXJldHVybiAtRUlPOwotCi0JCUNIRUNLX0ZVTExfUkVHUyh0YXJnZXQtPnRocmVhZC5yZWdzKTsKLQl9Ci0KIAlwb3MgLz0gc2l6ZW9mKHJlZyk7CiAJY291bnQgLz0gc2l6ZW9mKHJlZyk7CiAKQEAgLTIyMjAsNyArMjA0Miw4IEBACiAJCSAgICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAogCQkgICAgIHZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQogewotCXJldHVybiBncHIzMl9nZXRfY29tbW9uKHRhcmdldCwgcmVnc2V0LCBwb3MsIGNvdW50LCBrYnVmLCB1YnVmLCAxKTsKKwlyZXR1cm4gZ3ByMzJfZ2V0X2NvbW1vbih0YXJnZXQsIHJlZ3NldCwgcG9zLCBjb3VudCwga2J1ZiwgdWJ1ZiwKKwkJCSZ0YXJnZXQtPnRocmVhZC5ja3B0X3JlZ3MuZ3ByWzBdKTsKIH0KIAogc3RhdGljIGludCB0bV9jZ3ByMzJfc2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LApAQCAtMjIyOCw3ICsyMDUxLDggQEAKIAkJICAgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCiAJCSAgICAgY29uc3Qgdm9pZCAqa2J1ZiwgY29uc3Qgdm9pZCBfX3VzZXIgKnVidWYpCiB7Ci0JcmV0dXJuIGdwcjMyX3NldF9jb21tb24odGFyZ2V0LCByZWdzZXQsIHBvcywgY291bnQsIGtidWYsIHVidWYsIDEpOworCXJldHVybiBncHIzMl9zZXRfY29tbW9uKHRhcmdldCwgcmVnc2V0LCBwb3MsIGNvdW50LCBrYnVmLCB1YnVmLAorCQkJJnRhcmdldC0+dGhyZWFkLmNrcHRfcmVncy5ncHJbMF0pOwogfQogI2VuZGlmIC8qIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0gKi8KIApAQCAtMjIzNyw3ICsyMDYxLDIxIEBACiAJCSAgICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAogCQkgICAgIHZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQogewotCXJldHVybiBncHIzMl9nZXRfY29tbW9uKHRhcmdldCwgcmVnc2V0LCBwb3MsIGNvdW50LCBrYnVmLCB1YnVmLCAwKTsKKwlpbnQgaTsKKworCWlmICh0YXJnZXQtPnRocmVhZC5yZWdzID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJaWYgKCFGVUxMX1JFR1ModGFyZ2V0LT50aHJlYWQucmVncykpIHsKKwkJLyoKKwkJICogV2UgaGF2ZSBhIHBhcnRpYWwgcmVnaXN0ZXIgc2V0LgorCQkgKiBGaWxsIDE0LTMxIHdpdGggYm9ndXMgdmFsdWVzLgorCQkgKi8KKwkJZm9yIChpID0gMTQ7IGkgPCAzMjsgaSsrKQorCQkJdGFyZ2V0LT50aHJlYWQucmVncy0+Z3ByW2ldID0gTlZfUkVHX1BPSVNPTjsKKwl9CisJcmV0dXJuIGdwcjMyX2dldF9jb21tb24odGFyZ2V0LCByZWdzZXQsIHBvcywgY291bnQsIGtidWYsIHVidWYsCisJCQkmdGFyZ2V0LT50aHJlYWQucmVncy0+Z3ByWzBdKTsKIH0KIAogc3RhdGljIGludCBncHIzMl9zZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCkBAIC0yMjQ1LDcgKzIwODMsMTIgQEAKIAkJICAgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCiAJCSAgICAgY29uc3Qgdm9pZCAqa2J1ZiwgY29uc3Qgdm9pZCBfX3VzZXIgKnVidWYpCiB7Ci0JcmV0dXJuIGdwcjMyX3NldF9jb21tb24odGFyZ2V0LCByZWdzZXQsIHBvcywgY291bnQsIGtidWYsIHVidWYsIDApOworCWlmICh0YXJnZXQtPnRocmVhZC5yZWdzID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJQ0hFQ0tfRlVMTF9SRUdTKHRhcmdldC0+dGhyZWFkLnJlZ3MpOworCXJldHVybiBncHIzMl9zZXRfY29tbW9uKHRhcmdldCwgcmVnc2V0LCBwb3MsIGNvdW50LCBrYnVmLCB1YnVmLAorCQkJJnRhcmdldC0+dGhyZWFkLnJlZ3MtPmdwclswXSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWwuYwppbmRleCBjYjY0ZDZmLi5iYmU3N2FlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmMKQEAgLTk5LDIyICs5OSwyNCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIHZvaWQgZG9fc2lnbmFsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXNpZ3NldF90ICpvbGRzZXQgPSBzaWdtYXNrX3RvX3NhdmUoKTsKIAlzdHJ1Y3Qga3NpZ25hbCBrc2lnOwogCWludCByZXQ7CiAJaW50IGlzMzIgPSBpc18zMmJpdF90YXNrKCk7CiAKKwlCVUdfT04odHNrICE9IGN1cnJlbnQpOworCiAJZ2V0X3NpZ25hbCgma3NpZyk7CiAKIAkvKiBJcyB0aGVyZSBhbnkgc3lzY2FsbCByZXN0YXJ0IGJ1c2luZXNzIGhlcmUgPyAqLwotCWNoZWNrX3N5c2NhbGxfcmVzdGFydChyZWdzLCAma3NpZy5rYSwga3NpZy5zaWcgPiAwKTsKKwljaGVja19zeXNjYWxsX3Jlc3RhcnQodHNrLT50aHJlYWQucmVncywgJmtzaWcua2EsIGtzaWcuc2lnID4gMCk7CiAKIAlpZiAoa3NpZy5zaWcgPD0gMCkgewogCQkvKiBObyBzaWduYWwgdG8gZGVsaXZlciAtLSBwdXQgdGhlIHNhdmVkIHNpZ21hc2sgYmFjayAqLwogCQlyZXN0b3JlX3NhdmVkX3NpZ21hc2soKTsKLQkJcmVncy0+dHJhcCA9IDA7CisJCXRzay0+dGhyZWFkLnJlZ3MtPnRyYXAgPSAwOwogCQlyZXR1cm47ICAgICAgICAgICAgICAgLyogbm8gc2lnbmFscyBkZWxpdmVyZWQgKi8KIAl9CiAKQEAgLTEyNCwyMyArMTI2LDIyIEBACiAJICogdXNlciBzcGFjZS4gVGhlIERBQlIgd2lsbCBoYXZlIGJlZW4gY2xlYXJlZCBpZiBpdAogCSAqIHRyaWdnZXJlZCBpbnNpZGUgdGhlIGtlcm5lbC4KIAkgKi8KLQlpZiAoY3VycmVudC0+dGhyZWFkLmh3X2Jyay5hZGRyZXNzICYmCi0JCWN1cnJlbnQtPnRocmVhZC5od19icmsudHlwZSkKLQkJX19zZXRfYnJlYWtwb2ludCgmY3VycmVudC0+dGhyZWFkLmh3X2Jyayk7CisJaWYgKHRzay0+dGhyZWFkLmh3X2Jyay5hZGRyZXNzICYmIHRzay0+dGhyZWFkLmh3X2Jyay50eXBlKQorCQlfX3NldF9icmVha3BvaW50KCZ0c2stPnRocmVhZC5od19icmspOwogI2VuZGlmCiAJLyogUmUtZW5hYmxlIHRoZSBicmVha3BvaW50cyBmb3IgdGhlIHNpZ25hbCBzdGFjayAqLwotCXRocmVhZF9jaGFuZ2VfcGMoY3VycmVudCwgcmVncyk7CisJdGhyZWFkX2NoYW5nZV9wYyh0c2ssIHRzay0+dGhyZWFkLnJlZ3MpOwogCiAJaWYgKGlzMzIpIHsKICAgICAgICAgCWlmIChrc2lnLmthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKLQkJCXJldCA9IGhhbmRsZV9ydF9zaWduYWwzMigma3NpZywgb2xkc2V0LCByZWdzKTsKKwkJCXJldCA9IGhhbmRsZV9ydF9zaWduYWwzMigma3NpZywgb2xkc2V0LCB0c2spOwogCQllbHNlCi0JCQlyZXQgPSBoYW5kbGVfc2lnbmFsMzIoJmtzaWcsIG9sZHNldCwgcmVncyk7CisJCQlyZXQgPSBoYW5kbGVfc2lnbmFsMzIoJmtzaWcsIG9sZHNldCwgdHNrKTsKIAl9IGVsc2UgewotCQlyZXQgPSBoYW5kbGVfcnRfc2lnbmFsNjQoJmtzaWcsIG9sZHNldCwgcmVncyk7CisJCXJldCA9IGhhbmRsZV9ydF9zaWduYWw2NCgma3NpZywgb2xkc2V0LCB0c2spOwogCX0KIAotCXJlZ3MtPnRyYXAgPSAwOworCXRzay0+dGhyZWFkLnJlZ3MtPnRyYXAgPSAwOwogCXNpZ25hbF9zZXR1cF9kb25lKHJldCwgJmtzaWcsIHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKTsKIH0KIApAQCAtMTUxLDggKzE1MiwxMCBAQAogCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIF9USUZfVVBST0JFKQogCQl1cHJvYmVfbm90aWZ5X3Jlc3VtZShyZWdzKTsKIAotCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIF9USUZfU0lHUEVORElORykKLQkJZG9fc2lnbmFsKHJlZ3MpOworCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIF9USUZfU0lHUEVORElORykgeworCQlCVUdfT04ocmVncyAhPSBjdXJyZW50LT50aHJlYWQucmVncyk7CisJCWRvX3NpZ25hbChjdXJyZW50KTsKKwl9CiAKIAlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiBfVElGX05PVElGWV9SRVNVTUUpIHsKIAkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX05PVElGWV9SRVNVTUUpOwpAQCAtMTYyLDcgKzE2NSw3IEBACiAJdXNlcl9lbnRlcigpOwogfQogCi11bnNpZ25lZCBsb25nIGdldF90bV9zdGFja3BvaW50ZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit1bnNpZ25lZCBsb25nIGdldF90bV9zdGFja3BvaW50ZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJLyogV2hlbiBpbiBhbiBhY3RpdmUgdHJhbnNhY3Rpb24gdGhhdCB0YWtlcyBhIHNpZ25hbCwgd2UgbmVlZCB0byBiZQogCSAqIGNhcmVmdWwgd2l0aCB0aGUgc3RhY2suICBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHN0YWNrIGhhcyBtb3ZlZCBiYWNrCkBAIC0xODcsMTEgKzE5MCwxMyBAQAogCSAqLwogCiAjaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotCWlmIChNU1JfVE1fQUNUSVZFKHJlZ3MtPm1zcikpIHsKKwlCVUdfT04odHNrICE9IGN1cnJlbnQpOworCisJaWYgKE1TUl9UTV9BQ1RJVkUodHNrLT50aHJlYWQucmVncy0+bXNyKSkgewogCQl0bV9yZWNsYWltX2N1cnJlbnQoVE1fQ0FVU0VfU0lHTkFMKTsKLQkJaWYgKE1TUl9UTV9UUkFOU0FDVElPTkFMKHJlZ3MtPm1zcikpCi0JCQlyZXR1cm4gY3VycmVudC0+dGhyZWFkLmNrcHRfcmVncy5ncHJbMV07CisJCWlmIChNU1JfVE1fVFJBTlNBQ1RJT05BTCh0c2stPnRocmVhZC5yZWdzLT5tc3IpKQorCQkJcmV0dXJuIHRzay0+dGhyZWFkLmNrcHRfcmVncy5ncHJbMV07CiAJfQogI2VuZGlmCi0JcmV0dXJuIHJlZ3MtPmdwclsxXTsKKwlyZXR1cm4gdHNrLT50aHJlYWQucmVncy0+Z3ByWzFdOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWwuaCBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsLmgKaW5kZXggYmUzMDVjOC4uN2M1OWQ4OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWwuaAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbC5oCkBAIC0xNiwzOSArMTYsNDEgQEAKIAkJCQkgIHNpemVfdCBmcmFtZV9zaXplLCBpbnQgaXNfMzIpOwogCiBleHRlcm4gaW50IGhhbmRsZV9zaWduYWwzMihzdHJ1Y3Qga3NpZ25hbCAqa3NpZywgc2lnc2V0X3QgKm9sZHNldCwKLQkJCSAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKwkJCSAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIAogZXh0ZXJuIGludCBoYW5kbGVfcnRfc2lnbmFsMzIoc3RydWN0IGtzaWduYWwgKmtzaWcsIHNpZ3NldF90ICpvbGRzZXQsCi0JCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisJCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGNvcHlfZnByX3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLAogCQkJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBjb3B5X3RyYW5zYWN0X2Zwcl90b191c2VyKHZvaWQgX191c2VyICp0bywKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNvcHlfY2tmcHJfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sCiAJCQkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29weV9mcHJfZnJvbV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCQkJdm9pZCBfX3VzZXIgKmZyb20pOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29weV90cmFuc2FjdF9mcHJfZnJvbV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNvcHlfY2tmcHJfZnJvbV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCQkJCSB2b2lkIF9fdXNlciAqZnJvbSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfdG1fc3RhY2twb2ludGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKKwogI2lmZGVmIENPTkZJR19WU1gKIGV4dGVybiB1bnNpZ25lZCBsb25nIGNvcHlfdnN4X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLAogCQkJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBjb3B5X3RyYW5zYWN0X3ZzeF90b191c2VyKHZvaWQgX191c2VyICp0bywKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNvcHlfY2t2c3hfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sCiAJCQkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29weV92c3hfZnJvbV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCQkJdm9pZCBfX3VzZXIgKmZyb20pOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29weV90cmFuc2FjdF92c3hfZnJvbV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNvcHlfY2t2c3hfZnJvbV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCQkJCSB2b2lkIF9fdXNlciAqZnJvbSk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUEM2NAogCiBleHRlcm4gaW50IGhhbmRsZV9ydF9zaWduYWw2NChzdHJ1Y3Qga3NpZ25hbCAqa3NpZywgc2lnc2V0X3QgKnNldCwKLQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKwkJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIAogI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IGhhbmRsZV9ydF9zaWduYWw2NChzdHJ1Y3Qga3NpZ25hbCAqa3NpZywgc2lnc2V0X3QgKnNldCwKLQkJCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorCQkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJcmV0dXJuIC1FRkFVTFQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYwppbmRleCBiNmFhMzc4Li4yN2FhOTEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxhc20vdmRzby5oPgogI2luY2x1ZGUgPGFzbS9zd2l0Y2hfdG8uaD4KICNpbmNsdWRlIDxhc20vdG0uaD4KKyNpbmNsdWRlIDxhc20vYXNtLXByb3RvdHlwZXMuaD4KICNpZmRlZiBDT05GSUdfUFBDNjQKICNpbmNsdWRlICJwcGMzMi5oIgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KQEAgLTMxNSw3ICszMTYsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotdW5zaWduZWQgbG9uZyBjb3B5X3RyYW5zYWN0X2Zwcl90b191c2VyKHZvaWQgX191c2VyICp0bywKK3Vuc2lnbmVkIGxvbmcgY29weV9ja2Zwcl90b191c2VyKHZvaWQgX191c2VyICp0bywKIAkJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAl1NjQgYnVmW0VMRl9ORlBSRUddOwpAQCAtMzIzLDEyICszMjQsMTIgQEAKIAogCS8qIHNhdmUgRlBSIGNvcHkgdG8gbG9jYWwgYnVmZmVyIHRoZW4gd3JpdGUgdG8gdGhlIHRocmVhZF9zdHJ1Y3QgKi8KIAlmb3IgKGkgPSAwOyBpIDwgKEVMRl9ORlBSRUcgLSAxKSA7IGkrKykKLQkJYnVmW2ldID0gdGFzay0+dGhyZWFkLlRTX1RSQU5TX0ZQUihpKTsKLQlidWZbaV0gPSB0YXNrLT50aHJlYWQudHJhbnNhY3RfZnAuZnBzY3I7CisJCWJ1ZltpXSA9IHRhc2stPnRocmVhZC5UU19DS0ZQUihpKTsKKwlidWZbaV0gPSB0YXNrLT50aHJlYWQuY2tmcF9zdGF0ZS5mcHNjcjsKIAlyZXR1cm4gX19jb3B5X3RvX3VzZXIodG8sIGJ1ZiwgRUxGX05GUFJFRyAqIHNpemVvZihkb3VibGUpKTsKIH0KIAotdW5zaWduZWQgbG9uZyBjb3B5X3RyYW5zYWN0X2Zwcl9mcm9tX3VzZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAordW5zaWduZWQgbG9uZyBjb3B5X2NrZnByX2Zyb21fdXNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCiAJCQkJCSAgdm9pZCBfX3VzZXIgKmZyb20pCiB7CiAJdTY0IGJ1ZltFTEZfTkZQUkVHXTsKQEAgLTMzNywxMyArMzM4LDEzIEBACiAJaWYgKF9fY29weV9mcm9tX3VzZXIoYnVmLCBmcm9tLCBFTEZfTkZQUkVHICogc2l6ZW9mKGRvdWJsZSkpKQogCQlyZXR1cm4gMTsKIAlmb3IgKGkgPSAwOyBpIDwgKEVMRl9ORlBSRUcgLSAxKSA7IGkrKykKLQkJdGFzay0+dGhyZWFkLlRTX1RSQU5TX0ZQUihpKSA9IGJ1ZltpXTsKLQl0YXNrLT50aHJlYWQudHJhbnNhY3RfZnAuZnBzY3IgPSBidWZbaV07CisJCXRhc2stPnRocmVhZC5UU19DS0ZQUihpKSA9IGJ1ZltpXTsKKwl0YXNrLT50aHJlYWQuY2tmcF9zdGF0ZS5mcHNjciA9IGJ1ZltpXTsKIAogCXJldHVybiAwOwogfQogCi11bnNpZ25lZCBsb25nIGNvcHlfdHJhbnNhY3RfdnN4X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLAordW5zaWduZWQgbG9uZyBjb3B5X2NrdnN4X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLAogCQkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXU2NCBidWZbRUxGX05WU1JIQUxGUkVHXTsKQEAgLTM1MSwxMSArMzUyLDExIEBACiAKIAkvKiBzYXZlIEZQUiBjb3B5IHRvIGxvY2FsIGJ1ZmZlciB0aGVuIHdyaXRlIHRvIHRoZSB0aHJlYWRfc3RydWN0ICovCiAJZm9yIChpID0gMDsgaSA8IEVMRl9OVlNSSEFMRlJFRzsgaSsrKQotCQlidWZbaV0gPSB0YXNrLT50aHJlYWQudHJhbnNhY3RfZnAuZnByW2ldW1RTX1ZTUkxPV09GRlNFVF07CisJCWJ1ZltpXSA9IHRhc2stPnRocmVhZC5ja2ZwX3N0YXRlLmZwcltpXVtUU19WU1JMT1dPRkZTRVRdOwogCXJldHVybiBfX2NvcHlfdG9fdXNlcih0bywgYnVmLCBFTEZfTlZTUkhBTEZSRUcgKiBzaXplb2YoZG91YmxlKSk7CiB9CiAKLXVuc2lnbmVkIGxvbmcgY29weV90cmFuc2FjdF92c3hfZnJvbV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKK3Vuc2lnbmVkIGxvbmcgY29weV9ja3ZzeF9mcm9tX3VzZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAogCQkJCQkgIHZvaWQgX191c2VyICpmcm9tKQogewogCXU2NCBidWZbRUxGX05WU1JIQUxGUkVHXTsKQEAgLTM2NCw3ICszNjUsNyBAQAogCWlmIChfX2NvcHlfZnJvbV91c2VyKGJ1ZiwgZnJvbSwgRUxGX05WU1JIQUxGUkVHICogc2l6ZW9mKGRvdWJsZSkpKQogCQlyZXR1cm4gMTsKIAlmb3IgKGkgPSAwOyBpIDwgRUxGX05WU1JIQUxGUkVHIDsgaSsrKQotCQl0YXNrLT50aHJlYWQudHJhbnNhY3RfZnAuZnByW2ldW1RTX1ZTUkxPV09GRlNFVF0gPSBidWZbaV07CisJCXRhc2stPnRocmVhZC5ja2ZwX3N0YXRlLmZwcltpXVtUU19WU1JMT1dPRkZTRVRdID0gYnVmW2ldOwogCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0gKi8KQEAgLTM4NCwxNyArMzg1LDE3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCi1pbmxpbmUgdW5zaWduZWQgbG9uZyBjb3B5X3RyYW5zYWN0X2Zwcl90b191c2VyKHZvaWQgX191c2VyICp0bywKK2lubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfY2tmcHJfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sCiAJCQkJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JcmV0dXJuIF9fY29weV90b191c2VyKHRvLCB0YXNrLT50aHJlYWQudHJhbnNhY3RfZnAuZnByLAorCXJldHVybiBfX2NvcHlfdG9fdXNlcih0bywgdGFzay0+dGhyZWFkLmNrZnBfc3RhdGUuZnByLAogCQkJICAgICAgRUxGX05GUFJFRyAqIHNpemVvZihkb3VibGUpKTsKIH0KIAotaW5saW5lIHVuc2lnbmVkIGxvbmcgY29weV90cmFuc2FjdF9mcHJfZnJvbV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKK2lubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfY2tmcHJfZnJvbV91c2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCQkJCSB2b2lkIF9fdXNlciAqZnJvbSkKIHsKLQlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcih0YXNrLT50aHJlYWQudHJhbnNhY3RfZnAuZnByLCBmcm9tLAorCXJldHVybiBfX2NvcHlfZnJvbV91c2VyKHRhc2stPnRocmVhZC5ja2ZwX3N0YXRlLmZwciwgZnJvbSwKIAkJCQlFTEZfTkZQUkVHICogc2l6ZW9mKGRvdWJsZSkpOwogfQogI2VuZGlmIC8qIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0gKi8KQEAgLTUyNSw5ICs1MjYsNiBAQAogCSAqLwogCXJlZ3MtPm1zciAmPSB+TVNSX1RTX01BU0s7CiAKLQkvKiBNYWtlIHN1cmUgZmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgaW4gcmVncyAqLwotCWZsdXNoX2ZwX3RvX3RocmVhZChjdXJyZW50KTsKLQogCS8qIFNhdmUgYm90aCBzZXRzIG9mIGdlbmVyYWwgcmVnaXN0ZXJzICovCiAJaWYgKHNhdmVfZ2VuZXJhbF9yZWdzKCZjdXJyZW50LT50aHJlYWQuY2twdF9yZWdzLCBmcmFtZSkKIAkgICAgfHwgc2F2ZV9nZW5lcmFsX3JlZ3MocmVncywgdG1fZnJhbWUpKQpAQCAtNTQ1LDE4ICs1NDMsMTcgQEAKICNpZmRlZiBDT05GSUdfQUxUSVZFQwogCS8qIHNhdmUgYWx0aXZlYyByZWdpc3RlcnMgKi8KIAlpZiAoY3VycmVudC0+dGhyZWFkLnVzZWRfdnIpIHsKLQkJZmx1c2hfYWx0aXZlY190b190aHJlYWQoY3VycmVudCk7Ci0JCWlmIChfX2NvcHlfdG9fdXNlcigmZnJhbWUtPm1jX3ZyZWdzLCAmY3VycmVudC0+dGhyZWFkLnZyX3N0YXRlLAorCQlpZiAoX19jb3B5X3RvX3VzZXIoJmZyYW1lLT5tY192cmVncywgJmN1cnJlbnQtPnRocmVhZC5ja3ZyX3N0YXRlLAogCQkJCSAgIEVMRl9OVlJSRUcgKiBzaXplb2YodmVjdG9yMTI4KSkpCiAJCQlyZXR1cm4gMTsKIAkJaWYgKG1zciAmIE1TUl9WRUMpIHsKIAkJCWlmIChfX2NvcHlfdG9fdXNlcigmdG1fZnJhbWUtPm1jX3ZyZWdzLAotCQkJCQkgICAmY3VycmVudC0+dGhyZWFkLnRyYW5zYWN0X3ZyLAorCQkJCQkgICAmY3VycmVudC0+dGhyZWFkLnZyX3N0YXRlLAogCQkJCQkgICBFTEZfTlZSUkVHICogc2l6ZW9mKHZlY3RvcjEyOCkpKQogCQkJCXJldHVybiAxOwogCQl9IGVsc2UgewogCQkJaWYgKF9fY29weV90b191c2VyKCZ0bV9mcmFtZS0+bWNfdnJlZ3MsCi0JCQkJCSAgICZjdXJyZW50LT50aHJlYWQudnJfc3RhdGUsCisJCQkJCSAgICZjdXJyZW50LT50aHJlYWQuY2t2cl9zdGF0ZSwKIAkJCQkJICAgRUxGX05WUlJFRyAqIHNpemVvZih2ZWN0b3IxMjgpKSkKIAkJCQlyZXR1cm4gMTsKIAkJfQpAQCAtNTczLDI4ICs1NzAsMjggQEAKIAkgKiBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhhdCBzYW1lIHZlY3Rvci4gLS1CZW5ICiAJICovCiAJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FMVElWRUMpKQotCQljdXJyZW50LT50aHJlYWQudnJzYXZlID0gbWZzcHIoU1BSTl9WUlNBVkUpOwotCWlmIChfX3B1dF91c2VyKGN1cnJlbnQtPnRocmVhZC52cnNhdmUsCisJCWN1cnJlbnQtPnRocmVhZC5ja3Zyc2F2ZSA9IG1mc3ByKFNQUk5fVlJTQVZFKTsKKwlpZiAoX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuY2t2cnNhdmUsCiAJCSAgICAgICAodTMyIF9fdXNlciAqKSZmcmFtZS0+bWNfdnJlZ3NbMzJdKSkKIAkJcmV0dXJuIDE7CiAJaWYgKG1zciAmIE1TUl9WRUMpIHsKLQkJaWYgKF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLnRyYW5zYWN0X3Zyc2F2ZSwKKwkJaWYgKF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLnZyc2F2ZSwKIAkJCSAgICAgICAodTMyIF9fdXNlciAqKSZ0bV9mcmFtZS0+bWNfdnJlZ3NbMzJdKSkKIAkJCXJldHVybiAxOwogCX0gZWxzZSB7Ci0JCWlmIChfX3B1dF91c2VyKGN1cnJlbnQtPnRocmVhZC52cnNhdmUsCisJCWlmIChfX3B1dF91c2VyKGN1cnJlbnQtPnRocmVhZC5ja3Zyc2F2ZSwKIAkJCSAgICAgICAodTMyIF9fdXNlciAqKSZ0bV9mcmFtZS0+bWNfdnJlZ3NbMzJdKSkKIAkJCXJldHVybiAxOwogCX0KICNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLwogCi0JaWYgKGNvcHlfZnByX3RvX3VzZXIoJmZyYW1lLT5tY19mcmVncywgY3VycmVudCkpCisJaWYgKGNvcHlfY2tmcHJfdG9fdXNlcigmZnJhbWUtPm1jX2ZyZWdzLCBjdXJyZW50KSkKIAkJcmV0dXJuIDE7CiAJaWYgKG1zciAmIE1TUl9GUCkgewotCQlpZiAoY29weV90cmFuc2FjdF9mcHJfdG9fdXNlcigmdG1fZnJhbWUtPm1jX2ZyZWdzLCBjdXJyZW50KSkKKwkJaWYgKGNvcHlfZnByX3RvX3VzZXIoJnRtX2ZyYW1lLT5tY19mcmVncywgY3VycmVudCkpCiAJCQlyZXR1cm4gMTsKIAl9IGVsc2UgewotCQlpZiAoY29weV9mcHJfdG9fdXNlcigmdG1fZnJhbWUtPm1jX2ZyZWdzLCBjdXJyZW50KSkKKwkJaWYgKGNvcHlfY2tmcHJfdG9fdXNlcigmdG1fZnJhbWUtPm1jX2ZyZWdzLCBjdXJyZW50KSkKIAkJCXJldHVybiAxOwogCX0KIApAQCAtNjA2LDE1ICs2MDMsMTQgQEAKIAkgKiBjb250YWlucyB2YWxpZCBkYXRhCiAJICovCiAJaWYgKGN1cnJlbnQtPnRocmVhZC51c2VkX3ZzcikgewotCQlmbHVzaF92c3hfdG9fdGhyZWFkKGN1cnJlbnQpOwotCQlpZiAoY29weV92c3hfdG9fdXNlcigmZnJhbWUtPm1jX3ZzcmVncywgY3VycmVudCkpCisJCWlmIChjb3B5X2NrdnN4X3RvX3VzZXIoJmZyYW1lLT5tY192c3JlZ3MsIGN1cnJlbnQpKQogCQkJcmV0dXJuIDE7CiAJCWlmIChtc3IgJiBNU1JfVlNYKSB7Ci0JCQlpZiAoY29weV90cmFuc2FjdF92c3hfdG9fdXNlcigmdG1fZnJhbWUtPm1jX3ZzcmVncywKKwkJCWlmIChjb3B5X3ZzeF90b191c2VyKCZ0bV9mcmFtZS0+bWNfdnNyZWdzLAogCQkJCQkJICAgICAgY3VycmVudCkpCiAJCQkJcmV0dXJuIDE7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoY29weV92c3hfdG9fdXNlcigmdG1fZnJhbWUtPm1jX3ZzcmVncywgY3VycmVudCkpCisJCQlpZiAoY29weV9ja3ZzeF90b191c2VyKCZ0bV9mcmFtZS0+bWNfdnNyZWdzLCBjdXJyZW50KSkKIAkJCQlyZXR1cm4gMTsKIAkJfQogCkBAIC02OTgsNiArNjk0LDcgQEAKIAkJaWYgKF9fY29weV9mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC52cl9zdGF0ZSwgJnNyLT5tY192cmVncywKIAkJCQkgICAgIHNpemVvZihzci0+bWNfdnJlZ3MpKSkKIAkJCXJldHVybiAxOworCQljdXJyZW50LT50aHJlYWQudXNlZF92ciA9IHRydWU7CiAJfSBlbHNlIGlmIChjdXJyZW50LT50aHJlYWQudXNlZF92cikKIAkJbWVtc2V0KCZjdXJyZW50LT50aHJlYWQudnJfc3RhdGUsIDAsCiAJCSAgICAgICBFTEZfTlZSUkVHICogc2l6ZW9mKHZlY3RvcjEyOCkpOwpAQCAtNzI0LDYgKzcyMSw3IEBACiAJCSAqLwogCQlpZiAoY29weV92c3hfZnJvbV91c2VyKGN1cnJlbnQsICZzci0+bWNfdnNyZWdzKSkKIAkJCXJldHVybiAxOworCQljdXJyZW50LT50aHJlYWQudXNlZF92c3IgPSB0cnVlOwogCX0gZWxzZSBpZiAoY3VycmVudC0+dGhyZWFkLnVzZWRfdnNyKQogCQlmb3IgKGkgPSAwOyBpIDwgMzIgOyBpKyspCiAJCQljdXJyZW50LT50aHJlYWQuZnBfc3RhdGUuZnByW2ldW1RTX1ZTUkxPV09GRlNFVF0gPSAwOwpAQCAtNzQzLDYgKzc0MSw3IEBACiAJCWlmIChfX2NvcHlfZnJvbV91c2VyKGN1cnJlbnQtPnRocmVhZC5ldnIsICZzci0+bWNfdnJlZ3MsCiAJCQkJICAgICBFTEZfTkVWUlJFRyAqIHNpemVvZih1MzIpKSkKIAkJCXJldHVybiAxOworCQljdXJyZW50LT50aHJlYWQudXNlZF9zcGUgPSB0cnVlOwogCX0gZWxzZSBpZiAoY3VycmVudC0+dGhyZWFkLnVzZWRfc3BlKQogCQltZW1zZXQoY3VycmVudC0+dGhyZWFkLmV2ciwgMCwgRUxGX05FVlJSRUcgKiBzaXplb2YodTMyKSk7CiAKQEAgLTc5MywzMyArNzkyLDM0IEBACiAJcmVncy0+bXNyICY9IH5NU1JfVkVDOwogCWlmIChtc3IgJiBNU1JfVkVDKSB7CiAJCS8qIHJlc3RvcmUgYWx0aXZlYyByZWdpc3RlcnMgZnJvbSB0aGUgc3RhY2sgKi8KLQkJaWYgKF9fY29weV9mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC52cl9zdGF0ZSwgJnNyLT5tY192cmVncywKKwkJaWYgKF9fY29weV9mcm9tX3VzZXIoJmN1cnJlbnQtPnRocmVhZC5ja3ZyX3N0YXRlLCAmc3ItPm1jX3ZyZWdzLAogCQkJCSAgICAgc2l6ZW9mKHNyLT5tY192cmVncykpIHx8Ci0JCSAgICBfX2NvcHlfZnJvbV91c2VyKCZjdXJyZW50LT50aHJlYWQudHJhbnNhY3RfdnIsCisJCSAgICBfX2NvcHlfZnJvbV91c2VyKCZjdXJyZW50LT50aHJlYWQudnJfc3RhdGUsCiAJCQkJICAgICAmdG1fc3ItPm1jX3ZyZWdzLAogCQkJCSAgICAgc2l6ZW9mKHNyLT5tY192cmVncykpKQogCQkJcmV0dXJuIDE7CisJCWN1cnJlbnQtPnRocmVhZC51c2VkX3ZyID0gdHJ1ZTsKIAl9IGVsc2UgaWYgKGN1cnJlbnQtPnRocmVhZC51c2VkX3ZyKSB7CiAJCW1lbXNldCgmY3VycmVudC0+dGhyZWFkLnZyX3N0YXRlLCAwLAogCQkgICAgICAgRUxGX05WUlJFRyAqIHNpemVvZih2ZWN0b3IxMjgpKTsKLQkJbWVtc2V0KCZjdXJyZW50LT50aHJlYWQudHJhbnNhY3RfdnIsIDAsCisJCW1lbXNldCgmY3VycmVudC0+dGhyZWFkLmNrdnJfc3RhdGUsIDAsCiAJCSAgICAgICBFTEZfTlZSUkVHICogc2l6ZW9mKHZlY3RvcjEyOCkpOwogCX0KIAogCS8qIEFsd2F5cyBnZXQgVlJTQVZFIGJhY2sgKi8KLQlpZiAoX19nZXRfdXNlcihjdXJyZW50LT50aHJlYWQudnJzYXZlLAorCWlmIChfX2dldF91c2VyKGN1cnJlbnQtPnRocmVhZC5ja3Zyc2F2ZSwKIAkJICAgICAgICh1MzIgX191c2VyICopJnNyLT5tY192cmVnc1szMl0pIHx8Ci0JICAgIF9fZ2V0X3VzZXIoY3VycmVudC0+dGhyZWFkLnRyYW5zYWN0X3Zyc2F2ZSwKKwkgICAgX19nZXRfdXNlcihjdXJyZW50LT50aHJlYWQudnJzYXZlLAogCQkgICAgICAgKHUzMiBfX3VzZXIgKikmdG1fc3ItPm1jX3ZyZWdzWzMyXSkpCiAJCXJldHVybiAxOwogCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BTFRJVkVDKSkKLQkJbXRzcHIoU1BSTl9WUlNBVkUsIGN1cnJlbnQtPnRocmVhZC52cnNhdmUpOworCQltdHNwcihTUFJOX1ZSU0FWRSwgY3VycmVudC0+dGhyZWFkLmNrdnJzYXZlKTsKICNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLwogCiAJcmVncy0+bXNyICY9IH4oTVNSX0ZQIHwgTVNSX0ZFMCB8IE1TUl9GRTEpOwogCiAJaWYgKGNvcHlfZnByX2Zyb21fdXNlcihjdXJyZW50LCAmc3ItPm1jX2ZyZWdzKSB8fAotCSAgICBjb3B5X3RyYW5zYWN0X2Zwcl9mcm9tX3VzZXIoY3VycmVudCwgJnRtX3NyLT5tY19mcmVncykpCisJICAgIGNvcHlfY2tmcHJfZnJvbV91c2VyKGN1cnJlbnQsICZ0bV9zci0+bWNfZnJlZ3MpKQogCQlyZXR1cm4gMTsKIAogI2lmZGVmIENPTkZJR19WU1gKQEAgLTgyOSwxMyArODI5LDE0IEBACiAJCSAqIFJlc3RvcmUgYWx0aXZlYyByZWdpc3RlcnMgZnJvbSB0aGUgc3RhY2sgdG8gYSBsb2NhbAogCQkgKiBidWZmZXIsIHRoZW4gd3JpdGUgdGhpcyBvdXQgdG8gdGhlIHRocmVhZF9zdHJ1Y3QKIAkJICovCi0JCWlmIChjb3B5X3ZzeF9mcm9tX3VzZXIoY3VycmVudCwgJnNyLT5tY192c3JlZ3MpIHx8Ci0JCSAgICBjb3B5X3RyYW5zYWN0X3ZzeF9mcm9tX3VzZXIoY3VycmVudCwgJnRtX3NyLT5tY192c3JlZ3MpKQorCQlpZiAoY29weV92c3hfZnJvbV91c2VyKGN1cnJlbnQsICZ0bV9zci0+bWNfdnNyZWdzKSB8fAorCQkgICAgY29weV9ja3ZzeF9mcm9tX3VzZXIoY3VycmVudCwgJnNyLT5tY192c3JlZ3MpKQogCQkJcmV0dXJuIDE7CisJCWN1cnJlbnQtPnRocmVhZC51c2VkX3ZzciA9IHRydWU7CiAJfSBlbHNlIGlmIChjdXJyZW50LT50aHJlYWQudXNlZF92c3IpCiAJCWZvciAoaSA9IDA7IGkgPCAzMiA7IGkrKykgewogCQkJY3VycmVudC0+dGhyZWFkLmZwX3N0YXRlLmZwcltpXVtUU19WU1JMT1dPRkZTRVRdID0gMDsKLQkJCWN1cnJlbnQtPnRocmVhZC50cmFuc2FjdF9mcC5mcHJbaV1bVFNfVlNSTE9XT0ZGU0VUXSA9IDA7CisJCQljdXJyZW50LT50aHJlYWQuY2tmcF9zdGF0ZS5mcHJbaV1bVFNfVlNSTE9XT0ZGU0VUXSA9IDA7CiAJCX0KICNlbmRpZiAvKiBDT05GSUdfVlNYICovCiAKQEAgLTg0OCw2ICs4NDksNyBAQAogCQlpZiAoX19jb3B5X2Zyb21fdXNlcihjdXJyZW50LT50aHJlYWQuZXZyLCAmc3ItPm1jX3ZyZWdzLAogCQkJCSAgICAgRUxGX05FVlJSRUcgKiBzaXplb2YodTMyKSkpCiAJCQlyZXR1cm4gMTsKKwkJY3VycmVudC0+dGhyZWFkLnVzZWRfc3BlID0gdHJ1ZTsKIAl9IGVsc2UgaWYgKGN1cnJlbnQtPnRocmVhZC51c2VkX3NwZSkKIAkJbWVtc2V0KGN1cnJlbnQtPnRocmVhZC5ldnIsIDAsIEVMRl9ORVZSUkVHICogc2l6ZW9mKHUzMikpOwogCkBAIC04NzcsMTMgKzg3OSwxNCBAQAogCXRtX3JlY2hlY2twb2ludCgmY3VycmVudC0+dGhyZWFkLCBtc3IpOwogCiAJLyogVGhpcyBsb2FkcyB0aGUgc3BlY3VsYXRpdmUgRlAvVkVDIHN0YXRlLCBpZiB1c2VkICovCisJbXNyX2NoZWNrX2FuZF9zZXQobXNyICYgKE1TUl9GUCB8IE1TUl9WRUMpKTsKIAlpZiAobXNyICYgTVNSX0ZQKSB7Ci0JCWRvX2xvYWRfdXBfdHJhbnNhY3RfZnB1KCZjdXJyZW50LT50aHJlYWQpOworCQlsb2FkX2ZwX3N0YXRlKCZjdXJyZW50LT50aHJlYWQuZnBfc3RhdGUpOwogCQlyZWdzLT5tc3IgfD0gKE1TUl9GUCB8IGN1cnJlbnQtPnRocmVhZC5mcGV4Y19tb2RlKTsKIAl9CiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIAlpZiAobXNyICYgTVNSX1ZFQykgewotCQlkb19sb2FkX3VwX3RyYW5zYWN0X2FsdGl2ZWMoJmN1cnJlbnQtPnRocmVhZCk7CisJCWxvYWRfdnJfc3RhdGUoJmN1cnJlbnQtPnRocmVhZC52cl9zdGF0ZSk7CiAJCXJlZ3MtPm1zciB8PSBNU1JfVkVDOwogCX0KICNlbmRpZgpAQCAtOTcxLDcgKzk3NCw3IEBACiAgKiAob25lIHdoaWNoIGdldHMgc2lnaW5mbykuCiAgKi8KIGludCBoYW5kbGVfcnRfc2lnbmFsMzIoc3RydWN0IGtzaWduYWwgKmtzaWcsIHNpZ3NldF90ICpvbGRzZXQsCi0JCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKKwkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKnJ0X3NmOwogCXN0cnVjdCBtY29udGV4dCBfX3VzZXIgKmZyYW1lOwpAQCAtOTgwLDEwICs5ODMsMTMgQEAKIAl1bnNpZ25lZCBsb25nIG5ld3NwID0gMDsKIAlpbnQgc2lncmV0OwogCXVuc2lnbmVkIGxvbmcgdHJhbXA7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0c2stPnRocmVhZC5yZWdzOworCisJQlVHX09OKHRzayAhPSBjdXJyZW50KTsKIAogCS8qIFNldCB1cCBTaWduYWwgRnJhbWUgKi8KIAkvKiBQdXQgYSBSZWFsIFRpbWUgQ29udGV4dCBvbnRvIHN0YWNrICovCi0JcnRfc2YgPSBnZXRfc2lnZnJhbWUoa3NpZywgZ2V0X3RtX3N0YWNrcG9pbnRlcihyZWdzKSwgc2l6ZW9mKCpydF9zZiksIDEpOworCXJ0X3NmID0gZ2V0X3NpZ2ZyYW1lKGtzaWcsIGdldF90bV9zdGFja3BvaW50ZXIodHNrKSwgc2l6ZW9mKCpydF9zZiksIDEpOwogCWFkZHIgPSBydF9zZjsKIAlpZiAodW5saWtlbHkocnRfc2YgPT0gTlVMTCkpCiAJCWdvdG8gYmFkZnJhbWU7CkBAIC0xMDAwLDkgKzEwMDYsOSBAQAogCS8qIFNhdmUgdXNlciByZWdpc3RlcnMgb24gdGhlIHN0YWNrICovCiAJZnJhbWUgPSAmcnRfc2YtPnVjLnVjX21jb250ZXh0OwogCWFkZHIgPSBmcmFtZTsKLQlpZiAodmRzbzMyX3J0X3NpZ3RyYW1wICYmIGN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc29fYmFzZSkgeworCWlmICh2ZHNvMzJfcnRfc2lndHJhbXAgJiYgdHNrLT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UpIHsKIAkJc2lncmV0ID0gMDsKLQkJdHJhbXAgPSBjdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgKyB2ZHNvMzJfcnRfc2lndHJhbXA7CisJCXRyYW1wID0gdHNrLT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgKyB2ZHNvMzJfcnRfc2lndHJhbXA7CiAJfSBlbHNlIHsKIAkJc2lncmV0ID0gX19OUl9ydF9zaWdyZXR1cm47CiAJCXRyYW1wID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lLT50cmFtcDsKQEAgLTEwMjksNyArMTAzNSw3IEBACiAJfQogCXJlZ3MtPmxpbmsgPSB0cmFtcDsKIAotCWN1cnJlbnQtPnRocmVhZC5mcF9zdGF0ZS5mcHNjciA9IDA7CS8qIHR1cm4gb2ZmIGFsbCBmcCBleGNlcHRpb25zICovCisJdHNrLT50aHJlYWQuZnBfc3RhdGUuZnBzY3IgPSAwOwkvKiB0dXJuIG9mZiBhbGwgZnAgZXhjZXB0aW9ucyAqLwogCiAJLyogY3JlYXRlIGEgc3RhY2sgZnJhbWUgZm9yIHRoZSBjYWxsZXIgb2YgdGhlIGhhbmRsZXIgKi8KIAluZXdzcCA9ICgodW5zaWduZWQgbG9uZylydF9zZikgLSAoX19TSUdOQUxfRlJBTUVTSVpFICsgMTYpOwpAQCAtMTA1NCw3ICsxMDYwLDcgQEAKIAkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fSU5GTwogCQkJCSAgICIlc1slZF06IGJhZCBmcmFtZSBpbiBoYW5kbGVfcnRfc2lnbmFsMzI6ICIKIAkJCQkgICAiJXAgbmlwICUwOGx4IGxyICUwOGx4XG4iLAotCQkJCSAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwKKwkJCQkgICB0c2stPmNvbW0sIHRzay0+cGlkLAogCQkJCSAgIGFkZHIsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CiAKIAlyZXR1cm4gMTsKQEAgLTEyMjYsNyArMTIzMiwyMSBAQAogCQkocmVncy0+Z3ByWzFdICsgX19TSUdOQUxfRlJBTUVTSVpFICsgMTYpOwogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBydF9zZiwgc2l6ZW9mKCpydF9zZikpKQogCQlnb3RvIGJhZDsKKwogI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb25hbCBzdGF0ZSB0aGVuIHRocm93IGl0IGF3YXkuCisJICogVGhlIHB1cnBvc2Ugb2YgYSBzaWdyZXR1cm4gaXMgdG8gZGVzdHJveSBhbGwgdHJhY2VzIG9mIHRoZQorCSAqIHNpZ25hbCBmcmFtZSwgdGhpcyBpbmNsdWRlcyBhbnkgdHJhbnNhY3Rpb25hbCBzdGF0ZSBjcmVhdGVkCisJICogd2l0aGluIGluLiBXZSBvbmx5IGNoZWNrIGZvciBzdXNwZW5kZWQgYXMgd2UgY2FuIG5ldmVyIGJlCisJICogYWN0aXZlIGluIHRoZSBrZXJuZWwsIHdlIGFyZSBhY3RpdmUsIHRoZXJlIGlzIG5vdGhpbmcgYmV0dGVyIHRvCisJICogZG8gdGhhbiBnbyBhaGVhZCBhbmQgQmFkIFRoaW5nIGxhdGVyLgorCSAqIFRoZSBjYXVzZSBpcyBub3QgaW1wb3J0YW50IGFzIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYQorCSAqIHJlY2hlY2twb2ludCBzbyBpdCdzIG5vdCB1c2VyIHZpc2libGUuCisJICovCisJaWYgKE1TUl9UTV9TVVNQRU5ERUQobWZtc3IoKSkpCisJCXRtX3JlY2xhaW1fY3VycmVudCgwKTsKKwogCWlmIChfX2dldF91c2VyKHRtcCwgJnJ0X3NmLT51Yy51Y19saW5rKSkKIAkJZ290byBiYWQ7CiAJdWNfdHJhbnNhY3QgPSAoc3RydWN0IHVjb250ZXh0IF9fdXNlciAqKSh1aW50cHRyX3QpdG1wOwpAQCAtMTM5Niw3ICsxNDE2LDggQEAKIC8qCiAgKiBPSywgd2UncmUgaW52b2tpbmcgYSBoYW5kbGVyCiAgKi8KLWludCBoYW5kbGVfc2lnbmFsMzIoc3RydWN0IGtzaWduYWwgKmtzaWcsIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IGhhbmRsZV9zaWduYWwzMihzdHJ1Y3Qga3NpZ25hbCAqa3NpZywgc2lnc2V0X3QgKm9sZHNldCwKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYzsKIAlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZTsKQEAgLTE0MDQsOSArMTQyNSwxMiBAQAogCXVuc2lnbmVkIGxvbmcgbmV3c3AgPSAwOwogCWludCBzaWdyZXQ7CiAJdW5zaWduZWQgbG9uZyB0cmFtcDsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRzay0+dGhyZWFkLnJlZ3M7CisKKwlCVUdfT04odHNrICE9IGN1cnJlbnQpOwogCiAJLyogU2V0IHVwIFNpZ25hbCBGcmFtZSAqLwotCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGtzaWcsIGdldF90bV9zdGFja3BvaW50ZXIocmVncyksIHNpemVvZigqZnJhbWUpLCAxKTsKKwlmcmFtZSA9IGdldF9zaWdmcmFtZShrc2lnLCBnZXRfdG1fc3RhY2twb2ludGVyKHRzayksIHNpemVvZigqZnJhbWUpLCAxKTsKIAlpZiAodW5saWtlbHkoZnJhbWUgPT0gTlVMTCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAJc2MgPSAoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICopICZmcmFtZS0+c2N0eDsKQEAgLTE0MjUsOSArMTQ0OSw5IEBACiAJICAgIHx8IF9fcHV0X3VzZXIoa3NpZy0+c2lnLCAmc2MtPnNpZ25hbCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKLQlpZiAodmRzbzMyX3NpZ3RyYW1wICYmIGN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc29fYmFzZSkgeworCWlmICh2ZHNvMzJfc2lndHJhbXAgJiYgdHNrLT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UpIHsKIAkJc2lncmV0ID0gMDsKLQkJdHJhbXAgPSBjdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgKyB2ZHNvMzJfc2lndHJhbXA7CisJCXRyYW1wID0gdHNrLT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgKyB2ZHNvMzJfc2lndHJhbXA7CiAJfSBlbHNlIHsKIAkJc2lncmV0ID0gX19OUl9zaWdyZXR1cm47CiAJCXRyYW1wID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lLT5tY3R4LnRyYW1wOwpAQCAtMTQ0OSw3ICsxNDczLDcgQEAKIAogCXJlZ3MtPmxpbmsgPSB0cmFtcDsKIAotCWN1cnJlbnQtPnRocmVhZC5mcF9zdGF0ZS5mcHNjciA9IDA7CS8qIHR1cm4gb2ZmIGFsbCBmcCBleGNlcHRpb25zICovCisJdHNrLT50aHJlYWQuZnBfc3RhdGUuZnBzY3IgPSAwOwkvKiB0dXJuIG9mZiBhbGwgZnAgZXhjZXB0aW9ucyAqLwogCiAJLyogY3JlYXRlIGEgc3RhY2sgZnJhbWUgZm9yIHRoZSBjYWxsZXIgb2YgdGhlIGhhbmRsZXIgKi8KIAluZXdzcCA9ICgodW5zaWduZWQgbG9uZylmcmFtZSkgLSBfX1NJR05BTF9GUkFNRVNJWkU7CkBAIC0xNDY5LDcgKzE0OTMsNyBAQAogCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9JTkZPCiAJCQkJICAgIiVzWyVkXTogYmFkIGZyYW1lIGluIGhhbmRsZV9zaWduYWwzMjogIgogCQkJCSAgICIlcCBuaXAgJTA4bHggbHIgJTA4bHhcbiIsCi0JCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLAorCQkJCSAgIHRzay0+Y29tbSwgdHNrLT5waWQsCiAJCQkJICAgZnJhbWUsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CiAKIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCmluZGV4IDdlNDk5ODQuLjk2Njk4ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYwpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGFzbS92ZHNvLmg+CiAjaW5jbHVkZSA8YXNtL3N3aXRjaF90by5oPgogI2luY2x1ZGUgPGFzbS90bS5oPgorI2luY2x1ZGUgPGFzbS9hc20tcHJvdG90eXBlcy5oPgogCiAjaW5jbHVkZSAic2lnbmFsLmgiCiAKQEAgLTkwLDkgKzkxLDkgQEAKICAqIFNldCB1cCB0aGUgc2lnY29udGV4dCBmb3IgdGhlIHNpZ25hbCBmcmFtZS4KICAqLwogCi1zdGF0aWMgbG9uZyBzZXR1cF9zaWdjb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkgaW50IHNpZ25yLCBzaWdzZXRfdCAqc2V0LCB1bnNpZ25lZCBsb25nIGhhbmRsZXIsCi0JCSBpbnQgY3R4X2hhc192c3hfcmVnaW9uKQorc3RhdGljIGxvbmcgc2V0dXBfc2lnY29udGV4dChzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjLAorCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IHNpZ25yLCBzaWdzZXRfdCAqc2V0LAorCQl1bnNpZ25lZCBsb25nIGhhbmRsZXIsIGludCBjdHhfaGFzX3ZzeF9yZWdpb24pCiB7CiAJLyogV2hlbiBDT05GSUdfQUxUSVZFQyBpcyBzZXQsIHdlIF9hbHdheXNfIHNldHVwIHZfcmVncyBldmVuIGlmIHRoZQogCSAqIHByb2Nlc3MgbmV2ZXIgdXNlZCBhbHRpdmVjIHlldCAoTVNSX1ZFQyBpcyB6ZXJvIGluIHB0X3JlZ3Mgb2YKQEAgLTEwNiwxNyArMTA3LDIwIEBACiAJZWxmX3ZycmVnX3QgX191c2VyICp2X3JlZ3MgPSBzaWdjb250ZXh0X3ZteF9yZWdzKHNjKTsKIAl1bnNpZ25lZCBsb25nIHZyc2F2ZTsKICNlbmRpZgorCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdHNrLT50aHJlYWQucmVnczsKIAl1bnNpZ25lZCBsb25nIG1zciA9IHJlZ3MtPm1zcjsKIAlsb25nIGVyciA9IDA7CiAKKwlCVUdfT04odHNrICE9IGN1cnJlbnQpOworCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIAllcnIgfD0gX19wdXRfdXNlcih2X3JlZ3MsICZzYy0+dl9yZWdzKTsKIAogCS8qIHNhdmUgYWx0aXZlYyByZWdpc3RlcnMgKi8KLQlpZiAoY3VycmVudC0+dGhyZWFkLnVzZWRfdnIpIHsKLQkJZmx1c2hfYWx0aXZlY190b190aHJlYWQoY3VycmVudCk7CisJaWYgKHRzay0+dGhyZWFkLnVzZWRfdnIpIHsKKwkJZmx1c2hfYWx0aXZlY190b190aHJlYWQodHNrKTsKIAkJLyogQ29weSAzMyB2ZWMgcmVnaXN0ZXJzICh2cjAuLjMxIGFuZCB2c2NyKSB0byB0aGUgc3RhY2sgKi8KLQkJZXJyIHw9IF9fY29weV90b191c2VyKHZfcmVncywgJmN1cnJlbnQtPnRocmVhZC52cl9zdGF0ZSwKKwkJZXJyIHw9IF9fY29weV90b191c2VyKHZfcmVncywgJnRzay0+dGhyZWFkLnZyX3N0YXRlLAogCQkJCSAgICAgIDMzICogc2l6ZW9mKHZlY3RvcjEyOCkpOwogCQkvKiBzZXQgTVNSX1ZFQyBpbiB0aGUgTVNSIHZhbHVlIGluIHRoZSBmcmFtZSB0byBpbmRpY2F0ZSB0aGF0IHNjLT52X3JlZykKIAkJICogY29udGFpbnMgdmFsaWQgZGF0YS4KQEAgLTEyOSwxNiArMTMzLDE2IEBACiAJdnJzYXZlID0gMDsKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQUxUSVZFQykpIHsKIAkJdnJzYXZlID0gbWZzcHIoU1BSTl9WUlNBVkUpOwotCQljdXJyZW50LT50aHJlYWQudnJzYXZlID0gdnJzYXZlOworCQl0c2stPnRocmVhZC52cnNhdmUgPSB2cnNhdmU7CiAJfQogCiAJZXJyIHw9IF9fcHV0X3VzZXIodnJzYXZlLCAodTMyIF9fdXNlciAqKSZ2X3JlZ3NbMzNdKTsKICNlbHNlIC8qIENPTkZJR19BTFRJVkVDICovCiAJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJnNjLT52X3JlZ3MpOwogI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCi0JZmx1c2hfZnBfdG9fdGhyZWFkKGN1cnJlbnQpOworCWZsdXNoX2ZwX3RvX3RocmVhZCh0c2spOwogCS8qIGNvcHkgZnByIHJlZ3MgYW5kIGZwc2NyICovCi0JZXJyIHw9IGNvcHlfZnByX3RvX3VzZXIoJnNjLT5mcF9yZWdzLCBjdXJyZW50KTsKKwllcnIgfD0gY29weV9mcHJfdG9fdXNlcigmc2MtPmZwX3JlZ3MsIHRzayk7CiAKIAkvKgogCSAqIENsZWFyIHRoZSBNU1IgVlNYIGJpdCB0byBpbmRpY2F0ZSB0aGVyZSBpcyBubyB2YWxpZCBzdGF0ZSBhdHRhY2hlZApAQCAtMTUxLDEwICsxNTUsMTAgQEAKIAkgKiB0aGVuIG91dCB0byB1c2Vyc3BhY2UuICBVcGRhdGUgdl9yZWdzIHRvIHBvaW50IGFmdGVyIHRoZQogCSAqIFZNWCBkYXRhLgogCSAqLwotCWlmIChjdXJyZW50LT50aHJlYWQudXNlZF92c3IgJiYgY3R4X2hhc192c3hfcmVnaW9uKSB7Ci0JCWZsdXNoX3ZzeF90b190aHJlYWQoY3VycmVudCk7CisJaWYgKHRzay0+dGhyZWFkLnVzZWRfdnNyICYmIGN0eF9oYXNfdnN4X3JlZ2lvbikgeworCQlmbHVzaF92c3hfdG9fdGhyZWFkKHRzayk7CiAJCXZfcmVncyArPSBFTEZfTlZSUkVHOwotCQllcnIgfD0gY29weV92c3hfdG9fdXNlcih2X3JlZ3MsIGN1cnJlbnQpOworCQllcnIgfD0gY29weV92c3hfdG9fdXNlcih2X3JlZ3MsIHRzayk7CiAJCS8qIHNldCBNU1JfVlNYIGluIHRoZSBNU1IgdmFsdWUgaW4gdGhlIGZyYW1lIHRvCiAJCSAqIGluZGljYXRlIHRoYXQgc2MtPnZzX3JlZykgY29udGFpbnMgdmFsaWQgZGF0YS4KIAkJICovCkBAIC0xODcsNyArMTkxLDcgQEAKICAqLwogc3RhdGljIGxvbmcgc2V0dXBfdG1fc2lnY29udGV4dHMoc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywKIAkJCQkgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICp0bV9zYywKLQkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAogCQkJCSBpbnQgc2lnbnIsIHNpZ3NldF90ICpzZXQsIHVuc2lnbmVkIGxvbmcgaGFuZGxlcikKIHsKIAkvKiBXaGVuIENPTkZJR19BTFRJVkVDIGlzIHNldCwgd2UgX2Fsd2F5c18gc2V0dXAgdl9yZWdzIGV2ZW4gaWYgdGhlCkBAIC0yMDIsOSArMjA2LDEyIEBACiAJZWxmX3ZycmVnX3QgX191c2VyICp2X3JlZ3MgPSBzaWdjb250ZXh0X3ZteF9yZWdzKHNjKTsKIAllbGZfdnJyZWdfdCBfX3VzZXIgKnRtX3ZfcmVncyA9IHNpZ2NvbnRleHRfdm14X3JlZ3ModG1fc2MpOwogI2VuZGlmCi0JdW5zaWduZWQgbG9uZyBtc3IgPSByZWdzLT5tc3I7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0c2stPnRocmVhZC5yZWdzOworCXVuc2lnbmVkIGxvbmcgbXNyID0gdHNrLT50aHJlYWQuY2twdF9yZWdzLm1zcjsKIAlsb25nIGVyciA9IDA7CiAKKwlCVUdfT04odHNrICE9IGN1cnJlbnQpOworCiAJQlVHX09OKCFNU1JfVE1fQUNUSVZFKHJlZ3MtPm1zcikpOwogCiAJLyogUmVtb3ZlIFRNIGJpdHMgZnJvbSB0aHJlYWQncyBNU1IuICBUaGUgTVNSIGluIHRoZSBzaWdjb250ZXh0CkBAIC0yMTQsMjggKzIyMSwyNSBAQAogCSAqLwogCXJlZ3MtPm1zciAmPSB+TVNSX1RTX01BU0s7CiAKLQlmbHVzaF9mcF90b190aHJlYWQoY3VycmVudCk7Ci0KICNpZmRlZiBDT05GSUdfQUxUSVZFQwogCWVyciB8PSBfX3B1dF91c2VyKHZfcmVncywgJnNjLT52X3JlZ3MpOwogCWVyciB8PSBfX3B1dF91c2VyKHRtX3ZfcmVncywgJnRtX3NjLT52X3JlZ3MpOwogCiAJLyogc2F2ZSBhbHRpdmVjIHJlZ2lzdGVycyAqLwotCWlmIChjdXJyZW50LT50aHJlYWQudXNlZF92cikgewotCQlmbHVzaF9hbHRpdmVjX3RvX3RocmVhZChjdXJyZW50KTsKKwlpZiAodHNrLT50aHJlYWQudXNlZF92cikgewogCQkvKiBDb3B5IDMzIHZlYyByZWdpc3RlcnMgKHZyMC4uMzEgYW5kIHZzY3IpIHRvIHRoZSBzdGFjayAqLwotCQllcnIgfD0gX19jb3B5X3RvX3VzZXIodl9yZWdzLCAmY3VycmVudC0+dGhyZWFkLnZyX3N0YXRlLAorCQllcnIgfD0gX19jb3B5X3RvX3VzZXIodl9yZWdzLCAmdHNrLT50aHJlYWQuY2t2cl9zdGF0ZSwKIAkJCQkgICAgICAzMyAqIHNpemVvZih2ZWN0b3IxMjgpKTsKIAkJLyogSWYgVkVDIHdhcyBlbmFibGVkIHRoZXJlIGFyZSB0cmFuc2FjdGlvbmFsIFZScyB2YWxpZCB0b28sCiAJCSAqIGVsc2UgdGhleSdyZSBhIGNvcHkgb2YgdGhlIGNoZWNrcG9pbnRlZCBWUnMuCiAJCSAqLwogCQlpZiAobXNyICYgTVNSX1ZFQykKIAkJCWVyciB8PSBfX2NvcHlfdG9fdXNlcih0bV92X3JlZ3MsCi0JCQkJCSAgICAgICZjdXJyZW50LT50aHJlYWQudHJhbnNhY3RfdnIsCisJCQkJCSAgICAgICZ0c2stPnRocmVhZC52cl9zdGF0ZSwKIAkJCQkJICAgICAgMzMgKiBzaXplb2YodmVjdG9yMTI4KSk7CiAJCWVsc2UKIAkJCWVyciB8PSBfX2NvcHlfdG9fdXNlcih0bV92X3JlZ3MsCi0JCQkJCSAgICAgICZjdXJyZW50LT50aHJlYWQudnJfc3RhdGUsCisJCQkJCSAgICAgICZ0c2stPnRocmVhZC5ja3ZyX3N0YXRlLAogCQkJCQkgICAgICAzMyAqIHNpemVvZih2ZWN0b3IxMjgpKTsKIAogCQkvKiBzZXQgTVNSX1ZFQyBpbiB0aGUgTVNSIHZhbHVlIGluIHRoZSBmcmFtZSB0byBpbmRpY2F0ZQpAQCAtMjQ3LDEzICsyNTEsMTMgQEAKIAkgKiB1c2UgYWx0aXZlYy4KIAkgKi8KIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQUxUSVZFQykpCi0JCWN1cnJlbnQtPnRocmVhZC52cnNhdmUgPSBtZnNwcihTUFJOX1ZSU0FWRSk7Ci0JZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLnZyc2F2ZSwgKHUzMiBfX3VzZXIgKikmdl9yZWdzWzMzXSk7CisJCXRzay0+dGhyZWFkLmNrdnJzYXZlID0gbWZzcHIoU1BSTl9WUlNBVkUpOworCWVyciB8PSBfX3B1dF91c2VyKHRzay0+dGhyZWFkLmNrdnJzYXZlLCAodTMyIF9fdXNlciAqKSZ2X3JlZ3NbMzNdKTsKIAlpZiAobXNyICYgTVNSX1ZFQykKLQkJZXJyIHw9IF9fcHV0X3VzZXIoY3VycmVudC0+dGhyZWFkLnRyYW5zYWN0X3Zyc2F2ZSwKKwkJZXJyIHw9IF9fcHV0X3VzZXIodHNrLT50aHJlYWQudnJzYXZlLAogCQkJCSAgKHUzMiBfX3VzZXIgKikmdG1fdl9yZWdzWzMzXSk7CiAJZWxzZQotCQllcnIgfD0gX19wdXRfdXNlcihjdXJyZW50LT50aHJlYWQudnJzYXZlLAorCQllcnIgfD0gX19wdXRfdXNlcih0c2stPnRocmVhZC5ja3Zyc2F2ZSwKIAkJCQkgICh1MzIgX191c2VyICopJnRtX3ZfcmVnc1szM10pOwogCiAjZWxzZSAvKiBDT05GSUdfQUxUSVZFQyAqLwpAQCAtMjYyLDExICsyNjYsMTEgQEAKICNlbmRpZiAvKiBDT05GSUdfQUxUSVZFQyAqLwogCiAJLyogY29weSBmcHIgcmVncyBhbmQgZnBzY3IgKi8KLQllcnIgfD0gY29weV9mcHJfdG9fdXNlcigmc2MtPmZwX3JlZ3MsIGN1cnJlbnQpOworCWVyciB8PSBjb3B5X2NrZnByX3RvX3VzZXIoJnNjLT5mcF9yZWdzLCB0c2spOwogCWlmIChtc3IgJiBNU1JfRlApCi0JCWVyciB8PSBjb3B5X3RyYW5zYWN0X2Zwcl90b191c2VyKCZ0bV9zYy0+ZnBfcmVncywgY3VycmVudCk7CisJCWVyciB8PSBjb3B5X2Zwcl90b191c2VyKCZ0bV9zYy0+ZnBfcmVncywgdHNrKTsKIAllbHNlCi0JCWVyciB8PSBjb3B5X2Zwcl90b191c2VyKCZ0bV9zYy0+ZnBfcmVncywgY3VycmVudCk7CisJCWVyciB8PSBjb3B5X2NrZnByX3RvX3VzZXIoJnRtX3NjLT5mcF9yZWdzLCB0c2spOwogCiAjaWZkZWYgQ09ORklHX1ZTWAogCS8qCkBAIC0yNzQsMTcgKzI3OCwxNiBAQAogCSAqIHRoZW4gb3V0IHRvIHVzZXJzcGFjZS4gIFVwZGF0ZSB2X3JlZ3MgdG8gcG9pbnQgYWZ0ZXIgdGhlCiAJICogVk1YIGRhdGEuCiAJICovCi0JaWYgKGN1cnJlbnQtPnRocmVhZC51c2VkX3ZzcikgewotCQlmbHVzaF92c3hfdG9fdGhyZWFkKGN1cnJlbnQpOworCWlmICh0c2stPnRocmVhZC51c2VkX3ZzcikgewogCQl2X3JlZ3MgKz0gRUxGX05WUlJFRzsKIAkJdG1fdl9yZWdzICs9IEVMRl9OVlJSRUc7CiAKLQkJZXJyIHw9IGNvcHlfdnN4X3RvX3VzZXIodl9yZWdzLCBjdXJyZW50KTsKKwkJZXJyIHw9IGNvcHlfY2t2c3hfdG9fdXNlcih2X3JlZ3MsIHRzayk7CiAKIAkJaWYgKG1zciAmIE1TUl9WU1gpCi0JCQllcnIgfD0gY29weV90cmFuc2FjdF92c3hfdG9fdXNlcih0bV92X3JlZ3MsIGN1cnJlbnQpOworCQkJZXJyIHw9IGNvcHlfdnN4X3RvX3VzZXIodG1fdl9yZWdzLCB0c2spOwogCQllbHNlCi0JCQllcnIgfD0gY29weV92c3hfdG9fdXNlcih0bV92X3JlZ3MsIGN1cnJlbnQpOworCQkJZXJyIHw9IGNvcHlfY2t2c3hfdG9fdXNlcih0bV92X3JlZ3MsIHRzayk7CiAKIAkJLyogc2V0IE1TUl9WU1ggaW4gdGhlIE1TUiB2YWx1ZSBpbiB0aGUgZnJhbWUgdG8KIAkJICogaW5kaWNhdGUgdGhhdCBzYy0+dnNfcmVnKSBjb250YWlucyB2YWxpZCBkYXRhLgpAQCAtMjk4LDcgKzMwMSw3IEBACiAJV0FSTl9PTighRlVMTF9SRUdTKHJlZ3MpKTsKIAllcnIgfD0gX19jb3B5X3RvX3VzZXIoJnRtX3NjLT5ncF9yZWdzLCByZWdzLCBHUF9SRUdTX1NJWkUpOwogCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmc2MtPmdwX3JlZ3MsCi0JCQkgICAgICAmY3VycmVudC0+dGhyZWFkLmNrcHRfcmVncywgR1BfUkVHU19TSVpFKTsKKwkJCSAgICAgICZ0c2stPnRocmVhZC5ja3B0X3JlZ3MsIEdQX1JFR1NfU0laRSk7CiAJZXJyIHw9IF9fcHV0X3VzZXIobXNyLCAmdG1fc2MtPmdwX3JlZ3NbUFRfTVNSXSk7CiAJZXJyIHw9IF9fcHV0X3VzZXIobXNyLCAmc2MtPmdwX3JlZ3NbUFRfTVNSXSk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoc2lnbnIsICZzYy0+c2lnbmFsKTsKQEAgLTMxNCw3ICszMTcsNyBAQAogICogUmVzdG9yZSB0aGUgc2lnY29udGV4dCBmcm9tIHRoZSBzaWduYWwgZnJhbWUuCiAgKi8KIAotc3RhdGljIGxvbmcgcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzaWdzZXRfdCAqc2V0LCBpbnQgc2lnLAorc3RhdGljIGxvbmcgcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzaWdzZXRfdCAqc2V0LCBpbnQgc2lnLAogCQkJICAgICAgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYykKIHsKICNpZmRlZiBDT05GSUdfQUxUSVZFQwpAQCAtMzIzLDEwICszMjYsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGVyciA9IDA7CiAJdW5zaWduZWQgbG9uZyBzYXZlX3IxMyA9IDA7CiAJdW5zaWduZWQgbG9uZyBtc3I7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0c2stPnRocmVhZC5yZWdzOwogI2lmZGVmIENPTkZJR19WU1gKIAlpbnQgaTsKICNlbmRpZgogCisJQlVHX09OKHRzayAhPSBjdXJyZW50KTsKKwogCS8qIElmIHRoaXMgaXMgbm90IGEgc2lnbmFsIHJldHVybiwgd2UgcHJlc2VydmUgdGhlIFRMUyBpbiByMTMgKi8KIAlpZiAoIXNpZykKIAkJc2F2ZV9yMTMgPSByZWdzLT5ncHJbMTNdOwpAQCAtMzU2LDcgKzM2Miw3IEBACiAKIAkvKgogCSAqIEZvcmNlIHJlbG9hZCBvZiBGUC9WRUMuCi0JICogVGhpcyBoYXMgdG8gYmUgZG9uZSBiZWZvcmUgY29weWluZyBzdHVmZiBpbnRvIGN1cnJlbnQtPnRocmVhZC5mcHIvdnIKKwkgKiBUaGlzIGhhcyB0byBiZSBkb25lIGJlZm9yZSBjb3B5aW5nIHN0dWZmIGludG8gdHNrLT50aHJlYWQuZnByL3ZyCiAJICogZm9yIHRoZSByZWFzb25zIGV4cGxhaW5lZCBpbiB0aGUgcHJldmlvdXMgY29tbWVudC4KIAkgKi8KIAlyZWdzLT5tc3IgJj0gfihNU1JfRlAgfCBNU1JfRkUwIHwgTVNSX0ZFMSB8IE1TUl9WRUMgfCBNU1JfVlNYKTsKQEAgLTM2OCwyMSArMzc0LDIzIEBACiAJaWYgKHZfcmVncyAmJiAhYWNjZXNzX29rKFZFUklGWV9SRUFELCB2X3JlZ3MsIDM0ICogc2l6ZW9mKHZlY3RvcjEyOCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAkvKiBDb3B5IDMzIHZlYyByZWdpc3RlcnMgKHZyMC4uMzEgYW5kIHZzY3IpIGZyb20gdGhlIHN0YWNrICovCi0JaWYgKHZfcmVncyAhPSBOVUxMICYmIChtc3IgJiBNU1JfVkVDKSAhPSAwKQotCQllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigmY3VycmVudC0+dGhyZWFkLnZyX3N0YXRlLCB2X3JlZ3MsCisJaWYgKHZfcmVncyAhPSBOVUxMICYmIChtc3IgJiBNU1JfVkVDKSAhPSAwKSB7CisJCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKCZ0c2stPnRocmVhZC52cl9zdGF0ZSwgdl9yZWdzLAogCQkJCQkzMyAqIHNpemVvZih2ZWN0b3IxMjgpKTsKLQllbHNlIGlmIChjdXJyZW50LT50aHJlYWQudXNlZF92cikKLQkJbWVtc2V0KCZjdXJyZW50LT50aHJlYWQudnJfc3RhdGUsIDAsIDMzICogc2l6ZW9mKHZlY3RvcjEyOCkpOworCQl0c2stPnRocmVhZC51c2VkX3ZyID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKHRzay0+dGhyZWFkLnVzZWRfdnIpIHsKKwkJbWVtc2V0KCZ0c2stPnRocmVhZC52cl9zdGF0ZSwgMCwgMzMgKiBzaXplb2YodmVjdG9yMTI4KSk7CisJfQogCS8qIEFsd2F5cyBnZXQgVlJTQVZFIGJhY2sgKi8KIAlpZiAodl9yZWdzICE9IE5VTEwpCi0JCWVyciB8PSBfX2dldF91c2VyKGN1cnJlbnQtPnRocmVhZC52cnNhdmUsICh1MzIgX191c2VyICopJnZfcmVnc1szM10pOworCQllcnIgfD0gX19nZXRfdXNlcih0c2stPnRocmVhZC52cnNhdmUsICh1MzIgX191c2VyICopJnZfcmVnc1szM10pOwogCWVsc2UKLQkJY3VycmVudC0+dGhyZWFkLnZyc2F2ZSA9IDA7CisJCXRzay0+dGhyZWFkLnZyc2F2ZSA9IDA7CiAJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FMVElWRUMpKQotCQltdHNwcihTUFJOX1ZSU0FWRSwgY3VycmVudC0+dGhyZWFkLnZyc2F2ZSk7CisJCW10c3ByKFNQUk5fVlJTQVZFLCB0c2stPnRocmVhZC52cnNhdmUpOwogI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCiAJLyogcmVzdG9yZSBmbG9hdGluZyBwb2ludCAqLwotCWVyciB8PSBjb3B5X2Zwcl9mcm9tX3VzZXIoY3VycmVudCwgJnNjLT5mcF9yZWdzKTsKKwllcnIgfD0gY29weV9mcHJfZnJvbV91c2VyKHRzaywgJnNjLT5mcF9yZWdzKTsKICNpZmRlZiBDT05GSUdfVlNYCiAJLyoKIAkgKiBHZXQgYWRkaXRpb25hbCBWU1ggZGF0YS4gVXBkYXRlIHZfcmVncyB0byBwb2ludCBhZnRlciB0aGUKQEAgLTM5MCwxMSArMzk4LDEzIEBACiAJICogYnVmZmVyIGZvciBmb3JtYXR0aW5nLCB0aGVuIGludG8gdGhlIHRhc2tzdHJ1Y3QuCiAJICovCiAJdl9yZWdzICs9IEVMRl9OVlJSRUc7Ci0JaWYgKChtc3IgJiBNU1JfVlNYKSAhPSAwKQotCQllcnIgfD0gY29weV92c3hfZnJvbV91c2VyKGN1cnJlbnQsIHZfcmVncyk7Ci0JZWxzZQorCWlmICgobXNyICYgTVNSX1ZTWCkgIT0gMCkgeworCQllcnIgfD0gY29weV92c3hfZnJvbV91c2VyKHRzaywgdl9yZWdzKTsKKwkJdHNrLT50aHJlYWQudXNlZF92c3IgPSB0cnVlOworCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCAzMiA7IGkrKykKLQkJCWN1cnJlbnQtPnRocmVhZC5mcF9zdGF0ZS5mcHJbaV1bVFNfVlNSTE9XT0ZGU0VUXSA9IDA7CisJCQl0c2stPnRocmVhZC5mcF9zdGF0ZS5mcHJbaV1bVFNfVlNSTE9XT0ZGU0VUXSA9IDA7CisJfQogI2VuZGlmCiAJcmV0dXJuIGVycjsKIH0KQEAgLTQwNCw3ICs0MTQsNyBAQAogICogUmVzdG9yZSB0aGUgdHdvIHNpZ2NvbnRleHRzIGZyb20gdGhlIGZyYW1lIG9mIGEgdHJhbnNhY3Rpb25hbCBwcm9jZXNzZXMuCiAgKi8KIAotc3RhdGljIGxvbmcgcmVzdG9yZV90bV9zaWdjb250ZXh0cyhzdHJ1Y3QgcHRfcmVncyAqcmVncywKK3N0YXRpYyBsb25nIHJlc3RvcmVfdG1fc2lnY29udGV4dHMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkJICAgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywKIAkJCQkgICBzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnRtX3NjKQogewpAQCAtNDEzLDEyICs0MjMsMTYgQEAKICNlbmRpZgogCXVuc2lnbmVkIGxvbmcgZXJyID0gMDsKIAl1bnNpZ25lZCBsb25nIG1zcjsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IHRzay0+dGhyZWFkLnJlZ3M7CiAjaWZkZWYgQ09ORklHX1ZTWAogCWludCBpOwogI2VuZGlmCisKKwlCVUdfT04odHNrICE9IGN1cnJlbnQpOworCiAJLyogY29weSB0aGUgR1BScyAqLwogCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKHJlZ3MtPmdwciwgdG1fc2MtPmdwX3JlZ3MsIHNpemVvZihyZWdzLT5ncHIpKTsKLQllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigmY3VycmVudC0+dGhyZWFkLmNrcHRfcmVncywgc2MtPmdwX3JlZ3MsCisJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJnRzay0+dGhyZWFkLmNrcHRfcmVncywgc2MtPmdwX3JlZ3MsCiAJCQkJc2l6ZW9mKHJlZ3MtPmdwcikpOwogCiAJLyoKQEAgLTQzMCw3ICs0NDQsNyBAQAogCSAqIHdlIGRvbid0IG5lZWQgdG8gcmUtY29weSB0aGVtIGhlcmUuCiAJICovCiAJZXJyIHw9IF9fZ2V0X3VzZXIocmVncy0+bmlwLCAmdG1fc2MtPmdwX3JlZ3NbUFRfTklQXSk7Ci0JZXJyIHw9IF9fZ2V0X3VzZXIoY3VycmVudC0+dGhyZWFkLnRtX3RmaGFyLCAmc2MtPmdwX3JlZ3NbUFRfTklQXSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIodHNrLT50aHJlYWQudG1fdGZoYXIsICZzYy0+Z3BfcmVnc1tQVF9OSVBdKTsKIAogCS8qIGdldCBNU1Igc2VwYXJhdGVseSwgdHJhbnNmZXIgdGhlIExFIGJpdCBpZiBkb2luZyBzaWduYWwgcmV0dXJuICovCiAJZXJyIHw9IF9fZ2V0X3VzZXIobXNyLCAmc2MtPmdwX3JlZ3NbUFRfTVNSXSk7CkBAIC00NDksMTMgKzQ2MywxMyBAQAogCWVyciB8PSBfX2dldF91c2VyKHJlZ3MtPmxpbmssICZ0bV9zYy0+Z3BfcmVnc1tQVF9MTktdKTsKIAllcnIgfD0gX19nZXRfdXNlcihyZWdzLT54ZXIsICZ0bV9zYy0+Z3BfcmVnc1tQVF9YRVJdKTsKIAllcnIgfD0gX19nZXRfdXNlcihyZWdzLT5jY3IsICZ0bV9zYy0+Z3BfcmVnc1tQVF9DQ1JdKTsKLQllcnIgfD0gX19nZXRfdXNlcihjdXJyZW50LT50aHJlYWQuY2twdF9yZWdzLmN0ciwKKwllcnIgfD0gX19nZXRfdXNlcih0c2stPnRocmVhZC5ja3B0X3JlZ3MuY3RyLAogCQkJICAmc2MtPmdwX3JlZ3NbUFRfQ1RSXSk7Ci0JZXJyIHw9IF9fZ2V0X3VzZXIoY3VycmVudC0+dGhyZWFkLmNrcHRfcmVncy5saW5rLAorCWVyciB8PSBfX2dldF91c2VyKHRzay0+dGhyZWFkLmNrcHRfcmVncy5saW5rLAogCQkJICAmc2MtPmdwX3JlZ3NbUFRfTE5LXSk7Ci0JZXJyIHw9IF9fZ2V0X3VzZXIoY3VycmVudC0+dGhyZWFkLmNrcHRfcmVncy54ZXIsCisJZXJyIHw9IF9fZ2V0X3VzZXIodHNrLT50aHJlYWQuY2twdF9yZWdzLnhlciwKIAkJCSAgJnNjLT5ncF9yZWdzW1BUX1hFUl0pOwotCWVyciB8PSBfX2dldF91c2VyKGN1cnJlbnQtPnRocmVhZC5ja3B0X3JlZ3MuY2NyLAorCWVyciB8PSBfX2dldF91c2VyKHRzay0+dGhyZWFkLmNrcHRfcmVncy5jY3IsCiAJCQkgICZzYy0+Z3BfcmVnc1tQVF9DQ1JdKTsKIAogCS8qIFRoZXNlIHJlZ3MgYXJlIG5vdCBjaGVja3BvaW50ZWQ7IHRoZXkgY2FuIGdvIGluICdyZWdzJy4gKi8KQEAgLTQ2Niw3ICs0ODAsNyBAQAogCiAJLyoKIAkgKiBGb3JjZSByZWxvYWQgb2YgRlAvVkVDLgotCSAqIFRoaXMgaGFzIHRvIGJlIGRvbmUgYmVmb3JlIGNvcHlpbmcgc3R1ZmYgaW50byBjdXJyZW50LT50aHJlYWQuZnByL3ZyCisJICogVGhpcyBoYXMgdG8gYmUgZG9uZSBiZWZvcmUgY29weWluZyBzdHVmZiBpbnRvIHRzay0+dGhyZWFkLmZwci92cgogCSAqIGZvciB0aGUgcmVhc29ucyBleHBsYWluZWQgaW4gdGhlIHByZXZpb3VzIGNvbW1lbnQuCiAJICovCiAJcmVncy0+bXNyICY9IH4oTVNSX0ZQIHwgTVNSX0ZFMCB8IE1TUl9GRTEgfCBNU1JfVkVDIHwgTVNSX1ZTWCk7CkBAIC00ODMsMzIgKzQ5NywzMyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAkvKiBDb3B5IDMzIHZlYyByZWdpc3RlcnMgKHZyMC4uMzEgYW5kIHZzY3IpIGZyb20gdGhlIHN0YWNrICovCiAJaWYgKHZfcmVncyAhPSBOVUxMICYmIHRtX3ZfcmVncyAhPSBOVUxMICYmIChtc3IgJiBNU1JfVkVDKSAhPSAwKSB7Ci0JCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKCZjdXJyZW50LT50aHJlYWQudnJfc3RhdGUsIHZfcmVncywKKwkJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJnRzay0+dGhyZWFkLmNrdnJfc3RhdGUsIHZfcmVncywKIAkJCQkJMzMgKiBzaXplb2YodmVjdG9yMTI4KSk7Ci0JCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKCZjdXJyZW50LT50aHJlYWQudHJhbnNhY3RfdnIsIHRtX3ZfcmVncywKKwkJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJnRzay0+dGhyZWFkLnZyX3N0YXRlLCB0bV92X3JlZ3MsCiAJCQkJCTMzICogc2l6ZW9mKHZlY3RvcjEyOCkpOworCQljdXJyZW50LT50aHJlYWQudXNlZF92ciA9IHRydWU7CiAJfQotCWVsc2UgaWYgKGN1cnJlbnQtPnRocmVhZC51c2VkX3ZyKSB7Ci0JCW1lbXNldCgmY3VycmVudC0+dGhyZWFkLnZyX3N0YXRlLCAwLCAzMyAqIHNpemVvZih2ZWN0b3IxMjgpKTsKLQkJbWVtc2V0KCZjdXJyZW50LT50aHJlYWQudHJhbnNhY3RfdnIsIDAsIDMzICogc2l6ZW9mKHZlY3RvcjEyOCkpOworCWVsc2UgaWYgKHRzay0+dGhyZWFkLnVzZWRfdnIpIHsKKwkJbWVtc2V0KCZ0c2stPnRocmVhZC52cl9zdGF0ZSwgMCwgMzMgKiBzaXplb2YodmVjdG9yMTI4KSk7CisJCW1lbXNldCgmdHNrLT50aHJlYWQuY2t2cl9zdGF0ZSwgMCwgMzMgKiBzaXplb2YodmVjdG9yMTI4KSk7CiAJfQogCS8qIEFsd2F5cyBnZXQgVlJTQVZFIGJhY2sgKi8KIAlpZiAodl9yZWdzICE9IE5VTEwgJiYgdG1fdl9yZWdzICE9IE5VTEwpIHsKLQkJZXJyIHw9IF9fZ2V0X3VzZXIoY3VycmVudC0+dGhyZWFkLnZyc2F2ZSwKKwkJZXJyIHw9IF9fZ2V0X3VzZXIodHNrLT50aHJlYWQuY2t2cnNhdmUsCiAJCQkJICAodTMyIF9fdXNlciAqKSZ2X3JlZ3NbMzNdKTsKLQkJZXJyIHw9IF9fZ2V0X3VzZXIoY3VycmVudC0+dGhyZWFkLnRyYW5zYWN0X3Zyc2F2ZSwKKwkJZXJyIHw9IF9fZ2V0X3VzZXIodHNrLT50aHJlYWQudnJzYXZlLAogCQkJCSAgKHUzMiBfX3VzZXIgKikmdG1fdl9yZWdzWzMzXSk7CiAJfQogCWVsc2UgewotCQljdXJyZW50LT50aHJlYWQudnJzYXZlID0gMDsKLQkJY3VycmVudC0+dGhyZWFkLnRyYW5zYWN0X3Zyc2F2ZSA9IDA7CisJCXRzay0+dGhyZWFkLnZyc2F2ZSA9IDA7CisJCXRzay0+dGhyZWFkLmNrdnJzYXZlID0gMDsKIAl9CiAJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FMVElWRUMpKQotCQltdHNwcihTUFJOX1ZSU0FWRSwgY3VycmVudC0+dGhyZWFkLnZyc2F2ZSk7CisJCW10c3ByKFNQUk5fVlJTQVZFLCB0c2stPnRocmVhZC52cnNhdmUpOwogI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCiAJLyogcmVzdG9yZSBmbG9hdGluZyBwb2ludCAqLwotCWVyciB8PSBjb3B5X2Zwcl9mcm9tX3VzZXIoY3VycmVudCwgJnNjLT5mcF9yZWdzKTsKLQllcnIgfD0gY29weV90cmFuc2FjdF9mcHJfZnJvbV91c2VyKGN1cnJlbnQsICZ0bV9zYy0+ZnBfcmVncyk7CisJZXJyIHw9IGNvcHlfZnByX2Zyb21fdXNlcih0c2ssICZ0bV9zYy0+ZnBfcmVncyk7CisJZXJyIHw9IGNvcHlfY2tmcHJfZnJvbV91c2VyKHRzaywgJnNjLT5mcF9yZWdzKTsKICNpZmRlZiBDT05GSUdfVlNYCiAJLyoKIAkgKiBHZXQgYWRkaXRpb25hbCBWU1ggZGF0YS4gVXBkYXRlIHZfcmVncyB0byBwb2ludCBhZnRlciB0aGUKQEAgLTUxOCwzMiArNTMzLDMxIEBACiAJaWYgKHZfcmVncyAmJiAoKG1zciAmIE1TUl9WU1gpICE9IDApKSB7CiAJCXZfcmVncyArPSBFTEZfTlZSUkVHOwogCQl0bV92X3JlZ3MgKz0gRUxGX05WUlJFRzsKLQkJZXJyIHw9IGNvcHlfdnN4X2Zyb21fdXNlcihjdXJyZW50LCB2X3JlZ3MpOwotCQllcnIgfD0gY29weV90cmFuc2FjdF92c3hfZnJvbV91c2VyKGN1cnJlbnQsIHRtX3ZfcmVncyk7CisJCWVyciB8PSBjb3B5X3ZzeF9mcm9tX3VzZXIodHNrLCB0bV92X3JlZ3MpOworCQllcnIgfD0gY29weV9ja3ZzeF9mcm9tX3VzZXIodHNrLCB2X3JlZ3MpOworCQl0c2stPnRocmVhZC51c2VkX3ZzciA9IHRydWU7CiAJfSBlbHNlIHsKIAkJZm9yIChpID0gMDsgaSA8IDMyIDsgaSsrKSB7Ci0JCQljdXJyZW50LT50aHJlYWQuZnBfc3RhdGUuZnByW2ldW1RTX1ZTUkxPV09GRlNFVF0gPSAwOwotCQkJY3VycmVudC0+dGhyZWFkLnRyYW5zYWN0X2ZwLmZwcltpXVtUU19WU1JMT1dPRkZTRVRdID0gMDsKKwkJCXRzay0+dGhyZWFkLmZwX3N0YXRlLmZwcltpXVtUU19WU1JMT1dPRkZTRVRdID0gMDsKKwkJCXRzay0+dGhyZWFkLmNrZnBfc3RhdGUuZnByW2ldW1RTX1ZTUkxPV09GRlNFVF0gPSAwOwogCQl9CiAJfQogI2VuZGlmCiAJdG1fZW5hYmxlKCk7CiAJLyogTWFrZSBzdXJlIHRoZSB0cmFuc2FjdGlvbiBpcyBtYXJrZWQgYXMgZmFpbGVkICovCi0JY3VycmVudC0+dGhyZWFkLnRtX3RleGFzciB8PSBURVhBU1JfRlM7CisJdHNrLT50aHJlYWQudG1fdGV4YXNyIHw9IFRFWEFTUl9GUzsKIAkvKiBUaGlzIGxvYWRzIHRoZSBjaGVja3BvaW50ZWQgRlAvVkVDIHN0YXRlLCBpZiB1c2VkICovCi0JdG1fcmVjaGVja3BvaW50KCZjdXJyZW50LT50aHJlYWQsIG1zcik7CisJdG1fcmVjaGVja3BvaW50KCZ0c2stPnRocmVhZCwgbXNyKTsKIAotCS8qIFRoaXMgbG9hZHMgdGhlIHNwZWN1bGF0aXZlIEZQL1ZFQyBzdGF0ZSwgaWYgdXNlZCAqLworCW1zcl9jaGVja19hbmRfc2V0KG1zciAmIChNU1JfRlAgfCBNU1JfVkVDKSk7CiAJaWYgKG1zciAmIE1TUl9GUCkgewotCQlkb19sb2FkX3VwX3RyYW5zYWN0X2ZwdSgmY3VycmVudC0+dGhyZWFkKTsKLQkJcmVncy0+bXNyIHw9IChNU1JfRlAgfCBjdXJyZW50LT50aHJlYWQuZnBleGNfbW9kZSk7CisJCWxvYWRfZnBfc3RhdGUoJnRzay0+dGhyZWFkLmZwX3N0YXRlKTsKKwkJcmVncy0+bXNyIHw9IChNU1JfRlAgfCB0c2stPnRocmVhZC5mcGV4Y19tb2RlKTsKIAl9Ci0jaWZkZWYgQ09ORklHX0FMVElWRUMKIAlpZiAobXNyICYgTVNSX1ZFQykgewotCQlkb19sb2FkX3VwX3RyYW5zYWN0X2FsdGl2ZWMoJmN1cnJlbnQtPnRocmVhZCk7CisJCWxvYWRfdnJfc3RhdGUoJnRzay0+dGhyZWFkLnZyX3N0YXRlKTsKIAkJcmVncy0+bXNyIHw9IE1TUl9WRUM7CiAJfQotI2VuZGlmCiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTk0LDYgKzYwOCw4IEBACiAJdW5zaWduZWQgbG9uZyBuZXdfbXNyID0gMDsKIAlpbnQgY3R4X2hhc192c3hfcmVnaW9uID0gMDsKIAorCUJVR19PTihyZWdzICE9IGN1cnJlbnQtPnRocmVhZC5yZWdzKTsKKwogCWlmIChuZXdfY3R4ICYmCiAJICAgIGdldF91c2VyKG5ld19tc3IsICZuZXdfY3R4LT51Y19tY29udGV4dC5ncF9yZWdzW1BUX01TUl0pKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTYxNiw3ICs2MzIsNyBAQAogCiAJaWYgKG9sZF9jdHggIT0gTlVMTCkgewogCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIG9sZF9jdHgsIGN0eF9zaXplKQotCQkgICAgfHwgc2V0dXBfc2lnY29udGV4dCgmb2xkX2N0eC0+dWNfbWNvbnRleHQsIHJlZ3MsIDAsIE5VTEwsIDAsCisJCSAgICB8fCBzZXR1cF9zaWdjb250ZXh0KCZvbGRfY3R4LT51Y19tY29udGV4dCwgY3VycmVudCwgMCwgTlVMTCwgMCwKIAkJCQkJY3R4X2hhc192c3hfcmVnaW9uKQogCQkgICAgfHwgX19jb3B5X3RvX3VzZXIoJm9sZF9jdHgtPnVjX3NpZ21hc2ssCiAJCQkJICAgICAgJmN1cnJlbnQtPmJsb2NrZWQsIHNpemVvZihzaWdzZXRfdCkpKQpAQCAtNjQ0LDcgKzY2MCw3IEBACiAJaWYgKF9fY29weV9mcm9tX3VzZXIoJnNldCwgJm5ld19jdHgtPnVjX3NpZ21hc2ssIHNpemVvZihzZXQpKSkKIAkJZG9fZXhpdChTSUdTRUdWKTsKIAlzZXRfY3VycmVudF9ibG9ja2VkKCZzZXQpOwotCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQocmVncywgTlVMTCwgMCwgJm5ld19jdHgtPnVjX21jb250ZXh0KSkKKwlpZiAocmVzdG9yZV9zaWdjb250ZXh0KGN1cnJlbnQsIE5VTEwsIDAsICZuZXdfY3R4LT51Y19tY29udGV4dCkpCiAJCWRvX2V4aXQoU0lHU0VHVik7CiAKIAkvKiBUaGlzIHJldHVybnMgbGlrZSBydF9zaWdyZXR1cm4gKi8KQEAgLTY2Nyw2ICs2ODMsOCBAQAogCXVuc2lnbmVkIGxvbmcgbXNyOwogI2VuZGlmCiAKKwlCVUdfT04oY3VycmVudC0+dGhyZWFkLnJlZ3MgIT0gcmVncyk7CisKIAkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KIAljdXJyZW50LT5yZXN0YXJ0X2Jsb2NrLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOwogCkBAIC02NzYsNyArNjk0LDIxIEBACiAJaWYgKF9fY29weV9mcm9tX3VzZXIoJnNldCwgJnVjLT51Y19zaWdtYXNrLCBzaXplb2Yoc2V0KSkpCiAJCWdvdG8gYmFkZnJhbWU7CiAJc2V0X2N1cnJlbnRfYmxvY2tlZCgmc2V0KTsKKwogI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgdHJhbnNhY3Rpb25hbCBzdGF0ZSB0aGVuIHRocm93IGl0IGF3YXkuCisJICogVGhlIHB1cnBvc2Ugb2YgYSBzaWdyZXR1cm4gaXMgdG8gZGVzdHJveSBhbGwgdHJhY2VzIG9mIHRoZQorCSAqIHNpZ25hbCBmcmFtZSwgdGhpcyBpbmNsdWRlcyBhbnkgdHJhbnNhY3Rpb25hbCBzdGF0ZSBjcmVhdGVkCisJICogd2l0aGluIGluLiBXZSBvbmx5IGNoZWNrIGZvciBzdXNwZW5kZWQgYXMgd2UgY2FuIG5ldmVyIGJlCisJICogYWN0aXZlIGluIHRoZSBrZXJuZWwsIHdlIGFyZSBhY3RpdmUsIHRoZXJlIGlzIG5vdGhpbmcgYmV0dGVyIHRvCisJICogZG8gdGhhbiBnbyBhaGVhZCBhbmQgQmFkIFRoaW5nIGxhdGVyLgorCSAqIFRoZSBjYXVzZSBpcyBub3QgaW1wb3J0YW50IGFzIHRoZXJlIHdpbGwgbmV2ZXIgYmUgYQorCSAqIHJlY2hlY2twb2ludCBzbyBpdCdzIG5vdCB1c2VyIHZpc2libGUuCisJICovCisJaWYgKE1TUl9UTV9TVVNQRU5ERUQobWZtc3IoKSkpCisJCXRtX3JlY2xhaW1fY3VycmVudCgwKTsKKwogCWlmIChfX2dldF91c2VyKG1zciwgJnVjLT51Y19tY29udGV4dC5ncF9yZWdzW1BUX01TUl0pKQogCQlnb3RvIGJhZGZyYW1lOwogCWlmIChNU1JfVE1fQUNUSVZFKG1zcikpIHsKQEAgLTY4NCwxNCArNzE2LDE0IEBACiAJCXN0cnVjdCB1Y29udGV4dCBfX3VzZXIgKnVjX3RyYW5zYWN0OwogCQlpZiAoX19nZXRfdXNlcih1Y190cmFuc2FjdCwgJnVjLT51Y19saW5rKSkKIAkJCWdvdG8gYmFkZnJhbWU7Ci0JCWlmIChyZXN0b3JlX3RtX3NpZ2NvbnRleHRzKHJlZ3MsICZ1Yy0+dWNfbWNvbnRleHQsCisJCWlmIChyZXN0b3JlX3RtX3NpZ2NvbnRleHRzKGN1cnJlbnQsICZ1Yy0+dWNfbWNvbnRleHQsCiAJCQkJCSAgICZ1Y190cmFuc2FjdC0+dWNfbWNvbnRleHQpKQogCQkJZ290byBiYWRmcmFtZTsKIAl9CiAJZWxzZQogCS8qIEZhbGwgdGhyb3VnaCwgZm9yIG5vbi1UTSByZXN0b3JlICovCiAjZW5kaWYKLQlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsIE5VTEwsIDEsICZ1Yy0+dWNfbWNvbnRleHQpKQorCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQoY3VycmVudCwgTlVMTCwgMSwgJnVjLT51Y19tY29udGV4dCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKIAlpZiAocmVzdG9yZV9hbHRzdGFjaygmdWMtPnVjX3N0YWNrKSkKQEAgLTcxMCwxMyArNzQyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBoYW5kbGVfcnRfc2lnbmFsNjQoc3RydWN0IGtzaWduYWwgKmtzaWcsIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoraW50IGhhbmRsZV9ydF9zaWduYWw2NChzdHJ1Y3Qga3NpZ25hbCAqa3NpZywgc2lnc2V0X3QgKnNldCwKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CiAJdW5zaWduZWQgbG9uZyBuZXdzcCA9IDA7CiAJbG9uZyBlcnIgPSAwOworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdHNrLT50aHJlYWQucmVnczsKIAotCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGtzaWcsIGdldF90bV9zdGFja3BvaW50ZXIocmVncyksIHNpemVvZigqZnJhbWUpLCAwKTsKKwlCVUdfT04odHNrICE9IGN1cnJlbnQpOworCisJZnJhbWUgPSBnZXRfc2lnZnJhbWUoa3NpZywgZ2V0X3RtX3N0YWNrcG9pbnRlcih0c2spLCBzaXplb2YoKmZyYW1lKSwgMCk7CiAJaWYgKHVubGlrZWx5KGZyYW1lID09IE5VTEwpKQogCQlnb3RvIGJhZGZyYW1lOwogCkBAIC03MzcsMTQgKzc3MywxMyBAQAogCQllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPnVjX3RyYW5zYWN0LCAmZnJhbWUtPnVjLnVjX2xpbmspOwogCQllcnIgfD0gc2V0dXBfdG1fc2lnY29udGV4dHMoJmZyYW1lLT51Yy51Y19tY29udGV4dCwKIAkJCQkJICAgICZmcmFtZS0+dWNfdHJhbnNhY3QudWNfbWNvbnRleHQsCi0JCQkJCSAgICByZWdzLCBrc2lnLT5zaWcsCi0JCQkJCSAgICBOVUxMLAorCQkJCQkgICAgdHNrLCBrc2lnLT5zaWcsIE5VTEwsCiAJCQkJCSAgICAodW5zaWduZWQgbG9uZylrc2lnLT5rYS5zYS5zYV9oYW5kbGVyKTsKIAl9IGVsc2UKICNlbmRpZgogCXsKIAkJZXJyIHw9IF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19saW5rKTsKLQkJZXJyIHw9IHNldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT51Yy51Y19tY29udGV4dCwgcmVncywga3NpZy0+c2lnLAorCQllcnIgfD0gc2V0dXBfc2lnY29udGV4dCgmZnJhbWUtPnVjLnVjX21jb250ZXh0LCB0c2ssIGtzaWctPnNpZywKIAkJCQkJTlVMTCwgKHVuc2lnbmVkIGxvbmcpa3NpZy0+a2Euc2Euc2FfaGFuZGxlciwKIAkJCQkJMSk7CiAJfQpAQCAtNzUzLDExICs3ODgsMTEgQEAKIAkJZ290byBiYWRmcmFtZTsKIAogCS8qIE1ha2Ugc3VyZSBzaWduYWwgaGFuZGxlciBkb2Vzbid0IGdldCBzcHVyaW91cyBGUCBleGNlcHRpb25zICovCi0JY3VycmVudC0+dGhyZWFkLmZwX3N0YXRlLmZwc2NyID0gMDsKKwl0c2stPnRocmVhZC5mcF9zdGF0ZS5mcHNjciA9IDA7CiAKIAkvKiBTZXQgdXAgdG8gcmV0dXJuIGZyb20gdXNlcnNwYWNlLiAqLwotCWlmICh2ZHNvNjRfcnRfc2lndHJhbXAgJiYgY3VycmVudC0+bW0tPmNvbnRleHQudmRzb19iYXNlKSB7Ci0JCXJlZ3MtPmxpbmsgPSBjdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgKyB2ZHNvNjRfcnRfc2lndHJhbXA7CisJaWYgKHZkc282NF9ydF9zaWd0cmFtcCAmJiB0c2stPm1tLT5jb250ZXh0LnZkc29fYmFzZSkgeworCQlyZWdzLT5saW5rID0gdHNrLT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgKyB2ZHNvNjRfcnRfc2lndHJhbXA7CiAJfSBlbHNlIHsKIAkJZXJyIHw9IHNldHVwX3RyYW1wb2xpbmUoX19OUl9ydF9zaWdyZXR1cm4sICZmcmFtZS0+dHJhbXBbMF0pOwogCQlpZiAoZXJyKQpAQCAtODA3LDcgKzg0Miw3IEBACiBiYWRmcmFtZToKIAlpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscykKIAkJcHJpbnRrX3JhdGVsaW1pdGVkKHJlZ3MtPm1zciAmIE1TUl82NEJJVCA/IGZtdDY0IDogZm10MzIsCi0JCQkJICAgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCAic2V0dXBfcnRfZnJhbWUiLAorCQkJCSAgIHRzay0+Y29tbSwgdHNrLT5waWQsICJzZXR1cF9ydF9mcmFtZSIsCiAJCQkJICAgKGxvbmcpZnJhbWUsIHJlZ3MtPm5pcCwgcmVncy0+bGluayk7CiAKIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCmluZGV4IDI1YTM5MDUuLjljNmYzZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYwpAQCAtODMwLDcgKzgzMCw3IEBACiAKIAkvKiBVcGRhdGUgc2libGluZyBtYXBzICovCiAJYmFzZSA9IGNwdV9maXJzdF90aHJlYWRfc2libGluZyhjcHUpOwotCWZvciAoaSA9IDA7IGkgPCB0aHJlYWRzX3Blcl9jb3JlOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgdGhyZWFkc19wZXJfY29yZSAmJiBiYXNlICsgaSA8IG5yX2NwdV9pZHM7IGkrKykgewogCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNwdV9zaWJsaW5nX21hc2soYmFzZSArIGkpKTsKIAkJY3B1bWFza19jbGVhcl9jcHUoYmFzZSArIGksIGNwdV9zaWJsaW5nX21hc2soY3B1KSk7CiAJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgY3B1X2NvcmVfbWFzayhiYXNlICsgaSkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNjYWxscy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNjYWxscy5jCmluZGV4IDVmYTkyNzAuLjY0NGNjZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzY2FsbHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2NhbGxzLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vYXNtLXByb3RvdHlwZXMuaD4KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRvX21tYXAyKHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGxlbiwKIAkJCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKaW5kZXggM2VmYmVkZS4uNjc4NTliNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKQEAgLTczLDYgKzczLDcgQEAKICNpbmNsdWRlIDxhc20vdmRzb19kYXRhcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9jcHV0aW1lLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1wcm90b3R5cGVzLmg+CiAKIC8qIHBvd2VycGMgY2xvY2tzb3VyY2UvY2xvY2tldmVudCBjb2RlICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdG0uUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdG0uUwppbmRleCAyOThhZmNmLi4zYTJkMDQxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RtLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90bS5TCkBAIC0xMDgsNiArMTA4LDcgQEAKIAkvKiBXZSd2ZSBhIHN0cnVjdCBwdF9yZWdzIGF0IFtyMStTVEFDS19GUkFNRV9PVkVSSEVBRF0uICovCiAKIAlzdGQJcjMsIFNUS19QQVJBTShSMykocjEpCisJc3RkCXI0LCBTVEtfUEFSQU0oUjQpKHIxKQogCVNBVkVfTlZHUFJTKHIxKQogCiAJLyogV2UgbmVlZCB0byBzZXR1cCBNU1IgZm9yIFZTWCByZWdpc3RlciBzYXZlIGluc3RydWN0aW9ucy4gKi8KQEAgLTEyNiw0MyArMTI3LDYgQEAKIAltdG1zcmQJcjE1CiAJc3RkCXIxNCwgVE1fRlJBTUVfTDAocjEpCiAKLQkvKiBTdGFzaCB0aGUgc3RhY2sgcG9pbnRlciBhd2F5IGZvciB1c2UgYWZ0ZXIgcmVjbGFpbSAqLwotCXN0ZAlyMSwgUEFDQVIxKHIxMykKLQotCS8qICoqKioqKioqKioqKioqKioqKioqIEZQUi9WUi9WU1JzICoqKioqKioqKioqKgotCSAqIEJlZm9yZSByZWNsYWltaW5nLCBjYXB0dXJlIHRoZSBjdXJyZW50L3RyYW5zYWN0aW9uYWwgRlBSL1ZSCi0JKiB2ZXJzaW9ucyAvaWYgdXNlZC8uCi0JICoKLQkgKiAoSWYgVlNYIHVzZWQsIEZQIGFuZCBWTVggYXJlIGltcGxpZWQuICBPciwgd2UgZG9uJ3QgbmVlZCB0byBsb29rCi0JICogYXQgTVNSLlZTWCBhcyBjb3B5aW5nIEZQIHJlZ3MgaWYgLkZQLCB2ZWN0b3IgcmVncyBpZiAuVk1YIGNvdmVycyBpdC4pCi0JICoKLQkgKiBXZSdyZSBwYXNzZWQgdGhlIHRocmVhZCdzIE1TUiBhcyBwYXJhbWV0ZXIgMi4KLQkgKgotCSAqIFdlIGVuYWJsZWQgVkVDL0ZQL1ZTWCBpbiB0aGUgbXNyIGFib3ZlLCBzbyB3ZSBjYW4gZXhlY3V0ZSB0aGVzZQotCSAqIGluc3RydWN0aW9ucyEKLQkgKi8KLQlhbmRpcy4JCXIwLCByNCwgTVNSX1ZFQ0BoCi0JYmVxCWRvbnRfYmFja3VwX3ZlYwotCi0JYWRkaQlyNywgcjMsIFRIUkVBRF9UUkFOU0FDVF9WUlNUQVRFCi0JU0FWRV8zMlZSUygwLCByNiwgcjcpCS8qIHI2IHNjcmF0Y2gsIHI3IHRyYW5zYWN0IHZyIHN0YXRlICovCi0JbWZ2c2NyCXYwCi0JbGkJcjYsIFZSU1RBVEVfVlNDUgotCXN0dngJdjAsIHI3LCByNgotZG9udF9iYWNrdXBfdmVjOgotCW1mc3ByCXIwLCBTUFJOX1ZSU0FWRQotCXN0ZAlyMCwgVEhSRUFEX1RSQU5TQUNUX1ZSU0FWRShyMykKLQotCWFuZGkuCXIwLCByNCwgTVNSX0ZQCi0JYmVxCWRvbnRfYmFja3VwX2ZwCi0KLQlhZGRpCXI3LCByMywgVEhSRUFEX1RSQU5TQUNUX0ZQU1RBVEUKLQlTQVZFXzMyRlBSU19WU1JTKDAsIFI2LCBSNykJLyogcjYgc2NyYXRjaCwgcjcgdHJhbnNhY3QgZnAgc3RhdGUgKi8KLQotCW1mZnMgICAgZnIwCi0Jc3RmZCAgICBmcjAsRlBTVEFURV9GUFNDUihyNykKLQotZG9udF9iYWNrdXBfZnA6CiAJLyogRG8gc2FuaXR5IGNoZWNrIG9uIE1TUiB0byBtYWtlIHN1cmUgd2UgYXJlIHN1c3BlbmRlZCAqLwogCWxpCXI3LCAoTVNSX1RTX1MpQGhpZ2hlcgogCXNyZGkJcjYsIHIxNCwgMzIKQEAgLTE3MCw2ICsxMzQsOSBAQAogMToJdGRlcWkgICByNiwgMAogCUVNSVRfQlVHX0VOVFJZIDFiLF9fRklMRV9fLF9fTElORV9fLDAKIAorCS8qIFN0YXNoIHRoZSBzdGFjayBwb2ludGVyIGF3YXkgZm9yIHVzZSBhZnRlciByZWNsYWltICovCisJc3RkCXIxLCBQQUNBUjEocjEzKQorCiAJLyogQ2xlYXIgTVNSIFJJIHNpbmNlIHdlIGFyZSBhYm91dCB0byBjaGFuZ2UgcjEsIEVFIGlzIGFscmVhZHkgb2ZmLiAqLwogCWxpCXI0LCAwCiAJbXRtc3JkCXI0LCAxCkBAIC0yNzMsNiArMjQwLDQzIEBACiAJICogTVNSLgogCSAqLwogCisKKwkvKiAqKioqKioqKioqKioqKioqKioqKiBGUFIvVlIvVlNScyAqKioqKioqKioqKioKKwkgKiBBZnRlciByZWNsYWltaW5nLCBjYXB0dXJlIHRoZSBjaGVja3BvaW50ZWQgRlBScy9WUnMgL2lmIHVzZWQvLgorCSAqCisJICogKElmIFZTWCB1c2VkLCBGUCBhbmQgVk1YIGFyZSBpbXBsaWVkLiAgT3IsIHdlIGRvbid0IG5lZWQgdG8gbG9vaworCSAqIGF0IE1TUi5WU1ggYXMgY29weWluZyBGUCByZWdzIGlmIC5GUCwgdmVjdG9yIHJlZ3MgaWYgLlZNWCBjb3ZlcnMgaXQuKQorCSAqCisJICogV2UncmUgcGFzc2VkIHRoZSB0aHJlYWQncyBNU1IgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIKKwkgKgorCSAqIFdlIGVuYWJsZWQgVkVDL0ZQL1ZTWCBpbiB0aGUgbXNyIGFib3ZlLCBzbyB3ZSBjYW4gZXhlY3V0ZSB0aGVzZQorCSAqIGluc3RydWN0aW9ucyEKKwkgKi8KKwlsZAlyNCwgU1RLX1BBUkFNKFI0KShyMSkJCS8qIFNlY29uZCBwYXJhbWV0ZXIsIE1TUiAqICovCisJbXIJcjMsIHIxMgorCWFuZGlzLgkJcjAsIHI0LCBNU1JfVkVDQGgKKwliZXEJZG9udF9iYWNrdXBfdmVjCisKKwlhZGRpCXI3LCByMywgVEhSRUFEX0NLVlJTVEFURQorCVNBVkVfMzJWUlMoMCwgcjYsIHI3KQkvKiByNiBzY3JhdGNoLCByNyB0cmFuc2FjdCB2ciBzdGF0ZSAqLworCW1mdnNjcgl2MAorCWxpCXI2LCBWUlNUQVRFX1ZTQ1IKKwlzdHZ4CXYwLCByNywgcjYKK2RvbnRfYmFja3VwX3ZlYzoKKwltZnNwcglyMCwgU1BSTl9WUlNBVkUKKwlzdGQJcjAsIFRIUkVBRF9DS1ZSU0FWRShyMykKKworCWFuZGkuCXIwLCByNCwgTVNSX0ZQCisJYmVxCWRvbnRfYmFja3VwX2ZwCisKKwlhZGRpCXI3LCByMywgVEhSRUFEX0NLRlBTVEFURQorCVNBVkVfMzJGUFJTX1ZTUlMoMCwgUjYsIFI3KQkvKiByNiBzY3JhdGNoLCByNyB0cmFuc2FjdCBmcCBzdGF0ZSAqLworCisJbWZmcyAgICBmcjAKKwlzdGZkICAgIGZyMCxGUFNUQVRFX0ZQU0NSKHI3KQorCitkb250X2JhY2t1cF9mcDoKKwogCS8qIFRNIHJlZ3MsIGluY2wgVEVYQVNSIC0tIHRoZXNlIGxpdmUgaW4gdGhyZWFkX3N0cnVjdC4gIE5vdGUgdGhleSd2ZQogCSAqIGJlZW4gdXBkYXRlZCBieSB0aGUgdHJlY2xhaW0sIHRvIGV4cGxhaW4gdG8gdXNlcmxhbmQgdGhlIGZhaWx1cmUKIAkgKiBjYXVzZSAoYWJvcnRlZCkuCkBAIC0yODgsNiArMjkyLDcgQEAKIAogCS8qIFJlc3RvcmUgb3JpZ2luYWwgTVNSL0lSUSBzdGF0ZSAmIGNsZWFyIFRNIG1vZGUgKi8KIAlsZAlyMTQsIFRNX0ZSQU1FX0wwKHIxKQkJLyogT3JpZyBNU1IgKi8KKwogCWxpCXIxNSwgMAogCXJsZGltaSAgcjE0LCByMTUsIE1TUl9UU19MRywgKDYzLU1TUl9UU19MRyktMQogCW10bXNyZCAgcjE0CkBAIC0zNTYsMjggKzM2MSwyOSBAQAogCW10bXNyCXI1CiAKICNpZmRlZiBDT05GSUdfQUxUSVZFQwotCS8qIEZQIGFuZCBWRUMgcmVnaXN0ZXJzOiAgVGhlc2UgYXJlIHJlY2hlY2twb2ludGVkIGZyb20gdGhyZWFkLmZwcltdCi0JICogYW5kIHRocmVhZC52cltdIHJlc3BlY3RpdmVseS4gIFRoZSB0aHJlYWQudHJhbnNhY3RfZnByW10gdmVyc2lvbgotCSAqIGlzIG1vcmUgbW9kZXJuLCBhbmQgd2lsbCBiZSBsb2FkZWQgc3Vic2VxdWVudGx5IGJ5IGFueSBGUFVuYXZhaWxhYmxlCi0JICogdHJhcC4KKwkvKgorCSAqIEZQIGFuZCBWRUMgcmVnaXN0ZXJzOiBUaGVzZSBhcmUgcmVjaGVja3BvaW50ZWQgZnJvbQorCSAqIHRocmVhZC5ja2ZwX3N0YXRlIGFuZCB0aHJlYWQuY2t2cl9zdGF0ZSByZXNwZWN0aXZlbHkuIFRoZQorCSAqIHRocmVhZC5mcF9zdGF0ZVtdIHZlcnNpb24gaG9sZHMgdGhlICdsaXZlJyAodHJhbnNhY3Rpb25hbCkKKwkgKiBhbmQgd2lsbCBiZSBsb2FkZWQgc3Vic2VxdWVudGx5IGJ5IGFueSBGUFVuYXZhaWxhYmxlIHRyYXAuCiAJICovCiAJYW5kaXMuCXIwLCByNCwgTVNSX1ZFQ0BoCiAJYmVxCWRvbnRfcmVzdG9yZV92ZWMKIAotCWFkZGkJcjgsIHIzLCBUSFJFQURfVlJTVEFURQorCWFkZGkJcjgsIHIzLCBUSFJFQURfQ0tWUlNUQVRFCiAJbGkJcjUsIFZSU1RBVEVfVlNDUgogCWx2eAl2MCwgcjgsIHI1CiAJbXR2c2NyCXYwCiAJUkVTVF8zMlZSUygwLCByNSwgcjgpCQkJLyogcjUgc2NyYXRjaCwgcjggcHRyICovCiBkb250X3Jlc3RvcmVfdmVjOgotCWxkCXI1LCBUSFJFQURfVlJTQVZFKHIzKQorCWxkCXI1LCBUSFJFQURfQ0tWUlNBVkUocjMpCiAJbXRzcHIJU1BSTl9WUlNBVkUsIHI1CiAjZW5kaWYKIAogCWFuZGkuCXIwLCByNCwgTVNSX0ZQCiAJYmVxCWRvbnRfcmVzdG9yZV9mcAogCi0JYWRkaQlyOCwgcjMsIFRIUkVBRF9GUFNUQVRFCisJYWRkaQlyOCwgcjMsIFRIUkVBRF9DS0ZQU1RBVEUKIAlsZmQJZnIwLCBGUFNUQVRFX0ZQU0NSKHI4KQogCU1URlNGX0woZnIwKQogCVJFU1RfMzJGUFJTX1ZTUlMoMCwgUjQsIFI4KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCmluZGV4IDJjYjU4OTIuLmExZjhmNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTI1LDcgKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC91c2VyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogcHJpbnRfbW9kdWxlcyAqLwogI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CkBAIC0xMTYsNyArMTE3LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGllX25lc3RfY291bnQ7CiBzdGF0aWMgaW50IGRpZV9jb3VudGVyOwogCi1zdGF0aWMgdW5zaWduZWQgX19rcHJvYmVzIGxvbmcgb29wc19iZWdpbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9vcHNfYmVnaW4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IGNwdTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTQzLDggKzE0NCw5IEBACiAJCXBtYWNfYmFja2xpZ2h0X3VuYmxhbmsoKTsKIAlyZXR1cm4gZmxhZ3M7CiB9CitOT0tQUk9CRV9TWU1CT0wob29wc19iZWdpbik7CiAKLXN0YXRpYyB2b2lkIF9fa3Byb2JlcyBvb3BzX2VuZCh1bnNpZ25lZCBsb25nIGZsYWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKK3N0YXRpYyB2b2lkIG9vcHNfZW5kKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQkJICAgICAgIGludCBzaWducikKIHsKIAlidXN0X3NwaW5sb2NrcygwKTsKQEAgLTE5NSw4ICsxOTcsOSBAQAogCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7CiAJZG9fZXhpdChzaWducik7CiB9CitOT0tQUk9CRV9TWU1CT0wob29wc19lbmQpOwogCi1zdGF0aWMgaW50IF9fa3Byb2JlcyBfX2RpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKK3N0YXRpYyBpbnQgX19kaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpCiB7CiAJcHJpbnRrKCJPb3BzOiAlcywgc2lnOiAlbGQgWyMlZF1cbiIsIHN0ciwgZXJyLCArK2RpZV9jb3VudGVyKTsKICNpZmRlZiBDT05GSUdfUFJFRU1QVApAQCAtMjIwLDYgKzIyMyw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK05PS1BST0JFX1NZTUJPTChfX2RpZSk7CiAKIHZvaWQgZGllKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyKQogewpAQCAtODAxLDcgKzgwNSw3IEBACiAJX2V4Y2VwdGlvbihTSUdUUkFQLCByZWdzLCAwLCAwKTsKIH0KIAotdm9pZCBfX2twcm9iZXMgc2luZ2xlX3N0ZXBfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQordm9pZCBzaW5nbGVfc3RlcF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJZW51bSBjdHhfc3RhdGUgcHJldl9zdGF0ZSA9IGV4Y2VwdGlvbl9lbnRlcigpOwogCkBAIC04MTgsNiArODIyLDcgQEAKIGJhaWw6CiAJZXhjZXB0aW9uX2V4aXQocHJldl9zdGF0ZSk7CiB9CitOT0tQUk9CRV9TWU1CT0woc2luZ2xlX3N0ZXBfZXhjZXB0aW9uKTsKIAogLyoKICAqIEFmdGVyIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IGVtdWxhdGVkIGFuIGluc3RydWN0aW9uLCB3ZSBoYXZlIHRvCkBAIC0xMTM5LDcgKzExNDQsNyBAQAogc3RhdGljIGlubGluZSBpbnQgZW11bGF0ZV9tYXRoKHN0cnVjdCBwdF9yZWdzICpyZWdzKSB7IHJldHVybiAtMTsgfQogI2VuZGlmCiAKLXZvaWQgX19rcHJvYmVzIHByb2dyYW1fY2hlY2tfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQordm9pZCBwcm9ncmFtX2NoZWNrX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAllbnVtIGN0eF9zdGF0ZSBwcmV2X3N0YXRlID0gZXhjZXB0aW9uX2VudGVyKCk7CiAJdW5zaWduZWQgaW50IHJlYXNvbiA9IGdldF9yZWFzb24ocmVncyk7CkBAIC0xMjU5LDE2ICsxMjY0LDE4IEBACiBiYWlsOgogCWV4Y2VwdGlvbl9leGl0KHByZXZfc3RhdGUpOwogfQorTk9LUFJPQkVfU1lNQk9MKHByb2dyYW1fY2hlY2tfZXhjZXB0aW9uKTsKIAogLyoKICAqIFRoaXMgb2NjdXJzIHdoZW4gcnVubmluZyBpbiBoeXBlcnZpc29yIG1vZGUgb24gUE9XRVI2IG9yIGxhdGVyCiAgKiBhbmQgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiBpcyBlbmNvdW50ZXJlZC4KICAqLwotdm9pZCBfX2twcm9iZXMgZW11bGF0aW9uX2Fzc2lzdF9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit2b2lkIGVtdWxhdGlvbl9hc3Npc3RfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXJlZ3MtPm1zciB8PSBSRUFTT05fSUxMRUdBTDsKIAlwcm9ncmFtX2NoZWNrX2V4Y2VwdGlvbihyZWdzKTsKIH0KK05PS1BST0JFX1NZTUJPTChlbXVsYXRpb25fYXNzaXN0X2ludGVycnVwdCk7CiAKIHZvaWQgYWxpZ25tZW50X2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTEzMDksNiArMTMxNiwxOCBAQAogCWV4Y2VwdGlvbl9leGl0KHByZXZfc3RhdGUpOwogfQogCit2b2lkIHNsYl9taXNzX2JhZF9hZGRyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWVudW0gY3R4X3N0YXRlIHByZXZfc3RhdGUgPSBleGNlcHRpb25fZW50ZXIoKTsKKworCWlmICh1c2VyX21vZGUocmVncykpCisJCV9leGNlcHRpb24oU0lHU0VHViwgcmVncywgU0VHVl9CTkRFUlIsIHJlZ3MtPmRhcik7CisJZWxzZQorCQliYWRfcGFnZV9mYXVsdChyZWdzLCByZWdzLT5kYXIsIFNJR1NFR1YpOworCisJZXhjZXB0aW9uX2V4aXQocHJldl9zdGF0ZSk7Cit9CisKIHZvaWQgU3RhY2tPdmVyZmxvdyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlwcmludGsoS0VSTl9DUklUICJLZXJuZWwgc3RhY2sgb3ZlcmZsb3cgaW4gcHJvY2VzcyAlcCwgcjE9JWx4XG4iLApAQCAtMTM3MSw2ICsxMzkwLDIyIEBACiB9CiAKICNpZmRlZiBDT05GSUdfUFBDNjQKK3N0YXRpYyB2b2lkIHRtX3VuYXZhaWxhYmxlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworI2lmZGVmIENPTkZJR19QUENfVFJBTlNBQ1RJT05BTF9NRU0KKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CisJCWN1cnJlbnQtPnRocmVhZC5sb2FkX3RtKys7CisJCXJlZ3MtPm1zciB8PSBNU1JfVE07CisJCXRtX2VuYWJsZSgpOworCQl0bV9yZXN0b3JlX3NwcnMoJmN1cnJlbnQtPnRocmVhZCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlwcl9lbWVyZygiVW5yZWNvdmVyYWJsZSBUTSBVbmF2YWlsYWJsZSBFeGNlcHRpb24gIgorCQkJIiVseCBhdCAlbHhcbiIsIHJlZ3MtPnRyYXAsIHJlZ3MtPm5pcCk7CisJZGllKCJVbnJlY292ZXJhYmxlIFRNIFVuYXZhaWxhYmxlIEV4Y2VwdGlvbiIsIHJlZ3MsIFNJR0FCUlQpOworfQorCiB2b2lkIGZhY2lsaXR5X3VuYXZhaWxhYmxlX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdGF0aWMgY2hhciAqZmFjaWxpdHlfc3RyaW5nc1tdID0gewpAQCAtMTQ1MCw2ICsxNDg1LDI3IEBACiAJCXJldHVybjsKIAl9CiAKKwlpZiAoc3RhdHVzID09IEZTQ1JfVE1fTEcpIHsKKwkJLyoKKwkJICogSWYgd2UncmUgaGVyZSB0aGVuIHRoZSBoYXJkd2FyZSBpcyBUTSBhd2FyZSBiZWNhdXNlIGl0CisJCSAqIGdlbmVyYXRlZCBhbiBleGNlcHRpb24gd2l0aCBGU1JNX1RNIHNldC4KKwkJICoKKwkJICogSWYgY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfVE0pIGlzIGZhbHNlLCB0aGVuIGVpdGhlciBmaXJtd2FyZQorCQkgKiB0b2xkIHVzIG5vdCB0byBkbyBUTSwgb3IgdGhlIGtlcm5lbCBpcyBub3QgYnVpbHQgd2l0aCBUTQorCQkgKiBzdXBwb3J0LgorCQkgKgorCQkgKiBJZiBib3RoIG9mIHRob3NlIHRoaW5ncyBhcmUgdHJ1ZSwgdGhlbiB1c2Vyc3BhY2UgY2FuIHNwYW0gdGhlCisJCSAqIGNvbnNvbGUgYnkgdHJpZ2dlcmluZyB0aGUgcHJpbnRrKCkgYmVsb3cganVzdCBieSBjb250aW51YWxseQorCQkgKiBkb2luZyB0YmVnaW4gKG9yIGFueSBUTSBpbnN0cnVjdGlvbikuIFNvIGluIHRoYXQgY2FzZSBqdXN0CisJCSAqIHNlbmQgdGhlIHByb2Nlc3MgYSBTSUdJTEwgaW1tZWRpYXRlbHkuCisJCSAqLworCQlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1RNKSkKKwkJCWdvdG8gb3V0OworCisJCXRtX3VuYXZhaWxhYmxlKHJlZ3MpOworCQlyZXR1cm47CisJfQorCiAJaWYgKChzdGF0dXMgPCBBUlJBWV9TSVpFKGZhY2lsaXR5X3N0cmluZ3MpKSAmJgogCSAgICBmYWNpbGl0eV9zdHJpbmdzW3N0YXR1c10pCiAJCWZhY2lsaXR5ID0gZmFjaWxpdHlfc3RyaW5nc1tzdGF0dXNdOwpAQCAtMTQ2Miw2ICsxNTE4LDcgQEAKIAkJIiVzRmFjaWxpdHkgJyVzJyB1bmF2YWlsYWJsZSwgZXhjZXB0aW9uIGF0IDB4JWx4LCBNU1I9JWx4XG4iLAogCQlodiA/ICJIeXBlcnZpc29yICIgOiAiIiwgZmFjaWxpdHksIHJlZ3MtPm5pcCwgcmVncy0+bXNyKTsKIAorb3V0OgogCWlmICh1c2VyX21vZGUocmVncykpIHsKIAkJX2V4Y2VwdGlvbihTSUdJTEwsIHJlZ3MsIElMTF9JTExPUEMsIHJlZ3MtPm5pcCk7CiAJCXJldHVybjsKQEAgLTE1MDMsNyArMTU2MCw4IEBACiAKIAkvKiBJZiBWTVggaXMgaW4gdXNlLCBnZXQgdGhlIHRyYW5zYWN0aW9uYWwgdmFsdWVzIGJhY2sgKi8KIAlpZiAocmVncy0+bXNyICYgTVNSX1ZFQykgewotCQlkb19sb2FkX3VwX3RyYW5zYWN0X2FsdGl2ZWMoJmN1cnJlbnQtPnRocmVhZCk7CisJCW1zcl9jaGVja19hbmRfc2V0KE1TUl9WRUMpOworCQlsb2FkX3ZyX3N0YXRlKCZjdXJyZW50LT50aHJlYWQudnJfc3RhdGUpOwogCQkvKiBBdCB0aGlzIHBvaW50IGFsbCB0aGUgVlNYIHN0YXRlIGlzIGxvYWRlZCwgc28gZW5hYmxlIGl0ICovCiAJCXJlZ3MtPm1zciB8PSBNU1JfVlNYOwogCX0KQEAgLTE1MjQsNyArMTU4Miw4IEBACiAJY3VycmVudC0+dGhyZWFkLnVzZWRfdnIgPSAxOwogCiAJaWYgKHJlZ3MtPm1zciAmIE1TUl9GUCkgewotCQlkb19sb2FkX3VwX3RyYW5zYWN0X2ZwdSgmY3VycmVudC0+dGhyZWFkKTsKKwkJbXNyX2NoZWNrX2FuZF9zZXQoTVNSX0ZQKTsKKwkJbG9hZF9mcF9zdGF0ZSgmY3VycmVudC0+dGhyZWFkLmZwX3N0YXRlKTsKIAkJcmVncy0+bXNyIHw9IE1TUl9WU1g7CiAJfQogfQpAQCAtMTU2MywxMCArMTYyMiwxMiBAQAogCSAqLwogCXRtX3JlY2hlY2twb2ludCgmY3VycmVudC0+dGhyZWFkLCByZWdzLT5tc3IgJiB+b3JpZ19tc3IpOwogCisJbXNyX2NoZWNrX2FuZF9zZXQob3JpZ19tc3IgJiAoTVNSX0ZQIHwgTVNSX1ZFQykpOworCiAJaWYgKG9yaWdfbXNyICYgTVNSX0ZQKQotCQlkb19sb2FkX3VwX3RyYW5zYWN0X2ZwdSgmY3VycmVudC0+dGhyZWFkKTsKKwkJbG9hZF9mcF9zdGF0ZSgmY3VycmVudC0+dGhyZWFkLmZwX3N0YXRlKTsKIAlpZiAob3JpZ19tc3IgJiBNU1JfVkVDKQotCQlkb19sb2FkX3VwX3RyYW5zYWN0X2FsdGl2ZWMoJmN1cnJlbnQtPnRocmVhZCk7CisJCWxvYWRfdnJfc3RhdGUoJmN1cnJlbnQtPnRocmVhZC52cl9zdGF0ZSk7CiB9CiAjZW5kaWYgLyogQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTSAqLwogCkBAIC0xNjU1LDcgKzE3MTYsNyBAQAogCQltdHNwcihTUFJOX0RCQ1IwLCBjdXJyZW50LT50aHJlYWQuZGVidWcuZGJjcjApOwogfQogCi12b2lkIF9fa3Byb2JlcyBEZWJ1Z0V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBkZWJ1Z19zdGF0dXMpCit2b2lkIERlYnVnRXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGRlYnVnX3N0YXR1cykKIHsKIAljdXJyZW50LT50aHJlYWQuZGVidWcuZGJzciA9IGRlYnVnX3N0YXR1czsKIApAQCAtMTcxNiw2ICsxNzc3LDcgQEAKIAl9IGVsc2UKIAkJaGFuZGxlX2RlYnVnKHJlZ3MsIGRlYnVnX3N0YXR1cyk7CiB9CitOT0tQUk9CRV9TWU1CT0woRGVidWdFeGNlcHRpb24pOwogI2VuZGlmIC8qIENPTkZJR19QUENfQURWX0RFQlVHX1JFR1MgKi8KIAogI2lmICFkZWZpbmVkKENPTkZJR19UQVVfSU5UKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9NYWtlZmlsZQppbmRleCAzNjZhZTA5Li4zMTEwN2JmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9NYWtlZmlsZQpAQCAtMzEsMTUgKzMxLDkgQEAKICQob2JqKS8lLnNvOiAkKG9iaikvJS5zby5kYmcgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQogCi0jIGFzc2VtYmx5IHJ1bGVzIGZvciB0aGUgLlMgZmlsZXMKLSQob2JqLXZkc282NCk6ICUubzogJS5TIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWRfZGVwLHZkc282NGFzKQotCiAjIGFjdHVhbCBidWlsZCBjb21tYW5kcwogcXVpZXRfY21kX3Zkc282NGxkID0gVkRTTzY0TCAkQAogICAgICAgY21kX3Zkc282NGxkID0gJChDQykgJChjX2ZsYWdzKSAtbyAkQCAtV2wsLVQkKGZpbHRlciAlLmxkcywkXikgJChmaWx0ZXIgJS5vLCReKQotcXVpZXRfY21kX3Zkc282NGFzID0gVkRTTzY0QSAkQAotICAgICAgY21kX3Zkc282NGFzID0gJChDQykgJChhX2ZsYWdzKSAtYyAtbyAkQCAkPAogCiAjIGluc3RhbGwgY29tbWFuZHMgZm9yIHRoZSB1bnN0cmlwcGVkIGZpbGUKIHF1aWV0X2NtZF92ZHNvX2luc3RhbGwgPSBJTlNUQUxMICRACmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9kYXRhcGFnZS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvZGF0YXBhZ2UuUwppbmRleCAxODRhNmJhLi5hYmYxN2ZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc282NC9kYXRhcGFnZS5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzY0L2RhdGFwYWdlLlMKQEAgLTU5LDcgKzU5LDcgQEAKIAlibAlWX0xPQ0FMX0ZVTkMoX19nZXRfZGF0YXBhZ2UpCiAJbXRscglyMTIKIAlhZGRpCXIzLHIzLENGR19TWVNDQUxMX01BUDY0Ci0JY21wbGkJY3IwLHI0LDAKKwljbXBsZGkJY3IwLHI0LDAKIAljcmNscgljcjAqNCtzbwogCWJlcWxyCiAJbGkJcjAsTlJfc3lzY2FsbHMKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmRzbzY0L2dldHRpbWVvZmRheS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvZ2V0dGltZW9mZGF5LlMKaW5kZXggYTc2YjRhZi4uMzgyMDIxMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvZ2V0dGltZW9mZGF5LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvNjQvZ2V0dGltZW9mZGF5LlMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCWJuZQljcjAsOTlmCiAKIAlsaQlyMywwCi0JY21wbGkJY3IwLHI0LDAKKwljbXBsZGkJY3IwLHI0LDAKIAljcmNscgljcjAqNCtzbwogCWJlcWxyCiAJbGlzCXI1LENMT0NLX1JFQUxUSU1FX1JFU0BoCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZlY3Rvci5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZWN0b3IuUwppbmRleCA2MTZhNmQ4Li5iYzg1YmRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZlY3Rvci5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmVjdG9yLlMKQEAgLTcsMzEgKzcsNiBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogCi0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotLyogdm9pZCBkb19sb2FkX3VwX3RyYW5zYWN0X2FsdGl2ZWMoc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCkKLSAqCi0gKiBUaGlzIGlzIHNpbWlsYXIgdG8gbG9hZF91cF9hbHRpdmVjIGJ1dCBmb3IgdGhlIHRyYW5zYWN0aW9uYWwgdmVyc2lvbiBvZiB0aGUKLSAqIHZlY3RvciByZWdzLiAgSXQgZG9lc24ndCBtZXNzIHdpdGggdGhlIHRhc2sgTVNSIG9yIHZhbGlkIGZsYWdzLgotICogRnVydGhlcm1vcmUsIFZFQyBsYXppbmVzcyBpcyBub3Qgc3VwcG9ydGVkIHdpdGggVE0gY3VycmVudGx5LgotICovCi1fR0xPQkFMKGRvX2xvYWRfdXBfdHJhbnNhY3RfYWx0aXZlYykKLQltZm1zcglyNgotCW9yaXMJcjUscjYsTVNSX1ZFQ0BoCi0JTVRNU1JEKHI1KQotCWlzeW5jCi0KLQlsaQlyNCwxCi0Jc3R3CXI0LFRIUkVBRF9VU0VEX1ZSKHIzKQotCi0JbGkJcjEwLFRIUkVBRF9UUkFOU0FDVF9WUlNUQVRFK1ZSU1RBVEVfVlNDUgotCWx2eAl2MCxyMTAscjMKLQltdHZzY3IJdjAKLQlhZGRpCXIxMCxyMyxUSFJFQURfVFJBTlNBQ1RfVlJTVEFURQotCVJFU1RfMzJWUlMoMCxyNCxyMTApCi0KLQlibHIKLSNlbmRpZgotCiAvKgogICogTG9hZCBzdGF0ZSBmcm9tIG1lbW9yeSBpbnRvIFZNWCByZWdpc3RlcnMgaW5jbHVkaW5nIFZTQ1IuCiAgKiBBc3N1bWVzIHRoZSBjYWxsZXIgaGFzIGVuYWJsZWQgVk1YIGluIHRoZSBNU1IuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggYjVmYmE2OC4uMmQxY2ZhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNDQsMTEgKzQ0LDU4IEBACiAgKiBUZXh0LCByZWFkIG9ubHkgZGF0YSBhbmQgb3RoZXIgcGVybWFuZW50IHJlYWQtb25seSBzZWN0aW9ucwogICovCiAKLQkvKiBUZXh0IGFuZCBnb3RzICovCisJX3RleHQgPSAuOworCV9zdGV4dCA9IC47CisKKwkvKgorCSAqIEhlYWQgdGV4dC4KKwkgKiBUaGlzIG5lZWRzIHRvIGJlIGluIGl0cyBvd24gb3V0cHV0IHNlY3Rpb24gdG8gYXZvaWQgbGQgcGxhY2luZworCSAqIGJyYW5jaCB0cmFtcG9saW5lIHN0dWJzIHJhbmRvbWx5IHRocm91Z2hvdXQgdGhlIGZpeGVkIHNlY3Rpb25zLAorCSAqIHdoaWNoIGl0IHdpbGwgZG8gKGV2ZW4gaWYgdGhlIGJyYW5jaCBjb21lcyBmcm9tIGFub3RoZXIgc2VjdGlvbikKKwkgKiBpbiBvcmRlciB0byBvcHRpbWl6ZSBzdHViIGdlbmVyYXRpb24uCisJICovCisJLmhlYWQudGV4dCA6IEFUKEFERFIoLmhlYWQudGV4dCkgLSBMT0FEX09GRlNFVCkgeworI2lmZGVmIENPTkZJR19QUEM2NAorCQlLRUVQKCooLmhlYWQudGV4dC5maXJzdF8yNTZCKSk7CisjaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKKyMgZGVmaW5lIEVORF9GSVhFRAkweDEwMAorI2Vsc2UKKwkJS0VFUCgqKC5oZWFkLnRleHQucmVhbF92ZWN0b3JzKSk7CisJCSooLmhlYWQudGV4dC5yZWFsX3RyYW1wb2xpbmVzKTsKKwkJS0VFUCgqKC5oZWFkLnRleHQudmlydF92ZWN0b3JzKSk7CisJCSooLmhlYWQudGV4dC52aXJ0X3RyYW1wb2xpbmVzKTsKKyMgaWYgZGVmaW5lZChDT05GSUdfUFBDX1BTRVJJRVMpIHx8IGRlZmluZWQoQ09ORklHX1BQQ19QT1dFUk5WKQorCQlLRUVQKCooLmhlYWQuZGF0YS5md25taV9wYWdlKSk7CisjICBkZWZpbmUgRU5EX0ZJWEVECTB4ODAwMAorIyBlbHNlCisjICBkZWZpbmUgRU5EX0ZJWEVECTB4NzAwMAorIyBlbmRpZgorI2VuZGlmCisJCUFTU0VSVCgoLiA9PSBFTkRfRklYRUQpLCAidm1saW51eC5sZHMuUzogZml4ZWQgc2VjdGlvbiBvdmVyZmxvdyBlcnJvciIpOworI2Vsc2UgLyogIUNPTkZJR19QUEM2NCAqLworCQlIRUFEX1RFWFQKKyNlbmRpZgorCX0gOmtlcm5lbAorCisJLyoKKwkgKiBJZiB0aGUgYnVpbGQgZGllcyBoZXJlLCBpdCdzIGxpa2VseSBjb2RlIGluIGhlYWRfNjQuUyBpcyByZWZlcmVuY2luZworCSAqIGxhYmVscyBpdCBjYW4ndCByZWFjaCwgYW5kIHRoZSBsaW5rZXIgaW5zZXJ0aW5nIHN0dWJzIHdpdGhvdXQgdGhlCisJICogYXNzZW1ibGVyJ3Mga25vd2xlZGdlLiBUbyBkZWJ1ZywgcmVtb3ZlIHRoZSBhYm92ZSBhc3NlcnQgYW5kCisJICogcmVidWlsZC4gTG9vayBmb3IgYnJhbmNoIHN0dWJzIGluIHRoZSBmaXhlZCBzZWN0aW9uIHJlZ2lvbi4KKwkgKgorCSAqIExpbmtlciBzdHViIGdlbmVyYXRpb24gY291bGQgYmUgYWxsb3dlZCBpbiAidHJhbXBvbGluZSIKKwkgKiBzZWN0aW9ucyBpZiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSwgYnV0IHRoaXMgd291bGQgcmVxdWlyZQorCSAqIHNvbWUgcmV3b3JrIG9mIHRoZSBmaXhlZCBzZWN0aW9ucy4gQmVmb3JlIHJlc29ydGluZyB0byB0aGlzLAorCSAqIGNvbnNpZGVyIHJlZmVyZW5jZXMgdGhhdCBoYXZlIHN1ZmZpY2llbnQgYWRkcmVzc2luZyByYW5nZSwKKwkgKiAoZS5nLiwgaGFuZCBjb2RlZCB0cmFtcG9saW5lcykgc28gdGhlIGxpbmtlciBkb2VzIG5vdCBoYXZlCisJICogdG8gYWRkIHN0dWJzLgorCSAqCisJICogTGlua2VyIHN0dWJzIGF0IHRoZSB0b3Agb2YgdGhlIG1haW4gdGV4dCBzZWN0aW9uIGFyZSBjdXJyZW50bHkgbm90CisJICogZGV0ZWN0ZWQsIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGNyYXNoIGF0IGJvb3QgZHVlIHRvIG9mZnNldHMgYmVpbmcKKwkgKiB3cm9uZy4KKwkgKi8KIAkudGV4dCA6IEFUKEFERFIoLnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKIAkJQUxJR05fRlVOQ1RJT04oKTsKLQkJSEVBRF9URVhUCi0JCV90ZXh0ID0gLjsKIAkJLyogY2FyZWZ1bCEgX19mdHJfYWx0Xyogc2VjdGlvbnMgbmVlZCB0byBiZSBjbG9zZSB0byAudGV4dCAqLwogCQkqKC50ZXh0IC5maXh1cCBfX2Z0cl9hbHRfKiAucmVmLnRleHQpCiAJCVNDSEVEX1RFWFQKQEAgLTU2LDYgKzEwMyw4IEBACiAJCUtQUk9CRVNfVEVYVAogCQlJUlFFTlRSWV9URVhUCiAJCVNPRlRJUlFFTlRSWV9URVhUCisJCU1FTV9LRUVQKGluaXQudGV4dCkKKwkJTUVNX0tFRVAoZXhpdC50ZXh0KQogCiAjaWZkZWYgQ09ORklHX1BQQzMyCiAJCSooLmdvdDEpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL0tjb25maWcgYi9hcmNoL3Bvd2VycGMva3ZtL0tjb25maWcKaW5kZXggYzIwMjRhYy4uMDI5YmUyNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vS2NvbmZpZwpAQCAtMjIsNiArMjIsOSBAQAogCXNlbGVjdCBBTk9OX0lOT0RFUwogCXNlbGVjdCBIQVZFX0tWTV9FVkVOVEZECiAJc2VsZWN0IFNSQ1UKKwlzZWxlY3QgS1ZNX1ZGSU8KKwlzZWxlY3QgSVJRX0JZUEFTU19NQU5BR0VSCisJc2VsZWN0IEhBVkVfS1ZNX0lSUV9CWVBBU1MKIAogY29uZmlnIEtWTV9CT09LM1NfSEFORExFUgogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva3ZtL01ha2VmaWxlCmluZGV4IDFmOWU1NTIuLjdkZDg5YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9NYWtlZmlsZQpAQCAtNywxNiArNywxNiBAQAogY2NmbGFncy15IDo9IC1JdmlydC9rdm0gLUlhcmNoL3Bvd2VycGMva3ZtCiBLVk0gOj0gLi4vLi4vLi4vdmlydC9rdm0KIAotY29tbW9uLW9ianMteSA9ICQoS1ZNKS9rdm1fbWFpbi5vICQoS1ZNKS9jb2FsZXNjZWRfbW1pby5vIFwKLQkJJChLVk0pL2V2ZW50ZmQubworY29tbW9uLW9ianMteSA9ICQoS1ZNKS9rdm1fbWFpbi5vICQoS1ZNKS9ldmVudGZkLm8KIGNvbW1vbi1vYmpzLSQoQ09ORklHX0tWTV9WRklPKSArPSAkKEtWTSkvdmZpby5vCitjb21tb24tb2Jqcy0kKENPTkZJR19LVk1fTU1JTykgKz0gJChLVk0pL2NvYWxlc2NlZF9tbWlvLm8KIAogQ0ZMQUdTX2U1MDBfbW11Lm8gOj0gLUkuCiBDRkxBR1NfZTUwMF9tbXVfaG9zdC5vIDo9IC1JLgogQ0ZMQUdTX2VtdWxhdGUubyAgOj0gLUkuCiBDRkxBR1NfZW11bGF0ZV9sb2Fkc3RvcmUubyAgOj0gLUkuCiAKLWNvbW1vbi1vYmpzLXkgKz0gcG93ZXJwYy5vIGVtdWxhdGUubyBlbXVsYXRlX2xvYWRzdG9yZS5vCitjb21tb24tb2Jqcy15ICs9IHBvd2VycGMubyBlbXVsYXRlX2xvYWRzdG9yZS5vCiBvYmotJChDT05GSUdfS1ZNX0VYSVRfVElNSU5HKSArPSB0aW1pbmcubwogb2JqLSQoQ09ORklHX0tWTV9CT09LM1NfSEFORExFUikgKz0gYm9vazNzX2V4cG9ydHMubwogCkBAIC0yNCw2ICsyNCw3IEBACiAKIGt2bS1lNTAwLW9ianMgOj0gXAogCSQoY29tbW9uLW9ianMteSkgXAorCWVtdWxhdGUubyBcCiAJYm9va2UubyBcCiAJYm9va2VfZW11bGF0ZS5vIFwKIAlib29rZV9pbnRlcnJ1cHRzLm8gXApAQCAtMzUsNiArMzYsNyBAQAogCiBrdm0tZTUwMG1jLW9ianMgOj0gXAogCSQoY29tbW9uLW9ianMteSkgXAorCWVtdWxhdGUubyBcCiAJYm9va2UubyBcCiAJYm9va2VfZW11bGF0ZS5vIFwKIAlib29rZWh2X2ludGVycnVwdHMubyBcCkBAIC02MSw5ICs2Myw2IEBACiAJYm9vazNzXzMyX21tdS5vCiAKIGlmZGVmIENPTkZJR19LVk1fQk9PSzNTX1BSX1BPU1NJQkxFCi1rdm0tYm9vazNzXzY0LW1vZHVsZS1vYmpzIDo9IFwKLQkkKEtWTSkvY29hbGVzY2VkX21taW8ubwotCiBrdm0tYm9vazNzXzY0LWJ1aWx0aW4tb2Jqcy0kKENPTkZJR19LVk1fQk9PSzNTXzY0X0hBTkRMRVIpICs9IFwKIAlib29rM3Nfcm1oYW5kbGVycy5vCiBlbmRpZgpAQCAtNzgsNiArNzcsNyBAQAogCiBpZmRlZiBDT05GSUdfS1ZNX0JPT0szU19IVl9QT1NTSUJMRQoga3ZtLWJvb2szc182NC1idWlsdGluLW9ianMtJChDT05GSUdfS1ZNX0JPT0szU182NF9IQU5ETEVSKSArPSBcCisJYm9vazNzX2h2X2htaS5vIFwKIAlib29rM3NfaHZfcm1oYW5kbGVycy5vIFwKIAlib29rM3NfaHZfcm1fbW11Lm8gXAogCWJvb2szc19odl9yYXMubyBcCkBAIC04OCwxMSArODgsOCBAQAoga3ZtLWJvb2szc182NC1vYmpzLSQoQ09ORklHX0tWTV9YSUNTKSArPSBcCiAJYm9vazNzX3hpY3MubwogCi1rdm0tYm9vazNzXzY0LW1vZHVsZS1vYmpzICs9IFwKLQkkKEtWTSkva3ZtX21haW4ubyBcCi0JJChLVk0pL2V2ZW50ZmQubyBcCi0JcG93ZXJwYy5vIFwKLQllbXVsYXRlX2xvYWRzdG9yZS5vIFwKK2t2bS1ib29rM3NfNjQtbW9kdWxlLW9ianMgOj0gXAorCSQoY29tbW9uLW9ianMteSkgXAogCWJvb2szcy5vIFwKIAlib29rM3NfNjRfdmlvLm8gXAogCWJvb2szc19ydGFzLm8gXApAQCAtMTAyLDYgKzk5LDcgQEAKIAoga3ZtLWJvb2szc18zMi1vYmpzIDo9IFwKIAkkKGNvbW1vbi1vYmpzLXkpIFwKKwllbXVsYXRlLm8gXAogCWZwdS5vIFwKIAlib29rM3NfcGFpcmVkX3NpbmdsZXMubyBcCiAJYm9vazNzLm8gXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzLmMKaW5kZXggNDcwMThmYy4uYjY5NTJkZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3MuYworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szcy5jCkBAIC01Miw4ICs1MiwxMiBAQAogCXsgImRlYyIsICAgICAgICAgVkNQVV9TVEFUKGRlY19leGl0cykgfSwKIAl7ICJleHRfaW50ciIsICAgIFZDUFVfU1RBVChleHRfaW50cl9leGl0cykgfSwKIAl7ICJxdWV1ZV9pbnRyIiwgIFZDUFVfU1RBVChxdWV1ZV9pbnRyKSB9LAorCXsgImhhbHRfcG9sbF9zdWNjZXNzX25zIiwJVkNQVV9TVEFUKGhhbHRfcG9sbF9zdWNjZXNzX25zKSB9LAorCXsgImhhbHRfcG9sbF9mYWlsX25zIiwJCVZDUFVfU1RBVChoYWx0X3BvbGxfZmFpbF9ucykgfSwKKwl7ICJoYWx0X3dhaXRfbnMiLAkJVkNQVV9TVEFUKGhhbHRfd2FpdF9ucykgfSwKIAl7ICJoYWx0X3N1Y2Nlc3NmdWxfcG9sbCIsIFZDUFVfU1RBVChoYWx0X3N1Y2Nlc3NmdWxfcG9sbCksIH0sCiAJeyAiaGFsdF9hdHRlbXB0ZWRfcG9sbCIsIFZDUFVfU1RBVChoYWx0X2F0dGVtcHRlZF9wb2xsKSwgfSwKKwl7ICJoYWx0X3N1Y2Nlc3NmdWxfd2FpdCIsCVZDUFVfU1RBVChoYWx0X3N1Y2Nlc3NmdWxfd2FpdCkgfSwKIAl7ICJoYWx0X3BvbGxfaW52YWxpZCIsIFZDUFVfU1RBVChoYWx0X3BvbGxfaW52YWxpZCkgfSwKIAl7ICJoYWx0X3dha2V1cCIsIFZDUFVfU1RBVChoYWx0X3dha2V1cCkgfSwKIAl7ICJwZl9zdG9yYWdlIiwgIFZDUFVfU1RBVChwZl9zdG9yYWdlKSB9LApAQCAtNjQsNiArNjgsOSBAQAogCXsgImxkX3Nsb3ciLCAgICAgVkNQVV9TVEFUKGxkX3Nsb3cpIH0sCiAJeyAic3QiLCAgICAgICAgICBWQ1BVX1NUQVQoc3QpIH0sCiAJeyAic3Rfc2xvdyIsICAgICBWQ1BVX1NUQVQoc3Rfc2xvdykgfSwKKwl7ICJwdGhydV9hbGwiLCAgICAgICBWQ1BVX1NUQVQocHRocnVfYWxsKSB9LAorCXsgInB0aHJ1X2hvc3QiLCAgICAgIFZDUFVfU1RBVChwdGhydV9ob3N0KSB9LAorCXsgInB0aHJ1X2JhZF9hZmYiLCAgIFZDUFVfU1RBVChwdGhydV9iYWRfYWZmKSB9LAogCXsgTlVMTCB9CiB9OwogCkBAIC01OTIsOSArNTk5LDYgQEAKIAkJY2FzZSBLVk1fUkVHX1BQQ19CRVNDUjoKIAkJCSp2YWwgPSBnZXRfcmVnX3ZhbChpZCwgdmNwdS0+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+dGdpZDsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyB0aW1lICVsbGQgbnMsIHRnaWQ9JWQiLAorCQlfX2VudHJ5LT53YWl0ZWQgPyAid2FpdCIgOiAicG9sbCIsCisJCV9fZW50cnktPm5zLCBfX2VudHJ5LT50Z2lkKQorKTsKKwogVFJBQ0VfRVZFTlQoa3ZtcHBjX3J1bl92Y3B1X2VudGVyLAogCVRQX1BST1RPKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSksCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvbGliL01ha2VmaWxlCmluZGV4IGJhMjFiZTEuLmFkNTI5MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9NYWtlZmlsZQpAQCAtMjIsNyArMjIsNyBAQAogb2JqNjQtJChDT05GSUdfQUxUSVZFQykJKz0gdm14LWhlbHBlci5vCiAKIGlmZXEgKCQoQ09ORklHX0dFTkVSSUNfQ1NVTSksKQotb2JqLXkJCQkrPSBjaGVja3N1bV8kKENPTkZJR19XT1JEX1NJWkUpLm8gY2hlY2tzdW1fd3JhcHBlcnMubworb2JqLXkJCQkrPSBjaGVja3N1bV8kKEJJVFMpLm8gY2hlY2tzdW1fd3JhcHBlcnMubwogZW5kaWYKIAogb2JqLSQoQ09ORklHX1BQQ19FTVVMQVRFX1NTVEVQKQkrPSBzc3RlcC5vIGxkc3RmcC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL2NoZWNrc3VtXzMyLlMgYi9hcmNoL3Bvd2VycGMvbGliL2NoZWNrc3VtXzMyLlMKaW5kZXggMGE1N2ZlNi4uYWE4MjE0ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9jaGVja3N1bV8zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvY2hlY2tzdW1fMzIuUwpAQCAtMTI3LDE4ICsxMjcsMTkgQEAKIAlzdHcJcjcsMTIocjEpCiAJc3R3CXI4LDgocjEpCiAKLQlybHdpbm0JcjAscjQsMywweDgKLQlybHdubQlyNixyNixyMCwwLDMxCS8qIG9kZCBkZXN0aW5hdGlvbiBhZGRyZXNzOiByb3RhdGUgb25lIGJ5dGUgKi8KLQljbXBsd2kJY3I3LHIwLDAJLyogaXMgZGVzdGluYXRpb24gYWRkcmVzcyBldmVuID8gKi8KIAlhZGRpYwlyMTIscjYsMAogCWFkZGkJcjYscjQsLTQKIAluZWcJcjAscjQKIAlhZGRpCXI0LHIzLC00CiAJYW5kaS4JcjAscjAsQ0FDSEVMSU5FX01BU0sJLyogIyBieXRlcyB0byBzdGFydCBvZiBjYWNoZSBsaW5lICovCisJY3JzZXQJNCpjcjcrZXEKIAliZXEJNThmCiAKIAljbXBsdwkwLHI1LHIwCQkJLyogaXMgdGhpcyBtb3JlIHRoYW4gdG90YWwgdG8gZG8/ICovCiAJYmx0CTYzZgkJCS8qIGlmIG5vdCBtdWNoIHRvIGRvICovCisJcmx3aW5tCXI3LHI2LDMsMHg4CisJcmx3bm0JcjEyLHIxMixyNywwLDMxCS8qIG9kZCBkZXN0aW5hdGlvbiBhZGRyZXNzOiByb3RhdGUgb25lIGJ5dGUgKi8KKwljbXBsd2kJY3I3LHI3LDAJLyogaXMgZGVzdGluYXRpb24gYWRkcmVzcyBldmVuID8gKi8KIAlhbmRpLglyOCxyMCwzCQkJLyogZ2V0IGl0IHdvcmQtYWxpZ25lZCBmaXJzdCAqLwogCW10Y3RyCXI4CiAJYmVxKwk2MWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvbWVtXzY0LlMgYi9hcmNoL3Bvd2VycGMvbGliL21lbV82NC5TCmluZGV4IDQzNDM1YzYuLmVkYTdhOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvbWVtXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9tZW1fNjQuUwpAQCAtMzcsNiArMzcsNyBAQAogCWNscmxkaQlyNSxyNSw1OAogCW10Y3RyCXIwCiAJYmVxCTVmCisJLmJhbGlnbiAxNgogNDoJc3RkCXI0LDAocjYpCiAJc3RkCXI0LDgocjYpCiAJc3RkCXI0LDE2KHI2KQpAQCAtOTAsNiArOTEsNyBAQAogCWFuZGkuCXIwLHI2LDMKIAltdGN0cglyNwogCWJuZQk1ZgorCS5iYWxpZ24gMTYKIDE6CWx3eglyNywtNChyNCkKIAlsd3p1CXI4LC04KHI0KQogCXN0dwlyNywtNChyNikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQppbmRleCBmMmNlYTZkLi4xYTRlNTcwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL21tL01ha2VmaWxlCkBAIC03LDE3ICs3LDE2IEBACiBjY2ZsYWdzLSQoQ09ORklHX1BQQzY0KQk6PSAkKE5PX01JTklNQUxfVE9DKQogCiBvYmoteQkJCQk6PSBmYXVsdC5vIG1lbS5vIHBndGFibGUubyBtbWFwLm8gXAotCQkJCSAgIGluaXRfJChDT05GSUdfV09SRF9TSVpFKS5vIFwKLQkJCQkgICBwZ3RhYmxlXyQoQ09ORklHX1dPUkRfU0laRSkubworCQkJCSAgIGluaXRfJChCSVRTKS5vIHBndGFibGVfJChCSVRTKS5vCiBvYmotJChDT05GSUdfUFBDX01NVV9OT0hBU0gpCSs9IG1tdV9jb250ZXh0X25vaGFzaC5vIHRsYl9ub2hhc2gubyBcCiAJCQkJICAgdGxiX25vaGFzaF9sb3cubwotb2JqLSQoQ09ORklHX1BQQ19CT09LM0UpCSs9IHRsYl9sb3dfJChDT05GSUdfV09SRF9TSVpFKWUubworb2JqLSQoQ09ORklHX1BQQ19CT09LM0UpCSs9IHRsYl9sb3dfJChCSVRTKWUubwogaGFzaDY0LSQoQ09ORklHX1BQQ19OQVRJVkUpCTo9IGhhc2hfbmF0aXZlXzY0Lm8KIG9iai0kKENPTkZJR19QUENfQk9PSzNFXzY0KSAgICs9IHBndGFibGUtYm9vazNlLm8KIG9iai0kKENPTkZJR19QUENfU1REX01NVV82NCkJKz0gcGd0YWJsZS1oYXNoNjQubyBoYXNoX3V0aWxzXzY0Lm8gc2xiX2xvdy5vIHNsYi5vICQoaGFzaDY0LXkpIG1tdV9jb250ZXh0X2Jvb2szczY0Lm8gcGd0YWJsZS1ib29rM3M2NC5vCiBvYmotJChDT05GSUdfUFBDX1JBRElYX01NVSkJKz0gcGd0YWJsZS1yYWRpeC5vIHRsYi1yYWRpeC5vCiBvYmotJChDT05GSUdfUFBDX1NURF9NTVVfMzIpCSs9IHBwY19tbXVfMzIubyBoYXNoX2xvd18zMi5vIG1tdV9jb250ZXh0X2hhc2gzMi5vCi1vYmotJChDT05GSUdfUFBDX1NURF9NTVUpCSs9IHRsYl9oYXNoJChDT05GSUdfV09SRF9TSVpFKS5vCitvYmotJChDT05GSUdfUFBDX1NURF9NTVUpCSs9IHRsYl9oYXNoJChCSVRTKS5vCiBpZmVxICgkKENPTkZJR19QUENfU1REX01NVV82NCkseSkKIG9iai0kKENPTkZJR19QUENfNEtfUEFHRVMpCSs9IGhhc2g2NF80ay5vCiBvYmotJChDT05GSUdfUFBDXzY0S19QQUdFUykJKz0gaGFzaDY0XzY0ay5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCmluZGV4IGE0ZGIyMmYuLmQwYjEzN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CkBAIC0yMDUsNyArMjA1LDcgQEAKICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBpZiB0aGUgZmF1bHQgd2FzIGhhbmRsZWQsIG9yIHRoZSBzaWduYWwKICAqIG51bWJlciBpZiB0aGlzIGlzIGEga2VybmVsIGZhdWx0IHRoYXQgY2FuJ3QgYmUgaGFuZGxlZCBoZXJlLgogICovCi1pbnQgX19rcHJvYmVzIGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKK2ludCBkb19wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQogewogCWVudW0gY3R4X3N0YXRlIHByZXZfc3RhdGUgPSBleGNlcHRpb25fZW50ZXIoKTsKQEAgLTQ5OCw4ICs0OTgsOCBAQAogYmFpbDoKIAlleGNlcHRpb25fZXhpdChwcmV2X3N0YXRlKTsKIAlyZXR1cm4gcmM7Ci0KIH0KK05PS1BST0JFX1NZTUJPTChkb19wYWdlX2ZhdWx0KTsKIAogLyoKICAqIGJhZF9wYWdlX2ZhdWx0IGlzIGNhbGxlZCB3aGVuIHdlIGhhdmUgYSBiYWQgYWNjZXNzIGZyb20gdGhlIGtlcm5lbC4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKaW5kZXggMGU0ZTk2NS4uODNkZGMwZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfbmF0aXZlXzY0LmMKQEAgLTQ5MywzNiArNDkzLDYgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIGludCBfX2hwdGVfYWN0dWFsX3BzaXplKHVuc2lnbmVkIGludCBscCwgaW50IHBzaXplKQotewotCWludCBpLCBzaGlmdDsKLQl1bnNpZ25lZCBpbnQgbWFzazsKLQotCS8qIHN0YXJ0IGZyb20gMSBpZ25vcmluZyBNTVVfUEFHRV80SyAqLwotCWZvciAoaSA9IDE7IGkgPCBNTVVfUEFHRV9DT1VOVDsgaSsrKSB7Ci0KLQkJLyogaW52YWxpZCBwZW5jICovCi0JCWlmIChtbXVfcHNpemVfZGVmc1twc2l6ZV0ucGVuY1tpXSA9PSAtMSkKLQkJCWNvbnRpbnVlOwotCQkvKgotCQkgKiBlbmNvZGluZyBiaXRzIHBlciBhY3R1YWwgcGFnZSBzaXplCi0JCSAqICAgICAgICBQVEUgTFAgICAgIGFjdHVhbCBwYWdlIHNpemUKLQkJICogICAgcnJyciBycnJ6CQk+PThLQgotCQkgKiAgICBycnJyIHJyenoJCT49MTZLQgotCQkgKiAgICBycnJyIHJ6enoJCT49MzJLQgotCQkgKiAgICBycnJyIHp6enoJCT49NjRLQgotCQkgKiAuLi4uLi4uCi0JCSAqLwotCQlzaGlmdCA9IG1tdV9wc2l6ZV9kZWZzW2ldLnNoaWZ0IC0gTFBfU0hJRlQ7Ci0JCWlmIChzaGlmdCA+IExQX0JJVFMpCi0JCQlzaGlmdCA9IExQX0JJVFM7Ci0JCW1hc2sgPSAoMSA8PCBzaGlmdCkgLSAxOwotCQlpZiAoKGxwICYgbWFzaykgPT0gbW11X3BzaXplX2RlZnNbcHNpemVdLnBlbmNbaV0pCi0JCQlyZXR1cm4gaTsKLQl9Ci0JcmV0dXJuIC0xOwotfQotCiBzdGF0aWMgdm9pZCBocHRlX2RlY29kZShzdHJ1Y3QgaGFzaF9wdGUgKmhwdGUsIHVuc2lnbmVkIGxvbmcgc2xvdCwKIAkJCWludCAqcHNpemUsIGludCAqYXBzaXplLCBpbnQgKnNzaXplLCB1bnNpZ25lZCBsb25nICp2cG4pCiB7CkBAIC01MzgsMTYgKzUwOCw4IEBACiAJCXNpemUgICA9IE1NVV9QQUdFXzRLOwogCQlhX3NpemUgPSBNTVVfUEFHRV80SzsKIAl9IGVsc2UgewotCQlmb3IgKHNpemUgPSAwOyBzaXplIDwgTU1VX1BBR0VfQ09VTlQ7IHNpemUrKykgewotCi0JCQkvKiB2YWxpZCBlbnRyaWVzIGhhdmUgYSBzaGlmdCB2YWx1ZSAqLwotCQkJaWYgKCFtbXVfcHNpemVfZGVmc1tzaXplXS5zaGlmdCkKLQkJCQljb250aW51ZTsKLQotCQkJYV9zaXplID0gX19ocHRlX2FjdHVhbF9wc2l6ZShscCwgc2l6ZSk7Ci0JCQlpZiAoYV9zaXplICE9IC0xKQotCQkJCWJyZWFrOwotCQl9CisJCXNpemUgPSBocHRlX3BhZ2Vfc2l6ZXNbbHBdICYgMHhmOworCQlhX3NpemUgPSBocHRlX3BhZ2Vfc2l6ZXNbbHBdID4+IDQ7CiAJfQogCS8qIFRoaXMgd29ya3MgZm9yIGFsbCBwYWdlIHNpemVzLCBhbmQgZm9yIDI1Nk0gYW5kIDFUIHNlZ21lbnRzICovCiAJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FSQ0hfMzAwKSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCmluZGV4IDA4MjE1NTYuLjkwNDgwZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYwpAQCAtOTMsNiArOTMsOSBAQAogc3RydWN0IG1tdV9wc2l6ZV9kZWYgbW11X3BzaXplX2RlZnNbTU1VX1BBR0VfQ09VTlRdOwogRVhQT1JUX1NZTUJPTF9HUEwobW11X3BzaXplX2RlZnMpOwogCit1OCBocHRlX3BhZ2Vfc2l6ZXNbMSA8PCBMUF9CSVRTXTsKK0VYUE9SVF9TWU1CT0xfR1BMKGhwdGVfcGFnZV9zaXplcyk7CisKIHN0cnVjdCBoYXNoX3B0ZSAqaHRhYl9hZGRyZXNzOwogdW5zaWduZWQgbG9uZyBodGFiX3NpemVfYnl0ZXM7CiB1bnNpZ25lZCBsb25nIGh0YWJfaGFzaF9tYXNrOwpAQCAtNTY0LDggKzU2Nyw2MCBAQAogI2VuZGlmIC8qIENPTkZJR19IVUdFVExCX1BBR0UgKi8KIH0KIAorLyoKKyAqIEZpbGwgaW4gdGhlIGhwdGVfcGFnZV9zaXplc1tdIGFycmF5LgorICogV2UgZ28gdGhyb3VnaCB0aGUgbW11X3BzaXplX2RlZnNbXSBhcnJheSBsb29raW5nIGZvciBhbGwgdGhlCisgKiBzdXBwb3J0ZWQgYmFzZS9hY3R1YWwgcGFnZSBzaXplIGNvbWJpbmF0aW9ucy4gIEVhY2ggY29tYmluYXRpb24KKyAqIGhhcyBhIHVuaXF1ZSBwYWdlc2l6ZSBlbmNvZGluZyAocGVuYykgdmFsdWUgaW4gdGhlIGxvdyBiaXRzIG9mCisgKiB0aGUgTFAgZmllbGQgb2YgdGhlIEhQVEUuICBGb3IgYWN0dWFsIHBhZ2Ugc2l6ZXMgbGVzcyB0aGFuIDFNQiwKKyAqIHNvbWUgb2YgdGhlIHVwcGVyIExQIGJpdHMgYXJlIHVzZWQgZm9yIFJQTiBiaXRzLCBtZWFuaW5nIHRoYXQKKyAqIHdlIG5lZWQgdG8gZmlsbCBpbiBzZXZlcmFsIGVudHJpZXMgaW4gaHB0ZV9wYWdlX3NpemVzW10uCisgKgorICogSW4gZGlhZ3JhbW1hdGljIGZvcm0sIHdpdGggciA9IFJQTiBiaXRzIGFuZCB6ID0gcGFnZSBzaXplIGJpdHM6CisgKiAgICAgICAgUFRFIExQICAgICBhY3R1YWwgcGFnZSBzaXplCisgKiAgICBycnJyIHJycnoJCT49OEtCCisgKiAgICBycnJyIHJyenoJCT49MTZLQgorICogICAgcnJyciByenp6CQk+PTMyS0IKKyAqICAgIHJycnIgenp6egkJPj02NEtCCisgKiAgICAuLi4KKyAqCisgKiBUaGUgenp6eiBiaXRzIGFyZSBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBidXQgYXJlIGNob3NlbiBzbyB0aGF0CisgKiBubyBlbmNvZGluZyBmb3IgYSBsYXJnZXIgcGFnZSBzaXplIHVzZXMgdGhlIHNhbWUgdmFsdWUgaW4gaXRzCisgKiBsb3ctb3JkZXIgTiBiaXRzIGFzIHRoZSBlbmNvZGluZyBmb3IgdGhlIDJeKDEyK04pIGJ5dGUgcGFnZSBzaXplCisgKiAoaWYgaXQgZXhpc3RzKS4KKyAqLworc3RhdGljIHZvaWQgaW5pdF9ocHRlX3BhZ2Vfc2l6ZXModm9pZCkKK3sKKwlsb25nIGludCBhcCwgYnA7CisJbG9uZyBpbnQgc2hpZnQsIHBlbmM7CisKKwlmb3IgKGJwID0gMDsgYnAgPCBNTVVfUEFHRV9DT1VOVDsgKyticCkgeworCQlpZiAoIW1tdV9wc2l6ZV9kZWZzW2JwXS5zaGlmdCkKKwkJCWNvbnRpbnVlOwkvKiBub3QgYSBzdXBwb3J0ZWQgcGFnZSBzaXplICovCisJCWZvciAoYXAgPSBicDsgYXAgPCBNTVVfUEFHRV9DT1VOVDsgKythcCkgeworCQkJcGVuYyA9IG1tdV9wc2l6ZV9kZWZzW2JwXS5wZW5jW2FwXTsKKwkJCWlmIChwZW5jID09IC0xKQorCQkJCWNvbnRpbnVlOworCQkJc2hpZnQgPSBtbXVfcHNpemVfZGVmc1thcF0uc2hpZnQgLSBMUF9TSElGVDsKKwkJCWlmIChzaGlmdCA8PSAwKQorCQkJCWNvbnRpbnVlOwkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQkvKgorCQkJICogRm9yIHBhZ2Ugc2l6ZXMgbGVzcyB0aGFuIDFNQiwgdGhpcyBsb29wCisJCQkgKiByZXBsaWNhdGVzIHRoZSBlbnRyeSBmb3IgYWxsIHBvc3NpYmxlIHZhbHVlcworCQkJICogb2YgdGhlIHJycnIgYml0cy4KKwkJCSAqLworCQkJd2hpbGUgKHBlbmMgPCAoMSA8PCBMUF9CSVRTKSkgeworCQkJCWhwdGVfcGFnZV9zaXplc1twZW5jXSA9IChhcCA8PCA0KSB8IGJwOworCQkJCXBlbmMgKz0gMSA8PCBzaGlmdDsKKwkJCX0KKwkJfQorCX0KK30KKwogc3RhdGljIHZvaWQgX19pbml0IGh0YWJfaW5pdF9wYWdlX3NpemVzKHZvaWQpCiB7CisJaW5pdF9ocHRlX3BhZ2Vfc2l6ZXMoKTsKKwogCWlmICghZGVidWdfcGFnZWFsbG9jX2VuYWJsZWQoKSkgewogCQkvKgogCQkgKiBQaWNrIGEgc2l6ZSBmb3IgdGhlIGxpbmVhciBtYXBwaW5nLiBDdXJyZW50bHksIHdlIG9ubHkKQEAgLTcxMSw2ICs3NjYsMjkgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi8KIAorc3RhdGljIHZvaWQgdXBkYXRlX2hpZF9mb3JfaGFzaCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaGlkMDsKKwl1bnNpZ25lZCBsb25nIHJiID0gM1VMIDw8IFBQQ19CSVRMU0hJRlQoNTMpOyAvKiBJUyA9IDMgKi8KKworCWFzbSB2b2xhdGlsZSgicHRlc3luYyI6IDogOiJtZW1vcnkiKTsKKwkvKiBwcnMgPSAwLCByaWMgPSAyLCBycyA9IDAsIHIgPSAxIGlzID0gMyAqLworCWFzbSB2b2xhdGlsZShQUENfVExCSUVfNSglMCwgJTQsICUzLCAlMiwgJTEpCisJCSAgICAgOiA6ICJyIihyYiksICJpIigwKSwgImkiKDApLCAiaSIoMiksICJyIigwKSA6ICJtZW1vcnkiKTsKKwlhc20gdm9sYXRpbGUoImVpZWlvOyB0bGJzeW5jOyBwdGVzeW5jOyBpc3luYzsgc2xiaWEiOiA6IDoibWVtb3J5Iik7CisJLyoKKwkgKiBub3cgc3dpdGNoIHRoZSBISUQKKwkgKi8KKwloaWQwICA9IG1mc3ByKFNQUk5fSElEMCk7CisJaGlkMCAmPSB+SElEMF9QT1dFUjlfUkFESVg7CisJbXRzcHIoU1BSTl9ISUQwLCBoaWQwKTsKKwlhc20gdm9sYXRpbGUoImlzeW5jIjogOiA6Im1lbW9yeSIpOworCisJLyogV2FpdCBmb3IgaXQgdG8gaGFwcGVuICovCisJd2hpbGUgKChtZnNwcihTUFJOX0hJRDApICYgSElEMF9QT1dFUjlfUkFESVgpKQorCQljcHVfcmVsYXgoKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IGhhc2hfaW5pdF9wYXJ0aXRpb25fdGFibGUocGh5c19hZGRyX3QgaGFzaF90YWJsZSwKIAkJCQkJICAgICB1bnNpZ25lZCBsb25nIGh0YWJfc2l6ZSkKIHsKQEAgLTczNyw2ICs4MTUsOCBAQAogCSAqLwogCXBhcnRpdGlvbl90Yi0+cGF0YjEgPSAwOwogCXByX2luZm8oIlBhcnRpdGlvbiB0YWJsZSAlcFxuIiwgcGFydGl0aW9uX3RiKTsKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUE9XRVI5X0REMSkpCisJCXVwZGF0ZV9oaWRfZm9yX2hhc2goKTsKIAkvKgogCSAqIHVwZGF0ZSBwYXJ0aXRpb24gdGFibGUgY29udHJvbCByZWdpc3RlciwKIAkgKiA2NCBLIHNpemUuCkBAIC0xNDYwLDYgKzE1NDAsMjkgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFBDX1RSQU5TQUNUSU9OQUxfTUVNCitzdGF0aWMgaW5saW5lIHZvaWQgdG1fZmx1c2hfaGFzaF9wYWdlKGludCBsb2NhbCkKK3sKKwkvKgorCSAqIFRyYW5zYWN0aW9ucyBhcmUgbm90IGFib3J0ZWQgYnkgdGxiaWVsLCBvbmx5IHRsYmllLiBXaXRob3V0LCBzeW5jaW5nIGEKKwkgKiBwYWdlIGJhY2sgdG8gYSBibG9jayBkZXZpY2Ugdy9QSU8gY291bGQgcGljayB1cCB0cmFuc2FjdGlvbmFsIGRhdGEKKwkgKiAoYmFkISkgc28gd2UgZm9yY2UgYW4gYWJvcnQgaGVyZS4gQmVmb3JlIHRoZSBzeW5jIHRoZSBwYWdlIHdpbGwgYmUKKwkgKiBtYWRlIHJlYWQtb25seSwgd2hpY2ggd2lsbCBmbHVzaF9oYXNoX3BhZ2UuIEJJRyBJU1NVRSBoZXJlOiBpZiB0aGUKKwkgKiBrZXJuZWwgdXNlcyBhIHBhZ2UgZnJvbSB1c2Vyc3BhY2Ugd2l0aG91dCB1bm1hcHBpbmcgaXQgZmlyc3QsIGl0IG1heQorCSAqIHNlZSB0aGUgc3BlY3VsYXRlZCB2ZXJzaW9uLgorCSAqLworCWlmIChsb2NhbCAmJiBjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9UTSkgJiYgY3VycmVudC0+dGhyZWFkLnJlZ3MgJiYKKwkgICAgTVNSX1RNX0FDVElWRShjdXJyZW50LT50aHJlYWQucmVncy0+bXNyKSkgeworCQl0bV9lbmFibGUoKTsKKwkJdG1fYWJvcnQoVE1fQ0FVU0VfVExCSSk7CisJfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bV9mbHVzaF9oYXNoX3BhZ2UoaW50IGxvY2FsKQoreworfQorI2VuZGlmCisKIC8qIFdBUk5JTkc6IFRoaXMgaXMgY2FsbGVkIGZyb20gaGFzaF9sb3dfNjQuUywgaWYgeW91IGNoYW5nZSB0aGlzIHByb3RvdHlwZSwKICAqICAgICAgICAgIGRvIG5vdCBmb3JnZXQgdG8gdXBkYXRlIHRoZSBhc3NlbWJseSBjYWxsIHNpdGUgIQogICovCkBAIC0xNDg2LDIxICsxNTg5LDcgQEAKIAkJCQkJICAgICBzc2l6ZSwgbG9jYWwpOwogCX0gcHRlX2l0ZXJhdGVfaGFzaGVkX2VuZCgpOwogCi0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotCS8qIFRyYW5zYWN0aW9ucyBhcmUgbm90IGFib3J0ZWQgYnkgdGxiaWVsLCBvbmx5IHRsYmllLgotCSAqIFdpdGhvdXQsIHN5bmNpbmcgYSBwYWdlIGJhY2sgdG8gYSBibG9jayBkZXZpY2Ugdy8gUElPIGNvdWxkIHBpY2sgdXAKLQkgKiB0cmFuc2FjdGlvbmFsIGRhdGEgKGJhZCEpIHNvIHdlIGZvcmNlIGFuIGFib3J0IGhlcmUuICBCZWZvcmUgdGhlCi0JICogc3luYyB0aGUgcGFnZSB3aWxsIGJlIG1hZGUgcmVhZC1vbmx5LCB3aGljaCB3aWxsIGZsdXNoX2hhc2hfcGFnZS4KLQkgKiBCSUcgSVNTVUUgaGVyZTogaWYgdGhlIGtlcm5lbCB1c2VzIGEgcGFnZSBmcm9tIHVzZXJzcGFjZSB3aXRob3V0Ci0JICogdW5tYXBwaW5nIGl0IGZpcnN0LCBpdCBtYXkgc2VlIHRoZSBzcGVjdWxhdGVkIHZlcnNpb24uCi0JICovCi0JaWYgKGxvY2FsICYmIGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1RNKSAmJgotCSAgICBjdXJyZW50LT50aHJlYWQucmVncyAmJgotCSAgICBNU1JfVE1fQUNUSVZFKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IpKSB7Ci0JCXRtX2VuYWJsZSgpOwotCQl0bV9hYm9ydChUTV9DQVVTRV9UTEJJKTsKLQl9Ci0jZW5kaWYKKwl0bV9mbHVzaF9oYXNoX3BhZ2UobG9jYWwpOwogfQogCiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCkBAIC0xNTU3LDIyICsxNjQ2LDcgQEAKIAkJCQkJICAgICBNTVVfUEFHRV8xNk0sIHNzaXplLCBsb2NhbCk7CiAJfQogdG1fYWJvcnQ6Ci0jaWZkZWYgQ09ORklHX1BQQ19UUkFOU0FDVElPTkFMX01FTQotCS8qIFRyYW5zYWN0aW9ucyBhcmUgbm90IGFib3J0ZWQgYnkgdGxiaWVsLCBvbmx5IHRsYmllLgotCSAqIFdpdGhvdXQsIHN5bmNpbmcgYSBwYWdlIGJhY2sgdG8gYSBibG9jayBkZXZpY2Ugdy8gUElPIGNvdWxkIHBpY2sgdXAKLQkgKiB0cmFuc2FjdGlvbmFsIGRhdGEgKGJhZCEpIHNvIHdlIGZvcmNlIGFuIGFib3J0IGhlcmUuICBCZWZvcmUgdGhlCi0JICogc3luYyB0aGUgcGFnZSB3aWxsIGJlIG1hZGUgcmVhZC1vbmx5LCB3aGljaCB3aWxsIGZsdXNoX2hhc2hfcGFnZS4KLQkgKiBCSUcgSVNTVUUgaGVyZTogaWYgdGhlIGtlcm5lbCB1c2VzIGEgcGFnZSBmcm9tIHVzZXJzcGFjZSB3aXRob3V0Ci0JICogdW5tYXBwaW5nIGl0IGZpcnN0LCBpdCBtYXkgc2VlIHRoZSBzcGVjdWxhdGVkIHZlcnNpb24uCi0JICovCi0JaWYgKGxvY2FsICYmIGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1RNKSAmJgotCSAgICBjdXJyZW50LT50aHJlYWQucmVncyAmJgotCSAgICBNU1JfVE1fQUNUSVZFKGN1cnJlbnQtPnRocmVhZC5yZWdzLT5tc3IpKSB7Ci0JCXRtX2VuYWJsZSgpOwotCQl0bV9hYm9ydChUTV9DQVVTRV9UTEJJKTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm47CisJdG1fZmx1c2hfaGFzaF9wYWdlKGxvY2FsKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCA3MzcyZWUxLi5hNWQzZWNkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UuYwpAQCAtMTAxOSw4ICsxMDE5LDE1IEBACiAKIAlwdGUgPSBSRUFEX09OQ0UoKnB0ZXApOwogCW1hc2sgPSBfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUkVBRDsKKworCS8qCisJICogT24gc29tZSBDUFVzIGxpa2UgdGhlIDh4eCwgX1BBR0VfUlcgaGVuY2UgX1BBR0VfV1JJVEUgaXMgZGVmaW5lZAorCSAqIGFzIDAgYW5kIF9QQUdFX1JPIGhhcyB0byBiZSBzZXQgd2hlbiBhIHBhZ2UgaXMgbm90IHdyaXRhYmxlCisJICovCiAJaWYgKHdyaXRlKQogCQltYXNrIHw9IF9QQUdFX1dSSVRFOworCWVsc2UKKwkJbWFzayB8PSBfUEFHRV9STzsKIAogCWlmICgocHRlX3ZhbChwdGUpICYgbWFzaykgIT0gbWFzaykKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYwppbmRleCA0NDg2ODVmLi44YTdjMzhiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogCWlmIChtZW1ibG9jay5tZW1vcnkuY250ID4gMSkgewogI2lmbmRlZiBDT05GSUdfV0lJCiAJCW1lbWJsb2NrX2VuZm9yY2VfbWVtb3J5X2xpbWl0KG1lbWJsb2NrLm1lbW9yeS5yZWdpb25zWzBdLnNpemUpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJPbmx5IHVzaW5nIGZpcnN0IGNvbnRpZ3VvdXMgbWVtb3J5IHJlZ2lvbiIpOworCQlwcl93YXJuKCJPbmx5IHVzaW5nIGZpcnN0IGNvbnRpZ3VvdXMgbWVtb3J5IHJlZ2lvblxuIik7CiAjZWxzZQogCQl3aWlfbWVtb3J5X2ZpeHVwcygpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9pb21tdS5jCmluZGV4IGRhNmEyMTYuLmUwZjFjMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9pb21tdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9pb21tdS5jCkBAIC0xNSw2ICsxNSw5IEBACiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21pZ3JhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogCiBzdGF0aWMgREVGSU5FX01VVEVYKG1lbV9saXN0X211dGV4KTsKQEAgLTcyLDYgKzc1LDU1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbV9pb21tdV9wcmVyZWdpc3RlcmVkKTsKIAorLyoKKyAqIFRha2VuIGZyb20gYWxsb2NfbWlncmF0ZV90YXJnZXQgd2l0aCBjaGFuZ2VzIHRvIHJlbW92ZSBDTUEgYWxsb2NhdGlvbnMKKyAqLworc3RydWN0IHBhZ2UgKm5ld19pb21tdV9ub25fY21hX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwKKwkJCQkJaW50ICoqcmVzdWx0cCkKK3sKKwlnZnBfdCBnZnBfbWFzayA9IEdGUF9VU0VSOworCXN0cnVjdCBwYWdlICpuZXdfcGFnZTsKKworCWlmIChQYWdlSHVnZShwYWdlKSB8fCBQYWdlVHJhbnNIdWdlKHBhZ2UpIHx8IFBhZ2VDb21wb3VuZChwYWdlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCisJCWdmcF9tYXNrIHw9IF9fR0ZQX0hJR0hNRU07CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdGhlIGFsbG9jYXRpb24gdG8gZm9yY2UgYW4gT09NIGlmIHBvc3NpYmUKKwkgKi8KKwluZXdfcGFnZSA9IGFsbG9jX3BhZ2UoZ2ZwX21hc2sgfCBfX0dGUF9OT1JFVFJZIHwgX19HRlBfTk9XQVJOKTsKKwlyZXR1cm4gbmV3X3BhZ2U7Cit9CisKK3N0YXRpYyBpbnQgbW1faW9tbXVfbW92ZV9wYWdlX2Zyb21fY21hKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWludCByZXQgPSAwOworCUxJU1RfSEVBRChjbWFfbWlncmF0ZV9wYWdlcyk7CisKKwkvKiBJZ25vcmUgaHVnZSBwYWdlcyBmb3Igbm93ICovCisJaWYgKFBhZ2VIdWdlKHBhZ2UpIHx8IFBhZ2VUcmFuc0h1Z2UocGFnZSkgfHwgUGFnZUNvbXBvdW5kKHBhZ2UpKQorCQlyZXR1cm4gLUVCVVNZOworCisJbHJ1X2FkZF9kcmFpbigpOworCXJldCA9IGlzb2xhdGVfbHJ1X3BhZ2UocGFnZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWxpc3RfYWRkKCZwYWdlLT5scnUsICZjbWFfbWlncmF0ZV9wYWdlcyk7CisJcHV0X3BhZ2UocGFnZSk7IC8qIERyb3AgdGhlIGd1cCByZWZlcmVuY2UgKi8KKworCXJldCA9IG1pZ3JhdGVfcGFnZXMoJmNtYV9taWdyYXRlX3BhZ2VzLCBuZXdfaW9tbXVfbm9uX2NtYV9wYWdlLAorCQkJCU5VTEwsIDAsIE1JR1JBVEVfU1lOQywgTVJfQ01BKTsKKwlpZiAocmV0KSB7CisJCWlmICghbGlzdF9lbXB0eSgmY21hX21pZ3JhdGVfcGFnZXMpKQorCQkJcHV0YmFja19tb3ZhYmxlX3BhZ2VzKCZjbWFfbWlncmF0ZV9wYWdlcyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIGxvbmcgbW1faW9tbXVfZ2V0KHVuc2lnbmVkIGxvbmcgdWEsIHVuc2lnbmVkIGxvbmcgZW50cmllcywKIAkJc3RydWN0IG1tX2lvbW11X3RhYmxlX2dyb3VwX21lbV90ICoqcG1lbSkKIHsKQEAgLTEyNCwxNSArMTc2LDM2IEBACiAJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7ICsraSkgewogCQlpZiAoMSAhPSBnZXRfdXNlcl9wYWdlc19mYXN0KHVhICsgKGkgPDwgUEFHRV9TSElGVCksCiAJCQkJCTEvKiBwYWdlcyAqLywgMS8qIGlzd3JpdGUgKi8sICZwYWdlKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWZvciAoaiA9IDA7IGogPCBpOyArK2opCi0JCQkJcHV0X3BhZ2UocGZuX3RvX3BhZ2UoCi0JCQkJCQltZW0tPmhwYXNbal0gPj4gUEFHRV9TSElGVCkpOworCQkJCXB1dF9wYWdlKHBmbl90b19wYWdlKG1lbS0+aHBhc1tqXSA+PgorCQkJCQkJUEFHRV9TSElGVCkpOwogCQkJdmZyZWUobWVtLT5ocGFzKTsKIAkJCWtmcmVlKG1lbSk7Ci0JCQlyZXQgPSAtRUZBVUxUOwogCQkJZ290byB1bmxvY2tfZXhpdDsKIAkJfQotCisJCS8qCisJCSAqIElmIHdlIGdldCBhIHBhZ2UgZnJvbSB0aGUgQ01BIHpvbmUsIHNpbmNlIHdlIGFyZSBnb2luZyB0bworCQkgKiBiZSBwaW5uaW5nIHRoZXNlIGVudHJpZXMsIHdlIG1pZ2h0IGFzIHdlbGwgbW92ZSB0aGVtIG91dAorCQkgKiBvZiB0aGUgQ01BIHpvbmUgaWYgcG9zc2libGUuIE5PVEU6IGZhdWx0aW5nIGluICsgbWlncmF0aW9uCisJCSAqIGNhbiBiZSBleHBlbnNpdmUuIEJhdGNoaW5nIGNhbiBiZSBjb25zaWRlcmVkIGxhdGVyCisJCSAqLworCQlpZiAoZ2V0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlKSA9PSBNSUdSQVRFX0NNQSkgeworCQkJaWYgKG1tX2lvbW11X21vdmVfcGFnZV9mcm9tX2NtYShwYWdlKSkKKwkJCQlnb3RvIHBvcHVsYXRlOworCQkJaWYgKDEgIT0gZ2V0X3VzZXJfcGFnZXNfZmFzdCh1YSArIChpIDw8IFBBR0VfU0hJRlQpLAorCQkJCQkJMS8qIHBhZ2VzICovLCAxLyogaXN3cml0ZSAqLywKKwkJCQkJCSZwYWdlKSkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZm9yIChqID0gMDsgaiA8IGk7ICsraikKKwkJCQkJcHV0X3BhZ2UocGZuX3RvX3BhZ2UobWVtLT5ocGFzW2pdID4+CisJCQkJCQkJCVBBR0VfU0hJRlQpKTsKKwkJCQl2ZnJlZShtZW0tPmhwYXMpOworCQkJCWtmcmVlKG1lbSk7CisJCQkJZ290byB1bmxvY2tfZXhpdDsKKwkJCX0KKwkJfQorcG9wdWxhdGU6CiAJCW1lbS0+aHBhc1tpXSA9IHBhZ2VfdG9fcGZuKHBhZ2UpIDw8IFBBR0VfU0hJRlQ7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfbm9oYXNoLmMgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfbm9oYXNoLmMKaW5kZXggN2Q5NWJjNC4uYzQ5MWYyYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X25vaGFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9ub2hhc2guYwpAQCAtMzY5LDQ0ICszNjksMzQgQEAKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKLQotc3RhdGljIGludCBtbXVfY29udGV4dF9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCBtbXVfY3R4X2NwdV9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBpbnQpKGxvbmcpaGNwdTsKLQogCS8qIFdlIGRvbid0IHRvdWNoIENQVSAwIG1hcCwgaXQncyBhbGxvY2F0ZWQgYXQgYWJvb3QgYW5kIGtlcHQKIAkgKiBhcm91bmQgZm9yZXZlcgogCSAqLwogCWlmIChjcHUgPT0gYm9vdF9jcHVpZCkKLQkJcmV0dXJuIE5PVElGWV9PSzsKKwkJcmV0dXJuIDA7CiAKLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX1VQX1BSRVBBUkU6Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRV9GUk9aRU46Ci0JCXByX2RldmVsKCJNTVU6IEFsbG9jYXRpbmcgc3RhbGUgY29udGV4dCBtYXAgZm9yIENQVSAlZFxuIiwgY3B1KTsKLQkJc3RhbGVfbWFwW2NwdV0gPSBremFsbG9jKENUWF9NQVBfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCWJyZWFrOwotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOgotCWNhc2UgQ1BVX1VQX0NBTkNFTEVEX0ZST1pFTjoKLQljYXNlIENQVV9ERUFEOgotCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQlwcl9kZXZlbCgiTU1VOiBGcmVlaW5nIHN0YWxlIGNvbnRleHQgbWFwIGZvciBDUFUgJWRcbiIsIGNwdSk7Ci0JCWtmcmVlKHN0YWxlX21hcFtjcHVdKTsKLQkJc3RhbGVfbWFwW2NwdV0gPSBOVUxMOwotCi0JCS8qIFdlIGFsc28gY2xlYXIgdGhlIGNwdV92bV9tYXNrIGJpdHMgb2YgQ1BVcyBnb2luZyBhd2F5ICovCi0JCWNsZWFyX3Rhc2tzX21tX2NwdW1hc2soY3B1KTsKLQlicmVhazsKLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlwcl9kZXZlbCgiTU1VOiBBbGxvY2F0aW5nIHN0YWxlIGNvbnRleHQgbWFwIGZvciBDUFUgJWRcbiIsIGNwdSk7CisJc3RhbGVfbWFwW2NwdV0gPSBremFsbG9jKENUWF9NQVBfU0laRSwgR0ZQX0tFUk5FTCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbW11X2NvbnRleHRfY3B1X25iID0gewotCS5ub3RpZmllcl9jYWxsCT0gbW11X2NvbnRleHRfY3B1X25vdGlmeSwKLX07CitzdGF0aWMgaW50IG1tdV9jdHhfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKK3sKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlpZiAoY3B1ID09IGJvb3RfY3B1aWQpCisJCXJldHVybiAwOworCisJcHJfZGV2ZWwoIk1NVTogRnJlZWluZyBzdGFsZSBjb250ZXh0IG1hcCBmb3IgQ1BVICVkXG4iLCBjcHUpOworCWtmcmVlKHN0YWxlX21hcFtjcHVdKTsKKwlzdGFsZV9tYXBbY3B1XSA9IE5VTEw7CisKKwkvKiBXZSBhbHNvIGNsZWFyIHRoZSBjcHVfdm1fbWFzayBiaXRzIG9mIENQVXMgZ29pbmcgYXdheSAqLworCWNsZWFyX3Rhc2tzX21tX2NwdW1hc2soY3B1KTsKKyNlbmRpZgorCXJldHVybiAwOworfQogCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCkBAIC00NjksNyArNDU5LDkgQEAKICNlbHNlCiAJc3RhbGVfbWFwW2Jvb3RfY3B1aWRdID0gbWVtYmxvY2tfdmlydF9hbGxvYyhDVFhfTUFQX1NJWkUsIDApOwogCi0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZtbXVfY29udGV4dF9jcHVfbmIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfUE9XRVJQQ19NTVVfQ1RYX1BSRVBBUkUsCisJCQkJICAicG93ZXJwYy9tbXUvY3R4OnByZXBhcmUiLAorCQkJCSAgbW11X2N0eF9jcHVfcHJlcGFyZSwgbW11X2N0eF9jcHVfZGVhZCk7CiAjZW5kaWYKIAogCXByaW50ayhLRVJOX0lORk8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlLWJvb2szczY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZS1ib29rM3M2NC5jCmluZGV4IDM0MDc5MzAuLmY0ZjQzN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlLWJvb2szczY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGUtYm9vazNzNjQuYwpAQCAtMzUsNyArMzUsNyBAQAogI2VuZGlmCiAJY2hhbmdlZCA9ICFwbWRfc2FtZSgqKHBtZHApLCBlbnRyeSk7CiAJaWYgKGNoYW5nZWQpIHsKLQkJX19wdGVwX3NldF9hY2Nlc3NfZmxhZ3MocG1kcF9wdGVwKHBtZHApLCBwbWRfcHRlKGVudHJ5KSk7CisJCV9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYS0+dm1fbW0sIHBtZHBfcHRlcChwbWRwKSwgcG1kX3B0ZShlbnRyeSkpOwogCQlmbHVzaF9wbWRfdGxiX3JhbmdlKHZtYSwgYWRkcmVzcywgYWRkcmVzcyArIEhQQUdFX1BNRF9TSVpFKTsKIAl9CiAJcmV0dXJuIGNoYW5nZWQ7CkBAIC0xMTYsMyArMTE2LDEyIEBACiAJcmV0dXJuOwogfQogI2VuZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLworCisvKiBGb3IgdXNlIGJ5IGtleGVjICovCit2b2lkIG1tdV9jbGVhbnVwX2FsbCh2b2lkKQoreworCWlmIChyYWRpeF9lbmFibGVkKCkpCisJCXJhZGl4X19tbXVfY2xlYW51cF9hbGwoKTsKKwllbHNlIGlmIChtbXVfaGFzaF9vcHMuaHB0ZV9jbGVhcl9hbGwpCisJCW1tdV9oYXNoX29wcy5ocHRlX2NsZWFyX2FsbCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGUtcmFkaXguYyBiL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlLXJhZGl4LmMKaW5kZXggYWY4OTdkOS4uZWQ3YmRkYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3BndGFibGUtcmFkaXguYworKysgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZS1yYWRpeC5jCkBAIC0yOTQsNiArMjk0LDMyIEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCB1cGRhdGVfaGlkX2Zvcl9yYWRpeCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgaGlkMDsKKwl1bnNpZ25lZCBsb25nIHJiID0gM1VMIDw8IFBQQ19CSVRMU0hJRlQoNTMpOyAvKiBJUyA9IDMgKi8KKworCWFzbSB2b2xhdGlsZSgicHRlc3luYyI6IDogOiJtZW1vcnkiKTsKKwkvKiBwcnMgPSAwLCByaWMgPSAyLCBycyA9IDAsIHIgPSAxIGlzID0gMyAqLworCWFzbSB2b2xhdGlsZShQUENfVExCSUVfNSglMCwgJTQsICUzLCAlMiwgJTEpCisJCSAgICAgOiA6ICJyIihyYiksICJpIigxKSwgImkiKDApLCAiaSIoMiksICJyIigwKSA6ICJtZW1vcnkiKTsKKwkvKiBwcnMgPSAxLCByaWMgPSAyLCBycyA9IDAsIHIgPSAxIGlzID0gMyAqLworCWFzbSB2b2xhdGlsZShQUENfVExCSUVfNSglMCwgJTQsICUzLCAlMiwgJTEpCisJCSAgICAgOiA6ICJyIihyYiksICJpIigxKSwgImkiKDEpLCAiaSIoMiksICJyIigwKSA6ICJtZW1vcnkiKTsKKwlhc20gdm9sYXRpbGUoImVpZWlvOyB0bGJzeW5jOyBwdGVzeW5jOyBpc3luYzsgc2xiaWEiOiA6IDoibWVtb3J5Iik7CisJLyoKKwkgKiBub3cgc3dpdGNoIHRoZSBISUQKKwkgKi8KKwloaWQwICA9IG1mc3ByKFNQUk5fSElEMCk7CisJaGlkMCB8PSBISUQwX1BPV0VSOV9SQURJWDsKKwltdHNwcihTUFJOX0hJRDAsIGhpZDApOworCWFzbSB2b2xhdGlsZSgiaXN5bmMiOiA6IDoibWVtb3J5Iik7CisKKwkvKiBXYWl0IGZvciBpdCB0byBoYXBwZW4gKi8KKwl3aGlsZSAoIShtZnNwcihTUFJOX0hJRDApICYgSElEMF9QT1dFUjlfUkFESVgpKQorCQljcHVfcmVsYXgoKTsKK30KKwogdm9pZCBfX2luaXQgcmFkaXhfX2Vhcmx5X2luaXRfbW11KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBscGNyOwpAQCAtMzQ1LDYgKzM3MSw4IEBACiAKIAlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpIHsKIAkJcmFkaXhfaW5pdF9uYXRpdmUoKTsKKwkJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1BPV0VSOV9ERDEpKQorCQkJdXBkYXRlX2hpZF9mb3JfcmFkaXgoKTsKIAkJbHBjciA9IG1mc3ByKFNQUk5fTFBDUik7CiAJCW10c3ByKFNQUk5fTFBDUiwgbHBjciB8IExQQ1JfVVBSVCB8IExQQ1JfSFIpOwogCQlyYWRpeF9pbml0X3BhcnRpdGlvbl90YWJsZSgpOwpAQCAtMzY4LDYgKzM5NiwxOCBAQAogCX0KIH0KIAordm9pZCByYWRpeF9fbW11X2NsZWFudXBfYWxsKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBscGNyOworCisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKSB7CisJCWxwY3IgPSBtZnNwcihTUFJOX0xQQ1IpOworCQltdHNwcihTUFJOX0xQQ1IsIGxwY3IgJiB+TFBDUl9VUFJUKTsKKwkJbXRzcHIoU1BSTl9QVENSLCAwKTsKKwkJcmFkaXhfX2ZsdXNoX3RsYl9hbGwoKTsKKwl9Cit9CisKIHZvaWQgcmFkaXhfX3NldHVwX2luaXRpYWxfbWVtb3J5X2xpbWl0KHBoeXNfYWRkcl90IGZpcnN0X21lbWJsb2NrX2Jhc2UsCiAJCQkJcGh5c19hZGRyX3QgZmlyc3RfbWVtYmxvY2tfc2l6ZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlLmMgYi9hcmNoL3Bvd2VycGMvbW0vcGd0YWJsZS5jCmluZGV4IDBiNmZiMjQuLjkxMWZkZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3BndGFibGUuYwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJaWYgKGNoYW5nZWQpIHsKIAkJaWYgKCFpc192bV9odWdldGxiX3BhZ2Uodm1hKSkKIAkJCWFzc2VydF9wdGVfbG9ja2VkKHZtYS0+dm1fbW0sIGFkZHJlc3MpOwotCQlfX3B0ZXBfc2V0X2FjY2Vzc19mbGFncyhwdGVwLCBlbnRyeSk7CisJCV9fcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYS0+dm1fbW0sIHB0ZXAsIGVudHJ5KTsKIAkJZmx1c2hfdGxiX3BhZ2Uodm1hLCBhZGRyZXNzKTsKIAl9CiAJcmV0dXJuIGNoYW5nZWQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vc2xiX2xvdy5TIGIvYXJjaC9wb3dlcnBjL21tL3NsYl9sb3cuUwppbmRleCBkZmRiOTBjLi5lMjk3NGZjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vc2xiX2xvdy5TCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9zbGJfbG93LlMKQEAgLTExMyw3ICsxMTMsMTIgQEAKIEVORF9NTVVfRlRSX1NFQ1RJT05fSUZDTFIoTU1VX0ZUUl8xVF9TRUdNRU5UKQogCWIJc2xiX2ZpbmlzaF9sb2FkXzFUCiAKLTA6CiswOgkvKgorCSAqIEZvciB1c2Vyc3BhY2UgYWRkcmVzc2VzLCBtYWtlIHN1cmUgdGhpcyBpcyByZWdpb24gMC4KKwkgKi8KKwljbXBkaQlyOSwgMAorCWJuZQk4ZgorCiAJLyogd2hlbiB1c2luZyBzbGljZXMsIHdlIGV4dHJhY3QgdGhlIHBzaXplIG9mZiB0aGUgc2xpY2UgYml0bWFwcwogCSAqIGFuZCB0aGVuIHdlIG5lZWQgdG8gZ2V0IHRoZSBzbGxwIGVuY29kaW5nIG9mZiB0aGUgbW11X3BzaXplX2RlZnMKIAkgKiBhcnJheS4KQEAgLTE3MywxMSArMTc4LDkgQEAKIEVORF9NTVVfRlRSX1NFQ1RJT05fSUZTRVQoTU1VX0ZUUl8xVF9TRUdNRU5UKQogCWIJc2xiX2ZpbmlzaF9sb2FkCiAKLTg6CS8qIGludmFsaWQgRUEgKi8KLQlsaQlyMTAsMAkJCS8qIEJBRF9WU0lEICovCi0JbGkJcjksMAkJCS8qIEJBRF9WU0lEICovCi0JbGkJcjExLFNMQl9WU0lEX1VTRVIJLyogZmxhZ3MgZG9uJ3QgbXVjaCBtYXR0ZXIgKi8KLQliCXNsYl9maW5pc2hfbG9hZAorODoJLyogaW52YWxpZCBFQSAtIHJldHVybiBhbiBlcnJvciBpbmRpY2F0aW9uICovCisJY3JzZXQJNCpjcjArZXEJCS8qIGluZGljYXRlIGZhaWx1cmUgKi8KKwlibHIKIAogLyoKICAqIEZpbmlzaCBsb2FkaW5nIG9mIGFuIFNMQiBlbnRyeSBhbmQgcmV0dXJuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vdGxiLXJhZGl4LmMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiLXJhZGl4LmMKaW5kZXggNDhkZjA1ZS4uMGU0OWVjNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYi1yYWRpeC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS90bGItcmFkaXguYwpAQCAtNDAwLDMgKzQwMCwyNyBAQAogCXJhZGl4X19mbHVzaF90bGJfcmFuZ2VfcHNpemUodm1hLT52bV9tbSwgc3RhcnQsIGVuZCwgTU1VX1BBR0VfMk0pOwogfQogRVhQT1JUX1NZTUJPTChyYWRpeF9fZmx1c2hfcG1kX3RsYl9yYW5nZSk7CisKK3ZvaWQgcmFkaXhfX2ZsdXNoX3RsYl9hbGwodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJiLHBycyxyLHJzOworCXVuc2lnbmVkIGxvbmcgcmljID0gUklDX0ZMVVNIX0FMTDsKKworCXJiID0gMHgzIDw8IFBQQ19CSVRMU0hJRlQoNTMpOyAvKiBJUyA9IDMgKi8KKwlwcnMgPSAwOyAvKiBwYXJ0aXRpb24gc2NvcGVkICovCisJciA9IDE7ICAgLyogcmFpZHggZm9ybWF0ICovCisJcnMgPSAxICYgKCgxVUwgPDwgMzIpIC0gMSk7IC8qIGFueSBMUElEIHZhbHVlIHRvIGZsdXNoIGd1ZXN0IG1hcHBpbmdzICovCisKKwlhc20gdm9sYXRpbGUoInB0ZXN5bmMiOiA6IDoibWVtb3J5Iik7CisJLyoKKwkgKiBub3cgZmx1c2ggZ3Vlc3QgZW50cmllcyBieSBwYXNzaW5nIFBSUyA9IDEgYW5kIExQSUQgIT0gMAorCSAqLworCWFzbSB2b2xhdGlsZShQUENfVExCSUVfNSglMCwgJTQsICUzLCAlMiwgJTEpCisJCSAgICAgOiA6ICJyIihyYiksICJpIihyKSwgImkiKDEpLCAiaSIocmljKSwgInIiKHJzKSA6ICJtZW1vcnkiKTsKKwkvKgorCSAqIG5vdyBmbHVzaCBob3N0IGVudGlyZXMgYnkgcGFzc2luZyBQUlMgPSAwIGFuZCBMUElEID09IDAKKwkgKi8KKwlhc20gdm9sYXRpbGUoUFBDX1RMQklFXzUoJTAsICU0LCAlMywgJTIsICUxKQorCQkgICAgIDogOiAiciIocmIpLCAiaSIociksICJpIihwcnMpLCAiaSIocmljKSwgInIiKDApIDogIm1lbW9yeSIpOworCWFzbSB2b2xhdGlsZSgiZWllaW87IHRsYnN5bmM7IHB0ZXN5bmMiOiA6IDoibWVtb3J5Iik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXQuaCBiL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdC5oCmluZGV4IGQ1MzAxYjYuLjg5ZjcwMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdC5oCisrKyBiL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdC5oCkBAIC00MCw2ICs0MCw4IEBACiAjZGVmaW5lIFBQQ19CTFIoKQkJRU1JVChQUENfSU5TVF9CTFIpCiAjZGVmaW5lIFBQQ19CTFJMKCkJCUVNSVQoUFBDX0lOU1RfQkxSTCkKICNkZWZpbmUgUFBDX01UTFIocikJCUVNSVQoUFBDX0lOU1RfTVRMUiB8IF9fX1BQQ19SVChyKSkKKyNkZWZpbmUgUFBDX0JDVFIoKQkJRU1JVChQUENfSU5TVF9CQ1RSKQorI2RlZmluZSBQUENfTVRDVFIocikJCUVNSVQoUFBDX0lOU1RfTVRDVFIgfCBfX19QUENfUlQocikpCiAjZGVmaW5lIFBQQ19BRERJKGQsIGEsIGkpCUVNSVQoUFBDX0lOU1RfQURESSB8IF9fX1BQQ19SVChkKSB8CSAgICAgIFwKIAkJCQkgICAgIF9fX1BQQ19SQShhKSB8IElNTV9MKGkpKQogI2RlZmluZSBQUENfTVIoZCwgYSkJCVBQQ19PUihkLCBhLCBhKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0NjQuaCBiL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdDY0LmgKaW5kZXggNTA0NmQ2Zi4uNjJmYTc1OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0NjQuaAorKysgYi9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXQ2NC5oCkBAIC0xNiwzMCArMTYsMzMgQEAKIAogLyoKICAqIFN0YWNrIGxheW91dDoKKyAqIEVuc3VyZSB0aGUgdG9wIGhhbGYgKHVwdG8gbG9jYWxfdG1wX3Zhcikgc3RheXMgY29uc2lzdGVudAorICogd2l0aCBvdXIgcmVkem9uZSB1c2FnZS4KICAqCiAgKgkJWwlwcmV2IHNwCQldIDwtLS0tLS0tLS0tLS0tCiAgKgkJWyAgIG52IGdwciBzYXZlIGFyZWEJXSA4KjgJCXwKKyAqCQlbICAgIHRhaWxfY2FsbF9jbnQJXSA4CQl8CisgKgkJWyAgICBsb2NhbF90bXBfdmFyCV0gOAkJfAogICogZnAgKHIzMSkgLS0+CVsgICBlYnBmIHN0YWNrIHNwYWNlCV0gNTEyCQl8Ci0gKgkJWyAgbG9jYWwvdG1wIHZhciBzcGFjZQldIDE2CQl8CiAgKgkJWyAgICAgZnJhbWUgaGVhZGVyCV0gMzIvMTEyCXwKICAqIHNwIChyMSkgLS0tPglbICAgIHN0YWNrIHBvaW50ZXIJXSAtLS0tLS0tLS0tLS0tLQogICovCiAKLS8qIGZvciBicGYgSklUIGNvZGUgaW50ZXJuYWwgdXNhZ2UgKi8KLSNkZWZpbmUgQlBGX1BQQ19TVEFDS19MT0NBTFMJMTYKIC8qIGZvciBncHIgbm9uIHZvbGF0aWxlIHJlZ2lzdGVycyBCUEdfUkVHXzYgdG8gMTAsIHBsdXMgc2tiIGNhY2hlIHJlZ2lzdGVycyAqLwogI2RlZmluZSBCUEZfUFBDX1NUQUNLX1NBVkUJKDgqOCkKKy8qIGZvciBicGYgSklUIGNvZGUgaW50ZXJuYWwgdXNhZ2UgKi8KKyNkZWZpbmUgQlBGX1BQQ19TVEFDS19MT0NBTFMJMTYKIC8qIEVuc3VyZSB0aGlzIGlzIHF1YWR3b3JkIGFsaWduZWQgKi8KLSNkZWZpbmUgQlBGX1BQQ19TVEFDS0ZSQU1FCShTVEFDS19GUkFNRV9NSU5fU0laRSArIEJQRl9QUENfU1RBQ0tfTE9DQUxTICsgXAotCQkJCSBNQVhfQlBGX1NUQUNLICsgQlBGX1BQQ19TVEFDS19TQVZFKQorI2RlZmluZSBCUEZfUFBDX1NUQUNLRlJBTUUJKFNUQUNLX0ZSQU1FX01JTl9TSVpFICsgTUFYX0JQRl9TVEFDSyArIFwKKwkJCQkgQlBGX1BQQ19TVEFDS19MT0NBTFMgKyBCUEZfUFBDX1NUQUNLX1NBVkUpCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIC8qIEJQRiByZWdpc3RlciB1c2FnZSAqLwotI2RlZmluZSBTS0JfSExFTl9SRUcJKE1BWF9CUEZfUkVHICsgMCkKLSNkZWZpbmUgU0tCX0RBVEFfUkVHCShNQVhfQlBGX1JFRyArIDEpCi0jZGVmaW5lIFRNUF9SRUdfMQkoTUFYX0JQRl9SRUcgKyAyKQotI2RlZmluZSBUTVBfUkVHXzIJKE1BWF9CUEZfUkVHICsgMykKKyNkZWZpbmUgU0tCX0hMRU5fUkVHCShNQVhfQlBGX0pJVF9SRUcgKyAwKQorI2RlZmluZSBTS0JfREFUQV9SRUcJKE1BWF9CUEZfSklUX1JFRyArIDEpCisjZGVmaW5lIFRNUF9SRUdfMQkoTUFYX0JQRl9KSVRfUkVHICsgMikKKyNkZWZpbmUgVE1QX1JFR18yCShNQVhfQlBGX0pJVF9SRUcgKyAzKQogCiAvKiBCUEYgdG8gcHBjIHJlZ2lzdGVyIG1hcHBpbmdzICovCiBzdGF0aWMgY29uc3QgaW50IGIycFtdID0gewpAQCAtNTksMTIgKzYyLDE2IEBACiAJLyogZnJhbWUgcG9pbnRlciBha2EgQlBGX1JFR18xMCAqLwogCVtCUEZfUkVHX0ZQXSA9IDMxLAogCS8qIGVCUEYgaml0IGludGVybmFsIHJlZ2lzdGVycyAqLworCVtCUEZfUkVHX0FYXSA9IDIsCiAJW1NLQl9ITEVOX1JFR10gPSAyNSwKIAlbU0tCX0RBVEFfUkVHXSA9IDI2LAogCVtUTVBfUkVHXzFdID0gOSwKIAlbVE1QX1JFR18yXSA9IDEwCiB9OwogCisvKiBQUEMgTlZSIHJhbmdlIC0tIHVwZGF0ZSB0aGlzIGlmIHdlIGV2ZXIgdXNlIE5WUnMgYmVsb3cgcjI0ICovCisjZGVmaW5lIEJQRl9QUENfTlZSX01JTgkJMjQKKwogLyogQXNzZW1ibHkgaGVscGVycyAqLwogI2RlZmluZSBERUNMQVJFX0xPQURfRlVOQyhmdW5jKQl1NjQgZnVuYyh1NjQgcjMsIHU2NCByNCk7CQkJXAogCQkJCXU2NCBmdW5jIyNfbmVnYXRpdmVfb2Zmc2V0KHU2NCByMywgdTY0IHI0KTsJXApAQCAtODIsNiArODksNyBAQAogI2RlZmluZSBTRUVOX0ZVTkMJMHgxMDAwIC8qIG1pZ2h0IGNhbGwgZXh0ZXJuYWwgaGVscGVycyAqLwogI2RlZmluZSBTRUVOX1NUQUNLCTB4MjAwMCAvKiB1c2VzIEJQRiBzdGFjayAqLwogI2RlZmluZSBTRUVOX1NLQgkweDQwMDAgLyogdXNlcyBza19idWZmICovCisjZGVmaW5lIFNFRU5fVEFJTENBTEwJMHg4MDAwIC8qIHVzZXMgdGFpbCBjYWxscyAqLwogCiBzdHJ1Y3QgY29kZWdlbl9jb250ZXh0IHsKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0X2NvbXA2NC5jIGIvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0X2NvbXA2NC5jCmluZGV4IDYwNzNiNzguLjBmZTk4YTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF9jb21wNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcDY0LmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8YXNtL2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KIAogI2luY2x1ZGUgImJwZl9qaXQ2NC5oIgogCkBAIC01OCw2ICs1OSw0MCBAQAogCXJldHVybiBjdHgtPnNlZW4gJiBTRUVOX0ZVTkMgfHwgYnBmX2lzX3NlZW5fcmVnaXN0ZXIoY3R4LCBCUEZfUkVHX0ZQKTsKIH0KIAorLyoKKyAqIFdoZW4gbm90IHNldHRpbmcgdXAgb3VyIG93biBzdGFja2ZyYW1lLCB0aGUgcmVkem9uZSB1c2FnZSBpczoKKyAqCisgKgkJWwlwcmV2IHNwCQldIDwtLS0tLS0tLS0tLS0tCisgKgkJWwkgIC4uLiAgICAgICAJXSAJCXwKKyAqIHNwIChyMSkgLS0tPglbICAgIHN0YWNrIHBvaW50ZXIJXSAtLS0tLS0tLS0tLS0tLQorICoJCVsgICBudiBncHIgc2F2ZSBhcmVhCV0gOCo4CisgKgkJWyAgICB0YWlsX2NhbGxfY250CV0gOAorICoJCVsgICAgbG9jYWxfdG1wX3ZhcgldIDgKKyAqCQlbICAgdW51c2VkIHJlZCB6b25lCV0gMjA4IGJ5dGVzIHByb3RlY3RlZAorICovCitzdGF0aWMgaW50IGJwZl9qaXRfc3RhY2tfbG9jYWwoc3RydWN0IGNvZGVnZW5fY29udGV4dCAqY3R4KQoreworCWlmIChicGZfaGFzX3N0YWNrX2ZyYW1lKGN0eCkpCisJCXJldHVybiBTVEFDS19GUkFNRV9NSU5fU0laRSArIE1BWF9CUEZfU1RBQ0s7CisJZWxzZQorCQlyZXR1cm4gLShCUEZfUFBDX1NUQUNLX1NBVkUgKyAxNik7Cit9CisKK3N0YXRpYyBpbnQgYnBmX2ppdF9zdGFja190YWlsY2FsbGNudChzdHJ1Y3QgY29kZWdlbl9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIGJwZl9qaXRfc3RhY2tfbG9jYWwoY3R4KSArIDg7Cit9CisKK3N0YXRpYyBpbnQgYnBmX2ppdF9zdGFja19vZmZzZXRvZihzdHJ1Y3QgY29kZWdlbl9jb250ZXh0ICpjdHgsIGludCByZWcpCit7CisJaWYgKHJlZyA+PSBCUEZfUFBDX05WUl9NSU4gJiYgcmVnIDwgMzIpCisJCXJldHVybiAoYnBmX2hhc19zdGFja19mcmFtZShjdHgpID8gQlBGX1BQQ19TVEFDS0ZSQU1FIDogMCkKKwkJCQkJCQktICg4ICogKDMyIC0gcmVnKSk7CisKKwlwcl9lcnIoIkJQRiBKSVQgaXMgYXNraW5nIGFib3V0IHVua25vd24gcmVnaXN0ZXJzIik7CisJQlVHKCk7Cit9CisKIHN0YXRpYyB2b2lkIGJwZl9qaXRfZW1pdF9za2JfbG9hZHModTMyICppbWFnZSwgc3RydWN0IGNvZGVnZW5fY29udGV4dCAqY3R4KQogewogCS8qCkBAIC03Myw2ICsxMDgsMTAzIEBACiAJUFBDX0JQRl9MTChiMnBbU0tCX0RBVEFfUkVHXSwgMywgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRhdGEpKTsKIH0KIAorc3RhdGljIHZvaWQgYnBmX2ppdF9idWlsZF9wcm9sb2d1ZSh1MzIgKmltYWdlLCBzdHJ1Y3QgY29kZWdlbl9jb250ZXh0ICpjdHgpCit7CisJaW50IGk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGFpbF9jYWxsX2NudCBpZiB3ZSBkbyB0YWlsIGNhbGxzLgorCSAqIE90aGVyd2lzZSwgcHV0IGluIE5PUHMgc28gdGhhdCBpdCBjYW4gYmUgc2tpcHBlZCB3aGVuIHdlIGFyZQorCSAqIGludm9rZWQgdGhyb3VnaCBhIHRhaWwgY2FsbC4KKwkgKi8KKwlpZiAoY3R4LT5zZWVuICYgU0VFTl9UQUlMQ0FMTCkgeworCQlQUENfTEkoYjJwW1RNUF9SRUdfMV0sIDApOworCQkvKiB0aGlzIGdvZXMgaW4gdGhlIHJlZHpvbmUgKi8KKwkJUFBDX0JQRl9TVEwoYjJwW1RNUF9SRUdfMV0sIDEsIC0oQlBGX1BQQ19TVEFDS19TQVZFICsgOCkpOworCX0gZWxzZSB7CisJCVBQQ19OT1AoKTsKKwkJUFBDX05PUCgpOworCX0KKworI2RlZmluZSBCUEZfVEFJTENBTExfUFJPTE9HVUVfU0laRQk4CisKKwlpZiAoYnBmX2hhc19zdGFja19mcmFtZShjdHgpKSB7CisJCS8qCisJCSAqIFdlIG5lZWQgYSBzdGFjayBmcmFtZSwgYnV0IHdlIGRvbid0IG5lY2Vzc2FyaWx5IG5lZWQgdG8KKwkJICogc2F2ZS9yZXN0b3JlIExSIHVubGVzcyB3ZSBjYWxsIG90aGVyIGZ1bmN0aW9ucworCQkgKi8KKwkJaWYgKGN0eC0+c2VlbiAmIFNFRU5fRlVOQykgeworCQkJRU1JVChQUENfSU5TVF9NRkxSIHwgX19QUENfUlQoUjApKTsKKwkJCVBQQ19CUEZfU1RMKDAsIDEsIFBQQ19MUl9TVEtPRkYpOworCQl9CisKKwkJUFBDX0JQRl9TVExVKDEsIDEsIC1CUEZfUFBDX1NUQUNLRlJBTUUpOworCX0KKworCS8qCisJICogQmFjayB1cCBub24tdm9sYXRpbGUgcmVncyAtLSBCUEYgcmVnaXN0ZXJzIDYtMTAKKwkgKiBJZiB3ZSBoYXZlbid0IGNyZWF0ZWQgb3VyIG93biBzdGFjayBmcmFtZSwgd2Ugc2F2ZSB0aGVzZQorCSAqIGluIHRoZSBwcm90ZWN0ZWQgem9uZSBiZWxvdyB0aGUgcHJldmlvdXMgc3RhY2sgZnJhbWUKKwkgKi8KKwlmb3IgKGkgPSBCUEZfUkVHXzY7IGkgPD0gQlBGX1JFR18xMDsgaSsrKQorCQlpZiAoYnBmX2lzX3NlZW5fcmVnaXN0ZXIoY3R4LCBpKSkKKwkJCVBQQ19CUEZfU1RMKGIycFtpXSwgMSwgYnBmX2ppdF9zdGFja19vZmZzZXRvZihjdHgsIGIycFtpXSkpOworCisJLyoKKwkgKiBTYXZlIGFkZGl0aW9uYWwgbm9uLXZvbGF0aWxlIHJlZ3MgaWYgd2UgY2FjaGUgc2tiCisJICogQWxzbywgc2V0dXAgc2tiIGRhdGEKKwkgKi8KKwlpZiAoY3R4LT5zZWVuICYgU0VFTl9TS0IpIHsKKwkJUFBDX0JQRl9TVEwoYjJwW1NLQl9ITEVOX1JFR10sIDEsCisJCQkJYnBmX2ppdF9zdGFja19vZmZzZXRvZihjdHgsIGIycFtTS0JfSExFTl9SRUddKSk7CisJCVBQQ19CUEZfU1RMKGIycFtTS0JfREFUQV9SRUddLCAxLAorCQkJCWJwZl9qaXRfc3RhY2tfb2Zmc2V0b2YoY3R4LCBiMnBbU0tCX0RBVEFfUkVHXSkpOworCQlicGZfaml0X2VtaXRfc2tiX2xvYWRzKGltYWdlLCBjdHgpOworCX0KKworCS8qIFNldHVwIGZyYW1lIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIGJwZiBzdGFjayBhcmVhICovCisJaWYgKGJwZl9pc19zZWVuX3JlZ2lzdGVyKGN0eCwgQlBGX1JFR19GUCkpCisJCVBQQ19BRERJKGIycFtCUEZfUkVHX0ZQXSwgMSwKKwkJCQlTVEFDS19GUkFNRV9NSU5fU0laRSArIE1BWF9CUEZfU1RBQ0spOworfQorCitzdGF0aWMgdm9pZCBicGZfaml0X2VtaXRfY29tbW9uX2VwaWxvZ3VlKHUzMiAqaW1hZ2UsIHN0cnVjdCBjb2RlZ2VuX2NvbnRleHQgKmN0eCkKK3sKKwlpbnQgaTsKKworCS8qIFJlc3RvcmUgTlZScyAqLworCWZvciAoaSA9IEJQRl9SRUdfNjsgaSA8PSBCUEZfUkVHXzEwOyBpKyspCisJCWlmIChicGZfaXNfc2Vlbl9yZWdpc3RlcihjdHgsIGkpKQorCQkJUFBDX0JQRl9MTChiMnBbaV0sIDEsIGJwZl9qaXRfc3RhY2tfb2Zmc2V0b2YoY3R4LCBiMnBbaV0pKTsKKworCS8qIFJlc3RvcmUgbm9uLXZvbGF0aWxlIHJlZ2lzdGVycyB1c2VkIGZvciBza2IgY2FjaGUgKi8KKwlpZiAoY3R4LT5zZWVuICYgU0VFTl9TS0IpIHsKKwkJUFBDX0JQRl9MTChiMnBbU0tCX0hMRU5fUkVHXSwgMSwKKwkJCQlicGZfaml0X3N0YWNrX29mZnNldG9mKGN0eCwgYjJwW1NLQl9ITEVOX1JFR10pKTsKKwkJUFBDX0JQRl9MTChiMnBbU0tCX0RBVEFfUkVHXSwgMSwKKwkJCQlicGZfaml0X3N0YWNrX29mZnNldG9mKGN0eCwgYjJwW1NLQl9EQVRBX1JFR10pKTsKKwl9CisKKwkvKiBUZWFyIGRvd24gb3VyIHN0YWNrIGZyYW1lICovCisJaWYgKGJwZl9oYXNfc3RhY2tfZnJhbWUoY3R4KSkgeworCQlQUENfQURESSgxLCAxLCBCUEZfUFBDX1NUQUNLRlJBTUUpOworCQlpZiAoY3R4LT5zZWVuICYgU0VFTl9GVU5DKSB7CisJCQlQUENfQlBGX0xMKDAsIDEsIFBQQ19MUl9TVEtPRkYpOworCQkJUFBDX01UTFIoMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJwZl9qaXRfYnVpbGRfZXBpbG9ndWUodTMyICppbWFnZSwgc3RydWN0IGNvZGVnZW5fY29udGV4dCAqY3R4KQoreworCWJwZl9qaXRfZW1pdF9jb21tb25fZXBpbG9ndWUoaW1hZ2UsIGN0eCk7CisKKwkvKiBNb3ZlIHJlc3VsdCB0byByMyAqLworCVBQQ19NUigzLCBiMnBbQlBGX1JFR18wXSk7CisKKwlQUENfQkxSKCk7Cit9CisKIHN0YXRpYyB2b2lkIGJwZl9qaXRfZW1pdF9mdW5jX2NhbGwodTMyICppbWFnZSwgc3RydWN0IGNvZGVnZW5fY29udGV4dCAqY3R4LCB1NjQgZnVuYykKIHsKICNpZmRlZiBQUEM2NF9FTEZfQUJJX3YxCkBAIC05Nyw4NiArMjI5LDY3IEBACiAJUFBDX0JMUkwoKTsKIH0KIAotc3RhdGljIHZvaWQgYnBmX2ppdF9idWlsZF9wcm9sb2d1ZSh1MzIgKmltYWdlLCBzdHJ1Y3QgY29kZWdlbl9jb250ZXh0ICpjdHgpCitzdGF0aWMgdm9pZCBicGZfaml0X2VtaXRfdGFpbF9jYWxsKHUzMiAqaW1hZ2UsIHN0cnVjdCBjb2RlZ2VuX2NvbnRleHQgKmN0eCwgdTMyIG91dCkKIHsKLQlpbnQgaTsKLQlib29sIG5ld19zdGFja19mcmFtZSA9IGJwZl9oYXNfc3RhY2tfZnJhbWUoY3R4KTsKLQotCWlmIChuZXdfc3RhY2tfZnJhbWUpIHsKLQkJLyoKLQkJICogV2UgbmVlZCBhIHN0YWNrIGZyYW1lLCBidXQgd2UgZG9uJ3QgbmVjZXNzYXJpbHkgbmVlZCB0bwotCQkgKiBzYXZlL3Jlc3RvcmUgTFIgdW5sZXNzIHdlIGNhbGwgb3RoZXIgZnVuY3Rpb25zCi0JCSAqLwotCQlpZiAoY3R4LT5zZWVuICYgU0VFTl9GVU5DKSB7Ci0JCQlFTUlUKFBQQ19JTlNUX01GTFIgfCBfX1BQQ19SVChSMCkpOwotCQkJUFBDX0JQRl9TVEwoMCwgMSwgUFBDX0xSX1NUS09GRik7Ci0JCX0KLQotCQlQUENfQlBGX1NUTFUoMSwgMSwgLUJQRl9QUENfU1RBQ0tGUkFNRSk7Ci0JfQorCS8qCisJICogQnkgbm93LCB0aGUgZUJQRiBwcm9ncmFtIGhhcyBhbHJlYWR5IHNldHVwIHBhcmFtZXRlcnMgaW4gcjMsIHI0IGFuZCByNQorCSAqIHIzL0JQRl9SRUdfMSAtIHBvaW50ZXIgdG8gY3R4IC0tIHBhc3NlZCBhcyBpcyB0byB0aGUgbmV4dCBicGYgcHJvZ3JhbQorCSAqIHI0L0JQRl9SRUdfMiAtIHBvaW50ZXIgdG8gYnBmX2FycmF5CisJICogcjUvQlBGX1JFR18zIC0gaW5kZXggaW4gYnBmX2FycmF5CisJICovCisJaW50IGIycF9icGZfYXJyYXkgPSBiMnBbQlBGX1JFR18yXTsKKwlpbnQgYjJwX2luZGV4ID0gYjJwW0JQRl9SRUdfM107CiAKIAkvKgotCSAqIEJhY2sgdXAgbm9uLXZvbGF0aWxlIHJlZ3MgLS0gQlBGIHJlZ2lzdGVycyA2LTEwCi0JICogSWYgd2UgaGF2ZW4ndCBjcmVhdGVkIG91ciBvd24gc3RhY2sgZnJhbWUsIHdlIHNhdmUgdGhlc2UKLQkgKiBpbiB0aGUgcHJvdGVjdGVkIHpvbmUgYmVsb3cgdGhlIHByZXZpb3VzIHN0YWNrIGZyYW1lCisJICogaWYgKGluZGV4ID49IGFycmF5LT5tYXAubWF4X2VudHJpZXMpCisJICogICBnb3RvIG91dDsKIAkgKi8KLQlmb3IgKGkgPSBCUEZfUkVHXzY7IGkgPD0gQlBGX1JFR18xMDsgaSsrKQotCQlpZiAoYnBmX2lzX3NlZW5fcmVnaXN0ZXIoY3R4LCBpKSkKLQkJCVBQQ19CUEZfU1RMKGIycFtpXSwgMSwKLQkJCQkobmV3X3N0YWNrX2ZyYW1lID8gQlBGX1BQQ19TVEFDS0ZSQU1FIDogMCkgLQotCQkJCQkoOCAqICgzMiAtIGIycFtpXSkpKTsKKwlQUENfTFdaKGIycFtUTVBfUkVHXzFdLCBiMnBfYnBmX2FycmF5LCBvZmZzZXRvZihzdHJ1Y3QgYnBmX2FycmF5LCBtYXAubWF4X2VudHJpZXMpKTsKKwlQUENfQ01QTFcoYjJwX2luZGV4LCBiMnBbVE1QX1JFR18xXSk7CisJUFBDX0JDQyhDT05EX0dFLCBvdXQpOwogCiAJLyoKLQkgKiBTYXZlIGFkZGl0aW9uYWwgbm9uLXZvbGF0aWxlIHJlZ3MgaWYgd2UgY2FjaGUgc2tiCi0JICogQWxzbywgc2V0dXAgc2tiIGRhdGEKKwkgKiBpZiAodGFpbF9jYWxsX2NudCA+IE1BWF9UQUlMX0NBTExfQ05UKQorCSAqICAgZ290byBvdXQ7CiAJICovCi0JaWYgKGN0eC0+c2VlbiAmIFNFRU5fU0tCKSB7Ci0JCVBQQ19CUEZfU1RMKGIycFtTS0JfSExFTl9SRUddLCAxLAotCQkJQlBGX1BQQ19TVEFDS0ZSQU1FIC0gKDggKiAoMzIgLSBiMnBbU0tCX0hMRU5fUkVHXSkpKTsKLQkJUFBDX0JQRl9TVEwoYjJwW1NLQl9EQVRBX1JFR10sIDEsCi0JCQlCUEZfUFBDX1NUQUNLRlJBTUUgLSAoOCAqICgzMiAtIGIycFtTS0JfREFUQV9SRUddKSkpOwotCQlicGZfaml0X2VtaXRfc2tiX2xvYWRzKGltYWdlLCBjdHgpOwotCX0KKwlQUENfTEQoYjJwW1RNUF9SRUdfMV0sIDEsIGJwZl9qaXRfc3RhY2tfdGFpbGNhbGxjbnQoY3R4KSk7CisJUFBDX0NNUExXSShiMnBbVE1QX1JFR18xXSwgTUFYX1RBSUxfQ0FMTF9DTlQpOworCVBQQ19CQ0MoQ09ORF9HVCwgb3V0KTsKIAotCS8qIFNldHVwIGZyYW1lIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIGJwZiBzdGFjayBhcmVhICovCi0JaWYgKGJwZl9pc19zZWVuX3JlZ2lzdGVyKGN0eCwgQlBGX1JFR19GUCkpCi0JCVBQQ19BRERJKGIycFtCUEZfUkVHX0ZQXSwgMSwKLQkJCQlCUEZfUFBDX1NUQUNLRlJBTUUgLSBCUEZfUFBDX1NUQUNLX1NBVkUpOwotfQorCS8qCisJICogdGFpbF9jYWxsX2NudCsrOworCSAqLworCVBQQ19BRERJKGIycFtUTVBfUkVHXzFdLCBiMnBbVE1QX1JFR18xXSwgMSk7CisJUFBDX0JQRl9TVEwoYjJwW1RNUF9SRUdfMV0sIDEsIGJwZl9qaXRfc3RhY2tfdGFpbGNhbGxjbnQoY3R4KSk7CiAKLXN0YXRpYyB2b2lkIGJwZl9qaXRfYnVpbGRfZXBpbG9ndWUodTMyICppbWFnZSwgc3RydWN0IGNvZGVnZW5fY29udGV4dCAqY3R4KQotewotCWludCBpOwotCWJvb2wgbmV3X3N0YWNrX2ZyYW1lID0gYnBmX2hhc19zdGFja19mcmFtZShjdHgpOworCS8qIHByb2cgPSBhcnJheS0+cHRyc1tpbmRleF07ICovCisJUFBDX01VTEkoYjJwW1RNUF9SRUdfMV0sIGIycF9pbmRleCwgOCk7CisJUFBDX0FERChiMnBbVE1QX1JFR18xXSwgYjJwW1RNUF9SRUdfMV0sIGIycF9icGZfYXJyYXkpOworCVBQQ19MRChiMnBbVE1QX1JFR18xXSwgYjJwW1RNUF9SRUdfMV0sIG9mZnNldG9mKHN0cnVjdCBicGZfYXJyYXksIHB0cnMpKTsKIAotCS8qIE1vdmUgcmVzdWx0IHRvIHIzICovCi0JUFBDX01SKDMsIGIycFtCUEZfUkVHXzBdKTsKKwkvKgorCSAqIGlmIChwcm9nID09IE5VTEwpCisJICogICBnb3RvIG91dDsKKwkgKi8KKwlQUENfQ01QTERJKGIycFtUTVBfUkVHXzFdLCAwKTsKKwlQUENfQkNDKENPTkRfRVEsIG91dCk7CiAKLQkvKiBSZXN0b3JlIE5WUnMgKi8KLQlmb3IgKGkgPSBCUEZfUkVHXzY7IGkgPD0gQlBGX1JFR18xMDsgaSsrKQotCQlpZiAoYnBmX2lzX3NlZW5fcmVnaXN0ZXIoY3R4LCBpKSkKLQkJCVBQQ19CUEZfTEwoYjJwW2ldLCAxLAotCQkJCShuZXdfc3RhY2tfZnJhbWUgPyBCUEZfUFBDX1NUQUNLRlJBTUUgOiAwKSAtCi0JCQkJCSg4ICogKDMyIC0gYjJwW2ldKSkpOworCS8qIGdvdG8gKihwcm9nLT5icGZfZnVuYyArIHByb2xvZ3VlX3NpemUpOyAqLworCVBQQ19MRChiMnBbVE1QX1JFR18xXSwgYjJwW1RNUF9SRUdfMV0sIG9mZnNldG9mKHN0cnVjdCBicGZfcHJvZywgYnBmX2Z1bmMpKTsKKyNpZmRlZiBQUEM2NF9FTEZfQUJJX3YxCisJLyogc2tpcCBwYXN0IHRoZSBmdW5jdGlvbiBkZXNjcmlwdG9yICovCisJUFBDX0FEREkoYjJwW1RNUF9SRUdfMV0sIGIycFtUTVBfUkVHXzFdLAorCQkJRlVOQ1RJT05fREVTQ1JfU0laRSArIEJQRl9UQUlMQ0FMTF9QUk9MT0dVRV9TSVpFKTsKKyNlbHNlCisJUFBDX0FEREkoYjJwW1RNUF9SRUdfMV0sIGIycFtUTVBfUkVHXzFdLCBCUEZfVEFJTENBTExfUFJPTE9HVUVfU0laRSk7CisjZW5kaWYKKwlQUENfTVRDVFIoYjJwW1RNUF9SRUdfMV0pOwogCi0JLyogUmVzdG9yZSBub24tdm9sYXRpbGUgcmVnaXN0ZXJzIHVzZWQgZm9yIHNrYiBjYWNoZSAqLwotCWlmIChjdHgtPnNlZW4gJiBTRUVOX1NLQikgewotCQlQUENfQlBGX0xMKGIycFtTS0JfSExFTl9SRUddLCAxLAotCQkJQlBGX1BQQ19TVEFDS0ZSQU1FIC0gKDggKiAoMzIgLSBiMnBbU0tCX0hMRU5fUkVHXSkpKTsKLQkJUFBDX0JQRl9MTChiMnBbU0tCX0RBVEFfUkVHXSwgMSwKLQkJCUJQRl9QUENfU1RBQ0tGUkFNRSAtICg4ICogKDMyIC0gYjJwW1NLQl9EQVRBX1JFR10pKSk7Ci0JfQorCS8qIHRlYXIgZG93biBzdGFjaywgcmVzdG9yZSBOVlJzLCAuLi4gKi8KKwlicGZfaml0X2VtaXRfY29tbW9uX2VwaWxvZ3VlKGltYWdlLCBjdHgpOwogCi0JLyogVGVhciBkb3duIG91ciBzdGFjayBmcmFtZSAqLwotCWlmIChuZXdfc3RhY2tfZnJhbWUpIHsKLQkJUFBDX0FEREkoMSwgMSwgQlBGX1BQQ19TVEFDS0ZSQU1FKTsKLQkJaWYgKGN0eC0+c2VlbiAmIFNFRU5fRlVOQykgewotCQkJUFBDX0JQRl9MTCgwLCAxLCBQUENfTFJfU1RLT0ZGKTsKLQkJCVBQQ19NVExSKDApOwotCQl9Ci0JfQotCi0JUFBDX0JMUigpOworCVBQQ19CQ1RSKCk7CisJLyogb3V0OiAqLwogfQogCiAvKiBBc3NlbWJsZSB0aGUgYm9keSBjb2RlIGJldHdlZW4gdGhlIHByb2xvZ3VlICYgZXBpbG9ndWUgKi8KQEAgLTIwMCw3ICszMTMsNiBAQAogCQl1NjQgaW1tNjQ7CiAJCXU4ICpmdW5jOwogCQl1MzIgdHJ1ZV9jb25kOwotCQlpbnQgc3RhY2tfbG9jYWxfb2ZmOwogCiAJCS8qCiAJCSAqIGFkZHJzW10gbWFwcyBhIEJQRiBieXRlY29kZSBhZGRyZXNzIGludG8gYSByZWFsIG9mZnNldCBmcm9tCkBAIC0yMTksOSArMzMxLDkgQEAKIAkJICogb3B0aW1pemF0aW9uIGJ1dCBldmVyeXRoaW5nIGVsc2Ugc2hvdWxkIHdvcmsgd2l0aG91dAogCQkgKiBhbnkgaXNzdWVzLgogCQkgKi8KLQkJaWYgKGRzdF9yZWcgPj0gMjQgJiYgZHN0X3JlZyA8PSAzMSkKKwkJaWYgKGRzdF9yZWcgPj0gQlBGX1BQQ19OVlJfTUlOICYmIGRzdF9yZWcgPCAzMikKIAkJCWJwZl9zZXRfc2Vlbl9yZWdpc3RlcihjdHgsIGluc25baV0uZHN0X3JlZyk7Ci0JCWlmIChzcmNfcmVnID49IDI0ICYmIHNyY19yZWcgPD0gMzEpCisJCWlmIChzcmNfcmVnID49IEJQRl9QUENfTlZSX01JTiAmJiBzcmNfcmVnIDwgMzIpCiAJCQlicGZfc2V0X3NlZW5fcmVnaXN0ZXIoY3R4LCBpbnNuW2ldLnNyY19yZWcpOwogCiAJCXN3aXRjaCAoY29kZSkgewpAQCAtNDkwLDI1ICs2MDIsMTIgQEAKIAkJCQkgKiBXYXkgZWFzaWVyIGFuZCBmYXN0ZXIoPykgdG8gc3RvcmUgdGhlIHZhbHVlCiAJCQkJICogaW50byBzdGFjayBhbmQgdGhlbiB1c2UgbGRicngKIAkJCQkgKgotCQkJCSAqIEZpcnN0LCBkZXRlcm1pbmUgd2hlcmUgaW4gc3RhY2sgd2UgY2FuIHN0b3JlCi0JCQkJICogdGhpczoKLQkJCQkgKiAtIGlmIHdlIGhhdmUgYWxsb3R0ZWQgYSBzdGFjayBmcmFtZSwgdGhlbiB3ZQotCQkJCSAqICAgd2lsbCB1dGlsaXplIHRoZSBhcmVhIHNldCBhc2lkZSBieQotCQkJCSAqICAgQlBGX1BQQ19TVEFDS19MT0NBTFMKLQkJCQkgKiAtIGVsc2UsIHdlIHVzZSB0aGUgYXJlYSBiZW5lYXRoIHRoZSBOViBHUFIKLQkJCQkgKiAgIHNhdmUgYXJlYQotCQkJCSAqCiAJCQkJICogY3R4LT5zZWVuIHdpbGwgYmUgcmVsaWFibGUgaW4gcGFzczIsIGJ1dAogCQkJCSAqIHRoZSBpbnN0cnVjdGlvbnMgZ2VuZXJhdGVkIHdpbGwgcmVtYWluIHRoZQogCQkJCSAqIHNhbWUgYWNyb3NzIGFsbCBwYXNzZXMKIAkJCQkgKi8KLQkJCQlpZiAoYnBmX2hhc19zdGFja19mcmFtZShjdHgpKQotCQkJCQlzdGFja19sb2NhbF9vZmYgPSBTVEFDS19GUkFNRV9NSU5fU0laRTsKLQkJCQllbHNlCi0JCQkJCXN0YWNrX2xvY2FsX29mZiA9IC0oQlBGX1BQQ19TVEFDS19TQVZFICsgOCk7Ci0KLQkJCQlQUENfU1REKGRzdF9yZWcsIDEsIHN0YWNrX2xvY2FsX29mZik7Ci0JCQkJUFBDX0FEREkoYjJwW1RNUF9SRUdfMV0sIDEsIHN0YWNrX2xvY2FsX29mZik7CisJCQkJUFBDX1NURChkc3RfcmVnLCAxLCBicGZfaml0X3N0YWNrX2xvY2FsKGN0eCkpOworCQkJCVBQQ19BRERJKGIycFtUTVBfUkVHXzFdLCAxLCBicGZfaml0X3N0YWNrX2xvY2FsKGN0eCkpOwogCQkJCVBQQ19MREJSWChkc3RfcmVnLCAwLCBiMnBbVE1QX1JFR18xXSk7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC02NjgsNyArNzY3LDcgQEAKIAogCQkJLyogU2F2ZSBza2IgcG9pbnRlciBpZiB3ZSBuZWVkIHRvIHJlLWNhY2hlIHNrYiBkYXRhICovCiAJCQlpZiAoYnBmX2hlbHBlcl9jaGFuZ2VzX3NrYl9kYXRhKGZ1bmMpKQotCQkJCVBQQ19CUEZfU1RMKDMsIDEsIFNUQUNLX0ZSQU1FX01JTl9TSVpFKTsKKwkJCQlQUENfQlBGX1NUTCgzLCAxLCBicGZfaml0X3N0YWNrX2xvY2FsKGN0eCkpOwogCiAJCQlicGZfaml0X2VtaXRfZnVuY19jYWxsKGltYWdlLCBjdHgsICh1NjQpZnVuYyk7CiAKQEAgLTY3OCw3ICs3NzcsNyBAQAogCQkJLyogcmVmcmVzaCBza2IgY2FjaGUgKi8KIAkJCWlmIChicGZfaGVscGVyX2NoYW5nZXNfc2tiX2RhdGEoZnVuYykpIHsKIAkJCQkvKiByZWxvYWQgc2tiIHBvaW50ZXIgdG8gcjMgKi8KLQkJCQlQUENfQlBGX0xMKDMsIDEsIFNUQUNLX0ZSQU1FX01JTl9TSVpFKTsKKwkJCQlQUENfQlBGX0xMKDMsIDEsIGJwZl9qaXRfc3RhY2tfbG9jYWwoY3R4KSk7CiAJCQkJYnBmX2ppdF9lbWl0X3NrYl9sb2FkcyhpbWFnZSwgY3R4KTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtODM3LDkgKzkzNiwxMiBAQAogCQkJYnJlYWs7CiAKIAkJLyoKLQkJICogVE9ETzogVGFpbCBjYWxsCisJCSAqIFRhaWwgY2FsbAogCQkgKi8KIAkJY2FzZSBCUEZfSk1QIHwgQlBGX0NBTEwgfCBCUEZfWDoKKwkJCWN0eC0+c2VlbiB8PSBTRUVOX1RBSUxDQUxMOworCQkJYnBmX2ppdF9lbWl0X3RhaWxfY2FsbChpbWFnZSwgY3R4LCBhZGRyc1tpICsgMV0pOworCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKIAkJCS8qCkBAIC04NzIsMjEgKzk3NCwzNyBAQAogCWludCBwYXNzOwogCWludCBmbGVuOwogCXN0cnVjdCBicGZfYmluYXJ5X2hlYWRlciAqYnBmX2hkcjsKKwlzdHJ1Y3QgYnBmX3Byb2cgKm9yZ19mcCA9IGZwOworCXN0cnVjdCBicGZfcHJvZyAqdG1wX2ZwOworCWJvb2wgYnBmX2JsaW5kZWQgPSBmYWxzZTsKIAogCWlmICghYnBmX2ppdF9lbmFibGUpCi0JCXJldHVybiBmcDsKKwkJcmV0dXJuIG9yZ19mcDsKKworCXRtcF9mcCA9IGJwZl9qaXRfYmxpbmRfY29uc3RhbnRzKG9yZ19mcCk7CisJaWYgKElTX0VSUih0bXBfZnApKQorCQlyZXR1cm4gb3JnX2ZwOworCisJaWYgKHRtcF9mcCAhPSBvcmdfZnApIHsKKwkJYnBmX2JsaW5kZWQgPSB0cnVlOworCQlmcCA9IHRtcF9mcDsKKwl9CiAKIAlmbGVuID0gZnAtPmxlbjsKIAlhZGRycyA9IGt6YWxsb2MoKGZsZW4rMSkgKiBzaXplb2YoKmFkZHJzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGFkZHJzID09IE5VTEwpCi0JCXJldHVybiBmcDsKLQotCWNnY3R4LmlkeCA9IDA7Ci0JY2djdHguc2VlbiA9IDA7Ci0JLyogU2NvdXRpbmcgZmF1eC1nZW5lcmF0ZSBwYXNzIDAgKi8KLQlpZiAoYnBmX2ppdF9idWlsZF9ib2R5KGZwLCAwLCAmY2djdHgsIGFkZHJzKSkKLQkJLyogV2UgaGl0IHNvbWV0aGluZyBpbGxlZ2FsIG9yIHVuc3VwcG9ydGVkLiAqLworCWlmIChhZGRycyA9PSBOVUxMKSB7CisJCWZwID0gb3JnX2ZwOwogCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoJmNnY3R4LCAwLCBzaXplb2Yoc3RydWN0IGNvZGVnZW5fY29udGV4dCkpOworCisJLyogU2NvdXRpbmcgZmF1eC1nZW5lcmF0ZSBwYXNzIDAgKi8KKwlpZiAoYnBmX2ppdF9idWlsZF9ib2R5KGZwLCAwLCAmY2djdHgsIGFkZHJzKSkgeworCQkvKiBXZSBoaXQgc29tZXRoaW5nIGlsbGVnYWwgb3IgdW5zdXBwb3J0ZWQuICovCisJCWZwID0gb3JnX2ZwOworCQlnb3RvIG91dDsKKwl9CiAKIAkvKgogCSAqIFByZXRlbmQgdG8gYnVpbGQgcHJvbG9ndWUsIGdpdmVuIHRoZSBmZWF0dXJlcyB3ZSd2ZSBzZWVuLiAgVGhpcyB3aWxsCkBAIC05MDEsOCArMTAxOSwxMCBAQAogCiAJYnBmX2hkciA9IGJwZl9qaXRfYmluYXJ5X2FsbG9jKGFsbG9jbGVuLCAmaW1hZ2UsIDQsCiAJCQlicGZfaml0X2ZpbGxfaWxsX2luc25zKTsKLQlpZiAoIWJwZl9oZHIpCisJaWYgKCFicGZfaGRyKSB7CisJCWZwID0gb3JnX2ZwOwogCQlnb3RvIG91dDsKKwl9CiAKIAljb2RlX2Jhc2UgPSAodTMyICopKGltYWdlICsgRlVOQ1RJT05fREVTQ1JfU0laRSk7CiAKQEAgLTkzOSw2ICsxMDU5LDEwIEBACiAKIG91dDoKIAlrZnJlZShhZGRycyk7CisKKwlpZiAoYnBmX2JsaW5kZWQpCisJCWJwZl9qaXRfcHJvZ19yZWxlYXNlX290aGVyKGZwLCBmcCA9PSBvcmdfZnAgPyB0bXBfZnAgOiBvcmdfZnApOworCiAJcmV0dXJuIGZwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC9zcHVfcHJvZmlsZXIuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3NwdV9wcm9maWxlci5jCmluZGV4IGIxMjlkMDAuLmIxOTI2NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3NwdV9wcm9maWxlci5jCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3NwdV9wcm9maWxlci5jCkBAIC00Myw3ICs0Myw3IEBACiAjZGVmaW5lIFNQVV9QQ19NQVNLCSAgICAgMHhGRkZGCiAKIERFRklORV9TUElOTE9DSyhvcHJvZl9zcHVfc21wbF9hcnJ5X2xjayk7Ci11bnNpZ25lZCBsb25nIG9wcm9mX3NwdV9zbXBsX2FycnlfbGNrX2ZsYWdzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgb3Byb2Zfc3B1X3NtcGxfYXJyeV9sY2tfZmxhZ3M7CiAKIHZvaWQgc2V0X3NwdV9wcm9maWxpbmdfZnJlcXVlbmN5KHVuc2lnbmVkIGludCBmcmVxX2toeiwgdW5zaWduZWQgaW50IGN5Y2xlc19yZXNldCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3NwdV90YXNrX3N5bmMuYyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jZWxsL3NwdV90YXNrX3N5bmMuYwppbmRleCBlZjIxNDJmLi44M2QyYjRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY2VsbC9zcHVfdGFza19zeW5jLmMKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NlbGwvc3B1X3Rhc2tfc3luYy5jCkBAIC0zNiw3ICszNiw3IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJ1ZmZlcl9sb2NrKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2FjaGVfbG9jayk7CiBzdGF0aWMgaW50IG51bV9zcHVfbm9kZXM7Ci1pbnQgc3B1X3Byb2ZfbnVtX25vZGVzOworc3RhdGljIGludCBzcHVfcHJvZl9udW1fbm9kZXM7CiAKIHN0cnVjdCBzcHVfYnVmZmVyIHNwdV9idWZmW01BWF9OVU1OT0RFUyAqIFNQVVNfUEVSX05PREVdOwogc3RydWN0IGRlbGF5ZWRfd29yayBzcHVfd29yazsKQEAgLTg4LDcgKzg4LDcgQEAKIC8qIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBwZXIgU1BVIGJ1ZmZlcnMgdG8gdGhlCiAgKiBPUHJvZmlsZSBrZXJuZWwgYnVmZmVyLgogICovCi12b2lkIHN5bmNfc3B1X2J1ZmYodm9pZCkKK3N0YXRpYyB2b2lkIHN5bmNfc3B1X2J1ZmYodm9pZCkKIHsKIAlpbnQgc3B1OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGVyZi9jb3JlLWJvb2szcy5jIGIvYXJjaC9wb3dlcnBjL3BlcmYvY29yZS1ib29rM3MuYwppbmRleCA0ZWQzNzdmLi43MmMyN2I4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGVyZi9jb3JlLWJvb2szcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wZXJmL2NvcmUtYm9vazNzLmMKQEAgLTIxNTgsNyArMjE1OCw3IEBACiAJCWlycV9leGl0KCk7CiB9CiAKLWludCBwb3dlcl9wbXVfcHJlcGFyZV9jcHUodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyBpbnQgcG93ZXJfcG11X3ByZXBhcmVfY3B1KHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWh3ID0gJnBlcl9jcHUoY3B1X2h3X2V2ZW50cywgY3B1KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BlcmYvaHYtZ3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtZ3BjaS5jCmluZGV4IDdhYTM3MjMuLjQzZmFiYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wZXJmL2h2LWdwY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGVyZi9odi1ncGNpLmMKQEAgLTEzMSw3ICsxMzEsNyBAQAogI2RlZmluZSBIR1BDSV9NQVhfREFUQV9CWVRFUyBcCiAJKEhHUENJX1JFUV9CVUZGRVJfU0laRSAtIHNpemVvZihzdHJ1Y3QgaHZfZ2V0X3BlcmZfY291bnRlcl9pbmZvX3BhcmFtcykpCiAKLURFRklORV9QRVJfQ1BVKGNoYXIsIGh2X2dwY2lfcmVxYltIR1BDSV9SRVFfQlVGRkVSX1NJWkVdKSBfX2FsaWduZWQoc2l6ZW9mKHVpbnQ2NF90KSk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoY2hhciwgaHZfZ3BjaV9yZXFiW0hHUENJX1JFUV9CVUZGRVJfU0laRV0pIF9fYWxpZ25lZChzaXplb2YodWludDY0X3QpKTsKIAogc3RydWN0IGh2X2dwY2lfcmVxdWVzdF9idWZmZXIgewogCXN0cnVjdCBodl9nZXRfcGVyZl9jb3VudGVyX2luZm9fcGFyYW1zIHBhcmFtczsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wZXJmL3Bvd2VyNy1wbXUuYyBiL2FyY2gvcG93ZXJwYy9wZXJmL3Bvd2VyNy1wbXUuYwppbmRleCBhMzgzYzIzLi43OTYzNjU4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGVyZi9wb3dlcjctcG11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BlcmYvcG93ZXI3LXBtdS5jCkBAIC00MTYsNyArNDE2LDcgQEAKIAlOVUxMLAogfTsKIAotc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBwb3dlcjdfcG11X2Zvcm1hdF9ncm91cCA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBvd2VyN19wbXVfZm9ybWF0X2dyb3VwID0gewogCS5uYW1lID0gImZvcm1hdCIsCiAJLmF0dHJzID0gcG93ZXI3X3BtdV9mb3JtYXRfYXR0ciwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGVyZi9wb3dlcjgtcG11LmMgYi9hcmNoL3Bvd2VycGMvcGVyZi9wb3dlcjgtcG11LmMKaW5kZXggNWZkZTJiMS4uYWI4MzBkMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BlcmYvcG93ZXI4LXBtdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wZXJmL3Bvd2VyOC1wbXUuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJTlVMTCwKIH07CiAKLXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcG93ZXI4X3BtdV9mb3JtYXRfZ3JvdXAgPSB7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBwb3dlcjhfcG11X2Zvcm1hdF9ncm91cCA9IHsKIAkubmFtZSA9ICJmb3JtYXQiLAogCS5hdHRycyA9IHBvd2VyOF9wbXVfZm9ybWF0X2F0dHIsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BlcmYvcG93ZXI5LXBtdS5jIGIvYXJjaC9wb3dlcnBjL3BlcmYvcG93ZXI5LXBtdS5jCmluZGV4IDc4ODM0NjMuLjhlOWE4MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wZXJmL3Bvd2VyOS1wbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGVyZi9wb3dlcjktcG11LmMKQEAgLTExOSw3ICsxMTksNyBAQAogCU5VTEwsCiB9OwogCi1zdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBvd2VyOV9wbXVfZm9ybWF0X2dyb3VwID0geworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcG93ZXI5X3BtdV9mb3JtYXRfZ3JvdXAgPSB7CiAJLm5hbWUgPSAiZm9ybWF0IiwKIAkuYXR0cnMgPSBwb3dlcjlfcG11X2Zvcm1hdF9hdHRyLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L3dhcnAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L3dhcnAuYwppbmRleCA1ZWNjZTU0Li5hODg2YzJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC93YXJwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvd2FycC5jCkBAIC0yMDQsNyArMjA0LDcgQEAKIAlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgMywgIDApOyAvKiBUbG93ICovCiAKIAlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7Ci0JaWYgKGlycSAgPT0gTk9fSVJRKSB7CisJaWYgKCFpcnEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIF9fRklMRV9fICI6IFVuYWJsZSB0byBnZXQgYWQ3NDE0IGlycVxuIik7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9hZHNfY3BsZC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMjFfYWRzX2NwbGQuYwppbmRleCAwMDM1ZDE0Li5mZTRkNGVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyMV9hZHNfY3BsZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTIxX2Fkc19jcGxkLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAlzdGF0dXMgfD0gKGlnbm9yZSB8IG1hc2spOwogCiAJaWYgKHN0YXR1cyA9PSAweGZmKQotCQlyZXR1cm4gTk9fSVJROworCQlyZXR1cm4gMDsKIAogCWNwbGRfaXJxID0gZmZ6KHN0YXR1cykgKyBvZmZzZXQ7CiAKQEAgLTExMCwxNCArMTEwLDE0IEBACiAKIAlpcnEgPSBjcGxkX3BpY19nZXRfaXJxKDAsIFBDSV9JR05PUkUsICZjcGxkX3JlZ3MtPnBjaV9zdGF0dXMsCiAJCSZjcGxkX3JlZ3MtPnBjaV9tYXNrKTsKLQlpZiAoaXJxICE9IE5PX0lSUSkgeworCWlmIChpcnEpIHsKIAkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiAJCXJldHVybjsKIAl9CiAKIAlpcnEgPSBjcGxkX3BpY19nZXRfaXJxKDgsIE1JU0NfSUdOT1JFLCAmY3BsZF9yZWdzLT5taXNjX3N0YXR1cywKIAkJJmNwbGRfcmVncy0+bWlzY19tYXNrKTsKLQlpZiAoaXJxICE9IE5PX0lSUSkgeworCWlmIChpcnEpIHsKIAkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CiAJCXJldHVybjsKIAl9CkBAIC0xNzcsNyArMTc3LDcgQEAKIAkJZ290byBlbmQ7CiAKIAljYXNjYWRlX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQlpZiAoY2FzY2FkZV9pcnEgPT0gTk9fSVJRKQorCWlmICghY2FzY2FkZV9pcnEpCiAJCWdvdG8gZW5kOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTJ4X2xwYmZpZm8uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTEyeC9tcGM1MTJ4X2xwYmZpZm8uYwppbmRleCA4ZWI4MmIwLi5jZWMzZjg4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUxMngvbXBjNTEyeF9scGJmaWZvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81MTJ4L21wYzUxMnhfbHBiZmlmby5jCkBAIC00NzMsNyArNDczLDcgQEAKIAl9CiAKIAlscGJmaWZvLmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHBkZXYtPmRldi5vZl9ub2RlLCAwKTsKLQlpZiAobHBiZmlmby5pcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFscGJmaWZvLmlycSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtYXBwaW5nIGlycSBmYWlsZWRcbiIpOwogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycjA7CkBAIC01MjgsNyArNTI4LDYgQEAKIAkucmVtb3ZlID0gbXBjNTEyeF9scGJmaWZvX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IERSVl9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gbXBjNTEyeF9scGJmaWZvX21hdGNoLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy81Mnh4L21wYzUyeHhfcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9waWMuYwppbmRleCA0ZmUyMDc0Li5mYzk4OTEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzUyeHgvbXBjNTJ4eF9waWMuYwpAQCAtNTExLDcgKzUxMSw3IEBACiAJCQlpcnEgfD0gKE1QQzUyeHhfSVJRX0wxX1BFUlAgPDwgTVBDNTJ4eF9JUlFfTDFfT0ZGU0VUKTsKIAkJfQogCX0gZWxzZSB7Ci0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiAwOwogCX0KIAogCXJldHVybiBpcnFfbGluZWFyX3Jldm1hcChtcGM1Mnh4X2lycWhvc3QsIGlycSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgyeHgvcHEyYWRzLXBjaS1waWMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9wcTJhZHMtcGNpLXBpYy5jCmluZGV4IDYwZTg5ZmMuLjhiMDY1YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9wcTJhZHMtcGNpLXBpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODJ4eC9wcTJhZHMtcGNpLXBpYy5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAl9CiAKIAlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7Ci0JaWYgKGlycSA9PSBOT19JUlEpIHsKKwlpZiAoIWlycSkgewogCQlwcmludGsoS0VSTl9FUlIgIk5vIGludGVycnVwdCBpbiBwY2kgcGljIG5vZGUuXG4iKTsKIAkJb2Zfbm9kZV9wdXQobnApOwogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tY3VfbXBjODM0OWVtaXR4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbWN1X21wYzgzNDllbWl0eC5jCmluZGV4IGRiY2QwMzAuLjYzYzVhYjY0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbWN1X21wYzgzNDllbWl0eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tY3VfbXBjODM0OWVtaXR4LmMKQEAgLTIyMiw3ICsyMjIsNiBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1jdV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAibWN1LW1wYzgzNDllbWl0eCIsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBtY3Vfb2ZfbWF0Y2hfdGFibGUsCiAJfSwKIAkucHJvYmUgPSBtY3VfcHJvYmUsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X3JkYi5jCmluZGV4IDJlZjAzZTcuLjBkNmE2MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X3JkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X3JkYi5jCkBAIC04OSw3ICs4OSw3IEBACiAJCQlnb3RvIGVycjsKIAogCQlyZXQgPSBvZl9pcnFfdG9fcmVzb3VyY2UobnAsIDAsICZyZXNbMV0pOwotCQlpZiAocmV0ID09IE5PX0lSUSkKKwkJaWYgKCFyZXQpCiAJCQlnb3RvIGVycjsKIAogCQlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJtcGM4M3h4X3NwaSIsIGkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3N1c3BlbmQuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9zdXNwZW5kLmMKaW5kZXggZmNiZWE0Yi4uMjQ3MTdkMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3N1c3BlbmQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvc3VzcGVuZC5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlwbWNfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCWlmIChwbWNfaXJxICE9IE5PX0lSUSkgeworCWlmIChwbWNfaXJxKSB7CiAJCXJldCA9IHJlcXVlc3RfaXJxKHBtY19pcnEsIHBtY19pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCiAJCSAgICAgICAgICAgICAgICAgICJwbWMiLCBvZmRldik7CiAKQEAgLTQwMCw3ICs0MDAsNyBAQAogb3V0X3BtYzoKIAlpb3VubWFwKHBtY19yZWdzKTsKIG91dDoKLQlpZiAocG1jX2lycSAhPSBOT19JUlEpCisJaWYgKHBtY19pcnEpCiAJCWZyZWVfaXJxKHBtY19pcnEsIG9mZGV2KTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29tbW9uLmMKaW5kZXggMjg3MjBhNC4uOTU0ZTVlOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2NvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb21tb24uYwpAQCAtNzYsNyArNzYsNyBAQAogCQlyZXR1cm47CiAJfQogCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQlpZiAoaXJxID09IE5PX0lSUSkgeworCWlmICghaXJxKSB7CiAJCW9mX25vZGVfcHV0KG5wKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJQSUMgaW5pdDogZ290IG5vIElSUSBmb3IgY3BtIGNhc2NhZGVcbiIpOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCmluZGV4IDYyZjE3MWMuLjg2ZjIwMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgY2FzY2FkZV9pcnEgPSBpODI1OV9pcnEoKTsKIAotCWlmIChjYXNjYWRlX2lycSAhPSBOT19JUlEpCisJaWYgKGNhc2NhZGVfaXJxKQogCQkvKiBoYW5kbGUgYW4gaW50ZXJydXB0IGZyb20gdGhlIDgyNTkgKi8KIAkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKIApAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJfQogCiAJY2FzY2FkZV9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChjYXNjYWRlX25vZGUsIDApOwotCWlmIChjYXNjYWRlX2lycSA9PSBOT19JUlEpIHsKKwlpZiAoIWNhc2NhZGVfaXJxKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG1hcCBjYXNjYWRlIGludGVycnVwdFxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2RzLmMKaW5kZXggNmJjMDdkOC4uZWQ2OWM3ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9kcy5jCkBAIC01MSw3ICs1MSw3IEBACiAJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7CiAJdW5zaWduZWQgaW50IGNhc2NhZGVfaXJxID0gaTgyNTlfaXJxKCk7CiAKLQlpZiAoY2FzY2FkZV9pcnEgIT0gTk9fSVJRKSB7CisJaWYgKGNhc2NhZGVfaXJxKSB7CiAJCWdlbmVyaWNfaGFuZGxlX2lycShjYXNjYWRlX2lycSk7CiAJfQogCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKQEAgLTk2LDcgKzk2LDcgQEAKIAl9CiAKIAljYXNjYWRlX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGNhc2NhZGVfbm9kZSwgMCk7Ci0JaWYgKGNhc2NhZGVfaXJxID09IE5PX0lSUSkgeworCWlmICghY2FzY2FkZV9pcnEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIGNhc2NhZGUgaW50ZXJydXB0XG4iKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zb2NyYXRlc19mcGdhX3BpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NvY3JhdGVzX2ZwZ2FfcGljLmMKaW5kZXggYjAyZDZhNS4uODJmODQ5MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NvY3JhdGVzX2ZwZ2FfcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NvY3JhdGVzX2ZwZ2FfcGljLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAkJCWJyZWFrOwogCX0KIAlpZiAoaSA9PSAzKQotCQlyZXR1cm4gTk9fSVJROworCQlyZXR1cm4gMDsKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmc29jcmF0ZXNfZnBnYV9waWNfbG9jaywgZmxhZ3MpOwogCWNhdXNlID0gc29jcmF0ZXNfZnBnYV9waWNfcmVhZChGUEdBX1BJQ19JUlFNQVNLKGkpKTsKQEAgLTEwMyw3ICsxMDMsNyBAQAogCSAqLwogCWNhc2NhZGVfaXJxID0gc29jcmF0ZXNfZnBnYV9waWNfZ2V0X2lycShpcnEpOwogCi0JaWYgKGNhc2NhZGVfaXJxICE9IE5PX0lSUSkKKwlpZiAoY2FzY2FkZV9pcnEpCiAJCWdlbmVyaWNfaGFuZGxlX2lycShjYXNjYWRlX2lycSk7CiAJY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOwogfQpAQCAtMjkyLDcgKzI5Miw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXNvY3JhdGVzX2ZwZ2FfaXJxc1tpXSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHBpYywgaSk7Ci0JCWlmIChzb2NyYXRlc19mcGdhX2lycXNbaV0gPT0gTk9fSVJRKSB7CisJCWlmICghc29jcmF0ZXNfZnBnYV9pcnFzW2ldKSB7CiAJCQlwcl93YXJuaW5nKCJGUEdBIFBJQzogY2FuJ3QgZ2V0IGlycSVkLlxuIiwgaSk7CiAJCQljb250aW51ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3BpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3BpYy5jCmluZGV4IDg0NWRlZmEuLmE2YzY5NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGljLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKIAl1bnNpZ25lZCBpbnQgY2FzY2FkZV9pcnEgPSBpODI1OV9pcnEoKTsKIAotCWlmIChjYXNjYWRlX2lycSAhPSBOT19JUlEpCisJaWYgKGNhc2NhZGVfaXJxKQogCQlnZW5lcmljX2hhbmRsZV9pcnEoY2FzY2FkZV9pcnEpOwogCiAJY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOwpAQCAtNTgsNyArNTgsNyBAQAogCX0KIAogCWNhc2NhZGVfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoY2FzY2FkZV9ub2RlLCAwKTsKLQlpZiAoY2FzY2FkZV9pcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFjYXNjYWRlX2lycSkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBtYXAgY2FzY2FkZSBpbnRlcnJ1cHRcbiIpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbTh4eF9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84eHgvbTh4eF9zZXR1cC5jCmluZGV4IGIxYWI2ZTkuLmY4MTA2OWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvOHh4L204eHhfc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9tOHh4X3NldHVwLmMKQEAgLTI0MSw2ICsyNDEsNiBAQAogCX0KIAogCWlycSA9IGNwbV9waWNfaW5pdCgpOwotCWlmIChpcnEgIT0gTk9fSVJRKQorCWlmIChpcnEpCiAJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGlycSwgY3BtX2Nhc2NhZGUpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQppbmRleCBmMzJlZGVjLi5jYTJkYTMwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQpAQCAtNzQsNiArNzQsNyBAQAogCXNlbGVjdCBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0UKIAlzZWxlY3QgQVJDSF9TVVBQT1JUU19OVU1BX0JBTEFOQ0lORwogCXNlbGVjdCBJUlFfV09SSworCXNlbGVjdCBIQVZFX0tFUk5FTF9YWgogCiBjb25maWcgUFBDX0JPT0szRV82NAogCWJvb2wgIkVtYmVkZGVkIHByb2Nlc3NvcnMiCkBAIC04Niw2ICs4Nyw3IEBACiBjaG9pY2UKIAlwcm9tcHQgIkNQVSBzZWxlY3Rpb24iCiAJZGVwZW5kcyBvbiBQUEM2NAorCWRlZmF1bHQgUE9XRVI4X0NQVSBpZiBDUFVfTElUVExFX0VORElBTgogCWRlZmF1bHQgR0VORVJJQ19DUFUKIAloZWxwCiAJICBUaGlzIHdpbGwgY3JlYXRlIGEga2VybmVsIHdoaWNoIGlzIG9wdGltaXNlZCBmb3IgYSBwYXJ0aWN1bGFyIENQVS4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9heG9uX21zaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2F4b25fbXNpLmMKaW5kZXggYWVkNzcxNC4uOGI1NWM1ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2F4b25fbXNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2F4b25fbXNpLmMKQEAgLTI3MSw3ICsyNzEsNyBAQAogCiAJZm9yX2VhY2hfcGNpX21zaV9lbnRyeShlbnRyeSwgZGV2KSB7CiAJCXZpcnEgPSBpcnFfY3JlYXRlX2RpcmVjdF9tYXBwaW5nKG1zaWMtPmlycV9kb21haW4pOwotCQlpZiAodmlycSA9PSBOT19JUlEpIHsKKwkJaWYgKCF2aXJxKSB7CiAJCQlkZXZfd2FybigmZGV2LT5kZXYsCiAJCQkJICJheG9uX21zaTogdmlycSBhbGxvY2F0aW9uIGZhaWxlZCFcbiIpOwogCQkJcmV0dXJuIC0xOwpAQCAtMjkzLDcgKzI5Myw3IEBACiAJZGV2X2RiZygmZGV2LT5kZXYsICJheG9uX21zaTogdGVhcmluZyBkb3duIG1zaSBpcnFzXG4iKTsKIAogCWZvcl9lYWNoX3BjaV9tc2lfZW50cnkoZW50cnksIGRldikgewotCQlpZiAoZW50cnktPmlycSA9PSBOT19JUlEpCisJCWlmICghZW50cnktPmlycSkKIAkJCWNvbnRpbnVlOwogCiAJCWlycV9zZXRfbXNpX2Rlc2MoZW50cnktPmlycSwgTlVMTCk7CkBAIC0zNzUsNyArMzc1LDcgQEAKIAl9CiAKIAl2aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZG4sIDApOwotCWlmICh2aXJxID09IE5PX0lSUSkgeworCWlmICghdmlycSkgewogCQlwcmludGsoS0VSTl9FUlIgImF4b25fbXNpOiBpcnEgcGFyc2UgYW5kIG1hcCBmYWlsZWQgZm9yICVzXG4iLAogCQkgICAgICAgZG4tPmZ1bGxfbmFtZSk7CiAJCWdvdG8gb3V0X2ZyZWVfZmlmbzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcmVncy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKaW5kZXggMTQyOGQ1OC4uYjkyNjQzOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIF9faW5pdCBjYmVfZmlsbF9yZWdzX21hcChzdHJ1Y3QgY2JlX3JlZ3NfbWFwICptYXApCitzdGF0aWMgdm9pZCBfX2luaXQgY2JlX2ZpbGxfcmVnc19tYXAoc3RydWN0IGNiZV9yZWdzX21hcCAqbWFwKQogewogCWlmKG1hcC0+YmVfbm9kZSkgewogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmJlLCAqbnA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKaW5kZXggOWY2MDlmYy4uYTZiYmJhYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiAJCQkJdW5zaWduZWQgaW50IGNpcnEgPQogCQkJCQlpcnFfbGluZWFyX3Jldm1hcChpaWNfaG9zdCwKIAkJCQkJCQkgIGJhc2UgfCBjYXNjYWRlKTsKLQkJCQlpZiAoY2lycSAhPSBOT19JUlEpCisJCQkJaWYgKGNpcnEpCiAJCQkJCWdlbmVyaWNfaGFuZGxlX2lycShjaXJxKTsKIAkJCX0KIAkJLyogcG9zdC1hY2sgbGV2ZWwgaW50ZXJydXB0cyAqLwpAQCAtMTUzLDEwICsxNTMsMTAgQEAKIAkqKHVuc2lnbmVkIGxvbmcgKikgJnBlbmRpbmcgPQogCQlpbl9iZTY0KCh1NjQgX19pb21lbSAqKSAmaWljLT5yZWdzLT5wZW5kaW5nX2Rlc3RyKTsKIAlpZiAoIShwZW5kaW5nLmZsYWdzICYgQ0JFX0lJQ19JUlFfVkFMSUQpKQotCQlyZXR1cm4gTk9fSVJROworCQlyZXR1cm4gMDsKIAl2aXJxID0gaXJxX2xpbmVhcl9yZXZtYXAoaWljX2hvc3QsIGlpY19wZW5kaW5nX3RvX2h3bnVtKHBlbmRpbmcpKTsKLQlpZiAodmlycSA9PSBOT19JUlEpCi0JCXJldHVybiBOT19JUlE7CisJaWYgKCF2aXJxKQorCQlyZXR1cm4gMDsKIAlpaWMtPmVvaV9zdGFja1srK2lpYy0+ZW9pX3B0cl0gPSBwZW5kaW5nLnByaW87CiAJQlVHX09OKGlpYy0+ZW9pX3B0ciA+IDE1KTsKIAlyZXR1cm4gdmlycTsKQEAgLTE4NywxOCArMTg3LDEyIEBACiAJb3V0X2JlNjQoJnBlcl9jcHUoY3B1X2lpYywgY3B1KS5yZWdzLT5nZW5lcmF0ZSwgKDB4ZiAtIG1zZykgPDwgNCk7CiB9CiAKLXN0cnVjdCBpcnFfZG9tYWluICppaWNfZ2V0X2lycV9ob3N0KGludCBub2RlKQotewotCXJldHVybiBpaWNfaG9zdDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGlpY19nZXRfaXJxX2hvc3QpOwotCiBzdGF0aWMgdm9pZCBpaWNfcmVxdWVzdF9pcGkoaW50IG1zZykKIHsKIAlpbnQgdmlycTsKIAogCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoaWljX2hvc3QsIGlpY19tc2dfdG9faXJxKG1zZykpOwotCWlmICh2aXJxID09IE5PX0lSUSkgeworCWlmICghdmlycSkgewogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICJpaWM6IGZhaWxlZCB0byBtYXAgSVBJICVzXG4iLCBzbXBfaXBpX25hbWVbbXNnXSk7CiAJCXJldHVybjsKQEAgLTM1Myw3ICszNDcsNyBAQAogCQljYXNjYWRlIHw9IDEgPDwgSUlDX0lSUV9DTEFTU19TSElGVDsKIAkJY2FzY2FkZSB8PSBJSUNfVU5JVF9JSUM7CiAJCWNhc2NhZGUgPSBpcnFfY3JlYXRlX21hcHBpbmcoaWljX2hvc3QsIGNhc2NhZGUpOwotCQlpZiAoY2FzY2FkZSA9PSBOT19JUlEpCisJCWlmICghY2FzY2FkZSkKIAkJCWNvbnRpbnVlOwogCQkvKgogCQkgKiBpcnFfZGF0YSBpcyBhIGdlbmVyaWMgcG9pbnRlciB0aGF0IGdldHMgcGFzc2VkIGJhY2sKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKaW5kZXggZjdkMWE0OS4uN2ZmNTFmOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMKQEAgLTQxMSw3ICs0MTEsNyBAQAogCiAJdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLAogCQkJSUlDX0lSUV9JT0VYX0FUSSB8IChpb21tdS0+bmlkIDw8IElJQ19JUlFfTk9ERV9TSElGVCkpOwotCUJVR19PTih2aXJxID09IE5PX0lSUSk7CisJQlVHX09OKCF2aXJxKTsKIAogCXJldCA9IHJlcXVlc3RfaXJxKHZpcnEsIGlvY19pbnRlcnJ1cHQsIDAsIGlvbW11LT5uYW1lLCBpb21tdSk7CiAJQlVHX09OKHJldCk7CkBAIC02NTEsNyArNjUxLDcgQEAKIAogc3RhdGljIGludCBkbWFfc2V0X21hc2tfYW5kX3N3aXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBkbWFfbWFzayk7CiAKLXN0cnVjdCBkbWFfbWFwX29wcyBkbWFfaW9tbXVfZml4ZWRfb3BzID0geworc3RhdGljIHN0cnVjdCBkbWFfbWFwX29wcyBkbWFfaW9tbXVfZml4ZWRfb3BzID0gewogCS5hbGxvYyAgICAgICAgICA9IGRtYV9maXhlZF9hbGxvY19jb2hlcmVudCwKIAkuZnJlZSAgICAgICAgICAgPSBkbWFfZml4ZWRfZnJlZV9jb2hlcmVudCwKIAkubWFwX3NnICAgICAgICAgPSBkbWFfZml4ZWRfbWFwX3NnLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BtdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BtdS5jCmluZGV4IDM0OGEyN2IuLmUzYWQwYzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcG11LmMKQEAgLTM4NSw3ICszODUsNyBAQAogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKIAkJaXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIElJQ19JUlFfSU9FWF9QTUkgfAogCQkJCQkgICAgICAgKG5vZGUgPDwgSUlDX0lSUV9OT0RFX1NISUZUKSk7Ci0JCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJCWlmICghaXJxKSB7CiAJCQlwcmludGsoIkVSUk9SOiBVbmFibGUgdG8gYWxsb2NhdGUgaXJxIGZvciBub2RlICVkXG4iLAogCQkJICAgICAgIG5vZGUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MTIsNyArNDEyLDcgQEAKIAkJCSAgICAgICBJSUNfSVJRX0lPRVhfUE1JCiAJCQkgICAgICAgfCAobm9kZSA8PCBJSUNfSVJRX05PREVfU0hJRlQpKTsKIAotCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFpcnEpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVJST1IsIHVuYWJsZSB0byBnZXQgZXhpc3RpbmcgaXJxICVkICIgXAogCQkiZm9yIG5vZGUgJWRcbiIsIGlycSwgbm9kZSk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9yYXMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9yYXMuYwppbmRleCAyZDRmNjBjLi40NjBhYjM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcmFzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3Jhcy5jCkBAIC0yOTgsNyArMjk4LDcgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUFBDX0lCTV9DRUxMX1JFU0VUQlVUVE9OICovCiAKLWludCBfX2luaXQgY2JlX3B0Y2FsX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGNiZV9wdGNhbF9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIAlwdGNhbF9zdGFydF90b2sgPSBydGFzX3Rva2VuKCJpYm0sY2JlLXN0YXJ0LXB0Y2FsIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3BpZGVyLXBpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwaWRlci1waWMuYwppbmRleCBkMDZkY2FjLi5mZjkyNGFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3BpZGVyLXBpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcGlkZXItcGljLmMKQEAgLTIwNywxMSArMjA3LDExIEBACiAKIAljcyA9IGluX2JlMzIocGljLT5yZWdzICsgVElSX0NTKSA+PiAyNDsKIAlpZiAoY3MgPT0gU1BJREVSX0lSUV9JTlZBTElEKQotCQl2aXJxID0gTk9fSVJROworCQl2aXJxID0gMDsKIAllbHNlCiAJCXZpcnEgPSBpcnFfbGluZWFyX3Jldm1hcChwaWMtPmhvc3QsIGNzKTsKIAotCWlmICh2aXJxICE9IE5PX0lSUSkKKwlpZiAodmlycSkKIAkJZ2VuZXJpY19oYW5kbGVfaXJxKHZpcnEpOwogCiAJY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOwpAQCAtMjQ1LDE5ICsyNDUsMTkgQEAKIAkvKiBOb3cgZG8gdGhlIGhvcnJpYmxlIGhhY2tzICovCiAJdG1wID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX25vZGUsICIjaW50ZXJydXB0LWNlbGxzIiwgTlVMTCk7CiAJaWYgKHRtcCA9PSBOVUxMKQotCQlyZXR1cm4gTk9fSVJROworCQlyZXR1cm4gMDsKIAlpbnRzaXplID0gKnRtcDsKIAlpbWFwID0gb2ZfZ2V0X3Byb3BlcnR5KG9mX25vZGUsICJpbnRlcnJ1cHQtbWFwIiwgJmltYXBsZW4pOwogCWlmIChpbWFwID09IE5VTEwgfHwgaW1hcGxlbiA8IChpbnRzaXplICsgMSkpCi0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiAwOwogCWlpYyA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKGltYXBbaW50c2l6ZV0pOwogCWlmIChpaWMgPT0gTlVMTCkKLQkJcmV0dXJuIE5PX0lSUTsKKwkJcmV0dXJuIDA7CiAJaW1hcCArPSBpbnRzaXplICsgMTsKIAl0bXAgPSBvZl9nZXRfcHJvcGVydHkoaWljLCAiI2ludGVycnVwdC1jZWxscyIsIE5VTEwpOwogCWlmICh0bXAgPT0gTlVMTCkgewogCQlvZl9ub2RlX3B1dChpaWMpOwotCQlyZXR1cm4gTk9fSVJROworCQlyZXR1cm4gMDsKIAl9CiAJaW50c2l6ZSA9ICp0bXA7CiAJLyogQXNzdW1lIHVuaXQgaXMgbGFzdCBlbnRyeSBvZiBpbnRlcnJ1cHQgc3BlY2lmaWVyICovCkBAIC0yNjYsNyArMjY2LDcgQEAKIAl0bXAgPSBvZl9nZXRfcHJvcGVydHkoaWljLCAiaWJtLGludGVycnVwdC1zZXJ2ZXItcmFuZ2VzIiwgTlVMTCk7CiAJaWYgKHRtcCA9PSBOVUxMKSB7CiAJCW9mX25vZGVfcHV0KGlpYyk7Ci0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiAwOwogCX0KIAkvKiB1Z2x5IGFzIGhlbGwgYnV0IHdvcmtzIGZvciBub3cgKi8KIAlwaWMtPm5vZGVfaWQgPSAoKnRtcCkgPj4gMTsKQEAgLTI4MSw3ICsyODEsNyBAQAogCQkJCSAgKHBpYy0+bm9kZV9pZCA8PCBJSUNfSVJRX05PREVfU0hJRlQpIHwKIAkJCQkgICgyIDw8IElJQ19JUlFfQ0xBU1NfU0hJRlQpIHwKIAkJCQkgIHVuaXQpOwotCWlmICh2aXJxID09IE5PX0lSUSkKKwlpZiAoIXZpcnEpCiAJCXByaW50ayhLRVJOX0VSUiAic3BpZGVyX3BpYzogZmFpbGVkIHRvIG1hcCBjYXNjYWRlICEiKTsKIAlyZXR1cm4gdmlycTsKIH0KQEAgLTMxOCw3ICszMTgsNyBAQAogCiAJLyogSG9vayB1cCB0aGUgY2FzY2FkZSBpbnRlcnJ1cHQgdG8gdGhlIGlpYyBhbmQgbm9kZWlkICovCiAJdmlycSA9IHNwaWRlcl9maW5kX2Nhc2NhZGVfYW5kX25vZGUocGljKTsKLQlpZiAodmlycSA9PSBOT19JUlEpCisJaWYgKCF2aXJxKQogCQlyZXR1cm47CiAJaXJxX3NldF9oYW5kbGVyX2RhdGEodmlycSwgcGljKTsKIAlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcih2aXJxLCBzcGlkZXJfaXJxX2Nhc2NhZGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwppbmRleCBiYjRhOGUwLi5lODRkOGZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwpAQCAtNDAyLDcgKzQwMiw3IEBACiB7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoc3B1LT5pcnFzWzBdICE9IE5PX0lSUSkgeworCWlmIChzcHUtPmlycXNbMF0pIHsKIAkJc25wcmludGYoc3B1LT5pcnFfYzAsIHNpemVvZiAoc3B1LT5pcnFfYzApLCAic3BlJTAyZC4wIiwKIAkJCSBzcHUtPm51bWJlcik7CiAJCXJldCA9IHJlcXVlc3RfaXJxKHNwdS0+aXJxc1swXSwgc3B1X2lycV9jbGFzc18wLApAQCAtNDEwLDcgKzQxMCw3IEBACiAJCWlmIChyZXQpCiAJCQlnb3RvIGJhaWwwOwogCX0KLQlpZiAoc3B1LT5pcnFzWzFdICE9IE5PX0lSUSkgeworCWlmIChzcHUtPmlycXNbMV0pIHsKIAkJc25wcmludGYoc3B1LT5pcnFfYzEsIHNpemVvZiAoc3B1LT5pcnFfYzEpLCAic3BlJTAyZC4xIiwKIAkJCSBzcHUtPm51bWJlcik7CiAJCXJldCA9IHJlcXVlc3RfaXJxKHNwdS0+aXJxc1sxXSwgc3B1X2lycV9jbGFzc18xLApAQCAtNDE4LDcgKzQxOCw3IEBACiAJCWlmIChyZXQpCiAJCQlnb3RvIGJhaWwxOwogCX0KLQlpZiAoc3B1LT5pcnFzWzJdICE9IE5PX0lSUSkgeworCWlmIChzcHUtPmlycXNbMl0pIHsKIAkJc25wcmludGYoc3B1LT5pcnFfYzIsIHNpemVvZiAoc3B1LT5pcnFfYzIpLCAic3BlJTAyZC4yIiwKIAkJCSBzcHUtPm51bWJlcik7CiAJCXJldCA9IHJlcXVlc3RfaXJxKHNwdS0+aXJxc1syXSwgc3B1X2lycV9jbGFzc18yLApAQCAtNDI5LDEwICs0MjksMTAgQEAKIAlyZXR1cm4gMDsKIAogYmFpbDI6Ci0JaWYgKHNwdS0+aXJxc1sxXSAhPSBOT19JUlEpCisJaWYgKHNwdS0+aXJxc1sxXSkKIAkJZnJlZV9pcnEoc3B1LT5pcnFzWzFdLCBzcHUpOwogYmFpbDE6Ci0JaWYgKHNwdS0+aXJxc1swXSAhPSBOT19JUlEpCisJaWYgKHNwdS0+aXJxc1swXSkKIAkJZnJlZV9pcnEoc3B1LT5pcnFzWzBdLCBzcHUpOwogYmFpbDA6CiAJcmV0dXJuIHJldDsKQEAgLTQ0MCwxMSArNDQwLDExIEBACiAKIHN0YXRpYyB2b2lkIHNwdV9mcmVlX2lycXMoc3RydWN0IHNwdSAqc3B1KQogewotCWlmIChzcHUtPmlycXNbMF0gIT0gTk9fSVJRKQorCWlmIChzcHUtPmlycXNbMF0pCiAJCWZyZWVfaXJxKHNwdS0+aXJxc1swXSwgc3B1KTsKLQlpZiAoc3B1LT5pcnFzWzFdICE9IE5PX0lSUSkKKwlpZiAoc3B1LT5pcnFzWzFdKQogCQlmcmVlX2lycShzcHUtPmlycXNbMV0sIHNwdSk7Ci0JaWYgKHNwdS0+aXJxc1syXSAhPSBOT19JUlEpCisJaWYgKHNwdS0+aXJxc1syXSkKIAkJZnJlZV9pcnEoc3B1LT5pcnFzWzJdLCBzcHUpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9tYW5hZ2UuYwppbmRleCAyMWI0YmZiLi42NzJkMzEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X21hbmFnZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfbWFuYWdlLmMKQEAgLTEwNSw3ICsxMDUsMTAgQEAKIAlzcHUtPmlycXNbMl0gPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgSUlDX0lSUV9DTEFTU18yIHwgaXNyYyk7CiAKIAkvKiBSaWdodCBub3csIHdlIG9ubHkgZmFpbCBpZiBjbGFzcyAyIGZhaWxlZCAqLwotCXJldHVybiBzcHUtPmlycXNbMl0gPT0gTk9fSVJRID8gLUVJTlZBTCA6IDA7CisJaWYgKCFzcHUtPmlycXNbMl0pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2luaXQgc3B1X21hcF9wcm9wX29sZChzdHJ1Y3Qgc3B1ICpzcHUsCkBAIC0xOTEsNyArMTk0LDcgQEAKIAkJcHJfZGVidWcoIiAgaXJxICVkIG5vIDB4JXggb24gJXNcbiIsIGksIG9pcnEuYXJnc1swXSwKIAkJCSBvaXJxLm5wLT5mdWxsX25hbWUpOwogCQlzcHUtPmlycXNbaV0gPSBpcnFfY3JlYXRlX29mX21hcHBpbmcoJm9pcnEpOwotCQlpZiAoc3B1LT5pcnFzW2ldID09IE5PX0lSUSkgeworCQlpZiAoIXNwdS0+aXJxc1tpXSkgewogCQkJcHJfZGVidWcoInNwdV9uZXc6IGZhaWxlZCB0byBtYXAgaXQgIVxuIik7CiAJCQlnb3RvIGVycjsKIAkJfQpAQCAtMjAyLDcgKzIwNSw3IEBACiAJcHJfZGVidWcoImZhaWxlZCB0byBtYXAgaXJxICV4IGZvciBzcHUgJXNcbiIsICpvaXJxLmFyZ3MsCiAJCXNwdS0+bmFtZSk7CiAJZm9yICg7IGkgPj0gMDsgaS0tKSB7Ci0JCWlmIChzcHUtPmlycXNbaV0gIT0gTk9fSVJRKQorCQlpZiAoc3B1LT5pcnFzW2ldKQogCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhzcHUtPmlycXNbaV0pOwogCX0KIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYwppbmRleCBiZmIzMDA2Li4wY2UxYjQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYwpAQCAtMzY4LDcgKzM2OCw3IEBACiAJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7CiAJdW5zaWduZWQgaW50IGNhc2NhZGVfaXJxID0gaTgyNTlfaXJxKCk7CiAKLQlpZiAoY2FzY2FkZV9pcnEgIT0gTk9fSVJRKQorCWlmIChjYXNjYWRlX2lycSkKIAkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKIAogCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKQEAgLTUxNCw3ICs1MTQsNyBAQAogCX0KIAlpZiAoY2hycF9tcGljICE9IE5VTEwpIHsKIAkJY2FzY2FkZV9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChwaWMsIDApOwotCQlpZiAoY2FzY2FkZV9pcnEgPT0gTk9fSVJRKQorCQlpZiAoIWNhc2NhZGVfaXJxKQogCQkJcHJpbnRrKEtFUk5fRVJSICJpODI1OTogZmFpbGVkIHRvIG1hcCBjYXNjYWRlIGlycVxuIik7CiAJCWVsc2UKIAkJCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGNhc2NhZGVfaXJxLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9mbGlwcGVyLXBpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9mbGlwcGVyLXBpYy5jCmluZGV4IGI3ODY2ZTAuLmFkZTgzODIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvZmxpcHBlci1waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2ZsaXBwZXItcGljLmMKQEAgLTE4MSw3ICsxODEsNyBAQAogCWlycV9zdGF0dXMgPSBpbl9iZTMyKGlvX2Jhc2UgKyBGTElQUEVSX0lDUikgJgogCQkgICAgIGluX2JlMzIoaW9fYmFzZSArIEZMSVBQRVJfSU1SKTsKIAlpZiAoaXJxX3N0YXR1cyA9PSAwKQotCQlyZXR1cm4gTk9fSVJROwkvKiBubyBtb3JlIElSUXMgcGVuZGluZyAqLworCQlyZXR1cm4gMDsJLyogbm8gbW9yZSBJUlFzIHBlbmRpbmcgKi8KIAogCWlycSA9IF9fZmZzKGlycV9zdGF0dXMpOwogCXJldHVybiBpcnFfbGluZWFyX3Jldm1hcChmbGlwcGVyX2lycV9ob3N0LCBpcnEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9obHdkLXBpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9obHdkLXBpYy5jCmluZGV4IDliNzk3NTcuLjg5YzU0ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaGx3ZC1waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hsd2QtcGljLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogCWlycV9zdGF0dXMgPSBpbl9iZTMyKGlvX2Jhc2UgKyBIV19CUk9BRFdBWV9JQ1IpICYKIAkJICAgICBpbl9iZTMyKGlvX2Jhc2UgKyBIV19CUk9BRFdBWV9JTVIpOwogCWlmIChpcnFfc3RhdHVzID09IDApCi0JCXJldHVybiBOT19JUlE7CS8qIG5vIG1vcmUgSVJRcyBwZW5kaW5nICovCisJCXJldHVybiAwOwkvKiBubyBtb3JlIElSUXMgcGVuZGluZyAqLwogCiAJaXJxID0gX19mZnMoaXJxX3N0YXR1cyk7CiAJcmV0dXJuIGlycV9saW5lYXJfcmV2bWFwKGgsIGlycSk7CkBAIC0xMzEsNyArMTMxLDcgQEAKIAlyYXdfc3Bpbl91bmxvY2soJmRlc2MtPmxvY2spOwogCiAJdmlycSA9IF9faGx3ZF9waWNfZ2V0X2lycShpcnFfZG9tYWluKTsKLQlpZiAodmlycSAhPSBOT19JUlEpCisJaWYgKHZpcnEpCiAJCWdlbmVyaWNfaGFuZGxlX2lycSh2aXJxKTsKIAllbHNlCiAJCXByX2Vycigic3B1cmlvdXMgaW50ZXJydXB0IVxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMKaW5kZXggZGFmYmExMC4uZGZkMzEwMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAKICNpbmNsdWRlIDxhc20vdGltZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYwppbmRleCA4MDgwNGY5Li5mOTdiYWI4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXZtZTUxMDAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXZtZTUxMDAuYwppbmRleCBlZDczMjFkLi44ZTM1OTA5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L212bWU1MTAwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tdm1lNTEwMC5jCkBAIC00Nyw3ICs0Nyw3IEBACiAJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7CiAJdW5zaWduZWQgaW50IGNhc2NhZGVfaXJxID0gaTgyNTlfaXJxKCk7CiAKLQlpZiAoY2FzY2FkZV9pcnEgIT0gTk9fSVJRKQorCWlmIChjYXNjYWRlX2lycSkKIAkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKIAogCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKQEAgLTg0LDcgKzg0LDcgQEAKIAl9CiAKIAljaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoY3AsIDApOwotCWlmIChjaXJxID09IE5PX0lSUSkgeworCWlmICghY2lycSkgewogCQlwcl93YXJuKCJtdm1lNTEwMF9waWNfaW5pdDogbm8gY2FzY2FkZSBpbnRlcnJ1cHQ/XG4iKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCmluZGV4IGEyZjg5ZTYuLmEwNTg5YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYwpAQCAtNTUyLDcgKzU1Miw3IEBACiAJICAgIHBjaV9idXNfdG9faG9zdChkZXYtPmJ1cykgPT0gdTRfcGNpZSkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiRml4dXAgVTQgUENJZSBJUlFcbiIpOwogCQlkZXYtPmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCAxKTsKLQkJaWYgKGRldi0+aXJxICE9IE5PX0lSUSkKKwkJaWYgKGRldi0+aXJxKQogCQkJaXJxX3NldF9pcnFfdHlwZShkZXYtPmlycSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKIAl9CiAKQEAgLTU2Miw3ICs1NjIsNyBAQAogCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FNRCAmJgogCSAgICBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FNRF84MTExX0lERSAmJgogCSAgICAoZGV2LT5jbGFzcyAmIDUpICE9IDUpIHsKLQkJZGV2LT5pcnEgPSBOT19JUlE7CisJCWRldi0+aXJxID0gMDsKIAl9CiAKIAlEQkcoIiA8LSBtYXBsZV9wY2lfaXJxX2ZpeHVwXG4iKTsKQEAgLTY0OCw3ICs2NDgsNyBAQAogCQlyZXR1cm4gZGVmaXJxOwogCX0KIAlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgY2hhbm5lbCAmIDB4MSk7Ci0JaWYgKGlycSA9PSBOT19JUlEpIHsKKwlpZiAoIWlycSkgewogCQlwcmludGsoIkZhaWxlZCB0byBtYXAgb25ib2FyZCBJREUgaW50ZXJydXB0IGZvciBjaGFubmVsICVkXG4iLAogCQkgICAgICAgY2hhbm5lbCk7CiAJCXJldHVybiBkZWZpcnE7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMKaW5kZXggM2MzMGM3YS4uYjdmOTM3NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdHJ1Y3Qgc21wX29wc190IG1hcGxlX3NtcF9vcHMgPSB7CitzdGF0aWMgc3RydWN0IHNtcF9vcHNfdCBtYXBsZV9zbXBfb3BzID0gewogCS5wcm9iZQkJPSBzbXBfbXBpY19wcm9iZSwKIAkubWVzc2FnZV9wYXNzCT0gc21wX21waWNfbWVzc2FnZV9wYXNzLAogCS5raWNrX2NwdQk9IHNtcF9nZW5lcmljX2tpY2tfY3B1LApAQCAtMTc2LDcgKzE3Niw3IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBtYXBsZV9zZXR1cF9hcmNoKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgbWFwbGVfc2V0dXBfYXJjaCh2b2lkKQogewogCS8qIGluaXQgdG8gc29tZSB+c2FuZSB2YWx1ZSB1bnRpbCBjYWxpYnJhdGVfZGVsYXkoKSBydW5zICovCiAJbG9vcHNfcGVyX2ppZmZ5ID0gNTAwMDAwMDA7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvS2NvbmZpZwppbmRleCAwMGQ0YjI4Li5jN2YxZGJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL0tjb25maWcKQEAgLTE0LDYgKzE0LDE2IEBACiBtZW51ICJQQSBTZW1pIFBXUmZpY2llbnQgb3B0aW9ucyIKIAlkZXBlbmRzIG9uIFBQQ19QQVNFTUkKIAorY29uZmlnIFBQQ19QQVNFTUlfTkVNTworCWJvb2wgIk5lbW8gbW90aGVyYm9hcmQgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBQQ19QQVNFTUkKKwlzZWxlY3QgUFBDX0k4MjU5CisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgJ05lbW8nIG1vdGhlcmJvYXJkCisJICB1c2VkIGluIEEtRW9ucydzIEFtaWdhb25lIFgxMDAwLiBUaGlzIGNvbnNpc3RzIG9mIHNvbWUKKwkgIGRldmljZSB0cmVlIHBhdGNoZXMgYW5kIHdvcmthcm91bmRzIGZvciB0aGUgU0I2MDAgU291dGgKKwkgIEJyaWRnZSB0aGF0IHByb3ZpZGVzIFNBVEEvVVNCL0F1ZGlvLgorCiBjb25maWcgUFBDX1BBU0VNSV9JT01NVQogCWJvb2wgIlBBIFNlbWkgSU9NTVUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBQQ19QQVNFTUkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2dwaW9fbWRpby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZ3Bpb19tZGlvLmMKaW5kZXggZGRmNjM1MC4uYzIzZTYwOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZ3Bpb19tZGlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvZ3Bpb19tZGlvLmMKQEAgLTMwNiw3ICszMDYsNyBAQAogCX0sCiB9OwogCi1pbnQgZ3Bpb19tZGlvX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgZ3Bpb19tZGlvX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCkBAIC0zMjYsNyArMzI2LDcgQEAKIH0KIG1vZHVsZV9pbml0KGdwaW9fbWRpb19pbml0KTsKIAotdm9pZCBncGlvX21kaW9fZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgZ3Bpb19tZGlvX2V4aXQodm9pZCkKIHsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ3Bpb19tZGlvX2RyaXZlcik7CiAJaWYgKGdwaW9fcmVncykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9pb21tdS5jCmluZGV4IGM2MTY2N2UuLmU3NGFkYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvaW9tbXUuYwpAQCAtMTk5LDcgKzE5OSw3IEBACiAJc2V0X2lvbW11X3RhYmxlX2Jhc2UoJmRldi0+ZGV2LCAmaW9tbXVfdGFibGVfaW9ibWFwKTsKIH0KIAotaW50IF9faW5pdCBpb2JfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQorc3RhdGljIGludCBfX2luaXQgaW9iX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkbikKIHsKIAl1bnNpZ25lZCBsb25nIHRtcDsKIAl1MzIgcmVnd29yZDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL21pc2MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL21pc2MuYwppbmRleCBlMGFiMjk5Li44NTcxZTdiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9taXNjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvbWlzYy5jCkBAIC03Niw3ICs3Niw3IEBACiAJCQl9CiAKIAkJCWluZm8uaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7Ci0JCQlpZiAoaW5mby5pcnEgPT0gTk9fSVJRKQorCQkJaWYgKCFpbmZvLmlycSkKIAkJCQlpbmZvLmlycSA9IC0xOwogCiAJCQlpZiAoZmluZF9pMmNfZHJpdmVyKG5vZGUsICZpbmZvKSA8IDApCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9tc2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL21zaS5jCmluZGV4IGQ5YWY3NjMuLmQ5Y2Q1MTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL21zaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL21zaS5jCkBAIC02OCw3ICs2OCw3IEBACiAJcHJfZGVidWcoInBhc2VtaV9tc2lfdGVhcmRvd25fbXNpX2lycXMsIHBkZXYgJXBcbiIsIHBkZXYpOwogCiAJZm9yX2VhY2hfcGNpX21zaV9lbnRyeShlbnRyeSwgcGRldikgewotCQlpZiAoZW50cnktPmlycSA9PSBOT19JUlEpCisJCWlmICghZW50cnktPmlycSkKIAkJCWNvbnRpbnVlOwogCiAJCWh3aXJxID0gdmlycV90b19odyhlbnRyeS0+aXJxKTsKQEAgLTEwOSw3ICsxMDksNyBAQAogCQl9CiAKIAkJdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhtc2lfbXBpYy0+aXJxaG9zdCwgaHdpcnEpOwotCQlpZiAodmlycSA9PSBOT19JUlEpIHsKKwkJaWYgKCF2aXJxKSB7CiAJCQlwcl9kZWJ1ZygicGFzZW1pX21zaTogZmFpbGVkIG1hcHBpbmcgaHdpcnEgMHgleFxuIiwKIAkJCQkgIGh3aXJxKTsKIAkJCW1zaV9iaXRtYXBfZnJlZV9od2lycXMoJm1zaV9tcGljLT5tc2lfYml0bWFwLCBod2lycSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCmluZGV4IGU4NmMxYmQuLjMxODI0MDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYwpAQCAtNTksNyArNTksNyBAQAogCiBzdGF0aWMgc3RydWN0IG1jZV9yZWdzIG1jZV9yZWdzW01BWF9NQ0VfUkVHU107CiBzdGF0aWMgaW50IG51bV9tY2VfcmVnczsKLXN0YXRpYyBpbnQgbm1pX3ZpcnEgPSBOT19JUlE7CitzdGF0aWMgaW50IG5taV92aXJxID0gMDsKIAogCiBzdGF0aWMgdm9pZCBfX25vcmV0dXJuIHBhc19yZXN0YXJ0KGNoYXIgKmNtZCkKQEAgLTEwNSw3ICsxMDUsNyBAQAogCWFyY2hfc3Bpbl91bmxvY2soJnRpbWViYXNlX2xvY2spOwogfQogCi1zdHJ1Y3Qgc21wX29wc190IHBhc19zbXBfb3BzID0geworc3RhdGljIHN0cnVjdCBzbXBfb3BzX3QgcGFzX3NtcF9vcHMgPSB7CiAJLnByb2JlCQk9IHNtcF9tcGljX3Byb2JlLAogCS5tZXNzYWdlX3Bhc3MJPSBzbXBfbXBpY19tZXNzYWdlX3Bhc3MsCiAJLmtpY2tfY3B1CT0gc21wX2dlbmVyaWNfa2lja19jcHUsCkBAIC0xMTUsNyArMTE1LDcgQEAKIH07CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCi12b2lkIF9faW5pdCBwYXNfc2V0dXBfYXJjaCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHBhc19zZXR1cF9hcmNoKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1NNUAogCS8qIFNldHVwIFNNUCBjYWxsYmFjayAqLwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJc3JyMCA9IHJlZ3MtPm5pcDsKIAlzcnIxID0gcmVncy0+bXNyOwogCi0JaWYgKG5taV92aXJxICE9IE5PX0lSUSAmJiBtcGljX2dldF9tY2lycSgpID09IG5taV92aXJxKSB7CisJaWYgKG5taV92aXJxICYmIG1waWNfZ2V0X21jaXJxKCkgPT0gbm1pX3ZpcnEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJOTUkgZGVsaXZlcmVkXG4iKTsKIAkJZGVidWdnZXIocmVncyk7CiAJCW1waWNfZW5kX2lycShpcnFfZ2V0X2lycV9kYXRhKG5taV92aXJxKSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2xvd19pMmMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCmluZGV4IDZkNmYyNzcuLmM4YzIxN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvbG93X2kyYy5jCkBAIC00MDEsNyArNDAxLDcgQEAKIHsKIAlzdHJ1Y3QgcG1hY19pMmNfaG9zdF9rdyAqaG9zdCA9IGJ1cy0+aG9zdGRhdGE7CiAJdTggbW9kZV9yZWcgPSBob3N0LT5zcGVlZDsKLQlpbnQgdXNlX2lycSA9IGhvc3QtPmlycSAhPSBOT19JUlEgJiYgIWJ1cy0+cG9sbGVkOworCWludCB1c2VfaXJxID0gaG9zdC0+aXJxICYmICFidXMtPnBvbGxlZDsKIAogCS8qIFNldHVwIG1vZGUgJiBzdWJhZGRyZXNzIGlmIGFueSAqLwogCXN3aXRjaChidXMtPm1vZGUpIHsKQEAgLTUzNSw3ICs1MzUsNyBAQAogCQlicmVhazsKIAl9CQogCWhvc3QtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQlpZiAoaG9zdC0+aXJxID09IE5PX0lSUSkKKwlpZiAoIWhvc3QtPmlycSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgImxvd19pMmM6IEZhaWxlZCB0byBtYXAgaW50ZXJydXB0IGZvciAlc1xuIiwKIAkJICAgICAgIG5wLT5mdWxsX25hbWUpOwpAQCAtNTU3LDcgKzU1Nyw3IEBACiAJICovCiAJaWYgKHJlcXVlc3RfaXJxKGhvc3QtPmlycSwga3dfaTJjX2lycSwgSVJRRl9OT19TVVNQRU5ELAogCQkJImtleXdlc3QgaTJjIiwgaG9zdCkpCi0JCWhvc3QtPmlycSA9IE5PX0lSUTsKKwkJaG9zdC0+aXJxID0gMDsKIAogCXByaW50ayhLRVJOX0lORk8gIktleVdlc3QgaTJjIEAweCUwOHggaXJxICVkICVzXG4iLAogCSAgICAgICAqYWRkcnAsIGhvc3QtPmlycSwgbnAtPmZ1bGxfbmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2Jhc2UuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGZ1bmNfYmFzZS5jCmluZGV4IGU0OWQwN2YuLjQ1OTEzOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGZ1bmNfYmFzZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGZ1bmNfYmFzZS5jCkBAIC0yNiw3ICsyNiw3IEBACiBzdGF0aWMgaW50IG1hY2lvX2RvX2dwaW9faXJxX2VuYWJsZShzdHJ1Y3QgcG1mX2Z1bmN0aW9uICpmdW5jKQogewogCXVuc2lnbmVkIGludCBpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChmdW5jLT5ub2RlLCAwKTsKLQlpZiAoaXJxID09IE5PX0lSUSkKKwlpZiAoIWlycSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIHJlcXVlc3RfaXJxKGlycSwgbWFjaW9fZ3Bpb19pcnEsIDAsIGZ1bmMtPm5vZGUtPm5hbWUsIGZ1bmMpOwogfQpAQCAtMzQsNyArMzQsNyBAQAogc3RhdGljIGludCBtYWNpb19kb19ncGlvX2lycV9kaXNhYmxlKHN0cnVjdCBwbWZfZnVuY3Rpb24gKmZ1bmMpCiB7CiAJdW5zaWduZWQgaW50IGlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGZ1bmMtPm5vZGUsIDApOwotCWlmIChpcnEgPT0gTk9fSVJRKQorCWlmICghaXJxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlmcmVlX2lycShpcnEsIGZ1bmMpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wZnVuY19jb3JlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2NvcmUuYwppbmRleCA0MzA3NTA4Li42OTVlOGM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2NvcmUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2NvcmUuYwpAQCAtODA0LDcgKzgwNCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbWZfdW5yZWdpc3Rlcl9kcml2ZXIpOwogCi1zdHJ1Y3QgcG1mX2Z1bmN0aW9uICpfX3BtZl9maW5kX2Z1bmN0aW9uKHN0cnVjdCBkZXZpY2Vfbm9kZSAqdGFyZ2V0LAorc3RhdGljIHN0cnVjdCBwbWZfZnVuY3Rpb24gKl9fcG1mX2ZpbmRfZnVuY3Rpb24oc3RydWN0IGRldmljZV9ub2RlICp0YXJnZXQsCiAJCQkJCSBjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICphY3RvciA9IG9mX25vZGVfZ2V0KHRhcmdldCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYwppbmRleCA5ODE1NDYzLi5mNWY5YWQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKQEAgLTI1MSw3ICsyNTEsNyBAQAogCX0KIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1hY19waWNfbG9jaywgZmxhZ3MpOwogCWlmICh1bmxpa2VseShpcnEgPCAwKSkKLQkJcmV0dXJuIE5PX0lSUTsKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIGlycV9saW5lYXJfcmV2bWFwKHBtYWNfcGljX2hvc3QsIGlycSk7CiB9CiAKQEAgLTM4OSw3ICszODksNyBAQAogCQlvdXRfbGUzMigmcG1hY19pcnFfaHdbaV0tPmVuYWJsZSwgMCk7CiAKIAkvKiBIb29rdXAgY2FzY2FkZSBpcnEgKi8KLQlpZiAoc2xhdmUgJiYgcG1hY19pcnFfY2FzY2FkZSAhPSBOT19JUlEpCisJaWYgKHNsYXZlICYmIHBtYWNfaXJxX2Nhc2NhZGUpCiAJCXNldHVwX2lycShwbWFjX2lycV9jYXNjYWRlLCAmZ2F0d2lja19jYXNjYWRlX2FjdGlvbik7CiAKIAlwcmludGsoS0VSTl9JTkZPICJpcnE6IFN5c3RlbSBoYXMgJWQgcG9zc2libGUgaW50ZXJydXB0c1xuIiwgbWF4X2lycXMpOwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAJcHN3aXRjaCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJwcm9ncmFtbWVyLXN3aXRjaCIpOwogCWlmIChwc3dpdGNoKSB7CiAJCW5taV9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChwc3dpdGNoLCAwKTsKLQkJaWYgKG5taV9pcnEgIT0gTk9fSVJRKSB7CisJCWlmIChubWlfaXJxKSB7CiAJCQltcGljX2lycV9zZXRfcHJpb3JpdHkobm1pX2lycSwgOSk7CiAJCQlzZXR1cF9pcnEobm1pX2lycSwgJnhtb25fYWN0aW9uKTsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKaW5kZXggODM0ODY4Yi4uYzllYjdkNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCkBAIC04NTIsMzcgKzg1MiwzMyBAQAogCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgaW50IHNtcF9jb3JlOTlfY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCi0JCQkJIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIHVuc2lnbmVkIGludCBzbXBfY29yZTk5X2hvc3Rfb3BlbjsKKworc3RhdGljIGludCBzbXBfY29yZTk5X2NwdV9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IHJjOwogCi0Jc3dpdGNoKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQkJLyogT3BlbiBpMmMgYnVzIGlmIGl0IHdhcyB1c2VkIGZvciB0YiBzeW5jICovCi0JCWlmIChwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCkgewotCQkJcmMgPSBwbWFjX2kyY19vcGVuKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0LCAxKTsKLQkJCWlmIChyYykgewotCQkJCXByX2VycigiRmFpbGVkIHRvIG9wZW4gaTJjIGJ1cyBmb3IgdGltZSBzeW5jXG4iKTsKLQkJCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhyYyk7Ci0JCQl9CisJLyogT3BlbiBpMmMgYnVzIGlmIGl0IHdhcyB1c2VkIGZvciB0YiBzeW5jICovCisJaWYgKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0ICYmICFzbXBfY29yZTk5X2hvc3Rfb3BlbikgeworCQlyYyA9IHBtYWNfaTJjX29wZW4ocG1hY190Yl9jbG9ja19jaGlwX2hvc3QsIDEpOworCQlpZiAocmMpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIG9wZW4gaTJjIGJ1cyBmb3IgdGltZSBzeW5jXG4iKTsKKwkJCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKHJjKTsKIAkJfQotCQlicmVhazsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JCS8qIENsb3NlIGkyYyBidXMgaWYgaXQgd2FzIHVzZWQgZm9yIHRiIHN5bmMgKi8KLQkJaWYgKHBtYWNfdGJfY2xvY2tfY2hpcF9ob3N0KQotCQkJcG1hY19pMmNfY2xvc2UocG1hY190Yl9jbG9ja19jaGlwX2hvc3QpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKKwkJc21wX2NvcmU5OV9ob3N0X29wZW4gPSAxOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNtcF9jb3JlOTlfY3B1X25iID0gewotCS5ub3RpZmllcl9jYWxsCT0gc21wX2NvcmU5OV9jcHVfbm90aWZ5LAotfTsKK3N0YXRpYyBpbnQgc21wX2NvcmU5OV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyogQ2xvc2UgaTJjIGJ1cyBpZiBpdCB3YXMgdXNlZCBmb3IgdGIgc3luYyAqLworCWlmIChwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCAmJiBzbXBfY29yZTk5X2hvc3Rfb3BlbikgeworCQlwbWFjX2kyY19jbG9zZShwbWFjX3RiX2Nsb2NrX2NoaXBfaG9zdCk7CisJCXNtcF9jb3JlOTlfaG9zdF9vcGVuID0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzbXBfY29yZTk5X2JyaW5ndXBfZG9uZSh2b2lkKQpAQCAtOTAyLDcgKzg5OCwxMSBAQAogCQlnNV9waHlfZGlzYWJsZV9jcHUxKCk7CiAJfQogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc21wX2NvcmU5OV9jcHVfbmIpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfUE9XRVJQQ19QTUFDX1BSRVBBUkUsCisJCQkJICAicG93ZXJwYy9wbWFjOnByZXBhcmUiLCBzbXBfY29yZTk5X2NwdV9wcmVwYXJlLAorCQkJCSAgTlVMTCk7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLCAicG93ZXJwYy9wbWFjOm9ubGluZSIsCisJCQkJICBzbXBfY29yZTk5X2NwdV9vbmxpbmUsIE5VTEwpOwogI2VuZGlmCiAKIAlpZiAocHBjX21kLnByb2dyZXNzKQpAQCAtOTc5LDcgKzk3OSw3IEBACiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKIC8qIENvcmU5OSBNYWNzIChkdWFsIEc0cyBhbmQgRzVzKSAqLwotc3RydWN0IHNtcF9vcHNfdCBjb3JlOTlfc21wX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc21wX29wc190IGNvcmU5OV9zbXBfb3BzID0gewogCS5tZXNzYWdlX3Bhc3MJPSBzbXBfbXBpY19tZXNzYWdlX3Bhc3MsCiAJLnByb2JlCQk9IHNtcF9jb3JlOTlfcHJvYmUsCiAjaWZkZWYgQ09ORklHX1BQQzY0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvZWVoLXBvd2VybnYuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9lZWgtcG93ZXJudi5jCmluZGV4IDg2NTQ0ZWEuLjIzNTRlYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9lZWgtcG93ZXJudi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9lZWgtcG93ZXJudi5jCkBAIC03NjMsNyArNzYzLDggQEAKIAkgKiByZXNldCBmb2xsb3dlZCBieSBob3QgcmVzZXQgb24gcm9vdCBidXMuIFNvIHdlIGFsc28KIAkgKiBuZWVkIHRoZSBQQ0kgYnVzIHNldHRsZW1lbnQgZGVsYXkuCiAJICovCi0JcmMgPSBwbnZfZWVoX3BvbGwocGhiLT5vcGFsX2lkKTsKKwlpZiAocmMgPiAwKQorCQlyYyA9IHBudl9lZWhfcG9sbChwaGItPm9wYWxfaWQpOwogCWlmIChvcHRpb24gPT0gRUVIX1JFU0VUX0RFQUNUSVZBVEUpIHsKIAkJaWYgKHN5c3RlbV9zdGF0ZSA8IFNZU1RFTV9SVU5OSU5HKQogCQkJdWRlbGF5KDEwMDAgKiBFRUhfUEVfUlNUX1NFVFRMRV9USU1FKTsKQEAgLTgwNiw3ICs4MDcsOCBAQAogCQlnb3RvIG91dDsKIAogCS8qIFBvbGwgc3RhdGUgb2YgdGhlIFBIQiB1bnRpbCB0aGUgcmVxdWVzdCBpcyBkb25lICovCi0JcmMgPSBwbnZfZWVoX3BvbGwocGhiLT5vcGFsX2lkKTsKKwlpZiAocmMgPiAwKQorCQlyYyA9IHBudl9lZWhfcG9sbChwaGItPm9wYWxfaWQpOwogCWlmIChvcHRpb24gPT0gRUVIX1JFU0VUX0RFQUNUSVZBVEUpCiAJCW1zbGVlcChFRUhfUEVfUlNUX1NFVFRMRV9USU1FKTsKIG91dDoKQEAgLTEwOTAsMTAgKzEwOTIsMTYgQEAKIAkJfQogCX0KIAotCWJ1cyA9IGVlaF9wZV9idXNfZ2V0KHBlKTsKIAlpZiAocGUtPnR5cGUgJiBFRUhfUEVfVkYpCiAJCXJldHVybiBwbnZfZWVoX3Jlc2V0X3ZmX3BlKHBlLCBvcHRpb24pOwogCisJYnVzID0gZWVoX3BlX2J1c19nZXQocGUpOworCWlmICghYnVzKSB7CisJCXByX2VycigiJXM6IENhbm5vdCBmaW5kIFBDSSBidXMgZm9yIFBIQiMlZC1QRSMleFxuIiwKKwkJCV9fZnVuY19fLCBwZS0+cGhiLT5nbG9iYWxfbnVtYmVyLCBwZS0+YWRkcik7CisJCXJldHVybiAtRUlPOworCX0KKwogCWlmIChwY2lfaXNfcm9vdF9idXMoYnVzKSB8fAogCSAgICBwY2lfaXNfcm9vdF9idXMoYnVzLT5wYXJlbnQpKQogCQlyZXR1cm4gcG52X2VlaF9yb290X3Jlc2V0KGhvc2UsIG9wdGlvbik7CkBAIC0xMzA2LDcgKzEzMTQsNyBAQAogCQlyZXR1cm47CiAJfQogCi0Jc3dpdGNoIChkYXRhLT50eXBlKSB7CisJc3dpdGNoIChiZTE2X3RvX2NwdShkYXRhLT50eXBlKSkgewogCWNhc2UgT1BBTF9QN0lPQ19ESUFHX1RZUEVfUkdDOgogCQlwcl9pbmZvKCJQN0lPQyBkaWFnLWRhdGEgZm9yIFJHQ1xuXG4iKTsKIAkJcG52X2VlaF9kdW1wX2h1Yl9kaWFnX2NvbW1vbihkYXRhKTsKQEAgLTE1MzgsNyArMTU0Niw3IEBACiAKIAkJCQkvKiBUcnkgYmVzdCB0byBjbGVhciBpdCAqLwogCQkJCW9wYWxfcGNpX2VlaF9mcmVlemVfY2xlYXIocGhiLT5vcGFsX2lkLAotCQkJCQlmcm96ZW5fcGVfbm8sCisJCQkJCWJlNjRfdG9fY3B1KGZyb3plbl9wZV9ubyksCiAJCQkJCU9QQUxfRUVIX0FDVElPTl9DTEVBUl9GUkVFWkVfQUxMKTsKIAkJCQlyZXQgPSBFRUhfTkVYVF9FUlJfTk9ORTsKIAkJCX0gZWxzZSBpZiAoKCpwZSktPnN0YXRlICYgRUVIX1BFX0lTT0xBVEVEIHx8CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvbnB1LWRtYS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L25wdS1kbWEuYwppbmRleCAwMGUxYTAxLi5hZWM4NWU3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvbnB1LWRtYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9ucHUtZG1hLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgZG1hX21hcF9vcHMgZG1hX25wdV9vcHMgPSB7CitzdGF0aWMgc3RydWN0IGRtYV9tYXBfb3BzIGRtYV9ucHVfb3BzID0gewogCS5tYXBfcGFnZQkJPSBkbWFfbnB1X21hcF9wYWdlLAogCS5tYXBfc2cJCQk9IGRtYV9ucHVfbWFwX3NnLAogCS5hbGxvYwkJCT0gZG1hX25wdV9hbGxvYywKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWR1bXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWR1bXAuYwppbmRleCAyZWU5NjQzLi40YzgyNzgyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1kdW1wLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZHVtcC5jCkBAIC0zNzAsNiArMzcwLDcgQEAKIAl1aW50MzJfdCBkdW1wX2lkLCBkdW1wX3NpemUsIGR1bXBfdHlwZTsKIAlzdHJ1Y3QgZHVtcF9vYmogKmR1bXA7CiAJY2hhciBuYW1lWzIyXTsKKwlzdHJ1Y3Qga29iamVjdCAqa29iajsKIAogCXJjID0gZHVtcF9yZWFkX2luZm8oJmR1bXBfaWQsICZkdW1wX3NpemUsICZkdW1wX3R5cGUpOwogCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpCkBAIC0zODEsOCArMzgyLDEyIEBACiAJICogdGhhdCBncmFjZWZ1bGx5IGFuZCBub3QgY3JlYXRlIHR3byBjb25mbGljdGluZwogCSAqIGVudHJpZXMuCiAJICovCi0JaWYgKGtzZXRfZmluZF9vYmooZHVtcF9rc2V0LCBuYW1lKSkKKwlrb2JqID0ga3NldF9maW5kX29iaihkdW1wX2tzZXQsIG5hbWUpOworCWlmIChrb2JqKSB7CisJCS8qIERyb3AgcmVmZXJlbmNlIGFkZGVkIGJ5IGtzZXRfZmluZF9vYmooKSAqLworCQlrb2JqZWN0X3B1dChrb2JqKTsKIAkJcmV0dXJuIDA7CisJfQogCiAJZHVtcCA9IGNyZWF0ZV9kdW1wX29iaihkdW1wX2lkLCBkdW1wX3NpemUsIGR1bXBfdHlwZSk7CiAJaWYgKCFkdW1wKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZWxvZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtZWxvZy5jCmluZGV4IDM3Zjk1OWIuLmYyMzQ0Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWVsb2cuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1lbG9nLmMKQEAgLTI0Nyw2ICsyNDcsNyBAQAogCXVpbnQ2NF90IGVsb2dfdHlwZTsKIAlpbnQgcmM7CiAJY2hhciBuYW1lWzIrMTYrMV07CisJc3RydWN0IGtvYmplY3QgKmtvYmo7CiAKIAlyYyA9IG9wYWxfZ2V0X2Vsb2dfc2l6ZSgmaWQsICZzaXplLCAmdHlwZSk7CiAJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykgewpAQCAtMjY5LDggKzI3MCwxMiBAQAogCSAqIHRoYXQgZ3JhY2VmdWxseSBhbmQgbm90IGNyZWF0ZSB0d28gY29uZmxpY3RpbmcKIAkgKiBlbnRyaWVzLgogCSAqLwotCWlmIChrc2V0X2ZpbmRfb2JqKGVsb2dfa3NldCwgbmFtZSkpCisJa29iaiA9IGtzZXRfZmluZF9vYmooZWxvZ19rc2V0LCBuYW1lKTsKKwlpZiAoa29iaikgeworCQkvKiBEcm9wIHJlZmVyZW5jZSBhZGRlZCBieSBrc2V0X2ZpbmRfb2JqKCkgKi8KKwkJa29iamVjdF9wdXQoa29iaik7CiAJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CiAKIAljcmVhdGVfZWxvZ19vYmoobG9nX2lkLCBlbG9nX3NpemUsIGVsb2dfdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWlycWNoaXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLWlycWNoaXAuYwppbmRleCBlZDhiYmE2Li45OTgzMTZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1pcnFjaGlwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtaXJxY2hpcC5jCkBAIC0yMjIsNyArMjIyLDcgQEAKIAkJLyogR2V0IGhhcmR3YXJlIGFuZCB2aXJ0dWFsIElSUSAqLwogCQlpcnEgPSBiZTMyX3RvX2NwdXAoaXJxcyk7CiAJCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgaXJxKTsKLQkJaWYgKHZpcnEgPT0gTk9fSVJRKSB7CisJCWlmICghdmlycSkgewogCQkJcHJfd2FybigiRmFpbGVkIHRvIG1hcCBpcnEgMHgleFxuIiwgaXJxKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0yNjAsNyArMjYwLDcgQEAKIGludCBvcGFsX2V2ZW50X3JlcXVlc3QodW5zaWduZWQgaW50IG9wYWxfZXZlbnRfbnIpCiB7CiAJaWYgKFdBUk5fT05fT05DRSghb3BhbF9ldmVudF9pcnFjaGlwLmRvbWFpbikpCi0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiAwOwogCiAJcmV0dXJuIGlycV9jcmVhdGVfbWFwcGluZyhvcGFsX2V2ZW50X2lycWNoaXAuZG9tYWluLCBvcGFsX2V2ZW50X25yKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXdyYXBwZXJzLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC13cmFwcGVycy5TCmluZGV4IDNkMjlkNDAuLjQ0ZDJkODQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXdyYXBwZXJzLlMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtd3JhcHBlcnMuUwpAQCAtMjA4LDYgKzIwOCw3IEBACiBPUEFMX0NBTEwob3BhbF9wY2lfY29uZmlnX3dyaXRlX2hhbGZfd29yZCwJT1BBTF9QQ0lfQ09ORklHX1dSSVRFX0hBTEZfV09SRCk7CiBPUEFMX0NBTEwob3BhbF9wY2lfY29uZmlnX3dyaXRlX3dvcmQsCQlPUEFMX1BDSV9DT05GSUdfV1JJVEVfV09SRCk7CiBPUEFMX0NBTEwob3BhbF9zZXRfeGl2ZSwJCQlPUEFMX1NFVF9YSVZFKTsKK09QQUxfQ0FMTF9SRUFMKG9wYWxfcm1fc2V0X3hpdmUsCQlPUEFMX1NFVF9YSVZFKTsKIE9QQUxfQ0FMTChvcGFsX2dldF94aXZlLAkJCU9QQUxfR0VUX1hJVkUpOwogT1BBTF9DQUxMKG9wYWxfcmVnaXN0ZXJfZXhjZXB0aW9uX2hhbmRsZXIsCU9QQUxfUkVHSVNURVJfT1BBTF9FWENFUFRJT05fSEFORExFUik7CiBPUEFMX0NBTEwob3BhbF9wY2lfZWVoX2ZyZWV6ZV9zdGF0dXMsCQlPUEFMX1BDSV9FRUhfRlJFRVpFX1NUQVRVUyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLWN4bC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS1jeGwuYwppbmRleCAxMzQ5YTA5Li45NDQ5OGEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLWN4bC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2ktY3hsLmMKQEAgLTM0NCw3ICszNDQsNyBAQAogCQkJcmV0dXJuIChod2lycSA/IGh3aXJxIDogLUVOT01FTSk7CiAKIAkJdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBod2lycSk7Ci0JCWlmICh2aXJxID09IE5PX0lSUSkgeworCQlpZiAoIXZpcnEpIHsKIAkJCXByX3dhcm4oIiVzOiBGYWlsZWQgdG8gbWFwIGN4bCBtb2RlIE1TSSB0byBsaW51eCBpcnFcbiIsCiAJCQkJcGNpX25hbWUocGRldikpOwogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0zNzQsNyArMzc0LDcgQEAKIAkJcmV0dXJuOwogCiAJZm9yX2VhY2hfcGNpX21zaV9lbnRyeShlbnRyeSwgcGRldikgewotCQlpZiAoZW50cnktPmlycSA9PSBOT19JUlEpCisJCWlmICghZW50cnktPmlycSkKIAkJCWNvbnRpbnVlOwogCQlod2lycSA9IHZpcnFfdG9faHcoZW50cnktPmlycSk7CiAJCWlycV9zZXRfbXNpX2Rlc2MoZW50cnktPmlycSwgTlVMTCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLWlvZGEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2ktaW9kYS5jCmluZGV4IGZkOTQ0NGYuLmQ0YjMzZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2ktaW9kYS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2ktaW9kYS5jCkBAIC0xMjQsMTEgKzEyNCwzMSBAQAogCQlyLT5zdGFydCA8IChwaGItPmlvZGEubTY0X2Jhc2UgKyBwaGItPmlvZGEubTY0X3NpemUpKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIHBudl9wY2lfaXNfbTY0X2ZsYWdzKHVuc2lnbmVkIGxvbmcgcmVzb3VyY2VfZmxhZ3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IChJT1JFU09VUkNFX01FTV82NCB8IElPUkVTT1VSQ0VfUFJFRkVUQ0gpOworCisJcmV0dXJuIChyZXNvdXJjZV9mbGFncyAmIGZsYWdzKSA9PSBmbGFnczsKK30KKwogc3RhdGljIHN0cnVjdCBwbnZfaW9kYV9wZSAqcG52X2lvZGFfaW5pdF9wZShzdHJ1Y3QgcG52X3BoYiAqcGhiLCBpbnQgcGVfbm8pCiB7CisJczY0IHJjOworCiAJcGhiLT5pb2RhLnBlX2FycmF5W3BlX25vXS5waGIgPSBwaGI7CiAJcGhiLT5pb2RhLnBlX2FycmF5W3BlX25vXS5wZV9udW1iZXIgPSBwZV9ubzsKIAorCS8qCisJICogQ2xlYXIgdGhlIFBFIGZyb3plbiBzdGF0ZSBhcyBpdCBtaWdodCBiZSBwdXQgaW50byBmcm96ZW4gc3RhdGUKKwkgKiBpbiB0aGUgbGFzdCBQQ0kgcmVtb3ZlIHBhdGguIEl0J3Mgbm90IGhhcm1mdWwgdG8gZG8gc28gd2hlbiB0aGUKKwkgKiBQRSBpcyBhbHJlYWR5IGluIHVuZnJvemVuIHN0YXRlLgorCSAqLworCXJjID0gb3BhbF9wY2lfZWVoX2ZyZWV6ZV9jbGVhcihwaGItPm9wYWxfaWQsIHBlX25vLAorCQkJCSAgICAgICBPUEFMX0VFSF9BQ1RJT05fQ0xFQVJfRlJFRVpFX0FMTCk7CisJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykKKwkJcHJfd2FybigiJXM6IEVycm9yICVsbGQgdW5mcmVlemluZyBQSEIjJWQtUEUjJWRcbiIsCisJCQlfX2Z1bmNfXywgcmMsIHBoYi0+aG9zZS0+Z2xvYmFsX251bWJlciwgcGVfbm8pOworCiAJcmV0dXJuICZwaGItPmlvZGEucGVfYXJyYXlbcGVfbm9dOwogfQogCkBAIC0xNDksNyArMTY5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbnZfaW9kYV9wZSAqcG52X2lvZGFfYWxsb2NfcGUoc3RydWN0IHBudl9waGIgKnBoYikKIHsKLQl1bnNpZ25lZCBsb25nIHBlID0gcGhiLT5pb2RhLnRvdGFsX3BlX251bSAtIDE7CisJbG9uZyBwZTsKIAogCWZvciAocGUgPSBwaGItPmlvZGEudG90YWxfcGVfbnVtIC0gMTsgcGUgPj0gMDsgcGUtLSkgewogCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQocGUsIHBoYi0+aW9kYS5wZV9hbGxvYykpCkBAIC0xNjIsMTEgKzE4MiwxMiBAQAogc3RhdGljIHZvaWQgcG52X2lvZGFfZnJlZV9wZShzdHJ1Y3QgcG52X2lvZGFfcGUgKnBlKQogewogCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBwZS0+cGhiOworCXVuc2lnbmVkIGludCBwZV9udW0gPSBwZS0+cGVfbnVtYmVyOwogCiAJV0FSTl9PTihwZS0+cGRldik7CiAKIAltZW1zZXQocGUsIDAsIHNpemVvZihzdHJ1Y3QgcG52X2lvZGFfcGUpKTsKLQljbGVhcl9iaXQocGUtPnBlX251bWJlciwgcGhiLT5pb2RhLnBlX2FsbG9jKTsKKwljbGVhcl9iaXQocGVfbnVtLCBwaGItPmlvZGEucGVfYWxsb2MpOwogfQogCiAvKiBUaGUgZGVmYXVsdCBNNjQgQkFSIGlzIHNoYXJlZCBieSBhbGwgUEVzICovCkBAIC00MDksNyArNDMwLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gaG9zZS0+ZG47CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJdTMyIG02NF9yYW5nZVsyXSwgaTsKLQljb25zdCB1MzIgKnI7CisJY29uc3QgX19iZTMyICpyOwogCXU2NCBwY2lfYWRkcjsKIAogCWlmIChwaGItPnR5cGUgIT0gUE5WX1BIQl9JT0RBMSAmJiBwaGItPnR5cGUgIT0gUE5WX1BIQl9JT0RBMikgewpAQCAtMjIxNiw3ICsyMjM3LDcgQEAKIAogCXBudl9wY2lfbGlua190YWJsZV9hbmRfZ3JvdXAocGhiLT5ob3NlLT5ub2RlLCBudW0sCiAJCQl0YmwsICZwZS0+dGFibGVfZ3JvdXApOwotCXBudl9wY2lfcGhiM190Y2VfaW52YWxpZGF0ZV9wZShwZSk7CisJcG52X3BjaV9pb2RhMl90Y2VfaW52YWxpZGF0ZV9wZShwZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIzNTQsNyArMjM3NSw3IEBACiAJaWYgKHJldCkKIAkJcGVfd2FybihwZSwgIlVubWFwcGluZyBmYWlsZWQsIHJldCA9ICVsZFxuIiwgcmV0KTsKIAllbHNlCi0JCXBudl9wY2lfcGhiM190Y2VfaW52YWxpZGF0ZV9wZShwZSk7CisJCXBudl9wY2lfaW9kYTJfdGNlX2ludmFsaWRhdGVfcGUocGUpOwogCiAJcG52X3BjaV91bmxpbmtfdGFibGVfYW5kX2dyb3VwKHRhYmxlX2dyb3VwLT50YWJsZXNbbnVtXSwgdGFibGVfZ3JvdXApOwogCkBAIC0yNzEwLDE1ICsyNzMxLDIxIEBACiB9CiAKICNpZmRlZiBDT05GSUdfUENJX01TSQotc3RhdGljIHZvaWQgcG52X2lvZGEyX21zaV9lb2koc3RydWN0IGlycV9kYXRhICpkKQoraW50NjRfdCBwbnZfb3BhbF9wY2lfbXNpX2VvaShzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBod19pcnEpCiB7Ci0JdW5zaWduZWQgaW50IGh3X2lycSA9ICh1bnNpZ25lZCBpbnQpaXJxZF90b19od2lycShkKTsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXAoZCk7CiAJc3RydWN0IHBudl9waGIgKnBoYiA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgcG52X3BoYiwKIAkJCQkJICAgaW9kYS5pcnFfY2hpcCk7Ci0JaW50NjRfdCByYzsKIAotCXJjID0gb3BhbF9wY2lfbXNpX2VvaShwaGItPm9wYWxfaWQsIGh3X2lycSk7CisJcmV0dXJuIG9wYWxfcGNpX21zaV9lb2kocGhiLT5vcGFsX2lkLCBod19pcnEpOworfQorCitzdGF0aWMgdm9pZCBwbnZfaW9kYTJfbXNpX2VvaShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJaW50NjRfdCByYzsKKwl1bnNpZ25lZCBpbnQgaHdfaXJxID0gKHVuc2lnbmVkIGludClpcnFkX3RvX2h3aXJxKGQpOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcChkKTsKKworCXJjID0gcG52X29wYWxfcGNpX21zaV9lb2koY2hpcCwgaHdfaXJxKTsKIAlXQVJOX09OX09OQ0UocmMpOwogCiAJaWNwX25hdGl2ZV9lb2koZCk7CkBAIC0yNzQ4LDYgKzI3NzUsMTYgQEAKIAlpcnFfc2V0X2NoaXAodmlycSwgJnBoYi0+aW9kYS5pcnFfY2hpcCk7CiB9CiAKKy8qCisgKiBSZXR1cm5zIHRydWUgaWZmIGNoaXAgaXMgc29tZXRoaW5nIHRoYXQgd2UgY291bGQgY2FsbAorICogcG52X29wYWxfcGNpX21zaV9lb2kgZm9yLgorICovCitib29sIGlzX3Budl9vcGFsX21zaShzdHJ1Y3QgaXJxX2NoaXAgKmNoaXApCit7CisJcmV0dXJuIGNoaXAtPmlycV9lb2kgPT0gcG52X2lvZGEyX21zaV9lb2k7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpc19wbnZfb3BhbF9tc2kpOworCiBzdGF0aWMgaW50IHBudl9wY2lfaW9kYV9tc2lfc2V0dXAoc3RydWN0IHBudl9waGIgKnBoYiwgc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCQkgIHVuc2lnbmVkIGludCBod2lycSwgdW5zaWduZWQgaW50IHZpcnEsCiAJCQkJICB1bnNpZ25lZCBpbnQgaXNfNjQsIHN0cnVjdCBtc2lfbXNnICptc2cpCkBAIC0yODcwLDcgKzI5MDcsNyBAQAogCQlyZXMgPSAmcGRldi0+cmVzb3VyY2VbaSArIFBDSV9JT1ZfUkVTT1VSQ0VTXTsKIAkJaWYgKCFyZXMtPmZsYWdzIHx8IHJlcy0+cGFyZW50KQogCQkJY29udGludWU7Ci0JCWlmICghcG52X3BjaV9pc19tNjQocGhiLCByZXMpKSB7CisJCWlmICghcG52X3BjaV9pc19tNjRfZmxhZ3MocmVzLT5mbGFncykpIHsKIAkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJEb24ndCBzdXBwb3J0IFNSLUlPViB3aXRoIgogCQkJCQkiIG5vbiBNNjQgVkYgQkFSJWQ6ICVwUi4gXG4iLAogCQkJCSBpLCByZXMpOwpAQCAtMzAyNSw2ICszMDYyLDM4IEBACiAJfQogfQogCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgaW50IHBudl9wY2lfZGlhZ19kYXRhX3NldCh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlzdHJ1Y3QgcG52X3BoYiAqcGhiOworCXM2NCByZXQ7CisKKwlpZiAodmFsICE9IDFVTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaG9zZSA9IChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilkYXRhOworCWlmICghaG9zZSB8fCAhaG9zZS0+cHJpdmF0ZV9kYXRhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBoYiA9IGhvc2UtPnByaXZhdGVfZGF0YTsKKworCS8qIFJldHJpZXZlIHRoZSBkaWFnIGRhdGEgZnJvbSBmaXJtd2FyZSAqLworCXJldCA9IG9wYWxfcGNpX2dldF9waGJfZGlhZ19kYXRhMihwaGItPm9wYWxfaWQsIHBoYi0+ZGlhZy5ibG9iLAorCQkJCQkgIFBOVl9QQ0lfRElBR19CVUZfU0laRSk7CisJaWYgKHJldCAhPSBPUEFMX1NVQ0NFU1MpCisJCXJldHVybiAtRUlPOworCisJLyogUHJpbnQgdGhlIGRpYWcgZGF0YSB0byB0aGUga2VybmVsIGxvZyAqLworCXBudl9wY2lfZHVtcF9waGJfZGlhZ19kYXRhKHBoYi0+aG9zZSwgcGhiLT5kaWFnLmJsb2IpOworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShwbnZfcGNpX2RpYWdfZGF0YV9mb3BzLCBOVUxMLAorCQkJcG52X3BjaV9kaWFnX2RhdGFfc2V0LCAiJWxsdVxuIik7CisKKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KKwogc3RhdGljIHZvaWQgcG52X3BjaV9pb2RhX2NyZWF0ZV9kYmdmcyh2b2lkKQogewogI2lmZGVmIENPTkZJR19ERUJVR19GUwpAQCAtMzA0MCw5ICszMTA5LDE0IEBACiAKIAkJc3ByaW50ZihuYW1lLCAiUENJJTA0eCIsIGhvc2UtPmdsb2JhbF9udW1iZXIpOwogCQlwaGItPmRiZ2ZzID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHBvd2VycGNfZGVidWdmc19yb290KTsKLQkJaWYgKCFwaGItPmRiZ2ZzKQorCQlpZiAoIXBoYi0+ZGJnZnMpIHsKIAkJCXByX3dhcm5pbmcoIiVzOiBFcnJvciBvbiBjcmVhdGluZyBkZWJ1Z2ZzIG9uIFBIQiMleFxuIiwKIAkJCQlfX2Z1bmNfXywgaG9zZS0+Z2xvYmFsX251bWJlcik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImR1bXBfZGlhZ19yZWdzIiwgMDIwMCwgcGhiLT5kYmdmcywgaG9zZSwKKwkJCQkgICAgJnBudl9wY2lfZGlhZ19kYXRhX2ZvcHMpOwogCX0KICNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KIH0KQEAgLTMwOTUsNyArMzE2OSw3IEBACiAJICogYWxpZ25tZW50IGZvciBhbnkgNjQtYml0IHJlc291cmNlLCBQQ0llIGRvZXNuJ3QgY2FyZSBhbmQKIAkgKiBicmlkZ2VzIG9ubHkgZG8gNjQtYml0IHByZWZldGNoYWJsZSBhbnl3YXkuCiAJICovCi0JaWYgKHBoYi0+aW9kYS5tNjRfc2Vnc2l6ZSAmJiAodHlwZSAmIElPUkVTT1VSQ0VfTUVNXzY0KSkKKwlpZiAocGhiLT5pb2RhLm02NF9zZWdzaXplICYmIHBudl9wY2lfaXNfbTY0X2ZsYWdzKHR5cGUpKQogCQlyZXR1cm4gcGhiLT5pb2RhLm02NF9zZWdzaXplOwogCWlmICh0eXBlICYgSU9SRVNPVVJDRV9NRU0pCiAJCXJldHVybiBwaGItPmlvZGEubTMyX3NlZ3NpemU7CkBAIC0zNDAyLDEyICszNDc2LDYgQEAKIAlzdHJ1Y3QgcG52X3BoYiAqcGhiID0gcGUtPnBoYjsKIAlzdHJ1Y3QgcG52X2lvZGFfcGUgKnNsYXZlLCAqdG1wOwogCi0JLyogUmVsZWFzZSBzbGF2ZSBQRXMgaW4gY29tcG91bmQgUEUgKi8KLQlpZiAocGUtPmZsYWdzICYgUE5WX0lPREFfUEVfTUFTVEVSKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbGF2ZSwgdG1wLCAmcGUtPnNsYXZlcywgbGlzdCkKLQkJCXBudl9pb2RhX3JlbGVhc2VfcGUoc2xhdmUpOwotCX0KLQogCWxpc3RfZGVsKCZwZS0+bGlzdCk7CiAJc3dpdGNoIChwaGItPnR5cGUpIHsKIAljYXNlIFBOVl9QSEJfSU9EQTE6CkBAIC0zNDIyLDcgKzM0OTAsMjYgQEAKIAogCXBudl9pb2RhX3JlbGVhc2VfcGVfc2VnKHBlKTsKIAlwbnZfaW9kYV9kZWNvbmZpZ3VyZV9wZShwZS0+cGhiLCBwZSk7Ci0JcG52X2lvZGFfZnJlZV9wZShwZSk7CisKKwkvKiBSZWxlYXNlIHNsYXZlIFBFcyBpbiB0aGUgY29tcG91bmQgUEUgKi8KKwlpZiAocGUtPmZsYWdzICYgUE5WX0lPREFfUEVfTUFTVEVSKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbGF2ZSwgdG1wLCAmcGUtPnNsYXZlcywgbGlzdCkgeworCQkJbGlzdF9kZWwoJnNsYXZlLT5saXN0KTsKKwkJCXBudl9pb2RhX2ZyZWVfcGUoc2xhdmUpOworCQl9CisJfQorCisJLyoKKwkgKiBUaGUgUEUgZm9yIHJvb3QgYnVzIGNhbiBiZSByZW1vdmVkIGJlY2F1c2Ugb2YgaG90cGx1ZyBpbiBFRUgKKwkgKiByZWNvdmVyeSBmb3IgZmVuY2VkIFBIQiBlcnJvci4gV2UgbmVlZCB0byBtYXJrIHRoZSBQRSBkZWFkIHNvCisJICogdGhhdCBpdCBjYW4gYmUgcG9wdWxhdGVkIGFnYWluIGluIFBDSSBob3QgYWRkIHBhdGguIFRoZSBQRQorCSAqIHNob3VsZG4ndCBiZSBkZXN0cm95ZWQgYXMgaXQncyB0aGUgZ2xvYmFsIHJlc2VydmVkIHJlc291cmNlLgorCSAqLworCWlmIChwaGItPmlvZGEucm9vdF9wZV9wb3B1bGF0ZWQgJiYKKwkgICAgcGhiLT5pb2RhLnJvb3RfcGVfaWR4ID09IHBlLT5wZV9udW1iZXIpCisJCXBoYi0+aW9kYS5yb290X3BlX3BvcHVsYXRlZCA9IGZhbHNlOworCWVsc2UKKwkJcG52X2lvZGFfZnJlZV9wZShwZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHBudl9wY2lfcmVsZWFzZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpCkBAIC0zNDM4LDcgKzM1MjUsMTcgQEAKIAlpZiAoIXBkbiB8fCBwZG4tPnBlX251bWJlciA9PSBJT0RBX0lOVkFMSURfUEUpCiAJCXJldHVybjsKIAorCS8qCisJICogUENJIGhvdHBsdWcgY2FuIGhhcHBlbiBhcyBwYXJ0IG9mIEVFSCBlcnJvciByZWNvdmVyeS4gVGhlIEBwZG4KKwkgKiBpc24ndCByZW1vdmVkIGFuZCBhZGRlZCBhZnRlcndhcmRzIGluIHRoaXMgc2NlbmFyaW8uIFdlIHNob3VsZAorCSAqIHNldCB0aGUgUEUgbnVtYmVyIGluIEBwZG4gdG8gYW4gaW52YWxpZCBvbmUuIE90aGVyd2lzZSwgdGhlIFBFJ3MKKwkgKiBkZXZpY2UgY291bnQgaXMgZGVjcmVhc2VkIG9uIHJlbW92aW5nIGRldmljZXMgd2hpbGUgZmFpbGluZyB0bworCSAqIGJlIGluY3JlYXNlZCBvbiBhZGRpbmcgZGV2aWNlcy4gSXQgbGVhZHMgdG8gdW5iYWxhbmNlZCBQRSdzIGRldmljZQorCSAqIGNvdW50IGFuZCBldmVudHVhbGx5IG1ha2Ugbm9ybWFsIFBDSSBob3RwbHVnIHBhdGggYnJva2VuLgorCSAqLwogCXBlID0gJnBoYi0+aW9kYS5wZV9hcnJheVtwZG4tPnBlX251bWJlcl07CisJcGRuLT5wZV9udW1iZXIgPSBJT0RBX0lOVkFMSURfUEU7CisKIAlXQVJOX09OKC0tcGUtPmRldmljZV9jb3VudCA8IDApOwogCWlmIChwZS0+ZGV2aWNlX2NvdW50ID09IDApCiAJCXBudl9pb2RhX3JlbGVhc2VfcGUocGUpOwpAQCAtMzczMiwxMCArMzgyOSwxMSBAQAogCWlmIChyYykKIAkJcHJfd2FybmluZygiICBPUEFMIEVycm9yICVsZCBwZXJmb3JtaW5nIElPREEgdGFibGUgcmVzZXQgIVxuIiwgcmMpOwogCi0JLyogSWYgd2UncmUgcnVubmluZyBpbiBrZHVtcCBrZXJlbmwsIHRoZSBwcmV2aW91cyBrZXJlbmwgbmV2ZXIKKwkvKgorCSAqIElmIHdlJ3JlIHJ1bm5pbmcgaW4ga2R1bXAga2VybmVsLCB0aGUgcHJldmlvdXMga2VybmVsIG5ldmVyCiAJICogc2h1dGRvd24gUENJIGRldmljZXMgY29ycmVjdGx5LiBXZSBhbHJlYWR5IGdvdCBJT0RBIHRhYmxlCiAJICogY2xlYW5lZCBvdXQuIFNvIHdlIGhhdmUgdG8gaXNzdWUgUEhCIHJlc2V0IHRvIHN0b3AgYWxsIFBDSQotCSAqIHRyYW5zYWN0aW9ucyBmcm9tIHByZXZpb3VzIGtlcmVubC4KKwkgKiB0cmFuc2FjdGlvbnMgZnJvbSBwcmV2aW91cyBrZXJuZWwuCiAJICovCiAJaWYgKGlzX2tkdW1wX2tlcm5lbCgpKSB7CiAJCXByX2luZm8oIiAgSXNzdWUgUEhCIHJlc2V0IC4uLlxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLmMKaW5kZXggYTIxZDgzMS4uZGI3YjgwMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2kuYwpAQCAtMTg2LDcgKzE4Niw3IEBACiAJCQlyZXR1cm4gLUVOT1NQQzsKIAkJfQogCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIHBoYi0+bXNpX2Jhc2UgKyBod2lycSk7Ci0JCWlmICh2aXJxID09IE5PX0lSUSkgeworCQlpZiAoIXZpcnEpIHsKIAkJCXByX3dhcm4oIiVzOiBGYWlsZWQgdG8gbWFwIE1TSSB0byBsaW51eCBpcnFcbiIsCiAJCQkJcGNpX25hbWUocGRldikpOwogCQkJbXNpX2JpdG1hcF9mcmVlX2h3aXJxcygmcGhiLT5tc2lfYm1wLCBod2lycSwgMSk7CkBAIC0yMTcsNyArMjE3LDcgQEAKIAkJcmV0dXJuOwogCiAJZm9yX2VhY2hfcGNpX21zaV9lbnRyeShlbnRyeSwgcGRldikgewotCQlpZiAoZW50cnktPmlycSA9PSBOT19JUlEpCisJCWlmICghZW50cnktPmlycSkKIAkJCWNvbnRpbnVlOwogCQlod2lycSA9IHZpcnFfdG9faHcoZW50cnktPmlycSk7CiAJCWlycV9zZXRfbXNpX2Rlc2MoZW50cnktPmlycSwgTlVMTCk7CkBAIC0zMDksOCArMzA5LDggQEAKIAkJCWJlNjRfdG9fY3B1KGRhdGEtPmRtYTFFcnJvckxvZzEpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBPUEFMX1A3SU9DX05VTV9QRVNUX1JFR1M7IGkrKykgewotCQlpZiAoKGRhdGEtPnBlc3RBW2ldID4+IDYzKSA9PSAwICYmCi0JCSAgICAoZGF0YS0+cGVzdEJbaV0gPj4gNjMpID09IDApCisJCWlmICgoYmU2NF90b19jcHUoZGF0YS0+cGVzdEFbaV0pID4+IDYzKSA9PSAwICYmCisJCSAgICAoYmU2NF90b19jcHUoZGF0YS0+cGVzdEJbaV0pID4+IDYzKSA9PSAwKQogCQkJY29udGludWU7CiAKIAkJcHJfaW5mbygiUEVbJTNkXSBBL0I6ICUwMTZsbHggJTAxNmxseFxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9kZXZpY2UtaW5pdC5jCmluZGV4IDU3Y2FhZjEuLmU0ODQ2MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL2RldmljZS1pbml0LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvZGV2aWNlLWluaXQuYwpAQCAtNjIsNyArNjIsNyBAQAogCQkmZGV2LT5scG0ucmlnaHRzKTsKIAogCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkOiBwczNfcmVwb3NpdG9yeV9yZWFkX2xwbV9wcml2bGVnZXMgZmFpbGVkIFxuIiwKKwkJcHJfZGVidWcoIiVzOiVkOiBwczNfcmVwb3NpdG9yeV9yZWFkX2xwbV9wcml2aWxlZ2VzIGZhaWxlZFxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCWdvdG8gZmFpbF9yZWFkX3JlcG87CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwppbmRleCBiODMxNjM4Li45OGY4YzM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwpAQCAtMTkyLDcgKzE5Miw3IEBACiAKIAkqdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBvdXRsZXQpOwogCi0JaWYgKCp2aXJxID09IE5PX0lSUSkgeworCWlmICghKnZpcnEpIHsKIAkJRkFJTCgiJXM6JWQ6IGlycV9jcmVhdGVfbWFwcGluZyBmYWlsZWQ6IG91dGxldCAlbHVcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIG91dGxldCk7CiAJCXJlc3VsdCA9IC1FTk9NRU07CkBAIC0zMzksNyArMzM5LDcgQEAKIAlpZiAocmVzdWx0KSB7CiAJCUZBSUwoIiVzOiVkOiBsdjFfY29uc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCBmYWlsZWQ6ICVzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOwotCQkqdmlycSA9IE5PX0lSUTsKKwkJKnZpcnEgPSAwOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIApAQCAtNDE4LDcgKzQxOCw3IEBACiAJCQkiIGZhaWxlZDogJXNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJCXBzM19yZXN1bHQocmVzdWx0KSk7CiAJCXBzM19ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveSgqdmlycSk7Ci0JCSp2aXJxID0gTk9fSVJROworCQkqdmlycSA9IDA7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC03MjQsMTIgKzcyNCwxMiBAQAogCWFzbSB2b2xhdGlsZSgiY250bHpkICUwLCUxIiA6ICI9ciIgKHBsdWcpIDogInIiICh4KSk7CiAJcGx1ZyAmPSAweDNmOwogCi0JaWYgKHVubGlrZWx5KHBsdWcgPT0gTk9fSVJRKSkgeworCWlmICh1bmxpa2VseSghcGx1ZykpIHsKIAkJREJHKCIlczolZDogbm8gcGx1ZyBmb3VuZDogdGhyZWFkX2lkICVsbHVcbiIsIF9fZnVuY19fLAogCQkJX19MSU5FX18sIHBkLT50aHJlYWRfaWQpOwogCQlkdW1wX2JtcCgmcGVyX2NwdShwczNfcHJpdmF0ZSwgMCkpOwogCQlkdW1wX2JtcCgmcGVyX2NwdShwczNfcHJpdmF0ZSwgMSkpOwotCQlyZXR1cm4gTk9fSVJROworCQlyZXR1cm4gMDsKIAl9CiAKICNpZiBkZWZpbmVkKERFQlVHKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYwppbmRleCAzYzc3MDdhLi42MDE1NGQwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYwpAQCAtOTEsNyArOTEsNyBAQAogCQkJcmVzdWx0ID0gc21wX3JlcXVlc3RfbWVzc2FnZV9pcGkodmlycXNbaV0sIGkpOwogCiAJCQlpZiAocmVzdWx0KQotCQkJCXZpcnFzW2ldID0gTk9fSVJROworCQkJCXZpcnFzW2ldID0gMDsKIAkJCWVsc2UKIAkJCQlwczNfcmVnaXN0ZXJfaXBpX2lycShjcHUsIHZpcnFzW2ldKTsKIAkJfQpAQCAtMTEyLDcgKzExMiw3IEBACiAJZm9yIChpID0gMDsgaSA8IE1TR19DT1VOVDsgaSsrKSB7CiAJCS8qIENhbid0IGNhbGwgZnJlZV9pcnEgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4gKi8KIAkJcHMzX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KHZpcnFzW2ldKTsKLQkJdmlycXNbaV0gPSBOT19JUlE7CisJCXZpcnFzW2ldID0gMDsKIAl9CiAKIAlEQkcoIiA8LSAlczolZDogKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc3B1LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYwppbmRleCA0OTJiMjU3Li5iNTQ4NTA4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYwpAQCAtMjg0LDcgKzI4NCw3IEBACiBmYWlsX2FsbG9jXzE6CiAJcHMzX3NwZV9pcnFfZGVzdHJveShzcHUtPmlycXNbMF0pOwogZmFpbF9hbGxvY18wOgotCXNwdS0+aXJxc1swXSA9IHNwdS0+aXJxc1sxXSA9IHNwdS0+aXJxc1syXSA9IE5PX0lSUTsKKwlzcHUtPmlycXNbMF0gPSBzcHUtPmlycXNbMV0gPSBzcHUtPmlycXNbMl0gPSAwOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTMzNCw3ICszMzQsNyBAQAogCXBzM19zcGVfaXJxX2Rlc3Ryb3koc3B1LT5pcnFzWzFdKTsKIAlwczNfc3BlX2lycV9kZXN0cm95KHNwdS0+aXJxc1swXSk7CiAKLQlzcHUtPmlycXNbMF0gPSBzcHUtPmlycXNbMV0gPSBzcHUtPmlycXNbMl0gPSBOT19JUlE7CisJc3B1LT5pcnFzWzBdID0gc3B1LT5pcnFzWzFdID0gc3B1LT5pcnFzWzJdID0gMDsKIAogCXNwdV91bm1hcChzcHUpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZGxwYXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kbHBhci5jCmluZGV4IDQ3NDgxMjQuLjQyM2U0NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9kbHBhci5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcnRhcy5oPgogCi1zdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcHNlcmllc19ocF93cTsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcHNlcmllc19ocF93cTsKIAogc3RydWN0IHBzZXJpZXNfaHBfd29yayB7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CkBAIC0zNzcsNyArMzc3LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXZvaWQgcHNlcmllc19ocF93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3N0YXRpYyB2b2lkIHBzZXJpZXNfaHBfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHBzZXJpZXNfaHBfd29yayAqaHBfd29yayA9CiAJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHBzZXJpZXNfaHBfd29yaywgd29yayk7CkBAIC00MTMsNiArNDEzLDcgQEAKIAkJcXVldWVfd29yayhwc2VyaWVzX2hwX3dxLCAoc3RydWN0IHdvcmtfc3RydWN0ICopd29yayk7CiAJfSBlbHNlIHsKIAkJKnJjID0gLUVOT01FTTsKKwkJa2ZyZWUoaHBfZXJybG9nX2NvcHkpOwogCQljb21wbGV0ZShob3RwbHVnX2RvbmUpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ldmVudF9zb3VyY2VzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZXZlbnRfc291cmNlcy5jCmluZGV4IGE2ZGRjYTguLjMyMTg3ZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ldmVudF9zb3VyY2VzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2V2ZW50X3NvdXJjZXMuYwpAQCAtMzQsNyArMzQsNyBAQAogCQlpZiAoY291bnQgPiAxNSkKIAkJCWJyZWFrOwogCQl2aXJxc1tjb3VudF0gPSBpcnFfY3JlYXRlX29mX21hcHBpbmcoJm9pcnEpOwotCQlpZiAodmlycXNbY291bnRdID09IE5PX0lSUSkgeworCQlpZiAoIXZpcnFzW2NvdW50XSkgewogCQkJcHJfZXJyKCJldmVudC1zb3VyY2VzOiBVbmFibGUgdG8gYWxsb2NhdGUgIgogCQkJICAgICAgICJpbnRlcnJ1cHQgbnVtYmVyIGZvciAlc1xuIiwKIAkJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9tc2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9tc2kuYwppbmRleCA1NDNhNjM4Li4zMjZlZjBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbXNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL21zaS5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwogCiAJZm9yX2VhY2hfcGNpX21zaV9lbnRyeShlbnRyeSwgcGRldikgewotCQlpZiAoZW50cnktPmlycSA9PSBOT19JUlEpCisJCWlmICghZW50cnktPmlycSkKIAkJCWNvbnRpbnVlOwogCiAJCWlycV9zZXRfbXNpX2Rlc2MoZW50cnktPmlycSwgTlVMTCk7CkBAIC00NzEsNyArNDcxLDcgQEAKIAogCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGh3aXJxKTsKIAotCQlpZiAodmlycSA9PSBOT19JUlEpIHsKKwkJaWYgKCF2aXJxKSB7CiAJCQlwcl9kZWJ1ZygicnRhc19tc2k6IEZhaWxlZCBtYXBwaW5nIGh3aXJxICVkXG4iLCBod2lycSk7CiAJCQlyZXR1cm4gLUVOT1NQQzsKIAkJfQpAQCAtNDkwLDcgKzQ5MCw3IEBACiBzdGF0aWMgdm9pZCBydGFzX21zaV9wY2lfaXJxX2ZpeHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCS8qIE5vIExTSSAtPiBsZWF2ZSBNU0lzIChpZiBhbnkpIGNvbmZpZ3VyZWQgKi8KLQlpZiAocGRldi0+aXJxID09IE5PX0lSUSkgeworCWlmICghcGRldi0+aXJxKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgInJ0YXNfbXNpOiBubyBMU0ksIG5vdGhpbmcgdG8gZG8uXG4iKTsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2kuYwppbmRleCBmZTE2YTUwLi4wOWViYTVhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaS5jCkBAIC0xMTksNiArMTE5LDEwIEBACiAKIAlidXMgPSBicmlkZ2UtPmJ1czsKIAorCS8qIFJlbHkgb24gdGhlIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyX2RlZmVycmVkKCkgY2FsbGJhY2suICovCisJcGNpX3NldF9ob3N0X2JyaWRnZV9yZWxlYXNlKGJyaWRnZSwgcGNpYmlvc19mcmVlX2NvbnRyb2xsZXJfZGVmZXJyZWQsCisJCQkJCSh2b2lkICopIHBjaV9idXNfdG9faG9zdChidXMpKTsKKwogCWRuID0gcGNpYmlvc19nZXRfcGhiX29mX25vZGUoYnVzKTsKIAlpZiAoIWRuKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wY2lfZGxwYXIuYwppbmRleCA5MDZkYmFhLi41NDdmZDEzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcGNpX2RscGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BjaV9kbHBhci5jCkBAIC0xMDYsOCArMTA2LDExIEBACiAJCXJlbGVhc2VfcmVzb3VyY2UocmVzKTsKIAl9CiAKLQkvKiBGcmVlIHBjaV9jb250cm9sbGVyIGRhdGEgc3RydWN0dXJlICovCi0JcGNpYmlvc19mcmVlX2NvbnRyb2xsZXIocGhiKTsKKwkvKgorCSAqIFRoZSBwY2lfY29udHJvbGxlciBkYXRhIHN0cnVjdHVyZSBpcyBmcmVlZCBieQorCSAqIHRoZSBwY2liaW9zX2ZyZWVfY29udHJvbGxlcl9kZWZlcnJlZCgpIGNhbGxiYWNrOworCSAqIHNlZSBwc2VyaWVzX3Jvb3RfYnJpZGdlX3ByZXBhcmUoKS4KKwkgKi8KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NjYW5sb2cuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zY2FubG9nLmMKaW5kZXggYjUwMmFiNi4uN2QyOGNhYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NjYW5sb2cuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2NhbmxvZy5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzY2FubG9nX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzY2FubG9nX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5yZWFkCQk9IHNjYW5sb2dfcmVhZCwKIAkud3JpdGUJCT0gc2NhbmxvZ193cml0ZSwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKaW5kZXggNGZmY2FhNi4uOTdhYTNmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKQEAgLTQxLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KIAogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC02Niw2ICs2NSw3IEBACiAjaW5jbHVkZSA8YXNtL2VlaC5oPgogI2luY2x1ZGUgPGFzbS9yZWcuaD4KICNpbmNsdWRlIDxhc20vcGxwYXJfd3JhcHBlcnMuaD4KKyNpbmNsdWRlIDxhc20va2V4ZWMuaD4KIAogI2luY2x1ZGUgInBzZXJpZXMuaCIKIApAQCAtMTE0LDcgKzExNCw3IEBACiAJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7CiAJdW5zaWduZWQgaW50IGNhc2NhZGVfaXJxID0gaTgyNTlfaXJxKCk7CiAKLQlpZiAoY2FzY2FkZV9pcnEgIT0gTk9fSVJRKQorCWlmIChjYXNjYWRlX2lycSkKIAkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKIAogCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKQEAgLTE0MSw3ICsxNDEsNyBAQAogCX0KIAogCWNhc2NhZGUgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChmb3VuZCwgMCk7Ci0JaWYgKGNhc2NhZGUgPT0gTk9fSVJRKSB7CisJaWYgKCFjYXNjYWRlKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicGljOiBmYWlsZWQgdG8gbWFwIGNhc2NhZGUgaW50ZXJydXB0Iik7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2F4b25yYW0uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jCmluZGV4IDkxNDQyMDQuLmFkYTI5ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jCkBAIC0yNDAsNyArMjQwLDcgQEAKIAlkZXZpY2VfYWRkX2Rpc2soJmRldmljZS0+ZGV2LCBiYW5rLT5kaXNrKTsKIAogCWJhbmstPmlycV9pZCA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRldmljZS0+ZGV2Lm9mX25vZGUsIDApOwotCWlmIChiYW5rLT5pcnFfaWQgPT0gTk9fSVJRKSB7CisJaWYgKCFiYW5rLT5pcnFfaWQpIHsKIAkJZGV2X2VycigmZGV2aWNlLT5kZXYsICJDYW5ub3QgYWNjZXNzIEVDQyBpbnRlcnJ1cHQgSURcbiIpOwogCQlyYyA9IC1FRkFVTFQ7CiAJCWdvdG8gZmFpbGVkOwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJCQlBWE9OX1JBTV9JUlFfRkxBR1MsIGJhbmstPmRpc2stPmRpc2tfbmFtZSwgZGV2aWNlKTsKIAlpZiAocmMgIT0gMCkgewogCQlkZXZfZXJyKCZkZXZpY2UtPmRldiwgIkNhbm5vdCByZWdpc3RlciBFQ0MgaW50ZXJydXB0IGhhbmRsZXJcbiIpOwotCQliYW5rLT5pcnFfaWQgPSBOT19JUlE7CisJCWJhbmstPmlycV9pZCA9IDA7CiAJCXJjID0gLUVGQVVMVDsKIAkJZ290byBmYWlsZWQ7CiAJfQpAQCAtMjY4LDcgKzI2OCw3IEBACiAKIGZhaWxlZDoKIAlpZiAoYmFuayAhPSBOVUxMKSB7Ci0JCWlmIChiYW5rLT5pcnFfaWQgIT0gTk9fSVJRKQorCQlpZiAoYmFuay0+aXJxX2lkKQogCQkJZnJlZV9pcnEoYmFuay0+aXJxX2lkLCBkZXZpY2UpOwogCQlpZiAoYmFuay0+ZGlzayAhPSBOVUxMKSB7CiAJCQlpZiAoYmFuay0+ZGlzay0+bWFqb3IgPiAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9jcG0xLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYwppbmRleCA2YzExMDk5Li4zYzBlYjliIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbTEuYwpAQCAtMTMyLDcgKzEzMiw3IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CiAJc3RydWN0IHJlc291cmNlIHJlczsKLQl1bnNpZ25lZCBpbnQgc2lycSA9IE5PX0lSUSwgaHdpcnEsIGVpcnE7CisJdW5zaWduZWQgaW50IHNpcnEgPSAwLCBod2lycSwgZWlycTsKIAlpbnQgcmV0OwogCiAJcHJfZGVidWcoImNwbV9waWNfaW5pdFxuIik7CkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJZ290byBlbmQ7CiAKIAlzaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCWlmIChzaXJxID09IE5PX0lSUSkKKwlpZiAoIXNpcnEpCiAJCWdvdG8gZW5kOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgQ1BNIGludGVycnVwdCBjb250cm9sbGVyLiAqLwpAQCAtMTY4LDcgKzE2OCw3IEBACiAJY3BtX3BpY19ob3N0ID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKG5wLCA2NCwgJmNwbV9waWNfaG9zdF9vcHMsIE5VTEwpOwogCWlmIChjcG1fcGljX2hvc3QgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNQTTIgUElDOiBmYWlsZWQgdG8gYWxsb2NhdGUgaXJxIGhvc3QhXG4iKTsKLQkJc2lycSA9IE5PX0lSUTsKKwkJc2lycSA9IDA7CiAJCWdvdG8gZW5kOwogCX0KIApAQCAtMTgyLDcgKzE4Miw3IEBACiAJfQogCiAJZWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQlpZiAoZWlycSA9PSBOT19JUlEpCisJaWYgKCFlaXJxKQogCQlnb3RvIGVuZDsKIAogCWlmIChzZXR1cF9pcnEoZWlycSwgJmNwbV9lcnJvcl9pcnFhY3Rpb24pKQpAQCAtNTM0LDcgKzUzNCw4IEBACiAKIHN0YXRpYyB2b2lkIGNwbTFfZ3BpbzE2X3NhdmVfcmVncyhzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYykKIHsKLQlzdHJ1Y3QgY3BtMV9ncGlvMTZfY2hpcCAqY3BtMV9nYyA9IGdwaW9jaGlwX2dldF9kYXRhKCZtbV9nYy0+Z2MpOworCXN0cnVjdCBjcG0xX2dwaW8xNl9jaGlwICpjcG0xX2djID0KKwkJY29udGFpbmVyX29mKG1tX2djLCBzdHJ1Y3QgY3BtMV9ncGlvMTZfY2hpcCwgbW1fZ2MpOwogCXN0cnVjdCBjcG1faW9wb3J0MTYgX19pb21lbSAqaW9wID0gbW1fZ2MtPnJlZ3M7CiAKIAljcG0xX2djLT5jcGRhdGEgPSBpbl9iZTE2KCZpb3AtPmRhdCk7CkBAIC02NDksNyArNjUwLDggQEAKIAogc3RhdGljIHZvaWQgY3BtMV9ncGlvMzJfc2F2ZV9yZWdzKHN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tX2djKQogewotCXN0cnVjdCBjcG0xX2dwaW8zMl9jaGlwICpjcG0xX2djID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoJm1tX2djLT5nYyk7CisJc3RydWN0IGNwbTFfZ3BpbzMyX2NoaXAgKmNwbTFfZ2MgPQorCQljb250YWluZXJfb2YobW1fZ2MsIHN0cnVjdCBjcG0xX2dwaW8zMl9jaGlwLCBtbV9nYyk7CiAJc3RydWN0IGNwbV9pb3BvcnQzMmIgX19pb21lbSAqaW9wID0gbW1fZ2MtPnJlZ3M7CiAKIAljcG0xX2djLT5jcGRhdGEgPSBpbl9iZTMyKCZpb3AtPmRhdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2NwbV9jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCmluZGV4IDkxMTQ1NmQuLjk0N2Y0MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvY3BtX2NvbW1vbi5jCkBAIC05NCw3ICs5NCw4IEBACiAKIHN0YXRpYyB2b2lkIGNwbTJfZ3BpbzMyX3NhdmVfcmVncyhzdHJ1Y3Qgb2ZfbW1fZ3Bpb19jaGlwICptbV9nYykKIHsKLQlzdHJ1Y3QgY3BtMl9ncGlvMzJfY2hpcCAqY3BtMl9nYyA9IGdwaW9jaGlwX2dldF9kYXRhKCZtbV9nYy0+Z2MpOworCXN0cnVjdCBjcG0yX2dwaW8zMl9jaGlwICpjcG0yX2djID0KKwkJY29udGFpbmVyX29mKG1tX2djLCBzdHJ1Y3QgY3BtMl9ncGlvMzJfY2hpcCwgbW1fZ2MpOwogCXN0cnVjdCBjcG0yX2lvcG9ydHMgX19pb21lbSAqaW9wID0gbW1fZ2MtPnJlZ3M7CiAKIAljcG0yX2djLT5jcGRhdGEgPSBpbl9iZTMyKCZpb3AtPmRhdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2Vodl9waWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZWh2X3BpYy5jCmluZGV4IGJmZmNjN2EuLjQ4ODY2ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZWh2X3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZWh2X3BpYy5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIAkuaXJxX3NldF90eXBlCT0gZWh2X3BpY19zZXRfaXJxX3R5cGUsCiB9OwogCi0vKiBSZXR1cm4gYW4gaW50ZXJydXB0IHZlY3RvciBvciBOT19JUlEgaWYgbm8gaW50ZXJydXB0IGlzIHBlbmRpbmcuICovCisvKiBSZXR1cm4gYW4gaW50ZXJydXB0IHZlY3RvciBvciAwIGlmIG5vIGludGVycnVwdCBpcyBwZW5kaW5nLiAqLwogdW5zaWduZWQgaW50IGVodl9waWNfZ2V0X2lycSh2b2lkKQogewogCWludCBpcnE7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJZXZfaW50X2lhY2soMCwgJmlycSk7IC8qIGxlZ2FjeSBtb2RlICovCiAKIAlpZiAoaXJxID09IDB4RkZGRikgICAgLyogMHhGRkZGIC0tPiBubyBpcnEgaXMgcGVuZGluZyAqLwotCQlyZXR1cm4gTk9fSVJROworCQlyZXR1cm4gMDsKIAogCS8qCiAJICogdGhpcyB3aWxsIGFsc28gc2V0dXAgcmV2bWFwW10gaW4gdGhlIHNsb3cgcGF0aCBmb3IgdGhlIGZpcnN0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9ndG0uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2d0bS5jCmluZGV4IDA2YWMzYzYuLmE2ZjBiOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2d0bS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2d0bS5jCkBAIC00MDYsNyArNDA2LDcgQEAKIAkJCXVuc2lnbmVkIGludCBpcnE7CiAKIAkJCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCBpKTsKLQkJCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJCQlpZiAoIWlycSkgewogCQkJCXByX2VycigiJXM6IG5vdCBlbm91Z2ggaW50ZXJydXB0cyBzcGVjaWZpZWRcbiIsCiAJCQkJICAgICAgIG5wLT5mdWxsX25hbWUpOwogCQkJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXBpY19lcnIuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21waWNfZXJyLmMKaW5kZXggYjgzZjMyNS4uNDg4ZWM0NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXBpY19lcnIuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tcGljX2Vyci5jCkBAIC0xMTUsOCArMTE1LDggQEAKIAkJZXJyaW50ID0gX19idWlsdGluX2NseihlaXNyKTsKIAkJY2FzY2FkZV9pcnEgPSBpcnFfbGluZWFyX3Jldm1hcChtcGljLT5pcnFob3N0LAogCQkJCSBtcGljLT5lcnJfaW50X3ZlY3NbZXJyaW50XSk7Ci0JCVdBUk5fT04oY2FzY2FkZV9pcnEgPT0gTk9fSVJRKTsKLQkJaWYgKGNhc2NhZGVfaXJxICE9IE5PX0lSUSkgeworCQlXQVJOX09OKCFjYXNjYWRlX2lycSk7CisJCWlmIChjYXNjYWRlX2lycSkgewogCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKIAkJfSBlbHNlIHsKIAkJCWVpbXIgfD0gIDEgPDwgKDMxIC0gZXJyaW50KTsKQEAgLTEzNCw3ICsxMzQsNyBAQAogCWludCByZXQ7CiAKIAl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKG1waWMtPmlycWhvc3QsIGlycW51bSk7Ci0JaWYgKHZpcnEgPT0gTk9fSVJRKSB7CisJaWYgKCF2aXJxKSB7CiAJCXByX2VycigiRXJyb3IgaW50ZXJydXB0IHNldHVwIGZhaWxlZFxuIik7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9tc2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5jCmluZGV4IDNhMmJlMzYuLjhhMjQ0ODIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAlpcnFfaHdfbnVtYmVyX3QgaHdpcnE7CiAKIAlmb3JfZWFjaF9wY2lfbXNpX2VudHJ5KGVudHJ5LCBwZGV2KSB7Ci0JCWlmIChlbnRyeS0+aXJxID09IE5PX0lSUSkKKwkJaWYgKCFlbnRyeS0+aXJxKQogCQkJY29udGludWU7CiAJCWh3aXJxID0gdmlycV90b19odyhlbnRyeS0+aXJxKTsKIAkJbXNpX2RhdGEgPSBpcnFfZ2V0X2NoaXBfZGF0YShlbnRyeS0+aXJxKTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogCiAJCXZpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcobXNpX2RhdGEtPmlycWhvc3QsIGh3aXJxKTsKIAotCQlpZiAodmlycSA9PSBOT19JUlEpIHsKKwkJaWYgKCF2aXJxKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsIG1hcHBpbmcgaHdpcnEgJWlcbiIsIGh3aXJxKTsKIAkJCW1zaV9iaXRtYXBfZnJlZV9od2lycXMoJm1zaV9kYXRhLT5iaXRtYXAsIGh3aXJxLCAxKTsKIAkJCXJjID0gLUVOT1NQQzsKQEAgLTI4NSw3ICsyODUsNyBAQAogCW1zaXJfaW5kZXggPSBjYXNjYWRlX2RhdGEtPmluZGV4OwogCiAJaWYgKG1zaXJfaW5kZXggPj0gTlJfTVNJX1JFR19NQVgpCi0JCWNhc2NhZGVfaXJxID0gTk9fSVJROworCQljYXNjYWRlX2lycSA9IDA7CiAKIAlzd2l0Y2ggKG1zaV9kYXRhLT5mZWF0dXJlICYgRlNMX1BJQ19JUF9NQVNLKSB7CiAJY2FzZSBGU0xfUElDX0lQX01QSUM6CkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJY2FzY2FkZV9pcnEgPSBpcnFfbGluZWFyX3Jldm1hcChtc2lfZGF0YS0+aXJxaG9zdCwKIAkJCQltc2lfaHdpcnEobXNpX2RhdGEsIG1zaXJfaW5kZXgsCiAJCQkJCSAgaW50cl9pbmRleCArIGhhdmVfc2hpZnQpKTsKLQkJaWYgKGNhc2NhZGVfaXJxICE9IE5PX0lSUSkgeworCQlpZiAoY2FzY2FkZV9pcnEpIHsKIAkJCWdlbmVyaWNfaGFuZGxlX2lycShjYXNjYWRlX2lycSk7CiAJCQlyZXQgPSBJUlFfSEFORExFRDsKIAkJfQpAQCAtMzM3LDcgKzMzNyw3IEBACiAJCWlmIChtc2ktPmNhc2NhZGVfYXJyYXlbaV0pIHsKIAkJCXZpcnEgPSBtc2ktPmNhc2NhZGVfYXJyYXlbaV0tPnZpcnE7CiAKLQkJCUJVR19PTih2aXJxID09IE5PX0lSUSk7CisJCQlCVUdfT04oIXZpcnEpOwogCiAJCQlmcmVlX2lycSh2aXJxLCBtc2ktPmNhc2NhZGVfYXJyYXlbaV0pOwogCQkJa2ZyZWUobXNpLT5jYXNjYWRlX2FycmF5W2ldKTsKQEAgLTM2Miw3ICszNjIsNyBAQAogCWludCB2aXJ0X21zaXIsIGksIHJldDsKIAogCXZpcnRfbXNpciA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRldi0+ZGV2Lm9mX25vZGUsIGlycV9pbmRleCk7Ci0JaWYgKHZpcnRfbXNpciA9PSBOT19JUlEpIHsKKwlpZiAoIXZpcnRfbXNpcikgewogCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzOiBDYW5ub3QgdHJhbnNsYXRlIElSUSBpbmRleCAlZFxuIiwKIAkJCV9fZnVuY19fLCBpcnFfaW5kZXgpOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKaW5kZXggNjhlN2MwZC4uM2NjN2NhYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKQEAgLTIzLDcgKzIzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2dlL2dlX3BpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9nZS9nZV9waWMuYwppbmRleCBkNTdiNzc1Li4wMjU1M2E4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2dlL2dlX3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZ2UvZ2VfcGljLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCSAqLwogCWNhc2NhZGVfaXJxID0gZ2VmX3BpY19nZXRfaXJxKCk7CiAKLQlpZiAoY2FzY2FkZV9pcnEgIT0gTk9fSVJRKQorCWlmIChjYXNjYWRlX2lycSkKIAkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKIAogCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCiAJLyogTWFwIGNvbnRyb2xsZXIgKi8KIAlnZWZfcGljX2Nhc2NhZGVfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCWlmIChnZWZfcGljX2Nhc2NhZGVfaXJxID09IE5PX0lSUSkgeworCWlmICghZ2VmX3BpY19jYXNjYWRlX2lycSkgewogCQlwcmludGsoS0VSTl9FUlIgIlNCQzYxMDogZmFpbGVkIHRvIG1hcCBjYXNjYWRlIGludGVycnVwdCIpOwogCQlyZXR1cm47CiAJfQpAQCAtMjIzLDEyICsyMjMsMTIgQEAKIAogLyoKICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhbiBpbnRlcnJ1cHQgd2l0aCBhcHBhcmVudGx5IGNvbWVzIGZyb20gdGhpcwotICogY2hpcCAtIGNoZWNrLCByZXR1cm5pbmcgdGhlIGhpZ2hlc3QgaW50ZXJydXB0IGdlbmVyYXRlZCBvciByZXR1cm4gTk9fSVJRCisgKiBjaGlwIC0gY2hlY2ssIHJldHVybmluZyB0aGUgaGlnaGVzdCBpbnRlcnJ1cHQgZ2VuZXJhdGVkIG9yIHJldHVybiAwLgogICovCiB1bnNpZ25lZCBpbnQgZ2VmX3BpY19nZXRfaXJxKHZvaWQpCiB7CiAJdTMyIGNhdXNlLCBtYXNrLCBhY3RpdmU7Ci0JdW5zaWduZWQgaW50IHZpcnEgPSBOT19JUlE7CisJdW5zaWduZWQgaW50IHZpcnEgPSAwOwogCWludCBod2lycTsKIAogCWNhdXNlID0gaW5fYmUzMihnZWZfcGljX2lycV9yZWdfYmFzZSArIEdFRl9QSUNfSU5UUl9TVEFUVVMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9pODI1OS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9pODI1OS5jCmluZGV4IGFhMmMxODYuLmJhZmIwMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaTgyNTkuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2k4MjU5LmMKQEAgLTY4LDkgKzY4LDkgQEAKIAkJaWYgKCFwY2lfaW50YWNrKQogCQkJb3V0YigweDBCLCAweDIwKTsJLyogSVNSIHJlZ2lzdGVyICovCiAJCWlmKH5pbmIoMHgyMCkgJiAweDgwKQotCQkJaXJxID0gTk9fSVJROworCQkJaXJxID0gMDsKIAl9IGVsc2UgaWYgKGlycSA9PSAweGZmKQotCQlpcnEgPSBOT19JUlE7CisJCWlycSA9IDA7CiAKIAlpZiAobG9jaykKIAkJcmF3X3NwaW5fdW5sb2NrKCZpODI1OV9sb2NrKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvaXBpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9pcGljLmMKaW5kZXggZjc2ZWUzOS4uZjI2N2VlMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9pcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9pcGljLmMKQEAgLTg1Myw3ICs4NTMsNyBAQAogCWlwaWNfd3JpdGUocHJpbWFyeV9pcGljLT5yZWdzLCBJUElDX1NFUk1SLCBtYXNrKTsKIH0KIAotLyogUmV0dXJuIGFuIGludGVycnVwdCB2ZWN0b3Igb3IgTk9fSVJRIGlmIG5vIGludGVycnVwdCBpcyBwZW5kaW5nLiAqLworLyogUmV0dXJuIGFuIGludGVycnVwdCB2ZWN0b3Igb3IgMCBpZiBubyBpbnRlcnJ1cHQgaXMgcGVuZGluZy4gKi8KIHVuc2lnbmVkIGludCBpcGljX2dldF9pcnEodm9pZCkKIHsKIAlpbnQgaXJxOwpAQCAtODY0LDcgKzg2NCw3IEBACiAJaXJxID0gaXBpY19yZWFkKHByaW1hcnlfaXBpYy0+cmVncywgSVBJQ19TSVZDUikgJiBJUElDX1NJVkNSX1ZFQ1RPUl9NQVNLOwogCiAJaWYgKGlycSA9PSAwKSAgICAvKiAwIC0tPiBubyBpcnEgaXMgcGVuZGluZyAqLwotCQlyZXR1cm4gTk9fSVJROworCQlyZXR1cm4gMDsKIAogCXJldHVybiBpcnFfbGluZWFyX3Jldm1hcChwcmltYXJ5X2lwaWMtPmlycWhvc3QsIGlycSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21taW9fbnZyYW0uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbW1pb19udnJhbS5jCmluZGV4IDY5ZjU4MTQuLmMzMWY2MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbW1pb19udnJhbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbW1pb19udnJhbS5jCkBAIC04OSw3ICs4OSw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi12b2lkIG1taW9fbnZyYW1fd3JpdGVfdmFsKGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3N0YXRpYyB2b2lkIG1taW9fbnZyYW1fd3JpdGVfdmFsKGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21wYzh4eF9waWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5jCmluZGV4IGI3Y2Y3YWIuLjNlODI4YjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBjOHh4X3BpYy5jCkBAIC03OSw3ICs3OSw3IEBACiAJaXJxID0gaW5fYmUzMigmc2l1X3JlZy0+c2Nfc2l2ZWMpID4+IDI2OwogCiAJaWYgKGlycSA9PSBQSUNfVkVDX1NQVVJSSU9VUykKLQkJaXJxID0gTk9fSVJROworCQlpcnEgPSAwOwogCiAgICAgICAgIHJldHVybiBpcnFfbGluZWFyX3Jldm1hcChtcGM4eHhfcGljX2hvc3QsIGlycSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKaW5kZXggN2RlNDViMi4uNGQ0OGNlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKQEAgLTE2NDksNyArMTY0OSw3IEBACiAJLyogQ2hlY2sgaWYgdGhpcyBNUElDIGlzIGNoYWluZWQgZnJvbSBhIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwogCWlmIChtcGljLT5mbGFncyAmIE1QSUNfU0VDT05EQVJZKSB7CiAJCWludCB2aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobXBpYy0+bm9kZSwgMCk7Ci0JCWlmICh2aXJxICE9IE5PX0lSUSkgeworCQlpZiAodmlycSkgewogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGhvb2tpbmcgdXAgdG8gSVJRICVkXG4iLAogCQkJCQltcGljLT5ub2RlLT5mdWxsX25hbWUsIHZpcnEpOwogCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEodmlycSwgbXBpYyk7CkBAIC0xNzc4LDEzICsxNzc4LDEzIEBACiAJaWYgKHVubGlrZWx5KHNyYyA9PSBtcGljLT5zcHVyaW91c192ZWMpKSB7CiAJCWlmIChtcGljLT5mbGFncyAmIE1QSUNfU1BWX0VPSSkKIAkJCW1waWNfZW9pKG1waWMpOwotCQlyZXR1cm4gTk9fSVJROworCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHVubGlrZWx5KG1waWMtPnByb3RlY3RlZCAmJiB0ZXN0X2JpdChzcmMsIG1waWMtPnByb3RlY3RlZCkpKSB7CiAJCXByaW50a19yYXRlbGltaXRlZChLRVJOX1dBUk5JTkcgIiVzOiBHb3QgcHJvdGVjdGVkIHNvdXJjZSAlZCAhXG4iLAogCQkJCSAgIG1waWMtPm5hbWUsIChpbnQpc3JjKTsKIAkJbXBpY19lb2kobXBpYyk7Ci0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiAwOwogCX0KIAogCXJldHVybiBpcnFfbGluZWFyX3Jldm1hcChtcGljLT5pcnFob3N0LCBzcmMpOwpAQCAtMTgxNywxNyArMTgxNywxNyBAQAogCWlmICh1bmxpa2VseShzcmMgPT0gbXBpYy0+c3B1cmlvdXNfdmVjKSkgewogCQlpZiAobXBpYy0+ZmxhZ3MgJiBNUElDX1NQVl9FT0kpCiAJCQltcGljX2VvaShtcGljKTsKLQkJcmV0dXJuIE5PX0lSUTsKKwkJcmV0dXJuIDA7CiAJfQogCWlmICh1bmxpa2VseShtcGljLT5wcm90ZWN0ZWQgJiYgdGVzdF9iaXQoc3JjLCBtcGljLT5wcm90ZWN0ZWQpKSkgewogCQlwcmludGtfcmF0ZWxpbWl0ZWQoS0VSTl9XQVJOSU5HICIlczogR290IHByb3RlY3RlZCBzb3VyY2UgJWQgIVxuIiwKIAkJCQkgICBtcGljLT5uYW1lLCAoaW50KXNyYyk7Ci0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiAwOwogCX0KIAogCXJldHVybiBpcnFfbGluZWFyX3Jldm1hcChtcGljLT5pcnFob3N0LCBzcmMpOwogI2Vsc2UKLQlyZXR1cm4gTk9fSVJROworCXJldHVybiAwOwogI2VuZGlmCiB9CiAKQEAgLTE4NTIsNyArMTg1Miw3IEBACiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQl1bnNpZ25lZCBpbnQgdmlwaSA9IGlycV9jcmVhdGVfbWFwcGluZyhtcGljLT5pcnFob3N0LAogCQkJCQkJICAgICAgIG1waWMtPmlwaV92ZWNzWzBdICsgaSk7Ci0JCWlmICh2aXBpID09IE5PX0lSUSkgeworCQlpZiAoIXZpcGkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG1hcCAlc1xuIiwgc21wX2lwaV9uYW1lW2ldKTsKIAkJCWNvbnRpbnVlOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWNfbXNnci5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljX21zZ3IuYwppbmRleCAzZjE2NWQ5Li5kYjIyODZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWNfbXNnci5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY19tc2dyLmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogCiAJCWlmIChyZWNlaXZlX21hc2sgJiAoMSA8PCBpKSkgewogCQkJbXNnci0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIGlycV9pbmRleCk7Ci0JCQlpZiAobXNnci0+aXJxID09IE5PX0lSUSkgeworCQkJaWYgKCFtc2dyLT5pcnEpIHsKIAkJCQlkZXZfZXJyKCZkZXYtPmRldiwKIAkJCQkJCSJNaXNzaW5nIGludGVycnVwdCBzcGVjaWZpZXIiKTsKIAkJCQlrZnJlZShtc2dyKTsKQEAgLTI0Niw3ICsyNDYsNyBAQAogCQkJfQogCQkJaXJxX2luZGV4ICs9IDE7CiAJCX0gZWxzZSB7Ci0JCQltc2dyLT5pcnEgPSBOT19JUlE7CisJCQltc2dyLT5pcnEgPSAwOwogCQl9CiAKIAkJbXBpY19tc2dyc1tyZWdfbnVtYmVyXSA9IG1zZ3I7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWNfdTNtc2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY191M21zaS5jCmluZGV4IDJjYmM3ZTIuLmNmYzFjNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY191M21zaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpY191M21zaS5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAlpcnFfaHdfbnVtYmVyX3QgaHdpcnE7CiAKIAlmb3JfZWFjaF9wY2lfbXNpX2VudHJ5KGVudHJ5LCBwZGV2KSB7Ci0JCWlmIChlbnRyeS0+aXJxID09IE5PX0lSUSkKKwkJaWYgKCFlbnRyeS0+aXJxKQogCQkJY29udGludWU7CiAKIAkJaHdpcnEgPSB2aXJxX3RvX2h3KGVudHJ5LT5pcnEpOwpAQCAtMTU1LDcgKzE1NSw3IEBACiAJCW1zZy5hZGRyZXNzX2hpID0gYWRkciA+PiAzMjsKIAogCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKG1zaV9tcGljLT5pcnFob3N0LCBod2lycSk7Ci0JCWlmICh2aXJxID09IE5PX0lSUSkgeworCQlpZiAoIXZpcnEpIHsKIAkJCXByX2RlYnVnKCJ1M21zaTogZmFpbGVkIG1hcHBpbmcgaHdpcnEgMHgleFxuIiwgaHdpcnEpOwogCQkJbXNpX2JpdG1hcF9mcmVlX2h3aXJxcygmbXNpX21waWMtPm1zaV9iaXRtYXAsIGh3aXJxLCAxKTsKIAkJCXJldHVybiAtRU5PU1BDOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tdjY0eDYwX3BpYy5jCmluZGV4IDBmODQyZGQuLmE3OTk1M2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXY2NHg2MF9waWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L212NjR4NjBfcGljLmMKQEAgLTI3Miw3ICsyNzIsNyBAQAogCXUzMiBjYXVzZTsKIAlpbnQgbGV2ZWwxOwogCWlycV9od19udW1iZXJfdCBod2lycTsKLQlpbnQgdmlycSA9IE5PX0lSUTsKKwlpbnQgdmlycSA9IDA7CiAKIAljYXVzZSA9IGluX2xlMzIobXY2NHg2MF9pcnFfcmVnX2Jhc2UgKyBNVjY0WDYwX0lDX0NQVTBfU0VMRUNUX0NBVVNFKTsKIAlpZiAoY2F1c2UgJiBNVjY0WDYwX1NFTEVDVF9DQVVTRV9ISUdIKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BtaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wbWkuYwppbmRleCA4YTBiNzdhLi45ZWE2YTIyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BtaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcG1pLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogCWRhdGEtPmRldiA9IGRldjsKIAogCWRhdGEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQlpZiAoZGF0YS0+aXJxID09IE5PX0lSUSkgeworCWlmICghZGF0YS0+aXJxKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicG1pOiBpbnZhbGlkIGludGVycnVwdC5cbiIpOwogCQlyYyA9IC1FRkFVTFQ7CiAJCWdvdG8gZXJyb3JfY2xlYW51cF9pb21hcDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X2hzdGFfbXNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9oc3RhX21zaS5jCmluZGV4IDUyYTkzZGMuLjk5MjZhZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X2hzdGFfbXNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfaHN0YV9tc2kuYwpAQCAtNjAsNyArNjAsNyBAQAogCQl9CiAKIAkJaHdpcnEgPSBwcGM0eHhfaHN0YV9tc2kuaXJxX21hcFtpcnFdOwotCQlpZiAoaHdpcnEgPT0gTk9fSVJRKSB7CisJCWlmICghaHdpcnEpIHsKIAkJCXByX2VycigiJXM6IEZhaWxlZCBtYXBwaW5nIGlycSAlZFxuIiwgX19mdW5jX18sIGlycSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMTEwLDcgKzExMCw3IEBACiAJaW50IGlycTsKIAogCWZvcl9lYWNoX3BjaV9tc2lfZW50cnkoZW50cnksIGRldikgewotCQlpZiAoZW50cnktPmlycSA9PSBOT19JUlEpCisJCWlmICghZW50cnktPmlycSkKIAkJCWNvbnRpbnVlOwogCiAJCWlycSA9IGhzdGFfZmluZF9od2lycV9vZmZzZXQoZW50cnktPmlycSk7CkBAIC0xNjYsNyArMTY2LDcgQEAKIAlmb3IgKGlycSA9IDA7IGlycSA8IGlycV9jb3VudDsgaXJxKyspIHsKIAkJcHBjNHh4X2hzdGFfbXNpLmlycV9tYXBbaXJxXSA9CiAJCQlpcnFfb2ZfcGFyc2VfYW5kX21hcChkZXYtPm9mX25vZGUsIGlycSk7Ci0JCWlmIChwcGM0eHhfaHN0YV9tc2kuaXJxX21hcFtpcnFdID09IE5PX0lSUSkgeworCQlpZiAoIXBwYzR4eF9oc3RhX21zaS5pcnFfbWFwW2lycV0pIHsKIAkJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIG1hcCBJUlFcbiIpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0MjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X21zaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfbXNpLmMKaW5kZXggOGZiODA2MS4uNTkwZGFiNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfbXNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfbXNpLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCQkJCQlfX2Z1bmNfXyk7CiAJCX0KIAkJdmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG1zaV9kYXRhLT5tc2lfZGV2LCBpbnRfbm8pOwotCQlpZiAodmlycSA9PSBOT19JUlEpIHsKKwkJaWYgKCF2aXJxKSB7CiAJCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzOiBmYWlsIG1hcHBpbmcgaXJxXG4iLCBfX2Z1bmNfXyk7CiAJCQltc2lfYml0bWFwX2ZyZWVfaHdpcnFzKCZtc2lfZGF0YS0+Yml0bWFwLCBpbnRfbm8sIDEpOwogCQkJcmV0dXJuIC1FTk9TUEM7CkBAIC0xMjksNyArMTI5LDcgQEAKIAlkZXZfZGJnKCZkZXYtPmRldiwgIlBDSUUtTVNJOiB0ZWFyaW5nIGRvd24gbXNpIGlycXNcbiIpOwogCiAJZm9yX2VhY2hfcGNpX21zaV9lbnRyeShlbnRyeSwgZGV2KSB7Ci0JCWlmIChlbnRyeS0+aXJxID09IE5PX0lSUSkKKwkJaWYgKCFlbnRyeS0+aXJxKQogCQkJY29udGludWU7CiAJCWh3aXJxID0gdmlycV90b19odyhlbnRyeS0+aXJxKTsKIAkJaXJxX3NldF9tc2lfZGVzYyhlbnRyeS0+aXJxLCBOVUxMKTsKQEAgLTIwMSw3ICsyMDEsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG1zaV9pcnFzOyBpKyspIHsKIAkJdmlycSA9IG1zaS0+bXNpX3ZpcnFzW2ldOwotCQlpZiAodmlycSAhPSBOT19JUlEpCisJCWlmICh2aXJxKQogCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyh2aXJxKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3NvYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfc29jLmMKaW5kZXggNWM3N2M5Yi4uZDQxMTM0ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfc29jLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9wcGM0eHhfc29jLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogCiAJLyogR2V0IGFuZCBtYXAgaXJxIG51bWJlciBmcm9tIGRldmljZSB0cmVlICovCiAJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFpcnEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpcnFfb2ZfcGFyc2VfYW5kX21hcCBmYWlsZWRcbiIpOwogCQlvZl9ub2RlX3B1dChucCk7CiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi90c2kxMDhfcGNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9wY2kuYwppbmRleCAzNzlkZTk1Li41N2M5NzFiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3RzaTEwOF9wY2kuYwpAQCAtNDMzLDcgKzQzMyw3IEBACiAJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7CiAJdW5zaWduZWQgaW50IGNhc2NhZGVfaXJxID0gZ2V0X3BjaV9zb3VyY2UoKTsKIAotCWlmIChjYXNjYWRlX2lycSAhPSBOT19JUlEpCisJaWYgKGNhc2NhZGVfaXJxKQogCQlnZW5lcmljX2hhbmRsZV9pcnEoY2FzY2FkZV9pcnEpOwogCiAJY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi91aWMuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvdWljLmMKaW5kZXggNjg5M2Q4Zi4uYTAwOTQ5ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi91aWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3VpYy5jCkBAIC0zMTksNyArMzE5LDcgQEAKIAl9CiB9CiAKLS8qIFJldHVybiBhbiBpbnRlcnJ1cHQgdmVjdG9yIG9yIE5PX0lSUSBpZiBubyBpbnRlcnJ1cHQgaXMgcGVuZGluZy4gKi8KKy8qIFJldHVybiBhbiBpbnRlcnJ1cHQgdmVjdG9yIG9yIDAgaWYgbm8gaW50ZXJydXB0IGlzIHBlbmRpbmcuICovCiB1bnNpZ25lZCBpbnQgdWljX2dldF9pcnEodm9pZCkKIHsKIAl1MzIgbXNyOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1odi5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1odi5jCmluZGV4IGMxOTE3Y2YuLmU3ZmEyNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3AtaHYuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLWh2LmMKQEAgLTExMiwxMCArMTEyLDEwIEBACiAJdW5zaWduZWQgaW50IGlycTsKIAogCWlmICh2ZWMgPT0gWElDU19JUlFfU1BVUklPVVMpCi0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiAwOwogCiAJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyh4aWNzX2hvc3QsIHZlYyk7Ci0JaWYgKGxpa2VseShpcnEgIT0gTk9fSVJRKSkgeworCWlmIChsaWtlbHkoaXJxKSkgewogCQl4aWNzX3B1c2hfY3Bwcih2ZWMpOwogCQlyZXR1cm4gaXJxOwogCX0KQEAgLTEyNiw3ICsxMjYsNyBAQAogCS8qIFdlIG1pZ2h0IGxlYXJuIGFib3V0IGl0IGxhdGVyLCBzbyBFT0kgaXQgKi8KIAlpY3BfaHZfc2V0X3hpcnIoeGlycik7CiAKLQlyZXR1cm4gTk9fSVJROworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpY3BfaHZfc2V0X2NwdV9wcmlvcml0eSh1bnNpZ25lZCBjaGFyIGNwcHIpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW5hdGl2ZS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1uYXRpdmUuYwppbmRleCBhZmRmNjJmLi44YTZhMDQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLW5hdGl2ZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3AtbmF0aXZlLmMKQEAgLTEyNCwxMCArMTI0LDEwIEBACiAJdW5zaWduZWQgaW50IGlycTsKIAogCWlmICh2ZWMgPT0gWElDU19JUlFfU1BVUklPVVMpCi0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiAwOwogCiAJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyh4aWNzX2hvc3QsIHZlYyk7Ci0JaWYgKGxpa2VseShpcnEgIT0gTk9fSVJRKSkgeworCWlmIChsaWtlbHkoaXJxKSkgewogCQl4aWNzX3B1c2hfY3Bwcih2ZWMpOwogCQlyZXR1cm4gaXJxOwogCX0KQEAgLTEzOCw3ICsxMzgsNyBAQAogCS8qIFdlIG1pZ2h0IGxlYXJuIGFib3V0IGl0IGxhdGVyLCBzbyBFT0kgaXQgKi8KIAlpY3BfbmF0aXZlX3NldF94aXJyKHhpcnIpOwogCi0JcmV0dXJuIE5PX0lSUTsKKwlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3Atb3BhbC5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1vcGFsLmMKaW5kZXggNTdkNzJmMS4uZDM4ZTg2ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1vcGFsLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1vcGFsLmMKQEAgLTIzLDEwICsyMywxMCBAQAogCiBzdGF0aWMgdm9pZCBpY3Bfb3BhbF90ZWFyZG93bl9jcHUodm9pZCkKIHsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWludCBod19jcHUgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKIAogCS8qIENsZWFyIGFueSBwZW5kaW5nIElQSSAqLwotCW9wYWxfaW50X3NldF9tZnJyKGNwdSwgMHhmZik7CisJb3BhbF9pbnRfc2V0X21mcnIoaHdfY3B1LCAweGZmKTsKIH0KIAogc3RhdGljIHZvaWQgaWNwX29wYWxfZmx1c2hfaXBpKHZvaWQpCkBAIC01MSwxNCArNTEsMTQgQEAKIAogCXJjID0gb3BhbF9pbnRfZ2V0X3hpcnIoJnhpcnIsIGZhbHNlKTsKIAlpZiAocmMgPCAwKQotCQlyZXR1cm4gTk9fSVJROworCQlyZXR1cm4gMDsKIAl4aXJyID0gYmUzMl90b19jcHUoeGlycik7CiAJdmVjID0geGlyciAmIDB4MDBmZmZmZmY7CiAJaWYgKHZlYyA9PSBYSUNTX0lSUV9TUFVSSU9VUykKLQkJcmV0dXJuIE5PX0lSUTsKKwkJcmV0dXJuIDA7CiAKIAlpcnEgPSBpcnFfZmluZF9tYXBwaW5nKHhpY3NfaG9zdCwgdmVjKTsKLQlpZiAobGlrZWx5KGlycSAhPSBOT19JUlEpKSB7CisJaWYgKGxpa2VseShpcnEpKSB7CiAJCXhpY3NfcHVzaF9jcHByKHZlYyk7CiAJCXJldHVybiBpcnE7CiAJfQpAQCAtNjksNyArNjksNyBAQAogCS8qIFdlIG1pZ2h0IGxlYXJuIGFib3V0IGl0IGxhdGVyLCBzbyBFT0kgaXQgKi8KIAlvcGFsX2ludF9lb2koeGlycik7CiAKLQlyZXR1cm4gTk9fSVJROworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpY3Bfb3BhbF9zZXRfY3B1X3ByaW9yaXR5KHVuc2lnbmVkIGNoYXIgY3BwcikKQEAgLTEwMSwxNCArMTAxLDE2IEBACiAKIHN0YXRpYyB2b2lkIGljcF9vcGFsX2NhdXNlX2lwaShpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jb3BhbF9pbnRfc2V0X21mcnIoY3B1LCBJUElfUFJJT1JJVFkpOworCWludCBod19jcHUgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7CisKKwlvcGFsX2ludF9zZXRfbWZycihod19jcHUsIElQSV9QUklPUklUWSk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBpY3Bfb3BhbF9pcGlfYWN0aW9uKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWludCBod19jcHUgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKIAotCW9wYWxfaW50X3NldF9tZnJyKGNwdSwgMHhmZik7CisJb3BhbF9pbnRfc2V0X21mcnIoaHdfY3B1LCAweGZmKTsKIAogCXJldHVybiBzbXBfaXBpX2RlbXV4KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MveGljcy1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy94aWNzLWNvbW1vbi5jCmluZGV4IDlkNTMwZjQuLjY5ZDg1OGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy94aWNzLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy94aWNzLWNvbW1vbi5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAl1bnNpZ25lZCBpbnQgaXBpOwogCiAJaXBpID0gaXJxX2NyZWF0ZV9tYXBwaW5nKHhpY3NfaG9zdCwgWElDU19JUEkpOwotCUJVR19PTihpcGkgPT0gTk9fSVJRKTsKKwlCVUdfT04oIWlwaSk7CiAKIAkvKgogCSAqIElQSXMgYXJlIG1hcmtlZCBJUlFGX1BFUkNQVS4gVGhlIGhhbmRsZXIgd2FzIHNldCBpbiBtYXAuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi9zcHJfYWNjZXNzLlMgYi9hcmNoL3Bvd2VycGMveG1vbi9zcHJfYWNjZXNzLlMKaW5kZXggODRhZDc0Mi4uN2Q4YjBlOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24vc3ByX2FjY2Vzcy5TCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3Nwcl9hY2Nlc3MuUwpAQCAtMiwxMiArMiwxMiBAQAogCiAvKiB1bnNpZ25lZCBsb25nIHhtb25fbWZzcHIoc3BybiwgZGVmYXVsdF92YWx1ZSkgKi8KIF9HTE9CQUwoeG1vbl9tZnNwcikKLQlsZAlyNSwgLkxtZnNwcl90YWJsZUBnb3QocjIpCisJUFBDX0xMCXI1LCAuTG1mc3ByX3RhYmxlQGdvdChyMikKIAliCXhtb25fbXhzcHIKIAogLyogdm9pZCB4bW9uX210c3ByKHNwcm4sIG5ld192YWx1ZSkgKi8KIF9HTE9CQUwoeG1vbl9tdHNwcikKLQlsZAlyNSwgLkxtdHNwcl90YWJsZUBnb3QocjIpCisJUFBDX0xMCXI1LCAuTG10c3ByX3RhYmxlQGdvdChyMikKIAliCXhtb25fbXhzcHIKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9LY29uZmlnIGIvYXJjaC9zMzkwL0tjb25maWcKaW5kZXggZTc1MWZlMi4uZGVlYWRmYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL0tjb25maWcKQEAgLTY4LDEyICs2OCwxMiBAQAogY29uZmlnIFMzOTAKIAlkZWZfYm9vbCB5CiAJc2VsZWN0IEFSQ0hfSEFTX0FUT01JQzY0X0RFQ19JRl9QT1NJVElWRQotCXNlbGVjdCBBUkNIX0hBU19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwogCXNlbGVjdCBBUkNIX0hBU19ERVZNRU1fSVNfQUxMT1dFRAogCXNlbGVjdCBBUkNIX0hBU19FTEZfUkFORE9NSVpFCiAJc2VsZWN0IEFSQ0hfSEFTX0dDT1ZfUFJPRklMRV9BTEwKIAlzZWxlY3QgQVJDSF9IQVNfS0NPVgogCXNlbGVjdCBBUkNIX0hBU19TR19DSEFJTgorCXNlbGVjdCBBUkNIX0hBU19VQlNBTl9TQU5JVElaRV9BTEwKIAlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAlzZWxlY3QgQVJDSF9JTkxJTkVfUkVBRF9MT0NLCiAJc2VsZWN0IEFSQ0hfSU5MSU5FX1JFQURfTE9DS19CSApAQCAtMTEwLDYgKzExMCw3IEBACiAJc2VsZWN0IEFSQ0hfVVNFX0NNUFhDSEdfTE9DS1JFRgogCXNlbGVjdCBBUkNIX1dBTlRTX0RZTkFNSUNfVEFTS19TVFJVQ1QKIAlzZWxlY3QgQVJDSF9XQU5UU19QUk9UX05VTUFfUFJPVF9OT05FCisJc2VsZWN0IEFSQ0hfV0FOVFNfVUJTQU5fTk9fTlVMTAogCXNlbGVjdCBBUkNIX1dBTlRfSVBDX1BBUlNFX1ZFUlNJT04KIAlzZWxlY3QgQlVJTERUSU1FX0VYVEFCTEVfU09SVAogCXNlbGVjdCBDTE9ORV9CQUNLV0FSRFMyCkBAIC0xMzcsNiArMTM4LDcgQEAKIAlzZWxlY3QgSEFWRV9ETUFfQVBJX0RFQlVHCiAJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKIAlzZWxlY3QgSEFWRV9EWU5BTUlDX0ZUUkFDRV9XSVRIX1JFR1MKKwlzZWxlY3QgSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUwogCXNlbGVjdCBIQVZFX0VYSVRfVEhSRUFECiAJc2VsZWN0IEhBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVIKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9NYWtlZmlsZSBiL2FyY2gvczM5MC9NYWtlZmlsZQppbmRleCAyMjRiNDI3Li41NGUwMDUyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvTWFrZWZpbGUKKysrIGIvYXJjaC9zMzkwL01ha2VmaWxlCkBAIC00Niw2ICs0Niw4IEBACiBjZmxhZ3MtJChDT05GSUdfTUFSQ0hfWkVDMTJfVFVORSkJKz0gLW10dW5lPXpFQzEyCiBjZmxhZ3MtJChDT05GSUdfTUFSQ0hfWjEzX1RVTkUpCSs9IC1tdHVuZT16MTMKIAorY2ZsYWdzLXkgKz0gLVdhLC1JJChzcmN0cmVlKS9hcmNoLyQoQVJDSCkvaW5jbHVkZQorCiAjS0JVSUxEX0lNQUdFIGlzIG5lY2Vzc2FyeSBmb3IgbWFrZSBycG0KIEtCVUlMRF9JTUFHRQk6PWFyY2gvczM5MC9ib290L2ltYWdlCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMgYi9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfYmFzZS5jCmluZGV4IDE1Yzk0MjQuLmY1ODdjNDggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9iYXNlLmMKKysrIGIvYXJjaC9zMzkwL2FwcGxkYXRhL2FwcGxkYXRhX2Jhc2UuYwpAQCAtNTQyLDcgKzU0Miw3IEBACiAJCXJjID0gUFRSX0VSUihhcHBsZGF0YV9wZGV2KTsKIAkJZ290byBvdXRfZHJpdmVyOwogCX0KLQlhcHBsZGF0YV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJhcHBsZGF0YSIpOworCWFwcGxkYXRhX3dxID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoImFwcGxkYXRhIiwgMCk7CiAJaWYgKCFhcHBsZGF0YV93cSkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X2RldmljZTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUgYi9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IDMzYmE2OTdjLi4wZGFhMDcwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTE3LDYgKzE3LDcgQEAKIEtCVUlMRF9DRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZmZyZWVzdGFuZGluZykKIAogR0NPVl9QUk9GSUxFIDo9IG4KK1VCU0FOX1NBTklUSVpFIDo9IG4KIAogT0JKRUNUUyA6PSAkKGFkZHByZWZpeCAkKG9ianRyZWUpL2FyY2gvczM5MC9rZXJuZWwvLCBoZWFkLm8gc2NscC5vIGViY2RpYy5vIGFscy5vKQogT0JKRUNUUyArPSAkKG9iaikvaGVhZC5vICQob2JqKS9taXNjLm8gJChvYmopL3BpZ2d5Lm8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jb25maWdzL2RlZmF1bHRfZGVmY29uZmlnIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmYXVsdF9kZWZjb25maWcKaW5kZXggMjZlMGM3Zi4uNDU5Njg2OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmYXVsdF9kZWZjb25maWcKKysrIGIvYXJjaC9zMzkwL2NvbmZpZ3MvZGVmYXVsdF9kZWZjb25maWcKQEAgLTI2MCw3ICsyNjAsNiBAQAogQ09ORklHX05GX1RBQkxFU19JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWND1tCiBDT05GSUdfTkZfVEFCTEVTX0FSUD1tCi1DT05GSUdfTkZfTkFUX0lQVjQ9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWND1tCiBDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQX05GX01BVENIX0FIPW0KQEAgLTI2OSw2ICsyNjgsOCBAQAogQ09ORklHX0lQX05GX01BVENIX1RUTD1tCiBDT05GSUdfSVBfTkZfRklMVEVSPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KK0NPTkZJR19JUF9ORl9OQVQ9bQorQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPW0KIENPTkZJR19JUF9ORl9NQU5HTEU9bQogQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVA9bQogQ09ORklHX0lQX05GX1RBUkdFVF9FQ049bQpAQCAtMjgxLDcgKzI4Miw2IEBACiBDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjY9bQogQ09ORklHX05GX1RBQkxFU19JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fUk9VVEVfSVBWNj1tCi1DT05GSUdfTkZfTkFUX0lQVjY9bQogQ09ORklHX05GVF9DSEFJTl9OQVRfSVBWNj1tCiBDT05GSUdfSVA2X05GX0lQVEFCTEVTPW0KIENPTkZJR19JUDZfTkZfTUFUQ0hfQUg9bQpAQCAtMjk5LDYgKzI5OSw4IEBACiBDT05GSUdfSVA2X05GX01BTkdMRT1tCiBDT05GSUdfSVA2X05GX1JBVz1tCiBDT05GSUdfSVA2X05GX1NFQ1VSSVRZPW0KK0NPTkZJR19JUDZfTkZfTkFUPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX01BU1FVRVJBREU9bQogQ09ORklHX05GX1RBQkxFU19CUklER0U9bQogQ09ORklHX05FVF9TQ1RQUFJPQkU9bQogQ09ORklHX1JEUz1tCkBAIC0zNTksNiArMzYxLDcgQEAKIENPTkZJR19ORVRfQUNUX1NLQkVESVQ9bQogQ09ORklHX05FVF9BQ1RfQ1NVTT1tCiBDT05GSUdfRE5TX1JFU09MVkVSPXkKK0NPTkZJR19DR1JPVVBfTkVUX1BSSU89eQogQ09ORklHX0JQRl9KSVQ9eQogQ09ORklHX05FVF9QS1RHRU49bQogQ09ORklHX05FVF9UQ1BQUk9CRT1tCkBAIC00MDksNiArNDEyLDcgQEAKIENPTkZJR19CTEtfREVWX0RNPW0KIENPTkZJR19ETV9DUllQVD1tCiBDT05GSUdfRE1fU05BUFNIT1Q9bQorQ09ORklHX0RNX1RISU5fUFJPVklTSU9OSU5HPW0KIENPTkZJR19ETV9NSVJST1I9bQogQ09ORklHX0RNX0xPR19VU0VSU1BBQ0U9bQogQ09ORklHX0RNX1JBSUQ9bQpAQCAtNDI4LDYgKzQzMiw3IEBACiBDT05GSUdfSUZCPW0KIENPTkZJR19NQUNWTEFOPW0KIENPTkZJR19NQUNWVEFQPW0KK0NPTkZJR19JUFZMQU49bQogQ09ORklHX1ZYTEFOPW0KIENPTkZJR19UVU49bQogQ09ORklHX1ZFVEg9bQpAQCAtNDUzLDcgKzQ1OCw2IEBACiAjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0Ci1DT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0wCiBDT05GSUdfSFdfUkFORE9NX1ZJUlRJTz1tCiBDT05GSUdfUkFXX0RSSVZFUj1tCkBAIC00OTUsNiArNDk5LDcgQEAKIENPTkZJR19BVVRPRlM0X0ZTPW0KIENPTkZJR19GVVNFX0ZTPXkKIENPTkZJR19DVVNFPW0KK0NPTkZJR19PVkVSTEFZX0ZTPW0KIENPTkZJR19GU0NBQ0hFPW0KIENPTkZJR19DQUNIRUZJTEVTPW0KIENPTkZJR19JU085NjYwX0ZTPXkKQEAgLTYwMiw3ICs2MDcsNiBAQAogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUz15CiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX1NUQUNLVFJBQ0VfRklMVEVSPXkKIENPTkZJR19MQVRFTkNZVE9QPXkKLUNPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUz15CiBDT05GSUdfSVJRU09GRl9UUkFDRVI9eQogQ09ORklHX1BSRUVNUFRfVFJBQ0VSPXkKIENPTkZJR19TQ0hFRF9UUkFDRVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NvbmZpZ3MvZ2Nvdl9kZWZjb25maWcgYi9hcmNoL3MzOTAvY29uZmlncy9nY292X2RlZmNvbmZpZwppbmRleCAyNDg3OWRhLi4xZGQwNWUzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY29uZmlncy9nY292X2RlZmNvbmZpZworKysgYi9hcmNoL3MzOTAvY29uZmlncy9nY292X2RlZmNvbmZpZwpAQCAtMTUsNiArMTUsOCBAQAogQ09ORklHX01FTUNHPXkKIENPTkZJR19NRU1DR19TV0FQPXkKIENPTkZJR19CTEtfQ0dST1VQPXkKK0NPTkZJR19DRlNfQkFORFdJRFRIPXkKK0NPTkZJR19SVF9HUk9VUF9TQ0hFRD15CiBDT05GSUdfQ0dST1VQX1BJRFM9eQogQ09ORklHX0NHUk9VUF9GUkVFWkVSPXkKIENPTkZJR19DR1JPVVBfSFVHRVRMQj15CkBAIC0yNTUsNyArMjU3LDYgQEAKIENPTkZJR19ORl9UQUJMRVNfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQotQ09ORklHX05GX05BVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KIENPTkZJR19JUF9ORl9NQVRDSF9BSD1tCkBAIC0yNjQsNiArMjY1LDggQEAKIENPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQogQ09ORklHX0lQX05GX0ZJTFRFUj1tCiBDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCitDT05GSUdfSVBfTkZfTkFUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCiBDT05GSUdfSVBfTkZfTUFOR0xFPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfQ0xVU1RFUklQPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KQEAgLTI3Niw3ICsyNzksNiBAQAogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KIENPTkZJR19ORl9UQUJMRVNfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQotQ09ORklHX05GX05BVF9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVA2X05GX01BVENIX0FIPW0KQEAgLTI5NCw2ICsyOTYsOCBAQAogQ09ORklHX0lQNl9ORl9NQU5HTEU9bQogQ09ORklHX0lQNl9ORl9SQVc9bQogQ09ORklHX0lQNl9ORl9TRUNVUklUWT1tCitDT05GSUdfSVA2X05GX05BVD1tCitDT05GSUdfSVA2X05GX1RBUkdFVF9NQVNRVUVSQURFPW0KIENPTkZJR19ORl9UQUJMRVNfQlJJREdFPW0KIENPTkZJR19ORVRfU0NUUFBST0JFPW0KIENPTkZJR19SRFM9bQpAQCAtMzUzLDYgKzM1Nyw3IEBACiBDT05GSUdfTkVUX0FDVF9TS0JFRElUPW0KIENPTkZJR19ORVRfQUNUX0NTVU09bQogQ09ORklHX0ROU19SRVNPTFZFUj15CitDT05GSUdfQ0dST1VQX05FVF9QUklPPXkKIENPTkZJR19CUEZfSklUPXkKIENPTkZJR19ORVRfUEtUR0VOPW0KIENPTkZJR19ORVRfVENQUFJPQkU9bQpAQCAtNDAzLDYgKzQwOCw3IEBACiBDT05GSUdfQkxLX0RFVl9ETT1tCiBDT05GSUdfRE1fQ1JZUFQ9bQogQ09ORklHX0RNX1NOQVBTSE9UPW0KK0NPTkZJR19ETV9USElOX1BST1ZJU0lPTklORz1tCiBDT05GSUdfRE1fTUlSUk9SPW0KIENPTkZJR19ETV9MT0dfVVNFUlNQQUNFPW0KIENPTkZJR19ETV9SQUlEPW0KQEAgLTQyMiw2ICs0MjgsNyBAQAogQ09ORklHX0lGQj1tCiBDT05GSUdfTUFDVkxBTj1tCiBDT05GSUdfTUFDVlRBUD1tCitDT05GSUdfSVBWTEFOPW0KIENPTkZJR19WWExBTj1tCiBDT05GSUdfVFVOPW0KIENPTkZJR19WRVRIPW0KQEAgLTQ0Nyw3ICs0NTQsNiBAQAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotQ09ORklHX0RFVlBUU19NVUxUSVBMRV9JTlNUQU5DRVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MAogQ09ORklHX0hXX1JBTkRPTV9WSVJUSU89bQogQ09ORklHX1JBV19EUklWRVI9bQpAQCAtNDg3LDYgKzQ5Myw3IEBACiBDT05GSUdfQVVUT0ZTNF9GUz1tCiBDT05GSUdfRlVTRV9GUz15CiBDT05GSUdfQ1VTRT1tCitDT05GSUdfT1ZFUkxBWV9GUz1tCiBDT05GSUdfRlNDQUNIRT1tCiBDT05GSUdfQ0FDSEVGSUxFUz1tCiBDT05GSUdfSVNPOTY2MF9GUz15CkBAIC01NTIsNyArNTU5LDYgQEAKIENPTkZJR19DUFVfTk9USUZJRVJfRVJST1JfSU5KRUNUPW0KIENPTkZJR19QTV9OT1RJRklFUl9FUlJPUl9JTkpFQ1Q9bQogQ09ORklHX0xBVEVOQ1lUT1A9eQotQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTPXkKIENPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKICMgQ09ORklHX0tQUk9CRV9FVkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfVFJBQ0VfRU5VTV9NQVBfRklMRT15CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY29uZmlncy9wZXJmb3JtYW5jZV9kZWZjb25maWcgYi9hcmNoL3MzOTAvY29uZmlncy9wZXJmb3JtYW5jZV9kZWZjb25maWcKaW5kZXggYTVjMWU1Zi4uMjlkMTE3OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NvbmZpZ3MvcGVyZm9ybWFuY2VfZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9jb25maWdzL3BlcmZvcm1hbmNlX2RlZmNvbmZpZwpAQCAtMTYsNiArMTYsOCBAQAogQ09ORklHX01FTUNHPXkKIENPTkZJR19NRU1DR19TV0FQPXkKIENPTkZJR19CTEtfQ0dST1VQPXkKK0NPTkZJR19DRlNfQkFORFdJRFRIPXkKK0NPTkZJR19SVF9HUk9VUF9TQ0hFRD15CiBDT05GSUdfQ0dST1VQX1BJRFM9eQogQ09ORklHX0NHUk9VUF9GUkVFWkVSPXkKIENPTkZJR19DR1JPVVBfSFVHRVRMQj15CkBAIC0yNTUsNyArMjU3LDYgQEAKIENPTkZJR19ORl9UQUJMRVNfSVBWND1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjQ9bQogQ09ORklHX05GX1RBQkxFU19BUlA9bQotQ09ORklHX05GX05BVF9JUFY0PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjQ9bQogQ09ORklHX0lQX05GX0lQVEFCTEVTPW0KIENPTkZJR19JUF9ORl9NQVRDSF9BSD1tCkBAIC0yNjQsNiArMjY1LDggQEAKIENPTkZJR19JUF9ORl9NQVRDSF9UVEw9bQogQ09ORklHX0lQX05GX0ZJTFRFUj1tCiBDT05GSUdfSVBfTkZfVEFSR0VUX1JFSkVDVD1tCitDT05GSUdfSVBfTkZfTkFUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCiBDT05GSUdfSVBfTkZfTUFOR0xFPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfQ0xVU1RFUklQPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KQEAgLTI3Niw3ICsyNzksNiBAQAogQ09ORklHX05GX0NPTk5UUkFDS19JUFY2PW0KIENPTkZJR19ORl9UQUJMRVNfSVBWNj1tCiBDT05GSUdfTkZUX0NIQUlOX1JPVVRFX0lQVjY9bQotQ09ORklHX05GX05BVF9JUFY2PW0KIENPTkZJR19ORlRfQ0hBSU5fTkFUX0lQVjY9bQogQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCiBDT05GSUdfSVA2X05GX01BVENIX0FIPW0KQEAgLTI5NCw2ICsyOTYsOCBAQAogQ09ORklHX0lQNl9ORl9NQU5HTEU9bQogQ09ORklHX0lQNl9ORl9SQVc9bQogQ09ORklHX0lQNl9ORl9TRUNVUklUWT1tCitDT05GSUdfSVA2X05GX05BVD1tCitDT05GSUdfSVA2X05GX1RBUkdFVF9NQVNRVUVSQURFPW0KIENPTkZJR19ORl9UQUJMRVNfQlJJREdFPW0KIENPTkZJR19ORVRfU0NUUFBST0JFPW0KIENPTkZJR19SRFM9bQpAQCAtMzUzLDYgKzM1Nyw3IEBACiBDT05GSUdfTkVUX0FDVF9TS0JFRElUPW0KIENPTkZJR19ORVRfQUNUX0NTVU09bQogQ09ORklHX0ROU19SRVNPTFZFUj15CitDT05GSUdfQ0dST1VQX05FVF9QUklPPXkKIENPTkZJR19CUEZfSklUPXkKIENPTkZJR19ORVRfUEtUR0VOPW0KIENPTkZJR19ORVRfVENQUFJPQkU9bQpAQCAtNDAzLDYgKzQwOCw3IEBACiBDT05GSUdfQkxLX0RFVl9ETT1tCiBDT05GSUdfRE1fQ1JZUFQ9bQogQ09ORklHX0RNX1NOQVBTSE9UPW0KK0NPTkZJR19ETV9USElOX1BST1ZJU0lPTklORz1tCiBDT05GSUdfRE1fTUlSUk9SPW0KIENPTkZJR19ETV9MT0dfVVNFUlNQQUNFPW0KIENPTkZJR19ETV9SQUlEPW0KQEAgLTQyMiw2ICs0MjgsNyBAQAogQ09ORklHX0lGQj1tCiBDT05GSUdfTUFDVkxBTj1tCiBDT05GSUdfTUFDVlRBUD1tCitDT05GSUdfSVBWTEFOPW0KIENPTkZJR19WWExBTj1tCiBDT05GSUdfVFVOPW0KIENPTkZJR19WRVRIPW0KQEAgLTQ0Nyw3ICs0NTQsNiBAQAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAotQ09ORklHX0RFVlBUU19NVUxUSVBMRV9JTlNUQU5DRVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MAogQ09ORklHX0hXX1JBTkRPTV9WSVJUSU89bQogQ09ORklHX1JBV19EUklWRVI9bQpAQCAtNDg4LDYgKzQ5NCw3IEBACiBDT05GSUdfQVVUT0ZTNF9GUz1tCiBDT05GSUdfRlVTRV9GUz15CiBDT05GSUdfQ1VTRT1tCitDT05GSUdfT1ZFUkxBWV9GUz1tCiBDT05GSUdfRlNDQUNIRT1tCiBDT05GSUdfQ0FDSEVGSUxFUz1tCiBDT05GSUdfSVNPOTY2MF9GUz15CkBAIC01NDksNyArNTU2LDYgQEAKIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUPW0KIENPTkZJR19SQ1VfQ1BVX1NUQUxMX1RJTUVPVVQ9NjAKIENPTkZJR19MQVRFTkNZVE9QPXkKLUNPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUz15CiBDT05GSUdfU0NIRURfVFJBQ0VSPXkKIENPTkZJR19GVFJBQ0VfU1lTQ0FMTFM9eQogQ09ORklHX1NUQUNLX1RSQUNFUj15CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL2Flc19zMzkwLmMKaW5kZXggMmVhMThiMC4uMzAzZDI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9hZXNfczM5MC5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vYWVzX3MzOTAuYwpAQCAtMzEsNjkgKzMxLDI5IEBACiAjaW5jbHVkZSA8Y3J5cHRvL3h0cy5oPgogI2luY2x1ZGUgPGFzbS9jcGFjZi5oPgogCi0jZGVmaW5lIEFFU19LRVlMRU5fMTI4CQkxCi0jZGVmaW5lIEFFU19LRVlMRU5fMTkyCQkyCi0jZGVmaW5lIEFFU19LRVlMRU5fMjU2CQk0Ci0KIHN0YXRpYyB1OCAqY3RyYmxrOwogc3RhdGljIERFRklORV9TUElOTE9DSyhjdHJibGtfbG9jayk7Ci1zdGF0aWMgY2hhciBrZXlsZW5fZmxhZzsKKworc3RhdGljIGNwYWNmX21hc2tfdCBrbV9mdW5jdGlvbnMsIGttY19mdW5jdGlvbnMsIGttY3RyX2Z1bmN0aW9uczsKIAogc3RydWN0IHMzOTBfYWVzX2N0eCB7CiAJdTgga2V5W0FFU19NQVhfS0VZX1NJWkVdOwotCWxvbmcgZW5jOwotCWxvbmcgZGVjOwogCWludCBrZXlfbGVuOworCXVuc2lnbmVkIGxvbmcgZmM7CiAJdW5pb24gewogCQlzdHJ1Y3QgY3J5cHRvX3NrY2lwaGVyICpibGs7CiAJCXN0cnVjdCBjcnlwdG9fY2lwaGVyICpjaXA7CiAJfSBmYWxsYmFjazsKIH07CiAKLXN0cnVjdCBwY2NfcGFyYW0gewotCXU4IGtleVszMl07Ci0JdTggdHdlYWtbMTZdOwotCXU4IGJsb2NrWzE2XTsKLQl1OCBiaXRbMTZdOwotCXU4IHh0c1sxNl07Ci19OwotCiBzdHJ1Y3QgczM5MF94dHNfY3R4IHsKIAl1OCBrZXlbMzJdOwogCXU4IHBjY19rZXlbMzJdOwotCWxvbmcgZW5jOwotCWxvbmcgZGVjOwogCWludCBrZXlfbGVuOworCXVuc2lnbmVkIGxvbmcgZmM7CiAJc3RydWN0IGNyeXB0b19za2NpcGhlciAqZmFsbGJhY2s7CiB9OwogCi0vKgotICogQ2hlY2sgaWYgdGhlIGtleV9sZW4gaXMgc3VwcG9ydGVkIGJ5IHRoZSBIVy4KLSAqIFJldHVybnMgMCBpZiBpdCBpcywgYSBwb3NpdGl2ZSBudW1iZXIgaWYgaXQgaXMgbm90IGFuZCBzb2Z0d2FyZSBmYWxsYmFjayBpcwotICogcmVxdWlyZWQgb3IgYSBuZWdhdGl2ZSBudW1iZXIgaW4gY2FzZSB0aGUga2V5IHNpemUgaXMgbm90IHZhbGlkCi0gKi8KLXN0YXRpYyBpbnQgbmVlZF9mYWxsYmFjayh1bnNpZ25lZCBpbnQga2V5X2xlbikKLXsKLQlzd2l0Y2ggKGtleV9sZW4pIHsKLQljYXNlIDE2OgotCQlpZiAoIShrZXlsZW5fZmxhZyAmIEFFU19LRVlMRU5fMTI4KSkKLQkJCXJldHVybiAxOwotCQlicmVhazsKLQljYXNlIDI0OgotCQlpZiAoIShrZXlsZW5fZmxhZyAmIEFFU19LRVlMRU5fMTkyKSkKLQkJCXJldHVybiAxOwotCQlicmVhazsKLQljYXNlIDMyOgotCQlpZiAoIShrZXlsZW5fZmxhZyAmIEFFU19LRVlMRU5fMjU2KSkKLQkJCXJldHVybiAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLTE7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBzZXRrZXlfZmFsbGJhY2tfY2lwKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICppbl9rZXksCiAJCXVuc2lnbmVkIGludCBrZXlfbGVuKQogewpAQCAtMTE3LDcyICs3Nyw0NCBAQAogCQkgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0JdTMyICpmbGFncyA9ICZ0Zm0tPmNydF9mbGFnczsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmM7CiAKLQlyZXQgPSBuZWVkX2ZhbGxiYWNrKGtleV9sZW4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCSpmbGFncyB8PSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTjsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCS8qIFBpY2sgdGhlIGNvcnJlY3QgZnVuY3Rpb24gY29kZSBiYXNlZCBvbiB0aGUga2V5IGxlbmd0aCAqLworCWZjID0gKGtleV9sZW4gPT0gMTYpID8gQ1BBQ0ZfS01fQUVTXzEyOCA6CisJICAgICAoa2V5X2xlbiA9PSAyNCkgPyBDUEFDRl9LTV9BRVNfMTkyIDoKKwkgICAgIChrZXlfbGVuID09IDMyKSA/IENQQUNGX0tNX0FFU18yNTYgOiAwOworCisJLyogQ2hlY2sgaWYgdGhlIGZ1bmN0aW9uIGNvZGUgaXMgYXZhaWxhYmxlICovCisJc2N0eC0+ZmMgPSAoZmMgJiYgY3BhY2ZfdGVzdF9mdW5jKCZrbV9mdW5jdGlvbnMsIGZjKSkgPyBmYyA6IDA7CisJaWYgKCFzY3R4LT5mYykKKwkJcmV0dXJuIHNldGtleV9mYWxsYmFja19jaXAodGZtLCBpbl9rZXksIGtleV9sZW4pOwogCiAJc2N0eC0+a2V5X2xlbiA9IGtleV9sZW47Ci0JaWYgKCFyZXQpIHsKLQkJbWVtY3B5KHNjdHgtPmtleSwgaW5fa2V5LCBrZXlfbGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIHNldGtleV9mYWxsYmFja19jaXAodGZtLCBpbl9rZXksIGtleV9sZW4pOworCW1lbWNweShzY3R4LT5rZXksIGluX2tleSwga2V5X2xlbik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGFlc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKIHsKIAlzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAotCWlmICh1bmxpa2VseShuZWVkX2ZhbGxiYWNrKHNjdHgtPmtleV9sZW4pKSkgeworCWlmICh1bmxpa2VseSghc2N0eC0+ZmMpKSB7CiAJCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoc2N0eC0+ZmFsbGJhY2suY2lwLCBvdXQsIGluKTsKIAkJcmV0dXJuOwogCX0KLQotCXN3aXRjaCAoc2N0eC0+a2V5X2xlbikgewotCWNhc2UgMTY6Ci0JCWNwYWNmX2ttKENQQUNGX0tNX0FFU18xMjhfRU5DLCAmc2N0eC0+a2V5LCBvdXQsIGluLAotCQkJIEFFU19CTE9DS19TSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSAyNDoKLQkJY3BhY2Zfa20oQ1BBQ0ZfS01fQUVTXzE5Ml9FTkMsICZzY3R4LT5rZXksIG91dCwgaW4sCi0JCQkgQUVTX0JMT0NLX1NJWkUpOwotCQlicmVhazsKLQljYXNlIDMyOgotCQljcGFjZl9rbShDUEFDRl9LTV9BRVNfMjU2X0VOQywgJnNjdHgtPmtleSwgb3V0LCBpbiwKLQkJCSBBRVNfQkxPQ0tfU0laRSk7Ci0JCWJyZWFrOwotCX0KKwljcGFjZl9rbShzY3R4LT5mYywgJnNjdHgtPmtleSwgb3V0LCBpbiwgQUVTX0JMT0NLX1NJWkUpOwogfQogCiBzdGF0aWMgdm9pZCBhZXNfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CiAKLQlpZiAodW5saWtlbHkobmVlZF9mYWxsYmFjayhzY3R4LT5rZXlfbGVuKSkpIHsKKwlpZiAodW5saWtlbHkoIXNjdHgtPmZjKSkgewogCQljcnlwdG9fY2lwaGVyX2RlY3J5cHRfb25lKHNjdHgtPmZhbGxiYWNrLmNpcCwgb3V0LCBpbik7CiAJCXJldHVybjsKIAl9Ci0KLQlzd2l0Y2ggKHNjdHgtPmtleV9sZW4pIHsKLQljYXNlIDE2OgotCQljcGFjZl9rbShDUEFDRl9LTV9BRVNfMTI4X0RFQywgJnNjdHgtPmtleSwgb3V0LCBpbiwKLQkJCSBBRVNfQkxPQ0tfU0laRSk7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCWNwYWNmX2ttKENQQUNGX0tNX0FFU18xOTJfREVDLCAmc2N0eC0+a2V5LCBvdXQsIGluLAotCQkJIEFFU19CTE9DS19TSVpFKTsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJY3BhY2Zfa20oQ1BBQ0ZfS01fQUVTXzI1Nl9ERUMsICZzY3R4LT5rZXksIG91dCwgaW4sCi0JCQkgQUVTX0JMT0NLX1NJWkUpOwotCQlicmVhazsKLQl9CisJY3BhY2Zfa20oc2N0eC0+ZmMgfCBDUEFDRl9ERUNSWVBULAorCQkgJnNjdHgtPmtleSwgb3V0LCBpbiwgQUVTX0JMT0NLX1NJWkUpOwogfQogCiBzdGF0aWMgaW50IGZhbGxiYWNrX2luaXRfY2lwKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCkBAIC0yOTEsNTAgKzIyMywzNyBAQAogCQkJICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZjOwogCi0JcmV0ID0gbmVlZF9mYWxsYmFjayhrZXlfbGVuKTsKLQlpZiAocmV0ID4gMCkgewotCQlzY3R4LT5rZXlfbGVuID0ga2V5X2xlbjsKKwkvKiBQaWNrIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIGNvZGUgYmFzZWQgb24gdGhlIGtleSBsZW5ndGggKi8KKwlmYyA9IChrZXlfbGVuID09IDE2KSA/IENQQUNGX0tNX0FFU18xMjggOgorCSAgICAgKGtleV9sZW4gPT0gMjQpID8gQ1BBQ0ZfS01fQUVTXzE5MiA6CisJICAgICAoa2V5X2xlbiA9PSAzMikgPyBDUEFDRl9LTV9BRVNfMjU2IDogMDsKKworCS8qIENoZWNrIGlmIHRoZSBmdW5jdGlvbiBjb2RlIGlzIGF2YWlsYWJsZSAqLworCXNjdHgtPmZjID0gKGZjICYmIGNwYWNmX3Rlc3RfZnVuYygma21fZnVuY3Rpb25zLCBmYykpID8gZmMgOiAwOworCWlmICghc2N0eC0+ZmMpCiAJCXJldHVybiBzZXRrZXlfZmFsbGJhY2tfYmxrKHRmbSwgaW5fa2V5LCBrZXlfbGVuKTsKLQl9CiAKLQlzd2l0Y2ggKGtleV9sZW4pIHsKLQljYXNlIDE2OgotCQlzY3R4LT5lbmMgPSBDUEFDRl9LTV9BRVNfMTI4X0VOQzsKLQkJc2N0eC0+ZGVjID0gQ1BBQ0ZfS01fQUVTXzEyOF9ERUM7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCXNjdHgtPmVuYyA9IENQQUNGX0tNX0FFU18xOTJfRU5DOwotCQlzY3R4LT5kZWMgPSBDUEFDRl9LTV9BRVNfMTkyX0RFQzsKLQkJYnJlYWs7Ci0JY2FzZSAzMjoKLQkJc2N0eC0+ZW5jID0gQ1BBQ0ZfS01fQUVTXzI1Nl9FTkM7Ci0JCXNjdHgtPmRlYyA9IENQQUNGX0tNX0FFU18yNTZfREVDOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYWVzX3NldF9rZXkodGZtLCBpbl9rZXksIGtleV9sZW4pOworCXNjdHgtPmtleV9sZW4gPSBrZXlfbGVuOworCW1lbWNweShzY3R4LT5rZXksIGluX2tleSwga2V5X2xlbik7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZWNiX2Flc19jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCitzdGF0aWMgaW50IGVjYl9hZXNfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCB1bnNpZ25lZCBsb25nIG1vZGlmaWVyLAogCQkJIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKIHsKLQlpbnQgcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKLQl1bnNpZ25lZCBpbnQgbmJ5dGVzOworCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBuYnl0ZXMsIG47CisJaW50IHJldDsKIAotCXdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSkgeworCXJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgd2Fsayk7CisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpID49IEFFU19CTE9DS19TSVpFKSB7CiAJCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLwotCQl1bnNpZ25lZCBpbnQgbiA9IG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKLQkJdTggKm91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCXU4ICppbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0KLQkJcmV0ID0gY3BhY2Zfa20oZnVuYywgcGFyYW0sIG91dCwgaW4sIG4pOwotCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gbikKLQkJCXJldHVybiAtRUlPOwotCi0JCW5ieXRlcyAmPSBBRVNfQkxPQ0tfU0laRSAtIDE7Ci0JCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKKwkJbiA9IG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKKwkJY3BhY2Zfa20oc2N0eC0+ZmMgfCBtb2RpZmllciwgc2N0eC0+a2V5LAorCQkJIHdhbGstPmRzdC52aXJ0LmFkZHIsIHdhbGstPnNyYy52aXJ0LmFkZHIsIG4pOworCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyAtIG4pOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0zNDcsMTEgKzI2NiwxMSBAQAogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCi0JaWYgKHVubGlrZWx5KG5lZWRfZmFsbGJhY2soc2N0eC0+a2V5X2xlbikpKQorCWlmICh1bmxpa2VseSghc2N0eC0+ZmMpKQogCQlyZXR1cm4gZmFsbGJhY2tfYmxrX2VuYyhkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBlY2JfYWVzX2NyeXB0KGRlc2MsIHNjdHgtPmVuYywgc2N0eC0+a2V5LCAmd2Fsayk7CisJcmV0dXJuIGVjYl9hZXNfY3J5cHQoZGVzYywgMCwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGVjYl9hZXNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCkBAIC0zNjEsMTEgKzI4MCwxMSBAQAogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCi0JaWYgKHVubGlrZWx5KG5lZWRfZmFsbGJhY2soc2N0eC0+a2V5X2xlbikpKQorCWlmICh1bmxpa2VseSghc2N0eC0+ZmMpKQogCQlyZXR1cm4gZmFsbGJhY2tfYmxrX2RlYyhkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBlY2JfYWVzX2NyeXB0KGRlc2MsIHNjdHgtPmRlYywgc2N0eC0+a2V5LCAmd2Fsayk7CisJcmV0dXJuIGVjYl9hZXNfY3J5cHQoZGVzYywgQ1BBQ0ZfREVDUllQVCwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGZhbGxiYWNrX2luaXRfYmxrKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCkBAIC00MjAsNjQgKzMzOSw0NSBAQAogCQkJICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZjOwogCi0JcmV0ID0gbmVlZF9mYWxsYmFjayhrZXlfbGVuKTsKLQlpZiAocmV0ID4gMCkgewotCQlzY3R4LT5rZXlfbGVuID0ga2V5X2xlbjsKKwkvKiBQaWNrIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIGNvZGUgYmFzZWQgb24gdGhlIGtleSBsZW5ndGggKi8KKwlmYyA9IChrZXlfbGVuID09IDE2KSA/IENQQUNGX0tNQ19BRVNfMTI4IDoKKwkgICAgIChrZXlfbGVuID09IDI0KSA/IENQQUNGX0tNQ19BRVNfMTkyIDoKKwkgICAgIChrZXlfbGVuID09IDMyKSA/IENQQUNGX0tNQ19BRVNfMjU2IDogMDsKKworCS8qIENoZWNrIGlmIHRoZSBmdW5jdGlvbiBjb2RlIGlzIGF2YWlsYWJsZSAqLworCXNjdHgtPmZjID0gKGZjICYmIGNwYWNmX3Rlc3RfZnVuYygma21jX2Z1bmN0aW9ucywgZmMpKSA/IGZjIDogMDsKKwlpZiAoIXNjdHgtPmZjKQogCQlyZXR1cm4gc2V0a2V5X2ZhbGxiYWNrX2Jsayh0Zm0sIGluX2tleSwga2V5X2xlbik7Ci0JfQogCi0Jc3dpdGNoIChrZXlfbGVuKSB7Ci0JY2FzZSAxNjoKLQkJc2N0eC0+ZW5jID0gQ1BBQ0ZfS01DX0FFU18xMjhfRU5DOwotCQlzY3R4LT5kZWMgPSBDUEFDRl9LTUNfQUVTXzEyOF9ERUM7Ci0JCWJyZWFrOwotCWNhc2UgMjQ6Ci0JCXNjdHgtPmVuYyA9IENQQUNGX0tNQ19BRVNfMTkyX0VOQzsKLQkJc2N0eC0+ZGVjID0gQ1BBQ0ZfS01DX0FFU18xOTJfREVDOwotCQlicmVhazsKLQljYXNlIDMyOgotCQlzY3R4LT5lbmMgPSBDUEFDRl9LTUNfQUVTXzI1Nl9FTkM7Ci0JCXNjdHgtPmRlYyA9IENQQUNGX0tNQ19BRVNfMjU2X0RFQzsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGFlc19zZXRfa2V5KHRmbSwgaW5fa2V5LCBrZXlfbGVuKTsKKwlzY3R4LT5rZXlfbGVuID0ga2V5X2xlbjsKKwltZW1jcHkoc2N0eC0+a2V5LCBpbl9rZXksIGtleV9sZW4pOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNiY19hZXNfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBsb25nIGZ1bmMsCitzdGF0aWMgaW50IGNiY19hZXNfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCB1bnNpZ25lZCBsb25nIG1vZGlmaWVyLAogCQkJIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKIHsKIAlzdHJ1Y3QgczM5MF9hZXNfY3R4ICpzY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKLQlpbnQgcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKLQl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gd2Fsay0+bmJ5dGVzOworCXVuc2lnbmVkIGludCBuYnl0ZXMsIG47CisJaW50IHJldDsKIAlzdHJ1Y3QgewogCQl1OCBpdltBRVNfQkxPQ0tfU0laRV07CiAJCXU4IGtleVtBRVNfTUFYX0tFWV9TSVpFXTsKIAl9IHBhcmFtOwogCi0JaWYgKCFuYnl0ZXMpCi0JCWdvdG8gb3V0OwotCisJcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKIAltZW1jcHkocGFyYW0uaXYsIHdhbGstPml2LCBBRVNfQkxPQ0tfU0laRSk7CiAJbWVtY3B5KHBhcmFtLmtleSwgc2N0eC0+a2V5LCBzY3R4LT5rZXlfbGVuKTsKLQlkbyB7CisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpID49IEFFU19CTE9DS19TSVpFKSB7CiAJCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLwotCQl1bnNpZ25lZCBpbnQgbiA9IG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKLQkJdTggKm91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCXU4ICppbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0KLQkJcmV0ID0gY3BhY2Zfa21jKGZ1bmMsICZwYXJhbSwgb3V0LCBpbiwgbik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJbmJ5dGVzICY9IEFFU19CTE9DS19TSVpFIC0gMTsKLQkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMpOwotCX0gd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpKTsKKwkJbiA9IG5ieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKKwkJY3BhY2Zfa21jKHNjdHgtPmZjIHwgbW9kaWZpZXIsICZwYXJhbSwKKwkJCSAgd2Fsay0+ZHN0LnZpcnQuYWRkciwgd2Fsay0+c3JjLnZpcnQuYWRkciwgbik7CisJCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzIC0gbik7CisJfQogCW1lbWNweSh3YWxrLT5pdiwgcGFyYW0uaXYsIEFFU19CTE9DS19TSVpFKTsKLQotb3V0OgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ4OCwxMSArMzg4LDExIEBACiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKLQlpZiAodW5saWtlbHkobmVlZF9mYWxsYmFjayhzY3R4LT5rZXlfbGVuKSkpCisJaWYgKHVubGlrZWx5KCFzY3R4LT5mYykpCiAJCXJldHVybiBmYWxsYmFja19ibGtfZW5jKGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGNiY19hZXNfY3J5cHQoZGVzYywgc2N0eC0+ZW5jLCAmd2Fsayk7CisJcmV0dXJuIGNiY19hZXNfY3J5cHQoZGVzYywgMCwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGNiY19hZXNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCkBAIC01MDIsMTEgKzQwMiwxMSBAQAogCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCi0JaWYgKHVubGlrZWx5KG5lZWRfZmFsbGJhY2soc2N0eC0+a2V5X2xlbikpKQorCWlmICh1bmxpa2VseSghc2N0eC0+ZmMpKQogCQlyZXR1cm4gZmFsbGJhY2tfYmxrX2RlYyhkZXNjLCBkc3QsIHNyYywgbmJ5dGVzKTsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjYmNfYWVzX2NyeXB0KGRlc2MsIHNjdHgtPmRlYywgJndhbGspOworCXJldHVybiBjYmNfYWVzX2NyeXB0KGRlc2MsIENQQUNGX0RFQ1JZUFQsICZ3YWxrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGNiY19hZXNfYWxnID0gewpAQCAtNTk0LDgzICs0OTQsNjcgQEAKIAkJCSAgIHVuc2lnbmVkIGludCBrZXlfbGVuKQogewogCXN0cnVjdCBzMzkwX3h0c19jdHggKnh0c19jdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwotCXUzMiAqZmxhZ3MgPSAmdGZtLT5jcnRfZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmYzsKIAlpbnQgZXJyOwogCiAJZXJyID0geHRzX2NoZWNrX2tleSh0Zm0sIGluX2tleSwga2V5X2xlbik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXN3aXRjaCAoa2V5X2xlbikgewotCWNhc2UgMzI6Ci0JCXh0c19jdHgtPmVuYyA9IENQQUNGX0tNX1hUU18xMjhfRU5DOwotCQl4dHNfY3R4LT5kZWMgPSBDUEFDRl9LTV9YVFNfMTI4X0RFQzsKLQkJbWVtY3B5KHh0c19jdHgtPmtleSArIDE2LCBpbl9rZXksIDE2KTsKLQkJbWVtY3B5KHh0c19jdHgtPnBjY19rZXkgKyAxNiwgaW5fa2V5ICsgMTYsIDE2KTsKLQkJYnJlYWs7Ci0JY2FzZSA0ODoKLQkJeHRzX2N0eC0+ZW5jID0gMDsKLQkJeHRzX2N0eC0+ZGVjID0gMDsKLQkJeHRzX2ZhbGxiYWNrX3NldGtleSh0Zm0sIGluX2tleSwga2V5X2xlbik7Ci0JCWJyZWFrOwotCWNhc2UgNjQ6Ci0JCXh0c19jdHgtPmVuYyA9IENQQUNGX0tNX1hUU18yNTZfRU5DOwotCQl4dHNfY3R4LT5kZWMgPSBDUEFDRl9LTV9YVFNfMjU2X0RFQzsKLQkJbWVtY3B5KHh0c19jdHgtPmtleSwgaW5fa2V5LCAzMik7Ci0JCW1lbWNweSh4dHNfY3R4LT5wY2Nfa2V5LCBpbl9rZXkgKyAzMiwgMzIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwkvKiBQaWNrIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIGNvZGUgYmFzZWQgb24gdGhlIGtleSBsZW5ndGggKi8KKwlmYyA9IChrZXlfbGVuID09IDMyKSA/IENQQUNGX0tNX1hUU18xMjggOgorCSAgICAgKGtleV9sZW4gPT0gNjQpID8gQ1BBQ0ZfS01fWFRTXzI1NiA6IDA7CisKKwkvKiBDaGVjayBpZiB0aGUgZnVuY3Rpb24gY29kZSBpcyBhdmFpbGFibGUgKi8KKwl4dHNfY3R4LT5mYyA9IChmYyAmJiBjcGFjZl90ZXN0X2Z1bmMoJmttX2Z1bmN0aW9ucywgZmMpKSA/IGZjIDogMDsKKwlpZiAoIXh0c19jdHgtPmZjKQorCQlyZXR1cm4geHRzX2ZhbGxiYWNrX3NldGtleSh0Zm0sIGluX2tleSwga2V5X2xlbik7CisKKwkvKiBTcGxpdCB0aGUgWFRTIGtleSBpbnRvIHRoZSB0d28gc3Via2V5cyAqLworCWtleV9sZW4gPSBrZXlfbGVuIC8gMjsKIAl4dHNfY3R4LT5rZXlfbGVuID0ga2V5X2xlbjsKKwltZW1jcHkoeHRzX2N0eC0+a2V5LCBpbl9rZXksIGtleV9sZW4pOworCW1lbWNweSh4dHNfY3R4LT5wY2Nfa2V5LCBpbl9rZXkgKyBrZXlfbGVuLCBrZXlfbGVuKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB4dHNfYWVzX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgbG9uZyBmdW5jLAotCQkJIHN0cnVjdCBzMzkwX3h0c19jdHggKnh0c19jdHgsCitzdGF0aWMgaW50IHh0c19hZXNfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCB1bnNpZ25lZCBsb25nIG1vZGlmaWVyLAogCQkJIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKIHsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gKHh0c19jdHgtPmtleV9sZW4gPj4gMSkgJiAweDEwOwotCWludCByZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsIHdhbGspOwotCXVuc2lnbmVkIGludCBuYnl0ZXMgPSB3YWxrLT5uYnl0ZXM7Ci0JdW5zaWduZWQgaW50IG47Ci0JdTggKmluLCAqb3V0OwotCXN0cnVjdCBwY2NfcGFyYW0gcGNjX3BhcmFtOworCXN0cnVjdCBzMzkwX3h0c19jdHggKnh0c19jdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXVuc2lnbmVkIGludCBvZmZzZXQsIG5ieXRlcywgbjsKKwlpbnQgcmV0OworCXN0cnVjdCB7CisJCXU4IGtleVszMl07CisJCXU4IHR3ZWFrWzE2XTsKKwkJdTggYmxvY2tbMTZdOworCQl1OCBiaXRbMTZdOworCQl1OCB4dHNbMTZdOworCX0gcGNjX3BhcmFtOwogCXN0cnVjdCB7CiAJCXU4IGtleVszMl07CiAJCXU4IGluaXRbMTZdOwogCX0geHRzX3BhcmFtOwogCi0JaWYgKCFuYnl0ZXMpCi0JCWdvdG8gb3V0OwotCisJcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKKwlvZmZzZXQgPSB4dHNfY3R4LT5rZXlfbGVuICYgMHgxMDsKIAltZW1zZXQocGNjX3BhcmFtLmJsb2NrLCAwLCBzaXplb2YocGNjX3BhcmFtLmJsb2NrKSk7CiAJbWVtc2V0KHBjY19wYXJhbS5iaXQsIDAsIHNpemVvZihwY2NfcGFyYW0uYml0KSk7CiAJbWVtc2V0KHBjY19wYXJhbS54dHMsIDAsIHNpemVvZihwY2NfcGFyYW0ueHRzKSk7CiAJbWVtY3B5KHBjY19wYXJhbS50d2Vhaywgd2Fsay0+aXYsIHNpemVvZihwY2NfcGFyYW0udHdlYWspKTsKLQltZW1jcHkocGNjX3BhcmFtLmtleSwgeHRzX2N0eC0+cGNjX2tleSwgMzIpOwotCS8qIHJlbW92ZSBkZWNpcGhlciBtb2RpZmllciBiaXQgZnJvbSAnZnVuYycgYW5kIGNhbGwgUENDICovCi0JcmV0ID0gY3BhY2ZfcGNjKGZ1bmMgJiAweDdmLCAmcGNjX3BhcmFtLmtleVtvZmZzZXRdKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIC1FSU87CisJbWVtY3B5KHBjY19wYXJhbS5rZXkgKyBvZmZzZXQsIHh0c19jdHgtPnBjY19rZXksIHh0c19jdHgtPmtleV9sZW4pOworCWNwYWNmX3BjYyh4dHNfY3R4LT5mYywgcGNjX3BhcmFtLmtleSArIG9mZnNldCk7CiAKLQltZW1jcHkoeHRzX3BhcmFtLmtleSwgeHRzX2N0eC0+a2V5LCAzMik7CisJbWVtY3B5KHh0c19wYXJhbS5rZXkgKyBvZmZzZXQsIHh0c19jdHgtPmtleSwgeHRzX2N0eC0+a2V5X2xlbik7CiAJbWVtY3B5KHh0c19wYXJhbS5pbml0LCBwY2NfcGFyYW0ueHRzLCAxNik7Ci0JZG8geworCisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpID49IEFFU19CTE9DS19TSVpFKSB7CiAJCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLwogCQluID0gbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOwotCQlvdXQgPSB3YWxrLT5kc3QudmlydC5hZGRyOwotCQlpbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0KLQkJcmV0ID0gY3BhY2Zfa20oZnVuYywgJnh0c19wYXJhbS5rZXlbb2Zmc2V0XSwgb3V0LCBpbiwgbik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJbmJ5dGVzICY9IEFFU19CTE9DS19TSVpFIC0gMTsKLQkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMpOwotCX0gd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpKTsKLW91dDoKKwkJY3BhY2Zfa20oeHRzX2N0eC0+ZmMgfCBtb2RpZmllciwgeHRzX3BhcmFtLmtleSArIG9mZnNldCwKKwkJCSB3YWxrLT5kc3QudmlydC5hZGRyLCB3YWxrLT5zcmMudmlydC5hZGRyLCBuKTsKKwkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMgLSBuKTsKKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjgxLDExICs1NjUsMTEgQEAKIAlzdHJ1Y3QgczM5MF94dHNfY3R4ICp4dHNfY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAotCWlmICh1bmxpa2VseSh4dHNfY3R4LT5rZXlfbGVuID09IDQ4KSkKKwlpZiAodW5saWtlbHkoIXh0c19jdHgtPmZjKSkKIAkJcmV0dXJuIHh0c19mYWxsYmFja19lbmNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIHh0c19hZXNfY3J5cHQoZGVzYywgeHRzX2N0eC0+ZW5jLCB4dHNfY3R4LCAmd2Fsayk7CisJcmV0dXJuIHh0c19hZXNfY3J5cHQoZGVzYywgMCwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IHh0c19hZXNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCkBAIC02OTUsMTEgKzU3OSwxMSBAQAogCXN0cnVjdCBzMzkwX3h0c19jdHggKnh0c19jdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCi0JaWYgKHVubGlrZWx5KHh0c19jdHgtPmtleV9sZW4gPT0gNDgpKQorCWlmICh1bmxpa2VseSgheHRzX2N0eC0+ZmMpKQogCQlyZXR1cm4geHRzX2ZhbGxiYWNrX2RlY3J5cHQoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4geHRzX2Flc19jcnlwdChkZXNjLCB4dHNfY3R4LT5kZWMsIHh0c19jdHgsICZ3YWxrKTsKKwlyZXR1cm4geHRzX2Flc19jcnlwdChkZXNjLCBDUEFDRl9ERUNSWVBULCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgeHRzX2ZhbGxiYWNrX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKQEAgLTc1MCwxMDggKzYzNCw3OSBAQAogCX0KIH07CiAKLXN0YXRpYyBpbnQgeHRzX2Flc19hbGdfcmVnOwotCiBzdGF0aWMgaW50IGN0cl9hZXNfc2V0X2tleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqaW5fa2V5LAogCQkJICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiB7CiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJdW5zaWduZWQgbG9uZyBmYzsKIAotCXN3aXRjaCAoa2V5X2xlbikgewotCWNhc2UgMTY6Ci0JCXNjdHgtPmVuYyA9IENQQUNGX0tNQ1RSX0FFU18xMjhfRU5DOwotCQlzY3R4LT5kZWMgPSBDUEFDRl9LTUNUUl9BRVNfMTI4X0RFQzsKLQkJYnJlYWs7Ci0JY2FzZSAyNDoKLQkJc2N0eC0+ZW5jID0gQ1BBQ0ZfS01DVFJfQUVTXzE5Ml9FTkM7Ci0JCXNjdHgtPmRlYyA9IENQQUNGX0tNQ1RSX0FFU18xOTJfREVDOwotCQlicmVhazsKLQljYXNlIDMyOgotCQlzY3R4LT5lbmMgPSBDUEFDRl9LTUNUUl9BRVNfMjU2X0VOQzsKLQkJc2N0eC0+ZGVjID0gQ1BBQ0ZfS01DVFJfQUVTXzI1Nl9ERUM7Ci0JCWJyZWFrOwotCX0KKwkvKiBQaWNrIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIGNvZGUgYmFzZWQgb24gdGhlIGtleSBsZW5ndGggKi8KKwlmYyA9IChrZXlfbGVuID09IDE2KSA/IENQQUNGX0tNQ1RSX0FFU18xMjggOgorCSAgICAgKGtleV9sZW4gPT0gMjQpID8gQ1BBQ0ZfS01DVFJfQUVTXzE5MiA6CisJICAgICAoa2V5X2xlbiA9PSAzMikgPyBDUEFDRl9LTUNUUl9BRVNfMjU2IDogMDsKIAotCXJldHVybiBhZXNfc2V0X2tleSh0Zm0sIGluX2tleSwga2V5X2xlbik7CisJLyogQ2hlY2sgaWYgdGhlIGZ1bmN0aW9uIGNvZGUgaXMgYXZhaWxhYmxlICovCisJc2N0eC0+ZmMgPSAoZmMgJiYgY3BhY2ZfdGVzdF9mdW5jKCZrbWN0cl9mdW5jdGlvbnMsIGZjKSkgPyBmYyA6IDA7CisJaWYgKCFzY3R4LT5mYykKKwkJcmV0dXJuIHNldGtleV9mYWxsYmFja19ibGsodGZtLCBpbl9rZXksIGtleV9sZW4pOworCisJc2N0eC0+a2V5X2xlbiA9IGtleV9sZW47CisJbWVtY3B5KHNjdHgtPmtleSwgaW5fa2V5LCBrZXlfbGVuKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2N0cmJsa19pbml0KHU4ICpjdHJwdHIsIHVuc2lnbmVkIGludCBuYnl0ZXMpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fY3RyYmxrX2luaXQodTggKmN0cnB0ciwgdTggKml2LCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewogCXVuc2lnbmVkIGludCBpLCBuOwogCiAJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzLCBtYXguIFBBR0VfU0laRSAqLworCW1lbWNweShjdHJwdHIsIGl2LCBBRVNfQkxPQ0tfU0laRSk7CiAJbiA9IChuYnl0ZXMgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogbmJ5dGVzICYgfihBRVNfQkxPQ0tfU0laRSAtIDEpOwotCWZvciAoaSA9IEFFU19CTE9DS19TSVpFOyBpIDwgbjsgaSArPSBBRVNfQkxPQ0tfU0laRSkgewotCQltZW1jcHkoY3RycHRyICsgaSwgY3RycHRyICsgaSAtIEFFU19CTE9DS19TSVpFLAotCQkgICAgICAgQUVTX0JMT0NLX1NJWkUpOwotCQljcnlwdG9faW5jKGN0cnB0ciArIGksIEFFU19CTE9DS19TSVpFKTsKKwlmb3IgKGkgPSAobiAvIEFFU19CTE9DS19TSVpFKSAtIDE7IGkgPiAwOyBpLS0pIHsKKwkJbWVtY3B5KGN0cnB0ciArIEFFU19CTE9DS19TSVpFLCBjdHJwdHIsIEFFU19CTE9DS19TSVpFKTsKKwkJY3J5cHRvX2luYyhjdHJwdHIgKyBBRVNfQkxPQ0tfU0laRSwgQUVTX0JMT0NLX1NJWkUpOworCQljdHJwdHIgKz0gQUVTX0JMT0NLX1NJWkU7CiAJfQogCXJldHVybiBuOwogfQogCi1zdGF0aWMgaW50IGN0cl9hZXNfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBsb25nIGZ1bmMsCi0JCQkgc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCwgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQorc3RhdGljIGludCBjdHJfYWVzX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgdW5zaWduZWQgbG9uZyBtb2RpZmllciwKKwkJCSBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCiB7Ci0JaW50IHJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnRfYmxvY2soZGVzYywgd2FsaywgQUVTX0JMT0NLX1NJWkUpOworCXN0cnVjdCBzMzkwX2Flc19jdHggKnNjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXU4IGJ1ZltBRVNfQkxPQ0tfU0laRV0sICpjdHJwdHI7CiAJdW5zaWduZWQgaW50IG4sIG5ieXRlczsKLQl1OCBidWZbQUVTX0JMT0NLX1NJWkVdLCBjdHJidWZbQUVTX0JMT0NLX1NJWkVdOwotCXU4ICpvdXQsICppbiwgKmN0cnB0ciA9IGN0cmJ1ZjsKKwlpbnQgcmV0LCBsb2NrZWQ7CiAKLQlpZiAoIXdhbGstPm5ieXRlcykKLQkJcmV0dXJuIHJldDsKKwlsb2NrZWQgPSBzcGluX3RyeWxvY2soJmN0cmJsa19sb2NrKTsKIAotCWlmIChzcGluX3RyeWxvY2soJmN0cmJsa19sb2NrKSkKLQkJY3RycHRyID0gY3RyYmxrOwotCi0JbWVtY3B5KGN0cnB0ciwgd2Fsay0+aXYsIEFFU19CTE9DS19TSVpFKTsKKwlyZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0X2Jsb2NrKGRlc2MsIHdhbGssIEFFU19CTE9DS19TSVpFKTsKIAl3aGlsZSAoKG5ieXRlcyA9IHdhbGstPm5ieXRlcykgPj0gQUVTX0JMT0NLX1NJWkUpIHsKLQkJb3V0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKLQkJaW4gPSB3YWxrLT5zcmMudmlydC5hZGRyOwotCQl3aGlsZSAobmJ5dGVzID49IEFFU19CTE9DS19TSVpFKSB7Ci0JCQlpZiAoY3RycHRyID09IGN0cmJsaykKLQkJCQluID0gX19jdHJibGtfaW5pdChjdHJwdHIsIG5ieXRlcyk7Ci0JCQllbHNlCi0JCQkJbiA9IEFFU19CTE9DS19TSVpFOwotCQkJcmV0ID0gY3BhY2Zfa21jdHIoZnVuYywgc2N0eC0+a2V5LCBvdXQsIGluLCBuLCBjdHJwdHIpOwotCQkJaWYgKHJldCA8IDAgfHwgcmV0ICE9IG4pIHsKLQkJCQlpZiAoY3RycHRyID09IGN0cmJsaykKLQkJCQkJc3Bpbl91bmxvY2soJmN0cmJsa19sb2NrKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0KLQkJCWlmIChuID4gQUVTX0JMT0NLX1NJWkUpCi0JCQkJbWVtY3B5KGN0cnB0ciwgY3RycHRyICsgbiAtIEFFU19CTE9DS19TSVpFLAotCQkJCSAgICAgICBBRVNfQkxPQ0tfU0laRSk7Ci0JCQljcnlwdG9faW5jKGN0cnB0ciwgQUVTX0JMT0NLX1NJWkUpOwotCQkJb3V0ICs9IG47Ci0JCQlpbiArPSBuOwotCQkJbmJ5dGVzIC09IG47Ci0JCX0KLQkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMpOworCQluID0gQUVTX0JMT0NLX1NJWkU7CisJCWlmIChuYnl0ZXMgPj0gMipBRVNfQkxPQ0tfU0laRSAmJiBsb2NrZWQpCisJCQluID0gX19jdHJibGtfaW5pdChjdHJibGssIHdhbGstPml2LCBuYnl0ZXMpOworCQljdHJwdHIgPSAobiA+IEFFU19CTE9DS19TSVpFKSA/IGN0cmJsayA6IHdhbGstPml2OworCQljcGFjZl9rbWN0cihzY3R4LT5mYyB8IG1vZGlmaWVyLCBzY3R4LT5rZXksCisJCQkgICAgd2Fsay0+ZHN0LnZpcnQuYWRkciwgd2Fsay0+c3JjLnZpcnQuYWRkciwKKwkJCSAgICBuLCBjdHJwdHIpOworCQlpZiAoY3RycHRyID09IGN0cmJsaykKKwkJCW1lbWNweSh3YWxrLT5pdiwgY3RycHRyICsgbiAtIEFFU19CTE9DS19TSVpFLAorCQkJICAgICAgIEFFU19CTE9DS19TSVpFKTsKKwkJY3J5cHRvX2luYyh3YWxrLT5pdiwgQUVTX0JMT0NLX1NJWkUpOworCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyAtIG4pOwogCX0KLQlpZiAoY3RycHRyID09IGN0cmJsaykgewotCQlpZiAobmJ5dGVzKQotCQkJbWVtY3B5KGN0cmJ1ZiwgY3RycHRyLCBBRVNfQkxPQ0tfU0laRSk7Ci0JCWVsc2UKLQkJCW1lbWNweSh3YWxrLT5pdiwgY3RycHRyLCBBRVNfQkxPQ0tfU0laRSk7CisJaWYgKGxvY2tlZCkKIAkJc3Bpbl91bmxvY2soJmN0cmJsa19sb2NrKTsKLQl9IGVsc2UgewotCQlpZiAoIW5ieXRlcykKLQkJCW1lbWNweSh3YWxrLT5pdiwgY3RycHRyLCBBRVNfQkxPQ0tfU0laRSk7Ci0JfQogCS8qCiAJICogZmluYWwgYmxvY2sgbWF5IGJlIDwgQUVTX0JMT0NLX1NJWkUsIGNvcHkgb25seSBuYnl0ZXMKIAkgKi8KIAlpZiAobmJ5dGVzKSB7Ci0JCW91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCWluID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKLQkJcmV0ID0gY3BhY2Zfa21jdHIoZnVuYywgc2N0eC0+a2V5LCBidWYsIGluLAotCQkJCSAgQUVTX0JMT0NLX1NJWkUsIGN0cmJ1Zik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCAhPSBBRVNfQkxPQ0tfU0laRSkKLQkJCXJldHVybiAtRUlPOwotCQltZW1jcHkob3V0LCBidWYsIG5ieXRlcyk7Ci0JCWNyeXB0b19pbmMoY3RyYnVmLCBBRVNfQkxPQ0tfU0laRSk7CisJCWNwYWNmX2ttY3RyKHNjdHgtPmZjIHwgbW9kaWZpZXIsIHNjdHgtPmtleSwKKwkJCSAgICBidWYsIHdhbGstPnNyYy52aXJ0LmFkZHIsCisJCQkgICAgQUVTX0JMT0NLX1NJWkUsIHdhbGstPml2KTsKKwkJbWVtY3B5KHdhbGstPmRzdC52aXJ0LmFkZHIsIGJ1ZiwgbmJ5dGVzKTsKKwkJY3J5cHRvX2luYyh3YWxrLT5pdiwgQUVTX0JMT0NLX1NJWkUpOwogCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIDApOwotCQltZW1jcHkod2Fsay0+aXYsIGN0cmJ1ZiwgQUVTX0JMT0NLX1NJWkUpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC04NjQsOCArNzE5LDExIEBACiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKKwlpZiAodW5saWtlbHkoIXNjdHgtPmZjKSkKKwkJcmV0dXJuIGZhbGxiYWNrX2Jsa19lbmMoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CisKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY3RyX2Flc19jcnlwdChkZXNjLCBzY3R4LT5lbmMsIHNjdHgsICZ3YWxrKTsKKwlyZXR1cm4gY3RyX2Flc19jcnlwdChkZXNjLCAwLCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgY3RyX2Flc19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKQEAgLTg3NSwxOSArNzMzLDI1IEBACiAJc3RydWN0IHMzOTBfYWVzX2N0eCAqc2N0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKKwlpZiAodW5saWtlbHkoIXNjdHgtPmZjKSkKKwkJcmV0dXJuIGZhbGxiYWNrX2Jsa19kZWMoZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CisKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY3RyX2Flc19jcnlwdChkZXNjLCBzY3R4LT5kZWMsIHNjdHgsICZ3YWxrKTsKKwlyZXR1cm4gY3RyX2Flc19jcnlwdChkZXNjLCBDUEFDRl9ERUNSWVBULCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBjdHJfYWVzX2FsZyA9IHsKIAkuY3JhX25hbWUJCT0JImN0cihhZXMpIiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0JImN0ci1hZXMtczM5MCIsCiAJLmNyYV9wcmlvcml0eQkJPQk0MDAsCS8qIGNvbWJvOiBhZXMgKyBjdHIgKi8KLQkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkJQ1JZUFRPX0FMR19ORUVEX0ZBTExCQUNLLAogCS5jcmFfYmxvY2tzaXplCQk9CTEsCiAJLmNyYV9jdHhzaXplCQk9CXNpemVvZihzdHJ1Y3QgczM5MF9hZXNfY3R4KSwKIAkuY3JhX3R5cGUJCT0JJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKIAkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX2luaXQJCT0JZmFsbGJhY2tfaW5pdF9ibGssCisJLmNyYV9leGl0CQk9CWZhbGxiYWNrX2V4aXRfYmxrLAogCS5jcmFfdQkJCT0JewogCQkuYmxrY2lwaGVyID0gewogCQkJLm1pbl9rZXlzaXplCQk9CUFFU19NSU5fS0VZX1NJWkUsCkBAIC05MDAsODkgKzc2NCw3OSBAQAogCX0KIH07CiAKLXN0YXRpYyBpbnQgY3RyX2Flc19hbGdfcmVnOworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnICphZXNfczM5MF9hbGdzX3B0cls1XTsKK3N0YXRpYyBpbnQgYWVzX3MzOTBfYWxnc19udW07CisKK3N0YXRpYyBpbnQgYWVzX3MzOTBfcmVnaXN0ZXJfYWxnKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCit7CisJaW50IHJldDsKKworCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoYWxnKTsKKwlpZiAoIXJldCkKKwkJYWVzX3MzOTBfYWxnc19wdHJbYWVzX3MzOTBfYWxnc19udW0rK10gPSBhbGc7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYWVzX3MzOTBfZmluaSh2b2lkKQoreworCXdoaWxlIChhZXNfczM5MF9hbGdzX251bS0tKQorCQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoYWVzX3MzOTBfYWxnc19wdHJbYWVzX3MzOTBfYWxnc19udW1dKTsKKwlpZiAoY3RyYmxrKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGN0cmJsayk7Cit9CiAKIHN0YXRpYyBpbnQgX19pbml0IGFlc19zMzkwX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCi0JaWYgKGNwYWNmX3F1ZXJ5KENQQUNGX0tNLCBDUEFDRl9LTV9BRVNfMTI4X0VOQykpCi0JCWtleWxlbl9mbGFnIHw9IEFFU19LRVlMRU5fMTI4OwotCWlmIChjcGFjZl9xdWVyeShDUEFDRl9LTSwgQ1BBQ0ZfS01fQUVTXzE5Ml9FTkMpKQotCQlrZXlsZW5fZmxhZyB8PSBBRVNfS0VZTEVOXzE5MjsKLQlpZiAoY3BhY2ZfcXVlcnkoQ1BBQ0ZfS00sIENQQUNGX0tNX0FFU18yNTZfRU5DKSkKLQkJa2V5bGVuX2ZsYWcgfD0gQUVTX0tFWUxFTl8yNTY7CisJLyogUXVlcnkgYXZhaWxhYmxlIGZ1bmN0aW9ucyBmb3IgS00sIEtNQyBhbmQgS01DVFIgKi8KKwljcGFjZl9xdWVyeShDUEFDRl9LTSwgJmttX2Z1bmN0aW9ucyk7CisJY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DLCAma21jX2Z1bmN0aW9ucyk7CisJY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DVFIsICZrbWN0cl9mdW5jdGlvbnMpOwogCi0JaWYgKCFrZXlsZW5fZmxhZykKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JLyogejkgMTA5IGFuZCB6OSBCQy9FQyBvbmx5IHN1cHBvcnQgMTI4IGJpdCBrZXkgbGVuZ3RoICovCi0JaWYgKGtleWxlbl9mbGFnID09IEFFU19LRVlMRU5fMTI4KQotCQlwcl9pbmZvKCJBRVMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGZvciIKLQkJCSIgMTI4LWJpdCBrZXlzXG4iKTsKLQotCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmFlc19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gYWVzX2VycjsKLQotCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmVjYl9hZXNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGVjYl9hZXNfZXJyOwotCi0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY2JjX2Flc19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gY2JjX2Flc19lcnI7Ci0KLQlpZiAoY3BhY2ZfcXVlcnkoQ1BBQ0ZfS00sIENQQUNGX0tNX1hUU18xMjhfRU5DKSAmJgotCSAgICBjcGFjZl9xdWVyeShDUEFDRl9LTSwgQ1BBQ0ZfS01fWFRTXzI1Nl9FTkMpKSB7Ci0JCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJnh0c19hZXNfYWxnKTsKKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbV9mdW5jdGlvbnMsIENQQUNGX0tNX0FFU18xMjgpIHx8CisJICAgIGNwYWNmX3Rlc3RfZnVuYygma21fZnVuY3Rpb25zLCBDUEFDRl9LTV9BRVNfMTkyKSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttX2Z1bmN0aW9ucywgQ1BBQ0ZfS01fQUVTXzI1NikpIHsKKwkJcmV0ID0gYWVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8geHRzX2Flc19lcnI7Ci0JCXh0c19hZXNfYWxnX3JlZyA9IDE7CisJCQlnb3RvIG91dF9lcnI7CisJCXJldCA9IGFlc19zMzkwX3JlZ2lzdGVyX2FsZygmZWNiX2Flc19hbGcpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOwogCX0KIAotCWlmIChjcGFjZl9xdWVyeShDUEFDRl9LTUNUUiwgQ1BBQ0ZfS01DVFJfQUVTXzEyOF9FTkMpICYmCi0JICAgIGNwYWNmX3F1ZXJ5KENQQUNGX0tNQ1RSLCBDUEFDRl9LTUNUUl9BRVNfMTkyX0VOQykgJiYKLQkgICAgY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DVFIsIENQQUNGX0tNQ1RSX0FFU18yNTZfRU5DKSkgeworCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttY19mdW5jdGlvbnMsIENQQUNGX0tNQ19BRVNfMTI4KSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttY19mdW5jdGlvbnMsIENQQUNGX0tNQ19BRVNfMTkyKSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttY19mdW5jdGlvbnMsIENQQUNGX0tNQ19BRVNfMjU2KSkgeworCQlyZXQgPSBhZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmNiY19hZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbV9mdW5jdGlvbnMsIENQQUNGX0tNX1hUU18xMjgpIHx8CisJICAgIGNwYWNmX3Rlc3RfZnVuYygma21fZnVuY3Rpb25zLCBDUEFDRl9LTV9YVFNfMjU2KSkgeworCQlyZXQgPSBhZXNfczM5MF9yZWdpc3Rlcl9hbGcoJnh0c19hZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoY3BhY2ZfdGVzdF9mdW5jKCZrbWN0cl9mdW5jdGlvbnMsIENQQUNGX0tNQ1RSX0FFU18xMjgpIHx8CisJICAgIGNwYWNmX3Rlc3RfZnVuYygma21jdHJfZnVuY3Rpb25zLCBDUEFDRl9LTUNUUl9BRVNfMTkyKSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttY3RyX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DVFJfQUVTXzI1NikpIHsKIAkJY3RyYmxrID0gKHU4ICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAkJaWYgKCFjdHJibGspIHsKIAkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGN0cl9hZXNfZXJyOworCQkJZ290byBvdXRfZXJyOwogCQl9Ci0JCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoJmN0cl9hZXNfYWxnKTsKLQkJaWYgKHJldCkgewotCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBjdHJibGspOwotCQkJZ290byBjdHJfYWVzX2VycjsKLQkJfQotCQljdHJfYWVzX2FsZ19yZWcgPSAxOworCQlyZXQgPSBhZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmN0cl9hZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKIAl9CiAKLW91dDoKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJYWVzX3MzOTBfZmluaSgpOwogCXJldHVybiByZXQ7Ci0KLWN0cl9hZXNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmeHRzX2Flc19hbGcpOwoteHRzX2Flc19lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfYWVzX2FsZyk7Ci1jYmNfYWVzX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmVjYl9hZXNfYWxnKTsKLWVjYl9hZXNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmYWVzX2FsZyk7Ci1hZXNfZXJyOgotCWdvdG8gb3V0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWVzX3MzOTBfZmluaSh2b2lkKQotewotCWlmIChjdHJfYWVzX2FsZ19yZWcpIHsKLQkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjdHJfYWVzX2FsZyk7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgY3RyYmxrKTsKLQl9Ci0JaWYgKHh0c19hZXNfYWxnX3JlZykKLQkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZ4dHNfYWVzX2FsZyk7Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfYWVzX2FsZyk7Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZlY2JfYWVzX2FsZyk7Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZhZXNfYWxnKTsKIH0KIAogbW9kdWxlX2NwdV9mZWF0dXJlX21hdGNoKE1TQSwgYWVzX3MzOTBfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL2NyYzMyLXZ4LmMgYi9hcmNoL3MzOTAvY3J5cHRvL2NyYzMyLXZ4LmMKaW5kZXggMmJhZDlkOC4uOTkyZTYzMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9jcmMzMi12eC5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vY3JjMzItdnguYwpAQCAtNjcsNyArNjcsNyBAQAogCQkJCQkJCQkJICAgIFwKIAkJa2VybmVsX2ZwdV9iZWdpbigmdnhzdGF0ZSwgS0VSTkVMX1ZYUl9MT1cpOwkJICAgIFwKIAkJY3JjID0gX19fY3JjMzJfdngoY3JjLCBkYXRhLCBhbGlnbmVkKTsJCQkgICAgXAotCQlrZXJuZWxfZnB1X2VuZCgmdnhzdGF0ZSk7CQkJCSAgICBcCisJCWtlcm5lbF9mcHVfZW5kKCZ2eHN0YXRlLCBLRVJORUxfVlhSX0xPVyk7CQkgICAgXAogCQkJCQkJCQkJICAgIFwKIAkJaWYgKHJlbWFpbmluZykJCQkJCQkgICAgXAogCQkJY3JjID0gX19fY3JjMzJfc3coY3JjLCBkYXRhICsgYWxpZ25lZCwgcmVtYWluaW5nKTsgIFwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9jcnlwdG8vZGVzX3MzOTAuYyBiL2FyY2gvczM5MC9jcnlwdG8vZGVzX3MzOTAuYwppbmRleCA2OTdlNzFhLi44YjgzMTQ0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL2Rlc19zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2NyeXB0by9kZXNfczM5MC5jCkBAIC0yNyw2ICsyNyw4IEBACiBzdGF0aWMgdTggKmN0cmJsazsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3RyYmxrX2xvY2spOwogCitzdGF0aWMgY3BhY2ZfbWFza190IGttX2Z1bmN0aW9ucywga21jX2Z1bmN0aW9ucywga21jdHJfZnVuY3Rpb25zOworCiBzdHJ1Y3QgczM5MF9kZXNfY3R4IHsKIAl1OCBpdltERVNfQkxPQ0tfU0laRV07CiAJdTgga2V5W0RFUzNfS0VZX1NJWkVdOwpAQCAtMzYsMTIgKzM4LDEyIEBACiAJCSAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuKQogewogCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7Ci0JdTMyICpmbGFncyA9ICZ0Zm0tPmNydF9mbGFnczsKIAl1MzIgdG1wW0RFU19FWFBLRVlfV09SRFNdOwogCiAJLyogY2hlY2sgZm9yIHdlYWsga2V5cyAqLwotCWlmICghZGVzX2VrZXkodG1wLCBrZXkpICYmICgqZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSkpIHsKLQkJKmZsYWdzIHw9IENSWVBUT19URk1fUkVTX1dFQUtfS0VZOworCWlmICghZGVzX2VrZXkodG1wLCBrZXkpICYmCisJICAgICh0Zm0tPmNydF9mbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKSkgeworCQl0Zm0tPmNydF9mbGFncyB8PSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01MywxNCArNTUsMTUgQEAKIHsKIAlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCi0JY3BhY2Zfa20oQ1BBQ0ZfS01fREVBX0VOQywgY3R4LT5rZXksIG91dCwgaW4sIERFU19CTE9DS19TSVpFKTsKKwljcGFjZl9rbShDUEFDRl9LTV9ERUEsIGN0eC0+a2V5LCBvdXQsIGluLCBERVNfQkxPQ0tfU0laRSk7CiB9CiAKIHN0YXRpYyB2b2lkIGRlc19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKIHsKIAlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCi0JY3BhY2Zfa20oQ1BBQ0ZfS01fREVBX0RFQywgY3R4LT5rZXksIG91dCwgaW4sIERFU19CTE9DS19TSVpFKTsKKwljcGFjZl9rbShDUEFDRl9LTV9ERUEgfCBDUEFDRl9ERUNSWVBULAorCQkgY3R4LT5rZXksIG91dCwgaW4sIERFU19CTE9DS19TSVpFKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGRlc19hbGcgPSB7CkBAIC04Miw2MSArODUsNDYgQEAKIAl9CiB9OwogCi1zdGF0aWMgaW50IGVjYl9kZXNhbGxfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBsb25nIGZ1bmMsCi0JCQkgICAgdTggKmtleSwgc3RydWN0IGJsa2NpcGhlcl93YWxrICp3YWxrKQotewotCWludCByZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsIHdhbGspOwotCXVuc2lnbmVkIGludCBuYnl0ZXM7Ci0KLQl3aGlsZSAoKG5ieXRlcyA9IHdhbGstPm5ieXRlcykpIHsKLQkJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCi0JCXVuc2lnbmVkIGludCBuID0gbmJ5dGVzICYgfihERVNfQkxPQ0tfU0laRSAtIDEpOwotCQl1OCAqb3V0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKLQkJdTggKmluID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKLQotCQlyZXQgPSBjcGFjZl9rbShmdW5jLCBrZXksIG91dCwgaW4sIG4pOwotCQlpZiAocmV0IDwgMCB8fCByZXQgIT0gbikKLQkJCXJldHVybiAtRUlPOwotCi0JCW5ieXRlcyAmPSBERVNfQkxPQ0tfU0laRSAtIDE7Ci0JCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNiY19kZXNhbGxfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBsb25nIGZ1bmMsCitzdGF0aWMgaW50IGVjYl9kZXNhbGxfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCB1bnNpZ25lZCBsb25nIGZjLAogCQkJICAgIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKIHsKIAlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwotCWludCByZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsIHdhbGspOwotCXVuc2lnbmVkIGludCBuYnl0ZXMgPSB3YWxrLT5uYnl0ZXM7CisJdW5zaWduZWQgaW50IG5ieXRlcywgbjsKKwlpbnQgcmV0OworCisJcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCB3YWxrKTsKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGstPm5ieXRlcykgPj0gREVTX0JMT0NLX1NJWkUpIHsKKwkJLyogb25seSB1c2UgY29tcGxldGUgYmxvY2tzICovCisJCW4gPSBuYnl0ZXMgJiB+KERFU19CTE9DS19TSVpFIC0gMSk7CisJCWNwYWNmX2ttKGZjLCBjdHgtPmtleSwgd2Fsay0+ZHN0LnZpcnQuYWRkciwKKwkJCSB3YWxrLT5zcmMudmlydC5hZGRyLCBuKTsKKwkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMgLSBuKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYmNfZGVzYWxsX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgdW5zaWduZWQgbG9uZyBmYywKKwkJCSAgICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCit7CisJc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzLCBuOworCWludCByZXQ7CiAJc3RydWN0IHsKIAkJdTggaXZbREVTX0JMT0NLX1NJWkVdOwogCQl1OCBrZXlbREVTM19LRVlfU0laRV07CiAJfSBwYXJhbTsKIAotCWlmICghbmJ5dGVzKQotCQlnb3RvIG91dDsKLQorCXJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgd2Fsayk7CiAJbWVtY3B5KHBhcmFtLml2LCB3YWxrLT5pdiwgREVTX0JMT0NLX1NJWkUpOwogCW1lbWNweShwYXJhbS5rZXksIGN0eC0+a2V5LCBERVMzX0tFWV9TSVpFKTsKLQlkbyB7CisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpID49IERFU19CTE9DS19TSVpFKSB7CiAJCS8qIG9ubHkgdXNlIGNvbXBsZXRlIGJsb2NrcyAqLwotCQl1bnNpZ25lZCBpbnQgbiA9IG5ieXRlcyAmIH4oREVTX0JMT0NLX1NJWkUgLSAxKTsKLQkJdTggKm91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCXU4ICppbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0KLQkJcmV0ID0gY3BhY2Zfa21jKGZ1bmMsICZwYXJhbSwgb3V0LCBpbiwgbik7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJbmJ5dGVzICY9IERFU19CTE9DS19TSVpFIC0gMTsKLQkJcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCB3YWxrLCBuYnl0ZXMpOwotCX0gd2hpbGUgKChuYnl0ZXMgPSB3YWxrLT5uYnl0ZXMpKTsKKwkJbiA9IG5ieXRlcyAmIH4oREVTX0JMT0NLX1NJWkUgLSAxKTsKKwkJY3BhY2Zfa21jKGZjLCAmcGFyYW0sIHdhbGstPmRzdC52aXJ0LmFkZHIsCisJCQkgIHdhbGstPnNyYy52aXJ0LmFkZHIsIG4pOworCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIG5ieXRlcyAtIG4pOworCX0KIAltZW1jcHkod2Fsay0+aXYsIHBhcmFtLml2LCBERVNfQkxPQ0tfU0laRSk7Ci0KLW91dDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDQsMjIgKzEzMiwyMCBAQAogCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGVjYl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01fREVBX0VOQywgY3R4LT5rZXksICZ3YWxrKTsKKwlyZXR1cm4gZWNiX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTV9ERUEsICZ3YWxrKTsKIH0KIAogc3RhdGljIGludCBlY2JfZGVzX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAogCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGVjYl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01fREVBX0RFQywgY3R4LT5rZXksICZ3YWxrKTsKKwlyZXR1cm4gZWNiX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTV9ERUEgfCBDUEFDRl9ERUNSWVBULCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBlY2JfZGVzX2FsZyA9IHsKQEAgLTE4OSw3ICsxNzUsNyBAQAogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DX0RFQV9FTkMsICZ3YWxrKTsKKwlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNfREVBLCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgY2JjX2Rlc19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKQEAgLTE5OSw3ICsxODUsNyBAQAogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DX0RFQV9ERUMsICZ3YWxrKTsKKwlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNfREVBIHwgQ1BBQ0ZfREVDUllQVCwgJndhbGspOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgY2JjX2Rlc19hbGcgPSB7CkBAIC0yNDAsMTMgKzIyNiwxMiBAQAogCQkgICAgICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiB7CiAJc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKLQl1MzIgKmZsYWdzID0gJnRmbS0+Y3J0X2ZsYWdzOwogCiAJaWYgKCEoY3J5cHRvX21lbW5lcShrZXksICZrZXlbREVTX0tFWV9TSVpFXSwgREVTX0tFWV9TSVpFKSAmJgogCSAgICBjcnlwdG9fbWVtbmVxKCZrZXlbREVTX0tFWV9TSVpFXSwgJmtleVtERVNfS0VZX1NJWkUgKiAyXSwKIAkJCSAgREVTX0tFWV9TSVpFKSkgJiYKLQkgICAgKCpmbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKSkgewotCQkqZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVk7CisJICAgICh0Zm0tPmNydF9mbGFncyAmIENSWVBUT19URk1fUkVRX1dFQUtfS0VZKSkgeworCQl0Zm0tPmNydF9mbGFncyB8PSBDUllQVE9fVEZNX1JFU19XRUFLX0tFWTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCW1lbWNweShjdHgtPmtleSwga2V5LCBrZXlfbGVuKTsKQEAgLTI1NywxNCArMjQyLDE1IEBACiB7CiAJc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAotCWNwYWNmX2ttKENQQUNGX0tNX1RERUFfMTkyX0VOQywgY3R4LT5rZXksIGRzdCwgc3JjLCBERVNfQkxPQ0tfU0laRSk7CisJY3BhY2Zfa20oQ1BBQ0ZfS01fVERFQV8xOTIsIGN0eC0+a2V5LCBkc3QsIHNyYywgREVTX0JMT0NLX1NJWkUpOwogfQogCiBzdGF0aWMgdm9pZCBkZXMzX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKIHsKIAlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCi0JY3BhY2Zfa20oQ1BBQ0ZfS01fVERFQV8xOTJfREVDLCBjdHgtPmtleSwgZHN0LCBzcmMsIERFU19CTE9DS19TSVpFKTsKKwljcGFjZl9rbShDUEFDRl9LTV9UREVBXzE5MiB8IENQQUNGX0RFQ1JZUFQsCisJCSBjdHgtPmtleSwgZHN0LCBzcmMsIERFU19CTE9DS19TSVpFKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGRlczNfYWxnID0gewpAQCAtMjkwLDIyICsyNzYsMjEgQEAKIAkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAJCQkgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGVjYl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01fVERFQV8xOTJfRU5DLCBjdHgtPmtleSwgJndhbGspOworCXJldHVybiBlY2JfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNX1RERUFfMTkyLCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgZWNiX2RlczNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCiAJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBlY2JfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNX1RERUFfMTkyX0RFQywgY3R4LT5rZXksICZ3YWxrKTsKKwlyZXR1cm4gZWNiX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTV9UREVBXzE5MiB8IENQQUNGX0RFQ1JZUFQsCisJCQkJJndhbGspOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgZWNiX2RlczNfYWxnID0gewpAQCAtMzM1LDcgKzMyMCw3IEBACiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNfVERFQV8xOTJfRU5DLCAmd2Fsayk7CisJcmV0dXJuIGNiY19kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DX1RERUFfMTkyLCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBpbnQgY2JjX2RlczNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCkBAIC0zNDUsNyArMzMwLDggQEAKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjYmNfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ19UREVBXzE5Ml9ERUMsICZ3YWxrKTsKKwlyZXR1cm4gY2JjX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNfVERFQV8xOTIgfCBDUEFDRl9ERUNSWVBULAorCQkJCSZ3YWxrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGNiY19kZXMzX2FsZyA9IHsKQEAgLTM2OSw4MSArMzU1LDU0IEBACiAJfQogfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2N0cmJsa19pbml0KHU4ICpjdHJwdHIsIHVuc2lnbmVkIGludCBuYnl0ZXMpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fY3RyYmxrX2luaXQodTggKmN0cnB0ciwgdTggKml2LCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewogCXVuc2lnbmVkIGludCBpLCBuOwogCiAJLyogYWxpZ24gdG8gYmxvY2sgc2l6ZSwgbWF4LiBQQUdFX1NJWkUgKi8KIAluID0gKG5ieXRlcyA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOiBuYnl0ZXMgJiB+KERFU19CTE9DS19TSVpFIC0gMSk7Ci0JZm9yIChpID0gREVTX0JMT0NLX1NJWkU7IGkgPCBuOyBpICs9IERFU19CTE9DS19TSVpFKSB7Ci0JCW1lbWNweShjdHJwdHIgKyBpLCBjdHJwdHIgKyBpIC0gREVTX0JMT0NLX1NJWkUsIERFU19CTE9DS19TSVpFKTsKLQkJY3J5cHRvX2luYyhjdHJwdHIgKyBpLCBERVNfQkxPQ0tfU0laRSk7CisJbWVtY3B5KGN0cnB0ciwgaXYsIERFU19CTE9DS19TSVpFKTsKKwlmb3IgKGkgPSAobiAvIERFU19CTE9DS19TSVpFKSAtIDE7IGkgPiAwOyBpLS0pIHsKKwkJbWVtY3B5KGN0cnB0ciArIERFU19CTE9DS19TSVpFLCBjdHJwdHIsIERFU19CTE9DS19TSVpFKTsKKwkJY3J5cHRvX2luYyhjdHJwdHIgKyBERVNfQkxPQ0tfU0laRSwgREVTX0JMT0NLX1NJWkUpOworCQljdHJwdHIgKz0gREVTX0JMT0NLX1NJWkU7CiAJfQogCXJldHVybiBuOwogfQogCi1zdGF0aWMgaW50IGN0cl9kZXNhbGxfY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBsb25nIGZ1bmMsCi0JCQkgICAgc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4LAorc3RhdGljIGludCBjdHJfZGVzYWxsX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgdW5zaWduZWQgbG9uZyBmYywKIAkJCSAgICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgKndhbGspCiB7Ci0JaW50IHJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnRfYmxvY2soZGVzYywgd2FsaywgREVTX0JMT0NLX1NJWkUpOworCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CisJdTggYnVmW0RFU19CTE9DS19TSVpFXSwgKmN0cnB0cjsKIAl1bnNpZ25lZCBpbnQgbiwgbmJ5dGVzOwotCXU4IGJ1ZltERVNfQkxPQ0tfU0laRV0sIGN0cmJ1ZltERVNfQkxPQ0tfU0laRV07Ci0JdTggKm91dCwgKmluLCAqY3RycHRyID0gY3RyYnVmOworCWludCByZXQsIGxvY2tlZDsKIAotCWlmICghd2Fsay0+bmJ5dGVzKQotCQlyZXR1cm4gcmV0OworCWxvY2tlZCA9IHNwaW5fdHJ5bG9jaygmY3RyYmxrX2xvY2spOwogCi0JaWYgKHNwaW5fdHJ5bG9jaygmY3RyYmxrX2xvY2spKQotCQljdHJwdHIgPSBjdHJibGs7Ci0KLQltZW1jcHkoY3RycHRyLCB3YWxrLT5pdiwgREVTX0JMT0NLX1NJWkUpOworCXJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnRfYmxvY2soZGVzYywgd2FsaywgREVTX0JMT0NLX1NJWkUpOwogCXdoaWxlICgobmJ5dGVzID0gd2Fsay0+bmJ5dGVzKSA+PSBERVNfQkxPQ0tfU0laRSkgewotCQlvdXQgPSB3YWxrLT5kc3QudmlydC5hZGRyOwotCQlpbiA9IHdhbGstPnNyYy52aXJ0LmFkZHI7Ci0JCXdoaWxlIChuYnl0ZXMgPj0gREVTX0JMT0NLX1NJWkUpIHsKLQkJCWlmIChjdHJwdHIgPT0gY3RyYmxrKQotCQkJCW4gPSBfX2N0cmJsa19pbml0KGN0cnB0ciwgbmJ5dGVzKTsKLQkJCWVsc2UKLQkJCQluID0gREVTX0JMT0NLX1NJWkU7Ci0JCQlyZXQgPSBjcGFjZl9rbWN0cihmdW5jLCBjdHgtPmtleSwgb3V0LCBpbiwgbiwgY3RycHRyKTsKLQkJCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuKSB7Ci0JCQkJaWYgKGN0cnB0ciA9PSBjdHJibGspCi0JCQkJCXNwaW5fdW5sb2NrKCZjdHJibGtfbG9jayk7Ci0JCQkJcmV0dXJuIC1FSU87Ci0JCQl9Ci0JCQlpZiAobiA+IERFU19CTE9DS19TSVpFKQotCQkJCW1lbWNweShjdHJwdHIsIGN0cnB0ciArIG4gLSBERVNfQkxPQ0tfU0laRSwKLQkJCQkgICAgICAgREVTX0JMT0NLX1NJWkUpOwotCQkJY3J5cHRvX2luYyhjdHJwdHIsIERFU19CTE9DS19TSVpFKTsKLQkJCW91dCArPSBuOwotCQkJaW4gKz0gbjsKLQkJCW5ieXRlcyAtPSBuOwotCQl9Ci0JCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzKTsKKwkJbiA9IERFU19CTE9DS19TSVpFOworCQlpZiAobmJ5dGVzID49IDIqREVTX0JMT0NLX1NJWkUgJiYgbG9ja2VkKQorCQkJbiA9IF9fY3RyYmxrX2luaXQoY3RyYmxrLCB3YWxrLT5pdiwgbmJ5dGVzKTsKKwkJY3RycHRyID0gKG4gPiBERVNfQkxPQ0tfU0laRSkgPyBjdHJibGsgOiB3YWxrLT5pdjsKKwkJY3BhY2Zfa21jdHIoZmMsIGN0eC0+a2V5LCB3YWxrLT5kc3QudmlydC5hZGRyLAorCQkJICAgIHdhbGstPnNyYy52aXJ0LmFkZHIsIG4sIGN0cnB0cik7CisJCWlmIChjdHJwdHIgPT0gY3RyYmxrKQorCQkJbWVtY3B5KHdhbGstPml2LCBjdHJwdHIgKyBuIC0gREVTX0JMT0NLX1NJWkUsCisJCQkJREVTX0JMT0NLX1NJWkUpOworCQljcnlwdG9faW5jKHdhbGstPml2LCBERVNfQkxPQ0tfU0laRSk7CisJCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgbmJ5dGVzIC0gbik7CiAJfQotCWlmIChjdHJwdHIgPT0gY3RyYmxrKSB7Ci0JCWlmIChuYnl0ZXMpCi0JCQltZW1jcHkoY3RyYnVmLCBjdHJwdHIsIERFU19CTE9DS19TSVpFKTsKLQkJZWxzZQotCQkJbWVtY3B5KHdhbGstPml2LCBjdHJwdHIsIERFU19CTE9DS19TSVpFKTsKKwlpZiAobG9ja2VkKQogCQlzcGluX3VubG9jaygmY3RyYmxrX2xvY2spOwotCX0gZWxzZSB7Ci0JCWlmICghbmJ5dGVzKQotCQkJbWVtY3B5KHdhbGstPml2LCBjdHJwdHIsIERFU19CTE9DS19TSVpFKTsKLQl9CiAJLyogZmluYWwgYmxvY2sgbWF5IGJlIDwgREVTX0JMT0NLX1NJWkUsIGNvcHkgb25seSBuYnl0ZXMgKi8KIAlpZiAobmJ5dGVzKSB7Ci0JCW91dCA9IHdhbGstPmRzdC52aXJ0LmFkZHI7Ci0JCWluID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKLQkJcmV0ID0gY3BhY2Zfa21jdHIoZnVuYywgY3R4LT5rZXksIGJ1ZiwgaW4sCi0JCQkJICBERVNfQkxPQ0tfU0laRSwgY3RyYnVmKTsKLQkJaWYgKHJldCA8IDAgfHwgcmV0ICE9IERFU19CTE9DS19TSVpFKQotCQkJcmV0dXJuIC1FSU87Ci0JCW1lbWNweShvdXQsIGJ1ZiwgbmJ5dGVzKTsKLQkJY3J5cHRvX2luYyhjdHJidWYsIERFU19CTE9DS19TSVpFKTsKKwkJY3BhY2Zfa21jdHIoZmMsIGN0eC0+a2V5LCBidWYsIHdhbGstPnNyYy52aXJ0LmFkZHIsCisJCQkgICAgREVTX0JMT0NLX1NJWkUsIHdhbGstPml2KTsKKwkJbWVtY3B5KHdhbGstPmRzdC52aXJ0LmFkZHIsIGJ1ZiwgbmJ5dGVzKTsKKwkJY3J5cHRvX2luYyh3YWxrLT5pdiwgREVTX0JMT0NLX1NJWkUpOwogCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsIHdhbGssIDApOwotCQltZW1jcHkod2Fsay0+aXYsIGN0cmJ1ZiwgREVTX0JMT0NLX1NJWkUpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtNDUyLDIyICs0MTEsMjAgQEAKIAkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKIAkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjdHJfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ1RSX0RFQV9FTkMsIGN0eCwgJndhbGspOworCXJldHVybiBjdHJfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ1RSX0RFQSwgJndhbGspOwogfQogCiBzdGF0aWMgaW50IGN0cl9kZXNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCiAJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQogewotCXN0cnVjdCBzMzkwX2Rlc19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CiAJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CiAKIAlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKLQlyZXR1cm4gY3RyX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNUUl9ERUFfREVDLCBjdHgsICZ3YWxrKTsKKwlyZXR1cm4gY3RyX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNUUl9ERUEgfCBDUEFDRl9ERUNSWVBULCAmd2Fsayk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBjdHJfZGVzX2FsZyA9IHsKQEAgLTQ5NSwyMiArNDUyLDIxIEBACiAJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogCQkJICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCiB7Ci0Jc3RydWN0IHMzOTBfZGVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKIAogCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOwotCXJldHVybiBjdHJfZGVzYWxsX2NyeXB0KGRlc2MsIENQQUNGX0tNQ1RSX1RERUFfMTkyX0VOQywgY3R4LCAmd2Fsayk7CisJcmV0dXJuIGN0cl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DVFJfVERFQV8xOTIsICZ3YWxrKTsKIH0KIAogc3RhdGljIGludCBjdHJfZGVzM19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKIAkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCiAJCQkgICAgdW5zaWduZWQgaW50IG5ieXRlcykKIHsKLQlzdHJ1Y3QgczM5MF9kZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOwogCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOwogCiAJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7Ci0JcmV0dXJuIGN0cl9kZXNhbGxfY3J5cHQoZGVzYywgQ1BBQ0ZfS01DVFJfVERFQV8xOTJfREVDLCBjdHgsICZ3YWxrKTsKKwlyZXR1cm4gY3RyX2Rlc2FsbF9jcnlwdChkZXNjLCBDUEFDRl9LTUNUUl9UREVBXzE5MiB8IENQQUNGX0RFQ1JZUFQsCisJCQkJJndhbGspOwogfQogCiBzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgY3RyX2RlczNfYWxnID0gewpAQCAtNTM0LDgzICs0OTAsODcgQEAKIAl9CiB9OwogCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgKmRlc19zMzkwX2FsZ3NfcHRyWzhdOworc3RhdGljIGludCBkZXNfczM5MF9hbGdzX251bTsKKworc3RhdGljIGludCBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZyhhbGcpOworCWlmICghcmV0KQorCQlkZXNfczM5MF9hbGdzX3B0cltkZXNfczM5MF9hbGdzX251bSsrXSA9IGFsZzsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkZXNfczM5MF9leGl0KHZvaWQpCit7CisJd2hpbGUgKGRlc19zMzkwX2FsZ3NfbnVtLS0pCisJCWNyeXB0b191bnJlZ2lzdGVyX2FsZyhkZXNfczM5MF9hbGdzX3B0cltkZXNfczM5MF9hbGdzX251bV0pOworCWlmIChjdHJibGspCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgY3RyYmxrKTsKK30KKwogc3RhdGljIGludCBfX2luaXQgZGVzX3MzOTBfaW5pdCh2b2lkKQogewogCWludCByZXQ7CiAKLQlpZiAoIWNwYWNmX3F1ZXJ5KENQQUNGX0tNLCBDUEFDRl9LTV9ERUFfRU5DKSB8fAotCSAgICAhY3BhY2ZfcXVlcnkoQ1BBQ0ZfS00sIENQQUNGX0tNX1RERUFfMTkyX0VOQykpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKKwkvKiBRdWVyeSBhdmFpbGFibGUgZnVuY3Rpb25zIGZvciBLTSwgS01DIGFuZCBLTUNUUiAqLworCWNwYWNmX3F1ZXJ5KENQQUNGX0tNLCAma21fZnVuY3Rpb25zKTsKKwljcGFjZl9xdWVyeShDUEFDRl9LTUMsICZrbWNfZnVuY3Rpb25zKTsKKwljcGFjZl9xdWVyeShDUEFDRl9LTUNUUiwgJmttY3RyX2Z1bmN0aW9ucyk7CiAKLQlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZkZXNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGRlc19lcnI7Ci0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZWNiX2Rlc19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gZWNiX2Rlc19lcnI7Ci0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY2JjX2Rlc19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gY2JjX2Rlc19lcnI7Ci0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZGVzM19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gZGVzM19lcnI7Ci0JcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZWNiX2RlczNfYWxnKTsKLQlpZiAocmV0KQotCQlnb3RvIGVjYl9kZXMzX2VycjsKLQlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCZjYmNfZGVzM19hbGcpOwotCWlmIChyZXQpCi0JCWdvdG8gY2JjX2RlczNfZXJyOworCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttX2Z1bmN0aW9ucywgQ1BBQ0ZfS01fREVBKSkgeworCQlyZXQgPSBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmRlc19hbGcpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOworCQlyZXQgPSBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmVjYl9kZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisJaWYgKGNwYWNmX3Rlc3RfZnVuYygma21jX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DX0RFQSkpIHsKKwkJcmV0ID0gZGVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZjYmNfZGVzX2FsZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9lcnI7CisJfQorCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttX2Z1bmN0aW9ucywgQ1BBQ0ZfS01fVERFQV8xOTIpKSB7CisJCXJldCA9IGRlc19zMzkwX3JlZ2lzdGVyX2FsZygmZGVzM19hbGcpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOworCQlyZXQgPSBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmVjYl9kZXMzX2FsZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF9lcnI7CisJfQorCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttY19mdW5jdGlvbnMsIENQQUNGX0tNQ19UREVBXzE5MikpIHsKKwkJcmV0ID0gZGVzX3MzOTBfcmVnaXN0ZXJfYWxnKCZjYmNfZGVzM19hbGcpOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfZXJyOworCX0KIAotCWlmIChjcGFjZl9xdWVyeShDUEFDRl9LTUNUUiwgQ1BBQ0ZfS01DVFJfREVBX0VOQykgJiYKLQkgICAgY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01DVFIsIENQQUNGX0tNQ1RSX1RERUFfMTkyX0VOQykpIHsKLQkJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY3RyX2Rlc19hbGcpOwotCQlpZiAocmV0KQotCQkJZ290byBjdHJfZGVzX2VycjsKLQkJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmY3RyX2RlczNfYWxnKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gY3RyX2RlczNfZXJyOworCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttY3RyX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DVFJfREVBKSB8fAorCSAgICBjcGFjZl90ZXN0X2Z1bmMoJmttY3RyX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DVFJfVERFQV8xOTIpKSB7CiAJCWN0cmJsayA9ICh1OCAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJCWlmICghY3RyYmxrKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBjdHJfbWVtX2VycjsKKwkJCWdvdG8gb3V0X2VycjsKIAkJfQogCX0KLW91dDoKLQlyZXR1cm4gcmV0OwogCi1jdHJfbWVtX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmN0cl9kZXMzX2FsZyk7Ci1jdHJfZGVzM19lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjdHJfZGVzX2FsZyk7Ci1jdHJfZGVzX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmNiY19kZXMzX2FsZyk7Ci1jYmNfZGVzM19lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZlY2JfZGVzM19hbGcpOwotZWNiX2RlczNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZGVzM19hbGcpOwotZGVzM19lcnI6Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfZGVzX2FsZyk7Ci1jYmNfZGVzX2VycjoKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmVjYl9kZXNfYWxnKTsKLWVjYl9kZXNfZXJyOgotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZGVzX2FsZyk7Ci1kZXNfZXJyOgotCWdvdG8gb3V0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZGVzX3MzOTBfZXhpdCh2b2lkKQotewotCWlmIChjdHJibGspIHsKLQkJY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjdHJfZGVzX2FsZyk7Ci0JCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmY3RyX2RlczNfYWxnKTsKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBjdHJibGspOworCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttY3RyX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DVFJfREVBKSkgeworCQlyZXQgPSBkZXNfczM5MF9yZWdpc3Rlcl9hbGcoJmN0cl9kZXNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKIAl9Ci0JY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCZjYmNfZGVzM19hbGcpOwotCWNyeXB0b191bnJlZ2lzdGVyX2FsZygmZWNiX2RlczNfYWxnKTsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlczNfYWxnKTsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmNiY19kZXNfYWxnKTsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmVjYl9kZXNfYWxnKTsKLQljcnlwdG9fdW5yZWdpc3Rlcl9hbGcoJmRlc19hbGcpOworCWlmIChjcGFjZl90ZXN0X2Z1bmMoJmttY3RyX2Z1bmN0aW9ucywgQ1BBQ0ZfS01DVFJfVERFQV8xOTIpKSB7CisJCXJldCA9IGRlc19zMzkwX3JlZ2lzdGVyX2FsZygmY3RyX2RlczNfYWxnKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJZGVzX3MzOTBfZXhpdCgpOworCXJldHVybiByZXQ7CiB9CiAKIG1vZHVsZV9jcHVfZmVhdHVyZV9tYXRjaChNU0EsIGRlc19zMzkwX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9naGFzaF9zMzkwLmMgYi9hcmNoL3MzOTAvY3J5cHRvL2doYXNoX3MzOTAuYwppbmRleCBhYjY4ZGU3Li41NjQ2MTZkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL2doYXNoX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL2doYXNoX3MzOTAuYwpAQCAtNTgsNyArNTgsNiBAQAogCXN0cnVjdCBnaGFzaF9kZXNjX2N0eCAqZGN0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwogCXVuc2lnbmVkIGludCBuOwogCXU4ICpidWYgPSBkY3R4LT5idWZmZXI7Ci0JaW50IHJldDsKIAogCWlmIChkY3R4LT5ieXRlcykgewogCQl1OCAqcG9zID0gYnVmICsgKEdIQVNIX0JMT0NLX1NJWkUgLSBkY3R4LT5ieXRlcyk7CkBAIC03MSwxOCArNzAsMTQgQEAKIAkJc3JjICs9IG47CiAKIAkJaWYgKCFkY3R4LT5ieXRlcykgewotCQkJcmV0ID0gY3BhY2Zfa2ltZChDUEFDRl9LSU1EX0dIQVNILCBkY3R4LCBidWYsCi0JCQkJCSBHSEFTSF9CTE9DS19TSVpFKTsKLQkJCWlmIChyZXQgIT0gR0hBU0hfQkxPQ0tfU0laRSkKLQkJCQlyZXR1cm4gLUVJTzsKKwkJCWNwYWNmX2tpbWQoQ1BBQ0ZfS0lNRF9HSEFTSCwgZGN0eCwgYnVmLAorCQkJCSAgIEdIQVNIX0JMT0NLX1NJWkUpOwogCQl9CiAJfQogCiAJbiA9IHNyY2xlbiAmIH4oR0hBU0hfQkxPQ0tfU0laRSAtIDEpOwogCWlmIChuKSB7Ci0JCXJldCA9IGNwYWNmX2tpbWQoQ1BBQ0ZfS0lNRF9HSEFTSCwgZGN0eCwgc3JjLCBuKTsKLQkJaWYgKHJldCAhPSBuKQotCQkJcmV0dXJuIC1FSU87CisJCWNwYWNmX2tpbWQoQ1BBQ0ZfS0lNRF9HSEFTSCwgZGN0eCwgc3JjLCBuKTsKIAkJc3JjICs9IG47CiAJCXNyY2xlbiAtPSBuOwogCX0KQEAgLTk4LDE3ICs5MywxMiBAQAogc3RhdGljIGludCBnaGFzaF9mbHVzaChzdHJ1Y3QgZ2hhc2hfZGVzY19jdHggKmRjdHgpCiB7CiAJdTggKmJ1ZiA9IGRjdHgtPmJ1ZmZlcjsKLQlpbnQgcmV0OwogCiAJaWYgKGRjdHgtPmJ5dGVzKSB7CiAJCXU4ICpwb3MgPSBidWYgKyAoR0hBU0hfQkxPQ0tfU0laRSAtIGRjdHgtPmJ5dGVzKTsKIAogCQltZW1zZXQocG9zLCAwLCBkY3R4LT5ieXRlcyk7Ci0KLQkJcmV0ID0gY3BhY2Zfa2ltZChDUEFDRl9LSU1EX0dIQVNILCBkY3R4LCBidWYsIEdIQVNIX0JMT0NLX1NJWkUpOwotCQlpZiAocmV0ICE9IEdIQVNIX0JMT0NLX1NJWkUpCi0JCQlyZXR1cm4gLUVJTzsKLQorCQljcGFjZl9raW1kKENQQUNGX0tJTURfR0hBU0gsIGRjdHgsIGJ1ZiwgR0hBU0hfQkxPQ0tfU0laRSk7CiAJCWRjdHgtPmJ5dGVzID0gMDsKIAl9CiAKQEAgLTE0Niw3ICsxMzYsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBnaGFzaF9tb2RfaW5pdCh2b2lkKQogewotCWlmICghY3BhY2ZfcXVlcnkoQ1BBQ0ZfS0lNRCwgQ1BBQ0ZfS0lNRF9HSEFTSCkpCisJaWYgKCFjcGFjZl9xdWVyeV9mdW5jKENQQUNGX0tJTUQsIENQQUNGX0tJTURfR0hBU0gpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX3NoYXNoKCZnaGFzaF9hbGcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9wcm5nLmMgYi9hcmNoL3MzOTAvY3J5cHRvL3BybmcuYwppbmRleCA0MTUyN2IxLi45Y2MwNTBmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL3BybmcuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3BybmcuYwpAQCAtMTM1LDEyICsxMzUsNyBAQAogCQllbHNlCiAJCQloID0gZWJ1ZjsKIAkJLyogZ2VuZXJhdGUgc2hhMjU2IGZyb20gdGhpcyBwYWdlICovCi0JCWlmIChjcGFjZl9raW1kKENQQUNGX0tJTURfU0hBXzI1NiwgaCwKLQkJCSAgICAgICBwZywgUEFHRV9TSVpFKSAhPSBQQUdFX1NJWkUpIHsKLQkJCXBybmdfZXJyb3JmbGFnID0gUFJOR19HRU5fRU5UUk9QWV9GQUlMRUQ7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkJY3BhY2Zfa2ltZChDUEFDRl9LSU1EX1NIQV8yNTYsIGgsIHBnLCBQQUdFX1NJWkUpOwogCQlpZiAobiA8IHNpemVvZihoYXNoKSkKIAkJCW1lbWNweShlYnVmLCBoYXNoLCBuKTsKIAkJcmV0ICs9IG47CkBAIC0xNDgsNyArMTQzLDYgQEAKIAkJbmJ5dGVzIC09IG47CiAJfQogCi1vdXQ6CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBnKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTYwLDEzICsxNTQsMTEgQEAKIHsKIAlfX3U2NCBlbnRyb3B5WzRdOwogCXVuc2lnbmVkIGludCBpOwotCWludCByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQlyZXQgPSBjcGFjZl9rbWMoQ1BBQ0ZfS01DX1BSTkcsIHBybmdfZGF0YS0+cHJuZ3dzLnBhcm1fYmxvY2ssCi0JCQkJKGNoYXIgKillbnRyb3B5LCAoY2hhciAqKWVudHJvcHksCi0JCQkJc2l6ZW9mKGVudHJvcHkpKTsKLQkJQlVHX09OKHJldCA8IDAgfHwgcmV0ICE9IHNpemVvZihlbnRyb3B5KSk7CisJCWNwYWNmX2ttYyhDUEFDRl9LTUNfUFJORywgcHJuZ19kYXRhLT5wcm5nd3MucGFybV9ibG9jaywKKwkJCSAgKGNoYXIgKikgZW50cm9weSwgKGNoYXIgKikgZW50cm9weSwKKwkJCSAgc2l6ZW9mKGVudHJvcHkpKTsKIAkJbWVtY3B5KHBybmdfZGF0YS0+cHJuZ3dzLnBhcm1fYmxvY2ssIGVudHJvcHksIHNpemVvZihlbnRyb3B5KSk7CiAJfQogfQpAQCAtMzAzLDIxICsyOTUsMTQgQEAKIAkJMHgyMSwgMHhlNCwgMHhiMCwgMHg4NiwgMHg0NCwgMHhmNiwgMHg3MiwgMHg3YywKIAkJMHgzNiwgMHg4YywgMHg1YSwgMHg5ZiwgMHg3YSwgMHg0YiwgMHgzZSwgMHhlMiB9OwogCi0JaW50IHJldCA9IDA7CiAJdTggYnVmW3NpemVvZihyYW5kb20pXTsKIAlzdHJ1Y3QgcHBub193c19zIHdzOwogCiAJbWVtc2V0KCZ3cywgMCwgc2l6ZW9mKHdzKSk7CiAKIAkvKiBpbml0aWFsIHNlZWQgKi8KLQlyZXQgPSBjcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfU0VFRCwgJndzLCBOVUxMLCAwLAotCQkJIHNlZWQsIHNpemVvZihzZWVkKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJUaGUgcHJuZyBzZWxmIHRlc3Qgc2VlZCBvcGVyYXRpb24gZm9yIHRoZSAiCi0JCSAgICAgICAiU0hBLTUxMiBtb2RlIGZhaWxlZCB3aXRoIHJjPSVkXG4iLCByZXQpOwotCQlwcm5nX2Vycm9yZmxhZyA9IFBSTkdfU0VMRlRFU1RfRkFJTEVEOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX1NFRUQsCisJCSAgICZ3cywgTlVMTCwgMCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTsKIAogCS8qIGNoZWNrIHdvcmtpbmcgc3RhdGVzIFYgYW5kIEMgKi8KIAlpZiAobWVtY21wKHdzLlYsIFYwLCBzaXplb2YoVjApKSAhPSAwCkBAIC0zMjksMjIgKzMxNCwxMCBAQAogCX0KIAogCS8qIGdlbmVyYXRlIHJhbmRvbSBieXRlcyAqLwotCXJldCA9IGNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19HRU4sCi0JCQkgJndzLCBidWYsIHNpemVvZihidWYpLCBOVUxMLCAwKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoIlRoZSBwcm5nIHNlbGYgdGVzdCBnZW5lcmF0ZSBvcGVyYXRpb24gZm9yICIKLQkJICAgICAgICJ0aGUgU0hBLTUxMiBtb2RlIGZhaWxlZCB3aXRoIHJjPSVkXG4iLCByZXQpOwotCQlwcm5nX2Vycm9yZmxhZyA9IFBSTkdfU0VMRlRFU1RfRkFJTEVEOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0ID0gY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX0dFTiwKLQkJCSAmd3MsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwsIDApOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiVGhlIHBybmcgc2VsZiB0ZXN0IGdlbmVyYXRlIG9wZXJhdGlvbiBmb3IgIgotCQkgICAgICAgInRoZSBTSEEtNTEyIG1vZGUgZmFpbGVkIHdpdGggcmM9JWRcbiIsIHJldCk7Ci0JCXBybmdfZXJyb3JmbGFnID0gUFJOR19TRUxGVEVTVF9GQUlMRUQ7Ci0JCXJldHVybiAtRUlPOwotCX0KKwljcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOLAorCQkgICAmd3MsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwsIDApOworCWNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19HRU4sCisJCSAgICZ3cywgYnVmLCBzaXplb2YoYnVmKSwgTlVMTCwgMCk7CiAKIAkvKiBjaGVjayBhZ2FpbnN0IGV4cGVjdGVkIGRhdGEgKi8KIAlpZiAobWVtY21wKGJ1ZiwgcmFuZG9tLCBzaXplb2YocmFuZG9tKSkgIT0gMCkgewpAQCAtMzkyLDI2ICszNjUsMTYgQEAKIAlnZXRfdG9kX2Nsb2NrX2V4dChzZWVkICsgNDgpOwogCiAJLyogaW5pdGlhbCBzZWVkIG9mIHRoZSBwcG5vIGRybmcgKi8KLQlyZXQgPSBjcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfU0VFRCwKLQkJCSAmcHJuZ19kYXRhLT5wcG5vd3MsIE5VTEwsIDAsIHNlZWQsIHNpemVvZihzZWVkKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJuZ19lcnJvcmZsYWcgPSBQUk5HX1NFRURfRkFJTEVEOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dGZyZWU7Ci0JfQorCWNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19TRUVELAorCQkgICAmcHJuZ19kYXRhLT5wcG5vd3MsIE5VTEwsIDAsIHNlZWQsIHNpemVvZihzZWVkKSk7CiAKIAkvKiBpZiBmaXBzIG1vZGUgaXMgZW5hYmxlZCwgZ2VuZXJhdGUgYSBmaXJzdCBibG9jayBvZiByYW5kb20KIAkgICBieXRlcyBmb3IgdGhlIEZJUFMgMTQwLTIgQ29uZGl0aW9uYWwgU2VsZiBUZXN0ICovCiAJaWYgKGZpcHNfZW5hYmxlZCkgewogCQlwcm5nX2RhdGEtPnByZXYgPSBwcm5nX2RhdGEtPmJ1ZiArIHBybmdfY2h1bmtfc2l6ZTsKLQkJcmV0ID0gY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX0dFTiwKLQkJCQkgJnBybmdfZGF0YS0+cHBub3dzLAotCQkJCSBwcm5nX2RhdGEtPnByZXYsIHBybmdfY2h1bmtfc2l6ZSwgTlVMTCwgMCk7Ci0JCWlmIChyZXQgPCAwIHx8IHJldCAhPSBwcm5nX2NodW5rX3NpemUpIHsKLQkJCXBybmdfZXJyb3JmbGFnID0gUFJOR19HRU5fRkFJTEVEOwotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gb3V0ZnJlZTsKLQkJfQorCQljcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOLAorCQkJICAgJnBybmdfZGF0YS0+cHBub3dzLAorCQkJICAgcHJuZ19kYXRhLT5wcmV2LCBwcm5nX2NodW5rX3NpemUsIE5VTEwsIDApOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDQwLDEyICs0MDMsOCBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogZG8gYSByZXNlZWQgb2YgdGhlIHBwbm8gZHJuZyB3aXRoIHRoaXMgYnl0ZXN0cmluZyAqLwotCXJldCA9IGNwYWNmX3Bwbm8oQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19TRUVELAotCQkJICZwcm5nX2RhdGEtPnBwbm93cywgTlVMTCwgMCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTsKLQlpZiAocmV0KSB7Ci0JCXBybmdfZXJyb3JmbGFnID0gUFJOR19SRVNFRURfRkFJTEVEOwotCQlyZXR1cm4gLUVJTzsKLQl9CisJY3BhY2ZfcHBubyhDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX1NFRUQsCisJCSAgICZwcm5nX2RhdGEtPnBwbm93cywgTlVMTCwgMCwgc2VlZCwgc2l6ZW9mKHNlZWQpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDYzLDEyICs0MjIsOCBAQAogCX0KIAogCS8qIFBQTk8gZ2VuZXJhdGUgKi8KLQlyZXQgPSBjcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOLAotCQkJICZwcm5nX2RhdGEtPnBwbm93cywgYnVmLCBuYnl0ZXMsIE5VTEwsIDApOwotCWlmIChyZXQgPCAwIHx8IHJldCAhPSBuYnl0ZXMpIHsKLQkJcHJuZ19lcnJvcmZsYWcgPSBQUk5HX0dFTl9GQUlMRUQ7Ci0JCXJldHVybiAtRUlPOwotCX0KKwljcGFjZl9wcG5vKENQQUNGX1BQTk9fU0hBNTEyX0RSTkdfR0VOLAorCQkgICAmcHJuZ19kYXRhLT5wcG5vd3MsIGJ1ZiwgbmJ5dGVzLCBOVUxMLCAwKTsKIAogCS8qIEZJUFMgMTQwLTIgQ29uZGl0aW9uYWwgU2VsZiBUZXN0ICovCiAJaWYgKGZpcHNfZW5hYmxlZCkgewpAQCAtNDc5LDcgKzQzNCw3IEBACiAJCW1lbWNweShwcm5nX2RhdGEtPnByZXYsIGJ1ZiwgbmJ5dGVzKTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBuYnl0ZXM7CiB9CiAKIApAQCAtNDk0LDcgKzQ0OSw3IEBACiBzdGF0aWMgc3NpemVfdCBwcm5nX3RkZXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsCiAJCQkgICAgICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JaW50IGNodW5rLCBuLCB0bXAsIHJldCA9IDA7CisJaW50IGNodW5rLCBuLCByZXQgPSAwOwogCiAJLyogbG9jayBwcm5nX2RhdGEgc3RydWN0ICovCiAJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcHJuZ19kYXRhLT5tdXRleCkpCkBAIC01NDUsMTMgKzUwMCw5IEBACiAJCSAqCiAJCSAqIE5vdGU6IHlvdSBjYW4gc3RpbGwgZ2V0IHN0cmljdCBYOS4xNyBjb25mb3JtaXR5IGJ5IHNldHRpbmcKIAkJICogcHJuZ19jaHVua19zaXplIHRvIDggYnl0ZXMuCi0JCSovCi0JCXRtcCA9IGNwYWNmX2ttYyhDUEFDRl9LTUNfUFJORywgcHJuZ19kYXRhLT5wcm5nd3MucGFybV9ibG9jaywKLQkJCQlwcm5nX2RhdGEtPmJ1ZiwgcHJuZ19kYXRhLT5idWYsIG4pOwotCQlpZiAodG1wIDwgMCB8fCB0bXAgIT0gbikgewotCQkJcmV0ID0gLUVJTzsKLQkJCWJyZWFrOwotCQl9CisJCSAqLworCQljcGFjZl9rbWMoQ1BBQ0ZfS01DX1BSTkcsIHBybmdfZGF0YS0+cHJuZ3dzLnBhcm1fYmxvY2ssCisJCQkgIHBybmdfZGF0YS0+YnVmLCBwcm5nX2RhdGEtPmJ1Ziwgbik7CiAKIAkJcHJuZ19kYXRhLT5wcm5nd3MuYnl0ZV9jb3VudGVyICs9IG47CiAJCXBybmdfZGF0YS0+cHJuZ3dzLnJlc2VlZF9jb3VudGVyICs9IG47CkBAIC04MDYsMTMgKzc1NywxMyBAQAogCWludCByZXQ7CiAKIAkvKiBjaGVjayBpZiB0aGUgQ1BVIGhhcyBhIFBSTkcgKi8KLQlpZiAoIWNwYWNmX3F1ZXJ5KENQQUNGX0tNQywgQ1BBQ0ZfS01DX1BSTkcpKQorCWlmICghY3BhY2ZfcXVlcnlfZnVuYyhDUEFDRl9LTUMsIENQQUNGX0tNQ19QUk5HKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJLyogY2hvb3NlIHBybmcgbW9kZSAqLwogCWlmIChwcm5nX21vZGUgIT0gUFJOR19NT0RFX1RERVMpIHsKIAkJLyogY2hlY2sgZm9yIE1TQTUgc3VwcG9ydCBmb3IgUFBOTyBvcGVyYXRpb25zICovCi0JCWlmICghY3BhY2ZfcXVlcnkoQ1BBQ0ZfUFBOTywgQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19HRU4pKSB7CisJCWlmICghY3BhY2ZfcXVlcnlfZnVuYyhDUEFDRl9QUE5PLCBDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX0dFTikpIHsKIAkJCWlmIChwcm5nX21vZGUgPT0gUFJOR19NT0RFX1NIQTUxMikgewogCQkJCXByX2VycigiVGhlIHBybmcgbW9kdWxlIGNhbm5vdCAiCiAJCQkJICAgICAgICJzdGFydCBpbiBTSEEtNTEyIG1vZGVcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9zaGExX3MzOTAuYyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhMV9zMzkwLmMKaW5kZXggNWZiZjkxYi4uYzdkZTUzZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2NyeXB0by9zaGExX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTFfczM5MC5jCkBAIC05MSw3ICs5MSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNoYTFfczM5MF9pbml0KHZvaWQpCiB7Ci0JaWYgKCFjcGFjZl9xdWVyeShDUEFDRl9LSU1ELCBDUEFDRl9LSU1EX1NIQV8xKSkKKwlpZiAoIWNwYWNmX3F1ZXJ5X2Z1bmMoQ1BBQ0ZfS0lNRCwgQ1BBQ0ZfS0lNRF9TSEFfMSkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX3NoYXNoKCZhbGcpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9zaGEyNTZfczM5MC5jCmluZGV4IDEwYWFjMGIuLjUzYzI3NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhMjU2X3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTI1Nl9zMzkwLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogewogCWludCByZXQ7CiAKLQlpZiAoIWNwYWNmX3F1ZXJ5KENQQUNGX0tJTUQsIENQQUNGX0tJTURfU0hBXzI1NikpCisJaWYgKCFjcGFjZl9xdWVyeV9mdW5jKENQQUNGX0tJTUQsIENQQUNGX0tJTURfU0hBXzI1NikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfc2hhc2goJnNoYTI1Nl9hbGcpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9zaGE1MTJfczM5MC5jIGIvYXJjaC9zMzkwL2NyeXB0by9zaGE1MTJfczM5MC5jCmluZGV4IGVhODU3NTcuLjJmNGNhYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhNTEyX3MzOTAuYworKysgYi9hcmNoL3MzOTAvY3J5cHRvL3NoYTUxMl9zMzkwLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogewogCWludCByZXQ7CiAKLQlpZiAoIWNwYWNmX3F1ZXJ5KENQQUNGX0tJTUQsIENQQUNGX0tJTURfU0hBXzUxMikpCisJaWYgKCFjcGFjZl9xdWVyeV9mdW5jKENQQUNGX0tJTUQsIENQQUNGX0tJTURfU0hBXzUxMikpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAlpZiAoKHJldCA9IGNyeXB0b19yZWdpc3Rlcl9zaGFzaCgmc2hhNTEyX2FsZykpIDwgMCkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvY3J5cHRvL3NoYV9jb21tb24uYyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhX2NvbW1vbi5jCmluZGV4IDhlOTA4MTYuLmM3NDBmNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9jcnlwdG8vc2hhX2NvbW1vbi5jCisrKyBiL2FyY2gvczM5MC9jcnlwdG8vc2hhX2NvbW1vbi5jCkBAIC0yMiw4ICsyMiw3IEBACiB7CiAJc3RydWN0IHMzOTBfc2hhX2N0eCAqY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CiAJdW5zaWduZWQgaW50IGJzaXplID0gY3J5cHRvX3NoYXNoX2Jsb2Nrc2l6ZShkZXNjLT50Zm0pOwotCXVuc2lnbmVkIGludCBpbmRleDsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpbmRleCwgbjsKIAogCS8qIGhvdyBtdWNoIGlzIGFscmVhZHkgaW4gdGhlIGJ1ZmZlcj8gKi8KIAlpbmRleCA9IGN0eC0+Y291bnQgJiAoYnNpemUgLSAxKTsKQEAgLTM1LDkgKzM0LDcgQEAKIAkvKiBwcm9jZXNzIG9uZSBzdG9yZWQgYmxvY2sgKi8KIAlpZiAoaW5kZXgpIHsKIAkJbWVtY3B5KGN0eC0+YnVmICsgaW5kZXgsIGRhdGEsIGJzaXplIC0gaW5kZXgpOwotCQlyZXQgPSBjcGFjZl9raW1kKGN0eC0+ZnVuYywgY3R4LT5zdGF0ZSwgY3R4LT5idWYsIGJzaXplKTsKLQkJaWYgKHJldCAhPSBic2l6ZSkKLQkJCXJldHVybiAtRUlPOworCQljcGFjZl9raW1kKGN0eC0+ZnVuYywgY3R4LT5zdGF0ZSwgY3R4LT5idWYsIGJzaXplKTsKIAkJZGF0YSArPSBic2l6ZSAtIGluZGV4OwogCQlsZW4gLT0gYnNpemUgLSBpbmRleDsKIAkJaW5kZXggPSAwOwpAQCAtNDUsMTIgKzQyLDEwIEBACiAKIAkvKiBwcm9jZXNzIGFzIG1hbnkgYmxvY2tzIGFzIHBvc3NpYmxlICovCiAJaWYgKGxlbiA+PSBic2l6ZSkgewotCQlyZXQgPSBjcGFjZl9raW1kKGN0eC0+ZnVuYywgY3R4LT5zdGF0ZSwgZGF0YSwKLQkJCQkgbGVuICYgfihic2l6ZSAtIDEpKTsKLQkJaWYgKHJldCAhPSAobGVuICYgfihic2l6ZSAtIDEpKSkKLQkJCXJldHVybiAtRUlPOwotCQlkYXRhICs9IHJldDsKLQkJbGVuIC09IHJldDsKKwkJbiA9IGxlbiAmIH4oYnNpemUgLSAxKTsKKwkJY3BhY2Zfa2ltZChjdHgtPmZ1bmMsIGN0eC0+c3RhdGUsIGRhdGEsIG4pOworCQlkYXRhICs9IG47CisJCWxlbiAtPSBuOwogCX0KIHN0b3JlOgogCWlmIChsZW4pCkBAIC02Niw3ICs2MSw2IEBACiAJdW5zaWduZWQgaW50IGJzaXplID0gY3J5cHRvX3NoYXNoX2Jsb2Nrc2l6ZShkZXNjLT50Zm0pOwogCXU2NCBiaXRzOwogCXVuc2lnbmVkIGludCBpbmRleCwgZW5kLCBwbGVuOwotCWludCByZXQ7CiAKIAkvKiBTSEEtNTEyIHVzZXMgMTI4IGJpdCBwYWRkaW5nIGxlbmd0aCAqLwogCXBsZW4gPSAoYnNpemUgPiBTSEEyNTZfQkxPQ0tfU0laRSkgPyAxNiA6IDg7CkBAIC04OCwxMCArODIsNyBAQAogCSAqLwogCWJpdHMgPSBjdHgtPmNvdW50ICogODsKIAltZW1jcHkoY3R4LT5idWYgKyBlbmQgLSA4LCAmYml0cywgc2l6ZW9mKGJpdHMpKTsKLQotCXJldCA9IGNwYWNmX2tpbWQoY3R4LT5mdW5jLCBjdHgtPnN0YXRlLCBjdHgtPmJ1ZiwgZW5kKTsKLQlpZiAocmV0ICE9IGVuZCkKLQkJcmV0dXJuIC1FSU87CisJY3BhY2Zfa2ltZChjdHgtPmZ1bmMsIGN0eC0+c3RhdGUsIGN0eC0+YnVmLCBlbmQpOwogCiAJLyogY29weSBkaWdlc3QgdG8gb3V0ICovCiAJbWVtY3B5KG91dCwgY3R4LT5zdGF0ZSwgY3J5cHRvX3NoYXNoX2RpZ2VzdHNpemUoZGVzYy0+dGZtKSk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvZGVmY29uZmlnIGIvYXJjaC9zMzkwL2RlZmNvbmZpZwppbmRleCA3MzYxMGYyLi4yZDQwZWYwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvZGVmY29uZmlnCisrKyBiL2FyY2gvczM5MC9kZWZjb25maWcKQEAgLTE3Miw3ICsxNzIsNiBAQAogQ09ORklHX1JDVV9DUFVfU1RBTExfVElNRU9VVD02MAogQ09ORklHX1JDVV9UUkFDRT15CiBDT05GSUdfTEFURU5DWVRPUD15Ci1DT05GSUdfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1M9eQogQ09ORklHX1NDSEVEX1RSQUNFUj15CiBDT05GSUdfRlRSQUNFX1NZU0NBTExTPXkKIENPTkZJR19UUkFDRVJfU05BUFNIT1RfUEVSX0NQVV9TV0FQPXkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jcGFjZi5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NwYWNmLmgKaW5kZXggZDI4NjIxZC4uMmM2ODBkYiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NwYWNmLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NwYWNmLmgKQEAgLTI4LDY3ICsyOCw1MSBAQAogI2RlZmluZSBDUEFDRl9QUE5PCQkweGI5M2MJCS8qIE1TQTUgKi8KIAogLyoKLSAqIEZ1bmN0aW9uIGNvZGVzIGZvciB0aGUgS00gKENJUEhFUiBNRVNTQUdFKQotICogaW5zdHJ1Y3Rpb24gKDB4ODAgaXMgdGhlIGRlY2lwaGVyIG1vZGlmaWVyIGJpdCkKKyAqIERlY3J5cHRpb24gbW9kaWZpZXIgYml0CisgKi8KKyNkZWZpbmUgQ1BBQ0ZfREVDUllQVAkJMHg4MAorCisvKgorICogRnVuY3Rpb24gY29kZXMgZm9yIHRoZSBLTSAoQ0lQSEVSIE1FU1NBR0UpIGluc3RydWN0aW9uCiAgKi8KICNkZWZpbmUgQ1BBQ0ZfS01fUVVFUlkJCTB4MDAKLSNkZWZpbmUgQ1BBQ0ZfS01fREVBX0VOQwkweDAxCi0jZGVmaW5lIENQQUNGX0tNX0RFQV9ERUMJMHg4MQotI2RlZmluZSBDUEFDRl9LTV9UREVBXzEyOF9FTkMJMHgwMgotI2RlZmluZSBDUEFDRl9LTV9UREVBXzEyOF9ERUMJMHg4MgotI2RlZmluZSBDUEFDRl9LTV9UREVBXzE5Ml9FTkMJMHgwMwotI2RlZmluZSBDUEFDRl9LTV9UREVBXzE5Ml9ERUMJMHg4MwotI2RlZmluZSBDUEFDRl9LTV9BRVNfMTI4X0VOQwkweDEyCi0jZGVmaW5lIENQQUNGX0tNX0FFU18xMjhfREVDCTB4OTIKLSNkZWZpbmUgQ1BBQ0ZfS01fQUVTXzE5Ml9FTkMJMHgxMwotI2RlZmluZSBDUEFDRl9LTV9BRVNfMTkyX0RFQwkweDkzCi0jZGVmaW5lIENQQUNGX0tNX0FFU18yNTZfRU5DCTB4MTQKLSNkZWZpbmUgQ1BBQ0ZfS01fQUVTXzI1Nl9ERUMJMHg5NAotI2RlZmluZSBDUEFDRl9LTV9YVFNfMTI4X0VOQwkweDMyCi0jZGVmaW5lIENQQUNGX0tNX1hUU18xMjhfREVDCTB4YjIKLSNkZWZpbmUgQ1BBQ0ZfS01fWFRTXzI1Nl9FTkMJMHgzNAotI2RlZmluZSBDUEFDRl9LTV9YVFNfMjU2X0RFQwkweGI0CisjZGVmaW5lIENQQUNGX0tNX0RFQQkJMHgwMQorI2RlZmluZSBDUEFDRl9LTV9UREVBXzEyOAkweDAyCisjZGVmaW5lIENQQUNGX0tNX1RERUFfMTkyCTB4MDMKKyNkZWZpbmUgQ1BBQ0ZfS01fQUVTXzEyOAkweDEyCisjZGVmaW5lIENQQUNGX0tNX0FFU18xOTIJMHgxMworI2RlZmluZSBDUEFDRl9LTV9BRVNfMjU2CTB4MTQKKyNkZWZpbmUgQ1BBQ0ZfS01fWFRTXzEyOAkweDMyCisjZGVmaW5lIENQQUNGX0tNX1hUU18yNTYJMHgzNAogCiAvKgogICogRnVuY3Rpb24gY29kZXMgZm9yIHRoZSBLTUMgKENJUEhFUiBNRVNTQUdFIFdJVEggQ0hBSU5JTkcpCi0gKiBpbnN0cnVjdGlvbiAoMHg4MCBpcyB0aGUgZGVjaXBoZXIgbW9kaWZpZXIgYml0KQorICogaW5zdHJ1Y3Rpb24KICAqLwogI2RlZmluZSBDUEFDRl9LTUNfUVVFUlkJCTB4MDAKLSNkZWZpbmUgQ1BBQ0ZfS01DX0RFQV9FTkMJMHgwMQotI2RlZmluZSBDUEFDRl9LTUNfREVBX0RFQwkweDgxCi0jZGVmaW5lIENQQUNGX0tNQ19UREVBXzEyOF9FTkMJMHgwMgotI2RlZmluZSBDUEFDRl9LTUNfVERFQV8xMjhfREVDCTB4ODIKLSNkZWZpbmUgQ1BBQ0ZfS01DX1RERUFfMTkyX0VOQwkweDAzCi0jZGVmaW5lIENQQUNGX0tNQ19UREVBXzE5Ml9ERUMJMHg4MwotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzEyOF9FTkMJMHgxMgotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzEyOF9ERUMJMHg5MgotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzE5Ml9FTkMJMHgxMwotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzE5Ml9ERUMJMHg5MwotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzI1Nl9FTkMJMHgxNAotI2RlZmluZSBDUEFDRl9LTUNfQUVTXzI1Nl9ERUMJMHg5NAorI2RlZmluZSBDUEFDRl9LTUNfREVBCQkweDAxCisjZGVmaW5lIENQQUNGX0tNQ19UREVBXzEyOAkweDAyCisjZGVmaW5lIENQQUNGX0tNQ19UREVBXzE5MgkweDAzCisjZGVmaW5lIENQQUNGX0tNQ19BRVNfMTI4CTB4MTIKKyNkZWZpbmUgQ1BBQ0ZfS01DX0FFU18xOTIJMHgxMworI2RlZmluZSBDUEFDRl9LTUNfQUVTXzI1NgkweDE0CiAjZGVmaW5lIENQQUNGX0tNQ19QUk5HCQkweDQzCiAKIC8qCiAgKiBGdW5jdGlvbiBjb2RlcyBmb3IgdGhlIEtNQ1RSIChDSVBIRVIgTUVTU0FHRSBXSVRIIENPVU5URVIpCi0gKiBpbnN0cnVjdGlvbiAoMHg4MCBpcyB0aGUgZGVjaXBoZXIgbW9kaWZpZXIgYml0KQorICogaW5zdHJ1Y3Rpb24KICAqLwotI2RlZmluZSBDUEFDRl9LTUNUUl9RVUVSWQkgMHgwMAotI2RlZmluZSBDUEFDRl9LTUNUUl9ERUFfRU5DCSAweDAxCi0jZGVmaW5lIENQQUNGX0tNQ1RSX0RFQV9ERUMJIDB4ODEKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfVERFQV8xMjhfRU5DIDB4MDIKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfVERFQV8xMjhfREVDIDB4ODIKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfVERFQV8xOTJfRU5DIDB4MDMKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfVERFQV8xOTJfREVDIDB4ODMKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzEyOF9FTkMJIDB4MTIKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzEyOF9ERUMJIDB4OTIKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzE5Ml9FTkMJIDB4MTMKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzE5Ml9ERUMJIDB4OTMKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzI1Nl9FTkMJIDB4MTQKLSNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzI1Nl9ERUMJIDB4OTQKKyNkZWZpbmUgQ1BBQ0ZfS01DVFJfUVVFUlkJMHgwMAorI2RlZmluZSBDUEFDRl9LTUNUUl9ERUEJCTB4MDEKKyNkZWZpbmUgQ1BBQ0ZfS01DVFJfVERFQV8xMjgJMHgwMgorI2RlZmluZSBDUEFDRl9LTUNUUl9UREVBXzE5MgkweDAzCisjZGVmaW5lIENQQUNGX0tNQ1RSX0FFU18xMjgJMHgxMgorI2RlZmluZSBDUEFDRl9LTUNUUl9BRVNfMTkyCTB4MTMKKyNkZWZpbmUgQ1BBQ0ZfS01DVFJfQUVTXzI1NgkweDE0CiAKIC8qCiAgKiBGdW5jdGlvbiBjb2RlcyBmb3IgdGhlIEtJTUQgKENPTVBVVEUgSU5URVJNRURJQVRFIE1FU1NBR0UgRElHRVNUKQotICogaW5zdHJ1Y3Rpb24gKDB4ODAgaXMgdGhlIGRlY2lwaGVyIG1vZGlmaWVyIGJpdCkKKyAqIGluc3RydWN0aW9uCiAgKi8KICNkZWZpbmUgQ1BBQ0ZfS0lNRF9RVUVSWQkweDAwCiAjZGVmaW5lIENQQUNGX0tJTURfU0hBXzEJMHgwMQpAQCAtOTgsNyArODIsNyBAQAogCiAvKgogICogRnVuY3Rpb24gY29kZXMgZm9yIHRoZSBLTE1EIChDT01QVVRFIExBU1QgTUVTU0FHRSBESUdFU1QpCi0gKiBpbnN0cnVjdGlvbiAoMHg4MCBpcyB0aGUgZGVjaXBoZXIgbW9kaWZpZXIgYml0KQorICogaW5zdHJ1Y3Rpb24KICAqLwogI2RlZmluZSBDUEFDRl9LTE1EX1FVRVJZCTB4MDAKICNkZWZpbmUgQ1BBQ0ZfS0xNRF9TSEFfMQkweDAxCkBAIC0xMDcsNyArOTEsNyBAQAogCiAvKgogICogZnVuY3Rpb24gY29kZXMgZm9yIHRoZSBLTUFDIChDT01QVVRFIE1FU1NBR0UgQVVUSEVOVElDQVRJT04gQ09ERSkKLSAqIGluc3RydWN0aW9uICgweDgwIGlzIHRoZSBkZWNpcGhlciBtb2RpZmllciBiaXQpCisgKiBpbnN0cnVjdGlvbgogICovCiAjZGVmaW5lIENQQUNGX0tNQUNfUVVFUlkJMHgwMAogI2RlZmluZSBDUEFDRl9LTUFDX0RFQQkJMHgwMQpAQCAtMTE2LDEyICsxMDAsMTQgQEAKIAogLyoKICAqIEZ1bmN0aW9uIGNvZGVzIGZvciB0aGUgUFBOTyAoUEVSRk9STSBQU0VVRE9SQU5ET00gTlVNQkVSIE9QRVJBVElPTikKLSAqIGluc3RydWN0aW9uICgweDgwIGlzIHRoZSBkZWNpcGhlciBtb2RpZmllciBiaXQpCisgKiBpbnN0cnVjdGlvbgogICovCiAjZGVmaW5lIENQQUNGX1BQTk9fUVVFUlkJCTB4MDAKICNkZWZpbmUgQ1BBQ0ZfUFBOT19TSEE1MTJfRFJOR19HRU4JMHgwMwogI2RlZmluZSBDUEFDRl9QUE5PX1NIQTUxMl9EUk5HX1NFRUQJMHg4MwogCit0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGNoYXIgYnl0ZXNbMTZdOyB9IGNwYWNmX21hc2tfdDsKKwogLyoqCiAgKiBjcGFjZl9xdWVyeSgpIC0gY2hlY2sgaWYgYSBzcGVjaWZpYyBDUEFDRiBmdW5jdGlvbiBpcyBhdmFpbGFibGUKICAqIEBvcGNvZGU6IHRoZSBvcGNvZGUgb2YgdGhlIGNyeXB0byBpbnN0cnVjdGlvbgpAQCAtMTMyLDU1ICsxMTgsNjYgQEAKICAqCiAgKiBSZXR1cm5zIDEgaWYgQGZ1bmMgaXMgYXZhaWxhYmxlIGZvciBAb3Bjb2RlLCAwIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcGFjZl9xdWVyeSh1bnNpZ25lZCBpbnQgb3Bjb2RlLCB1bnNpZ25lZCBjaGFyICpzdGF0dXMpCitzdGF0aWMgaW5saW5lIHZvaWQgX19jcGFjZl9xdWVyeSh1bnNpZ25lZCBpbnQgb3Bjb2RlLCBjcGFjZl9tYXNrX3QgKm1hc2spCiB7Ci0JdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBjaGFyIF9bMTZdOyB9IHN0YXR1c190eXBlOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjAgYXNtKCIwIikgPSAwOwkvKiBxdWVyeSBmdW5jdGlvbiAqLwotCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjEgYXNtKCIxIikgPSAodW5zaWduZWQgbG9uZykgc3RhdHVzOworCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjEgYXNtKCIxIikgPSAodW5zaWduZWQgbG9uZykgbWFzazsKIAogCWFzbSB2b2xhdGlsZSgKIAkJIglzcG0gMFxuIiAvKiBwY2ttbyBkb2Vzbid0IGNoYW5nZSB0aGUgY2MgKi8KIAkJLyogUGFyYW1ldGVyIHJlZ2lzdGVycyBhcmUgaWdub3JlZCwgYnV0IG1heSBub3QgYmUgMCAqLwogCQkiMDoJLmluc24JcnJmLCVbb3BjXSA8PCAxNiwyLDIsMiwwXG4iCiAJCSIJYnJjCTEsMGJcbiIJLyogaGFuZGxlIHBhcnRpYWwgY29tcGxldGlvbiAqLwotCQk6ICI9bSIgKCooc3RhdHVzX3R5cGUgKikgc3RhdHVzKQorCQk6ICI9bSIgKCptYXNrKQogCQk6IFtmY10gImQiIChyMCksIFtwYmFdICJhIiAocjEpLCBbb3BjXSAiaSIgKG9wY29kZSkKIAkJOiAiY2MiKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY3BhY2ZfcXVlcnkodW5zaWduZWQgaW50IG9wY29kZSwgdW5zaWduZWQgaW50IGZ1bmMpCitzdGF0aWMgaW5saW5lIGludCBfX2NwYWNmX2NoZWNrX29wY29kZSh1bnNpZ25lZCBpbnQgb3Bjb2RlKQogewotCXVuc2lnbmVkIGNoYXIgc3RhdHVzWzE2XTsKLQogCXN3aXRjaCAob3Bjb2RlKSB7CiAJY2FzZSBDUEFDRl9LTUFDOgogCWNhc2UgQ1BBQ0ZfS006CiAJY2FzZSBDUEFDRl9LTUM6CiAJY2FzZSBDUEFDRl9LSU1EOgogCWNhc2UgQ1BBQ0ZfS0xNRDoKLQkJaWYgKCF0ZXN0X2ZhY2lsaXR5KDE3KSkJLyogY2hlY2sgZm9yIE1TQSAqLwotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOworCQlyZXR1cm4gdGVzdF9mYWNpbGl0eSgxNyk7CS8qIGNoZWNrIGZvciBNU0EgKi8KIAljYXNlIENQQUNGX1BDS01POgotCQlpZiAoIXRlc3RfZmFjaWxpdHkoNzYpKQkvKiBjaGVjayBmb3IgTVNBMyAqLwotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOworCQlyZXR1cm4gdGVzdF9mYWNpbGl0eSg3Nik7CS8qIGNoZWNrIGZvciBNU0EzICovCiAJY2FzZSBDUEFDRl9LTUY6CiAJY2FzZSBDUEFDRl9LTU86CiAJY2FzZSBDUEFDRl9QQ0M6CiAJY2FzZSBDUEFDRl9LTUNUUjoKLQkJaWYgKCF0ZXN0X2ZhY2lsaXR5KDc3KSkJLyogY2hlY2sgZm9yIE1TQTQgKi8KLQkJCXJldHVybiAwOwotCQlicmVhazsKKwkJcmV0dXJuIHRlc3RfZmFjaWxpdHkoNzcpOwkvKiBjaGVjayBmb3IgTVNBNCAqLwogCWNhc2UgQ1BBQ0ZfUFBOTzoKLQkJaWYgKCF0ZXN0X2ZhY2lsaXR5KDU3KSkJLyogY2hlY2sgZm9yIE1TQTUgKi8KLQkJCXJldHVybiAwOwotCQlicmVhazsKKwkJcmV0dXJuIHRlc3RfZmFjaWxpdHkoNTcpOwkvKiBjaGVjayBmb3IgTVNBNSAqLwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KLQlfX2NwYWNmX3F1ZXJ5KG9wY29kZSwgc3RhdHVzKTsKLQlyZXR1cm4gKHN0YXR1c1tmdW5jID4+IDNdICYgKDB4ODAgPj4gKGZ1bmMgJiA3KSkpICE9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwYWNmX3F1ZXJ5KHVuc2lnbmVkIGludCBvcGNvZGUsIGNwYWNmX21hc2tfdCAqbWFzaykKK3sKKwlpZiAoX19jcGFjZl9jaGVja19vcGNvZGUob3Bjb2RlKSkgeworCQlfX2NwYWNmX3F1ZXJ5KG9wY29kZSwgbWFzayk7CisJCXJldHVybiAxOworCX0KKwltZW1zZXQobWFzaywgMCwgc2l6ZW9mKCptYXNrKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwYWNmX3Rlc3RfZnVuYyhjcGFjZl9tYXNrX3QgKm1hc2ssIHVuc2lnbmVkIGludCBmdW5jKQoreworCXJldHVybiAobWFzay0+Ynl0ZXNbZnVuYyA+PiAzXSAmICgweDgwID4+IChmdW5jICYgNykpKSAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjcGFjZl9xdWVyeV9mdW5jKHVuc2lnbmVkIGludCBvcGNvZGUsIHVuc2lnbmVkIGludCBmdW5jKQoreworCWNwYWNmX21hc2tfdCBtYXNrOworCisJaWYgKGNwYWNmX3F1ZXJ5KG9wY29kZSwgJm1hc2spKQorCQlyZXR1cm4gY3BhY2ZfdGVzdF9mdW5jKCZtYXNrLCBmdW5jKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xOTQsNyArMTkxLDcgQEAKICAqIFJldHVybnMgMCBmb3IgdGhlIHF1ZXJ5IGZ1bmMsIG51bWJlciBvZiBwcm9jZXNzZWQgYnl0ZXMgZm9yCiAgKiBlbmNyeXB0aW9uL2RlY3J5cHRpb24gZnVuY3MKICAqLwotc3RhdGljIGlubGluZSBpbnQgY3BhY2Zfa20obG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKK3N0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2ttKHVuc2lnbmVkIGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCiAJCQkgICB1OCAqZGVzdCwgY29uc3QgdTggKnNyYywgbG9uZyBzcmNfbGVuKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjAgYXNtKCIwIikgPSAodW5zaWduZWQgbG9uZykgZnVuYzsKQEAgLTIyNCw3ICsyMjEsNyBAQAogICogUmV0dXJucyAwIGZvciB0aGUgcXVlcnkgZnVuYywgbnVtYmVyIG9mIHByb2Nlc3NlZCBieXRlcyBmb3IKICAqIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBmdW5jcwogICovCi1zdGF0aWMgaW5saW5lIGludCBjcGFjZl9rbWMobG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKK3N0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2ttYyh1bnNpZ25lZCBsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAogCQkJICAgIHU4ICpkZXN0LCBjb25zdCB1OCAqc3JjLCBsb25nIHNyY19sZW4pCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMCBhc20oIjAiKSA9ICh1bnNpZ25lZCBsb25nKSBmdW5jOwpAQCAtMjUwLDExICsyNDcsOSBAQAogICogQHBhcmFtOiBhZGRyZXNzIG9mIHBhcmFtZXRlciBibG9jazsgc2VlIFBPUCBmb3IgZGV0YWlscyBvbiBlYWNoIGZ1bmMKICAqIEBzcmM6IGFkZHJlc3Mgb2Ygc291cmNlIG1lbW9yeSBhcmVhCiAgKiBAc3JjX2xlbjogbGVuZ3RoIG9mIHNyYyBvcGVyYW5kIGluIGJ5dGVzCi0gKgotICogUmV0dXJucyAwIGZvciB0aGUgcXVlcnkgZnVuYywgbnVtYmVyIG9mIHByb2Nlc3NlZCBieXRlcyBmb3IgZGlnZXN0IGZ1bmNzCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2tpbWQobG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKLQkJCSAgICAgY29uc3QgdTggKnNyYywgbG9uZyBzcmNfbGVuKQorc3RhdGljIGlubGluZSB2b2lkIGNwYWNmX2tpbWQodW5zaWduZWQgbG9uZyBmdW5jLCB2b2lkICpwYXJhbSwKKwkJCSAgICAgIGNvbnN0IHU4ICpzcmMsIGxvbmcgc3JjX2xlbikKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIwIGFzbSgiMCIpID0gKHVuc2lnbmVkIGxvbmcpIGZ1bmM7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMSBhc20oIjEiKSA9ICh1bnNpZ25lZCBsb25nKSBwYXJhbTsKQEAgLTI2Nyw4ICsyNjIsNiBAQAogCQk6IFtzcmNdICIrYSIgKHIyKSwgW2xlbl0gIitkIiAocjMpCiAJCTogW2ZjXSAiZCIgKHIwKSwgW3BiYV0gImEiIChyMSksIFtvcGNdICJpIiAoQ1BBQ0ZfS0lNRCkKIAkJOiAiY2MiLCAibWVtb3J5Iik7Ci0KLQlyZXR1cm4gc3JjX2xlbiAtIHIzOwogfQogCiAvKioKQEAgLTI3NywxMSArMjcwLDkgQEAKICAqIEBwYXJhbTogYWRkcmVzcyBvZiBwYXJhbWV0ZXIgYmxvY2s7IHNlZSBQT1AgZm9yIGRldGFpbHMgb24gZWFjaCBmdW5jCiAgKiBAc3JjOiBhZGRyZXNzIG9mIHNvdXJjZSBtZW1vcnkgYXJlYQogICogQHNyY19sZW46IGxlbmd0aCBvZiBzcmMgb3BlcmFuZCBpbiBieXRlcwotICoKLSAqIFJldHVybnMgMCBmb3IgdGhlIHF1ZXJ5IGZ1bmMsIG51bWJlciBvZiBwcm9jZXNzZWQgYnl0ZXMgZm9yIGRpZ2VzdCBmdW5jcwogICovCi1zdGF0aWMgaW5saW5lIGludCBjcGFjZl9rbG1kKGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCi0JCQkgICAgIGNvbnN0IHU4ICpzcmMsIGxvbmcgc3JjX2xlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBjcGFjZl9rbG1kKHVuc2lnbmVkIGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sCisJCQkgICAgICBjb25zdCB1OCAqc3JjLCBsb25nIHNyY19sZW4pCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMCBhc20oIjAiKSA9ICh1bnNpZ25lZCBsb25nKSBmdW5jOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjEgYXNtKCIxIikgPSAodW5zaWduZWQgbG9uZykgcGFyYW07CkBAIC0yOTQsOCArMjg1LDYgQEAKIAkJOiBbc3JjXSAiK2EiIChyMiksIFtsZW5dICIrZCIgKHIzKQogCQk6IFtmY10gImQiIChyMCksIFtwYmFdICJhIiAocjEpLCBbb3BjXSAiaSIgKENQQUNGX0tMTUQpCiAJCTogImNjIiwgIm1lbW9yeSIpOwotCi0JcmV0dXJuIHNyY19sZW4gLSByMzsKIH0KIAogLyoqCkBAIC0zMDgsNyArMjk3LDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgZm9yIHRoZSBxdWVyeSBmdW5jLCBudW1iZXIgb2YgcHJvY2Vzc2VkIGJ5dGVzIGZvciBkaWdlc3QgZnVuY3MKICAqLwotc3RhdGljIGlubGluZSBpbnQgY3BhY2Zfa21hYyhsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAorc3RhdGljIGlubGluZSBpbnQgY3BhY2Zfa21hYyh1bnNpZ25lZCBsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAogCQkJICAgICBjb25zdCB1OCAqc3JjLCBsb25nIHNyY19sZW4pCiB7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMCBhc20oIjAiKSA9ICh1bnNpZ25lZCBsb25nKSBmdW5jOwpAQCAtMzM4LDcgKzMyNyw3IEBACiAgKiBSZXR1cm5zIDAgZm9yIHRoZSBxdWVyeSBmdW5jLCBudW1iZXIgb2YgcHJvY2Vzc2VkIGJ5dGVzIGZvcgogICogZW5jcnlwdGlvbi9kZWNyeXB0aW9uIGZ1bmNzCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNwYWNmX2ttY3RyKGxvbmcgZnVuYywgdm9pZCAqcGFyYW0sIHU4ICpkZXN0LAorc3RhdGljIGlubGluZSBpbnQgY3BhY2Zfa21jdHIodW5zaWduZWQgbG9uZyBmdW5jLCB2b2lkICpwYXJhbSwgdTggKmRlc3QsCiAJCQkgICAgICBjb25zdCB1OCAqc3JjLCBsb25nIHNyY19sZW4sIHU4ICpjb3VudGVyKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjAgYXNtKCIwIikgPSAodW5zaWduZWQgbG9uZykgZnVuYzsKQEAgLTM2OCwxMyArMzU3LDEwIEBACiAgKiBAZGVzdF9sZW46IHNpemUgb2YgZGVzdGluYXRpb24gbWVtb3J5IGFyZWEgaW4gYnl0ZXMKICAqIEBzZWVkOiBhZGRyZXNzIG9mIHNlZWQgZGF0YQogICogQHNlZWRfbGVuOiBzaXplIG9mIHNlZWQgZGF0YSBpbiBieXRlcwotICoKLSAqIFJldHVybnMgMCBmb3IgdGhlIHF1ZXJ5IGZ1bmMsIG51bWJlciBvZiByYW5kb20gYnl0ZXMgc3RvcmVkIGluCi0gKiBkZXN0IGJ1ZmZlciBmb3IgZ2VuZXJhdGUgZnVuY3Rpb24KICAqLwotc3RhdGljIGlubGluZSBpbnQgY3BhY2ZfcHBubyhsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAotCQkJICAgICB1OCAqZGVzdCwgbG9uZyBkZXN0X2xlbiwKLQkJCSAgICAgY29uc3QgdTggKnNlZWQsIGxvbmcgc2VlZF9sZW4pCitzdGF0aWMgaW5saW5lIHZvaWQgY3BhY2ZfcHBubyh1bnNpZ25lZCBsb25nIGZ1bmMsIHZvaWQgKnBhcmFtLAorCQkJICAgICAgdTggKmRlc3QsIGxvbmcgZGVzdF9sZW4sCisJCQkgICAgICBjb25zdCB1OCAqc2VlZCwgbG9uZyBzZWVkX2xlbikKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIwIGFzbSgiMCIpID0gKHVuc2lnbmVkIGxvbmcpIGZ1bmM7CiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByMSBhc20oIjEiKSA9ICh1bnNpZ25lZCBsb25nKSBwYXJhbTsKQEAgLTM5MCw4ICszNzYsNiBAQAogCQk6IFtmY10gImQiIChyMCksIFtwYmFdICJhIiAocjEpLAogCQkgIFtzZWVkXSAiYSIgKHI0KSwgW3NsZW5dICJkIiAocjUpLCBbb3BjXSAiaSIgKENQQUNGX1BQTk8pCiAJCTogImNjIiwgIm1lbW9yeSIpOwotCi0JcmV0dXJuIGRlc3RfbGVuIC0gcjM7CiB9CiAKIC8qKgpAQCAtMzk5LDEwICszODMsOCBAQAogICoJCSBpbnN0cnVjdGlvbgogICogQGZ1bmM6IHRoZSBmdW5jdGlvbiBjb2RlIHBhc3NlZCB0byBQQ0M7IHNlZSBDUEFDRl9LTV94eHggZGVmaW5lcwogICogQHBhcmFtOiBhZGRyZXNzIG9mIHBhcmFtZXRlciBibG9jazsgc2VlIFBPUCBmb3IgZGV0YWlscyBvbiBlYWNoIGZ1bmMKLSAqCi0gKiBSZXR1cm5zIDAuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNwYWNmX3BjYyhsb25nIGZ1bmMsIHZvaWQgKnBhcmFtKQorc3RhdGljIGlubGluZSB2b2lkIGNwYWNmX3BjYyh1bnNpZ25lZCBsb25nIGZ1bmMsIHZvaWQgKnBhcmFtKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjAgYXNtKCIwIikgPSAodW5zaWduZWQgbG9uZykgZnVuYzsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHIxIGFzbSgiMSIpID0gKHVuc2lnbmVkIGxvbmcpIHBhcmFtOwpAQCAtNDEzLDggKzM5NSw2IEBACiAJCToKIAkJOiBbZmNdICJkIiAocjApLCBbcGJhXSAiYSIgKHIxKSwgW29wY10gImkiIChDUEFDRl9QQ0MpCiAJCTogImNjIiwgIm1lbW9yeSIpOwotCi0JcmV0dXJuIDA7CiB9CiAKICNlbmRpZgkvKiBfQVNNX1MzOTBfQ1BBQ0ZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2ZhY2lsaXRpZXNfc3JjLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZmFjaWxpdGllc19zcmMuaAppbmRleCA0OTE3NzI4Li4zYjc1OGY2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZmFjaWxpdGllc19zcmMuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZmFjaWxpdGllc19zcmMuaApAQCAtNTUsNCArNTUsMjggQEAKIAkJCS0xIC8qIEVORCAqLwogCQl9CiAJfSwKKwl7CisJCS5uYW1lID0gIkZBQ0lMSVRJRVNfS1ZNIiwKKwkJLmJpdHMgPSAoaW50W10peworCQkJMCwgIC8qIE4zIGluc3RydWN0aW9ucyAqLworCQkJMSwgIC8qIHovQXJjaCBtb2RlIGluc3RhbGxlZCAqLworCQkJMiwgIC8qIHovQXJjaCBtb2RlIGFjdGl2ZSAqLworCQkJMywgIC8qIERBVC1lbmhhbmNlbWVudCAqLworCQkJNCwgIC8qIGlkdGUgc2VnbWVudCB0YWJsZSAqLworCQkJNSwgIC8qIGlkdGUgcmVnaW9uIHRhYmxlICovCisJCQk2LCAgLyogQVNOLWFuZC1MWCByZXVzZSAqLworCQkJNywgIC8qIHN0ZmxlICovCisJCQk4LCAgLyogZW5oYW5jZWQtREFUIDEgKi8KKwkJCTksICAvKiBzZW5zZS1ydW5uaW5nLXN0YXR1cyAqLworCQkJMTAsIC8qIGNvbmRpdGlvbmFsIHNza2UgKi8KKwkJCTEzLCAvKiBpcHRlLXJhbmdlICovCisJCQkxNCwgLyogbm9ucXVpZXNjaW5nIGtleS1zZXR0aW5nICovCisJCQk3MywgLyogdHJhbnNhY3Rpb25hbCBleGVjdXRpb24gKi8KKwkJCTc1LCAvKiBhY2Nlc3MtZXhjZXB0aW9uLWZldGNoL3N0b3JlIGluZGljYXRpb24gKi8KKwkJCTc2LCAvKiBtc2EgZXh0ZW5zaW9uIDMgKi8KKwkJCTc3LCAvKiBtc2EgZXh0ZW5zaW9uIDQgKi8KKwkJCTc4LCAvKiBlbmhhbmNlZC1EQVQgMiAqLworCQkJLTEgIC8qIEVORCAqLworCQl9CisJfSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZnB1L2FwaS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2ZwdS9hcGkuaAppbmRleCA2YWJhNmZjLi4wMjEyNGQ2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZnB1L2FwaS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9mcHUvYXBpLmgKQEAgLTY0LDE4ICs2NCwxOCBAQAogCXJldHVybiByYzsKIH0KIAotI2RlZmluZSBLRVJORUxfVlhSX1YwVjcJCTEKLSNkZWZpbmUgS0VSTkVMX1ZYUl9WOFYxNQkyCi0jZGVmaW5lIEtFUk5FTF9WWFJfVjE2VjIzCTQKLSNkZWZpbmUgS0VSTkVMX1ZYUl9WMjRWMzEJOAotI2RlZmluZSBLRVJORUxfRlBSCQkxNgotI2RlZmluZSBLRVJORUxfRlBDCQkyNTYKKyNkZWZpbmUgS0VSTkVMX0ZQQwkJMQorI2RlZmluZSBLRVJORUxfVlhSX1YwVjcJCTIKKyNkZWZpbmUgS0VSTkVMX1ZYUl9WOFYxNQk0CisjZGVmaW5lIEtFUk5FTF9WWFJfVjE2VjIzCTgKKyNkZWZpbmUgS0VSTkVMX1ZYUl9WMjRWMzEJMTYKIAogI2RlZmluZSBLRVJORUxfVlhSX0xPVwkJKEtFUk5FTF9WWFJfVjBWN3xLRVJORUxfVlhSX1Y4VjE1KQogI2RlZmluZSBLRVJORUxfVlhSX01JRAkJKEtFUk5FTF9WWFJfVjhWMTV8S0VSTkVMX1ZYUl9WMTZWMjMpCiAjZGVmaW5lIEtFUk5FTF9WWFJfSElHSAkJKEtFUk5FTF9WWFJfVjE2VjIzfEtFUk5FTF9WWFJfVjI0VjMxKQogCi0jZGVmaW5lIEtFUk5FTF9GUFVfTUFTSwkJKEtFUk5FTF9WWFJfTE9XfEtFUk5FTF9WWFJfSElHSHxLRVJORUxfRlBSKQorI2RlZmluZSBLRVJORUxfVlhSCQkoS0VSTkVMX1ZYUl9MT1d8S0VSTkVMX1ZYUl9ISUdIKQorI2RlZmluZSBLRVJORUxfRlBSCQkoS0VSTkVMX0ZQQ3xLRVJORUxfVlhSX1YwVjcpCiAKIHN0cnVjdCBrZXJuZWxfZnB1OwogCkBAIC04NywxOCArODcsMjggQEAKICAqIFByZWZlciB1c2luZyB0aGUga2VybmVsX2ZwdV9iZWdpbigpL2tlcm5lbF9mcHVfZW5kKCkgcGFpciBvZiBmdW5jdGlvbnMuCiAgKi8KIHZvaWQgX19rZXJuZWxfZnB1X2JlZ2luKHN0cnVjdCBrZXJuZWxfZnB1ICpzdGF0ZSwgdTMyIGZsYWdzKTsKLXZvaWQgX19rZXJuZWxfZnB1X2VuZChzdHJ1Y3Qga2VybmVsX2ZwdSAqc3RhdGUpOwordm9pZCBfX2tlcm5lbF9mcHVfZW5kKHN0cnVjdCBrZXJuZWxfZnB1ICpzdGF0ZSwgdTMyIGZsYWdzKTsKIAogCiBzdGF0aWMgaW5saW5lIHZvaWQga2VybmVsX2ZwdV9iZWdpbihzdHJ1Y3Qga2VybmVsX2ZwdSAqc3RhdGUsIHUzMiBmbGFncykKIHsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQlfX2tlcm5lbF9mcHVfYmVnaW4oc3RhdGUsIGZsYWdzKTsKKwlzdGF0ZS0+bWFzayA9IFMzOTBfbG93Y29yZS5mcHVfZmxhZ3M7CisJaWYgKCF0ZXN0X2NwdV9mbGFnKENJRl9GUFUpKQorCQkvKiBTYXZlIHVzZXIgc3BhY2UgRlBVIHN0YXRlIGFuZCByZWdpc3RlciBjb250ZW50cyAqLworCQlzYXZlX2ZwdV9yZWdzKCk7CisJZWxzZSBpZiAoc3RhdGUtPm1hc2sgJiBmbGFncykKKwkJLyogU2F2ZSBGUFUvdmVjdG9yIHJlZ2lzdGVyIGluLXVzZSBieSB0aGUga2VybmVsICovCisJCV9fa2VybmVsX2ZwdV9iZWdpbihzdGF0ZSwgZmxhZ3MpOworCVMzOTBfbG93Y29yZS5mcHVfZmxhZ3MgfD0gZmxhZ3M7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBrZXJuZWxfZnB1X2VuZChzdHJ1Y3Qga2VybmVsX2ZwdSAqc3RhdGUpCitzdGF0aWMgaW5saW5lIHZvaWQga2VybmVsX2ZwdV9lbmQoc3RydWN0IGtlcm5lbF9mcHUgKnN0YXRlLCB1MzIgZmxhZ3MpCiB7Ci0JX19rZXJuZWxfZnB1X2VuZChzdGF0ZSk7CisJUzM5MF9sb3djb3JlLmZwdV9mbGFncyA9IHN0YXRlLT5tYXNrOworCWlmIChzdGF0ZS0+bWFzayAmIGZsYWdzKQorCQkvKiBSZXN0b3JlIEZQVS92ZWN0b3IgcmVnaXN0ZXIgaW4tdXNlIGJ5IHRoZSBrZXJuZWwgKi8KKwkJX19rZXJuZWxfZnB1X2VuZChzdGF0ZSwgZmxhZ3MpOwogCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggOGU1ZGFmNy4uYTQxZmFmMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2RlZmluZSBLVk1fUzM5MF9CU0NBX0NQVV9TTE9UUyA2NAogI2RlZmluZSBLVk1fUzM5MF9FU0NBX0NQVV9TTE9UUyAyNDgKLSNkZWZpbmUgS1ZNX01BWF9WQ1BVUyBLVk1fUzM5MF9FU0NBX0NQVV9TTE9UUworI2RlZmluZSBLVk1fTUFYX1ZDUFVTIDI1NQogI2RlZmluZSBLVk1fVVNFUl9NRU1fU0xPVFMgMzIKIAogLyoKQEAgLTI0NSw3MiArMjQ1LDcyIEBACiB9IF9fcGFja2VkOwogCiBzdHJ1Y3Qga3ZtX3ZjcHVfc3RhdCB7Ci0JdTMyIGV4aXRfdXNlcnNwYWNlOwotCXUzMiBleGl0X251bGw7Ci0JdTMyIGV4aXRfZXh0ZXJuYWxfcmVxdWVzdDsKLQl1MzIgZXhpdF9leHRlcm5hbF9pbnRlcnJ1cHQ7Ci0JdTMyIGV4aXRfc3RvcF9yZXF1ZXN0OwotCXUzMiBleGl0X3ZhbGlkaXR5OwotCXUzMiBleGl0X2luc3RydWN0aW9uOwotCXUzMiBleGl0X3BlaTsKLQl1MzIgaGFsdF9zdWNjZXNzZnVsX3BvbGw7Ci0JdTMyIGhhbHRfYXR0ZW1wdGVkX3BvbGw7Ci0JdTMyIGhhbHRfcG9sbF9pbnZhbGlkOwotCXUzMiBoYWx0X3dha2V1cDsKLQl1MzIgaW5zdHJ1Y3Rpb25fbGN0bDsKLQl1MzIgaW5zdHJ1Y3Rpb25fbGN0bGc7Ci0JdTMyIGluc3RydWN0aW9uX3N0Y3RsOwotCXUzMiBpbnN0cnVjdGlvbl9zdGN0ZzsKLQl1MzIgZXhpdF9wcm9ncmFtX2ludGVycnVwdGlvbjsKLQl1MzIgZXhpdF9pbnN0cl9hbmRfcHJvZ3JhbTsKLQl1MzIgZXhpdF9vcGVyYXRpb25fZXhjZXB0aW9uOwotCXUzMiBkZWxpdmVyX2V4dGVybmFsX2NhbGw7Ci0JdTMyIGRlbGl2ZXJfZW1lcmdlbmN5X3NpZ25hbDsKLQl1MzIgZGVsaXZlcl9zZXJ2aWNlX3NpZ25hbDsKLQl1MzIgZGVsaXZlcl92aXJ0aW9faW50ZXJydXB0OwotCXUzMiBkZWxpdmVyX3N0b3Bfc2lnbmFsOwotCXUzMiBkZWxpdmVyX3ByZWZpeF9zaWduYWw7Ci0JdTMyIGRlbGl2ZXJfcmVzdGFydF9zaWduYWw7Ci0JdTMyIGRlbGl2ZXJfcHJvZ3JhbV9pbnQ7Ci0JdTMyIGRlbGl2ZXJfaW9faW50OwotCXUzMiBleGl0X3dhaXRfc3RhdGU7Ci0JdTMyIGluc3RydWN0aW9uX3BmbWY7Ci0JdTMyIGluc3RydWN0aW9uX3N0aWRwOwotCXUzMiBpbnN0cnVjdGlvbl9zcHg7Ci0JdTMyIGluc3RydWN0aW9uX3N0cHg7Ci0JdTMyIGluc3RydWN0aW9uX3N0YXA7Ci0JdTMyIGluc3RydWN0aW9uX3N0b3JhZ2Vfa2V5OwotCXUzMiBpbnN0cnVjdGlvbl9pcHRlX2ludGVybG9jazsKLQl1MzIgaW5zdHJ1Y3Rpb25fc3RzY2g7Ci0JdTMyIGluc3RydWN0aW9uX2Noc2M7Ci0JdTMyIGluc3RydWN0aW9uX3N0c2k7Ci0JdTMyIGluc3RydWN0aW9uX3N0Zmw7Ci0JdTMyIGluc3RydWN0aW9uX3Rwcm90OwotCXUzMiBpbnN0cnVjdGlvbl9zaWU7Ci0JdTMyIGluc3RydWN0aW9uX2Vzc2E7Ci0JdTMyIGluc3RydWN0aW9uX3N0aHlpOwotCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3NlbnNlOwotCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3NlbnNlX3J1bm5pbmc7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3BfZXh0ZXJuYWxfY2FsbDsKLQl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9lbWVyZ2VuY3k7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3BfY29uZF9lbWVyZ2VuY3k7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3Bfc3RhcnQ7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3Bfc3RvcDsKLQl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9zdG9wX3N0b3JlX3N0YXR1czsKLQl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9zdG9yZV9zdGF0dXM7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3Bfc3RvcmVfYWR0bF9zdGF0dXM7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3BfYXJjaDsKLQl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9wcmVmaXg7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3BfcmVzdGFydDsKLQl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9pbml0X2NwdV9yZXNldDsKLQl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9jcHVfcmVzZXQ7Ci0JdTMyIGluc3RydWN0aW9uX3NpZ3BfdW5rbm93bjsKLQl1MzIgZGlhZ25vc2VfMTA7Ci0JdTMyIGRpYWdub3NlXzQ0OwotCXUzMiBkaWFnbm9zZV85YzsKLQl1MzIgZGlhZ25vc2VfMjU4OwotCXUzMiBkaWFnbm9zZV8zMDg7Ci0JdTMyIGRpYWdub3NlXzUwMDsKKwl1NjQgZXhpdF91c2Vyc3BhY2U7CisJdTY0IGV4aXRfbnVsbDsKKwl1NjQgZXhpdF9leHRlcm5hbF9yZXF1ZXN0OworCXU2NCBleGl0X2V4dGVybmFsX2ludGVycnVwdDsKKwl1NjQgZXhpdF9zdG9wX3JlcXVlc3Q7CisJdTY0IGV4aXRfdmFsaWRpdHk7CisJdTY0IGV4aXRfaW5zdHJ1Y3Rpb247CisJdTY0IGV4aXRfcGVpOworCXU2NCBoYWx0X3N1Y2Nlc3NmdWxfcG9sbDsKKwl1NjQgaGFsdF9hdHRlbXB0ZWRfcG9sbDsKKwl1NjQgaGFsdF9wb2xsX2ludmFsaWQ7CisJdTY0IGhhbHRfd2FrZXVwOworCXU2NCBpbnN0cnVjdGlvbl9sY3RsOworCXU2NCBpbnN0cnVjdGlvbl9sY3RsZzsKKwl1NjQgaW5zdHJ1Y3Rpb25fc3RjdGw7CisJdTY0IGluc3RydWN0aW9uX3N0Y3RnOworCXU2NCBleGl0X3Byb2dyYW1faW50ZXJydXB0aW9uOworCXU2NCBleGl0X2luc3RyX2FuZF9wcm9ncmFtOworCXU2NCBleGl0X29wZXJhdGlvbl9leGNlcHRpb247CisJdTY0IGRlbGl2ZXJfZXh0ZXJuYWxfY2FsbDsKKwl1NjQgZGVsaXZlcl9lbWVyZ2VuY3lfc2lnbmFsOworCXU2NCBkZWxpdmVyX3NlcnZpY2Vfc2lnbmFsOworCXU2NCBkZWxpdmVyX3ZpcnRpb19pbnRlcnJ1cHQ7CisJdTY0IGRlbGl2ZXJfc3RvcF9zaWduYWw7CisJdTY0IGRlbGl2ZXJfcHJlZml4X3NpZ25hbDsKKwl1NjQgZGVsaXZlcl9yZXN0YXJ0X3NpZ25hbDsKKwl1NjQgZGVsaXZlcl9wcm9ncmFtX2ludDsKKwl1NjQgZGVsaXZlcl9pb19pbnQ7CisJdTY0IGV4aXRfd2FpdF9zdGF0ZTsKKwl1NjQgaW5zdHJ1Y3Rpb25fcGZtZjsKKwl1NjQgaW5zdHJ1Y3Rpb25fc3RpZHA7CisJdTY0IGluc3RydWN0aW9uX3NweDsKKwl1NjQgaW5zdHJ1Y3Rpb25fc3RweDsKKwl1NjQgaW5zdHJ1Y3Rpb25fc3RhcDsKKwl1NjQgaW5zdHJ1Y3Rpb25fc3RvcmFnZV9rZXk7CisJdTY0IGluc3RydWN0aW9uX2lwdGVfaW50ZXJsb2NrOworCXU2NCBpbnN0cnVjdGlvbl9zdHNjaDsKKwl1NjQgaW5zdHJ1Y3Rpb25fY2hzYzsKKwl1NjQgaW5zdHJ1Y3Rpb25fc3RzaTsKKwl1NjQgaW5zdHJ1Y3Rpb25fc3RmbDsKKwl1NjQgaW5zdHJ1Y3Rpb25fdHByb3Q7CisJdTY0IGluc3RydWN0aW9uX3NpZTsKKwl1NjQgaW5zdHJ1Y3Rpb25fZXNzYTsKKwl1NjQgaW5zdHJ1Y3Rpb25fc3RoeWk7CisJdTY0IGluc3RydWN0aW9uX3NpZ3Bfc2Vuc2U7CisJdTY0IGluc3RydWN0aW9uX3NpZ3Bfc2Vuc2VfcnVubmluZzsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9leHRlcm5hbF9jYWxsOworCXU2NCBpbnN0cnVjdGlvbl9zaWdwX2VtZXJnZW5jeTsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9jb25kX2VtZXJnZW5jeTsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9zdGFydDsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9zdG9wOworCXU2NCBpbnN0cnVjdGlvbl9zaWdwX3N0b3Bfc3RvcmVfc3RhdHVzOworCXU2NCBpbnN0cnVjdGlvbl9zaWdwX3N0b3JlX3N0YXR1czsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9zdG9yZV9hZHRsX3N0YXR1czsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9hcmNoOworCXU2NCBpbnN0cnVjdGlvbl9zaWdwX3ByZWZpeDsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF9yZXN0YXJ0OworCXU2NCBpbnN0cnVjdGlvbl9zaWdwX2luaXRfY3B1X3Jlc2V0OworCXU2NCBpbnN0cnVjdGlvbl9zaWdwX2NwdV9yZXNldDsKKwl1NjQgaW5zdHJ1Y3Rpb25fc2lncF91bmtub3duOworCXU2NCBkaWFnbm9zZV8xMDsKKwl1NjQgZGlhZ25vc2VfNDQ7CisJdTY0IGRpYWdub3NlXzljOworCXU2NCBkaWFnbm9zZV8yNTg7CisJdTY0IGRpYWdub3NlXzMwODsKKwl1NjQgZGlhZ25vc2VfNTAwOwogfTsKIAogI2RlZmluZSBQR01fT1BFUkFUSU9OCQkJMHgwMQpAQCAtNTc3LDcgKzU3Nyw3IEBACiB9OwogCiBzdHJ1Y3Qga3ZtX3ZtX3N0YXQgewotCXUzMiByZW1vdGVfdGxiX2ZsdXNoOworCXVsb25nIHJlbW90ZV90bGJfZmx1c2g7CiB9OwogCiBzdHJ1Y3Qga3ZtX2FyY2hfbWVtb3J5X3Nsb3QgewpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmgKaW5kZXggZDc5YmE3Yy4uN2I5M2I3OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oCkBAIC0xMjksNyArMTI5LDggQEAKIAlfX3U4CXBhZF8weDAzOTBbMHgwMzk4LTB4MDM5MF07CS8qIDB4MDM5MCAqLwogCV9fdTY0CWdtYXA7CQkJCS8qIDB4MDM5OCAqLwogCV9fdTMyCXNwaW5sb2NrX2xvY2t2YWw7CQkvKiAweDAzYTAgKi8KLQlfX3U4CXBhZF8weDAzYTBbMHgwNDAwLTB4MDNhNF07CS8qIDB4MDNhNCAqLworCV9fdTMyCWZwdV9mbGFnczsJCQkvKiAweDAzYTQgKi8KKwlfX3U4CXBhZF8weDAzYThbMHgwNDAwLTB4MDNhOF07CS8qIDB4MDNhOCAqLwogCiAJLyogUGVyIGNwdSBwcmltYXJ5IHNwYWNlIGFjY2VzcyBsaXN0ICovCiAJX191MzIJcGFzdGVbMTZdOwkJCS8qIDB4MDQwMCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdS5oCmluZGV4IDZkMzkzMjkuLmJlYTc4NWQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbXUuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11LmgKQEAgLTEyLDYgKzEyLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBndGFibGVfbGlzdDsKIAlzcGlubG9ja190IGdtYXBfbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGdtYXBfbGlzdDsKKwl1bnNpZ25lZCBsb25nIGdtYXBfYXNjZTsKIAl1bnNpZ25lZCBsb25nIGFzY2U7CiAJdW5zaWduZWQgbG9uZyBhc2NlX2xpbWl0OwogCXVuc2lnbmVkIGxvbmcgdmRzb19iYXNlOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAppbmRleCBjNmEwODhjLi41MTVmZWE1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtMjEsNiArMjEsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZtbS0+Y29udGV4dC5nbWFwX2xpc3QpOwogCWNwdW1hc2tfY2xlYXIoJm1tLT5jb250ZXh0LmNwdV9hdHRhY2hfbWFzayk7CiAJYXRvbWljX3NldCgmbW0tPmNvbnRleHQuZmx1c2hfY291bnQsIDApOworCW1tLT5jb250ZXh0LmdtYXBfYXNjZSA9IDA7CiAJbW0tPmNvbnRleHQuZmx1c2hfbW0gPSAwOwogI2lmZGVmIENPTkZJR19QR1NURQogCW1tLT5jb250ZXh0LmFsbG9jX3Bnc3RlID0gcGFnZV90YWJsZV9hbGxvY2F0ZV9wZ3N0ZTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wY2kuaAppbmRleCAwZGE5MWM0Li42NjExZjc5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGNpLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BjaS5oCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL3BjaV9jbHAuaD4KICNpbmNsdWRlIDxhc20vcGNpX2RlYnVnLmg+CisjaW5jbHVkZSA8YXNtL3NjbHAuaD4KIAogI2RlZmluZSBQQ0lCSU9TX01JTl9JTwkJMHgxMDAwCiAjZGVmaW5lIFBDSUJJT1NfTUlOX01FTQkJMHgxMDAwMDAwMApAQCAtMTE3LDYgKzExOCw3IEBACiAKIAlzcGlubG9ja190CWlvbW11X2JpdG1hcF9sb2NrOwogCXVuc2lnbmVkIGxvbmcJKmlvbW11X2JpdG1hcDsKKwl1bnNpZ25lZCBsb25nCSpsYXp5X2JpdG1hcDsKIAl1bnNpZ25lZCBsb25nCWlvbW11X3NpemU7CiAJdW5zaWduZWQgbG9uZwlpb21tdV9wYWdlczsKIAl1bnNpZ25lZCBpbnQJbmV4dF9iaXQ7CkBAIC0yMTYsNiArMjE4LDkgQEAKIHZvaWQgenBjaV9kZWJ1Z19leGl0X2RldmljZShzdHJ1Y3QgenBjaV9kZXYgKik7CiB2b2lkIHpwY2lfZGVidWdfaW5mbyhzdHJ1Y3QgenBjaV9kZXYgKiwgc3RydWN0IHNlcV9maWxlICopOwogCisvKiBFcnJvciByZXBvcnRpbmcgKi8KK2ludCB6cGNpX3JlcG9ydF9lcnJvcihzdHJ1Y3QgcGNpX2RldiAqLCBzdHJ1Y3QgenBjaV9yZXBvcnRfZXJyb3JfaGVhZGVyICopOworCiAjaWZkZWYgQ09ORklHX05VTUEKIAogLyogUmV0dXJucyB0aGUgbm9kZSBiYXNlZCBvbiBQQ0kgYnVzICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCA3MmM3ZjYwLi4wMzYyY2Q1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTg3NCwzNSArODc0LDMxIEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB2b2lkIF9fcHRlcF9pcHRlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnB0ZXApCisjZGVmaW5lIElQVEVfR0xPQkFMCTAKKyNkZWZpbmUJSVBURV9MT0NBTAkxCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfaXB0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBwdG8gPSAodW5zaWduZWQgbG9uZykgcHRlcDsKIAotCS8qIEludmFsaWRhdGlvbiArIGdsb2JhbCBUTEIgZmx1c2ggZm9yIHRoZSBwdGUgKi8KKwkvKiBJbnZhbGlkYXRpb24gKyBUTEIgZmx1c2ggZm9yIHRoZSBwdGUgKi8KIAlhc20gdm9sYXRpbGUoCi0JCSIJaXB0ZQklMiwlMyIKLQkJOiAiPW0iICgqcHRlcCkgOiAibSIgKCpwdGVwKSwgImEiIChwdG8pLCAiYSIgKGFkZHJlc3MpKTsKKwkJIiAgICAgICAuaW5zbiBycmYsMHhiMjIxMDAwMCwlW3IxXSwlW3IyXSwwLCVbbTRdIgorCQk6ICIrbSIgKCpwdGVwKSA6IFtyMV0gImEiIChwdG8pLCBbcjJdICJhIiAoYWRkcmVzcyksCisJCSAgW200XSAiaSIgKGxvY2FsKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3B0ZXBfaXB0ZV9sb2NhbCh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwdGVwKQorc3RhdGljIGlubGluZSB2b2lkIF9fcHRlcF9pcHRlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IG5yLAorCQkJCSAgICAgcHRlX3QgKnB0ZXAsIGludCBsb2NhbCkKIHsKIAl1bnNpZ25lZCBsb25nIHB0byA9ICh1bnNpZ25lZCBsb25nKSBwdGVwOwogCi0JLyogSW52YWxpZGF0aW9uICsgbG9jYWwgVExCIGZsdXNoIGZvciB0aGUgcHRlICovCi0JYXNtIHZvbGF0aWxlKAotCQkiCS5pbnNuIHJyZiwweGIyMjEwMDAwLCUyLCUzLDAsMSIKLQkJOiAiPW0iICgqcHRlcCkgOiAibSIgKCpwdGVwKSwgImEiIChwdG8pLCAiYSIgKGFkZHJlc3MpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fcHRlcF9pcHRlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IG5yLCBwdGVfdCAqcHRlcCkKLXsKLQl1bnNpZ25lZCBsb25nIHB0byA9ICh1bnNpZ25lZCBsb25nKSBwdGVwOwotCi0JLyogSW52YWxpZGF0ZSBhIHJhbmdlIG9mIHB0ZXMgKyBnbG9iYWwgVExCIGZsdXNoIG9mIHRoZSBwdGVzICovCisJLyogSW52YWxpZGF0ZSBhIHJhbmdlIG9mIHB0ZXMgKyBUTEIgZmx1c2ggb2YgdGhlIHB0ZXMgKi8KIAlkbyB7CiAJCWFzbSB2b2xhdGlsZSgKLQkJCSIJLmluc24gcnJmLDB4YjIyMTAwMDAsJTIsJTAsJTEsMCIKLQkJCTogIithIiAoYWRkcmVzcyksICIrYSIgKG5yKSA6ICJhIiAocHRvKSA6ICJtZW1vcnkiKTsKKwkJCSIgICAgICAgLmluc24gcnJmLDB4YjIyMTAwMDAsJVtyMV0sJVtyMl0sJVtyM10sJVttNF0iCisJCQk6IFtyMl0gIithIiAoYWRkcmVzcyksIFtyM10gIithIiAobnIpCisJCQk6IFtyMV0gImEiIChwdG8pLCBbbTRdICJpIiAobG9jYWwpIDogIm1lbW9yeSIpOwogCX0gd2hpbGUgKG5yICE9IDI1NSk7CiB9CiAKQEAgLTEyMzksNTMgKzEyMzUsMzMgQEAKIAkgICAgcG1kX3ZhbCgqcG1kcCkgfCBfU0VHTUVOVF9FTlRSWV9JTlZBTElEKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9fcG1kcF9pZHRlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcG1kX3QgKnBtZHApCisjZGVmaW5lIElEVEVfR0xPQkFMCTAKKyNkZWZpbmUgSURURV9MT0NBTAkxCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3BtZHBfaWR0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHBtZF90ICpwbWRwLCBpbnQgbG9jYWwpCiB7CiAJdW5zaWduZWQgbG9uZyBzdG87CiAKIAlzdG8gPSAodW5zaWduZWQgbG9uZykgcG1kcCAtIHBtZF9pbmRleChhZGRyZXNzKSAqIHNpemVvZihwbWRfdCk7CiAJYXNtIHZvbGF0aWxlKAotCQkiCS5pbnNuCXJyZiwweGI5OGUwMDAwLCUyLCUzLDAsMCIKLQkJOiAiPW0iICgqcG1kcCkKLQkJOiAibSIgKCpwbWRwKSwgImEiIChzdG8pLCAiYSIgKChhZGRyZXNzICYgSFBBR0VfTUFTSykpCisJCSIJLmluc24JcnJmLDB4Yjk4ZTAwMDAsJVtyMV0sJVtyMl0sMCwlW200XSIKKwkJOiAiK20iICgqcG1kcCkKKwkJOiBbcjFdICJhIiAoc3RvKSwgW3IyXSAiYSIgKChhZGRyZXNzICYgSFBBR0VfTUFTSykpLAorCQkgIFttNF0gImkiIChsb2NhbCkKIAkJOiAiY2MiICk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3B1ZHBfaWR0ZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB1ZF90ICpwdWRwKQorc3RhdGljIGlubGluZSB2b2lkIF9fcHVkcF9pZHRlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHVkX3QgKnB1ZHAsIGludCBsb2NhbCkKIHsKIAl1bnNpZ25lZCBsb25nIHIzbzsKIAogCXIzbyA9ICh1bnNpZ25lZCBsb25nKSBwdWRwIC0gcHVkX2luZGV4KGFkZHJlc3MpICogc2l6ZW9mKHB1ZF90KTsKIAlyM28gfD0gX0FTQ0VfVFlQRV9SRUdJT04zOwogCWFzbSB2b2xhdGlsZSgKLQkJIgkuaW5zbglycmYsMHhiOThlMDAwMCwlMiwlMywwLDAiCi0JCTogIj1tIiAoKnB1ZHApCi0JCTogIm0iICgqcHVkcCksICJhIiAocjNvKSwgImEiICgoYWRkcmVzcyAmIFBVRF9NQVNLKSkKLQkJOiAiY2MiKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fcG1kcF9pZHRlX2xvY2FsKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcG1kX3QgKnBtZHApCi17Ci0JdW5zaWduZWQgbG9uZyBzdG87Ci0KLQlzdG8gPSAodW5zaWduZWQgbG9uZykgcG1kcCAtIHBtZF9pbmRleChhZGRyZXNzKSAqIHNpemVvZihwbWRfdCk7Ci0JYXNtIHZvbGF0aWxlKAotCQkiCS5pbnNuCXJyZiwweGI5OGUwMDAwLCUyLCUzLDAsMSIKLQkJOiAiPW0iICgqcG1kcCkKLQkJOiAibSIgKCpwbWRwKSwgImEiIChzdG8pLCAiYSIgKChhZGRyZXNzICYgSFBBR0VfTUFTSykpCi0JCTogImNjIiApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19wdWRwX2lkdGVfbG9jYWwodW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdWRfdCAqcHVkcCkKLXsKLQl1bnNpZ25lZCBsb25nIHIzbzsKLQotCXIzbyA9ICh1bnNpZ25lZCBsb25nKSBwdWRwIC0gcHVkX2luZGV4KGFkZHJlc3MpICogc2l6ZW9mKHB1ZF90KTsKLQlyM28gfD0gX0FTQ0VfVFlQRV9SRUdJT04zOwotCWFzbSB2b2xhdGlsZSgKLQkJIgkuaW5zbglycmYsMHhiOThlMDAwMCwlMiwlMywwLDEiCi0JCTogIj1tIiAoKnB1ZHApCi0JCTogIm0iICgqcHVkcCksICJhIiAocjNvKSwgImEiICgoYWRkcmVzcyAmIFBVRF9NQVNLKSkKKwkJIgkuaW5zbglycmYsMHhiOThlMDAwMCwlW3IxXSwlW3IyXSwwLCVbbTRdIgorCQk6ICIrbSIgKCpwdWRwKQorCQk6IFtyMV0gImEiIChyM28pLCBbcjJdICJhIiAoKGFkZHJlc3MgJiBQVURfTUFTSykpLAorCQkgIFttNF0gImkiIChsb2NhbCkKIAkJOiAiY2MiKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGxiZmx1c2guaAppbmRleCAxYTY5MWVmLi4zOTg0NjEwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGxiZmx1c2guaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGxiZmx1c2guaApAQCAtMjYsMTcgKzI2LDYgQEAKIAkJOiA6ICJhIiAoMjA0OCksICJhIiAoYXNjZSkgOiAiY2MiKTsKIH0KIAotLyoKLSAqIEZsdXNoIFRMQiBlbnRyaWVzIGZvciBhIHNwZWNpZmljIEFTQ0Ugb24gdGhlIGxvY2FsIENQVQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX190bGJfZmx1c2hfaWR0ZV9sb2NhbCh1bnNpZ25lZCBsb25nIGFzY2UpCi17Ci0JLyogTG9jYWwgVExCIGZsdXNoIGZvciB0aGUgbW0gKi8KLQlhc20gdm9sYXRpbGUoCi0JCSIJLmluc24JcnJmLDB4Yjk4ZTAwMDAsMCwlMCwlMSwxIgotCQk6IDogImEiICgyMDQ4KSwgImEiIChhc2NlKSA6ICJjYyIpOwotfQotCiAjaWZkZWYgQ09ORklHX1NNUAogdm9pZCBzbXBfcHRsYl9hbGwodm9pZCk7CiAKQEAgLTY1LDM1ICs1NCwzMyBAQAogCQkvKiBHbG9iYWwgVExCIGZsdXNoICovCiAJCV9fdGxiX2ZsdXNoX2dsb2JhbCgpOwogCQkvKiBSZXNldCBUTEIgZmx1c2ggbWFzayAqLwotCQlpZiAoTUFDSElORV9IQVNfVExCX0xDKQotCQkJY3B1bWFza19jb3B5KG1tX2NwdW1hc2sobW0pLAotCQkJCSAgICAgJm1tLT5jb250ZXh0LmNwdV9hdHRhY2hfbWFzayk7CisJCWNwdW1hc2tfY29weShtbV9jcHVtYXNrKG1tKSwgJm1tLT5jb250ZXh0LmNwdV9hdHRhY2hfbWFzayk7CiAJfQogCWF0b21pY19kZWMoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50KTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi0vKgotICogRmx1c2ggVExCIGVudHJpZXMgZm9yIGEgc3BlY2lmaWMgQVNDRSBvbiBhbGwgQ1BVcy4gU2hvdWxkIG5ldmVyIGJlIHVzZWQKLSAqIHdoZW4gbW9yZSB0aGFuIG9uZSBhc2NlIChlLmcuIGdtYXApIHJhbiBvbiB0aGlzIG1tLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX190bGJfZmx1c2hfYXNjZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhc2NlKQorc3RhdGljIGlubGluZSB2b2lkIF9fdGxiX2ZsdXNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogeworCXVuc2lnbmVkIGxvbmcgZ21hcF9hc2NlOworCisJLyoKKwkgKiBJZiB0aGUgbWFjaGluZSBoYXMgSURURSB3ZSBwcmVmZXIgdG8gZG8gYSBwZXIgbW0gZmx1c2gKKwkgKiBvbiBhbGwgY3B1cyBpbnN0ZWFkIG9mIGRvaW5nIGEgbG9jYWwgZmx1c2ggaWYgdGhlIG1tCisJICogb25seSByYW4gb24gdGhlIGxvY2FsIGNwdS4KKwkgKi8KIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlhdG9taWNfaW5jKCZtbS0+Y29udGV4dC5mbHVzaF9jb3VudCk7Ci0JaWYgKE1BQ0hJTkVfSEFTX1RMQl9MQyAmJgotCSAgICBjcHVtYXNrX2VxdWFsKG1tX2NwdW1hc2sobW0pLCBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSkpKSB7Ci0JCV9fdGxiX2ZsdXNoX2lkdGVfbG9jYWwoYXNjZSk7CisJZ21hcF9hc2NlID0gUkVBRF9PTkNFKG1tLT5jb250ZXh0LmdtYXBfYXNjZSk7CisJaWYgKE1BQ0hJTkVfSEFTX0lEVEUgJiYgZ21hcF9hc2NlICE9IC0xVUwpIHsKKwkJaWYgKGdtYXBfYXNjZSkKKwkJCV9fdGxiX2ZsdXNoX2lkdGUoZ21hcF9hc2NlKTsKKwkJX190bGJfZmx1c2hfaWR0ZShtbS0+Y29udGV4dC5hc2NlKTsKIAl9IGVsc2UgewotCQlpZiAoTUFDSElORV9IQVNfSURURSkKLQkJCV9fdGxiX2ZsdXNoX2lkdGUoYXNjZSk7Ci0JCWVsc2UKLQkJCV9fdGxiX2ZsdXNoX2dsb2JhbCgpOwotCQkvKiBSZXNldCBUTEIgZmx1c2ggbWFzayAqLwotCQlpZiAoTUFDSElORV9IQVNfVExCX0xDKQotCQkJY3B1bWFza19jb3B5KG1tX2NwdW1hc2sobW0pLAotCQkJCSAgICAgJm1tLT5jb250ZXh0LmNwdV9hdHRhY2hfbWFzayk7CisJCV9fdGxiX2ZsdXNoX2Z1bGwobW0pOwogCX0KKwkvKiBSZXNldCBUTEIgZmx1c2ggbWFzayAqLworCWNwdW1hc2tfY29weShtbV9jcHVtYXNrKG1tKSwgJm1tLT5jb250ZXh0LmNwdV9hdHRhY2hfbWFzayk7CiAJYXRvbWljX2RlYygmbW0tPmNvbnRleHQuZmx1c2hfY291bnQpOwogCXByZWVtcHRfZW5hYmxlKCk7CiB9CkBAIC0xMTIsMzYgKzk5LDE3IEBACiAvKgogICogRmx1c2ggVExCIGVudHJpZXMgZm9yIGEgc3BlY2lmaWMgQVNDRSBvbiBhbGwgQ1BVcy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fdGxiX2ZsdXNoX2FzY2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYXNjZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYl9mbHVzaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKLQlpZiAoTUFDSElORV9IQVNfVExCX0xDKQotCQlfX3RsYl9mbHVzaF9pZHRlX2xvY2FsKGFzY2UpOwotCWVsc2UKLQkJX190bGJfZmx1c2hfbG9jYWwoKTsKKwlfX3RsYl9mbHVzaF9sb2NhbCgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX190bGJfZmx1c2hfa2VybmVsKHZvaWQpCiB7Ci0JaWYgKE1BQ0hJTkVfSEFTX1RMQl9MQykKLQkJX190bGJfZmx1c2hfaWR0ZV9sb2NhbChpbml0X21tLmNvbnRleHQuYXNjZSk7Ci0JZWxzZQotCQlfX3RsYl9mbHVzaF9sb2NhbCgpOworCV9fdGxiX2ZsdXNoX2xvY2FsKCk7CiB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB2b2lkIF9fdGxiX2ZsdXNoX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSkKLXsKLQkvKgotCSAqIElmIHRoZSBtYWNoaW5lIGhhcyBJRFRFIHdlIHByZWZlciB0byBkbyBhIHBlciBtbSBmbHVzaAotCSAqIG9uIGFsbCBjcHVzIGluc3RlYWQgb2YgZG9pbmcgYSBsb2NhbCBmbHVzaCBpZiB0aGUgbW0KLQkgKiBvbmx5IHJhbiBvbiB0aGUgbG9jYWwgY3B1LgotCSAqLwotCWlmIChNQUNISU5FX0hBU19JRFRFICYmIGxpc3RfZW1wdHkoJm1tLT5jb250ZXh0LmdtYXBfbGlzdCkpCi0JCV9fdGxiX2ZsdXNoX2FzY2UobW0sIG1tLT5jb250ZXh0LmFzY2UpOwotCWVsc2UKLQkJX190bGJfZmx1c2hfZnVsbChtbSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3RsYl9mbHVzaF9tbV9sYXp5KHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSkKIHsKIAlpZiAobW0tPmNvbnRleHQuZmx1c2hfbW0pIHsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDliNDljZjEuLjUyZDdjODcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMjY2LDI4ICsyNjYsMjggQEAKIAlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJXAogCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJXAogCWNhc2UgMTogewkJCQkJCVwKLQkJdW5zaWduZWQgY2hhciBfX3g7CQkJCVwKKwkJdW5zaWduZWQgY2hhciBfX3ggPSAwOwkJCQlcCiAJCV9fZ3VfZXJyID0gX19nZXRfdXNlcl9mbigmX194LCBwdHIsCQlcCiAJCQkJCSBzaXplb2YoKihwdHIpKSk7CVwKIAkJKHgpID0gKihfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSAqKSAmX194OwlcCiAJCWJyZWFrOwkJCQkJCVwKIAl9OwkJCQkJCQlcCiAJY2FzZSAyOiB7CQkJCQkJXAotCQl1bnNpZ25lZCBzaG9ydCBfX3g7CQkJCVwKKwkJdW5zaWduZWQgc2hvcnQgX194ID0gMDsJCQkJXAogCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oJl9feCwgcHRyLAkJXAogCQkJCQkgc2l6ZW9mKCoocHRyKSkpOwlcCiAJCSh4KSA9ICooX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkgKikgJl9feDsJXAogCQlicmVhazsJCQkJCQlcCiAJfTsJCQkJCQkJXAogCWNhc2UgNDogewkJCQkJCVwKLQkJdW5zaWduZWQgaW50IF9feDsJCQkJXAorCQl1bnNpZ25lZCBpbnQgX194ID0gMDsJCQkJXAogCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfZm4oJl9feCwgcHRyLAkJXAogCQkJCQkgc2l6ZW9mKCoocHRyKSkpOwlcCiAJCSh4KSA9ICooX19mb3JjZSBfX3R5cGVvZl9fKCoocHRyKSkgKikgJl9feDsJXAogCQlicmVhazsJCQkJCQlcCiAJfTsJCQkJCQkJXAogCWNhc2UgODogewkJCQkJCVwKLQkJdW5zaWduZWQgbG9uZyBsb25nIF9feDsJCQkJXAorCQl1bnNpZ25lZCBsb25nIGxvbmcgX194ID0gMDsJCQlcCiAJCV9fZ3VfZXJyID0gX19nZXRfdXNlcl9mbigmX194LCBwdHIsCQlcCiAJCQkJCSBzaXplb2YoKihwdHIpKSk7CVwKIAkJKHgpID0gKihfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSAqKSAmX194OwlcCkBAIC0zMTEsNiArMzExLDE0IEBACiAjZGVmaW5lIF9fcHV0X3VzZXJfdW5hbGlnbmVkIF9fcHV0X3VzZXIKICNkZWZpbmUgX19nZXRfdXNlcl91bmFsaWduZWQgX19nZXRfdXNlcgogCitleHRlcm4gdm9pZCBfX2NvbXBpbGV0aW1lX2Vycm9yKCJ1c2VyY29weSBidWZmZXIgc2l6ZSBpcyB0b28gc21hbGwiKQorX19iYWRfY29weV91c2VyKHZvaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV91c2VyX292ZXJmbG93KGludCBzaXplLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCVdBUk4oMSwgIkJ1ZmZlciBvdmVyZmxvdyBkZXRlY3RlZCAoJWQgPCAlbHUpIVxuIiwgc2l6ZSwgY291bnQpOworfQorCiAvKioKICAqIGNvcHlfdG9fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBpbnRvIHVzZXIgc3BhY2UuCiAgKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KQEAgLTMzMiwxMiArMzQwLDYgQEAKIAlyZXR1cm4gX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pOwogfQogCi12b2lkIGNvcHlfZnJvbV91c2VyX292ZXJmbG93KHZvaWQpCi0jaWZkZWYgQ09ORklHX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCi1fX2NvbXBpbGV0aW1lX3dhcm5pbmcoImNvcHlfZnJvbV91c2VyKCkgYnVmZmVyIHNpemUgaXMgbm90IHByb3ZhYmx5IGNvcnJlY3QiKQotI2VuZGlmCi07Ci0KIC8qKgogICogY29weV9mcm9tX3VzZXI6IC0gQ29weSBhIGJsb2NrIG9mIGRhdGEgZnJvbSB1c2VyIHNwYWNlLgogICogQHRvOiAgIERlc3RpbmF0aW9uIGFkZHJlc3MsIGluIGtlcm5lbCBzcGFjZS4KQEAgLTM2Miw3ICszNjQsMTAgQEAKIAogCW1pZ2h0X2ZhdWx0KCk7CiAJaWYgKHVubGlrZWx5KHN6ICE9IC0xICYmIHN6IDwgbikpIHsKLQkJY29weV9mcm9tX3VzZXJfb3ZlcmZsb3coKTsKKwkJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKKwkJCWNvcHlfdXNlcl9vdmVyZmxvdyhzeiwgbik7CisJCWVsc2UKKwkJCV9fYmFkX2NvcHlfdXNlcigpOwogCQlyZXR1cm4gbjsKIAl9CiAJcmV0dXJuIF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Z4LWluc24uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS92eC1pbnNuLmgKaW5kZXggNGEzMTM1Ni4uNDljMjRhMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Z4LWluc24uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdngtaW5zbi5oCkBAIC0xNiwxNSArMTYsMTMgQEAKIAogLyogTWFjcm9zIHRvIGdlbmVyYXRlIHZlY3RvciBpbnN0cnVjdGlvbiBieXRlIGNvZGUgKi8KIAotI2RlZmluZSBSRUdfTlVNX0lOVkFMSUQJICAgICAgIDI1NQotCiAvKiBHUl9OVU0gLSBSZXRyaWV2ZSBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIgbnVtYmVyCiAgKgogICogQG9wZDoJT3BlcmFuZCB0byBzdG9yZSByZWdpc3RlciBudW1iZXIKICAqIEByNjQ6CVN0cmluZyBkZXNpZ25hdGlvbiByZWdpc3RlciBpbiB0aGUgZm9ybWF0ICIlck4iCiAgKi8KIC5tYWNybwlHUl9OVU0Jb3BkIGdyCi0JXG9wZCA9IFJFR19OVU1fSU5WQUxJRAorCVxvcGQgPSAyNTUKIAkuaWZjIFxnciwlcjAKIAkJXG9wZCA9IDAKIAkuZW5kaWYKQEAgLTczLDE0ICs3MSwxMSBAQAogCS5pZmMgXGdyLCVyMTUKIAkJXG9wZCA9IDE1CiAJLmVuZGlmCi0JLmlmIFxvcGQgPT0gUkVHX05VTV9JTlZBTElECi0JCS5lcnJvciAiSW52YWxpZCBnZW5lcmFsLXB1cnBvc2UgcmVnaXN0ZXIgZGVzaWduYXRpb246IFxnciIKKwkuaWYgXG9wZCA9PSAyNTUKKwkJXG9wZCA9IFxncgogCS5lbmRpZgogLmVuZG0KIAotLyogVlhfUigpIC0gTWFjcm8gdG8gZW5jb2RlIHRoZSBWWF9OVU0gaW50byB0aGUgaW5zdHJ1Y3Rpb24gKi8KLSNkZWZpbmUgVlhfUih2KQkJKHYgJiAweDBGKQotCiAvKiBWWF9OVU0gLSBSZXRyaWV2ZSB2ZWN0b3IgcmVnaXN0ZXIgbnVtYmVyCiAgKgogICogQG9wZDoJT3BlcmFuZCB0byBzdG9yZSByZWdpc3RlciBudW1iZXIKQEAgLTg4LDExICs4MywxMCBAQAogICoKICAqIFRoZSB2ZWN0b3IgcmVnaXN0ZXIgbnVtYmVyIGlzIHVzZWQgZm9yIGFzIGlucHV0IG51bWJlciB0byB0aGUKICAqIGluc3RydWN0aW9uIGFuZCwgYXMgd2VsbCBhcywgdG8gY29tcHV0ZSB0aGUgUlhCIGZpZWxkIG9mIHRoZQotICogaW5zdHJ1Y3Rpb24uICBUbyBlbmNvZGUgdGhlIHBhcnRpY3VsYXIgdmVjdG9yIHJlZ2lzdGVyIG51bWJlciwKLSAqIHVzZSB0aGUgVlhfUih2KSBtYWNybyB0byBleHRyYWN0IHRoZSBpbnN0cnVjdGlvbiBvcGNvZGUuCisgKiBpbnN0cnVjdGlvbi4KICAqLwogLm1hY3JvCVZYX05VTQlvcGQgdnhyCi0JXG9wZCA9IFJFR19OVU1fSU5WQUxJRAorCVxvcGQgPSAyNTUKIAkuaWZjIFx2eHIsJXYwCiAJCVxvcGQgPSAwCiAJLmVuZGlmCkBAIC0xODksOCArMTgzLDggQEAKIAkuaWZjIFx2eHIsJXYzMQogCQlcb3BkID0gMzEKIAkuZW5kaWYKLQkuaWYgXG9wZCA9PSBSRUdfTlVNX0lOVkFMSUQKLQkJLmVycm9yICJJbnZhbGlkIHZlY3RvciByZWdpc3RlciBkZXNpZ25hdGlvbjogXHZ4ciIKKwkuaWYgXG9wZCA9PSAyNTUKKwkJXG9wZCA9IFx2eHIKIAkuZW5kaWYKIC5lbmRtCiAKQEAgLTI1MSw3ICsyNDUsNyBAQAogLyogVkVDVE9SIEdFTkVSQVRFIEJZVEUgTUFTSyAqLwogLm1hY3JvCVZHQk0JdnIgaW1tMgogCVZYX05VTQl2MSwgXHZyCi0JLndvcmQJKDB4RTcwMCB8IChWWF9SKHYxKSA8PCA0KSkKKwkud29yZAkoMHhFNzAwIHwgKCh2MSYxNSkgPDwgNCkpCiAJLndvcmQJXGltbTIKIAlNUlhCT1BDCTAsIDB4NDQsIHYxCiAuZW5kbQpAQCAtMjY3LDcgKzI2MSw3IEBACiAJVlhfTlVNCXYxLCBcdgogCUdSX05VTQliMiwgIiVyMCIKIAlHUl9OVU0JcjMsIFxncgotCS53b3JkCTB4RTcwMCB8IChWWF9SKHYxKSA8PCA0KSB8IHIzCisJLndvcmQJMHhFNzAwIHwgKCh2MSYxNSkgPDwgNCkgfCByMwogCS53b3JkCShiMiA8PCAxMikgfCAoXGRpc3ApCiAJTVJYQk9QQwlcbSwgMHgyMiwgdjEKIC5lbmRtCkBAIC0yODQsMTIgKzI3OCwyMSBAQAogCVZMVkcJXHYsIFxnciwgXGluZGV4LCAzCiAuZW5kbQogCisvKiBWRUNUT1IgTE9BRCBSRUdJU1RFUiAqLworLm1hY3JvCVZMUgl2MSwgdjIKKwlWWF9OVU0JdjEsIFx2MQorCVZYX05VTQl2MiwgXHYyCisJLndvcmQJMHhFNzAwIHwgKCh2MSYxNSkgPDwgNCkgfCAodjImMTUpCisJLndvcmQJMAorCU1SWEJPUEMJMCwgMHg1NiwgdjEsIHYyCisuZW5kbQorCiAvKiBWRUNUT1IgTE9BRCAqLwogLm1hY3JvCVZMCXYsIGRpc3AsIGluZGV4PSIlcjAiLCBiYXNlCiAJVlhfTlVNCXYxLCBcdgogCUdSX05VTQl4MiwgXGluZGV4CiAJR1JfTlVNCWIyLCBcYmFzZQotCS53b3JkCTB4RTcwMCB8IChWWF9SKHYxKSA8PCA0KSB8IHgyCisJLndvcmQJMHhFNzAwIHwgKCh2MSYxNSkgPDwgNCkgfCB4MgogCS53b3JkCShiMiA8PCAxMikgfCAoXGRpc3ApCiAJTVJYQk9QQyAwLCAweDA2LCB2MQogLmVuZG0KQEAgLTI5OSw3ICszMDIsNyBAQAogCVZYX05VTQl2MSwgXHZyMQogCUdSX05VTQl4MiwgXGluZGV4CiAJR1JfTlVNCWIyLCBcYmFzZQotCS53b3JkCTB4RTcwMCB8IChWWF9SKHYxKSA8PCA0KSB8IHgyCisJLndvcmQJMHhFNzAwIHwgKCh2MSYxNSkgPDwgNCkgfCB4MgogCS53b3JkCShiMiA8PCAxMikgfCAoXGRpc3ApCiAJTVJYQk9QQwlcbTMsIFxvcGMsIHYxCiAuZW5kbQpAQCAtMzE5LDcgKzMyMiw3IEBACiAvKiBWRUNUT1IgTE9BRCBFTEVNRU5UIElNTUVESUFURSAqLwogLm1hY3JvCVZMRUl4CXZyMSwgaW1tMiwgbTMsIG9wYwogCVZYX05VTQl2MSwgXHZyMQotCS53b3JkCTB4RTcwMCB8IChWWF9SKHYxKSA8PCA0KQorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpCiAJLndvcmQJXGltbTIKIAlNUlhCT1BDCVxtMywgXG9wYywgdjEKIC5lbmRtCkBAIC0zNDEsNyArMzQ0LDcgQEAKIAlHUl9OVU0JcjEsIFxncgogCUdSX05VTQliMiwgXGJhc2UKIAlWWF9OVU0JdjMsIFx2cgotCS53b3JkCTB4RTcwMCB8IChyMSA8PCA0KSB8IFZYX1IodjMpCisJLndvcmQJMHhFNzAwIHwgKHIxIDw8IDQpIHwgKHYzJjE1KQogCS53b3JkCShiMiA8PCAxMikgfCAoXGRpc3ApCiAJTVJYQk9QQwlcbSwgMHgyMSwgdjMKIC5lbmRtCkBAIC0zNjMsNyArMzY2LDcgQEAKIAlWWF9OVU0JdjEsIFx2ZnJvbQogCVZYX05VTQl2MywgXHZ0bwogCUdSX05VTQliMiwgXGJhc2UJICAgIC8qIEJhc2UgcmVnaXN0ZXIgKi8KLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYzKQorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYzJjE1KQogCS53b3JkCShiMiA8PCAxMikgfCAoXGRpc3ApCiAJTVJYQk9QQwkwLCAweDM2LCB2MSwgdjMKIC5lbmRtCkBAIC0zNzMsNyArMzc2LDcgQEAKIAlWWF9OVU0JdjEsIFx2ZnJvbQogCVZYX05VTQl2MywgXHZ0bwogCUdSX05VTQliMiwgXGJhc2UJICAgIC8qIEJhc2UgcmVnaXN0ZXIgKi8KLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYzKQorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYzJjE1KQogCS53b3JkCShiMiA8PCAxMikgfCAoXGRpc3ApCiAJTVJYQk9QQwkwLCAweDNFLCB2MSwgdjMKIC5lbmRtCkBAIC0zODQsMTYgKzM4NywxNiBAQAogCVZYX05VTQl2MiwgXHZyMgogCVZYX05VTQl2MywgXHZyMwogCVZYX05VTQl2NCwgXHZyNAotCS53b3JkCTB4RTcwMCB8IChWWF9SKHYxKSA8PCA0KSB8IFZYX1IodjIpCi0JLndvcmQJKFZYX1IodjMpIDw8IDEyKQotCU1SWEJPUEMJVlhfUih2NCksIDB4OEMsIHYxLCB2MiwgdjMsIHY0CisJLndvcmQJMHhFNzAwIHwgKCh2MSYxNSkgPDwgNCkgfCAodjImMTUpCisJLndvcmQJKCh2MyYxNSkgPDwgMTIpCisJTVJYQk9QQwkodjQmMTUpLCAweDhDLCB2MSwgdjIsIHYzLCB2NAogLmVuZG0KIAogLyogVkVDVE9SIFVOUEFDSyBMT0dJQ0FMIExPVyAqLwogLm1hY3JvCVZVUExMCXZyMSwgdnIyLCBtMwogCVZYX05VTQl2MSwgXHZyMQogCVZYX05VTQl2MiwgXHZyMgotCS53b3JkCTB4RTcwMCB8IChWWF9SKHYxKSA8PCA0KSB8IFZYX1IodjIpCisJLndvcmQJMHhFNzAwIHwgKCh2MSYxNSkgPDwgNCkgfCAodjImMTUpCiAJLndvcmQJMHgwMDAwCiAJTVJYQk9QQwlcbTMsIDB4RDQsIHYxLCB2MgogLmVuZG0KQEAgLTQxMCwxMyArNDEzLDIzIEBACiAKIC8qIFZlY3RvciBpbnRlZ2VyIGluc3RydWN0aW9ucyAqLwogCisvKiBWRUNUT1IgQU5EICovCisubWFjcm8JVk4JdnIxLCB2cjIsIHZyMworCVZYX05VTQl2MSwgXHZyMQorCVZYX05VTQl2MiwgXHZyMgorCVZYX05VTQl2MywgXHZyMworCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQorCS53b3JkCSgodjMmMTUpIDw8IDEyKQorCU1SWEJPUEMJMCwgMHg2OCwgdjEsIHYyLCB2MworLmVuZG0KKwogLyogVkVDVE9SIEVYQ0xVU0lWRSBPUiAqLwogLm1hY3JvCVZYCXZyMSwgdnIyLCB2cjMKIAlWWF9OVU0JdjEsIFx2cjEKIAlWWF9OVU0JdjIsIFx2cjIKIAlWWF9OVU0JdjMsIFx2cjMKLQkud29yZAkweEU3MDAgfCAoVlhfUih2MSkgPDwgNCkgfCBWWF9SKHYyKQotCS53b3JkCShWWF9SKHYzKSA8PCAxMikKKwkud29yZAkweEU3MDAgfCAoKHYxJjE1KSA8PCA0KSB8ICh2MiYxNSkKKwkud29yZAkoKHYzJjE1KSA8PCAxMikKIAlNUlhCT1BDCTAsIDB4NkQsIHYxLCB2MiwgdjMKIC5lbmRtCiAKQEAgLTQyNSw4ICs0MzgsOCBAQAogCVZYX05VTQl2MSwgXHZyMQogCVZYX05VTQl2MiwgXHZyMgogCVZYX05VTQl2MywgXHZyMwotCS53b3JkCTB4RTcwMCB8IChWWF9SKHYxKSA8PCA0KSB8IFZYX1IodjIpCi0JLndvcmQJKFZYX1IodjMpIDw8IDEyKQorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQorCS53b3JkCSgodjMmMTUpIDw8IDEyKQogCU1SWEJPUEMJXG00LCAweEI0LCB2MSwgdjIsIHYzCiAuZW5kbQogLm1hY3JvCVZHRk1CCXZyMSwgdnIyLCB2cjMKQEAgLTQ0OCw5ICs0NjEsOSBAQAogCVZYX05VTQl2MiwgXHZyMgogCVZYX05VTQl2MywgXHZyMwogCVZYX05VTQl2NCwgXHZyNAotCS53b3JkCTB4RTcwMCB8IChWWF9SKHYxKSA8PCA0KSB8IFZYX1IodjIpCi0JLndvcmQJKFZYX1IodjMpIDw8IDEyKSB8IChcbTUgPDwgOCkKLQlNUlhCT1BDCVZYX1IodjQpLCAweEJDLCB2MSwgdjIsIHYzLCB2NAorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQorCS53b3JkCSgodjMmMTUpIDw8IDEyKSB8IChcbTUgPDwgOCkKKwlNUlhCT1BDCSh2NCYxNSksIDB4QkMsIHYxLCB2MiwgdjMsIHY0CiAuZW5kbQogLm1hY3JvCVZHRk1BQgl2cjEsIHZyMiwgdnIzLCB2cjQKIAlWR0ZNQQlcdnIxLCBcdnIyLCBcdnIzLCBcdnI0LCAwCkBAIC00NzAsMTEgKzQ4Myw3OCBAQAogCVZYX05VTQl2MSwgXHZyMQogCVZYX05VTQl2MiwgXHZyMgogCVZYX05VTQl2MywgXHZyMwotCS53b3JkCTB4RTcwMCB8IChWWF9SKHYxKSA8PCA0KSB8IFZYX1IodjIpCi0JLndvcmQJKFZYX1IodjMpIDw8IDEyKQorCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQorCS53b3JkCSgodjMmMTUpIDw8IDEyKQogCU1SWEJPUEMJMCwgMHg3RCwgdjEsIHYyLCB2MwogLmVuZG0KIAorLyogVkVDVE9SIFJFUExJQ0FURSBJTU1FRElBVEUgKi8KKy5tYWNybwlWUkVQSQl2cjEsIGltbTIsIG0zCisJVlhfTlVNCXYxLCBcdnIxCisJLndvcmQJMHhFNzAwIHwgKCh2MSYxNSkgPDwgNCkKKwkud29yZAlcaW1tMgorCU1SWEJPUEMJXG0zLCAweDQ1LCB2MQorLmVuZG0KKy5tYWNybwlWUkVQSUIJdnIxLCBpbW0yCisJVlJFUEkJXHZyMSwgXGltbTIsIDAKKy5lbmRtCisubWFjcm8JVlJFUElICXZyMSwgaW1tMgorCVZSRVBJCVx2cjEsIFxpbW0yLCAxCisuZW5kbQorLm1hY3JvCVZSRVBJRgl2cjEsIGltbTIKKwlWUkVQSQlcdnIxLCBcaW1tMiwgMgorLmVuZG0KKy5tYWNybwlWUkVQSUcJdnIxLCBpbW0yCisJVlJFUAlcdnIxLCBcaW1tMiwgMworLmVuZG0KKworLyogVkVDVE9SIEFERCAqLworLm1hY3JvCVZBCXZyMSwgdnIyLCB2cjMsIG00CisJVlhfTlVNCXYxLCBcdnIxCisJVlhfTlVNCXYyLCBcdnIyCisJVlhfTlVNCXYzLCBcdnIzCisJLndvcmQJMHhFNzAwIHwgKCh2MSYxNSkgPDwgNCkgfCAodjImMTUpCisJLndvcmQJKCh2MyYxNSkgPDwgMTIpCisJTVJYQk9QQwlcbTQsIDB4RjMsIHYxLCB2MiwgdjMKKy5lbmRtCisubWFjcm8JVkFCCXZyMSwgdnIyLCB2cjMKKwlWQQlcdnIxLCBcdnIyLCBcdnIzLCAwCisuZW5kbQorLm1hY3JvCVZBSAl2cjEsIHZyMiwgdnIzCisJVkEJXHZyMSwgXHZyMiwgXHZyMywgMQorLmVuZG0KKy5tYWNybwlWQUYJdnIxLCB2cjIsIHZyMworCVZBCVx2cjEsIFx2cjIsIFx2cjMsIDIKKy5lbmRtCisubWFjcm8JVkFHCXZyMSwgdnIyLCB2cjMKKwlWQQlcdnIxLCBcdnIyLCBcdnIzLCAzCisuZW5kbQorLm1hY3JvCVZBUQl2cjEsIHZyMiwgdnIzCisJVkEJXHZyMSwgXHZyMiwgXHZyMywgNAorLmVuZG0KKworLyogVkVDVE9SIEVMRU1FTlQgU0hJRlQgUklHSFQgQVJJVEhNRVRJQyAqLworLm1hY3JvCVZFU1JBVgl2cjEsIHZyMiwgdnIzLCBtNAorCVZYX05VTQl2MSwgXHZyMQorCVZYX05VTQl2MiwgXHZyMgorCVZYX05VTQl2MywgXHZyMworCS53b3JkCTB4RTcwMCB8ICgodjEmMTUpIDw8IDQpIHwgKHYyJjE1KQorCS53b3JkCSgodjMmMTUpIDw8IDEyKQorCU1SWEJPUEMgXG00LCAweDdBLCB2MSwgdjIsIHYzCisuZW5kbQorCisubWFjcm8JVkVTUkFWQgl2cjEsIHZyMiwgdnIzCisJVkVTUkFWCVx2cjEsIFx2cjIsIFx2cjMsIDAKKy5lbmRtCisubWFjcm8JVkVTUkFWSAl2cjEsIHZyMiwgdnIzCisJVkVTUkFWCVx2cjEsIFx2cjIsIFx2cjMsIDEKKy5lbmRtCisubWFjcm8JVkVTUkFWRgl2cjEsIHZyMiwgdnIzCisJVkVTUkFWCVx2cjEsIFx2cjIsIFx2cjMsIDIKKy5lbmRtCisubWFjcm8JVkVTUkFWRwl2cjEsIHZyMiwgdnIzCisJVkVTUkFWCVx2cjEsIFx2cjIsIFx2cjMsIDMKKy5lbmRtCiAKICNlbmRpZgkvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgkvKiBfX0FTTV9TMzkwX1ZYX0lOU05fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vS2J1aWxkIGIvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vS2J1aWxkCmluZGV4IDA4ZmU2ZGEuLmNjNDRiMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL0tidWlsZAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9LYnVpbGQKQEAgLTYsNiArNiw3IEBACiBoZWFkZXIteSArPSBieXRlb3JkZXIuaAogaGVhZGVyLXkgKz0gY2hwaWQuaAogaGVhZGVyLXkgKz0gY2hzYy5oCitoZWFkZXIteSArPSBjbHAuaAogaGVhZGVyLXkgKz0gY21iLmgKIGhlYWRlci15ICs9IGRhc2QuaAogaGVhZGVyLXkgKz0gZGVidWcuaApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMzIzNDgxNy4uNzJjY2M0MSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCkBAIC00OCw2ICs0OCw5IEBACiBlbmRpZgogR0NPVl9QUk9GSUxFX3NjbHAubyA6PSBuCiBHQ09WX1BST0ZJTEVfYWxzLm8gOj0gbgorVUJTQU5fU0FOSVRJWkVfYWxzLm8gOj0gbgorVUJTQU5fU0FOSVRJWkVfZWFybHkubyA6PSBuCitVQlNBTl9TQU5JVElaRV9zY2xwLm8gOj0gbgogCiBvYmoteQk6PSB0cmFwcy5vIHRpbWUubyBwcm9jZXNzLm8gYmFzZS5vIGVhcmx5Lm8gc2V0dXAubyBpZGxlLm8gdnRpbWUubwogb2JqLXkJKz0gcHJvY2Vzc29yLm8gc3lzX3MzOTAubyBwdHJhY2UubyBzaWduYWwubyBjcGNtZC5vIGViY2RpYy5vIG5taS5vCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggMWY5NWNjMS4uZjNkZjllMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMTI1LDYgKzEyNSw3IEBACiAJT0ZGU0VUKF9fTENfU1RGTF9GQUNfTElTVCwgbG93Y29yZSwgc3RmbF9mYWNfbGlzdCk7CiAJT0ZGU0VUKF9fTENfU1RGTEVfRkFDX0xJU1QsIGxvd2NvcmUsIHN0ZmxlX2ZhY19saXN0KTsKIAlPRkZTRVQoX19MQ19NQ0NLX0NPREUsIGxvd2NvcmUsIG1jY2tfaW50ZXJydXB0aW9uX2NvZGUpOworCU9GRlNFVChfX0xDX0VYVF9EQU1BR0VfQ09ERSwgbG93Y29yZSwgZXh0ZXJuYWxfZGFtYWdlX2NvZGUpOwogCU9GRlNFVChfX0xDX01DQ0tfRkFJTF9TVE9SX0FERFIsIGxvd2NvcmUsIGZhaWxpbmdfc3RvcmFnZV9hZGRyZXNzKTsKIAlPRkZTRVQoX19MQ19MQVNUX0JSRUFLLCBsb3djb3JlLCBicmVha2luZ19ldmVudF9hZGRyKTsKIAlPRkZTRVQoX19MQ19SU1RfT0xEX1BTVywgbG93Y29yZSwgcmVzdGFydF9vbGRfcHN3KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY3Jhc2hfZHVtcC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jcmFzaF9kdW1wLmMKaW5kZXggMjlkZjg0ODQuLmY5MjkzYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY3Jhc2hfZHVtcC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY3Jhc2hfZHVtcC5jCkBAIC03MSw5ICs3MSw3IEBACiAgKi8KIHN0cnVjdCBzYXZlX2FyZWEgKiBfX2luaXQgc2F2ZV9hcmVhX2Jvb3RfY3B1KHZvaWQpCiB7Ci0JaWYgKGxpc3RfZW1wdHkoJmR1bXBfc2F2ZV9hcmVhcykpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5KCZkdW1wX3NhdmVfYXJlYXMsIHN0cnVjdCBzYXZlX2FyZWEsIGxpc3QpOworCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmR1bXBfc2F2ZV9hcmVhcywgc3RydWN0IHNhdmVfYXJlYSwgbGlzdCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMgYi9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMKaW5kZXggNzE3YjAzYS4uMjM3NGM1YiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2ZwdS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9mcHUuYwppbmRleCA4MWQxZDE4Li4xMjM1Yjk0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2ZwdS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvZnB1LmMKQEAgLTEwLDI0MCArMTAsMTY3IEBACiAjaW5jbHVkZSA8YXNtL2ZwdS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9mcHUvYXBpLmg+CiAKLS8qCi0gKiBQZXItQ1BVIHZhcmlhYmxlIHRvIG1haW50YWluIEZQVSByZWdpc3RlciByYW5nZXMgdGhhdCBhcmUgaW4gdXNlCi0gKiBieSB0aGUga2VybmVsLgotICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUodTMyLCBrZXJuZWxfZnB1X3N0YXRlKTsKLQotI2RlZmluZSBLRVJORUxfRlBVX1NUQVRFX01BU0sJKEtFUk5FTF9GUFVfTUFTS3xLRVJORUxfRlBDKQotCithc20oIi5pbmNsdWRlIFwiYXNtL3Z4LWluc24uaFwiXG4iKTsKIAogdm9pZCBfX2tlcm5lbF9mcHVfYmVnaW4oc3RydWN0IGtlcm5lbF9mcHUgKnN0YXRlLCB1MzIgZmxhZ3MpCiB7Ci0JaWYgKCFfX3RoaXNfY3B1X3JlYWQoa2VybmVsX2ZwdV9zdGF0ZSkpIHsKLQkJLyoKLQkJICogU2F2ZSB1c2VyIHNwYWNlIEZQVSBzdGF0ZSBhbmQgcmVnaXN0ZXIgY29udGVudHMuICBNdWx0aXBsZQotCQkgKiBjYWxscyBiZWNhdXNlIG9mIGludGVycnVwdGlvbnMgZG8gbm90IG1hdHRlciBhbmQgcmV0dXJuCi0JCSAqIGltbWVkaWF0ZWx5LiAgVGhpcyBhbHNvIHNldHMgQ0lGX0ZQVSB0byBsYXp5IHJlc3RvcmUgRlAvVlgKLQkJICogcmVnaXN0ZXIgY29udGVudHMgd2hlbiByZXR1cm5pbmcgdG8gdXNlciBzcGFjZS4KLQkJICovCi0JCXNhdmVfZnB1X3JlZ3MoKTsKLQl9Ci0KLQkvKiBVcGRhdGUgZmxhZ3MgdG8gdXNlIHRoZSB2ZWN0b3IgZmFjaWxpdHkgZm9yIEtFUk5FTF9GUFIgKi8KLQlpZiAoTUFDSElORV9IQVNfVlggJiYgKHN0YXRlLT5tYXNrICYgS0VSTkVMX0ZQUikpIHsKLQkJZmxhZ3MgfD0gS0VSTkVMX1ZYUl9MT1cgfCBLRVJORUxfRlBDOwotCQlmbGFncyAmPSB+S0VSTkVMX0ZQUjsKLQl9Ci0KLQkvKiBTYXZlIGFuZCB1cGRhdGUgY3VycmVudCBrZXJuZWwgVlggc3RhdGUgKi8KLQlzdGF0ZS0+bWFzayA9IF9fdGhpc19jcHVfcmVhZChrZXJuZWxfZnB1X3N0YXRlKTsKLQlfX3RoaXNfY3B1X29yKGtlcm5lbF9mcHVfc3RhdGUsIGZsYWdzICYgS0VSTkVMX0ZQVV9TVEFURV9NQVNLKTsKLQogCS8qCi0JICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCB0byBfX2tlcm5lbF9mcHVfYmVnaW4oKSwgbm8gYWRkaXRpb25hbAotCSAqIHdvcmsgaXMgcmVxdWlyZWQuCisJICogTGltaXQgdGhlIHNhdmUgdG8gdGhlIEZQVS92ZWN0b3IgcmVnaXN0ZXJzIGFscmVhZHkKKwkgKiBpbiB1c2UgYnkgdGhlIHByZXZpb3VzIGNvbnRleHQKIAkgKi8KLQlpZiAoIShzdGF0ZS0+bWFzayAmIEtFUk5FTF9GUFVfU1RBVEVfTUFTSykpCi0JCXJldHVybjsKKwlmbGFncyAmPSBzdGF0ZS0+bWFzazsKIAotCS8qCi0JICogSWYgS0VSTkVMX0ZQUiBpcyBzdGlsbCBzZXQsIHRoZSB2ZWN0b3IgZmFjaWxpdHkgaXMgbm90IGF2YWlsYWJsZQotCSAqIGFuZCwgdGh1cywgc2F2ZSBmbG9hdGluZy1wb2ludCBjb250cm9sIGFuZCByZWdpc3RlcnMgb25seS4KLQkgKi8KLQlpZiAoc3RhdGUtPm1hc2sgJiBLRVJORUxfRlBSKSB7Ci0JCWFzbSB2b2xhdGlsZSgic3RmcGMgJTAiIDogIj1RIiAoc3RhdGUtPmZwYykpOwotCQlhc20gdm9sYXRpbGUoInN0ZCAwLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzBdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDEsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMV0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgMiwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1syXSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCAzLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzNdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDQsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbNF0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgNSwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s1XSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCA2LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzZdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDcsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbN10pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgOCwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s4XSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCA5LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzldKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDEwLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzEwXSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCAxMSwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxMV0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgMTIsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTJdKSk7Ci0JCWFzbSB2b2xhdGlsZSgic3RkIDEzLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzEzXSkpOwotCQlhc20gdm9sYXRpbGUoInN0ZCAxNCwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxNF0pKTsKLQkJYXNtIHZvbGF0aWxlKCJzdGQgMTUsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTVdKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIElmIHRoaXMgaXMgYSBuZXN0ZWQgY2FsbCB0byBfX2tlcm5lbF9mcHVfYmVnaW4oKSwgY2hlY2sgdGhlIHNhdmVkCi0JICogc3RhdGUgbWFzayB0byBzYXZlIGFuZCBsYXRlciByZXN0b3JlIHRoZSB2ZWN0b3IgcmVnaXN0ZXJzIHRoYXQKLQkgKiBhcmUgYWxyZWFkeSBpbiB1c2UuCUxldCdzIHN0YXJ0IHdpdGggY2hlY2tpbmcgZmxvYXRpbmctcG9pbnQKLQkgKiBjb250cm9scy4KLQkgKi8KLQlpZiAoc3RhdGUtPm1hc2sgJiBLRVJORUxfRlBDKQorCWlmIChmbGFncyAmIEtFUk5FTF9GUEMpCisJCS8qIFNhdmUgZmxvYXRpbmcgcG9pbnQgY29udHJvbCAqLwogCQlhc20gdm9sYXRpbGUoInN0ZnBjICUwIiA6ICI9bSIgKHN0YXRlLT5mcGMpKTsKIAorCWlmICghTUFDSElORV9IQVNfVlgpIHsKKwkJaWYgKGZsYWdzICYgS0VSTkVMX1ZYUl9WMFY3KSB7CisJCQkvKiBTYXZlIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycyAqLworCQkJYXNtIHZvbGF0aWxlKCJzdGQgMCwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1swXSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgMSwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxXSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgMiwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1syXSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgMywlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1szXSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgNCwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s0XSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgNSwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s1XSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgNiwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s2XSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgNywlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s3XSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgOCwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s4XSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgOSwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1s5XSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgMTAsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTBdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCAxMSwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxMV0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDEyLCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzEyXSkpOworCQkJYXNtIHZvbGF0aWxlKCJzdGQgMTMsJTAiIDogIj1RIiAoc3RhdGUtPmZwcnNbMTNdKSk7CisJCQlhc20gdm9sYXRpbGUoInN0ZCAxNCwlMCIgOiAiPVEiIChzdGF0ZS0+ZnByc1sxNF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgic3RkIDE1LCUwIiA6ICI9USIgKHN0YXRlLT5mcHJzWzE1XSkpOworCQl9CisJCXJldHVybjsKKwl9CisKIAkvKiBUZXN0IGFuZCBzYXZlIHZlY3RvciByZWdpc3RlcnMgKi8KIAlhc20gdm9sYXRpbGUgKAogCQkvKgogCQkgKiBUZXN0IGlmIGFueSB2ZWN0b3IgcmVnaXN0ZXIgbXVzdCBiZSBzYXZlZCBhbmQsIGlmIHNvLAogCQkgKiB0ZXN0IGlmIGFsbCByZWdpc3RlciBjYW4gYmUgc2F2ZWQuCiAJCSAqLwotCQkiCXRtbGwJJVttXSwxNVxuIgkvKiBLRVJORUxfVlhSX01BU0sgKi8KLQkJIglqegkyMGZcbiIJCS8qIG5vIHdvcmsgLT4gZG9uZSAqLwogCQkiCWxhCTEsJVt2eHJzXVxuIgkvKiBsb2FkIHNhdmUgYXJlYSAqLwotCQkiCWpvCTE4ZlxuIgkJLyogLT4gc2F2ZSBWMC4uVjMxICovCi0KKwkJIgl0bWxsCSVbbV0sMzBcbiIJLyogS0VSTkVMX1ZYUiAqLworCQkiCWp6CTdmXG4iCQkvKiBubyB3b3JrIC0+IGRvbmUgKi8KKwkJIglqbwk1ZlxuIgkJLyogLT4gc2F2ZSBWMC4uVjMxICovCiAJCS8qCi0JCSAqIFRlc3QgaWYgVjguLlYyMyBjYW4gYmUgc2F2ZWQgYXQgb25jZS4uLiB0aGlzIHNwZWVkcyB1cAotCQkgKiBmb3IgS0VSTkVMX2ZwdV9NSUQgb25seS4gT3RoZXJ3aXNlIGNvbnRpbnVlIHRvIHNwbGl0IHRoZQotCQkgKiByYW5nZSBvZiB2ZWN0b3IgcmVnaXN0ZXJzIGludG8gdHdvIGhhbHZlcyBhbmQgdGVzdCB0aGVtCi0JCSAqIHNlcGFyYXRlbHkuCisJCSAqIFRlc3QgZm9yIHNwZWNpYWwgY2FzZSBLRVJORUxfRlBVX01JRCBvbmx5LiBJbiB0aGlzCisJCSAqIGNhc2UgYSB2c3RtIFY4Li5WMjMgaXMgdGhlIGJlc3QgaW5zdHJ1Y3Rpb24KIAkJICovCi0JCSIJdG1sbAklW21dLDZcbiIJLyogS0VSTkVMX1ZYUl9NSUQgKi8KLQkJIglqbwkxN2ZcbiIJCS8qIC0+IHNhdmUgVjguLlYyMyAqLwotCisJCSIJY2hpCSVbbV0sMTJcbiIJLyogS0VSTkVMX1ZYUl9NSUQgKi8KKwkJIglqbmUJMGZcbiIJCS8qIC0+IHNhdmUgVjguLlYyMyAqLworCQkiCVZTVE0JOCwyMywxMjgsMVxuIgkvKiB2c3RtICV2OCwldjIzLDEyOCglcjEpICovCisJCSIJagk3ZlxuIgogCQkvKiBUZXN0IGFuZCBzYXZlIHRoZSBmaXJzdCBoYWxmIG9mIDE2IHZlY3RvciByZWdpc3RlcnMgKi8KLQkJIjE6CXRtbGwJJVttXSwzXG4iCS8qIEtFUk5FTF9WWFJfTE9XICovCi0JCSIJanoJMTBmXG4iCQkvKiAtPiBLRVJORUxfVlhSX0hJR0ggKi8KKwkJIjA6CXRtbGwJJVttXSw2XG4iCS8qIEtFUk5FTF9WWFJfTE9XICovCisJCSIJanoJM2ZcbiIJCS8qIC0+IEtFUk5FTF9WWFJfSElHSCAqLwogCQkiCWpvCTJmXG4iCQkvKiAxMSAtPiBzYXZlIFYwLi5WMTUgKi8KLQkJIglicmMJNCwzZlxuIgkJLyogMDEgLT4gc2F2ZSBWMC4uVjcgICovCi0JCSIJYnJjCTIsNGZcbiIJCS8qIDEwIC0+IHNhdmUgVjguLlYxNSAqLwotCisJCSIJYnJjCTIsMWZcbiIJCS8qIDEwIC0+IHNhdmUgVjguLlYxNSAqLworCQkiCVZTVE0JMCw3LDAsMVxuIgkvKiB2c3RtICV2MCwldjcsMCglcjEpICovCisJCSIJagkzZlxuIgorCQkiMToJVlNUTQk4LDE1LDEyOCwxXG4iCS8qIHZzdG0gJXY4LCV2MTUsMTI4KCVyMSkgKi8KKwkJIglqCTNmXG4iCisJCSIyOglWU1RNCTAsMTUsMCwxXG4iCS8qIHZzdG0gJXYwLCV2MTUsMCglcjEpICovCiAJCS8qIFRlc3QgYW5kIHNhdmUgdGhlIHNlY29uZCBoYWxmIG9mIDE2IHZlY3RvciByZWdpc3RlcnMgKi8KLQkJIjEwOgl0bWxsCSVbbV0sMTJcbiIJLyogS0VSTkVMX1ZYUl9ISUdIICovCi0JCSIJam8JMTlmXG4iCQkvKiAxMSAtPiBzYXZlIFYxNi4uVjMxICovCi0JCSIJYnJjCTQsMTFmXG4iCS8qIDAxIC0+IHNhdmUgVjE2Li5WMjMJKi8KLQkJIglicmMJMiwxMmZcbiIJLyogMTAgLT4gc2F2ZSBWMjQuLlYzMSAqLwotCQkiCWoJMjBmXG4iCQkvKiAwMCAtPiBkb25lICovCi0KLQkJLyoKLQkJICogQmVsb3cgYXJlIHRoZSB2c3RtIGNvbWJpbmF0aW9ucyB0byBzYXZlIG11bHRpcGxlIHZlY3RvcgotCQkgKiByZWdpc3RlcnMgYXQgb25jZS4KLQkJICovCi0JCSIyOgkud29yZAkweGU3MGYsMHgxMDAwLDB4MDAzZVxuIgkvKiB2c3RtIDAsMTUsMCgxKSAqLwotCQkiCWoJMTBiXG4iCQkJLyogLT4gVlhSX0hJR0ggKi8KLQkJIjM6CS53b3JkCTB4ZTcwNywweDEwMDAsMHgwMDNlXG4iIC8qIHZzdG0gMCw3LDAoMSkgKi8KLQkJIglqCTEwYlxuIgkJCS8qIC0+IFZYUl9ISUdIICovCi0JCSI0Ogkud29yZAkweGU3OGYsMHgxMDgwLDB4MDAzZVxuIiAvKiB2c3RtIDgsMTUsMTI4KDEpICovCi0JCSIJagkxMGJcbiIJCQkvKiAtPiBWWFJfSElHSCAqLwotCQkiXG4iCi0JCSIxMToJLndvcmQJMHhlNzA3LDB4MTEwMCwweDBjM2VcbiIJLyogdnN0bSAxNiwyMywyNTYoMSkgKi8KLQkJIglqCTIwZlxuIgkJCS8qIC0+IGRvbmUgKi8KLQkJIjEyOgkud29yZAkweGU3OGYsMHgxMTgwLDB4MGMzZVxuIiAvKiB2c3RtIDI0LDMxLDM4NCgxKSAqLwotCQkiCWoJMjBmXG4iCQkJLyogLT4gZG9uZSAqLwotCQkiXG4iCi0JCSIxNzoJLndvcmQJMHhlNzg3LDB4MTA4MCwweDA0M2VcbiIJLyogdnN0bSA4LDIzLDEyOCgxKSAqLwotCQkiCW5pbGwJJVttXSwyNDlcbiIJCS8qIG0gJj0gflZYUl9NSUQgICAgKi8KLQkJIglqCTFiXG4iCQkJLyogLT4gVlhSX0xPVyAqLwotCQkiXG4iCi0JCSIxODoJLndvcmQJMHhlNzBmLDB4MTAwMCwweDAwM2VcbiIJLyogdnN0bSAwLDE1LDAoMSkgKi8KLQkJIjE5Ogkud29yZAkweGU3MGYsMHgxMTAwLDB4MGMzZVxuIgkvKiB2c3RtIDE2LDMxLDI1NigxKSAqLwotCQkiMjA6IgorCQkiMzoJdG1sbAklW21dLDI0XG4iCS8qIEtFUk5FTF9WWFJfSElHSCAqLworCQkiCWp6CTdmXG4iCisJCSIJam8JNmZcbiIJCS8qIDExIC0+IHNhdmUgVjE2Li5WMzEgKi8KKwkJIglicmMJMiw0ZlxuIgkJLyogMTAgLT4gc2F2ZSBWMjQuLlYzMSAqLworCQkiCVZTVE0JMTYsMjMsMjU2LDFcbiIJLyogdnN0bSAldjE2LCV2MjMsMjU2KCVyMSkgKi8KKwkJIglqCTdmXG4iCisJCSI0OglWU1RNCTI0LDMxLDM4NCwxXG4iCS8qIHZzdG0gJXYyNCwldjMxLDM4NCglcjEpICovCisJCSIJagk3ZlxuIgorCQkiNToJVlNUTQkwLDE1LDAsMVxuIgkvKiB2c3RtICV2MCwldjE1LDAoJXIxKSAqLworCQkiNjoJVlNUTQkxNiwzMSwyNTYsMVxuIgkvKiB2c3RtICV2MTYsJXYzMSwyNTYoJXIxKSAqLworCQkiNzoiCiAJCTogW3Z4cnNdICI9USIgKCooc3RydWN0IHZ4X2FycmF5ICopICZzdGF0ZS0+dnhycykKLQkJOiBbbV0gImQiIChzdGF0ZS0+bWFzaykKKwkJOiBbbV0gImQiIChmbGFncykKIAkJOiAiMSIsICJjYyIpOwogfQogRVhQT1JUX1NZTUJPTChfX2tlcm5lbF9mcHVfYmVnaW4pOwogCi12b2lkIF9fa2VybmVsX2ZwdV9lbmQoc3RydWN0IGtlcm5lbF9mcHUgKnN0YXRlKQordm9pZCBfX2tlcm5lbF9mcHVfZW5kKHN0cnVjdCBrZXJuZWxfZnB1ICpzdGF0ZSwgdTMyIGZsYWdzKQogewotCS8qIEp1c3QgdXBkYXRlIHRoZSBwZXItQ1BVIHN0YXRlIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVzdG9yZSAqLwotCWlmICghKHN0YXRlLT5tYXNrICYgS0VSTkVMX0ZQVV9TVEFURV9NQVNLKSkKLQkJZ290byB1cGRhdGVfZnB1X3N0YXRlOwotCiAJLyoKLQkgKiBJZiBLRVJORUxfRlBSIGlzIHNwZWNpZmllZCwgdGhlIHZlY3RvciBmYWNpbGl0eSBpcyBub3QgYXZhaWxhYmxlCi0JICogYW5kLCB0aHVzLCByZXN0b3JlIGZsb2F0aW5nLXBvaW50IGNvbnRyb2wgYW5kIHJlZ2lzdGVycyBvbmx5LgorCSAqIExpbWl0IHRoZSByZXN0b3JlIHRvIHRoZSBGUFUvdmVjdG9yIHJlZ2lzdGVycyBvZiB0aGUKKwkgKiBwcmV2aW91cyBjb250ZXh0IHRoYXQgaGF2ZSBiZWVuIG92ZXJ3cml0dGUgYnkgdGhlCisJICogY3VycmVudCBjb250ZXh0CiAJICovCi0JaWYgKHN0YXRlLT5tYXNrICYgS0VSTkVMX0ZQUikgewotCQlhc20gdm9sYXRpbGUoImxmcGMgJTAiIDogOiAiUSIgKHN0YXRlLT5mcGMpKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCAwLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1swXSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDEsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzFdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgMiwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMl0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCAzLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1szXSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDQsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzRdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgNSwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbNV0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCA2LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s2XSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDcsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzddKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgOCwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbOF0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCA5LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s5XSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDEwLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxMF0pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCAxMSwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTFdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgMTIsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzEyXSkpOwotCQlhc20gdm9sYXRpbGUoImxkIDEzLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxM10pKTsKLQkJYXNtIHZvbGF0aWxlKCJsZCAxNCwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTRdKSk7Ci0JCWFzbSB2b2xhdGlsZSgibGQgMTUsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzE1XSkpOwotCQlnb3RvIHVwZGF0ZV9mcHVfc3RhdGU7Ci0JfQorCWZsYWdzICY9IHN0YXRlLT5tYXNrOwogCi0JLyogVGVzdCBhbmQgcmVzdG9yZSBmbG9hdGluZy1wb2ludCBjb250cm9scyAqLwotCWlmIChzdGF0ZS0+bWFzayAmIEtFUk5FTF9GUEMpCisJaWYgKGZsYWdzICYgS0VSTkVMX0ZQQykKKwkJLyogUmVzdG9yZSBmbG9hdGluZy1wb2ludCBjb250cm9scyAqLwogCQlhc20gdm9sYXRpbGUoImxmcGMgJTAiIDogOiAiUSIgKHN0YXRlLT5mcGMpKTsKIAorCWlmICghTUFDSElORV9IQVNfVlgpIHsKKwkJaWYgKGZsYWdzICYgS0VSTkVMX1ZYUl9WMFY3KSB7CisJCQkvKiBSZXN0b3JlIGZsb2F0aW5nLXBvaW50IHJlZ2lzdGVycyAqLworCQkJYXNtIHZvbGF0aWxlKCJsZCAwLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1swXSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCAxLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxXSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCAyLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1syXSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCAzLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1szXSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCA0LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s0XSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCA1LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s1XSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCA2LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s2XSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCA3LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s3XSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCA4LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s4XSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCA5LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1s5XSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCAxMCwlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTBdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDExLCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxMV0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgMTIsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzEyXSkpOworCQkJYXNtIHZvbGF0aWxlKCJsZCAxMywlMCIgOiA6ICJRIiAoc3RhdGUtPmZwcnNbMTNdKSk7CisJCQlhc20gdm9sYXRpbGUoImxkIDE0LCUwIiA6IDogIlEiIChzdGF0ZS0+ZnByc1sxNF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibGQgMTUsJTAiIDogOiAiUSIgKHN0YXRlLT5mcHJzWzE1XSkpOworCQl9CisJCXJldHVybjsKKwl9CisKIAkvKiBUZXN0IGFuZCByZXN0b3JlIChsb2FkKSB2ZWN0b3IgcmVnaXN0ZXJzICovCiAJYXNtIHZvbGF0aWxlICgKIAkJLyoKLQkJICogVGVzdCBpZiBhbnkgdmVjdG9yIHJlZ2lzdGVycyBtdXN0IGJlIGxvYWRlZCBhbmQsIGlmIHNvLAorCQkgKiBUZXN0IGlmIGFueSB2ZWN0b3IgcmVnaXN0ZXIgbXVzdCBiZSBsb2FkZWQgYW5kLCBpZiBzbywKIAkJICogdGVzdCBpZiBhbGwgcmVnaXN0ZXJzIGNhbiBiZSBsb2FkZWQgYXQgb25jZS4KIAkJICovCi0JCSIJdG1sbAklW21dLDE1XG4iCS8qIEtFUk5FTF9WWFJfTUFTSyAqLwotCQkiCWp6CTIwZlxuIgkJLyogbm8gd29yayAtPiBkb25lICovCi0JCSIJbGEJMSwlW3Z4cnNdXG4iCS8qIGxvYWQgbG9hZCBhcmVhICovCi0JCSIJam8JMThmXG4iCQkvKiAtPiBsb2FkIFYwLi5WMzEgKi8KLQorCQkiCWxhCTEsJVt2eHJzXVxuIgkvKiBsb2FkIHJlc3RvcmUgYXJlYSAqLworCQkiCXRtbGwJJVttXSwzMFxuIgkvKiBLRVJORUxfVlhSICovCisJCSIJanoJN2ZcbiIJCS8qIG5vIHdvcmsgLT4gZG9uZSAqLworCQkiCWpvCTVmXG4iCQkvKiAtPiByZXN0b3JlIFYwLi5WMzEgKi8KIAkJLyoKLQkJICogVGVzdCBpZiBWOC4uVjIzIGNhbiBiZSByZXN0b3JlZCBhdCBvbmNlLi4uIHRoaXMgc3BlZWRzIHVwCi0JCSAqIGZvciBLRVJORUxfVlhSX01JRCBvbmx5LiBPdGhlcndpc2UgY29udGludWUgdG8gc3BsaXQgdGhlCi0JCSAqIHJhbmdlIG9mIHZlY3RvciByZWdpc3RlcnMgaW50byB0d28gaGFsdmVzIGFuZCB0ZXN0IHRoZW0KLQkJICogc2VwYXJhdGVseS4KKwkJICogVGVzdCBmb3Igc3BlY2lhbCBjYXNlIEtFUk5FTF9GUFVfTUlEIG9ubHkuIEluIHRoaXMKKwkJICogY2FzZSBhIHZsbSBWOC4uVjIzIGlzIHRoZSBiZXN0IGluc3RydWN0aW9uCiAJCSAqLwotCQkiCXRtbGwJJVttXSw2XG4iCS8qIEtFUk5FTF9WWFJfTUlEICovCi0JCSIJam8JMTdmXG4iCQkvKiAtPiBsb2FkIFY4Li5WMjMgKi8KLQotCQkvKiBUZXN0IGFuZCBsb2FkIHRoZSBmaXJzdCBoYWxmIG9mIDE2IHZlY3RvciByZWdpc3RlcnMgKi8KLQkJIjE6CXRtbGwJJVttXSwzXG4iCS8qIEtFUk5FTF9WWFJfTE9XICovCi0JCSIJanoJMTBmXG4iCQkvKiAtPiBLRVJORUxfVlhSX0hJR0ggKi8KLQkJIglqbwkyZlxuIgkJLyogMTEgLT4gbG9hZCBWMC4uVjE1ICovCi0JCSIJYnJjCTQsM2ZcbiIJCS8qIDAxIC0+IGxvYWQgVjAuLlY3ICAqLwotCQkiCWJyYwkyLDRmXG4iCQkvKiAxMCAtPiBsb2FkIFY4Li5WMTUgKi8KLQotCQkvKiBUZXN0IGFuZCBsb2FkIHRoZSBzZWNvbmQgaGFsZiBvZiAxNiB2ZWN0b3IgcmVnaXN0ZXJzICovCi0JCSIxMDoJdG1sbAklW21dLDEyXG4iCS8qIEtFUk5FTF9WWFJfSElHSCAqLwotCQkiCWpvCTE5ZlxuIgkJLyogMTEgLT4gbG9hZCBWMTYuLlYzMSAqLwotCQkiCWJyYwk0LDExZlxuIgkvKiAwMSAtPiBsb2FkIFYxNi4uVjIzCSovCi0JCSIJYnJjCTIsMTJmXG4iCS8qIDEwIC0+IGxvYWQgVjI0Li5WMzEgKi8KLQkJIglqCTIwZlxuIgkJLyogMDAgLT4gZG9uZSAqLwotCi0JCS8qCi0JCSAqIEJlbG93IGFyZSB0aGUgdnN0bSBjb21iaW5hdGlvbnMgdG8gbG9hZCBtdWx0aXBsZSB2ZWN0b3IKLQkJICogcmVnaXN0ZXJzIGF0IG9uY2UuCi0JCSAqLwotCQkiMjoJLndvcmQJMHhlNzBmLDB4MTAwMCwweDAwMzZcbiIJLyogdmxtIDAsMTUsMCgxKSAqLwotCQkiCWoJMTBiXG4iCQkJLyogLT4gVlhSX0hJR0ggKi8KLQkJIjM6CS53b3JkCTB4ZTcwNywweDEwMDAsMHgwMDM2XG4iIC8qIHZsbSAwLDcsMCgxKSAqLwotCQkiCWoJMTBiXG4iCQkJLyogLT4gVlhSX0hJR0ggKi8KLQkJIjQ6CS53b3JkCTB4ZTc4ZiwweDEwODAsMHgwMDM2XG4iIC8qIHZsbSA4LDE1LDEyOCgxKSAqLwotCQkiCWoJMTBiXG4iCQkJLyogLT4gVlhSX0hJR0ggKi8KLQkJIlxuIgotCQkiMTE6CS53b3JkCTB4ZTcwNywweDExMDAsMHgwYzM2XG4iCS8qIHZsbSAxNiwyMywyNTYoMSkgKi8KLQkJIglqCTIwZlxuIgkJCS8qIC0+IGRvbmUgKi8KLQkJIjEyOgkud29yZAkweGU3OGYsMHgxMTgwLDB4MGMzNlxuIiAvKiB2bG0gMjQsMzEsMzg0KDEpICovCi0JCSIJagkyMGZcbiIJCQkvKiAtPiBkb25lICovCi0JCSJcbiIKLQkJIjE3Ogkud29yZAkweGU3ODcsMHgxMDgwLDB4MDQzNlxuIgkvKiB2bG0gOCwyMywxMjgoMSkgKi8KLQkJIgluaWxsCSVbbV0sMjQ5XG4iCQkvKiBtICY9IH5WWFJfTUlEICAgICovCi0JCSIJagkxYlxuIgkJCS8qIC0+IFZYUl9MT1cgKi8KLQkJIlxuIgotCQkiMTg6CS53b3JkCTB4ZTcwZiwweDEwMDAsMHgwMDM2XG4iCS8qIHZsbSAwLDE1LDAoMSkgKi8KLQkJIjE5Ogkud29yZAkweGU3MGYsMHgxMTAwLDB4MGMzNlxuIgkvKiB2bG0gMTYsMzEsMjU2KDEpICovCi0JCSIyMDoiCi0JCToKLQkJOiBbdnhyc10gIlEiICgqKHN0cnVjdCB2eF9hcnJheSAqKSAmc3RhdGUtPnZ4cnMpLAotCQkgIFttXSAiZCIgKHN0YXRlLT5tYXNrKQorCQkiCWNoaQklW21dLDEyXG4iCS8qIEtFUk5FTF9WWFJfTUlEICovCisJCSIJam5lCTBmXG4iCQkvKiAtPiByZXN0b3JlIFY4Li5WMjMgKi8KKwkJIglWTE0JOCwyMywxMjgsMVxuIgkvKiB2bG0gJXY4LCV2MjMsMTI4KCVyMSkgKi8KKwkJIglqCTdmXG4iCisJCS8qIFRlc3QgYW5kIHJlc3RvcmUgdGhlIGZpcnN0IGhhbGYgb2YgMTYgdmVjdG9yIHJlZ2lzdGVycyAqLworCQkiMDoJdG1sbAklW21dLDZcbiIJLyogS0VSTkVMX1ZYUl9MT1cgKi8KKwkJIglqegkzZlxuIgkJLyogLT4gS0VSTkVMX1ZYUl9ISUdIICovCisJCSIJam8JMmZcbiIJCS8qIDExIC0+IHJlc3RvcmUgVjAuLlYxNSAqLworCQkiCWJyYwkyLDFmXG4iCQkvKiAxMCAtPiByZXN0b3JlIFY4Li5WMTUgKi8KKwkJIglWTE0JMCw3LDAsMVxuIgkvKiB2bG0gJXYwLCV2NywwKCVyMSkgKi8KKwkJIglqCTNmXG4iCisJCSIxOglWTE0JOCwxNSwxMjgsMVxuIgkvKiB2bG0gJXY4LCV2MTUsMTI4KCVyMSkgKi8KKwkJIglqCTNmXG4iCisJCSIyOglWTE0JMCwxNSwwLDFcbiIJLyogdmxtICV2MCwldjE1LDAoJXIxKSAqLworCQkvKiBUZXN0IGFuZCByZXN0b3JlIHRoZSBzZWNvbmQgaGFsZiBvZiAxNiB2ZWN0b3IgcmVnaXN0ZXJzICovCisJCSIzOgl0bWxsCSVbbV0sMjRcbiIJLyogS0VSTkVMX1ZYUl9ISUdIICovCisJCSIJanoJN2ZcbiIKKwkJIglqbwk2ZlxuIgkJLyogMTEgLT4gcmVzdG9yZSBWMTYuLlYzMSAqLworCQkiCWJyYwkyLDRmXG4iCQkvKiAxMCAtPiByZXN0b3JlIFYyNC4uVjMxICovCisJCSIJVkxNCTE2LDIzLDI1NiwxXG4iCS8qIHZsbSAldjE2LCV2MjMsMjU2KCVyMSkgKi8KKwkJIglqCTdmXG4iCisJCSI0OglWTE0JMjQsMzEsMzg0LDFcbiIJLyogdmxtICV2MjQsJXYzMSwzODQoJXIxKSAqLworCQkiCWoJN2ZcbiIKKwkJIjU6CVZMTQkwLDE1LDAsMVxuIgkvKiB2bG0gJXYwLCV2MTUsMCglcjEpICovCisJCSI2OglWTE0JMTYsMzEsMjU2LDFcbiIJLyogdmxtICV2MTYsJXYzMSwyNTYoJXIxKSAqLworCQkiNzoiCisJCTogW3Z4cnNdICI9USIgKCooc3RydWN0IHZ4X2FycmF5ICopICZzdGF0ZS0+dnhycykKKwkJOiBbbV0gImQiIChmbGFncykKIAkJOiAiMSIsICJjYyIpOwotCi11cGRhdGVfZnB1X3N0YXRlOgotCS8qIFVwZGF0ZSBjdXJyZW50IGtlcm5lbCBWWCBzdGF0ZSAqLwotCV9fdGhpc19jcHVfd3JpdGUoa2VybmVsX2ZwdV9zdGF0ZSwgc3RhdGUtPm1hc2spOwogfQogRVhQT1JUX1NZTUJPTChfX2tlcm5lbF9mcHVfZW5kKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL3MzOTAva2VybmVsL2Z0cmFjZS5jCmluZGV4IDBmN2JmZWIuLjYwYThhNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9mdHJhY2UuYwpAQCAtMjA5LDcgKzIwOSw4IEBACiAJLyogT25seSB0cmFjZSBpZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBleHBlY3RzIHRvLiAqLwogCWlmICghZnRyYWNlX2dyYXBoX2VudHJ5KCZ0cmFjZSkpCiAJCWdvdG8gb3V0OwotCWlmIChmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UocGFyZW50LCBpcCwgJnRyYWNlLmRlcHRoLCAwKSA9PSAtRUJVU1kpCisJaWYgKGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZShwYXJlbnQsIGlwLCAmdHJhY2UuZGVwdGgsIDAsCisJCQkJICAgICBOVUxMKSA9PSAtRUJVU1kpCiAJCWdvdG8gb3V0OwogCXBhcmVudCA9ICh1bnNpZ25lZCBsb25nKSByZXR1cm5fdG9faGFuZGxlcjsKIG91dDoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggZGQ2MzA2Yy4uZmRiNDA0MiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9rcHJvYmVzLmMKQEAgLTI2LDEyICsyNiwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3N0b3BfbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2Rpcy5oPgogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qga3Byb2JlICosIGN1cnJlbnRfa3Byb2JlKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvbm1pLmMgYi9hcmNoL3MzOTAva2VybmVsL25taS5jCmluZGV4IDI5Mzc2ZjAuLjlhMzJmNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9ubWkuYwpAQCAtOTgsNyArOTgsNyBAQAogICogcmV0dXJucyAwIGlmIGFsbCByZWdpc3RlcnMgY291bGQgYmUgdmFsaWRhdGVkCiAgKiByZXR1cm5zIDEgb3RoZXJ3aXNlCiAgKi8KLXN0YXRpYyBpbnQgbm90cmFjZSBzMzkwX3ZhbGlkYXRlX3JlZ2lzdGVycyh1bmlvbiBtY2kgbWNpKQorc3RhdGljIGludCBub3RyYWNlIHMzOTBfdmFsaWRhdGVfcmVnaXN0ZXJzKHVuaW9uIG1jaSBtY2ksIGludCB1bW9kZSkKIHsKIAlpbnQga2lsbF90YXNrOwogCXU2NCB6ZXJvOwpAQCAtMTEwLDI2ICsxMTAsNDEgQEAKIAlpZiAoIW1jaS5ncikgewogCQkvKgogCQkgKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIGNvdWxkbid0IGJlIHJlc3RvcmVkIGFuZCBoYXZlCi0JCSAqIHVua25vd24gY29udGVudHMuIFByb2Nlc3MgbmVlZHMgdG8gYmUgdGVybWluYXRlZC4KKwkJICogdW5rbm93biBjb250ZW50cy4gU3RvcCBzeXN0ZW0gb3IgdGVybWluYXRlIHByb2Nlc3MuCiAJCSAqLworCQlpZiAoIXVtb2RlKQorCQkJczM5MF9oYW5kbGVfZGFtYWdlKCk7CiAJCWtpbGxfdGFzayA9IDE7CiAJfQogCWlmICghbWNpLmZwKSB7CiAJCS8qCi0JCSAqIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBjYW4ndCBiZSByZXN0b3JlZCBhbmQKLQkJICogdGhlcmVmb3JlIHRoZSBwcm9jZXNzIG5lZWRzIHRvIGJlIHRlcm1pbmF0ZWQuCisJCSAqIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyBjYW4ndCBiZSByZXN0b3JlZC4gSWYgdGhlCisJCSAqIGtlcm5lbCBjdXJyZW50bHkgdXNlcyBmbG9hdGluZyBwb2ludCByZWdpc3RlcnMgdGhlCisJCSAqIHN5c3RlbSBpcyBzdG9wcGVkLiBJZiB0aGUgcHJvY2VzcyBoYXMgaXRzIGZsb2F0aW5nCisJCSAqIHBvaW50ZXIgcmVnaXN0ZXJzIGxvYWRlZCBpdCBpcyB0ZXJtaW5hdGVkLgorCQkgKiBPdGhlcndpc2UganVzdCByZXZhbGlkYXRlIHRoZSByZWdpc3RlcnMuCiAJCSAqLwotCQlraWxsX3Rhc2sgPSAxOworCQlpZiAoUzM5MF9sb3djb3JlLmZwdV9mbGFncyAmIEtFUk5FTF9WWFJfVjBWNykKKwkJCXMzOTBfaGFuZGxlX2RhbWFnZSgpOworCQlpZiAoIXRlc3RfY3B1X2ZsYWcoQ0lGX0ZQVSkpCisJCQlraWxsX3Rhc2sgPSAxOwogCX0KIAlmcHRfc2F2ZV9hcmVhID0gJlMzOTBfbG93Y29yZS5mbG9hdGluZ19wdF9zYXZlX2FyZWE7CiAJZnB0X2NyZWdfc2F2ZV9hcmVhID0gJlMzOTBfbG93Y29yZS5mcHRfY3JlZ19zYXZlX2FyZWE7CiAJaWYgKCFtY2kuZmMpIHsKIAkJLyoKIAkJICogRmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlciBjYW4ndCBiZSByZXN0b3JlZC4KLQkJICogVGFzayB3aWxsIGJlIHRlcm1pbmF0ZWQuCisJCSAqIElmIHRoZSBrZXJuZWwgY3VycmVudGx5IHVzZXMgdGhlIGZsb2F0aW5nIHBvaW50ZXIKKwkJICogcmVnaXN0ZXJzIGFuZCBuZWVkcyB0aGUgRlBDIHJlZ2lzdGVyIHRoZSBzeXN0ZW0gaXMKKwkJICogc3RvcHBlZC4gSWYgdGhlIHByb2Nlc3MgaGFzIGl0cyBmbG9hdGluZyBwb2ludGVyCisJCSAqIHJlZ2lzdGVycyBsb2FkZWQgaXQgaXMgdGVybWluYXRlZC4gT3RoZXJ3aWVzZSB0aGUKKwkJICogRlBDIGlzIGp1c3QgcmV2YWxpZGF0ZWQuCiAJCSAqLworCQlpZiAoUzM5MF9sb3djb3JlLmZwdV9mbGFncyAmIEtFUk5FTF9GUEMpCisJCQlzMzkwX2hhbmRsZV9kYW1hZ2UoKTsKIAkJYXNtIHZvbGF0aWxlKCJsZnBjIDAoJTApIiA6IDogImEiICgmemVybyksICJtIiAoemVybykpOwotCQlraWxsX3Rhc2sgPSAxOworCQlpZiAoIXRlc3RfY3B1X2ZsYWcoQ0lGX0ZQVSkpCisJCQlraWxsX3Rhc2sgPSAxOwogCX0gZWxzZQogCQlhc20gdm9sYXRpbGUoImxmcGMgMCglMCkiIDogOiAiYSIgKGZwdF9jcmVnX3NhdmVfYXJlYSkpOwogCkBAIC0xNTksMTAgKzE3NCwxNiBAQAogCiAJCWlmICghbWNpLnZyKSB7CiAJCQkvKgotCQkJICogVmVjdG9yIHJlZ2lzdGVycyBjYW4ndCBiZSByZXN0b3JlZCBhbmQgdGhlcmVmb3JlCi0JCQkgKiB0aGUgcHJvY2VzcyBuZWVkcyB0byBiZSB0ZXJtaW5hdGVkLgorCQkJICogVmVjdG9yIHJlZ2lzdGVycyBjYW4ndCBiZSByZXN0b3JlZC4gSWYgdGhlIGtlcm5lbAorCQkJICogY3VycmVudGx5IHVzZXMgdmVjdG9yIHJlZ2lzdGVycyB0aGUgc3lzdGVtIGlzCisJCQkgKiBzdG9wcGVkLiBJZiB0aGUgcHJvY2VzcyBoYXMgaXRzIHZlY3RvciByZWdpc3RlcnMKKwkJCSAqIGxvYWRlZCBpdCBpcyB0ZXJtaW5hdGVkLiBPdGhlcndpc2UganVzdCByZXZhbGlkYXRlCisJCQkgKiB0aGUgcmVnaXN0ZXJzLgogCQkJICovCi0JCQlraWxsX3Rhc2sgPSAxOworCQkJaWYgKFMzOTBfbG93Y29yZS5mcHVfZmxhZ3MgJiBLRVJORUxfVlhSKQorCQkJCXMzOTBfaGFuZGxlX2RhbWFnZSgpOworCQkJaWYgKCF0ZXN0X2NwdV9mbGFnKENJRl9GUFUpKQorCQkJCWtpbGxfdGFzayA9IDE7CiAJCX0KIAkJY3IwLnZhbCA9IFMzOTBfbG93Y29yZS5jcmVnc19zYXZlX2FyZWFbMF07CiAJCWNyMC5hZnAgPSBjcjAudnggPSAxOwpAQCAtMjUwLDEzICsyNzEsMTEgQEAKIAlzdHJ1Y3QgbWNja19zdHJ1Y3QgKm1jY2s7CiAJdW5zaWduZWQgbG9uZyBsb25nIHRtcDsKIAl1bmlvbiBtY2kgbWNpOwotCWludCB1bW9kZTsKIAogCW5taV9lbnRlcigpOwogCWluY19pcnFfc3RhdChOTUlfTk1JKTsKIAltY2kudmFsID0gUzM5MF9sb3djb3JlLm1jY2tfaW50ZXJydXB0aW9uX2NvZGU7CiAJbWNjayA9IHRoaXNfY3B1X3B0cigmY3B1X21jY2spOwotCXVtb2RlID0gdXNlcl9tb2RlKHJlZ3MpOwogCiAJaWYgKG1jaS5zZCkgewogCQkvKiBTeXN0ZW0gZGFtYWdlIC0+IHN0b3BwaW5nIG1hY2hpbmUgKi8KQEAgLTI5NywyMiArMzE2LDE0IEBACiAJCQlzMzkwX2hhbmRsZV9kYW1hZ2UoKTsKIAkJfQogCX0KLQlpZiAoczM5MF92YWxpZGF0ZV9yZWdpc3RlcnMobWNpKSkgewotCQlpZiAodW1vZGUpIHsKLQkJCS8qCi0JCQkgKiBDb3VsZG4ndCByZXN0b3JlIGFsbCByZWdpc3RlciBjb250ZW50cyB3aGlsZSBpbgotCQkJICogdXNlciBtb2RlIC0+IG1hcmsgdGFzayBmb3IgdGVybWluYXRpb24uCi0JCQkgKi8KLQkJCW1jY2stPmtpbGxfdGFzayA9IDE7Ci0JCQltY2NrLT5tY2NrX2NvZGUgPSBtY2kudmFsOwotCQkJc2V0X2NwdV9mbGFnKENJRl9NQ0NLX1BFTkRJTkcpOwotCQl9IGVsc2UgewotCQkJLyoKLQkJCSAqIENvdWxkbid0IHJlc3RvcmUgYWxsIHJlZ2lzdGVyIGNvbnRlbnRzIHdoaWxlIGluCi0JCQkgKiBrZXJuZWwgbW9kZSAtPiBzdG9wcGluZyBtYWNoaW5lLgotCQkJICovCi0JCQlzMzkwX2hhbmRsZV9kYW1hZ2UoKTsKLQkJfQorCWlmIChzMzkwX3ZhbGlkYXRlX3JlZ2lzdGVycyhtY2ksIHVzZXJfbW9kZShyZWdzKSkpIHsKKwkJLyoKKwkJICogQ291bGRuJ3QgcmVzdG9yZSBhbGwgcmVnaXN0ZXIgY29udGVudHMgZm9yIHRoZQorCQkgKiB1c2VyIHNwYWNlIHByb2Nlc3MgLT4gbWFyayB0YXNrIGZvciB0ZXJtaW5hdGlvbi4KKwkJICovCisJCW1jY2stPmtpbGxfdGFzayA9IDE7CisJCW1jY2stPm1jY2tfY29kZSA9IG1jaS52YWw7CisJCXNldF9jcHVfZmxhZyhDSUZfTUNDS19QRU5ESU5HKTsKIAl9CiAJaWYgKG1jaS5jZCkgewogCQkvKiBUaW1pbmcgZmFjaWxpdHkgZGFtYWdlICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3N5c2luZm8uYyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzaW5mby5jCmluZGV4IDA1MGI4ZDAuLmJmZGE2YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc3lzaW5mby5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzaW5mby5jCkBAIC00NTQsNyArNDU0LDcgQEAKIAkJCTogIlEiIChpbmZvLT5jYXBhYmlsaXR5KSwgImQiICgxMDAwMDAwMCksICJkIiAoMCkKIAkJCTogImNjIgogCQkJKTsKLQkJa2VybmVsX2ZwdV9lbmQoJmZwdSk7CisJCWtlcm5lbF9mcHVfZW5kKCZmcHUsIEtFUk5FTF9GUFIpOwogCX0gZWxzZQogCQkvKgogCQkgKiBSZWFsbHkgb2xkIG1hY2hpbmUgd2l0aG91dCBzdHNpIGJsb2NrIGZvciBiYXNpYwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwppbmRleCA0ZTk5NDk4Li4wYmZjYzQ5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RpbWUuYwpAQCAtNTAsMTAgKzUwLDYgQEAKICNpbmNsdWRlIDxhc20vY2lvLmg+CiAjaW5jbHVkZSAiZW50cnkuaCIKIAotLyogY2hhbmdlIHRoaXMgaWYgeW91IGhhdmUgc29tZSBjb25zdGFudCB0aW1lIGRyaWZ0ICovCi0jZGVmaW5lIFVTRUNTX1BFUl9KSUZGWSAgICAgKCh1bnNpZ25lZCBsb25nKSAxMDAwMDAwL0haKQotI2RlZmluZSBDTEtfVElDS1NfUEVSX0pJRkZZICgodW5zaWduZWQgbG9uZykgVVNFQ1NfUEVSX0pJRkZZIDw8IDEyKQotCiB1NjQgc2NoZWRfY2xvY2tfYmFzZV9jYyA9IC0xOwkvKiBGb3JjZSB0byBkYXRhIHNlY3Rpb24uICovCiBFWFBPUlRfU1lNQk9MX0dQTChzY2hlZF9jbG9ja19iYXNlX2NjKTsKIApAQCAtMjgyLDEzICsyNzgsOCBAQAogCiB2b2lkIHVwZGF0ZV92c3lzY2FsbF90eih2b2lkKQogewotCS8qIE1ha2UgdXNlcnNwYWNlIGdldHRpbWVvZmRheSBzcGluIHVudGlsIHdlJ3JlIGRvbmUuICovCi0JKyt2ZHNvX2RhdGEtPnRiX3VwZGF0ZV9jb3VudDsKLQlzbXBfd21iKCk7CiAJdmRzb19kYXRhLT50el9taW51dGVzd2VzdCA9IHN5c190ei50el9taW51dGVzd2VzdDsKIAl2ZHNvX2RhdGEtPnR6X2RzdHRpbWUgPSBzeXNfdHoudHpfZHN0dGltZTsKLQlzbXBfd21iKCk7Ci0JKyt2ZHNvX2RhdGEtPnRiX3VwZGF0ZV9jb3VudDsKIH0KIAogLyoKQEAgLTMxOCw1MSArMzA5LDEyIEBACiAJdnRpbWVfaW5pdCgpOwogfQogCi0vKgotICogVGhlIHRpbWUgaXMgImNsb2NrIi4gb2xkIGlzIHdoYXQgd2UgdGhpbmsgdGhlIHRpbWUgaXMuCi0gKiBBZGp1c3QgdGhlIHZhbHVlIGJ5IGEgbXVsdGlwbGUgb2YgamlmZmllcyBhbmQgYWRkIHRoZSBkZWx0YSB0byBudHAuCi0gKiAiZGVsYXkiIGlzIGFuIGFwcHJveGltYXRpb24gaG93IGxvbmcgdGhlIHN5bmNocm9uaXphdGlvbiB0b29rLiBJZgotICogdGhlIHRpbWUgY29ycmVjdGlvbiBpcyBwb3NpdGl2ZSwgdGhlbiAiZGVsYXkiIGlzIHN1YnRyYWN0ZWQgZnJvbQotICogdGhlIHRpbWUgZGlmZmVyZW5jZSBhbmQgb25seSB0aGUgcmVtYWluaW5nIHBhcnQgaXMgcGFzc2VkIHRvIG50cC4KLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBhZGp1c3RfdGltZSh1bnNpZ25lZCBsb25nIGxvbmcgb2xkLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBjbG9jaywKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgZGVsYXkpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhLCB0aWNrczsKLQlzdHJ1Y3QgdGltZXggYWRqdXN0OwotCi0JaWYgKGNsb2NrID4gb2xkKSB7Ci0JCS8qIEl0IGlzIGxhdGVyIHRoYW4gd2UgdGhvdWdodC4gKi8KLQkJZGVsdGEgPSB0aWNrcyA9IGNsb2NrIC0gb2xkOwotCQlkZWx0YSA9IHRpY2tzID0gKGRlbHRhIDwgZGVsYXkpID8gMCA6IGRlbHRhIC0gZGVsYXk7Ci0JCWRlbHRhIC09IGRvX2Rpdih0aWNrcywgQ0xLX1RJQ0tTX1BFUl9KSUZGWSk7Ci0JCWFkanVzdC5vZmZzZXQgPSB0aWNrcyAqICgxMDAwMDAwIC8gSFopOwotCX0gZWxzZSB7Ci0JCS8qIEl0IGlzIGVhcmxpZXIgdGhhbiB3ZSB0aG91Z2h0LiAqLwotCQlkZWx0YSA9IHRpY2tzID0gb2xkIC0gY2xvY2s7Ci0JCWRlbHRhIC09IGRvX2Rpdih0aWNrcywgQ0xLX1RJQ0tTX1BFUl9KSUZGWSk7Ci0JCWRlbHRhID0gLWRlbHRhOwotCQlhZGp1c3Qub2Zmc2V0ID0gLXRpY2tzICogKDEwMDAwMDAgLyBIWik7Ci0JfQotCXNjaGVkX2Nsb2NrX2Jhc2VfY2MgKz0gZGVsdGE7Ci0JaWYgKGFkanVzdC5vZmZzZXQgIT0gMCkgewotCQlwcl9ub3RpY2UoIlRoZSBFVFIgaW50ZXJmYWNlIGhhcyBhZGp1c3RlZCB0aGUgY2xvY2sgIgotCQkJICAiYnkgJWxpIG1pY3Jvc2Vjb25kc1xuIiwgYWRqdXN0Lm9mZnNldCk7Ci0JCWFkanVzdC5tb2RlcyA9IEFESl9PRkZTRVRfU0lOR0xFU0hPVDsKLQkJZG9fYWRqdGltZXgoJmFkanVzdCk7Ci0JfQotCXJldHVybiBkZWx0YTsKLX0KLQogc3RhdGljIERFRklORV9QRVJfQ1BVKGF0b21pY190LCBjbG9ja19zeW5jX3dvcmQpOwogc3RhdGljIERFRklORV9NVVRFWChjbG9ja19zeW5jX211dGV4KTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGNsb2NrX3N5bmNfZmxhZ3M7CiAKLSNkZWZpbmUgQ0xPQ0tfU1lOQ19IQVNfRVRSCTAKLSNkZWZpbmUgQ0xPQ0tfU1lOQ19IQVNfU1RQCTEKLSNkZWZpbmUgQ0xPQ0tfU1lOQ19FVFIJCTIKLSNkZWZpbmUgQ0xPQ0tfU1lOQ19TVFAJCTMKKyNkZWZpbmUgQ0xPQ0tfU1lOQ19IQVNfU1RQCTAKKyNkZWZpbmUgQ0xPQ0tfU1lOQ19TVFAJCTEKIAogLyoKICAqIFRoZSBnZXRfY2xvY2sgZnVuY3Rpb24gZm9yIHRoZSBwaHlzaWNhbCBjbG9jay4gSXQgd2lsbCBnZXQgdGhlIGN1cnJlbnQKQEAgLTM4NCwzNCArMzM2LDMyIEBACiAJaWYgKHN3MCA9PSBzdzEgJiYgKHN3MCAmIDB4ODAwMDAwMDBVKSkKIAkJLyogU3VjY2VzczogdGltZSBpcyBpbiBzeW5jLiAqLwogCQlyZXR1cm4gMDsKLQlpZiAoIXRlc3RfYml0KENMT0NLX1NZTkNfSEFTX0VUUiwgJmNsb2NrX3N5bmNfZmxhZ3MpICYmCi0JICAgICF0ZXN0X2JpdChDTE9DS19TWU5DX0hBU19TVFAsICZjbG9ja19zeW5jX2ZsYWdzKSkKKwlpZiAoIXRlc3RfYml0KENMT0NLX1NZTkNfSEFTX1NUUCwgJmNsb2NrX3N5bmNfZmxhZ3MpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JaWYgKCF0ZXN0X2JpdChDTE9DS19TWU5DX0VUUiwgJmNsb2NrX3N5bmNfZmxhZ3MpICYmCi0JICAgICF0ZXN0X2JpdChDTE9DS19TWU5DX1NUUCwgJmNsb2NrX3N5bmNfZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoQ0xPQ0tfU1lOQ19TVFAsICZjbG9ja19zeW5jX2ZsYWdzKSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAJcmV0dXJuIC1FQUdBSU47CiB9CiBFWFBPUlRfU1lNQk9MKGdldF9waHlzX2Nsb2NrKTsKIAogLyoKLSAqIE1ha2UgZ2V0X3N5bmNfY2xvY2sgcmV0dXJuIC1FQUdBSU4uCisgKiBNYWtlIGdldF9waHlzX2Nsb2NrKCkgcmV0dXJuIC1FQUdBSU4uCiAgKi8KIHN0YXRpYyB2b2lkIGRpc2FibGVfc3luY19jbG9jayh2b2lkICpkdW1teSkKIHsKIAlhdG9taWNfdCAqc3dfcHRyID0gdGhpc19jcHVfcHRyKCZjbG9ja19zeW5jX3dvcmQpOwogCS8qCi0JICogQ2xlYXIgdGhlIGluLXN5bmMgYml0IDJeMzEuIEFsbCBnZXRfc3luY19jbG9jayBjYWxscyB3aWxsCisJICogQ2xlYXIgdGhlIGluLXN5bmMgYml0IDJeMzEuIEFsbCBnZXRfcGh5c19jbG9jayBjYWxscyB3aWxsCiAJICogZmFpbCB1bnRpbCB0aGUgc3luYyBiaXQgaXMgdHVybmVkIGJhY2sgb24uIEluIGFkZGl0aW9uCiAJICogaW5jcmVhc2UgdGhlICJzZXF1ZW5jZSIgY291bnRlciB0byBhdm9pZCB0aGUgcmFjZSBvZiBhbgotCSAqIGV0ciBldmVudCBhbmQgdGhlIGNvbXBsZXRlIHJlY292ZXJ5IGFnYWluc3QgZ2V0X3N5bmNfY2xvY2suCisJICogc3RwIGV2ZW50IGFuZCB0aGUgY29tcGxldGUgcmVjb3ZlcnkgYWdhaW5zdCBnZXRfcGh5c19jbG9jay4KIAkgKi8KIAlhdG9taWNfYW5kbm90KDB4ODAwMDAwMDAsIHN3X3B0cik7CiAJYXRvbWljX2luYyhzd19wdHIpOwogfQogCiAvKgotICogTWFrZSBnZXRfc3luY19jbG9jayByZXR1cm4gMCBhZ2Fpbi4KKyAqIE1ha2UgZ2V0X3BoeXNfY2xvY2soKSByZXR1cm4gMCBhZ2Fpbi4KICAqIE5lZWRzIHRvIGJlIGNhbGxlZCBmcm9tIGEgY29udGV4dCBkaXNhYmxlZCBmb3IgcHJlZW1wdGlvbi4KICAqLwogc3RhdGljIHZvaWQgZW5hYmxlX3N5bmNfY2xvY2sodm9pZCkKQEAgLTQzNCw3ICszODQsNyBAQAogCXJldHVybiByYzsKIH0KIAotLyogU2luZ2xlIHRocmVhZGVkIHdvcmtxdWV1ZSB1c2VkIGZvciBldHIgYW5kIHN0cCBzeW5jIGV2ZW50cyAqLworLyogU2luZ2xlIHRocmVhZGVkIHdvcmtxdWV1ZSB1c2VkIGZvciBzdHAgc3luYyBldmVudHMgKi8KIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdGltZV9zeW5jX3dxOwogCiBzdGF0aWMgdm9pZCBfX2luaXQgdGltZV9pbml0X3dxKHZvaWQpCkBAIC00NDgsMjAgKzM5OCwxMiBAQAogCWF0b21pY190IGNwdXM7CiAJaW50IGluX3N5bmM7CiAJdW5zaWduZWQgbG9uZyBsb25nIGZpeHVwX2NjOwotCWludCBldHJfcG9ydDsKLQlzdHJ1Y3QgZXRyX2FpYiAqZXRyX2FpYjsKIH07CiAKIHN0YXRpYyB2b2lkIGNsb2NrX3N5bmNfY3B1KHN0cnVjdCBjbG9ja19zeW5jX2RhdGEgKnN5bmMpCiB7CiAJYXRvbWljX2RlYygmc3luYy0+Y3B1cyk7CiAJZW5hYmxlX3N5bmNfY2xvY2soKTsKLQkvKgotCSAqIFRoaXMgbG9va3MgbGlrZSBhIGJ1c3kgd2FpdCBsb29wIGJ1dCBpdCBpc24ndC4gZXRyX3N5bmNfY3B1cwotCSAqIGlzIGNhbGxlZCBvbiBhbGwgb3RoZXIgY3B1cyB3aGlsZSB0aGUgVE9EIGNsb2NrcyBpcyBzdG9wcGVkLgotCSAqIF9fdWRlbGF5IHdpbGwgc3RvcCB0aGUgY3B1IG9uIGFuIGVuYWJsZWQgd2FpdCBwc3cgdW50aWwgdGhlCi0JICogVE9EIGlzIHJ1bm5pbmcgYWdhaW4uCi0JICovCiAJd2hpbGUgKHN5bmMtPmluX3N5bmMgPT0gMCkgewogCQlfX3VkZWxheSgxKTsKIAkJLyoKQEAgLTU4Miw3ICs1MjQsNyBAQAogc3RhdGljIGludCBzdHBfc3luY19jbG9jayh2b2lkICpkYXRhKQogewogCXN0YXRpYyBpbnQgZmlyc3Q7Ci0JdW5zaWduZWQgbG9uZyBsb25nIG9sZF9jbG9jaywgZGVsdGEsIG5ld19jbG9jaywgY2xvY2tfZGVsdGE7CisJdW5zaWduZWQgbG9uZyBsb25nIGNsb2NrX2RlbHRhOwogCXN0cnVjdCBjbG9ja19zeW5jX2RhdGEgKnN0cF9zeW5jOwogCXN0cnVjdCBwdGZmX3F0byBxdG87CiAJaW50IHJjOwpAQCAtNjA1LDE4ICs1NDcsMTggQEAKIAlpZiAoc3RwX2luZm8udG9kb2ZmWzBdIHx8IHN0cF9pbmZvLnRvZG9mZlsxXSB8fAogCSAgICBzdHBfaW5mby50b2RvZmZbMl0gfHwgc3RwX2luZm8udG9kb2ZmWzNdIHx8CiAJICAgIHN0cF9pbmZvLnRtZCAhPSAyKSB7Ci0JCW9sZF9jbG9jayA9IGdldF90b2RfY2xvY2soKTsKIAkJcmMgPSBjaHNjX3NzdHBjKHN0cF9wYWdlLCBTVFBfT1BfU1lOQywgMCwgJmNsb2NrX2RlbHRhKTsKIAkJaWYgKHJjID09IDApIHsKLQkJCW5ld19jbG9jayA9IG9sZF9jbG9jayArIGNsb2NrX2RlbHRhOwotCQkJZGVsdGEgPSBhZGp1c3RfdGltZShvbGRfY2xvY2ssIG5ld19jbG9jaywgMCk7CisJCQkvKiBmaXh1cCB0aGUgbW9ub3RvbmljIHNjaGVkIGNsb2NrICovCisJCQlzY2hlZF9jbG9ja19iYXNlX2NjICs9IGNsb2NrX2RlbHRhOwogCQkJaWYgKHB0ZmZfcXVlcnkoUFRGRl9RVE8pICYmCiAJCQkgICAgcHRmZigmcXRvLCBzaXplb2YocXRvKSwgUFRGRl9RVE8pID09IDApCiAJCQkJLyogVXBkYXRlIExQQVIgb2Zmc2V0ICovCiAJCQkJbHBhcl9vZmZzZXQgPSBxdG8udG9kX2Vwb2NoX2RpZmZlcmVuY2U7CiAJCQlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmczM5MF9lcG9jaF9kZWx0YV9ub3RpZmllciwKIAkJCQkJCSAgIDAsICZjbG9ja19kZWx0YSk7Ci0JCQlmaXh1cF9jbG9ja19jb21wYXJhdG9yKGRlbHRhKTsKKwkJCXN0cF9zeW5jLT5maXh1cF9jYyA9IGNsb2NrX2RlbHRhOworCQkJZml4dXBfY2xvY2tfY29tcGFyYXRvcihjbG9ja19kZWx0YSk7CiAJCQlyYyA9IGNoc2Nfc3N0cGkoc3RwX3BhZ2UsICZzdHBfaW5mbywKIAkJCQkJc2l6ZW9mKHN0cnVjdCBzdHBfc3N0cGkpKTsKIAkJCWlmIChyYyA9PSAwICYmIHN0cF9pbmZvLnRtZCAhPSAyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCmluZGV4IGRkOTdhM2UuLmQwNTM5ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKQEAgLTE0LDExICsxNCwxMiBAQAogICovCiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2ZwdS9hcGkuaD4KICNpbmNsdWRlICJlbnRyeS5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3Zkc28zMi9NYWtlZmlsZSBiL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL01ha2VmaWxlCmluZGV4IDY4MTQ1NDUuLjZjYzk0NzggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdmRzbzMyL01ha2VmaWxlCkBAIC0yNCw4ICsyNCw5IEBACiBleHRyYS15ICs9IHZkc28zMi5sZHMKIENQUEZMQUdTX3Zkc28zMi5sZHMgKz0gLVAgLUMgLVUkKEFSQ0gpCiAKLSMgRGlzYWJsZSBnY292IHByb2ZpbGluZyBmb3IgVkRTTyBjb2RlCisjIERpc2FibGUgZ2NvdiBwcm9maWxpbmcgYW5kIHVic2FuIGZvciBWRFNPIGNvZGUKIEdDT1ZfUFJPRklMRSA6PSBuCitVQlNBTl9TQU5JVElaRSA6PSBuCiAKICMgRm9yY2UgZGVwZW5kZW5jeSAoaW5jYmluIGlzIGJhZCkKICQob2JqKS92ZHNvMzJfd3JhcHBlci5vIDogJChvYmopL3Zkc28zMi5zbwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC92ZHNvNjQvTWFrZWZpbGUgYi9hcmNoL3MzOTAva2VybmVsL3Zkc282NC9NYWtlZmlsZQppbmRleCAwYjBmZDIyLi4yZDU0YzE4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Zkc282NC9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAva2VybmVsL3Zkc282NC9NYWtlZmlsZQpAQCAtMjQsOCArMjQsOSBAQAogZXh0cmEteSArPSB2ZHNvNjQubGRzCiBDUFBGTEFHU192ZHNvNjQubGRzICs9IC1QIC1DIC1VJChBUkNIKQogCi0jIERpc2FibGUgZ2NvdiBwcm9maWxpbmcgZm9yIFZEU08gY29kZQorIyBEaXNhYmxlIGdjb3YgcHJvZmlsaW5nIGFuZCB1YnNhbiBmb3IgVkRTTyBjb2RlCiBHQ09WX1BST0ZJTEUgOj0gbgorVUJTQU5fU0FOSVRJWkUgOj0gbgogCiAjIEZvcmNlIGRlcGVuZGVuY3kgKGluY2JpbiBpcyBiYWQpCiAkKG9iaikvdmRzbzY0X3dyYXBwZXIubyA6ICQob2JqKS92ZHNvNjQuc28KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vZ2FjY2Vzcy5jIGIvYXJjaC9zMzkwL2t2bS9nYWNjZXNzLmMKaW5kZXggNTQyMDAyMC4uNGFhOGE3ZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9nYWNjZXNzLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9nYWNjZXNzLmMKQEAgLTQ5NSw2ICs0OTUsMTggQEAKIAl0ZWMgPSAoc3RydWN0IHRyYW5zX2V4Y19jb2RlX2JpdHMgKikmcGdtLT50cmFuc19leGNfY29kZTsKIAogCXN3aXRjaCAoY29kZSkgeworCWNhc2UgUEdNX1BST1RFQ1RJT046CisJCXN3aXRjaCAocHJvdCkgeworCQljYXNlIFBST1RfVFlQRV9BTEM6CisJCQl0ZWMtPmI2MCA9IDE7CisJCQkvKiBGQUxMIFRIUk9VR0ggKi8KKwkJY2FzZSBQUk9UX1RZUEVfREFUOgorCQkJdGVjLT5iNjEgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIExBIGFuZCBLRVlDIHNldCBiNjEgdG8gMCwgb3RoZXIgcGFyYW1zIHVuZGVmaW5lZCAqLworCQkJcmV0dXJuIGNvZGU7CisJCX0KKwkJLyogRkFMTCBUSFJPVUdIICovCiAJY2FzZSBQR01fQVNDRV9UWVBFOgogCWNhc2UgUEdNX1BBR0VfVFJBTlNMQVRJT046CiAJY2FzZSBQR01fUkVHSU9OX0ZJUlNUX1RSQU5TOgpAQCAtNTA0LDggKzUxNiw3IEBACiAJCS8qCiAJCSAqIG9wX2FjY2Vzc19pZCBvbmx5IGFwcGxpZXMgdG8gTU9WRV9QQUdFIC0+IHNldCBiaXQgNjEKIAkJICogZXhjX2FjY2Vzc19pZCBoYXMgdG8gYmUgc2V0IHRvIDAgZm9yIHNvbWUgaW5zdHJ1Y3Rpb25zLiBCb3RoCi0JCSAqIGNhc2VzIGhhdmUgdG8gYmUgaGFuZGxlZCBieSB0aGUgY2FsbGVyLiBXZSBjYW4gYWx3YXlzIHN0b3JlCi0JCSAqIGV4Y19hY2Nlc3NfaWQsIGFzIGl0IGlzIHVuZGVmaW5lZCBmb3Igbm9uLWFyIGNhc2VzLgorCQkgKiBjYXNlcyBoYXZlIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGNhbGxlci4KIAkJICovCiAJCXRlYy0+YWRkciA9IGd2YSA+PiBQQUdFX1NISUZUOwogCQl0ZWMtPmZzaSA9IG1vZGUgPT0gR0FDQ19TVE9SRSA/IEZTSV9TVE9SRSA6IEZTSV9GRVRDSDsKQEAgLTUxNiwyNSArNTI3LDEzIEBACiAJY2FzZSBQR01fQVNURV9WQUxJRElUWToKIAljYXNlIFBHTV9BU1RFX1NFUVVFTkNFOgogCWNhc2UgUEdNX0VYVEVOREVEX0FVVEhPUklUWToKKwkJLyoKKwkJICogV2UgY2FuIGFsd2F5cyBzdG9yZSBleGNfYWNjZXNzX2lkLCBhcyBpdCBpcworCQkgKiB1bmRlZmluZWQgZm9yIG5vbi1hciBjYXNlcy4gSXQgaXMgdW5kZWZpbmVkIGZvcgorCQkgKiBtb3N0IERBVCBwcm90ZWN0aW9uIGV4Y2VwdGlvbnMuCisJCSAqLwogCQlwZ20tPmV4Y19hY2Nlc3NfaWQgPSBhcjsKIAkJYnJlYWs7Ci0JY2FzZSBQR01fUFJPVEVDVElPTjoKLQkJc3dpdGNoIChwcm90KSB7Ci0JCWNhc2UgUFJPVF9UWVBFX0FMQzoKLQkJCXRlYy0+YjYwID0gMTsKLQkJCS8qIEZBTEwgVEhST1VHSCAqLwotCQljYXNlIFBST1RfVFlQRV9EQVQ6Ci0JCQl0ZWMtPmI2MSA9IDE7Ci0JCQl0ZWMtPmFkZHIgPSBndmEgPj4gUEFHRV9TSElGVDsKLQkJCXRlYy0+ZnNpID0gbW9kZSA9PSBHQUNDX1NUT1JFID8gRlNJX1NUT1JFIDogRlNJX0ZFVENIOwotCQkJdGVjLT5hcyA9IHBzd19iaXRzKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3KS5hczsKLQkJCS8qIGV4Y19hY2Nlc3NfaWQgaXMgdW5kZWZpbmVkIGZvciBtb3N0IGNhc2VzICovCi0JCQlwZ20tPmV4Y19hY2Nlc3NfaWQgPSBhcjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OiAvKiBMQSBhbmQgS0VZQyBzZXQgYjYxIHRvIDAsIG90aGVyIHBhcmFtcyB1bmRlZmluZWQgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwogCX0KIAlyZXR1cm4gY29kZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vZ3Vlc3RkYmcuYyBiL2FyY2gvczM5MC9rdm0vZ3Vlc3RkYmcuYwppbmRleCAzMWEwNTMzLi5kN2M2YTdmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2d1ZXN0ZGJnLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9ndWVzdGRiZy5jCkBAIC0yMDYsNyArMjA2LDcgQEAKIGludCBrdm1fczM5MF9pbXBvcnRfYnBfZGF0YShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkgICAgc3RydWN0IGt2bV9ndWVzdF9kZWJ1ZyAqZGJnKQogewotCWludCByZXQgPSAwLCBucl93cCA9IDAsIG5yX2JwID0gMCwgaSwgc2l6ZTsKKwlpbnQgcmV0ID0gMCwgbnJfd3AgPSAwLCBucl9icCA9IDAsIGk7CiAJc3RydWN0IGt2bV9od19icmVha3BvaW50ICpicF9kYXRhID0gTlVMTDsKIAlzdHJ1Y3Qga3ZtX2h3X3dwX2luZm9fYXJjaCAqd3BfaW5mbyA9IE5VTEw7CiAJc3RydWN0IGt2bV9od19icF9pbmZvX2FyY2ggKmJwX2luZm8gPSBOVUxMOwpAQCAtMjE2LDE3ICsyMTYsMTAgQEAKIAllbHNlIGlmIChkYmctPmFyY2gubnJfaHdfYnAgPiBNQVhfQlBfQ09VTlQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc2l6ZSA9IGRiZy0+YXJjaC5ucl9od19icCAqIHNpemVvZihzdHJ1Y3Qga3ZtX2h3X2JyZWFrcG9pbnQpOwotCWJwX2RhdGEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghYnBfZGF0YSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihicF9kYXRhLCBkYmctPmFyY2guaHdfYnAsIHNpemUpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gZXJyb3I7Ci0JfQorCWJwX2RhdGEgPSBtZW1kdXBfdXNlcihkYmctPmFyY2guaHdfYnAsCisJCQkgICAgICBzaXplb2YoKmJwX2RhdGEpICogZGJnLT5hcmNoLm5yX2h3X2JwKTsKKwlpZiAoSVNfRVJSKGJwX2RhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihicF9kYXRhKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkYmctPmFyY2gubnJfaHdfYnA7IGkrKykgewogCQlzd2l0Y2ggKGJwX2RhdGFbaV0udHlwZSkgewpAQCAtMjQxLDE3ICsyMzQsMTkgQEAKIAkJfQogCX0KIAotCXNpemUgPSBucl93cCAqIHNpemVvZihzdHJ1Y3Qga3ZtX2h3X3dwX2luZm9fYXJjaCk7Ci0JaWYgKHNpemUgPiAwKSB7Ci0JCXdwX2luZm8gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChucl93cCA+IDApIHsKKwkJd3BfaW5mbyA9IGttYWxsb2NfYXJyYXkobnJfd3AsCisJCQkJCXNpemVvZigqd3BfaW5mbyksCisJCQkJCUdGUF9LRVJORUwpOwogCQlpZiAoIXdwX2luZm8pIHsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycm9yOwogCQl9CiAJfQotCXNpemUgPSBucl9icCAqIHNpemVvZihzdHJ1Y3Qga3ZtX2h3X2JwX2luZm9fYXJjaCk7Ci0JaWYgKHNpemUgPiAwKSB7Ci0JCWJwX2luZm8gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChucl9icCA+IDApIHsKKwkJYnBfaW5mbyA9IGttYWxsb2NfYXJyYXkobnJfYnAsCisJCQkJCXNpemVvZigqYnBfaW5mbyksCisJCQkJCUdGUF9LRVJORUwpOwogCQlpZiAoIWJwX2luZm8pIHsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycm9yOwpAQCAtMzgyLDE0ICszNzcsMjAgQEAKIAl2Y3B1LT5ndWVzdF9kZWJ1ZyAmPSB+S1ZNX0dVRVNUREJHX0VYSVRfUEVORElORzsKIH0KIAorI2RlZmluZSBQRVJfQ09ERV9NQVNLCQkoUEVSX0VWRU5UX01BU0sgPj4gMjQpCisjZGVmaW5lIFBFUl9DT0RFX0JSQU5DSAkJKFBFUl9FVkVOVF9CUkFOQ0ggPj4gMjQpCisjZGVmaW5lIFBFUl9DT0RFX0lGRVRDSAkJKFBFUl9FVkVOVF9JRkVUQ0ggPj4gMjQpCisjZGVmaW5lIFBFUl9DT0RFX1NUT1JFCQkoUEVSX0VWRU5UX1NUT1JFID4+IDI0KQorI2RlZmluZSBQRVJfQ09ERV9TVE9SRV9SRUFMCShQRVJfRVZFTlRfU1RPUkVfUkVBTCA+PiAyNCkKKwogI2RlZmluZSBwZXJfYnBfZXZlbnQoY29kZSkgXAotCQkJKGNvZGUgJiAoUEVSX0VWRU5UX0lGRVRDSCB8IFBFUl9FVkVOVF9CUkFOQ0gpKQorCQkJKGNvZGUgJiAoUEVSX0NPREVfSUZFVENIIHwgUEVSX0NPREVfQlJBTkNIKSkKICNkZWZpbmUgcGVyX3dyaXRlX3dwX2V2ZW50KGNvZGUpIFwKLQkJCShjb2RlICYgKFBFUl9FVkVOVF9TVE9SRSB8IFBFUl9FVkVOVF9TVE9SRV9SRUFMKSkKKwkJCShjb2RlICYgKFBFUl9DT0RFX1NUT1JFIHwgUEVSX0NPREVfU1RPUkVfUkVBTCkpCiAKIHN0YXRpYyBpbnQgZGVidWdfZXhpdF9yZXF1aXJlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JdTMyIHBlcmMgPSAodmNwdS0+YXJjaC5zaWVfYmxvY2stPnBlcmMgPDwgMjQpOworCXU4IHBlcmMgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+cGVyYzsKIAlzdHJ1Y3Qga3ZtX2RlYnVnX2V4aXRfYXJjaCAqZGVidWdfZXhpdCA9ICZ2Y3B1LT5ydW4tPmRlYnVnLmFyY2g7CiAJc3RydWN0IGt2bV9od193cF9pbmZvX2FyY2ggKndwX2luZm8gPSBOVUxMOwogCXN0cnVjdCBrdm1faHdfYnBfaW5mb19hcmNoICpicF9pbmZvID0gTlVMTDsKQEAgLTQ0NCw3ICs0NDUsNyBAQAogCWNvbnN0IHU4IGlsZW4gPSBrdm1fczM5MF9nZXRfaWxlbih2Y3B1KTsKIAlzdHJ1Y3Qga3ZtX3MzOTBfcGdtX2luZm8gcGdtX2luZm8gPSB7CiAJCS5jb2RlID0gUEdNX1BFUiwKLQkJLnBlcl9jb2RlID0gUEVSX0VWRU5UX0lGRVRDSCA+PiAyNCwKKwkJLnBlcl9jb2RlID0gUEVSX0NPREVfSUZFVENILAogCQkucGVyX2FkZHJlc3MgPSBfX3Jld2luZF9wc3codmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3csIGlsZW4pLAogCX07CiAKQEAgLTQ1OCwzMyArNDU5LDMzIEBACiAKIHN0YXRpYyB2b2lkIGZpbHRlcl9ndWVzdF9wZXJfZXZlbnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXUzMiBwZXJjID0gdmNwdS0+YXJjaC5zaWVfYmxvY2stPnBlcmMgPDwgMjQ7CisJY29uc3QgdTggcGVyYyA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5wZXJjOwogCXU2NCBwZXJhZGRyID0gdmNwdS0+YXJjaC5zaWVfYmxvY2stPnBlcmFkZHI7CiAJdTY0IGFkZHIgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdy5hZGRyOwogCXU2NCBjcjkgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzldOwogCXU2NCBjcjEwID0gdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdjclsxMF07CiAJdTY0IGNyMTEgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzExXTsKIAkvKiBmaWx0ZXIgYWxsIGV2ZW50cywgZGVtYW5kZWQgYnkgdGhlIGd1ZXN0ICovCi0JdTMyIGd1ZXN0X3BlcmMgPSBwZXJjICYgY3I5ICYgUEVSX0VWRU5UX01BU0s7CisJdTggZ3Vlc3RfcGVyYyA9IHBlcmMgJiAoY3I5ID4+IDI0KSAmIFBFUl9DT0RFX01BU0s7CiAKIAlpZiAoIWd1ZXN0X3Blcl9lbmFibGVkKHZjcHUpKQogCQlndWVzdF9wZXJjID0gMDsKIAogCS8qIGZpbHRlciAic3VjY2Vzc2Z1bC1icmFuY2hpbmciIGV2ZW50cyAqLwotCWlmIChndWVzdF9wZXJjICYgUEVSX0VWRU5UX0JSQU5DSCAmJgorCWlmIChndWVzdF9wZXJjICYgUEVSX0NPREVfQlJBTkNIICYmCiAJICAgIGNyOSAmIFBFUl9DT05UUk9MX0JSQU5DSF9BRERSRVNTICYmCiAJICAgICFpbl9hZGRyX3JhbmdlKGFkZHIsIGNyMTAsIGNyMTEpKQotCQlndWVzdF9wZXJjICY9IH5QRVJfRVZFTlRfQlJBTkNIOworCQlndWVzdF9wZXJjICY9IH5QRVJfQ09ERV9CUkFOQ0g7CiAKIAkvKiBmaWx0ZXIgImluc3RydWN0aW9uLWZldGNoaW5nIiBldmVudHMgKi8KLQlpZiAoZ3Vlc3RfcGVyYyAmIFBFUl9FVkVOVF9JRkVUQ0ggJiYKKwlpZiAoZ3Vlc3RfcGVyYyAmIFBFUl9DT0RFX0lGRVRDSCAmJgogCSAgICAhaW5fYWRkcl9yYW5nZShwZXJhZGRyLCBjcjEwLCBjcjExKSkKLQkJZ3Vlc3RfcGVyYyAmPSB+UEVSX0VWRU5UX0lGRVRDSDsKKwkJZ3Vlc3RfcGVyYyAmPSB+UEVSX0NPREVfSUZFVENIOwogCiAJLyogQWxsIG90aGVyIFBFUiBldmVudHMgd2lsbCBiZSBnaXZlbiB0byB0aGUgZ3Vlc3QgKi8KIAkvKiBUT0RPOiBDaGVjayBhbHRlcmVkIGFkZHJlc3MvYWRkcmVzcyBzcGFjZSAqLwogCi0JdmNwdS0+YXJjaC5zaWVfYmxvY2stPnBlcmMgPSBndWVzdF9wZXJjID4+IDI0OworCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5wZXJjID0gZ3Vlc3RfcGVyYzsKIAogCWlmICghZ3Vlc3RfcGVyYykKIAkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmlwcmNjICY9IH5QR01fUEVSOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9pbnRlcmNlcHQuYyBiL2FyY2gvczM5MC9rdm0vaW50ZXJjZXB0LmMKaW5kZXggZGZkMGNhMi4uMWNhYjhhMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9pbnRlcmNlcHQuYworKysgYi9hcmNoL3MzOTAva3ZtL2ludGVyY2VwdC5jCkBAIC0yOSw2ICsyOSw3IEBACiAJWzB4MDFdID0ga3ZtX3MzOTBfaGFuZGxlXzAxLAogCVsweDgyXSA9IGt2bV9zMzkwX2hhbmRsZV9scHN3LAogCVsweDgzXSA9IGt2bV9zMzkwX2hhbmRsZV9kaWFnLAorCVsweGFhXSA9IGt2bV9zMzkwX2hhbmRsZV9hYSwKIAlbMHhhZV0gPSBrdm1fczM5MF9oYW5kbGVfc2lncCwKIAlbMHhiMl0gPSBrdm1fczM5MF9oYW5kbGVfYjIsCiAJWzB4YjZdID0ga3ZtX3MzOTBfaGFuZGxlX3N0Y3RsLApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYyBiL2FyY2gvczM5MC9rdm0vaW50ZXJydXB0LmMKaW5kZXggMjQ1MjRjMC4uYmU0ZGIwNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3MzOTAva3ZtL2ludGVycnVwdC5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaW5jbHVkZSA8YXNtL3NjbHAuaD4KICNpbmNsdWRlIDxhc20vaXNjLmg+CiAjaW5jbHVkZSA8YXNtL2dtYXAuaD4KKyNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CisjaW5jbHVkZSA8YXNtL25taS5oPgogI2luY2x1ZGUgImt2bS1zMzkwLmgiCiAjaW5jbHVkZSAiZ2FjY2Vzcy5oIgogI2luY2x1ZGUgInRyYWNlLXMzOTAuaCIKQEAgLTQwLDYgKzQyLDcgQEAKIAlpZiAoIShhdG9taWNfcmVhZCgmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmNwdWZsYWdzKSAmIENQVVNUQVRfRUNBTExfUEVORCkpCiAJCXJldHVybiAwOwogCisJQlVHX09OKCFrdm1fczM5MF91c2Vfc2NhX2VudHJpZXMoKSk7CiAJcmVhZF9sb2NrKCZ2Y3B1LT5rdm0tPmFyY2guc2NhX2xvY2spOwogCWlmICh2Y3B1LT5rdm0tPmFyY2gudXNlX2VzY2EpIHsKIAkJc3RydWN0IGVzY2FfYmxvY2sgKnNjYSA9IHZjcHUtPmt2bS0+YXJjaC5zY2E7CkBAIC02OCw2ICs3MSw3IEBACiB7CiAJaW50IGV4cGVjdCwgcmM7CiAKKwlCVUdfT04oIWt2bV9zMzkwX3VzZV9zY2FfZW50cmllcygpKTsKIAlyZWFkX2xvY2soJnZjcHUtPmt2bS0+YXJjaC5zY2FfbG9jayk7CiAJaWYgKHZjcHUtPmt2bS0+YXJjaC51c2VfZXNjYSkgewogCQlzdHJ1Y3QgZXNjYV9ibG9jayAqc2NhID0gdmNwdS0+a3ZtLT5hcmNoLnNjYTsKQEAgLTEwOSw2ICsxMTMsOCBAQAogCXN0cnVjdCBrdm1fczM5MF9sb2NhbF9pbnRlcnJ1cHQgKmxpID0gJnZjcHUtPmFyY2gubG9jYWxfaW50OwogCWludCByYywgZXhwZWN0OwogCisJaWYgKCFrdm1fczM5MF91c2Vfc2NhX2VudHJpZXMoKSkKKwkJcmV0dXJuOwogCWF0b21pY19hbmRub3QoQ1BVU1RBVF9FQ0FMTF9QRU5ELCBsaS0+Y3B1ZmxhZ3MpOwogCXJlYWRfbG9jaygmdmNwdS0+a3ZtLT5hcmNoLnNjYV9sb2NrKTsKIAlpZiAodmNwdS0+a3ZtLT5hcmNoLnVzZV9lc2NhKSB7CkBAIC00MDAsMTIgKzQwNiw3OCBAQAogCXJldHVybiByYyA/IC1FRkFVTFQgOiAwOwogfQogCitzdGF0aWMgaW50IF9fd3JpdGVfbWFjaGluZV9jaGVjayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJIHN0cnVjdCBrdm1fczM5MF9tY2hrX2luZm8gKm1jaGspCit7CisJdW5zaWduZWQgbG9uZyBleHRfc2FfYWRkcjsKKwlmcmVnX3QgZnByc1tOVU1fRlBSU107CisJdW5pb24gbWNpIG1jaTsKKwlpbnQgcmM7CisKKwltY2kudmFsID0gbWNoay0+bWNpYzsKKwkvKiB0YWtlIGNhcmUgb2YgbGF6eSByZWdpc3RlciBsb2FkaW5nIHZpYSB2Y3B1IGxvYWQvcHV0ICovCisJc2F2ZV9mcHVfcmVncygpOworCXNhdmVfYWNjZXNzX3JlZ3ModmNwdS0+cnVuLT5zLnJlZ3MuYWNycyk7CisKKwkvKiBFeHRlbmRlZCBzYXZlIGFyZWEgKi8KKwlyYyA9IHJlYWRfZ3Vlc3RfbGModmNwdSwgX19MQ19WWF9TQVZFX0FSRUFfQUREUiwgJmV4dF9zYV9hZGRyLAorCQkJICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJLyogT25seSBiaXRzIDAtNTMgYXJlIHVzZWQgZm9yIGFkZHJlc3MgZm9ybWF0aW9uICovCisJZXh0X3NhX2FkZHIgJj0gfjB4M2ZmVUw7CisJaWYgKCFyYyAmJiBtY2kudnIgJiYgZXh0X3NhX2FkZHIgJiYgdGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCAxMjkpKSB7CisJCWlmICh3cml0ZV9ndWVzdF9hYnModmNwdSwgZXh0X3NhX2FkZHIsIHZjcHUtPnJ1bi0+cy5yZWdzLnZycywKKwkJCQkgICAgNTEyKSkKKwkJCW1jaS52ciA9IDA7CisJfSBlbHNlIHsKKwkJbWNpLnZyID0gMDsKKwl9CisKKwkvKiBHZW5lcmFsIGludGVycnVwdGlvbiBpbmZvcm1hdGlvbiAqLworCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCAxLCAodTggX191c2VyICopIF9fTENfQVJfTU9ERV9JRCk7CisJcmMgfD0gd3JpdGVfZ3Vlc3RfbGModmNwdSwgX19MQ19NQ0tfT0xEX1BTVywKKwkJCSAgICAgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LCBzaXplb2YocHN3X3QpKTsKKwlyYyB8PSByZWFkX2d1ZXN0X2xjKHZjcHUsIF9fTENfTUNLX05FV19QU1csCisJCQkgICAgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LCBzaXplb2YocHN3X3QpKTsKKwlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgbWNpLnZhbCwgKHU2NCBfX3VzZXIgKikgX19MQ19NQ0NLX0NPREUpOworCisJLyogUmVnaXN0ZXItc2F2ZSBhcmVhcyAqLworCWlmIChNQUNISU5FX0hBU19WWCkgeworCQljb252ZXJ0X3Z4X3RvX2ZwKGZwcnMsIChfX3ZlY3RvcjEyOCAqKSB2Y3B1LT5ydW4tPnMucmVncy52cnMpOworCQlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX0ZQUkVHU19TQVZFX0FSRUEsIGZwcnMsIDEyOCk7CisJfSBlbHNlIHsKKwkJcmMgfD0gd3JpdGVfZ3Vlc3RfbGModmNwdSwgX19MQ19GUFJFR1NfU0FWRV9BUkVBLAorCQkJCSAgICAgdmNwdS0+cnVuLT5zLnJlZ3MuZnBycywgMTI4KTsKKwl9CisJcmMgfD0gd3JpdGVfZ3Vlc3RfbGModmNwdSwgX19MQ19HUFJFR1NfU0FWRV9BUkVBLAorCQkJICAgICB2Y3B1LT5ydW4tPnMucmVncy5ncHJzLCAxMjgpOworCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBjdXJyZW50LT50aHJlYWQuZnB1LmZwYywKKwkJCSAgICh1MzIgX191c2VyICopIF9fTENfRlBfQ1JFR19TQVZFX0FSRUEpOworCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+dG9kcHIsCisJCQkgICAodTMyIF9fdXNlciAqKSBfX0xDX1RPRF9QUk9HUkVHX1NBVkVfQVJFQSk7CisJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIGt2bV9zMzkwX2dldF9jcHVfdGltZXIodmNwdSksCisJCQkgICAodTY0IF9fdXNlciAqKSBfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEpOworCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y2tjID4+IDgsCisJCQkgICAodTY0IF9fdXNlciAqKSBfX0xDX0NMT0NLX0NPTVBfU0FWRV9BUkVBKTsKKwlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX0FSRUdTX1NBVkVfQVJFQSwKKwkJCSAgICAgJnZjcHUtPnJ1bi0+cy5yZWdzLmFjcnMsIDY0KTsKKwlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX0NSRUdTX1NBVkVfQVJFQSwKKwkJCSAgICAgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3IsIDEyOCk7CisKKwkvKiBFeHRlbmRlZCBpbnRlcnJ1cHRpb24gaW5mb3JtYXRpb24gKi8KKwlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgbWNoay0+ZXh0X2RhbWFnZV9jb2RlLAorCQkJICAgKHUzMiBfX3VzZXIgKikgX19MQ19FWFRfREFNQUdFX0NPREUpOworCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBtY2hrLT5mYWlsaW5nX3N0b3JhZ2VfYWRkcmVzcywKKwkJCSAgICh1NjQgX191c2VyICopIF9fTENfTUNDS19GQUlMX1NUT1JfQUREUik7CisJcmMgfD0gd3JpdGVfZ3Vlc3RfbGModmNwdSwgX19MQ19QU1dfU0FWRV9BUkVBLCAmbWNoay0+Zml4ZWRfbG9nb3V0LAorCQkJICAgICBzaXplb2YobWNoay0+Zml4ZWRfbG9nb3V0KSk7CisJcmV0dXJuIHJjID8gLUVGQVVMVCA6IDA7Cit9CisKIHN0YXRpYyBpbnQgX19tdXN0X2NoZWNrIF9fZGVsaXZlcl9tYWNoaW5lX2NoZWNrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3Qga3ZtX3MzOTBfZmxvYXRfaW50ZXJydXB0ICpmaSA9ICZ2Y3B1LT5rdm0tPmFyY2guZmxvYXRfaW50OwogCXN0cnVjdCBrdm1fczM5MF9sb2NhbF9pbnRlcnJ1cHQgKmxpID0gJnZjcHUtPmFyY2gubG9jYWxfaW50OwogCXN0cnVjdCBrdm1fczM5MF9tY2hrX2luZm8gbWNoayA9IHt9OwotCXVuc2lnbmVkIGxvbmcgYWR0bF9zdGF0dXNfYWRkcjsKIAlpbnQgZGVsaXZlciA9IDA7CiAJaW50IHJjID0gMDsKIApAQCAtNDQ2LDI5ICs1MTgsOSBAQAogCQl0cmFjZV9rdm1fczM5MF9kZWxpdmVyX2ludGVycnVwdCh2Y3B1LT52Y3B1X2lkLAogCQkJCQkJIEtWTV9TMzkwX01DSEssCiAJCQkJCQkgbWNoay5jcjE0LCBtY2hrLm1jaWMpOwotCi0JCXJjICA9IGt2bV9zMzkwX3ZjcHVfc3RvcmVfc3RhdHVzKHZjcHUsCi0JCQkJCQkgS1ZNX1MzOTBfU1RPUkVfU1RBVFVTX1BSRUZJWEVEKTsKLQkJcmMgfD0gcmVhZF9ndWVzdF9sYyh2Y3B1LCBfX0xDX1ZYX1NBVkVfQVJFQV9BRERSLAotCQkJCSAgICAmYWR0bF9zdGF0dXNfYWRkciwKLQkJCQkgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQkJcmMgfD0ga3ZtX3MzOTBfdmNwdV9zdG9yZV9hZHRsX3N0YXR1cyh2Y3B1LAotCQkJCQkJICAgICAgYWR0bF9zdGF0dXNfYWRkcik7Ci0JCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBtY2hrLm1jaWMsCi0JCQkJICAgKHU2NCBfX3VzZXIgKikgX19MQ19NQ0NLX0NPREUpOwotCQlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgbWNoay5mYWlsaW5nX3N0b3JhZ2VfYWRkcmVzcywKLQkJCQkgICAodTY0IF9fdXNlciAqKSBfX0xDX01DQ0tfRkFJTF9TVE9SX0FERFIpOwotCQlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX1BTV19TQVZFX0FSRUEsCi0JCQkJICAgICAmbWNoay5maXhlZF9sb2dvdXQsCi0JCQkJICAgICBzaXplb2YobWNoay5maXhlZF9sb2dvdXQpKTsKLQkJcmMgfD0gd3JpdGVfZ3Vlc3RfbGModmNwdSwgX19MQ19NQ0tfT0xEX1BTVywKLQkJCQkgICAgICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3BzdywKLQkJCQkgICAgIHNpemVvZihwc3dfdCkpOwotCQlyYyB8PSByZWFkX2d1ZXN0X2xjKHZjcHUsIF9fTENfTUNLX05FV19QU1csCi0JCQkJICAgICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3BzdywKLQkJCQkgICAgc2l6ZW9mKHBzd190KSk7CisJCXJjID0gX193cml0ZV9tYWNoaW5lX2NoZWNrKHZjcHUsICZtY2hrKTsKIAl9Ci0JcmV0dXJuIHJjID8gLUVGQVVMVCA6IDA7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IF9fbXVzdF9jaGVjayBfX2RlbGl2ZXJfcmVzdGFydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMgYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKaW5kZXggZjE0MjIxNS4uOWM3YTFlYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCisrKyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYwpAQCAtMTMyLDEwICsxMzIsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhuZXN0ZWQsICJOZXN0ZWQgdmlydHVhbGl6YXRpb24gc3VwcG9ydCIpOwogCiAvKiB1cHBlciBmYWNpbGl0aWVzIGxpbWl0IGZvciBrdm0gKi8KLXVuc2lnbmVkIGxvbmcga3ZtX3MzOTBfZmFjX2xpc3RfbWFza1sxNl0gPSB7Ci0JMHhmZmU2MDAwMDAwMDAwMDAwVUwsCi0JMHgwMDVlMDAwMDAwMDAwMDAwVUwsCi19OwordW5zaWduZWQgbG9uZyBrdm1fczM5MF9mYWNfbGlzdF9tYXNrWzE2XSA9IHsgRkFDSUxJVElFU19LVk0gfTsKIAogdW5zaWduZWQgbG9uZyBrdm1fczM5MF9mYWNfbGlzdF9tYXNrX3NpemUodm9pZCkKIHsKQEAgLTI0OCwyMiArMjQ1LDMzIEBACiAJCSAgICAgUFRGRl9RQUYpOwogCiAJaWYgKHRlc3RfZmFjaWxpdHkoMTcpKSB7IC8qIE1TQSAqLwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNQUMsIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLmttYWMpOwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNQywga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua21jKTsKLQkJX19jcGFjZl9xdWVyeShDUEFDRl9LTSwga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua20pOwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tJTUQsIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLmtpbWQpOwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tMTUQsIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLmtsbWQpOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNQUMsIChjcGFjZl9tYXNrX3QgKikKKwkJCSAgICAgIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLmttYWMpOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNQywgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua21jKTsKKwkJX19jcGFjZl9xdWVyeShDUEFDRl9LTSwgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua20pOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tJTUQsIChjcGFjZl9tYXNrX3QgKikKKwkJCSAgICAgIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLmtpbWQpOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tMTUQsIChjcGFjZl9tYXNrX3QgKikKKwkJCSAgICAgIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLmtsbWQpOwogCX0KIAlpZiAodGVzdF9mYWNpbGl0eSg3NikpIC8qIE1TQTMgKi8KLQkJX19jcGFjZl9xdWVyeShDUEFDRl9QQ0tNTywga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMucGNrbW8pOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX1BDS01PLCAoY3BhY2ZfbWFza190ICopCisJCQkgICAgICBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5wY2ttbyk7CiAJaWYgKHRlc3RfZmFjaWxpdHkoNzcpKSB7IC8qIE1TQTQgKi8KLQkJX19jcGFjZl9xdWVyeShDUEFDRl9LTUNUUiwga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua21jdHIpOwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNRiwga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua21mKTsKLQkJX19jcGFjZl9xdWVyeShDUEFDRl9LTU8sIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLmttbyk7Ci0JCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfUENDLCBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5wY2MpOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNQ1RSLCAoY3BhY2ZfbWFza190ICopCisJCQkgICAgICBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbWN0cik7CisJCV9fY3BhY2ZfcXVlcnkoQ1BBQ0ZfS01GLCAoY3BhY2ZfbWFza190ICopCisJCQkgICAgICBrdm1fczM5MF9hdmFpbGFibGVfc3ViZnVuYy5rbWYpOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX0tNTywgKGNwYWNmX21hc2tfdCAqKQorCQkJICAgICAga3ZtX3MzOTBfYXZhaWxhYmxlX3N1YmZ1bmMua21vKTsKKwkJX19jcGFjZl9xdWVyeShDUEFDRl9QQ0MsIChjcGFjZl9tYXNrX3QgKikKKwkJCSAgICAgIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLnBjYyk7CiAJfQogCWlmICh0ZXN0X2ZhY2lsaXR5KDU3KSkgLyogTVNBNSAqLwotCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX1BQTk8sIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLnBwbm8pOworCQlfX2NwYWNmX3F1ZXJ5KENQQUNGX1BQTk8sIChjcGFjZl9tYXNrX3QgKikKKwkJCSAgICAgIGt2bV9zMzkwX2F2YWlsYWJsZV9zdWJmdW5jLnBwbm8pOwogCiAJaWYgKE1BQ0hJTkVfSEFTX0VTT1ApCiAJCWFsbG93X2NwdV9mZWF0KEtWTV9TMzkwX1ZNX0NQVV9GRUFUX0VTT1ApOwpAQCAtMzc2LDcgKzM4NCw5IEBACiAJY2FzZSBLVk1fQ0FQX05SX1ZDUFVTOgogCWNhc2UgS1ZNX0NBUF9NQVhfVkNQVVM6CiAJCXIgPSBLVk1fUzM5MF9CU0NBX0NQVV9TTE9UUzsKLQkJaWYgKHNjbHAuaGFzX2VzY2EgJiYgc2NscC5oYXNfNjRic2NhbykKKwkJaWYgKCFrdm1fczM5MF91c2Vfc2NhX2VudHJpZXMoKSkKKwkJCXIgPSBLVk1fTUFYX1ZDUFVTOworCQllbHNlIGlmIChzY2xwLmhhc19lc2NhICYmIHNjbHAuaGFzXzY0YnNjYW8pCiAJCQlyID0gS1ZNX1MzOTBfRVNDQV9DUFVfU0xPVFM7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX0NBUF9OUl9NRU1TTE9UUzoKQEAgLTE0OTAsNiArMTUwMCwxNiBAQAogCXJldHVybiByYzsKIH0KIAorYm9vbCBrdm1fYXJjaF9oYXNfdmNwdV9kZWJ1Z2ZzKHZvaWQpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitpbnQga3ZtX2FyY2hfY3JlYXRlX3ZjcHVfZGVidWdmcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIDA7Cit9CisKIHZvaWQga3ZtX2FyY2hfdmNwdV9kZXN0cm95KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlWQ1BVX0VWRU5UKHZjcHUsIDMsICIlcyIsICJmcmVlIGNwdSIpOwpAQCAtMTU1Myw2ICsxNTczLDggQEAKIAogc3RhdGljIHZvaWQgc2NhX2RlbF92Y3B1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwlpZiAoIWt2bV9zMzkwX3VzZV9zY2FfZW50cmllcygpKQorCQlyZXR1cm47CiAJcmVhZF9sb2NrKCZ2Y3B1LT5rdm0tPmFyY2guc2NhX2xvY2spOwogCWlmICh2Y3B1LT5rdm0tPmFyY2gudXNlX2VzY2EpIHsKIAkJc3RydWN0IGVzY2FfYmxvY2sgKnNjYSA9IHZjcHUtPmt2bS0+YXJjaC5zY2E7CkBAIC0xNTcwLDYgKzE1OTIsMTMgQEAKIAogc3RhdGljIHZvaWQgc2NhX2FkZF92Y3B1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwlpZiAoIWt2bV9zMzkwX3VzZV9zY2FfZW50cmllcygpKSB7CisJCXN0cnVjdCBic2NhX2Jsb2NrICpzY2EgPSB2Y3B1LT5rdm0tPmFyY2guc2NhOworCisJCS8qIHdlIHN0aWxsIG5lZWQgdGhlIGJhc2ljIHNjYSBmb3IgdGhlIGlwdGUgY29udHJvbCAqLworCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+c2Nhb2ggPSAoX191MzIpKCgoX191NjQpc2NhKSA+PiAzMik7CisJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5zY2FvbCA9IChfX3UzMikoX191NjQpc2NhOworCX0KIAlyZWFkX2xvY2soJnZjcHUtPmt2bS0+YXJjaC5zY2FfbG9jayk7CiAJaWYgKHZjcHUtPmt2bS0+YXJjaC51c2VfZXNjYSkgewogCQlzdHJ1Y3QgZXNjYV9ibG9jayAqc2NhID0gdmNwdS0+a3ZtLT5hcmNoLnNjYTsKQEAgLTE2NTAsNiArMTY3OSwxMSBAQAogewogCWludCByYzsKIAorCWlmICgha3ZtX3MzOTBfdXNlX3NjYV9lbnRyaWVzKCkpIHsKKwkJaWYgKGlkIDwgS1ZNX01BWF9WQ1BVUykKKwkJCXJldHVybiB0cnVlOworCQlyZXR1cm4gZmFsc2U7CisJfQogCWlmIChpZCA8IEtWTV9TMzkwX0JTQ0FfQ1BVX1NMT1RTKQogCQlyZXR1cm4gdHJ1ZTsKIAlpZiAoIXNjbHAuaGFzX2VzY2EgfHwgIXNjbHAuaGFzXzY0YnNjYW8pCkBAIC0xOTM4LDggKzE5NzIsNiBAQAogCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNhIHw9IDE7CiAJaWYgKHNjbHAuaGFzX3NpZ3BpZikKIAkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjYSB8PSAweDEwMDAwMDAwVTsKLQlpZiAodGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCA2NCkpCi0JCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5lY2IzIHw9IDB4MDE7CiAJaWYgKHRlc3Rfa3ZtX2ZhY2lsaXR5KHZjcHUtPmt2bSwgMTI5KSkgewogCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNhIHw9IDB4MDAwMjAwMDA7CiAJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5lY2QgfD0gMHgyMDAwMDAwMDsKQEAgLTIyMzEsOSArMjI2MywxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAljdXJyZW50LT50aHJlYWQuZnB1LmZwYyA9IGZwdS0+ZnBjOwogCWlmIChNQUNISU5FX0hBU19WWCkKLQkJY29udmVydF9mcF90b192eChjdXJyZW50LT50aHJlYWQuZnB1LnZ4cnMsIChmcmVnX3QgKilmcHUtPmZwcnMpOworCQljb252ZXJ0X2ZwX3RvX3Z4KChfX3ZlY3RvcjEyOCAqKSB2Y3B1LT5ydW4tPnMucmVncy52cnMsCisJCQkJIChmcmVnX3QgKikgZnB1LT5mcHJzKTsKIAllbHNlCi0JCW1lbWNweShjdXJyZW50LT50aHJlYWQuZnB1LmZwcnMsICZmcHUtPmZwcnMsIHNpemVvZihmcHUtPmZwcnMpKTsKKwkJbWVtY3B5KHZjcHUtPnJ1bi0+cy5yZWdzLmZwcnMsICZmcHUtPmZwcnMsIHNpemVvZihmcHUtPmZwcnMpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjI0Miw5ICsyMjc1LDEwIEBACiAJLyogbWFrZSBzdXJlIHdlIGhhdmUgdGhlIGxhdGVzdCB2YWx1ZXMgKi8KIAlzYXZlX2ZwdV9yZWdzKCk7CiAJaWYgKE1BQ0hJTkVfSEFTX1ZYKQotCQljb252ZXJ0X3Z4X3RvX2ZwKChmcmVnX3QgKilmcHUtPmZwcnMsIGN1cnJlbnQtPnRocmVhZC5mcHUudnhycyk7CisJCWNvbnZlcnRfdnhfdG9fZnAoKGZyZWdfdCAqKSBmcHUtPmZwcnMsCisJCQkJIChfX3ZlY3RvcjEyOCAqKSB2Y3B1LT5ydW4tPnMucmVncy52cnMpOwogCWVsc2UKLQkJbWVtY3B5KGZwdS0+ZnBycywgY3VycmVudC0+dGhyZWFkLmZwdS5mcHJzLCBzaXplb2YoZnB1LT5mcHJzKSk7CisJCW1lbWNweShmcHUtPmZwcnMsIHZjcHUtPnJ1bi0+cy5yZWdzLmZwcnMsIHNpemVvZihmcHUtPmZwcnMpKTsKIAlmcHUtPmZwYyA9IGN1cnJlbnQtPnRocmVhZC5mcHUuZnBjOwogCXJldHVybiAwOwogfQpAQCAtMjY5NCw2ICsyNzI4LDE5IEBACiAJCWlmICh2Y3B1LT5hcmNoLnBmYXVsdF90b2tlbiA9PSBLVk1fUzM5MF9QRkFVTFRfVE9LRU5fSU5WQUxJRCkKIAkJCWt2bV9jbGVhcl9hc3luY19wZl9jb21wbGV0aW9uX3F1ZXVlKHZjcHUpOwogCX0KKwkvKgorCSAqIElmIHVzZXJzcGFjZSBzZXRzIHRoZSByaWNjYiAoZS5nLiBhZnRlciBtaWdyYXRpb24pIHRvIGEgdmFsaWQgc3RhdGUsCisJICogd2Ugc2hvdWxkIGVuYWJsZSBSSSBoZXJlIGluc3RlYWQgb2YgZG9pbmcgdGhlIGxhenkgZW5hYmxlbWVudC4KKwkgKi8KKwlpZiAoKGt2bV9ydW4tPmt2bV9kaXJ0eV9yZWdzICYgS1ZNX1NZTkNfUklDQ0IpICYmCisJICAgIHRlc3Rfa3ZtX2ZhY2lsaXR5KHZjcHUtPmt2bSwgNjQpKSB7CisJCXN0cnVjdCBydW50aW1lX2luc3RyX2NiICpyaWNjYiA9CisJCQkoc3RydWN0IHJ1bnRpbWVfaW5zdHJfY2IgKikgJmt2bV9ydW4tPnMucmVncy5yaWNjYjsKKworCQlpZiAocmljY2ItPnZhbGlkKQorCQkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjYjMgfD0gMHgwMTsKKwl9CisKIAlrdm1fcnVuLT5rdm1fZGlydHlfcmVncyA9IDA7CiB9CiAKQEAgLTI4MzcsMzggKzI4ODQsNiBAQAogCXJldHVybiBrdm1fczM5MF9zdG9yZV9zdGF0dXNfdW5sb2FkZWQodmNwdSwgYWRkcik7CiB9CiAKLS8qCi0gKiBzdG9yZSBhZGRpdGlvbmFsIHN0YXR1cyBhdCBhZGRyZXNzCi0gKi8KLWludCBrdm1fczM5MF9zdG9yZV9hZHRsX3N0YXR1c191bmxvYWRlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJCXVuc2lnbmVkIGxvbmcgZ3BhKQotewotCS8qIE9ubHkgYml0cyAwLTUzIGFyZSB1c2VkIGZvciBhZGRyZXNzIGZvcm1hdGlvbiAqLwotCWlmICghKGdwYSAmIH4weDNmZikpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHdyaXRlX2d1ZXN0X2Ficyh2Y3B1LCBncGEgJiB+MHgzZmYsCi0JCQkgICAgICAgKHZvaWQgKikmdmNwdS0+cnVuLT5zLnJlZ3MudnJzLCA1MTIpOwotfQotCi1pbnQga3ZtX3MzOTBfdmNwdV9zdG9yZV9hZHRsX3N0YXR1cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlpZiAoIXRlc3Rfa3ZtX2ZhY2lsaXR5KHZjcHUtPmt2bSwgMTI5KSkKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIFRoZSBndWVzdCBWWFJTIGFyZSBpbiB0aGUgaG9zdCBWWFJzIGR1ZSB0byB0aGUgbGF6eQotCSAqIGNvcHlpbmcgaW4gdmNwdSBsb2FkL3B1dC4gV2UgY2FuIHNpbXBseSBjYWxsIHNhdmVfZnB1X3JlZ3MoKQotCSAqIHRvIHNhdmUgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgc3RhdGUgYmVjYXVzZSB3ZSBhcmUgaW4gdGhlCi0JICogbWlkZGxlIG9mIGEgbG9hZC9wdXQgY3ljbGUuCi0JICoKLQkgKiBMZXQncyB1cGRhdGUgb3VyIGNvcGllcyBiZWZvcmUgd2Ugc2F2ZSBpdCBpbnRvIHRoZSBzYXZlIGFyZWEuCi0JICovCi0Jc2F2ZV9mcHVfcmVncygpOwotCi0JcmV0dXJuIGt2bV9zMzkwX3N0b3JlX2FkdGxfc3RhdHVzX3VubG9hZGVkKHZjcHUsIGFkZHIpOwotfQotCiBzdGF0aWMgdm9pZCBfX2Rpc2FibGVfaWJzX29uX3ZjcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWt2bV9jaGVja19yZXF1ZXN0KEtWTV9SRVFfRU5BQkxFX0lCUywgdmNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmggYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmgKaW5kZXggYjg0MzI4Ni4uM2E0ZTk3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oCisrKyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSA8YXNtL2ZhY2lsaXR5Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9zY2xwLmg+CiAKIHR5cGVkZWYgaW50ICgqaW50ZXJjZXB0X2hhbmRsZXJfdCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIApAQCAtMjQ1LDYgKzI0Niw3IEBACiAKIC8qIGltcGxlbWVudGVkIGluIHByaXYuYyAqLwogaW50IGlzX3ZhbGlkX3Bzdyhwc3dfdCAqcHN3KTsKK2ludCBrdm1fczM5MF9oYW5kbGVfYWEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGludCBrdm1fczM5MF9oYW5kbGVfYjIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGludCBrdm1fczM5MF9oYW5kbGVfZTUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGludCBrdm1fczM5MF9oYW5kbGVfMDEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKQEAgLTI3MywxMCArMjc1LDcgQEAKIHZvaWQga3ZtX3MzOTBfc2V0X3RvZF9jbG9jayhzdHJ1Y3Qga3ZtICprdm0sIHU2NCB0b2QpOwogbG9uZyBrdm1fYXJjaF9mYXVsdF9pbl9wYWdlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3BhX3QgZ3BhLCBpbnQgd3JpdGFibGUpOwogaW50IGt2bV9zMzkwX3N0b3JlX3N0YXR1c191bmxvYWRlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcik7Ci1pbnQga3ZtX3MzOTBfc3RvcmVfYWR0bF9zdGF0dXNfdW5sb2FkZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotCQkJCQl1bnNpZ25lZCBsb25nIGFkZHIpOwogaW50IGt2bV9zMzkwX3ZjcHVfc3RvcmVfc3RhdHVzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKLWludCBrdm1fczM5MF92Y3B1X3N0b3JlX2FkdGxfc3RhdHVzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBhZGRyKTsKIHZvaWQga3ZtX3MzOTBfdmNwdV9zdGFydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fczM5MF92Y3B1X3N0b3Aoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQga3ZtX3MzOTBfdmNwdV9ibG9jayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpAQCAtMzg5LDQgKzM4OCwxMyBAQAogCiAJcmV0dXJuICZzY2EtPmlwdGVfY29udHJvbDsKIH0KK3N0YXRpYyBpbmxpbmUgaW50IGt2bV9zMzkwX3VzZV9zY2FfZW50cmllcyh2b2lkKQoreworCS8qCisJICogV2l0aG91dCBTSUdQIGludGVycHJldGF0aW9uLCBvbmx5IFNSUyBpbnRlcnByZXRhdGlvbiAoaWYgYXZhaWxhYmxlKQorCSAqIG1pZ2h0IHVzZSB0aGUgZW50cmllcy4gQnkgbm90IHNldHRpbmcgdGhlIGVudHJpZXMgYW5kIGtlZXBpbmcgdGhlbQorCSAqIGludmFsaWQsIGhhcmR3YXJlIHdpbGwgbm90IGFjY2VzcyB0aGVtIGJ1dCBpbnRlcmNlcHQuCisJICovCisJcmV0dXJuIHNjbHAuaGFzX3NpZ3BpZjsKK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9wcml2LmMgYi9hcmNoL3MzOTAva3ZtL3ByaXYuYwppbmRleCA0NjE2MDM4Li5lMTg0MzUzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL3ByaXYuYworKysgYi9hcmNoL3MzOTAva3ZtL3ByaXYuYwpAQCAtMzIsNiArMzIsMjQgQEAKICNpbmNsdWRlICJrdm0tczM5MC5oIgogI2luY2x1ZGUgInRyYWNlLmgiCiAKK3N0YXRpYyBpbnQgaGFuZGxlX3JpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpZiAodGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCA2NCkpIHsKKwkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjYjMgfD0gMHgwMTsKKwkJa3ZtX3MzOTBfcmV0cnlfaW5zdHIodmNwdSk7CisJCXJldHVybiAwOworCX0gZWxzZQorCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9PUEVSQVRJT04pOworfQorCitpbnQga3ZtX3MzOTBfaGFuZGxlX2FhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpZiAoKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5pcGEgJiAweGYpIDw9IDQpCisJCXJldHVybiBoYW5kbGVfcmkodmNwdSk7CisJZWxzZQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKIC8qIEhhbmRsZSBTQ0sgKFNFVCBDTE9DSykgaW50ZXJjZXB0aW9uICovCiBzdGF0aWMgaW50IGhhbmRsZV9zZXRfY2xvY2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewpAQCAtMTA5Myw2ICsxMTExLDkgQEAKIHN0YXRpYyBjb25zdCBpbnRlcmNlcHRfaGFuZGxlcl90IGViX2hhbmRsZXJzWzI1Nl0gPSB7CiAJWzB4MmZdID0gaGFuZGxlX2xjdGxnLAogCVsweDI1XSA9IGhhbmRsZV9zdGN0ZywKKwlbMHg2MF0gPSBoYW5kbGVfcmksCisJWzB4NjFdID0gaGFuZGxlX3JpLAorCVsweDYyXSA9IGhhbmRsZV9yaSwKIH07CiAKIGludCBrdm1fczM5MF9oYW5kbGVfZWIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS92c2llLmMgYi9hcmNoL3MzOTAva3ZtL3ZzaWUuYwppbmRleCBjMTA2NDg4Yi4uZDg2NzNlMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS92c2llLmMKKysrIGIvYXJjaC9zMzkwL2t2bS92c2llLmMKQEAgLTU4NCw3ICs1ODQsNyBAQAogCQkvKiBWYWxpZGl0eSAweDAwNDQgd2lsbCBiZSBjaGVja2VkIGJ5IFNJRSAqLwogCQlpZiAocmMpCiAJCQlnb3RvIHVucGluOwotCQlzY2Jfcy0+Z3ZyZCA9IGhwYTsKKwkJc2NiX3MtPnJpY2NiZCA9IGhwYTsKIAl9CiAJcmV0dXJuIDA7CiB1bnBpbjoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9mYXVsdC5jIGIvYXJjaC9zMzkwL21tL2ZhdWx0LmMKaW5kZXggYTU4YmNhNi4uNjYxZDlmZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9zMzkwL21tL2ZhdWx0LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KQEAgLTc0MCwyOCArNzQwLDIxIEBACiAJcHV0X3Rhc2tfc3RydWN0KHRzayk7CiB9CiAKLXN0YXRpYyBpbnQgcGZhdWx0X2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJCSAgICAgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgcGZhdWx0X2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCwgKm5leHQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAKLQlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfREVBRDoKLQkJc3Bpbl9sb2NrX2lycSgmcGZhdWx0X2xvY2spOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGhyZWFkLCBuZXh0LCAmcGZhdWx0X2xpc3QsIGxpc3QpIHsKLQkJCXRocmVhZC0+cGZhdWx0X3dhaXQgPSAwOwotCQkJbGlzdF9kZWwoJnRocmVhZC0+bGlzdCk7Ci0JCQl0c2sgPSBjb250YWluZXJfb2YodGhyZWFkLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZCk7Ci0JCQl3YWtlX3VwX3Byb2Nlc3ModHNrKTsKLQkJCXB1dF90YXNrX3N0cnVjdCh0c2spOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycSgmcGZhdWx0X2xvY2spOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKKwlzcGluX2xvY2tfaXJxKCZwZmF1bHRfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRocmVhZCwgbmV4dCwgJnBmYXVsdF9saXN0LCBsaXN0KSB7CisJCXRocmVhZC0+cGZhdWx0X3dhaXQgPSAwOworCQlsaXN0X2RlbCgmdGhyZWFkLT5saXN0KTsKKwkJdHNrID0gY29udGFpbmVyX29mKHRocmVhZCwgc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQpOworCQl3YWtlX3VwX3Byb2Nlc3ModHNrKTsKKwkJcHV0X3Rhc2tfc3RydWN0KHRzayk7CiAJfQotCXJldHVybiBOT1RJRllfT0s7CisJc3Bpbl91bmxvY2tfaXJxKCZwZmF1bHRfbG9jayk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBmYXVsdF9pcnFfaW5pdCh2b2lkKQpAQCAtNzc1LDcgKzc2OCw4IEBACiAJaWYgKHJjKQogCQlnb3RvIG91dF9wZmF1bHQ7CiAJaXJxX3N1YmNsYXNzX3JlZ2lzdGVyKElSUV9TVUJDTEFTU19TRVJWSUNFX1NJR05BTCk7Ci0JaG90Y3B1X25vdGlmaWVyKHBmYXVsdF9jcHVfbm90aWZ5LCAwKTsKKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX1MzOTBfUEZBVUxUX0RFQUQsICJzMzkwL3BmYXVsdDpkZWFkIiwKKwkJCQkgIE5VTEwsIHBmYXVsdF9jcHVfZGVhZCk7CiAJcmV0dXJuIDA7CiAKIG91dF9wZmF1bHQ6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vZ21hcC5jIGIvYXJjaC9zMzkwL21tL2dtYXAuYwppbmRleCAyY2U2YmIzLi4zYmE2MjI3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vZ21hcC5jCisrKyBiL2FyY2gvczM5MC9tbS9nbWFwLmMKQEAgLTk0LDYgKzk0LDcgQEAKIHN0cnVjdCBnbWFwICpnbWFwX2NyZWF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBsaW1pdCkKIHsKIAlzdHJ1Y3QgZ21hcCAqZ21hcDsKKwl1bnNpZ25lZCBsb25nIGdtYXBfYXNjZTsKIAogCWdtYXAgPSBnbWFwX2FsbG9jKGxpbWl0KTsKIAlpZiAoIWdtYXApCkBAIC0xMDEsNiArMTAyLDExIEBACiAJZ21hcC0+bW0gPSBtbTsKIAlzcGluX2xvY2soJm1tLT5jb250ZXh0LmdtYXBfbG9jayk7CiAJbGlzdF9hZGRfcmN1KCZnbWFwLT5saXN0LCAmbW0tPmNvbnRleHQuZ21hcF9saXN0KTsKKwlpZiAobGlzdF9pc19zaW5ndWxhcigmbW0tPmNvbnRleHQuZ21hcF9saXN0KSkKKwkJZ21hcF9hc2NlID0gZ21hcC0+YXNjZTsKKwllbHNlCisJCWdtYXBfYXNjZSA9IC0xVUw7CisJV1JJVEVfT05DRShtbS0+Y29udGV4dC5nbWFwX2FzY2UsIGdtYXBfYXNjZSk7CiAJc3Bpbl91bmxvY2soJm1tLT5jb250ZXh0LmdtYXBfbG9jayk7CiAJcmV0dXJuIGdtYXA7CiB9CkBAIC0yMzAsNiArMjM2LDcgQEAKIHZvaWQgZ21hcF9yZW1vdmUoc3RydWN0IGdtYXAgKmdtYXApCiB7CiAJc3RydWN0IGdtYXAgKnNnLCAqbmV4dDsKKwl1bnNpZ25lZCBsb25nIGdtYXBfYXNjZTsKIAogCS8qIFJlbW92ZSBhbGwgc2hhZG93IGdtYXBzIGxpbmtlZCB0byB0aGlzIGdtYXAgKi8KIAlpZiAoIWxpc3RfZW1wdHkoJmdtYXAtPmNoaWxkcmVuKSkgewpAQCAtMjQzLDYgKzI1MCwxNCBAQAogCS8qIFJlbW92ZSBnbWFwIGZyb20gdGhlIHByZS1tbSBsaXN0ICovCiAJc3Bpbl9sb2NrKCZnbWFwLT5tbS0+Y29udGV4dC5nbWFwX2xvY2spOwogCWxpc3RfZGVsX3JjdSgmZ21hcC0+bGlzdCk7CisJaWYgKGxpc3RfZW1wdHkoJmdtYXAtPm1tLT5jb250ZXh0LmdtYXBfbGlzdCkpCisJCWdtYXBfYXNjZSA9IDA7CisJZWxzZSBpZiAobGlzdF9pc19zaW5ndWxhcigmZ21hcC0+bW0tPmNvbnRleHQuZ21hcF9saXN0KSkKKwkJZ21hcF9hc2NlID0gbGlzdF9maXJzdF9lbnRyeSgmZ21hcC0+bW0tPmNvbnRleHQuZ21hcF9saXN0LAorCQkJCQkgICAgIHN0cnVjdCBnbWFwLCBsaXN0KS0+YXNjZTsKKwllbHNlCisJCWdtYXBfYXNjZSA9IC0xVUw7CisJV1JJVEVfT05DRShnbWFwLT5tbS0+Y29udGV4dC5nbWFwX2FzY2UsIGdtYXBfYXNjZSk7CiAJc3Bpbl91bmxvY2soJmdtYXAtPm1tLT5jb250ZXh0LmdtYXBfbG9jayk7CiAJc3luY2hyb25pemVfcmN1KCk7CiAJLyogUHV0IHJlZmVyZW5jZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL3BhZ2VhdHRyLmMgYi9hcmNoL3MzOTAvbW0vcGFnZWF0dHIuYwppbmRleCBhZjdjZjI4Yy4uNDRmMTUwMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC9zMzkwL21tL3BhZ2VhdHRyLmMKQEAgLTMwOSwxMSArMzA5LDExIEBACiAJaW50IGk7CiAKIAlpZiAodGVzdF9mYWNpbGl0eSgxMykpIHsKLQkJX19wdGVwX2lwdGVfcmFuZ2UoYWRkcmVzcywgbnIgLSAxLCBwdGUpOworCQlfX3B0ZXBfaXB0ZV9yYW5nZShhZGRyZXNzLCBuciAtIDEsIHB0ZSwgSVBURV9HTE9CQUwpOwogCQlyZXR1cm47CiAJfQogCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7Ci0JCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZSk7CisJCV9fcHRlcF9pcHRlKGFkZHJlc3MsIHB0ZSwgSVBURV9HTE9CQUwpOwogCQlhZGRyZXNzICs9IFBBR0VfU0laRTsKIAkJcHRlKys7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL3BndGFibGUuYyBiL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKaW5kZXggNWYwOTIwMS4uN2ExODk3YyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL3BndGFibGUuYworKysgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCkBAIC0zNSw5ICszNSw5IEBACiAJYXRvbWljX2luYygmbW0tPmNvbnRleHQuZmx1c2hfY291bnQpOwogCWlmIChNQUNISU5FX0hBU19UTEJfTEMgJiYKIAkgICAgY3B1bWFza19lcXVhbChtbV9jcHVtYXNrKG1tKSwgY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpKSkKLQkJX19wdGVwX2lwdGVfbG9jYWwoYWRkciwgcHRlcCk7CisJCV9fcHRlcF9pcHRlKGFkZHIsIHB0ZXAsIElQVEVfTE9DQUwpOwogCWVsc2UKLQkJX19wdGVwX2lwdGUoYWRkciwgcHRlcCk7CisJCV9fcHRlcF9pcHRlKGFkZHIsIHB0ZXAsIElQVEVfR0xPQkFMKTsKIAlhdG9taWNfZGVjKCZtbS0+Y29udGV4dC5mbHVzaF9jb3VudCk7CiAJcmV0dXJuIG9sZDsKIH0KQEAgLTU2LDcgKzU2LDcgQEAKIAkJcHRlX3ZhbCgqcHRlcCkgfD0gX1BBR0VfSU5WQUxJRDsKIAkJbW0tPmNvbnRleHQuZmx1c2hfbW0gPSAxOwogCX0gZWxzZQotCQlfX3B0ZXBfaXB0ZShhZGRyLCBwdGVwKTsKKwkJX19wdGVwX2lwdGUoYWRkciwgcHRlcCwgSVBURV9HTE9CQUwpOwogCWF0b21pY19kZWMoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50KTsKIAlyZXR1cm4gb2xkOwogfQpAQCAtMzAxLDkgKzMwMSw5IEBACiAJYXRvbWljX2luYygmbW0tPmNvbnRleHQuZmx1c2hfY291bnQpOwogCWlmIChNQUNISU5FX0hBU19UTEJfTEMgJiYKIAkgICAgY3B1bWFza19lcXVhbChtbV9jcHVtYXNrKG1tKSwgY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpKSkKLQkJX19wbWRwX2lkdGVfbG9jYWwoYWRkciwgcG1kcCk7CisJCV9fcG1kcF9pZHRlKGFkZHIsIHBtZHAsIElEVEVfTE9DQUwpOwogCWVsc2UKLQkJX19wbWRwX2lkdGUoYWRkciwgcG1kcCk7CisJCV9fcG1kcF9pZHRlKGFkZHIsIHBtZHAsIElEVEVfR0xPQkFMKTsKIAlhdG9taWNfZGVjKCZtbS0+Y29udGV4dC5mbHVzaF9jb3VudCk7CiAJcmV0dXJuIG9sZDsKIH0KQEAgLTMyMiw3ICszMjIsNyBAQAogCQlwbWRfdmFsKCpwbWRwKSB8PSBfU0VHTUVOVF9FTlRSWV9JTlZBTElEOwogCQltbS0+Y29udGV4dC5mbHVzaF9tbSA9IDE7CiAJfSBlbHNlIGlmIChNQUNISU5FX0hBU19JRFRFKQotCQlfX3BtZHBfaWR0ZShhZGRyLCBwbWRwKTsKKwkJX19wbWRwX2lkdGUoYWRkciwgcG1kcCwgSURURV9HTE9CQUwpOwogCWVsc2UKIAkJX19wbWRwX2NzcChwbWRwKTsKIAlhdG9taWNfZGVjKCZtbS0+Y29udGV4dC5mbHVzaF9jb3VudCk7CkBAIC0zNzQsOSArMzc0LDkgQEAKIAlhdG9taWNfaW5jKCZtbS0+Y29udGV4dC5mbHVzaF9jb3VudCk7CiAJaWYgKE1BQ0hJTkVfSEFTX1RMQl9MQyAmJgogCSAgICBjcHVtYXNrX2VxdWFsKG1tX2NwdW1hc2sobW0pLCBjcHVtYXNrX29mKHNtcF9wcm9jZXNzb3JfaWQoKSkpKQotCQlfX3B1ZHBfaWR0ZV9sb2NhbChhZGRyLCBwdWRwKTsKKwkJX19wdWRwX2lkdGUoYWRkciwgcHVkcCwgSURURV9MT0NBTCk7CiAJZWxzZQotCQlfX3B1ZHBfaWR0ZShhZGRyLCBwdWRwKTsKKwkJX19wdWRwX2lkdGUoYWRkciwgcHVkcCwgSURURV9HTE9CQUwpOwogCWF0b21pY19kZWMoJm1tLT5jb250ZXh0LmZsdXNoX2NvdW50KTsKIAlyZXR1cm4gb2xkOwogfQpAQCAtNjIwLDcgKzYyMCw3IEBACiAJcHRlID0gKnB0ZXA7CiAJaWYgKGRpcnR5ICYmIChwdGVfdmFsKHB0ZSkgJiBfUEFHRV9QUkVTRU5UKSkgewogCQlwZ3N0ZSA9IHBnc3RlX3B0ZV9ub3RpZnkobW0sIGFkZHIsIHB0ZXAsIHBnc3RlKTsKLQkJX19wdGVwX2lwdGUoYWRkciwgcHRlcCk7CisJCV9fcHRlcF9pcHRlKGFkZHIsIHB0ZXAsIElQVEVfR0xPQkFMKTsKIAkJaWYgKE1BQ0hJTkVfSEFTX0VTT1AgfHwgIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9XUklURSkpCiAJCQlwdGVfdmFsKHB0ZSkgfD0gX1BBR0VfUFJPVEVDVDsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL3BjaS9wY2kuYyBiL2FyY2gvczM5MC9wY2kvcGNpLmMKaW5kZXggODcxYWY3NS4uMTVmZmMxOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL3BjaS9wY2kuYworKysgYi9hcmNoL3MzOTAvcGNpL3BjaS5jCkBAIC04NTQsNiArODU0LDE1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh6cGNpX3N0b3BfZGV2aWNlKTsKIAoraW50IHpwY2lfcmVwb3J0X2Vycm9yKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkgICAgICBzdHJ1Y3QgenBjaV9yZXBvcnRfZXJyb3JfaGVhZGVyICpyZXBvcnQpCit7CisJc3RydWN0IHpwY2lfZGV2ICp6ZGV2ID0gdG9fenBjaShwZGV2KTsKKworCXJldHVybiBzY2xwX3BjaV9yZXBvcnQocmVwb3J0LCB6ZGV2LT5maCwgemRldi0+ZmlkKTsKK30KK0VYUE9SVF9TWU1CT0woenBjaV9yZXBvcnRfZXJyb3IpOworCiBzdGF0aWMgaW5saW5lIGludCBiYXJzaXplKHU4IHNpemUpCiB7CiAJcmV0dXJuIChzaXplKSA/ICgxIDw8IHNpemUpID4+IDEwIDogMDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9wY2kvcGNpX2RtYS5jIGIvYXJjaC9zMzkwL3BjaS9wY2lfZG1hLmMKaW5kZXggNzI5N2ZjZS4uNzM1MGM4YiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL3BjaS9wY2lfZG1hLmMKKysrIGIvYXJjaC9zMzkwL3BjaS9wY2lfZG1hLmMKQEAgLTEyOSwxMiArMTI5LDExIEBACiAJCWVudHJ5X2Nscl9wcm90ZWN0ZWQoZW50cnkpOwogfQogCi1zdGF0aWMgaW50IGRtYV91cGRhdGVfdHJhbnMoc3RydWN0IHpwY2lfZGV2ICp6ZGV2LCB1bnNpZ25lZCBsb25nIHBhLAotCQkJICAgIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IF9fZG1hX3VwZGF0ZV90cmFucyhzdHJ1Y3QgenBjaV9kZXYgKnpkZXYsIHVuc2lnbmVkIGxvbmcgcGEsCisJCQkgICAgICBkbWFfYWRkcl90IGRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQogewogCXVuc2lnbmVkIGludCBucl9wYWdlcyA9IFBBR0VfQUxJR04oc2l6ZSkgPj4gUEFHRV9TSElGVDsKIAl1OCAqcGFnZV9hZGRyID0gKHU4ICopIChwYSAmIFBBR0VfTUFTSyk7Ci0JZG1hX2FkZHJfdCBzdGFydF9kbWFfYWRkciA9IGRtYV9hZGRyOwogCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwogCXVuc2lnbmVkIGxvbmcgKmVudHJ5OwogCWludCBpLCByYyA9IDA7CkBAIC0xNDUsNyArMTQ0LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmemRldi0+ZG1hX3RhYmxlX2xvY2ssIGlycV9mbGFncyk7CiAJaWYgKCF6ZGV2LT5kbWFfdGFibGUpIHsKIAkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG5vX3JlZnJlc2g7CisJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgewpAQCAtMTU5LDIwICsxNTgsNiBAQAogCQlkbWFfYWRkciArPSBQQUdFX1NJWkU7CiAJfQogCi0JLyoKLQkgKiBXaXRoIHpkZXYtPnRsYl9yZWZyZXNoID09IDAsIHJwY2l0IGlzIG5vdCByZXF1aXJlZCB0byBlc3RhYmxpc2ggbmV3Ci0JICogdHJhbnNsYXRpb25zIHdoZW4gcHJldmlvdXNseSBpbnZhbGlkIHRyYW5zbGF0aW9uLXRhYmxlIGVudHJpZXMgYXJlCi0JICogdmFsaWRhdGVkLiBXaXRoIGxhenkgdW5tYXAsIGl0IGFsc28gaXMgc2tpcHBlZCBmb3IgcHJldmlvdXNseSB2YWxpZAotCSAqIGVudHJpZXMsIGJ1dCBhIGdsb2JhbCBycGNpdCBpcyB0aGVuIHJlcXVpcmVkIGJlZm9yZSBhbnkgYWRkcmVzcyBjYW4KLQkgKiBiZSByZS11c2VkLCBpLmUuIGFmdGVyIGVhY2ggaW9tbXUgYml0bWFwIHdyYXAtYXJvdW5kLgotCSAqLwotCWlmICghemRldi0+dGxiX3JlZnJlc2ggJiYKLQkJCSghczM5MF9pb21tdV9zdHJpY3QgfHwKLQkJCSgoZmxhZ3MgJiBaUENJX1BURV9WQUxJRF9NQVNLKSA9PSBaUENJX1BURV9WQUxJRCkpKQotCQlnb3RvIG5vX3JlZnJlc2g7Ci0KLQlyYyA9IHpwY2lfcmVmcmVzaF90cmFucygodTY0KSB6ZGV2LT5maCA8PCAzMiwgc3RhcnRfZG1hX2FkZHIsCi0JCQkJbnJfcGFnZXMgKiBQQUdFX1NJWkUpOwogdW5kb19jcHVfdHJhbnM6CiAJaWYgKHJjICYmICgoZmxhZ3MgJiBaUENJX1BURV9WQUxJRF9NQVNLKSA9PSBaUENJX1BURV9WQUxJRCkpIHsKIAkJZmxhZ3MgPSBaUENJX1BURV9JTlZBTElEOwpAQCAtMTg1LDEyICsxNzAsNDYgQEAKIAkJCWRtYV91cGRhdGVfY3B1X3RyYW5zKGVudHJ5LCBwYWdlX2FkZHIsIGZsYWdzKTsKIAkJfQogCX0KLQotbm9fcmVmcmVzaDoKK291dF91bmxvY2s6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmemRldi0+ZG1hX3RhYmxlX2xvY2ssIGlycV9mbGFncyk7CiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IF9fZG1hX3B1cmdlX3RsYihzdHJ1Y3QgenBjaV9kZXYgKnpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQkgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCS8qCisJICogV2l0aCB6ZGV2LT50bGJfcmVmcmVzaCA9PSAwLCBycGNpdCBpcyBub3QgcmVxdWlyZWQgdG8gZXN0YWJsaXNoIG5ldworCSAqIHRyYW5zbGF0aW9ucyB3aGVuIHByZXZpb3VzbHkgaW52YWxpZCB0cmFuc2xhdGlvbi10YWJsZSBlbnRyaWVzIGFyZQorCSAqIHZhbGlkYXRlZC4gV2l0aCBsYXp5IHVubWFwLCBpdCBhbHNvIGlzIHNraXBwZWQgZm9yIHByZXZpb3VzbHkgdmFsaWQKKwkgKiBlbnRyaWVzLCBidXQgYSBnbG9iYWwgcnBjaXQgaXMgdGhlbiByZXF1aXJlZCBiZWZvcmUgYW55IGFkZHJlc3MgY2FuCisJICogYmUgcmUtdXNlZCwgaS5lLiBhZnRlciBlYWNoIGlvbW11IGJpdG1hcCB3cmFwLWFyb3VuZC4KKwkgKi8KKwlpZiAoIXpkZXYtPnRsYl9yZWZyZXNoICYmCisJCQkoIXMzOTBfaW9tbXVfc3RyaWN0IHx8CisJCQkoKGZsYWdzICYgWlBDSV9QVEVfVkFMSURfTUFTSykgPT0gWlBDSV9QVEVfVkFMSUQpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4genBjaV9yZWZyZXNoX3RyYW5zKCh1NjQpIHpkZXYtPmZoIDw8IDMyLCBkbWFfYWRkciwKKwkJCQkgIFBBR0VfQUxJR04oc2l6ZSkpOworfQorCitzdGF0aWMgaW50IGRtYV91cGRhdGVfdHJhbnMoc3RydWN0IHpwY2lfZGV2ICp6ZGV2LCB1bnNpZ25lZCBsb25nIHBhLAorCQkJICAgIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJaW50IHJjOworCisJcmMgPSBfX2RtYV91cGRhdGVfdHJhbnMoemRldiwgcGEsIGRtYV9hZGRyLCBzaXplLCBmbGFncyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IF9fZG1hX3B1cmdlX3RsYih6ZGV2LCBkbWFfYWRkciwgc2l6ZSwgZmxhZ3MpOworCWlmIChyYyAmJiAoKGZsYWdzICYgWlBDSV9QVEVfVkFMSURfTUFTSykgPT0gWlBDSV9QVEVfVkFMSUQpKQorCQlfX2RtYV91cGRhdGVfdHJhbnMoemRldiwgcGEsIGRtYV9hZGRyLCBzaXplLCBaUENJX1BURV9JTlZBTElEKTsKKworCXJldHVybiByYzsKK30KKwogdm9pZCBkbWFfZnJlZV9zZWdfdGFibGUodW5zaWduZWQgbG9uZyBlbnRyeSkKIHsKIAl1bnNpZ25lZCBsb25nICpzdG8gPSBnZXRfcnRfc3RvKGVudHJ5KTsKQEAgLTIzMCw0NSArMjQ5LDU0IEBACiAJCQkJYm91bmRhcnlfc2l6ZSwgMCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9hbGxvY19pb21tdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzaXplKQorc3RhdGljIGRtYV9hZGRyX3QgZG1hX2FsbG9jX2FkZHJlc3Moc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgenBjaV9kZXYgKnpkZXYgPSB0b196cGNpKHRvX3BjaV9kZXYoZGV2KSk7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGZsYWdzOwotCWludCB3cmFwID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ6ZGV2LT5pb21tdV9iaXRtYXBfbG9jaywgZmxhZ3MpOwogCW9mZnNldCA9IF9fZG1hX2FsbG9jX2lvbW11KGRldiwgemRldi0+bmV4dF9iaXQsIHNpemUpOwogCWlmIChvZmZzZXQgPT0gLTEpIHsKKwkJaWYgKCF6ZGV2LT50bGJfcmVmcmVzaCAmJiAhczM5MF9pb21tdV9zdHJpY3QpIHsKKwkJCS8qIGdsb2JhbCBmbHVzaCBiZWZvcmUgRE1BIGFkZHJlc3NlcyBhcmUgcmV1c2VkICovCisJCQlpZiAoenBjaV9yZWZyZXNoX2dsb2JhbCh6ZGV2KSkKKwkJCQlnb3RvIG91dF9lcnJvcjsKKworCQkJYml0bWFwX2FuZG5vdCh6ZGV2LT5pb21tdV9iaXRtYXAsIHpkZXYtPmlvbW11X2JpdG1hcCwKKwkJCQkgICAgICB6ZGV2LT5sYXp5X2JpdG1hcCwgemRldi0+aW9tbXVfcGFnZXMpOworCQkJYml0bWFwX3plcm8oemRldi0+bGF6eV9iaXRtYXAsIHpkZXYtPmlvbW11X3BhZ2VzKTsKKwkJfQogCQkvKiB3cmFwLWFyb3VuZCAqLwogCQlvZmZzZXQgPSBfX2RtYV9hbGxvY19pb21tdShkZXYsIDAsIHNpemUpOwotCQl3cmFwID0gMTsKKwkJaWYgKG9mZnNldCA9PSAtMSkKKwkJCWdvdG8gb3V0X2Vycm9yOwogCX0KLQotCWlmIChvZmZzZXQgIT0gLTEpIHsKLQkJemRldi0+bmV4dF9iaXQgPSBvZmZzZXQgKyBzaXplOwotCQlpZiAoIXpkZXYtPnRsYl9yZWZyZXNoICYmICFzMzkwX2lvbW11X3N0cmljdCAmJiB3cmFwKQotCQkJLyogZ2xvYmFsIGZsdXNoIGFmdGVyIHdyYXAtYXJvdW5kIHdpdGggbGF6eSB1bm1hcCAqLwotCQkJenBjaV9yZWZyZXNoX2dsb2JhbCh6ZGV2KTsKLQl9CisJemRldi0+bmV4dF9iaXQgPSBvZmZzZXQgKyBzaXplOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpkZXYtPmlvbW11X2JpdG1hcF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIG9mZnNldDsKKworCXJldHVybiB6ZGV2LT5zdGFydF9kbWEgKyBvZmZzZXQgKiBQQUdFX1NJWkU7CisKK291dF9lcnJvcjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ZGV2LT5pb21tdV9iaXRtYXBfbG9jaywgZmxhZ3MpOworCXJldHVybiBETUFfRVJST1JfQ09ERTsKIH0KIAotc3RhdGljIHZvaWQgZG1hX2ZyZWVfaW9tbXUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IHNpemUpCitzdGF0aWMgdm9pZCBkbWFfZnJlZV9hZGRyZXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwgaW50IHNpemUpCiB7CiAJc3RydWN0IHpwY2lfZGV2ICp6ZGV2ID0gdG9fenBjaSh0b19wY2lfZGV2KGRldikpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFncywgb2Zmc2V0OworCisJb2Zmc2V0ID0gKGRtYV9hZGRyIC0gemRldi0+c3RhcnRfZG1hKSA+PiBQQUdFX1NISUZUOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnpkZXYtPmlvbW11X2JpdG1hcF9sb2NrLCBmbGFncyk7CiAJaWYgKCF6ZGV2LT5pb21tdV9iaXRtYXApCiAJCWdvdG8gb3V0OwotCWJpdG1hcF9jbGVhcih6ZGV2LT5pb21tdV9iaXRtYXAsIG9mZnNldCwgc2l6ZSk7Ci0JLyoKLQkgKiBMYXp5IGZsdXNoIGZvciB1bm1hcDogbmVlZCB0byBtb3ZlIG5leHRfYml0IHRvIGF2b2lkIGFkZHJlc3MgcmUtdXNlCi0JICogdW50aWwgd3JhcC1hcm91bmQuCi0JICovCi0JaWYgKCFzMzkwX2lvbW11X3N0cmljdCAmJiBvZmZzZXQgPj0gemRldi0+bmV4dF9iaXQpCi0JCXpkZXYtPm5leHRfYml0ID0gb2Zmc2V0ICsgc2l6ZTsKKworCWlmICh6ZGV2LT50bGJfcmVmcmVzaCB8fCBzMzkwX2lvbW11X3N0cmljdCkKKwkJYml0bWFwX2NsZWFyKHpkZXYtPmlvbW11X2JpdG1hcCwgb2Zmc2V0LCBzaXplKTsKKwllbHNlCisJCWJpdG1hcF9zZXQoemRldi0+bGF6eV9iaXRtYXAsIG9mZnNldCwgc2l6ZSk7CisKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ6ZGV2LT5pb21tdV9iaXRtYXBfbG9jaywgZmxhZ3MpOwogfQpAQCAtMjg5LDE2ICszMTcsMTYgQEAKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCiB7CiAJc3RydWN0IHpwY2lfZGV2ICp6ZGV2ID0gdG9fenBjaSh0b19wY2lfZGV2KGRldikpOwotCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIGlvbW11X3BhZ2VfaW5kZXg7CiAJdW5zaWduZWQgbG9uZyBwYSA9IHBhZ2VfdG9fcGh5cyhwYWdlKSArIG9mZnNldDsKIAlpbnQgZmxhZ3MgPSBaUENJX1BURV9WQUxJRDsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwogCWRtYV9hZGRyX3QgZG1hX2FkZHI7CiAJaW50IHJldDsKIAogCS8qIFRoaXMgcm91bmRzIHVwIG51bWJlciBvZiBwYWdlcyBiYXNlZCBvbiBzaXplIGFuZCBvZmZzZXQgKi8KIAlucl9wYWdlcyA9IGlvbW11X251bV9wYWdlcyhwYSwgc2l6ZSwgUEFHRV9TSVpFKTsKLQlpb21tdV9wYWdlX2luZGV4ID0gZG1hX2FsbG9jX2lvbW11KGRldiwgbnJfcGFnZXMpOwotCWlmIChpb21tdV9wYWdlX2luZGV4ID09IC0xKSB7CisJZG1hX2FkZHIgPSBkbWFfYWxsb2NfYWRkcmVzcyhkZXYsIG5yX3BhZ2VzKTsKKwlpZiAoZG1hX2FkZHIgPT0gRE1BX0VSUk9SX0NPREUpIHsKIAkJcmV0ID0gLUVOT1NQQzsKIAkJZ290byBvdXRfZXJyOwogCX0KQEAgLTMwNiwxMiArMzM0LDYgQEAKIAkvKiBVc2Ugcm91bmRlZCB1cCBzaXplICovCiAJc2l6ZSA9IG5yX3BhZ2VzICogUEFHRV9TSVpFOwogCi0JZG1hX2FkZHIgPSB6ZGV2LT5zdGFydF9kbWEgKyBpb21tdV9wYWdlX2luZGV4ICogUEFHRV9TSVpFOwotCWlmIChkbWFfYWRkciArIHNpemUgPiB6ZGV2LT5lbmRfZG1hKSB7Ci0JCXJldCA9IC1FUkFOR0U7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCiAJaWYgKGRpcmVjdGlvbiA9PSBETUFfTk9ORSB8fCBkaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKIAkJZmxhZ3MgfD0gWlBDSV9UQUJMRV9QUk9URUNURUQ7CiAKQEAgLTMyMyw3ICszNDUsNyBAQAogCXJldHVybiBkbWFfYWRkciArIChvZmZzZXQgJiB+UEFHRV9NQVNLKTsKIAogb3V0X2ZyZWU6Ci0JZG1hX2ZyZWVfaW9tbXUoZGV2LCBpb21tdV9wYWdlX2luZGV4LCBucl9wYWdlcyk7CisJZG1hX2ZyZWVfYWRkcmVzcyhkZXYsIGRtYV9hZGRyLCBucl9wYWdlcyk7CiBvdXRfZXJyOgogCXpwY2lfZXJyKCJtYXAgZXJyb3I6XG4iKTsKIAl6cGNpX2Vycl9kbWEocmV0LCBwYSk7CkBAIC0zMzUsNyArMzU3LDYgQEAKIAkJCQkgdW5zaWduZWQgbG9uZyBhdHRycykKIHsKIAlzdHJ1Y3QgenBjaV9kZXYgKnpkZXYgPSB0b196cGNpKHRvX3BjaV9kZXYoZGV2KSk7Ci0JdW5zaWduZWQgbG9uZyBpb21tdV9wYWdlX2luZGV4OwogCWludCBucGFnZXMsIHJldDsKIAogCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhkbWFfYWRkciwgc2l6ZSwgUEFHRV9TSVpFKTsKQEAgLTM0OSw4ICszNzAsNyBAQAogCX0KIAogCWF0b21pYzY0X2FkZChucGFnZXMsICZ6ZGV2LT51bm1hcHBlZF9wYWdlcyk7Ci0JaW9tbXVfcGFnZV9pbmRleCA9IChkbWFfYWRkciAtIHpkZXYtPnN0YXJ0X2RtYSkgPj4gUEFHRV9TSElGVDsKLQlkbWFfZnJlZV9pb21tdShkZXYsIGlvbW11X3BhZ2VfaW5kZXgsIG5wYWdlcyk7CisJZG1hX2ZyZWVfYWRkcmVzcyhkZXYsIGRtYV9hZGRyLCBucGFnZXMpOwogfQogCiBzdGF0aWMgdm9pZCAqczM5MF9kbWFfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKQEAgLTM5NCwzNyArNDE0LDk4IEBACiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgcGEsIGdldF9vcmRlcihzaXplKSk7CiB9CiAKKy8qIE1hcCBhIHNlZ21lbnQgaW50byBhIGNvbnRpZ3VvdXMgZG1hIGFkZHJlc3MgYXJlYSAqLworc3RhdGljIGludCBfX3MzOTBfZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkgICAgIHNpemVfdCBzaXplLCBkbWFfYWRkcl90ICpoYW5kbGUsCisJCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3QgenBjaV9kZXYgKnpkZXYgPSB0b196cGNpKHRvX3BjaV9kZXYoZGV2KSk7CisJZG1hX2FkZHJfdCBkbWFfYWRkcl9iYXNlLCBkbWFfYWRkcjsKKwlpbnQgZmxhZ3MgPSBaUENJX1BURV9WQUxJRDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnM7CisJdW5zaWduZWQgbG9uZyBwYTsKKwlpbnQgcmV0OworCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJZG1hX2FkZHJfYmFzZSA9IGRtYV9hbGxvY19hZGRyZXNzKGRldiwgc2l6ZSA+PiBQQUdFX1NISUZUKTsKKwlpZiAoZG1hX2FkZHJfYmFzZSA9PSBETUFfRVJST1JfQ09ERSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkbWFfYWRkciA9IGRtYV9hZGRyX2Jhc2U7CisJaWYgKGRpciA9PSBETUFfTk9ORSB8fCBkaXIgPT0gRE1BX1RPX0RFVklDRSkKKwkJZmxhZ3MgfD0gWlBDSV9UQUJMRV9QUk9URUNURUQ7CisKKwlmb3IgKHMgPSBzZzsgZG1hX2FkZHIgPCBkbWFfYWRkcl9iYXNlICsgc2l6ZTsgcyA9IHNnX25leHQocykpIHsKKwkJcGEgPSBwYWdlX3RvX3BoeXMoc2dfcGFnZShzKSkgKyBzLT5vZmZzZXQ7CisJCXJldCA9IF9fZG1hX3VwZGF0ZV90cmFucyh6ZGV2LCBwYSwgZG1hX2FkZHIsIHMtPmxlbmd0aCwgZmxhZ3MpOworCQlpZiAocmV0KQorCQkJZ290byB1bm1hcDsKKworCQlkbWFfYWRkciArPSBzLT5sZW5ndGg7CisJfQorCXJldCA9IF9fZG1hX3B1cmdlX3RsYih6ZGV2LCBkbWFfYWRkcl9iYXNlLCBzaXplLCBmbGFncyk7CisJaWYgKHJldCkKKwkJZ290byB1bm1hcDsKKworCSpoYW5kbGUgPSBkbWFfYWRkcl9iYXNlOworCWF0b21pYzY0X2FkZChzaXplID4+IFBBR0VfU0hJRlQsICZ6ZGV2LT5tYXBwZWRfcGFnZXMpOworCisJcmV0dXJuIHJldDsKKwordW5tYXA6CisJZG1hX3VwZGF0ZV90cmFucyh6ZGV2LCAwLCBkbWFfYWRkcl9iYXNlLCBkbWFfYWRkciAtIGRtYV9hZGRyX2Jhc2UsCisJCQkgWlBDSV9QVEVfSU5WQUxJRCk7CisJZG1hX2ZyZWVfYWRkcmVzcyhkZXYsIGRtYV9hZGRyX2Jhc2UsIHNpemUgPj4gUEFHRV9TSElGVCk7CisJenBjaV9lcnIoIm1hcCBlcnJvcjpcbiIpOworCXpwY2lfZXJyX2RtYShyZXQsIHBhKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHMzOTBfZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCiAJCQkgICBpbnQgbnJfZWxlbWVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCiB7Ci0JaW50IG1hcHBlZF9lbGVtZW50cyA9IDA7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzOwotCWludCBpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqcyA9IHNnLCAqc3RhcnQgPSBzZywgKmRtYSA9IHNnOworCXVuc2lnbmVkIGludCBtYXggPSBkbWFfZ2V0X21heF9zZWdfc2l6ZShkZXYpOworCXVuc2lnbmVkIGludCBzaXplID0gcy0+b2Zmc2V0ICsgcy0+bGVuZ3RoOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBzLT5vZmZzZXQ7CisJaW50IGNvdW50ID0gMCwgaTsKIAotCWZvcl9lYWNoX3NnKHNnLCBzLCBucl9lbGVtZW50cywgaSkgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHNnX3BhZ2Uocyk7Ci0JCXMtPmRtYV9hZGRyZXNzID0gczM5MF9kbWFfbWFwX3BhZ2VzKGRldiwgcGFnZSwgcy0+b2Zmc2V0LAotCQkJCQkJICAgIHMtPmxlbmd0aCwgZGlyLCAwKTsKLQkJaWYgKCFkbWFfbWFwcGluZ19lcnJvcihkZXYsIHMtPmRtYV9hZGRyZXNzKSkgewotCQkJcy0+ZG1hX2xlbmd0aCA9IHMtPmxlbmd0aDsKLQkJCW1hcHBlZF9lbGVtZW50cysrOwotCQl9IGVsc2UKLQkJCWdvdG8gdW5tYXA7Ci0JfQotb3V0OgotCXJldHVybiBtYXBwZWRfZWxlbWVudHM7CisJZm9yIChpID0gMTsgaSA8IG5yX2VsZW1lbnRzOyBpKyspIHsKKwkJcyA9IHNnX25leHQocyk7CiAKLXVubWFwOgotCWZvcl9lYWNoX3NnKHNnLCBzLCBtYXBwZWRfZWxlbWVudHMsIGkpIHsKLQkJaWYgKHMtPmRtYV9hZGRyZXNzKQotCQkJczM5MF9kbWFfdW5tYXBfcGFnZXMoZGV2LCBzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwKLQkJCQkJICAgICBkaXIsIDApOwotCQlzLT5kbWFfYWRkcmVzcyA9IDA7CisJCXMtPmRtYV9hZGRyZXNzID0gRE1BX0VSUk9SX0NPREU7CiAJCXMtPmRtYV9sZW5ndGggPSAwOworCisJCWlmIChzLT5vZmZzZXQgfHwgKHNpemUgJiB+UEFHRV9NQVNLKSB8fAorCQkgICAgc2l6ZSArIHMtPmxlbmd0aCA+IG1heCkgeworCQkJaWYgKF9fczM5MF9kbWFfbWFwX3NnKGRldiwgc3RhcnQsIHNpemUsCisJCQkJCSAgICAgICZkbWEtPmRtYV9hZGRyZXNzLCBkaXIpKQorCQkJCWdvdG8gdW5tYXA7CisKKwkJCWRtYS0+ZG1hX2FkZHJlc3MgKz0gb2Zmc2V0OworCQkJZG1hLT5kbWFfbGVuZ3RoID0gc2l6ZSAtIG9mZnNldDsKKworCQkJc2l6ZSA9IG9mZnNldCA9IHMtPm9mZnNldDsKKwkJCXN0YXJ0ID0gczsKKwkJCWRtYSA9IHNnX25leHQoZG1hKTsKKwkJCWNvdW50Kys7CisJCX0KKwkJc2l6ZSArPSBzLT5sZW5ndGg7CiAJfQotCW1hcHBlZF9lbGVtZW50cyA9IDA7Ci0JZ290byBvdXQ7CisJaWYgKF9fczM5MF9kbWFfbWFwX3NnKGRldiwgc3RhcnQsIHNpemUsICZkbWEtPmRtYV9hZGRyZXNzLCBkaXIpKQorCQlnb3RvIHVubWFwOworCisJZG1hLT5kbWFfYWRkcmVzcyArPSBvZmZzZXQ7CisJZG1hLT5kbWFfbGVuZ3RoID0gc2l6ZSAtIG9mZnNldDsKKworCXJldHVybiBjb3VudCArIDE7Cit1bm1hcDoKKwlmb3JfZWFjaF9zZyhzZywgcywgY291bnQsIGkpCisJCXMzOTBfZG1hX3VubWFwX3BhZ2VzKGRldiwgc2dfZG1hX2FkZHJlc3MocyksIHNnX2RtYV9sZW4ocyksCisJCQkJICAgICBkaXIsIGF0dHJzKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzMzkwX2RtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCkBAIC00MzUsOCArNTE2LDkgQEAKIAlpbnQgaTsKIAogCWZvcl9lYWNoX3NnKHNnLCBzLCBucl9lbGVtZW50cywgaSkgewotCQlzMzkwX2RtYV91bm1hcF9wYWdlcyhkZXYsIHMtPmRtYV9hZGRyZXNzLCBzLT5kbWFfbGVuZ3RoLCBkaXIsCi0JCQkJICAgICAwKTsKKwkJaWYgKHMtPmRtYV9sZW5ndGgpCisJCQlzMzkwX2RtYV91bm1hcF9wYWdlcyhkZXYsIHMtPmRtYV9hZGRyZXNzLCBzLT5kbWFfbGVuZ3RoLAorCQkJCQkgICAgIGRpciwgYXR0cnMpOwogCQlzLT5kbWFfYWRkcmVzcyA9IDA7CiAJCXMtPmRtYV9sZW5ndGggPSAwOwogCX0KQEAgLTQ4Miw3ICs1NjQsMTQgQEAKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGZyZWVfZG1hX3RhYmxlOwogCX0KKwlpZiAoIXpkZXYtPnRsYl9yZWZyZXNoICYmICFzMzkwX2lvbW11X3N0cmljdCkgeworCQl6ZGV2LT5sYXp5X2JpdG1hcCA9IHZ6YWxsb2MoemRldi0+aW9tbXVfcGFnZXMgLyA4KTsKKwkJaWYgKCF6ZGV2LT5sYXp5X2JpdG1hcCkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBmcmVlX2JpdG1hcDsKKwkJfQogCisJfQogCXJjID0genBjaV9yZWdpc3Rlcl9pb2F0KHpkZXYsIDAsIHpkZXYtPnN0YXJ0X2RtYSwgemRldi0+ZW5kX2RtYSwKIAkJCQkodTY0KSB6ZGV2LT5kbWFfdGFibGUpOwogCWlmIChyYykKQEAgLTQ5Miw2ICs1ODEsOCBAQAogZnJlZV9iaXRtYXA6CiAJdmZyZWUoemRldi0+aW9tbXVfYml0bWFwKTsKIAl6ZGV2LT5pb21tdV9iaXRtYXAgPSBOVUxMOworCXZmcmVlKHpkZXYtPmxhenlfYml0bWFwKTsKKwl6ZGV2LT5sYXp5X2JpdG1hcCA9IE5VTEw7CiBmcmVlX2RtYV90YWJsZToKIAlkbWFfZnJlZV9jcHVfdGFibGUoemRldi0+ZG1hX3RhYmxlKTsKIAl6ZGV2LT5kbWFfdGFibGUgPSBOVUxMOwpAQCAtNTEzLDYgKzYwNCw5IEBACiAJemRldi0+ZG1hX3RhYmxlID0gTlVMTDsKIAl2ZnJlZSh6ZGV2LT5pb21tdV9iaXRtYXApOwogCXpkZXYtPmlvbW11X2JpdG1hcCA9IE5VTEw7CisJdmZyZWUoemRldi0+bGF6eV9iaXRtYXApOworCXpkZXYtPmxhenlfYml0bWFwID0gTlVMTDsKKwogCXpkZXYtPm5leHRfYml0ID0gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zY29yZS9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAppbmRleCAyMGEzNTkxLi4wMWFlYzhjIDEwMDY0NAotLS0gYS9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMTYzLDcgKzE2Myw3IEBACiAJCV9fZ2V0X3VzZXJfYXNtKHZhbCwgImx3IiwgcHRyKTsJCQkJXAogCQkgYnJlYWs7CQkJCQkJCVwKIAljYXNlIDg6IAkJCQkJCQlcCi0JCWlmICgoY29weV9mcm9tX3VzZXIoKHZvaWQgKikmdmFsLCBwdHIsIDgpKSA9PSAwKQlcCisJCWlmIChfX2NvcHlfZnJvbV91c2VyKCh2b2lkICopJnZhbCwgcHRyLCA4KSA9PSAwKQlcCiAJCQlfX2d1X2VyciA9IDA7CQkJCQlcCiAJCWVsc2UJCQkJCQkJXAogCQkJX19ndV9lcnIgPSAtRUZBVUxUOwkJCQlcCkBAIC0xODgsNiArMTg4LDggQEAKIAkJCQkJCQkJCVwKIAlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgX19ndV9wdHIsIHNpemUpKSkJCVwKIAkJX19nZXRfdXNlcl9jb21tb24oKHgpLCBzaXplLCBfX2d1X3B0cik7CQkJXAorCWVsc2UJCQkJCQkJCVwKKwkJKHgpID0gMDsJCQkJCQlcCiAJCQkJCQkJCQlcCiAJX19ndV9lcnI7CQkJCQkJCVwKIH0pCkBAIC0yMDEsNiArMjAzLDcgQEAKIAkJIjI6XG4iCQkJCQkJCVwKIAkJIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCQkJXAogCQkiMzpsaQklMCwgJTRcbiIJCQkJCVwKKwkJImxpCSUxLCAwXG4iCQkJCQlcCiAJCSJqCTJiXG4iCQkJCQkJXAogCQkiLnByZXZpb3VzXG4iCQkJCQkJXAogCQkiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJCQlcCkBAIC0yOTgsMzUgKzMwMSwzNCBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBsZW4pCiB7Ci0JdW5zaWduZWQgbG9uZyBvdmVyOworCXVuc2lnbmVkIGxvbmcgcmVzID0gbGVuOwogCi0JaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbGVuKSkKLQkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKTsKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbGVuKSkpCisJCXJlcyA9IF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKTsKIAotCWlmICgodW5zaWduZWQgbG9uZylmcm9tIDwgVEFTS19TSVpFKSB7Ci0JCW92ZXIgPSAodW5zaWduZWQgbG9uZylmcm9tICsgbGVuIC0gVEFTS19TSVpFOwotCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4gLSBvdmVyKSArIG92ZXI7Ci0JfQotCXJldHVybiBsZW47CisJaWYgKHVubGlrZWx5KHJlcykpCisJCW1lbXNldCh0byArIChsZW4gLSByZXMpLCAwLCByZXMpOworCisJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBjb3B5X3RvX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbGVuKQogewotCXVuc2lnbmVkIGxvbmcgb3ZlcjsKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBsZW4pKSkKKwkJbGVuID0gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pOwogCi0JaWYgKGFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHRvLCBsZW4pKQotCQlyZXR1cm4gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pOwotCi0JaWYgKCh1bnNpZ25lZCBsb25nKXRvIDwgVEFTS19TSVpFKSB7Ci0JCW92ZXIgPSAodW5zaWduZWQgbG9uZyl0byArIGxlbiAtIFRBU0tfU0laRTsKLQkJcmV0dXJuIF9fY29weV90b2Zyb21fdXNlcih0bywgZnJvbSwgbGVuIC0gb3ZlcikgKyBvdmVyOwotCX0KIAlyZXR1cm4gbGVuOwogfQogCi0jZGVmaW5lIF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIGxlbikJXAotCQlfX2NvcHlfdG9mcm9tX3VzZXIoKHRvKSwgKGZyb20pLCAobGVuKSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworX19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBsZWZ0ID0gX19jb3B5X3RvZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pOworCWlmICh1bmxpa2VseShsZWZ0KSkKKwkJbWVtc2V0KHRvICsgKGxlbiAtIGxlZnQpLCAwLCBsZWZ0KTsKKwlyZXR1cm4gbGVmdDsKK30KIAogI2RlZmluZSBfX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbGVuKQkJXAogCQlfX2NvcHlfdG9mcm9tX3VzZXIoKHRvKSwgKGZyb20pLCAobGVuKSkKQEAgLTM0MCwxNyArMzQyLDE3IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbGVuKQogewotCXJldHVybiBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBsZW4pOworCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIGxlbik7CiB9CiAKLSNkZWZpbmUgX19jb3B5X2luX3VzZXIodG8sIGZyb20sIGxlbikJX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbGVuKQorI2RlZmluZSBfX2NvcHlfaW5fdXNlcih0bywgZnJvbSwgbGVuKQlfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIGxlbikKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBjb3B5X2luX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCWlmIChhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIGxlbikgJiYKIAkJICAgICAgYWNjZXNzX29rKFZFUkZJVFlfV1JJVEUsIHRvLCBsZW4pKQotCQlyZXR1cm4gY29weV9mcm9tX3VzZXIodG8sIGZyb20sIGxlbik7CisJCXJldHVybiBfX2NvcHlfdG9mcm9tX3VzZXIodG8sIGZyb20sIGxlbik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy1sbHNjLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy1sbHNjLmgKaW5kZXggY2FlYTJjNC4uMWQxNTljZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMtbGxzYy5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLWxsc2MuaApAQCAtNjAsNyArNjAsNyBAQAogIgltb3Zjby5sCSUwLCBAJTMJCQkJCVxuIgkJXAogIgliZgkxYgkJCQkJXG4iCQlcCiAiCXN5bmNvCQkJCQkJXG4iCQlcCi0JOiAiPSZ6IiAodGVtcCksICI9JnoiIChyZXMpCQkJCQlcCisJOiAiPSZ6IiAodGVtcCksICI9JnIiIChyZXMpCQkJCQlcCiAJOiAiciIgKGkpLCAiciIgKCZ2LT5jb3VudGVyKQkJCQkJXAogCTogInQiKTsJCQkJCQkJCVwKIAkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggYTQ5NjM1Yy4uOTJhZGU3OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTE1MSw3ICsxNTEsMTAgQEAKIAlfX2tlcm5lbF9zaXplX3QgX19jb3B5X3NpemUgPSAoX19rZXJuZWxfc2l6ZV90KSBuOwogCiAJaWYgKF9fY29weV9zaXplICYmIF9fYWNjZXNzX29rKF9fY29weV9mcm9tLCBfX2NvcHlfc2l6ZSkpCi0JCXJldHVybiBfX2NvcHlfdXNlcih0bywgZnJvbSwgX19jb3B5X3NpemUpOworCQlfX2NvcHlfc2l6ZSA9IF9fY29weV91c2VyKHRvLCBmcm9tLCBfX2NvcHlfc2l6ZSk7CisKKwlpZiAodW5saWtlbHkoX19jb3B5X3NpemUpKQorCQltZW1zZXQodG8gKyAobiAtIF9fY29weV9zaXplKSwgMCwgX19jb3B5X3NpemUpOwogCiAJcmV0dXJuIF9fY29weV9zaXplOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaAppbmRleCBjMDEzNzZjLi5jYTUwNzNkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaApAQCAtMjQsNiArMjQsNyBAQAogI2RlZmluZSBfX2dldF91c2VyX3NpemUoeCxwdHIsc2l6ZSxyZXR2YWwpCQkJXAogZG8gewkJCQkJCQkJXAogCXJldHZhbCA9IDA7CQkJCQkJXAorCXggPSAwOwkJCQkJCQlcCiAJc3dpdGNoIChzaXplKSB7CQkJCQkJXAogCWNhc2UgMToJCQkJCQkJXAogCQlyZXR2YWwgPSBfX2dldF91c2VyX2FzbV9iKCh2b2lkICopJngsCQlcCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zbXAtc2h4My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc21wLXNoeDMuYwppbmRleCA4Mzk2MTJjLi4wZDM2MzdjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zbXAtc2h4My5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NtcC1zaHgzLmMKQEAgLTEyMiwzMiArMTIyLDE2IEBACiAJX19yYXdfd3JpdGVsKFNUQkNSX1JFU0VULCBTVEJDUl9SRUcoY3B1KSk7CiB9CiAKLXN0YXRpYyBpbnQKLXNoeDNfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgc2h4M19jcHVfcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgaW50KWhjcHU7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQ1BVX1VQX1BSRVBBUkU6Ci0JCXNoeDNfdXBkYXRlX2Jvb3RfdmVjdG9yKGNwdSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX09OTElORToKLQkJcHJfaW5mbygiQ1BVICV1IGlzIG5vdyBvbmxpbmVcbiIsIGNwdSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RFQUQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBOT1RJRllfT0s7CisJc2h4M191cGRhdGVfYm9vdF92ZWN0b3IoY3B1KTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzaHgzX2NwdV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbAkJPSBzaHgzX2NwdV9jYWxsYmFjaywKLX07Ci0KIHN0YXRpYyBpbnQgcmVnaXN0ZXJfc2h4M19jcHVfbm90aWZpZXIodm9pZCkKIHsKLQlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnNoeDNfY3B1X25vdGlmaWVyKTsKKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX1NIX1NIM1hfUFJFUEFSRSwgInNoL3NoeDM6cHJlcGFyZSIsCisJCQkJICBzaHgzX2NwdV9wcmVwYXJlLCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIGxhdGVfaW5pdGNhbGwocmVnaXN0ZXJfc2h4M19jcHVfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvZnRyYWNlLmMgYi9hcmNoL3NoL2tlcm5lbC9mdHJhY2UuYwppbmRleCAzODk5M2UwLi41Mzc4Mzk3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL3NoL2tlcm5lbC9mdHJhY2UuYwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJCWNsZWFyX21vZF9mbGFnKCk7CiB9CiAKLXZvaWQgZnRyYWNlX25taV9lbnRlcih2b2lkKQordm9pZCBhcmNoX2Z0cmFjZV9ubWlfZW50ZXIodm9pZCkKIHsKIAlpZiAoYXRvbWljX2luY19yZXR1cm4oJm5taV9ydW5uaW5nKSAmIE1PRF9DT0RFX1dSSVRFX0ZMQUcpIHsKIAkJc21wX3JtYigpOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJc21wX21iKCk7CiB9CiAKLXZvaWQgZnRyYWNlX25taV9leGl0KHZvaWQpCit2b2lkIGFyY2hfZnRyYWNlX25taV9leGl0KHZvaWQpCiB7CiAJLyogRmluaXNoIGFsbCBleGVjdXRpb25zIGJlZm9yZSBjbGVhcmluZyBubWlfcnVubmluZyAqLwogCXNtcF9tYigpOwpAQCAtMzgyLDcgKzM4Miw3IEBACiAJCXJldHVybjsKIAl9CiAKLQllcnIgPSBmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2Uob2xkLCBzZWxmX2FkZHIsICZ0cmFjZS5kZXB0aCwgMCk7CisJZXJyID0gZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKG9sZCwgc2VsZl9hZGRyLCAmdHJhY2UuZGVwdGgsIDAsIE5VTEwpOwogCWlmIChlcnIgPT0gLUVCVVNZKSB7CiAJCV9fcmF3X3dyaXRlbChvbGQsIHBhcmVudCk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvS2NvbmZpZyBiL2FyY2gvc3BhcmMvS2NvbmZpZwppbmRleCA1OWIwOTYwLi5mNWQ2MGYxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL0tjb25maWcKKysrIGIvYXJjaC9zcGFyYy9LY29uZmlnCkBAIC01Niw3ICs1Niw2IEBACiAJZGVmX2Jvb2wgNjRCSVQKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9UUkFDRVIKIAlzZWxlY3QgSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVIKLQlzZWxlY3QgSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUCiAJc2VsZWN0IEhBVkVfS1JFVFBST0JFUwogCXNlbGVjdCBIQVZFX0tQUk9CRVMKIAlzZWxlY3QgSEFWRV9SQ1VfVEFCTEVfRlJFRSBpZiBTTVAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZnRyYWNlLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2Z0cmFjZS5oCmluZGV4IDMxOTJhOGUuLjYyNzU1YTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vZnRyYWNlLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9mdHJhY2UuaApAQCAtOSw2ICs5LDEwIEBACiB2b2lkIF9tY291bnQodm9pZCk7CiAjZW5kaWYKIAorI2VuZGlmIC8qIENPTkZJR19NQ09VTlQgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NQQVJDNjQpICYmICFkZWZpbmVkKENDX1VTRV9GRU5UUlkpCisjZGVmaW5lIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRFlOQU1JQ19GVFJBQ0UKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKaW5kZXggZjViNjUzNy4uNjY2ZDViYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKQEAgLTE3NDQsNiArMTc0NCw3IEBACiAKICNkZWZpbmUgSFZfUENJX01BUF9BVFRSX1JFQUQJCTB4MDEKICNkZWZpbmUgSFZfUENJX01BUF9BVFRSX1dSSVRFCQkweDAyCisjZGVmaW5lIEhWX1BDSV9NQVBfQVRUUl9SRUxBWEVEX09SREVSCTB4MDQKIAogI2RlZmluZSBIVl9QQ0lfREVWSUNFX0JVSUxEKGIsZCxmKQlcCiAJKCgoKGIpICYgMHhmZikgPDwgMTYpIHwgXApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BhZ2VfNjQuaAppbmRleCA4YzJhOGM5Li5jMTI2M2ZjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BhZ2VfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3BhZ2VfNjQuaApAQCAtMjUsNiArMjUsNyBAQAogI2RlZmluZSBIUEFHRV9NQVNLCQkofihIUEFHRV9TSVpFIC0gMVVMKSkKICNkZWZpbmUgSFVHRVRMQl9QQUdFX09SREVSCShIUEFHRV9TSElGVCAtIFBBR0VfU0hJRlQpCiAjZGVmaW5lIEhBVkVfQVJDSF9IVUdFVExCX1VOTUFQUEVEX0FSRUEKKyNkZWZpbmUgUkVBTF9IUEFHRV9QRVJfSFBBR0UJKF9BQygxLFVMKSA8PCAoSFBBR0VfU0hJRlQgLSBSRUFMX0hQQUdFX1NISUZUKSkKICNlbmRpZgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zbXBfNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc21wXzY0LmgKaW5kZXggMjZkOWU3Ny4uY2UyMjMzZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zbXBfNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NtcF82NC5oCkBAIC00Myw2ICs0Myw3IEBACiBpbnQgaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpOwogI2RlZmluZSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmNwdSkKIAordm9pZCBzbXBfZmlsbF9pbl9jcHVfcG9zc2libGVfbWFwKHZvaWQpOwogdm9pZCBzbXBfZmlsbF9pbl9zaWJfY29yZV9tYXBzKHZvaWQpOwogdm9pZCBjcHVfcGxheV9kZWFkKHZvaWQpOwogCkBAIC03Miw2ICs3Myw3IEBACiAjZGVmaW5lIHNtcF9maWxsX2luX3NpYl9jb3JlX21hcHMoKSBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHNtcF9mZXRjaF9nbG9iYWxfcmVncygpIGRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgc21wX2ZldGNoX2dsb2JhbF9wbXUoKSBkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNtcF9maWxsX2luX2NwdV9wb3NzaWJsZV9tYXAoKSBkbyB7IH0gd2hpbGUgKDApCiAKICNlbmRpZiAvKiAhKENPTkZJR19TTVApICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdWFjY2Vzc18zMi5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91YWNjZXNzXzMyLmgKaW5kZXggMzQxYTVhMS4uZWE1NWY4NiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91YWNjZXNzXzMyLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91YWNjZXNzXzMyLmgKQEAgLTI0OSw4ICsyNDksNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpZiAobiAmJiBfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZykgdG8sIG4pKSB7Ci0JCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCi0JCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKKwkJY2hlY2tfb2JqZWN0X3NpemUoZnJvbSwgbiwgdHJ1ZSk7CiAJCXJldHVybiBfX2NvcHlfdXNlcih0bywgKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKikgZnJvbSwgbik7CiAJfSBlbHNlCiAJCXJldHVybiBuOwpAQCAtMjU4LDE5ICsyNTcsMTkgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotCWlmICghX19idWlsdGluX2NvbnN0YW50X3AobikpCi0JCWNoZWNrX29iamVjdF9zaXplKGZyb20sIG4sIHRydWUpOworCWNoZWNrX29iamVjdF9zaXplKGZyb20sIG4sIHRydWUpOwogCXJldHVybiBfX2NvcHlfdXNlcih0bywgKF9fZm9yY2Ugdm9pZCBfX3VzZXIgKikgZnJvbSwgbik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpZiAobiAmJiBfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZykgZnJvbSwgbikpIHsKLQkJaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKLQkJCWNoZWNrX29iamVjdF9zaXplKHRvLCBuLCBmYWxzZSk7CisJCWNoZWNrX29iamVjdF9zaXplKHRvLCBuLCBmYWxzZSk7CiAJCXJldHVybiBfX2NvcHlfdXNlcigoX19mb3JjZSB2b2lkIF9fdXNlciAqKSB0bywgZnJvbSwgbik7Ci0JfSBlbHNlCisJfSBlbHNlIHsKKwkJbWVtc2V0KHRvLCAwLCBuKTsKIAkJcmV0dXJuIG47CisJfQogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmgKaW5kZXggOGJkYTk0Zi4uMzdhMzE1ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmgKQEAgLTIxMiw4ICsyMTIsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcmV0OwogCi0JaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChzaXplKSkKLQkJY2hlY2tfb2JqZWN0X3NpemUodG8sIHNpemUsIGZhbHNlKTsKKwljaGVja19vYmplY3Rfc2l6ZSh0bywgc2l6ZSwgZmFsc2UpOwogCiAJcmV0ID0gX19fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIHNpemUpOwogCWlmICh1bmxpa2VseShyZXQpKQpAQCAtMjMzLDggKzIzMiw4IEBACiB7CiAJdW5zaWduZWQgbG9uZyByZXQ7CiAKLQlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKQotCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBzaXplLCB0cnVlKTsKKwljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBzaXplLCB0cnVlKTsKKwogCXJldCA9IF9fX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgc2l6ZSk7CiAJaWYgKHVubGlrZWx5KHJldCkpCiAJCXJldCA9IGNvcHlfdG9fdXNlcl9maXh1cCh0bywgZnJvbSwgc2l6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvc3BhcmMva2VybmVsL2Z0cmFjZS5jCmluZGV4IDBhMmQyZGQuLjZiY2ZmNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2Z0cmFjZS5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkJcmV0dXJuIHBhcmVudCArIDhVTDsKIAogCWlmIChmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UocGFyZW50LCBzZWxmX2FkZHIsICZ0cmFjZS5kZXB0aCwKLQkJCQkgICAgIGZyYW1lX3BvaW50ZXIpID09IC1FQlVTWSkKKwkJCQkgICAgIGZyYW1lX3BvaW50ZXIsIE5VTEwpID09IC1FQlVTWSkKIAkJcmV0dXJuIHBhcmVudCArIDhVTDsKIAogCXRyYWNlLmZ1bmMgPSBzZWxmX2FkZHI7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggY2Q4M2JlNS4uYjAzNzdkYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2twcm9iZXMuYwpAQCAtNSw3ICs1LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnRleHRfdHJhY2tpbmcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKaW5kZXggNjFjNmY5My4uZGI1N2Q4YSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKQEAgLTMwLDggKzMwLDE5IEBACiAjZGVmaW5lIERSSVZFUl9OQU1FCSJwY2lfc3VuNHYiCiAjZGVmaW5lIFBGWAkJRFJJVkVSX05BTUUgIjogIgogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2cGNpX21ham9yID0gMTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHZwY2lfbWlub3IgPSAxOworc3RhdGljIHVuc2lnbmVkIGxvbmcgdnBjaV9tYWpvcjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHZwY2lfbWlub3I7CisKK3N0cnVjdCB2cGNpX3ZlcnNpb24geworCXVuc2lnbmVkIGxvbmcgbWFqb3I7CisJdW5zaWduZWQgbG9uZyBtaW5vcjsKK307CisKKy8qIE9yZGVyZWQgZnJvbSBsYXJnZXN0IG1ham9yIHRvIGxvd2VzdCAqLworc3RhdGljIHN0cnVjdCB2cGNpX3ZlcnNpb24gdnBjaV92ZXJzaW9uc1tdID0geworCXsgLm1ham9yID0gMiwgLm1pbm9yID0gMCB9LAorCXsgLm1ham9yID0gMSwgLm1pbm9yID0gMSB9LAorfTsKIAogI2RlZmluZSBQR0xJU1RfTkVOVFMJKFBBR0VfU0laRSAvIHNpemVvZih1NjQpKQogCkBAIC02Nyw2ICs3OCwxMCBAQAogCXU2NCAqcGdsaXN0ID0gcC0+cGdsaXN0OwogCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gcC0+bnBhZ2VzOwogCisJLyogVlBDSSBtYWo9MSwgbWluPVswLDFdIG9ubHkgc3VwcG9ydHMgcmVhZCBhbmQgd3JpdGUgKi8KKwlpZiAodnBjaV9tYWpvciA8IDIpCisJCXByb3QgJj0gKEhWX1BDSV9NQVBfQVRUUl9SRUFEIHwgSFZfUENJX01BUF9BVFRSX1dSSVRFKTsKKwogCXdoaWxlIChucGFnZXMgIT0gMCkgewogCQlsb25nIG51bTsKIApAQCAtMTMzLDYgKzE0OCw3IEBACiAJCQkJICAgdW5zaWduZWQgbG9uZyBhdHRycykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBvcmRlciwgZmlyc3RfcGFnZSwgbnBhZ2VzLCBuOworCXVuc2lnbmVkIGxvbmcgcHJvdCA9IDA7CiAJc3RydWN0IGlvbW11ICppb21tdTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl2b2lkICpyZXQ7CkBAIC0xNDYsNiArMTYyLDkgQEAKIAogCW5wYWdlcyA9IHNpemUgPj4gSU9fUEFHRV9TSElGVDsKIAorCWlmIChhdHRycyAmIERNQV9BVFRSX1dFQUtfT1JERVJJTkcpCisJCXByb3QgPSBIVl9QQ0lfTUFQX0FUVFJfUkVMQVhFRF9PUkRFUjsKKwogCW5pZCA9IGRldi0+YXJjaGRhdGEubnVtYV9ub2RlOwogCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5pZCwgZ2ZwLCBvcmRlcik7CiAJaWYgKHVubGlrZWx5KCFwYWdlKSkKQEAgLTE2OSw3ICsxODgsNyBAQAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAogCWlvbW11X2JhdGNoX3N0YXJ0KGRldiwKLQkJCSAgKEhWX1BDSV9NQVBfQVRUUl9SRUFEIHwKKwkJCSAgKEhWX1BDSV9NQVBfQVRUUl9SRUFEIHwgcHJvdCB8CiAJCQkgICBIVl9QQ0lfTUFQX0FUVFJfV1JJVEUpLAogCQkJICBlbnRyeSk7CiAKQEAgLTI2Niw2ICsyODUsOSBAQAogCWlmIChkaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkKIAkJcHJvdCB8PSBIVl9QQ0lfTUFQX0FUVFJfV1JJVEU7CiAKKwlpZiAoYXR0cnMgJiBETUFfQVRUUl9XRUFLX09SREVSSU5HKQorCQlwcm90IHw9IEhWX1BDSV9NQVBfQVRUUl9SRUxBWEVEX09SREVSOworCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAJaW9tbXVfYmF0Y2hfc3RhcnQoZGV2LCBwcm90LCBlbnRyeSk7CkBAIC0zNDQsNiArMzY2LDkgQEAKIAlpZiAoZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpCiAJCXByb3QgfD0gSFZfUENJX01BUF9BVFRSX1dSSVRFOwogCisJaWYgKGF0dHJzICYgRE1BX0FUVFJfV0VBS19PUkRFUklORykKKwkJcHJvdCB8PSBIVl9QQ0lfTUFQX0FUVFJfUkVMQVhFRF9PUkRFUjsKKwogCW91dHMgPSBzID0gc2Vnc3RhcnQgPSAmc2dsaXN0WzBdOwogCW91dGNvdW50ID0gMTsKIAlpbmNvdW50ID0gbmVsZW1zOwpAQCAtOTA3LDIyICs5MzIsMjcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCXN0cnVjdCBpb21tdSAqaW9tbXU7CiAJdTMyIGRldmhhbmRsZTsKLQlpbnQgaSwgZXJyOworCWludCBpLCBlcnIgPSAtRU5PREVWOwogCiAJZHAgPSBvcC0+ZGV2Lm9mX25vZGU7CiAKIAlpZiAoIWh2YXBpX25lZ290aWF0ZWQrKykgewotCQllcnIgPSBzdW40dl9odmFwaV9yZWdpc3RlcihIVl9HUlBfUENJLAotCQkJCQkgICB2cGNpX21ham9yLAotCQkJCQkgICAmdnBjaV9taW5vcik7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZwY2lfdmVyc2lvbnMpOyBpKyspIHsKKwkJCXZwY2lfbWFqb3IgPSB2cGNpX3ZlcnNpb25zW2ldLm1ham9yOworCQkJdnBjaV9taW5vciA9IHZwY2lfdmVyc2lvbnNbaV0ubWlub3I7CisKKwkJCWVyciA9IHN1bjR2X2h2YXBpX3JlZ2lzdGVyKEhWX0dSUF9QQ0ksIHZwY2lfbWFqb3IsCisJCQkJCQkgICAmdnBjaV9taW5vcik7CisJCQlpZiAoIWVycikKKwkJCQlicmVhazsKKwkJfQogCiAJCWlmIChlcnIpIHsKLQkJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCByZWdpc3RlciBodmFwaSwgIgotCQkJICAgICAgICJlcnI9JWRcbiIsIGVycik7CisJCQlwcl9lcnIoUEZYICJDb3VsZCBub3QgcmVnaXN0ZXIgaHZhcGksIGVycj0lZFxuIiwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KLQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlJlZ2lzdGVyZWQgaHZhcGkgbWFqb3JbJWx1XSBtaW5vclslbHVdXG4iLAotCQkgICAgICAgdnBjaV9tYWpvciwgdnBjaV9taW5vcik7CisJCXByX2luZm8oUEZYICJSZWdpc3RlcmVkIGh2YXBpIG1ham9yWyVsdV0gbWlub3JbJWx1XVxuIiwKKwkJCXZwY2lfbWFqb3IsIHZwY2lfbWlub3IpOwogCiAJCWRtYV9vcHMgPSAmc3VuNHZfZG1hX29wczsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfNjQuYwppbmRleCA1OTlmMTIwLi42YjczMzFkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzY0LmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdGFydF9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC01MCw2ICs1MSw4IEBACiAjaW5jbHVkZSA8YXNtL2VsZi5oPgogI2luY2x1ZGUgPGFzbS9tZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2lmZGVmIENPTkZJR19JUF9QTlAKICNpbmNsdWRlIDxuZXQvaXBjb25maWcuaD4KQEAgLTU5MCw2ICs1OTMsMjIgQEAKIAkJcGF1c2VfcGF0Y2goKTsKIH0KIAordm9pZCBfX2luaXQgYWxsb2NfaXJxc3RhY2tfYm9vdG1lbSh2b2lkKQoreworCXVuc2lnbmVkIGludCBpLCBub2RlOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJbm9kZSA9IGNwdV90b19ub2RlKGkpOworCisJCXNvZnRpcnFfc3RhY2tbaV0gPSBfX2FsbG9jX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZSksCisJCQkJCQkJVEhSRUFEX1NJWkUsCisJCQkJCQkJVEhSRUFEX1NJWkUsIDApOworCQloYXJkaXJxX3N0YWNrW2ldID0gX19hbGxvY19ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGUpLAorCQkJCQkJCVRIUkVBRF9TSVpFLAorCQkJCQkJCVRIUkVBRF9TSVpFLCAwKTsKKwl9Cit9CisKIHZvaWQgX19pbml0IHNldHVwX2FyY2goY2hhciAqKmNtZGxpbmVfcCkKIHsKIAkvKiBJbml0aWFsaXplIFBST00gY29uc29sZSBhbmQgY29tbWFuZCBsaW5lLiAqLwpAQCAtNjUwLDYgKzY2OSwxMyBAQAogCiAJcGFnaW5nX2luaXQoKTsKIAlpbml0X3NwYXJjNjRfZWxmX2h3Y2FwKCk7CisJc21wX2ZpbGxfaW5fY3B1X3Bvc3NpYmxlX21hcCgpOworCS8qCisJICogT25jZSB0aGUgT0YgZGV2aWNlIHRyZWUgYW5kIE1ERVNDIGhhdmUgYmVlbiBzZXR1cCBhbmQgbnJfY3B1cyBoYXMKKwkgKiBiZWVuIHBhcnNlZCwgd2Uga25vdyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBjcHVzLiAgVGhlcmVmb3JlIHdlIGNhbgorCSAqIGFsbG9jYXRlIHRoZSBJUlEgc3RhY2tzLgorCSAqLworCWFsbG9jX2lycXN0YWNrX2Jvb3RtZW0oKTsKIH0KIAogZXh0ZXJuIGludCBzdG9wX2FfZW5hYmxlZDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF8zMi5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzMyLmMKaW5kZXggZmIzMGU3Yy4uZTgwZTZiYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzMyLmMKQEAgLTM1Miw5ICszNTIsNyBAQAogCXByZWVtcHRfZGlzYWJsZSgpOwogCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAotCS8qIEludm9rZSB0aGUgQ1BVX1NUQVJUSU5HIG5vdGlmaWVyIGNhbGxiYWNrcyAqLwogCW5vdGlmeV9jcHVfc3RhcnRpbmcoY3B1KTsKLQogCWFyY2hfY3B1X3ByZV9vbmxpbmUoYXJnKTsKIAogCS8qIFNldCB0aGUgQ1BVIGluIHRoZSBjcHVfb25saW5lX21hc2sgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3NtcF82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMKaW5kZXggOGE2MTUxYS4uZDMwMzViYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMKQEAgLTEyMjcsNiArMTIyNywyMCBAQAogCQl4Y2FsbF9kZWxpdmVyX2ltcGwgPSBoeXBlcnZpc29yX3hjYWxsX2RlbGl2ZXI7CiB9CiAKK3ZvaWQgX19pbml0IHNtcF9maWxsX2luX2NwdV9wb3NzaWJsZV9tYXAodm9pZCkKK3sKKwlpbnQgcG9zc2libGVfY3B1cyA9IG51bV9wb3NzaWJsZV9jcHVzKCk7CisJaW50IGk7CisKKwlpZiAocG9zc2libGVfY3B1cyA+IG5yX2NwdV9pZHMpCisJCXBvc3NpYmxlX2NwdXMgPSBucl9jcHVfaWRzOworCisJZm9yIChpID0gMDsgaSA8IHBvc3NpYmxlX2NwdXM7IGkrKykKKwkJc2V0X2NwdV9wb3NzaWJsZShpLCB0cnVlKTsKKwlmb3IgKDsgaSA8IE5SX0NQVVM7IGkrKykKKwkJc2V0X2NwdV9wb3NzaWJsZShpLCBmYWxzZSk7Cit9CisKIHZvaWQgc21wX2ZpbGxfaW5fc2liX2NvcmVfbWFwcyh2b2lkKQogewogCXVuc2lnbmVkIGludCBpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKaW5kZXggZDIxY2Q2Mi4uNDA5NGE1MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jCkBAIC04LDcgKzgsNyBAQAogICogSSBsaWtlIHRyYXBzIG9uIHY5LCA6KSkpKQogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC91bmFsaWduZWRfNjQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF82NC5jCmluZGV4IDlhYWNiOTEuLjUyYzAwZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF82NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3VuYWxpZ25lZF82NC5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxhc20vYXNpLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9wc3RhdGUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vZmF1bHRfNjQuYyBiL2FyY2gvc3BhcmMvbW0vZmF1bHRfNjQuYwppbmRleCBlMTZmZGQyLi42NDNjMTQ5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2ZhdWx0XzY0LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9mYXVsdF82NC5jCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXh0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC00ODQsNiArNDg0LDcgQEAKIAkJdHNiX2dyb3cobW0sIE1NX1RTQl9CQVNFLCBtbV9yc3MpOwogI2lmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRSkgfHwgZGVmaW5lZChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpCiAJbW1fcnNzID0gbW0tPmNvbnRleHQuaHVnZXRsYl9wdGVfY291bnQgKyBtbS0+Y29udGV4dC50aHBfcHRlX2NvdW50OworCW1tX3JzcyAqPSBSRUFMX0hQQUdFX1BFUl9IUEFHRTsKIAlpZiAodW5saWtlbHkobW1fcnNzID4KIAkJICAgICBtbS0+Y29udGV4dC50c2JfYmxvY2tbTU1fVFNCX0hVR0VdLnRzYl9yc3NfbGltaXQpKSB7CiAJCWlmIChtbS0+Y29udGV4dC50c2JfYmxvY2tbTU1fVFNCX0hVR0VdLnRzYikKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jIGIvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMKaW5kZXggNjU0NTdjOS4uNDM5Nzg0YiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMKKysrIGIvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMKQEAgLTUsNyArNSw3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgSmFrdWIgSmVsaW5layAoampAc3Vuc2l0ZS5tZmYuY3VuaS5jeikKICAqLwogIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtMTE2MCw3ICsxMTYwLDcgQEAKIAlyZXR1cm4gbnVtYV9sYXRlbmN5W2Zyb21dW3RvXTsKIH0KIAotc3RhdGljIGludCBmaW5kX2Jlc3RfbnVtYV9ub2RlX2Zvcl9tbGdyb3VwKHN0cnVjdCBtZGVzY19tbGdyb3VwICpncnApCitzdGF0aWMgaW50IF9faW5pdCBmaW5kX2Jlc3RfbnVtYV9ub2RlX2Zvcl9tbGdyb3VwKHN0cnVjdCBtZGVzY19tbGdyb3VwICpncnApCiB7CiAJaW50IGk7CiAKQEAgLTExNzMsOCArMTE3Myw4IEBACiAJcmV0dXJuIGk7CiB9CiAKLXN0YXRpYyB2b2lkIGZpbmRfbnVtYV9sYXRlbmNpZXNfZm9yX2dyb3VwKHN0cnVjdCBtZGVzY19oYW5kbGUgKm1kLCB1NjQgZ3JwLAotCQkJCQkgIGludCBpbmRleCkKK3N0YXRpYyB2b2lkIF9faW5pdCBmaW5kX251bWFfbGF0ZW5jaWVzX2Zvcl9ncm91cChzdHJ1Y3QgbWRlc2NfaGFuZGxlICptZCwKKwkJCQkJCSB1NjQgZ3JwLCBpbnQgaW5kZXgpCiB7CiAJdTY0IGFyYzsKIApAQCAtMjA4MSw3ICsyMDgxLDYgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGVuZF9wZm4sIHNoaWZ0LCBwaHlzX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyByZWFsX2VuZCwgaTsKLQlpbnQgbm9kZTsKIAogCXNldHVwX3BhZ2Vfb2Zmc2V0KCk7CiAKQEAgLTIyNTAsMjEgKzIyNDksNiBAQAogCS8qIFNldHVwIGJvb3RtZW0uLi4gKi8KIAlsYXN0X3ZhbGlkX3BmbiA9IGVuZF9wZm4gPSBib290bWVtX2luaXQocGh5c19iYXNlKTsKIAotCS8qIE9uY2UgdGhlIE9GIGRldmljZSB0cmVlIGFuZCBNREVTQyBoYXZlIGJlZW4gc2V0dXAsIHdlIGtub3cKLQkgKiB0aGUgbGlzdCBvZiBwb3NzaWJsZSBjcHVzLiAgVGhlcmVmb3JlIHdlIGNhbiBhbGxvY2F0ZSB0aGUKLQkgKiBJUlEgc3RhY2tzLgotCSAqLwotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCW5vZGUgPSBjcHVfdG9fbm9kZShpKTsKLQotCQlzb2Z0aXJxX3N0YWNrW2ldID0gX19hbGxvY19ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGUpLAotCQkJCQkJCVRIUkVBRF9TSVpFLAotCQkJCQkJCVRIUkVBRF9TSVpFLCAwKTsKLQkJaGFyZGlycV9zdGFja1tpXSA9IF9fYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwKLQkJCQkJCQlUSFJFQURfU0laRSwKLQkJCQkJCQlUSFJFQURfU0laRSwgMCk7Ci0JfQotCiAJa2VybmVsX3BoeXNpY2FsX21hcHBpbmdfaW5pdCgpOwogCiAJewpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS90bGIuYyBiL2FyY2gvc3BhcmMvbW0vdGxiLmMKaW5kZXggMzY1OWQzNy4uYzU2YTE5NSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS90bGIuYworKysgYi9hcmNoL3NwYXJjL21tL3RsYi5jCkBAIC0xNzQsMTAgKzE3NCwyNSBAQAogCQlyZXR1cm47CiAKIAlpZiAoKHBtZF92YWwocG1kKSBeIHBtZF92YWwob3JpZykpICYgX1BBR0VfUE1EX0hVR0UpIHsKLQkJaWYgKHBtZF92YWwocG1kKSAmIF9QQUdFX1BNRF9IVUdFKQotCQkJbW0tPmNvbnRleHQudGhwX3B0ZV9jb3VudCsrOwotCQllbHNlCi0JCQltbS0+Y29udGV4dC50aHBfcHRlX2NvdW50LS07CisJCS8qCisJCSAqIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgb25seSBzZXRzIHBtZHMgZm9yIFRIUCBwYWdlcy4KKwkJICogSHVnZXRsYiBwYWdlcyBhcmUgaGFuZGxlZCBlbHNld2hlcmUuICBXZSBuZWVkIHRvIGNoZWNrCisJCSAqIGZvciBodWdlIHplcm8gcGFnZS4gIEh1Z2UgemVybyBwYWdlcyBhcmUgbGlrZSBodWdldGxiCisJCSAqIHBhZ2VzIGluIHRoYXQgdGhlcmUgaXMgbm8gUlNTLCBidXQgdGhlcmUgaXMgdGhlIG5lZWQKKwkJICogZm9yIFRTQiBlbnRyaWVzLiAgU28sIGh1Z2UgemVybyBwYWdlIGNvdW50cyBnbyBpbnRvCisJCSAqIGh1Z2V0bGJfcHRlX2NvdW50LgorCQkgKi8KKwkJaWYgKHBtZF92YWwocG1kKSAmIF9QQUdFX1BNRF9IVUdFKSB7CisJCQlpZiAoaXNfaHVnZV96ZXJvX3BhZ2UocG1kX3BhZ2UocG1kKSkpCisJCQkJbW0tPmNvbnRleHQuaHVnZXRsYl9wdGVfY291bnQrKzsKKwkJCWVsc2UKKwkJCQltbS0+Y29udGV4dC50aHBfcHRlX2NvdW50Kys7CisJCX0gZWxzZSB7CisJCQlpZiAoaXNfaHVnZV96ZXJvX3BhZ2UocG1kX3BhZ2Uob3JpZykpKQorCQkJCW1tLT5jb250ZXh0Lmh1Z2V0bGJfcHRlX2NvdW50LS07CisJCQllbHNlCisJCQkJbW0tPmNvbnRleHQudGhwX3B0ZV9jb3VudC0tOworCQl9CiAKIAkJLyogRG8gbm90IHRyeSB0byBhbGxvY2F0ZSB0aGUgVFNCIGhhc2ggdGFibGUgaWYgd2UKIAkJICogZG9uJ3QgaGF2ZSBvbmUgYWxyZWFkeS4gIFdlIGhhdmUgdmFyaW91cyBsb2NrcyBoZWxkCkBAIC0yMDQsNiArMjE5LDkgQEAKIAl9CiB9CiAKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgb25seSBjYWxsZWQgd2hlbiBzcGxpdHRpbmcgYSBUSFAKKyAqLwogdm9pZCBwbWRwX2ludmFsaWRhdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKIAkJICAgICBwbWRfdCAqcG1kcCkKIHsKQEAgLTIxMyw2ICsyMzEsMTUgQEAKIAogCXNldF9wbWRfYXQodm1hLT52bV9tbSwgYWRkcmVzcywgcG1kcCwgZW50cnkpOwogCWZsdXNoX3RsYl9yYW5nZSh2bWEsIGFkZHJlc3MsIGFkZHJlc3MgKyBIUEFHRV9QTURfU0laRSk7CisKKwkvKgorCSAqIHNldF9wbWRfYXQoKSB3aWxsIG5vdCBiZSBjYWxsZWQgaW4gYSB3YXkgdG8gZGVjcmVtZW50CisJICogdGhwX3B0ZV9jb3VudCB3aGVuIHNwbGl0dGluZyBhIFRIUCwgc28gZG8gaXQgbm93LgorCSAqIFNhbml0eSBjaGVjayBwbWQgYmVmb3JlIGRvaW5nIHRoZSBhY3R1YWwgZGVjcmVtZW50LgorCSAqLworCWlmICgocG1kX3ZhbChlbnRyeSkgJiBfUEFHRV9QTURfSFVHRSkgJiYKKwkgICAgIWlzX2h1Z2VfemVyb19wYWdlKHBtZF9wYWdlKGVudHJ5KSkpCisJCSh2bWEtPnZtX21tKS0+Y29udGV4dC50aHBfcHRlX2NvdW50LS07CiB9CiAKIHZvaWQgcGd0YWJsZV90cmFuc19odWdlX2RlcG9zaXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWRwLApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS90c2IuYyBiL2FyY2gvc3BhcmMvbW0vdHNiLmMKaW5kZXggNjcyNWVkNC4uZjJiNzcxMSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9tbS90c2IuYworKysgYi9hcmNoL3NwYXJjL21tL3RzYi5jCkBAIC00NjksOCArNDY5LDEwIEBACiAKIGludCBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKKwl1bnNpZ25lZCBsb25nIG1tX3JzcyA9IGdldF9tbV9yc3MobW0pOwogI2lmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRSkgfHwgZGVmaW5lZChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpCi0JdW5zaWduZWQgbG9uZyB0b3RhbF9odWdlX3B0ZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHNhdmVkX2h1Z2V0bGJfcHRlX2NvdW50OworCXVuc2lnbmVkIGxvbmcgc2F2ZWRfdGhwX3B0ZV9jb3VudDsKICNlbmRpZgogCXVuc2lnbmVkIGludCBpOwogCkBAIC00ODMsMTAgKzQ4NSwxMiBAQAogCSAqIHdpbGwgcmUtaW5jcmVtZW50IHRoZSBjb3VudGVycyBhcyB0aGUgcGFyZW50IFBURXMgYXJlCiAJICogY29waWVkIGludG8gdGhlIGNoaWxkIGFkZHJlc3Mgc3BhY2UuCiAJICovCi0JdG90YWxfaHVnZV9wdGVfY291bnQgPSBtbS0+Y29udGV4dC5odWdldGxiX3B0ZV9jb3VudCArCi0JCQkgbW0tPmNvbnRleHQudGhwX3B0ZV9jb3VudDsKKwlzYXZlZF9odWdldGxiX3B0ZV9jb3VudCA9IG1tLT5jb250ZXh0Lmh1Z2V0bGJfcHRlX2NvdW50OworCXNhdmVkX3RocF9wdGVfY291bnQgPSBtbS0+Y29udGV4dC50aHBfcHRlX2NvdW50OwogCW1tLT5jb250ZXh0Lmh1Z2V0bGJfcHRlX2NvdW50ID0gMDsKIAltbS0+Y29udGV4dC50aHBfcHRlX2NvdW50ID0gMDsKKworCW1tX3JzcyAtPSBzYXZlZF90aHBfcHRlX2NvdW50ICogKEhQQUdFX1NJWkUgLyBQQUdFX1NJWkUpOwogI2VuZGlmCiAKIAkvKiBjb3B5X21tKCkgY29waWVzIG92ZXIgdGhlIHBhcmVudCdzIG1tX3N0cnVjdCBiZWZvcmUgY2FsbGluZwpAQCAtNDk5LDExICs1MDMsMTMgQEAKIAkvKiBJZiB0aGlzIGlzIGZvcmssIGluaGVyaXQgdGhlIHBhcmVudCdzIFRTQiBzaXplLiAgV2Ugd291bGQKIAkgKiBncm93IGl0IHRvIHRoYXQgc2l6ZSBvbiB0aGUgZmlyc3QgcGFnZSBmYXVsdCBhbnl3YXlzLgogCSAqLwotCXRzYl9ncm93KG1tLCBNTV9UU0JfQkFTRSwgZ2V0X21tX3JzcyhtbSkpOworCXRzYl9ncm93KG1tLCBNTV9UU0JfQkFTRSwgbW1fcnNzKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRSkgfHwgZGVmaW5lZChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpCi0JaWYgKHVubGlrZWx5KHRvdGFsX2h1Z2VfcHRlX2NvdW50KSkKLQkJdHNiX2dyb3cobW0sIE1NX1RTQl9IVUdFLCB0b3RhbF9odWdlX3B0ZV9jb3VudCk7CisJaWYgKHVubGlrZWx5KHNhdmVkX2h1Z2V0bGJfcHRlX2NvdW50ICsgc2F2ZWRfdGhwX3B0ZV9jb3VudCkpCisJCXRzYl9ncm93KG1tLCBNTV9UU0JfSFVHRSwKKwkJCSAoc2F2ZWRfaHVnZXRsYl9wdGVfY291bnQgKyBzYXZlZF90aHBfcHRlX2NvdW50KSAqCisJCQkgUkVBTF9IUEFHRV9QRVJfSFBBR0UpOwogI2VuZGlmCiAKIAlpZiAodW5saWtlbHkoIW1tLT5jb250ZXh0LnRzYl9ibG9ja1tNTV9UU0JfQkFTRV0udHNiKSkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvcHJvbS9yYW5nZXMuYyBiL2FyY2gvc3BhcmMvcHJvbS9yYW5nZXMuYwppbmRleCBhZDE0M2MxLi42ZDhkYzJhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL3Byb20vcmFuZ2VzLmMKKysrIGIvYXJjaC9zcGFyYy9wcm9tL3Jhbmdlcy5jCkBAIC0xNiw5ICsxNiw4IEBACiBzdGF0aWMgaW50IG51bV9vYmlvX3JhbmdlczsKIAogLyogQWRqdXN0IHJlZ2lzdGVyIHZhbHVlcyBiYXNlZCB1cG9uIHRoZSByYW5nZXMgcGFyYW1ldGVycy4gKi8KLXN0YXRpYyB2b2lkCi1wcm9tX2FkanVzdF9yZWdzKHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVncCwgaW50IG5yZWdzLAotCQkgc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzICpyYW5nZXAsIGludCBucmFuZ2VzKQorc3RhdGljIHZvaWQgcHJvbV9hZGp1c3RfcmVncyhzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3AsIGludCBucmVncywKKwkJCSAgICAgc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzICpyYW5nZXAsIGludCBucmFuZ2VzKQogewogCWludCByZWdjLCBybmdjOwogCkBAIC0zNCwzMyArMzMsMzAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1wcm9tX2FkanVzdF9yYW5nZXMoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzICpyYW5nZXMxLCBpbnQgbnJhbmdlczEsCi0JCSAgIHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyAqcmFuZ2VzMiwgaW50IG5yYW5nZXMyKQorc3RhdGljIHZvaWQgcHJvbV9hZGp1c3RfcmFuZ2VzKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyAqcmFuZ2VzMSwgaW50IG5yYW5nZXMxLAorCQkJICAgICAgIHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyAqcmFuZ2VzMiwgaW50IG5yYW5nZXMyKQogewogCWludCBybmcxYywgcm5nMmM7CiAKLQlmb3Iocm5nMWM9MDsgcm5nMWMgPCBucmFuZ2VzMTsgcm5nMWMrKykgewotCQlmb3Iocm5nMmM9MDsgcm5nMmMgPCBucmFuZ2VzMjsgcm5nMmMrKykKLQkJCWlmKHJhbmdlczFbcm5nMWNdLm90X3BhcmVudF9zcGFjZSA9PSByYW5nZXMyW3JuZzJjXS5vdF9jaGlsZF9zcGFjZSAmJgorCWZvciAocm5nMWMgPSAwOyBybmcxYyA8IG5yYW5nZXMxOyBybmcxYysrKSB7CisJCWZvciAocm5nMmMgPSAwOyBybmcyYyA8IG5yYW5nZXMyOyBybmcyYysrKQorCQkJaWYgKHJhbmdlczFbcm5nMWNdLm90X3BhcmVudF9zcGFjZSA9PSByYW5nZXMyW3JuZzJjXS5vdF9jaGlsZF9zcGFjZSAmJgogCQkJICAgcmFuZ2VzMVtybmcxY10ub3RfcGFyZW50X2Jhc2UgPj0gcmFuZ2VzMltybmcyY10ub3RfY2hpbGRfYmFzZSAmJgogCQkJICAgcmFuZ2VzMltybmcyY10ub3RfY2hpbGRfYmFzZSArIHJhbmdlczJbcm5nMmNdLm9yX3NpemUgLSByYW5nZXMxW3JuZzFjXS5vdF9wYXJlbnRfYmFzZSA+IDBVKQogCQkJYnJlYWs7Ci0JCWlmKHJuZzJjID09IG5yYW5nZXMyKSAvKiBvb3BzICovCisJCWlmIChybmcyYyA9PSBucmFuZ2VzMikgLyogb29wcyAqLwogCQkJcHJvbV9wcmludGYoImFkanVzdF9yYW5nZXM6IENvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIGJ1cyB0eXBlLi4uXG4iKTsKIAkJZWxzZSBpZiAocmFuZ2VzMVtybmcxY10ub3RfcGFyZW50X2Jhc2UgKyByYW5nZXMxW3JuZzFjXS5vcl9zaXplID4gcmFuZ2VzMltybmcyY10ub3RfY2hpbGRfYmFzZSArIHJhbmdlczJbcm5nMmNdLm9yX3NpemUpCi0JCQlyYW5nZXMxW3JuZzFjXS5vcl9zaXplID0KLQkJCQlyYW5nZXMyW3JuZzJjXS5vdF9jaGlsZF9iYXNlICsgcmFuZ2VzMltybmcyY10ub3Jfc2l6ZSAtIHJhbmdlczFbcm5nMWNdLm90X3BhcmVudF9iYXNlOworCQkJcmFuZ2VzMVtybmcxY10ub3Jfc2l6ZSA9IHJhbmdlczJbcm5nMmNdLm90X2NoaWxkX2Jhc2UgKyByYW5nZXMyW3JuZzJjXS5vcl9zaXplIC0gcmFuZ2VzMVtybmcxY10ub3RfcGFyZW50X2Jhc2U7CiAJCXJhbmdlczFbcm5nMWNdLm90X3BhcmVudF9zcGFjZSA9IHJhbmdlczJbcm5nMmNdLm90X3BhcmVudF9zcGFjZTsKIAkJcmFuZ2VzMVtybmcxY10ub3RfcGFyZW50X2Jhc2UgKz0gcmFuZ2VzMltybmcyY10ub3RfcGFyZW50X2Jhc2U7CiAJfQogfQogCiAvKiBBcHBseSBwcm9iZWQgb2JpbyByYW5nZXMgdG8gcmVnaXN0ZXJzIHBhc3NlZCwgaWYgbm8gcmFuZ2VzIHJldHVybi4gKi8KLXZvaWQKLXByb21fYXBwbHlfb2Jpb19yYW5nZXMoc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzLCBpbnQgbnJlZ3MpCit2b2lkIHByb21fYXBwbHlfb2Jpb19yYW5nZXMoc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzLCBpbnQgbnJlZ3MpCiB7Ci0JaWYobnVtX29iaW9fcmFuZ2VzKQorCWlmIChudW1fb2Jpb19yYW5nZXMpCiAJCXByb21fYWRqdXN0X3JlZ3MocmVncywgbnJlZ3MsIHByb21saWJfb2Jpb19yYW5nZXMsIG51bV9vYmlvX3Jhbmdlcyk7CiB9CiBFWFBPUlRfU1lNQk9MKHByb21fYXBwbHlfb2Jpb19yYW5nZXMpOwpAQCAtNzYsNDAgKzcyLDQwIEBACiAJbm9kZSA9IHByb21fZ2V0Y2hpbGQocHJvbV9yb290X25vZGUpOwogCW9iaW9fbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3Mobm9kZSwgIm9iaW8iKTsKIAotCWlmKG9iaW9fbm9kZSkgeworCWlmIChvYmlvX25vZGUpIHsKIAkJc3VjY2VzcyA9IHByb21fZ2V0cHJvcGVydHkob2Jpb19ub2RlLCAicmFuZ2VzIiwKIAkJCQkJICAgKGNoYXIgKikgcHJvbWxpYl9vYmlvX3JhbmdlcywKIAkJCQkJICAgc2l6ZW9mKHByb21saWJfb2Jpb19yYW5nZXMpKTsKLQkJaWYoc3VjY2VzcyAhPSAtMSkKLQkJCW51bV9vYmlvX3JhbmdlcyA9IChzdWNjZXNzL3NpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKKwkJaWYgKHN1Y2Nlc3MgIT0gLTEpCisJCQludW1fb2Jpb19yYW5nZXMgPSAoc3VjY2VzcyAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKIAl9CiAKLQlpZihudW1fb2Jpb19yYW5nZXMpCisJaWYgKG51bV9vYmlvX3JhbmdlcykKIAkJcHJvbV9wcmludGYoIlBST01MSUI6IG9iaW9fcmFuZ2VzICVkXG4iLCBudW1fb2Jpb19yYW5nZXMpOwogfQogCiB2b2lkIHByb21fYXBwbHlfZ2VuZXJpY19yYW5nZXMocGhhbmRsZSBub2RlLCBwaGFuZGxlIHBhcmVudCwKLQkJc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzLCBpbnQgbnJlZ3MpCisJCQkgICAgICAgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzLCBpbnQgbnJlZ3MpCiB7CiAJaW50IHN1Y2Nlc3M7CiAJaW50IG51bV9yYW5nZXM7CiAJc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzIHJhbmdlc1tQUk9NUkVHX01BWF07Ci0JCisKIAlzdWNjZXNzID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAicmFuZ2VzIiwKIAkJCQkgICAoY2hhciAqKSByYW5nZXMsCi0JCQkJICAgc2l6ZW9mIChyYW5nZXMpKTsKKwkJCQkgICBzaXplb2YocmFuZ2VzKSk7CiAJaWYgKHN1Y2Nlc3MgIT0gLTEpIHsKLQkJbnVtX3JhbmdlcyA9IChzdWNjZXNzL3NpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKKwkJbnVtX3JhbmdlcyA9IChzdWNjZXNzIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcykpOwogCQlpZiAocGFyZW50KSB7CiAJCQlzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgcGFyZW50X3Jhbmdlc1tQUk9NUkVHX01BWF07CiAJCQlpbnQgbnVtX3BhcmVudF9yYW5nZXM7Ci0JCQorCiAJCQlzdWNjZXNzID0gcHJvbV9nZXRwcm9wZXJ0eShwYXJlbnQsICJyYW5nZXMiLAotCQkJCSAgIAkJICAgKGNoYXIgKikgcGFyZW50X3JhbmdlcywKLQkJCQkgICAJCSAgIHNpemVvZiAocGFyZW50X3JhbmdlcykpOworCQkJCQkJICAgKGNoYXIgKikgcGFyZW50X3JhbmdlcywKKwkJCQkJCSAgIHNpemVvZihwYXJlbnRfcmFuZ2VzKSk7CiAJCQlpZiAoc3VjY2VzcyAhPSAtMSkgewotCQkJCW51bV9wYXJlbnRfcmFuZ2VzID0gKHN1Y2Nlc3Mvc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcykpOwotCQkJCXByb21fYWRqdXN0X3JhbmdlcyAocmFuZ2VzLCBudW1fcmFuZ2VzLCBwYXJlbnRfcmFuZ2VzLCBudW1fcGFyZW50X3Jhbmdlcyk7CisJCQkJbnVtX3BhcmVudF9yYW5nZXMgPSAoc3VjY2VzcyAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKKwkJCQlwcm9tX2FkanVzdF9yYW5nZXMocmFuZ2VzLCBudW1fcmFuZ2VzLCBwYXJlbnRfcmFuZ2VzLCBudW1fcGFyZW50X3Jhbmdlcyk7CiAJCQl9CiAJCX0KIAkJcHJvbV9hZGp1c3RfcmVncyhyZWdzLCBucmVncywgcmFuZ2VzLCBudW1fcmFuZ2VzKTsKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9LY29uZmlnIGIvYXJjaC90aWxlL0tjb25maWcKaW5kZXggNDgyMGEwMi4uNzhkYTc1YiAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL0tjb25maWcKKysrIGIvYXJjaC90aWxlL0tjb25maWcKQEAgLTQsNyArNCw2IEBACiBjb25maWcgVElMRQogCWRlZl9ib29sIHkKIAlzZWxlY3QgQVJDSF9IQVNfQVRPTUlDNjRfREVDX0lGX1BPU0lUSVZFCi0Jc2VsZWN0IEFSQ0hfSEFTX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCiAJc2VsZWN0IEFSQ0hfSEFTX0RFVk1FTV9JU19BTExPV0VECiAJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAJc2VsZWN0IEFSQ0hfV0FOVF9GUkFNRV9QT0lOVEVSUwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggMGE5YzQyNjUuLmE3NzM2OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtNDE2LDE0ICs0MTYsMTMgQEAKIAlyZXR1cm4gbjsKIH0KIAotI2lmZGVmIENPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwotLyoKLSAqIFRoZXJlIGFyZSBzdGlsbCB1bnByb3ZhYmxlIHBsYWNlcyBpbiB0aGUgZ2VuZXJpYyBjb2RlIGFzIG9mIDIuNi4zNCwgc28gdGhpcwotICogb3B0aW9uIGlzIG5vdCByZWFsbHkgY29tcGF0aWJsZSB3aXRoIC1XZXJyb3IsIHdoaWNoIGlzIG1vcmUgdXNlZnVsIGluCi0gKiBnZW5lcmFsLgotICovCi1leHRlcm4gdm9pZCBjb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyh2b2lkKQotCV9fY29tcGlsZXRpbWVfd2FybmluZygiY29weV9mcm9tX3VzZXIoKSBzaXplIGlzIG5vdCBwcm92YWJseSBjb3JyZWN0Iik7CitleHRlcm4gdm9pZCBfX2NvbXBpbGV0aW1lX2Vycm9yKCJ1c2VyY29weSBidWZmZXIgc2l6ZSBpcyB0b28gc21hbGwiKQorX19iYWRfY29weV91c2VyKHZvaWQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV91c2VyX292ZXJmbG93KGludCBzaXplLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCVdBUk4oMSwgIkJ1ZmZlciBvdmVyZmxvdyBkZXRlY3RlZCAoJWQgPCAlbHUpIVxuIiwgc2l6ZSwgY291bnQpOworfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIGNvcHlfZnJvbV91c2VyKHZvaWQgKnRvLAogCQkJCQkgIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLApAQCAtNDMzLDE0ICs0MzIsMTMgQEAKIAogCWlmIChsaWtlbHkoc3ogPT0gLTEgfHwgc3ogPj0gbikpCiAJCW4gPSBfY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCWVsc2UgaWYgKCFfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkKKwkJY29weV91c2VyX292ZXJmbG93KHN6LCBuKTsKIAllbHNlCi0JCWNvcHlfZnJvbV91c2VyX292ZXJmbG93KCk7CisJCV9fYmFkX2NvcHlfdXNlcigpOwogCiAJcmV0dXJuIG47CiB9Ci0jZWxzZQotI2RlZmluZSBjb3B5X2Zyb21fdXNlciBfY29weV9mcm9tX3VzZXIKLSNlbmRpZgogCiAjaWZkZWYgX190aWxlZ3hfXwogLyoqCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL2Z0cmFjZS5jIGIvYXJjaC90aWxlL2tlcm5lbC9mdHJhY2UuYwppbmRleCA0YTU3MjA4Li5iODI3YTQxIDEwMDY0NAotLS0gYS9hcmNoL3RpbGUva2VybmVsL2Z0cmFjZS5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvZnRyYWNlLmMKQEAgLTE4NCw3ICsxODQsNyBAQAogCSpwYXJlbnQgPSByZXR1cm5faG9va2VyOwogCiAJZXJyID0gZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKG9sZCwgc2VsZl9hZGRyLCAmdHJhY2UuZGVwdGgsCi0JCQkJICAgICAgIGZyYW1lX3BvaW50ZXIpOworCQkJCSAgICAgICBmcmFtZV9wb2ludGVyLCBOVUxMKTsKIAlpZiAoZXJyID09IC1FQlVTWSkgewogCQkqcGFyZW50ID0gb2xkOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvaGFyZGRvZ19rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvaGFyZGRvZ19rZXJuLmMKaW5kZXggMmQwMjY2ZC4uMzI4Mjc4NyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2hhcmRkb2dfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9oYXJkZG9nX2tlcm4uYwpAQCAtMTc1LDI3ICsxNzUsNCBAQAogCS5uYW1lCQk9ICJ3YXRjaGRvZyIsCiAJLmZvcHMJCT0gJmhhcmRkb2dfZm9wcywKIH07Ci0KLXN0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gIlVNTCBXYXRjaGRvZyBUaW1lclxuIjsKLQotc3RhdGljIGludCBfX2luaXQgaGFyZGRvZ19pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmhhcmRkb2dfbWlzY2Rldik7Ci0KLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcHJpbnRrKGJhbm5lcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGhhcmRkb2dfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3RlcigmaGFyZGRvZ19taXNjZGV2KTsKLX0KLQotbW9kdWxlX2luaXQoaGFyZGRvZ19pbml0KTsKLW1vZHVsZV9leGl0KGhhcmRkb2dfZXhpdCk7Cittb2R1bGVfbWlzY19kZXZpY2UoaGFyZGRvZ19taXNjZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvc3lzY2FsbC5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9zeXNjYWxsLmMKaW5kZXggZWY0YjhmOS4uYjc4M2FjOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9zeXNjYWxsLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvc2thcy9zeXNjYWxsLmMKQEAgLTIxLDIxICsyMSwxNyBAQAogCVBUX1JFR1NfU0VUX1NZU0NBTExfUkVUVVJOKHJlZ3MsIC1FTk9TWVMpOwogCiAJaWYgKHN5c2NhbGxfdHJhY2VfZW50ZXIocmVncykpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAKIAkvKiBEbyB0aGUgc2VjY29tcCBjaGVjayBhZnRlciBwdHJhY2U7IGZhaWx1cmVzIHNob3VsZCBiZSBmYXN0LiAqLwogCWlmIChzZWN1cmVfY29tcHV0aW5nKE5VTEwpID09IC0xKQotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCi0JLyogVXBkYXRlIHRoZSBzeXNjYWxsIG51bWJlciBhZnRlciBvcmlnX2F4IGhhcyBwb3RlbnRpYWxseSBiZWVuIHVwZGF0ZWQKLQkgKiB3aXRoIHB0cmFjZS4KLQkgKi8KLQlVUFRfU1lTQ0FMTF9OUihyKSA9IFBUX1NZU0NBTExfTlIoci0+Z3ApOwogCXN5c2NhbGwgPSBVUFRfU1lTQ0FMTF9OUihyKTsKLQogCWlmIChzeXNjYWxsID49IDAgJiYgc3lzY2FsbCA8PSBfX05SX3N5c2NhbGxfbWF4KQogCQlQVF9SRUdTX1NFVF9TWVNDQUxMX1JFVFVSTihyZWdzLAogCQkJCUVYRUNVVEVfU1lTQ0FMTChzeXNjYWxsLCByZWdzKSk7CiAKK291dDoKIAlzeXNjYWxsX3RyYWNlX2xlYXZlKHJlZ3MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZyBiL2FyY2gveDg2L0tjb25maWcKaW5kZXggYzU4MGQ4Yy4uNThiZWM4ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZworKysgYi9hcmNoL3g4Ni9LY29uZmlnCkBAIC0yNCw3ICsyNCw2IEBACiAJc2VsZWN0IEFSQ0hfRElTQ0FSRF9NRU1CTE9DSwogCXNlbGVjdCBBUkNIX0hBU19BQ1BJX1RBQkxFX1VQR1JBREUgaWYgQUNQSQogCXNlbGVjdCBBUkNIX0hBU19BVE9NSUM2NF9ERUNfSUZfUE9TSVRJVkUKLQlzZWxlY3QgQVJDSF9IQVNfREVCVUdfU1RSSUNUX1VTRVJfQ09QWV9DSEVDS1MKIAlzZWxlY3QgQVJDSF9IQVNfREVWTUVNX0lTX0FMTE9XRUQKIAlzZWxlY3QgQVJDSF9IQVNfRUxGX1JBTkRPTUlaRQogCXNlbGVjdCBBUkNIX0hBU19GQVNUX01VTFRJUExJRVIKQEAgLTk0LDYgKzkzLDcgQEAKIAlzZWxlY3QgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFCiAJc2VsZWN0IEhBVkVfQVJDSF9XSVRISU5fU1RBQ0tfRlJBTUVTCiAJc2VsZWN0IEhBVkVfRUJQRl9KSVQJCQlpZiBYODZfNjQKKwlzZWxlY3QgSEFWRV9BUkNIX1ZNQVBfU1RBQ0sJCWlmIFg4Nl82NAogCXNlbGVjdCBIQVZFX0NDX1NUQUNLUFJPVEVDVE9SCiAJc2VsZWN0IEhBVkVfQ01QWENIR19ET1VCTEUKIAlzZWxlY3QgSEFWRV9DTVBYQ0hHX0xPQ0FMCkBAIC0xMTAsNyArMTEwLDYgQEAKIAlzZWxlY3QgSEFWRV9FWElUX1RIUkVBRAogCXNlbGVjdCBIQVZFX0ZFTlRSWQkJCWlmIFg4Nl82NAogCXNlbGVjdCBIQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JECi0Jc2VsZWN0IEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgogCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUgogCXNlbGVjdCBIQVZFX0dDQ19QTFVHSU5TCkBAIC0xNTgsNiArMTU3LDcgQEAKIAlzZWxlY3QgU1BBUlNFX0lSUQogCXNlbGVjdCBTUkNVCiAJc2VsZWN0IFNZU0NUTF9FWENFUFRJT05fVFJBQ0UKKwlzZWxlY3QgVEhSRUFEX0lORk9fSU5fVEFTSwogCXNlbGVjdCBVU0VSX1NUQUNLVFJBQ0VfU1VQUE9SVAogCXNlbGVjdCBWSVJUX1RPX0JVUwogCXNlbGVjdCBYODZfREVWX0RNQV9PUFMJCQlpZiBYODZfNjQKQEAgLTU1MCw2ICs1NTAsMTggQEAKIAkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBRdWFyayBiYXNlZCBzeXN0ZW0gc3VjaCBhcyB0aGUgQXJkdWlubwogCSAgY29tcGF0aWJsZSBJbnRlbCBHYWxpbGVvLgogCitjb25maWcgTUxYX1BMQVRGT1JNCisJdHJpc3RhdGUgIk1lbGxhbm94IFRlY2hub2xvZ2llcyBwbGF0Zm9ybSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWDg2XzY0CisJZGVwZW5kcyBvbiBYODZfRVhURU5ERURfUExBVEZPUk0KKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN5c3RlbSBzdXBwb3J0IGZvciB0aGUgTWVsbGFub3ggVGVjaG5vbG9naWVzCisJICBwbGF0Zm9ybS4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIGJ1aWxkaW5nIGEga2VybmVsIGZvciBNZWxsYW5veCBzeXN0ZW0uCisKKwkgIE90aGVyd2lzZSwgc2F5IE4uCisKIGNvbmZpZyBYODZfSU5URUxfTFBTUwogCWJvb2wgIkludGVsIExvdyBQb3dlciBTdWJzeXN0ZW0gU3VwcG9ydCIKIAlkZXBlbmRzIG9uIFg4NiAmJiBBQ1BJCkBAIC03MDYsNyArNzE4LDYgQEAKIGNvbmZpZyBQQVJBVklSVF9TUElOTE9DS1MKIAlib29sICJQYXJhdmlydHVhbGl6YXRpb24gbGF5ZXIgZm9yIHNwaW5sb2NrcyIKIAlkZXBlbmRzIG9uIFBBUkFWSVJUICYmIFNNUAotCXNlbGVjdCBVTklOTElORV9TUElOX1VOTE9DSyBpZiAhUVVFVUVEX1NQSU5MT0NLUwogCS0tLWhlbHAtLS0KIAkgIFBhcmF2aXJ0dWFsaXplZCBzcGlubG9ja3MgYWxsb3cgYSBwdm9wcyBiYWNrZW5kIHRvIHJlcGxhY2UgdGhlCiAJICBzcGlubG9jayBpbXBsZW1lbnRhdGlvbiB3aXRoIHNvbWV0aGluZyB2aXJ0dWFsaXphdGlvbi1mcmllbmRseQpAQCAtNzE5LDcgKzczMCw3IEBACiAKIGNvbmZpZyBRVUVVRURfTE9DS19TVEFUCiAJYm9vbCAiUGFyYXZpcnQgcXVldWVkIHNwaW5sb2NrIHN0YXRpc3RpY3MiCi0JZGVwZW5kcyBvbiBQQVJBVklSVF9TUElOTE9DS1MgJiYgREVCVUdfRlMgJiYgUVVFVUVEX1NQSU5MT0NLUworCWRlcGVuZHMgb24gUEFSQVZJUlRfU1BJTkxPQ0tTICYmIERFQlVHX0ZTCiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHRoZSBjb2xsZWN0aW9uIG9mIHN0YXRpc3RpY2FsIGRhdGEgb24gdGhlIHNsb3dwYXRoCiAJICBiZWhhdmlvciBvZiBwYXJhdmlydHVhbGl6ZWQgcXVldWVkIHNwaW5sb2NrcyBhbmQgcmVwb3J0CkBAIC0yNzQ2LDE5ICsyNzU3LDYgQEAKIAlkZWZfYm9vbCB5CiAgICAgICAgIGRlcGVuZHMgb24gUENJCiAKLWNvbmZpZyBWTUQKLQlkZXBlbmRzIG9uIFBDSV9NU0kKLQl0cmlzdGF0ZSAiVm9sdW1lIE1hbmFnZW1lbnQgRGV2aWNlIERyaXZlciIKLQlkZWZhdWx0IE4KLQktLS1oZWxwLS0tCi0JICBBZGRzIHN1cHBvcnQgZm9yIHRoZSBJbnRlbCBWb2x1bWUgTWFuYWdlbWVudCBEZXZpY2UgKFZNRCkuIFZNRCBpcyBhCi0JICBzZWNvbmRhcnkgUENJIGhvc3QgYnJpZGdlIHRoYXQgYWxsb3dzIFBDSSBFeHByZXNzIHJvb3QgcG9ydHMsCi0JICBhbmQgZGV2aWNlcyBhdHRhY2hlZCB0byB0aGVtLCB0byBiZSByZW1vdmVkIGZyb20gdGhlIGRlZmF1bHQKLQkgIFBDSSBkb21haW4gYW5kIHBsYWNlZCB3aXRoaW4gdGhlIFZNRCBkb21haW4uIFRoaXMgcHJvdmlkZXMKLQkgIG1vcmUgYnVzIHJlc291cmNlcyB0aGFuIGFyZSBvdGhlcndpc2UgcG9zc2libGUgd2l0aCBhCi0JICBzaW5nbGUgZG9tYWluLiBJZiB5b3Uga25vdyB5b3VyIHN5c3RlbSBwcm92aWRlcyBvbmUgb2YgdGhlc2UgYW5kCi0JICBoYXMgZGV2aWNlcyBhdHRhY2hlZCB0byBpdCwgc2F5IFk7IGlmIHlvdSBhcmUgbm90IHN1cmUsIHNheSBOLgotCiBzb3VyY2UgIm5ldC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L01ha2VmaWxlIGIvYXJjaC94ODYvTWFrZWZpbGUKaW5kZXggODMwZWQzOS4uMmQ0NDkzMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvTWFrZWZpbGUKQEAgLTE2MywxMSArMTYzLDEyIEBACiBhc2luc3RyICs9ICQoY2FsbCBhcy1pbnN0cixjcmMzMmwgJWVheCQoY29tbWEpJWVheCwtRENPTkZJR19BU19DUkMzMj0xKQogYXZ4X2luc3RyIDo9ICQoY2FsbCBhcy1pbnN0cix2eG9ycHMgJXltbTAkKGNvbW1hKSV5bW0xJChjb21tYSkleW1tMiwtRENPTkZJR19BU19BVlg9MSkKIGF2eDJfaW5zdHIgOj0kKGNhbGwgYXMtaW5zdHIsdnBicm9hZGNhc3RiICV4bW0wJChjb21tYSkleW1tMSwtRENPTkZJR19BU19BVlgyPTEpCithdng1MTJfaW5zdHIgOj0kKGNhbGwgYXMtaW5zdHIsdnBtb3ZtMmIgJWsxJChjb21tYSklem1tNSwtRENPTkZJR19BU19BVlg1MTI9MSkKIHNoYTFfbmlfaW5zdHIgOj0kKGNhbGwgYXMtaW5zdHIsc2hhMW1zZzEgJXhtbTAkKGNvbW1hKSV4bW0xLC1EQ09ORklHX0FTX1NIQTFfTkk9MSkKIHNoYTI1Nl9uaV9pbnN0ciA6PSQoY2FsbCBhcy1pbnN0cixzaGEyNTZtc2cxICV4bW0wJChjb21tYSkleG1tMSwtRENPTkZJR19BU19TSEEyNTZfTkk9MSkKIAotS0JVSUxEX0FGTEFHUyArPSAkKGNmaSkgJChjZmktc2lnZnJhbWUpICQoY2ZpLXNlY3Rpb25zKSAkKGFzaW5zdHIpICQoYXZ4X2luc3RyKSAkKGF2eDJfaW5zdHIpICQoc2hhMV9uaV9pbnN0cikgJChzaGEyNTZfbmlfaW5zdHIpCi1LQlVJTERfQ0ZMQUdTICs9ICQoY2ZpKSAkKGNmaS1zaWdmcmFtZSkgJChjZmktc2VjdGlvbnMpICQoYXNpbnN0cikgJChhdnhfaW5zdHIpICQoYXZ4Ml9pbnN0cikgJChzaGExX25pX2luc3RyKSAkKHNoYTI1Nl9uaV9pbnN0cikKK0tCVUlMRF9BRkxBR1MgKz0gJChjZmkpICQoY2ZpLXNpZ2ZyYW1lKSAkKGNmaS1zZWN0aW9ucykgJChhc2luc3RyKSAkKGF2eF9pbnN0cikgJChhdngyX2luc3RyKSAkKGF2eDUxMl9pbnN0cikgJChzaGExX25pX2luc3RyKSAkKHNoYTI1Nl9uaV9pbnN0cikKK0tCVUlMRF9DRkxBR1MgKz0gJChjZmkpICQoY2ZpLXNpZ2ZyYW1lKSAkKGNmaS1zZWN0aW9ucykgJChhc2luc3RyKSAkKGF2eF9pbnN0cikgJChhdngyX2luc3RyKSAkKGF2eDUxMl9pbnN0cikgJChzaGExX25pX2luc3RyKSAkKHNoYTI1Nl9uaV9pbnN0cikKIAogTERGTEFHUyA6PSAtbSBlbGZfJChVVFNfTUFDSElORSkKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2Vib290LmMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWJvb3QuYwppbmRleCBmZjU3NGRhLi5jYzY5ZTM3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWJvb3QuYworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvZWJvb3QuYwpAQCAtMjksMjIgKzI5LDExIEBACiBzdGF0aWMgdm9pZCBzZXR1cF9ib290X3NlcnZpY2VzIyNiaXRzKHN0cnVjdCBlZmlfY29uZmlnICpjKQkJXAogewkJCQkJCQkJCVwKIAllZmlfc3lzdGVtX3RhYmxlXyMjYml0cyMjX3QgKnRhYmxlOwkJCQlcCi0JZWZpX2Jvb3Rfc2VydmljZXNfIyNiaXRzIyNfdCAqYnQ7CQkJCVwKIAkJCQkJCQkJCVwKIAl0YWJsZSA9ICh0eXBlb2YodGFibGUpKXN5c190YWJsZTsJCQkJXAogCQkJCQkJCQkJXAorCWMtPmJvb3Rfc2VydmljZXMgPSB0YWJsZS0+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+Y2FsbCgpICovCiAJbGVhbAllZmkzMl9jb25maWcoJWVzaSksICVlYXgKLQlhZGQJJWVzaSwgODgoJWVheCkKKwlhZGQJJWVzaSwgMzIoJWVheCkKIAlwdXNobAklZWF4CiAyOgogCWNhbGwJZWZpX21haW4KQEAgLTI2NCw3ICsyNjQsNyBAQAogI2lmZGVmIENPTkZJR19FRklfU1RVQgogCS5kYXRhCiBlZmkzMl9jb25maWc6Ci0JLmZpbGwgMTEsOCwwCisJLmZpbGwgNCw4LDAKIAkubG9uZyBlZmlfY2FsbF9waHlzCiAJLmxvbmcgMAogCS5ieXRlIDAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TCmluZGV4IDBkODBhN2EuLmVmZGZiYTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJLyoKIAkgKiBSZWxvY2F0ZSBlZmlfY29uZmlnLT5jYWxsKCkuCiAJICovCi0JYWRkcQklcmJwLCBlZmk2NF9jb25maWcrODgoJXJpcCkKKwlhZGRxCSVyYnAsIGVmaTY0X2NvbmZpZyszMiglcmlwKQogCiAJbW92cQklcmF4LCAlcmRpCiAJY2FsbAltYWtlX2Jvb3RfcGFyYW1zCkBAIC0yODUsNyArMjg1LDcgQEAKIAkgKiBSZWxvY2F0ZSBlZmlfY29uZmlnLT5jYWxsKCkuCiAJICovCiAJbW92cQllZmlfY29uZmlnKCVyaXApLCAlcmF4Ci0JYWRkcQklcmJwLCA4OCglcmF4KQorCWFkZHEJJXJicCwgMzIoJXJheCkKIDI6CiAJbW92cQllZmlfY29uZmlnKCVyaXApLCAlcmRpCiAJY2FsbAllZmlfbWFpbgpAQCAtNDU3LDE0ICs0NTcsMTQgQEAKICNpZmRlZiBDT05GSUdfRUZJX01JWEVECiAJLmdsb2JhbCBlZmkzMl9jb25maWcKIGVmaTMyX2NvbmZpZzoKLQkuZmlsbAkxMSw4LDAKKwkuZmlsbAk0LDgsMAogCS5xdWFkCWVmaTY0X3RodW5rCiAJLmJ5dGUJMAogI2VuZGlmCiAKIAkuZ2xvYmFsIGVmaTY0X2NvbmZpZwogZWZpNjRfY29uZmlnOgotCS5maWxsCTExLDgsMAorCS5maWxsCTQsOCwwCiAJLnF1YWQJZWZpX2NhbGwKIAkuYnl0ZQkxCiAjZW5kaWYgLyogQ09ORklHX0VGSV9TVFVCICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jb25maWdzL2t2bV9ndWVzdC5jb25maWcgYi9hcmNoL3g4Ni9jb25maWdzL2t2bV9ndWVzdC5jb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MDY1MDUuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvY29uZmlncy9rdm1fZ3Vlc3QuY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotQ09ORklHX05FVD15Ci1DT05GSUdfTkVUX0NPUkU9eQotQ09ORklHX05FVERFVklDRVM9eQotQ09ORklHX0JMT0NLPXkKLUNPTkZJR19CTEtfREVWPXkKLUNPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKLUNPTkZJR19JTkVUPXkKLUNPTkZJR19UVFk9eQotQ09ORklHX1NFUklBTF84MjUwPXkKLUNPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKLUNPTkZJR19JUF9QTlA9eQotQ09ORklHX0lQX1BOUF9ESENQPXkKLUNPTkZJR19CSU5GTVRfRUxGPXkKLUNPTkZJR19QQ0k9eQotQ09ORklHX1BDSV9NU0k9eQotQ09ORklHX0RFQlVHX0tFUk5FTD15Ci1DT05GSUdfVklSVFVBTElaQVRJT049eQotQ09ORklHX0hZUEVSVklTT1JfR1VFU1Q9eQotQ09ORklHX1BBUkFWSVJUPXkKLUNPTkZJR19LVk1fR1VFU1Q9eQotQ09ORklHX1ZJUlRJTz15Ci1DT05GSUdfVklSVElPX1BDST15Ci1DT05GSUdfVklSVElPX0JMSz15Ci1DT05GSUdfVklSVElPX0NPTlNPTEU9eQotQ09ORklHX1ZJUlRJT19ORVQ9eQotQ09ORklHXzlQX0ZTPXkKLUNPTkZJR19ORVRfOVA9eQotQ09ORklHX05FVF85UF9WSVJUSU89eQotQ09ORklHX1NDU0lfTE9XTEVWRUw9eQotQ09ORklHX1NDU0lfVklSVElPPXkKLUNPTkZJR19WSVJUSU9fSU5QVVQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY29uZmlncy90aW55LmNvbmZpZyBiL2FyY2gveDg2L2NvbmZpZ3MvdGlueS5jb25maWcKaW5kZXggNGUyZWNmYS4uNGI0MjlkZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY29uZmlncy90aW55LmNvbmZpZworKysgYi9hcmNoL3g4Ni9jb25maWdzL3RpbnkuY29uZmlnCkBAIC0xICsxLDMgQEAKIENPTkZJR19OT0hJR0hNRU09eQorIyBDT05GSUdfSElHSE1FTTRHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJR0hNRU02NEcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZW50cnkvY29tbW9uLmMgYi9hcmNoL3g4Ni9lbnRyeS9jb21tb24uYwppbmRleCAxNDMzZjZiLi5iZGQ5Y2M1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9lbnRyeS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9lbnRyeS9jb21tb24uYwpAQCAtMzEsMTMgKzMxLDYgQEAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9zeXNjYWxscy5oPgogCi1zdGF0aWMgc3RydWN0IHRocmVhZF9pbmZvICpwdF9yZWdzX3RvX3RocmVhZF9pbmZvKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXVuc2lnbmVkIGxvbmcgdG9wX29mX3N0YWNrID0KLQkJKHVuc2lnbmVkIGxvbmcpKHJlZ3MgKyAxKSArIFRPUF9PRl9LRVJORUxfU1RBQ0tfUEFERElORzsKLQlyZXR1cm4gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSh0b3Bfb2Zfc3RhY2sgLSBUSFJFQURfU0laRSk7Ci19Ci0KICNpZmRlZiBDT05GSUdfQ09OVEVYVF9UUkFDS0lORwogLyogQ2FsbGVkIG9uIGVudHJ5IGZyb20gdXNlciBtb2RlIHdpdGggSVJRcyBvZmYuICovCiBfX3Zpc2libGUgaW5saW5lIHZvaWQgZW50ZXJfZnJvbV91c2VyX21vZGUodm9pZCkKQEAgLTcxLDcgKzY0LDcgQEAKIHsKIAl1MzIgYXJjaCA9IGluX2lhMzJfc3lzY2FsbCgpID8gQVVESVRfQVJDSF9JMzg2IDogQVVESVRfQVJDSF9YODZfNjQ7CiAKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gcHRfcmVnc190b190aHJlYWRfaW5mbyhyZWdzKTsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gY3VycmVudF90aHJlYWRfaW5mbygpOwogCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKIAlib29sIGVtdWxhdGVkID0gZmFsc2U7CiAJdTMyIHdvcms7CkBAIC0xNzMsMTggKzE2NiwxNyBAQAogCQkvKiBEaXNhYmxlIElSUXMgYW5kIHJldHJ5ICovCiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKLQkJY2FjaGVkX2ZsYWdzID0gUkVBRF9PTkNFKHB0X3JlZ3NfdG9fdGhyZWFkX2luZm8ocmVncyktPmZsYWdzKTsKKwkJY2FjaGVkX2ZsYWdzID0gUkVBRF9PTkNFKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MpOwogCiAJCWlmICghKGNhY2hlZF9mbGFncyAmIEVYSVRfVE9fVVNFUk1PREVfTE9PUF9GTEFHUykpCiAJCQlicmVhazsKLQogCX0KIH0KIAogLyogQ2FsbGVkIHdpdGggSVJRcyBkaXNhYmxlZC4gKi8KIF9fdmlzaWJsZSBpbmxpbmUgdm9pZCBwcmVwYXJlX2V4aXRfdG9fdXNlcm1vZGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHB0X3JlZ3NfdG9fdGhyZWFkX2luZm8ocmVncyk7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKIAl1MzIgY2FjaGVkX2ZsYWdzOwogCiAJaWYgKElTX0VOQUJMRUQoQ09ORklHX1BST1ZFX0xPQ0tJTkcpICYmIFdBUk5fT04oIWlycXNfZGlzYWJsZWQoKSkpCkBAIC0yMDksNyArMjAxLDcgQEAKIAkgKiBzcGVjaWFsIGNhc2Ugb25seSBhcHBsaWVzIGFmdGVyIHBva2luZyByZWdzIGFuZCBiZWZvcmUgdGhlCiAJICogdmVyeSBuZXh0IHJldHVybiB0byB1c2VyIG1vZGUuCiAJICovCi0JdGktPnN0YXR1cyAmPSB+KFRTX0NPTVBBVHxUU19JMzg2X1JFR1NfUE9LRUQpOworCWN1cnJlbnQtPnRocmVhZC5zdGF0dXMgJj0gfihUU19DT01QQVR8VFNfSTM4Nl9SRUdTX1BPS0VEKTsKICNlbmRpZgogCiAJdXNlcl9lbnRlcl9pcnFvZmYoKTsKQEAgLTI0Nyw3ICsyMzksNyBAQAogICovCiBfX3Zpc2libGUgaW5saW5lIHZvaWQgc3lzY2FsbF9yZXR1cm5fc2xvd3BhdGgoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHB0X3JlZ3NfdG9fdGhyZWFkX2luZm8ocmVncyk7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKIAl1MzIgY2FjaGVkX2ZsYWdzID0gUkVBRF9PTkNFKHRpLT5mbGFncyk7CiAKIAlDVF9XQVJOX09OKGN0X3N0YXRlKCkgIT0gQ09OVEVYVF9LRVJORUwpOwpAQCAtMjcwLDcgKzI2Miw3IEBACiAjaWZkZWYgQ09ORklHX1g4Nl82NAogX192aXNpYmxlIHZvaWQgZG9fc3lzY2FsbF82NChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gcHRfcmVnc190b190aHJlYWRfaW5mbyhyZWdzKTsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gY3VycmVudF90aHJlYWRfaW5mbygpOwogCXVuc2lnbmVkIGxvbmcgbnIgPSByZWdzLT5vcmlnX2F4OwogCiAJZW50ZXJfZnJvbV91c2VyX21vZGUoKTsKQEAgLTMwMywxMSArMjk1LDExIEBACiAgKi8KIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBkb19zeXNjYWxsXzMyX2lycXNfb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHB0X3JlZ3NfdG9fdGhyZWFkX2luZm8ocmVncyk7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKIAl1bnNpZ25lZCBpbnQgbnIgPSAodW5zaWduZWQgaW50KXJlZ3MtPm9yaWdfYXg7CiAKICNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLQl0aS0+c3RhdHVzIHw9IFRTX0NPTVBBVDsKKwljdXJyZW50LT50aHJlYWQuc3RhdHVzIHw9IFRTX0NPTVBBVDsKICNlbmRpZgogCiAJaWYgKFJFQURfT05DRSh0aS0+ZmxhZ3MpICYgX1RJRl9XT1JLX1NZU0NBTExfRU5UUlkpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2VudHJ5L2VudHJ5XzMyLlMgYi9hcmNoL3g4Ni9lbnRyeS9lbnRyeV8zMi5TCmluZGV4IDBiNTY2NjYuLmI3NWE4YmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2VudHJ5L2VudHJ5XzMyLlMKKysrIGIvYXJjaC94ODYvZW50cnkvZW50cnlfMzIuUwpAQCAtMjA0LDM0ICsyMDQsNzAgQEAKIAlQT1BfR1NfRVgKIC5lbmRtCiAKKy8qCisgKiAlZWF4OiBwcmV2IHRhc2sKKyAqICVlZHg6IG5leHQgdGFzaworICovCitFTlRSWShfX3N3aXRjaF90b19hc20pCisJLyoKKwkgKiBTYXZlIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMKKwkgKiBUaGlzIG11c3QgbWF0Y2ggdGhlIG9yZGVyIGluIHN0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lCisJICovCisJcHVzaGwJJWVicAorCXB1c2hsCSVlYngKKwlwdXNobAklZWRpCisJcHVzaGwJJWVzaQorCisJLyogc3dpdGNoIHN0YWNrICovCisJbW92bAklZXNwLCBUQVNLX3RocmVhZHNwKCVlYXgpCisJbW92bAlUQVNLX3RocmVhZHNwKCVlZHgpLCAlZXNwCisKKyNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKKwltb3ZsCVRBU0tfc3RhY2tfY2FuYXJ5KCVlZHgpLCAlZWJ4CisJbW92bAklZWJ4LCBQRVJfQ1BVX1ZBUihzdGFja19jYW5hcnkpK3N0YWNrX2NhbmFyeV9vZmZzZXQKKyNlbmRpZgorCisJLyogcmVzdG9yZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzICovCisJcG9wbAklZXNpCisJcG9wbAklZWRpCisJcG9wbAklZWJ4CisJcG9wbAklZWJwCisKKwlqbXAJX19zd2l0Y2hfdG8KK0VORChfX3N3aXRjaF90b19hc20pCisKKy8qCisgKiBBIG5ld2x5IGZvcmtlZCBwcm9jZXNzIGRpcmVjdGx5IGNvbnRleHQgc3dpdGNoZXMgaW50byB0aGlzIGFkZHJlc3MuCisgKgorICogZWF4OiBwcmV2IHRhc2sgd2Ugc3dpdGNoZWQgZnJvbQorICogZWJ4OiBrZXJuZWwgdGhyZWFkIGZ1bmMgKE5VTEwgZm9yIHVzZXIgdGhyZWFkKQorICogZWRpOiBrZXJuZWwgdGhyZWFkIGFyZworICovCiBFTlRSWShyZXRfZnJvbV9mb3JrKQogCXB1c2hsCSVlYXgKIAljYWxsCXNjaGVkdWxlX3RhaWwKIAlwb3BsCSVlYXgKIAorCXRlc3RsCSVlYngsICVlYngKKwlqbnoJMWYJCS8qIGtlcm5lbCB0aHJlYWRzIGFyZSB1bmNvbW1vbiAqLworCisyOgogCS8qIFdoZW4gd2UgZm9yaywgd2UgdHJhY2UgdGhlIHN5c2NhbGwgcmV0dXJuIGluIHRoZSBjaGlsZCwgdG9vLiAqLwogCW1vdmwgICAgJWVzcCwgJWVheAogCWNhbGwgICAgc3lzY2FsbF9yZXR1cm5fc2xvd3BhdGgKIAlqbXAgICAgIHJlc3RvcmVfYWxsCi1FTkQocmV0X2Zyb21fZm9yaykKIAotRU5UUlkocmV0X2Zyb21fa2VybmVsX3RocmVhZCkKLQlwdXNobAklZWF4Ci0JY2FsbAlzY2hlZHVsZV90YWlsCi0JcG9wbAklZWF4Ci0JbW92bAlQVF9FQlAoJWVzcCksICVlYXgKLQljYWxsCSpQVF9FQlgoJWVzcCkKLQltb3ZsCSQwLCBQVF9FQVgoJWVzcCkKLQorCS8qIGtlcm5lbCB0aHJlYWQgKi8KKzE6CW1vdmwJJWVkaSwgJWVheAorCWNhbGwJKiVlYngKIAkvKgotCSAqIEtlcm5lbCB0aHJlYWRzIHJldHVybiB0byB1c2Vyc3BhY2UgYXMgaWYgcmV0dXJuaW5nIGZyb20gYSBzeXNjYWxsLgotCSAqIFdlIHNob3VsZCBjaGVjayB3aGV0aGVyIGFueXRoaW5nIGFjdHVhbGx5IHVzZXMgdGhpcyBwYXRoIGFuZCwgaWYgc28sCi0JICogY29uc2lkZXIgc3dpdGNoaW5nIGl0IG92ZXIgdG8gcmV0X2Zyb21fZm9yay4KKwkgKiBBIGtlcm5lbCB0aHJlYWQgaXMgYWxsb3dlZCB0byByZXR1cm4gaGVyZSBhZnRlciBzdWNjZXNzZnVsbHkKKwkgKiBjYWxsaW5nIGRvX2V4ZWN2ZSgpLiAgRXhpdCB0byB1c2Vyc3BhY2UgdG8gY29tcGxldGUgdGhlIGV4ZWN2ZSgpCisJICogc3lzY2FsbC4KIAkgKi8KLQltb3ZsICAgICVlc3AsICVlYXgKLQljYWxsICAgIHN5c2NhbGxfcmV0dXJuX3Nsb3dwYXRoCi0Jam1wICAgICByZXN0b3JlX2FsbAotRU5EUFJPQyhyZXRfZnJvbV9rZXJuZWxfdGhyZWFkKQorCW1vdmwJJDAsIFBUX0VBWCglZXNwKQorCWptcAkyYgorRU5EKHJldF9mcm9tX2ZvcmspCiAKIC8qCiAgKiBSZXR1cm4gdG8gdXNlciBtb2RlIGlzIG5vdCBhcyBjb21wbGV4IGFzIGFsbCB0aGlzIGxvb2tzLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZW50cnkvZW50cnlfNjQuUyBiL2FyY2gveDg2L2VudHJ5L2VudHJ5XzY0LlMKaW5kZXggZDE3MmM2MS4uYzk4ZWMyZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZW50cnkvZW50cnlfNjQuUworKysgYi9hcmNoL3g4Ni9lbnRyeS9lbnRyeV82NC5TCkBAIC0xNzksNyArMTc5LDggQEAKIAkgKiBJZiB3ZSBuZWVkIHRvIGRvIGVudHJ5IHdvcmsgb3IgaWYgd2UgZ3Vlc3Mgd2UnbGwgbmVlZCB0byBkbwogCSAqIGV4aXQgd29yaywgZ28gc3RyYWlnaHQgdG8gdGhlIHNsb3cgcGF0aC4KIAkgKi8KLQl0ZXN0bAkkX1RJRl9XT1JLX1NZU0NBTExfRU5UUll8X1RJRl9BTExXT1JLX01BU0ssIEFTTV9USFJFQURfSU5GTyhUSV9mbGFncywgJXJzcCwgU0laRU9GX1BUUkVHUykKKwltb3ZxCVBFUl9DUFVfVkFSKGN1cnJlbnRfdGFzayksICVyMTEKKwl0ZXN0bAkkX1RJRl9XT1JLX1NZU0NBTExfRU5UUll8X1RJRl9BTExXT1JLX01BU0ssIFRBU0tfVElfZmxhZ3MoJXIxMSkKIAlqbnoJZW50cnlfU1lTQ0FMTDY0X3Nsb3dfcGF0aAogCiBlbnRyeV9TWVNDQUxMXzY0X2Zhc3RwYXRoOgpAQCAtMjE3LDcgKzIxOCw4IEBACiAJICovCiAJRElTQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKIAlUUkFDRV9JUlFTX09GRgotCXRlc3RsCSRfVElGX0FMTFdPUktfTUFTSywgQVNNX1RIUkVBRF9JTkZPKFRJX2ZsYWdzLCAlcnNwLCBTSVpFT0ZfUFRSRUdTKQorCW1vdnEJUEVSX0NQVV9WQVIoY3VycmVudF90YXNrKSwgJXIxMQorCXRlc3RsCSRfVElGX0FMTFdPUktfTUFTSywgVEFTS19USV9mbGFncyglcjExKQogCWpuegkxZgogCiAJTE9DS0RFUF9TWVNfRVhJVApAQCAtMzUxLDggKzM1Myw3IEBACiAJam1wCWVudHJ5X1NZU0NBTEw2NF9zbG93X3BhdGgKIAogMToKLQkvKiBDYWxsZWQgZnJvbSBDICovCi0Jam1wCSolcmF4CQkJCS8qIGNhbGxlZCBmcm9tIEMgKi8KKwlqbXAJKiVyYXgJCQkJLyogQ2FsbGVkIGZyb20gQyAqLwogRU5EKHN0dWJfcHRyZWdzXzY0KQogCiAubWFjcm8gcHRyZWdzX3N0dWIgZnVuYwpAQCAtMzY5LDQxICszNzAsNzMgQEAKICNpbmNsdWRlIDxhc20vc3lzY2FsbHNfNjQuaD4KIAogLyoKKyAqICVyZGk6IHByZXYgdGFzaworICogJXJzaTogbmV4dCB0YXNrCisgKi8KK0VOVFJZKF9fc3dpdGNoX3RvX2FzbSkKKwkvKgorCSAqIFNhdmUgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycworCSAqIFRoaXMgbXVzdCBtYXRjaCB0aGUgb3JkZXIgaW4gaW5hY3RpdmVfdGFza19mcmFtZQorCSAqLworCXB1c2hxCSVyYnAKKwlwdXNocQklcmJ4CisJcHVzaHEJJXIxMgorCXB1c2hxCSVyMTMKKwlwdXNocQklcjE0CisJcHVzaHEJJXIxNQorCisJLyogc3dpdGNoIHN0YWNrICovCisJbW92cQklcnNwLCBUQVNLX3RocmVhZHNwKCVyZGkpCisJbW92cQlUQVNLX3RocmVhZHNwKCVyc2kpLCAlcnNwCisKKyNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKKwltb3ZxCVRBU0tfc3RhY2tfY2FuYXJ5KCVyc2kpLCAlcmJ4CisJbW92cQklcmJ4LCBQRVJfQ1BVX1ZBUihpcnFfc3RhY2tfdW5pb24pK3N0YWNrX2NhbmFyeV9vZmZzZXQKKyNlbmRpZgorCisJLyogcmVzdG9yZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzICovCisJcG9wcQklcjE1CisJcG9wcQklcjE0CisJcG9wcQklcjEzCisJcG9wcQklcjEyCisJcG9wcQklcmJ4CisJcG9wcQklcmJwCisKKwlqbXAJX19zd2l0Y2hfdG8KK0VORChfX3N3aXRjaF90b19hc20pCisKKy8qCiAgKiBBIG5ld2x5IGZvcmtlZCBwcm9jZXNzIGRpcmVjdGx5IGNvbnRleHQgc3dpdGNoZXMgaW50byB0aGlzIGFkZHJlc3MuCiAgKgotICogcmRpOiBwcmV2IHRhc2sgd2Ugc3dpdGNoZWQgZnJvbQorICogcmF4OiBwcmV2IHRhc2sgd2Ugc3dpdGNoZWQgZnJvbQorICogcmJ4OiBrZXJuZWwgdGhyZWFkIGZ1bmMgKE5VTEwgZm9yIHVzZXIgdGhyZWFkKQorICogcjEyOiBrZXJuZWwgdGhyZWFkIGFyZwogICovCiBFTlRSWShyZXRfZnJvbV9mb3JrKQotCUxPQ0sgOyBidHIgJFRJRl9GT1JLLCBUSV9mbGFncyglcjgpCi0KKwltb3ZxCSVyYXgsICVyZGkKIAljYWxsCXNjaGVkdWxlX3RhaWwJCQkvKiByZGk6ICdwcmV2JyB0YXNrIHBhcmFtZXRlciAqLwogCi0JdGVzdGIJJDMsIENTKCVyc3ApCQkJLyogZnJvbSBrZXJuZWxfdGhyZWFkPyAqLwotCWpuegkxZgorCXRlc3RxCSVyYngsICVyYngJCQkvKiBmcm9tIGtlcm5lbF90aHJlYWQ/ICovCisJam56CTFmCQkJCS8qIGtlcm5lbCB0aHJlYWRzIGFyZSB1bmNvbW1vbiAqLwogCi0JLyoKLQkgKiBXZSBjYW1lIGZyb20ga2VybmVsX3RocmVhZC4gIFRoaXMgY29kZSBwYXRoIGlzIHF1aXRlIHR3aXN0ZWQsIGFuZAotCSAqIHNvbWVvbmUgc2hvdWxkIGNsZWFuIGl0IHVwLgotCSAqCi0JICogY29weV90aHJlYWRfdGxzIHN0YXNoZXMgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaW4gUkJYIGFuZCB0aGUKLQkgKiBwYXJhbWV0ZXIgdG8gYmUgcGFzc2VkIGluIFJCUC4gIFRoZSBjYWxsZWQgZnVuY3Rpb24gaXMgcGVybWl0dGVkCi0JICogdG8gY2FsbCBkb19leGVjdmUgYW5kIHRoZXJlYnkganVtcCB0byB1c2VyIG1vZGUuCi0JICovCi0JbW92cQlSQlAoJXJzcCksICVyZGkKLQljYWxsCSpSQlgoJXJzcCkKLQltb3ZsCSQwLCBSQVgoJXJzcCkKLQotCS8qCi0JICogRmFsbCB0aHJvdWdoIGFzIHRob3VnaCB3ZSdyZSBleGl0aW5nIGEgc3lzY2FsbC4gIFRoaXMgbWFrZXMgYQotCSAqIHR3aXN0ZWQgc29ydCBvZiBzZW5zZSBpZiB3ZSBqdXN0IGNhbGxlZCBkb19leGVjdmUuCi0JICovCi0KLTE6CisyOgogCW1vdnEJJXJzcCwgJXJkaQogCWNhbGwJc3lzY2FsbF9yZXR1cm5fc2xvd3BhdGgJLyogcmV0dXJucyB3aXRoIElSUXMgZGlzYWJsZWQgKi8KIAlUUkFDRV9JUlFTX09OCQkJLyogdXNlciBtb2RlIGlzIHRyYWNlZCBhcyBJUlFTIG9uICovCiAJU1dBUEdTCiAJam1wCXJlc3RvcmVfcmVnc19hbmRfaXJldAorCisxOgorCS8qIGtlcm5lbCB0aHJlYWQgKi8KKwltb3ZxCSVyMTIsICVyZGkKKwljYWxsCSolcmJ4CisJLyoKKwkgKiBBIGtlcm5lbCB0aHJlYWQgaXMgYWxsb3dlZCB0byByZXR1cm4gaGVyZSBhZnRlciBzdWNjZXNzZnVsbHkKKwkgKiBjYWxsaW5nIGRvX2V4ZWN2ZSgpLiAgRXhpdCB0byB1c2Vyc3BhY2UgdG8gY29tcGxldGUgdGhlIGV4ZWN2ZSgpCisJICogc3lzY2FsbC4KKwkgKi8KKwltb3ZxCSQwLCBSQVgoJXJzcCkKKwlqbXAJMmIKIEVORChyZXRfZnJvbV9mb3JrKQogCiAvKgpAQCAtNTU1LDI3ICs1ODgsNjkgQEAKIAogI2lmZGVmIENPTkZJR19YODZfRVNQRklYNjQKIG5hdGl2ZV9pcnFfcmV0dXJuX2xkdDoKLQlwdXNocQklcmF4Ci0JcHVzaHEJJXJkaQorCS8qCisJICogV2UgYXJlIHJ1bm5pbmcgd2l0aCB1c2VyIEdTQkFTRS4gIEFsbCBHUFJzIGNvbnRhaW4gdGhlaXIgdXNlcgorCSAqIHZhbHVlcy4gIFdlIGhhdmUgYSBwZXJjcHUgRVNQRklYIHN0YWNrIHRoYXQgaXMgZWlnaHQgc2xvdHMKKwkgKiBsb25nIChzZWUgRVNQRklYX1NUQUNLX1NJWkUpLiAgZXNwZml4X3dhZGRyIHBvaW50cyB0byB0aGUgYm90dG9tCisJICogb2YgdGhlIEVTUEZJWCBzdGFjay4KKwkgKgorCSAqIFdlIGNsb2JiZXIgUkFYIGFuZCBSREkgaW4gdGhpcyBjb2RlLiAgV2Ugc3Rhc2ggUkRJIG9uIHRoZQorCSAqIG5vcm1hbCBzdGFjayBhbmQgUkFYIG9uIHRoZSBFU1BGSVggc3RhY2suCisJICoKKwkgKiBUaGUgRVNQRklYIHN0YWNrIGxheW91dCB3ZSBzZXQgdXAgbG9va3MgbGlrZSB0aGlzOgorCSAqCisJICogLS0tIHRvcCBvZiBFU1BGSVggc3RhY2sgLS0tCisJICogU1MKKwkgKiBSU1AKKwkgKiBSRkxBR1MKKwkgKiBDUworCSAqIFJJUCAgPC0tIFJTUCBwb2ludHMgaGVyZSB3aGVuIHdlJ3JlIGRvbmUKKwkgKiBSQVggIDwtLSBlc3BmaXhfd2FkZHIgcG9pbnRzIGhlcmUKKwkgKiAtLS0gYm90dG9tIG9mIEVTUEZJWCBzdGFjayAtLS0KKwkgKi8KKworCXB1c2hxCSVyZGkJCQkJLyogU3Rhc2ggdXNlciBSREkgKi8KIAlTV0FQR1MKIAltb3ZxCVBFUl9DUFVfVkFSKGVzcGZpeF93YWRkciksICVyZGkKLQltb3ZxCSVyYXgsICgwKjgpKCVyZGkpCQkvKiBSQVggKi8KLQltb3ZxCSgyKjgpKCVyc3ApLCAlcmF4CQkvKiBSSVAgKi8KKwltb3ZxCSVyYXgsICgwKjgpKCVyZGkpCQkvKiB1c2VyIFJBWCAqLworCW1vdnEJKDEqOCkoJXJzcCksICVyYXgJCS8qIHVzZXIgUklQICovCiAJbW92cQklcmF4LCAoMSo4KSglcmRpKQotCW1vdnEJKDMqOCkoJXJzcCksICVyYXgJCS8qIENTICovCisJbW92cQkoMio4KSglcnNwKSwgJXJheAkJLyogdXNlciBDUyAqLwogCW1vdnEJJXJheCwgKDIqOCkoJXJkaSkKLQltb3ZxCSg0KjgpKCVyc3ApLCAlcmF4CQkvKiBSRkxBR1MgKi8KKwltb3ZxCSgzKjgpKCVyc3ApLCAlcmF4CQkvKiB1c2VyIFJGTEFHUyAqLwogCW1vdnEJJXJheCwgKDMqOCkoJXJkaSkKLQltb3ZxCSg2KjgpKCVyc3ApLCAlcmF4CQkvKiBTUyAqLworCW1vdnEJKDUqOCkoJXJzcCksICVyYXgJCS8qIHVzZXIgU1MgKi8KIAltb3ZxCSVyYXgsICg1KjgpKCVyZGkpCi0JbW92cQkoNSo4KSglcnNwKSwgJXJheAkJLyogUlNQICovCisJbW92cQkoNCo4KSglcnNwKSwgJXJheAkJLyogdXNlciBSU1AgKi8KIAltb3ZxCSVyYXgsICg0KjgpKCVyZGkpCi0JYW5kbAkkMHhmZmZmMDAwMCwgJWVheAotCXBvcHEJJXJkaQorCS8qIE5vdyBSQVggPT0gUlNQLiAqLworCisJYW5kbAkkMHhmZmZmMDAwMCwgJWVheAkJLyogUkFYID0gKFJTUCAmIDB4ZmZmZjAwMDApICovCisJcG9wcQklcmRpCQkJCS8qIFJlc3RvcmUgdXNlciBSREkgKi8KKworCS8qCisJICogZXNwZml4X3N0YWNrWzMxOjE2XSA9PSAwLiAgVGhlIHBhZ2UgdGFibGVzIGFyZSBzZXQgdXAgc3VjaCB0aGF0CisJICogKGVzcGZpeF9zdGFjayB8IChYICYgMHhmZmZmMDAwMCkpIHBvaW50cyB0byBhIHJlYWQtb25seSBhbGlhcyBvZgorCSAqIGVzcGZpeF93YWRkciBmb3IgYW55IFguICBUaGF0IGlzLCB0aGVyZSBhcmUgNjU1MzYgUk8gYWxpYXNlcyBvZgorCSAqIHRoZSBzYW1lIHBhZ2UuICBTZXQgdXAgUlNQIHNvIHRoYXQgUlNQWzMxOjE2XSBjb250YWlucyB0aGUKKwkgKiByZXNwZWN0aXZlIDE2IGJpdHMgb2YgdGhlIC91c2Vyc3BhY2UvIFJTUCBhbmQgUlNQIG5vbmV0aGVsZXNzCisJICogc3RpbGwgcG9pbnRzIHRvIGFuIFJPIGFsaWFzIG9mIHRoZSBFU1BGSVggc3RhY2suCisJICovCiAJb3JxCVBFUl9DUFVfVkFSKGVzcGZpeF9zdGFjayksICVyYXgKIAlTV0FQR1MKIAltb3ZxCSVyYXgsICVyc3AKLQlwb3BxCSVyYXgKKworCS8qCisJICogQXQgdGhpcyBwb2ludCwgd2UgY2Fubm90IHdyaXRlIHRvIHRoZSBzdGFjayBhbnkgbW9yZSwgYnV0IHdlIGNhbgorCSAqIHN0aWxsIHJlYWQuCisJICovCisJcG9wcQklcmF4CQkJCS8qIFJlc3RvcmUgdXNlciBSQVggKi8KKworCS8qCisJICogUlNQIG5vdyBwb2ludHMgdG8gYW4gb3JkaW5hcnkgSVJFVCBmcmFtZSwgZXhjZXB0IHRoYXQgdGhlIHBhZ2UKKwkgKiBpcyByZWFkLW9ubHkgYW5kIFJTUFszMToxNl0gYXJlIHByZWxvYWRlZCB3aXRoIHRoZSB1c2Vyc3BhY2UKKwkgKiB2YWx1ZXMuICBXZSBjYW4gbm93IElSRVQgYmFjayB0byB1c2Vyc3BhY2UuCisJICovCiAJam1wCW5hdGl2ZV9pcnFfcmV0dXJuX2lyZXQKICNlbmRpZgogRU5EKGNvbW1vbl9pbnRlcnJ1cHQpCkBAIC0xMDAyLDcgKzEwNzcsNiBAQAogCXRlc3RiCSQzLCBDUys4KCVyc3ApCiAJanoJLkxlcnJvcl9rZXJuZWxzcGFjZQogCi0uTGVycm9yX2VudHJ5X2Zyb21fdXNlcm1vZGVfc3dhcGdzOgogCS8qCiAJICogV2UgZW50ZXJlZCBmcm9tIHVzZXIgbW9kZSBvciB3ZSdyZSBwcmV0ZW5kaW5nIHRvIGhhdmUgZW50ZXJlZAogCSAqIGZyb20gdXNlciBtb2RlIGR1ZSB0byBhbiBJUkVUIGZhdWx0LgpAQCAtMTA0NSw3ICsxMTE5LDggQEAKIAkgKiBnc2Jhc2UgYW5kIHByb2NlZWQuICBXZSdsbCBmaXggdXAgdGhlIGV4Y2VwdGlvbiBhbmQgbGFuZCBpbgogCSAqIC5MZ3NfY2hhbmdlJ3MgZXJyb3IgaGFuZGxlciB3aXRoIGtlcm5lbCBnc2Jhc2UuCiAJICovCi0Jam1wCS5MZXJyb3JfZW50cnlfZnJvbV91c2VybW9kZV9zd2FwZ3MKKwlTV0FQR1MKKwlqbXAgLkxlcnJvcl9lbnRyeV9kb25lCiAKIC5MYnN0ZXBfaXJldDoKIAkvKiBGaXggdHJ1bmNhdGVkIFJJUCAqLwpAQCAtMTA3Myw3ICsxMTQ4LDcgQEAKIAogCiAvKgotICogT24gZW50cnksIEVCUyBpcyBhICJyZXR1cm4gdG8ga2VybmVsIG1vZGUiIGZsYWc6CisgKiBPbiBlbnRyeSwgRUJYIGlzIGEgInJldHVybiB0byBrZXJuZWwgbW9kZSIgZmxhZzoKICAqICAgMTogYWxyZWFkeSBpbiBrZXJuZWwgbW9kZSwgZG9uJ3QgbmVlZCBTV0FQR1MKICAqICAgMDogdXNlciBnc2Jhc2UgaXMgbG9hZGVkLCB3ZSBuZWVkIFNXQVBHUyBhbmQgc3RhbmRhcmQgcHJlcGFyYXRpb24gZm9yIHJldHVybiB0byB1c2VybW9kZQogICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9lbnRyeS92ZHNvL3ZjbG9ja19nZXR0aW1lLmMgYi9hcmNoL3g4Ni9lbnRyeS92ZHNvL3ZjbG9ja19nZXR0aW1lLmMKaW5kZXggOTRkNTRkMC4uMDIyMjNjYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZW50cnkvdmRzby92Y2xvY2tfZ2V0dGltZS5jCisrKyBiL2FyY2gveDg2L2VudHJ5L3Zkc28vdmNsb2NrX2dldHRpbWUuYwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCi0JCXJldCA9IF9fcHZjbG9ja19yZWFkX2N5Y2xlcyhwdnRpKTsKKwkJcmV0ID0gX19wdmNsb2NrX3JlYWRfY3ljbGVzKHB2dGksIHJkdHNjX29yZGVyZWQoKSk7CiAJfSB3aGlsZSAocHZjbG9ja19yZWFkX3JldHJ5KHB2dGksIHZlcnNpb24pKTsKIAogCS8qIHJlZmVyIHRvIHZyZWFkX3RzYygpIGNvbW1lbnQgZm9yIHJhdGlvbmFsZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZW50cnkvdmRzby92ZHNvMmMuaCBiL2FyY2gveDg2L2VudHJ5L3Zkc28vdmRzbzJjLmgKaW5kZXggNGY3NDExOS4uM2RhYjc1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZW50cnkvdmRzby92ZHNvMmMuaAorKysgYi9hcmNoL3g4Ni9lbnRyeS92ZHNvL3Zkc28yYy5oCkBAIC0yMiw3ICsyMiw3IEBACiAKIAlFTEYoUGhkcikgKnB0ID0gKEVMRihQaGRyKSAqKShyYXdfYWRkciArIEdFVF9MRSgmaGRyLT5lX3Bob2ZmKSk7CiAKLQlpZiAoaGRyLT5lX3R5cGUgIT0gRVRfRFlOKQorCWlmIChHRVRfTEUoJmhkci0+ZV90eXBlKSAhPSBFVF9EWU4pCiAJCWZhaWwoImlucHV0IGlzIG5vdCBhIHNoYXJlZCBvYmplY3RcbiIpOwogCiAJLyogV2FsayB0aGUgc2VnbWVudCB0YWJsZS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2VudHJ5L3Zkc28vdm1hLmMgYi9hcmNoL3g4Ni9lbnRyeS92ZHNvL3ZtYS5jCmluZGV4IGY4NDA3NjYuLjIzYzg4MWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2VudHJ5L3Zkc28vdm1hLmMKKysrIGIvYXJjaC94ODYvZW50cnkvdmRzby92bWEuYwpAQCAtMzcsNTQgKzM3LDYgQEAKIAogc3RydWN0IGxpbnV4X2JpbnBybTsKIAotLyoKLSAqIFB1dCB0aGUgdmRzbyBhYm92ZSB0aGUgKHJhbmRvbWl6ZWQpIHN0YWNrIHdpdGggYW5vdGhlciByYW5kb21pemVkCi0gKiBvZmZzZXQuICBUaGlzIHdheSB0aGVyZSBpcyBubyBob2xlIGluIHRoZSBtaWRkbGUgb2YgYWRkcmVzcyBzcGFjZS4KLSAqIFRvIHNhdmUgbWVtb3J5IG1ha2Ugc3VyZSBpdCBpcyBzdGlsbCBpbiB0aGUgc2FtZSBQVEUgYXMgdGhlIHN0YWNrCi0gKiB0b3AuICBUaGlzIGRvZXNuJ3QgZ2l2ZSB0aGF0IG1hbnkgcmFuZG9tIGJpdHMuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGlzIGltcGVyZmVjdDogdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgdmRzbwotICogc3RhcnQgYWRkcmVzcyB3aXRoaW4gYSBQTUQgaXMgYmlhc2VkIHRvd2FyZCB0aGUgZW5kLgotICoKLSAqIE9ubHkgdXNlZCBmb3IgdGhlIDY0LWJpdCBhbmQgeDMyIHZkc29zLgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2ZHNvX2FkZHIodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbGVuKQotewotI2lmZGVmIENPTkZJR19YODZfMzIKLQlyZXR1cm4gMDsKLSNlbHNlCi0JdW5zaWduZWQgbG9uZyBhZGRyLCBlbmQ7Ci0JdW5zaWduZWQgb2Zmc2V0OwotCi0JLyoKLQkgKiBSb3VuZCB1cCB0aGUgc3RhcnQgYWRkcmVzcy4gIEl0IGNhbiBzdGFydCBvdXQgdW5hbGlnbmVkIGFzIGEgcmVzdWx0Ci0JICogb2Ygc3RhY2sgc3RhcnQgcmFuZG9taXphdGlvbi4KLQkgKi8KLQlzdGFydCA9IFBBR0VfQUxJR04oc3RhcnQpOwotCi0JLyogUm91bmQgdGhlIGxvd2VzdCBwb3NzaWJsZSBlbmQgYWRkcmVzcyB1cCB0byBhIFBNRCBib3VuZGFyeS4gKi8KLQllbmQgPSAoc3RhcnQgKyBsZW4gKyBQTURfU0laRSAtIDEpICYgUE1EX01BU0s7Ci0JaWYgKGVuZCA+PSBUQVNLX1NJWkVfTUFYKQotCQllbmQgPSBUQVNLX1NJWkVfTUFYOwotCWVuZCAtPSBsZW47Ci0KLQlpZiAoZW5kID4gc3RhcnQpIHsKLQkJb2Zmc2V0ID0gZ2V0X3JhbmRvbV9pbnQoKSAlICgoKGVuZCAtIHN0YXJ0KSA+PiBQQUdFX1NISUZUKSArIDEpOwotCQlhZGRyID0gc3RhcnQgKyAob2Zmc2V0IDw8IFBBR0VfU0hJRlQpOwotCX0gZWxzZSB7Ci0JCWFkZHIgPSBzdGFydDsKLQl9Ci0KLQkvKgotCSAqIEZvcmNpYmx5IGFsaWduIHRoZSBmaW5hbCBhZGRyZXNzIGluIGNhc2Ugd2UgaGF2ZSBhIGhhcmR3YXJlCi0JICogaXNzdWUgdGhhdCByZXF1aXJlcyBhbGlnbm1lbnQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0JICovCi0JYWRkciA9IGFsaWduX3Zkc29fYWRkcihhZGRyKTsKLQotCXJldHVybiBhZGRyOwotI2VuZGlmCi19Ci0KIHN0YXRpYyBpbnQgdmRzb19mYXVsdChjb25zdCBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nICpzbSwKIAkJICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQogewpAQCAtMTc2LDMwICsxMjgsMjggQEAKIAlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOwogfQogCi1zdGF0aWMgaW50IG1hcF92ZHNvKGNvbnN0IHN0cnVjdCB2ZHNvX2ltYWdlICppbWFnZSwgYm9vbCBjYWxjdWxhdGVfYWRkcikKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nIHZkc29fbWFwcGluZyA9IHsKKwkubmFtZSA9ICJbdmRzb10iLAorCS5mYXVsdCA9IHZkc29fZmF1bHQsCisJLm1yZW1hcCA9IHZkc29fbXJlbWFwLAorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nIHZ2YXJfbWFwcGluZyA9IHsKKwkubmFtZSA9ICJbdnZhcl0iLAorCS5mYXVsdCA9IHZ2YXJfZmF1bHQsCit9OworCisvKgorICogQWRkIHZkc28gYW5kIHZ2YXIgbWFwcGluZ3MgdG8gY3VycmVudCBwcm9jZXNzLgorICogQGltYWdlICAgICAgICAgIC0gYmxvYiB0byBtYXAKKyAqIEBhZGRyICAgICAgICAgICAtIHJlcXVlc3QgYSBzcGVjaWZpYyBhZGRyZXNzICh6ZXJvIHRvIG1hcCBhdCBmcmVlIGFkZHIpCisgKi8KK3N0YXRpYyBpbnQgbWFwX3Zkc28oY29uc3Qgc3RydWN0IHZkc29faW1hZ2UgKmltYWdlLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQl1bnNpZ25lZCBsb25nIGFkZHIsIHRleHRfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyB0ZXh0X3N0YXJ0OwogCWludCByZXQgPSAwOwogCi0Jc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgdmRzb19tYXBwaW5nID0gewotCQkubmFtZSA9ICJbdmRzb10iLAotCQkuZmF1bHQgPSB2ZHNvX2ZhdWx0LAotCQkubXJlbWFwID0gdmRzb19tcmVtYXAsCi0JfTsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2dmFyX21hcHBpbmcgPSB7Ci0JCS5uYW1lID0gIlt2dmFyXSIsCi0JCS5mYXVsdCA9IHZ2YXJfZmF1bHQsCi0JfTsKLQotCWlmIChjYWxjdWxhdGVfYWRkcikgewotCQlhZGRyID0gdmRzb19hZGRyKGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjaywKLQkJCQkgaW1hZ2UtPnNpemUgLSBpbWFnZS0+c3ltX3Z2YXJfc3RhcnQpOwotCX0gZWxzZSB7Ci0JCWFkZHIgPSAwOwotCX0KLQogCWlmIChkb3duX3dyaXRlX2tpbGxhYmxlKCZtbS0+bW1hcF9zZW0pKQogCQlyZXR1cm4gLUVJTlRSOwogCkBAIC0yMzgsMjQgKzE4OCwxMDQgQEAKIAogCWlmIChJU19FUlIodm1hKSkgewogCQlyZXQgPSBQVFJfRVJSKHZtYSk7Ci0JCWdvdG8gdXBfZmFpbDsKKwkJZG9fbXVubWFwKG1tLCB0ZXh0X3N0YXJ0LCBpbWFnZS0+c2l6ZSk7CiAJfQogCiB1cF9mYWlsOgotCWlmIChyZXQpCisJaWYgKHJldCkgewogCQljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvID0gTlVMTDsKKwkJY3VycmVudC0+bW0tPmNvbnRleHQudmRzb19pbWFnZSA9IE5VTEw7CisJfQogCiAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19YODZfNjQKKy8qCisgKiBQdXQgdGhlIHZkc28gYWJvdmUgdGhlIChyYW5kb21pemVkKSBzdGFjayB3aXRoIGFub3RoZXIgcmFuZG9taXplZAorICogb2Zmc2V0LiAgVGhpcyB3YXkgdGhlcmUgaXMgbm8gaG9sZSBpbiB0aGUgbWlkZGxlIG9mIGFkZHJlc3Mgc3BhY2UuCisgKiBUbyBzYXZlIG1lbW9yeSBtYWtlIHN1cmUgaXQgaXMgc3RpbGwgaW4gdGhlIHNhbWUgUFRFIGFzIHRoZSBzdGFjaworICogdG9wLiAgVGhpcyBkb2Vzbid0IGdpdmUgdGhhdCBtYW55IHJhbmRvbSBiaXRzLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBpcyBpbXBlcmZlY3Q6IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHZkc28KKyAqIHN0YXJ0IGFkZHJlc3Mgd2l0aGluIGEgUE1EIGlzIGJpYXNlZCB0b3dhcmQgdGhlIGVuZC4KKyAqCisgKiBPbmx5IHVzZWQgZm9yIHRoZSA2NC1iaXQgYW5kIHgzMiB2ZHNvcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgdmRzb19hZGRyKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIsIGVuZDsKKwl1bnNpZ25lZCBvZmZzZXQ7CisKKwkvKgorCSAqIFJvdW5kIHVwIHRoZSBzdGFydCBhZGRyZXNzLiAgSXQgY2FuIHN0YXJ0IG91dCB1bmFsaWduZWQgYXMgYSByZXN1bHQKKwkgKiBvZiBzdGFjayBzdGFydCByYW5kb21pemF0aW9uLgorCSAqLworCXN0YXJ0ID0gUEFHRV9BTElHTihzdGFydCk7CisKKwkvKiBSb3VuZCB0aGUgbG93ZXN0IHBvc3NpYmxlIGVuZCBhZGRyZXNzIHVwIHRvIGEgUE1EIGJvdW5kYXJ5LiAqLworCWVuZCA9IChzdGFydCArIGxlbiArIFBNRF9TSVpFIC0gMSkgJiBQTURfTUFTSzsKKwlpZiAoZW5kID49IFRBU0tfU0laRV9NQVgpCisJCWVuZCA9IFRBU0tfU0laRV9NQVg7CisJZW5kIC09IGxlbjsKKworCWlmIChlbmQgPiBzdGFydCkgeworCQlvZmZzZXQgPSBnZXRfcmFuZG9tX2ludCgpICUgKCgoZW5kIC0gc3RhcnQpID4+IFBBR0VfU0hJRlQpICsgMSk7CisJCWFkZHIgPSBzdGFydCArIChvZmZzZXQgPDwgUEFHRV9TSElGVCk7CisJfSBlbHNlIHsKKwkJYWRkciA9IHN0YXJ0OworCX0KKworCS8qCisJICogRm9yY2libHkgYWxpZ24gdGhlIGZpbmFsIGFkZHJlc3MgaW4gY2FzZSB3ZSBoYXZlIGEgaGFyZHdhcmUKKwkgKiBpc3N1ZSB0aGF0IHJlcXVpcmVzIGFsaWdubWVudCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKwkgKi8KKwlhZGRyID0gYWxpZ25fdmRzb19hZGRyKGFkZHIpOworCisJcmV0dXJuIGFkZHI7Cit9CisKK3N0YXRpYyBpbnQgbWFwX3Zkc29fcmFuZG9taXplZChjb25zdCBzdHJ1Y3QgdmRzb19pbWFnZSAqaW1hZ2UpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gdmRzb19hZGRyKGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjaywgaW1hZ2UtPnNpemUtaW1hZ2UtPnN5bV92dmFyX3N0YXJ0KTsKKworCXJldHVybiBtYXBfdmRzbyhpbWFnZSwgYWRkcik7Cit9CisjZW5kaWYKKworaW50IG1hcF92ZHNvX29uY2UoY29uc3Qgc3RydWN0IHZkc29faW1hZ2UgKmltYWdlLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJLyoKKwkgKiBDaGVjayBpZiB3ZSBoYXZlIGFscmVhZHkgbWFwcGVkIHZkc28gYmxvYiAtIGZhaWwgdG8gcHJldmVudAorCSAqIGFidXNpbmcgZnJvbSB1c2Vyc3BhY2UgaW5zdGFsbF9zcGVjaWFsbF9tYXBwaW5nLCB3aGljaCBtYXkKKwkgKiBub3QgZG8gYWNjb3VudGluZyBhbmQgcmxpbWl0IHJpZ2h0LgorCSAqIFdlIGNvdWxkIHNlYXJjaCB2bWEgbmVhciBjb250ZXh0LnZkc28sIGJ1dCBpdCdzIGEgc2xvd3BhdGgsCisJICogc28gbGV0J3MgZXhwbGljaXRlbHkgY2hlY2sgYWxsIFZNQXMgdG8gYmUgY29tcGxldGVseSBzdXJlLgorCSAqLworCWZvciAodm1hID0gbW0tPm1tYXA7IHZtYTsgdm1hID0gdm1hLT52bV9uZXh0KSB7CisJCWlmICh2bWFfaXNfc3BlY2lhbF9tYXBwaW5nKHZtYSwgJnZkc29fbWFwcGluZykgfHwKKwkJCQl2bWFfaXNfc3BlY2lhbF9tYXBwaW5nKHZtYSwgJnZ2YXJfbWFwcGluZykpIHsKKwkJCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCQkJcmV0dXJuIC1FRVhJU1Q7CisJCX0KKwl9CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisKKwlyZXR1cm4gbWFwX3Zkc28oaW1hZ2UsIGFkZHIpOworfQorCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2XzMyKSB8fCBkZWZpbmVkKENPTkZJR19JQTMyX0VNVUxBVElPTikKIHN0YXRpYyBpbnQgbG9hZF92ZHNvMzIodm9pZCkKIHsKIAlpZiAodmRzbzMyX2VuYWJsZWQgIT0gMSkgIC8qIE90aGVyIHZhbHVlcyBhbGwgbWVhbiAiZGlzYWJsZWQiICovCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIG1hcF92ZHNvKCZ2ZHNvX2ltYWdlXzMyLCBmYWxzZSk7CisJcmV0dXJuIG1hcF92ZHNvKCZ2ZHNvX2ltYWdlXzMyLCAwKTsKIH0KICNlbmRpZgogCkBAIC0yNjUsNyArMjk1LDcgQEAKIAlpZiAoIXZkc282NF9lbmFibGVkKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBtYXBfdmRzbygmdmRzb19pbWFnZV82NCwgdHJ1ZSk7CisJcmV0dXJuIG1hcF92ZHNvX3JhbmRvbWl6ZWQoJnZkc29faW1hZ2VfNjQpOwogfQogCiAjaWZkZWYgQ09ORklHX0NPTVBBVApAQCAtMjc2LDggKzMwNiw3IEBACiAJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1gzMikpIHsKIAkJaWYgKCF2ZHNvNjRfZW5hYmxlZCkKIAkJCXJldHVybiAwOwotCi0JCXJldHVybiBtYXBfdmRzbygmdmRzb19pbWFnZV94MzIsIHRydWUpOworCQlyZXR1cm4gbWFwX3Zkc29fcmFuZG9taXplZCgmdmRzb19pbWFnZV94MzIpOwogCX0KICNlbmRpZgogI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2FtZC9jb3JlLmMgYi9hcmNoL3g4Ni9ldmVudHMvYW1kL2NvcmUuYwppbmRleCBlMDdhMjJiLi5mNWY0YjNmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvYW1kL2NvcmUuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvYW1kL2NvcmUuYwpAQCAtMTE5LDggKzExOSw4IEBACiB7CiAgIFtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdCQkJPSAweDAwNzYsCiAgIFtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JCQk9IDB4MDBjMCwKLSAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10JCT0gMHgwMDgwLAotICBbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdCQkJPSAweDAwODEsCisgIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVNdCQk9IDB4MDc3ZCwKKyAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXQkJCT0gMHgwNzdlLAogICBbUEVSRl9DT1VOVF9IV19CUkFOQ0hfSU5TVFJVQ1RJT05TXQkJPSAweDAwYzIsCiAgIFtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdCQkJPSAweDAwYzMsCiAgIFtQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0ZST05URU5EXQk9IDB4MDBkMCwgLyogIkRlY29kZXIgZW1wdHkiIGV2ZW50ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvYW1kL3VuY29yZS5jIGIvYXJjaC94ODYvZXZlbnRzL2FtZC91bmNvcmUuYwppbmRleCBlNjEzMWQ0Li42NTU3N2YwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvYW1kL3VuY29yZS5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9hbWQvdW5jb3JlLmMKQEAgLTI5LDYgKzI5LDggQEAKIAogI2RlZmluZSBDT1VOVEVSX1NISUZUCQkxNgogCitzdGF0aWMgSExJU1RfSEVBRCh1bmNvcmVfdW51c2VkX2xpc3QpOworCiBzdHJ1Y3QgYW1kX3VuY29yZSB7CiAJaW50IGlkOwogCWludCByZWZjbnQ7CkBAIC0zOSw3ICs0MSw3IEBACiAJY3B1bWFza190ICphY3RpdmVfbWFzazsKIAlzdHJ1Y3QgcG11ICpwbXU7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50c1tNQVhfQ09VTlRFUlNdOwotCXN0cnVjdCBhbWRfdW5jb3JlICpmcmVlX3doZW5fY3B1X29ubGluZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOwogfTsKIAogc3RhdGljIHN0cnVjdCBhbWRfdW5jb3JlICogX19wZXJjcHUgKmFtZF91bmNvcmVfbmI7CkBAIC0zMDYsNiArMzA4LDcgQEAKIAkJdW5jb3JlX25iLT5tc3JfYmFzZSA9IE1TUl9GMTVIX05CX1BFUkZfQ1RMOwogCQl1bmNvcmVfbmItPmFjdGl2ZV9tYXNrID0gJmFtZF9uYl9hY3RpdmVfbWFzazsKIAkJdW5jb3JlX25iLT5wbXUgPSAmYW1kX25iX3BtdTsKKwkJdW5jb3JlX25iLT5pZCA9IC0xOwogCQkqcGVyX2NwdV9wdHIoYW1kX3VuY29yZV9uYiwgY3B1KSA9IHVuY29yZV9uYjsKIAl9CiAKQEAgLTMxOSw2ICszMjIsNyBAQAogCQl1bmNvcmVfbDItPm1zcl9iYXNlID0gTVNSX0YxNkhfTDJJX1BFUkZfQ1RMOwogCQl1bmNvcmVfbDItPmFjdGl2ZV9tYXNrID0gJmFtZF9sMl9hY3RpdmVfbWFzazsKIAkJdW5jb3JlX2wyLT5wbXUgPSAmYW1kX2wyX3BtdTsKKwkJdW5jb3JlX2wyLT5pZCA9IC0xOwogCQkqcGVyX2NwdV9wdHIoYW1kX3VuY29yZV9sMiwgY3B1KSA9IHVuY29yZV9sMjsKIAl9CiAKQEAgLTM0OCw3ICszNTIsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKHRoaXMtPmlkID09IHRoYXQtPmlkKSB7Ci0JCQl0aGF0LT5mcmVlX3doZW5fY3B1X29ubGluZSA9IHRoaXM7CisJCQlobGlzdF9hZGRfaGVhZCgmdGhpcy0+bm9kZSwgJnVuY29yZV91bnVzZWRfbGlzdCk7CiAJCQl0aGlzID0gdGhhdDsKIAkJCWJyZWFrOwogCQl9CkBAIC0zODgsMTMgKzM5MiwyMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB1bmNvcmVfY2xlYW5fb25saW5lKHZvaWQpCit7CisJc3RydWN0IGFtZF91bmNvcmUgKnVuY29yZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodW5jb3JlLCBuLCAmdW5jb3JlX3VudXNlZF9saXN0LCBub2RlKSB7CisJCWhsaXN0X2RlbCgmdW5jb3JlLT5ub2RlKTsKKwkJa2ZyZWUodW5jb3JlKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHVuY29yZV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSwKIAkJCSAgc3RydWN0IGFtZF91bmNvcmUgKiBfX3BlcmNwdSAqdW5jb3JlcykKIHsKIAlzdHJ1Y3QgYW1kX3VuY29yZSAqdW5jb3JlID0gKnBlcl9jcHVfcHRyKHVuY29yZXMsIGNwdSk7CiAKLQlrZnJlZSh1bmNvcmUtPmZyZWVfd2hlbl9jcHVfb25saW5lKTsKLQl1bmNvcmUtPmZyZWVfd2hlbl9jcHVfb25saW5lID0gTlVMTDsKKwl1bmNvcmVfY2xlYW5fb25saW5lKCk7CiAKIAlpZiAoY3B1ID09IHVuY29yZS0+Y3B1KQogCQljcHVtYXNrX3NldF9jcHUoY3B1LCB1bmNvcmUtPmFjdGl2ZV9tYXNrKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9jb3JlLmMgYi9hcmNoL3g4Ni9ldmVudHMvY29yZS5jCmluZGV4IGQwZWZiNWMuLmQzMTczNWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9jb3JlLmMKKysrIGIvYXJjaC94ODYvZXZlbnRzL2NvcmUuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2xkdC5oPgorI2luY2x1ZGUgPGFzbS91bndpbmQuaD4KIAogI2luY2x1ZGUgInBlcmZfZXZlbnQuaCIKIApAQCAtMTIwMSw2ICsxMjAyLDkgQEAKIAkgKiBJZiBncm91cCBldmVudHMgc2NoZWR1bGluZyB0cmFuc2FjdGlvbiB3YXMgc3RhcnRlZCwKIAkgKiBza2lwIHRoZSBzY2hlZHVsYWJpbGl0eSB0ZXN0IGhlcmUsIGl0IHdpbGwgYmUgcGVyZm9ybWVkCiAJICogYXQgY29tbWl0IHRpbWUgKC0+Y29tbWl0X3R4bikgYXMgYSB3aG9sZS4KKwkgKgorCSAqIElmIGNvbW1pdCBmYWlscywgd2UnbGwgY2FsbCAtPmRlbCgpIG9uIGFsbCBldmVudHMKKwkgKiBmb3Igd2hpY2ggLT5hZGQoKSB3YXMgY2FsbGVkLgogCSAqLwogCWlmIChjcHVjLT50eG5fZmxhZ3MgJiBQRVJGX1BNVV9UWE5fQUREKQogCQlnb3RvIGRvbmVfY29sbGVjdDsKQEAgLTEyMjMsNiArMTIyNywxNCBAQAogCWNwdWMtPm5fYWRkZWQgKz0gbiAtIG4wOwogCWNwdWMtPm5fdHhuICs9IG4gLSBuMDsKIAorCWlmICh4ODZfcG11LmFkZCkgeworCQkvKgorCQkgKiBUaGlzIGlzIGJlZm9yZSB4ODZfcG11X2VuYWJsZSgpIHdpbGwgY2FsbCB4ODZfcG11X3N0YXJ0KCksCisJCSAqIHNvIHdlIGVuYWJsZSBMQlJzIGJlZm9yZSBhbiBldmVudCBuZWVkcyB0aGVtIGV0Yy4uCisJCSAqLworCQl4ODZfcG11LmFkZChldmVudCk7CisJfQorCiAJcmV0ID0gMDsKIG91dDoKIAlyZXR1cm4gcmV0OwpAQCAtMTM0Niw3ICsxMzU4LDcgQEAKIAlldmVudC0+aHcuZmxhZ3MgJj0gflBFUkZfWDg2X0VWRU5UX0NPTU1JVFRFRDsKIAogCS8qCi0JICogSWYgd2UncmUgY2FsbGVkIGR1cmluZyBhIHR4biwgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4KKwkgKiBJZiB3ZSdyZSBjYWxsZWQgZHVyaW5nIGEgdHhuLCB3ZSBvbmx5IG5lZWQgdG8gdW5kbyB4ODZfcG11LmFkZC4KIAkgKiBUaGUgZXZlbnRzIG5ldmVyIGdvdCBzY2hlZHVsZWQgYW5kIC0+Y2FuY2VsX3R4biB3aWxsIHRydW5jYXRlCiAJICogdGhlIGV2ZW50X2xpc3QuCiAJICoKQEAgLTEzNTQsNyArMTM2Niw3IEBACiAJICogYW4gZXZlbnQgYWRkZWQgZHVyaW5nIHRoYXQgc2FtZSBUWE4uCiAJICovCiAJaWYgKGNwdWMtPnR4bl9mbGFncyAmIFBFUkZfUE1VX1RYTl9BREQpCi0JCXJldHVybjsKKwkJZ290byBkb19kZWw7CiAKIAkvKgogCSAqIE5vdCBhIFRYTiwgdGhlcmVmb3JlIGNsZWFudXAgcHJvcGVybHkuCkBAIC0xMzg0LDYgKzEzOTYsMTUgQEAKIAktLWNwdWMtPm5fZXZlbnRzOwogCiAJcGVyZl9ldmVudF91cGRhdGVfdXNlcnBhZ2UoZXZlbnQpOworCitkb19kZWw6CisJaWYgKHg4Nl9wbXUuZGVsKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYWZ0ZXIgeDg2X3BtdV9zdG9wKCk7IHNvIHdlIGRpc2FibGUgTEJScyBhZnRlciBhbnkKKwkJICogZXZlbnQgY2FuIG5lZWQgdGhlbSBldGMuLgorCQkgKi8KKwkJeDg2X3BtdS5kZWwoZXZlbnQpOworCX0KIH0KIAogaW50IHg4Nl9wbXVfaGFuZGxlX2lycShzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTIyNDcsMzkgKzIyNjgsMjYgQEAKIAljeWMybnNfcmVhZF9lbmQoZGF0YSk7CiB9CiAKLS8qCi0gKiBjYWxsY2hhaW4gc3VwcG9ydAotICovCi0KLXN0YXRpYyBpbnQgYmFja3RyYWNlX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmFja3RyYWNlX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgcmVsaWFibGUpCi17Ci0Jc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5X2N0eCAqZW50cnkgPSBkYXRhOwotCi0JcmV0dXJuIHBlcmZfY2FsbGNoYWluX3N0b3JlKGVudHJ5LCBhZGRyKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyBiYWNrdHJhY2Vfb3BzID0gewotCS5zdGFjawkJCT0gYmFja3RyYWNlX3N0YWNrLAotCS5hZGRyZXNzCQk9IGJhY2t0cmFjZV9hZGRyZXNzLAotCS53YWxrX3N0YWNrCQk9IHByaW50X2NvbnRleHRfc3RhY2tfYnAsCi19OwotCiB2b2lkCiBwZXJmX2NhbGxjaGFpbl9rZXJuZWwoc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5X2N0eCAqZW50cnksIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCXN0cnVjdCB1bndpbmRfc3RhdGUgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCiAJaWYgKHBlcmZfZ3Vlc3RfY2JzICYmIHBlcmZfZ3Vlc3RfY2JzLT5pc19pbl9ndWVzdCgpKSB7CiAJCS8qIFRPRE86IFdlIGRvbid0IHN1cHBvcnQgZ3Vlc3Qgb3MgY2FsbGNoYWluIG5vdyAqLwogCQlyZXR1cm47CiAJfQogCi0JcGVyZl9jYWxsY2hhaW5fc3RvcmUoZW50cnksIHJlZ3MtPmlwKTsKKwlpZiAocGVyZl9jYWxsY2hhaW5fc3RvcmUoZW50cnksIHJlZ3MtPmlwKSkKKwkJcmV0dXJuOwogCi0JZHVtcF90cmFjZShOVUxMLCByZWdzLCBOVUxMLCAwLCAmYmFja3RyYWNlX29wcywgZW50cnkpOworCWZvciAodW53aW5kX3N0YXJ0KCZzdGF0ZSwgY3VycmVudCwgcmVncywgTlVMTCk7ICF1bndpbmRfZG9uZSgmc3RhdGUpOworCSAgICAgdW53aW5kX25leHRfZnJhbWUoJnN0YXRlKSkgeworCQlhZGRyID0gdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzcygmc3RhdGUpOworCQlpZiAoIWFkZHIgfHwgcGVyZl9jYWxsY2hhaW5fc3RvcmUoZW50cnksIGFkZHIpKQorCQkJcmV0dXJuOworCX0KIH0KIAogc3RhdGljIGlubGluZSBpbnQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9idHMuYyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9idHMuYwppbmRleCAwYTZlMzkzLi45ODJjOWUzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvYnRzLmMKKysrIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL2J0cy5jCkBAIC0zMSw3ICszMSwxNyBAQAogc3RydWN0IGJ0c19jdHggewogCXN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUJaGFuZGxlOwogCXN0cnVjdCBkZWJ1Z19zdG9yZQkJZHNfYmFjazsKLQlpbnQJCQkJc3RhcnRlZDsKKwlpbnQJCQkJc3RhdGU7Cit9OworCisvKiBCVFMgY29udGV4dCBzdGF0ZXM6ICovCitlbnVtIHsKKwkvKiBubyBvbmdvaW5nIEFVWCB0cmFuc2FjdGlvbnMgKi8KKwlCVFNfU1RBVEVfU1RPUFBFRCA9IDAsCisJLyogQVVYIHRyYW5zYWN0aW9uIGlzIG9uLCBCVFMgdHJhY2luZyBpcyBkaXNhYmxlZCAqLworCUJUU19TVEFURV9JTkFDVElWRSwKKwkvKiBBVVggdHJhbnNhY3Rpb24gaXMgb24sIEJUUyB0cmFjaW5nIGlzIHJ1bm5pbmcgKi8KKwlCVFNfU1RBVEVfQUNUSVZFLAogfTsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBidHNfY3R4LCBidHNfY3R4KTsKQEAgLTIwNCw2ICsyMTQsMTUgQEAKIHN0YXRpYyBpbnQKIGJ0c19idWZmZXJfcmVzZXQoc3RydWN0IGJ0c19idWZmZXIgKmJ1Ziwgc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlKTsKIAorLyoKKyAqIE9yZGVyaW5nIFBNVSBjYWxsYmFja3Mgd3J0IHRoZW1zZWx2ZXMgYW5kIHRoZSBQTUkgaXMgZG9uZSBieSBtZWFucworICogb2YgYnRzOjpzdGF0ZSwgd2hpY2g6CisgKiAgLSBpcyBzZXQgd2hlbiBidHM6OmhhbmRsZTo6ZXZlbnQgaXMgdmFsaWQsIHRoYXQgaXMsIGJldHdlZW4KKyAqICAgIHBlcmZfYXV4X291dHB1dF9iZWdpbigpIGFuZCBwZXJmX2F1eF9vdXRwdXRfZW5kKCk7CisgKiAgLSBpcyB6ZXJvIG90aGVyd2lzZTsKKyAqICAtIGlzIG9yZGVyZWQgYWdhaW5zdCBidHM6OmhhbmRsZTo6ZXZlbnQgd2l0aCBhIGNvbXBpbGVyIGJhcnJpZXIuCisgKi8KKwogc3RhdGljIHZvaWQgX19idHNfZXZlbnRfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBidHNfY3R4ICpidHMgPSB0aGlzX2NwdV9wdHIoJmJ0c19jdHgpOwpAQCAtMjIxLDEwICsyNDAsMTMgQEAKIAogCS8qCiAJICogbG9jYWwgYmFycmllciB0byBtYWtlIHN1cmUgdGhhdCBkcyBjb25maWd1cmF0aW9uIG1hZGUgaXQKLQkgKiBiZWZvcmUgd2UgZW5hYmxlIEJUUworCSAqIGJlZm9yZSB3ZSBlbmFibGUgQlRTIGFuZCBidHM6OnN0YXRlIGdvZXMgQUNUSVZFCiAJICovCiAJd21iKCk7CiAKKwkvKiBJTkFDVElWRS9TVE9QUEVEIC0+IEFDVElWRSAqLworCVdSSVRFX09OQ0UoYnRzLT5zdGF0ZSwgQlRTX1NUQVRFX0FDVElWRSk7CisKIAlpbnRlbF9wbXVfZW5hYmxlX2J0cyhjb25maWcpOwogCiB9CkBAIC0yNTEsOSArMjczLDYgQEAKIAogCV9fYnRzX2V2ZW50X3N0YXJ0KGV2ZW50KTsKIAotCS8qIFBNSSBoYW5kbGVyOiB0aGlzIGNvdW50ZXIgaXMgcnVubmluZyBhbmQgbGlrZWx5IGdlbmVyYXRpbmcgUE1JcyAqLwotCUFDQ0VTU19PTkNFKGJ0cy0+c3RhcnRlZCkgPSAxOwotCiAJcmV0dXJuOwogCiBmYWlsX2VuZF9zdG9wOgpAQCAtMjYzLDMwICsyODIsMzQgQEAKIAlldmVudC0+aHcuc3RhdGUgPSBQRVJGX0hFU19TVE9QUEVEOwogfQogCi1zdGF0aWMgdm9pZCBfX2J0c19ldmVudF9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3N0YXRpYyB2b2lkIF9fYnRzX2V2ZW50X3N0b3Aoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgc3RhdGUpCiB7CisJc3RydWN0IGJ0c19jdHggKmJ0cyA9IHRoaXNfY3B1X3B0cigmYnRzX2N0eCk7CisKKwkvKiBBQ1RJVkUgLT4gSU5BQ1RJVkUoUE1JKS9TVE9QUEVEKC0+c3RvcCgpKSAqLworCVdSSVRFX09OQ0UoYnRzLT5zdGF0ZSwgc3RhdGUpOworCiAJLyoKIAkgKiBObyBleHRyYSBzeW5jaHJvbml6YXRpb24gaXMgbWFuZGF0ZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gdG8gaGF2ZQogCSAqIEJUUyBkYXRhIHN0b3JlcyBnbG9iYWxseSB2aXNpYmxlLgogCSAqLwogCWludGVsX3BtdV9kaXNhYmxlX2J0cygpOwotCi0JaWYgKGV2ZW50LT5ody5zdGF0ZSAmIFBFUkZfSEVTX1NUT1BQRUQpCi0JCXJldHVybjsKLQotCUFDQ0VTU19PTkNFKGV2ZW50LT5ody5zdGF0ZSkgfD0gUEVSRl9IRVNfU1RPUFBFRDsKIH0KIAogc3RhdGljIHZvaWQgYnRzX2V2ZW50X3N0b3Aoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOwogCXN0cnVjdCBidHNfY3R4ICpidHMgPSB0aGlzX2NwdV9wdHIoJmJ0c19jdHgpOwotCXN0cnVjdCBidHNfYnVmZmVyICpidWYgPSBwZXJmX2dldF9hdXgoJmJ0cy0+aGFuZGxlKTsKKwlzdHJ1Y3QgYnRzX2J1ZmZlciAqYnVmID0gTlVMTDsKKwlpbnQgc3RhdGUgPSBSRUFEX09OQ0UoYnRzLT5zdGF0ZSk7CiAKLQkvKiBQTUkgaGFuZGxlcjogZG9uJ3QgcmVzdGFydCB0aGlzIGNvdW50ZXIgKi8KLQlBQ0NFU1NfT05DRShidHMtPnN0YXJ0ZWQpID0gMDsKKwlpZiAoc3RhdGUgPT0gQlRTX1NUQVRFX0FDVElWRSkKKwkJX19idHNfZXZlbnRfc3RvcChldmVudCwgQlRTX1NUQVRFX1NUT1BQRUQpOwogCi0JX19idHNfZXZlbnRfc3RvcChldmVudCk7CisJaWYgKHN0YXRlICE9IEJUU19TVEFURV9TVE9QUEVEKQorCQlidWYgPSBwZXJmX2dldF9hdXgoJmJ0cy0+aGFuZGxlKTsKKworCWV2ZW50LT5ody5zdGF0ZSB8PSBQRVJGX0hFU19TVE9QUEVEOwogCiAJaWYgKGZsYWdzICYgUEVSRl9FRl9VUERBVEUpIHsKIAkJYnRzX3VwZGF0ZShidHMpOwpAQCAtMjk2LDYgKzMxOSw3IEBACiAJCQkJYnRzLT5oYW5kbGUuaGVhZCA9CiAJCQkJCWxvY2FsX3hjaGcoJmJ1Zi0+ZGF0YV9zaXplLAogCQkJCQkJICAgYnVmLT5ucl9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKwogCQkJcGVyZl9hdXhfb3V0cHV0X2VuZCgmYnRzLT5oYW5kbGUsIGxvY2FsX3hjaGcoJmJ1Zi0+ZGF0YV9zaXplLCAwKSwKIAkJCQkJICAgICEhbG9jYWxfeGNoZygmYnVmLT5sb3N0LCAwKSk7CiAJCX0KQEAgLTMxMCw4ICszMzQsMjAgQEAKIHZvaWQgaW50ZWxfYnRzX2VuYWJsZV9sb2NhbCh2b2lkKQogewogCXN0cnVjdCBidHNfY3R4ICpidHMgPSB0aGlzX2NwdV9wdHIoJmJ0c19jdHgpOworCWludCBzdGF0ZSA9IFJFQURfT05DRShidHMtPnN0YXRlKTsKIAotCWlmIChidHMtPmhhbmRsZS5ldmVudCAmJiBidHMtPnN0YXJ0ZWQpCisJLyoKKwkgKiBIZXJlIHdlIHRyYW5zaXRpb24gZnJvbSBJTkFDVElWRSB0byBBQ1RJVkU7CisJICogaWYgd2UgaW5zdGVhZCBhcmUgU1RPUFBFRCBmcm9tIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciwKKwkgKiBzdGF5IHRoYXQgd2F5LiBDYW4ndCBiZSBBQ1RJVkUgaGVyZSB0aG91Z2guCisJICovCisJaWYgKFdBUk5fT05fT05DRShzdGF0ZSA9PSBCVFNfU1RBVEVfQUNUSVZFKSkKKwkJcmV0dXJuOworCisJaWYgKHN0YXRlID09IEJUU19TVEFURV9TVE9QUEVEKQorCQlyZXR1cm47CisKKwlpZiAoYnRzLT5oYW5kbGUuZXZlbnQpCiAJCV9fYnRzX2V2ZW50X3N0YXJ0KGJ0cy0+aGFuZGxlLmV2ZW50KTsKIH0KIApAQCAtMzE5LDggKzM1NSwxNSBAQAogewogCXN0cnVjdCBidHNfY3R4ICpidHMgPSB0aGlzX2NwdV9wdHIoJmJ0c19jdHgpOwogCisJLyoKKwkgKiBIZXJlIHdlIHRyYW5zaXRpb24gZnJvbSBBQ1RJVkUgdG8gSU5BQ1RJVkU7CisJICogZG8gbm90aGluZyBmb3IgU1RPUFBFRCBvciBJTkFDVElWRS4KKwkgKi8KKwlpZiAoUkVBRF9PTkNFKGJ0cy0+c3RhdGUpICE9IEJUU19TVEFURV9BQ1RJVkUpCisJCXJldHVybjsKKwogCWlmIChidHMtPmhhbmRsZS5ldmVudCkKLQkJX19idHNfZXZlbnRfc3RvcChidHMtPmhhbmRsZS5ldmVudCk7CisJCV9fYnRzX2V2ZW50X3N0b3AoYnRzLT5oYW5kbGUuZXZlbnQsIEJUU19TVEFURV9JTkFDVElWRSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTMzNSw4ICszNzgsNiBAQAogCQlyZXR1cm4gMDsKIAogCWhlYWQgPSBoYW5kbGUtPmhlYWQgJiAoKGJ1Zi0+bnJfcGFnZXMgPDwgUEFHRV9TSElGVCkgLSAxKTsKLQlpZiAoV0FSTl9PTl9PTkNFKGhlYWQgIT0gbG9jYWxfcmVhZCgmYnVmLT5oZWFkKSkpCi0JCXJldHVybiAtRUlOVkFMOwogCiAJcGh5cyA9ICZidWYtPmJ1ZltidWYtPmN1cl9idWZdOwogCXNwYWNlID0gcGh5cy0+b2Zmc2V0ICsgcGh5cy0+ZGlzcGxhY2VtZW50ICsgcGh5cy0+c2l6ZSAtIGhlYWQ7CkBAIC00MDMsMjIgKzQ0NCwzNyBAQAogCiBpbnQgaW50ZWxfYnRzX2ludGVycnVwdCh2b2lkKQogeworCXN0cnVjdCBkZWJ1Z19zdG9yZSAqZHMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpLT5kczsKIAlzdHJ1Y3QgYnRzX2N0eCAqYnRzID0gdGhpc19jcHVfcHRyKCZidHNfY3R4KTsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQgPSBidHMtPmhhbmRsZS5ldmVudDsKIAlzdHJ1Y3QgYnRzX2J1ZmZlciAqYnVmOwogCXM2NCBvbGRfaGVhZDsKLQlpbnQgZXJyOworCWludCBlcnIgPSAtRU5PU1BDLCBoYW5kbGVkID0gMDsKIAotCWlmICghZXZlbnQgfHwgIWJ0cy0+c3RhcnRlZCkKLQkJcmV0dXJuIDA7CisJLyoKKwkgKiBUaGUgb25seSBzdXJlZmlyZSB3YXkgb2Yga25vd2luZyBpZiB0aGlzIE5NSSBpcyBvdXJzIGlzIGJ5IGNoZWNraW5nCisJICogdGhlIHdyaXRlIHB0ciBhZ2FpbnN0IHRoZSBQTUkgdGhyZXNob2xkLgorCSAqLworCWlmIChkcyAmJiAoZHMtPmJ0c19pbmRleCA+PSBkcy0+YnRzX2ludGVycnVwdF90aHJlc2hvbGQpKQorCQloYW5kbGVkID0gMTsKKworCS8qCisJICogdGhpcyBpcyB3cmFwcGVkIGluIGludGVsX2J0c19lbmFibGVfbG9jYWwvaW50ZWxfYnRzX2Rpc2FibGVfbG9jYWwsCisJICogc28gd2UgY2FuIG9ubHkgYmUgSU5BQ1RJVkUgb3IgU1RPUFBFRAorCSAqLworCWlmIChSRUFEX09OQ0UoYnRzLT5zdGF0ZSkgPT0gQlRTX1NUQVRFX1NUT1BQRUQpCisJCXJldHVybiBoYW5kbGVkOwogCiAJYnVmID0gcGVyZl9nZXRfYXV4KCZidHMtPmhhbmRsZSk7CisJaWYgKCFidWYpCisJCXJldHVybiBoYW5kbGVkOworCiAJLyoKIAkgKiBTa2lwIHNuYXBzaG90IGNvdW50ZXJzOiB0aGV5IGRvbid0IHVzZSB0aGUgaW50ZXJydXB0LCBidXQKIAkgKiB0aGVyZSdzIG5vIG90aGVyIHdheSBvZiB0ZWxsaW5nLCBiZWNhdXNlIHRoZSBwb2ludGVyIHdpbGwKIAkgKiBrZWVwIG1vdmluZwogCSAqLwotCWlmICghYnVmIHx8IGJ1Zi0+c25hcHNob3QpCisJaWYgKGJ1Zi0+c25hcHNob3QpCiAJCXJldHVybiAwOwogCiAJb2xkX2hlYWQgPSBsb2NhbF9yZWFkKCZidWYtPmhlYWQpOwpAQCAtNDI2LDE4ICs0ODIsMjcgQEAKIAogCS8qIG5vIG5ldyBkYXRhICovCiAJaWYgKG9sZF9oZWFkID09IGxvY2FsX3JlYWQoJmJ1Zi0+aGVhZCkpCi0JCXJldHVybiAwOworCQlyZXR1cm4gaGFuZGxlZDsKIAogCXBlcmZfYXV4X291dHB1dF9lbmQoJmJ0cy0+aGFuZGxlLCBsb2NhbF94Y2hnKCZidWYtPmRhdGFfc2l6ZSwgMCksCiAJCQkgICAgISFsb2NhbF94Y2hnKCZidWYtPmxvc3QsIDApKTsKIAogCWJ1ZiA9IHBlcmZfYXV4X291dHB1dF9iZWdpbigmYnRzLT5oYW5kbGUsIGV2ZW50KTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIDE7CisJaWYgKGJ1ZikKKwkJZXJyID0gYnRzX2J1ZmZlcl9yZXNldChidWYsICZidHMtPmhhbmRsZSk7CiAKLQllcnIgPSBidHNfYnVmZmVyX3Jlc2V0KGJ1ZiwgJmJ0cy0+aGFuZGxlKTsKLQlpZiAoZXJyKQotCQlwZXJmX2F1eF9vdXRwdXRfZW5kKCZidHMtPmhhbmRsZSwgMCwgZmFsc2UpOworCWlmIChlcnIpIHsKKwkJV1JJVEVfT05DRShidHMtPnN0YXRlLCBCVFNfU1RBVEVfU1RPUFBFRCk7CisKKwkJaWYgKGJ1ZikgeworCQkJLyoKKwkJCSAqIEJUU19TVEFURV9TVE9QUEVEIHNob3VsZCBiZSB2aXNpYmxlIGJlZm9yZQorCQkJICogY2xlYXJlZCBoYW5kbGU6OmV2ZW50CisJCQkgKi8KKwkJCWJhcnJpZXIoKTsKKwkJCXBlcmZfYXV4X291dHB1dF9lbmQoJmJ0cy0+aGFuZGxlLCAwLCBmYWxzZSk7CisJCX0KKwl9CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTUxOSw3ICs1ODQsOCBAQAogCWlmICghYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0RURVM2NCkgfHwgIXg4Nl9wbXUuYnRzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWJ0c19wbXUuY2FwYWJpbGl0aWVzCT0gUEVSRl9QTVVfQ0FQX0FVWF9OT19TRyB8IFBFUkZfUE1VX0NBUF9JVFJBQ0U7CisJYnRzX3BtdS5jYXBhYmlsaXRpZXMJPSBQRVJGX1BNVV9DQVBfQVVYX05PX1NHIHwgUEVSRl9QTVVfQ0FQX0lUUkFDRSB8CisJCQkJICBQRVJGX1BNVV9DQVBfRVhDTFVTSVZFOwogCWJ0c19wbXUudGFza19jdHhfbnIJPSBwZXJmX3N3X2NvbnRleHQ7CiAJYnRzX3BtdS5ldmVudF9pbml0CT0gYnRzX2V2ZW50X2luaXQ7CiAJYnRzX3BtdS5hZGQJCT0gYnRzX2V2ZW50X2FkZDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9jb3JlLmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvY29yZS5jCmluZGV4IDJjYmRlMmYuLmEzYTllYjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9jb3JlLmMKKysrIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL2NvcmUuYwpAQCAtMTczMCw5ICsxNzMwLDExIEBACiAgKiBkaXNhYmxlZCBzdGF0ZSBpZiBjYWxsZWQgY29uc2VjdXRpdmVseS4KICAqCiAgKiBEdXJpbmcgY29uc2VjdXRpdmUgY2FsbHMsIHRoZSBzYW1lIGRpc2FibGUgdmFsdWUgd2lsbCBiZSB3cml0dGVuIHRvIHJlbGF0ZWQKLSAqIHJlZ2lzdGVycywgc28gdGhlIFBNVSBzdGF0ZSByZW1haW5zIHVuY2hhbmdlZC4gaHcuc3RhdGUgaW4KLSAqIGludGVsX2J0c19kaXNhYmxlX2xvY2FsIHdpbGwgcmVtYWluIFBFUkZfSEVTX1NUT1BQRUQgdG9vIGluIGNvbnNlY3V0aXZlCi0gKiBjYWxscy4KKyAqIHJlZ2lzdGVycywgc28gdGhlIFBNVSBzdGF0ZSByZW1haW5zIHVuY2hhbmdlZC4KKyAqCisgKiBpbnRlbF9idHMgZXZlbnRzIGRvbid0IGNvZXhpc3Qgd2l0aCBpbnRlbCBQTVUncyBCVFMgZXZlbnRzIGJlY2F1c2Ugb2YKKyAqIHg4Nl9hZGRfZXhjbHVzaXZlKHg4Nl9sYnJfZXhjbHVzaXZlX2xicik7IHRoZXJlJ3Mgbm8gbmVlZCB0byBrZWVwIHRoZW0KKyAqIGRpc2FibGVkIGFyb3VuZCBpbnRlbCBQTVUncyBldmVudCBiYXRjaGluZyBldGMsIG9ubHkgaW5zaWRlIHRoZSBQTUkgaGFuZGxlci4KICAqLwogc3RhdGljIHZvaWQgX19pbnRlbF9wbXVfZGlzYWJsZV9hbGwodm9pZCkKIHsKQEAgLTE3NDIsOCArMTc0NCw2IEBACiAKIAlpZiAodGVzdF9iaXQoSU5URUxfUE1DX0lEWF9GSVhFRF9CVFMsIGNwdWMtPmFjdGl2ZV9tYXNrKSkKIAkJaW50ZWxfcG11X2Rpc2FibGVfYnRzKCk7Ci0JZWxzZQotCQlpbnRlbF9idHNfZGlzYWJsZV9sb2NhbCgpOwogCiAJaW50ZWxfcG11X3BlYnNfZGlzYWJsZV9hbGwoKTsKIH0KQEAgLTE3NzEsOCArMTc3MSw3IEBACiAJCQlyZXR1cm47CiAKIAkJaW50ZWxfcG11X2VuYWJsZV9idHMoZXZlbnQtPmh3LmNvbmZpZyk7Ci0JfSBlbHNlCi0JCWludGVsX2J0c19lbmFibGVfbG9jYWwoKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX3BtdV9lbmFibGVfYWxsKGludCBhZGRlZCkKQEAgLTE5MDcsMTMgKzE5MDYsNiBAQAogCWNwdWMtPmludGVsX2N0cmxfaG9zdF9tYXNrICY9IH4oMXVsbCA8PCBod2MtPmlkeCk7CiAJY3B1Yy0+aW50ZWxfY3Bfc3RhdHVzICY9IH4oMXVsbCA8PCBod2MtPmlkeCk7CiAKLQkvKgotCSAqIG11c3QgZGlzYWJsZSBiZWZvcmUgYW55IGFjdHVhbCBldmVudAotCSAqIGJlY2F1c2UgYW55IGV2ZW50IG1heSBiZSBjb21iaW5lZCB3aXRoIExCUgotCSAqLwotCWlmIChuZWVkc19icmFuY2hfc3RhY2soZXZlbnQpKQotCQlpbnRlbF9wbXVfbGJyX2Rpc2FibGUoZXZlbnQpOwotCiAJaWYgKHVubGlrZWx5KGh3Yy0+Y29uZmlnX2Jhc2UgPT0gTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFJfQ1RSTCkpIHsKIAkJaW50ZWxfcG11X2Rpc2FibGVfZml4ZWQoaHdjKTsKIAkJcmV0dXJuOwpAQCAtMTkyNSw2ICsxOTE3LDE0IEBACiAJCWludGVsX3BtdV9wZWJzX2Rpc2FibGUoZXZlbnQpOwogfQogCitzdGF0aWMgdm9pZCBpbnRlbF9wbXVfZGVsX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlpZiAobmVlZHNfYnJhbmNoX3N0YWNrKGV2ZW50KSkKKwkJaW50ZWxfcG11X2xicl9kZWwoZXZlbnQpOworCWlmIChldmVudC0+YXR0ci5wcmVjaXNlX2lwKQorCQlpbnRlbF9wbXVfcGVic19kZWwoZXZlbnQpOworfQorCiBzdGF0aWMgdm9pZCBpbnRlbF9wbXVfZW5hYmxlX2ZpeGVkKHN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MpCiB7CiAJaW50IGlkeCA9IGh3Yy0+aWR4IC0gSU5URUxfUE1DX0lEWF9GSVhFRDsKQEAgLTE5NjgsMTIgKzE5NjgsNiBAQAogCQlpbnRlbF9wbXVfZW5hYmxlX2J0cyhod2MtPmNvbmZpZyk7CiAJCXJldHVybjsKIAl9Ci0JLyoKLQkgKiBtdXN0IGVuYWJsZWQgYmVmb3JlIGFueSBhY3R1YWwgZXZlbnQKLQkgKiBiZWNhdXNlIGFueSBldmVudCBtYXkgYmUgY29tYmluZWQgd2l0aCBMQlIKLQkgKi8KLQlpZiAobmVlZHNfYnJhbmNoX3N0YWNrKGV2ZW50KSkKLQkJaW50ZWxfcG11X2xicl9lbmFibGUoZXZlbnQpOwogCiAJaWYgKGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaG9zdCkKIAkJY3B1Yy0+aW50ZWxfY3RybF9ndWVzdF9tYXNrIHw9ICgxdWxsIDw8IGh3Yy0+aWR4KTsKQEAgLTE5OTQsNiArMTk4OCwxNCBAQAogCV9feDg2X3BtdV9lbmFibGVfZXZlbnQoaHdjLCBBUkNIX1BFUkZNT05fRVZFTlRTRUxfRU5BQkxFKTsKIH0KIAorc3RhdGljIHZvaWQgaW50ZWxfcG11X2FkZF9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJaWYgKGV2ZW50LT5hdHRyLnByZWNpc2VfaXApCisJCWludGVsX3BtdV9wZWJzX2FkZChldmVudCk7CisJaWYgKG5lZWRzX2JyYW5jaF9zdGFjayhldmVudCkpCisJCWludGVsX3BtdV9sYnJfYWRkKGV2ZW50KTsKK30KKwogLyoKICAqIFNhdmUgYW5kIHJlc3RhcnQgYW4gZXhwaXJlZCBldmVudC4gQ2FsbGVkIGJ5IE5NSSBjb250ZXh0cywKICAqIHNvIGl0IGhhcyB0byBiZSBjYXJlZnVsIGFib3V0IHByZWVtcHRpbmcgbm9ybWFsIGV2ZW50IG9wczoKQEAgLTIwNzMsNiArMjA3NSw3IEBACiAJICovCiAJaWYgKCF4ODZfcG11LmxhdGVfYWNrKQogCQlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKKwlpbnRlbF9idHNfZGlzYWJsZV9sb2NhbCgpOwogCV9faW50ZWxfcG11X2Rpc2FibGVfYWxsKCk7CiAJaGFuZGxlZCA9IGludGVsX3BtdV9kcmFpbl9idHNfYnVmZmVyKCk7CiAJaGFuZGxlZCArPSBpbnRlbF9idHNfaW50ZXJydXB0KCk7CkBAIC0yMTcyLDYgKzIxNzUsNyBAQAogCS8qIE9ubHkgcmVzdG9yZSBQTVUgc3RhdGUgd2hlbiBpdCdzIGFjdGl2ZS4gU2VlIHg4Nl9wbXVfZGlzYWJsZSgpLiAqLwogCWlmIChjcHVjLT5lbmFibGVkKQogCQlfX2ludGVsX3BtdV9lbmFibGVfYWxsKDAsIHRydWUpOworCWludGVsX2J0c19lbmFibGVfbG9jYWwoKTsKIAogCS8qCiAJICogT25seSB1bm1hc2sgdGhlIE5NSSBhZnRlciB0aGUgb3ZlcmZsb3cgY291bnRlcnMKQEAgLTMyOTAsNiArMzI5NCw4IEBACiAJLmVuYWJsZV9hbGwJCT0gaW50ZWxfcG11X2VuYWJsZV9hbGwsCiAJLmVuYWJsZQkJCT0gaW50ZWxfcG11X2VuYWJsZV9ldmVudCwKIAkuZGlzYWJsZQkJPSBpbnRlbF9wbXVfZGlzYWJsZV9ldmVudCwKKwkuYWRkCQkJPSBpbnRlbF9wbXVfYWRkX2V2ZW50LAorCS5kZWwJCQk9IGludGVsX3BtdV9kZWxfZXZlbnQsCiAJLmh3X2NvbmZpZwkJPSBpbnRlbF9wbXVfaHdfY29uZmlnLAogCS5zY2hlZHVsZV9ldmVudHMJPSB4ODZfc2NoZWR1bGVfZXZlbnRzLAogCS5ldmVudHNlbAkJPSBNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9jcW0uYyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9jcW0uYwppbmRleCA3ODNjNDlkLi44ZjgyYjAyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvY3FtLmMKKysrIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL2NxbS5jCkBAIC00NTgsNiArNDU4LDExIEBACiBzdGF0aWMgdm9pZCBpbml0X21ibV9zYW1wbGUodTMyIHJtaWQsIHUzMiBldnRfdHlwZSk7CiBzdGF0aWMgdm9pZCBfX2ludGVsX21ibV9ldmVudF9jb3VudCh2b2lkICppbmZvKTsKIAorc3RhdGljIGJvb2wgaXNfY3FtX2V2ZW50KGludCBlKQoreworCXJldHVybiAoZSA9PSBRT1NfTDNfT0NDVVBfRVZFTlRfSUQpOworfQorCiBzdGF0aWMgYm9vbCBpc19tYm1fZXZlbnQoaW50IGUpCiB7CiAJcmV0dXJuIChlID49IFFPU19NQk1fVE9UQUxfRVZFTlRfSUQgJiYgZSA8PSBRT1NfTUJNX0xPQ0FMX0VWRU5UX0lEKTsKQEAgLTEzNjYsNiArMTM3MSwxMCBAQAogCSAgICAgKGV2ZW50LT5hdHRyLmNvbmZpZyA+IFFPU19NQk1fTE9DQUxfRVZFTlRfSUQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICgoaXNfY3FtX2V2ZW50KGV2ZW50LT5hdHRyLmNvbmZpZykgJiYgIWNxbV9lbmFibGVkKSB8fAorCSAgICAoaXNfbWJtX2V2ZW50KGV2ZW50LT5hdHRyLmNvbmZpZykgJiYgIW1ibV9lbmFibGVkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKiB1bnN1cHBvcnRlZCBtb2RlcyBhbmQgZmlsdGVycyAqLwogCWlmIChldmVudC0+YXR0ci5leGNsdWRlX3VzZXIgICB8fAogCSAgICBldmVudC0+YXR0ci5leGNsdWRlX2tlcm5lbCB8fApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL2RzLmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvZHMuYwppbmRleCA3Y2U5ZjNmLi4wMzE5MzExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvZHMuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvZHMuYwpAQCAtODA2LDkgKzgwNiw2NSBAQAogCXJldHVybiAmZW1wdHljb25zdHJhaW50OwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgcGVic19pc19lbmFibGVkKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjKQorLyoKKyAqIFdlIG5lZWQgdGhlIHNjaGVkX3Rhc2sgY2FsbGJhY2sgZXZlbiBmb3IgcGVyLWNwdSBldmVudHMgd2hlbiB3ZSB1c2UKKyAqIHRoZSBsYXJnZSBpbnRlcnJ1cHQgdGhyZXNob2xkLCBzdWNoIHRoYXQgd2UgY2FuIHByb3ZpZGUgUElEIGFuZCBUSUQKKyAqIHRvIFBFQlMgc2FtcGxlcy4KKyAqLworc3RhdGljIGlubGluZSBib29sIHBlYnNfbmVlZHNfc2NoZWRfY2Ioc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMpCiB7Ci0JcmV0dXJuIChjcHVjLT5wZWJzX2VuYWJsZWQgJiAoKDFVTEwgPDwgTUFYX1BFQlNfRVZFTlRTKSAtIDEpKTsKKwlyZXR1cm4gY3B1Yy0+bl9wZWJzICYmIChjcHVjLT5uX3BlYnMgPT0gY3B1Yy0+bl9sYXJnZV9wZWJzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBlYnNfdXBkYXRlX3RocmVzaG9sZChzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YykKK3sKKwlzdHJ1Y3QgZGVidWdfc3RvcmUgKmRzID0gY3B1Yy0+ZHM7CisJdTY0IHRocmVzaG9sZDsKKworCWlmIChjcHVjLT5uX3BlYnMgPT0gY3B1Yy0+bl9sYXJnZV9wZWJzKSB7CisJCXRocmVzaG9sZCA9IGRzLT5wZWJzX2Fic29sdXRlX21heGltdW0gLQorCQkJeDg2X3BtdS5tYXhfcGVic19ldmVudHMgKiB4ODZfcG11LnBlYnNfcmVjb3JkX3NpemU7CisJfSBlbHNlIHsKKwkJdGhyZXNob2xkID0gZHMtPnBlYnNfYnVmZmVyX2Jhc2UgKyB4ODZfcG11LnBlYnNfcmVjb3JkX3NpemU7CisJfQorCisJZHMtPnBlYnNfaW50ZXJydXB0X3RocmVzaG9sZCA9IHRocmVzaG9sZDsKK30KKworc3RhdGljIHZvaWQKK3BlYnNfdXBkYXRlX3N0YXRlKGJvb2wgbmVlZGVkX2NiLCBzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1Yywgc3RydWN0IHBtdSAqcG11KQoreworCS8qCisJICogTWFrZSBzdXJlIHdlIGdldCB1cGRhdGVkIHdpdGggdGhlIGZpcnN0IFBFQlMKKwkgKiBldmVudC4gSXQgd2lsbCB0cmlnZ2VyIGFsc28gZHVyaW5nIHJlbW92YWwsIGJ1dAorCSAqIHRoYXQgZG9lcyBub3QgaHVydDoKKwkgKi8KKwlib29sIHVwZGF0ZSA9IGNwdWMtPm5fcGVicyA9PSAxOworCisJaWYgKG5lZWRlZF9jYiAhPSBwZWJzX25lZWRzX3NjaGVkX2NiKGNwdWMpKSB7CisJCWlmICghbmVlZGVkX2NiKQorCQkJcGVyZl9zY2hlZF9jYl9pbmMocG11KTsKKwkJZWxzZQorCQkJcGVyZl9zY2hlZF9jYl9kZWMocG11KTsKKworCQl1cGRhdGUgPSB0cnVlOworCX0KKworCWlmICh1cGRhdGUpCisJCXBlYnNfdXBkYXRlX3RocmVzaG9sZChjcHVjKTsKK30KKwordm9pZCBpbnRlbF9wbXVfcGVic19hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwlib29sIG5lZWRlZF9jYiA9IHBlYnNfbmVlZHNfc2NoZWRfY2IoY3B1Yyk7CisKKwljcHVjLT5uX3BlYnMrKzsKKwlpZiAoaHdjLT5mbGFncyAmIFBFUkZfWDg2X0VWRU5UX0ZSRUVSVU5OSU5HKQorCQljcHVjLT5uX2xhcmdlX3BlYnMrKzsKKworCXBlYnNfdXBkYXRlX3N0YXRlKG5lZWRlZF9jYiwgY3B1YywgZXZlbnQtPmN0eC0+cG11KTsKIH0KIAogdm9pZCBpbnRlbF9wbXVfcGVic19lbmFibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQpAQCAtODE2LDEyICs4NzIsOSBAQAogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKIAlzdHJ1Y3QgZGVidWdfc3RvcmUgKmRzID0gY3B1Yy0+ZHM7Ci0JYm9vbCBmaXJzdF9wZWJzOwotCXU2NCB0aHJlc2hvbGQ7CiAKIAlod2MtPmNvbmZpZyAmPSB+QVJDSF9QRVJGTU9OX0VWRU5UU0VMX0lOVDsKIAotCWZpcnN0X3BlYnMgPSAhcGVic19pc19lbmFibGVkKGNwdWMpOwogCWNwdWMtPnBlYnNfZW5hYmxlZCB8PSAxVUxMIDw8IGh3Yy0+aWR4OwogCiAJaWYgKGV2ZW50LT5ody5mbGFncyAmIFBFUkZfWDg2X0VWRU5UX1BFQlNfTERMQVQpCkBAIC04MzAsNDYgKzg4MywzNCBAQAogCQljcHVjLT5wZWJzX2VuYWJsZWQgfD0gMVVMTCA8PCA2MzsKIAogCS8qCi0JICogV2hlbiB0aGUgZXZlbnQgaXMgY29uc3RyYWluZWQgZW5vdWdoIHdlIGNhbiB1c2UgYSBsYXJnZXIKLQkgKiB0aHJlc2hvbGQgYW5kIHJ1biB0aGUgZXZlbnQgd2l0aCBsZXNzIGZyZXF1ZW50IFBNSS4KKwkgKiBVc2UgYXV0by1yZWxvYWQgaWYgcG9zc2libGUgdG8gc2F2ZSBhIE1TUiB3cml0ZSBpbiB0aGUgUE1JLgorCSAqIFRoaXMgbXVzdCBiZSBkb25lIGluIHBtdTo6c3RhcnQoKSwgYmVjYXVzZSBQRVJGX0VWRU5UX0lPQ19QRVJJT0QuCiAJICovCi0JaWYgKGh3Yy0+ZmxhZ3MgJiBQRVJGX1g4Nl9FVkVOVF9GUkVFUlVOTklORykgewotCQl0aHJlc2hvbGQgPSBkcy0+cGVic19hYnNvbHV0ZV9tYXhpbXVtIC0KLQkJCXg4Nl9wbXUubWF4X3BlYnNfZXZlbnRzICogeDg2X3BtdS5wZWJzX3JlY29yZF9zaXplOwotCi0JCWlmIChmaXJzdF9wZWJzKQotCQkJcGVyZl9zY2hlZF9jYl9pbmMoZXZlbnQtPmN0eC0+cG11KTsKLQl9IGVsc2UgewotCQl0aHJlc2hvbGQgPSBkcy0+cGVic19idWZmZXJfYmFzZSArIHg4Nl9wbXUucGVic19yZWNvcmRfc2l6ZTsKLQotCQkvKgotCQkgKiBJZiBub3QgYWxsIGV2ZW50cyBjYW4gdXNlIGxhcmdlciBidWZmZXIsCi0JCSAqIHJvbGwgYmFjayB0byB0aHJlc2hvbGQgPSAxCi0JCSAqLwotCQlpZiAoIWZpcnN0X3BlYnMgJiYKLQkJICAgIChkcy0+cGVic19pbnRlcnJ1cHRfdGhyZXNob2xkID4gdGhyZXNob2xkKSkKLQkJCXBlcmZfc2NoZWRfY2JfZGVjKGV2ZW50LT5jdHgtPnBtdSk7Ci0JfQotCi0JLyogVXNlIGF1dG8tcmVsb2FkIGlmIHBvc3NpYmxlIHRvIHNhdmUgYSBNU1Igd3JpdGUgaW4gdGhlIFBNSSAqLwogCWlmIChod2MtPmZsYWdzICYgUEVSRl9YODZfRVZFTlRfQVVUT19SRUxPQUQpIHsKIAkJZHMtPnBlYnNfZXZlbnRfcmVzZXRbaHdjLT5pZHhdID0KIAkJCSh1NjQpKC1od2MtPnNhbXBsZV9wZXJpb2QpICYgeDg2X3BtdS5jbnR2YWxfbWFzazsKIAl9Cit9CiAKLQlpZiAoZmlyc3RfcGVicyB8fCBkcy0+cGVic19pbnRlcnJ1cHRfdGhyZXNob2xkID4gdGhyZXNob2xkKQotCQlkcy0+cGVic19pbnRlcnJ1cHRfdGhyZXNob2xkID0gdGhyZXNob2xkOwordm9pZCBpbnRlbF9wbXVfcGVic19kZWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwlib29sIG5lZWRlZF9jYiA9IHBlYnNfbmVlZHNfc2NoZWRfY2IoY3B1Yyk7CisKKwljcHVjLT5uX3BlYnMtLTsKKwlpZiAoaHdjLT5mbGFncyAmIFBFUkZfWDg2X0VWRU5UX0ZSRUVSVU5OSU5HKQorCQljcHVjLT5uX2xhcmdlX3BlYnMtLTsKKworCXBlYnNfdXBkYXRlX3N0YXRlKG5lZWRlZF9jYiwgY3B1YywgZXZlbnQtPmN0eC0+cG11KTsKIH0KIAogdm9pZCBpbnRlbF9wbXVfcGVic19kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9IHRoaXNfY3B1X3B0cigmY3B1X2h3X2V2ZW50cyk7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7Ci0Jc3RydWN0IGRlYnVnX3N0b3JlICpkcyA9IGNwdWMtPmRzOwotCWJvb2wgbGFyZ2VfcGVicyA9IGRzLT5wZWJzX2ludGVycnVwdF90aHJlc2hvbGQgPgotCQlkcy0+cGVic19idWZmZXJfYmFzZSArIHg4Nl9wbXUucGVic19yZWNvcmRfc2l6ZTsKIAotCWlmIChsYXJnZV9wZWJzKQorCWlmIChjcHVjLT5uX3BlYnMgPT0gY3B1Yy0+bl9sYXJnZV9wZWJzKQogCQlpbnRlbF9wbXVfZHJhaW5fcGVic19idWZmZXIoKTsKIAogCWNwdWMtPnBlYnNfZW5hYmxlZCAmPSB+KDFVTEwgPDwgaHdjLT5pZHgpOwpAQCAtODc5LDkgKzkyMCw2IEBACiAJZWxzZSBpZiAoZXZlbnQtPmh3LmZsYWdzICYgUEVSRl9YODZfRVZFTlRfUEVCU19TVCkKIAkJY3B1Yy0+cGVic19lbmFibGVkICY9IH4oMVVMTCA8PCA2Myk7CiAKLQlpZiAobGFyZ2VfcGVicyAmJiAhcGVic19pc19lbmFibGVkKGNwdWMpKQotCQlwZXJmX3NjaGVkX2NiX2RlYyhldmVudC0+Y3R4LT5wbXUpOwotCiAJaWYgKGNwdWMtPmVuYWJsZWQpCiAJCXdybXNybChNU1JfSUEzMl9QRUJTX0VOQUJMRSwgY3B1Yy0+cGVic19lbmFibGVkKTsKIApAQCAtMTI3NCwxOCArMTMxMiwxOCBAQAogCQlzdHJ1Y3QgcGVic19yZWNvcmRfbmhtICpwID0gYXQ7CiAJCXU2NCBwZWJzX3N0YXR1czsKIAotCQkvKiBQRUJTIHYzIGhhcyBhY2N1cmF0ZSBzdGF0dXMgYml0cyAqLworCQlwZWJzX3N0YXR1cyA9IHAtPnN0YXR1cyAmIGNwdWMtPnBlYnNfZW5hYmxlZDsKKwkJcGVic19zdGF0dXMgJj0gKDFVTEwgPDwgeDg2X3BtdS5tYXhfcGVic19ldmVudHMpIC0gMTsKKworCQkvKiBQRUJTIHYzIGhhcyBtb3JlIGFjY3VyYXRlIHN0YXR1cyBiaXRzICovCiAJCWlmICh4ODZfcG11LmludGVsX2NhcC5wZWJzX2Zvcm1hdCA+PSAzKSB7Ci0JCQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgKHVuc2lnbmVkIGxvbmcgKikmcC0+c3RhdHVzLAotCQkJCQkgTUFYX1BFQlNfRVZFTlRTKQorCQkJZm9yX2VhY2hfc2V0X2JpdChiaXQsICh1bnNpZ25lZCBsb25nICopJnBlYnNfc3RhdHVzLAorCQkJCQkgeDg2X3BtdS5tYXhfcGVic19ldmVudHMpCiAJCQkJY291bnRzW2JpdF0rKzsKIAogCQkJY29udGludWU7CiAJCX0KIAotCQlwZWJzX3N0YXR1cyA9IHAtPnN0YXR1cyAmIGNwdWMtPnBlYnNfZW5hYmxlZDsKLQkJcGVic19zdGF0dXMgJj0gKDFVTEwgPDwgeDg2X3BtdS5tYXhfcGVic19ldmVudHMpIC0gMTsKLQogCQkvKgogCQkgKiBPbiBzb21lIENQVXMgdGhlIFBFQlMgc3RhdHVzIGNhbiBiZSB6ZXJvIHdoZW4gUEVCUyBpcwogCQkgKiByYWNpbmcgd2l0aCBjbGVhcmluZyBvZiBHTE9CQUxfU1RBVFVTLgpAQCAtMTMzMyw4ICsxMzcxLDExIEBACiAJCQljb250aW51ZTsKIAogCQlldmVudCA9IGNwdWMtPmV2ZW50c1tiaXRdOwotCQlXQVJOX09OX09OQ0UoIWV2ZW50KTsKLQkJV0FSTl9PTl9PTkNFKCFldmVudC0+YXR0ci5wcmVjaXNlX2lwKTsKKwkJaWYgKFdBUk5fT05fT05DRSghZXZlbnQpKQorCQkJY29udGludWU7CisKKwkJaWYgKFdBUk5fT05fT05DRSghZXZlbnQtPmF0dHIucHJlY2lzZV9pcCkpCisJCQljb250aW51ZTsKIAogCQkvKiBsb2cgZHJvcHBlZCBzYW1wbGVzIG51bWJlciAqLwogCQlpZiAoZXJyb3JbYml0XSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9sYnIuYyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9sYnIuYwppbmRleCA3MDdkMzU4Li5mYzZjZjIxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvbGJyLmMKKysrIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL2xici5jCkBAIC0zODAsNyArMzgwLDYgQEAKIAogdm9pZCBpbnRlbF9wbXVfbGJyX3NjaGVkX3Rhc2soc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4LCBib29sIHNjaGVkX2luKQogewotCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKIAlzdHJ1Y3QgeDg2X3BlcmZfdGFza19jb250ZXh0ICp0YXNrX2N0eDsKIAogCS8qCkBAIC0zOTAsMzEgKzM4OSwyMSBAQAogCSAqLwogCXRhc2tfY3R4ID0gY3R4ID8gY3R4LT50YXNrX2N0eF9kYXRhIDogTlVMTDsKIAlpZiAodGFza19jdHgpIHsKLQkJaWYgKHNjaGVkX2luKSB7CisJCWlmIChzY2hlZF9pbikKIAkJCV9faW50ZWxfcG11X2xicl9yZXN0b3JlKHRhc2tfY3R4KTsKLQkJCWNwdWMtPmxicl9jb250ZXh0ID0gY3R4OwotCQl9IGVsc2UgeworCQllbHNlCiAJCQlfX2ludGVsX3BtdV9sYnJfc2F2ZSh0YXNrX2N0eCk7Ci0JCX0KIAkJcmV0dXJuOwogCX0KIAogCS8qCi0JICogV2hlbiBzYW1wbGluZyB0aGUgYnJhbmNrIHN0YWNrIGluIHN5c3RlbS13aWRlLCBpdCBtYXkgYmUKLQkgKiBuZWNlc3NhcnkgdG8gZmx1c2ggdGhlIHN0YWNrIG9uIGNvbnRleHQgc3dpdGNoLiBUaGlzIGhhcHBlbnMKLQkgKiB3aGVuIHRoZSBicmFuY2ggc3RhY2sgZG9lcyBub3QgdGFnIGl0cyBlbnRyaWVzIHdpdGggdGhlIHBpZAotCSAqIG9mIHRoZSBjdXJyZW50IHRhc2suIE90aGVyd2lzZSBpdCBiZWNvbWVzIGltcG9zc2libGUgdG8KLQkgKiBhc3NvY2lhdGUgYSBicmFuY2ggZW50cnkgd2l0aCBhIHRhc2suIFRoaXMgYW1iaWd1aXR5IGlzIG1vcmUKLQkgKiBsaWtlbHkgdG8gYXBwZWFyIHdoZW4gdGhlIGJyYW5jaCBzdGFjayBzdXBwb3J0cyBwcml2IGxldmVsCi0JICogZmlsdGVyaW5nIGFuZCB0aGUgdXNlciBzZXRzIGl0IHRvIG1vbml0b3Igb25seSBhdCB0aGUgdXNlcgotCSAqIGxldmVsICh3aGljaCBjb3VsZCBiZSBhIHVzZWZ1bCBtZWFzdXJlbWVudCBpbiBzeXN0ZW0td2lkZQotCSAqIG1vZGUpLiBJbiB0aGF0IGNhc2UsIHRoZSByaXNrIGlzIGhpZ2ggb2YgaGF2aW5nIGEgYnJhbmNoCi0JICogc3RhY2sgd2l0aCBicmFuY2ggZnJvbSBtdWx0aXBsZSB0YXNrcy4KLSAJICovCi0JaWYgKHNjaGVkX2luKSB7CisJICogU2luY2UgYSBjb250ZXh0IHN3aXRjaCBjYW4gZmxpcCB0aGUgYWRkcmVzcyBzcGFjZSBhbmQgTEJSIGVudHJpZXMKKwkgKiBhcmUgbm90IHRhZ2dlZCB3aXRoIGFuIGlkZW50aWZpZXIsIHdlIG5lZWQgdG8gd2lwZSB0aGUgTEJSLCBldmVuIGZvcgorCSAqIHBlci1jcHUgZXZlbnRzLiBZb3Ugc2ltcGx5IGNhbm5vdCByZXNvbHZlIHRoZSBicmFuY2hlcyBmcm9tIHRoZSBvbGQKKwkgKiBhZGRyZXNzIHNwYWNlLgorCSAqLworCWlmIChzY2hlZF9pbikKIAkJaW50ZWxfcG11X2xicl9yZXNldCgpOwotCQljcHVjLT5sYnJfY29udGV4dCA9IGN0eDsKLQl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBicmFuY2hfdXNlcl9jYWxsc3RhY2sodW5zaWduZWQgYnJfc2VsKQpAQCAtNDIyLDcgKzQxMSw3IEBACiAJcmV0dXJuIChicl9zZWwgJiBYODZfQlJfVVNFUikgJiYgKGJyX3NlbCAmIFg4Nl9CUl9DQUxMX1NUQUNLKTsKIH0KIAotdm9pZCBpbnRlbF9wbXVfbGJyX2VuYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit2b2lkIGludGVsX3BtdV9sYnJfYWRkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9IHRoaXNfY3B1X3B0cigmY3B1X2h3X2V2ZW50cyk7CiAJc3RydWN0IHg4Nl9wZXJmX3Rhc2tfY29udGV4dCAqdGFza19jdHg7CkBAIC00MzAsMjcgKzQxOSwzOCBAQAogCWlmICgheDg2X3BtdS5sYnJfbnIpCiAJCXJldHVybjsKIAotCS8qCi0JICogUmVzZXQgdGhlIExCUiBzdGFjayBpZiB3ZSBjaGFuZ2VkIHRhc2sgY29udGV4dCB0bwotCSAqIGF2b2lkIGRhdGEgbGVha3MuCi0JICovCi0JaWYgKGV2ZW50LT5jdHgtPnRhc2sgJiYgY3B1Yy0+bGJyX2NvbnRleHQgIT0gZXZlbnQtPmN0eCkgewotCQlpbnRlbF9wbXVfbGJyX3Jlc2V0KCk7Ci0JCWNwdWMtPmxicl9jb250ZXh0ID0gZXZlbnQtPmN0eDsKLQl9CiAJY3B1Yy0+YnJfc2VsID0gZXZlbnQtPmh3LmJyYW5jaF9yZWcucmVnOwogCi0JaWYgKGJyYW5jaF91c2VyX2NhbGxzdGFjayhjcHVjLT5icl9zZWwpICYmIGV2ZW50LT5jdHggJiYKLQkJCQkJZXZlbnQtPmN0eC0+dGFza19jdHhfZGF0YSkgeworCWlmIChicmFuY2hfdXNlcl9jYWxsc3RhY2soY3B1Yy0+YnJfc2VsKSAmJiBldmVudC0+Y3R4LT50YXNrX2N0eF9kYXRhKSB7CiAJCXRhc2tfY3R4ID0gZXZlbnQtPmN0eC0+dGFza19jdHhfZGF0YTsKIAkJdGFza19jdHgtPmxicl9jYWxsc3RhY2tfdXNlcnMrKzsKIAl9CiAKLQljcHVjLT5sYnJfdXNlcnMrKzsKKwkvKgorCSAqIFJlcXVlc3QgcG11OjpzY2hlZF90YXNrKCkgY2FsbGJhY2ssIHdoaWNoIHdpbGwgZmlyZSBpbnNpZGUgdGhlCisJICogcmVndWxhciBwZXJmIGV2ZW50IHNjaGVkdWxpbmcsIHNvIHRoYXQgY2FsbCB3aWxsOgorCSAqCisJICogIC0gcmVzdG9yZSBvciB3aXBlOyB3aGVuIExCUi1jYWxsc3RhY2ssCisJICogIC0gd2lwZTsgb3RoZXJ3aXNlLAorCSAqCisJICogd2hlbiB0aGlzIGlzIGZyb20gX19wZXJmX2V2ZW50X3Rhc2tfc2NoZWRfaW4oKS4KKwkgKgorCSAqIEhvd2V2ZXIsIGlmIHRoaXMgaXMgZnJvbSBwZXJmX2luc3RhbGxfaW5fY29udGV4dCgpLCBubyBzdWNoIGNhbGxiYWNrCisJICogd2lsbCBmb2xsb3cgYW5kIHdlJ2xsIG5lZWQgdG8gcmVzZXQgdGhlIExCUiBoZXJlIGlmIHRoaXMgaXMgdGhlCisJICogZmlyc3QgTEJSIGV2ZW50LgorCSAqCisJICogVGhlIHByb2JsZW0gaXMsIHdlIGNhbm5vdCB0ZWxsIHRoZXNlIGNhc2VzIGFwYXJ0Li4uIGJ1dCB3ZSBjYW4KKwkgKiBleGNsdWRlIHRoZSBiaWdnZXN0IGNodW5rIG9mIGNhc2VzIGJ5IGxvb2tpbmcgYXQKKwkgKiBldmVudC0+dG90YWxfdGltZV9ydW5uaW5nLiBBbiBldmVudCB0aGF0IGhhcyBhY2NydWVkIHJ1bnRpbWUgY2Fubm90CisJICogYmUgJ25ldycuIENvbnZlcnNlbHksIGEgbmV3IGV2ZW50IGNhbiBnZXQgaW5zdGFsbGVkIHRocm91Z2ggdGhlCisJICogY29udGV4dCBzd2l0Y2ggcGF0aCBmb3IgdGhlIGZpcnN0IHRpbWUuCisJICovCiAJcGVyZl9zY2hlZF9jYl9pbmMoZXZlbnQtPmN0eC0+cG11KTsKKwlpZiAoIWNwdWMtPmxicl91c2VycysrICYmICFldmVudC0+dG90YWxfdGltZV9ydW5uaW5nKQorCQlpbnRlbF9wbXVfbGJyX3Jlc2V0KCk7CiB9CiAKLXZvaWQgaW50ZWxfcG11X2xicl9kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3ZvaWQgaW50ZWxfcG11X2xicl9kZWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKIAlzdHJ1Y3QgeDg2X3BlcmZfdGFza19jb250ZXh0ICp0YXNrX2N0eDsKQEAgLTQ2NywxMiArNDY3LDYgQEAKIAljcHVjLT5sYnJfdXNlcnMtLTsKIAlXQVJOX09OX09OQ0UoY3B1Yy0+bGJyX3VzZXJzIDwgMCk7CiAJcGVyZl9zY2hlZF9jYl9kZWMoZXZlbnQtPmN0eC0+cG11KTsKLQotCWlmIChjcHVjLT5lbmFibGVkICYmICFjcHVjLT5sYnJfdXNlcnMpIHsKLQkJX19pbnRlbF9wbXVfbGJyX2Rpc2FibGUoKTsKLQkJLyogYXZvaWQgc3RhbGUgcG9pbnRlciAqLwotCQljcHVjLT5sYnJfY29udGV4dCA9IE5VTEw7Ci0JfQogfQogCiB2b2lkIGludGVsX3BtdV9sYnJfZW5hYmxlX2FsbChib29sIHBtaSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9wdC5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3B0LmMKaW5kZXggMDRiYjVmYi4uYzUwNDdiOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3B0LmMKKysrIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3B0LmMKQEAgLTY5LDYgKzY5LDggQEAKIAlQVF9DQVAocHNiX2N5YywJCQkwLCBDUl9FQlgsIEJJVCgxKSksCiAJUFRfQ0FQKGlwX2ZpbHRlcmluZywJCTAsIENSX0VCWCwgQklUKDIpKSwKIAlQVF9DQVAobXRjLAkJCTAsIENSX0VCWCwgQklUKDMpKSwKKwlQVF9DQVAocHR3cml0ZSwJCQkwLCBDUl9FQlgsIEJJVCg0KSksCisJUFRfQ0FQKHBvd2VyX2V2ZW50X3RyYWNlLAkwLCBDUl9FQlgsIEJJVCg1KSksCiAJUFRfQ0FQKHRvcGFfb3V0cHV0LAkJMCwgQ1JfRUNYLCBCSVQoMCkpLAogCVBUX0NBUCh0b3BhX211bHRpcGxlX2VudHJpZXMsCTAsIENSX0VDWCwgQklUKDEpKSwKIAlQVF9DQVAoc2luZ2xlX3JhbmdlX291dHB1dCwJMCwgQ1JfRUNYLCBCSVQoMikpLApAQCAtMjU5LDEwICsyNjEsMTYgQEAKICNkZWZpbmUgUlRJVF9DVExfTVRDCShSVElUX0NUTF9NVENfRU4JfCBcCiAJCQkgUlRJVF9DVExfTVRDX1JBTkdFKQogCisjZGVmaW5lIFJUSVRfQ1RMX1BUVwkoUlRJVF9DVExfUFRXX0VOCXwgXAorCQkJIFJUSVRfQ1RMX0ZVUF9PTl9QVFcpCisKICNkZWZpbmUgUFRfQ09ORklHX01BU0sgKFJUSVRfQ1RMX1RTQ19FTgkJfCBcCiAJCQlSVElUX0NUTF9ESVNSRVRDCXwgXAogCQkJUlRJVF9DVExfQ1lDX1BTQgl8IFwKLQkJCVJUSVRfQ1RMX01UQykKKwkJCVJUSVRfQ1RMX01UQwkJfCBcCisJCQlSVElUX0NUTF9QV1JfRVZUX0VOCXwgXAorCQkJUlRJVF9DVExfRlVQX09OX1BUVwl8IFwKKwkJCVJUSVRfQ1RMX1BUV19FTikKIAogc3RhdGljIGJvb2wgcHRfZXZlbnRfdmFsaWQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewpAQCAtMzExLDYgKzMxOSwyMCBAQAogCQkJcmV0dXJuIGZhbHNlOwogCX0KIAorCWlmIChjb25maWcgJiBSVElUX0NUTF9QV1JfRVZUX0VOICYmCisJICAgICFwdF9jYXBfZ2V0KFBUX0NBUF9wb3dlcl9ldmVudF90cmFjZSkpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChjb25maWcgJiBSVElUX0NUTF9QVFcpIHsKKwkJaWYgKCFwdF9jYXBfZ2V0KFBUX0NBUF9wdHdyaXRlKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQkvKiBGVVBvblBUVyB3aXRob3V0IFBUVyBkb2Vzbid0IG1ha2Ugc2Vuc2UgKi8KKwkJaWYgKChjb25maWcgJiBSVElUX0NUTF9GVVBfT05fUFRXKSAmJgorCQkgICAgIShjb25maWcgJiBSVElUX0NUTF9QVFdfRU4pKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwogCXJldHVybiB0cnVlOwogfQogCkBAIC0xMDc0LDYgKzEwOTYsMTEgQEAKIAlldmVudC0+aHcuYWRkcl9maWx0ZXJzID0gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSBib29sIHZhbGlkX2tlcm5lbF9pcCh1bnNpZ25lZCBsb25nIGlwKQoreworCXJldHVybiB2aXJ0X2FkZHJfdmFsaWQoaXApICYmIGtlcm5lbF9pcChpcCk7Cit9CisKIHN0YXRpYyBpbnQgcHRfZXZlbnRfYWRkcl9maWx0ZXJzX3ZhbGlkYXRlKHN0cnVjdCBsaXN0X2hlYWQgKmZpbHRlcnMpCiB7CiAJc3RydWN0IHBlcmZfYWRkcl9maWx0ZXIgKmZpbHRlcjsKQEAgLTEwODEsMTEgKzExMDgsMTYgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZmlsdGVyLCBmaWx0ZXJzLCBlbnRyeSkgewogCQkvKiBQVCBkb2Vzbid0IHN1cHBvcnQgc2luZ2xlIGFkZHJlc3MgdHJpZ2dlcnMgKi8KLQkJaWYgKCFmaWx0ZXItPnJhbmdlKQorCQlpZiAoIWZpbHRlci0+cmFuZ2UgfHwgIWZpbHRlci0+c2l6ZSkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCQlpZiAoIWZpbHRlci0+aW5vZGUgJiYgIWtlcm5lbF9pcChmaWx0ZXItPm9mZnNldCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFmaWx0ZXItPmlub2RlKSB7CisJCQlpZiAoIXZhbGlkX2tlcm5lbF9pcChmaWx0ZXItPm9mZnNldCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmICghdmFsaWRfa2VybmVsX2lwKGZpbHRlci0+b2Zmc2V0ICsgZmlsdGVyLT5zaXplKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCiAJCWlmICgrK3JhbmdlID4gcHRfY2FwX2dldChQVF9DQVBfbnVtX2FkZHJlc3NfcmFuZ2VzKSkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTExMTEsNyArMTE0Myw3IEBACiAJCX0gZWxzZSB7CiAJCQkvKiBhcHBseSB0aGUgb2Zmc2V0ICovCiAJCQltc3JfYSA9IGZpbHRlci0+b2Zmc2V0ICsgb2Zmc1tyYW5nZV07Ci0JCQltc3JfYiA9IGZpbHRlci0+c2l6ZSArIG1zcl9hOworCQkJbXNyX2IgPSBmaWx0ZXItPnNpemUgKyBtc3JfYSAtIDE7CiAJCX0KIAogCQlmaWx0ZXJzLT5maWx0ZXJbcmFuZ2VdLm1zcl9hICA9IG1zcl9hOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3B0LmggYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcHQuaAppbmRleCBlZmZmYTRhLi41MzQ3M2MyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcHQuaAorKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcHQuaApAQCAtMjYsMTEgKzI2LDE0IEBACiAjZGVmaW5lIFJUSVRfQ1RMX0NZQ0xFQUNDCQlCSVQoMSkKICNkZWZpbmUgUlRJVF9DVExfT1MJCQlCSVQoMikKICNkZWZpbmUgUlRJVF9DVExfVVNSCQkJQklUKDMpCisjZGVmaW5lIFJUSVRfQ1RMX1BXUl9FVlRfRU4JCUJJVCg0KQorI2RlZmluZSBSVElUX0NUTF9GVVBfT05fUFRXCQlCSVQoNSkKICNkZWZpbmUgUlRJVF9DVExfQ1IzRU4JCQlCSVQoNykKICNkZWZpbmUgUlRJVF9DVExfVE9QQQkJCUJJVCg4KQogI2RlZmluZSBSVElUX0NUTF9NVENfRU4JCQlCSVQoOSkKICNkZWZpbmUgUlRJVF9DVExfVFNDX0VOCQkJQklUKDEwKQogI2RlZmluZSBSVElUX0NUTF9ESVNSRVRDCQlCSVQoMTEpCisjZGVmaW5lIFJUSVRfQ1RMX1BUV19FTgkJCUJJVCgxMikKICNkZWZpbmUgUlRJVF9DVExfQlJBTkNIX0VOCQlCSVQoMTMpCiAjZGVmaW5lIFJUSVRfQ1RMX01UQ19SQU5HRV9PRkZTRVQJMTQKICNkZWZpbmUgUlRJVF9DVExfTVRDX1JBTkdFCQkoMHgwZnVsbCA8PCBSVElUX0NUTF9NVENfUkFOR0VfT0ZGU0VUKQpAQCAtOTEsNiArOTQsOCBAQAogCVBUX0NBUF9wc2JfY3ljLAogCVBUX0NBUF9pcF9maWx0ZXJpbmcsCiAJUFRfQ0FQX210YywKKwlQVF9DQVBfcHR3cml0ZSwKKwlQVF9DQVBfcG93ZXJfZXZlbnRfdHJhY2UsCiAJUFRfQ0FQX3RvcGFfb3V0cHV0LAogCVBUX0NBUF90b3BhX211bHRpcGxlX2VudHJpZXMsCiAJUFRfQ0FQX3NpbmdsZV9yYW5nZV9vdXRwdXQsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcmFwbC5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3JhcGwuYwppbmRleCAyODg2NTkzLi5iMGYwZTgzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvcmFwbC5jCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC9yYXBsLmMKQEAgLTM1Nyw2ICszNTcsOCBAQAogCWlmIChldmVudC0+Y3B1IDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlldmVudC0+ZXZlbnRfY2FwcyB8PSBQRVJGX0VWX0NBUF9SRUFEX0FDVElWRV9QS0c7CisKIAkvKgogCSAqIGNoZWNrIGV2ZW50IGlzIGtub3duIChkZXRlcm1pbmVzIGNvdW50ZXIpCiAJICovCkBAIC03NjUsNiArNzY3LDggQEAKIAlYODZfUkFQTF9NT0RFTF9NQVRDSChJTlRFTF9GQU02X1NLWUxBS0VfTU9CSUxFLCAgc2tsX3JhcGxfaW5pdCksCiAJWDg2X1JBUExfTU9ERUxfTUFUQ0goSU5URUxfRkFNNl9TS1lMQUtFX0RFU0tUT1AsIHNrbF9yYXBsX2luaXQpLAogCVg4Nl9SQVBMX01PREVMX01BVENIKElOVEVMX0ZBTTZfU0tZTEFLRV9YLAkgaHN4X3JhcGxfaW5pdCksCisKKwlYODZfUkFQTF9NT0RFTF9NQVRDSChJTlRFTF9GQU02X0FUT01fR09MRE1PTlQsIGhzd19yYXBsX2luaXQpLAogCXt9LAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZS5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZS5jCmluZGV4IDQ2M2RjN2EuLmQ5ODQ0Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmUuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlLmMKQEAgLTY2NCw2ICs2NjQsOCBAQAogCWV2ZW50LT5jcHUgPSBib3gtPmNwdTsKIAlldmVudC0+cG11X3ByaXZhdGUgPSBib3g7CiAKKwlldmVudC0+ZXZlbnRfY2FwcyB8PSBQRVJGX0VWX0NBUF9SRUFEX0FDVElWRV9QS0c7CisKIAlldmVudC0+aHcuaWR4ID0gLTE7CiAJZXZlbnQtPmh3Lmxhc3RfdGFnID0gfjBVTEw7CiAJZXZlbnQtPmh3LmV4dHJhX3JlZy5pZHggPSBFWFRSQV9SRUdfTk9ORTsKQEAgLTY4Myw3ICs2ODUsOCBAQAogCQkvKiBmaXhlZCBjb3VudGVycyBoYXZlIGV2ZW50IGZpZWxkIGhhcmRjb2RlZCB0byB6ZXJvICovCiAJCWh3Yy0+Y29uZmlnID0gMFVMTDsKIAl9IGVsc2UgewotCQlod2MtPmNvbmZpZyA9IGV2ZW50LT5hdHRyLmNvbmZpZyAmIHBtdS0+dHlwZS0+ZXZlbnRfbWFzazsKKwkJaHdjLT5jb25maWcgPSBldmVudC0+YXR0ci5jb25maWcgJgorCQkJICAgICAgKHBtdS0+dHlwZS0+ZXZlbnRfbWFzayB8ICgodTY0KXBtdS0+dHlwZS0+ZXZlbnRfbWFza19leHQgPDwgMzIpKTsKIAkJaWYgKHBtdS0+dHlwZS0+b3BzLT5od19jb25maWcpIHsKIAkJCXJldCA9IHBtdS0+dHlwZS0+b3BzLT5od19jb25maWcoYm94LCBldmVudCk7CiAJCQlpZiAocmV0KQpAQCAtMTMyMSw2ICsxMzI0LDExIEBACiAJLnBjaV9pbml0ID0gc2tsX3VuY29yZV9wY2lfaW5pdCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfdW5jb3JlX2luaXRfZnVuIHNreF91bmNvcmVfaW5pdCBfX2luaXRjb25zdCA9IHsKKwkuY3B1X2luaXQgPSBza3hfdW5jb3JlX2NwdV9pbml0LAorCS5wY2lfaW5pdCA9IHNreF91bmNvcmVfcGNpX2luaXQsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgaW50ZWxfdW5jb3JlX21hdGNoW10gX19pbml0Y29uc3QgPSB7CiAJWDg2X1VOQ09SRV9NT0RFTF9NQVRDSChJTlRFTF9GQU02X05FSEFMRU1fRVAsCSAgbmhtX3VuY29yZV9pbml0KSwKIAlYODZfVU5DT1JFX01PREVMX01BVENIKElOVEVMX0ZBTTZfTkVIQUxFTSwJICBuaG1fdW5jb3JlX2luaXQpLApAQCAtMTM0Myw2ICsxMzUxLDcgQEAKIAlYODZfVU5DT1JFX01PREVMX01BVENIKElOVEVMX0ZBTTZfWEVPTl9QSElfS05MLAkgIGtubF91bmNvcmVfaW5pdCksCiAJWDg2X1VOQ09SRV9NT0RFTF9NQVRDSChJTlRFTF9GQU02X1NLWUxBS0VfREVTS1RPUCxza2xfdW5jb3JlX2luaXQpLAogCVg4Nl9VTkNPUkVfTU9ERUxfTUFUQ0goSU5URUxfRkFNNl9TS1lMQUtFX01PQklMRSwgc2tsX3VuY29yZV9pbml0KSwKKwlYODZfVU5DT1JFX01PREVMX01BVENIKElOVEVMX0ZBTTZfU0tZTEFLRV9YLCAgICAgIHNreF91bmNvcmVfaW5pdCksCiAJe30sCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlLmggYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlLmgKaW5kZXggNzhiOWMyMy4uYWQ5ODZjMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZS5oCisrKyBiL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmUuaApAQCAtNDQsNiArNDQsNyBAQAogCXVuc2lnbmVkIHBlcmZfY3RyOwogCXVuc2lnbmVkIGV2ZW50X2N0bDsKIAl1bnNpZ25lZCBldmVudF9tYXNrOworCXVuc2lnbmVkIGV2ZW50X21hc2tfZXh0OwogCXVuc2lnbmVkIGZpeGVkX2N0cjsKIAl1bnNpZ25lZCBmaXhlZF9jdGw7CiAJdW5zaWduZWQgYm94X2N0bDsKQEAgLTEyMCw2ICsxMjEsNyBAQAogfTsKIAogI2RlZmluZSBVTkNPUkVfQk9YX0ZMQUdfSU5JVElBVEVECTAKKyNkZWZpbmUgVU5DT1JFX0JPWF9GTEFHX0NUTF9PRkZTOAkxIC8qIGV2ZW50IGNvbmZpZyByZWdpc3RlcnMgYXJlIDgtYnl0ZSBhcGFydCAqLwogCiBzdHJ1Y3QgdW5jb3JlX2V2ZW50X2Rlc2MgewogCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBhdHRyOwpAQCAtMTcyLDYgKzE3NCw5IEBACiBzdGF0aWMgaW5saW5lCiB1bnNpZ25lZCB1bmNvcmVfcGNpX2V2ZW50X2N0bChzdHJ1Y3QgaW50ZWxfdW5jb3JlX2JveCAqYm94LCBpbnQgaWR4KQogeworCWlmICh0ZXN0X2JpdChVTkNPUkVfQk9YX0ZMQUdfQ1RMX09GRlM4LCAmYm94LT5mbGFncykpCisJCXJldHVybiBpZHggKiA4ICsgYm94LT5wbXUtPnR5cGUtPmV2ZW50X2N0bDsKKwogCXJldHVybiBpZHggKiA0ICsgYm94LT5wbXUtPnR5cGUtPmV2ZW50X2N0bDsKIH0KIApAQCAtMzc3LDYgKzM4Miw4IEBACiB2b2lkIGJkeF91bmNvcmVfY3B1X2luaXQodm9pZCk7CiBpbnQga25sX3VuY29yZV9wY2lfaW5pdCh2b2lkKTsKIHZvaWQga25sX3VuY29yZV9jcHVfaW5pdCh2b2lkKTsKK2ludCBza3hfdW5jb3JlX3BjaV9pbml0KHZvaWQpOwordm9pZCBza3hfdW5jb3JlX2NwdV9pbml0KHZvaWQpOwogCiAvKiBwZXJmX2V2ZW50X2ludGVsX3VuY29yZV9uaG1leC5jICovCiB2b2lkIG5obWV4X3VuY29yZV9jcHVfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmVfc25iLmMgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlX3NuYi5jCmluZGV4IDlkMzVlYzAuLjVmODQ1ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmVfc25iLmMKKysrIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZV9zbmIuYwpAQCAtMzg4LDYgKzM4OCw4IEBACiAJZXZlbnQtPmNwdSA9IGJveC0+Y3B1OwogCWV2ZW50LT5wbXVfcHJpdmF0ZSA9IGJveDsKIAorCWV2ZW50LT5ldmVudF9jYXBzIHw9IFBFUkZfRVZfQ0FQX1JFQURfQUNUSVZFX1BLRzsKKwogCWV2ZW50LT5ody5pZHggPSAtMTsKIAlldmVudC0+aHcubGFzdF90YWcgPSB+MFVMTDsKIAlldmVudC0+aHcuZXh0cmFfcmVnLmlkeCA9IEVYVFJBX1JFR19OT05FOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZV9zbmJlcC5jIGIvYXJjaC94ODYvZXZlbnRzL2ludGVsL3VuY29yZV9zbmJlcC5jCmluZGV4IDhhZWU4M2IuLjI3MjQyNzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2V2ZW50cy9pbnRlbC91bmNvcmVfc25iZXAuYworKysgYi9hcmNoL3g4Ni9ldmVudHMvaW50ZWwvdW5jb3JlX3NuYmVwLmMKQEAgLTEsNiArMSwxMCBAQAogLyogU2FuZHlCcmlkZ2UtRVAvSXZ5VG93biB1bmNvcmUgc3VwcG9ydCAqLwogI2luY2x1ZGUgInVuY29yZS5oIgogCisvKiBTTkItRVAgcGNpIGJ1cyB0byBzb2NrZXQgbWFwcGluZyAqLworI2RlZmluZSBTTkJFUF9DUFVOT0RFSUQJCQkweDQwCisjZGVmaW5lIFNOQkVQX0dJRE5JRE1BUAkJCTB4NTQKKwogLyogU05CLUVQIEJveCBsZXZlbCBjb250cm9sICovCiAjZGVmaW5lIFNOQkVQX1BNT05fQk9YX0NUTF9SU1RfQ1RSTAkoMSA8PCAwKQogI2RlZmluZSBTTkJFUF9QTU9OX0JPWF9DVExfUlNUX0NUUlMJKDEgPDwgMSkKQEAgLTI2NCwxNSArMjY4LDcyIEBACiAJCQkJIFNOQkVQX1BDVV9NU1JfUE1PTl9DVExfT0NDX0lOVkVSVCB8IFwKIAkJCQkgU05CRVBfUENVX01TUl9QTU9OX0NUTF9PQ0NfRURHRV9ERVQpCiAKKy8qIFNLWCBwY2kgYnVzIHRvIHNvY2tldCBtYXBwaW5nICovCisjZGVmaW5lIFNLWF9DUFVOT0RFSUQJCQkweGMwCisjZGVmaW5lIFNLWF9HSUROSURNQVAJCQkweGQ0CisKKy8qIFNLWCBDSEEgKi8KKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX1RJRAkJKDB4MWZmVUxMIDw8IDApCisjZGVmaW5lIFNLWF9DSEFfTVNSX1BNT05fQk9YX0ZJTFRFUl9MSU5LCSgweGZVTEwgPDwgOSkKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX1NUQVRFCSgweDNmZlVMTCA8PCAxNykKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX1JFTQkJKDB4MVVMTCA8PCAzMikKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX0xPQwkJKDB4MVVMTCA8PCAzMykKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX0FMTF9PUEMJKDB4MVVMTCA8PCAzNSkKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX05NCQkoMHgxVUxMIDw8IDM2KQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfTk9UX05NCSgweDFVTEwgPDwgMzcpCisjZGVmaW5lIFNLWF9DSEFfTVNSX1BNT05fQk9YX0ZJTFRFUl9PUEMwCSgweDNmZlVMTCA8PCA0MSkKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX09QQzEJKDB4M2ZmVUxMIDw8IDUxKQorI2RlZmluZSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfQzYJCSgweDFVTEwgPDwgNjEpCisjZGVmaW5lIFNLWF9DSEFfTVNSX1BNT05fQk9YX0ZJTFRFUl9OQwkJKDB4MVVMTCA8PCA2MikKKyNkZWZpbmUgU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX0lTT0MJKDB4MVVMTCA8PCA2MykKKworLyogU0tYIElJTyAqLworI2RlZmluZSBTS1hfSUlPMF9NU1JfUE1PTl9DVEwwCQkweGE0OAorI2RlZmluZSBTS1hfSUlPMF9NU1JfUE1PTl9DVFIwCQkweGE0MQorI2RlZmluZSBTS1hfSUlPMF9NU1JfUE1PTl9CT1hfQ1RMCTB4YTQwCisjZGVmaW5lIFNLWF9JSU9fTVNSX09GRlNFVAkJMHgyMAorCisjZGVmaW5lIFNLWF9QTU9OX0NUTF9UUkVTSF9NQVNLCQkoMHhmZiA8PCAyNCkKKyNkZWZpbmUgU0tYX1BNT05fQ1RMX1RSRVNIX01BU0tfRVhUCSgweGYpCisjZGVmaW5lIFNLWF9QTU9OX0NUTF9DSF9NQVNLCQkoMHhmZiA8PCA0KQorI2RlZmluZSBTS1hfUE1PTl9DVExfRkNfTUFTSwkJKDB4NyA8PCAxMikKKyNkZWZpbmUgU0tYX0lJT19QTU9OX1JBV19FVkVOVF9NQVNLCShTTkJFUF9QTU9OX0NUTF9FVl9TRUxfTUFTSyB8IFwKKwkJCQkJIFNOQkVQX1BNT05fQ1RMX1VNQVNLX01BU0sgfCBcCisJCQkJCSBTTkJFUF9QTU9OX0NUTF9FREdFX0RFVCB8IFwKKwkJCQkJIFNOQkVQX1BNT05fQ1RMX0lOVkVSVCB8IFwKKwkJCQkJIFNLWF9QTU9OX0NUTF9UUkVTSF9NQVNLKQorI2RlZmluZSBTS1hfSUlPX1BNT05fUkFXX0VWRU5UX01BU0tfRVhUCShTS1hfUE1PTl9DVExfVFJFU0hfTUFTS19FWFQgfCBcCisJCQkJCSBTS1hfUE1PTl9DVExfQ0hfTUFTSyB8IFwKKwkJCQkJIFNLWF9QTU9OX0NUTF9GQ19NQVNLKQorCisvKiBTS1ggSVJQICovCisjZGVmaW5lIFNLWF9JUlAwX01TUl9QTU9OX0NUTDAJCTB4YTViCisjZGVmaW5lIFNLWF9JUlAwX01TUl9QTU9OX0NUUjAJCTB4YTU5CisjZGVmaW5lIFNLWF9JUlAwX01TUl9QTU9OX0JPWF9DVEwJMHhhNTgKKyNkZWZpbmUgU0tYX0lSUF9NU1JfT0ZGU0VUCQkweDIwCisKKy8qIFNLWCBVUEkgKi8KKyNkZWZpbmUgU0tYX1VQSV9QQ0lfUE1PTl9DVEwwCQkweDM1MAorI2RlZmluZSBTS1hfVVBJX1BDSV9QTU9OX0NUUjAJCTB4MzE4CisjZGVmaW5lIFNLWF9VUElfUENJX1BNT05fQk9YX0NUTAkweDM3OAorI2RlZmluZSBTS1hfUE1PTl9DVExfVU1BU0tfRVhUCQkweGZmCisKKy8qIFNLWCBNMk0gKi8KKyNkZWZpbmUgU0tYX00yTV9QQ0lfUE1PTl9DVEwwCQkweDIyOAorI2RlZmluZSBTS1hfTTJNX1BDSV9QTU9OX0NUUjAJCTB4MjAwCisjZGVmaW5lIFNLWF9NMk1fUENJX1BNT05fQk9YX0NUTAkweDI1OAorCiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGV2ZW50LCBldmVudCwgImNvbmZpZzowLTciKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZXZlbnQyLCBldmVudCwgImNvbmZpZzowLTYiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZXZlbnRfZXh0LCBldmVudCwgImNvbmZpZzowLTcsMjEiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIodXNlX29jY19jdHIsIHVzZV9vY2NfY3RyLCAiY29uZmlnOjciKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIodW1hc2ssIHVtYXNrLCAiY29uZmlnOjgtMTUiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIodW1hc2tfZXh0LCB1bWFzaywgImNvbmZpZzo4LTE1LDMyLTM5Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKHFvciwgcW9yLCAiY29uZmlnOjE2Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGVkZ2UsIGVkZ2UsICJjb25maWc6MTgiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIodGlkX2VuLCB0aWRfZW4sICJjb25maWc6MTkiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoaW52LCBpbnYsICJjb25maWc6MjMiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIodGhyZXNoOSwgdGhyZXNoLCAiY29uZmlnOjI0LTM1Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKHRocmVzaDgsIHRocmVzaCwgImNvbmZpZzoyNC0zMSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUih0aHJlc2g2LCB0aHJlc2gsICJjb25maWc6MjQtMjkiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIodGhyZXNoNSwgdGhyZXNoLCAiY29uZmlnOjI0LTI4Iik7CkBAIC0yODAsNiArMzQxLDggQEAKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIob2NjX2ludmVydCwgb2NjX2ludmVydCwgImNvbmZpZzozMCIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihvY2NfZWRnZSwgb2NjX2VkZ2UsICJjb25maWc6MTQtNTEiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIob2NjX2VkZ2VfZGV0LCBvY2NfZWRnZV9kZXQsICJjb25maWc6MzEiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoY2hfbWFzaywgY2hfbWFzaywgImNvbmZpZzozNi00MyIpOworREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmY19tYXNrLCBmY19tYXNrLCAiY29uZmlnOjQ0LTQ2Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl90aWQsIGZpbHRlcl90aWQsICJjb25maWcxOjAtNCIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfdGlkMiwgZmlsdGVyX3RpZCwgImNvbmZpZzE6MCIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfdGlkMywgZmlsdGVyX3RpZCwgImNvbmZpZzE6MC01Iik7CkBAIC0yODgsMTggKzM1MSwyNiBAQAogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbGluaywgZmlsdGVyX2xpbmssICJjb25maWcxOjUtOCIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbGluazIsIGZpbHRlcl9saW5rLCAiY29uZmlnMTo2LTgiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX2xpbmszLCBmaWx0ZXJfbGluaywgImNvbmZpZzE6MTIiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX2xpbms0LCBmaWx0ZXJfbGluaywgImNvbmZpZzE6OS0xMiIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbmlkLCBmaWx0ZXJfbmlkLCAiY29uZmlnMToxMC0xNyIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbmlkMiwgZmlsdGVyX25pZCwgImNvbmZpZzE6MzItNDciKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX3N0YXRlLCBmaWx0ZXJfc3RhdGUsICJjb25maWcxOjE4LTIyIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9zdGF0ZTIsIGZpbHRlcl9zdGF0ZSwgImNvbmZpZzE6MTctMjIiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX3N0YXRlMywgZmlsdGVyX3N0YXRlLCAiY29uZmlnMToxNy0yMyIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfc3RhdGU0LCBmaWx0ZXJfc3RhdGUsICJjb25maWcxOjE4LTIwIik7CitERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9zdGF0ZTUsIGZpbHRlcl9zdGF0ZSwgImNvbmZpZzE6MTctMjYiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX3JlbSwgZmlsdGVyX3JlbSwgImNvbmZpZzE6MzIiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX2xvYywgZmlsdGVyX2xvYywgImNvbmZpZzE6MzMiKTsKK0RFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX25tLCBmaWx0ZXJfbm0sICJjb25maWcxOjM2Iik7CitERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9ub3Rfbm0sIGZpbHRlcl9ub3Rfbm0sICJjb25maWcxOjM3Iik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9sb2NhbCwgZmlsdGVyX2xvY2FsLCAiY29uZmlnMTozMyIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfYWxsX29wLCBmaWx0ZXJfYWxsX29wLCAiY29uZmlnMTozNSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfbm5tLCBmaWx0ZXJfbm5tLCAiY29uZmlnMTozNyIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfb3BjLCBmaWx0ZXJfb3BjLCAiY29uZmlnMToyMy0zMSIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfb3BjMiwgZmlsdGVyX29wYywgImNvbmZpZzE6NTItNjAiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX29wYzMsIGZpbHRlcl9vcGMsICJjb25maWcxOjQxLTYwIik7CitERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9vcGNfMCwgZmlsdGVyX29wYzAsICJjb25maWcxOjQxLTUwIik7CitERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9vcGNfMSwgZmlsdGVyX29wYzEsICJjb25maWcxOjUxLTYwIik7CiBERUZJTkVfVU5DT1JFX0ZPUk1BVF9BVFRSKGZpbHRlcl9uYywgZmlsdGVyX25jLCAiY29uZmlnMTo2MiIpOwogREVGSU5FX1VOQ09SRV9GT1JNQVRfQVRUUihmaWx0ZXJfYzYsIGZpbHRlcl9jNiwgImNvbmZpZzE6NjEiKTsKIERFRklORV9VTkNPUkVfRk9STUFUX0FUVFIoZmlsdGVyX2lzb2MsIGZpbHRlcl9pc29jLCAiY29uZmlnMTo2MyIpOwpAQCAtMTE1Myw3ICsxMjI0LDcgQEAKIC8qCiAgKiBidWlsZCBwY2kgYnVzIHRvIHNvY2tldCBtYXBwaW5nCiAgKi8KLXN0YXRpYyBpbnQgc25iZXBfcGNpMnBoeV9tYXBfaW5pdChpbnQgZGV2aWQpCitzdGF0aWMgaW50IHNuYmVwX3BjaTJwaHlfbWFwX2luaXQoaW50IGRldmlkLCBpbnQgbm9kZWlkX2xvYywgaW50IGlkbWFwX2xvYywgYm9vbCByZXZlcnNlKQogewogCXN0cnVjdCBwY2lfZGV2ICp1Ym94X2RldiA9IE5VTEw7CiAJaW50IGksIGJ1cywgbm9kZWlkLCBzZWdtZW50OwpAQCAtMTE2OCwxMiArMTIzOSwxMiBAQAogCQkJYnJlYWs7CiAJCWJ1cyA9IHVib3hfZGV2LT5idXMtPm51bWJlcjsKIAkJLyogZ2V0IHRoZSBOb2RlIElEIG9mIHRoZSBsb2NhbCByZWdpc3RlciAqLwotCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQodWJveF9kZXYsIDB4NDAsICZjb25maWcpOworCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQodWJveF9kZXYsIG5vZGVpZF9sb2MsICZjb25maWcpOwogCQlpZiAoZXJyKQogCQkJYnJlYWs7CiAJCW5vZGVpZCA9IGNvbmZpZzsKIAkJLyogZ2V0IHRoZSBOb2RlIElEIG1hcHBpbmcgKi8KLQkJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHVib3hfZGV2LCAweDU0LCAmY29uZmlnKTsKKwkJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHVib3hfZGV2LCBpZG1hcF9sb2MsICZjb25maWcpOwogCQlpZiAoZXJyKQogCQkJYnJlYWs7CiAKQEAgLTEyMDcsMTEgKzEyNzgsMjAgQEAKIAkJcmF3X3NwaW5fbG9jaygmcGNpMnBoeV9tYXBfbG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwLCAmcGNpMnBoeV9tYXBfaGVhZCwgbGlzdCkgewogCQkJaSA9IC0xOwotCQkJZm9yIChidXMgPSAyNTU7IGJ1cyA+PSAwOyBidXMtLSkgewotCQkJCWlmIChtYXAtPnBidXNfdG9fcGh5c2lkW2J1c10gPj0gMCkKLQkJCQkJaSA9IG1hcC0+cGJ1c190b19waHlzaWRbYnVzXTsKLQkJCQllbHNlCi0JCQkJCW1hcC0+cGJ1c190b19waHlzaWRbYnVzXSA9IGk7CisJCQlpZiAocmV2ZXJzZSkgeworCQkJCWZvciAoYnVzID0gMjU1OyBidXMgPj0gMDsgYnVzLS0pIHsKKwkJCQkJaWYgKG1hcC0+cGJ1c190b19waHlzaWRbYnVzXSA+PSAwKQorCQkJCQkJaSA9IG1hcC0+cGJ1c190b19waHlzaWRbYnVzXTsKKwkJCQkJZWxzZQorCQkJCQkJbWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdID0gaTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoYnVzID0gMDsgYnVzIDw9IDI1NTsgYnVzKyspIHsKKwkJCQkJaWYgKG1hcC0+cGJ1c190b19waHlzaWRbYnVzXSA+PSAwKQorCQkJCQkJaSA9IG1hcC0+cGJ1c190b19waHlzaWRbYnVzXTsKKwkJCQkJZWxzZQorCQkJCQkJbWFwLT5wYnVzX3RvX3BoeXNpZFtidXNdID0gaTsKKwkJCQl9CiAJCQl9CiAJCX0KIAkJcmF3X3NwaW5fdW5sb2NrKCZwY2kycGh5X21hcF9sb2NrKTsKQEAgLTEyMjQsNyArMTMwNCw3IEBACiAKIGludCBzbmJlcF91bmNvcmVfcGNpX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gc25iZXBfcGNpMnBoeV9tYXBfaW5pdCgweDNjZTApOworCWludCByZXQgPSBzbmJlcF9wY2kycGh5X21hcF9pbml0KDB4M2NlMCwgU05CRVBfQ1BVTk9ERUlELCBTTkJFUF9HSUROSURNQVAsIHRydWUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJdW5jb3JlX3BjaV91bmNvcmVzID0gc25iZXBfcGNpX3VuY29yZXM7CkBAIC0xNzg4LDcgKzE4NjgsNyBAQAogCiBpbnQgaXZiZXBfdW5jb3JlX3BjaV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldCA9IHNuYmVwX3BjaTJwaHlfbWFwX2luaXQoMHgwZTFlKTsKKwlpbnQgcmV0ID0gc25iZXBfcGNpMnBoeV9tYXBfaW5pdCgweDBlMWUsIFNOQkVQX0NQVU5PREVJRCwgU05CRVBfR0lETklETUFQLCB0cnVlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCXVuY29yZV9wY2lfdW5jb3JlcyA9IGl2YmVwX3BjaV91bmNvcmVzOwpAQCAtMjg5Nyw3ICsyOTc3LDcgQEAKIAogaW50IGhzd2VwX3VuY29yZV9wY2lfaW5pdCh2b2lkKQogewotCWludCByZXQgPSBzbmJlcF9wY2kycGh5X21hcF9pbml0KDB4MmYxZSk7CisJaW50IHJldCA9IHNuYmVwX3BjaTJwaHlfbWFwX2luaXQoMHgyZjFlLCBTTkJFUF9DUFVOT0RFSUQsIFNOQkVQX0dJRE5JRE1BUCwgdHJ1ZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAl1bmNvcmVfcGNpX3VuY29yZXMgPSBoc3dlcF9wY2lfdW5jb3JlczsKQEAgLTMxODYsNyArMzI2Niw3IEBACiAKIGludCBiZHhfdW5jb3JlX3BjaV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldCA9IHNuYmVwX3BjaTJwaHlfbWFwX2luaXQoMHg2ZjFlKTsKKwlpbnQgcmV0ID0gc25iZXBfcGNpMnBoeV9tYXBfaW5pdCgweDZmMWUsIFNOQkVQX0NQVU5PREVJRCwgU05CRVBfR0lETklETUFQLCB0cnVlKTsKIAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC0zMTk2LDMgKzMyNzYsNTI1IEBACiB9CiAKIC8qIGVuZCBvZiBCRFggdW5jb3JlIHN1cHBvcnQgKi8KKworLyogU0tYIHVuY29yZSBzdXBwb3J0ICovCisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgc2t4X3VuY29yZV91Ym94ID0geworCS5uYW1lCQkJPSAidWJveCIsCisJLm51bV9jb3VudGVycwkJPSAyLAorCS5udW1fYm94ZXMJCT0gMSwKKwkucGVyZl9jdHJfYml0cwkJPSA0OCwKKwkuZml4ZWRfY3RyX2JpdHMJCT0gNDgsCisJLnBlcmZfY3RyCQk9IEhTV0VQX1VfTVNSX1BNT05fQ1RSMCwKKwkuZXZlbnRfY3RsCQk9IEhTV0VQX1VfTVNSX1BNT05fQ1RMMCwKKwkuZXZlbnRfbWFzawkJPSBTTkJFUF9VX01TUl9QTU9OX1JBV19FVkVOVF9NQVNLLAorCS5maXhlZF9jdHIJCT0gSFNXRVBfVV9NU1JfUE1PTl9VQ0xLX0ZJWEVEX0NUUiwKKwkuZml4ZWRfY3RsCQk9IEhTV0VQX1VfTVNSX1BNT05fVUNMS19GSVhFRF9DVEwsCisJLm9wcwkJCT0gJml2YmVwX3VuY29yZV9tc3Jfb3BzLAorCS5mb3JtYXRfZ3JvdXAJCT0gJml2YmVwX3VuY29yZV91Ym94X2Zvcm1hdF9ncm91cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpza3hfdW5jb3JlX2NoYV9mb3JtYXRzX2F0dHJbXSA9IHsKKwkmZm9ybWF0X2F0dHJfZXZlbnQuYXR0ciwKKwkmZm9ybWF0X2F0dHJfdW1hc2suYXR0ciwKKwkmZm9ybWF0X2F0dHJfZWRnZS5hdHRyLAorCSZmb3JtYXRfYXR0cl90aWRfZW4uYXR0ciwKKwkmZm9ybWF0X2F0dHJfaW52LmF0dHIsCisJJmZvcm1hdF9hdHRyX3RocmVzaDguYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX3RpZDQuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX2xpbms0LmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9zdGF0ZTUuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX3JlbS5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfbG9jLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9ubS5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfYWxsX29wLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9ub3Rfbm0uYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX29wY18wLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9vcGNfMS5hdHRyLAorCSZmb3JtYXRfYXR0cl9maWx0ZXJfbmMuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmlsdGVyX2M2LmF0dHIsCisJJmZvcm1hdF9hdHRyX2ZpbHRlcl9pc29jLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNreF91bmNvcmVfY2hhYm94X2Zvcm1hdF9ncm91cCA9IHsKKwkubmFtZSA9ICJmb3JtYXQiLAorCS5hdHRycyA9IHNreF91bmNvcmVfY2hhX2Zvcm1hdHNfYXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBza3hfdW5jb3JlX2NoYWJveF9jb25zdHJhaW50c1tdID0geworCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4MTEsIDB4MSksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHgzNiwgMHgxKSwKKwlFVkVOVF9DT05TVFJBSU5UX0VORAorfTsKKworc3RhdGljIHN0cnVjdCBleHRyYV9yZWcgc2t4X3VuY29yZV9jaGFfZXh0cmFfcmVnc1tdID0geworCVNOQkVQX0NCT19FVkVOVF9FWFRSQV9SRUcoMHgwMzM0LCAweGZmZmYsIDB4NCksCisJU05CRVBfQ0JPX0VWRU5UX0VYVFJBX1JFRygweDA1MzQsIDB4ZmZmZiwgMHg0KSwKKwlTTkJFUF9DQk9fRVZFTlRfRVhUUkFfUkVHKDB4MDkzNCwgMHhmZmZmLCAweDQpLAorCVNOQkVQX0NCT19FVkVOVF9FWFRSQV9SRUcoMHgxMTM0LCAweGZmZmYsIDB4NCksCisJU05CRVBfQ0JPX0VWRU5UX0VYVFJBX1JFRygweDIxMzQsIDB4ZmZmZiwgMHg0KSwKKwlTTkJFUF9DQk9fRVZFTlRfRVhUUkFfUkVHKDB4ODEzNCwgMHhmZmZmLCAweDQpLAorfTsKKworc3RhdGljIHU2NCBza3hfY2hhX2ZpbHRlcl9tYXNrKGludCBmaWVsZHMpCit7CisJdTY0IG1hc2sgPSAwOworCisJaWYgKGZpZWxkcyAmIDB4MSkKKwkJbWFzayB8PSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfVElEOworCWlmIChmaWVsZHMgJiAweDIpCisJCW1hc2sgfD0gU0tYX0NIQV9NU1JfUE1PTl9CT1hfRklMVEVSX0xJTks7CisJaWYgKGZpZWxkcyAmIDB4NCkKKwkJbWFzayB8PSBTS1hfQ0hBX01TUl9QTU9OX0JPWF9GSUxURVJfU1RBVEU7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqCitza3hfY2hhX2dldF9jb25zdHJhaW50KHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3gsIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlyZXR1cm4gX19zbmJlcF9jYm94X2dldF9jb25zdHJhaW50KGJveCwgZXZlbnQsIHNreF9jaGFfZmlsdGVyX21hc2spOworfQorCitzdGF0aWMgaW50IHNreF9jaGFfaHdfY29uZmlnKHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3gsIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudF9leHRyYSAqcmVnMSA9ICZldmVudC0+aHcuZXh0cmFfcmVnOworCXN0cnVjdCBleHRyYV9yZWcgKmVyOworCWludCBpZHggPSAwOworCisJZm9yIChlciA9IHNreF91bmNvcmVfY2hhX2V4dHJhX3JlZ3M7IGVyLT5tc3I7IGVyKyspIHsKKwkJaWYgKGVyLT5ldmVudCAhPSAoZXZlbnQtPmh3LmNvbmZpZyAmIGVyLT5jb25maWdfbWFzaykpCisJCQljb250aW51ZTsKKwkJaWR4IHw9IGVyLT5pZHg7CisJfQorCisJaWYgKGlkeCkgeworCQlyZWcxLT5yZWcgPSBIU1dFUF9DMF9NU1JfUE1PTl9CT1hfRklMVEVSMCArCisJCQkgICAgSFNXRVBfQ0JPX01TUl9PRkZTRVQgKiBib3gtPnBtdS0+cG11X2lkeDsKKwkJcmVnMS0+Y29uZmlnID0gZXZlbnQtPmF0dHIuY29uZmlnMSAmIHNreF9jaGFfZmlsdGVyX21hc2soaWR4KTsKKwkJcmVnMS0+aWR4ID0gaWR4OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfb3BzIHNreF91bmNvcmVfY2hhYm94X29wcyA9IHsKKwkvKiBUaGVyZSBpcyBubyBmcnpfZW4gZm9yIGNoYWJveCBjdGwgKi8KKwkuaW5pdF9ib3gJCT0gaXZiZXBfdW5jb3JlX21zcl9pbml0X2JveCwKKwkuZGlzYWJsZV9ib3gJCT0gc25iZXBfdW5jb3JlX21zcl9kaXNhYmxlX2JveCwKKwkuZW5hYmxlX2JveAkJPSBzbmJlcF91bmNvcmVfbXNyX2VuYWJsZV9ib3gsCisJLmRpc2FibGVfZXZlbnQJCT0gc25iZXBfdW5jb3JlX21zcl9kaXNhYmxlX2V2ZW50LAorCS5lbmFibGVfZXZlbnQJCT0gaHN3ZXBfY2JveF9lbmFibGVfZXZlbnQsCisJLnJlYWRfY291bnRlcgkJPSB1bmNvcmVfbXNyX3JlYWRfY291bnRlciwKKwkuaHdfY29uZmlnCQk9IHNreF9jaGFfaHdfY29uZmlnLAorCS5nZXRfY29uc3RyYWludAkJPSBza3hfY2hhX2dldF9jb25zdHJhaW50LAorCS5wdXRfY29uc3RyYWludAkJPSBzbmJlcF9jYm94X3B1dF9jb25zdHJhaW50LAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSBza3hfdW5jb3JlX2NoYWJveCA9IHsKKwkubmFtZQkJCT0gImNoYSIsCisJLm51bV9jb3VudGVycwkJPSA0LAorCS5wZXJmX2N0cl9iaXRzCQk9IDQ4LAorCS5ldmVudF9jdGwJCT0gSFNXRVBfQzBfTVNSX1BNT05fQ1RMMCwKKwkucGVyZl9jdHIJCT0gSFNXRVBfQzBfTVNSX1BNT05fQ1RSMCwKKwkuZXZlbnRfbWFzawkJPSBIU1dFUF9TX01TUl9QTU9OX1JBV19FVkVOVF9NQVNLLAorCS5ib3hfY3RsCQk9IEhTV0VQX0MwX01TUl9QTU9OX0JPWF9DVEwsCisJLm1zcl9vZmZzZXQJCT0gSFNXRVBfQ0JPX01TUl9PRkZTRVQsCisJLm51bV9zaGFyZWRfcmVncwk9IDEsCisJLmNvbnN0cmFpbnRzCQk9IHNreF91bmNvcmVfY2hhYm94X2NvbnN0cmFpbnRzLAorCS5vcHMJCQk9ICZza3hfdW5jb3JlX2NoYWJveF9vcHMsCisJLmZvcm1hdF9ncm91cAkJPSAmc2t4X3VuY29yZV9jaGFib3hfZm9ybWF0X2dyb3VwLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNreF91bmNvcmVfaWlvX2Zvcm1hdHNfYXR0cltdID0geworCSZmb3JtYXRfYXR0cl9ldmVudC5hdHRyLAorCSZmb3JtYXRfYXR0cl91bWFzay5hdHRyLAorCSZmb3JtYXRfYXR0cl9lZGdlLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ludi5hdHRyLAorCSZmb3JtYXRfYXR0cl90aHJlc2g5LmF0dHIsCisJJmZvcm1hdF9hdHRyX2NoX21hc2suYXR0ciwKKwkmZm9ybWF0X2F0dHJfZmNfbWFzay5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBza3hfdW5jb3JlX2lpb19mb3JtYXRfZ3JvdXAgPSB7CisJLm5hbWUgPSAiZm9ybWF0IiwKKwkuYXR0cnMgPSBza3hfdW5jb3JlX2lpb19mb3JtYXRzX2F0dHIsCit9OworCitzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgc2t4X3VuY29yZV9paW9fY29uc3RyYWludHNbXSA9IHsKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDgzLCAweDMpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4ODgsIDB4YyksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHg5NSwgMHhjKSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweGMwLCAweGMpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4YzUsIDB4YyksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHhkNCwgMHhjKSwKKwlFVkVOVF9DT05TVFJBSU5UX0VORAorfTsKKworc3RhdGljIHZvaWQgc2t4X2lpb19lbmFibGVfZXZlbnQoc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCwKKwkJCQkgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCisJd3Jtc3JsKGh3Yy0+Y29uZmlnX2Jhc2UsIGh3Yy0+Y29uZmlnIHwgU05CRVBfUE1PTl9DVExfRU4pOworfQorCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV9vcHMgc2t4X3VuY29yZV9paW9fb3BzID0geworCS5pbml0X2JveAkJPSBpdmJlcF91bmNvcmVfbXNyX2luaXRfYm94LAorCS5kaXNhYmxlX2JveAkJPSBzbmJlcF91bmNvcmVfbXNyX2Rpc2FibGVfYm94LAorCS5lbmFibGVfYm94CQk9IHNuYmVwX3VuY29yZV9tc3JfZW5hYmxlX2JveCwKKwkuZGlzYWJsZV9ldmVudAkJPSBzbmJlcF91bmNvcmVfbXNyX2Rpc2FibGVfZXZlbnQsCisJLmVuYWJsZV9ldmVudAkJPSBza3hfaWlvX2VuYWJsZV9ldmVudCwKKwkucmVhZF9jb3VudGVyCQk9IHVuY29yZV9tc3JfcmVhZF9jb3VudGVyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSBza3hfdW5jb3JlX2lpbyA9IHsKKwkubmFtZQkJCT0gImlpbyIsCisJLm51bV9jb3VudGVycwkJPSA0LAorCS5udW1fYm94ZXMJCT0gNSwKKwkucGVyZl9jdHJfYml0cwkJPSA0OCwKKwkuZXZlbnRfY3RsCQk9IFNLWF9JSU8wX01TUl9QTU9OX0NUTDAsCisJLnBlcmZfY3RyCQk9IFNLWF9JSU8wX01TUl9QTU9OX0NUUjAsCisJLmV2ZW50X21hc2sJCT0gU0tYX0lJT19QTU9OX1JBV19FVkVOVF9NQVNLLAorCS5ldmVudF9tYXNrX2V4dAkJPSBTS1hfSUlPX1BNT05fUkFXX0VWRU5UX01BU0tfRVhULAorCS5ib3hfY3RsCQk9IFNLWF9JSU8wX01TUl9QTU9OX0JPWF9DVEwsCisJLm1zcl9vZmZzZXQJCT0gU0tYX0lJT19NU1JfT0ZGU0VULAorCS5jb25zdHJhaW50cwkJPSBza3hfdW5jb3JlX2lpb19jb25zdHJhaW50cywKKwkub3BzCQkJPSAmc2t4X3VuY29yZV9paW9fb3BzLAorCS5mb3JtYXRfZ3JvdXAJCT0gJnNreF91bmNvcmVfaWlvX2Zvcm1hdF9ncm91cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpza3hfdW5jb3JlX2Zvcm1hdHNfYXR0cltdID0geworCSZmb3JtYXRfYXR0cl9ldmVudC5hdHRyLAorCSZmb3JtYXRfYXR0cl91bWFzay5hdHRyLAorCSZmb3JtYXRfYXR0cl9lZGdlLmF0dHIsCisJJmZvcm1hdF9hdHRyX2ludi5hdHRyLAorCSZmb3JtYXRfYXR0cl90aHJlc2g4LmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNreF91bmNvcmVfZm9ybWF0X2dyb3VwID0geworCS5uYW1lID0gImZvcm1hdCIsCisJLmF0dHJzID0gc2t4X3VuY29yZV9mb3JtYXRzX2F0dHIsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNreF91bmNvcmVfaXJwID0geworCS5uYW1lCQkJPSAiaXJwIiwKKwkubnVtX2NvdW50ZXJzCQk9IDIsCisJLm51bV9ib3hlcwkJPSA1LAorCS5wZXJmX2N0cl9iaXRzCQk9IDQ4LAorCS5ldmVudF9jdGwJCT0gU0tYX0lSUDBfTVNSX1BNT05fQ1RMMCwKKwkucGVyZl9jdHIJCT0gU0tYX0lSUDBfTVNSX1BNT05fQ1RSMCwKKwkuZXZlbnRfbWFzawkJPSBTTkJFUF9QTU9OX1JBV19FVkVOVF9NQVNLLAorCS5ib3hfY3RsCQk9IFNLWF9JUlAwX01TUl9QTU9OX0JPWF9DVEwsCisJLm1zcl9vZmZzZXQJCT0gU0tYX0lSUF9NU1JfT0ZGU0VULAorCS5vcHMJCQk9ICZza3hfdW5jb3JlX2lpb19vcHMsCisJLmZvcm1hdF9ncm91cAkJPSAmc2t4X3VuY29yZV9mb3JtYXRfZ3JvdXAsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV9vcHMgc2t4X3VuY29yZV9wY3Vfb3BzID0geworCUlWQkVQX1VOQ09SRV9NU1JfT1BTX0NPTU1PTl9JTklUKCksCisJLmh3X2NvbmZpZwkJPSBoc3dlcF9wY3VfaHdfY29uZmlnLAorCS5nZXRfY29uc3RyYWludAkJPSBzbmJlcF9wY3VfZ2V0X2NvbnN0cmFpbnQsCisJLnB1dF9jb25zdHJhaW50CQk9IHNuYmVwX3BjdV9wdXRfY29uc3RyYWludCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgc2t4X3VuY29yZV9wY3UgPSB7CisJLm5hbWUJCQk9ICJwY3UiLAorCS5udW1fY291bnRlcnMJCT0gNCwKKwkubnVtX2JveGVzCQk9IDEsCisJLnBlcmZfY3RyX2JpdHMJCT0gNDgsCisJLnBlcmZfY3RyCQk9IEhTV0VQX1BDVV9NU1JfUE1PTl9DVFIwLAorCS5ldmVudF9jdGwJCT0gSFNXRVBfUENVX01TUl9QTU9OX0NUTDAsCisJLmV2ZW50X21hc2sJCT0gU05CRVBfUENVX01TUl9QTU9OX1JBV19FVkVOVF9NQVNLLAorCS5ib3hfY3RsCQk9IEhTV0VQX1BDVV9NU1JfUE1PTl9CT1hfQ1RMLAorCS5udW1fc2hhcmVkX3JlZ3MJPSAxLAorCS5vcHMJCQk9ICZza3hfdW5jb3JlX3BjdV9vcHMsCisJLmZvcm1hdF9ncm91cAkJPSAmc25iZXBfdW5jb3JlX3BjdV9mb3JtYXRfZ3JvdXAsCit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlICpza3hfbXNyX3VuY29yZXNbXSA9IHsKKwkmc2t4X3VuY29yZV91Ym94LAorCSZza3hfdW5jb3JlX2NoYWJveCwKKwkmc2t4X3VuY29yZV9paW8sCisJJnNreF91bmNvcmVfaXJwLAorCSZza3hfdW5jb3JlX3BjdSwKKwlOVUxMLAorfTsKKworc3RhdGljIGludCBza3hfY291bnRfY2hhYm94KHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKmNoYWJveF9kZXYgPSBOVUxMOworCWludCBidXMsIGNvdW50ID0gMDsKKworCXdoaWxlICgxKSB7CisJCWNoYWJveF9kZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwOGQsIGNoYWJveF9kZXYpOworCQlpZiAoIWNoYWJveF9kZXYpCisJCQlicmVhazsKKwkJaWYgKGNvdW50ID09IDApCisJCQlidXMgPSBjaGFib3hfZGV2LT5idXMtPm51bWJlcjsKKwkJaWYgKGJ1cyAhPSBjaGFib3hfZGV2LT5idXMtPm51bWJlcikKKwkJCWJyZWFrOworCQljb3VudCsrOworCX0KKworCXBjaV9kZXZfcHV0KGNoYWJveF9kZXYpOworCXJldHVybiBjb3VudDsKK30KKwordm9pZCBza3hfdW5jb3JlX2NwdV9pbml0KHZvaWQpCit7CisJc2t4X3VuY29yZV9jaGFib3gubnVtX2JveGVzID0gc2t4X2NvdW50X2NoYWJveCgpOworCXVuY29yZV9tc3JfdW5jb3JlcyA9IHNreF9tc3JfdW5jb3JlczsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSBza3hfdW5jb3JlX2ltYyA9IHsKKwkubmFtZQkJPSAiaW1jIiwKKwkubnVtX2NvdW50ZXJzICAgPSA0LAorCS5udW1fYm94ZXMJPSA2LAorCS5wZXJmX2N0cl9iaXRzCT0gNDgsCisJLmZpeGVkX2N0cl9iaXRzCT0gNDgsCisJLmZpeGVkX2N0cgk9IFNOQkVQX01DX0NIeV9QQ0lfUE1PTl9GSVhFRF9DVFIsCisJLmZpeGVkX2N0bAk9IFNOQkVQX01DX0NIeV9QQ0lfUE1PTl9GSVhFRF9DVEwsCisJLmV2ZW50X2Rlc2NzCT0gaHN3ZXBfdW5jb3JlX2ltY19ldmVudHMsCisJLnBlcmZfY3RyCT0gU05CRVBfUENJX1BNT05fQ1RSMCwKKwkuZXZlbnRfY3RsCT0gU05CRVBfUENJX1BNT05fQ1RMMCwKKwkuZXZlbnRfbWFzawk9IFNOQkVQX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmJveF9jdGwJPSBTTkJFUF9QQ0lfUE1PTl9CT1hfQ1RMLAorCS5vcHMJCT0gJml2YmVwX3VuY29yZV9wY2lfb3BzLAorCS5mb3JtYXRfZ3JvdXAJPSAmc2t4X3VuY29yZV9mb3JtYXRfZ3JvdXAsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2t4X3VwaV91bmNvcmVfZm9ybWF0c19hdHRyW10gPSB7CisJJmZvcm1hdF9hdHRyX2V2ZW50X2V4dC5hdHRyLAorCSZmb3JtYXRfYXR0cl91bWFza19leHQuYXR0ciwKKwkmZm9ybWF0X2F0dHJfZWRnZS5hdHRyLAorCSZmb3JtYXRfYXR0cl9pbnYuYXR0ciwKKwkmZm9ybWF0X2F0dHJfdGhyZXNoOC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBza3hfdXBpX3VuY29yZV9mb3JtYXRfZ3JvdXAgPSB7CisJLm5hbWUgPSAiZm9ybWF0IiwKKwkuYXR0cnMgPSBza3hfdXBpX3VuY29yZV9mb3JtYXRzX2F0dHIsCit9OworCitzdGF0aWMgdm9pZCBza3hfdXBpX3VuY29yZV9wY2lfaW5pdF9ib3goc3RydWN0IGludGVsX3VuY29yZV9ib3ggKmJveCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGJveC0+cGNpX2RldjsKKworCV9fc2V0X2JpdChVTkNPUkVfQk9YX0ZMQUdfQ1RMX09GRlM4LCAmYm94LT5mbGFncyk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBTS1hfVVBJX1BDSV9QTU9OX0JPWF9DVEwsIElWQkVQX1BNT05fQk9YX0NUTF9JTlQpOworfQorCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV9vcHMgc2t4X3VwaV91bmNvcmVfcGNpX29wcyA9IHsKKwkuaW5pdF9ib3gJPSBza3hfdXBpX3VuY29yZV9wY2lfaW5pdF9ib3gsCisJLmRpc2FibGVfYm94CT0gc25iZXBfdW5jb3JlX3BjaV9kaXNhYmxlX2JveCwKKwkuZW5hYmxlX2JveAk9IHNuYmVwX3VuY29yZV9wY2lfZW5hYmxlX2JveCwKKwkuZGlzYWJsZV9ldmVudAk9IHNuYmVwX3VuY29yZV9wY2lfZGlzYWJsZV9ldmVudCwKKwkuZW5hYmxlX2V2ZW50CT0gc25iZXBfdW5jb3JlX3BjaV9lbmFibGVfZXZlbnQsCisJLnJlYWRfY291bnRlcgk9IHNuYmVwX3VuY29yZV9wY2lfcmVhZF9jb3VudGVyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfdHlwZSBza3hfdW5jb3JlX3VwaSA9IHsKKwkubmFtZQkJPSAidXBpIiwKKwkubnVtX2NvdW50ZXJzICAgPSA0LAorCS5udW1fYm94ZXMJPSAzLAorCS5wZXJmX2N0cl9iaXRzCT0gNDgsCisJLnBlcmZfY3RyCT0gU0tYX1VQSV9QQ0lfUE1PTl9DVFIwLAorCS5ldmVudF9jdGwJPSBTS1hfVVBJX1BDSV9QTU9OX0NUTDAsCisJLmV2ZW50X21hc2sJPSBTTkJFUF9RUElfUENJX1BNT05fUkFXX0VWRU5UX01BU0ssCisJLmV2ZW50X21hc2tfZXh0ID0gU0tYX1BNT05fQ1RMX1VNQVNLX0VYVCwKKwkuYm94X2N0bAk9IFNLWF9VUElfUENJX1BNT05fQk9YX0NUTCwKKwkub3BzCQk9ICZza3hfdXBpX3VuY29yZV9wY2lfb3BzLAorCS5mb3JtYXRfZ3JvdXAJPSAmc2t4X3VwaV91bmNvcmVfZm9ybWF0X2dyb3VwLAorfTsKKworc3RhdGljIHZvaWQgc2t4X20ybV91bmNvcmVfcGNpX2luaXRfYm94KHN0cnVjdCBpbnRlbF91bmNvcmVfYm94ICpib3gpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBib3gtPnBjaV9kZXY7CisKKwlfX3NldF9iaXQoVU5DT1JFX0JPWF9GTEFHX0NUTF9PRkZTOCwgJmJveC0+ZmxhZ3MpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgU0tYX00yTV9QQ0lfUE1PTl9CT1hfQ1RMLCBJVkJFUF9QTU9OX0JPWF9DVExfSU5UKTsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlbF91bmNvcmVfb3BzIHNreF9tMm1fdW5jb3JlX3BjaV9vcHMgPSB7CisJLmluaXRfYm94CT0gc2t4X20ybV91bmNvcmVfcGNpX2luaXRfYm94LAorCS5kaXNhYmxlX2JveAk9IHNuYmVwX3VuY29yZV9wY2lfZGlzYWJsZV9ib3gsCisJLmVuYWJsZV9ib3gJPSBzbmJlcF91bmNvcmVfcGNpX2VuYWJsZV9ib3gsCisJLmRpc2FibGVfZXZlbnQJPSBzbmJlcF91bmNvcmVfcGNpX2Rpc2FibGVfZXZlbnQsCisJLmVuYWJsZV9ldmVudAk9IHNuYmVwX3VuY29yZV9wY2lfZW5hYmxlX2V2ZW50LAorCS5yZWFkX2NvdW50ZXIJPSBzbmJlcF91bmNvcmVfcGNpX3JlYWRfY291bnRlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgc2t4X3VuY29yZV9tMm0gPSB7CisJLm5hbWUJCT0gIm0ybSIsCisJLm51bV9jb3VudGVycyAgID0gNCwKKwkubnVtX2JveGVzCT0gMiwKKwkucGVyZl9jdHJfYml0cwk9IDQ4LAorCS5wZXJmX2N0cgk9IFNLWF9NMk1fUENJX1BNT05fQ1RSMCwKKwkuZXZlbnRfY3RsCT0gU0tYX00yTV9QQ0lfUE1PTl9DVEwwLAorCS5ldmVudF9tYXNrCT0gU05CRVBfUE1PTl9SQVdfRVZFTlRfTUFTSywKKwkuYm94X2N0bAk9IFNLWF9NMk1fUENJX1BNT05fQk9YX0NUTCwKKwkub3BzCQk9ICZza3hfbTJtX3VuY29yZV9wY2lfb3BzLAorCS5mb3JtYXRfZ3JvdXAJPSAmc2t4X3VuY29yZV9mb3JtYXRfZ3JvdXAsCit9OworCitzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgc2t4X3VuY29yZV9tMnBjaWVfY29uc3RyYWludHNbXSA9IHsKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDIzLCAweDMpLAorCUVWRU5UX0NPTlNUUkFJTlRfRU5ECit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNreF91bmNvcmVfbTJwY2llID0geworCS5uYW1lCQk9ICJtMnBjaWUiLAorCS5udW1fY291bnRlcnMgICA9IDQsCisJLm51bV9ib3hlcwk9IDQsCisJLnBlcmZfY3RyX2JpdHMJPSA0OCwKKwkuY29uc3RyYWludHMJPSBza3hfdW5jb3JlX20ycGNpZV9jb25zdHJhaW50cywKKwkucGVyZl9jdHIJPSBTTkJFUF9QQ0lfUE1PTl9DVFIwLAorCS5ldmVudF9jdGwJPSBTTkJFUF9QQ0lfUE1PTl9DVEwwLAorCS5ldmVudF9tYXNrCT0gU05CRVBfUE1PTl9SQVdfRVZFTlRfTUFTSywKKwkuYm94X2N0bAk9IFNOQkVQX1BDSV9QTU9OX0JPWF9DVEwsCisJLm9wcwkJPSAmaXZiZXBfdW5jb3JlX3BjaV9vcHMsCisJLmZvcm1hdF9ncm91cAk9ICZza3hfdW5jb3JlX2Zvcm1hdF9ncm91cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBza3hfdW5jb3JlX20zdXBpX2NvbnN0cmFpbnRzW10gPSB7CisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHgxZCwgMHgxKSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDFlLCAweDEpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4NDAsIDB4NyksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHg0ZSwgMHg3KSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDRmLCAweDcpLAorCVVOQ09SRV9FVkVOVF9DT05TVFJBSU5UKDB4NTAsIDB4NyksCisJVU5DT1JFX0VWRU5UX0NPTlNUUkFJTlQoMHg1MSwgMHg3KSwKKwlVTkNPUkVfRVZFTlRfQ09OU1RSQUlOVCgweDUyLCAweDcpLAorCUVWRU5UX0NPTlNUUkFJTlRfRU5ECit9OworCitzdGF0aWMgc3RydWN0IGludGVsX3VuY29yZV90eXBlIHNreF91bmNvcmVfbTN1cGkgPSB7CisJLm5hbWUJCT0gIm0zdXBpIiwKKwkubnVtX2NvdW50ZXJzICAgPSAzLAorCS5udW1fYm94ZXMJPSAzLAorCS5wZXJmX2N0cl9iaXRzCT0gNDgsCisJLmNvbnN0cmFpbnRzCT0gc2t4X3VuY29yZV9tM3VwaV9jb25zdHJhaW50cywKKwkucGVyZl9jdHIJPSBTTkJFUF9QQ0lfUE1PTl9DVFIwLAorCS5ldmVudF9jdGwJPSBTTkJFUF9QQ0lfUE1PTl9DVEwwLAorCS5ldmVudF9tYXNrCT0gU05CRVBfUE1PTl9SQVdfRVZFTlRfTUFTSywKKwkuYm94X2N0bAk9IFNOQkVQX1BDSV9QTU9OX0JPWF9DVEwsCisJLm9wcwkJPSAmaXZiZXBfdW5jb3JlX3BjaV9vcHMsCisJLmZvcm1hdF9ncm91cAk9ICZza3hfdW5jb3JlX2Zvcm1hdF9ncm91cCwKK307CisKK2VudW0geworCVNLWF9QQ0lfVU5DT1JFX0lNQywKKwlTS1hfUENJX1VOQ09SRV9NMk0sCisJU0tYX1BDSV9VTkNPUkVfVVBJLAorCVNLWF9QQ0lfVU5DT1JFX00yUENJRSwKKwlTS1hfUENJX1VOQ09SRV9NM1VQSSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfdW5jb3JlX3R5cGUgKnNreF9wY2lfdW5jb3Jlc1tdID0geworCVtTS1hfUENJX1VOQ09SRV9JTUNdCT0gJnNreF91bmNvcmVfaW1jLAorCVtTS1hfUENJX1VOQ09SRV9NMk1dCT0gJnNreF91bmNvcmVfbTJtLAorCVtTS1hfUENJX1VOQ09SRV9VUEldCT0gJnNreF91bmNvcmVfdXBpLAorCVtTS1hfUENJX1VOQ09SRV9NMlBDSUVdCT0gJnNreF91bmNvcmVfbTJwY2llLAorCVtTS1hfUENJX1VOQ09SRV9NM1VQSV0JPSAmc2t4X3VuY29yZV9tM3VwaSwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNreF91bmNvcmVfcGNpX2lkc1tdID0geworCXsgLyogTUMwIENoYW5uZWwgMCAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA0MiksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxMCwgMiwgU0tYX1BDSV9VTkNPUkVfSU1DLCAwKSwKKwl9LAorCXsgLyogTUMwIENoYW5uZWwgMSAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA0NiksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxMCwgNiwgU0tYX1BDSV9VTkNPUkVfSU1DLCAxKSwKKwl9LAorCXsgLyogTUMwIENoYW5uZWwgMiAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA0YSksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxMSwgMiwgU0tYX1BDSV9VTkNPUkVfSU1DLCAyKSwKKwl9LAorCXsgLyogTUMxIENoYW5uZWwgMCAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA0MiksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxMiwgMiwgU0tYX1BDSV9VTkNPUkVfSU1DLCAzKSwKKwl9LAorCXsgLyogTUMxIENoYW5uZWwgMSAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA0NiksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxMiwgNiwgU0tYX1BDSV9VTkNPUkVfSU1DLCA0KSwKKwl9LAorCXsgLyogTUMxIENoYW5uZWwgMiAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA0YSksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxMywgMiwgU0tYX1BDSV9VTkNPUkVfSU1DLCA1KSwKKwl9LAorCXsgLyogTTJNMCAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA2NiksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSg4LCAwLCBTS1hfUENJX1VOQ09SRV9NMk0sIDApLAorCX0sCisJeyAvKiBNMk0xICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDY2KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDksIDAsIFNLWF9QQ0lfVU5DT1JFX00yTSwgMSksCisJfSwKKwl7IC8qIFVQSTAgTGluayAwICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDU4KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDE0LCAwLCBTS1hfUENJX1VOQ09SRV9VUEksIDApLAorCX0sCisJeyAvKiBVUEkwIExpbmsgMSAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA1OCksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxNSwgMCwgU0tYX1BDSV9VTkNPUkVfVVBJLCAxKSwKKwl9LAorCXsgLyogVVBJMSBMaW5rIDIgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwNTgpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoMTYsIDAsIFNLWF9QQ0lfVU5DT1JFX1VQSSwgMiksCisJfSwKKwl7IC8qIE0yUENJZSAwICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDg4KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDIxLCAxLCBTS1hfUENJX1VOQ09SRV9NMlBDSUUsIDApLAorCX0sCisJeyAvKiBNMlBDSWUgMSAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA4OCksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgyMiwgMSwgU0tYX1BDSV9VTkNPUkVfTTJQQ0lFLCAxKSwKKwl9LAorCXsgLyogTTJQQ0llIDIgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwODgpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoMjMsIDEsIFNLWF9QQ0lfVU5DT1JFX00yUENJRSwgMiksCisJfSwKKwl7IC8qIE0yUENJZSAzICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDg4KSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDIxLCA1LCBTS1hfUENJX1VOQ09SRV9NMlBDSUUsIDMpLAorCX0sCisJeyAvKiBNM1VQSTAgTGluayAwICovCisJCVBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDRDKSwKKwkJLmRyaXZlcl9kYXRhID0gVU5DT1JFX1BDSV9ERVZfRlVMTF9EQVRBKDE4LCAwLCBTS1hfUENJX1VOQ09SRV9NM1VQSSwgMCksCisJfSwKKwl7IC8qIE0zVVBJMCBMaW5rIDEgKi8KKwkJUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwNEQpLAorCQkuZHJpdmVyX2RhdGEgPSBVTkNPUkVfUENJX0RFVl9GVUxMX0RBVEEoMTgsIDEsIFNLWF9QQ0lfVU5DT1JFX00zVVBJLCAxKSwKKwl9LAorCXsgLyogTTNVUEkxIExpbmsgMiAqLworCQlQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjA0QyksCisJCS5kcml2ZXJfZGF0YSA9IFVOQ09SRV9QQ0lfREVWX0ZVTExfREFUQSgxOCwgNCwgU0tYX1BDSV9VTkNPUkVfTTNVUEksIDIpLAorCX0sCisJeyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfQorfTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc2t4X3VuY29yZV9wY2lfZHJpdmVyID0geworCS5uYW1lCQk9ICJza3hfdW5jb3JlIiwKKwkuaWRfdGFibGUJPSBza3hfdW5jb3JlX3BjaV9pZHMsCit9OworCitpbnQgc2t4X3VuY29yZV9wY2lfaW5pdCh2b2lkKQoreworCS8qIG5lZWQgdG8gZG91YmxlIGNoZWNrIHBjaSBhZGRyZXNzICovCisJaW50IHJldCA9IHNuYmVwX3BjaTJwaHlfbWFwX2luaXQoMHgyMDE0LCBTS1hfQ1BVTk9ERUlELCBTS1hfR0lETklETUFQLCBmYWxzZSk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdW5jb3JlX3BjaV91bmNvcmVzID0gc2t4X3BjaV91bmNvcmVzOworCXVuY29yZV9wY2lfZHJpdmVyID0gJnNreF91bmNvcmVfcGNpX2RyaXZlcjsKKwlyZXR1cm4gMDsKK30KKworLyogZW5kIG9mIFNLWCB1bmNvcmUgc3VwcG9ydCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvZXZlbnRzL3BlcmZfZXZlbnQuaCBiL2FyY2gveDg2L2V2ZW50cy9wZXJmX2V2ZW50LmgKaW5kZXggOGM0YTQ3Ny4uNTg3NGQ4ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvZXZlbnRzL3BlcmZfZXZlbnQuaAorKysgYi9hcmNoL3g4Ni9ldmVudHMvcGVyZl9ldmVudC5oCkBAIC0xOTQsMTIgKzE5NCwxMyBAQAogCSAqLwogCXN0cnVjdCBkZWJ1Z19zdG9yZQkqZHM7CiAJdTY0CQkJcGVic19lbmFibGVkOworCWludAkJCW5fcGViczsKKwlpbnQJCQluX2xhcmdlX3BlYnM7CiAKIAkvKgogCSAqIEludGVsIExCUiBiaXRzCiAJICovCiAJaW50CQkJCWxicl91c2VyczsKLQl2b2lkCQkJCSpsYnJfY29udGV4dDsKIAlzdHJ1Y3QgcGVyZl9icmFuY2hfc3RhY2sJbGJyX3N0YWNrOwogCXN0cnVjdCBwZXJmX2JyYW5jaF9lbnRyeQlsYnJfZW50cmllc1tNQVhfTEJSX0VOVFJJRVNdOwogCXN0cnVjdCBlcl9hY2NvdW50CQkqbGJyX3NlbDsKQEAgLTUwOCw2ICs1MDksOCBAQAogCXZvaWQJCSgqZW5hYmxlX2FsbCkoaW50IGFkZGVkKTsKIAl2b2lkCQkoKmVuYWJsZSkoc3RydWN0IHBlcmZfZXZlbnQgKik7CiAJdm9pZAkJKCpkaXNhYmxlKShzdHJ1Y3QgcGVyZl9ldmVudCAqKTsKKwl2b2lkCQkoKmFkZCkoc3RydWN0IHBlcmZfZXZlbnQgKik7CisJdm9pZAkJKCpkZWwpKHN0cnVjdCBwZXJmX2V2ZW50ICopOwogCWludAkJKCpod19jb25maWcpKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAJaW50CQkoKnNjaGVkdWxlX2V2ZW50cykoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsIGludCBuLCBpbnQgKmFzc2lnbik7CiAJdW5zaWduZWQJZXZlbnRzZWw7CkBAIC04ODgsNiArODkxLDEwIEBACiAKIHN0cnVjdCBldmVudF9jb25zdHJhaW50ICppbnRlbF9wZWJzX2NvbnN0cmFpbnRzKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAKK3ZvaWQgaW50ZWxfcG11X3BlYnNfYWRkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CisKK3ZvaWQgaW50ZWxfcG11X3BlYnNfZGVsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CisKIHZvaWQgaW50ZWxfcG11X3BlYnNfZW5hYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAKIHZvaWQgaW50ZWxfcG11X3BlYnNfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwpAQCAtOTA2LDkgKzkxMyw5IEBACiAKIHZvaWQgaW50ZWxfcG11X2xicl9yZXNldCh2b2lkKTsKIAotdm9pZCBpbnRlbF9wbXVfbGJyX2VuYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwordm9pZCBpbnRlbF9wbXVfbGJyX2FkZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwogCi12b2lkIGludGVsX3BtdV9sYnJfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwordm9pZCBpbnRlbF9wbXVfbGJyX2RlbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwogCiB2b2lkIGludGVsX3BtdV9sYnJfZW5hYmxlX2FsbChib29sIHBtaSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2lhMzIvaWEzMl9zaWduYWwuYyBiL2FyY2gveDg2L2lhMzIvaWEzMl9zaWduYWwuYwppbmRleCAyZjI5ZjRlLi5jYjEzYzA1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pYTMyL2lhMzJfc2lnbmFsLmMKKysrIGIvYXJjaC94ODYvaWEzMi9pYTMyX3NpZ25hbC5jCkBAIC0zNzgsNyArMzc4LDcgQEAKIAkJcHV0X3VzZXJfZXgoKigodTY0ICopJmNvZGUpLCAodTY0IF9fdXNlciAqKWZyYW1lLT5yZXRjb2RlKTsKIAl9IHB1dF91c2VyX2NhdGNoKGVycik7CiAKLQllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIzMigmZnJhbWUtPmluZm8sICZrc2lnLT5pbmZvKTsKKwllcnIgfD0gX19jb3B5X3NpZ2luZm9fdG9fdXNlcjMyKCZmcmFtZS0+aW5mbywgJmtzaWctPmluZm8sIGZhbHNlKTsKIAllcnIgfD0gaWEzMl9zZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+dWMudWNfbWNvbnRleHQsIGZwc3RhdGUsCiAJCQkJICAgICByZWdzLCBzZXQtPnNpZ1swXSk7CiAJZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2V0LCBzaXplb2YoKnNldCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmgKaW5kZXggZTc3YTY0NC4uMWIwMjAzOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oCkBAIC0yMTcsMTAgKzIxNywxNCBAQAogICovCiAjZGVmaW5lIGFsdGVybmF0aXZlX2NhbGxfMihvbGRmdW5jLCBuZXdmdW5jMSwgZmVhdHVyZTEsIG5ld2Z1bmMyLCBmZWF0dXJlMiwgICBcCiAJCQkgICBvdXRwdXQsIGlucHV0Li4uKQkJCQkgICAgICBcCit7CQkJCQkJCQkJICAgICAgXAorCXJlZ2lzdGVyIHZvaWQgKl9fc3AgYXNtKF9BU01fU1ApOwkJCQkgICAgICBcCiAJYXNtIHZvbGF0aWxlIChBTFRFUk5BVElWRV8yKCJjYWxsICVQW29sZF0iLCAiY2FsbCAlUFtuZXcxXSIsIGZlYXR1cmUxLFwKIAkJImNhbGwgJVBbbmV3Ml0iLCBmZWF0dXJlMikJCQkJICAgICAgXAotCQk6IG91dHB1dCA6IFtvbGRdICJpIiAob2xkZnVuYyksIFtuZXcxXSAiaSIgKG5ld2Z1bmMxKSwJICAgICAgXAotCQlbbmV3Ml0gImkiIChuZXdmdW5jMiksICMjIGlucHV0KQorCQk6IG91dHB1dCwgIityIiAoX19zcCkJCQkJCSAgICAgIFwKKwkJOiBbb2xkXSAiaSIgKG9sZGZ1bmMpLCBbbmV3MV0gImkiIChuZXdmdW5jMSksCQkgICAgICBcCisJCSAgW25ldzJdICJpIiAobmV3ZnVuYzIpLCAjIyBpbnB1dCk7CQkJICAgICAgXAorfQogCiAvKgogICogdXNlIHRoaXMgbWFjcm8ocykgaWYgeW91IG5lZWQgbW9yZSB0aGFuIG9uZSBvdXRwdXQgcGFyYW1ldGVyCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmgKaW5kZXggMTI0MzU3Ny4uZjVhYWY2YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaApAQCAtNjUwLDggKzY1MCw4IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcGlfZW50ZXJpbmdfYWNrX2lycSh2b2lkKQogewotCWFja19BUElDX2lycSgpOwogCWlycV9lbnRlcigpOworCWFja19BUElDX2lycSgpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZXhpdGluZ19pcnEodm9pZCkKQEAgLTY2MSw5ICs2NjEsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZXhpdGluZ19hY2tfaXJxKHZvaWQpCiB7Ci0JaXJxX2V4aXQoKTsKLQkvKiBBY2sgb25seSBhdCB0aGUgZW5kIHRvIGF2b2lkIHBvdGVudGlhbCByZWVudHJ5ICovCiAJYWNrX0FQSUNfaXJxKCk7CisJaXJxX2V4aXQoKTsKIH0KIAogZXh0ZXJuIHZvaWQgaW9hcGljX3phcF9sb2Nrcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGcuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGcuaAppbmRleCA5NzMzMzYxLi45Nzg0OGNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZy5oCkBAIC0xNTgsNTMgKzE1OCw5IEBACiAgKiB2YWx1ZSBvZiAiKnB0ciIuCiAgKgogICogeGFkZCgpIGlzIGxvY2tlZCB3aGVuIG11bHRpcGxlIENQVXMgYXJlIG9ubGluZQotICogeGFkZF9zeW5jKCkgaXMgYWx3YXlzIGxvY2tlZAotICogeGFkZF9sb2NhbCgpIGlzIG5ldmVyIGxvY2tlZAogICovCiAjZGVmaW5lIF9feGFkZChwdHIsIGluYywgbG9jaykJX194Y2hnX29wKChwdHIpLCAoaW5jKSwgeGFkZCwgbG9jaykKICNkZWZpbmUgeGFkZChwdHIsIGluYykJCV9feGFkZCgocHRyKSwgKGluYyksIExPQ0tfUFJFRklYKQotI2RlZmluZSB4YWRkX3N5bmMocHRyLCBpbmMpCV9feGFkZCgocHRyKSwgKGluYyksICJsb2NrOyAiKQotI2RlZmluZSB4YWRkX2xvY2FsKHB0ciwgaW5jKQlfX3hhZGQoKHB0ciksIChpbmMpLCAiIikKLQotI2RlZmluZSBfX2FkZChwdHIsIGluYywgbG9jaykJCQkJCQlcCi0JKHsJCQkJCQkJCVwKLQkgICAgICAgIF9fdHlwZW9mX18gKCoocHRyKSkgX19yZXQgPSAoaW5jKTsJCQlcCi0JCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJXAotCQljYXNlIF9fWDg2X0NBU0VfQjoJCQkJCVwKLQkJCWFzbSB2b2xhdGlsZSAobG9jayAiYWRkYiAlYjEsICUwXG4iCQlcCi0JCQkJICAgICAgOiAiK20iICgqKHB0cikpIDogInFpIiAoaW5jKQlcCi0JCQkJICAgICAgOiAibWVtb3J5IiwgImNjIik7CQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgX19YODZfQ0FTRV9XOgkJCQkJXAotCQkJYXNtIHZvbGF0aWxlIChsb2NrICJhZGR3ICV3MSwgJTBcbiIJCVwKLQkJCQkgICAgICA6ICIrbSIgKCoocHRyKSkgOiAicmkiIChpbmMpCVwKLQkJCQkgICAgICA6ICJtZW1vcnkiLCAiY2MiKTsJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSBfX1g4Nl9DQVNFX0w6CQkJCQlcCi0JCQlhc20gdm9sYXRpbGUgKGxvY2sgImFkZGwgJTEsICUwXG4iCQlcCi0JCQkJICAgICAgOiAiK20iICgqKHB0cikpIDogInJpIiAoaW5jKQlcCi0JCQkJICAgICAgOiAibWVtb3J5IiwgImNjIik7CQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgX19YODZfQ0FTRV9ROgkJCQkJXAotCQkJYXNtIHZvbGF0aWxlIChsb2NrICJhZGRxICUxLCAlMFxuIgkJXAotCQkJCSAgICAgIDogIittIiAoKihwdHIpKSA6ICJyaSIgKGluYykJXAotCQkJCSAgICAgIDogIm1lbW9yeSIsICJjYyIpOwkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQlkZWZhdWx0OgkJCQkJCVwKLQkJCV9fYWRkX3dyb25nX3NpemUoKTsJCQkJXAotCQl9CQkJCQkJCVwKLQkJX19yZXQ7CQkJCQkJCVwKLQl9KQotCi0vKgotICogYWRkXyooKSBhZGRzICJpbmMiIHRvICIqcHRyIgotICoKLSAqIF9fYWRkKCkgdGFrZXMgYSBsb2NrIHByZWZpeAotICogYWRkX3NtcCgpIGlzIGxvY2tlZCB3aGVuIG11bHRpcGxlIENQVXMgYXJlIG9ubGluZQotICogYWRkX3N5bmMoKSBpcyBhbHdheXMgbG9ja2VkCi0gKi8KLSNkZWZpbmUgYWRkX3NtcChwdHIsIGluYykJX19hZGQoKHB0ciksIChpbmMpLCBMT0NLX1BSRUZJWCkKLSNkZWZpbmUgYWRkX3N5bmMocHRyLCBpbmMpCV9fYWRkKChwdHIpLCAoaW5jKSwgImxvY2s7ICIpCiAKICNkZWZpbmUgX19jbXB4Y2hnX2RvdWJsZShwZngsIHAxLCBwMiwgbzEsIG8yLCBuMSwgbjIpCQkJXAogKHsJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jb21wYXQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NvbXBhdC5oCmluZGV4IGExODgwNjEuLjAzZDI2OWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NvbXBhdC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NvbXBhdC5oCkBAIC0yNzUsMTAgKzI3NSwxMCBAQAogI2lmZGVmIENPTkZJR19YODZfWDMyX0FCSQogdHlwZWRlZiBzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCBjb21wYXRfZWxmX2dyZWdzZXRfdDsKIAotI2RlZmluZSBQUl9SRUdfU0laRShTKSAodGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMikgPyA2OCA6IDIxNikKLSNkZWZpbmUgUFJTVEFUVVNfU0laRShTKSAodGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMikgPyAxNDQgOiAyOTYpCi0jZGVmaW5lIFNFVF9QUl9GUFZBTElEKFMsVikgXAotICBkbyB7ICooaW50ICopICgoKHZvaWQgKikgJigoUyktPnByX3JlZykpICsgUFJfUkVHX1NJWkUoMCkpID0gKFYpOyB9IFwKKy8qIEZ1bGwgcmVnc2V0IC0tIHByc3RhdHVzIG9uIHgzMiwgb3RoZXJ3aXNlIG9uIGlhMzIgKi8KKyNkZWZpbmUgUFJTVEFUVVNfU0laRShTLCBSKSAoUiAhPSBzaXplb2YoUy5wcl9yZWcpID8gMTQ0IDogMjk2KQorI2RlZmluZSBTRVRfUFJfRlBWQUxJRChTLCBWLCBSKSBcCisgIGRvIHsgKihpbnQgKikgKCgodm9pZCAqKSAmKChTKS0+cHJfcmVnKSkgKyBSKSA9IChWKTsgfSBcCiAgIHdoaWxlICgwKQogCiAjZGVmaW5lIENPTVBBVF9VU0VfNjRCSVRfVElNRSBcCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZXMuaAppbmRleCA5MmE4MzA4Li4xMTg4YmM4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmVzLmgKQEAgLTEwNiw3ICsxMDYsNiBAQAogI2RlZmluZSBYODZfRkVBVFVSRV9BUEVSRk1QRVJGCSggMyozMisyOCkgLyogQVBFUkZNUEVSRiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9FQUdFUl9GUFUJKCAzKjMyKzI5KSAvKiAiZWFnZXJmcHUiIE5vbiBsYXp5IEZQVSByZXN0b3JlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX05PTlNUT1BfVFNDX1MzICggMyozMiszMCkgLyogVFNDIGRvZXNuJ3Qgc3RvcCBpbiBTMyBzdGF0ZSAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9NQ0VfUkVDT1ZFUlkgKCAzKjMyKzMxKSAvKiBjcHUgaGFzIHJlY292ZXJhYmxlIG1hY2hpbmUgY2hlY2tzICovCiAKIC8qIEludGVsLWRlZmluZWQgQ1BVIGZlYXR1cmVzLCBDUFVJRCBsZXZlbCAweDAwMDAwMDAxIChlY3gpLCB3b3JkIDQgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NMwkoIDQqMzIrIDApIC8qICJwbmkiIFNTRS0zICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kZXNjLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kZXNjLmgKaW5kZXggNGUxMGQ3My4uMTIwODBkOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZGVzYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Rlc2MuaApAQCAtMzYsNyArMzYsNyBAQAogCiBleHRlcm4gc3RydWN0IGRlc2NfcHRyIGlkdF9kZXNjcjsKIGV4dGVybiBnYXRlX2Rlc2MgaWR0X3RhYmxlW107Ci1leHRlcm4gc3RydWN0IGRlc2NfcHRyIGRlYnVnX2lkdF9kZXNjcjsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGVzY19wdHIgZGVidWdfaWR0X2Rlc2NyOwogZXh0ZXJuIGdhdGVfZGVzYyBkZWJ1Z19pZHRfdGFibGVbXTsKIAogc3RydWN0IGdkdF9wYWdlIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2U4MjAuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2U4MjAuaAppbmRleCAzYWIwNTM3Li40NzZiNTc0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lODIwLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZTgyMC5oCkBAIC0xMCw4ICsxMCw4IEBACiAjaW5jbHVkZSA8dWFwaS9hc20vZTgyMC5oPgogI2lmbmRlZiBfX0FTU0VNQkxZX18KIC8qIHNlZSBjb21tZW50IGluIGFyY2gveDg2L2tlcm5lbC9lODIwLmMgKi8KLWV4dGVybiBzdHJ1Y3QgZTgyMG1hcCBlODIwOwotZXh0ZXJuIHN0cnVjdCBlODIwbWFwIGU4MjBfc2F2ZWQ7CitleHRlcm4gc3RydWN0IGU4MjBtYXAgKmU4MjA7CitleHRlcm4gc3RydWN0IGU4MjBtYXAgKmU4MjBfc2F2ZWQ7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBjaV9tZW1fc3RhcnQ7CiBleHRlcm4gaW50IGU4MjBfYW55X21hcHBlZCh1NjQgc3RhcnQsIHU2NCBlbmQsIHVuc2lnbmVkIHR5cGUpOwpAQCAtNTMsNiArNTMsOCBAQAogZXh0ZXJuIHZvaWQgc2V0dXBfbWVtb3J5X21hcCh2b2lkKTsKIGV4dGVybiBjaGFyICpkZWZhdWx0X21hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKHZvaWQpOwogCitleHRlcm4gdm9pZCBlODIwX3JlYWxsb2NhdGVfdGFibGVzKHZvaWQpOworCiAvKgogICogUmV0dXJucyB0cnVlIGlmZiB0aGUgc3BlY2lmaWVkIHJhbmdlIFtzLGUpIGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIGluc2lkZQogICogdGhlIElTQSByZWdpb24uCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lZmkuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VmaS5oCmluZGV4IGQwYmI3NmQuLjM4OWQ3MDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VmaS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VmaS5oCkBAIC0xMTcsNyArMTE3LDYgQEAKIGV4dGVybiBwZ2RfdCAqIF9faW5pdCBlZmlfY2FsbF9waHlzX3Byb2xvZyh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBlZmlfY2FsbF9waHlzX2VwaWxvZyhwZ2RfdCAqc2F2ZV9wZ2QpOwogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9wcmludF9tZW1tYXAodm9pZCk7Ci1leHRlcm4gdm9pZCBfX2luaXQgZWZpX3VubWFwX21lbW1hcCh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBlZmlfbWVtb3J5X3VjKHU2NCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9tYXBfcmVnaW9uKGVmaV9tZW1vcnlfZGVzY190ICptZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgZWZpX21hcF9yZWdpb25fZml4ZWQoZWZpX21lbW9yeV9kZXNjX3QgKm1kKTsKQEAgLTE5MiwxNCArMTkxLDcgQEAKIHN0cnVjdCBlZmlfY29uZmlnIHsKIAl1NjQgaW1hZ2VfaGFuZGxlOwogCXU2NCB0YWJsZTsKLQl1NjQgYWxsb2NhdGVfcG9vbDsKLQl1NjQgYWxsb2NhdGVfcGFnZXM7Ci0JdTY0IGdldF9tZW1vcnlfbWFwOwotCXU2NCBmcmVlX3Bvb2w7Ci0JdTY0IGZyZWVfcGFnZXM7Ci0JdTY0IGxvY2F0ZV9oYW5kbGU7Ci0JdTY0IGhhbmRsZV9wcm90b2NvbDsKLQl1NjQgZXhpdF9ib290X3NlcnZpY2VzOworCXU2NCBib290X3NlcnZpY2VzOwogCXU2NCB0ZXh0X291dHB1dDsKIAllZmlfc3RhdHVzX3QgKCpjYWxsKSh1bnNpZ25lZCBsb25nLCAuLi4pOwogCWJvb2wgaXM2NDsKQEAgLTIwNywxNCArMTk5LDI3IEBACiAKIF9fcHVyZSBjb25zdCBzdHJ1Y3QgZWZpX2NvbmZpZyAqX19lZmlfZWFybHkodm9pZCk7CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBlZmlfaXNfNjRiaXQodm9pZCkKK3sKKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX1g4Nl82NCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmICghSVNfRU5BQkxFRChDT05GSUdfRUZJX01JWEVEKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gX19lZmlfZWFybHkoKS0+aXM2NDsKK30KKwogI2RlZmluZSBlZmlfY2FsbF9lYXJseShmLCAuLi4pCQkJCQkJXAotCV9fZWZpX2Vhcmx5KCktPmNhbGwoX19lZmlfZWFybHkoKS0+ZiwgX19WQV9BUkdTX18pOworCV9fZWZpX2Vhcmx5KCktPmNhbGwoZWZpX2lzXzY0Yml0KCkgPwkJCQlcCisJCSgoZWZpX2Jvb3Rfc2VydmljZXNfNjRfdCAqKSh1bnNpZ25lZCBsb25nKQkJXAorCQkJX19lZmlfZWFybHkoKS0+Ym9vdF9zZXJ2aWNlcyktPmYgOgkJXAorCQkoKGVmaV9ib290X3NlcnZpY2VzXzMyX3QgKikodW5zaWduZWQgbG9uZykJCVwKKwkJCV9fZWZpX2Vhcmx5KCktPmJvb3Rfc2VydmljZXMpLT5mLCBfX1ZBX0FSR1NfXykKIAogI2RlZmluZSBfX2VmaV9jYWxsX2Vhcmx5KGYsIC4uLikJCQkJCVwKIAlfX2VmaV9lYXJseSgpLT5jYWxsKCh1bnNpZ25lZCBsb25nKWYsIF9fVkFfQVJHU19fKTsKIAotI2RlZmluZSBlZmlfaXNfNjRiaXQoKQkJX19lZmlfZWFybHkoKS0+aXM2NAotCiBleHRlcm4gYm9vbCBlZmlfcmVib290X3JlcXVpcmVkKHZvaWQpOwogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZnB1L3NpZ25hbC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZnB1L3NpZ25hbC5oCmluZGV4IDBlOTcwZDAuLjIwYTFmYmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZwdS9zaWduYWwuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mcHUvc2lnbmFsLmgKQEAgLTE5LDYgKzE5LDEyIEBACiAjIGRlZmluZSBpYTMyX3NldHVwX3J0X2ZyYW1lCV9fc2V0dXBfcnRfZnJhbWUKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0NPTVBBVAoraW50IF9fY29weV9zaWdpbmZvX3RvX3VzZXIzMihjb21wYXRfc2lnaW5mb190IF9fdXNlciAqdG8sCisJCWNvbnN0IHNpZ2luZm9fdCAqZnJvbSwgYm9vbCB4MzJfQUJJKTsKKyNlbmRpZgorCisKIGV4dGVybiB2b2lkIGNvbnZlcnRfZnJvbV9meHNyKHN0cnVjdCB1c2VyX2kzODdfaWEzMl9zdHJ1Y3QgKmVudiwKIAkJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIGV4dGVybiB2b2lkIGNvbnZlcnRfdG9fZnhzcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZwdS94c3RhdGUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZwdS94c3RhdGUuaAppbmRleCBhZTU1YTQzLi5kNDk1N2FjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mcHUveHN0YXRlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZnB1L3hzdGF0ZS5oCkBAIC00NSw3ICs0NSw4IEBACiBleHRlcm4gdTY0IHhmZWF0dXJlc19tYXNrOwogZXh0ZXJuIHU2NCB4c3RhdGVfZnhfc3dfYnl0ZXNbVVNFUl9YU1RBVEVfRlhfU1dfV09SRFNdOwogCi1leHRlcm4gdm9pZCB1cGRhdGVfcmVnc2V0X3hzdGF0ZV9pbmZvKHVuc2lnbmVkIGludCBzaXplLCB1NjQgeHN0YXRlX21hc2spOworZXh0ZXJuIHZvaWQgX19pbml0IHVwZGF0ZV9yZWdzZXRfeHN0YXRlX2luZm8odW5zaWduZWQgaW50IHNpemUsCisJCQkJCSAgICAgdTY0IHhzdGF0ZV9tYXNrKTsKIAogdm9pZCBmcHVfX3hzdGF0ZV9jbGVhcl9hbGxfY3B1X2NhcHModm9pZCk7CiB2b2lkICpnZXRfeHNhdmVfYWRkcihzdHJ1Y3QgeHJlZ3Nfc3RhdGUgKnhzYXZlLCBpbnQgeHN0YXRlKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Z0cmFjZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZnRyYWNlLmgKaW5kZXggYTQ4MjBkNC4uZWNjZDBhYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZnRyYWNlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZnRyYWNlLmgKQEAgLTYsNiArNiw3IEBACiAjIGRlZmluZSBNQ09VTlRfQUREUgkJKCh1bnNpZ25lZCBsb25nKShfX2ZlbnRyeV9fKSkKICNlbHNlCiAjIGRlZmluZSBNQ09VTlRfQUREUgkJKCh1bnNpZ25lZCBsb25nKShtY291bnQpKQorIyBkZWZpbmUgSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUCiAjZW5kaWYKICNkZWZpbmUgTUNPVU5UX0lOU05fU0laRQk1IC8qIHNpemVvZiBtY291bnQgY2FsbCAqLwogCkBAIC0xMyw2ICsxNCw4IEBACiAjZGVmaW5lIEFSQ0hfU1VQUE9SVFNfRlRSQUNFX09QUyAxCiAjZW5kaWYKIAorI2RlZmluZSBIQVZFX0ZVTkNUSU9OX0dSQVBIX1JFVF9BRERSX1BUUgorCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogZXh0ZXJuIHZvaWQgbWNvdW50KHZvaWQpOwogZXh0ZXJuIGF0b21pY190IG1vZGlmeWluZ19mdHJhY2VfY29kZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydmlzb3IuaAppbmRleCAwNTVlYTk5Li42Nzk0MmI2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oCkBAIC00Myw2ICs0Myw5IEBACiAKIAkvKiBYMkFQSUMgZGV0ZWN0aW9uIChydW4gb25jZSBwZXIgYm9vdCkgKi8KIAlib29sCQkoKngyYXBpY19hdmFpbGFibGUpKHZvaWQpOworCisJLyogcGluIGN1cnJlbnQgdmNwdSB0byBzcGVjaWZpZWQgcGh5c2ljYWwgY3B1IChydW4gcmFyZWx5KSAqLworCXZvaWQJCSgqcGluX3ZjcHUpKGludCk7CiB9OwogCiBleHRlcm4gY29uc3Qgc3RydWN0IGh5cGVydmlzb3JfeDg2ICp4ODZfaHlwZXI7CkBAIC01Niw2ICs1OSw3IEBACiBleHRlcm4gdm9pZCBpbml0X2h5cGVydmlzb3Ioc3RydWN0IGNwdWluZm9feDg2ICpjKTsKIGV4dGVybiB2b2lkIGluaXRfaHlwZXJ2aXNvcl9wbGF0Zm9ybSh2b2lkKTsKIGV4dGVybiBib29sIGh5cGVydmlzb3JfeDJhcGljX2F2YWlsYWJsZSh2b2lkKTsKK2V4dGVybiB2b2lkIGh5cGVydmlzb3JfcGluX3ZjcHUoaW50IGNwdSk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGluaXRfaHlwZXJ2aXNvcihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGluaXRfaHlwZXJ2aXNvcl9wbGF0Zm9ybSh2b2lkKSB7IH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsLWZhbWlseS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWwtZmFtaWx5LmgKaW5kZXggNjI3NzE5NC4uOWFlNWFiOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWwtZmFtaWx5LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWwtZmFtaWx5LmgKQEAgLTU2LDggKzU2LDggQEAKICNkZWZpbmUgSU5URUxfRkFNNl9BVE9NX1NJTFZFUk1PTlQxCTB4MzcgLyogQmF5VHJhaWwvQllUIC8gVmFsbGV5dmlldyAqLwogI2RlZmluZSBJTlRFTF9GQU02X0FUT01fU0lMVkVSTU9OVDIJMHg0RCAvKiBBdmF0b24vUmFuZ2VseSAqLwogI2RlZmluZSBJTlRFTF9GQU02X0FUT01fQUlSTU9OVAkJMHg0QyAvKiBDaGVycnlUcmFpbCAvIEJyYXN3ZWxsICovCi0jZGVmaW5lIElOVEVMX0ZBTTZfQVRPTV9NRVJSSUZJRUxEMQkweDRBIC8qIFRhbmdpZXIgKi8KLSNkZWZpbmUgSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQyCTB4NUEgLyogQW5uaWRhbGUgKi8KKyNkZWZpbmUgSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQJMHg0QSAvKiBUYW5naWVyICovCisjZGVmaW5lIElOVEVMX0ZBTTZfQVRPTV9NT09SRUZJRUxECTB4NUEgLyogQW5uaWRhbGUgKi8KICNkZWZpbmUgSU5URUxfRkFNNl9BVE9NX0dPTERNT05UCTB4NUMKICNkZWZpbmUgSU5URUxfRkFNNl9BVE9NX0RFTlZFUlRPTgkweDVGIC8qIEdvbGRtb250IE1pY3Jvc2VydmVyICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsLW1pZC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWwtbWlkLmgKaW5kZXggOWQ2YjA5Ny4uNWI2NzUzZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWwtbWlkLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWwtbWlkLmgKQEAgLTE4LDYgKzE4LDggQEAKIGV4dGVybiBpbnQgaW50ZWxfbWlkX3BjaV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBpbnRlbF9taWRfcGNpX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcGNpX3Bvd2VyX3Qgc3RhdGUpOwogCitleHRlcm4gdm9pZCBpbnRlbF9taWRfcHdyX3Bvd2VyX29mZih2b2lkKTsKKwogI2RlZmluZSBJTlRFTF9NSURfUFdSX0xTU19PRkZTRVQJNAogI2RlZmluZSBJTlRFTF9NSURfUFdSX0xTU19UWVBFCQkoMSA8PCA3KQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9zY3VfaXBjLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9zY3VfaXBjLmgKaW5kZXggOTI1YjYwNS4uNGZiMWQwYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWxfc2N1X2lwYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX3NjdV9pcGMuaApAQCAtMyw2ICszLDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAKKyNkZWZpbmUgSVBDTVNHX0NPTERfT0ZGCQkweDgwCS8qIE9ubHkgZm9yIFRhbmdpZXIgKi8KKwogI2RlZmluZSBJUENNU0dfV0FSTV9SRVNFVAkweEYwCiAjZGVmaW5lIElQQ01TR19DT0xEX1JFU0VUCTB4RjEKICNkZWZpbmUgSVBDTVNHX1NPRlRfUkVTRVQJMHhGMgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va2FzbHIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2thc2xyLmgKaW5kZXggMjY3NGVlMy4uMTA1MmE3OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20va2FzbHIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rYXNsci5oCkBAIC02LDYgKzYsNyBAQAogI2lmZGVmIENPTkZJR19SQU5ET01JWkVfTUVNT1JZCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwYWdlX29mZnNldF9iYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdm1hbGxvY19iYXNlOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdm1lbW1hcF9iYXNlOwogCiB2b2lkIGtlcm5lbF9yYW5kb21pemVfbWVtb3J5KHZvaWQpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2tkZWJ1Zy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va2RlYnVnLmgKaW5kZXggMWVmOWQ1OC4uZDMxODgxMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20va2RlYnVnLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va2RlYnVnLmgKQEAgLTI0LDggKzI0LDYgQEAKIGV4dGVybiB2b2lkIHByaW50a19hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcyk7CiBleHRlcm4gdm9pZCBkaWUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcHRfcmVncyAqLGxvbmcpOwogZXh0ZXJuIGludCBfX211c3RfY2hlY2sgX19kaWUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKLWV4dGVybiB2b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnNwLCB1bnNpZ25lZCBsb25nIGJwKTsKIGV4dGVybiB2b2lkIHNob3dfc3RhY2tfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCBfX3Nob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGFsbCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBvb3BzX2JlZ2luKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggMzNhZTNhNC4uNGIyMGY3MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC01NjgsNiArNTY4LDcgQEAKIAkJc3RydWN0IGt2bV9zdGVhbF90aW1lIHN0ZWFsOwogCX0gc3Q7CiAKKwl1NjQgdHNjX29mZnNldDsKIAl1NjQgbGFzdF9ndWVzdF90c2M7CiAJdTY0IGxhc3RfaG9zdF90c2M7CiAJdTY0IHRzY19vZmZzZXRfYWRqdXN0bWVudDsKQEAgLTcwMSw2ICs3MDIsOCBAQAogCS8qIEh5cGVyLXYgYmFzZWQgZ3Vlc3QgY3Jhc2ggKE5UIGtlcm5lbCBidWdjaGVjaykgcGFyYW1ldGVycyAqLwogCXU2NCBodl9jcmFzaF9wYXJhbVtIVl9YNjRfTVNSX0NSQVNIX1BBUkFNU107CiAJdTY0IGh2X2NyYXNoX2N0bDsKKworCUhWX1JFRkVSRU5DRV9UU0NfUEFHRSB0c2NfcmVmOwogfTsKIAogc3RydWN0IGt2bV9hcmNoIHsKQEAgLTc4MSw1NCArNzg0LDU2IEBACiAJYm9vbCBkaXNhYmxlZF9sYXBpY19mb3VuZDsKIAogCS8qIFN0cnVjdCBtZW1iZXJzIGZvciBBVklDICovCisJdTMyIGF2aWNfdm1faWQ7CiAJdTMyIGxkcl9tb2RlOwogCXN0cnVjdCBwYWdlICphdmljX2xvZ2ljYWxfaWRfdGFibGVfcGFnZTsKIAlzdHJ1Y3QgcGFnZSAqYXZpY19waHlzaWNhbF9pZF90YWJsZV9wYWdlOworCXN0cnVjdCBobGlzdF9ub2RlIGhub2RlOwogCiAJYm9vbCB4MmFwaWNfZm9ybWF0OwogCWJvb2wgeDJhcGljX2Jyb2FkY2FzdF9xdWlya19kaXNhYmxlZDsKIH07CiAKIHN0cnVjdCBrdm1fdm1fc3RhdCB7Ci0JdTMyIG1tdV9zaGFkb3dfemFwcGVkOwotCXUzMiBtbXVfcHRlX3dyaXRlOwotCXUzMiBtbXVfcHRlX3VwZGF0ZWQ7Ci0JdTMyIG1tdV9wZGVfemFwcGVkOwotCXUzMiBtbXVfZmxvb2RlZDsKLQl1MzIgbW11X3JlY3ljbGVkOwotCXUzMiBtbXVfY2FjaGVfbWlzczsKLQl1MzIgbW11X3Vuc3luYzsKLQl1MzIgcmVtb3RlX3RsYl9mbHVzaDsKLQl1MzIgbHBhZ2VzOworCXVsb25nIG1tdV9zaGFkb3dfemFwcGVkOworCXVsb25nIG1tdV9wdGVfd3JpdGU7CisJdWxvbmcgbW11X3B0ZV91cGRhdGVkOworCXVsb25nIG1tdV9wZGVfemFwcGVkOworCXVsb25nIG1tdV9mbG9vZGVkOworCXVsb25nIG1tdV9yZWN5Y2xlZDsKKwl1bG9uZyBtbXVfY2FjaGVfbWlzczsKKwl1bG9uZyBtbXVfdW5zeW5jOworCXVsb25nIHJlbW90ZV90bGJfZmx1c2g7CisJdWxvbmcgbHBhZ2VzOwogfTsKIAogc3RydWN0IGt2bV92Y3B1X3N0YXQgewotCXUzMiBwZl9maXhlZDsKLQl1MzIgcGZfZ3Vlc3Q7Ci0JdTMyIHRsYl9mbHVzaDsKLQl1MzIgaW52bHBnOworCXU2NCBwZl9maXhlZDsKKwl1NjQgcGZfZ3Vlc3Q7CisJdTY0IHRsYl9mbHVzaDsKKwl1NjQgaW52bHBnOwogCi0JdTMyIGV4aXRzOwotCXUzMiBpb19leGl0czsKLQl1MzIgbW1pb19leGl0czsKLQl1MzIgc2lnbmFsX2V4aXRzOwotCXUzMiBpcnFfd2luZG93X2V4aXRzOwotCXUzMiBubWlfd2luZG93X2V4aXRzOwotCXUzMiBoYWx0X2V4aXRzOwotCXUzMiBoYWx0X3N1Y2Nlc3NmdWxfcG9sbDsKLQl1MzIgaGFsdF9hdHRlbXB0ZWRfcG9sbDsKLQl1MzIgaGFsdF9wb2xsX2ludmFsaWQ7Ci0JdTMyIGhhbHRfd2FrZXVwOwotCXUzMiByZXF1ZXN0X2lycV9leGl0czsKLQl1MzIgaXJxX2V4aXRzOwotCXUzMiBob3N0X3N0YXRlX3JlbG9hZDsKLQl1MzIgZWZlcl9yZWxvYWQ7Ci0JdTMyIGZwdV9yZWxvYWQ7Ci0JdTMyIGluc25fZW11bGF0aW9uOwotCXUzMiBpbnNuX2VtdWxhdGlvbl9mYWlsOwotCXUzMiBoeXBlcmNhbGxzOwotCXUzMiBpcnFfaW5qZWN0aW9uczsKLQl1MzIgbm1pX2luamVjdGlvbnM7CisJdTY0IGV4aXRzOworCXU2NCBpb19leGl0czsKKwl1NjQgbW1pb19leGl0czsKKwl1NjQgc2lnbmFsX2V4aXRzOworCXU2NCBpcnFfd2luZG93X2V4aXRzOworCXU2NCBubWlfd2luZG93X2V4aXRzOworCXU2NCBoYWx0X2V4aXRzOworCXU2NCBoYWx0X3N1Y2Nlc3NmdWxfcG9sbDsKKwl1NjQgaGFsdF9hdHRlbXB0ZWRfcG9sbDsKKwl1NjQgaGFsdF9wb2xsX2ludmFsaWQ7CisJdTY0IGhhbHRfd2FrZXVwOworCXU2NCByZXF1ZXN0X2lycV9leGl0czsKKwl1NjQgaXJxX2V4aXRzOworCXU2NCBob3N0X3N0YXRlX3JlbG9hZDsKKwl1NjQgZWZlcl9yZWxvYWQ7CisJdTY0IGZwdV9yZWxvYWQ7CisJdTY0IGluc25fZW11bGF0aW9uOworCXU2NCBpbnNuX2VtdWxhdGlvbl9mYWlsOworCXU2NCBoeXBlcmNhbGxzOworCXU2NCBpcnFfaW5qZWN0aW9uczsKKwl1NjQgbm1pX2luamVjdGlvbnM7CiB9OwogCiBzdHJ1Y3QgeDg2X2luc3RydWN0aW9uX2luZm87CkBAIC05NTEsNyArOTU2LDYgQEAKIAogCWJvb2wgKCpoYXNfd2JpbnZkX2V4aXQpKHZvaWQpOwogCi0JdTY0ICgqcmVhZF90c2Nfb2Zmc2V0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCXZvaWQgKCp3cml0ZV90c2Nfb2Zmc2V0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBvZmZzZXQpOwogCiAJdTY0ICgqcmVhZF9sMV90c2MpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGhvc3RfdHNjKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21jZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmgKaW5kZXggOGJmNzY2ZS4uOWJkN2ZmNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmgKQEAgLTQwLDkgKzQwLDEwIEBACiAjZGVmaW5lIE1DSV9TVEFUVVNfQVIJICgxVUxMPDw1NSkgIC8qIEFjdGlvbiByZXF1aXJlZCAqLwogCiAvKiBBTUQtc3BlY2lmaWMgYml0cyAqLworI2RlZmluZSBNQ0lfU1RBVFVTX1RDQwkJKDFVTEw8PDU1KSAgLyogVGFzayBjb250ZXh0IGNvcnJ1cHQgKi8KKyNkZWZpbmUgTUNJX1NUQVRVU19TWU5EVgkoMVVMTDw8NTMpICAvKiBzeW5kIHJlZy4gdmFsaWQgKi8KICNkZWZpbmUgTUNJX1NUQVRVU19ERUZFUlJFRAkoMVVMTDw8NDQpICAvKiB1bmNvcnJlY3RlZCBlcnJvciwgZGVmZXJyZWQgZXhjZXB0aW9uICovCiAjZGVmaW5lIE1DSV9TVEFUVVNfUE9JU09OCSgxVUxMPDw0MykgIC8qIGFjY2VzcyBwb2lzb25vdXMgZGF0YSAqLwotI2RlZmluZSBNQ0lfU1RBVFVTX1RDQwkJKDFVTEw8PDU1KSAgLyogVGFzayBjb250ZXh0IGNvcnJ1cHQgKi8KIAogLyoKICAqIE1jYVggZmllbGQgaWYgc2V0IGluZGljYXRlcyBhIGdpdmVuIGJhbmsgc3VwcG9ydHMgTUNBIGV4dGVuc2lvbnM6CkBAIC0xMTAsNiArMTExLDcgQEAKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUMwX01JU0MwCTB4YzAwMDIwMDMKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUMwX0NPTkZJRwkweGMwMDAyMDA0CiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DMF9JUElECQkweGMwMDAyMDA1CisjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DMF9TWU5ECQkweGMwMDAyMDA2CiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DMF9ERVNUQVQJMHhjMDAwMjAwOAogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQzBfREVBRERSCTB4YzAwMDIwMDkKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUMwX01JU0MxCTB4YzAwMDIwMGEKQEAgLTExOSw2ICsxMjEsNyBAQAogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQ3hfTUlTQyh4KQkoTVNSX0FNRDY0X1NNQ0FfTUMwX01JU0MwICsgMHgxMCooeCkpCiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DeF9DT05GSUcoeCkJKE1TUl9BTUQ2NF9TTUNBX01DMF9DT05GSUcgKyAweDEwKih4KSkKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUN4X0lQSUQoeCkJKE1TUl9BTUQ2NF9TTUNBX01DMF9JUElEICsgMHgxMCooeCkpCisjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DeF9TWU5EKHgpCShNU1JfQU1ENjRfU01DQV9NQzBfU1lORCArIDB4MTAqKHgpKQogI2RlZmluZSBNU1JfQU1ENjRfU01DQV9NQ3hfREVTVEFUKHgpCShNU1JfQU1ENjRfU01DQV9NQzBfREVTVEFUICsgMHgxMCooeCkpCiAjZGVmaW5lIE1TUl9BTUQ2NF9TTUNBX01DeF9ERUFERFIoeCkJKE1TUl9BTUQ2NF9TTUNBX01DMF9ERUFERFIgKyAweDEwKih4KSkKICNkZWZpbmUgTVNSX0FNRDY0X1NNQ0FfTUN4X01JU0N5KHgsIHkpCSgoTVNSX0FNRDY0X1NNQ0FfTUMwX01JU0MxICsgeSkgKyAoMHgxMCooeCkpKQpAQCAtMzM0LDQ0ICszMzcsNDcgQEAKICAqIFNjYWxhYmxlIE1DQS4KICAqLwogI2lmZGVmIENPTkZJR19YODZfTUNFX0FNRAotZW51bSBhbWRfaXBfdHlwZXMgewotCVNNQ0FfRjE3SF9DT1JFID0gMCwJLyogQ29yZSBlcnJvcnMgKi8KLQlTTUNBX0RGLAkJLyogRGF0YSBGYWJyaWMgKi8KLQlTTUNBX1VNQywJCS8qIFVuaWZpZWQgTWVtb3J5IENvbnRyb2xsZXIgKi8KLQlTTUNBX1BCLAkJLyogUGFyYW1ldGVyIEJsb2NrICovCi0JU01DQV9QU1AsCQkvKiBQbGF0Zm9ybSBTZWN1cml0eSBQcm9jZXNzb3IgKi8KLQlTTUNBX1NNVSwJCS8qIFN5c3RlbSBNYW5hZ2VtZW50IFVuaXQgKi8KLQlOX0FNRF9JUF9UWVBFUwotfTsKIAotc3RydWN0IGFtZF9od2lkIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIGludCBod2lkOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBhbWRfaHdpZCBhbWRfaHdpZHNbTl9BTURfSVBfVFlQRVNdOwotCi1lbnVtIGFtZF9jb3JlX21jYV9ibG9ja3MgeworLyogVGhlc2UgbWF5IGJlIHVzZWQgYnkgbXVsdGlwbGUgc21jYV9od2lkX21jYXR5cGVzICovCitlbnVtIHNtY2FfYmFua190eXBlcyB7CiAJU01DQV9MUyA9IDAsCS8qIExvYWQgU3RvcmUgKi8KIAlTTUNBX0lGLAkvKiBJbnN0cnVjdGlvbiBGZXRjaCAqLwotCVNNQ0FfTDJfQ0FDSEUsCS8qIEwyIGNhY2hlICovCi0JU01DQV9ERSwJLyogRGVjb2RlciB1bml0ICovCi0JUkVTLAkJLyogUmVzZXJ2ZWQgKi8KLQlTTUNBX0VYLAkvKiBFeGVjdXRpb24gdW5pdCAqLworCVNNQ0FfTDJfQ0FDSEUsCS8qIEwyIENhY2hlICovCisJU01DQV9ERSwJLyogRGVjb2RlciBVbml0ICovCisJU01DQV9FWCwJLyogRXhlY3V0aW9uIFVuaXQgKi8KIAlTTUNBX0ZQLAkvKiBGbG9hdGluZyBQb2ludCAqLwotCVNNQ0FfTDNfQ0FDSEUsCS8qIEwzIGNhY2hlICovCi0JTl9DT1JFX01DQV9CTE9DS1MKKwlTTUNBX0wzX0NBQ0hFLAkvKiBMMyBDYWNoZSAqLworCVNNQ0FfQ1MsCS8qIENvaGVyZW50IFNsYXZlICovCisJU01DQV9QSUUsCS8qIFBvd2VyLCBJbnRlcnJ1cHRzLCBldGMuICovCisJU01DQV9VTUMsCS8qIFVuaWZpZWQgTWVtb3J5IENvbnRyb2xsZXIgKi8KKwlTTUNBX1BCLAkvKiBQYXJhbWV0ZXIgQmxvY2sgKi8KKwlTTUNBX1BTUCwJLyogUGxhdGZvcm0gU2VjdXJpdHkgUHJvY2Vzc29yICovCisJU01DQV9TTVUsCS8qIFN5c3RlbSBNYW5hZ2VtZW50IFVuaXQgKi8KKwlOX1NNQ0FfQkFOS19UWVBFUwogfTsKIAotZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBhbWRfY29yZV9tY2FibG9ja19uYW1lc1tOX0NPUkVfTUNBX0JMT0NLU107Ci0KLWVudW0gYW1kX2RmX21jYV9ibG9ja3MgewotCVNNQ0FfQ1MgPSAwLAkvKiBDb2hlcmVudCBTbGF2ZSAqLwotCVNNQ0FfUElFLAkvKiBQb3dlciBtYW5hZ2VtZW50LCBJbnRlcnJ1cHRzLCBldGMgKi8KLQlOX0RGX0JMT0NLUworc3RydWN0IHNtY2FfYmFua19uYW1lIHsKKwljb25zdCBjaGFyICpuYW1lOwkvKiBTaG9ydCBuYW1lIGZvciBzeXNmcyAqLworCWNvbnN0IGNoYXIgKmxvbmdfbmFtZTsJLyogTG9uZyBuYW1lIGZvciBwcmV0dHktcHJpbnRpbmcgKi8KIH07CiAKLWV4dGVybiBjb25zdCBjaGFyICogY29uc3QgYW1kX2RmX21jYWJsb2NrX25hbWVzW05fREZfQkxPQ0tTXTsKK2V4dGVybiBzdHJ1Y3Qgc21jYV9iYW5rX25hbWUgc21jYV9iYW5rX25hbWVzW05fU01DQV9CQU5LX1RZUEVTXTsKKworI2RlZmluZSBIV0lEX01DQVRZUEUoaHdpZCwgbWNhdHlwZSkgKChod2lkIDw8IDE2KSB8IG1jYXR5cGUpCisKK3N0cnVjdCBzbWNhX2h3aWRfbWNhdHlwZSB7CisJdW5zaWduZWQgaW50IGJhbmtfdHlwZTsJLyogVXNlIHdpdGggc21jYV9iYW5rX3R5cGVzIGZvciBlYXN5IGluZGV4aW5nLiAqLworCXUzMiBod2lkX21jYXR5cGU7CS8qIChod2lkLG1jYXR5cGUpIHR1cGxlICovCisJdTMyIHhlY19iaXRtYXA7CQkvKiBCaXRtYXAgb2YgdmFsaWQgRXh0RXJyb3JDb2RlczsgY3VycmVudCBtYXggaXMgMjEuICovCit9OworCitzdHJ1Y3Qgc21jYV9iYW5rX2luZm8geworCXN0cnVjdCBzbWNhX2h3aWRfbWNhdHlwZSAqdHlwZTsKKwl1MzIgdHlwZV9pbnN0YW5jZTsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc21jYV9iYW5rX2luZm8gc21jYV9iYW5rc1tNQVhfTlJfQkFOS1NdOworCiAjZW5kaWYKIAogI2VuZGlmIC8qIF9BU01fWDg2X01DRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcHNwZWMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCmluZGV4IGIwNzIzM2IuLjMyMDA3MDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCkBAIC02LDcgKzYsNiBAQAogI2luY2x1ZGUgPGFzbS94ODZfaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+CiAKLWV4dGVybiBpbnQgYXBpY192ZXJzaW9uW107CiBleHRlcm4gaW50IHBpY19tb2RlOwogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgpAQCAtNDAsNiArMzksNyBAQAogZXh0ZXJuIERFQ0xBUkVfQklUTUFQKG1wX2J1c19ub3RfcGNpLCBNQVhfTVBfQlVTU0VTKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBib290X2NwdV9waHlzaWNhbF9hcGljaWQ7CitleHRlcm4gdTggYm9vdF9jcHVfYXBpY192ZXJzaW9uOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbXBfbGFwaWNfYWRkcjsKIAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwpAQCAtODYsNiArODYsNyBAQAogI2VuZGlmCiAKIGludCBnZW5lcmljX3Byb2Nlc3Nvcl9pbmZvKGludCBhcGljaWQsIGludCB2ZXJzaW9uKTsKK2ludCBfX2dlbmVyaWNfcHJvY2Vzc29yX2luZm8oaW50IGFwaWNpZCwgaW50IHZlcnNpb24sIGJvb2wgZW5hYmxlZCk7CiAKICNkZWZpbmUgUEhZU0lEX0FSUkFZX1NJWkUJQklUU19UT19MT05HUyhNQVhfTE9DQUxfQVBJQykKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKaW5kZXggMjk3MGQyMi4uY2U5MzI4MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCkBAIC04MCwxMCArODAsNiBAQAogewogCXJldHVybiBQVk9QX0NBTEwwKHVuc2lnbmVkIGxvbmcsIHB2X2NwdV9vcHMucmVhZF9jcjQpOwogfQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fcmVhZF9jcjRfc2FmZSh2b2lkKQotewotCXJldHVybiBQVk9QX0NBTEwwKHVuc2lnbmVkIGxvbmcsIHB2X2NwdV9vcHMucmVhZF9jcjRfc2FmZSk7Ci19CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3dyaXRlX2NyNCh1bnNpZ25lZCBsb25nIHgpCiB7CkBAIC02NjEsOCArNjU3LDYgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKQogCi0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKLQogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHB2X3F1ZXVlZF9zcGluX2xvY2tfc2xvd3BhdGgoc3RydWN0IHFzcGlubG9jayAqbG9jaywKIAkJCQkJCQl1MzIgdmFsKQogewpAQCAtNjg0LDIyICs2NzgsNiBAQAogCVBWT1BfVkNBTEwxKHB2X2xvY2tfb3BzLmtpY2ssIGNwdSk7CiB9CiAKLSNlbHNlIC8qICFDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfbG9ja19zcGlubmluZyhzdHJ1Y3QgYXJjaF9zcGlubG9jayAqbG9jaywKLQkJCQkJCQlfX3RpY2tldF90IHRpY2tldCkKLXsKLQlQVk9QX1ZDQUxMRUUyKHB2X2xvY2tfb3BzLmxvY2tfc3Bpbm5pbmcsIGxvY2ssIHRpY2tldCk7Ci19Ci0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBfX3RpY2tldF91bmxvY2tfa2ljayhzdHJ1Y3QgYXJjaF9zcGlubG9jayAqbG9jaywKLQkJCQkJCQlfX3RpY2tldF90IHRpY2tldCkKLXsKLQlQVk9QX1ZDQUxMMihwdl9sb2NrX29wcy51bmxvY2tfa2ljaywgbG9jaywgdGlja2V0KTsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19RVUVVRURfU1BJTkxPQ0tTICovCi0KICNlbmRpZiAvKiBTTVAgJiYgUEFSQVZJUlRfU1BJTkxPQ0tTICovCiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnRfdHlwZXMuaAppbmRleCA3ZmE5ZTc3Li4wZjQwMGMwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0X3R5cGVzLmgKQEAgLTEwOCw3ICsxMDgsNiBAQAogCXVuc2lnbmVkIGxvbmcgKCpyZWFkX2NyMCkodm9pZCk7CiAJdm9pZCAoKndyaXRlX2NyMCkodW5zaWduZWQgbG9uZyk7CiAKLQl1bnNpZ25lZCBsb25nICgqcmVhZF9jcjRfc2FmZSkodm9pZCk7CiAJdW5zaWduZWQgbG9uZyAoKnJlYWRfY3I0KSh2b2lkKTsKIAl2b2lkICgqd3JpdGVfY3I0KSh1bnNpZ25lZCBsb25nKTsKIApAQCAtMzAxLDIzICszMDAsMTYgQEAKIHN0cnVjdCBhcmNoX3NwaW5sb2NrOwogI2lmZGVmIENPTkZJR19TTVAKICNpbmNsdWRlIDxhc20vc3BpbmxvY2tfdHlwZXMuaD4KLSNlbHNlCi10eXBlZGVmIHUxNiBfX3RpY2tldF90OwogI2VuZGlmCiAKIHN0cnVjdCBxc3BpbmxvY2s7CiAKIHN0cnVjdCBwdl9sb2NrX29wcyB7Ci0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKIAl2b2lkICgqcXVldWVkX3NwaW5fbG9ja19zbG93cGF0aCkoc3RydWN0IHFzcGlubG9jayAqbG9jaywgdTMyIHZhbCk7CiAJc3RydWN0IHBhcmF2aXJ0X2NhbGxlZV9zYXZlIHF1ZXVlZF9zcGluX3VubG9jazsKIAogCXZvaWQgKCp3YWl0KSh1OCAqcHRyLCB1OCB2YWwpOwogCXZvaWQgKCpraWNrKShpbnQgY3B1KTsKLSNlbHNlIC8qICFDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwotCXN0cnVjdCBwYXJhdmlydF9jYWxsZWVfc2F2ZSBsb2NrX3NwaW5uaW5nOwotCXZvaWQgKCp1bmxvY2tfa2ljaykoc3RydWN0IGFyY2hfc3BpbmxvY2sgKmxvY2ssIF9fdGlja2V0X3QgdGlja2V0KTsKLSNlbmRpZiAvKiAhQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KIH07CiAKIC8qIFRoaXMgY29udGFpbnMgYWxsIHRoZSBwYXJhdmlydCBzdHJ1Y3R1cmVzOiB3ZSBnZXQgYSBjb252ZW5pZW50CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCmluZGV4IDlhYjc1MDcuLjE0MTFkYmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaS5oCkBAIC0yMyw2ICsyMyw5IEBACiAjaWZkZWYgQ09ORklHX1BDSV9NU0lfSVJRX0RPTUFJTgogCXZvaWQJCSpmd25vZGU7CS8qIElSUSBkb21haW4gZm9yIE1TSSBhc3NpZ25tZW50ICovCiAjZW5kaWYKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTUQpCisJYm9vbCB2bWRfZG9tYWluOwkJLyogVHJ1ZSBpZiBpbiBJbnRlbCBWTUQgZG9tYWluICovCisjZW5kaWYKIH07CiAKIGV4dGVybiBpbnQgcGNpX3JvdXRlaXJxOwpAQCAtNTYsNiArNTksMTcgQEAKICNkZWZpbmUgcGNpX3Jvb3RfYnVzX2Z3bm9kZQlfcGNpX3Jvb3RfYnVzX2Z3bm9kZQogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc192bWQoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTUQpCisJc3RydWN0IHBjaV9zeXNkYXRhICpzZCA9IGJ1cy0+c3lzZGF0YTsKKworCXJldHVybiBzZC0+dm1kX2RvbWFpbjsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKIC8qIENhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBsb2dpYyBpbiBwY2lfc2Nhbl9idXMgZm9yIHNraXBwaW5nCiAgICBhbHJlYWR5LWNvbmZpZ3VyZWQgYnVzIG51bWJlcnMgLSB0byBiZSB1c2VkIGZvciBidWdneSBCSU9TZXMKICAgIG9yIGFyY2hpdGVjdHVyZXMgd2l0aCBpbmNvbXBsZXRlIFBDSSBzZXR1cCBieSB0aGUgbG9hZGVyICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0X3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0X3R5cGVzLmgKaW5kZXggNmZkZWY5ZS4uM2EyNjQyMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NF90eXBlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjRfdHlwZXMuaApAQCAtNTcsMTEgKzU3LDEzIEBACiAjZGVmaW5lIE1BWE1FTQkJX0FDKF9fQUMoMSwgVUwpIDw8IE1BWF9QSFlTTUVNX0JJVFMsIFVMKQogI2RlZmluZSBWTUFMTE9DX1NJWkVfVEIJX0FDKDMyLCBVTCkKICNkZWZpbmUgX19WTUFMTE9DX0JBU0UJX0FDKDB4ZmZmZmM5MDAwMDAwMDAwMCwgVUwpCi0jZGVmaW5lIFZNRU1NQVBfU1RBUlQJX0FDKDB4ZmZmZmVhMDAwMDAwMDAwMCwgVUwpCisjZGVmaW5lIF9fVk1FTU1BUF9CQVNFCV9BQygweGZmZmZlYTAwMDAwMDAwMDAsIFVMKQogI2lmZGVmIENPTkZJR19SQU5ET01JWkVfTUVNT1JZCiAjZGVmaW5lIFZNQUxMT0NfU1RBUlQJdm1hbGxvY19iYXNlCisjZGVmaW5lIFZNRU1NQVBfU1RBUlQJdm1lbW1hcF9iYXNlCiAjZWxzZQogI2RlZmluZSBWTUFMTE9DX1NUQVJUCV9fVk1BTExPQ19CQVNFCisjZGVmaW5lIFZNRU1NQVBfU1RBUlQJX19WTUVNTUFQX0JBU0UKICNlbmRpZiAvKiBDT05GSUdfUkFORE9NSVpFX01FTU9SWSAqLwogI2RlZmluZSBWTUFMTE9DX0VORAkoVk1BTExPQ19TVEFSVCArIF9BQygoVk1BTExPQ19TSVpFX1RCIDw8IDQwKSAtIDEsIFVMKSkKICNkZWZpbmUgTU9EVUxFU19WQUREUiAgICAoX19TVEFSVF9LRVJORUxfbWFwICsgS0VSTkVMX0lNQUdFX1NJWkUpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wbWVtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wbWVtLmgKaW5kZXggNjQzZWJhNC4uMmMxZWJlYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcG1lbS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BtZW0uaApAQCAtNDYsMTAgKzQ2LDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgYXJjaF9tZW1jcHlfZnJvbV9wbWVtKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKIHsKLQlpZiAoc3RhdGljX2NwdV9oYXMoWDg2X0ZFQVRVUkVfTUNFX1JFQ09WRVJZKSkKLQkJcmV0dXJuIG1lbWNweV9tY3NhZmUoZHN0LCBzcmMsIG4pOwotCW1lbWNweShkc3QsIHNyYywgbik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIG1lbWNweV9tY3NhZmUoZHN0LCBzcmMsIG4pOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggNjNkZWY5NS4uOTg0YTdiZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTM4OSw5ICszODksOSBAQAogCXVuc2lnbmVkIHNob3J0CQlmc2luZGV4OwogCXVuc2lnbmVkIHNob3J0CQlnc2luZGV4OwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCXVuc2lnbmVkIGxvbmcJCWlwOwotI2VuZGlmCisKKwl1MzIJCQlzdGF0dXM7CQkvKiB0aHJlYWQgc3luY2hyb25vdXMgZmxhZ3MgKi8KKwogI2lmZGVmIENPTkZJR19YODZfNjQKIAl1bnNpZ25lZCBsb25nCQlmc2Jhc2U7CiAJdW5zaWduZWQgbG9uZwkJZ3NiYXNlOwpAQCAtNDM4LDYgKzQzOCwxNSBAQAogfTsKIAogLyoKKyAqIFRocmVhZC1zeW5jaHJvbm91cyBzdGF0dXMuCisgKgorICogVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZmxhZ3MgaW4gdGhhdCBub2JvZHkgZWxzZQorICogZXZlciB0b3VjaGVzIG91ciB0aHJlYWQtc3luY2hyb25vdXMgc3RhdHVzLCBzbyB3ZSBkb24ndAorICogaGF2ZSB0byB3b3JyeSBhYm91dCBhdG9taWMgYWNjZXNzZXMuCisgKi8KKyNkZWZpbmUgVFNfQ09NUEFUCQkweDAwMDIJLyogMzJiaXQgc3lzY2FsbCBhY3RpdmUgKDY0QklUKSovCisKKy8qCiAgKiBTZXQgSU9QTCBiaXRzIGluIEVGTEFHUyBmcm9tIGdpdmVuIG1hc2sKICAqLwogc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9zZXRfaW9wbF9tYXNrKHVuc2lnbmVkIG1hc2spCkBAIC03MjQsOCArNzMzLDYgQEAKIAkuYWRkcl9saW1pdAkJPSBLRVJORUxfRFMsCQkJCSAgXAogfQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyB0aHJlYWRfc2F2ZWRfcGMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwotCiAvKgogICogVE9QX09GX0tFUk5FTF9TVEFDS19QQURESU5HIHJlc2VydmVzIDggYnl0ZXMgb24gdG9wIG9mIHRoZSByaW5nMCBzdGFjay4KICAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGd1YXJhbnRlZSB0aGF0IHRoZSBlbnRpcmUgInN0cnVjdCBwdF9yZWdzIgpAQCAtNzc2LDE3ICs3ODMsMTMgQEAKIAkuYWRkcl9saW1pdAkJPSBLRVJORUxfRFMsCQkJXAogfQogCi0vKgotICogUmV0dXJuIHNhdmVkIFBDIG9mIGEgYmxvY2tlZCB0aHJlYWQuCi0gKiBXaGF0IGlzIHRoaXMgZ29vZCBmb3I/IGl0IHdpbGwgYmUgYWx3YXlzIHRoZSBzY2hlZHVsZXIgb3IgcmV0X2Zyb21fZm9yay4KLSAqLwotI2RlZmluZSB0aHJlYWRfc2F2ZWRfcGModCkJUkVBRF9PTkNFX05PQ0hFQ0soKih1bnNpZ25lZCBsb25nICopKCh0KS0+dGhyZWFkLnNwIC0gOCkpCi0KICNkZWZpbmUgdGFza19wdF9yZWdzKHRzaykJKChzdHJ1Y3QgcHRfcmVncyAqKSh0c2spLT50aHJlYWQuc3AwIC0gMSkKIGV4dGVybiB1bnNpZ25lZCBsb25nIEtTVEtfRVNQKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAKICNlbmRpZiAvKiBDT05GSUdfWDg2XzY0ICovCiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CisKIGV4dGVybiB2b2lkIHN0YXJ0X3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBuZXdfaXAsCiAJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIG5ld19zcCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B2Y2xvY2suaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B2Y2xvY2suaAppbmRleCBkMDE5ZjBjLi4zYWQ3NDFiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdmNsb2NrLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oCkBAIC04Nyw5ICs4NywxMCBAQAogfQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lCi1jeWNsZV90IF9fcHZjbG9ja19yZWFkX2N5Y2xlcyhjb25zdCBzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqc3JjKQorY3ljbGVfdCBfX3B2Y2xvY2tfcmVhZF9jeWNsZXMoY29uc3Qgc3RydWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKnNyYywKKwkJCSAgICAgIHU2NCB0c2MpCiB7Ci0JdTY0IGRlbHRhID0gcmR0c2Nfb3JkZXJlZCgpIC0gc3JjLT50c2NfdGltZXN0YW1wOworCXU2NCBkZWx0YSA9IHRzYyAtIHNyYy0+dHNjX3RpbWVzdGFtcDsKIAljeWNsZV90IG9mZnNldCA9IHB2Y2xvY2tfc2NhbGVfZGVsdGEoZGVsdGEsIHNyYy0+dHNjX3RvX3N5c3RlbV9tdWwsCiAJCQkJCSAgICAgc3JjLT50c2Nfc2hpZnQpOwogCXJldHVybiBzcmMtPnN5c3RlbV90aW1lICsgb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcmVhbG1vZGUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3JlYWxtb2RlLmgKaW5kZXggYjI5ODhjMC4uMjMwZTE5MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcmVhbG1vZGUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yZWFsbW9kZS5oCkBAIC00NCw5ICs0NCw5IEBACiBleHRlcm4gc3RydWN0IHJlYWxfbW9kZV9oZWFkZXIgKnJlYWxfbW9kZV9oZWFkZXI7CiBleHRlcm4gdW5zaWduZWQgY2hhciByZWFsX21vZGVfYmxvYl9lbmRbXTsKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW5pdF9yc3A7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBpbml0aWFsX2NvZGU7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBpbml0aWFsX2dzOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW5pdGlhbF9zdGFjazsKIAogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmVhbF9tb2RlX2Jsb2JbXTsKIGV4dGVybiB1bnNpZ25lZCBjaGFyIHJlYWxfbW9kZV9yZWxvY3NbXTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3J3c2VtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yd3NlbS5oCmluZGV4IDhkYmM3NjIuLjNkMzNhNzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3J3c2VtLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcndzZW0uaApAQCAtMTU0LDcgKzE1NCw3IEBACiAJCSAgICAgOiAiK20iIChzZW0tPmNvdW50KSwgIj0mYSIgKHRtcDApLCAiPSZyIiAodG1wMSksCiAJCSAgICAgICBDQ19PVVQoZSkgKHJlc3VsdCkKIAkJICAgICA6ICJlciIgKFJXU0VNX0FDVElWRV9XUklURV9CSUFTKQotCQkgICAgIDogIm1lbW9yeSIsICJjYyIpOworCQkgICAgIDogIm1lbW9yeSIpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NpZ25hbC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2lnbmFsLmgKaW5kZXggZGQxZTdkNi4uOGFmMjJiZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2lnbmFsLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2lnbmFsLmgKQEAgLTIzLDYgKzIzLDEwIEBACiAJdW5zaWduZWQgbG9uZyBzaWdbX05TSUdfV09SRFNdOwogfSBzaWdzZXRfdDsKIAorLyogbm9uLXVhcGkgaW4ta2VybmVsIFNBX0ZMQUdTIGZvciB0aG9zZSBpbmRpY2F0ZXMgQUJJIGZvciBhIHNpZ25hbCBmcmFtZSAqLworI2RlZmluZSBTQV9JQTMyX0FCSQkweDAyMDAwMDAwdQorI2RlZmluZSBTQV9YMzJfQUJJCTB4MDEwMDAwMDB1CisKICNpZm5kZWYgQ09ORklHX0NPTVBBVAogdHlwZWRlZiBzaWdzZXRfdCBjb21wYXRfc2lnc2V0X3Q7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggZWJkMGMxNi4uMTk5ODBiMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmgKQEAgLTM5LDkgKzM5LDYgQEAKIERFQ0xBUkVfRUFSTFlfUEVSX0NQVV9SRUFEX01PU1RMWShpbnQsIHg4Nl9jcHVfdG9fbG9naWNhbF9hcGljaWQpOwogI2VuZGlmCiAKLS8qIFN0YXRpYyBzdGF0ZSBpbiBoZWFkLlMgdXNlZCB0byBzZXQgdXAgYSBDUFUgKi8KLWV4dGVybiB1bnNpZ25lZCBsb25nIHN0YWNrX3N0YXJ0OyAvKiBJbml0aWFsIHN0YWNrIHBvaW50ZXIgYWRkcmVzcyAqLwotCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKIHN0cnVjdCBzbXBfb3BzIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwZWNpYWxfaW5zbnMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwZWNpYWxfaW5zbnMuaAppbmRleCA1ODdkNzkxLi4xOWEyMjI0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGVjaWFsX2luc25zLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BlY2lhbF9pbnNucy5oCkBAIC01OSwyMiArNTksMTkgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBuYXRpdmVfcmVhZF9jcjQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKLQlhc20gdm9sYXRpbGUoIm1vdiAlJWNyNCwlMFxuXHQiIDogIj1yIiAodmFsKSwgIj1tIiAoX19mb3JjZV9vcmRlcikpOwotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBuYXRpdmVfcmVhZF9jcjRfc2FmZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdmFsOwotCS8qIFRoaXMgY291bGQgZmF1bHQgaWYgJWNyNCBkb2VzIG5vdCBleGlzdC4gSW4geDg2XzY0LCBhIGNyNCBhbHdheXMKLQkgKiBleGlzdHMsIHNvIGl0IHdpbGwgbmV2ZXIgZmFpbC4gKi8KICNpZmRlZiBDT05GSUdfWDg2XzMyCisJLyoKKwkgKiBUaGlzIGNvdWxkIGZhdWx0IGlmIENSNCBkb2VzIG5vdCBleGlzdC4gIE5vbi1leGlzdGVudCBDUjQKKwkgKiBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBDUjQgPT0gMC4gIEtlZXAgaXQgc2ltcGxlIGFuZCBwcmV0ZW5kCisJICogdGhhdCBDUjQgPT0gMCBvbiBDUFVzIHRoYXQgZG9uJ3QgaGF2ZSBDUjQuCisJICovCiAJYXNtIHZvbGF0aWxlKCIxOiBtb3YgJSVjcjQsICUwXG4iCiAJCSAgICAgIjI6XG4iCiAJCSAgICAgX0FTTV9FWFRBQkxFKDFiLCAyYikKIAkJICAgICA6ICI9ciIgKHZhbCksICI9bSIgKF9fZm9yY2Vfb3JkZXIpIDogIjAiICgwKSk7CiAjZWxzZQotCXZhbCA9IG5hdGl2ZV9yZWFkX2NyNCgpOworCS8qIENSNCBhbHdheXMgZXhpc3RzIG9uIHg4Nl82NC4gKi8KKwlhc20gdm9sYXRpbGUoIm1vdiAlJWNyNCwlMFxuXHQiIDogIj1yIiAodmFsKSwgIj1tIiAoX19mb3JjZV9vcmRlcikpOwogI2VuZGlmCiAJcmV0dXJuIHZhbDsKIH0KQEAgLTE4MiwxMSArMTc5LDYgQEAKIAlyZXR1cm4gbmF0aXZlX3JlYWRfY3I0KCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3JlYWRfY3I0X3NhZmUodm9pZCkKLXsKLQlyZXR1cm4gbmF0aXZlX3JlYWRfY3I0X3NhZmUoKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIF9fd3JpdGVfY3I0KHVuc2lnbmVkIGxvbmcgeCkKIHsKIAluYXRpdmVfd3JpdGVfY3I0KHgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKaW5kZXggYmUwYTA1OS4uOTIxYmVhNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9jay5oCkBAIC0yMCwxODcgKzIwLDEzIEBACiAgKiAodGhlIHR5cGUgZGVmaW5pdGlvbnMgYXJlIGluIGFzbS9zcGlubG9ja190eXBlcy5oKQogICovCiAKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0jIGRlZmluZSBMT0NLX1BUUl9SRUcgImEiCi0jZWxzZQotIyBkZWZpbmUgTE9DS19QVFJfUkVHICJEIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19YODZfMzIpICYmIChkZWZpbmVkKENPTkZJR19YODZfUFBST19GRU5DRSkpCi0vKgotICogT24gUFBybyBTTVAsIHdlIHVzZSBhIGxvY2tlZCBvcGVyYXRpb24gdG8gdW5sb2NrCi0gKiAoUFBybyBlcnJhdGEgNjYsIDkyKQotICovCi0jIGRlZmluZSBVTkxPQ0tfTE9DS19QUkVGSVggTE9DS19QUkVGSVgKLSNlbHNlCi0jIGRlZmluZSBVTkxPQ0tfTE9DS19QUkVGSVgKLSNlbmRpZgotCiAvKiBIb3cgbG9uZyBhIGxvY2sgc2hvdWxkIHNwaW4gYmVmb3JlIHdlIGNvbnNpZGVyIGJsb2NraW5nICovCiAjZGVmaW5lIFNQSU5fVEhSRVNIT0xECSgxIDw8IDE1KQogCiBleHRlcm4gc3RydWN0IHN0YXRpY19rZXkgcGFyYXZpcnRfdGlja2V0bG9ja3NfZW5hYmxlZDsKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBzdGF0aWNfa2V5X2ZhbHNlKHN0cnVjdCBzdGF0aWNfa2V5ICprZXkpOwogCi0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKICNpbmNsdWRlIDxhc20vcXNwaW5sb2NrLmg+Ci0jZWxzZQotCi0jaWZkZWYgQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUwotCi1zdGF0aWMgaW5saW5lIHZvaWQgX190aWNrZXRfZW50ZXJfc2xvd3BhdGgoYXJjaF9zcGlubG9ja190ICpsb2NrKQotewotCXNldF9iaXQoMCwgKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikmbG9jay0+dGlja2V0cy5oZWFkKTsKLX0KLQotI2Vsc2UgIC8qICFDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTICovCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfbG9ja19zcGlubmluZyhhcmNoX3NwaW5sb2NrX3QgKmxvY2ssCi0JCQkJCQkJX190aWNrZXRfdCB0aWNrZXQpCi17Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgX190aWNrZXRfdW5sb2NrX2tpY2soYXJjaF9zcGlubG9ja190ICpsb2NrLAotCQkJCQkJCV9fdGlja2V0X3QgdGlja2V0KQotewotfQotCi0jZW5kaWYgLyogQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUyAqLwotc3RhdGljIGlubGluZSBpbnQgIF9fdGlja2V0c19lcXVhbChfX3RpY2tldF90IG9uZSwgX190aWNrZXRfdCB0d28pCi17Ci0JcmV0dXJuICEoKG9uZSBeIHR3bykgJiB+VElDS0VUX1NMT1dQQVRIX0ZMQUcpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX190aWNrZXRfY2hlY2tfYW5kX2NsZWFyX3Nsb3dwYXRoKGFyY2hfc3BpbmxvY2tfdCAqbG9jaywKLQkJCQkJCQlfX3RpY2tldF90IGhlYWQpCi17Ci0JaWYgKGhlYWQgJiBUSUNLRVRfU0xPV1BBVEhfRkxBRykgewotCQlhcmNoX3NwaW5sb2NrX3Qgb2xkLCBuZXc7Ci0KLQkJb2xkLnRpY2tldHMuaGVhZCA9IGhlYWQ7Ci0JCW5ldy50aWNrZXRzLmhlYWQgPSBoZWFkICYgflRJQ0tFVF9TTE9XUEFUSF9GTEFHOwotCQlvbGQudGlja2V0cy50YWlsID0gbmV3LnRpY2tldHMuaGVhZCArIFRJQ0tFVF9MT0NLX0lOQzsKLQkJbmV3LnRpY2tldHMudGFpbCA9IG9sZC50aWNrZXRzLnRhaWw7Ci0KLQkJLyogdHJ5IHRvIGNsZWFyIHNsb3dwYXRoIGZsYWcgd2hlbiB0aGVyZSBhcmUgbm8gY29udGVuZGVycyAqLwotCQljbXB4Y2hnKCZsb2NrLT5oZWFkX3RhaWwsIG9sZC5oZWFkX3RhaWwsIG5ldy5oZWFkX3RhaWwpOwotCX0KLX0KLQotc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgYXJjaF9zcGluX3ZhbHVlX3VubG9ja2VkKGFyY2hfc3BpbmxvY2tfdCBsb2NrKQotewotCXJldHVybiBfX3RpY2tldHNfZXF1YWwobG9jay50aWNrZXRzLmhlYWQsIGxvY2sudGlja2V0cy50YWlsKTsKLX0KLQotLyoKLSAqIFRpY2tldCBsb2NrcyBhcmUgY29uY2VwdHVhbGx5IHR3byBwYXJ0cywgb25lIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgaGVhZCBvZgotICogdGhlIHF1ZXVlLCBhbmQgdGhlIG90aGVyIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGFpbC4gVGhlIGxvY2sgaXMgYWNxdWlyZWQKLSAqIGJ5IGF0b21pY2FsbHkgbm90aW5nIHRoZSB0YWlsIGFuZCBpbmNyZW1lbnRpbmcgaXQgYnkgb25lICh0aHVzIGFkZGluZwotICogb3Vyc2VsZiB0byB0aGUgcXVldWUgYW5kIG5vdGluZyBvdXIgcG9zaXRpb24pLCB0aGVuIHdhaXRpbmcgdW50aWwgdGhlIGhlYWQKLSAqIGJlY29tZXMgZXF1YWwgdG8gdGhlIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSB0YWlsLgotICoKLSAqIFdlIHVzZSBhbiB4YWRkIGNvdmVyaW5nICpib3RoKiBwYXJ0cyBvZiB0aGUgbG9jaywgdG8gaW5jcmVtZW50IHRoZSB0YWlsIGFuZAotICogYWxzbyBsb2FkIHRoZSBwb3NpdGlvbiBvZiB0aGUgaGVhZCwgd2hpY2ggdGFrZXMgY2FyZSBvZiBtZW1vcnkgb3JkZXJpbmcKLSAqIGlzc3VlcyBhbmQgc2hvdWxkIGJlIG9wdGltYWwgZm9yIHRoZSB1bmNvbnRlbmRlZCBjYXNlLiBOb3RlIHRoZSB0YWlsIG11c3QgYmUKLSAqIGluIHRoZSBoaWdoIHBhcnQsIGJlY2F1c2UgYSB3aWRlIHhhZGQgaW5jcmVtZW50IG9mIHRoZSBsb3cgcGFydCB3b3VsZCBjYXJyeQotICogdXAgYW5kIGNvbnRhbWluYXRlIHRoZSBoaWdoIHBhcnQuCi0gKi8KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBhcmNoX3NwaW5fbG9jayhhcmNoX3NwaW5sb2NrX3QgKmxvY2spCi17Ci0JcmVnaXN0ZXIgc3RydWN0IF9fcmF3X3RpY2tldHMgaW5jID0geyAudGFpbCA9IFRJQ0tFVF9MT0NLX0lOQyB9OwotCi0JaW5jID0geGFkZCgmbG9jay0+dGlja2V0cywgaW5jKTsKLQlpZiAobGlrZWx5KGluYy5oZWFkID09IGluYy50YWlsKSkKLQkJZ290byBvdXQ7Ci0KLQlmb3IgKDs7KSB7Ci0JCXVuc2lnbmVkIGNvdW50ID0gU1BJTl9USFJFU0hPTEQ7Ci0KLQkJZG8gewotCQkJaW5jLmhlYWQgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cy5oZWFkKTsKLQkJCWlmIChfX3RpY2tldHNfZXF1YWwoaW5jLmhlYWQsIGluYy50YWlsKSkKLQkJCQlnb3RvIGNsZWFyX3Nsb3dwYXRoOwotCQkJY3B1X3JlbGF4KCk7Ci0JCX0gd2hpbGUgKC0tY291bnQpOwotCQlfX3RpY2tldF9sb2NrX3NwaW5uaW5nKGxvY2ssIGluYy50YWlsKTsKLQl9Ci1jbGVhcl9zbG93cGF0aDoKLQlfX3RpY2tldF9jaGVja19hbmRfY2xlYXJfc2xvd3BhdGgobG9jaywgaW5jLmhlYWQpOwotb3V0OgotCWJhcnJpZXIoKTsJLyogbWFrZSBzdXJlIG5vdGhpbmcgY3JlZXBzIGJlZm9yZSB0aGUgbG9jayBpcyB0YWtlbiAqLwotfQotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBhcmNoX3NwaW5fdHJ5bG9jayhhcmNoX3NwaW5sb2NrX3QgKmxvY2spCi17Ci0JYXJjaF9zcGlubG9ja190IG9sZCwgbmV3OwotCi0Jb2xkLnRpY2tldHMgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cyk7Ci0JaWYgKCFfX3RpY2tldHNfZXF1YWwob2xkLnRpY2tldHMuaGVhZCwgb2xkLnRpY2tldHMudGFpbCkpCi0JCXJldHVybiAwOwotCi0JbmV3LmhlYWRfdGFpbCA9IG9sZC5oZWFkX3RhaWwgKyAoVElDS0VUX0xPQ0tfSU5DIDw8IFRJQ0tFVF9TSElGVCk7Ci0JbmV3LmhlYWRfdGFpbCAmPSB+VElDS0VUX1NMT1dQQVRIX0ZMQUc7Ci0KLQkvKiBjbXB4Y2hnIGlzIGEgZnVsbCBiYXJyaWVyLCBzbyBub3RoaW5nIGNhbiBtb3ZlIGJlZm9yZSBpdCAqLwotCXJldHVybiBjbXB4Y2hnKCZsb2NrLT5oZWFkX3RhaWwsIG9sZC5oZWFkX3RhaWwsIG5ldy5oZWFkX3RhaWwpID09IG9sZC5oZWFkX3RhaWw7Ci19Ci0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBhcmNoX3NwaW5fdW5sb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlpZiAoVElDS0VUX1NMT1dQQVRIX0ZMQUcgJiYKLQkJc3RhdGljX2tleV9mYWxzZSgmcGFyYXZpcnRfdGlja2V0bG9ja3NfZW5hYmxlZCkpIHsKLQkJX190aWNrZXRfdCBoZWFkOwotCi0JCUJVSUxEX0JVR19PTigoKF9fdGlja2V0X3QpTlJfQ1BVUykgIT0gTlJfQ1BVUyk7Ci0KLQkJaGVhZCA9IHhhZGQoJmxvY2stPnRpY2tldHMuaGVhZCwgVElDS0VUX0xPQ0tfSU5DKTsKLQotCQlpZiAodW5saWtlbHkoaGVhZCAmIFRJQ0tFVF9TTE9XUEFUSF9GTEFHKSkgewotCQkJaGVhZCAmPSB+VElDS0VUX1NMT1dQQVRIX0ZMQUc7Ci0JCQlfX3RpY2tldF91bmxvY2tfa2ljayhsb2NrLCAoaGVhZCArIFRJQ0tFVF9MT0NLX0lOQykpOwotCQl9Ci0JfSBlbHNlCi0JCV9fYWRkKCZsb2NrLT50aWNrZXRzLmhlYWQsIFRJQ0tFVF9MT0NLX0lOQywgVU5MT0NLX0xPQ0tfUFJFRklYKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXJjaF9zcGluX2lzX2xvY2tlZChhcmNoX3NwaW5sb2NrX3QgKmxvY2spCi17Ci0Jc3RydWN0IF9fcmF3X3RpY2tldHMgdG1wID0gUkVBRF9PTkNFKGxvY2stPnRpY2tldHMpOwotCi0JcmV0dXJuICFfX3RpY2tldHNfZXF1YWwodG1wLnRhaWwsIHRtcC5oZWFkKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYXJjaF9zcGluX2lzX2NvbnRlbmRlZChhcmNoX3NwaW5sb2NrX3QgKmxvY2spCi17Ci0Jc3RydWN0IF9fcmF3X3RpY2tldHMgdG1wID0gUkVBRF9PTkNFKGxvY2stPnRpY2tldHMpOwotCi0JdG1wLmhlYWQgJj0gflRJQ0tFVF9TTE9XUEFUSF9GTEFHOwotCXJldHVybiAoX190aWNrZXRfdCkodG1wLnRhaWwgLSB0bXAuaGVhZCkgPiBUSUNLRVRfTE9DS19JTkM7Ci19Ci0jZGVmaW5lIGFyY2hfc3Bpbl9pc19jb250ZW5kZWQJYXJjaF9zcGluX2lzX2NvbnRlbmRlZAotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgYXJjaF9zcGluX2xvY2tfZmxhZ3MoYXJjaF9zcGlubG9ja190ICpsb2NrLAotCQkJCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCWFyY2hfc3Bpbl9sb2NrKGxvY2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9zcGluX3VubG9ja193YWl0KGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlfX3RpY2tldF90IGhlYWQgPSBSRUFEX09OQ0UobG9jay0+dGlja2V0cy5oZWFkKTsKLQotCWZvciAoOzspIHsKLQkJc3RydWN0IF9fcmF3X3RpY2tldHMgdG1wID0gUkVBRF9PTkNFKGxvY2stPnRpY2tldHMpOwotCQkvKgotCQkgKiBXZSBuZWVkIHRvIGNoZWNrICJ1bmxvY2tlZCIgaW4gYSBsb29wLCB0bXAuaGVhZCA9PSBoZWFkCi0JCSAqIGNhbiBiZSBmYWxzZSBwb3NpdGl2ZSBiZWNhdXNlIG9mIG92ZXJmbG93LgotCQkgKi8KLQkJaWYgKF9fdGlja2V0c19lcXVhbCh0bXAuaGVhZCwgdG1wLnRhaWwpIHx8Ci0JCQkJIV9fdGlja2V0c19lcXVhbCh0bXAuaGVhZCwgaGVhZCkpCi0JCQlicmVhazsKLQotCQljcHVfcmVsYXgoKTsKLQl9Ci19Ci0jZW5kaWYgLyogQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KIAogLyoKICAqIFJlYWQtd3JpdGUgc3BpbmxvY2tzLCBhbGxvd2luZyBtdWx0aXBsZSByZWFkZXJzCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2tfdHlwZXMuaAppbmRleCA2NWMzZTM3Li4yNTMxMWViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9ja190eXBlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrX3R5cGVzLmgKQEAgLTIzLDIwICsyMyw3IEBACiAKICNkZWZpbmUgVElDS0VUX1NISUZUCShzaXplb2YoX190aWNrZXRfdCkgKiA4KQogCi0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9xc3BpbmxvY2tfdHlwZXMuaD4KLSNlbHNlCi10eXBlZGVmIHN0cnVjdCBhcmNoX3NwaW5sb2NrIHsKLQl1bmlvbiB7Ci0JCV9fdGlja2V0cGFpcl90IGhlYWRfdGFpbDsKLQkJc3RydWN0IF9fcmF3X3RpY2tldHMgewotCQkJX190aWNrZXRfdCBoZWFkLCB0YWlsOwotCQl9IHRpY2tldHM7Ci0JfTsKLX0gYXJjaF9zcGlubG9ja190OwotCi0jZGVmaW5lIF9fQVJDSF9TUElOX0xPQ0tfVU5MT0NLRUQJeyB7IDAgfSB9Ci0jZW5kaWYgLyogQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Fyd2xvY2tfdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RhY2t0cmFjZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3RhY2t0cmFjZS5oCmluZGV4IDA5NDQyMTguLjM3ZjJlMGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N0YWNrdHJhY2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdGFja3RyYWNlLmgKQEAgLTgsODYgKzgsODYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CisKK2VudW0gc3RhY2tfdHlwZSB7CisJU1RBQ0tfVFlQRV9VTktOT1dOLAorCVNUQUNLX1RZUEVfVEFTSywKKwlTVEFDS19UWVBFX0lSUSwKKwlTVEFDS19UWVBFX1NPRlRJUlEsCisJU1RBQ0tfVFlQRV9FWENFUFRJT04sCisJU1RBQ0tfVFlQRV9FWENFUFRJT05fTEFTVCA9IFNUQUNLX1RZUEVfRVhDRVBUSU9OICsgTl9FWENFUFRJT05fU1RBQ0tTLTEsCit9OworCitzdHJ1Y3Qgc3RhY2tfaW5mbyB7CisJZW51bSBzdGFja190eXBlIHR5cGU7CisJdW5zaWduZWQgbG9uZyAqYmVnaW4sICplbmQsICpuZXh0X3NwOworfTsKKworYm9vbCBpbl90YXNrX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgIHN0cnVjdCBzdGFja19pbmZvICppbmZvKTsKKworaW50IGdldF9zdGFja19pbmZvKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgIHN0cnVjdCBzdGFja19pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nICp2aXNpdF9tYXNrKTsKKwordm9pZCBzdGFja190eXBlX3N0cihlbnVtIHN0YWNrX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqKmJlZ2luLAorCQkgICAgY29uc3QgY2hhciAqKmVuZCk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBvbl9zdGFjayhzdHJ1Y3Qgc3RhY2tfaW5mbyAqaW5mbywgdm9pZCAqYWRkciwgc2l6ZV90IGxlbikKK3sKKwl2b2lkICpiZWdpbiA9IGluZm8tPmJlZ2luOworCXZvaWQgKmVuZCAgID0gaW5mby0+ZW5kOworCisJcmV0dXJuIChpbmZvLT50eXBlICE9IFNUQUNLX1RZUEVfVU5LTk9XTiAmJgorCQlhZGRyID49IGJlZ2luICYmIGFkZHIgPCBlbmQgJiYKKwkJYWRkciArIGxlbiA+IGJlZ2luICYmIGFkZHIgKyBsZW4gPD0gZW5kKTsKK30KIAogZXh0ZXJuIGludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7CiAKLXN0cnVjdCB0aHJlYWRfaW5mbzsKLXN0cnVjdCBzdGFja3RyYWNlX29wczsKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nICgqd2Fsa19zdGFja190KShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2ssCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBicCwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywKLQkJCQkgICAgICB2b2lkICpkYXRhLAotCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmVuZCwKLQkJCQkgICAgICBpbnQgKmdyYXBoKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcKLXByaW50X2NvbnRleHRfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkgICAgdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCi0JCSAgICBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywgdm9pZCAqZGF0YSwKLQkJICAgIHVuc2lnbmVkIGxvbmcgKmVuZCwgaW50ICpncmFwaCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nCi1wcmludF9jb250ZXh0X3N0YWNrX2JwKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwLAotCQkgICAgICAgY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICplbmQsIGludCAqZ3JhcGgpOwotCi0vKiBHZW5lcmljIHN0YWNrIHRyYWNlciB3aXRoIGNhbGxiYWNrcyAqLwotCi1zdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgewotCWludCAoKmFkZHJlc3MpKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IHJlbGlhYmxlKTsKLQkvKiBPbiBuZWdhdGl2ZSByZXR1cm4gc3RvcCBkdW1waW5nICovCi0JaW50ICgqc3RhY2spKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpOwotCXdhbGtfc3RhY2tfdAl3YWxrX3N0YWNrOwotfTsKLQotdm9pZCBkdW1wX3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsCi0JCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKTsKLQogI2lmZGVmIENPTkZJR19YODZfMzIKICNkZWZpbmUgU1RBQ0tTTE9UU19QRVJfTElORSA4Ci0jZGVmaW5lIGdldF9icChicCkgYXNtKCJtb3ZsICUlZWJwLCAlMCIgOiAiPXIiIChicCkgOikKICNlbHNlCiAjZGVmaW5lIFNUQUNLU0xPVFNfUEVSX0xJTkUgNAotI2RlZmluZSBnZXRfYnAoYnApIGFzbSgibW92cSAlJXJicCwgJTAiIDogIj1yIiAoYnApIDopCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLXN0YWNrX2ZyYW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKgorZ2V0X2ZyYW1lX3BvaW50ZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQl1bnNpZ25lZCBsb25nIGJwOwotCiAJaWYgKHJlZ3MpCi0JCXJldHVybiByZWdzLT5icDsKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nICopcmVncy0+YnA7CiAKLQlpZiAodGFzayA9PSBjdXJyZW50KSB7Ci0JCS8qIEdyYWIgYnAgcmlnaHQgZnJvbSBvdXIgcmVncyAqLwotCQlnZXRfYnAoYnApOwotCQlyZXR1cm4gYnA7Ci0JfQorCWlmICh0YXNrID09IGN1cnJlbnQpCisJCXJldHVybiBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKIAotCS8qIGJwIGlzIHRoZSBsYXN0IHJlZyBwdXNoZWQgYnkgc3dpdGNoX3RvICovCi0JcmV0dXJuICoodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5zcDsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKikoKHN0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lICopdGFzay0+dGhyZWFkLnNwKS0+YnA7CiB9CiAjZWxzZQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1zdGFja19mcmFtZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICoKK2dldF9mcmFtZV9wb2ludGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIE5VTEw7CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfRlJBTUVfUE9JTlRFUiAqLwogCi1leHRlcm4gdm9pZAotc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCSAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwLCBjaGFyICpsb2dfbHZsKTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyAqCitnZXRfc3RhY2tfcG9pbnRlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChyZWdzKQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKilrZXJuZWxfc3RhY2tfcG9pbnRlcihyZWdzKTsKIAotZXh0ZXJuIHZvaWQKLXNob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkgICB1bnNpZ25lZCBsb25nICpzcCwgdW5zaWduZWQgbG9uZyBicCwgY2hhciAqbG9nX2x2bCk7CisJaWYgKHRhc2sgPT0gY3VycmVudCkKKwkJcmV0dXJuIF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnNwOworfQorCit2b2lkIHNob3dfdHJhY2VfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIGNoYXIgKmxvZ19sdmwpOworCit2b2lkIHNob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJdW5zaWduZWQgbG9uZyAqc3AsIGNoYXIgKmxvZ19sdmwpOwogCiBleHRlcm4gdW5zaWduZWQgaW50IGNvZGVfYnl0ZXM7CiAKQEAgLTEwNiw3ICsxMDYsNyBAQAogewogCXN0cnVjdCBzdGFja19mcmFtZSAqZnJhbWU7CiAKLQlnZXRfYnAoZnJhbWUpOworCWZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CiAKICNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgogCWZyYW1lID0gZnJhbWUtPm5leHRfZnJhbWU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdHJpbmdfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N0cmluZ182NC5oCmluZGV4IDkwZGJiZDkuLmExNjQ4NjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N0cmluZ182NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N0cmluZ182NC5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfQVNNX1g4Nl9TVFJJTkdfNjRfSAogCiAjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KIAogLyogV3JpdHRlbiAyMDAyIGJ5IEFuZGkgS2xlZW4gKi8KIApAQCAtNzgsNiArNzksOSBAQAogI2RlZmluZSBtZW1zZXQocywgYywgbikgX19tZW1zZXQocywgYywgbikKICNlbmRpZgogCitfX211c3RfY2hlY2sgaW50IG1lbWNweV9tY3NhZmVfdW5yb2xsZWQodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBjbnQpOworREVDTEFSRV9TVEFUSUNfS0VZX0ZBTFNFKG1jc2FmZV9rZXkpOworCiAvKioKICAqIG1lbWNweV9tY3NhZmUgLSBjb3B5IG1lbW9yeSB3aXRoIGluZGljYXRpb24gaWYgYSBtYWNoaW5lIGNoZWNrIGhhcHBlbmVkCiAgKgpAQCAtODYsMTAgKzkwLDIzIEBACiAgKiBAY250OgludW1iZXIgb2YgYnl0ZXMgdG8gY29weQogICoKICAqIExvdyBsZXZlbCBtZW1vcnkgY29weSBmdW5jdGlvbiB0aGF0IGNhdGNoZXMgbWFjaGluZSBjaGVja3MKKyAqIFdlIG9ubHkgY2FsbCBpbnRvIHRoZSAic2FmZSIgZnVuY3Rpb24gb24gc3lzdGVtcyB0aGF0IGNhbgorICogYWN0dWFsbHkgZG8gbWFjaGluZSBjaGVjayByZWNvdmVyeS4gRXZlcnlvbmUgZWxzZSBjYW4ganVzdAorICogdXNlIG1lbWNweSgpLgogICoKICAqIFJldHVybiAwIGZvciBzdWNjZXNzLCAtRUZBVUxUIGZvciBmYWlsCiAgKi8KLWludCBtZW1jcHlfbWNzYWZlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgY250KTsKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgX19tdXN0X2NoZWNrIGludAorbWVtY3B5X21jc2FmZSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGNudCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2X01DRQorCWlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZtY3NhZmVfa2V5KSkKKwkJcmV0dXJuIG1lbWNweV9tY3NhZmVfdW5yb2xsZWQoZHN0LCBzcmMsIGNudCk7CisJZWxzZQorI2VuZGlmCisJCW1lbWNweShkc3QsIHNyYywgY250KTsKKwlyZXR1cm4gMDsKK30KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3dpdGNoX3RvLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaAppbmRleCA4ZjMyMWExLi41Y2I0MzZhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaApAQCAtMiwxMzAgKzIsNjYgQEAKICNkZWZpbmUgX0FTTV9YODZfU1dJVENIX1RPX0gKIAogc3RydWN0IHRhc2tfc3RydWN0OyAvKiBvbmUgb2YgdGhlIHN0cmFuZ2VyIGFzcGVjdHMgb2YgQyBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLworCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvX2FzbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsCisJCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCk7CisKIF9fdmlzaWJsZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKl9fc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKLQkJCQkJICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KTsKKwkJCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpOwogc3RydWN0IHRzc19zdHJ1Y3Q7CiB2b2lkIF9fc3dpdGNoX3RvX3h0cmEoc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2X3AsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dF9wLAogCQkgICAgICBzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzKTsKIAotI2lmZGVmIENPTkZJR19YODZfMzIKKy8qIFRoaXMgcnVucyBydW5zIG9uIHRoZSBwcmV2aW91cyB0aHJlYWQncyBzdGFjay4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX3N3aXRjaF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsCisJCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCit7CisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKKwkvKgorCSAqIElmIHdlIHN3aXRjaCB0byBhIHN0YWNrIHRoYXQgaGFzIGEgdG9wLWxldmVsIHBhZ2luZyBlbnRyeQorCSAqIHRoYXQgaXMgbm90IHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgbW0sIHRoZSByZXN1bHRpbmcgI1BGIHdpbGwKKwkgKiB3aWxsIGJlIHByb21vdGVkIHRvIGEgZG91YmxlLWZhdWx0IGFuZCB3ZSdsbCBwYW5pYy4gIFByb2JlCisJICogdGhlIG5ldyBzdGFjayBub3cgc28gdGhhdCB2bWFsbG9jX2ZhdWx0IGNhbiBmaXggdXAgdGhlIHBhZ2UKKwkgKiB0YWJsZXMgaWYgbmVlZGVkLiAgVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgd2UgdXNlIGEgc3RhY2sKKwkgKiBpbiB2bWFwIHNwYWNlLgorCSAqCisJICogV2UgYXNzdW1lIHRoYXQgdGhlIHN0YWNrIGlzIGFsaWduZWQgc28gdGhhdCBpdCBuZXZlciBzcGFucworCSAqIG1vcmUgdGhhbiBvbmUgdG9wLWxldmVsIHBhZ2luZyBlbnRyeS4KKwkgKgorCSAqIFRvIG1pbmltaXplIGNhY2hlIHBvbGx1dGlvbiwganVzdCBmb2xsb3cgdGhlIHN0YWNrIHBvaW50ZXIuCisJICovCisJUkVBRF9PTkNFKCoodW5zaWduZWQgY2hhciAqKW5leHQtPnRocmVhZC5zcCk7CisjZW5kaWYKK30KIAotI2lmZGVmIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUgotI2RlZmluZSBfX3N3aXRjaF9jYW5hcnkJCQkJCQkJXAotCSJtb3ZsICVQW3Rhc2tfY2FuYXJ5XSglW25leHRdKSwgJSVlYnhcblx0IgkJCVwKLQkibW92bCAlJWVieCwgIl9fcGVyY3B1X2FyZyhbc3RhY2tfY2FuYXJ5XSkiXG5cdCIKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5X29wYXJhbQkJCQkJCVwKLQksIFtzdGFja19jYW5hcnldICI9bSIgKHN0YWNrX2NhbmFyeS5jYW5hcnkpCi0jZGVmaW5lIF9fc3dpdGNoX2NhbmFyeV9pcGFyYW0JCQkJCQlcCi0JLCBbdGFza19jYW5hcnldICJpIiAob2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCBzdGFja19jYW5hcnkpKQotI2Vsc2UJLyogQ0NfU1RBQ0tQUk9URUNUT1IgKi8KLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5Ci0jZGVmaW5lIF9fc3dpdGNoX2NhbmFyeV9vcGFyYW0KLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5X2lwYXJhbQotI2VuZGlmCS8qIENDX1NUQUNLUFJPVEVDVE9SICovCithc21saW5rYWdlIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKTsKIAotLyoKLSAqIFNhdmluZyBlZmxhZ3MgaXMgaW1wb3J0YW50LiBJdCBzd2l0Y2hlcyBub3Qgb25seSBJT1BMIGJldHdlZW4gdGFza3MsCi0gKiBpdCBhbHNvIHByb3RlY3RzIG90aGVyIHRhc2tzIGZyb20gTlQgbGVha2luZyB0aHJvdWdoIHN5c2VudGVyIGV0Yy4KLSAqLworLyogZGF0YSB0aGF0IGlzIHBvaW50ZWQgdG8gYnkgdGhyZWFkLnNwICovCitzdHJ1Y3QgaW5hY3RpdmVfdGFza19mcmFtZSB7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXVuc2lnbmVkIGxvbmcgcjE1OworCXVuc2lnbmVkIGxvbmcgcjE0OworCXVuc2lnbmVkIGxvbmcgcjEzOworCXVuc2lnbmVkIGxvbmcgcjEyOworI2Vsc2UKKwl1bnNpZ25lZCBsb25nIHNpOworCXVuc2lnbmVkIGxvbmcgZGk7CisjZW5kaWYKKwl1bnNpZ25lZCBsb25nIGJ4OworCXVuc2lnbmVkIGxvbmcgYnA7CisJdW5zaWduZWQgbG9uZyByZXRfYWRkcjsKK307CisKK3N0cnVjdCBmb3JrX2ZyYW1lIHsKKwlzdHJ1Y3QgaW5hY3RpdmVfdGFza19mcmFtZSBmcmFtZTsKKwlzdHJ1Y3QgcHRfcmVncyByZWdzOworfTsKKwogI2RlZmluZSBzd2l0Y2hfdG8ocHJldiwgbmV4dCwgbGFzdCkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JLyoJCQkJCQkJCVwKLQkgKiBDb250ZXh0LXN3aXRjaGluZyBjbG9iYmVycyBhbGwgcmVnaXN0ZXJzLCBzbyB3ZSBjbG9iYmVyCVwKLQkgKiB0aGVtIGV4cGxpY2l0bHksIHZpYSB1bnVzZWQgb3V0cHV0IHZhcmlhYmxlcy4JCVwKLQkgKiAoRUFYIGFuZCBFQlAgaXMgbm90IGxpc3RlZCBiZWNhdXNlIEVCUCBpcyBzYXZlZC9yZXN0b3JlZAlcCi0JICogZXhwbGljaXRseSBmb3Igd2NoYW4gYWNjZXNzIGFuZCBFQVggaXMgdGhlIHJldHVybiB2YWx1ZSBvZglcCi0JICogX19zd2l0Y2hfdG8oKSkJCQkJCQlcCi0JICovCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBlYngsIGVjeCwgZWR4LCBlc2ksIGVkaTsJCQkJXAorCXByZXBhcmVfc3dpdGNoX3RvKHByZXYsIG5leHQpOwkJCQkJXAogCQkJCQkJCQkJXAotCWFzbSB2b2xhdGlsZSgicHVzaGwgJSVlYnBcblx0IgkJLyogc2F2ZSAgICBFQlAgICAqLwlcCi0JCSAgICAgIm1vdmwgJSVlc3AsJVtwcmV2X3NwXVxuXHQiCS8qIHNhdmUgICAgRVNQICAgKi8gXAotCQkgICAgICJtb3ZsICVbbmV4dF9zcF0sJSVlc3Bcblx0IgkvKiByZXN0b3JlIEVTUCAgICovIFwKLQkJICAgICAibW92bCAkMWYsJVtwcmV2X2lwXVxuXHQiCS8qIHNhdmUgICAgRUlQICAgKi8JXAotCQkgICAgICJwdXNobCAlW25leHRfaXBdXG5cdCIJLyogcmVzdG9yZSBFSVAgICAqLwlcCi0JCSAgICAgX19zd2l0Y2hfY2FuYXJ5CQkJCQlcCi0JCSAgICAgImptcCBfX3N3aXRjaF90b1xuIgkvKiByZWdwYXJtIGNhbGwgICovCVwKLQkJICAgICAiMTpcdCIJCQkJCQlcCi0JCSAgICAgInBvcGwgJSVlYnBcblx0IgkJLyogcmVzdG9yZSBFQlAgICAqLwlcCi0JCQkJCQkJCQlcCi0JCSAgICAgLyogb3V0cHV0IHBhcmFtZXRlcnMgKi8JCQkJXAotCQkgICAgIDogW3ByZXZfc3BdICI9bSIgKHByZXYtPnRocmVhZC5zcCksCQlcCi0JCSAgICAgICBbcHJldl9pcF0gIj1tIiAocHJldi0+dGhyZWFkLmlwKSwJCVwKLQkJICAgICAgICI9YSIgKGxhc3QpLAkJCQkJXAotCQkJCQkJCQkJXAotCQkgICAgICAgLyogY2xvYmJlcmVkIG91dHB1dCByZWdpc3RlcnM6ICovCQlcCi0JCSAgICAgICAiPWIiIChlYngpLCAiPWMiIChlY3gpLCAiPWQiIChlZHgpLAkJXAotCQkgICAgICAgIj1TIiAoZXNpKSwgIj1EIiAoZWRpKQkJCQlcCi0JCSAgICAgICAJCQkJCQkJXAotCQkgICAgICAgX19zd2l0Y2hfY2FuYXJ5X29wYXJhbQkJCQlcCi0JCQkJCQkJCQlcCi0JCSAgICAgICAvKiBpbnB1dCBwYXJhbWV0ZXJzOiAqLwkJCQlcCi0JCSAgICAgOiBbbmV4dF9zcF0gICJtIiAobmV4dC0+dGhyZWFkLnNwKSwJCVwKLQkJICAgICAgIFtuZXh0X2lwXSAgIm0iIChuZXh0LT50aHJlYWQuaXApLAkJXAotCQkgICAgICAgCQkJCQkJCVwKLQkJICAgICAgIC8qIHJlZ3Bhcm0gcGFyYW1ldGVycyBmb3IgX19zd2l0Y2hfdG8oKTogKi8JXAotCQkgICAgICAgW3ByZXZdICAgICAiYSIgKHByZXYpLAkJCQlcCi0JCSAgICAgICBbbmV4dF0gICAgICJkIiAobmV4dCkJCQkJXAotCQkJCQkJCQkJXAotCQkgICAgICAgX19zd2l0Y2hfY2FuYXJ5X2lwYXJhbQkJCQlcCi0JCQkJCQkJCQlcCi0JCSAgICAgOiAvKiByZWxvYWRlZCBzZWdtZW50IHJlZ2lzdGVycyAqLwkJCVwKLQkJCSJtZW1vcnkiKTsJCQkJCVwKKwkoKGxhc3QpID0gX19zd2l0Y2hfdG9fYXNtKChwcmV2KSwgKG5leHQpKSk7CQkJXAogfSB3aGlsZSAoMCkKIAotI2Vsc2UgLyogQ09ORklHX1g4Nl8zMiAqLwotCi0vKiBmcmFtZSBwb2ludGVyIG11c3QgYmUgbGFzdCBmb3IgZ2V0X3djaGFuICovCi0jZGVmaW5lIFNBVkVfQ09OVEVYVCAgICAicHVzaHEgJSVyYnAgOyBtb3ZxICUlcnNpLCUlcmJwXG5cdCIKLSNkZWZpbmUgUkVTVE9SRV9DT05URVhUICJtb3ZxICUlcmJwLCUlcnNpIDsgcG9wcSAlJXJicFx0IgotCi0jZGVmaW5lIF9fRVhUUkFfQ0xPQkJFUiAgXAotCSwgInJjeCIsICJyYngiLCAicmR4IiwgInI4IiwgInI5IiwgInIxMCIsICJyMTEiLCBcCi0JICAicjEyIiwgInIxMyIsICJyMTQiLCAicjE1IiwgImZsYWdzIgotCi0jaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCi0jZGVmaW5lIF9fc3dpdGNoX2NhbmFyeQkJCQkJCQkgIFwKLQkibW92cSAlUFt0YXNrX2NhbmFyeV0oJSVyc2kpLCUlcjhcblx0IgkJCQkgIFwKLQkibW92cSAlJXI4LCJfX3BlcmNwdV9hcmcoW2dzX2NhbmFyeV0pIlxuXHQiCi0jZGVmaW5lIF9fc3dpdGNoX2NhbmFyeV9vcGFyYW0JCQkJCQkgIFwKLQksIFtnc19jYW5hcnldICI9bSIgKGlycV9zdGFja191bmlvbi5zdGFja19jYW5hcnkpCi0jZGVmaW5lIF9fc3dpdGNoX2NhbmFyeV9pcGFyYW0JCQkJCQkgIFwKLQksIFt0YXNrX2NhbmFyeV0gImkiIChvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHN0YWNrX2NhbmFyeSkpCi0jZWxzZQkvKiBDQ19TVEFDS1BST1RFQ1RPUiAqLwotI2RlZmluZSBfX3N3aXRjaF9jYW5hcnkKLSNkZWZpbmUgX19zd2l0Y2hfY2FuYXJ5X29wYXJhbQotI2RlZmluZSBfX3N3aXRjaF9jYW5hcnlfaXBhcmFtCi0jZW5kaWYJLyogQ0NfU1RBQ0tQUk9URUNUT1IgKi8KLQotLyoKLSAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2F2ZSBvciByZXN0b3JlIGZsYWdzLCBiZWNhdXNlIGZsYWdzIGFyZSBhbHdheXMKLSAqIGNsZWFuIGluIGtlcm5lbCBtb2RlLCB3aXRoIHRoZSBwb3NzaWJsZSBleGNlcHRpb24gb2YgSU9QTC4gIEtlcm5lbCBJT1BMCi0gKiBoYXMgbm8gZWZmZWN0LgotICovCi0jZGVmaW5lIHN3aXRjaF90byhwcmV2LCBuZXh0LCBsYXN0KSBcCi0JYXNtIHZvbGF0aWxlKFNBVkVfQ09OVEVYVAkJCQkJICBcCi0JICAgICAibW92cSAlJXJzcCwlUFt0aHJlYWRyc3BdKCVbcHJldl0pXG5cdCIgLyogc2F2ZSBSU1AgKi8JICBcCi0JICAgICAibW92cSAlUFt0aHJlYWRyc3BdKCVbbmV4dF0pLCUlcnNwXG5cdCIgLyogcmVzdG9yZSBSU1AgKi8JICBcCi0JICAgICAiY2FsbCBfX3N3aXRjaF90b1xuXHQiCQkJCQkgIFwKLQkgICAgICJtb3ZxICJfX3BlcmNwdV9hcmcoW2N1cnJlbnRfdGFza10pIiwlJXJzaVxuXHQiCQkgIFwKLQkgICAgIF9fc3dpdGNoX2NhbmFyeQkJCQkJCSAgXAotCSAgICAgIm1vdnEgJVBbdGhyZWFkX2luZm9dKCUlcnNpKSwlJXI4XG5cdCIJCQkgIFwKLQkgICAgICJtb3ZxICUlcmF4LCUlcmRpXG5cdCIgCQkJCQkgIFwKLQkgICAgICJ0ZXN0bCAgJVtfdGlmX2ZvcmtdLCVQW3RpX2ZsYWdzXSglJXI4KVxuXHQiCQkgIFwKLQkgICAgICJqbnogICByZXRfZnJvbV9mb3JrXG5cdCIJCQkJCSAgXAotCSAgICAgUkVTVE9SRV9DT05URVhUCQkJCQkJICBcCi0JICAgICA6ICI9YSIgKGxhc3QpCQkJCQkgIAkgIFwKLQkgICAgICAgX19zd2l0Y2hfY2FuYXJ5X29wYXJhbQkJCQkJICBcCi0JICAgICA6IFtuZXh0XSAiUyIgKG5leHQpLCBbcHJldl0gIkQiIChwcmV2KSwJCQkgIFwKLQkgICAgICAgW3RocmVhZHJzcF0gImkiIChvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5zcCkpLCBcCi0JICAgICAgIFt0aV9mbGFnc10gImkiIChvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGZsYWdzKSksCSAgXAotCSAgICAgICBbX3RpZl9mb3JrXSAiaSIgKF9USUZfRk9SSyksCQkJICAJICBcCi0JICAgICAgIFt0aHJlYWRfaW5mb10gImkiIChvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHN0YWNrKSksICAgXAotCSAgICAgICBbY3VycmVudF90YXNrXSAibSIgKGN1cnJlbnRfdGFzaykJCQkgIFwKLQkgICAgICAgX19zd2l0Y2hfY2FuYXJ5X2lwYXJhbQkJCQkJICBcCi0JICAgICA6ICJtZW1vcnkiLCAiY2MiIF9fRVhUUkFfQ0xPQkJFUikKLQotI2VuZGlmIC8qIENPTkZJR19YODZfMzIgKi8KLQogI2VuZGlmIC8qIF9BU01fWDg2X1NXSVRDSF9UT19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXNjYWxsLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKaW5kZXggNGUyM2RkMS4uZTNjOTVlOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzY2FsbC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c2NhbGwuaApAQCAtNjAsNyArNjAsNyBAQAogCSAqIFRTX0NPTVBBVCBpcyBzZXQgZm9yIDMyLWJpdCBzeXNjYWxsIGVudHJpZXMgYW5kIHRoZW4KIAkgKiByZW1haW5zIHNldCB1bnRpbCB3ZSByZXR1cm4gdG8gdXNlciBtb2RlLgogCSAqLwotCWlmICh0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5zdGF0dXMgJiAoVFNfQ09NUEFUfFRTX0kzODZfUkVHU19QT0tFRCkpCisJaWYgKHRhc2stPnRocmVhZC5zdGF0dXMgJiAoVFNfQ09NUEFUfFRTX0kzODZfUkVHU19QT0tFRCkpCiAJCS8qCiAJCSAqIFNpZ24tZXh0ZW5kIHRoZSB2YWx1ZSBzbyAoaW50KS1FRk9PIGJlY29tZXMgKGxvbmcpLUVGT08KIAkJICogYW5kIHdpbGwgbWF0Y2ggY29ycmVjdGx5IGluIGNvbXBhcmlzb25zLgpAQCAtMTE2LDcgKzExNiw3IEBACiAJCQkJCSB1bnNpZ25lZCBsb25nICphcmdzKQogewogIyBpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLQlpZiAodGFza190aHJlYWRfaW5mbyh0YXNrKS0+c3RhdHVzICYgVFNfQ09NUEFUKQorCWlmICh0YXNrLT50aHJlYWQuc3RhdHVzICYgVFNfQ09NUEFUKQogCQlzd2l0Y2ggKGkpIHsKIAkJY2FzZSAwOgogCQkJaWYgKCFuLS0pIGJyZWFrOwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCQkJCSBjb25zdCB1bnNpZ25lZCBsb25nICphcmdzKQogewogIyBpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLQlpZiAodGFza190aHJlYWRfaW5mbyh0YXNrKS0+c3RhdHVzICYgVFNfQ09NUEFUKQorCWlmICh0YXNrLT50aHJlYWQuc3RhdHVzICYgVFNfQ09NUEFUKQogCQlzd2l0Y2ggKGkpIHsKIAkJY2FzZSAwOgogCQkJaWYgKCFuLS0pIGJyZWFrOwpAQCAtMjM0LDE4ICsyMzQsOCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBzeXNjYWxsX2dldF9hcmNoKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi0JLyoKLQkgKiBUU19DT01QQVQgaXMgc2V0IGZvciAzMi1iaXQgc3lzY2FsbCBlbnRyeSBhbmQgdGhlbgotCSAqIHJlbWFpbnMgc2V0IHVudGlsIHdlIHJldHVybiB0byB1c2VyIG1vZGUuCi0JICoKLQkgKiB4MzIgdGFza3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgQVVESVRfQVJDSF9YODZfNjQuCi0JICovCi0JaWYgKHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCktPnN0YXR1cyAmIFRTX0NPTVBBVCkKLQkJcmV0dXJuIEFVRElUX0FSQ0hfSTM4NjsKLSNlbmRpZgotCS8qIEJvdGggeDMyIGFuZCB4ODZfNjQgYXJlIGNvbnNpZGVyZWQgIjY0LWJpdCIuICovCi0JcmV0dXJuIEFVRElUX0FSQ0hfWDg2XzY0OworCS8qIHgzMiB0YXNrcyBzaG91bGQgYmUgY29uc2lkZXJlZCBBVURJVF9BUkNIX1g4Nl82NC4gKi8KKwlyZXR1cm4gaW5faWEzMl9zeXNjYWxsKCkgPyBBVURJVF9BUkNIX0kzODYgOiBBVURJVF9BUkNIX1g4Nl82NDsKIH0KICNlbmRpZgkvKiBDT05GSUdfWDg2XzMyICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDhiN2M4ZDguLjJhYWNhNTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtNTIsMjEgKzUyLDYgQEAKICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogCi1zdHJ1Y3QgdGhyZWFkX2luZm8gewotCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlfX3UzMgkJCWZsYWdzOwkJLyogbG93IGxldmVsIGZsYWdzICovCi0JX191MzIJCQlzdGF0dXM7CQkvKiB0aHJlYWQgc3luY2hyb25vdXMgZmxhZ3MgKi8KLQlfX3UzMgkJCWNwdTsJCS8qIGN1cnJlbnQgQ1BVICovCi19OwotCi0jZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKLXsJCQkJCQlcCi0JLnRhc2sJCT0gJnRzaywJCQlcCi0JLmZsYWdzCQk9IDAsCQkJXAotCS5jcHUJCT0gMCwJCQlcCi19Ci0KLSNkZWZpbmUgaW5pdF90aHJlYWRfaW5mbwkoaW5pdF90aHJlYWRfdW5pb24udGhyZWFkX2luZm8pCiAjZGVmaW5lIGluaXRfc3RhY2sJCShpbml0X3RocmVhZF91bmlvbi5zdGFjaykKIAogI2Vsc2UgLyogIV9fQVNTRU1CTFlfXyAqLwpAQCAtOTUsNyArODAsNiBAQAogI2RlZmluZSBUSUZfVVBST0JFCQkxMgkvKiBicmVha3BvaW50ZWQgb3Igc2luZ2xlc3RlcHBpbmcgKi8KICNkZWZpbmUgVElGX05PVFNDCQkxNgkvKiBUU0MgaXMgbm90IGFjY2Vzc2libGUgaW4gdXNlcmxhbmQgKi8KICNkZWZpbmUgVElGX0lBMzIJCTE3CS8qIElBMzIgY29tcGF0aWJpbGl0eSBwcm9jZXNzICovCi0jZGVmaW5lIFRJRl9GT1JLCQkxOAkvKiByZXRfZnJvbV9mb3JrICovCiAjZGVmaW5lIFRJRl9OT0haCQkxOQkvKiBpbiBhZGFwdGl2ZSBub2h6IG1vZGUgKi8KICNkZWZpbmUgVElGX01FTURJRQkJMjAJLyogaXMgdGVybWluYXRpbmcgZHVlIHRvIE9PTSBraWxsZXIgKi8KICNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHCTIxCS8qIGlkbGUgaXMgcG9sbGluZyBmb3IgVElGX05FRURfUkVTQ0hFRCAqLwpAQCAtMTE5LDcgKzEwMyw2IEBACiAjZGVmaW5lIF9USUZfVVBST0JFCQkoMSA8PCBUSUZfVVBST0JFKQogI2RlZmluZSBfVElGX05PVFNDCQkoMSA8PCBUSUZfTk9UU0MpCiAjZGVmaW5lIF9USUZfSUEzMgkJKDEgPDwgVElGX0lBMzIpCi0jZGVmaW5lIF9USUZfRk9SSwkJKDEgPDwgVElGX0ZPUkspCiAjZGVmaW5lIF9USUZfTk9IWgkJKDEgPDwgVElGX05PSFopCiAjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcJKDEgPDwgVElGX1BPTExJTkdfTlJGTEFHKQogI2RlZmluZSBfVElGX0lPX0JJVE1BUAkJKDEgPDwgVElGX0lPX0JJVE1BUCkKQEAgLTE2MCwxMSArMTQzLDYgQEAKICAqLwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgdGhyZWFkX2luZm8gKmN1cnJlbnRfdGhyZWFkX2luZm8odm9pZCkKLXsKLQlyZXR1cm4gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKShjdXJyZW50X3RvcF9vZl9zdGFjaygpIC0gVEhSRUFEX1NJWkUpOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3VycmVudF9zdGFja19wb2ludGVyKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBzcDsKQEAgLTIyNiw2MCArMjA0LDE5IEBACiAjIGRlZmluZSBjcHVfY3VycmVudF90b3Bfb2Zfc3RhY2sgKGNwdV90c3MgKyBUU1Nfc3AwKQogI2VuZGlmCiAKLS8qCi0gKiBBU00gb3BlcmFuZCB3aGljaCBldmFsdWF0ZXMgdG8gYSAndGhyZWFkX2luZm8nIGFkZHJlc3Mgb2YKLSAqIHRoZSBjdXJyZW50IHRhc2ssIGlmIGl0IGlzIGtub3duIHRoYXQgInJlZyIgaXMgZXhhY3RseSAib2ZmIgotICogYnl0ZXMgYmVsb3cgdGhlIHRvcCBvZiB0aGUgc3RhY2sgY3VycmVudGx5LgotICoKLSAqICggVGhlIGtlcm5lbCBzdGFjaydzIHNpemUgaXMga25vd24gYXQgYnVpbGQgdGltZSwgaXQgaXMgdXN1YWxseQotICogICAyIG9yIDQgcGFnZXMsIGFuZCB0aGUgYm90dG9tICBvZiB0aGUga2VybmVsIHN0YWNrIGNvbnRhaW5zCi0gKiAgIHRoZSB0aHJlYWRfaW5mbyBzdHJ1Y3R1cmUuIFNvIHRvIGFjY2VzcyB0aGUgdGhyZWFkX2luZm8gdmVyeQotICogICBxdWlja2x5IGZyb20gYXNzZW1ibHkgY29kZSB3ZSBjYW4gY2FsY3VsYXRlIGRvd24gZnJvbSB0aGUKLSAqICAgdG9wIG9mIHRoZSBrZXJuZWwgc3RhY2sgdG8gdGhlIGJvdHRvbSwgdXNpbmcgY29uc3RhbnQsCi0gKiAgIGJ1aWxkLXRpbWUgY2FsY3VsYXRpb25zIG9ubHkuICkKLSAqCi0gKiBGb3IgZXhhbXBsZSwgdG8gZmV0Y2ggdGhlIGN1cnJlbnQgdGhyZWFkX2luZm8tPmZsYWdzIHZhbHVlIGludG8gJWVheAotICogb24geDg2LTY0IGRlZmNvbmZpZyBrZXJuZWxzLCBpbiBzeXNjYWxsIGVudHJ5IGNvZGUgd2hlcmUgUlNQIGlzCi0gKiBjdXJyZW50bHkgYXQgZXhhY3RseSBTSVpFT0ZfUFRSRUdTIGJ5dGVzIGF3YXkgZnJvbSB0aGUgdG9wIG9mIHRoZQotICogc3RhY2s6Ci0gKgotICogICAgICBtb3YgQVNNX1RIUkVBRF9JTkZPKFRJX2ZsYWdzLCAlcnNwLCBTSVpFT0ZfUFRSRUdTKSwgJWVheAotICoKLSAqIHdpbGwgdHJhbnNsYXRlIHRvOgotICoKLSAqICAgICAgOGIgODQgMjQgYjggYzAgZmYgZmYgICAgICBtb3YgICAgLTB4M2Y0OCglcnNwKSwgJWVheAotICoKLSAqIHdoaWNoIGlzIGJlbG93IHRoZSBjdXJyZW50IFJTUCBieSBhbG1vc3QgMTZLLgotICovCi0jZGVmaW5lIEFTTV9USFJFQURfSU5GTyhmaWVsZCwgcmVnLCBvZmYpICgoZmllbGQpKyhvZmYpLVRIUkVBRF9TSVpFKShyZWcpCi0KICNlbmRpZgogCi0vKgotICogVGhyZWFkLXN5bmNocm9ub3VzIHN0YXR1cy4KLSAqCi0gKiBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBmbGFncyBpbiB0aGF0IG5vYm9keSBlbHNlCi0gKiBldmVyIHRvdWNoZXMgb3VyIHRocmVhZC1zeW5jaHJvbm91cyBzdGF0dXMsIHNvIHdlIGRvbid0Ci0gKiBoYXZlIHRvIHdvcnJ5IGFib3V0IGF0b21pYyBhY2Nlc3Nlcy4KLSAqLwotI2RlZmluZSBUU19DT01QQVQJCTB4MDAwMgkvKiAzMmJpdCBzeXNjYWxsIGFjdGl2ZSAoNjRCSVQpKi8KICNpZmRlZiBDT05GSUdfQ09NUEFUCiAjZGVmaW5lIFRTX0kzODZfUkVHU19QT0tFRAkweDAwMDQJLyogcmVncyBwb2tlZCBieSAzMi1iaXQgcHRyYWNlciAqLwogI2VuZGlmCi0KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBpbl9pYTMyX3N5c2NhbGwodm9pZCkKLXsKICNpZmRlZiBDT05GSUdfWDg2XzMyCi0JcmV0dXJuIHRydWU7CisjZGVmaW5lIGluX2lhMzJfc3lzY2FsbCgpIHRydWUKKyNlbHNlCisjZGVmaW5lIGluX2lhMzJfc3lzY2FsbCgpIChJU19FTkFCTEVEKENPTkZJR19JQTMyX0VNVUxBVElPTikgJiYgXAorCQkJICAgY3VycmVudC0+dGhyZWFkLnN0YXR1cyAmIFRTX0NPTVBBVCkKICNlbmRpZgotI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgotCWlmIChjdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmIFRTX0NPTVBBVCkKLQkJcmV0dXJuIHRydWU7Ci0jZW5kaWYKLQlyZXR1cm4gZmFsc2U7Ci19CiAKIC8qCiAgKiBGb3JjZSBzeXNjYWxsIHJldHVybiB2aWEgSVJFVCBieSBtYWtpbmcgaXQgbG9vayBhcyBpZiB0aGVyZSB3YXMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90cmFwcy5oCmluZGV4IGMzNDk2NjE5Li4wMWZkMGE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90cmFwcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmgKQEAgLTExNyw2ICsxMTcsMTIgQEAKIGV4dGVybiB2b2lkIGlzdF9iZWdpbl9ub25fYXRvbWljKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiB2b2lkIGlzdF9lbmRfbm9uX2F0b21pYyh2b2lkKTsKIAorI2lmZGVmIENPTkZJR19WTUFQX1NUQUNLCit2b2lkIF9fbm9yZXR1cm4gaGFuZGxlX3N0YWNrX292ZXJmbG93KGNvbnN0IGNoYXIgKm1lc3NhZ2UsCisJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBmYXVsdF9hZGRyZXNzKTsKKyNlbmRpZgorCiAvKiBJbnRlcnJ1cHRzL0V4Y2VwdGlvbnMgKi8KIGVudW0gewogCVg4Nl9UUkFQX0RFID0gMCwJLyogIDAsIERpdmlkZS1ieS16ZXJvICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggYTBhZTYxMC4uMjEzMWM0YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtNDMzLDcgKzQzMywxMSBAQAogI2RlZmluZSBfX2dldF91c2VyX2FzbV9leCh4LCBhZGRyLCBpdHlwZSwgcnR5cGUsIGx0eXBlKQkJCVwKIAlhc20gdm9sYXRpbGUoIjE6CW1vdiJpdHlwZSIgJTEsJSJydHlwZSIwXG4iCQlcCiAJCSAgICAgIjI6XG4iCQkJCQkJXAotCQkgICAgIF9BU01fRVhUQUJMRV9FWCgxYiwgMmIpCQkJCVwKKwkJICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCQlcCisgICAgICAgICAgICAgICAgICAgICAiMzp4b3IiaXR5cGUiICUicnR5cGUiMCwlInJ0eXBlIjBcbiIJCVwKKwkJICAgICAiICBqbXAgMmJcbiIJCQkJCVwKKwkJICAgICAiLnByZXZpb3VzXG4iCQkJCQlcCisJCSAgICAgX0FTTV9FWFRBQkxFX0VYKDFiLCAzYikJCQkJXAogCQkgICAgIDogbHR5cGUoeCkgOiAibSIgKF9fbShhZGRyKSkpCiAKICNkZWZpbmUgX19wdXRfdXNlcl9ub2NoZWNrKHgsIHB0ciwgc2l6ZSkJCQlcCkBAIC02OTcsNDQgKzcwMSwxNSBAQAogdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sgX2NvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sCiAJCQkJCSB1bnNpZ25lZCBuKTsKIAotI2lmZGVmIENPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwotIyBkZWZpbmUgY29weV91c2VyX2RpYWcgX19jb21waWxldGltZV9lcnJvcgotI2Vsc2UKLSMgZGVmaW5lIGNvcHlfdXNlcl9kaWFnIF9fY29tcGlsZXRpbWVfd2FybmluZwotI2VuZGlmCitleHRlcm4gdm9pZCBfX2NvbXBpbGV0aW1lX2Vycm9yKCJ1c2VyY29weSBidWZmZXIgc2l6ZSBpcyB0b28gc21hbGwiKQorX19iYWRfY29weV91c2VyKHZvaWQpOwogCi1leHRlcm4gdm9pZCBjb3B5X3VzZXJfZGlhZygiY29weV9mcm9tX3VzZXIoKSBidWZmZXIgc2l6ZSBpcyB0b28gc21hbGwiKQotY29weV9mcm9tX3VzZXJfb3ZlcmZsb3codm9pZCk7Ci1leHRlcm4gdm9pZCBjb3B5X3VzZXJfZGlhZygiY29weV90b191c2VyKCkgYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsIikKLWNvcHlfdG9fdXNlcl9vdmVyZmxvdyh2b2lkKSBfX2FzbV9fKCJjb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyIpOwotCi0jdW5kZWYgY29weV91c2VyX2RpYWcKLQotI2lmZGVmIENPTkZJR19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwotCi1leHRlcm4gdm9pZAotX19jb21waWxldGltZV93YXJuaW5nKCJjb3B5X2Zyb21fdXNlcigpIGJ1ZmZlciBzaXplIGlzIG5vdCBwcm92YWJseSBjb3JyZWN0IikKLV9fY29weV9mcm9tX3VzZXJfb3ZlcmZsb3codm9pZCkgX19hc21fXygiY29weV9mcm9tX3VzZXJfb3ZlcmZsb3ciKTsKLSNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyhzaXplLCBjb3VudCkgX19jb3B5X2Zyb21fdXNlcl9vdmVyZmxvdygpCi0KLWV4dGVybiB2b2lkCi1fX2NvbXBpbGV0aW1lX3dhcm5pbmcoImNvcHlfdG9fdXNlcigpIGJ1ZmZlciBzaXplIGlzIG5vdCBwcm92YWJseSBjb3JyZWN0IikKLV9fY29weV90b191c2VyX292ZXJmbG93KHZvaWQpIF9fYXNtX18oImNvcHlfZnJvbV91c2VyX292ZXJmbG93Iik7Ci0jZGVmaW5lIF9fY29weV90b191c2VyX292ZXJmbG93KHNpemUsIGNvdW50KSBfX2NvcHlfdG9fdXNlcl9vdmVyZmxvdygpCi0KLSNlbHNlCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19jb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyhpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X3VzZXJfb3ZlcmZsb3coaW50IHNpemUsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CiAJV0FSTigxLCAiQnVmZmVyIG92ZXJmbG93IGRldGVjdGVkICglZCA8ICVsdSkhXG4iLCBzaXplLCBjb3VudCk7CiB9CiAKLSNkZWZpbmUgX19jb3B5X3RvX3VzZXJfb3ZlcmZsb3cgX19jb3B5X2Zyb21fdXNlcl9vdmVyZmxvdwotCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjaworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjawogY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJaW50IHN6ID0gX19jb21waWxldGltZV9vYmplY3Rfc2l6ZSh0byk7CkBAIC03NDMsMzYgKzcxOCwxOCBAQAogCiAJa2FzYW5fY2hlY2tfd3JpdGUodG8sIG4pOwogCi0JLyoKLQkgKiBXaGlsZSB3ZSB3b3VsZCBsaWtlIHRvIGhhdmUgdGhlIGNvbXBpbGVyIGRvIHRoZSBjaGVja2luZyBmb3IgdXMKLQkgKiBldmVuIGluIHRoZSBub24tY29uc3RhbnQgc2l6ZSBjYXNlLCBhbnkgZmFsc2UgcG9zaXRpdmVzIHRoZXJlIGFyZQotCSAqIGEgcHJvYmxlbSAoZXNwZWNpYWxseSB3aGVuIERFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTLCBidXQgZXZlbgotCSAqIHdpdGhvdXQgLSB0aGUgW2hvcGVmdWxseV0gZGFuZ2Vyb3VzIGxvb2tpbmcgbmF0dXJlIG9mIHRoZSB3YXJuaW5nCi0JICogd291bGQgbWFrZSBwZW9wbGUgZ28gbG9vayBhdCB0aGUgcmVzcGVjaXRpdmUgY2FsbCBzaXRlcyBvdmVyIGFuZAotCSAqIG92ZXIgYWdhaW4ganVzdCB0byBmaW5kIHRoYXQgdGhlcmUncyBubyBwcm9ibGVtKS4KLQkgKgotCSAqIEFuZCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgaXQncyBqdXN0IG5vdCByZWFsaXN0aWMgZm9yIHRoZSBjb21waWxlcgotCSAqIHRvIHByb3ZlIHRoZSBjb3VudCB0byBiZSBpbiByYW5nZS4gRm9yIGV4YW1wbGUgd2hlbiBtdWx0aXBsZSBjYWxsCi0JICogc2l0ZXMgb2YgYSBoZWxwZXIgZnVuY3Rpb24gLSBwZXJoYXBzIGluIGRpZmZlcmVudCBzb3VyY2UgZmlsZXMgLQotCSAqIGFsbCBkb2luZyBwcm9wZXIgcmFuZ2UgY2hlY2tpbmcsIHlldCB0aGUgaGVscGVyIGZ1bmN0aW9uIG5vdCBkb2luZwotCSAqIHNvIGFnYWluLgotCSAqCi0JICogVGhlcmVmb3JlIGxpbWl0IHRoZSBjb21waWxlIHRpbWUgY2hlY2tpbmcgdG8gdGhlIGNvbnN0YW50IHNpemUKLQkgKiBjYXNlLCBhbmQgZG8gb25seSBydW50aW1lIGNoZWNraW5nIGZvciBub24tY29uc3RhbnQgc2l6ZXMuCi0JICovCi0KIAlpZiAobGlrZWx5KHN6IDwgMCB8fCBzeiA+PSBuKSkgewogCQljaGVja19vYmplY3Rfc2l6ZSh0bywgbiwgZmFsc2UpOwogCQluID0gX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKLQl9IGVsc2UgaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQotCQljb3B5X2Zyb21fdXNlcl9vdmVyZmxvdygpOworCX0gZWxzZSBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQorCQljb3B5X3VzZXJfb3ZlcmZsb3coc3osIG4pOwogCWVsc2UKLQkJX19jb3B5X2Zyb21fdXNlcl9vdmVyZmxvdyhzeiwgbik7CisJCV9fYmFkX2NvcHlfdXNlcigpOwogCiAJcmV0dXJuIG47CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgbG9uZyBfX211c3RfY2hlY2sKIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlpbnQgc3ogPSBfX2NvbXBpbGV0aW1lX29iamVjdF9zaXplKGZyb20pOwpAQCAtNzgxLDIxICs3MzgsMTcgQEAKIAogCW1pZ2h0X2ZhdWx0KCk7CiAKLQkvKiBTZWUgdGhlIGNvbW1lbnQgaW4gY29weV9mcm9tX3VzZXIoKSBhYm92ZS4gKi8KIAlpZiAobGlrZWx5KHN6IDwgMCB8fCBzeiA+PSBuKSkgewogCQljaGVja19vYmplY3Rfc2l6ZShmcm9tLCBuLCB0cnVlKTsKIAkJbiA9IF9jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pOwotCX0gZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpCi0JCWNvcHlfdG9fdXNlcl9vdmVyZmxvdygpOworCX0gZWxzZSBpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQorCQljb3B5X3VzZXJfb3ZlcmZsb3coc3osIG4pOwogCWVsc2UKLQkJX19jb3B5X3RvX3VzZXJfb3ZlcmZsb3coc3osIG4pOworCQlfX2JhZF9jb3B5X3VzZXIoKTsKIAogCXJldHVybiBuOwogfQogCi0jdW5kZWYgX19jb3B5X2Zyb21fdXNlcl9vdmVyZmxvdwotI3VuZGVmIF9fY29weV90b191c2VyX292ZXJmbG93Ci0KIC8qCiAgKiBXZSByZWx5IG9uIHRoZSBuZXN0ZWQgTk1JIHdvcmsgdG8gYWxsb3cgYXRvbWljIGZhdWx0cyBmcm9tIHRoZSBOTUkgcGF0aDsgdGhlCiAgKiBuZXN0ZWQgTk1JIHBhdGhzIGFyZSBjYXJlZnVsIHRvIHByZXNlcnZlIENSMi4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Vud2luZC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW53aW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiNmQxYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Vud2luZC5oCkBAIC0wLDAgKzEsNzMgQEAKKyNpZm5kZWYgX0FTTV9YODZfVU5XSU5EX0gKKyNkZWZpbmUgX0FTTV9YODZfVU5XSU5EX0gKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CisKK3N0cnVjdCB1bndpbmRfc3RhdGUgeworCXN0cnVjdCBzdGFja19pbmZvIHN0YWNrX2luZm87CisJdW5zaWduZWQgbG9uZyBzdGFja19tYXNrOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlpbnQgZ3JhcGhfaWR4OworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJdW5zaWduZWQgbG9uZyAqYnA7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgKnNwOworI2VuZGlmCit9OworCit2b2lkIF9fdW53aW5kX3N0YXJ0KHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqZmlyc3RfZnJhbWUpOworCitib29sIHVud2luZF9uZXh0X2ZyYW1lKHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlKTsKKworc3RhdGljIGlubGluZSBib29sIHVud2luZF9kb25lKHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlKQoreworCXJldHVybiBzdGF0ZS0+c3RhY2tfaW5mby50eXBlID09IFNUQUNLX1RZUEVfVU5LTk9XTjsKK30KKworc3RhdGljIGlubGluZQordm9pZCB1bndpbmRfc3RhcnQoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqZmlyc3RfZnJhbWUpCit7CisJZmlyc3RfZnJhbWUgPSBmaXJzdF9mcmFtZSA/IDogZ2V0X3N0YWNrX3BvaW50ZXIodGFzaywgcmVncyk7CisKKwlfX3Vud2luZF9zdGFydChzdGF0ZSwgdGFzaywgcmVncywgZmlyc3RfZnJhbWUpOworfQorCisjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKKworc3RhdGljIGlubGluZQordW5zaWduZWQgbG9uZyAqdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzc19wdHIoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpCit7CisJaWYgKHVud2luZF9kb25lKHN0YXRlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gc3RhdGUtPmJwICsgMTsKK30KKwordW5zaWduZWQgbG9uZyB1bndpbmRfZ2V0X3JldHVybl9hZGRyZXNzKHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlKTsKKworI2Vsc2UgLyogIUNPTkZJR19GUkFNRV9QT0lOVEVSICovCisKK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGxvbmcgKnVud2luZF9nZXRfcmV0dXJuX2FkZHJlc3NfcHRyKHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lCit1bnNpZ25lZCBsb25nIHVud2luZF9nZXRfcmV0dXJuX2FkZHJlc3Moc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpCit7CisJaWYgKHVud2luZF9kb25lKHN0YXRlKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZnRyYWNlX2dyYXBoX3JldF9hZGRyKHN0YXRlLT50YXNrLCAmc3RhdGUtPmdyYXBoX2lkeCwKKwkJCQkgICAgICpzdGF0ZS0+c3AsIHN0YXRlLT5zcCk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfRlJBTUVfUE9JTlRFUiAqLworCisjZW5kaWYgLyogX0FTTV9YODZfVU5XSU5EX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2JhdS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKaW5kZXggY2M0NGQ5Mi4uNTdhYjg2ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKQEAgLTQ5LDE0ICs0OSwxMiBAQAogI2RlZmluZSBVVl9ORVRfRU5EUE9JTlRfSU5URAkJKGlzX3V2MV9odWIoKSA/CQkJXAogCQkJVVYxX05FVF9FTkRQT0lOVF9JTlREIDogVVYyX05FVF9FTkRQT0lOVF9JTlREKQogI2RlZmluZSBVVl9ERVNDX1BTSElGVAkJCTQ5Ci0jZGVmaW5lIFVWX1BBWUxPQURRX1BOT0RFX1NISUZUCQk0OQorI2RlZmluZSBVVl9QQVlMT0FEUV9HTk9ERV9TSElGVAkJNDkKICNkZWZpbmUgVVZfUFRDX0JBU0VOQU1FCQkJInNnaV91di9wdGNfc3RhdGlzdGljcyIKICNkZWZpbmUgVVZfQkFVX0JBU0VOQU1FCQkJInNnaV91di9iYXVfdHVuYWJsZXMiCiAjZGVmaW5lIFVWX0JBVV9UVU5BQkxFU19ESVIJCSJzZ2lfdXYiCiAjZGVmaW5lIFVWX0JBVV9UVU5BQkxFU19GSUxFCQkiYmF1X3R1bmFibGVzIgogI2RlZmluZSBXSElURVNQQUNFCQkJIiBcdFxuIgotI2RlZmluZSB1dl9tbWFzawkJCSgoMVVMIDw8IHV2X2h1Yl9pbmZvLT5tX3ZhbCkgLSAxKQotI2RlZmluZSB1dl9waHlzbm9kZWFkZHIoeCkJCSgoX19wYSgodW5zaWduZWQgbG9uZykoeCkpICYgdXZfbW1hc2spKQogI2RlZmluZSBjcHViaXRfaXNzZXQoY3B1LCBiYXVfbG9jYWxfY3B1bWFzaykgXAogCXRlc3RfYml0KChjcHUpLCAoYmF1X2xvY2FsX2NwdW1hc2spLmJpdHMpCiAKQEAgLTM4Nyw2ICszODUsMTcgQEAKIAkvKiBiaXRzIDEyNzoxMjAgKi8KIH07CiAKKy8qIEFic3RyYWN0ZWQgQkFVIGZ1bmN0aW9ucyAqLworc3RydWN0IGJhdV9vcGVyYXRpb25zIHsKKwl1bnNpZ25lZCBsb25nICgqcmVhZF9sX3N3X2Fjaykodm9pZCk7CisJdW5zaWduZWQgbG9uZyAoKnJlYWRfZ19zd19hY2spKGludCBwbm9kZSk7CisJdW5zaWduZWQgbG9uZyAoKmJhdV9ncGFfdG9fb2Zmc2V0KSh1bnNpZ25lZCBsb25nIHZhZGRyKTsKKwl2b2lkICgqd3JpdGVfbF9zd19hY2spKHVuc2lnbmVkIGxvbmcgbW1yKTsKKwl2b2lkICgqd3JpdGVfZ19zd19hY2spKGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXIpOworCXZvaWQgKCp3cml0ZV9wYXlsb2FkX2ZpcnN0KShpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbW1yKTsKKwl2b2lkICgqd3JpdGVfcGF5bG9hZF9sYXN0KShpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbW1yKTsKK307CisKIC8qCiAgKiBUaGUgYWN0aXZhdGlvbiBkZXNjcmlwdG9yOgogICogVGhlIGZvcm1hdCBvZiB0aGUgbWVzc2FnZSB0byBzZW5kLCBwbHVzIGFsbCBhY2NvbXBhbnlpbmcgY29udHJvbApAQCAtNjU1LDYgKzY2NCwxNiBAQAogCXdyaXRlX2dtbXIocG5vZGUsIFVWSF9MQl9CQVVfU0JfQUNUSVZBVElPTl9DT05UUk9MLCBtbXJfaW1hZ2UpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbW1yX3Byb2NfcGF5bG9hZF9maXJzdChpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbW1yX2ltYWdlKQoreworCXdyaXRlX2dtbXIocG5vZGUsIFVWNEhfTEJfUFJPQ19JTlREX1FVRVVFX0ZJUlNULCBtbXJfaW1hZ2UpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbW1yX3Byb2NfcGF5bG9hZF9sYXN0KGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXJfaW1hZ2UpCit7CisJd3JpdGVfZ21tcihwbm9kZSwgVVY0SF9MQl9QUk9DX0lOVERfUVVFVUVfTEFTVCwgbW1yX2ltYWdlKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX21tcl9wYXlsb2FkX2ZpcnN0KGludCBwbm9kZSwgdW5zaWduZWQgbG9uZyBtbXJfaW1hZ2UpCiB7CiAJd3JpdGVfZ21tcihwbm9kZSwgVVZIX0xCX0JBVV9JTlREX1BBWUxPQURfUVVFVUVfRklSU1QsIG1tcl9pbWFnZSk7CkBAIC03MDAsNiArNzE5LDI2IEBACiAJcmV0dXJuIHJlYWRfZ21tcihwbm9kZSwgVVZIX0xCX0JBVV9JTlREX1NPRlRXQVJFX0FDS05PV0xFREdFKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX21tcl9wcm9jX3N3X2Fjayh1bnNpZ25lZCBsb25nIG1yKQoreworCXV2X3dyaXRlX2xvY2FsX21tcihVVjRIX0xCX1BST0NfSU5URF9TT0ZUX0FDS19DTEVBUiwgbXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZ21tcl9wcm9jX3N3X2FjayhpbnQgcG5vZGUsIHVuc2lnbmVkIGxvbmcgbXIpCit7CisJd3JpdGVfZ21tcihwbm9kZSwgVVY0SF9MQl9QUk9DX0lOVERfU09GVF9BQ0tfQ0xFQVIsIG1yKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfbW1yX3Byb2Nfc3dfYWNrKHZvaWQpCit7CisJcmV0dXJuIHJlYWRfbG1tcihVVjRIX0xCX1BST0NfSU5URF9TT0ZUX0FDS19QRU5ESU5HKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlYWRfZ21tcl9wcm9jX3N3X2FjayhpbnQgcG5vZGUpCit7CisJcmV0dXJuIHJlYWRfZ21tcihwbm9kZSwgVVY0SF9MQl9QUk9DX0lOVERfU09GVF9BQ0tfUEVORElORyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9tbXJfZGF0YV9jb25maWcoaW50IHBub2RlLCB1bnNpZ25lZCBsb25nIG1yKQogewogCXV2X3dyaXRlX2dsb2JhbF9tbXI2NChwbm9kZSwgVVZIX0JBVV9EQVRBX0NPTkZJRywgbXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdmRzby5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdmRzby5oCmluZGV4IDQzZGM1NWIuLjI0NDQxODkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Zkc28uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92ZHNvLmgKQEAgLTQxLDYgKzQxLDggQEAKIAogZXh0ZXJuIHZvaWQgX19pbml0IGluaXRfdmRzb19pbWFnZShjb25zdCBzdHJ1Y3QgdmRzb19pbWFnZSAqaW1hZ2UpOwogCitleHRlcm4gaW50IG1hcF92ZHNvX29uY2UoY29uc3Qgc3RydWN0IHZkc29faW1hZ2UgKmltYWdlLCB1bnNpZ25lZCBsb25nIGFkZHIpOworCiAjZW5kaWYgLyogX19BU1NFTUJMRVJfXyAqLwogCiAjZW5kaWYgLyogX0FTTV9YODZfVkRTT19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vZXZlbnRzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ZW4vZXZlbnRzLmgKaW5kZXggZTY5MTFjYS4uNjA4YTc5ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20veGVuL2V2ZW50cy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3hlbi9ldmVudHMuaApAQCAtMjAsMTUgKzIwLDQgQEAKIC8qIE5vIG5lZWQgZm9yIGEgYmFycmllciAtLSBYQ0hHIGlzIGEgYmFycmllciBvbiB4ODYuICovCiAjZGVmaW5lIHhjaGdfeGVuX3Vsb25nKHB0ciwgdmFsKSB4Y2hnKChwdHIpLCAodmFsKSkKIAotZXh0ZXJuIGludCB4ZW5faGF2ZV92ZWN0b3JfY2FsbGJhY2s7Ci0KLS8qCi0gKiBFdmVudHMgZGVsaXZlcmVkIHZpYSBwbGF0Zm9ybSBQQ0kgaW50ZXJydXB0cyBhcmUgYWx3YXlzCi0gKiByb3V0ZWQgdG8gdmNwdSAwIGFuZCBoZW5jZSBjYW5ub3QgYmUgcmVib3VuZC4KLSAqLwotc3RhdGljIGlubGluZSBib29sIHhlbl9zdXBwb3J0X2V2dGNobl9yZWJpbmQodm9pZCkKLXsKLQlyZXR1cm4gKCF4ZW5faHZtX2RvbWFpbigpIHx8IHhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjayk7Ci19Ci0KICNlbmRpZiAvKiBfQVNNX1g4Nl9YRU5fRVZFTlRTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vbWNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21jZS5oCmluZGV4IDIxODQ5NDMuLjY5YTZlMDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vbWNlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tY2UuaApAQCAtMjYsNiArMjYsOCBAQAogCV9fdTMyIHNvY2tldGlkOwkvKiBDUFUgc29ja2V0IElEICovCiAJX191MzIgYXBpY2lkOwkvKiBDUFUgaW5pdGlhbCBhcGljIElEICovCiAJX191NjQgbWNnY2FwOwkvKiBNQ0dDQVAgTVNSOiBtYWNoaW5lIGNoZWNrIGNhcGFiaWxpdGllcyBvZiBDUFUgKi8KKwlfX3U2NCBzeW5kOwkvKiBNQ0FfU1lORCBNU1I6IG9ubHkgdmFsaWQgb24gU01DQSBzeXN0ZW1zICovCisJX191NjQgaXBpZDsJLyogTUNBX0lQSUQgTVNSOiBvbmx5IHZhbGlkIG9uIFNNQ0Egc3lzdGVtcyAqLwogfTsKIAogI2RlZmluZSBNQ0VfR0VUX1JFQ09SRF9MRU4gICBfSU9SKCdNJywgMSwgaW50KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9wcmN0bC5oIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9wcmN0bC5oCmluZGV4IDNhYzUwMzIuLmFlMTM1ZGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vcHJjdGwuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3ByY3RsLmgKQEAgLTYsNCArNiwxMCBAQAogI2RlZmluZSBBUkNIX0dFVF9GUyAweDEwMDMKICNkZWZpbmUgQVJDSF9HRVRfR1MgMHgxMDA0CiAKKyNpZmRlZiBDT05GSUdfQ0hFQ0tQT0lOVF9SRVNUT1JFCisjIGRlZmluZSBBUkNIX01BUF9WRFNPX1gzMgkweDIwMDEKKyMgZGVmaW5lIEFSQ0hfTUFQX1ZEU09fMzIJMHgyMDAyCisjIGRlZmluZSBBUkNIX01BUF9WRFNPXzY0CTB4MjAwMworI2VuZGlmCisKICNlbmRpZiAvKiBfQVNNX1g4Nl9QUkNUTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMDUwM2Y1Yi4uNGRkNWQ1MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQpAQCAtODMsNiArODMsNyBAQAogb2JqLXkJCQkJKz0gYXBpYy8KIG9iai0kKENPTkZJR19YODZfUkVCT09URklYVVBTKQkrPSByZWJvb3RfZml4dXBzXzMyLm8KIG9iai0kKENPTkZJR19EWU5BTUlDX0ZUUkFDRSkJKz0gZnRyYWNlLm8KK29iai0kKENPTkZJR19MSVZFUEFUQ0gpCSs9IGxpdmVwYXRjaC5vCiBvYmotJChDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSKSArPSBmdHJhY2Uubwogb2JqLSQoQ09ORklHX0ZUUkFDRV9TWVNDQUxMUykJKz0gZnRyYWNlLm8KIG9iai0kKENPTkZJR19YODZfVFNDKQkJKz0gdHJhY2VfY2xvY2subwpAQCAtMTI1LDYgKzEyNiwxMiBAQAogb2JqLSQoQ09ORklHX1BFUkZfRVZFTlRTKQkJKz0gcGVyZl9yZWdzLm8KIG9iai0kKENPTkZJR19UUkFDSU5HKQkJCSs9IHRyYWNlcG9pbnQubwogCitpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgorb2JqLXkJCQkJCSs9IHVud2luZF9mcmFtZS5vCitlbHNlCitvYmoteQkJCQkJKz0gdW53aW5kX2d1ZXNzLm8KK2VuZGlmCisKICMjIwogIyA2NCBiaXQgc3BlY2lmaWMgZmlsZXMKIGlmZXEgKCQoQ09ORklHX1g4Nl82NCkseSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL01ha2VmaWxlIGIvYXJjaC94ODYva2VybmVsL2FjcGkvTWFrZWZpbGUKaW5kZXggMzI0MmU1OS4uMjZiNzhkOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvTWFrZWZpbGUKQEAgLTEsNiArMSw3IEBACiBvYmotJChDT05GSUdfQUNQSSkJCSs9IGJvb3Qubwogb2JqLSQoQ09ORklHX0FDUElfU0xFRVApCSs9IHNsZWVwLm8gd2FrZXVwXyQoQklUUykubwogb2JqLSQoQ09ORklHX0FDUElfQVBFSSkJCSs9IGFwZWkubworb2JqLSQoQ09ORklHX0FDUElfQ1BQQ19MSUIpCSs9IGNwcGNfbXNyLm8KIAogaWZuZXEgKCQoQ09ORklHX0FDUElfUFJPQ0VTU09SKSwpCiBvYmoteQkJCQkrPSBjc3RhdGUubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IDkwZDg0YzMuLjMyYTdkNzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTE3NiwxNSArMTc2LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICghZW5hYmxlZCkgewotCQkrK2Rpc2FibGVkX2NwdXM7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgIT0gLTFVKQotCQl2ZXIgPSBhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXTsKKwkJdmVyID0gYm9vdF9jcHVfYXBpY192ZXJzaW9uOwogCi0JY3B1ID0gZ2VuZXJpY19wcm9jZXNzb3JfaW5mbyhpZCwgdmVyKTsKKwljcHUgPSBfX2dlbmVyaWNfcHJvY2Vzc29yX2luZm8oaWQsIHZlciwgZW5hYmxlZCk7CiAJaWYgKGNwdSA+PSAwKQogCQllYXJseV9wZXJfY3B1KHg4Nl9jcHVfdG9fYWNwaWlkLCBjcHUpID0gYWNwaWlkOwogCkBAIC0yODIsNiArMjc3LDggQEAKIAlpZiAoQkFEX01BRFRfRU5UUlkobGFwaWNfYWRkcl9vdnIsIGVuZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJYWNwaV90YWJsZV9wcmludF9tYWR0X2VudHJ5KGhlYWRlcik7CisKIAlhY3BpX2xhcGljX2FkZHIgPSBsYXBpY19hZGRyX292ci0+YWRkcmVzczsKIAogCXJldHVybiAwOwpAQCAtNzA1LDcgKzcwMiw3IEBACiAjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19DUFUKICNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgogCi1zdGF0aWMgdm9pZCBhY3BpX21hcF9jcHUybm9kZShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCBjcHUsIGludCBwaHlzaWQpCitpbnQgYWNwaV9tYXBfY3B1Mm5vZGUoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgY3B1LCBpbnQgcGh5c2lkKQogewogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIAlpbnQgbmlkOwpAQCAtNzE2LDYgKzcxMyw3IEBACiAJCW51bWFfc2V0X25vZGUoY3B1LCBuaWQpOwogCX0KICNlbmRpZgorCXJldHVybiAwOwogfQogCiBpbnQgYWNwaV9tYXBfY3B1KGFjcGlfaGFuZGxlIGhhbmRsZSwgcGh5c19jcHVpZF90IHBoeXNpZCwgaW50ICpwY3B1KQpAQCAtOTk4LDIxICs5OTYsNiBAQAogCWlmICghYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FQSUMpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qCi0JICogTm90ZSB0aGF0IHRoZSBMQVBJQyBhZGRyZXNzIGlzIG9idGFpbmVkIGZyb20gdGhlIE1BRFQgKDMyLWJpdCB2YWx1ZSkKLQkgKiBhbmQgKG9wdGlvbmFsbHkpIG92ZXJyaWRkZW4gYnkgYSBMQVBJQ19BRERSX09WUiBlbnRyeSAoNjQtYml0IHZhbHVlKS4KLQkgKi8KLQotCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0xPQ0FMX0FQSUNfT1ZFUlJJREUsCi0JCQkJICAgICAgYWNwaV9wYXJzZV9sYXBpY19hZGRyX292ciwgMCk7Ci0JaWYgKGNvdW50IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCi0JCSAgICAgICAiRXJyb3IgcGFyc2luZyBMQVBJQyBhZGRyZXNzIG92ZXJyaWRlIGVudHJ5XG4iKTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXJlZ2lzdGVyX2xhcGljX2FkZHJlc3MoYWNwaV9sYXBpY19hZGRyKTsKLQogCWNvdW50ID0gYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0xPQ0FMX1NBUElDLAogCQkJCSAgICAgIGFjcGlfcGFyc2Vfc2FwaWMsIE1BWF9MT0NBTF9BUElDKTsKIApAQCAtMTAzMSw4ICsxMDE0LDggQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAotCQl4MmNvdW50ID0gbWFkdF9wcm9jWzBdLmNvdW50OwotCQljb3VudCA9IG1hZHRfcHJvY1sxXS5jb3VudDsKKwkJY291bnQgPSBtYWR0X3Byb2NbMF0uY291bnQ7CisJCXgyY291bnQgPSBtYWR0X3Byb2NbMV0uY291bnQ7CiAJfQogCWlmICghY291bnQgJiYgIXgyY291bnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiTm8gTEFQSUMgZW50cmllcyBwcmVzZW50XG4iKTsKQEAgLTE1MTMsNyArMTQ5Niw3IEBACiAJICogSWYgYWNwaV9kaXNhYmxlZCwgYmFpbCBvdXQKIAkgKi8KIAlpZiAoYWNwaV9kaXNhYmxlZCkKLQkJcmV0dXJuOyAKKwkJcmV0dXJuOwogCiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBBQ1BJIGJvb3QtdGltZSB0YWJsZSBwYXJzZXIuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jcHBjX21zci5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvY3BwY19tc3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmI0NzhiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvY3BwY19tc3IuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogY3BwY19tc3IuYzogIE1TUiBJbnRlcmZhY2UgZm9yIENQUEMKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8YWNwaS9jcHBjX2FjcGkuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisKKy8qIFJlZmVyIHRvIGRyaXZlcnMvYWNwaS9jcHBjX2FjcGkuYyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9ucyAqLworCitib29sIGNwY19mZmhfc3VwcG9ydGVkKHZvaWQpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK2ludCBjcGNfcmVhZF9mZmgoaW50IGNwdW51bSwgc3RydWN0IGNwY19yZWcgKnJlZywgdTY0ICp2YWwpCit7CisJaW50IGVycjsKKworCWVyciA9IHJkbXNybF9zYWZlX29uX2NwdShjcHVudW0sIHJlZy0+YWRkcmVzcywgdmFsKTsKKwlpZiAoIWVycikgeworCQl1NjQgbWFzayA9IEdFTk1BU0tfVUxMKHJlZy0+Yml0X29mZnNldCArIHJlZy0+Yml0X3dpZHRoIC0gMSwKKwkJCQkgICAgICAgcmVnLT5iaXRfb2Zmc2V0KTsKKworCQkqdmFsICY9IG1hc2s7CisJCSp2YWwgPj49IHJlZy0+Yml0X29mZnNldDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworaW50IGNwY193cml0ZV9mZmgoaW50IGNwdW51bSwgc3RydWN0IGNwY19yZWcgKnJlZywgdTY0IHZhbCkKK3sKKwl1NjQgcmRfdmFsOworCWludCBlcnI7CisKKwllcnIgPSByZG1zcmxfc2FmZV9vbl9jcHUoY3B1bnVtLCByZWctPmFkZHJlc3MsICZyZF92YWwpOworCWlmICghZXJyKSB7CisJCXU2NCBtYXNrID0gR0VOTUFTS19VTEwocmVnLT5iaXRfb2Zmc2V0ICsgcmVnLT5iaXRfd2lkdGggLSAxLAorCQkJCSAgICAgICByZWctPmJpdF9vZmZzZXQpOworCisJCXZhbCA8PD0gcmVnLT5iaXRfb2Zmc2V0OworCQl2YWwgJj0gbWFzazsKKwkJcmRfdmFsICY9IH5tYXNrOworCQlyZF92YWwgfD0gdmFsOworCQllcnIgPSB3cm1zcmxfc2FmZV9vbl9jcHUoY3B1bnVtLCByZWctPmFkZHJlc3MsIHJkX3ZhbCk7CisJfQorCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvc2xlZXAuYwppbmRleCBhZGIzZWFmLi40ODU4NzMzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9zbGVlcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3NsZWVwLmMKQEAgLTk5LDcgKzk5LDcgQEAKIAlzYXZlZF9tYWdpYyA9IDB4MTIzNDU2Nzg7CiAjZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KICNpZmRlZiBDT05GSUdfU01QCi0Jc3RhY2tfc3RhcnQgPSAodW5zaWduZWQgbG9uZyl0ZW1wX3N0YWNrICsgc2l6ZW9mKHRlbXBfc3RhY2spOworCWluaXRpYWxfc3RhY2sgPSAodW5zaWduZWQgbG9uZyl0ZW1wX3N0YWNrICsgc2l6ZW9mKHRlbXBfc3RhY2spOwogCWVhcmx5X2dkdF9kZXNjci5hZGRyZXNzID0KIAkJCSh1bnNpZ25lZCBsb25nKWdldF9jcHVfZ2R0X3RhYmxlKHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJaW5pdGlhbF9ncyA9IHBlcl9jcHVfb2Zmc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKaW5kZXggNTBjOTVhZi4uZjI2NmI4YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwpAQCAtNjQsNiArNjQsOCBAQAogdW5zaWduZWQgaW50IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IC0xVTsKIEVYUE9SVF9TWU1CT0xfR1BMKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CiAKK3U4IGJvb3RfY3B1X2FwaWNfdmVyc2lvbjsKKwogLyoKICAqIFRoZSBoaWdoZXN0IEFQSUMgSUQgc2VlbiBkdXJpbmcgZW51bWVyYXRpb24uCiAgKi8KQEAgLTEzNzQsNyArMTM3Niw2IEBACiAJICogQWN0dWFsbHkgZGlzYWJsaW5nIHRoZSBmb2N1cyBDUFUgY2hlY2sganVzdCBtYWtlcyB0aGUgaGFuZyBsZXNzCiAJICogZnJlcXVlbnQgYXMgaXQgbWFrZXMgdGhlIGludGVycnVwdCBkaXN0cmlidXRvbiBtb2RlbCBiZSBtb3JlCiAJICogbGlrZSBMUlUgdGhhbiBNUlUgKHRoZSBzaG9ydC10ZXJtIGxvYWQgaXMgbW9yZSBldmVuIGFjcm9zcyBDUFVzKS4KLQkgKiBTZWUgYWxzbyB0aGUgY29tbWVudCBpbiBlbmRfbGV2ZWxfaW9hcGljX2lycSgpLiAgLS1tYWNybwogCSAqLwogCiAJLyoKQEAgLTE4MTYsOCArMTgxNyw3IEBACiAJCSAqIHNpbmNlIHNtcF9zYW5pdHlfY2hlY2sgaXMgcHJlcGFyZWQgZm9yIHN1Y2ggYSBjYXNlCiAJCSAqIGFuZCBkaXNhYmxlIHNtcCBtb2RlCiAJCSAqLwotCQlhcGljX3ZlcnNpb25bbmV3X2FwaWNpZF0gPQotCQkJIEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CisJCWJvb3RfY3B1X2FwaWNfdmVyc2lvbiA9IEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CiAJfQogfQogCkBAIC0xODI4LDE3ICsxODI4LDE0IEBACiAJaWYgKCF4MmFwaWNfbW9kZSkgewogCQlzZXRfZml4bWFwX25vY2FjaGUoRklYX0FQSUNfQkFTRSwgYWRkcmVzcyk7CiAJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIm1hcHBlZCBBUElDIHRvICUxNmx4ICglMTZseClcbiIsCi0JCQkgICAgQVBJQ19CQVNFLCBtcF9sYXBpY19hZGRyKTsKKwkJCSAgICBBUElDX0JBU0UsIGFkZHJlc3MpOwogCX0KIAlpZiAoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID09IC0xVSkgewogCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgID0gcmVhZF9hcGljX2lkKCk7Ci0JCWFwaWNfdmVyc2lvbltib290X2NwdV9waHlzaWNhbF9hcGljaWRdID0KLQkJCSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOworCQlib290X2NwdV9hcGljX3ZlcnNpb24gPSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOwogCX0KIH0KIAotaW50IGFwaWNfdmVyc2lvbltNQVhfTE9DQUxfQVBJQ107Ci0KIC8qCiAgKiBMb2NhbCBBUElDIGludGVycnVwdHMKICAqLwpAQCAtMjAyNyw3ICsyMDI0LDUzIEBACiAJYXBpY193cml0ZShBUElDX0xWVDEsIHZhbHVlKTsKIH0KIAotaW50IGdlbmVyaWNfcHJvY2Vzc29yX2luZm8oaW50IGFwaWNpZCwgaW50IHZlcnNpb24pCisvKgorICogVGhlIG51bWJlciBvZiBhbGxvY2F0ZWQgbG9naWNhbCBDUFUgSURzLiBTaW5jZSBsb2dpY2FsIENQVSBJRHMgYXJlIGFsbG9jYXRlZAorICogY29udGlndW91c2x5LCBpdCBlcXVhbHMgdG8gY3VycmVudCBhbGxvY2F0ZWQgbWF4IGxvZ2ljYWwgQ1BVIElEIHBsdXMgMS4KKyAqIEFsbCBhbGxvY2F0ZWQgQ1BVIElEIHNob3VsZCBiZSBpbiBbMCwgbnJfbG9naWNhbF9jcHVpZGkpLCBzbyB0aGUgbWF4aW11bSBvZgorICogbnJfbG9naWNhbF9jcHVpZHMgaXMgbnJfY3B1X2lkcy4KKyAqCisgKiBOT1RFOiBSZXNlcnZlIDAgZm9yIEJTUC4KKyAqLworc3RhdGljIGludCBucl9sb2dpY2FsX2NwdWlkcyA9IDE7CisKKy8qCisgKiBVc2VkIHRvIHN0b3JlIG1hcHBpbmcgYmV0d2VlbiBsb2dpY2FsIENQVSBJRHMgYW5kIEFQSUMgSURzLgorICovCitzdGF0aWMgaW50IGNwdWlkX3RvX2FwaWNpZFtdID0geworCVswIC4uLiBOUl9DUFVTIC0gMV0gPSAtMSwKK307CisKKy8qCisgKiBTaG91bGQgdXNlIHRoaXMgQVBJIHRvIGFsbG9jYXRlIGxvZ2ljYWwgQ1BVIElEcyB0byBrZWVwIG5yX2xvZ2ljYWxfY3B1aWRzCisgKiBhbmQgY3B1aWRfdG9fYXBpY2lkW10gc3luY2hyb25pemVkLgorICovCitzdGF0aWMgaW50IGFsbG9jYXRlX2xvZ2ljYWxfY3B1aWQoaW50IGFwaWNpZCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogY3B1aWQgPC0+IGFwaWNpZCBtYXBwaW5nIGlzIHBlcnNpc3RlbnQsIHNvIHdoZW4gYSBjcHUgaXMgdXAsCisJICogY2hlY2sgaWYgdGhlIGtlcm5lbCBoYXMgYWxsb2NhdGVkIGEgY3B1aWQgZm9yIGl0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBucl9sb2dpY2FsX2NwdWlkczsgaSsrKSB7CisJCWlmIChjcHVpZF90b19hcGljaWRbaV0gPT0gYXBpY2lkKQorCQkJcmV0dXJuIGk7CisJfQorCisJLyogQWxsb2NhdGUgYSBuZXcgY3B1aWQuICovCisJaWYgKG5yX2xvZ2ljYWxfY3B1aWRzID49IG5yX2NwdV9pZHMpIHsKKwkJV0FSTl9PTkNFKDEsICJPbmx5ICVkIHByb2Nlc3NvcnMgc3VwcG9ydGVkLiIKKwkJCSAgICAgIlByb2Nlc3NvciAlZC8weCV4IGFuZCB0aGUgcmVzdCBhcmUgaWdub3JlZC5cbiIsCisJCQkgICAgIG5yX2NwdV9pZHMgLSAxLCBucl9sb2dpY2FsX2NwdWlkcywgYXBpY2lkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNwdWlkX3RvX2FwaWNpZFtucl9sb2dpY2FsX2NwdWlkc10gPSBhcGljaWQ7CisJcmV0dXJuIG5yX2xvZ2ljYWxfY3B1aWRzKys7Cit9CisKK2ludCBfX2dlbmVyaWNfcHJvY2Vzc29yX2luZm8oaW50IGFwaWNpZCwgaW50IHZlcnNpb24sIGJvb2wgZW5hYmxlZCkKIHsKIAlpbnQgY3B1LCBtYXggPSBucl9jcHVfaWRzOwogCWJvb2wgYm9vdF9jcHVfZGV0ZWN0ZWQgPSBwaHlzaWRfaXNzZXQoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkLApAQCAtMjA5Myw3ICsyMTM2LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbnVtX3Byb2Nlc3NvcnMrKzsKIAlpZiAoYXBpY2lkID09IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCkgewogCQkvKgogCQkgKiB4ODZfYmlvc19jcHVfYXBpY2lkIGlzIHJlcXVpcmVkIHRvIGhhdmUgcHJvY2Vzc29ycyBsaXN0ZWQKQEAgLTIxMDMsOCArMjE0NSwxNiBAQAogCQkgKiBmb3IgQlNQLgogCQkgKi8KIAkJY3B1ID0gMDsKLQl9IGVsc2UKLQkJY3B1ID0gY3B1bWFza19uZXh0X3plcm8oLTEsIGNwdV9wcmVzZW50X21hc2spOworCisJCS8qIExvZ2ljYWwgY3B1aWQgMCBpcyByZXNlcnZlZCBmb3IgQlNQLiAqLworCQljcHVpZF90b19hcGljaWRbMF0gPSBhcGljaWQ7CisJfSBlbHNlIHsKKwkJY3B1ID0gYWxsb2NhdGVfbG9naWNhbF9jcHVpZChhcGljaWQpOworCQlpZiAoY3B1IDwgMCkgeworCQkJZGlzYWJsZWRfY3B1cysrOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CiAKIAkvKgogCSAqIFRoaXMgY2FuIGhhcHBlbiBvbiBwaHlzaWNhbCBob3RwbHVnLiBUaGUgc2FuaXR5IGNoZWNrIGF0IGJvb3QgdGltZQpAQCAtMjExNiw2ICsyMTY2LDcgQEAKIAogCQlwcl93YXJuaW5nKCJBUElDOiBQYWNrYWdlIGxpbWl0IHJlYWNoZWQuIFByb2Nlc3NvciAlZC8weCV4IGlnbm9yZWQuXG4iLAogCQkJICAgdGhpc2NwdSwgYXBpY2lkKTsKKwogCQlkaXNhYmxlZF9jcHVzKys7CiAJCXJldHVybiAtRU5PU1BDOwogCX0KQEAgLTIxMjgsMTQgKzIxNzksMTIgQEAKIAkJCSAgIGNwdSwgYXBpY2lkKTsKIAkJdmVyc2lvbiA9IDB4MTA7CiAJfQotCWFwaWNfdmVyc2lvblthcGljaWRdID0gdmVyc2lvbjsKIAotCWlmICh2ZXJzaW9uICE9IGFwaWNfdmVyc2lvbltib290X2NwdV9waHlzaWNhbF9hcGljaWRdKSB7CisJaWYgKHZlcnNpb24gIT0gYm9vdF9jcHVfYXBpY192ZXJzaW9uKSB7CiAJCXByX3dhcm5pbmcoIkJJT1MgYnVnOiBBUElDIHZlcnNpb24gbWlzbWF0Y2gsIGJvb3QgQ1BVOiAleCwgQ1BVICVkOiB2ZXJzaW9uICV4XG4iLAotCQkJYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0sIGNwdSwgdmVyc2lvbik7CisJCQlib290X2NwdV9hcGljX3ZlcnNpb24sIGNwdSwgdmVyc2lvbik7CiAJfQogCi0JcGh5c2lkX3NldChhcGljaWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKIAlpZiAoYXBpY2lkID4gbWF4X3BoeXNpY2FsX2FwaWNpZCkKIAkJbWF4X3BoeXNpY2FsX2FwaWNpZCA9IGFwaWNpZDsKIApAQCAtMjE0OCwxMSArMjE5NywyMyBAQAogCQlhcGljLT54ODZfMzJfZWFybHlfbG9naWNhbF9hcGljaWQoY3B1KTsKICNlbmRpZgogCXNldF9jcHVfcG9zc2libGUoY3B1LCB0cnVlKTsKLQlzZXRfY3B1X3ByZXNlbnQoY3B1LCB0cnVlKTsKKworCWlmIChlbmFibGVkKSB7CisJCW51bV9wcm9jZXNzb3JzKys7CisJCXBoeXNpZF9zZXQoYXBpY2lkLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7CisJCXNldF9jcHVfcHJlc2VudChjcHUsIHRydWUpOworCX0gZWxzZSB7CisJCWRpc2FibGVkX2NwdXMrKzsKKwl9CiAKIAlyZXR1cm4gY3B1OwogfQogCitpbnQgZ2VuZXJpY19wcm9jZXNzb3JfaW5mbyhpbnQgYXBpY2lkLCBpbnQgdmVyc2lvbikKK3sKKwlyZXR1cm4gX19nZW5lcmljX3Byb2Nlc3Nvcl9pbmZvKGFwaWNpZCwgdmVyc2lvbiwgdHJ1ZSk7Cit9CisKIGludCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQodm9pZCkKIHsKIAlyZXR1cm4gcmVhZF9hcGljX2lkKCk7CkBAIC0yMjc1LDcgKzIzMzYsNyBAQAogCSAqIENvbXBsYWluIGlmIHRoZSBCSU9TIHByZXRlbmRzIHRoZXJlIGlzIG9uZS4KIAkgKi8KIAlpZiAoIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BUElDKSAmJgotCSAgICBBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pKSB7CisJICAgIEFQSUNfSU5URUdSQVRFRChib290X2NwdV9hcGljX3ZlcnNpb24pKSB7CiAJCXByX2VycigiQklPUyBidWcsIGxvY2FsIEFQSUMgMHgleCBub3QgZGV0ZWN0ZWQhLi4uXG4iLAogCQkJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19mbGF0XzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYwppbmRleCA1YjJhZTEwLi5hNGQ3ZmYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYwpAQCAtMjUsNyArMjUsNyBAQAogc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfcGh5c2ZsYXQ7CiBzdGF0aWMgc3RydWN0IGFwaWMgYXBpY19mbGF0OwogCi1zdHJ1Y3QgYXBpYyBfX3JlYWRfbW9zdGx5ICphcGljID0gJmFwaWNfZmxhdDsKK3N0cnVjdCBhcGljICphcGljIF9fcm9fYWZ0ZXJfaW5pdCA9ICZhcGljX2ZsYXQ7CiBFWFBPUlRfU1lNQk9MX0dQTChhcGljKTsKIAogc3RhdGljIGludCBmbGF0X2FjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpCkBAIC0xMTYsMjcgKzExNiwxNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGZsYXRfZ2V0X2FwaWNfaWQodW5zaWduZWQgbG9uZyB4KQogewotCXVuc2lnbmVkIGludCBpZDsKLQotCWlkID0gKCgoeCk+PjI0KSAmIDB4RkZ1KTsKLQotCXJldHVybiBpZDsKKwlyZXR1cm4gKHggPj4gMjQpICYgMHhGRjsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2V0X2FwaWNfaWQodW5zaWduZWQgaW50IGlkKQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQotCXggPSAoKGlkICYgMHhGRnUpPDwyNCk7Ci0JcmV0dXJuIHg7CisJcmV0dXJuIChpZCAmIDB4RkYpIDw8IDI0OwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRfeGFwaWNfaWQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0KLQlpZCA9IGZsYXRfZ2V0X2FwaWNfaWQoYXBpY19yZWFkKEFQSUNfSUQpKTsKLQlyZXR1cm4gaWQ7CisJcmV0dXJuIGZsYXRfZ2V0X2FwaWNfaWQoYXBpY19yZWFkKEFQSUNfSUQpKTsKIH0KIAogc3RhdGljIGludCBmbGF0X2FwaWNfaWRfcmVnaXN0ZXJlZCh2b2lkKQpAQCAtMTU0LDcgKzE0NCw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX2ZsYXQgPSAgeworc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfZmxhdCBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLm5hbWUJCQkJPSAiZmxhdCIsCiAJLnByb2JlCQkJCT0gZmxhdF9wcm9iZSwKIAkuYWNwaV9tYWR0X29lbV9jaGVjawkJPSBmbGF0X2FjcGlfbWFkdF9vZW1fY2hlY2ssCkBAIC0yNDgsNyArMjM4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfcGh5c2ZsYXQgPSAgeworc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfcGh5c2ZsYXQgX19yb19hZnRlcl9pbml0ID0gewogCiAJLm5hbWUJCQkJPSAicGh5c2ljYWwgZmxhdCIsCiAJLnByb2JlCQkJCT0gcGh5c2ZsYXRfcHJvYmUsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX25vb3AuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCmluZGV4IGMwNTY4OGIuLmIxMDllNDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbm9vcC5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAlXQVJOX09OX09OQ0UoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FQSUMpICYmICFkaXNhYmxlX2FwaWMpOwogfQogCi1zdHJ1Y3QgYXBpYyBhcGljX25vb3AgPSB7CitzdHJ1Y3QgYXBpYyBhcGljX25vb3AgX19yb19hZnRlcl9pbml0ID0gewogCS5uYW1lCQkJCT0gIm5vb3AiLAogCS5wcm9iZQkJCQk9IG5vb3BfcHJvYmUsCiAJLmFjcGlfbWFkdF9vZW1fY2hlY2sJCT0gTlVMTCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbnVtYWNoaXAuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbnVtYWNoaXAuYwppbmRleCA3MTRkNGZkLi5lMDhmZTJjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX251bWFjaGlwLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19udW1hY2hpcC5jCkBAIC00MCwxMCArNDAsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBudW1hY2hpcDFfc2V0X2FwaWNfaWQodW5zaWduZWQgaW50IGlkKQogewotCXVuc2lnbmVkIGxvbmcgeDsKLQotCXggPSAoKGlkICYgMHhmZlUpIDw8IDI0KTsKLQlyZXR1cm4geDsKKwlyZXR1cm4gKGlkICYgMHhmZikgPDwgMjQ7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtYWNoaXAyX2dldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2JpZ3NtcF8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYmlnc21wXzMyLmMKaW5kZXggMDZkYmFhNC4uNTYwMTIwMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYmlnc21wXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYmlnc21wXzMyLmMKQEAgLTE0Miw3ICsxNDIsNyBAQAogCXJldHVybiBkbWlfYmlnc21wOwogfQogCi1zdGF0aWMgc3RydWN0IGFwaWMgYXBpY19iaWdzbXAgPSB7CitzdGF0aWMgc3RydWN0IGFwaWMgYXBpY19iaWdzbXAgX19yb19hZnRlcl9pbml0ID0gewogCiAJLm5hbWUJCQkJPSAiYmlnc21wIiwKIAkucHJvYmUJCQkJPSBwcm9iZV9iaWdzbXAsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMKaW5kZXggNzQ5MWY0MS4uNDhlNmQ4NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYwpAQCAtMTU5Myw3ICsxNTkzLDcgQEAKIAkgKiBubyBtZWFuaW5nIHdpdGhvdXQgdGhlIHNlcmlhbCBBUElDIGJ1cy4KIAkgKi8KIAlpZiAoIShib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkKLQkJfHwgQVBJQ19YQVBJQyhhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkpCisJCXx8IEFQSUNfWEFQSUMoYm9vdF9jcHVfYXBpY192ZXJzaW9uKSkKIAkJcmV0dXJuOwogCXNldHVwX2lvYXBpY19pZHNfZnJvbV9tcGNfbm9jaGVjaygpOwogfQpAQCAtMjQyMyw3ICsyNDIzLDcgQEAKIHN0YXRpYyB1OCBpb19hcGljX3VuaXF1ZV9pZChpbnQgaWR4LCB1OCBpZCkKIHsKIAlpZiAoKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKSAmJgotCSAgICAhQVBJQ19YQVBJQyhhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkpCisJICAgICFBUElDX1hBUElDKGJvb3RfY3B1X2FwaWNfdmVyc2lvbikpCiAJCXJldHVybiBpb19hcGljX2dldF91bmlxdWVfaWQoaWR4LCBpZCk7CiAJZWxzZQogCQlyZXR1cm4gaWQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9tc2kuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL21zaS5jCmluZGV4IGFkZTI1MzIuLjAxNWJiZjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL21zaS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL21zaS5jCkBAIC0yNjksNyArMjY5LDcgQEAKIAlocGV0X21zaV93cml0ZShpcnFfZGF0YV9nZXRfaXJxX2hhbmRsZXJfZGF0YShkYXRhKSwgbXNnKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBocGV0X21zaV9jb250cm9sbGVyID0geworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBocGV0X21zaV9jb250cm9sbGVyIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAkubmFtZSA9ICJIUEVULU1TSSIsCiAJLmlycV91bm1hc2sgPSBocGV0X21zaV91bm1hc2ssCiAJLmlycV9tYXNrID0gaHBldF9tc2lfbWFzaywKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9wcm9iZV8zMi5jCmluZGV4IDdjNDNlNzEuLmM0ODI2NGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfMzIuYwpAQCAtNzIsNyArNzIsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgc3RydWN0IGFwaWMgYXBpY19kZWZhdWx0ID0geworc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfZGVmYXVsdCBfX3JvX2FmdGVyX2luaXQgPSB7CiAKIAkubmFtZQkJCQk9ICJkZWZhdWx0IiwKIAkucHJvYmUJCQkJPSBwcm9iZV9kZWZhdWx0LApAQCAtMTI2LDcgKzEyNiw3IEBACiAKIGFwaWNfZHJpdmVyKGFwaWNfZGVmYXVsdCk7CiAKLXN0cnVjdCBhcGljICphcGljID0gJmFwaWNfZGVmYXVsdDsKK3N0cnVjdCBhcGljICphcGljIF9fcm9fYWZ0ZXJfaW5pdCA9ICZhcGljX2RlZmF1bHQ7CiBFWFBPUlRfU1lNQk9MX0dQTChhcGljKTsKIAogc3RhdGljIGludCBjbWRsaW5lX2FwaWMgX19pbml0ZGF0YTsKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiB2b2lkIF9faW5pdCBkZWZhdWx0X3NldHVwX2FwaWNfcm91dGluZyh2b2lkKQogewotCWludCB2ZXJzaW9uID0gYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF07CisJaW50IHZlcnNpb24gPSBib290X2NwdV9hcGljX3ZlcnNpb247CiAKIAlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDgpIHsKIAkJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19jbHVzdGVyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfY2x1c3Rlci5jCmluZGV4IDU0ZjM1ZDkuLjIwMGFmNWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19jbHVzdGVyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJCWNwdW1hc2tfYW5kKHJldG1hc2ssIG1hc2ssIHBlcl9jcHUoY3B1c19pbl9jbHVzdGVyLCBjcHUpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfeDJhcGljX2NsdXN0ZXIgPSB7CitzdGF0aWMgc3RydWN0IGFwaWMgYXBpY194MmFwaWNfY2x1c3RlciBfX3JvX2FmdGVyX2luaXQgPSB7CiAKIAkubmFtZQkJCQk9ICJjbHVzdGVyIHgyYXBpYyIsCiAJLnByb2JlCQkJCT0geDJhcGljX2NsdXN0ZXJfcHJvYmUsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfcGh5cy5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3BoeXMuYwppbmRleCA0ZjEzZjU0Zi4uZmYxMTFmMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3BoeXMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfcGh5cy5jCkBAIC05OCw3ICs5OCw3IEBACiAJcmV0dXJuIGFwaWMgPT0gJmFwaWNfeDJhcGljX3BoeXM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX3gyYXBpY19waHlzID0geworc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfeDJhcGljX3BoeXMgX19yb19hZnRlcl9pbml0ID0gewogCiAJLm5hbWUJCQkJPSAicGh5c2ljYWwgeDJhcGljIiwKIAkucHJvYmUJCQkJPSB4MmFwaWNfcGh5c19wcm9iZSwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCmluZGV4IGNiMDY3M2MuLmFlZWY1M2MgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwpAQCAtNTMzLDExICs1MzMsOCBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzZXRfYXBpY19pZCh1bnNpZ25lZCBpbnQgaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB4OwotCi0JLyogbWFza291dCB4MmFwaWNfZXh0cmFfYml0cyA/ICovCi0JeCA9IGlkOwotCXJldHVybiB4OworCS8qIENIRUNLTUU6IERvIHdlIG5lZWQgdG8gbWFzayBvdXQgdGhlIHhhcGljIGV4dHJhIGJpdHM/ICovCisJcmV0dXJuIGlkOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHV2X3JlYWRfYXBpY19pZCh2b2lkKQpAQCAtNTYwLDcgKzU1Nyw3IEBACiAJcmV0dXJuIGFwaWMgPT0gJmFwaWNfeDJhcGljX3V2X3g7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYXBpYyBfX3JlZmRhdGEgYXBpY194MmFwaWNfdXZfeCA9IHsKK3N0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX3gyYXBpY191dl94IF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAogCS5uYW1lCQkJCT0gIlVWIGxhcmdlIHN5c3RlbSIsCiAJLnByb2JlCQkJCT0gdXZfcHJvYmUsCkBAIC05MjcsNyArOTI0LDcgQEAKIAltb2RfdGltZXIodGltZXIsIGppZmZpZXMgKyBTQ0lSX0NQVV9IQl9JTlRFUlZBTCk7CiB9CiAKLXN0YXRpYyB2b2lkIHV2X2hlYXJ0YmVhdF9lbmFibGUoaW50IGNwdSkKK3N0YXRpYyBpbnQgdXZfaGVhcnRiZWF0X2VuYWJsZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCXdoaWxlICghdXZfY3B1X3NjaXJfaW5mbyhjcHUpLT5lbmFibGVkKSB7CiAJCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciA9ICZ1dl9jcHVfc2Npcl9pbmZvKGNwdSktPnRpbWVyOwpAQCAtOTQxLDQzICs5MzgsMjQgQEAKIAkJLyogYWxzbyBlbnN1cmUgdGhhdCBib290IGNwdSBpcyBlbmFibGVkICovCiAJCWNwdSA9IDA7CiAJfQorCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi1zdGF0aWMgdm9pZCB1dl9oZWFydGJlYXRfZGlzYWJsZShpbnQgY3B1KQorc3RhdGljIGludCB1dl9oZWFydGJlYXRfZGlzYWJsZSh1bnNpZ25lZCBpbnQgY3B1KQogewogCWlmICh1dl9jcHVfc2Npcl9pbmZvKGNwdSktPmVuYWJsZWQpIHsKIAkJdXZfY3B1X3NjaXJfaW5mbyhjcHUpLT5lbmFibGVkID0gMDsKIAkJZGVsX3RpbWVyKCZ1dl9jcHVfc2Npcl9pbmZvKGNwdSktPnRpbWVyKTsKIAl9CiAJdXZfc2V0X2NwdV9zY2lyX2JpdHMoY3B1LCAweGZmKTsKLX0KLQotLyoKLSAqIGNwdSBob3RwbHVnIG5vdGlmaWVyCi0gKi8KLXN0YXRpYyBpbnQgdXZfc2Npcl9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkgICAgICB2b2lkICpoY3B1KQotewotCWxvbmcgY3B1ID0gKGxvbmcpaGNwdTsKLQotCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQljYXNlIENQVV9PTkxJTkU6Ci0JCXV2X2hlYXJ0YmVhdF9lbmFibGUoY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQl1dl9oZWFydGJlYXRfZGlzYWJsZShjcHUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIF9faW5pdCB2b2lkIHV2X3NjaXJfcmVnaXN0ZXJfY3B1X25vdGlmaWVyKHZvaWQpCiB7Ci0JaG90Y3B1X25vdGlmaWVyKHV2X3NjaXJfY3B1X25vdGlmeSwgMCk7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLCAieDg2L3gyYXBpYy11dng6b25saW5lIiwKKwkJCQkgIHV2X2hlYXJ0YmVhdF9lbmFibGUsIHV2X2hlYXJ0YmVhdF9kaXNhYmxlKTsKIH0KIAogI2Vsc2UgLyogIUNPTkZJR19IT1RQTFVHX0NQVSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAyYmQ1YzZmLi5jNjJlMDE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMjksMTAgKzI5LDEzIEBACiAKIHZvaWQgY29tbW9uKHZvaWQpIHsKIAlCTEFOSygpOwotCU9GRlNFVChUSV9mbGFncywgdGhyZWFkX2luZm8sIGZsYWdzKTsKLQlPRkZTRVQoVElfc3RhdHVzLCB0aHJlYWRfaW5mbywgc3RhdHVzKTsKKwlPRkZTRVQoVEFTS190aHJlYWRzcCwgdGFza19zdHJ1Y3QsIHRocmVhZC5zcCk7CisjaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCisJT0ZGU0VUKFRBU0tfc3RhY2tfY2FuYXJ5LCB0YXNrX3N0cnVjdCwgc3RhY2tfY2FuYXJ5KTsKKyNlbmRpZgogCiAJQkxBTksoKTsKKwlPRkZTRVQoVEFTS19USV9mbGFncywgdGFza19zdHJ1Y3QsIHRocmVhZF9pbmZvLmZsYWdzKTsKIAlPRkZTRVQoVEFTS19hZGRyX2xpbWl0LCB0YXNrX3N0cnVjdCwgdGhyZWFkLmFkZHJfbGltaXQpOwogCiAJQkxBTksoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c18zMi5jIGIvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMKaW5kZXggZWNkYzFkMi4uODgwYWEwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMKQEAgLTU3LDYgKzU3LDExIEBACiAJLyogU2l6ZSBvZiBTWVNFTlRFUl9zdGFjayAqLwogCURFRklORShTSVpFT0ZfU1lTRU5URVJfc3RhY2ssIHNpemVvZigoKHN0cnVjdCB0c3Nfc3RydWN0ICopMCktPlNZU0VOVEVSX3N0YWNrKSk7CiAKKyNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKKwlCTEFOSygpOworCU9GRlNFVChzdGFja19jYW5hcnlfb2Zmc2V0LCBzdGFja19jYW5hcnksIGNhbmFyeSk7CisjZW5kaWYKKwogI2lmIGRlZmluZWQoQ09ORklHX0xHVUVTVCkgfHwgZGVmaW5lZChDT05GSUdfTEdVRVNUX0dVRVNUKSB8fCBkZWZpbmVkKENPTkZJR19MR1VFU1RfTU9EVUxFKQogCUJMQU5LKCk7CiAJT0ZGU0VUKExHVUVTVF9EQVRBX2lycV9lbmFibGVkLCBsZ3Vlc3RfZGF0YSwgaXJxX2VuYWJsZWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYwppbmRleCBkODc1Zjk3Li4yMTA5MjdlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYwpAQCAtNTYsNiArNTYsMTEgQEAKIAlPRkZTRVQoVFNTX3NwMCwgdHNzX3N0cnVjdCwgeDg2X3Rzcy5zcDApOwogCUJMQU5LKCk7CiAKKyNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKKwlERUZJTkUoc3RhY2tfY2FuYXJ5X29mZnNldCwgb2Zmc2V0b2YodW5pb24gaXJxX3N0YWNrX3VuaW9uLCBzdGFja19jYW5hcnkpKTsKKwlCTEFOSygpOworI2VuZGlmCisKIAlERUZJTkUoX19OUl9zeXNjYWxsX21heCwgc2l6ZW9mKHN5c2NhbGxzXzY0KSAtIDEpOwogCURFRklORShOUl9zeXNjYWxscywgc2l6ZW9mKHN5c2NhbGxzXzY0KSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCmluZGV4IGY1YzY5ZDguLmI4MWZlMmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYwpAQCAtNjY5LDYgKzY2OSwxNyBAQAogCQlzZXRfY3B1X2J1ZyhjLCBYODZfQlVHX0FNRF9UTEJfTU1BVENIKTsKIH0KIAorI2RlZmluZSBNU1JfQU1ENjRfREVfQ0ZHCTB4QzAwMTEwMjkKKworc3RhdGljIHZvaWQgaW5pdF9hbWRfbG4oc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCS8qCisJICogQXBwbHkgZXJyYXR1bSA2NjUgZml4IHVuY29uZGl0aW9uYWxseSBzbyBtYWNoaW5lcyB3aXRob3V0IGEgQklPUworCSAqIGZpeCB3b3JrLgorCSAqLworCW1zcl9zZXRfYml0KE1TUl9BTUQ2NF9ERV9DRkcsIDMxKTsKK30KKwogc3RhdGljIHZvaWQgaW5pdF9hbWRfYmQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCXU2NCB2YWx1ZTsKQEAgLTcyNiw2ICs3MzcsNyBAQAogCWNhc2UgNjoJICAgaW5pdF9hbWRfazcoYyk7IGJyZWFrOwogCWNhc2UgMHhmOiAgaW5pdF9hbWRfazgoYyk7IGJyZWFrOwogCWNhc2UgMHgxMDogaW5pdF9hbWRfZ2goYyk7IGJyZWFrOworCWNhc2UgMHgxMjogaW5pdF9hbWRfbG4oYyk7IGJyZWFrOwogCWNhc2UgMHgxNTogaW5pdF9hbWRfYmQoYyk7IGJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKaW5kZXggODA5ZWRhMC4uOWJkOTEwYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCkBAIC04MDQsMjEgKzgwNCwyMCBAQAogCQlpZGVudGlmeV9jcHVfd2l0aG91dF9jcHVpZChjKTsKIAogCS8qIGN5cml4IGNvdWxkIGhhdmUgY3B1aWQgZW5hYmxlZCB2aWEgY19pZGVudGlmeSgpKi8KLQlpZiAoIWhhdmVfY3B1aWRfcCgpKQotCQlyZXR1cm47CisJaWYgKGhhdmVfY3B1aWRfcCgpKSB7CisJCWNwdV9kZXRlY3QoYyk7CisJCWdldF9jcHVfdmVuZG9yKGMpOworCQlnZXRfY3B1X2NhcChjKTsKIAotCWNwdV9kZXRlY3QoYyk7Ci0JZ2V0X2NwdV92ZW5kb3IoYyk7Ci0JZ2V0X2NwdV9jYXAoYyk7CisJCWlmICh0aGlzX2NwdS0+Y19lYXJseV9pbml0KQorCQkJdGhpc19jcHUtPmNfZWFybHlfaW5pdChjKTsKIAotCWlmICh0aGlzX2NwdS0+Y19lYXJseV9pbml0KQotCQl0aGlzX2NwdS0+Y19lYXJseV9pbml0KGMpOworCQljLT5jcHVfaW5kZXggPSAwOworCQlmaWx0ZXJfY3B1aWRfZmVhdHVyZXMoYywgZmFsc2UpOwogCi0JYy0+Y3B1X2luZGV4ID0gMDsKLQlmaWx0ZXJfY3B1aWRfZmVhdHVyZXMoYywgZmFsc2UpOwotCi0JaWYgKHRoaXNfY3B1LT5jX2JzcF9pbml0KQotCQl0aGlzX2NwdS0+Y19ic3BfaW5pdChjKTsKKwkJaWYgKHRoaXNfY3B1LT5jX2JzcF9pbml0KQorCQkJdGhpc19jcHUtPmNfYnNwX2luaXQoYyk7CisJfQogCiAJc2V0dXBfZm9yY2VfY3B1X2NhcChYODZfRkVBVFVSRV9BTFdBWVMpOwogCWZwdV9faW5pdF9zeXN0ZW0oYyk7CkBAIC0xMjY1LDkgKzEyNjQsMTQgQEAKIF9fc2V0dXAoImNsZWFyY3B1aWQ9Iiwgc2V0dXBfZGlzYWJsZWNwdWlkKTsKIAogI2lmZGVmIENPTkZJR19YODZfNjQKLXN0cnVjdCBkZXNjX3B0ciBpZHRfZGVzY3IgPSB7IE5SX1ZFQ1RPUlMgKiAxNiAtIDEsICh1bnNpZ25lZCBsb25nKSBpZHRfdGFibGUgfTsKLXN0cnVjdCBkZXNjX3B0ciBkZWJ1Z19pZHRfZGVzY3IgPSB7IE5SX1ZFQ1RPUlMgKiAxNiAtIDEsCi0JCQkJICAgICh1bnNpZ25lZCBsb25nKSBkZWJ1Z19pZHRfdGFibGUgfTsKK3N0cnVjdCBkZXNjX3B0ciBpZHRfZGVzY3IgX19yb19hZnRlcl9pbml0ID0geworCS5zaXplID0gTlJfVkVDVE9SUyAqIDE2IC0gMSwKKwkuYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSBpZHRfdGFibGUsCit9OworY29uc3Qgc3RydWN0IGRlc2NfcHRyIGRlYnVnX2lkdF9kZXNjciA9IHsKKwkuc2l6ZSA9IE5SX1ZFQ1RPUlMgKiAxNiAtIDEsCisJLmFkZHJlc3MgPSAodW5zaWduZWQgbG9uZykgZGVidWdfaWR0X3RhYmxlLAorfTsKIAogREVGSU5FX1BFUl9DUFVfRklSU1QodW5pb24gaXJxX3N0YWNrX3VuaW9uLAogCQkgICAgIGlycV9zdGFja191bmlvbikgX19hbGlnbmVkKFBBR0VfU0laRSkgX192aXNpYmxlOwpAQCAtMTI4MSw3ICsxMjg1LDcgQEAKIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTChjdXJyZW50X3Rhc2spOwogCiBERUZJTkVfUEVSX0NQVShjaGFyICosIGlycV9zdGFja19wdHIpID0KLQlpbml0X3Blcl9jcHVfdmFyKGlycV9zdGFja191bmlvbi5pcnFfc3RhY2spICsgSVJRX1NUQUNLX1NJWkUgLSA2NDsKKwlpbml0X3Blcl9jcHVfdmFyKGlycV9zdGFja191bmlvbi5pcnFfc3RhY2spICsgSVJRX1NUQUNLX1NJWkU7CiAKIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGludCwgaXJxX2NvdW50KSBfX3Zpc2libGUgPSAtMTsKIApAQCAtMTMwNSwxMSArMTMwOSw2IEBACiAvKiBNYXkgbm90IGJlIG1hcmtlZCBfX2luaXQ6IHVzZWQgYnkgc29mdHdhcmUgc3VzcGVuZCAqLwogdm9pZCBzeXNjYWxsX2luaXQodm9pZCkKIHsKLQkvKgotCSAqIExTVEFSIGFuZCBTVEFSIGxpdmUgaW4gYSBiaXQgc3RyYW5nZSBzeW1iaW9zaXMuCi0JICogVGhleSBib3RoIHdyaXRlIHRvIHRoZSBzYW1lIGludGVybmFsIHJlZ2lzdGVyLiBTVEFSIGFsbG93cyB0bwotCSAqIHNldCBDUy9EUyBidXQgb25seSBhIDMyYml0IHRhcmdldC4gTFNUQVIgc2V0cyB0aGUgNjRiaXQgcmlwLgotCSAqLwogCXdybXNyKE1TUl9TVEFSLCAwLCAoX19VU0VSMzJfQ1MgPDwgMTYpIHwgX19LRVJORUxfQ1MpOwogCXdybXNybChNU1JfTFNUQVIsICh1bnNpZ25lZCBsb25nKWVudHJ5X1NZU0NBTExfNjQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2h5cGVydmlzb3IuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCmluZGV4IDI3ZTQ2NjUuLjM1NjkxYTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaHlwZXJ2aXNvci5jCkBAIC04NiwzICs4NiwxNCBAQAogCSAgICAgICB4ODZfaHlwZXItPngyYXBpY19hdmFpbGFibGUgJiYKIAkgICAgICAgeDg2X2h5cGVyLT54MmFwaWNfYXZhaWxhYmxlKCk7CiB9CisKK3ZvaWQgaHlwZXJ2aXNvcl9waW5fdmNwdShpbnQgY3B1KQoreworCWlmICgheDg2X2h5cGVyKQorCQlyZXR1cm47CisKKwlpZiAoeDg2X2h5cGVyLT5waW5fdmNwdSkKKwkJeDg2X2h5cGVyLT5waW5fdmNwdShjcHUpOworCWVsc2UKKwkJV0FSTl9PTkNFKDEsICJ2Y3B1IHBpbm5pbmcgcmVxdWVzdGVkIGJ1dCBub3Qgc3VwcG9ydGVkIVxuIik7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCmluZGV4IDc5ZDhlYzguLmE3ZmRmNDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lycV93b3JrLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgpAQCAtMjkyLDYgKzI5MywxMyBAQAogCWlmIChtLT5taXNjKQogCQlwcl9jb250KCJNSVNDICVsbHggIiwgbS0+bWlzYyk7CiAKKwlpZiAobWNlX2ZsYWdzLnNtY2EpIHsKKwkJaWYgKG0tPnN5bmQpCisJCQlwcl9jb250KCJTWU5EICVsbHggIiwgbS0+c3luZCk7CisJCWlmIChtLT5pcGlkKQorCQkJcHJfY29udCgiSVBJRCAlbGx4ICIsIG0tPmlwaWQpOworCX0KKwogCXByX2NvbnQoIlxuIik7CiAJLyoKIAkgKiBOb3RlIHRoaXMgb3V0cHV0IGlzIHBhcnNlZCBieSBleHRlcm5hbCB0b29scyBhbmQgb2xkIGZpZWxkcwpAQCAtNTY4LDYgKzU3Niw3IEBACiB7CiAJaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfTUlTQ1YpCiAJCW0tPm1pc2MgPSBtY2VfcmRtc3JsKG1zcl9vcHMubWlzYyhpKSk7CisKIAlpZiAobS0+c3RhdHVzICYgTUNJX1NUQVRVU19BRERSVikgewogCQltLT5hZGRyID0gbWNlX3JkbXNybChtc3Jfb3BzLmFkZHIoaSkpOwogCkBAIC01NzksNiArNTg4LDIzIEBACiAJCQltLT5hZGRyID4+PSBzaGlmdDsKIAkJCW0tPmFkZHIgPDw9IHNoaWZ0OwogCQl9CisKKwkJLyoKKwkJICogRXh0cmFjdCBbNTU6PGxzYj5dIHdoZXJlIGxzYiBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKKwkJICogKnZhbGlkKiBiaXQgb2YgdGhlIGFkZHJlc3MgYml0cy4KKwkJICovCisJCWlmIChtY2VfZmxhZ3Muc21jYSkgeworCQkJdTggbHNiID0gKG0tPmFkZHIgPj4gNTYpICYgMHgzZjsKKworCQkJbS0+YWRkciAmPSBHRU5NQVNLX1VMTCg1NSwgbHNiKTsKKwkJfQorCX0KKworCWlmIChtY2VfZmxhZ3Muc21jYSkgeworCQltLT5pcGlkID0gbWNlX3JkbXNybChNU1JfQU1ENjRfU01DQV9NQ3hfSVBJRChpKSk7CisKKwkJaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfU1lORFYpCisJCQltLT5zeW5kID0gbWNlX3JkbXNybChNU1JfQU1ENjRfU01DQV9NQ3hfU1lORChpKSk7CiAJfQogfQogCkBAIC0xNjMzLDE3ICsxNjU5LDYgQEAKIAogCQlpZiAoYy0+eDg2ID09IDYgJiYgYy0+eDg2X21vZGVsID09IDQ1KQogCQkJcXVpcmtfbm9fd2F5X291dCA9IHF1aXJrX3NhbmR5YnJpZGdlX2lmdTsKLQkJLyoKLQkJICogTUNHX0NBUC5NQ0dfU0VSX1AgaXMgbmVjZXNzYXJ5IGJ1dCBub3Qgc3VmZmljaWVudCB0byBrbm93Ci0JCSAqIHdoZXRoZXIgdGhpcyBwcm9jZXNzb3Igd2lsbCBhY3R1YWxseSBnZW5lcmF0ZSByZWNvdmVyYWJsZQotCQkgKiBtYWNoaW5lIGNoZWNrcy4gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYW4gRTcgbW9kZWwgWGVvbi4KLQkJICogV2UgY2FuJ3QgZG8gYSBtb2RlbCBudW1iZXIgY2hlY2sgYmVjYXVzZSBFNSBhbmQgRTcgdXNlIHRoZQotCQkgKiBzYW1lIG1vZGVsIG51bWJlci4gRTUgZG9lc24ndCBzdXBwb3J0IHJlY292ZXJ5LCBFNyBkb2VzLgotCQkgKi8KLQkJaWYgKG1jYV9jZmcucmVjb3ZlcnkgfHwgKG1jYV9jZmcuc2VyICYmCi0JCQkhc3RybmNtcChjLT54ODZfbW9kZWxfaWQsCi0JCQkJICJJbnRlbChSKSBYZW9uKFIpIENQVSBFNy0iLCAyNCkpKQotCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfTUNFX1JFQ09WRVJZKTsKIAl9CiAJaWYgKGNmZy0+bW9uYXJjaF90aW1lb3V0IDwgMCkKIAkJY2ZnLT5tb25hcmNoX3RpbWVvdXQgPSAwOwpAQCAtMjA4MCw2ICsyMDk1LDcgQEAKICAqIG1jZT1ib290bG9nIExvZyBNQ0VzIGZyb20gYmVmb3JlIGJvb3RpbmcuIERpc2FibGVkIGJ5IGRlZmF1bHQgb24gQU1ELgogICogbWNlPW5vYm9vdGxvZyBEb24ndCBsb2cgTUNFcyBmcm9tIGJlZm9yZSBib290aW5nLgogICogbWNlPWJpb3NfY21jaV90aHJlc2hvbGQgRG9uJ3QgcHJvZ3JhbSB0aGUgQ01DSSB0aHJlc2hvbGQKKyAqIG1jZT1yZWNvdmVyeSBmb3JjZSBlbmFibGUgbWVtY3B5X21jc2FmZSgpCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG1jaGVja19lbmFibGUoY2hhciAqc3RyKQogewpAQCAtMjY3Niw4ICsyNjkyLDE0IEBACiBzdGF0aWMgaW50IF9faW5pdCBtY2hlY2tfZGVidWdmc19pbml0KHZvaWQpIHsgcmV0dXJuIC1FSU5WQUw7IH0KICNlbmRpZgogCitERUZJTkVfU1RBVElDX0tFWV9GQUxTRShtY3NhZmVfa2V5KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG1jc2FmZV9rZXkpOworCiBzdGF0aWMgaW50IF9faW5pdCBtY2hlY2tfbGF0ZV9pbml0KHZvaWQpCiB7CisJaWYgKG1jYV9jZmcucmVjb3ZlcnkpCisJCXN0YXRpY19icmFuY2hfaW5jKCZtY3NhZmVfa2V5KTsKKwogCW1jaGVja19kZWJ1Z2ZzX2luaXQoKTsKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kLmMKaW5kZXggN2I3ZjNiZS4uOWI1NDAzNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9hbWQuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9hbWRfbmIuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgpAQCAtNjMsMzQgKzY0LDcxIEBACiAJImV4ZWN1dGlvbl91bml0IiwKIH07CiAKLS8qIERlZmluZSBIV0lEIHRvIElQIHR5cGUgbWFwcGluZ3MgZm9yIFNjYWxhYmxlIE1DQSAqLwotc3RydWN0IGFtZF9od2lkIGFtZF9od2lkc1tdID0gewotCVtTTUNBX0YxN0hfQ09SRV0JPSB7ICJmMTdoX2NvcmUiLAkweEIwIH0sCi0JW1NNQ0FfREZdCQk9IHsgImRhdGFfZmFicmljIiwJMHgyRSB9LAotCVtTTUNBX1VNQ10JCT0geyAidW1jIiwJCTB4OTYgfSwKLQlbU01DQV9QQl0JCT0geyAicGFyYW1fYmxvY2siLAkweDUgfSwKLQlbU01DQV9QU1BdCQk9IHsgInBzcCIsCQkweEZGIH0sCi0JW1NNQ0FfU01VXQkJPSB7ICJzbXUiLAkJMHgxIH0sCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNtY2FfdW1jX2Jsb2NrX25hbWVzW10gPSB7CisJImRyYW1fZWNjIiwKKwkibWlzY191bWMiCiB9OwotRVhQT1JUX1NZTUJPTF9HUEwoYW1kX2h3aWRzKTsKIAotY29uc3QgY2hhciAqIGNvbnN0IGFtZF9jb3JlX21jYWJsb2NrX25hbWVzW10gPSB7Ci0JW1NNQ0FfTFNdCQk9ICJsb2FkX3N0b3JlIiwKLQlbU01DQV9JRl0JCT0gImluc25fZmV0Y2giLAotCVtTTUNBX0wyX0NBQ0hFXQkJPSAibDJfY2FjaGUiLAotCVtTTUNBX0RFXQkJPSAiZGVjb2RlX3VuaXQiLAotCVtSRVNdCQkJPSAiIiwKLQlbU01DQV9FWF0JCT0gImV4ZWN1dGlvbl91bml0IiwKLQlbU01DQV9GUF0JCT0gImZsb2F0aW5nX3BvaW50IiwKLQlbU01DQV9MM19DQUNIRV0JCT0gImwzX2NhY2hlIiwKK3N0cnVjdCBzbWNhX2JhbmtfbmFtZSBzbWNhX2JhbmtfbmFtZXNbXSA9IHsKKwlbU01DQV9MU10JPSB7ICJsb2FkX3N0b3JlIiwJIkxvYWQgU3RvcmUgVW5pdCIgfSwKKwlbU01DQV9JRl0JPSB7ICJpbnNuX2ZldGNoIiwJIkluc3RydWN0aW9uIEZldGNoIFVuaXQiIH0sCisJW1NNQ0FfTDJfQ0FDSEVdCT0geyAibDJfY2FjaGUiLAkJIkwyIENhY2hlIiB9LAorCVtTTUNBX0RFXQk9IHsgImRlY29kZV91bml0IiwJIkRlY29kZSBVbml0IiB9LAorCVtTTUNBX0VYXQk9IHsgImV4ZWN1dGlvbl91bml0IiwJIkV4ZWN1dGlvbiBVbml0IiB9LAorCVtTTUNBX0ZQXQk9IHsgImZsb2F0aW5nX3BvaW50IiwJIkZsb2F0aW5nIFBvaW50IFVuaXQiIH0sCisJW1NNQ0FfTDNfQ0FDSEVdCT0geyAibDNfY2FjaGUiLAkJIkwzIENhY2hlIiB9LAorCVtTTUNBX0NTXQk9IHsgImNvaGVyZW50X3NsYXZlIiwJIkNvaGVyZW50IFNsYXZlIiB9LAorCVtTTUNBX1BJRV0JPSB7ICJwaWUiLAkJIlBvd2VyLCBJbnRlcnJ1cHRzLCBldGMuIiB9LAorCVtTTUNBX1VNQ10JPSB7ICJ1bWMiLAkJIlVuaWZpZWQgTWVtb3J5IENvbnRyb2xsZXIiIH0sCisJW1NNQ0FfUEJdCT0geyAicGFyYW1fYmxvY2siLAkiUGFyYW1ldGVyIEJsb2NrIiB9LAorCVtTTUNBX1BTUF0JPSB7ICJwc3AiLAkJIlBsYXRmb3JtIFNlY3VyaXR5IFByb2Nlc3NvciIgfSwKKwlbU01DQV9TTVVdCT0geyAic211IiwJCSJTeXN0ZW0gTWFuYWdlbWVudCBVbml0IiB9LAogfTsKLUVYUE9SVF9TWU1CT0xfR1BMKGFtZF9jb3JlX21jYWJsb2NrX25hbWVzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNtY2FfYmFua19uYW1lcyk7CiAKLWNvbnN0IGNoYXIgKiBjb25zdCBhbWRfZGZfbWNhYmxvY2tfbmFtZXNbXSA9IHsKLQlbU01DQV9DU10JCT0gImNvaGVyZW50X3NsYXZlIiwKLQlbU01DQV9QSUVdCQk9ICJwaWUiLAorc3RhdGljIHN0cnVjdCBzbWNhX2h3aWRfbWNhdHlwZSBzbWNhX2h3aWRfbWNhdHlwZXNbXSA9IHsKKwkvKiB7IGJhbmtfdHlwZSwgaHdpZF9tY2F0eXBlLCB4ZWNfYml0bWFwIH0gKi8KKworCS8qIFpOIENvcmUgKEhXSUQ9MHhCMCkgTUNBIHR5cGVzICovCisJeyBTTUNBX0xTLAkgSFdJRF9NQ0FUWVBFKDB4QjAsIDB4MCksIDB4MUZGRkVGIH0sCisJeyBTTUNBX0lGLAkgSFdJRF9NQ0FUWVBFKDB4QjAsIDB4MSksIDB4M0ZGRiB9LAorCXsgU01DQV9MMl9DQUNIRSwgSFdJRF9NQ0FUWVBFKDB4QjAsIDB4MiksIDB4RiB9LAorCXsgU01DQV9ERSwJIEhXSURfTUNBVFlQRSgweEIwLCAweDMpLCAweDFGRiB9LAorCS8qIEhXSUQgMHhCMCBNQ0FUWVBFIDB4NCBpcyBSZXNlcnZlZCAqLworCXsgU01DQV9FWCwJIEhXSURfTUNBVFlQRSgweEIwLCAweDUpLCAweDdGRiB9LAorCXsgU01DQV9GUCwJIEhXSURfTUNBVFlQRSgweEIwLCAweDYpLCAweDdGIH0sCisJeyBTTUNBX0wzX0NBQ0hFLCBIV0lEX01DQVRZUEUoMHhCMCwgMHg3KSwgMHhGRiB9LAorCisJLyogRGF0YSBGYWJyaWMgTUNBIHR5cGVzICovCisJeyBTTUNBX0NTLAkgSFdJRF9NQ0FUWVBFKDB4MkUsIDB4MCksIDB4MUZGIH0sCisJeyBTTUNBX1BJRSwJIEhXSURfTUNBVFlQRSgweDJFLCAweDEpLCAweEYgfSwKKworCS8qIFVuaWZpZWQgTWVtb3J5IENvbnRyb2xsZXIgTUNBIHR5cGUgKi8KKwl7IFNNQ0FfVU1DLAkgSFdJRF9NQ0FUWVBFKDB4OTYsIDB4MCksIDB4M0YgfSwKKworCS8qIFBhcmFtZXRlciBCbG9jayBNQ0EgdHlwZSAqLworCXsgU01DQV9QQiwJIEhXSURfTUNBVFlQRSgweDA1LCAweDApLCAweDEgfSwKKworCS8qIFBsYXRmb3JtIFNlY3VyaXR5IFByb2Nlc3NvciBNQ0EgdHlwZSAqLworCXsgU01DQV9QU1AsCSBIV0lEX01DQVRZUEUoMHhGRiwgMHgwKSwgMHgxIH0sCisKKwkvKiBTeXN0ZW0gTWFuYWdlbWVudCBVbml0IE1DQSB0eXBlICovCisJeyBTTUNBX1NNVSwJIEhXSURfTUNBVFlQRSgweDAxLCAweDApLCAweDEgfSwKIH07Ci1FWFBPUlRfU1lNQk9MX0dQTChhbWRfZGZfbWNhYmxvY2tfbmFtZXMpOworCitzdHJ1Y3Qgc21jYV9iYW5rX2luZm8gc21jYV9iYW5rc1tNQVhfTlJfQkFOS1NdOworRVhQT1JUX1NZTUJPTF9HUEwoc21jYV9iYW5rcyk7CisKKy8qCisgKiBJbiBTTUNBIGVuYWJsZWQgcHJvY2Vzc29ycywgd2UgY2FuIGhhdmUgbXVsdGlwbGUgYmFua3MgZm9yIGEgZ2l2ZW4gSVAgdHlwZS4KKyAqIFNvIHRvIGRlZmluZSBhIHVuaXF1ZSBuYW1lIGZvciBlYWNoIGJhbmssIHdlIHVzZSBhIHRlbXAgYy1zdHJpbmcgdG8gYXBwZW5kCisgKiB0aGUgTUNBX0lQSURbSW5zdGFuY2VJZF0gdG8gdHlwZSdzIG5hbWUgaW4gZ2V0X25hbWUoKS4KKyAqCisgKiBJbnN0YW5jZUlkIGlzIDMyIGJpdHMgd2hpY2ggaXMgOCBjaGFyYWN0ZXJzLiBNYWtlIHN1cmUgTUFYX01DQVRZUEVfTkFNRV9MRU4KKyAqIGlzIGdyZWF0ZXIgdGhhbiA4IHBsdXMgMSAoZm9yIHVuZGVyc2NvcmUpIHBsdXMgbGVuZ3RoIG9mIGxvbmdlc3QgdHlwZSBuYW1lLgorICovCisjZGVmaW5lIE1BWF9NQ0FUWVBFX05BTUVfTEVOCTMwCitzdGF0aWMgY2hhciBidWZfbWNhdHlwZVtNQVhfTUNBVFlQRV9OQU1FX0xFTl07CiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGhyZXNob2xkX2JhbmsgKiosIHRocmVzaG9sZF9iYW5rcyk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCBiYW5rX21hcCk7CS8qIHNlZSB3aGljaCBiYW5rcyBhcmUgb24gKi8KQEAgLTEwOCw2ICsxNDYsMzYgQEAKICAqIENQVSBJbml0aWFsaXphdGlvbgogICovCiAKK3N0YXRpYyB2b2lkIGdldF9zbWNhX2JhbmtfaW5mbyh1bnNpZ25lZCBpbnQgYmFuaykKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaHdpZF9tY2F0eXBlLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHNtY2FfaHdpZF9tY2F0eXBlICp0eXBlOworCXUzMiBoaWdoLCBpbnN0YW5jZUlkOworCXUxNiBod2lkLCBtY2F0eXBlOworCisJLyogQ29sbGVjdCBiYW5rX2luZm8gdXNpbmcgQ1BVIDAgZm9yIG5vdy4gKi8KKwlpZiAoY3B1KQorCQlyZXR1cm47CisKKwlpZiAocmRtc3Jfc2FmZV9vbl9jcHUoY3B1LCBNU1JfQU1ENjRfU01DQV9NQ3hfSVBJRChiYW5rKSwgJmluc3RhbmNlSWQsICZoaWdoKSkgeworCQlwcl93YXJuKCJGYWlsZWQgdG8gcmVhZCBNQ0FfSVBJRCBmb3IgYmFuayAlZFxuIiwgYmFuayk7CisJCXJldHVybjsKKwl9CisKKwlod2lkID0gaGlnaCAmIE1DSV9JUElEX0hXSUQ7CisJbWNhdHlwZSA9IChoaWdoICYgTUNJX0lQSURfTUNBVFlQRSkgPj4gMTY7CisJaHdpZF9tY2F0eXBlID0gSFdJRF9NQ0FUWVBFKGh3aWQsIG1jYXR5cGUpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc21jYV9od2lkX21jYXR5cGVzKTsgaSsrKSB7CisJCXR5cGUgPSAmc21jYV9od2lkX21jYXR5cGVzW2ldOworCQlpZiAoaHdpZF9tY2F0eXBlID09IHR5cGUtPmh3aWRfbWNhdHlwZSkgeworCQkJc21jYV9iYW5rc1tiYW5rXS50eXBlID0gdHlwZTsKKwkJCXNtY2FfYmFua3NbYmFua10udHlwZV9pbnN0YW5jZSA9IGluc3RhbmNlSWQ7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwogc3RydWN0IHRocmVzaF9yZXN0YXJ0IHsKIAlzdHJ1Y3QgdGhyZXNob2xkX2Jsb2NrCSpiOwogCWludAkJCXJlc2V0OwpAQCAtMjkzLDcgKzM2MSw3IEBACiAJd3Jtc3IoTVNSX0NVX0RFRl9FUlIsIGxvdywgaGlnaCk7CiB9CiAKLXN0YXRpYyB1MzIgZ2V0X2Jsb2NrX2FkZHJlc3ModTMyIGN1cnJlbnRfYWRkciwgdTMyIGxvdywgdTMyIGhpZ2gsCitzdGF0aWMgdTMyIGdldF9ibG9ja19hZGRyZXNzKHVuc2lnbmVkIGludCBjcHUsIHUzMiBjdXJyZW50X2FkZHIsIHUzMiBsb3csIHUzMiBoaWdoLAogCQkJICAgICB1bnNpZ25lZCBpbnQgYmFuaywgdW5zaWduZWQgaW50IGJsb2NrKQogewogCXUzMiBhZGRyID0gMCwgb2Zmc2V0ID0gMDsKQEAgLTMwOSwxMyArMzc3LDEzIEBACiAJCQkgKi8KIAkJCXUzMiBsb3csIGhpZ2g7CiAKLQkJCWlmIChyZG1zcl9zYWZlKE1TUl9BTUQ2NF9TTUNBX01DeF9DT05GSUcoYmFuayksICZsb3csICZoaWdoKSkKKwkJCWlmIChyZG1zcl9zYWZlX29uX2NwdShjcHUsIE1TUl9BTUQ2NF9TTUNBX01DeF9DT05GSUcoYmFuayksICZsb3csICZoaWdoKSkKIAkJCQlyZXR1cm4gYWRkcjsKIAogCQkJaWYgKCEobG93ICYgTUNJX0NPTkZJR19NQ0FYKSkKIAkJCQlyZXR1cm4gYWRkcjsKIAotCQkJaWYgKCFyZG1zcl9zYWZlKE1TUl9BTUQ2NF9TTUNBX01DeF9NSVNDKGJhbmspLCAmbG93LCAmaGlnaCkgJiYKKwkJCWlmICghcmRtc3Jfc2FmZV9vbl9jcHUoY3B1LCBNU1JfQU1ENjRfU01DQV9NQ3hfTUlTQyhiYW5rKSwgJmxvdywgJmhpZ2gpICYmCiAJCQkgICAgKGxvdyAmIE1BU0tfQkxLUFRSX0xPKSkKIAkJCQlhZGRyID0gTVNSX0FNRDY0X1NNQ0FfTUN4X01JU0N5KGJhbmssIGJsb2NrIC0gMSk7CiAJCX0KQEAgLTM5NSw2ICs0NjMsMjAgQEAKIAkJICovCiAJCXNtY2FfaGlnaCAmPSB+QklUKDIpOwogCisJCS8qCisJCSAqIFNNQ0Egc2V0cyB0aGUgRGVmZXJyZWQgRXJyb3IgSW50ZXJydXB0IHR5cGUgcGVyIGJhbmsuCisJCSAqCisJCSAqIE1DQV9DT05GSUdbRGVmZXJyZWRJbnRUeXBlU3VwcG9ydGVkXSBpcyBiaXQgNSwgYW5kIHRlbGxzIHVzCisJCSAqIGlmIHRoZSBEZWZlcnJlZEludFR5cGUgYml0IGZpZWxkIGlzIGF2YWlsYWJsZS4KKwkJICoKKwkJICogTUNBX0NPTkZJR1tEZWZlcnJlZEludFR5cGVdIGlzIGJpdHMgWzM4OjM3XSAoWzY6NV0gaW4gdGhlCisJCSAqIGhpZ2ggcG9ydGlvbiBvZiB0aGUgTVNSKS4gT1Mgc2hvdWxkIHNldCB0aGlzIHRvIDB4MSB0byBlbmFibGUKKwkJICogQVBJQyBiYXNlZCBpbnRlcnJ1cHQuIEZpcnN0LCBjaGVjayB0aGF0IG5vIGludGVycnVwdCBoYXMgYmVlbgorCQkgKiBzZXQuCisJCSAqLworCQlpZiAoKHNtY2FfbG93ICYgQklUKDUpKSAmJiAhKChzbWNhX2hpZ2ggPj4gNSkgJiAweDMpKQorCQkJc21jYV9oaWdoIHw9IEJJVCg1KTsKKwogCQl3cm1zcihzbWNhX2FkZHIsIHNtY2FfbG93LCBzbWNhX2hpZ2gpOwogCX0KIApAQCAtNDIxLDEyICs1MDMsMTUgQEAKIHZvaWQgbWNlX2FtZF9mZWF0dXJlX2luaXQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCXUzMiBsb3cgPSAwLCBoaWdoID0gMCwgYWRkcmVzcyA9IDA7Ci0JdW5zaWduZWQgaW50IGJhbmssIGJsb2NrOworCXVuc2lnbmVkIGludCBiYW5rLCBibG9jaywgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWludCBvZmZzZXQgPSAtMTsKIAogCWZvciAoYmFuayA9IDA7IGJhbmsgPCBtY2FfY2ZnLmJhbmtzOyArK2JhbmspIHsKKwkJaWYgKG1jZV9mbGFncy5zbWNhKQorCQkJZ2V0X3NtY2FfYmFua19pbmZvKGJhbmspOworCiAJCWZvciAoYmxvY2sgPSAwOyBibG9jayA8IE5SX0JMT0NLUzsgKytibG9jaykgewotCQkJYWRkcmVzcyA9IGdldF9ibG9ja19hZGRyZXNzKGFkZHJlc3MsIGxvdywgaGlnaCwgYmFuaywgYmxvY2spOworCQkJYWRkcmVzcyA9IGdldF9ibG9ja19hZGRyZXNzKGNwdSwgYWRkcmVzcywgbG93LCBoaWdoLCBiYW5rLCBibG9jayk7CiAJCQlpZiAoIWFkZHJlc3MpCiAJCQkJYnJlYWs7CiAKQEAgLTQ3Niw5ICs1NjEsMjcgQEAKIAlpZiAodGhyZXNob2xkX2VycikKIAkJbS5taXNjID0gbWlzYzsKIAotCWlmIChtLnN0YXR1cyAmIE1DSV9TVEFUVVNfQUREUlYpCisJaWYgKG0uc3RhdHVzICYgTUNJX1NUQVRVU19BRERSVikgewogCQlyZG1zcmwobXNyX2FkZHIsIG0uYWRkcik7CiAKKwkJLyoKKwkJICogRXh0cmFjdCBbNTU6PGxzYj5dIHdoZXJlIGxzYiBpcyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKKwkJICogKnZhbGlkKiBiaXQgb2YgdGhlIGFkZHJlc3MgYml0cy4KKwkJICovCisJCWlmIChtY2VfZmxhZ3Muc21jYSkgeworCQkJdTggbHNiID0gKG0uYWRkciA+PiA1NikgJiAweDNmOworCisJCQltLmFkZHIgJj0gR0VOTUFTS19VTEwoNTUsIGxzYik7CisJCX0KKwl9CisKKwlpZiAobWNlX2ZsYWdzLnNtY2EpIHsKKwkJcmRtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9JUElEKGJhbmspLCBtLmlwaWQpOworCisJCWlmIChtLnN0YXR1cyAmIE1DSV9TVEFUVVNfU1lORFYpCisJCQlyZG1zcmwoTVNSX0FNRDY0X1NNQ0FfTUN4X1NZTkQoYmFuayksIG0uc3luZCk7CisJfQorCiAJbWNlX2xvZygmbSk7CiAKIAl3cm1zcmwobXNyX3N0YXR1cywgMCk7CkBAIC01NDEsMTUgKzY0NCwxNCBAQAogc3RhdGljIHZvaWQgYW1kX3RocmVzaG9sZF9pbnRlcnJ1cHQodm9pZCkKIHsKIAl1MzIgbG93ID0gMCwgaGlnaCA9IDAsIGFkZHJlc3MgPSAwOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JdW5zaWduZWQgaW50IGJhbmssIGJsb2NrOworCXVuc2lnbmVkIGludCBiYW5rLCBibG9jaywgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJLyogYXNzdW1lIGZpcnN0IGJhbmsgY2F1c2VkIGl0ICovCiAJZm9yIChiYW5rID0gMDsgYmFuayA8IG1jYV9jZmcuYmFua3M7ICsrYmFuaykgewogCQlpZiAoIShwZXJfY3B1KGJhbmtfbWFwLCBjcHUpICYgKDEgPDwgYmFuaykpKQogCQkJY29udGludWU7CiAJCWZvciAoYmxvY2sgPSAwOyBibG9jayA8IE5SX0JMT0NLUzsgKytibG9jaykgewotCQkJYWRkcmVzcyA9IGdldF9ibG9ja19hZGRyZXNzKGFkZHJlc3MsIGxvdywgaGlnaCwgYmFuaywgYmxvY2spOworCQkJYWRkcmVzcyA9IGdldF9ibG9ja19hZGRyZXNzKGNwdSwgYWRkcmVzcywgbG93LCBoaWdoLCBiYW5rLCBibG9jayk7CiAJCQlpZiAoIWFkZHJlc3MpCiAJCQkJYnJlYWs7CiAKQEAgLTcxMyw2ICs4MTUsMzQgQEAKIAkuZGVmYXVsdF9hdHRycwkJPSBkZWZhdWx0X2F0dHJzLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKmdldF9uYW1lKHVuc2lnbmVkIGludCBiYW5rLCBzdHJ1Y3QgdGhyZXNob2xkX2Jsb2NrICpiKQoreworCXVuc2lnbmVkIGludCBiYW5rX3R5cGU7CisKKwlpZiAoIW1jZV9mbGFncy5zbWNhKSB7CisJCWlmIChiICYmIGJhbmsgPT0gNCkKKwkJCXJldHVybiBiYW5rNF9uYW1lcyhiKTsKKworCQlyZXR1cm4gdGhfbmFtZXNbYmFua107CisJfQorCisJaWYgKCFzbWNhX2JhbmtzW2JhbmtdLnR5cGUpCisJCXJldHVybiBOVUxMOworCisJYmFua190eXBlID0gc21jYV9iYW5rc1tiYW5rXS50eXBlLT5iYW5rX3R5cGU7CisKKwlpZiAoYiAmJiBiYW5rX3R5cGUgPT0gU01DQV9VTUMpIHsKKwkJaWYgKGItPmJsb2NrIDwgQVJSQVlfU0laRShzbWNhX3VtY19ibG9ja19uYW1lcykpCisJCQlyZXR1cm4gc21jYV91bWNfYmxvY2tfbmFtZXNbYi0+YmxvY2tdOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzbnByaW50ZihidWZfbWNhdHlwZSwgTUFYX01DQVRZUEVfTkFNRV9MRU4sCisJCSAiJXNfJXgiLCBzbWNhX2JhbmtfbmFtZXNbYmFua190eXBlXS5uYW1lLAorCQkJICBzbWNhX2JhbmtzW2JhbmtdLnR5cGVfaW5zdGFuY2UpOworCXJldHVybiBidWZfbWNhdHlwZTsKK30KKwogc3RhdGljIGludCBhbGxvY2F0ZV90aHJlc2hvbGRfYmxvY2tzKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBiYW5rLAogCQkJCSAgICAgdW5zaWduZWQgaW50IGJsb2NrLCB1MzIgYWRkcmVzcykKIHsKQEAgLTc2NywxMSArODk3LDExIEBACiAKIAllcnIgPSBrb2JqZWN0X2luaXRfYW5kX2FkZCgmYi0+a29iaiwgJnRocmVzaG9sZF9rdHlwZSwKIAkJCQkgICBwZXJfY3B1KHRocmVzaG9sZF9iYW5rcywgY3B1KVtiYW5rXS0+a29iaiwKLQkJCQkgICAoYmFuayA9PSA0ID8gYmFuazRfbmFtZXMoYikgOiB0aF9uYW1lc1tiYW5rXSkpOworCQkJCSAgIGdldF9uYW1lKGJhbmssIGIpKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlOwogcmVjdXJzZToKLQlhZGRyZXNzID0gZ2V0X2Jsb2NrX2FkZHJlc3MoYWRkcmVzcywgbG93LCBoaWdoLCBiYW5rLCArK2Jsb2NrKTsKKwlhZGRyZXNzID0gZ2V0X2Jsb2NrX2FkZHJlc3MoY3B1LCBhZGRyZXNzLCBsb3csIGhpZ2gsIGJhbmssICsrYmxvY2spOwogCWlmICghYWRkcmVzcykKIAkJcmV0dXJuIDA7CiAKQEAgLTgyMiw3ICs5NTIsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBlcl9jcHUobWNlX2RldmljZSwgY3B1KTsKIAlzdHJ1Y3QgYW1kX25vcnRoYnJpZGdlICpuYiA9IE5VTEw7CiAJc3RydWN0IHRocmVzaG9sZF9iYW5rICpiID0gTlVMTDsKLQljb25zdCBjaGFyICpuYW1lID0gdGhfbmFtZXNbYmFua107CisJY29uc3QgY2hhciAqbmFtZSA9IGdldF9uYW1lKGJhbmssIE5VTEwpOwogCWludCBlcnIgPSAwOwogCiAJaWYgKGlzX3NoYXJlZF9iYW5rKGJhbmspKSB7CkBAIC04NjksNyArOTk5LDcgQEAKIAkJfQogCX0KIAotCWVyciA9IGFsbG9jYXRlX3RocmVzaG9sZF9ibG9ja3MoY3B1LCBiYW5rLCAwLCBNU1JfSUEzMl9NQ3hfTUlTQyhiYW5rKSk7CisJZXJyID0gYWxsb2NhdGVfdGhyZXNob2xkX2Jsb2NrcyhjcHUsIGJhbmssIDAsIG1zcl9vcHMubWlzYyhiYW5rKSk7CiAJaWYgKCFlcnIpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21pY3JvY29kZS9hbWQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZC5jCmluZGV4IGI4MTY5NzEuLjYyMGFiMDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZC5jCkBAIC01NCw2ICs1NCw3IEBACiAgKi8KIHN0YXRpYyB1OCAqY29udGFpbmVyOwogc3RhdGljIHNpemVfdCBjb250YWluZXJfc2l6ZTsKK3N0YXRpYyBib29sIHVjb2RlX2J1aWx0aW47CiAKIHN0YXRpYyB1MzIgdWNvZGVfbmV3X3JldjsKIHN0YXRpYyB1OCBhbWRfdWNvZGVfcGF0Y2hbUEFUQ0hfTUFYX1NJWkVdOwpAQCAtMjgxLDE4ICsyODIsMjIgQEAKIHZvaWQgX19pbml0IGxvYWRfdWNvZGVfYW1kX2JzcCh1bnNpZ25lZCBpbnQgZmFtaWx5KQogewogCXN0cnVjdCBjcGlvX2RhdGEgY3A7CisJYm9vbCAqYnVpbHRpbjsKIAl2b2lkICoqZGF0YTsKIAlzaXplX3QgKnNpemU7CiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJZGF0YSA9ICAodm9pZCAqKilfX3BhX25vZGVidWcoJnVjb2RlX2NwaW8uZGF0YSk7CiAJc2l6ZSA9IChzaXplX3QgKilfX3BhX25vZGVidWcoJnVjb2RlX2NwaW8uc2l6ZSk7CisJYnVpbHRpbiA9IChib29sICopX19wYV9ub2RlYnVnKCZ1Y29kZV9idWlsdGluKTsKICNlbHNlCiAJZGF0YSA9ICZ1Y29kZV9jcGlvLmRhdGE7CiAJc2l6ZSA9ICZ1Y29kZV9jcGlvLnNpemU7CisJYnVpbHRpbiA9ICZ1Y29kZV9idWlsdGluOwogI2VuZGlmCiAKLQlpZiAoIWxvYWRfYnVpbHRpbl9hbWRfbWljcm9jb2RlKCZjcCwgZmFtaWx5KSkKKwkqYnVpbHRpbiA9IGxvYWRfYnVpbHRpbl9hbWRfbWljcm9jb2RlKCZjcCwgZmFtaWx5KTsKKwlpZiAoISpidWlsdGluKQogCQljcCA9IGZpbmRfdWNvZGVfaW5faW5pdHJkKCk7CiAKIAlpZiAoIShjcC5kYXRhICYmIGNwLnNpemUpKQpAQCAtMzczLDcgKzM3OCw4IEBACiAJCXJldHVybjsKIAogCS8qIEFkZCBDT05GSUdfUkFORE9NSVpFX01FTU9SWSBvZmZzZXQuICovCi0JY29udCArPSBQQUdFX09GRlNFVCAtIF9fUEFHRV9PRkZTRVRfQkFTRTsKKwlpZiAoIXVjb2RlX2J1aWx0aW4pCisJCWNvbnQgKz0gUEFHRV9PRkZTRVQgLSBfX1BBR0VfT0ZGU0VUX0JBU0U7CiAKIAllYXggPSBjcHVpZF9lYXgoMHgwMDAwMDAwMSk7CiAJZXEgID0gKHN0cnVjdCBlcXVpdl9jcHVfZW50cnkgKikoY29udCArIENPTlRBSU5FUl9IRFJfU1opOwpAQCAtNDM5LDcgKzQ0NSw4IEBACiAJCWNvbnRhaW5lciA9IGNvbnRfdmE7CiAKIAkvKiBBZGQgQ09ORklHX1JBTkRPTUlaRV9NRU1PUlkgb2Zmc2V0LiAqLwotCWNvbnRhaW5lciArPSBQQUdFX09GRlNFVCAtIF9fUEFHRV9PRkZTRVRfQkFTRTsKKwlpZiAoIXVjb2RlX2J1aWx0aW4pCisJCWNvbnRhaW5lciArPSBQQUdFX09GRlNFVCAtIF9fUEFHRV9PRkZTRVRfQkFTRTsKIAogCWVheCAgID0gY3B1aWRfZWF4KDB4MDAwMDAwMDEpOwogCWVheCAgID0gKChlYXggPj4gOCkgJiAweGYpICsgKChlYXggPj4gMjApICYgMHhmZik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21pY3JvY29kZS9jb3JlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21pY3JvY29kZS9jb3JlLmMKaW5kZXggZGYwNGIyZC4uNWNlNTE1NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvY29yZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2NvcmUuYwpAQCAtNTU4LDU1ICs1NTgsMzYgQEAKIAkucmVzdW1lCQkJPSBtY19icF9yZXN1bWUsCiB9OwogCi1zdGF0aWMgaW50Ci1tY19jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IG1jX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKIAlkZXYgPSBnZXRfY3B1X2RldmljZShjcHUpOworCW1pY3JvY29kZV91cGRhdGVfY3B1KGNwdSk7CisJcHJfZGVidWcoIkNQVSVkIGFkZGVkXG4iLCBjcHUpOwogCi0Jc3dpdGNoIChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgewotCWNhc2UgQ1BVX09OTElORToKLQkJbWljcm9jb2RlX3VwZGF0ZV9jcHUoY3B1KTsKLQkJcHJfZGVidWcoIkNQVSVkIGFkZGVkXG4iLCBjcHUpOwotCQkvKgotCQkgKiAiYnJlYWsiIGlzIG1pc3Npbmcgb24gcHVycG9zZSBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0byBmYWxsCi0JCSAqIHRocm91Z2ggaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSBzeXNmcyBncm91cC4KLQkJICovCisJaWYgKHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCkpCisJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSBncm91cCBmb3IgQ1BVJWRcbiIsIGNwdSk7CisJcmV0dXJuIDA7Cit9CiAKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQkJaWYgKHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCkpCi0JCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgZ3JvdXAgZm9yIENQVSVkXG4iLCBjcHUpOwotCQlicmVhazsKK3N0YXRpYyBpbnQgbWNfY3B1X2Rvd25fcHJlcCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKIAotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQkJLyogU3VzcGVuZCBpcyBpbiBwcm9ncmVzcywgb25seSByZW1vdmUgdGhlIGludGVyZmFjZSAqLwotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJm1jX2F0dHJfZ3JvdXApOwotCQlwcl9kZWJ1ZygiQ1BVJWQgcmVtb3ZlZFxuIiwgY3B1KTsKLQkJYnJlYWs7Ci0KKwlkZXYgPSBnZXRfY3B1X2RldmljZShjcHUpOworCS8qIFN1c3BlbmQgaXMgaW4gcHJvZ3Jlc3MsIG9ubHkgcmVtb3ZlIHRoZSBpbnRlcmZhY2UgKi8KKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJm1jX2F0dHJfZ3JvdXApOworCXByX2RlYnVnKCJDUFUlZCByZW1vdmVkXG4iLCBjcHUpOwogCS8qCi0JICogY2FzZSBDUFVfREVBRDoKLQkgKgogCSAqIFdoZW4gYSBDUFUgZ29lcyBvZmZsaW5lLCBkb24ndCBmcmVlIHVwIG9yIGludmFsaWRhdGUgdGhlIGNvcHkgb2YKIAkgKiB0aGUgbWljcm9jb2RlIGluIGtlcm5lbCBtZW1vcnksIHNvIHRoYXQgd2UgY2FuIHJldXNlIGl0IHdoZW4gdGhlCiAJICogQ1BVIGNvbWVzIGJhY2sgb25saW5lIHdpdGhvdXQgdW5uZWNlc3NhcmlseSByZXF1ZXN0aW5nIHRoZSB1c2Vyc3BhY2UKIAkgKiBmb3IgaXQgYWdhaW4uCiAJICovCi0JfQotCi0JLyogVGhlIENQVSByZWZ1c2VkIHRvIGNvbWUgdXAgZHVyaW5nIGEgc3lzdGVtIHJlc3VtZSAqLwotCWlmIChhY3Rpb24gPT0gQ1BVX1VQX0NBTkNFTEVEX0ZST1pFTikKLQkJbWljcm9jb2RlX2ZpbmlfY3B1KGNwdSk7Ci0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1jX2NwdV9ub3RpZmllciA9IHsKLQkubm90aWZpZXJfY2FsbAk9IG1jX2NwdV9jYWxsYmFjaywKLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjcHVfcm9vdF9taWNyb2NvZGVfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfcmVsb2FkLmF0dHIsCiAJTlVMTApAQCAtNjY1LDcgKzY0Niw4IEBACiAJCWdvdG8gb3V0X3Vjb2RlX2dyb3VwOwogCiAJcmVnaXN0ZXJfc3lzY29yZV9vcHMoJm1jX3N5c2NvcmVfb3BzKTsKLQlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm1jX2NwdV9ub3RpZmllcik7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLCAieDg2L21pY3JvY29kZTpvbmxpbmUiLAorCQkJCSAgbWNfY3B1X29ubGluZSwgbWNfY3B1X2Rvd25fcHJlcCk7CiAKIAlwcl9pbmZvKCJNaWNyb2NvZGUgVXBkYXRlIERyaXZlcjogdiIgTUlDUk9DT0RFX1ZFUlNJT04KIAkJIiA8dGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrPiwgUGV0ZXIgT3J1YmFcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL21haW4uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMKaW5kZXggMjhmMWI1NC4uMjRlODdlNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL21haW4uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCkBAIC03MiwxNCArNzIsMTQgQEAKIHU2NCBzaXplX29yX21hc2ssIHNpemVfYW5kX21hc2s7CiBzdGF0aWMgYm9vbCBtdHJyX2Fwc19kZWxheWVkX2luaXQ7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbXRycl9vcHMgKm10cnJfb3BzW1g4Nl9WRU5ET1JfTlVNXTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRycl9vcHMgKm10cnJfb3BzW1g4Nl9WRU5ET1JfTlVNXSBfX3JvX2FmdGVyX2luaXQ7CiAKIGNvbnN0IHN0cnVjdCBtdHJyX29wcyAqbXRycl9pZjsKIAogc3RhdGljIHZvaWQgc2V0X210cnIodW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgbG9uZyBiYXNlLAogCQkgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgbXRycl90eXBlIHR5cGUpOwogCi12b2lkIHNldF9tdHJyX29wcyhjb25zdCBzdHJ1Y3QgbXRycl9vcHMgKm9wcykKK3ZvaWQgX19pbml0IHNldF9tdHJyX29wcyhjb25zdCBzdHJ1Y3QgbXRycl9vcHMgKm9wcykKIHsKIAlpZiAob3BzLT52ZW5kb3IgJiYgb3BzLT52ZW5kb3IgPCBYODZfVkVORE9SX05VTSkKIAkJbXRycl9vcHNbb3BzLT52ZW5kb3JdID0gb3BzOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL210cnIuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmgKaW5kZXggNmM3Y2VkMC4uYWQ4YmQ3NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL210cnIuaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbXRyci5oCkBAIC01NCw3ICs1NCw3IEBACiBib29sIGdldF9tdHJyX3N0YXRlKHZvaWQpOwogdm9pZCBtdHJyX2JwX3BhdF9pbml0KHZvaWQpOwogCi1leHRlcm4gdm9pZCBzZXRfbXRycl9vcHMoY29uc3Qgc3RydWN0IG10cnJfb3BzICpvcHMpOworZXh0ZXJuIHZvaWQgX19pbml0IHNldF9tdHJyX29wcyhjb25zdCBzdHJ1Y3QgbXRycl9vcHMgKm9wcyk7CiAKIGV4dGVybiB1NjQgc2l6ZV9vcl9tYXNrLCBzaXplX2FuZF9tYXNrOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBtdHJyX29wcyAqbXRycl9pZjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYwppbmRleCA5MmU4ZjBhLi45YjdjZjVjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KIAogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+Ci0KKyNpbmNsdWRlIDxhc20vdW53aW5kLmg+CiAKIGludCBwYW5pY19vbl91bnJlY292ZXJlZF9ubWk7CiBpbnQgcGFuaWNfb25faW9fbm1pOwpAQCAtMjUsMTEgKzI1LDI5IEBACiBpbnQga3N0YWNrX2RlcHRoX3RvX3ByaW50ID0gMyAqIFNUQUNLU0xPVFNfUEVSX0xJTkU7CiBzdGF0aWMgaW50IGRpZV9jb3VudGVyOwogCi1zdGF0aWMgdm9pZCBwcmludGtfc3RhY2tfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCByZWxpYWJsZSwKLQkJdm9pZCAqZGF0YSkKK2Jvb2wgaW5fdGFza19zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkgICBzdHJ1Y3Qgc3RhY2tfaW5mbyAqaW5mbykKIHsKKwl1bnNpZ25lZCBsb25nICpiZWdpbiA9IHRhc2tfc3RhY2tfcGFnZSh0YXNrKTsKKwl1bnNpZ25lZCBsb25nICplbmQgICA9IHRhc2tfc3RhY2tfcGFnZSh0YXNrKSArIFRIUkVBRF9TSVpFOworCisJaWYgKHN0YWNrIDwgYmVnaW4gfHwgc3RhY2sgPj0gZW5kKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpbmZvLT50eXBlCT0gU1RBQ0tfVFlQRV9UQVNLOworCWluZm8tPmJlZ2luCT0gYmVnaW47CisJaW5mby0+ZW5kCT0gZW5kOworCWluZm8tPm5leHRfc3AJPSBOVUxMOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50a19zdGFja19hZGRyZXNzKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IHJlbGlhYmxlLAorCQkJCSBjaGFyICpsb2dfbHZsKQoreworCXRvdWNoX25taV93YXRjaGRvZygpOwogCXByaW50aygiJXMgWzwlcD5dICVzJXBCXG4iLAotCQkoY2hhciAqKWRhdGEsICh2b2lkICopYWRkcmVzcywgcmVsaWFibGUgPyAiIiA6ICI/ICIsCisJCWxvZ19sdmwsICh2b2lkICopYWRkcmVzcywgcmVsaWFibGUgPyAiIiA6ICI/ICIsCiAJCSh2b2lkICopYWRkcmVzcyk7CiB9CiAKQEAgLTM4LDE3NiArNTYsMTIwIEBACiAJcHJfY29udCgiIFs8JXA+XSAlcFNcbiIsICh2b2lkICopYWRkcmVzcywgKHZvaWQgKilhZGRyZXNzKTsKIH0KIAotI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKLXN0YXRpYyB2b2lkCi1wcmludF9mdHJhY2VfZ3JhcGhfYWRkcih1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmRhdGEsCi0JCQljb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywKLQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50ICpncmFwaCkKK3ZvaWQgc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQl1bnNpZ25lZCBsb25nICpzdGFjaywgY2hhciAqbG9nX2x2bCkKIHsKLQl1bnNpZ25lZCBsb25nIHJldF9hZGRyOwotCWludCBpbmRleDsKKwlzdHJ1Y3QgdW53aW5kX3N0YXRlIHN0YXRlOworCXN0cnVjdCBzdGFja19pbmZvIHN0YWNrX2luZm8gPSB7MH07CisJdW5zaWduZWQgbG9uZyB2aXNpdF9tYXNrID0gMDsKKwlpbnQgZ3JhcGhfaWR4ID0gMDsKIAotCWlmIChhZGRyICE9ICh1bnNpZ25lZCBsb25nKXJldHVybl90b19oYW5kbGVyKQotCQlyZXR1cm47CisJcHJpbnRrKCIlc0NhbGwgVHJhY2U6XG4iLCBsb2dfbHZsKTsKIAotCWluZGV4ID0gdGFzay0+Y3Vycl9yZXRfc3RhY2s7Ci0KLQlpZiAoIXRhc2stPnJldF9zdGFjayB8fCBpbmRleCA8ICpncmFwaCkKLQkJcmV0dXJuOwotCi0JaW5kZXggLT0gKmdyYXBoOwotCXJldF9hZGRyID0gdGFzay0+cmV0X3N0YWNrW2luZGV4XS5yZXQ7Ci0KLQlvcHMtPmFkZHJlc3MoZGF0YSwgcmV0X2FkZHIsIDEpOwotCi0JKCpncmFwaCkrKzsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQKLXByaW50X2Z0cmFjZV9ncmFwaF9hZGRyKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSwKLQkJCWNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLAotCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgKmdyYXBoKQoteyB9Ci0jZW5kaWYKLQotLyoKLSAqIHg4Ni02NCBjYW4gaGF2ZSB1cCB0byB0aHJlZSBrZXJuZWwgc3RhY2tzOgotICogcHJvY2VzcyBzdGFjawotICogaW50ZXJydXB0IHN0YWNrCi0gKiBzZXZlcmUgZXhjZXB0aW9uIChkb3VibGUgZmF1bHQsIG5taSwgc3RhY2sgZmF1bHQsIGRlYnVnLCBtY2UpIGhhcmR3YXJlIHN0YWNrCi0gKi8KLQotc3RhdGljIGlubGluZSBpbnQgdmFsaWRfc3RhY2tfcHRyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJCXZvaWQgKnAsIHVuc2lnbmVkIGludCBzaXplLCB2b2lkICplbmQpCi17Ci0Jdm9pZCAqdCA9IHRhc2tfc3RhY2tfcGFnZSh0YXNrKTsKLQlpZiAoZW5kKSB7Ci0JCWlmIChwIDwgZW5kICYmIHAgPj0gKGVuZC1USFJFQURfU0laRSkpCi0JCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiBwID49IHQgJiYgcCA8IHQgKyBUSFJFQURfU0laRSAtIHNpemU7Ci19Ci0KLXVuc2lnbmVkIGxvbmcKLXByaW50X2NvbnRleHRfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKLQkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEsCi0JCXVuc2lnbmVkIGxvbmcgKmVuZCwgaW50ICpncmFwaCkKLXsKLQlzdHJ1Y3Qgc3RhY2tfZnJhbWUgKmZyYW1lID0gKHN0cnVjdCBzdGFja19mcmFtZSAqKWJwOworCXVud2luZF9zdGFydCgmc3RhdGUsIHRhc2ssIHJlZ3MsIHN0YWNrKTsKIAogCS8qCi0JICogSWYgd2Ugb3ZlcmZsb3dlZCB0aGUgc3RhY2sgaW50byBhIGd1YXJkIHBhZ2UsIGp1bXAgYmFjayB0byB0aGUKLQkgKiBib3R0b20gb2YgdGhlIHVzYWJsZSBzdGFjay4KKwkgKiBJdGVyYXRlIHRocm91Z2ggdGhlIHN0YWNrcywgc3RhcnRpbmcgd2l0aCB0aGUgY3VycmVudCBzdGFjayBwb2ludGVyLgorCSAqIEVhY2ggc3RhY2sgaGFzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBvbmUuCisJICoKKwkgKiB4ODYtNjQgY2FuIGhhdmUgc2V2ZXJhbCBzdGFja3M6CisJICogLSB0YXNrIHN0YWNrCisJICogLSBpbnRlcnJ1cHQgc3RhY2sKKwkgKiAtIEhXIGV4Y2VwdGlvbiBzdGFja3MgKGRvdWJsZSBmYXVsdCwgbm1pLCBkZWJ1ZywgbWNlKQorCSAqCisJICogeDg2LTMyIGNhbiBoYXZlIHVwIHRvIHRocmVlIHN0YWNrczoKKwkgKiAtIHRhc2sgc3RhY2sKKwkgKiAtIHNvZnRpcnEgc3RhY2sKKwkgKiAtIGhhcmRpcnEgc3RhY2sKIAkgKi8KLQlpZiAoKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHRhc2spIC0gKHVuc2lnbmVkIGxvbmcpc3RhY2sgPAotCSAgICBQQUdFX1NJWkUpCi0JCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrX3N0YWNrX3BhZ2UodGFzayk7CisJZm9yICg7IHN0YWNrOyBzdGFjayA9IHN0YWNrX2luZm8ubmV4dF9zcCkgeworCQljb25zdCBjaGFyICpzdHJfYmVnaW4sICpzdHJfZW5kOwogCi0Jd2hpbGUgKHZhbGlkX3N0YWNrX3B0cih0YXNrLCBzdGFjaywgc2l6ZW9mKCpzdGFjayksIGVuZCkpIHsKLQkJdW5zaWduZWQgbG9uZyBhZGRyOworCQkvKgorCQkgKiBJZiB3ZSBvdmVyZmxvd2VkIHRoZSB0YXNrIHN0YWNrIGludG8gYSBndWFyZCBwYWdlLCBqdW1wIGJhY2sKKwkJICogdG8gdGhlIGJvdHRvbSBvZiB0aGUgdXNhYmxlIHN0YWNrLgorCQkgKi8KKwkJaWYgKHRhc2tfc3RhY2tfcGFnZSh0YXNrKSAtICh2b2lkICopc3RhY2sgPCBQQUdFX1NJWkUpCisJCQlzdGFjayA9IHRhc2tfc3RhY2tfcGFnZSh0YXNrKTsKIAotCQlhZGRyID0gKnN0YWNrOwotCQlpZiAoX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKSB7Ci0JCQlpZiAoKHVuc2lnbmVkIGxvbmcpIHN0YWNrID09IGJwICsgc2l6ZW9mKGxvbmcpKSB7Ci0JCQkJb3BzLT5hZGRyZXNzKGRhdGEsIGFkZHIsIDEpOwotCQkJCWZyYW1lID0gZnJhbWUtPm5leHRfZnJhbWU7Ci0JCQkJYnAgPSAodW5zaWduZWQgbG9uZykgZnJhbWU7Ci0JCQl9IGVsc2UgewotCQkJCW9wcy0+YWRkcmVzcyhkYXRhLCBhZGRyLCAwKTsKLQkJCX0KLQkJCXByaW50X2Z0cmFjZV9ncmFwaF9hZGRyKGFkZHIsIGRhdGEsIG9wcywgdGFzaywgZ3JhcGgpOworCQlpZiAoZ2V0X3N0YWNrX2luZm8oc3RhY2ssIHRhc2ssICZzdGFja19pbmZvLCAmdmlzaXRfbWFzaykpCisJCQlicmVhazsKKworCQlzdGFja190eXBlX3N0cihzdGFja19pbmZvLnR5cGUsICZzdHJfYmVnaW4sICZzdHJfZW5kKTsKKwkJaWYgKHN0cl9iZWdpbikKKwkJCXByaW50aygiJXMgPCVzPiAiLCBsb2dfbHZsLCBzdHJfYmVnaW4pOworCisJCS8qCisJCSAqIFNjYW4gdGhlIHN0YWNrLCBwcmludGluZyBhbnkgdGV4dCBhZGRyZXNzZXMgd2UgZmluZC4gIEF0IHRoZQorCQkgKiBzYW1lIHRpbWUsIGZvbGxvdyBwcm9wZXIgc3RhY2sgZnJhbWVzIHdpdGggdGhlIHVud2luZGVyLgorCQkgKgorCQkgKiBBZGRyZXNzZXMgZm91bmQgZHVyaW5nIHRoZSBzY2FuIHdoaWNoIGFyZSBub3QgcmVwb3J0ZWQgYnkKKwkJICogdGhlIHVud2luZGVyIGFyZSBjb25zaWRlcmVkIHRvIGJlIGFkZGl0aW9uYWwgY2x1ZXMgd2hpY2ggYXJlCisJCSAqIHNvbWV0aW1lcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgYXJlIHByZWZpeGVkIHdpdGggJz8nLgorCQkgKiBUaGlzIGFsc28gc2VydmVzIGFzIGEgZmFpbHNhZmUgb3B0aW9uIGluIGNhc2UgdGhlIHVud2luZGVyCisJCSAqIGdvZXMgb2ZmIGluIHRoZSB3ZWVkcy4KKwkJICovCisJCWZvciAoOyBzdGFjayA8IHN0YWNrX2luZm8uZW5kOyBzdGFjaysrKSB7CisJCQl1bnNpZ25lZCBsb25nIHJlYWxfYWRkcjsKKwkJCWludCByZWxpYWJsZSA9IDA7CisJCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAqc3RhY2s7CisJCQl1bnNpZ25lZCBsb25nICpyZXRfYWRkcl9wID0KKwkJCQl1bndpbmRfZ2V0X3JldHVybl9hZGRyZXNzX3B0cigmc3RhdGUpOworCisJCQlpZiAoIV9fa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHN0YWNrID09IHJldF9hZGRyX3ApCisJCQkJcmVsaWFibGUgPSAxOworCisJCQkvKgorCQkJICogV2hlbiBmdW5jdGlvbiBncmFwaCB0cmFjaW5nIGlzIGVuYWJsZWQgZm9yIGEKKwkJCSAqIGZ1bmN0aW9uLCBpdHMgcmV0dXJuIGFkZHJlc3Mgb24gdGhlIHN0YWNrIGlzCisJCQkgKiByZXBsYWNlZCB3aXRoIHRoZSBhZGRyZXNzIG9mIGFuIGZ0cmFjZSBoYW5kbGVyCisJCQkgKiAocmV0dXJuX3RvX2hhbmRsZXIpLiAgSW4gdGhhdCBjYXNlLCBiZWZvcmUgcHJpbnRpbmcKKwkJCSAqIHRoZSAicmVhbCIgYWRkcmVzcywgd2Ugd2FudCB0byBwcmludCB0aGUgaGFuZGxlcgorCQkJICogYWRkcmVzcyBhcyBhbiAidW5yZWxpYWJsZSIgaGludCB0aGF0IGZ1bmN0aW9uIGdyYXBoCisJCQkgKiB0cmFjaW5nIHdhcyBpbnZvbHZlZC4KKwkJCSAqLworCQkJcmVhbF9hZGRyID0gZnRyYWNlX2dyYXBoX3JldF9hZGRyKHRhc2ssICZncmFwaF9pZHgsCisJCQkJCQkJICBhZGRyLCBzdGFjayk7CisJCQlpZiAocmVhbF9hZGRyICE9IGFkZHIpCisJCQkJcHJpbnRrX3N0YWNrX2FkZHJlc3MoYWRkciwgMCwgbG9nX2x2bCk7CisJCQlwcmludGtfc3RhY2tfYWRkcmVzcyhyZWFsX2FkZHIsIHJlbGlhYmxlLCBsb2dfbHZsKTsKKworCQkJaWYgKCFyZWxpYWJsZSkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIEdldCB0aGUgbmV4dCBmcmFtZSBmcm9tIHRoZSB1bndpbmRlci4gIE5vIG5lZWQgdG8KKwkJCSAqIGNoZWNrIGZvciBhbiBlcnJvcjogaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgdGhlIHJlc3QKKwkJCSAqIG9mIHRoZSBhZGRyZXNzZXMgd2lsbCBqdXN0IGJlIHByaW50ZWQgYXMgdW5yZWxpYWJsZS4KKwkJCSAqLworCQkJdW53aW5kX25leHRfZnJhbWUoJnN0YXRlKTsKIAkJfQotCQlzdGFjaysrOworCisJCWlmIChzdHJfZW5kKQorCQkJcHJpbnRrKCIlcyA8JXM+ICIsIGxvZ19sdmwsIHN0cl9lbmQpOwogCX0KLQlyZXR1cm4gYnA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChwcmludF9jb250ZXh0X3N0YWNrKTsKLQotdW5zaWduZWQgbG9uZwotcHJpbnRfY29udGV4dF9zdGFja19icChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyAqZW5kLCBpbnQgKmdyYXBoKQotewotCXN0cnVjdCBzdGFja19mcmFtZSAqZnJhbWUgPSAoc3RydWN0IHN0YWNrX2ZyYW1lICopYnA7Ci0JdW5zaWduZWQgbG9uZyAqcmV0X2FkZHIgPSAmZnJhbWUtPnJldHVybl9hZGRyZXNzOwotCi0Jd2hpbGUgKHZhbGlkX3N0YWNrX3B0cih0YXNrLCByZXRfYWRkciwgc2l6ZW9mKCpyZXRfYWRkciksIGVuZCkpIHsKLQkJdW5zaWduZWQgbG9uZyBhZGRyID0gKnJldF9hZGRyOwotCi0JCWlmICghX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKQotCQkJYnJlYWs7Ci0KLQkJaWYgKG9wcy0+YWRkcmVzcyhkYXRhLCBhZGRyLCAxKSkKLQkJCWJyZWFrOwotCQlmcmFtZSA9IGZyYW1lLT5uZXh0X2ZyYW1lOwotCQlyZXRfYWRkciA9ICZmcmFtZS0+cmV0dXJuX2FkZHJlc3M7Ci0JCXByaW50X2Z0cmFjZV9ncmFwaF9hZGRyKGFkZHIsIGRhdGEsIG9wcywgdGFzaywgZ3JhcGgpOwotCX0KLQotCXJldHVybiAodW5zaWduZWQgbG9uZylmcmFtZTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHByaW50X2NvbnRleHRfc3RhY2tfYnApOwotCi1zdGF0aWMgaW50IHByaW50X3RyYWNlX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCi17Ci0JcHJpbnRrKCIlcyA8JXM+ICIsIChjaGFyICopZGF0YSwgbmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBQcmludCBvbmUgYWRkcmVzcy9zeW1ib2wgZW50cmllcyBwZXIgbGluZS4KLSAqLwotc3RhdGljIGludCBwcmludF90cmFjZV9hZGRyZXNzKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHJlbGlhYmxlKQotewotCXRvdWNoX25taV93YXRjaGRvZygpOwotCXByaW50a19zdGFja19hZGRyZXNzKGFkZHIsIHJlbGlhYmxlLCBkYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyBwcmludF90cmFjZV9vcHMgPSB7Ci0JLnN0YWNrCQkJPSBwcmludF90cmFjZV9zdGFjaywKLQkuYWRkcmVzcwkJPSBwcmludF90cmFjZV9hZGRyZXNzLAotCS53YWxrX3N0YWNrCQk9IHByaW50X2NvbnRleHRfc3RhY2ssCi19OwotCi12b2lkCi1zaG93X3RyYWNlX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJdW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgYnAsIGNoYXIgKmxvZ19sdmwpCi17Ci0JcHJpbnRrKCIlc0NhbGwgVHJhY2U6XG4iLCBsb2dfbHZsKTsKLQlkdW1wX3RyYWNlKHRhc2ssIHJlZ3MsIHN0YWNrLCBicCwgJnByaW50X3RyYWNlX29wcywgbG9nX2x2bCk7Ci19Ci0KLXZvaWQgc2hvd190cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCkKLXsKLQlzaG93X3RyYWNlX2xvZ19sdmwodGFzaywgcmVncywgc3RhY2ssIGJwLCAiIik7CiB9CiAKIHZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnNwKQogewotCXVuc2lnbmVkIGxvbmcgYnAgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhY2s7CisJdGFzayA9IHRhc2sgPyA6IGN1cnJlbnQ7CiAKIAkvKgogCSAqIFN0YWNrIGZyYW1lcyBiZWxvdyB0aGlzIG9uZSBhcmVuJ3QgaW50ZXJlc3RpbmcuICBEb24ndCBzaG93IHRoZW0KIAkgKiBpZiB3ZSdyZSBwcmludGluZyBmb3IgJWN1cnJlbnQuCiAJICovCi0JaWYgKCFzcCAmJiAoIXRhc2sgfHwgdGFzayA9PSBjdXJyZW50KSkgewotCQlzcCA9ICZzdGFjazsKLQkJYnAgPSBzdGFja19mcmFtZShjdXJyZW50LCBOVUxMKTsKLQl9CisJaWYgKCFzcCAmJiB0YXNrID09IGN1cnJlbnQpCisJCXNwID0gZ2V0X3N0YWNrX3BvaW50ZXIoY3VycmVudCwgTlVMTCk7CiAKLQlzaG93X3N0YWNrX2xvZ19sdmwodGFzaywgTlVMTCwgc3AsIGJwLCAiIik7CisJc2hvd19zdGFja19sb2dfbHZsKHRhc2ssIE5VTEwsIHNwLCAiIik7CiB9CiAKIHZvaWQgc2hvd19zdGFja19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXNob3dfc3RhY2tfbG9nX2x2bChjdXJyZW50LCByZWdzLCAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnNwLCByZWdzLT5icCwgIiIpOworCXNob3dfc3RhY2tfbG9nX2x2bChjdXJyZW50LCByZWdzLCBOVUxMLCAiIik7CiB9CiAKIHN0YXRpYyBhcmNoX3NwaW5sb2NrX3QgZGllX2xvY2sgPSBfX0FSQ0hfU1BJTl9MT0NLX1VOTE9DS0VEOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jCmluZGV4IDA5Njc1NzEuLjA2ZWIzMjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMKQEAgLTE2LDkzICsxNiwxMjEgQEAKIAogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CiAKLXN0YXRpYyB2b2lkICppc19pcnFfc3RhY2sodm9pZCAqcCwgdm9pZCAqaXJxKQordm9pZCBzdGFja190eXBlX3N0cihlbnVtIHN0YWNrX3R5cGUgdHlwZSwgY29uc3QgY2hhciAqKmJlZ2luLCBjb25zdCBjaGFyICoqZW5kKQogewotCWlmIChwIDwgaXJxIHx8IHAgPj0gKGlycSArIFRIUkVBRF9TSVpFKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIGlycSArIFRIUkVBRF9TSVpFOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU1RBQ0tfVFlQRV9JUlE6CisJY2FzZSBTVEFDS19UWVBFX1NPRlRJUlE6CisJCSpiZWdpbiA9ICJJUlEiOworCQkqZW5kICAgPSAiRU9JIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKmJlZ2luID0gTlVMTDsKKwkJKmVuZCAgID0gTlVMTDsKKwl9CiB9CiAKLQotc3RhdGljIHZvaWQgKmlzX2hhcmRpcnFfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2ssIGludCBjcHUpCitzdGF0aWMgYm9vbCBpbl9oYXJkaXJxX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBzdHJ1Y3Qgc3RhY2tfaW5mbyAqaW5mbykKIHsKLQl2b2lkICppcnEgPSBwZXJfY3B1KGhhcmRpcnFfc3RhY2ssIGNwdSk7CisJdW5zaWduZWQgbG9uZyAqYmVnaW4gPSAodW5zaWduZWQgbG9uZyAqKXRoaXNfY3B1X3JlYWQoaGFyZGlycV9zdGFjayk7CisJdW5zaWduZWQgbG9uZyAqZW5kICAgPSBiZWdpbiArIChUSFJFQURfU0laRSAvIHNpemVvZihsb25nKSk7CiAKLQlyZXR1cm4gaXNfaXJxX3N0YWNrKHN0YWNrLCBpcnEpOworCS8qCisJICogVGhpcyBpcyBhIHNvZnR3YXJlIHN0YWNrLCBzbyAnZW5kJyBjYW4gYmUgYSB2YWxpZCBzdGFjayBwb2ludGVyLgorCSAqIEl0IGp1c3QgbWVhbnMgdGhlIHN0YWNrIGlzIGVtcHR5LgorCSAqLworCWlmIChzdGFjayA8IGJlZ2luIHx8IHN0YWNrID4gZW5kKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpbmZvLT50eXBlCT0gU1RBQ0tfVFlQRV9JUlE7CisJaW5mby0+YmVnaW4JPSBiZWdpbjsKKwlpbmZvLT5lbmQJPSBlbmQ7CisKKwkvKgorCSAqIFNlZSBpcnFfMzIuYyAtLSB0aGUgbmV4dCBzdGFjayBwb2ludGVyIGlzIHN0b3JlZCBhdCB0aGUgYmVnaW5uaW5nIG9mCisJICogdGhlIHN0YWNrLgorCSAqLworCWluZm8tPm5leHRfc3AJPSAodW5zaWduZWQgbG9uZyAqKSpiZWdpbjsKKworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgdm9pZCAqaXNfc29mdGlycV9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgaW50IGNwdSkKK3N0YXRpYyBib29sIGluX3NvZnRpcnFfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2ssIHN0cnVjdCBzdGFja19pbmZvICppbmZvKQogewotCXZvaWQgKmlycSA9IHBlcl9jcHUoc29mdGlycV9zdGFjaywgY3B1KTsKKwl1bnNpZ25lZCBsb25nICpiZWdpbiA9ICh1bnNpZ25lZCBsb25nICopdGhpc19jcHVfcmVhZChzb2Z0aXJxX3N0YWNrKTsKKwl1bnNpZ25lZCBsb25nICplbmQgICA9IGJlZ2luICsgKFRIUkVBRF9TSVpFIC8gc2l6ZW9mKGxvbmcpKTsKIAotCXJldHVybiBpc19pcnFfc3RhY2soc3RhY2ssIGlycSk7CisJLyoKKwkgKiBUaGlzIGlzIGEgc29mdHdhcmUgc3RhY2ssIHNvICdlbmQnIGNhbiBiZSBhIHZhbGlkIHN0YWNrIHBvaW50ZXIuCisJICogSXQganVzdCBtZWFucyB0aGUgc3RhY2sgaXMgZW1wdHkuCisJICovCisJaWYgKHN0YWNrIDwgYmVnaW4gfHwgc3RhY2sgPiBlbmQpCisJCXJldHVybiBmYWxzZTsKKworCWluZm8tPnR5cGUJPSBTVEFDS19UWVBFX1NPRlRJUlE7CisJaW5mby0+YmVnaW4JPSBiZWdpbjsKKwlpbmZvLT5lbmQJPSBlbmQ7CisKKwkvKgorCSAqIFRoZSBuZXh0IHN0YWNrIHBvaW50ZXIgaXMgc3RvcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0YWNrLgorCSAqIFNlZSBpcnFfMzIuYy4KKwkgKi8KKwlpbmZvLT5uZXh0X3NwCT0gKHVuc2lnbmVkIGxvbmcgKikqYmVnaW47CisKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBkdW1wX3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCXVuc2lnbmVkIGxvbmcgKnN0YWNrLCB1bnNpZ25lZCBsb25nIGJwLAotCQljb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywgdm9pZCAqZGF0YSkKK2ludCBnZXRfc3RhY2tfaW5mbyh1bnNpZ25lZCBsb25nICpzdGFjaywgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkgICBzdHJ1Y3Qgc3RhY2tfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyAqdmlzaXRfbWFzaykKIHsKLQljb25zdCB1bnNpZ25lZCBjcHUgPSBnZXRfY3B1KCk7Ci0JaW50IGdyYXBoID0gMDsKLQl1MzIgKnByZXZfZXNwOworCWlmICghc3RhY2spCisJCWdvdG8gdW5rbm93bjsKIAotCWlmICghdGFzaykKLQkJdGFzayA9IGN1cnJlbnQ7CisJdGFzayA9IHRhc2sgPyA6IGN1cnJlbnQ7CiAKLQlpZiAoIXN0YWNrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZHVtbXk7CisJaWYgKGluX3Rhc2tfc3RhY2soc3RhY2ssIHRhc2ssIGluZm8pKQorCQlnb3RvIHJlY3Vyc2lvbl9jaGVjazsKIAotCQlzdGFjayA9ICZkdW1teTsKLQkJaWYgKHRhc2sgIT0gY3VycmVudCkKLQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKil0YXNrLT50aHJlYWQuc3A7CisJaWYgKHRhc2sgIT0gY3VycmVudCkKKwkJZ290byB1bmtub3duOworCisJaWYgKGluX2hhcmRpcnFfc3RhY2soc3RhY2ssIGluZm8pKQorCQlnb3RvIHJlY3Vyc2lvbl9jaGVjazsKKworCWlmIChpbl9zb2Z0aXJxX3N0YWNrKHN0YWNrLCBpbmZvKSkKKwkJZ290byByZWN1cnNpb25fY2hlY2s7CisKKwlnb3RvIHVua25vd247CisKK3JlY3Vyc2lvbl9jaGVjazoKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBpdGVyYXRlIHRocm91Z2ggYW55IGdpdmVuIHN0YWNrIG1vcmUgdGhhbiBvbmNlLgorCSAqIElmIGl0IGNvbWVzIHVwIGEgc2Vjb25kIHRpbWUgdGhlbiB0aGVyZSdzIHNvbWV0aGluZyB3cm9uZyBnb2luZyBvbjoKKwkgKiBqdXN0IGJyZWFrIG91dCBhbmQgcmVwb3J0IGFuIHVua25vd24gc3RhY2sgdHlwZS4KKwkgKi8KKwlpZiAodmlzaXRfbWFzaykgeworCQlpZiAoKnZpc2l0X21hc2sgJiAoMVVMIDw8IGluZm8tPnR5cGUpKQorCQkJZ290byB1bmtub3duOworCQkqdmlzaXRfbWFzayB8PSAxVUwgPDwgaW5mby0+dHlwZTsKIAl9CiAKLQlpZiAoIWJwKQotCQlicCA9IHN0YWNrX2ZyYW1lKHRhc2ssIHJlZ3MpOworCXJldHVybiAwOwogCi0JZm9yICg7OykgewotCQl2b2lkICplbmRfc3RhY2s7Ci0KLQkJZW5kX3N0YWNrID0gaXNfaGFyZGlycV9zdGFjayhzdGFjaywgY3B1KTsKLQkJaWYgKCFlbmRfc3RhY2spCi0JCQllbmRfc3RhY2sgPSBpc19zb2Z0aXJxX3N0YWNrKHN0YWNrLCBjcHUpOwotCi0JCWJwID0gb3BzLT53YWxrX3N0YWNrKHRhc2ssIHN0YWNrLCBicCwgb3BzLCBkYXRhLAotCQkJCSAgICAgZW5kX3N0YWNrLCAmZ3JhcGgpOwotCi0JCS8qIFN0b3AgaWYgbm90IG9uIGlycSBzdGFjayAqLwotCQlpZiAoIWVuZF9zdGFjaykKLQkJCWJyZWFrOwotCi0JCS8qIFRoZSBwcmV2aW91cyBlc3AgaXMgc2F2ZWQgb24gdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sgKi8KLQkJcHJldl9lc3AgPSAodTMyICopKGVuZF9zdGFjayAtIFRIUkVBRF9TSVpFKTsKLQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKSpwcmV2X2VzcDsKLQkJaWYgKCFzdGFjaykKLQkJCWJyZWFrOwotCi0JCWlmIChvcHMtPnN0YWNrKGRhdGEsICJJUlEiKSA8IDApCi0JCQlicmVhazsKLQkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7Ci0JfQotCXB1dF9jcHUoKTsKK3Vua25vd246CisJaW5mby0+dHlwZSA9IFNUQUNLX1RZUEVfVU5LTk9XTjsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KLUVYUE9SVF9TWU1CT0woZHVtcF90cmFjZSk7CiAKLXZvaWQKLXNob3dfc3RhY2tfbG9nX2x2bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQkgICB1bnNpZ25lZCBsb25nICpzcCwgdW5zaWduZWQgbG9uZyBicCwgY2hhciAqbG9nX2x2bCkKK3ZvaWQgc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQl1bnNpZ25lZCBsb25nICpzcCwgY2hhciAqbG9nX2x2bCkKIHsKIAl1bnNpZ25lZCBsb25nICpzdGFjazsKIAlpbnQgaTsKIAotCWlmIChzcCA9PSBOVUxMKSB7Ci0JCWlmIChyZWdzKQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnNwOwotCQllbHNlIGlmICh0YXNrKQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5zcDsKLQkJZWxzZQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSZzcDsKLQl9CisJaWYgKCF0cnlfZ2V0X3Rhc2tfc3RhY2sodGFzaykpCisJCXJldHVybjsKKworCXNwID0gc3AgPyA6IGdldF9zdGFja19wb2ludGVyKHRhc2ssIHJlZ3MpOwogCiAJc3RhY2sgPSBzcDsKIAlmb3IgKGkgPSAwOyBpIDwga3N0YWNrX2RlcHRoX3RvX3ByaW50OyBpKyspIHsKQEAgLTExNyw3ICsxNDUsOSBAQAogCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIAl9CiAJcHJfY29udCgiXG4iKTsKLQlzaG93X3RyYWNlX2xvZ19sdmwodGFzaywgcmVncywgc3AsIGJwLCBsb2dfbHZsKTsKKwlzaG93X3RyYWNlX2xvZ19sdmwodGFzaywgcmVncywgc3AsIGxvZ19sdmwpOworCisJcHV0X3Rhc2tfc3RhY2sodGFzayk7CiB9CiAKIApAQCAtMTM5LDcgKzE2OSw3IEBACiAJCXU4ICppcDsKIAogCQlwcl9lbWVyZygiU3RhY2s6XG4iKTsKLQkJc2hvd19zdGFja19sb2dfbHZsKE5VTEwsIHJlZ3MsICZyZWdzLT5zcCwgMCwgS0VSTl9FTUVSRyk7CisJCXNob3dfc3RhY2tfbG9nX2x2bChjdXJyZW50LCByZWdzLCBOVUxMLCBLRVJOX0VNRVJHKTsKIAogCQlwcl9lbWVyZygiQ29kZToiKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCmluZGV4IDllZTQ1MjAuLjM2Y2YxYTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKQEAgLTE2LDI2MSArMTYsMTQ1IEBACiAKICNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgogCi0KLSNkZWZpbmUgTl9FWENFUFRJT05fU1RBQ0tTX0VORCBcCi0JCShOX0VYQ0VQVElPTl9TVEFDS1MgKyBERUJVR19TVEtTWi9FWENFUFRJT05fU1RLU1ogLSAyKQotCi1zdGF0aWMgY2hhciB4ODZfc3RhY2tfaWRzW11bOF0gPSB7Ci0JCVsgREVCVUdfU1RBQ0stMQkJCV0JPSAiI0RCIiwKLQkJWyBOTUlfU1RBQ0stMQkJCV0JPSAiTk1JIiwKLQkJWyBET1VCTEVGQVVMVF9TVEFDSy0xCQldCT0gIiNERiIsCi0JCVsgTUNFX1NUQUNLLTEJCQldCT0gIiNNQyIsCi0jaWYgREVCVUdfU1RLU1ogPiBFWENFUFRJT05fU1RLU1oKLQkJWyBOX0VYQ0VQVElPTl9TVEFDS1MgLi4uCi0JCSAgTl9FWENFUFRJT05fU1RBQ0tTX0VORAldCT0gIiNEQls/XSIKLSNlbmRpZgorc3RhdGljIGNoYXIgKmV4Y2VwdGlvbl9zdGFja19uYW1lc1tOX0VYQ0VQVElPTl9TVEFDS1NdID0geworCQlbIERPVUJMRUZBVUxUX1NUQUNLLTEJXQk9ICIjREYiLAorCQlbIE5NSV9TVEFDSy0xCQldCT0gIk5NSSIsCisJCVsgREVCVUdfU1RBQ0stMQkJXQk9ICIjREIiLAorCQlbIE1DRV9TVEFDSy0xCQldCT0gIiNNQyIsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAqaW5fZXhjZXB0aW9uX3N0YWNrKHVuc2lnbmVkIGNwdSwgdW5zaWduZWQgbG9uZyBzdGFjaywKLQkJCQkJIHVuc2lnbmVkICp1c2VkcCwgY2hhciAqKmlkcCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGV4Y2VwdGlvbl9zdGFja19zaXplc1tOX0VYQ0VQVElPTl9TVEFDS1NdID0geworCVswIC4uLiBOX0VYQ0VQVElPTl9TVEFDS1MgLSAxXQkJPSBFWENFUFRJT05fU1RLU1osCisJW0RFQlVHX1NUQUNLIC0gMV0JCQk9IERFQlVHX1NUS1NaCit9OworCit2b2lkIHN0YWNrX3R5cGVfc3RyKGVudW0gc3RhY2tfdHlwZSB0eXBlLCBjb25zdCBjaGFyICoqYmVnaW4sIGNvbnN0IGNoYXIgKiplbmQpCiB7CisJQlVJTERfQlVHX09OKE5fRVhDRVBUSU9OX1NUQUNLUyAhPSA0KTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU1RBQ0tfVFlQRV9JUlE6CisJCSpiZWdpbiA9ICJJUlEiOworCQkqZW5kICAgPSAiRU9JIjsKKwkJYnJlYWs7CisJY2FzZSBTVEFDS19UWVBFX0VYQ0VQVElPTiAuLi4gU1RBQ0tfVFlQRV9FWENFUFRJT05fTEFTVDoKKwkJKmJlZ2luID0gZXhjZXB0aW9uX3N0YWNrX25hbWVzW3R5cGUgLSBTVEFDS19UWVBFX0VYQ0VQVElPTl07CisJCSplbmQgICA9ICJFT0UiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkqYmVnaW4gPSBOVUxMOworCQkqZW5kICAgPSBOVUxMOworCX0KK30KKworc3RhdGljIGJvb2wgaW5fZXhjZXB0aW9uX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrLCBzdHJ1Y3Qgc3RhY2tfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nICpiZWdpbiwgKmVuZDsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKIAl1bnNpZ25lZCBrOwogCi0JLyoKLQkgKiBJdGVyYXRlIG92ZXIgYWxsIGV4Y2VwdGlvbiBzdGFja3MsIGFuZCBmaWd1cmUgb3V0IHdoZXRoZXIKLQkgKiAnc3RhY2snIGlzIGluIG9uZSBvZiB0aGVtOgotCSAqLworCUJVSUxEX0JVR19PTihOX0VYQ0VQVElPTl9TVEFDS1MgIT0gNCk7CisKIAlmb3IgKGsgPSAwOyBrIDwgTl9FWENFUFRJT05fU1RBQ0tTOyBrKyspIHsKLQkJdW5zaWduZWQgbG9uZyBlbmQgPSBwZXJfY3B1KG9yaWdfaXN0LCBjcHUpLmlzdFtrXTsKLQkJLyoKLQkJICogSXMgJ3N0YWNrJyBhYm92ZSB0aGlzIGV4Y2VwdGlvbiBmcmFtZSdzIGVuZD8KLQkJICogSWYgeWVzIHRoZW4gc2tpcCB0byB0aGUgbmV4dCBmcmFtZS4KLQkJICovCi0JCWlmIChzdGFjayA+PSBlbmQpCisJCWVuZCAgID0gKHVuc2lnbmVkIGxvbmcgKilyYXdfY3B1X3B0cigmb3JpZ19pc3QpLT5pc3Rba107CisJCWJlZ2luID0gZW5kIC0gKGV4Y2VwdGlvbl9zdGFja19zaXplc1trXSAvIHNpemVvZihsb25nKSk7CisJCXJlZ3MgID0gKHN0cnVjdCBwdF9yZWdzICopZW5kIC0gMTsKKworCQlpZiAoc3RhY2sgPCBiZWdpbiB8fCBzdGFjayA+PSBlbmQpCiAJCQljb250aW51ZTsKLQkJLyoKLQkJICogSXMgJ3N0YWNrJyBhYm92ZSB0aGlzIGV4Y2VwdGlvbiBmcmFtZSdzIHN0YXJ0IGFkZHJlc3M/Ci0JCSAqIElmIHllcyB0aGVuIHdlIGZvdW5kIHRoZSByaWdodCBmcmFtZS4KLQkJICovCi0JCWlmIChzdGFjayA+PSBlbmQgLSBFWENFUFRJT05fU1RLU1opIHsKLQkJCS8qCi0JCQkgKiBNYWtlIHN1cmUgd2Ugb25seSBpdGVyYXRlIHRocm91Z2ggYW4gZXhjZXB0aW9uCi0JCQkgKiBzdGFjayBvbmNlLiBJZiBpdCBjb21lcyB1cCBmb3IgdGhlIHNlY29uZCB0aW1lCi0JCQkgKiB0aGVuIHRoZXJlJ3Mgc29tZXRoaW5nIHdyb25nIGdvaW5nIG9uIC0ganVzdAotCQkJICogYnJlYWsgb3V0IGFuZCByZXR1cm4gTlVMTDoKLQkJCSAqLwotCQkJaWYgKCp1c2VkcCAmICgxVSA8PCBrKSkKLQkJCQlicmVhazsKLQkJCSp1c2VkcCB8PSAxVSA8PCBrOwotCQkJKmlkcCA9IHg4Nl9zdGFja19pZHNba107Ci0JCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcgKillbmQ7Ci0JCX0KLQkJLyoKLQkJICogSWYgdGhpcyBpcyBhIGRlYnVnIHN0YWNrLCBhbmQgaWYgaXQgaGFzIGEgbGFyZ2VyIHNpemUgdGhhbgotCQkgKiB0aGUgdXN1YWwgZXhjZXB0aW9uIHN0YWNrcywgdGhlbiAnc3RhY2snIG1pZ2h0IHN0aWxsCi0JCSAqIGJlIHdpdGhpbiB0aGUgbG93ZXIgcG9ydGlvbiBvZiB0aGUgZGVidWcgc3RhY2s6Ci0JCSAqLwotI2lmIERFQlVHX1NUS1NaID4gRVhDRVBUSU9OX1NUS1NaCi0JCWlmIChrID09IERFQlVHX1NUQUNLIC0gMSAmJiBzdGFjayA+PSBlbmQgLSBERUJVR19TVEtTWikgewotCQkJdW5zaWduZWQgaiA9IE5fRVhDRVBUSU9OX1NUQUNLUyAtIDE7CiAKLQkJCS8qCi0JCQkgKiBCbGFjayBtYWdpYy4gQSBsYXJnZSBkZWJ1ZyBzdGFjayBpcyBjb21wb3NlZCBvZgotCQkJICogbXVsdGlwbGUgZXhjZXB0aW9uIHN0YWNrIGVudHJpZXMsIHdoaWNoIHdlCi0JCQkgKiBpdGVyYXRlIHRocm91Z2ggbm93LiBEb250IGxvb2s6Ci0JCQkgKi8KLQkJCWRvIHsKLQkJCQkrK2o7Ci0JCQkJZW5kIC09IEVYQ0VQVElPTl9TVEtTWjsKLQkJCQl4ODZfc3RhY2tfaWRzW2pdWzRdID0gJzEnICsKLQkJCQkJCShqIC0gTl9FWENFUFRJT05fU1RBQ0tTKTsKLQkJCX0gd2hpbGUgKHN0YWNrIDwgZW5kIC0gRVhDRVBUSU9OX1NUS1NaKTsKLQkJCWlmICgqdXNlZHAgJiAoMVUgPDwgaikpCi0JCQkJYnJlYWs7Ci0JCQkqdXNlZHAgfD0gMVUgPDwgajsKLQkJCSppZHAgPSB4ODZfc3RhY2tfaWRzW2pdOwotCQkJcmV0dXJuICh1bnNpZ25lZCBsb25nICopZW5kOwotCQl9Ci0jZW5kaWYKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19CisJCWluZm8tPnR5cGUJPSBTVEFDS19UWVBFX0VYQ0VQVElPTiArIGs7CisJCWluZm8tPmJlZ2luCT0gYmVnaW47CisJCWluZm8tPmVuZAk9IGVuZDsKKwkJaW5mby0+bmV4dF9zcAk9ICh1bnNpZ25lZCBsb25nICopcmVncy0+c3A7CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1pbl9pcnFfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2ssIHVuc2lnbmVkIGxvbmcgKmlycV9zdGFjaywKLQkgICAgIHVuc2lnbmVkIGxvbmcgKmlycV9zdGFja19lbmQpCi17Ci0JcmV0dXJuIChzdGFjayA+PSBpcnFfc3RhY2sgJiYgc3RhY2sgPCBpcnFfc3RhY2tfZW5kKTsKLX0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgaXJxX3N0YWNrX3NpemUgPQotCShJUlFfU1RBQ0tfU0laRSAtIDY0KSAvIHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQotZW51bSBzdGFja190eXBlIHsKLQlTVEFDS19JU19VTktOT1dOLAotCVNUQUNLX0lTX05PUk1BTCwKLQlTVEFDS19JU19FWENFUFRJT04sCi0JU1RBQ0tfSVNfSVJRLAotfTsKLQotc3RhdGljIGVudW0gc3RhY2tfdHlwZQotYW5hbHl6ZV9zdGFjayhpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnN0YWNrLAotCSAgICAgIHVuc2lnbmVkIGxvbmcgKipzdGFja19lbmQsIHVuc2lnbmVkIGxvbmcgKmlycV9zdGFjaywKLQkgICAgICB1bnNpZ25lZCAqdXNlZCwgY2hhciAqKmlkKQotewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQotCWFkZHIgPSAoKHVuc2lnbmVkIGxvbmcpc3RhY2sgJiAofihUSFJFQURfU0laRSAtIDEpKSk7Ci0JaWYgKCh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0YXNrKSA9PSBhZGRyKQotCQlyZXR1cm4gU1RBQ0tfSVNfTk9STUFMOwotCi0JKnN0YWNrX2VuZCA9IGluX2V4Y2VwdGlvbl9zdGFjayhjcHUsICh1bnNpZ25lZCBsb25nKXN0YWNrLAotCQkJCQl1c2VkLCBpZCk7Ci0JaWYgKCpzdGFja19lbmQpCi0JCXJldHVybiBTVEFDS19JU19FWENFUFRJT047Ci0KLQlpZiAoIWlycV9zdGFjaykKLQkJcmV0dXJuIFNUQUNLX0lTX05PUk1BTDsKLQotCSpzdGFja19lbmQgPSBpcnFfc3RhY2s7Ci0JaXJxX3N0YWNrID0gaXJxX3N0YWNrIC0gaXJxX3N0YWNrX3NpemU7Ci0KLQlpZiAoaW5faXJxX3N0YWNrKHN0YWNrLCBpcnFfc3RhY2ssICpzdGFja19lbmQpKQotCQlyZXR1cm4gU1RBQ0tfSVNfSVJROwotCi0JcmV0dXJuIFNUQUNLX0lTX1VOS05PV047Ci19Ci0KLS8qCi0gKiB4ODYtNjQgY2FuIGhhdmUgdXAgdG8gdGhyZWUga2VybmVsIHN0YWNrczoKLSAqIHByb2Nlc3Mgc3RhY2sKLSAqIGludGVycnVwdCBzdGFjawotICogc2V2ZXJlIGV4Y2VwdGlvbiAoZG91YmxlIGZhdWx0LCBubWksIHN0YWNrIGZhdWx0LCBkZWJ1ZywgbWNlKSBoYXJkd2FyZSBzdGFjawotICovCi0KLXZvaWQgZHVtcF90cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBicCwKLQkJY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHMsIHZvaWQgKmRhdGEpCi17Ci0JY29uc3QgdW5zaWduZWQgY3B1ID0gZ2V0X2NwdSgpOwotCXVuc2lnbmVkIGxvbmcgKmlycV9zdGFjayA9ICh1bnNpZ25lZCBsb25nICopcGVyX2NwdShpcnFfc3RhY2tfcHRyLCBjcHUpOwotCXVuc2lnbmVkIGxvbmcgZHVtbXk7Ci0JdW5zaWduZWQgdXNlZCA9IDA7Ci0JaW50IGdyYXBoID0gMDsKLQlpbnQgZG9uZSA9IDA7Ci0KLQlpZiAoIXRhc2spCi0JCXRhc2sgPSBjdXJyZW50OwotCi0JaWYgKCFzdGFjaykgewotCQlpZiAocmVncykKLQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKilyZWdzLT5zcDsKLQkJZWxzZSBpZiAodGFzayAhPSBjdXJyZW50KQotCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5zcDsKLQkJZWxzZQotCQkJc3RhY2sgPSAmZHVtbXk7CisJCXJldHVybiB0cnVlOwogCX0KIAotCWlmICghYnApCi0JCWJwID0gc3RhY2tfZnJhbWUodGFzaywgcmVncyk7Ci0JLyoKLQkgKiBQcmludCBmdW5jdGlvbiBjYWxsIGVudHJpZXMgaW4gYWxsIHN0YWNrcywgc3RhcnRpbmcgYXQgdGhlCi0JICogY3VycmVudCBzdGFjayBhZGRyZXNzLiBJZiB0aGUgc3RhY2tzIGNvbnNpc3Qgb2YgbmVzdGVkCi0JICogZXhjZXB0aW9ucwotCSAqLwotCXdoaWxlICghZG9uZSkgewotCQl1bnNpZ25lZCBsb25nICpzdGFja19lbmQ7Ci0JCWVudW0gc3RhY2tfdHlwZSBzdHlwZTsKLQkJY2hhciAqaWQ7CisJcmV0dXJuIGZhbHNlOworfQogCi0JCXN0eXBlID0gYW5hbHl6ZV9zdGFjayhjcHUsIHRhc2ssIHN0YWNrLCAmc3RhY2tfZW5kLAotCQkJCSAgICAgIGlycV9zdGFjaywgJnVzZWQsICZpZCk7Ci0KLQkJLyogRGVmYXVsdCBmaW5pc2ggdW5sZXNzIHNwZWNpZmllZCB0byBjb250aW51ZSAqLwotCQlkb25lID0gMTsKLQotCQlzd2l0Y2ggKHN0eXBlKSB7Ci0KLQkJLyogQnJlYWsgb3V0IGVhcmx5IGlmIHdlIGFyZSBvbiB0aGUgdGhyZWFkIHN0YWNrICovCi0JCWNhc2UgU1RBQ0tfSVNfTk9STUFMOgotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTVEFDS19JU19FWENFUFRJT046Ci0KLQkJCWlmIChvcHMtPnN0YWNrKGRhdGEsIGlkKSA8IDApCi0JCQkJYnJlYWs7Ci0KLQkJCWJwID0gb3BzLT53YWxrX3N0YWNrKHRhc2ssIHN0YWNrLCBicCwgb3BzLAotCQkJCQkgICAgIGRhdGEsIHN0YWNrX2VuZCwgJmdyYXBoKTsKLQkJCW9wcy0+c3RhY2soZGF0YSwgIjxFT0U+Iik7Ci0JCQkvKgotCQkJICogV2UgbGluayB0byB0aGUgbmV4dCBzdGFjayB2aWEgdGhlCi0JCQkgKiBzZWNvbmQtdG8tbGFzdCBwb2ludGVyIChpbmRleCAtMiB0byBlbmQpIGluIHRoZQotCQkJICogZXhjZXB0aW9uIHN0YWNrOgotCQkJICovCi0JCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIHN0YWNrX2VuZFstMl07Ci0JCQlkb25lID0gMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgU1RBQ0tfSVNfSVJROgotCi0JCQlpZiAob3BzLT5zdGFjayhkYXRhLCAiSVJRIikgPCAwKQotCQkJCWJyZWFrOwotCQkJYnAgPSBvcHMtPndhbGtfc3RhY2sodGFzaywgc3RhY2ssIGJwLAotCQkJCSAgICAgb3BzLCBkYXRhLCBzdGFja19lbmQsICZncmFwaCk7Ci0JCQkvKgotCQkJICogV2UgbGluayB0byB0aGUgbmV4dCBzdGFjayAod2hpY2ggd291bGQgYmUKLQkJCSAqIHRoZSBwcm9jZXNzIHN0YWNrIG5vcm1hbGx5KSB0aGUgbGFzdAotCQkJICogcG9pbnRlciAoaW5kZXggLTEgdG8gZW5kKSBpbiB0aGUgSVJRIHN0YWNrOgotCQkJICovCi0JCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIChzdGFja19lbmRbLTFdKTsKLQkJCWlycV9zdGFjayA9IE5VTEw7Ci0JCQlvcHMtPnN0YWNrKGRhdGEsICJFT0kiKTsKLQkJCWRvbmUgPSAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBTVEFDS19JU19VTktOT1dOOgotCQkJb3BzLT5zdGFjayhkYXRhLCAiVU5LIik7Ci0JCQlicmVhazsKLQkJfQotCX0KK3N0YXRpYyBib29sIGluX2lycV9zdGFjayh1bnNpZ25lZCBsb25nICpzdGFjaywgc3RydWN0IHN0YWNrX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyAqZW5kICAgPSAodW5zaWduZWQgbG9uZyAqKXRoaXNfY3B1X3JlYWQoaXJxX3N0YWNrX3B0cik7CisJdW5zaWduZWQgbG9uZyAqYmVnaW4gPSBlbmQgLSAoSVJRX1NUQUNLX1NJWkUgLyBzaXplb2YobG9uZykpOwogCiAJLyoKLQkgKiBUaGlzIGhhbmRsZXMgdGhlIHByb2Nlc3Mgc3RhY2s6CisJICogVGhpcyBpcyBhIHNvZnR3YXJlIHN0YWNrLCBzbyAnZW5kJyBjYW4gYmUgYSB2YWxpZCBzdGFjayBwb2ludGVyLgorCSAqIEl0IGp1c3QgbWVhbnMgdGhlIHN0YWNrIGlzIGVtcHR5LgogCSAqLwotCWJwID0gb3BzLT53YWxrX3N0YWNrKHRhc2ssIHN0YWNrLCBicCwgb3BzLCBkYXRhLCBOVUxMLCAmZ3JhcGgpOwotCXB1dF9jcHUoKTsKLX0KLUVYUE9SVF9TWU1CT0woZHVtcF90cmFjZSk7CisJaWYgKHN0YWNrIDwgYmVnaW4gfHwgc3RhY2sgPiBlbmQpCisJCXJldHVybiBmYWxzZTsKIAotdm9pZAotc2hvd19zdGFja19sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCSAgIHVuc2lnbmVkIGxvbmcgKnNwLCB1bnNpZ25lZCBsb25nIGJwLCBjaGFyICpsb2dfbHZsKQorCWluZm8tPnR5cGUJPSBTVEFDS19UWVBFX0lSUTsKKwlpbmZvLT5iZWdpbgk9IGJlZ2luOworCWluZm8tPmVuZAk9IGVuZDsKKworCS8qCisJICogVGhlIG5leHQgc3RhY2sgcG9pbnRlciBpcyB0aGUgZmlyc3QgdGhpbmcgcHVzaGVkIGJ5IHRoZSBlbnRyeSBjb2RlCisJICogYWZ0ZXIgc3dpdGNoaW5nIHRvIHRoZSBpcnEgc3RhY2suCisJICovCisJaW5mby0+bmV4dF9zcCA9ICh1bnNpZ25lZCBsb25nICopKihlbmQgLSAxKTsKKworCXJldHVybiB0cnVlOworfQorCitpbnQgZ2V0X3N0YWNrX2luZm8odW5zaWduZWQgbG9uZyAqc3RhY2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgc3RydWN0IHN0YWNrX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgKnZpc2l0X21hc2spCit7CisJaWYgKCFzdGFjaykKKwkJZ290byB1bmtub3duOworCisJdGFzayA9IHRhc2sgPyA6IGN1cnJlbnQ7CisKKwlpZiAoaW5fdGFza19zdGFjayhzdGFjaywgdGFzaywgaW5mbykpCisJCWdvdG8gcmVjdXJzaW9uX2NoZWNrOworCisJaWYgKHRhc2sgIT0gY3VycmVudCkKKwkJZ290byB1bmtub3duOworCisJaWYgKGluX2V4Y2VwdGlvbl9zdGFjayhzdGFjaywgaW5mbykpCisJCWdvdG8gcmVjdXJzaW9uX2NoZWNrOworCisJaWYgKGluX2lycV9zdGFjayhzdGFjaywgaW5mbykpCisJCWdvdG8gcmVjdXJzaW9uX2NoZWNrOworCisJZ290byB1bmtub3duOworCityZWN1cnNpb25fY2hlY2s6CisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgaXRlcmF0ZSB0aHJvdWdoIGFueSBnaXZlbiBzdGFjayBtb3JlIHRoYW4gb25jZS4KKwkgKiBJZiBpdCBjb21lcyB1cCBhIHNlY29uZCB0aW1lIHRoZW4gdGhlcmUncyBzb21ldGhpbmcgd3JvbmcgZ29pbmcgb246CisJICoganVzdCBicmVhayBvdXQgYW5kIHJlcG9ydCBhbiB1bmtub3duIHN0YWNrIHR5cGUuCisJICovCisJaWYgKHZpc2l0X21hc2spIHsKKwkJaWYgKCp2aXNpdF9tYXNrICYgKDFVTCA8PCBpbmZvLT50eXBlKSkKKwkJCWdvdG8gdW5rbm93bjsKKwkJKnZpc2l0X21hc2sgfD0gMVVMIDw8IGluZm8tPnR5cGU7CisJfQorCisJcmV0dXJuIDA7CisKK3Vua25vd246CisJaW5mby0+dHlwZSA9IFNUQUNLX1RZUEVfVU5LTk9XTjsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwordm9pZCBzaG93X3N0YWNrX2xvZ19sdmwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCXVuc2lnbmVkIGxvbmcgKnNwLCBjaGFyICpsb2dfbHZsKQogewogCXVuc2lnbmVkIGxvbmcgKmlycV9zdGFja19lbmQ7CiAJdW5zaWduZWQgbG9uZyAqaXJxX3N0YWNrOwogCXVuc2lnbmVkIGxvbmcgKnN0YWNrOwotCWludCBjcHU7CiAJaW50IGk7CiAKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaWYgKCF0cnlfZ2V0X3Rhc2tfc3RhY2sodGFzaykpCisJCXJldHVybjsKIAotCWlycV9zdGFja19lbmQJPSAodW5zaWduZWQgbG9uZyAqKShwZXJfY3B1KGlycV9zdGFja19wdHIsIGNwdSkpOwotCWlycV9zdGFjawk9ICh1bnNpZ25lZCBsb25nICopKHBlcl9jcHUoaXJxX3N0YWNrX3B0ciwgY3B1KSAtIElSUV9TVEFDS19TSVpFKTsKKwlpcnFfc3RhY2tfZW5kID0gKHVuc2lnbmVkIGxvbmcgKil0aGlzX2NwdV9yZWFkKGlycV9zdGFja19wdHIpOworCWlycV9zdGFjayAgICAgPSBpcnFfc3RhY2tfZW5kIC0gKElSUV9TVEFDS19TSVpFIC8gc2l6ZW9mKGxvbmcpKTsKIAotCS8qCi0JICogRGVidWdnaW5nIGFpZDogInNob3dfc3RhY2soTlVMTCwgTlVMTCk7IiBwcmludHMgdGhlCi0JICogYmFjayB0cmFjZSBmb3IgdGhpcyBjcHU6Ci0JICovCi0JaWYgKHNwID09IE5VTEwpIHsKLQkJaWYgKHJlZ3MpCi0JCQlzcCA9ICh1bnNpZ25lZCBsb25nICopcmVncy0+c3A7Ci0JCWVsc2UgaWYgKHRhc2spCi0JCQlzcCA9ICh1bnNpZ25lZCBsb25nICopdGFzay0+dGhyZWFkLnNwOwotCQllbHNlCi0JCQlzcCA9ICh1bnNpZ25lZCBsb25nICopJnNwOwotCX0KKwlzcCA9IHNwID8gOiBnZXRfc3RhY2tfcG9pbnRlcih0YXNrLCByZWdzKTsKIAogCXN0YWNrID0gc3A7CiAJZm9yIChpID0gMDsgaSA8IGtzdGFja19kZXB0aF90b19wcmludDsgaSsrKSB7CkBAIC0yOTksMTggKzE4MywxNyBAQAogCQlzdGFjaysrOwogCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIAl9Ci0JcHJlZW1wdF9lbmFibGUoKTsKIAogCXByX2NvbnQoIlxuIik7Ci0Jc2hvd190cmFjZV9sb2dfbHZsKHRhc2ssIHJlZ3MsIHNwLCBicCwgbG9nX2x2bCk7CisJc2hvd190cmFjZV9sb2dfbHZsKHRhc2ssIHJlZ3MsIHNwLCBsb2dfbHZsKTsKKworCXB1dF90YXNrX3N0YWNrKHRhc2spOwogfQogCiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIHNwOwogCi0Jc3AgPSByZWdzLT5zcDsKIAlzaG93X3JlZ3NfcHJpbnRfaW5mbyhLRVJOX0RFRkFVTFQpOwogCV9fc2hvd19yZWdzKHJlZ3MsIDEpOwogCkBAIC0zMjUsOCArMjA4LDcgQEAKIAkJdTggKmlwOwogCiAJCXByaW50ayhLRVJOX0RFRkFVTFQgIlN0YWNrOlxuIik7Ci0JCXNob3dfc3RhY2tfbG9nX2x2bChOVUxMLCByZWdzLCAodW5zaWduZWQgbG9uZyAqKXNwLAotCQkJCSAgIDAsIEtFUk5fREVGQVVMVCk7CisJCXNob3dfc3RhY2tfbG9nX2x2bChjdXJyZW50LCByZWdzLCBOVUxMLCBLRVJOX0RFRkFVTFQpOwogCiAJCXByaW50ayhLRVJOX0RFRkFVTFQgIkNvZGU6ICIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jIGIvYXJjaC94ODYva2VybmVsL2U4MjAuYwppbmRleCA2MjFiNTAxLi5iODVmZTVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKQEAgLTQwLDggKzQwLDEwIEBACiAgKiB1c2VyIGNhbiBlLmcuIGJvb3QgdGhlIG9yaWdpbmFsIGtlcm5lbCB3aXRoIG1lbT0xRyB3aGlsZSBzdGlsbCBib290aW5nIHRoZQogICogbmV4dCBrZXJuZWwgd2l0aCBmdWxsIG1lbW9yeS4KICAqLwotc3RydWN0IGU4MjBtYXAgZTgyMDsKLXN0cnVjdCBlODIwbWFwIGU4MjBfc2F2ZWQ7CitzdGF0aWMgc3RydWN0IGU4MjBtYXAgaW5pdGlhbF9lODIwICBfX2luaXRkYXRhOworc3RhdGljIHN0cnVjdCBlODIwbWFwIGluaXRpYWxfZTgyMF9zYXZlZCAgX19pbml0ZGF0YTsKK3N0cnVjdCBlODIwbWFwICplODIwIF9fcmVmZGF0YSA9ICZpbml0aWFsX2U4MjA7CitzdHJ1Y3QgZTgyMG1hcCAqZTgyMF9zYXZlZCBfX3JlZmRhdGEgPSAmaW5pdGlhbF9lODIwX3NhdmVkOwogCiAvKiBGb3IgUENJIG9yIG90aGVyIG1lbW9yeS1tYXBwZWQgcmVzb3VyY2VzICovCiB1bnNpZ25lZCBsb25nIHBjaV9tZW1fc3RhcnQgPSAweGFlZWRiYWJlOwpAQCAtNTgsOCArNjAsOCBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC5tYXBbaV07CisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAtPm1hcFtpXTsKIAogCQlpZiAodHlwZSAmJiBlaS0+dHlwZSAhPSB0eXBlKQogCQkJY29udGludWU7CkBAIC04MSw4ICs4Myw4IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKKwkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC0+bWFwW2ldOwogCiAJCWlmICh0eXBlICYmIGVpLT50eXBlICE9IHR5cGUpCiAJCQljb250aW51ZTsKQEAgLTEyOCw3ICsxMzAsNyBAQAogCiB2b2lkIF9faW5pdCBlODIwX2FkZF9yZWdpb24odTY0IHN0YXJ0LCB1NjQgc2l6ZSwgaW50IHR5cGUpCiB7Ci0JX19lODIwX2FkZF9yZWdpb24oJmU4MjAsIHN0YXJ0LCBzaXplLCB0eXBlKTsKKwlfX2U4MjBfYWRkX3JlZ2lvbihlODIwLCBzdGFydCwgc2l6ZSwgdHlwZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlODIwX3ByaW50X3R5cGUodTMyIHR5cGUpCkBAIC0xNjQsMTIgKzE2NiwxMiBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFttZW0gJSMwMThMeC0lIzAxOEx4XSAiLCB3aG8sCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBlODIwLm1hcFtpXS5hZGRyLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZTgyMC0+bWFwW2ldLmFkZHIsCiAJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKQotCQkgICAgICAgKGU4MjAubWFwW2ldLmFkZHIgKyBlODIwLm1hcFtpXS5zaXplIC0gMSkpOwotCQllODIwX3ByaW50X3R5cGUoZTgyMC5tYXBbaV0udHlwZSk7CisJCSAgICAgICAoZTgyMC0+bWFwW2ldLmFkZHIgKyBlODIwLT5tYXBbaV0uc2l6ZSAtIDEpKTsKKwkJZTgyMF9wcmludF90eXBlKGU4MjAtPm1hcFtpXS50eXBlKTsKIAkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIAl9CiB9CkBAIC0zNDgsNyArMzUwLDcgQEAKIAkJICogY29udGludWUgYnVpbGRpbmcgdXAgbmV3IGJpb3MgbWFwIGJhc2VkIG9uIHRoaXMKIAkJICogaW5mb3JtYXRpb24KIAkJICovCi0JCWlmIChjdXJyZW50X3R5cGUgIT0gbGFzdF90eXBlIHx8IGN1cnJlbnRfdHlwZSA9PSBFODIwX1BSQU0pIHsKKwkJaWYgKGN1cnJlbnRfdHlwZSAhPSBsYXN0X3R5cGUpIHsKIAkJCWlmIChsYXN0X3R5cGUgIT0gMCkJIHsKIAkJCQluZXdfYmlvc1tuZXdfYmlvc19lbnRyeV0uc2l6ZSA9CiAJCQkJCWNoYW5nZV9wb2ludFtjaGdpZHhdLT5hZGRyIC0gbGFzdF9hZGRyOwpAQCAtMzg4LDExICszOTAsMTEgQEAKIAl3aGlsZSAobnJfbWFwKSB7CiAJCXU2NCBzdGFydCA9IGJpb3NtYXAtPmFkZHI7CiAJCXU2NCBzaXplID0gYmlvc21hcC0+c2l6ZTsKLQkJdTY0IGVuZCA9IHN0YXJ0ICsgc2l6ZTsKKwkJdTY0IGVuZCA9IHN0YXJ0ICsgc2l6ZSAtIDE7CiAJCXUzMiB0eXBlID0gYmlvc21hcC0+dHlwZTsKIAogCQkvKiBPdmVyZmxvdyBpbiA2NCBiaXRzPyBJZ25vcmUgdGhlIG1lbW9yeSBtYXAuICovCi0JCWlmIChzdGFydCA+IGVuZCkKKwkJaWYgKHN0YXJ0ID4gZW5kICYmIGxpa2VseShzaXplKSkKIAkJCXJldHVybiAtMTsKIAogCQllODIwX2FkZF9yZWdpb24oc3RhcnQsIHNpemUsIHR5cGUpOwpAQCAtNDkzLDEzICs0OTUsMTMgQEAKIHU2NCBfX2luaXQgZTgyMF91cGRhdGVfcmFuZ2UodTY0IHN0YXJ0LCB1NjQgc2l6ZSwgdW5zaWduZWQgb2xkX3R5cGUsCiAJCQkgICAgIHVuc2lnbmVkIG5ld190eXBlKQogewotCXJldHVybiBfX2U4MjBfdXBkYXRlX3JhbmdlKCZlODIwLCBzdGFydCwgc2l6ZSwgb2xkX3R5cGUsIG5ld190eXBlKTsKKwlyZXR1cm4gX19lODIwX3VwZGF0ZV9yYW5nZShlODIwLCBzdGFydCwgc2l6ZSwgb2xkX3R5cGUsIG5ld190eXBlKTsKIH0KIAogc3RhdGljIHU2NCBfX2luaXQgZTgyMF91cGRhdGVfcmFuZ2Vfc2F2ZWQodTY0IHN0YXJ0LCB1NjQgc2l6ZSwKIAkJCQkJICB1bnNpZ25lZCBvbGRfdHlwZSwgdW5zaWduZWQgbmV3X3R5cGUpCiB7Ci0JcmV0dXJuIF9fZTgyMF91cGRhdGVfcmFuZ2UoJmU4MjBfc2F2ZWQsIHN0YXJ0LCBzaXplLCBvbGRfdHlwZSwKKwlyZXR1cm4gX19lODIwX3VwZGF0ZV9yYW5nZShlODIwX3NhdmVkLCBzdGFydCwgc2l6ZSwgb2xkX3R5cGUsCiAJCQkJICAgICBuZXdfdHlwZSk7CiB9CiAKQEAgLTUyMSw4ICs1MjMsOCBAQAogCQllODIwX3ByaW50X3R5cGUob2xkX3R5cGUpOwogCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKKwkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC0+bWFwW2ldOwogCQl1NjQgZmluYWxfc3RhcnQsIGZpbmFsX2VuZDsKIAkJdTY0IGVpX2VuZDsKIApAQCAtNTY2LDE1ICs1NjgsMTUgQEAKIAogdm9pZCBfX2luaXQgdXBkYXRlX2U4MjAodm9pZCkKIHsKLQlpZiAoc2FuaXRpemVfZTgyMF9tYXAoZTgyMC5tYXAsIEFSUkFZX1NJWkUoZTgyMC5tYXApLCAmZTgyMC5ucl9tYXApKQorCWlmIChzYW5pdGl6ZV9lODIwX21hcChlODIwLT5tYXAsIEFSUkFZX1NJWkUoZTgyMC0+bWFwKSwgJmU4MjAtPm5yX21hcCkpCiAJCXJldHVybjsKIAlwcmludGsoS0VSTl9JTkZPICJlODIwOiBtb2RpZmllZCBwaHlzaWNhbCBSQU0gbWFwOlxuIik7CiAJZTgyMF9wcmludF9tYXAoIm1vZGlmaWVkIik7CiB9CiBzdGF0aWMgdm9pZCBfX2luaXQgdXBkYXRlX2U4MjBfc2F2ZWQodm9pZCkKIHsKLQlzYW5pdGl6ZV9lODIwX21hcChlODIwX3NhdmVkLm1hcCwgQVJSQVlfU0laRShlODIwX3NhdmVkLm1hcCksCi0JCQkJJmU4MjBfc2F2ZWQubnJfbWFwKTsKKwlzYW5pdGl6ZV9lODIwX21hcChlODIwX3NhdmVkLT5tYXAsIEFSUkFZX1NJWkUoZTgyMF9zYXZlZC0+bWFwKSwKKwkJCQkmZTgyMF9zYXZlZC0+bnJfbWFwKTsKIH0KICNkZWZpbmUgTUFYX0dBUF9FTkQgMHgxMDAwMDAwMDB1bGwKIC8qCkBAIC01ODQsMTQgKzU4NiwxNCBAQAogCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHVuc2lnbmVkIGxvbmcgbG9uZyBlbmRfYWRkcikKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbGFzdDsKLQlpbnQgaSA9IGU4MjAubnJfbWFwOworCWludCBpID0gZTgyMC0+bnJfbWFwOwogCWludCBmb3VuZCA9IDA7CiAKIAlsYXN0ID0gKGVuZF9hZGRyICYmIGVuZF9hZGRyIDwgTUFYX0dBUF9FTkQpID8gZW5kX2FkZHIgOiBNQVhfR0FQX0VORDsKIAogCXdoaWxlICgtLWkgPj0gMCkgewotCQl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQgPSBlODIwLm1hcFtpXS5hZGRyOwotCQl1bnNpZ25lZCBsb25nIGxvbmcgZW5kID0gc3RhcnQgKyBlODIwLm1hcFtpXS5zaXplOworCQl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQgPSBlODIwLT5tYXBbaV0uYWRkcjsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGVuZCA9IHN0YXJ0ICsgZTgyMC0+bWFwW2ldLnNpemU7CiAKIAkJaWYgKGVuZCA8IHN0YXJ0X2FkZHIpCiAJCQljb250aW51ZTsKQEAgLTY0OSw2ICs2NTEsMzMgQEAKIAkgICAgICAgZ2Fwc3RhcnQsIGdhcHN0YXJ0ICsgZ2Fwc2l6ZSAtIDEpOwogfQogCisvKgorICogQ2FsbGVkIGxhdGUgZHVyaW5nIGluaXQsIGluIGZyZWVfaW5pdG1lbSgpLgorICoKKyAqIEluaXRpYWwgZTgyMCBhbmQgZTgyMF9zYXZlZCBhcmUgbGFyZ2lzaCBfX2luaXRkYXRhIGFycmF5cy4KKyAqIENvcHkgdGhlbSB0byAodXN1YWxseSBtdWNoIHNtYWxsZXIpIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhcmVhLgorICogVGhpcyBpcyBkb25lIGFmdGVyIGFsbCB0d2Vha3Mgd2UgZXZlciBkbyB0byB0aGVtOgorICogYWxsIGZ1bmN0aW9ucyB3aGljaCBtb2RpZnkgdGhlbSBhcmUgX19pbml0IGZ1bmN0aW9ucywKKyAqIHRoZXkgd29uJ3QgZXhpc3QgYWZ0ZXIgdGhpcyBwb2ludC4KKyAqLworX19pbml0IHZvaWQgZTgyMF9yZWFsbG9jYXRlX3RhYmxlcyh2b2lkKQoreworCXN0cnVjdCBlODIwbWFwICpuOworCWludCBzaXplOworCisJc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBlODIwbWFwLCBtYXApICsgc2l6ZW9mKHN0cnVjdCBlODIwZW50cnkpICogZTgyMC0+bnJfbWFwOworCW4gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCUJVR19PTighbik7CisJbWVtY3B5KG4sIGU4MjAsIHNpemUpOworCWU4MjAgPSBuOworCisJc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBlODIwbWFwLCBtYXApICsgc2l6ZW9mKHN0cnVjdCBlODIwZW50cnkpICogZTgyMF9zYXZlZC0+bnJfbWFwOworCW4gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCUJVR19PTighbik7CisJbWVtY3B5KG4sIGU4MjBfc2F2ZWQsIHNpemUpOworCWU4MjBfc2F2ZWQgPSBuOworfQorCiAvKioKICAqIEJlY2F1c2Ugb2YgdGhlIHNpemUgbGltaXRhdGlvbiBvZiBzdHJ1Y3QgYm9vdF9wYXJhbXMsIG9ubHkgZmlyc3QKICAqIDEyOCBFODIwIG1lbW9yeSBlbnRyaWVzIGFyZSBwYXNzZWQgdG8ga2VybmVsIHZpYQpAQCAtNjY1LDcgKzY5NCw3IEBACiAJZW50cmllcyA9IHNkYXRhLT5sZW4gLyBzaXplb2Yoc3RydWN0IGU4MjBlbnRyeSk7CiAJZXh0bWFwID0gKHN0cnVjdCBlODIwZW50cnkgKikoc2RhdGEtPmRhdGEpOwogCV9fYXBwZW5kX2U4MjBfbWFwKGV4dG1hcCwgZW50cmllcyk7Ci0Jc2FuaXRpemVfZTgyMF9tYXAoZTgyMC5tYXAsIEFSUkFZX1NJWkUoZTgyMC5tYXApLCAmZTgyMC5ucl9tYXApOworCXNhbml0aXplX2U4MjBfbWFwKGU4MjAtPm1hcCwgQVJSQVlfU0laRShlODIwLT5tYXApLCAmZTgyMC0+bnJfbWFwKTsKIAllYXJseV9tZW11bm1hcChzZGF0YSwgZGF0YV9sZW4pOwogCXByaW50ayhLRVJOX0lORk8gImU4MjA6IGV4dGVuZGVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKIAllODIwX3ByaW50X21hcCgiZXh0ZW5kZWQiKTsKQEAgLTY4Niw4ICs3MTUsOCBAQAogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgcGZuID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLT5tYXBbaV07CiAKIAkJaWYgKHBmbiA8IFBGTl9VUChlaS0+YWRkcikpCiAJCQlyZWdpc3Rlcl9ub3NhdmVfcmVnaW9uKHBmbiwgUEZOX1VQKGVpLT5hZGRyKSk7CkBAIC03MTIsOCArNzQxLDggQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLT5tYXBbaV07CiAKIAkJaWYgKGVpLT50eXBlID09IEU4MjBfTlZTKQogCQkJYWNwaV9udnNfcmVnaXN0ZXIoZWktPmFkZHIsIGVpLT5zaXplKTsKQEAgLTc1NCwyMiArNzgzLDE4IEBACiAvKgogICogRmluZCB0aGUgaGlnaGVzdCBwYWdlIGZyYW1lIG51bWJlciB3ZSBoYXZlIGF2YWlsYWJsZQogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXQgZTgyMF9lbmRfcGZuKHVuc2lnbmVkIGxvbmcgbGltaXRfcGZuKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGU4MjBfZW5kX3Bmbih1bnNpZ25lZCBsb25nIGxpbWl0X3BmbiwgdW5zaWduZWQgdHlwZSkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGxhc3RfcGZuID0gMDsKIAl1bnNpZ25lZCBsb25nIG1heF9hcmNoX3BmbiA9IE1BWF9BUkNIX1BGTjsKIAotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLT5tYXBbaV07CiAJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOwogCQl1bnNpZ25lZCBsb25nIGVuZF9wZm47CiAKLQkJLyoKLQkJICogUGVyc2lzdGVudCBtZW1vcnkgaXMgYWNjb3VudGVkIGFzIHJhbSBmb3IgcHVycG9zZXMgb2YKLQkJICogZXN0YWJsaXNoaW5nIG1heF9wZm4gYW5kIG1lbV9tYXAuCi0JCSAqLwotCQlpZiAoZWktPnR5cGUgIT0gRTgyMF9SQU0gJiYgZWktPnR5cGUgIT0gRTgyMF9QUkFNKQorCQlpZiAoZWktPnR5cGUgIT0gdHlwZSkKIAkJCWNvbnRpbnVlOwogCiAJCXN0YXJ0X3BmbiA9IGVpLT5hZGRyID4+IFBBR0VfU0hJRlQ7CkBAIC03OTQsMTUgKzgxOSwxNSBAQAogfQogdW5zaWduZWQgbG9uZyBfX2luaXQgZTgyMF9lbmRfb2ZfcmFtX3Bmbih2b2lkKQogewotCXJldHVybiBlODIwX2VuZF9wZm4oTUFYX0FSQ0hfUEZOKTsKKwlyZXR1cm4gZTgyMF9lbmRfcGZuKE1BWF9BUkNIX1BGTiwgRTgyMF9SQU0pOwogfQogCiB1bnNpZ25lZCBsb25nIF9faW5pdCBlODIwX2VuZF9vZl9sb3dfcmFtX3Bmbih2b2lkKQogewotCXJldHVybiBlODIwX2VuZF9wZm4oMVVMIDw8ICgzMi1QQUdFX1NISUZUKSk7CisJcmV0dXJuIGU4MjBfZW5kX3BmbigxVUwgPDwgKDMyIC0gUEFHRV9TSElGVCksIEU4MjBfUkFNKTsKIH0KIAotc3RhdGljIHZvaWQgZWFybHlfcGFuaWMoY2hhciAqbXNnKQorc3RhdGljIHZvaWQgX19pbml0IGVhcmx5X3BhbmljKGNoYXIgKm1zZykKIHsKIAllYXJseV9wcmludGsobXNnKTsKIAlwYW5pYyhtc2cpOwpAQCAtODU2LDcgKzg4MSw3IEBACiAJCSAqLwogCQlzYXZlZF9tYXhfcGZuID0gZTgyMF9lbmRfb2ZfcmFtX3BmbigpOwogI2VuZGlmCi0JCWU4MjAubnJfbWFwID0gMDsKKwkJZTgyMC0+bnJfbWFwID0gMDsKIAkJdXNlcmRlZiA9IDE7CiAJCXJldHVybiAwOwogCX0KQEAgLTkwMyw4ICs5MjgsOCBAQAogdm9pZCBfX2luaXQgZmluaXNoX2U4MjBfcGFyc2luZyh2b2lkKQogewogCWlmICh1c2VyZGVmKSB7Ci0JCWlmIChzYW5pdGl6ZV9lODIwX21hcChlODIwLm1hcCwgQVJSQVlfU0laRShlODIwLm1hcCksCi0JCQkJCSZlODIwLm5yX21hcCkgPCAwKQorCQlpZiAoc2FuaXRpemVfZTgyMF9tYXAoZTgyMC0+bWFwLCBBUlJBWV9TSVpFKGU4MjAtPm1hcCksCisJCQkJCSZlODIwLT5ucl9tYXApIDwgMCkKIAkJCWVhcmx5X3BhbmljKCJJbnZhbGlkIHVzZXIgc3VwcGxpZWQgbWVtb3J5IG1hcCIpOwogCiAJCXByaW50ayhLRVJOX0lORk8gImU4MjA6IHVzZXItZGVmaW5lZCBwaHlzaWNhbCBSQU0gbWFwOlxuIik7CkBAIC05MTIsNyArOTM3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICplODIwX3R5cGVfdG9fc3RyaW5nKGludCBlODIwX3R5cGUpCitzdGF0aWMgY29uc3QgY2hhciAqX19pbml0IGU4MjBfdHlwZV90b19zdHJpbmcoaW50IGU4MjBfdHlwZSkKIHsKIAlzd2l0Y2ggKGU4MjBfdHlwZSkgewogCWNhc2UgRTgyMF9SRVNFUlZFRF9LRVJOOgpAQCAtOTI2LDcgKzk1MSw3IEBACiAJfQogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBlODIwX3R5cGVfdG9faW9tZW1fdHlwZShpbnQgZTgyMF90eXBlKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGU4MjBfdHlwZV90b19pb21lbV90eXBlKGludCBlODIwX3R5cGUpCiB7CiAJc3dpdGNoIChlODIwX3R5cGUpIHsKIAljYXNlIEU4MjBfUkVTRVJWRURfS0VSTjoKQEAgLTk0Miw3ICs5NjcsNyBAQAogCX0KIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZTgyMF90eXBlX3RvX2lvcmVzX2Rlc2MoaW50IGU4MjBfdHlwZSkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdCBlODIwX3R5cGVfdG9faW9yZXNfZGVzYyhpbnQgZTgyMF90eXBlKQogewogCXN3aXRjaCAoZTgyMF90eXBlKSB7CiAJY2FzZSBFODIwX0FDUEk6CkBAIC05NjEsNyArOTg2LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBib29sIGRvX21hcmtfYnVzeSh1MzIgdHlwZSwgc3RydWN0IHJlc291cmNlICpyZXMpCitzdGF0aWMgYm9vbCBfX2luaXQgZG9fbWFya19idXN5KHUzMiB0eXBlLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKIHsKIAkvKiB0aGlzIGlzIHRoZSBsZWdhY3kgYmlvcy9kb3Mgcm9tLXNoYWRvdyArIG1taW8gcmVnaW9uICovCiAJaWYgKHJlcy0+c3RhcnQgPCAoMVVMTDw8MjApKQpAQCAtOTkxLDM1ICsxMDE2LDM1IEBACiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJdTY0IGVuZDsKIAotCXJlcyA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKiBlODIwLm5yX21hcCk7CisJcmVzID0gYWxsb2NfYm9vdG1lbShzaXplb2Yoc3RydWN0IHJlc291cmNlKSAqIGU4MjAtPm5yX21hcCk7CiAJZTgyMF9yZXMgPSByZXM7Ci0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJZW5kID0gZTgyMC5tYXBbaV0uYWRkciArIGU4MjAubWFwW2ldLnNpemUgLSAxOworCWZvciAoaSA9IDA7IGkgPCBlODIwLT5ucl9tYXA7IGkrKykgeworCQllbmQgPSBlODIwLT5tYXBbaV0uYWRkciArIGU4MjAtPm1hcFtpXS5zaXplIC0gMTsKIAkJaWYgKGVuZCAhPSAocmVzb3VyY2Vfc2l6ZV90KWVuZCkgewogCQkJcmVzKys7CiAJCQljb250aW51ZTsKIAkJfQotCQlyZXMtPm5hbWUgPSBlODIwX3R5cGVfdG9fc3RyaW5nKGU4MjAubWFwW2ldLnR5cGUpOwotCQlyZXMtPnN0YXJ0ID0gZTgyMC5tYXBbaV0uYWRkcjsKKwkJcmVzLT5uYW1lID0gZTgyMF90eXBlX3RvX3N0cmluZyhlODIwLT5tYXBbaV0udHlwZSk7CisJCXJlcy0+c3RhcnQgPSBlODIwLT5tYXBbaV0uYWRkcjsKIAkJcmVzLT5lbmQgPSBlbmQ7CiAKLQkJcmVzLT5mbGFncyA9IGU4MjBfdHlwZV90b19pb21lbV90eXBlKGU4MjAubWFwW2ldLnR5cGUpOwotCQlyZXMtPmRlc2MgPSBlODIwX3R5cGVfdG9faW9yZXNfZGVzYyhlODIwLm1hcFtpXS50eXBlKTsKKwkJcmVzLT5mbGFncyA9IGU4MjBfdHlwZV90b19pb21lbV90eXBlKGU4MjAtPm1hcFtpXS50eXBlKTsKKwkJcmVzLT5kZXNjID0gZTgyMF90eXBlX3RvX2lvcmVzX2Rlc2MoZTgyMC0+bWFwW2ldLnR5cGUpOwogCiAJCS8qCiAJCSAqIGRvbid0IHJlZ2lzdGVyIHRoZSByZWdpb24gdGhhdCBjb3VsZCBiZSBjb25mbGljdGVkIHdpdGgKIAkJICogcGNpIGRldmljZSBCQVIgcmVzb3VyY2UgYW5kIGluc2VydCB0aGVtIGxhdGVyIGluCiAJCSAqIHBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KCkKIAkJICovCi0JCWlmIChkb19tYXJrX2J1c3koZTgyMC5tYXBbaV0udHlwZSwgcmVzKSkgeworCQlpZiAoZG9fbWFya19idXN5KGU4MjAtPm1hcFtpXS50eXBlLCByZXMpKSB7CiAJCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfQlVTWTsKIAkJCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIHJlcyk7CiAJCX0KIAkJcmVzKys7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IGU4MjBfc2F2ZWQubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IGU4MjBlbnRyeSAqZW50cnkgPSAmZTgyMF9zYXZlZC5tYXBbaV07CisJZm9yIChpID0gMDsgaSA8IGU4MjBfc2F2ZWQtPm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVudHJ5ID0gJmU4MjBfc2F2ZWQtPm1hcFtpXTsKIAkJZmlybXdhcmVfbWFwX2FkZF9lYXJseShlbnRyeS0+YWRkciwKIAkJCWVudHJ5LT5hZGRyICsgZW50cnktPnNpemUsCiAJCQllODIwX3R5cGVfdG9fc3RyaW5nKGVudHJ5LT50eXBlKSk7CkBAIC0xMDI3LDcgKzEwNTIsNyBAQAogfQogCiAvKiBIb3cgbXVjaCBzaG91bGQgd2UgcGFkIFJBTSBlbmRpbmcgZGVwZW5kaW5nIG9uIHdoZXJlIGl0IGlzPyAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFtX2FsaWdubWVudChyZXNvdXJjZV9zaXplX3QgcG9zKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IHJhbV9hbGlnbm1lbnQocmVzb3VyY2Vfc2l6ZV90IHBvcykKIHsKIAl1bnNpZ25lZCBsb25nIG1iID0gcG9zID4+IDIwOwogCkBAIC0xMDUxLDcgKzEwNzYsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCiAJcmVzID0gZTgyMF9yZXM7Ci0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKIAkJaWYgKCFyZXMtPnBhcmVudCAmJiByZXMtPmVuZCkKIAkJCWluc2VydF9yZXNvdXJjZV9leHBhbmRfdG9fZml0KCZpb21lbV9yZXNvdXJjZSwgcmVzKTsKIAkJcmVzKys7CkBAIC0xMDYxLDggKzEwODYsOCBAQAogCSAqIFRyeSB0byBidW1wIHVwIFJBTSByZWdpb25zIHRvIHJlYXNvbmFibGUgYm91bmRhcmllcyB0bwogCSAqIGF2b2lkIHN0b2xlbiBSQU06CiAJICovCi0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJc3RydWN0IGU4MjBlbnRyeSAqZW50cnkgPSAmZTgyMC5tYXBbaV07CisJZm9yIChpID0gMDsgaSA8IGU4MjAtPm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVudHJ5ID0gJmU4MjAtPm1hcFtpXTsKIAkJdTY0IHN0YXJ0LCBlbmQ7CiAKIAkJaWYgKGVudHJ5LT50eXBlICE9IEU4MjBfUkFNKQpAQCAtMTExMCw3ICsxMTM1LDcgQEAKIAkJCXdobyA9ICJCSU9TLWU4MDEiOwogCQl9CiAKLQkJZTgyMC5ucl9tYXAgPSAwOworCQllODIwLT5ucl9tYXAgPSAwOwogCQllODIwX2FkZF9yZWdpb24oMCwgTE9XTUVNU0laRSgpLCBFODIwX1JBTSk7CiAJCWU4MjBfYWRkX3JlZ2lvbihISUdIX01FTU9SWSwgbWVtX3NpemUgPDwgMTAsIEU4MjBfUkFNKTsKIAl9CkBAIC0xMTI0LDcgKzExNDksNyBAQAogCWNoYXIgKndobzsKIAogCXdobyA9IHg4Nl9pbml0LnJlc291cmNlcy5tZW1vcnlfc2V0dXAoKTsKLQltZW1jcHkoJmU4MjBfc2F2ZWQsICZlODIwLCBzaXplb2Yoc3RydWN0IGU4MjBtYXApKTsKKwltZW1jcHkoZTgyMF9zYXZlZCwgZTgyMCwgc2l6ZW9mKHN0cnVjdCBlODIwbWFwKSk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiZTgyMDogQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOlxuIik7CiAJZTgyMF9wcmludF9tYXAod2hvKTsKIH0KQEAgLTExNDEsOCArMTE2Niw4IEBACiAJICovCiAJbWVtYmxvY2tfYWxsb3dfcmVzaXplKCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKKwkJc3RydWN0IGU4MjBlbnRyeSAqZWkgPSAmZTgyMC0+bWFwW2ldOwogCiAJCWVuZCA9IGVpLT5hZGRyICsgZWktPnNpemU7CiAJCWlmIChlbmQgIT0gKHJlc291cmNlX3NpemVfdCllbmQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMKaW5kZXggZGU3NTAxZS4uMThiYjNhNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYwpAQCAtNTU1LDcgKzU1NSw3IEBACiAKIAkvKiBNYXJrIHRoaXMgc3BhY2UgYXMgcmVzZXJ2ZWQgKi8KIAllODIwX2FkZF9yZWdpb24oYmFzZSwgc2l6ZSwgRTgyMF9SRVNFUlZFRCk7Ci0Jc2FuaXRpemVfZTgyMF9tYXAoZTgyMC5tYXAsIEFSUkFZX1NJWkUoZTgyMC5tYXApLCAmZTgyMC5ucl9tYXApOworCXNhbml0aXplX2U4MjBfbWFwKGU4MjAtPm1hcCwgQVJSQVlfU0laRShlODIwLT5tYXApLCAmZTgyMC0+bnJfbWFwKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGludGVsX2dyYXBoaWNzX3F1aXJrcyhpbnQgbnVtLCBpbnQgc2xvdCwgaW50IGZ1bmMpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZnB1L2luaXQuYyBiL2FyY2gveDg2L2tlcm5lbC9mcHUvaW5pdC5jCmluZGV4IDkzOTgyYWUuLjJmMmI4YzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9mcHUvaW5pdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9mcHUvaW5pdC5jCkBAIC0zMTcsNyArMzE3LDYgQEAKIAlvbl9ib290X2NwdSA9IDA7CiAKIAlXQVJOX09OX0ZQVShjdXJyZW50LT50aHJlYWQuZnB1LmZwc3RhdGVfYWN0aXZlKTsKLQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyA9IDA7CiAKIAlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hTQVZFT1BUKSAmJiBlYWdlcmZwdSAhPSBESVNBQkxFKQogCQllYWdlcmZwdSA9IEVOQUJMRTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9mdHJhY2UuYwppbmRleCBkMDM2Y2ZiLi44NjM5YmIyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZnRyYWNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2Z0cmFjZS5jCkBAIC0xMDI5LDcgKzEwMjksNyBAQAogCX0KIAogCWlmIChmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2Uob2xkLCBzZWxmX2FkZHIsICZ0cmFjZS5kZXB0aCwKLQkJICAgIGZyYW1lX3BvaW50ZXIpID09IC1FQlVTWSkgeworCQkJCSAgICAgZnJhbWVfcG9pbnRlciwgcGFyZW50KSA9PSAtRUJVU1kpIHsKIAkJKnBhcmVudCA9IG9sZDsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TCmluZGV4IDZmODkwMmIuLjVmNDAxMjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMKKysrIGIvYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUwpAQCAtOTQsNyArOTQsNyBAQAogICovCiBfX0hFQUQKIEVOVFJZKHN0YXJ0dXBfMzIpCi0JbW92bCBwYShzdGFja19zdGFydCksJWVjeAorCW1vdmwgcGEoaW5pdGlhbF9zdGFjayksJWVjeAogCQogCS8qIHRlc3QgS0VFUF9TRUdNRU5UUyBmbGFnIHRvIHNlZSBpZiB0aGUgYm9vdGxvYWRlciBpcyBhc2tpbmcKIAkJdXMgdG8gbm90IHJlbG9hZCBzZWdtZW50cyAqLwpAQCAtMjg2LDcgKzI4Niw3IEBACiAgKiBzdGFydF9zZWNvbmRhcnkoKS4KICAqLwogRU5UUlkoc3RhcnRfY3B1MCkKLQltb3ZsIHN0YWNrX3N0YXJ0LCAlZWN4CisJbW92bCBpbml0aWFsX3N0YWNrLCAlZWN4CiAJbW92bCAlZWN4LCAlZXNwCiAJam1wICAqKGluaXRpYWxfY29kZSkKIEVORFBST0Moc3RhcnRfY3B1MCkKQEAgLTMwNyw3ICszMDcsNyBAQAogCW1vdmwgJWVheCwlZXMKIAltb3ZsICVlYXgsJWZzCiAJbW92bCAlZWF4LCVncwotCW1vdmwgcGEoc3RhY2tfc3RhcnQpLCVlY3gKKwltb3ZsIHBhKGluaXRpYWxfc3RhY2spLCVlY3gKIAltb3ZsICVlYXgsJXNzCiAJbGVhbCAtX19QQUdFX09GRlNFVCglZWN4KSwlZXNwCiAKQEAgLTcwMyw3ICs3MDMsNyBAQAogCiAuZGF0YQogLmJhbGlnbiA0Ci1FTlRSWShzdGFja19zdGFydCkKK0VOVFJZKGluaXRpYWxfc3RhY2spCiAJLmxvbmcgaW5pdF90aHJlYWRfdW5pb24rVEhSRUFEX1NJWkUKIAogX19JTklUUk9EQVRBCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUwppbmRleCA5ZjhlZmM5Li5jOThhNTU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzY0LlMKQEAgLTY2LDcgKzY2LDcgQEAKIAkgKi8KIAogCS8qCi0JICogU2V0dXAgc3RhY2sgZm9yIHZlcmlmeV9jcHUoKS4gIi04IiBiZWNhdXNlIHN0YWNrX3N0YXJ0IGlzIGRlZmluZWQKKwkgKiBTZXR1cCBzdGFjayBmb3IgdmVyaWZ5X2NwdSgpLiAiLTgiIGJlY2F1c2UgaW5pdGlhbF9zdGFjayBpcyBkZWZpbmVkCiAJICogdGhpcyB3YXksIHNlZSBiZWxvdy4gT3VyIGJlc3QgZ3Vlc3MgaXMgYSBOVUxMIHB0ciBmb3Igc3RhY2sKIAkgKiB0ZXJtaW5hdGlvbiBoZXVyaXN0aWNzIGFuZCB3ZSBkb24ndCB3YW50IHRvIGJyZWFrIGFueXRoaW5nIHdoaWNoCiAJICogbWlnaHQgZGVwZW5kIG9uIGl0IChrZ2RiLCAuLi4pLgpAQCAtMjI2LDcgKzIyNiw3IEBACiAJbW92cQklcmF4LCAlY3IwCiAKIAkvKiBTZXR1cCBhIGJvb3QgdGltZSBzdGFjayAqLwotCW1vdnEgc3RhY2tfc3RhcnQoJXJpcCksICVyc3AKKwltb3ZxIGluaXRpYWxfc3RhY2soJXJpcCksICVyc3AKIAogCS8qIHplcm8gRUZMQUdTIGFmdGVyIHNldHRpbmcgcnNwICovCiAJcHVzaHEgJDAKQEAgLTMxMCw3ICszMTAsNyBAQAogICogc3RhcnRfc2Vjb25kYXJ5KCkuCiAgKi8KIEVOVFJZKHN0YXJ0X2NwdTApCi0JbW92cSBzdGFja19zdGFydCglcmlwKSwlcnNwCisJbW92cSBpbml0aWFsX3N0YWNrKCVyaXApLCVyc3AKIAltb3ZxCWluaXRpYWxfY29kZSglcmlwKSwlcmF4CiAJcHVzaHEJJDAJCSMgZmFrZSByZXR1cm4gYWRkcmVzcyB0byBzdG9wIHVud2luZGVyCiAJcHVzaHEJJF9fS0VSTkVMX0NTCSMgc2V0IGNvcnJlY3QgY3MKQEAgLTMxOSwxNyArMzE5LDE1IEBACiBFTkRQUk9DKHN0YXJ0X2NwdTApCiAjZW5kaWYKIAotCS8qIFNNUCBib290dXAgY2hhbmdlcyB0aGVzZSB0d28gKi8KKwkvKiBCb3RoIFNNUCBib290dXAgYW5kIEFDUEkgc3VzcGVuZCBjaGFuZ2UgdGhlc2UgdmFyaWFibGVzICovCiAJX19SRUZEQVRBCiAJLmJhbGlnbgk4CiAJR0xPQkFMKGluaXRpYWxfY29kZSkKIAkucXVhZAl4ODZfNjRfc3RhcnRfa2VybmVsCiAJR0xPQkFMKGluaXRpYWxfZ3MpCiAJLnF1YWQJSU5JVF9QRVJfQ1BVX1ZBUihpcnFfc3RhY2tfdW5pb24pCi0KLQlHTE9CQUwoc3RhY2tfc3RhcnQpCisJR0xPQkFMKGluaXRpYWxfc3RhY2spCiAJLnF1YWQgIGluaXRfdGhyZWFkX3VuaW9uK1RIUkVBRF9TSVpFLTgKLQkud29yZCAgMAogCV9fRklOSVREQVRBCiAKIGJhZF9hZGRyZXNzOgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2hwZXQuYyBiL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKaW5kZXggYzZkZmQ4MC4uMjc0ZmFiOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2hwZXQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCkBAIC03NTYsMTAgKzc1NiwxMDQgQEAKIC8qCiAgKiBDbG9jayBzb3VyY2UgcmVsYXRlZCBjb2RlCiAgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoQ09ORklHXzY0QklUKQorLyoKKyAqIFJlYWRpbmcgdGhlIEhQRVQgY291bnRlciBpcyBhIHZlcnkgc2xvdyBvcGVyYXRpb24uIElmIGEgbGFyZ2UgbnVtYmVyIG9mCisgKiBDUFVzIGFyZSB0cnlpbmcgdG8gYWNjZXNzIHRoZSBIUEVUIGNvdW50ZXIgc2ltdWx0YW5lb3VzbHksIGl0IGNhbiBjYXVzZQorICogbWFzc2l2ZSBkZWxheSBhbmQgc2xvdyBkb3duIHN5c3RlbSBwZXJmb3JtYW5jZSBkcmFtYXRpY2FsbHkuIFRoaXMgbWF5CisgKiBoYXBwZW4gd2hlbiBIUEVUIGlzIHRoZSBkZWZhdWx0IGNsb2NrIHNvdXJjZSBpbnN0ZWFkIG9mIFRTQy4gRm9yIGEKKyAqIHJlYWxseSBsYXJnZSBzeXN0ZW0gd2l0aCBodW5kcmVkcyBvZiBDUFVzLCB0aGUgc2xvd2Rvd24gbWF5IGJlIHNvCisgKiBzZXZlcmUgdGhhdCBpdCBtYXkgYWN0dWFsbHkgY3Jhc2ggdGhlIHN5c3RlbSBiZWNhdXNlIG9mIGEgTk1JIHdhdGNoZG9nCisgKiBzb2Z0IGxvY2t1cCwgZm9yIGV4YW1wbGUuCisgKgorICogSWYgbXVsdGlwbGUgQ1BVcyBhcmUgdHJ5aW5nIHRvIGFjY2VzcyB0aGUgSFBFVCBjb3VudGVyIGF0IHRoZSBzYW1lIHRpbWUsCisgKiB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIHJlYWQgdGhlIGNvdW50ZXIgbXVsdGlwbGUgdGltZXMuIEluc3RlYWQsIHRoZQorICogb3RoZXIgQ1BVcyBjYW4gdXNlIHRoZSBjb3VudGVyIHZhbHVlIHJlYWQgYnkgdGhlIGZpcnN0IENQVSBpbiB0aGUgZ3JvdXAuCisgKgorICogVGhpcyBzcGVjaWFsIGZlYXR1cmUgaXMgb25seSBlbmFibGVkIG9uIHg4Ni02NCBzeXN0ZW1zLiBJdCBpcyB1bmxpa2VseQorICogdGhhdCAzMi1iaXQgeDg2IHN5c3RlbXMgd2lsbCBoYXZlIGVub3VnaCBDUFVzIHRvIHJlcXVpcmUgdGhpcyBmZWF0dXJlCisgKiB3aXRoIGl0cyBhc3NvY2lhdGVkIGxvY2tpbmcgb3ZlcmhlYWQuIEFuZCB3ZSBhbHNvIG5lZWQgNjQtYml0IGF0b21pYworICogcmVhZC4KKyAqCisgKiBUaGUgbG9jayBhbmQgdGhlIGhwZXQgdmFsdWUgYXJlIHN0b3JlZCB0b2dldGhlciBhbmQgY2FuIGJlIHJlYWQgaW4gYQorICogc2luZ2xlIGF0b21pYyA2NC1iaXQgcmVhZC4gSXQgaXMgZXhwbGljaXRseSBhc3N1bWVkIHRoYXQgYXJjaF9zcGlubG9ja190CisgKiBpcyAzMiBiaXRzIGluIHNpemUuCisgKi8KK3VuaW9uIGhwZXRfbG9jayB7CisJc3RydWN0IHsKKwkJYXJjaF9zcGlubG9ja190IGxvY2s7CisJCXUzMiB2YWx1ZTsKKwl9OworCXU2NCBsb2NrdmFsOworfTsKKworc3RhdGljIHVuaW9uIGhwZXRfbG9jayBocGV0IF9fY2FjaGVsaW5lX2FsaWduZWQgPSB7CisJeyAubG9jayA9IF9fQVJDSF9TUElOX0xPQ0tfVU5MT0NLRUQsIH0sCit9OworCitzdGF0aWMgY3ljbGVfdCByZWFkX2hwZXQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuaW9uIGhwZXRfbG9jayBvbGQsIG5ldzsKKworCUJVSUxEX0JVR19PTihzaXplb2YodW5pb24gaHBldF9sb2NrKSAhPSA4KTsKKworCS8qCisJICogUmVhZCBIUEVUIGRpcmVjdGx5IGlmIGluIE5NSS4KKwkgKi8KKwlpZiAoaW5fbm1pKCkpCisJCXJldHVybiAoY3ljbGVfdClocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisKKwkvKgorCSAqIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxvY2sgYW5kIEhQRVQgdmFsdWUgYXRvbWljYWxseS4KKwkgKi8KKwlvbGQubG9ja3ZhbCA9IFJFQURfT05DRShocGV0LmxvY2t2YWwpOworCisJaWYgKGFyY2hfc3Bpbl9pc19sb2NrZWQoJm9sZC5sb2NrKSkKKwkJZ290byBjb250ZW5kZWQ7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKGFyY2hfc3Bpbl90cnlsb2NrKCZocGV0LmxvY2spKSB7CisJCW5ldy52YWx1ZSA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwkJLyoKKwkJICogVXNlIFdSSVRFX09OQ0UoKSB0byBwcmV2ZW50IHN0b3JlIHRlYXJpbmcuCisJCSAqLworCQlXUklURV9PTkNFKGhwZXQudmFsdWUsIG5ldy52YWx1ZSk7CisJCWFyY2hfc3Bpbl91bmxvY2soJmhwZXQubG9jayk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuIChjeWNsZV90KW5ldy52YWx1ZTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCitjb250ZW5kZWQ6CisJLyoKKwkgKiBDb250ZW5kZWQgY2FzZQorCSAqIC0tLS0tLS0tLS0tLS0tCisJICogV2FpdCB1bnRpbCB0aGUgSFBFVCB2YWx1ZSBjaGFuZ2Ugb3IgdGhlIGxvY2sgaXMgZnJlZSB0byBpbmRpY2F0ZQorCSAqIGl0cyB2YWx1ZSBpcyB1cC10by1kYXRlLgorCSAqCisJICogSXQgaXMgcG9zc2libGUgdGhhdCBvbGQudmFsdWUgaGFzIGFscmVhZHkgY29udGFpbmVkIHRoZSBsYXRlc3QKKwkgKiBIUEVUIHZhbHVlIHdoaWxlIHRoZSBsb2NrIGhvbGRlciB3YXMgaW4gdGhlIHByb2Nlc3Mgb2YgcmVsZWFzaW5nCisJICogdGhlIGxvY2suIENoZWNraW5nIGZvciBsb2NrIHN0YXRlIGNoYW5nZSB3aWxsIGVuYWJsZSB1cyB0byByZXR1cm4KKwkgKiB0aGUgdmFsdWUgaW1tZWRpYXRlbHkgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgbmV4dCBIUEVUIHJlYWRlcgorCSAqIHRvIGNvbWUgYWxvbmcuCisJICovCisJZG8geworCQljcHVfcmVsYXgoKTsKKwkJbmV3LmxvY2t2YWwgPSBSRUFEX09OQ0UoaHBldC5sb2NrdmFsKTsKKwl9IHdoaWxlICgobmV3LnZhbHVlID09IG9sZC52YWx1ZSkgJiYgYXJjaF9zcGluX2lzX2xvY2tlZCgmbmV3LmxvY2spKTsKKworCXJldHVybiAoY3ljbGVfdCluZXcudmFsdWU7Cit9CisjZWxzZQorLyoKKyAqIEZvciBVUCBvciAzMi1iaXQuCisgKi8KIHN0YXRpYyBjeWNsZV90IHJlYWRfaHBldChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQogewogCXJldHVybiAoY3ljbGVfdClocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CiB9CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9ocGV0ID0gewogCS5uYW1lCQk9ICJocGV0IiwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9pcnFfNjQuYwppbmRleCA0YTc5MDM3Li45ZWJkMGIwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycV82NC5jCkBAIC00MCw4ICs0MCw3IEBACiAJaWYgKHVzZXJfbW9kZShyZWdzKSkKIAkJcmV0dXJuOwogCi0JaWYgKHJlZ3MtPnNwID49IGN1cmJhc2UgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSArCi0JCQkJICBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpICsgU1RBQ0tfVE9QX01BUkdJTiAmJgorCWlmIChyZWdzLT5zcCA+PSBjdXJiYXNlICsgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSArIFNUQUNLX1RPUF9NQVJHSU4gJiYKIAkgICAgcmVncy0+c3AgPD0gY3VyYmFzZSArIFRIUkVBRF9TSVpFKQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rZXhlYy1iemltYWdlNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9rZXhlYy1iemltYWdlNjQuYwppbmRleCBmMjM1NmJkLi4zNDA3YjE0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva2V4ZWMtYnppbWFnZTY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2tleGVjLWJ6aW1hZ2U2NC5jCkBAIC05OSwxNCArOTksMTQgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbnJfZTgyMF9lbnRyaWVzOwogCi0JbnJfZTgyMF9lbnRyaWVzID0gZTgyMF9zYXZlZC5ucl9tYXA7CisJbnJfZTgyMF9lbnRyaWVzID0gZTgyMF9zYXZlZC0+bnJfbWFwOwogCiAJLyogVE9ETzogUGFzcyBlbnRyaWVzIG1vcmUgdGhhbiBFODIwTUFYIGluIGJvb3RwYXJhbXMgc2V0dXAgZGF0YSAqLwogCWlmIChucl9lODIwX2VudHJpZXMgPiBFODIwTUFYKQogCQlucl9lODIwX2VudHJpZXMgPSBFODIwTUFYOwogCiAJcGFyYW1zLT5lODIwX2VudHJpZXMgPSBucl9lODIwX2VudHJpZXM7Ci0JbWVtY3B5KCZwYXJhbXMtPmU4MjBfbWFwLCAmZTgyMF9zYXZlZC5tYXAsCisJbWVtY3B5KCZwYXJhbXMtPmU4MjBfbWFwLCAmZTgyMF9zYXZlZC0+bWFwLAogCSAgICAgICBucl9lODIwX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IGU4MjBlbnRyeSkpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jIGIvYXJjaC94ODYva2VybmVsL2tnZGIuYwppbmRleCAwNGNkZTUyLi44ZTM2ZjI0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxhc20vYXBpY2RlZi5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAjaW5jbHVkZSA8YXNtL25taS5oPgorI2luY2x1ZGUgPGFzbS9zd2l0Y2hfdG8uaD4KIAogc3RydWN0IGRiZ19yZWdfZGVmX3QgZGJnX3JlZ19kZWZbREJHX01BWF9SRUdfTlVNXSA9CiB7CkBAIC0xNjYsMjEgKzE2NywxOSBAQAogCWdkYl9yZWdzW0dEQl9EWF0JPSAwOwogCWdkYl9yZWdzW0dEQl9TSV0JPSAwOwogCWdkYl9yZWdzW0dEQl9ESV0JPSAwOwotCWdkYl9yZWdzW0dEQl9CUF0JPSAqKHVuc2lnbmVkIGxvbmcgKilwLT50aHJlYWQuc3A7CisJZ2RiX3JlZ3NbR0RCX0JQXQk9ICgoc3RydWN0IGluYWN0aXZlX3Rhc2tfZnJhbWUgKilwLT50aHJlYWQuc3ApLT5icDsKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJZ2RiX3JlZ3NbR0RCX0RTXQk9IF9fS0VSTkVMX0RTOwogCWdkYl9yZWdzW0dEQl9FU10JPSBfX0tFUk5FTF9EUzsKIAlnZGJfcmVnc1tHREJfUFNdCT0gMDsKIAlnZGJfcmVnc1tHREJfQ1NdCT0gX19LRVJORUxfQ1M7Ci0JZ2RiX3JlZ3NbR0RCX1BDXQk9IHAtPnRocmVhZC5pcDsKIAlnZGJfcmVnc1tHREJfU1NdCT0gX19LRVJORUxfRFM7CiAJZ2RiX3JlZ3NbR0RCX0ZTXQk9IDB4RkZGRjsKIAlnZGJfcmVnc1tHREJfR1NdCT0gMHhGRkZGOwogI2Vsc2UKLQlnZGJfcmVnczMyW0dEQl9QU10JPSAqKHVuc2lnbmVkIGxvbmcgKikocC0+dGhyZWFkLnNwICsgOCk7CisJZ2RiX3JlZ3MzMltHREJfUFNdCT0gMDsKIAlnZGJfcmVnczMyW0dEQl9DU10JPSBfX0tFUk5FTF9DUzsKIAlnZGJfcmVnczMyW0dEQl9TU10JPSBfX0tFUk5FTF9EUzsKLQlnZGJfcmVnc1tHREJfUENdCT0gMDsKIAlnZGJfcmVnc1tHREJfUjhdCT0gMDsKIAlnZGJfcmVnc1tHREJfUjldCT0gMDsKIAlnZGJfcmVnc1tHREJfUjEwXQk9IDA7CkBAIC0xOTAsNiArMTg5LDcgQEAKIAlnZGJfcmVnc1tHREJfUjE0XQk9IDA7CiAJZ2RiX3JlZ3NbR0RCX1IxNV0JPSAwOwogI2VuZGlmCisJZ2RiX3JlZ3NbR0RCX1BDXQk9IDA7CiAJZ2RiX3JlZ3NbR0RCX1NQXQk9IHAtPnRocmVhZC5zcDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2twcm9iZXMvY29yZS5jIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMvY29yZS5jCmluZGV4IDc4NDdlNWMuLjI4Y2VlMDEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL2NvcmUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy9jb3JlLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL29wdC5jIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMvb3B0LmMKaW5kZXggNDQyNWY1OS4uM2JiNGM1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2twcm9iZXMvb3B0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMvb3B0LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rc3lzZnMuYyBiL2FyY2gveDg2L2tlcm5lbC9rc3lzZnMuYwppbmRleCBjMmJlZGFlLi40YWZjNjdmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva3N5c2ZzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2tzeXNmcy5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAogc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSB0eXBlX2F0dHIgPSBfX0FUVFJfUk8odHlwZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBkYXRhX2F0dHIgPSB7CitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZGF0YV9hdHRyIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAkuYXR0ciA9IHsKIAkJLm5hbWUgPSAiZGF0YSIsCiAJCS5tb2RlID0gU19JUlVHTywKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9rdm0uYyBiL2FyY2gveDg2L2tlcm5lbC9rdm0uYwppbmRleCAxNzI2YzRjLi5lZGJiZmM4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2t2bS5jCkBAIC00MjMsMTIgKzQyMyw3IEBACiAJa3ZtX3NwaW5sb2NrX2luaXQoKTsKIH0KIAotc3RhdGljIHZvaWQga3ZtX2d1ZXN0X2NwdV9vbmxpbmUodm9pZCAqZHVtbXkpCi17Ci0Ja3ZtX2d1ZXN0X2NwdV9pbml0KCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGt2bV9ndWVzdF9jcHVfb2ZmbGluZSh2b2lkICpkdW1teSkKK3N0YXRpYyB2b2lkIGt2bV9ndWVzdF9jcHVfb2ZmbGluZSh2b2lkKQogewogCWt2bV9kaXNhYmxlX3N0ZWFsX3RpbWUoKTsKIAlpZiAoa3ZtX3BhcmFfaGFzX2ZlYXR1cmUoS1ZNX0ZFQVRVUkVfUFZfRU9JKSkKQEAgLTQzNywyOSArNDMyLDIxIEBACiAJYXBmX3Rhc2tfd2FrZV9hbGwoKTsKIH0KIAotc3RhdGljIGludCBrdm1fY3B1X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJICB2b2lkICpoY3B1KQorc3RhdGljIGludCBrdm1fY3B1X29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCWludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGt2bV9ndWVzdF9jcHVfb25saW5lLCBOVUxMLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46Ci0JCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGt2bV9ndWVzdF9jcHVfb2ZmbGluZSwgTlVMTCwgMSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJa3ZtX2d1ZXN0X2NwdV9pbml0KCk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGt2bV9jcHVfbm90aWZpZXIgPSB7Ci0gICAgICAgIC5ub3RpZmllcl9jYWxsICA9IGt2bV9jcHVfbm90aWZ5LAotfTsKK3N0YXRpYyBpbnQga3ZtX2NwdV9kb3duX3ByZXBhcmUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWt2bV9ndWVzdF9jcHVfb2ZmbGluZSgpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiBzdGF0aWMgdm9pZCBfX2luaXQga3ZtX2FwZl90cmFwX2luaXQodm9pZCkKQEAgLTQ5NCw3ICs0ODEsOSBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCXNtcF9vcHMuc21wX3ByZXBhcmVfYm9vdF9jcHUgPSBrdm1fc21wX3ByZXBhcmVfYm9vdF9jcHU7Ci0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZrdm1fY3B1X25vdGlmaWVyKTsKKwlpZiAoY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLCAieDg2L2t2bTpvbmxpbmUiLAorCQkJCSAgICAgIGt2bV9jcHVfb25saW5lLCBrdm1fY3B1X2Rvd25fcHJlcGFyZSkgPCAwKQorCQlwcl9lcnIoImt2bV9ndWVzdDogRmFpbGVkIHRvIGluc3RhbGwgY3B1IGhvdHBsdWcgY2FsbGJhY2tzXG4iKTsKICNlbHNlCiAJa3ZtX2d1ZXN0X2NwdV9pbml0KCk7CiAjZW5kaWYKQEAgLTU3NSw5ICs1NjQsNiBAQAogCWt2bV9oeXBlcmNhbGwyKEtWTV9IQ19LSUNLX0NQVSwgZmxhZ3MsIGFwaWNpZCk7CiB9CiAKLQotI2lmZGVmIENPTkZJR19RVUVVRURfU1BJTkxPQ0tTCi0KICNpbmNsdWRlIDxhc20vcXNwaW5sb2NrLmg+CiAKIHN0YXRpYyB2b2lkIGt2bV93YWl0KHU4ICpwdHIsIHU4IHZhbCkKQEAgLTYwNiwyNDMgKzU5Miw2IEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi0jZWxzZSAvKiAhQ09ORklHX1FVRVVFRF9TUElOTE9DS1MgKi8KLQotZW51bSBrdm1fY29udGVudGlvbl9zdGF0IHsKLQlUQUtFTl9TTE9XLAotCVRBS0VOX1NMT1dfUElDS1VQLAotCVJFTEVBU0VEX1NMT1csCi0JUkVMRUFTRURfU0xPV19LSUNLRUQsCi0JTlJfQ09OVEVOVElPTl9TVEFUUwotfTsKLQotI2lmZGVmIENPTkZJR19LVk1fREVCVUdfRlMKLSNkZWZpbmUgSElTVE9fQlVDS0VUUwkzMAotCi1zdGF0aWMgc3RydWN0IGt2bV9zcGlubG9ja19zdGF0cwotewotCXUzMiBjb250ZW50aW9uX3N0YXRzW05SX0NPTlRFTlRJT05fU1RBVFNdOwotCXUzMiBoaXN0b19zcGluX2Jsb2NrZWRbSElTVE9fQlVDS0VUUysxXTsKLQl1NjQgdGltZV9ibG9ja2VkOwotfSBzcGlubG9ja19zdGF0czsKLQotc3RhdGljIHU4IHplcm9fc3RhdHM7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja196ZXJvKHZvaWQpCi17Ci0JdTggcmV0OwotCXU4IG9sZDsKLQotCW9sZCA9IFJFQURfT05DRSh6ZXJvX3N0YXRzKTsKLQlpZiAodW5saWtlbHkob2xkKSkgewotCQlyZXQgPSBjbXB4Y2hnKCZ6ZXJvX3N0YXRzLCBvbGQsIDApOwotCQkvKiBUaGlzIGVuc3VyZXMgb25seSBvbmUgZmVsbG93IHJlc2V0cyB0aGUgc3RhdCAqLwotCQlpZiAocmV0ID09IG9sZCkKLQkJCW1lbXNldCgmc3BpbmxvY2tfc3RhdHMsIDAsIHNpemVvZihzcGlubG9ja19zdGF0cykpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFkZF9zdGF0cyhlbnVtIGt2bV9jb250ZW50aW9uX3N0YXQgdmFyLCB1MzIgdmFsKQotewotCWNoZWNrX3plcm8oKTsKLQlzcGlubG9ja19zdGF0cy5jb250ZW50aW9uX3N0YXRzW3Zhcl0gKz0gdmFsOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdTY0IHNwaW5fdGltZV9zdGFydCh2b2lkKQotewotCXJldHVybiBzY2hlZF9jbG9jaygpOwotfQotCi1zdGF0aWMgdm9pZCBfX3NwaW5fdGltZV9hY2N1bSh1NjQgZGVsdGEsIHUzMiAqYXJyYXkpCi17Ci0JdW5zaWduZWQgaW5kZXg7Ci0KLQlpbmRleCA9IGlsb2cyKGRlbHRhKTsKLQljaGVja196ZXJvKCk7Ci0KLQlpZiAoaW5kZXggPCBISVNUT19CVUNLRVRTKQotCQlhcnJheVtpbmRleF0rKzsKLQllbHNlCi0JCWFycmF5W0hJU1RPX0JVQ0tFVFNdKys7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzcGluX3RpbWVfYWNjdW1fYmxvY2tlZCh1NjQgc3RhcnQpCi17Ci0JdTMyIGRlbHRhOwotCi0JZGVsdGEgPSBzY2hlZF9jbG9jaygpIC0gc3RhcnQ7Ci0JX19zcGluX3RpbWVfYWNjdW0oZGVsdGEsIHNwaW5sb2NrX3N0YXRzLmhpc3RvX3NwaW5fYmxvY2tlZCk7Ci0Jc3BpbmxvY2tfc3RhdHMudGltZV9ibG9ja2VkICs9IGRlbHRhOwotfQotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqZF9zcGluX2RlYnVnOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKmRfa3ZtX2RlYnVnOwotCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqa3ZtX2luaXRfZGVidWdmcyh2b2lkKQotewotCWRfa3ZtX2RlYnVnID0gZGVidWdmc19jcmVhdGVfZGlyKCJrdm0tZ3Vlc3QiLCBOVUxMKTsKLQlpZiAoIWRfa3ZtX2RlYnVnKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZCBub3QgY3JlYXRlICdrdm0nIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKLQotCXJldHVybiBkX2t2bV9kZWJ1ZzsKLX0KLQotc3RhdGljIGludCBfX2luaXQga3ZtX3NwaW5sb2NrX2RlYnVnZnModm9pZCkKLXsKLQlzdHJ1Y3QgZGVudHJ5ICpkX2t2bTsKLQotCWRfa3ZtID0ga3ZtX2luaXRfZGVidWdmcygpOwotCWlmIChkX2t2bSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRfc3Bpbl9kZWJ1ZyA9IGRlYnVnZnNfY3JlYXRlX2Rpcigic3BpbmxvY2tzIiwgZF9rdm0pOwotCi0JZGVidWdmc19jcmVhdGVfdTgoInplcm9fc3RhdHMiLCAwNjQ0LCBkX3NwaW5fZGVidWcsICZ6ZXJvX3N0YXRzKTsKLQotCWRlYnVnZnNfY3JlYXRlX3UzMigidGFrZW5fc2xvdyIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKLQkJICAgJnNwaW5sb2NrX3N0YXRzLmNvbnRlbnRpb25fc3RhdHNbVEFLRU5fU0xPV10pOwotCWRlYnVnZnNfY3JlYXRlX3UzMigidGFrZW5fc2xvd19waWNrdXAiLCAwNDQ0LCBkX3NwaW5fZGVidWcsCi0JCSAgICZzcGlubG9ja19zdGF0cy5jb250ZW50aW9uX3N0YXRzW1RBS0VOX1NMT1dfUElDS1VQXSk7Ci0KLQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInJlbGVhc2VkX3Nsb3ciLCAwNDQ0LCBkX3NwaW5fZGVidWcsCi0JCSAgICZzcGlubG9ja19zdGF0cy5jb250ZW50aW9uX3N0YXRzW1JFTEVBU0VEX1NMT1ddKTsKLQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInJlbGVhc2VkX3Nsb3dfa2lja2VkIiwgMDQ0NCwgZF9zcGluX2RlYnVnLAotCQkgICAmc3BpbmxvY2tfc3RhdHMuY29udGVudGlvbl9zdGF0c1tSRUxFQVNFRF9TTE9XX0tJQ0tFRF0pOwotCi0JZGVidWdmc19jcmVhdGVfdTY0KCJ0aW1lX2Jsb2NrZWQiLCAwNDQ0LCBkX3NwaW5fZGVidWcsCi0JCQkgICAmc3BpbmxvY2tfc3RhdHMudGltZV9ibG9ja2VkKTsKLQotCWRlYnVnZnNfY3JlYXRlX3UzMl9hcnJheSgiaGlzdG9fYmxvY2tlZCIsIDA0NDQsIGRfc3Bpbl9kZWJ1ZywKLQkJICAgICBzcGlubG9ja19zdGF0cy5oaXN0b19zcGluX2Jsb2NrZWQsIEhJU1RPX0JVQ0tFVFMgKyAxKTsKLQotCXJldHVybiAwOwotfQotZnNfaW5pdGNhbGwoa3ZtX3NwaW5sb2NrX2RlYnVnZnMpOwotI2Vsc2UgIC8qICFDT05GSUdfS1ZNX0RFQlVHX0ZTICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX3N0YXRzKGVudW0ga3ZtX2NvbnRlbnRpb25fc3RhdCB2YXIsIHUzMiB2YWwpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTY0IHNwaW5fdGltZV9zdGFydCh2b2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3Bpbl90aW1lX2FjY3VtX2Jsb2NrZWQodTY0IHN0YXJ0KQotewotfQotI2VuZGlmICAvKiBDT05GSUdfS1ZNX0RFQlVHX0ZTICovCi0KLXN0cnVjdCBrdm1fbG9ja193YWl0aW5nIHsKLQlzdHJ1Y3QgYXJjaF9zcGlubG9jayAqbG9jazsKLQlfX3RpY2tldF90IHdhbnQ7Ci19OwotCi0vKiBjcHVzICd3YWl0aW5nJyBvbiBhIHNwaW5sb2NrIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KLXN0YXRpYyBjcHVtYXNrX3Qgd2FpdGluZ19jcHVzOwotCi0vKiBUcmFjayBzcGlubG9jayBvbiB3aGljaCBhIGNwdSBpcyB3YWl0aW5nICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGt2bV9sb2NrX3dhaXRpbmcsIGtsb2NrX3dhaXRpbmcpOwotCi1fX3Zpc2libGUgdm9pZCBrdm1fbG9ja19zcGlubmluZyhzdHJ1Y3QgYXJjaF9zcGlubG9jayAqbG9jaywgX190aWNrZXRfdCB3YW50KQotewotCXN0cnVjdCBrdm1fbG9ja193YWl0aW5nICp3OwotCWludCBjcHU7Ci0JdTY0IHN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX190aWNrZXRfdCBoZWFkOwotCi0JaWYgKGluX25taSgpKQotCQlyZXR1cm47Ci0KLQl3ID0gdGhpc19jcHVfcHRyKCZrbG9ja193YWl0aW5nKTsKLQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0Jc3RhcnQgPSBzcGluX3RpbWVfc3RhcnQoKTsKLQotCS8qCi0JICogTWFrZSBzdXJlIGFuIGludGVycnVwdCBoYW5kbGVyIGNhbid0IHVwc2V0IHRoaW5ncyBpbiBhCi0JICogcGFydGlhbGx5IHNldHVwIHN0YXRlLgotCSAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCS8qCi0JICogVGhlIG9yZGVyaW5nIHByb3RvY29sIG9uIHRoaXMgaXMgdGhhdCB0aGUgImxvY2siIHBvaW50ZXIKLQkgKiBtYXkgb25seSBiZSBzZXQgbm9uLU5VTEwgaWYgdGhlICJ3YW50IiB0aWNrZXQgaXMgY29ycmVjdC4KLQkgKiBJZiB3ZSdyZSB1cGRhdGluZyAid2FudCIsIHdlIG11c3QgZmlyc3QgY2xlYXIgImxvY2siLgotCSAqLwotCXctPmxvY2sgPSBOVUxMOwotCXNtcF93bWIoKTsKLQl3LT53YW50ID0gd2FudDsKLQlzbXBfd21iKCk7Ci0Jdy0+bG9jayA9IGxvY2s7Ci0KLQlhZGRfc3RhdHMoVEFLRU5fU0xPVywgMSk7Ci0KLQkvKgotCSAqIFRoaXMgdXNlcyBzZXRfYml0LCB3aGljaCBpcyBhdG9taWMgYnV0IHdlIHNob3VsZCBub3QgcmVseSBvbiBpdHMKLQkgKiByZW9yZGVyaW5nIGd1cmFudGVlcy4gU28gYmFycmllciBpcyBuZWVkZWQgYWZ0ZXIgdGhpcyBjYWxsLgotCSAqLwotCWNwdW1hc2tfc2V0X2NwdShjcHUsICZ3YWl0aW5nX2NwdXMpOwotCi0JYmFycmllcigpOwotCi0JLyoKLQkgKiBNYXJrIGVudHJ5IHRvIHNsb3dwYXRoIGJlZm9yZSBkb2luZyB0aGUgcGlja3VwIHRlc3QgdG8gbWFrZQotCSAqIHN1cmUgd2UgZG9uJ3QgZGVhZGxvY2sgd2l0aCBhbiB1bmxvY2tlci4KLQkgKi8KLQlfX3RpY2tldF9lbnRlcl9zbG93cGF0aChsb2NrKTsKLQotCS8qIG1ha2Ugc3VyZSBlbnRlcl9zbG93cGF0aCwgd2hpY2ggaXMgYXRvbWljIGRvZXMgbm90IGNyb3NzIHRoZSByZWFkICovCi0Jc21wX21iX19hZnRlcl9hdG9taWMoKTsKLQotCS8qCi0JICogY2hlY2sgYWdhaW4gbWFrZSBzdXJlIGl0IGRpZG4ndCBiZWNvbWUgZnJlZSB3aGlsZQotCSAqIHdlIHdlcmVuJ3QgbG9va2luZy4KLQkgKi8KLQloZWFkID0gUkVBRF9PTkNFKGxvY2stPnRpY2tldHMuaGVhZCk7Ci0JaWYgKF9fdGlja2V0c19lcXVhbChoZWFkLCB3YW50KSkgewotCQlhZGRfc3RhdHMoVEFLRU5fU0xPV19QSUNLVVAsIDEpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKgotCSAqIGhhbHQgdW50aWwgaXQncyBvdXIgdHVybiBhbmQga2lja2VkLiBOb3RlIHRoYXQgd2UgZG8gc2FmZSBoYWx0Ci0JICogZm9yIGlycSBlbmFibGVkIGNhc2UgdG8gYXZvaWQgaGFuZyB3aGVuIGxvY2sgaW5mbyBpcyBvdmVyd3JpdHRlbgotCSAqIGluIGlycSBzcGlubG9jayBzbG93cGF0aCBhbmQgbm8gc3B1cmlvdXMgaW50ZXJydXB0IG9jY3VyIHRvIHNhdmUgdXMuCi0JICovCi0JaWYgKGFyY2hfaXJxc19kaXNhYmxlZF9mbGFncyhmbGFncykpCi0JCWhhbHQoKTsKLQllbHNlCi0JCXNhZmVfaGFsdCgpOwotCi1vdXQ6Ci0JY3B1bWFza19jbGVhcl9jcHUoY3B1LCAmd2FpdGluZ19jcHVzKTsKLQl3LT5sb2NrID0gTlVMTDsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0Jc3Bpbl90aW1lX2FjY3VtX2Jsb2NrZWQoc3RhcnQpOwotfQotUFZfQ0FMTEVFX1NBVkVfUkVHU19USFVOSyhrdm1fbG9ja19zcGlubmluZyk7Ci0KLS8qIEtpY2sgdmNwdSB3YWl0aW5nIG9uIEBsb2NrLT5oZWFkIHRvIHJlYWNoIHZhbHVlIEB0aWNrZXQgKi8KLXN0YXRpYyB2b2lkIGt2bV91bmxvY2tfa2ljayhzdHJ1Y3QgYXJjaF9zcGlubG9jayAqbG9jaywgX190aWNrZXRfdCB0aWNrZXQpCi17Ci0JaW50IGNwdTsKLQotCWFkZF9zdGF0cyhSRUxFQVNFRF9TTE9XLCAxKTsKLQlmb3JfZWFjaF9jcHUoY3B1LCAmd2FpdGluZ19jcHVzKSB7Ci0JCWNvbnN0IHN0cnVjdCBrdm1fbG9ja193YWl0aW5nICp3ID0gJnBlcl9jcHUoa2xvY2tfd2FpdGluZywgY3B1KTsKLQkJaWYgKFJFQURfT05DRSh3LT5sb2NrKSA9PSBsb2NrICYmCi0JCSAgICBSRUFEX09OQ0Uody0+d2FudCkgPT0gdGlja2V0KSB7Ci0JCQlhZGRfc3RhdHMoUkVMRUFTRURfU0xPV19LSUNLRUQsIDEpOwotCQkJa3ZtX2tpY2tfY3B1KGNwdSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotI2VuZGlmIC8qICFDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwotCiAvKgogICogU2V0dXAgcHZfbG9ja19vcHMgdG8gZXhwbG9pdCBLVk1fRkVBVFVSRV9QVl9VTkhBTFQgaWYgcHJlc2VudC4KICAqLwpAQCAtODU0LDE2ICs2MDMsMTEgQEAKIAlpZiAoIWt2bV9wYXJhX2hhc19mZWF0dXJlKEtWTV9GRUFUVVJFX1BWX1VOSEFMVCkpCiAJCXJldHVybjsKIAotI2lmZGVmIENPTkZJR19RVUVVRURfU1BJTkxPQ0tTCiAJX19wdl9pbml0X2xvY2tfaGFzaCgpOwogCXB2X2xvY2tfb3BzLnF1ZXVlZF9zcGluX2xvY2tfc2xvd3BhdGggPSBfX3B2X3F1ZXVlZF9zcGluX2xvY2tfc2xvd3BhdGg7CiAJcHZfbG9ja19vcHMucXVldWVkX3NwaW5fdW5sb2NrID0gUFZfQ0FMTEVFX1NBVkUoX19wdl9xdWV1ZWRfc3Bpbl91bmxvY2spOwogCXB2X2xvY2tfb3BzLndhaXQgPSBrdm1fd2FpdDsKIAlwdl9sb2NrX29wcy5raWNrID0ga3ZtX2tpY2tfY3B1OwotI2Vsc2UgLyogIUNPTkZJR19RVUVVRURfU1BJTkxPQ0tTICovCi0JcHZfbG9ja19vcHMubG9ja19zcGlubmluZyA9IFBWX0NBTExFRV9TQVZFKGt2bV9sb2NrX3NwaW5uaW5nKTsKLQlwdl9sb2NrX29wcy51bmxvY2tfa2ljayA9IGt2bV91bmxvY2tfa2ljazsKLSNlbmRpZgogfQogCiBzdGF0aWMgX19pbml0IGludCBrdm1fc3BpbmxvY2tfaW5pdF9qdW1wKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva3ZtY2xvY2suYyBiL2FyY2gveDg2L2tlcm5lbC9rdm1jbG9jay5jCmluZGV4IDFkMzliZmIuLjYwYjk5NDkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rdm1jbG9jay5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rdm1jbG9jay5jCkBAIC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSA8YXNtL3g4Nl9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgogCi1zdGF0aWMgaW50IGt2bWNsb2NrID0gMTsKK3N0YXRpYyBpbnQga3ZtY2xvY2sgX19yb19hZnRlcl9pbml0ID0gMTsKIHN0YXRpYyBpbnQgbXNyX2t2bV9zeXN0ZW1fdGltZSA9IE1TUl9LVk1fU1lTVEVNX1RJTUU7CiBzdGF0aWMgaW50IG1zcl9rdm1fd2FsbF9jbG9jayA9IE1TUl9LVk1fV0FMTF9DTE9DSzsKIHN0YXRpYyBjeWNsZV90IGt2bV9zY2hlZF9jbG9ja19vZmZzZXQ7CkBAIC0yODksNiArMjg5LDcgQEAKIAlwdXRfY3B1KCk7CiAKIAl4ODZfcGxhdGZvcm0uY2FsaWJyYXRlX3RzYyA9IGt2bV9nZXRfdHNjX2toejsKKwl4ODZfcGxhdGZvcm0uY2FsaWJyYXRlX2NwdSA9IGt2bV9nZXRfdHNjX2toejsKIAl4ODZfcGxhdGZvcm0uZ2V0X3dhbGxjbG9jayA9IGt2bV9nZXRfd2FsbGNsb2NrOwogCXg4Nl9wbGF0Zm9ybS5zZXRfd2FsbGNsb2NrID0ga3ZtX3NldF93YWxsY2xvY2s7CiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbGl2ZXBhdGNoLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbGl2ZXBhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkMjUyZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC9saXZlcGF0Y2guYwpAQCAtMCwwICsxLDY1IEBACisvKgorICogbGl2ZXBhdGNoLmMgLSB4ODYtc3BlY2lmaWMgS2VybmVsIExpdmUgUGF0Y2hpbmcgQ29yZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXZlcGF0Y2guaD4KKyNpbmNsdWRlIDxhc20vdGV4dC1wYXRjaGluZy5oPgorCisvKiBBcHBseSBwZXItb2JqZWN0IGFsdGVybmF0aXZlcy4gQmFzZWQgb24geDg2IG1vZHVsZV9maW5hbGl6ZSgpICovCit2b2lkIGFyY2hfa2xwX2luaXRfb2JqZWN0X2xvYWRlZChzdHJ1Y3Qga2xwX3BhdGNoICpwYXRjaCwKKwkJCQkgc3RydWN0IGtscF9vYmplY3QgKm9iaikKK3sKKwlpbnQgY250OworCXN0cnVjdCBrbHBfbW9kaW5mbyAqaW5mbzsKKwlFbGZfU2hkciAqcywgKmFsdCA9IE5VTEwsICpwYXJhID0gTlVMTDsKKwl2b2lkICphc2VnLCAqcHNlZzsKKwljb25zdCBjaGFyICpvYmpuYW1lOworCWNoYXIgc2VjX29iam5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwljaGFyIHNlY25hbWVbS1NZTV9OQU1FX0xFTl07CisKKwlpbmZvID0gcGF0Y2gtPm1vZC0+a2xwX2luZm87CisJb2JqbmFtZSA9IG9iai0+bmFtZSA/IG9iai0+bmFtZSA6ICJ2bWxpbnV4IjsKKworCS8qIFNlZSBsaXZlcGF0Y2ggY29yZSBjb2RlIGZvciBCVUlMRF9CVUdfT04oKSBleHBsYW5hdGlvbiAqLworCUJVSUxEX0JVR19PTihNT0RVTEVfTkFNRV9MRU4gPCA1NiB8fCBLU1lNX05BTUVfTEVOICE9IDEyOCk7CisKKwlmb3IgKHMgPSBpbmZvLT5zZWNoZHJzOyBzIDwgaW5mby0+c2VjaGRycyArIGluZm8tPmhkci5lX3NobnVtOyBzKyspIHsKKwkJLyogQXBwbHkgcGVyLW9iamVjdCAua2xwLmFyY2ggc2VjdGlvbnMgKi8KKwkJY250ID0gc3NjYW5mKGluZm8tPnNlY3N0cmluZ3MgKyBzLT5zaF9uYW1lLAorCQkJICAgICAiLmtscC5hcmNoLiU1NVteLl0uJTEyN3MiLAorCQkJICAgICBzZWNfb2JqbmFtZSwgc2VjbmFtZSk7CisJCWlmIChjbnQgIT0gMikKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RyY21wKHNlY19vYmpuYW1lLCBvYmpuYW1lKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXN0cmNtcCgiLmFsdGluc3RydWN0aW9ucyIsIHNlY25hbWUpKQorCQkJYWx0ID0gczsKKwkJaWYgKCFzdHJjbXAoIi5wYXJhaW5zdHJ1Y3Rpb25zIiwgc2VjbmFtZSkpCisJCQlwYXJhID0gczsKKwl9CisKKwlpZiAoYWx0KSB7CisJCWFzZWcgPSAodm9pZCAqKSBhbHQtPnNoX2FkZHI7CisJCWFwcGx5X2FsdGVybmF0aXZlcyhhc2VnLCBhc2VnICsgYWx0LT5zaF9zaXplKTsKKwl9CisKKwlpZiAocGFyYSkgeworCQlwc2VnID0gKHZvaWQgKikgcGFyYS0+c2hfYWRkcjsKKwkJYXBwbHlfcGFyYXZpcnQocHNlZywgcHNlZyArIHBhcmEtPnNoX3NpemUpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jCmluZGV4IDA2OGM0YTkuLjBmOGQyMDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21wcGFyc2UuYwpAQCAtNDk5LDYgKzQ5OSw5IEBACiB7CiAJc3RydWN0IG1wZl9pbnRlbCAqbXBmID0gbXBmX2ZvdW5kOwogCisJaWYgKCFzbXBfZm91bmRfY29uZmlnKQorCQlyZXR1cm47CisKIAlpZiAoIW1wZikKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQtc3BpbmxvY2tzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQtc3BpbmxvY2tzLmMKaW5kZXggMTkzOWEwMi4uMmM1NWEwMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LXNwaW5sb2Nrcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC1zcGlubG9ja3MuYwpAQCAtOCw3ICs4LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgogCi0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKIF9fdmlzaWJsZSB2b2lkIF9fbmF0aXZlX3F1ZXVlZF9zcGluX3VubG9jayhzdHJ1Y3QgcXNwaW5sb2NrICpsb2NrKQogewogCW5hdGl2ZV9xdWV1ZWRfc3Bpbl91bmxvY2sobG9jayk7CkBAIC0yMSwxOSArMjAsMTMgQEAKIAlyZXR1cm4gcHZfbG9ja19vcHMucXVldWVkX3NwaW5fdW5sb2NrLmZ1bmMgPT0KIAkJX19yYXdfY2FsbGVlX3NhdmVfX19uYXRpdmVfcXVldWVkX3NwaW5fdW5sb2NrOwogfQotI2VuZGlmCiAKIHN0cnVjdCBwdl9sb2NrX29wcyBwdl9sb2NrX29wcyA9IHsKICNpZmRlZiBDT05GSUdfU01QCi0jaWZkZWYgQ09ORklHX1FVRVVFRF9TUElOTE9DS1MKIAkucXVldWVkX3NwaW5fbG9ja19zbG93cGF0aCA9IG5hdGl2ZV9xdWV1ZWRfc3Bpbl9sb2NrX3Nsb3dwYXRoLAogCS5xdWV1ZWRfc3Bpbl91bmxvY2sgPSBQVl9DQUxMRUVfU0FWRShfX25hdGl2ZV9xdWV1ZWRfc3Bpbl91bmxvY2spLAogCS53YWl0ID0gcGFyYXZpcnRfbm9wLAogCS5raWNrID0gcGFyYXZpcnRfbm9wLAotI2Vsc2UgLyogIUNPTkZJR19RVUVVRURfU1BJTkxPQ0tTICovCi0JLmxvY2tfc3Bpbm5pbmcgPSBfX1BWX0lTX0NBTExFRV9TQVZFKHBhcmF2aXJ0X25vcCksCi0JLnVubG9ja19raWNrID0gcGFyYXZpcnRfbm9wLAotI2VuZGlmIC8qICFDT05GSUdfUVVFVUVEX1NQSU5MT0NLUyAqLwogI2VuZGlmIC8qIFNNUCAqLwogfTsKIEVYUE9SVF9TWU1CT0wocHZfbG9ja19vcHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYwppbmRleCBhZDViYzk1Li5iYmYzZDU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYwpAQCAtNTYsMTIgKzU2LDEyIEBACiAgICAgICIucG9wc2VjdGlvbiIpOwogCiAvKiBpZGVudGl0eSBmdW5jdGlvbiwgd2hpY2ggY2FuIGJlIGlubGluZWQgKi8KLXUzMiBfcGFyYXZpcnRfaWRlbnRfMzIodTMyIHgpCit1MzIgbm90cmFjZSBfcGFyYXZpcnRfaWRlbnRfMzIodTMyIHgpCiB7CiAJcmV0dXJuIHg7CiB9CiAKLXU2NCBfcGFyYXZpcnRfaWRlbnRfNjQodTY0IHgpCit1NjQgbm90cmFjZSBfcGFyYXZpcnRfaWRlbnRfNjQodTY0IHgpCiB7CiAJcmV0dXJuIHg7CiB9CkBAIC0zMzIsNyArMzMyLDYgQEAKIAkucmVhZF9jcjAgPSBuYXRpdmVfcmVhZF9jcjAsCiAJLndyaXRlX2NyMCA9IG5hdGl2ZV93cml0ZV9jcjAsCiAJLnJlYWRfY3I0ID0gbmF0aXZlX3JlYWRfY3I0LAotCS5yZWFkX2NyNF9zYWZlID0gbmF0aXZlX3JlYWRfY3I0X3NhZmUsCiAJLndyaXRlX2NyNCA9IG5hdGl2ZV93cml0ZV9jcjQsCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCS5yZWFkX2NyOCA9IG5hdGl2ZV9yZWFkX2NyOCwKQEAgLTM4OSw3ICszODgsNyBAQAogI2RlZmluZSBQVEVfSURFTlQJX19QVl9JU19DQUxMRUVfU0FWRShfcGFyYXZpcnRfaWRlbnRfNjQpCiAjZW5kaWYKIAotc3RydWN0IHB2X21tdV9vcHMgcHZfbW11X29wcyA9IHsKK3N0cnVjdCBwdl9tbXVfb3BzIHB2X21tdV9vcHMgX19yb19hZnRlcl9pbml0ID0gewogCiAJLnJlYWRfY3IyID0gbmF0aXZlX3JlYWRfY3IyLAogCS53cml0ZV9jcjIgPSBuYXRpdmVfd3JpdGVfY3IyLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0X3BhdGNoXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfMzIuYwppbmRleCAxNThkYzA2Li45MjBjNmFlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfMzIuYwpAQCAtMTAsNyArMTAsNyBAQAogREVGX05BVElWRShwdl9tbXVfb3BzLCByZWFkX2NyMywgIm1vdiAlY3IzLCAlZWF4Iik7CiBERUZfTkFUSVZFKHB2X2NwdV9vcHMsIGNsdHMsICJjbHRzIik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpICYmIGRlZmluZWQoQ09ORklHX1FVRVVFRF9TUElOTE9DS1MpCisjaWYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKQogREVGX05BVElWRShwdl9sb2NrX29wcywgcXVldWVkX3NwaW5fdW5sb2NrLCAibW92YiAkMCwgKCVlYXgpIik7CiAjZW5kaWYKIApAQCAtNDksNyArNDksNyBAQAogCQlQQVRDSF9TSVRFKHB2X21tdV9vcHMsIHJlYWRfY3IzKTsKIAkJUEFUQ0hfU0lURShwdl9tbXVfb3BzLCB3cml0ZV9jcjMpOwogCQlQQVRDSF9TSVRFKHB2X2NwdV9vcHMsIGNsdHMpOwotI2lmIGRlZmluZWQoQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUykgJiYgZGVmaW5lZChDT05GSUdfUVVFVUVEX1NQSU5MT0NLUykKKyNpZiBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpCiAJCWNhc2UgUEFSQVZJUlRfUEFUQ0gocHZfbG9ja19vcHMucXVldWVkX3NwaW5fdW5sb2NrKToKIAkJCWlmIChwdl9pc19uYXRpdmVfc3Bpbl91bmxvY2soKSkgewogCQkJCXN0YXJ0ID0gc3RhcnRfcHZfbG9ja19vcHNfcXVldWVkX3NwaW5fdW5sb2NrOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0X3BhdGNoXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfNjQuYwppbmRleCBlNzAwODdhLi5iYjM4NDBjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnRfcGF0Y2hfNjQuYwpAQCAtMTksNyArMTksNyBAQAogREVGX05BVElWRSgsIG1vdjMyLCAibW92ICVlZGksICVlYXgiKTsKIERFRl9OQVRJVkUoLCBtb3Y2NCwgIm1vdiAlcmRpLCAlcmF4Iik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpICYmIGRlZmluZWQoQ09ORklHX1FVRVVFRF9TUElOTE9DS1MpCisjaWYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKQogREVGX05BVElWRShwdl9sb2NrX29wcywgcXVldWVkX3NwaW5fdW5sb2NrLCAibW92YiAkMCwgKCVyZGkpIik7CiAjZW5kaWYKIApAQCAtNjEsNyArNjEsNyBAQAogCQlQQVRDSF9TSVRFKHB2X2NwdV9vcHMsIGNsdHMpOwogCQlQQVRDSF9TSVRFKHB2X21tdV9vcHMsIGZsdXNoX3RsYl9zaW5nbGUpOwogCQlQQVRDSF9TSVRFKHB2X2NwdV9vcHMsIHdiaW52ZCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfUEFSQVZJUlRfU1BJTkxPQ0tTKSAmJiBkZWZpbmVkKENPTkZJR19RVUVVRURfU1BJTkxPQ0tTKQorI2lmIGRlZmluZWQoQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUykKIAkJY2FzZSBQQVJBVklSVF9QQVRDSChwdl9sb2NrX29wcy5xdWV1ZWRfc3Bpbl91bmxvY2spOgogCQkJaWYgKHB2X2lzX25hdGl2ZV9zcGluX3VubG9jaygpKSB7CiAJCQkJc3RhcnQgPSBzdGFydF9wdl9sb2NrX29wc19xdWV1ZWRfc3Bpbl91bmxvY2s7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCA2MmMwYjBlLi40MDAyYjQ3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vbWNlLmg+CiAjaW5jbHVkZSA8YXNtL3ZtODYuaD4KKyNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CiAKIC8qCiAgKiBwZXItQ1BVIFRTUyBzZWdtZW50cy4gVGhyZWFkcyBhcmUgY29tcGxldGVseSAnc29mdCcgb24gTGludXgsCkBAIC01MTMsNiArNTE0LDE3IEBACiB9CiAKIC8qCisgKiBSZXR1cm4gc2F2ZWQgUEMgb2YgYSBibG9ja2VkIHRocmVhZC4KKyAqIFdoYXQgaXMgdGhpcyBnb29kIGZvcj8gaXQgd2lsbCBiZSBhbHdheXMgdGhlIHNjaGVkdWxlciBvciByZXRfZnJvbV9mb3JrLgorICovCit1bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlzdHJ1Y3QgaW5hY3RpdmVfdGFza19mcmFtZSAqZnJhbWUgPQorCQkoc3RydWN0IGluYWN0aXZlX3Rhc2tfZnJhbWUgKikgUkVBRF9PTkNFKHRzay0+dGhyZWFkLnNwKTsKKwlyZXR1cm4gUkVBRF9PTkNFX05PQ0hFQ0soZnJhbWUtPnJldF9hZGRyKTsKK30KKworLyoKICAqIENhbGxlZCBmcm9tIGZzL3Byb2Mgd2l0aCBhIHJlZmVyZW5jZSBvbiBAcCB0byBmaW5kIHRoZSBmdW5jdGlvbgogICogd2hpY2ggY2FsbGVkIGludG8gc2NoZWR1bGUoKS4gVGhpcyBuZWVkcyB0byBiZSBkb25lIGNhcmVmdWxseQogICogYmVjYXVzZSB0aGUgdGFzayBtaWdodCB3YWtlIHVwIGFuZCB3ZSBtaWdodCBsb29rIGF0IGEgc3RhY2sKQEAgLTUyMCwxNSArNTMyLDE4IEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBib3R0b20sIHRvcCwgc3AsIGZwLCBpcDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBib3R0b20sIHRvcCwgc3AsIGZwLCBpcCwgcmV0ID0gMDsKIAlpbnQgY291bnQgPSAwOwogCiAJaWYgKCFwIHx8IHAgPT0gY3VycmVudCB8fCBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCiAJCXJldHVybiAwOwogCisJaWYgKCF0cnlfZ2V0X3Rhc2tfc3RhY2socCkpCisJCXJldHVybiAwOworCiAJc3RhcnQgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UocCk7CiAJaWYgKCFzdGFydCkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJLyoKIAkgKiBMYXlvdXQgb2YgdGhlIHN0YWNrIHBhZ2U6CkBAIC01MzcsOSArNTUyLDcgQEAKIAkgKiBQQURESU5HCiAJICogLS0tLS0tLS0tLS0gdG9wID0gdG9wbWF4IC0gVE9QX09GX0tFUk5FTF9TVEFDS19QQURESU5HCiAJICogc3RhY2sKLQkgKiAtLS0tLS0tLS0tLSBib3R0b20gPSBzdGFydCArIHNpemVvZih0aHJlYWRfaW5mbykKLQkgKiB0aHJlYWRfaW5mbwotCSAqIC0tLS0tLS0tLS0tIHN0YXJ0CisJICogLS0tLS0tLS0tLS0gYm90dG9tID0gc3RhcnQKIAkgKgogCSAqIFRoZSB0YXNrcyBzdGFjayBwb2ludGVyIHBvaW50cyBhdCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlCiAJICogZnJhbWVwb2ludGVyIGlzIHN0b3JlZC4gVGhlIGRhdGEgb24gdGhlIHN0YWNrIGlzOgpAQCAtNTUwLDIwICs1NjMsMjUgQEAKIAkgKi8KIAl0b3AgPSBzdGFydCArIFRIUkVBRF9TSVpFIC0gVE9QX09GX0tFUk5FTF9TVEFDS19QQURESU5HOwogCXRvcCAtPSAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotCWJvdHRvbSA9IHN0YXJ0ICsgc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbyk7CisJYm90dG9tID0gc3RhcnQ7CiAKIAlzcCA9IFJFQURfT05DRShwLT50aHJlYWQuc3ApOwogCWlmIChzcCA8IGJvdHRvbSB8fCBzcCA+IHRvcCkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCi0JZnAgPSBSRUFEX09OQ0VfTk9DSEVDSygqKHVuc2lnbmVkIGxvbmcgKilzcCk7CisJZnAgPSBSRUFEX09OQ0VfTk9DSEVDSygoKHN0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lICopc3ApLT5icCk7CiAJZG8gewogCQlpZiAoZnAgPCBib3R0b20gfHwgZnAgPiB0b3ApCi0JCQlyZXR1cm4gMDsKKwkJCWdvdG8gb3V0OwogCQlpcCA9IFJFQURfT05DRV9OT0NIRUNLKCoodW5zaWduZWQgbG9uZyAqKShmcCArIHNpemVvZih1bnNpZ25lZCBsb25nKSkpOwotCQlpZiAoIWluX3NjaGVkX2Z1bmN0aW9ucyhpcCkpCi0JCQlyZXR1cm4gaXA7CisJCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKGlwKSkgeworCQkJcmV0ID0gaXA7CisJCQlnb3RvIG91dDsKKwkJfQogCQlmcCA9IFJFQURfT05DRV9OT0NIRUNLKCoodW5zaWduZWQgbG9uZyAqKWZwKTsKIAl9IHdoaWxlIChjb3VudCsrIDwgMTYgJiYgcC0+c3RhdGUgIT0gVEFTS19SVU5OSU5HKTsKLQlyZXR1cm4gMDsKKworb3V0OgorCXB1dF90YXNrX3N0YWNrKHApOworCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwppbmRleCBkODZiZTI5Li5iZDdiZThlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTU1LDE3ICs1NSw2IEBACiAjaW5jbHVkZSA8YXNtL3N3aXRjaF90by5oPgogI2luY2x1ZGUgPGFzbS92bTg2Lmg+CiAKLWFzbWxpbmthZ2Ugdm9pZCByZXRfZnJvbV9mb3JrKHZvaWQpIF9fYXNtX18oInJldF9mcm9tX2ZvcmsiKTsKLWFzbWxpbmthZ2Ugdm9pZCByZXRfZnJvbV9rZXJuZWxfdGhyZWFkKHZvaWQpIF9fYXNtX18oInJldF9mcm9tX2tlcm5lbF90aHJlYWQiKTsKLQotLyoKLSAqIFJldHVybiBzYXZlZCBQQyBvZiBhIGJsb2NrZWQgdGhyZWFkLgotICovCi11bnNpZ25lZCBsb25nIHRocmVhZF9zYXZlZF9wYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nICopdHNrLT50aHJlYWQuc3ApWzNdOwotfQotCiB2b2lkIF9fc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgYWxsKQogewogCXVuc2lnbmVkIGxvbmcgY3IwID0gMEwsIGNyMiA9IDBMLCBjcjMgPSAwTCwgY3I0ID0gMEw7CkBAIC0xMDEsNyArOTAsNyBAQAogCWNyMCA9IHJlYWRfY3IwKCk7CiAJY3IyID0gcmVhZF9jcjIoKTsKIAljcjMgPSByZWFkX2NyMygpOwotCWNyNCA9IF9fcmVhZF9jcjRfc2FmZSgpOworCWNyNCA9IF9fcmVhZF9jcjQoKTsKIAlwcmludGsoS0VSTl9ERUZBVUxUICJDUjA6ICUwOGx4IENSMjogJTA4bHggQ1IzOiAlMDhseCBDUjQ6ICUwOGx4XG4iLAogCQkJY3IwLCBjcjIsIGNyMywgY3I0KTsKIApAQCAtMTMzLDM1ICsxMjIsMzEgQEAKIAl1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBsb25nIHRscykKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRyZWdzID0gdGFza19wdF9yZWdzKHApOworCXN0cnVjdCBmb3JrX2ZyYW1lICpmb3JrX2ZyYW1lID0gY29udGFpbmVyX29mKGNoaWxkcmVncywgc3RydWN0IGZvcmtfZnJhbWUsIHJlZ3MpOworCXN0cnVjdCBpbmFjdGl2ZV90YXNrX2ZyYW1lICpmcmFtZSA9ICZmb3JrX2ZyYW1lLT5mcmFtZTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAlpbnQgZXJyOwogCi0JcC0+dGhyZWFkLnNwID0gKHVuc2lnbmVkIGxvbmcpIGNoaWxkcmVnczsKKwlmcmFtZS0+YnAgPSAwOworCWZyYW1lLT5yZXRfYWRkciA9ICh1bnNpZ25lZCBsb25nKSByZXRfZnJvbV9mb3JrOworCXAtPnRocmVhZC5zcCA9ICh1bnNpZ25lZCBsb25nKSBmb3JrX2ZyYW1lOwogCXAtPnRocmVhZC5zcDAgPSAodW5zaWduZWQgbG9uZykgKGNoaWxkcmVncysxKTsKIAltZW1zZXQocC0+dGhyZWFkLnB0cmFjZV9icHMsIDAsIHNpemVvZihwLT50aHJlYWQucHRyYWNlX2JwcykpOwogCiAJaWYgKHVubGlrZWx5KHAtPmZsYWdzICYgUEZfS1RIUkVBRCkpIHsKIAkJLyoga2VybmVsIHRocmVhZCAqLwogCQltZW1zZXQoY2hpbGRyZWdzLCAwLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKLQkJcC0+dGhyZWFkLmlwID0gKHVuc2lnbmVkIGxvbmcpIHJldF9mcm9tX2tlcm5lbF90aHJlYWQ7Ci0JCXRhc2tfdXNlcl9ncyhwKSA9IF9fS0VSTkVMX1NUQUNLX0NBTkFSWTsKLQkJY2hpbGRyZWdzLT5kcyA9IF9fVVNFUl9EUzsKLQkJY2hpbGRyZWdzLT5lcyA9IF9fVVNFUl9EUzsKLQkJY2hpbGRyZWdzLT5mcyA9IF9fS0VSTkVMX1BFUkNQVTsKLQkJY2hpbGRyZWdzLT5ieCA9IHNwOwkvKiBmdW5jdGlvbiAqLwotCQljaGlsZHJlZ3MtPmJwID0gYXJnOwotCQljaGlsZHJlZ3MtPm9yaWdfYXggPSAtMTsKLQkJY2hpbGRyZWdzLT5jcyA9IF9fS0VSTkVMX0NTIHwgZ2V0X2tlcm5lbF9ycGwoKTsKLQkJY2hpbGRyZWdzLT5mbGFncyA9IFg4Nl9FRkxBR1NfSUYgfCBYODZfRUZMQUdTX0ZJWEVEOworCQlmcmFtZS0+YnggPSBzcDsJCS8qIGZ1bmN0aW9uICovCisJCWZyYW1lLT5kaSA9IGFyZzsKIAkJcC0+dGhyZWFkLmlvX2JpdG1hcF9wdHIgPSBOVUxMOwogCQlyZXR1cm4gMDsKIAl9CisJZnJhbWUtPmJ4ID0gMDsKIAkqY2hpbGRyZWdzID0gKmN1cnJlbnRfcHRfcmVncygpOwogCWNoaWxkcmVncy0+YXggPSAwOwogCWlmIChzcCkKIAkJY2hpbGRyZWdzLT5zcCA9IHNwOwogCi0JcC0+dGhyZWFkLmlwID0gKHVuc2lnbmVkIGxvbmcpIHJldF9mcm9tX2Zvcms7CiAJdGFza191c2VyX2dzKHApID0gZ2V0X3VzZXJfZ3MoY3VycmVudF9wdF9yZWdzKCkpOwogCiAJcC0+dGhyZWFkLmlvX2JpdG1hcF9wdHIgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKaW5kZXggNjMyMzZkOC4uZWU5NDRiZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCkBAIC00OSw4ICs0OSw3IEBACiAjaW5jbHVkZSA8YXNtL2RlYnVncmVnLmg+CiAjaW5jbHVkZSA8YXNtL3N3aXRjaF90by5oPgogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgotCi1hc21saW5rYWdlIGV4dGVybiB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCk7CisjaW5jbHVkZSA8YXNtL3Zkc28uaD4KIAogX192aXNpYmxlIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIHJzcF9zY3JhdGNoKTsKIApAQCAtMTQxLDEyICsxNDAsMTcgQEAKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBwdF9yZWdzICpjaGlsZHJlZ3M7CisJc3RydWN0IGZvcmtfZnJhbWUgKmZvcmtfZnJhbWU7CisJc3RydWN0IGluYWN0aXZlX3Rhc2tfZnJhbWUgKmZyYW1lOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqbWUgPSBjdXJyZW50OwogCiAJcC0+dGhyZWFkLnNwMCA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFOwogCWNoaWxkcmVncyA9IHRhc2tfcHRfcmVncyhwKTsKLQlwLT50aHJlYWQuc3AgPSAodW5zaWduZWQgbG9uZykgY2hpbGRyZWdzOwotCXNldF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX0ZPUkspOworCWZvcmtfZnJhbWUgPSBjb250YWluZXJfb2YoY2hpbGRyZWdzLCBzdHJ1Y3QgZm9ya19mcmFtZSwgcmVncyk7CisJZnJhbWUgPSAmZm9ya19mcmFtZS0+ZnJhbWU7CisJZnJhbWUtPmJwID0gMDsKKwlmcmFtZS0+cmV0X2FkZHIgPSAodW5zaWduZWQgbG9uZykgcmV0X2Zyb21fZm9yazsKKwlwLT50aHJlYWQuc3AgPSAodW5zaWduZWQgbG9uZykgZm9ya19mcmFtZTsKIAlwLT50aHJlYWQuaW9fYml0bWFwX3B0ciA9IE5VTEw7CiAKIAlzYXZlc2VnbWVudChncywgcC0+dGhyZWFkLmdzaW5kZXgpOwpAQCAtMTYwLDE1ICsxNjQsMTEgQEAKIAlpZiAodW5saWtlbHkocC0+ZmxhZ3MgJiBQRl9LVEhSRUFEKSkgewogCQkvKiBrZXJuZWwgdGhyZWFkICovCiAJCW1lbXNldChjaGlsZHJlZ3MsIDAsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwotCQljaGlsZHJlZ3MtPnNwID0gKHVuc2lnbmVkIGxvbmcpY2hpbGRyZWdzOwotCQljaGlsZHJlZ3MtPnNzID0gX19LRVJORUxfRFM7Ci0JCWNoaWxkcmVncy0+YnggPSBzcDsgLyogZnVuY3Rpb24gKi8KLQkJY2hpbGRyZWdzLT5icCA9IGFyZzsKLQkJY2hpbGRyZWdzLT5vcmlnX2F4ID0gLTE7Ci0JCWNoaWxkcmVncy0+Y3MgPSBfX0tFUk5FTF9DUyB8IGdldF9rZXJuZWxfcnBsKCk7Ci0JCWNoaWxkcmVncy0+ZmxhZ3MgPSBYODZfRUZMQUdTX0lGIHwgWDg2X0VGTEFHU19GSVhFRDsKKwkJZnJhbWUtPmJ4ID0gc3A7CQkvKiBmdW5jdGlvbiAqLworCQlmcmFtZS0+cjEyID0gYXJnOwogCQlyZXR1cm4gMDsKIAl9CisJZnJhbWUtPmJ4ID0gMDsKIAkqY2hpbGRyZWdzID0gKmN1cnJlbnRfcHRfcmVncygpOwogCiAJY2hpbGRyZWdzLT5heCA9IDA7CkBAIC01MTEsNyArNTExLDcgQEAKIAkJY3VycmVudC0+cGVyc29uYWxpdHkgJj0gflJFQURfSU1QTElFU19FWEVDOwogCQkvKiBpbl9jb21wYXRfc3lzY2FsbCgpIHVzZXMgdGhlIHByZXNlbmNlIG9mIHRoZSB4MzIKIAkJICAgc3lzY2FsbCBiaXQgZmxhZyB0byBkZXRlcm1pbmUgY29tcGF0IHN0YXR1cyAqLwotCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyAmPSB+VFNfQ09NUEFUOworCQljdXJyZW50LT50aHJlYWQuc3RhdHVzICY9IH5UU19DT01QQVQ7CiAJfSBlbHNlIHsKIAkJc2V0X3RocmVhZF9mbGFnKFRJRl9JQTMyKTsKIAkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1gzMik7CkBAIC01MTksMTEgKzUxOSwyNCBAQAogCQkJY3VycmVudC0+bW0tPmNvbnRleHQuaWEzMl9jb21wYXQgPSBUSUZfSUEzMjsKIAkJY3VycmVudC0+cGVyc29uYWxpdHkgfD0gZm9yY2VfcGVyc29uYWxpdHkzMjsKIAkJLyogUHJlcGFyZSB0aGUgZmlyc3QgInJldHVybiIgdG8gdXNlciBzcGFjZSAqLwotCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnN0YXR1cyB8PSBUU19DT01QQVQ7CisJCWN1cnJlbnQtPnRocmVhZC5zdGF0dXMgfD0gVFNfQ09NUEFUOwogCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNldF9wZXJzb25hbGl0eV9pYTMyKTsKIAorI2lmZGVmIENPTkZJR19DSEVDS1BPSU5UX1JFU1RPUkUKK3N0YXRpYyBsb25nIHByY3RsX21hcF92ZHNvKGNvbnN0IHN0cnVjdCB2ZHNvX2ltYWdlICppbWFnZSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCWludCByZXQ7CisKKwlyZXQgPSBtYXBfdmRzb19vbmNlKGltYWdlLCBhZGRyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIChsb25nKWltYWdlLT5zaXplOworfQorI2VuZGlmCisKIGxvbmcgZG9fYXJjaF9wcmN0bChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjb2RlLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJaW50IHJldCA9IDA7CkBAIC01NzcsNiArNTkwLDE5IEBACiAJCWJyZWFrOwogCX0KIAorI2lmZGVmIENPTkZJR19DSEVDS1BPSU5UX1JFU1RPUkUKKyMgaWZkZWYgQ09ORklHX1g4Nl9YMzJfQUJJCisJY2FzZSBBUkNIX01BUF9WRFNPX1gzMjoKKwkJcmV0dXJuIHByY3RsX21hcF92ZHNvKCZ2ZHNvX2ltYWdlX3gzMiwgYWRkcik7CisjIGVuZGlmCisjIGlmIGRlZmluZWQgQ09ORklHX1g4Nl8zMiB8fCBkZWZpbmVkIENPTkZJR19JQTMyX0VNVUxBVElPTgorCWNhc2UgQVJDSF9NQVBfVkRTT18zMjoKKwkJcmV0dXJuIHByY3RsX21hcF92ZHNvKCZ2ZHNvX2ltYWdlXzMyLCBhZGRyKTsKKyMgZW5kaWYKKwljYXNlIEFSQ0hfTUFQX1ZEU09fNjQ6CisJCXJldHVybiBwcmN0bF9tYXBfdmRzbygmdmRzb19pbWFnZV82NCwgYWRkcik7CisjZW5kaWYKKwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCmluZGV4IGY3OTU3NmEuLjBlNjNjMDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTE3Myw4ICsxNzMsOCBAQAogCQlyZXR1cm4gc3A7CiAKIAlwcmV2X2VzcCA9ICh1MzIgKikoY29udGV4dCk7Ci0JaWYgKHByZXZfZXNwKQotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcHJldl9lc3A7CisJaWYgKCpwcmV2X2VzcCkKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSpwcmV2X2VzcDsKIAogCXJldHVybiAodW5zaWduZWQgbG9uZylyZWdzOwogfQpAQCAtOTM0LDcgKzkzNCw3IEBACiAJCSAqLwogCQlyZWdzLT5vcmlnX2F4ID0gdmFsdWU7CiAJCWlmIChzeXNjYWxsX2dldF9ucihjaGlsZCwgcmVncykgPj0gMCkKLQkJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5zdGF0dXMgfD0gVFNfSTM4Nl9SRUdTX1BPS0VEOworCQkJY2hpbGQtPnRocmVhZC5zdGF0dXMgfD0gVFNfSTM4Nl9SRUdTX1BPS0VEOwogCQlicmVhazsKIAogCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IHVzZXIzMiwgcmVncy5lZmxhZ3MpOgpAQCAtMTI1MCw3ICsxMjUwLDcgQEAKIAogI2lmZGVmIENPTkZJR19YODZfNjQKIAotc3RhdGljIHN0cnVjdCB1c2VyX3JlZ3NldCB4ODZfNjRfcmVnc2V0c1tdIF9fcmVhZF9tb3N0bHkgPSB7CitzdGF0aWMgc3RydWN0IHVzZXJfcmVnc2V0IHg4Nl82NF9yZWdzZXRzW10gX19yb19hZnRlcl9pbml0ID0gewogCVtSRUdTRVRfR0VORVJBTF0gPSB7CiAJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSU1RBVFVTLAogCQkubiA9IHNpemVvZihzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdCkgLyBzaXplb2YobG9uZyksCkBAIC0xMjkxLDcgKzEyOTEsNyBAQAogI2VuZGlmCS8qIENPTkZJR19YODZfNjQgKi8KIAogI2lmIGRlZmluZWQgQ09ORklHX1g4Nl8zMiB8fCBkZWZpbmVkIENPTkZJR19JQTMyX0VNVUxBVElPTgotc3RhdGljIHN0cnVjdCB1c2VyX3JlZ3NldCB4ODZfMzJfcmVnc2V0c1tdIF9fcmVhZF9tb3N0bHkgPSB7CitzdGF0aWMgc3RydWN0IHVzZXJfcmVnc2V0IHg4Nl8zMl9yZWdzZXRzW10gX19yb19hZnRlcl9pbml0ID0gewogCVtSRUdTRVRfR0VORVJBTF0gPSB7CiAJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1BSU1RBVFVTLAogCQkubiA9IHNpemVvZihzdHJ1Y3QgdXNlcl9yZWdzX3N0cnVjdDMyKSAvIHNpemVvZih1MzIpLApAQCAtMTM0NCw3ICsxMzQ0LDcgQEAKICAqLwogdTY0IHhzdGF0ZV9meF9zd19ieXRlc1tVU0VSX1hTVEFURV9GWF9TV19XT1JEU107CiAKLXZvaWQgdXBkYXRlX3JlZ3NldF94c3RhdGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSwgdTY0IHhzdGF0ZV9tYXNrKQordm9pZCBfX2luaXQgdXBkYXRlX3JlZ3NldF94c3RhdGVfaW5mbyh1bnNpZ25lZCBpbnQgc2l6ZSwgdTY0IHhzdGF0ZV9tYXNrKQogewogI2lmZGVmIENPTkZJR19YODZfNjQKIAl4ODZfNjRfcmVnc2V0c1tSRUdTRVRfWFNUQVRFXS5uID0gc2l6ZSAvIHNpemVvZih1NjQpOwpAQCAtMTM1OCw3ICsxMzU4LDcgQEAKIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldF92aWV3ICp0YXNrX3VzZXJfcmVnc2V0X3ZpZXcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgotCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfSUEzMikpCisJaWYgKCF1c2VyXzY0Yml0X21vZGUodGFza19wdF9yZWdzKHRhc2spKSkKICNlbmRpZgogI2lmIGRlZmluZWQgQ09ORklHX1g4Nl8zMiB8fCBkZWZpbmVkIENPTkZJR19JQTMyX0VNVUxBVElPTgogCQlyZXR1cm4gJnVzZXJfeDg2XzMyX3ZpZXc7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHZjbG9jay5jIGIvYXJjaC94ODYva2VybmVsL3B2Y2xvY2suYwppbmRleCAzNTk5NDA0Li41YjJjYzg4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHZjbG9jay5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wdmNsb2NrLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogCWRvIHsKIAkJdmVyc2lvbiA9IHB2Y2xvY2tfcmVhZF9iZWdpbihzcmMpOwotCQlyZXQgPSBfX3B2Y2xvY2tfcmVhZF9jeWNsZXMoc3JjKTsKKwkJcmV0ID0gX19wdmNsb2NrX3JlYWRfY3ljbGVzKHNyYywgcmR0c2Nfb3JkZXJlZCgpKTsKIAkJZmxhZ3MgPSBzcmMtPmZsYWdzOwogCX0gd2hpbGUgKHB2Y2xvY2tfcmVhZF9yZXRyeShzcmMsIHZlcnNpb24pKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jIGIvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jCmluZGV4IGNjNDU3ZmYuLjUxNDAyYTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMKQEAgLTYyNiwzICs2MjYsMzQgQEAKIAkJCWFtZF9kaXNhYmxlX3NlcV9hbmRfcmVkaXJlY3Rfc2NydWIpOwogCiAjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgJiYgZGVmaW5lZChDT05GSUdfWDg2X01DRSkKKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CisjaW5jbHVkZSA8YXNtL3N0cmluZ182NC5oPgorCisvKiBJdnkgQnJpZGdlLCBIYXN3ZWxsLCBCcm9hZHdlbGwgKi8KK3N0YXRpYyB2b2lkIHF1aXJrX2ludGVsX2JyaWNrbGFuZF94ZW9uX3Jhc19jYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTMyIGNhcGlkMDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDg0LCAmY2FwaWQwKTsKKworCWlmIChjYXBpZDAgJiAweDEwKQorCQlzdGF0aWNfYnJhbmNoX2luYygmbWNzYWZlX2tleSk7Cit9CisKKy8qIFNreWxha2UgKi8KK3N0YXRpYyB2b2lkIHF1aXJrX2ludGVsX3B1cmxleV94ZW9uX3Jhc19jYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJdTMyIGNhcGlkMDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDg0LCAmY2FwaWQwKTsKKworCWlmICgoY2FwaWQwICYgMHhjMCkgPT0gMHhjMCkKKwkJc3RhdGljX2JyYW5jaF9pbmMoJm1jc2FmZV9rZXkpOworfQorREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgwZWMzLCBxdWlya19pbnRlbF9icmlja2xhbmRfeGVvbl9yYXNfY2FwKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MmZjMCwgcXVpcmtfaW50ZWxfYnJpY2tsYW5kX3hlb25fcmFzX2NhcCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDZmYzAsIHF1aXJrX2ludGVsX2JyaWNrbGFuZF94ZW9uX3Jhc19jYXApOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDgzLCBxdWlya19pbnRlbF9wdXJsZXlfeGVvbl9yYXNfY2FwKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCmluZGV4IDYzYmYyN2QuLmUyNDRjMTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKQEAgLTcwNSw3ICs3MDUsNyBAQAogCXRib290X3NodXRkb3duKFRCX1NIVVRET1dOX0hBTFQpOwogfQogCi1zdHJ1Y3QgbWFjaGluZV9vcHMgbWFjaGluZV9vcHMgPSB7CitzdHJ1Y3QgbWFjaGluZV9vcHMgbWFjaGluZV9vcHMgX19yb19hZnRlcl9pbml0ID0gewogCS5wb3dlcl9vZmYgPSBuYXRpdmVfbWFjaGluZV9wb3dlcl9vZmYsCiAJLnNodXRkb3duID0gbmF0aXZlX21hY2hpbmVfc2h1dGRvd24sCiAJLmVtZXJnZW5jeV9yZXN0YXJ0ID0gbmF0aXZlX21hY2hpbmVfZW1lcmdlbmN5X3Jlc3RhcnQsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVzb3VyY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9yZXNvdXJjZS5jCmluZGV4IDgwZWFiMDEuLjI0MDhjMTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZXNvdXJjZS5jCkBAIC0yNyw4ICsyNyw4IEBACiAJaW50IGk7CiAJc3RydWN0IGU4MjBlbnRyeSAqZW50cnk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQllbnRyeSA9ICZlODIwLm1hcFtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKKwkJZW50cnkgPSAmZTgyMC0+bWFwW2ldOwogCiAJCXJlc291cmNlX2NsaXAoYXZhaWwsIGVudHJ5LT5hZGRyLAogCQkJICAgICAgZW50cnktPmFkZHIgKyBlbnRyeS0+c2l6ZSAtIDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NldHVwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYwppbmRleCAwZmE2MGY1Li5iYmZiY2E1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYwpAQCAtMjEwLDkgKzIxMCw5IEBACiAKIAogI2lmICFkZWZpbmVkKENPTkZJR19YODZfUEFFKSB8fCBkZWZpbmVkKENPTkZJR19YODZfNjQpCi1fX3Zpc2libGUgdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzOworX192aXNpYmxlIHVuc2lnbmVkIGxvbmcgbW11X2NyNF9mZWF0dXJlcyBfX3JvX2FmdGVyX2luaXQ7CiAjZWxzZQotX192aXNpYmxlIHVuc2lnbmVkIGxvbmcgbW11X2NyNF9mZWF0dXJlcyA9IFg4Nl9DUjRfUEFFOworX192aXNpYmxlIHVuc2lnbmVkIGxvbmcgbW11X2NyNF9mZWF0dXJlcyBfX3JvX2FmdGVyX2luaXQgPSBYODZfQ1I0X1BBRTsKICNlbmRpZgogCiAvKiBCb290IGxvYWRlciBJRCBhbmQgdmVyc2lvbiBhcyBpbnRlZ2VycywgZm9yIHRoZSBiZW5lZml0IG9mIHByb2NfZG9pbnR2ZWMgKi8KQEAgLTQ1OCw4ICs0NTgsOCBAQAogCQllYXJseV9tZW11bm1hcChkYXRhLCBzaXplb2YoKmRhdGEpKTsKIAl9CiAKLQlzYW5pdGl6ZV9lODIwX21hcChlODIwLm1hcCwgQVJSQVlfU0laRShlODIwLm1hcCksICZlODIwLm5yX21hcCk7Ci0JbWVtY3B5KCZlODIwX3NhdmVkLCAmZTgyMCwgc2l6ZW9mKHN0cnVjdCBlODIwbWFwKSk7CisJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC0+bWFwLCBBUlJBWV9TSVpFKGU4MjAtPm1hcCksICZlODIwLT5ucl9tYXApOworCW1lbWNweShlODIwX3NhdmVkLCBlODIwLCBzaXplb2Yoc3RydWN0IGU4MjBtYXApKTsKIAlwcmludGsoS0VSTl9JTkZPICJleHRlbmRlZCBwaHlzaWNhbCBSQU0gbWFwOlxuIik7CiAJZTgyMF9wcmludF9tYXAoInJlc2VydmUgc2V0dXBfZGF0YSIpOwogfQpAQCAtNzYzLDcgKzc2Myw3IEBACiAJICovCiAJZTgyMF9yZW1vdmVfcmFuZ2UoQklPU19CRUdJTiwgQklPU19FTkQgLSBCSU9TX0JFR0lOLCBFODIwX1JBTSwgMSk7CiAKLQlzYW5pdGl6ZV9lODIwX21hcChlODIwLm1hcCwgQVJSQVlfU0laRShlODIwLm1hcCksICZlODIwLm5yX21hcCk7CisJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC0+bWFwLCBBUlJBWV9TSVpFKGU4MjAtPm1hcCksICZlODIwLT5ucl9tYXApOwogfQogCiAvKiBjYWxsZWQgYmVmb3JlIHRyaW1fYmlvc19yYW5nZSgpIHRvIHNwYXJlIGV4dHJhIHNhbml0aXplICovCkBAIC0xMDMyLDcgKzEwMzIsNyBAQAogCWlmIChwcHJvX3dpdGhfcmFtX2J1ZygpKSB7CiAJCWU4MjBfdXBkYXRlX3JhbmdlKDB4NzAwMDAwMDBVTEwsIDB4NDAwMDBVTEwsIEU4MjBfUkFNLAogCQkJCSAgRTgyMF9SRVNFUlZFRCk7Ci0JCXNhbml0aXplX2U4MjBfbWFwKGU4MjAubWFwLCBBUlJBWV9TSVpFKGU4MjAubWFwKSwgJmU4MjAubnJfbWFwKTsKKwkJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC0+bWFwLCBBUlJBWV9TSVpFKGU4MjAtPm1hcCksICZlODIwLT5ucl9tYXApOwogCQlwcmludGsoS0VSTl9JTkZPICJmaXhlZCBwaHlzaWNhbCBSQU0gbWFwOlxuIik7CiAJCWU4MjBfcHJpbnRfbWFwKCJiYWRfcHBybyIpOwogCX0KQEAgLTEwOTYsMTkgKzEwOTYsMTkgQEAKIAltZW1ibG9ja19zZXRfY3VycmVudF9saW1pdChJU0FfRU5EX0FERFJFU1MpOwogCW1lbWJsb2NrX3g4Nl9maWxsKCk7CiAKLQlpZiAoZWZpX2VuYWJsZWQoRUZJX0JPT1QpKSB7Ci0JCWVmaV9mYWtlX21lbW1hcCgpOwotCQllZmlfZmluZF9taXJyb3IoKTsKLQl9Ci0KIAlyZXNlcnZlX2Jpb3NfcmVnaW9ucygpOwogCi0JLyoKLQkgKiBUaGUgRUZJIHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IGJvb3Qgc2VydmljZSBjb2RlIHdvbid0IGJlIGNhbGxlZAotCSAqIGFmdGVyIEV4aXRCb290U2VydmljZXMoKS4gVGhpcyBpcywgaW4gZmFjdCwgYSBsaWUuCi0JICovCi0JaWYgKGVmaV9lbmFibGVkKEVGSV9NRU1NQVApKQorCWlmIChlZmlfZW5hYmxlZChFRklfTUVNTUFQKSkgeworCQllZmlfZmFrZV9tZW1tYXAoKTsKKwkJZWZpX2ZpbmRfbWlycm9yKCk7CisJCWVmaV9lc3J0X2luaXQoKTsKKworCQkvKgorCQkgKiBUaGUgRUZJIHNwZWNpZmljYXRpb24gc2F5cyB0aGF0IGJvb3Qgc2VydmljZSBjb2RlIHdvbid0IGJlCisJCSAqIGNhbGxlZCBhZnRlciBFeGl0Qm9vdFNlcnZpY2VzKCkuIFRoaXMgaXMsIGluIGZhY3QsIGEgbGllLgorCQkgKi8KIAkJZWZpX3Jlc2VydmVfYm9vdF9zZXJ2aWNlcygpOworCX0KIAogCS8qIHByZWFsbG9jYXRlIDRrIGZvciBtcHRhYmxlIG1wYyAqLwogCWVhcmx5X3Jlc2VydmVfZTgyMF9tcGNfbmV3KCk7CkBAIC0xMTM3LDkgKzExMzcsNyBAQAogCSAqIGF1ZGl0aW5nIGFsbCB0aGUgZWFybHktYm9vdCBDUjQgbWFuaXB1bGF0aW9uIHdvdWxkIGJlIG5lZWRlZCB0bwogCSAqIHJ1bGUgaXQgb3V0LgogCSAqLwotCWlmIChib290X2NwdV9kYXRhLmNwdWlkX2xldmVsID49IDApCi0JCS8qIEEgQ1BVIGhhcyAlY3I0IGlmIGFuZCBvbmx5IGlmIGl0IGhhcyBDUFVJRC4gKi8KLQkJbW11X2NyNF9mZWF0dXJlcyA9IF9fcmVhZF9jcjQoKTsKKwltbXVfY3I0X2ZlYXR1cmVzID0gX19yZWFkX2NyNCgpOwogCiAJbWVtYmxvY2tfc2V0X2N1cnJlbnRfbGltaXQoZ2V0X21heF9tYXBwZWQoKSk7CiAKQEAgLTEyMjEsOCArMTIxOSw3IEBACiAJLyoKIAkgKiBnZXQgYm9vdC10aW1lIFNNUCBjb25maWd1cmF0aW9uOgogCSAqLwotCWlmIChzbXBfZm91bmRfY29uZmlnKQotCQlnZXRfc21wX2NvbmZpZygpOworCWdldF9zbXBfY29uZmlnKCk7CiAKIAlwcmVmaWxsX3Bvc3NpYmxlX21hcCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXBfcGVyY3B1LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXBfcGVyY3B1LmMKaW5kZXggN2E0MGUwNi4uMmJiZDI3ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NldHVwX3BlcmNwdS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYwpAQCAtMzMsNyArMzMsNyBAQAogREVGSU5FX1BFUl9DUFVfUkVBRF9NT1NUTFkodW5zaWduZWQgbG9uZywgdGhpc19jcHVfb2ZmKSA9IEJPT1RfUEVSQ1BVX09GRlNFVDsKIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTCh0aGlzX2NwdV9vZmYpOwogCi11bnNpZ25lZCBsb25nIF9fcGVyX2NwdV9vZmZzZXRbTlJfQ1BVU10gX19yZWFkX21vc3RseSA9IHsKK3Vuc2lnbmVkIGxvbmcgX19wZXJfY3B1X29mZnNldFtOUl9DUFVTXSBfX3JvX2FmdGVyX2luaXQgPSB7CiAJWzAgLi4uIE5SX0NQVVMtMV0gPSBCT09UX1BFUkNQVV9PRkZTRVQsCiB9OwogRVhQT1JUX1NZTUJPTChfX3Blcl9jcHVfb2Zmc2V0KTsKQEAgLTI0Niw3ICsyNDYsNyBAQAogI2lmZGVmIENPTkZJR19YODZfNjQKIAkJcGVyX2NwdShpcnFfc3RhY2tfcHRyLCBjcHUpID0KIAkJCXBlcl9jcHUoaXJxX3N0YWNrX3VuaW9uLmlycV9zdGFjaywgY3B1KSArCi0JCQlJUlFfU1RBQ0tfU0laRSAtIDY0OworCQkJSVJRX1NUQUNLX1NJWkU7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTlVNQQogCQlwZXJfY3B1KHg4Nl9jcHVfdG9fbm9kZV9tYXAsIGNwdSkgPQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NpZ25hbC5jIGIvYXJjaC94ODYva2VybmVsL3NpZ25hbC5jCmluZGV4IDA0Y2IzMjEuLjc2M2FmMWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KIAogI2luY2x1ZGUgPGFzbS9zaWdmcmFtZS5oPgorI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KIAogI2RlZmluZSBDT1BZKHgpCQkJZG8gewkJCVwKIAlnZXRfdXNlcl9leChyZWdzLT54LCAmc2MtPngpOwkJCVwKQEAgLTU0Nyw3ICs1NDgsNyBAQAogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChrc2lnLT5rYS5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pIHsKLQkJaWYgKGNvcHlfc2lnaW5mb190b191c2VyMzIoJmZyYW1lLT5pbmZvLCAma3NpZy0+aW5mbykpCisJCWlmIChfX2NvcHlfc2lnaW5mb190b191c2VyMzIoJmZyYW1lLT5pbmZvLCAma3NpZy0+aW5mbywgdHJ1ZSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKQEAgLTY2MCwyMCArNjYxLDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlzX2lhMzJfY29tcGF0X2ZyYW1lKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBpc19pYTMyX2NvbXBhdF9mcmFtZShzdHJ1Y3Qga3NpZ25hbCAqa3NpZykKIHsKIAlyZXR1cm4gSVNfRU5BQkxFRChDT05GSUdfSUEzMl9FTVVMQVRJT04pICYmCi0JICAgICAgIHRlc3RfdGhyZWFkX2ZsYWcoVElGX0lBMzIpOworCQlrc2lnLT5rYS5zYS5zYV9mbGFncyAmIFNBX0lBMzJfQUJJOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpc19pYTMyX2ZyYW1lKHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBpc19pYTMyX2ZyYW1lKHN0cnVjdCBrc2lnbmFsICprc2lnKQogewotCXJldHVybiBJU19FTkFCTEVEKENPTkZJR19YODZfMzIpIHx8IGlzX2lhMzJfY29tcGF0X2ZyYW1lKCk7CisJcmV0dXJuIElTX0VOQUJMRUQoQ09ORklHX1g4Nl8zMikgfHwgaXNfaWEzMl9jb21wYXRfZnJhbWUoa3NpZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlzX3gzMl9mcmFtZSh2b2lkKQorc3RhdGljIGlubGluZSBpbnQgaXNfeDMyX2ZyYW1lKHN0cnVjdCBrc2lnbmFsICprc2lnKQogewotCXJldHVybiBJU19FTkFCTEVEKENPTkZJR19YODZfWDMyX0FCSSkgJiYgdGVzdF90aHJlYWRfZmxhZyhUSUZfWDMyKTsKKwlyZXR1cm4gSVNfRU5BQkxFRChDT05GSUdfWDg2X1gzMl9BQkkpICYmCisJCWtzaWctPmthLnNhLnNhX2ZsYWdzICYgU0FfWDMyX0FCSTsKIH0KIAogc3RhdGljIGludApAQCAtNjg0LDEyICs2ODYsMTIgQEAKIAljb21wYXRfc2lnc2V0X3QgKmNzZXQgPSAoY29tcGF0X3NpZ3NldF90ICopIHNldDsKIAogCS8qIFNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KLQlpZiAoaXNfaWEzMl9mcmFtZSgpKSB7CisJaWYgKGlzX2lhMzJfZnJhbWUoa3NpZykpIHsKIAkJaWYgKGtzaWctPmthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykKIAkJCXJldHVybiBpYTMyX3NldHVwX3J0X2ZyYW1lKHVzaWcsIGtzaWcsIGNzZXQsIHJlZ3MpOwogCQllbHNlCiAJCQlyZXR1cm4gaWEzMl9zZXR1cF9mcmFtZSh1c2lnLCBrc2lnLCBjc2V0LCByZWdzKTsKLQl9IGVsc2UgaWYgKGlzX3gzMl9mcmFtZSgpKSB7CisJfSBlbHNlIGlmIChpc194MzJfZnJhbWUoa3NpZykpIHsKIAkJcmV0dXJuIHgzMl9zZXR1cF9ydF9mcmFtZShrc2lnLCBjc2V0LCByZWdzKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gX19zZXR1cF9ydF9mcmFtZShrc2lnLT5zaWcsIGtzaWcsIHNldCwgcmVncyk7CkBAIC03ODMsNyArNzg1LDcgQEAKIAkgKiB0aGFuIHRoZSB0cmFjZWUuCiAJICovCiAjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCi0JaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzICYgKFRTX0NPTVBBVHxUU19JMzg2X1JFR1NfUE9LRUQpKQorCWlmIChjdXJyZW50LT50aHJlYWQuc3RhdHVzICYgKFRTX0NPTVBBVHxUU19JMzg2X1JFR1NfUE9LRUQpKQogCQlyZXR1cm4gX19OUl9pYTMyX3Jlc3RhcnRfc3lzY2FsbDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19YODZfWDMyX0FCSQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NpZ25hbF9jb21wYXQuYyBiL2FyY2gveDg2L2tlcm5lbC9zaWduYWxfY29tcGF0LmMKaW5kZXggYjQ0NTY0Yi4uNDBkZjMzNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NpZ25hbF9jb21wYXQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsX2NvbXBhdC5jCkBAIC0xLDUgKzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KIAogLyoKICAqIFRoZSBjb21wYXRfc2lnaW5mb190IHN0cnVjdHVyZSBhbmQgaGFuZGluZyBjb2RlIGlzIHZlcnkgZWFzeQpAQCAtOTIsMTAgKzkzLDMxIEBACiAJLyogYW55IG5ldyBzaV9maWVsZHMgc2hvdWxkIGJlIGFkZGVkIGhlcmUgKi8KIH0KIAotaW50IGNvcHlfc2lnaW5mb190b191c2VyMzIoY29tcGF0X3NpZ2luZm9fdCBfX3VzZXIgKnRvLCBjb25zdCBzaWdpbmZvX3QgKmZyb20pCit2b2lkIHNpZ2FjdGlvbl9jb21wYXRfYWJpKHN0cnVjdCBrX3NpZ2FjdGlvbiAqYWN0LCBzdHJ1Y3Qga19zaWdhY3Rpb24gKm9hY3QpCit7CisJLyogRG9uJ3QgbGVhayBpbi1rZXJuZWwgbm9uLXVhcGkgZmxhZ3MgdG8gdXNlci1zcGFjZSAqLworCWlmIChvYWN0KQorCQlvYWN0LT5zYS5zYV9mbGFncyAmPSB+KFNBX0lBMzJfQUJJIHwgU0FfWDMyX0FCSSk7CisKKwlpZiAoIWFjdCkKKwkJcmV0dXJuOworCisJLyogRG9uJ3QgbGV0IGZsYWdzIHRvIGJlIHNldCBmcm9tIHVzZXJzcGFjZSAqLworCWFjdC0+c2Euc2FfZmxhZ3MgJj0gfihTQV9JQTMyX0FCSSB8IFNBX1gzMl9BQkkpOworCisJaWYgKHVzZXJfNjRiaXRfbW9kZShjdXJyZW50X3B0X3JlZ3MoKSkpCisJCXJldHVybjsKKworCWlmIChpbl9pYTMyX3N5c2NhbGwoKSkKKwkJYWN0LT5zYS5zYV9mbGFncyB8PSBTQV9JQTMyX0FCSTsKKwlpZiAoaW5feDMyX3N5c2NhbGwoKSkKKwkJYWN0LT5zYS5zYV9mbGFncyB8PSBTQV9YMzJfQUJJOworfQorCitpbnQgX19jb3B5X3NpZ2luZm9fdG9fdXNlcjMyKGNvbXBhdF9zaWdpbmZvX3QgX191c2VyICp0bywgY29uc3Qgc2lnaW5mb190ICpmcm9tLAorCQlib29sIHgzMl9BQkkpCiB7CiAJaW50IGVyciA9IDA7Ci0JYm9vbCBpYTMyID0gdGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMik7CiAKIAlzaWduYWxfY29tcGF0X2J1aWxkX3Rlc3RzKCk7CiAKQEAgLTE0Niw3ICsxNjgsNyBAQAogCQkJCXB1dF91c2VyX2V4KGZyb20tPnNpX2FyY2gsICZ0by0+c2lfYXJjaCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIF9fU0lfQ0hMRCA+PiAxNjoKLQkJCQlpZiAoaWEzMikgeworCQkJCWlmICgheDMyX0FCSSkgewogCQkJCQlwdXRfdXNlcl9leChmcm9tLT5zaV91dGltZSwgJnRvLT5zaV91dGltZSk7CiAJCQkJCXB1dF91c2VyX2V4KGZyb20tPnNpX3N0aW1lLCAmdG8tPnNpX3N0aW1lKTsKIAkJCQl9IGVsc2UgewpAQCAtMTgwLDYgKzIwMiwxMiBAQAogCXJldHVybiBlcnI7CiB9CiAKKy8qIGZyb20gc3lzY2FsbCdzIHBhdGgsIHdoZXJlIHdlIGtub3cgdGhlIEFCSSAqLworaW50IGNvcHlfc2lnaW5mb190b191c2VyMzIoY29tcGF0X3NpZ2luZm9fdCBfX3VzZXIgKnRvLCBjb25zdCBzaWdpbmZvX3QgKmZyb20pCit7CisJcmV0dXJuIF9fY29weV9zaWdpbmZvX3RvX3VzZXIzMih0bywgZnJvbSwgaW5feDMyX3N5c2NhbGwoKSk7Cit9CisKIGludCBjb3B5X3NpZ2luZm9fZnJvbV91c2VyMzIoc2lnaW5mb190ICp0bywgY29tcGF0X3NpZ2luZm9fdCBfX3VzZXIgKmZyb20pCiB7CiAJaW50IGVyciA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwppbmRleCA0Mjk2YmViLi40MmE5MzYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKQEAgLTQ3MSw3ICs0NzEsNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIHN0cnVjdCBzY2hlZF9kb21haW5fdG9wb2xvZ3lfbGV2ZWwgbnVtYV9pbnNpZGVfcGFja2FnZV90b3BvbG9neVtdID0geworc3RhdGljIHN0cnVjdCBzY2hlZF9kb21haW5fdG9wb2xvZ3lfbGV2ZWwgeDg2X251bWFfaW5fcGFja2FnZV90b3BvbG9neVtdID0gewogI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKIAl7IGNwdV9zbXRfbWFzaywgY3B1X3NtdF9mbGFncywgU0RfSU5JVF9OQU1FKFNNVCkgfSwKICNlbmRpZgpAQCAtNDgwLDIyICs0ODAsMjMgQEAKICNlbmRpZgogCXsgTlVMTCwgfSwKIH07CisKK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsIHg4Nl90b3BvbG9neVtdID0geworI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKKwl7IGNwdV9zbXRfbWFzaywgY3B1X3NtdF9mbGFncywgU0RfSU5JVF9OQU1FKFNNVCkgfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRF9NQworCXsgY3B1X2NvcmVncm91cF9tYXNrLCBjcHVfY29yZV9mbGFncywgU0RfSU5JVF9OQU1FKE1DKSB9LAorI2VuZGlmCisJeyBjcHVfY3B1X21hc2ssIFNEX0lOSVRfTkFNRShESUUpIH0sCisJeyBOVUxMLCB9LAorfTsKKwogLyoKLSAqIHNldF9zY2hlZF90b3BvbG9neSgpIHNldHMgdGhlIHRvcG9sb2d5IGludGVybmFsIHRvIGEgQ1BVLiAgVGhlCi0gKiBOVU1BIHRvcG9sb2dpZXMgYXJlIGxheWVyZWQgb24gdG9wIG9mIGl0IHRvIGJ1aWxkIHRoZSBmdWxsCi0gKiBzeXN0ZW0gdG9wb2xvZ3kuCi0gKgotICogSWYgTlVNQSBub2RlcyBhcmUgb2JzZXJ2ZWQgdG8gb2NjdXIgd2l0aGluIGEgQ1BVIHBhY2thZ2UsIHRoaXMKLSAqIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQuICBJdCBmb3JjZXMgdGhlIHNjaGVkIGRvbWFpbiBjb2RlIHRvCi0gKiBvbmx5IHVzZSB0aGUgU01UIGxldmVsIGZvciB0aGUgQ1BVIHBvcnRpb24gb2YgdGhlIHRvcG9sb2d5LgotICogVGhpcyBlc3NlbnRpYWxseSBmYWxscyBiYWNrIHRvIHJlbHlpbmcgb24gTlVNQSBpbmZvcm1hdGlvbgotICogZnJvbSB0aGUgU1JBVCB0YWJsZSB0byBkZXNjcmliZSB0aGUgZW50aXJlIHN5c3RlbSB0b3BvbG9neQotICogKGV4Y2VwdCBmb3IgaHlwZXJ0aHJlYWRzKS4KKyAqIFNldCBpZiBhIHBhY2thZ2UvZGllIGhhcyBtdWx0aXBsZSBOVU1BIG5vZGVzIGluc2lkZS4KKyAqIEFNRCBNYWdueS1Db3VycyBhbmQgSW50ZWwgQ2x1c3Rlci1vbi1EaWUgaGF2ZSB0aGlzLgogICovCi1zdGF0aWMgdm9pZCBwcmltYXJpbHlfdXNlX251bWFfZm9yX3RvcG9sb2d5KHZvaWQpCi17Ci0Jc2V0X3NjaGVkX3RvcG9sb2d5KG51bWFfaW5zaWRlX3BhY2thZ2VfdG9wb2xvZ3kpOwotfQorc3RhdGljIGJvb2wgeDg2X2hhc19udW1hX2luX3BhY2thZ2U7CiAKIHZvaWQgc2V0X2NwdV9zaWJsaW5nX21hcChpbnQgY3B1KQogewpAQCAtNTU4LDcgKzU1OSw3IEBACiAJCQkJYy0+Ym9vdGVkX2NvcmVzID0gY3B1X2RhdGEoaSkuYm9vdGVkX2NvcmVzOwogCQl9CiAJCWlmIChtYXRjaF9kaWUoYywgbykgJiYgIXRvcG9sb2d5X3NhbWVfbm9kZShjLCBvKSkKLQkJCXByaW1hcmlseV91c2VfbnVtYV9mb3JfdG9wb2xvZ3koKTsKKwkJCXg4Nl9oYXNfbnVtYV9pbl9wYWNrYWdlID0gdHJ1ZTsKIAl9CiAKIAl0aHJlYWRzID0gY3B1bWFza193ZWlnaHQodG9wb2xvZ3lfc2libGluZ19jcHVtYXNrKGNwdSkpOwpAQCAtNjkwLDcgKzY5MSw3IEBACiAJICogR2l2ZSB0aGUgb3RoZXIgQ1BVIHNvbWUgdGltZSB0byBhY2NlcHQgdGhlIElQSS4KIAkgKi8KIAl1ZGVsYXkoMjAwKTsKLQlpZiAoQVBJQ19JTlRFR1JBVEVEKGFwaWNfdmVyc2lvbltib290X2NwdV9waHlzaWNhbF9hcGljaWRdKSkgeworCWlmIChBUElDX0lOVEVHUkFURUQoYm9vdF9jcHVfYXBpY192ZXJzaW9uKSkgewogCQltYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CiAJCWlmIChtYXhsdnQgPiAzKQkJCS8qIER1ZSB0byB0aGUgUGVudGl1bSBlcnJhdHVtIDNBUC4gICovCiAJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKQEAgLTcxNyw3ICs3MTgsNyBAQAogCS8qCiAJICogQmUgcGFyYW5vaWQgYWJvdXQgY2xlYXJpbmcgQVBJQyBlcnJvcnMuCiAJICovCi0JaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bcGh5c19hcGljaWRdKSkgeworCWlmIChBUElDX0lOVEVHUkFURUQoYm9vdF9jcHVfYXBpY192ZXJzaW9uKSkgewogCQlpZiAobWF4bHZ0ID4gMykJCS8qIER1ZSB0byB0aGUgUGVudGl1bSBlcnJhdHVtIDNBUC4gICovCiAJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAkJYXBpY19yZWFkKEFQSUNfRVNSKTsKQEAgLTc1Niw3ICs3NTcsNyBAQAogCSAqIERldGVybWluZSB0aGlzIGJhc2VkIG9uIHRoZSBBUElDIHZlcnNpb24uCiAJICogSWYgd2UgZG9uJ3QgaGF2ZSBhbiBpbnRlZ3JhdGVkIEFQSUMsIGRvbid0IHNlbmQgdGhlIFNUQVJUVVAgSVBJcy4KIAkgKi8KLQlpZiAoQVBJQ19JTlRFR1JBVEVEKGFwaWNfdmVyc2lvbltwaHlzX2FwaWNpZF0pKQorCWlmIChBUElDX0lOVEVHUkFURUQoYm9vdF9jcHVfYXBpY192ZXJzaW9uKSkKIAkJbnVtX3N0YXJ0cyA9IDI7CiAJZWxzZQogCQludW1fc3RhcnRzID0gMDsKQEAgLTk0Miw3ICs5NDMsNiBAQAogCXBlcl9jcHUoY3B1X2N1cnJlbnRfdG9wX29mX3N0YWNrLCBjcHUpID0KIAkJKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKGlkbGUpICsgVEhSRUFEX1NJWkU7CiAjZWxzZQotCWNsZWFyX3Rza190aHJlYWRfZmxhZyhpZGxlLCBUSUZfRk9SSyk7CiAJaW5pdGlhbF9ncyA9IHBlcl9jcHVfb2Zmc2V0KGNwdSk7CiAjZW5kaWYKIH0KQEAgLTk2OSw3ICs5NjksNyBAQAogCiAJZWFybHlfZ2R0X2Rlc2NyLmFkZHJlc3MgPSAodW5zaWduZWQgbG9uZylnZXRfY3B1X2dkdF90YWJsZShjcHUpOwogCWluaXRpYWxfY29kZSA9ICh1bnNpZ25lZCBsb25nKXN0YXJ0X3NlY29uZGFyeTsKLQlzdGFja19zdGFydCAgPSBpZGxlLT50aHJlYWQuc3A7CisJaW5pdGlhbF9zdGFjayAgPSBpZGxlLT50aHJlYWQuc3A7CiAKIAkvKgogCSAqIEVuYWJsZSB0aGUgZXNwZml4IGhhY2sgZm9yIHRoaXMgQ1BVCkBAIC05OTQsNyArOTk0LDcgQEAKIAkJLyoKIAkJICogQmUgcGFyYW5vaWQgYWJvdXQgY2xlYXJpbmcgQVBJQyBlcnJvcnMuCiAJCSovCi0JCWlmIChBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pKSB7CisJCWlmIChBUElDX0lOVEVHUkFURUQoYm9vdF9jcHVfYXBpY192ZXJzaW9uKSkgewogCQkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CiAJCQlhcGljX3JlYWQoQVBJQ19FU1IpOwogCQl9CkBAIC0xMTE1LDE3ICsxMTE1LDggQEAKIAogCWNvbW1vbl9jcHVfdXAoY3B1LCB0aWRsZSk7CiAKLQkvKgotCSAqIFdlIGhhdmUgdG8gd2FsayB0aGUgaXJxIGRlc2NyaXB0b3JzIHRvIHNldHVwIHRoZSB2ZWN0b3IKLQkgKiBzcGFjZSBmb3IgdGhlIGNwdSB3aGljaCBjb21lcyBvbmxpbmUuICBQcmV2ZW50IGlycQotCSAqIGFsbG9jL2ZyZWUgYWNyb3NzIHRoZSBicmluZ3VwLgotCSAqLwotCWlycV9sb2NrX3NwYXJzZSgpOwotCiAJZXJyID0gZG9fYm9vdF9jcHUoYXBpY2lkLCBjcHUsIHRpZGxlKTsKLQogCWlmIChlcnIpIHsKLQkJaXJxX3VubG9ja19zcGFyc2UoKTsKIAkJcHJfZXJyKCJkb19ib290X2NwdSBmYWlsZWQoJWQpIHRvIHdha2V1cCBDUFUjJXVcbiIsIGVyciwgY3B1KTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTE0Myw4ICsxMTM0LDYgQEAKIAkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJfQogCi0JaXJxX3VubG9ja19zcGFyc2UoKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMjQ5LDcgKzEyMzgsNyBAQAogCS8qCiAJICogSWYgd2UgY291bGRuJ3QgZmluZCBhIGxvY2FsIEFQSUMsIHRoZW4gZ2V0IG91dCBvZiBoZXJlIG5vdyEKIAkgKi8KLQlpZiAoQVBJQ19JTlRFR1JBVEVEKGFwaWNfdmVyc2lvbltib290X2NwdV9waHlzaWNhbF9hcGljaWRdKSAmJgorCWlmIChBUElDX0lOVEVHUkFURUQoYm9vdF9jcHVfYXBpY192ZXJzaW9uKSAmJgogCSAgICAhYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FQSUMpKSB7CiAJCWlmICghZGlzYWJsZV9hcGljKSB7CiAJCQlwcl9lcnIoIkJJT1MgYnVnLCBsb2NhbCBBUElDICMlZCBub3QgZGV0ZWN0ZWQhLi4uXG4iLApAQCAtMTMwNCw2ICsxMjkzLDE2IEBACiAJCXphbGxvY19jcHVtYXNrX3ZhcigmcGVyX2NwdShjcHVfY29yZV9tYXAsIGkpLCBHRlBfS0VSTkVMKTsKIAkJemFsbG9jX2NwdW1hc2tfdmFyKCZwZXJfY3B1KGNwdV9sbGNfc2hhcmVkX21hcCwgaSksIEdGUF9LRVJORUwpOwogCX0KKworCS8qCisJICogU2V0ICdkZWZhdWx0JyB4ODYgdG9wb2xvZ3ksIHRoaXMgbWF0Y2hlcyBkZWZhdWx0X3RvcG9sb2d5KCkgaW4gdGhhdAorCSAqIGl0IGhhcyBOVU1BIG5vZGVzIGFzIGEgdG9wb2xvZ3kgbGV2ZWwuIFNlZSBhbHNvCisJICogbmF0aXZlX3NtcF9jcHVzX2RvbmUoKS4KKwkgKgorCSAqIE11c3QgYmUgZG9uZSBiZWZvcmUgc2V0X2NwdXNfc2libGluZ19tYXAoKSBpcyByYW4uCisJICovCisJc2V0X3NjaGVkX3RvcG9sb2d5KHg4Nl90b3BvbG9neSk7CisKIAlzZXRfY3B1X3NpYmxpbmdfbWFwKDApOwogCiAJc3dpdGNoIChzbXBfc2FuaXR5X2NoZWNrKG1heF9jcHVzKSkgewpAQCAtMTMyMywxNCArMTMyMiwxMyBAQAogCQlicmVhazsKIAl9CiAKLQlkZWZhdWx0X3NldHVwX2FwaWNfcm91dGluZygpOwotCiAJaWYgKHJlYWRfYXBpY19pZCgpICE9IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCkgewogCQlwYW5pYygiQm9vdCBBUElDIElEIGluIGxvY2FsIEFQSUMgdW5leHBlY3RlZCAoJWQgdnMgJWQpIiwKIAkJICAgICByZWFkX2FwaWNfaWQoKSwgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKIAkJLyogT3IgY2FuIHdlIHN3aXRjaCBiYWNrIHRvIFBJQyBoZXJlPyAqLwogCX0KIAorCWRlZmF1bHRfc2V0dXBfYXBpY19yb3V0aW5nKCk7CiAJY3B1MF9sb2dpY2FsX2FwaWNpZCA9IGFwaWNfYnNwX3NldHVwKGZhbHNlKTsKIAogCXByX2luZm8oIkNQVSVkOiAiLCAwKTsKQEAgLTEzNzAsNiArMTM2OCw5IEBACiB7CiAJcHJfZGVidWcoIkJvb3QgZG9uZVxuIik7CiAKKwlpZiAoeDg2X2hhc19udW1hX2luX3BhY2thZ2UpCisJCXNldF9zY2hlZF90b3BvbG9neSh4ODZfbnVtYV9pbl9wYWNrYWdlX3RvcG9sb2d5KTsKKwogCW5taV9zZWxmdGVzdCgpOwogCWltcHJlc3NfZnJpZW5kcygpOwogCXNldHVwX2lvYXBpY19kZXN0KCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc3RhY2t0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYwppbmRleCA0NzM4ZjVlLi4wNjUzNzg4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc3RhY2t0cmFjZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zdGFja3RyYWNlLmMKQEAgLTgsODAgKzgsNjkgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdW53aW5kLmg+CiAKLXN0YXRpYyBpbnQgc2F2ZV9zdGFja19zdGFjayh2b2lkICpkYXRhLCBjaGFyICpuYW1lKQorc3RhdGljIGludCBzYXZlX3N0YWNrX2FkZHJlc3Moc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJICAgICAgYm9vbCBub3NjaGVkKQogewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1fX3NhdmVfc3RhY2tfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGJvb2wgcmVsaWFibGUsIGJvb2wgbm9zY2hlZCkKLXsKLQlzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlID0gZGF0YTsKLSNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgotCWlmICghcmVsaWFibGUpCi0JCXJldHVybiAwOwotI2VuZGlmCiAJaWYgKG5vc2NoZWQgJiYgaW5fc2NoZWRfZnVuY3Rpb25zKGFkZHIpKQogCQlyZXR1cm4gMDsKKwogCWlmICh0cmFjZS0+c2tpcCA+IDApIHsKIAkJdHJhY2UtPnNraXAtLTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmICh0cmFjZS0+bnJfZW50cmllcyA8IHRyYWNlLT5tYXhfZW50cmllcykgewotCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IGFkZHI7Ci0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtMTsgLyogbm8gbW9yZSByb29tLCBzdG9wIHdhbGtpbmcgdGhlIHN0YWNrICovCisKKwlpZiAodHJhY2UtPm5yX2VudHJpZXMgPj0gdHJhY2UtPm1heF9lbnRyaWVzKQorCQlyZXR1cm4gLTE7CisKKwl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IGFkZHI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fc2F2ZV9zdGFja190cmFjZShzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlLAorCQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkgICAgICAgYm9vbCBub3NjaGVkKQoreworCXN0cnVjdCB1bndpbmRfc3RhdGUgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKHJlZ3MpCisJCXNhdmVfc3RhY2tfYWRkcmVzcyh0cmFjZSwgcmVncy0+aXAsIG5vc2NoZWQpOworCisJZm9yICh1bndpbmRfc3RhcnQoJnN0YXRlLCB0YXNrLCByZWdzLCBOVUxMKTsgIXVud2luZF9kb25lKCZzdGF0ZSk7CisJICAgICB1bndpbmRfbmV4dF9mcmFtZSgmc3RhdGUpKSB7CisJCWFkZHIgPSB1bndpbmRfZ2V0X3JldHVybl9hZGRyZXNzKCZzdGF0ZSk7CisJCWlmICghYWRkciB8fCBzYXZlX3N0YWNrX2FkZHJlc3ModHJhY2UsIGFkZHIsIG5vc2NoZWQpKQorCQkJYnJlYWs7CiAJfQorCisJaWYgKHRyYWNlLT5ucl9lbnRyaWVzIDwgdHJhY2UtPm1heF9lbnRyaWVzKQorCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IFVMT05HX01BWDsKIH0KIAotc3RhdGljIGludCBzYXZlX3N0YWNrX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgcmVsaWFibGUpCi17Ci0JcmV0dXJuIF9fc2F2ZV9zdGFja19hZGRyZXNzKGRhdGEsIGFkZHIsIHJlbGlhYmxlLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNhdmVfc3RhY2tfYWRkcmVzc19ub3NjaGVkKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHJlbGlhYmxlKQotewotCXJldHVybiBfX3NhdmVfc3RhY2tfYWRkcmVzcyhkYXRhLCBhZGRyLCByZWxpYWJsZSwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgc2F2ZV9zdGFja19vcHMgPSB7Ci0JLnN0YWNrCQk9IHNhdmVfc3RhY2tfc3RhY2ssCi0JLmFkZHJlc3MJPSBzYXZlX3N0YWNrX2FkZHJlc3MsCi0JLndhbGtfc3RhY2sJPSBwcmludF9jb250ZXh0X3N0YWNrLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyBzYXZlX3N0YWNrX29wc19ub3NjaGVkID0gewotCS5zdGFjawkJPSBzYXZlX3N0YWNrX3N0YWNrLAotCS5hZGRyZXNzCT0gc2F2ZV9zdGFja19hZGRyZXNzX25vc2NoZWQsCi0JLndhbGtfc3RhY2sJPSBwcmludF9jb250ZXh0X3N0YWNrLAotfTsKLQogLyoKICAqIFNhdmUgc3RhY2stYmFja3RyYWNlIGFkZHJlc3NlcyBpbnRvIGEgc3RhY2tfdHJhY2UgYnVmZmVyLgogICovCiB2b2lkIHNhdmVfc3RhY2tfdHJhY2Uoc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSkKIHsKLQlkdW1wX3RyYWNlKGN1cnJlbnQsIE5VTEwsIE5VTEwsIDAsICZzYXZlX3N0YWNrX29wcywgdHJhY2UpOwotCWlmICh0cmFjZS0+bnJfZW50cmllcyA8IHRyYWNlLT5tYXhfZW50cmllcykKLQkJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBVTE9OR19NQVg7CisJX19zYXZlX3N0YWNrX3RyYWNlKHRyYWNlLCBjdXJyZW50LCBOVUxMLCBmYWxzZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzYXZlX3N0YWNrX3RyYWNlKTsKIAogdm9pZCBzYXZlX3N0YWNrX3RyYWNlX3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UpCiB7Ci0JZHVtcF90cmFjZShjdXJyZW50LCByZWdzLCBOVUxMLCAwLCAmc2F2ZV9zdGFja19vcHMsIHRyYWNlKTsKLQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPCB0cmFjZS0+bWF4X2VudHJpZXMpCi0JCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gVUxPTkdfTUFYOworCV9fc2F2ZV9zdGFja190cmFjZSh0cmFjZSwgY3VycmVudCwgcmVncywgZmFsc2UpOwogfQogCiB2b2lkIHNhdmVfc3RhY2tfdHJhY2VfdHNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlKQogewotCWR1bXBfdHJhY2UodHNrLCBOVUxMLCBOVUxMLCAwLCAmc2F2ZV9zdGFja19vcHNfbm9zY2hlZCwgdHJhY2UpOwotCWlmICh0cmFjZS0+bnJfZW50cmllcyA8IHRyYWNlLT5tYXhfZW50cmllcykKLQkJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBVTE9OR19NQVg7CisJaWYgKCF0cnlfZ2V0X3Rhc2tfc3RhY2sodHNrKSkKKwkJcmV0dXJuOworCisJX19zYXZlX3N0YWNrX3RyYWNlKHRyYWNlLCB0c2ssIE5VTEwsIHRydWUpOworCisJcHV0X3Rhc2tfc3RhY2sodHNrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNhdmVfc3RhY2tfdHJhY2VfdHNrKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Rib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdGJvb3QuYwppbmRleCA2NTRmNmM2Li44NDAyOTA3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdGJvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdGJvb3QuYwpAQCAtMTg4LDEyICsxODgsMTIgQEAKIAogCXRib290LT5udW1fbWFjX3JlZ2lvbnMgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IGU4MjAubnJfbWFwOyBpKyspIHsKLQkJaWYgKChlODIwLm1hcFtpXS50eXBlICE9IEU4MjBfUkFNKQotCQkgJiYgKGU4MjAubWFwW2ldLnR5cGUgIT0gRTgyMF9SRVNFUlZFRF9LRVJOKSkKKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC0+bnJfbWFwOyBpKyspIHsKKwkJaWYgKChlODIwLT5tYXBbaV0udHlwZSAhPSBFODIwX1JBTSkKKwkJICYmIChlODIwLT5tYXBbaV0udHlwZSAhPSBFODIwX1JFU0VSVkVEX0tFUk4pKQogCQkJY29udGludWU7CiAKLQkJYWRkX21hY19yZWdpb24oZTgyMC5tYXBbaV0uYWRkciwgZTgyMC5tYXBbaV0uc2l6ZSk7CisJCWFkZF9tYWNfcmVnaW9uKGU4MjAtPm1hcFtpXS5hZGRyLCBlODIwLT5tYXBbaV0uc2l6ZSk7CiAJfQogCiAJdGJvb3QtPmFjcGlfc2luZm8ua2VybmVsX3MzX3Jlc3VtZV92ZWN0b3IgPQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYwppbmRleCBiNzBjYTEyLi5iZDRlM2Q0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYwpAQCAtMjkyLDEyICsyOTIsMzAgQEAKIERPX0VSUk9SKFg4Nl9UUkFQX1NTLCAgICAgU0lHQlVTLCAgInN0YWNrIHNlZ21lbnQiLAkJc3RhY2tfc2VnbWVudCkKIERPX0VSUk9SKFg4Nl9UUkFQX0FDLCAgICAgU0lHQlVTLCAgImFsaWdubWVudCBjaGVjayIsCQlhbGlnbm1lbnRfY2hlY2spCiAKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworX192aXNpYmxlIHZvaWQgX19ub3JldHVybiBoYW5kbGVfc3RhY2tfb3ZlcmZsb3coY29uc3QgY2hhciAqbWVzc2FnZSwKKwkJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkJdW5zaWduZWQgbG9uZyBmYXVsdF9hZGRyZXNzKQoreworCXByaW50ayhLRVJOX0VNRVJHICJCVUc6IHN0YWNrIGd1YXJkIHBhZ2Ugd2FzIGhpdCBhdCAlcCAoc3RhY2sgaXMgJXAuLiVwKVxuIiwKKwkJICh2b2lkICopZmF1bHRfYWRkcmVzcywgY3VycmVudC0+c3RhY2ssCisJCSAoY2hhciAqKWN1cnJlbnQtPnN0YWNrICsgVEhSRUFEX1NJWkUgLSAxKTsKKwlkaWUobWVzc2FnZSwgcmVncywgMCk7CisKKwkvKiBCZSBhYnNvbHV0ZWx5IGNlcnRhaW4gd2UgZG9uJ3QgcmV0dXJuLiAqLworCXBhbmljKG1lc3NhZ2UpOworfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAvKiBSdW5zIG9uIElTVCBzdGFjayAqLwogZG90cmFwbGlua2FnZSB2b2lkIGRvX2RvdWJsZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnJvcl9jb2RlKQogewogCXN0YXRpYyBjb25zdCBjaGFyIHN0cltdID0gImRvdWJsZSBmYXVsdCI7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworI2lmZGVmIENPTkZJR19WTUFQX1NUQUNLCisJdW5zaWduZWQgbG9uZyBjcjI7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19YODZfRVNQRklYNjQKIAlleHRlcm4gdW5zaWduZWQgY2hhciBuYXRpdmVfaXJxX3JldHVybl9pcmV0W107CkBAIC0zMzIsNiArMzUwLDQ5IEBACiAJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CiAJdHNrLT50aHJlYWQudHJhcF9uciA9IFg4Nl9UUkFQX0RGOwogCisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKKwkvKgorCSAqIElmIHdlIG92ZXJmbG93IHRoZSBzdGFjayBpbnRvIGEgZ3VhcmQgcGFnZSwgdGhlIENQVSB3aWxsIGZhaWwKKwkgKiB0byBkZWxpdmVyICNQRiBhbmQgd2lsbCBzZW5kICNERiBpbnN0ZWFkLiAgU2ltaWxhcmx5LCBpZiB3ZQorCSAqIHRha2UgYW55IG5vbi1JU1QgZXhjZXB0aW9uIHdoaWxlIHRvbyBjbG9zZSB0byB0aGUgYm90dG9tIG9mCisJICogdGhlIHN0YWNrLCB0aGUgcHJvY2Vzc29yIHdpbGwgZ2V0IGEgcGFnZSBmYXVsdCB3aGlsZQorCSAqIGRlbGl2ZXJpbmcgdGhlIGV4Y2VwdGlvbiBhbmQgd2lsbCBnZW5lcmF0ZSBhIGRvdWJsZSBmYXVsdC4KKwkgKgorCSAqIEFjY29yZGluZyB0byB0aGUgU0RNIChmb290bm90ZSBpbiA2LjE1IHVuZGVyICJJbnRlcnJ1cHQgMTQgLQorCSAqIFBhZ2UtRmF1bHQgRXhjZXB0aW9uICgjUEYpOgorCSAqCisJICogICBQcm9jZXNzb3JzIHVwZGF0ZSBDUjIgd2hlbmV2ZXIgYSBwYWdlIGZhdWx0IGlzIGRldGVjdGVkLiBJZiBhCisJICogICBzZWNvbmQgcGFnZSBmYXVsdCBvY2N1cnMgd2hpbGUgYW4gZWFybGllciBwYWdlIGZhdWx0IGlzIGJlaW5nCisJICogICBkZWxpdi0gZXJlZCwgdGhlIGZhdWx0aW5nIGxpbmVhciBhZGRyZXNzIG9mIHRoZSBzZWNvbmQgZmF1bHQgd2lsbAorCSAqICAgb3ZlcndyaXRlIHRoZSBjb250ZW50cyBvZiBDUjIgKHJlcGxhY2luZyB0aGUgcHJldmlvdXMKKwkgKiAgIGFkZHJlc3MpLiBUaGVzZSB1cGRhdGVzIHRvIENSMiBvY2N1ciBldmVuIGlmIHRoZSBwYWdlIGZhdWx0CisJICogICByZXN1bHRzIGluIGEgZG91YmxlIGZhdWx0IG9yIG9jY3VycyBkdXJpbmcgdGhlIGRlbGl2ZXJ5IG9mIGEKKwkgKiAgIGRvdWJsZSBmYXVsdC4KKwkgKgorCSAqIFRoZSBsb2dpYyBiZWxvdyBoYXMgYSBzbWFsbCBwb3NzaWJpbGl0eSBvZiBpbmNvcnJlY3RseSBkaWFnbm9zaW5nCisJICogc29tZSBlcnJvcnMgYXMgc3RhY2sgb3ZlcmZsb3dzLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBJRFQgb3IgR0RUCisJICogZ2V0cyBjb3JydXB0ZWQgc3VjaCB0aGF0ICNHUCBkZWxpdmVyeSBmYWlscyBkdWUgdG8gYSBiYWQgZGVzY3JpcHRvcgorCSAqIGNhdXNpbmcgI0dQIGFuZCB3ZSBoaXQgdGhpcyBjb25kaXRpb24gd2hpbGUgQ1IyIGNvaW5jaWRlbnRhbGx5CisJICogcG9pbnRzIHRvIHRoZSBzdGFjayBndWFyZCBwYWdlLCB3ZSdsbCB0aGluayB3ZSBvdmVyZmxvd2VkIHRoZQorCSAqIHN0YWNrLiAgR2l2ZW4gdGhhdCB3ZSdyZSBnb2luZyB0byBwYW5pYyBvbmUgd2F5IG9yIGFub3RoZXIKKwkgKiBpZiB0aGlzIGhhcHBlbnMsIHRoaXMgaXNuJ3QgbmVjZXNzYXJpbHkgd29ydGggZml4aW5nLgorCSAqCisJICogSWYgbmVjZXNzYXJ5LCB3ZSBjb3VsZCBpbXByb3ZlIHRoZSB0ZXN0IGJ5IG9ubHkgZGlhZ25vc2luZworCSAqIGEgc3RhY2sgb3ZlcmZsb3cgaWYgdGhlIHNhdmVkIFJTUCBwb2ludHMgd2l0aGluIDQ3IGJ5dGVzIG9mCisJICogdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2s6IGlmIFJTUCA9PSB0c2tfc3RhY2sgKyA0OCBhbmQgd2UKKwkgKiB0YWtlIGFuIGV4Y2VwdGlvbiwgdGhlIHN0YWNrIGlzIGFscmVhZHkgYWxpZ25lZCBhbmQgdGhlcmUKKwkgKiB3aWxsIGJlIGVub3VnaCByb29tIFNTLCBSU1AsIFJGTEFHUywgQ1MsIFJJUCwgYW5kIGEKKwkgKiBwb3NzaWJsZSBlcnJvciBjb2RlLCBzbyBhIHN0YWNrIG92ZXJmbG93IHdvdWxkICpub3QqIGRvdWJsZQorCSAqIGZhdWx0LiAgV2l0aCBhbnkgbGVzcyBzcGFjZSBsZWZ0LCBleGNlcHRpb24gZGVsaXZlcnkgY291bGQKKwkgKiBmYWlsLCBhbmQsIGFzIGEgcHJhY3RpY2FsIG1hdHRlciwgd2UndmUgb3ZlcmZsb3dlZCB0aGUKKwkgKiBzdGFjayBldmVuIGlmIHRoZSBhY3R1YWwgdHJpZ2dlciBmb3IgdGhlIGRvdWJsZSBmYXVsdCB3YXMKKwkgKiBzb21ldGhpbmcgZWxzZS4KKwkgKi8KKwljcjIgPSByZWFkX2NyMigpOworCWlmICgodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodHNrKSAtIDEgLSBjcjIgPCBQQUdFX1NJWkUpCisJCWhhbmRsZV9zdGFja19vdmVyZmxvdygia2VybmVsIHN0YWNrIG92ZXJmbG93IChkb3VibGUtZmF1bHQpIiwgcmVncywgY3IyKTsKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0RPVUJMRUZBVUxUCiAJZGZfZGVidWcocmVncywgZXJyb3JfY29kZSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90c2MuYyBiL2FyY2gveDg2L2tlcm5lbC90c2MuYwppbmRleCA3OGI5Y2I1Li40NmIyZjQxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RzYy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8YXNtL3g4Nl9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2dlb2RlLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaW50ZWwtZmFtaWx5Lmg+CiAKIHVuc2lnbmVkIGludCBfX3JlYWRfbW9zdGx5IGNwdV9raHo7CS8qIFRTQyBjbG9ja3MgLyB1c2VjLCBub3QgdXNlZCBoZXJlICovCiBFWFBPUlRfU1lNQk9MKGNwdV9raHopOwpAQCAtNjg2LDExICs2ODcsMTYgQEAKIAogCWlmIChjcnlzdGFsX2toeiA9PSAwKSB7CiAJCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwpIHsKLQkJY2FzZSAweDRFOgkvKiBTS0wgKi8KLQkJY2FzZSAweDVFOgkvKiBTS0wgKi8KKwkJY2FzZSBJTlRFTF9GQU02X1NLWUxBS0VfTU9CSUxFOgorCQljYXNlIElOVEVMX0ZBTTZfU0tZTEFLRV9ERVNLVE9QOgorCQljYXNlIElOVEVMX0ZBTTZfS0FCWUxBS0VfTU9CSUxFOgorCQljYXNlIElOVEVMX0ZBTTZfS0FCWUxBS0VfREVTS1RPUDoKIAkJCWNyeXN0YWxfa2h6ID0gMjQwMDA7CS8qIDI0LjAgTUh6ICovCiAJCQlicmVhazsKLQkJY2FzZSAweDVDOgkvKiBCWFQgKi8KKwkJY2FzZSBJTlRFTF9GQU02X1NLWUxBS0VfWDoKKwkJCWNyeXN0YWxfa2h6ID0gMjUwMDA7CS8qIDI1LjAgTUh6ICovCisJCQlicmVhazsKKwkJY2FzZSBJTlRFTF9GQU02X0FUT01fR09MRE1PTlQ6CiAJCQljcnlzdGFsX2toeiA9IDE5MjAwOwkvKiAxOS4yIE1IeiAqLwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC91bndpbmRfZnJhbWUuYyBiL2FyY2gveDg2L2tlcm5lbC91bndpbmRfZnJhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQ1NmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL3Vud2luZF9mcmFtZS5jCkBAIC0wLDAgKzEsOTMgQEAKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdW53aW5kLmg+CisKKyNkZWZpbmUgRlJBTUVfSEVBREVSX1NJWkUgKHNpemVvZihsb25nKSAqIDIpCisKK3Vuc2lnbmVkIGxvbmcgdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzcyhzdHJ1Y3QgdW53aW5kX3N0YXRlICpzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyAqYWRkcl9wID0gdW53aW5kX2dldF9yZXR1cm5fYWRkcmVzc19wdHIoc3RhdGUpOworCisJaWYgKHVud2luZF9kb25lKHN0YXRlKSkKKwkJcmV0dXJuIDA7CisKKwlhZGRyID0gZnRyYWNlX2dyYXBoX3JldF9hZGRyKHN0YXRlLT50YXNrLCAmc3RhdGUtPmdyYXBoX2lkeCwgKmFkZHJfcCwKKwkJCQkgICAgIGFkZHJfcCk7CisKKwlyZXR1cm4gX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpID8gYWRkciA6IDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1bndpbmRfZ2V0X3JldHVybl9hZGRyZXNzKTsKKworc3RhdGljIGJvb2wgdXBkYXRlX3N0YWNrX3N0YXRlKHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlLCB2b2lkICphZGRyLAorCQkJICAgICAgIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHN0YWNrX2luZm8gKmluZm8gPSAmc3RhdGUtPnN0YWNrX2luZm87CisKKwkvKgorCSAqIElmIGFkZHIgaXNuJ3Qgb24gdGhlIGN1cnJlbnQgc3RhY2ssIHN3aXRjaCB0byB0aGUgbmV4dCBvbmUuCisJICoKKwkgKiBXZSBtYXkgaGF2ZSB0byB0cmF2ZXJzZSBtdWx0aXBsZSBzdGFja3MgdG8gZGVhbCB3aXRoIHRoZSBwb3NzaWJpbGl0eQorCSAqIHRoYXQgJ2luZm8tPm5leHRfc3AnIGNvdWxkIHBvaW50IHRvIGFuIGVtcHR5IHN0YWNrIGFuZCAnYWRkcicgY291bGQKKwkgKiBiZSBvbiBhIHN1YnNlcXVlbnQgc3RhY2suCisJICovCisJd2hpbGUgKCFvbl9zdGFjayhpbmZvLCBhZGRyLCBsZW4pKQorCQlpZiAoZ2V0X3N0YWNrX2luZm8oaW5mby0+bmV4dF9zcCwgc3RhdGUtPnRhc2ssIGluZm8sCisJCQkJICAgJnN0YXRlLT5zdGFja19tYXNrKSkKKwkJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitib29sIHVud2luZF9uZXh0X2ZyYW1lKHN0cnVjdCB1bndpbmRfc3RhdGUgKnN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgKm5leHRfYnA7CisKKwlpZiAodW53aW5kX2RvbmUoc3RhdGUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwluZXh0X2JwID0gKHVuc2lnbmVkIGxvbmcgKikqc3RhdGUtPmJwOworCisJLyogbWFrZSBzdXJlIHRoZSBuZXh0IGZyYW1lJ3MgZGF0YSBpcyBhY2Nlc3NpYmxlICovCisJaWYgKCF1cGRhdGVfc3RhY2tfc3RhdGUoc3RhdGUsIG5leHRfYnAsIEZSQU1FX0hFQURFUl9TSVpFKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogbW92ZSB0byB0aGUgbmV4dCBmcmFtZSAqLworCXN0YXRlLT5icCA9IG5leHRfYnA7CisJcmV0dXJuIHRydWU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1bndpbmRfbmV4dF9mcmFtZSk7CisKK3ZvaWQgX191bndpbmRfc3RhcnQoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICpmaXJzdF9mcmFtZSkKK3sKKwltZW1zZXQoc3RhdGUsIDAsIHNpemVvZigqc3RhdGUpKTsKKwlzdGF0ZS0+dGFzayA9IHRhc2s7CisKKwkvKiBkb24ndCBldmVuIGF0dGVtcHQgdG8gc3RhcnQgZnJvbSB1c2VyIG1vZGUgcmVncyAqLworCWlmIChyZWdzICYmIHVzZXJfbW9kZShyZWdzKSkgeworCQlzdGF0ZS0+c3RhY2tfaW5mby50eXBlID0gU1RBQ0tfVFlQRV9VTktOT1dOOworCQlyZXR1cm47CisJfQorCisJLyogc2V0IHVwIHRoZSBzdGFydGluZyBzdGFjayBmcmFtZSAqLworCXN0YXRlLT5icCA9IGdldF9mcmFtZV9wb2ludGVyKHRhc2ssIHJlZ3MpOworCisJLyogaW5pdGlhbGl6ZSBzdGFjayBpbmZvIGFuZCBtYWtlIHN1cmUgdGhlIGZyYW1lIGRhdGEgaXMgYWNjZXNzaWJsZSAqLworCWdldF9zdGFja19pbmZvKHN0YXRlLT5icCwgc3RhdGUtPnRhc2ssICZzdGF0ZS0+c3RhY2tfaW5mbywKKwkJICAgICAgICZzdGF0ZS0+c3RhY2tfbWFzayk7CisJdXBkYXRlX3N0YWNrX3N0YXRlKHN0YXRlLCBzdGF0ZS0+YnAsIEZSQU1FX0hFQURFUl9TSVpFKTsKKworCS8qCisJICogVGhlIGNhbGxlciBjYW4gcHJvdmlkZSB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgZnJhbWUgZGlyZWN0bHkKKwkgKiAoZmlyc3RfZnJhbWUpIG9yIGluZGlyZWN0bHkgKHJlZ3MtPnNwKSB0byBpbmRpY2F0ZSB3aGljaCBzdGFjayBmcmFtZQorCSAqIHRvIHN0YXJ0IHVud2luZGluZyBhdC4gIFNraXAgYWhlYWQgdW50aWwgd2UgcmVhY2ggaXQuCisJICovCisJd2hpbGUgKCF1bndpbmRfZG9uZShzdGF0ZSkgJiYKKwkgICAgICAgKCFvbl9zdGFjaygmc3RhdGUtPnN0YWNrX2luZm8sIGZpcnN0X2ZyYW1lLCBzaXplb2YobG9uZykpIHx8CisJCQlzdGF0ZS0+YnAgPCBmaXJzdF9mcmFtZSkpCisJCXVud2luZF9uZXh0X2ZyYW1lKHN0YXRlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fdW53aW5kX3N0YXJ0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC91bndpbmRfZ3Vlc3MuYyBiL2FyY2gveDg2L2tlcm5lbC91bndpbmRfZ3Vlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE4MzRjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL3Vud2luZF9ndWVzcy5jCkBAIC0wLDAgKzEsNDMgQEAKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vdW53aW5kLmg+CisKK2Jvb2wgdW53aW5kX25leHRfZnJhbWUoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHN0YWNrX2luZm8gKmluZm8gPSAmc3RhdGUtPnN0YWNrX2luZm87CisKKwlpZiAodW53aW5kX2RvbmUoc3RhdGUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlkbyB7CisJCWZvciAoc3RhdGUtPnNwKys7IHN0YXRlLT5zcCA8IGluZm8tPmVuZDsgc3RhdGUtPnNwKyspCisJCQlpZiAoX19rZXJuZWxfdGV4dF9hZGRyZXNzKCpzdGF0ZS0+c3ApKQorCQkJCXJldHVybiB0cnVlOworCisJCXN0YXRlLT5zcCA9IGluZm8tPm5leHRfc3A7CisKKwl9IHdoaWxlICghZ2V0X3N0YWNrX2luZm8oc3RhdGUtPnNwLCBzdGF0ZS0+dGFzaywgaW5mbywKKwkJCQkgJnN0YXRlLT5zdGFja19tYXNrKSk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1bndpbmRfbmV4dF9mcmFtZSk7CisKK3ZvaWQgX191bndpbmRfc3RhcnQoc3RydWN0IHVud2luZF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICpmaXJzdF9mcmFtZSkKK3sKKwltZW1zZXQoc3RhdGUsIDAsIHNpemVvZigqc3RhdGUpKTsKKworCXN0YXRlLT50YXNrID0gdGFzazsKKwlzdGF0ZS0+c3AgICA9IGZpcnN0X2ZyYW1lOworCisJZ2V0X3N0YWNrX2luZm8oZmlyc3RfZnJhbWUsIHN0YXRlLT50YXNrLCAmc3RhdGUtPnN0YWNrX2luZm8sCisJCSAgICAgICAmc3RhdGUtPnN0YWNrX21hc2spOworCisJaWYgKCFfX2tlcm5lbF90ZXh0X2FkZHJlc3MoKmZpcnN0X2ZyYW1lKSkKKwkJdW53aW5kX25leHRfZnJhbWUoc3RhdGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX191bndpbmRfc3RhcnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3g4NjY0X2tzeW1zXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwveDg2NjRfa3N5bXNfNjQuYwppbmRleCA5NWU0OWY2Li5iMmNlZTNkMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3g4NjY0X2tzeW1zXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3g4NjY0X2tzeW1zXzY0LmMKQEAgLTM4LDcgKzM4LDcgQEAKIEVYUE9SVF9TWU1CT0woX2NvcHlfZnJvbV91c2VyKTsKIEVYUE9SVF9TWU1CT0woX2NvcHlfdG9fdXNlcik7CiAKLUVYUE9SVF9TWU1CT0xfR1BMKG1lbWNweV9tY3NhZmUpOworRVhQT1JUX1NZTUJPTF9HUEwobWVtY3B5X21jc2FmZV91bnJvbGxlZCk7CiAKIEVYUE9SVF9TWU1CT0woY29weV9wYWdlKTsKIEVYUE9SVF9TWU1CT0woY2xlYXJfcGFnZSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYyBiL2FyY2gveDg2L2tlcm5lbC94ODZfaW5pdC5jCmluZGV4IDc2YzVlNTIuLjBiZDlmMTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC94ODZfaW5pdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC94ODZfaW5pdC5jCkBAIC05MSw3ICs5MSw3IEBACiBzdGF0aWMgdm9pZCBkZWZhdWx0X25taV9pbml0KHZvaWQpIHsgfTsKIHN0YXRpYyBpbnQgZGVmYXVsdF9pODA0Ml9kZXRlY3Qodm9pZCkgeyByZXR1cm4gMTsgfTsKIAotc3RydWN0IHg4Nl9wbGF0Zm9ybV9vcHMgeDg2X3BsYXRmb3JtID0geworc3RydWN0IHg4Nl9wbGF0Zm9ybV9vcHMgeDg2X3BsYXRmb3JtIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAkuY2FsaWJyYXRlX2NwdQkJCT0gbmF0aXZlX2NhbGlicmF0ZV9jcHUsCiAJLmNhbGlicmF0ZV90c2MJCQk9IG5hdGl2ZV9jYWxpYnJhdGVfdHNjLAogCS5nZXRfd2FsbGNsb2NrCQkJPSBtYWNoX2dldF9jbW9zX3RpbWUsCkBAIC0xMDgsNyArMTA4LDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHg4Nl9wbGF0Zm9ybSk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19QQ0lfTVNJKQotc3RydWN0IHg4Nl9tc2lfb3BzIHg4Nl9tc2kgPSB7CitzdHJ1Y3QgeDg2X21zaV9vcHMgeDg2X21zaSBfX3JvX2FmdGVyX2luaXQgPSB7CiAJLnNldHVwX21zaV9pcnFzCQk9IG5hdGl2ZV9zZXR1cF9tc2lfaXJxcywKIAkudGVhcmRvd25fbXNpX2lycQk9IG5hdGl2ZV90ZWFyZG93bl9tc2lfaXJxLAogCS50ZWFyZG93bl9tc2lfaXJxcwk9IGRlZmF1bHRfdGVhcmRvd25fbXNpX2lycXMsCkBAIC0xMzcsNyArMTM3LDcgQEAKIH0KICNlbmRpZgogCi1zdHJ1Y3QgeDg2X2lvX2FwaWNfb3BzIHg4Nl9pb19hcGljX29wcyA9IHsKK3N0cnVjdCB4ODZfaW9fYXBpY19vcHMgeDg2X2lvX2FwaWNfb3BzIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAkucmVhZAkJCT0gbmF0aXZlX2lvX2FwaWNfcmVhZCwKIAkuZGlzYWJsZQkJPSBuYXRpdmVfZGlzYWJsZV9pb19hcGljLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9NYWtlZmlsZSBiL2FyY2gveDg2L2t2bS9NYWtlZmlsZQppbmRleCA0NjRmYTQ3Li4zYmZmMjA3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva3ZtL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw3IEBACiAKIGt2bS15CQkJKz0geDg2Lm8gbW11Lm8gZW11bGF0ZS5vIGk4MjU5Lm8gaXJxLm8gbGFwaWMubyBcCiAJCQkgICBpODI1NC5vIGlvYXBpYy5vIGlycV9jb21tLm8gY3B1aWQubyBwbXUubyBtdHJyLm8gXAotCQkJICAgaHlwZXJ2Lm8gcGFnZV90cmFjay5vCisJCQkgICBoeXBlcnYubyBwYWdlX3RyYWNrLm8gZGVidWdmcy5vCiAKIGt2bS0kKENPTkZJR19LVk1fREVWSUNFX0FTU0lHTk1FTlQpCSs9IGFzc2lnbmVkLWRldi5vIGlvbW11Lm8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2NwdWlkLmMgYi9hcmNoL3g4Ni9rdm0vY3B1aWQuYwppbmRleCAzMjM1ZTBmLi5hZmE3YmJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vY3B1aWQuYworKysgYi9hcmNoL3g4Ni9rdm0vY3B1aWQuYwpAQCAtMzY2LDcgKzM2Niw4IEBACiAJCUYoRlNHU0JBU0UpIHwgRihCTUkxKSB8IEYoSExFKSB8IEYoQVZYMikgfCBGKFNNRVApIHwKIAkJRihCTUkyKSB8IEYoRVJNUykgfCBmX2ludnBjaWQgfCBGKFJUTSkgfCBmX21weCB8IEYoUkRTRUVEKSB8CiAJCUYoQURYKSB8IEYoU01BUCkgfCBGKEFWWDUxMkYpIHwgRihBVlg1MTJQRikgfCBGKEFWWDUxMkVSKSB8Ci0JCUYoQVZYNTEyQ0QpIHwgRihDTEZMVVNIT1BUKSB8IEYoQ0xXQik7CisJCUYoQVZYNTEyQ0QpIHwgRihDTEZMVVNIT1BUKSB8IEYoQ0xXQikgfCBGKEFWWDUxMkRRKSB8CisJCUYoQVZYNTEyQlcpIHwgRihBVlg1MTJWTCk7CiAKIAkvKiBjcHVpZCAweEQuMS5lYXggKi8KIAljb25zdCB1MzIga3ZtX2NwdWlkX0RfMV9lYXhfeDg2X2ZlYXR1cmVzID0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9kZWJ1Z2ZzLmMgYi9hcmNoL3g4Ni9rdm0vZGVidWdmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOWM3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rdm0vZGVidWdmcy5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBLZXJuZWwtYmFzZWQgVmlydHVhbCBNYWNoaW5lIGRyaXZlciBmb3IgTGludXgKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBSZWQgSGF0LCBJbmMuIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLCB2ZXJzaW9uIDIuICBTZWUKKyAqIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkuCisgKgorICovCisjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKK2Jvb2wga3ZtX2FyY2hfaGFzX3ZjcHVfZGVidWdmcyh2b2lkKQoreworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IHZjcHVfZ2V0X3RzY19vZmZzZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gKHN0cnVjdCBrdm1fdmNwdSAqKSBkYXRhOworCSp2YWwgPSB2Y3B1LT5hcmNoLnRzY19vZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKHZjcHVfdHNjX29mZnNldF9mb3BzLCB2Y3B1X2dldF90c2Nfb2Zmc2V0LCBOVUxMLCAiJWxsZFxuIik7CisKK3N0YXRpYyBpbnQgdmNwdV9nZXRfdHNjX3NjYWxpbmdfcmF0aW8odm9pZCAqZGF0YSwgdTY0ICp2YWwpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gKHN0cnVjdCBrdm1fdmNwdSAqKSBkYXRhOworCSp2YWwgPSB2Y3B1LT5hcmNoLnRzY19zY2FsaW5nX3JhdGlvOworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURSh2Y3B1X3RzY19zY2FsaW5nX2ZvcHMsIHZjcHVfZ2V0X3RzY19zY2FsaW5nX3JhdGlvLCBOVUxMLCAiJWxsdVxuIik7CisKK3N0YXRpYyBpbnQgdmNwdV9nZXRfdHNjX3NjYWxpbmdfZnJhY19iaXRzKHZvaWQgKmRhdGEsIHU2NCAqdmFsKQoreworCSp2YWwgPSBrdm1fdHNjX3NjYWxpbmdfcmF0aW9fZnJhY19iaXRzOworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURSh2Y3B1X3RzY19zY2FsaW5nX2ZyYWNfZm9wcywgdmNwdV9nZXRfdHNjX3NjYWxpbmdfZnJhY19iaXRzLCBOVUxMLCAiJWxsdVxuIik7CisKK2ludCBrdm1fYXJjaF9jcmVhdGVfdmNwdV9kZWJ1Z2ZzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpyZXQ7CisKKwlyZXQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ0c2Mtb2Zmc2V0IiwgMDQ0NCwKKwkJCQkJCQl2Y3B1LT5kZWJ1Z2ZzX2RlbnRyeSwKKwkJCQkJCQl2Y3B1LCAmdmNwdV90c2Nfb2Zmc2V0X2ZvcHMpOworCWlmICghcmV0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChrdm1faGFzX3RzY19jb250cm9sKSB7CisJCXJldCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRzYy1zY2FsaW5nLXJhdGlvIiwgMDQ0NCwKKwkJCQkJCQl2Y3B1LT5kZWJ1Z2ZzX2RlbnRyeSwKKwkJCQkJCQl2Y3B1LCAmdmNwdV90c2Nfc2NhbGluZ19mb3BzKTsKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHNjLXNjYWxpbmctcmF0aW8tZnJhYy1iaXRzIiwgMDQ0NCwKKwkJCQkJCQl2Y3B1LT5kZWJ1Z2ZzX2RlbnRyeSwKKwkJCQkJCQl2Y3B1LCAmdmNwdV90c2Nfc2NhbGluZ19mcmFjX2ZvcHMpOworCQlpZiAoIXJldCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaHlwZXJ2LmMgYi9hcmNoL3g4Ni9rdm0vaHlwZXJ2LmMKaW5kZXggMDFiZDdiNy4uNDJiMWM4MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2h5cGVydi5jCisrKyBiL2FyY2gveDg2L2t2bS9oeXBlcnYuYwpAQCAtMzg2LDcgKzM4NiwyMSBAQAogCiBzdGF0aWMgdTY0IGdldF90aW1lX3JlZl9jb3VudGVyKHN0cnVjdCBrdm0gKmt2bSkKIHsKLQlyZXR1cm4gZGl2X3U2NChnZXRfa2VybmVsX25zKCkgKyBrdm0tPmFyY2gua3ZtY2xvY2tfb2Zmc2V0LCAxMDApOworCXN0cnVjdCBrdm1faHYgKmh2ID0gJmt2bS0+YXJjaC5oeXBlcnY7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OworCXU2NCB0c2M7CisKKwkvKgorCSAqIFRoZSBndWVzdCBoYXMgbm90IHNldCB1cCB0aGUgVFNDIHBhZ2Ugb3IgdGhlIGNsb2NrIGlzbid0CisJICogc3RhYmxlLCBmYWxsIGJhY2sgdG8gZ2V0X2t2bWNsb2NrX25zLgorCSAqLworCWlmICghaHYtPnRzY19yZWYudHNjX3NlcXVlbmNlKQorCQlyZXR1cm4gZGl2X3U2NChnZXRfa3ZtY2xvY2tfbnMoa3ZtKSwgMTAwKTsKKworCXZjcHUgPSBrdm1fZ2V0X3ZjcHUoa3ZtLCAwKTsKKwl0c2MgPSBrdm1fcmVhZF9sMV90c2ModmNwdSwgcmR0c2MoKSk7CisJcmV0dXJuIG11bF91NjRfdTY0X3Nocih0c2MsIGh2LT50c2NfcmVmLnRzY19zY2FsZSwgNjQpCisJCSsgaHYtPnRzY19yZWYudHNjX29mZnNldDsKIH0KIAogc3RhdGljIHZvaWQgc3RpbWVyX21hcmtfcGVuZGluZyhzdHJ1Y3Qga3ZtX3ZjcHVfaHZfc3RpbWVyICpzdGltZXIsCkBAIC03NTYsNiArNzcwLDEyOSBAQAogCXJldHVybiAwOwogfQogCisvKgorICogVGhlIGt2bWNsb2NrIGFuZCBIeXBlci1WIFRTQyBwYWdlIHVzZSBzaW1pbGFyIGZvcm11bGFzLCBhbmQgY29udmVydGluZworICogYmV0d2VlbiB0aGVtIGlzIHBvc3NpYmxlOgorICoKKyAqIGt2bWNsb2NrIGZvcm11bGE6CisgKiAgICBuc2VjID0gKHRpY2tzIC0gdHNjX3RpbWVzdGFtcCkgKiB0c2NfdG9fc3lzdGVtX211bCAqIDJeKHRzY19zaGlmdC0zMikKKyAqICAgICAgICAgICArIHN5c3RlbV90aW1lCisgKgorICogSHlwZXItViBmb3JtdWxhOgorICogICAgbnNlYy8xMDAgPSB0aWNrcyAqIHNjYWxlIC8gMl42NCArIG9mZnNldAorICoKKyAqIFdoZW4gdHNjX3RpbWVzdGFtcCA9IHN5c3RlbV90aW1lID0gMCwgb2Zmc2V0IGlzIHplcm8gaW4gdGhlIEh5cGVyLVYgZm9ybXVsYS4KKyAqIEJ5IGRpdmlkaW5nIHRoZSBrdm1jbG9jayBmb3JtdWxhIGJ5IDEwMCBhbmQgZXF1YXRpbmcgd2hhdCdzIGxlZnQgd2UgZ2V0OgorICogICAgdGlja3MgKiBzY2FsZSAvIDJeNjQgPSB0aWNrcyAqIHRzY190b19zeXN0ZW1fbXVsICogMl4odHNjX3NoaWZ0LTMyKSAvIDEwMAorICogICAgICAgICAgICBzY2FsZSAvIDJeNjQgPSAgICAgICAgIHRzY190b19zeXN0ZW1fbXVsICogMl4odHNjX3NoaWZ0LTMyKSAvIDEwMAorICogICAgICAgICAgICBzY2FsZSAgICAgICAgPSAgICAgICAgIHRzY190b19zeXN0ZW1fbXVsICogMl4oMzIrdHNjX3NoaWZ0KSAvIDEwMAorICoKKyAqIE5vdyBleHBhbmQgdGhlIGt2bWNsb2NrIGZvcm11bGEgYW5kIGRpdmlkZSBieSAxMDA6CisgKiAgICBuc2VjID0gdGlja3MgKiB0c2NfdG9fc3lzdGVtX211bCAqIDJeKHRzY19zaGlmdC0zMikKKyAqICAgICAgICAgICAtIHRzY190aW1lc3RhbXAgKiB0c2NfdG9fc3lzdGVtX211bCAqIDJeKHRzY19zaGlmdC0zMikKKyAqICAgICAgICAgICArIHN5c3RlbV90aW1lCisgKiAgICBuc2VjLzEwMCA9IHRpY2tzICogdHNjX3RvX3N5c3RlbV9tdWwgKiAyXih0c2Nfc2hpZnQtMzIpIC8gMTAwCisgKiAgICAgICAgICAgICAgIC0gdHNjX3RpbWVzdGFtcCAqIHRzY190b19zeXN0ZW1fbXVsICogMl4odHNjX3NoaWZ0LTMyKSAvIDEwMAorICogICAgICAgICAgICAgICArIHN5c3RlbV90aW1lIC8gMTAwCisgKgorICogUmVwbGFjZSB0c2NfdG9fc3lzdGVtX211bCAqIDJeKHRzY19zaGlmdC0zMikgLyAxMDAgYnkgc2NhbGUgLyAyXjY0OgorICogICAgbnNlYy8xMDAgPSB0aWNrcyAqIHNjYWxlIC8gMl42NAorICogICAgICAgICAgICAgICAtIHRzY190aW1lc3RhbXAgKiBzY2FsZSAvIDJeNjQKKyAqICAgICAgICAgICAgICAgKyBzeXN0ZW1fdGltZSAvIDEwMAorICoKKyAqIEVxdWF0ZSB3aXRoIHRoZSBIeXBlci1WIGZvcm11bGEgc28gdGhhdCB0aWNrcyAqIHNjYWxlIC8gMl42NCBjYW5jZWxzIG91dDoKKyAqICAgIG9mZnNldCA9IHN5c3RlbV90aW1lIC8gMTAwIC0gdHNjX3RpbWVzdGFtcCAqIHNjYWxlIC8gMl42NAorICoKKyAqIFRoZXNlIHR3byBlcXVpdmFsZW5jaWVzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgYm9vbCBjb21wdXRlX3RzY19wYWdlX3BhcmFtZXRlcnMoc3RydWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKmh2X2Nsb2NrLAorCQkJCQlIVl9SRUZFUkVOQ0VfVFNDX1BBR0UgKnRzY19yZWYpCit7CisJdTY0IG1heF9tdWw7CisKKwlpZiAoIShodl9jbG9jay0+ZmxhZ3MgJiBQVkNMT0NLX1RTQ19TVEFCTEVfQklUKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBjaGVjayBpZiBzY2FsZSB3b3VsZCBvdmVyZmxvdywgaWYgc28gd2UgdXNlIHRoZSB0aW1lIHJlZiBjb3VudGVyCisJICogICAgdHNjX3RvX3N5c3RlbV9tdWwgKiAyXih0c2Nfc2hpZnQrMzIpIC8gMTAwID49IDJeNjQKKwkgKiAgICB0c2NfdG9fc3lzdGVtX211bCAvIDEwMCA+PSAyXigzMi10c2Nfc2hpZnQpCisJICogICAgdHNjX3RvX3N5c3RlbV9tdWwgPj0gMTAwICogMl4oMzItdHNjX3NoaWZ0KQorCSAqLworCW1heF9tdWwgPSAxMDB1bGwgPDwgKDMyIC0gaHZfY2xvY2stPnRzY19zaGlmdCk7CisJaWYgKGh2X2Nsb2NrLT50c2NfdG9fc3lzdGVtX211bCA+PSBtYXhfbXVsKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIE90aGVyd2lzZSBjb21wdXRlIHRoZSBzY2FsZSBhbmQgb2Zmc2V0IGFjY29yZGluZyB0byB0aGUgZm9ybXVsYXMKKwkgKiBkZXJpdmVkIGFib3ZlLgorCSAqLworCXRzY19yZWYtPnRzY19zY2FsZSA9CisJCW11bF91NjRfdTMyX2RpdigxVUxMIDw8ICgzMiArIGh2X2Nsb2NrLT50c2Nfc2hpZnQpLAorCQkJCWh2X2Nsb2NrLT50c2NfdG9fc3lzdGVtX211bCwKKwkJCQkxMDApOworCisJdHNjX3JlZi0+dHNjX29mZnNldCA9IGh2X2Nsb2NrLT5zeXN0ZW1fdGltZTsKKwlkb19kaXYodHNjX3JlZi0+dHNjX29mZnNldCwgMTAwKTsKKwl0c2NfcmVmLT50c2Nfb2Zmc2V0IC09CisJCW11bF91NjRfdTY0X3Nocihodl9jbG9jay0+dHNjX3RpbWVzdGFtcCwgdHNjX3JlZi0+dHNjX3NjYWxlLCA2NCk7CisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQga3ZtX2h2X3NldHVwX3RzY19wYWdlKHN0cnVjdCBrdm0gKmt2bSwKKwkJCSAgIHN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvICpodl9jbG9jaykKK3sKKwlzdHJ1Y3Qga3ZtX2h2ICpodiA9ICZrdm0tPmFyY2guaHlwZXJ2OworCXUzMiB0c2Nfc2VxOworCXU2NCBnZm47CisKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHRzY19zZXEpICE9IHNpemVvZihodi0+dHNjX3JlZi50c2Nfc2VxdWVuY2UpKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2YoSFZfUkVGRVJFTkNFX1RTQ19QQUdFLCB0c2Nfc2VxdWVuY2UpICE9IDApOworCisJaWYgKCEoaHYtPmh2X3RzY19wYWdlICYgSFZfWDY0X01TUl9UU0NfUkVGRVJFTkNFX0VOQUJMRSkpCisJCXJldHVybjsKKworCWdmbiA9IGh2LT5odl90c2NfcGFnZSA+PiBIVl9YNjRfTVNSX1RTQ19SRUZFUkVOQ0VfQUREUkVTU19TSElGVDsKKwkvKgorCSAqIEJlY2F1c2UgdGhlIFRTQyBwYXJhbWV0ZXJzIG9ubHkgdmFyeSB3aGVuIHRoZXJlIGlzIGEKKwkgKiBjaGFuZ2UgaW4gdGhlIG1hc3RlciBjbG9jaywgZG8gbm90IGJvdGhlciB3aXRoIGNhY2hpbmcuCisJICovCisJaWYgKHVubGlrZWx5KGt2bV9yZWFkX2d1ZXN0KGt2bSwgZ2ZuX3RvX2dwYShnZm4pLAorCQkJCSAgICAmdHNjX3NlcSwgc2l6ZW9mKHRzY19zZXEpKSkpCisJCXJldHVybjsKKworCS8qCisJICogV2hpbGUgd2UncmUgY29tcHV0aW5nIGFuZCB3cml0aW5nIHRoZSBwYXJhbWV0ZXJzLCBmb3JjZSB0aGUKKwkgKiBndWVzdCB0byB1c2UgdGhlIHRpbWUgcmVmZXJlbmNlIGNvdW50IE1TUi4KKwkgKi8KKwlodi0+dHNjX3JlZi50c2Nfc2VxdWVuY2UgPSAwOworCWlmIChrdm1fd3JpdGVfZ3Vlc3Qoa3ZtLCBnZm5fdG9fZ3BhKGdmbiksCisJCQkgICAgJmh2LT50c2NfcmVmLCBzaXplb2YoaHYtPnRzY19yZWYudHNjX3NlcXVlbmNlKSkpCisJCXJldHVybjsKKworCWlmICghY29tcHV0ZV90c2NfcGFnZV9wYXJhbWV0ZXJzKGh2X2Nsb2NrLCAmaHYtPnRzY19yZWYpKQorCQlyZXR1cm47CisKKwkvKiBFbnN1cmUgc2VxdWVuY2UgaXMgemVybyBiZWZvcmUgd3JpdGluZyB0aGUgcmVzdCBvZiB0aGUgc3RydWN0LiAgKi8KKwlzbXBfd21iKCk7CisJaWYgKGt2bV93cml0ZV9ndWVzdChrdm0sIGdmbl90b19ncGEoZ2ZuKSwgJmh2LT50c2NfcmVmLCBzaXplb2YoaHYtPnRzY19yZWYpKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBOb3cgc3dpdGNoIHRvIHRoZSBUU0MgcGFnZSBtZWNoYW5pc20gYnkgd3JpdGluZyB0aGUgc2VxdWVuY2UuCisJICovCisJdHNjX3NlcSsrOworCWlmICh0c2Nfc2VxID09IDB4RkZGRkZGRkYgfHwgdHNjX3NlcSA9PSAwKQorCQl0c2Nfc2VxID0gMTsKKworCS8qIFdyaXRlIHRoZSBzdHJ1Y3QgZW50aXJlbHkgYmVmb3JlIHRoZSBub24temVybyBzZXF1ZW5jZS4gICovCisJc21wX3dtYigpOworCisJaHYtPnRzY19yZWYudHNjX3NlcXVlbmNlID0gdHNjX3NlcTsKKwlrdm1fd3JpdGVfZ3Vlc3Qoa3ZtLCBnZm5fdG9fZ3BhKGdmbiksCisJCQkmaHYtPnRzY19yZWYsIHNpemVvZihodi0+dHNjX3JlZi50c2Nfc2VxdWVuY2UpKTsKK30KKwogc3RhdGljIGludCBrdm1faHZfc2V0X21zcl9wdyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUzMiBtc3IsIHU2NCBkYXRhLAogCQkJICAgICBib29sIGhvc3QpCiB7CkBAIC03OTMsMjMgKzkzMCwxMSBAQAogCQltYXJrX3BhZ2VfZGlydHkoa3ZtLCBnZm4pOwogCQlicmVhazsKIAl9Ci0JY2FzZSBIVl9YNjRfTVNSX1JFRkVSRU5DRV9UU0M6IHsKLQkJdTY0IGdmbjsKLQkJSFZfUkVGRVJFTkNFX1RTQ19QQUdFIHRzY19yZWY7Ci0KLQkJbWVtc2V0KCZ0c2NfcmVmLCAwLCBzaXplb2YodHNjX3JlZikpOworCWNhc2UgSFZfWDY0X01TUl9SRUZFUkVOQ0VfVFNDOgogCQlodi0+aHZfdHNjX3BhZ2UgPSBkYXRhOwotCQlpZiAoIShkYXRhICYgSFZfWDY0X01TUl9UU0NfUkVGRVJFTkNFX0VOQUJMRSkpCi0JCQlicmVhazsKLQkJZ2ZuID0gZGF0YSA+PiBIVl9YNjRfTVNSX1RTQ19SRUZFUkVOQ0VfQUREUkVTU19TSElGVDsKLQkJaWYgKGt2bV93cml0ZV9ndWVzdCgKLQkJCQlrdm0sCi0JCQkJZ2ZuIDw8IEhWX1g2NF9NU1JfVFNDX1JFRkVSRU5DRV9BRERSRVNTX1NISUZULAotCQkJCSZ0c2NfcmVmLCBzaXplb2YodHNjX3JlZikpKQotCQkJcmV0dXJuIDE7Ci0JCW1hcmtfcGFnZV9kaXJ0eShrdm0sIGdmbik7CisJCWlmIChodi0+aHZfdHNjX3BhZ2UgJiBIVl9YNjRfTVNSX1RTQ19SRUZFUkVOQ0VfRU5BQkxFKQorCQkJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX01BU1RFUkNMT0NLX1VQREFURSwgdmNwdSk7CiAJCWJyZWFrOwotCX0KIAljYXNlIEhWX1g2NF9NU1JfQ1JBU0hfUDAgLi4uIEhWX1g2NF9NU1JfQ1JBU0hfUDQ6CiAJCXJldHVybiBrdm1faHZfbXNyX3NldF9jcmFzaF9kYXRhKHZjcHUsCiAJCQkJCQkgbXNyIC0gSFZfWDY0X01TUl9DUkFTSF9QMCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9oeXBlcnYuaCBiL2FyY2gveDg2L2t2bS9oeXBlcnYuaAppbmRleCA2MGVjY2Q0Li5jZDExMTk1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vaHlwZXJ2LmgKKysrIGIvYXJjaC94ODYva3ZtL2h5cGVydi5oCkBAIC04NCw0ICs4NCw3IEBACiAKIHZvaWQga3ZtX2h2X3Byb2Nlc3Nfc3RpbWVycyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCit2b2lkIGt2bV9odl9zZXR1cF90c2NfcGFnZShzdHJ1Y3Qga3ZtICprdm0sCisJCQkgICBzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyAqaHZfY2xvY2spOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9pb2FwaWMuYyBiL2FyY2gveDg2L2t2bS9pb2FwaWMuYwppbmRleCA1ZjQyZDAzLi5jNzIyMGJhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vaW9hcGljLmMKKysrIGIvYXJjaC94ODYva3ZtL2lvYXBpYy5jCkBAIC0xMDksNiArMTA5LDcgQEAKIHsKIAlib29sIG5ld192YWwsIG9sZF92YWw7CiAJc3RydWN0IGt2bV9pb2FwaWMgKmlvYXBpYyA9IHZjcHUtPmt2bS0+YXJjaC52aW9hcGljOworCXN0cnVjdCBkZXN0X21hcCAqZGVzdF9tYXAgPSAmaW9hcGljLT5ydGNfc3RhdHVzLmRlc3RfbWFwOwogCXVuaW9uIGt2bV9pb2FwaWNfcmVkaXJlY3RfZW50cnkgKmU7CiAKIAllID0gJmlvYXBpYy0+cmVkaXJ0YmxbUlRDX0dTSV07CkBAIC0xMTcsMTYgKzExOCwxNyBAQAogCQlyZXR1cm47CiAKIAluZXdfdmFsID0ga3ZtX2FwaWNfcGVuZGluZ19lb2kodmNwdSwgZS0+ZmllbGRzLnZlY3Rvcik7Ci0Jb2xkX3ZhbCA9IHRlc3RfYml0KHZjcHUtPnZjcHVfaWQsIGlvYXBpYy0+cnRjX3N0YXR1cy5kZXN0X21hcC5tYXApOworCW9sZF92YWwgPSB0ZXN0X2JpdCh2Y3B1LT52Y3B1X2lkLCBkZXN0X21hcC0+bWFwKTsKIAogCWlmIChuZXdfdmFsID09IG9sZF92YWwpCiAJCXJldHVybjsKIAogCWlmIChuZXdfdmFsKSB7Ci0JCV9fc2V0X2JpdCh2Y3B1LT52Y3B1X2lkLCBpb2FwaWMtPnJ0Y19zdGF0dXMuZGVzdF9tYXAubWFwKTsKKwkJX19zZXRfYml0KHZjcHUtPnZjcHVfaWQsIGRlc3RfbWFwLT5tYXApOworCQlkZXN0X21hcC0+dmVjdG9yc1t2Y3B1LT52Y3B1X2lkXSA9IGUtPmZpZWxkcy52ZWN0b3I7CiAJCWlvYXBpYy0+cnRjX3N0YXR1cy5wZW5kaW5nX2VvaSsrOwogCX0gZWxzZSB7Ci0JCV9fY2xlYXJfYml0KHZjcHUtPnZjcHVfaWQsIGlvYXBpYy0+cnRjX3N0YXR1cy5kZXN0X21hcC5tYXApOworCQlfX2NsZWFyX2JpdCh2Y3B1LT52Y3B1X2lkLCBkZXN0X21hcC0+bWFwKTsKIAkJaW9hcGljLT5ydGNfc3RhdHVzLnBlbmRpbmdfZW9pLS07CiAJCXJ0Y19zdGF0dXNfcGVuZGluZ19lb2lfY2hlY2tfdmFsaWQoaW9hcGljKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vbGFwaWMuYyBiL2FyY2gveDg2L2t2bS9sYXBpYy5jCmluZGV4IGI2MmM4NTIuLjIzYjk5ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9sYXBpYy5jCisrKyBiL2FyY2gveDg2L2t2bS9sYXBpYy5jCkBAIC0xNzYxLDkgKzE3NjEsMTAgQEAKIAkJaWYgKHZhbHVlICYgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFKSB7CiAJCQlrdm1fYXBpY19zZXRfeGFwaWNfaWQoYXBpYywgdmNwdS0+dmNwdV9pZCk7CiAJCQlzdGF0aWNfa2V5X3Nsb3dfZGVjX2RlZmVycmVkKCZhcGljX2h3X2Rpc2FibGVkKTsKLQkJfSBlbHNlCisJCX0gZWxzZSB7CiAJCQlzdGF0aWNfa2V5X3Nsb3dfaW5jKCZhcGljX2h3X2Rpc2FibGVkLmtleSk7Ci0JCXJlY2FsY3VsYXRlX2FwaWNfbWFwKHZjcHUtPmt2bSk7CisJCQlyZWNhbGN1bGF0ZV9hcGljX21hcCh2Y3B1LT5rdm0pOworCQl9CiAJfQogCiAJaWYgKChvbGRfdmFsdWUgXiB2YWx1ZSkgJiBYMkFQSUNfRU5BQkxFKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vbW11LmMgYi9hcmNoL3g4Ni9rdm0vbW11LmMKaW5kZXggM2Q0Y2M4Y2MuLmQ5YzdlOTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9tbXUuYworKysgYi9hcmNoL3g4Ni9rdm0vbW11LmMKQEAgLTEyMDcsNyArMTIwNyw3IEBACiAgKgogICogUmV0dXJuIHRydWUgaWYgdGxiIG5lZWQgYmUgZmx1c2hlZC4KICAqLwotc3RhdGljIGJvb2wgc3B0ZV93cml0ZV9wcm90ZWN0KHN0cnVjdCBrdm0gKmt2bSwgdTY0ICpzcHRlcCwgYm9vbCBwdF9wcm90ZWN0KQorc3RhdGljIGJvb2wgc3B0ZV93cml0ZV9wcm90ZWN0KHU2NCAqc3B0ZXAsIGJvb2wgcHRfcHJvdGVjdCkKIHsKIAl1NjQgc3B0ZSA9ICpzcHRlcDsKIApAQCAtMTIzMywxMiArMTIzMywxMiBAQAogCWJvb2wgZmx1c2ggPSBmYWxzZTsKIAogCWZvcl9lYWNoX3JtYXBfc3B0ZShybWFwX2hlYWQsICZpdGVyLCBzcHRlcCkKLQkJZmx1c2ggfD0gc3B0ZV93cml0ZV9wcm90ZWN0KGt2bSwgc3B0ZXAsIHB0X3Byb3RlY3QpOworCQlmbHVzaCB8PSBzcHRlX3dyaXRlX3Byb3RlY3Qoc3B0ZXAsIHB0X3Byb3RlY3QpOwogCiAJcmV0dXJuIGZsdXNoOwogfQogCi1zdGF0aWMgYm9vbCBzcHRlX2NsZWFyX2RpcnR5KHN0cnVjdCBrdm0gKmt2bSwgdTY0ICpzcHRlcCkKK3N0YXRpYyBib29sIHNwdGVfY2xlYXJfZGlydHkodTY0ICpzcHRlcCkKIHsKIAl1NjQgc3B0ZSA9ICpzcHRlcDsKIApAQCAtMTI1NiwxMiArMTI1NiwxMiBAQAogCWJvb2wgZmx1c2ggPSBmYWxzZTsKIAogCWZvcl9lYWNoX3JtYXBfc3B0ZShybWFwX2hlYWQsICZpdGVyLCBzcHRlcCkKLQkJZmx1c2ggfD0gc3B0ZV9jbGVhcl9kaXJ0eShrdm0sIHNwdGVwKTsKKwkJZmx1c2ggfD0gc3B0ZV9jbGVhcl9kaXJ0eShzcHRlcCk7CiAKIAlyZXR1cm4gZmx1c2g7CiB9CiAKLXN0YXRpYyBib29sIHNwdGVfc2V0X2RpcnR5KHN0cnVjdCBrdm0gKmt2bSwgdTY0ICpzcHRlcCkKK3N0YXRpYyBib29sIHNwdGVfc2V0X2RpcnR5KHU2NCAqc3B0ZXApCiB7CiAJdTY0IHNwdGUgPSAqc3B0ZXA7CiAKQEAgLTEyNzksNyArMTI3OSw3IEBACiAJYm9vbCBmbHVzaCA9IGZhbHNlOwogCiAJZm9yX2VhY2hfcm1hcF9zcHRlKHJtYXBfaGVhZCwgJml0ZXIsIHNwdGVwKQotCQlmbHVzaCB8PSBzcHRlX3NldF9kaXJ0eShrdm0sIHNwdGVwKTsKKwkJZmx1c2ggfD0gc3B0ZV9zZXRfZGlydHkoc3B0ZXApOwogCiAJcmV0dXJuIGZsdXNoOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3BtdV9hbWQuYyBiL2FyY2gveDg2L2t2bS9wbXVfYW1kLmMKaW5kZXggMzliOTExMi4uY2Q5NDQ0MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3BtdV9hbWQuYworKysgYi9hcmNoL3g4Ni9rdm0vcG11X2FtZC5jCkBAIC0yMyw4ICsyMyw4IEBACiBzdGF0aWMgc3RydWN0IGt2bV9ldmVudF9od190eXBlX21hcHBpbmcgYW1kX2V2ZW50X21hcHBpbmdbXSA9IHsKIAlbMF0gPSB7IDB4NzYsIDB4MDAsIFBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUyB9LAogCVsxXSA9IHsgMHhjMCwgMHgwMCwgUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlMgfSwKLQlbMl0gPSB7IDB4ODAsIDB4MDAsIFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFUyB9LAotCVszXSA9IHsgMHg4MSwgMHgwMCwgUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVMgfSwKKwlbMl0gPSB7IDB4N2QsIDB4MDcsIFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFUyB9LAorCVszXSA9IHsgMHg3ZSwgMHgwNywgUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVMgfSwKIAlbNF0gPSB7IDB4YzIsIDB4MDAsIFBFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OUyB9LAogCVs1XSA9IHsgMHhjMywgMHgwMCwgUEVSRl9DT1VOVF9IV19CUkFOQ0hfTUlTU0VTIH0sCiAJWzZdID0geyAweGQwLCAweDAwLCBQRVJGX0NPVU5UX0hXX1NUQUxMRURfQ1lDTEVTX0ZST05URU5EIH0sCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vc3ZtLmMgYi9hcmNoL3g4Ni9rdm0vc3ZtLmMKaW5kZXggYWY1MjNkOC4uZjgxNTdhMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3N2bS5jCisrKyBiL2FyY2gveDg2L2t2bS9zdm0uYwpAQCAtMzQsNiArMzQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdHJhY2VfZXZlbnRzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2FtZC1pb21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2h0YWJsZS5oPgogCiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vcGVyZl9ldmVudC5oPgpAQCAtNDEsNiArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2RlYnVncmVnLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9wYXJhLmg+CisjaW5jbHVkZSA8YXNtL2lycV9yZW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS92aXJ0ZXh0Lmg+CiAjaW5jbHVkZSAidHJhY2UuaCIKQEAgLTk2LDYgKzk5LDE5IEBACiAjZGVmaW5lIEFWSUNfVU5BQ0NFTF9BQ0NFU1NfT0ZGU0VUX01BU0sJCTB4RkYwCiAjZGVmaW5lIEFWSUNfVU5BQ0NFTF9BQ0NFU1NfVkVDVE9SX01BU0sJCTB4RkZGRkZGRkYKIAorLyogQVZJQyBHQVRBRyBpcyBlbmNvZGVkIHVzaW5nIFZNIGFuZCBWQ1BVIElEcyAqLworI2RlZmluZSBBVklDX1ZDUFVfSURfQklUUwkJOAorI2RlZmluZSBBVklDX1ZDUFVfSURfTUFTSwkJKCgxIDw8IEFWSUNfVkNQVV9JRF9CSVRTKSAtIDEpCisKKyNkZWZpbmUgQVZJQ19WTV9JRF9CSVRTCQkJMjQKKyNkZWZpbmUgQVZJQ19WTV9JRF9OUgkJCSgxIDw8IEFWSUNfVk1fSURfQklUUykKKyNkZWZpbmUgQVZJQ19WTV9JRF9NQVNLCQkJKCgxIDw8IEFWSUNfVk1fSURfQklUUykgLSAxKQorCisjZGVmaW5lIEFWSUNfR0FUQUcoeCwgeSkJCSgoKHggJiBBVklDX1ZNX0lEX01BU0spIDw8IEFWSUNfVkNQVV9JRF9CSVRTKSB8IFwKKwkJCQkJCSh5ICYgQVZJQ19WQ1BVX0lEX01BU0spKQorI2RlZmluZSBBVklDX0dBVEFHX1RPX1ZNSUQoeCkJCSgoeCA+PiBBVklDX1ZDUFVfSURfQklUUykgJiBBVklDX1ZNX0lEX01BU0spCisjZGVmaW5lIEFWSUNfR0FUQUdfVE9fVkNQVUlEKHgpCQkoeCAmIEFWSUNfVkNQVV9JRF9NQVNLKQorCiBzdGF0aWMgYm9vbCBlcnJhdHVtXzM4M19mb3VuZCBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgY29uc3QgdTMyIGhvc3Rfc2F2ZV91c2VyX21zcnNbXSA9IHsKQEAgLTE4NSw2ICsyMDEsMjMgQEAKIAlzdHJ1Y3QgcGFnZSAqYXZpY19iYWNraW5nX3BhZ2U7CiAJdTY0ICphdmljX3BoeXNpY2FsX2lkX2NhY2hlOwogCWJvb2wgYXZpY19pc19ydW5uaW5nOworCisJLyoKKwkgKiBQZXItdmNwdSBsaXN0IG9mIHN0cnVjdCBhbWRfc3ZtX2lvbW11X2lyOgorCSAqIFRoaXMgaXMgdXNlZCBtYWlubHkgdG8gc3RvcmUgaW50ZXJydXB0IHJlbWFwcGluZyBpbmZvcm1hdGlvbiB1c2VkCisJICogd2hlbiB1cGRhdGUgdGhlIHZjcHUgYWZmaW5pdHkuIFRoaXMgYXZvaWRzIHRoZSBuZWVkIHRvIHNjYW4gZm9yCisJICogSVJURSBhbmQgdHJ5IHRvIG1hdGNoIGdhX3RhZyBpbiB0aGUgSU9NTVUgZHJpdmVyLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgaXJfbGlzdDsKKwlzcGlubG9ja190IGlyX2xpc3RfbG9jazsKK307CisKKy8qCisgKiBUaGlzIGlzIGEgd3JhcHBlciBvZiBzdHJ1Y3QgYW1kX2lvbW11X2lyX2RhdGEuCisgKi8KK3N0cnVjdCBhbWRfc3ZtX2lvbW11X2lyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CS8qIFVzZWQgYnkgU1ZNIGZvciBwZXItdmNwdSBpcl9saXN0ICovCisJdm9pZCAqZGF0YTsJCS8qIFN0b3JpbmcgcG9pbnRlciB0byBzdHJ1Y3QgYW1kX2lyX2RhdGEgKi8KIH07CiAKICNkZWZpbmUgQVZJQ19MT0dJQ0FMX0lEX0VOVFJZX0dVRVNUX1BIWVNJQ0FMX0lEX01BU0sJKDB4RkYpCkBAIC0yNDIsNiArMjc1LDEwIEBACiBtb2R1bGVfcGFyYW0oYXZpYywgaW50LCBTX0lSVUdPKTsKICNlbmRpZgogCisvKiBBVklDIFZNIElEIGJpdCBtYXNrcyBhbmQgbG9jayAqLworc3RhdGljIERFQ0xBUkVfQklUTUFQKGF2aWNfdm1faWRfYml0bWFwLCBBVklDX1ZNX0lEX05SKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYXZpY192bV9pZF9sb2NrKTsKKwogc3RhdGljIHZvaWQgc3ZtX3NldF9jcjAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGNyMCk7CiBzdGF0aWMgdm9pZCBzdm1fZmx1c2hfdGxiKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBzdGF0aWMgdm9pZCBzdm1fY29tcGxldGVfaW50ZXJydXB0cyhzdHJ1Y3QgdmNwdV9zdm0gKnN2bSk7CkBAIC05MjgsNiArOTY1LDU1IEBACiAJc2V0X21zcl9pbnRlcmNlcHRpb24obXNycG0sIE1TUl9JQTMyX0xBU1RJTlRUT0lQLCAwLCAwKTsKIH0KIAorLyogTm90ZToKKyAqIFRoaXMgaGFzaCB0YWJsZSBpcyB1c2VkIHRvIG1hcCBWTV9JRCB0byBhIHN0cnVjdCBrdm1fYXJjaCwKKyAqIHdoZW4gaGFuZGxpbmcgQU1EIElPTU1VIEdBTE9HIG5vdGlmaWNhdGlvbiB0byBzY2hlZHVsZSBpbgorICogYSBwYXJ0aWN1bGFyIHZDUFUuCisgKi8KKyNkZWZpbmUgU1ZNX1ZNX0RBVEFfSEFTSF9CSVRTCTgKK0RFQ0xBUkVfSEFTSFRBQkxFKHN2bV92bV9kYXRhX2hhc2gsIFNWTV9WTV9EQVRBX0hBU0hfQklUUyk7CitzdGF0aWMgc3BpbmxvY2tfdCBzdm1fdm1fZGF0YV9oYXNoX2xvY2s7CisKKy8qIE5vdGU6CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIElPTU1VIGRyaXZlciB0byBub3RpZnkKKyAqIFNWTSB0byBzY2hlZHVsZSBpbiBhIHBhcnRpY3VsYXIgdkNQVSBvZiBhIHBhcnRpY3VsYXIgVk0uCisgKi8KK3N0YXRpYyBpbnQgYXZpY19nYV9sb2dfbm90aWZpZXIodTMyIGdhX3RhZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBrdm1fYXJjaCAqa2EgPSBOVUxMOworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IE5VTEw7CisJdTMyIHZtX2lkID0gQVZJQ19HQVRBR19UT19WTUlEKGdhX3RhZyk7CisJdTMyIHZjcHVfaWQgPSBBVklDX0dBVEFHX1RPX1ZDUFVJRChnYV90YWcpOworCisJcHJfZGVidWcoIlNWTTogJXM6IHZtX2lkPSUjeCwgdmNwdV9pZD0lI3hcbiIsIF9fZnVuY19fLCB2bV9pZCwgdmNwdV9pZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3ZtX3ZtX2RhdGFfaGFzaF9sb2NrLCBmbGFncyk7CisJaGFzaF9mb3JfZWFjaF9wb3NzaWJsZShzdm1fdm1fZGF0YV9oYXNoLCBrYSwgaG5vZGUsIHZtX2lkKSB7CisJCXN0cnVjdCBrdm0gKmt2bSA9IGNvbnRhaW5lcl9vZihrYSwgc3RydWN0IGt2bSwgYXJjaCk7CisJCXN0cnVjdCBrdm1fYXJjaCAqdm1fZGF0YSA9ICZrdm0tPmFyY2g7CisKKwkJaWYgKHZtX2RhdGEtPmF2aWNfdm1faWQgIT0gdm1faWQpCisJCQljb250aW51ZTsKKwkJdmNwdSA9IGt2bV9nZXRfdmNwdV9ieV9pZChrdm0sIHZjcHVfaWQpOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ZtX3ZtX2RhdGFfaGFzaF9sb2NrLCBmbGFncyk7CisKKwlpZiAoIXZjcHUpCisJCXJldHVybiAwOworCisJLyogTm90ZToKKwkgKiBBdCB0aGlzIHBvaW50LCB0aGUgSU9NTVUgc2hvdWxkIGhhdmUgYWxyZWFkeSBzZXQgdGhlIHBlbmRpbmcKKwkgKiBiaXQgaW4gdGhlIHZBUElDIGJhY2tpbmcgcGFnZS4gU28sIHdlIGp1c3QgbmVlZCB0byBzY2hlZHVsZQorCSAqIGluIHRoZSB2Y3B1LgorCSAqLworCWlmICh2Y3B1LT5tb2RlID09IE9VVFNJREVfR1VFU1RfTU9ERSkKKwkJa3ZtX3ZjcHVfd2FrZV91cCh2Y3B1KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgX19pbml0IGludCBzdm1faGFyZHdhcmVfc2V0dXAodm9pZCkKIHsKIAlpbnQgY3B1OwpAQCAtOTg2LDEwICsxMDcyLDE1IEBACiAJaWYgKGF2aWMpIHsKIAkJaWYgKCFucHRfZW5hYmxlZCB8fAogCQkgICAgIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVklDKSB8fAotCQkgICAgIUlTX0VOQUJMRUQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKSkKKwkJICAgICFJU19FTkFCTEVEKENPTkZJR19YODZfTE9DQUxfQVBJQykpIHsKIAkJCWF2aWMgPSBmYWxzZTsKLQkJZWxzZQorCQl9IGVsc2UgewogCQkJcHJfaW5mbygiQVZJQyBlbmFibGVkXG4iKTsKKworCQkJaGFzaF9pbml0KHN2bV92bV9kYXRhX2hhc2gpOworCQkJc3Bpbl9sb2NrX2luaXQoJnN2bV92bV9kYXRhX2hhc2hfbG9jayk7CisJCQlhbWRfaW9tbXVfcmVnaXN0ZXJfZ2FfbG9nX25vdGlmaWVyKCZhdmljX2dhX2xvZ19ub3RpZmllcik7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEwMjgsMTMgKzExMTksNiBAQAogCXNlZy0+YmFzZSA9IDA7CiB9CiAKLXN0YXRpYyB1NjQgc3ZtX3JlYWRfdHNjX29mZnNldChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0Jc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7Ci0KLQlyZXR1cm4gc3ZtLT52bWNiLT5jb250cm9sLnRzY19vZmZzZXQ7Ci19Ci0KIHN0YXRpYyB2b2lkIHN2bV93cml0ZV90c2Nfb2Zmc2V0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IG9mZnNldCkKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKQEAgLTEyODAsMTkgKzEzNjQsNTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYXZpY19nZXRfbmV4dF92bV9pZCh2b2lkKQoreworCWludCBpZDsKKworCXNwaW5fbG9jaygmYXZpY192bV9pZF9sb2NrKTsKKworCS8qIEFWSUMgVk0gSUQgaXMgb25lLWJhc2VkLiAqLworCWlkID0gZmluZF9uZXh0X3plcm9fYml0KGF2aWNfdm1faWRfYml0bWFwLCBBVklDX1ZNX0lEX05SLCAxKTsKKwlpZiAoaWQgPD0gQVZJQ19WTV9JRF9NQVNLKQorCQlfX3NldF9iaXQoaWQsIGF2aWNfdm1faWRfYml0bWFwKTsKKwllbHNlCisJCWlkID0gLUVBR0FJTjsKKworCXNwaW5fdW5sb2NrKCZhdmljX3ZtX2lkX2xvY2spOworCXJldHVybiBpZDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXZpY19mcmVlX3ZtX2lkKGludCBpZCkKK3sKKwlpZiAoaWQgPD0gMCB8fCBpZCA+IEFWSUNfVk1fSURfTUFTSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2soJmF2aWNfdm1faWRfbG9jayk7CisJX19jbGVhcl9iaXQoaWQsIGF2aWNfdm1faWRfYml0bWFwKTsKKwlzcGluX3VubG9jaygmYXZpY192bV9pZF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgYXZpY192bV9kZXN0cm95KHN0cnVjdCBrdm0gKmt2bSkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBrdm1fYXJjaCAqdm1fZGF0YSA9ICZrdm0tPmFyY2g7CiAKKwlhdmljX2ZyZWVfdm1faWQodm1fZGF0YS0+YXZpY192bV9pZCk7CisKIAlpZiAodm1fZGF0YS0+YXZpY19sb2dpY2FsX2lkX3RhYmxlX3BhZ2UpCiAJCV9fZnJlZV9wYWdlKHZtX2RhdGEtPmF2aWNfbG9naWNhbF9pZF90YWJsZV9wYWdlKTsKIAlpZiAodm1fZGF0YS0+YXZpY19waHlzaWNhbF9pZF90YWJsZV9wYWdlKQogCQlfX2ZyZWVfcGFnZSh2bV9kYXRhLT5hdmljX3BoeXNpY2FsX2lkX3RhYmxlX3BhZ2UpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN2bV92bV9kYXRhX2hhc2hfbG9jaywgZmxhZ3MpOworCWhhc2hfZGVsKCZ2bV9kYXRhLT5obm9kZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ZtX3ZtX2RhdGFfaGFzaF9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgYXZpY192bV9pbml0KHN0cnVjdCBrdm0gKmt2bSkKIHsKLQlpbnQgZXJyID0gLUVOT01FTTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB2bV9pZCwgZXJyID0gLUVOT01FTTsKIAlzdHJ1Y3Qga3ZtX2FyY2ggKnZtX2RhdGEgPSAma3ZtLT5hcmNoOwogCXN0cnVjdCBwYWdlICpwX3BhZ2U7CiAJc3RydWN0IHBhZ2UgKmxfcGFnZTsKQEAgLTEzMDAsNiArMTQyMCwxMSBAQAogCWlmICghYXZpYykKIAkJcmV0dXJuIDA7CiAKKwl2bV9pZCA9IGF2aWNfZ2V0X25leHRfdm1faWQoKTsKKwlpZiAodm1faWQgPCAwKQorCQlyZXR1cm4gdm1faWQ7CisJdm1fZGF0YS0+YXZpY192bV9pZCA9ICh1MzIpdm1faWQ7CisKIAkvKiBBbGxvY2F0aW5nIHBoeXNpY2FsIEFQSUMgSUQgdGFibGUgKDRLQikgKi8KIAlwX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwogCWlmICghcF9wYWdlKQpAQCAtMTMxNiw2ICsxNDQxLDEwIEBACiAJdm1fZGF0YS0+YXZpY19sb2dpY2FsX2lkX3RhYmxlX3BhZ2UgPSBsX3BhZ2U7CiAJY2xlYXJfcGFnZShwYWdlX2FkZHJlc3MobF9wYWdlKSk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3ZtX3ZtX2RhdGFfaGFzaF9sb2NrLCBmbGFncyk7CisJaGFzaF9hZGQoc3ZtX3ZtX2RhdGFfaGFzaCwgJnZtX2RhdGEtPmhub2RlLCB2bV9kYXRhLT5hdmljX3ZtX2lkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdm1fdm1fZGF0YV9oYXNoX2xvY2ssIGZsYWdzKTsKKwogCXJldHVybiAwOwogCiBmcmVlX2F2aWM6CkBAIC0xMzIzLDMxICsxNDUyLDM0IEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgVkNQVSBoYWx0L3VuaGFsdC4KLSAqLwotc3RhdGljIHZvaWQgYXZpY19zZXRfcnVubmluZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgaXNfcnVuKQorc3RhdGljIGlubGluZSBpbnQKK2F2aWNfdXBkYXRlX2lvbW11X3ZjcHVfYWZmaW5pdHkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgY3B1LCBib29sIHIpCiB7Ci0JdTY0IGVudHJ5OwotCWludCBoX3BoeXNpY2FsX2lkID0ga3ZtX2NwdV9nZXRfYXBpY2lkKHZjcHUtPmNwdSk7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYW1kX3N2bV9pb21tdV9pciAqaXI7CiAJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CiAKLQlpZiAoIWt2bV92Y3B1X2FwaWN2X2FjdGl2ZSh2Y3B1KSkKLQkJcmV0dXJuOworCWlmICgha3ZtX2FyY2hfaGFzX2Fzc2lnbmVkX2RldmljZSh2Y3B1LT5rdm0pKQorCQlyZXR1cm4gMDsKIAotCXN2bS0+YXZpY19pc19ydW5uaW5nID0gaXNfcnVuOworCS8qCisJICogSGVyZSwgd2UgZ28gdGhyb3VnaCB0aGUgcGVyLXZjcHUgaXJfbGlzdCB0byB1cGRhdGUgYWxsIGV4aXN0aW5nCisJICogaW50ZXJydXB0IHJlbWFwcGluZyB0YWJsZSBlbnRyeSB0YXJnZXRpbmcgdGhpcyB2Y3B1LgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzdm0tPmlyX2xpc3RfbG9jaywgZmxhZ3MpOwogCi0JLyogSUQgPSAweGZmIChicm9hZGNhc3QpLCBJRCA+IDB4ZmYgKHJlc2VydmVkKSAqLwotCWlmIChXQVJOX09OKGhfcGh5c2ljYWxfaWQgPj0gQVZJQ19NQVhfUEhZU0lDQUxfSURfQ09VTlQpKQotCQlyZXR1cm47CisJaWYgKGxpc3RfZW1wdHkoJnN2bS0+aXJfbGlzdCkpCisJCWdvdG8gb3V0OwogCi0JZW50cnkgPSBSRUFEX09OQ0UoKihzdm0tPmF2aWNfcGh5c2ljYWxfaWRfY2FjaGUpKTsKLQlXQVJOX09OKGlzX3J1biA9PSAhIShlbnRyeSAmIEFWSUNfUEhZU0lDQUxfSURfRU5UUllfSVNfUlVOTklOR19NQVNLKSk7Ci0KLQllbnRyeSAmPSB+QVZJQ19QSFlTSUNBTF9JRF9FTlRSWV9JU19SVU5OSU5HX01BU0s7Ci0JaWYgKGlzX3J1bikKLQkJZW50cnkgfD0gQVZJQ19QSFlTSUNBTF9JRF9FTlRSWV9JU19SVU5OSU5HX01BU0s7Ci0JV1JJVEVfT05DRSgqKHN2bS0+YXZpY19waHlzaWNhbF9pZF9jYWNoZSksIGVudHJ5KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlyLCAmc3ZtLT5pcl9saXN0LCBub2RlKSB7CisJCXJldCA9IGFtZF9pb21tdV91cGRhdGVfZ2EoY3B1LCByLCBpci0+ZGF0YSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3ZtLT5pcl9saXN0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBhdmljX3ZjcHVfbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBjcHUpCkBAIC0xMzc0LDYgKzE1MDYsOCBAQAogCQllbnRyeSB8PSBBVklDX1BIWVNJQ0FMX0lEX0VOVFJZX0lTX1JVTk5JTkdfTUFTSzsKIAogCVdSSVRFX09OQ0UoKihzdm0tPmF2aWNfcGh5c2ljYWxfaWRfY2FjaGUpLCBlbnRyeSk7CisJYXZpY191cGRhdGVfaW9tbXVfdmNwdV9hZmZpbml0eSh2Y3B1LCBoX3BoeXNpY2FsX2lkLAorCQkJCQlzdm0tPmF2aWNfaXNfcnVubmluZyk7CiB9CiAKIHN0YXRpYyB2b2lkIGF2aWNfdmNwdV9wdXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMTM4NSwxMCArMTUxOSwyNyBAQAogCQlyZXR1cm47CiAKIAllbnRyeSA9IFJFQURfT05DRSgqKHN2bS0+YXZpY19waHlzaWNhbF9pZF9jYWNoZSkpOworCWlmIChlbnRyeSAmIEFWSUNfUEhZU0lDQUxfSURfRU5UUllfSVNfUlVOTklOR19NQVNLKQorCQlhdmljX3VwZGF0ZV9pb21tdV92Y3B1X2FmZmluaXR5KHZjcHUsIC0xLCAwKTsKKwogCWVudHJ5ICY9IH5BVklDX1BIWVNJQ0FMX0lEX0VOVFJZX0lTX1JVTk5JTkdfTUFTSzsKIAlXUklURV9PTkNFKCooc3ZtLT5hdmljX3BoeXNpY2FsX2lkX2NhY2hlKSwgZW50cnkpOwogfQogCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBWQ1BVIGhhbHQvdW5oYWx0LgorICovCitzdGF0aWMgdm9pZCBhdmljX3NldF9ydW5uaW5nKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgYm9vbCBpc19ydW4pCit7CisJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CisKKwlzdm0tPmF2aWNfaXNfcnVubmluZyA9IGlzX3J1bjsKKwlpZiAoaXNfcnVuKQorCQlhdmljX3ZjcHVfbG9hZCh2Y3B1LCB2Y3B1LT5jcHUpOworCWVsc2UKKwkJYXZpY192Y3B1X3B1dCh2Y3B1KTsKK30KKwogc3RhdGljIHZvaWQgc3ZtX3ZjcHVfcmVzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sIGluaXRfZXZlbnQpCiB7CiAJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CkBAIC0xNDUwLDYgKzE2MDEsOSBAQAogCQllcnIgPSBhdmljX2luaXRfYmFja2luZ19wYWdlKCZzdm0tPnZjcHUpOwogCQlpZiAoZXJyKQogCQkJZ290byBmcmVlX3BhZ2U0OworCisJCUlOSVRfTElTVF9IRUFEKCZzdm0tPmlyX2xpc3QpOworCQlzcGluX2xvY2tfaW5pdCgmc3ZtLT5pcl9saXN0X2xvY2spOwogCX0KIAogCS8qIFdlIGluaXRpYWxpemUgdGhpcyBmbGFnIHRvIHRydWUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGlzX3J1bm5pbmcKQEAgLTQyNDYsNiArNDQwMCwyMDkgQEAKIAkJa3ZtX3ZjcHVfd2FrZV91cCh2Y3B1KTsKIH0KIAorc3RhdGljIHZvaWQgc3ZtX2lyX2xpc3RfZGVsKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtLCBzdHJ1Y3QgYW1kX2lvbW11X3BpX2RhdGEgKnBpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFtZF9zdm1faW9tbXVfaXIgKmN1cjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdm0tPmlyX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyLCAmc3ZtLT5pcl9saXN0LCBub2RlKSB7CisJCWlmIChjdXItPmRhdGEgIT0gcGktPmlyX2RhdGEpCisJCQljb250aW51ZTsKKwkJbGlzdF9kZWwoJmN1ci0+bm9kZSk7CisJCWtmcmVlKGN1cik7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdm0tPmlyX2xpc3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHN2bV9pcl9saXN0X2FkZChzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgc3RydWN0IGFtZF9pb21tdV9waV9kYXRhICpwaSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhbWRfc3ZtX2lvbW11X2lyICppcjsKKworCS8qKgorCSAqIEluIHNvbWUgY2FzZXMsIHRoZSBleGlzdGluZyBpcnRlIGlzIHVwZGFlZCBhbmQgcmUtc2V0LAorCSAqIHNvIHdlIG5lZWQgdG8gY2hlY2sgaGVyZSBpZiBpdCdzIGFscmVhZHkgYmVlbiAqIGFkZGVkCisJICogdG8gdGhlIGlyX2xpc3QuCisJICovCisJaWYgKHBpLT5pcl9kYXRhICYmIChwaS0+cHJldl9nYV90YWcgIT0gMCkpIHsKKwkJc3RydWN0IGt2bSAqa3ZtID0gc3ZtLT52Y3B1Lmt2bTsKKwkJdTMyIHZjcHVfaWQgPSBBVklDX0dBVEFHX1RPX1ZDUFVJRChwaS0+cHJldl9nYV90YWcpOworCQlzdHJ1Y3Qga3ZtX3ZjcHUgKnByZXZfdmNwdSA9IGt2bV9nZXRfdmNwdV9ieV9pZChrdm0sIHZjcHVfaWQpOworCQlzdHJ1Y3QgdmNwdV9zdm0gKnByZXZfc3ZtOworCisJCWlmICghcHJldl92Y3B1KSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlwcmV2X3N2bSA9IHRvX3N2bShwcmV2X3ZjcHUpOworCQlzdm1faXJfbGlzdF9kZWwocHJldl9zdm0sIHBpKTsKKwl9CisKKwkvKioKKwkgKiBBbGxvY2F0aW5nIG5ldyBhbWRfaW9tbXVfcGlfZGF0YSwgd2hpY2ggd2lsbCBnZXQKKwkgKiBhZGQgdG8gdGhlIHBlci12Y3B1IGlyX2xpc3QuCisJICovCisJaXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYW1kX3N2bV9pb21tdV9pciksIEdGUF9LRVJORUwpOworCWlmICghaXIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWlyLT5kYXRhID0gcGktPmlyX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3ZtLT5pcl9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmaXItPm5vZGUsICZzdm0tPmlyX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN2bS0+aXJfbGlzdF9sb2NrLCBmbGFncyk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBOb3RlOgorICogVGhlIEhXIGNhbm5vdCBzdXBwb3J0IHBvc3RpbmcgbXVsdGljYXN0L2Jyb2FkY2FzdAorICogaW50ZXJydXB0cyB0byBhIHZDUFUuIFNvLCB3ZSBzdGlsbCB1c2UgbGVnYWN5IGludGVycnVwdAorICogcmVtYXBwaW5nIGZvciB0aGVzZSBraW5kIG9mIGludGVycnVwdHMuCisgKgorICogRm9yIGxvd2VzdC1wcmlvcml0eSBpbnRlcnJ1cHRzLCB3ZSBvbmx5IHN1cHBvcnQKKyAqIHRob3NlIHdpdGggc2luZ2xlIENQVSBhcyB0aGUgZGVzdGluYXRpb24sIGUuZy4gdXNlcgorICogY29uZmlndXJlcyB0aGUgaW50ZXJydXB0cyB2aWEgL3Byb2MvaXJxIG9yIHVzZXMKKyAqIGlycWJhbGFuY2UgdG8gbWFrZSB0aGUgaW50ZXJydXB0cyBzaW5nbGUtQ1BVLgorICovCitzdGF0aWMgaW50CitnZXRfcGlfdmNwdV9pbmZvKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9rZXJuZWxfaXJxX3JvdXRpbmdfZW50cnkgKmUsCisJCSBzdHJ1Y3QgdmNwdV9kYXRhICp2Y3B1X2luZm8sIHN0cnVjdCB2Y3B1X3N2bSAqKnN2bSkKK3sKKwlzdHJ1Y3Qga3ZtX2xhcGljX2lycSBpcnE7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gTlVMTDsKKworCWt2bV9zZXRfbXNpX2lycShrdm0sIGUsICZpcnEpOworCisJaWYgKCFrdm1faW50cl9pc19zaW5nbGVfdmNwdShrdm0sICZpcnEsICZ2Y3B1KSkgeworCQlwcl9kZWJ1ZygiU1ZNOiAlczogdXNlIGxlZ2FjeSBpbnRyIHJlbWFwIG1vZGUgZm9yIGlycSAldVxuIiwKKwkJCSBfX2Z1bmNfXywgaXJxLnZlY3Rvcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcl9kZWJ1ZygiU1ZNOiAlczogdXNlIEdBIG1vZGUgZm9yIGlycSAldVxuIiwgX19mdW5jX18sCisJCSBpcnEudmVjdG9yKTsKKwkqc3ZtID0gdG9fc3ZtKHZjcHUpOworCXZjcHVfaW5mby0+cGlfZGVzY19hZGRyID0gcGFnZV90b19waHlzKCgqc3ZtKS0+YXZpY19iYWNraW5nX3BhZ2UpOworCXZjcHVfaW5mby0+dmVjdG9yID0gaXJxLnZlY3RvcjsKKworCXJldHVybiAwOworfQorCisvKgorICogc3ZtX3VwZGF0ZV9waV9pcnRlIC0gc2V0IElSVEUgZm9yIFBvc3RlZC1JbnRlcnJ1cHRzCisgKgorICogQGt2bToga3ZtCisgKiBAaG9zdF9pcnE6IGhvc3QgaXJxIG9mIHRoZSBpbnRlcnJ1cHQKKyAqIEBndWVzdF9pcnE6IGdzaSBvZiB0aGUgaW50ZXJydXB0CisgKiBAc2V0OiBzZXQgb3IgdW5zZXQgUEkKKyAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8IDAgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IHN2bV91cGRhdGVfcGlfaXJ0ZShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGludCBob3N0X2lycSwKKwkJCSAgICAgIHVpbnQzMl90IGd1ZXN0X2lycSwgYm9vbCBzZXQpCit7CisJc3RydWN0IGt2bV9rZXJuZWxfaXJxX3JvdXRpbmdfZW50cnkgKmU7CisJc3RydWN0IGt2bV9pcnFfcm91dGluZ190YWJsZSAqaXJxX3J0OworCWludCBpZHgsIHJldCA9IC1FSU5WQUw7CisKKwlpZiAoIWt2bV9hcmNoX2hhc19hc3NpZ25lZF9kZXZpY2Uoa3ZtKSB8fAorCSAgICAhaXJxX3JlbWFwcGluZ19jYXAoSVJRX1BPU1RJTkdfQ0FQKSkKKwkJcmV0dXJuIDA7CisKKwlwcl9kZWJ1ZygiU1ZNOiAlczogaG9zdF9pcnE9JSN4LCBndWVzdF9pcnE9JSN4LCBzZXQ9JSN4XG4iLAorCQkgX19mdW5jX18sIGhvc3RfaXJxLCBndWVzdF9pcnEsIHNldCk7CisKKwlpZHggPSBzcmN1X3JlYWRfbG9jaygma3ZtLT5pcnFfc3JjdSk7CisJaXJxX3J0ID0gc3JjdV9kZXJlZmVyZW5jZShrdm0tPmlycV9yb3V0aW5nLCAma3ZtLT5pcnFfc3JjdSk7CisJV0FSTl9PTihndWVzdF9pcnEgPj0gaXJxX3J0LT5ucl9ydF9lbnRyaWVzKTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsICZpcnFfcnQtPm1hcFtndWVzdF9pcnFdLCBsaW5rKSB7CisJCXN0cnVjdCB2Y3B1X2RhdGEgdmNwdV9pbmZvOworCQlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IE5VTEw7CisKKwkJaWYgKGUtPnR5cGUgIT0gS1ZNX0lSUV9ST1VUSU5HX01TSSkKKwkJCWNvbnRpbnVlOworCisJCS8qKgorCQkgKiBIZXJlLCB3ZSBzZXR1cCB3aXRoIGxlZ2FjeSBtb2RlIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisJCSAqIDEuIFdoZW4gY2Fubm90IHRhcmdldCBpbnRlcnJ1cHQgdG8gYSBzcGVjaWZpYyB2Y3B1LgorCQkgKiAyLiBVbnNldHRpbmcgcG9zdGVkIGludGVycnVwdC4KKwkJICogMy4gQVBJQyB2aXJ0aWFsaXphdGlvbiBpcyBkaXNhYmxlZCBmb3IgdGhlIHZjcHUuCisJCSAqLworCQlpZiAoIWdldF9waV92Y3B1X2luZm8oa3ZtLCBlLCAmdmNwdV9pbmZvLCAmc3ZtKSAmJiBzZXQgJiYKKwkJICAgIGt2bV92Y3B1X2FwaWN2X2FjdGl2ZSgmc3ZtLT52Y3B1KSkgeworCQkJc3RydWN0IGFtZF9pb21tdV9waV9kYXRhIHBpOworCisJCQkvKiBUcnkgdG8gZW5hYmxlIGd1ZXN0X21vZGUgaW4gSVJURSAqLworCQkJcGkuYmFzZSA9IHBhZ2VfdG9fcGh5cyhzdm0tPmF2aWNfYmFja2luZ19wYWdlKSAmIEFWSUNfSFBBX01BU0s7CisJCQlwaS5nYV90YWcgPSBBVklDX0dBVEFHKGt2bS0+YXJjaC5hdmljX3ZtX2lkLAorCQkJCQkJICAgICBzdm0tPnZjcHUudmNwdV9pZCk7CisJCQlwaS5pc19ndWVzdF9tb2RlID0gdHJ1ZTsKKwkJCXBpLnZjcHVfZGF0YSA9ICZ2Y3B1X2luZm87CisJCQlyZXQgPSBpcnFfc2V0X3ZjcHVfYWZmaW5pdHkoaG9zdF9pcnEsICZwaSk7CisKKwkJCS8qKgorCQkJICogSGVyZSwgd2Ugc3VjY2Vzc2Z1bGx5IHNldHRpbmcgdXAgdmNwdSBhZmZpbml0eSBpbgorCQkJICogSU9NTVUgZ3Vlc3QgbW9kZS4gTm93LCB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBwb3N0ZWQKKwkJCSAqIGludGVycnVwdCBpbmZvcm1hdGlvbiBpbiBhIHBlci12Y3B1IGlyX2xpc3Qgc28gdGhhdAorCQkJICogd2UgY2FuIHJlZmVyZW5jZSB0byB0aGVtIGRpcmVjdGx5IHdoZW4gd2UgdXBkYXRlIHZjcHUKKwkJCSAqIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gaW4gSU9NTVUgaXJ0ZS4KKwkJCSAqLworCQkJaWYgKCFyZXQgJiYgcGkuaXNfZ3Vlc3RfbW9kZSkKKwkJCQlzdm1faXJfbGlzdF9hZGQoc3ZtLCAmcGkpOworCQl9IGVsc2UgeworCQkJLyogVXNlIGxlZ2FjeSBtb2RlIGluIElSVEUgKi8KKwkJCXN0cnVjdCBhbWRfaW9tbXVfcGlfZGF0YSBwaTsKKworCQkJLyoqCisJCQkgKiBIZXJlLCBwaSBpcyB1c2VkIHRvOgorCQkJICogLSBUZWxsIElPTU1VIHRvIHVzZSBsZWdhY3kgbW9kZSBmb3IgdGhpcyBpbnRlcnJ1cHQuCisJCQkgKiAtIFJldHJpZXZlIGdhX3RhZyBvZiBwcmlvciBpbnRlcnJ1cHQgcmVtYXBwaW5nIGRhdGEuCisJCQkgKi8KKwkJCXBpLmlzX2d1ZXN0X21vZGUgPSBmYWxzZTsKKwkJCXJldCA9IGlycV9zZXRfdmNwdV9hZmZpbml0eShob3N0X2lycSwgJnBpKTsKKworCQkJLyoqCisJCQkgKiBDaGVjayBpZiB0aGUgcG9zdGVkIGludGVycnVwdCB3YXMgcHJldmlvdXNseQorCQkJICogc2V0dXAgd2l0aCB0aGUgZ3Vlc3RfbW9kZSBieSBjaGVja2luZyBpZiB0aGUgZ2FfdGFnCisJCQkgKiB3YXMgY2FjaGVkLiBJZiBzbywgd2UgbmVlZCB0byBjbGVhbiB1cCB0aGUgcGVyLXZjcHUKKwkJCSAqIGlyX2xpc3QuCisJCQkgKi8KKwkJCWlmICghcmV0ICYmIHBpLnByZXZfZ2FfdGFnKSB7CisJCQkJaW50IGlkID0gQVZJQ19HQVRBR19UT19WQ1BVSUQocGkucHJldl9nYV90YWcpOworCQkJCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKworCQkJCXZjcHUgPSBrdm1fZ2V0X3ZjcHVfYnlfaWQoa3ZtLCBpZCk7CisJCQkJaWYgKHZjcHUpCisJCQkJCXN2bV9pcl9saXN0X2RlbCh0b19zdm0odmNwdSksICZwaSk7CisJCQl9CisJCX0KKworCQlpZiAoIXJldCAmJiBzdm0pIHsKKwkJCXRyYWNlX2t2bV9waV9pcnRlX3VwZGF0ZShzdm0tPnZjcHUudmNwdV9pZCwKKwkJCQkJCSBob3N0X2lycSwgZS0+Z3NpLAorCQkJCQkJIHZjcHVfaW5mby52ZWN0b3IsCisJCQkJCQkgdmNwdV9pbmZvLnBpX2Rlc2NfYWRkciwgc2V0KTsKKwkJfQorCisJCWlmIChyZXQgPCAwKSB7CisJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gdXBkYXRlIFBJIElSVEVcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmV0ID0gMDsKK291dDoKKwlzcmN1X3JlYWRfdW5sb2NrKCZrdm0tPmlycV9zcmN1LCBpZHgpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgc3ZtX25taV9hbGxvd2VkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKQEAgLTQ5NjEsNyArNTMxOCw3IEBACiAJYXZpY19oYW5kbGVfbGRyX3VwZGF0ZSh2Y3B1KTsKIH0KIAotc3RhdGljIHN0cnVjdCBrdm1feDg2X29wcyBzdm1feDg2X29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qga3ZtX3g4Nl9vcHMgc3ZtX3g4Nl9vcHMgX19yb19hZnRlcl9pbml0ID0gewogCS5jcHVfaGFzX2t2bV9zdXBwb3J0ID0gaGFzX3N2bSwKIAkuZGlzYWJsZWRfYnlfYmlvcyA9IGlzX2Rpc2FibGVkLAogCS5oYXJkd2FyZV9zZXR1cCA9IHN2bV9oYXJkd2FyZV9zZXR1cCwKQEAgLTUwNjQsNyArNTQyMSw2IEBACiAKIAkuaGFzX3diaW52ZF9leGl0ID0gc3ZtX2hhc193YmludmRfZXhpdCwKIAotCS5yZWFkX3RzY19vZmZzZXQgPSBzdm1fcmVhZF90c2Nfb2Zmc2V0LAogCS53cml0ZV90c2Nfb2Zmc2V0ID0gc3ZtX3dyaXRlX3RzY19vZmZzZXQsCiAJLmFkanVzdF90c2Nfb2Zmc2V0X2d1ZXN0ID0gc3ZtX2FkanVzdF90c2Nfb2Zmc2V0X2d1ZXN0LAogCS5yZWFkX2wxX3RzYyA9IHN2bV9yZWFkX2wxX3RzYywKQEAgLTUwNzgsNiArNTQzNCw3IEBACiAKIAkucG11X29wcyA9ICZhbWRfcG11X29wcywKIAkuZGVsaXZlcl9wb3N0ZWRfaW50ZXJydXB0ID0gc3ZtX2RlbGl2ZXJfYXZpY19pbnRyLAorCS51cGRhdGVfcGlfaXJ0ZSA9IHN2bV91cGRhdGVfcGlfaXJ0ZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHN2bV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vdm14LmMgYi9hcmNoL3g4Ni9rdm0vdm14LmMKaW5kZXggNWNlZGU0MC4uY2YxYjE2ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3ZteC5jCisrKyBiL2FyY2gveDg2L2t2bS92bXguYwpAQCAtOTI3LDYgKzkyNyw4IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm14X21zcl9iaXRtYXBfbG9uZ21vZGU7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYzsKIHN0YXRpYyB1bnNpZ25lZCBsb25nICp2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpY19hcGljdl9pbmFjdGl2ZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWNfYXBpY3ZfaW5hY3RpdmU7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm14X3ZtcmVhZF9iaXRtYXA7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm14X3Ztd3JpdGVfYml0bWFwOwogCkBAIC05MzksNiArOTQxLDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgdm1jc19jb25maWcgewogCWludCBzaXplOwogCWludCBvcmRlcjsKKwl1MzIgYmFzaWNfY2FwOwogCXUzMiByZXZpc2lvbl9pZDsKIAl1MzIgcGluX2Jhc2VkX2V4ZWNfY3RybDsKIAl1MzIgY3B1X2Jhc2VkX2V4ZWNfY3RybDsKQEAgLTEyMTUsNiArMTIxOCwxMSBAQAogCQlTRUNPTkRBUllfRVhFQ19QQVVTRV9MT09QX0VYSVRJTkc7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBjcHVfaGFzX3ZteF9iYXNpY19pbm91dCh2b2lkKQoreworCXJldHVybgkoKCh1NjQpdm1jc19jb25maWcuYmFzaWNfY2FwIDw8IDMyKSAmIFZNWF9CQVNJQ19JTk9VVCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBjcHVfbmVlZF92aXJ0dWFsaXplX2FwaWNfYWNjZXNzZXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXJldHVybiBmbGV4cHJpb3JpdHlfZW5hYmxlZCAmJiBsYXBpY19pbl9rZXJuZWwodmNwdSk7CkBAIC0yNTE4LDEwICsyNTI2LDE3IEBACiAJZWxzZSBpZiAoY3B1X2hhc19zZWNvbmRhcnlfZXhlY19jdHJscygpICYmCiAJCSAodm1jc19yZWFkMzIoU0VDT05EQVJZX1ZNX0VYRUNfQ09OVFJPTCkgJgogCQkgIFNFQ09OREFSWV9FWEVDX1ZJUlRVQUxJWkVfWDJBUElDX01PREUpKSB7Ci0JCWlmIChpc19sb25nX21vZGUodmNwdSkpCi0JCQltc3JfYml0bWFwID0gdm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljOwotCQllbHNlCi0JCQltc3JfYml0bWFwID0gdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYzsKKwkJaWYgKGVuYWJsZV9hcGljdiAmJiBrdm1fdmNwdV9hcGljdl9hY3RpdmUodmNwdSkpIHsKKwkJCWlmIChpc19sb25nX21vZGUodmNwdSkpCisJCQkJbXNyX2JpdG1hcCA9IHZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpYzsKKwkJCWVsc2UKKwkJCQltc3JfYml0bWFwID0gdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYzsKKwkJfSBlbHNlIHsKKwkJCWlmIChpc19sb25nX21vZGUodmNwdSkpCisJCQkJbXNyX2JpdG1hcCA9IHZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpY19hcGljdl9pbmFjdGl2ZTsKKwkJCWVsc2UKKwkJCQltc3JfYml0bWFwID0gdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpY19hcGljdl9pbmFjdGl2ZTsKKwkJfQogCX0gZWxzZSB7CiAJCWlmIChpc19sb25nX21vZGUodmNwdSkpCiAJCQltc3JfYml0bWFwID0gdm14X21zcl9iaXRtYXBfbG9uZ21vZGU7CkBAIC0yNjAzLDExICsyNjE4LDYgQEAKIAlyZXR1cm4gaG9zdF90c2MgKyB0c2Nfb2Zmc2V0OwogfQogCi1zdGF0aWMgdTY0IHZteF9yZWFkX3RzY19vZmZzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXJldHVybiB2bWNzX3JlYWQ2NChUU0NfT0ZGU0VUKTsKLX0KLQogLyoKICAqIHdyaXRlcyAnb2Zmc2V0JyBpbnRvIGd1ZXN0J3MgdGltZXN0YW1wIGNvdW50ZXIgb2Zmc2V0IHJlZ2lzdGVyCiAgKi8KQEAgLTI4NzcsNiArMjg4Nyw4IEBACiAJCSpwZGF0YSA9IFZNQ1MxMl9SRVZJU0lPTiB8IFZNWF9CQVNJQ19UUlVFX0NUTFMgfAogCQkJICAgKCh1NjQpVk1DUzEyX1NJWkUgPDwgVk1YX0JBU0lDX1ZNQ1NfU0laRV9TSElGVCkgfAogCQkJICAgKFZNWF9CQVNJQ19NRU1fVFlQRV9XQiA8PCBWTVhfQkFTSUNfTUVNX1RZUEVfU0hJRlQpOworCQlpZiAoY3B1X2hhc192bXhfYmFzaWNfaW5vdXQoKSkKKwkJCSpwZGF0YSB8PSBWTVhfQkFTSUNfSU5PVVQ7CiAJCWJyZWFrOwogCWNhc2UgTVNSX0lBMzJfVk1YX1RSVUVfUElOQkFTRURfQ1RMUzoKIAljYXNlIE1TUl9JQTMyX1ZNWF9QSU5CQVNFRF9DVExTOgpAQCAtMzQ1Nyw3ICszNDY5LDggQEAKIAkJcmV0dXJuIC1FSU87CiAKIAl2bWNzX2NvbmYtPnNpemUgPSB2bXhfbXNyX2hpZ2ggJiAweDFmZmY7Ci0Jdm1jc19jb25mLT5vcmRlciA9IGdldF9vcmRlcih2bWNzX2NvbmZpZy5zaXplKTsKKwl2bWNzX2NvbmYtPm9yZGVyID0gZ2V0X29yZGVyKHZtY3NfY29uZi0+c2l6ZSk7CisJdm1jc19jb25mLT5iYXNpY19jYXAgPSB2bXhfbXNyX2hpZ2ggJiB+MHgxZmZmOwogCXZtY3NfY29uZi0+cmV2aXNpb25faWQgPSB2bXhfbXNyX2xvdzsKIAogCXZtY3NfY29uZi0+cGluX2Jhc2VkX2V4ZWNfY3RybCA9IF9waW5fYmFzZWRfZXhlY19jb250cm9sOwpAQCAtNDY3OCwyOCArNDY5MSw0OSBAQAogCQkJCQkJbXNyLCBNU1JfVFlQRV9SIHwgTVNSX1RZUEVfVyk7CiB9CiAKLXN0YXRpYyB2b2lkIHZteF9lbmFibGVfaW50ZXJjZXB0X21zcl9yZWFkX3gyYXBpYyh1MzIgbXNyKQorc3RhdGljIHZvaWQgdm14X2VuYWJsZV9pbnRlcmNlcHRfbXNyX3JlYWRfeDJhcGljKHUzMiBtc3IsIGJvb2wgYXBpY3ZfYWN0aXZlKQogewotCV9fdm14X2VuYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sZWdhY3lfeDJhcGljLAotCQkJbXNyLCBNU1JfVFlQRV9SKTsKLQlfX3ZteF9lbmFibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljLAotCQkJbXNyLCBNU1JfVFlQRV9SKTsKKwlpZiAoYXBpY3ZfYWN0aXZlKSB7CisJCV9fdm14X2VuYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sZWdhY3lfeDJhcGljLAorCQkJCW1zciwgTVNSX1RZUEVfUik7CisJCV9fdm14X2VuYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWMsCisJCQkJbXNyLCBNU1JfVFlQRV9SKTsKKwl9IGVsc2UgeworCQlfX3ZteF9lbmFibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpY19hcGljdl9pbmFjdGl2ZSwKKwkJCQltc3IsIE1TUl9UWVBFX1IpOworCQlfX3ZteF9lbmFibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljX2FwaWN2X2luYWN0aXZlLAorCQkJCW1zciwgTVNSX1RZUEVfUik7CisJfQogfQogCi1zdGF0aWMgdm9pZCB2bXhfZGlzYWJsZV9pbnRlcmNlcHRfbXNyX3JlYWRfeDJhcGljKHUzMiBtc3IpCitzdGF0aWMgdm9pZCB2bXhfZGlzYWJsZV9pbnRlcmNlcHRfbXNyX3JlYWRfeDJhcGljKHUzMiBtc3IsIGJvb2wgYXBpY3ZfYWN0aXZlKQogewotCV9fdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYywKLQkJCW1zciwgTVNSX1RZUEVfUik7Ci0JX192bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWMsCi0JCQltc3IsIE1TUl9UWVBFX1IpOworCWlmIChhcGljdl9hY3RpdmUpIHsKKwkJX192bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sZWdhY3lfeDJhcGljLAorCQkJCW1zciwgTVNSX1RZUEVfUik7CisJCV9fdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljLAorCQkJCW1zciwgTVNSX1RZUEVfUik7CisJfSBlbHNlIHsKKwkJX192bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sZWdhY3lfeDJhcGljX2FwaWN2X2luYWN0aXZlLAorCQkJCW1zciwgTVNSX1RZUEVfUik7CisJCV9fdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljX2FwaWN2X2luYWN0aXZlLAorCQkJCW1zciwgTVNSX1RZUEVfUik7CisJfQogfQogCi1zdGF0aWMgdm9pZCB2bXhfZGlzYWJsZV9pbnRlcmNlcHRfbXNyX3dyaXRlX3gyYXBpYyh1MzIgbXNyKQorc3RhdGljIHZvaWQgdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl93cml0ZV94MmFwaWModTMyIG1zciwgYm9vbCBhcGljdl9hY3RpdmUpCiB7Ci0JX192bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sZWdhY3lfeDJhcGljLAotCQkJbXNyLCBNU1JfVFlQRV9XKTsKLQlfX3ZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpYywKLQkJCW1zciwgTVNSX1RZUEVfVyk7CisJaWYgKGFwaWN2X2FjdGl2ZSkgeworCQlfX3ZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWMsCisJCQkJbXNyLCBNU1JfVFlQRV9XKTsKKwkJX192bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWMsCisJCQkJbXNyLCBNU1JfVFlQRV9XKTsKKwl9IGVsc2UgeworCQlfX3ZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUsCisJCQkJbXNyLCBNU1JfVFlQRV9XKTsKKwkJX192bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUsCisJCQkJbXNyLCBNU1JfVFlQRV9XKTsKKwl9CiB9CiAKIHN0YXRpYyBib29sIHZteF9nZXRfZW5hYmxlX2FwaWN2KHZvaWQpCkBAIC01Mjc5LDI5ICs1MzEzLDMwIEBACiB7CiAJc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7CiAKLQlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkKLQkJcmV0dXJuOworCWlmICghaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkgeworCQlpZiAoIWNwdV9oYXNfdmlydHVhbF9ubWlzKCkpIHsKKwkJCS8qCisJCQkgKiBUcmFja2luZyB0aGUgTk1JLWJsb2NrZWQgc3RhdGUgaW4gc29mdHdhcmUgaXMgYnVpbHQgdXBvbgorCQkJICogZmluZGluZyB0aGUgbmV4dCBvcGVuIElSUSB3aW5kb3cuIFRoaXMsIGluIHR1cm4sIGRlcGVuZHMgb24KKwkJCSAqIHdlbGwtYmVoYXZpbmcgZ3Vlc3RzOiBUaGV5IGhhdmUgdG8ga2VlcCBJUlFzIGRpc2FibGVkIGF0CisJCQkgKiBsZWFzdCBhcyBsb25nIGFzIHRoZSBOTUkgaGFuZGxlciBydW5zLiBPdGhlcndpc2Ugd2UgbWF5CisJCQkgKiBjYXVzZSBOTUkgbmVzdGluZywgbWF5YmUgYnJlYWtpbmcgdGhlIGd1ZXN0LiBCdXQgYXMgdGhpcyBpcworCQkJICogaGlnaGx5IHVubGlrZWx5LCB3ZSBjYW4gbGl2ZSB3aXRoIHRoZSByZXNpZHVhbCByaXNrLgorCQkJICovCisJCQl2bXgtPnNvZnRfdm5taV9ibG9ja2VkID0gMTsKKwkJCXZteC0+dm5taV9ibG9ja2VkX3RpbWUgPSAwOworCQl9CiAKLQlpZiAoIWNwdV9oYXNfdmlydHVhbF9ubWlzKCkpIHsKLQkJLyoKLQkJICogVHJhY2tpbmcgdGhlIE5NSS1ibG9ja2VkIHN0YXRlIGluIHNvZnR3YXJlIGlzIGJ1aWx0IHVwb24KLQkJICogZmluZGluZyB0aGUgbmV4dCBvcGVuIElSUSB3aW5kb3cuIFRoaXMsIGluIHR1cm4sIGRlcGVuZHMgb24KLQkJICogd2VsbC1iZWhhdmluZyBndWVzdHM6IFRoZXkgaGF2ZSB0byBrZWVwIElSUXMgZGlzYWJsZWQgYXQKLQkJICogbGVhc3QgYXMgbG9uZyBhcyB0aGUgTk1JIGhhbmRsZXIgcnVucy4gT3RoZXJ3aXNlIHdlIG1heQotCQkgKiBjYXVzZSBOTUkgbmVzdGluZywgbWF5YmUgYnJlYWtpbmcgdGhlIGd1ZXN0LiBCdXQgYXMgdGhpcyBpcwotCQkgKiBoaWdobHkgdW5saWtlbHksIHdlIGNhbiBsaXZlIHdpdGggdGhlIHJlc2lkdWFsIHJpc2suCi0JCSAqLwotCQl2bXgtPnNvZnRfdm5taV9ibG9ja2VkID0gMTsKLQkJdm14LT52bm1pX2Jsb2NrZWRfdGltZSA9IDA7CisJCSsrdmNwdS0+c3RhdC5ubWlfaW5qZWN0aW9uczsKKwkJdm14LT5ubWlfa25vd25fdW5tYXNrZWQgPSBmYWxzZTsKIAl9CiAKLQkrK3ZjcHUtPnN0YXQubm1pX2luamVjdGlvbnM7Ci0Jdm14LT5ubWlfa25vd25fdW5tYXNrZWQgPSBmYWxzZTsKIAlpZiAodm14LT5ybW9kZS52bTg2X2FjdGl2ZSkgewogCQlpZiAoa3ZtX2luamVjdF9yZWFsbW9kZV9pbnRlcnJ1cHQodmNwdSwgTk1JX1ZFQ1RPUiwgMCkgIT0gRU1VTEFURV9ET05FKQogCQkJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX1RSSVBMRV9GQVVMVCwgdmNwdSk7CiAJCXJldHVybjsKIAl9CisKIAl2bWNzX3dyaXRlMzIoVk1fRU5UUllfSU5UUl9JTkZPX0ZJRUxELAogCQkJSU5UUl9UWVBFX05NSV9JTlRSIHwgSU5UUl9JTkZPX1ZBTElEX01BU0sgfCBOTUlfVkVDVE9SKTsKIH0KQEAgLTYxMDksNyArNjE0NCw3IEBACiAJZXhpdF9xdWFsaWZpY2F0aW9uID0gdm1jc19yZWFkbChFWElUX1FVQUxJRklDQVRJT04pOwogCiAJZ2xhX3ZhbGlkaXR5ID0gKGV4aXRfcXVhbGlmaWNhdGlvbiA+PiA3KSAmIDB4MzsKLQlpZiAoZ2xhX3ZhbGlkaXR5ICE9IDB4MyAmJiBnbGFfdmFsaWRpdHkgIT0gMHgxICYmIGdsYV92YWxpZGl0eSAhPSAwKSB7CisJaWYgKGdsYV92YWxpZGl0eSA9PSAweDIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFUFQ6IEhhbmRsaW5nIEVQVCB2aW9sYXRpb24gZmFpbGVkIVxuIik7CiAJCXByaW50ayhLRVJOX0VSUiAiRVBUOiBHUEE6IDB4JWx4LCBHVkE6IDB4JWx4XG4iLAogCQkJKGxvbmcgdW5zaWduZWQgaW50KXZtY3NfcmVhZDY0KEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MpLApAQCAtNjM2MCwyMiArNjM5NSwzMiBAQAogCWlmICghdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYykKIAkJZ290byBvdXQyOwogCisJdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpY19hcGljdl9pbmFjdGl2ZSA9CisJCQkJKHVuc2lnbmVkIGxvbmcgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCF2bXhfbXNyX2JpdG1hcF9sZWdhY3lfeDJhcGljX2FwaWN2X2luYWN0aXZlKQorCQlnb3RvIG91dDM7CisKIAl2bXhfbXNyX2JpdG1hcF9sb25nbW9kZSA9ICh1bnNpZ25lZCBsb25nICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghdm14X21zcl9iaXRtYXBfbG9uZ21vZGUpCi0JCWdvdG8gb3V0MzsKKwkJZ290byBvdXQ0OwogCiAJdm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljID0KIAkJCQkodW5zaWduZWQgbG9uZyAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIXZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpYykKLQkJZ290byBvdXQ0OworCQlnb3RvIG91dDU7CisKKwl2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUgPQorCQkJCSh1bnNpZ25lZCBsb25nICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICghdm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljX2FwaWN2X2luYWN0aXZlKQorCQlnb3RvIG91dDY7CiAKIAl2bXhfdm1yZWFkX2JpdG1hcCA9ICh1bnNpZ25lZCBsb25nICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghdm14X3ZtcmVhZF9iaXRtYXApCi0JCWdvdG8gb3V0NjsKKwkJZ290byBvdXQ3OwogCiAJdm14X3Ztd3JpdGVfYml0bWFwID0gKHVuc2lnbmVkIGxvbmcgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJaWYgKCF2bXhfdm13cml0ZV9iaXRtYXApCi0JCWdvdG8gb3V0NzsKKwkJZ290byBvdXQ4OwogCiAJbWVtc2V0KHZteF92bXJlYWRfYml0bWFwLCAweGZmLCBQQUdFX1NJWkUpOwogCW1lbXNldCh2bXhfdm13cml0ZV9iaXRtYXAsIDB4ZmYsIFBBR0VfU0laRSk7CkBAIC02Mzk0LDcgKzY0MzksNyBAQAogCiAJaWYgKHNldHVwX3ZtY3NfY29uZmlnKCZ2bWNzX2NvbmZpZykgPCAwKSB7CiAJCXIgPSAtRUlPOwotCQlnb3RvIG91dDg7CisJCWdvdG8gb3V0OTsKIAl9CiAKIAlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX05YKSkKQEAgLTY0NjEsMjAgKzY1MDYsMzUgQEAKIAkJCXZteF9tc3JfYml0bWFwX2xlZ2FjeSwgUEFHRV9TSVpFKTsKIAltZW1jcHkodm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljLAogCQkJdm14X21zcl9iaXRtYXBfbG9uZ21vZGUsIFBBR0VfU0laRSk7CisJbWVtY3B5KHZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUsCisJCQl2bXhfbXNyX2JpdG1hcF9sZWdhY3ksIFBBR0VfU0laRSk7CisJbWVtY3B5KHZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpY19hcGljdl9pbmFjdGl2ZSwKKwkJCXZteF9tc3JfYml0bWFwX2xvbmdtb2RlLCBQQUdFX1NJWkUpOwogCiAJc2V0X2JpdCgwLCB2bXhfdnBpZF9iaXRtYXApOyAvKiAwIGlzIHJlc2VydmVkIGZvciBob3N0ICovCiAKKwkvKgorCSAqIGVuYWJsZV9hcGljdiAmJiBrdm1fdmNwdV9hcGljdl9hY3RpdmUoKQorCSAqLwogCWZvciAobXNyID0gMHg4MDA7IG1zciA8PSAweDhmZjsgbXNyKyspCi0JCXZteF9kaXNhYmxlX2ludGVyY2VwdF9tc3JfcmVhZF94MmFwaWMobXNyKTsKKwkJdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl9yZWFkX3gyYXBpYyhtc3IsIHRydWUpOwogCiAJLyogVE1DQ1QgKi8KLQl2bXhfZW5hYmxlX2ludGVyY2VwdF9tc3JfcmVhZF94MmFwaWMoMHg4MzkpOworCXZteF9lbmFibGVfaW50ZXJjZXB0X21zcl9yZWFkX3gyYXBpYygweDgzOSwgdHJ1ZSk7CiAJLyogVFBSICovCi0Jdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl93cml0ZV94MmFwaWMoMHg4MDgpOworCXZteF9kaXNhYmxlX2ludGVyY2VwdF9tc3Jfd3JpdGVfeDJhcGljKDB4ODA4LCB0cnVlKTsKIAkvKiBFT0kgKi8KLQl2bXhfZGlzYWJsZV9pbnRlcmNlcHRfbXNyX3dyaXRlX3gyYXBpYygweDgwYik7CisJdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl93cml0ZV94MmFwaWMoMHg4MGIsIHRydWUpOwogCS8qIFNFTEYtSVBJICovCi0Jdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl93cml0ZV94MmFwaWMoMHg4M2YpOworCXZteF9kaXNhYmxlX2ludGVyY2VwdF9tc3Jfd3JpdGVfeDJhcGljKDB4ODNmLCB0cnVlKTsKKworCS8qCisJICogKGVuYWJsZV9hcGljdiAmJiAha3ZtX3ZjcHVfYXBpY3ZfYWN0aXZlKCkpIHx8CisJICogCSFlbmFibGVfYXBpY3YKKwkgKi8KKwkvKiBUUFIgKi8KKwl2bXhfZGlzYWJsZV9pbnRlcmNlcHRfbXNyX3JlYWRfeDJhcGljKDB4ODA4LCBmYWxzZSk7CisJdm14X2Rpc2FibGVfaW50ZXJjZXB0X21zcl93cml0ZV94MmFwaWMoMHg4MDgsIGZhbHNlKTsKIAogCWlmIChlbmFibGVfZXB0KSB7CiAJCWt2bV9tbXVfc2V0X21hc2tfcHRlcyhWTVhfRVBUX1JFQURBQkxFX01BU0ssCkBAIC02NTIxLDE0ICs2NTgxLDE4IEBACiAKIAlyZXR1cm4gYWxsb2Nfa3ZtX2FyZWEoKTsKIAotb3V0ODoKK291dDk6CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF92bXdyaXRlX2JpdG1hcCk7Ci1vdXQ3Ogorb3V0ODoKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X3ZtcmVhZF9iaXRtYXApOworb3V0NzoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X21zcl9iaXRtYXBfbG9uZ21vZGVfeDJhcGljX2FwaWN2X2luYWN0aXZlKTsKIG91dDY6CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpYyk7Ci1vdXQ0Ogorb3V0NToKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X21zcl9iaXRtYXBfbG9uZ21vZGUpOworb3V0NDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpY19hcGljdl9pbmFjdGl2ZSk7CiBvdXQzOgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9sZWdhY3lfeDJhcGljKTsKIG91dDI6CkBAIC02NTQ0LDcgKzY2MDgsOSBAQAogc3RhdGljIF9fZXhpdCB2b2lkIGhhcmR3YXJlX3Vuc2V0dXAodm9pZCkKIHsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X21zcl9iaXRtYXBfbGVnYWN5X3gyYXBpYyk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9tc3JfYml0bWFwX2xlZ2FjeV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWMpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9sb25nbW9kZV94MmFwaWNfYXBpY3ZfaW5hY3RpdmUpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9sZWdhY3kpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9sb25nbW9kZSk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9pb19iaXRtYXBfYik7CkBAIC02NzI2LDcgKzY3OTIsNyBAQAogewogCS8qIFRPRE86IG5vdCB0byByZXNldCBndWVzdCBzaW1wbHkgaGVyZS4gKi8KIAlrdm1fbWFrZV9yZXF1ZXN0KEtWTV9SRVFfVFJJUExFX0ZBVUxULCB2Y3B1KTsKLQlwcl93YXJuKCJrdm06IG5lc3RlZCB2bXggYWJvcnQsIGluZGljYXRvciAlZFxuIiwgaW5kaWNhdG9yKTsKKwlwcl9kZWJ1Z19yYXRlbGltaXRlZCgia3ZtOiBuZXN0ZWQgdm14IGFib3J0LCBpbmRpY2F0b3IgJWRcbiIsIGluZGljYXRvcik7CiB9CiAKIHN0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCB2bXhfcHJlZW1wdGlvbl90aW1lcl9mbihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCkBAIC03MDEzLDcgKzcwNzksNyBAQAogCXZteC0+bmVzdGVkLnZtY3MwMl9udW0gPSAwOwogCiAJaHJ0aW1lcl9pbml0KCZ2bXgtPm5lc3RlZC5wcmVlbXB0aW9uX3RpbWVyLCBDTE9DS19NT05PVE9OSUMsCi0JCSAgICAgSFJUSU1FUl9NT0RFX1JFTCk7CisJCSAgICAgSFJUSU1FUl9NT0RFX1JFTF9QSU5ORUQpOwogCXZteC0+bmVzdGVkLnByZWVtcHRpb25fdGltZXIuZnVuY3Rpb24gPSB2bXhfcHJlZW1wdGlvbl90aW1lcl9mbjsKIAogCXZteC0+bmVzdGVkLnZteG9uID0gdHJ1ZTsKQEAgLTg0MzUsMTIgKzg1MDEsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JLyoKLQkgKiBUaGVyZSBpcyBub3QgcG9pbnQgdG8gZW5hYmxlIHZpcnR1YWxpemUgeDJhcGljIHdpdGhvdXQgZW5hYmxlCi0JICogYXBpY3YKLQkgKi8KLQlpZiAoIWNwdV9oYXNfdm14X3ZpcnR1YWxpemVfeDJhcGljX21vZGUoKSB8fAotCQkJCSFrdm1fdmNwdV9hcGljdl9hY3RpdmUodmNwdSkpCisJaWYgKCFjcHVfaGFzX3ZteF92aXJ0dWFsaXplX3gyYXBpY19tb2RlKCkpCiAJCXJldHVybjsKIAogCWlmICghY3B1X25lZWRfdHByX3NoYWRvdyh2Y3B1KSkKQEAgLTk1OTgsNyArOTY1OSw3IEBACiAJbWF4cGh5YWRkciA9IGNwdWlkX21heHBoeWFkZHIodmNwdSk7CiAJaWYgKCFJU19BTElHTkVEKGFkZHIsIDE2KSB8fCBhZGRyID4+IG1heHBoeWFkZHIgfHwKIAkgICAgKGFkZHIgKyBjb3VudCAqIHNpemVvZihzdHJ1Y3Qgdm14X21zcl9lbnRyeSkgLSAxKSA+PiBtYXhwaHlhZGRyKSB7Ci0JCXByX3dhcm5fcmF0ZWxpbWl0ZWQoCisJCXByX2RlYnVnX3JhdGVsaW1pdGVkKAogCQkJIm5WTVg6IGludmFsaWQgTVNSIHN3aXRjaCAoMHglbHgsICVkLCAlbGx1LCAweCUwOGxseCkiLAogCQkJYWRkcl9maWVsZCwgbWF4cGh5YWRkciwgY291bnQsIGFkZHIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk2NzEsMTMgKzk3MzIsMTMgQEAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlpZiAoa3ZtX3ZjcHVfcmVhZF9ndWVzdCh2Y3B1LCBncGEgKyBpICogc2l6ZW9mKGUpLAogCQkJCQkmZSwgc2l6ZW9mKGUpKSkgewotCQkJcHJfd2Fybl9yYXRlbGltaXRlZCgKKwkJCXByX2RlYnVnX3JhdGVsaW1pdGVkKAogCQkJCSIlcyBjYW5ub3QgcmVhZCBNU1IgZW50cnkgKCV1LCAweCUwOGxseClcbiIsCiAJCQkJX19mdW5jX18sIGksIGdwYSArIGkgKiBzaXplb2YoZSkpOwogCQkJZ290byBmYWlsOwogCQl9CiAJCWlmIChuZXN0ZWRfdm14X2xvYWRfbXNyX2NoZWNrKHZjcHUsICZlKSkgewotCQkJcHJfd2Fybl9yYXRlbGltaXRlZCgKKwkJCXByX2RlYnVnX3JhdGVsaW1pdGVkKAogCQkJCSIlcyBjaGVjayBmYWlsZWQgKCV1LCAweCV4LCAweCV4KVxuIiwKIAkJCQlfX2Z1bmNfXywgaSwgZS5pbmRleCwgZS5yZXNlcnZlZCk7CiAJCQlnb3RvIGZhaWw7CkBAIC05Njg1LDcgKzk3NDYsNyBAQAogCQltc3IuaW5kZXggPSBlLmluZGV4OwogCQltc3IuZGF0YSA9IGUudmFsdWU7CiAJCWlmIChrdm1fc2V0X21zcih2Y3B1LCAmbXNyKSkgewotCQkJcHJfd2Fybl9yYXRlbGltaXRlZCgKKwkJCXByX2RlYnVnX3JhdGVsaW1pdGVkKAogCQkJCSIlcyBjYW5ub3Qgd3JpdGUgTVNSICgldSwgMHgleCwgMHglbGx4KVxuIiwKIAkJCQlfX2Z1bmNfXywgaSwgZS5pbmRleCwgZS52YWx1ZSk7CiAJCQlnb3RvIGZhaWw7CkBAIC05NzA2LDEzICs5NzY3LDEzIEBACiAJCWlmIChrdm1fdmNwdV9yZWFkX2d1ZXN0KHZjcHUsCiAJCQkJCWdwYSArIGkgKiBzaXplb2YoZSksCiAJCQkJCSZlLCAyICogc2l6ZW9mKHUzMikpKSB7Ci0JCQlwcl93YXJuX3JhdGVsaW1pdGVkKAorCQkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoCiAJCQkJIiVzIGNhbm5vdCByZWFkIE1TUiBlbnRyeSAoJXUsIDB4JTA4bGx4KVxuIiwKIAkJCQlfX2Z1bmNfXywgaSwgZ3BhICsgaSAqIHNpemVvZihlKSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAobmVzdGVkX3ZteF9zdG9yZV9tc3JfY2hlY2sodmNwdSwgJmUpKSB7Ci0JCQlwcl93YXJuX3JhdGVsaW1pdGVkKAorCQkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoCiAJCQkJIiVzIGNoZWNrIGZhaWxlZCAoJXUsIDB4JXgsIDB4JXgpXG4iLAogCQkJCV9fZnVuY19fLCBpLCBlLmluZGV4LCBlLnJlc2VydmVkKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtOTcyMCw3ICs5NzgxLDcgQEAKIAkJbXNyX2luZm8uaG9zdF9pbml0aWF0ZWQgPSBmYWxzZTsKIAkJbXNyX2luZm8uaW5kZXggPSBlLmluZGV4OwogCQlpZiAoa3ZtX2dldF9tc3IodmNwdSwgJm1zcl9pbmZvKSkgewotCQkJcHJfd2Fybl9yYXRlbGltaXRlZCgKKwkJCXByX2RlYnVnX3JhdGVsaW1pdGVkKAogCQkJCSIlcyBjYW5ub3QgcmVhZCBNU1IgKCV1LCAweCV4KVxuIiwKIAkJCQlfX2Z1bmNfXywgaSwgZS5pbmRleCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk3MjksNyArOTc5MCw3IEBACiAJCQkJCSBncGEgKyBpICogc2l6ZW9mKGUpICsKIAkJCQkJICAgICBvZmZzZXRvZihzdHJ1Y3Qgdm14X21zcl9lbnRyeSwgdmFsdWUpLAogCQkJCQkgJm1zcl9pbmZvLmRhdGEsIHNpemVvZihtc3JfaW5mby5kYXRhKSkpIHsKLQkJCXByX3dhcm5fcmF0ZWxpbWl0ZWQoCisJCQlwcl9kZWJ1Z19yYXRlbGltaXRlZCgKIAkJCQkiJXMgY2Fubm90IHdyaXRlIE1TUiAoJXUsIDB4JXgsIDB4JWxseClcbiIsCiAJCQkJX19mdW5jX18sIGksIGUuaW5kZXgsIG1zcl9pbmZvLmRhdGEpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDUwMCw2ICsxMDU2MSw5IEBACiAJCXZtY3MxMi0+Z3Vlc3RfcGRwdHIzID0gdm1jc19yZWFkNjQoR1VFU1RfUERQVFIzKTsKIAl9CiAKKwlpZiAobmVzdGVkX2NwdV9oYXNfZXB0KHZtY3MxMikpCisJCXZtY3MxMi0+Z3Vlc3RfbGluZWFyX2FkZHJlc3MgPSB2bWNzX3JlYWRsKEdVRVNUX0xJTkVBUl9BRERSRVNTKTsKKwogCWlmIChuZXN0ZWRfY3B1X2hhc192aWQodm1jczEyKSkKIAkJdm1jczEyLT5ndWVzdF9pbnRyX3N0YXR1cyA9IHZtY3NfcmVhZDE2KEdVRVNUX0lOVFJfU1RBVFVTKTsKIApAQCAtMTA3OTMsNyArMTA4NTcsNyBAQAogCSAqIFdlIGFyZSBub3cgcnVubmluZyBpbiBMMiwgbW11X25vdGlmaWVyIHdpbGwgZm9yY2UgdG8gcmVsb2FkIHRoZQogCSAqIHBhZ2UncyBocGEgZm9yIEwyIHZtY3MuIE5lZWQgdG8gcmVsb2FkIGl0IGZvciBMMSBiZWZvcmUgZW50ZXJpbmcgTDEuCiAJICovCi0Ja3ZtX3ZjcHVfcmVsb2FkX2FwaWNfYWNjZXNzX3BhZ2UodmNwdSk7CisJa3ZtX21ha2VfcmVxdWVzdChLVk1fUkVRX0FQSUNfUEFHRV9SRUxPQUQsIHZjcHUpOwogCiAJLyoKIAkgKiBFeGl0aW5nIGZyb20gTDIgdG8gTDEsIHdlJ3JlIG5vdyBiYWNrIHRvIEwxIHdoaWNoIHRoaW5rcyBpdCBqdXN0CkBAIC0xMTE3Nyw3ICsxMTI0MSw3IEBACiAJCQl+RkVBVFVSRV9DT05UUk9MX0xNQ0U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qga3ZtX3g4Nl9vcHMgdm14X3g4Nl9vcHMgPSB7CitzdGF0aWMgc3RydWN0IGt2bV94ODZfb3BzIHZteF94ODZfb3BzIF9fcm9fYWZ0ZXJfaW5pdCA9IHsKIAkuY3B1X2hhc19rdm1fc3VwcG9ydCA9IGNwdV9oYXNfa3ZtX3N1cHBvcnQsCiAJLmRpc2FibGVkX2J5X2Jpb3MgPSB2bXhfZGlzYWJsZWRfYnlfYmlvcywKIAkuaGFyZHdhcmVfc2V0dXAgPSBoYXJkd2FyZV9zZXR1cCwKQEAgLTExMjc0LDcgKzExMzM4LDYgQEAKIAogCS5oYXNfd2JpbnZkX2V4aXQgPSBjcHVfaGFzX3ZteF93YmludmRfZXhpdCwKIAotCS5yZWFkX3RzY19vZmZzZXQgPSB2bXhfcmVhZF90c2Nfb2Zmc2V0LAogCS53cml0ZV90c2Nfb2Zmc2V0ID0gdm14X3dyaXRlX3RzY19vZmZzZXQsCiAJLmFkanVzdF90c2Nfb2Zmc2V0X2d1ZXN0ID0gdm14X2FkanVzdF90c2Nfb2Zmc2V0X2d1ZXN0LAogCS5yZWFkX2wxX3RzYyA9IHZteF9yZWFkX2wxX3RzYywKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS94ODYuYyBiL2FyY2gveDg2L2t2bS94ODYuYwppbmRleCAxOWY5ZjllLi42YzYzM2RlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0veDg2LmMKKysrIGIvYXJjaC94ODYva3ZtL3g4Ni5jCkBAIC0xMzY3LDcgKzEzNjcsNyBAQAogCiBzdGF0aWMgdm9pZCB1cGRhdGVfaWEzMl90c2NfYWRqdXN0X21zcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHM2NCBvZmZzZXQpCiB7Ci0JdTY0IGN1cnJfb2Zmc2V0ID0ga3ZtX3g4Nl9vcHMtPnJlYWRfdHNjX29mZnNldCh2Y3B1KTsKKwl1NjQgY3Vycl9vZmZzZXQgPSB2Y3B1LT5hcmNoLnRzY19vZmZzZXQ7CiAJdmNwdS0+YXJjaC5pYTMyX3RzY19hZGp1c3RfbXNyICs9IG9mZnNldCAtIGN1cnJfb2Zmc2V0OwogfQogCkBAIC0xNDEzLDYgKzE0MTMsMTIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9yZWFkX2wxX3RzYyk7CiAKK3N0YXRpYyB2b2lkIGt2bV92Y3B1X3dyaXRlX3RzY19vZmZzZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgb2Zmc2V0KQoreworCWt2bV94ODZfb3BzLT53cml0ZV90c2Nfb2Zmc2V0KHZjcHUsIG9mZnNldCk7CisJdmNwdS0+YXJjaC50c2Nfb2Zmc2V0ID0gb2Zmc2V0OworfQorCiB2b2lkIGt2bV93cml0ZV90c2Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgbXNyX2RhdGEgKm1zcikKIHsKIAlzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LT5rdm07CkBAIC0xNDI1LDcgKzE0MzEsNyBAQAogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZrdm0tPmFyY2gudHNjX3dyaXRlX2xvY2ssIGZsYWdzKTsKIAlvZmZzZXQgPSBrdm1fY29tcHV0ZV90c2Nfb2Zmc2V0KHZjcHUsIGRhdGEpOwotCW5zID0gZ2V0X2tlcm5lbF9ucygpOworCW5zID0ga3RpbWVfZ2V0X2Jvb3RfbnMoKTsKIAllbGFwc2VkID0gbnMgLSBrdm0tPmFyY2gubGFzdF90c2NfbnNlYzsKIAogCWlmICh2Y3B1LT5hcmNoLnZpcnR1YWxfdHNjX2toeikgewpAQCAtMTUyMiw3ICsxNTI4LDcgQEAKIAogCWlmIChndWVzdF9jcHVpZF9oYXNfdHNjX2FkanVzdCh2Y3B1KSAmJiAhbXNyLT5ob3N0X2luaXRpYXRlZCkKIAkJdXBkYXRlX2lhMzJfdHNjX2FkanVzdF9tc3IodmNwdSwgb2Zmc2V0KTsKLQlrdm1feDg2X29wcy0+d3JpdGVfdHNjX29mZnNldCh2Y3B1LCBvZmZzZXQpOworCWt2bV92Y3B1X3dyaXRlX3RzY19vZmZzZXQodmNwdSwgb2Zmc2V0KTsKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgma3ZtLT5hcmNoLnRzY193cml0ZV9sb2NrLCBmbGFncyk7CiAKIAlzcGluX2xvY2soJmt2bS0+YXJjaC5wdmNsb2NrX2d0b2Rfc3luY19sb2NrKTsKQEAgLTE3MTYsNiArMTcyMiw4OCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyB1NjQgX19nZXRfa3ZtY2xvY2tfbnMoc3RydWN0IGt2bSAqa3ZtKQoreworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IGt2bV9nZXRfdmNwdShrdm0sIDApOworCXN0cnVjdCBrdm1fYXJjaCAqa2EgPSAma3ZtLT5hcmNoOworCXM2NCBuczsKKworCWlmICh2Y3B1LT5hcmNoLmh2X2Nsb2NrLmZsYWdzICYgUFZDTE9DS19UU0NfU1RBQkxFX0JJVCkgeworCQl1NjQgdHNjID0ga3ZtX3JlYWRfbDFfdHNjKHZjcHUsIHJkdHNjKCkpOworCQlucyA9IF9fcHZjbG9ja19yZWFkX2N5Y2xlcygmdmNwdS0+YXJjaC5odl9jbG9jaywgdHNjKTsKKwl9IGVsc2UgeworCQlucyA9IGt0aW1lX2dldF9ib290X25zKCkgKyBrYS0+a3ZtY2xvY2tfb2Zmc2V0OworCX0KKworCXJldHVybiBuczsKK30KKwordTY0IGdldF9rdm1jbG9ja19ucyhzdHJ1Y3Qga3ZtICprdm0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzNjQgbnM7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbnMgPSBfX2dldF9rdm1jbG9ja19ucyhrdm0pOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiBuczsKK30KKworc3RhdGljIHZvaWQga3ZtX3NldHVwX3B2Y2xvY2tfcGFnZShzdHJ1Y3Qga3ZtX3ZjcHUgKnYpCit7CisJc3RydWN0IGt2bV92Y3B1X2FyY2ggKnZjcHUgPSAmdi0+YXJjaDsKKwlzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyBndWVzdF9odl9jbG9jazsKKworCWlmICh1bmxpa2VseShrdm1fcmVhZF9ndWVzdF9jYWNoZWQodi0+a3ZtLCAmdmNwdS0+cHZfdGltZSwKKwkJJmd1ZXN0X2h2X2Nsb2NrLCBzaXplb2YoZ3Vlc3RfaHZfY2xvY2spKSkpCisJCXJldHVybjsKKworCS8qIFRoaXMgVkNQVSBpcyBwYXVzZWQsIGJ1dCBpdCdzIGxlZ2FsIGZvciBhIGd1ZXN0IHRvIHJlYWQgYW5vdGhlcgorCSAqIFZDUFUncyBrdm1jbG9jaywgc28gd2UgcmVhbGx5IGhhdmUgdG8gZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uIHdoZXJlCisJICogaXQgc2F5cyB0aGF0IHZlcnNpb24gaXMgb2RkIGlmIGRhdGEgaXMgYmVpbmcgbW9kaWZpZWQsIGFuZCBldmVuIGFmdGVyCisJICogaXQgaXMgY29uc2lzdGVudC4KKwkgKgorCSAqIFZlcnNpb24gZmllbGQgdXBkYXRlcyBtdXN0IGJlIGtlcHQgc2VwYXJhdGUuICBUaGlzIGlzIGJlY2F1c2UKKwkgKiBrdm1fd3JpdGVfZ3Vlc3RfY2FjaGVkIG1pZ2h0IHVzZSBhICJyZXAgbW92cyIgaW5zdHJ1Y3Rpb24sIGFuZAorCSAqIHdyaXRlcyB3aXRoaW4gYSBzdHJpbmcgaW5zdHJ1Y3Rpb24gYXJlIHdlYWtseSBvcmRlcmVkLiAgU28gdGhlcmUKKwkgKiBhcmUgdGhyZWUgd3JpdGVzIG92ZXJhbGwuCisJICoKKwkgKiBBcyBhIHNtYWxsIG9wdGltaXphdGlvbiwgb25seSB3cml0ZSB0aGUgdmVyc2lvbiBmaWVsZCBpbiB0aGUgZmlyc3QKKwkgKiBhbmQgdGhpcmQgd3JpdGUuICBUaGUgdmNwdS0+cHZfdGltZSBjYWNoZSBpcyBzdGlsbCB2YWxpZCwgYmVjYXVzZSB0aGUKKwkgKiB2ZXJzaW9uIGZpZWxkIGlzIHRoZSBmaXJzdCBpbiB0aGUgc3RydWN0LgorCSAqLworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbywgdmVyc2lvbikgIT0gMCk7CisKKwl2Y3B1LT5odl9jbG9jay52ZXJzaW9uID0gZ3Vlc3RfaHZfY2xvY2sudmVyc2lvbiArIDE7CisJa3ZtX3dyaXRlX2d1ZXN0X2NhY2hlZCh2LT5rdm0sICZ2Y3B1LT5wdl90aW1lLAorCQkJCSZ2Y3B1LT5odl9jbG9jaywKKwkJCQlzaXplb2YodmNwdS0+aHZfY2xvY2sudmVyc2lvbikpOworCisJc21wX3dtYigpOworCisJLyogcmV0YWluIFBWQ0xPQ0tfR1VFU1RfU1RPUFBFRCBpZiBzZXQgaW4gZ3Vlc3QgY29weSAqLworCXZjcHUtPmh2X2Nsb2NrLmZsYWdzIHw9IChndWVzdF9odl9jbG9jay5mbGFncyAmIFBWQ0xPQ0tfR1VFU1RfU1RPUFBFRCk7CisKKwlpZiAodmNwdS0+cHZjbG9ja19zZXRfZ3Vlc3Rfc3RvcHBlZF9yZXF1ZXN0KSB7CisJCXZjcHUtPmh2X2Nsb2NrLmZsYWdzIHw9IFBWQ0xPQ0tfR1VFU1RfU1RPUFBFRDsKKwkJdmNwdS0+cHZjbG9ja19zZXRfZ3Vlc3Rfc3RvcHBlZF9yZXF1ZXN0ID0gZmFsc2U7CisJfQorCisJdHJhY2Vfa3ZtX3B2Y2xvY2tfdXBkYXRlKHYtPnZjcHVfaWQsICZ2Y3B1LT5odl9jbG9jayk7CisKKwlrdm1fd3JpdGVfZ3Vlc3RfY2FjaGVkKHYtPmt2bSwgJnZjcHUtPnB2X3RpbWUsCisJCQkJJnZjcHUtPmh2X2Nsb2NrLAorCQkJCXNpemVvZih2Y3B1LT5odl9jbG9jaykpOworCisJc21wX3dtYigpOworCisJdmNwdS0+aHZfY2xvY2sudmVyc2lvbisrOworCWt2bV93cml0ZV9ndWVzdF9jYWNoZWQodi0+a3ZtLCAmdmNwdS0+cHZfdGltZSwKKwkJCQkmdmNwdS0+aHZfY2xvY2ssCisJCQkJc2l6ZW9mKHZjcHUtPmh2X2Nsb2NrLnZlcnNpb24pKTsKK30KKwogc3RhdGljIGludCBrdm1fZ3Vlc3RfdGltZV91cGRhdGUoc3RydWN0IGt2bV92Y3B1ICp2KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHRndF90c2Nfa2h6OwpAQCAtMTcyMyw3ICsxODExLDYgQEAKIAlzdHJ1Y3Qga3ZtX2FyY2ggKmthID0gJnYtPmt2bS0+YXJjaDsKIAlzNjQga2VybmVsX25zOwogCXU2NCB0c2NfdGltZXN0YW1wLCBob3N0X3RzYzsKLQlzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbyBndWVzdF9odl9jbG9jazsKIAl1OCBwdmNsb2NrX2ZsYWdzOwogCWJvb2wgdXNlX21hc3Rlcl9jbG9jazsKIApAQCAtMTc1Miw3ICsxODM5LDcgQEAKIAl9CiAJaWYgKCF1c2VfbWFzdGVyX2Nsb2NrKSB7CiAJCWhvc3RfdHNjID0gcmR0c2MoKTsKLQkJa2VybmVsX25zID0gZ2V0X2tlcm5lbF9ucygpOworCQlrZXJuZWxfbnMgPSBrdGltZV9nZXRfYm9vdF9ucygpOwogCX0KIAogCXRzY190aW1lc3RhbXAgPSBrdm1fcmVhZF9sMV90c2ModiwgaG9zdF90c2MpOwpAQCAtMTc3Nyw4ICsxODY0LDcgQEAKIAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAotCWlmICghdmNwdS0+cHZfdGltZV9lbmFibGVkKQotCQlyZXR1cm4gMDsKKwkvKiBXaXRoIGFsbCB0aGUgaW5mbyB3ZSBnb3QsIGZpbGwgaW4gdGhlIHZhbHVlcyAqLwogCiAJaWYgKGt2bV9oYXNfdHNjX2NvbnRyb2wpCiAJCXRndF90c2Nfa2h6ID0ga3ZtX3NjYWxlX3RzYyh2LCB0Z3RfdHNjX2toeik7CkBAIC0xNzkwLDY0ICsxODc2LDIxIEBACiAJCXZjcHUtPmh3X3RzY19raHogPSB0Z3RfdHNjX2toejsKIAl9CiAKLQkvKiBXaXRoIGFsbCB0aGUgaW5mbyB3ZSBnb3QsIGZpbGwgaW4gdGhlIHZhbHVlcyAqLwogCXZjcHUtPmh2X2Nsb2NrLnRzY190aW1lc3RhbXAgPSB0c2NfdGltZXN0YW1wOwogCXZjcHUtPmh2X2Nsb2NrLnN5c3RlbV90aW1lID0ga2VybmVsX25zICsgdi0+a3ZtLT5hcmNoLmt2bWNsb2NrX29mZnNldDsKIAl2Y3B1LT5sYXN0X2d1ZXN0X3RzYyA9IHRzY190aW1lc3RhbXA7CiAKLQlpZiAodW5saWtlbHkoa3ZtX3JlYWRfZ3Vlc3RfY2FjaGVkKHYtPmt2bSwgJnZjcHUtPnB2X3RpbWUsCi0JCSZndWVzdF9odl9jbG9jaywgc2l6ZW9mKGd1ZXN0X2h2X2Nsb2NrKSkpKQotCQlyZXR1cm4gMDsKLQotCS8qIFRoaXMgVkNQVSBpcyBwYXVzZWQsIGJ1dCBpdCdzIGxlZ2FsIGZvciBhIGd1ZXN0IHRvIHJlYWQgYW5vdGhlcgotCSAqIFZDUFUncyBrdm1jbG9jaywgc28gd2UgcmVhbGx5IGhhdmUgdG8gZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uIHdoZXJlCi0JICogaXQgc2F5cyB0aGF0IHZlcnNpb24gaXMgb2RkIGlmIGRhdGEgaXMgYmVpbmcgbW9kaWZpZWQsIGFuZCBldmVuIGFmdGVyCi0JICogaXQgaXMgY29uc2lzdGVudC4KLQkgKgotCSAqIFZlcnNpb24gZmllbGQgdXBkYXRlcyBtdXN0IGJlIGtlcHQgc2VwYXJhdGUuICBUaGlzIGlzIGJlY2F1c2UKLQkgKiBrdm1fd3JpdGVfZ3Vlc3RfY2FjaGVkIG1pZ2h0IHVzZSBhICJyZXAgbW92cyIgaW5zdHJ1Y3Rpb24sIGFuZAotCSAqIHdyaXRlcyB3aXRoaW4gYSBzdHJpbmcgaW5zdHJ1Y3Rpb24gYXJlIHdlYWtseSBvcmRlcmVkLiAgU28gdGhlcmUKLQkgKiBhcmUgdGhyZWUgd3JpdGVzIG92ZXJhbGwuCi0JICoKLQkgKiBBcyBhIHNtYWxsIG9wdGltaXphdGlvbiwgb25seSB3cml0ZSB0aGUgdmVyc2lvbiBmaWVsZCBpbiB0aGUgZmlyc3QKLQkgKiBhbmQgdGhpcmQgd3JpdGUuICBUaGUgdmNwdS0+cHZfdGltZSBjYWNoZSBpcyBzdGlsbCB2YWxpZCwgYmVjYXVzZSB0aGUKLQkgKiB2ZXJzaW9uIGZpZWxkIGlzIHRoZSBmaXJzdCBpbiB0aGUgc3RydWN0LgotCSAqLwotCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHZjbG9ja192Y3B1X3RpbWVfaW5mbywgdmVyc2lvbikgIT0gMCk7Ci0KLQl2Y3B1LT5odl9jbG9jay52ZXJzaW9uID0gZ3Vlc3RfaHZfY2xvY2sudmVyc2lvbiArIDE7Ci0Ja3ZtX3dyaXRlX2d1ZXN0X2NhY2hlZCh2LT5rdm0sICZ2Y3B1LT5wdl90aW1lLAotCQkJCSZ2Y3B1LT5odl9jbG9jaywKLQkJCQlzaXplb2YodmNwdS0+aHZfY2xvY2sudmVyc2lvbikpOwotCi0Jc21wX3dtYigpOwotCi0JLyogcmV0YWluIFBWQ0xPQ0tfR1VFU1RfU1RPUFBFRCBpZiBzZXQgaW4gZ3Vlc3QgY29weSAqLwotCXB2Y2xvY2tfZmxhZ3MgPSAoZ3Vlc3RfaHZfY2xvY2suZmxhZ3MgJiBQVkNMT0NLX0dVRVNUX1NUT1BQRUQpOwotCi0JaWYgKHZjcHUtPnB2Y2xvY2tfc2V0X2d1ZXN0X3N0b3BwZWRfcmVxdWVzdCkgewotCQlwdmNsb2NrX2ZsYWdzIHw9IFBWQ0xPQ0tfR1VFU1RfU1RPUFBFRDsKLQkJdmNwdS0+cHZjbG9ja19zZXRfZ3Vlc3Rfc3RvcHBlZF9yZXF1ZXN0ID0gZmFsc2U7Ci0JfQotCiAJLyogSWYgdGhlIGhvc3QgdXNlcyBUU0MgY2xvY2tzb3VyY2UsIHRoZW4gaXQgaXMgc3RhYmxlICovCisJcHZjbG9ja19mbGFncyA9IDA7CiAJaWYgKHVzZV9tYXN0ZXJfY2xvY2spCiAJCXB2Y2xvY2tfZmxhZ3MgfD0gUFZDTE9DS19UU0NfU1RBQkxFX0JJVDsKIAogCXZjcHUtPmh2X2Nsb2NrLmZsYWdzID0gcHZjbG9ja19mbGFnczsKIAotCXRyYWNlX2t2bV9wdmNsb2NrX3VwZGF0ZSh2LT52Y3B1X2lkLCAmdmNwdS0+aHZfY2xvY2spOwotCi0Ja3ZtX3dyaXRlX2d1ZXN0X2NhY2hlZCh2LT5rdm0sICZ2Y3B1LT5wdl90aW1lLAotCQkJCSZ2Y3B1LT5odl9jbG9jaywKLQkJCQlzaXplb2YodmNwdS0+aHZfY2xvY2spKTsKLQotCXNtcF93bWIoKTsKLQotCXZjcHUtPmh2X2Nsb2NrLnZlcnNpb24rKzsKLQlrdm1fd3JpdGVfZ3Vlc3RfY2FjaGVkKHYtPmt2bSwgJnZjcHUtPnB2X3RpbWUsCi0JCQkJJnZjcHUtPmh2X2Nsb2NrLAotCQkJCXNpemVvZih2Y3B1LT5odl9jbG9jay52ZXJzaW9uKSk7CisJaWYgKHZjcHUtPnB2X3RpbWVfZW5hYmxlZCkKKwkJa3ZtX3NldHVwX3B2Y2xvY2tfcGFnZSh2KTsKKwlpZiAodiA9PSBrdm1fZ2V0X3ZjcHUodi0+a3ZtLCAwKSkKKwkJa3ZtX2h2X3NldHVwX3RzY19wYWdlKHYtPmt2bSwgJnZjcHUtPmh2X2Nsb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjc0MywxNiArMjc4NiwxNiBAQAogCQlpZiAodHNjX2RlbHRhIDwgMCkKIAkJCW1hcmtfdHNjX3Vuc3RhYmxlKCJLVk0gZGlzY292ZXJlZCBiYWNrd2FyZHMgVFNDIik7CiAKKwkJaWYgKGNoZWNrX3RzY191bnN0YWJsZSgpKSB7CisJCQl1NjQgb2Zmc2V0ID0ga3ZtX2NvbXB1dGVfdHNjX29mZnNldCh2Y3B1LAorCQkJCQkJdmNwdS0+YXJjaC5sYXN0X2d1ZXN0X3RzYyk7CisJCQlrdm1fdmNwdV93cml0ZV90c2Nfb2Zmc2V0KHZjcHUsIG9mZnNldCk7CisJCQl2Y3B1LT5hcmNoLnRzY19jYXRjaHVwID0gMTsKKwkJfQogCQlpZiAoa3ZtX2xhcGljX2h2X3RpbWVyX2luX3VzZSh2Y3B1KSAmJgogCQkJCWt2bV94ODZfb3BzLT5zZXRfaHZfdGltZXIodmNwdSwKIAkJCQkJa3ZtX2dldF9sYXBpY190c2NkZWFkbGluZV9tc3IodmNwdSkpKQogCQkJa3ZtX2xhcGljX3N3aXRjaF90b19zd190aW1lcih2Y3B1KTsKLQkJaWYgKGNoZWNrX3RzY191bnN0YWJsZSgpKSB7Ci0JCQl1NjQgb2Zmc2V0ID0ga3ZtX2NvbXB1dGVfdHNjX29mZnNldCh2Y3B1LAotCQkJCQkJdmNwdS0+YXJjaC5sYXN0X2d1ZXN0X3RzYyk7Ci0JCQlrdm1feDg2X29wcy0+d3JpdGVfdHNjX29mZnNldCh2Y3B1LCBvZmZzZXQpOwotCQkJdmNwdS0+YXJjaC50c2NfY2F0Y2h1cCA9IDE7Ci0JCX0KIAkJLyoKIAkJICogT24gYSBob3N0IHdpdGggc3luY2hyb25pemVkIFRTQywgdGhlcmUgaXMgbm8gbmVlZCB0byB1cGRhdGUKIAkJICoga3ZtY2xvY2sgb24gdmNwdS0+Y3B1IG1pZ3JhdGlvbgpAQCAtNDAzOSw3ICs0MDgyLDYgQEAKIAljYXNlIEtWTV9TRVRfQ0xPQ0s6IHsKIAkJc3RydWN0IGt2bV9jbG9ja19kYXRhIHVzZXJfbnM7CiAJCXU2NCBub3dfbnM7Ci0JCXM2NCBkZWx0YTsKIAogCQlyID0gLUVGQVVMVDsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c2VyX25zLCBhcmdwLCBzaXplb2YodXNlcl9ucykpKQpAQCAtNDA1MSwxMCArNDA5Myw5IEBACiAKIAkJciA9IDA7CiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCW5vd19ucyA9IGdldF9rZXJuZWxfbnMoKTsKLQkJZGVsdGEgPSB1c2VyX25zLmNsb2NrIC0gbm93X25zOworCQlub3dfbnMgPSBfX2dldF9rdm1jbG9ja19ucyhrdm0pOworCQlrdm0tPmFyY2gua3ZtY2xvY2tfb2Zmc2V0ICs9IHVzZXJfbnMuY2xvY2sgLSBub3dfbnM7CiAJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJa3ZtLT5hcmNoLmt2bWNsb2NrX29mZnNldCA9IGRlbHRhOwogCQlrdm1fZ2VuX3VwZGF0ZV9tYXN0ZXJjbG9jayhrdm0pOwogCQlicmVhazsKIAl9CkBAIC00MDYyLDEwICs0MTAzLDggQEAKIAkJc3RydWN0IGt2bV9jbG9ja19kYXRhIHVzZXJfbnM7CiAJCXU2NCBub3dfbnM7CiAKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJbm93X25zID0gZ2V0X2tlcm5lbF9ucygpOwotCQl1c2VyX25zLmNsb2NrID0ga3ZtLT5hcmNoLmt2bWNsb2NrX29mZnNldCArIG5vd19uczsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQlub3dfbnMgPSBnZXRfa3ZtY2xvY2tfbnMoa3ZtKTsKKwkJdXNlcl9ucy5jbG9jayA9IG5vd19uczsKIAkJdXNlcl9ucy5mbGFncyA9IDA7CiAJCW1lbXNldCgmdXNlcl9ucy5wYWQsIDAsIHNpemVvZih1c2VyX25zLnBhZCkpOwogCkBAIC02NzAwLDcgKzY3MzksNiBAQAogCiAJa3ZtX3B1dF9ndWVzdF94Y3IwKHZjcHUpOwogCi0JLyogSW50ZXJydXB0IGlzIGVuYWJsZWQgYnkgaGFuZGxlX2V4dGVybmFsX2ludHIoKSAqLwogCWt2bV94ODZfb3BzLT5oYW5kbGVfZXh0ZXJuYWxfaW50cih2Y3B1KTsKIAogCSsrdmNwdS0+c3RhdC5leGl0czsKQEAgLTc1MzAsNyArNzU2OCw3IEBACiAJICogYmVmb3JlIGFueSBLVk0gdGhyZWFkcyBjYW4gYmUgcnVubmluZy4gIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0CiAJICogYnJpbmcgdGhlIFRTQ3MgZnVsbHkgdXAgdG8gZGF0ZSB3aXRoIHJlYWwgdGltZSwgYXMgd2UgYXJlbid0IHlldCBmYXIKIAkgKiBlbm91Z2ggaW50byBDUFUgYnJpbmd1cCB0aGF0IHdlIGtub3cgaG93IG11Y2ggcmVhbCB0aW1lIGhhcyBhY3R1YWxseQotCSAqIGVsYXBzZWQ7IG91ciBoZWxwZXIgZnVuY3Rpb24sIGdldF9rZXJuZWxfbnMoKSB3aWxsIGJlIHVzaW5nIGJvb3QKKwkgKiBlbGFwc2VkOyBvdXIgaGVscGVyIGZ1bmN0aW9uLCBrdGltZV9nZXRfYm9vdF9ucygpIHdpbGwgYmUgdXNpbmcgYm9vdAogCSAqIHZhcmlhYmxlcyB0aGF0IGhhdmVuJ3QgYmVlbiB1cGRhdGVkIHlldC4KIAkgKgogCSAqIFNvIHdlIHNpbXBseSBmaW5kIHRoZSBtYXhpbXVtIG9ic2VydmVkIFRTQyBhYm92ZSwgdGhlbiByZWNvcmQgdGhlCkBAIC03NzY1LDYgKzc4MDMsNyBAQAogCW11dGV4X2luaXQoJmt2bS0+YXJjaC5hcGljX21hcF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgma3ZtLT5hcmNoLnB2Y2xvY2tfZ3RvZF9zeW5jX2xvY2spOwogCisJa3ZtLT5hcmNoLmt2bWNsb2NrX29mZnNldCA9IC1rdGltZV9nZXRfYm9vdF9ucygpOwogCXB2Y2xvY2tfdXBkYXRlX3ZtX2d0b2RfY29weShrdm0pOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmt2bS0+YXJjaC5rdm1jbG9ja191cGRhdGVfd29yaywga3ZtY2xvY2tfdXBkYXRlX2ZuKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS94ODYuaCBiL2FyY2gveDg2L2t2bS94ODYuaAppbmRleCBhODJjYTQ2Li5lOGZmM2U0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0veDg2LmgKKysrIGIvYXJjaC94ODYva3ZtL3g4Ni5oCkBAIC0xNDgsMTEgKzE0OCw2IEBACiAJcmV0dXJuIGt2bV9yZWdpc3Rlcl93cml0ZSh2Y3B1LCByZWcsIHZhbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTY0IGdldF9rZXJuZWxfbnModm9pZCkKLXsKLQlyZXR1cm4ga3RpbWVfZ2V0X2Jvb3RfbnMoKTsKLX0KLQogc3RhdGljIGlubGluZSBib29sIGt2bV9jaGVja19oYXNfcXVpcmsoc3RydWN0IGt2bSAqa3ZtLCB1NjQgcXVpcmspCiB7CiAJcmV0dXJuICEoa3ZtLT5hcmNoLmRpc2FibGVkX3F1aXJrcyAmIHF1aXJrKTsKQEAgLTE2NCw2ICsxNTksNyBAQAogaW50IGt2bV9pbmplY3RfcmVhbG1vZGVfaW50ZXJydXB0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGlycSwgaW50IGluY19laXApOwogCiB2b2lkIGt2bV93cml0ZV90c2Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgbXNyX2RhdGEgKm1zcik7Cit1NjQgZ2V0X2t2bWNsb2NrX25zKHN0cnVjdCBrdm0gKmt2bSk7CiAKIGludCBrdm1fcmVhZF9ndWVzdF92aXJ0KHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAogCWd2YV90IGFkZHIsIHZvaWQgKnZhbCwgdW5zaWduZWQgaW50IGJ5dGVzLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL21lbWNweV82NC5TIGIvYXJjaC94ODYvbGliL21lbWNweV82NC5TCmluZGV4IDJlYzBiMGFiYi4uNDllNmViYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL21lbWNweV82NC5TCisrKyBiL2FyY2gveDg2L2xpYi9tZW1jcHlfNjQuUwpAQCAtMTgxLDExICsxODEsMTEgQEAKIAogI2lmbmRlZiBDT05GSUdfVU1MCiAvKgotICogbWVtY3B5X21jc2FmZSAtIG1lbW9yeSBjb3B5IHdpdGggbWFjaGluZSBjaGVjayBleGNlcHRpb24gaGFuZGxpbmcKKyAqIG1lbWNweV9tY3NhZmVfdW5yb2xsZWQgLSBtZW1vcnkgY29weSB3aXRoIG1hY2hpbmUgY2hlY2sgZXhjZXB0aW9uIGhhbmRsaW5nCiAgKiBOb3RlIHRoYXQgd2Ugb25seSBjYXRjaCBtYWNoaW5lIGNoZWNrcyB3aGVuIHJlYWRpbmcgdGhlIHNvdXJjZSBhZGRyZXNzZXMuCiAgKiBXcml0ZXMgdG8gdGFyZ2V0IGFyZSBwb3N0ZWQgYW5kIGRvbid0IGdlbmVyYXRlIG1hY2hpbmUgY2hlY2tzLgogICovCi1FTlRSWShtZW1jcHlfbWNzYWZlKQorRU5UUlkobWVtY3B5X21jc2FmZV91bnJvbGxlZCkKIAljbXBsICQ4LCAlZWR4CiAJLyogTGVzcyB0aGFuIDggYnl0ZXM/IEdvIHRvIGJ5dGUgY29weSBsb29wICovCiAJamIgLkxfbm9fd2hvbGVfd29yZHMKQEAgLTI3Myw3ICsyNzMsNyBAQAogLkxfZG9uZV9tZW1jcHlfdHJhcDoKIAl4b3JxICVyYXgsICVyYXgKIAlyZXQKLUVORFBST0MobWVtY3B5X21jc2FmZSkKK0VORFBST0MobWVtY3B5X21jc2FmZV91bnJvbGxlZCkKIAogCS5zZWN0aW9uIC5maXh1cCwgImF4IgogCS8qIFJldHVybiAtRUZBVUxUIGZvciBhbnkgZmFpbHVyZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vYW1kdG9wb2xvZ3kuYyBiL2FyY2gveDg2L21tL2FtZHRvcG9sb2d5LmMKaW5kZXggYmE0NzUyNC4uZDFjN2RlMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vYW1kdG9wb2xvZ3kuYworKysgYi9hcmNoL3g4Ni9tbS9hbWR0b3BvbG9neS5jCkBAIC01MiwyMSArNTIsNiBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi1zdGF0aWMgX19pbml0IHZvaWQgZWFybHlfZ2V0X2Jvb3RfY3B1X2lkKHZvaWQpCi17Ci0JLyoKLQkgKiBuZWVkIHRvIGdldCB0aGUgQVBJQyBJRCBvZiB0aGUgQlNQIHNvIGNhbiB1c2UgdGhhdCB0bwotCSAqIGNyZWF0ZSBhcGljaWRfdG9fbm9kZSBpbiBhbWRfc2Nhbl9ub2RlcygpCi0JICovCi0jaWZkZWYgQ09ORklHX1g4Nl9NUFBBUlNFCi0JLyoKLQkgKiBnZXQgYm9vdC10aW1lIFNNUCBjb25maWd1cmF0aW9uOgotCSAqLwotCWlmIChzbXBfZm91bmRfY29uZmlnKQotCQllYXJseV9nZXRfc21wX2NvbmZpZygpOwotI2VuZGlmCi19Ci0KIGludCBfX2luaXQgYW1kX251bWFfaW5pdCh2b2lkKQogewogCXU2NCBzdGFydCA9IFBGTl9QSFlTKDApOwpAQCAtMTgwLDggKzE2NSwxMSBAQAogCWNvcmVzID0gMSA8PCBiaXRzOwogCWFwaWNpZF9iYXNlID0gMDsKIAotCS8qIGdldCB0aGUgQVBJQyBJRCBvZiB0aGUgQlNQIGVhcmx5IGZvciBzeXN0ZW1zIHdpdGggYXBpY2lkIGxpZnRpbmcgKi8KLQllYXJseV9nZXRfYm9vdF9jcHVfaWQoKTsKKwkvKgorCSAqIGdldCBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb246CisJICovCisJZWFybHlfZ2V0X3NtcF9jb25maWcoKTsKKwogCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPiAwKSB7CiAJCXByX2luZm8oIkJTUCBBUElDIElEOiAlMDJ4XG4iLCBib290X2NwdV9waHlzaWNhbF9hcGljaWQpOwogCQlhcGljaWRfYmFzZSA9IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2V4dGFibGUuYyBiL2FyY2gveDg2L21tL2V4dGFibGUuYwppbmRleCA4MzJiOThmLi43OWFlOTM5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9leHRhYmxlLmMKKysrIGIvYXJjaC94ODYvbW0vZXh0YWJsZS5jCkBAIC0xLDQgKzEsNCBAQAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGFibGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2ZhdWx0LmMgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCmluZGV4IGRjODAyMzAuLjFlNTI1MTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2ZhdWx0LmMKKysrIGIvYXJjaC94ODYvbW0vZmF1bHQuYwpAQCAtNSw3ICs1LDcgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CQkvKiB0ZXN0X3RocmVhZF9mbGFnKCksIC4uLgkqLwogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgkJLyogb29wc19iZWdpbi9lbmQsIC4uLgkJKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JCS8qIHNlYXJjaF9leGNlcHRpb25fdGFibGUJKi8KKyNpbmNsdWRlIDxsaW51eC9leHRhYmxlLmg+CQkvKiBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlCSovCiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgkJLyogbWF4X2xvd19wZm4JCQkqLwogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4JCS8qIE5PS1BST0JFX1NZTUJPTCwgLi4uCQkqLwogI2luY2x1ZGUgPGxpbnV4L21taW90cmFjZS5oPgkJLyoga21taW9faGFuZGxlciwgLi4uCQkqLwpAQCAtNzUzLDYgKzc1MywzOCBAQAogCQlyZXR1cm47CiAJfQogCisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKKwkvKgorCSAqIFN0YWNrIG92ZXJmbG93PyAgRHVyaW5nIGJvb3QsIHdlIGNhbiBmYXVsdCBuZWFyIHRoZSBpbml0aWFsCisJICogc3RhY2sgaW4gdGhlIGRpcmVjdCBtYXAsIGJ1dCB0aGF0J3Mgbm90IGFuIG92ZXJmbG93IC0tIGNoZWNrCisJICogdGhhdCB3ZSdyZSBpbiB2bWFsbG9jIHNwYWNlIHRvIGF2b2lkIHRoaXMuCisJICovCisJaWYgKGlzX3ZtYWxsb2NfYWRkcigodm9pZCAqKWFkZHJlc3MpICYmCisJICAgICgoKHVuc2lnbmVkIGxvbmcpdHNrLT5zdGFjayAtIDEgLSBhZGRyZXNzIDwgUEFHRV9TSVpFKSB8fAorCSAgICAgYWRkcmVzcyAtICgodW5zaWduZWQgbG9uZyl0c2stPnN0YWNrICsgVEhSRUFEX1NJWkUpIDwgUEFHRV9TSVpFKSkgeworCQlyZWdpc3RlciB2b2lkICpfX3NwIGFzbSgicnNwIik7CisJCXVuc2lnbmVkIGxvbmcgc3RhY2sgPSB0aGlzX2NwdV9yZWFkKG9yaWdfaXN0LmlzdFtET1VCTEVGQVVMVF9TVEFDS10pIC0gc2l6ZW9mKHZvaWQgKik7CisJCS8qCisJCSAqIFdlJ3JlIGxpa2VseSB0byBiZSBydW5uaW5nIHdpdGggdmVyeSBsaXR0bGUgc3RhY2sgc3BhY2UKKwkJICogbGVmdC4gIEl0J3MgcGxhdXNpYmxlIHRoYXQgd2UnZCBoaXQgdGhpcyBjb25kaXRpb24gYnV0CisJCSAqIGRvdWJsZS1mYXVsdCBldmVuIGJlZm9yZSB3ZSBnZXQgdGhpcyBmYXIsIGluIHdoaWNoIGNhc2UKKwkJICogd2UncmUgZmluZTogdGhlIGRvdWJsZS1mYXVsdCBoYW5kbGVyIHdpbGwgZGVhbCB3aXRoIGl0LgorCQkgKgorCQkgKiBXZSBkb24ndCB3YW50IHRvIG1ha2UgaXQgYWxsIHRoZSB3YXkgaW50byB0aGUgb29wcyBjb2RlCisJCSAqIGFuZCB0aGVuIGRvdWJsZS1mYXVsdCwgdGhvdWdoLCBiZWNhdXNlIHdlJ3JlIGxpa2VseSB0bworCQkgKiBicmVhayB0aGUgY29uc29sZSBkcml2ZXIgYW5kIGxvc2UgbW9zdCBvZiB0aGUgc3RhY2sgZHVtcC4KKwkJICovCisJCWFzbSB2b2xhdGlsZSAoIm1vdnEgJVtzdGFja10sICUlcnNwXG5cdCIKKwkJCSAgICAgICJjYWxsIGhhbmRsZV9zdGFja19vdmVyZmxvd1xuXHQiCisJCQkgICAgICAiMTogam1wIDFiIgorCQkJICAgICAgOiAiK3IiIChfX3NwKQorCQkJICAgICAgOiAiRCIgKCJrZXJuZWwgc3RhY2sgb3ZlcmZsb3cgKHBhZ2UgZmF1bHQpIiksCisJCQkJIlMiIChyZWdzKSwgImQiIChhZGRyZXNzKSwKKwkJCQlbc3RhY2tdICJybSIgKHN0YWNrKSk7CisJCXVucmVhY2hhYmxlKCk7CisJfQorI2VuZGlmCisKIAkvKgogCSAqIDMyLWJpdDoKIAkgKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdC5jIGIvYXJjaC94ODYvbW0vaW5pdC5jCmluZGV4IGQyOGEyZDcuLjIyYWY5MTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXQuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0LmMKQEAgLTY5OSw4ICs2OTksMTAgQEAKIAl9CiB9CiAKLXZvaWQgZnJlZV9pbml0bWVtKHZvaWQpCit2b2lkIF9fcmVmIGZyZWVfaW5pdG1lbSh2b2lkKQogeworCWU4MjBfcmVhbGxvY2F0ZV90YWJsZXMoKTsKKwogCWZyZWVfaW5pdF9wYWdlcygidW51c2VkIGtlcm5lbCIsCiAJCQkodW5zaWduZWQgbG9uZykoJl9faW5pdF9iZWdpbiksCiAJCQkodW5zaWduZWQgbG9uZykoJl9faW5pdF9lbmQpKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2thc2xyLmMgYi9hcmNoL3g4Ni9tbS9rYXNsci5jCmluZGV4IGJkYThkNWUuLmRkZDI2NjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2thc2xyLmMKKysrIGIvYXJjaC94ODYvbW0va2FzbHIuYwpAQCAtNDAsMTcgKzQwLDI2IEBACiAgKiBZb3UgbmVlZCB0byBhZGQgYW4gaWYvZGVmIGVudHJ5IGlmIHlvdSBpbnRyb2R1Y2UgYSBuZXcgbWVtb3J5IHJlZ2lvbgogICogY29tcGF0aWJsZSB3aXRoIEtBU0xSLiBZb3VyIGVudHJ5IG11c3QgYmUgaW4gbG9naWNhbCBvcmRlciB3aXRoIG1lbW9yeQogICogbGF5b3V0LiBGb3IgZXhhbXBsZSwgRVNQRklYIGlzIGJlZm9yZSBFRkkgYmVjYXVzZSBpdHMgdmlydHVhbCBhZGRyZXNzIGlzCi0gKiBiZWZvcmUuIFlvdSBhbHNvIG5lZWQgdG8gYWRkIGEgQlVJTERfQlVHX09OIGluIGtlcm5lbF9yYW5kb21pemVfbWVtb3J5IHRvCisgKiBiZWZvcmUuIFlvdSBhbHNvIG5lZWQgdG8gYWRkIGEgQlVJTERfQlVHX09OKCkgaW4ga2VybmVsX3JhbmRvbWl6ZV9tZW1vcnkoKSB0bwogICogZW5zdXJlIHRoYXQgdGhpcyBvcmRlciBpcyBjb3JyZWN0IGFuZCB3b24ndCBiZSBjaGFuZ2VkLgogICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB2YWRkcl9zdGFydCA9IF9fUEFHRV9PRkZTRVRfQkFTRTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZhZGRyX2VuZCA9IFZNRU1NQVBfU1RBUlQ7CisKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfRVNQRklYNjQpCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyB2YWRkcl9lbmQgPSBFU1BGSVhfQkFTRV9BRERSOworI2VsaWYgZGVmaW5lZChDT05GSUdfRUZJKQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgdmFkZHJfZW5kID0gRUZJX1ZBX1NUQVJUOworI2Vsc2UKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHZhZGRyX2VuZCA9IF9fU1RBUlRfS0VSTkVMX21hcDsKKyNlbmRpZgogCiAvKiBEZWZhdWx0IHZhbHVlcyAqLwogdW5zaWduZWQgbG9uZyBwYWdlX29mZnNldF9iYXNlID0gX19QQUdFX09GRlNFVF9CQVNFOwogRVhQT1JUX1NZTUJPTChwYWdlX29mZnNldF9iYXNlKTsKIHVuc2lnbmVkIGxvbmcgdm1hbGxvY19iYXNlID0gX19WTUFMTE9DX0JBU0U7CiBFWFBPUlRfU1lNQk9MKHZtYWxsb2NfYmFzZSk7Cit1bnNpZ25lZCBsb25nIHZtZW1tYXBfYmFzZSA9IF9fVk1FTU1BUF9CQVNFOworRVhQT1JUX1NZTUJPTCh2bWVtbWFwX2Jhc2UpOwogCiAvKgogICogTWVtb3J5IHJlZ2lvbnMgcmFuZG9taXplZCBieSBLQVNMUiAoZXhjZXB0IG1vZHVsZXMgdGhhdCB1c2UgYSBzZXBhcmF0ZSBsb2dpYwpAQCAtNjMsNiArNzIsNyBAQAogfSBrYXNscl9yZWdpb25zW10gPSB7CiAJeyAmcGFnZV9vZmZzZXRfYmFzZSwgNjQvKiBNYXhpbXVtICovIH0sCiAJeyAmdm1hbGxvY19iYXNlLCBWTUFMTE9DX1NJWkVfVEIgfSwKKwl7ICZ2bWVtbWFwX2Jhc2UsIDEgfSwKIH07CiAKIC8qIEdldCBzaXplIGluIGJ5dGVzIHVzZWQgYnkgdGhlIG1lbW9yeSByZWdpb24gKi8KQEAgLTg5LDYgKzk5LDE4IEBACiAJc3RydWN0IHJuZF9zdGF0ZSByYW5kX3N0YXRlOwogCXVuc2lnbmVkIGxvbmcgcmVtYWluX2VudHJvcHk7CiAKKwkvKgorCSAqIEFsbCB0aGVzZSBCVUlMRF9CVUdfT04gY2hlY2tzIGVuc3VyZXMgdGhlIG1lbW9yeSBsYXlvdXQgaXMKKwkgKiBjb25zaXN0ZW50IHdpdGggdGhlIHZhZGRyX3N0YXJ0L3ZhZGRyX2VuZCB2YXJpYWJsZXMuCisJICovCisJQlVJTERfQlVHX09OKHZhZGRyX3N0YXJ0ID49IHZhZGRyX2VuZCk7CisJQlVJTERfQlVHX09OKGNvbmZpZ19lbmFibGVkKENPTkZJR19YODZfRVNQRklYNjQpICYmCisJCSAgICAgdmFkZHJfZW5kID49IEVGSV9WQV9TVEFSVCk7CisJQlVJTERfQlVHX09OKChjb25maWdfZW5hYmxlZChDT05GSUdfWDg2X0VTUEZJWDY0KSB8fAorCQkgICAgICBjb25maWdfZW5hYmxlZChDT05GSUdfRUZJKSkgJiYKKwkJICAgICB2YWRkcl9lbmQgPj0gX19TVEFSVF9LRVJORUxfbWFwKTsKKwlCVUlMRF9CVUdfT04odmFkZHJfZW5kID4gX19TVEFSVF9LRVJORUxfbWFwKTsKKwogCWlmICgha2FzbHJfbWVtb3J5X2VuYWJsZWQoKSkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9udW1hLmMgYi9hcmNoL3g4Ni9tbS9udW1hLmMKaW5kZXggZmI2ODIxMC4uM2YzNWI0OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbnVtYS5jCisrKyBiL2FyY2gveDg2L21tL251bWEuYwpAQCAtNzIyLDIyICs3MjIsMTkgQEAKIAludW1hX2luaXQoZHVtbXlfbnVtYV9pbml0KTsKIH0KIAotc3RhdGljIF9faW5pdCBpbnQgZmluZF9uZWFyX29ubGluZV9ub2RlKGludCBub2RlKQorc3RhdGljIHZvaWQgX19pbml0IGluaXRfbWVtb3J5X2xlc3Nfbm9kZShpbnQgbmlkKQogewotCWludCBuLCB2YWw7Ci0JaW50IG1pbl92YWwgPSBJTlRfTUFYOwotCWludCBiZXN0X25vZGUgPSAtMTsKKwl1bnNpZ25lZCBsb25nIHpvbmVzX3NpemVbTUFYX05SX1pPTkVTXSA9IHswfTsKKwl1bnNpZ25lZCBsb25nIHpob2xlc19zaXplW01BWF9OUl9aT05FU10gPSB7MH07CiAKLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShuKSB7Ci0JCXZhbCA9IG5vZGVfZGlzdGFuY2Uobm9kZSwgbik7CisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgbm9kZSBkYXRhLiBNZW1vcnktbGVzcyBub2RlIGlzIG5vdyBvbmxpbmUuKi8KKwlhbGxvY19ub2RlX2RhdGEobmlkKTsKKwlmcmVlX2FyZWFfaW5pdF9ub2RlKG5pZCwgem9uZXNfc2l6ZSwgMCwgemhvbGVzX3NpemUpOwogCi0JCWlmICh2YWwgPCBtaW5fdmFsKSB7Ci0JCQltaW5fdmFsID0gdmFsOwotCQkJYmVzdF9ub2RlID0gbjsKLQkJfQotCX0KLQotCXJldHVybiBiZXN0X25vZGU7CisJLyoKKwkgKiBBbGwgem9uZWxpc3RzIHdpbGwgYmUgYnVpbHQgbGF0ZXIgaW4gc3RhcnRfa2VybmVsKCkgYWZ0ZXIgcGVyIGNwdQorCSAqIGFyZWFzIGFyZSBpbml0aWFsaXplZC4KKwkgKi8KIH0KIAogLyoKQEAgLTc2Niw4ICs3NjMsMTAgQEAKIAogCQlpZiAobm9kZSA9PSBOVU1BX05PX05PREUpCiAJCQljb250aW51ZTsKKwogCQlpZiAoIW5vZGVfb25saW5lKG5vZGUpKQotCQkJbm9kZSA9IGZpbmRfbmVhcl9vbmxpbmVfbm9kZShub2RlKTsKKwkJCWluaXRfbWVtb3J5X2xlc3Nfbm9kZShub2RlKTsKKwogCQludW1hX3NldF9ub2RlKGNwdSwgbm9kZSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYyBiL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKaW5kZXggODQ5ZGMwOS4uZTMzNTNjOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYworKysgYi9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCkBAIC05MTcsMTEgKzkxNywxMSBAQAogCX0KIH0KIAotc3RhdGljIGludCBwb3B1bGF0ZV9wbWQoc3RydWN0IGNwYV9kYXRhICpjcGEsCi0JCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKLQkJCXVuc2lnbmVkIG51bV9wYWdlcywgcHVkX3QgKnB1ZCwgcGdwcm90X3QgcGdwcm90KQorc3RhdGljIGxvbmcgcG9wdWxhdGVfcG1kKHN0cnVjdCBjcGFfZGF0YSAqY3BhLAorCQkJIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLAorCQkJIHVuc2lnbmVkIG51bV9wYWdlcywgcHVkX3QgKnB1ZCwgcGdwcm90X3QgcGdwcm90KQogewotCXVuc2lnbmVkIGludCBjdXJfcGFnZXMgPSAwOworCWxvbmcgY3VyX3BhZ2VzID0gMDsKIAlwbWRfdCAqcG1kOwogCXBncHJvdF90IHBtZF9wZ3Byb3Q7CiAKQEAgLTk5MSwxMiArOTkxLDEyIEBACiAJcmV0dXJuIG51bV9wYWdlczsKIH0KIAotc3RhdGljIGludCBwb3B1bGF0ZV9wdWQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHBnZF90ICpwZ2QsCi0JCQlwZ3Byb3RfdCBwZ3Byb3QpCitzdGF0aWMgbG9uZyBwb3B1bGF0ZV9wdWQoc3RydWN0IGNwYV9kYXRhICpjcGEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHBnZF90ICpwZ2QsCisJCQkgcGdwcm90X3QgcGdwcm90KQogewogCXB1ZF90ICpwdWQ7CiAJdW5zaWduZWQgbG9uZyBlbmQ7Ci0JaW50IGN1cl9wYWdlcyA9IDA7CisJbG9uZyBjdXJfcGFnZXMgPSAwOwogCXBncHJvdF90IHB1ZF9wZ3Byb3Q7CiAKIAllbmQgPSBzdGFydCArIChjcGEtPm51bXBhZ2VzIDw8IFBBR0VfU0hJRlQpOwpAQCAtMTA1Miw3ICsxMDUyLDcgQEAKIAogCS8qIE1hcCB0cmFpbGluZyBsZWZ0b3ZlciAqLwogCWlmIChzdGFydCA8IGVuZCkgewotCQlpbnQgdG1wOworCQlsb25nIHRtcDsKIAogCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgc3RhcnQpOwogCQlpZiAocHVkX25vbmUoKnB1ZCkpCkBAIC0xMDc4LDcgKzEwNzgsNyBAQAogCXBncHJvdF90IHBncHJvdCA9IF9fcGdwcm90KF9LRVJOUEdfVEFCTEUpOwogCXB1ZF90ICpwdWQgPSBOVUxMOwkvKiBzaHV0IHVwIGdjYyAqLwogCXBnZF90ICpwZ2RfZW50cnk7Ci0JaW50IHJldDsKKwlsb25nIHJldDsKIAogCXBnZF9lbnRyeSA9IGNwYS0+cGdkICsgcGdkX2luZGV4KGFkZHIpOwogCkBAIC0xMzI3LDcgKzEzMjcsOCBAQAogCiBzdGF0aWMgaW50IF9fY2hhbmdlX3BhZ2VfYXR0cl9zZXRfY2xyKHN0cnVjdCBjcGFfZGF0YSAqY3BhLCBpbnQgY2hlY2thbGlhcykKIHsKLQlpbnQgcmV0LCBudW1wYWdlcyA9IGNwYS0+bnVtcGFnZXM7CisJdW5zaWduZWQgbG9uZyBudW1wYWdlcyA9IGNwYS0+bnVtcGFnZXM7CisJaW50IHJldDsKIAogCXdoaWxlIChudW1wYWdlcykgewogCQkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGF0LmMgYi9hcmNoL3g4Ni9tbS9wYXQuYwppbmRleCBlY2IxYjY5Li4xNzBjYzRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wYXQuYworKysgYi9hcmNoL3g4Ni9tbS9wYXQuYwpAQCAtOTI3LDkgKzkyNywxMCBAQAogfQogCiAvKgotICogcHJvdCBpcyBwYXNzZWQgaW4gYXMgYSBwYXJhbWV0ZXIgZm9yIHRoZSBuZXcgbWFwcGluZy4gSWYgdGhlIHZtYSBoYXMgYQotICogbGluZWFyIHBmbiBtYXBwaW5nIGZvciB0aGUgZW50aXJlIHJhbmdlIHJlc2VydmUgdGhlIGVudGlyZSB2bWEgcmFuZ2Ugd2l0aAotICogc2luZ2xlIHJlc2VydmVfcGZuX3JhbmdlIGNhbGwuCisgKiBwcm90IGlzIHBhc3NlZCBpbiBhcyBhIHBhcmFtZXRlciBmb3IgdGhlIG5ldyBtYXBwaW5nLiBJZiB0aGUgdm1hIGhhcworICogYSBsaW5lYXIgcGZuIG1hcHBpbmcgZm9yIHRoZSBlbnRpcmUgcmFuZ2UsIG9yIG5vIHZtYSBpcyBwcm92aWRlZCwKKyAqIHJlc2VydmUgdGhlIGVudGlyZSBwZm4gKyBzaXplIHJhbmdlIHdpdGggc2luZ2xlIHJlc2VydmVfcGZuX3JhbmdlCisgKiBjYWxsLgogICovCiBpbnQgdHJhY2tfcGZuX3JlbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwZ3Byb3RfdCAqcHJvdCwKIAkJICAgIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKQEAgLTkzOCwxMSArOTM5LDEyIEBACiAJZW51bSBwYWdlX2NhY2hlX21vZGUgcGNtOwogCiAJLyogcmVzZXJ2ZSB0aGUgd2hvbGUgY2h1bmsgc3RhcnRpbmcgZnJvbSBwYWRkciAqLwotCWlmIChhZGRyID09IHZtYS0+dm1fc3RhcnQgJiYgc2l6ZSA9PSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSkgeworCWlmICghdm1hIHx8IChhZGRyID09IHZtYS0+dm1fc3RhcnQKKwkJCQkmJiBzaXplID09ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpKSkgewogCQlpbnQgcmV0OwogCiAJCXJldCA9IHJlc2VydmVfcGZuX3JhbmdlKHBhZGRyLCBzaXplLCBwcm90LCAwKTsKLQkJaWYgKCFyZXQpCisJCWlmIChyZXQgPT0gMCAmJiB2bWEpCiAJCQl2bWEtPnZtX2ZsYWdzIHw9IFZNX1BBVDsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC05OTcsNyArOTk5LDcgQEAKIAlyZXNvdXJjZV9zaXplX3QgcGFkZHI7CiAJdW5zaWduZWQgbG9uZyBwcm90OwogCi0JaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1BBVCkpCisJaWYgKHZtYSAmJiAhKHZtYS0+dm1fZmxhZ3MgJiBWTV9QQVQpKQogCQlyZXR1cm47CiAKIAkvKiBmcmVlIHRoZSBjaHVuayBzdGFydGluZyBmcm9tIHBmbiBvciB0aGUgd2hvbGUgY2h1bmsgKi8KQEAgLTEwMTEsNyArMTAxMyw4IEBACiAJCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CiAJfQogCWZyZWVfcGZuX3JhbmdlKHBhZGRyLCBzaXplKTsKLQl2bWEtPnZtX2ZsYWdzICY9IH5WTV9QQVQ7CisJaWYgKHZtYSkKKwkJdm1hLT52bV9mbGFncyAmPSB+Vk1fUEFUOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGF0X3JidHJlZS5jIGIvYXJjaC94ODYvbW0vcGF0X3JidHJlZS5jCmluZGV4IGRlMzkxYjcuLjE1OWI1MmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3BhdF9yYnRyZWUuYworKysgYi9hcmNoL3g4Ni9tbS9wYXRfcmJ0cmVlLmMKQEAgLTI1NCw5ICsyNTQsNyBAQAogCiBzdHJ1Y3QgbWVtdHlwZSAqcmJ0X21lbXR5cGVfbG9va3VwKHU2NCBhZGRyKQogewotCXN0cnVjdCBtZW10eXBlICpkYXRhOwotCWRhdGEgPSBtZW10eXBlX3JiX2xvd2VzdF9tYXRjaCgmbWVtdHlwZV9yYnJvb3QsIGFkZHIsIGFkZHIgKyBQQUdFX1NJWkUpOwotCXJldHVybiBkYXRhOworCXJldHVybiBtZW10eXBlX3JiX2xvd2VzdF9tYXRjaCgmbWVtdHlwZV9yYnJvb3QsIGFkZHIsIGFkZHIgKyBQQUdFX1NJWkUpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfREVCVUdfRlMpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS90bGIuYyBiL2FyY2gveDg2L21tL3RsYi5jCmluZGV4IDRkYmU2NTYuLmE3NjU1ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3RsYi5jCisrKyBiL2FyY2gveDg2L21tL3RsYi5jCkBAIC03NywxMCArNzcsMjUgQEAKIAl1bnNpZ25lZCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlpZiAobGlrZWx5KHByZXYgIT0gbmV4dCkpIHsKKwkJaWYgKElTX0VOQUJMRUQoQ09ORklHX1ZNQVBfU1RBQ0spKSB7CisJCQkvKgorCQkJICogSWYgb3VyIGN1cnJlbnQgc3RhY2sgaXMgaW4gdm1hbGxvYyBzcGFjZSBhbmQgaXNuJ3QKKwkJCSAqIG1hcHBlZCBpbiB0aGUgbmV3IHBnZCwgd2UnbGwgZG91YmxlLWZhdWx0LiAgRm9yY2libHkKKwkJCSAqIG1hcCBpdC4KKwkJCSAqLworCQkJdW5zaWduZWQgaW50IHN0YWNrX3BnZF9pbmRleCA9IHBnZF9pbmRleChjdXJyZW50X3N0YWNrX3BvaW50ZXIoKSk7CisKKwkJCXBnZF90ICpwZ2QgPSBuZXh0LT5wZ2QgKyBzdGFja19wZ2RfaW5kZXg7CisKKwkJCWlmICh1bmxpa2VseShwZ2Rfbm9uZSgqcGdkKSkpCisJCQkJc2V0X3BnZChwZ2QsIGluaXRfbW0ucGdkW3N0YWNrX3BnZF9pbmRleF0pOworCQl9CisKICNpZmRlZiBDT05GSUdfU01QCiAJCXRoaXNfY3B1X3dyaXRlKGNwdV90bGJzdGF0ZS5zdGF0ZSwgVExCU1RBVEVfT0spOwogCQl0aGlzX2NwdV93cml0ZShjcHVfdGxic3RhdGUuYWN0aXZlX21tLCBuZXh0KTsKICNlbmRpZgorCiAJCWNwdW1hc2tfc2V0X2NwdShjcHUsIG1tX2NwdW1hc2sobmV4dCkpOwogCiAJCS8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9iYWNrdHJhY2UuYyBiL2FyY2gveDg2L29wcm9maWxlL2JhY2t0cmFjZS5jCmluZGV4IGNiMzFhNDQuLmEyNDg4YjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL2JhY2t0cmFjZS5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL2JhY2t0cmFjZS5jCkBAIC0xNiwyNyArMTYsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+Ci0KLXN0YXRpYyBpbnQgYmFja3RyYWNlX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCi17Ci0JLyogWWVzLCB3ZSB3YW50IGFsbCBzdGFja3MgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiYWNrdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKLXsKLQl1bnNpZ25lZCBpbnQgKmRlcHRoID0gZGF0YTsKLQotCWlmICgoKmRlcHRoKS0tKQotCQlvcHJvZmlsZV9hZGRfdHJhY2UoYWRkcik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgYmFja3RyYWNlX29wcyA9IHsKLQkuc3RhY2sJCT0gYmFja3RyYWNlX3N0YWNrLAotCS5hZGRyZXNzCT0gYmFja3RyYWNlX2FkZHJlc3MsCi0JLndhbGtfc3RhY2sJPSBwcmludF9jb250ZXh0X3N0YWNrLAotfTsKKyNpbmNsdWRlIDxhc20vdW53aW5kLmg+CiAKICNpZmRlZiBDT05GSUdfQ09NUEFUCiBzdGF0aWMgc3RydWN0IHN0YWNrX2ZyYW1lX2lhMzIgKgpAQCAtMTEzLDEwICs5MywyOSBAQAogCXN0cnVjdCBzdGFja19mcmFtZSAqaGVhZCA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKilmcmFtZV9wb2ludGVyKHJlZ3MpOwogCiAJaWYgKCF1c2VyX21vZGUocmVncykpIHsKLQkJdW5zaWduZWQgbG9uZyBzdGFjayA9IGtlcm5lbF9zdGFja19wb2ludGVyKHJlZ3MpOwotCQlpZiAoZGVwdGgpCi0JCQlkdW1wX3RyYWNlKE5VTEwsIHJlZ3MsICh1bnNpZ25lZCBsb25nICopc3RhY2ssIDAsCi0JCQkJICAgJmJhY2t0cmFjZV9vcHMsICZkZXB0aCk7CisJCXN0cnVjdCB1bndpbmRfc3RhdGUgc3RhdGU7CisJCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCQlpZiAoIWRlcHRoKQorCQkJcmV0dXJuOworCisJCW9wcm9maWxlX2FkZF90cmFjZShyZWdzLT5pcCk7CisKKwkJaWYgKCEtLWRlcHRoKQorCQkJcmV0dXJuOworCisJCWZvciAodW53aW5kX3N0YXJ0KCZzdGF0ZSwgY3VycmVudCwgcmVncywgTlVMTCk7CisJCSAgICAgIXVud2luZF9kb25lKCZzdGF0ZSk7IHVud2luZF9uZXh0X2ZyYW1lKCZzdGF0ZSkpIHsKKwkJCWFkZHIgPSB1bndpbmRfZ2V0X3JldHVybl9hZGRyZXNzKCZzdGF0ZSk7CisJCQlpZiAoIWFkZHIpCisJCQkJYnJlYWs7CisKKwkJCW9wcm9maWxlX2FkZF90cmFjZShhZGRyKTsKKworCQkJaWYgKCEtLWRlcHRoKQorCQkJCWJyZWFrOworCQl9CisKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL01ha2VmaWxlIGIvYXJjaC94ODYvcGNpL01ha2VmaWxlCmluZGV4IDk3MDYyYTYuLjVjNmZjMzUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9wY2kvTWFrZWZpbGUKQEAgLTIzLDggKzIzLDYgQEAKIG9iai0kKENPTkZJR19BTURfTkIpCQkrPSBhbWRfYnVzLm8KIG9iai0kKENPTkZJR19QQ0lfQ05CMjBMRV9RVUlSSykJKz0gYnJvYWRjb21fYnVzLm8KIAotb2JqLSQoQ09ORklHX1ZNRCkgKz0gdm1kLm8KLQogaWZlcSAoJChDT05GSUdfUENJX0RFQlVHKSx5KQogRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcKIGVuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMgYi9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKaW5kZXggN2I2YTlkMS4uYTRmZGZhNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwpAQCAtNjc3LDYgKzY3NywxMiBAQAogc3RhdGljIHZvaWQgc2V0X2RtYV9kb21haW5fb3BzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KSB7fQogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIHNldF9kZXZfZG9tYWluX29wdGlvbnMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaWYgKGlzX3ZtZChwZGV2LT5idXMpKQorCQlwZGV2LT5ob3RwbHVnX3VzZXJfaW5kaWNhdG9ycyA9IDE7Cit9CisKIGludCBwY2liaW9zX2FkZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3Qgc2V0dXBfZGF0YSAqZGF0YTsKQEAgLTcwNyw2ICs3MTMsNyBAQAogCQlpb3VubWFwKGRhdGEpOwogCX0KIAlzZXRfZG1hX2RvbWFpbl9vcHMoZGV2KTsKKwlzZXRfZGV2X2RvbWFpbl9vcHRpb25zKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9maXh1cC5jIGIvYXJjaC94ODYvcGNpL2ZpeHVwLmMKaW5kZXggODM3ZWEzNi4uNmQ1MmI5NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2ZpeHVwLmMKKysrIGIvYXJjaC94ODYvcGNpL2ZpeHVwLmMKQEAgLTU1MywxNSArNTUzLDIxIEBACiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyN0I5LCB0d2luaGVhZF9yZXNlcnZlX2tpbGxpbmdfem9uZSk7CiAKIC8qCi0gKiBCcm9hZHdlbGwgRVAgSG9tZSBBZ2VudCBCQVJzIGVycm9uZW91c2x5IHJldHVybiBub24temVybyB2YWx1ZXMgd2hlbiByZWFkLgorICogRGV2aWNlIFs4MDg2OjJmYzBdCisgKiBFcnJhdHVtIEhTRTQzCisgKiBDT05GSUdfVERQX05PTUlOQUwgQ1NSIEltcGxlbWVudGVkIGF0IEluY29ycmVjdCBPZmZzZXQKKyAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL2NvbnRlbnQvd3d3L3VzL2VuL3Byb2Nlc3NvcnMveGVvbi94ZW9uLWU1LXYzLXNwZWMtdXBkYXRlLmh0bWwKICAqCi0gKiBTZWUgaHR0cDovL3d3dy5pbnRlbC5jb20vY29udGVudC93d3cvdXMvZW4vcHJvY2Vzc29ycy94ZW9uL3hlb24tZTUtdjQtc3BlYy11cGRhdGUuaHRtbAotICogZW50cnkgQkRGMi4KKyAqIERldmljZXMgWzgwODY6NmY2MCw2ZmEwLDZmYzBdCisgKiBFcnJhdHVtIEJERjIKKyAqIFBDSSBCQVJzIGluIHRoZSBIb21lIEFnZW50IFdpbGwgUmV0dXJuIE5vbi1aZXJvIFZhbHVlcyBEdXJpbmcgRW51bWVyYXRpb24KKyAqIGh0dHA6Ly93d3cuaW50ZWwuY29tL2NvbnRlbnQvd3d3L3VzL2VuL3Byb2Nlc3NvcnMveGVvbi94ZW9uLWU1LXY0LXNwZWMtdXBkYXRlLmh0bWwKICAqLwotc3RhdGljIHZvaWQgcGNpX2Jkd2VwX2JhcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgcGNpX2ludmFsaWRfYmFyKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJZGV2LT5ub25fY29tcGxpYW50X2JhcnMgPSAxOwogfQotREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2ZjYwLCBwY2lfYmR3ZXBfYmFyKTsKLURFQ0xBUkVfUENJX0ZJWFVQX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4NmZhMCwgcGNpX2Jkd2VwX2Jhcik7Ci1ERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDZmYzAsIHBjaV9iZHdlcF9iYXIpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyZmMwLCBwY2lfaW52YWxpZF9iYXIpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2ZjYwLCBwY2lfaW52YWxpZF9iYXIpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2ZmEwLCBwY2lfaW52YWxpZF9iYXIpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg2ZmMwLCBwY2lfaW52YWxpZF9iYXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL3BjYmlvcy5jIGIvYXJjaC94ODYvcGNpL3BjYmlvcy5jCmluZGV4IDk3NzBlNTUuLjFkOTdjZWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9wY2Jpb3MuYworKysgYi9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMKQEAgLTEyMCw5ICsxMjAsMTIgQEAKIHN0YXRpYyBzdHJ1Y3QgewogCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKIAl1bnNpZ25lZCBzaG9ydCBzZWdtZW50OwotfSBwY2lfaW5kaXJlY3QgPSB7IDAsIF9fS0VSTkVMX0NTIH07Cit9IHBjaV9pbmRpcmVjdCBfX3JvX2FmdGVyX2luaXQgPSB7CisJLmFkZHJlc3MgPSAwLAorCS5zZWdtZW50ID0gX19LRVJORUxfQ1MsCit9OwogCi1zdGF0aWMgaW50IHBjaV9iaW9zX3ByZXNlbnQ7CitzdGF0aWMgaW50IHBjaV9iaW9zX3ByZXNlbnQgX19yb19hZnRlcl9pbml0OwogCiBzdGF0aWMgaW50IF9faW5pdCBjaGVja19wY2liaW9zKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvdm1kLmMgYi9hcmNoL3g4Ni9wY2kvdm1kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NDhiZTMuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvcGNpL3ZtZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzcxICswLDAgQEAKLS8qCi0gKiBWb2x1bWUgTWFuYWdlbWVudCBEZXZpY2UgZHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+Ci0KLSNpbmNsdWRlIDxhc20vaXJxZG9tYWluLmg+Ci0jaW5jbHVkZSA8YXNtL2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9tc2kuaD4KLSNpbmNsdWRlIDxhc20vbXNpZGVmLmg+Ci0KLSNkZWZpbmUgVk1EX0NGR0JBUgkwCi0jZGVmaW5lIFZNRF9NRU1CQVIxCTIKLSNkZWZpbmUgVk1EX01FTUJBUjIJNAotCi0vKgotICogTG9jayBmb3IgbWFuaXB1bGF0aW5nIFZNRCBJUlEgbGlzdHMuCi0gKi8KLXN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGxpc3RfbG9jayk7Ci0KLS8qKgotICogc3RydWN0IHZtZF9pcnEgLSBwcml2YXRlIGRhdGEgdG8gbWFwIGRyaXZlciBJUlEgdG8gdGhlIFZNRCBzaGFyZWQgdmVjdG9yCi0gKiBAbm9kZToJbGlzdCBpdGVtIGZvciBwYXJlbnQgdHJhdmVyc2FsLgotICogQHJjdToJUkNVIGNhbGxiYWNrIGl0ZW0gZm9yIGZyZWVpbmcuCi0gKiBAaXJxOgliYWNrIHBvaW50ZXIgdG8gcGFyZW50LgotICogQGVuYWJsZWQ6CXRydWUgaWYgZHJpdmVyIGVuYWJsZWQgSVJRCi0gKiBAdmlycToJdGhlIHZpcnR1YWwgSVJRIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSByZXF1ZXN0aW5nIGRyaXZlci4KLSAqCi0gKiBFdmVyeSBNU0kvTVNJLVggSVJRIHJlcXVlc3RlZCBmb3IgYSBkZXZpY2UgaW4gYSBWTUQgZG9tYWluIHdpbGwgYmUgbWFwcGVkIHRvCi0gKiBhIFZNRCBJUlEgdXNpbmcgdGhpcyBzdHJ1Y3R1cmUuCi0gKi8KLXN0cnVjdCB2bWRfaXJxIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7Ci0Jc3RydWN0IHJjdV9oZWFkCQlyY3U7Ci0Jc3RydWN0IHZtZF9pcnFfbGlzdAkqaXJxOwotCWJvb2wJCQllbmFibGVkOwotCXVuc2lnbmVkIGludAkJdmlycTsKLX07Ci0KLS8qKgotICogc3RydWN0IHZtZF9pcnFfbGlzdCAtIGxpc3Qgb2YgZHJpdmVyIHJlcXVlc3RlZCBJUlFzIG1hcHBpbmcgdG8gYSBWTUQgdmVjdG9yCi0gKiBAaXJxX2xpc3Q6CXRoZSBsaXN0IG9mIGlycSdzIHRoZSBWTUQgb25lIGRlbXV4ZXMgdG8uCi0gKiBAdm1kX3ZlY3RvcjoJdGhlIGgvdyBJUlEgYXNzaWduZWQgdG8gdGhlIFZNRC4KLSAqIEBpbmRleDoJaW5kZXggaW50byB0aGUgVk1EIE1TSS1YIHRhYmxlOyB1c2VkIGZvciBtZXNzYWdlIHJvdXRpbmcuCi0gKiBAY291bnQ6CW51bWJlciBvZiBjaGlsZCBJUlFzIGFzc2lnbmVkIHRvIHRoaXMgdmVjdG9yOyB1c2VkIHRvIHRyYWNrCi0gKgkJc2hhcmluZy4KLSAqLwotc3RydWN0IHZtZF9pcnFfbGlzdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlpcnFfbGlzdDsKLQlzdHJ1Y3Qgdm1kX2RldgkJKnZtZDsKLQl1bnNpZ25lZCBpbnQJCXZtZF92ZWN0b3I7Ci0JdW5zaWduZWQgaW50CQlpbmRleDsKLQl1bnNpZ25lZCBpbnQJCWNvdW50OwotfTsKLQotc3RydWN0IHZtZF9kZXYgewotCXN0cnVjdCBwY2lfZGV2CQkqZGV2OwotCi0Jc3BpbmxvY2tfdAkJY2ZnX2xvY2s7Ci0JY2hhciBfX2lvbWVtCQkqY2ZnYmFyOwotCi0JaW50IG1zaXhfY291bnQ7Ci0Jc3RydWN0IG1zaXhfZW50cnkJKm1zaXhfZW50cmllczsKLQlzdHJ1Y3Qgdm1kX2lycV9saXN0CSppcnFzOwotCi0Jc3RydWN0IHBjaV9zeXNkYXRhCXN5c2RhdGE7Ci0Jc3RydWN0IHJlc291cmNlCQlyZXNvdXJjZXNbM107Ci0Jc3RydWN0IGlycV9kb21haW4JKmlycV9kb21haW47Ci0Jc3RydWN0IHBjaV9idXMJCSpidXM7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0RFVl9ETUFfT1BTCi0Jc3RydWN0IGRtYV9tYXBfb3BzCWRtYV9vcHM7Ci0Jc3RydWN0IGRtYV9kb21haW4JZG1hX2RvbWFpbjsKLSNlbmRpZgotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm1kX2RldiAqdm1kX2Zyb21fYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihidXMtPnN5c2RhdGEsIHN0cnVjdCB2bWRfZGV2LCBzeXNkYXRhKTsKLX0KLQotLyoKLSAqIERyaXZlcnMgbWFuYWdpbmcgYSBkZXZpY2UgaW4gYSBWTUQgZG9tYWluIGFsbG9jYXRlIHRoZWlyIG93biBJUlFzIGFzIGJlZm9yZSwKLSAqIGJ1dCB0aGUgTVNJIGVudHJ5IGZvciB0aGUgaGFyZHdhcmUgaXQncyBkcml2aW5nIHdpbGwgYmUgcHJvZ3JhbW1lZCB3aXRoIGEKLSAqIGRlc3RpbmF0aW9uIElEIGZvciB0aGUgVk1EIE1TSS1YIHRhYmxlLiAgVGhlIFZNRCBtdXhlcyBpbnRlcnJ1cHRzIGluIGl0cwotICogZG9tYWluIGludG8gb25lIG9mIGl0cyBvd24sIGFuZCB0aGUgVk1EIGRyaXZlciBkZS1tdXhlcyB0aGVzZSBmb3IgdGhlCi0gKiBoYW5kbGVycyBzaGFyaW5nIHRoYXQgVk1EIElSUS4gIFRoZSB2bWQgaXJxX2RvbWFpbiBwcm92aWRlcyB0aGUgb3BlcmF0aW9ucwotICogYW5kIGlycV9jaGlwIHRvIHNldCB0aGlzIHVwLgotICovCi1zdGF0aWMgdm9pZCB2bWRfY29tcG9zZV9tc2lfbXNnKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgc3RydWN0IG1zaV9tc2cgKm1zZykKLXsKLQlzdHJ1Y3Qgdm1kX2lycSAqdm1kaXJxID0gZGF0YS0+Y2hpcF9kYXRhOwotCXN0cnVjdCB2bWRfaXJxX2xpc3QgKmlycSA9IHZtZGlycS0+aXJxOwotCi0JbXNnLT5hZGRyZXNzX2hpID0gTVNJX0FERFJfQkFTRV9ISTsKLQltc2ctPmFkZHJlc3NfbG8gPSBNU0lfQUREUl9CQVNFX0xPIHwgTVNJX0FERFJfREVTVF9JRChpcnEtPmluZGV4KTsKLQltc2ctPmRhdGEgPSAwOwotfQotCi0vKgotICogV2UgcmVseSBvbiBNU0lfRkxBR19VU0VfREVGX0NISVBfT1BTIHRvIHNldCB0aGUgSVJRIG1hc2svdW5tYXNrIG9wcy4KLSAqLwotc3RhdGljIHZvaWQgdm1kX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCXN0cnVjdCB2bWRfaXJxICp2bWRpcnEgPSBkYXRhLT5jaGlwX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7Ci0JV0FSTl9PTih2bWRpcnEtPmVuYWJsZWQpOwotCWxpc3RfYWRkX3RhaWxfcmN1KCZ2bWRpcnEtPm5vZGUsICZ2bWRpcnEtPmlycS0+aXJxX2xpc3QpOwotCXZtZGlycS0+ZW5hYmxlZCA9IHRydWU7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOwotCi0JZGF0YS0+Y2hpcC0+aXJxX3VubWFzayhkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgdm1kX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3Qgdm1kX2lycSAqdm1kaXJxID0gZGF0YS0+Y2hpcF9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlkYXRhLT5jaGlwLT5pcnFfbWFzayhkYXRhKTsKLQotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7Ci0JaWYgKHZtZGlycS0+ZW5hYmxlZCkgewotCQlsaXN0X2RlbF9yY3UoJnZtZGlycS0+bm9kZSk7Ci0JCXZtZGlycS0+ZW5hYmxlZCA9IGZhbHNlOwotCX0KLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiBYWFg6IFN0dWJiZWQgdW50aWwgd2UgZGV2ZWxvcCBhY2NlcHRhYmxlIHdheSB0byBub3QgY3JlYXRlIGNvbmZsaWN0cyB3aXRoCi0gKiBvdGhlciBkZXZpY2VzIHNoYXJpbmcgdGhlIHNhbWUgdmVjdG9yLgotICovCi1zdGF0aWMgaW50IHZtZF9pcnFfc2V0X2FmZmluaXR5KHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwKLQkJCQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCwgYm9vbCBmb3JjZSkKLXsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB2bWRfbXNpX2NvbnRyb2xsZXIgPSB7Ci0JLm5hbWUJCQk9ICJWTUQtTVNJIiwKLQkuaXJxX2VuYWJsZQkJPSB2bWRfaXJxX2VuYWJsZSwKLQkuaXJxX2Rpc2FibGUJCT0gdm1kX2lycV9kaXNhYmxlLAotCS5pcnFfY29tcG9zZV9tc2lfbXNnCT0gdm1kX2NvbXBvc2VfbXNpX21zZywKLQkuaXJxX3NldF9hZmZpbml0eQk9IHZtZF9pcnFfc2V0X2FmZmluaXR5LAotfTsKLQotc3RhdGljIGlycV9od19udW1iZXJfdCB2bWRfZ2V0X2h3aXJxKHN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm8sCi0JCQkJICAgICBtc2lfYWxsb2NfaW5mb190ICphcmcpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBYWFg6IFdlIGNhbiBiZSBldmVuIHNtYXJ0ZXIgc2VsZWN0aW5nIHRoZSBiZXN0IElSUSBvbmNlIHdlIHNvbHZlIHRoZQotICogYWZmaW5pdHkgcHJvYmxlbS4KLSAqLwotc3RhdGljIHN0cnVjdCB2bWRfaXJxX2xpc3QgKnZtZF9uZXh0X2lycShzdHJ1Y3Qgdm1kX2RldiAqdm1kLCBzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MpCi17Ci0JaW50IGksIGJlc3QgPSAxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWRlc2MtPm1zaV9hdHRyaWIuaXNfbXNpeCB8fCB2bWQtPm1zaXhfY291bnQgPT0gMSkKLQkJcmV0dXJuICZ2bWQtPmlycXNbMF07Ci0KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IDE7IGkgPCB2bWQtPm1zaXhfY291bnQ7IGkrKykKLQkJaWYgKHZtZC0+aXJxc1tpXS5jb3VudCA8IHZtZC0+aXJxc1tiZXN0XS5jb3VudCkKLQkJCWJlc3QgPSBpOwotCXZtZC0+aXJxc1tiZXN0XS5jb3VudCsrOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAmdm1kLT5pcnFzW2Jlc3RdOwotfQotCi1zdGF0aWMgaW50IHZtZF9tc2lfaW5pdChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvICppbmZvLAotCQkJdW5zaWduZWQgaW50IHZpcnEsIGlycV9od19udW1iZXJfdCBod2lycSwKLQkJCW1zaV9hbGxvY19pbmZvX3QgKmFyZykKLXsKLQlzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MgPSBhcmctPmRlc2M7Ci0Jc3RydWN0IHZtZF9kZXYgKnZtZCA9IHZtZF9mcm9tX2J1cyhtc2lfZGVzY190b19wY2lfZGV2KGRlc2MpLT5idXMpOwotCXN0cnVjdCB2bWRfaXJxICp2bWRpcnEgPSBremFsbG9jKHNpemVvZigqdm1kaXJxKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIXZtZGlycSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlJTklUX0xJU1RfSEVBRCgmdm1kaXJxLT5ub2RlKTsKLQl2bWRpcnEtPmlycSA9IHZtZF9uZXh0X2lycSh2bWQsIGRlc2MpOwotCXZtZGlycS0+dmlycSA9IHZpcnE7Ci0KLQlpcnFfZG9tYWluX3NldF9pbmZvKGRvbWFpbiwgdmlycSwgdm1kaXJxLT5pcnEtPnZtZF92ZWN0b3IsIGluZm8tPmNoaXAsCi0JCQkgICAgdm1kaXJxLCBoYW5kbGVfdW50cmFja2VkX2lycSwgdm1kLCBOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdm1kX21zaV9mcmVlKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sCi0JCQlzdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgdmlycSkKLXsKLQlzdHJ1Y3Qgdm1kX2lycSAqdm1kaXJxID0gaXJxX2dldF9jaGlwX2RhdGEodmlycSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIFhYWDogUG90ZW50aWFsIG9wdGltaXphdGlvbiB0byByZWJhbGFuY2UgKi8KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwotCXZtZGlycS0+aXJxLT5jb3VudC0tOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKLQotCWtmcmVlX3JjdSh2bWRpcnEsIHJjdSk7Ci19Ci0KLXN0YXRpYyBpbnQgdm1kX21zaV9wcmVwYXJlKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sIHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgIGludCBudmVjLCBtc2lfYWxsb2NfaW5mb190ICphcmcpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7Ci0Jc3RydWN0IHZtZF9kZXYgKnZtZCA9IHZtZF9mcm9tX2J1cyhwZGV2LT5idXMpOwotCi0JaWYgKG52ZWMgPiB2bWQtPm1zaXhfY291bnQpCi0JCXJldHVybiB2bWQtPm1zaXhfY291bnQ7Ci0KLQltZW1zZXQoYXJnLCAwLCBzaXplb2YoKmFyZykpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB2bWRfc2V0X2Rlc2MobXNpX2FsbG9jX2luZm9fdCAqYXJnLCBzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MpCi17Ci0JYXJnLT5kZXNjID0gZGVzYzsKLX0KLQotc3RhdGljIHN0cnVjdCBtc2lfZG9tYWluX29wcyB2bWRfbXNpX2RvbWFpbl9vcHMgPSB7Ci0JLmdldF9od2lycQk9IHZtZF9nZXRfaHdpcnEsCi0JLm1zaV9pbml0CT0gdm1kX21zaV9pbml0LAotCS5tc2lfZnJlZQk9IHZtZF9tc2lfZnJlZSwKLQkubXNpX3ByZXBhcmUJPSB2bWRfbXNpX3ByZXBhcmUsCi0JLnNldF9kZXNjCT0gdm1kX3NldF9kZXNjLAotfTsKLQotc3RhdGljIHN0cnVjdCBtc2lfZG9tYWluX2luZm8gdm1kX21zaV9kb21haW5faW5mbyA9IHsKLQkuZmxhZ3MJCT0gTVNJX0ZMQUdfVVNFX0RFRl9ET01fT1BTIHwgTVNJX0ZMQUdfVVNFX0RFRl9DSElQX09QUyB8Ci0JCQkgIE1TSV9GTEFHX1BDSV9NU0lYLAotCS5vcHMJCT0gJnZtZF9tc2lfZG9tYWluX29wcywKLQkuY2hpcAkJPSAmdm1kX21zaV9jb250cm9sbGVyLAotfTsKLQotI2lmZGVmIENPTkZJR19YODZfREVWX0RNQV9PUFMKLS8qCi0gKiBWTUQgcmVwbGFjZXMgdGhlIHJlcXVlc3RlciBJRCB3aXRoIGl0cyBvd24uICBETUEgbWFwcGluZ3MgZm9yIGRldmljZXMgaW4gYQotICogVk1EIGRvbWFpbiBuZWVkIHRvIGJlIG1hcHBlZCBmb3IgdGhlIFZNRCwgbm90IHRoZSBkZXZpY2UgcmVxdWlyaW5nCi0gKiB0aGUgbWFwcGluZy4KLSAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2UgKnRvX3ZtZF9kZXYoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCB2bWRfZGV2ICp2bWQgPSB2bWRfZnJvbV9idXMocGRldi0+YnVzKTsKLQotCXJldHVybiAmdm1kLT5kZXYtPmRldjsKLX0KLQotc3RhdGljIHN0cnVjdCBkbWFfbWFwX29wcyAqdm1kX2RtYV9vcHMoc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBnZXRfZG1hX29wcyh0b192bWRfZGV2KGRldikpOwotfQotCi1zdGF0aWMgdm9pZCAqdm1kX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmFkZHIsCi0JCSAgICAgICBnZnBfdCBmbGFnLCB1bnNpZ25lZCBsb25nIGF0dHJzKQotewotCXJldHVybiB2bWRfZG1hX29wcyhkZXYpLT5hbGxvYyh0b192bWRfZGV2KGRldiksIHNpemUsIGFkZHIsIGZsYWcsCi0JCQkJICAgICAgIGF0dHJzKTsKLX0KLQotc3RhdGljIHZvaWQgdm1kX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsCi0JCSAgICAgZG1hX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIGF0dHJzKQotewotCXJldHVybiB2bWRfZG1hX29wcyhkZXYpLT5mcmVlKHRvX3ZtZF9kZXYoZGV2KSwgc2l6ZSwgdmFkZHIsIGFkZHIsCi0JCQkJICAgICAgYXR0cnMpOwotfQotCi1zdGF0aWMgaW50IHZtZF9tbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCSAgICB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBhZGRyLCBzaXplX3Qgc2l6ZSwKLQkJICAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCi17Ci0JcmV0dXJuIHZtZF9kbWFfb3BzKGRldiktPm1tYXAodG9fdm1kX2RldihkZXYpLCB2bWEsIGNwdV9hZGRyLCBhZGRyLAotCQkJCSAgICAgIHNpemUsIGF0dHJzKTsKLX0KLQotc3RhdGljIGludCB2bWRfZ2V0X3NndGFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2dfdGFibGUgKnNndCwKLQkJCSAgIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGFkZHIsIHNpemVfdCBzaXplLAotCQkJICAgdW5zaWduZWQgbG9uZyBhdHRycykKLXsKLQlyZXR1cm4gdm1kX2RtYV9vcHMoZGV2KS0+Z2V0X3NndGFibGUodG9fdm1kX2RldihkZXYpLCBzZ3QsIGNwdV9hZGRyLAotCQkJCQkgICAgIGFkZHIsIHNpemUsIGF0dHJzKTsKLX0KLQotc3RhdGljIGRtYV9hZGRyX3Qgdm1kX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAotCQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGF0dHJzKQotewotCXJldHVybiB2bWRfZG1hX29wcyhkZXYpLT5tYXBfcGFnZSh0b192bWRfZGV2KGRldiksIHBhZ2UsIG9mZnNldCwgc2l6ZSwKLQkJCQkJICBkaXIsIGF0dHJzKTsKLX0KLQotc3RhdGljIHZvaWQgdm1kX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGFkZHIsIHNpemVfdCBzaXplLAotCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLCB1bnNpZ25lZCBsb25nIGF0dHJzKQotewotCXZtZF9kbWFfb3BzKGRldiktPnVubWFwX3BhZ2UodG9fdm1kX2RldihkZXYpLCBhZGRyLCBzaXplLCBkaXIsIGF0dHJzKTsKLX0KLQotc3RhdGljIGludCB2bWRfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAotCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHVuc2lnbmVkIGxvbmcgYXR0cnMpCi17Ci0JcmV0dXJuIHZtZF9kbWFfb3BzKGRldiktPm1hcF9zZyh0b192bWRfZGV2KGRldiksIHNnLCBuZW50cywgZGlyLCBhdHRycyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZtZF91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKLQkJCSBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHVuc2lnbmVkIGxvbmcgYXR0cnMpCi17Ci0Jdm1kX2RtYV9vcHMoZGV2KS0+dW5tYXBfc2codG9fdm1kX2RldihkZXYpLCBzZywgbmVudHMsIGRpciwgYXR0cnMpOwotfQotCi1zdGF0aWMgdm9pZCB2bWRfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwKLQkJCQkgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQl2bWRfZG1hX29wcyhkZXYpLT5zeW5jX3NpbmdsZV9mb3JfY3B1KHRvX3ZtZF9kZXYoZGV2KSwgYWRkciwgc2l6ZSwgZGlyKTsKLX0KLQotc3RhdGljIHZvaWQgdm1kX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGFkZHIsCi0JCQkJICAgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0Jdm1kX2RtYV9vcHMoZGV2KS0+c3luY19zaW5nbGVfZm9yX2RldmljZSh0b192bWRfZGV2KGRldiksIGFkZHIsIHNpemUsCi0JCQkJCQkgZGlyKTsKLX0KLQotc3RhdGljIHZvaWQgdm1kX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JCQkJaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi17Ci0Jdm1kX2RtYV9vcHMoZGV2KS0+c3luY19zZ19mb3JfY3B1KHRvX3ZtZF9kZXYoZGV2KSwgc2csIG5lbnRzLCBkaXIpOwotfQotCi1zdGF0aWMgdm9pZCB2bWRfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLQkJCQkgICBpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLXsKLQl2bWRfZG1hX29wcyhkZXYpLT5zeW5jX3NnX2Zvcl9kZXZpY2UodG9fdm1kX2RldihkZXYpLCBzZywgbmVudHMsIGRpcik7Ci19Ci0KLXN0YXRpYyBpbnQgdm1kX21hcHBpbmdfZXJyb3Ioc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGFkZHIpCi17Ci0JcmV0dXJuIHZtZF9kbWFfb3BzKGRldiktPm1hcHBpbmdfZXJyb3IodG9fdm1kX2RldihkZXYpLCBhZGRyKTsKLX0KLQotc3RhdGljIGludCB2bWRfZG1hX3N1cHBvcnRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHU2NCBtYXNrKQotewotCXJldHVybiB2bWRfZG1hX29wcyhkZXYpLT5kbWFfc3VwcG9ydGVkKHRvX3ZtZF9kZXYoZGV2KSwgbWFzayk7Ci19Ci0KLSNpZmRlZiBBUkNIX0hBU19ETUFfR0VUX1JFUVVJUkVEX01BU0sKLXN0YXRpYyB1NjQgdm1kX2dldF9yZXF1aXJlZF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gdm1kX2RtYV9vcHMoZGV2KS0+Z2V0X3JlcXVpcmVkX21hc2sodG9fdm1kX2RldihkZXYpKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdm9pZCB2bWRfdGVhcmRvd25fZG1hX29wcyhzdHJ1Y3Qgdm1kX2RldiAqdm1kKQotewotCXN0cnVjdCBkbWFfZG9tYWluICpkb21haW4gPSAmdm1kLT5kbWFfZG9tYWluOwotCi0JaWYgKGdldF9kbWFfb3BzKCZ2bWQtPmRldi0+ZGV2KSkKLQkJZGVsX2RtYV9kb21haW4oZG9tYWluKTsKLX0KLQotI2RlZmluZSBBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBmbikJXAotCWRvIHsJCQkJCVwKLQkJaWYgKHNvdXJjZS0+Zm4pCQkJXAotCQkJZGVzdC0+Zm4gPSB2bWRfIyNmbjsJXAotCX0gd2hpbGUgKDApCi0KLXN0YXRpYyB2b2lkIHZtZF9zZXR1cF9kbWFfb3BzKHN0cnVjdCB2bWRfZGV2ICp2bWQpCi17Ci0JY29uc3Qgc3RydWN0IGRtYV9tYXBfb3BzICpzb3VyY2UgPSBnZXRfZG1hX29wcygmdm1kLT5kZXYtPmRldik7Ci0Jc3RydWN0IGRtYV9tYXBfb3BzICpkZXN0ID0gJnZtZC0+ZG1hX29wczsKLQlzdHJ1Y3QgZG1hX2RvbWFpbiAqZG9tYWluID0gJnZtZC0+ZG1hX2RvbWFpbjsKLQotCWRvbWFpbi0+ZG9tYWluX25yID0gdm1kLT5zeXNkYXRhLmRvbWFpbjsKLQlkb21haW4tPmRtYV9vcHMgPSBkZXN0OwotCi0JaWYgKCFzb3VyY2UpCi0JCXJldHVybjsKLQlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBhbGxvYyk7Ci0JQVNTSUdOX1ZNRF9ETUFfT1BTKHNvdXJjZSwgZGVzdCwgZnJlZSk7Ci0JQVNTSUdOX1ZNRF9ETUFfT1BTKHNvdXJjZSwgZGVzdCwgbW1hcCk7Ci0JQVNTSUdOX1ZNRF9ETUFfT1BTKHNvdXJjZSwgZGVzdCwgZ2V0X3NndGFibGUpOwotCUFTU0lHTl9WTURfRE1BX09QUyhzb3VyY2UsIGRlc3QsIG1hcF9wYWdlKTsKLQlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCB1bm1hcF9wYWdlKTsKLQlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBtYXBfc2cpOwotCUFTU0lHTl9WTURfRE1BX09QUyhzb3VyY2UsIGRlc3QsIHVubWFwX3NnKTsKLQlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBzeW5jX3NpbmdsZV9mb3JfY3B1KTsKLQlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBzeW5jX3NpbmdsZV9mb3JfZGV2aWNlKTsKLQlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBzeW5jX3NnX2Zvcl9jcHUpOwotCUFTU0lHTl9WTURfRE1BX09QUyhzb3VyY2UsIGRlc3QsIHN5bmNfc2dfZm9yX2RldmljZSk7Ci0JQVNTSUdOX1ZNRF9ETUFfT1BTKHNvdXJjZSwgZGVzdCwgbWFwcGluZ19lcnJvcik7Ci0JQVNTSUdOX1ZNRF9ETUFfT1BTKHNvdXJjZSwgZGVzdCwgZG1hX3N1cHBvcnRlZCk7Ci0jaWZkZWYgQVJDSF9IQVNfRE1BX0dFVF9SRVFVSVJFRF9NQVNLCi0JQVNTSUdOX1ZNRF9ETUFfT1BTKHNvdXJjZSwgZGVzdCwgZ2V0X3JlcXVpcmVkX21hc2spOwotI2VuZGlmCi0JYWRkX2RtYV9kb21haW4oZG9tYWluKTsKLX0KLSN1bmRlZiBBU1NJR05fVk1EX0RNQV9PUFMKLSNlbHNlCi1zdGF0aWMgdm9pZCB2bWRfdGVhcmRvd25fZG1hX29wcyhzdHJ1Y3Qgdm1kX2RldiAqdm1kKSB7fQotc3RhdGljIHZvaWQgdm1kX3NldHVwX2RtYV9vcHMoc3RydWN0IHZtZF9kZXYgKnZtZCkge30KLSNlbmRpZgotCi1zdGF0aWMgY2hhciBfX2lvbWVtICp2bWRfY2ZnX2FkZHIoc3RydWN0IHZtZF9kZXYgKnZtZCwgc3RydWN0IHBjaV9idXMgKmJ1cywKLQkJCQkgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbikKLXsKLQljaGFyIF9faW9tZW0gKmFkZHIgPSB2bWQtPmNmZ2JhciArCi0JCQkgICAgIChidXMtPm51bWJlciA8PCAyMCkgKyAoZGV2Zm4gPDwgMTIpICsgcmVnOwotCi0JaWYgKChhZGRyIC0gdm1kLT5jZmdiYXIpICsgbGVuID49Ci0JICAgIHJlc291cmNlX3NpemUoJnZtZC0+ZGV2LT5yZXNvdXJjZVtWTURfQ0ZHQkFSXSkpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIGFkZHI7Ci19Ci0KLS8qCi0gKiBDUFUgbWF5IGRlYWRsb2NrIGlmIGNvbmZpZyBzcGFjZSBpcyBub3Qgc2VyaWFsaXplZCBvbiBzb21lIHZlcnNpb25zIG9mIHRoaXMKLSAqIGhhcmR3YXJlLCBzbyBhbGwgY29uZmlnIHNwYWNlIGFjY2VzcyBpcyBkb25lIHVuZGVyIGEgc3BpbmxvY2suCi0gKi8KLXN0YXRpYyBpbnQgdm1kX3BjaV9yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywKLQkJCWludCBsZW4sIHUzMiAqdmFsdWUpCi17Ci0Jc3RydWN0IHZtZF9kZXYgKnZtZCA9IHZtZF9mcm9tX2J1cyhidXMpOwotCWNoYXIgX19pb21lbSAqYWRkciA9IHZtZF9jZmdfYWRkcih2bWQsIGJ1cywgZGV2Zm4sIHJlZywgbGVuKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0JaWYgKCFhZGRyKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2bWQtPmNmZ19sb2NrLCBmbGFncyk7Ci0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCSp2YWx1ZSA9IHJlYWRiKGFkZHIpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCSp2YWx1ZSA9IHJlYWR3KGFkZHIpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCSp2YWx1ZSA9IHJlYWRsKGFkZHIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdm1kLT5jZmdfbG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBWTUQgaC93IGNvbnZlcnRzIG5vbi1wb3N0ZWQgY29uZmlnIHdyaXRlcyB0byBwb3N0ZWQgbWVtb3J5IHdyaXRlcy4gVGhlCi0gKiByZWFkLWJhY2sgaW4gdGhpcyBmdW5jdGlvbiBmb3JjZXMgdGhlIGNvbXBsZXRpb24gc28gaXQgcmV0dXJucyBvbmx5IGFmdGVyCi0gKiB0aGUgY29uZmlnIHNwYWNlIHdhcyB3cml0dGVuLCBhcyBleHBlY3RlZC4KLSAqLwotc3RhdGljIGludCB2bWRfcGNpX3dyaXRlKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywKLQkJCSBpbnQgbGVuLCB1MzIgdmFsdWUpCi17Ci0Jc3RydWN0IHZtZF9kZXYgKnZtZCA9IHZtZF9mcm9tX2J1cyhidXMpOwotCWNoYXIgX19pb21lbSAqYWRkciA9IHZtZF9jZmdfYWRkcih2bWQsIGJ1cywgZGV2Zm4sIHJlZywgbGVuKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0JaWYgKCFhZGRyKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2bWQtPmNmZ19sb2NrLCBmbGFncyk7Ci0Jc3dpdGNoIChsZW4pIHsKLQljYXNlIDE6Ci0JCXdyaXRlYih2YWx1ZSwgYWRkcik7Ci0JCXJlYWRiKGFkZHIpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXdyaXRldyh2YWx1ZSwgYWRkcik7Ci0JCXJlYWR3KGFkZHIpOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXdyaXRlbCh2YWx1ZSwgYWRkcik7Ci0JCXJlYWRsKGFkZHIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdm1kLT5jZmdfbG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX29wcyB2bWRfb3BzID0gewotCS5yZWFkCQk9IHZtZF9wY2lfcmVhZCwKLQkud3JpdGUJCT0gdm1kX3BjaV93cml0ZSwKLX07Ci0KLXN0YXRpYyB2b2lkIHZtZF9hdHRhY2hfcmVzb3VyY2VzKHN0cnVjdCB2bWRfZGV2ICp2bWQpCi17Ci0Jdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9NRU1CQVIxXS5jaGlsZCA9ICZ2bWQtPnJlc291cmNlc1sxXTsKLQl2bWQtPmRldi0+cmVzb3VyY2VbVk1EX01FTUJBUjJdLmNoaWxkID0gJnZtZC0+cmVzb3VyY2VzWzJdOwotfQotCi1zdGF0aWMgdm9pZCB2bWRfZGV0YWNoX3Jlc291cmNlcyhzdHJ1Y3Qgdm1kX2RldiAqdm1kKQotewotCXZtZC0+ZGV2LT5yZXNvdXJjZVtWTURfTUVNQkFSMV0uY2hpbGQgPSBOVUxMOwotCXZtZC0+ZGV2LT5yZXNvdXJjZVtWTURfTUVNQkFSMl0uY2hpbGQgPSBOVUxMOwotfQotCi0vKgotICogVk1EIGRvbWFpbnMgc3RhcnQgYXQgMHgxMDAwIHRvIG5vdCBjbGFzaCB3aXRoIEFDUEkgX1NFRyBkb21haW5zLgotICovCi1zdGF0aWMgaW50IHZtZF9maW5kX2ZyZWVfZG9tYWluKHZvaWQpCi17Ci0JaW50IGRvbWFpbiA9IDB4ZmZmZjsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gTlVMTDsKLQotCXdoaWxlICgoYnVzID0gcGNpX2ZpbmRfbmV4dF9idXMoYnVzKSkgIT0gTlVMTCkKLQkJZG9tYWluID0gbWF4X3QoaW50LCBkb21haW4sIHBjaV9kb21haW5fbnIoYnVzKSk7Ci0JcmV0dXJuIGRvbWFpbiArIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdm1kX2VuYWJsZV9kb21haW4oc3RydWN0IHZtZF9kZXYgKnZtZCkKLXsKLQlzdHJ1Y3QgcGNpX3N5c2RhdGEgKnNkID0gJnZtZC0+c3lzZGF0YTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQl1MzIgdXBwZXJfYml0czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCUxJU1RfSEVBRChyZXNvdXJjZXMpOwotCi0JcmVzID0gJnZtZC0+ZGV2LT5yZXNvdXJjZVtWTURfQ0ZHQkFSXTsKLQl2bWQtPnJlc291cmNlc1swXSA9IChzdHJ1Y3QgcmVzb3VyY2UpIHsKLQkJLm5hbWUgID0gIlZNRCBDRkdCQVIiLAotCQkuc3RhcnQgPSAwLAotCQkuZW5kICAgPSAocmVzb3VyY2Vfc2l6ZShyZXMpID4+IDIwKSAtIDEsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfQlVTIHwgSU9SRVNPVVJDRV9QQ0lfRklYRUQsCi0JfTsKLQotCS8qCi0JICogSWYgdGhlIHdpbmRvdyBpcyBiZWxvdyA0R0IsIGNsZWFyIElPUkVTT1VSQ0VfTUVNXzY0IHNvIHdlIGNhbgotCSAqIHB1dCAzMi1iaXQgcmVzb3VyY2VzIGluIHRoZSB3aW5kb3cuCi0JICoKLQkgKiBUaGVyZSdzIG5vIGhhcmR3YXJlIHJlYXNvbiB3aHkgYSA2NC1iaXQgd2luZG93ICpjb3VsZG4ndCoKLQkgKiBjb250YWluIGEgMzItYml0IHJlc291cmNlLCBidXQgcGJ1c19zaXplX21lbSgpIGNvbXB1dGVzIHRoZQotCSAqIGJyaWRnZSB3aW5kb3cgc2l6ZSBhc3N1bWluZyBhIDY0LWJpdCB3aW5kb3cgd2lsbCBjb250YWluIG5vCi0JICogMzItYml0IHJlc291cmNlcy4gIF9fcGNpX2Fzc2lnbl9yZXNvdXJjZSgpIGVuZm9yY2VzIHRoYXQKLQkgKiBhcnRpZmljaWFsIHJlc3RyaWN0aW9uIHRvIG1ha2Ugc3VyZSBldmVyeXRoaW5nIHdpbGwgZml0LgotCSAqCi0JICogVGhlIG9ubHkgd2F5IHdlIGNvdWxkIHVzZSBhIDY0LWJpdCBub24tcHJlZmVjaGFibGUgTUVNQkFSIGlzCi0JICogaWYgaXRzIGFkZHJlc3MgaXMgPDRHQiBzbyB0aGF0IHdlIGNhbiBjb252ZXJ0IGl0IHRvIGEgMzItYml0Ci0JICogcmVzb3VyY2UuICBUbyBiZSB2aXNpYmxlIHRvIHRoZSBob3N0IE9TLCBhbGwgVk1EIGVuZHBvaW50cyBtdXN0Ci0JICogYmUgaW5pdGlhbGx5IGNvbmZpZ3VyZWQgYnkgcGxhdGZvcm0gQklPUywgd2hpY2ggaW5jbHVkZXMgc2V0dGluZwotCSAqIHVwIHRoZXNlIHJlc291cmNlcy4gIFdlIGNhbiBhc3N1bWUgdGhlIGRldmljZSBpcyBjb25maWd1cmVkCi0JICogYWNjb3JkaW5nIHRvIHRoZSBwbGF0Zm9ybSBuZWVkcy4KLQkgKi8KLQlyZXMgPSAmdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9NRU1CQVIxXTsKLQl1cHBlcl9iaXRzID0gdXBwZXJfMzJfYml0cyhyZXMtPmVuZCk7Ci0JZmxhZ3MgPSByZXMtPmZsYWdzICYgfklPUkVTT1VSQ0VfU0laRUFMSUdOOwotCWlmICghdXBwZXJfYml0cykKLQkJZmxhZ3MgJj0gfklPUkVTT1VSQ0VfTUVNXzY0OwotCXZtZC0+cmVzb3VyY2VzWzFdID0gKHN0cnVjdCByZXNvdXJjZSkgewotCQkubmFtZSAgPSAiVk1EIE1FTUJBUjEiLAotCQkuc3RhcnQgPSByZXMtPnN0YXJ0LAotCQkuZW5kICAgPSByZXMtPmVuZCwKLQkJLmZsYWdzID0gZmxhZ3MsCi0JCS5wYXJlbnQgPSByZXMsCi0JfTsKLQotCXJlcyA9ICZ2bWQtPmRldi0+cmVzb3VyY2VbVk1EX01FTUJBUjJdOwotCXVwcGVyX2JpdHMgPSB1cHBlcl8zMl9iaXRzKHJlcy0+ZW5kKTsKLQlmbGFncyA9IHJlcy0+ZmxhZ3MgJiB+SU9SRVNPVVJDRV9TSVpFQUxJR047Ci0JaWYgKCF1cHBlcl9iaXRzKQotCQlmbGFncyAmPSB+SU9SRVNPVVJDRV9NRU1fNjQ7Ci0Jdm1kLT5yZXNvdXJjZXNbMl0gPSAoc3RydWN0IHJlc291cmNlKSB7Ci0JCS5uYW1lICA9ICJWTUQgTUVNQkFSMiIsCi0JCS5zdGFydCA9IHJlcy0+c3RhcnQgKyAweDIwMDAsCi0JCS5lbmQgICA9IHJlcy0+ZW5kLAotCQkuZmxhZ3MgPSBmbGFncywKLQkJLnBhcmVudCA9IHJlcywKLQl9OwotCi0Jc2QtPmRvbWFpbiA9IHZtZF9maW5kX2ZyZWVfZG9tYWluKCk7Ci0JaWYgKHNkLT5kb21haW4gPCAwKQotCQlyZXR1cm4gc2QtPmRvbWFpbjsKLQotCXNkLT5ub2RlID0gcGNpYnVzX3RvX25vZGUodm1kLT5kZXYtPmJ1cyk7Ci0KLQl2bWQtPmlycV9kb21haW4gPSBwY2lfbXNpX2NyZWF0ZV9pcnFfZG9tYWluKE5VTEwsICZ2bWRfbXNpX2RvbWFpbl9pbmZvLAotCQkJCQkJICAgIHg4Nl92ZWN0b3JfZG9tYWluKTsKLQlpZiAoIXZtZC0+aXJxX2RvbWFpbikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwY2lfYWRkX3Jlc291cmNlKCZyZXNvdXJjZXMsICZ2bWQtPnJlc291cmNlc1swXSk7Ci0JcGNpX2FkZF9yZXNvdXJjZSgmcmVzb3VyY2VzLCAmdm1kLT5yZXNvdXJjZXNbMV0pOwotCXBjaV9hZGRfcmVzb3VyY2UoJnJlc291cmNlcywgJnZtZC0+cmVzb3VyY2VzWzJdKTsKLQl2bWQtPmJ1cyA9IHBjaV9jcmVhdGVfcm9vdF9idXMoJnZtZC0+ZGV2LT5kZXYsIDAsICZ2bWRfb3BzLCBzZCwKLQkJCQkgICAgICAgJnJlc291cmNlcyk7Ci0JaWYgKCF2bWQtPmJ1cykgewotCQlwY2lfZnJlZV9yZXNvdXJjZV9saXN0KCZyZXNvdXJjZXMpOwotCQlpcnFfZG9tYWluX3JlbW92ZSh2bWQtPmlycV9kb21haW4pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQl2bWRfYXR0YWNoX3Jlc291cmNlcyh2bWQpOwotCXZtZF9zZXR1cF9kbWFfb3BzKHZtZCk7Ci0JZGV2X3NldF9tc2lfZG9tYWluKCZ2bWQtPmJ1cy0+ZGV2LCB2bWQtPmlycV9kb21haW4pOwotCXBjaV9yZXNjYW5fYnVzKHZtZC0+YnVzKTsKLQotCVdBUk4oc3lzZnNfY3JlYXRlX2xpbmsoJnZtZC0+ZGV2LT5kZXYua29iaiwgJnZtZC0+YnVzLT5kZXYua29iaiwKLQkJCSAgICAgICAiZG9tYWluIiksICJDYW4ndCBjcmVhdGUgc3ltbGluayB0byBkb21haW5cbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgdm1kX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB2bWRfaXJxX2xpc3QgKmlycXMgPSBkYXRhOwotCXN0cnVjdCB2bWRfaXJxICp2bWRpcnE7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uodm1kaXJxLCAmaXJxcy0+aXJxX2xpc3QsIG5vZGUpCi0JCWdlbmVyaWNfaGFuZGxlX2lycSh2bWRpcnEtPnZpcnEpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IHZtZF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IHZtZF9kZXYgKnZtZDsKLQlpbnQgaSwgZXJyOwotCi0JaWYgKHJlc291cmNlX3NpemUoJmRldi0+cmVzb3VyY2VbVk1EX0NGR0JBUl0pIDwgKDEgPDwgMjApKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXZtZCA9IGRldm1fa3phbGxvYygmZGV2LT5kZXYsIHNpemVvZigqdm1kKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2bWQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jdm1kLT5kZXYgPSBkZXY7Ci0JZXJyID0gcGNpbV9lbmFibGVfZGV2aWNlKGRldik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQl2bWQtPmNmZ2JhciA9IHBjaW1faW9tYXAoZGV2LCBWTURfQ0ZHQkFSLCAwKTsKLQlpZiAoIXZtZC0+Y2ZnYmFyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBjaV9zZXRfbWFzdGVyKGRldik7Ci0JaWYgKGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJmRldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKSAmJgotCSAgICBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KCZkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jdm1kLT5tc2l4X2NvdW50ID0gcGNpX21zaXhfdmVjX2NvdW50KGRldik7Ci0JaWYgKHZtZC0+bXNpeF9jb3VudCA8IDApCi0JCXJldHVybiAtRU5PREVWOwotCi0Jdm1kLT5pcnFzID0gZGV2bV9rY2FsbG9jKCZkZXYtPmRldiwgdm1kLT5tc2l4X2NvdW50LCBzaXplb2YoKnZtZC0+aXJxcyksCi0JCQkJIEdGUF9LRVJORUwpOwotCWlmICghdm1kLT5pcnFzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXZtZC0+bXNpeF9lbnRyaWVzID0gZGV2bV9rY2FsbG9jKCZkZXYtPmRldiwgdm1kLT5tc2l4X2NvdW50LAotCQkJCQkgc2l6ZW9mKCp2bWQtPm1zaXhfZW50cmllcyksCi0JCQkJCSBHRlBfS0VSTkVMKTsKLQlpZiAoIXZtZC0+bXNpeF9lbnRyaWVzKQotCQlyZXR1cm4gLUVOT01FTTsKLQlmb3IgKGkgPSAwOyBpIDwgdm1kLT5tc2l4X2NvdW50OyBpKyspCi0JCXZtZC0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKLQotCXZtZC0+bXNpeF9jb3VudCA9IHBjaV9lbmFibGVfbXNpeF9yYW5nZSh2bWQtPmRldiwgdm1kLT5tc2l4X2VudHJpZXMsIDEsCi0JCQkJCQl2bWQtPm1zaXhfY291bnQpOwotCWlmICh2bWQtPm1zaXhfY291bnQgPCAwKQotCQlyZXR1cm4gdm1kLT5tc2l4X2NvdW50OwotCi0JZm9yIChpID0gMDsgaSA8IHZtZC0+bXNpeF9jb3VudDsgaSsrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZ2bWQtPmlycXNbaV0uaXJxX2xpc3QpOwotCQl2bWQtPmlycXNbaV0udm1kX3ZlY3RvciA9IHZtZC0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvcjsKLQkJdm1kLT5pcnFzW2ldLmluZGV4ID0gaTsKLQotCQllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZkZXYtPmRldiwgdm1kLT5pcnFzW2ldLnZtZF92ZWN0b3IsCi0JCQkJICAgICAgIHZtZF9pcnEsIDAsICJ2bWQiLCAmdm1kLT5pcnFzW2ldKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0Jc3Bpbl9sb2NrX2luaXQoJnZtZC0+Y2ZnX2xvY2spOwotCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIHZtZCk7Ci0JZXJyID0gdm1kX2VuYWJsZV9kb21haW4odm1kKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZGV2X2luZm8oJnZtZC0+ZGV2LT5kZXYsICJCb3VuZCB0byBQQ0kgZG9tYWluICUwNHhcbiIsCi0JCSB2bWQtPnN5c2RhdGEuZG9tYWluKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdm1kX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXN0cnVjdCB2bWRfZGV2ICp2bWQgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXZtZF9kZXRhY2hfcmVzb3VyY2VzKHZtZCk7Ci0JcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Ci0Jc3lzZnNfcmVtb3ZlX2xpbmsoJnZtZC0+ZGV2LT5kZXYua29iaiwgImRvbWFpbiIpOwotCXBjaV9zdG9wX3Jvb3RfYnVzKHZtZC0+YnVzKTsKLQlwY2lfcmVtb3ZlX3Jvb3RfYnVzKHZtZC0+YnVzKTsKLQl2bWRfdGVhcmRvd25fZG1hX29wcyh2bWQpOwotCWlycV9kb21haW5fcmVtb3ZlKHZtZC0+aXJxX2RvbWFpbik7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgdm1kX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCi0JcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdm1kX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7Ci0KLQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHZtZF9kZXZfcG1fb3BzLCB2bWRfc3VzcGVuZCwgdm1kX3Jlc3VtZSk7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2bWRfaWRzW10gPSB7Ci0Je1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyMDFkKSx9LAotCXswLH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgdm1kX2lkcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2bWRfZHJ2ID0gewotCS5uYW1lCQk9ICJ2bWQiLAotCS5pZF90YWJsZQk9IHZtZF9pZHMsCi0JLnByb2JlCQk9IHZtZF9wcm9iZSwKLQkucmVtb3ZlCQk9IHZtZF9yZW1vdmUsCi0JLmRyaXZlcgkJPSB7Ci0JCS5wbQk9ICZ2bWRfZGV2X3BtX29wcywKLQl9LAotfTsKLW1vZHVsZV9wY2lfZHJpdmVyKHZtZF9kcnYpOwotCi1NT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX1ZFUlNJT04oIjAuNiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL3hlbi5jIGIvYXJjaC94ODYvcGNpL3hlbi5jCmluZGV4IDNhNDgzY2IuLmJlZGZhYjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS94ZW4uYworKysgYi9hcmNoL3g4Ni9wY2kveGVuLmMKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCiBpbnQgX19pbml0IHBjaV94ZW5faHZtX2luaXQodm9pZCkKIHsKLQlpZiAoIXhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjayB8fCAheGVuX2ZlYXR1cmUoWEVORkVBVF9odm1fcGlycXMpKQorCWlmICgheGVuX2ZlYXR1cmUoWEVORkVBVF9odm1fcGlycXMpKQogCQlyZXR1cm4gMDsKIAogI2lmZGVmIENPTkZJR19BQ1BJCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9NYWtlZmlsZSBiL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCmluZGV4IDE4NDg0MmUuLjNjM2MxOWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogb2JqLXkJKz0gaW50ZWwvCiBvYmoteQkrPSBpbnRlbC1taWQvCiBvYmoteQkrPSBpbnRlbC1xdWFyay8KK29iai15CSs9IG1lbGxhbm94Lwogb2JqLXkJKz0gb2xwYy8KIG9iai15CSs9IHNjeDIwMC8KIG9iai15CSs9IHNmaS8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL2F0b20vcHVuaXRfYXRvbV9kZWJ1Zy5jIGIvYXJjaC94ODYvcGxhdGZvcm0vYXRvbS9wdW5pdF9hdG9tX2RlYnVnLmMKaW5kZXggOGZmN2I5My4uZDQ5ZDNiZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vYXRvbS9wdW5pdF9hdG9tX2RlYnVnLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vYXRvbS9wdW5pdF9hdG9tX2RlYnVnLmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgaW50ZWxfcHVuaXRfY3B1X2lkc1tdID0gewogCUlDUFUoSU5URUxfRkFNNl9BVE9NX1NJTFZFUk1PTlQxLCBwdW5pdF9kZXZpY2VfYnl0KSwKLQlJQ1BVKElOVEVMX0ZBTTZfQVRPTV9NRVJSSUZJRUxEMSwgcHVuaXRfZGV2aWNlX3RuZyksCisJSUNQVShJTlRFTF9GQU02X0FUT01fTUVSUklGSUVMRCwgIHB1bml0X2RldmljZV90bmcpLAogCUlDUFUoSU5URUxfRkFNNl9BVE9NX0FJUk1PTlQsCSAgcHVuaXRfZGV2aWNlX2NodCksCiAJe30KIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLWJncnQuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCmluZGV4IDZhMmY1NjkuLjZhYWQ4NzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCkBAIC04MiwyMSArODIsMTIgQEAKIAl9CiAJYmdydF9pbWFnZV9zaXplID0gYm1wX2hlYWRlci5zaXplOwogCi0JYmdydF9pbWFnZSA9IGttYWxsb2MoYmdydF9pbWFnZV9zaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKKwliZ3J0X2ltYWdlID0gbWVtcmVtYXAoYmdydF90YWItPmltYWdlX2FkZHJlc3MsIGJtcF9oZWFkZXIuc2l6ZSwgTUVNUkVNQVBfV0IpOwogCWlmICghYmdydF9pbWFnZSkgewotCQlwcl9ub3RpY2UoIklnbm9yaW5nIEJHUlQ6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGltYWdlICh3YW50ZWQgJXp1IGJ5dGVzKVxuIiwKLQkJICAgICAgIGJncnRfaW1hZ2Vfc2l6ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpbWFnZSA9IG1lbXJlbWFwKGJncnRfdGFiLT5pbWFnZV9hZGRyZXNzLCBibXBfaGVhZGVyLnNpemUsIE1FTVJFTUFQX1dCKTsKLQlpZiAoIWltYWdlKSB7CiAJCXByX25vdGljZSgiSWdub3JpbmcgQkdSVDogZmFpbGVkIHRvIG1hcCBpbWFnZSBtZW1vcnlcbiIpOwotCQlrZnJlZShiZ3J0X2ltYWdlKTsKIAkJYmdydF9pbWFnZSA9IE5VTEw7CiAJCXJldHVybjsKIAl9CiAKLQltZW1jcHkoYmdydF9pbWFnZSwgaW1hZ2UsIGJncnRfaW1hZ2Vfc2l6ZSk7Ci0JbWVtdW5tYXAoaW1hZ2UpOworCWVmaV9tZW1fcmVzZXJ2ZShiZ3J0X3RhYi0+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+Y3I0ID0gX19yZWFkX2NyNCgpOwogI2lmZGVmIENPTkZJR19YODZfNjQKIAljdHh0LT5jcjggPSByZWFkX2NyOCgpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9yYXMvbWNlX2FtZF9pbmouYyBiL2FyY2gveDg2L3Jhcy9tY2VfYW1kX2luai5jCmluZGV4IDExMDQ1MTUuLjFhYzc2NDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Jhcy9tY2VfYW1kX2luai5jCisrKyBiL2FyY2gveDg2L3Jhcy9tY2VfYW1kX2luai5jCkBAIC02OCw2ICs2OCw3IEBACiBNQ0VfSU5KRUNUX1NFVChzdGF0dXMpOwogTUNFX0lOSkVDVF9TRVQobWlzYyk7CiBNQ0VfSU5KRUNUX1NFVChhZGRyKTsKK01DRV9JTkpFQ1RfU0VUKHN5bmQpOwogCiAjZGVmaW5lIE1DRV9JTkpFQ1RfR0VUKHJlZykJCQkJCQlcCiBzdGF0aWMgaW50IGlual8jI3JlZyMjX2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkJCQlcCkBAIC04MSwxMCArODIsMTIgQEAKIE1DRV9JTkpFQ1RfR0VUKHN0YXR1cyk7CiBNQ0VfSU5KRUNUX0dFVChtaXNjKTsKIE1DRV9JTkpFQ1RfR0VUKGFkZHIpOworTUNFX0lOSkVDVF9HRVQoc3luZCk7CiAKIERFRklORV9TSU1QTEVfQVRUUklCVVRFKHN0YXR1c19mb3BzLCBpbmpfc3RhdHVzX2dldCwgaW5qX3N0YXR1c19zZXQsICIlbGx4XG4iKTsKIERFRklORV9TSU1QTEVfQVRUUklCVVRFKG1pc2NfZm9wcywgaW5qX21pc2NfZ2V0LCBpbmpfbWlzY19zZXQsICIlbGx4XG4iKTsKIERFRklORV9TSU1QTEVfQVRUUklCVVRFKGFkZHJfZm9wcywgaW5qX2FkZHJfZ2V0LCBpbmpfYWRkcl9zZXQsICIlbGx4XG4iKTsKK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKHN5bmRfZm9wcywgaW5qX3N5bmRfZ2V0LCBpbmpfc3luZF9zZXQsICIlbGx4XG4iKTsKIAogLyoKICAqIENhbGxlciBuZWVkcyB0byBiZSBtYWtlIHN1cmUgdGhpcyBjcHUgZG9lc24ndCBkaXNhcHBlYXIKQEAgLTI0MywyNyArMjQ2LDI3IEBACiAKIHN0YXRpYyB2b2lkIHByZXBhcmVfbXNycyh2b2lkICppbmZvKQogewotCXN0cnVjdCBtY2UgaV9tY2UgPSAqKHN0cnVjdCBtY2UgKilpbmZvOwotCXU4IGIgPSBpX21jZS5iYW5rOworCXN0cnVjdCBtY2UgbSA9ICooc3RydWN0IG1jZSAqKWluZm87CisJdTggYiA9IG0uYmFuazsKIAotCXdybXNybChNU1JfSUEzMl9NQ0dfU1RBVFVTLCBpX21jZS5tY2dzdGF0dXMpOworCXdybXNybChNU1JfSUEzMl9NQ0dfU1RBVFVTLCBtLm1jZ3N0YXR1cyk7CiAKIAlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1NNQ0EpKSB7Ci0JCWlmIChpX21jZS5pbmplY3RfZmxhZ3MgPT0gREZSX0lOVF9JTkopIHsKLQkJCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfREVTVEFUKGIpLCBpX21jZS5zdGF0dXMpOwotCQkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9ERUFERFIoYiksIGlfbWNlLmFkZHIpOworCQlpZiAobS5pbmplY3RfZmxhZ3MgPT0gREZSX0lOVF9JTkopIHsKKwkJCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfREVTVEFUKGIpLCBtLnN0YXR1cyk7CisJCQl3cm1zcmwoTVNSX0FNRDY0X1NNQ0FfTUN4X0RFQUREUihiKSwgbS5hZGRyKTsKIAkJfSBlbHNlIHsKLQkJCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfU1RBVFVTKGIpLCBpX21jZS5zdGF0dXMpOwotCQkJd3Jtc3JsKE1TUl9BTUQ2NF9TTUNBX01DeF9BRERSKGIpLCBpX21jZS5hZGRyKTsKKwkJCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfU1RBVFVTKGIpLCBtLnN0YXR1cyk7CisJCQl3cm1zcmwoTVNSX0FNRDY0X1NNQ0FfTUN4X0FERFIoYiksIG0uYWRkcik7CiAJCX0KIAotCQl3cm1zcmwoTVNSX0FNRDY0X1NNQ0FfTUN4X01JU0MoYiksIGlfbWNlLm1pc2MpOworCQl3cm1zcmwoTVNSX0FNRDY0X1NNQ0FfTUN4X01JU0MoYiksIG0ubWlzYyk7CisJCXdybXNybChNU1JfQU1ENjRfU01DQV9NQ3hfU1lORChiKSwgbS5zeW5kKTsKIAl9IGVsc2UgewotCQl3cm1zcmwoTVNSX0lBMzJfTUN4X1NUQVRVUyhiKSwgaV9tY2Uuc3RhdHVzKTsKLQkJd3Jtc3JsKE1TUl9JQTMyX01DeF9BRERSKGIpLCBpX21jZS5hZGRyKTsKLQkJd3Jtc3JsKE1TUl9JQTMyX01DeF9NSVNDKGIpLCBpX21jZS5taXNjKTsKKwkJd3Jtc3JsKE1TUl9JQTMyX01DeF9TVEFUVVMoYiksIG0uc3RhdHVzKTsKKwkJd3Jtc3JsKE1TUl9JQTMyX01DeF9BRERSKGIpLCBtLmFkZHIpOworCQl3cm1zcmwoTVNSX0lBMzJfTUN4X01JU0MoYiksIG0ubWlzYyk7CiAJfQotCiB9CiAKIHN0YXRpYyB2b2lkIGRvX2luamVjdCh2b2lkKQpAQCAtMjc1LDYgKzI3OCw5IEBACiAJaWYgKGlfbWNlLm1pc2MpCiAJCWlfbWNlLnN0YXR1cyB8PSBNQ0lfU1RBVFVTX01JU0NWOwogCisJaWYgKGlfbWNlLnN5bmQpCisJCWlfbWNlLnN0YXR1cyB8PSBNQ0lfU1RBVFVTX1NZTkRWOworCiAJaWYgKGlual90eXBlID09IFNXX0lOSikgewogCQltY2VfaW5qZWN0X2xvZygmaV9tY2UpOwogCQlyZXR1cm47CkBAIC0zMDEsNyArMzA3LDkgQEAKIAkgKiBvbmx5IG9uIHRoZSBub2RlIGJhc2UgY29yZS4gUmVmZXIgdG8gRDE4RjN4NDRbTmJNY2FUb01zdENwdUVuXSBmb3IKIAkgKiBGYW0xMGggYW5kIGxhdGVyIEJLREdzLgogCSAqLwotCWlmIChzdGF0aWNfY3B1X2hhcyhYODZfRkVBVFVSRV9BTURfRENNKSAmJiBiID09IDQpIHsKKwlpZiAoc3RhdGljX2NwdV9oYXMoWDg2X0ZFQVRVUkVfQU1EX0RDTSkgJiYKKwkgICAgYiA9PSA0ICYmCisJICAgIGJvb3RfY3B1X2RhdGEueDg2IDwgMHgxNykgewogCQl0b2dnbGVfbmJfbWNhX21zdF9jcHUoYW1kX2dldF9uYl9pZChjcHUpKTsKIAkJY3B1ID0gZ2V0X25iY19mb3Jfbm9kZShhbWRfZ2V0X25iX2lkKGNwdSkpOwogCX0KQEAgLTM3MSw2ICszNzksOSBAQAogIlx0IHVzZWQgZm9yIGVycm9yIHRocmVzaG9sZGluZyBwdXJwb3NlcyBhbmQgaXRzIHZhbGlkaXR5IGlzIGluZGljYXRlZCBieVxuIgogIlx0IE1DaV9TVEFUVVNbTWlzY1ZdLlxuIgogIlxuIgorInN5bmQ6XHQgU2V0IE1DaV9TWU5EOiBwcm92aWRlIHN5bmRyb21lIGluZm8gYWJvdXQgdGhlIGVycm9yLiBPbmx5IHZhbGlkIG9uXG4iCisiXHQgU2NhbGFibGUgTUNBIHN5c3RlbXMsIGFuZCBpdHMgdmFsaWRpdHkgaXMgaW5kaWNhdGVkIGJ5IE1DaV9TVEFUVVNbU3luZFZdLlxuIgorIlxuIgogImFkZHI6XHQgRXJyb3IgYWRkcmVzcyB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIE1DaV9BRERSLiBMb2cgYWRkcmVzcyBpbmZvcm1hdGlvblxuIgogIlx0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuXG4iCiAiXG4iCkBAIC00MjAsNiArNDMxLDcgQEAKIAl7IC5uYW1lID0gInN0YXR1cyIsCS5mb3BzID0gJnN0YXR1c19mb3BzLCAucGVybSA9IFNfSVJVU1IgfCBTX0lXVVNSIH0sCiAJeyAubmFtZSA9ICJtaXNjIiwJLmZvcHMgPSAmbWlzY19mb3BzLCAgIC5wZXJtID0gU19JUlVTUiB8IFNfSVdVU1IgfSwKIAl7IC5uYW1lID0gImFkZHIiLAkuZm9wcyA9ICZhZGRyX2ZvcHMsICAgLnBlcm0gPSBTX0lSVVNSIHwgU19JV1VTUiB9LAorCXsgLm5hbWUgPSAic3luZCIsCS5mb3BzID0gJnN5bmRfZm9wcywgICAucGVybSA9IFNfSVJVU1IgfCBTX0lXVVNSIH0sCiAJeyAubmFtZSA9ICJiYW5rIiwJLmZvcHMgPSAmYmFua19mb3BzLCAgIC5wZXJtID0gU19JUlVTUiB8IFNfSVdVU1IgfSwKIAl7IC5uYW1lID0gImZsYWdzIiwJLmZvcHMgPSAmZmxhZ3NfZm9wcywgIC5wZXJtID0gU19JUlVTUiB8IFNfSVdVU1IgfSwKIAl7IC5uYW1lID0gImNwdSIsCS5mb3BzID0gJmV4dGNwdV9mb3BzLCAucGVybSA9IFNfSVJVU1IgfCBTX0lXVVNSIH0sCkBAIC00MjgsNyArNDQwLDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9tY2VfaW5qZWN0KHZvaWQpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAJdTY0IGNhcDsKIAogCXJkbXNybChNU1JfSUEzMl9NQ0dfQ0FQLCBjYXApOwpAQCAtNDUyLDI2ICs0NjQsMjIgQEAKIAlyZXR1cm4gMDsKIAogZXJyX2Rmc19hZGQ6Ci0Jd2hpbGUgKC0taSA+PSAwKQorCXdoaWxlIChpLS0gPiAwKQogCQlkZWJ1Z2ZzX3JlbW92ZShkZnNfZmxzW2ldLmQpOwogCiAJZGVidWdmc19yZW1vdmUoZGZzX2luaik7CiAJZGZzX2luaiA9IE5VTEw7CiAKLQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbWNlX2luamVjdCh2b2lkKQogewotCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGZzX2Zscyk7IGkrKykKLQkJZGVidWdmc19yZW1vdmUoZGZzX2Zsc1tpXS5kKTsKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGZzX2luaik7CisJZGZzX2luaiA9IE5VTEw7CiAKIAltZW1zZXQoJmRmc19mbHMsIDAsIHNpemVvZihkZnNfZmxzKSk7Ci0KLQlkZWJ1Z2ZzX3JlbW92ZShkZnNfaW5qKTsKLQlkZnNfaW5qID0gTlVMTDsKIH0KIG1vZHVsZV9pbml0KGluaXRfbWNlX2luamVjdCk7CiBtb2R1bGVfZXhpdChleGl0X21jZV9pbmplY3QpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vcHRyYWNlXzMyLmMgYi9hcmNoL3g4Ni91bS9wdHJhY2VfMzIuYwppbmRleCBlYmQ0ZGQ2Li41NzY2ZWFkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni91bS9wdHJhY2VfMzIuYworKysgYi9hcmNoL3g4Ni91bS9wdHJhY2VfMzIuYwpAQCAtODQsNyArODQsMTAgQEAKIAljYXNlIEVBWDoKIAljYXNlIEVJUDoKIAljYXNlIFVFU1A6CisJCWJyZWFrOwogCWNhc2UgT1JJR19FQVg6CisJCS8qIFVwZGF0ZSB0aGUgc3lzY2FsbCBudW1iZXIuICovCisJCVVQVF9TWVNDQUxMX05SKCZjaGlsZC0+dGhyZWFkLnJlZ3MucmVncykgPSB2YWx1ZTsKIAkJYnJlYWs7CiAJY2FzZSBGUzoKIAkJaWYgKHZhbHVlICYmICh2YWx1ZSAmIDMpICE9IDMpCkBAIC0xOTEsNyArMTk0LDcgQEAKIAogc3RhdGljIGludCBnZXRfZnByZWdzKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQogewotCWludCBlcnIsIG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlpbnQgZXJyLCBuLCBjcHUgPSB0YXNrX2NwdShjaGlsZCk7CiAJc3RydWN0IHVzZXJfaTM4N19zdHJ1Y3QgZnByZWdzOwogCiAJZXJyID0gc2F2ZV9pMzg3X3JlZ2lzdGVycyh1c2Vyc3BhY2VfcGlkW2NwdV0sCkBAIC0yMDgsNyArMjExLDcgQEAKIAogc3RhdGljIGludCBzZXRfZnByZWdzKHN0cnVjdCB1c2VyX2kzODdfc3RydWN0IF9fdXNlciAqYnVmLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQogewotCWludCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7CisJaW50IG4sIGNwdSA9IHRhc2tfY3B1KGNoaWxkKTsKIAlzdHJ1Y3QgdXNlcl9pMzg3X3N0cnVjdCBmcHJlZ3M7CiAKIAluID0gY29weV9mcm9tX3VzZXIoJmZwcmVncywgYnVmLCBzaXplb2YoZnByZWdzKSk7CkBAIC0yMjEsNyArMjI0LDcgQEAKIAogc3RhdGljIGludCBnZXRfZnB4cmVncyhzdHJ1Y3QgdXNlcl9meHNyX3N0cnVjdCBfX3VzZXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKLQlpbnQgZXJyLCBuLCBjcHUgPSAoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBjaGlsZC0+c3RhY2spLT5jcHU7CisJaW50IGVyciwgbiwgY3B1ID0gdGFza19jcHUoY2hpbGQpOwogCXN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IGZwcmVnczsKIAogCWVyciA9IHNhdmVfZnB4X3JlZ2lzdGVycyh1c2Vyc3BhY2VfcGlkW2NwdV0sICh1bnNpZ25lZCBsb25nICopICZmcHJlZ3MpOwpAQCAtMjM3LDcgKzI0MCw3IEBACiAKIHN0YXRpYyBpbnQgc2V0X2ZweHJlZ3Moc3RydWN0IHVzZXJfZnhzcl9zdHJ1Y3QgX191c2VyICpidWYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCiB7Ci0JaW50IG4sIGNwdSA9ICgoc3RydWN0IHRocmVhZF9pbmZvICopIGNoaWxkLT5zdGFjayktPmNwdTsKKwlpbnQgbiwgY3B1ID0gdGFza19jcHUoY2hpbGQpOwogCXN0cnVjdCB1c2VyX2Z4c3Jfc3RydWN0IGZwcmVnczsKIAogCW4gPSBjb3B5X2Zyb21fdXNlcigmZnByZWdzLCBidWYsIHNpemVvZihmcHJlZ3MpKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3B0cmFjZV82NC5jIGIvYXJjaC94ODYvdW0vcHRyYWNlXzY0LmMKaW5kZXggZmFhYjQxOC4uMGI1YzE4NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdW0vcHRyYWNlXzY0LmMKKysrIGIvYXJjaC94ODYvdW0vcHRyYWNlXzY0LmMKQEAgLTc4LDcgKzc4LDExIEBACiAJY2FzZSBSU0k6CiAJY2FzZSBSREk6CiAJY2FzZSBSQlA6CisJCWJyZWFrOworCiAJY2FzZSBPUklHX1JBWDoKKwkJLyogVXBkYXRlIHRoZSBzeXNjYWxsIG51bWJlci4gKi8KKwkJVVBUX1NZU0NBTExfTlIoJmNoaWxkLT50aHJlYWQucmVncy5yZWdzKSA9IHZhbHVlOwogCQlicmVhazsKIAogCWNhc2UgRlM6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKaW5kZXggYjg2ZWJiMS4uYzBmZGQ1NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCisrKyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwpAQCAtMTM3LDggKzEzNywxMCBAQAogdm9pZCAqeGVuX2luaXRpYWxfZ2R0OwogCiBSRVNFUlZFX0JSSyhzaGFyZWRfaW5mb19wYWdlX2JyaywgUEFHRV9TSVpFKTsKLV9fcmVhZF9tb3N0bHkgaW50IHhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjazsKLUVYUE9SVF9TWU1CT0xfR1BMKHhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjayk7CisKK3N0YXRpYyBpbnQgeGVuX2NwdV91cF9wcmVwYXJlKHVuc2lnbmVkIGludCBjcHUpOworc3RhdGljIGludCB4ZW5fY3B1X3VwX29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KTsKK3N0YXRpYyBpbnQgeGVuX2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpOwogCiAvKgogICogUG9pbnQgYXQgc29tZSBlbXB0eSBtZW1vcnkgdG8gc3RhcnQgd2l0aC4gV2UgbWFwIHRoZSByZWFsIHNoYXJlZF9pbmZvCkBAIC0xMjM3LDcgKzEyMzksNiBAQAogCS53cml0ZV9jcjAgPSB4ZW5fd3JpdGVfY3IwLAogCiAJLnJlYWRfY3I0ID0gbmF0aXZlX3JlYWRfY3I0LAotCS5yZWFkX2NyNF9zYWZlID0gbmF0aXZlX3JlYWRfY3I0X3NhZmUsCiAJLndyaXRlX2NyNCA9IHhlbl93cml0ZV9jcjQsCiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CkBAIC0xNTIwLDEwICsxNTIxLDcgQEAKIAlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKQogCQlyZXR1cm47CiAKLQlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfaHZtX2NhbGxiYWNrX3ZlY3RvcikpCi0JCXJldHVybjsKLQotCXhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjayA9IDE7CisJQlVHX09OKCF4ZW5fZmVhdHVyZShYRU5GRUFUX2h2bV9jYWxsYmFja192ZWN0b3IpKTsKIAogCXhlbl9wdmhfZWFybHlfY3B1X2luaXQoMCwgZmFsc2UpOwogCXhlbl9wdmhfc2V0X2NyX2ZsYWdzKDApOwpAQCAtMTUzOSw2ICsxNTM3LDI0IEBACiAJeDg2X3BsYXRmb3JtLmxlZ2FjeS5ydGMgPSAxOwogfQogCitzdGF0aWMgaW50IHhlbl9jcHVocF9zZXR1cCh2b2lkKQoreworCWludCByYzsKKworCXJjID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9YRU5fUFJFUEFSRSwKKwkJCQkgICAgICAgIlhFTl9IVk1fR1VFU1RfUFJFUEFSRSIsCisJCQkJICAgICAgIHhlbl9jcHVfdXBfcHJlcGFyZSwgeGVuX2NwdV9kZWFkKTsKKwlpZiAocmMgPj0gMCkgeworCQlyYyA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwKKwkJCQkJICAgICAgICJYRU5fSFZNX0dVRVNUX09OTElORSIsCisJCQkJCSAgICAgICB4ZW5fY3B1X3VwX29ubGluZSwgTlVMTCk7CisJCWlmIChyYyA8IDApCisJCQljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhDUFVIUF9YRU5fUFJFUEFSRSk7CisJfQorCisJcmV0dXJuIHJjID49IDAgPyAwIDogcmM7Cit9CisKIC8qIEZpcnN0IEMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIFhlbiBib290ICovCiBhc21saW5rYWdlIF9fdmlzaWJsZSB2b2lkIF9faW5pdCB4ZW5fc3RhcnRfa2VybmVsKHZvaWQpCiB7CkBAIC0xNjQwLDYgKzE2NTYsOCBAQAogCSAgIHBvc3NpYmxlIG1hcCBhbmQgYSBub24tZHVtbXkgc2hhcmVkX2luZm8uICovCiAJcGVyX2NwdSh4ZW5fdmNwdSwgMCkgPSAmSFlQRVJWSVNPUl9zaGFyZWRfaW5mby0+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+KFxzZWxlY3QpCisJeGNoYWxfc2FfYWxpZ24JXHB0ciwgMCwgMTAyMCwgNCwgNAorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzAKKwl3dXIuVEhSRUFEUFRSCVxhdDEJCS8vIHRocmVhZHB0ciBvcHRpb24KKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgNAorCS5lbHNlaWYgKChYVEhBTF9TQVNfT1BUIHwgWFRIQUxfU0FTX0NDIHwgWFRIQUxfU0FTX0dMT0IpICYgfihcYWxsb2MpKSA9PSAwCisJeGNoYWxfc2FfYWxpZ24JXHB0ciwgMCwgMTAyMCwgNCwgNAorCS5zZXQJLkx4Y2hhbF9vZnNfLCAuTHhjaGFsX29mc18gKyA0CisJLmVuZGlmCisJLy8gT3B0aW9uYWwgY2FsbGVyLXNhdmVkIHJlZ2lzdGVycyB1c2VkIGJ5IGRlZmF1bHQgYnkgdGhlIGNvbXBpbGVyOgorCS5pZmVxIChYVEhBTF9TQVNfT1BUIHwgWFRIQUxfU0FTX0NDIHwgWFRIQUxfU0FTX0NBTFIpICYgfihcc2VsZWN0KQorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMTYsIDQsIDQKKwlsMzJpCVxhdDEsIFxwdHIsIC5MeGNoYWxfb2ZzXyswCisJd3NyLkFDQ0xPCVxhdDEJCS8vIE1BQzE2IG9wdGlvbgorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzQKKwl3c3IuQUNDSEkJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIDgKKwkuZWxzZWlmICgoWFRIQUxfU0FTX09QVCB8IFhUSEFMX1NBU19DQyB8IFhUSEFMX1NBU19DQUxSKSAmIH4oXGFsbG9jKSkgPT0gMAorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMTYsIDQsIDQKKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgOAorCS5lbmRpZgorCS8vIE9wdGlvbmFsIGNhbGxlci1zYXZlZCByZWdpc3RlcnMgbm90IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgY29tcGlsZXI6CisJLmlmZXEgKFhUSEFMX1NBU19PUFQgfCBYVEhBTF9TQVNfTk9DQyB8IFhUSEFMX1NBU19DQUxSKSAmIH4oXHNlbGVjdCkKKwl4Y2hhbF9zYV9hbGlnbglccHRyLCAwLCAxMDAwLCA0LCA0CisJbDMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMAorCXdzci5CUglcYXQxCQkvLyBib29sZWFuIG9wdGlvbgorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzQKKwl3c3IuU0NPTVBBUkUxCVxhdDEJCS8vIGNvbmRpdGlvbmFsIHN0b3JlIG9wdGlvbgorCWwzMmkJXGF0MSwgXHB0ciwgLkx4Y2hhbF9vZnNfKzgKKwl3c3IuTTAJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJbDMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMTIKKwl3c3IuTTEJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJbDMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMTYKKwl3c3IuTTIJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJbDMyaQlcYXQxLCBccHRyLCAuTHhjaGFsX29mc18rMjAKKwl3c3IuTTMJXGF0MQkJLy8gTUFDMTYgb3B0aW9uCisJLnNldAkuTHhjaGFsX29mc18sIC5MeGNoYWxfb2ZzXyArIDI0CisJLmVsc2VpZiAoKFhUSEFMX1NBU19PUFQgfCBYVEhBTF9TQVNfTk9DQyB8IFhUSEFMX1NBU19DQUxSKSAmIH4oXGFsbG9jKSkgPT0gMAorCXhjaGFsX3NhX2FsaWduCVxwdHIsIDAsIDEwMDAsIDQsIDQKKwkuc2V0CS5MeGNoYWxfb2ZzXywgLkx4Y2hhbF9vZnNfICsgMjQKKwkuZW5kaWYKKyAgICAuZW5kbQkvLyB4Y2hhbF9uY3BfbG9hZAorCisKKyNkZWZpbmUgWENIQUxfTkNQX05VTV9BVE1QUwkxCisKKyNkZWZpbmUgWENIQUxfU0FfTlVNX0FUTVBTCTEKKworI2VuZGlmIC8qX1hURU5TQV9DT1JFX1RJRV9BU01fSCovCisKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL3ZhcmlhbnRzL2NzcC9pbmNsdWRlL3ZhcmlhbnQvdGllLmggYi9hcmNoL3h0ZW5zYS92YXJpYW50cy9jc3AvaW5jbHVkZS92YXJpYW50L3RpZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZTM5MWNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94dGVuc2EvdmFyaWFudHMvY3NwL2luY2x1ZGUvdmFyaWFudC90aWUuaApAQCAtMCwwICsxLDE2MSBAQAorLyogCisgKiB0aWUuaCAtLSBjb21waWxlLXRpbWUgSEFMIGRlZmluaXRpb25zIGRlcGVuZGVudCBvbiBDT1JFICYgVElFIGNvbmZpZ3VyYXRpb24KKyAqCisgKiAgTk9URTogIFRoaXMgaGVhZGVyIGZpbGUgaXMgbm90IG1lYW50IHRvIGJlIGluY2x1ZGVkIGRpcmVjdGx5LgorICovCisKKy8qIFRoaXMgaGVhZGVyIGZpbGUgZGVzY3JpYmVzIHRoaXMgc3BlY2lmaWMgWHRlbnNhIHByb2Nlc3NvcidzIFRJRSBleHRlbnNpb25zCisgICB0aGF0IGV4dGVuZCBiYXNpYyBYdGVuc2EgY29yZSBmdW5jdGlvbmFsaXR5LiAgSXQgaXMgY3VzdG9taXplZCB0byB0aGlzCisgICBYdGVuc2EgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24uCisKKyAgIENvcHlyaWdodCAoYykgMTk5OS0yMDE1IENhZGVuY2UgRGVzaWduIFN5c3RlbXMgSW5jLgorCisgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAgIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICAgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKworICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAgIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICAgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgICBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICAgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuICAqLworCisjaWZuZGVmIF9YVEVOU0FfQ09SRV9USUVfSAorI2RlZmluZSBfWFRFTlNBX0NPUkVfVElFX0gKKworI2RlZmluZSBYQ0hBTF9DUF9OVU0JCQkxCS8qIG51bWJlciBvZiBjb3Byb2Nlc3NvcnMgKi8KKyNkZWZpbmUgWENIQUxfQ1BfTUFYCQkJOAkvKiBtYXggQ1AgSUQgKyAxICgwIGlmIG5vbmUpICovCisjZGVmaW5lIFhDSEFMX0NQX01BU0sJCQkweDgwCS8qIGJpdG1hc2sgb2YgYWxsIENQcyBieSBJRCAqLworI2RlZmluZSBYQ0hBTF9DUF9QT1JUX01BU0sJCTB4ODAJLyogYml0bWFzayBvZiBvbmx5IHBvcnQgQ1BzICovCisKKy8qICBCYXNpYyBwYXJhbWV0ZXJzIG9mIGVhY2ggY29wcm9jZXNzb3I6ICAqLworI2RlZmluZSBYQ0hBTF9DUDdfTkFNRQkJCSJYVElPUCIKKyNkZWZpbmUgWENIQUxfQ1A3X0lERU5UCQkJWFRJT1AKKyNkZWZpbmUgWENIQUxfQ1A3X1NBX1NJWkUJCTAJLyogc2l6ZSBvZiBzdGF0ZSBzYXZlIGFyZWEgKi8KKyNkZWZpbmUgWENIQUxfQ1A3X1NBX0FMSUdOCQkxCS8qIG1pbiBhbGlnbm1lbnQgb2Ygc2F2ZSBhcmVhICovCisjZGVmaW5lIFhDSEFMX0NQX0lEX1hUSU9QICAgICAgICAgICAJNwkvKiBjb3Byb2Nlc3NvciBJRCAoMC4uNykgKi8KKworLyogIEZpbGxlciBpbmZvIGZvciB1bmFzc2lnbmVkIGNvcHJvY2Vzc29ycywgdG8gc2ltcGxpZnkgYXJyYXlzIGV0YzogICovCisjZGVmaW5lIFhDSEFMX0NQMF9TQV9TSVpFCQkwCisjZGVmaW5lIFhDSEFMX0NQMF9TQV9BTElHTgkJMQorI2RlZmluZSBYQ0hBTF9DUDFfU0FfU0laRQkJMAorI2RlZmluZSBYQ0hBTF9DUDFfU0FfQUxJR04JCTEKKyNkZWZpbmUgWENIQUxfQ1AyX1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1AyX1NBX0FMSUdOCQkxCisjZGVmaW5lIFhDSEFMX0NQM19TQV9TSVpFCQkwCisjZGVmaW5lIFhDSEFMX0NQM19TQV9BTElHTgkJMQorI2RlZmluZSBYQ0hBTF9DUDRfU0FfU0laRQkJMAorI2RlZmluZSBYQ0hBTF9DUDRfU0FfQUxJR04JCTEKKyNkZWZpbmUgWENIQUxfQ1A1X1NBX1NJWkUJCTAKKyNkZWZpbmUgWENIQUxfQ1A1X1NBX0FMSUdOCQkxCisjZGVmaW5lIFhDSEFMX0NQNl9TQV9TSVpFCQkwCisjZGVmaW5lIFhDSEFMX0NQNl9TQV9BTElHTgkJMQorCisvKiAgU2F2ZSBhcmVhIGZvciBub24tY29wcm9jZXNzb3Igb3B0aW9uYWwgYW5kIGN1c3RvbSAoVElFKSBzdGF0ZTogICovCisjZGVmaW5lIFhDSEFMX05DUF9TQV9TSVpFCQkzNgorI2RlZmluZSBYQ0hBTF9OQ1BfU0FfQUxJR04JCTQKKworLyogIFRvdGFsIHNhdmUgYXJlYSBmb3Igb3B0aW9uYWwgYW5kIGN1c3RvbSBzdGF0ZSAoTkNQICsgQ1BuKTogICovCisjZGVmaW5lIFhDSEFMX1RPVEFMX1NBX1NJWkUJCTQ4CS8qIHdpdGggMTYtYnl0ZSBhbGlnbiBwYWRkaW5nICovCisjZGVmaW5lIFhDSEFMX1RPVEFMX1NBX0FMSUdOCQk0CS8qIGFjdHVhbCBtaW5pbXVtIGFsaWdubWVudCAqLworCisvKgorICogRGV0YWlsZWQgY29udGVudHMgb2Ygc2F2ZSBhcmVhcy4KKyAqIE5PVEU6ICBjYWxsZXIgbXVzdCBkZWZpbmUgdGhlIFhDSEFMX1NBX1JFRyBtYWNybyAobm90IGRlZmluZWQgaGVyZSkKKyAqIGJlZm9yZSBleHBhbmRpbmcgdGhlIFhDSEFMX3h4eF9TQV9MSVNUKCkgbWFjcm9zLgorICoKKyAqIFhDSEFMX1NBX1JFRyhzLGNjdXNlZCxhYmlraW5kLGtpbmQsb3B0LG5hbWUsZ2FsaWduLGFsaWduLGFzaXplLAorICoJCWRibnVtLGJhc2UscmVnbnVtLGJpdHN6LGdhcHN6LHJlc2V0LHguLi4pCisgKgorICoJcyA9IHBhc3NlZCBmcm9tIFhDSEFMXypfTElTVChzKSwgZWcuIHRvIHNlbGVjdCBob3cgdG8gZXhwYW5kCisgKgljY3VzZWQgPSBzZXQgaWYgdXNlZCBieSBjb21waWxlciB3aXRob3V0IHNwZWNpYWwgb3B0aW9ucyBvciBjb2RlCisgKglhYmlraW5kID0gMCAoY2FsbGVyLXNhdmVkKSwgMSAoY2FsbGVlLXNhdmVkKSwgb3IgMiAodGhyZWFkLWdsb2JhbCkKKyAqCWtpbmQgPSAwIChzcGVjaWFsIHJlZyksIDEgKFRJRSB1c2VyIHJlZyksIG9yIDIgKFRJRSByZWdmaWxlIHJlZykKKyAqCW9wdCA9IDAgKGN1c3RvbSBUSUUgZXh0ZW5zaW9uIG9yIGNvcHJvY2Vzc29yKSwgb3IgMSAob3B0aW9uYWwgcmVnKQorICoJbmFtZSA9IGxvd2VyY2FzZSByZWcgbmFtZSAobm8gcXVvdGVzKQorICoJZ2FsaWduID0gZ3JvdXAgYnl0ZSBhbGlnbm1lbnQgKHBvd2VyIG9mIDIpIChnYWxpZ24gPj0gYWxpZ24pCisgKglhbGlnbiA9IHJlZ2lzdGVyIGJ5dGUgYWxpZ25tZW50IChwb3dlciBvZiAyKQorICoJYXNpemUgPSBhbGxvY2F0ZWQgc2l6ZSBpbiBieXRlcyAoYXNpemUqOCA9PSBiaXRzeiArIGdhcHN6ICsgcGFkc3opCisgKgkgIChub3QgaW5jbHVkaW5nIGFueSBwYWQgYnl0ZXMgcmVxdWlyZWQgdG8gZ2FsaWduIHRoaXMgb3IgbmV4dCByZWcpCisgKglkYm51bSA9IHVuaXF1ZSB0YXJnZXQgbnVtYmVyIGYvZGVidWcgKHNlZSA8eHRlbnNhLWxpYmRiLW1hY3Jvcy5oPikKKyAqCWJhc2UgPSByZWcgc2hvcnRuYW1lIHcvbyBpbmRleCAob3Igc3I9c3BlY2lhbCwgdXI9VElFIHVzZXIgcmVnKQorICoJcmVnbnVtID0gcmVnIGluZGV4IGluIHJlZ2ZpbGUsIG9yIHNwZWNpYWwvVElFLXVzZXIgcmVnIG51bWJlcgorICoJYml0c3ogPSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgYml0cyAocmVnZmlsZSB3aWR0aCwgb3IgdXIvc3IgbWFzayBiaXRzKQorICoJZ2Fwc3ogPSBpbnRlcnZlbmluZyBiaXRzLCBpZiBiaXRzeiBiaXRzIG5vdCBzdG9yZWQgY29udGlndW91c2x5CisgKgkocGFkc3ogPSBwYWQgYml0cyBhdCBlbmQgW1RJRSByZWdmaWxlXSBvciBhdCBtc2JpdHMgW3VyLHNyXSBvZiBhc2l6ZSkKKyAqCXJlc2V0ID0gcmVnaXN0ZXIgcmVzZXQgdmFsdWUgKG9yIDAgaWYgdW5kZWZpbmVkIGF0IHJlc2V0KQorICoJeCA9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICgwIHVudGlsIHRoZW4pCisgKgorICogIFRvIGZpbHRlciBvdXQgY2VydGFpbiByZWdpc3RlcnMsIGUuZy4gdG8gZXhwYW5kIG9ubHkgdGhlIG5vbi1nbG9iYWwKKyAqICByZWdpc3RlcnMgdXNlZCBieSB0aGUgY29tcGlsZXIsIHlvdSBjYW4gZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKKyAqCisgKiAgI2RlZmluZSBYQ0hBTF9TQV9SRUcocyxjY3VzZWQscC4uLikJU0VMQ0MjI2NjdXNlZChwKQorICogICNkZWZpbmUgU0VMQ0MwKHAuLi4pCisgKiAgI2RlZmluZSBTRUxDQzEoYWJpa2luZCxwLi4uKQlTRUxBSyMjYWJpa2luZChwKQorICogICNkZWZpbmUgU0VMQUswKHAuLi4pCQlSRUcocCkKKyAqICAjZGVmaW5lIFNFTEFLMShwLi4uKQkJUkVHKHApCisgKiAgI2RlZmluZSBTRUxBSzIocC4uLikKKyAqICAjZGVmaW5lIFJFRyhraW5kLHRpZSxuYW1lLGdhbG4sYWxuLGFzeixjc3osZGJudW0sYmFzZSxybnVtLGJzeixyc3QseC4uLikgXAorICoJCS4uLndoYXQgeW91IHdhbnQgdG8gZXhwYW5kLi4uCisgKi8KKworI2RlZmluZSBYQ0hBTF9OQ1BfU0FfTlVNCTkKKyNkZWZpbmUgWENIQUxfTkNQX1NBX0xJU1QocykJXAorIFhDSEFMX1NBX1JFRyhzLDEsMiwxLDEsICAgICAgdGhyZWFkcHRyLCA0LCA0LCA0LDB4MDNFNywgIHVyLDIzMSwgMzIsMCwwLDApIFwKKyBYQ0hBTF9TQV9SRUcocywxLDAsMCwxLCAgICAgICAgICBhY2NsbywgNCwgNCwgNCwweDAyMTAsICBzciwxNiAsIDMyLDAsMCwwKSBcCisgWENIQUxfU0FfUkVHKHMsMSwwLDAsMSwgICAgICAgICAgYWNjaGksIDQsIDQsIDQsMHgwMjExLCAgc3IsMTcgLCAgOCwwLDAsMCkgXAorIFhDSEFMX1NBX1JFRyhzLDAsMCwwLDEsICAgICAgICAgICAgIGJyLCA0LCA0LCA0LDB4MDIwNCwgIHNyLDQgICwgMTYsMCwwLDApIFwKKyBYQ0hBTF9TQV9SRUcocywwLDAsMCwxLCAgICAgIHNjb21wYXJlMSwgNCwgNCwgNCwweDAyMEMsICBzciwxMiAsIDMyLDAsMCwwKSBcCisgWENIQUxfU0FfUkVHKHMsMCwwLDAsMSwgICAgICAgICAgICAgbTAsIDQsIDQsIDQsMHgwMjIwLCAgc3IsMzIgLCAzMiwwLDAsMCkgXAorIFhDSEFMX1NBX1JFRyhzLDAsMCwwLDEsICAgICAgICAgICAgIG0xLCA0LCA0LCA0LDB4MDIyMSwgIHNyLDMzICwgMzIsMCwwLDApIFwKKyBYQ0hBTF9TQV9SRUcocywwLDAsMCwxLCAgICAgICAgICAgICBtMiwgNCwgNCwgNCwweDAyMjIsICBzciwzNCAsIDMyLDAsMCwwKSBcCisgWENIQUxfU0FfUkVHKHMsMCwwLDAsMSwgICAgICAgICAgICAgbTMsIDQsIDQsIDQsMHgwMjIzLCAgc3IsMzUgLCAzMiwwLDAsMCkKKworI2RlZmluZSBYQ0hBTF9DUDBfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1AwX1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDFfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1AxX1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDJfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1AyX1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDNfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1AzX1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDRfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1A0X1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDVfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1A1X1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDZfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1A2X1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworI2RlZmluZSBYQ0hBTF9DUDdfU0FfTlVNCTAKKyNkZWZpbmUgWENIQUxfQ1A3X1NBX0xJU1QocykJLyogZW1wdHkgKi8KKworLyogQnl0ZSBsZW5ndGggb2YgaW5zdHJ1Y3Rpb24gZnJvbSBpdHMgZmlyc3QgbmliYmxlIChvcDAgZmllbGQpLCBwZXIgRkxJWC4gICovCisjZGVmaW5lIFhDSEFMX09QMF9GT1JNQVRfTEVOR1RIUwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzCisvKiBCeXRlIGxlbmd0aCBvZiBpbnN0cnVjdGlvbiBmcm9tIGl0cyBmaXJzdCBieXRlLCBwZXIgRkxJWC4gICovCisjZGVmaW5lIFhDSEFMX0JZVEUwX0ZPUk1BVF9MRU5HVEhTCVwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLFwKKwkzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzLCAzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMywzCisKKyNlbmRpZiAvKl9YVEVOU0FfQ09SRV9USUVfSCovCisKZGlmZiAtLWdpdCBhL2Jsb2NrL0tjb25maWcgYi9ibG9jay9LY29uZmlnCmluZGV4IDE2MTQ5MWQuLjUxMzZhZDQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL0tjb25maWcKKysrIGIvYmxvY2svS2NvbmZpZwpAQCAtNCw2ICs0LDcgQEAKIG1lbnVjb25maWcgQkxPQ0sKICAgICAgICBib29sICJFbmFibGUgdGhlIGJsb2NrIGxheWVyIiBpZiBFWFBFUlQKICAgICAgICBkZWZhdWx0IHkKKyAgICAgICBzZWxlY3QgU0JJVE1BUAogICAgICAgIGhlbHAKIAkgUHJvdmlkZSBibG9jayBsYXllciBzdXBwb3J0IGZvciB0aGUga2VybmVsLgogCmRpZmYgLS1naXQgYS9ibG9jay9iaW8uYyBiL2Jsb2NrL2Jpby5jCmluZGV4IGFhNzM1NDAuLmRiODVjNTcgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jpby5jCisrKyBiL2Jsb2NrL2Jpby5jCkBAIC0xMDY4LDcgKzEwNjgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBiaW9fZnJlZV9wYWdlcyhzdHJ1Y3QgYmlvICpiaW8pCit2b2lkIGJpb19mcmVlX3BhZ2VzKHN0cnVjdCBiaW8gKmJpbykKIHsKIAlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKIAlpbnQgaTsKQEAgLTEwNzYsNiArMTA3Niw3IEBACiAJYmlvX2Zvcl9lYWNoX3NlZ21lbnRfYWxsKGJ2ZWMsIGJpbywgaSkKIAkJX19mcmVlX3BhZ2UoYnZlYy0+YnZfcGFnZSk7CiB9CitFWFBPUlRfU1lNQk9MKGJpb19mcmVlX3BhZ2VzKTsKIAogLyoqCiAgKgliaW9fdW5jb3B5X3VzZXIJLQlmaW5pc2ggcHJldmlvdXNseSBtYXBwZWQgYmlvCkBAIC0xMjc0LDcgKzEyNzUsNyBAQAogCiAJCW5yX3BhZ2VzICs9IGVuZCAtIHN0YXJ0OwogCQkvKgotCQkgKiBidWZmZXIgbXVzdCBiZSBhbGlnbmVkIHRvIGF0IGxlYXN0IGhhcmRzZWN0b3Igc2l6ZSBmb3Igbm93CisJCSAqIGJ1ZmZlciBtdXN0IGJlIGFsaWduZWQgdG8gYXQgbGVhc3QgbG9naWNhbCBibG9jayBzaXplIGZvciBub3cKIAkJICovCiAJCWlmICh1YWRkciAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpCiAJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IDM2YzdhYzMuLjE0ZDdjMDcgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNvcmUuYwpAQCAtMjg4LDcgKzI4OCw3IEBACiAJCWludCBpOwogCiAJCXF1ZXVlX2Zvcl9lYWNoX2h3X2N0eChxLCBoY3R4LCBpKSB7Ci0JCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmhjdHgtPnJ1bl93b3JrKTsKKwkJCWNhbmNlbF93b3JrX3N5bmMoJmhjdHgtPnJ1bl93b3JrKTsKIAkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaGN0eC0+ZGVsYXlfd29yayk7CiAJCX0KIAl9IGVsc2UgewpAQCAtMzA5Nyw2ICszMDk3LDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MKGtibG9ja2Rfc2NoZWR1bGVfd29yayk7CiAKK2ludCBrYmxvY2tkX3NjaGVkdWxlX3dvcmtfb24oaW50IGNwdSwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXJldHVybiBxdWV1ZV93b3JrX29uKGNwdSwga2Jsb2NrZF93b3JrcXVldWUsIHdvcmspOworfQorRVhQT1JUX1NZTUJPTChrYmxvY2tkX3NjaGVkdWxlX3dvcmtfb24pOworCiBpbnQga2Jsb2NrZF9zY2hlZHVsZV9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmssCiAJCQkJICB1bnNpZ25lZCBsb25nIGRlbGF5KQogewpAQCAtMzMwMSwxOSArMzMwNywyMyBAQAogewogCXN0cnVjdCBibGtfcGx1ZyAqcGx1ZzsKIAlsb25nIHN0YXRlOworCXVuc2lnbmVkIGludCBxdWV1ZV9udW07CisJc3RydWN0IGJsa19tcV9od19jdHggKmhjdHg7CiAKIAlpZiAoIXEtPm1xX29wcyB8fCAhcS0+bXFfb3BzLT5wb2xsIHx8ICFibGtfcWNfdF92YWxpZChjb29raWUpIHx8CiAJICAgICF0ZXN0X2JpdChRVUVVRV9GTEFHX1BPTEwsICZxLT5xdWV1ZV9mbGFncykpCiAJCXJldHVybiBmYWxzZTsKIAorCXF1ZXVlX251bSA9IGJsa19xY190X3RvX3F1ZXVlX251bShjb29raWUpOworCWhjdHggPSBxLT5xdWV1ZV9od19jdHhbcXVldWVfbnVtXTsKKwloY3R4LT5wb2xsX2NvbnNpZGVyZWQrKzsKKwogCXBsdWcgPSBjdXJyZW50LT5wbHVnOwogCWlmIChwbHVnKQogCQlibGtfZmx1c2hfcGx1Z19saXN0KHBsdWcsIGZhbHNlKTsKIAogCXN0YXRlID0gY3VycmVudC0+c3RhdGU7CiAJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewotCQl1bnNpZ25lZCBpbnQgcXVldWVfbnVtID0gYmxrX3FjX3RfdG9fcXVldWVfbnVtKGNvb2tpZSk7Ci0JCXN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4ID0gcS0+cXVldWVfaHdfY3R4W3F1ZXVlX251bV07CiAJCWludCByZXQ7CiAKIAkJaGN0eC0+cG9sbF9pbnZva2VkKys7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstbXEtc3lzZnMuYyBiL2Jsb2NrL2Jsay1tcS1zeXNmcy5jCmluZGV4IGZlODIyYWEuLjAxZmI0NTUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tcS1zeXNmcy5jCisrKyBiL2Jsb2NrL2Jsay1tcS1zeXNmcy5jCkBAIC0xNzYsNyArMTc2LDE3IEBACiAKIHN0YXRpYyBzc2l6ZV90IGJsa19tcV9od19zeXNmc19wb2xsX3Nob3coc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsIGNoYXIgKnBhZ2UpCiB7Ci0JcmV0dXJuIHNwcmludGYocGFnZSwgImludm9rZWQ9JWx1LCBzdWNjZXNzPSVsdVxuIiwgaGN0eC0+cG9sbF9pbnZva2VkLCBoY3R4LT5wb2xsX3N1Y2Nlc3MpOworCXJldHVybiBzcHJpbnRmKHBhZ2UsICJjb25zaWRlcmVkPSVsdSwgaW52b2tlZD0lbHUsIHN1Y2Nlc3M9JWx1XG4iLAorCQkgICAgICAgaGN0eC0+cG9sbF9jb25zaWRlcmVkLCBoY3R4LT5wb2xsX2ludm9rZWQsCisJCSAgICAgICBoY3R4LT5wb2xsX3N1Y2Nlc3MpOworfQorCitzdGF0aWMgc3NpemVfdCBibGtfbXFfaHdfc3lzZnNfcG9sbF9zdG9yZShzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKKwkJCQkJICBjb25zdCBjaGFyICpwYWdlLCBzaXplX3Qgc2l6ZSkKK3sKKwloY3R4LT5wb2xsX2NvbnNpZGVyZWQgPSBoY3R4LT5wb2xsX2ludm9rZWQgPSBoY3R4LT5wb2xsX3N1Y2Nlc3MgPSAwOworCisJcmV0dXJuIHNpemU7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGJsa19tcV9od19zeXNmc19xdWV1ZWRfc2hvdyhzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKQEAgLTE5OCwxMiArMjA4LDE0IEBACiAKIAlwYWdlICs9IHNwcmludGYocGFnZSwgIiU4dVx0JWx1XG4iLCAwVSwgaGN0eC0+ZGlzcGF0Y2hlZFswXSk7CiAKLQlmb3IgKGkgPSAxOyBpIDwgQkxLX01RX01BWF9ESVNQQVRDSF9PUkRFUjsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZCA9IDFVIDw8IChpIC0gMSk7CisJZm9yIChpID0gMTsgaSA8IEJMS19NUV9NQVhfRElTUEFUQ0hfT1JERVIgLSAxOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGQgPSAxVSA8PCAoaSAtIDEpOwogCi0JCXBhZ2UgKz0gc3ByaW50ZihwYWdlLCAiJThsdVx0JWx1XG4iLCBkLCBoY3R4LT5kaXNwYXRjaGVkW2ldKTsKKwkJcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIlOHVcdCVsdVxuIiwgZCwgaGN0eC0+ZGlzcGF0Y2hlZFtpXSk7CiAJfQogCisJcGFnZSArPSBzcHJpbnRmKHBhZ2UsICIlOHUrXHQlbHVcbiIsIDFVIDw8IChpIC0gMSksCisJCQkJCQloY3R4LT5kaXNwYXRjaGVkW2ldKTsKIAlyZXR1cm4gcGFnZSAtIHN0YXJ0X3BhZ2U7CiB9CiAKQEAgLTMwMSw4ICszMTMsOSBAQAogCS5zaG93ID0gYmxrX21xX2h3X3N5c2ZzX2NwdXNfc2hvdywKIH07CiBzdGF0aWMgc3RydWN0IGJsa19tcV9od19jdHhfc3lzZnNfZW50cnkgYmxrX21xX2h3X3N5c2ZzX3BvbGwgPSB7Ci0JLmF0dHIgPSB7Lm5hbWUgPSAiaW9fcG9sbCIsIC5tb2RlID0gU19JUlVHTyB9LAorCS5hdHRyID0gey5uYW1lID0gImlvX3BvbGwiLCAubW9kZSA9IFNfSVdVU1IgfCBTX0lSVUdPIH0sCiAJLnNob3cgPSBibGtfbXFfaHdfc3lzZnNfcG9sbF9zaG93LAorCS5zdG9yZSA9IGJsa19tcV9od19zeXNmc19wb2xsX3N0b3JlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmRlZmF1bHRfaHdfY3R4X2F0dHJzW10gPSB7CkBAIC0zODAsOSArMzkzLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBfX2Jsa19tcV91bnJlZ2lzdGVyX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCitzdGF0aWMgdm9pZCBfX2Jsa19tcV91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gZGlzay0+cXVldWU7CiAJc3RydWN0IGJsa19tcV9od19jdHggKmhjdHg7CiAJc3RydWN0IGJsa19tcV9jdHggKmN0eDsKIAlpbnQgaSwgajsKQEAgLTQwMCwxNSArNDEyLDE1IEBACiAJa29iamVjdF9kZWwoJnEtPm1xX2tvYmopOwogCWtvYmplY3RfcHV0KCZxLT5tcV9rb2JqKTsKIAotCWtvYmplY3RfcHV0KCZkaXNrX3RvX2RldihkaXNrKS0+a29iaik7CisJa29iamVjdF9wdXQoJmRldi0+a29iaik7CiAKIAlxLT5tcV9zeXNmc19pbml0X2RvbmUgPSBmYWxzZTsKIH0KIAotdm9pZCBibGtfbXFfdW5yZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQordm9pZCBibGtfbXFfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlibGtfbXFfZGlzYWJsZV9ob3RwbHVnKCk7Ci0JX19ibGtfbXFfdW5yZWdpc3Rlcl9kaXNrKGRpc2spOworCV9fYmxrX21xX3VucmVnaXN0ZXJfZGV2KGRldiwgcSk7CiAJYmxrX21xX2VuYWJsZV9ob3RwbHVnKCk7CiB9CiAKQEAgLTQzMCwxMCArNDQyLDggQEAKIAl9CiB9CiAKLWludCBibGtfbXFfcmVnaXN0ZXJfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK2ludCBibGtfbXFfcmVnaXN0ZXJfZGV2KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gZGlza190b19kZXYoZGlzayk7Ci0Jc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkaXNrLT5xdWV1ZTsKIAlzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eDsKIAlpbnQgcmV0LCBpOwogCkBAIC00NTQsNyArNDY0LDcgQEAKIAl9CiAKIAlpZiAocmV0KQotCQlfX2Jsa19tcV91bnJlZ2lzdGVyX2Rpc2soZGlzayk7CisJCV9fYmxrX21xX3VucmVnaXN0ZXJfZGV2KGRldiwgcSk7CiAJZWxzZQogCQlxLT5tcV9zeXNmc19pbml0X2RvbmUgPSB0cnVlOwogb3V0OgpAQCAtNDYyLDcgKzQ3Miw3IEBACiAKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwoYmxrX21xX3JlZ2lzdGVyX2Rpc2spOworRVhQT1JUX1NZTUJPTF9HUEwoYmxrX21xX3JlZ2lzdGVyX2Rldik7CiAKIHZvaWQgYmxrX21xX3N5c2ZzX3VucmVnaXN0ZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstbXEtdGFnLmMgYi9ibG9jay9ibGstbXEtdGFnLmMKaW5kZXggNzI5YmFjMy4uY2VmNjE4ZiAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLXRhZy5jCisrKyBiL2Jsb2NrL2Jsay1tcS10YWcuYwpAQCAtMSw1OCArMSwyNCBAQAogLyoKLSAqIEZhc3QgYW5kIHNjYWxhYmxlIGJpdG1hcCB0YWdnaW5nIHZhcmlhbnQuIFVzZXMgc3BhcnNlciBiaXRtYXBzIHNwcmVhZAotICogb3ZlciBtdWx0aXBsZSBjYWNoZWxpbmVzIHRvIGF2b2lkIHBpbmctcG9uZyBiZXR3ZWVuIG11bHRpcGxlIHN1Ym1pdHRlcnMKLSAqIG9yIHN1Ym1pdHRlciBhbmQgY29tcGxldGVyLiBVc2VzIHJvbGxpbmcgd2FrZXVwcyB0byBhdm9pZCBmYWxsaW5nIG9mCi0gKiB0aGUgc2NhbGluZyBjbGlmZiB3aGVuIHdlIHJ1biBvdXQgb2YgdGFncyBhbmQgaGF2ZSB0byBzdGFydCBwdXR0aW5nCi0gKiBzdWJtaXR0ZXJzIHRvIHNsZWVwLgotICoKLSAqIFVzZXMgYWN0aXZlIHF1ZXVlIHRyYWNraW5nIHRvIHN1cHBvcnQgZmFpcmVyIGRpc3RyaWJ1dGlvbiBvZiB0YWdzCi0gKiBiZXR3ZWVuIG11bHRpcGxlIHN1Ym1pdHRlcnMgd2hlbiBhIHNoYXJlZCB0YWcgbWFwIGlzIHVzZWQuCisgKiBUYWcgYWxsb2NhdGlvbiB1c2luZyBzY2FsYWJsZSBiaXRtYXBzLiBVc2VzIGFjdGl2ZSBxdWV1ZSB0cmFja2luZyB0byBzdXBwb3J0CisgKiBmYWlyZXIgZGlzdHJpYnV0aW9uIG9mIHRhZ3MgYmV0d2VlbiBtdWx0aXBsZSBzdWJtaXR0ZXJzIHdoZW4gYSBzaGFyZWQgdGFnIG1hcAorICogaXMgdXNlZC4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNCBKZW5zIEF4Ym9lCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2Jsay1tcS5oPgogI2luY2x1ZGUgImJsay5oIgogI2luY2x1ZGUgImJsay1tcS5oIgogI2luY2x1ZGUgImJsay1tcS10YWcuaCIKIAotc3RhdGljIGJvb2wgYnRfaGFzX2ZyZWVfdGFncyhzdHJ1Y3QgYmxrX21xX2JpdG1hcF90YWdzICpidCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBidC0+bWFwX25yOyBpKyspIHsKLQkJc3RydWN0IGJsa19hbGlnbl9iaXRtYXAgKmJtID0gJmJ0LT5tYXBbaV07Ci0JCWludCByZXQ7Ci0KLQkJcmV0ID0gZmluZF9maXJzdF96ZXJvX2JpdCgmYm0tPndvcmQsIGJtLT5kZXB0aCk7Ci0JCWlmIChyZXQgPCBibS0+ZGVwdGgpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KIGJvb2wgYmxrX21xX2hhc19mcmVlX3RhZ3Moc3RydWN0IGJsa19tcV90YWdzICp0YWdzKQogewogCWlmICghdGFncykKIAkJcmV0dXJuIHRydWU7CiAKLQlyZXR1cm4gYnRfaGFzX2ZyZWVfdGFncygmdGFncy0+Yml0bWFwX3RhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBidF9pbmRleF9pbmMoaW50IGluZGV4KQotewotCXJldHVybiAoaW5kZXggKyAxKSAmIChCVF9XQUlUX1FVRVVFUyAtIDEpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYnRfaW5kZXhfYXRvbWljX2luYyhhdG9taWNfdCAqaW5kZXgpCi17Ci0JaW50IG9sZCA9IGF0b21pY19yZWFkKGluZGV4KTsKLQlpbnQgbmV3ID0gYnRfaW5kZXhfaW5jKG9sZCk7Ci0JYXRvbWljX2NtcHhjaGcoaW5kZXgsIG9sZCwgbmV3KTsKKwlyZXR1cm4gc2JpdG1hcF9hbnlfYml0X2NsZWFyKCZ0YWdzLT5iaXRtYXBfdGFncy5zYik7CiB9CiAKIC8qCkBAIC03MiwyOSArMzgsOSBAQAogICovCiB2b2lkIGJsa19tcV90YWdfd2FrZXVwX2FsbChzdHJ1Y3QgYmxrX21xX3RhZ3MgKnRhZ3MsIGJvb2wgaW5jbHVkZV9yZXNlcnZlKQogewotCXN0cnVjdCBibGtfbXFfYml0bWFwX3RhZ3MgKmJ0OwotCWludCBpLCB3YWtlX2luZGV4OwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgYWxsIGNoYW5nZXMgcHJpb3IgdG8gdGhpcyBhcmUgdmlzaWJsZSBmcm9tIG90aGVyIENQVXMuCi0JICovCi0Jc21wX21iKCk7Ci0JYnQgPSAmdGFncy0+Yml0bWFwX3RhZ3M7Ci0Jd2FrZV9pbmRleCA9IGF0b21pY19yZWFkKCZidC0+d2FrZV9pbmRleCk7Ci0JZm9yIChpID0gMDsgaSA8IEJUX1dBSVRfUVVFVUVTOyBpKyspIHsKLQkJc3RydWN0IGJ0X3dhaXRfc3RhdGUgKmJzID0gJmJ0LT5ic1t3YWtlX2luZGV4XTsKLQotCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmYnMtPndhaXQpKQotCQkJd2FrZV91cCgmYnMtPndhaXQpOwotCi0JCXdha2VfaW5kZXggPSBidF9pbmRleF9pbmMod2FrZV9pbmRleCk7Ci0JfQotCi0JaWYgKGluY2x1ZGVfcmVzZXJ2ZSkgewotCQlidCA9ICZ0YWdzLT5icmVzZXJ2ZWRfdGFnczsKLQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmJ0LT5ic1swXS53YWl0KSkKLQkJCXdha2VfdXAoJmJ0LT5ic1swXS53YWl0KTsKLQl9CisJc2JpdG1hcF9xdWV1ZV93YWtlX2FsbCgmdGFncy0+Yml0bWFwX3RhZ3MpOworCWlmIChpbmNsdWRlX3Jlc2VydmUpCisJCXNiaXRtYXBfcXVldWVfd2FrZV9hbGwoJnRhZ3MtPmJyZXNlcnZlZF90YWdzKTsKIH0KIAogLyoKQEAgLTExOCw3ICs2NCw3IEBACiAgKiBhbmQgYXR0ZW1wdCB0byBwcm92aWRlIGEgZmFpciBzaGFyZSBvZiB0aGUgdGFnIGRlcHRoIGZvciBlYWNoIG9mIHRoZW0uCiAgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBoY3R4X21heV9xdWV1ZShzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCwKLQkJCQkgIHN0cnVjdCBibGtfbXFfYml0bWFwX3RhZ3MgKmJ0KQorCQkJCSAgc3RydWN0IHNiaXRtYXBfcXVldWUgKmJ0KQogewogCXVuc2lnbmVkIGludCBkZXB0aCwgdXNlcnM7CiAKQEAgLTEzMCw3ICs3Niw3IEBACiAJLyoKIAkgKiBEb24ndCB0cnkgZGl2aWRpbmcgYW4gYW50CiAJICovCi0JaWYgKGJ0LT5kZXB0aCA9PSAxKQorCWlmIChidC0+c2IuZGVwdGggPT0gMSkKIAkJcmV0dXJuIHRydWU7CiAKIAl1c2VycyA9IGF0b21pY19yZWFkKCZoY3R4LT50YWdzLT5hY3RpdmVfcXVldWVzKTsKQEAgLTE0MCwxNDIgKzg2LDM2IEBACiAJLyoKIAkgKiBBbGxvdyBhdCBsZWFzdCBzb21lIHRhZ3MKIAkgKi8KLQlkZXB0aCA9IG1heCgoYnQtPmRlcHRoICsgdXNlcnMgLSAxKSAvIHVzZXJzLCA0VSk7CisJZGVwdGggPSBtYXgoKGJ0LT5zYi5kZXB0aCArIHVzZXJzIC0gMSkgLyB1c2VycywgNFUpOwogCXJldHVybiBhdG9taWNfcmVhZCgmaGN0eC0+bnJfYWN0aXZlKSA8IGRlcHRoOwogfQogCi1zdGF0aWMgaW50IF9fYnRfZ2V0X3dvcmQoc3RydWN0IGJsa19hbGlnbl9iaXRtYXAgKmJtLCB1bnNpZ25lZCBpbnQgbGFzdF90YWcsCi0JCQkgYm9vbCBub3dyYXApCitzdGF0aWMgaW50IF9fYnRfZ2V0KHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LCBzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAqYnQpCiB7Ci0JaW50IHRhZywgb3JnX2xhc3RfdGFnID0gbGFzdF90YWc7Ci0KLQl3aGlsZSAoMSkgewotCQl0YWcgPSBmaW5kX25leHRfemVyb19iaXQoJmJtLT53b3JkLCBibS0+ZGVwdGgsIGxhc3RfdGFnKTsKLQkJaWYgKHVubGlrZWx5KHRhZyA+PSBibS0+ZGVwdGgpKSB7Ci0JCQkvKgotCQkJICogV2Ugc3RhcnRlZCB3aXRoIGFuIG9mZnNldCwgYW5kIHdlIGRpZG4ndCByZXNldCB0aGUKLQkJCSAqIG9mZnNldCB0byAwIGluIGEgZmFpbHVyZSBjYXNlLCBzbyBzdGFydCBmcm9tIDAgdG8KLQkJCSAqIGV4aGF1c3QgdGhlIG1hcC4KLQkJCSAqLwotCQkJaWYgKG9yZ19sYXN0X3RhZyAmJiBsYXN0X3RhZyAmJiAhbm93cmFwKSB7Ci0JCQkJbGFzdF90YWcgPSBvcmdfbGFzdF90YWcgPSAwOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KHRhZywgJmJtLT53b3JkKSkKLQkJCWJyZWFrOwotCi0JCWxhc3RfdGFnID0gdGFnICsgMTsKLQkJaWYgKGxhc3RfdGFnID49IGJtLT5kZXB0aCAtIDEpCi0JCQlsYXN0X3RhZyA9IDA7Ci0JfQotCi0JcmV0dXJuIHRhZzsKLX0KLQotI2RlZmluZSBCVF9BTExPQ19SUih0YWdzKSAodGFncy0+YWxsb2NfcG9saWN5ID09IEJMS19UQUdfQUxMT0NfUlIpCi0KLS8qCi0gKiBTdHJhaWdodCBmb3J3YXJkIGJpdG1hcCB0YWcgaW1wbGVtZW50YXRpb24sIHdoZXJlIGVhY2ggYml0IGlzIGEgdGFnCi0gKiAoY2xlYXJlZCA9PSBmcmVlLCBhbmQgc2V0ID09IGJ1c3kpLiBUaGUgc21hbGwgdHdpc3QgaXMgdXNpbmcgcGVyLWNwdQotICogbGFzdF90YWcgY2FjaGVzLCB3aGljaCBibGstbXEgc3RvcmVzIGluIHRoZSBibGtfbXFfY3R4IHNvZnR3YXJlIHF1ZXVlCi0gKiBjb250ZXh0cy4gVGhpcyBlbmFibGVzIHVzIHRvIGRyYXN0aWNhbGx5IGxpbWl0IHRoZSBzcGFjZSBzZWFyY2hlZCwKLSAqIHdpdGhvdXQgZGlydHlpbmcgYW4gZXh0cmEgc2hhcmVkIGNhY2hlbGluZSBsaWtlIHdlIHdvdWxkIGlmIHdlIHN0b3JlZAotICogdGhlIGNhY2hlIHZhbHVlIGluc2lkZSB0aGUgc2hhcmVkIGJsa19tcV9iaXRtYXBfdGFncyBzdHJ1Y3R1cmUuIE9uIHRvcAotICogb2YgdGhhdCwgZWFjaCB3b3JkIG9mIHRhZ3MgaXMgaW4gYSBzZXBhcmF0ZSBjYWNoZWxpbmUuIFRoaXMgbWVhbnMgdGhhdAotICogbXVsdGlwbGUgdXNlcnMgd2lsbCB0ZW5kIHRvIHN0aWNrIHRvIGRpZmZlcmVudCBjYWNoZWxpbmVzLCBhdCBsZWFzdAotICogdW50aWwgdGhlIG1hcCBpcyBleGhhdXN0ZWQuCi0gKi8KLXN0YXRpYyBpbnQgX19idF9nZXQoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsIHN0cnVjdCBibGtfbXFfYml0bWFwX3RhZ3MgKmJ0LAotCQkgICAgdW5zaWduZWQgaW50ICp0YWdfY2FjaGUsIHN0cnVjdCBibGtfbXFfdGFncyAqdGFncykKLXsKLQl1bnNpZ25lZCBpbnQgbGFzdF90YWcsIG9yZ19sYXN0X3RhZzsKLQlpbnQgaW5kZXgsIGksIHRhZzsKLQogCWlmICghaGN0eF9tYXlfcXVldWUoaGN0eCwgYnQpKQogCQlyZXR1cm4gLTE7Ci0KLQlsYXN0X3RhZyA9IG9yZ19sYXN0X3RhZyA9ICp0YWdfY2FjaGU7Ci0JaW5kZXggPSBUQUdfVE9fSU5ERVgoYnQsIGxhc3RfdGFnKTsKLQotCWZvciAoaSA9IDA7IGkgPCBidC0+bWFwX25yOyBpKyspIHsKLQkJdGFnID0gX19idF9nZXRfd29yZCgmYnQtPm1hcFtpbmRleF0sIFRBR19UT19CSVQoYnQsIGxhc3RfdGFnKSwKLQkJCQkgICAgQlRfQUxMT0NfUlIodGFncykpOwotCQlpZiAodGFnICE9IC0xKSB7Ci0JCQl0YWcgKz0gKGluZGV4IDw8IGJ0LT5iaXRzX3Blcl93b3JkKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCS8qCi0JCSAqIEp1bXAgdG8gbmV4dCBpbmRleCwgYW5kIHJlc2V0IHRoZSBsYXN0IHRhZyB0byBiZSB0aGUKLQkJICogZmlyc3QgdGFnIG9mIHRoYXQgaW5kZXgKLQkJICovCi0JCWluZGV4Kys7Ci0JCWxhc3RfdGFnID0gKGluZGV4IDw8IGJ0LT5iaXRzX3Blcl93b3JkKTsKLQotCQlpZiAoaW5kZXggPj0gYnQtPm1hcF9ucikgewotCQkJaW5kZXggPSAwOwotCQkJbGFzdF90YWcgPSAwOwotCQl9Ci0JfQotCi0JKnRhZ19jYWNoZSA9IDA7Ci0JcmV0dXJuIC0xOwotCi0JLyoKLQkgKiBPbmx5IHVwZGF0ZSB0aGUgY2FjaGUgZnJvbSB0aGUgYWxsb2NhdGlvbiBwYXRoLCBpZiB3ZSBlbmRlZAotCSAqIHVwIHVzaW5nIHRoZSBzcGVjaWZpYyBjYWNoZWQgdGFnLgotCSAqLwotZG9uZToKLQlpZiAodGFnID09IG9yZ19sYXN0X3RhZyB8fCB1bmxpa2VseShCVF9BTExPQ19SUih0YWdzKSkpIHsKLQkJbGFzdF90YWcgPSB0YWcgKyAxOwotCQlpZiAobGFzdF90YWcgPj0gYnQtPmRlcHRoIC0gMSkKLQkJCWxhc3RfdGFnID0gMDsKLQotCQkqdGFnX2NhY2hlID0gbGFzdF90YWc7Ci0JfQotCi0JcmV0dXJuIHRhZzsKKwlyZXR1cm4gX19zYml0bWFwX3F1ZXVlX2dldChidCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYnRfd2FpdF9zdGF0ZSAqYnRfd2FpdF9wdHIoc3RydWN0IGJsa19tcV9iaXRtYXBfdGFncyAqYnQsCi0JCQkJCSBzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eCkKK3N0YXRpYyBpbnQgYnRfZ2V0KHN0cnVjdCBibGtfbXFfYWxsb2NfZGF0YSAqZGF0YSwgc3RydWN0IHNiaXRtYXBfcXVldWUgKmJ0LAorCQkgIHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LCBzdHJ1Y3QgYmxrX21xX3RhZ3MgKnRhZ3MpCiB7Ci0Jc3RydWN0IGJ0X3dhaXRfc3RhdGUgKmJzOwotCWludCB3YWl0X2luZGV4OwotCi0JaWYgKCFoY3R4KQotCQlyZXR1cm4gJmJ0LT5ic1swXTsKLQotCXdhaXRfaW5kZXggPSBhdG9taWNfcmVhZCgmaGN0eC0+d2FpdF9pbmRleCk7Ci0JYnMgPSAmYnQtPmJzW3dhaXRfaW5kZXhdOwotCWJ0X2luZGV4X2F0b21pY19pbmMoJmhjdHgtPndhaXRfaW5kZXgpOwotCXJldHVybiBiczsKLX0KLQotc3RhdGljIGludCBidF9nZXQoc3RydWN0IGJsa19tcV9hbGxvY19kYXRhICpkYXRhLAotCQlzdHJ1Y3QgYmxrX21xX2JpdG1hcF90YWdzICpidCwKLQkJc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsCi0JCXVuc2lnbmVkIGludCAqbGFzdF90YWcsIHN0cnVjdCBibGtfbXFfdGFncyAqdGFncykKLXsKLQlzdHJ1Y3QgYnRfd2FpdF9zdGF0ZSAqYnM7CisJc3RydWN0IHNicV93YWl0X3N0YXRlICp3czsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlpbnQgdGFnOwogCi0JdGFnID0gX19idF9nZXQoaGN0eCwgYnQsIGxhc3RfdGFnLCB0YWdzKTsKKwl0YWcgPSBfX2J0X2dldChoY3R4LCBidCk7CiAJaWYgKHRhZyAhPSAtMSkKIAkJcmV0dXJuIHRhZzsKIAogCWlmIChkYXRhLT5mbGFncyAmIEJMS19NUV9SRVFfTk9XQUlUKQogCQlyZXR1cm4gLTE7CiAKLQlicyA9IGJ0X3dhaXRfcHRyKGJ0LCBoY3R4KTsKKwl3cyA9IGJ0X3dhaXRfcHRyKGJ0LCBoY3R4KTsKIAlkbyB7Ci0JCXByZXBhcmVfdG9fd2FpdCgmYnMtPndhaXQsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXByZXBhcmVfdG9fd2FpdCgmd3MtPndhaXQsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAKLQkJdGFnID0gX19idF9nZXQoaGN0eCwgYnQsIGxhc3RfdGFnLCB0YWdzKTsKKwkJdGFnID0gX19idF9nZXQoaGN0eCwgYnQpOwogCQlpZiAodGFnICE9IC0xKQogCQkJYnJlYWs7CiAKQEAgLTI5Miw3ICsxMzIsNyBAQAogCQkgKiBSZXRyeSB0YWcgYWxsb2NhdGlvbiBhZnRlciBydW5uaW5nIHRoZSBoYXJkd2FyZSBxdWV1ZSwKIAkJICogYXMgcnVubmluZyB0aGUgcXVldWUgbWF5IGFsc28gaGF2ZSBmb3VuZCBjb21wbGV0aW9ucy4KIAkJICovCi0JCXRhZyA9IF9fYnRfZ2V0KGhjdHgsIGJ0LCBsYXN0X3RhZywgdGFncyk7CisJCXRhZyA9IF9fYnRfZ2V0KGhjdHgsIGJ0KTsKIAkJaWYgKHRhZyAhPSAtMSkKIAkJCWJyZWFrOwogCkBAIC0zMDYsMTUgKzE0NiwxNCBAQAogCQlpZiAoZGF0YS0+ZmxhZ3MgJiBCTEtfTVFfUkVRX1JFU0VSVkVEKSB7CiAJCQlidCA9ICZkYXRhLT5oY3R4LT50YWdzLT5icmVzZXJ2ZWRfdGFnczsKIAkJfSBlbHNlIHsKLQkJCWxhc3RfdGFnID0gJmRhdGEtPmN0eC0+bGFzdF90YWc7CiAJCQloY3R4ID0gZGF0YS0+aGN0eDsKIAkJCWJ0ID0gJmhjdHgtPnRhZ3MtPmJpdG1hcF90YWdzOwogCQl9Ci0JCWZpbmlzaF93YWl0KCZicy0+d2FpdCwgJndhaXQpOwotCQlicyA9IGJ0X3dhaXRfcHRyKGJ0LCBoY3R4KTsKKwkJZmluaXNoX3dhaXQoJndzLT53YWl0LCAmd2FpdCk7CisJCXdzID0gYnRfd2FpdF9wdHIoYnQsIGhjdHgpOwogCX0gd2hpbGUgKDEpOwogCi0JZmluaXNoX3dhaXQoJmJzLT53YWl0LCAmd2FpdCk7CisJZmluaXNoX3dhaXQoJndzLT53YWl0LCAmd2FpdCk7CiAJcmV0dXJuIHRhZzsKIH0KIApAQCAtMzIzLDcgKzE2Miw3IEBACiAJaW50IHRhZzsKIAogCXRhZyA9IGJ0X2dldChkYXRhLCAmZGF0YS0+aGN0eC0+dGFncy0+Yml0bWFwX3RhZ3MsIGRhdGEtPmhjdHgsCi0JCQkmZGF0YS0+Y3R4LT5sYXN0X3RhZywgZGF0YS0+aGN0eC0+dGFncyk7CisJCSAgICAgZGF0YS0+aGN0eC0+dGFncyk7CiAJaWYgKHRhZyA+PSAwKQogCQlyZXR1cm4gdGFnICsgZGF0YS0+aGN0eC0+dGFncy0+bnJfcmVzZXJ2ZWRfdGFnczsKIApAQCAtMzMyLDE1ICsxNzEsMTUgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBfX2Jsa19tcV9nZXRfcmVzZXJ2ZWRfdGFnKHN0cnVjdCBibGtfbXFfYWxsb2NfZGF0YSAqZGF0YSkKIHsKLQlpbnQgdGFnLCB6ZXJvID0gMDsKKwlpbnQgdGFnOwogCiAJaWYgKHVubGlrZWx5KCFkYXRhLT5oY3R4LT50YWdzLT5ucl9yZXNlcnZlZF90YWdzKSkgewogCQlXQVJOX09OX09OQ0UoMSk7CiAJCXJldHVybiBCTEtfTVFfVEFHX0ZBSUw7CiAJfQogCi0JdGFnID0gYnRfZ2V0KGRhdGEsICZkYXRhLT5oY3R4LT50YWdzLT5icmVzZXJ2ZWRfdGFncywgTlVMTCwgJnplcm8sCi0JCWRhdGEtPmhjdHgtPnRhZ3MpOworCXRhZyA9IGJ0X2dldChkYXRhLCAmZGF0YS0+aGN0eC0+dGFncy0+YnJlc2VydmVkX3RhZ3MsIE5VTEwsCisJCSAgICAgZGF0YS0+aGN0eC0+dGFncyk7CiAJaWYgKHRhZyA8IDApCiAJCXJldHVybiBCTEtfTVFfVEFHX0ZBSUw7CiAKQEAgLTM1NCw1NSArMTkzLDggQEAKIAlyZXR1cm4gX19ibGtfbXFfZ2V0X3RhZyhkYXRhKTsKIH0KIAotc3RhdGljIHN0cnVjdCBidF93YWl0X3N0YXRlICpidF93YWtlX3B0cihzdHJ1Y3QgYmxrX21xX2JpdG1hcF90YWdzICpidCkKLXsKLQlpbnQgaSwgd2FrZV9pbmRleDsKLQotCXdha2VfaW5kZXggPSBhdG9taWNfcmVhZCgmYnQtPndha2VfaW5kZXgpOwotCWZvciAoaSA9IDA7IGkgPCBCVF9XQUlUX1FVRVVFUzsgaSsrKSB7Ci0JCXN0cnVjdCBidF93YWl0X3N0YXRlICpicyA9ICZidC0+YnNbd2FrZV9pbmRleF07Ci0KLQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmJzLT53YWl0KSkgewotCQkJaW50IG8gPSBhdG9taWNfcmVhZCgmYnQtPndha2VfaW5kZXgpOwotCQkJaWYgKHdha2VfaW5kZXggIT0gbykKLQkJCQlhdG9taWNfY21weGNoZygmYnQtPndha2VfaW5kZXgsIG8sIHdha2VfaW5kZXgpOwotCi0JCQlyZXR1cm4gYnM7Ci0JCX0KLQotCQl3YWtlX2luZGV4ID0gYnRfaW5kZXhfaW5jKHdha2VfaW5kZXgpOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBidF9jbGVhcl90YWcoc3RydWN0IGJsa19tcV9iaXRtYXBfdGFncyAqYnQsIHVuc2lnbmVkIGludCB0YWcpCi17Ci0JY29uc3QgaW50IGluZGV4ID0gVEFHX1RPX0lOREVYKGJ0LCB0YWcpOwotCXN0cnVjdCBidF93YWl0X3N0YXRlICpiczsKLQlpbnQgd2FpdF9jbnQ7Ci0KLQljbGVhcl9iaXQoVEFHX1RPX0JJVChidCwgdGFnKSwgJmJ0LT5tYXBbaW5kZXhdLndvcmQpOwotCi0JLyogRW5zdXJlIHRoYXQgdGhlIHdhaXQgbGlzdCBjaGVja3Mgb2NjdXIgYWZ0ZXIgY2xlYXJfYml0KCkuICovCi0Jc21wX21iKCk7Ci0KLQlicyA9IGJ0X3dha2VfcHRyKGJ0KTsKLQlpZiAoIWJzKQotCQlyZXR1cm47Ci0KLQl3YWl0X2NudCA9IGF0b21pY19kZWNfcmV0dXJuKCZicy0+d2FpdF9jbnQpOwotCWlmICh1bmxpa2VseSh3YWl0X2NudCA8IDApKQotCQl3YWl0X2NudCA9IGF0b21pY19pbmNfcmV0dXJuKCZicy0+d2FpdF9jbnQpOwotCWlmICh3YWl0X2NudCA9PSAwKSB7Ci0JCWF0b21pY19hZGQoYnQtPndha2VfY250LCAmYnMtPndhaXRfY250KTsKLQkJYnRfaW5kZXhfYXRvbWljX2luYygmYnQtPndha2VfaW5kZXgpOwotCQl3YWtlX3VwKCZicy0+d2FpdCk7Ci0JfQotfQotCi12b2lkIGJsa19tcV9wdXRfdGFnKHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LCB1bnNpZ25lZCBpbnQgdGFnLAotCQkgICAgdW5zaWduZWQgaW50ICpsYXN0X3RhZykKK3ZvaWQgYmxrX21xX3B1dF90YWcoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsIHN0cnVjdCBibGtfbXFfY3R4ICpjdHgsCisJCSAgICB1bnNpZ25lZCBpbnQgdGFnKQogewogCXN0cnVjdCBibGtfbXFfdGFncyAqdGFncyA9IGhjdHgtPnRhZ3M7CiAKQEAgLTQxMCw2NyArMjAyLDkyIEBACiAJCWNvbnN0IGludCByZWFsX3RhZyA9IHRhZyAtIHRhZ3MtPm5yX3Jlc2VydmVkX3RhZ3M7CiAKIAkJQlVHX09OKHJlYWxfdGFnID49IHRhZ3MtPm5yX3RhZ3MpOwotCQlidF9jbGVhcl90YWcoJnRhZ3MtPmJpdG1hcF90YWdzLCByZWFsX3RhZyk7Ci0JCWlmIChsaWtlbHkodGFncy0+YWxsb2NfcG9saWN5ID09IEJMS19UQUdfQUxMT0NfRklGTykpCi0JCQkqbGFzdF90YWcgPSByZWFsX3RhZzsKKwkJc2JpdG1hcF9xdWV1ZV9jbGVhcigmdGFncy0+Yml0bWFwX3RhZ3MsIHJlYWxfdGFnLCBjdHgtPmNwdSk7CiAJfSBlbHNlIHsKIAkJQlVHX09OKHRhZyA+PSB0YWdzLT5ucl9yZXNlcnZlZF90YWdzKTsKLQkJYnRfY2xlYXJfdGFnKCZ0YWdzLT5icmVzZXJ2ZWRfdGFncywgdGFnKTsKKwkJc2JpdG1hcF9xdWV1ZV9jbGVhcigmdGFncy0+YnJlc2VydmVkX3RhZ3MsIHRhZywgY3R4LT5jcHUpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgYnRfZm9yX2VhY2goc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsCi0JCXN0cnVjdCBibGtfbXFfYml0bWFwX3RhZ3MgKmJ0LCB1bnNpZ25lZCBpbnQgb2ZmLAotCQlidXN5X2l0ZXJfZm4gKmZuLCB2b2lkICpkYXRhLCBib29sIHJlc2VydmVkKQorc3RydWN0IGJ0X2l0ZXJfZGF0YSB7CisJc3RydWN0IGJsa19tcV9od19jdHggKmhjdHg7CisJYnVzeV9pdGVyX2ZuICpmbjsKKwl2b2lkICpkYXRhOworCWJvb2wgcmVzZXJ2ZWQ7Cit9OworCitzdGF0aWMgYm9vbCBidF9pdGVyKHN0cnVjdCBzYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGludCBiaXRuciwgdm9pZCAqZGF0YSkKIHsKKwlzdHJ1Y3QgYnRfaXRlcl9kYXRhICppdGVyX2RhdGEgPSBkYXRhOworCXN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4ID0gaXRlcl9kYXRhLT5oY3R4OworCXN0cnVjdCBibGtfbXFfdGFncyAqdGFncyA9IGhjdHgtPnRhZ3M7CisJYm9vbCByZXNlcnZlZCA9IGl0ZXJfZGF0YS0+cmVzZXJ2ZWQ7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwotCWludCBiaXQsIGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYnQtPm1hcF9ucjsgaSsrKSB7Ci0JCXN0cnVjdCBibGtfYWxpZ25fYml0bWFwICpibSA9ICZidC0+bWFwW2ldOworCWlmICghcmVzZXJ2ZWQpCisJCWJpdG5yICs9IHRhZ3MtPm5yX3Jlc2VydmVkX3RhZ3M7CisJcnEgPSB0YWdzLT5ycXNbYml0bnJdOwogCi0JCWZvciAoYml0ID0gZmluZF9maXJzdF9iaXQoJmJtLT53b3JkLCBibS0+ZGVwdGgpOwotCQkgICAgIGJpdCA8IGJtLT5kZXB0aDsKLQkJICAgICBiaXQgPSBmaW5kX25leHRfYml0KCZibS0+d29yZCwgYm0tPmRlcHRoLCBiaXQgKyAxKSkgewotCQkJcnEgPSBoY3R4LT50YWdzLT5ycXNbb2ZmICsgYml0XTsKLQkJCWlmIChycS0+cSA9PSBoY3R4LT5xdWV1ZSkKLQkJCQlmbihoY3R4LCBycSwgZGF0YSwgcmVzZXJ2ZWQpOwotCQl9Ci0KLQkJb2ZmICs9ICgxIDw8IGJ0LT5iaXRzX3Blcl93b3JkKTsKLQl9CisJaWYgKHJxLT5xID09IGhjdHgtPnF1ZXVlKQorCQlpdGVyX2RhdGEtPmZuKGhjdHgsIHJxLCBpdGVyX2RhdGEtPmRhdGEsIHJlc2VydmVkKTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQgYnRfdGFnc19mb3JfZWFjaChzdHJ1Y3QgYmxrX21xX3RhZ3MgKnRhZ3MsCi0JCXN0cnVjdCBibGtfbXFfYml0bWFwX3RhZ3MgKmJ0LCB1bnNpZ25lZCBpbnQgb2ZmLAotCQlidXN5X3RhZ19pdGVyX2ZuICpmbiwgdm9pZCAqZGF0YSwgYm9vbCByZXNlcnZlZCkKK3N0YXRpYyB2b2lkIGJ0X2Zvcl9lYWNoKHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LCBzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAqYnQsCisJCQlidXN5X2l0ZXJfZm4gKmZuLCB2b2lkICpkYXRhLCBib29sIHJlc2VydmVkKQogeworCXN0cnVjdCBidF9pdGVyX2RhdGEgaXRlcl9kYXRhID0geworCQkuaGN0eCA9IGhjdHgsCisJCS5mbiA9IGZuLAorCQkuZGF0YSA9IGRhdGEsCisJCS5yZXNlcnZlZCA9IHJlc2VydmVkLAorCX07CisKKwlzYml0bWFwX2Zvcl9lYWNoX3NldCgmYnQtPnNiLCBidF9pdGVyLCAmaXRlcl9kYXRhKTsKK30KKworc3RydWN0IGJ0X3RhZ3NfaXRlcl9kYXRhIHsKKwlzdHJ1Y3QgYmxrX21xX3RhZ3MgKnRhZ3M7CisJYnVzeV90YWdfaXRlcl9mbiAqZm47CisJdm9pZCAqZGF0YTsKKwlib29sIHJlc2VydmVkOworfTsKKworc3RhdGljIGJvb2wgYnRfdGFnc19pdGVyKHN0cnVjdCBzYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGludCBiaXRuciwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYnRfdGFnc19pdGVyX2RhdGEgKml0ZXJfZGF0YSA9IGRhdGE7CisJc3RydWN0IGJsa19tcV90YWdzICp0YWdzID0gaXRlcl9kYXRhLT50YWdzOworCWJvb2wgcmVzZXJ2ZWQgPSBpdGVyX2RhdGEtPnJlc2VydmVkOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKLQlpbnQgYml0LCBpOwogCi0JaWYgKCF0YWdzLT5ycXMpCi0JCXJldHVybjsKLQlmb3IgKGkgPSAwOyBpIDwgYnQtPm1hcF9ucjsgaSsrKSB7Ci0JCXN0cnVjdCBibGtfYWxpZ25fYml0bWFwICpibSA9ICZidC0+bWFwW2ldOworCWlmICghcmVzZXJ2ZWQpCisJCWJpdG5yICs9IHRhZ3MtPm5yX3Jlc2VydmVkX3RhZ3M7CisJcnEgPSB0YWdzLT5ycXNbYml0bnJdOwogCi0JCWZvciAoYml0ID0gZmluZF9maXJzdF9iaXQoJmJtLT53b3JkLCBibS0+ZGVwdGgpOwotCQkgICAgIGJpdCA8IGJtLT5kZXB0aDsKLQkJICAgICBiaXQgPSBmaW5kX25leHRfYml0KCZibS0+d29yZCwgYm0tPmRlcHRoLCBiaXQgKyAxKSkgewotCQkJcnEgPSB0YWdzLT5ycXNbb2ZmICsgYml0XTsKLQkJCWZuKHJxLCBkYXRhLCByZXNlcnZlZCk7Ci0JCX0KKwlpdGVyX2RhdGEtPmZuKHJxLCBpdGVyX2RhdGEtPmRhdGEsIHJlc2VydmVkKTsKKwlyZXR1cm4gdHJ1ZTsKK30KIAotCQlvZmYgKz0gKDEgPDwgYnQtPmJpdHNfcGVyX3dvcmQpOwotCX0KK3N0YXRpYyB2b2lkIGJ0X3RhZ3NfZm9yX2VhY2goc3RydWN0IGJsa19tcV90YWdzICp0YWdzLCBzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAqYnQsCisJCQkgICAgIGJ1c3lfdGFnX2l0ZXJfZm4gKmZuLCB2b2lkICpkYXRhLCBib29sIHJlc2VydmVkKQoreworCXN0cnVjdCBidF90YWdzX2l0ZXJfZGF0YSBpdGVyX2RhdGEgPSB7CisJCS50YWdzID0gdGFncywKKwkJLmZuID0gZm4sCisJCS5kYXRhID0gZGF0YSwKKwkJLnJlc2VydmVkID0gcmVzZXJ2ZWQsCisJfTsKKworCWlmICh0YWdzLT5ycXMpCisJCXNiaXRtYXBfZm9yX2VhY2hfc2V0KCZidC0+c2IsIGJ0X3RhZ3NfaXRlciwgJml0ZXJfZGF0YSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJsa19tcV9hbGxfdGFnX2J1c3lfaXRlcihzdHJ1Y3QgYmxrX21xX3RhZ3MgKnRhZ3MsCiAJCWJ1c3lfdGFnX2l0ZXJfZm4gKmZuLCB2b2lkICpwcml2KQogewogCWlmICh0YWdzLT5ucl9yZXNlcnZlZF90YWdzKQotCQlidF90YWdzX2Zvcl9lYWNoKHRhZ3MsICZ0YWdzLT5icmVzZXJ2ZWRfdGFncywgMCwgZm4sIHByaXYsIHRydWUpOwotCWJ0X3RhZ3NfZm9yX2VhY2godGFncywgJnRhZ3MtPmJpdG1hcF90YWdzLCB0YWdzLT5ucl9yZXNlcnZlZF90YWdzLCBmbiwgcHJpdiwKLQkJCWZhbHNlKTsKKwkJYnRfdGFnc19mb3JfZWFjaCh0YWdzLCAmdGFncy0+YnJlc2VydmVkX3RhZ3MsIGZuLCBwcml2LCB0cnVlKTsKKwlidF90YWdzX2Zvcl9lYWNoKHRhZ3MsICZ0YWdzLT5iaXRtYXBfdGFncywgZm4sIHByaXYsIGZhbHNlKTsKIH0KIAogdm9pZCBibGtfbXFfdGFnc2V0X2J1c3lfaXRlcihzdHJ1Y3QgYmxrX21xX3RhZ19zZXQgKnRhZ3NldCwKQEAgLTUyOSwxMjQgKzM0Niw0MCBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKHRhZ3MtPm5yX3Jlc2VydmVkX3RhZ3MpCi0JCQlidF9mb3JfZWFjaChoY3R4LCAmdGFncy0+YnJlc2VydmVkX3RhZ3MsIDAsIGZuLCBwcml2LCB0cnVlKTsKLQkJYnRfZm9yX2VhY2goaGN0eCwgJnRhZ3MtPmJpdG1hcF90YWdzLCB0YWdzLT5ucl9yZXNlcnZlZF90YWdzLCBmbiwgcHJpdiwKLQkJICAgICAgZmFsc2UpOworCQkJYnRfZm9yX2VhY2goaGN0eCwgJnRhZ3MtPmJyZXNlcnZlZF90YWdzLCBmbiwgcHJpdiwgdHJ1ZSk7CisJCWJ0X2Zvcl9lYWNoKGhjdHgsICZ0YWdzLT5iaXRtYXBfdGFncywgZm4sIHByaXYsIGZhbHNlKTsKIAl9CiAKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBidF91bnVzZWRfdGFncyhzdHJ1Y3QgYmxrX21xX2JpdG1hcF90YWdzICpidCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnRfdW51c2VkX3RhZ3MoY29uc3Qgc3RydWN0IHNiaXRtYXBfcXVldWUgKmJ0KQogewotCXVuc2lnbmVkIGludCBpLCB1c2VkOwotCi0JZm9yIChpID0gMCwgdXNlZCA9IDA7IGkgPCBidC0+bWFwX25yOyBpKyspIHsKLQkJc3RydWN0IGJsa19hbGlnbl9iaXRtYXAgKmJtID0gJmJ0LT5tYXBbaV07Ci0KLQkJdXNlZCArPSBiaXRtYXBfd2VpZ2h0KCZibS0+d29yZCwgYm0tPmRlcHRoKTsKLQl9Ci0KLQlyZXR1cm4gYnQtPmRlcHRoIC0gdXNlZDsKKwlyZXR1cm4gYnQtPnNiLmRlcHRoIC0gc2JpdG1hcF93ZWlnaHQoJmJ0LT5zYik7CiB9CiAKLXN0YXRpYyB2b2lkIGJ0X3VwZGF0ZV9jb3VudChzdHJ1Y3QgYmxrX21xX2JpdG1hcF90YWdzICpidCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgZGVwdGgpCitzdGF0aWMgaW50IGJ0X2FsbG9jKHN0cnVjdCBzYml0bWFwX3F1ZXVlICpidCwgdW5zaWduZWQgaW50IGRlcHRoLAorCQkgICAgYm9vbCByb3VuZF9yb2JpbiwgaW50IG5vZGUpCiB7Ci0JdW5zaWduZWQgaW50IHRhZ3NfcGVyX3dvcmQgPSAxVSA8PCBidC0+Yml0c19wZXJfd29yZDsKLQl1bnNpZ25lZCBpbnQgbWFwX2RlcHRoID0gZGVwdGg7Ci0KLQlpZiAoZGVwdGgpIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGJ0LT5tYXBfbnI7IGkrKykgewotCQkJYnQtPm1hcFtpXS5kZXB0aCA9IG1pbihtYXBfZGVwdGgsIHRhZ3NfcGVyX3dvcmQpOwotCQkJbWFwX2RlcHRoIC09IGJ0LT5tYXBbaV0uZGVwdGg7Ci0JCX0KLQl9Ci0KLQlidC0+d2FrZV9jbnQgPSBCVF9XQUlUX0JBVENIOwotCWlmIChidC0+d2FrZV9jbnQgPiBkZXB0aCAvIEJUX1dBSVRfUVVFVUVTKQotCQlidC0+d2FrZV9jbnQgPSBtYXgoMVUsIGRlcHRoIC8gQlRfV0FJVF9RVUVVRVMpOwotCi0JYnQtPmRlcHRoID0gZGVwdGg7Ci19Ci0KLXN0YXRpYyBpbnQgYnRfYWxsb2Moc3RydWN0IGJsa19tcV9iaXRtYXBfdGFncyAqYnQsIHVuc2lnbmVkIGludCBkZXB0aCwKLQkJCWludCBub2RlLCBib29sIHJlc2VydmVkKQotewotCWludCBpOwotCi0JYnQtPmJpdHNfcGVyX3dvcmQgPSBpbG9nMihCSVRTX1BFUl9MT05HKTsKLQotCS8qCi0JICogRGVwdGggY2FuIGJlIHplcm8gZm9yIHJlc2VydmVkIHRhZ3MsIHRoYXQncyBub3QgYSBmYWlsdXJlCi0JICogY29uZGl0aW9uLgotCSAqLwotCWlmIChkZXB0aCkgewotCQl1bnNpZ25lZCBpbnQgbnIsIHRhZ3NfcGVyX3dvcmQ7Ci0KLQkJdGFnc19wZXJfd29yZCA9ICgxIDw8IGJ0LT5iaXRzX3Blcl93b3JkKTsKLQotCQkvKgotCQkgKiBJZiB0aGUgdGFnIHNwYWNlIGlzIHNtYWxsLCBzaHJpbmsgdGhlIG51bWJlciBvZiB0YWdzCi0JCSAqIHBlciB3b3JkIHNvIHdlIHNwcmVhZCBvdmVyIGEgZmV3IGNhY2hlbGluZXMsIGF0IGxlYXN0LgotCQkgKiBJZiBsZXNzIHRoYW4gNCB0YWdzLCBqdXN0IGZvcmdldCBhYm91dCBpdCwgaXQncyBub3QKLQkJICogZ29pbmcgdG8gd29yayBvcHRpbWFsbHkgYW55d2F5LgotCQkgKi8KLQkJaWYgKGRlcHRoID49IDQpIHsKLQkJCXdoaWxlICh0YWdzX3Blcl93b3JkICogNCA+IGRlcHRoKSB7Ci0JCQkJYnQtPmJpdHNfcGVyX3dvcmQtLTsKLQkJCQl0YWdzX3Blcl93b3JkID0gKDEgPDwgYnQtPmJpdHNfcGVyX3dvcmQpOwotCQkJfQotCQl9Ci0KLQkJbnIgPSBBTElHTihkZXB0aCwgdGFnc19wZXJfd29yZCkgLyB0YWdzX3Blcl93b3JkOwotCQlidC0+bWFwID0ga3phbGxvY19ub2RlKG5yICogc2l6ZW9mKHN0cnVjdCBibGtfYWxpZ25fYml0bWFwKSwKLQkJCQkJCUdGUF9LRVJORUwsIG5vZGUpOwotCQlpZiAoIWJ0LT5tYXApCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlidC0+bWFwX25yID0gbnI7Ci0JfQotCi0JYnQtPmJzID0ga3phbGxvYyhCVF9XQUlUX1FVRVVFUyAqIHNpemVvZigqYnQtPmJzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidC0+YnMpIHsKLQkJa2ZyZWUoYnQtPm1hcCk7Ci0JCWJ0LT5tYXAgPSBOVUxMOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlidF91cGRhdGVfY291bnQoYnQsIGRlcHRoKTsKLQotCWZvciAoaSA9IDA7IGkgPCBCVF9XQUlUX1FVRVVFUzsgaSsrKSB7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ0LT5ic1tpXS53YWl0KTsKLQkJYXRvbWljX3NldCgmYnQtPmJzW2ldLndhaXRfY250LCBidC0+d2FrZV9jbnQpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBidF9mcmVlKHN0cnVjdCBibGtfbXFfYml0bWFwX3RhZ3MgKmJ0KQotewotCWtmcmVlKGJ0LT5tYXApOwotCWtmcmVlKGJ0LT5icyk7CisJcmV0dXJuIHNiaXRtYXBfcXVldWVfaW5pdF9ub2RlKGJ0LCBkZXB0aCwgLTEsIHJvdW5kX3JvYmluLCBHRlBfS0VSTkVMLAorCQkJCSAgICAgICBub2RlKTsKIH0KIAogc3RhdGljIHN0cnVjdCBibGtfbXFfdGFncyAqYmxrX21xX2luaXRfYml0bWFwX3RhZ3Moc3RydWN0IGJsa19tcV90YWdzICp0YWdzLAogCQkJCQkJICAgaW50IG5vZGUsIGludCBhbGxvY19wb2xpY3kpCiB7CiAJdW5zaWduZWQgaW50IGRlcHRoID0gdGFncy0+bnJfdGFncyAtIHRhZ3MtPm5yX3Jlc2VydmVkX3RhZ3M7CisJYm9vbCByb3VuZF9yb2JpbiA9IGFsbG9jX3BvbGljeSA9PSBCTEtfVEFHX0FMTE9DX1JSOwogCi0JdGFncy0+YWxsb2NfcG9saWN5ID0gYWxsb2NfcG9saWN5OwotCi0JaWYgKGJ0X2FsbG9jKCZ0YWdzLT5iaXRtYXBfdGFncywgZGVwdGgsIG5vZGUsIGZhbHNlKSkKLQkJZ290byBlbm9tZW07Ci0JaWYgKGJ0X2FsbG9jKCZ0YWdzLT5icmVzZXJ2ZWRfdGFncywgdGFncy0+bnJfcmVzZXJ2ZWRfdGFncywgbm9kZSwgdHJ1ZSkpCi0JCWdvdG8gZW5vbWVtOworCWlmIChidF9hbGxvYygmdGFncy0+Yml0bWFwX3RhZ3MsIGRlcHRoLCByb3VuZF9yb2Jpbiwgbm9kZSkpCisJCWdvdG8gZnJlZV90YWdzOworCWlmIChidF9hbGxvYygmdGFncy0+YnJlc2VydmVkX3RhZ3MsIHRhZ3MtPm5yX3Jlc2VydmVkX3RhZ3MsIHJvdW5kX3JvYmluLAorCQkgICAgIG5vZGUpKQorCQlnb3RvIGZyZWVfYml0bWFwX3RhZ3M7CiAKIAlyZXR1cm4gdGFnczsKLWVub21lbToKLQlidF9mcmVlKCZ0YWdzLT5iaXRtYXBfdGFncyk7CitmcmVlX2JpdG1hcF90YWdzOgorCXNiaXRtYXBfcXVldWVfZnJlZSgmdGFncy0+Yml0bWFwX3RhZ3MpOworZnJlZV90YWdzOgogCWtmcmVlKHRhZ3MpOwogCXJldHVybiBOVUxMOwogfQpAQCAtNjc5LDE5ICs0MTIsMTIgQEAKIAogdm9pZCBibGtfbXFfZnJlZV90YWdzKHN0cnVjdCBibGtfbXFfdGFncyAqdGFncykKIHsKLQlidF9mcmVlKCZ0YWdzLT5iaXRtYXBfdGFncyk7Ci0JYnRfZnJlZSgmdGFncy0+YnJlc2VydmVkX3RhZ3MpOworCXNiaXRtYXBfcXVldWVfZnJlZSgmdGFncy0+Yml0bWFwX3RhZ3MpOworCXNiaXRtYXBfcXVldWVfZnJlZSgmdGFncy0+YnJlc2VydmVkX3RhZ3MpOwogCWZyZWVfY3B1bWFza192YXIodGFncy0+Y3B1bWFzayk7CiAJa2ZyZWUodGFncyk7CiB9CiAKLXZvaWQgYmxrX21xX3RhZ19pbml0X2xhc3RfdGFnKHN0cnVjdCBibGtfbXFfdGFncyAqdGFncywgdW5zaWduZWQgaW50ICp0YWcpCi17Ci0JdW5zaWduZWQgaW50IGRlcHRoID0gdGFncy0+bnJfdGFncyAtIHRhZ3MtPm5yX3Jlc2VydmVkX3RhZ3M7Ci0KLQkqdGFnID0gcHJhbmRvbV91MzIoKSAlIGRlcHRoOwotfQotCiBpbnQgYmxrX21xX3RhZ191cGRhdGVfZGVwdGgoc3RydWN0IGJsa19tcV90YWdzICp0YWdzLCB1bnNpZ25lZCBpbnQgdGRlcHRoKQogewogCXRkZXB0aCAtPSB0YWdzLT5ucl9yZXNlcnZlZF90YWdzOwpAQCAtNzAyLDcgKzQyOCw4IEBACiAJICogRG9uJ3QgbmVlZCAob3IgY2FuJ3QpIHVwZGF0ZSByZXNlcnZlZCB0YWdzIGhlcmUsIHRoZXkgcmVtYWluCiAJICogc3RhdGljIGFuZCBzaG91bGQgbmV2ZXIgbmVlZCByZXNpemluZy4KIAkgKi8KLQlidF91cGRhdGVfY291bnQoJnRhZ3MtPmJpdG1hcF90YWdzLCB0ZGVwdGgpOworCXNiaXRtYXBfcXVldWVfcmVzaXplKCZ0YWdzLT5iaXRtYXBfdGFncywgdGRlcHRoKTsKKwogCWJsa19tcV90YWdfd2FrZXVwX2FsbCh0YWdzLCBmYWxzZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC03NDYsNyArNDczLDcgQEAKIAlwYWdlICs9IHNwcmludGYocGFnZSwgIm5yX3RhZ3M9JXUsIHJlc2VydmVkX3RhZ3M9JXUsICIKIAkJCSJiaXRzX3Blcl93b3JkPSV1XG4iLAogCQkJdGFncy0+bnJfdGFncywgdGFncy0+bnJfcmVzZXJ2ZWRfdGFncywKLQkJCXRhZ3MtPmJpdG1hcF90YWdzLmJpdHNfcGVyX3dvcmQpOworCQkJMVUgPDwgdGFncy0+Yml0bWFwX3RhZ3Muc2Iuc2hpZnQpOwogCiAJZnJlZSA9IGJ0X3VudXNlZF90YWdzKCZ0YWdzLT5iaXRtYXBfdGFncyk7CiAJcmVzID0gYnRfdW51c2VkX3RhZ3MoJnRhZ3MtPmJyZXNlcnZlZF90YWdzKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS10YWcuaCBiL2Jsb2NrL2Jsay1tcS10YWcuaAppbmRleCBkNDY4YTc5Li4wOWY0Y2MwIDEwMDY0NAotLS0gYS9ibG9jay9ibGstbXEtdGFnLmgKKysrIGIvYmxvY2svYmxrLW1xLXRhZy5oCkBAIC0zLDMxICszLDYgQEAKIAogI2luY2x1ZGUgImJsay1tcS5oIgogCi1lbnVtIHsKLQlCVF9XQUlUX1FVRVVFUwk9IDgsCi0JQlRfV0FJVF9CQVRDSAk9IDgsCi19OwotCi1zdHJ1Y3QgYnRfd2FpdF9zdGF0ZSB7Ci0JYXRvbWljX3Qgd2FpdF9jbnQ7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKLX0gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKLQotI2RlZmluZSBUQUdfVE9fSU5ERVgoYnQsIHRhZykJKCh0YWcpID4+IChidCktPmJpdHNfcGVyX3dvcmQpCi0jZGVmaW5lIFRBR19UT19CSVQoYnQsIHRhZykJKCh0YWcpICYgKCgxIDw8IChidCktPmJpdHNfcGVyX3dvcmQpIC0gMSkpCi0KLXN0cnVjdCBibGtfbXFfYml0bWFwX3RhZ3MgewotCXVuc2lnbmVkIGludCBkZXB0aDsKLQl1bnNpZ25lZCBpbnQgd2FrZV9jbnQ7Ci0JdW5zaWduZWQgaW50IGJpdHNfcGVyX3dvcmQ7Ci0KLQl1bnNpZ25lZCBpbnQgbWFwX25yOwotCXN0cnVjdCBibGtfYWxpZ25fYml0bWFwICptYXA7Ci0KLQlhdG9taWNfdCB3YWtlX2luZGV4OwotCXN0cnVjdCBidF93YWl0X3N0YXRlICpiczsKLX07Ci0KIC8qCiAgKiBUYWcgYWRkcmVzcyBzcGFjZSBtYXAuCiAgKi8KQEAgLTM3LDEzICsxMiwxMiBAQAogCiAJYXRvbWljX3QgYWN0aXZlX3F1ZXVlczsKIAotCXN0cnVjdCBibGtfbXFfYml0bWFwX3RhZ3MgYml0bWFwX3RhZ3M7Ci0Jc3RydWN0IGJsa19tcV9iaXRtYXBfdGFncyBicmVzZXJ2ZWRfdGFnczsKKwlzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSBiaXRtYXBfdGFnczsKKwlzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSBicmVzZXJ2ZWRfdGFnczsKIAogCXN0cnVjdCByZXF1ZXN0ICoqcnFzOwogCXN0cnVjdCBsaXN0X2hlYWQgcGFnZV9saXN0OwogCi0JaW50IGFsbG9jX3BvbGljeTsKIAljcHVtYXNrX3Zhcl90IGNwdW1hc2s7CiB9OwogCkBAIC01MiwxNSArMjYsMjMgQEAKIGV4dGVybiB2b2lkIGJsa19tcV9mcmVlX3RhZ3Moc3RydWN0IGJsa19tcV90YWdzICp0YWdzKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBibGtfbXFfZ2V0X3RhZyhzdHJ1Y3QgYmxrX21xX2FsbG9jX2RhdGEgKmRhdGEpOwotZXh0ZXJuIHZvaWQgYmxrX21xX3B1dF90YWcoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsIHVuc2lnbmVkIGludCB0YWcsIHVuc2lnbmVkIGludCAqbGFzdF90YWcpOworZXh0ZXJuIHZvaWQgYmxrX21xX3B1dF90YWcoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsIHN0cnVjdCBibGtfbXFfY3R4ICpjdHgsCisJCQkgICB1bnNpZ25lZCBpbnQgdGFnKTsKIGV4dGVybiBib29sIGJsa19tcV9oYXNfZnJlZV90YWdzKHN0cnVjdCBibGtfbXFfdGFncyAqdGFncyk7CiBleHRlcm4gc3NpemVfdCBibGtfbXFfdGFnX3N5c2ZzX3Nob3coc3RydWN0IGJsa19tcV90YWdzICp0YWdzLCBjaGFyICpwYWdlKTsKLWV4dGVybiB2b2lkIGJsa19tcV90YWdfaW5pdF9sYXN0X3RhZyhzdHJ1Y3QgYmxrX21xX3RhZ3MgKnRhZ3MsIHVuc2lnbmVkIGludCAqbGFzdF90YWcpOwogZXh0ZXJuIGludCBibGtfbXFfdGFnX3VwZGF0ZV9kZXB0aChzdHJ1Y3QgYmxrX21xX3RhZ3MgKnRhZ3MsIHVuc2lnbmVkIGludCBkZXB0aCk7CiBleHRlcm4gdm9pZCBibGtfbXFfdGFnX3dha2V1cF9hbGwoc3RydWN0IGJsa19tcV90YWdzICp0YWdzLCBib29sKTsKIHZvaWQgYmxrX21xX3F1ZXVlX3RhZ19idXN5X2l0ZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGJ1c3lfaXRlcl9mbiAqZm4sCiAJCXZvaWQgKnByaXYpOwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzYnFfd2FpdF9zdGF0ZSAqYnRfd2FpdF9wdHIoc3RydWN0IHNiaXRtYXBfcXVldWUgKmJ0LAorCQkJCQkJIHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4KQoreworCWlmICghaGN0eCkKKwkJcmV0dXJuICZidC0+d3NbMF07CisJcmV0dXJuIHNicV93YWl0X3B0cihidCwgJmhjdHgtPndhaXRfaW5kZXgpOworfQorCiBlbnVtIHsKIAlCTEtfTVFfVEFHX0NBQ0hFX01JTgk9IDEsCiAJQkxLX01RX1RBR19DQUNIRV9NQVgJPSA2NCwKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS5jIGIvYmxvY2svYmxrLW1xLmMKaW5kZXggMTNmNWE2Yy4uZGM1ZjQ3ZiAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLmMKKysrIGIvYmxvY2svYmxrLW1xLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Jsb2NrLmg+CiAKQEAgLTMzLDQ5ICszNCwyOCBAQAogc3RhdGljIERFRklORV9NVVRFWChhbGxfcV9tdXRleCk7CiBzdGF0aWMgTElTVF9IRUFEKGFsbF9xX2xpc3QpOwogCi1zdGF0aWMgdm9pZCBfX2Jsa19tcV9ydW5faHdfcXVldWUoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgpOwotCiAvKgogICogQ2hlY2sgaWYgYW55IG9mIHRoZSBjdHgncyBoYXZlIHBlbmRpbmcgd29yayBpbiB0aGlzIGhhcmR3YXJlIHF1ZXVlCiAgKi8KIHN0YXRpYyBib29sIGJsa19tcV9oY3R4X2hhc19wZW5kaW5nKHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4KQogewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGhjdHgtPmN0eF9tYXAuc2l6ZTsgaSsrKQotCQlpZiAoaGN0eC0+Y3R4X21hcC5tYXBbaV0ud29yZCkKLQkJCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOworCXJldHVybiBzYml0bWFwX2FueV9iaXRfc2V0KCZoY3R4LT5jdHhfbWFwKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxrX2FsaWduX2JpdG1hcCAqZ2V0X2JtKHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LAotCQkJCQkgICAgICBzdHJ1Y3QgYmxrX21xX2N0eCAqY3R4KQotewotCXJldHVybiAmaGN0eC0+Y3R4X21hcC5tYXBbY3R4LT5pbmRleF9odyAvIGhjdHgtPmN0eF9tYXAuYml0c19wZXJfd29yZF07Ci19Ci0KLSNkZWZpbmUgQ1RYX1RPX0JJVChoY3R4LCBjdHgpCVwKLQkoKGN0eCktPmluZGV4X2h3ICYgKChoY3R4KS0+Y3R4X21hcC5iaXRzX3Blcl93b3JkIC0gMSkpCi0KIC8qCiAgKiBNYXJrIHRoaXMgY3R4IGFzIGhhdmluZyBwZW5kaW5nIHdvcmsgaW4gdGhpcyBoYXJkd2FyZSBxdWV1ZQogICovCiBzdGF0aWMgdm9pZCBibGtfbXFfaGN0eF9tYXJrX3BlbmRpbmcoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsCiAJCQkJICAgICBzdHJ1Y3QgYmxrX21xX2N0eCAqY3R4KQogewotCXN0cnVjdCBibGtfYWxpZ25fYml0bWFwICpibSA9IGdldF9ibShoY3R4LCBjdHgpOwotCi0JaWYgKCF0ZXN0X2JpdChDVFhfVE9fQklUKGhjdHgsIGN0eCksICZibS0+d29yZCkpCi0JCXNldF9iaXQoQ1RYX1RPX0JJVChoY3R4LCBjdHgpLCAmYm0tPndvcmQpOworCWlmICghc2JpdG1hcF90ZXN0X2JpdCgmaGN0eC0+Y3R4X21hcCwgY3R4LT5pbmRleF9odykpCisJCXNiaXRtYXBfc2V0X2JpdCgmaGN0eC0+Y3R4X21hcCwgY3R4LT5pbmRleF9odyk7CiB9CiAKIHN0YXRpYyB2b2lkIGJsa19tcV9oY3R4X2NsZWFyX3BlbmRpbmcoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsCiAJCQkJICAgICAgc3RydWN0IGJsa19tcV9jdHggKmN0eCkKIHsKLQlzdHJ1Y3QgYmxrX2FsaWduX2JpdG1hcCAqYm0gPSBnZXRfYm0oaGN0eCwgY3R4KTsKLQotCWNsZWFyX2JpdChDVFhfVE9fQklUKGhjdHgsIGN0eCksICZibS0+d29yZCk7CisJc2JpdG1hcF9jbGVhcl9iaXQoJmhjdHgtPmN0eF9tYXAsIGN0eC0+aW5kZXhfaHcpOwogfQogCiB2b2lkIGJsa19tcV9mcmVlemVfcXVldWVfc3RhcnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCkBAIC0yNDYsMTkgKzIyNiw5IEBACiAJY3R4ID0gYmxrX21xX2dldF9jdHgocSk7CiAJaGN0eCA9IHEtPm1xX29wcy0+bWFwX3F1ZXVlKHEsIGN0eC0+Y3B1KTsKIAlibGtfbXFfc2V0X2FsbG9jX2RhdGEoJmFsbG9jX2RhdGEsIHEsIGZsYWdzLCBjdHgsIGhjdHgpOwotCiAJcnEgPSBfX2Jsa19tcV9hbGxvY19yZXF1ZXN0KCZhbGxvY19kYXRhLCBydywgMCk7Ci0JaWYgKCFycSAmJiAhKGZsYWdzICYgQkxLX01RX1JFUV9OT1dBSVQpKSB7Ci0JCV9fYmxrX21xX3J1bl9od19xdWV1ZShoY3R4KTsKLQkJYmxrX21xX3B1dF9jdHgoY3R4KTsKLQotCQljdHggPSBibGtfbXFfZ2V0X2N0eChxKTsKLQkJaGN0eCA9IHEtPm1xX29wcy0+bWFwX3F1ZXVlKHEsIGN0eC0+Y3B1KTsKLQkJYmxrX21xX3NldF9hbGxvY19kYXRhKCZhbGxvY19kYXRhLCBxLCBmbGFncywgY3R4LCBoY3R4KTsKLQkJcnEgPSAgX19ibGtfbXFfYWxsb2NfcmVxdWVzdCgmYWxsb2NfZGF0YSwgcncsIDApOwotCQljdHggPSBhbGxvY19kYXRhLmN0eDsKLQl9CiAJYmxrX21xX3B1dF9jdHgoY3R4KTsKKwogCWlmICghcnEpIHsKIAkJYmxrX3F1ZXVlX2V4aXQocSk7CiAJCXJldHVybiBFUlJfUFRSKC1FV09VTERCTE9DSyk7CkBAIC0yOTYsMTcgKzI2NiwyOSBAQAogCWlmIChyZXQpCiAJCXJldHVybiBFUlJfUFRSKHJldCk7CiAKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBoYXJkd2FyZSBjb250ZXh0IGlzIGFjdHVhbGx5IG1hcHBlZCB0byBhbnl0aGluZy4KKwkgKiBJZiBub3QgdGVsbCB0aGUgY2FsbGVyIHRoYXQgaXQgc2hvdWxkIHNraXAgdGhpcyBxdWV1ZS4KKwkgKi8KIAloY3R4ID0gcS0+cXVldWVfaHdfY3R4W2hjdHhfaWR4XTsKKwlpZiAoIWJsa19tcV9od19xdWV1ZV9tYXBwZWQoaGN0eCkpIHsKKwkJcmV0ID0gLUVYREVWOworCQlnb3RvIG91dF9xdWV1ZV9leGl0OworCX0KIAljdHggPSBfX2Jsa19tcV9nZXRfY3R4KHEsIGNwdW1hc2tfZmlyc3QoaGN0eC0+Y3B1bWFzaykpOwogCiAJYmxrX21xX3NldF9hbGxvY19kYXRhKCZhbGxvY19kYXRhLCBxLCBmbGFncywgY3R4LCBoY3R4KTsKIAlycSA9IF9fYmxrX21xX2FsbG9jX3JlcXVlc3QoJmFsbG9jX2RhdGEsIHJ3LCAwKTsKIAlpZiAoIXJxKSB7Ci0JCWJsa19xdWV1ZV9leGl0KHEpOwotCQlyZXR1cm4gRVJSX1BUUigtRVdPVUxEQkxPQ0spOworCQlyZXQgPSAtRVdPVUxEQkxPQ0s7CisJCWdvdG8gb3V0X3F1ZXVlX2V4aXQ7CiAJfQogCiAJcmV0dXJuIHJxOworCitvdXRfcXVldWVfZXhpdDoKKwlibGtfcXVldWVfZXhpdChxKTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYmxrX21xX2FsbG9jX3JlcXVlc3RfaGN0eCk7CiAKQEAgLTMyMSw3ICszMDMsNyBAQAogCXJxLT5jbWRfZmxhZ3MgPSAwOwogCiAJY2xlYXJfYml0KFJFUV9BVE9NX1NUQVJURUQsICZycS0+YXRvbWljX2ZsYWdzKTsKLQlibGtfbXFfcHV0X3RhZyhoY3R4LCB0YWcsICZjdHgtPmxhc3RfdGFnKTsKKwlibGtfbXFfcHV0X3RhZyhoY3R4LCBjdHgsIHRhZyk7CiAJYmxrX3F1ZXVlX2V4aXQocSk7CiB9CiAKQEAgLTUwMSw3ICs0ODMsNyBAQAogc3RhdGljIHZvaWQgYmxrX21xX3JlcXVldWVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJlcXVlc3RfcXVldWUsIHJlcXVldWVfd29yayk7CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSwgcmVxdWV1ZV93b3JrLndvcmspOwogCUxJU1RfSEVBRChycV9saXN0KTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEsICpuZXh0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC01NTYsMTYgKzUzOCwyNCBAQAogCiB2b2lkIGJsa19tcV9jYW5jZWxfcmVxdWV1ZV93b3JrKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewotCWNhbmNlbF93b3JrX3N5bmMoJnEtPnJlcXVldWVfd29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZxLT5yZXF1ZXVlX3dvcmspOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYmxrX21xX2NhbmNlbF9yZXF1ZXVlX3dvcmspOwogCiB2b2lkIGJsa19tcV9raWNrX3JlcXVldWVfbGlzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKLQlrYmxvY2tkX3NjaGVkdWxlX3dvcmsoJnEtPnJlcXVldWVfd29yayk7CisJa2Jsb2NrZF9zY2hlZHVsZV9kZWxheWVkX3dvcmsoJnEtPnJlcXVldWVfd29yaywgMCk7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19tcV9raWNrX3JlcXVldWVfbGlzdCk7CiAKK3ZvaWQgYmxrX21xX2RlbGF5X2tpY2tfcmVxdWV1ZV9saXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIG1zZWNzKQoreworCWtibG9ja2Rfc2NoZWR1bGVfZGVsYXllZF93b3JrKCZxLT5yZXF1ZXVlX3dvcmssCisJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhtc2VjcykpOworfQorRVhQT1JUX1NZTUJPTChibGtfbXFfZGVsYXlfa2lja19yZXF1ZXVlX2xpc3QpOworCiB2b2lkIGJsa19tcV9hYm9ydF9yZXF1ZXVlX2xpc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTU4OCw4ICs1NzgsMTAgQEAKIAogc3RydWN0IHJlcXVlc3QgKmJsa19tcV90YWdfdG9fcnEoc3RydWN0IGJsa19tcV90YWdzICp0YWdzLCB1bnNpZ25lZCBpbnQgdGFnKQogewotCWlmICh0YWcgPCB0YWdzLT5ucl90YWdzKQorCWlmICh0YWcgPCB0YWdzLT5ucl90YWdzKSB7CisJCXByZWZldGNoKHRhZ3MtPnJxc1t0YWddKTsKIAkJcmV0dXJuIHRhZ3MtPnJxc1t0YWddOworCX0KIAogCXJldHVybiBOVUxMOwogfQpAQCAtNzQ0LDM4ICs3MzYsNDQgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKK3N0cnVjdCBmbHVzaF9idXN5X2N0eF9kYXRhIHsKKwlzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworfTsKKworc3RhdGljIGJvb2wgZmx1c2hfYnVzeV9jdHgoc3RydWN0IHNiaXRtYXAgKnNiLCB1bnNpZ25lZCBpbnQgYml0bnIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZsdXNoX2J1c3lfY3R4X2RhdGEgKmZsdXNoX2RhdGEgPSBkYXRhOworCXN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4ID0gZmx1c2hfZGF0YS0+aGN0eDsKKwlzdHJ1Y3QgYmxrX21xX2N0eCAqY3R4ID0gaGN0eC0+Y3R4c1tiaXRucl07CisKKwlzYml0bWFwX2NsZWFyX2JpdChzYiwgYml0bnIpOworCXNwaW5fbG9jaygmY3R4LT5sb2NrKTsKKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJmN0eC0+cnFfbGlzdCwgZmx1c2hfZGF0YS0+bGlzdCk7CisJc3Bpbl91bmxvY2soJmN0eC0+bG9jayk7CisJcmV0dXJuIHRydWU7Cit9CisKIC8qCiAgKiBQcm9jZXNzIHNvZnR3YXJlIHF1ZXVlcyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgYnVzeSwgc3BsaWNpbmcgdGhlbQogICogdG8gdGhlIGZvci1kaXNwYXRjaAogICovCiBzdGF0aWMgdm9pZCBmbHVzaF9idXN5X2N0eHMoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7Ci0Jc3RydWN0IGJsa19tcV9jdHggKmN0eDsKLQlpbnQgaTsKKwlzdHJ1Y3QgZmx1c2hfYnVzeV9jdHhfZGF0YSBkYXRhID0geworCQkuaGN0eCA9IGhjdHgsCisJCS5saXN0ID0gbGlzdCwKKwl9OwogCi0JZm9yIChpID0gMDsgaSA8IGhjdHgtPmN0eF9tYXAuc2l6ZTsgaSsrKSB7Ci0JCXN0cnVjdCBibGtfYWxpZ25fYml0bWFwICpibSA9ICZoY3R4LT5jdHhfbWFwLm1hcFtpXTsKLQkJdW5zaWduZWQgaW50IG9mZiwgYml0OworCXNiaXRtYXBfZm9yX2VhY2hfc2V0KCZoY3R4LT5jdHhfbWFwLCBmbHVzaF9idXN5X2N0eCwgJmRhdGEpOworfQogCi0JCWlmICghYm0tPndvcmQpCi0JCQljb250aW51ZTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHF1ZXVlZF90b19pbmRleCh1bnNpZ25lZCBpbnQgcXVldWVkKQoreworCWlmICghcXVldWVkKQorCQlyZXR1cm4gMDsKIAotCQliaXQgPSAwOwotCQlvZmYgPSBpICogaGN0eC0+Y3R4X21hcC5iaXRzX3Blcl93b3JkOwotCQlkbyB7Ci0JCQliaXQgPSBmaW5kX25leHRfYml0KCZibS0+d29yZCwgYm0tPmRlcHRoLCBiaXQpOwotCQkJaWYgKGJpdCA+PSBibS0+ZGVwdGgpCi0JCQkJYnJlYWs7Ci0KLQkJCWN0eCA9IGhjdHgtPmN0eHNbYml0ICsgb2ZmXTsKLQkJCWNsZWFyX2JpdChiaXQsICZibS0+d29yZCk7Ci0JCQlzcGluX2xvY2soJmN0eC0+bG9jayk7Ci0JCQlsaXN0X3NwbGljZV90YWlsX2luaXQoJmN0eC0+cnFfbGlzdCwgbGlzdCk7Ci0JCQlzcGluX3VubG9jaygmY3R4LT5sb2NrKTsKLQotCQkJYml0Kys7Ci0JCX0gd2hpbGUgKDEpOwotCX0KKwlyZXR1cm4gbWluKEJMS19NUV9NQVhfRElTUEFUQ0hfT1JERVIgLSAxLCBpbG9nMihxdWV1ZWQpICsgMSk7CiB9CiAKIC8qCkBAIC04NjYsMTAgKzg2NCw3IEBACiAJCQlkcHRyID0gJmRyaXZlcl9saXN0OwogCX0KIAotCWlmICghcXVldWVkKQotCQloY3R4LT5kaXNwYXRjaGVkWzBdKys7Ci0JZWxzZSBpZiAocXVldWVkIDwgKDEgPDwgKEJMS19NUV9NQVhfRElTUEFUQ0hfT1JERVIgLSAxKSkpCi0JCWhjdHgtPmRpc3BhdGNoZWRbaWxvZzIocXVldWVkKSArIDFdKys7CisJaGN0eC0+ZGlzcGF0Y2hlZFtxdWV1ZWRfdG9faW5kZXgocXVldWVkKV0rKzsKIAogCS8qCiAJICogQW55IGl0ZW1zIHRoYXQgbmVlZCByZXF1ZXVpbmc/IFN0dWZmIHRoZW0gaW50byBoY3R4LT5kaXNwYXRjaCwKQEAgLTkyNSw3ICs5MjAsNyBAQAogCSAgICAhYmxrX21xX2h3X3F1ZXVlX21hcHBlZChoY3R4KSkpCiAJCXJldHVybjsKIAotCWlmICghYXN5bmMpIHsKKwlpZiAoIWFzeW5jICYmICEoaGN0eC0+ZmxhZ3MgJiBCTEtfTVFfRl9CTE9DS0lORykpIHsKIAkJaW50IGNwdSA9IGdldF9jcHUoKTsKIAkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBoY3R4LT5jcHVtYXNrKSkgewogCQkJX19ibGtfbXFfcnVuX2h3X3F1ZXVlKGhjdHgpOwpAQCAtOTM2LDggKzkzMSw3IEBACiAJCXB1dF9jcHUoKTsKIAl9CiAKLQlrYmxvY2tkX3NjaGVkdWxlX2RlbGF5ZWRfd29ya19vbihibGtfbXFfaGN0eF9uZXh0X2NwdShoY3R4KSwKLQkJCSZoY3R4LT5ydW5fd29yaywgMCk7CisJa2Jsb2NrZF9zY2hlZHVsZV93b3JrX29uKGJsa19tcV9oY3R4X25leHRfY3B1KGhjdHgpLCAmaGN0eC0+cnVuX3dvcmspOwogfQogCiB2b2lkIGJsa19tcV9ydW5faHdfcXVldWVzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBib29sIGFzeW5jKQpAQCAtOTU4LDcgKzk1Miw3IEBACiAKIHZvaWQgYmxrX21xX3N0b3BfaHdfcXVldWUoc3RydWN0IGJsa19tcV9od19jdHggKmhjdHgpCiB7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmaGN0eC0+cnVuX3dvcmspOworCWNhbmNlbF93b3JrKCZoY3R4LT5ydW5fd29yayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmaGN0eC0+ZGVsYXlfd29yayk7CiAJc2V0X2JpdChCTEtfTVFfU19TVE9QUEVELCAmaGN0eC0+c3RhdGUpOwogfQpAQCAtMTAxMSw3ICsxMDA1LDcgQEAKIHsKIAlzdHJ1Y3QgYmxrX21xX2h3X2N0eCAqaGN0eDsKIAotCWhjdHggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJsa19tcV9od19jdHgsIHJ1bl93b3JrLndvcmspOworCWhjdHggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJsa19tcV9od19jdHgsIHJ1bl93b3JrKTsKIAogCV9fYmxrX21xX3J1bl9od19xdWV1ZShoY3R4KTsKIH0KQEAgLTEyMjgsMjAgKzEyMjIsOCBAQAogCQlvcF9mbGFncyB8PSBSRVFfU1lOQzsKIAogCXRyYWNlX2Jsb2NrX2dldHJxKHEsIGJpbywgb3ApOwotCWJsa19tcV9zZXRfYWxsb2NfZGF0YSgmYWxsb2NfZGF0YSwgcSwgQkxLX01RX1JFUV9OT1dBSVQsIGN0eCwgaGN0eCk7CisJYmxrX21xX3NldF9hbGxvY19kYXRhKCZhbGxvY19kYXRhLCBxLCAwLCBjdHgsIGhjdHgpOwogCXJxID0gX19ibGtfbXFfYWxsb2NfcmVxdWVzdCgmYWxsb2NfZGF0YSwgb3AsIG9wX2ZsYWdzKTsKLQlpZiAodW5saWtlbHkoIXJxKSkgewotCQlfX2Jsa19tcV9ydW5faHdfcXVldWUoaGN0eCk7Ci0JCWJsa19tcV9wdXRfY3R4KGN0eCk7Ci0JCXRyYWNlX2Jsb2NrX3NsZWVwcnEocSwgYmlvLCBvcCk7Ci0KLQkJY3R4ID0gYmxrX21xX2dldF9jdHgocSk7Ci0JCWhjdHggPSBxLT5tcV9vcHMtPm1hcF9xdWV1ZShxLCBjdHgtPmNwdSk7Ci0JCWJsa19tcV9zZXRfYWxsb2NfZGF0YSgmYWxsb2NfZGF0YSwgcSwgMCwgY3R4LCBoY3R4KTsKLQkJcnEgPSBfX2Jsa19tcV9hbGxvY19yZXF1ZXN0KCZhbGxvY19kYXRhLCBvcCwgb3BfZmxhZ3MpOwotCQljdHggPSBhbGxvY19kYXRhLmN0eDsKLQkJaGN0eCA9IGFsbG9jX2RhdGEuaGN0eDsKLQl9CiAKIAloY3R4LT5xdWV1ZWQrKzsKIAlkYXRhLT5oY3R4ID0gaGN0eDsKQEAgLTE1OTQsMzIgKzE1NzYsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBibGtfbXFfZnJlZV9iaXRtYXAoc3RydWN0IGJsa19tcV9jdHhtYXAgKmJpdG1hcCkKLXsKLQlrZnJlZShiaXRtYXAtPm1hcCk7Ci19Ci0KLXN0YXRpYyBpbnQgYmxrX21xX2FsbG9jX2JpdG1hcChzdHJ1Y3QgYmxrX21xX2N0eG1hcCAqYml0bWFwLCBpbnQgbm9kZSkKLXsKLQl1bnNpZ25lZCBpbnQgYnB3ID0gOCwgdG90YWwsIG51bV9tYXBzLCBpOwotCi0JYml0bWFwLT5iaXRzX3Blcl93b3JkID0gYnB3OwotCi0JbnVtX21hcHMgPSBBTElHTihucl9jcHVfaWRzLCBicHcpIC8gYnB3OwotCWJpdG1hcC0+bWFwID0ga3phbGxvY19ub2RlKG51bV9tYXBzICogc2l6ZW9mKHN0cnVjdCBibGtfYWxpZ25fYml0bWFwKSwKLQkJCQkJR0ZQX0tFUk5FTCwgbm9kZSk7Ci0JaWYgKCFiaXRtYXAtPm1hcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl0b3RhbCA9IG5yX2NwdV9pZHM7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9tYXBzOyBpKyspIHsKLQkJYml0bWFwLT5tYXBbaV0uZGVwdGggPSBtaW4odG90YWwsIGJpdG1hcC0+Yml0c19wZXJfd29yZCk7Ci0JCXRvdGFsIC09IGJpdG1hcC0+bWFwW2ldLmRlcHRoOwotCX0KLQotCXJldHVybiAwOwotfQotCiAvKgogICogJ2NwdScgaXMgZ29pbmcgYXdheS4gc3BsaWNlIGFueSBleGlzdGluZyBycV9saXN0IGVudHJpZXMgZnJvbSB0aGlzCiAgKiBzb2Z0d2FyZSBxdWV1ZSB0byB0aGUgaHcgcXVldWUgZGlzcGF0Y2ggbGlzdCwgYW5kIGVuc3VyZSB0aGF0IGl0CkBAIC0xNjg1LDcgKzE2NDEsNyBAQAogCiAJYmxrX21xX3VucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZoY3R4LT5jcHVfbm90aWZpZXIpOwogCWJsa19mcmVlX2ZsdXNoX3F1ZXVlKGhjdHgtPmZxKTsKLQlibGtfbXFfZnJlZV9iaXRtYXAoJmhjdHgtPmN0eF9tYXApOworCXNiaXRtYXBfZnJlZSgmaGN0eC0+Y3R4X21hcCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJsa19tcV9leGl0X2h3X3F1ZXVlcyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKQEAgLTE3MjIsNyArMTY3OCw3IEBACiAJaWYgKG5vZGUgPT0gTlVNQV9OT19OT0RFKQogCQlub2RlID0gaGN0eC0+bnVtYV9ub2RlID0gc2V0LT5udW1hX25vZGU7CiAKLQlJTklUX0RFTEFZRURfV09SSygmaGN0eC0+cnVuX3dvcmssIGJsa19tcV9ydW5fd29ya19mbik7CisJSU5JVF9XT1JLKCZoY3R4LT5ydW5fd29yaywgYmxrX21xX3J1bl93b3JrX2ZuKTsKIAlJTklUX0RFTEFZRURfV09SSygmaGN0eC0+ZGVsYXlfd29yaywgYmxrX21xX2RlbGF5X3dvcmtfZm4pOwogCXNwaW5fbG9ja19pbml0KCZoY3R4LT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmaGN0eC0+ZGlzcGF0Y2gpOwpAQCAtMTc0NSw3ICsxNzAxLDggQEAKIAlpZiAoIWhjdHgtPmN0eHMpCiAJCWdvdG8gdW5yZWdpc3Rlcl9jcHVfbm90aWZpZXI7CiAKLQlpZiAoYmxrX21xX2FsbG9jX2JpdG1hcCgmaGN0eC0+Y3R4X21hcCwgbm9kZSkpCisJaWYgKHNiaXRtYXBfaW5pdF9ub2RlKCZoY3R4LT5jdHhfbWFwLCBucl9jcHVfaWRzLCBpbG9nMig4KSwgR0ZQX0tFUk5FTCwKKwkJCSAgICAgIG5vZGUpKQogCQlnb3RvIGZyZWVfY3R4czsKIAogCWhjdHgtPm5yX2N0eCA9IDA7CkBAIC0xNzcyLDcgKzE3MjksNyBAQAogCWlmIChzZXQtPm9wcy0+ZXhpdF9oY3R4KQogCQlzZXQtPm9wcy0+ZXhpdF9oY3R4KGhjdHgsIGhjdHhfaWR4KTsKICBmcmVlX2JpdG1hcDoKLQlibGtfbXFfZnJlZV9iaXRtYXAoJmhjdHgtPmN0eF9tYXApOworCXNiaXRtYXBfZnJlZSgmaGN0eC0+Y3R4X21hcCk7CiAgZnJlZV9jdHhzOgogCWtmcmVlKGhjdHgtPmN0eHMpOwogIHVucmVnaXN0ZXJfY3B1X25vdGlmaWVyOgpAQCAtMTg0OCw4ICsxODA1LDYgQEAKIAltdXRleF91bmxvY2soJnEtPnN5c2ZzX2xvY2spOwogCiAJcXVldWVfZm9yX2VhY2hfaHdfY3R4KHEsIGhjdHgsIGkpIHsKLQkJc3RydWN0IGJsa19tcV9jdHhtYXAgKm1hcCA9ICZoY3R4LT5jdHhfbWFwOwotCiAJCS8qCiAJCSAqIElmIG5vIHNvZnR3YXJlIHF1ZXVlcyBhcmUgbWFwcGVkIHRvIHRoaXMgaGFyZHdhcmUgcXVldWUsCiAJCSAqIGRpc2FibGUgaXQgYW5kIGZyZWUgdGhlIHJlcXVlc3QgZW50cmllcy4KQEAgLTE4NzUsNyArMTgzMCw3IEBACiAJCSAqIFRoaXMgaXMgbW9yZSBhY2N1cmF0ZSBhbmQgbW9yZSBlZmZpY2llbnQgdGhhbiBsb29waW5nCiAJCSAqIG92ZXIgYWxsIHBvc3NpYmx5IG1hcHBlZCBzb2Z0d2FyZSBxdWV1ZXMuCiAJCSAqLwotCQltYXAtPnNpemUgPSBESVZfUk9VTkRfVVAoaGN0eC0+bnJfY3R4LCBtYXAtPmJpdHNfcGVyX3dvcmQpOworCQlzYml0bWFwX3Jlc2l6ZSgmaGN0eC0+Y3R4X21hcCwgaGN0eC0+bnJfY3R4KTsKIAogCQkvKgogCQkgKiBJbml0aWFsaXplIGJhdGNoIHJvdW5kcm9iaW4gY291bnRzCkBAIC0yMDgyLDcgKzIwMzcsNyBAQAogCiAJcS0+c2dfcmVzZXJ2ZWRfc2l6ZSA9IElOVF9NQVg7CiAKLQlJTklUX1dPUksoJnEtPnJlcXVldWVfd29yaywgYmxrX21xX3JlcXVldWVfd29yayk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnEtPnJlcXVldWVfd29yaywgYmxrX21xX3JlcXVldWVfd29yayk7CiAJSU5JVF9MSVNUX0hFQUQoJnEtPnJlcXVldWVfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJnEtPnJlcXVldWVfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS5oIGIvYmxvY2svYmxrLW1xLmgKaW5kZXggOTA4N2IxMS4uOWIxNWQyZSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLmgKKysrIGIvYmxvY2svYmxrLW1xLmgKQEAgLTEyLDggKzEyLDYgQEAKIAl1bnNpZ25lZCBpbnQJCWNwdTsKIAl1bnNpZ25lZCBpbnQJCWluZGV4X2h3OwogCi0JdW5zaWduZWQgaW50CQlsYXN0X3RhZyBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwotCiAJLyogaW5jcmVtZW50ZWQgYXQgZGlzcGF0Y2ggdGltZSAqLwogCXVuc2lnbmVkIGxvbmcJCXJxX2Rpc3BhdGNoZWRbMl07CiAJdW5zaWduZWQgbG9uZwkJcnFfbWVyZ2VkOwpAQCAtNjMsMTUgKzYxLDYgQEAKIAogdm9pZCBibGtfbXFfcmVsZWFzZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiAKLS8qCi0gKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBzcGFyc2VyIGJpdG1hcCwgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3ByZWFkCi0gKiB0aGUgYml0cyBvdmVyIG1vcmUgY2FjaGVsaW5lcy4KLSAqLwotc3RydWN0IGJsa19hbGlnbl9iaXRtYXAgewotCXVuc2lnbmVkIGxvbmcgd29yZDsKLQl1bnNpZ25lZCBsb25nIGRlcHRoOwotfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBibGtfbXFfY3R4ICpfX2Jsa19tcV9nZXRfY3R4KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCQkJCQkgICB1bnNpZ25lZCBpbnQgY3B1KQogewpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXNvZnRpcnEuYyBiL2Jsb2NrL2Jsay1zb2Z0aXJxLmMKaW5kZXggNTNiMTczNy4uOTY2MzFlNiAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLXNvZnRpcnEuYworKysgYi9ibG9jay9ibGstc29mdGlycS5jCkBAIC03OCwzMCArNzgsMjEgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IGJsa19jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCi0JCQkgIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IGJsa19zb2Z0aXJxX2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpCiB7CiAJLyoKIAkgKiBJZiBhIENQVSBnb2VzIGF3YXksIHNwbGljZSBpdHMgZW50cmllcyB0byB0aGUgY3VycmVudCBDUFUKIAkgKiBhbmQgdHJpZ2dlciBhIHJ1biBvZiB0aGUgc29mdGlycQogCSAqLwotCWlmIChhY3Rpb24gPT0gQ1BVX0RFQUQgfHwgYWN0aW9uID09IENQVV9ERUFEX0ZST1pFTikgewotCQlpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpIGhjcHU7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlsaXN0X3NwbGljZV9pbml0KCZwZXJfY3B1KGJsa19jcHVfZG9uZSwgY3B1KSwKKwkJCSB0aGlzX2NwdV9wdHIoJmJsa19jcHVfZG9uZSkpOworCXJhaXNlX3NvZnRpcnFfaXJxb2ZmKEJMT0NLX1NPRlRJUlEpOworCWxvY2FsX2lycV9lbmFibGUoKTsKIAotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQlsaXN0X3NwbGljZV9pbml0KCZwZXJfY3B1KGJsa19jcHVfZG9uZSwgY3B1KSwKLQkJCQkgdGhpc19jcHVfcHRyKCZibGtfY3B1X2RvbmUpKTsKLQkJcmFpc2Vfc29mdGlycV9pcnFvZmYoQkxPQ0tfU09GVElSUSk7Ci0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQl9Ci0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGJsa19jcHVfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwJPSBibGtfY3B1X25vdGlmeSwKLX07Ci0KIHZvaWQgX19ibGtfY29tcGxldGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogewogCWludCBjY3B1LCBjcHU7CkBAIC0xODAsNyArMTcxLDkgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJnBlcl9jcHUoYmxrX2NwdV9kb25lLCBpKSk7CiAKIAlvcGVuX3NvZnRpcnEoQkxPQ0tfU09GVElSUSwgYmxrX2RvbmVfc29mdGlycSk7Ci0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZibGtfY3B1X25vdGlmaWVyKTsKKwljcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0JMT0NLX1NPRlRJUlFfREVBRCwKKwkJCQkgICJibG9jay9zb2Z0aXJxOmRlYWQiLCBOVUxMLAorCQkJCSAgYmxrX3NvZnRpcnFfY3B1X2RlYWQpOwogCXJldHVybiAwOwogfQogc3Vic3lzX2luaXRjYWxsKGJsa19zb2Z0aXJxX2luaXQpOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXN5c2ZzLmMgYi9ibG9jay9ibGstc3lzZnMuYwppbmRleCBmODdhN2U3Li45Y2M4ZDdjIDEwMDY0NAotLS0gYS9ibG9jay9ibGstc3lzZnMuYworKysgYi9ibG9jay9ibGstc3lzZnMuYwpAQCAtNzA0LDcgKzcwNCw3IEBACiAJa29iamVjdF91ZXZlbnQoJnEtPmtvYmosIEtPQkpfQUREKTsKIAogCWlmIChxLT5tcV9vcHMpCi0JCWJsa19tcV9yZWdpc3Rlcl9kaXNrKGRpc2spOworCQlibGtfbXFfcmVnaXN0ZXJfZGV2KGRldiwgcSk7CiAKIAlpZiAoIXEtPnJlcXVlc3RfZm4pCiAJCXJldHVybiAwOwpAQCAtNzI5LDcgKzcyOSw3IEBACiAJCXJldHVybjsKIAogCWlmIChxLT5tcV9vcHMpCi0JCWJsa19tcV91bnJlZ2lzdGVyX2Rpc2soZGlzayk7CisJCWJsa19tcV91bnJlZ2lzdGVyX2RldihkaXNrX3RvX2RldihkaXNrKSwgcSk7CiAKIAlpZiAocS0+cmVxdWVzdF9mbikKIAkJZWx2X3VucmVnaXN0ZXJfcXVldWUocSk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstdGhyb3R0bGUuYyBiL2Jsb2NrL2Jsay10aHJvdHRsZS5jCmluZGV4IGYxYWJhMjYuLmEzZWE4MjYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay10aHJvdHRsZS5jCisrKyBiL2Jsb2NrL2Jsay10aHJvdHRsZS5jCkBAIC03ODAsOSArNzgwLDExIEBACiAJLyoKIAkgKiBJZiBwcmV2aW91cyBzbGljZSBleHBpcmVkLCBzdGFydCBhIG5ldyBvbmUgb3RoZXJ3aXNlIHJlbmV3L2V4dGVuZAogCSAqIGV4aXN0aW5nIHNsaWNlIHRvIG1ha2Ugc3VyZSBpdCBpcyBhdCBsZWFzdCB0aHJvdGxfc2xpY2UgaW50ZXJ2YWwKLQkgKiBsb25nIHNpbmNlIG5vdy4KKwkgKiBsb25nIHNpbmNlIG5vdy4gTmV3IHNsaWNlIGlzIHN0YXJ0ZWQgb25seSBmb3IgZW1wdHkgdGhyb3R0bGUgZ3JvdXAuCisJICogSWYgdGhlcmUgaXMgcXVldWVkIGJpbywgdGhhdCBtZWFucyB0aGVyZSBzaG91bGQgYmUgYW4gYWN0aXZlCisJICogc2xpY2UgYW5kIGl0IHNob3VsZCBiZSBleHRlbmRlZCBpbnN0ZWFkLgogCSAqLwotCWlmICh0aHJvdGxfc2xpY2VfdXNlZCh0ZywgcncpKQorCWlmICh0aHJvdGxfc2xpY2VfdXNlZCh0ZywgcncpICYmICEodGctPnNlcnZpY2VfcXVldWUubnJfcXVldWVkW3J3XSkpCiAJCXRocm90bF9zdGFydF9uZXdfc2xpY2UodGcsIHJ3KTsKIAllbHNlIHsKIAkJaWYgKHRpbWVfYmVmb3JlKHRnLT5zbGljZV9lbmRbcnddLCBqaWZmaWVzICsgdGhyb3RsX3NsaWNlKSkKZGlmZiAtLWdpdCBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMgYi9ibG9jay9jZnEtaW9zY2hlZC5jCmluZGV4IGNjMmY2ZGIuLjVlMjRkODggMTAwNjQ0Ci0tLSBhL2Jsb2NrL2NmcS1pb3NjaGVkLmMKKysrIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwpAQCAtMzA0Miw3ICszMDQyLDYgQEAKIAlpZiAoa3RpbWVfZ2V0X25zKCkgPCBycS0+Zmlmb190aW1lKQogCQlycSA9IE5VTEw7CiAKLQljZnFfbG9nX2NmcXEoY2ZxcS0+Y2ZxZCwgY2ZxcSwgImZpZm89JXAiLCBycSk7CiAJcmV0dXJuIHJxOwogfQogCkBAIC0zNDIwLDYgKzM0MTksOSBAQAogewogCXVuc2lnbmVkIGludCBtYXhfZGlzcGF0Y2g7CiAKKwlpZiAoY2ZxX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKSkKKwkJcmV0dXJuIHRydWU7CisKIAkvKgogCSAqIERyYWluIGFzeW5jIHJlcXVlc3RzIGJlZm9yZSB3ZSBzdGFydCBzeW5jIElPCiAJICovCkBAIC0zNTExLDE1ICszNTEzLDIwIEBACiAKIAlCVUdfT04oUkJfRU1QVFlfUk9PVCgmY2ZxcS0+c29ydF9saXN0KSk7CiAKKwlycSA9IGNmcV9jaGVja19maWZvKGNmcXEpOworCWlmIChycSkKKwkJY2ZxX21hcmtfY2ZxcV9tdXN0X2Rpc3BhdGNoKGNmcXEpOworCiAJaWYgKCFjZnFfbWF5X2Rpc3BhdGNoKGNmcWQsIGNmcXEpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAkvKgogCSAqIGZvbGxvdyBleHBpcmVkIHBhdGgsIGVsc2UgZ2V0IGZpcnN0IG5leHQgYXZhaWxhYmxlCiAJICovCi0JcnEgPSBjZnFfY2hlY2tfZmlmbyhjZnFxKTsKIAlpZiAoIXJxKQogCQlycSA9IGNmcXEtPm5leHRfcnE7CisJZWxzZQorCQljZnFfbG9nX2NmcXEoY2ZxcS0+Y2ZxZCwgY2ZxcSwgImZpZm89JXAiLCBycSk7CiAKIAkvKgogCSAqIGluc2VydCByZXF1ZXN0IGludG8gZHJpdmVyIGRpc3BhdGNoIGxpc3QKQEAgLTM5ODksNyArMzk5Niw3IEBACiAJICogaWYgdGhlIG5ldyByZXF1ZXN0IGlzIHN5bmMsIGJ1dCB0aGUgY3VycmVudGx5IHJ1bm5pbmcgcXVldWUgaXMKIAkgKiBub3QsIGxldCB0aGUgc3luYyByZXF1ZXN0IGhhdmUgcHJpb3JpdHkuCiAJICovCi0JaWYgKHJxX2lzX3N5bmMocnEpICYmICFjZnFfY2ZxcV9zeW5jKGNmcXEpKQorCWlmIChycV9pc19zeW5jKHJxKSAmJiAhY2ZxX2NmcXFfc3luYyhjZnFxKSAmJiAhY2ZxX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKSkKIAkJcmV0dXJuIHRydWU7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FzeW5jX3R4L2FzeW5jX3BxLmMgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfcHEuYwppbmRleCAwOGIzYWM2Li5mODNkZTk5IDEwMDY0NAotLS0gYS9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfcHEuYworKysgYi9jcnlwdG8vYXN5bmNfdHgvYXN5bmNfcHEuYwpAQCAtMzY4LDggKzM2OCw2IEBACiAKIAkJZG1hX3NldF91bm1hcCh0eCwgdW5tYXApOwogCQlhc3luY190eF9zdWJtaXQoY2hhbiwgdHgsIHN1Ym1pdCk7Ci0KLQkJcmV0dXJuIHR4OwogCX0gZWxzZSB7CiAJCXN0cnVjdCBwYWdlICpwX3NyYyA9IFAoYmxvY2tzLCBkaXNrcyk7CiAJCXN0cnVjdCBwYWdlICpxX3NyYyA9IFEoYmxvY2tzLCBkaXNrcyk7CkBAIC00MjQsOSArNDIyLDExIEBACiAJCXN1Ym1pdC0+Y2JfcGFyYW0gPSBjYl9wYXJhbV9vcmlnOwogCQlzdWJtaXQtPmZsYWdzID0gZmxhZ3Nfb3JpZzsKIAkJYXN5bmNfdHhfc3luY19lcGlsb2coc3VibWl0KTsKLQotCQlyZXR1cm4gTlVMTDsKKwkJdHggPSBOVUxMOwogCX0KKwlkbWFlbmdpbmVfdW5tYXBfcHV0KHVubWFwKTsKKworCXJldHVybiB0eDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFzeW5jX3N5bmRyb21lX3ZhbCk7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9ibGtjaXBoZXIuYyBiL2NyeXB0by9ibGtjaXBoZXIuYwppbmRleCAzNjk5OTk1Li5hODMyNDI2IDEwMDY0NAotLS0gYS9jcnlwdG8vYmxrY2lwaGVyLmMKKysrIGIvY3J5cHRvL2Jsa2NpcGhlci5jCkBAIC0yMzMsNiArMjMzLDggQEAKIAkJcmV0dXJuIGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgd2FsaywgLUVJTlZBTCk7CiAJfQogCisJYnNpemUgPSBtaW4od2Fsay0+d2Fsa19ibG9ja3NpemUsIG4pOworCiAJd2Fsay0+ZmxhZ3MgJj0gfihCTEtDSVBIRVJfV0FMS19TTE9XIHwgQkxLQ0lQSEVSX1dBTEtfQ09QWSB8CiAJCQkgQkxLQ0lQSEVSX1dBTEtfRElGRik7CiAJaWYgKCFzY2F0dGVyd2Fsa19hbGlnbmVkKCZ3YWxrLT5pbiwgd2Fsay0+YWxpZ25tYXNrKSB8fApAQCAtMjQ1LDcgKzI0Nyw2IEBACiAJCX0KIAl9CiAKLQlic2l6ZSA9IG1pbih3YWxrLT53YWxrX2Jsb2Nrc2l6ZSwgbik7CiAJbiA9IHNjYXR0ZXJ3YWxrX2NsYW1wKCZ3YWxrLT5pbiwgbik7CiAJbiA9IHNjYXR0ZXJ3YWxrX2NsYW1wKCZ3YWxrLT5vdXQsIG4pOwogCmRpZmYgLS1naXQgYS9jcnlwdG8vY3J5cHRkLmMgYi9jcnlwdG8vY3J5cHRkLmMKaW5kZXggY2Y4MDM3YS4uMGM2NTRlNSAxMDA2NDQKLS0tIGEvY3J5cHRvL2NyeXB0ZC5jCisrKyBiL2NyeXB0by9jcnlwdGQuYwpAQCAtNjMxLDkgKzYzMSwxNCBAQAogCiBzdGF0aWMgaW50IGNyeXB0ZF9oYXNoX2ltcG9ydChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxLCBjb25zdCB2b2lkICppbikKIHsKLQlzdHJ1Y3QgY3J5cHRkX2hhc2hfcmVxdWVzdF9jdHggKnJjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCXN0cnVjdCBjcnlwdG9fYWhhc2ggKnRmbSA9IGNyeXB0b19haGFzaF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgY3J5cHRkX2hhc2hfY3R4ICpjdHggPSBjcnlwdG9fYWhhc2hfY3R4KHRmbSk7CisJc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MgPSBjcnlwdGRfc2hhc2hfZGVzYyhyZXEpOwogCi0JcmV0dXJuIGNyeXB0b19zaGFzaF9pbXBvcnQoJnJjdHgtPmRlc2MsIGluKTsKKwlkZXNjLT50Zm0gPSBjdHgtPmNoaWxkOworCWRlc2MtPmZsYWdzID0gcmVxLT5iYXNlLmZsYWdzOworCisJcmV0dXJuIGNyeXB0b19zaGFzaF9pbXBvcnQoZGVzYywgaW4pOwogfQogCiBzdGF0aWMgaW50IGNyeXB0ZF9jcmVhdGVfaGFzaChzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsLCBzdHJ1Y3QgcnRhdHRyICoqdGIsCkBAIC03MzMsMTMgKzczOCwxNCBAQAogCXJjdHggPSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7CiAJY29tcGwgPSByY3R4LT5jb21wbGV0ZTsKIAorCXRmbSA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOworCiAJaWYgKHVubGlrZWx5KGVyciA9PSAtRUlOUFJPR1JFU1MpKQogCQlnb3RvIG91dDsKIAlhZWFkX3JlcXVlc3Rfc2V0X3RmbShyZXEsIGNoaWxkKTsKIAllcnIgPSBjcnlwdCggcmVxICk7CiAKIG91dDoKLQl0Zm0gPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKIAljdHggPSBjcnlwdG9fYWVhZF9jdHgodGZtKTsKIAlyZWZjbnQgPSBhdG9taWNfcmVhZCgmY3R4LT5yZWZjbnQpOwogCmRpZmYgLS1naXQgYS9jcnlwdG8vZWNoYWluaXYuYyBiL2NyeXB0by9lY2hhaW5pdi5jCmluZGV4IDFiMDFmZTkuLmUzZDg4OWIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9lY2hhaW5pdi5jCisrKyBiL2NyeXB0by9lY2hhaW5pdi5jCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIGVjaGFpbml2OiBFbmNyeXB0ZWQgQ2hhaW4gSVYgR2VuZXJhdG9yCiAgKgotICogVGhpcyBnZW5lcmF0b3IgZ2VuZXJhdGVzIGFuIElWIGJhc2VkIG9uIGEgc2VxdWVuY2UgbnVtYmVyIGJ5IHhvcmluZyBpdAotICogd2l0aCBhIHNhbHQgYW5kIHRoZW4gZW5jcnlwdGluZyBpdCB3aXRoIHRoZSBzYW1lIGtleSBhcyB1c2VkIHRvIGVuY3J5cHQKKyAqIFRoaXMgZ2VuZXJhdG9yIGdlbmVyYXRlcyBhbiBJViBiYXNlZCBvbiBhIHNlcXVlbmNlIG51bWJlciBieSBtdWx0aXBseWluZworICogaXQgd2l0aCBhIHNhbHQgYW5kIHRoZW4gZW5jcnlwdGluZyBpdCB3aXRoIHRoZSBzYW1lIGtleSBhcyB1c2VkIHRvIGVuY3J5cHQKICAqIHRoZSBwbGFpbiB0ZXh0LiAgVGhpcyBhbGdvcml0aG0gcmVxdWlyZXMgdGhhdCB0aGUgYmxvY2sgc2l6ZSBiZSBlcXVhbAogICogdG8gdGhlIElWIHNpemUuICBJdCBpcyBtYWlubHkgdXNlZnVsIGZvciBDQkMuCiAgKgpAQCAtMjQsODEgKzI0LDE3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKLSNkZWZpbmUgTUFYX0lWX1NJWkUgMTYKLQotc3RhdGljIERFRklORV9QRVJfQ1BVKHUzMiBbTUFYX0lWX1NJWkUgLyBzaXplb2YodTMyKV0sIGVjaGFpbml2X2l2KTsKLQotLyogV2UgZG9uJ3QgY2FyZSBpZiB3ZSBnZXQgcHJlZW1wdGVkIGFuZCByZWFkL3dyaXRlIElWcyBmcm9tIHRoZSBuZXh0IENQVS4gKi8KLXN0YXRpYyB2b2lkIGVjaGFpbml2X3JlYWRfaXYodTggKmRzdCwgdW5zaWduZWQgc2l6ZSkKLXsKLQl1MzIgKmEgPSAodTMyICopZHN0OwotCXUzMiBfX3BlcmNwdSAqYiA9IGVjaGFpbml2X2l2OwotCi0JZm9yICg7IHNpemUgPj0gNDsgc2l6ZSAtPSA0KSB7Ci0JCSphKysgPSB0aGlzX2NwdV9yZWFkKCpiKTsKLQkJYisrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZWNoYWluaXZfd3JpdGVfaXYoY29uc3QgdTggKnNyYywgdW5zaWduZWQgc2l6ZSkKLXsKLQljb25zdCB1MzIgKmEgPSAoY29uc3QgdTMyICopc3JjOwotCXUzMiBfX3BlcmNwdSAqYiA9IGVjaGFpbml2X2l2OwotCi0JZm9yICg7IHNpemUgPj0gNDsgc2l6ZSAtPSA0KSB7Ci0JCXRoaXNfY3B1X3dyaXRlKCpiLCAqYSk7Ci0JCWErKzsKLQkJYisrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZWNoYWluaXZfZW5jcnlwdF9jb21wbGV0ZTIoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxLCBpbnQgZXJyKQotewotCXN0cnVjdCBhZWFkX3JlcXVlc3QgKnN1YnJlcSA9IGFlYWRfcmVxdWVzdF9jdHgocmVxKTsKLQlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmdlbml2OwotCXVuc2lnbmVkIGludCBpdnNpemU7Ci0KLQlpZiAoZXJyID09IC1FSU5QUk9HUkVTUykKLQkJcmV0dXJuOwotCi0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLQlnZW5pdiA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOwotCWl2c2l6ZSA9IGNyeXB0b19hZWFkX2l2c2l6ZShnZW5pdik7Ci0KLQllY2hhaW5pdl93cml0ZV9pdihzdWJyZXEtPml2LCBpdnNpemUpOwotCi0JaWYgKHJlcS0+aXYgIT0gc3VicmVxLT5pdikKLQkJbWVtY3B5KHJlcS0+aXYsIHN1YnJlcS0+aXYsIGl2c2l6ZSk7Ci0KLW91dDoKLQlpZiAocmVxLT5pdiAhPSBzdWJyZXEtPml2KQotCQlremZyZWUoc3VicmVxLT5pdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGVjaGFpbml2X2VuY3J5cHRfY29tcGxldGUoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpiYXNlLAotCQkJCQkgaW50IGVycikKLXsKLQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEgPSBiYXNlLT5kYXRhOwotCi0JZWNoYWluaXZfZW5jcnlwdF9jb21wbGV0ZTIocmVxLCBlcnIpOwotCWFlYWRfcmVxdWVzdF9jb21wbGV0ZShyZXEsIGVycik7Ci19Ci0KIHN0YXRpYyBpbnQgZWNoYWluaXZfZW5jcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEpCiB7CiAJc3RydWN0IGNyeXB0b19hZWFkICpnZW5pdiA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOwogCXN0cnVjdCBhZWFkX2dlbml2X2N0eCAqY3R4ID0gY3J5cHRvX2FlYWRfY3R4KGdlbml2KTsKIAlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpzdWJyZXEgPSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7Ci0JY3J5cHRvX2NvbXBsZXRpb25fdCBjb21wbDsKLQl2b2lkICpkYXRhOworCV9fYmU2NCBuc2Vxbm87CisJdTY0IHNlcW5vOwogCXU4ICppbmZvOwogCXVuc2lnbmVkIGludCBpdnNpemUgPSBjcnlwdG9fYWVhZF9pdnNpemUoZ2VuaXYpOwogCWludCBlcnI7CkBAIC0xMDgsOCArNDQsNiBAQAogCiAJYWVhZF9yZXF1ZXN0X3NldF90Zm0oc3VicmVxLCBjdHgtPmNoaWxkKTsKIAotCWNvbXBsID0gZWNoYWluaXZfZW5jcnlwdF9jb21wbGV0ZTsKLQlkYXRhID0gcmVxOwogCWluZm8gPSByZXEtPml2OwogCiAJaWYgKHJlcS0+c3JjICE9IHJlcS0+ZHN0KSB7CkBAIC0xMjcsMjkgKzYxLDMwIEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmICh1bmxpa2VseSghSVNfQUxJR05FRCgodW5zaWduZWQgbG9uZylpbmZvLAotCQkJCSBjcnlwdG9fYWVhZF9hbGlnbm1hc2soZ2VuaXYpICsgMSkpKSB7Ci0JCWluZm8gPSBrbWFsbG9jKGl2c2l6ZSwgcmVxLT5iYXNlLmZsYWdzICYKLQkJCQkgICAgICAgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQID8gR0ZQX0tFUk5FTDoKLQkJCQkJCQkJICBHRlBfQVRPTUlDKTsKLQkJaWYgKCFpbmZvKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJbWVtY3B5KGluZm8sIHJlcS0+aXYsIGl2c2l6ZSk7Ci0JfQotCi0JYWVhZF9yZXF1ZXN0X3NldF9jYWxsYmFjayhzdWJyZXEsIHJlcS0+YmFzZS5mbGFncywgY29tcGwsIGRhdGEpOworCWFlYWRfcmVxdWVzdF9zZXRfY2FsbGJhY2soc3VicmVxLCByZXEtPmJhc2UuZmxhZ3MsCisJCQkJICByZXEtPmJhc2UuY29tcGxldGUsIHJlcS0+YmFzZS5kYXRhKTsKIAlhZWFkX3JlcXVlc3Rfc2V0X2NyeXB0KHN1YnJlcSwgcmVxLT5kc3QsIHJlcS0+ZHN0LAogCQkJICAgICAgIHJlcS0+Y3J5cHRsZW4sIGluZm8pOwogCWFlYWRfcmVxdWVzdF9zZXRfYWQoc3VicmVxLCByZXEtPmFzc29jbGVuKTsKIAotCWNyeXB0b194b3IoaW5mbywgY3R4LT5zYWx0LCBpdnNpemUpOwotCXNjYXR0ZXJ3YWxrX21hcF9hbmRfY29weShpbmZvLCByZXEtPmRzdCwgcmVxLT5hc3NvY2xlbiwgaXZzaXplLCAxKTsKLQllY2hhaW5pdl9yZWFkX2l2KGluZm8sIGl2c2l6ZSk7CisJbWVtY3B5KCZuc2Vxbm8sIGluZm8gKyBpdnNpemUgLSA4LCA4KTsKKwlzZXFubyA9IGJlNjRfdG9fY3B1KG5zZXFubyk7CisJbWVtc2V0KGluZm8sIDAsIGl2c2l6ZSk7CiAKLQllcnIgPSBjcnlwdG9fYWVhZF9lbmNyeXB0KHN1YnJlcSk7Ci0JZWNoYWluaXZfZW5jcnlwdF9jb21wbGV0ZTIocmVxLCBlcnIpOwotCXJldHVybiBlcnI7CisJc2NhdHRlcndhbGtfbWFwX2FuZF9jb3B5KGluZm8sIHJlcS0+ZHN0LCByZXEtPmFzc29jbGVuLCBpdnNpemUsIDEpOworCisJZG8geworCQl1NjQgYTsKKworCQltZW1jcHkoJmEsIGN0eC0+c2FsdCArIGl2c2l6ZSAtIDgsIDgpOworCisJCWEgfD0gMTsKKwkJYSAqPSBzZXFubzsKKworCQltZW1jcHkoaW5mbyArIGl2c2l6ZSAtIDgsICZhLCA4KTsKKwl9IHdoaWxlICgoaXZzaXplIC09IDgpKTsKKworCXJldHVybiBjcnlwdG9fYWVhZF9lbmNyeXB0KHN1YnJlcSk7CiB9CiAKIHN0YXRpYyBpbnQgZWNoYWluaXZfZGVjcnlwdChzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpyZXEpCkBAIC0xOTYsOCArMTMxLDcgQEAKIAlhbGcgPSBjcnlwdG9fc3Bhd25fYWVhZF9hbGcoc3Bhd24pOwogCiAJZXJyID0gLUVJTlZBTDsKLQlpZiAoaW5zdC0+YWxnLml2c2l6ZSAmIChzaXplb2YodTMyKSAtIDEpIHx8Ci0JICAgIGluc3QtPmFsZy5pdnNpemUgPiBNQVhfSVZfU0laRSkKKwlpZiAoaW5zdC0+YWxnLml2c2l6ZSAmIChzaXplb2YodTY0KSAtIDEpIHx8ICFpbnN0LT5hbGcuaXZzaXplKQogCQlnb3RvIGZyZWVfaW5zdDsKIAogCWluc3QtPmFsZy5lbmNyeXB0ID0gZWNoYWluaXZfZW5jcnlwdDsKQEAgLTIwNiw3ICsxNDAsNiBAQAogCWluc3QtPmFsZy5pbml0ID0gYWVhZF9pbml0X2dlbml2OwogCWluc3QtPmFsZy5leGl0ID0gYWVhZF9leGl0X2dlbml2OwogCi0JaW5zdC0+YWxnLmJhc2UuY3JhX2FsaWdubWFzayB8PSBfX2FsaWdub2ZfXyh1MzIpIC0gMTsKIAlpbnN0LT5hbGcuYmFzZS5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYWVhZF9nZW5pdl9jdHgpOwogCWluc3QtPmFsZy5iYXNlLmNyYV9jdHhzaXplICs9IGluc3QtPmFsZy5pdnNpemU7CiAKZGlmZiAtLWdpdCBhL2NyeXB0by9yc2EtcGtjczFwYWQuYyBiL2NyeXB0by9yc2EtcGtjczFwYWQuYwppbmRleCA4NzcwMTlhLi44YmFhYjQzIDEwMDY0NAotLS0gYS9jcnlwdG8vcnNhLXBrY3MxcGFkLmMKKysrIGIvY3J5cHRvL3JzYS1wa2NzMXBhZC5jCkBAIC0yOTgsNDEgKzI5OCw0OCBAQAogCXN0cnVjdCBjcnlwdG9fYWtjaXBoZXIgKnRmbSA9IGNyeXB0b19ha2NpcGhlcl9yZXF0Zm0ocmVxKTsKIAlzdHJ1Y3QgcGtjczFwYWRfY3R4ICpjdHggPSBha2NpcGhlcl90Zm1fY3R4KHRmbSk7CiAJc3RydWN0IHBrY3MxcGFkX3JlcXVlc3QgKnJlcV9jdHggPSBha2NpcGhlcl9yZXF1ZXN0X2N0eChyZXEpOworCXVuc2lnbmVkIGludCBkc3RfbGVuOwogCXVuc2lnbmVkIGludCBwb3M7Ci0KLQlpZiAoZXJyID09IC1FT1ZFUkZMT1cpCi0JCS8qIERlY3J5cHRlZCB2YWx1ZSBoYWQgbm8gbGVhZGluZyAwIGJ5dGUgKi8KLQkJZXJyID0gLUVJTlZBTDsKKwl1OCAqb3V0X2J1ZjsKIAogCWlmIChlcnIpCiAJCWdvdG8gZG9uZTsKIAotCWlmIChyZXFfY3R4LT5jaGlsZF9yZXEuZHN0X2xlbiAhPSBjdHgtPmtleV9zaXplIC0gMSkgewotCQllcnIgPSAtRUlOVkFMOworCWVyciA9IC1FSU5WQUw7CisJZHN0X2xlbiA9IHJlcV9jdHgtPmNoaWxkX3JlcS5kc3RfbGVuOworCWlmIChkc3RfbGVuIDwgY3R4LT5rZXlfc2l6ZSAtIDEpCiAJCWdvdG8gZG9uZTsKKworCW91dF9idWYgPSByZXFfY3R4LT5vdXRfYnVmOworCWlmIChkc3RfbGVuID09IGN0eC0+a2V5X3NpemUpIHsKKwkJaWYgKG91dF9idWZbMF0gIT0gMHgwMCkKKwkJCS8qIERlY3J5cHRlZCB2YWx1ZSBoYWQgbm8gbGVhZGluZyAwIGJ5dGUgKi8KKwkJCWdvdG8gZG9uZTsKKworCQlkc3RfbGVuLS07CisJCW91dF9idWYrKzsKIAl9CiAKLQlpZiAocmVxX2N0eC0+b3V0X2J1ZlswXSAhPSAweDAyKSB7Ci0JCWVyciA9IC1FSU5WQUw7CisJaWYgKG91dF9idWZbMF0gIT0gMHgwMikKIAkJZ290byBkb25lOwotCX0KLQlmb3IgKHBvcyA9IDE7IHBvcyA8IHJlcV9jdHgtPmNoaWxkX3JlcS5kc3RfbGVuOyBwb3MrKykKLQkJaWYgKHJlcV9jdHgtPm91dF9idWZbcG9zXSA9PSAweDAwKQorCisJZm9yIChwb3MgPSAxOyBwb3MgPCBkc3RfbGVuOyBwb3MrKykKKwkJaWYgKG91dF9idWZbcG9zXSA9PSAweDAwKQogCQkJYnJlYWs7Ci0JaWYgKHBvcyA8IDkgfHwgcG9zID09IHJlcV9jdHgtPmNoaWxkX3JlcS5kc3RfbGVuKSB7Ci0JCWVyciA9IC1FSU5WQUw7CisJaWYgKHBvcyA8IDkgfHwgcG9zID09IGRzdF9sZW4pCiAJCWdvdG8gZG9uZTsKLQl9CiAJcG9zKys7CiAKLQlpZiAocmVxLT5kc3RfbGVuIDwgcmVxX2N0eC0+Y2hpbGRfcmVxLmRzdF9sZW4gLSBwb3MpCisJZXJyID0gMDsKKworCWlmIChyZXEtPmRzdF9sZW4gPCBkc3RfbGVuIC0gcG9zKQogCQllcnIgPSAtRU9WRVJGTE9XOwotCXJlcS0+ZHN0X2xlbiA9IHJlcV9jdHgtPmNoaWxkX3JlcS5kc3RfbGVuIC0gcG9zOworCXJlcS0+ZHN0X2xlbiA9IGRzdF9sZW4gLSBwb3M7CiAKIAlpZiAoIWVycikKIAkJc2dfY29weV9mcm9tX2J1ZmZlcihyZXEtPmRzdCwKIAkJCQlzZ19uZW50c19mb3JfbGVuKHJlcS0+ZHN0LCByZXEtPmRzdF9sZW4pLAotCQkJCXJlcV9jdHgtPm91dF9idWYgKyBwb3MsIHJlcS0+ZHN0X2xlbik7CisJCQkJb3V0X2J1ZiArIHBvcywgcmVxLT5kc3RfbGVuKTsKIAogZG9uZToKIAlremZyZWUocmVxX2N0eC0+b3V0X2J1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL01ha2VmaWxlIGIvZHJpdmVycy9NYWtlZmlsZQppbmRleCA1M2FiYjRhLi5mMGFmZGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvTWFrZWZpbGUKQEAgLTI5LDYgKzI5LDggQEAKICMgd2FzIHVzZWQgYW5kIGRvIG5vdGhpbmcgaWYgc28KIG9iai0kKENPTkZJR19QTlApCQkrPSBwbnAvCiBvYmoteQkJCQkrPSBhbWJhLworCitvYmoteQkJCQkrPSBjbGsvCiAjIE1hbnkgZHJpdmVycyB3aWxsIHdhbnQgdG8gdXNlIERNQSBzbyB0aGlzIGhhcyB0byBiZSBtYWRlIGF2YWlsYWJsZQogIyByZWFsbHkgZWFybHkuCiBvYmotJChDT05GSUdfRE1BREVWSUNFUykJKz0gZG1hLwpAQCAtMTQyLDggKzE0NCw2IEBACiBvYmotJChDT05GSUdfVkxZTlEpCQkrPSB2bHlucS8KIG9iai0kKENPTkZJR19TVEFHSU5HKQkJKz0gc3RhZ2luZy8KIG9iai15CQkJCSs9IHBsYXRmb3JtLwotI2NvbW1vbiBjbGsgY29kZQotb2JqLXkJCQkJKz0gY2xrLwogCiBvYmotJChDT05GSUdfTUFJTEJPWCkJCSs9IG1haWxib3gvCiBvYmotJChDT05GSUdfSFdTUElOTE9DSykJKz0gaHdzcGlubG9jay8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9LY29uZmlnIGIvZHJpdmVycy9hY3BpL0tjb25maWcKaW5kZXggNDQ1Y2UyOC4uNTM1ZTc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9hY3BpL0tjb25maWcKQEAgLTc3LDYgKzc3LDkgQEAKIAogZW5kaWYKIAorY29uZmlnIEFDUElfU1BDUl9UQUJMRQorCWJvb2wKKwogY29uZmlnIEFDUElfU0xFRVAKIAlib29sCiAJZGVwZW5kcyBvbiBTVVNQRU5EIHx8IEhJQkVSTkFUSU9OCkBAIC0yMjcsNyArMjMwLDYgQEAKIGNvbmZpZyBBQ1BJX0NQUENfTElCCiAJYm9vbAogCWRlcGVuZHMgb24gQUNQSV9QUk9DRVNTT1IKLQlkZXBlbmRzIG9uICFBQ1BJX0NQVV9GUkVRX1BTUwogCXNlbGVjdCBNQUlMQk9YCiAJc2VsZWN0IFBDQwogCWhlbHAKQEAgLTQ2Miw2ICs0NjQsOSBAQAogc291cmNlICJkcml2ZXJzL2FjcGkvYXBlaS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL2FjcGkvZHB0Zi9LY29uZmlnIgogCitjb25maWcgQUNQSV9XQVRDSERPRworCWJvb2wKKwogY29uZmlnIEFDUElfRVhUTE9HCiAJdHJpc3RhdGUgIkV4dGVuZGVkIEVycm9yIExvZyBzdXBwb3J0IgogCWRlcGVuZHMgb24gWDg2X01DRSAmJiBYODZfTE9DQUxfQVBJQwpAQCAtNTIxLDQgKzUyNiw4IEBACiAJICB1c2Vyc3BhY2UuIFRoZSBjb25maWd1cmFibGUgQUNQSSBncm91cHMgd2lsbCBiZSB2aXNpYmxlIHVuZGVyCiAJICAvY29uZmlnL2FjcGksIGFzc3VtaW5nIGNvbmZpZ2ZzIGlzIG1vdW50ZWQgdW5kZXIgL2NvbmZpZy4KIAoraWYgQVJNNjQKK3NvdXJjZSAiZHJpdmVycy9hY3BpL2FybTY0L0tjb25maWciCitlbmRpZgorCiBlbmRpZgkjIEFDUEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9NYWtlZmlsZSBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQppbmRleCA1YWU5ZDg1Li45ZWQwODc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9hY3BpL01ha2VmaWxlCkBAIC01Niw2ICs1Niw3IEBACiBhY3BpLSQoQ09ORklHX0FDUElfUFJPQ0ZTX1BPV0VSKSArPSBjbV9zYnMubwogYWNwaS15CQkJCSs9IGFjcGlfbHBhdC5vCiBhY3BpLSQoQ09ORklHX0FDUElfR0VORVJJQ19HU0kpICs9IGdzaS5vCithY3BpLSQoQ09ORklHX0FDUElfV0FUQ0hET0cpCSs9IGFjcGlfd2F0Y2hkb2cubwogCiAjIFRoZXNlIGFyZSAocG90ZW50aWFsbHkpIHNlcGFyYXRlIG1vZHVsZXMKIApAQCAtODEsNiArODIsNyBAQAogb2JqLSQoQ09ORklHX0FDUElfQ1VTVE9NX01FVEhPRCkrPSBjdXN0b21fbWV0aG9kLm8KIG9iai0kKENPTkZJR19BQ1BJX0JHUlQpCQkrPSBiZ3J0Lm8KIG9iai0kKENPTkZJR19BQ1BJX0NQUENfTElCKQkrPSBjcHBjX2FjcGkubworb2JqLSQoQ09ORklHX0FDUElfU1BDUl9UQUJMRSkJKz0gc3Bjci5vCiBvYmotJChDT05GSUdfQUNQSV9ERUJVR0dFUl9VU0VSKSArPSBhY3BpX2RiZy5vCiAKICMgcHJvY2Vzc29yIGhhcyBpdHMgb3duICJwcm9jZXNzb3IuIiBtb2R1bGVfcGFyYW0gbmFtZXNwYWNlCkBAIC0xMDUsMyArMTA3LDUgQEAKIAogdmlkZW8tb2JqcwkJCSs9IGFjcGlfdmlkZW8ubyB2aWRlb19kZXRlY3Qubwogb2JqLXkJCQkJKz0gZHB0Zi8KKworb2JqLSQoQ09ORklHX0FSTTY0KQkJKz0gYXJtNjQvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9hcGQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX2FwZC5jCmluZGV4IDFkYWY5YzQuLmQ1OGZiZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpX2FwZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX2FwZC5jCkBAIC00Miw2ICs0Miw3IEBACiBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGZpeGVkX2Nsa19yYXRlOworCXN0cnVjdCBwcm9wZXJ0eV9lbnRyeSAqcHJvcGVydGllczsKIAlpbnQgKCpzZXR1cCkoc3RydWN0IGFwZF9wcml2YXRlX2RhdGEgKnBkYXRhKTsKIH07CiAKQEAgLTcxLDIyICs3MiwzNSBAQAogfQogCiAjaWZkZWYgQ09ORklHX1g4Nl9BTURfUExBVEZPUk1fREVWSUNFCi1zdGF0aWMgc3RydWN0IGFwZF9kZXZpY2VfZGVzYyBjel9pMmNfZGVzYyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIGN6X2kyY19kZXNjID0gewogCS5zZXR1cCA9IGFjcGlfYXBkX3NldHVwLAogCS5maXhlZF9jbGtfcmF0ZSA9IDEzMzAwMDAwMCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIGN6X3VhcnRfZGVzYyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcHJvcGVydHlfZW50cnkgdWFydF9wcm9wZXJ0aWVzW10gPSB7CisJUFJPUEVSVFlfRU5UUllfVTMyKCJyZWctaW8td2lkdGgiLCA0KSwKKwlQUk9QRVJUWV9FTlRSWV9VMzIoInJlZy1zaGlmdCIsIDIpLAorCVBST1BFUlRZX0VOVFJZX0JPT0woInNucHMsdWFydC0xNjU1MC1jb21wYXRpYmxlIiksCisJeyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhcGRfZGV2aWNlX2Rlc2MgY3pfdWFydF9kZXNjID0gewogCS5zZXR1cCA9IGFjcGlfYXBkX3NldHVwLAogCS5maXhlZF9jbGtfcmF0ZSA9IDQ4MDAwMDAwLAorCS5wcm9wZXJ0aWVzID0gdWFydF9wcm9wZXJ0aWVzLAogfTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSTTY0Ci1zdGF0aWMgc3RydWN0IGFwZF9kZXZpY2VfZGVzYyB4Z2VuZV9pMmNfZGVzYyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIHhnZW5lX2kyY19kZXNjID0gewogCS5zZXR1cCA9IGFjcGlfYXBkX3NldHVwLAogCS5maXhlZF9jbGtfcmF0ZSA9IDEwMDAwMDAwMCwKIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXBkX2RldmljZV9kZXNjIHZ1bGNhbl9zcGlfZGVzYyA9IHsKKwkuc2V0dXAgPSBhY3BpX2FwZF9zZXR1cCwKKwkuZml4ZWRfY2xrX3JhdGUgPSAxMzMwMDAwMDAsCit9OwogI2VuZGlmCiAKICNlbHNlCkBAIC0xMjUsNiArMTM5LDEyIEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJfQogCisJaWYgKGRldl9kZXNjLT5wcm9wZXJ0aWVzKSB7CisJCXJldCA9IGRldmljZV9hZGRfcHJvcGVydGllcygmYWRldi0+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+bGlzdF9uYW1lID0gbGlzdF9uYW1lOwogCWNhY2hlLT5vYmplY3Rfc2l6ZSA9IG9iamVjdF9zaXplOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCmluZGV4IGQ5ZTZhYWMuLmVjNTAzYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmFjZS5jCkBAIC02MSw3ICs2MSw3IEBACiAgKiBERVNDUklQVElPTjogU2h1dGRvd24gdGhlIEFDUElDQSBzdWJzeXN0ZW0gYW5kIHJlbGVhc2UgYWxsIHJlc291cmNlcy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfdGVybWluYXRlKHZvaWQpCithY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04gYWNwaV90ZXJtaW5hdGUodm9pZCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmluaXQuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdXR4ZmluaXQuYwppbmRleCA3NWI1ZjI3Li5hNWNhMGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3V0eGZpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS91dHhmaW5pdC5jCkBAIC02OSw3ICs2OSw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0odm9pZCkKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX2luaXRpYWxpemVfc3Vic3lzdGVtKHZvaWQpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC0xNDEsNyArMTQxLDcgQEAKICAqICAgICAgICAgICAgICBQdXRzIHN5c3RlbSBpbnRvIEFDUEkgbW9kZSBpZiBpdCBpc24ndCBhbHJlYWR5LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1hY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9lbmFibGVfc3Vic3lzdGVtKHUzMiBmbGFncykKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX2VuYWJsZV9zdWJzeXN0ZW0odTMyIGZsYWdzKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCkBAIC0yMzksNyArMjM5LDcgQEAKICAqICAgICAgICAgICAgICBvYmplY3RzIGFuZCBleGVjdXRpbmcgQU1MIGNvZGUgZm9yIFJlZ2lvbnMsIGJ1ZmZlcnMsIGV0Yy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzKHUzMiBmbGFncykKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX2luaXRpYWxpemVfb2JqZWN0cyh1MzIgZmxhZ3MpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKQEAgLTI2NSw3ICsyNjUsOCBAQAogCSAqIGFsbCBvZiB0aGUgdGFibGVzIGhhdmUgYmVlbiBsb2FkZWQuIEl0IGlzIGEgbGVnYWN5IG9wdGlvbiBhbmQgaXMKIAkgKiBub3QgY29tcGF0aWJsZSB3aXRoIG90aGVyIEFDUEkgaW1wbGVtZW50YXRpb25zLiBTZWUgYWNwaV9uc19sb2FkX3RhYmxlLgogCSAqLwotCWlmIChhY3BpX2dibF9ncm91cF9tb2R1bGVfbGV2ZWxfY29kZSkgeworCWlmICghYWNwaV9nYmxfcGFyc2VfdGFibGVfYXNfdGVybV9saXN0CisJICAgICYmIGFjcGlfZ2JsX2dyb3VwX21vZHVsZV9sZXZlbF9jb2RlKSB7CiAJCWFjcGlfbnNfZXhlY19tb2R1bGVfY29kZV9saXN0KCk7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYwppbmRleCBmMDk2YWIzLi5lYzRmNTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC5jCkBAIC05MzgsNyArOTM4LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHN0b3JlX2luZm8gZXJzdF9pbmZvID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJPSAiZXJzdCIsCi0JLmZsYWdzCQk9IFBTVE9SRV9GTEFHU19GUkFHSUxFLAorCS5mbGFncwkJPSBQU1RPUkVfRkxBR1NfRE1FU0csCiAJLm9wZW4JCT0gZXJzdF9vcGVuX3BzdG9yZSwKIAkuY2xvc2UJCT0gZXJzdF9jbG9zZV9wc3RvcmUsCiAJLnJlYWQJCT0gZXJzdF9yZWFkZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9naGVzLmMgYi9kcml2ZXJzL2FjcGkvYXBlaS9naGVzLmMKaW5kZXggNjA3NDZlZi4uZjBhMDI5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvZ2hlcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2doZXMuYwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAKIAkJCQlkZXZmbiA9IFBDSV9ERVZGTihwY2llX2Vyci0+ZGV2aWNlX2lkLmRldmljZSwKIAkJCQkJCSAgcGNpZV9lcnItPmRldmljZV9pZC5mdW5jdGlvbik7Ci0JCQkJYWVyX3NldmVyaXR5ID0gY3Blcl9zZXZlcml0eV90b19hZXIoc2V2KTsKKwkJCQlhZXJfc2V2ZXJpdHkgPSBjcGVyX3NldmVyaXR5X3RvX2FlcihnZGF0YS0+ZXJyb3Jfc2V2ZXJpdHkpOwogCiAJCQkJLyoKIAkJCQkgKiBJZiBmaXJtd2FyZSByZXNldCB0aGUgY29tcG9uZW50IHRvIGNvbnRhaW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcm02NC9LY29uZmlnIGIvZHJpdmVycy9hY3BpL2FybTY0L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYxNmRhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hcm02NC9LY29uZmlnCkBAIC0wLDAgKzEsNiBAQAorIworIyBBQ1BJIENvbmZpZ3VyYXRpb24gZm9yIEFSTTY0CisjCisKK2NvbmZpZyBBQ1BJX0lPUlQKKwlib29sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXJtNjQvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvYXJtNjQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzMzFmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYWNwaS9hcm02NC9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmotJChDT05GSUdfQUNQSV9JT1JUKSAJKz0gaW9ydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXJtNjQvaW9ydC5jIGIvZHJpdmVycy9hY3BpL2FybTY0L2lvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjgxNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9hY3BpL2FybTY0L2lvcnQuYwpAQCAtMCwwICsxLDM2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiwgU2VtaWhhbGYKKyAqCUF1dGhvcjogVG9tYXN6IE5vd2lja2kgPHRuQHNlbWloYWxmLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogVGhpcyBmaWxlIGltcGxlbWVudHMgZWFybHkgZGV0ZWN0aW9uL3BhcnNpbmcgb2YgSS9PIG1hcHBpbmcKKyAqIHJlcG9ydGVkIHRvIE9TIHRocm91Z2ggZmlybXdhcmUgdmlhIEkvTyBSZW1hcHBpbmcgVGFibGUgKElPUlQpCisgKiBJT1JUIGRvY3VtZW50IG51bWJlcjogQVJNIERFTiAwMDQ5QQorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkJIkFDUEk6IElPUlQ6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9hY3BpX2lvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworc3RydWN0IGlvcnRfaXRzX21zaV9jaGlwIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IGZ3bm9kZV9oYW5kbGUJKmZ3X25vZGU7CisJdTMyCQkJdHJhbnNsYXRpb25faWQ7Cit9OworCit0eXBlZGVmIGFjcGlfc3RhdHVzICgqaW9ydF9maW5kX25vZGVfY2FsbGJhY2spCisJKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqbm9kZSwgdm9pZCAqY29udGV4dCk7CisKKy8qIFJvb3QgcG9pbnRlciB0byB0aGUgbWFwcGVkIElPUlQgdGFibGUgKi8KK3N0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmlvcnRfdGFibGU7CisKK3N0YXRpYyBMSVNUX0hFQUQoaW9ydF9tc2lfY2hpcF9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9ydF9tc2lfY2hpcF9sb2NrKTsKKworLyoqCisgKiBpb3J0X3JlZ2lzdGVyX2RvbWFpbl90b2tlbigpIC0gcmVnaXN0ZXIgZG9tYWluIHRva2VuIGFuZCByZWxhdGVkIElUUyBJRAorICogdG8gdGhlIGxpc3QgZnJvbSB3aGVyZSB3ZSBjYW4gZ2V0IGl0IGJhY2sgbGF0ZXIgb24uCisgKiBAdHJhbnNfaWQ6IElUUyBJRC4KKyAqIEBmd19ub2RlOiBEb21haW4gdG9rZW4uCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRU5PTUVNIGlmIG5vIG1lbW9yeSB3aGVuIGFsbG9jYXRpbmcgbGlzdCBlbGVtZW50CisgKi8KK2ludCBpb3J0X3JlZ2lzdGVyX2RvbWFpbl90b2tlbihpbnQgdHJhbnNfaWQsIHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd19ub2RlKQoreworCXN0cnVjdCBpb3J0X2l0c19tc2lfY2hpcCAqaXRzX21zaV9jaGlwOworCisJaXRzX21zaV9jaGlwID0ga3phbGxvYyhzaXplb2YoKml0c19tc2lfY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghaXRzX21zaV9jaGlwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWl0c19tc2lfY2hpcC0+Zndfbm9kZSA9IGZ3X25vZGU7CisJaXRzX21zaV9jaGlwLT50cmFuc2xhdGlvbl9pZCA9IHRyYW5zX2lkOworCisJc3Bpbl9sb2NrKCZpb3J0X21zaV9jaGlwX2xvY2spOworCWxpc3RfYWRkKCZpdHNfbXNpX2NoaXAtPmxpc3QsICZpb3J0X21zaV9jaGlwX2xpc3QpOworCXNwaW5fdW5sb2NrKCZpb3J0X21zaV9jaGlwX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW9ydF9kZXJlZ2lzdGVyX2RvbWFpbl90b2tlbigpIC0gRGVyZWdpc3RlciBkb21haW4gdG9rZW4gYmFzZWQgb24gSVRTIElECisgKiBAdHJhbnNfaWQ6IElUUyBJRC4KKyAqCisgKiBSZXR1cm5zOiBub25lLgorICovCit2b2lkIGlvcnRfZGVyZWdpc3Rlcl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkKQoreworCXN0cnVjdCBpb3J0X2l0c19tc2lfY2hpcCAqaXRzX21zaV9jaGlwLCAqdDsKKworCXNwaW5fbG9jaygmaW9ydF9tc2lfY2hpcF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXRzX21zaV9jaGlwLCB0LCAmaW9ydF9tc2lfY2hpcF9saXN0LCBsaXN0KSB7CisJCWlmIChpdHNfbXNpX2NoaXAtPnRyYW5zbGF0aW9uX2lkID09IHRyYW5zX2lkKSB7CisJCQlsaXN0X2RlbCgmaXRzX21zaV9jaGlwLT5saXN0KTsKKwkJCWtmcmVlKGl0c19tc2lfY2hpcCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmaW9ydF9tc2lfY2hpcF9sb2NrKTsKK30KKworLyoqCisgKiBpb3J0X2ZpbmRfZG9tYWluX3Rva2VuKCkgLSBGaW5kIGRvbWFpbiB0b2tlbiBiYXNlZCBvbiBnaXZlbiBJVFMgSUQKKyAqIEB0cmFuc19pZDogSVRTIElELgorICoKKyAqIFJldHVybnM6IGRvbWFpbiB0b2tlbiB3aGVuIGZpbmQgb24gdGhlIGxpc3QsIE5VTEwgb3RoZXJ3aXNlCisgKi8KK3N0cnVjdCBmd25vZGVfaGFuZGxlICppb3J0X2ZpbmRfZG9tYWluX3Rva2VuKGludCB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndfbm9kZSA9IE5VTEw7CisJc3RydWN0IGlvcnRfaXRzX21zaV9jaGlwICppdHNfbXNpX2NoaXA7CisKKwlzcGluX2xvY2soJmlvcnRfbXNpX2NoaXBfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpdHNfbXNpX2NoaXAsICZpb3J0X21zaV9jaGlwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGl0c19tc2lfY2hpcC0+dHJhbnNsYXRpb25faWQgPT0gdHJhbnNfaWQpIHsKKwkJCWZ3X25vZGUgPSBpdHNfbXNpX2NoaXAtPmZ3X25vZGU7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmaW9ydF9tc2lfY2hpcF9sb2NrKTsKKworCXJldHVybiBmd19ub2RlOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfaW9ydF9ub2RlICppb3J0X3NjYW5fbm9kZShlbnVtIGFjcGlfaW9ydF9ub2RlX3R5cGUgdHlwZSwKKwkJCQkJICAgICBpb3J0X2ZpbmRfbm9kZV9jYWxsYmFjayBjYWxsYmFjaywKKwkJCQkJICAgICB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9ydF9ub2RlLCAqaW9ydF9lbmQ7CisJc3RydWN0IGFjcGlfdGFibGVfaW9ydCAqaW9ydDsKKwlpbnQgaTsKKworCWlmICghaW9ydF90YWJsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBHZXQgdGhlIGZpcnN0IElPUlQgbm9kZSAqLworCWlvcnQgPSAoc3RydWN0IGFjcGlfdGFibGVfaW9ydCAqKWlvcnRfdGFibGU7CisJaW9ydF9ub2RlID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSwgaW9ydCwKKwkJCQkgaW9ydC0+bm9kZV9vZmZzZXQpOworCWlvcnRfZW5kID0gQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX2lvcnRfbm9kZSwgaW9ydF90YWJsZSwKKwkJCQlpb3J0X3RhYmxlLT5sZW5ndGgpOworCisJZm9yIChpID0gMDsgaSA8IGlvcnQtPm5vZGVfY291bnQ7IGkrKykgeworCQlpZiAoV0FSTl9UQUlOVChpb3J0X25vZGUgPj0gaW9ydF9lbmQsIFRBSU5UX0ZJUk1XQVJFX1dPUktBUk9VTkQsCisJCQkgICAgICAgIklPUlQgbm9kZSBwb2ludGVyIG92ZXJmbG93cywgYmFkIHRhYmxlIVxuIikpCisJCQlyZXR1cm4gTlVMTDsKKworCQlpZiAoaW9ydF9ub2RlLT50eXBlID09IHR5cGUgJiYKKwkJICAgIEFDUElfU1VDQ0VTUyhjYWxsYmFjayhpb3J0X25vZGUsIGNvbnRleHQpKSkKKwkJCQlyZXR1cm4gaW9ydF9ub2RlOworCisJCWlvcnRfbm9kZSA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnRfbm9kZSwKKwkJCQkJIGlvcnRfbm9kZS0+bGVuZ3RoKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIGlvcnRfbWF0Y2hfbm9kZV9jYWxsYmFjayhzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGUsCisJCQkJCSAgICB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRleHQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJaWYgKG5vZGUtPnR5cGUgPT0gQUNQSV9JT1JUX05PREVfTkFNRURfQ09NUE9ORU5UKSB7CisJCXN0cnVjdCBhY3BpX2J1ZmZlciBidWYgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CisJCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IHRvX2FjcGlfZGV2aWNlX25vZGUoZGV2LT5md25vZGUpOworCQlzdHJ1Y3QgYWNwaV9pb3J0X25hbWVkX2NvbXBvbmVudCAqbmNvbXA7CisKKwkJaWYgKCFhZGV2KSB7CisJCQlzdGF0dXMgPSBBRV9OT1RfRk9VTkQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN0YXR1cyA9IGFjcGlfZ2V0X25hbWUoYWRldi0+aGFuZGxlLCBBQ1BJX0ZVTExfUEFUSE5BTUUsICZidWYpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCWRldl93YXJuKGRldiwgIkNhbid0IGdldCBkZXZpY2UgZnVsbCBwYXRoIG5hbWVcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQluY29tcCA9IChzdHJ1Y3QgYWNwaV9pb3J0X25hbWVkX2NvbXBvbmVudCAqKW5vZGUtPm5vZGVfZGF0YTsKKwkJc3RhdHVzID0gIXN0cmNtcChuY29tcC0+ZGV2aWNlX25hbWUsIGJ1Zi5wb2ludGVyKSA/CisJCQkJCQkJQUVfT0sgOiBBRV9OT1RfRk9VTkQ7CisJCWFjcGlfb3NfZnJlZShidWYucG9pbnRlcik7CisJfSBlbHNlIGlmIChub2RlLT50eXBlID09IEFDUElfSU9SVF9OT0RFX1BDSV9ST09UX0NPTVBMRVgpIHsKKwkJc3RydWN0IGFjcGlfaW9ydF9yb290X2NvbXBsZXggKnBjaV9yYzsKKwkJc3RydWN0IHBjaV9idXMgKmJ1czsKKworCQlidXMgPSB0b19wY2lfYnVzKGRldik7CisJCXBjaV9yYyA9IChzdHJ1Y3QgYWNwaV9pb3J0X3Jvb3RfY29tcGxleCAqKW5vZGUtPm5vZGVfZGF0YTsKKworCQkvKgorCQkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgUENJIHNlZ21lbnQgbnVtYmVycyBtYXBzIG9uZS10by1vbmUKKwkJICogd2l0aCByb290IGNvbXBsZXhlcy4gRWFjaCBzZWdtZW50IG51bWJlciBjYW4gcmVwcmVzZW50IG9ubHkKKwkJICogb25lIHJvb3QgY29tcGxleC4KKwkJICovCisJCXN0YXR1cyA9IHBjaV9yYy0+cGNpX3NlZ21lbnRfbnVtYmVyID09IHBjaV9kb21haW5fbnIoYnVzKSA/CisJCQkJCQkJQUVfT0sgOiBBRV9OT1RfRk9VTkQ7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gQUVfTk9UX0ZPVU5EOworCX0KK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGlvcnRfaWRfbWFwKHN0cnVjdCBhY3BpX2lvcnRfaWRfbWFwcGluZyAqbWFwLCB1OCB0eXBlLCB1MzIgcmlkX2luLAorCQkgICAgICAgdTMyICpyaWRfb3V0KQoreworCS8qIFNpbmdsZSBtYXBwaW5nIGRvZXMgbm90IGNhcmUgZm9yIGlucHV0IGlkICovCisJaWYgKG1hcC0+ZmxhZ3MgJiBBQ1BJX0lPUlRfSURfU0lOR0xFX01BUFBJTkcpIHsKKwkJaWYgKHR5cGUgPT0gQUNQSV9JT1JUX05PREVfTkFNRURfQ09NUE9ORU5UIHx8CisJCSAgICB0eXBlID09IEFDUElfSU9SVF9OT0RFX1BDSV9ST09UX0NPTVBMRVgpIHsKKwkJCSpyaWRfb3V0ID0gbWFwLT5vdXRwdXRfYmFzZTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcHJfd2FybihGV19CVUcgIlttYXAgJXBdIFNJTkdMRSBNQVBQSU5HIGZsYWcgbm90IGFsbG93ZWQgZm9yIG5vZGUgdHlwZSAlZCwgc2tpcHBpbmcgSUQgbWFwXG4iLAorCQkJbWFwLCB0eXBlKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpZiAocmlkX2luIDwgbWFwLT5pbnB1dF9iYXNlIHx8CisJICAgIChyaWRfaW4gPj0gbWFwLT5pbnB1dF9iYXNlICsgbWFwLT5pZF9jb3VudCkpCisJCXJldHVybiAtRU5YSU87CisKKwkqcmlkX291dCA9IG1hcC0+b3V0cHV0X2Jhc2UgKyAocmlkX2luIC0gbWFwLT5pbnB1dF9iYXNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhY3BpX2lvcnRfbm9kZSAqaW9ydF9ub2RlX21hcF9yaWQoc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlLAorCQkJCQkJdTMyIHJpZF9pbiwgdTMyICpyaWRfb3V0LAorCQkJCQkJdTggdHlwZSkKK3sKKwl1MzIgcmlkID0gcmlkX2luOworCisJLyogUGFyc2UgdGhlIElEIG1hcHBpbmcgdHJlZSB0byBmaW5kIHNwZWNpZmllZCBub2RlIHR5cGUgKi8KKwl3aGlsZSAobm9kZSkgeworCQlzdHJ1Y3QgYWNwaV9pb3J0X2lkX21hcHBpbmcgKm1hcDsKKwkJaW50IGk7CisKKwkJaWYgKG5vZGUtPnR5cGUgPT0gdHlwZSkgeworCQkJaWYgKHJpZF9vdXQpCisJCQkJKnJpZF9vdXQgPSByaWQ7CisJCQlyZXR1cm4gbm9kZTsKKwkJfQorCisJCWlmICghbm9kZS0+bWFwcGluZ19vZmZzZXQgfHwgIW5vZGUtPm1hcHBpbmdfY291bnQpCisJCQlnb3RvIGZhaWxfbWFwOworCisJCW1hcCA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X2lkX21hcHBpbmcsIG5vZGUsCisJCQkJICAgbm9kZS0+bWFwcGluZ19vZmZzZXQpOworCisJCS8qIEZpcm13YXJlIGJ1ZyEgKi8KKwkJaWYgKCFtYXAtPm91dHB1dF9yZWZlcmVuY2UpIHsKKwkJCXByX2VycihGV19CVUcgIltub2RlICVwIHR5cGUgJWRdIElEIG1hcCBoYXMgTlVMTCBwYXJlbnQgcmVmZXJlbmNlXG4iLAorCQkJICAgICAgIG5vZGUsIG5vZGUtPnR5cGUpOworCQkJZ290byBmYWlsX21hcDsKKwkJfQorCisJCS8qIERvIHRoZSBSSUQgdHJhbnNsYXRpb24gKi8KKwkJZm9yIChpID0gMDsgaSA8IG5vZGUtPm1hcHBpbmdfY291bnQ7IGkrKywgbWFwKyspIHsKKwkJCWlmICghaW9ydF9pZF9tYXAobWFwLCBub2RlLT50eXBlLCByaWQsICZyaWQpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gbm9kZS0+bWFwcGluZ19jb3VudCkKKwkJCWdvdG8gZmFpbF9tYXA7CisKKwkJbm9kZSA9IEFDUElfQUREX1BUUihzdHJ1Y3QgYWNwaV9pb3J0X25vZGUsIGlvcnRfdGFibGUsCisJCQkJICAgIG1hcC0+b3V0cHV0X3JlZmVyZW5jZSk7CisJfQorCitmYWlsX21hcDoKKwkvKiBNYXAgaW5wdXQgUklEIHRvIG91dHB1dCBSSUQgdW5jaGFuZ2VkIG9uIG1hcHBpbmcgZmFpbHVyZSovCisJaWYgKHJpZF9vdXQpCisJCSpyaWRfb3V0ID0gcmlkX2luOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKmlvcnRfZmluZF9kZXZfbm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9idXMgKnBidXM7CisKKwlpZiAoIWRldl9pc19wY2koZGV2KSkKKwkJcmV0dXJuIGlvcnRfc2Nhbl9ub2RlKEFDUElfSU9SVF9OT0RFX05BTUVEX0NPTVBPTkVOVCwKKwkJCQkgICAgICBpb3J0X21hdGNoX25vZGVfY2FsbGJhY2ssIGRldik7CisKKwkvKiBGaW5kIGEgUENJIHJvb3QgYnVzICovCisJcGJ1cyA9IHRvX3BjaV9kZXYoZGV2KS0+YnVzOworCXdoaWxlICghcGNpX2lzX3Jvb3RfYnVzKHBidXMpKQorCQlwYnVzID0gcGJ1cy0+cGFyZW50OworCisJcmV0dXJuIGlvcnRfc2Nhbl9ub2RlKEFDUElfSU9SVF9OT0RFX1BDSV9ST09UX0NPTVBMRVgsCisJCQkgICAgICBpb3J0X21hdGNoX25vZGVfY2FsbGJhY2ssICZwYnVzLT5kZXYpOworfQorCisvKioKKyAqIGlvcnRfbXNpX21hcF9yaWQoKSAtIE1hcCBhIE1TSSByZXF1ZXN0ZXIgSUQgZm9yIGEgZGV2aWNlCisgKiBAZGV2OiBUaGUgZGV2aWNlIGZvciB3aGljaCB0aGUgbWFwcGluZyBpcyB0byBiZSBkb25lLgorICogQHJlcV9pZDogVGhlIGRldmljZSByZXF1ZXN0ZXIgSUQuCisgKgorICogUmV0dXJuczogbWFwcGVkIE1TSSBSSUQgb24gc3VjY2VzcywgaW5wdXQgcmVxdWVzdGVyIElEIG90aGVyd2lzZQorICovCit1MzIgaW9ydF9tc2lfbWFwX3JpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiByZXFfaWQpCit7CisJc3RydWN0IGFjcGlfaW9ydF9ub2RlICpub2RlOworCXUzMiBkZXZfaWQ7CisKKwlub2RlID0gaW9ydF9maW5kX2Rldl9ub2RlKGRldik7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gcmVxX2lkOworCisJaW9ydF9ub2RlX21hcF9yaWQobm9kZSwgcmVxX2lkLCAmZGV2X2lkLCBBQ1BJX0lPUlRfTk9ERV9JVFNfR1JPVVApOworCXJldHVybiBkZXZfaWQ7Cit9CisKKy8qKgorICogaW9ydF9kZXZfZmluZF9pdHNfaWQoKSAtIEZpbmQgdGhlIElUUyBpZGVudGlmaWVyIGZvciBhIGRldmljZQorICogQGRldjogVGhlIGRldmljZS4KKyAqIEBpZHg6IEluZGV4IG9mIHRoZSBJVFMgaWRlbnRpZmllciBsaXN0LgorICogQGl0c19pZDogSVRTIGlkZW50aWZpZXIuCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBpb3J0X2Rldl9maW5kX2l0c19pZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiByZXFfaWQsCisJCQkJdW5zaWduZWQgaW50IGlkeCwgaW50ICppdHNfaWQpCit7CisJc3RydWN0IGFjcGlfaW9ydF9pdHNfZ3JvdXAgKml0czsKKwlzdHJ1Y3QgYWNwaV9pb3J0X25vZGUgKm5vZGU7CisKKwlub2RlID0gaW9ydF9maW5kX2Rldl9ub2RlKGRldik7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gLUVOWElPOworCisJbm9kZSA9IGlvcnRfbm9kZV9tYXBfcmlkKG5vZGUsIHJlcV9pZCwgTlVMTCwgQUNQSV9JT1JUX05PREVfSVRTX0dST1VQKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAtRU5YSU87CisKKwkvKiBNb3ZlIHRvIElUUyBzcGVjaWZpYyBkYXRhICovCisJaXRzID0gKHN0cnVjdCBhY3BpX2lvcnRfaXRzX2dyb3VwICopbm9kZS0+bm9kZV9kYXRhOworCWlmIChpZHggPiBpdHMtPml0c19jb3VudCkgeworCQlkZXZfZXJyKGRldiwgInJlcXVlc3RlZCBJVFMgSUQgaW5kZXggWyVkXSBpcyBncmVhdGVyIHRoYW4gYXZhaWxhYmxlIFslZF1cbiIsCisJCQlpZHgsIGl0cy0+aXRzX2NvdW50KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkqaXRzX2lkID0gaXRzLT5pZGVudGlmaWVyc1tpZHhdOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlvcnRfZ2V0X2RldmljZV9kb21haW4oKSAtIEZpbmQgTVNJIGRvbWFpbiByZWxhdGVkIHRvIGEgZGV2aWNlCisgKiBAZGV2OiBUaGUgZGV2aWNlLgorICogQHJlcV9pZDogUmVxdWVzdGVyIElEIGZvciB0aGUgZGV2aWNlLgorICoKKyAqIFJldHVybnM6IHRoZSBNU0kgZG9tYWluIGZvciB0aGlzIGRldmljZSwgTlVMTCBvdGhlcndpc2UKKyAqLworc3RydWN0IGlycV9kb21haW4gKmlvcnRfZ2V0X2RldmljZV9kb21haW4oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVxX2lkKQoreworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpoYW5kbGU7CisJaW50IGl0c19pZDsKKworCWlmIChpb3J0X2Rldl9maW5kX2l0c19pZChkZXYsIHJlcV9pZCwgMCwgJml0c19pZCkpCisJCXJldHVybiBOVUxMOworCisJaGFuZGxlID0gaW9ydF9maW5kX2RvbWFpbl90b2tlbihpdHNfaWQpOworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBpcnFfZmluZF9tYXRjaGluZ19md25vZGUoaGFuZGxlLCBET01BSU5fQlVTX1BDSV9NU0kpOworfQorCit2b2lkIF9faW5pdCBhY3BpX2lvcnRfaW5pdCh2b2lkKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0lPUlQsIDAsICZpb3J0X3RhYmxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgeworCQljb25zdCBjaGFyICptc2cgPSBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZ2V0IHRhYmxlLCAlc1xuIiwgbXNnKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwppbmRleCBhYjIzNDc5Li45M2VjYWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKQEAgLTczMywxNSArNzMzLDE3IEBACiAJCQlyZXR1cm4gcmVzdWx0OwogCQlhY3BpX2JhdHRlcnlfaW5pdF9hbGFybShiYXR0ZXJ5KTsKIAl9CisKKwlyZXN1bHQgPSBhY3BpX2JhdHRlcnlfZ2V0X3N0YXRlKGJhdHRlcnkpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisJYWNwaV9iYXR0ZXJ5X3F1aXJrcyhiYXR0ZXJ5KTsKKwogCWlmICghYmF0dGVyeS0+YmF0KSB7CiAJCXJlc3VsdCA9IHN5c2ZzX2FkZF9iYXR0ZXJ5KGJhdHRlcnkpOwogCQlpZiAocmVzdWx0KQogCQkJcmV0dXJuIHJlc3VsdDsKIAl9Ci0JcmVzdWx0ID0gYWNwaV9iYXR0ZXJ5X2dldF9zdGF0ZShiYXR0ZXJ5KTsKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OwotCWFjcGlfYmF0dGVyeV9xdWlya3MoYmF0dGVyeSk7CiAKIAkvKgogCSAqIFdha2V1cCB0aGUgc3lzdGVtIGlmIGJhdHRlcnkgaXMgY3JpdGljYWwgbG93CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnVzLmMgYi9kcml2ZXJzL2FjcGkvYnVzLmMKaW5kZXggODViN2QwNy4uNTYxOTBkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1cy5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXMuYwpAQCAtMzYsNiArMzYsNyBAQAogI2lmZGVmIENPTkZJR19YODYKICNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9hY3BpX2lvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhY3BpL2FwZWkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KQEAgLTk4NSw3ICs5ODYsOCBAQAogCQlnb3RvIGVycm9yMDsKIAl9CiAKLQlpZiAoYWNwaV9nYmxfZ3JvdXBfbW9kdWxlX2xldmVsX2NvZGUpIHsKKwlpZiAoIWFjcGlfZ2JsX3BhcnNlX3RhYmxlX2FzX3Rlcm1fbGlzdCAmJgorCSAgICBhY3BpX2dibF9ncm91cF9tb2R1bGVfbGV2ZWxfY29kZSkgewogCQlzdGF0dXMgPSBhY3BpX2xvYWRfdGFibGVzKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWApAQCAtMTA3NCw3ICsxMDc2LDggQEAKIAlzdGF0dXMgPSBhY3BpX2VjX2VjZHRfcHJvYmUoKTsKIAkvKiBJZ25vcmUgcmVzdWx0LiBOb3QgaGF2aW5nIGFuIEVDRFQgaXMgbm90IGZhdGFsLiAqLwogCi0JaWYgKCFhY3BpX2dibF9ncm91cF9tb2R1bGVfbGV2ZWxfY29kZSkgeworCWlmIChhY3BpX2dibF9wYXJzZV90YWJsZV9hc190ZXJtX2xpc3QgfHwKKwkgICAgIWFjcGlfZ2JsX2dyb3VwX21vZHVsZV9sZXZlbF9jb2RlKSB7CiAJCXN0YXR1cyA9IGFjcGlfbG9hZF90YWJsZXMoKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCkBAIC0xMTg2LDYgKzExODksNyBAQAogCX0KIAogCXBjaV9tbWNmZ19sYXRlX2luaXQoKTsKKwlhY3BpX2lvcnRfaW5pdCgpOwogCWFjcGlfc2Nhbl9pbml0KCk7CiAJYWNwaV9lY19pbml0KCk7CiAJYWNwaV9kZWJ1Z2ZzX2luaXQoKTsKQEAgLTExOTMsNiArMTE5Nyw3IEBACiAJYWNwaV93YWtldXBfZGV2aWNlX2luaXQoKTsKIAlhY3BpX2RlYnVnZ2VyX2luaXQoKTsKIAlhY3BpX3NldHVwX3NiX25vdGlmeV9oYW5kbGVyKCk7CisJYWNwaV9zZXRfcHJvY2Vzc29yX21hcHBpbmcoKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1dHRvbi5jIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCmluZGV4IDMxYWJiMGIuLmUxOWY1MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXR0b24uYworKysgYi9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKQEAgLTE5LDYgKzE5LDggQEAKICAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSAiQUNQSSA6IGJ1dHRvbjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTEwNCw2ICsxMDYsOCBAQAogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OwogCWNoYXIgcGh5c1szMl07CQkJLyogZm9yIGlucHV0IGRldmljZSAqLwogCXVuc2lnbmVkIGxvbmcgcHVzaGVkOworCWludCBsYXN0X3N0YXRlOworCWt0aW1lX3QgbGFzdF90aW1lOwogCWJvb2wgc3VzcGVuZGVkOwogfTsKIApAQCAtMTExLDYgKzExNSwxMCBAQAogc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZSAqbGlkX2RldmljZTsKIHN0YXRpYyB1OCBsaWRfaW5pdF9zdGF0ZSA9IEFDUElfQlVUVE9OX0xJRF9JTklUX01FVEhPRDsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgbGlkX3JlcG9ydF9pbnRlcnZhbCBfX3JlYWRfbW9zdGx5ID0gNTAwOworbW9kdWxlX3BhcmFtKGxpZF9yZXBvcnRfaW50ZXJ2YWwsIHVsb25nLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobGlkX3JlcG9ydF9pbnRlcnZhbCwgIkludGVydmFsIChtcykgYmV0d2VlbiBsaWQga2V5IGV2ZW50cyIpOworCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMzQsMTAgKzE0Miw3OSBAQAogewogCXN0cnVjdCBhY3BpX2J1dHRvbiAqYnV0dG9uID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwogCWludCByZXQ7CisJa3RpbWVfdCBuZXh0X3JlcG9ydDsKKwlib29sIGRvX3VwZGF0ZTsKIAotCS8qIGlucHV0IGxheWVyIGNoZWNrcyBpZiBldmVudCBpcyByZWR1bmRhbnQgKi8KLQlpbnB1dF9yZXBvcnRfc3dpdGNoKGJ1dHRvbi0+aW5wdXQsIFNXX0xJRCwgIXN0YXRlKTsKLQlpbnB1dF9zeW5jKGJ1dHRvbi0+aW5wdXQpOworCS8qCisJICogSW4gbGlkX2luaXRfc3RhdGU9aWdub3JlIG1vZGUsIGlmIHVzZXIgb3BlbnMvY2xvc2VzIGxpZAorCSAqIGZyZXF1ZW50bHkgd2l0aCAib3BlbiIgbWlzc2luZywgYW5kICJsYXN0X3RpbWUiIGlzIGFsc28gdXBkYXRlZAorCSAqIGZyZXF1ZW50bHksICJjbG9zZSIgY2Fubm90IGJlIGRlbGl2ZXJlZCB0byB0aGUgdXNlcnNwYWNlLgorCSAqIFNvICJsYXN0X3RpbWUiIGlzIG9ubHkgdXBkYXRlZCBhZnRlciBhIHRpbWVvdXQgb3IgYW4gYWN0dWFsCisJICogc3dpdGNoLgorCSAqLworCWlmIChsaWRfaW5pdF9zdGF0ZSAhPSBBQ1BJX0JVVFRPTl9MSURfSU5JVF9JR05PUkUgfHwKKwkgICAgYnV0dG9uLT5sYXN0X3N0YXRlICE9ICEhc3RhdGUpCisJCWRvX3VwZGF0ZSA9IHRydWU7CisJZWxzZQorCQlkb191cGRhdGUgPSBmYWxzZTsKKworCW5leHRfcmVwb3J0ID0ga3RpbWVfYWRkKGJ1dHRvbi0+bGFzdF90aW1lLAorCQkJCW1zX3RvX2t0aW1lKGxpZF9yZXBvcnRfaW50ZXJ2YWwpKTsKKwlpZiAoYnV0dG9uLT5sYXN0X3N0YXRlID09ICEhc3RhdGUgJiYKKwkgICAga3RpbWVfYWZ0ZXIoa3RpbWVfZ2V0KCksIG5leHRfcmVwb3J0KSkgeworCQkvKiBDb21wbGFpbiB0aGUgYnVnZ3kgZmlybXdhcmUgKi8KKwkJcHJfd2Fybl9vbmNlKCJUaGUgbGlkIGRldmljZSBpcyBub3QgY29tcGxpYW50IHRvIFNXX0xJRC5cbiIpOworCisJCS8qCisJCSAqIFNlbmQgdGhlIHVucmVsaWFibGUgY29tcGxlbWVudCBzd2l0Y2ggZXZlbnQ6CisJCSAqCisJCSAqIE9uIG1vc3QgcGxhdGZvcm1zLCB0aGUgbGlkIGRldmljZSBpcyByZWxpYWJsZS4gSG93ZXZlcgorCQkgKiB0aGVyZSBhcmUgZXhjZXB0aW9uczoKKwkJICogMS4gUGxhdGZvcm1zIHJldHVybmluZyBpbml0aWFsIGxpZCBzdGF0ZSBhcyAiY2xvc2UiIGJ5CisJCSAqICAgIGRlZmF1bHQgYWZ0ZXIgYm9vdGluZy9yZXN1bWluZzoKKwkJICogICAgIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODkyMTEKKwkJICogICAgIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA2MTUxCisJCSAqIDIuIFBsYXRmb3JtcyBuZXZlciByZXBvcnRpbmcgIm9wZW4iIGV2ZW50czoKKwkJICogICAgIGh0dHBzOi8vYnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTA2OTQxCisJCSAqIE9uIHRoZXNlIGJ1Z2d5IHBsYXRmb3JtcywgdGhlIHVzYWdlIG1vZGVsIG9mIHRoZSBBQ1BJCisJCSAqIGxpZCBkZXZpY2UgYWN0dWFsbHkgaXM6CisJCSAqIDEuIFRoZSBpbml0aWFsIHJldHVybmluZyB2YWx1ZSBvZiBfTElEIG1heSBub3QgYmUKKwkJICogICAgcmVsaWFibGUuCisJCSAqIDIuIFRoZSBvcGVuIGV2ZW50IG1heSBub3QgYmUgcmVsaWFibGUuCisJCSAqIDMuIFRoZSBjbG9zZSBldmVudCBpcyByZWxpYWJsZS4KKwkJICoKKwkJICogQnV0IFNXX0xJRCBpcyB0eXBlZCBhcyBpbnB1dCBzd2l0Y2ggZXZlbnQsIHRoZSBpbnB1dAorCQkgKiBsYXllciBjaGVja3MgaWYgdGhlIGV2ZW50IGlzIHJlZHVuZGFudC4gSGVuY2UgaWYgdGhlCisJCSAqIHN0YXRlIGlzIG5vdCBzd2l0Y2hlZCwgdGhlIHVzZXJzcGFjZSBjYW5ub3Qgc2VlIHRoaXMKKwkJICogcGxhdGZvcm0gdHJpZ2dlcmVkIHJlbGlhYmxlIGV2ZW50LiBCeSBpbnNlcnRpbmcgYQorCQkgKiBjb21wbGVtZW50IHN3aXRjaCBldmVudCwgaXQgdGhlbiBpcyBndWFyYW50ZWVkIHRoYXQgdGhlCisJCSAqIHBsYXRmb3JtIHRyaWdnZXJlZCByZWxpYWJsZSBvbmUgY2FuIGFsd2F5cyBiZSBzZWVuIGJ5CisJCSAqIHRoZSB1c2Vyc3BhY2UuCisJCSAqLworCQlpZiAobGlkX2luaXRfc3RhdGUgPT0gQUNQSV9CVVRUT05fTElEX0lOSVRfSUdOT1JFKSB7CisJCQlkb191cGRhdGUgPSB0cnVlOworCQkJLyoKKwkJCSAqIERvIGdlbmVyYXRlIGNvbXBsZW1lbnQgc3dpdGNoIGV2ZW50IGZvciAiY2xvc2UiCisJCQkgKiBhcyAiY2xvc2UiIGlzIHJlbGlhYmxlIGFuZCB3cm9uZyAib3BlbiIgd29uJ3QKKwkJCSAqIHRyaWdnZXIgdW5leHBlY3RlZCBiZWhhdmlvcnMuCisJCQkgKiBEbyBub3QgZ2VuZXJhdGUgY29tcGxlbWVudCBzd2l0Y2ggZXZlbnQgZm9yCisJCQkgKiAib3BlbiIgYXMgIm9wZW4iIGlzIG5vdCByZWxpYWJsZSBhbmQgd3JvbmcKKwkJCSAqICJjbG9zZSIgd2lsbCB0cmlnZ2VyIHVuZXhwZWN0ZWQgYmVoYXZpb3JzLgorCQkJICovCisJCQlpZiAoIXN0YXRlKSB7CisJCQkJaW5wdXRfcmVwb3J0X3N3aXRjaChidXR0b24tPmlucHV0LAorCQkJCQkJICAgIFNXX0xJRCwgc3RhdGUpOworCQkJCWlucHV0X3N5bmMoYnV0dG9uLT5pbnB1dCk7CisJCQl9CisJCX0KKwl9CisJLyogU2VuZCB0aGUgcGxhdGZvcm0gdHJpZ2dlcmVkIHJlbGlhYmxlIGV2ZW50ICovCisJaWYgKGRvX3VwZGF0ZSkgeworCQlpbnB1dF9yZXBvcnRfc3dpdGNoKGJ1dHRvbi0+aW5wdXQsIFNXX0xJRCwgIXN0YXRlKTsKKwkJaW5wdXRfc3luYyhidXR0b24tPmlucHV0KTsKKwkJYnV0dG9uLT5sYXN0X3N0YXRlID0gISFzdGF0ZTsKKwkJYnV0dG9uLT5sYXN0X3RpbWUgPSBrdGltZV9nZXQoKTsKKwl9CiAKIAlpZiAoc3RhdGUpCiAJCXBtX3dha2V1cF9ldmVudCgmZGV2aWNlLT5kZXYsIDApOwpAQCAtNDExLDYgKzQ4OCw4IEBACiAJCXN0cmNweShuYW1lLCBBQ1BJX0JVVFRPTl9ERVZJQ0VfTkFNRV9MSUQpOwogCQlzcHJpbnRmKGNsYXNzLCAiJXMvJXMiLAogCQkJQUNQSV9CVVRUT05fQ0xBU1MsIEFDUElfQlVUVE9OX1NVQkNMQVNTX0xJRCk7CisJCWJ1dHRvbi0+bGFzdF9zdGF0ZSA9ICEhYWNwaV9saWRfZXZhbHVhdGVfc3RhdGUoZGV2aWNlKTsKKwkJYnV0dG9uLT5sYXN0X3RpbWUgPSBrdGltZV9nZXQoKTsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJVbnN1cHBvcnRlZCBoaWQgWyVzXVxuIiwgaGlkKTsKIAkJZXJyb3IgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2NwcGNfYWNwaS5jIGIvZHJpdmVycy9hY3BpL2NwcGNfYWNwaS5jCmluZGV4IDJlOTgxNzMuLmQwZDA1MDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9jcHBjX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvY3BwY19hY3BpLmMKQEAgLTQwLDE1ICs0MCw0OCBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKICNpbmNsdWRlIDxhY3BpL2NwcGNfYWNwaS5oPgotLyoKLSAqIExvY2sgdG8gcHJvdmlkZSBtdXR1YWxseSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBQQ0MKLSAqIGNoYW5uZWwuIGUuZy4gV2hlbiB0aGUgcmVtb3RlIHVwZGF0ZXMgdGhlIHNoYXJlZCByZWdpb24KLSAqIHdpdGggbmV3IGRhdGEsIHRoZSByZWFkZXIgbmVlZHMgdG8gYmUgcHJvdGVjdGVkIGZyb20KLSAqIG90aGVyIENQVXMgYWN0aXZpdHkgb24gdGhlIHNhbWUgY2hhbm5lbC4KLSAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhwY2NfbG9jayk7CisKK3N0cnVjdCBjcHBjX3BjY19kYXRhIHsKKwlzdHJ1Y3QgbWJveF9jaGFuICpwY2NfY2hhbm5lbDsKKwl2b2lkIF9faW9tZW0gKnBjY19jb21tX2FkZHI7CisJaW50IHBjY19zdWJzcGFjZV9pZHg7CisJYm9vbCBwY2NfY2hhbm5lbF9hY3F1aXJlZDsKKwlrdGltZV90IGRlYWRsaW5lOworCXVuc2lnbmVkIGludCBwY2NfbXBhciwgcGNjX21ydHQsIHBjY19ub21pbmFsOworCisJYm9vbCBwZW5kaW5nX3BjY193cml0ZV9jbWQ7CS8qIEFueSBwZW5kaW5nL2JhdGNoZWQgUENDIHdyaXRlIGNtZHM/ICovCisJYm9vbCBwbGF0Zm9ybV9vd25zX3BjYzsJCS8qIE93bmVyc2hpcCBvZiBQQ0Mgc3Vic3BhY2UgKi8KKwl1bnNpZ25lZCBpbnQgcGNjX3dyaXRlX2NudDsJLyogUnVubmluZyBjb3VudCBvZiBQQ0Mgd3JpdGUgY29tbWFuZHMgKi8KKworCS8qCisJICogTG9jayB0byBwcm92aWRlIGNvbnRyb2xsZWQgYWNjZXNzIHRvIHRoZSBQQ0MgY2hhbm5lbC4KKwkgKgorCSAqIEZvciBwZXJmb3JtYW5jZSBjcml0aWNhbCB1c2VjYXNlcyhjdXJyZW50bHkgY3BwY19zZXRfcGVyZikKKwkgKglXZSBuZWVkIHRvIHRha2UgcmVhZF9sb2NrIGFuZCBjaGVjayBpZiBjaGFubmVsIGJlbG9uZ3MgdG8gT1NQTQorCSAqIGJlZm9yZSByZWFkaW5nIG9yIHdyaXRpbmcgdG8gUENDIHN1YnNwYWNlCisJICoJV2UgbmVlZCB0byB0YWtlIHdyaXRlX2xvY2sgYmVmb3JlIHRyYW5zZmVycmluZyB0aGUgY2hhbm5lbAorCSAqIG93bmVyc2hpcCB0byB0aGUgcGxhdGZvcm0gdmlhIGEgRG9vcmJlbGwKKwkgKglUaGlzIGFsbG93cyB1cyB0byBiYXRjaCBhIG51bWJlciBvZiBDUFBDIHJlcXVlc3RzIGlmIHRoZXkgaGFwcGVuCisJICogdG8gb3JpZ2luYXRlIGluIGFib3V0IHRoZSBzYW1lIHRpbWUKKwkgKgorCSAqIEZvciBub24tcGVyZm9ybWFuY2UgY3JpdGljYWwgdXNlY2FzZXMoaW5pdCkKKwkgKglUYWtlIHdyaXRlX2xvY2sgZm9yIGFsbCBwdXJwb3NlcyB3aGljaCBnaXZlcyBleGNsdXNpdmUgYWNjZXNzCisJICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBwY2NfbG9jazsKKworCS8qIFdhaXQgcXVldWUgZm9yIENQVXMgd2hvc2UgcmVxdWVzdHMgd2VyZSBiYXRjaGVkICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcGNjX3dyaXRlX3dhaXRfcTsKK307CisKKy8qIFN0cnVjdHVyZSB0byByZXByZXNlbnQgdGhlIHNpbmdsZSBQQ0MgY2hhbm5lbCAqLworc3RhdGljIHN0cnVjdCBjcHBjX3BjY19kYXRhIHBjY19kYXRhID0geworCS5wY2Nfc3Vic3BhY2VfaWR4ID0gLTEsCisJLnBsYXRmb3JtX293bnNfcGNjID0gdHJ1ZSwKK307CiAKIC8qCiAgKiBUaGUgY3BjX2Rlc2Mgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBBQ1BJIHJlZ2lzdGVyIGRldGFpbHMKQEAgLTU5LDE4ICs5MiwyNSBAQAogICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwY19kZXNjICosIGNwY19kZXNjX3B0cik7CiAKLS8qIFRoaXMgbGF5ZXIgaGFuZGxlcyBhbGwgdGhlIFBDQyBzcGVjaWZpY3MgZm9yIENQUEMuICovCi1zdGF0aWMgc3RydWN0IG1ib3hfY2hhbiAqcGNjX2NoYW5uZWw7Ci1zdGF0aWMgdm9pZCBfX2lvbWVtICpwY2NfY29tbV9hZGRyOwotc3RhdGljIHU2NCBjb21tX2Jhc2VfYWRkcjsKLXN0YXRpYyBpbnQgcGNjX3N1YnNwYWNlX2lkeCA9IC0xOwotc3RhdGljIGJvb2wgcGNjX2NoYW5uZWxfYWNxdWlyZWQ7Ci1zdGF0aWMga3RpbWVfdCBkZWFkbGluZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGNjX21wYXIsIHBjY19tcnR0OwotCiAvKiBwY2MgbWFwcGVkIGFkZHJlc3MgKyBoZWFkZXIgc2l6ZSArIG9mZnNldCB3aXRoaW4gUENDIHN1YnNwYWNlICovCi0jZGVmaW5lIEdFVF9QQ0NfVkFERFIob2ZmcykgKHBjY19jb21tX2FkZHIgKyAweDggKyAob2ZmcykpCisjZGVmaW5lIEdFVF9QQ0NfVkFERFIob2ZmcykgKHBjY19kYXRhLnBjY19jb21tX2FkZHIgKyAweDggKyAob2ZmcykpCiAKKy8qIENoZWNrIGlmIGEgQ1BDIHJlZ3NpdGVyIGlzIGluIFBDQyAqLworI2RlZmluZSBDUENfSU5fUENDKGNwYykgKChjcGMpLT50eXBlID09IEFDUElfVFlQRV9CVUZGRVIgJiYJCVwKKwkJCQkoY3BjKS0+Y3BjX2VudHJ5LnJlZy5zcGFjZV9pZCA9PQlcCisJCQkJQUNQSV9BRFJfU1BBQ0VfUExBVEZPUk1fQ09NTSkKKworLyogRXZhbHV0ZXMgdG8gVHJ1ZSBpZiByZWcgaXMgYSBOVUxMIHJlZ2lzdGVyIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgSVNfTlVMTF9SRUcocmVnKSAoKHJlZyktPnNwYWNlX2lkID09ICBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZICYmIFwKKwkJCQkocmVnKS0+YWRkcmVzcyA9PSAwICYmCQkJXAorCQkJCShyZWcpLT5iaXRfd2lkdGggPT0gMCAmJgkJXAorCQkJCShyZWcpLT5iaXRfb2Zmc2V0ID09IDAgJiYJCVwKKwkJCQkocmVnKS0+YWNjZXNzX3dpZHRoID09IDApCisKKy8qIEV2YWx1dGVzIHRvIFRydWUgaWYgYW4gb3B0aW9uYWwgY3BjIGZpZWxkIGlzIHN1cHBvcnRlZCAqLworI2RlZmluZSBDUENfU1VQUE9SVEVEKGNwYykgKChjcGMpLT50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSID8JCVwKKwkJCQkhIShjcGMpLT5jcGNfZW50cnkuaW50X3ZhbHVlIDoJCVwKKwkJCQkhSVNfTlVMTF9SRUcoJihjcGMpLT5jcGNfZW50cnkucmVnKSkKIC8qCiAgKiBBcmJpdHJhcnkgUmV0cmllcyBpbiBjYXNlIHRoZSByZW1vdGUgcHJvY2Vzc29yIGlzIHNsb3cgdG8gcmVzcG9uZAogICogdG8gUENDIGNvbW1hbmRzLiBLZWVwaW5nIGl0IGhpZ2ggZW5vdWdoIHRvIGNvdmVyIGVtdWxhdG9ycyB3aGVyZQpAQCAtNzgsMTEgKzExOCw3OSBAQAogICovCiAjZGVmaW5lIE5VTV9SRVRSSUVTIDUwMAogCi1zdGF0aWMgaW50IGNoZWNrX3BjY19jaGFuKHZvaWQpCitzdHJ1Y3QgY3BwY19hdHRyIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKKwlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYywgc3NpemVfdCBjb3VudCk7Cit9OworCisjZGVmaW5lIGRlZmluZV9vbmVfY3BwY19ybyhfbmFtZSkJCVwKK3N0YXRpYyBzdHJ1Y3QgY3BwY19hdHRyIF9uYW1lID0JCQlcCitfX0FUVFIoX25hbWUsIDA0NDQsIHNob3dfIyNfbmFtZSwgTlVMTCkKKworI2RlZmluZSB0b19jcGNfZGVzYyhhKSBjb250YWluZXJfb2YoYSwgc3RydWN0IGNwY19kZXNjLCBrb2JqKQorCitzdGF0aWMgc3NpemVfdCBzaG93X2ZlZWRiYWNrX2N0cnMoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQlpbnQgcmV0ID0gLUVJTzsKLQlzdHJ1Y3QgYWNwaV9wY2N0X3NoYXJlZF9tZW1vcnkgX19pb21lbSAqZ2VuZXJpY19jb21tX2Jhc2UgPSBwY2NfY29tbV9hZGRyOwotCWt0aW1lX3QgbmV4dF9kZWFkbGluZSA9IGt0aW1lX2FkZChrdGltZV9nZXQoKSwgZGVhZGxpbmUpOworCXN0cnVjdCBjcGNfZGVzYyAqY3BjX3B0ciA9IHRvX2NwY19kZXNjKGtvYmopOworCXN0cnVjdCBjcHBjX3BlcmZfZmJfY3RycyBmYl9jdHJzID0gezB9OworCisJY3BwY19nZXRfcGVyZl9jdHJzKGNwY19wdHItPmNwdV9pZCwgJmZiX2N0cnMpOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgInJlZjolbGx1IGRlbDolbGx1XG4iLAorCQkJZmJfY3Rycy5yZWZlcmVuY2UsIGZiX2N0cnMuZGVsaXZlcmVkKTsKK30KK2RlZmluZV9vbmVfY3BwY19ybyhmZWVkYmFja19jdHJzKTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19yZWZlcmVuY2VfcGVyZihzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBjcGNfZGVzYyAqY3BjX3B0ciA9IHRvX2NwY19kZXNjKGtvYmopOworCXN0cnVjdCBjcHBjX3BlcmZfZmJfY3RycyBmYl9jdHJzID0gezB9OworCisJY3BwY19nZXRfcGVyZl9jdHJzKGNwY19wdHItPmNwdV9pZCwgJmZiX2N0cnMpOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVsbHVcbiIsCisJCQlmYl9jdHJzLnJlZmVyZW5jZV9wZXJmKTsKK30KK2RlZmluZV9vbmVfY3BwY19ybyhyZWZlcmVuY2VfcGVyZik7CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfd3JhcGFyb3VuZF90aW1lKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgY3BjX2Rlc2MgKmNwY19wdHIgPSB0b19jcGNfZGVzYyhrb2JqKTsKKwlzdHJ1Y3QgY3BwY19wZXJmX2ZiX2N0cnMgZmJfY3RycyA9IHswfTsKKworCWNwcGNfZ2V0X3BlcmZfY3RycyhjcGNfcHRyLT5jcHVfaWQsICZmYl9jdHJzKTsKKworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlbGx1XG4iLCBmYl9jdHJzLmN0cl93cmFwX3RpbWUpOworCit9CitkZWZpbmVfb25lX2NwcGNfcm8od3JhcGFyb3VuZF90aW1lKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNwcGNfYXR0cnNbXSA9IHsKKwkmZmVlZGJhY2tfY3Rycy5hdHRyLAorCSZyZWZlcmVuY2VfcGVyZi5hdHRyLAorCSZ3cmFwYXJvdW5kX3RpbWUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBjcHBjX2t0eXBlID0geworCS5zeXNmc19vcHMgPSAma29ial9zeXNmc19vcHMsCisJLmRlZmF1bHRfYXR0cnMgPSBjcHBjX2F0dHJzLAorfTsKKworc3RhdGljIGludCBjaGVja19wY2NfY2hhbihib29sIGNoa19lcnJfYml0KQoreworCWludCByZXQgPSAtRUlPLCBzdGF0dXMgPSAwOworCXN0cnVjdCBhY3BpX3BjY3Rfc2hhcmVkX21lbW9yeSBfX2lvbWVtICpnZW5lcmljX2NvbW1fYmFzZSA9IHBjY19kYXRhLnBjY19jb21tX2FkZHI7CisJa3RpbWVfdCBuZXh0X2RlYWRsaW5lID0ga3RpbWVfYWRkKGt0aW1lX2dldCgpLCBwY2NfZGF0YS5kZWFkbGluZSk7CisKKwlpZiAoIXBjY19kYXRhLnBsYXRmb3JtX293bnNfcGNjKQorCQlyZXR1cm4gMDsKIAogCS8qIFJldHJ5IGluIGNhc2UgdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2FzIHRvbyBzbG93IHRvIGNhdGNoIHVwLiAqLwogCXdoaWxlICgha3RpbWVfYWZ0ZXIoa3RpbWVfZ2V0KCksIG5leHRfZGVhZGxpbmUpKSB7CkBAIC05MSw4ICsxOTksMTEgQEAKIAkJICogcGxhdGZvcm0gYW5kIHNob3VsZCBoYXZlIHNldCB0aGUgY29tbWFuZCBjb21wbGV0aW9uIGJpdCB3aGVuCiAJCSAqIFBDQyBjYW4gYmUgdXNlZCBieSBPU1BNCiAJCSAqLwotCQlpZiAocmVhZHdfcmVsYXhlZCgmZ2VuZXJpY19jb21tX2Jhc2UtPnN0YXR1cykgJiBQQ0NfQ01EX0NPTVBMRVRFKSB7CisJCXN0YXR1cyA9IHJlYWR3X3JlbGF4ZWQoJmdlbmVyaWNfY29tbV9iYXNlLT5zdGF0dXMpOworCQlpZiAoc3RhdHVzICYgUENDX0NNRF9DT01QTEVURV9NQVNLKSB7CiAJCQlyZXQgPSAwOworCQkJaWYgKGNoa19lcnJfYml0ICYmIChzdGF0dXMgJiBQQ0NfRVJST1JfTUFTSykpCisJCQkJcmV0ID0gLUVJTzsKIAkJCWJyZWFrOwogCQl9CiAJCS8qCkBAIC0xMDIsMTQgKzIxMywyMyBAQAogCQl1ZGVsYXkoMyk7CiAJfQogCisJaWYgKGxpa2VseSghcmV0KSkKKwkJcGNjX2RhdGEucGxhdGZvcm1fb3duc19wY2MgPSBmYWxzZTsKKwllbHNlCisJCXByX2VycigiUENDIGNoZWNrIGNoYW5uZWwgZmFpbGVkLiBTdGF0dXM9JXhcbiIsIHN0YXR1cyk7CisKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogVGhpcyBmdW5jdGlvbiB0cmFuc2ZlcnMgdGhlIG93bmVyc2hpcCBvZiB0aGUgUENDIHRvIHRoZSBwbGF0Zm9ybQorICogU28gaXQgbXVzdCBiZSBjYWxsZWQgd2hpbGUgaG9sZGluZyB3cml0ZV9sb2NrKHBjY19sb2NrKQorICovCiBzdGF0aWMgaW50IHNlbmRfcGNjX2NtZCh1MTYgY21kKQogewotCWludCByZXQgPSAtRUlPOworCWludCByZXQgPSAtRUlPLCBpOwogCXN0cnVjdCBhY3BpX3BjY3Rfc2hhcmVkX21lbW9yeSAqZ2VuZXJpY19jb21tX2Jhc2UgPQotCQkoc3RydWN0IGFjcGlfcGNjdF9zaGFyZWRfbWVtb3J5ICopIHBjY19jb21tX2FkZHI7CisJCShzdHJ1Y3QgYWNwaV9wY2N0X3NoYXJlZF9tZW1vcnkgKikgcGNjX2RhdGEucGNjX2NvbW1fYWRkcjsKIAlzdGF0aWMga3RpbWVfdCBsYXN0X2NtZF9jbXBsX3RpbWUsIGxhc3RfbXBhcl9yZXNldDsKIAlzdGF0aWMgaW50IG1wYXJfY291bnQ7CiAJdW5zaWduZWQgaW50IHRpbWVfZGVsdGE7CkBAIC0xMTksMjAgKzIzOSwyOSBAQAogCSAqIHRoZSBjaGFubmVsIGJlZm9yZSB3cml0aW5nIHRvIFBDQyBzcGFjZQogCSAqLwogCWlmIChjbWQgPT0gQ01EX1JFQUQpIHsKLQkJcmV0ID0gY2hlY2tfcGNjX2NoYW4oKTsKKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIHBlbmRpbmcgY3BjX3dyaXRlcywgdGhlbiB3ZSBzdG9sZSB0aGUgY2hhbm5lbAorCQkgKiBiZWZvcmUgd3JpdGUgY29tcGxldGlvbiwgc28gZmlyc3Qgc2VuZCBhIFdSSVRFIGNvbW1hbmQgdG8KKwkJICogcGxhdGZvcm0KKwkJICovCisJCWlmIChwY2NfZGF0YS5wZW5kaW5nX3BjY193cml0ZV9jbWQpCisJCQlzZW5kX3BjY19jbWQoQ01EX1dSSVRFKTsKKworCQlyZXQgPSBjaGVja19wY2NfY2hhbihmYWxzZSk7CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KKwkJCWdvdG8gZW5kOworCX0gZWxzZSAvKiBDTURfV1JJVEUgKi8KKwkJcGNjX2RhdGEucGVuZGluZ19wY2Nfd3JpdGVfY21kID0gRkFMU0U7CiAKIAkvKgogCSAqIEhhbmRsZSB0aGUgTWluaW11bSBSZXF1ZXN0IFR1cm5hcm91bmQgVGltZShNUlRUKQogCSAqICJUaGUgbWluaW11bSBhbW91bnQgb2YgdGltZSB0aGF0IE9TUE0gbXVzdCB3YWl0IGFmdGVyIHRoZSBjb21wbGV0aW9uCiAJICogb2YgYSBjb21tYW5kIGJlZm9yZSBpc3N1aW5nIHRoZSBuZXh0IGNvbW1hbmQsIGluIG1pY3Jvc2Vjb25kcyIKIAkgKi8KLQlpZiAocGNjX21ydHQpIHsKKwlpZiAocGNjX2RhdGEucGNjX21ydHQpIHsKIAkJdGltZV9kZWx0YSA9IGt0aW1lX3VzX2RlbHRhKGt0aW1lX2dldCgpLCBsYXN0X2NtZF9jbXBsX3RpbWUpOwotCQlpZiAocGNjX21ydHQgPiB0aW1lX2RlbHRhKQotCQkJdWRlbGF5KHBjY19tcnR0IC0gdGltZV9kZWx0YSk7CisJCWlmIChwY2NfZGF0YS5wY2NfbXJ0dCA+IHRpbWVfZGVsdGEpCisJCQl1ZGVsYXkocGNjX2RhdGEucGNjX21ydHQgLSB0aW1lX2RlbHRhKTsKIAl9CiAKIAkvKgpAQCAtMTQ2LDE1ICsyNzUsMTYgQEAKIAkgKiBub3Qgc2VuZCB0aGUgcmVxdWVzdCB0byB0aGUgcGxhdGZvcm0gYWZ0ZXIgaGl0dGluZyB0aGUgTVBBUiBsaW1pdCBpbgogCSAqIGFueSA2MHMgd2luZG93CiAJICovCi0JaWYgKHBjY19tcGFyKSB7CisJaWYgKHBjY19kYXRhLnBjY19tcGFyKSB7CiAJCWlmIChtcGFyX2NvdW50ID09IDApIHsKIAkJCXRpbWVfZGVsdGEgPSBrdGltZV9tc19kZWx0YShrdGltZV9nZXQoKSwgbGFzdF9tcGFyX3Jlc2V0KTsKIAkJCWlmICh0aW1lX2RlbHRhIDwgNjAgKiBNU0VDX1BFUl9TRUMpIHsKIAkJCQlwcl9kZWJ1ZygiUENDIGNtZCBub3Qgc2VudCBkdWUgdG8gTVBBUiBsaW1pdCIpOwotCQkJCXJldHVybiAtRUlPOworCQkJCXJldCA9IC1FSU87CisJCQkJZ290byBlbmQ7CiAJCQl9CiAJCQlsYXN0X21wYXJfcmVzZXQgPSBrdGltZV9nZXQoKTsKLQkJCW1wYXJfY291bnQgPSBwY2NfbXBhcjsKKwkJCW1wYXJfY291bnQgPSBwY2NfZGF0YS5wY2NfbXBhcjsKIAkJfQogCQltcGFyX2NvdW50LS07CiAJfQpAQCAtMTY1LDMzICsyOTUsNDMgQEAKIAkvKiBGbGlwIENNRCBDT01QTEVURSBiaXQgKi8KIAl3cml0ZXdfcmVsYXhlZCgwLCAmZ2VuZXJpY19jb21tX2Jhc2UtPnN0YXR1cyk7CiAKKwlwY2NfZGF0YS5wbGF0Zm9ybV9vd25zX3BjYyA9IHRydWU7CisKIAkvKiBSaW5nIGRvb3JiZWxsICovCi0JcmV0ID0gbWJveF9zZW5kX21lc3NhZ2UocGNjX2NoYW5uZWwsICZjbWQpOworCXJldCA9IG1ib3hfc2VuZF9tZXNzYWdlKHBjY19kYXRhLnBjY19jaGFubmVsLCAmY21kKTsKIAlpZiAocmV0IDwgMCkgewogCQlwcl9lcnIoIkVyciBzZW5kaW5nIFBDQyBtYm94IG1lc3NhZ2UuIGNtZDolZCwgcmV0OiVkXG4iLAogCQkJCWNtZCwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlbmQ7CiAJfQogCi0JLyoKLQkgKiBGb3IgUkVBRHMgd2UgbmVlZCB0byBlbnN1cmUgdGhlIGNtZCBjb21wbGV0ZWQgdG8gZW5zdXJlCi0JICogdGhlIGVuc3VpbmcgcmVhZCgpcyBjYW4gcHJvY2VlZC4gRm9yIFdSSVRFcyB3ZSBkb250IGNhcmUKLQkgKiBiZWNhdXNlIHRoZSBhY3R1YWwgd3JpdGUoKXMgYXJlIGRvbmUgYmVmb3JlIGNvbWluZyBoZXJlCi0JICogYW5kIHRoZSBuZXh0IFJFQUQgb3IgV1JJVEUgd2lsbCBjaGVjayBpZiB0aGUgY2hhbm5lbAotCSAqIGlzIGJ1c3kvZnJlZSBhdCB0aGUgZW50cnkgb2YgdGhpcyBjYWxsLgotCSAqCi0JICogSWYgTWluaW11bSBSZXF1ZXN0IFR1cm5hcm91bmQgVGltZSBpcyBub24temVybywgd2UgbmVlZAotCSAqIHRvIHJlY29yZCB0aGUgY29tcGxldGlvbiB0aW1lIG9mIGJvdGggUkVBRCBhbmQgV1JJVEUKLQkgKiBjb21tYW5kIGZvciBwcm9wZXIgaGFuZGxpbmcgb2YgTVJUVCwgc28gd2UgbmVlZCB0byBjaGVjawotCSAqIGZvciBwY2NfbXJ0dCBpbiBhZGRpdGlvbiB0byBDTURfUkVBRAotCSAqLwotCWlmIChjbWQgPT0gQ01EX1JFQUQgfHwgcGNjX21ydHQpIHsKLQkJcmV0ID0gY2hlY2tfcGNjX2NoYW4oKTsKLQkJaWYgKHBjY19tcnR0KQotCQkJbGFzdF9jbWRfY21wbF90aW1lID0ga3RpbWVfZ2V0KCk7CisJLyogd2FpdCBmb3IgY29tcGxldGlvbiBhbmQgY2hlY2sgZm9yIFBDQyBlcnJybyBiaXQgKi8KKwlyZXQgPSBjaGVja19wY2NfY2hhbih0cnVlKTsKKworCWlmIChwY2NfZGF0YS5wY2NfbXJ0dCkKKwkJbGFzdF9jbWRfY21wbF90aW1lID0ga3RpbWVfZ2V0KCk7CisKKwlpZiAocGNjX2RhdGEucGNjX2NoYW5uZWwtPm1ib3gtPnR4ZG9uZV9pcnEpCisJCW1ib3hfY2hhbl90eGRvbmUocGNjX2RhdGEucGNjX2NoYW5uZWwsIHJldCk7CisJZWxzZQorCQltYm94X2NsaWVudF90eGRvbmUocGNjX2RhdGEucGNjX2NoYW5uZWwsIHJldCk7CisKK2VuZDoKKwlpZiAoY21kID09IENNRF9XUklURSkgeworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJCQlzdHJ1Y3QgY3BjX2Rlc2MgKmRlc2MgPSBwZXJfY3B1KGNwY19kZXNjX3B0ciwgaSk7CisJCQkJaWYgKCFkZXNjKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChkZXNjLT53cml0ZV9jbWRfaWQgPT0gcGNjX2RhdGEucGNjX3dyaXRlX2NudCkKKwkJCQkJZGVzYy0+d3JpdGVfY21kX3N0YXR1cyA9IHJldDsKKwkJCX0KKwkJfQorCQlwY2NfZGF0YS5wY2Nfd3JpdGVfY250Kys7CisJCXdha2VfdXBfYWxsKCZwY2NfZGF0YS5wY2Nfd3JpdGVfd2FpdF9xKTsKIAl9CiAKLQltYm94X2NsaWVudF90eGRvbmUocGNjX2NoYW5uZWwsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjcyLDEzICs0MTIsMTMgQEAKICAqCiAgKglSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgdmFsdWUgZm9yIGVyci4KICAqLwotaW50IGFjcGlfZ2V0X3BzZF9tYXAoc3RydWN0IGNwdWRhdGEgKiphbGxfY3B1X2RhdGEpCitpbnQgYWNwaV9nZXRfcHNkX21hcChzdHJ1Y3QgY3BwY19jcHVkYXRhICoqYWxsX2NwdV9kYXRhKQogewogCWludCBjb3VudF90YXJnZXQ7CiAJaW50IHJldHZhbCA9IDA7CiAJdW5zaWduZWQgaW50IGksIGo7CiAJY3B1bWFza192YXJfdCBjb3ZlcmVkX2NwdXM7Ci0Jc3RydWN0IGNwdWRhdGEgKnByLCAqbWF0Y2hfcHI7CisJc3RydWN0IGNwcGNfY3B1ZGF0YSAqcHIsICptYXRjaF9wcjsKIAlzdHJ1Y3QgYWNwaV9wc2RfcGFja2FnZSAqcGRvbWFpbjsKIAlzdHJ1Y3QgYWNwaV9wc2RfcGFja2FnZSAqbWF0Y2hfcGRvbWFpbjsKIAlzdHJ1Y3QgY3BjX2Rlc2MgKmNwY19wdHIsICptYXRjaF9jcGNfcHRyOwpAQCAtMzk0LDE0ICs1MzQsMTMgQEAKIHN0YXRpYyBpbnQgcmVnaXN0ZXJfcGNjX2NoYW5uZWwoaW50IHBjY19zdWJzcGFjZV9pZHgpCiB7CiAJc3RydWN0IGFjcGlfcGNjdF9od19yZWR1Y2VkICpjcHBjX3NzOwotCXVuc2lnbmVkIGludCBsZW47CiAJdTY0IHVzZWNzX2xhdDsKIAogCWlmIChwY2Nfc3Vic3BhY2VfaWR4ID49IDApIHsKLQkJcGNjX2NoYW5uZWwgPSBwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoJmNwcGNfbWJveF9jbCwKKwkJcGNjX2RhdGEucGNjX2NoYW5uZWwgPSBwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoJmNwcGNfbWJveF9jbCwKIAkJCQlwY2Nfc3Vic3BhY2VfaWR4KTsKIAotCQlpZiAoSVNfRVJSKHBjY19jaGFubmVsKSkgeworCQlpZiAoSVNfRVJSKHBjY19kYXRhLnBjY19jaGFubmVsKSkgewogCQkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCBQQ0MgY29tbXVuaWNhdGlvbiBjaGFubmVsXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CkBAIC00MTIsNyArNTUxLDcgQEAKIAkJICogUENDIGNoYW5uZWxzKSBhbmQgc3RvcmVkIHBvaW50ZXJzIHRvIHRoZQogCQkgKiBzdWJzcGFjZSBjb21tdW5pY2F0aW9uIHJlZ2lvbiBpbiBjb25fcHJpdi4KIAkJICovCi0JCWNwcGNfc3MgPSBwY2NfY2hhbm5lbC0+Y29uX3ByaXY7CisJCWNwcGNfc3MgPSAocGNjX2RhdGEucGNjX2NoYW5uZWwpLT5jb25fcHJpdjsKIAogCQlpZiAoIWNwcGNfc3MpIHsKIAkJCXByX2VycigiTm8gUENDIHN1YnNwYWNlIGZvdW5kIGZvciBDUFBDXG4iKTsKQEAgLTQyMCwzNSArNTU5LDQyIEBACiAJCX0KIAogCQkvKgotCQkgKiBUaGlzIGlzIHRoZSBzaGFyZWQgY29tbXVuaWNhdGlvbiByZWdpb24KLQkJICogZm9yIHRoZSBPUyBhbmQgUGxhdGZvcm0gdG8gY29tbXVuaWNhdGUgb3Zlci4KLQkJICovCi0JCWNvbW1fYmFzZV9hZGRyID0gY3BwY19zcy0+YmFzZV9hZGRyZXNzOwotCQlsZW4gPSBjcHBjX3NzLT5sZW5ndGg7Ci0KLQkJLyoKIAkJICogY3BwY19zcy0+bGF0ZW5jeSBpcyBqdXN0IGEgTm9taW5hbCB2YWx1ZS4gSW4gcmVhbGl0eQogCQkgKiB0aGUgcmVtb3RlIHByb2Nlc3NvciBjb3VsZCBiZSBtdWNoIHNsb3dlciB0byByZXBseS4KIAkJICogU28gYWRkIGFuIGFyYml0cmFyeSBhbW91bnQgb2Ygd2FpdCBvbiB0b3Agb2YgTm9taW5hbC4KIAkJICovCiAJCXVzZWNzX2xhdCA9IE5VTV9SRVRSSUVTICogY3BwY19zcy0+bGF0ZW5jeTsKLQkJZGVhZGxpbmUgPSBuc190b19rdGltZSh1c2Vjc19sYXQgKiBOU0VDX1BFUl9VU0VDKTsKLQkJcGNjX21ydHQgPSBjcHBjX3NzLT5taW5fdHVybmFyb3VuZF90aW1lOwotCQlwY2NfbXBhciA9IGNwcGNfc3MtPm1heF9hY2Nlc3NfcmF0ZTsKKwkJcGNjX2RhdGEuZGVhZGxpbmUgPSBuc190b19rdGltZSh1c2Vjc19sYXQgKiBOU0VDX1BFUl9VU0VDKTsKKwkJcGNjX2RhdGEucGNjX21ydHQgPSBjcHBjX3NzLT5taW5fdHVybmFyb3VuZF90aW1lOworCQlwY2NfZGF0YS5wY2NfbXBhciA9IGNwcGNfc3MtPm1heF9hY2Nlc3NfcmF0ZTsKKwkJcGNjX2RhdGEucGNjX25vbWluYWwgPSBjcHBjX3NzLT5sYXRlbmN5OwogCi0JCXBjY19jb21tX2FkZHIgPSBhY3BpX29zX2lvcmVtYXAoY29tbV9iYXNlX2FkZHIsIGxlbik7Ci0JCWlmICghcGNjX2NvbW1fYWRkcikgeworCQlwY2NfZGF0YS5wY2NfY29tbV9hZGRyID0gYWNwaV9vc19pb3JlbWFwKGNwcGNfc3MtPmJhc2VfYWRkcmVzcywgY3BwY19zcy0+bGVuZ3RoKTsKKwkJaWYgKCFwY2NfZGF0YS5wY2NfY29tbV9hZGRyKSB7CiAJCQlwcl9lcnIoIkZhaWxlZCB0byBpb3JlbWFwIFBDQyBjb21tIHJlZ2lvbiBtZW1cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAogCQkvKiBTZXQgZmxhZyBzbyB0aGF0IHdlIGRvbnQgY29tZSBoZXJlIGZvciBlYWNoIENQVS4gKi8KLQkJcGNjX2NoYW5uZWxfYWNxdWlyZWQgPSB0cnVlOworCQlwY2NfZGF0YS5wY2NfY2hhbm5lbF9hY3F1aXJlZCA9IHRydWU7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogY3BjX2ZmaF9zdXBwb3J0ZWQoKSAtIGNoZWNrIGlmIEZGSCByZWFkaW5nIHN1cHBvcnRlZAorICoKKyAqIENoZWNrIGlmIHRoZSBhcmNoaXRlY3R1cmUgaGFzIHN1cHBvcnQgZm9yIGZ1bmN0aW9uYWwgZml4ZWQgaGFyZHdhcmUKKyAqIHJlYWQvd3JpdGUgY2FwYWJpbGl0eS4KKyAqCisgKiBSZXR1cm46IHRydWUgZm9yIHN1cHBvcnRlZCwgZmFsc2UgZm9yIG5vdCBzdXBwb3J0ZWQKKyAqLworYm9vbCBfX3dlYWsgY3BjX2ZmaF9zdXBwb3J0ZWQodm9pZCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qCiAgKiBBbiBleGFtcGxlIENQQyB0YWJsZSBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmcuCiAgKgpAQCAtNTA3LDYgKzY1Myw3IEBACiAJdW5pb24gYWNwaV9vYmplY3QgKm91dF9vYmosICpjcGNfb2JqOwogCXN0cnVjdCBjcGNfZGVzYyAqY3BjX3B0cjsKIAlzdHJ1Y3QgY3BjX3JlZyAqZ2FzX3Q7CisJc3RydWN0IGRldmljZSAqY3B1X2RldjsKIAlhY3BpX2hhbmRsZSBoYW5kbGUgPSBwci0+aGFuZGxlOwogCXVuc2lnbmVkIGludCBudW1fZW50LCBpLCBjcGNfcmV2OwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTU0NSw2ICs2OTIsOCBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAorCWNwY19wdHItPm51bV9lbnRyaWVzID0gbnVtX2VudDsKKwogCS8qIFNlY29uZCBlbnRyeSBzaG91bGQgYmUgcmV2aXNpb24uICovCiAJY3BjX29iaiA9ICZvdXRfb2JqLT5wYWNrYWdlLmVsZW1lbnRzWzFdOwogCWlmIChjcGNfb2JqLT50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKQl7CkBAIC01NzksMTYgKzcyOCwyNyBAQAogCQkJICogc28gZXh0cmFjdCBpdCBvbmx5IG9uY2UuCiAJCQkgKi8KIAkJCWlmIChnYXNfdC0+c3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfUExBVEZPUk1fQ09NTSkgewotCQkJCWlmIChwY2Nfc3Vic3BhY2VfaWR4IDwgMCkKLQkJCQkJcGNjX3N1YnNwYWNlX2lkeCA9IGdhc190LT5hY2Nlc3Nfd2lkdGg7Ci0JCQkJZWxzZSBpZiAocGNjX3N1YnNwYWNlX2lkeCAhPSBnYXNfdC0+YWNjZXNzX3dpZHRoKSB7CisJCQkJaWYgKHBjY19kYXRhLnBjY19zdWJzcGFjZV9pZHggPCAwKQorCQkJCQlwY2NfZGF0YS5wY2Nfc3Vic3BhY2VfaWR4ID0gZ2FzX3QtPmFjY2Vzc193aWR0aDsKKwkJCQllbHNlIGlmIChwY2NfZGF0YS5wY2Nfc3Vic3BhY2VfaWR4ICE9IGdhc190LT5hY2Nlc3Nfd2lkdGgpIHsKIAkJCQkJcHJfZGVidWcoIk1pc21hdGNoZWQgUENDIGlkcy5cbiIpOwogCQkJCQlnb3RvIG91dF9mcmVlOwogCQkJCX0KLQkJCX0gZWxzZSBpZiAoZ2FzX3QtPnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpIHsKLQkJCQkvKiBTdXBwb3J0IG9ubHkgUENDIGFuZCBTWVMgTUVNIHR5cGUgcmVncyAqLwotCQkJCXByX2RlYnVnKCJVbnN1cHBvcnRlZCByZWdpc3RlciB0eXBlOiAlZFxuIiwgZ2FzX3QtPnNwYWNlX2lkKTsKLQkJCQlnb3RvIG91dF9mcmVlOworCQkJfSBlbHNlIGlmIChnYXNfdC0+c3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX01FTU9SWSkgeworCQkJCWlmIChnYXNfdC0+YWRkcmVzcykgeworCQkJCQl2b2lkIF9faW9tZW0gKmFkZHI7CisKKwkJCQkJYWRkciA9IGlvcmVtYXAoZ2FzX3QtPmFkZHJlc3MsIGdhc190LT5iaXRfd2lkdGgvOCk7CisJCQkJCWlmICghYWRkcikKKwkJCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQkJCWNwY19wdHItPmNwY19yZWdzW2ktMl0uc3lzX21lbV92YWRkciA9IGFkZHI7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoZ2FzX3QtPnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFIHx8ICFjcGNfZmZoX3N1cHBvcnRlZCgpKSB7CisJCQkJCS8qIFN1cHBvcnQgb25seSBQQ0MgLFNZUyBNRU0gYW5kIEZGSCB0eXBlIHJlZ3MgKi8KKwkJCQkJcHJfZGVidWcoIlVuc3VwcG9ydGVkIHJlZ2lzdGVyIHR5cGU6ICVkXG4iLCBnYXNfdC0+c3BhY2VfaWQpOworCQkJCQlnb3RvIG91dF9mcmVlOworCQkJCX0KIAkJCX0KIAogCQkJY3BjX3B0ci0+Y3BjX3JlZ3NbaS0yXS50eXBlID0gQUNQSV9UWVBFX0JVRkZFUjsKQEAgLTYwNywxMCArNzY3LDEzIEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAkvKiBSZWdpc3RlciBQQ0MgY2hhbm5lbCBvbmNlIGZvciBhbGwgQ1BVcy4gKi8KLQlpZiAoIXBjY19jaGFubmVsX2FjcXVpcmVkKSB7Ci0JCXJldCA9IHJlZ2lzdGVyX3BjY19jaGFubmVsKHBjY19zdWJzcGFjZV9pZHgpOworCWlmICghcGNjX2RhdGEucGNjX2NoYW5uZWxfYWNxdWlyZWQpIHsKKwkJcmV0ID0gcmVnaXN0ZXJfcGNjX2NoYW5uZWwocGNjX2RhdGEucGNjX3N1YnNwYWNlX2lkeCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dF9mcmVlOworCisJCWluaXRfcndzZW0oJnBjY19kYXRhLnBjY19sb2NrKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcGNjX2RhdGEucGNjX3dyaXRlX3dhaXRfcSk7CiAJfQogCiAJLyogUGx1ZyBQU0QgZGF0YSBpbnRvIHRoaXMgQ1BVcyBDUEMgZGVzY3JpcHRvci4gKi8KQEAgLTYxOSwxMCArNzgyLDI3IEBACiAJLyogRXZlcnl0aGluZyBsb29rcyBva2F5ICovCiAJcHJfZGVidWcoIlBhcnNlZCBDUEMgc3RydWN0IGZvciBDUFU6ICVkXG4iLCBwci0+aWQpOwogCisJLyogQWRkIHBlciBsb2dpY2FsIENQVSBub2RlcyBmb3IgcmVhZGluZyBpdHMgZmVlZGJhY2sgY291bnRlcnMuICovCisJY3B1X2RldiA9IGdldF9jcHVfZGV2aWNlKHByLT5pZCk7CisJaWYgKCFjcHVfZGV2KQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmNwY19wdHItPmtvYmosICZjcHBjX2t0eXBlLCAmY3B1X2Rldi0+a29iaiwKKwkJCSJhY3BpX2NwcGMiKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlOworCiAJa2ZyZWUob3V0cHV0LnBvaW50ZXIpOwogCXJldHVybiAwOwogCiBvdXRfZnJlZToKKwkvKiBGcmVlIGFsbCB0aGUgbWFwcGVkIHN5cyBtZW0gYXJlYXMgZm9yIHRoaXMgQ1BVICovCisJZm9yIChpID0gMjsgaSA8IGNwY19wdHItPm51bV9lbnRyaWVzOyBpKyspIHsKKwkJdm9pZCBfX2lvbWVtICphZGRyID0gY3BjX3B0ci0+Y3BjX3JlZ3NbaS0yXS5zeXNfbWVtX3ZhZGRyOworCisJCWlmIChhZGRyKQorCQkJaW91bm1hcChhZGRyKTsKKwl9CiAJa2ZyZWUoY3BjX3B0cik7CiAKIG91dF9idWZfZnJlZToKQEAgLTY0MCwyNiArODIwLDgyIEBACiB2b2lkIGFjcGlfY3BwY19wcm9jZXNzb3JfZXhpdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQogewogCXN0cnVjdCBjcGNfZGVzYyAqY3BjX3B0cjsKKwl1bnNpZ25lZCBpbnQgaTsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisKIAljcGNfcHRyID0gcGVyX2NwdShjcGNfZGVzY19wdHIsIHByLT5pZCk7CisKKwkvKiBGcmVlIGFsbCB0aGUgbWFwcGVkIHN5cyBtZW0gYXJlYXMgZm9yIHRoaXMgQ1BVICovCisJZm9yIChpID0gMjsgaSA8IGNwY19wdHItPm51bV9lbnRyaWVzOyBpKyspIHsKKwkJYWRkciA9IGNwY19wdHItPmNwY19yZWdzW2ktMl0uc3lzX21lbV92YWRkcjsKKwkJaWYgKGFkZHIpCisJCQlpb3VubWFwKGFkZHIpOworCX0KKworCWtvYmplY3RfcHV0KCZjcGNfcHRyLT5rb2JqKTsKIAlrZnJlZShjcGNfcHRyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFjcGlfY3BwY19wcm9jZXNzb3JfZXhpdCk7CiAKKy8qKgorICogY3BjX3JlYWRfZmZoKCkgLSBSZWFkIEZGSCByZWdpc3RlcgorICogQGNwdW51bToJY3B1IG51bWJlciB0byByZWFkCisgKiBAcmVnOgljcHBjIHJlZ2lzdGVyIGluZm9ybWF0aW9uCisgKiBAdmFsOglwbGFjZSBob2xkZXIgZm9yIHJldHVybiB2YWx1ZQorICoKKyAqIFJlYWQgYml0X3dpZHRoIGJpdHMgZnJvbSBhIHNwZWNpZmllZCBhZGRyZXNzIGFuZCBiaXRfb2Zmc2V0CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIGFuZCBlcnJvciBjb2RlCisgKi8KK2ludCBfX3dlYWsgY3BjX3JlYWRfZmZoKGludCBjcHVudW0sIHN0cnVjdCBjcGNfcmVnICpyZWcsIHU2NCAqdmFsKQoreworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKKy8qKgorICogY3BjX3dyaXRlX2ZmaCgpIC0gV3JpdGUgRkZIIHJlZ2lzdGVyCisgKiBAY3B1bnVtOgljcHUgbnVtYmVyIHRvIHdyaXRlCisgKiBAcmVnOgljcHBjIHJlZ2lzdGVyIGluZm9ybWF0aW9uCisgKiBAdmFsOgl2YWx1ZSB0byB3cml0ZQorICoKKyAqIFdyaXRlIHZhbHVlIG9mIGJpdF93aWR0aCBiaXRzIHRvIGEgc3BlY2lmaWVkIGFkZHJlc3MgYW5kIGJpdF9vZmZzZXQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MgYW5kIGVycm9yIGNvZGUKKyAqLworaW50IF9fd2VhayBjcGNfd3JpdGVfZmZoKGludCBjcHVudW0sIHN0cnVjdCBjcGNfcmVnICpyZWcsIHU2NCB2YWwpCit7CisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKwogLyoKICAqIFNpbmNlIGNwY19yZWFkIGFuZCBjcGNfd3JpdGUgYXJlIGNhbGxlZCB3aGlsZSBob2xkaW5nIHBjY19sb2NrLCBpdCBzaG91bGQgYmUKICAqIGFzIGZhc3QgYXMgcG9zc2libGUuIFdlIGhhdmUgYWxyZWFkeSBtYXBwZWQgdGhlIFBDQyBzdWJzcGFjZSBkdXJpbmcgaW5pdCwgc28KICAqIHdlIGNhbiBkaXJlY3RseSB3cml0ZSB0byBpdC4KICAqLwogCi1zdGF0aWMgaW50IGNwY19yZWFkKHN0cnVjdCBjcGNfcmVnICpyZWcsIHU2NCAqdmFsKQorc3RhdGljIGludCBjcGNfcmVhZChpbnQgY3B1LCBzdHJ1Y3QgY3BjX3JlZ2lzdGVyX3Jlc291cmNlICpyZWdfcmVzLCB1NjQgKnZhbCkKIHsKIAlpbnQgcmV0X3ZhbCA9IDA7CisJdm9pZCBfX2lvbWVtICp2YWRkciA9IDA7CisJc3RydWN0IGNwY19yZWcgKnJlZyA9ICZyZWdfcmVzLT5jcGNfZW50cnkucmVnOworCisJaWYgKHJlZ19yZXMtPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJKnZhbCA9IHJlZ19yZXMtPmNwY19lbnRyeS5pbnRfdmFsdWU7CisJCXJldHVybiByZXRfdmFsOworCX0KIAogCSp2YWwgPSAwOwotCWlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHsKLQkJdm9pZCBfX2lvbWVtICp2YWRkciA9IEdFVF9QQ0NfVkFERFIocmVnLT5hZGRyZXNzKTsKKwlpZiAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKQorCQl2YWRkciA9IEdFVF9QQ0NfVkFERFIocmVnLT5hZGRyZXNzKTsKKwllbHNlIGlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpCisJCXZhZGRyID0gcmVnX3Jlcy0+c3lzX21lbV92YWRkcjsKKwllbHNlIGlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKQorCQlyZXR1cm4gY3BjX3JlYWRfZmZoKGNwdSwgcmVnLCB2YWwpOworCWVsc2UKKwkJcmV0dXJuIGFjcGlfb3NfcmVhZF9tZW1vcnkoKGFjcGlfcGh5c2ljYWxfYWRkcmVzcylyZWctPmFkZHJlc3MsCisJCQkJdmFsLCByZWctPmJpdF93aWR0aCk7CiAKLQkJc3dpdGNoIChyZWctPmJpdF93aWR0aCkgeworCXN3aXRjaCAocmVnLT5iaXRfd2lkdGgpIHsKIAkJY2FzZSA4OgogCQkJKnZhbCA9IHJlYWRiX3JlbGF4ZWQodmFkZHIpOwogCQkJYnJlYWs7CkBAIC02NzQsMjMgKzkxMCwzMCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlwcl9kZWJ1ZygiRXJyb3I6IENhbm5vdCByZWFkICV1IGJpdCB3aWR0aCBmcm9tIFBDQ1xuIiwKLQkJCQlyZWctPmJpdF93aWR0aCk7CisJCQkJCXJlZy0+Yml0X3dpZHRoKTsKIAkJCXJldF92YWwgPSAtRUZBVUxUOwotCQl9Ci0JfSBlbHNlCi0JCXJldF92YWwgPSBhY3BpX29zX3JlYWRfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpcmVnLT5hZGRyZXNzLAotCQkJCQl2YWwsIHJlZy0+Yml0X3dpZHRoKTsKKwl9CisKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIAotc3RhdGljIGludCBjcGNfd3JpdGUoc3RydWN0IGNwY19yZWcgKnJlZywgdTY0IHZhbCkKK3N0YXRpYyBpbnQgY3BjX3dyaXRlKGludCBjcHUsIHN0cnVjdCBjcGNfcmVnaXN0ZXJfcmVzb3VyY2UgKnJlZ19yZXMsIHU2NCB2YWwpCiB7CiAJaW50IHJldF92YWwgPSAwOworCXZvaWQgX19pb21lbSAqdmFkZHIgPSAwOworCXN0cnVjdCBjcGNfcmVnICpyZWcgPSAmcmVnX3Jlcy0+Y3BjX2VudHJ5LnJlZzsKIAotCWlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHsKLQkJdm9pZCBfX2lvbWVtICp2YWRkciA9IEdFVF9QQ0NfVkFERFIocmVnLT5hZGRyZXNzKTsKKwlpZiAocmVnLT5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKQorCQl2YWRkciA9IEdFVF9QQ0NfVkFERFIocmVnLT5hZGRyZXNzKTsKKwllbHNlIGlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpCisJCXZhZGRyID0gcmVnX3Jlcy0+c3lzX21lbV92YWRkcjsKKwllbHNlIGlmIChyZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX0ZJWEVEX0hBUkRXQVJFKQorCQlyZXR1cm4gY3BjX3dyaXRlX2ZmaChjcHUsIHJlZywgdmFsKTsKKwllbHNlCisJCXJldHVybiBhY3BpX29zX3dyaXRlX21lbW9yeSgoYWNwaV9waHlzaWNhbF9hZGRyZXNzKXJlZy0+YWRkcmVzcywKKwkJCQl2YWwsIHJlZy0+Yml0X3dpZHRoKTsKIAotCQlzd2l0Y2ggKHJlZy0+Yml0X3dpZHRoKSB7CisJc3dpdGNoIChyZWctPmJpdF93aWR0aCkgewogCQljYXNlIDg6CiAJCQl3cml0ZWJfcmVsYXhlZCh2YWwsIHZhZGRyKTsKIAkJCWJyZWFrOwpAQCAtNzA1LDEzICs5NDgsMTEgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJfZGVidWcoIkVycm9yOiBDYW5ub3Qgd3JpdGUgJXUgYml0IHdpZHRoIHRvIFBDQ1xuIiwKLQkJCQlyZWctPmJpdF93aWR0aCk7CisJCQkJCXJlZy0+Yml0X3dpZHRoKTsKIAkJCXJldF92YWwgPSAtRUZBVUxUOwogCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UKLQkJcmV0X3ZhbCA9IGFjcGlfb3Nfd3JpdGVfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpcmVnLT5hZGRyZXNzLAotCQkJCXZhbCwgcmVnLT5iaXRfd2lkdGgpOworCX0KKwogCXJldHVybiByZXRfdmFsOwogfQogCkBAIC03MjcsOCArOTY4LDggQEAKIAlzdHJ1Y3QgY3BjX2Rlc2MgKmNwY19kZXNjID0gcGVyX2NwdShjcGNfZGVzY19wdHIsIGNwdW51bSk7CiAJc3RydWN0IGNwY19yZWdpc3Rlcl9yZXNvdXJjZSAqaGlnaGVzdF9yZWcsICpsb3dlc3RfcmVnLCAqcmVmX3BlcmYsCiAJCQkJCQkJCSAqbm9tX3BlcmY7Ci0JdTY0IGhpZ2gsIGxvdywgcmVmLCBub207Ci0JaW50IHJldCA9IDA7CisJdTY0IGhpZ2gsIGxvdywgbm9tOworCWludCByZXQgPSAwLCByZWdzX2luX3BjYyA9IDA7CiAKIAlpZiAoIWNwY19kZXNjKSB7CiAJCXByX2RlYnVnKCJObyBDUEMgZGVzY3JpcHRvciBmb3IgQ1BVOiVkXG4iLCBjcHVudW0pOwpAQCAtNzQwLDEzICs5ODEsMTEgQEAKIAlyZWZfcGVyZiA9ICZjcGNfZGVzYy0+Y3BjX3JlZ3NbUkVGRVJFTkNFX1BFUkZdOwogCW5vbV9wZXJmID0gJmNwY19kZXNjLT5jcGNfcmVnc1tOT01JTkFMX1BFUkZdOwogCi0Jc3Bpbl9sb2NrKCZwY2NfbG9jayk7Ci0KIAkvKiBBcmUgYW55IG9mIHRoZSByZWdzIFBDQyA/Ki8KLQlpZiAoKGhpZ2hlc3RfcmVnLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHx8Ci0JCQkobG93ZXN0X3JlZy0+Y3BjX2VudHJ5LnJlZy5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9QTEFURk9STV9DT01NKSB8fAotCQkJKHJlZl9wZXJmLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHx8Ci0JCQkobm9tX3BlcmYtPmNwY19lbnRyeS5yZWcuc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfUExBVEZPUk1fQ09NTSkpIHsKKwlpZiAoQ1BDX0lOX1BDQyhoaWdoZXN0X3JlZykgfHwgQ1BDX0lOX1BDQyhsb3dlc3RfcmVnKSB8fAorCQlDUENfSU5fUENDKHJlZl9wZXJmKSB8fCBDUENfSU5fUENDKG5vbV9wZXJmKSkgeworCQlyZWdzX2luX3BjYyA9IDE7CisJCWRvd25fd3JpdGUoJnBjY19kYXRhLnBjY19sb2NrKTsKIAkJLyogUmluZyBkb29yYmVsbCBvbmNlIHRvIHVwZGF0ZSBQQ0Mgc3Vic3BhY2UgKi8KIAkJaWYgKHNlbmRfcGNjX2NtZChDTURfUkVBRCkgPCAwKSB7CiAJCQlyZXQgPSAtRUlPOwpAQCAtNzU0LDI2ICs5OTMsMjEgQEAKIAkJfQogCX0KIAotCWNwY19yZWFkKCZoaWdoZXN0X3JlZy0+Y3BjX2VudHJ5LnJlZywgJmhpZ2gpOworCWNwY19yZWFkKGNwdW51bSwgaGlnaGVzdF9yZWcsICZoaWdoKTsKIAlwZXJmX2NhcHMtPmhpZ2hlc3RfcGVyZiA9IGhpZ2g7CiAKLQljcGNfcmVhZCgmbG93ZXN0X3JlZy0+Y3BjX2VudHJ5LnJlZywgJmxvdyk7CisJY3BjX3JlYWQoY3B1bnVtLCBsb3dlc3RfcmVnLCAmbG93KTsKIAlwZXJmX2NhcHMtPmxvd2VzdF9wZXJmID0gbG93OwogCi0JY3BjX3JlYWQoJnJlZl9wZXJmLT5jcGNfZW50cnkucmVnLCAmcmVmKTsKLQlwZXJmX2NhcHMtPnJlZmVyZW5jZV9wZXJmID0gcmVmOwotCi0JY3BjX3JlYWQoJm5vbV9wZXJmLT5jcGNfZW50cnkucmVnLCAmbm9tKTsKKwljcGNfcmVhZChjcHVudW0sIG5vbV9wZXJmLCAmbm9tKTsKIAlwZXJmX2NhcHMtPm5vbWluYWxfcGVyZiA9IG5vbTsKIAotCWlmICghcmVmKQotCQlwZXJmX2NhcHMtPnJlZmVyZW5jZV9wZXJmID0gcGVyZl9jYXBzLT5ub21pbmFsX3BlcmY7Ci0KIAlpZiAoIWhpZ2ggfHwgIWxvdyB8fCAhbm9tKQogCQlyZXQgPSAtRUZBVUxUOwogCiBvdXRfZXJyOgotCXNwaW5fdW5sb2NrKCZwY2NfbG9jayk7CisJaWYgKHJlZ3NfaW5fcGNjKQorCQl1cF93cml0ZSgmcGNjX2RhdGEucGNjX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHBjX2dldF9wZXJmX2NhcHMpOwpAQCAtNzg4LDkgKzEwMjIsMTAgQEAKIGludCBjcHBjX2dldF9wZXJmX2N0cnMoaW50IGNwdW51bSwgc3RydWN0IGNwcGNfcGVyZl9mYl9jdHJzICpwZXJmX2ZiX2N0cnMpCiB7CiAJc3RydWN0IGNwY19kZXNjICpjcGNfZGVzYyA9IHBlcl9jcHUoY3BjX2Rlc2NfcHRyLCBjcHVudW0pOwotCXN0cnVjdCBjcGNfcmVnaXN0ZXJfcmVzb3VyY2UgKmRlbGl2ZXJlZF9yZWcsICpyZWZlcmVuY2VfcmVnOwotCXU2NCBkZWxpdmVyZWQsIHJlZmVyZW5jZTsKLQlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgY3BjX3JlZ2lzdGVyX3Jlc291cmNlICpkZWxpdmVyZWRfcmVnLCAqcmVmZXJlbmNlX3JlZywKKwkJKnJlZl9wZXJmX3JlZywgKmN0cl93cmFwX3JlZzsKKwl1NjQgZGVsaXZlcmVkLCByZWZlcmVuY2UsIHJlZl9wZXJmLCBjdHJfd3JhcF90aW1lOworCWludCByZXQgPSAwLCByZWdzX2luX3BjYyA9IDA7CiAKIAlpZiAoIWNwY19kZXNjKSB7CiAJCXByX2RlYnVnKCJObyBDUEMgZGVzY3JpcHRvciBmb3IgQ1BVOiVkXG4iLCBjcHVudW0pOwpAQCAtNzk5LDEyICsxMDM0LDIxIEBACiAKIAlkZWxpdmVyZWRfcmVnID0gJmNwY19kZXNjLT5jcGNfcmVnc1tERUxJVkVSRURfQ1RSXTsKIAlyZWZlcmVuY2VfcmVnID0gJmNwY19kZXNjLT5jcGNfcmVnc1tSRUZFUkVOQ0VfQ1RSXTsKKwlyZWZfcGVyZl9yZWcgPSAmY3BjX2Rlc2MtPmNwY19yZWdzW1JFRkVSRU5DRV9QRVJGXTsKKwljdHJfd3JhcF9yZWcgPSAmY3BjX2Rlc2MtPmNwY19yZWdzW0NUUl9XUkFQX1RJTUVdOwogCi0Jc3Bpbl9sb2NrKCZwY2NfbG9jayk7CisJLyoKKwkgKiBJZiByZWZlcm5jZSBwZXJmIHJlZ2lzdGVyIGlzIG5vdCBzdXBwb3J0ZWQgdGhlbiB3ZSBzaG91bGQKKwkgKiB1c2UgdGhlIG5vbWluYWwgcGVyZiB2YWx1ZQorCSAqLworCWlmICghQ1BDX1NVUFBPUlRFRChyZWZfcGVyZl9yZWcpKQorCQlyZWZfcGVyZl9yZWcgPSAmY3BjX2Rlc2MtPmNwY19yZWdzW05PTUlOQUxfUEVSRl07CiAKIAkvKiBBcmUgYW55IG9mIHRoZSByZWdzIFBDQyA/Ki8KLQlpZiAoKGRlbGl2ZXJlZF9yZWctPmNwY19lbnRyeS5yZWcuc3BhY2VfaWQgPT0gQUNQSV9BRFJfU1BBQ0VfUExBVEZPUk1fQ09NTSkgfHwKLQkJCShyZWZlcmVuY2VfcmVnLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pKSB7CisJaWYgKENQQ19JTl9QQ0MoZGVsaXZlcmVkX3JlZykgfHwgQ1BDX0lOX1BDQyhyZWZlcmVuY2VfcmVnKSB8fAorCQlDUENfSU5fUENDKGN0cl93cmFwX3JlZykgfHwgQ1BDX0lOX1BDQyhyZWZfcGVyZl9yZWcpKSB7CisJCWRvd25fd3JpdGUoJnBjY19kYXRhLnBjY19sb2NrKTsKKwkJcmVnc19pbl9wY2MgPSAxOwogCQkvKiBSaW5nIGRvb3JiZWxsIG9uY2UgdG8gdXBkYXRlIFBDQyBzdWJzcGFjZSAqLwogCQlpZiAoc2VuZF9wY2NfY21kKENNRF9SRUFEKSA8IDApIHsKIAkJCXJldCA9IC1FSU87CkBAIC04MTIsMjUgKzEwNTYsMzEgQEAKIAkJfQogCX0KIAotCWNwY19yZWFkKCZkZWxpdmVyZWRfcmVnLT5jcGNfZW50cnkucmVnLCAmZGVsaXZlcmVkKTsKLQljcGNfcmVhZCgmcmVmZXJlbmNlX3JlZy0+Y3BjX2VudHJ5LnJlZywgJnJlZmVyZW5jZSk7CisJY3BjX3JlYWQoY3B1bnVtLCBkZWxpdmVyZWRfcmVnLCAmZGVsaXZlcmVkKTsKKwljcGNfcmVhZChjcHVudW0sIHJlZmVyZW5jZV9yZWcsICZyZWZlcmVuY2UpOworCWNwY19yZWFkKGNwdW51bSwgcmVmX3BlcmZfcmVnLCAmcmVmX3BlcmYpOwogCi0JaWYgKCFkZWxpdmVyZWQgfHwgIXJlZmVyZW5jZSkgeworCS8qCisJICogUGVyIHNwZWMsIGlmIGN0cl93cmFwX3RpbWUgb3B0aW9uYWwgcmVnaXN0ZXIgaXMgdW5zdXBwb3J0ZWQsIHRoZW4gdGhlCisJICogcGVyZm9ybWFuY2UgY291bnRlcnMgYXJlIGFzc3VtZWQgdG8gbmV2ZXIgd3JhcCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mCisJICogcGxhdGZvcm0KKwkgKi8KKwljdHJfd3JhcF90aW1lID0gKHU2NCkofigodTY0KTApKTsKKwlpZiAoQ1BDX1NVUFBPUlRFRChjdHJfd3JhcF9yZWcpKQorCQljcGNfcmVhZChjcHVudW0sIGN0cl93cmFwX3JlZywgJmN0cl93cmFwX3RpbWUpOworCisJaWYgKCFkZWxpdmVyZWQgfHwgIXJlZmVyZW5jZSB8fAkhcmVmX3BlcmYpIHsKIAkJcmV0ID0gLUVGQVVMVDsKIAkJZ290byBvdXRfZXJyOwogCX0KIAogCXBlcmZfZmJfY3Rycy0+ZGVsaXZlcmVkID0gZGVsaXZlcmVkOwogCXBlcmZfZmJfY3Rycy0+cmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCi0JcGVyZl9mYl9jdHJzLT5kZWxpdmVyZWQgLT0gcGVyZl9mYl9jdHJzLT5wcmV2X2RlbGl2ZXJlZDsKLQlwZXJmX2ZiX2N0cnMtPnJlZmVyZW5jZSAtPSBwZXJmX2ZiX2N0cnMtPnByZXZfcmVmZXJlbmNlOwotCi0JcGVyZl9mYl9jdHJzLT5wcmV2X2RlbGl2ZXJlZCA9IGRlbGl2ZXJlZDsKLQlwZXJmX2ZiX2N0cnMtPnByZXZfcmVmZXJlbmNlID0gcmVmZXJlbmNlOwotCisJcGVyZl9mYl9jdHJzLT5yZWZlcmVuY2VfcGVyZiA9IHJlZl9wZXJmOworCXBlcmZfZmJfY3Rycy0+Y3RyX3dyYXBfdGltZSA9IGN0cl93cmFwX3RpbWU7CiBvdXRfZXJyOgotCXNwaW5fdW5sb2NrKCZwY2NfbG9jayk7CisJaWYgKHJlZ3NfaW5fcGNjKQorCQl1cF93cml0ZSgmcGNjX2RhdGEucGNjX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHBjX2dldF9wZXJmX2N0cnMpOwpAQCAtODU1LDMwICsxMTA1LDE0MiBAQAogCiAJZGVzaXJlZF9yZWcgPSAmY3BjX2Rlc2MtPmNwY19yZWdzW0RFU0lSRURfUEVSRl07CiAKLQlzcGluX2xvY2soJnBjY19sb2NrKTsKLQotCS8qIElmIHRoaXMgaXMgUENDIHJlZywgY2hlY2sgaWYgY2hhbm5lbCBpcyBmcmVlIGJlZm9yZSB3cml0aW5nICovCi0JaWYgKGRlc2lyZWRfcmVnLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHsKLQkJcmV0ID0gY2hlY2tfcGNjX2NoYW4oKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gYnVzeV9jaGFubmVsOworCS8qCisJICogVGhpcyBpcyBQaGFzZS1JIHdoZXJlIHdlIHdhbnQgdG8gd3JpdGUgdG8gQ1BDIHJlZ2lzdGVycworCSAqIC0+IFdlIHdhbnQgYWxsIENQVXMgdG8gYmUgYWJsZSB0byBleGVjdXRlIHRoaXMgcGhhc2UgaW4gcGFyYWxsZWwKKwkgKgorCSAqIFNpbmNlIHJlYWRfbG9jayBjYW4gYmUgYWNxdWlyZWQgYnkgbXVsdGlwbGUgQ1BVcyBzaW11bHRhbmVvdXNseSB3ZQorCSAqIGFjaGlldmUgdGhhdCBnb2FsIGhlcmUKKwkgKi8KKwlpZiAoQ1BDX0lOX1BDQyhkZXNpcmVkX3JlZykpIHsKKwkJZG93bl9yZWFkKCZwY2NfZGF0YS5wY2NfbG9jayk7CS8qIEJFR0lOIFBoYXNlLUkgKi8KKwkJaWYgKHBjY19kYXRhLnBsYXRmb3JtX293bnNfcGNjKSB7CisJCQlyZXQgPSBjaGVja19wY2NfY2hhbihmYWxzZSk7CisJCQlpZiAocmV0KSB7CisJCQkJdXBfcmVhZCgmcGNjX2RhdGEucGNjX2xvY2spOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJLyoKKwkJICogVXBkYXRlIHRoZSBwZW5kaW5nX3dyaXRlIHRvIG1ha2Ugc3VyZSBhIFBDQyBDTURfUkVBRCB3aWxsIG5vdAorCQkgKiBhcnJpdmUgYW5kIHN0ZWFsIHRoZSBjaGFubmVsIGR1cmluZyB0aGUgc3dpdGNoIHRvIHdyaXRlIGxvY2sKKwkJICovCisJCXBjY19kYXRhLnBlbmRpbmdfcGNjX3dyaXRlX2NtZCA9IHRydWU7CisJCWNwY19kZXNjLT53cml0ZV9jbWRfaWQgPSBwY2NfZGF0YS5wY2Nfd3JpdGVfY250OworCQljcGNfZGVzYy0+d3JpdGVfY21kX3N0YXR1cyA9IDA7CiAJfQogCiAJLyoKIAkgKiBTa2lwIHdyaXRpbmcgTUlOL01BWCB1bnRpbCBMaW51eCBrbm93cyBob3cgdG8gY29tZSB1cCB3aXRoCiAJICogdXNlZnVsIHZhbHVlcy4KIAkgKi8KLQljcGNfd3JpdGUoJmRlc2lyZWRfcmVnLT5jcGNfZW50cnkucmVnLCBwZXJmX2N0cmxzLT5kZXNpcmVkX3BlcmYpOworCWNwY193cml0ZShjcHUsIGRlc2lyZWRfcmVnLCBwZXJmX2N0cmxzLT5kZXNpcmVkX3BlcmYpOwogCi0JLyogSXMgdGhpcyBhIFBDQyByZWcgPyovCi0JaWYgKGRlc2lyZWRfcmVnLT5jcGNfZW50cnkucmVnLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1BMQVRGT1JNX0NPTU0pIHsKLQkJLyogUmluZyBkb29yYmVsbCBzbyBSZW1vdGUgY2FuIGdldCBvdXIgcGVyZiByZXF1ZXN0LiAqLwotCQlpZiAoc2VuZF9wY2NfY21kKENNRF9XUklURSkgPCAwKQotCQkJcmV0ID0gLUVJTzsKKwlpZiAoQ1BDX0lOX1BDQyhkZXNpcmVkX3JlZykpCisJCXVwX3JlYWQoJnBjY19kYXRhLnBjY19sb2NrKTsJLyogRU5EIFBoYXNlLUkgKi8KKwkvKgorCSAqIFRoaXMgaXMgUGhhc2UtSUkgd2hlcmUgd2UgdHJhbnNmZXIgdGhlIG93bmVyc2hpcCBvZiBQQ0MgdG8gUGxhdGZvcm0KKwkgKgorCSAqIFNob3J0IFN1bW1hcnk6IEJhc2ljYWxseSBpZiB3ZSB0aGluayBvZiBhIGdyb3VwIG9mIGNwcGNfc2V0X3BlcmYKKwkgKiByZXF1ZXN0cyB0aGF0IGhhcHBlbmVkIGluIHNob3J0IG92ZXJsYXBwaW5nIGludGVydmFsLiBUaGUgbGFzdCBDUFUgdG8KKwkgKiBjb21lIG91dCBvZiBQaGFzZS1JIHdpbGwgZW50ZXIgUGhhc2UtSUkgYW5kIHJpbmcgdGhlIGRvb3JiZWxsLgorCSAqCisJICogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBmb3IgUGhhc2UtSUk6CisJICogICAgIDEuIFdlIHdhbnQgdG8gZXhlY3V0ZSBQaGFzZS1JSSBvbmx5IHdoZW4gdGhlcmUgYXJlIG5vIENQVXMKKwkgKiBjdXJyZW50bHkgZXhlY3V0aW5nIGluIFBoYXNlLUkKKwkgKiAgICAgMi4gT25jZSB3ZSBzdGFydCBQaGFzZS1JSSB3ZSB3YW50IHRvIGF2b2lkIGFsbCBvdGhlciBDUFVzIGZyb20KKwkgKiBlbnRlcmluZyBQaGFzZS1JLgorCSAqICAgICAzLiBXZSB3YW50IG9ubHkgb25lIENQVSBhbW9uZyBhbGwgdGhvc2Ugd2hvIHdlbnQgdGhyb3VnaCBQaGFzZS1JCisJICogdG8gcnVuIHBoYXNlLUlJCisJICoKKwkgKiBJZiB3cml0ZV90cnlsb2NrIGZhaWxzIHRvIGdldCB0aGUgbG9jayBhbmQgZG9lc24ndCB0cmFuc2ZlciB0aGUKKwkgKiBQQ0Mgb3duZXJzaGlwIHRvIHRoZSBwbGF0Zm9ybSwgdGhlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyB3aWxsIGJlIFRSVUUKKwkgKiAgICAgMS4gVGhlcmUgaXMgYXQtbGVhc3Qgb25lIENQVSBpbiBQaGFzZS1JIHdoaWNoIHdpbGwgbGF0ZXIgZXhlY3V0ZQorCSAqIHdyaXRlX3RyeWxvY2ssIHNvIHRoZSBDUFVzIGluIFBoYXNlLUkgd2lsbCBiZSByZXNwb25zaWJsZSBmb3IKKwkgKiBleGVjdXRpbmcgdGhlIFBoYXNlLUlJLgorCSAqICAgICAyLiBTb21lIG90aGVyIENQVSBoYXMgYmVhdGVuIHRoaXMgQ1BVIHRvIHN1Y2Nlc3NmdWxseSBleGVjdXRlIHRoZQorCSAqIHdyaXRlX3RyeWxvY2sgYW5kIGhhcyBhbHJlYWR5IGFjcXVpcmVkIHRoZSB3cml0ZV9sb2NrLiBXZSBrbm93IGZvciBhCisJICogZmFjdCBpdChvdGhlciBDUFUgYWNxdWlyaW5nIHRoZSB3cml0ZV9sb2NrKSBjb3VsZG4ndCBoYXZlIGhhcHBlbmVkCisJICogYmVmb3JlIHRoaXMgQ1BVJ3MgUGhhc2UtSSBhcyB3ZSBoZWxkIHRoZSByZWFkX2xvY2suCisJICogICAgIDMuIFNvbWUgb3RoZXIgQ1BVIGV4ZWN1dGluZyBwY2MgQ01EX1JFQUQgaGFzIHN0b2xlbiB0aGUKKwkgKiBkb3duX3dyaXRlLCBpbiB3aGljaCBjYXNlLCBzZW5kX3BjY19jbWQgd2lsbCBjaGVjayBmb3IgcGVuZGluZworCSAqIENNRF9XUklURSBjb21tYW5kcyBieSBjaGVja2luZyB0aGUgcGVuZGluZ19wY2Nfd3JpdGVfY21kLgorCSAqIFNvIHRoaXMgQ1BVIGNhbiBiZSBjZXJ0YWluIHRoYXQgaXRzIHJlcXVlc3Qgd2lsbCBiZSBkZWxpdmVyZWQKKwkgKiAgICBTbyBpbiBhbGwgY2FzZXMsIHRoaXMgQ1BVIGtub3dzIHRoYXQgaXRzIHJlcXVlc3Qgd2lsbCBiZSBkZWxpdmVyZWQKKwkgKiBieSBhbm90aGVyIENQVSBhbmQgY2FuIHJldHVybgorCSAqCisJICogQWZ0ZXIgZ2V0dGluZyB0aGUgZG93bl93cml0ZSB3ZSBzdGlsbCBuZWVkIHRvIGNoZWNrIGZvcgorCSAqIHBlbmRpbmdfcGNjX3dyaXRlX2NtZCB0byB0YWtlIGNhcmUgb2YgdGhlIGZvbGxvd2luZyBzY2VuYXJpbworCSAqICAgIFRoZSB0aHJlYWQgcnVubmluZyB0aGlzIGNvZGUgY291bGQgYmUgc2NoZWR1bGVkIG91dCBiZXR3ZWVuCisJICogUGhhc2UtSSBhbmQgUGhhc2UtSUkuIEJlZm9yZSBpdCBpcyBzY2hlZHVsZWQgYmFjayBvbiwgYW5vdGhlciBDUFUKKwkgKiBjb3VsZCBoYXZlIGRlbGl2ZXJlZCB0aGUgcmVxdWVzdCB0byBQbGF0Zm9ybSBieSB0cmlnZ2VyaW5nIHRoZQorCSAqIGRvb3JiZWxsIGFuZCB0cmFuc2ZlcnJlZCB0aGUgb3duZXJzaGlwIG9mIFBDQyB0byBwbGF0Zm9ybS4gU28gdGhpcworCSAqIGF2b2lkcyB0cmlnZ2VyaW5nIGFuIHVubmVjZXNzYXJ5IGRvb3JiZWxsIGFuZCBtb3JlIGltcG9ydGFudGx5IGJlZm9yZQorCSAqIHRyaWdnZXJpbmcgdGhlIGRvb3JiZWxsIGl0IG1ha2VzIHN1cmUgdGhhdCB0aGUgUENDIGNoYW5uZWwgb3duZXJzaGlwCisJICogaXMgc3RpbGwgd2l0aCBPU1BNLgorCSAqICAgcGVuZGluZ19wY2Nfd3JpdGVfY21kIGNhbiBhbHNvIGJlIGNsZWFyZWQgYnkgYSBkaWZmZXJlbnQgQ1BVLCBpZgorCSAqIHRoZXJlIHdhcyBhIHBjYyBDTURfUkVBRCB3YWl0aW5nIG9uIGRvd25fd3JpdGUgYW5kIGl0IHN0ZWFscyB0aGUgbG9jaworCSAqIGJlZm9yZSB0aGUgcGNjIENNRF9XUklURSBpcyBjb21wbGV0ZWQuIHBjY19zZW5kX2NtZCBjaGVja3MgZm9yIHRoaXMKKwkgKiBjYXNlIGR1cmluZyBhIENNRF9SRUFEIGFuZCBpZiB0aGVyZSBhcmUgcGVuZGluZyB3cml0ZXMgaXQgZGVsaXZlcnMKKwkgKiB0aGUgd3JpdGUgY29tbWFuZCBiZWZvcmUgc2VydmljaW5nIHRoZSByZWFkIGNvbW1hbmQKKwkgKi8KKwlpZiAoQ1BDX0lOX1BDQyhkZXNpcmVkX3JlZykpIHsKKwkJaWYgKGRvd25fd3JpdGVfdHJ5bG9jaygmcGNjX2RhdGEucGNjX2xvY2spKSB7CS8qIEJFR0lOIFBoYXNlLUlJICovCisJCQkvKiBVcGRhdGUgb25seSBpZiB0aGVyZSBhcmUgcGVuZGluZyB3cml0ZSBjb21tYW5kcyAqLworCQkJaWYgKHBjY19kYXRhLnBlbmRpbmdfcGNjX3dyaXRlX2NtZCkKKwkJCQlzZW5kX3BjY19jbWQoQ01EX1dSSVRFKTsKKwkJCXVwX3dyaXRlKCZwY2NfZGF0YS5wY2NfbG9jayk7CQkvKiBFTkQgUGhhc2UtSUkgKi8KKwkJfSBlbHNlCisJCQkvKiBXYWl0IHVudGlsIHBjY193cml0ZV9jbnQgaXMgdXBkYXRlZCBieSBzZW5kX3BjY19jbWQgKi8KKwkJCXdhaXRfZXZlbnQocGNjX2RhdGEucGNjX3dyaXRlX3dhaXRfcSwKKwkJCQljcGNfZGVzYy0+d3JpdGVfY21kX2lkICE9IHBjY19kYXRhLnBjY193cml0ZV9jbnQpOworCisJCS8qIHNlbmRfcGNjX2NtZCB1cGRhdGVzIHRoZSBzdGF0dXMgaW4gY2FzZSBvZiBmYWlsdXJlICovCisJCXJldCA9IGNwY19kZXNjLT53cml0ZV9jbWRfc3RhdHVzOwogCX0KLWJ1c3lfY2hhbm5lbDoKLQlzcGluX3VubG9jaygmcGNjX2xvY2spOwotCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwcGNfc2V0X3BlcmYpOworCisvKioKKyAqIGNwcGNfZ2V0X3RyYW5zaXRpb25fbGF0ZW5jeSAtIHJldHVybnMgZnJlcXVlbmN5IHRyYW5zaXRpb24gbGF0ZW5jeSBpbiBucworICoKKyAqIEFDUEkgQ1BQQyBkb2VzIG5vdCBleHBsaWNpdGx5IHNwZWNpZml5IGhvdyBhIHBsYXRmb3JtIGNhbiBzcGVjaWZ5IHRoZQorICogdHJhbnNpdGlvbiBsYXRlbmN5IGZvciBwZXJmcm9tYW5jZSBjaGFuZ2UgcmVxdWVzdHMuIFRoZSBjbG9zZXN0IHdlIGhhdmUKKyAqIGlzIHRoZSB0aW1pbmcgaW5mb3JtYXRpb24gZnJvbSB0aGUgUENDVCB0YWJsZXMgd2hpY2ggcHJvdmlkZXMgdGhlIGluZm8KKyAqIG9uIHRoZSBudW1iZXIgYW5kIGZyZXF1ZW5jeSBvZiBQQ0MgY29tbWFuZHMgdGhlIHBsYXRmb3JtIGNhbiBoYW5kbGUuCisgKi8KK3Vuc2lnbmVkIGludCBjcHBjX2dldF90cmFuc2l0aW9uX2xhdGVuY3koaW50IGNwdV9udW0pCit7CisJLyoKKwkgKiBFeHBlY3RlZCB0cmFuc2l0aW9uIGxhdGVuY3kgaXMgYmFzZWQgb24gdGhlIFBDQ1QgdGltaW5nIHZhbHVlcworCSAqIEJlbG93IGFyZSBkZWZpbml0aW9uIGZyb20gQUNQSSBzcGVjOgorCSAqIHBjY19ub21pbmFsLSBFeHBlY3RlZCBsYXRlbmN5IHRvIHByb2Nlc3MgYSBjb21tYW5kLCBpbiBtaWNyb3NlY29uZHMKKwkgKiBwY2NfbXBhciAgIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHBlcmlvZGljIHJlcXVlc3RzIHRoYXQgdGhlIHN1YnNwYWNlCisJICogICAgICAgICAgICAgIGNoYW5uZWwgY2FuIHN1cHBvcnQsIHJlcG9ydGVkIGluIGNvbW1hbmRzIHBlciBtaW51dGUuIDAKKwkgKiAgICAgICAgICAgICAgaW5kaWNhdGVzIG5vIGxpbWl0YXRpb24uCisJICogcGNjX21ydHQgICAtIFRoZSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIHRoYXQgT1NQTSBtdXN0IHdhaXQgYWZ0ZXIgdGhlCisJICogICAgICAgICAgICAgIGNvbXBsZXRpb24gb2YgYSBjb21tYW5kIGJlZm9yZSBpc3N1aW5nIHRoZSBuZXh0IGNvbW1hbmQsCisJICogICAgICAgICAgICAgIGluIG1pY3Jvc2Vjb25kcy4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgbGF0ZW5jeV9ucyA9IDA7CisJc3RydWN0IGNwY19kZXNjICpjcGNfZGVzYzsKKwlzdHJ1Y3QgY3BjX3JlZ2lzdGVyX3Jlc291cmNlICpkZXNpcmVkX3JlZzsKKworCWNwY19kZXNjID0gcGVyX2NwdShjcGNfZGVzY19wdHIsIGNwdV9udW0pOworCWlmICghY3BjX2Rlc2MpCisJCXJldHVybiBDUFVGUkVRX0VURVJOQUw7CisKKwlkZXNpcmVkX3JlZyA9ICZjcGNfZGVzYy0+Y3BjX3JlZ3NbREVTSVJFRF9QRVJGXTsKKwlpZiAoIUNQQ19JTl9QQ0MoZGVzaXJlZF9yZWcpKQorCQlyZXR1cm4gQ1BVRlJFUV9FVEVSTkFMOworCisJaWYgKHBjY19kYXRhLnBjY19tcGFyKQorCQlsYXRlbmN5X25zID0gNjAgKiAoMTAwMCAqIDEwMDAgKiAxMDAwIC8gcGNjX2RhdGEucGNjX21wYXIpOworCisJbGF0ZW5jeV9ucyA9IG1heChsYXRlbmN5X25zLCBwY2NfZGF0YS5wY2Nfbm9taW5hbCAqIDEwMDApOworCWxhdGVuY3lfbnMgPSBtYXgobGF0ZW5jeV9ucywgcGNjX2RhdGEucGNjX21ydHQgKiAxMDAwKTsKKworCXJldHVybiBsYXRlbmN5X25zOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3BwY19nZXRfdHJhbnNpdGlvbl9sYXRlbmN5KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lYy5jIGIvZHJpdmVycy9hY3BpL2VjLmMKaW5kZXggZTdiZDU3Yy4uNjgwNTMxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjLmMKQEAgLTEwNCwxMCArMTA0LDEyIEBACiAjZGVmaW5lIEFDUElfRUNfTUFYX1FVRVJJRVMJMTYJLyogTWF4aW11bSBudW1iZXIgb2YgcGFyYWxsZWwgcXVlcmllcyAqLwogCiBlbnVtIHsKKwlFQ19GTEFHU19RVUVSWV9FTkFCTEVELAkJLyogUXVlcnkgaXMgZW5hYmxlZCAqLwogCUVDX0ZMQUdTX1FVRVJZX1BFTkRJTkcsCQkvKiBRdWVyeSBpcyBwZW5kaW5nICovCiAJRUNfRkxBR1NfUVVFUllfR1VBUkRJTkcsCS8qIEd1YXJkIGZvciBTQ0lfRVZUIGNoZWNrICovCiAJRUNfRkxBR1NfR1BFX0hBTkRMRVJfSU5TVEFMTEVELAkvKiBHUEUgaGFuZGxlciBpbnN0YWxsZWQgKi8KIAlFQ19GTEFHU19FQ19IQU5ETEVSX0lOU1RBTExFRCwJLyogT3BSZWcgaGFuZGxlciBpbnN0YWxsZWQgKi8KKwlFQ19GTEFHU19FVlRfSEFORExFUl9JTlNUQUxMRUQsIC8qIF9ReHggaGFuZGxlcnMgaW5zdGFsbGVkICovCiAJRUNfRkxBR1NfU1RBUlRFRCwJCS8qIERyaXZlciBpcyBzdGFydGVkICovCiAJRUNfRkxBR1NfU1RPUFBFRCwJCS8qIERyaXZlciBpcyBzdG9wcGVkICovCiAJRUNfRkxBR1NfQ09NTUFORF9TVE9STSwJCS8qIEdQRSBzdG9ybXMgb2NjdXJyZWQgdG8gdGhlCkBAIC0xNDUsNiArMTQ3LDEwIEBACiBtb2R1bGVfcGFyYW0oZWNfc3Rvcm1fdGhyZXNob2xkLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZWNfc3Rvcm1fdGhyZXNob2xkLCAiTWF4aW0gZmFsc2UgR1BFIG51bWJlcnMgbm90IGNvbnNpZGVyZWQgYXMgR1BFIHN0b3JtIik7CiAKK3N0YXRpYyBib29sIGVjX2ZyZWV6ZV9ldmVudHMgX19yZWFkX21vc3RseSA9IHRydWU7Cittb2R1bGVfcGFyYW0oZWNfZnJlZXplX2V2ZW50cywgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVjX2ZyZWV6ZV9ldmVudHMsICJEaXNhYmxpbmcgZXZlbnQgaGFuZGxpbmcgZHVyaW5nIHN1c3BlbmQvcmVzdW1lIik7CisKIHN0cnVjdCBhY3BpX2VjX3F1ZXJ5X2hhbmRsZXIgewogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAlhY3BpX2VjX3F1ZXJ5X2Z1bmMgZnVuYzsKQEAgLTE3OSw2ICsxODUsNyBAQAogCiBzdHJ1Y3QgYWNwaV9lYyAqYm9vdF9lYywgKmZpcnN0X2VjOwogRVhQT1JUX1NZTUJPTChmaXJzdF9lYyk7CitzdGF0aWMgYm9vbCBib290X2VjX2lzX2VjZHQgPSBmYWxzZTsKIHN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZWNfcXVlcnlfd3E7CiAKIHN0YXRpYyBpbnQgRUNfRkxBR1NfQ0xFQVJfT05fUkVTVU1FOyAvKiBOZWVkcyBhY3BpX2VjX2NsZWFyKCkgb24gYm9vdC9yZXN1bWUgKi8KQEAgLTIzOSw2ICsyNDYsMzAgQEAKIAkgICAgICAgIXRlc3RfYml0KEVDX0ZMQUdTX1NUT1BQRUQsICZlYy0+ZmxhZ3MpOwogfQogCitzdGF0aWMgYm9vbCBhY3BpX2VjX2V2ZW50X2VuYWJsZWQoc3RydWN0IGFjcGlfZWMgKmVjKQoreworCS8qCisJICogVGhlcmUgaXMgYW4gT1NQTSBlYXJseSBzdGFnZSBsb2dpYy4gRHVyaW5nIHRoZSBlYXJseSBzdGFnZXMKKwkgKiAoYm9vdC9yZXN1bWUpLCBPU1BNcyBzaG91bGRuJ3QgZW5hYmxlIHRoZSBldmVudCBoYW5kbGluZywgb25seQorCSAqIHRoZSBFQyB0cmFuc2FjdGlvbnMgYXJlIGFsbG93ZWQgdG8gYmUgcGVyZm9ybWVkLgorCSAqLworCWlmICghdGVzdF9iaXQoRUNfRkxBR1NfUVVFUllfRU5BQkxFRCwgJmVjLT5mbGFncykpCisJCXJldHVybiBmYWxzZTsKKwkvKgorCSAqIEhvd2V2ZXIsIGRpc2FibGluZyB0aGUgZXZlbnQgaGFuZGxpbmcgaXMgZXhwZXJpbWVudGFsIGZvciBsYXRlCisJICogc3RhZ2UgKHN1c3BlbmQpLCBhbmQgaXMgY29udHJvbGxlZCBieSB0aGUgYm9vdCBwYXJhbWV0ZXIgb2YKKwkgKiAiZWNfZnJlZXplX2V2ZW50cyI6CisJICogMS4gdHJ1ZTogIFRoZSBFQyBldmVudCBoYW5kbGluZyBpcyBkaXNhYmxlZCBiZWZvcmUgZW50ZXJpbmcKKwkgKiAgICAgICAgICAgdGhlIG5vaXJxIHN0YWdlLgorCSAqIDIuIGZhbHNlOiBUaGUgRUMgZXZlbnQgaGFuZGxpbmcgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCBhcworCSAqICAgICAgICAgICBzb29uIGFzIHRoZSBFQyBkcml2ZXIgaXMgc3RvcHBlZC4KKwkgKi8KKwlpZiAoZWNfZnJlZXplX2V2ZW50cykKKwkJcmV0dXJuIGFjcGlfZWNfc3RhcnRlZChlYyk7CisJZWxzZQorCQlyZXR1cm4gdGVzdF9iaXQoRUNfRkxBR1NfU1RBUlRFRCwgJmVjLT5mbGFncyk7Cit9CisKIHN0YXRpYyBib29sIGFjcGlfZWNfZmx1c2hlZChzdHJ1Y3QgYWNwaV9lYyAqZWMpCiB7CiAJcmV0dXJuIGVjLT5yZWZlcmVuY2VfY291bnQgPT0gMTsKQEAgLTQyOSw3ICs0NjAsOCBAQAogCiBzdGF0aWMgdm9pZCBhY3BpX2VjX3N1Ym1pdF9xdWVyeShzdHJ1Y3QgYWNwaV9lYyAqZWMpCiB7Ci0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEVDX0ZMQUdTX1FVRVJZX1BFTkRJTkcsICZlYy0+ZmxhZ3MpKSB7CisJaWYgKGFjcGlfZWNfZXZlbnRfZW5hYmxlZChlYykgJiYKKwkgICAgIXRlc3RfYW5kX3NldF9iaXQoRUNfRkxBR1NfUVVFUllfUEVORElORywgJmVjLT5mbGFncykpIHsKIAkJZWNfZGJnX2V2dCgiQ29tbWFuZCglcykgc3VibWl0dGVkL2Jsb2NrZWQiLAogCQkJICAgYWNwaV9lY19jbWRfc3RyaW5nKEFDUElfRUNfQ09NTUFORF9RVUVSWSkpOwogCQllYy0+bnJfcGVuZGluZ19xdWVyaWVzKys7CkBAIC00NDYsNiArNDc4LDg2IEBACiAJfQogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19hY3BpX2VjX2VuYWJsZV9ldmVudChzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEVDX0ZMQUdTX1FVRVJZX0VOQUJMRUQsICZlYy0+ZmxhZ3MpKQorCQllY19sb2dfZHJ2KCJldmVudCB1bmJsb2NrZWQiKTsKKwlpZiAoIXRlc3RfYml0KEVDX0ZMQUdTX1FVRVJZX1BFTkRJTkcsICZlYy0+ZmxhZ3MpKQorCQlhZHZhbmNlX3RyYW5zYWN0aW9uKGVjKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fYWNwaV9lY19kaXNhYmxlX2V2ZW50KHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVDX0ZMQUdTX1FVRVJZX0VOQUJMRUQsICZlYy0+ZmxhZ3MpKQorCQllY19sb2dfZHJ2KCJldmVudCBibG9ja2VkIik7Cit9CisKKy8qCisgKiBQcm9jZXNzIF9RIGV2ZW50cyB0aGF0IG1pZ2h0IGhhdmUgYWNjdW11bGF0ZWQgaW4gdGhlIEVDLgorICogUnVuIHdpdGggbG9ja2VkIGVjIG11dGV4LgorICovCitzdGF0aWMgdm9pZCBhY3BpX2VjX2NsZWFyKHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwlpbnQgaSwgc3RhdHVzOworCXU4IHZhbHVlID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX0VDX0NMRUFSX01BWDsgaSsrKSB7CisJCXN0YXR1cyA9IGFjcGlfZWNfcXVlcnkoZWMsICZ2YWx1ZSk7CisJCWlmIChzdGF0dXMgfHwgIXZhbHVlKQorCQkJYnJlYWs7CisJfQorCWlmICh1bmxpa2VseShpID09IEFDUElfRUNfQ0xFQVJfTUFYKSkKKwkJcHJfd2FybigiV2FybmluZzogTWF4aW11bSBvZiAlZCBzdGFsZSBFQyBldmVudHMgY2xlYXJlZFxuIiwgaSk7CisJZWxzZQorCQlwcl9pbmZvKCIlZCBzdGFsZSBFQyBldmVudHMgY2xlYXJlZFxuIiwgaSk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfZWNfZW5hYmxlX2V2ZW50KHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5sb2NrLCBmbGFncyk7CisJaWYgKGFjcGlfZWNfc3RhcnRlZChlYykpCisJCV9fYWNwaV9lY19lbmFibGVfZXZlbnQoZWMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5sb2NrLCBmbGFncyk7CisKKwkvKiBEcmFpbiBhZGRpdGlvbmFsIGV2ZW50cyBpZiBoYXJkd2FyZSByZXF1aXJlcyB0aGF0ICovCisJaWYgKEVDX0ZMQUdTX0NMRUFSX09OX1JFU1VNRSkKKwkJYWNwaV9lY19jbGVhcihlYyk7Cit9CisKK3N0YXRpYyBib29sIGFjcGlfZWNfcXVlcnlfZmx1c2hlZChzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJYm9vbCBmbHVzaGVkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwlmbHVzaGVkID0gIWVjLT5ucl9wZW5kaW5nX3F1ZXJpZXM7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gZmx1c2hlZDsKK30KKworc3RhdGljIHZvaWQgX19hY3BpX2VjX2ZsdXNoX2V2ZW50KHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwkvKgorCSAqIFdoZW4gZWNfZnJlZXplX2V2ZW50cyBpcyB0cnVlLCB3ZSBuZWVkIHRvIGZsdXNoIGV2ZW50cyBpbgorCSAqIHRoZSBwcm9wZXIgcG9zaXRpb24gYmVmb3JlIGVudGVyaW5nIHRoZSBub2lycSBzdGFnZS4KKwkgKi8KKwl3YWl0X2V2ZW50KGVjLT53YWl0LCBhY3BpX2VjX3F1ZXJ5X2ZsdXNoZWQoZWMpKTsKKwlpZiAoZWNfcXVlcnlfd3EpCisJCWZsdXNoX3dvcmtxdWV1ZShlY19xdWVyeV93cSk7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfZWNfZGlzYWJsZV9ldmVudChzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+bG9jaywgZmxhZ3MpOworCV9fYWNwaV9lY19kaXNhYmxlX2V2ZW50KGVjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+bG9jaywgZmxhZ3MpOworCV9fYWNwaV9lY19mbHVzaF9ldmVudChlYyk7Cit9CisKIHN0YXRpYyBib29sIGFjcGlfZWNfZ3VhcmRfZXZlbnQoc3RydWN0IGFjcGlfZWMgKmVjKQogewogCWJvb2wgZ3VhcmRlZCA9IHRydWU7CkBAIC04MzIsMjcgKzk0NCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGVjX2dldF9oYW5kbGUpOwogCi0vKgotICogUHJvY2VzcyBfUSBldmVudHMgdGhhdCBtaWdodCBoYXZlIGFjY3VtdWxhdGVkIGluIHRoZSBFQy4KLSAqIFJ1biB3aXRoIGxvY2tlZCBlYyBtdXRleC4KLSAqLwotc3RhdGljIHZvaWQgYWNwaV9lY19jbGVhcihzdHJ1Y3QgYWNwaV9lYyAqZWMpCi17Ci0JaW50IGksIHN0YXR1czsKLQl1OCB2YWx1ZSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9FQ19DTEVBUl9NQVg7IGkrKykgewotCQlzdGF0dXMgPSBhY3BpX2VjX3F1ZXJ5KGVjLCAmdmFsdWUpOwotCQlpZiAoc3RhdHVzIHx8ICF2YWx1ZSkKLQkJCWJyZWFrOwotCX0KLQotCWlmICh1bmxpa2VseShpID09IEFDUElfRUNfQ0xFQVJfTUFYKSkKLQkJcHJfd2FybigiV2FybmluZzogTWF4aW11bSBvZiAlZCBzdGFsZSBFQyBldmVudHMgY2xlYXJlZFxuIiwgaSk7Ci0JZWxzZQotCQlwcl9pbmZvKCIlZCBzdGFsZSBFQyBldmVudHMgY2xlYXJlZFxuIiwgaSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGFjcGlfZWNfc3RhcnQoc3RydWN0IGFjcGlfZWMgKmVjLCBib29sIHJlc3VtaW5nKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC04OTYsNyArOTg3LDggQEAKIAkJaWYgKCFzdXNwZW5kaW5nKSB7CiAJCQlhY3BpX2VjX2NvbXBsZXRlX3JlcXVlc3QoZWMpOwogCQkJZWNfZGJnX3JlZihlYywgIkRlY3JlYXNlIGRyaXZlciIpOwotCQl9CisJCX0gZWxzZSBpZiAoIWVjX2ZyZWV6ZV9ldmVudHMpCisJCQlfX2FjcGlfZWNfZGlzYWJsZV9ldmVudChlYyk7CiAJCWNsZWFyX2JpdChFQ19GTEFHU19TVEFSVEVELCAmZWMtPmZsYWdzKTsKIAkJY2xlYXJfYml0KEVDX0ZMQUdTX1NUT1BQRUQsICZlYy0+ZmxhZ3MpOwogCQllY19sb2dfZHJ2KCJFQyBzdG9wcGVkIik7CkBAIC05MTksMjAgKzEwMTEsNiBAQAogCiB2b2lkIGFjcGlfZWNfdW5ibG9ja190cmFuc2FjdGlvbnModm9pZCkKIHsKLQlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBmaXJzdF9lYzsKLQotCWlmICghZWMpCi0JCXJldHVybjsKLQotCS8qIEFsbG93IHRyYW5zYWN0aW9ucyB0byBiZSBjYXJyaWVkIG91dCBhZ2FpbiAqLwotCWFjcGlfZWNfc3RhcnQoZWMsIHRydWUpOwotCi0JaWYgKEVDX0ZMQUdTX0NMRUFSX09OX1JFU1VNRSkKLQkJYWNwaV9lY19jbGVhcihlYyk7Ci19Ci0KLXZvaWQgYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9uc19lYXJseSh2b2lkKQotewogCS8qCiAJICogQWxsb3cgdHJhbnNhY3Rpb25zIHRvIGhhcHBlbiBhZ2FpbiAodGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbQogCSAqIGF0b21pYyBjb250ZXh0IGR1cmluZyB3YWtldXAsIHNvIHdlIGRvbid0IG5lZWQgdG8gYWNxdWlyZSB0aGUgbXV0ZXgpLgpAQCAtMTIyOCwxMyArMTMwNiwyMSBAQAogc3RhdGljIGFjcGlfc3RhdHVzCiBlY19wYXJzZV9pb19wb3J0cyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsIHZvaWQgKmNvbnRleHQpOwogCi1zdGF0aWMgc3RydWN0IGFjcGlfZWMgKm1ha2VfYWNwaV9lYyh2b2lkKQorc3RhdGljIHZvaWQgYWNwaV9lY19mcmVlKHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwlpZiAoZmlyc3RfZWMgPT0gZWMpCisJCWZpcnN0X2VjID0gTlVMTDsKKwlpZiAoYm9vdF9lYyA9PSBlYykKKwkJYm9vdF9lYyA9IE5VTEw7CisJa2ZyZWUoZWMpOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfZWMgKmFjcGlfZWNfYWxsb2Modm9pZCkKIHsKIAlzdHJ1Y3QgYWNwaV9lYyAqZWMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9lYyksIEdGUF9LRVJORUwpOwogCiAJaWYgKCFlYykKIAkJcmV0dXJuIE5VTEw7Ci0JZWMtPmZsYWdzID0gMSA8PCBFQ19GTEFHU19RVUVSWV9QRU5ESU5HOwogCW11dGV4X2luaXQoJmVjLT5tdXRleCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZWMtPndhaXQpOwogCUlOSVRfTElTVF9IRUFEKCZlYy0+bGlzdCk7CkBAIC0xMjkwLDcgKzEzNzYsMTIgQEAKIAlyZXR1cm4gQUVfQ1RSTF9URVJNSU5BVEU7CiB9CiAKLXN0YXRpYyBpbnQgZWNfaW5zdGFsbF9oYW5kbGVycyhzdHJ1Y3QgYWNwaV9lYyAqZWMpCisvKgorICogTm90ZTogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGNvZGUgb25seSB3aGVuIHRoZSBhZGRyZXNzIHNwYWNlCisgKiAgICAgICBoYW5kbGVyIGlzIG5vdCBpbnN0YWxsZWQsIHdoaWNoIG1lYW5zICJub3QgYWJsZSB0byBoYW5kbGUKKyAqICAgICAgIHRyYW5zYWN0aW9ucyIuCisgKi8KK3N0YXRpYyBpbnQgZWNfaW5zdGFsbF9oYW5kbGVycyhzdHJ1Y3QgYWNwaV9lYyAqZWMsIGJvb2wgaGFuZGxlX2V2ZW50cykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKQEAgLTEzMTksNiArMTQxMCwxNiBAQAogCQlzZXRfYml0KEVDX0ZMQUdTX0VDX0hBTkRMRVJfSU5TVEFMTEVELCAmZWMtPmZsYWdzKTsKIAl9CiAKKwlpZiAoIWhhbmRsZV9ldmVudHMpCisJCXJldHVybiAwOworCisJaWYgKCF0ZXN0X2JpdChFQ19GTEFHU19FVlRfSEFORExFUl9JTlNUQUxMRUQsICZlYy0+ZmxhZ3MpKSB7CisJCS8qIEZpbmQgYW5kIHJlZ2lzdGVyIGFsbCBxdWVyeSBtZXRob2RzICovCisJCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgZWMtPmhhbmRsZSwgMSwKKwkJCQkgICAgYWNwaV9lY19yZWdpc3Rlcl9xdWVyeV9tZXRob2RzLAorCQkJCSAgICBOVUxMLCBlYywgTlVMTCk7CisJCXNldF9iaXQoRUNfRkxBR1NfRVZUX0hBTkRMRVJfSU5TVEFMTEVELCAmZWMtPmZsYWdzKTsKKwl9CiAJaWYgKCF0ZXN0X2JpdChFQ19GTEFHU19HUEVfSEFORExFUl9JTlNUQUxMRUQsICZlYy0+ZmxhZ3MpKSB7CiAJCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ncGVfcmF3X2hhbmRsZXIoTlVMTCwgZWMtPmdwZSwKIAkJCQkJICBBQ1BJX0dQRV9FREdFX1RSSUdHRVJFRCwKQEAgLTEzMjksNiArMTQzMCw5IEBACiAJCQlpZiAodGVzdF9iaXQoRUNfRkxBR1NfU1RBUlRFRCwgJmVjLT5mbGFncykgJiYKIAkJCSAgICBlYy0+cmVmZXJlbmNlX2NvdW50ID49IDEpCiAJCQkJYWNwaV9lY19lbmFibGVfZ3BlKGVjLCB0cnVlKTsKKworCQkJLyogRUMgaXMgZnVsbHkgb3BlcmF0aW9uYWwsIGFsbG93IHF1ZXJpZXMgKi8KKwkJCWFjcGlfZWNfZW5hYmxlX2V2ZW50KGVjKTsKIAkJfQogCX0KIApAQCAtMTM2MywyMyArMTQ2NywxMDQgQEAKIAkJCXByX2VycigiZmFpbGVkIHRvIHJlbW92ZSBncGUgaGFuZGxlclxuIik7CiAJCWNsZWFyX2JpdChFQ19GTEFHU19HUEVfSEFORExFUl9JTlNUQUxMRUQsICZlYy0+ZmxhZ3MpOwogCX0KKwlpZiAodGVzdF9iaXQoRUNfRkxBR1NfRVZUX0hBTkRMRVJfSU5TVEFMTEVELCAmZWMtPmZsYWdzKSkgeworCQlhY3BpX2VjX3JlbW92ZV9xdWVyeV9oYW5kbGVycyhlYywgdHJ1ZSwgMCk7CisJCWNsZWFyX2JpdChFQ19GTEFHU19FVlRfSEFORExFUl9JTlNUQUxMRUQsICZlYy0+ZmxhZ3MpOworCX0KIH0KIAotc3RhdGljIHN0cnVjdCBhY3BpX2VjICphY3BpX2VjX2FsbG9jKHZvaWQpCitzdGF0aWMgaW50IGFjcGlfZWNfc2V0dXAoc3RydWN0IGFjcGlfZWMgKmVjLCBib29sIGhhbmRsZV9ldmVudHMpCiB7Ci0Jc3RydWN0IGFjcGlfZWMgKmVjOworCWludCByZXQ7CiAKLQkvKiBDaGVjayBmb3IgYm9vdCBFQyAqLwotCWlmIChib290X2VjKSB7Ci0JCWVjID0gYm9vdF9lYzsKLQkJYm9vdF9lYyA9IE5VTEw7Ci0JCWVjX3JlbW92ZV9oYW5kbGVycyhlYyk7Ci0JCWlmIChmaXJzdF9lYyA9PSBlYykKLQkJCWZpcnN0X2VjID0gTlVMTDsKLQl9IGVsc2UgewotCQllYyA9IG1ha2VfYWNwaV9lYygpOworCXJldCA9IGVjX2luc3RhbGxfaGFuZGxlcnMoZWMsIGhhbmRsZV9ldmVudHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBGaXJzdCBFQyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyAqLworCWlmICghZmlyc3RfZWMpIHsKKwkJZmlyc3RfZWMgPSBlYzsKKwkJYWNwaV9oYW5kbGVfaW5mbyhmaXJzdF9lYy0+aGFuZGxlLCAiVXNlZCBhcyBmaXJzdCBFQ1xuIik7CiAJfQotCXJldHVybiBlYzsKKworCWFjcGlfaGFuZGxlX2luZm8oZWMtPmhhbmRsZSwKKwkJCSAiR1BFPTB4JWx4LCBFQ19DTUQvRUNfU0M9MHglbHgsIEVDX0RBVEE9MHglbHhcbiIsCisJCQkgZWMtPmdwZSwgZWMtPmNvbW1hbmRfYWRkciwgZWMtPmRhdGFfYWRkcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhY3BpX2NvbmZpZ19ib290X2VjKHN0cnVjdCBhY3BpX2VjICplYywgYWNwaV9oYW5kbGUgaGFuZGxlLAorCQkJICAgICAgIGJvb2wgaGFuZGxlX2V2ZW50cywgYm9vbCBpc19lY2R0KQoreworCWludCByZXQ7CisKKwkvKgorCSAqIENoYW5naW5nIHRoZSBBQ1BJIGhhbmRsZSByZXN1bHRzIGluIGEgcmUtY29uZmlndXJhdGlvbiBvZiB0aGUKKwkgKiBib290IEVDLiBBbmQgaWYgaXQgaGFwcGVucyBhZnRlciB0aGUgbmFtZXNwYWNlIGluaXRpYWxpemF0aW9uLAorCSAqIGl0IGNhdXNlcyBfUkVHIGV2YWx1YXRpb25zLgorCSAqLworCWlmIChib290X2VjICYmIGJvb3RfZWMtPmhhbmRsZSAhPSBoYW5kbGUpCisJCWVjX3JlbW92ZV9oYW5kbGVycyhib290X2VjKTsKKworCS8qIFVuc2V0IG9sZCBib290IEVDICovCisJaWYgKGJvb3RfZWMgIT0gZWMpCisJCWFjcGlfZWNfZnJlZShib290X2VjKTsKKworCS8qCisJICogRUNEVCBkZXZpY2UgY3JlYXRpb24gaXMgc3BsaXQgaW50byBhY3BpX2VjX2VjZHRfcHJvYmUoKSBhbmQKKwkgKiBhY3BpX2VjX2VjZHRfc3RhcnQoKS4gVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIGNvbXBsZXRpbmcgdGhlCisJICogRUNEVCBwYXJzaW5nIGxvZ2ljIGFzIHRoZSBoYW5kbGUgdXBkYXRlIHNob3VsZCBiZSBwZXJmb3JtZWQKKwkgKiBiZXR3ZWVuIHRoZSBpbnN0YWxsYXRpb24vdW5pbnN0YWxsYXRpb24gb2YgdGhlIGhhbmRsZXJzLgorCSAqLworCWlmIChlYy0+aGFuZGxlICE9IGhhbmRsZSkKKwkJZWMtPmhhbmRsZSA9IGhhbmRsZTsKKworCXJldCA9IGFjcGlfZWNfc2V0dXAoZWMsIGhhbmRsZV9ldmVudHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgbmV3IGJvb3QgRUMgKi8KKwlpZiAoIWJvb3RfZWMpIHsKKwkJYm9vdF9lYyA9IGVjOworCQlib290X2VjX2lzX2VjZHQgPSBpc19lY2R0OworCX0KKworCWFjcGlfaGFuZGxlX2luZm8oYm9vdF9lYy0+aGFuZGxlLAorCQkJICJVc2VkIGFzIGJvb3QgJXMgRUMgdG8gaGFuZGxlIHRyYW5zYWN0aW9ucyVzXG4iLAorCQkJIGlzX2VjZHQgPyAiRUNEVCIgOiAiRFNEVCIsCisJCQkgaGFuZGxlX2V2ZW50cyA/ICIgYW5kIGV2ZW50cyIgOiAiIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJvb2wgYWNwaV9lY19lY2R0X2dldF9oYW5kbGUoYWNwaV9oYW5kbGUgKnBoYW5kbGUpCit7CisJc3RydWN0IGFjcGlfdGFibGVfZWNkdCAqZWNkdF9wdHI7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfU0lHX0VDRFQsIDEsCisJCQkJKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqKikmZWNkdF9wdHIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIGZhbHNlOworCisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGVjZHRfcHRyLT5pZCwgJmhhbmRsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkqcGhhbmRsZSA9IGhhbmRsZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgYWNwaV9pc19ib290X2VjKHN0cnVjdCBhY3BpX2VjICplYykKK3sKKwlpZiAoIWJvb3RfZWMpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoZWMtPmhhbmRsZSA9PSBib290X2VjLT5oYW5kbGUgJiYKKwkgICAgZWMtPmdwZSA9PSBib290X2VjLT5ncGUgJiYKKwkgICAgZWMtPmNvbW1hbmRfYWRkciA9PSBib290X2VjLT5jb21tYW5kX2FkZHIgJiYKKwkgICAgZWMtPmRhdGFfYWRkciA9PSBib290X2VjLT5kYXRhX2FkZHIpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGludCBhY3BpX2VjX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKQEAgLTEzOTUsMTYgKzE1ODAsMjEgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJaWYgKGVjX3BhcnNlX2RldmljZShkZXZpY2UtPmhhbmRsZSwgMCwgZWMsIE5VTEwpICE9CiAJCUFFX0NUUkxfVEVSTUlOQVRFKSB7Ci0JCQlrZnJlZShlYyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9hbGxvYzsKIAl9CiAKLQkvKiBGaW5kIGFuZCByZWdpc3RlciBhbGwgcXVlcnkgbWV0aG9kcyAqLwotCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX01FVEhPRCwgZWMtPmhhbmRsZSwgMSwKLQkJCSAgICBhY3BpX2VjX3JlZ2lzdGVyX3F1ZXJ5X21ldGhvZHMsIE5VTEwsIGVjLCBOVUxMKTsKKwlpZiAoYWNwaV9pc19ib290X2VjKGVjKSkgeworCQlib290X2VjX2lzX2VjZHQgPSBmYWxzZTsKKwkJYWNwaV9oYW5kbGVfZGVidWcoZWMtPmhhbmRsZSwgImR1cGxpY2F0ZWQuXG4iKTsKKwkJYWNwaV9lY19mcmVlKGVjKTsKKwkJZWMgPSBib290X2VjOworCQlyZXQgPSBhY3BpX2NvbmZpZ19ib290X2VjKGVjLCBlYy0+aGFuZGxlLCB0cnVlLCBmYWxzZSk7CisJfSBlbHNlCisJCXJldCA9IGFjcGlfZWNfc2V0dXAoZWMsIHRydWUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3F1ZXJ5OwogCi0JaWYgKCFmaXJzdF9lYykKLQkJZmlyc3RfZWMgPSBlYzsKIAlkZXZpY2UtPmRyaXZlcl9kYXRhID0gZWM7CiAKIAlyZXQgPSAhIXJlcXVlc3RfcmVnaW9uKGVjLT5kYXRhX2FkZHIsIDEsICJFQyBkYXRhIik7CkBAIC0xNDEyLDIwICsxNjAyLDE3IEBACiAJcmV0ID0gISFyZXF1ZXN0X3JlZ2lvbihlYy0+Y29tbWFuZF9hZGRyLCAxLCAiRUMgY21kIik7CiAJV0FSTighcmV0LCAiQ291bGQgbm90IHJlcXVlc3QgRUMgY21kIGlvIHBvcnQgMHglbHgiLCBlYy0+Y29tbWFuZF9hZGRyKTsKIAotCXByX2luZm8oIkdQRSA9IDB4JWx4LCBJL086IGNvbW1hbmQvc3RhdHVzID0gMHglbHgsIGRhdGEgPSAweCVseFxuIiwKLQkJCSAgZWMtPmdwZSwgZWMtPmNvbW1hbmRfYWRkciwgZWMtPmRhdGFfYWRkcik7Ci0KLQlyZXQgPSBlY19pbnN0YWxsX2hhbmRsZXJzKGVjKTsKLQogCS8qIFJlcHJvYmUgZGV2aWNlcyBkZXBlbmRpbmcgb24gdGhlIEVDICovCiAJYWNwaV93YWxrX2RlcF9kZXZpY2VfbGlzdChlYy0+aGFuZGxlKTsKKwlhY3BpX2hhbmRsZV9kZWJ1ZyhlYy0+aGFuZGxlLCAiZW51bWVyYXRlZC5cbiIpOworCXJldHVybiAwOwogCi0JLyogRUMgaXMgZnVsbHkgb3BlcmF0aW9uYWwsIGFsbG93IHF1ZXJpZXMgKi8KLQljbGVhcl9iaXQoRUNfRkxBR1NfUVVFUllfUEVORElORywgJmVjLT5mbGFncyk7Ci0KLQkvKiBDbGVhciBzdGFsZSBfUSBldmVudHMgaWYgaGFyZHdhcmUgbWlnaHQgcmVxdWlyZSB0aGF0ICovCi0JaWYgKEVDX0ZMQUdTX0NMRUFSX09OX1JFU1VNRSkKLQkJYWNwaV9lY19jbGVhcihlYyk7CitlcnJfcXVlcnk6CisJaWYgKGVjICE9IGJvb3RfZWMpCisJCWFjcGlfZWNfcmVtb3ZlX3F1ZXJ5X2hhbmRsZXJzKGVjLCB0cnVlLCAwKTsKK2Vycl9hbGxvYzoKKwlpZiAoZWMgIT0gYm9vdF9lYykKKwkJYWNwaV9lY19mcmVlKGVjKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDM3LDE0ICsxNjI0LDEzIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJZWMgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7Ci0JZWNfcmVtb3ZlX2hhbmRsZXJzKGVjKTsKLQlhY3BpX2VjX3JlbW92ZV9xdWVyeV9oYW5kbGVycyhlYywgdHJ1ZSwgMCk7CiAJcmVsZWFzZV9yZWdpb24oZWMtPmRhdGFfYWRkciwgMSk7CiAJcmVsZWFzZV9yZWdpb24oZWMtPmNvbW1hbmRfYWRkciwgMSk7CiAJZGV2aWNlLT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JaWYgKGVjID09IGZpcnN0X2VjKQotCQlmaXJzdF9lYyA9IE5VTEw7Ci0Ja2ZyZWUoZWMpOworCWlmIChlYyAhPSBib290X2VjKSB7CisJCWVjX3JlbW92ZV9oYW5kbGVycyhlYyk7CisJCWFjcGlfZWNfZnJlZShlYyk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0xNDg2LDkgKzE2NzIsOCBAQAogCWlmICghZWMpCiAJCXJldHVybiAtRU5PTUVNOwogCS8qCi0JICogRmluZGluZyBFQyBmcm9tIERTRFQgaWYgdGhlcmUgaXMgbm8gRUNEVCBFQyBhdmFpbGFibGUuIFdoZW4gdGhpcwotCSAqIGZ1bmN0aW9uIGlzIGludm9rZWQsIEFDUEkgdGFibGVzIGhhdmUgYmVlbiBmdWxseSBsb2FkZWQsIHdlIGNhbgotCSAqIHdhbGsgbmFtZXNwYWNlIG5vdy4KKwkgKiBBdCB0aGlzIHBvaW50LCB0aGUgbmFtZXNwYWNlIGlzIGluaXRpYWxpemVkLCBzbyBzdGFydCB0byBmaW5kCisJICogdGhlIG5hbWVzcGFjZSBvYmplY3RzLgogCSAqLwogCXN0YXR1cyA9IGFjcGlfZ2V0X2RldmljZXMoZWNfZGV2aWNlX2lkc1swXS5pZCwKIAkJCQkgIGVjX3BhcnNlX2RldmljZSwgZWMsIE5VTEwpOwpAQCAtMTQ5NiwxNiArMTY4MSw0NyBAQAogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycm9yOwogCX0KLQlyZXQgPSBlY19pbnN0YWxsX2hhbmRsZXJzKGVjKTsKLQorCS8qCisJICogV2hlbiB0aGUgRFNEVCBFQyBpcyBhdmFpbGFibGUsIGFsd2F5cyByZS1jb25maWd1cmUgYm9vdCBFQyB0bworCSAqIGhhdmUgX1JFRyBldmFsdWF0ZWQuIF9SRUcgY2FuIG9ubHkgYmUgZXZhbHVhdGVkIGFmdGVyIHRoZQorCSAqIG5hbWVzcGFjZSBpbml0aWFsaXphdGlvbi4KKwkgKiBBdCB0aGlzIHBvaW50LCB0aGUgR1BFIGlzIG5vdCBmdWxseSBpbml0aWFsaXplZCwgc28gZG8gbm90IHRvCisJICogaGFuZGxlIHRoZSBldmVudHMuCisJICovCisJcmV0ID0gYWNwaV9jb25maWdfYm9vdF9lYyhlYywgZWMtPmhhbmRsZSwgZmFsc2UsIGZhbHNlKTsKIGVycm9yOgogCWlmIChyZXQpCi0JCWtmcmVlKGVjKTsKLQllbHNlCi0JCWZpcnN0X2VjID0gYm9vdF9lYyA9IGVjOworCQlhY3BpX2VjX2ZyZWUoZWMpOwogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBJZiB0aGUgRFNEVCBFQyBpcyBub3QgZnVuY3Rpb25pbmcsIHdlIHN0aWxsIG5lZWQgdG8gcHJlcGFyZSBhIGZ1bGx5CisgKiBmdW5jdGlvbmluZyBFQ0RUIEVDIGZpcnN0IGluIG9yZGVyIHRvIGhhbmRsZSB0aGUgZXZlbnRzLgorICogaHR0cHM6Ly9idWd6aWxsYS5rZXJuZWwub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTUwMjEKKyAqLworaW50IF9faW5pdCBhY3BpX2VjX2VjZHRfc3RhcnQodm9pZCkKK3sKKwlhY3BpX2hhbmRsZSBoYW5kbGU7CisKKwlpZiAoIWJvb3RfZWMpCisJCXJldHVybiAtRU5PREVWOworCS8qCisJICogVGhlIERTRFQgRUMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHN0YXJ0ZWQgaW4KKwkgKiBhY3BpX2VjX2FkZCgpLgorCSAqLworCWlmICghYm9vdF9lY19pc19lY2R0KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCwgdGhlIG5hbWVzcGFjZSBhbmQgdGhlIEdQRSBpcyBpbml0aWFsaXplZCwgc28KKwkgKiBzdGFydCB0byBmaW5kIHRoZSBuYW1lc3BhY2Ugb2JqZWN0cyBhbmQgaGFuZGxlIHRoZSBldmVudHMuCisJICovCisJaWYgKCFhY3BpX2VjX2VjZHRfZ2V0X2hhbmRsZSgmaGFuZGxlKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIGFjcGlfY29uZmlnX2Jvb3RfZWMoYm9vdF9lYywgaGFuZGxlLCB0cnVlLCB0cnVlKTsKK30KKwogI2lmIDAKIC8qCiAgKiBTb21lIEVDIGZpcm13YXJlIHZhcmlhdGlvbnMgcmVmdXNlcyB0byByZXNwb25kIFFSX0VDIHdoZW4gU0NJX0VWVCBpcyBub3QKQEAgLTE2MDAsNyArMTgxNiw2IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JcHJfaW5mbygiRUMgZGVzY3JpcHRpb24gdGFibGUgaXMgZm91bmQsIGNvbmZpZ3VyaW5nIGJvb3QgRUNcbiIpOwogCWlmIChFQ19GTEFHU19DT1JSRUNUX0VDRFQpIHsKIAkJZWMtPmNvbW1hbmRfYWRkciA9IGVjZHRfcHRyLT5kYXRhLmFkZHJlc3M7CiAJCWVjLT5kYXRhX2FkZHIgPSBlY2R0X3B0ci0+Y29udHJvbC5hZGRyZXNzOwpAQCAtMTYwOSwxNiArMTgyNCw5MCBAQAogCQllYy0+ZGF0YV9hZGRyID0gZWNkdF9wdHItPmRhdGEuYWRkcmVzczsKIAl9CiAJZWMtPmdwZSA9IGVjZHRfcHRyLT5ncGU7Ci0JZWMtPmhhbmRsZSA9IEFDUElfUk9PVF9PQkpFQ1Q7Ci0JcmV0ID0gZWNfaW5zdGFsbF9oYW5kbGVycyhlYyk7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHRoZSBuYW1lc3BhY2UgaXMgbm90IGluaXRpYWxpemVkLCBzbyBkbyBub3QgZmluZAorCSAqIHRoZSBuYW1lc3BhY2Ugb2JqZWN0cywgb3IgaGFuZGxlIHRoZSBldmVudHMuCisJICovCisJcmV0ID0gYWNwaV9jb25maWdfYm9vdF9lYyhlYywgQUNQSV9ST09UX09CSkVDVCwgZmFsc2UsIHRydWUpOwogZXJyb3I6CiAJaWYgKHJldCkKLQkJa2ZyZWUoZWMpOwotCWVsc2UKLQkJZmlyc3RfZWMgPSBib290X2VjID0gZWM7CisJCWFjcGlfZWNfZnJlZShlYyk7CiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIHZvaWQgYWNwaV9lY19lbnRlcl9ub2lycShzdHJ1Y3QgYWNwaV9lYyAqZWMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChlYyA9PSBmaXJzdF9lYykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwkJZWMtPnNhdmVkX2J1c3lfcG9sbGluZyA9IGVjX2J1c3lfcG9sbGluZzsKKwkJZWMtPnNhdmVkX3BvbGxpbmdfZ3VhcmQgPSBlY19wb2xsaW5nX2d1YXJkOworCQllY19idXN5X3BvbGxpbmcgPSB0cnVlOworCQllY19wb2xsaW5nX2d1YXJkID0gMDsKKwkJZWNfbG9nX2RydigiaW50ZXJydXB0IGJsb2NrZWQiKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfZWNfbGVhdmVfbm9pcnEoc3RydWN0IGFjcGlfZWMgKmVjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZWMgPT0gZmlyc3RfZWMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5sb2NrLCBmbGFncyk7CisJCWVjX2J1c3lfcG9sbGluZyA9IGVjLT5zYXZlZF9idXN5X3BvbGxpbmc7CisJCWVjX3BvbGxpbmdfZ3VhcmQgPSBlYy0+c2F2ZWRfcG9sbGluZ19ndWFyZDsKKwkJZWNfbG9nX2RydigiaW50ZXJydXB0IHVuYmxvY2tlZCIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+bG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIGludCBhY3BpX2VjX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhY3BpX2VjICplYyA9CisJCWFjcGlfZHJpdmVyX2RhdGEodG9fYWNwaV9kZXZpY2UoZGV2KSk7CisKKwlhY3BpX2VjX2VudGVyX25vaXJxKGVjKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhY3BpX2VjX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjcGlfZWMgKmVjID0KKwkJYWNwaV9kcml2ZXJfZGF0YSh0b19hY3BpX2RldmljZShkZXYpKTsKKworCWFjcGlfZWNfbGVhdmVfbm9pcnEoZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjcGlfZWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFjcGlfZWMgKmVjID0KKwkJYWNwaV9kcml2ZXJfZGF0YSh0b19hY3BpX2RldmljZShkZXYpKTsKKworCWlmIChlY19mcmVlemVfZXZlbnRzKQorCQlhY3BpX2VjX2Rpc2FibGVfZXZlbnQoZWMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjcGlfZWNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWNwaV9lYyAqZWMgPQorCQlhY3BpX2RyaXZlcl9kYXRhKHRvX2FjcGlfZGV2aWNlKGRldikpOworCisJYWNwaV9lY19lbmFibGVfZXZlbnQoZWMpOworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBhY3BpX2VjX3BtID0geworCVNFVF9OT0lSUV9TWVNURU1fU0xFRVBfUE1fT1BTKGFjcGlfZWNfc3VzcGVuZF9ub2lycSwgYWNwaV9lY19yZXN1bWVfbm9pcnEpCisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoYWNwaV9lY19zdXNwZW5kLCBhY3BpX2VjX3Jlc3VtZSkKK307CisKIHN0YXRpYyBpbnQgcGFyYW1fc2V0X2V2ZW50X2NsZWFyaW5nKGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0xNjY0LDYgKzE5NTMsNyBAQAogCQkuYWRkID0gYWNwaV9lY19hZGQsCiAJCS5yZW1vdmUgPSBhY3BpX2VjX3JlbW92ZSwKIAkJfSwKKwkuZHJ2LnBtID0gJmFjcGlfZWNfcG0sCiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBhY3BpX2VjX3F1ZXJ5X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9pbnRlcm5hbC5oIGIvZHJpdmVycy9hY3BpL2ludGVybmFsLmgKaW5kZXggOTQwMjE4Zi4uMWI0MWEyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9hY3BpL2ludGVybmFsLmgKQEAgLTQwLDEwICs0MCw4IEBACiB2b2lkIGFjcGlfY29udGFpbmVyX2luaXQodm9pZCk7CiB2b2lkIGFjcGlfbWVtb3J5X2hvdHBsdWdfaW5pdCh2b2lkKTsKICNpZmRlZglDT05GSUdfQUNQSV9IT1RQTFVHX0lPQVBJQwotaW50IGFjcGlfaW9hcGljX2FkZChzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdCk7CiBpbnQgYWNwaV9pb2FwaWNfcmVtb3ZlKHN0cnVjdCBhY3BpX3BjaV9yb290ICpyb290KTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBhY3BpX2lvYXBpY19hZGQoc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGFjcGlfaW9hcGljX3JlbW92ZShzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdCkgeyByZXR1cm4gMDsgfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FDUElfRE9DSwpAQCAtMTE2LDcgKzExNCw2IEBACiBib29sIGFjcGlfZGV2aWNlX2lzX2JhdHRlcnkoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KTsKIGJvb2wgYWNwaV9kZXZpY2VfaXNfZmlyc3RfcGh5c2ljYWxfbm9kZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCiAJCQkJCWNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldik7Ci1zdHJ1Y3QgZGV2aWNlICphY3BpX2dldF9maXJzdF9waHlzaWNhbF9ub2RlKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UgTWF0Y2hpbmcgYW5kIE5vdGlmaWNhdGlvbgpAQCAtMTc0LDYgKzE3MSw4IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJdW5zaWduZWQgbG9uZyB0aW1lc3RhbXA7CiAJdW5zaWduZWQgbG9uZyBucl9wZW5kaW5nX3F1ZXJpZXM7CisJYm9vbCBzYXZlZF9idXN5X3BvbGxpbmc7CisJdW5zaWduZWQgaW50IHNhdmVkX3BvbGxpbmdfZ3VhcmQ7CiB9OwogCiBleHRlcm4gc3RydWN0IGFjcGlfZWMgKmZpcnN0X2VjOwpAQCAtMTg1LDkgKzE4NCw5IEBACiBpbnQgYWNwaV9lY19pbml0KHZvaWQpOwogaW50IGFjcGlfZWNfZWNkdF9wcm9iZSh2b2lkKTsKIGludCBhY3BpX2VjX2RzZHRfcHJvYmUodm9pZCk7CitpbnQgYWNwaV9lY19lY2R0X3N0YXJ0KHZvaWQpOwogdm9pZCBhY3BpX2VjX2Jsb2NrX3RyYW5zYWN0aW9ucyh2b2lkKTsKIHZvaWQgYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9ucyh2b2lkKTsKLXZvaWQgYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9uc19lYXJseSh2b2lkKTsKIGludCBhY3BpX2VjX2FkZF9xdWVyeV9oYW5kbGVyKHN0cnVjdCBhY3BpX2VjICplYywgdTggcXVlcnlfYml0LAogCQkJICAgICAgYWNwaV9oYW5kbGUgaGFuZGxlLCBhY3BpX2VjX3F1ZXJ5X2Z1bmMgZnVuYywKIAkJCSAgICAgIHZvaWQgKmRhdGEpOwpAQCAtMjI1LDQgKzIyNCwxNCBAQAogdm9pZCBhY3BpX2luaXRfcHJvcGVydGllcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpOwogdm9pZCBhY3BpX2ZyZWVfcHJvcGVydGllcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpOwogCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkJV2F0Y2hkb2cKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIENPTkZJR19BQ1BJX1dBVENIRE9HCit2b2lkIGFjcGlfd2F0Y2hkb2dfaW5pdCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV93YXRjaGRvZ19pbml0KHZvaWQpIHt9CisjZW5kaWYKKwogI2VuZGlmIC8qIF9BQ1BJX0lOVEVSTkFMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaW9hcGljLmMgYi9kcml2ZXJzL2FjcGkvaW9hcGljLmMKaW5kZXggY2NkYzhkYi4uNmQ3Y2U2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2lvYXBpYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9pb2FwaWMuYwpAQCAtNDYsNyArNDYsNyBAQAogCXN0cnVjdCByZXNvdXJjZV93aW4gd2luOwogCiAJcmVzLT5mbGFncyA9IDA7Ci0JaWYgKGFjcGlfZGV2X2ZpbHRlcl9yZXNvdXJjZV90eXBlKGFjcGlfcmVzLCBJT1JFU09VUkNFX01FTSkgPT0gMCkKKwlpZiAoYWNwaV9kZXZfZmlsdGVyX3Jlc291cmNlX3R5cGUoYWNwaV9yZXMsIElPUkVTT1VSQ0VfTUVNKSkKIAkJcmV0dXJuIEFFX09LOwogCiAJaWYgKCFhY3BpX2Rldl9yZXNvdXJjZV9tZW1vcnkoYWNwaV9yZXMsIHJlcykpIHsKQEAgLTk3LDcgKzk3LDcgQEAKIAl1bnNpZ25lZCBsb25nIGxvbmcgZ3NpX2Jhc2U7CiAJc3RydWN0IGFjcGlfcGNpX2lvYXBpYyAqaW9hcGljOwogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IE5VTEwsICpwY2lfcmVzID0gTlVMTCwgKmNyc19yZXM7CiAJY2hhciAqdHlwZSA9IE5VTEw7CiAKIAlpZiAoIWFjcGlfaXNfaW9hcGljKGhhbmRsZSwgJnR5cGUpKQpAQCAtMTM3LDIzICsxMzcsMzAgQEAKIAkJcGNpX3NldF9tYXN0ZXIoZGV2KTsKIAkJaWYgKHBjaV9yZXF1ZXN0X3JlZ2lvbihkZXYsIDAsIHR5cGUpKQogCQkJZ290byBleGl0X2Rpc2FibGU7Ci0JCXJlcyA9ICZkZXYtPnJlc291cmNlWzBdOworCQlwY2lfcmVzID0gJmRldi0+cmVzb3VyY2VbMF07CiAJCWlvYXBpYy0+cGRldiA9IGRldjsKIAl9IGVsc2UgewogCQlwY2lfZGV2X3B1dChkZXYpOwogCQlkZXYgPSBOVUxMOwotCi0JCXJlcyA9ICZpb2FwaWMtPnJlczsKLQkJYWNwaV93YWxrX3Jlc291cmNlcyhoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsIHNldHVwX3JlcywgcmVzKTsKLQkJaWYgKHJlcy0+ZmxhZ3MgPT0gMCkgewotCQkJYWNwaV9oYW5kbGVfd2FybihoYW5kbGUsICJmYWlsZWQgdG8gZ2V0IHJlc291cmNlXG4iKTsKLQkJCWdvdG8gZXhpdF9mcmVlOwotCQl9IGVsc2UgaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpKSB7Ci0JCQlhY3BpX2hhbmRsZV93YXJuKGhhbmRsZSwgImZhaWxlZCB0byBpbnNlcnQgcmVzb3VyY2VcbiIpOwotCQkJZ290byBleGl0X2ZyZWU7Ci0JCX0KIAl9CiAKKwljcnNfcmVzID0gJmlvYXBpYy0+cmVzOworCWFjcGlfd2Fsa19yZXNvdXJjZXMoaGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLCBzZXR1cF9yZXMsIGNyc19yZXMpOworCWNyc19yZXMtPm5hbWUgPSB0eXBlOworCWNyc19yZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfQlVTWTsKKwlpZiAoY3JzX3Jlcy0+ZmxhZ3MgPT0gMCkgeworCQlhY3BpX2hhbmRsZV93YXJuKGhhbmRsZSwgImZhaWxlZCB0byBnZXQgcmVzb3VyY2VcbiIpOworCQlnb3RvIGV4aXRfcmVsZWFzZTsKKwl9IGVsc2UgaWYgKGluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIGNyc19yZXMpKSB7CisJCWFjcGlfaGFuZGxlX3dhcm4oaGFuZGxlLCAiZmFpbGVkIHRvIGluc2VydCByZXNvdXJjZVxuIik7CisJCWdvdG8gZXhpdF9yZWxlYXNlOworCX0KKworCS8qIHRyeSBwY2kgcmVzb3VyY2UgZmlyc3QsIHRoZW4gIl9DUlMiIHJlc291cmNlICovCisJcmVzID0gcGNpX3JlczsKKwlpZiAoIXJlcyB8fCAhcmVzLT5mbGFncykKKwkJcmVzID0gY3JzX3JlczsKKwogCWlmIChhY3BpX3JlZ2lzdGVyX2lvYXBpYyhoYW5kbGUsIHJlcy0+c3RhcnQsICh1MzIpZ3NpX2Jhc2UpKSB7CiAJCWFjcGlfaGFuZGxlX3dhcm4oaGFuZGxlLCAiZmFpbGVkIHRvIHJlZ2lzdGVyIElPQVBJQ1xuIik7CiAJCWdvdG8gZXhpdF9yZWxlYXNlOwpAQCAtMTc0LDE0ICsxODEsMTMgQEAKIGV4aXRfcmVsZWFzZToKIAlpZiAoZGV2KQogCQlwY2lfcmVsZWFzZV9yZWdpb24oZGV2LCAwKTsKLQllbHNlCi0JCXJlbGVhc2VfcmVzb3VyY2UocmVzKTsKKwlpZiAoaW9hcGljLT5yZXMuZmxhZ3MgJiYgaW9hcGljLT5yZXMucGFyZW50KQorCQlyZWxlYXNlX3Jlc291cmNlKCZpb2FwaWMtPnJlcyk7CiBleGl0X2Rpc2FibGU6CiAJaWYgKGRldikKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CiBleGl0X3B1dDoKIAlwY2lfZGV2X3B1dChkZXYpOwotZXhpdF9mcmVlOgogCWtmcmVlKGlvYXBpYyk7CiBleGl0OgogCW11dGV4X3VubG9jaygmaW9hcGljX2xpc3RfbG9jayk7CkBAIC0xODksMTMgKzE5NSwxMyBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotaW50IGFjcGlfaW9hcGljX2FkZChzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdCkKK2ludCBhY3BpX2lvYXBpY19hZGQoYWNwaV9oYW5kbGUgcm9vdF9oYW5kbGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzLCByZXR2YWwgPSBBRV9PSzsKIAotCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgcm9vdC0+ZGV2aWNlLT5oYW5kbGUsCisJc3RhdHVzID0gYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCByb290X2hhbmRsZSwKIAkJCQkgICAgIFVJTlRfTUFYLCBoYW5kbGVfaW9hcGljX2FkZCwgTlVMTCwKLQkJCQkgICAgIHJvb3QtPmRldmljZS0+aGFuZGxlLCAodm9pZCAqKikmcmV0dmFsKTsKKwkJCQkgICAgIHJvb3RfaGFuZGxlLCAodm9pZCAqKikmcmV0dmFsKTsKIAogCXJldHVybiBBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBBQ1BJX1NVQ0NFU1MocmV0dmFsKSA/IDAgOiAtRU5PREVWOwogfQpAQCAtMjE3LDkgKzIyMyw5IEBACiAJCQlwY2lfcmVsZWFzZV9yZWdpb24oaW9hcGljLT5wZGV2LCAwKTsKIAkJCXBjaV9kaXNhYmxlX2RldmljZShpb2FwaWMtPnBkZXYpOwogCQkJcGNpX2Rldl9wdXQoaW9hcGljLT5wZGV2KTsKLQkJfSBlbHNlIGlmIChpb2FwaWMtPnJlcy5mbGFncyAmJiBpb2FwaWMtPnJlcy5wYXJlbnQpIHsKLQkJCXJlbGVhc2VfcmVzb3VyY2UoJmlvYXBpYy0+cmVzKTsKIAkJfQorCQlpZiAoaW9hcGljLT5yZXMuZmxhZ3MgJiYgaW9hcGljLT5yZXMucGFyZW50KQorCQkJcmVsZWFzZV9yZXNvdXJjZSgmaW9hcGljLT5yZXMpOwogCQlsaXN0X2RlbCgmaW9hcGljLT5saXN0KTsKIAkJa2ZyZWUoaW9hcGljKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmZpdC9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvbmZpdC9jb3JlLmMKaW5kZXggODBjYzdjMC4uZTFkNWVhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25maXQvY29yZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9uZml0L2NvcmUuYwpAQCAtOTQsNTQgKzk0LDUwIEBACiAJcmV0dXJuIHRvX2FjcGlfZGV2aWNlKGFjcGlfZGVzYy0+ZGV2KTsKIH0KIAotc3RhdGljIGludCB4bGF0X3N0YXR1cyh2b2lkICpidWYsIHVuc2lnbmVkIGludCBjbWQpCitzdGF0aWMgaW50IHhsYXRfc3RhdHVzKHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGNtZCwgdTMyIHN0YXR1cykKIHsKIAlzdHJ1Y3QgbmRfY21kX2NsZWFyX2Vycm9yICpjbGVhcl9lcnI7CiAJc3RydWN0IG5kX2NtZF9hcnNfc3RhdHVzICphcnNfc3RhdHVzOwotCXN0cnVjdCBuZF9jbWRfYXJzX3N0YXJ0ICphcnNfc3RhcnQ7Ci0Jc3RydWN0IG5kX2NtZF9hcnNfY2FwICphcnNfY2FwOwogCXUxNiBmbGFnczsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBORF9DTURfQVJTX0NBUDoKLQkJYXJzX2NhcCA9IGJ1ZjsKLQkJaWYgKChhcnNfY2FwLT5zdGF0dXMgJiAweGZmZmYpID09IE5GSVRfQVJTX0NBUF9OT05FKQorCQlpZiAoKHN0YXR1cyAmIDB4ZmZmZikgPT0gTkZJVF9BUlNfQ0FQX05PTkUpCiAJCQlyZXR1cm4gLUVOT1RUWTsKIAogCQkvKiBDb21tYW5kIGZhaWxlZCAqLwotCQlpZiAoYXJzX2NhcC0+c3RhdHVzICYgMHhmZmZmKQorCQlpZiAoc3RhdHVzICYgMHhmZmZmKQogCQkJcmV0dXJuIC1FSU87CiAKIAkJLyogTm8gc3VwcG9ydGVkIHNjYW4gdHlwZXMgZm9yIHRoaXMgcmFuZ2UgKi8KIAkJZmxhZ3MgPSBORF9BUlNfUEVSU0lTVEVOVCB8IE5EX0FSU19WT0xBVElMRTsKLQkJaWYgKChhcnNfY2FwLT5zdGF0dXMgPj4gMTYgJiBmbGFncykgPT0gMCkKKwkJaWYgKChzdGF0dXMgPj4gMTYgJiBmbGFncykgPT0gMCkKIAkJCXJldHVybiAtRU5PVFRZOwogCQlicmVhazsKIAljYXNlIE5EX0NNRF9BUlNfU1RBUlQ6Ci0JCWFyc19zdGFydCA9IGJ1ZjsKIAkJLyogQVJTIGlzIGluIHByb2dyZXNzICovCi0JCWlmICgoYXJzX3N0YXJ0LT5zdGF0dXMgJiAweGZmZmYpID09IE5GSVRfQVJTX1NUQVJUX0JVU1kpCisJCWlmICgoc3RhdHVzICYgMHhmZmZmKSA9PSBORklUX0FSU19TVEFSVF9CVVNZKQogCQkJcmV0dXJuIC1FQlVTWTsKIAogCQkvKiBDb21tYW5kIGZhaWxlZCAqLwotCQlpZiAoYXJzX3N0YXJ0LT5zdGF0dXMgJiAweGZmZmYpCisJCWlmIChzdGF0dXMgJiAweGZmZmYpCiAJCQlyZXR1cm4gLUVJTzsKIAkJYnJlYWs7CiAJY2FzZSBORF9DTURfQVJTX1NUQVRVUzoKIAkJYXJzX3N0YXR1cyA9IGJ1ZjsKIAkJLyogQ29tbWFuZCBmYWlsZWQgKi8KLQkJaWYgKGFyc19zdGF0dXMtPnN0YXR1cyAmIDB4ZmZmZikKKwkJaWYgKHN0YXR1cyAmIDB4ZmZmZikKIAkJCXJldHVybiAtRUlPOwogCQkvKiBDaGVjayBleHRlbmRlZCBzdGF0dXMgKFVwcGVyIHR3byBieXRlcykgKi8KLQkJaWYgKGFyc19zdGF0dXMtPnN0YXR1cyA9PSBORklUX0FSU19TVEFUVVNfRE9ORSkKKwkJaWYgKHN0YXR1cyA9PSBORklUX0FSU19TVEFUVVNfRE9ORSkKIAkJCXJldHVybiAwOwogCiAJCS8qIEFSUyBpcyBpbiBwcm9ncmVzcyAqLwotCQlpZiAoYXJzX3N0YXR1cy0+c3RhdHVzID09IE5GSVRfQVJTX1NUQVRVU19CVVNZKQorCQlpZiAoc3RhdHVzID09IE5GSVRfQVJTX1NUQVRVU19CVVNZKQogCQkJcmV0dXJuIC1FQlVTWTsKIAogCQkvKiBObyBBUlMgcGVyZm9ybWVkIGZvciB0aGUgY3VycmVudCBib290ICovCi0JCWlmIChhcnNfc3RhdHVzLT5zdGF0dXMgPT0gTkZJVF9BUlNfU1RBVFVTX05PTkUpCisJCWlmIChzdGF0dXMgPT0gTkZJVF9BUlNfU1RBVFVTX05PTkUpCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAogCQkvKgpAQCAtMTQ5LDE5ICsxNDUsMTkgQEAKIAkJICogYWdlbnQgd2FudHMgdGhlIHNjYW4gdG8gc3RvcC4gIElmIHdlIGRpZG4ndCBvdmVyZmxvdwogCQkgKiB0aGVuIGp1c3QgY29udGludWUgd2l0aCB0aGUgcmV0dXJuZWQgcmVzdWx0cy4KIAkJICovCi0JCWlmIChhcnNfc3RhdHVzLT5zdGF0dXMgPT0gTkZJVF9BUlNfU1RBVFVTX0lOVFIpIHsKKwkJaWYgKHN0YXR1cyA9PSBORklUX0FSU19TVEFUVVNfSU5UUikgewogCQkJaWYgKGFyc19zdGF0dXMtPmZsYWdzICYgTkZJVF9BUlNfRl9PVkVSRkxPVykKIAkJCQlyZXR1cm4gLUVOT1NQQzsKIAkJCXJldHVybiAwOwogCQl9CiAKIAkJLyogVW5rbm93biBzdGF0dXMgKi8KLQkJaWYgKGFyc19zdGF0dXMtPnN0YXR1cyA+PiAxNikKKwkJaWYgKHN0YXR1cyA+PiAxNikKIAkJCXJldHVybiAtRUlPOwogCQlicmVhazsKIAljYXNlIE5EX0NNRF9DTEVBUl9FUlJPUjoKIAkJY2xlYXJfZXJyID0gYnVmOwotCQlpZiAoY2xlYXJfZXJyLT5zdGF0dXMgJiAweGZmZmYpCisJCWlmIChzdGF0dXMgJiAweGZmZmYpCiAJCQlyZXR1cm4gLUVJTzsKIAkJaWYgKCFjbGVhcl9lcnItPmNsZWFyZWQpCiAJCQlyZXR1cm4gLUVJTzsKQEAgLTE3Miw2ICsxNjgsOSBAQAogCQlicmVhazsKIAl9CiAKKwkvKiBhbGwgb3RoZXIgbm9uLXplcm8gc3RhdHVzIHJlc3VsdHMgaW4gYW4gZXJyb3IgKi8KKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg2LDEwICsxODUsMTAgQEAKIAlzdHJ1Y3QgbmRfY21kX3BrZyAqY2FsbF9wa2cgPSBOVUxMOwogCWNvbnN0IGNoYXIgKmNtZF9uYW1lLCAqZGltbV9uYW1lOwogCXVuc2lnbmVkIGxvbmcgY21kX21hc2ssIGRzbV9tYXNrOworCXUzMiBvZmZzZXQsIGZ3X3N0YXR1cyA9IDA7CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwogCXVuc2lnbmVkIGludCBmdW5jOwogCWNvbnN0IHU4ICp1dWlkOwotCXUzMiBvZmZzZXQ7CiAJaW50IHJjLCBpOwogCiAJZnVuYyA9IGNtZDsKQEAgLTMxNyw2ICszMTYsMTUgQEAKIAkJCQlvdXRfb2JqLT5idWZmZXIucG9pbnRlciArIG9mZnNldCwgb3V0X3NpemUpOwogCQlvZmZzZXQgKz0gb3V0X3NpemU7CiAJfQorCisJLyoKKwkgKiBTZXQgZndfc3RhdHVzIGZvciBhbGwgdGhlIGNvbW1hbmRzIHdpdGggYSBrbm93biBmb3JtYXQgdG8gYmUKKwkgKiBsYXRlciBpbnRlcnByZXRlZCBieSB4bGF0X3N0YXR1cygpLgorCSAqLworCWlmIChpID49IDEgJiYgKChjbWQgPj0gTkRfQ01EX0FSU19DQVAgJiYgY21kIDw9IE5EX0NNRF9DTEVBUl9FUlJPUikKKwkJCXx8IChjbWQgPj0gTkRfQ01EX1NNQVJUICYmIGNtZCA8PSBORF9DTURfVkVORE9SKSkpCisJCWZ3X3N0YXR1cyA9ICoodTMyICopIG91dF9vYmotPmJ1ZmZlci5wb2ludGVyOworCiAJaWYgKG9mZnNldCArIGluX2J1Zi5idWZmZXIubGVuZ3RoIDwgYnVmX2xlbikgewogCQlpZiAoaSA+PSAxKSB7CiAJCQkvKgpAQCAtMzI1LDcgKzMzMyw3IEBACiAJCQkgKi8KIAkJCXJjID0gYnVmX2xlbiAtIG9mZnNldCAtIGluX2J1Zi5idWZmZXIubGVuZ3RoOwogCQkJaWYgKGNtZF9yYykKLQkJCQkqY21kX3JjID0geGxhdF9zdGF0dXMoYnVmLCBjbWQpOworCQkJCSpjbWRfcmMgPSB4bGF0X3N0YXR1cyhidWYsIGNtZCwgZndfc3RhdHVzKTsKIAkJfSBlbHNlIHsKIAkJCWRldl9lcnIoZGV2LCAiJXM6JXMgdW5kZXJydW4gY21kOiAlcyBidWZfbGVuOiAlZCBvdXRfbGVuOiAlZFxuIiwKIAkJCQkJX19mdW5jX18sIGRpbW1fbmFtZSwgY21kX25hbWUsIGJ1Zl9sZW4sCkBAIC0zMzUsNyArMzQzLDcgQEAKIAl9IGVsc2UgewogCQlyYyA9IDA7CiAJCWlmIChjbWRfcmMpCi0JCQkqY21kX3JjID0geGxhdF9zdGF0dXMoYnVmLCBjbWQpOworCQkJKmNtZF9yYyA9IHhsYXRfc3RhdHVzKGJ1ZiwgY21kLCBmd19zdGF0dXMpOwogCX0KIAogIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uZml0L21jZS5jIGIvZHJpdmVycy9hY3BpL25maXQvbWNlLmMKaW5kZXggNGM3NDViZi4uMTYxZjkxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL25maXQvbWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL25maXQvbWNlLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShuZml0X3NwYSwgJmFjcGlfZGVzYy0+c3BhcywgbGlzdCkgewogCQkJc3RydWN0IGFjcGlfbmZpdF9zeXN0ZW1fYWRkcmVzcyAqc3BhID0gbmZpdF9zcGEtPnNwYTsKIAotCQkJaWYgKG5maXRfc3BhX3R5cGUoc3BhKSA9PSBORklUX1NQQV9QTSkKKwkJCWlmIChuZml0X3NwYV90eXBlKHNwYSkgIT0gTkZJVF9TUEFfUE0pCiAJCQkJY29udGludWU7CiAJCQkvKiBmaW5kIHRoZSBzcGEgdGhhdCBjb3ZlcnMgdGhlIG1jZSBhZGRyICovCiAJCQlpZiAoc3BhLT5hZGRyZXNzID4gbWNlLT5hZGRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYyBiL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKaW5kZXggMmM0NWRkMy4uYzU3NmE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCkBAIC00MTEsNyArNDExLDE1IEBACiAJaW50IGdzaTsKIAl1OCBwaW47CiAJaW50IHRyaWdnZXJpbmcgPSBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKLQlpbnQgcG9sYXJpdHkgPSBBQ1BJX0FDVElWRV9MT1c7CisJLyoKKwkgKiBPbiBBUk0gc3lzdGVtcyB3aXRoIHRoZSBHSUMgaW50ZXJydXB0IG1vZGVsLCBsZXZlbCBpbnRlcnJ1cHRzCisJICogYXJlIGFsd2F5cyBwb2xhcml0eSBoaWdoIGJ5IHNwZWNpZmljYXRpb247IFBDSSBsZWdhY3kKKwkgKiBJUlFzIGxpbmVzIGFyZSBpbnZlcnRlZCBiZWZvcmUgcmVhY2hpbmcgdGhlIGludGVycnVwdAorCSAqIGNvbnRyb2xsZXIgYW5kIG11c3QgdGhlcmVmb3JlIGJlIGNvbnNpZGVyZWQgYWN0aXZlIGhpZ2gKKwkgKiBhcyBkZWZhdWx0LgorCSAqLworCWludCBwb2xhcml0eSA9IGFjcGlfaXJxX21vZGVsID09IEFDUElfSVJRX01PREVMX0dJQyA/CisJCQkJICAgICAgQUNQSV9BQ1RJVkVfSElHSCA6IEFDUElfQUNUSVZFX0xPVzsKIAljaGFyICpsaW5rID0gTlVMTDsKIAljaGFyIGxpbmtfZGVzY1sxNl07CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwppbmRleCBkMTQ0MTY4Li5iZjYwMWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYwpAQCAtNjE0LDcgKzYxNCwxNyBAQAogCWlmIChob3RhZGQpIHsKIAkJcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXlfYnVzKHJvb3QtPmJ1cyk7CiAJCXBjaV9hc3NpZ25fdW5hc3NpZ25lZF9yb290X2J1c19yZXNvdXJjZXMocm9vdC0+YnVzKTsKLQkJYWNwaV9pb2FwaWNfYWRkKHJvb3QpOworCQkvKgorCQkgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGZvciB0aGUgaG90YWRkIGNhc2UuIEZvciB0aGUgYm9vdC10aW1lCisJCSAqIGNhc2UsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBhZnRlciBQQ0kgaW5pdGlhbGl6YXRpb24gaW4KKwkJICogb3JkZXIgdG8gZGVhbCB3aXRoIElPQVBJQ3MgbWFwcGVkIGluIG9uIGEgUENJIEJBUi4KKwkJICoKKwkJICogVGhpcyBpcyBjdXJyZW50bHkgeDg2LXNwZWNpZmljLCBiZWNhdXNlIGFjcGlfaW9hcGljX2FkZCgpCisJCSAqIGlzIGFuIGVtcHR5IGZ1bmN0aW9uIHdpdGhvdXQgQ09ORklHX0FDUElfSE9UUExVR19JT0FQSUMuCisJCSAqIEFuZCBDT05GSUdfQUNQSV9IT1RQTFVHX0lPQVBJQyBkZXBlbmRzIG9uIENPTkZJR19YODZfSU9fQVBJQworCQkgKiAoc2VlIGRyaXZlcnMvYWNwaS9LY29uZmlnKS4KKwkJICovCisJCWFjcGlfaW9hcGljX2FkZChyb290LT5kZXZpY2UtPmhhbmRsZSk7CiAJfQogCiAJcGNpX2xvY2tfcmVzY2FuX3JlbW92ZSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCA5MTI1ZDdkLi41Yzc4ZWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtMzIsMTIgKzMyLDEyIEBACiB9CiAKIHN0YXRpYyBpbnQgbWFwX2xhcGljX2lkKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqZW50cnksCi0JCSB1MzIgYWNwaV9pZCwgcGh5c19jcHVpZF90ICphcGljX2lkKQorCQkgdTMyIGFjcGlfaWQsIHBoeXNfY3B1aWRfdCAqYXBpY19pZCwgYm9vbCBpZ25vcmVfZGlzYWJsZWQpCiB7CiAJc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljICpsYXBpYyA9CiAJCWNvbnRhaW5lcl9vZihlbnRyeSwgc3RydWN0IGFjcGlfbWFkdF9sb2NhbF9hcGljLCBoZWFkZXIpOwogCi0JaWYgKCEobGFwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQorCWlmIChpZ25vcmVfZGlzYWJsZWQgJiYgIShsYXBpYy0+bGFwaWNfZmxhZ3MgJiBBQ1BJX01BRFRfRU5BQkxFRCkpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKGxhcGljLT5wcm9jZXNzb3JfaWQgIT0gYWNwaV9pZCkKQEAgLTQ4LDEyICs0OCwxMyBAQAogfQogCiBzdGF0aWMgaW50IG1hcF94MmFwaWNfaWQoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICplbnRyeSwKLQkJaW50IGRldmljZV9kZWNsYXJhdGlvbiwgdTMyIGFjcGlfaWQsIHBoeXNfY3B1aWRfdCAqYXBpY19pZCkKKwkJaW50IGRldmljZV9kZWNsYXJhdGlvbiwgdTMyIGFjcGlfaWQsIHBoeXNfY3B1aWRfdCAqYXBpY19pZCwKKwkJYm9vbCBpZ25vcmVfZGlzYWJsZWQpCiB7CiAJc3RydWN0IGFjcGlfbWFkdF9sb2NhbF94MmFwaWMgKmFwaWMgPQogCQljb250YWluZXJfb2YoZW50cnksIHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfeDJhcGljLCBoZWFkZXIpOwogCi0JaWYgKCEoYXBpYy0+bGFwaWNfZmxhZ3MgJiBBQ1BJX01BRFRfRU5BQkxFRCkpCisJaWYgKGlnbm9yZV9kaXNhYmxlZCAmJiAhKGFwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChkZXZpY2VfZGVjbGFyYXRpb24gJiYgKGFwaWMtPnVpZCA9PSBhY3BpX2lkKSkgewpAQCAtNjUsMTIgKzY2LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgbWFwX2xzYXBpY19pZChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmVudHJ5LAotCQlpbnQgZGV2aWNlX2RlY2xhcmF0aW9uLCB1MzIgYWNwaV9pZCwgcGh5c19jcHVpZF90ICphcGljX2lkKQorCQlpbnQgZGV2aWNlX2RlY2xhcmF0aW9uLCB1MzIgYWNwaV9pZCwgcGh5c19jcHVpZF90ICphcGljX2lkLAorCQlib29sIGlnbm9yZV9kaXNhYmxlZCkKIHsKIAlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3NhcGljICpsc2FwaWMgPQogCQljb250YWluZXJfb2YoZW50cnksIHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfc2FwaWMsIGhlYWRlcik7CiAKLQlpZiAoIShsc2FwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQorCWlmIChpZ25vcmVfZGlzYWJsZWQgJiYgIShsc2FwaWMtPmxhcGljX2ZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChkZXZpY2VfZGVjbGFyYXRpb24pIHsKQEAgLTg3LDEyICs4OSwxMyBAQAogICogUmV0cmlldmUgdGhlIEFSTSBDUFUgcGh5c2ljYWwgaWRlbnRpZmllciAoTVBJRFIpCiAgKi8KIHN0YXRpYyBpbnQgbWFwX2dpY2NfbXBpZHIoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICplbnRyeSwKLQkJaW50IGRldmljZV9kZWNsYXJhdGlvbiwgdTMyIGFjcGlfaWQsIHBoeXNfY3B1aWRfdCAqbXBpZHIpCisJCWludCBkZXZpY2VfZGVjbGFyYXRpb24sIHUzMiBhY3BpX2lkLCBwaHlzX2NwdWlkX3QgKm1waWRyLAorCQlib29sIGlnbm9yZV9kaXNhYmxlZCkKIHsKIAlzdHJ1Y3QgYWNwaV9tYWR0X2dlbmVyaWNfaW50ZXJydXB0ICpnaWNjID0KIAkgICAgY29udGFpbmVyX29mKGVudHJ5LCBzdHJ1Y3QgYWNwaV9tYWR0X2dlbmVyaWNfaW50ZXJydXB0LCBoZWFkZXIpOwogCi0JaWYgKCEoZ2ljYy0+ZmxhZ3MgJiBBQ1BJX01BRFRfRU5BQkxFRCkpCisJaWYgKGlnbm9yZV9kaXNhYmxlZCAmJiAhKGdpY2MtPmZsYWdzICYgQUNQSV9NQURUX0VOQUJMRUQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qIGRldmljZV9kZWNsYXJhdGlvbiBtZWFucyBEZXZpY2Ugb2JqZWN0IGluIERTRFQsIGluIHRoZQpAQCAtMTA5LDcgKzExMiw3IEBACiB9CiAKIHN0YXRpYyBwaHlzX2NwdWlkX3QgbWFwX21hZHRfZW50cnkoc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqbWFkdCwKLQkJCQkgICBpbnQgdHlwZSwgdTMyIGFjcGlfaWQpCisJCQkJICAgaW50IHR5cGUsIHUzMiBhY3BpX2lkLCBib29sIGlnbm9yZV9kaXNhYmxlZCkKIHsKIAl1bnNpZ25lZCBsb25nIG1hZHRfZW5kLCBlbnRyeTsKIAlwaHlzX2NwdWlkX3QgcGh5c19pZCA9IFBIWVNfQ1BVSURfSU5WQUxJRDsJLyogQ1BVIGhhcmR3YXJlIElEICovCkBAIC0xMjcsMTYgKzEzMCwyMCBAQAogCQlzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciA9CiAJCQkoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICopZW50cnk7CiAJCWlmIChoZWFkZXItPnR5cGUgPT0gQUNQSV9NQURUX1RZUEVfTE9DQUxfQVBJQykgewotCQkJaWYgKCFtYXBfbGFwaWNfaWQoaGVhZGVyLCBhY3BpX2lkLCAmcGh5c19pZCkpCisJCQlpZiAoIW1hcF9sYXBpY19pZChoZWFkZXIsIGFjcGlfaWQsICZwaHlzX2lkLAorCQkJCQkgIGlnbm9yZV9kaXNhYmxlZCkpCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1gyQVBJQykgewotCQkJaWYgKCFtYXBfeDJhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQpKQorCQkJaWYgKCFtYXBfeDJhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQsCisJCQkJCSAgIGlnbm9yZV9kaXNhYmxlZCkpCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1NBUElDKSB7Ci0JCQlpZiAoIW1hcF9sc2FwaWNfaWQoaGVhZGVyLCB0eXBlLCBhY3BpX2lkLCAmcGh5c19pZCkpCisJCQlpZiAoIW1hcF9sc2FwaWNfaWQoaGVhZGVyLCB0eXBlLCBhY3BpX2lkLCAmcGh5c19pZCwKKwkJCQkJICAgaWdub3JlX2Rpc2FibGVkKSkKIAkJCQlicmVhazsKIAkJfSBlbHNlIGlmIChoZWFkZXItPnR5cGUgPT0gQUNQSV9NQURUX1RZUEVfR0VORVJJQ19JTlRFUlJVUFQpIHsKLQkJCWlmICghbWFwX2dpY2NfbXBpZHIoaGVhZGVyLCB0eXBlLCBhY3BpX2lkLCAmcGh5c19pZCkpCisJCQlpZiAoIW1hcF9naWNjX21waWRyKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQsCisJCQkJCSAgICBpZ25vcmVfZGlzYWJsZWQpKQogCQkJCWJyZWFrOwogCQl9CiAJCWVudHJ5ICs9IGhlYWRlci0+bGVuZ3RoOwpAQCAtMTU2LDE0ICsxNjMsMTUgQEAKIAlpZiAoIW1hZHQpCiAJCXJldHVybiBQSFlTX0NQVUlEX0lOVkFMSUQ7CiAKLQlydiA9IG1hcF9tYWR0X2VudHJ5KG1hZHQsIDEsIGFjcGlfaWQpOworCXJ2ID0gbWFwX21hZHRfZW50cnkobWFkdCwgMSwgYWNwaV9pZCwgdHJ1ZSk7CiAKIAllYXJseV9hY3BpX29zX3VubWFwX21lbW9yeShtYWR0LCB0Ymxfc2l6ZSk7CiAKIAlyZXR1cm4gcnY7CiB9CiAKLXN0YXRpYyBwaHlzX2NwdWlkX3QgbWFwX21hdF9lbnRyeShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlLCB1MzIgYWNwaV9pZCkKK3N0YXRpYyBwaHlzX2NwdWlkX3QgbWFwX21hdF9lbnRyeShhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlLCB1MzIgYWNwaV9pZCwKKwkJCQkgIGJvb2wgaWdub3JlX2Rpc2FibGVkKQogewogCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7IEFDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMIH07CiAJdW5pb24gYWNwaV9vYmplY3QgKm9iajsKQEAgLTE4NCwzMCArMTkyLDM4IEBACiAKIAloZWFkZXIgPSAoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICopb2JqLT5idWZmZXIucG9pbnRlcjsKIAlpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX0FQSUMpCi0JCW1hcF9sYXBpY19pZChoZWFkZXIsIGFjcGlfaWQsICZwaHlzX2lkKTsKKwkJbWFwX2xhcGljX2lkKGhlYWRlciwgYWNwaV9pZCwgJnBoeXNfaWQsIGlnbm9yZV9kaXNhYmxlZCk7CiAJZWxzZSBpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1NBUElDKQotCQltYXBfbHNhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQpOworCQltYXBfbHNhcGljX2lkKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQsIGlnbm9yZV9kaXNhYmxlZCk7CiAJZWxzZSBpZiAoaGVhZGVyLT50eXBlID09IEFDUElfTUFEVF9UWVBFX0xPQ0FMX1gyQVBJQykKLQkJbWFwX3gyYXBpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZwaHlzX2lkKTsKKwkJbWFwX3gyYXBpY19pZChoZWFkZXIsIHR5cGUsIGFjcGlfaWQsICZwaHlzX2lkLCBpZ25vcmVfZGlzYWJsZWQpOwogCWVsc2UgaWYgKGhlYWRlci0+dHlwZSA9PSBBQ1BJX01BRFRfVFlQRV9HRU5FUklDX0lOVEVSUlVQVCkKLQkJbWFwX2dpY2NfbXBpZHIoaGVhZGVyLCB0eXBlLCBhY3BpX2lkLCAmcGh5c19pZCk7CisJCW1hcF9naWNjX21waWRyKGhlYWRlciwgdHlwZSwgYWNwaV9pZCwgJnBoeXNfaWQsCisJCQkgICAgICAgaWdub3JlX2Rpc2FibGVkKTsKIAogZXhpdDoKIAlrZnJlZShidWZmZXIucG9pbnRlcik7CiAJcmV0dXJuIHBoeXNfaWQ7CiB9CiAKLXBoeXNfY3B1aWRfdCBhY3BpX2dldF9waHlzX2lkKGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUsIHUzMiBhY3BpX2lkKQorc3RhdGljIHBoeXNfY3B1aWRfdCBfX2FjcGlfZ2V0X3BoeXNfaWQoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgdHlwZSwKKwkJCQkgICAgICAgdTMyIGFjcGlfaWQsIGJvb2wgaWdub3JlX2Rpc2FibGVkKQogewogCXBoeXNfY3B1aWRfdCBwaHlzX2lkOwogCi0JcGh5c19pZCA9IG1hcF9tYXRfZW50cnkoaGFuZGxlLCB0eXBlLCBhY3BpX2lkKTsKKwlwaHlzX2lkID0gbWFwX21hdF9lbnRyeShoYW5kbGUsIHR5cGUsIGFjcGlfaWQsIGlnbm9yZV9kaXNhYmxlZCk7CiAJaWYgKGludmFsaWRfcGh5c19jcHVpZChwaHlzX2lkKSkKLQkJcGh5c19pZCA9IG1hcF9tYWR0X2VudHJ5KGdldF9tYWR0X3RhYmxlKCksIHR5cGUsIGFjcGlfaWQpOworCQlwaHlzX2lkID0gbWFwX21hZHRfZW50cnkoZ2V0X21hZHRfdGFibGUoKSwgdHlwZSwgYWNwaV9pZCwKKwkJCQkJICAgaWdub3JlX2Rpc2FibGVkKTsKIAogCXJldHVybiBwaHlzX2lkOwogfQogCitwaHlzX2NwdWlkX3QgYWNwaV9nZXRfcGh5c19pZChhY3BpX2hhbmRsZSBoYW5kbGUsIGludCB0eXBlLCB1MzIgYWNwaV9pZCkKK3sKKwlyZXR1cm4gX19hY3BpX2dldF9waHlzX2lkKGhhbmRsZSwgdHlwZSwgYWNwaV9pZCwgdHJ1ZSk7Cit9CisKIGludCBhY3BpX21hcF9jcHVpZChwaHlzX2NwdWlkX3QgcGh5c19pZCwgdTMyIGFjcGlfaWQpCiB7CiAjaWZkZWYgQ09ORklHX1NNUApAQCAtMjY0LDYgKzI4MCw3OSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9nZXRfY3B1aWQpOwogCisjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19DUFUKK3N0YXRpYyBib29sIF9faW5pdAorbWFwX3Byb2Nlc3NvcihhY3BpX2hhbmRsZSBoYW5kbGUsIHBoeXNfY3B1aWRfdCAqcGh5c19pZCwgaW50ICpjcHVpZCkKK3sKKwlpbnQgdHlwZSwgaWQ7CisJdTMyIGFjcGlfaWQ7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfb2JqZWN0X3R5cGUgYWNwaV90eXBlOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXA7CisJdW5pb24gYWNwaV9vYmplY3Qgb2JqZWN0ID0geyAwIH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSwgJm9iamVjdCB9OworCisJc3RhdHVzID0gYWNwaV9nZXRfdHlwZShoYW5kbGUsICZhY3BpX3R5cGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIGZhbHNlOworCisJc3dpdGNoIChhY3BpX3R5cGUpIHsKKwljYXNlIEFDUElfVFlQRV9QUk9DRVNTT1I6CisJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgTlVMTCwgTlVMTCwgJmJ1ZmZlcik7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJYWNwaV9pZCA9IG9iamVjdC5wcm9jZXNzb3IucHJvY19pZDsKKworCQkvKiB2YWxpZGF0ZSB0aGUgYWNwaV9pZCAqLworCQlpZihhY3BpX3Byb2Nlc3Nvcl92YWxpZGF0ZV9wcm9jX2lkKGFjcGlfaWQpKQorCQkJcmV0dXJuIGZhbHNlOworCQlicmVhazsKKwljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CisJCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihoYW5kbGUsICJfVUlEIiwgTlVMTCwgJnRtcCk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJYWNwaV9pZCA9IHRtcDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXR5cGUgPSAoYWNwaV90eXBlID09IEFDUElfVFlQRV9ERVZJQ0UpID8gMSA6IDA7CisKKwkqcGh5c19pZCA9IF9fYWNwaV9nZXRfcGh5c19pZChoYW5kbGUsIHR5cGUsIGFjcGlfaWQsIGZhbHNlKTsKKwlpZCA9IGFjcGlfbWFwX2NwdWlkKCpwaHlzX2lkLCBhY3BpX2lkKTsKKworCWlmIChpZCA8IDApCisJCXJldHVybiBmYWxzZTsKKwkqY3B1aWQgPSBpZDsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIF9faW5pdAorc2V0X3Byb2Nlc3Nvcl9ub2RlX21hcHBpbmcoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbHZsLCB2b2lkICpjb250ZXh0LAorCQkJICAgdm9pZCAqKnJ2KQoreworCXBoeXNfY3B1aWRfdCBwaHlzX2lkOworCWludCBjcHVfaWQ7CisKKwlpZiAoIW1hcF9wcm9jZXNzb3IoaGFuZGxlLCAmcGh5c19pZCwgJmNwdV9pZCkpCisJCXJldHVybiBBRV9FUlJPUjsKKworCWFjcGlfbWFwX2NwdTJub2RlKGhhbmRsZSwgY3B1X2lkLCBwaHlzX2lkKTsKKwlyZXR1cm4gQUVfT0s7Cit9CisKK3ZvaWQgX19pbml0IGFjcGlfc2V0X3Byb2Nlc3Nvcl9tYXBwaW5nKHZvaWQpCit7CisJLyogU2V0IHBlcnNpc3RlbnQgY3B1IDwtPiBub2RlIG1hcHBpbmcgZm9yIGFsbCBwcm9jZXNzb3JzLiAqLworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX1BST0NFU1NPUiwgQUNQSV9ST09UX09CSkVDVCwKKwkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIHNldF9wcm9jZXNzb3Jfbm9kZV9tYXBwaW5nLAorCQkJICAgIE5VTEwsIE5VTEwsIE5VTEwpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0IGFjcGlfc2V0X3Byb2Nlc3Nvcl9tYXBwaW5nKHZvaWQpIHt9CisjZW5kaWYgLyogQ09ORklHX0FDUElfSE9UUExVR19DUFUgKi8KKwogI2lmZGVmIENPTkZJR19BQ1BJX0hPVFBMVUdfSU9BUElDCiBzdGF0aWMgaW50IGdldF9pb2FwaWNfaWQoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICplbnRyeSwgdTMyIGdzaV9iYXNlLAogCQkJIHU2NCAqcGh5c19hZGRyLCBpbnQgKmlvYXBpY19pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfZHJpdmVyLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2RyaXZlci5jCmluZGV4IDA1NTNhZWUuLjlkNWYwYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9kcml2ZXIuYwpAQCAtMTEwLDU1ICsxMTAsNDYgQEAKIAogc3RhdGljIGludCBfX2FjcGlfcHJvY2Vzc29yX3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAotc3RhdGljIGludCBhY3BpX2NwdV9zb2Z0X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCQkJICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgYWNwaV9zb2Z0X2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKIAlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gcGVyX2NwdShwcm9jZXNzb3JzLCBjcHUpOwogCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwotCWFjdGlvbiAmPSB+Q1BVX1RBU0tTX0ZST1pFTjsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RFQUQ6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOT1RJRllfRE9ORTsKLQl9CiAKIAlpZiAoIXByIHx8IGFjcGlfYnVzX2dldF9kZXZpY2UocHItPmhhbmRsZSwgJmRldmljZSkpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBDUFUgZ290IHBoeXNpY2FsbHkgaG90cGx1Z2dlZCBhbmQgb25saW5lZCBmb3IgdGhlIGZpcnN0IHRpbWU6CisJICogSW5pdGlhbGl6ZSBtaXNzaW5nIHRoaW5ncy4KKwkgKi8KKwlpZiAocHItPmZsYWdzLm5lZWRfaG90cGx1Z19pbml0KSB7CisJCWludCByZXQ7CiAKLQlpZiAoYWN0aW9uID09IENQVV9PTkxJTkUpIHsKLQkJLyoKLQkJICogQ1BVIGdvdCBwaHlzaWNhbGx5IGhvdHBsdWdnZWQgYW5kIG9ubGluZWQgZm9yIHRoZSBmaXJzdCB0aW1lOgotCQkgKiBJbml0aWFsaXplIG1pc3NpbmcgdGhpbmdzLgotCQkgKi8KLQkJaWYgKHByLT5mbGFncy5uZWVkX2hvdHBsdWdfaW5pdCkgewotCQkJaW50IHJldDsKLQotCQkJcHJfaW5mbygiV2lsbCBvbmxpbmUgYW5kIGluaXQgaG90cGx1Z2dlZCBDUFU6ICVkXG4iLAotCQkJCXByLT5pZCk7Ci0JCQlwci0+ZmxhZ3MubmVlZF9ob3RwbHVnX2luaXQgPSAwOwotCQkJcmV0ID0gX19hY3BpX3Byb2Nlc3Nvcl9zdGFydChkZXZpY2UpOwotCQkJV0FSTihyZXQsICJGYWlsZWQgdG8gc3RhcnQgQ1BVOiAlZFxuIiwgcHItPmlkKTsKLQkJfSBlbHNlIHsKLQkJCS8qIE5vcm1hbCBDUFUgc29mdCBvbmxpbmUgZXZlbnQuICovCi0JCQlhY3BpX3Byb2Nlc3Nvcl9wcGNfaGFzX2NoYW5nZWQocHIsIDApOwotCQkJYWNwaV9wcm9jZXNzb3JfaG90cGx1Zyhwcik7Ci0JCQlhY3BpX3Byb2Nlc3Nvcl9yZWV2YWx1YXRlX3RzdGF0ZShwciwgYWN0aW9uKTsKLQkJCWFjcGlfcHJvY2Vzc29yX3RzdGF0ZV9oYXNfY2hhbmdlZChwcik7Ci0JCX0KLQl9IGVsc2UgaWYgKGFjdGlvbiA9PSBDUFVfREVBRCkgewotCQkvKiBJbnZhbGlkYXRlIGZsYWcudGhyb3R0bGluZyBhZnRlciB0aGUgQ1BVIGlzIG9mZmxpbmUuICovCi0JCWFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHByLCBhY3Rpb24pOworCQlwcl9pbmZvKCJXaWxsIG9ubGluZSBhbmQgaW5pdCBob3RwbHVnZ2VkIENQVTogJWRcbiIsCisJCQlwci0+aWQpOworCQlwci0+ZmxhZ3MubmVlZF9ob3RwbHVnX2luaXQgPSAwOworCQlyZXQgPSBfX2FjcGlfcHJvY2Vzc29yX3N0YXJ0KGRldmljZSk7CisJCVdBUk4ocmV0LCAiRmFpbGVkIHRvIHN0YXJ0IENQVTogJWRcbiIsIHByLT5pZCk7CisJfSBlbHNlIHsKKwkJLyogTm9ybWFsIENQVSBzb2Z0IG9ubGluZSBldmVudC4gKi8KKwkJYWNwaV9wcm9jZXNzb3JfcHBjX2hhc19jaGFuZ2VkKHByLCAwKTsKKwkJYWNwaV9wcm9jZXNzb3JfaG90cGx1Zyhwcik7CisJCWFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHByLCBmYWxzZSk7CisJCWFjcGlfcHJvY2Vzc29yX3RzdGF0ZV9oYXNfY2hhbmdlZChwcik7CiAJfQotCXJldHVybiBOT1RJRllfT0s7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgYWNwaV9jcHVfbm90aWZpZXIgPSB7Ci0JICAgIC5ub3RpZmllcl9jYWxsID0gYWNwaV9jcHVfc29mdF9ub3RpZnksCi19Oworc3RhdGljIGludCBhY3BpX3NvZnRfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByID0gcGVyX2NwdShwcm9jZXNzb3JzLCBjcHUpOworCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOworCisJaWYgKCFwciB8fCBhY3BpX2J1c19nZXRfZGV2aWNlKHByLT5oYW5kbGUsICZkZXZpY2UpKQorCQlyZXR1cm4gMDsKKworCWFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHByLCB0cnVlKTsKKwlyZXR1cm4gMDsKK30KIAogI2lmZGVmIENPTkZJR19BQ1BJX0NQVV9GUkVRX1BTUwogc3RhdGljIGludCBhY3BpX3Bzc19wZXJmX2luaXQoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKQEAgLTI0NSw4ICsyMzYsOCBAQAogCQlyZXR1cm4gMDsKIAogCXJlc3VsdCA9IGFjcGlfY3BwY19wcm9jZXNzb3JfcHJvYmUocHIpOwotCWlmIChyZXN1bHQpCi0JCXJldHVybiAtRU5PREVWOworCWlmIChyZXN1bHQgJiYgIUlTX0VOQUJMRUQoQ09ORklHX0FDUElfQ1BVX0ZSRVFfUFNTKSkKKwkJZGV2X3dhcm4oJmRldmljZS0+ZGV2LCAiQ1BQQyBkYXRhIGludmFsaWQgb3Igbm90IHByZXNlbnRcbiIpOwogCiAJaWYgKCFjcHVpZGxlX2dldF9kcml2ZXIoKSB8fCBjcHVpZGxlX2dldF9kcml2ZXIoKSA9PSAmYWNwaV9pZGxlX2RyaXZlcikKIAkJYWNwaV9wcm9jZXNzb3JfcG93ZXJfaW5pdChwcik7CkBAIC0zMDMsNyArMjk0LDcgQEAKICAqIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgcG93ZXJub3ctazggZHJpdmVyLCB0aGF0IHdvcmtzIGV2ZW4gd2l0aG91dAogICogQUNQSSwgYnV0IG5lZWRzIHN5bWJvbHMgZnJvbSB0aGlzIGRyaXZlcgogICovCi0KK3N0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIGhwX29ubGluZTsKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfcHJvY2Vzc29yX2RyaXZlcl9pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CkBAIC0zMTUsMTEgKzMwNiwyMiBAQAogCWlmIChyZXN1bHQgPCAwKQogCQlyZXR1cm4gcmVzdWx0OwogCi0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZhY3BpX2NwdV9ub3RpZmllcik7CisJcmVzdWx0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLAorCQkJCQkgICAiYWNwaS9jcHUtZHJ2Om9ubGluZSIsCisJCQkJCSAgIGFjcGlfc29mdF9jcHVfb25saW5lLCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBlcnI7CisJaHBfb25saW5lID0gcmVzdWx0OworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQUNQSV9DUFVEUlZfREVBRCwgImFjcGkvY3B1LWRydjpkZWFkIiwKKwkJCQkgIE5VTEwsIGFjcGlfc29mdF9jcHVfZGVhZCk7CisKIAlhY3BpX3RoZXJtYWxfY3B1ZnJlcV9pbml0KCk7CiAJYWNwaV9wcm9jZXNzb3JfcHBjX2luaXQoKTsKIAlhY3BpX3Byb2Nlc3Nvcl90aHJvdHRsaW5nX2luaXQoKTsKIAlyZXR1cm4gMDsKK2VycjoKKwlkcml2ZXJfdW5yZWdpc3RlcigmYWNwaV9wcm9jZXNzb3JfZHJpdmVyKTsKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWNwaV9wcm9jZXNzb3JfZHJpdmVyX2V4aXQodm9pZCkKQEAgLTMyOSw3ICszMzEsOCBAQAogCiAJYWNwaV9wcm9jZXNzb3JfcHBjX2V4aXQoKTsKIAlhY3BpX3RoZXJtYWxfY3B1ZnJlcV9leGl0KCk7Ci0JdW5yZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmFjcGlfY3B1X25vdGlmaWVyKTsKKwljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhocF9vbmxpbmUpOworCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKENQVUhQX0FDUElfQ1BVRFJWX0RFQUQpOwogCWRyaXZlcl91bnJlZ2lzdGVyKCZhY3BpX3Byb2Nlc3Nvcl9kcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCmluZGV4IGM3MmU2NDguLmQ1MWNhMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCkBAIC0zNzUsMTEgKzM3NSwxMSBAQAogICoJMy4gVFNEIGRvbWFpbgogICovCiB2b2lkIGFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCi0JCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uKQorCQkJCQlib29sIGlzX2RlYWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKLQlpZiAoYWN0aW9uID09IENQVV9ERUFEKSB7CisJaWYgKGlzX2RlYWQpIHsKIAkJLyogV2hlbiBvbmUgQ1BVIGlzIG9mZmxpbmUsIHRoZSBULXN0YXRlIHRocm90dGxpbmcKIAkJICogd2lsbCBiZSBpbnZhbGlkYXRlZC4KIAkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2Nhbi5jIGIvZHJpdmVycy9hY3BpL3NjYW4uYwppbmRleCBhZDlmYzg0Li4wMzVhYzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKQEAgLTIwMDIsNiArMjAwMiw3IEBACiAJYWNwaV9wbnBfaW5pdCgpOwogCWFjcGlfaW50MzQweF90aGVybWFsX2luaXQoKTsKIAlhY3BpX2FtYmFfaW5pdCgpOworCWFjcGlfd2F0Y2hkb2dfaW5pdCgpOwogCiAJYWNwaV9zY2FuX2FkZF9oYW5kbGVyKCZnZW5lcmljX2RldmljZV9oYW5kbGVyKTsKIApAQCAtMjA0NCw2ICsyMDQ1LDcgQEAKIAl9CiAKIAlhY3BpX3VwZGF0ZV9hbGxfZ3BlcygpOworCWFjcGlfZWNfZWNkdF9zdGFydCgpOwogCiAJYWNwaV9zY2FuX2luaXRpYWxpemVkID0gdHJ1ZTsKIApAQCAtMjA1NCw3ICsyMDU2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhY3BpX3Byb2JlX2VudHJ5ICphcGU7CiBzdGF0aWMgaW50IGFjcGlfcHJvYmVfY291bnQ7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFjcGlfcHJvYmVfbG9jayk7CitzdGF0aWMgREVGSU5FX01VVEVYKGFjcGlfcHJvYmVfbXV0ZXgpOwogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX21hdGNoX21hZHQoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICpoZWFkZXIsCiAJCQkJICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKQEAgLTIwNzMsNyArMjA3NSw3IEBACiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrKCZhY3BpX3Byb2JlX2xvY2spOworCW11dGV4X2xvY2soJmFjcGlfcHJvYmVfbXV0ZXgpOwogCWZvciAoYXBlID0gYXBfaGVhZDsgbnI7IGFwZSsrLCBuci0tKSB7CiAJCWlmIChBQ1BJX0NPTVBBUkVfTkFNRShBQ1BJX1NJR19NQURULCBhcGUtPmlkKSkgewogCQkJYWNwaV9wcm9iZV9jb3VudCA9IDA7CkBAIC0yMDg2LDcgKzIwODgsNyBAQAogCQkJCWNvdW50Kys7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJmFjcGlfcHJvYmVfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhY3BpX3Byb2JlX211dGV4KTsKIAogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zbGVlcC5jIGIvZHJpdmVycy9hY3BpL3NsZWVwLmMKaW5kZXggMmIzOGMxYi4uZGViMGZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwLmMKKysrIGIvZHJpdmVycy9hY3BpL3NsZWVwLmMKQEAgLTU3Miw3ICs1NzIsNyBAQAogCiAJCWFjcGlfZ2V0X2V2ZW50X3N0YXR1cyhBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTiwgJnB3cl9idG5fc3RhdHVzKTsKIAotCQlpZiAocHdyX2J0bl9zdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfU0VUKSB7CisJCWlmIChwd3JfYnRuX3N0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19TVEFUVVNfU0VUKSB7CiAJCQlhY3BpX2NsZWFyX2V2ZW50KEFDUElfRVZFTlRfUE9XRVJfQlVUVE9OKTsKIAkJCS8qIEZsYWcgZm9yIGxhdGVyICovCiAJCQlwd3JfYnRuX2V2ZW50X3BlbmRpbmcgPSB0cnVlOwpAQCAtNTg2LDcgKzU4Niw3IEBACiAJICovCiAJYWNwaV9kaXNhYmxlX2FsbF9ncGVzKCk7CiAJLyogQWxsb3cgRUMgdHJhbnNhY3Rpb25zIHRvIGhhcHBlbi4gKi8KLQlhY3BpX2VjX3VuYmxvY2tfdHJhbnNhY3Rpb25zX2Vhcmx5KCk7CisJYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9ucygpOwogCiAJc3VzcGVuZF9udnNfcmVzdG9yZSgpOwogCkBAIC03ODQsNyArNzg0LDcgQEAKIAkvKiBSZXN0b3JlIHRoZSBOVlMgbWVtb3J5IGFyZWEgKi8KIAlzdXNwZW5kX252c19yZXN0b3JlKCk7CiAJLyogQWxsb3cgRUMgdHJhbnNhY3Rpb25zIHRvIGhhcHBlbi4gKi8KLQlhY3BpX2VjX3VuYmxvY2tfdHJhbnNhY3Rpb25zX2Vhcmx5KCk7CisJYWNwaV9lY191bmJsb2NrX3RyYW5zYWN0aW9ucygpOwogfQogCiBzdGF0aWMgdm9pZCBhY3BpX3BtX3RoYXcodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zcGNyLmMgYi9kcml2ZXJzL2FjcGkvc3Bjci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDdiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2FjcGkvc3Bjci5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBSZWQgSGF0LCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTYgTGluYXJvIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJBQ1BJOiBTUENSOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorCisvKioKKyAqIHBhcnNlX3NwY3IoKSAtIHBhcnNlIEFDUEkgU1BDUiB0YWJsZSBhbmQgYWRkIHByZWZlcnJlZCBjb25zb2xlCisgKgorICogQGVhcmx5Y29uOiBzZXQgdXAgZWFybHljb24gZm9yIHRoZSBjb25zb2xlIHNwZWNpZmllZCBieSB0aGUgdGFibGUKKyAqCisgKiBGb3IgdGhlIGFyY2hpdGVjdHVyZXMgd2l0aCBzdXBwb3J0IGZvciBBQ1BJLCBDT05GSUdfQUNQSV9TUENSX1RBQkxFIG1heSBiZQorICogZGVmaW5lZCB0byBwYXJzZSBBQ1BJIFNQQ1IgdGFibGUuICBBcyBhIHJlc3VsdCBvZiB0aGUgcGFyc2luZyBwcmVmZXJyZWQKKyAqIGNvbnNvbGUgaXMgcmVnaXN0ZXJlZCBhbmQgaWYgQGVhcmx5Y29uIGlzIHRydWUsIGVhcmx5Y29uIGlzIHNldCB1cC4KKyAqCisgKiBXaGVuIENPTkZJR19BQ1BJX1NQQ1JfVEFCTEUgaXMgZGVmaW5lZCwgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkCisgKiBmcm9tIGFyY2ggaW5pbnRpYWxpemF0aW9uIGNvZGUgYXMgc29vbiBhcyB0aGUgRFQvQUNQSSBkZWNpc2lvbiBpcyBtYWRlLgorICoKKyAqLworaW50IF9faW5pdCBwYXJzZV9zcGNyKGJvb2wgZWFybHljb24pCit7CisJc3RhdGljIGNoYXIgb3B0c1s2NF07CisJc3RydWN0IGFjcGlfdGFibGVfc3BjciAqdGFibGU7CisJYWNwaV9zaXplIHRhYmxlX3NpemU7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWNoYXIgKnVhcnQ7CisJY2hhciAqaW90eXBlOworCWludCBiYXVkX3JhdGU7CisJaW50IGVycjsKKworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlX3dpdGhfc2l6ZShBQ1BJX1NJR19TUENSLCAwLAorCQkJCQkgIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiopJnRhYmxlLAorCQkJCQkgICZ0YWJsZV9zaXplKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAodGFibGUtPmhlYWRlci5yZXZpc2lvbiA8IDIpIHsKKwkJZXJyID0gLUVOT0VOVDsKKwkJcHJfZXJyKCJ3cm9uZyB0YWJsZSB2ZXJzaW9uXG4iKTsKKwkJZ290byBkb25lOworCX0KKworCWlvdHlwZSA9IHRhYmxlLT5zZXJpYWxfcG9ydC5zcGFjZV9pZCA9PSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fTUVNT1JZID8KKwkJCSJtbWlvIiA6ICJpbyI7CisKKwlzd2l0Y2ggKHRhYmxlLT5pbnRlcmZhY2VfdHlwZSkgeworCWNhc2UgQUNQSV9EQkcyX0FSTV9TQlNBXzMyQklUOgorCQlpb3R5cGUgPSAibW1pbzMyIjsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBBQ1BJX0RCRzJfQVJNX1BMMDExOgorCWNhc2UgQUNQSV9EQkcyX0FSTV9TQlNBX0dFTkVSSUM6CisJY2FzZSBBQ1BJX0RCRzJfQkNNMjgzNToKKwkJdWFydCA9ICJwbDAxMSI7CisJCWJyZWFrOworCWNhc2UgQUNQSV9EQkcyXzE2NTUwX0NPTVBBVElCTEU6CisJY2FzZSBBQ1BJX0RCRzJfMTY1NTBfU1VCU0VUOgorCQl1YXJ0ID0gInVhcnQiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGRvbmU7CisJfQorCisJc3dpdGNoICh0YWJsZS0+YmF1ZF9yYXRlKSB7CisJY2FzZSAzOgorCQliYXVkX3JhdGUgPSA5NjAwOworCQlicmVhazsKKwljYXNlIDQ6CisJCWJhdWRfcmF0ZSA9IDE5MjAwOworCQlicmVhazsKKwljYXNlIDY6CisJCWJhdWRfcmF0ZSA9IDU3NjAwOworCQlicmVhazsKKwljYXNlIDc6CisJCWJhdWRfcmF0ZSA9IDExNTIwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBkb25lOworCX0KKworCXNucHJpbnRmKG9wdHMsIHNpemVvZihvcHRzKSwgIiVzLCVzLDB4JWxseCwlZCIsIHVhcnQsIGlvdHlwZSwKKwkJIHRhYmxlLT5zZXJpYWxfcG9ydC5hZGRyZXNzLCBiYXVkX3JhdGUpOworCisJcHJfaW5mbygiY29uc29sZTogJXNcbiIsIG9wdHMpOworCisJaWYgKGVhcmx5Y29uKQorCQlzZXR1cF9lYXJseWNvbihvcHRzKTsKKworCWVyciA9IGFkZF9wcmVmZXJyZWRfY29uc29sZSh1YXJ0LCAwLCBvcHRzICsgc3RybGVuKHVhcnQpICsgMSk7CisKK2RvbmU6CisJZWFybHlfYWNwaV9vc191bm1hcF9tZW1vcnkoKHZvaWQgX19pb21lbSAqKXRhYmxlLCB0YWJsZV9zaXplKTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwppbmRleCAzNTgxNjVlLi43MDNjMjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc3lzZnMuYworKysgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwpAQCAtMzE0LDEwICszMTQsMTQgQEAKIHN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqZHluYW1pY190YWJsZXNfa29iajsKIHN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqaG90cGx1Z19rb2JqOwogCisjZGVmaW5lIEFDUElfTUFYX1RBQkxFX0lOU1RBTkNFUwk5OTkKKyNkZWZpbmUgQUNQSV9JTlNUX1NJWkUJCQk0IC8qIGluY2x1ZGluZyB0cmFpbGluZyAwICovCisKIHN0cnVjdCBhY3BpX3RhYmxlX2F0dHIgewogCXN0cnVjdCBiaW5fYXR0cmlidXRlIGF0dHI7Ci0JY2hhciBuYW1lWzhdOworCWNoYXIgbmFtZVtBQ1BJX05BTUVfU0laRV07CiAJaW50IGluc3RhbmNlOworCWNoYXIgZmlsZW5hbWVbQUNQSV9OQU1FX1NJWkUrQUNQSV9JTlNUX1NJWkVdOwogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIH07CiAKQEAgLTMyOSwxNCArMzMzLDkgQEAKIAkgICAgY29udGFpbmVyX29mKGJpbl9hdHRyLCBzdHJ1Y3QgYWNwaV90YWJsZV9hdHRyLCBhdHRyKTsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX2hlYWRlciA9IE5VTEw7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCWNoYXIgbmFtZVtBQ1BJX05BTUVfU0laRV07CiAKLQlpZiAoc3RybmNtcCh0YWJsZV9hdHRyLT5uYW1lLCAiTlVMTCIsIDQpKQotCQltZW1jcHkobmFtZSwgdGFibGVfYXR0ci0+bmFtZSwgQUNQSV9OQU1FX1NJWkUpOwotCWVsc2UKLQkJbWVtY3B5KG5hbWUsICJcMFwwXDBcMCIsIDQpOwotCi0Jc3RhdHVzID0gYWNwaV9nZXRfdGFibGUobmFtZSwgdGFibGVfYXR0ci0+aW5zdGFuY2UsICZ0YWJsZV9oZWFkZXIpOworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKHRhYmxlX2F0dHItPm5hbWUsIHRhYmxlX2F0dHItPmluc3RhbmNlLAorCQkJCSZ0YWJsZV9oZWFkZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTM0NCwzOCArMzQzLDQ1IEBACiAJCQkJICAgICAgIHRhYmxlX2hlYWRlciwgdGFibGVfaGVhZGVyLT5sZW5ndGgpOwogfQogCi1zdGF0aWMgdm9pZCBhY3BpX3RhYmxlX2F0dHJfaW5pdChzdHJ1Y3QgYWNwaV90YWJsZV9hdHRyICp0YWJsZV9hdHRyLAotCQkJCSBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX2hlYWRlcikKK3N0YXRpYyBpbnQgYWNwaV90YWJsZV9hdHRyX2luaXQoc3RydWN0IGtvYmplY3QgKnRhYmxlc19vYmosCisJCQkJc3RydWN0IGFjcGlfdGFibGVfYXR0ciAqdGFibGVfYXR0ciwKKwkJCQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX2hlYWRlcikKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlciA9IE5VTEw7CiAJc3RydWN0IGFjcGlfdGFibGVfYXR0ciAqYXR0ciA9IE5VTEw7CisJY2hhciBpbnN0YW5jZV9zdHJbQUNQSV9JTlNUX1NJWkVdOwogCiAJc3lzZnNfYXR0cl9pbml0KCZ0YWJsZV9hdHRyLT5hdHRyLmF0dHIpOwotCWlmICh0YWJsZV9oZWFkZXItPnNpZ25hdHVyZVswXSAhPSAnXDAnKQotCQltZW1jcHkodGFibGVfYXR0ci0+bmFtZSwgdGFibGVfaGVhZGVyLT5zaWduYXR1cmUsCi0JCSAgICAgICBBQ1BJX05BTUVfU0laRSk7Ci0JZWxzZQotCQltZW1jcHkodGFibGVfYXR0ci0+bmFtZSwgIk5VTEwiLCA0KTsKKwlBQ1BJX01PVkVfTkFNRSh0YWJsZV9hdHRyLT5uYW1lLCB0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGF0dHIsICZhY3BpX3RhYmxlX2F0dHJfbGlzdCwgbm9kZSkgewotCQlpZiAoIW1lbWNtcCh0YWJsZV9hdHRyLT5uYW1lLCBhdHRyLT5uYW1lLCBBQ1BJX05BTUVfU0laRSkpCisJCWlmIChBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZV9hdHRyLT5uYW1lLCBhdHRyLT5uYW1lKSkKIAkJCWlmICh0YWJsZV9hdHRyLT5pbnN0YW5jZSA8IGF0dHItPmluc3RhbmNlKQogCQkJCXRhYmxlX2F0dHItPmluc3RhbmNlID0gYXR0ci0+aW5zdGFuY2U7CiAJfQogCXRhYmxlX2F0dHItPmluc3RhbmNlKys7CisJaWYgKHRhYmxlX2F0dHItPmluc3RhbmNlID4gQUNQSV9NQVhfVEFCTEVfSU5TVEFOQ0VTKSB7CisJCXByX3dhcm4oIiU0LjRzOiB0b28gbWFueSB0YWJsZSBpbnN0YW5jZXNcbiIsCisJCQl0YWJsZV9hdHRyLT5uYW1lKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQogCisJQUNQSV9NT1ZFX05BTUUodGFibGVfYXR0ci0+ZmlsZW5hbWUsIHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlKTsKKwl0YWJsZV9hdHRyLT5maWxlbmFtZVtBQ1BJX05BTUVfU0laRV0gPSAnXDAnOwogCWlmICh0YWJsZV9hdHRyLT5pbnN0YW5jZSA+IDEgfHwgKHRhYmxlX2F0dHItPmluc3RhbmNlID09IDEgJiYKIAkJCQkJICFhY3BpX2dldF90YWJsZQotCQkJCQkgKHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlLCAyLCAmaGVhZGVyKSkpCi0JCXNwcmludGYodGFibGVfYXR0ci0+bmFtZSArIEFDUElfTkFNRV9TSVpFLCAiJWQiLAotCQkJdGFibGVfYXR0ci0+aW5zdGFuY2UpOworCQkJCQkgKHRhYmxlX2hlYWRlci0+c2lnbmF0dXJlLCAyLCAmaGVhZGVyKSkpIHsKKwkJc25wcmludGYoaW5zdGFuY2Vfc3RyLCBzaXplb2YoaW5zdGFuY2Vfc3RyKSwgIiV1IiwKKwkJCSB0YWJsZV9hdHRyLT5pbnN0YW5jZSk7CisJCXN0cmNhdCh0YWJsZV9hdHRyLT5maWxlbmFtZSwgaW5zdGFuY2Vfc3RyKTsKKwl9CiAKIAl0YWJsZV9hdHRyLT5hdHRyLnNpemUgPSB0YWJsZV9oZWFkZXItPmxlbmd0aDsKIAl0YWJsZV9hdHRyLT5hdHRyLnJlYWQgPSBhY3BpX3RhYmxlX3Nob3c7Ci0JdGFibGVfYXR0ci0+YXR0ci5hdHRyLm5hbWUgPSB0YWJsZV9hdHRyLT5uYW1lOworCXRhYmxlX2F0dHItPmF0dHIuYXR0ci5uYW1lID0gdGFibGVfYXR0ci0+ZmlsZW5hbWU7CiAJdGFibGVfYXR0ci0+YXR0ci5hdHRyLm1vZGUgPSAwNDAwOwogCi0JcmV0dXJuOworCXJldHVybiBzeXNmc19jcmVhdGVfYmluX2ZpbGUodGFibGVzX29iaiwgJnRhYmxlX2F0dHItPmF0dHIpOwogfQogCiBhY3BpX3N0YXR1cyBhY3BpX3N5c2ZzX3RhYmxlX2hhbmRsZXIodTMyIGV2ZW50LCB2b2lkICp0YWJsZSwgdm9pZCAqY29udGV4dCkKQEAgLTM4MywyMSArMzg5LDIyIEBACiAJc3RydWN0IGFjcGlfdGFibGVfYXR0ciAqdGFibGVfYXR0cjsKIAogCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIEFDUElfVEFCTEVfRVZFTlRfTE9BRDoKKwljYXNlIEFDUElfVEFCTEVfRVZFTlRfSU5TVEFMTDoKIAkJdGFibGVfYXR0ciA9CiAJCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9hdHRyKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdGFibGVfYXR0cikKIAkJCXJldHVybiBBRV9OT19NRU1PUlk7CiAKLQkJYWNwaV90YWJsZV9hdHRyX2luaXQodGFibGVfYXR0ciwgdGFibGUpOwotCQlpZiAoc3lzZnNfY3JlYXRlX2Jpbl9maWxlKGR5bmFtaWNfdGFibGVzX2tvYmosCi0JCQkJCSAgJnRhYmxlX2F0dHItPmF0dHIpKSB7CisJCWlmIChhY3BpX3RhYmxlX2F0dHJfaW5pdChkeW5hbWljX3RhYmxlc19rb2JqLAorCQkJCQkgdGFibGVfYXR0ciwgdGFibGUpKSB7CiAJCQlrZnJlZSh0YWJsZV9hdHRyKTsKIAkJCXJldHVybiBBRV9FUlJPUjsKLQkJfSBlbHNlCi0JCQlsaXN0X2FkZF90YWlsKCZ0YWJsZV9hdHRyLT5ub2RlLCAmYWNwaV90YWJsZV9hdHRyX2xpc3QpOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJnRhYmxlX2F0dHItPm5vZGUsICZhY3BpX3RhYmxlX2F0dHJfbGlzdCk7CiAJCWJyZWFrOworCWNhc2UgQUNQSV9UQUJMRV9FVkVOVF9MT0FEOgogCWNhc2UgQUNQSV9UQUJMRV9FVkVOVF9VTkxPQUQ6CisJY2FzZSBBQ1BJX1RBQkxFX0VWRU5UX1VOSU5TVEFMTDoKIAkJLyoKIAkJICogd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgcmlnaHQgbm93CiAJCSAqIGJlY2F1c2UgdGhlIHRhYmxlIGlzIG5vdCBkZWxldGVkIGZyb20gdGhlCkBAIC00MzUsMTMgKzQ0MiwxMiBAQAogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCQljb250aW51ZTsKIAotCQl0YWJsZV9hdHRyID0gTlVMTDsKIAkJdGFibGVfYXR0ciA9IGt6YWxsb2Moc2l6ZW9mKCp0YWJsZV9hdHRyKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdGFibGVfYXR0cikKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCWFjcGlfdGFibGVfYXR0cl9pbml0KHRhYmxlX2F0dHIsIHRhYmxlX2hlYWRlcik7Ci0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSh0YWJsZXNfa29iaiwgJnRhYmxlX2F0dHItPmF0dHIpOworCQlyZXQgPSBhY3BpX3RhYmxlX2F0dHJfaW5pdCh0YWJsZXNfa29iaiwKKwkJCQkJICAgdGFibGVfYXR0ciwgdGFibGVfaGVhZGVyKTsKIAkJaWYgKHJldCkgewogCQkJa2ZyZWUodGFibGVfYXR0cik7CiAJCQlyZXR1cm4gcmV0OwpAQCAtNTk3LDE0ICs2MDMsMjcgQEAKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKIAotCWlmICghKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19IQVNfSEFORExFUikpCi0JCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiICAgaW52YWxpZCIpOwotCWVsc2UgaWYgKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19FTkFCTEVEKQotCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiAgIGVuYWJsZWQiKTsKLQllbHNlIGlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfV0FLRV9FTkFCTEVEKQotCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiAgIHdha2VfZW5hYmxlZCIpOworCWlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFX1NFVCkKKwkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgIEVOIik7CiAJZWxzZQotCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiAgIGRpc2FibGVkIik7CisJCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiICAgICIpOworCWlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfU1RBVFVTX1NFVCkKKwkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgU1RTIik7CisJZWxzZQorCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiAgICAiKTsKKworCWlmICghKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19IQVNfSEFORExFUikpCisJCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiIGludmFsaWQgICAgICIpOworCWVsc2UgaWYgKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19FTkFCTEVEKQorCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiBlbmFibGVkICAgICAiKTsKKwllbHNlIGlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfV0FLRV9FTkFCTEVEKQorCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiB3YWtlX2VuYWJsZWQiKTsKKwllbHNlCisJCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiIGRpc2FibGVkICAgICIpOworCWlmIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfTUFTS0VEKQorCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiBtYXNrZWQgICIpOworCWVsc2UKKwkJc2l6ZSArPSBzcHJpbnRmKGJ1ZiArIHNpemUsICIgdW5tYXNrZWQiKTsKIAogZW5kOgogCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXplLCAiXG4iKTsKQEAgLTY1NSw4ICs2NzQsMTIgQEAKIAkJCSAhKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19FTkFCTEVEKSkKIAkJCXJlc3VsdCA9IGFjcGlfZW5hYmxlX2dwZShoYW5kbGUsIGluZGV4KTsKIAkJZWxzZSBpZiAoIXN0cmNtcChidWYsICJjbGVhclxuIikgJiYKLQkJCSAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX1NFVCkpCisJCQkgKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19TVEFUVVNfU0VUKSkKIAkJCXJlc3VsdCA9IGFjcGlfY2xlYXJfZ3BlKGhhbmRsZSwgaW5kZXgpOworCQllbHNlIGlmICghc3RyY21wKGJ1ZiwgIm1hc2tcbiIpKQorCQkJcmVzdWx0ID0gYWNwaV9tYXNrX2dwZShoYW5kbGUsIGluZGV4LCBUUlVFKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChidWYsICJ1bm1hc2tcbiIpKQorCQkJcmVzdWx0ID0gYWNwaV9tYXNrX2dwZShoYW5kbGUsIGluZGV4LCBGQUxTRSk7CiAJCWVsc2UgaWYgKCFrc3RydG91bChidWYsIDAsICZ0bXApKQogCQkJYWxsX2NvdW50ZXJzW2luZGV4XS5jb3VudCA9IHRtcDsKIAkJZWxzZQpAQCAtNjY0LDEzICs2ODcsMTMgQEAKIAl9IGVsc2UgaWYgKGluZGV4IDwgbnVtX2dwZXMgKyBBQ1BJX05VTV9GSVhFRF9FVkVOVFMpIHsKIAkJaW50IGV2ZW50ID0gaW5kZXggLSBudW1fZ3BlczsKIAkJaWYgKCFzdHJjbXAoYnVmLCAiZGlzYWJsZVxuIikgJiYKLQkJICAgIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfRU5BQkxFRCkpCisJCSAgICAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX0VOQUJMRV9TRVQpKQogCQkJcmVzdWx0ID0gYWNwaV9kaXNhYmxlX2V2ZW50KGV2ZW50LCBBQ1BJX05PVF9JU1IpOwogCQllbHNlIGlmICghc3RyY21wKGJ1ZiwgImVuYWJsZVxuIikgJiYKLQkJCSAhKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19FTkFCTEVEKSkKKwkJCSAhKHN0YXR1cyAmIEFDUElfRVZFTlRfRkxBR19FTkFCTEVfU0VUKSkKIAkJCXJlc3VsdCA9IGFjcGlfZW5hYmxlX2V2ZW50KGV2ZW50LCBBQ1BJX05PVF9JU1IpOwogCQllbHNlIGlmICghc3RyY21wKGJ1ZiwgImNsZWFyXG4iKSAmJgotCQkJIChzdGF0dXMgJiBBQ1BJX0VWRU5UX0ZMQUdfU0VUKSkKKwkJCSAoc3RhdHVzICYgQUNQSV9FVkVOVF9GTEFHX1NUQVRVU19TRVQpKQogCQkJcmVzdWx0ID0gYWNwaV9jbGVhcl9ldmVudChldmVudCk7CiAJCWVsc2UgaWYgKCFrc3RydG91bChidWYsIDAsICZ0bXApKQogCQkJYWxsX2NvdW50ZXJzW2luZGV4XS5jb3VudCA9IHRtcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMuYwppbmRleCA5ZjBhZDZlLi5jZGQ1NmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZWFybHljcGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2lmZGVmIENPTkZJR19BQ1BJX0NVU1RPTV9EU0RUCkBAIC0yNDYsNiArMjQ1LDcgQEAKIAlzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmVudHJ5OwogCXVuc2lnbmVkIGxvbmcgdGFibGVfZW5kOwogCWludCBjb3VudCA9IDA7CisJaW50IGVycnMgPSAwOwogCWludCBpOwogCiAJaWYgKGFjcGlfZGlzYWJsZWQpCkBAIC0yNzgsMTAgKzI3OCwxMiBAQAogCQkJaWYgKGVudHJ5LT50eXBlICE9IHByb2NbaV0uaWQpCiAJCQkJY29udGludWU7CiAJCQlpZiAoIXByb2NbaV0uaGFuZGxlciB8fAotCQkJICAgICBwcm9jW2ldLmhhbmRsZXIoZW50cnksIHRhYmxlX2VuZCkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkgICAgICghZXJycyAmJiBwcm9jW2ldLmhhbmRsZXIoZW50cnksIHRhYmxlX2VuZCkpKSB7CisJCQkJZXJycysrOworCQkJCWNvbnRpbnVlOworCQkJfQogCi0JCQlwcm9jLT5jb3VudCsrOworCQkJcHJvY1tpXS5jb3VudCsrOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGkgIT0gcHJvY19udW0pCkBAIC0zMDEsMTEgKzMwMywxMSBAQAogCX0KIAogCWlmIChtYXhfZW50cmllcyAmJiBjb3VudCA+IG1heF9lbnRyaWVzKSB7Ci0JCXByX3dhcm4oIlslNC40czoweCUwMnhdIGlnbm9yZWQgJWkgZW50cmllcyBvZiAlaSBmb3VuZFxuIiwKLQkJCWlkLCBwcm9jLT5pZCwgY291bnQgLSBtYXhfZW50cmllcywgY291bnQpOworCQlwcl93YXJuKCJbJTQuNHM6MHglMDJ4XSBmb3VuZCB0aGUgbWF4aW11bSAlaSBlbnRyaWVzXG4iLAorCQkJaWQsIHByb2MtPmlkLCBjb3VudCk7CiAJfQogCi0JcmV0dXJuIGNvdW50OworCXJldHVybiBlcnJzID8gLUVJTlZBTCA6IGNvdW50OwogfQogCiBpbnQgX19pbml0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtYmEvYnVzLmMgYi9kcml2ZXJzL2FtYmEvYnVzLmMKaW5kZXggYTViNWM4Ny4uYTU2ZmEyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hbWJhL2J1cy5jCisrKyBiL2RyaXZlcnMvYW1iYS9idXMuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FtYmEvYnVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsvY2xrLWNvbmYuaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIApAQCAtMjM3LDYgKzIzOCwxMCBAQAogCWludCByZXQ7CiAKIAlkbyB7CisJCXJldCA9IG9mX2Nsa19zZXRfZGVmYXVsdHMoZGV2LT5vZl9ub2RlLCBmYWxzZSk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisKIAkJcmV0ID0gZGV2X3BtX2RvbWFpbl9hdHRhY2goZGV2LCB0cnVlKTsKIAkJaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKQogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FuZHJvaWQvYmluZGVyLmMgYi9kcml2ZXJzL2FuZHJvaWQvYmluZGVyLmMKaW5kZXggMTYyODhlNy4uNTYyYWY5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hbmRyb2lkL2JpbmRlci5jCisrKyBiL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXIuYwpAQCAtNTksNyArNTksNiBAQAogc3RhdGljIHN0cnVjdCBiaW5kZXJfbm9kZSAqYmluZGVyX2NvbnRleHRfbWdyX25vZGU7CiBzdGF0aWMga3VpZF90IGJpbmRlcl9jb250ZXh0X21ncl91aWQgPSBJTlZBTElEX1VJRDsKIHN0YXRpYyBpbnQgYmluZGVyX2xhc3RfaWQ7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJpbmRlcl9kZWZlcnJlZF93b3JrcXVldWU7CiAKICNkZWZpbmUgQklOREVSX0RFQlVHX0VOVFJZKG5hbWUpIFwKIHN0YXRpYyBpbnQgYmluZGVyXyMjbmFtZSMjX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpIFwKQEAgLTMyMjcsNyArMzIyNiw3IEBACiAJaWYgKGhsaXN0X3VuaGFzaGVkKCZwcm9jLT5kZWZlcnJlZF93b3JrX25vZGUpKSB7CiAJCWhsaXN0X2FkZF9oZWFkKCZwcm9jLT5kZWZlcnJlZF93b3JrX25vZGUsCiAJCQkJJmJpbmRlcl9kZWZlcnJlZF9saXN0KTsKLQkJcXVldWVfd29yayhiaW5kZXJfZGVmZXJyZWRfd29ya3F1ZXVlLCAmYmluZGVyX2RlZmVycmVkX3dvcmspOworCQlzY2hlZHVsZV93b3JrKCZiaW5kZXJfZGVmZXJyZWRfd29yayk7CiAJfQogCW11dGV4X3VubG9jaygmYmluZGVyX2RlZmVycmVkX2xvY2spOwogfQpAQCAtMzY3OSwxMCArMzY3OCw2IEBACiB7CiAJaW50IHJldDsKIAotCWJpbmRlcl9kZWZlcnJlZF93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYmluZGVyIik7Ci0JaWYgKCFiaW5kZXJfZGVmZXJyZWRfd29ya3F1ZXVlKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWJpbmRlcl9kZWJ1Z2ZzX2Rpcl9lbnRyeV9yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJiaW5kZXIiLCBOVUxMKTsKIAlpZiAoYmluZGVyX2RlYnVnZnNfZGlyX2VudHJ5X3Jvb3QpCiAJCWJpbmRlcl9kZWJ1Z2ZzX2Rpcl9lbnRyeV9wcm9jID0gZGVidWdmc19jcmVhdGVfZGlyKCJwcm9jIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmFoY2kuYyBiL2RyaXZlcnMvYXRhL2xpYmFoY2kuYwppbmRleCA3NDYxYTU4Li5kY2YyYzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhaGNpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYWhjaS5jCkBAIC0yNTI0LDcgKzI1MjQsNyBAQAogCiAJCS8qIERvIG5vdCByZWNlaXZlIGludGVycnVwdHMgc2VudCBieSBkdW1teSBwb3J0cyAqLwogCQlpZiAoIXBwKSB7Ci0JCQlkaXNhYmxlX2lycShpcnEgKyBpKTsKKwkJCWRpc2FibGVfaXJxKGlycSk7CiAJCQljb250aW51ZTsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX25pbmphMzIuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCmluZGV4IDYzM2FhMjkuLjQ0Zjk3YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbmluamEzMi5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAlhcC0+aW9hZGRyLmFsdHN0YXR1c19hZGRyID0gYmFzZSArIDB4MUU7CiAJYXAtPmlvYWRkci5ibWRtYV9hZGRyID0gYmFzZTsKIAlhdGFfc2ZmX3N0ZF9wb3J0cygmYXAtPmlvYWRkcik7Ci0JYXAtPnBmbGFncyA9IEFUQV9QRkxBR19QSU8zMiB8IEFUQV9QRkxBR19QSU8zMkNIQU5HRTsKKwlhcC0+cGZsYWdzIHw9IEFUQV9QRkxBR19QSU8zMiB8IEFUQV9QRkxBR19QSU8zMkNIQU5HRTsKIAogCW5pbmphMzJfcHJvZ3JhbShiYXNlKTsKIAkvKiBGSVhNRTogU2hvdWxkIHdlIGRpc2FibGUgdGhlbSBhdCByZW1vdmUgPyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZW5pLmMgYi9kcml2ZXJzL2F0bS9lbmkuYwppbmRleCA2MzM5ZWZkLi5mMmFhZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0bS9lbmkuYworKysgYi9kcml2ZXJzL2F0bS9lbmkuYwpAQCAtMTg0NSw4ICsxODQ1LDkgQEAKIAkvKiBpbml0aWFsaXplIG1lbW9yeSBtYW5hZ2VtZW50ICovCiAJYnVmZmVyX21lbSA9IGVuaV9kZXYtPm1lbSAtIChidWYgLSBlbmlfZGV2LT5yYW0pOwogCWVuaV9kZXYtPmZyZWVfbGlzdF9zaXplID0gYnVmZmVyX21lbS9NSURfTUlOX0JVRl9TSVpFLzI7Ci0JZW5pX2Rldi0+ZnJlZV9saXN0ID0ga21hbGxvYygKLQkgICAgc2l6ZW9mKHN0cnVjdCBlbmlfZnJlZSkqKGVuaV9kZXYtPmZyZWVfbGlzdF9zaXplKzEpLEdGUF9LRVJORUwpOworCWVuaV9kZXYtPmZyZWVfbGlzdCA9IGttYWxsb2NfYXJyYXkoZW5pX2Rldi0+ZnJlZV9saXN0X3NpemUgKyAxLAorCQkJCQkgICBzaXplb2YoKmVuaV9kZXYtPmZyZWVfbGlzdCksCisJCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghZW5pX2Rldi0+ZnJlZV9saXN0KSB7CiAJCXByaW50ayhLRVJOX0VSUiBERVZfTEFCRUwgIihpdGYgJWQpOiBjb3VsZG4ndCBnZXQgZnJlZSBwYWdlXG4iLAogCQkgICAgZGV2LT5udW1iZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuYyBiL2RyaXZlcnMvYXRtL2ZvcmUyMDBlLmMKaW5kZXggNzVkZGU5MC4uODFhYWE1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vZm9yZTIwMGUuYworKysgYi9kcml2ZXJzL2F0bS9mb3JlMjAwZS5jCkBAIC0yNDg5LDcgKzI0ODksNyBAQAogewogICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmU7CiAgICAgc3RydWN0IGRldmljZSAqZGV2aWNlOwotICAgIHN0cnVjdCBmd19oZWFkZXIgKmZ3X2hlYWRlcjsKKyAgICBjb25zdCBzdHJ1Y3QgZndfaGVhZGVyICpmd19oZWFkZXI7CiAgICAgY29uc3QgX19sZTMyICpmd19kYXRhOwogICAgIHUzMiBmd19zaXplOwogICAgIHUzMiBfX2lvbWVtICpsb2FkX2FkZHI7CkBAIC0yNTExLDkgKzI1MTEsOSBAQAogCXJldHVybiBlcnI7CiAgICAgfQogCi0gICAgZndfZGF0YSA9IChfX2xlMzIgKikgZmlybXdhcmUtPmRhdGE7CisgICAgZndfZGF0YSA9IChjb25zdCBfX2xlMzIgKilmaXJtd2FyZS0+ZGF0YTsKICAgICBmd19zaXplID0gZmlybXdhcmUtPnNpemUgLyBzaXplb2YodTMyKTsKLSAgICBmd19oZWFkZXIgPSAoc3RydWN0IGZ3X2hlYWRlciAqKSBmaXJtd2FyZS0+ZGF0YTsKKyAgICBmd19oZWFkZXIgPSAoY29uc3Qgc3RydWN0IGZ3X2hlYWRlciAqKWZpcm13YXJlLT5kYXRhOwogICAgIGxvYWRfYWRkciA9IGZvcmUyMDBlLT52aXJ0X2Jhc2UgKyBsZTMyX3RvX2NwdShmd19oZWFkZXItPmxvYWRfb2Zmc2V0KTsKIAogICAgIERQUklOVEsoMiwgImRldmljZSAlcyBmaXJtd2FyZSBiZWluZyBsb2FkZWQgYXQgMHglcCAoJWQgd29yZHMpXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vaGUuYyBiL2RyaXZlcnMvYXRtL2hlLmMKaW5kZXggMGY1Y2IzNy4uMzFiNTEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vaGUuYworKysgYi9kcml2ZXJzL2F0bS9oZS5jCkBAIC03NzksOCArNzc5LDkgQEAKIAkJICBHMF9SQlBTX0JTICsgKGdyb3VwICogMzIpKTsKIAogCS8qIGJpdG1hcCB0YWJsZSAqLwotCWhlX2Rldi0+cmJwbF90YWJsZSA9IGttYWxsb2MoQklUU19UT19MT05HUyhSQlBMX1RBQkxFX1NJWkUpCi0JCQkJICAgICAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0tFUk5FTCk7CisJaGVfZGV2LT5yYnBsX3RhYmxlID0ga21hbGxvY19hcnJheShCSVRTX1RPX0xPTkdTKFJCUExfVEFCTEVfU0laRSksCisJCQkJCSAgIHNpemVvZigqaGVfZGV2LT5yYnBsX3RhYmxlKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoZV9kZXYtPnJicGxfdGFibGUpIHsKIAkJaHByaW50aygidW5hYmxlIHRvIGFsbG9jYXRlIHJicGwgYml0bWFwIHRhYmxlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03ODgsOCArNzg5LDkgQEAKIAliaXRtYXBfemVybyhoZV9kZXYtPnJicGxfdGFibGUsIFJCUExfVEFCTEVfU0laRSk7CiAKIAkvKiByYnBsX3ZpcnQgNjQtYml0IHBvaW50ZXJzICovCi0JaGVfZGV2LT5yYnBsX3ZpcnQgPSBrbWFsbG9jKFJCUExfVEFCTEVfU0laRQotCQkJCSAgICAqIHNpemVvZihzdHJ1Y3QgaGVfYnVmZiAqKSwgR0ZQX0tFUk5FTCk7CisJaGVfZGV2LT5yYnBsX3ZpcnQgPSBrbWFsbG9jX2FycmF5KFJCUExfVEFCTEVfU0laRSwKKwkJCQkJICBzaXplb2YoKmhlX2Rldi0+cmJwbF92aXJ0KSwKKwkJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIWhlX2Rldi0+cmJwbF92aXJ0KSB7CiAJCWhwcmludGsoInVuYWJsZSB0byBhbGxvY2F0ZSByYnBsIHZpcnQgdGFibGVcbiIpOwogCQlnb3RvIG91dF9mcmVlX3JicGxfdGFibGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9pcGhhc2UuYyBiL2RyaXZlcnMvYXRtL2lwaGFzZS5jCmluZGV4IDgwOWRkMWUuLmIyNzU2NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2lwaGFzZS5jCisrKyBiL2RyaXZlcnMvYXRtL2lwaGFzZS5jCkBAIC0xODg1LDkgKzE4ODUsOSBAQAogICAgICAgICAgICAgICAgIGlmICgocmV0ID0gaWFfY2JyX3NldHVwIChpYWRldiwgdmNjKSkgPCAwKSB7ICAgICAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgfSAKLQllbHNlICAKLSAgICAgICAgICAgcHJpbnRrKCJpYWRldjogIE5vbiBVQlIsIEFCUiBhbmQgQ0JSIHRyYWZmaWMgbm90IHN1cHBvcnRlZG4iKTsgCisJfSBlbHNlIHsKKwkJcHJpbnRrKCJpYWRldjogIE5vbiBVQlIsIEFCUiBhbmQgQ0JSIHRyYWZmaWMgbm90IHN1cHBvcnRlZFxuIik7CisJfQogICAgICAgICAKICAgICAgICAgaWFkZXYtPnRlc3RUYWJsZVt2Y2MtPnZjaV0tPnZjX3N0YXR1cyB8PSBWQ19BQ1RJVkU7CiAJSUZfRVZFTlQocHJpbnRrKCJpYSBvcGVuX3R4IHJldHVybmluZyBcbiIpOykgIApAQCAtMTk3NSw3ICsxOTc1LDkgQEAKIAkJYnVmX2Rlc2NfcHRyKys7CQkgIAogCQl0eF9wa3Rfc3RhcnQgKz0gaWFkZXYtPnR4X2J1Zl9zejsgIAogCX0gIAotICAgICAgICBpYWRldi0+dHhfYnVmID0ga21hbGxvYyhpYWRldi0+bnVtX3R4X2Rlc2Mqc2l6ZW9mKHN0cnVjdCBjcGNzX3RyYWlsZXJfZGVzYyksIEdGUF9LRVJORUwpOworCWlhZGV2LT50eF9idWYgPSBrbWFsbG9jX2FycmF5KGlhZGV2LT5udW1fdHhfZGVzYywKKwkJCQkgICAgICBzaXplb2YoKmlhZGV2LT50eF9idWYpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOwogICAgICAgICBpZiAoIWlhZGV2LT50eF9idWYpIHsKICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiBERVZfTEFCRUwgIiBjb3VsZG4ndCBnZXQgbWVtXG4iKTsKIAkgICAgZ290byBlcnJfZnJlZV9kbGU7CkBAIC0xOTk1LDggKzE5OTcsOSBAQAogCQkJCQkJICAgICAgIHNpemVvZigqY3BjcyksCiAJCQkJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CiAgICAgICAgIH0KLSAgICAgICAgaWFkZXYtPmRlc2NfdGJsID0ga21hbGxvYyhpYWRldi0+bnVtX3R4X2Rlc2MgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGRlc2NfdGJsX3QpLCBHRlBfS0VSTkVMKTsKKwlpYWRldi0+ZGVzY190YmwgPSBrbWFsbG9jX2FycmF5KGlhZGV2LT5udW1fdHhfZGVzYywKKwkJCQkJc2l6ZW9mKCppYWRldi0+ZGVzY190YmwpLAorCQkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWlhZGV2LT5kZXNjX3RibCkgewogCQlwcmludGsoS0VSTl9FUlIgREVWX0xBQkVMICIgY291bGRuJ3QgZ2V0IG1lbVxuIik7CiAJCWdvdG8gZXJyX2ZyZWVfYWxsX3R4X2J1ZnM7CkBAIC0yMTI0LDcgKzIxMjcsOSBAQAogCW1lbXNldCgoY2FkZHJfdCkoaWFkZXYtPnNlZ19yYW0raSksICAwLCBpYWRldi0+bnVtX3ZjKjQpOwogCXZjID0gKHN0cnVjdCBtYWluX3ZjICopaWFkZXYtPk1BSU5fVkNfVEFCTEVfQUREUjsgIAogCWV2YyA9IChzdHJ1Y3QgZXh0X3ZjICopaWFkZXYtPkVYVF9WQ19UQUJMRV9BRERSOyAgCi0gICAgICAgIGlhZGV2LT50ZXN0VGFibGUgPSBrbWFsbG9jKHNpemVvZihsb25nKSppYWRldi0+bnVtX3ZjLCBHRlBfS0VSTkVMKTsgCisJaWFkZXYtPnRlc3RUYWJsZSA9IGttYWxsb2NfYXJyYXkoaWFkZXYtPm51bV92YywKKwkJCQkJIHNpemVvZigqaWFkZXYtPnRlc3RUYWJsZSksCisJCQkJCSBHRlBfS0VSTkVMKTsKICAgICAgICAgaWYgKCFpYWRldi0+dGVzdFRhYmxlKSB7CiAgICAgICAgICAgIHByaW50aygiR2V0IGZyZWVwYWdlICBmYWlsZWRcbiIpOwogCSAgIGdvdG8gZXJyX2ZyZWVfZGVzY190Ymw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9uaWNzdGFyLmMgYi9kcml2ZXJzL2F0bS9uaWNzdGFyLmMKaW5kZXggNzAwZWQxNS4uYzcyOTZiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vbmljc3Rhci5jCisrKyBiL2RyaXZlcnMvYXRtL25pY3N0YXIuYwpAQCAtMzcwLDcgKzM3MCw4IEBACiAJCXJldHVybiBlcnJvcjsKICAgICAgICAgfQogCi0JaWYgKChjYXJkID0ga21hbGxvYyhzaXplb2YobnNfZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwljYXJkID0ga21hbGxvYyhzaXplb2YoKmNhcmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhcmQpIHsKIAkJcHJpbnRrCiAJCSAgICAoIm5pY3N0YXIlZDogY2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkZXZpY2Ugc3RydWN0dXJlLlxuIiwKIAkJICAgICBpKTsKQEAgLTYxMSw3ICs2MTIsNyBAQAogCWZvciAoaiA9IDA7IGogPCBjYXJkLT5yY3Rfc2l6ZTsgaisrKQogCQluc193cml0ZV9zcmFtKGNhcmQsIGogKiA0LCB1MzJkLCA0KTsKIAotCW1lbXNldChjYXJkLT52Y21hcCwgMCwgTlNfTUFYX1JDVFNJWkUgKiBzaXplb2YodmNfbWFwKSk7CisJbWVtc2V0KGNhcmQtPnZjbWFwLCAwLCBzaXplb2YoY2FyZC0+dmNtYXApKTsKIAogCWZvciAoaiA9IDA7IGogPCBOU19GUlNDRF9OVU07IGorKykKIAkJY2FyZC0+c2NkMnZjW2pdID0gTlVMTDsKQEAgLTg2Miw3ICs4NjMsNyBAQAogCWlmIChzaXplICE9IFZCUl9TQ1FTSVpFICYmIHNpemUgIT0gQ0JSX1NDUVNJWkUpCiAJCXJldHVybiBOVUxMOwogCi0Jc2NxID0ga21hbGxvYyhzaXplb2Yoc2NxX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlzY3EgPSBrbWFsbG9jKHNpemVvZigqc2NxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzY3EpCiAJCXJldHVybiBOVUxMOwogICAgICAgICBzY3EtPm9yZyA9IGRtYV9hbGxvY19jb2hlcmVudCgmY2FyZC0+cGNpZGV2LT5kZXYsCkBAIC04NzEsOCArODcyLDkgQEAKIAkJa2ZyZWUoc2NxKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXNjcS0+c2tiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKikgKgotCQkJICAgKHNpemUgLyBOU19TQ1FFX1NJWkUpLCBHRlBfS0VSTkVMKTsKKwlzY3EtPnNrYiA9IGttYWxsb2NfYXJyYXkoc2l6ZSAvIE5TX1NDUUVfU0laRSwKKwkJCQkgc2l6ZW9mKCpzY3EtPnNrYiksCisJCQkJIEdGUF9LRVJORUwpOwogCWlmICghc2NxLT5za2IpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoJmNhcmQtPnBjaWRldi0+ZGV2LAogCQkJCSAgMiAqIHNpemUsIHNjcS0+b3JnLCBzY3EtPmRtYSk7CkBAIC0yMDIxLDcgKzIwMjMsOCBAQAogCiAJCWNlbGwgPSBza2ItPmRhdGE7CiAJCWZvciAoaSA9IG5zX3JzcWVfY2VsbGNvdW50KHJzcWUpOyBpOyBpLS0pIHsKLQkJCWlmICgoc2IgPSBkZXZfYWxsb2Nfc2tiKE5TX1NNU0tCU0laRSkpID09IE5VTEwpIHsKKwkJCXNiID0gZGV2X2FsbG9jX3NrYihOU19TTVNLQlNJWkUpOworCQkJaWYgKCFzYikgewogCQkJCXByaW50awogCQkJCSAgICAoIm5pY3N0YXIlZDogQ2FuJ3QgYWxsb2NhdGUgYnVmZmVycyBmb3IgYWFsMC5cbiIsCiAJCQkJICAgICBjYXJkLT5pbmRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS96YXRtLmMgYi9kcml2ZXJzL2F0bS96YXRtLmMKaW5kZXggY2VjZmI5NC4uZDNkYzk1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdG0vemF0bS5jCisrKyBiL2RyaXZlcnMvYXRtL3phdG0uYwpAQCAtNTk4LDEyICs1OTgsMTMgQEAKIHN0YXRpYyBpbnQgc3RhcnRfcngoc3RydWN0IGF0bV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgemF0bV9kZXYgKnphdG1fZGV2OwotCWludCBzaXplLGk7CisJaW50IGk7CiAKLURQUklOVEsoInN0YXJ0X3J4XG4iKTsKKwlEUFJJTlRLKCJzdGFydF9yeFxuIik7CiAJemF0bV9kZXYgPSBaQVRNX0RFVihkZXYpOwotCXNpemUgPSBzaXplb2Yoc3RydWN0IGF0bV92Y2MgKikqemF0bV9kZXYtPmNoYW5zOwotCXphdG1fZGV2LT5yeF9tYXAgPSAga3phbGxvYyhzaXplLEdGUF9LRVJORUwpOworCXphdG1fZGV2LT5yeF9tYXAgPSBrY2FsbG9jKHphdG1fZGV2LT5jaGFucywKKwkJCQkgICBzaXplb2YoKnphdG1fZGV2LT5yeF9tYXApLAorCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghemF0bV9kZXYtPnJ4X21hcCkgcmV0dXJuIC1FTk9NRU07CiAJLyogc2V0IFZQSS9WQ0kgc3BsaXQgKHVzZSBhbGwgVkNJcyBhbmQgZ2l2ZSB3aGF0J3MgbGVmdCB0byBWUElzKSAqLwogCXpwb2tlbCh6YXRtX2RldiwoMSA8PCBkZXYtPmNpX3JhbmdlLnZjaV9iaXRzKS0xLHVQRDk4NDAxX1ZSUik7CkBAIC05OTgsOCArOTk5LDkgQEAKIAogCURQUklOVEsoInN0YXJ0X3R4XG4iKTsKIAl6YXRtX2RldiA9IFpBVE1fREVWKGRldik7Ci0JemF0bV9kZXYtPnR4X21hcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdG1fdmNjICopKgotCSAgICB6YXRtX2Rldi0+Y2hhbnMsR0ZQX0tFUk5FTCk7CisJemF0bV9kZXYtPnR4X21hcCA9IGttYWxsb2NfYXJyYXkoemF0bV9kZXYtPmNoYW5zLAorCQkJCQkgc2l6ZW9mKCp6YXRtX2Rldi0+dHhfbWFwKSwKKwkJCQkJIEdGUF9LRVJORUwpOwogCWlmICghemF0bV9kZXYtPnR4X21hcCkgcmV0dXJuIC1FTk9NRU07CiAJemF0bV9kZXYtPnR4X2J3ID0gQVRNX09DM19QQ1I7CiAJemF0bV9kZXYtPmZyZWVfc2hhcGVycyA9ICgxIDw8IE5SX1NIQVBFUlMpLTE7CkBAIC0xMzk4LDcgKzE0MDAsNyBAQAogCURQUklOVEsoREVWX0xBQkVMICIoaXRmICVkKTogb3BlbiAlZC4lZFxuIix2Y2MtPmRldi0+bnVtYmVyLHZjYy0+dnBpLAogCSAgICB2Y2MtPnZjaSk7CiAJaWYgKCF0ZXN0X2JpdChBVE1fVkZfUEFSVElBTCwmdmNjLT5mbGFncykpIHsKLQkJemF0bV92Y2MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgemF0bV92Y2MpLEdGUF9LRVJORUwpOworCQl6YXRtX3ZjYyA9IGttYWxsb2Moc2l6ZW9mKCp6YXRtX3ZjYyksIEdGUF9LRVJORUwpOwogCQlpZiAoIXphdG1fdmNjKSB7CiAJCQljbGVhcl9iaXQoQVRNX1ZGX0FERFIsJnZjYy0+ZmxhZ3MpOwogCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvS2NvbmZpZyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCmluZGV4IDk4NTA0ZWMuLmZkZjQ0Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmFzZS9LY29uZmlnCkBAIC0yMTIsNiArMjEyLDE2IEBACiAKIAkgIElmIHlvdSBhcmUgdW5zdXJlIGFib3V0IHRoaXMsIFNheSBOIGhlcmUuCiAKK2NvbmZpZyBERUJVR19URVNUX0RSSVZFUl9SRU1PVkUKKwlib29sICJUZXN0IGRyaXZlciByZW1vdmUgY2FsbHMgZHVyaW5nIHByb2JlIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgRHJpdmVyIGNvcmUgdG8gdGVzdCBkcml2ZXIgcmVtb3ZlIGZ1bmN0aW9ucworCSAgYnkgY2FsbGluZyBwcm9iZSwgcmVtb3ZlLCBwcm9iZS4gVGhpcyB0ZXN0cyB0aGUgcmVtb3ZlIHBhdGggd2l0aG91dAorCSAgaGF2aW5nIHRvIHVuYmluZCB0aGUgZHJpdmVyIG9yIHVubG9hZCB0aGUgZHJpdmVyIG1vZHVsZS4KKworCSAgSWYgeW91IGFyZSB1bnN1cmUgYWJvdXQgdGhpcywgc2F5IE4gaGVyZS4KKwogY29uZmlnIFNZU19IWVBFUlZJU09SCiAJYm9vbAogCWRlZmF1bHQgbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYyBiL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKaW5kZXggMmJhNGNhYy4uOTVlM2VmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCkBAIC0yNDMsNyArMjQzLDcgQEAKICAqIEBkZXY6ICBUaGUgZ2VuZXJpYyBkZXZpY2UgdG8gcnVuIHRoZSB0cmlnZ2VyIGZvcgogICogQGZuCSAgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgZm9yIGVhY2ggY2xhc3NkZXYuCiAgKgotICogVGhpcyBmdW5jaW9uIGlzIGZvciBleGVjdXRpbmcgYSB0cmlnZ2VyIHdoZW4geW91IG5lZWQgdG8ga25vdyBib3RoCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBleGVjdXRpbmcgYSB0cmlnZ2VyIHdoZW4geW91IG5lZWQgdG8ga25vdyBib3RoCiAgKiB0aGUgY29udGFpbmVyIGFuZCB0aGUgY2xhc3NkZXYuICBJZiB5b3Ugb25seSBjYXJlIGFib3V0IHRoZQogICogY29udGFpbmVyLCB0aGVuIHVzZSBhdHRyaWJ1dGVfY29udGFpbmVyX3RyaWdnZXIoKSBpbnN0ZWFkLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCAwYThiZGFkLi5jZTA1N2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTgzNiwxMSArODM2LDI5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBsaXZlX2luX2dsdWVfZGlyKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKCFrb2JqIHx8ICFkZXYtPmNsYXNzIHx8CisJICAgIGtvYmotPmtzZXQgIT0gJmRldi0+Y2xhc3MtPnAtPmdsdWVfZGlycykKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBrb2JqZWN0ICpnZXRfZ2x1ZV9kaXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPmtvYmoucGFyZW50OworfQorCisvKgorICogbWFrZSBzdXJlIGNsZWFuaW5nIHVwIGRpciBhcyB0aGUgbGFzdCBzdGVwLCB3ZSBuZWVkIHRvIG1ha2UKKyAqIHN1cmUgLnJlbGVhc2UgaGFuZGxlciBvZiBrb2JqZWN0IGlzIHJ1biB3aXRoIGhvbGRpbmcgdGhlCisgKiBnbG9iYWwgbG9jaworICovCiBzdGF0aWMgdm9pZCBjbGVhbnVwX2dsdWVfZGlyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmplY3QgKmdsdWVfZGlyKQogewogCS8qIHNlZSBpZiB3ZSBsaXZlIGluIGEgImdsdWUiIGRpcmVjdG9yeSAqLwotCWlmICghZ2x1ZV9kaXIgfHwgIWRldi0+Y2xhc3MgfHwKLQkgICAgZ2x1ZV9kaXItPmtzZXQgIT0gJmRldi0+Y2xhc3MtPnAtPmdsdWVfZGlycykKKwlpZiAoIWxpdmVfaW5fZ2x1ZV9kaXIoZ2x1ZV9kaXIsIGRldikpCiAJCXJldHVybjsKIAogCW11dGV4X2xvY2soJmdkcF9tdXRleCk7CkBAIC04NDgsMTEgKzg2Niw2IEBACiAJbXV0ZXhfdW5sb2NrKCZnZHBfbXV0ZXgpOwogfQogCi1zdGF0aWMgdm9pZCBjbGVhbnVwX2RldmljZV9wYXJlbnQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWNsZWFudXBfZ2x1ZV9kaXIoZGV2LCBkZXYtPmtvYmoucGFyZW50KTsKLX0KLQogc3RhdGljIGludCBkZXZpY2VfYWRkX2NsYXNzX3N5bWxpbmtzKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBkZXZfb2Zfbm9kZShkZXYpOwpAQCAtMTAyOCw2ICsxMDQxLDcgQEAKIAlzdHJ1Y3Qga29iamVjdCAqa29iajsKIAlzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbGFzc19pbnRmOwogCWludCBlcnJvciA9IC1FSU5WQUw7CisJc3RydWN0IGtvYmplY3QgKmdsdWVfZGlyID0gTlVMTDsKIAogCWRldiA9IGdldF9kZXZpY2UoZGV2KTsKIAlpZiAoIWRldikKQEAgLTEwNzIsOCArMTA4NiwxMCBAQAogCS8qIGZpcnN0LCByZWdpc3RlciB3aXRoIGdlbmVyaWMgbGF5ZXIuICovCiAJLyogd2UgcmVxdWlyZSB0aGUgbmFtZSB0byBiZSBzZXQgYmVmb3JlLCBhbmQgcGFzcyBOVUxMICovCiAJZXJyb3IgPSBrb2JqZWN0X2FkZCgmZGV2LT5rb2JqLCBkZXYtPmtvYmoucGFyZW50LCBOVUxMKTsKLQlpZiAoZXJyb3IpCisJaWYgKGVycm9yKSB7CisJCWdsdWVfZGlyID0gZ2V0X2dsdWVfZGlyKGRldik7CiAJCWdvdG8gRXJyb3I7CisJfQogCiAJLyogbm90aWZ5IHBsYXRmb3JtIG9mIGRldmljZSBlbnRyeSAqLwogCWlmIChwbGF0Zm9ybV9ub3RpZnkpCkBAIC0xMTU0LDkgKzExNzAsMTAgQEAKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfdWV2ZW50KTsKICBhdHRyRXJyb3I6CiAJa29iamVjdF91ZXZlbnQoJmRldi0+a29iaiwgS09CSl9SRU1PVkUpOworCWdsdWVfZGlyID0gZ2V0X2dsdWVfZGlyKGRldik7CiAJa29iamVjdF9kZWwoJmRldi0+a29iaik7CiAgRXJyb3I6Ci0JY2xlYW51cF9kZXZpY2VfcGFyZW50KGRldik7CisJY2xlYW51cF9nbHVlX2RpcihkZXYsIGdsdWVfZGlyKTsKIAlwdXRfZGV2aWNlKHBhcmVudCk7CiBuYW1lX2Vycm9yOgogCWtmcmVlKGRldi0+cCk7CkBAIC0xMjMyLDYgKzEyNDksNyBAQAogdm9pZCBkZXZpY2VfZGVsKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBkZXYtPnBhcmVudDsKKwlzdHJ1Y3Qga29iamVjdCAqZ2x1ZV9kaXIgPSBOVUxMOwogCXN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKmNsYXNzX2ludGY7CiAKIAkvKiBOb3RpZnkgY2xpZW50cyBvZiBkZXZpY2UgcmVtb3ZhbC4gIFRoaXMgY2FsbCBtdXN0IGNvbWUKQEAgLTEyNjYsNiArMTI4NCw3IEBACiAJYnVzX3JlbW92ZV9kZXZpY2UoZGV2KTsKIAlkZXZpY2VfcG1fcmVtb3ZlKGRldik7CiAJZHJpdmVyX2RlZmVycmVkX3Byb2JlX2RlbChkZXYpOworCWRldmljZV9yZW1vdmVfcHJvcGVydGllcyhkZXYpOwogCiAJLyogTm90aWZ5IHRoZSBwbGF0Zm9ybSBvZiB0aGUgcmVtb3ZhbCwgaW4gY2FzZSB0aGV5CiAJICogbmVlZCB0byBkbyBhbnl0aGluZy4uLgpAQCAtMTI3Niw4ICsxMjk1LDkgQEAKIAkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZGV2LT5idXMtPnAtPmJ1c19ub3RpZmllciwKIAkJCQkJICAgICBCVVNfTk9USUZZX1JFTU9WRURfREVWSUNFLCBkZXYpOwogCWtvYmplY3RfdWV2ZW50KCZkZXYtPmtvYmosIEtPQkpfUkVNT1ZFKTsKLQljbGVhbnVwX2RldmljZV9wYXJlbnQoZGV2KTsKKwlnbHVlX2RpciA9IGdldF9nbHVlX2RpcihkZXYpOwogCWtvYmplY3RfZGVsKCZkZXYtPmtvYmopOworCWNsZWFudXBfZ2x1ZV9kaXIoZGV2LCBnbHVlX2Rpcik7CiAJcHV0X2RldmljZShwYXJlbnQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX2RlbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY3B1LmMgYi9kcml2ZXJzL2Jhc2UvY3B1LmMKaW5kZXggNjkxZWVlYS4uNGMyOGUxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NwdS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jcHUuYwpAQCAtMzcxLDEyICszNzEsMTMgQEAKIAlpZiAoY3B1LT5ob3RwbHVnZ2FibGUpCiAJCWNwdS0+ZGV2Lmdyb3VwcyA9IGhvdHBsdWdhYmxlX2NwdV9hdHRyX2dyb3VwczsKIAllcnJvciA9IGRldmljZV9yZWdpc3RlcigmY3B1LT5kZXYpOwotCWlmICghZXJyb3IpCi0JCXBlcl9jcHUoY3B1X3N5c19kZXZpY2VzLCBudW0pID0gJmNwdS0+ZGV2OwotCWlmICghZXJyb3IpCi0JCXJlZ2lzdGVyX2NwdV91bmRlcl9ub2RlKG51bSwgY3B1X3RvX25vZGUobnVtKSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKLQlyZXR1cm4gZXJyb3I7CisJcGVyX2NwdShjcHVfc3lzX2RldmljZXMsIG51bSkgPSAmY3B1LT5kZXY7CisJcmVnaXN0ZXJfY3B1X3VuZGVyX25vZGUobnVtLCBjcHVfdG9fbm9kZShudW0pKTsKKworCXJldHVybiAwOwogfQogCiBzdHJ1Y3QgZGV2aWNlICpnZXRfY3B1X2RldmljZSh1bnNpZ25lZCBjcHUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGQuYyBiL2RyaXZlcnMvYmFzZS9kZC5jCmluZGV4IDE2Njg4ZjUuLmQyMmE3MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZC5jCkBAIC01MSw3ICs1MSw2IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKGRlZmVycmVkX3Byb2JlX211dGV4KTsKIHN0YXRpYyBMSVNUX0hFQUQoZGVmZXJyZWRfcHJvYmVfcGVuZGluZ19saXN0KTsKIHN0YXRpYyBMSVNUX0hFQUQoZGVmZXJyZWRfcHJvYmVfYWN0aXZlX2xpc3QpOwotc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpkZWZlcnJlZF93cTsKIHN0YXRpYyBhdG9taWNfdCBkZWZlcnJlZF90cmlnZ2VyX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CiAKIC8qCkBAIC0xNzUsNyArMTc0LDcgQEAKIAkgKiBLaWNrIHRoZSByZS1wcm9iZSB0aHJlYWQuICBJdCBtYXkgYWxyZWFkeSBiZSBzY2hlZHVsZWQsIGJ1dCBpdCBpcwogCSAqIHNhZmUgdG8ga2ljayBpdCBhZ2Fpbi4KIAkgKi8KLQlxdWV1ZV93b3JrKGRlZmVycmVkX3dxLCAmZGVmZXJyZWRfcHJvYmVfd29yayk7CisJc2NoZWR1bGVfd29yaygmZGVmZXJyZWRfcHJvYmVfd29yayk7CiB9CiAKIC8qKgpAQCAtMjExLDE0ICsyMTAsMTAgQEAKICAqLwogc3RhdGljIGludCBkZWZlcnJlZF9wcm9iZV9pbml0Y2FsbCh2b2lkKQogewotCWRlZmVycmVkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImRlZmVyd3EiKTsKLQlpZiAoV0FSTl9PTighZGVmZXJyZWRfd3EpKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWRyaXZlcl9kZWZlcnJlZF9wcm9iZV9lbmFibGUgPSB0cnVlOwogCWRyaXZlcl9kZWZlcnJlZF9wcm9iZV90cmlnZ2VyKCk7CiAJLyogU29ydCBhcyBtYW55IGRlcGVuZGVuY2llcyBhcyBwb3NzaWJsZSBiZWZvcmUgZXhpdGluZyBpbml0Y2FsbHMgKi8KLQlmbHVzaF93b3JrcXVldWUoZGVmZXJyZWRfd3EpOworCWZsdXNoX3dvcmsoJmRlZmVycmVkX3Byb2JlX3dvcmspOwogCXJldHVybiAwOwogfQogbGF0ZV9pbml0Y2FsbChkZWZlcnJlZF9wcm9iZV9pbml0Y2FsbCk7CkBAIC0zMjksNiArMzI0LDcgQEAKIHsKIAlpbnQgcmV0ID0gLUVQUk9CRV9ERUZFUjsKIAlpbnQgbG9jYWxfdHJpZ2dlcl9jb3VudCA9IGF0b21pY19yZWFkKCZkZWZlcnJlZF90cmlnZ2VyX2NvdW50KTsKKwlib29sIHRlc3RfcmVtb3ZlID0gSVNfRU5BQkxFRChDT05GSUdfREVCVUdfVEVTVF9EUklWRVJfUkVNT1ZFKTsKIAogCWlmIChkZWZlcl9hbGxfcHJvYmVzKSB7CiAJCS8qCkBAIC0zNDYsNiArMzQyLDcgQEAKIAkJIGRydi0+YnVzLT5uYW1lLCBfX2Z1bmNfXywgZHJ2LT5uYW1lLCBkZXZfbmFtZShkZXYpKTsKIAlXQVJOX09OKCFsaXN0X2VtcHR5KCZkZXYtPmRldnJlc19oZWFkKSk7CiAKK3JlX3Byb2JlOgogCWRldi0+ZHJpdmVyID0gZHJ2OwogCiAJLyogSWYgdXNpbmcgcGluY3RybCwgYmluZCBwaW5zIG5vdyBiZWZvcmUgcHJvYmluZyAqLwpAQCAtMzgzLDYgKzM4MCwyNSBAQAogCQkJZ290byBwcm9iZV9mYWlsZWQ7CiAJfQogCisJaWYgKHRlc3RfcmVtb3ZlKSB7CisJCXRlc3RfcmVtb3ZlID0gZmFsc2U7CisKKwkJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5yZW1vdmUpCisJCQlkZXYtPmJ1cy0+cmVtb3ZlKGRldik7CisJCWVsc2UgaWYgKGRydi0+cmVtb3ZlKQorCQkJZHJ2LT5yZW1vdmUoZGV2KTsKKworCQlkZXZyZXNfcmVsZWFzZV9hbGwoZGV2KTsKKwkJZHJpdmVyX3N5c2ZzX3JlbW92ZShkZXYpOworCQlkZXYtPmRyaXZlciA9IE5VTEw7CisJCWRldl9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCQlpZiAoZGV2LT5wbV9kb21haW4gJiYgZGV2LT5wbV9kb21haW4tPmRpc21pc3MpCisJCQlkZXYtPnBtX2RvbWFpbi0+ZGlzbWlzcyhkZXYpOworCQlwbV9ydW50aW1lX3JlaW5pdChkZXYpOworCisJCWdvdG8gcmVfcHJvYmU7CisJfQorCiAJcGluY3RybF9pbml0X2RvbmUoZGV2KTsKIAogCWlmIChkZXYtPnBtX2RvbWFpbiAmJiBkZXYtPnBtX2RvbWFpbi0+c3luYykKQEAgLTQ2MCw4ICs0NzYsNyBAQAogdm9pZCB3YWl0X2Zvcl9kZXZpY2VfcHJvYmUodm9pZCkKIHsKIAkvKiB3YWl0IGZvciB0aGUgZGVmZXJyZWQgcHJvYmUgd29ya3F1ZXVlIHRvIGZpbmlzaCAqLwotCWlmIChkcml2ZXJfZGVmZXJyZWRfcHJvYmVfZW5hYmxlKQotCQlmbHVzaF93b3JrcXVldWUoZGVmZXJyZWRfd3EpOworCWZsdXNoX3dvcmsoJmRlZmVycmVkX3Byb2JlX3dvcmspOwogCiAJLyogd2FpdCBmb3IgdGhlIGtub3duIGRldmljZXMgdG8gY29tcGxldGUgdGhlaXIgcHJvYmluZyAqLwogCXdhaXRfZXZlbnQocHJvYmVfd2FpdHF1ZXVlLCBhdG9taWNfcmVhZCgmcHJvYmVfY291bnQpID09IDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RtYS1jb2hlcmVudC5jIGIvZHJpdmVycy9iYXNlL2RtYS1jb2hlcmVudC5jCmluZGV4IGJkZjI4ZjcuLjY0MGE3ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWEtY29oZXJlbnQuYworKysgYi9kcml2ZXJzL2Jhc2UvZG1hLWNvaGVyZW50LmMKQEAgLTE2NSw2ICsxNjUsNyBAQAogCWludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBwYWdlbm87CisJaW50IGRtYV9tZW1vcnlfbWFwOwogCiAJaWYgKCFkZXYpCiAJCXJldHVybiAwOwpAQCAtMTg3LDExICsxODgsMTIgQEAKIAkgKi8KIAkqZG1hX2hhbmRsZSA9IG1lbS0+ZGV2aWNlX2Jhc2UgKyAocGFnZW5vIDw8IFBBR0VfU0hJRlQpOwogCSpyZXQgPSBtZW0tPnZpcnRfYmFzZSArIChwYWdlbm8gPDwgUEFHRV9TSElGVCk7Ci0JaWYgKG1lbS0+ZmxhZ3MgJiBETUFfTUVNT1JZX01BUCkKKwlkbWFfbWVtb3J5X21hcCA9IChtZW0tPmZsYWdzICYgRE1BX01FTU9SWV9NQVApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1lbS0+c3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAoZG1hX21lbW9yeV9tYXApCiAJCW1lbXNldCgqcmV0LCAwLCBzaXplKTsKIAllbHNlCiAJCW1lbXNldF9pbygqcmV0LCAwLCBzaXplKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZW0tPnNwaW5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMTsKIApAQCAtMjYxLDggKzI2Myw4IEBACiAJCSAgIChtZW0tPnZpcnRfYmFzZSArIChtZW0tPnNpemUgPDwgUEFHRV9TSElGVCkpKSB7CiAJCXVuc2lnbmVkIGxvbmcgb2ZmID0gdm1hLT52bV9wZ29mZjsKIAkJaW50IHN0YXJ0ID0gKHZhZGRyIC0gbWVtLT52aXJ0X2Jhc2UpID4+IFBBR0VfU0hJRlQ7Ci0JCWludCB1c2VyX2NvdW50ID0gKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKLQkJaW50IGNvdW50ID0gc2l6ZSA+PiBQQUdFX1NISUZUOworCQlpbnQgdXNlcl9jb3VudCA9IHZtYV9wYWdlcyh2bWEpOworCQlpbnQgY291bnQgPSBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQ7CiAKIAkJKnJldCA9IC1FTlhJTzsKIAkJaWYgKG9mZiA8IGNvdW50ICYmIHVzZXJfY291bnQgPD0gY291bnQgLSBvZmYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jIGIvZHJpdmVycy9iYXNlL2RtYS1tYXBwaW5nLmMKaW5kZXggZDc5OTY2Mi4uOGY4YjY4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RtYS1tYXBwaW5nLmMKKysrIGIvZHJpdmVycy9iYXNlL2RtYS1tYXBwaW5nLmMKQEAgLTE5OCwxMCArMTk4LDEzIEBACiAKIAlyYyA9IGRtYV9kZWNsYXJlX2NvaGVyZW50X21lbW9yeShkZXYsIHBoeXNfYWRkciwgZGV2aWNlX2FkZHIsIHNpemUsCiAJCQkJCSBmbGFncyk7Ci0JaWYgKHJjID09IDApCisJaWYgKHJjKSB7CiAJCWRldnJlc19hZGQoZGV2LCByZXMpOwotCWVsc2UKKwkJcmMgPSAwOworCX0gZWxzZSB7CiAJCWRldnJlc19mcmVlKHJlcyk7CisJCXJjID0gLUVOT01FTTsKKwl9CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0yNDcsNyArMjUwLDcgQEAKIHsKIAlpbnQgcmV0ID0gLUVOWElPOwogI2lmIGRlZmluZWQoQ09ORklHX01NVSkgJiYgIWRlZmluZWQoQ09ORklHX0FSQ0hfTk9fQ09IRVJFTlRfRE1BX01NQVApCi0JdW5zaWduZWQgbG9uZyB1c2VyX2NvdW50ID0gKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHVzZXJfY291bnQgPSB2bWFfcGFnZXModm1hKTsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gUEFHRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUOwogCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4odmlydF90b19wYWdlKGNwdV9hZGRyKSk7CiAJdW5zaWduZWQgbG9uZyBvZmYgPSB2bWEtPnZtX3Bnb2ZmOwpAQCAtMzM0LDcgKzMzNyw3IEBACiAJCXJldHVybjsKIAl9CiAKLQl1bm1hcF9rZXJuZWxfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpY3B1X2FkZHIsIHNpemUpOworCXVubWFwX2tlcm5lbF9yYW5nZSgodW5zaWduZWQgbG9uZyljcHVfYWRkciwgUEFHRV9BTElHTihzaXplKSk7CiAJdnVubWFwKGNwdV9hZGRyKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3BpbmN0cmwuYyBiL2RyaXZlcnMvYmFzZS9waW5jdHJsLmMKaW5kZXggMDc2Mjk3NS4uNTkxN2I0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BpbmN0cmwuYworKysgYi9kcml2ZXJzL2Jhc2UvcGluY3RybC5jCkBAIC05MSw5ICs5MSwxMyBAQAogCWRldm1fa2ZyZWUoZGV2LCBkZXYtPnBpbnMpOwogCWRldi0+cGlucyA9IE5VTEw7CiAKLQkvKiBPbmx5IHJldHVybiBkZWZlcnJhbHMgKi8KLQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCi0JCXJldCA9IDA7CisJLyogUmV0dXJuIGRlZmVycmFscyAqLworCWlmIChyZXQgPT0gLUVQUk9CRV9ERUZFUikKKwkJcmV0dXJuIHJldDsKKwkvKiBSZXR1cm4gc2VyaW91cyBlcnJvcnMgKi8KKwlpZiAocmV0ID09IC1FSU5WQUwpCisJCXJldHVybiByZXQ7CisJLyogV2UgaWdub3JlIGVycm9ycyBsaWtlIC1FTk9FTlQgbWVhbmluZyBubyBwaW5jdHJsIHN0YXRlICovCiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLW1zaS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLW1zaS5jCmluZGV4IDI3OWU1MzkuLmJlNmE1OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS1tc2kuYworKysgYi9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0tbXNpLmMKQEAgLTE0MiwxMyArMTQyLDEyIEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IG52ZWM7IGkrKykgewotCQlkZXNjID0gYWxsb2NfbXNpX2VudHJ5KGRldik7CisJCWRlc2MgPSBhbGxvY19tc2lfZW50cnkoZGV2LCAxLCBOVUxMKTsKIAkJaWYgKCFkZXNjKQogCQkJYnJlYWs7CiAKIAkJZGVzYy0+cGxhdGZvcm0ubXNpX3ByaXZfZGF0YSA9IGRhdGE7CiAJCWRlc2MtPnBsYXRmb3JtLm1zaV9pbmRleCA9IGJhc2UgKyBpOwotCQlkZXNjLT5udmVjX3VzZWQgPSAxOwogCQlkZXNjLT5pcnEgPSB2aXJxID8gdmlycSArIGkgOiAwOwogCiAJCWxpc3RfYWRkX3RhaWwoJmRlc2MtPmxpc3QsIGRldl90b19tc2lfbGlzdChkZXYpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggNjQ4MmQ0Ny4uYzRhZjAwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAkJaW50IHJldDsKIAogCQlyZXQgPSBvZl9pcnFfZ2V0KGRldi0+ZGV2Lm9mX25vZGUsIG51bSk7Ci0JCWlmIChyZXQgPj0gMCB8fCByZXQgPT0gLUVQUk9CRV9ERUZFUikKKwkJaWYgKHJldCA+IDAgfHwgcmV0ID09IC1FUFJPQkVfREVGRVIpCiAJCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTA4LDkgKzEwOCwxNCBAQAogCSAqIElPUkVTT1VSQ0VfQklUUyBjb3JyZXNwb25kIDEtdG8tMSB0byB0aGUgSVJRRl9UUklHR0VSKgogCSAqIHNldHRpbmdzLgogCSAqLwotCWlmIChyICYmIHItPmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTKQotCQlpcnFkX3NldF90cmlnZ2VyX3R5cGUoaXJxX2dldF9pcnFfZGF0YShyLT5zdGFydCksCi0JCQkJICAgICAgci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFMpOworCWlmIChyICYmIHItPmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTKSB7CisJCXN0cnVjdCBpcnFfZGF0YSAqaXJxZDsKKworCQlpcnFkID0gaXJxX2dldF9pcnFfZGF0YShyLT5zdGFydCk7CisJCWlmICghaXJxZCkKKwkJCXJldHVybiAtRU5YSU87CisJCWlycWRfc2V0X3RyaWdnZXJfdHlwZShpcnFkLCByLT5mbGFncyAmIElPUkVTT1VSQ0VfQklUUyk7CisJfQogCiAJcmV0dXJuIHIgPyByLT5zdGFydCA6IC1FTlhJTzsKICNlbmRpZgpAQCAtMTc1LDcgKzE4MCw3IEBACiAJCWludCByZXQ7CiAKIAkJcmV0ID0gb2ZfaXJxX2dldF9ieW5hbWUoZGV2LT5kZXYub2Zfbm9kZSwgbmFtZSk7Ci0JCWlmIChyZXQgPj0gMCB8fCByZXQgPT0gLUVQUk9CRV9ERUZFUikKKwkJaWYgKHJldCA+IDAgfHwgcmV0ID09IC1FUFJPQkVfREVGRVIpCiAJCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNDM0LDYgKzQzOSw3IEBACiAJaW50IGk7CiAKIAlpZiAocGRldikgeworCQlkZXZpY2VfcmVtb3ZlX3Byb3BlcnRpZXMoJnBkZXYtPmRldik7CiAJCWRldmljZV9kZWwoJnBkZXYtPmRldik7CiAKIAkJaWYgKHBkZXYtPmlkX2F1dG8pIHsKQEAgLTQ0Niw4ICs0NTIsNiBAQAogCQkJaWYgKHItPnBhcmVudCkKIAkJCQlyZWxlYXNlX3Jlc291cmNlKHIpOwogCQl9Ci0KLQkJZGV2aWNlX3JlbW92ZV9wcm9wZXJ0aWVzKCZwZGV2LT5kZXYpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBsYXRmb3JtX2RldmljZV9kZWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jCmluZGV4IGExZjJhZmYuLmUwMjMwNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKICAqIGFuZCBjaGVja3MgdGhhdCB0aGUgUE0gZG9tYWluIHBvaW50ZXIgaXMgYSByZWFsIGdlbmVyaWMgUE0gZG9tYWluLgogICogQW55IGZhaWx1cmUgcmVzdWx0cyBpbiBOVUxMIGJlaW5nIHJldHVybmVkLgogICovCi1zdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKnBtX2dlbnBkX2xvb2t1cF9kZXYoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGRfbG9va3VwX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCA9IE5VTEwsICpncGQ7CiAKQEAgLTU4Niw3ICs1ODYsNyBAQAogfQogbGF0ZV9pbml0Y2FsbChnZW5wZF9wb3dlcm9mZl91bnVzZWQpOwogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCisjaWYgZGVmaW5lZChDT05GSUdfUE1fU0xFRVApIHx8IGRlZmluZWQoQ09ORklHX1BNX0dFTkVSSUNfRE9NQUlOU19PRikKIAogLyoqCiAgKiBwbV9nZW5wZF9wcmVzZW50IC0gQ2hlY2sgaWYgdGhlIGdpdmVuIFBNIGRvbWFpbiBoYXMgYmVlbiBpbml0aWFsaXplZC4KQEAgLTYwNiw2ICs2MDYsMTAgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisKIHN0YXRpYyBib29sIGdlbnBkX2Rldl9hY3RpdmVfd2FrZXVwKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCiAJCQkJICAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTYxMyw5ICs2MTcsOCBAQAogfQogCiAvKioKLSAqIHBtX2dlbnBkX3N5bmNfcG93ZXJvZmYgLSBTeW5jaHJvbm91c2x5IHBvd2VyIG9mZiBhIFBNIGRvbWFpbiBhbmQgaXRzIG1hc3RlcnMuCisgKiBnZW5wZF9zeW5jX3Bvd2Vyb2ZmIC0gU3luY2hyb25vdXNseSBwb3dlciBvZmYgYSBQTSBkb21haW4gYW5kIGl0cyBtYXN0ZXJzLgogICogQGdlbnBkOiBQTSBkb21haW4gdG8gcG93ZXIgb2ZmLCBpZiBwb3NzaWJsZS4KLSAqIEB0aW1lZDogVHJ1ZSBpZiBsYXRlbmN5IG1lYXN1cmVtZW50cyBhcmUgYWxsb3dlZC4KICAqCiAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gUE0gZG9tYWluIGNhbiBiZSBwb3dlcmVkIG9mZiAoZHVyaW5nIHN5c3RlbSBzdXNwZW5kIG9yCiAgKiBoaWJlcm5hdGlvbikgYW5kIGRvIHRoYXQgaWYgc28uICBBbHNvLCBpbiB0aGF0IGNhc2UgcHJvcGFnYXRlIHRvIGl0cyBtYXN0ZXJzLgpAQCAtNjI1LDggKzYyOCw3IEBACiAgKiBleGVjdXRlZCBzZXF1ZW50aWFsbHksIHNvIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBpdCB3aWxsIG5ldmVyIHJ1biB0d2ljZSBpbgogICogcGFyYWxsZWwpLgogICovCi1zdGF0aWMgdm9pZCBwbV9nZW5wZF9zeW5jX3Bvd2Vyb2ZmKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCi0JCQkJICAgYm9vbCB0aW1lZCkKK3N0YXRpYyB2b2lkIGdlbnBkX3N5bmNfcG93ZXJvZmYoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKIHsKIAlzdHJ1Y3QgZ3BkX2xpbmsgKmxpbms7CiAKQEAgLTYzOSwyOCArNjQxLDI2IEBACiAKIAkvKiBDaG9vc2UgdGhlIGRlZXBlc3Qgc3RhdGUgd2hlbiBzdXNwZW5kaW5nICovCiAJZ2VucGQtPnN0YXRlX2lkeCA9IGdlbnBkLT5zdGF0ZV9jb3VudCAtIDE7Ci0JZ2VucGRfcG93ZXJfb2ZmKGdlbnBkLCB0aW1lZCk7CisJZ2VucGRfcG93ZXJfb2ZmKGdlbnBkLCBmYWxzZSk7CiAKIAlnZW5wZC0+c3RhdHVzID0gR1BEX1NUQVRFX1BPV0VSX09GRjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJmdlbnBkLT5zbGF2ZV9saW5rcywgc2xhdmVfbm9kZSkgewogCQlnZW5wZF9zZF9jb3VudGVyX2RlYyhsaW5rLT5tYXN0ZXIpOwotCQlwbV9nZW5wZF9zeW5jX3Bvd2Vyb2ZmKGxpbmstPm1hc3RlciwgdGltZWQpOworCQlnZW5wZF9zeW5jX3Bvd2Vyb2ZmKGxpbmstPm1hc3Rlcik7CiAJfQogfQogCiAvKioKLSAqIHBtX2dlbnBkX3N5bmNfcG93ZXJvbiAtIFN5bmNocm9ub3VzbHkgcG93ZXIgb24gYSBQTSBkb21haW4gYW5kIGl0cyBtYXN0ZXJzLgorICogZ2VucGRfc3luY19wb3dlcm9uIC0gU3luY2hyb25vdXNseSBwb3dlciBvbiBhIFBNIGRvbWFpbiBhbmQgaXRzIG1hc3RlcnMuCiAgKiBAZ2VucGQ6IFBNIGRvbWFpbiB0byBwb3dlciBvbi4KLSAqIEB0aW1lZDogVHJ1ZSBpZiBsYXRlbmN5IG1lYXN1cmVtZW50cyBhcmUgYWxsb3dlZC4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGluICJub2lycSIgYW5kICJzeXNjb3JlIiBzdGFnZXMgb2Ygc3lzdGVtIHBvd2VyCiAgKiB0cmFuc2l0aW9ucywgc28gaXQgbmVlZCBub3QgYWNxdWlyZSBsb2NrcyAoYWxsIG9mIHRoZSAibm9pcnEiIGNhbGxiYWNrcyBhcmUKICAqIGV4ZWN1dGVkIHNlcXVlbnRpYWxseSwgc28gaXQgaXMgZ3VhcmFudGVlZCB0aGF0IGl0IHdpbGwgbmV2ZXIgcnVuIHR3aWNlIGluCiAgKiBwYXJhbGxlbCkuCiAgKi8KLXN0YXRpYyB2b2lkIHBtX2dlbnBkX3N5bmNfcG93ZXJvbihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAotCQkJCSAgYm9vbCB0aW1lZCkKK3N0YXRpYyB2b2lkIGdlbnBkX3N5bmNfcG93ZXJvbihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQogewogCXN0cnVjdCBncGRfbGluayAqbGluazsKIApAQCAtNjY4LDExICs2NjgsMTEgQEAKIAkJcmV0dXJuOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5rLCAmZ2VucGQtPnNsYXZlX2xpbmtzLCBzbGF2ZV9ub2RlKSB7Ci0JCXBtX2dlbnBkX3N5bmNfcG93ZXJvbihsaW5rLT5tYXN0ZXIsIHRpbWVkKTsKKwkJZ2VucGRfc3luY19wb3dlcm9uKGxpbmstPm1hc3Rlcik7CiAJCWdlbnBkX3NkX2NvdW50ZXJfaW5jKGxpbmstPm1hc3Rlcik7CiAJfQogCi0JZ2VucGRfcG93ZXJfb24oZ2VucGQsIHRpbWVkKTsKKwlnZW5wZF9wb3dlcl9vbihnZW5wZCwgZmFsc2UpOwogCiAJZ2VucGQtPnN0YXR1cyA9IEdQRF9TVEFURV9BQ1RJVkU7CiB9CkBAIC03ODQsNyArNzg0LDcgQEAKIAkgKiB0aGUgc2FtZSBQTSBkb21haW4sIHNvIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIGxvY2tpbmcgaGVyZS4KIAkgKi8KIAlnZW5wZC0+c3VzcGVuZGVkX2NvdW50Kys7Ci0JcG1fZ2VucGRfc3luY19wb3dlcm9mZihnZW5wZCwgdHJ1ZSk7CisJZ2VucGRfc3luY19wb3dlcm9mZihnZW5wZCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgxNCw3ICs4MTQsNyBAQAogCSAqIGd1YXJhbnRlZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcnVuIHR3aWNlIGluIHBhcmFsbGVsIGZvcgogCSAqIHRoZSBzYW1lIFBNIGRvbWFpbiwgc28gaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgbG9ja2luZyBoZXJlLgogCSAqLwotCXBtX2dlbnBkX3N5bmNfcG93ZXJvbihnZW5wZCwgdHJ1ZSk7CisJZ2VucGRfc3luY19wb3dlcm9uKGdlbnBkKTsKIAlnZW5wZC0+c3VzcGVuZGVkX2NvdW50LS07CiAKIAlpZiAoZ2VucGQtPmRldl9vcHMuc3RvcCAmJiBnZW5wZC0+ZGV2X29wcy5zdGFydCkKQEAgLTkwMiwxMiArOTAyLDEyIEBACiAJaWYgKGdlbnBkLT5zdXNwZW5kZWRfY291bnQrKyA9PSAwKQogCQkvKgogCQkgKiBUaGUgYm9vdCBrZXJuZWwgbWlnaHQgcHV0IHRoZSBkb21haW4gaW50byBhcmJpdHJhcnkgc3RhdGUsCi0JCSAqIHNvIG1ha2UgaXQgYXBwZWFyIGFzIHBvd2VyZWQgb2ZmIHRvIHBtX2dlbnBkX3N5bmNfcG93ZXJvbigpLAorCQkgKiBzbyBtYWtlIGl0IGFwcGVhciBhcyBwb3dlcmVkIG9mZiB0byBnZW5wZF9zeW5jX3Bvd2Vyb24oKSwKIAkJICogc28gdGhhdCBpdCB0cmllcyB0byBwb3dlciBpdCBvbiBpbiBjYXNlIGl0IHdhcyByZWFsbHkgb2ZmLgogCQkgKi8KIAkJZ2VucGQtPnN0YXR1cyA9IEdQRF9TVEFURV9QT1dFUl9PRkY7CiAKLQlwbV9nZW5wZF9zeW5jX3Bvd2Vyb24oZ2VucGQsIHRydWUpOworCWdlbnBkX3N5bmNfcG93ZXJvbihnZW5wZCk7CiAKIAlpZiAoZ2VucGQtPmRldl9vcHMuc3RvcCAmJiBnZW5wZC0+ZGV2X29wcy5zdGFydCkKIAkJcmV0ID0gcG1fcnVudGltZV9mb3JjZV9yZXN1bWUoZGV2KTsKQEAgLTk2Miw5ICs5NjIsOSBAQAogCiAJaWYgKHN1c3BlbmQpIHsKIAkJZ2VucGQtPnN1c3BlbmRlZF9jb3VudCsrOwotCQlwbV9nZW5wZF9zeW5jX3Bvd2Vyb2ZmKGdlbnBkLCBmYWxzZSk7CisJCWdlbnBkX3N5bmNfcG93ZXJvZmYoZ2VucGQpOwogCX0gZWxzZSB7Ci0JCXBtX2dlbnBkX3N5bmNfcG93ZXJvbihnZW5wZCwgZmFsc2UpOworCQlnZW5wZF9zeW5jX3Bvd2Vyb24oZ2VucGQpOwogCQlnZW5wZC0+c3VzcGVuZGVkX2NvdW50LS07CiAJfQogfQpAQCAtMTA1NiwxNCArMTA1Niw4IEBACiAJZGV2X3BtX3B1dF9zdWJzeXNfZGF0YShkZXYpOwogfQogCi0vKioKLSAqIF9fcG1fZ2VucGRfYWRkX2RldmljZSAtIEFkZCBhIGRldmljZSB0byBhbiBJL08gUE0gZG9tYWluLgotICogQGdlbnBkOiBQTSBkb21haW4gdG8gYWRkIHRoZSBkZXZpY2UgdG8uCi0gKiBAZGV2OiBEZXZpY2UgdG8gYmUgYWRkZWQuCi0gKiBAdGQ6IFNldCBvZiBQTSBRb1MgdGltaW5nIHBhcmFtZXRlcnMgdG8gYXR0YWNoIHRvIHRoZSBkZXZpY2UuCi0gKi8KLWludCBfX3BtX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwgc3RydWN0IGRldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgZ3BkX3RpbWluZ19kYXRhICp0ZCkKK3N0YXRpYyBpbnQgZ2VucGRfYWRkX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGdwZF90aW1pbmdfZGF0YSAqdGQpCiB7CiAJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluX2RhdGEgKmdwZF9kYXRhOwogCWludCByZXQgPSAwOwpAQCAtMTEwMywxNSArMTA5NywyOCBAQAogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fcG1fZ2VucGRfYWRkX2RldmljZSk7CiAKIC8qKgotICogcG1fZ2VucGRfcmVtb3ZlX2RldmljZSAtIFJlbW92ZSBhIGRldmljZSBmcm9tIGFuIEkvTyBQTSBkb21haW4uCi0gKiBAZ2VucGQ6IFBNIGRvbWFpbiB0byByZW1vdmUgdGhlIGRldmljZSBmcm9tLgotICogQGRldjogRGV2aWNlIHRvIGJlIHJlbW92ZWQuCisgKiBfX3BtX2dlbnBkX2FkZF9kZXZpY2UgLSBBZGQgYSBkZXZpY2UgdG8gYW4gSS9PIFBNIGRvbWFpbi4KKyAqIEBnZW5wZDogUE0gZG9tYWluIHRvIGFkZCB0aGUgZGV2aWNlIHRvLgorICogQGRldjogRGV2aWNlIHRvIGJlIGFkZGVkLgorICogQHRkOiBTZXQgb2YgUE0gUW9TIHRpbWluZyBwYXJhbWV0ZXJzIHRvIGF0dGFjaCB0byB0aGUgZGV2aWNlLgogICovCi1pbnQgcG1fZ2VucGRfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAotCQkJICAgc3RydWN0IGRldmljZSAqZGV2KQoraW50IF9fcG1fZ2VucGRfYWRkX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBncGRfdGltaW5nX2RhdGEgKnRkKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZncGRfbGlzdF9sb2NrKTsKKwlyZXQgPSBnZW5wZF9hZGRfZGV2aWNlKGdlbnBkLCBkZXYsIHRkKTsKKwltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fcG1fZ2VucGRfYWRkX2RldmljZSk7CisKK3N0YXRpYyBpbnQgZ2VucGRfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW5fZGF0YSAqZ3BkX2RhdGE7CiAJc3RydWN0IHBtX2RvbWFpbl9kYXRhICpwZGQ7CkBAIC0xMTE5LDEwICsxMTI2LDYgQEAKIAogCWRldl9kYmcoZGV2LCAiJXMoKVxuIiwgX19mdW5jX18pOwogCi0JaWYgKCFnZW5wZCB8fCBnZW5wZCAhPSBwbV9nZW5wZF9sb29rdXBfZGV2KGRldikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogVGhlIGFib3ZlIHZhbGlkYXRpb24gYWxzbyBtZWFucyB3ZSBoYXZlIGV4aXN0aW5nIGRvbWFpbl9kYXRhLiAqLwogCXBkZCA9IGRldi0+cG93ZXIuc3Vic3lzX2RhdGEtPmRvbWFpbl9kYXRhOwogCWdwZF9kYXRhID0gdG9fZ3BkX2RhdGEocGRkKTsKIAlkZXZfcG1fcW9zX3JlbW92ZV9ub3RpZmllcihkZXYsICZncGRfZGF0YS0+bmIpOwpAQCAtMTE1NCwxNSArMTE1NywyNCBAQAogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHBtX2dlbnBkX3JlbW92ZV9kZXZpY2UpOwogCiAvKioKLSAqIHBtX2dlbnBkX2FkZF9zdWJkb21haW4gLSBBZGQgYSBzdWJkb21haW4gdG8gYW4gSS9PIFBNIGRvbWFpbi4KLSAqIEBnZW5wZDogTWFzdGVyIFBNIGRvbWFpbiB0byBhZGQgdGhlIHN1YmRvbWFpbiB0by4KLSAqIEBzdWJkb21haW46IFN1YmRvbWFpbiB0byBiZSBhZGRlZC4KKyAqIHBtX2dlbnBkX3JlbW92ZV9kZXZpY2UgLSBSZW1vdmUgYSBkZXZpY2UgZnJvbSBhbiBJL08gUE0gZG9tYWluLgorICogQGdlbnBkOiBQTSBkb21haW4gdG8gcmVtb3ZlIHRoZSBkZXZpY2UgZnJvbS4KKyAqIEBkZXY6IERldmljZSB0byBiZSByZW1vdmVkLgogICovCi1pbnQgcG1fZ2VucGRfYWRkX3N1YmRvbWFpbihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAotCQkJICAgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpzdWJkb21haW4pCitpbnQgcG1fZ2VucGRfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAorCQkJICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICghZ2VucGQgfHwgZ2VucGQgIT0gZ2VucGRfbG9va3VwX2RldihkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBnZW5wZF9yZW1vdmVfZGV2aWNlKGdlbnBkLCBkZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1fZ2VucGRfcmVtb3ZlX2RldmljZSk7CisKK3N0YXRpYyBpbnQgZ2VucGRfYWRkX3N1YmRvbWFpbihzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAorCQkJICAgICAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqc3ViZG9tYWluKQogewogCXN0cnVjdCBncGRfbGluayAqbGluaywgKml0cjsKIAlpbnQgcmV0ID0gMDsKQEAgLTEyMDUsNiArMTIxNywyMyBAQAogCQlrZnJlZShsaW5rKTsKIAlyZXR1cm4gcmV0OwogfQorCisvKioKKyAqIHBtX2dlbnBkX2FkZF9zdWJkb21haW4gLSBBZGQgYSBzdWJkb21haW4gdG8gYW4gSS9PIFBNIGRvbWFpbi4KKyAqIEBnZW5wZDogTWFzdGVyIFBNIGRvbWFpbiB0byBhZGQgdGhlIHN1YmRvbWFpbiB0by4KKyAqIEBzdWJkb21haW46IFN1YmRvbWFpbiB0byBiZSBhZGRlZC4KKyAqLworaW50IHBtX2dlbnBkX2FkZF9zdWJkb21haW4oc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKKwkJCSAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqc3ViZG9tYWluKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZncGRfbGlzdF9sb2NrKTsKKwlyZXQgPSBnZW5wZF9hZGRfc3ViZG9tYWluKGdlbnBkLCBzdWJkb21haW4pOworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQogRVhQT1JUX1NZTUJPTF9HUEwocG1fZ2VucGRfYWRkX3N1YmRvbWFpbik7CiAKIC8qKgpAQCAtMTI3OCwyNyArMTMwNywxNyBAQAogCWdlbnBkLT5kZXZpY2VfY291bnQgPSAwOwogCWdlbnBkLT5tYXhfb2ZmX3RpbWVfbnMgPSAtMTsKIAlnZW5wZC0+bWF4X29mZl90aW1lX2NoYW5nZWQgPSB0cnVlOworCWdlbnBkLT5wcm92aWRlciA9IE5VTEw7CisJZ2VucGQtPmhhc19wcm92aWRlciA9IGZhbHNlOwogCWdlbnBkLT5kb21haW4ub3BzLnJ1bnRpbWVfc3VzcGVuZCA9IGdlbnBkX3J1bnRpbWVfc3VzcGVuZDsKIAlnZW5wZC0+ZG9tYWluLm9wcy5ydW50aW1lX3Jlc3VtZSA9IGdlbnBkX3J1bnRpbWVfcmVzdW1lOwogCWdlbnBkLT5kb21haW4ub3BzLnByZXBhcmUgPSBwbV9nZW5wZF9wcmVwYXJlOwotCWdlbnBkLT5kb21haW4ub3BzLnN1c3BlbmQgPSBwbV9nZW5lcmljX3N1c3BlbmQ7Ci0JZ2VucGQtPmRvbWFpbi5vcHMuc3VzcGVuZF9sYXRlID0gcG1fZ2VuZXJpY19zdXNwZW5kX2xhdGU7CiAJZ2VucGQtPmRvbWFpbi5vcHMuc3VzcGVuZF9ub2lycSA9IHBtX2dlbnBkX3N1c3BlbmRfbm9pcnE7CiAJZ2VucGQtPmRvbWFpbi5vcHMucmVzdW1lX25vaXJxID0gcG1fZ2VucGRfcmVzdW1lX25vaXJxOwotCWdlbnBkLT5kb21haW4ub3BzLnJlc3VtZV9lYXJseSA9IHBtX2dlbmVyaWNfcmVzdW1lX2Vhcmx5OwotCWdlbnBkLT5kb21haW4ub3BzLnJlc3VtZSA9IHBtX2dlbmVyaWNfcmVzdW1lOwotCWdlbnBkLT5kb21haW4ub3BzLmZyZWV6ZSA9IHBtX2dlbmVyaWNfZnJlZXplOwotCWdlbnBkLT5kb21haW4ub3BzLmZyZWV6ZV9sYXRlID0gcG1fZ2VuZXJpY19mcmVlemVfbGF0ZTsKIAlnZW5wZC0+ZG9tYWluLm9wcy5mcmVlemVfbm9pcnEgPSBwbV9nZW5wZF9mcmVlemVfbm9pcnE7CiAJZ2VucGQtPmRvbWFpbi5vcHMudGhhd19ub2lycSA9IHBtX2dlbnBkX3RoYXdfbm9pcnE7Ci0JZ2VucGQtPmRvbWFpbi5vcHMudGhhd19lYXJseSA9IHBtX2dlbmVyaWNfdGhhd19lYXJseTsKLQlnZW5wZC0+ZG9tYWluLm9wcy50aGF3ID0gcG1fZ2VuZXJpY190aGF3OwotCWdlbnBkLT5kb21haW4ub3BzLnBvd2Vyb2ZmID0gcG1fZ2VuZXJpY19wb3dlcm9mZjsKLQlnZW5wZC0+ZG9tYWluLm9wcy5wb3dlcm9mZl9sYXRlID0gcG1fZ2VuZXJpY19wb3dlcm9mZl9sYXRlOwogCWdlbnBkLT5kb21haW4ub3BzLnBvd2Vyb2ZmX25vaXJxID0gcG1fZ2VucGRfc3VzcGVuZF9ub2lycTsKIAlnZW5wZC0+ZG9tYWluLm9wcy5yZXN0b3JlX25vaXJxID0gcG1fZ2VucGRfcmVzdG9yZV9ub2lycTsKLQlnZW5wZC0+ZG9tYWluLm9wcy5yZXN0b3JlX2Vhcmx5ID0gcG1fZ2VuZXJpY19yZXN0b3JlX2Vhcmx5OwotCWdlbnBkLT5kb21haW4ub3BzLnJlc3RvcmUgPSBwbV9nZW5lcmljX3Jlc3RvcmU7CiAJZ2VucGQtPmRvbWFpbi5vcHMuY29tcGxldGUgPSBwbV9nZW5wZF9jb21wbGV0ZTsKIAogCWlmIChnZW5wZC0+ZmxhZ3MgJiBHRU5QRF9GTEFHX1BNX0NMSykgewpAQCAtMTMyOCw3ICsxMzQ3LDcxIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbV9nZW5wZF9pbml0KTsKIAorc3RhdGljIGludCBnZW5wZF9yZW1vdmUoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3sKKwlzdHJ1Y3QgZ3BkX2xpbmsgKmwsICpsaW5rOworCisJaWYgKElTX0VSUl9PUl9OVUxMKGdlbnBkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZnZW5wZC0+bG9jayk7CisKKwlpZiAoZ2VucGQtPmhhc19wcm92aWRlcikgeworCQltdXRleF91bmxvY2soJmdlbnBkLT5sb2NrKTsKKwkJcHJfZXJyKCJQcm92aWRlciBwcmVzZW50LCB1bmFibGUgdG8gcmVtb3ZlICVzXG4iLCBnZW5wZC0+bmFtZSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KCZnZW5wZC0+bWFzdGVyX2xpbmtzKSB8fCBnZW5wZC0+ZGV2aWNlX2NvdW50KSB7CisJCW11dGV4X3VubG9jaygmZ2VucGQtPmxvY2spOworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gcmVtb3ZlICVzXG4iLCBfX2Z1bmNfXywgZ2VucGQtPm5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaW5rLCBsLCAmZ2VucGQtPnNsYXZlX2xpbmtzLCBzbGF2ZV9ub2RlKSB7CisJCWxpc3RfZGVsKCZsaW5rLT5tYXN0ZXJfbm9kZSk7CisJCWxpc3RfZGVsKCZsaW5rLT5zbGF2ZV9ub2RlKTsKKwkJa2ZyZWUobGluayk7CisJfQorCisJbGlzdF9kZWwoJmdlbnBkLT5ncGRfbGlzdF9ub2RlKTsKKwltdXRleF91bmxvY2soJmdlbnBkLT5sb2NrKTsKKwljYW5jZWxfd29ya19zeW5jKCZnZW5wZC0+cG93ZXJfb2ZmX3dvcmspOworCXByX2RlYnVnKCIlczogcmVtb3ZlZCAlc1xuIiwgX19mdW5jX18sIGdlbnBkLT5uYW1lKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHBtX2dlbnBkX3JlbW92ZSAtIFJlbW92ZSBhIGdlbmVyaWMgSS9PIFBNIGRvbWFpbgorICogQGdlbnBkOiBQb2ludGVyIHRvIFBNIGRvbWFpbiB0aGF0IGlzIHRvIGJlIHJlbW92ZWQuCisgKgorICogVG8gcmVtb3ZlIHRoZSBQTSBkb21haW4sIHRoaXMgZnVuY3Rpb246CisgKiAgLSBSZW1vdmVzIHRoZSBQTSBkb21haW4gYXMgYSBzdWJkb21haW4gdG8gYW55IHBhcmVudCBkb21haW5zLAorICogICAgaWYgaXQgd2FzIGFkZGVkLgorICogIC0gUmVtb3ZlcyB0aGUgUE0gZG9tYWluIGZyb20gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBQTSBkb21haW5zLgorICoKKyAqIFRoZSBQTSBkb21haW4gd2lsbCBvbmx5IGJlIHJlbW92ZWQsIGlmIHRoZSBhc3NvY2lhdGVkIHByb3ZpZGVyIGhhcworICogYmVlbiByZW1vdmVkLCBpdCBpcyBub3QgYSBwYXJlbnQgdG8gYW55IG90aGVyIFBNIGRvbWFpbiBhbmQgaGFzIG5vCisgKiBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqLworaW50IHBtX2dlbnBkX3JlbW92ZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZncGRfbGlzdF9sb2NrKTsKKwlyZXQgPSBnZW5wZF9yZW1vdmUoZ2VucGQpOworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocG1fZ2VucGRfcmVtb3ZlKTsKKwogI2lmZGVmIENPTkZJR19QTV9HRU5FUklDX0RPTUFJTlNfT0YKKwordHlwZWRlZiBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKigqZ2VucGRfeGxhdGVfdCkoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncywKKwkJCQkJCSAgIHZvaWQgKmRhdGEpOworCiAvKgogICogRGV2aWNlIFRyZWUgYmFzZWQgUE0gZG9tYWluIHByb3ZpZGVycy4KICAqCkBAIC0xMzQwLDggKzE0MjMsOCBAQAogICogbWFwcyBhIFBNIGRvbWFpbiBzcGVjaWZpZXIgcmV0cmlldmVkIGZyb20gdGhlIGRldmljZSB0cmVlIHRvIGEgUE0gZG9tYWluLgogICoKICAqIFR3byBzaW1wbGUgbWFwcGluZyBmdW5jdGlvbnMgaGF2ZSBiZWVuIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZToKLSAqICAtIF9fb2ZfZ2VucGRfeGxhdGVfc2ltcGxlKCkgZm9yIDE6MSBkZXZpY2UgdHJlZSBub2RlIHRvIFBNIGRvbWFpbiBtYXBwaW5nLgotICogIC0gX19vZl9nZW5wZF94bGF0ZV9vbmVjZWxsKCkgZm9yIG1hcHBpbmcgb2YgbXVsdGlwbGUgUE0gZG9tYWlucyBwZXIgbm9kZSBieQorICogIC0gZ2VucGRfeGxhdGVfc2ltcGxlKCkgZm9yIDE6MSBkZXZpY2UgdHJlZSBub2RlIHRvIFBNIGRvbWFpbiBtYXBwaW5nLgorICogIC0gZ2VucGRfeGxhdGVfb25lY2VsbCgpIGZvciBtYXBwaW5nIG9mIG11bHRpcGxlIFBNIGRvbWFpbnMgcGVyIG5vZGUgYnkKICAqICAgIGluZGV4LgogICovCiAKQEAgLTEzNjYsNyArMTQ0OSw3IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKG9mX2dlbnBkX211dGV4KTsKIAogLyoqCi0gKiBfX29mX2dlbnBkX3hsYXRlX3NpbXBsZSgpIC0gWGxhdGUgZnVuY3Rpb24gZm9yIGRpcmVjdCBub2RlLWRvbWFpbiBtYXBwaW5nCisgKiBnZW5wZF94bGF0ZV9zaW1wbGUoKSAtIFhsYXRlIGZ1bmN0aW9uIGZvciBkaXJlY3Qgbm9kZS1kb21haW4gbWFwcGluZwogICogQGdlbnBkc3BlYzogT0YgcGhhbmRsZSBhcmdzIHRvIG1hcCBpbnRvIGEgUE0gZG9tYWluCiAgKiBAZGF0YTogeGxhdGUgZnVuY3Rpb24gcHJpdmF0ZSBkYXRhIC0gcG9pbnRlciB0byBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4KICAqCkBAIC0xMzc0LDcgKzE0NTcsNyBAQAogICogaGF2ZSB0aGVpciBvd24gZGV2aWNlIHRyZWUgbm9kZXMuIFRoZSBwcml2YXRlIGRhdGEgb2YgeGxhdGUgZnVuY3Rpb24gbmVlZHMKICAqIHRvIGJlIGEgdmFsaWQgcG9pbnRlciB0byBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4uCiAgKi8KLXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqX19vZl9nZW5wZF94bGF0ZV9zaW1wbGUoCitzdGF0aWMgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZF94bGF0ZV9zaW1wbGUoCiAJCQkJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmdlbnBkc3BlYywKIAkJCQkJdm9pZCAqZGF0YSkKIHsKQEAgLTEzODIsMTAgKzE0NjUsOSBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAlyZXR1cm4gZGF0YTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fb2ZfZ2VucGRfeGxhdGVfc2ltcGxlKTsKIAogLyoqCi0gKiBfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwoKSAtIFhsYXRlIGZ1bmN0aW9uIHVzaW5nIGEgc2luZ2xlIGluZGV4LgorICogZ2VucGRfeGxhdGVfb25lY2VsbCgpIC0gWGxhdGUgZnVuY3Rpb24gdXNpbmcgYSBzaW5nbGUgaW5kZXguCiAgKiBAZ2VucGRzcGVjOiBPRiBwaGFuZGxlIGFyZ3MgdG8gbWFwIGludG8gYSBQTSBkb21haW4KICAqIEBkYXRhOiB4bGF0ZSBmdW5jdGlvbiBwcml2YXRlIGRhdGEgLSBwb2ludGVyIHRvIHN0cnVjdCBnZW5wZF9vbmVjZWxsX2RhdGEKICAqCkBAIC0xMzk0LDcgKzE0NzYsNyBAQAogICogQSBzaW5nbGUgY2VsbCBpcyB1c2VkIGFzIGFuIGluZGV4IGludG8gYW4gYXJyYXkgb2YgUE0gZG9tYWlucyBzcGVjaWZpZWQgaW4KICAqIHRoZSBnZW5wZF9vbmVjZWxsX2RhdGEgc3RydWN0IHdoZW4gcmVnaXN0ZXJpbmcgdGhlIHByb3ZpZGVyLgogICovCi1zdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKl9fb2ZfZ2VucGRfeGxhdGVfb25lY2VsbCgKK3N0YXRpYyBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkX3hsYXRlX29uZWNlbGwoCiAJCQkJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmdlbnBkc3BlYywKIAkJCQkJdm9pZCAqZGF0YSkKIHsKQEAgLTE0MTQsMTYgKzE0OTYsMTUgQEAKIAogCXJldHVybiBnZW5wZF9kYXRhLT5kb21haW5zW2lkeF07CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwpOwogCiAvKioKLSAqIF9fb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyKCkgLSBSZWdpc3RlciBhIFBNIGRvbWFpbiBwcm92aWRlciBmb3IgYSBub2RlCisgKiBnZW5wZF9hZGRfcHJvdmlkZXIoKSAtIFJlZ2lzdGVyIGEgUE0gZG9tYWluIHByb3ZpZGVyIGZvciBhIG5vZGUKICAqIEBucDogRGV2aWNlIG5vZGUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIFBNIGRvbWFpbiBwcm92aWRlci4KICAqIEB4bGF0ZTogQ2FsbGJhY2sgZm9yIGRlY29kaW5nIFBNIGRvbWFpbiBmcm9tIHBoYW5kbGUgYXJndW1lbnRzLgogICogQGRhdGE6IENvbnRleHQgcG9pbnRlciBmb3IgQHhsYXRlIGNhbGxiYWNrLgogICovCi1pbnQgX19vZl9nZW5wZF9hZGRfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwgZ2VucGRfeGxhdGVfdCB4bGF0ZSwKLQkJCXZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGdlbnBkX2FkZF9wcm92aWRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBnZW5wZF94bGF0ZV90IHhsYXRlLAorCQkJICAgICAgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgb2ZfZ2VucGRfcHJvdmlkZXIgKmNwOwogCkBAIC0xNDQyLDcgKzE1MjMsODMgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoX19vZl9nZW5wZF9hZGRfcHJvdmlkZXIpOworCisvKioKKyAqIG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUoKSAtIFJlZ2lzdGVyIGEgc2ltcGxlIFBNIGRvbWFpbiBwcm92aWRlcgorICogQG5wOiBEZXZpY2Ugbm9kZSBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgUE0gZG9tYWluIHByb3ZpZGVyLgorICogQGdlbnBkOiBQb2ludGVyIHRvIFBNIGRvbWFpbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBNIGRvbWFpbiBwcm92aWRlci4KKyAqLworaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmICghbnAgfHwgIWdlbnBkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmdwZF9saXN0X2xvY2spOworCisJaWYgKHBtX2dlbnBkX3ByZXNlbnQoZ2VucGQpKQorCQlyZXQgPSBnZW5wZF9hZGRfcHJvdmlkZXIobnAsIGdlbnBkX3hsYXRlX3NpbXBsZSwgZ2VucGQpOworCisJaWYgKCFyZXQpIHsKKwkJZ2VucGQtPnByb3ZpZGVyID0gJm5wLT5md25vZGU7CisJCWdlbnBkLT5oYXNfcHJvdmlkZXIgPSB0cnVlOworCX0KKworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2VucGRfYWRkX3Byb3ZpZGVyX3NpbXBsZSk7CisKKy8qKgorICogb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyX29uZWNlbGwoKSAtIFJlZ2lzdGVyIGEgb25lY2VsbCBQTSBkb21haW4gcHJvdmlkZXIKKyAqIEBucDogRGV2aWNlIG5vZGUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIFBNIGRvbWFpbiBwcm92aWRlci4KKyAqIEBkYXRhOiBQb2ludGVyIHRvIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgUE0gZG9tYWluIHByb3ZpZGVyLgorICovCitpbnQgb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyX29uZWNlbGwoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgIHN0cnVjdCBnZW5wZF9vbmVjZWxsX2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoIW5wIHx8ICFkYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmdwZF9saXN0X2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm51bV9kb21haW5zOyBpKyspIHsKKwkJaWYgKCFkYXRhLT5kb21haW5zW2ldKQorCQkJY29udGludWU7CisJCWlmICghcG1fZ2VucGRfcHJlc2VudChkYXRhLT5kb21haW5zW2ldKSkKKwkJCWdvdG8gZXJyb3I7CisKKwkJZGF0YS0+ZG9tYWluc1tpXS0+cHJvdmlkZXIgPSAmbnAtPmZ3bm9kZTsKKwkJZGF0YS0+ZG9tYWluc1tpXS0+aGFzX3Byb3ZpZGVyID0gdHJ1ZTsKKwl9CisKKwlyZXQgPSBnZW5wZF9hZGRfcHJvdmlkZXIobnAsIGdlbnBkX3hsYXRlX29uZWNlbGwsIGRhdGEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJbXV0ZXhfdW5sb2NrKCZncGRfbGlzdF9sb2NrKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwl3aGlsZSAoaS0tKSB7CisJCWlmICghZGF0YS0+ZG9tYWluc1tpXSkKKwkJCWNvbnRpbnVlOworCQlkYXRhLT5kb21haW5zW2ldLT5wcm92aWRlciA9IE5VTEw7CisJCWRhdGEtPmRvbWFpbnNbaV0tPmhhc19wcm92aWRlciA9IGZhbHNlOworCX0KKworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2VucGRfYWRkX3Byb3ZpZGVyX29uZWNlbGwpOwogCiAvKioKICAqIG9mX2dlbnBkX2RlbF9wcm92aWRlcigpIC0gUmVtb3ZlIGEgcHJldmlvdXNseSByZWdpc3RlcmVkIFBNIGRvbWFpbiBwcm92aWRlcgpAQCAtMTQ1MSwxMCArMTYwOCwyMSBAQAogdm9pZCBvZl9nZW5wZF9kZWxfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlzdHJ1Y3Qgb2ZfZ2VucGRfcHJvdmlkZXIgKmNwOworCXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ3BkOwogCisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CiAJbXV0ZXhfbG9jaygmb2ZfZ2VucGRfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZvZl9nZW5wZF9wcm92aWRlcnMsIGxpbmspIHsKIAkJaWYgKGNwLT5ub2RlID09IG5wKSB7CisJCQkvKgorCQkJICogRm9yIGVhY2ggUE0gZG9tYWluIGFzc29jaWF0ZWQgd2l0aCB0aGUKKwkJCSAqIHByb3ZpZGVyLCBzZXQgdGhlICdoYXNfcHJvdmlkZXInIHRvIGZhbHNlCisJCQkgKiBzbyB0aGF0IHRoZSBQTSBkb21haW4gY2FuIGJlIHNhZmVseSByZW1vdmVkLgorCQkJICovCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdwZCwgJmdwZF9saXN0LCBncGRfbGlzdF9ub2RlKQorCQkJCWlmIChncGQtPnByb3ZpZGVyID09ICZucC0+Zndub2RlKQorCQkJCQlncGQtPmhhc19wcm92aWRlciA9IGZhbHNlOworCiAJCQlsaXN0X2RlbCgmY3AtPmxpbmspOwogCQkJb2Zfbm9kZV9wdXQoY3AtPm5vZGUpOwogCQkJa2ZyZWUoY3ApOwpAQCAtMTQ2MiwxMSArMTYzMCwxMiBAQAogCQl9CiAJfQogCW11dGV4X3VubG9jaygmb2ZfZ2VucGRfbXV0ZXgpOworCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvZl9nZW5wZF9kZWxfcHJvdmlkZXIpOwogCiAvKioKLSAqIG9mX2dlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKCkgLSBMb29rLXVwIFBNIGRvbWFpbgorICogZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoKSAtIExvb2stdXAgUE0gZG9tYWluCiAgKiBAZ2VucGRzcGVjOiBPRiBwaGFuZGxlIGFyZ3MgdG8gdXNlIGZvciBsb29rLXVwCiAgKgogICogTG9va3MgZm9yIGEgUE0gZG9tYWluIHByb3ZpZGVyIHVuZGVyIHRoZSBub2RlIHNwZWNpZmllZCBieSBAZ2VucGRzcGVjIGFuZCBpZgpAQCAtMTQ3Niw3ICsxNjQ1LDcgQEAKICAqIFJldHVybnMgYSB2YWxpZCBwb2ludGVyIHRvIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiBvbiBzdWNjZXNzIG9yIEVSUl9QVFIoKQogICogb24gZmFpbHVyZS4KICAqLwotc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpvZl9nZW5wZF9nZXRfZnJvbV9wcm92aWRlcigKK3N0YXRpYyBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKAogCQkJCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMpCiB7CiAJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCA9IEVSUl9QVFIoLUVOT0VOVCk7CkBAIC0xNDk5LDcgKzE2NjgsMTA5IEBACiAKIAlyZXR1cm4gZ2VucGQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9nZW5wZF9nZXRfZnJvbV9wcm92aWRlcik7CisKKy8qKgorICogb2ZfZ2VucGRfYWRkX2RldmljZSgpIC0gQWRkIGEgZGV2aWNlIHRvIGFuIEkvTyBQTSBkb21haW4KKyAqIEBnZW5wZHNwZWM6IE9GIHBoYW5kbGUgYXJncyB0byB1c2UgZm9yIGxvb2stdXAgUE0gZG9tYWluCisgKiBAZGV2OiBEZXZpY2UgdG8gYmUgYWRkZWQuCisgKgorICogTG9va3MtdXAgYW4gSS9PIFBNIGRvbWFpbiBiYXNlZCB1cG9uIHBoYW5kbGUgYXJncyBwcm92aWRlZCBhbmQgYWRkcworICogdGhlIGRldmljZSB0byB0aGUgUE0gZG9tYWluLiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgb2ZfZ2VucGRfYWRkX2RldmljZShzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZncGRfbGlzdF9sb2NrKTsKKworCWdlbnBkID0gZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoZ2VucGRzcGVjKTsKKwlpZiAoSVNfRVJSKGdlbnBkKSkgeworCQlyZXQgPSBQVFJfRVJSKGdlbnBkKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZ2VucGRfYWRkX2RldmljZShnZW5wZCwgZGV2LCBOVUxMKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2VucGRfYWRkX2RldmljZSk7CisKKy8qKgorICogb2ZfZ2VucGRfYWRkX3N1YmRvbWFpbiAtIEFkZCBhIHN1YmRvbWFpbiB0byBhbiBJL08gUE0gZG9tYWluLgorICogQHBhcmVudF9zcGVjOiBPRiBwaGFuZGxlIGFyZ3MgdG8gdXNlIGZvciBwYXJlbnQgUE0gZG9tYWluIGxvb2stdXAKKyAqIEBzdWJkb21haW5fc3BlYzogT0YgcGhhbmRsZSBhcmdzIHRvIHVzZSBmb3Igc3ViZG9tYWluIGxvb2stdXAKKyAqCisgKiBMb29rcy11cCBhIHBhcmVudCBQTSBkb21haW4gYW5kIHN1YmRvbWFpbiBiYXNlZCB1cG9uIHBoYW5kbGUgYXJncworICogcHJvdmlkZWQgYW5kIGFkZHMgdGhlIHN1YmRvbWFpbiB0byB0aGUgcGFyZW50IFBNIGRvbWFpbi4gUmV0dXJucyBhCisgKiBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBvZl9nZW5wZF9hZGRfc3ViZG9tYWluKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKnBhcmVudF9zcGVjLAorCQkJICAgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqc3ViZG9tYWluX3NwZWMpCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwYXJlbnQsICpzdWJkb21haW47CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmdwZF9saXN0X2xvY2spOworCisJcGFyZW50ID0gZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIocGFyZW50X3NwZWMpOworCWlmIChJU19FUlIocGFyZW50KSkgeworCQlyZXQgPSBQVFJfRVJSKHBhcmVudCk7CisJCWdvdG8gb3V0OworCX0KKworCXN1YmRvbWFpbiA9IGdlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKHN1YmRvbWFpbl9zcGVjKTsKKwlpZiAoSVNfRVJSKHN1YmRvbWFpbikpIHsKKwkJcmV0ID0gUFRSX0VSUihzdWJkb21haW4pOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBnZW5wZF9hZGRfc3ViZG9tYWluKHBhcmVudCwgc3ViZG9tYWluKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2VucGRfYWRkX3N1YmRvbWFpbik7CisKKy8qKgorICogb2ZfZ2VucGRfcmVtb3ZlX2xhc3QgLSBSZW1vdmUgdGhlIGxhc3QgUE0gZG9tYWluIHJlZ2lzdGVyZWQgZm9yIGEgcHJvdmlkZXIKKyAqIEBwcm92aWRlcjogUG9pbnRlciB0byBkZXZpY2Ugc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCBwcm92aWRlcgorICoKKyAqIEZpbmQgdGhlIGxhc3QgUE0gZG9tYWluIHRoYXQgd2FzIGFkZGVkIGJ5IGEgcGFydGljdWxhciBwcm92aWRlciBhbmQKKyAqIHJlbW92ZSB0aGlzIFBNIGRvbWFpbiBmcm9tIHRoZSBsaXN0IG9mIFBNIGRvbWFpbnMuIFRoZSBwcm92aWRlciBpcworICogaWRlbnRpZmllZCBieSB0aGUgJ3Byb3ZpZGVyJyBkZXZpY2Ugc3RydWN0dXJlIHRoYXQgaXMgcGFzc2VkLiBUaGUgUE0KKyAqIGRvbWFpbiB3aWxsIG9ubHkgYmUgcmVtb3ZlZCwgaWYgdGhlIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCBkb21haW4KKyAqIGhhcyBiZWVuIHJlbW92ZWQuCisgKgorICogUmV0dXJucyBhIHZhbGlkIHBvaW50ZXIgdG8gc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluIG9uIHN1Y2Nlc3Mgb3IKKyAqIEVSUl9QVFIoKSBvbiBmYWlsdXJlLgorICovCitzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKm9mX2dlbnBkX3JlbW92ZV9sYXN0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpncGQsICpnZW5wZCA9IEVSUl9QVFIoLUVOT0VOVCk7CisJaW50IHJldDsKKworCWlmIChJU19FUlJfT1JfTlVMTChucCkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShncGQsICZncGRfbGlzdCwgZ3BkX2xpc3Rfbm9kZSkgeworCQlpZiAoZ3BkLT5wcm92aWRlciA9PSAmbnAtPmZ3bm9kZSkgeworCQkJcmV0ID0gZ2VucGRfcmVtb3ZlKGdwZCk7CisJCQlnZW5wZCA9IHJldCA/IEVSUl9QVFIocmV0KSA6IGdwZDsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gZ2VucGQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9nZW5wZF9yZW1vdmVfbGFzdCk7CiAKIC8qKgogICogZ2VucGRfZGV2X3BtX2RldGFjaCAtIERldGFjaCBhIGRldmljZSBmcm9tIGl0cyBQTSBkb21haW4uCkBAIC0xNTE1LDE0ICsxNzg2LDE0IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IHJldCA9IDA7CiAKLQlwZCA9IHBtX2dlbnBkX2xvb2t1cF9kZXYoZGV2KTsKLQlpZiAoIXBkKQorCXBkID0gZGV2X3RvX2dlbnBkKGRldik7CisJaWYgKElTX0VSUihwZCkpCiAJCXJldHVybjsKIAogCWRldl9kYmcoZGV2LCAicmVtb3ZpbmcgZnJvbSBQTSBkb21haW4gJXNcbiIsIHBkLT5uYW1lKTsKIAogCWZvciAoaSA9IDE7IGkgPCBHRU5QRF9SRVRSWV9NQVhfTVM7IGkgPDw9IDEpIHsKLQkJcmV0ID0gcG1fZ2VucGRfcmVtb3ZlX2RldmljZShwZCwgZGV2KTsKKwkJcmV0ID0gZ2VucGRfcmVtb3ZlX2RldmljZShwZCwgZGV2KTsKIAkJaWYgKHJldCAhPSAtRUFHQUlOKQogCQkJYnJlYWs7CiAKQEAgLTE1OTYsOSArMTg2NywxMSBAQAogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JcGQgPSBvZl9nZW5wZF9nZXRfZnJvbV9wcm92aWRlcigmcGRfYXJncyk7CisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CisJcGQgPSBnZW5wZF9nZXRfZnJvbV9wcm92aWRlcigmcGRfYXJncyk7CiAJb2Zfbm9kZV9wdXQocGRfYXJncy5ucCk7CiAJaWYgKElTX0VSUihwZCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZncGRfbGlzdF9sb2NrKTsKIAkJZGV2X2RiZyhkZXYsICIlcygpIGZhaWxlZCB0byBmaW5kIFBNIGRvbWFpbjogJWxkXG4iLAogCQkJX19mdW5jX18sIFBUUl9FUlIocGQpKTsKIAkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CkBAIC0xNjA3LDEzICsxODgwLDE0IEBACiAJZGV2X2RiZyhkZXYsICJhZGRpbmcgdG8gUE0gZG9tYWluICVzXG4iLCBwZC0+bmFtZSk7CiAKIAlmb3IgKGkgPSAxOyBpIDwgR0VOUERfUkVUUllfTUFYX01TOyBpIDw8PSAxKSB7Ci0JCXJldCA9IHBtX2dlbnBkX2FkZF9kZXZpY2UocGQsIGRldik7CisJCXJldCA9IGdlbnBkX2FkZF9kZXZpY2UocGQsIGRldiwgTlVMTCk7CiAJCWlmIChyZXQgIT0gLUVBR0FJTikKIAkJCWJyZWFrOwogCiAJCW1kZWxheShpKTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQorCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CiAKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhZGQgdG8gUE0gZG9tYWluICVzOiAlZCIsCkBAIC0xNjM2LDcgKzE5MTAsNyBAQAogCiAvKioqICAgICAgICBkZWJ1Z2ZzIHN1cHBvcnQgICAgICAgICoqKi8KIAotI2lmZGVmIENPTkZJR19QTV9BRFZBTkNFRF9ERUJVRworI2lmZGVmIENPTkZJR19ERUJVR19GUwogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgpAQCAtMTc4NCw0ICsyMDU4LDQgQEAKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUocG1fZ2VucGRfZGVidWdmc19kaXIpOwogfQogX19leGl0Y2FsbChwbV9nZW5wZF9kZWJ1Z19leGl0KTsKLSNlbmRpZiAvKiBDT05GSUdfUE1fQURWQU5DRURfREVCVUcgKi8KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAvY29yZS5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC9jb3JlLmMKaW5kZXggZGYwYzcwOS4uNGM3YzZkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC9jb3JlLmMKQEAgLTU4NCw3ICs1ODQsNiBAQAogCXN0cnVjdCBjbGsgKmNsazsKIAl1bnNpZ25lZCBsb25nIGZyZXEsIG9sZF9mcmVxOwogCXVuc2lnbmVkIGxvbmcgdV92b2x0LCB1X3ZvbHRfbWluLCB1X3ZvbHRfbWF4OwotCXVuc2lnbmVkIGxvbmcgb3Vfdm9sdCwgb3Vfdm9sdF9taW4sIG91X3ZvbHRfbWF4OwogCWludCByZXQ7CiAKIAlpZiAodW5saWtlbHkoIXRhcmdldF9mcmVxKSkgewpAQCAtNjIwLDExICs2MTksNyBAQAogCX0KIAogCW9sZF9vcHAgPSBfZmluZF9mcmVxX2NlaWwob3BwX3RhYmxlLCAmb2xkX2ZyZXEpOwotCWlmICghSVNfRVJSKG9sZF9vcHApKSB7Ci0JCW91X3ZvbHQgPSBvbGRfb3BwLT51X3ZvbHQ7Ci0JCW91X3ZvbHRfbWluID0gb2xkX29wcC0+dV92b2x0X21pbjsKLQkJb3Vfdm9sdF9tYXggPSBvbGRfb3BwLT51X3ZvbHRfbWF4OwotCX0gZWxzZSB7CisJaWYgKElTX0VSUihvbGRfb3BwKSkgewogCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsZWQgdG8gZmluZCBjdXJyZW50IE9QUCBmb3IgZnJlcSAlbHUgKCVsZClcbiIsCiAJCQlfX2Z1bmNfXywgb2xkX2ZyZXEsIFBUUl9FUlIob2xkX29wcCkpOwogCX0KQEAgLTY4Myw3ICs2NzgsOCBAQAogcmVzdG9yZV92b2x0YWdlOgogCS8qIFRoaXMgc2hvdWxkbid0IGhhcm0gZXZlbiBpZiB0aGUgdm9sdGFnZXMgd2VyZW4ndCB1cGRhdGVkIGVhcmxpZXIgKi8KIAlpZiAoIUlTX0VSUihvbGRfb3BwKSkKLQkJX3NldF9vcHBfdm9sdGFnZShkZXYsIHJlZywgb3Vfdm9sdCwgb3Vfdm9sdF9taW4sIG91X3ZvbHRfbWF4KTsKKwkJX3NldF9vcHBfdm9sdGFnZShkZXYsIHJlZywgb2xkX29wcC0+dV92b2x0LAorCQkJCSBvbGRfb3BwLT51X3ZvbHRfbWluLCBvbGRfb3BwLT51X3ZvbHRfbWF4KTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwL29mLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvb3BwL29mLmMKaW5kZXggMWRmZDNkZC4uNTU1MjIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL29wcC9vZi5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9vcHAvb2YuYwpAQCAtNzEsOCArNzEsMTggQEAKIAl1MzIgdmVyc2lvbjsKIAlpbnQgcmV0OwogCi0JaWYgKCFvcHBfdGFibGUtPnN1cHBvcnRlZF9odykKLQkJcmV0dXJuIHRydWU7CisJaWYgKCFvcHBfdGFibGUtPnN1cHBvcnRlZF9odykgeworCQkvKgorCQkgKiBJbiB0aGUgY2FzZSB0aGF0IG5vIHN1cHBvcnRlZF9odyBoYXMgYmVlbiBzZXQgYnkgdGhlCisJCSAqIHBsYXRmb3JtIGJ1dCB0aGVyZSBpcyBhbiBvcHAtc3VwcG9ydGVkLWh3IHZhbHVlIHNldCBmb3IKKwkJICogYW4gT1BQIHRoZW4gdGhlIE9QUCBzaG91bGQgbm90IGJlIGVuYWJsZWQgYXMgdGhlcmUgaXMKKwkJICogbm8gd2F5IHRvIHNlZSBpZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgaXQuCisJCSAqLworCQlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgIm9wcC1zdXBwb3J0ZWQtaHciLCBOVUxMKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJZWxzZQorCQkJcmV0dXJuIHRydWU7CisJfQogCiAJd2hpbGUgKGNvdW50LS0pIHsKIAkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobnAsICJvcHAtc3VwcG9ydGVkLWh3IiwgY291bnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3J1bnRpbWUuYwppbmRleCBlMDk3ZDM1Li44MmEwODFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcnVudGltZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmMKQEAgLTMwMSw3ICszMDEsNyBAQAogCWludCAoKmNhbGxiYWNrKShzdHJ1Y3QgZGV2aWNlICopOwogCWludCByZXR2YWw7CiAKLQl0cmFjZV9ycG1faWRsZShkZXYsIHJwbWZsYWdzKTsKKwl0cmFjZV9ycG1faWRsZV9yY3VpZGxlKGRldiwgcnBtZmxhZ3MpOwogCXJldHZhbCA9IHJwbV9jaGVja19zdXNwZW5kX2FsbG93ZWQoZGV2KTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJOwkvKiBDb25kaXRpb25zIGFyZSB3cm9uZy4gKi8KQEAgLTMzNyw3ICszMzcsNyBAQAogCQkJZGV2LT5wb3dlci5yZXF1ZXN0X3BlbmRpbmcgPSB0cnVlOwogCQkJcXVldWVfd29yayhwbV93cSwgJmRldi0+cG93ZXIud29yayk7CiAJCX0KLQkJdHJhY2VfcnBtX3JldHVybl9pbnQoZGV2LCBfVEhJU19JUF8sIDApOworCQl0cmFjZV9ycG1fcmV0dXJuX2ludF9yY3VpZGxlKGRldiwgX1RISVNfSVBfLCAwKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNTIsNyArMzUyLDcgQEAKIAl3YWtlX3VwX2FsbCgmZGV2LT5wb3dlci53YWl0X3F1ZXVlKTsKIAogIG91dDoKLQl0cmFjZV9ycG1fcmV0dXJuX2ludChkZXYsIF9USElTX0lQXywgcmV0dmFsKTsKKwl0cmFjZV9ycG1fcmV0dXJuX2ludF9yY3VpZGxlKGRldiwgX1RISVNfSVBfLCByZXR2YWwpOwogCXJldHVybiByZXR2YWwgPyByZXR2YWwgOiBycG1fc3VzcGVuZChkZXYsIHJwbWZsYWdzIHwgUlBNX0FVVE8pOwogfQogCkBAIC00MTksNyArNDE5LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSBOVUxMOwogCWludCByZXR2YWw7CiAKLQl0cmFjZV9ycG1fc3VzcGVuZChkZXYsIHJwbWZsYWdzKTsKKwl0cmFjZV9ycG1fc3VzcGVuZF9yY3VpZGxlKGRldiwgcnBtZmxhZ3MpOwogCiAgcmVwZWF0OgogCXJldHZhbCA9IHJwbV9jaGVja19zdXNwZW5kX2FsbG93ZWQoZGV2KTsKQEAgLTU0OSw3ICs1NDksNyBAQAogCX0KIAogIG91dDoKLQl0cmFjZV9ycG1fcmV0dXJuX2ludChkZXYsIF9USElTX0lQXywgcmV0dmFsKTsKKwl0cmFjZV9ycG1fcmV0dXJuX2ludF9yY3VpZGxlKGRldiwgX1RISVNfSVBfLCByZXR2YWwpOwogCiAJcmV0dXJuIHJldHZhbDsKIApAQCAtNjAxLDcgKzYwMSw3IEBACiAJc3RydWN0IGRldmljZSAqcGFyZW50ID0gTlVMTDsKIAlpbnQgcmV0dmFsID0gMDsKIAotCXRyYWNlX3JwbV9yZXN1bWUoZGV2LCBycG1mbGFncyk7CisJdHJhY2VfcnBtX3Jlc3VtZV9yY3VpZGxlKGRldiwgcnBtZmxhZ3MpOwogCiAgcmVwZWF0OgogCWlmIChkZXYtPnBvd2VyLnJ1bnRpbWVfZXJyb3IpCkBAIC03NjQsNyArNzY0LDcgQEAKIAkJc3Bpbl9sb2NrX2lycSgmZGV2LT5wb3dlci5sb2NrKTsKIAl9CiAKLQl0cmFjZV9ycG1fcmV0dXJuX2ludChkZXYsIF9USElTX0lQXywgcmV0dmFsKTsKKwl0cmFjZV9ycG1fcmV0dXJuX2ludF9yY3VpZGxlKGRldiwgX1RISVNfSVBfLCByZXR2YWwpOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvaW50ZXJuYWwuaCBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvaW50ZXJuYWwuaAppbmRleCBhMDM4MDMzLi4yYTQ0MzVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oCkBAIC0xMDUsOCArMTA1LDggQEAKIAogCWJvb2wgZGVmZXJfY2FjaGluZzsKIAotCXU4IHJlYWRfZmxhZ19tYXNrOwotCXU4IHdyaXRlX2ZsYWdfbWFzazsKKwl1bnNpZ25lZCBsb25nIHJlYWRfZmxhZ19tYXNrOworCXVuc2lnbmVkIGxvbmcgd3JpdGVfZmxhZ19tYXNrOwogCiAJLyogbnVtYmVyIG9mIGJpdHMgdG8gKGxlZnQpIHNoaWZ0IHRoZSByZWcgdmFsdWUgd2hlbiBmb3JtYXR0aW5nKi8KIAlpbnQgcmVnX3NoaWZ0OwpAQCAtMTczLDYgKzE3Myw3IEBACiAJaW50ICgqZHJvcCkoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgbWF4KTsKIH07CiAKK2Jvb2wgcmVnbWFwX2NhY2hlZChzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcpOwogYm9vbCByZWdtYXBfd3JpdGVhYmxlKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZyk7CiBib29sIHJlZ21hcF9yZWFkYWJsZShzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcpOwogYm9vbCByZWdtYXBfdm9sYXRpbGUoc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUtcmJ0cmVlLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLXJidHJlZS5jCmluZGV4IGFhNTZhZjguLmIxMWFmM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUtcmJ0cmVlLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS1yYnRyZWUuYwpAQCAtNDA0LDYgKzQwNCw3IEBACiAJCXVuc2lnbmVkIGludCBuZXdfYmFzZV9yZWcsIG5ld190b3BfcmVnOwogCQl1bnNpZ25lZCBpbnQgbWluLCBtYXg7CiAJCXVuc2lnbmVkIGludCBtYXhfZGlzdDsKKwkJdW5zaWduZWQgaW50IGRpc3QsIGJlc3RfZGlzdCA9IFVJTlRfTUFYOwogCiAJCW1heF9kaXN0ID0gbWFwLT5yZWdfc3RyaWRlICogc2l6ZW9mKCpyYm5vZGVfdG1wKSAvCiAJCQltYXAtPmNhY2hlX3dvcmRfc2l6ZTsKQEAgLTQyMywyNCArNDI0LDQxIEBACiAJCQkJJmJhc2VfcmVnLCAmdG9wX3JlZyk7CiAKIAkJCWlmIChiYXNlX3JlZyA8PSBtYXggJiYgdG9wX3JlZyA+PSBtaW4pIHsKLQkJCQluZXdfYmFzZV9yZWcgPSBtaW4ocmVnLCBiYXNlX3JlZyk7Ci0JCQkJbmV3X3RvcF9yZWcgPSBtYXgocmVnLCB0b3BfcmVnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1heCA8IGJhc2VfcmVnKQotCQkJCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwkJCQlpZiAocmVnIDwgYmFzZV9yZWcpCisJCQkJCWRpc3QgPSBiYXNlX3JlZyAtIHJlZzsKKwkJCQllbHNlIGlmIChyZWcgPiB0b3BfcmVnKQorCQkJCQlkaXN0ID0gcmVnIC0gdG9wX3JlZzsKIAkJCQllbHNlCi0JCQkJCW5vZGUgPSBub2RlLT5yYl9yaWdodDsKLQotCQkJCWNvbnRpbnVlOworCQkJCQlkaXN0ID0gMDsKKwkJCQlpZiAoZGlzdCA8IGJlc3RfZGlzdCkgeworCQkJCQlyYm5vZGUgPSByYm5vZGVfdG1wOworCQkJCQliZXN0X2Rpc3QgPSBkaXN0OworCQkJCQluZXdfYmFzZV9yZWcgPSBtaW4ocmVnLCBiYXNlX3JlZyk7CisJCQkJCW5ld190b3BfcmVnID0gbWF4KHJlZywgdG9wX3JlZyk7CisJCQkJfQogCQkJfQogCi0JCQlyZXQgPSByZWdjYWNoZV9yYnRyZWVfaW5zZXJ0X3RvX2Jsb2NrKG1hcCwgcmJub2RlX3RtcCwKKwkJCS8qCisJCQkgKiBLZWVwIGxvb2tpbmcsIHdlIHdhbnQgdG8gY2hvb3NlIHRoZSBjbG9zZXN0IGJsb2NrLAorCQkJICogb3RoZXJ3aXNlIHdlIG1pZ2h0IGVuZCB1cCBjcmVhdGluZyBvdmVybGFwcGluZworCQkJICogYmxvY2tzLCB3aGljaCBicmVha3MgdGhlIHJidHJlZS4KKwkJCSAqLworCQkJaWYgKHJlZyA8IGJhc2VfcmVnKQorCQkJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCQkJZWxzZSBpZiAocmVnID4gdG9wX3JlZykKKwkJCQlub2RlID0gbm9kZS0+cmJfcmlnaHQ7CisJCQllbHNlCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmJub2RlKSB7CisJCQlyZXQgPSByZWdjYWNoZV9yYnRyZWVfaW5zZXJ0X3RvX2Jsb2NrKG1hcCwgcmJub2RlLAogCQkJCQkJCSAgICAgIG5ld19iYXNlX3JlZywKIAkJCQkJCQkgICAgICBuZXdfdG9wX3JlZywgcmVnLAogCQkJCQkJCSAgICAgIHZhbHVlKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKLQkJCXJidHJlZV9jdHgtPmNhY2hlZF9yYm5vZGUgPSByYm5vZGVfdG1wOworCQkJcmJ0cmVlX2N0eC0+Y2FjaGVkX3Jibm9kZSA9IHJibm9kZTsKIAkJCXJldHVybiAwOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYwppbmRleCBkZjdmZjcyOS4uNGU1ODI1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYwpAQCAtMzgsMTAgKzM4LDExIEBACiAKIAkvKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgcmVnX2RlZmF1bHRzICovCiAJZm9yIChjb3VudCA9IDAsIGkgPSAwOyBpIDwgbWFwLT5udW1fcmVnX2RlZmF1bHRzX3JhdzsgaSsrKQotCQlpZiAoIXJlZ21hcF92b2xhdGlsZShtYXAsIGkgKiBtYXAtPnJlZ19zdHJpZGUpKQorCQlpZiAocmVnbWFwX3JlYWRhYmxlKG1hcCwgaSAqIG1hcC0+cmVnX3N0cmlkZSkgJiYKKwkJICAgICFyZWdtYXBfdm9sYXRpbGUobWFwLCBpICogbWFwLT5yZWdfc3RyaWRlKSkKIAkJCWNvdW50Kys7CiAKLQkvKiBhbGwgcmVnaXN0ZXJzIGFyZSB2b2xhdGlsZSwgc28ganVzdCBieXBhc3MgKi8KKwkvKiBhbGwgcmVnaXN0ZXJzIGFyZSB1bnJlYWRhYmxlIG9yIHZvbGF0aWxlLCBzbyBqdXN0IGJ5cGFzcyAqLwogCWlmICghY291bnQpIHsKIAkJbWFwLT5jYWNoZV9ieXBhc3MgPSB0cnVlOwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWRlYnVnZnMuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWRlYnVnZnMuYwppbmRleCAxZWUzZDQwLi4zNmNlMzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC1kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtZGVidWdmcy5jCkBAIC03Nyw2ICs3NywxNyBAQAogCX0KIH0KIAorc3RhdGljIGJvb2wgcmVnbWFwX3ByaW50YWJsZShzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcpCit7CisJaWYgKHJlZ21hcF9wcmVjaW91cyhtYXAsIHJlZykpCisJCXJldHVybiBmYWxzZTsKKworCWlmICghcmVnbWFwX3JlYWRhYmxlKG1hcCwgcmVnKSAmJiAhcmVnbWFwX2NhY2hlZChtYXAsIHJlZykpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCiAvKgogICogV29yayBvdXQgd2hlcmUgdGhlIHN0YXJ0IG9mZnNldCBtYXBzIGludG8gcmVnaXN0ZXIgbnVtYmVycywgYmVhcmluZwogICogaW4gbWluZCB0aGF0IHdlIHN1cHByZXNzIGhpZGRlbiByZWdpc3RlcnMuCkBAIC0xMDUsOCArMTE2LDcgQEAKIAlpZiAobGlzdF9lbXB0eSgmbWFwLT5kZWJ1Z2ZzX29mZl9jYWNoZSkpIHsKIAkJZm9yICg7IGkgPD0gbWFwLT5tYXhfcmVnaXN0ZXI7IGkgKz0gbWFwLT5yZWdfc3RyaWRlKSB7CiAJCQkvKiBTa2lwIHVucHJpbnRlZCByZWdpc3RlcnMsIGNsb3Npbmcgb2ZmIGNhY2hlIGVudHJ5ICovCi0JCQlpZiAoIXJlZ21hcF9yZWFkYWJsZShtYXAsIGkpIHx8Ci0JCQkgICAgcmVnbWFwX3ByZWNpb3VzKG1hcCwgaSkpIHsKKwkJCWlmICghcmVnbWFwX3ByaW50YWJsZShtYXAsIGkpKSB7CiAJCQkJaWYgKGMpIHsKIAkJCQkJYy0+bWF4ID0gcCAtIDE7CiAJCQkJCWMtPm1heF9yZWcgPSBpIC0gbWFwLT5yZWdfc3RyaWRlOwpAQCAtMjA0LDcgKzIxNCw3IEBACiAJc3RhcnRfcmVnID0gcmVnbWFwX2RlYnVnZnNfZ2V0X2R1bXBfc3RhcnQobWFwLCBmcm9tLCAqcHBvcywgJnApOwogCiAJZm9yIChpID0gc3RhcnRfcmVnOyBpIDw9IHRvOyBpICs9IG1hcC0+cmVnX3N0cmlkZSkgewotCQlpZiAoIXJlZ21hcF9yZWFkYWJsZShtYXAsIGkpKQorCQlpZiAoIXJlZ21hcF9yZWFkYWJsZShtYXAsIGkpICYmICFyZWdtYXBfY2FjaGVkKG1hcCwgaSkpCiAJCQljb250aW51ZTsKIAogCQlpZiAocmVnbWFwX3ByZWNpb3VzKG1hcCwgaSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAuYwppbmRleCA1MWZhN2Q2Li5hZTYzYmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLmMKQEAgLTkzLDYgKzkzLDI5IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgcmVnbWFwX2NhY2hlZChzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKG1hcC0+Y2FjaGUgPT0gUkVHQ0FDSEVfTk9ORSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCFtYXAtPmNhY2hlX29wcykKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKG1hcC0+bWF4X3JlZ2lzdGVyICYmIHJlZyA+IG1hcC0+bWF4X3JlZ2lzdGVyKQorCQlyZXR1cm4gZmFsc2U7CisKKwltYXAtPmxvY2sobWFwLT5sb2NrX2FyZyk7CisJcmV0ID0gcmVnY2FjaGVfcmVhZChtYXAsIHJlZywgJnZhbCk7CisJbWFwLT51bmxvY2sobWFwLT5sb2NrX2FyZyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgcmVnbWFwX3JlYWRhYmxlKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZykKIHsKIAlpZiAoIW1hcC0+cmVnX3JlYWQpCkBAIC03NDksNiArNzcyLDkgQEAKIAkJY2FzZSBSRUdNQVBfRU5ESUFOX0JJRzoKIAkJCW1hcC0+Zm9ybWF0LmZvcm1hdF9yZWcgPSByZWdtYXBfZm9ybWF0XzE2X2JlOwogCQkJYnJlYWs7CisJCWNhc2UgUkVHTUFQX0VORElBTl9MSVRUTEU6CisJCQltYXAtPmZvcm1hdC5mb3JtYXRfcmVnID0gcmVnbWFwX2Zvcm1hdF8xNl9sZTsKKwkJCWJyZWFrOwogCQljYXNlIFJFR01BUF9FTkRJQU5fTkFUSVZFOgogCQkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyA9IHJlZ21hcF9mb3JtYXRfMTZfbmF0aXZlOwogCQkJYnJlYWs7CkBAIC03NjgsNiArNzk0LDkgQEAKIAkJY2FzZSBSRUdNQVBfRU5ESUFOX0JJRzoKIAkJCW1hcC0+Zm9ybWF0LmZvcm1hdF9yZWcgPSByZWdtYXBfZm9ybWF0XzMyX2JlOwogCQkJYnJlYWs7CisJCWNhc2UgUkVHTUFQX0VORElBTl9MSVRUTEU6CisJCQltYXAtPmZvcm1hdC5mb3JtYXRfcmVnID0gcmVnbWFwX2Zvcm1hdF8zMl9sZTsKKwkJCWJyZWFrOwogCQljYXNlIFJFR01BUF9FTkRJQU5fTkFUSVZFOgogCQkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyA9IHJlZ21hcF9mb3JtYXRfMzJfbmF0aXZlOwogCQkJYnJlYWs7CkBAIC03ODIsNiArODExLDkgQEAKIAkJY2FzZSBSRUdNQVBfRU5ESUFOX0JJRzoKIAkJCW1hcC0+Zm9ybWF0LmZvcm1hdF9yZWcgPSByZWdtYXBfZm9ybWF0XzY0X2JlOwogCQkJYnJlYWs7CisJCWNhc2UgUkVHTUFQX0VORElBTl9MSVRUTEU6CisJCQltYXAtPmZvcm1hdC5mb3JtYXRfcmVnID0gcmVnbWFwX2Zvcm1hdF82NF9sZTsKKwkJCWJyZWFrOwogCQljYXNlIFJFR01BUF9FTkRJQU5fTkFUSVZFOgogCQkJbWFwLT5mb3JtYXQuZm9ybWF0X3JlZyA9IHJlZ21hcF9mb3JtYXRfNjRfbmF0aXZlOwogCQkJYnJlYWs7CkBAIC0xMjk2LDEyICsxMzI4LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHJlZ21hcF9zZXRfd29ya19idWZfZmxhZ19tYXNrKHN0cnVjdCByZWdtYXAgKm1hcCwgaW50IG1heF9ieXRlcywKKwkJCQkJICB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJdTggKmJ1ZjsKKwlpbnQgaTsKKworCWlmICghbWFzayB8fCAhbWFwLT53b3JrX2J1ZikKKwkJcmV0dXJuOworCisJYnVmID0gbWFwLT53b3JrX2J1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBtYXhfYnl0ZXM7IGkrKykKKwkJYnVmW2ldIHw9IChtYXNrID4+ICg4ICogaSkpICYgMHhmZjsKK30KKwogaW50IF9yZWdtYXBfcmF3X3dyaXRlKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKIAkJICAgICAgY29uc3Qgdm9pZCAqdmFsLCBzaXplX3QgdmFsX2xlbikKIHsKIAlzdHJ1Y3QgcmVnbWFwX3JhbmdlX25vZGUgKnJhbmdlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggKnU4ID0gbWFwLT53b3JrX2J1ZjsKIAl2b2lkICp3b3JrX3ZhbCA9IG1hcC0+d29ya19idWYgKyBtYXAtPmZvcm1hdC5yZWdfYnl0ZXMgKwogCQltYXAtPmZvcm1hdC5wYWRfYnl0ZXM7CiAJdm9pZCAqYnVmOwpAQCAtMTM3MCw4ICsxNDE2LDggQEAKIAl9CiAKIAltYXAtPmZvcm1hdC5mb3JtYXRfcmVnKG1hcC0+d29ya19idWYsIHJlZywgbWFwLT5yZWdfc2hpZnQpOwotCi0JdThbMF0gfD0gbWFwLT53cml0ZV9mbGFnX21hc2s7CisJcmVnbWFwX3NldF93b3JrX2J1Zl9mbGFnX21hc2sobWFwLCBtYXAtPmZvcm1hdC5yZWdfYnl0ZXMsCisJCQkJICAgICAgbWFwLT53cml0ZV9mbGFnX21hc2spOwogCiAJLyoKIAkgKiBFc3NlbnRpYWxseSBhbGwgSS9PIG1lY2hhbmlzbXMgd2lsbCBiZSBmYXN0ZXIgd2l0aCBhIHNpbmdsZQpAQCAtMTQ3NCw2ICsxNTIwLDEyIEBACiAJCXJldCA9IG1hcC0+YnVzLT53cml0ZShtYXAtPmJ1c19jb250ZXh0LCBidWYsIGxlbik7CiAKIAkJa2ZyZWUoYnVmKTsKKwl9IGVsc2UgaWYgKHJldCAhPSAwICYmICFtYXAtPmNhY2hlX2J5cGFzcyAmJiBtYXAtPmZvcm1hdC5wYXJzZV92YWwpIHsKKwkJLyogcmVnY2FjaGVfZHJvcF9yZWdpb24oKSB0YWtlcyBsb2NrIHRoYXQgd2UgYWxyZWFkeSBoYXZlLAorCQkgKiB0aHVzIGNhbGwgbWFwLT5jYWNoZV9vcHMtPmRyb3AoKSBkaXJlY3RseQorCQkgKi8KKwkJaWYgKG1hcC0+Y2FjaGVfb3BzICYmIG1hcC0+Y2FjaGVfb3BzLT5kcm9wKQorCQkJbWFwLT5jYWNoZV9vcHMtPmRyb3AobWFwLCByZWcsIHJlZyArIDEpOwogCX0KIAogCXRyYWNlX3JlZ21hcF9od193cml0ZV9kb25lKG1hcCwgcmVnLCB2YWxfbGVuIC8gbWFwLT5mb3JtYXQudmFsX2J5dGVzKTsKQEAgLTIyNDUsNyArMjI5Nyw2IEBACiAJCQkgICAgdW5zaWduZWQgaW50IHZhbF9sZW4pCiB7CiAJc3RydWN0IHJlZ21hcF9yYW5nZV9ub2RlICpyYW5nZTsKLQl1OCAqdTggPSBtYXAtPndvcmtfYnVmOwogCWludCByZXQ7CiAKIAlXQVJOX09OKCFtYXAtPmJ1cyk7CkBAIC0yMjYyLDE1ICsyMzEzLDggQEAKIAl9CiAKIAltYXAtPmZvcm1hdC5mb3JtYXRfcmVnKG1hcC0+d29ya19idWYsIHJlZywgbWFwLT5yZWdfc2hpZnQpOwotCi0JLyoKLQkgKiBTb21lIGJ1c2VzIG9yIGRldmljZXMgZmxhZyByZWFkcyBieSBzZXR0aW5nIHRoZSBoaWdoIGJpdHMgaW4gdGhlCi0JICogcmVnaXN0ZXIgYWRkcmVzczsgc2luY2UgaXQncyBhbHdheXMgdGhlIGhpZ2ggYml0cyBmb3IgYWxsCi0JICogY3VycmVudCBmb3JtYXRzIHdlIGNhbiBkbyB0aGlzIGhlcmUgcmF0aGVyIHRoYW4gaW4KLQkgKiBmb3JtYXR0aW5nLiAgVGhpcyBtYXkgYnJlYWsgaWYgd2UgZ2V0IGludGVyZXN0aW5nIGZvcm1hdHMuCi0JICovCi0JdThbMF0gfD0gbWFwLT5yZWFkX2ZsYWdfbWFzazsKLQorCXJlZ21hcF9zZXRfd29ya19idWZfZmxhZ19tYXNrKG1hcCwgbWFwLT5mb3JtYXQucmVnX2J5dGVzLAorCQkJCSAgICAgIG1hcC0+cmVhZF9mbGFnX21hc2spOwogCXRyYWNlX3JlZ21hcF9od19yZWFkX3N0YXJ0KG1hcCwgcmVnLCB2YWxfbGVuIC8gbWFwLT5mb3JtYXQudmFsX2J5dGVzKTsKIAogCXJldCA9IG1hcC0+YnVzLT5yZWFkKG1hcC0+YnVzX2NvbnRleHQsIG1hcC0+d29ya19idWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvc29jLmMgYi9kcml2ZXJzL2Jhc2Uvc29jLmMKaW5kZXggNzViOThhYS4uYjYzZjIzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3NvYy5jCisrKyBiL2RyaXZlcnMvYmFzZS9zb2MuYwpAQCAtNiw3ICs2LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTE2MCwxMSArMTU5LDMgQEAKIAlyZXR1cm4gYnVzX3JlZ2lzdGVyKCZzb2NfYnVzX3R5cGUpOwogfQogY29yZV9pbml0Y2FsbChzb2NfYnVzX3JlZ2lzdGVyKTsKLQotc3RhdGljIHZvaWQgX19leGl0IHNvY19idXNfdW5yZWdpc3Rlcih2b2lkKQotewotCWlkYV9kZXN0cm95KCZzb2NfaWRhKTsKLQotCWJ1c191bnJlZ2lzdGVyKCZzb2NfYnVzX3R5cGUpOwotfQotbW9kdWxlX2V4aXQoc29jX2J1c191bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9kcml2ZXJfY2hpcGNvbW1vbi5jIGIvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uLmMKaW5kZXggOTIxY2UxOC4uYjRmNjUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uLmMKKysrIGIvZHJpdmVycy9iY21hL2RyaXZlcl9jaGlwY29tbW9uLmMKQEAgLTM2LDEyICszNiwzMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYmNtYV9jaGlwY29fZ2V0X2FscF9jbG9jayk7CiAKK3N0YXRpYyBib29sIGJjbWFfY29yZV9jY19oYXNfcG11X3dhdGNoZG9nKHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpCit7CisJc3RydWN0IGJjbWFfYnVzICpidXMgPSBjYy0+Y29yZS0+YnVzOworCisJaWYgKGNjLT5jYXBhYmlsaXRpZXMgJiBCQ01BX0NDX0NBUF9QTVUpIHsKKwkJaWYgKGJ1cy0+Y2hpcGluZm8uaWQgPT0gQkNNQV9DSElQX0lEX0JDTTUzNTczKSB7CisJCQlXQVJOKGJ1cy0+Y2hpcGluZm8ucmV2IDw9IDEsICJObyB3YXRjaGRvZyBhdmFpbGFibGVcbiIpOworCQkJLyogNTM1NzNCMCBhbmQgNTM1NzNCMSBoYXZlIGJ1Z2dlZCBQTVUgd2F0Y2hkb2cuIEl0IGNhbgorCQkJICogYmUgZW5hYmxlZCBidXQgdGltZXIgY2FuJ3QgYmUgYnVtcGVkLiBVc2UgQ0Mgb25lCisJCQkgKiBpbnN0ZWFkLgorCQkJICovCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKwogc3RhdGljIHUzMiBiY21hX2NoaXBjb193YXRjaGRvZ19nZXRfbWF4X3RpbWVyKHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpCiB7CiAJc3RydWN0IGJjbWFfYnVzICpidXMgPSBjYy0+Y29yZS0+YnVzOwogCXUzMiBuYjsKIAotCWlmIChjYy0+Y2FwYWJpbGl0aWVzICYgQkNNQV9DQ19DQVBfUE1VKSB7CisJaWYgKGJjbWFfY29yZV9jY19oYXNfcG11X3dhdGNoZG9nKGNjKSkgewogCQlpZiAoYnVzLT5jaGlwaW5mby5pZCA9PSBCQ01BX0NISVBfSURfQkNNNDcwNikKIAkJCW5iID0gMzI7CiAJCWVsc2UgaWYgKGNjLT5jb3JlLT5pZC5yZXYgPCAyNikKQEAgLTk1LDkgKzExNCwxNiBAQAogCiBpbnQgYmNtYV9jaGlwY29fd2F0Y2hkb2dfcmVnaXN0ZXIoc3RydWN0IGJjbWFfZHJ2X2NjICpjYykKIHsKKwlzdHJ1Y3QgYmNtYV9idXMgKmJ1cyA9IGNjLT5jb3JlLT5idXM7CiAJc3RydWN0IGJjbTQ3eHhfd2R0IHdkdCA9IHt9OwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKKwlpZiAoYnVzLT5jaGlwaW5mby5pZCA9PSBCQ01BX0NISVBfSURfQkNNNTM1NzMgJiYKKwkgICAgYnVzLT5jaGlwaW5mby5yZXYgPD0gMSkgeworCQlwcl9kZWJ1ZygiTm8gd2F0Y2hkb2cgb24gNTM1NzNBMCAvIDUzNTczQTFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKIAl3ZHQuZHJpdmVyX2RhdGEgPSBjYzsKIAl3ZHQudGltZXJfc2V0ID0gYmNtYV9jaGlwY29fd2F0Y2hkb2dfdGltZXJfc2V0X3dkdDsKIAl3ZHQudGltZXJfc2V0X21zID0gYmNtYV9jaGlwY29fd2F0Y2hkb2dfdGltZXJfc2V0X21zX3dkdDsKQEAgLTEwNSw3ICsxMzEsNyBAQAogCQliY21hX2NoaXBjb193YXRjaGRvZ19nZXRfbWF4X3RpbWVyKGNjKSAvIGNjLT50aWNrc19wZXJfbXM7CiAKIAlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoTlVMTCwgImJjbTQ3eHgtd2R0IiwKLQkJCQkJICAgICBjYy0+Y29yZS0+YnVzLT5udW0sICZ3ZHQsCisJCQkJCSAgICAgYnVzLT5udW0sICZ3ZHQsCiAJCQkJCSAgICAgc2l6ZW9mKHdkdCkpOwogCWlmIChJU19FUlIocGRldikpCiAJCXJldHVybiBQVFJfRVJSKHBkZXYpOwpAQCAtMjE3LDcgKzI0Myw3IEBACiAJdTMyIG1heHQ7CiAKIAltYXh0ID0gYmNtYV9jaGlwY29fd2F0Y2hkb2dfZ2V0X21heF90aW1lcihjYyk7Ci0JaWYgKGNjLT5jYXBhYmlsaXRpZXMgJiBCQ01BX0NDX0NBUF9QTVUpIHsKKwlpZiAoYmNtYV9jb3JlX2NjX2hhc19wbXVfd2F0Y2hkb2coY2MpKSB7CiAJCWlmICh0aWNrcyA9PSAxKQogCQkJdGlja3MgPSAyOwogCQllbHNlIGlmICh0aWNrcyA+IG1heHQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvbWFpbi5jIGIvZHJpdmVycy9iY21hL21haW4uYwppbmRleCAxZjYzNTQ3Li4yYzE3OThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvbWFpbi5jCisrKyBiL2RyaXZlcnMvYmNtYS9tYWluLmMKQEAgLTIwOSw2ICsyMDksOCBAQAogCQljb3JlLT5kZXYub2Zfbm9kZSA9IG5vZGU7CiAKIAljb3JlLT5pcnEgPSBiY21hX29mX2dldF9pcnEocGFyZW50LCBjb3JlLCAwKTsKKworCW9mX2RtYV9jb25maWd1cmUoJmNvcmUtPmRldiwgbm9kZSk7CiB9CiAKIHVuc2lnbmVkIGludCBiY21hX2NvcmVfaXJxKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgaW50IG51bSkKQEAgLTI0OCwxMiArMjUwLDEyIEBACiAJCWNvcmUtPmlycSA9IGJ1cy0+aG9zdF9wY2ktPmlycTsKIAkJYnJlYWs7CiAJY2FzZSBCQ01BX0hPU1RUWVBFX1NPQzoKLQkJY29yZS0+ZGV2LmRtYV9tYXNrID0gJmNvcmUtPmRldi5jb2hlcmVudF9kbWFfbWFzazsKLQkJaWYgKGJ1cy0+aG9zdF9wZGV2KSB7CisJCWlmIChJU19FTkFCTEVEKENPTkZJR19PRikgJiYgYnVzLT5ob3N0X3BkZXYpIHsKIAkJCWNvcmUtPmRtYV9kZXYgPSAmYnVzLT5ob3N0X3BkZXYtPmRldjsKIAkJCWNvcmUtPmRldi5wYXJlbnQgPSAmYnVzLT5ob3N0X3BkZXYtPmRldjsKIAkJCWJjbWFfb2ZfZmlsbF9kZXZpY2UoYnVzLT5ob3N0X3BkZXYsIGNvcmUpOwogCQl9IGVsc2UgeworCQkJY29yZS0+ZGV2LmRtYV9tYXNrID0gJmNvcmUtPmRldi5jb2hlcmVudF9kbWFfbWFzazsKIAkJCWNvcmUtPmRtYV9kZXYgPSAmY29yZS0+ZGV2OwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5jIGIvZHJpdmVycy9ibG9jay9tdGlwMzJ4eC9tdGlwMzJ4eC5jCmluZGV4IDJhY2E5OGUuLjg4YzQ2ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbXRpcDMyeHgvbXRpcDMyeHguYworKysgYi9kcml2ZXJzL2Jsb2NrL210aXAzMnh4L210aXAzMnh4LmMKQEAgLTM2ODYsNyArMzY4Niw3IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLXZvaWQgbXRpcF9ibG9ja19yZWxlYXNlKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBmbW9kZV90IG1vZGUpCitzdGF0aWMgdm9pZCBtdGlwX2Jsb2NrX3JlbGVhc2Uoc3RydWN0IGdlbmRpc2sgKmRpc2ssIGZtb2RlX3QgbW9kZSkKIHsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9uYmQuYyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKaW5kZXggYTllMzk4MC4uY2NmY2ZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9uYmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCkBAIC0zNCwzMyArMzQsMjkgQEAKICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrLW1xLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCiAjaW5jbHVkZSA8bGludXgvbmJkLmg+CiAKKyNkZWZpbmUgTkJEX1RJTUVET1VUCQkJMAorI2RlZmluZSBOQkRfRElTQ09OTkVDVF9SRVFVRVNURUQJMQorCiBzdHJ1Y3QgbmJkX2RldmljZSB7CiAJdTMyIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgcnVudGltZV9mbGFnczsKIAlzdHJ1Y3Qgc29ja2V0ICogc29jazsJLyogSWYgPT0gTlVMTCwgZGV2aWNlIGlzIG5vdCByZWFkeSwgeWV0CSovCiAJaW50IG1hZ2ljOwogCi0Jc3BpbmxvY2tfdCBxdWV1ZV9sb2NrOwotCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVfaGVhZDsJLyogUmVxdWVzdHMgd2FpdGluZyByZXN1bHQgKi8KLQlzdHJ1Y3QgcmVxdWVzdCAqYWN0aXZlX3JlcTsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBhY3RpdmVfd3E7Ci0Jc3RydWN0IGxpc3RfaGVhZCB3YWl0aW5nX3F1ZXVlOwkvKiBSZXF1ZXN0cyB0byBiZSBzZW50ICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdGluZ193cTsKKwlzdHJ1Y3QgYmxrX21xX3RhZ19zZXQgdGFnX3NldDsKIAogCXN0cnVjdCBtdXRleCB0eF9sb2NrOwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOwogCWludCBibGtzaXplOwogCWxvZmZfdCBieXRlc2l6ZTsKLQlpbnQgeG1pdF90aW1lb3V0OwotCWJvb2wgdGltZWRvdXQ7Ci0JYm9vbCBkaXNjb25uZWN0OyAvKiBhIGRpc2Nvbm5lY3QgaGFzIGJlZW4gcmVxdWVzdGVkIGJ5IHVzZXIgKi8KIAotCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVvdXRfdGltZXI7CiAJLyogcHJvdGVjdHMgaW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duIG9mIHRoZSBzb2NrZXQgKi8KIAlzcGlubG9ja190IHNvY2tfbG9jazsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2tfcmVjdjsKQEAgLTcxLDYgKzY3LDExIEBACiAjZW5kaWYKIH07CiAKK3N0cnVjdCBuYmRfY21kIHsKKwlzdHJ1Y3QgbmJkX2RldmljZSAqbmJkOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKICNpZiBJU19FTkFCTEVEKENPTkZJR19ERUJVR19GUykKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuYmRfZGJnX2RpcjsKICNlbmRpZgpAQCAtODMsMTggKzg0LDYgQEAKIHN0YXRpYyBzdHJ1Y3QgbmJkX2RldmljZSAqbmJkX2RldjsKIHN0YXRpYyBpbnQgbWF4X3BhcnQ7CiAKLS8qCi0gKiBVc2UganVzdCBvbmUgbG9jayAob3IgYXQgbW9zdCAxIHBlciBOSUMpLiBUd28gYXJndW1lbnRzIGZvciB0aGlzOgotICogMS4gRWFjaCBOSUMgaXMgZXNzZW50aWFsbHkgYSBzeW5jaHJvbml6YXRpb24gcG9pbnQgZm9yIGFsbCBzZXJ2ZXJzCi0gKiAgICBhY2Nlc3NlZCB0aHJvdWdoIHRoYXQgTklDIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBoYXZlIG1vcmUgbG9ja3MKLSAqICAgIHRoYW4gTklDcyBhbnl3YXkuCi0gKiAyLiBNb3JlIGxvY2tzIGxlYWQgdG8gbW9yZSAiRGlydHkgY2FjaGUgbGluZSBib3VuY2luZyIgd2hpY2ggd2lsbCBzbG93Ci0gKiAgICBkb3duIGVhY2ggbG9jayB0byB0aGUgcG9pbnQgd2hlcmUgdGhleSdyZSBhY3R1YWxseSBzbG93ZXIgdGhhbiBqdXN0Ci0gKiAgICBhIHNpbmdsZSBsb2NrLgotICogVGhhbmtzIGdvIHRvIEplbnMgQXhib2UgYW5kIEFsIFZpcm8gZm9yIHRoZWlyIExLTUwgZW1haWxzIGV4cGxhaW5pbmcgdGhpcyEKLSAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhuYmRfbG9jayk7Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRldmljZSAqbmJkX3RvX2RldihzdHJ1Y3QgbmJkX2RldmljZSAqbmJkKQogewogCXJldHVybiBkaXNrX3RvX2RldihuYmQtPmRpc2spOwpAQCAtMTUzLDE4ICsxNDIsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbmJkX2VuZF9yZXF1ZXN0KHN0cnVjdCBuYmRfZGV2aWNlICpuYmQsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCitzdGF0aWMgdm9pZCBuYmRfZW5kX3JlcXVlc3Qoc3RydWN0IG5iZF9jbWQgKmNtZCkKIHsKKwlzdHJ1Y3QgbmJkX2RldmljZSAqbmJkID0gY21kLT5uYmQ7CisJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGJsa19tcV9ycV9mcm9tX3BkdShjbWQpOwogCWludCBlcnJvciA9IHJlcS0+ZXJyb3JzID8gLUVJTyA6IDA7Ci0Jc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSByZXEtPnE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRldl9kYmcobmJkX3RvX2RldihuYmQpLCAicmVxdWVzdCAlcDogJXNcbiIsIHJlcSwKKwlkZXZfZGJnKG5iZF90b19kZXYobmJkKSwgInJlcXVlc3QgJXA6ICVzXG4iLCBjbWQsCiAJCWVycm9yID8gImZhaWxlZCIgOiAiZG9uZSIpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwotCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIGVycm9yKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlibGtfbXFfY29tcGxldGVfcmVxdWVzdChyZXEsIGVycm9yKTsKIH0KIAogLyoKQEAgLTE3Miw0MCArMTU5LDQ5IEBACiAgKi8KIHN0YXRpYyB2b2lkIHNvY2tfc2h1dGRvd24oc3RydWN0IG5iZF9kZXZpY2UgKm5iZCkKIHsKLQlzcGluX2xvY2tfaXJxKCZuYmQtPnNvY2tfbG9jayk7CisJc3RydWN0IHNvY2tldCAqc29jazsKKworCXNwaW5fbG9jaygmbmJkLT5zb2NrX2xvY2spOwogCiAJaWYgKCFuYmQtPnNvY2spIHsKIAkJc3Bpbl91bmxvY2tfaXJxKCZuYmQtPnNvY2tfbG9jayk7CiAJCXJldHVybjsKIAl9CiAKKwlzb2NrID0gbmJkLT5zb2NrOwogCWRldl93YXJuKGRpc2tfdG9fZGV2KG5iZC0+ZGlzayksICJzaHV0dGluZyBkb3duIHNvY2tldFxuIik7Ci0Ja2VybmVsX3NvY2tfc2h1dGRvd24obmJkLT5zb2NrLCBTSFVUX1JEV1IpOwotCXNvY2tmZF9wdXQobmJkLT5zb2NrKTsKIAluYmQtPnNvY2sgPSBOVUxMOwotCXNwaW5fdW5sb2NrX2lycSgmbmJkLT5zb2NrX2xvY2spOworCXNwaW5fdW5sb2NrKCZuYmQtPnNvY2tfbG9jayk7CiAKLQlkZWxfdGltZXIoJm5iZC0+dGltZW91dF90aW1lcik7CisJa2VybmVsX3NvY2tfc2h1dGRvd24oc29jaywgU0hVVF9SRFdSKTsKKwlzb2NrZmRfcHV0KHNvY2spOwogfQogCi1zdGF0aWMgdm9pZCBuYmRfeG1pdF90aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGVudW0gYmxrX2VoX3RpbWVyX3JldHVybiBuYmRfeG1pdF90aW1lb3V0KHN0cnVjdCByZXF1ZXN0ICpyZXEsCisJCQkJCQkgYm9vbCByZXNlcnZlZCkKIHsKLQlzdHJ1Y3QgbmJkX2RldmljZSAqbmJkID0gKHN0cnVjdCBuYmRfZGV2aWNlICopYXJnOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5iZF9jbWQgKmNtZCA9IGJsa19tcV9ycV90b19wZHUocmVxKTsKKwlzdHJ1Y3QgbmJkX2RldmljZSAqbmJkID0gY21kLT5uYmQ7CisJc3RydWN0IHNvY2tldCAqc29jayA9IE5VTEw7CiAKLQlpZiAobGlzdF9lbXB0eSgmbmJkLT5xdWV1ZV9oZWFkKSkKLQkJcmV0dXJuOworCXNwaW5fbG9jaygmbmJkLT5zb2NrX2xvY2spOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm5iZC0+c29ja19sb2NrLCBmbGFncyk7CisJc2V0X2JpdChOQkRfVElNRURPVVQsICZuYmQtPnJ1bnRpbWVfZmxhZ3MpOwogCi0JbmJkLT50aW1lZG91dCA9IHRydWU7CisJaWYgKG5iZC0+c29jaykgeworCQlzb2NrID0gbmJkLT5zb2NrOworCQlnZXRfZmlsZShzb2NrLT5maWxlKTsKKwl9CiAKLQlpZiAobmJkLT5zb2NrKQotCQlrZXJuZWxfc29ja19zaHV0ZG93bihuYmQtPnNvY2ssIFNIVVRfUkRXUik7CisJc3Bpbl91bmxvY2soJm5iZC0+c29ja19sb2NrKTsKKwlpZiAoc29jaykgeworCQlrZXJuZWxfc29ja19zaHV0ZG93bihzb2NrLCBTSFVUX1JEV1IpOworCQlzb2NrZmRfcHV0KHNvY2spOworCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5iZC0+c29ja19sb2NrLCBmbGFncyk7Ci0KKwlyZXEtPmVycm9ycysrOwogCWRldl9lcnIobmJkX3RvX2RldihuYmQpLCAiQ29ubmVjdGlvbiB0aW1lZCBvdXQsIHNodXR0aW5nIGRvd24gY29ubmVjdGlvblxuIik7CisJcmV0dXJuIEJMS19FSF9IQU5ETEVEOwogfQogCiAvKgpAQCAtMjU1LDkgKzI1MSw2IEBACiAKIAl0c2tfcmVzdG9yZV9mbGFncyhjdXJyZW50LCBwZmxhZ3MsIFBGX01FTUFMTE9DKTsKIAotCWlmICghc2VuZCAmJiBuYmQtPnhtaXRfdGltZW91dCkKLQkJbW9kX3RpbWVyKCZuYmQtPnRpbWVvdXRfdGltZXIsIGppZmZpZXMgKyBuYmQtPnhtaXRfdGltZW91dCk7Ci0KIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yNzMsOCArMjY2LDkgQEAKIH0KIAogLyogYWx3YXlzIGNhbGwgd2l0aCB0aGUgdHhfbG9jayBoZWxkICovCi1zdGF0aWMgaW50IG5iZF9zZW5kX3JlcShzdHJ1Y3QgbmJkX2RldmljZSAqbmJkLCBzdHJ1Y3QgcmVxdWVzdCAqcmVxKQorc3RhdGljIGludCBuYmRfc2VuZF9jbWQoc3RydWN0IG5iZF9kZXZpY2UgKm5iZCwgc3RydWN0IG5iZF9jbWQgKmNtZCkKIHsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gYmxrX21xX3JxX2Zyb21fcGR1KGNtZCk7CiAJaW50IHJlc3VsdCwgZmxhZ3M7CiAJc3RydWN0IG5iZF9yZXF1ZXN0IHJlcXVlc3Q7CiAJdW5zaWduZWQgbG9uZyBzaXplID0gYmxrX3JxX2J5dGVzKHJlcSk7CkBAIC0yOTgsMTAgKzI5MiwxMCBAQAogCQlyZXF1ZXN0LmZyb20gPSBjcHVfdG9fYmU2NCgodTY0KWJsa19ycV9wb3MocmVxKSA8PCA5KTsKIAkJcmVxdWVzdC5sZW4gPSBodG9ubChzaXplKTsKIAl9Ci0JbWVtY3B5KHJlcXVlc3QuaGFuZGxlLCAmcmVxLCBzaXplb2YocmVxKSk7CisJbWVtY3B5KHJlcXVlc3QuaGFuZGxlLCAmcmVxLT50YWcsIHNpemVvZihyZXEtPnRhZykpOwogCiAJZGV2X2RiZyhuYmRfdG9fZGV2KG5iZCksICJyZXF1ZXN0ICVwOiBzZW5kaW5nIGNvbnRyb2wgKCVzQCVsbHUsJXVCKVxuIiwKLQkJcmVxLCBuYmRjbWRfdG9fYXNjaWkodHlwZSksCisJCWNtZCwgbmJkY21kX3RvX2FzY2lpKHR5cGUpLAogCQkodW5zaWduZWQgbG9uZyBsb25nKWJsa19ycV9wb3MocmVxKSA8PCA5LCBibGtfcnFfYnl0ZXMocmVxKSk7CiAJcmVzdWx0ID0gc29ja194bWl0KG5iZCwgMSwgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSwKIAkJCSh0eXBlID09IE5CRF9DTURfV1JJVEUpID8gTVNHX01PUkUgOiAwKTsKQEAgLTMyMyw3ICszMTcsNyBAQAogCQkJaWYgKCFycV9pdGVyX2xhc3QoYnZlYywgaXRlcikpCiAJCQkJZmxhZ3MgPSBNU0dfTU9SRTsKIAkJCWRldl9kYmcobmJkX3RvX2RldihuYmQpLCAicmVxdWVzdCAlcDogc2VuZGluZyAlZCBieXRlcyBkYXRhXG4iLAotCQkJCXJlcSwgYnZlYy5idl9sZW4pOworCQkJCWNtZCwgYnZlYy5idl9sZW4pOwogCQkJcmVzdWx0ID0gc29ja19zZW5kX2J2ZWMobmJkLCAmYnZlYywgZmxhZ3MpOwogCQkJaWYgKHJlc3VsdCA8PSAwKSB7CiAJCQkJZGV2X2VycihkaXNrX3RvX2RldihuYmQtPmRpc2spLApAQCAtMzM2LDI5ICszMzAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHJlcXVlc3QgKm5iZF9maW5kX3JlcXVlc3Qoc3RydWN0IG5iZF9kZXZpY2UgKm5iZCwKLQkJCQkJc3RydWN0IHJlcXVlc3QgKnhyZXEpCi17Ci0Jc3RydWN0IHJlcXVlc3QgKnJlcSwgKnRtcDsKLQlpbnQgZXJyOwotCi0JZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKG5iZC0+YWN0aXZlX3dxLCBuYmQtPmFjdGl2ZV9yZXEgIT0geHJlcSk7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCXJldHVybiBFUlJfUFRSKGVycik7Ci0KLQlzcGluX2xvY2soJm5iZC0+cXVldWVfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgdG1wLCAmbmJkLT5xdWV1ZV9oZWFkLCBxdWV1ZWxpc3QpIHsKLQkJaWYgKHJlcSAhPSB4cmVxKQotCQkJY29udGludWU7Ci0JCWxpc3RfZGVsX2luaXQoJnJlcS0+cXVldWVsaXN0KTsKLQkJc3Bpbl91bmxvY2soJm5iZC0+cXVldWVfbG9jayk7Ci0JCXJldHVybiByZXE7Ci0JfQotCXNwaW5fdW5sb2NrKCZuYmQtPnF1ZXVlX2xvY2spOwotCi0JcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHNvY2tfcmVjdl9idmVjKHN0cnVjdCBuYmRfZGV2aWNlICpuYmQsIHN0cnVjdCBiaW9fdmVjICpidmVjKQogewogCWludCByZXN1bHQ7CkBAIC0zNzAsMTEgKzM0MSwxNCBAQAogfQogCiAvKiBOVUxMIHJldHVybmVkID0gc29tZXRoaW5nIHdlbnQgd3JvbmcsIGluZm9ybSB1c2Vyc3BhY2UgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqbmJkX3JlYWRfc3RhdChzdHJ1Y3QgbmJkX2RldmljZSAqbmJkKQorc3RhdGljIHN0cnVjdCBuYmRfY21kICpuYmRfcmVhZF9zdGF0KHN0cnVjdCBuYmRfZGV2aWNlICpuYmQpCiB7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgbmJkX3JlcGx5IHJlcGx5OwotCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisJc3RydWN0IG5iZF9jbWQgKmNtZDsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gTlVMTDsKKwl1MTYgaHdxOworCWludCB0YWc7CiAKIAlyZXBseS5tYWdpYyA9IDA7CiAJcmVzdWx0ID0gc29ja194bWl0KG5iZCwgMCwgJnJlcGx5LCBzaXplb2YocmVwbHkpLCBNU0dfV0FJVEFMTCk7CkBAIC0zOTAsMjUgKzM2NCwyNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRVBST1RPKTsKIAl9CiAKLQlyZXEgPSBuYmRfZmluZF9yZXF1ZXN0KG5iZCwgKihzdHJ1Y3QgcmVxdWVzdCAqKilyZXBseS5oYW5kbGUpOwotCWlmIChJU19FUlIocmVxKSkgewotCQlyZXN1bHQgPSBQVFJfRVJSKHJlcSk7Ci0JCWlmIChyZXN1bHQgIT0gLUVOT0VOVCkKLQkJCXJldHVybiBFUlJfUFRSKHJlc3VsdCk7CisJbWVtY3B5KCZ0YWcsIHJlcGx5LmhhbmRsZSwgc2l6ZW9mKGludCkpOwogCi0JCWRldl9lcnIoZGlza190b19kZXYobmJkLT5kaXNrKSwgIlVuZXhwZWN0ZWQgcmVwbHkgKCVwKVxuIiwKLQkJCXJlcGx5LmhhbmRsZSk7Ci0JCXJldHVybiBFUlJfUFRSKC1FQkFEUik7CisJaHdxID0gYmxrX21xX3VuaXF1ZV90YWdfdG9faHdxKHRhZyk7CisJaWYgKGh3cSA8IG5iZC0+dGFnX3NldC5ucl9od19xdWV1ZXMpCisJCXJlcSA9IGJsa19tcV90YWdfdG9fcnEobmJkLT50YWdfc2V0LnRhZ3NbaHdxXSwKKwkJCQkgICAgICAgYmxrX21xX3VuaXF1ZV90YWdfdG9fdGFnKHRhZykpOworCWlmICghcmVxIHx8ICFibGtfbXFfcmVxdWVzdF9zdGFydGVkKHJlcSkpIHsKKwkJZGV2X2VycihkaXNrX3RvX2RldihuYmQtPmRpc2spLCAiVW5leHBlY3RlZCByZXBseSAoJWQpICVwXG4iLAorCQkJdGFnLCByZXEpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIAl9CisJY21kID0gYmxrX21xX3JxX3RvX3BkdShyZXEpOwogCiAJaWYgKG50b2hsKHJlcGx5LmVycm9yKSkgewogCQlkZXZfZXJyKGRpc2tfdG9fZGV2KG5iZC0+ZGlzayksICJPdGhlciBzaWRlIHJldHVybmVkIGVycm9yICglZClcbiIsCiAJCQludG9obChyZXBseS5lcnJvcikpOwogCQlyZXEtPmVycm9ycysrOwotCQlyZXR1cm4gcmVxOworCQlyZXR1cm4gY21kOwogCX0KIAotCWRldl9kYmcobmJkX3RvX2RldihuYmQpLCAicmVxdWVzdCAlcDogZ290IHJlcGx5XG4iLCByZXEpOworCWRldl9kYmcobmJkX3RvX2RldihuYmQpLCAicmVxdWVzdCAlcDogZ290IHJlcGx5XG4iLCBjbWQpOwogCWlmIChycV9kYXRhX2RpcihyZXEpICE9IFdSSVRFKSB7CiAJCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKIAkJc3RydWN0IGJpb192ZWMgYnZlYzsKQEAgLTQxOSwxMyArMzk1LDEzIEBACiAJCQkJZGV2X2VycihkaXNrX3RvX2RldihuYmQtPmRpc2spLCAiUmVjZWl2ZSBkYXRhIGZhaWxlZCAocmVzdWx0ICVkKVxuIiwKIAkJCQkJcmVzdWx0KTsKIAkJCQlyZXEtPmVycm9ycysrOwotCQkJCXJldHVybiByZXE7CisJCQkJcmV0dXJuIGNtZDsKIAkJCX0KIAkJCWRldl9kYmcobmJkX3RvX2RldihuYmQpLCAicmVxdWVzdCAlcDogZ290ICVkIGJ5dGVzIGRhdGFcbiIsCi0JCQkJcmVxLCBidmVjLmJ2X2xlbik7CisJCQkJY21kLCBidmVjLmJ2X2xlbik7CiAJCX0KIAl9Ci0JcmV0dXJuIHJlcTsKKwlyZXR1cm4gY21kOwogfQogCiBzdGF0aWMgc3NpemVfdCBwaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC00NDQsNyArNDIwLDcgQEAKIAogc3RhdGljIGludCBuYmRfdGhyZWFkX3JlY3Yoc3RydWN0IG5iZF9kZXZpY2UgKm5iZCwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKIHsKLQlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCXN0cnVjdCBuYmRfY21kICpjbWQ7CiAJaW50IHJldDsKIAogCUJVR19PTihuYmQtPm1hZ2ljICE9IE5CRF9NQUdJQyk7CkBAIC00NjAsMTMgKzQzNiwxMyBAQAogCW5iZF9zaXplX3VwZGF0ZShuYmQsIGJkZXYpOwogCiAJd2hpbGUgKDEpIHsKLQkJcmVxID0gbmJkX3JlYWRfc3RhdChuYmQpOwotCQlpZiAoSVNfRVJSKHJlcSkpIHsKLQkJCXJldCA9IFBUUl9FUlIocmVxKTsKKwkJY21kID0gbmJkX3JlYWRfc3RhdChuYmQpOworCQlpZiAoSVNfRVJSKGNtZCkpIHsKKwkJCXJldCA9IFBUUl9FUlIoY21kKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJbmJkX2VuZF9yZXF1ZXN0KG5iZCwgcmVxKTsKKwkJbmJkX2VuZF9yZXF1ZXN0KGNtZCk7CiAJfQogCiAJbmJkX3NpemVfY2xlYXIobmJkLCBiZGV2KTsKQEAgLTQ3NSw0NCArNDUxLDM3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgbmJkX2NsZWFyX3JlcShzdHJ1Y3QgcmVxdWVzdCAqcmVxLCB2b2lkICpkYXRhLCBib29sIHJlc2VydmVkKQoreworCXN0cnVjdCBuYmRfY21kICpjbWQ7CisKKwlpZiAoIWJsa19tcV9yZXF1ZXN0X3N0YXJ0ZWQocmVxKSkKKwkJcmV0dXJuOworCWNtZCA9IGJsa19tcV9ycV90b19wZHUocmVxKTsKKwlyZXEtPmVycm9ycysrOworCW5iZF9lbmRfcmVxdWVzdChjbWQpOworfQorCiBzdGF0aWMgdm9pZCBuYmRfY2xlYXJfcXVlKHN0cnVjdCBuYmRfZGV2aWNlICpuYmQpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJlcTsKLQogCUJVR19PTihuYmQtPm1hZ2ljICE9IE5CRF9NQUdJQyk7CiAKIAkvKgogCSAqIEJlY2F1c2Ugd2UgaGF2ZSBzZXQgbmJkLT5zb2NrIHRvIE5VTEwgdW5kZXIgdGhlIHR4X2xvY2ssIGFsbAotCSAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGxpc3QgbXVzdCBoYXZlIGNvbXBsZXRlZCBieSBub3cuICBGb3IKLQkgKiB0aGUgc2FtZSByZWFzb24sIHRoZSBhY3RpdmVfcmVxIG11c3QgYmUgTlVMTC4KLQkgKgotCSAqIEFzIGEgY29uc2VxdWVuY2UsIHdlIGRvbid0IG5lZWQgdG8gdGFrZSB0aGUgc3BpbiBsb2NrIHdoaWxlCi0JICogcHVyZ2luZyB0aGUgbGlzdCBoZXJlLgorCSAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGxpc3QgbXVzdCBoYXZlIGNvbXBsZXRlZCBieSBub3cuCiAJICovCiAJQlVHX09OKG5iZC0+c29jayk7Ci0JQlVHX09OKG5iZC0+YWN0aXZlX3JlcSk7CiAKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJm5iZC0+cXVldWVfaGVhZCkpIHsKLQkJcmVxID0gbGlzdF9lbnRyeShuYmQtPnF1ZXVlX2hlYWQubmV4dCwgc3RydWN0IHJlcXVlc3QsCi0JCQkJIHF1ZXVlbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnJlcS0+cXVldWVsaXN0KTsKLQkJcmVxLT5lcnJvcnMrKzsKLQkJbmJkX2VuZF9yZXF1ZXN0KG5iZCwgcmVxKTsKLQl9Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJm5iZC0+d2FpdGluZ19xdWV1ZSkpIHsKLQkJcmVxID0gbGlzdF9lbnRyeShuYmQtPndhaXRpbmdfcXVldWUubmV4dCwgc3RydWN0IHJlcXVlc3QsCi0JCQkJIHF1ZXVlbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnJlcS0+cXVldWVsaXN0KTsKLQkJcmVxLT5lcnJvcnMrKzsKLQkJbmJkX2VuZF9yZXF1ZXN0KG5iZCwgcmVxKTsKLQl9CisJYmxrX21xX3RhZ3NldF9idXN5X2l0ZXIoJm5iZC0+dGFnX3NldCwgbmJkX2NsZWFyX3JlcSwgTlVMTCk7CiAJZGV2X2RiZyhkaXNrX3RvX2RldihuYmQtPmRpc2spLCAicXVldWUgY2xlYXJlZFxuIik7CiB9CiAKIAotc3RhdGljIHZvaWQgbmJkX2hhbmRsZV9yZXEoc3RydWN0IG5iZF9kZXZpY2UgKm5iZCwgc3RydWN0IHJlcXVlc3QgKnJlcSkKK3N0YXRpYyB2b2lkIG5iZF9oYW5kbGVfY21kKHN0cnVjdCBuYmRfY21kICpjbWQpCiB7CisJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGJsa19tcV9ycV9mcm9tX3BkdShjbWQpOworCXN0cnVjdCBuYmRfZGV2aWNlICpuYmQgPSBjbWQtPm5iZDsKKwogCWlmIChyZXEtPmNtZF90eXBlICE9IFJFUV9UWVBFX0ZTKQogCQlnb3RvIGVycm9yX291dDsKIApAQCAtNTI2LDYgKzQ5NSw3IEBACiAJcmVxLT5lcnJvcnMgPSAwOwogCiAJbXV0ZXhfbG9jaygmbmJkLT50eF9sb2NrKTsKKwluYmQtPnRhc2tfc2VuZCA9IGN1cnJlbnQ7CiAJaWYgKHVubGlrZWx5KCFuYmQtPnNvY2spKSB7CiAJCW11dGV4X3VubG9jaygmbmJkLT50eF9sb2NrKTsKIAkJZGV2X2VycihkaXNrX3RvX2RldihuYmQtPmRpc2spLApAQCAtNTMzLDEwNiArNTAzLDMwIEBACiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KIAotCW5iZC0+YWN0aXZlX3JlcSA9IHJlcTsKLQotCWlmIChuYmQtPnhtaXRfdGltZW91dCAmJiBsaXN0X2VtcHR5X2NhcmVmdWwoJm5iZC0+cXVldWVfaGVhZCkpCi0JCW1vZF90aW1lcigmbmJkLT50aW1lb3V0X3RpbWVyLCBqaWZmaWVzICsgbmJkLT54bWl0X3RpbWVvdXQpOwotCi0JaWYgKG5iZF9zZW5kX3JlcShuYmQsIHJlcSkgIT0gMCkgeworCWlmIChuYmRfc2VuZF9jbWQobmJkLCBjbWQpICE9IDApIHsKIAkJZGV2X2VycihkaXNrX3RvX2RldihuYmQtPmRpc2spLCAiUmVxdWVzdCBzZW5kIGZhaWxlZFxuIik7CiAJCXJlcS0+ZXJyb3JzKys7Ci0JCW5iZF9lbmRfcmVxdWVzdChuYmQsIHJlcSk7Ci0JfSBlbHNlIHsKLQkJc3Bpbl9sb2NrKCZuYmQtPnF1ZXVlX2xvY2spOwotCQlsaXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlbGlzdCwgJm5iZC0+cXVldWVfaGVhZCk7Ci0JCXNwaW5fdW5sb2NrKCZuYmQtPnF1ZXVlX2xvY2spOworCQluYmRfZW5kX3JlcXVlc3QoY21kKTsKIAl9CiAKLQluYmQtPmFjdGl2ZV9yZXEgPSBOVUxMOworCW5iZC0+dGFza19zZW5kID0gTlVMTDsKIAltdXRleF91bmxvY2soJm5iZC0+dHhfbG9jayk7Ci0Jd2FrZV91cF9hbGwoJm5iZC0+YWN0aXZlX3dxKTsKIAogCXJldHVybjsKIAogZXJyb3Jfb3V0OgogCXJlcS0+ZXJyb3JzKys7Ci0JbmJkX2VuZF9yZXF1ZXN0KG5iZCwgcmVxKTsKKwluYmRfZW5kX3JlcXVlc3QoY21kKTsKIH0KIAotc3RhdGljIGludCBuYmRfdGhyZWFkX3NlbmQodm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgbmJkX3F1ZXVlX3JxKHN0cnVjdCBibGtfbXFfaHdfY3R4ICpoY3R4LAorCQkJY29uc3Qgc3RydWN0IGJsa19tcV9xdWV1ZV9kYXRhICpiZCkKIHsKLQlzdHJ1Y3QgbmJkX2RldmljZSAqbmJkID0gZGF0YTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCXN0cnVjdCBuYmRfY21kICpjbWQgPSBibGtfbXFfcnFfdG9fcGR1KGJkLT5ycSk7CiAKLQluYmQtPnRhc2tfc2VuZCA9IGN1cnJlbnQ7Ci0KLQlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIE1JTl9OSUNFKTsKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCAhbGlzdF9lbXB0eSgmbmJkLT53YWl0aW5nX3F1ZXVlKSkgewotCQkvKiB3YWl0IGZvciBzb21ldGhpbmcgdG8gZG8gKi8KLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKG5iZC0+d2FpdGluZ193cSwKLQkJCQkJIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fAotCQkJCQkgIWxpc3RfZW1wdHkoJm5iZC0+d2FpdGluZ19xdWV1ZSkpOwotCi0JCS8qIGV4dHJhY3QgcmVxdWVzdCAqLwotCQlpZiAobGlzdF9lbXB0eSgmbmJkLT53YWl0aW5nX3F1ZXVlKSkKLQkJCWNvbnRpbnVlOwotCi0JCXNwaW5fbG9ja19pcnEoJm5iZC0+cXVldWVfbG9jayk7Ci0JCXJlcSA9IGxpc3RfZW50cnkobmJkLT53YWl0aW5nX3F1ZXVlLm5leHQsIHN0cnVjdCByZXF1ZXN0LAotCQkJCSBxdWV1ZWxpc3QpOwotCQlsaXN0X2RlbF9pbml0KCZyZXEtPnF1ZXVlbGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbmJkLT5xdWV1ZV9sb2NrKTsKLQotCQkvKiBoYW5kbGUgcmVxdWVzdCAqLwotCQluYmRfaGFuZGxlX3JlcShuYmQsIHJlcSk7Ci0JfQotCi0JbmJkLT50YXNrX3NlbmQgPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXZSBhbHdheXMgd2FpdCBmb3IgcmVzdWx0IG9mIHdyaXRlLCBmb3Igbm93LiBJdCB3b3VsZCBiZSBuaWNlIHRvIG1ha2UgaXQgb3B0aW9uYWwKLSAqIGluIGZ1dHVyZQotICogaWYgKChycV9kYXRhX2RpcihyZXEpID09IFdSSVRFKSAmJiAobmJkLT5mbGFncyAmIE5CRF9XUklURV9OT0NISykpCi0gKiAgIHsgcHJpbnRrKCAiV2FybmluZzogSWdub3JpbmcgcmVzdWx0IVxuIik7IG5iZF9lbmRfcmVxdWVzdCggcmVxICk7IH0KLSAqLwotCi1zdGF0aWMgdm9pZCBuYmRfcmVxdWVzdF9oYW5kbGVyKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQotCQlfX3JlbGVhc2VzKHEtPnF1ZXVlX2xvY2spIF9fYWNxdWlyZXMocS0+cXVldWVfbG9jaykKLXsKLQlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwotCQotCXdoaWxlICgocmVxID0gYmxrX2ZldGNoX3JlcXVlc3QocSkpICE9IE5VTEwpIHsKLQkJc3RydWN0IG5iZF9kZXZpY2UgKm5iZDsKLQotCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0KLQkJbmJkID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7Ci0KLQkJQlVHX09OKG5iZC0+bWFnaWMgIT0gTkJEX01BR0lDKTsKLQotCQlkZXZfZGJnKG5iZF90b19kZXYobmJkKSwgInJlcXVlc3QgJXA6IGRlcXVldWVkIChmbGFncz0leClcbiIsCi0JCQlyZXEsIHJlcS0+Y21kX3R5cGUpOwotCi0JCWlmICh1bmxpa2VseSghbmJkLT5zb2NrKSkgewotCQkJZGV2X2Vycl9yYXRlbGltaXRlZChkaXNrX3RvX2RldihuYmQtPmRpc2spLAotCQkJCQkgICAgIkF0dGVtcHRlZCBzZW5kIG9uIGNsb3NlZCBzb2NrZXRcbiIpOwotCQkJcmVxLT5lcnJvcnMrKzsKLQkJCW5iZF9lbmRfcmVxdWVzdChuYmQsIHJlcSk7Ci0JCQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlzcGluX2xvY2tfaXJxKCZuYmQtPnF1ZXVlX2xvY2spOwotCQlsaXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlbGlzdCwgJm5iZC0+d2FpdGluZ19xdWV1ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmbmJkLT5xdWV1ZV9sb2NrKTsKLQotCQl3YWtlX3VwKCZuYmQtPndhaXRpbmdfd3EpOwotCi0JCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JfQorCWJsa19tcV9zdGFydF9yZXF1ZXN0KGJkLT5ycSk7CisJbmJkX2hhbmRsZV9jbWQoY21kKTsKKwlyZXR1cm4gQkxLX01RX1JRX1FVRVVFX09LOwogfQogCiBzdGF0aWMgaW50IG5iZF9zZXRfc29ja2V0KHN0cnVjdCBuYmRfZGV2aWNlICpuYmQsIHN0cnVjdCBzb2NrZXQgKnNvY2spCkBAIC02NTcsMTUgKzU1MSwxMyBAQAogLyogUmVzZXQgYWxsIHByb3BlcnRpZXMgb2YgYW4gTkJEIGRldmljZSAqLwogc3RhdGljIHZvaWQgbmJkX3Jlc2V0KHN0cnVjdCBuYmRfZGV2aWNlICpuYmQpCiB7Ci0JbmJkLT5kaXNjb25uZWN0ID0gZmFsc2U7Ci0JbmJkLT50aW1lZG91dCA9IGZhbHNlOworCW5iZC0+cnVudGltZV9mbGFncyA9IDA7CiAJbmJkLT5ibGtzaXplID0gMTAyNDsKIAluYmQtPmJ5dGVzaXplID0gMDsKIAlzZXRfY2FwYWNpdHkobmJkLT5kaXNrLCAwKTsKIAluYmQtPmZsYWdzID0gMDsKLQluYmQtPnhtaXRfdGltZW91dCA9IDA7CisJbmJkLT50YWdfc2V0LnRpbWVvdXQgPSAwOwogCXF1ZXVlX2ZsYWdfY2xlYXJfdW5sb2NrZWQoUVVFVUVfRkxBR19ESVNDQVJELCBuYmQtPmRpc2stPnF1ZXVlKTsKLQlkZWxfdGltZXJfc3luYygmbmJkLT50aW1lb3V0X3RpbWVyKTsKIH0KIAogc3RhdGljIHZvaWQgbmJkX2JkZXZfcmVzZXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKQEAgLTcwMCwzMyArNTkyLDM3IEBACiB7CiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE5CRF9ESVNDT05ORUNUOiB7Ci0JCXN0cnVjdCByZXF1ZXN0IHNyZXE7CisJCXN0cnVjdCByZXF1ZXN0ICpzcmVxOwogCiAJCWRldl9pbmZvKGRpc2tfdG9fZGV2KG5iZC0+ZGlzayksICJOQkRfRElTQ09OTkVDVFxuIik7CiAJCWlmICghbmJkLT5zb2NrKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKKwkJc3JlcSA9IGJsa19tcV9hbGxvY19yZXF1ZXN0KGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLCBXUklURSwgMCk7CisJCWlmICghc3JlcSkKKwkJCXJldHVybiAtRU5PTUVNOworCiAJCW11dGV4X3VubG9jaygmbmJkLT50eF9sb2NrKTsKIAkJZnN5bmNfYmRldihiZGV2KTsKIAkJbXV0ZXhfbG9jaygmbmJkLT50eF9sb2NrKTsKLQkJYmxrX3JxX2luaXQoTlVMTCwgJnNyZXEpOwotCQlzcmVxLmNtZF90eXBlID0gUkVRX1RZUEVfRFJWX1BSSVY7CisJCXNyZXEtPmNtZF90eXBlID0gUkVRX1RZUEVfRFJWX1BSSVY7CiAKIAkJLyogQ2hlY2sgYWdhaW4gYWZ0ZXIgZ2V0dGluZyBtdXRleCBiYWNrLiAgKi8KLQkJaWYgKCFuYmQtPnNvY2spCisJCWlmICghbmJkLT5zb2NrKSB7CisJCQlibGtfbXFfZnJlZV9yZXF1ZXN0KHNyZXEpOwogCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAotCQluYmQtPmRpc2Nvbm5lY3QgPSB0cnVlOworCQlzZXRfYml0KE5CRF9ESVNDT05ORUNUX1JFUVVFU1RFRCwgJm5iZC0+cnVudGltZV9mbGFncyk7CiAKLQkJbmJkX3NlbmRfcmVxKG5iZCwgJnNyZXEpOworCQluYmRfc2VuZF9jbWQobmJkLCBibGtfbXFfcnFfdG9fcGR1KHNyZXEpKTsKKwkJYmxrX21xX2ZyZWVfcmVxdWVzdChzcmVxKTsKIAkJcmV0dXJuIDA7CiAJfQogIAogCWNhc2UgTkJEX0NMRUFSX1NPQ0s6CiAJCXNvY2tfc2h1dGRvd24obmJkKTsKIAkJbmJkX2NsZWFyX3F1ZShuYmQpOwotCQlCVUdfT04oIWxpc3RfZW1wdHkoJm5iZC0+cXVldWVfaGVhZCkpOwotCQlCVUdfT04oIWxpc3RfZW1wdHkoJm5iZC0+d2FpdGluZ19xdWV1ZSkpOwogCQlraWxsX2JkZXYoYmRldik7CiAJCXJldHVybiAwOwogCkBAIC03NTgsMTMgKzY1NCw3IEBACiAJCXJldHVybiBuYmRfc2l6ZV9zZXQobmJkLCBiZGV2LCBuYmQtPmJsa3NpemUsIGFyZyk7CiAKIAljYXNlIE5CRF9TRVRfVElNRU9VVDoKLQkJbmJkLT54bWl0X3RpbWVvdXQgPSBhcmcgKiBIWjsKLQkJaWYgKGFyZykKLQkJCW1vZF90aW1lcigmbmJkLT50aW1lb3V0X3RpbWVyLAotCQkJCSAgamlmZmllcyArIG5iZC0+eG1pdF90aW1lb3V0KTsKLQkJZWxzZQotCQkJZGVsX3RpbWVyX3N5bmMoJm5iZC0+dGltZW91dF90aW1lcik7Ci0KKwkJbmJkLT50YWdfc2V0LnRpbWVvdXQgPSBhcmcgKiBIWjsKIAkJcmV0dXJuIDA7CiAKIAljYXNlIE5CRF9TRVRfRkxBR1M6CkBAIC03NzIsNyArNjYyLDYgQEAKIAkJcmV0dXJuIDA7CiAKIAljYXNlIE5CRF9ET19JVDogewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRocmVhZDsKIAkJaW50IGVycm9yOwogCiAJCWlmIChuYmQtPnRhc2tfcmVjdikKQEAgLTc4NiwxOCArNjc1LDkgQEAKIAogCQluYmRfcGFyc2VfZmxhZ3MobmJkLCBiZGV2KTsKIAotCQl0aHJlYWQgPSBrdGhyZWFkX3J1bihuYmRfdGhyZWFkX3NlbmQsIG5iZCwgIiVzIiwKLQkJCQkgICAgIG5iZF9uYW1lKG5iZCkpOwotCQlpZiAoSVNfRVJSKHRocmVhZCkpIHsKLQkJCW11dGV4X2xvY2soJm5iZC0+dHhfbG9jayk7Ci0JCQluYmQtPnRhc2tfcmVjdiA9IE5VTEw7Ci0JCQlyZXR1cm4gUFRSX0VSUih0aHJlYWQpOwotCQl9Ci0KIAkJbmJkX2Rldl9kYmdfaW5pdChuYmQpOwogCQllcnJvciA9IG5iZF90aHJlYWRfcmVjdihuYmQsIGJkZXYpOwogCQluYmRfZGV2X2RiZ19jbG9zZShuYmQpOwotCQlrdGhyZWFkX3N0b3AodGhyZWFkKTsKIAogCQltdXRleF9sb2NrKCZuYmQtPnR4X2xvY2spOwogCQluYmQtPnRhc2tfcmVjdiA9IE5VTEw7CkBAIC04MDcsOSArNjg3LDEwIEBACiAJCWtpbGxfYmRldihiZGV2KTsKIAkJbmJkX2JkZXZfcmVzZXQoYmRldik7CiAKLQkJaWYgKG5iZC0+ZGlzY29ubmVjdCkgLyogdXNlciByZXF1ZXN0ZWQsIGlnbm9yZSBzb2NrZXQgZXJyb3JzICovCisJCS8qIHVzZXIgcmVxdWVzdGVkLCBpZ25vcmUgc29ja2V0IGVycm9ycyAqLworCQlpZiAodGVzdF9iaXQoTkJEX0RJU0NPTk5FQ1RfUkVRVUVTVEVELCAmbmJkLT5ydW50aW1lX2ZsYWdzKSkKIAkJCWVycm9yID0gMDsKLQkJaWYgKG5iZC0+dGltZWRvdXQpCisJCWlmICh0ZXN0X2JpdChOQkRfVElNRURPVVQsICZuYmQtPnJ1bnRpbWVfZmxhZ3MpKQogCQkJZXJyb3IgPSAtRVRJTUVET1VUOwogCiAJCW5iZF9yZXNldChuYmQpOwpAQCAtODI1LDEwICs3MDYsMTAgQEAKIAkJcmV0dXJuIDA7CiAKIAljYXNlIE5CRF9QUklOVF9ERUJVRzoKLQkJZGV2X2luZm8oZGlza190b19kZXYobmJkLT5kaXNrKSwKLQkJCSJuZXh0ID0gJXAsIHByZXYgPSAlcCwgaGVhZCA9ICVwXG4iLAotCQkJbmJkLT5xdWV1ZV9oZWFkLm5leHQsIG5iZC0+cXVldWVfaGVhZC5wcmV2LAotCQkJJm5iZC0+cXVldWVfaGVhZCk7CisJCS8qCisJCSAqIEZvciBjb21wYXRpYmlsaXR5IG9ubHksIHdlIG5vIGxvbmdlciBrZWVwIGEgbGlzdCBvZgorCQkgKiBvdXRzdGFuZGluZyByZXF1ZXN0cy4KKwkJICovCiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLUVOT1RUWTsKQEAgLTkzNSw3ICs4MTYsNyBAQAogCiAJZGVidWdmc19jcmVhdGVfZmlsZSgidGFza3MiLCAwNDQ0LCBkaXIsIG5iZCwgJm5iZF9kYmdfdGFza3Nfb3BzKTsKIAlkZWJ1Z2ZzX2NyZWF0ZV91NjQoInNpemVfYnl0ZXMiLCAwNDQ0LCBkaXIsICZuYmQtPmJ5dGVzaXplKTsKLQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoInRpbWVvdXQiLCAwNDQ0LCBkaXIsICZuYmQtPnhtaXRfdGltZW91dCk7CisJZGVidWdmc19jcmVhdGVfdTMyKCJ0aW1lb3V0IiwgMDQ0NCwgZGlyLCAmbmJkLT50YWdfc2V0LnRpbWVvdXQpOwogCWRlYnVnZnNfY3JlYXRlX3UzMigiYmxvY2tzaXplIiwgMDQ0NCwgZGlyLCAmbmJkLT5ibGtzaXplKTsKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJmbGFncyIsIDA0NDQsIGRpciwgbmJkLCAmbmJkX2RiZ19mbGFnc19vcHMpOwogCkBAIC05ODcsNiArODY4LDI0IEBACiAKICNlbmRpZgogCitzdGF0aWMgaW50IG5iZF9pbml0X3JlcXVlc3Qodm9pZCAqZGF0YSwgc3RydWN0IHJlcXVlc3QgKnJxLAorCQkJICAgIHVuc2lnbmVkIGludCBoY3R4X2lkeCwgdW5zaWduZWQgaW50IHJlcXVlc3RfaWR4LAorCQkJICAgIHVuc2lnbmVkIGludCBudW1hX25vZGUpCit7CisJc3RydWN0IG5iZF9jbWQgKmNtZCA9IGJsa19tcV9ycV90b19wZHUocnEpOworCisJY21kLT5uYmQgPSBkYXRhOworCUlOSVRfTElTVF9IRUFEKCZjbWQtPmxpc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJsa19tcV9vcHMgbmJkX21xX29wcyA9IHsKKwkucXVldWVfcnEJPSBuYmRfcXVldWVfcnEsCisJLm1hcF9xdWV1ZQk9IGJsa19tcV9tYXBfcXVldWUsCisJLmluaXRfcmVxdWVzdAk9IG5iZF9pbml0X3JlcXVlc3QsCisJLnRpbWVvdXQJPSBuYmRfeG1pdF90aW1lb3V0LAorfTsKKwogLyoKICAqIEFuZCBoZXJlIHNob3VsZCBiZSBtb2R1bGVzIGFuZCBrZXJuZWwgaW50ZXJmYWNlIAogICogIChKdXN0IHNtaWxleSBjb25mdXNlcyBlbWFjcyA6LSkKQEAgLTEwMzUsMTYgKzkzNCwzNCBAQAogCQlpZiAoIWRpc2spCiAJCQlnb3RvIG91dDsKIAkJbmJkX2RldltpXS5kaXNrID0gZGlzazsKKworCQluYmRfZGV2W2ldLnRhZ19zZXQub3BzID0gJm5iZF9tcV9vcHM7CisJCW5iZF9kZXZbaV0udGFnX3NldC5ucl9od19xdWV1ZXMgPSAxOworCQluYmRfZGV2W2ldLnRhZ19zZXQucXVldWVfZGVwdGggPSAxMjg7CisJCW5iZF9kZXZbaV0udGFnX3NldC5udW1hX25vZGUgPSBOVU1BX05PX05PREU7CisJCW5iZF9kZXZbaV0udGFnX3NldC5jbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmJkX2NtZCk7CisJCW5iZF9kZXZbaV0udGFnX3NldC5mbGFncyA9IEJMS19NUV9GX1NIT1VMRF9NRVJHRSB8CisJCQlCTEtfTVFfRl9TR19NRVJHRSB8IEJMS19NUV9GX0JMT0NLSU5HOworCQluYmRfZGV2W2ldLnRhZ19zZXQuZHJpdmVyX2RhdGEgPSAmbmJkX2RldltpXTsKKworCQllcnIgPSBibGtfbXFfYWxsb2NfdGFnX3NldCgmbmJkX2RldltpXS50YWdfc2V0KTsKKwkJaWYgKGVycikgeworCQkJcHV0X2Rpc2soZGlzayk7CisJCQlnb3RvIG91dDsKKwkJfQorCiAJCS8qCiAJCSAqIFRoZSBuZXcgbGludXggMi41IGJsb2NrIGxheWVyIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzCiAJCSAqIGV2ZXJ5IGdlbmRpc2sgdG8gaGF2ZSBpdHMgdmVyeSBvd24gcmVxdWVzdF9xdWV1ZSBzdHJ1Y3QuCiAJCSAqIFRoZXNlIHN0cnVjdHMgYXJlIGJpZyBzbyB3ZSBkeW5hbWljYWxseSBhbGxvY2F0ZSB0aGVtLgogCQkgKi8KLQkJZGlzay0+cXVldWUgPSBibGtfaW5pdF9xdWV1ZShuYmRfcmVxdWVzdF9oYW5kbGVyLCAmbmJkX2xvY2spOworCQlkaXNrLT5xdWV1ZSA9IGJsa19tcV9pbml0X3F1ZXVlKCZuYmRfZGV2W2ldLnRhZ19zZXQpOwogCQlpZiAoIWRpc2stPnF1ZXVlKSB7CisJCQlibGtfbXFfZnJlZV90YWdfc2V0KCZuYmRfZGV2W2ldLnRhZ19zZXQpOwogCQkJcHV0X2Rpc2soZGlzayk7CiAJCQlnb3RvIG91dDsKIAkJfQorCiAJCS8qCiAJCSAqIFRlbGwgdGhlIGJsb2NrIGxheWVyIHRoYXQgd2UgYXJlIG5vdCBhIHJvdGF0aW9uYWwgZGV2aWNlCiAJCSAqLwpAQCAtMTA2OSwxNiArOTg2LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgbmJkc19tYXg7IGkrKykgewogCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IG5iZF9kZXZbaV0uZGlzazsKIAkJbmJkX2RldltpXS5tYWdpYyA9IE5CRF9NQUdJQzsKLQkJSU5JVF9MSVNUX0hFQUQoJm5iZF9kZXZbaV0ud2FpdGluZ19xdWV1ZSk7Ci0JCXNwaW5fbG9ja19pbml0KCZuYmRfZGV2W2ldLnF1ZXVlX2xvY2spOwogCQlzcGluX2xvY2tfaW5pdCgmbmJkX2RldltpXS5zb2NrX2xvY2spOwotCQlJTklUX0xJU1RfSEVBRCgmbmJkX2RldltpXS5xdWV1ZV9oZWFkKTsKIAkJbXV0ZXhfaW5pdCgmbmJkX2RldltpXS50eF9sb2NrKTsKLQkJaW5pdF90aW1lcigmbmJkX2RldltpXS50aW1lb3V0X3RpbWVyKTsKLQkJbmJkX2RldltpXS50aW1lb3V0X3RpbWVyLmZ1bmN0aW9uID0gbmJkX3htaXRfdGltZW91dDsKLQkJbmJkX2RldltpXS50aW1lb3V0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykmbmJkX2RldltpXTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmbmJkX2RldltpXS5hY3RpdmVfd3EpOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZuYmRfZGV2W2ldLndhaXRpbmdfd3EpOwogCQlkaXNrLT5tYWpvciA9IE5CRF9NQUpPUjsKIAkJZGlzay0+Zmlyc3RfbWlub3IgPSBpIDw8IHBhcnRfc2hpZnQ7CiAJCWRpc2stPmZvcHMgPSAmbmJkX2ZvcHM7CkBAIC0xMDkxLDYgKzEwMDAsNyBAQAogCXJldHVybiAwOwogb3V0OgogCXdoaWxlIChpLS0pIHsKKwkJYmxrX21xX2ZyZWVfdGFnX3NldCgmbmJkX2RldltpXS50YWdfc2V0KTsKIAkJYmxrX2NsZWFudXBfcXVldWUobmJkX2RldltpXS5kaXNrLT5xdWV1ZSk7CiAJCXB1dF9kaXNrKG5iZF9kZXZbaV0uZGlzayk7CiAJfQpAQCAtMTExMCw2ICsxMDIwLDcgQEAKIAkJaWYgKGRpc2spIHsKIAkJCWRlbF9nZW5kaXNrKGRpc2spOwogCQkJYmxrX2NsZWFudXBfcXVldWUoZGlzay0+cXVldWUpOworCQkJYmxrX21xX2ZyZWVfdGFnX3NldCgmbmJkX2RldltpXS50YWdfc2V0KTsKIAkJCXB1dF9kaXNrKGRpc2spOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9udWxsX2Jsay5jIGIvZHJpdmVycy9ibG9jay9udWxsX2Jsay5jCmluZGV4IDc1YTdmODguLjkxZTFkZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbnVsbF9ibGsuYworKysgYi9kcml2ZXJzL2Jsb2NrL251bGxfYmxrLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAl1bnNpZ25lZCBpbnQgaW5kZXg7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnE7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CisJc3RydWN0IG52bV9kZXYgKm5kZXY7CiAJc3RydWN0IGJsa19tcV90YWdfc2V0IHRhZ19zZXQ7CiAJc3RydWN0IGhydGltZXIgdGltZXI7CiAJdW5zaWduZWQgaW50IHF1ZXVlX2RlcHRoOwpAQCAtNDE0LDIzICs0MTUsNiBAQAogCWtmcmVlKG51bGxiLT5xdWV1ZXMpOwogfQogCi1zdGF0aWMgdm9pZCBudWxsX2RlbF9kZXYoc3RydWN0IG51bGxiICpudWxsYikKLXsKLQlsaXN0X2RlbF9pbml0KCZudWxsYi0+bGlzdCk7Ci0KLQlpZiAodXNlX2xpZ2h0bnZtKQotCQludm1fdW5yZWdpc3RlcihudWxsYi0+ZGlza19uYW1lKTsKLQllbHNlCi0JCWRlbF9nZW5kaXNrKG51bGxiLT5kaXNrKTsKLQlibGtfY2xlYW51cF9xdWV1ZShudWxsYi0+cSk7Ci0JaWYgKHF1ZXVlX21vZGUgPT0gTlVMTF9RX01RKQotCQlibGtfbXFfZnJlZV90YWdfc2V0KCZudWxsYi0+dGFnX3NldCk7Ci0JaWYgKCF1c2VfbGlnaHRudm0pCi0JCXB1dF9kaXNrKG51bGxiLT5kaXNrKTsKLQljbGVhbnVwX3F1ZXVlcyhudWxsYik7Ci0Ja2ZyZWUobnVsbGIpOwotfQotCiAjaWZkZWYgQ09ORklHX05WTQogCiBzdGF0aWMgdm9pZCBudWxsX2xudm1fZW5kX2lvKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yKQpAQCAtNTY0LDEwICs1NDgsNTggQEAKIAkvKiBTaW11bGF0ZSBudm1lIHByb3RvY29sIHJlc3RyaWN0aW9uICovCiAJLm1heF9waHlzX3NlY3QJCT0gNjQsCiB9OworCitzdGF0aWMgaW50IG51bGxfbnZtX3JlZ2lzdGVyKHN0cnVjdCBudWxsYiAqbnVsbGIpCit7CisJc3RydWN0IG52bV9kZXYgKmRldjsKKwlpbnQgcnY7CisKKwlkZXYgPSBudm1fYWxsb2NfZGV2KDApOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldi0+cSA9IG51bGxiLT5xOworCW1lbWNweShkZXYtPm5hbWUsIG51bGxiLT5kaXNrX25hbWUsIERJU0tfTkFNRV9MRU4pOworCWRldi0+b3BzID0gJm51bGxfbG52bV9kZXZfb3BzOworCisJcnYgPSBudm1fcmVnaXN0ZXIoZGV2KTsKKwlpZiAocnYpIHsKKwkJa2ZyZWUoZGV2KTsKKwkJcmV0dXJuIHJ2OworCX0KKwludWxsYi0+bmRldiA9IGRldjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnVsbF9udm1fdW5yZWdpc3RlcihzdHJ1Y3QgbnVsbGIgKm51bGxiKQoreworCW52bV91bnJlZ2lzdGVyKG51bGxiLT5uZGV2KTsKK30KICNlbHNlCi1zdGF0aWMgc3RydWN0IG52bV9kZXZfb3BzIG51bGxfbG52bV9kZXZfb3BzOworc3RhdGljIGludCBudWxsX252bV9yZWdpc3RlcihzdHJ1Y3QgbnVsbGIgKm51bGxiKQoreworCXJldHVybiAtRUlOVkFMOworfQorc3RhdGljIHZvaWQgbnVsbF9udm1fdW5yZWdpc3RlcihzdHJ1Y3QgbnVsbGIgKm51bGxiKSB7fQogI2VuZGlmIC8qIENPTkZJR19OVk0gKi8KIAorc3RhdGljIHZvaWQgbnVsbF9kZWxfZGV2KHN0cnVjdCBudWxsYiAqbnVsbGIpCit7CisJbGlzdF9kZWxfaW5pdCgmbnVsbGItPmxpc3QpOworCisJaWYgKHVzZV9saWdodG52bSkKKwkJbnVsbF9udm1fdW5yZWdpc3RlcihudWxsYik7CisJZWxzZQorCQlkZWxfZ2VuZGlzayhudWxsYi0+ZGlzayk7CisJYmxrX2NsZWFudXBfcXVldWUobnVsbGItPnEpOworCWlmIChxdWV1ZV9tb2RlID09IE5VTExfUV9NUSkKKwkJYmxrX21xX2ZyZWVfdGFnX3NldCgmbnVsbGItPnRhZ19zZXQpOworCWlmICghdXNlX2xpZ2h0bnZtKQorCQlwdXRfZGlzayhudWxsYi0+ZGlzayk7CisJY2xlYW51cF9xdWV1ZXMobnVsbGIpOworCWtmcmVlKG51bGxiKTsKK30KKwogc3RhdGljIGludCBudWxsX29wZW4oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlKQogewogCXJldHVybiAwOwpAQCAtNjQwLDExICs2NzIsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBudWxsX2FkZF9kZXYodm9pZCkKK3N0YXRpYyBpbnQgbnVsbF9nZW5kaXNrX3JlZ2lzdGVyKHN0cnVjdCBudWxsYiAqbnVsbGIpCiB7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7Ci0Jc3RydWN0IG51bGxiICpudWxsYjsKIAlzZWN0b3JfdCBzaXplOworCisJZGlzayA9IG51bGxiLT5kaXNrID0gYWxsb2NfZGlza19ub2RlKDEsIGhvbWVfbm9kZSk7CisJaWYgKCFkaXNrKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzaXplID0gZ2IgKiAxMDI0ICogMTAyNCAqIDEwMjRVTEw7CisJc2V0X2NhcGFjaXR5KGRpc2ssIHNpemUgPj4gOSk7CisKKwlkaXNrLT5mbGFncyB8PSBHRU5IRF9GTF9FWFRfREVWVCB8IEdFTkhEX0ZMX1NVUFBSRVNTX1BBUlRJVElPTl9JTkZPOworCWRpc2stPm1ham9yCQk9IG51bGxfbWFqb3I7CisJZGlzay0+Zmlyc3RfbWlub3IJPSBudWxsYi0+aW5kZXg7CisJZGlzay0+Zm9wcwkJPSAmbnVsbF9mb3BzOworCWRpc2stPnByaXZhdGVfZGF0YQk9IG51bGxiOworCWRpc2stPnF1ZXVlCQk9IG51bGxiLT5xOworCXN0cm5jcHkoZGlzay0+ZGlza19uYW1lLCBudWxsYi0+ZGlza19uYW1lLCBESVNLX05BTUVfTEVOKTsKKworCWFkZF9kaXNrKGRpc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG51bGxfYWRkX2Rldih2b2lkKQoreworCXN0cnVjdCBudWxsYiAqbnVsbGI7CiAJaW50IHJ2OwogCiAJbnVsbGIgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpudWxsYiksIEdGUF9LRVJORUwsIGhvbWVfbm9kZSk7CkBAIC03MTYsNDIgKzc2OSwxOSBAQAogCiAJc3ByaW50ZihudWxsYi0+ZGlza19uYW1lLCAibnVsbGIlZCIsIG51bGxiLT5pbmRleCk7CiAKLQlpZiAodXNlX2xpZ2h0bnZtKSB7Ci0JCXJ2ID0gbnZtX3JlZ2lzdGVyKG51bGxiLT5xLCBudWxsYi0+ZGlza19uYW1lLAotCQkJCQkJCSZudWxsX2xudm1fZGV2X29wcyk7Ci0JCWlmIChydikKLQkJCWdvdG8gb3V0X2NsZWFudXBfYmxrX3F1ZXVlOwotCQlnb3RvIGRvbmU7Ci0JfQorCWlmICh1c2VfbGlnaHRudm0pCisJCXJ2ID0gbnVsbF9udm1fcmVnaXN0ZXIobnVsbGIpOworCWVsc2UKKwkJcnYgPSBudWxsX2dlbmRpc2tfcmVnaXN0ZXIobnVsbGIpOwogCi0JZGlzayA9IG51bGxiLT5kaXNrID0gYWxsb2NfZGlza19ub2RlKDEsIGhvbWVfbm9kZSk7Ci0JaWYgKCFkaXNrKSB7Ci0JCXJ2ID0gLUVOT01FTTsKLQkJZ290byBvdXRfY2xlYW51cF9saWdodG52bTsKLQl9Ci0Jc2l6ZSA9IGdiICogMTAyNCAqIDEwMjQgKiAxMDI0VUxMOwotCXNldF9jYXBhY2l0eShkaXNrLCBzaXplID4+IDkpOworCWlmIChydikKKwkJZ290byBvdXRfY2xlYW51cF9ibGtfcXVldWU7CiAKLQlkaXNrLT5mbGFncyB8PSBHRU5IRF9GTF9FWFRfREVWVCB8IEdFTkhEX0ZMX1NVUFBSRVNTX1BBUlRJVElPTl9JTkZPOwotCWRpc2stPm1ham9yCQk9IG51bGxfbWFqb3I7Ci0JZGlzay0+Zmlyc3RfbWlub3IJPSBudWxsYi0+aW5kZXg7Ci0JZGlzay0+Zm9wcwkJPSAmbnVsbF9mb3BzOwotCWRpc2stPnByaXZhdGVfZGF0YQk9IG51bGxiOwotCWRpc2stPnF1ZXVlCQk9IG51bGxiLT5xOwotCXN0cm5jcHkoZGlzay0+ZGlza19uYW1lLCBudWxsYi0+ZGlza19uYW1lLCBESVNLX05BTUVfTEVOKTsKLQotCWFkZF9kaXNrKGRpc2spOwotCi1kb25lOgogCW11dGV4X2xvY2soJmxvY2spOwogCWxpc3RfYWRkX3RhaWwoJm51bGxiLT5saXN0LCAmbnVsbGJfbGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKIAogCXJldHVybiAwOwotCi1vdXRfY2xlYW51cF9saWdodG52bToKLQlpZiAodXNlX2xpZ2h0bnZtKQotCQludm1fdW5yZWdpc3RlcihudWxsYi0+ZGlza19uYW1lKTsKIG91dF9jbGVhbnVwX2Jsa19xdWV1ZToKIAlibGtfY2xlYW51cF9xdWV1ZShudWxsYi0+cSk7CiBvdXRfY2xlYW51cF90YWdzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvS2NvbmZpZyBiL2RyaXZlcnMvYmx1ZXRvb3RoL0tjb25maWcKaW5kZXggY2Y1MGZkMi4uM2NjOWJmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvS2NvbmZpZworKysgYi9kcml2ZXJzL2JsdWV0b290aC9LY29uZmlnCkBAIC0xODAsNiArMTgwLDE3IEBACiAKIAkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBzdXBwb3J0IGZvciBJbnRlbCBBRzZYWCBwcm90b2NvbC4KIAorY29uZmlnIEJUX0hDSVVBUlRfTVJWTAorCWJvb2wgIk1hcnZlbGwgcHJvdG9jb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJUX0hDSVVBUlQKKwlzZWxlY3QgQlRfSENJVUFSVF9INAorCWhlbHAKKwkgIE1hcnZlbGwgaXMgc2VyaWFsIHByb3RvY29sIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gQmx1ZXRvb3RoCisJICBkZXZpY2UgYW5kIGhvc3QuIFRoaXMgcHJvdG9jb2wgaXMgcmVxdWlyZWQgZm9yIG1vc3QgTWFydmVsbCBCbHVldG9vdGgKKwkgIGRldmljZXMgd2l0aCBVQVJUIGludGVyZmFjZS4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIHN1cHBvcnQgZm9yIEhDSSBNUlZMIHByb3RvY29sLgorCiBjb25maWcgQlRfSENJQkNNMjAzWAogCXRyaXN0YXRlICJIQ0kgQkNNMjAzeCBVU0IgZHJpdmVyIgogCWRlcGVuZHMgb24gVVNCCkBAIC0zMzEsNCArMzQyLDE2IEBACiAJICBTYXkgWSBoZXJlIHRvIGNvbXBpbGUgc3VwcG9ydCBmb3IgVGV4YXMgSW5zdHJ1bWVudCdzIFdpTGluazcgZHJpdmVyCiAJICBpbnRvIHRoZSBrZXJuZWwgb3Igc2F5IE0gdG8gY29tcGlsZSBpdCBhcyBtb2R1bGUgKGJ0d2lsaW5rKS4KIAorY29uZmlnIEJUX1FDT01TTUQKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gU01EIGJhc2VkIEhDSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUUNPTV9TTUQgJiYgUUNPTV9XQ05TU19DVFJMCisJc2VsZWN0IEJUX1FDQQorCWhlbHAKKwkgIFF1YWxjb21tIFNNRCBiYXNlZCBIQ0kgZHJpdmVyLgorCSAgVGhpcyBkcml2ZXIgaXMgdXNlZCB0byBicmlkZ2UgSENJIGRhdGEgb250byB0aGUgc2hhcmVkIG1lbW9yeQorCSAgY2hhbm5lbHMgdG8gdGhlIFdDTlNTIGNvcmUuCisKKwkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBzdXBwb3J0IGZvciBIQ0kgb3ZlciBRdWFsY29tbSBTTUQgaW50byB0aGUKKwkgIGtlcm5lbCBvciBzYXkgTSB0byBjb21waWxlIGFzIGEgbW9kdWxlLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9NYWtlZmlsZSBiL2RyaXZlcnMvYmx1ZXRvb3RoL01ha2VmaWxlCmluZGV4IDljMTg5MzkuLmIxZmMyOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL01ha2VmaWxlCkBAIC0yMCw2ICsyMCw3IEBACiBvYmotJChDT05GSUdfQlRfTVJWTCkJCSs9IGJ0bXJ2bC5vCiBvYmotJChDT05GSUdfQlRfTVJWTF9TRElPKQkrPSBidG1ydmxfc2Rpby5vCiBvYmotJChDT05GSUdfQlRfV0lMSU5LKQkJKz0gYnR3aWxpbmsubworb2JqLSQoQ09ORklHX0JUX1FDT01TTUQpCSs9IGJ0cWNvbXNtZC5vCiBvYmotJChDT05GSUdfQlRfQkNNKQkJKz0gYnRiY20ubwogb2JqLSQoQ09ORklHX0JUX1JUTCkJCSs9IGJ0cnRsLm8KIG9iai0kKENPTkZJR19CVF9RQ0EpCQkrPSBidHFjYS5vCkBAIC0zNyw2ICszOCw3IEBACiBoY2lfdWFydC0kKENPTkZJR19CVF9IQ0lVQVJUX0JDTSkJKz0gaGNpX2JjbS5vCiBoY2lfdWFydC0kKENPTkZJR19CVF9IQ0lVQVJUX1FDQSkJKz0gaGNpX3FjYS5vCiBoY2lfdWFydC0kKENPTkZJR19CVF9IQ0lVQVJUX0FHNlhYKQkrPSBoY2lfYWc2eHgubworaGNpX3VhcnQtJChDT05GSUdfQlRfSENJVUFSVF9NUlZMKQkrPSBoY2lfbXJ2bC5vCiBoY2lfdWFydC1vYmpzCQkJCTo9ICQoaGNpX3VhcnQteSkKIAogY2NmbGFncy15ICs9IC1EX19DSEVDS19FTkRJQU5fXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYmNtMjAzeC5jIGIvZHJpdmVycy9ibHVldG9vdGgvYmNtMjAzeC5jCmluZGV4IDViMGVmN2IuLjVjZTZkNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2JjbTIwM3guYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9iY20yMDN4LmMKQEAgLTE4NSwxMCArMTg1LDggQEAKIAlkYXRhLT5zdGF0ZSA9IEJDTTIwM1hfTE9BRF9NSU5JRFJWOwogCiAJZGF0YS0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEtPnVyYikgewotCQlCVF9FUlIoIkNhbid0IGFsbG9jYXRlIFVSQiIpOworCWlmICghZGF0YS0+dXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlpZiAocmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsICJCQ00yMDMzLU1ELmhleCIsICZ1ZGV2LT5kZXYpIDwgMCkgewogCQlCVF9FUlIoIk1pbmkgZHJpdmVyIHJlcXVlc3QgZmFpbGVkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idHFjYS5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnRxY2EuYwppbmRleCA0YTYyMDgxLi4yOGFmZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idHFjYS5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0cWNhLmMKQEAgLTU1LDggKzU1LDggQEAKIAl9CiAKIAllZGwgPSAoc3RydWN0IGVkbF9ldmVudF9oZHIgKikoc2tiLT5kYXRhKTsKLQlpZiAoIWVkbCB8fCAhZWRsLT5kYXRhKSB7Ci0JCUJUX0VSUigiJXM6IFRMViB3aXRoIG5vIGhlYWRlciBvciBubyBkYXRhIiwgaGRldi0+bmFtZSk7CisJaWYgKCFlZGwpIHsKKwkJQlRfRVJSKCIlczogVExWIHdpdGggbm8gaGVhZGVyIiwgaGRldi0+bmFtZSk7CiAJCWVyciA9IC1FSUxTRVE7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIyNCw4ICsyMjQsOCBAQAogCX0KIAogCWVkbCA9IChzdHJ1Y3QgZWRsX2V2ZW50X2hkciAqKShza2ItPmRhdGEpOwotCWlmICghZWRsIHx8ICFlZGwtPmRhdGEpIHsKLQkJQlRfRVJSKCIlczogVExWIHdpdGggbm8gaGVhZGVyIG9yIG5vIGRhdGEiLCBoZGV2LT5uYW1lKTsKKwlpZiAoIWVkbCkgeworCQlCVF9FUlIoIiVzOiBUTFYgd2l0aCBubyBoZWFkZXIiLCBoZGV2LT5uYW1lKTsKIAkJZXJyID0gLUVJTFNFUTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRxY29tc21kLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHFjb21zbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGMyYzkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRxY29tc21kLmMKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIExpbmFybyBMdGQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNvbnkgTW9iaWxlIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc29jL3Fjb20vc21kLmg+CisjaW5jbHVkZSA8bGludXgvc29jL3Fjb20vd2Nuc3NfY3RybC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisKKyNpbmNsdWRlICJidHFjYS5oIgorCitzdHJ1Y3QgYnRxY29tc21kIHsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKworCXN0cnVjdCBxY29tX3NtZF9jaGFubmVsICphY2xfY2hhbm5lbDsKKwlzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY21kX2NoYW5uZWw7Cit9OworCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9yZWN2KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogVXNlIEdGUF9BVE9NSUMgYXMgd2UncmUgaW4gSVJRIGNvbnRleHQgKi8KKwlza2IgPSBidF9za2JfYWxsb2MoY291bnQsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKSB7CisJCWhkZXYtPnN0YXQuZXJyX3J4Kys7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWhjaV9za2JfcGt0X3R5cGUoc2tiKSA9IHR5cGU7CisJbWVtY3B5KHNrYl9wdXQoc2tiLCBjb3VudCksIGRhdGEsIGNvdW50KTsKKworCXJldHVybiBoY2lfcmVjdl9mcmFtZShoZGV2LCBza2IpOworfQorCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9hY2xfY2FsbGJhY2soc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGJ0cWNvbXNtZCAqYnRxID0gcWNvbV9zbWRfZ2V0X2RydmRhdGEoY2hhbm5lbCk7CisKKwlidHEtPmhkZXYtPnN0YXQuYnl0ZV9yeCArPSBjb3VudDsKKwlyZXR1cm4gYnRxY29tc21kX3JlY3YoYnRxLT5oZGV2LCBIQ0lfQUNMREFUQV9QS1QsIGRhdGEsIGNvdW50KTsKK30KKworc3RhdGljIGludCBidHFjb21zbWRfY21kX2NhbGxiYWNrKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsLAorCQkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBidHFjb21zbWQgKmJ0cSA9IHFjb21fc21kX2dldF9kcnZkYXRhKGNoYW5uZWwpOworCisJcmV0dXJuIGJ0cWNvbXNtZF9yZWN2KGJ0cS0+aGRldiwgSENJX0VWRU5UX1BLVCwgZGF0YSwgY291bnQpOworfQorCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9zZW5kKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBidHFjb21zbWQgKmJ0cSA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChoY2lfc2tiX3BrdF90eXBlKHNrYikpIHsKKwljYXNlIEhDSV9BQ0xEQVRBX1BLVDoKKwkJcmV0ID0gcWNvbV9zbWRfc2VuZChidHEtPmFjbF9jaGFubmVsLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJaGRldi0+c3RhdC5hY2xfdHgrKzsKKwkJaGRldi0+c3RhdC5ieXRlX3R4ICs9IHNrYi0+bGVuOworCQlicmVhazsKKwljYXNlIEhDSV9DT01NQU5EX1BLVDoKKwkJcmV0ID0gcWNvbV9zbWRfc2VuZChidHEtPmNtZF9jaGFubmVsLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwkJaGRldi0+c3RhdC5jbWRfdHgrKzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTFNFUTsKKwkJYnJlYWs7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9vcGVuKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9jbG9zZShzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidHFjb21zbWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYnRxY29tc21kICpidHE7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJdm9pZCAqd2Nuc3M7CisJaW50IHJldDsKKworCWJ0cSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmJ0cSksIEdGUF9LRVJORUwpOworCWlmICghYnRxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdjbnNzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCisJYnRxLT5hY2xfY2hhbm5lbCA9IHFjb21fd2Nuc3Nfb3Blbl9jaGFubmVsKHdjbnNzLCAiQVBQU19SSVZBX0JUX0FDTCIsCisJCQkJCQkgICBidHFjb21zbWRfYWNsX2NhbGxiYWNrKTsKKwlpZiAoSVNfRVJSKGJ0cS0+YWNsX2NoYW5uZWwpKQorCQlyZXR1cm4gUFRSX0VSUihidHEtPmFjbF9jaGFubmVsKTsKKworCWJ0cS0+Y21kX2NoYW5uZWwgPSBxY29tX3djbnNzX29wZW5fY2hhbm5lbCh3Y25zcywgIkFQUFNfUklWQV9CVF9DTUQiLAorCQkJCQkJICAgYnRxY29tc21kX2NtZF9jYWxsYmFjayk7CisJaWYgKElTX0VSUihidHEtPmNtZF9jaGFubmVsKSkKKwkJcmV0dXJuIFBUUl9FUlIoYnRxLT5jbWRfY2hhbm5lbCk7CisKKwlxY29tX3NtZF9zZXRfZHJ2ZGF0YShidHEtPmFjbF9jaGFubmVsLCBidHEpOworCXFjb21fc21kX3NldF9kcnZkYXRhKGJ0cS0+Y21kX2NoYW5uZWwsIGJ0cSk7CisKKwloZGV2ID0gaGNpX2FsbG9jX2RldigpOworCWlmICghaGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloY2lfc2V0X2RydmRhdGEoaGRldiwgYnRxKTsKKwlidHEtPmhkZXYgPSBoZGV2OworCVNFVF9IQ0lERVZfREVWKGhkZXYsICZwZGV2LT5kZXYpOworCisJaGRldi0+YnVzID0gSENJX1NNRDsKKwloZGV2LT5vcGVuID0gYnRxY29tc21kX29wZW47CisJaGRldi0+Y2xvc2UgPSBidHFjb21zbWRfY2xvc2U7CisJaGRldi0+c2VuZCA9IGJ0cWNvbXNtZF9zZW5kOworCWhkZXYtPnNldF9iZGFkZHIgPSBxY2Ffc2V0X2JkYWRkcl9yb21lOworCisJcmV0ID0gaGNpX3JlZ2lzdGVyX2RldihoZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQloY2lfZnJlZV9kZXYoaGRldik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYnRxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0cWNvbXNtZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYnRxY29tc21kICpidHEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWhjaV91bnJlZ2lzdGVyX2RldihidHEtPmhkZXYpOworCWhjaV9mcmVlX2RldihidHEtPmhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJ0cWNvbXNtZF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSx3Y25zcy1idCIsIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYnRxY29tc21kX2RyaXZlciA9IHsKKwkucHJvYmUgPSBidHFjb21zbWRfcHJvYmUsCisJLnJlbW92ZSA9IGJ0cWNvbXNtZF9yZW1vdmUsCisJLmRyaXZlciAgPSB7CisJCS5uYW1lICA9ICJidHFjb21zbWQiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBidHFjb21zbWRfb2ZfbWF0Y2gsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYnRxY29tc21kX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkJqb3JuIEFuZGVyc3NvbiA8Ympvcm4uYW5kZXJzc29uQHNvbnltb2JpbGUuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJRdWFsY29tbSBTTUQgSENJIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRydGwuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0cnRsLmMKaW5kZXggODQyODg5My4uZmM5YjI1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnRydGwuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHJ0bC5jCkBAIC0zMyw2ICszMyw3IEBACiAjZGVmaW5lIFJUTF9ST01fTE1QXzg3MjNCCTB4ODcyMwogI2RlZmluZSBSVExfUk9NX0xNUF84ODIxQQkweDg4MjEKICNkZWZpbmUgUlRMX1JPTV9MTVBfODc2MUEJMHg4NzYxCisjZGVmaW5lIFJUTF9ST01fTE1QXzg4MjJCCTB4ODgyMgogCiBzdGF0aWMgaW50IHJ0bF9yZWFkX3JvbV92ZXJzaW9uKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqdmVyc2lvbikKIHsKQEAgLTc4LDExICs3OSwxNSBAQAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhdGNoX2xlbmd0aF9iYXNlLCAqcGF0Y2hfb2Zmc2V0X2Jhc2U7CiAJdTMyIHBhdGNoX29mZnNldCA9IDA7CiAJdTE2IHBhdGNoX2xlbmd0aCwgbnVtX3BhdGNoZXM7Ci0JY29uc3QgdTE2IHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcltdID0gewotCQlSVExfUk9NX0xNUF84NzIzQSwKLQkJUlRMX1JPTV9MTVBfODcyM0IsCi0JCVJUTF9ST01fTE1QXzg4MjFBLAotCQlSVExfUk9NX0xNUF84NzYxQQorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQlfX3UxNiBsbXBfc3VidmVyOworCQlfX3U4IGlkOworCX0gcHJvamVjdF9pZF90b19sbXBfc3VidmVyW10gPSB7CisJCXsgUlRMX1JPTV9MTVBfODcyM0EsIDAgfSwKKwkJeyBSVExfUk9NX0xNUF84NzIzQiwgMSB9LAorCQl7IFJUTF9ST01fTE1QXzg4MjFBLCAyIH0sCisJCXsgUlRMX1JPTV9MTVBfODc2MUEsIDMgfSwKKwkJeyBSVExfUk9NX0xNUF84ODIyQiwgOCB9LAogCX07CiAKIAlyZXQgPSBydGxfcmVhZF9yb21fdmVyc2lvbihoZGV2LCAmcm9tX3ZlcnNpb24pOwpAQCAtMTM0LDE0ICsxMzksMjAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKHByb2plY3RfaWQgPj0gQVJSQVlfU0laRShwcm9qZWN0X2lkX3RvX2xtcF9zdWJ2ZXIpKSB7CisJLyogRmluZCBwcm9qZWN0X2lkIGluIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHJvamVjdF9pZF90b19sbXBfc3VidmVyKTsgaSsrKSB7CisJCWlmIChwcm9qZWN0X2lkID09IHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcltpXS5pZCkKKwkJCWJyZWFrOworCX0KKworCWlmIChpID49IEFSUkFZX1NJWkUocHJvamVjdF9pZF90b19sbXBfc3VidmVyKSkgewogCQlCVF9FUlIoIiVzOiB1bmtub3duIHByb2plY3QgaWQgJWQiLCBoZGV2LT5uYW1lLCBwcm9qZWN0X2lkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGxtcF9zdWJ2ZXIgIT0gcHJvamVjdF9pZF90b19sbXBfc3VidmVyW3Byb2plY3RfaWRdKSB7CisJaWYgKGxtcF9zdWJ2ZXIgIT0gcHJvamVjdF9pZF90b19sbXBfc3VidmVyW2ldLmxtcF9zdWJ2ZXIpIHsKIAkJQlRfRVJSKCIlczogZmlybXdhcmUgaXMgZm9yICV4IGJ1dCB0aGlzIGlzIGEgJXgiLCBoZGV2LT5uYW1lLAotCQkgICAgICAgcHJvamVjdF9pZF90b19sbXBfc3VidmVyW3Byb2plY3RfaWRdLCBsbXBfc3VidmVyKTsKKwkJICAgICAgIHByb2plY3RfaWRfdG9fbG1wX3N1YnZlcltpXS5sbXBfc3VidmVyLCBsbXBfc3VidmVyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNTcsNiArMjY4LDI2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBydGxfbG9hZF9jb25maWcoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGNvbnN0IGNoYXIgKm5hbWUsIHU4ICoqYnVmZikKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWludCByZXQ7CisKKwlCVF9JTkZPKCIlczogcnRsOiBsb2FkaW5nICVzIiwgaGRldi0+bmFtZSwgbmFtZSk7CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIG5hbWUsICZoZGV2LT5kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCUJUX0VSUigiJXM6IEZhaWxlZCB0byBsb2FkICVzIiwgaGRldi0+bmFtZSwgbmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZnctPnNpemU7CisJKmJ1ZmYgPSBrbWVtZHVwKGZ3LT5kYXRhLCByZXQsIEdGUF9LRVJORUwpOworCisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGJ0cnRsX3NldHVwX3J0bDg3MjNhKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CkBAIC0yOTYsMjUgKzMyNyw3NCBAQAogCXVuc2lnbmVkIGNoYXIgKmZ3X2RhdGEgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJaW50IHJldDsKKwlpbnQgY2ZnX3N6OworCXU4ICpjZmdfYnVmZiA9IE5VTEw7CisJdTggKnRidWZmOworCWNoYXIgKmNmZ19uYW1lID0gTlVMTDsKKworCXN3aXRjaCAobG1wX3N1YnZlcikgeworCWNhc2UgUlRMX1JPTV9MTVBfODcyM0I6CisJCWNmZ19uYW1lID0gInJ0bF9idC9ydGw4NzIzYl9jb25maWcuYmluIjsKKwkJYnJlYWs7CisJY2FzZSBSVExfUk9NX0xNUF84ODIxQToKKwkJY2ZnX25hbWUgPSAicnRsX2J0L3J0bDg4MjFhX2NvbmZpZy5iaW4iOworCQlicmVhazsKKwljYXNlIFJUTF9ST01fTE1QXzg3NjFBOgorCQljZmdfbmFtZSA9ICJydGxfYnQvcnRsODc2MWFfY29uZmlnLmJpbiI7CisJCWJyZWFrOworCWNhc2UgUlRMX1JPTV9MTVBfODgyMkI6CisJCWNmZ19uYW1lID0gInJ0bF9idC9ydGw4ODIyYl9jb25maWcuYmluIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlRfRVJSKCIlczogcnRsOiBubyBjb25maWcgYWNjb3JkaW5nIHRvIGxtcF9zdWJ2ZXIgJTA0eCIsCisJCSAgICAgICBoZGV2LT5uYW1lLCBsbXBfc3VidmVyKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNmZ19uYW1lKSB7CisJCWNmZ19zeiA9IHJ0bF9sb2FkX2NvbmZpZyhoZGV2LCBjZmdfbmFtZSwgJmNmZ19idWZmKTsKKwkJaWYgKGNmZ19zeiA8IDApCisJCQljZmdfc3ogPSAwOworCX0gZWxzZQorCQljZmdfc3ogPSAwOwogCiAJQlRfSU5GTygiJXM6IHJ0bDogbG9hZGluZyAlcyIsIGhkZXYtPm5hbWUsIGZ3X25hbWUpOwogCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCAmaGRldi0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewogCQlCVF9FUlIoIiVzOiBGYWlsZWQgdG8gbG9hZCAlcyIsIGhkZXYtPm5hbWUsIGZ3X25hbWUpOwotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9yZXFfZnc7CiAJfQogCiAJcmV0ID0gcnRsODcyM2JfcGFyc2VfZmlybXdhcmUoaGRldiwgbG1wX3N1YnZlciwgZncsICZmd19kYXRhKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKKwlpZiAoY2ZnX3N6KSB7CisJCXRidWZmID0ga3phbGxvYyhyZXQgKyBjZmdfc3osIEdGUF9LRVJORUwpOworCQlpZiAoIXRidWZmKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQltZW1jcHkodGJ1ZmYsIGZ3X2RhdGEsIHJldCk7CisJCWtmcmVlKGZ3X2RhdGEpOworCisJCW1lbWNweSh0YnVmZiArIHJldCwgY2ZnX2J1ZmYsIGNmZ19zeik7CisJCXJldCArPSBjZmdfc3o7CisKKwkJZndfZGF0YSA9IHRidWZmOworCX0KKworCUJUX0lORk8oImNmZ19zeiAlZCwgdG90YWwgc2l6ZSAlZCIsIGNmZ19zeiwgcmV0KTsKKwogCXJldCA9IHJ0bF9kb3dubG9hZF9maXJtd2FyZShoZGV2LCBmd19kYXRhLCByZXQpOwotCWtmcmVlKGZ3X2RhdGEpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKIAogb3V0OgogCXJlbGVhc2VfZmlybXdhcmUoZncpOworCWtmcmVlKGZ3X2RhdGEpOworZXJyX3JlcV9mdzoKKwlpZiAoY2ZnX3N6KQorCQlrZnJlZShjZmdfYnVmZik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzc3LDYgKzQ1Nyw5IEBACiAJY2FzZSBSVExfUk9NX0xNUF84NzYxQToKIAkJcmV0dXJuIGJ0cnRsX3NldHVwX3J0bDg3MjNiKGhkZXYsIGxtcF9zdWJ2ZXIsCiAJCQkJCSAgICAicnRsX2J0L3J0bDg3NjFhX2Z3LmJpbiIpOworCWNhc2UgUlRMX1JPTV9MTVBfODgyMkI6CisJCXJldHVybiBidHJ0bF9zZXR1cF9ydGw4NzIzYihoZGV2LCBsbXBfc3VidmVyLAorCQkJCQkgICAgInJ0bF9idC9ydGw4ODIyYl9mdy5iaW4iKTsKIAlkZWZhdWx0OgogCQlCVF9JTkZPKCJydGw6IGFzc3VtaW5nIG5vIGZpcm13YXJlIHVwbG9hZCBuZWVkZWQuIik7CiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKaW5kZXggODExZjliOS4uNmJkNjNiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCkBAIC02Miw2ICs2Miw3IEBACiAjZGVmaW5lIEJUVVNCX1JFQUxURUsJCTB4MjAwMDAKICNkZWZpbmUgQlRVU0JfQkNNMjA0NQkJMHg0MDAwMAogI2RlZmluZSBCVFVTQl9JRk5VTV8yCQkweDgwMDAwCisjZGVmaW5lIEJUVVNCX0NXNjYyMgkJMHgxMDAwMDAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGJ0dXNiX3RhYmxlW10gPSB7CiAJLyogR2VuZXJpYyBCbHVldG9vdGggVVNCIGRldmljZSAqLwpAQCAtMjQ4LDkgKzI0OSwxMSBAQAogCiAJLyogUUNBIFJPTUUgY2hpcHNldCAqLwogCXsgVVNCX0RFVklDRSgweDBjZjMsIDB4ZTAwNyksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1FDQV9ST01FIH0sCisJeyBVU0JfREVWSUNFKDB4MGNmMywgMHhlMDA5KSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUUNBX1JPTUUgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweGUzMDApLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9RQ0FfUk9NRSB9LAogCXsgVVNCX0RFVklDRSgweDBjZjMsIDB4ZTM2MCksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1FDQV9ST01FIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQ4OSwgMHhlMDkyKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUUNBX1JPTUUgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNGNhLCAweDMwMTEpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9RQ0FfUk9NRSB9LAogCiAJLyogQnJvYWRjb20gQkNNMjAzNSAqLwogCXsgVVNCX0RFVklDRSgweDBhNWMsIDB4MjAwOSksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX0JDTTkyMDM1IH0sCkBAIC0yOTAsNyArMjkzLDggQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNDAwLCAweDA4MGEpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9CUk9LRU5fSVNPQyB9LAogCiAJLyogQ09OV0lTRSBUZWNobm9sb2d5IGJhc2VkIGFkYXB0ZXJzIHdpdGggYnVnZ3kgU0NPIHN1cHBvcnQgKi8KLQl7IFVTQl9ERVZJQ0UoMHgwZTVlLCAweDY2MjIpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9CUk9LRU5fSVNPQyB9LAorCXsgVVNCX0RFVklDRSgweDBlNWUsIDB4NjYyMiksCisJICAuZHJpdmVyX2luZm8gPSBCVFVTQl9CUk9LRU5fSVNPQyB8IEJUVVNCX0NXNjYyMn0sCiAKIAkvKiBSb3BlciBDbGFzcyAxIEJsdWV0b290aCBEb25nbGUgKFNpbGljb24gV2F2ZSBiYXNlZCkgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMzEwLCAweDAwMDEpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9TV0FWRSB9LApAQCAtMjIyMSw5ICsyMjI1LDggQEAKIAllcnIgPSB3YWl0X29uX2JpdF90aW1lb3V0KCZkYXRhLT5mbGFncywgQlRVU0JfRE9XTkxPQURJTkcsCiAJCQkJICBUQVNLX0lOVEVSUlVQVElCTEUsCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKDUwMDApKTsKLQlpZiAoZXJyID09IDEpIHsKKwlpZiAoZXJyID09IC1FSU5UUikgewogCQlCVF9FUlIoIiVzOiBGaXJtd2FyZSBsb2FkaW5nIGludGVycnVwdGVkIiwgaGRldi0+bmFtZSk7Ci0JCWVyciA9IC1FSU5UUjsKIAkJZ290byBkb25lOwogCX0KIApAQCAtMjI3NSw3ICsyMjc4LDcgQEAKIAkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSwKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwogCi0JaWYgKGVyciA9PSAxKSB7CisJaWYgKGVyciA9PSAtRUlOVFIpIHsKIAkJQlRfRVJSKCIlczogRGV2aWNlIGJvb3QgaW50ZXJydXB0ZWQiLCBoZGV2LT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5UUjsKIAl9CkBAIC0yODQ1LDYgKzI4NDgsOSBAQAogCWhkZXYtPnNlbmQgICA9IGJ0dXNiX3NlbmRfZnJhbWU7CiAJaGRldi0+bm90aWZ5ID0gYnR1c2Jfbm90aWZ5OwogCisJaWYgKGlkLT5kcml2ZXJfaW5mbyAmIEJUVVNCX0NXNjYyMikKKwkJc2V0X2JpdChIQ0lfUVVJUktfQlJPS0VOX1NUT1JFRF9MSU5LX0tFWSwgJmhkZXYtPnF1aXJrcyk7CisKIAlpZiAoaWQtPmRyaXZlcl9pbmZvICYgQlRVU0JfQkNNMjA0NSkKIAkJc2V0X2JpdChIQ0lfUVVJUktfQlJPS0VOX1NUT1JFRF9MSU5LX0tFWSwgJmhkZXYtPnF1aXJrcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0d2lsaW5rLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idHdpbGluay5jCmluZGV4IDQ4NTI4MWIuLmVmNTFjOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0d2lsaW5rLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnR3aWxpbmsuYwpAQCAtMjQ1LDYgKzI0NSw3IEBACiB7CiAJc3RydWN0IHRpX3N0ICpoc3Q7CiAJbG9uZyBsZW47CisJaW50IHBrdF90eXBlOwogCiAJaHN0ID0gaGNpX2dldF9kcnZkYXRhKGhkZXYpOwogCkBAIC0yNTgsNiArMjU5LDcgQEAKIAkgKiBGcmVlaW5nIHNrYiBtZW1vcnkgaXMgdGFrZW4gY2FyZSBpbiBzaGFyZWQgdHJhbnNwb3J0IGxheWVyLAogCSAqIHNvIGRvbid0IGZyZWUgc2tiIG1lbW9yeSBoZXJlLgogCSAqLworCXBrdF90eXBlID0gaGNpX3NrYl9wa3RfdHlwZShza2IpOwogCWxlbiA9IGhzdC0+c3Rfd3JpdGUoc2tiKTsKIAlpZiAobGVuIDwgMCkgewogCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTI2OCw3ICsyNzAsNyBAQAogCiAJLyogU1QgYWNjZXB0ZWQgb3VyIHNrYi4gU28sIEdvIGFoZWFkIGFuZCBkbyByZXN0ICovCiAJaGRldi0+c3RhdC5ieXRlX3R4ICs9IGxlbjsKLQl0aV9zdF90eF9jb21wbGV0ZShoc3QsIGhjaV9za2JfcGt0X3R5cGUoc2tiKSk7CisJdGlfc3RfdHhfY29tcGxldGUoaHN0LCBwa3RfdHlwZSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY20uYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY20uYwppbmRleCAxYzk3ZWRhLi41Y2NiOTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNtLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2JjbS5jCkBAIC03OTgsNyArNzk4LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoY2lfdWFydF9wcm90byBiY21fcHJvdG8gPSB7CiAJLmlkCQk9IEhDSV9VQVJUX0JDTSwKLQkubmFtZQkJPSAiQkNNIiwKKwkubmFtZQkJPSAiQnJvYWRjb20iLAogCS5tYW51ZmFjdHVyZXIJPSAxNSwKIAkuaW5pdF9zcGVlZAk9IDExNTIwMCwKIAkub3Blcl9zcGVlZAk9IDQwMDAwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYwppbmRleCBkN2QyM2NlLi5hMmM5MjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY3NwLmMKQEAgLTkwLDcgKzkwLDggQEAKIC8qIC0tLS0gQkNTUCBDUkMgY2FsY3VsYXRpb24gLS0tLSAqLwogCiAvKiBUYWJsZSBmb3IgY2FsY3VsYXRpbmcgQ1JDIGZvciBwb2x5bm9taWFsIDB4MTAyMSwgTFNCIHByb2Nlc3NlZCBmaXJzdCwKLWluaXRpYWwgdmFsdWUgMHhmZmZmLCBiaXRzIHNoaWZ0ZWQgaW4gcmV2ZXJzZSBvcmRlci4gKi8KKyAqIGluaXRpYWwgdmFsdWUgMHhmZmZmLCBiaXRzIHNoaWZ0ZWQgaW4gcmV2ZXJzZSBvcmRlci4KKyAqLwogCiBzdGF0aWMgY29uc3QgdTE2IGNyY190YWJsZVtdID0gewogCTB4MDAwMCwgMHgxMDgxLCAweDIxMDIsIDB4MzE4MywKQEAgLTE3NCw3ICsxNzUsNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmJjc3BfcHJlcGFyZV9wa3Qoc3RydWN0IGJjc3Bfc3RydWN0ICpiY3NwLCB1OCAqZGF0YSwKLQkJaW50IGxlbiwgaW50IHBrdF90eXBlKQorCQkJCQlpbnQgbGVuLCBpbnQgcGt0X3R5cGUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKm5za2I7CiAJdTggaGRyWzRdLCBjaGFuOwpAQCAtMjEzLDYgKzIxNCw3IEBACiAJCS8qIFZlbmRvciBzcGVjaWZpYyBjb21tYW5kcyAqLwogCQlpZiAoaGNpX29wY29kZV9vZ2YoX19sZTE2X3RvX2NwdShvcGNvZGUpKSA9PSAweDNmKSB7CiAJCQl1OCBkZXNjID0gKihkYXRhICsgSENJX0NPTU1BTkRfSERSX1NJWkUpOworCiAJCQlpZiAoKGRlc2MgJiAweGYwKSA9PSAweGMwKSB7CiAJCQkJZGF0YSArPSBIQ0lfQ09NTUFORF9IRFJfU0laRSArIDE7CiAJCQkJbGVuICAtPSBIQ0lfQ09NTUFORF9IRFJfU0laRSArIDE7CkBAIC0yNzEsOCArMjczLDggQEAKIAkvKiBQdXQgQ1JDICovCiAJaWYgKGJjc3AtPnVzZV9jcmMpIHsKIAkJYmNzcF90eG1zZ19jcmMgPSBiaXRyZXYxNihiY3NwX3R4bXNnX2NyYyk7Ci0JCWJjc3Bfc2xpcF9vbmVfYnl0ZShuc2tiLCAodTgpICgoYmNzcF90eG1zZ19jcmMgPj4gOCkgJiAweDAwZmYpKTsKLQkJYmNzcF9zbGlwX29uZV9ieXRlKG5za2IsICh1OCkgKGJjc3BfdHhtc2dfY3JjICYgMHgwMGZmKSk7CisJCWJjc3Bfc2xpcF9vbmVfYnl0ZShuc2tiLCAodTgpKChiY3NwX3R4bXNnX2NyYyA+PiA4KSAmIDB4MDBmZikpOworCQliY3NwX3NsaXBfb25lX2J5dGUobnNrYiwgKHU4KShiY3NwX3R4bXNnX2NyYyAmIDB4MDBmZikpOwogCX0KIAogCWJjc3Bfc2xpcF9tc2dkZWxpbShuc2tiKTsKQEAgLTI4Nyw3ICsyODksOCBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAkvKiBGaXJzdCBvZiBhbGwsIGNoZWNrIGZvciB1bnJlbGlhYmxlIG1lc3NhZ2VzIGluIHRoZSBxdWV1ZSwKLQkgICBzaW5jZSB0aGV5IGhhdmUgcHJpb3JpdHkgKi8KKwkgKiBzaW5jZSB0aGV5IGhhdmUgcHJpb3JpdHkKKwkgKi8KIAogCXNrYiA9IHNrYl9kZXF1ZXVlKCZiY3NwLT51bnJlbCk7CiAJaWYgKHNrYiAhPSBOVUxMKSB7CkBAIC00MTQsNyArNDE3LDcgQEAKIAogCS8qIHNwb3QgImNvbmYiIHBrdHMgYW5kIHJlcGx5IHdpdGggYSAiY29uZiByc3AiIHBrdCAqLwogCWlmIChiY3NwLT5yeF9za2ItPmRhdGFbMV0gPj4gNCA9PSA0ICYmIGJjc3AtPnJ4X3NrYi0+ZGF0YVsyXSA9PSAwICYmCi0JCQkhbWVtY21wKCZiY3NwLT5yeF9za2ItPmRhdGFbNF0sIGNvbmZfcGt0LCA0KSkgeworCSAgICAhbWVtY21wKCZiY3NwLT5yeF9za2ItPmRhdGFbNF0sIGNvbmZfcGt0LCA0KSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IGFsbG9jX3NrYig0LCBHRlBfQVRPTUlDKTsKIAogCQlCVF9EQkcoIkZvdW5kIGEgTEUgY29uZiBwa3QiKTsKQEAgLTQyOCw3ICs0MzEsNyBAQAogCX0KIAkvKiBTcG90ICJzeW5jIiBwa3RzLiBJZiB3ZSBmaW5kIG9uZS4uLmRpc2FzdGVyISAqLwogCWVsc2UgaWYgKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSA+PiA0ID09IDQgJiYgYmNzcC0+cnhfc2tiLT5kYXRhWzJdID09IDAgJiYKLQkJCSFtZW1jbXAoJmJjc3AtPnJ4X3NrYi0+ZGF0YVs0XSwgc3luY19wa3QsIDQpKSB7CisJCSAhbWVtY21wKCZiY3NwLT5yeF9za2ItPmRhdGFbNF0sIHN5bmNfcGt0LCA0KSkgewogCQlCVF9FUlIoIkZvdW5kIGEgTEUgc3luYyBwa3QsIGNhcmQgaGFzIHJlc2V0Iik7CiAJfQogfQpAQCAtNDQ2LDcgKzQ0OSw3IEBACiAJCWRlZmF1bHQ6CiAJCQltZW1jcHkoc2tiX3B1dChiY3NwLT5yeF9za2IsIDEpLCAmYnl0ZSwgMSk7CiAJCQlpZiAoKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4NDApICE9IDAgJiYKLQkJCQkJYmNzcC0+cnhfc3RhdGUgIT0gQkNTUF9XNF9DUkMpCisJCQkgICAgYmNzcC0+cnhfc3RhdGUgIT0gQkNTUF9XNF9DUkMpCiAJCQkJYmNzcF9jcmNfdXBkYXRlKCZiY3NwLT5tZXNzYWdlX2NyYywgYnl0ZSk7CiAJCQliY3NwLT5yeF9jb3VudC0tOwogCQl9CkBAIC00NTcsNyArNDYwLDcgQEAKIAkJY2FzZSAweGRjOgogCQkJbWVtY3B5KHNrYl9wdXQoYmNzcC0+cnhfc2tiLCAxKSwgJmMwLCAxKTsKIAkJCWlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHg0MCkgIT0gMCAmJgotCQkJCQliY3NwLT5yeF9zdGF0ZSAhPSBCQ1NQX1c0X0NSQykKKwkJCSAgICBiY3NwLT5yeF9zdGF0ZSAhPSBCQ1NQX1c0X0NSQykKIAkJCQliY3NwX2NyY191cGRhdGUoJmJjc3AtPm1lc3NhZ2VfY3JjLCAweGMwKTsKIAkJCWJjc3AtPnJ4X2VzY19zdGF0ZSA9IEJDU1BfRVNDU1RBVEVfTk9FU0M7CiAJCQliY3NwLT5yeF9jb3VudC0tOwpAQCAtNDY2LDcgKzQ2OSw3IEBACiAJCWNhc2UgMHhkZDoKIAkJCW1lbWNweShza2JfcHV0KGJjc3AtPnJ4X3NrYiwgMSksICZkYiwgMSk7CiAJCQlpZiAoKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4NDApICE9IDAgJiYKLQkJCQkJYmNzcC0+cnhfc3RhdGUgIT0gQkNTUF9XNF9DUkMpCisJCQkgICAgYmNzcC0+cnhfc3RhdGUgIT0gQkNTUF9XNF9DUkMpCiAJCQkJYmNzcF9jcmNfdXBkYXRlKCZiY3NwLT5tZXNzYWdlX2NyYywgMHhkYik7CiAJCQliY3NwLT5yeF9lc2Nfc3RhdGUgPSBCQ1NQX0VTQ1NUQVRFX05PRVNDOwogCQkJYmNzcC0+cnhfY291bnQtLTsKQEAgLTQ4NSwxMyArNDg4LDI4IEBACiBzdGF0aWMgdm9pZCBiY3NwX2NvbXBsZXRlX3J4X3BrdChzdHJ1Y3QgaGNpX3VhcnQgKmh1KQogewogCXN0cnVjdCBiY3NwX3N0cnVjdCAqYmNzcCA9IGh1LT5wcml2OwotCWludCBwYXNzX3VwOworCWludCBwYXNzX3VwID0gMDsKIAogCWlmIChiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwKSB7CS8qIHJlbGlhYmxlIHBrdCAqLwogCQlCVF9EQkcoIlJlY2VpdmVkIHNlcW5vICV1IGZyb20gY2FyZCIsIGJjc3AtPnJ4c2VxX3R4YWNrKTsKLQkJYmNzcC0+cnhzZXFfdHhhY2srKzsKLQkJYmNzcC0+cnhzZXFfdHhhY2sgJT0gMHg4OwotCQliY3NwLT50eGFja19yZXEgICAgPSAxOworCisJCS8qIGNoZWNrIHRoZSByeCBzZXF1ZW5jZSBudW1iZXIgaXMgYXMgZXhwZWN0ZWQgKi8KKwkJaWYgKChiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDA3KSA9PSBiY3NwLT5yeHNlcV90eGFjaykgeworCQkJYmNzcC0+cnhzZXFfdHhhY2srKzsKKwkJCWJjc3AtPnJ4c2VxX3R4YWNrICU9IDB4ODsKKwkJfSBlbHNlIHsKKwkJCS8qIGhhbmRsZSByZS10cmFuc21pdHRlZCBwYWNrZXQgb3IKKwkJCSAqIHdoZW4gcGFja2V0IHdhcyBtaXNzZWQKKwkJCSAqLworCQkJQlRfRVJSKCJPdXQtb2Ytb3JkZXIgcGFja2V0IGFycml2ZWQsIGdvdCAldSBleHBlY3RlZCAldSIsCisJCQkgICAgICAgYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHgwNywgYmNzcC0+cnhzZXFfdHhhY2spOworCisJCQkvKiBkbyBub3QgcHJvY2VzcyBvdXQtb2Ytb3JkZXIgcGFja2V0IHBheWxvYWQgKi8KKwkJCXBhc3NfdXAgPSAyOworCQl9CisKKwkJLyogc2VuZCBjdXJyZW50IHR4YWNrIHZhbHVlIHRvIGFsbCByZWNlaXZlZCByZWxpYWJsZSBwYWNrZXRzICovCisJCWJjc3AtPnR4YWNrX3JlcSA9IDE7CiAKIAkJLyogSWYgbmVlZGVkLCB0cmFuc21pdCBhbiBhY2sgcGt0ICovCiAJCWhjaV91YXJ0X3R4X3dha2V1cChodSk7CkBAIC01MDAsMjYgKzUxOCwzMyBAQAogCWJjc3AtPnJ4YWNrID0gKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSA+PiAzKSAmIDB4MDc7CiAJQlRfREJHKCJSZXF1ZXN0IGZvciBwa3QgJXUgZnJvbSBjYXJkIiwgYmNzcC0+cnhhY2spOwogCisJLyogaGFuZGxlIHJlY2VpdmVkIEFDSyBpbmRpY2F0aW9ucywKKwkgKiBpbmNsdWRpbmcgdGhvc2UgZnJvbSBvdXQtb2Ytb3JkZXIgcGFja2V0cworCSAqLwogCWJjc3BfcGt0X2N1bGwoYmNzcCk7Ci0JaWYgKChiY3NwLT5yeF9za2ItPmRhdGFbMV0gJiAweDBmKSA9PSA2ICYmCi0JCQliY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwKSB7Ci0JCWhjaV9za2JfcGt0X3R5cGUoYmNzcC0+cnhfc2tiKSA9IEhDSV9BQ0xEQVRBX1BLVDsKLQkJcGFzc191cCA9IDE7Ci0JfSBlbHNlIGlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZikgPT0gNSAmJgotCQkJYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHg4MCkgewotCQloY2lfc2tiX3BrdF90eXBlKGJjc3AtPnJ4X3NrYikgPSBIQ0lfRVZFTlRfUEtUOwotCQlwYXNzX3VwID0gMTsKLQl9IGVsc2UgaWYgKChiY3NwLT5yeF9za2ItPmRhdGFbMV0gJiAweDBmKSA9PSA3KSB7Ci0JCWhjaV9za2JfcGt0X3R5cGUoYmNzcC0+cnhfc2tiKSA9IEhDSV9TQ09EQVRBX1BLVDsKLQkJcGFzc191cCA9IDE7Ci0JfSBlbHNlIGlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZikgPT0gMSAmJgotCQkJIShiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwKSkgewotCQliY3NwX2hhbmRsZV9sZV9wa3QoaHUpOwotCQlwYXNzX3VwID0gMDsKLQl9IGVsc2UKLQkJcGFzc191cCA9IDA7CiAKLQlpZiAoIXBhc3NfdXApIHsKKwlpZiAocGFzc191cCAhPSAyKSB7CisJCWlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZikgPT0gNiAmJgorCQkgICAgKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4ODApKSB7CisJCQloY2lfc2tiX3BrdF90eXBlKGJjc3AtPnJ4X3NrYikgPSBIQ0lfQUNMREFUQV9QS1Q7CisJCQlwYXNzX3VwID0gMTsKKwkJfSBlbHNlIGlmICgoYmNzcC0+cnhfc2tiLT5kYXRhWzFdICYgMHgwZikgPT0gNSAmJgorCQkJICAgKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4ODApKSB7CisJCQloY2lfc2tiX3BrdF90eXBlKGJjc3AtPnJ4X3NrYikgPSBIQ0lfRVZFTlRfUEtUOworCQkJcGFzc191cCA9IDE7CisJCX0gZWxzZSBpZiAoKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSAmIDB4MGYpID09IDcpIHsKKwkJCWhjaV9za2JfcGt0X3R5cGUoYmNzcC0+cnhfc2tiKSA9IEhDSV9TQ09EQVRBX1BLVDsKKwkJCXBhc3NfdXAgPSAxOworCQl9IGVsc2UgaWYgKChiY3NwLT5yeF9za2ItPmRhdGFbMV0gJiAweDBmKSA9PSAxICYmCisJCQkgICAhKGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4ODApKSB7CisJCQliY3NwX2hhbmRsZV9sZV9wa3QoaHUpOworCQkJcGFzc191cCA9IDA7CisJCX0gZWxzZSB7CisJCQlwYXNzX3VwID0gMDsKKwkJfQorCX0KKworCWlmIChwYXNzX3VwID09IDApIHsKIAkJc3RydWN0IGhjaV9ldmVudF9oZHIgaGRyOwogCQl1OCBkZXNjID0gKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSAmIDB4MGYpOwogCkBAIC01MzcsMTggKzU2MiwyMyBAQAogCQkJCWhjaV9yZWN2X2ZyYW1lKGh1LT5oZGV2LCBiY3NwLT5yeF9za2IpOwogCQkJfSBlbHNlIHsKIAkJCQlCVF9FUlIoIlBhY2tldCBmb3IgdW5rbm93biBjaGFubmVsICgldSAlcykiLAotCQkJCQliY3NwLT5yeF9za2ItPmRhdGFbMV0gJiAweDBmLAotCQkJCQliY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDgwID8KLQkJCQkJInJlbGlhYmxlIiA6ICJ1bnJlbGlhYmxlIik7CisJCQkJICAgICAgIGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSAmIDB4MGYsCisJCQkJICAgICAgIGJjc3AtPnJ4X3NrYi0+ZGF0YVswXSAmIDB4ODAgPworCQkJCSAgICAgICAicmVsaWFibGUiIDogInVucmVsaWFibGUiKTsKIAkJCQlrZnJlZV9za2IoYmNzcC0+cnhfc2tiKTsKIAkJCX0KIAkJfSBlbHNlCiAJCQlrZnJlZV9za2IoYmNzcC0+cnhfc2tiKTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAocGFzc191cCA9PSAxKSB7CiAJCS8qIFB1bGwgb3V0IEJDU1AgaGRyICovCiAJCXNrYl9wdWxsKGJjc3AtPnJ4X3NrYiwgNCk7CiAKIAkJaGNpX3JlY3ZfZnJhbWUoaHUtPmhkZXYsIGJjc3AtPnJ4X3NrYik7CisJfSBlbHNlIHsKKwkJLyogaWdub3JlIHBhY2tldCBwYXlsb2FkIG9mIGFscmVhZHkgQUNLZWQgcmUtdHJhbnNtaXR0ZWQKKwkJICogcGFja2V0cyBvciB3aGVuIGEgcGFja2V0IHdhcyBtaXNzZWQgaW4gdGhlIEJDU1Agd2luZG93CisJCSAqLworCQlrZnJlZV9za2IoYmNzcC0+cnhfc2tiKTsKIAl9CiAKIAliY3NwLT5yeF9zdGF0ZSA9IEJDU1BfVzRfUEtUX0RFTElNSVRFUjsKQEAgLTU2Nyw3ICs1OTcsNyBAQAogCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cjsKIAogCUJUX0RCRygiaHUgJXAgY291bnQgJWQgcnhfc3RhdGUgJWQgcnhfY291bnQgJWxkIiwKLQkJaHUsIGNvdW50LCBiY3NwLT5yeF9zdGF0ZSwgYmNzcC0+cnhfY291bnQpOworCSAgICAgICBodSwgY291bnQsIGJjc3AtPnJ4X3N0YXRlLCBiY3NwLT5yeF9jb3VudCk7CiAKIAlwdHIgPSBkYXRhOwogCXdoaWxlIChjb3VudCkgewpAQCAtNTg2LDI0ICs2MTYsMTQgQEAKIAogCQlzd2l0Y2ggKGJjc3AtPnJ4X3N0YXRlKSB7CiAJCWNhc2UgQkNTUF9XNF9CQ1NQX0hEUjoKLQkJCWlmICgoMHhmZiAmICh1OCkgfiAoYmNzcC0+cnhfc2tiLT5kYXRhWzBdICsgYmNzcC0+cnhfc2tiLT5kYXRhWzFdICsKLQkJCQkJYmNzcC0+cnhfc2tiLT5kYXRhWzJdKSkgIT0gYmNzcC0+cnhfc2tiLT5kYXRhWzNdKSB7CisJCQlpZiAoKDB4ZmYgJiAodTgpfihiY3NwLT5yeF9za2ItPmRhdGFbMF0gKyBiY3NwLT5yeF9za2ItPmRhdGFbMV0gKworCQkJICAgIGJjc3AtPnJ4X3NrYi0+ZGF0YVsyXSkpICE9IGJjc3AtPnJ4X3NrYi0+ZGF0YVszXSkgewogCQkJCUJUX0VSUigiRXJyb3IgaW4gQkNTUCBoZHIgY2hlY2tzdW0iKTsKIAkJCQlrZnJlZV9za2IoYmNzcC0+cnhfc2tiKTsKIAkJCQliY3NwLT5yeF9zdGF0ZSA9IEJDU1BfVzRfUEtUX0RFTElNSVRFUjsKIAkJCQliY3NwLT5yeF9jb3VudCA9IDA7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlpZiAoYmNzcC0+cnhfc2tiLT5kYXRhWzBdICYgMHg4MAkvKiByZWxpYWJsZSBwa3QgKi8KLQkJCQkJCSYmIChiY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDA3KSAhPSBiY3NwLT5yeHNlcV90eGFjaykgewotCQkJCUJUX0VSUigiT3V0LW9mLW9yZGVyIHBhY2tldCBhcnJpdmVkLCBnb3QgJXUgZXhwZWN0ZWQgJXUiLAotCQkJCQliY3NwLT5yeF9za2ItPmRhdGFbMF0gJiAweDA3LCBiY3NwLT5yeHNlcV90eGFjayk7Ci0KLQkJCQlrZnJlZV9za2IoYmNzcC0+cnhfc2tiKTsKLQkJCQliY3NwLT5yeF9zdGF0ZSA9IEJDU1BfVzRfUEtUX0RFTElNSVRFUjsKLQkJCQliY3NwLT5yeF9jb3VudCA9IDA7Ci0JCQkJY29udGludWU7Ci0JCQl9CiAJCQliY3NwLT5yeF9zdGF0ZSA9IEJDU1BfVzRfREFUQTsKIAkJCWJjc3AtPnJ4X2NvdW50ID0gKGJjc3AtPnJ4X3NrYi0+ZGF0YVsxXSA+PiA0KSArCiAJCQkJCShiY3NwLT5yeF9za2ItPmRhdGFbMl0gPDwgNCk7CS8qIE1heSBiZSAwICovCkBAIC02MjAsOCArNjQwLDggQEAKIAkJY2FzZSBCQ1NQX1c0X0NSQzoKIAkJCWlmIChiaXRyZXYxNihiY3NwLT5tZXNzYWdlX2NyYykgIT0gYnNjcF9nZXRfY3JjKGJjc3ApKSB7CiAJCQkJQlRfRVJSKCJDaGVja3N1bSBmYWlsZWQ6IGNvbXB1dGVkICUwNHggcmVjZWl2ZWQgJTA0eCIsCi0JCQkJCWJpdHJldjE2KGJjc3AtPm1lc3NhZ2VfY3JjKSwKLQkJCQkJYnNjcF9nZXRfY3JjKGJjc3ApKTsKKwkJCQkgICAgICAgYml0cmV2MTYoYmNzcC0+bWVzc2FnZV9jcmMpLAorCQkJCSAgICAgICBic2NwX2dldF9jcmMoYmNzcCkpOwogCiAJCQkJa2ZyZWVfc2tiKGJjc3AtPnJ4X3NrYik7CiAJCQkJYmNzcC0+cnhfc3RhdGUgPSBCQ1NQX1c0X1BLVF9ERUxJTUlURVI7CkBAIC02NzksNyArNjk5LDcgQEAKIAkvKiBBcnJhbmdlIHRvIHJldHJhbnNtaXQgYWxsIG1lc3NhZ2VzIGluIHRoZSByZWxxLiAqLwogc3RhdGljIHZvaWQgYmNzcF90aW1lZF9ldmVudCh1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlzdHJ1Y3QgaGNpX3VhcnQgKmh1ID0gKHN0cnVjdCBoY2lfdWFydCAqKSBhcmc7CisJc3RydWN0IGhjaV91YXJ0ICpodSA9IChzdHJ1Y3QgaGNpX3VhcnQgKilhcmc7CiAJc3RydWN0IGJjc3Bfc3RydWN0ICpiY3NwID0gaHUtPnByaXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNzE1LDcgKzczNSw3IEBACiAKIAlpbml0X3RpbWVyKCZiY3NwLT50YmNzcCk7CiAJYmNzcC0+dGJjc3AuZnVuY3Rpb24gPSBiY3NwX3RpbWVkX2V2ZW50OwotCWJjc3AtPnRiY3NwLmRhdGEgICAgID0gKHVfbG9uZykgaHU7CisJYmNzcC0+dGJjc3AuZGF0YSAgICAgPSAodV9sb25nKWh1OwogCiAJYmNzcC0+cnhfc3RhdGUgPSBCQ1NQX1c0X1BLVF9ERUxJTUlURVI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9pbnRlbC5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2ludGVsLmMKaW5kZXggZWQwYTQyMC4uOWUyNzEyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2ludGVsLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2ludGVsLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFLAogCQkJCSAgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CiAKLQlpZiAoZXJyID09IDEpIHsKKwlpZiAoZXJyID09IC1FSU5UUikgewogCQlidF9kZXZfZXJyKGh1LT5oZGV2LCAiRGV2aWNlIGJvb3QgaW50ZXJydXB0ZWQiKTsKIAkJcmV0dXJuIC1FSU5UUjsKIAl9CkBAIC0xNTEsNyArMTUxLDcgQEAKIAkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSwKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwogCi0JaWYgKGVyciA9PSAxKSB7CisJaWYgKGVyciA9PSAtRUlOVFIpIHsKIAkJYnRfZGV2X2VycihodS0+aGRldiwgIkxQTSB0cmFuc2FjdGlvbiBpbnRlcnJ1cHRlZCIpOwogCQlyZXR1cm4gLUVJTlRSOwogCX0KQEAgLTgxMyw3ICs4MTMsNyBAQAogCWVyciA9IHdhaXRfb25fYml0X3RpbWVvdXQoJmludGVsLT5mbGFncywgU1RBVEVfRE9XTkxPQURJTkcsCiAJCQkJICBUQVNLX0lOVEVSUlVQVElCTEUsCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKDUwMDApKTsKLQlpZiAoZXJyID09IDEpIHsKKwlpZiAoZXJyID09IC1FSU5UUikgewogCQlidF9kZXZfZXJyKGhkZXYsICJGaXJtd2FyZSBsb2FkaW5nIGludGVycnVwdGVkIik7CiAJCWVyciA9IC1FSU5UUjsKIAkJZ290byBkb25lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYwppbmRleCBkZGE5NzM5Li45NDk3YzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYwpAQCAtNjk3LDM0ICs2OTcsMzYgQEAKIAljYXNlIEhDSVVBUlRTRVRQUk9UTzoKIAkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhDSV9VQVJUX1BST1RPX1NFVCwgJmh1LT5mbGFncykpIHsKIAkJCWVyciA9IGhjaV91YXJ0X3NldF9wcm90byhodSwgYXJnKTsKLQkJCWlmIChlcnIpIHsKKwkJCWlmIChlcnIpCiAJCQkJY2xlYXJfYml0KEhDSV9VQVJUX1BST1RPX1NFVCwgJmh1LT5mbGFncyk7Ci0JCQkJcmV0dXJuIGVycjsKLQkJCX0KIAkJfSBlbHNlCi0JCQlyZXR1cm4gLUVCVVNZOworCQkJZXJyID0gLUVCVVNZOwogCQlicmVhazsKIAogCWNhc2UgSENJVUFSVEdFVFBST1RPOgogCQlpZiAodGVzdF9iaXQoSENJX1VBUlRfUFJPVE9fU0VULCAmaHUtPmZsYWdzKSkKLQkJCXJldHVybiBodS0+cHJvdG8tPmlkOwotCQlyZXR1cm4gLUVVTkFUQ0g7CisJCQllcnIgPSBodS0+cHJvdG8tPmlkOworCQllbHNlCisJCQllcnIgPSAtRVVOQVRDSDsKKwkJYnJlYWs7CiAKIAljYXNlIEhDSVVBUlRHRVRERVZJQ0U6CiAJCWlmICh0ZXN0X2JpdChIQ0lfVUFSVF9SRUdJU1RFUkVELCAmaHUtPmZsYWdzKSkKLQkJCXJldHVybiBodS0+aGRldi0+aWQ7Ci0JCXJldHVybiAtRVVOQVRDSDsKKwkJCWVyciA9IGh1LT5oZGV2LT5pZDsKKwkJZWxzZQorCQkJZXJyID0gLUVVTkFUQ0g7CisJCWJyZWFrOwogCiAJY2FzZSBIQ0lVQVJUU0VURkxBR1M6CiAJCWlmICh0ZXN0X2JpdChIQ0lfVUFSVF9QUk9UT19TRVQsICZodS0+ZmxhZ3MpKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJZXJyID0gaGNpX3VhcnRfc2V0X2ZsYWdzKGh1LCBhcmcpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKKwkJCWVyciA9IC1FQlVTWTsKKwkJZWxzZQorCQkJZXJyID0gaGNpX3VhcnRfc2V0X2ZsYWdzKGh1LCBhcmcpOwogCQlicmVhazsKIAogCWNhc2UgSENJVUFSVEdFVEZMQUdTOgotCQlyZXR1cm4gaHUtPmhkZXZfZmxhZ3M7CisJCWVyciA9IGh1LT5oZGV2X2ZsYWdzOworCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCWVyciA9IG5fdHR5X2lvY3RsX2hlbHBlcih0dHksIGZpbGUsIGNtZCwgYXJnKTsKQEAgLTgxMCw2ICs4MTIsOSBAQAogI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX0FHNlhYCiAJYWc2eHhfaW5pdCgpOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0JUX0hDSVVBUlRfTVJWTAorCW1ydmxfaW5pdCgpOworI2VuZGlmCiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg0NSw2ICs4NTAsOSBAQAogI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX0FHNlhYCiAJYWc2eHhfZGVpbml0KCk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlRfSENJVUFSVF9NUlZMCisJbXJ2bF9kZWluaXQoKTsKKyNlbmRpZgogCiAJLyogUmVsZWFzZSB0dHkgcmVnaXN0cmF0aW9uIG9mIGxpbmUgZGlzY2lwbGluZSAqLwogCWVyciA9IHR0eV91bnJlZ2lzdGVyX2xkaXNjKE5fSENJKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9tcnZsLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbXJ2bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzRiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfbXJ2bC5jCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICoKKyAqICBCbHVldG9vdGggSENJIFVBUlQgZHJpdmVyIGZvciBtYXJ2ZWxsIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE2ICBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLgorICogIENvcHlyaWdodCAoQykgMjAxNiAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorCisjaW5jbHVkZSAiaGNpX3VhcnQuaCIKKworI2RlZmluZSBIQ0lfRldfUkVRX1BLVCAweEE1CisjZGVmaW5lIEhDSV9DSElQX1ZFUl9QS1QgMHhBQQorCisjZGVmaW5lIE1SVkxfQUNLIDB4NUEKKyNkZWZpbmUgTVJWTF9OQUsgMHhCRgorI2RlZmluZSBNUlZMX1JBV19EQVRBIDB4MUYKKworZW51bSB7CisJU1RBVEVfQ0hJUF9WRVJfUEVORElORywKKwlTVEFURV9GV19SRVFfUEVORElORywKK307CisKK3N0cnVjdCBtcnZsX2RhdGEgeworCXN0cnVjdCBza19idWZmICpyeF9za2I7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eHE7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCByYXdxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHR4X2xlbjsKKwl1OCBpZCwgcmV2OworfTsKKworc3RydWN0IGhjaV9tcnZsX3BrdCB7CisJX19sZTE2IGxoczsKKwlfX2xlMTYgcmhzOworfSBfX3BhY2tlZDsKKyNkZWZpbmUgSENJX01SVkxfUEtUX1NJWkUgNAorCitzdGF0aWMgaW50IG1ydmxfb3BlbihzdHJ1Y3QgaGNpX3VhcnQgKmh1KQoreworCXN0cnVjdCBtcnZsX2RhdGEgKm1ydmw7CisKKwlCVF9EQkcoImh1ICVwIiwgaHUpOworCisJbXJ2bCA9IGt6YWxsb2Moc2l6ZW9mKCptcnZsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtcnZsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJm1ydmwtPnR4cSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbXJ2bC0+cmF3cSk7CisKKwlzZXRfYml0KFNUQVRFX0NISVBfVkVSX1BFTkRJTkcsICZtcnZsLT5mbGFncyk7CisKKwlodS0+cHJpdiA9IG1ydmw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXJ2bF9jbG9zZShzdHJ1Y3QgaGNpX3VhcnQgKmh1KQoreworCXN0cnVjdCBtcnZsX2RhdGEgKm1ydmwgPSBodS0+cHJpdjsKKworCUJUX0RCRygiaHUgJXAiLCBodSk7CisKKwlza2JfcXVldWVfcHVyZ2UoJm1ydmwtPnR4cSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZtcnZsLT5yYXdxKTsKKwlrZnJlZV9za2IobXJ2bC0+cnhfc2tiKTsKKwlrZnJlZShtcnZsKTsKKworCWh1LT5wcml2ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcnZsX2ZsdXNoKHN0cnVjdCBoY2lfdWFydCAqaHUpCit7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCisJQlRfREJHKCJodSAlcCIsIGh1KTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmbXJ2bC0+dHhxKTsKKwlza2JfcXVldWVfcHVyZ2UoJm1ydmwtPnJhd3EpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbXJ2bF9kZXF1ZXVlKHN0cnVjdCBoY2lfdWFydCAqaHUpCit7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBza2JfZGVxdWV1ZSgmbXJ2bC0+dHhxKTsKKwlpZiAoIXNrYikgeworCQkvKiBBbnkgcmF3IGRhdGEgPyAqLworCQlza2IgPSBza2JfZGVxdWV1ZSgmbXJ2bC0+cmF3cSk7CisJfSBlbHNlIHsKKwkJLyogUHJlcGVuZCBza2Igd2l0aCBmcmFtZSB0eXBlICovCisJCW1lbWNweShza2JfcHVzaChza2IsIDEpLCAmYnRfY2Ioc2tiKS0+cGt0X3R5cGUsIDEpOworCX0KKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQgbXJ2bF9lbnF1ZXVlKHN0cnVjdCBoY2lfdWFydCAqaHUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCisJc2tiX3F1ZXVlX3RhaWwoJm1ydmwtPnR4cSwgc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXJ2bF9zZW5kX2FjayhzdHJ1Y3QgaGNpX3VhcnQgKmh1LCB1bnNpZ25lZCBjaGFyIHR5cGUpCit7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiBObyBINCBwYXlsb2FkLCBvbmx5IDEgYnl0ZSBoZWFkZXIgKi8KKwlza2IgPSBidF9za2JfYWxsb2MoMCwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpIHsKKwkJYnRfZGV2X2VycihodS0+aGRldiwgIlVuYWJsZSB0byBhbGxvYyBhY2svbmFrIHBhY2tldCIpOworCQlyZXR1cm47CisJfQorCWhjaV9za2JfcGt0X3R5cGUoc2tiKSA9IHR5cGU7CisKKwlza2JfcXVldWVfdGFpbCgmbXJ2bC0+dHhxLCBza2IpOworCWhjaV91YXJ0X3R4X3dha2V1cChodSk7Cit9CisKK3N0YXRpYyBpbnQgbXJ2bF9yZWN2X2Z3X3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX21ydmxfcGt0ICpwa3QgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaGNpX3VhcnQgKmh1ID0gaGNpX2dldF9kcnZkYXRhKGhkZXYpOworCXN0cnVjdCBtcnZsX2RhdGEgKm1ydmwgPSBodS0+cHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICgocGt0LT5saHMgXiBwa3QtPnJocykgIT0gMHhmZmZmKSB7CisJCWJ0X2Rldl9lcnIoaGRldiwgIkNvcnJ1cHRlZCBtcnZsIGhlYWRlciIpOworCQltcnZsX3NlbmRfYWNrKGh1LCBNUlZMX05BSyk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisJbXJ2bF9zZW5kX2FjayhodSwgTVJWTF9BQ0spOworCisJaWYgKCF0ZXN0X2JpdChTVEFURV9GV19SRVFfUEVORElORywgJm1ydmwtPmZsYWdzKSkgeworCQlidF9kZXZfZXJyKGhkZXYsICJSZWNlaXZlZCB1bmV4cGVjdGVkIGZpcm13YXJlIHJlcXVlc3QiKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCW1ydmwtPnR4X2xlbiA9IGxlMTZfdG9fY3B1KHBrdC0+bGhzKTsKKworCWNsZWFyX2JpdChTVEFURV9GV19SRVFfUEVORElORywgJm1ydmwtPmZsYWdzKTsKKwlzbXBfbWJfX2FmdGVyX2F0b21pYygpOworCXdha2VfdXBfYml0KCZtcnZsLT5mbGFncywgU1RBVEVfRldfUkVRX1BFTkRJTkcpOworCitkb25lOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXJ2bF9yZWN2X2NoaXBfdmVyKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfbXJ2bF9wa3QgKnBrdCA9ICh2b2lkICopc2tiLT5kYXRhOworCXN0cnVjdCBoY2lfdWFydCAqaHUgPSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisJc3RydWN0IG1ydmxfZGF0YSAqbXJ2bCA9IGh1LT5wcml2OworCXUxNiB2ZXJzaW9uID0gbGUxNl90b19jcHUocGt0LT5saHMpOworCWludCByZXQgPSAwOworCisJaWYgKChwa3QtPmxocyBeIHBrdC0+cmhzKSAhPSAweGZmZmYpIHsKKwkJYnRfZGV2X2VycihoZGV2LCAiQ29ycnVwdGVkIG1ydmwgaGVhZGVyIik7CisJCW1ydmxfc2VuZF9hY2soaHUsIE1SVkxfTkFLKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwltcnZsX3NlbmRfYWNrKGh1LCBNUlZMX0FDSyk7CisKKwlpZiAoIXRlc3RfYml0KFNUQVRFX0NISVBfVkVSX1BFTkRJTkcsICZtcnZsLT5mbGFncykpIHsKKwkJYnRfZGV2X2VycihoZGV2LCAiUmVjZWl2ZWQgdW5leHBlY3RlZCBjaGlwIHZlcnNpb24iKTsKKwkJZ290byBkb25lOworCX0KKworCW1ydmwtPmlkID0gdmVyc2lvbjsKKwltcnZsLT5yZXYgPSB2ZXJzaW9uID4+IDg7CisKKwlidF9kZXZfaW5mbyhoZGV2LCAiQ29udHJvbGxlciBpZCA9ICV4LCByZXYgPSAleCIsIG1ydmwtPmlkLCBtcnZsLT5yZXYpOworCisJY2xlYXJfYml0KFNUQVRFX0NISVBfVkVSX1BFTkRJTkcsICZtcnZsLT5mbGFncyk7CisJc21wX21iX19hZnRlcl9hdG9taWMoKTsKKwl3YWtlX3VwX2JpdCgmbXJ2bC0+ZmxhZ3MsIFNUQVRFX0NISVBfVkVSX1BFTkRJTkcpOworCitkb25lOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgSENJX1JFQ1ZfQ0hJUF9WRVIgXAorCS50eXBlID0gSENJX0NISVBfVkVSX1BLVCwgXAorCS5obGVuID0gSENJX01SVkxfUEtUX1NJWkUsIFwKKwkubG9mZiA9IDAsIFwKKwkubHNpemUgPSAwLCBcCisJLm1heGxlbiA9IEhDSV9NUlZMX1BLVF9TSVpFCisKKyNkZWZpbmUgSENJX1JFQ1ZfRldfUkVRIFwKKwkudHlwZSA9IEhDSV9GV19SRVFfUEtULCBcCisJLmhsZW4gPSBIQ0lfTVJWTF9QS1RfU0laRSwgXAorCS5sb2ZmID0gMCwgXAorCS5sc2l6ZSA9IDAsIFwKKwkubWF4bGVuID0gSENJX01SVkxfUEtUX1NJWkUKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoNF9yZWN2X3BrdCBtcnZsX3JlY3ZfcGt0c1tdID0geworCXsgSDRfUkVDVl9BQ0wsICAgICAgIC5yZWN2ID0gaGNpX3JlY3ZfZnJhbWUgICAgIH0sCisJeyBINF9SRUNWX1NDTywgICAgICAgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSAgICAgfSwKKwl7IEg0X1JFQ1ZfRVZFTlQsICAgICAucmVjdiA9IGhjaV9yZWN2X2ZyYW1lICAgICB9LAorCXsgSENJX1JFQ1ZfRldfUkVRLCAgIC5yZWN2ID0gbXJ2bF9yZWN2X2Z3X3JlcSAgIH0sCisJeyBIQ0lfUkVDVl9DSElQX1ZFUiwgLnJlY3YgPSBtcnZsX3JlY3ZfY2hpcF92ZXIgfSwKK307CisKK3N0YXRpYyBpbnQgbXJ2bF9yZWN2KHN0cnVjdCBoY2lfdWFydCAqaHUsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgbXJ2bF9kYXRhICptcnZsID0gaHUtPnByaXY7CisKKwlpZiAoIXRlc3RfYml0KEhDSV9VQVJUX1JFR0lTVEVSRUQsICZodS0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVVTkFUQ0g7CisKKwltcnZsLT5yeF9za2IgPSBoNF9yZWN2X2J1ZihodS0+aGRldiwgbXJ2bC0+cnhfc2tiLCBkYXRhLCBjb3VudCwKKwkJCQkgICAgbXJ2bF9yZWN2X3BrdHMsCisJCQkJICAgIEFSUkFZX1NJWkUobXJ2bF9yZWN2X3BrdHMpKTsKKwlpZiAoSVNfRVJSKG1ydmwtPnJ4X3NrYikpIHsKKwkJaW50IGVyciA9IFBUUl9FUlIobXJ2bC0+cnhfc2tiKTsKKwkJYnRfZGV2X2VycihodS0+aGRldiwgIkZyYW1lIHJlYXNzZW1ibHkgZmFpbGVkICglZCkiLCBlcnIpOworCQltcnZsLT5yeF9za2IgPSBOVUxMOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBtcnZsX2xvYWRfZmlybXdhcmUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGhjaV91YXJ0ICpodSA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKKwlzdHJ1Y3QgbXJ2bF9kYXRhICptcnZsID0gaHUtPnByaXY7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9IE5VTEw7CisJY29uc3QgdTggKmZ3X3B0ciwgKmZ3X21heDsKKwlpbnQgZXJyOworCisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIG5hbWUsICZoZGV2LT5kZXYpOworCWlmIChlcnIgPCAwKSB7CisJCWJ0X2Rldl9lcnIoaGRldiwgIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIGZpbGUgJXMiLCBuYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmd19wdHIgPSBmdy0+ZGF0YTsKKwlmd19tYXggPSBmdy0+ZGF0YSArIGZ3LT5zaXplOworCisJYnRfZGV2X2luZm8oaGRldiwgIkxvYWRpbmcgJXMiLCBuYW1lKTsKKworCXNldF9iaXQoU1RBVEVfRldfUkVRX1BFTkRJTkcsICZtcnZsLT5mbGFncyk7CisKKwl3aGlsZSAoZndfcHRyIDw9IGZ3X21heCkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCS8qIENvbnRyb2xsZXIgZHJpdmVzIHRoZSBmaXJtd2FyZSBsb2FkIGJ5IHNlbmRpbmcgZmlybXdhcmUKKwkJICogcmVxdWVzdCBwYWNrZXRzIGNvbnRhaW5pbmcgdGhlIGV4cGVjdGVkIGZyYWdtZW50IHNpemUuCisJCSAqLworCQllcnIgPSB3YWl0X29uX2JpdF90aW1lb3V0KCZtcnZsLT5mbGFncywgU1RBVEVfRldfUkVRX1BFTkRJTkcsCisJCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFLAorCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOworCQlpZiAoZXJyID09IDEpIHsKKwkJCWJ0X2Rldl9lcnIoaGRldiwgIkZpcm13YXJlIGxvYWQgaW50ZXJydXB0ZWQiKTsKKwkJCWVyciA9IC1FSU5UUjsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGVycikgeworCQkJYnRfZGV2X2VycihoZGV2LCAiRmlybXdhcmUgcmVxdWVzdCB0aW1lb3V0Iik7CisJCQllcnIgPSAtRVRJTUVET1VUOworCQkJYnJlYWs7CisJCX0KKworCQlidF9kZXZfZGJnKGhkZXYsICJGaXJtd2FyZSByZXF1ZXN0LCBleHBlY3RpbmcgJWQgYnl0ZXMiLAorCQkJICAgbXJ2bC0+dHhfbGVuKTsKKworCQlpZiAoZndfcHRyID09IGZ3X21heCkgeworCQkJLyogQ29udHJvbGxlciByZXF1ZXN0cyBhIG51bGwgc2l6ZSBvbmNlIGZpcm13YXJlIGlzCisJCQkgKiBmdWxseSBsb2FkZWQuIElmIGNvbnRyb2xsZXIgZXhwZWN0cyBtb3JlIGRhdGEsIHRoZXJlCisJCQkgKiBpcyBhbiBpc3N1ZS4KKwkJCSAqLworCQkJaWYgKCFtcnZsLT50eF9sZW4pIHsKKwkJCQlidF9kZXZfaW5mbyhoZGV2LCAiRmlybXdhcmUgbG9hZGluZyBjb21wbGV0ZSIpOworCQkJfSBlbHNlIHsKKwkJCQlidF9kZXZfZXJyKGhkZXYsICJGaXJtd2FyZSBsb2FkaW5nIGZhaWx1cmUiKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZndfcHRyICsgbXJ2bC0+dHhfbGVuID4gZndfbWF4KSB7CisJCQltcnZsLT50eF9sZW4gPSBmd19tYXggLSBmd19wdHI7CisJCQlidF9kZXZfZGJnKGhkZXYsICJBZGp1c3RpbmcgdHhfbGVuIHRvICVkIiwKKwkJCQkgICBtcnZsLT50eF9sZW4pOworCQl9CisKKwkJc2tiID0gYnRfc2tiX2FsbG9jKG1ydmwtPnR4X2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghc2tiKSB7CisJCQlidF9kZXZfZXJyKGhkZXYsICJGYWlsZWQgdG8gYWxsb2MgbWVtIGZvciBGVyBwYWNrZXQiKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCQlidF9jYihza2IpLT5wa3RfdHlwZSA9IE1SVkxfUkFXX0RBVEE7CisKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBtcnZsLT50eF9sZW4pLCBmd19wdHIsIG1ydmwtPnR4X2xlbik7CisJCWZ3X3B0ciArPSBtcnZsLT50eF9sZW47CisKKwkJc2V0X2JpdChTVEFURV9GV19SRVFfUEVORElORywgJm1ydmwtPmZsYWdzKTsKKworCQlza2JfcXVldWVfdGFpbCgmbXJ2bC0+cmF3cSwgc2tiKTsKKwkJaGNpX3VhcnRfdHhfd2FrZXVwKGh1KTsKKwl9CisKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1ydmxfc2V0dXAoc3RydWN0IGhjaV91YXJ0ICpodSkKK3sKKwlpbnQgZXJyOworCisJaGNpX3VhcnRfc2V0X2Zsb3dfY29udHJvbChodSwgdHJ1ZSk7CisKKwllcnIgPSBtcnZsX2xvYWRfZmlybXdhcmUoaHUtPmhkZXYsICJtcnZsL2hlbHBlcl91YXJ0XzMwMDAwMDAuYmluIik7CisJaWYgKGVycikgeworCQlidF9kZXZfZXJyKGh1LT5oZGV2LCAiVW5hYmxlIHRvIGRvd25sb2FkIGZpcm13YXJlIGhlbHBlciIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwloY2lfdWFydF9zZXRfYmF1ZHJhdGUoaHUsIDMwMDAwMDApOworCWhjaV91YXJ0X3NldF9mbG93X2NvbnRyb2woaHUsIGZhbHNlKTsKKworCWVyciA9IG1ydmxfbG9hZF9maXJtd2FyZShodS0+aGRldiwgIm1ydmwvdWFydDg4OTdfYnQuYmluIik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhjaV91YXJ0X3Byb3RvIG1ydmxfcHJvdG8gPSB7CisJLmlkCQk9IEhDSV9VQVJUX01SVkwsCisJLm5hbWUJCT0gIk1hcnZlbGwiLAorCS5pbml0X3NwZWVkCT0gMTE1MjAwLAorCS5vcGVuCQk9IG1ydmxfb3BlbiwKKwkuY2xvc2UJCT0gbXJ2bF9jbG9zZSwKKwkuZmx1c2gJCT0gbXJ2bF9mbHVzaCwKKwkuc2V0dXAJCT0gbXJ2bF9zZXR1cCwKKwkucmVjdgkJPSBtcnZsX3JlY3YsCisJLmVucXVldWUJPSBtcnZsX2VucXVldWUsCisJLmRlcXVldWUJPSBtcnZsX2RlcXVldWUsCit9OworCitpbnQgX19pbml0IG1ydmxfaW5pdCh2b2lkKQoreworCXJldHVybiBoY2lfdWFydF9yZWdpc3Rlcl9wcm90bygmbXJ2bF9wcm90byk7Cit9CisKK2ludCBfX2V4aXQgbXJ2bF9kZWluaXQodm9pZCkKK3sKKwlyZXR1cm4gaGNpX3VhcnRfdW5yZWdpc3Rlcl9wcm90bygmbXJ2bF9wcm90byk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfcWNhLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfcWNhLmMKaW5kZXggNjgzYzJiNi4uNmM4NjdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3FjYS5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9xY2EuYwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcWNhLT50eHEpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnFjYS0+dHhfd2FpdF9xKTsKIAlzcGluX2xvY2tfaW5pdCgmcWNhLT5oY2lfaWJzX2xvY2spOwotCXFjYS0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInFjYV93cSIpOworCXFjYS0+d29ya3F1ZXVlID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoInFjYV93cSIsIDApOwogCWlmICghcWNhLT53b3JrcXVldWUpIHsKIAkJQlRfRVJSKCJRQ0EgV29ya3F1ZXVlIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSIpOwogCQlrZnJlZShxY2EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VhcnQuaCBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV91YXJ0LmgKaW5kZXggODM5YmFkMS4uMDcwMTM5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VhcnQuaAorKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfdWFydC5oCkBAIC0zNSw3ICszNSw3IEBACiAjZGVmaW5lIEhDSVVBUlRHRVRGTEFHUwkJX0lPUignVScsIDIwNCwgaW50KQogCiAvKiBVQVJUIHByb3RvY29scyAqLwotI2RlZmluZSBIQ0lfVUFSVF9NQVhfUFJPVE8JMTAKKyNkZWZpbmUgSENJX1VBUlRfTUFYX1BST1RPCTEyCiAKICNkZWZpbmUgSENJX1VBUlRfSDQJMAogI2RlZmluZSBIQ0lfVUFSVF9CQ1NQCTEKQEAgLTQ3LDYgKzQ3LDggQEAKICNkZWZpbmUgSENJX1VBUlRfQkNNCTcKICNkZWZpbmUgSENJX1VBUlRfUUNBCTgKICNkZWZpbmUgSENJX1VBUlRfQUc2WFgJOQorI2RlZmluZSBIQ0lfVUFSVF9OT0tJQQkxMAorI2RlZmluZSBIQ0lfVUFSVF9NUlZMCTExCiAKICNkZWZpbmUgSENJX1VBUlRfUkFXX0RFVklDRQkwCiAjZGVmaW5lIEhDSV9VQVJUX1JFU0VUX09OX0lOSVQJMQpAQCAtMTg5LDMgKzE5MSw4IEBACiBpbnQgYWc2eHhfaW5pdCh2b2lkKTsKIGludCBhZzZ4eF9kZWluaXQodm9pZCk7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX01SVkwKK2ludCBtcnZsX2luaXQodm9pZCk7CitpbnQgbXJ2bF9kZWluaXQodm9pZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV92aGNpLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfdmhjaS5jCmluZGV4IDNmZjIyOWIuLmM0YTc1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV92aGNpLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3ZoY2kuYwpAQCAtMzc3LDIxICszNzcsNyBAQAogCS5mb3BzCT0gJnZoY2lfZm9wcywKIAkubWlub3IJPSBWSENJX01JTk9SLAogfTsKLQotc3RhdGljIGludCBfX2luaXQgdmhjaV9pbml0KHZvaWQpCi17Ci0JQlRfSU5GTygiVmlydHVhbCBIQ0kgZHJpdmVyIHZlciAlcyIsIFZFUlNJT04pOwotCi0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnZoY2lfbWlzY2Rldik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB2aGNpX2V4aXQodm9pZCkKLXsKLQltaXNjX2RlcmVnaXN0ZXIoJnZoY2lfbWlzY2Rldik7Ci19Ci0KLW1vZHVsZV9pbml0KHZoY2lfaW5pdCk7Ci1tb2R1bGVfZXhpdCh2aGNpX2V4aXQpOworbW9kdWxlX21pc2NfZGV2aWNlKHZoY2lfbWlzY2Rldik7CiAKIG1vZHVsZV9wYXJhbShhbXAsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhbXAsICJDcmVhdGUgQU1QIGNvbnRyb2xsZXIgZGV2aWNlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2J1cy9hcm0tY2NpLmMgYi9kcml2ZXJzL2J1cy9hcm0tY2NpLmMKaW5kZXggNTc1NTkwN2YuLjg5MDA4MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYnVzL2FybS1jY2kuYworKysgYi9kcml2ZXJzL2J1cy9hcm0tY2NpLmMKQEAgLTE0NCwxNSArMTQ0LDEyIEBACiAJaW50IG51bV9jbnRyczsKIAlhdG9taWNfdCBhY3RpdmVfZXZlbnRzOwogCXN0cnVjdCBtdXRleCByZXNlcnZlX211dGV4OwotCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKIAljcHVtYXNrX3QgY3B1czsKIH07CiAKICNkZWZpbmUgdG9fY2NpX3BtdShjKQkoY29udGFpbmVyX29mKGMsIHN0cnVjdCBjY2lfcG11LCBwbXUpKQogCi1zdGF0aWMgREVGSU5FX01VVEVYKGNjaV9wbXVfbXV0ZXgpOwotc3RhdGljIExJU1RfSEVBRChjY2lfcG11X2xpc3QpOwotCiBlbnVtIGNjaV9tb2RlbHMgewogI2lmZGVmIENPTkZJR19BUk1fQ0NJNDAwX1BNVQogCUNDSTQwMF9SMCwKQEAgLTU1MSw3ICs1NDgsNyBAQAogCUNDSTV4eF9HTE9CQUxfRVZFTlRfRVhUX0FUVFJfRU5UUlkoY2NpX3dycSwgMHhCKSwKIAlDQ0k1eHhfR0xPQkFMX0VWRU5UX0VYVF9BVFRSX0VOVFJZKGNjaV9zbm9vcF9jZF9ocywgMHhDKSwKIAlDQ0k1eHhfR0xPQkFMX0VWRU5UX0VYVF9BVFRSX0VOVFJZKGNjaV9ycV9zdGFsbF9hZGRyX2hhemFyZCwgMHhEKSwKLQlDQ0k1eHhfR0xPQkFMX0VWRU5UX0VYVF9BVFRSX0VOVFJZKGNjaV9zbm9wcF9ycV9zdGFsbF90dF9mdWxsLCAweEUpLAorCUNDSTV4eF9HTE9CQUxfRVZFTlRfRVhUX0FUVFJfRU5UUlkoY2NpX3Nub29wX3JxX3N0YWxsX3R0X2Z1bGwsIDB4RSksCiAJQ0NJNXh4X0dMT0JBTF9FVkVOVF9FWFRfQVRUUl9FTlRSWShjY2lfc25vb3BfcnFfdHptcDFfcHJvdCwgMHhGKSwKIAlOVUxMCiB9OwpAQCAtMTUwNiwyNSArMTUwMywyMSBAQAogCXJldHVybiBwZXJmX3BtdV9yZWdpc3RlcigmY2NpX3BtdS0+cG11LCBuYW1lLCAtMSk7CiB9CiAKLXN0YXRpYyBpbnQgY2NpX3BtdV9vZmZsaW5lX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIGludCBjY2lfcG11X29mZmxpbmVfY3B1KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQogewotCXN0cnVjdCBjY2lfcG11ICpjY2lfcG11OworCXN0cnVjdCBjY2lfcG11ICpjY2lfcG11ID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgY2NpX3BtdSwgbm9kZSk7CiAJdW5zaWduZWQgaW50IHRhcmdldDsKIAotCW11dGV4X2xvY2soJmNjaV9wbXVfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2NpX3BtdSwgJmNjaV9wbXVfbGlzdCwgZW50cnkpIHsKLQkJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsICZjY2lfcG11LT5jcHVzKSkKLQkJCWNvbnRpbnVlOwotCQl0YXJnZXQgPSBjcHVtYXNrX2FueV9idXQoY3B1X29ubGluZV9tYXNrLCBjcHUpOwotCQlpZiAodGFyZ2V0ID49IG5yX2NwdV9pZHMpCi0JCQljb250aW51ZTsKLQkJLyoKLQkJICogVE9ETzogbWlncmF0ZSBjb250ZXh0IG9uY2UgY29yZSByYWNlcyBvbiBldmVudC0+Y3R4IGhhdmUKLQkJICogYmVlbiBmaXhlZC4KLQkJICovCi0JCWNwdW1hc2tfc2V0X2NwdSh0YXJnZXQsICZjY2lfcG11LT5jcHVzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjY2lfcG11X211dGV4KTsKKwlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJmNjaV9wbXUtPmNwdXMpKQorCQlyZXR1cm4gMDsKKwl0YXJnZXQgPSBjcHVtYXNrX2FueV9idXQoY3B1X29ubGluZV9tYXNrLCBjcHUpOworCWlmICh0YXJnZXQgPj0gbnJfY3B1X2lkcykKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBUT0RPOiBtaWdyYXRlIGNvbnRleHQgb25jZSBjb3JlIHJhY2VzIG9uIGV2ZW50LT5jdHggaGF2ZQorCSAqIGJlZW4gZml4ZWQuCisJICovCisJY3B1bWFza19zZXRfY3B1KHRhcmdldCwgJmNjaV9wbXUtPmNwdXMpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzY4LDEwICsxNzYxLDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JbXV0ZXhfbG9jaygmY2NpX3BtdV9tdXRleCk7Ci0JbGlzdF9hZGQoJmNjaV9wbXUtPmVudHJ5LCAmY2NpX3BtdV9saXN0KTsKLQltdXRleF91bmxvY2soJmNjaV9wbXVfbXV0ZXgpOwotCisJY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fQ0NJX09OTElORSwKKwkJCQkJICZjY2lfcG11LT5ub2RlKTsKIAlwcl9pbmZvKCJBUk0gJXMgUE1VIGRyaXZlciBwcm9iZWQiLCBjY2lfcG11LT5tb2RlbC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xODA0LDkgKzE3OTUsOSBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX0NDSV9PTkxJTkUsCi0JCQkJCSJBUF9QRVJGX0FSTV9DQ0lfT05MSU5FIiwgTlVMTCwKLQkJCQkJY2NpX3BtdV9vZmZsaW5lX2NwdSk7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfUEVSRl9BUk1fQ0NJX09OTElORSwKKwkJCQkgICAgICAiQVBfUEVSRl9BUk1fQ0NJX09OTElORSIsIE5VTEwsCisJCQkJICAgICAgY2NpX3BtdV9vZmZsaW5lX2NwdSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9idXMvYXJtLWNjbi5jIGIvZHJpdmVycy9idXMvYXJtLWNjbi5jCmluZGV4IDk3YTkxODUuLmQxMDc0ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYnVzL2FybS1jY24uYworKysgYi9kcml2ZXJzL2J1cy9hcm0tY2NuLmMKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCXN0cnVjdCBocnRpbWVyIGhydGltZXI7CiAKIAljcHVtYXNrX3QgY3B1OwotCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKIAogCXN0cnVjdCBwbXUgcG11OwogfTsKQEAgLTE4NywxMSArMTg3LDkgQEAKIAlzdHJ1Y3QgYXJtX2Njbl9jb21wb25lbnQgKnhwOwogCiAJc3RydWN0IGFybV9jY25fZHQgZHQ7CisJaW50IG1uX2lkOwogfTsKIAotc3RhdGljIERFRklORV9NVVRFWChhcm1fY2NuX211dGV4KTsKLXN0YXRpYyBMSVNUX0hFQUQoYXJtX2Njbl9saXN0KTsKLQogc3RhdGljIGludCBhcm1fY2NuX25vZGVfdG9feHAoaW50IG5vZGUpCiB7CiAJcmV0dXJuIG5vZGUgLyBDQ05fTlVNX1hQX1BPUlRTOwpAQCAtMjEyLDYgKzIxMCw3IEBACiAjZGVmaW5lIENDTl9DT05GSUdfVFlQRShfY29uZmlnKQkoKChfY29uZmlnKSA+PiA4KSAmIDB4ZmYpCiAjZGVmaW5lIENDTl9DT05GSUdfRVZFTlQoX2NvbmZpZykJKCgoX2NvbmZpZykgPj4gMTYpICYgMHhmZikKICNkZWZpbmUgQ0NOX0NPTkZJR19QT1JUKF9jb25maWcpCSgoKF9jb25maWcpID4+IDI0KSAmIDB4MykKKyNkZWZpbmUgQ0NOX0NPTkZJR19CVVMoX2NvbmZpZykJCSgoKF9jb25maWcpID4+IDI0KSAmIDB4MykKICNkZWZpbmUgQ0NOX0NPTkZJR19WQyhfY29uZmlnKQkJKCgoX2NvbmZpZykgPj4gMjYpICYgMHg3KQogI2RlZmluZSBDQ05fQ09ORklHX0RJUihfY29uZmlnKQkJKCgoX2NvbmZpZykgPj4gMjkpICYgMHgxKQogI2RlZmluZSBDQ05fQ09ORklHX01BU0soX2NvbmZpZykJKCgoX2NvbmZpZykgPj4gMzApICYgMHhmKQpAQCAtMjQxLDYgKzI0MCw3IEBACiBzdGF0aWMgQ0NOX0ZPUk1BVF9BVFRSKHR5cGUsICJjb25maWc6OC0xNSIpOwogc3RhdGljIENDTl9GT1JNQVRfQVRUUihldmVudCwgImNvbmZpZzoxNi0yMyIpOwogc3RhdGljIENDTl9GT1JNQVRfQVRUUihwb3J0LCAiY29uZmlnOjI0LTI1Iik7CitzdGF0aWMgQ0NOX0ZPUk1BVF9BVFRSKGJ1cywgImNvbmZpZzoyNC0yNSIpOwogc3RhdGljIENDTl9GT1JNQVRfQVRUUih2YywgImNvbmZpZzoyNi0yOCIpOwogc3RhdGljIENDTl9GT1JNQVRfQVRUUihkaXIsICJjb25maWc6MjktMjkiKTsKIHN0YXRpYyBDQ05fRk9STUFUX0FUVFIobWFzaywgImNvbmZpZzozMC0zMyIpOwpAQCAtMjUzLDYgKzI1Myw3IEBACiAJJmFybV9jY25fcG11X2Zvcm1hdF9hdHRyX3R5cGUuYXR0ci5hdHRyLAogCSZhcm1fY2NuX3BtdV9mb3JtYXRfYXR0cl9ldmVudC5hdHRyLmF0dHIsCiAJJmFybV9jY25fcG11X2Zvcm1hdF9hdHRyX3BvcnQuYXR0ci5hdHRyLAorCSZhcm1fY2NuX3BtdV9mb3JtYXRfYXR0cl9idXMuYXR0ci5hdHRyLAogCSZhcm1fY2NuX3BtdV9mb3JtYXRfYXR0cl92Yy5hdHRyLmF0dHIsCiAJJmFybV9jY25fcG11X2Zvcm1hdF9hdHRyX2Rpci5hdHRyLmF0dHIsCiAJJmFybV9jY25fcG11X2Zvcm1hdF9hdHRyX21hc2suYXR0ci5hdHRyLApAQCAtMzI4LDYgKzMyOSw3IEBACiBzdGF0aWMgc3NpemVfdCBhcm1fY2NuX3BtdV9ldmVudF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKKwlzdHJ1Y3QgYXJtX2NjbiAqY2NuID0gcG11X3RvX2FybV9jY24oZGV2X2dldF9kcnZkYXRhKGRldikpOwogCXN0cnVjdCBhcm1fY2NuX3BtdV9ldmVudCAqZXZlbnQgPSBjb250YWluZXJfb2YoYXR0ciwKIAkJCXN0cnVjdCBhcm1fY2NuX3BtdV9ldmVudCwgYXR0cik7CiAJc3NpemVfdCByZXM7CkBAIC0zNDksMTAgKzM1MSwxNyBAQAogCQlicmVhazsKIAljYXNlIENDTl9UWVBFX1hQOgogCQlyZXMgKz0gc25wcmludGYoYnVmICsgcmVzLCBQQUdFX1NJWkUgLSByZXMsCi0JCQkJIix4cD0/LHBvcnQ9Pyx2Yz0/LGRpcj0/Iik7CisJCQkJIix4cD0/LHZjPT8iKTsKIAkJaWYgKGV2ZW50LT5ldmVudCA9PSBDQ05fRVZFTlRfV0FUQ0hQT0lOVCkKIAkJCXJlcyArPSBzbnByaW50ZihidWYgKyByZXMsIFBBR0VfU0laRSAtIHJlcywKLQkJCQkJIixjbXBfbD0/LGNtcF9oPT8sbWFzaz0/Iik7CisJCQkJCSIscG9ydD0/LGRpcj0/LGNtcF9sPT8sY21wX2g9PyxtYXNrPT8iKTsKKwkJZWxzZQorCQkJcmVzICs9IHNucHJpbnRmKGJ1ZiArIHJlcywgUEFHRV9TSVpFIC0gcmVzLAorCQkJCQkiLGJ1cz0/Iik7CisKKwkJYnJlYWs7CisJY2FzZSBDQ05fVFlQRV9NTjoKKwkJcmVzICs9IHNucHJpbnRmKGJ1ZiArIHJlcywgUEFHRV9TSVpFIC0gcmVzLCAiLG5vZGU9JWQiLCBjY24tPm1uX2lkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmVzICs9IHNucHJpbnRmKGJ1ZiArIHJlcywgUEFHRV9TSVpFIC0gcmVzLCAiLG5vZGU9PyIpOwpAQCAtMzgzLDkgKzM5Miw5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYXJtX2Njbl9wbXVfZXZlbnQgYXJtX2Njbl9wbXVfZXZlbnRzW10gPSB7Ci0JQ0NOX0VWRU5UX01OKGVvYmFycmllciwgImRpcj0wLHZjPTAsY21wX2g9MHgxYzAwIiwgQ0NOX0lEWF9NQVNLX09QQ09ERSksCi0JQ0NOX0VWRU5UX01OKGVjYmFycmllciwgImRpcj0wLHZjPTAsY21wX2g9MHgxZTAwIiwgQ0NOX0lEWF9NQVNLX09QQ09ERSksCi0JQ0NOX0VWRU5UX01OKGR2bW9wLCAiZGlyPTAsdmM9MCxjbXBfaD0weDI4MDAiLCBDQ05fSURYX01BU0tfT1BDT0RFKSwKKwlDQ05fRVZFTlRfTU4oZW9iYXJyaWVyLCAiZGlyPTEsdmM9MCxjbXBfaD0weDFjMDAiLCBDQ05fSURYX01BU0tfT1BDT0RFKSwKKwlDQ05fRVZFTlRfTU4oZWNiYXJyaWVyLCAiZGlyPTEsdmM9MCxjbXBfaD0weDFlMDAiLCBDQ05fSURYX01BU0tfT1BDT0RFKSwKKwlDQ05fRVZFTlRfTU4oZHZtb3AsICJkaXI9MSx2Yz0wLGNtcF9oPTB4MjgwMCIsIENDTl9JRFhfTUFTS19PUENPREUpLAogCUNDTl9FVkVOVF9ITkkodHhkYXRmbGl0cywgImRpcj0xLHZjPTMiLCBDQ05fSURYX01BU0tfQU5ZKSwKIAlDQ05fRVZFTlRfSE5JKHJ4ZGF0ZmxpdHMsICJkaXI9MCx2Yz0zIiwgQ0NOX0lEWF9NQVNLX0FOWSksCiAJQ0NOX0VWRU5UX0hOSSh0eHJlcWZsaXRzLCAiZGlyPTEsdmM9MCIsIENDTl9JRFhfTUFTS19BTlkpLApAQCAtNzMzLDkgKzc0MiwxMCBAQAogCiAJaWYgKGhhc19icmFuY2hfc3RhY2soZXZlbnQpIHx8IGV2ZW50LT5hdHRyLmV4Y2x1ZGVfdXNlciB8fAogCQkJZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWwgfHwgZXZlbnQtPmF0dHIuZXhjbHVkZV9odiB8fAotCQkJZXZlbnQtPmF0dHIuZXhjbHVkZV9pZGxlKSB7CisJCQlldmVudC0+YXR0ci5leGNsdWRlX2lkbGUgfHwgZXZlbnQtPmF0dHIuZXhjbHVkZV9ob3N0IHx8CisJCQlldmVudC0+YXR0ci5leGNsdWRlX2d1ZXN0KSB7CiAJCWRldl93YXJuKGNjbi0+ZGV2LCAiQ2FuJ3QgZXhjbHVkZSBleGVjdXRpb24gbGV2ZWxzIVxuIik7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGV2ZW50LT5jcHUgPCAwKSB7CkBAIC03NTksNiArNzY5LDEyIEBACiAKIAkvKiBWYWxpZGF0ZSBub2RlL3hwIHZzIHRvcG9sb2d5ICovCiAJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBDQ05fVFlQRV9NTjoKKwkJaWYgKG5vZGVfeHAgIT0gY2NuLT5tbl9pZCkgeworCQkJZGV2X3dhcm4oY2NuLT5kZXYsICJJbnZhbGlkIE1OIElEICVkIVxuIiwgbm9kZV94cCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKIAljYXNlIENDTl9UWVBFX1hQOgogCQlpZiAobm9kZV94cCA+PSBjY24tPm51bV94cHMpIHsKIAkJCWRldl93YXJuKGNjbi0+ZGV2LCAiSW52YWxpZCBYUCBJRCAlZCFcbiIsIG5vZGVfeHApOwpAQCAtODg2LDYgKzkwMiwxMCBAQAogCXN0cnVjdCBhcm1fY2NuX2NvbXBvbmVudCAqeHA7CiAJdTMyIHZhbCwgZHRfY2ZnOwogCisJLyogTm90aGluZyB0byBkbyBmb3IgY3ljbGUgY291bnRlciAqLworCWlmIChody0+aWR4ID09IENDTl9JRFhfUE1VX0NZQ0xFX0NPVU5URVIpCisJCXJldHVybjsKKwogCWlmIChDQ05fQ09ORklHX1RZUEUoZXZlbnQtPmF0dHIuY29uZmlnKSA9PSBDQ05fVFlQRV9YUCkKIAkJeHAgPSAmY2NuLT54cFtDQ05fQ09ORklHX1hQKGV2ZW50LT5hdHRyLmNvbmZpZyldOwogCWVsc2UKQEAgLTkxNywzOCArOTM3LDE3IEBACiAJCQlhcm1fY2NuX3BtdV9yZWFkX2NvdW50ZXIoY2NuLCBody0+aWR4KSk7CiAJaHctPnN0YXRlID0gMDsKIAotCS8qCi0JICogUGluIHRoZSB0aW1lciwgc28gdGhhdCB0aGUgb3ZlcmZsb3dzIGFyZSBoYW5kbGVkIGJ5IHRoZSBjaG9zZW4KLQkgKiBldmVudC0+Y3B1ICh0aGlzIGlzIHRoZSBzYW1lIG9uZSBhcyBwcmVzZW50ZWQgaW4gImNwdW1hc2siCi0JICogYXR0cmlidXRlKS4KLQkgKi8KLQlpZiAoIWNjbi0+aXJxKQotCQlocnRpbWVyX3N0YXJ0KCZjY24tPmR0LmhydGltZXIsIGFybV9jY25fcG11X3RpbWVyX3BlcmlvZCgpLAotCQkJCUhSVElNRVJfTU9ERV9SRUxfUElOTkVEKTsKLQogCS8qIFNldCB0aGUgRFQgYnVzIGlucHV0LCBlbmdhZ2luZyB0aGUgY291bnRlciAqLwogCWFybV9jY25fcG11X3hwX2R0X2NvbmZpZyhldmVudCwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFybV9jY25fcG11X2V2ZW50X3N0b3Aoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGFybV9jY24gKmNjbiA9IHBtdV90b19hcm1fY2NuKGV2ZW50LT5wbXUpOwogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpodyA9ICZldmVudC0+aHc7Ci0JdTY0IHRpbWVvdXQ7CiAKIAkvKiBEaXNhYmxlIGNvdW50aW5nLCBzZXR0aW5nIHRoZSBEVCBidXMgdG8gcGFzcy10aHJvdWdoIG1vZGUgKi8KIAlhcm1fY2NuX3BtdV94cF9kdF9jb25maWcoZXZlbnQsIDApOwogCi0JaWYgKCFjY24tPmlycSkKLQkJaHJ0aW1lcl9jYW5jZWwoJmNjbi0+ZHQuaHJ0aW1lcik7Ci0KLQkvKiBMZXQgdGhlIERUIGJ1cyBkcmFpbiAqLwotCXRpbWVvdXQgPSBhcm1fY2NuX3BtdV9yZWFkX2NvdW50ZXIoY2NuLCBDQ05fSURYX1BNVV9DWUNMRV9DT1VOVEVSKSArCi0JCQljY24tPm51bV94cHM7Ci0Jd2hpbGUgKGFybV9jY25fcG11X3JlYWRfY291bnRlcihjY24sIENDTl9JRFhfUE1VX0NZQ0xFX0NPVU5URVIpIDwKLQkJCXRpbWVvdXQpCi0JCWNwdV9yZWxheCgpOwotCiAJaWYgKGZsYWdzICYgUEVSRl9FRl9VUERBVEUpCiAJCWFybV9jY25fcG11X2V2ZW50X3VwZGF0ZShldmVudCk7CiAKQEAgLTk4OCw3ICs5ODcsNyBAQAogCiAJLyogQ29tcGFyaXNvbiB2YWx1ZXMgKi8KIAl3cml0ZWwoY21wX2wgJiAweGZmZmZmZmZmLCBzb3VyY2UtPmJhc2UgKyBDQ05fWFBfRFRfQ01QX1ZBTF9MKHdwKSk7Ci0Jd3JpdGVsKChjbXBfbCA+PiAzMikgJiAweGVmZmZmZmZmLAorCXdyaXRlbCgoY21wX2wgPj4gMzIpICYgMHg3ZmZmZmZmZiwKIAkJCXNvdXJjZS0+YmFzZSArIENDTl9YUF9EVF9DTVBfVkFMX0wod3ApICsgNCk7CiAJd3JpdGVsKGNtcF9oICYgMHhmZmZmZmZmZiwgc291cmNlLT5iYXNlICsgQ0NOX1hQX0RUX0NNUF9WQUxfSCh3cCkpOwogCXdyaXRlbCgoY21wX2ggPj4gMzIpICYgMHgwZmZmZmZmZiwKQEAgLTk5Niw3ICs5OTUsNyBAQAogCiAJLyogTWFzayAqLwogCXdyaXRlbChtYXNrX2wgJiAweGZmZmZmZmZmLCBzb3VyY2UtPmJhc2UgKyBDQ05fWFBfRFRfQ01QX01BU0tfTCh3cCkpOwotCXdyaXRlbCgobWFza19sID4+IDMyKSAmIDB4ZWZmZmZmZmYsCisJd3JpdGVsKChtYXNrX2wgPj4gMzIpICYgMHg3ZmZmZmZmZiwKIAkJCXNvdXJjZS0+YmFzZSArIENDTl9YUF9EVF9DTVBfTUFTS19MKHdwKSArIDQpOwogCXdyaXRlbChtYXNrX2ggJiAweGZmZmZmZmZmLCBzb3VyY2UtPmJhc2UgKyBDQ05fWFBfRFRfQ01QX01BU0tfSCh3cCkpOwogCXdyaXRlbCgobWFza19oID4+IDMyKSAmIDB4MGZmZmZmZmYsCkBAIC0xMDE0LDcgKzEwMTMsNyBAQAogCWh3LT5ldmVudF9iYXNlID0gQ0NOX1hQX0RUX0NPTkZJR19fRFRfQ0ZHX19YUF9QTVVfRVZFTlQoaHctPmNvbmZpZ19iYXNlKTsKIAogCWlkID0gKENDTl9DT05GSUdfVkMoZXZlbnQtPmF0dHIuY29uZmlnKSA8PCA0KSB8Ci0JCQkoQ0NOX0NPTkZJR19QT1JUKGV2ZW50LT5hdHRyLmNvbmZpZykgPDwgMykgfAorCQkJKENDTl9DT05GSUdfQlVTKGV2ZW50LT5hdHRyLmNvbmZpZykgPDwgMykgfAogCQkJKENDTl9DT05GSUdfRVZFTlQoZXZlbnQtPmF0dHIuY29uZmlnKSA8PCAwKTsKIAogCXZhbCA9IHJlYWRsKHNvdXJjZS0+YmFzZSArIENDTl9YUF9QTVVfRVZFTlRfU0VMKTsKQEAgLTEwOTksMTUgKzEwOTgsMzEgQEAKIAlzcGluX3VubG9jaygmY2NuLT5kdC5jb25maWdfbG9jayk7CiB9CiAKK3N0YXRpYyBpbnQgYXJtX2Njbl9wbXVfYWN0aXZlX2NvdW50ZXJzKHN0cnVjdCBhcm1fY2NuICpjY24pCit7CisJcmV0dXJuIGJpdG1hcF93ZWlnaHQoY2NuLT5kdC5wbXVfY291bnRlcnNfbWFzaywKKwkJCSAgICAgQ0NOX05VTV9QTVVfRVZFTlRfQ09VTlRFUlMgKyAxKTsKK30KKwogc3RhdGljIGludCBhcm1fY2NuX3BtdV9ldmVudF9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHcgPSAmZXZlbnQtPmh3OworCXN0cnVjdCBhcm1fY2NuICpjY24gPSBwbXVfdG9fYXJtX2NjbihldmVudC0+cG11KTsKIAogCWVyciA9IGFybV9jY25fcG11X2V2ZW50X2FsbG9jKGV2ZW50KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCisJLyoKKwkgKiBQaW4gdGhlIHRpbWVyLCBzbyB0aGF0IHRoZSBvdmVyZmxvd3MgYXJlIGhhbmRsZWQgYnkgdGhlIGNob3NlbgorCSAqIGV2ZW50LT5jcHUgKHRoaXMgaXMgdGhlIHNhbWUgb25lIGFzIHByZXNlbnRlZCBpbiAiY3B1bWFzayIKKwkgKiBhdHRyaWJ1dGUpLgorCSAqLworCWlmICghY2NuLT5pcnEgJiYgYXJtX2Njbl9wbXVfYWN0aXZlX2NvdW50ZXJzKGNjbikgPT0gMSkKKwkJaHJ0aW1lcl9zdGFydCgmY2NuLT5kdC5ocnRpbWVyLCBhcm1fY2NuX3BtdV90aW1lcl9wZXJpb2QoKSwKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9SRUxfUElOTkVEKTsKKwogCWFybV9jY25fcG11X2V2ZW50X2NvbmZpZyhldmVudCk7CiAKIAlody0+c3RhdGUgPSBQRVJGX0hFU19TVE9QUEVEOwpAQCAtMTEyMCw5ICsxMTM1LDE0IEBACiAKIHN0YXRpYyB2b2lkIGFybV9jY25fcG11X2V2ZW50X2RlbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBmbGFncykKIHsKKwlzdHJ1Y3QgYXJtX2NjbiAqY2NuID0gcG11X3RvX2FybV9jY24oZXZlbnQtPnBtdSk7CisKIAlhcm1fY2NuX3BtdV9ldmVudF9zdG9wKGV2ZW50LCBQRVJGX0VGX1VQREFURSk7CiAKIAlhcm1fY2NuX3BtdV9ldmVudF9yZWxlYXNlKGV2ZW50KTsKKworCWlmICghY2NuLT5pcnEgJiYgYXJtX2Njbl9wbXVfYWN0aXZlX2NvdW50ZXJzKGNjbikgPT0gMCkKKwkJaHJ0aW1lcl9jYW5jZWwoJmNjbi0+ZHQuaHJ0aW1lcik7CiB9CiAKIHN0YXRpYyB2b2lkIGFybV9jY25fcG11X2V2ZW50X3JlYWQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQpAQCAtMTEzMCw2ICsxMTUwLDI0IEBACiAJYXJtX2Njbl9wbXVfZXZlbnRfdXBkYXRlKGV2ZW50KTsKIH0KIAorc3RhdGljIHZvaWQgYXJtX2Njbl9wbXVfZW5hYmxlKHN0cnVjdCBwbXUgKnBtdSkKK3sKKwlzdHJ1Y3QgYXJtX2NjbiAqY2NuID0gcG11X3RvX2FybV9jY24ocG11KTsKKworCXUzMiB2YWwgPSByZWFkbChjY24tPmR0LmJhc2UgKyBDQ05fRFRfUE1DUik7CisJdmFsIHw9IENDTl9EVF9QTUNSX19QTVVfRU47CisJd3JpdGVsKHZhbCwgY2NuLT5kdC5iYXNlICsgQ0NOX0RUX1BNQ1IpOworfQorCitzdGF0aWMgdm9pZCBhcm1fY2NuX3BtdV9kaXNhYmxlKHN0cnVjdCBwbXUgKnBtdSkKK3sKKwlzdHJ1Y3QgYXJtX2NjbiAqY2NuID0gcG11X3RvX2FybV9jY24ocG11KTsKKworCXUzMiB2YWwgPSByZWFkbChjY24tPmR0LmJhc2UgKyBDQ05fRFRfUE1DUik7CisJdmFsICY9IH5DQ05fRFRfUE1DUl9fUE1VX0VOOworCXdyaXRlbCh2YWwsIGNjbi0+ZHQuYmFzZSArIENDTl9EVF9QTUNSKTsKK30KKwogc3RhdGljIGlycXJldHVybl90IGFybV9jY25fcG11X292ZXJmbG93X2hhbmRsZXIoc3RydWN0IGFybV9jY25fZHQgKmR0KQogewogCXUzMiBwbW92c3IgPSByZWFkbChkdC0+YmFzZSArIENDTl9EVF9QTU9WU1IpOwpAQCAtMTE3MywzMCArMTIxMSwyNCBAQAogfQogCiAKLXN0YXRpYyBpbnQgYXJtX2Njbl9wbXVfb2ZmbGluZV9jcHUodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyBpbnQgYXJtX2Njbl9wbXVfb2ZmbGluZV9jcHUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCiB7Ci0Jc3RydWN0IGFybV9jY25fZHQgKmR0OworCXN0cnVjdCBhcm1fY2NuX2R0ICpkdCA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IGFybV9jY25fZHQsIG5vZGUpOworCXN0cnVjdCBhcm1fY2NuICpjY24gPSBjb250YWluZXJfb2YoZHQsIHN0cnVjdCBhcm1fY2NuLCBkdCk7CiAJdW5zaWduZWQgaW50IHRhcmdldDsKIAotCW11dGV4X2xvY2soJmFybV9jY25fbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZHQsICZhcm1fY2NuX2xpc3QsIGVudHJ5KSB7Ci0JCXN0cnVjdCBhcm1fY2NuICpjY24gPSBjb250YWluZXJfb2YoZHQsIHN0cnVjdCBhcm1fY2NuLCBkdCk7Ci0KLQkJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsICZkdC0+Y3B1KSkKLQkJCWNvbnRpbnVlOwotCQl0YXJnZXQgPSBjcHVtYXNrX2FueV9idXQoY3B1X29ubGluZV9tYXNrLCBjcHUpOwotCQlpZiAodGFyZ2V0ID49IG5yX2NwdV9pZHMpCi0JCQljb250aW51ZTsKLQkJcGVyZl9wbXVfbWlncmF0ZV9jb250ZXh0KCZkdC0+cG11LCBjcHUsIHRhcmdldCk7Ci0JCWNwdW1hc2tfc2V0X2NwdSh0YXJnZXQsICZkdC0+Y3B1KTsKLQkJaWYgKGNjbi0+aXJxKQotCQkJV0FSTl9PTihpcnFfc2V0X2FmZmluaXR5X2hpbnQoY2NuLT5pcnEsICZkdC0+Y3B1KSAhPSAwKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZhcm1fY2NuX211dGV4KTsKKwlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJmR0LT5jcHUpKQorCQlyZXR1cm4gMDsKKwl0YXJnZXQgPSBjcHVtYXNrX2FueV9idXQoY3B1X29ubGluZV9tYXNrLCBjcHUpOworCWlmICh0YXJnZXQgPj0gbnJfY3B1X2lkcykKKwkJcmV0dXJuIDA7CisJcGVyZl9wbXVfbWlncmF0ZV9jb250ZXh0KCZkdC0+cG11LCBjcHUsIHRhcmdldCk7CisJY3B1bWFza19zZXRfY3B1KHRhcmdldCwgJmR0LT5jcHUpOworCWlmIChjY24tPmlycSkKKwkJV0FSTl9PTihpcnFfc2V0X2FmZmluaXR5X2hpbnQoY2NuLT5pcnEsICZkdC0+Y3B1KSAhPSAwKTsKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgREVGSU5FX0lEQShhcm1fY2NuX3BtdV9pZGEpOwogCiBzdGF0aWMgaW50IGFybV9jY25fcG11X2luaXQoc3RydWN0IGFybV9jY24gKmNjbikKQEAgLTEyNTIsNiArMTI4NCw4IEBACiAJCS5zdGFydCA9IGFybV9jY25fcG11X2V2ZW50X3N0YXJ0LAogCQkuc3RvcCA9IGFybV9jY25fcG11X2V2ZW50X3N0b3AsCiAJCS5yZWFkID0gYXJtX2Njbl9wbXVfZXZlbnRfcmVhZCwKKwkJLnBtdV9lbmFibGUgPSBhcm1fY2NuX3BtdV9lbmFibGUsCisJCS5wbXVfZGlzYWJsZSA9IGFybV9jY25fcG11X2Rpc2FibGUsCiAJfTsKIAogCS8qIE5vIG92ZXJmbG93IGludGVycnVwdD8gSGF2ZSB0byB1c2UgYSB0aW1lciBpbnN0ZWFkLiAqLwpAQCAtMTI3OCw5ICsxMzEyLDggQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yX3BtdV9yZWdpc3RlcjsKIAotCW11dGV4X2xvY2soJmFybV9jY25fbXV0ZXgpOwotCWxpc3RfYWRkKCZjY24tPmR0LmVudHJ5LCAmYXJtX2Njbl9saXN0KTsKLQltdXRleF91bmxvY2soJmFybV9jY25fbXV0ZXgpOworCWNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX0NDTl9PTkxJTkUsCisJCQkJCSAmY2NuLT5kdC5ub2RlKTsKIAlyZXR1cm4gMDsKIAogZXJyb3JfcG11X3JlZ2lzdGVyOgpAQCAtMTI5NiwxMCArMTMyOSw4IEBACiB7CiAJaW50IGk7CiAKLQltdXRleF9sb2NrKCZhcm1fY2NuX211dGV4KTsKLQlsaXN0X2RlbCgmY2NuLT5kdC5lbnRyeSk7Ci0JbXV0ZXhfdW5sb2NrKCZhcm1fY2NuX211dGV4KTsKLQorCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX0FQX1BFUkZfQVJNX0NDTl9PTkxJTkUsCisJCQkJCSAgICAmY2NuLT5kdC5ub2RlKTsKIAlpZiAoY2NuLT5pcnEpCiAJCWlycV9zZXRfYWZmaW5pdHlfaGludChjY24tPmlycSwgTlVMTCk7CiAJZm9yIChpID0gMDsgaSA8IGNjbi0+bnVtX3hwczsgaSsrKQpAQCAtMTM2MSw2ICsxMzkyLDggQEAKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgQ0NOX1RZUEVfTU46CisJCWNjbi0+bW5faWQgPSBpZDsKKwkJcmV0dXJuIDA7CiAJY2FzZSBDQ05fVFlQRV9EVDoKIAkJcmV0dXJuIDA7CiAJY2FzZSBDQ05fVFlQRV9YUDoKQEAgLTE0NzEsOCArMTUwNCw5IEBACiAJCS8qIENhbiBzZXQgJ2Rpc2FibGUnIGJpdHMsIHNvIGNhbiBhY2tub3dsZWRnZSBpbnRlcnJ1cHRzICovCiAJCXdyaXRlbChDQ05fTU5fRVJSSU5UX1NUQVRVU19fUE1VX0VWRU5UU19fRU5BQkxFLAogCQkJCWNjbi0+YmFzZSArIENDTl9NTl9FUlJJTlRfU1RBVFVTKTsKLQkJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShjY24tPmRldiwgaXJxLCBhcm1fY2NuX2lycV9oYW5kbGVyLCAwLAotCQkJCWRldl9uYW1lKGNjbi0+ZGV2KSwgY2NuKTsKKwkJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShjY24tPmRldiwgaXJxLCBhcm1fY2NuX2lycV9oYW5kbGVyLAorCQkJCSAgICAgICBJUlFGX05PQkFMQU5DSU5HIHwgSVJRRl9OT19USFJFQUQsCisJCQkJICAgICAgIGRldl9uYW1lKGNjbi0+ZGV2KSwgY2NuKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAKQEAgLTE1MjcsOSArMTU2MSw5IEBACiB7CiAJaW50IGksIHJldDsKIAotCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fQ0NOX09OTElORSwKLQkJCQkJIkFQX1BFUkZfQVJNX0NDTl9PTkxJTkUiLCBOVUxMLAotCQkJCQlhcm1fY2NuX3BtdV9vZmZsaW5lX2NwdSk7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfUEVSRl9BUk1fQ0NOX09OTElORSwKKwkJCQkgICAgICAiQVBfUEVSRl9BUk1fQ0NOX09OTElORSIsIE5VTEwsCisJCQkJICAgICAgYXJtX2Njbl9wbXVfb2ZmbGluZV9jcHUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTE1NDEsNyArMTU3NSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhcm1fY2NuX2V4aXQodm9pZCkKIHsKLQljcHVocF9yZW1vdmVfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9QRVJGX0FSTV9DQ05fT05MSU5FKTsKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoQ1BVSFBfQVBfUEVSRl9BUk1fQ0NOX09OTElORSk7CiAJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFybV9jY25fZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9idXMvbWlwc19jZG1tLmMgYi9kcml2ZXJzL2J1cy9taXBzX2NkbW0uYwppbmRleCBjYWQ0OWJjLi4xYjE0MjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2J1cy9taXBzX2NkbW0uYworKysgYi9kcml2ZXJzL2J1cy9taXBzX2NkbW0uYwpAQCAtNTk2LDE5ICs1OTYsMjAgQEAKIEJVSUxEX1BFUkRFVl9IRUxQRVIoY3B1X3VwKSAgICAgICAgIC8qIGludCBtaXBzX2NkbW1fY3B1X3VwX2hlbHBlciguLi4pICovCiAKIC8qKgotICogbWlwc19jZG1tX2J1c19kb3duKCkgLSBUZWFyIGRvd24gdGhlIENETU0gYnVzLgotICogQGRhdGE6CVBvaW50ZXIgdG8gdW5zaWduZWQgaW50IENQVSBudW1iZXIuCisgKiBtaXBzX2NkbW1fY3B1X2Rvd25fcHJlcCgpIC0gQ2FsbGJhY2sgZm9yIENQVUhQIERPV05fUFJFUDoKKyAqCQkJICAgICAgIFRlYXIgZG93biB0aGUgQ0RNTSBidXMuCisgKiBAY3B1Ogl1bnNpZ25lZCBpbnQgQ1BVIG51bWJlci4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIG9uIHRoZSBob3RwbHVnZ2VkIENQVSBhbmQgY2FsbHMgdGhlIENETU0KICAqIGRyaXZlciBjcHVfZG93biBjYWxsYmFjayBmb3IgYWxsIGRldmljZXMgb24gdGhhdCBDUFUuCiAgKi8KLXN0YXRpYyBsb25nIG1pcHNfY2RtbV9idXNfZG93bih2b2lkICpkYXRhKQorc3RhdGljIGludCBtaXBzX2NkbW1fY3B1X2Rvd25fcHJlcCh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBtaXBzX2NkbW1fYnVzICpidXM7CiAJbG9uZyByZXQ7CiAKIAkvKiBJbmZvcm0gYWxsIHRoZSBkZXZpY2VzIG9uIHRoZSBidXMgKi8KLQlyZXQgPSBidXNfZm9yX2VhY2hfZGV2KCZtaXBzX2NkbW1fYnVzdHlwZSwgTlVMTCwgZGF0YSwKKwlyZXQgPSBidXNfZm9yX2VhY2hfZGV2KCZtaXBzX2NkbW1fYnVzdHlwZSwgTlVMTCwgJmNwdSwKIAkJCSAgICAgICBtaXBzX2NkbW1fY3B1X2Rvd25faGVscGVyKTsKIAogCS8qCkBAIC02MjMsOCArNjI0LDggQEAKIH0KIAogLyoqCi0gKiBtaXBzX2NkbW1fYnVzX3VwKCkgLSBCcmluZyB1cCB0aGUgQ0RNTSBidXMuCi0gKiBAZGF0YToJUG9pbnRlciB0byB1bnNpZ25lZCBpbnQgQ1BVIG51bWJlci4KKyAqIG1pcHNfY2RtbV9jcHVfb25saW5lKCkgLSBDYWxsYmFjayBmb3IgQ1BVSFAgT05MSU5FOiBCcmluZyB1cCB0aGUgQ0RNTSBidXMuCisgKiBAY3B1Ogl1bnNpZ25lZCBpbnQgQ1BVIG51bWJlci4KICAqCiAgKiBUaGlzIHdvcmtfb25fY3B1IGNhbGxiYWNrIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIG9uIGEgZ2l2ZW4gQ1BVIHRvIGRpc2NvdmVyCiAgKiBDRE1NIGRldmljZXMgb24gdGhhdCBDUFUsIG9yIHRvIGNhbGwgdGhlIENETU0gZHJpdmVyIGNwdV91cCBjYWxsYmFjayBmb3IgYWxsCkBAIC02MzQsNyArNjM1LDcgQEAKICAqIGluaXRpYWxpc2F0aW9uLiBXaGVuIENQVXMgYXJlIGJyb3VnaHQgb25saW5lIHRoZSBmdW5jdGlvbiBpcwogICogaW52b2tlZCBkaXJlY3RseSBvbiB0aGUgaG90cGx1Z2dlZCBDUFUuCiAgKi8KLXN0YXRpYyBsb25nIG1pcHNfY2RtbV9idXNfdXAodm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgbWlwc19jZG1tX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgbWlwc19jZG1tX2J1cyAqYnVzOwogCWxvbmcgcmV0OwpAQCAtNjUxLDUxICs2NTIsMTMgQEAKIAkJbWlwc19jZG1tX2J1c19kaXNjb3ZlcihidXMpOwogCWVsc2UKIAkJLyogSW5mb3JtIGFsbCB0aGUgZGV2aWNlcyBvbiB0aGUgYnVzICovCi0JCXJldCA9IGJ1c19mb3JfZWFjaF9kZXYoJm1pcHNfY2RtbV9idXN0eXBlLCBOVUxMLCBkYXRhLAorCQlyZXQgPSBidXNfZm9yX2VhY2hfZGV2KCZtaXBzX2NkbW1fYnVzdHlwZSwgTlVMTCwgJmNwdSwKIAkJCQkgICAgICAgbWlwc19jZG1tX2NwdV91cF9oZWxwZXIpOwogCiAJcmV0dXJuIHJldDsKIH0KIAogLyoqCi0gKiBtaXBzX2NkbW1fY3B1X25vdGlmeSgpIC0gVGFrZSBhY3Rpb24gd2hlbiBhIENQVSBpcyBnb2luZyBvbmxpbmUgb3Igb2ZmbGluZS4KLSAqIEBuYjoJCUNQVSBub3RpZmllciBibG9jayAuCi0gKiBAYWN0aW9uOglFdmVudCB0aGF0IGhhcyB0YWtlbiBwbGFjZSAoQ1BVXyopLgotICogQGRhdGE6CUNQVSBudW1iZXIuCi0gKgotICogVGhpcyBub3RpZmllciBpcyB1c2VkIHRvIGtlZXAgdGhlIENETU0gYnVzZXMgdXBkYXRlZCBhcyBDUFVzIGFyZSBvZmZsaW5lZCBhbmQKLSAqIG9ubGluZWQuIFdoZW4gQ1BVcyBnbyBvZmZsaW5lIG9yIGNvbWUgYmFjayBvbmxpbmUsIHNvIGRvZXMgdGhlaXIgQ0RNTSBidXMsIHNvCi0gKiBkZXZpY2VzIG11c3QgYmUgaW5mb3JtZWQuIEFsc28gd2hlbiBDUFVzIGNvbWUgb25saW5lIGZvciB0aGUgZmlyc3QgdGltZSB0aGUKLSAqIGRldmljZXMgb24gdGhlIENETU0gYnVzIG5lZWQgZGlzY292ZXJpbmcuCi0gKgotICogUmV0dXJuczoJTk9USUZZX09LIGlmIGV2ZW50IHdhcyB1c2VkLgotICoJCU5PVElGWV9ET05FIGlmIHdlIGRpZG4ndCBjYXJlLgotICovCi1zdGF0aWMgaW50IG1pcHNfY2RtbV9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCi17Ci0JdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBpbnQpZGF0YTsKLQotCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRUQ6Ci0JCW1pcHNfY2RtbV9idXNfdXAoJmNwdSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQkJbWlwc19jZG1tX2J1c19kb3duKCZjcHUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtaXBzX2NkbW1fY3B1X25iID0gewotCS5ub3RpZmllcl9jYWxsID0gbWlwc19jZG1tX2NwdV9ub3RpZnksCi19OwotCi0vKioKICAqIG1pcHNfY2RtbV9pbml0KCkgLSBJbml0aWFsaXNlIENETU0gYnVzLgogICoKICAqIEluaXRpYWxpc2UgQ0RNTSBidXMsIGRpc2NvdmVyIENETU0gZGV2aWNlcyBmb3Igb25saW5lIENQVXMsIGFuZCBhcnJhbmdlIGZvcgpAQCAtNzAzLDcgKzY2Niw2IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG1pcHNfY2RtbV9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IGNwdTsKIAlpbnQgcmV0OwogCiAJLyogUmVnaXN0ZXIgdGhlIGJ1cyAqLwpAQCAtNzEyLDE5ICs2NzQsMTEgQEAKIAkJcmV0dXJuIHJldDsKIAogCS8qIFdlIHdhbnQgdG8gYmUgbm90aWZpZWQgYWJvdXQgbmV3IENQVXMgKi8KLQlyZXQgPSByZWdpc3Rlcl9jcHVfbm90aWZpZXIoJm1pcHNfY2RtbV9jcHVfbmIpOwotCWlmIChyZXQpIHsKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZShDUFVIUF9BUF9PTkxJTkVfRFlOLCAiYnVzL2NkbW06b25saW5lIiwKKwkJCQltaXBzX2NkbW1fY3B1X29ubGluZSwgbWlwc19jZG1tX2NwdV9kb3duX3ByZXApOworCWlmIChyZXQgPCAwKQogCQlwcl93YXJuKCJjZG1tOiBGYWlsZWQgdG8gcmVnaXN0ZXIgQ1BVIG5vdGlmaWVyXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQogCi0JLyogRGlzY292ZXIgZGV2aWNlcyBvbiBDRE1NIG9mIG9ubGluZSBDUFVzICovCi0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCXdvcmtfb25fY3B1KGNwdSwgbWlwc19jZG1tX2J1c191cCwgJmNwdSk7Ci0KLQlyZXR1cm4gMDsKLW91dDoKLQlidXNfdW5yZWdpc3RlcigmbWlwc19jZG1tX2J1c3R5cGUpOwogCXJldHVybiByZXQ7CiB9CiBzdWJzeXNfaW5pdGNhbGwobWlwc19jZG1tX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9idXMvdmV4cHJlc3MtY29uZmlnLmMgYi9kcml2ZXJzL2J1cy92ZXhwcmVzcy1jb25maWcuYwppbmRleCBjM2NiNzZiLi45ZWZkZjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2J1cy92ZXhwcmVzcy1jb25maWcuYworKysgYi9kcml2ZXJzL2J1cy92ZXhwcmVzcy1jb25maWcuYwpAQCAtMTc4LDYgKzE3OCw3IEBACiAKIAlwYXJlbnQgPSBjbGFzc19maW5kX2RldmljZSh2ZXhwcmVzc19jb25maWdfY2xhc3MsIE5VTEwsIGJyaWRnZSwKIAkJCXZleHByZXNzX2NvbmZpZ19ub2RlX21hdGNoKTsKKwlvZl9ub2RlX3B1dChicmlkZ2UpOwogCWlmIChXQVJOX09OKCFwYXJlbnQpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2JmaW4tb3RwLmMgYi9kcml2ZXJzL2NoYXIvYmZpbi1vdHAuYwppbmRleCA0NDY2MGYxLi4zNWQ0NmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYmZpbi1vdHAuYworKysgYi9kcml2ZXJzL2NoYXIvYmZpbi1vdHAuYwpAQCAtMjMwLDQ1ICsyMzAsNyBAQAogCS5uYW1lICAgICA9IERSSVZFUl9OQU1FLAogCS5mb3BzICAgICA9ICZiZmluX290cF9mb3BzLAogfTsKLQotLyoqCi0gKgliZmluX290cF9pbml0IC0gSW5pdGlhbGl6ZSBtb2R1bGUKLSAqCi0gKglSZWdpc3RlcnMgdGhlIGRldmljZSBhbmQgbm90aWZpZXIgaGFuZGxlci4gQWN0dWFsIGRldmljZQotICoJaW5pdGlhbGl6YXRpb24gaXMgaGFuZGxlZCBieSBiZmluX290cF9vcGVuKCkuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGJmaW5fb3RwX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0Jc3RhbXBpdCgpOwotCi0JcmV0ID0gbWlzY19yZWdpc3RlcigmYmZpbl9vdHBfbWlzY19kZXZpY2UpOwotCWlmIChyZXQpIHsKLQkJcHJfaW5pdChLRVJOX0VSUiBQRlggInVuYWJsZSB0byByZWdpc3RlciBhIG1pc2MgZGV2aWNlXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcl9pbml0KEtFUk5fSU5GTyBQRlggImluaXRpYWxpemVkXG4iKTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqCWJmaW5fb3RwX2V4aXQgLSBEZWluaXRpYWxpemUgbW9kdWxlCi0gKgotICoJVW5yZWdpc3RlcnMgdGhlIGRldmljZSBhbmQgbm90aWZpZXIgaGFuZGxlci4gQWN0dWFsIGRldmljZQotICoJZGVpbml0aWFsaXphdGlvbiBpcyBoYW5kbGVkIGJ5IGJmaW5fb3RwX2Nsb3NlKCkuCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBiZmluX290cF9leGl0KHZvaWQpCi17Ci0Jc3RhbXBpdCgpOwotCi0JbWlzY19kZXJlZ2lzdGVyKCZiZmluX290cF9taXNjX2RldmljZSk7Ci19Ci0KLW1vZHVsZV9pbml0KGJmaW5fb3RwX2luaXQpOwotbW9kdWxlX2V4aXQoYmZpbl9vdHBfZXhpdCk7Cittb2R1bGVfbWlzY19kZXZpY2UoYmZpbl9vdHBfbWlzY19kZXZpY2UpOwogCiBNT0RVTEVfQVVUSE9SKCJNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdlbnRvby5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkJsYWNrZmluIE9UUCBNZW1vcnkgSW50ZXJmYWNlIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcKaW5kZXggNTZhZDVhNS4uOGMwNzcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vS2NvbmZpZwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAKIGNvbmZpZyBIV19SQU5ET01fTVhDX1JOR0EKIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIGkuTVggUk5HQSBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciIKLQlkZXBlbmRzIG9uIEFSQ0hfSEFTX1JOR0EKKwlkZXBlbmRzIG9uIFNPQ19JTVgzMQogCWRlZmF1bHQgSFdfUkFORE9NCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMga2VybmVsLXNpZGUgc3VwcG9ydCBmb3IgdGhlIFJhbmRvbSBOdW1iZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vcGFzZW1pLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9wYXNlbWktcm5nLmMKaW5kZXggNjk5YjcyNS4uYzE5ZTIzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9wYXNlbWktcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9wYXNlbWktcm5nLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNkZWZpbmUgU0RDUk5HX0NUTF9SRUcJCQkweDAwCiAjZGVmaW5lICAgU0RDUk5HX0NUTF9GVkxEX00JCTB4MDAwMGYwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tZW0uYyBiL2RyaXZlcnMvY2hhci9tZW0uYwppbmRleCBhMzMxNjNkLi41YmIxOTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbWVtLmMKKysrIGIvZHJpdmVycy9jaGFyL21lbS5jCkBAIC0zODEsNiArMzgxLDkgQEAKIAljaGFyICprYnVmOyAvKiBrLWFkZHIgYmVjYXVzZSB2cmVhZCgpIHRha2VzIHZtbGlzdF9sb2NrIHJ3bG9jayAqLwogCWludCBlcnIgPSAwOwogCisJaWYgKCFwZm5fdmFsaWQoUEZOX0RPV04ocCkpKQorCQlyZXR1cm4gLUVJTzsKKwogCXJlYWQgPSAwOwogCWlmIChwIDwgKHVuc2lnbmVkIGxvbmcpIGhpZ2hfbWVtb3J5KSB7CiAJCWxvd19jb3VudCA9IGNvdW50OwpAQCAtNTA5LDYgKzUxMiw5IEBACiAJY2hhciAqa2J1ZjsgLyogay1hZGRyIGJlY2F1c2UgdndyaXRlKCkgdGFrZXMgdm1saXN0X2xvY2sgcndsb2NrICovCiAJaW50IGVyciA9IDA7CiAKKwlpZiAoIXBmbl92YWxpZChQRk5fRE9XTihwKSkpCisJCXJldHVybiAtRUlPOworCiAJaWYgKHAgPCAodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkpIHsKIAkJdW5zaWduZWQgbG9uZyB0b193cml0ZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNvdW50LAogCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkgLSBwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS8zNzgwaS5jIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmMKaW5kZXggMjg3NDAwNC4uOTcyYzQwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmMKKysrIGIvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQlNS0JZVEUoclNsYXZlQ29udHJvbCkpOwogCiAJclNsYXZlQ29udHJvbF9TYXZlID0gclNsYXZlQ29udHJvbDsKLQlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBUUlVFOworCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IHRydWU7CiAKIAlQUklOVEtfMihUUkFDRV8zNzgwSSwKIAkJIjM3ODBpOjpkc3AzNzgwaV9Xcml0ZUdlbkNmZyBlbnRyeSByU2xhdmVDb250cm9sK0NvbmZpZ01vZGUgJXhcbiIsCkBAIC0xNTUsNyArMTU1LDcgQEAKIAogCU1LQllURShyU2xhdmVDb250cm9sKSA9IEluQnl0ZURzcChEU1BfSXNhU2xhdmVDb250cm9sKTsKIAlyU2xhdmVDb250cm9sX1NhdmUgPSByU2xhdmVDb250cm9sOwotCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IFRSVUU7CisJclNsYXZlQ29udHJvbC5Db25maWdNb2RlID0gdHJ1ZTsKIAlPdXRCeXRlRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wsIE1LQllURShyU2xhdmVDb250cm9sKSk7CiAJT3V0Qnl0ZURzcChEU1BfQ29uZmlnQWRkcmVzcywgKHVuc2lnbmVkIGNoYXIpIHVJbmRleCk7CiAJdWNWYWx1ZSA9IEluQnl0ZURzcChEU1BfQ29uZmlnRGF0YSk7CkBAIC0yMzAsNyArMjMwLDcgQEAKIAkJCXJVYXJ0Q2ZnMS5CYXNlSU8gPSAzOwogCQkJYnJlYWs7CiAJCX0KLQkJclVhcnRDZmcyLkVuYWJsZSA9IFRSVUU7CisJCXJVYXJ0Q2ZnMi5FbmFibGUgPSB0cnVlOwogCX0KIAogCXJIQnJpZGdlQ2ZnMS5SZXNlcnZlZCA9IHJIQnJpZGdlQ2ZnMi5SZXNlcnZlZCA9IDA7CkBAIC0yMzgsNyArMjM4LDcgQEAKIAlySEJyaWRnZUNmZzEuSXJxUHVsc2UgPSBwU2V0dGluZ3MtPmJEc3BJcnFQdWxzZTsKIAlySEJyaWRnZUNmZzEuSXJxID0gKHVuc2lnbmVkIGNoYXIpIHBJcnFNYXBbcFNldHRpbmdzLT51c0RzcElycV07CiAJckhCcmlkZ2VDZmcxLkFjY2Vzc01vZGUgPSAxOwotCXJIQnJpZGdlQ2ZnMi5FbmFibGUgPSBUUlVFOworCXJIQnJpZGdlQ2ZnMi5FbmFibGUgPSB0cnVlOwogCiAKIAlyQnVzbWFzdGVyQ2ZnMi5SZXNlcnZlZCA9IDA7CkBAIC0yNzgsOCArMjc4LDggQEAKIAkqIHNvZnQtcmVzZXQgYWN0aXZlIGZvciAxMG1zLgogCSovCiAJclNsYXZlQ29udHJvbC5DbG9ja0NvbnRyb2wgPSAwOwotCXJTbGF2ZUNvbnRyb2wuU29mdFJlc2V0ID0gVFJVRTsKLQlyU2xhdmVDb250cm9sLkNvbmZpZ01vZGUgPSBGQUxTRTsKKwlyU2xhdmVDb250cm9sLlNvZnRSZXNldCA9IHRydWU7CisJclNsYXZlQ29udHJvbC5Db25maWdNb2RlID0gZmFsc2U7CiAJclNsYXZlQ29udHJvbC5SZXNlcnZlZCA9IDA7CiAKIAlQUklOVEtfNChUUkFDRV8zNzgwSSwKQEAgLTMwMiw3ICszMDIsNyBAQAogCWZvciAoaSA9IDA7IGkgPCAxMTsgaSsrKQogCQl1ZGVsYXkoMjAwMCk7CiAKLQlyU2xhdmVDb250cm9sLlNvZnRSZXNldCA9IEZBTFNFOworCXJTbGF2ZUNvbnRyb2wuU29mdFJlc2V0ID0gZmFsc2U7CiAJT3V0V29yZERzcChEU1BfSXNhU2xhdmVDb250cm9sLCBNS1dPUkQoclNsYXZlQ29udHJvbCkpOwogCiAJTUtXT1JEKHR2YWwpID0gSW5Xb3JkRHNwKERTUF9Jc2FTbGF2ZUNvbnRyb2wpOwpAQCAtMzI2LDEwICszMjYsMTAgQEAKIAl9CiAKIAotCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBGQUxTRTsKLQlySEJyaWRnZUNvbnRyb2wuTWVtQXV0b0luYyA9IFRSVUU7Ci0JckhCcmlkZ2VDb250cm9sLklvQXV0b0luYyA9IEZBTFNFOwotCXJIQnJpZGdlQ29udHJvbC5EaWFnbm9zdGljTW9kZSA9IEZBTFNFOworCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBmYWxzZTsKKwlySEJyaWRnZUNvbnRyb2wuTWVtQXV0b0luYyA9IHRydWU7CisJckhCcmlkZ2VDb250cm9sLklvQXV0b0luYyA9IGZhbHNlOworCXJIQnJpZGdlQ29udHJvbC5EaWFnbm9zdGljTW9kZSA9IGZhbHNlOwogCiAJUFJJTlRLXzMoVFJBQ0VfMzc4MEksCiAJCSIzNzgwaTo6ZHNwMzc4MGlfRW5hYmxlRFNQIERTUF9IQnJpZGdlQ29udHJvbCAleCBySEJyaWRnZUNvbnRyb2wgJXhcbiIsCkBAIC0zNDUsNyArMzQ1LDcgQEAKIAlDaGlwSUQgPSBSZWFkTXNhQ2ZnKERTUF9DaGlwSUQpOwogCiAJUFJJTlRLXzIoVFJBQ0VfMzc4MEksCi0JCSIzNzgwaTo6ZHNwMzc4MElfRW5hYmxlRFNQIGV4aXRpbmcgYlJDPVRSVUUsIENoaXBJRCAleFxuIiwKKwkJIjM3ODBpOjpkc3AzNzgwSV9FbmFibGVEU1AgZXhpdGluZyBiUkM9dHJ1ZSwgQ2hpcElEICV4XG4iLAogCQlDaGlwSUQpOwogCiAJcmV0dXJuIDA7CkBAIC0zNjEsOCArMzYxLDggQEAKIAlQUklOVEtfMShUUkFDRV8zNzgwSSwgIjM3ODBpOjpkc3AzNzgwaV9EaXNhYmxlRFNQIGVudHJ5XG4iKTsKIAogCXJTbGF2ZUNvbnRyb2wuQ2xvY2tDb250cm9sID0gMDsKLQlyU2xhdmVDb250cm9sLlNvZnRSZXNldCA9IFRSVUU7Ci0JclNsYXZlQ29udHJvbC5Db25maWdNb2RlID0gRkFMU0U7CisJclNsYXZlQ29udHJvbC5Tb2Z0UmVzZXQgPSB0cnVlOworCXJTbGF2ZUNvbnRyb2wuQ29uZmlnTW9kZSA9IGZhbHNlOwogCXJTbGF2ZUNvbnRyb2wuUmVzZXJ2ZWQgPSAwOwogCXNwaW5fbG9ja19pcnFzYXZlKCZkc3BfbG9jaywgZmxhZ3MpOwogCU91dFdvcmREc3AoRFNQX0lzYVNsYXZlQ29udHJvbCwgTUtXT1JEKHJTbGF2ZUNvbnRyb2wpKTsKQEAgLTM5OCwxNCArMzk4LDE0IEBACiAJUFJJTlRLXzIoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUmVzZXQgckhCcmlkZ2VDb250cm9sICV4XG4iLAogCQlNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CiAKLQlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gRkFMU0U7CisJckhCcmlkZ2VDb250cm9sLkVuYWJsZURzcEludCA9IGZhbHNlOwogCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKIAogCS8qIFJlc2V0IHRoZSBjb3JlIHZpYSB0aGUgYm9vdCBkb21haW4gcmVnaXN0ZXIgKi8KLQlyQm9vdERvbWFpbi5SZXNldENvcmUgPSBUUlVFOwotCXJCb290RG9tYWluLkhhbHQgPSBUUlVFOwotCXJCb290RG9tYWluLk5NSSA9IFRSVUU7CisJckJvb3REb21haW4uUmVzZXRDb3JlID0gdHJ1ZTsKKwlyQm9vdERvbWFpbi5IYWx0ID0gdHJ1ZTsKKwlyQm9vdERvbWFpbi5OTUkgPSB0cnVlOwogCXJCb290RG9tYWluLlJlc2VydmVkID0gMDsKIAogCVBSSU5US18yKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1Jlc2V0IHJCb290RG9tYWluICV4XG4iLApAQCAtNDM4LDI2ICs0MzgsMjYgQEAKIAogCiAJLyogVHJhbnNpdGlvbiB0aGUgY29yZSB0byBhIHJ1bm5pbmcgc3RhdGUgKi8KLQlyQm9vdERvbWFpbi5SZXNldENvcmUgPSBUUlVFOwotCXJCb290RG9tYWluLkhhbHQgPSBGQUxTRTsKLQlyQm9vdERvbWFpbi5OTUkgPSBUUlVFOworCXJCb290RG9tYWluLlJlc2V0Q29yZSA9IHRydWU7CisJckJvb3REb21haW4uSGFsdCA9IGZhbHNlOworCXJCb290RG9tYWluLk5NSSA9IHRydWU7CiAJckJvb3REb21haW4uUmVzZXJ2ZWQgPSAwOwogCVdyaXRlTXNhQ2ZnKERTUF9Nc3BCb290RG9tYWluLCBNS1dPUkQockJvb3REb21haW4pKTsKIAogCXVkZWxheSg1KTsKIAotCXJCb290RG9tYWluLlJlc2V0Q29yZSA9IEZBTFNFOworCXJCb290RG9tYWluLlJlc2V0Q29yZSA9IGZhbHNlOwogCVdyaXRlTXNhQ2ZnKERTUF9Nc3BCb290RG9tYWluLCBNS1dPUkQockJvb3REb21haW4pKTsKIAl1ZGVsYXkoNSk7CiAKLQlyQm9vdERvbWFpbi5OTUkgPSBGQUxTRTsKKwlyQm9vdERvbWFpbi5OTUkgPSBmYWxzZTsKIAlXcml0ZU1zYUNmZyhEU1BfTXNwQm9vdERvbWFpbiwgTUtXT1JEKHJCb290RG9tYWluKSk7CiAJdWRlbGF5KDUpOwogCiAJLyogRW5hYmxlIERTUCB0byBQQyBpbnRlcnJ1cHQgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKIAlNS1dPUkQockhCcmlkZ2VDb250cm9sKSA9IEluV29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wpOwotCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBUUlVFOworCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSB0cnVlOwogCiAJUFJJTlRLXzIoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUnVuIHJIQnJpZGdlQ29udHJvbCAleFxuIiwKIAkJTUtXT1JEKHJIQnJpZGdlQ29udHJvbCkpOwpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKIAogCi0JUFJJTlRLXzEoVFJBQ0VfMzc4MEksICIzNzgwaTo6ZHNwMzc4MGlfUnVuIGV4aXQgYlJDPVRSVUVcbiIpOworCVBSSU5US18xKFRSQUNFXzM3ODBJLCAiMzc4MGk6OmRzcDM3ODBpX1J1biBleGl0IGJSQz10cnVlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTA4LDcgKzUwOCw3IEBACiAKIAogCVBSSU5US18xKFRSQUNFXzM3ODBJLAotCQkiMzc4MEk6OmRzcDM3ODBJX1JlYWREU3RvcmUgZXhpdCBiUkM9VFJVRVxuIik7CisJCSIzNzgwSTo6ZHNwMzc4MElfUmVhZERTdG9yZSBleGl0IGJSQz10cnVlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTUwLDcgKzU1MCw3IEBACiAKIAogCVBSSU5US18xKFRSQUNFXzM3ODBJLAotCQkiMzc4MEk6OmRzcDM3ODBJX1JlYWRBbmRDbGVhckRTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKwkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkQW5kQ2xlYXJEU3RvcmUgZXhpdCBiUkM9dHJ1ZVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU5Miw3ICs1OTIsNyBAQAogCiAKIAlQUklOVEtfMShUUkFDRV8zNzgwSSwKLQkJIjM3ODBJOjpkc3AzNzgwRF9Xcml0ZURTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKwkJIjM3ODBJOjpkc3AzNzgwRF9Xcml0ZURTdG9yZSBleGl0IGJSQz10cnVlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjQwLDcgKzY0MCw3IEBACiAJfQogCiAJUFJJTlRLXzEoVFJBQ0VfMzc4MEksCi0JCSIzNzgwSTo6ZHNwMzc4MElfUmVhZElTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKwkJIjM3ODBJOjpkc3AzNzgwSV9SZWFkSVN0b3JlIGV4aXQgYlJDPXRydWVcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02ODksNyArNjg5LDcgQEAKIAl9CiAKIAlQUklOVEtfMShUUkFDRV8zNzgwSSwKLQkJIjM3ODBJOjpkc3AzNzgwSV9Xcml0ZUlTdG9yZSBleGl0IGJSQz1UUlVFXG4iKTsKKwkJIjM3ODBJOjpkc3AzNzgwSV9Xcml0ZUlTdG9yZSBleGl0IGJSQz10cnVlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzEzLDcgKzcxMyw3IEBACiAJKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHNwX2xvY2ssIGZsYWdzKTsKIAlNS1dPUkQockhCcmlkZ2VDb250cm9sKSA9IEluV29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wpOwotCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBGQUxTRTsKKwlySEJyaWRnZUNvbnRyb2wuRW5hYmxlRHNwSW50ID0gZmFsc2U7CiAJT3V0V29yZERzcChEU1BfSEJyaWRnZUNvbnRyb2wsIE1LV09SRChySEJyaWRnZUNvbnRyb2wpKTsKIAogCSpwdXNJUENTb3VyY2UgPSBJbldvcmREc3AoRFNQX0ludGVycnVwdCk7CkBAIC03MjUsNyArNzI1LDcgQEAKIAogCU91dFdvcmREc3AoRFNQX0ludGVycnVwdCwgKHVuc2lnbmVkIHNob3J0KSB+KCpwdXNJUENTb3VyY2UpKTsKIAotCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSBUUlVFOworCXJIQnJpZGdlQ29udHJvbC5FbmFibGVEc3BJbnQgPSB0cnVlOwogCU91dFdvcmREc3AoRFNQX0hCcmlkZ2VDb250cm9sLCBNS1dPUkQockhCcmlkZ2VDb250cm9sKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNwX2xvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL213YXZlLzM3ODBpLmggYi9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuaAppbmRleCBmYmE2YWIxLi45Y2NiNmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuaAorKysgYi9kcml2ZXJzL2NoYXIvbXdhdmUvMzc4MGkuaApAQCAtMTAxLDcgKzEwMSw3IEBACiB9IERTUF9VQVJUX0NGR18xOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBFbmFibGU6MTsJLyogUlc6IEVuYWJsZSBJL08gYW5kIElSUTogMD1GQUxTRSwgMT1UUlVFICovCisJdW5zaWduZWQgY2hhciBFbmFibGU6MTsJLyogUlc6IEVuYWJsZSBJL08gYW5kIElSUTogMD1mYWxzZSwgMT10cnVlICovCiAJdW5zaWduZWQgY2hhciBSZXNlcnZlZDo3OwkvKiAwOiBSZXNlcnZlZCAqLwogfSBEU1BfVUFSVF9DRkdfMjsKIApAQCAtMTE0LDcgKzExNCw3IEBACiB9IERTUF9IQlJJREdFX0NGR18xOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBFbmFibGU6MTsJLyogUlc6IGVuYWJsZSBJL08gYW5kIElSUTogMD1GQUxTRSwgMT1UUlVFICovCisJdW5zaWduZWQgY2hhciBFbmFibGU6MTsJLyogUlc6IGVuYWJsZSBJL08gYW5kIElSUTogMD1mYWxzZSwgMT10cnVlICovCiAJdW5zaWduZWQgY2hhciBSZXNlcnZlZDo3OwkvKiAwOiBSZXNlcnZlZCAqLwogfSBEU1BfSEJSSURHRV9DRkdfMjsKIApAQCAtMTMzLDEyICsxMzMsMTIgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBHYXRlSU9DSFJEWToxOwkvKiBSVzogRW5hYmxlIElPQ0hSRFkgZ2F0aW5nOiAwPUZBTFNFLCAxPVRSVUUgKi8KKwl1bnNpZ25lZCBjaGFyIEdhdGVJT0NIUkRZOjE7CS8qIFJXOiBFbmFibGUgSU9DSFJEWSBnYXRpbmc6IDA9ZmFsc2UsIDE9dHJ1ZSAqLwogCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6NzsJLyogMDogUmVzZXJ2ZWQgKi8KIH0gRFNQX0lTQV9QUk9UX0NGRzsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGNoYXIgRW5hYmxlOjE7CS8qIFJXOiBFbmFibGUgbG93IHBvd2VyIHN1c3BlbmQvcmVzdW1lIDA9RkFMU0UsIDE9VFJVRSAqLworCXVuc2lnbmVkIGNoYXIgRW5hYmxlOjE7CS8qIFJXOiBFbmFibGUgbG93IHBvd2VyIHN1c3BlbmQvcmVzdW1lIDA9ZmFsc2UsIDE9dHJ1ZSAqLwogCXVuc2lnbmVkIGNoYXIgUmVzZXJ2ZWQ6NzsJLyogMDogUmVzZXJ2ZWQgKi8KIH0gRFNQX1BPV0VSX01HTVRfQ0ZHOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuYwppbmRleCAxNjQ1NDRhLi4zYTNmZjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmMKQEAgLTI5Niw4ICsyOTYsOCBAQAogCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0udXNJbnRDb3VudCk7CiAKIAkJCW11dGV4X2xvY2soJm13YXZlX211dGV4KTsKLQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzSGVyZSA9IEZBTFNFOwotCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID0gVFJVRTsKKwkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzSGVyZSA9IGZhbHNlOworCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID0gdHJ1ZTsKIAkJCW11dGV4X3VubG9jaygmbXdhdmVfbXV0ZXgpOwogCQogCQkJUFJJTlRLXzIoVFJBQ0VfTVdBVkUsCkBAIC0zMjQsNyArMzI0LDcgQEAKIAkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLnVzSW50Q291bnQpOwogCQogCQkJbXV0ZXhfbG9jaygmbXdhdmVfbXV0ZXgpOwotCQkJaWYgKHBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9PSBUUlVFKSB7CisJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID09IHRydWUpIHsKIAkJCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAogCQkJCVBSSU5US18yKFRSQUNFX01XQVZFLApAQCAtMzMyLDcgKzMzMiw3IEBACiAJCQkJCSIgaXBjICV4IGdvaW5nIHRvIHNsZWVwXG4iLAogCQkJCQlpcGNudW0pOwogCQkJCWFkZF93YWl0X3F1ZXVlKCZwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmlwY193YWl0X3F1ZXVlLCAmd2FpdCk7Ci0JCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gVFJVRTsKKwkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0hlcmUgPSB0cnVlOwogCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQkJLyogY2hlY2sgd2hldGhlciBhbiBldmVudCB3YXMgc2lnbmFsbGVkIGJ5ICovCiAJCQkJLyogdGhlIGludGVycnVwdCBoYW5kbGVyIHdoaWxlIHdlIHdlcmUgZ29uZSAqLwpAQCAtMzU1LDcgKzM1NSw3IEBACiAJCQkJCQkiIGFwcGxpY2F0aW9uXG4iLAogCQkJCQkJaXBjbnVtKTsKIAkJCQl9Ci0JCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gRkFMU0U7CisJCQkJcERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID0gZmFsc2U7CiAJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBEcnZEYXRhLT5JUENzW2lwY251bV0uaXBjX3dhaXRfcXVldWUsICZ3YWl0KTsKIAkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQkJCVBSSU5US18yKFRSQUNFX01XQVZFLApAQCAtMzg0LDkgKzM4NCw5IEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQltdXRleF9sb2NrKCZtd2F2ZV9tdXRleCk7Ci0JCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNFbmFibGVkID09IFRSVUUpIHsKLQkJCQlwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0VuYWJsZWQgPSBGQUxTRTsKLQkJCQlpZiAocERydkRhdGEtPklQQ3NbaXBjbnVtXS5iSXNIZXJlID09IFRSVUUpIHsKKwkJCWlmIChwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0VuYWJsZWQgPT0gdHJ1ZSkgeworCQkJCXBEcnZEYXRhLT5JUENzW2lwY251bV0uYklzRW5hYmxlZCA9IGZhbHNlOworCQkJCWlmIChwRHJ2RGF0YS0+SVBDc1tpcGNudW1dLmJJc0hlcmUgPT0gdHJ1ZSkgewogCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBEcnZEYXRhLT5JUENzW2lwY251bV0uaXBjX3dhaXRfcXVldWUpOwogCQkJCX0KIAkJCX0KQEAgLTU0MSw3ICs1NDEsNyBAQAogCiAJaWYgKHBEcnZEYXRhLT5kZXZpY2VfcmVnaXN0ZXJlZCkgewogCQlkZXZpY2VfdW5yZWdpc3RlcigmbXdhdmVfZGV2aWNlKTsKLQkJcERydkRhdGEtPmRldmljZV9yZWdpc3RlcmVkID0gRkFMU0U7CisJCXBEcnZEYXRhLT5kZXZpY2VfcmVnaXN0ZXJlZCA9IGZhbHNlOwogCX0KICNlbmRpZgogCkBAIC01NzYsMTYgKzU3NiwxNiBAQAogCiAJbWVtc2V0KCZtd2F2ZV9zX21kZCwgMCwgc2l6ZW9mKE1XQVZFX0RFVklDRV9EQVRBKSk7CiAKLQlwRHJ2RGF0YS0+YkJESW5pdGlhbGl6ZWQgPSBGQUxTRTsKLQlwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQgPSBGQUxTRTsKLQlwRHJ2RGF0YS0+YkRTUEVuYWJsZWQgPSBGQUxTRTsKLQlwRHJ2RGF0YS0+YkRTUFJlc2V0ID0gRkFMU0U7Ci0JcERydkRhdGEtPmJNd2F2ZURldlJlZ2lzdGVyZWQgPSBGQUxTRTsKKwlwRHJ2RGF0YS0+YkJESW5pdGlhbGl6ZWQgPSBmYWxzZTsKKwlwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQgPSBmYWxzZTsKKwlwRHJ2RGF0YS0+YkRTUEVuYWJsZWQgPSBmYWxzZTsKKwlwRHJ2RGF0YS0+YkRTUFJlc2V0ID0gZmFsc2U7CisJcERydkRhdGEtPmJNd2F2ZURldlJlZ2lzdGVyZWQgPSBmYWxzZTsKIAlwRHJ2RGF0YS0+c0xpbmUgPSAtMTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBEcnZEYXRhLT5JUENzKTsgaSsrKSB7Ci0JCXBEcnZEYXRhLT5JUENzW2ldLmJJc0VuYWJsZWQgPSBGQUxTRTsKLQkJcERydkRhdGEtPklQQ3NbaV0uYklzSGVyZSA9IEZBTFNFOworCQlwRHJ2RGF0YS0+SVBDc1tpXS5iSXNFbmFibGVkID0gZmFsc2U7CisJCXBEcnZEYXRhLT5JUENzW2ldLmJJc0hlcmUgPSBmYWxzZTsKIAkJcERydkRhdGEtPklQQ3NbaV0udXNJbnRDb3VudCA9IDA7CS8qIG5vIGludHMgcmVjZWl2ZWQgeWV0ICovCiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBEcnZEYXRhLT5JUENzW2ldLmlwY193YWl0X3F1ZXVlKTsKIAl9CkBAIC02MDEsNyArNjAxLDcgQEAKIAkJCQkiIEZhaWxlZCB0byBpbml0aWFsaXplIGJvYXJkIGRhdGFcbiIpOwogCQlnb3RvIGNsZWFudXBfZXJyb3I7CiAJfQotCXBEcnZEYXRhLT5iQkRJbml0aWFsaXplZCA9IFRSVUU7CisJcERydkRhdGEtPmJCREluaXRpYWxpemVkID0gdHJ1ZTsKIAogCXJldHZhbCA9IHRwMzc4MElfQ2FsY1Jlc291cmNlcygmcERydkRhdGEtPnJCRERhdGEpOwogCVBSSU5US18yKFRSQUNFX01XQVZFLApAQCAtNjI2LDcgKzYyNiw3IEBACiAJCQkJIiBGYWlsZWQgdG8gY2xhaW0gcmVzb3VyY2VzXG4iKTsKIAkJZ290byBjbGVhbnVwX2Vycm9yOwogCX0KLQlwRHJ2RGF0YS0+YlJlc291cmNlc0NsYWltZWQgPSBUUlVFOworCXBEcnZEYXRhLT5iUmVzb3VyY2VzQ2xhaW1lZCA9IHRydWU7CiAKIAlyZXR2YWwgPSB0cDM3ODBJX0VuYWJsZURTUCgmcERydkRhdGEtPnJCRERhdGEpOwogCVBSSU5US18yKFRSQUNFX01XQVZFLApAQCAtNjM5LDcgKzYzOSw3IEBACiAJCQkJIiBGYWlsZWQgdG8gZW5hYmxlIERTUFxuIik7CiAJCWdvdG8gY2xlYW51cF9lcnJvcjsKIAl9Ci0JcERydkRhdGEtPmJEU1BFbmFibGVkID0gVFJVRTsKKwlwRHJ2RGF0YS0+YkRTUEVuYWJsZWQgPSB0cnVlOwogCiAJaWYgKG1pc2NfcmVnaXN0ZXIoJm13YXZlX21pc2NfZGV2KSA8IDApIHsKIAkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCkBAIC02NDcsNyArNjQ3LDcgQEAKIAkJCQkiIEZhaWxlZCB0byByZWdpc3RlciBtaXNjIGRldmljZVxuIik7CiAJCWdvdG8gY2xlYW51cF9lcnJvcjsKIAl9Ci0JcERydkRhdGEtPmJNd2F2ZURldlJlZ2lzdGVyZWQgPSBUUlVFOworCXBEcnZEYXRhLT5iTXdhdmVEZXZSZWdpc3RlcmVkID0gdHJ1ZTsKIAogCXBEcnZEYXRhLT5zTGluZSA9IHJlZ2lzdGVyX3NlcmlhbF9wb3J0YW5kaXJxKAogCQlwRHJ2RGF0YS0+ckJERGF0YS5yRHNwU2V0dGluZ3MudXNVYXJ0QmFzZUlPLApAQCAtNjY4LDcgKzY2OCw3IEBACiAKIAlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZtd2F2ZV9kZXZpY2UpKQogCQlnb3RvIGNsZWFudXBfZXJyb3I7Ci0JcERydkRhdGEtPmRldmljZV9yZWdpc3RlcmVkID0gVFJVRTsKKwlwRHJ2RGF0YS0+ZGV2aWNlX3JlZ2lzdGVyZWQgPSB0cnVlOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG13YXZlX2Rldl9hdHRycyk7IGkrKykgewogCQlpZihkZXZpY2VfY3JlYXRlX2ZpbGUoJm13YXZlX2RldmljZSwgbXdhdmVfZGV2X2F0dHJzW2ldKSkgewogCQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5oIGIvZHJpdmVycy9jaGFyL213YXZlL213YXZlZGQuaAppbmRleCA3ZTBkNTMwLi4zN2UwYTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXdhdmUvbXdhdmVkZC5oCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9td2F2ZWRkLmgKQEAgLTEyNSw4ICsxMjUsOCBAQAogCiB0eXBlZGVmIHN0cnVjdCBfTVdBVkVfSVBDIHsKIAl1bnNpZ25lZCBzaG9ydCB1c0ludENvdW50OwkvKiAwPW5vbmUsIDE9Zmlyc3QsIDI9Z3JlYXRlciB0aGFuIDFzdCAqLwotCUJPT0xFQU4gYklzRW5hYmxlZDsKLQlCT09MRUFOIGJJc0hlcmU7CisJYm9vbCBiSXNFbmFibGVkOworCWJvb2wgYklzSGVyZTsKIAkvKiBlbnRyeSBzcGluIGxvY2sgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBpcGNfd2FpdF9xdWV1ZTsKIH0gTVdBVkVfSVBDOwpAQCAtMTM1LDEyICsxMzUsMTIgQEAKIAlUSElOS1BBRF9CRF9EQVRBIHJCRERhdGE7CS8qIGJvYXJkIGRyaXZlcidzIGRhdGEgYXJlYSAqLwogCXVuc2lnbmVkIGxvbmcgdWxJUENTb3VyY2VfSVNSOwkvKiBJUEMgc291cmNlIGJpdHMgZm9yIHJlY2VudGx5IHByb2Nlc3NlZCBpbnRyLCBzZXQgZHVyaW5nIElTUiBwcm9jZXNzaW5nICovCiAJdW5zaWduZWQgbG9uZyB1bElQQ1NvdXJjZV9EUEM7CS8qIElQQyBzb3VyY2UgYml0cyBmb3IgcmVjZW50bHkgcHJvY2Vzc2VkIGludHIsIHNldCBkdXJpbmcgRFBDIHByb2Nlc3NpbmcgKi8KLQlCT09MRUFOIGJCREluaXRpYWxpemVkOwotCUJPT0xFQU4gYlJlc291cmNlc0NsYWltZWQ7Ci0JQk9PTEVBTiBiRFNQRW5hYmxlZDsKLQlCT09MRUFOIGJEU1BSZXNldDsKKwlib29sIGJCREluaXRpYWxpemVkOworCWJvb2wgYlJlc291cmNlc0NsYWltZWQ7CisJYm9vbCBiRFNQRW5hYmxlZDsKKwlib29sIGJEU1BSZXNldDsKIAlNV0FWRV9JUEMgSVBDc1sxNl07Ci0JQk9PTEVBTiBiTXdhdmVEZXZSZWdpc3RlcmVkOworCWJvb2wgYk13YXZlRGV2UmVnaXN0ZXJlZDsKIAlzaG9ydCBzTGluZTsKIAlpbnQgbnJfcmVnaXN0ZXJlZF9hdHRyczsKIAlpbnQgZGV2aWNlX3JlZ2lzdGVyZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvc21hcGkuYyBiL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5jCmluZGV4IDYxODdmZDEuLjhjNTQxMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5jCkBAIC00OTMsNyArNDkzLDcgQEAKIH0KIAogCi1pbnQgc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShCT09MRUFOIGJPbikKK2ludCBzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKGJvb2wgYk9uKQogewogCWludCBiUkMgPSAtRUlPOwogCXVuc2lnbmVkIHNob3J0IHVzQVgsIHVzQlgsIHVzQ1gsIHVzRFgsIHVzREksIHVzU0k7CkBAIC01NTYsNyArNTU2LDcgQEAKIAkJCVBSSU5US19FUlJPUigic21hcGk6OnNtYXBpX2luaXQsIEVSUk9SIHVuYWJsZSB0byByZWFkIGZyb20gU01BUEkgcG9ydFxuIik7CiAJCX0gZWxzZSB7CiAJCQlQUklOVEtfMihUUkFDRV9TTUFQSSwKLQkJCQkic21hcGk6OnNtYXBpX2luaXQsIGV4aXQgVFJVRSBnX3VzU21hcGlQb3J0ICV4XG4iLAorCQkJCSJzbWFwaTo6c21hcGlfaW5pdCwgZXhpdCB0cnVlIGdfdXNTbWFwaVBvcnQgJXhcbiIsCiAJCQkJZ191c1NtYXBpUG9ydCk7CiAJCQlyZXR2YWwgPSAwOwogCQkJLy9TbWFwaVF1ZXJ5U3lzdGVtSUQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9td2F2ZS9zbWFwaS5oIGIvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmgKaW5kZXggNjRiMmVjMS4uZWJjMjA2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmgKKysrIGIvZHJpdmVycy9jaGFyL213YXZlL3NtYXBpLmgKQEAgLTQ5LDEwICs0OSw2IEBACiAjaWZuZGVmIF9MSU5VWF9TTUFQSV9ICiAjZGVmaW5lIF9MSU5VWF9TTUFQSV9ICiAKLSNkZWZpbmUgVFJVRSAxCi0jZGVmaW5lIEZBTFNFIDAKLSNkZWZpbmUgQk9PTEVBTiBpbnQKLQogdHlwZWRlZiBzdHJ1Y3QgewogCWludCBiRFNQUHJlc2VudDsKIAlpbnQgYkRTUEVuYWJsZWQ7CkBAIC03NCw3ICs3MCw3IEBACiBpbnQgc21hcGlfaW5pdCh2b2lkKTsKIGludCBzbWFwaV9xdWVyeV9EU1BfY2ZnKFNNQVBJX0RTUF9TRVRUSU5HUyAqIHBTZXR0aW5ncyk7CiBpbnQgc21hcGlfc2V0X0RTUF9jZmcodm9pZCk7Ci1pbnQgc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShCT09MRUFOIGJPbik7CitpbnQgc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShib29sIGJPbik7CiAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXdhdmUvdHAzNzgwaS5jIGIvZHJpdmVycy9jaGFyL213YXZlL3RwMzc4MGkuYwppbmRleCAwNGU2ZDZhLi41ZTE2MThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbXdhdmUvdHAzNzgwaS5jCisrKyBiL2RyaXZlcnMvY2hhci9td2F2ZS90cDM3ODBpLmMKQEAgLTgwLDEzICs4MCwxMyBAQAogCVdyaXRlTXNhQ2ZnKERTUF9HcGlvTW9kZUNvbnRyb2xfMTVfOCwgTUtXT1JEKHJHcGlvTW9kZSkpOwogCiAJTUtXT1JEKHJHcGlvRHJpdmVyRW5hYmxlKSA9IDA7Ci0JckdwaW9Ecml2ZXJFbmFibGUuRW5hYmxlMTAgPSBUUlVFOwotCXJHcGlvRHJpdmVyRW5hYmxlLk1hc2sxMCA9IFRSVUU7CisJckdwaW9Ecml2ZXJFbmFibGUuRW5hYmxlMTAgPSB0cnVlOworCXJHcGlvRHJpdmVyRW5hYmxlLk1hc2sxMCA9IHRydWU7CiAJV3JpdGVNc2FDZmcoRFNQX0dwaW9Ecml2ZXJFbmFibGVfMTVfOCwgTUtXT1JEKHJHcGlvRHJpdmVyRW5hYmxlKSk7CiAKIAlNS1dPUkQockdwaW9PdXRwdXREYXRhKSA9IDA7CiAJckdwaW9PdXRwdXREYXRhLkxhdGNoMTAgPSAwOwotCXJHcGlvT3V0cHV0RGF0YS5NYXNrMTAgPSBUUlVFOworCXJHcGlvT3V0cHV0RGF0YS5NYXNrMTAgPSB0cnVlOwogCVdyaXRlTXNhQ2ZnKERTUF9HcGlvT3V0cHV0RGF0YV8xNV84LCBNS1dPUkQockdwaW9PdXRwdXREYXRhKSk7CiAKIAlQUklOVEtfMShUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6RW5hYmxlU1JBTSBleGl0XG4iKTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogCQkJCVBSSU5US18yKFRSQUNFX1RQMzc4MEksCiAJCQkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQgdXNJbnRDb3VudCAleFxuIiwKIAkJCQkJcERydkRhdGEtPklQQ3NbdXNQQ051bSAtIDFdLnVzSW50Q291bnQpOwotCQkJCWlmIChwRHJ2RGF0YS0+SVBDc1t1c1BDTnVtIC0gMV0uYklzRW5hYmxlZCA9PSBUUlVFKSB7CisJCQkJaWYgKHBEcnZEYXRhLT5JUENzW3VzUENOdW0gLSAxXS5iSXNFbmFibGVkID09IHRydWUpIHsKIAkJCQkJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKIAkJCQkJCSJ0cDM3ODBpOjpEc3BJbnRlcnJ1cHQsIHdha2luZyB1cCB1c1BDTnVtICV4XG4iLAogCQkJCQkJdXNQQ051bSAtIDEpOwpAQCAtMTYwLDggKzE2MCw4IEBACiAKIAlQUklOVEtfMihUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9Jbml0aWFsaXplQm9hcmREYXRhIGVudHJ5IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOwogCi0JcEJERGF0YS0+YkRTUEVuYWJsZWQgPSBGQUxTRTsKLQlwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkID0gRkFMU0U7CisJcEJERGF0YS0+YkRTUEVuYWJsZWQgPSBmYWxzZTsKKwlwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkID0gZmFsc2U7CiAKIAlyZXR2YWwgPSBzbWFwaV9pbml0KCk7CiAJaWYgKHJldHZhbCkgewpAQCAtMjY5LDcgKzI2OSw3IEBACiAKIAlpZiAocFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCkgewogCQlmcmVlX2lycShwU2V0dGluZ3MtPnVzRHNwSXJxLCBOVUxMKTsKLQkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IEZBTFNFOworCQlwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkID0gZmFsc2U7CiAJfQogCiAJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwKQEAgLTI4Myw3ICsyODMsNyBAQAogaW50IHRwMzc4MElfRW5hYmxlRFNQKFRISU5LUEFEX0JEX0RBVEEgKiBwQkREYXRhKQogewogCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7Ci0JQk9PTEVBTiBiRFNQUG93ZXJlZFVwID0gRkFMU0UsIGJJbnRlcnJ1cHRBbGxvY2F0ZWQgPSBGQUxTRTsKKwlib29sIGJEU1BQb3dlcmVkVXAgPSBmYWxzZSwgYkludGVycnVwdEFsbG9jYXRlZCA9IGZhbHNlOwogCiAJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQIGVudHJ5IHBCRERhdGEgJXBcbiIsIHBCRERhdGEpOwogCkBAIC0zMzYsMTQgKzMzNiwxNCBAQAogCQl9CiAJfQogCi0JcFNldHRpbmdzLT5iRHNwSXJxQWN0aXZlTG93ID0gcFNldHRpbmdzLT5iRHNwSXJxUHVsc2UgPSBUUlVFOwotCXBTZXR0aW5ncy0+YlVhcnRJcnFBY3RpdmVMb3cgPSBwU2V0dGluZ3MtPmJVYXJ0SXJxUHVsc2UgPSBUUlVFOworCXBTZXR0aW5ncy0+YkRzcElycUFjdGl2ZUxvdyA9IHBTZXR0aW5ncy0+YkRzcElycVB1bHNlID0gdHJ1ZTsKKwlwU2V0dGluZ3MtPmJVYXJ0SXJxQWN0aXZlTG93ID0gcFNldHRpbmdzLT5iVWFydElycVB1bHNlID0gdHJ1ZTsKIAogCWlmIChwQkREYXRhLT5iU2hhcmVEc3BJcnEpIHsKLQkJcFNldHRpbmdzLT5iRHNwSXJxQWN0aXZlTG93ID0gRkFMU0U7CisJCXBTZXR0aW5ncy0+YkRzcElycUFjdGl2ZUxvdyA9IGZhbHNlOwogCX0KIAlpZiAocEJERGF0YS0+YlNoYXJlVWFydElycSkgewotCQlwU2V0dGluZ3MtPmJVYXJ0SXJxQWN0aXZlTG93ID0gRkFMU0U7CisJCXBTZXR0aW5ncy0+YlVhcnRJcnFBY3RpdmVMb3cgPSBmYWxzZTsKIAl9CiAKIAlwU2V0dGluZ3MtPnVzTnVtVHJhbnNmZXJzID0gVFBfQ0ZHX051bVRyYW5zZmVyczsKQEAgLTM3MywxNiArMzczLDE2IEBACiAJCVBSSU5US18zKFRSQUNFX1RQMzc4MEksCiAJCQkidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1AsIGdvdCBpbnRlcnJ1cHQgJXggYlNoYXJlRHNwSXJxICV4XG4iLAogCQkJcFNldHRpbmdzLT51c0RzcElycSwgcEJERGF0YS0+YlNoYXJlRHNwSXJxKTsKLQkJYkludGVycnVwdEFsbG9jYXRlZCA9IFRSVUU7Ci0JCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBUUlVFOworCQliSW50ZXJydXB0QWxsb2NhdGVkID0gdHJ1ZTsKKwkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IHRydWU7CiAJfQogCi0Jc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShGQUxTRSk7Ci0JaWYgKHNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoVFJVRSkpIHsKLQkJUFJJTlRLX0VSUk9SKEtFUk5fRVJSX01XQVZFICJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogRXJyb3I6IHNtYXBpX3NldF9EU1BfcG93ZXJfc3RhdGUoVFJVRSkgZmFpbGVkXG4iKTsKKwlzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKGZhbHNlKTsKKwlpZiAoc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZSh0cnVlKSkgeworCQlQUklOVEtfRVJST1IoS0VSTl9FUlJfTVdBVkUgInRwMzc4MGk6OnRwMzc4MElfRW5hYmxlRFNQOiBFcnJvcjogc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZSh0cnVlKSBmYWlsZWRcbiIpOwogCQlnb3RvIGV4aXRfY2xlYW51cDsKIAl9IGVsc2UgewotCQliRFNQUG93ZXJlZFVwID0gVFJVRTsKKwkJYkRTUFBvd2VyZWRVcCA9IHRydWU7CiAJfQogCiAJaWYgKGRzcDM3ODBJX0VuYWJsZURTUChwU2V0dGluZ3MsIHNfYXVzVGhpbmtwYWRJcnFUb0ZpZWxkLCBzX2F1c1RoaW5rcGFkRG1hVG9GaWVsZCkpIHsKQEAgLTM5Miw3ICszOTIsNyBAQAogCiAJRW5hYmxlU1JBTShwQkREYXRhKTsKIAotCXBCRERhdGEtPmJEU1BFbmFibGVkID0gVFJVRTsKKwlwQkREYXRhLT5iRFNQRW5hYmxlZCA9IHRydWU7CiAKIAlQUklOVEtfMShUUkFDRV9UUDM3ODBJLCAidHAzNzgwaTo6dHAzNzgwSV9FbmFibGVEU1AgZXhpdFxuIik7CiAKQEAgLTQwMSwxMCArNDAxLDEwIEBACiBleGl0X2NsZWFudXA6CiAJUFJJTlRLX0VSUk9SKCJ0cDM3ODBpOjp0cDM3ODBJX0VuYWJsZURTUDogQ2xlYW5pbmcgdXBcbiIpOwogCWlmIChiRFNQUG93ZXJlZFVwKQotCQlzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKEZBTFNFKTsKKwkJc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShmYWxzZSk7CiAJaWYgKGJJbnRlcnJ1cHRBbGxvY2F0ZWQpIHsKIAkJZnJlZV9pcnEocFNldHRpbmdzLT51c0RzcElycSwgTlVMTCk7Ci0JCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBGQUxTRTsKKwkJcFNldHRpbmdzLT5iSW50ZXJydXB0Q2xhaW1lZCA9IGZhbHNlOwogCX0KIAlyZXR1cm4gLUVJTzsKIH0KQEAgLTQyMSwxMCArNDIxLDEwIEBACiAJCWRzcDM3ODBJX0Rpc2FibGVEU1AoJnBCRERhdGEtPnJEc3BTZXR0aW5ncyk7CiAJCWlmIChwU2V0dGluZ3MtPmJJbnRlcnJ1cHRDbGFpbWVkKSB7CiAJCQlmcmVlX2lycShwU2V0dGluZ3MtPnVzRHNwSXJxLCBOVUxMKTsKLQkJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBGQUxTRTsKKwkJCXBTZXR0aW5ncy0+YkludGVycnVwdENsYWltZWQgPSBmYWxzZTsKIAkJfQotCQlzbWFwaV9zZXRfRFNQX3Bvd2VyX3N0YXRlKEZBTFNFKTsKLQkJcEJERGF0YS0+YkRTUEVuYWJsZWQgPSBGQUxTRTsKKwkJc21hcGlfc2V0X0RTUF9wb3dlcl9zdGF0ZShmYWxzZSk7CisJCXBCRERhdGEtPmJEU1BFbmFibGVkID0gZmFsc2U7CiAJfQogCiAJUFJJTlRLXzIoVFJBQ0VfVFAzNzgwSSwgInRwMzc4MGk6OnRwMzc4MElfRGlzYWJsZURTUCBleGl0IHJldHZhbCAleFxuIiwgcmV0dmFsKTsKQEAgLTUxNiw3ICs1MTYsNyBAQAogCWludCByZXR2YWwgPSAwOwogCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CiAJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOwotCUJPT0xFQU4gYlJDID0gMDsKKwlib29sIGJSQyA9IDA7CiAKIAlQUklOVEtfNihUUkFDRV9UUDM3ODBJLAogCQkidHAzNzgwaTo6dHAzNzgwSV9SZWFkV3JpdGVEc3BEU3RvcmUgZW50cnkgcEJERGF0YSAlcCwgdU9wY29kZSAleCwgcHZCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKQEAgLTU1Miw3ICs1NTIsNyBAQAogCWludCByZXR2YWwgPSAwOwogCURTUF8zNzgwSV9DT05GSUdfU0VUVElOR1MgKnBTZXR0aW5ncyA9ICZwQkREYXRhLT5yRHNwU2V0dGluZ3M7CiAJdW5zaWduZWQgc2hvcnQgdXNEc3BCYXNlSU8gPSBwU2V0dGluZ3MtPnVzRHNwQmFzZUlPOwotCUJPT0xFQU4gYlJDID0gMDsKKwlib29sIGJSQyA9IDA7CiAKIAlQUklOVEtfNihUUkFDRV9UUDM3ODBJLAogCQkidHAzNzgwaTo6dHAzNzgwSV9SZWFkV3JpdGVEc3BJU3RvcmUgZW50cnkgcEJERGF0YSAlcCwgdU9wY29kZSAleCwgcHZCdWZmZXIgJXAsIHVDb3VudCAleCwgdWxEU1BBZGRyICVseFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wcGRldi5jIGIvZHJpdmVycy9jaGFyL3BwZGV2LmMKaW5kZXggZjhhNDgzYy4uZDIzMzY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3BwZGV2LmMKKysrIGIvZHJpdmVycy9jaGFyL3BwZGV2LmMKQEAgLTI4Niw3ICsyODYsNyBAQAogCXN0cnVjdCBwYXJwb3J0ICpwb3J0OwogCXN0cnVjdCBwYXJkZXZpY2UgKnBkZXYgPSBOVUxMOwogCWNoYXIgKm5hbWU7Ci0JaW50IGZsOworCXN0cnVjdCBwYXJkZXZfY2IgcHBkZXZfY2I7CiAKIAluYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsIENIUkRFViAiJXgiLCBtaW5vcik7CiAJaWYgKG5hbWUgPT0gTlVMTCkKQEAgLTI5OSw5ICsyOTksMTEgQEAKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAKLQlmbCA9IChwcC0+ZmxhZ3MgJiBQUF9FWENMKSA/IFBBUlBPUlRfRkxBR19FWENMIDogMDsKLQlwZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZpY2UocG9ydCwgbmFtZSwgTlVMTCwKLQkJCQkgICAgICAgTlVMTCwgcHBfaXJxLCBmbCwgcHApOworCW1lbXNldCgmcHBkZXZfY2IsIDAsIHNpemVvZihwcGRldl9jYikpOworCXBwZGV2X2NiLmlycV9mdW5jID0gcHBfaXJxOworCXBwZGV2X2NiLmZsYWdzID0gKHBwLT5mbGFncyAmIFBQX0VYQ0wpID8gUEFSUE9SVF9GTEFHX0VYQ0wgOiAwOworCXBwZGV2X2NiLnByaXZhdGUgPSBwcDsKKwlwZGV2ID0gcGFycG9ydF9yZWdpc3Rlcl9kZXZfbW9kZWwocG9ydCwgbmFtZSwgJnBwZGV2X2NiLCBtaW5vcik7CiAJcGFycG9ydF9wdXRfcG9ydChwb3J0KTsKIAogCWlmICghcGRldikgewpAQCAtNzk5LDEwICs4MDEsMjMgQEAKIAlkZXZpY2VfZGVzdHJveShwcGRldl9jbGFzcywgTUtERVYoUFBfTUFKT1IsIHBvcnQtPm51bWJlcikpOwogfQogCitzdGF0aWMgaW50IHBwX3Byb2JlKHN0cnVjdCBwYXJkZXZpY2UgKnBhcl9kZXYpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IHBhcl9kZXYtPmRldi5kcml2ZXI7CisJaW50IGxlbiA9IHN0cmxlbihkcnYtPm5hbWUpOworCisJaWYgKHN0cm5jbXAocGFyX2Rldi0+bmFtZSwgZHJ2LT5uYW1lLCBsZW4pKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHBhcnBvcnRfZHJpdmVyIHBwX2RyaXZlciA9IHsKIAkubmFtZQkJPSBDSFJERVYsCi0JLmF0dGFjaAkJPSBwcF9hdHRhY2gsCisJLnByb2JlCQk9IHBwX3Byb2JlLAorCS5tYXRjaF9wb3J0CT0gcHBfYXR0YWNoLAogCS5kZXRhY2gJCT0gcHBfZGV0YWNoLAorCS5kZXZtb2RlbAk9IHRydWUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBwcGRldl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc25zYy5jIGIvZHJpdmVycy9jaGFyL3Nuc2MuYwppbmRleCA5NDAwNmY5Li4xMGU1NjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc25zYy5jCisrKyBiL2RyaXZlcnMvY2hhci9zbnNjLmMKQEAgLTM4NSwxMyArMzg1LDE4IEBACiAKIAlldmVudF9uYXNpZCA9IGlhNjRfc25fZ2V0X2NvbnNvbGVfbmFzaWQoKTsKIAorCXNuc2NfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsIFNZU0NUTF9CQVNFTkFNRSk7CisJaWYgKElTX0VSUihzbnNjX2NsYXNzKSkgeworCQlwcmludGsoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgY2xhc3NcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIFBUUl9FUlIoc25zY19jbGFzcyk7CisJfQorCiAJaWYgKGFsbG9jX2NocmRldl9yZWdpb24oJmZpcnN0X2RldiwgMCwgbnVtX2Nub2RlcywKIAkJCQlTWVNDVExfQkFTRU5BTUUpIDwgMCkgewogCQlwcmludGsoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgU04gc3lzdGVtIGNvbnRyb2xsZXIgZGV2aWNlXG4iLAogCQkgICAgICAgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0Jc25zY19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgU1lTQ1RMX0JBU0VOQU1FKTsKIAogCWZvciAoY25vZGUgPSAwOyBjbm9kZSA8IG51bV9jbm9kZXM7IGNub2RlKyspIHsKIAkJCWdlb2lkID0gY25vZGVpZF9nZXRfZ2VvaWQoY25vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jIGIvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jCmluZGV4IDY5ZjZiNGEuLjM5ODgwMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90aWxlLXNyb20uYworKysgYi9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMKQEAgLTMzMSwxMyArMzMxLDExIEBACiAvKioKICAqIHNyb21fc2V0dXBfbWlub3IoKSAtIEluaXRpYWxpemUgcGVyLW1pbm9yIGluZm9ybWF0aW9uLgogICogQHNyb206IFBlci1kZXZpY2UgU1JPTSBzdGF0ZS4KLSAqIEBpbmRleDogRGV2aWNlIHRvIHNldCB1cC4KKyAqIEBkZXZoZGw6IFBhcnRpdGlvbiBkZXZpY2UgaGFuZGxlLgogICovCi1zdGF0aWMgaW50IHNyb21fc2V0dXBfbWlub3Ioc3RydWN0IHNyb21fZGV2ICpzcm9tLCBpbnQgaW5kZXgpCitzdGF0aWMgaW50IHNyb21fc2V0dXBfbWlub3Ioc3RydWN0IHNyb21fZGV2ICpzcm9tLCBpbnQgZGV2aGRsKQogewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlpbnQgZGV2aGRsID0gc3JvbS0+aHZfZGV2aGRsOwotCisJc3JvbS0+aHZfZGV2aGRsID0gZGV2aGRsOwogCW11dGV4X2luaXQoJnNyb20tPmxvY2spOwogCiAJaWYgKF9zcm9tX3JlYWQoZGV2aGRsLCAmc3JvbS0+dG90YWxfc2l6ZSwKQEAgLTM1MCw5ICszNDgsNyBAQAogCQkgICAgICAgU1JPTV9QQUdFX1NJWkVfT0ZGLCBzaXplb2Yoc3JvbS0+cGFnZV9zaXplKSkgPCAwKQogCQlyZXR1cm4gLUVJTzsKIAotCWRldiA9IGRldmljZV9jcmVhdGUoc3JvbV9jbGFzcywgJnNyb21fcGFyZW50LT5kZXYsCi0JCQkgICAgTUtERVYoc3JvbV9tYWpvciwgaW5kZXgpLCBzcm9tLCAiJWQiLCBpbmRleCk7Ci0JcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhkZXYpOworCXJldHVybiAwOwogfQogCiAvKiogc3JvbV9pbml0KCkgLSBJbml0aWFsaXplIHRoZSBkcml2ZXIncyBtb2R1bGUuICovCkBAIC0zNjUsNyArMzYxLDcgQEAKIAkgKiBTdGFydCB3aXRoIGEgcGxhdXNpYmxlIG51bWJlciBvZiBwYXJ0aXRpb25zOyB0aGUga3JlYWxsb2MoKSBjYWxsCiAJICogYmVsb3cgd2lsbCB5aWVsZCBhYm91dCBsb2coc3JvbV9kZXZzKSBhZGRpdGlvbmFsIGFsbG9jYXRpb25zLgogCSAqLwotCXNyb21fZGV2aWNlcyA9IGt6YWxsb2MoNCAqIHNpemVvZihzdHJ1Y3Qgc3JvbV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlzcm9tX2RldmljZXMgPSBrbWFsbG9jKDQgKiBzaXplb2Yoc3RydWN0IHNyb21fZGV2KSwgR0ZQX0tFUk5FTCk7CiAKIAkvKiBEaXNjb3ZlciB0aGUgbnVtYmVyIG9mIHNyb20gcGFydGl0aW9ucy4gKi8KIAlmb3IgKGkgPSAwOyA7IGkrKykgewpAQCAtMzczLDcgKzM2OSw3IEBACiAJCWNoYXIgYnVmWzIwXTsKIAkJc3RydWN0IHNyb21fZGV2ICpuZXdfc3JvbV9kZXZpY2VzID0KIAkJCWtyZWFsbG9jKHNyb21fZGV2aWNlcywgKGkrMSkgKiBzaXplb2Yoc3RydWN0IHNyb21fZGV2KSwKLQkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCQkJCSBHRlBfS0VSTkVMKTsKIAkJaWYgKCFuZXdfc3JvbV9kZXZpY2VzKSB7CiAJCQlyZXN1bHQgPSAtRU5PTUVNOwogCQkJZ290byBmYWlsX21lbTsKQEAgLTM4Nyw3ICszODMsOSBAQAogCQkJCQkgIGksIGRldmhkbCk7CiAJCQlicmVhazsKIAkJfQotCQlzcm9tX2RldmljZXNbaV0uaHZfZGV2aGRsID0gZGV2aGRsOworCQlyZXN1bHQgPSBzcm9tX3NldHVwX21pbm9yKCZzcm9tX2RldmljZXNbaV0sIGRldmhkbCk7CisJCWlmIChyZXN1bHQgIT0gMCkKKwkJCWdvdG8gZmFpbF9tZW07CiAJfQogCXNyb21fZGV2cyA9IGk7CiAKQEAgLTQzMSw5ICs0MjksMTMgQEAKIAlzcm9tX2NsYXNzLT5kZXZfZ3JvdXBzID0gc3JvbV9kZXZfZ3JvdXBzOwogCXNyb21fY2xhc3MtPmRldm5vZGUgPSBzcm9tX2Rldm5vZGU7CiAKLQkvKiBEbyBwZXItcGFydGl0aW9uIGluaXRpYWxpemF0aW9uICovCisJLyogQ3JlYXRlIHBlci1wYXJ0aXRpb24gZGV2aWNlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBzcm9tX2RldnM7IGkrKykgewotCQlyZXN1bHQgPSBzcm9tX3NldHVwX21pbm9yKHNyb21fZGV2aWNlcyArIGksIGkpOworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPQorCQkJZGV2aWNlX2NyZWF0ZShzcm9tX2NsYXNzLCAmc3JvbV9wYXJlbnQtPmRldiwKKwkJCQkgICAgICBNS0RFVihzcm9tX21ham9yLCBpKSwgc3JvbV9kZXZpY2VzICsgaSwKKwkJCQkgICAgICAiJWQiLCBpKTsKKwkJcmVzdWx0ID0gUFRSX0VSUl9PUl9aRVJPKGRldik7CiAJCWlmIChyZXN1bHQgPCAwKQogCQkJZ290byBmYWlsX2NsYXNzOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vc3QzM3pwMjQvc3QzM3pwMjQuYyBiL2RyaXZlcnMvY2hhci90cG0vc3QzM3pwMjQvc3QzM3pwMjQuYwppbmRleCBjMmVlMzA0Li42ZjA2MGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3N0MzN6cDI0L3N0MzN6cDI0LmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9zdDMzenAyNC5jCkBAIC01ODksOCArNTg5LDYgQEAKIAkJY2hpcC0+ZmxhZ3MgfD0gVFBNX0NISVBfRkxBR19JUlE7CiAKIAkJZGlzYWJsZV9pcnFfbm9zeW5jKHRwbV9kZXYtPmlycSk7Ci0KLQkJdHBtX2dlbl9pbnRlcnJ1cHQoY2hpcCk7CiAJfQogCiAJcmV0dXJuIHRwbV9jaGlwX3JlZ2lzdGVyKGNoaXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0tZGV2LmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS1kZXYuYwppbmRleCBmNWQ0NTIxLi45MTJhZDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS1kZXYuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS1kZXYuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJCXJldHVybiAtRVBJUEU7CiAJfQogCW91dF9zaXplID0gdHBtX3RyYW5zbWl0KHByaXYtPmNoaXAsIHByaXYtPmRhdGFfYnVmZmVyLAotCQkJCXNpemVvZihwcml2LT5kYXRhX2J1ZmZlcikpOworCQkJCXNpemVvZihwcml2LT5kYXRhX2J1ZmZlciksIDApOwogCiAJdHBtX3B1dF9vcHMocHJpdi0+Y2hpcCk7CiAJaWYgKG91dF9zaXplIDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0taW50ZXJmYWNlLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS1pbnRlcmZhY2UuYwppbmRleCAxYWJlMmQ3Li44ZGU2MTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS1pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS1pbnRlcmZhY2UuYwpAQCAtMzMwLDEzICszMzAsMTYgQEAKIC8qCiAgKiBJbnRlcm5hbCBrZXJuZWwgaW50ZXJmYWNlIHRvIHRyYW5zbWl0IFRQTSBjb21tYW5kcwogICovCi1zc2l6ZV90IHRwbV90cmFuc21pdChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJICAgICBzaXplX3QgYnVmc2l6KQorc3NpemVfdCB0cG1fdHJhbnNtaXQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCBjb25zdCB1OCAqYnVmLCBzaXplX3QgYnVmc2l6LAorCQkgICAgIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzc2l6ZV90IHJjOwogCXUzMiBjb3VudCwgb3JkaW5hbDsKIAl1bnNpZ25lZCBsb25nIHN0b3A7CiAKKwlpZiAoYnVmc2l6IDwgVFBNX0hFQURFUl9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChidWZzaXogPiBUUE1fQlVGU0laRSkKIAkJYnVmc2l6ID0gVFBNX0JVRlNJWkU7CiAKQEAgLTM1MCw3ICszNTMsOCBAQAogCQlyZXR1cm4gLUUyQklHOwogCX0KIAotCW11dGV4X2xvY2soJmNoaXAtPnRwbV9tdXRleCk7CisJaWYgKCEoZmxhZ3MgJiBUUE1fVFJBTlNNSVRfVU5MT0NLRUQpKQorCQltdXRleF9sb2NrKCZjaGlwLT50cG1fbXV0ZXgpOwogCiAJcmMgPSBjaGlwLT5vcHMtPnNlbmQoY2hpcCwgKHU4ICopIGJ1ZiwgY291bnQpOwogCWlmIChyYyA8IDApIHsKQEAgLTM5MywyMCArMzk3LDIxIEBACiAJCWRldl9lcnIoJmNoaXAtPmRldiwKIAkJCSJ0cG1fdHJhbnNtaXQ6IHRwbV9yZWN2OiBlcnJvciAlemRcbiIsIHJjKTsKIG91dDoKLQltdXRleF91bmxvY2soJmNoaXAtPnRwbV9tdXRleCk7CisJaWYgKCEoZmxhZ3MgJiBUUE1fVFJBTlNNSVRfVU5MT0NLRUQpKQorCQltdXRleF91bmxvY2soJmNoaXAtPnRwbV9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQogCiAjZGVmaW5lIFRQTV9ESUdFU1RfU0laRSAyMAogI2RlZmluZSBUUE1fUkVUX0NPREVfSURYIDYKIAotc3NpemVfdCB0cG1fdHJhbnNtaXRfY21kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdm9pZCAqY21kLAotCQkJIGludCBsZW4sIGNvbnN0IGNoYXIgKmRlc2MpCitzc2l6ZV90IHRwbV90cmFuc21pdF9jbWQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCBjb25zdCB2b2lkICpjbWQsCisJCQkgaW50IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXNjKQogewotCXN0cnVjdCB0cG1fb3V0cHV0X2hlYWRlciAqaGVhZGVyOworCWNvbnN0IHN0cnVjdCB0cG1fb3V0cHV0X2hlYWRlciAqaGVhZGVyOwogCWludCBlcnI7CiAKLQlsZW4gPSB0cG1fdHJhbnNtaXQoY2hpcCwgKHU4ICopIGNtZCwgbGVuKTsKKwlsZW4gPSB0cG1fdHJhbnNtaXQoY2hpcCwgKGNvbnN0IHU4ICopY21kLCBsZW4sIGZsYWdzKTsKIAlpZiAobGVuIDwgIDApCiAJCXJldHVybiBsZW47CiAJZWxzZSBpZiAobGVuIDwgVFBNX0hFQURFUl9TSVpFKQpAQCAtNDUzLDI2ICs0NTgsMTMgQEAKIAkJdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLnN1YmNhcF9zaXplID0gY3B1X3RvX2JlMzIoNCk7CiAJCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXAgPSBzdWJjYXBfaWQ7CiAJfQotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmdHBtX2NtZCwgVFBNX0lOVEVSTkFMX1JFU1VMVF9TSVpFLCBkZXNjKTsKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwgMCwKKwkJCSAgICAgIGRlc2MpOwogCWlmICghcmMpCiAJCSpjYXAgPSB0cG1fY21kLnBhcmFtcy5nZXRjYXBfb3V0LmNhcDsKIAlyZXR1cm4gcmM7CiB9Ci0KLXZvaWQgdHBtX2dlbl9pbnRlcnJ1cHQoc3RydWN0IHRwbV9jaGlwICpjaGlwKQotewotCXN0cnVjdAl0cG1fY21kX3QgdHBtX2NtZDsKLQlzc2l6ZV90IHJjOwotCi0JdHBtX2NtZC5oZWFkZXIuaW4gPSB0cG1fZ2V0Y2FwX2hlYWRlcjsKLQl0cG1fY21kLnBhcmFtcy5nZXRjYXBfaW4uY2FwID0gVFBNX0NBUF9QUk9QOwotCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXBfc2l6ZSA9IGNwdV90b19iZTMyKDQpOwotCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXAgPSBUUE1fQ0FQX1BST1BfVElTX1RJTUVPVVQ7Ci0KLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwKLQkJCSAgICAgICJhdHRlbXB0aW5nIHRvIGRldGVybWluZSB0aGUgdGltZW91dHMiKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHRwbV9nZW5faW50ZXJydXB0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHRwbV9nZXRjYXApOwogCiAjZGVmaW5lIFRQTV9PUkRfU1RBUlRVUCBjcHVfdG9fYmUzMigxNTMpCiAjZGVmaW5lIFRQTV9TVF9DTEVBUiBjcHVfdG9fYmUxNigxKQpAQCAtNDkwLDcgKzQ4Miw3IEBACiAJc3RhcnRfY21kLmhlYWRlci5pbiA9IHRwbV9zdGFydHVwX2hlYWRlcjsKIAogCXN0YXJ0X2NtZC5wYXJhbXMuc3RhcnR1cF9pbi5zdGFydHVwX3R5cGUgPSBzdGFydHVwX3R5cGU7Ci0JcmV0dXJuIHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnN0YXJ0X2NtZCwgVFBNX0lOVEVSTkFMX1JFU1VMVF9TSVpFLAorCXJldHVybiB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZzdGFydF9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwgMCwKIAkJCQkiYXR0ZW1wdGluZyB0byBzdGFydCB0aGUgVFBNIik7CiB9CiAKQEAgLTUyMSw3ICs1MTMsOCBAQAogCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5jYXAgPSBUUE1fQ0FQX1BST1A7CiAJdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLnN1YmNhcF9zaXplID0gY3B1X3RvX2JlMzIoNCk7CiAJdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLnN1YmNhcCA9IFRQTV9DQVBfUFJPUF9USVNfVElNRU9VVDsKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwgTlVMTCk7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZ0cG1fY21kLCBUUE1fSU5URVJOQUxfUkVTVUxUX1NJWkUsIDAsCisJCQkgICAgICBOVUxMKTsKIAogCWlmIChyYyA9PSBUUE1fRVJSX0lOVkFMSURfUE9TVElOSVQpIHsKIAkJLyogVGhlIFRQTSBpcyBub3Qgc3RhcnRlZCwgd2UgYXJlIHRoZSBmaXJzdCB0byB0YWxrIHRvIGl0LgpAQCAtNTM1LDcgKzUyOCw3IEBACiAJCXRwbV9jbWQucGFyYW1zLmdldGNhcF9pbi5zdWJjYXBfc2l6ZSA9IGNwdV90b19iZTMyKDQpOwogCQl0cG1fY21kLnBhcmFtcy5nZXRjYXBfaW4uc3ViY2FwID0gVFBNX0NBUF9QUk9QX1RJU19USU1FT1VUOwogCQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwKLQkJCQkgIE5VTEwpOworCQkJCSAgICAgIDAsIE5VTEwpOwogCX0KIAlpZiAocmMpIHsKIAkJZGV2X2VycigmY2hpcC0+ZGV2LApAQCAtNTk2LDcgKzU4OSw3IEBACiAJdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLnN1YmNhcF9zaXplID0gY3B1X3RvX2JlMzIoNCk7CiAJdHBtX2NtZC5wYXJhbXMuZ2V0Y2FwX2luLnN1YmNhcCA9IFRQTV9DQVBfUFJPUF9USVNfRFVSQVRJT047CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsIFRQTV9JTlRFUk5BTF9SRVNVTFRfU0laRSwgMCwKIAkJCSAgICAgICJhdHRlbXB0aW5nIHRvIGRldGVybWluZSB0aGUgZHVyYXRpb25zIik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC02MzMsNyArNjI2LDcgQEAKICNkZWZpbmUgVFBNX09SRF9DT05USU5VRV9TRUxGVEVTVCA4MwogI2RlZmluZSBDT05USU5VRV9TRUxGVEVTVF9SRVNVTFRfU0laRSAxMAogCi1zdGF0aWMgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgY29udGludWVfc2VsZnRlc3RfaGVhZGVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIGNvbnRpbnVlX3NlbGZ0ZXN0X2hlYWRlciA9IHsKIAkudGFnID0gVFBNX1RBR19SUVVfQ09NTUFORCwKIAkubGVuZ3RoID0gY3B1X3RvX2JlMzIoMTApLAogCS5vcmRpbmFsID0gY3B1X3RvX2JlMzIoVFBNX09SRF9DT05USU5VRV9TRUxGVEVTVCksCkBAIC02NTIsMTQgKzY0NSwxNCBAQAogCXN0cnVjdCB0cG1fY21kX3QgY21kOwogCiAJY21kLmhlYWRlci5pbiA9IGNvbnRpbnVlX3NlbGZ0ZXN0X2hlYWRlcjsKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgQ09OVElOVUVfU0VMRlRFU1RfUkVTVUxUX1NJWkUsCisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIENPTlRJTlVFX1NFTEZURVNUX1JFU1VMVF9TSVpFLCAwLAogCQkJICAgICAgImNvbnRpbnVlIHNlbGZ0ZXN0Iik7CiAJcmV0dXJuIHJjOwogfQogCiAjZGVmaW5lIFRQTV9PUkRJTkFMX1BDUlJFQUQgY3B1X3RvX2JlMzIoMjEpCiAjZGVmaW5lIFJFQURfUENSX1JFU1VMVF9TSVpFIDMwCi1zdGF0aWMgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgcGNycmVhZF9oZWFkZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgcGNycmVhZF9oZWFkZXIgPSB7CiAJLnRhZyA9IFRQTV9UQUdfUlFVX0NPTU1BTkQsCiAJLmxlbmd0aCA9IGNwdV90b19iZTMyKDE0KSwKIAkub3JkaW5hbCA9IFRQTV9PUkRJTkFMX1BDUlJFQUQKQEAgLTY3Miw3ICs2NjUsNyBAQAogCiAJY21kLmhlYWRlci5pbiA9IHBjcnJlYWRfaGVhZGVyOwogCWNtZC5wYXJhbXMucGNycmVhZF9pbi5wY3JfaWR4ID0gY3B1X3RvX2JlMzIocGNyX2lkeCk7Ci0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIFJFQURfUENSX1JFU1VMVF9TSVpFLAorCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBSRUFEX1BDUl9SRVNVTFRfU0laRSwgMCwKIAkJCSAgICAgICJhdHRlbXB0aW5nIHRvIHJlYWQgYSBwY3IgdmFsdWUiKTsKIAogCWlmIChyYyA9PSAwKQpAQCAtNzQ1LDcgKzczOCw3IEBACiAgKi8KICNkZWZpbmUgVFBNX09SRF9QQ1JfRVhURU5EIGNwdV90b19iZTMyKDIwKQogI2RlZmluZSBFWFRFTkRfUENSX1JFU1VMVF9TSVpFIDM0Ci1zdGF0aWMgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgcGNyZXh0ZW5kX2hlYWRlciA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHBtX2lucHV0X2hlYWRlciBwY3JleHRlbmRfaGVhZGVyID0gewogCS50YWcgPSBUUE1fVEFHX1JRVV9DT01NQU5ELAogCS5sZW5ndGggPSBjcHVfdG9fYmUzMigzNCksCiAJLm9yZGluYWwgPSBUUE1fT1JEX1BDUl9FWFRFTkQKQEAgLTc3MCw3ICs3NjMsNyBAQAogCWNtZC5oZWFkZXIuaW4gPSBwY3JleHRlbmRfaGVhZGVyOwogCWNtZC5wYXJhbXMucGNyZXh0ZW5kX2luLnBjcl9pZHggPSBjcHVfdG9fYmUzMihwY3JfaWR4KTsKIAltZW1jcHkoY21kLnBhcmFtcy5wY3JleHRlbmRfaW4uaGFzaCwgaGFzaCwgVFBNX0RJR0VTVF9TSVpFKTsKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgRVhURU5EX1BDUl9SRVNVTFRfU0laRSwKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgRVhURU5EX1BDUl9SRVNVTFRfU0laRSwgMCwKIAkJCSAgICAgICJhdHRlbXB0aW5nIGV4dGVuZCBhIFBDUiB2YWx1ZSIpOwogCiAJdHBtX3B1dF9vcHMoY2hpcCk7CkBAIC03OTIsNyArNzg1LDcgQEAKIAl1bnNpZ25lZCBpbnQgbG9vcHM7CiAJdW5zaWduZWQgaW50IGRlbGF5X21zZWMgPSAxMDA7CiAJdW5zaWduZWQgbG9uZyBkdXJhdGlvbjsKLQlzdHJ1Y3QgdHBtX2NtZF90IGNtZDsKKwl1OCBkdW1teVtUUE1fRElHRVNUX1NJWkVdOwogCiAJZHVyYXRpb24gPSB0cG1fY2FsY19vcmRpbmFsX2R1cmF0aW9uKGNoaXAsIFRQTV9PUkRfQ09OVElOVUVfU0VMRlRFU1QpOwogCkBAIC04MDcsOSArODAwLDggQEAKIAogCWRvIHsKIAkJLyogQXR0ZW1wdCB0byByZWFkIGEgUENSIHZhbHVlICovCi0JCWNtZC5oZWFkZXIuaW4gPSBwY3JyZWFkX2hlYWRlcjsKLQkJY21kLnBhcmFtcy5wY3JyZWFkX2luLnBjcl9pZHggPSBjcHVfdG9fYmUzMigwKTsKLQkJcmMgPSB0cG1fdHJhbnNtaXQoY2hpcCwgKHU4ICopICZjbWQsIFJFQURfUENSX1JFU1VMVF9TSVpFKTsKKwkJcmMgPSB0cG1fcGNyX3JlYWRfZGV2KGNoaXAsIDAsIGR1bW15KTsKKwogCQkvKiBTb21lIGJ1Z2d5IFRQTXMgd2lsbCBub3QgcmVzcG9uZCB0byB0cG1fdGlzX3JlYWR5KCkgZm9yCiAJCSAqIGFyb3VuZCAzMDBtcyB3aGlsZSB0aGUgc2VsZiB0ZXN0IGlzIG9uZ29pbmcsIGtlZXAgdHJ5aW5nCiAJCSAqIHVudGlsIHRoZSBzZWxmIHRlc3QgZHVyYXRpb24gZXhwaXJlcy4gKi8KQEAgLTgyNCw3ICs4MTYsNiBAQAogCQlpZiAocmMgPCBUUE1fSEVBREVSX1NJWkUpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQlyYyA9IGJlMzJfdG9fY3B1KGNtZC5oZWFkZXIub3V0LnJldHVybl9jb2RlKTsKIAkJaWYgKHJjID09IFRQTV9FUlJfRElTQUJMRUQgfHwgcmMgPT0gVFBNX0VSUl9ERUFDVElWQVRFRCkgewogCQkJZGV2X2luZm8oJmNoaXAtPmRldiwKIAkJCQkgIlRQTSBpcyBkaXNhYmxlZC9kZWFjdGl2YXRlZCAoMHglWClcbiIsIHJjKTsKQEAgLTg3OSw3ICs4NzAsNyBAQAogCWlmIChjaGlwID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGNtZCwgYnVmbGVuLCAiYXR0ZW1wdGluZyB0cG1fY21kIik7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGNtZCwgYnVmbGVuLCAwLCAiYXR0ZW1wdGluZyB0cG1fY21kIik7CiAKIAl0cG1fcHV0X29wcyhjaGlwKTsKIAlyZXR1cm4gcmM7CkBAIC05NDksNyArOTQwLDcgQEAKICNkZWZpbmUgVFBNX09SRF9TQVZFU1RBVEUgY3B1X3RvX2JlMzIoMTUyKQogI2RlZmluZSBTQVZFU1RBVEVfUkVTVUxUX1NJWkUgMTAKIAotc3RhdGljIHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHNhdmVzdGF0ZV9oZWFkZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgc2F2ZXN0YXRlX2hlYWRlciA9IHsKIAkudGFnID0gVFBNX1RBR19SUVVfQ09NTUFORCwKIAkubGVuZ3RoID0gY3B1X3RvX2JlMzIoMTApLAogCS5vcmRpbmFsID0gVFBNX09SRF9TQVZFU1RBVEUKQEAgLTk4MSwxNCArOTcyLDE1IEBACiAJCWNtZC5wYXJhbXMucGNyZXh0ZW5kX2luLnBjcl9pZHggPSBjcHVfdG9fYmUzMih0cG1fc3VzcGVuZF9wY3IpOwogCQltZW1jcHkoY21kLnBhcmFtcy5wY3JleHRlbmRfaW4uaGFzaCwgZHVtbXlfaGFzaCwKIAkJICAgICAgIFRQTV9ESUdFU1RfU0laRSk7Ci0JCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBFWFRFTkRfUENSX1JFU1VMVF9TSVpFLAorCQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgRVhURU5EX1BDUl9SRVNVTFRfU0laRSwgMCwKIAkJCQkgICAgICAiZXh0ZW5kaW5nIGR1bW15IHBjciBiZWZvcmUgc3VzcGVuZCIpOwogCX0KIAogCS8qIG5vdyBkbyB0aGUgYWN0dWFsIHNhdmVzdGF0ZSAqLwogCWZvciAodHJ5ID0gMDsgdHJ5IDwgVFBNX1JFVFJZOyB0cnkrKykgewogCQljbWQuaGVhZGVyLmluID0gc2F2ZXN0YXRlX2hlYWRlcjsKLQkJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIFNBVkVTVEFURV9SRVNVTFRfU0laRSwgTlVMTCk7CisJCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBTQVZFU1RBVEVfUkVTVUxUX1NJWkUsIDAsCisJCQkJICAgICAgTlVMTCk7CiAKIAkJLyoKIAkJICogSWYgdGhlIFRQTSBpbmRpY2F0ZXMgdGhhdCBpdCBpcyB0b28gYnVzeSB0byByZXNwb25kIHRvCkBAIC0xMDMyLDcgKzEwMjQsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwodHBtX3BtX3Jlc3VtZSk7CiAKICNkZWZpbmUgVFBNX0dFVFJBTkRPTV9SRVNVTFRfU0laRQkxOAotc3RhdGljIHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHRwbV9nZXRyYW5kb21faGVhZGVyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0cG1faW5wdXRfaGVhZGVyIHRwbV9nZXRyYW5kb21faGVhZGVyID0gewogCS50YWcgPSBUUE1fVEFHX1JRVV9DT01NQU5ELAogCS5sZW5ndGggPSBjcHVfdG9fYmUzMigxNCksCiAJLm9yZGluYWwgPSBUUE1fT1JEX0dFVF9SQU5ET00KQEAgLTEwNzIsOCArMTA2NCw4IEBACiAJCXRwbV9jbWQucGFyYW1zLmdldHJhbmRvbV9pbi5udW1fYnl0ZXMgPSBjcHVfdG9fYmUzMihudW1fYnl0ZXMpOwogCiAJCWVyciA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJnRwbV9jbWQsCi0JCQkJICAgVFBNX0dFVFJBTkRPTV9SRVNVTFRfU0laRSArIG51bV9ieXRlcywKLQkJCQkgICAiYXR0ZW1wdGluZyBnZXQgcmFuZG9tIik7CisJCQkJICAgICAgIFRQTV9HRVRSQU5ET01fUkVTVUxUX1NJWkUgKyBudW1fYnl0ZXMsCisJCQkJICAgICAgIDAsICJhdHRlbXB0aW5nIGdldCByYW5kb20iKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS1zeXNmcy5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG0tc3lzZnMuYwppbmRleCBiNDZjZjcwLi5hNzZhYjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLXN5c2ZzLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2RlZmluZSBSRUFEX1BVQkVLX1JFU1VMVF9TSVpFIDMxNAogI2RlZmluZSBUUE1fT1JEX1JFQURQVUJFSyBjcHVfdG9fYmUzMigxMjQpCi1zdGF0aWMgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgdHBtX3JlYWRwdWJla19oZWFkZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRwbV9pbnB1dF9oZWFkZXIgdHBtX3JlYWRwdWJla19oZWFkZXIgPSB7CiAJLnRhZyA9IFRQTV9UQUdfUlFVX0NPTU1BTkQsCiAJLmxlbmd0aCA9IGNwdV90b19iZTMyKDMwKSwKIAkub3JkaW5hbCA9IFRQTV9PUkRfUkVBRFBVQkVLCkBAIC0zOSw3ICszOSw3IEBACiAJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gdG9fdHBtX2NoaXAoZGV2KTsKIAogCXRwbV9jbWQuaGVhZGVyLmluID0gdHBtX3JlYWRwdWJla19oZWFkZXI7Ci0JZXJyID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmdHBtX2NtZCwgUkVBRF9QVUJFS19SRVNVTFRfU0laRSwKKwllcnIgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZ0cG1fY21kLCBSRUFEX1BVQkVLX1JFU1VMVF9TSVpFLCAwLAogCQkJICAgICAgICJhdHRlbXB0aW5nIHRvIHJlYWQgdGhlIFBVQkVLIik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oIGIvZHJpdmVycy9jaGFyL3RwbS90cG0uaAppbmRleCAzZTMyZDViLi40ZDE4M2M5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbS5oCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtLmgKQEAgLTQ3NiwzMiArNDc2LDM1IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cG1fZm9wczsKIGV4dGVybiBzdHJ1Y3QgaWRyIGRldl9udW1zX2lkcjsKIAorZW51bSB0cG1fdHJhbnNtaXRfZmxhZ3MgeworCVRQTV9UUkFOU01JVF9VTkxPQ0tFRAk9IEJJVCgwKSwKK307CisKK3NzaXplX3QgdHBtX3RyYW5zbWl0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGJ1ZnNpeiwKKwkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpOworc3NpemVfdCB0cG1fdHJhbnNtaXRfY21kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgY29uc3Qgdm9pZCAqY21kLCBpbnQgbGVuLAorCQkJIHVuc2lnbmVkIGludCBmbGFncywgY29uc3QgY2hhciAqZGVzYyk7CiBzc2l6ZV90IHRwbV9nZXRjYXAoc3RydWN0IHRwbV9jaGlwICpjaGlwLCBfX2JlMzIgc3ViY2FwX2lkLCBjYXBfdCAqY2FwLAogCQkgICBjb25zdCBjaGFyICpkZXNjKTsKLXNzaXplX3QgdHBtX3RyYW5zbWl0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgY29uc3QgY2hhciAqYnVmLAotCQkgICAgIHNpemVfdCBidWZzaXopOwotc3NpemVfdCB0cG1fdHJhbnNtaXRfY21kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdm9pZCAqY21kLCBpbnQgbGVuLAotCQkJIGNvbnN0IGNoYXIgKmRlc2MpOwotZXh0ZXJuIGludCB0cG1fZ2V0X3RpbWVvdXRzKHN0cnVjdCB0cG1fY2hpcCAqKTsKLWV4dGVybiB2b2lkIHRwbV9nZW5faW50ZXJydXB0KHN0cnVjdCB0cG1fY2hpcCAqKTsKK2ludCB0cG1fZ2V0X3RpbWVvdXRzKHN0cnVjdCB0cG1fY2hpcCAqKTsKIGludCB0cG0xX2F1dG9fc3RhcnR1cChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwotZXh0ZXJuIGludCB0cG1fZG9fc2VsZnRlc3Qoc3RydWN0IHRwbV9jaGlwICopOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdHBtX2NhbGNfb3JkaW5hbF9kdXJhdGlvbihzdHJ1Y3QgdHBtX2NoaXAgKiwgdTMyKTsKLWV4dGVybiBpbnQgdHBtX3BtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqKTsKLWV4dGVybiBpbnQgdHBtX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICopOwotZXh0ZXJuIGludCB3YWl0X2Zvcl90cG1fc3RhdChzdHJ1Y3QgdHBtX2NoaXAgKiwgdTgsIHVuc2lnbmVkIGxvbmcsCi0JCQkgICAgIHdhaXRfcXVldWVfaGVhZF90ICosIGJvb2wpOworaW50IHRwbV9kb19zZWxmdGVzdChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwordW5zaWduZWQgbG9uZyB0cG1fY2FsY19vcmRpbmFsX2R1cmF0aW9uKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTMyIG9yZGluYWwpOworaW50IHRwbV9wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CitpbnQgdHBtX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IHdhaXRfZm9yX3RwbV9zdGF0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggbWFzaywgdW5zaWduZWQgbG9uZyB0aW1lb3V0LAorCQkgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCAqcXVldWUsIGJvb2wgY2hlY2tfY2FuY2VsKTsKIAogc3RydWN0IHRwbV9jaGlwICp0cG1fY2hpcF9maW5kX2dldChpbnQgY2hpcF9udW0pOwogX19tdXN0X2NoZWNrIGludCB0cG1fdHJ5X2dldF9vcHMoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKIHZvaWQgdHBtX3B1dF9vcHMoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKIAotZXh0ZXJuIHN0cnVjdCB0cG1fY2hpcCAqdHBtX2NoaXBfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdHBtX2NsYXNzX29wcyAqb3BzKTsKLWV4dGVybiBzdHJ1Y3QgdHBtX2NoaXAgKnRwbW1fY2hpcF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpwZGV2LAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdHBtX2NsYXNzX29wcyAqb3BzKTsKLWV4dGVybiBpbnQgdHBtX2NoaXBfcmVnaXN0ZXIoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKLWV4dGVybiB2b2lkIHRwbV9jaGlwX3VucmVnaXN0ZXIoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKK3N0cnVjdCB0cG1fY2hpcCAqdHBtX2NoaXBfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LAorCQkJCWNvbnN0IHN0cnVjdCB0cG1fY2xhc3Nfb3BzICpvcHMpOworc3RydWN0IHRwbV9jaGlwICp0cG1tX2NoaXBfYWxsb2Moc3RydWN0IGRldmljZSAqcGRldiwKKwkJCQkgY29uc3Qgc3RydWN0IHRwbV9jbGFzc19vcHMgKm9wcyk7CitpbnQgdHBtX2NoaXBfcmVnaXN0ZXIoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKK3ZvaWQgdHBtX2NoaXBfdW5yZWdpc3RlcihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwogCiB2b2lkIHRwbV9zeXNmc19hZGRfZGV2aWNlKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCk7CiAKQEAgLTUyOCw4ICs1MzEsNyBAQAogCQkJdTMyICp2YWx1ZSwgY29uc3QgY2hhciAqZGVzYyk7CiAKIGludCB0cG0yX2F1dG9fc3RhcnR1cChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwotZXh0ZXJuIHZvaWQgdHBtMl9zaHV0ZG93bihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHUxNiBzaHV0ZG93bl90eXBlKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHRwbTJfY2FsY19vcmRpbmFsX2R1cmF0aW9uKHN0cnVjdCB0cG1fY2hpcCAqLCB1MzIpOwotZXh0ZXJuIGludCB0cG0yX2dlbl9pbnRlcnJ1cHQoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKLWV4dGVybiBpbnQgdHBtMl9wcm9iZShzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApOwordm9pZCB0cG0yX3NodXRkb3duKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTE2IHNodXRkb3duX3R5cGUpOwordW5zaWduZWQgbG9uZyB0cG0yX2NhbGNfb3JkaW5hbF9kdXJhdGlvbihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHUzMiBvcmRpbmFsKTsKK2ludCB0cG0yX3Byb2JlKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtMi1jbWQuYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtMi1jbWQuYwppbmRleCAwOGM3ZTIzLi43ZGY1NWQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG0yLWNtZC5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtMi1jbWQuYwpAQCAtMjgyLDcgKzI4Miw3IEBACiAJICAgICAgIHNpemVvZihjbWQucGFyYW1zLnBjcnJlYWRfaW4ucGNyX3NlbGVjdCkpOwogCWNtZC5wYXJhbXMucGNycmVhZF9pbi5wY3Jfc2VsZWN0W3Bjcl9pZHggPj4gM10gPSAxIDw8IChwY3JfaWR4ICYgMHg3KTsKIAotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksIDAsCiAJCQkgICAgICAiYXR0ZW1wdGluZyB0byByZWFkIGEgcGNyIHZhbHVlIik7CiAJaWYgKHJjID09IDApIHsKIAkJYnVmID0gY21kLnBhcmFtcy5wY3JyZWFkX291dC5kaWdlc3Q7CkBAIC0zMzAsNyArMzMwLDcgQEAKIAljbWQucGFyYW1zLnBjcmV4dGVuZF9pbi5oYXNoX2FsZyA9IGNwdV90b19iZTE2KFRQTTJfQUxHX1NIQTEpOwogCW1lbWNweShjbWQucGFyYW1zLnBjcmV4dGVuZF9pbi5kaWdlc3QsIGhhc2gsIFRQTV9ESUdFU1RfU0laRSk7CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksCisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCAwLAogCQkJICAgICAgImF0dGVtcHRpbmcgZXh0ZW5kIGEgUENSIHZhbHVlIik7CiAKIAlyZXR1cm4gcmM7CkBAIC0zNzYsNyArMzc2LDcgQEAKIAkJY21kLmhlYWRlci5pbiA9IHRwbTJfZ2V0cmFuZG9tX2hlYWRlcjsKIAkJY21kLnBhcmFtcy5nZXRyYW5kb21faW4uc2l6ZSA9IGNwdV90b19iZTE2KG51bV9ieXRlcyk7CiAKLQkJZXJyID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwKKwkJZXJyID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwgMCwKIAkJCQkgICAgICAgImF0dGVtcHRpbmcgZ2V0IHJhbmRvbSIpOwogCQlpZiAoZXJyKQogCQkJYnJlYWs7CkBAIC00MzQsMTIgKzQzNCwxMiBAQAogfQogCiAvKioKLSAqIHRwbTJfc2VhbF90cnVzdGVkKCkgLSBzZWFsIGEgdHJ1c3RlZCBrZXkKLSAqIEBjaGlwX251bTogQSBzcGVjaWZpYyBjaGlwIG51bWJlciBmb3IgdGhlIHJlcXVlc3Qgb3IgVFBNX0FOWV9OVU0KLSAqIEBvcHRpb25zOiBhdXRoZW50aWNhdGlvbiB2YWx1ZXMgYW5kIG90aGVyIG9wdGlvbnMKKyAqIHRwbTJfc2VhbF90cnVzdGVkKCkgLSBzZWFsIHRoZSBwYXlsb2FkIG9mIGEgdHJ1c3RlZCBrZXkKKyAqIEBjaGlwX251bTogVFBNIGNoaXAgdG8gdXNlCiAgKiBAcGF5bG9hZDogdGhlIGtleSBkYXRhIGluIGNsZWFyIGFuZCBlbmNyeXB0ZWQgZm9ybQorICogQG9wdGlvbnM6IGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhbmQgb3RoZXIgb3B0aW9ucwogICoKLSAqIFJldHVybnMgPCAwIG9uIGVycm9yIGFuZCAwIG9uIHN1Y2Nlc3MuCisgKiBSZXR1cm46IDwgMCBvbiBlcnJvciBhbmQgMCBvbiBzdWNjZXNzLgogICovCiBpbnQgdHBtMl9zZWFsX3RydXN0ZWQoc3RydWN0IHRwbV9jaGlwICpjaGlwLAogCQkgICAgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcGF5bG9hZCwKQEAgLTUxMiw3ICs1MTIsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgYnVmLmRhdGEsIFBBR0VfU0laRSwgInNlYWxpbmcgZGF0YSIpOworCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCBidWYuZGF0YSwgUEFHRV9TSVpFLCAwLCAic2VhbGluZyBkYXRhIik7CiAJaWYgKHJjKQogCQlnb3RvIG91dDsKIApAQCAtNTM4LDEwICs1MzgsMTggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgdHBtMl9sb2FkKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwKLQkJICAgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcGF5bG9hZCwKLQkJICAgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqb3B0aW9ucywKLQkJICAgICB1MzIgKmJsb2JfaGFuZGxlKQorLyoqCisgKiB0cG0yX2xvYWRfY21kKCkgLSBleGVjdXRlIGEgVFBNMl9Mb2FkIGNvbW1hbmQKKyAqIEBjaGlwX251bTogVFBNIGNoaXAgdG8gdXNlCisgKiBAcGF5bG9hZDogdGhlIGtleSBkYXRhIGluIGNsZWFyIGFuZCBlbmNyeXB0ZWQgZm9ybQorICogQG9wdGlvbnM6IGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhbmQgb3RoZXIgb3B0aW9ucworICoKKyAqIFJldHVybjogc2FtZSBhcyB3aXRoIHRwbV90cmFuc21pdF9jbWQKKyAqLworc3RhdGljIGludCB0cG0yX2xvYWRfY21kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwKKwkJCSBzdHJ1Y3QgdHJ1c3RlZF9rZXlfcGF5bG9hZCAqcGF5bG9hZCwKKwkJCSBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqb3B0aW9ucywKKwkJCSB1MzIgKmJsb2JfaGFuZGxlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHRwbV9idWYgYnVmOwogCXVuc2lnbmVkIGludCBwcml2YXRlX2xlbjsKQEAgLTU3Niw3ICs1ODQsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgYnVmLmRhdGEsIFBBR0VfU0laRSwgImxvYWRpbmcgYmxvYiIpOworCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCBidWYuZGF0YSwgUEFHRV9TSVpFLCBmbGFncywgImxvYWRpbmcgYmxvYiIpOwogCWlmICghcmMpCiAJCSpibG9iX2hhbmRsZSA9IGJlMzJfdG9fY3B1cCgKIAkJCShfX2JlMzIgKikgJmJ1Zi5kYXRhW1RQTV9IRUFERVJfU0laRV0pOwpAQCAtNTkwLDcgKzU5OCwxNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgdHBtMl9mbHVzaF9jb250ZXh0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTMyIGhhbmRsZSkKKy8qKgorICogdHBtMl9mbHVzaF9jb250ZXh0X2NtZCgpIC0gZXhlY3V0ZSBhIFRQTTJfRmx1c2hDb250ZXh0IGNvbW1hbmQKKyAqIEBjaGlwX251bTogVFBNIGNoaXAgdG8gdXNlCisgKiBAcGF5bG9hZDogdGhlIGtleSBkYXRhIGluIGNsZWFyIGFuZCBlbmNyeXB0ZWQgZm9ybQorICogQG9wdGlvbnM6IGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhbmQgb3RoZXIgb3B0aW9ucworICoKKyAqIFJldHVybjogc2FtZSBhcyB3aXRoIHRwbV90cmFuc21pdF9jbWQKKyAqLworc3RhdGljIHZvaWQgdHBtMl9mbHVzaF9jb250ZXh0X2NtZChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHUzMiBoYW5kbGUsCisJCQkJICAgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCB0cG1fYnVmIGJ1ZjsKIAlpbnQgcmM7CkBAIC02MDQsNyArNjIxLDggQEAKIAogCXRwbV9idWZfYXBwZW5kX3UzMigmYnVmLCBoYW5kbGUpOwogCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGJ1Zi5kYXRhLCBQQUdFX1NJWkUsICJmbHVzaGluZyBjb250ZXh0Iik7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGJ1Zi5kYXRhLCBQQUdFX1NJWkUsIGZsYWdzLAorCQkJICAgICAgImZsdXNoaW5nIGNvbnRleHQiKTsKIAlpZiAocmMpCiAJCWRldl93YXJuKCZjaGlwLT5kZXYsICIweCUwOHggd2FzIG5vdCBmbHVzaGVkLCByYz0lZFxuIiwgaGFuZGxlLAogCQkJIHJjKTsKQEAgLTYxMiwxMCArNjMwLDE4IEBACiAJdHBtX2J1Zl9kZXN0cm95KCZidWYpOwogfQogCi1zdGF0aWMgaW50IHRwbTJfdW5zZWFsKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwKLQkJICAgICAgIHN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwYXlsb2FkLAotCQkgICAgICAgc3RydWN0IHRydXN0ZWRfa2V5X29wdGlvbnMgKm9wdGlvbnMsCi0JCSAgICAgICB1MzIgYmxvYl9oYW5kbGUpCisvKioKKyAqIHRwbTJfdW5zZWFsX2NtZCgpIC0gZXhlY3V0ZSBhIFRQTTJfVW5sb2FkIGNvbW1hbmQKKyAqIEBjaGlwX251bTogVFBNIGNoaXAgdG8gdXNlCisgKiBAcGF5bG9hZDogdGhlIGtleSBkYXRhIGluIGNsZWFyIGFuZCBlbmNyeXB0ZWQgZm9ybQorICogQG9wdGlvbnM6IGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhbmQgb3RoZXIgb3B0aW9ucworICoKKyAqIFJldHVybjogc2FtZSBhcyB3aXRoIHRwbV90cmFuc21pdF9jbWQKKyAqLworc3RhdGljIGludCB0cG0yX3Vuc2VhbF9jbWQoc3RydWN0IHRwbV9jaGlwICpjaGlwLAorCQkJICAgc3RydWN0IHRydXN0ZWRfa2V5X3BheWxvYWQgKnBheWxvYWQsCisJCQkgICBzdHJ1Y3QgdHJ1c3RlZF9rZXlfb3B0aW9ucyAqb3B0aW9ucywKKwkJCSAgIHUzMiBibG9iX2hhbmRsZSwgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCB0cG1fYnVmIGJ1ZjsKIAl1MTYgZGF0YV9sZW47CkBAIC02MzUsNyArNjYxLDcgQEAKIAkJCSAgICAgb3B0aW9ucy0+YmxvYmF1dGggLyogaG1hYyAqLywKIAkJCSAgICAgVFBNX0RJR0VTVF9TSVpFKTsKIAotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCBidWYuZGF0YSwgUEFHRV9TSVpFLCAidW5zZWFsaW5nIik7CisJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsIGJ1Zi5kYXRhLCBQQUdFX1NJWkUsIGZsYWdzLCAidW5zZWFsaW5nIik7CiAJaWYgKHJjID4gMCkKIAkJcmMgPSAtRVBFUk07CiAKQEAgLTY1NCwxMiArNjgwLDEyIEBACiB9CiAKIC8qKgotICogdHBtX3Vuc2VhbF90cnVzdGVkKCkgLSB1bnNlYWwgYSB0cnVzdGVkIGtleQotICogQGNoaXBfbnVtOiBBIHNwZWNpZmljIGNoaXAgbnVtYmVyIGZvciB0aGUgcmVxdWVzdCBvciBUUE1fQU5ZX05VTQotICogQG9wdGlvbnM6IGF1dGhlbnRpY2F0aW9uIHZhbHVlcyBhbmQgb3RoZXIgb3B0aW9ucworICogdHBtX3Vuc2VhbF90cnVzdGVkKCkgLSB1bnNlYWwgdGhlIHBheWxvYWQgb2YgYSB0cnVzdGVkIGtleQorICogQGNoaXBfbnVtOiBUUE0gY2hpcCB0byB1c2UKICAqIEBwYXlsb2FkOiB0aGUga2V5IGRhdGEgaW4gY2xlYXIgYW5kIGVuY3J5cHRlZCBmb3JtCisgKiBAb3B0aW9uczogYXV0aGVudGljYXRpb24gdmFsdWVzIGFuZCBvdGhlciBvcHRpb25zCiAgKgotICogUmV0dXJucyA8IDAgb24gZXJyb3IgYW5kIDAgb24gc3VjY2Vzcy4KKyAqIFJldHVybjogPCAwIG9uIGVycm9yIGFuZCAwIG9uIHN1Y2Nlc3MuCiAgKi8KIGludCB0cG0yX3Vuc2VhbF90cnVzdGVkKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwKIAkJCXN0cnVjdCB0cnVzdGVkX2tleV9wYXlsb2FkICpwYXlsb2FkLApAQCAtNjY4LDE0ICs2OTQsMTcgQEAKIAl1MzIgYmxvYl9oYW5kbGU7CiAJaW50IHJjOwogCi0JcmMgPSB0cG0yX2xvYWQoY2hpcCwgcGF5bG9hZCwgb3B0aW9ucywgJmJsb2JfaGFuZGxlKTsKKwltdXRleF9sb2NrKCZjaGlwLT50cG1fbXV0ZXgpOworCXJjID0gdHBtMl9sb2FkX2NtZChjaGlwLCBwYXlsb2FkLCBvcHRpb25zLCAmYmxvYl9oYW5kbGUsCisJCQkgICBUUE1fVFJBTlNNSVRfVU5MT0NLRUQpOwogCWlmIChyYykKLQkJcmV0dXJuIHJjOworCQlnb3RvIG91dDsKIAotCXJjID0gdHBtMl91bnNlYWwoY2hpcCwgcGF5bG9hZCwgb3B0aW9ucywgYmxvYl9oYW5kbGUpOwotCi0JdHBtMl9mbHVzaF9jb250ZXh0KGNoaXAsIGJsb2JfaGFuZGxlKTsKLQorCXJjID0gdHBtMl91bnNlYWxfY21kKGNoaXAsIHBheWxvYWQsIG9wdGlvbnMsIGJsb2JfaGFuZGxlLAorCQkJICAgICBUUE1fVFJBTlNNSVRfVU5MT0NLRUQpOworCXRwbTJfZmx1c2hfY29udGV4dF9jbWQoY2hpcCwgYmxvYl9oYW5kbGUsIFRQTV9UUkFOU01JVF9VTkxPQ0tFRCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT50cG1fbXV0ZXgpOwogCXJldHVybiByYzsKIH0KIApAQCAtNzAxLDEyICs3MzAsMTMgQEAKIAljbWQucGFyYW1zLmdldF90cG1fcHRfaW4ucHJvcGVydHlfaWQgPSBjcHVfdG9fYmUzMihwcm9wZXJ0eV9pZCk7CiAJY21kLnBhcmFtcy5nZXRfdHBtX3B0X2luLnByb3BlcnR5X2NudCA9IGNwdV90b19iZTMyKDEpOwogCi0JcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCBkZXNjKTsKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksIDAsIGRlc2MpOwogCWlmICghcmMpCiAJCSp2YWx1ZSA9IGJlMzJfdG9fY3B1KGNtZC5wYXJhbXMuZ2V0X3RwbV9wdF9vdXQudmFsdWUpOwogCiAJcmV0dXJuIHJjOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodHBtMl9nZXRfdHBtX3B0KTsKIAogI2RlZmluZSBUUE0yX1NUQVJUVVBfSU5fU0laRSBcCiAJKHNpemVvZihzdHJ1Y3QgdHBtX2lucHV0X2hlYWRlcikgKyBcCkBAIC03MzUsNyArNzY1LDcgQEAKIAljbWQuaGVhZGVyLmluID0gdHBtMl9zdGFydHVwX2hlYWRlcjsKIAogCWNtZC5wYXJhbXMuc3RhcnR1cF9pbi5zdGFydHVwX3R5cGUgPSBjcHVfdG9fYmUxNihzdGFydHVwX3R5cGUpOwotCXJldHVybiB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLAorCXJldHVybiB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCAwLAogCQkJCSJhdHRlbXB0aW5nIHRvIHN0YXJ0IHRoZSBUUE0iKTsKIH0KIApAQCAtNzYzLDcgKzc5Myw3IEBACiAJY21kLmhlYWRlci5pbiA9IHRwbTJfc2h1dGRvd25faGVhZGVyOwogCWNtZC5wYXJhbXMuc3RhcnR1cF9pbi5zdGFydHVwX3R5cGUgPSBjcHVfdG9fYmUxNihzaHV0ZG93bl90eXBlKTsKIAotCXJjID0gdHBtX3RyYW5zbWl0X2NtZChjaGlwLCAmY21kLCBzaXplb2YoY21kKSwgInN0b3BwaW5nIHRoZSBUUE0iKTsKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksIDAsICJzdG9wcGluZyB0aGUgVFBNIik7CiAKIAkvKiBJbiBwbGFjZXMgd2hlcmUgc2h1dGRvd24gY29tbWFuZCBpcyBzZW50IHRoZXJlJ3Mgbm8gbXVjaCB3ZSBjYW4gZG8KIAkgKiBleGNlcHQgcHJpbnQgdGhlIGVycm9yIGNvZGUgb24gYSBzeXN0ZW0gZmFpbHVyZS4KQEAgLTgyOCw3ICs4NTgsNyBAQAogCWNtZC5oZWFkZXIuaW4gPSB0cG0yX3NlbGZ0ZXN0X2hlYWRlcjsKIAljbWQucGFyYW1zLnNlbGZ0ZXN0X2luLmZ1bGxfdGVzdCA9IGZ1bGw7CiAKLQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgVFBNMl9TRUxGX1RFU1RfSU5fU0laRSwKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgVFBNMl9TRUxGX1RFU1RfSU5fU0laRSwgMCwKIAkJCSAgICAgICJjb250aW51ZSBzZWxmdGVzdCIpOwogCiAJLyogQXQgbGVhc3Qgc29tZSBwcm90b3R5cGUgY2hpcHMgc2VlbSB0byBnaXZlIFJDX1RFU1RJTkcgZXJyb3IKQEAgLTg4MCw3ICs5MTAsNyBAQAogCQljbWQucGFyYW1zLnBjcnJlYWRfaW4ucGNyX3NlbGVjdFsxXSA9IDB4MDA7CiAJCWNtZC5wYXJhbXMucGNycmVhZF9pbi5wY3Jfc2VsZWN0WzJdID0gMHgwMDsKIAotCQlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgKHU4ICopICZjbWQsIHNpemVvZihjbWQpLCBOVUxMKTsKKwkJcmMgPSB0cG1fdHJhbnNtaXRfY21kKGNoaXAsICZjbWQsIHNpemVvZihjbWQpLCAwLCBOVUxMKTsKIAkJaWYgKHJjIDwgMCkKIAkJCWJyZWFrOwogCkBAIC04OTUsMjMgKzkyNSw2IEBACiB9CiAKIC8qKgotICogdHBtMl9nZW5faW50ZXJydXB0KCkgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQKLSAqIEBjaGlwOiBUUE0gY2hpcCB0byB1c2UKLSAqCi0gKiAwIGlzIHJldHVybmVkIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLiBJZiBhIG5lZ2F0aXZlIG51bWJlciBpcwotICogcmV0dXJuZWQgaXQgcmVtYXJrcyBhIFBPU0lYIGVycm9yIGNvZGUuIElmIGEgcG9zaXRpdmUgbnVtYmVyIGlzIHJldHVybmVkCi0gKiBpdCByZW1hcmtzIGEgVFBNIGVycm9yLgotICovCi1pbnQgdHBtMl9nZW5faW50ZXJydXB0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKLXsKLQl1MzIgZHVtbXk7Ci0KLQlyZXR1cm4gdHBtMl9nZXRfdHBtX3B0KGNoaXAsIDB4MTAwLCAmZHVtbXksCi0JCQkgICAgICAgImF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgYW4gaW50ZXJydXB0Iik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh0cG0yX2dlbl9pbnRlcnJ1cHQpOwotCi0vKioKICAqIHRwbTJfcHJvYmUoKSAtIHByb2JlIFRQTSAyLjAKICAqIEBjaGlwOiBUUE0gY2hpcCB0byB1c2UKICAqCkBAIC05MjgsMTEgKzk0MSw5IEBACiAJY21kLnBhcmFtcy5nZXRfdHBtX3B0X2luLnByb3BlcnR5X2lkID0gY3B1X3RvX2JlMzIoMHgxMDApOwogCWNtZC5wYXJhbXMuZ2V0X3RwbV9wdF9pbi5wcm9wZXJ0eV9jbnQgPSBjcHVfdG9fYmUzMigxKTsKIAotCXJjID0gdHBtX3RyYW5zbWl0KGNoaXAsIChjb25zdCBjaGFyICopICZjbWQsIHNpemVvZihjbWQpKTsKKwlyYyA9IHRwbV90cmFuc21pdF9jbWQoY2hpcCwgJmNtZCwgc2l6ZW9mKGNtZCksICAwLCBOVUxMKTsKIAlpZiAocmMgPCAgMCkKIAkJcmV0dXJuIHJjOwotCWVsc2UgaWYgKHJjIDwgVFBNX0hFQURFUl9TSVpFKQotCQlyZXR1cm4gLUVGQVVMVDsKIAogCWlmIChiZTE2X3RvX2NwdShjbWQuaGVhZGVyLm91dC50YWcpID09IFRQTTJfU1RfTk9fU0VTU0lPTlMpCiAJCWNoaXAtPmZsYWdzIHw9IFRQTV9DSElQX0ZMQUdfVFBNMjsKQEAgLTk1Nyw3ICs5NjgsNyBAQAogCQlnb3RvIG91dDsKIAogCXJjID0gdHBtMl9kb19zZWxmdGVzdChjaGlwKTsKLQlpZiAocmMgIT0gVFBNMl9SQ19JTklUSUFMSVpFKSB7CisJaWYgKHJjICE9IDAgJiYgcmMgIT0gVFBNMl9SQ19JTklUSUFMSVpFKSB7CiAJCWRldl9lcnIoJmNoaXAtPmRldiwgIlRQTSBzZWxmIHRlc3QgZmFpbGVkXG4iKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtOTc0LDcgKzk4NSw2IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gcmM7CiBvdXQ6CiAJaWYgKHJjID4gMCkKIAkJcmMgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG1fY3JiLmMgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9jcmIuYwppbmRleCAwMThjMzgyNS4uYTdjODcwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG1fY3JiLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fY3JiLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgInRwbS5oIgogCiAjZGVmaW5lIEFDUElfU0lHX1RQTTIgIlRQTTIiCkBAIC0zNCwxNCArMzMsMTQgQEAKIAlDUkJfQUNQSV9TVEFSVF9JTkRFWCA9IDEsCiB9OwogCi1lbnVtIGNyYl9jYV9yZXF1ZXN0IHsKLQlDUkJfQ0FfUkVRX0dPX0lETEUJPSBCSVQoMCksCi0JQ1JCX0NBX1JFUV9DTURfUkVBRFkJPSBCSVQoMSksCitlbnVtIGNyYl9jdHJsX3JlcSB7CisJQ1JCX0NUUkxfUkVRX0NNRF9SRUFEWQk9IEJJVCgwKSwKKwlDUkJfQ1RSTF9SRVFfR09fSURMRQk9IEJJVCgxKSwKIH07CiAKLWVudW0gY3JiX2NhX3N0YXR1cyB7Ci0JQ1JCX0NBX1NUU19FUlJPUgk9IEJJVCgwKSwKLQlDUkJfQ0FfU1RTX1RQTV9JRExFCT0gQklUKDEpLAorZW51bSBjcmJfY3RybF9zdHMgeworCUNSQl9DVFJMX1NUU19FUlJPUgk9IEJJVCgwKSwKKwlDUkJfQ1RSTF9TVFNfVFBNX0lETEUJPSBCSVQoMSksCiB9OwogCiBlbnVtIGNyYl9zdGFydCB7CkBAIC02Nyw3ICs2Niw3IEBACiB9IF9fcGFja2VkOwogCiBlbnVtIGNyYl9zdGF0dXMgewotCUNSQl9TVFNfQ09NUExFVEUJPSBCSVQoMCksCisJQ1JCX0RSVl9TVFNfQ09NUExFVEUJPSBCSVQoMCksCiB9OwogCiBlbnVtIGNyYl9mbGFncyB7CkBAIC04MSw2ICs4MCw3IEBACiAJc3RydWN0IGNyYl9jb250cm9sX2FyZWEgX19pb21lbSAqY2NhOwogCXU4IF9faW9tZW0gKmNtZDsKIAl1OCBfX2lvbWVtICpyc3A7CisJdTMyIGNtZF9zaXplOwogfTsKIAogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGNyYl9wbSwgdHBtX3BtX3N1c3BlbmQsIHRwbV9wbV9yZXN1bWUpOwpAQCAtOTIsNyArOTIsNyBAQAogCiAJaWYgKChpb3JlYWQzMigmcHJpdi0+Y2NhLT5zdGFydCkgJiBDUkJfU1RBUlRfSU5WT0tFKSAhPQogCSAgICBDUkJfU1RBUlRfSU5WT0tFKQotCQlzdHMgfD0gQ1JCX1NUU19DT01QTEVURTsKKwkJc3RzIHw9IENSQl9EUlZfU1RTX0NPTVBMRVRFOwogCiAJcmV0dXJuIHN0czsKIH0KQEAgLTEwNiw3ICsxMDYsNyBAQAogCWlmIChjb3VudCA8IDYpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKGlvcmVhZDMyKCZwcml2LT5jY2EtPnN0cykgJiBDUkJfQ0FfU1RTX0VSUk9SKQorCWlmIChpb3JlYWQzMigmcHJpdi0+Y2NhLT5zdHMpICYgQ1JCX0NUUkxfU1RTX0VSUk9SKQogCQlyZXR1cm4gLUVJTzsKIAogCW1lbWNweV9mcm9taW8oYnVmLCBwcml2LT5yc3AsIDYpOwpAQCAtMTQyLDExICsxNDIsMTQgQEAKIAlzdHJ1Y3QgY3JiX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmNoaXAtPmRldik7CiAJaW50IHJjID0gMDsKIAotCWlmIChsZW4gPiBpb3JlYWQzMigmcHJpdi0+Y2NhLT5jbWRfc2l6ZSkpIHsKLQkJZGV2X2VycigmY2hpcC0+ZGV2LAotCQkJImludmFsaWQgY29tbWFuZCBjb3VudCB2YWx1ZSAleCAlenhcbiIsCi0JCQkodW5zaWduZWQgaW50KSBsZW4sCi0JCQkoc2l6ZV90KSBpb3JlYWQzMigmcHJpdi0+Y2NhLT5jbWRfc2l6ZSkpOworCS8qIFplcm8gdGhlIGNhbmNlbCByZWdpc3RlciBzbyB0aGF0IHRoZSBuZXh0IGNvbW1hbmQgd2lsbCBub3QgZ2V0CisJICogY2FuY2VsZWQuCisJICovCisJaW93cml0ZTMyKDAsICZwcml2LT5jY2EtPmNhbmNlbCk7CisKKwlpZiAobGVuID4gcHJpdi0+Y21kX3NpemUpIHsKKwkJZGV2X2VycigmY2hpcC0+ZGV2LCAiaW52YWxpZCBjb21tYW5kIGNvdW50IHZhbHVlICV6ZCAlZFxuIiwKKwkJCWxlbiwgcHJpdi0+Y21kX3NpemUpOwogCQlyZXR1cm4gLUUyQklHOwogCX0KIApAQCAtMTU2LDcgKzE1OSw3IEBACiAJd21iKCk7CiAKIAlpZiAocHJpdi0+ZmxhZ3MgJiBDUkJfRkxfQ1JCX1NUQVJUKQotCQlpb3dyaXRlMzIoY3B1X3RvX2xlMzIoQ1JCX1NUQVJUX0lOVk9LRSksICZwcml2LT5jY2EtPnN0YXJ0KTsKKwkJaW93cml0ZTMyKENSQl9TVEFSVF9JTlZPS0UsICZwcml2LT5jY2EtPnN0YXJ0KTsKIAogCWlmIChwcml2LT5mbGFncyAmIENSQl9GTF9BQ1BJX1NUQVJUKQogCQlyYyA9IGNyYl9kb19hY3BpX3N0YXJ0KGNoaXApOwpAQCAtMTY4LDE1ICsxNzEsMTAgQEAKIHsKIAlzdHJ1Y3QgY3JiX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJmNoaXAtPmRldik7CiAKLQlpb3dyaXRlMzIoY3B1X3RvX2xlMzIoQ1JCX0NBTkNFTF9JTlZPS0UpLCAmcHJpdi0+Y2NhLT5jYW5jZWwpOwotCi0JLyogTWFrZSBzdXJlIHRoYXQgY21kIGlzIHBvcHVsYXRlZCBiZWZvcmUgaXNzdWluZyBjYW5jZWwuICovCi0Jd21iKCk7CisJaW93cml0ZTMyKENSQl9DQU5DRUxfSU5WT0tFLCAmcHJpdi0+Y2NhLT5jYW5jZWwpOwogCiAJaWYgKChwcml2LT5mbGFncyAmIENSQl9GTF9BQ1BJX1NUQVJUKSAmJiBjcmJfZG9fYWNwaV9zdGFydChjaGlwKSkKIAkJZGV2X2VycigmY2hpcC0+ZGV2LCAiQUNQSSBTdGFydCBmYWlsZWRcbiIpOwotCi0JaW93cml0ZTMyKDAsICZwcml2LT5jY2EtPmNhbmNlbCk7CiB9CiAKIHN0YXRpYyBib29sIGNyYl9yZXFfY2FuY2VsZWQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCB1OCBzdGF0dXMpCkBAIC0xOTQsOCArMTkyLDggQEAKIAkuc2VuZCA9IGNyYl9zZW5kLAogCS5jYW5jZWwgPSBjcmJfY2FuY2VsLAogCS5yZXFfY2FuY2VsZWQgPSBjcmJfcmVxX2NhbmNlbGVkLAotCS5yZXFfY29tcGxldGVfbWFzayA9IENSQl9TVFNfQ09NUExFVEUsCi0JLnJlcV9jb21wbGV0ZV92YWwgPSBDUkJfU1RTX0NPTVBMRVRFLAorCS5yZXFfY29tcGxldGVfbWFzayA9IENSQl9EUlZfU1RTX0NPTVBMRVRFLAorCS5yZXFfY29tcGxldGVfdmFsID0gQ1JCX0RSVl9TVFNfQ09NUExFVEUsCiB9OwogCiBzdGF0aWMgaW50IGNyYl9pbml0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBzdHJ1Y3QgY3JiX3ByaXYgKnByaXYpCkBAIC0yNjUsOCArMjYzLDcgQEAKIAlhY3BpX2Rldl9mcmVlX3Jlc291cmNlX2xpc3QoJnJlc291cmNlcyk7CiAKIAlpZiAocmVzb3VyY2VfdHlwZSgmaW9fcmVzKSAhPSBJT1JFU09VUkNFX01FTSkgewotCQlkZXZfZXJyKGRldiwKLQkJCUZXX0JVRyAiVFBNMiBBQ1BJIHRhYmxlIGRvZXMgbm90IGRlZmluZSBhIG1lbW9yeSByZXNvdXJjZVxuIik7CisJCWRldl9lcnIoZGV2LCBGV19CVUcgIlRQTTIgQUNQSSB0YWJsZSBkb2VzIG5vdCBkZWZpbmUgYSBtZW1vcnkgcmVzb3VyY2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMwMiw2ICsyOTksNyBAQAogCQlkZXZfZXJyKGRldiwgRldfQlVHICJvdmVybGFwcGluZyBjb21tYW5kIGFuZCByZXNwb25zZSBidWZmZXIgc2l6ZXMgYXJlIG5vdCBpZGVudGljYWwiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCXByaXYtPmNtZF9zaXplID0gY21kX3NpemU7CiAKIAlwcml2LT5yc3AgPSBwcml2LT5jbWQ7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV90aXNfY29yZS5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fdGlzX2NvcmUuYwppbmRleCBkNjZmNTFiLi5lM2JmMzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL3RwbV90aXNfY29yZS5jCisrKyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX3Rpc19jb3JlLmMKQEAgLTQ0MCw3ICs0NDAsNiBAQAogCQkweDAwLCAweDAwLCAweDAwLCAweGYxCiAJfTsKIAlzaXplX3QgbGVuID0gc2l6ZW9mKGNtZF9nZXR0aWNrcyk7Ci0JYm9vbCBpdHBtOwogCXUxNiB2ZW5kb3I7CiAKIAlyYyA9IHRwbV90aXNfcmVhZDE2KHByaXYsIFRQTV9ESURfVklEKDApLCAmdmVuZG9yKTsKQEAgLTQ1MSw4ICs0NTAsNiBAQAogCWlmICh2ZW5kb3IgIT0gVFBNX1ZJRF9JTlRFTCkKIAkJcmV0dXJuIDA7CiAKLQlpdHBtID0gZmFsc2U7Ci0KIAlyYyA9IHRwbV90aXNfc2VuZF9kYXRhKGNoaXAsIGNtZF9nZXR0aWNrcywgbGVuKTsKIAlpZiAocmMgPT0gMCkKIAkJZ290byBvdXQ7CkBAIC00NjAsOCArNDU3LDYgQEAKIAl0cG1fdGlzX3JlYWR5KGNoaXApOwogCXJlbGVhc2VfbG9jYWxpdHkoY2hpcCwgcHJpdi0+bG9jYWxpdHksIDApOwogCi0JaXRwbSA9IHRydWU7Ci0KIAlyYyA9IHRwbV90aXNfc2VuZF9kYXRhKGNoaXAsIGNtZF9nZXR0aWNrcywgbGVuKTsKIAlpZiAocmMgPT0gMCkgewogCQlkZXZfaW5mbygmY2hpcC0+ZGV2LCAiRGV0ZWN0ZWQgYW4gaVRQTS5cbiIpOwpAQCAtNTI2LDYgKzUyMSwxOCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGludCB0cG1fdGlzX2dlbl9pbnRlcnJ1cHQoc3RydWN0IHRwbV9jaGlwICpjaGlwKQoreworCWNvbnN0IGNoYXIgKmRlc2MgPSAiYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQiOworCXUzMiBjYXAyOworCWNhcF90IGNhcDsKKworCWlmIChjaGlwLT5mbGFncyAmIFRQTV9DSElQX0ZMQUdfVFBNMikKKwkJcmV0dXJuIHRwbTJfZ2V0X3RwbV9wdChjaGlwLCAweDEwMCwgJmNhcDIsIGRlc2MpOworCWVsc2UKKwkJcmV0dXJuIHRwbV9nZXRjYXAoY2hpcCwgVFBNX0NBUF9QUk9QX1RJU19USU1FT1VULCAmY2FwLCBkZXNjKTsKK30KKwogLyogUmVnaXN0ZXIgdGhlIElSUSBhbmQgaXNzdWUgYSBjb21tYW5kIHRoYXQgd2lsbCBjYXVzZSBhbiBpbnRlcnJ1cHQuIElmIGFuCiAgKiBpcnEgaXMgc2VlbiB0aGVuIGxlYXZlIHRoZSBjaGlwIHNldHVwIGZvciBJUlEgb3BlcmF0aW9uLCBvdGhlcndpc2UgcmV2ZXJzZQogICogZXZlcnl0aGluZyBhbmQgbGVhdmUgaW4gcG9sbGluZyBtb2RlLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4KQEAgLTU3NSwxMCArNTgyLDkgQEAKIAkvKiBHZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgYnkgaGF2aW5nIHRoZSBjb3JlIGNhbGwgdGhyb3VnaCB0bwogCSAqIHRwbV90aXNfc2VuZAogCSAqLwotCWlmIChjaGlwLT5mbGFncyAmIFRQTV9DSElQX0ZMQUdfVFBNMikKLQkJdHBtMl9nZW5faW50ZXJydXB0KGNoaXApOwotCWVsc2UKLQkJdHBtX2dlbl9pbnRlcnJ1cHQoY2hpcCk7CisJcmMgPSB0cG1fdGlzX2dlbl9pbnRlcnJ1cHQoY2hpcCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOwogCiAJLyogdHBtX3Rpc19zZW5kIHdpbGwgZWl0aGVyIGNvbmZpcm0gdGhlIGludGVycnVwdCBpcyB3b3JraW5nIG9yIGl0CiAJICogd2lsbCBjYWxsIGRpc2FibGVfaXJxIHdoaWNoIHVuZG9lcyBhbGwgb2YgdGhlIGFib3ZlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eXByaW50ay5jIGIvZHJpdmVycy9jaGFyL3R0eXByaW50ay5jCmluZGV4IGIwOThkMmQuLjY3NTQ5Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlwcmludGsuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5cHJpbnRrLmMKQEAgLTMxLDYwICszMSw1MyBAQAogICogcHJpbnRrIG1lc3NhZ2VzIChhbHNvIHN1aXRhYmxlIGZvciBsb2dnaW5nIHNlcnZpY2UpOgogICogLSBhbnkgY3IgaXMgcmVwbGFjZWQgYnkgbmwKICAqIC0gYWRkcyBhIHR0eXByaW50ayBzb3VyY2UgdGFnIGluIGZyb250IG9mIGVhY2ggbGluZQotICogLSB0b28gbG9uZyBtZXNzYWdlIGlzIGZyYWdtZXRlZCwgd2l0aCAnXCdubCBiZXR3ZWVuIGZyYWdtZW50cwotICogLSBUUEtfU1RSX1NJWkUgaXNuJ3QgcmVhbGx5IHRoZSB3cml0ZV9yb29tIGxpbWl0aW5nIGZhY3RvciwgYmNhdXNlCisgKiAtIHRvbyBsb25nIG1lc3NhZ2UgaXMgZnJhZ21lbnRlZCwgd2l0aCAnXCdubCBiZXR3ZWVuIGZyYWdtZW50cworICogLSBUUEtfU1RSX1NJWkUgaXNuJ3QgcmVhbGx5IHRoZSB3cml0ZV9yb29tIGxpbWl0aW5nIGZhY3RvciwgYmVjYXVzZQogICogICBpdCBpcyBlbXB0aWVkIG9uIHRoZSBmbHkgZHVyaW5nIHByZWZvcm1hdHRpbmcuCiAgKi8KICNkZWZpbmUgVFBLX1NUUl9TSVpFIDUwOCAvKiBzaG91bGQgYmUgYmlnZ2VyIHRoZW4gbWF4IGV4cGVjdGVkIGxpbmUgbGVuZ3RoICovCiAjZGVmaW5lIFRQS19NQVhfUk9PTSA0MDk2IC8qIHdlIGNvdWxkIGFzc3VtZSA0SyBmb3IgaW5zdGFuY2UgKi8KLXN0YXRpYyBjb25zdCBjaGFyICp0cGtfdGFnID0gIltVXSAiOyAvKiBVIGZvciBVc2VyICovCiBzdGF0aWMgaW50IHRwa19jdXJyOwogCitzdGF0aWMgY2hhciB0cGtfYnVmZmVyW1RQS19TVFJfU0laRSArIDRdOworCitzdGF0aWMgdm9pZCB0cGtfZmx1c2godm9pZCkKK3sKKwlpZiAodHBrX2N1cnIgPiAwKSB7CisJCXRwa19idWZmZXJbdHBrX2N1cnJdID0gJ1wwJzsKKwkJcHJfaW5mbygiW1VdICVzXG4iLCB0cGtfYnVmZmVyKTsKKwkJdHBrX2N1cnIgPSAwOworCX0KK30KKwogc3RhdGljIGludCB0cGtfcHJpbnRrKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQogewotCXN0YXRpYyBjaGFyIHRtcFtUUEtfU1RSX1NJWkUgKyA0XTsKIAlpbnQgaSA9IHRwa19jdXJyOwogCiAJaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCS8qIGZsdXNoIHRtcFtdICovCi0JCWlmICh0cGtfY3VyciA+IDApIHsKLQkJCS8qIG5vbiBubCBvciBjciB0ZXJtaW5hdGVkIG1lc3NhZ2UgLSBhZGQgbmwgKi8KLQkJCXRtcFt0cGtfY3VyciArIDBdID0gJ1xuJzsKLQkJCXRtcFt0cGtfY3VyciArIDFdID0gJ1wwJzsKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzJXMiLCB0cGtfdGFnLCB0bXApOwotCQkJdHBrX2N1cnIgPSAwOwotCQl9CisJCXRwa19mbHVzaCgpOwogCQlyZXR1cm4gaTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQl0bXBbdHBrX2N1cnJdID0gYnVmW2ldOwotCQlpZiAodHBrX2N1cnIgPCBUUEtfU1RSX1NJWkUpIHsKLQkJCXN3aXRjaCAoYnVmW2ldKSB7Ci0JCQljYXNlICdccic6Ci0JCQkJLyogcmVwbGFjZSBjciB3aXRoIG5sICovCi0JCQkJdG1wW3Rwa19jdXJyICsgMF0gPSAnXG4nOwotCQkJCXRtcFt0cGtfY3VyciArIDFdID0gJ1wwJzsKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlcyVzIiwgdHBrX3RhZywgdG1wKTsKLQkJCQl0cGtfY3VyciA9IDA7Ci0JCQkJaWYgKChpICsgMSkgPCBjb3VudCAmJiBidWZbaSArIDFdID09ICdcbicpCi0JCQkJCWkrKzsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ1xuJzoKLQkJCQl0bXBbdHBrX2N1cnIgKyAxXSA9ICdcMCc7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMlcyIsIHRwa190YWcsIHRtcCk7Ci0JCQkJdHBrX2N1cnIgPSAwOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQl0cGtfY3VycisrOwotCQkJfQotCQl9IGVsc2UgeworCQlpZiAodHBrX2N1cnIgPj0gVFBLX1NUUl9TSVpFKSB7CiAJCQkvKiBlbmQgb2YgdG1wIGJ1ZmZlciByZWFjaGVkOiBjdXQgdGhlIG1lc3NhZ2UgaW4gdHdvICovCi0JCQl0bXBbdHBrX2N1cnIgKyAxXSA9ICdcXCc7Ci0JCQl0bXBbdHBrX2N1cnIgKyAyXSA9ICdcbic7Ci0JCQl0bXBbdHBrX2N1cnIgKyAzXSA9ICdcMCc7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlcyVzIiwgdHBrX3RhZywgdG1wKTsKLQkJCXRwa19jdXJyID0gMDsKKwkJCXRwa19idWZmZXJbdHBrX2N1cnIrK10gPSAnXFwnOworCQkJdHBrX2ZsdXNoKCk7CisJCX0KKworCQlzd2l0Y2ggKGJ1ZltpXSkgeworCQljYXNlICdccic6CisJCQl0cGtfZmx1c2goKTsKKwkJCWlmICgoaSArIDEpIDwgY291bnQgJiYgYnVmW2kgKyAxXSA9PSAnXG4nKQorCQkJCWkrKzsKKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCQl0cGtfZmx1c2goKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdHBrX2J1ZmZlclt0cGtfY3VycisrXSA9IGJ1ZltpXTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYyBiL2RyaXZlcnMvY2hhci92aXJ0aW9fY29uc29sZS5jCmluZGV4IGQyNDA2ZmUuLjgxMTQ3NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci92aXJ0aW9fY29uc29sZS5jCisrKyBiL2RyaXZlcnMvY2hhci92aXJ0aW9fY29uc29sZS5jCkBAIC0xNjUsNiArMTY1LDEyIEBACiAJICovCiAJc3RydWN0IHZpcnRxdWV1ZSAqY19pdnEsICpjX292cTsKIAorCS8qCisJICogQSBjb250cm9sIHBhY2tldCBidWZmZXIgZm9yIGd1ZXN0LT5ob3N0IHJlcXVlc3RzLCBwcm90ZWN0ZWQKKwkgKiBieSBjX292cV9sb2NrLgorCSAqLworCXN0cnVjdCB2aXJ0aW9fY29uc29sZV9jb250cm9sIGNwa3Q7CisKIAkvKiBBcnJheSBvZiBwZXItcG9ydCBJTyB2aXJ0cXVldWVzICovCiAJc3RydWN0IHZpcnRxdWV1ZSAqKmluX3ZxcywgKipvdXRfdnFzOwogCkBAIC01NjAsMjggKzU2NiwyOSBAQAogCQkJCSAgdW5zaWduZWQgaW50IGV2ZW50LCB1bnNpZ25lZCBpbnQgdmFsdWUpCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnWzFdOwotCXN0cnVjdCB2aXJ0aW9fY29uc29sZV9jb250cm9sIGNwa3Q7CiAJc3RydWN0IHZpcnRxdWV1ZSAqdnE7CiAJdW5zaWduZWQgaW50IGxlbjsKIAogCWlmICghdXNlX211bHRpcG9ydChwb3J0ZGV2KSkKIAkJcmV0dXJuIDA7CiAKLQljcGt0LmlkID0gY3B1X3RvX3ZpcnRpbzMyKHBvcnRkZXYtPnZkZXYsIHBvcnRfaWQpOwotCWNwa3QuZXZlbnQgPSBjcHVfdG9fdmlydGlvMTYocG9ydGRldi0+dmRldiwgZXZlbnQpOwotCWNwa3QudmFsdWUgPSBjcHVfdG9fdmlydGlvMTYocG9ydGRldi0+dmRldiwgdmFsdWUpOwotCiAJdnEgPSBwb3J0ZGV2LT5jX292cTsKIAotCXNnX2luaXRfb25lKHNnLCAmY3BrdCwgc2l6ZW9mKGNwa3QpKTsKLQogCXNwaW5fbG9jaygmcG9ydGRldi0+Y19vdnFfbG9jayk7Ci0JaWYgKHZpcnRxdWV1ZV9hZGRfb3V0YnVmKHZxLCBzZywgMSwgJmNwa3QsIEdGUF9BVE9NSUMpID09IDApIHsKKworCXBvcnRkZXYtPmNwa3QuaWQgPSBjcHVfdG9fdmlydGlvMzIocG9ydGRldi0+dmRldiwgcG9ydF9pZCk7CisJcG9ydGRldi0+Y3BrdC5ldmVudCA9IGNwdV90b192aXJ0aW8xNihwb3J0ZGV2LT52ZGV2LCBldmVudCk7CisJcG9ydGRldi0+Y3BrdC52YWx1ZSA9IGNwdV90b192aXJ0aW8xNihwb3J0ZGV2LT52ZGV2LCB2YWx1ZSk7CisKKwlzZ19pbml0X29uZShzZywgJnBvcnRkZXYtPmNwa3QsIHNpemVvZihzdHJ1Y3QgdmlydGlvX2NvbnNvbGVfY29udHJvbCkpOworCisJaWYgKHZpcnRxdWV1ZV9hZGRfb3V0YnVmKHZxLCBzZywgMSwgJnBvcnRkZXYtPmNwa3QsIEdGUF9BVE9NSUMpID09IDApIHsKIAkJdmlydHF1ZXVlX2tpY2sodnEpOwogCQl3aGlsZSAoIXZpcnRxdWV1ZV9nZXRfYnVmKHZxLCAmbGVuKQogCQkJJiYgIXZpcnRxdWV1ZV9pc19icm9rZW4odnEpKQogCQkJY3B1X3JlbGF4KCk7CiAJfQorCiAJc3Bpbl91bmxvY2soJnBvcnRkZXYtPmNfb3ZxX2xvY2spOwogCXJldHVybiAwOwogfQpAQCAtODgyLDcgKzg4OSw3IEBACiAJCXJldHVybiAwOwogCiAJLyogVHJ5IGxvY2sgdGhpcyBwYWdlICovCi0JaWYgKGJ1Zi0+b3BzLT5zdGVhbChwaXBlLCBidWYpID09IDApIHsKKwlpZiAocGlwZV9idWZfc3RlYWwocGlwZSwgYnVmKSA9PSAwKSB7CiAJCS8qIEdldCByZWZlcmVuY2UgYW5kIHVubG9jayBwYWdlIGZvciBtb3ZpbmcgKi8KIAkJZ2V0X3BhZ2UoYnVmLT5wYWdlKTsKIAkJdW5sb2NrX3BhZ2UoYnVmLT5wYWdlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci94aWxseWJ1cy94aWxseWJ1c19jb3JlLmMgYi9kcml2ZXJzL2NoYXIveGlsbHlidXMveGlsbHlidXNfY29yZS5jCmluZGV4IGRjZDE5ZjMuLmI2YzljZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci94aWxseWJ1cy94aWxseWJ1c19jb3JlLmMKKysrIGIvZHJpdmVycy9jaGFyL3hpbGx5YnVzL3hpbGx5YnVzX2NvcmUuYwpAQCAtNjU1LDEwICs2NTUsMTAgQEAKIAogCXZlcnNpb24gPSBjaGFubmVsLT53cl9idWZmZXJzWzBdLT5hZGRyOwogCi0JLyogQ2hlY2sgdmVyc2lvbiBudW1iZXIuIEFjY2VwdCBhbnl0aGluZyBiZWxvdyAweDgyIGZvciBub3cuICovCisJLyogQ2hlY2sgdmVyc2lvbiBudW1iZXIuIFJlamVjdCBhbnl0aGluZyBhYm92ZSAweDgyLiAqLwogCWlmICgqdmVyc2lvbiA+IDB4ODIpIHsKIAkJZGV2X2VycihlbmRwb2ludC0+ZGV2LAotCQkJIk5vIHN1cHBvcnQgZm9yIElEVCB2ZXJzaW9uIDB4JTAyeC4gTWF5YmUgdGhlIHhpbGx5YnVzIGRyaXZlciBuZWVkcyBhbiB1cGdhcmRlLiBBYm9ydGluZy5cbiIsCisJCQkiTm8gc3VwcG9ydCBmb3IgSURUIHZlcnNpb24gMHglMDJ4LiBNYXliZSB0aGUgeGlsbHlidXMgZHJpdmVyIG5lZWRzIGFuIHVwZ3JhZGUuIEFib3J0aW5nLlxuIiwKIAkJCSp2ZXJzaW9uKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvS2NvbmZpZyBiL2RyaXZlcnMvY2xrL0tjb25maWcKaW5kZXggZTJkOWJkNy4uNmE4YWMwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvS2NvbmZpZworKysgYi9kcml2ZXJzL2Nsay9LY29uZmlnCkBAIC0zMSwyMiArMzEsMTIgQEAKIAogc291cmNlICJkcml2ZXJzL2Nsay92ZXJzYXRpbGUvS2NvbmZpZyIKIAotY29uZmlnIENPTU1PTl9DTEtfTUFYX0dFTgotICAgICAgICBib29sCi0KIGNvbmZpZyBDT01NT05fQ0xLX01BWDc3Njg2Ci0JdHJpc3RhdGUgIkNsb2NrIGRyaXZlciBmb3IgTWF4aW0gNzc2ODYgTUZEIgotCWRlcGVuZHMgb24gTUZEX01BWDc3Njg2Ci0Jc2VsZWN0IENPTU1PTl9DTEtfTUFYX0dFTgorCXRyaXN0YXRlICJDbG9jayBkcml2ZXIgZm9yIE1heGltIDc3NjIwLzc3Njg2Lzc3ODAyIE1GRCIKKwlkZXBlbmRzIG9uIE1GRF9NQVg3NzY4NiB8fCBNRkRfTUFYNzc2MjAKIAktLS1oZWxwLS0tCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyBNYXhpbSA3NzY4NiBjcnlzdGFsIG9zY2lsbGF0b3IgY2xvY2suIAotCi1jb25maWcgQ09NTU9OX0NMS19NQVg3NzgwMgotCXRyaXN0YXRlICJDbG9jayBkcml2ZXIgZm9yIE1heGltIDc3ODAyIFBNSUMiCi0JZGVwZW5kcyBvbiBNRkRfTUFYNzc2ODYKLQlzZWxlY3QgQ09NTU9OX0NMS19NQVhfR0VOCi0JLS0taGVscC0tLQotCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWF4aW0gNzc4MDIgY3J5c3RhbCBvc2NpbGxhdG9yIGNsb2NrLgorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWF4aW0gNzc2MjAvNzc2ODYvNzc4MDIgY3J5c3RhbCBvc2NpbGxhdG9yCisJICBjbG9jay4KIAogY29uZmlnIENPTU1PTl9DTEtfUks4MDgKIAl0cmlzdGF0ZSAiQ2xvY2sgZHJpdmVyIGZvciBSSzgwOC9SSzgxOCIKQEAgLTIxMCw2ICsyMDAsNyBAQAogCiBzb3VyY2UgImRyaXZlcnMvY2xrL2JjbS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL2Nsay9oaXNpbGljb24vS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9jbGsvbWVkaWF0ZWsvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9jbGsvbWVzb24vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9jbGsvbXZlYnUvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9jbGsvcWNvbS9LY29uZmlnIgpAQCAtMjE4LDUgKzIwOSw2IEBACiBzb3VyY2UgImRyaXZlcnMvY2xrL3N1bnhpLW5nL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvY2xrL3RlZ3JhL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvY2xrL3RpL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvY2xrL3VuaXBoaWVyL0tjb25maWciCiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL01ha2VmaWxlIGIvZHJpdmVycy9jbGsvTWFrZWZpbGUKaW5kZXggM2I2ZjljZi4uOTI1MDgxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jbGsvTWFrZWZpbGUKQEAgLTI2LDEwICsyNiw3IEBACiBvYmotJChDT05GSUdfQ09NTU9OX0NMS19DUzIwMDBfQ1ApCSs9IGNsay1jczIwMDAtY3Aubwogb2JqLSQoQ09ORklHX0FSQ0hfRUZNMzIpCQkrPSBjbGstZWZtMzJnZy5vCiBvYmotJChDT05GSUdfQVJDSF9ISUdIQkFOSykJCSs9IGNsay1oaWdoYmFuay5vCi1vYmotJChDT05GSUdfTUFDSF9MT09OR1NPTjMyKQkJKz0gY2xrLWxzMXgubwotb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTUFYX0dFTikJKz0gY2xrLW1heC1nZW4ubwogb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfTUFYNzc2ODYpCSs9IGNsay1tYXg3NzY4Ni5vCi1vYmotJChDT05GSUdfQ09NTU9OX0NMS19NQVg3NzgwMikJKz0gY2xrLW1heDc3ODAyLm8KIG9iai0kKENPTkZJR19BUkNIX01CODZTN1gpCQkrPSBjbGstbWI4NnM3eC5vCiBvYmotJChDT05GSUdfQVJDSF9NT1hBUlQpCQkrPSBjbGstbW94YXJ0Lm8KIG9iai0kKENPTkZJR19BUkNIX05PTUFESUspCQkrPSBjbGstbm9tYWRpay5vCkBAIC02Myw2ICs2MCw3IEBACiBvYmotJChDT05GSUdfQVJDSF9NWEMpCQkJKz0gaW14Lwogb2JqLSQoQ09ORklHX01BQ0hfSU5HRU5JQykJCSs9IGluZ2VuaWMvCiBvYmotJChDT05GSUdfQ09NTU9OX0NMS19LRVlTVE9ORSkJKz0ga2V5c3RvbmUvCitvYmotJChDT05GSUdfTUFDSF9MT09OR1NPTjMyKQkJKz0gbG9vbmdzb24xLwogb2JqLSQoQ09ORklHX0FSQ0hfTUVESUFURUspCQkrPSBtZWRpYXRlay8KIG9iai0kKENPTkZJR19DT01NT05fQ0xLX0FNTE9HSUMpCSs9IG1lc29uLwogb2JqLSQoQ09ORklHX01BQ0hfUElDMzIpCQkrPSBtaWNyb2NoaXAvCkBAIC04Niw2ICs4NCw3IEBACiBvYmotJChDT05GSUdfQVJDSF9TVU5YSSkJCSs9IHN1bnhpLW5nLwogb2JqLSQoQ09ORklHX0FSQ0hfVEVHUkEpCQkrPSB0ZWdyYS8KIG9iai15CQkJCQkrPSB0aS8KK29iai0kKENPTkZJR19DTEtfVU5JUEhJRVIpCQkrPSB1bmlwaGllci8KIG9iai0kKENPTkZJR19BUkNIX1U4NTAwKQkJKz0gdXg1MDAvCiBvYmotJChDT05GSUdfQ09NTU9OX0NMS19WRVJTQVRJTEUpCSs9IHZlcnNhdGlsZS8KIG9iai0kKENPTkZJR19YODYpCQkJKz0geDg2LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstZ2VuZXJhdGVkLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1nZW5lcmF0ZWQuYwppbmRleCA3ZjZiZWM4Li40ZTFjZDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1nZW5lcmF0ZWQuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1nZW5lcmF0ZWQuYwpAQCAtMjMzLDE0ICsyMzMsMTYgQEAKIAkJCQkJPj4gQVQ5MV9QTUNfUENSX0dDS0RJVl9PRkZTRVQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0Ci1hdDkxX2Nsa19yZWdpc3Rlcl9nZW5lcmF0ZWQoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCAgc3BpbmxvY2tfdCAqbG9jaywgY29uc3QgY2hhcgotCQkJICAgICpuYW1lLCBjb25zdCBjaGFyICoqcGFyZW50X25hbWVzLCB1OCBudW1fcGFyZW50cywKLQkJCSAgICB1OCBpZCwgY29uc3Qgc3RydWN0IGNsa19yYW5nZSAqcmFuZ2UpCitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAorYXQ5MV9jbGtfcmVnaXN0ZXJfZ2VuZXJhdGVkKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgc3BpbmxvY2tfdCAqbG9jaywKKwkJCSAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqcGFyZW50X25hbWVzLAorCQkJICAgIHU4IG51bV9wYXJlbnRzLCB1OCBpZCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgY2xrX3JhbmdlICpyYW5nZSkKIHsKIAlzdHJ1Y3QgY2xrX2dlbmVyYXRlZCAqZ2NrOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlpbnQgcmV0OwogCiAJZ2NrID0ga3phbGxvYyhzaXplb2YoKmdjayksIEdGUF9LRVJORUwpOwogCWlmICghZ2NrKQpAQCAtMjU4LDEzICsyNjAsMTUgQEAKIAlnY2stPmxvY2sgPSBsb2NrOwogCWdjay0+cmFuZ2UgPSAqcmFuZ2U7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJmdjay0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZnY2stPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmZ2NrLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShnY2spOwotCWVsc2UKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfSBlbHNlCiAJCWNsa19nZW5lcmF0ZWRfc3RhcnR1cChnY2spOwogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBvZl9zYW1hNWQyX2Nsa19nZW5lcmF0ZWRfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKQEAgLTI3Miw3ICsyNzYsNyBAQAogCWludCBudW07CiAJdTMyIGlkOwogCWNvbnN0IGNoYXIgKm5hbWU7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXVuc2lnbmVkIGludCBudW1fcGFyZW50czsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbR0VORVJBVEVEX1NPVVJDRV9NQVhdOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZ2NrbnA7CkBAIC0zMDYsMTMgKzMxMCwxMyBAQAogCQlvZl9hdDkxX2dldF9jbGtfcmFuZ2UoZ2NrbnAsICJhdG1lbCxjbGstb3V0cHV0LXJhbmdlIiwKIAkJCQkgICAgICAmcmFuZ2UpOwogCi0JCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX2dlbmVyYXRlZChyZWdtYXAsICZwbWNfcGNyX2xvY2ssIG5hbWUsCisJCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfZ2VuZXJhdGVkKHJlZ21hcCwgJnBtY19wY3JfbG9jaywgbmFtZSwKIAkJCQkJCSAgcGFyZW50X25hbWVzLCBudW1fcGFyZW50cywKIAkJCQkJCSAgaWQsICZyYW5nZSk7Ci0JCWlmIChJU19FUlIoY2xrKSkKKwkJaWYgKElTX0VSUihodykpCiAJCQljb250aW51ZTsKIAotCQlvZl9jbGtfYWRkX3Byb3ZpZGVyKGdja25wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoZ2NrbnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiAJfQogfQogQ0xLX09GX0RFQ0xBUkUob2Zfc2FtYTVkMl9jbGtfZ2VuZXJhdGVkX3NldHVwLCAiYXRtZWwsc2FtYTVkMi1jbGstZ2VuZXJhdGVkIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLWgzMm14LmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1oMzJteC5jCmluZGV4IDhlMjBjOGEuLmUwZGFhNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLWgzMm14LmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstaDMybXguYwpAQCAtOTIsNyArOTIsNyBAQAogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCXN0cnVjdCBjbGsgKmNsazsKKwlpbnQgcmV0OwogCiAJcmVnbWFwID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKG9mX2dldF9wYXJlbnQobnApKTsKIAlpZiAoSVNfRVJSKHJlZ21hcCkpCkBAIC0xMTMsMTMgKzExMywxMyBAQAogCWgzMm14Y2xrLT5ody5pbml0ID0gJmluaXQ7CiAJaDMybXhjbGstPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmaDMybXhjbGstPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJmgzMm14Y2xrLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShoMzJteGNsayk7CiAJCXJldHVybjsKIAl9CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsICZoMzJteGNsay0+aHcpOwogfQogQ0xLX09GX0RFQ0xBUkUob2Zfc2FtYTVkNF9jbGtfaDMybXhfc2V0dXAsICJhdG1lbCxzYW1hNWQ0LWNsay1oMzJteCIsCiAJICAgICAgIG9mX3NhbWE1ZDRfY2xrX2gzMm14X3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1haW4uYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1haW4uYwppbmRleCA1OGI1YmFjYS4uYzgxM2MyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstbWFpbi5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1haW4uYwpAQCAtMTI4LDE1ICsxMjgsMTYgQEAKIAkuaXNfcHJlcGFyZWQgPSBjbGtfbWFpbl9vc2NfaXNfcHJlcGFyZWQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX21haW5fb3NjKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKIAkJCSAgIGJvb2wgYnlwYXNzKQogewogCXN0cnVjdCBjbGtfbWFpbl9vc2MgKm9zYzsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJc3RydWN0IGNsa19odyAqaHc7CisJaW50IHJldDsKIAogCWlmICghbmFtZSB8fCAhcGFyZW50X25hbWUpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMTYwLDE2ICsxNjEsMTkgQEAKIAkJCQkgICBBVDkxX1BNQ19NT1NDRU4sCiAJCQkJICAgQVQ5MV9QTUNfT1NDQllQQVNTIHwgQVQ5MV9QTUNfS0VZKTsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmb3NjLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJm9zYy0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZvc2MtPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKG9zYyk7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb2ZfYXQ5MXJtOTIwMF9jbGtfbWFpbl9vc2Nfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKQEAgLTE4MywxMSArMTg3LDExIEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9tYWluX29zYyhyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lLCBieXBhc3MpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX21haW5fb3NjKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUsIGJ5cGFzcyk7CisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXJtOTIwMF9jbGtfbWFpbl9vc2MsICJhdG1lbCxhdDkxcm05MjAwLWNsay1tYWluLW9zYyIsCiAJICAgICAgIG9mX2F0OTFybTkyMDBfY2xrX21haW5fb3NjX3NldHVwKTsKQEAgLTI3MSwxNCArMjc1LDE1IEBACiAJLnJlY2FsY19hY2N1cmFjeSA9IGNsa19tYWluX3JjX29zY19yZWNhbGNfYWNjdXJhY3ksCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX21haW5fcmNfb3NjKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgICB1MzIgZnJlcXVlbmN5LCB1MzIgYWNjdXJhY3kpCiB7CiAJc3RydWN0IGNsa19tYWluX3JjX29zYyAqb3NjOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlpbnQgcmV0OwogCiAJaWYgKCFuYW1lIHx8ICFmcmVxdWVuY3kpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMjk4LDE2ICszMDMsMTkgQEAKIAlvc2MtPmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKIAlvc2MtPmFjY3VyYWN5ID0gYWNjdXJhY3k7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZvc2MtPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCBodyk7CisJaWYgKHJldCkgewogCQlrZnJlZShvc2MpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX21haW5fcmNfb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXUzMiBmcmVxdWVuY3kgPSAwOwogCXUzMiBhY2N1cmFjeSA9IDA7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwpAQCAtMzIxLDExICszMjksMTEgQEAKIAlpZiAoSVNfRVJSKHJlZ21hcCkpCiAJCXJldHVybjsKIAotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX21haW5fcmNfb3NjKHJlZ21hcCwgbmFtZSwgZnJlcXVlbmN5LCBhY2N1cmFjeSk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfbWFpbl9yY19vc2MocmVnbWFwLCBuYW1lLCBmcmVxdWVuY3ksIGFjY3VyYWN5KTsKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiBDTEtfT0ZfREVDTEFSRShhdDkxc2FtOXg1X2Nsa19tYWluX3JjX29zYywgImF0bWVsLGF0OTFzYW05eDUtY2xrLW1haW4tcmMtb3NjIiwKIAkgICAgICAgb2ZfYXQ5MXNhbTl4NV9jbGtfbWFpbl9yY19vc2Nfc2V0dXApOwpAQCAtMzk1LDE0ICs0MDMsMTUgQEAKIAkucmVjYWxjX3JhdGUgPSBjbGtfcm05MjAwX21haW5fcmVjYWxjX3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX3JtOTIwMF9tYWluKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSkKIHsKIAlzdHJ1Y3QgY2xrX3JtOTIwMF9tYWluICpjbGttYWluOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlpbnQgcmV0OwogCiAJaWYgKCFuYW1lKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTQyMywxNiArNDMyLDE5IEBACiAJY2xrbWFpbi0+aHcuaW5pdCA9ICZpbml0OwogCWNsa21haW4tPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmY2xrbWFpbi0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZjbGttYWluLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJmNsa21haW4tPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKGNsa21haW4pOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFybTkyMDBfY2xrX21haW5fc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKQEAgLTQ0NCwxMSArNDU2LDExIEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9ybTkyMDBfbWFpbihyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9ybTkyMDBfbWFpbihyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lKTsKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiBDTEtfT0ZfREVDTEFSRShhdDkxcm05MjAwX2Nsa19tYWluLCAiYXRtZWwsYXQ5MXJtOTIwMC1jbGstbWFpbiIsCiAJICAgICAgIG9mX2F0OTFybTkyMDBfY2xrX21haW5fc2V0dXApOwpAQCAtNTI5LDE2ICs1NDEsMTcgQEAKIAkuZ2V0X3BhcmVudCA9IGNsa19zYW05eDVfbWFpbl9nZXRfcGFyZW50LAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05eDVfbWFpbihzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCiAJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywKIAkJCSAgICAgIGludCBudW1fcGFyZW50cykKIHsKIAlzdHJ1Y3QgY2xrX3NhbTl4NV9tYWluICpjbGttYWluOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOworCXN0cnVjdCBjbGtfaHcgKmh3OworCWludCByZXQ7CiAKIAlpZiAoIW5hbWUpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtNTYxLDE2ICs1NzQsMTkgQEAKIAlyZWdtYXBfcmVhZChjbGttYWluLT5yZWdtYXAsIEFUOTFfQ0tHUl9NT1IsICZzdGF0dXMpOwogCWNsa21haW4tPnBhcmVudCA9IHN0YXR1cyAmIEFUOTFfUE1DX01PU0NFTiA/IDEgOiAwOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZjbGttYWluLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJmNsa21haW4tPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmY2xrbWFpbi0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUoY2xrbWFpbik7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb2ZfYXQ5MXNhbTl4NV9jbGtfbWFpbl9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbMl07CiAJdW5zaWduZWQgaW50IG51bV9wYXJlbnRzOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKQEAgLTU4NywxMiArNjAzLDEyIEBACiAKIAlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZuYW1lKTsKIAotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9tYWluKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWVzLAorCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X21haW4ocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCiAJCQkJCSAgICBudW1fcGFyZW50cyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChJU19FUlIoaHcpKQogCQlyZXR1cm47CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIH0KIENMS19PRl9ERUNMQVJFKGF0OTFzYW05eDVfY2xrX21haW4sICJhdG1lbCxhdDkxc2FtOXg1LWNsay1tYWluIiwKIAkgICAgICAgb2ZfYXQ5MXNhbTl4NV9jbGtfbWFpbl9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1tYXN0ZXIuYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1hc3Rlci5jCmluZGV4IGQxMDIxZTEuLmU5Y2JhOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1hc3Rlci5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLW1hc3Rlci5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAkuZ2V0X3BhcmVudCA9IGNsa19tYXN0ZXJfZ2V0X3BhcmVudCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfbWFzdGVyKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKIAkJY29uc3QgY2hhciAqbmFtZSwgaW50IG51bV9wYXJlbnRzLAogCQljb25zdCBjaGFyICoqcGFyZW50X25hbWVzLApAQCAtMTI4LDggKzEyOCw5IEBACiAJCWNvbnN0IHN0cnVjdCBjbGtfbWFzdGVyX2NoYXJhY3RlcmlzdGljcyAqY2hhcmFjdGVyaXN0aWNzKQogewogCXN0cnVjdCBjbGtfbWFzdGVyICptYXN0ZXI7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCXN0cnVjdCBjbGtfaHcgKmh3OworCWludCByZXQ7CiAKIAlpZiAoIW5hbWUgfHwgIW51bV9wYXJlbnRzIHx8ICFwYXJlbnRfbmFtZXMpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMTQ5LDEyICsxNTAsMTQgQEAKIAltYXN0ZXItPmNoYXJhY3RlcmlzdGljcyA9IGNoYXJhY3RlcmlzdGljczsKIAltYXN0ZXItPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmbWFzdGVyLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKSB7CisJaHcgPSAmbWFzdGVyLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJm1hc3Rlci0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUobWFzdGVyKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CiAJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIApAQCAtMTk4LDcgKzIwMSw3IEBACiBvZl9hdDkxX2Nsa19tYXN0ZXJfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCSBjb25zdCBzdHJ1Y3QgY2xrX21hc3Rlcl9sYXlvdXQgKmxheW91dCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJdW5zaWduZWQgaW50IG51bV9wYXJlbnRzOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1tNQVNURVJfU09VUkNFX01BWF07CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwpAQCAtMjIxLDEzICsyMjQsMTMgQEAKIAlpZiAoSVNfRVJSKHJlZ21hcCkpCiAJCXJldHVybjsKIAotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX21hc3RlcihyZWdtYXAsIG5hbWUsIG51bV9wYXJlbnRzLAorCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfbWFzdGVyKHJlZ21hcCwgbmFtZSwgbnVtX3BhcmVudHMsCiAJCQkJICAgICAgIHBhcmVudF9uYW1lcywgbGF5b3V0LAogCQkJCSAgICAgICBjaGFyYWN0ZXJpc3RpY3MpOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJZ290byBvdXRfZnJlZV9jaGFyYWN0ZXJpc3RpY3M7CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIAlyZXR1cm47CiAKIG91dF9mcmVlX2NoYXJhY3RlcmlzdGljczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBlcmlwaGVyYWwuYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBlcmlwaGVyYWwuYwppbmRleCBmZDE2MDcyLi5kYzI5ZmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wZXJpcGhlcmFsLmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstcGVyaXBoZXJhbC5jCkBAIC0xMDQsMTMgKzEwNCwxNCBAQAogCS5pc19lbmFibGVkID0gY2xrX3BlcmlwaGVyYWxfaXNfZW5hYmxlZCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfcGVyaXBoZXJhbChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLCB1MzIgaWQpCiB7CiAJc3RydWN0IGNsa19wZXJpcGhlcmFsICpwZXJpcGg7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCXN0cnVjdCBjbGtfaHcgKmh3OworCWludCByZXQ7CiAKIAlpZiAoIW5hbWUgfHwgIXBhcmVudF9uYW1lIHx8IGlkID4gUEVSSVBIRVJBTF9JRF9NQVgpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMTI5LDExICsxMzAsMTQgQEAKIAlwZXJpcGgtPmh3LmluaXQgPSAmaW5pdDsKIAlwZXJpcGgtPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmcGVyaXBoLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJnBlcmlwaC0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZwZXJpcGgtPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKHBlcmlwaCk7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBjbGtfc2FtOXg1X3BlcmlwaGVyYWxfYXV0b2RpdihzdHJ1Y3QgY2xrX3NhbTl4NV9wZXJpcGhlcmFsICpwZXJpcGgpCkBAIC0zMjcsMTQgKzMzMSwxNSBAQAogCS5zZXRfcmF0ZSA9IGNsa19zYW05eDVfcGVyaXBoZXJhbF9zZXRfcmF0ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X3BlcmlwaGVyYWwoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBzcGlubG9ja190ICpsb2NrLAogCQkJCSAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKIAkJCQkgICAgdTMyIGlkLCBjb25zdCBzdHJ1Y3QgY2xrX3JhbmdlICpyYW5nZSkKIHsKIAlzdHJ1Y3QgY2xrX3NhbTl4NV9wZXJpcGhlcmFsICpwZXJpcGg7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCXN0cnVjdCBjbGtfaHcgKmh3OworCWludCByZXQ7CiAKIAlpZiAoIW5hbWUgfHwgIXBhcmVudF9uYW1lKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTM1NywxMyArMzYyLDE1IEBACiAJcGVyaXBoLT5hdXRvX2RpdiA9IHRydWU7CiAJcGVyaXBoLT5yYW5nZSA9ICpyYW5nZTsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmcGVyaXBoLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJnBlcmlwaC0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZwZXJpcGgtPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKHBlcmlwaCk7Ci0JZWxzZQorCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9IGVsc2UKIAkJY2xrX3NhbTl4NV9wZXJpcGhlcmFsX2F1dG9kaXYocGVyaXBoKTsKIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQKQEAgLTM3MSw3ICszNzgsNyBAQAogewogCWludCBudW07CiAJdTMyIGlkOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAljb25zdCBjaGFyICpuYW1lOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGVyaXBoY2xrbnA7CkBAIC00MDAsNyArNDA3LDcgQEAKIAkJCW5hbWUgPSBwZXJpcGhjbGtucC0+bmFtZTsKIAogCQlpZiAodHlwZSA9PSBQRVJJUEhFUkFMX0FUOTFSTTkyMDApIHsKLQkJCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3BlcmlwaGVyYWwocmVnbWFwLCBuYW1lLAorCQkJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9wZXJpcGhlcmFsKHJlZ21hcCwgbmFtZSwKIAkJCQkJCQkgICBwYXJlbnRfbmFtZSwgaWQpOwogCQl9IGVsc2UgewogCQkJc3RydWN0IGNsa19yYW5nZSByYW5nZSA9IENMS19SQU5HRSgwLCAwKTsKQEAgLTQwOSwxNyArNDE2LDE3IEBACiAJCQkJCSAgICAgICJhdG1lbCxjbGstb3V0cHV0LXJhbmdlIiwKIAkJCQkJICAgICAgJnJhbmdlKTsKIAotCQkJY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X3BlcmlwaGVyYWwocmVnbWFwLAorCQkJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05eDVfcGVyaXBoZXJhbChyZWdtYXAsCiAJCQkJCQkJCSAgJnBtY19wY3JfbG9jaywKIAkJCQkJCQkJICBuYW1lLAogCQkJCQkJCQkgIHBhcmVudF9uYW1lLAogCQkJCQkJCQkgIGlkLCAmcmFuZ2UpOwogCQl9CiAKLQkJaWYgKElTX0VSUihjbGspKQorCQlpZiAoSVNfRVJSKGh3KSkKIAkJCWNvbnRpbnVlOwogCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIocGVyaXBoY2xrbnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwkJb2ZfY2xrX2FkZF9od19wcm92aWRlcihwZXJpcGhjbGtucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBsbC5jIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstcGxsLmMKaW5kZXggZmIyZTBiNS4uNDVhZDE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstcGxsLmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstcGxsLmMKQEAgLTI5NiwxNyArMjk2LDE4IEBACiAJLnNldF9yYXRlID0gY2xrX3BsbF9zZXRfcmF0ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfcGxsKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIHU4IGlkLAogCQkgICAgICBjb25zdCBzdHJ1Y3QgY2xrX3BsbF9sYXlvdXQgKmxheW91dCwKIAkJICAgICAgY29uc3Qgc3RydWN0IGNsa19wbGxfY2hhcmFjdGVyaXN0aWNzICpjaGFyYWN0ZXJpc3RpY3MpCiB7CiAJc3RydWN0IGNsa19wbGwgKnBsbDsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CiAJaW50IG9mZnNldCA9IFBMTF9SRUcoaWQpOwogCXVuc2lnbmVkIGludCBwbGxyOworCWludCByZXQ7CiAKIAlpZiAoaWQgPiBQTExfTUFYX0lEKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTMzMCwxMiArMzMxLDE0IEBACiAJcGxsLT5kaXYgPSBQTExfRElWKHBsbHIpOwogCXBsbC0+bXVsID0gUExMX01VTChwbGxyLCBsYXlvdXQpOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZwbGwtPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKKwlodyA9ICZwbGwtPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmcGxsLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShwbGwpOworCQlodyA9IEVSUl9QVFIocmV0KTsKIAl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogCkBAIC00NjUsNyArNDY4LDcgQEAKIAkJICAgICAgY29uc3Qgc3RydWN0IGNsa19wbGxfbGF5b3V0ICpsYXlvdXQpCiB7CiAJdTMyIGlkOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwpAQCAtNDg2LDEyICs0ODksMTIgQEAKIAlpZiAoIWNoYXJhY3RlcmlzdGljcykKIAkJcmV0dXJuOwogCi0JY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfcGxsKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUsIGlkLCBsYXlvdXQsCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9wbGwocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSwgaWQsIGxheW91dCwKIAkJCQkgICAgY2hhcmFjdGVyaXN0aWNzKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gb3V0X2ZyZWVfY2hhcmFjdGVyaXN0aWNzOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiAJcmV0dXJuOwogCiBvdXRfZnJlZV9jaGFyYWN0ZXJpc3RpY3M6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wbGxkaXYuYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBsbGRpdi5jCmluZGV4IDJiZWQyNjQuLmI0YWZhZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBsbGRpdi5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXBsbGRpdi5jCkBAIC03NSwxMyArNzUsMTQgQEAKIAkuc2V0X3JhdGUgPSBjbGtfcGxsZGl2X3NldF9yYXRlLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl9wbGxkaXYoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBjb25zdCBjaGFyICpuYW1lLAogCQkJIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lKQogewogCXN0cnVjdCBjbGtfcGxsZGl2ICpwbGxkaXY7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CiAKIAlwbGxkaXYgPSBremFsbG9jKHNpemVvZigqcGxsZGl2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwbGxkaXYpCkBAIC05NiwxOCArOTcsMjAgQEAKIAlwbGxkaXYtPmh3LmluaXQgPSAmaW5pdDsKIAlwbGxkaXYtPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmcGxsZGl2LT5odyk7Ci0KLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmcGxsZGl2LT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnBsbGRpdi0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUocGxsZGl2KTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdAogb2ZfYXQ5MXNhbTl4NV9jbGtfcGxsZGl2X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CkBAIC0xMjAsMTIgKzEyMywxMSBAQAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuOwogCi0JY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfcGxsZGl2KHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX3BsbGRpdihyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lKTsKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOwotCXJldHVybjsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXNhbTl4NV9jbGtfcGxsZGl2LCAiYXRtZWwsYXQ5MXNhbTl4NS1jbGstcGxsZGl2IiwKIAkgICAgICAgb2ZfYXQ5MXNhbTl4NV9jbGtfcGxsZGl2X3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXByb2dyYW1tYWJsZS5jIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstcHJvZ3JhbW1hYmxlLmMKaW5kZXggMjVkNTkwNi4uMTkwMTIyZTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wcm9ncmFtbWFibGUuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1wcm9ncmFtbWFibGUuYwpAQCAtMTcwLDE1ICsxNzAsMTYgQEAKIAkuc2V0X3JhdGUgPSBjbGtfcHJvZ3JhbW1hYmxlX3NldF9yYXRlLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl9wcm9ncmFtbWFibGUoc3RydWN0IHJlZ21hcCAqcmVnbWFwLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKipwYXJlbnRfbmFtZXMsCiAJCQkgICAgICAgdTggbnVtX3BhcmVudHMsIHU4IGlkLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjbGtfcHJvZ3JhbW1hYmxlX2xheW91dCAqbGF5b3V0KQogewogCXN0cnVjdCBjbGtfcHJvZ3JhbW1hYmxlICpwcm9nOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJaWYgKGlkID4gUFJPR19JRF9NQVgpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMTk4LDExICsxOTksMTQgQEAKIAlwcm9nLT5ody5pbml0ID0gJmluaXQ7CiAJcHJvZy0+cmVnbWFwID0gcmVnbWFwOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZwcm9nLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJnByb2ctPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmcHJvZy0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUocHJvZyk7CisJCWh3ID0gJnByb2ctPmh3OworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19wcm9ncmFtbWFibGVfbGF5b3V0IGF0OTFybTkyMDBfcHJvZ3JhbW1hYmxlX2xheW91dCA9IHsKQEAgLTIyOSw3ICsyMzMsNyBAQAogewogCWludCBudW07CiAJdTMyIGlkOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWVzW1BST0dfU09VUkNFX01BWF07CiAJY29uc3QgY2hhciAqbmFtZTsKQEAgLTI1NywxMyArMjYxLDEzIEBACiAJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZuYW1lKSkKIAkJCW5hbWUgPSBwcm9nY2xrbnAtPm5hbWU7CiAKLQkJY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfcHJvZ3JhbW1hYmxlKHJlZ21hcCwgbmFtZSwKKwkJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9wcm9ncmFtbWFibGUocmVnbWFwLCBuYW1lLAogCQkJCQkJICAgICBwYXJlbnRfbmFtZXMsIG51bV9wYXJlbnRzLAogCQkJCQkJICAgICBpZCwgbGF5b3V0KTsKLQkJaWYgKElTX0VSUihjbGspKQorCQlpZiAoSVNfRVJSKGh3KSkKIAkJCWNvbnRpbnVlOwogCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIocHJvZ2Nsa25wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIocHJvZ2Nsa25wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstc2xvdy5jIGIvZHJpdmVycy9jbGsvYXQ5MS9jbGstc2xvdy5jCmluZGV4IDYxMDkwYjEuLjU2MGE4YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXNsb3cuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zbG93LmMKQEAgLTEzLDQyICsxMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay9hdDkxX3BtYy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAKICNpbmNsdWRlICJwbWMuaCIKLSNpbmNsdWRlICJzY2tjLmgiCi0KLSNkZWZpbmUgU0xPV19DTE9DS19GUkVRCQkzMjc2OAotI2RlZmluZSBTTE9XQ0tfU1dfQ1lDTEVTCTUKLSNkZWZpbmUgU0xPV0NLX1NXX1RJTUVfVVNFQwkoKFNMT1dDS19TV19DWUNMRVMgKiBVU0VDX1BFUl9TRUMpIC8gXAotCQkJCSBTTE9XX0NMT0NLX0ZSRVEpCi0KLSNkZWZpbmUJQVQ5MV9TQ0tDX0NSCQkJMHgwMAotI2RlZmluZQkJQVQ5MV9TQ0tDX1JDRU4JCSgxIDw8IDApCi0jZGVmaW5lCQlBVDkxX1NDS0NfT1NDMzJFTgkoMSA8PCAxKQotI2RlZmluZQkJQVQ5MV9TQ0tDX09TQzMyQllQCSgxIDw8IDIpCi0jZGVmaW5lCQlBVDkxX1NDS0NfT1NDU0VMCSgxIDw8IDMpCi0KLXN0cnVjdCBjbGtfc2xvd19vc2MgewotCXN0cnVjdCBjbGtfaHcgaHc7Ci0Jdm9pZCBfX2lvbWVtICpzY2tjcjsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0dXBfdXNlYzsKLX07Ci0KLSNkZWZpbmUgdG9fY2xrX3Nsb3dfb3NjKGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBjbGtfc2xvd19vc2MsIGh3KQotCi1zdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjIHsKLQlzdHJ1Y3QgY2xrX2h3IGh3OwotCXZvaWQgX19pb21lbSAqc2NrY3I7Ci0JdW5zaWduZWQgbG9uZyBmcmVxdWVuY3k7Ci0JdW5zaWduZWQgbG9uZyBhY2N1cmFjeTsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0dXBfdXNlYzsKLX07Ci0KLSNkZWZpbmUgdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBjbGtfc2xvd19yY19vc2MsIGh3KQogCiBzdHJ1Y3QgY2xrX3NhbTkyNjBfc2xvdyB7CiAJc3RydWN0IGNsa19odyBodzsKQEAgLTU3LDMyOCArMjYsNiBAQAogCiAjZGVmaW5lIHRvX2Nsa19zYW05MjYwX3Nsb3coaHcpIGNvbnRhaW5lcl9vZihodywgc3RydWN0IGNsa19zYW05MjYwX3Nsb3csIGh3KQogCi1zdHJ1Y3QgY2xrX3NhbTl4NV9zbG93IHsKLQlzdHJ1Y3QgY2xrX2h3IGh3OwotCXZvaWQgX19pb21lbSAqc2NrY3I7Ci0JdTggcGFyZW50OwotfTsKLQotI2RlZmluZSB0b19jbGtfc2FtOXg1X3Nsb3coaHcpIGNvbnRhaW5lcl9vZihodywgc3RydWN0IGNsa19zYW05eDVfc2xvdywgaHcpCi0KLXN0YXRpYyBpbnQgY2xrX3Nsb3dfb3NjX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa19zbG93X29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfb3NjKGh3KTsKLQl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKLQl1MzIgdG1wID0gcmVhZGwoc2NrY3IpOwotCi0JaWYgKHRtcCAmIEFUOTFfU0NLQ19PU0MzMkJZUCkKLQkJcmV0dXJuIDA7Ci0KLQl3cml0ZWwodG1wIHwgQVQ5MV9TQ0tDX09TQzMyRU4sIHNja2NyKTsKLQotCXVzbGVlcF9yYW5nZShvc2MtPnN0YXJ0dXBfdXNlYywgb3NjLT5zdGFydHVwX3VzZWMgKyAxKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjbGtfc2xvd19vc2NfdW5wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBjbGtfc2xvd19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X29zYyhodyk7Ci0Jdm9pZCBfX2lvbWVtICpzY2tjciA9IG9zYy0+c2NrY3I7Ci0JdTMyIHRtcCA9IHJlYWRsKHNja2NyKTsKLQotCWlmICh0bXAgJiBBVDkxX1NDS0NfT1NDMzJCWVApCi0JCXJldHVybjsKLQotCXdyaXRlbCh0bXAgJiB+QVQ5MV9TQ0tDX09TQzMyRU4sIHNja2NyKTsKLX0KLQotc3RhdGljIGludCBjbGtfc2xvd19vc2NfaXNfcHJlcGFyZWQoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa19zbG93X29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfb3NjKGh3KTsKLQl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKLQl1MzIgdG1wID0gcmVhZGwoc2NrY3IpOwotCi0JaWYgKHRtcCAmIEFUOTFfU0NLQ19PU0MzMkJZUCkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gISEodG1wICYgQVQ5MV9TQ0tDX09TQzMyRU4pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc2xvd19vc2Nfb3BzID0gewotCS5wcmVwYXJlID0gY2xrX3Nsb3dfb3NjX3ByZXBhcmUsCi0JLnVucHJlcGFyZSA9IGNsa19zbG93X29zY191bnByZXBhcmUsCi0JLmlzX3ByZXBhcmVkID0gY2xrX3Nsb3dfb3NjX2lzX3ByZXBhcmVkLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKLWF0OTFfY2xrX3JlZ2lzdGVyX3Nsb3dfb3NjKHZvaWQgX19pb21lbSAqc2NrY3IsCi0JCQkgICBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsCi0JCQkgICB1bnNpZ25lZCBsb25nIHN0YXJ0dXAsCi0JCQkgICBib29sIGJ5cGFzcykKLXsKLQlzdHJ1Y3QgY2xrX3Nsb3dfb3NjICpvc2M7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKLQlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCi0JaWYgKCFzY2tjciB8fCAhbmFtZSB8fCAhcGFyZW50X25hbWUpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCi0Jb3NjID0ga3phbGxvYyhzaXplb2YoKm9zYyksIEdGUF9LRVJORUwpOwotCWlmICghb3NjKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCWluaXQubmFtZSA9IG5hbWU7Ci0JaW5pdC5vcHMgPSAmc2xvd19vc2Nfb3BzOwotCWluaXQucGFyZW50X25hbWVzID0gJnBhcmVudF9uYW1lOwotCWluaXQubnVtX3BhcmVudHMgPSAxOwotCWluaXQuZmxhZ3MgPSBDTEtfSUdOT1JFX1VOVVNFRDsKLQotCW9zYy0+aHcuaW5pdCA9ICZpbml0OwotCW9zYy0+c2NrY3IgPSBzY2tjcjsKLQlvc2MtPnN0YXJ0dXBfdXNlYyA9IHN0YXJ0dXA7Ci0KLQlpZiAoYnlwYXNzKQotCQl3cml0ZWwoKHJlYWRsKHNja2NyKSAmIH5BVDkxX1NDS0NfT1NDMzJFTikgfCBBVDkxX1NDS0NfT1NDMzJCWVAsCi0JCSAgICAgICBzY2tjcik7Ci0KLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJa2ZyZWUob3NjKTsKLQotCXJldHVybiBjbGs7Ci19Ci0KLXZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3Nsb3dfb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCSAgICAgdm9pZCBfX2lvbWVtICpzY2tjcikKLXsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JY29uc3QgY2hhciAqcGFyZW50X25hbWU7Ci0JY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwotCXUzMiBzdGFydHVwOwotCWJvb2wgYnlwYXNzOwotCi0JcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKTsKLQlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZuYW1lKTsKLQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImF0bWVsLHN0YXJ0dXAtdGltZS11c2VjIiwgJnN0YXJ0dXApOwotCWJ5cGFzcyA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImF0bWVsLG9zYy1ieXBhc3MiKTsKLQotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3Nsb3dfb3NjKHNja2NyLCBuYW1lLCBwYXJlbnRfbmFtZSwgc3RhcnR1cCwKLQkJCQkJIGJ5cGFzcyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm47Ci0KLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19zbG93X3JjX29zY19yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKLQkJCQkJCSB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQotewotCXN0cnVjdCBjbGtfc2xvd19yY19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X3JjX29zYyhodyk7Ci0KLQlyZXR1cm4gb3NjLT5mcmVxdWVuY3k7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNsa19zbG93X3JjX29zY19yZWNhbGNfYWNjdXJhY3koc3RydWN0IGNsa19odyAqaHcsCi0JCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcGFyZW50X2FjYykKLXsKLQlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2MgPSB0b19jbGtfc2xvd19yY19vc2MoaHcpOwotCi0JcmV0dXJuIG9zYy0+YWNjdXJhY3k7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrX3Nsb3dfcmNfb3NjX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKLQl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKLQotCXdyaXRlbChyZWFkbChzY2tjcikgfCBBVDkxX1NDS0NfUkNFTiwgc2NrY3IpOwotCi0JdXNsZWVwX3JhbmdlKG9zYy0+c3RhcnR1cF91c2VjLCBvc2MtPnN0YXJ0dXBfdXNlYyArIDEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsa19zbG93X3JjX29zY191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKLQl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKLQotCXdyaXRlbChyZWFkbChzY2tjcikgJiB+QVQ5MV9TQ0tDX1JDRU4sIHNja2NyKTsKLX0KLQotc3RhdGljIGludCBjbGtfc2xvd19yY19vc2NfaXNfcHJlcGFyZWQoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKLQotCXJldHVybiAhIShyZWFkbChvc2MtPnNja2NyKSAmIEFUOTFfU0NLQ19SQ0VOKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNsb3dfcmNfb3NjX29wcyA9IHsKLQkucHJlcGFyZSA9IGNsa19zbG93X3JjX29zY19wcmVwYXJlLAotCS51bnByZXBhcmUgPSBjbGtfc2xvd19yY19vc2NfdW5wcmVwYXJlLAotCS5pc19wcmVwYXJlZCA9IGNsa19zbG93X3JjX29zY19pc19wcmVwYXJlZCwKLQkucmVjYWxjX3JhdGUgPSBjbGtfc2xvd19yY19vc2NfcmVjYWxjX3JhdGUsCi0JLnJlY2FsY19hY2N1cmFjeSA9IGNsa19zbG93X3JjX29zY19yZWNhbGNfYWNjdXJhY3ksCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAotYXQ5MV9jbGtfcmVnaXN0ZXJfc2xvd19yY19vc2Modm9pZCBfX2lvbWVtICpzY2tjciwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGZyZXF1ZW5jeSwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWNjdXJhY3ksCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0dXApCi17Ci0Jc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7Ci0Jc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKLQotCWlmICghc2NrY3IgfHwgIW5hbWUpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCi0Jb3NjID0ga3phbGxvYyhzaXplb2YoKm9zYyksIEdGUF9LRVJORUwpOwotCWlmICghb3NjKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCWluaXQubmFtZSA9IG5hbWU7Ci0JaW5pdC5vcHMgPSAmc2xvd19yY19vc2Nfb3BzOwotCWluaXQucGFyZW50X25hbWVzID0gTlVMTDsKLQlpbml0Lm51bV9wYXJlbnRzID0gMDsKLQlpbml0LmZsYWdzID0gQ0xLX0lHTk9SRV9VTlVTRUQ7Ci0KLQlvc2MtPmh3LmluaXQgPSAmaW5pdDsKLQlvc2MtPnNja2NyID0gc2NrY3I7Ci0Jb3NjLT5mcmVxdWVuY3kgPSBmcmVxdWVuY3k7Ci0Jb3NjLT5hY2N1cmFjeSA9IGFjY3VyYWN5OwotCW9zYy0+c3RhcnR1cF91c2VjID0gc3RhcnR1cDsKLQotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmb3NjLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlrZnJlZShvc2MpOwotCi0JcmV0dXJuIGNsazsKLX0KLQotdm9pZCBfX2luaXQgb2ZfYXQ5MXNhbTl4NV9jbGtfc2xvd19yY19vc2Nfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJCXZvaWQgX19pb21lbSAqc2NrY3IpCi17Ci0Jc3RydWN0IGNsayAqY2xrOwotCXUzMiBmcmVxdWVuY3kgPSAwOwotCXUzMiBhY2N1cmFjeSA9IDA7Ci0JdTMyIHN0YXJ0dXAgPSAwOwotCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKLQotCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJm5hbWUpOwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgJmZyZXF1ZW5jeSk7Ci0Jb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1hY2N1cmFjeSIsICZhY2N1cmFjeSk7Ci0Jb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhdG1lbCxzdGFydHVwLXRpbWUtdXNlYyIsICZzdGFydHVwKTsKLQotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3Nsb3dfcmNfb3NjKHNja2NyLCBuYW1lLCBmcmVxdWVuY3ksIGFjY3VyYWN5LAotCQkJCQkgICAgc3RhcnR1cCk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm47Ci0KLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7Ci19Ci0KLXN0YXRpYyBpbnQgY2xrX3NhbTl4NV9zbG93X3NldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcsIHU4IGluZGV4KQotewotCXN0cnVjdCBjbGtfc2FtOXg1X3Nsb3cgKnNsb3djayA9IHRvX2Nsa19zYW05eDVfc2xvdyhodyk7Ci0Jdm9pZCBfX2lvbWVtICpzY2tjciA9IHNsb3djay0+c2NrY3I7Ci0JdTMyIHRtcDsKLQotCWlmIChpbmRleCA+IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdG1wID0gcmVhZGwoc2NrY3IpOwotCi0JaWYgKCghaW5kZXggJiYgISh0bXAgJiBBVDkxX1NDS0NfT1NDU0VMKSkgfHwKLQkgICAgKGluZGV4ICYmICh0bXAgJiBBVDkxX1NDS0NfT1NDU0VMKSkpCi0JCXJldHVybiAwOwotCi0JaWYgKGluZGV4KQotCQl0bXAgfD0gQVQ5MV9TQ0tDX09TQ1NFTDsKLQllbHNlCi0JCXRtcCAmPSB+QVQ5MV9TQ0tDX09TQ1NFTDsKLQotCXdyaXRlbCh0bXAsIHNja2NyKTsKLQotCXVzbGVlcF9yYW5nZShTTE9XQ0tfU1dfVElNRV9VU0VDLCBTTE9XQ0tfU1dfVElNRV9VU0VDICsgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHU4IGNsa19zYW05eDVfc2xvd19nZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3KQotewotCXN0cnVjdCBjbGtfc2FtOXg1X3Nsb3cgKnNsb3djayA9IHRvX2Nsa19zYW05eDVfc2xvdyhodyk7Ci0KLQlyZXR1cm4gISEocmVhZGwoc2xvd2NrLT5zY2tjcikgJiBBVDkxX1NDS0NfT1NDU0VMKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNhbTl4NV9zbG93X29wcyA9IHsKLQkuc2V0X3BhcmVudCA9IGNsa19zYW05eDVfc2xvd19zZXRfcGFyZW50LAotCS5nZXRfcGFyZW50ID0gY2xrX3NhbTl4NV9zbG93X2dldF9wYXJlbnQsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAotYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X3Nsb3codm9pZCBfX2lvbWVtICpzY2tjciwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgICBjb25zdCBjaGFyICoqcGFyZW50X25hbWVzLAotCQkJICAgICAgaW50IG51bV9wYXJlbnRzKQotewotCXN0cnVjdCBjbGtfc2FtOXg1X3Nsb3cgKnNsb3djazsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOwotCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0KLQlpZiAoIXNja2NyIHx8ICFuYW1lIHx8ICFwYXJlbnRfbmFtZXMgfHwgIW51bV9wYXJlbnRzKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQotCXNsb3djayA9IGt6YWxsb2Moc2l6ZW9mKCpzbG93Y2spLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNsb3djaykKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlpbml0Lm5hbWUgPSBuYW1lOwotCWluaXQub3BzID0gJnNhbTl4NV9zbG93X29wczsKLQlpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudF9uYW1lczsKLQlpbml0Lm51bV9wYXJlbnRzID0gbnVtX3BhcmVudHM7Ci0JaW5pdC5mbGFncyA9IDA7Ci0KLQlzbG93Y2stPmh3LmluaXQgPSAmaW5pdDsKLQlzbG93Y2stPnNja2NyID0gc2NrY3I7Ci0Jc2xvd2NrLT5wYXJlbnQgPSAhIShyZWFkbChzY2tjcikgJiBBVDkxX1NDS0NfT1NDU0VMKTsKLQotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmc2xvd2NrLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlrZnJlZShzbG93Y2spOwotCi0JcmV0dXJuIGNsazsKLX0KLQotdm9pZCBfX2luaXQgb2ZfYXQ5MXNhbTl4NV9jbGtfc2xvd19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCQkgdm9pZCBfX2lvbWVtICpzY2tjcikKLXsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JY29uc3QgY2hhciAqcGFyZW50X25hbWVzWzJdOwotCXVuc2lnbmVkIGludCBudW1fcGFyZW50czsKLQljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7Ci0KLQludW1fcGFyZW50cyA9IG9mX2Nsa19nZXRfcGFyZW50X2NvdW50KG5wKTsKLQlpZiAobnVtX3BhcmVudHMgPT0gMCB8fCBudW1fcGFyZW50cyA+IDIpCi0JCXJldHVybjsKLQotCW9mX2Nsa19wYXJlbnRfZmlsbChucCwgcGFyZW50X25hbWVzLCBudW1fcGFyZW50cyk7Ci0KLQlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZuYW1lKTsKLQotCWNsayA9IGF0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9zbG93KHNja2NyLCBuYW1lLCBwYXJlbnRfbmFtZXMsCi0JCQkJCSAgICBudW1fcGFyZW50cyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm47Ci0KLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7Ci19Ci0KIHN0YXRpYyB1OCBjbGtfc2FtOTI2MF9zbG93X2dldF9wYXJlbnQoc3RydWN0IGNsa19odyAqaHcpCiB7CiAJc3RydWN0IGNsa19zYW05MjYwX3Nsb3cgKnNsb3djayA9IHRvX2Nsa19zYW05MjYwX3Nsb3coaHcpOwpAQCAtMzkzLDE1ICs0MCwxNiBAQAogCS5nZXRfcGFyZW50ID0gY2xrX3NhbTkyNjBfc2xvd19nZXRfcGFyZW50LAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKiBfX2luaXQKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CiBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05MjYwX3Nsb3coc3RydWN0IHJlZ21hcCAqcmVnbWFwLAogCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywKIAkJCSAgICAgICBpbnQgbnVtX3BhcmVudHMpCiB7CiAJc3RydWN0IGNsa19zYW05MjYwX3Nsb3cgKnNsb3djazsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCWlmICghbmFtZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC00MjIsMTYgKzcwLDE5IEBACiAJc2xvd2NrLT5ody5pbml0ID0gJmluaXQ7CiAJc2xvd2NrLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnNsb3djay0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZzbG93Y2stPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmc2xvd2NrLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShzbG93Y2spOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05MjYwX2Nsa19zbG93X3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1syXTsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwpAQCAtNDQ4LDEyICs5OSwxMiBAQAogCiAJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmbmFtZSk7CiAKLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05MjYwX3Nsb3cocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zYW05MjYwX3Nsb3cocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCiAJCQkJCSAgICAgbnVtX3BhcmVudHMpOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiAKIENMS19PRl9ERUNMQVJFKGF0OTFzYW05MjYwX2Nsa19zbG93LCAiYXRtZWwsYXQ5MXNhbTkyNjAtY2xrLXNsb3ciLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstc21kLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zbWQuYwppbmRleCAzYzA0YjA2Li45NjVjNjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zbWQuYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zbWQuYwpAQCAtMTExLDEzICsxMTEsMTQgQEAKIAkuc2V0X3JhdGUgPSBhdDkxc2FtOXg1X2Nsa19zbWRfc2V0X3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFzYW05eDVfY2xrX3JlZ2lzdGVyX3NtZChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywgdTggbnVtX3BhcmVudHMpCiB7CiAJc3RydWN0IGF0OTFzYW05eDVfY2xrX3NtZCAqc21kOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJc21kID0ga3phbGxvYyhzaXplb2YoKnNtZCksIEdGUF9LRVJORUwpOwogCWlmICghc21kKQpAQCAtMTMyLDE2ICsxMzMsMTkgQEAKIAlzbWQtPmh3LmluaXQgPSAmaW5pdDsKIAlzbWQtPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmc21kLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gJnNtZC0+aHc7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZzbWQtPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKHNtZCk7CisJCWh3ID0gRVJSX1BUUihyZXQpOworCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuIGh3OwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgb2ZfYXQ5MXNhbTl4NV9jbGtfc21kX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXVuc2lnbmVkIGludCBudW1fcGFyZW50czsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbU01EX1NPVVJDRV9NQVhdOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBucC0+bmFtZTsKQEAgLTE1OSwxMiArMTYzLDEyIEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxc2FtOXg1X2Nsa19yZWdpc3Rlcl9zbWQocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCisJaHcgPSBhdDkxc2FtOXg1X2Nsa19yZWdpc3Rlcl9zbWQocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCiAJCQkJCSAgbnVtX3BhcmVudHMpOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcmV0dXJuOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiBDTEtfT0ZfREVDTEFSRShhdDkxc2FtOXg1X2Nsa19zbWQsICJhdG1lbCxhdDkxc2FtOXg1LWNsay1zbWQiLAogCSAgICAgICBvZl9hdDkxc2FtOXg1X2Nsa19zbWRfc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstc3lzdGVtLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zeXN0ZW0uYwppbmRleCA4ZjM1ZDgxLi44NmEzNjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zeXN0ZW0uYworKysgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay1zeXN0ZW0uYwpAQCAtODgsMTMgKzg4LDE0IEBACiAJLmlzX3ByZXBhcmVkID0gY2xrX3N5c3RlbV9pc19wcmVwYXJlZCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MV9jbGtfcmVnaXN0ZXJfc3lzdGVtKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwgdTggaWQpCiB7CiAJc3RydWN0IGNsa19zeXN0ZW0gKnN5czsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCWlmICghcGFyZW50X25hbWUgfHwgaWQgPiBTWVNURU1fTUFYX0lEKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTExMywxOCArMTE0LDIxIEBACiAJc3lzLT5ody5pbml0ID0gJmluaXQ7CiAJc3lzLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnN5cy0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZzeXMtPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmc3lzLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZShzeXMpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFybTkyMDBfY2xrX3N5c19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCWludCBudW07CiAJdTMyIGlkOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpuYW1lOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3lzY2xrbnA7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CkBAIC0xNDcsMTEgKzE1MSwxMSBAQAogCiAJCXBhcmVudF9uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShzeXNjbGtucCwgMCk7CiAKLQkJY2xrID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc3lzdGVtKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUsIGlkKTsKLQkJaWYgKElTX0VSUihjbGspKQorCQlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX3N5c3RlbShyZWdtYXAsIG5hbWUsIHBhcmVudF9uYW1lLCBpZCk7CisJCWlmIChJU19FUlIoaHcpKQogCQkJY29udGludWU7CiAKLQkJb2ZfY2xrX2FkZF9wcm92aWRlcihzeXNjbGtucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCQlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKHN5c2Nsa25wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogCX0KIH0KIENMS19PRl9ERUNMQVJFKGF0OTFybTkyMDBfY2xrX3N5cywgImF0bWVsLGF0OTFybTkyMDAtY2xrLXN5c3RlbSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay11c2IuYyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXVzYi5jCmluZGV4IGQ4MGJkYjAuLjc5MTc3MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXVzYi5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXVzYi5jCkBAIC0xOTIsMTMgKzE5MiwxNCBAQAogCS5zZXRfcmF0ZSA9IGF0OTFzYW05eDVfY2xrX3VzYl9zZXRfcmF0ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MXNhbTl4NV9jbGtfcmVnaXN0ZXJfdXNiKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICBjb25zdCBjaGFyICoqcGFyZW50X25hbWVzLCB1OCBudW1fcGFyZW50cykKIHsKIAlzdHJ1Y3QgYXQ5MXNhbTl4NV9jbGtfdXNiICp1c2I7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OworCWludCByZXQ7CiAKIAl1c2IgPSBremFsbG9jKHNpemVvZigqdXNiKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1c2IpCkBAIC0yMTQsMjAgKzIxNSwyNCBAQAogCXVzYi0+aHcuaW5pdCA9ICZpbml0OwogCXVzYi0+cmVnbWFwID0gcmVnbWFwOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZ1c2ItPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSAmdXNiLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnVzYi0+aHcpOworCWlmIChyZXQpIHsKIAkJa2ZyZWUodXNiKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQogCi0JcmV0dXJuIGNsazsKKwlyZXR1cm4gaHc7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICogX19pbml0CitzdGF0aWMgc3RydWN0IGNsa19odyAqIF9faW5pdAogYXQ5MXNhbTluMTJfY2xrX3JlZ2lzdGVyX3VzYihzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lKQogewogCXN0cnVjdCBhdDkxc2FtOXg1X2Nsa191c2IgKnVzYjsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKIAogCXVzYiA9IGt6YWxsb2Moc2l6ZW9mKCp1c2IpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVzYikKQEAgLTI0MiwxMSArMjQ3LDE0IEBACiAJdXNiLT5ody5pbml0ID0gJmluaXQ7CiAJdXNiLT5yZWdtYXAgPSByZWdtYXA7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnVzYi0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZ1c2ItPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmdXNiLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZSh1c2IpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYXQ5MXJtOTIwMF9jbGtfdXNiX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LApAQCAtMzM0LDEzICszNDIsMTQgQEAKIAkuc2V0X3JhdGUgPSBhdDkxcm05MjAwX2Nsa191c2Jfc2V0X3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFybTkyMDBfY2xrX3JlZ2lzdGVyX3VzYihzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIGNvbnN0IHUzMiAqZGl2aXNvcnMpCiB7CiAJc3RydWN0IGF0OTFybTkyMDBfY2xrX3VzYiAqdXNiOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJdXNiID0ga3phbGxvYyhzaXplb2YoKnVzYiksIEdGUF9LRVJORUwpOwogCWlmICghdXNiKQpAQCAtMzU2LDE2ICszNjUsMTkgQEAKIAl1c2ItPnJlZ21hcCA9IHJlZ21hcDsKIAltZW1jcHkodXNiLT5kaXZpc29ycywgZGl2aXNvcnMsIHNpemVvZih1c2ItPmRpdmlzb3JzKSk7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXIoTlVMTCwgJnVzYi0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZ1c2ItPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmdXNiLT5odyk7CisJaWYgKHJldCkgewogCQlrZnJlZSh1c2IpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3VzYl9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWVzW1VTQl9TT1VSQ0VfTUFYXTsKIAljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7CkBAIC0zODMsMTkgKzM5NSwxOSBAQAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuOwogCi0JY2xrID0gYXQ5MXNhbTl4NV9jbGtfcmVnaXN0ZXJfdXNiKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWVzLAotCQkJCQkgIG51bV9wYXJlbnRzKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBhdDkxc2FtOXg1X2Nsa19yZWdpc3Rlcl91c2IocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZXMsCisJCQkJCSBudW1fcGFyZW50cyk7CisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXNhbTl4NV9jbGtfdXNiLCAiYXRtZWwsYXQ5MXNhbTl4NS1jbGstdXNiIiwKIAkgICAgICAgb2ZfYXQ5MXNhbTl4NV9jbGtfdXNiX3NldHVwKTsKIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05bjEyX2Nsa191c2Jfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKQEAgLTQxMCwxOCArNDIyLDE4IEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxc2FtOW4xMl9jbGtfcmVnaXN0ZXJfdXNiKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGF0OTFzYW05bjEyX2Nsa19yZWdpc3Rlcl91c2IocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSk7CisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXNhbTluMTJfY2xrX3VzYiwgImF0bWVsLGF0OTFzYW05bjEyLWNsay11c2IiLAogCSAgICAgICBvZl9hdDkxc2FtOW4xMl9jbGtfdXNiX3NldHVwKTsKIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFybTkyMDBfY2xrX3VzYl9zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7CiAJdTMyIGRpdmlzb3JzWzRdID0gezAsIDAsIDAsIDB9OwpAQCAtNDQwLDEyICs0NTIsMTEgQEAKIAlyZWdtYXAgPSBzeXNjb25fbm9kZV90b19yZWdtYXAob2ZfZ2V0X3BhcmVudChucCkpOwogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuOwotCi0JY2xrID0gYXQ5MXJtOTIwMF9jbGtfcmVnaXN0ZXJfdXNiKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUsIGRpdmlzb3JzKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaHcgPSBhdDkxcm05MjAwX2Nsa19yZWdpc3Rlcl91c2IocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSwgZGl2aXNvcnMpOworCWlmIChJU19FUlIoaHcpKQogCQlyZXR1cm47CiAKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIH0KIENMS19PRl9ERUNMQVJFKGF0OTFybTkyMDBfY2xrX3VzYiwgImF0bWVsLGF0OTFybTkyMDAtY2xrLXVzYiIsCiAJICAgICAgIG9mX2F0OTFybTkyMDBfY2xrX3VzYl9zZXR1cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9hdDkxL2Nsay11dG1pLmMgYi9kcml2ZXJzL2Nsay9hdDkxL2Nsay11dG1pLmMKaW5kZXggNjFmY2YzOS4uYWFkYWJkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9jbGstdXRtaS5jCisrKyBiL2RyaXZlcnMvY2xrL2F0OTEvY2xrLXV0bWkuYwpAQCAtNzcsMTMgKzc3LDE0IEBACiAJLnJlY2FsY19yYXRlID0gY2xrX3V0bWlfcmVjYWxjX3JhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqIF9faW5pdAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKIGF0OTFfY2xrX3JlZ2lzdGVyX3V0bWkoc3RydWN0IHJlZ21hcCAqcmVnbWFwLAogCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGFyZW50X25hbWUpCiB7CiAJc3RydWN0IGNsa191dG1pICp1dG1pOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CisJc3RydWN0IGNsa19odyAqaHc7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJdXRtaSA9IGt6YWxsb2Moc2l6ZW9mKCp1dG1pKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1dG1pKQpAQCAtOTgsMTYgKzk5LDE5IEBACiAJdXRtaS0+aHcuaW5pdCA9ICZpbml0OwogCXV0bWktPnJlZ21hcCA9IHJlZ21hcDsKIAotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmdXRtaS0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9ICZ1dG1pLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnV0bWktPmh3KTsKKwlpZiAocmV0KSB7CiAJCWtmcmVlKHV0bWkpOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CiAKLQlyZXR1cm4gY2xrOworCXJldHVybiBodzsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3V0bWlfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKQEAgLTEyMCwxMSArMTI0LDExIEBACiAJaWYgKElTX0VSUihyZWdtYXApKQogCQlyZXR1cm47CiAKLQljbGsgPSBhdDkxX2Nsa19yZWdpc3Rlcl91dG1pKHJlZ21hcCwgbmFtZSwgcGFyZW50X25hbWUpOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX3V0bWkocmVnbWFwLCBuYW1lLCBwYXJlbnRfbmFtZSk7CisJaWYgKElTX0VSUihodykpCiAJCXJldHVybjsKIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogCXJldHVybjsKIH0KIENMS19PRl9ERUNMQVJFKGF0OTFzYW05eDVfY2xrX3V0bWksICJhdG1lbCxhdDkxc2FtOXg1LWNsay11dG1pIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvc2NrYy5jIGIvZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmMKaW5kZXggMTE4NGQ3Ni4uYWI2ZWNlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmMKKysrIGIvZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmMKQEAgLTEyLDExICsxMiwzODIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotI2luY2x1ZGUgInNja2MuaCIKKyNkZWZpbmUgU0xPV19DTE9DS19GUkVRCQkzMjc2OAorI2RlZmluZSBTTE9XQ0tfU1dfQ1lDTEVTCTUKKyNkZWZpbmUgU0xPV0NLX1NXX1RJTUVfVVNFQwkoKFNMT1dDS19TV19DWUNMRVMgKiBVU0VDX1BFUl9TRUMpIC8gXAorCQkJCSBTTE9XX0NMT0NLX0ZSRVEpCisKKyNkZWZpbmUJQVQ5MV9TQ0tDX0NSCQkJMHgwMAorI2RlZmluZQkJQVQ5MV9TQ0tDX1JDRU4JCSgxIDw8IDApCisjZGVmaW5lCQlBVDkxX1NDS0NfT1NDMzJFTgkoMSA8PCAxKQorI2RlZmluZQkJQVQ5MV9TQ0tDX09TQzMyQllQCSgxIDw8IDIpCisjZGVmaW5lCQlBVDkxX1NDS0NfT1NDU0VMCSgxIDw8IDMpCisKK3N0cnVjdCBjbGtfc2xvd19vc2MgeworCXN0cnVjdCBjbGtfaHcgaHc7CisJdm9pZCBfX2lvbWVtICpzY2tjcjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0dXBfdXNlYzsKK307CisKKyNkZWZpbmUgdG9fY2xrX3Nsb3dfb3NjKGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBjbGtfc2xvd19vc2MsIGh3KQorCitzdHJ1Y3QgY2xrX3NhbWE1ZDRfc2xvd19vc2MgeworCXN0cnVjdCBjbGtfaHcgaHc7CisJdm9pZCBfX2lvbWVtICpzY2tjcjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0dXBfdXNlYzsKKwlib29sIHByZXBhcmVkOworfTsKKworI2RlZmluZSB0b19jbGtfc2FtYTVkNF9zbG93X29zYyhodykgY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgY2xrX3NhbWE1ZDRfc2xvd19vc2MsIGh3KQorCitzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjIHsKKwlzdHJ1Y3QgY2xrX2h3IGh3OworCXZvaWQgX19pb21lbSAqc2NrY3I7CisJdW5zaWduZWQgbG9uZyBmcmVxdWVuY3k7CisJdW5zaWduZWQgbG9uZyBhY2N1cmFjeTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0dXBfdXNlYzsKK307CisKKyNkZWZpbmUgdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBjbGtfc2xvd19yY19vc2MsIGh3KQorCitzdHJ1Y3QgY2xrX3NhbTl4NV9zbG93IHsKKwlzdHJ1Y3QgY2xrX2h3IGh3OworCXZvaWQgX19pb21lbSAqc2NrY3I7CisJdTggcGFyZW50OworfTsKKworI2RlZmluZSB0b19jbGtfc2FtOXg1X3Nsb3coaHcpIGNvbnRhaW5lcl9vZihodywgc3RydWN0IGNsa19zYW05eDVfc2xvdywgaHcpCisKK3N0YXRpYyBpbnQgY2xrX3Nsb3dfb3NjX3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNsa19zbG93X29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfb3NjKGh3KTsKKwl2b2lkIF9faW9tZW0gKnNja2NyID0gb3NjLT5zY2tjcjsKKwl1MzIgdG1wID0gcmVhZGwoc2NrY3IpOworCisJaWYgKHRtcCAmIChBVDkxX1NDS0NfT1NDMzJCWVAgfCBBVDkxX1NDS0NfT1NDMzJFTikpCisJCXJldHVybiAwOworCisJd3JpdGVsKHRtcCB8IEFUOTFfU0NLQ19PU0MzMkVOLCBzY2tjcik7CisKKwl1c2xlZXBfcmFuZ2Uob3NjLT5zdGFydHVwX3VzZWMsIG9zYy0+c3RhcnR1cF91c2VjICsgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xrX3Nsb3dfb3NjX3VucHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfb3NjICpvc2MgPSB0b19jbGtfc2xvd19vc2MoaHcpOworCXZvaWQgX19pb21lbSAqc2NrY3IgPSBvc2MtPnNja2NyOworCXUzMiB0bXAgPSByZWFkbChzY2tjcik7CisKKwlpZiAodG1wICYgQVQ5MV9TQ0tDX09TQzMyQllQKQorCQlyZXR1cm47CisKKwl3cml0ZWwodG1wICYgfkFUOTFfU0NLQ19PU0MzMkVOLCBzY2tjcik7Cit9CisKK3N0YXRpYyBpbnQgY2xrX3Nsb3dfb3NjX2lzX3ByZXBhcmVkKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBjbGtfc2xvd19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X29zYyhodyk7CisJdm9pZCBfX2lvbWVtICpzY2tjciA9IG9zYy0+c2NrY3I7CisJdTMyIHRtcCA9IHJlYWRsKHNja2NyKTsKKworCWlmICh0bXAgJiBBVDkxX1NDS0NfT1NDMzJCWVApCisJCXJldHVybiAxOworCisJcmV0dXJuICEhKHRtcCAmIEFUOTFfU0NLQ19PU0MzMkVOKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNsb3dfb3NjX29wcyA9IHsKKwkucHJlcGFyZSA9IGNsa19zbG93X29zY19wcmVwYXJlLAorCS51bnByZXBhcmUgPSBjbGtfc2xvd19vc2NfdW5wcmVwYXJlLAorCS5pc19wcmVwYXJlZCA9IGNsa19zbG93X29zY19pc19wcmVwYXJlZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CithdDkxX2Nsa19yZWdpc3Rlcl9zbG93X29zYyh2b2lkIF9faW9tZW0gKnNja2NyLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLAorCQkJICAgdW5zaWduZWQgbG9uZyBzdGFydHVwLAorCQkJICAgYm9vbCBieXBhc3MpCit7CisJc3RydWN0IGNsa19zbG93X29zYyAqb3NjOworCXN0cnVjdCBjbGtfaHcgKmh3OworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJaW50IHJldDsKKworCWlmICghc2NrY3IgfHwgIW5hbWUgfHwgIXBhcmVudF9uYW1lKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCW9zYyA9IGt6YWxsb2Moc2l6ZW9mKCpvc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9zYykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpbml0Lm5hbWUgPSBuYW1lOworCWluaXQub3BzID0gJnNsb3dfb3NjX29wczsKKwlpbml0LnBhcmVudF9uYW1lcyA9ICZwYXJlbnRfbmFtZTsKKwlpbml0Lm51bV9wYXJlbnRzID0gMTsKKwlpbml0LmZsYWdzID0gQ0xLX0lHTk9SRV9VTlVTRUQ7CisKKwlvc2MtPmh3LmluaXQgPSAmaW5pdDsKKwlvc2MtPnNja2NyID0gc2NrY3I7CisJb3NjLT5zdGFydHVwX3VzZWMgPSBzdGFydHVwOworCisJaWYgKGJ5cGFzcykKKwkJd3JpdGVsKChyZWFkbChzY2tjcikgJiB+QVQ5MV9TQ0tDX09TQzMyRU4pIHwgQVQ5MV9TQ0tDX09TQzMyQllQLAorCQkgICAgICAgc2NrY3IpOworCisJaHcgPSAmb3NjLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUob3NjKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQorCisJcmV0dXJuIGh3OworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK29mX2F0OTFzYW05eDVfY2xrX3Nsb3dfb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHZvaWQgX19pb21lbSAqc2NrY3IpCit7CisJc3RydWN0IGNsa19odyAqaHc7CisJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CisJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOworCXUzMiBzdGFydHVwOworCWJvb2wgYnlwYXNzOworCisJcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIsICZuYW1lKTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImF0bWVsLHN0YXJ0dXAtdGltZS11c2VjIiwgJnN0YXJ0dXApOworCWJ5cGFzcyA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImF0bWVsLG9zYy1ieXBhc3MiKTsKKworCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2xvd19vc2Moc2NrY3IsIG5hbWUsIHBhcmVudF9uYW1lLCBzdGFydHVwLAorCQkJCQkgYnlwYXNzKTsKKwlpZiAoSVNfRVJSKGh3KSkKKwkJcmV0dXJuOworCisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX3Nsb3dfcmNfb3NjX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCQkJIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJc3RydWN0IGNsa19zbG93X3JjX29zYyAqb3NjID0gdG9fY2xrX3Nsb3dfcmNfb3NjKGh3KTsKKworCXJldHVybiBvc2MtPmZyZXF1ZW5jeTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2xrX3Nsb3dfcmNfb3NjX3JlY2FsY19hY2N1cmFjeShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfYWNjKQoreworCXN0cnVjdCBjbGtfc2xvd19yY19vc2MgKm9zYyA9IHRvX2Nsa19zbG93X3JjX29zYyhodyk7CisKKwlyZXR1cm4gb3NjLT5hY2N1cmFjeTsKK30KKworc3RhdGljIGludCBjbGtfc2xvd19yY19vc2NfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2MgPSB0b19jbGtfc2xvd19yY19vc2MoaHcpOworCXZvaWQgX19pb21lbSAqc2NrY3IgPSBvc2MtPnNja2NyOworCisJd3JpdGVsKHJlYWRsKHNja2NyKSB8IEFUOTFfU0NLQ19SQ0VOLCBzY2tjcik7CisKKwl1c2xlZXBfcmFuZ2Uob3NjLT5zdGFydHVwX3VzZWMsIG9zYy0+c3RhcnR1cF91c2VjICsgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xrX3Nsb3dfcmNfb3NjX3VucHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2MgPSB0b19jbGtfc2xvd19yY19vc2MoaHcpOworCXZvaWQgX19pb21lbSAqc2NrY3IgPSBvc2MtPnNja2NyOworCisJd3JpdGVsKHJlYWRsKHNja2NyKSAmIH5BVDkxX1NDS0NfUkNFTiwgc2NrY3IpOworfQorCitzdGF0aWMgaW50IGNsa19zbG93X3JjX29zY19pc19wcmVwYXJlZChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2MgPSB0b19jbGtfc2xvd19yY19vc2MoaHcpOworCisJcmV0dXJuICEhKHJlYWRsKG9zYy0+c2NrY3IpICYgQVQ5MV9TQ0tDX1JDRU4pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgc2xvd19yY19vc2Nfb3BzID0geworCS5wcmVwYXJlID0gY2xrX3Nsb3dfcmNfb3NjX3ByZXBhcmUsCisJLnVucHJlcGFyZSA9IGNsa19zbG93X3JjX29zY191bnByZXBhcmUsCisJLmlzX3ByZXBhcmVkID0gY2xrX3Nsb3dfcmNfb3NjX2lzX3ByZXBhcmVkLAorCS5yZWNhbGNfcmF0ZSA9IGNsa19zbG93X3JjX29zY19yZWNhbGNfcmF0ZSwKKwkucmVjYWxjX2FjY3VyYWN5ID0gY2xrX3Nsb3dfcmNfb3NjX3JlY2FsY19hY2N1cmFjeSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICogX19pbml0CithdDkxX2Nsa19yZWdpc3Rlcl9zbG93X3JjX29zYyh2b2lkIF9faW9tZW0gKnNja2NyLAorCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZnJlcXVlbmN5LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhY2N1cmFjeSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnR1cCkKK3sKKwlzdHJ1Y3QgY2xrX3Nsb3dfcmNfb3NjICpvc2M7CisJc3RydWN0IGNsa19odyAqaHc7CisJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OworCisJaWYgKCFzY2tjciB8fCAhbmFtZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlvc2MgPSBremFsbG9jKHNpemVvZigqb3NjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvc2MpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdC5uYW1lID0gbmFtZTsKKwlpbml0Lm9wcyA9ICZzbG93X3JjX29zY19vcHM7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSBOVUxMOworCWluaXQubnVtX3BhcmVudHMgPSAwOworCWluaXQuZmxhZ3MgPSBDTEtfSUdOT1JFX1VOVVNFRDsKKworCW9zYy0+aHcuaW5pdCA9ICZpbml0OworCW9zYy0+c2NrY3IgPSBzY2tjcjsKKwlvc2MtPmZyZXF1ZW5jeSA9IGZyZXF1ZW5jeTsKKwlvc2MtPmFjY3VyYWN5ID0gYWNjdXJhY3k7CisJb3NjLT5zdGFydHVwX3VzZWMgPSBzdGFydHVwOworCisJaHcgPSAmb3NjLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUob3NjKTsKKwkJaHcgPSBFUlJfUFRSKHJldCk7CisJfQorCisJcmV0dXJuIGh3OworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK29mX2F0OTFzYW05eDVfY2xrX3Nsb3dfcmNfb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHZvaWQgX19pb21lbSAqc2NrY3IpCit7CisJc3RydWN0IGNsa19odyAqaHc7CisJdTMyIGZyZXF1ZW5jeSA9IDA7CisJdTMyIGFjY3VyYWN5ID0gMDsKKwl1MzIgc3RhcnR1cCA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOworCisJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmbmFtZSk7CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjbG9jay1mcmVxdWVuY3kiLCAmZnJlcXVlbmN5KTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNsb2NrLWFjY3VyYWN5IiwgJmFjY3VyYWN5KTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImF0bWVsLHN0YXJ0dXAtdGltZS11c2VjIiwgJnN0YXJ0dXApOworCisJaHcgPSBhdDkxX2Nsa19yZWdpc3Rlcl9zbG93X3JjX29zYyhzY2tjciwgbmFtZSwgZnJlcXVlbmN5LCBhY2N1cmFjeSwKKwkJCQkJICAgIHN0YXJ0dXApOworCWlmIChJU19FUlIoaHcpKQorCQlyZXR1cm47CisKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOworfQorCitzdGF0aWMgaW50IGNsa19zYW05eDVfc2xvd19zZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3LCB1OCBpbmRleCkKK3sKKwlzdHJ1Y3QgY2xrX3NhbTl4NV9zbG93ICpzbG93Y2sgPSB0b19jbGtfc2FtOXg1X3Nsb3coaHcpOworCXZvaWQgX19pb21lbSAqc2NrY3IgPSBzbG93Y2stPnNja2NyOworCXUzMiB0bXA7CisKKwlpZiAoaW5kZXggPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRtcCA9IHJlYWRsKHNja2NyKTsKKworCWlmICgoIWluZGV4ICYmICEodG1wICYgQVQ5MV9TQ0tDX09TQ1NFTCkpIHx8CisJICAgIChpbmRleCAmJiAodG1wICYgQVQ5MV9TQ0tDX09TQ1NFTCkpKQorCQlyZXR1cm4gMDsKKworCWlmIChpbmRleCkKKwkJdG1wIHw9IEFUOTFfU0NLQ19PU0NTRUw7CisJZWxzZQorCQl0bXAgJj0gfkFUOTFfU0NLQ19PU0NTRUw7CisKKwl3cml0ZWwodG1wLCBzY2tjcik7CisKKwl1c2xlZXBfcmFuZ2UoU0xPV0NLX1NXX1RJTUVfVVNFQywgU0xPV0NLX1NXX1RJTUVfVVNFQyArIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1OCBjbGtfc2FtOXg1X3Nsb3dfZ2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3NhbTl4NV9zbG93ICpzbG93Y2sgPSB0b19jbGtfc2FtOXg1X3Nsb3coaHcpOworCisJcmV0dXJuICEhKHJlYWRsKHNsb3djay0+c2NrY3IpICYgQVQ5MV9TQ0tDX09TQ1NFTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBzYW05eDVfc2xvd19vcHMgPSB7CisJLnNldF9wYXJlbnQgPSBjbGtfc2FtOXg1X3Nsb3dfc2V0X3BhcmVudCwKKwkuZ2V0X3BhcmVudCA9IGNsa19zYW05eDVfc2xvd19nZXRfcGFyZW50LAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfaHcgKiBfX2luaXQKK2F0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9zbG93KHZvaWQgX19pb21lbSAqc2NrY3IsCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywKKwkJCSAgICAgIGludCBudW1fcGFyZW50cykKK3sKKwlzdHJ1Y3QgY2xrX3NhbTl4NV9zbG93ICpzbG93Y2s7CisJc3RydWN0IGNsa19odyAqaHc7CisJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OworCisJaWYgKCFzY2tjciB8fCAhbmFtZSB8fCAhcGFyZW50X25hbWVzIHx8ICFudW1fcGFyZW50cykKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlzbG93Y2sgPSBremFsbG9jKHNpemVvZigqc2xvd2NrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbG93Y2spCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdC5uYW1lID0gbmFtZTsKKwlpbml0Lm9wcyA9ICZzYW05eDVfc2xvd19vcHM7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSBwYXJlbnRfbmFtZXM7CisJaW5pdC5udW1fcGFyZW50cyA9IG51bV9wYXJlbnRzOworCWluaXQuZmxhZ3MgPSAwOworCisJc2xvd2NrLT5ody5pbml0ID0gJmluaXQ7CisJc2xvd2NrLT5zY2tjciA9IHNja2NyOworCXNsb3djay0+cGFyZW50ID0gISEocmVhZGwoc2NrY3IpICYgQVQ5MV9TQ0tDX09TQ1NFTCk7CisKKwlodyA9ICZzbG93Y2stPmh3OworCXJldCA9IGNsa19od19yZWdpc3RlcihOVUxMLCAmc2xvd2NrLT5odyk7CisJaWYgKHJldCkgeworCQlrZnJlZShzbG93Y2spOworCQlodyA9IEVSUl9QVFIocmV0KTsKKwl9CisKKwlyZXR1cm4gaHc7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorb2ZfYXQ5MXNhbTl4NV9jbGtfc2xvd19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCB2b2lkIF9faW9tZW0gKnNja2NyKQoreworCXN0cnVjdCBjbGtfaHcgKmh3OworCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1syXTsKKwl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7CisJY29uc3QgY2hhciAqbmFtZSA9IG5wLT5uYW1lOworCisJbnVtX3BhcmVudHMgPSBvZl9jbGtfZ2V0X3BhcmVudF9jb3VudChucCk7CisJaWYgKG51bV9wYXJlbnRzID09IDAgfHwgbnVtX3BhcmVudHMgPiAyKQorCQlyZXR1cm47CisKKwlvZl9jbGtfcGFyZW50X2ZpbGwobnAsIHBhcmVudF9uYW1lcywgbnVtX3BhcmVudHMpOworCisJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmbmFtZSk7CisKKwlodyA9IGF0OTFfY2xrX3JlZ2lzdGVyX3NhbTl4NV9zbG93KHNja2NyLCBuYW1lLCBwYXJlbnRfbmFtZXMsCisJCQkJCSAgICBudW1fcGFyZW50cyk7CisJaWYgKElTX0VSUihodykpCisJCXJldHVybjsKKworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7Cit9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNja2NfY2xrX2lkc1tdIF9faW5pdGNvbnN0ID0gewogCS8qIFNsb3cgY2xvY2sgKi8KQEAgLTU1LDMgKzQyNiw5NCBAQAogfQogQ0xLX09GX0RFQ0xBUkUoYXQ5MXNhbTl4NV9jbGtfc2NrYywgImF0bWVsLGF0OTFzYW05eDUtc2NrYyIsCiAJICAgICAgIG9mX2F0OTFzYW05eDVfc2NrY19zZXR1cCk7CisKK3N0YXRpYyBpbnQgY2xrX3NhbWE1ZDRfc2xvd19vc2NfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgY2xrX3NhbWE1ZDRfc2xvd19vc2MgKm9zYyA9IHRvX2Nsa19zYW1hNWQ0X3Nsb3dfb3NjKGh3KTsKKworCWlmIChvc2MtPnByZXBhcmVkKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQXNzdW1lIHRoYXQgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBzZWxlY3RlZCAoZm9yIGV4YW1wbGUgYnkgdGhlCisJICogYm9vdGxvYWRlciksIGVub3VnaCB0aW1lIGhhcyBhcmVhZHkgcGFzc2VkLgorCSAqLworCWlmICgocmVhZGwob3NjLT5zY2tjcikgJiBBVDkxX1NDS0NfT1NDU0VMKSkgeworCQlvc2MtPnByZXBhcmVkID0gdHJ1ZTsKKwkJcmV0dXJuIDA7CisJfQorCisJdXNsZWVwX3JhbmdlKG9zYy0+c3RhcnR1cF91c2VjLCBvc2MtPnN0YXJ0dXBfdXNlYyArIDEpOworCW9zYy0+cHJlcGFyZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xrX3NhbWE1ZDRfc2xvd19vc2NfaXNfcHJlcGFyZWQoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGNsa19zYW1hNWQ0X3Nsb3dfb3NjICpvc2MgPSB0b19jbGtfc2FtYTVkNF9zbG93X29zYyhodyk7CisKKwlyZXR1cm4gb3NjLT5wcmVwYXJlZDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHNhbWE1ZDRfc2xvd19vc2Nfb3BzID0geworCS5wcmVwYXJlID0gY2xrX3NhbWE1ZDRfc2xvd19vc2NfcHJlcGFyZSwKKwkuaXNfcHJlcGFyZWQgPSBjbGtfc2FtYTVkNF9zbG93X29zY19pc19wcmVwYXJlZCwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBvZl9zYW1hNWQ0X3Nja2Nfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJc3RydWN0IGNsa19odyAqaHc7CisJc3RydWN0IGNsa19zYW1hNWQ0X3Nsb3dfb3NjICpvc2M7CisJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwljb25zdCBjaGFyICp4dGFsX25hbWU7CisJY29uc3QgY2hhciAqcGFyZW50X25hbWVzWzJdID0geyAic2xvd19yY19vc2MiLCAic2xvd19vc2MiIH07CisJYm9vbCBieXBhc3M7CisJaW50IHJldDsKKworCWlmICghcmVnYmFzZSkKKwkJcmV0dXJuOworCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZV93aXRoX2FjY3VyYWN5KE5VTEwsIHBhcmVudF9uYW1lc1swXSwKKwkJCQkJCSAgICAgIE5VTEwsIDAsIDMyNzY4LAorCQkJCQkJICAgICAgMjUwMDAwMDAwKTsKKwlpZiAoSVNfRVJSKGh3KSkKKwkJcmV0dXJuOworCisJeHRhbF9uYW1lID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgMCk7CisKKwlieXBhc3MgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJhdG1lbCxvc2MtYnlwYXNzIik7CisKKwlvc2MgPSBremFsbG9jKHNpemVvZigqb3NjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvc2MpCisJCXJldHVybjsKKworCWluaXQubmFtZSA9IHBhcmVudF9uYW1lc1sxXTsKKwlpbml0Lm9wcyA9ICZzYW1hNWQ0X3Nsb3dfb3NjX29wczsKKwlpbml0LnBhcmVudF9uYW1lcyA9ICZ4dGFsX25hbWU7CisJaW5pdC5udW1fcGFyZW50cyA9IDE7CisJaW5pdC5mbGFncyA9IENMS19JR05PUkVfVU5VU0VEOworCisJb3NjLT5ody5pbml0ID0gJmluaXQ7CisJb3NjLT5zY2tjciA9IHJlZ2Jhc2U7CisJb3NjLT5zdGFydHVwX3VzZWMgPSAxMjAwMDAwOworCisJaWYgKGJ5cGFzcykKKwkJd3JpdGVsKChyZWFkbChyZWdiYXNlKSB8IEFUOTFfU0NLQ19PU0MzMkJZUCksIHJlZ2Jhc2UpOworCisJaHcgPSAmb3NjLT5odzsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJm9zYy0+aHcpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUob3NjKTsKKwkJcmV0dXJuOworCX0KKworCWh3ID0gYXQ5MV9jbGtfcmVnaXN0ZXJfc2FtOXg1X3Nsb3cocmVnYmFzZSwgInNsb3djayIsIHBhcmVudF9uYW1lcywgMik7CisJaWYgKElTX0VSUihodykpCisJCXJldHVybjsKKworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7Cit9CitDTEtfT0ZfREVDTEFSRShzYW1hNWQ0X2Nsa19zY2tjLCAiYXRtZWwsc2FtYTVkNC1zY2tjIiwKKwkgICAgICAgb2Zfc2FtYTVkNF9zY2tjX3NldHVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2F0OTEvc2NrYy5oIGIvZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNmZjZjUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogZHJpdmVycy9jbGsvYXQ5MS9zY2tjLmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEzIEJvcmlzIEJSRVpJTExPTiA8Yi5icmV6aWxsb25Ab3Zlcmtpei5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9fQVQ5MV9TQ0tDX0hfCi0jZGVmaW5lIF9fQVQ5MV9TQ0tDX0hfCi0KLWV4dGVybiB2b2lkIF9faW5pdCBvZl9hdDkxc2FtOXg1X2Nsa19zbG93X29zY19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCQkJICAgIHZvaWQgX19pb21lbSAqc2NrY3IpOwotZXh0ZXJuIHZvaWQgX19pbml0IG9mX2F0OTFzYW05eDVfY2xrX3Nsb3dfcmNfb3NjX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCQkgICAgICAgdm9pZCBfX2lvbWVtICpzY2tjcik7Ci1leHRlcm4gdm9pZCBfX2luaXQgb2ZfYXQ5MXNhbTl4NV9jbGtfc2xvd19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCQkJdm9pZCBfX2lvbWVtICpzY2tjcik7Ci0KLSNlbmRpZiAvKiBfX0FUOTFfU0NLQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYXhpcy9jbGstYXJ0cGVjNi5jIGIvZHJpdmVycy9jbGsvYXhpcy9jbGstYXJ0cGVjNi5jCmluZGV4IGZmYzk4OGIuLmRhMWEwNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2F4aXMvY2xrLWFydHBlYzYuYworKysgYi9kcml2ZXJzL2Nsay9heGlzL2Nsay1hcnRwZWM2LmMKQEAgLTExMyw4ICsxMTMsOCBAQAogCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsICZjbGtkYXRhLT5jbGtfZGF0YSk7CiB9CiAKLUNMS19PRl9ERUNMQVJFKGFydHBlYzZfY2xrY3RybCwgImF4aXMsYXJ0cGVjNi1jbGtjdHJsIiwKLQkgICAgICAgb2ZfYXJ0cGVjNl9jbGtjdHJsX3NldHVwKTsKK0NMS19PRl9ERUNMQVJFX0RSSVZFUihhcnRwZWM2X2Nsa2N0cmwsICJheGlzLGFydHBlYzYtY2xrY3RybCIsCisJCSAgICAgIG9mX2FydHBlYzZfY2xrY3RybF9zZXR1cCk7CiAKIHN0YXRpYyBpbnQgYXJ0cGVjNl9jbGtjdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iY20vS2NvbmZpZyBiL2RyaXZlcnMvY2xrL2JjbS9LY29uZmlnCmluZGV4IGYyODc4NDUuLmYyMWU5YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2JjbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2xrL2JjbS9LY29uZmlnCkBAIC0xOSw4ICsxOSwzNiBAQAogCSAgaW4gdGhlIEJDTTI4MXh4IGFuZCBCQ00yMTY2NCBmYW1pbGllcy4KIAogY29uZmlnIENPTU1PTl9DTEtfSVBST0MKLQlib29sCisJYm9vbCAiQnJvYWRjb20gaVByb2MgY2xvY2sgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfQkNNX0lQUk9DIHx8IENPTVBJTEVfVEVTVAogCWRlcGVuZHMgb24gQ09NTU9OX0NMSworCWRlZmF1bHQgQVJDSF9CQ01fSVBST0MKIAloZWxwCiAJICBFbmFibGUgY29tbW9uIGNsb2NrIGZyYW1ld29yayBzdXBwb3J0IGZvciBCcm9hZGNvbSBTb0NzCiAJICBiYXNlZCBvbiB0aGUgaVByb2MgYXJjaGl0ZWN0dXJlCisKK2lmIENPTU1PTl9DTEtfSVBST0MKKworY29uZmlnIENMS19CQ01fQ1lHTlVTCisJYm9vbCAiQnJvYWRjb20gQ3lnbnVzIGNsb2NrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0JDTV9DWUdOVVMgfHwgQ09NUElMRV9URVNUCisJZGVmYXVsdCBBUkNIX0JDTV9DWUdOVVMKKwloZWxwCisJICBFbmFibGUgY29tbW9uIGNsb2NrIGZyYW1ld29yayBzdXBwb3J0IGZvciB0aGUgQnJvYWRjb20gQ3lnbnVzIFNvQworCitjb25maWcgQ0xLX0JDTV9OU1AKKwlib29sICJCcm9hZGNvbSBOb3J0aHN0YXIvTm9ydGhzdGFyIFBsdXMgY2xvY2sgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfQkNNXzUzMDFYIHx8IEFSQ0hfQkNNX05TUCB8fCBDT01QSUxFX1RFU1QKKwlkZWZhdWx0IEFSQ0hfQkNNXzUzMDFYIHx8IEFSQ0hfQkNNX05TUAorCWhlbHAKKwkgIEVuYWJsZSBjb21tb24gY2xvY2sgZnJhbWV3b3JrIHN1cHBvcnQgZm9yIHRoZSBCcm9hZGNvbSBOb3J0aHN0YXIgYW5kCisJICBOb3J0aHN0YXIgUGx1cyBTb0NzCisKK2NvbmZpZyBDTEtfQkNNX05TMgorCWJvb2wgIkJyb2FkY29tIE5vcnRoc3RhciAyIGNsb2NrIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0JDTV9JUFJPQyB8fCBDT01QSUxFX1RFU1QKKwlkZWZhdWx0IEFSQ0hfQkNNX0lQUk9DCisJaGVscAorCSAgRW5hYmxlIGNvbW1vbiBjbG9jayBmcmFtZXdvcmsgc3VwcG9ydCBmb3IgdGhlIEJyb2FkY29tIE5vcnRoc3RhciAyIFNvQworCitlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmNtL01ha2VmaWxlIGIvZHJpdmVycy9jbGsvYmNtL01ha2VmaWxlCmluZGV4IDFkNzliZDIuLmQ5ZGM4NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2JjbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Nsay9iY20vTWFrZWZpbGUKQEAgLTYsNyArNiw3IEBACiBvYmotJChDT05GSUdfQ09NTU9OX0NMS19JUFJPQykJKz0gY2xrLWlwcm9jLWFybXBsbC5vIGNsay1pcHJvYy1wbGwubyBjbGstaXByb2MtYXNpdS5vCiBvYmotJChDT05GSUdfQVJDSF9CQ00yODM1KQkrPSBjbGstYmNtMjgzNS5vCiBvYmotJChDT05GSUdfQVJDSF9CQ00yODM1KQkrPSBjbGstYmNtMjgzNS1hdXgubwotb2JqLSQoQ09ORklHX0NPTU1PTl9DTEtfSVBST0MpCSs9IGNsay1uczIubwotb2JqLSQoQ09ORklHX0FSQ0hfQkNNX0NZR05VUykJKz0gY2xrLWN5Z251cy5vCi1vYmotJChDT05GSUdfQVJDSF9CQ01fTlNQKQkrPSBjbGstbnNwLm8KLW9iai0kKENPTkZJR19BUkNIX0JDTV81MzAxWCkJKz0gY2xrLW5zcC5vCitvYmotJChDT05GSUdfQVJDSF9CQ01fNTM1NzMpCSs9IGNsay1iY201MzU3My1pbHAubworb2JqLSQoQ09ORklHX0NMS19CQ01fQ1lHTlVTKQkrPSBjbGstY3lnbnVzLm8KK29iai0kKENPTkZJR19DTEtfQkNNX05TUCkJKz0gY2xrLW5zcC5vCitvYmotJChDT05GSUdfQ0xLX0JDTV9OUzIpCSs9IGNsay1uczIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmNtL2Nsay1iY20yODM1LWF1eC5jIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1iY20yODM1LWF1eC5jCmluZGV4IDNhMTc3YWQuLmJkNzUwY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2JjbS9jbGstYmNtMjgzNS1hdXguYworKysgYi9kcml2ZXJzL2Nsay9iY20vY2xrLWJjbTI4MzUtYXV4LmMKQEAgLTI1LDcgKzI1LDcgQEAKIHN0YXRpYyBpbnQgYmNtMjgzNV9hdXhfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSAqb25lY2VsbDsKKwlzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSAqb25lY2VsbDsKIAljb25zdCBjaGFyICpwYXJlbnQ7CiAJc3RydWN0IGNsayAqcGFyZW50X2NsazsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTQxLDI4ICs0MSwyNCBAQAogCWlmIChJU19FUlIocmVnKSkKIAkJcmV0dXJuIFBUUl9FUlIocmVnKTsKIAotCW9uZWNlbGwgPSBkZXZtX2ttYWxsb2MoZGV2LCBzaXplb2YoKm9uZWNlbGwpLCBHRlBfS0VSTkVMKTsKKwlvbmVjZWxsID0gZGV2bV9rbWFsbG9jKGRldiwgc2l6ZW9mKCpvbmVjZWxsKSArIHNpemVvZigqb25lY2VsbC0+aHdzKSAqCisJCQkgICAgICAgQkNNMjgzNV9BVVhfQ0xPQ0tfQ09VTlQsIEdGUF9LRVJORUwpOwogCWlmICghb25lY2VsbCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0Jb25lY2VsbC0+Y2xrX251bSA9IEJDTTI4MzVfQVVYX0NMT0NLX0NPVU5UOwotCW9uZWNlbGwtPmNsa3MgPSBkZXZtX2tjYWxsb2MoZGV2LCBCQ00yODM1X0FVWF9DTE9DS19DT1VOVCwKLQkJCQkgICAgIHNpemVvZigqb25lY2VsbC0+Y2xrcyksIEdGUF9LRVJORUwpOwotCWlmICghb25lY2VsbC0+Y2xrcykKLQkJcmV0dXJuIC1FTk9NRU07CisJb25lY2VsbC0+bnVtID0gQkNNMjgzNV9BVVhfQ0xPQ0tfQ09VTlQ7CiAKIAlnYXRlID0gcmVnICsgQkNNMjgzNV9BVVhFTkI7Ci0Jb25lY2VsbC0+Y2xrc1tCQ00yODM1X0FVWF9DTE9DS19VQVJUXSA9Ci0JCWNsa19yZWdpc3Rlcl9nYXRlKGRldiwgImF1eF91YXJ0IiwgcGFyZW50LCAwLCBnYXRlLCAwLCAwLCBOVUxMKTsKKwlvbmVjZWxsLT5od3NbQkNNMjgzNV9BVVhfQ0xPQ0tfVUFSVF0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZ2F0ZShkZXYsICJhdXhfdWFydCIsIHBhcmVudCwgMCwgZ2F0ZSwgMCwgMCwgTlVMTCk7CiAKLQlvbmVjZWxsLT5jbGtzW0JDTTI4MzVfQVVYX0NMT0NLX1NQSTFdID0KLQkJY2xrX3JlZ2lzdGVyX2dhdGUoZGV2LCAiYXV4X3NwaTEiLCBwYXJlbnQsIDAsIGdhdGUsIDEsIDAsIE5VTEwpOworCW9uZWNlbGwtPmh3c1tCQ00yODM1X0FVWF9DTE9DS19TUEkxXSA9CisJCWNsa19od19yZWdpc3Rlcl9nYXRlKGRldiwgImF1eF9zcGkxIiwgcGFyZW50LCAwLCBnYXRlLCAxLCAwLCBOVUxMKTsKIAotCW9uZWNlbGwtPmNsa3NbQkNNMjgzNV9BVVhfQ0xPQ0tfU1BJMl0gPQotCQljbGtfcmVnaXN0ZXJfZ2F0ZShkZXYsICJhdXhfc3BpMiIsIHBhcmVudCwgMCwgZ2F0ZSwgMiwgMCwgTlVMTCk7CisJb25lY2VsbC0+aHdzW0JDTTI4MzVfQVVYX0NMT0NLX1NQSTJdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2dhdGUoZGV2LCAiYXV4X3NwaTIiLCBwYXJlbnQsIDAsIGdhdGUsIDIsIDAsIE5VTEwpOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihwZGV2LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgb25lY2VsbCk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihwZGV2LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LAorCQkJCSAgICAgIG9uZWNlbGwpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY20yODM1X2F1eF9jbGtfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2JjbS9jbGstYmNtMjgzNS5jIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1iY20yODM1LmMKaW5kZXggN2E3OTcwOC4uYjY4YmY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmNtL2Nsay1iY20yODM1LmMKKysrIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1iY20yODM1LmMKQEAgLTM2LDYgKzM2LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay9iY20yODM1Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzAyLDggKzMwMyw4IEBACiAJc3BpbmxvY2tfdCByZWdzX2xvY2s7IC8qIHNwaW5sb2NrIGZvciBhbGwgY2xvY2tzICovCiAJY29uc3QgY2hhciAqb3NjX25hbWU7CiAKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBvbmVjZWxsOwotCXN0cnVjdCBjbGsgKmNsa3NbXTsKKwkvKiBNdXN0IGJlIGxhc3QgKi8KKwlzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSBvbmVjZWxsOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGNwcm1hbl93cml0ZShzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gKmNwcm1hbiwgdTMyIHJlZywgdTMyIHZhbCkKQEAgLTM0NCwyNCArMzQ1LDI0IEBACiAgKi8KIHZvaWQgX19pbml0IGJjbTI4MzVfaW5pdF9jbG9ja3Modm9pZCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CiAJaW50IHJldDsKIAotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJhcGJfcGNsayIsIE5VTEwsIDAsIDEyNjAwMDAwMCk7Ci0JaWYgKElTX0VSUihjbGspKQorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImFwYl9wY2xrIiwgTlVMTCwgMCwgMTI2MDAwMDAwKTsKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcHJfZXJyKCJhcGJfcGNsayBub3QgcmVnaXN0ZXJlZFxuIik7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAidWFydDBfcGNsayIsIE5VTEwsIDAsIDMwMDAwMDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJ1YXJ0MF9wY2xrIiwgTlVMTCwgMCwgMzAwMDAwMCk7CisJaWYgKElTX0VSUihodykpCiAJCXByX2VycigidWFydDBfcGNsayBub3QgcmVnaXN0ZXJlZFxuIik7Ci0JcmV0ID0gY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssIE5VTEwsICIyMDIwMTAwMC51YXJ0Iik7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgTlVMTCwgIjIwMjAxMDAwLnVhcnQiKTsKIAlpZiAocmV0KQogCQlwcl9lcnIoInVhcnQwX3BjbGsgYWxpYXMgbm90IHJlZ2lzdGVyZWRcbiIpOwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgInVhcnQxX3BjbGsiLCBOVUxMLCAwLCAxMjUwMDAwMDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJ1YXJ0MV9wY2xrIiwgTlVMTCwgMCwgMTI1MDAwMDAwKTsKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcHJfZXJyKCJ1YXJ0MV9wY2xrIG5vdCByZWdpc3RlcmVkXG4iKTsKLQlyZXQgPSBjbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgTlVMTCwgIjIwMjE1MDAwLnVhcnQiKTsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCBOVUxMLCAiMjAyMTUwMDAudWFydCIpOwogCWlmIChyZXQpCiAJCXByX2VycigidWFydDFfcGNsayBhbGlhcyBub3QgcmVnaXN0ZXJlZFxuIik7CiB9CkBAIC00NDMsNiArNDQ0LDggQEAKIAkvKiBOdW1iZXIgb2YgZnJhY3Rpb25hbCBiaXRzIGluIHRoZSBkaXZpZGVyICovCiAJdTMyIGZyYWNfYml0czsKIAorCXUzMiBmbGFnczsKKwogCWJvb2wgaXNfdnB1X2Nsb2NrOwogCWJvb2wgaXNfbWFzaF9jbG9jazsKIH07CkBAIC0xMDA2LDE2ICsxMDA5LDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBib29sCitiY20yODM1X2Nsa19pc19wbGxjKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCWlmICghaHcpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiBzdHJuY21wKGNsa19od19nZXRfbmFtZShodyksICJwbGxjIiwgNCkgPT0gMDsKK30KKwogc3RhdGljIGludCBiY20yODM1X2Nsb2NrX2RldGVybWluZV9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAogCQkJCQlzdHJ1Y3QgY2xrX3JhdGVfcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCBiY20yODM1X2Nsb2NrICpjbG9jayA9IGJjbTI4MzVfY2xvY2tfZnJvbV9odyhodyk7CiAJc3RydWN0IGNsa19odyAqcGFyZW50LCAqYmVzdF9wYXJlbnQgPSBOVUxMOworCWJvb2wgY3VycmVudF9wYXJlbnRfaXNfcGxsYzsKIAl1bnNpZ25lZCBsb25nIHJhdGUsIGJlc3RfcmF0ZSA9IDA7CiAJdW5zaWduZWQgbG9uZyBwcmF0ZSwgYmVzdF9wcmF0ZSA9IDA7CiAJc2l6ZV90IGk7CiAJdTMyIGRpdjsKIAorCWN1cnJlbnRfcGFyZW50X2lzX3BsbGMgPSBiY20yODM1X2Nsa19pc19wbGxjKGNsa19od19nZXRfcGFyZW50KGh3KSk7CisKIAkvKgogCSAqIFNlbGVjdCBwYXJlbnQgY2xvY2sgdGhhdCByZXN1bHRzIGluIHRoZSBjbG9zZXN0IGJ1dCBsb3dlciByYXRlCiAJICovCkBAIC0xMDIzLDYgKzEwMzgsMTcgQEAKIAkJcGFyZW50ID0gY2xrX2h3X2dldF9wYXJlbnRfYnlfaW5kZXgoaHcsIGkpOwogCQlpZiAoIXBhcmVudCkKIAkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIERvbid0IGNob29zZSBhIFBMTEMtZGVyaXZlZCBjbG9jayBhcyBvdXIgcGFyZW50CisJCSAqIHVubGVzcyBpdCBoYWQgYmVlbiBtYW51YWxseSBzZXQgdGhhdCB3YXkuICBQTExDJ3MKKwkJICogZnJlcXVlbmN5IGdldHMgYWRqdXN0ZWQgYnkgdGhlIGZpcm13YXJlIGR1ZSB0bworCQkgKiBvdmVyLXRlbXAgb3IgdW5kZXItdm9sdGFnZSBjb25kaXRpb25zLCB3aXRob3V0CisJCSAqIHByaW9yIG5vdGlmaWNhdGlvbiB0byBvdXIgY2xvY2sgY29uc3VtZXIuCisJCSAqLworCQlpZiAoYmNtMjgzNV9jbGtfaXNfcGxsYyhwYXJlbnQpICYmICFjdXJyZW50X3BhcmVudF9pc19wbGxjKQorCQkJY29udGludWU7CisKIAkJcHJhdGUgPSBjbGtfaHdfZ2V0X3JhdGUocGFyZW50KTsKIAkJZGl2ID0gYmNtMjgzNV9jbG9ja19jaG9vc2VfZGl2KGh3LCByZXEtPnJhdGUsIHByYXRlLCB0cnVlKTsKIAkJcmF0ZSA9IGJjbTI4MzVfY2xvY2tfcmF0ZV9mcm9tX2Rpdmlzb3IoY2xvY2ssIHByYXRlLCBkaXYpOwpAQCAtMTEyMSwxMSArMTE0NywxMiBAQAogCS5kZWJ1Z19pbml0ID0gYmNtMjgzNV9jbG9ja19kZWJ1Z19pbml0LAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKmJjbTI4MzVfcmVnaXN0ZXJfcGxsKHN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAotCQkJCQljb25zdCBzdHJ1Y3QgYmNtMjgzNV9wbGxfZGF0YSAqZGF0YSkKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICpiY20yODM1X3JlZ2lzdGVyX3BsbChzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gKmNwcm1hbiwKKwkJCQkJICAgY29uc3Qgc3RydWN0IGJjbTI4MzVfcGxsX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IGJjbTI4MzVfcGxsICpwbGw7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJbWVtc2V0KCZpbml0LCAwLCBzaXplb2YoaW5pdCkpOwogCkBAIC0xMTQ0LDE3ICsxMTcxLDIwIEBACiAJcGxsLT5kYXRhID0gZGF0YTsKIAlwbGwtPmh3LmluaXQgPSAmaW5pdDsKIAotCXJldHVybiBkZXZtX2Nsa19yZWdpc3RlcihjcHJtYW4tPmRldiwgJnBsbC0+aHcpOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGNwcm1hbi0+ZGV2LCAmcGxsLT5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZwbGwtPmh3OwogfQogCi1zdGF0aWMgc3RydWN0IGNsayAqCitzdGF0aWMgc3RydWN0IGNsa19odyAqCiBiY20yODM1X3JlZ2lzdGVyX3BsbF9kaXZpZGVyKHN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgYmNtMjgzNV9wbGxfZGl2aWRlcl9kYXRhICpkYXRhKQogewogCXN0cnVjdCBiY20yODM1X3BsbF9kaXZpZGVyICpkaXZpZGVyOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0Jc3RydWN0IGNsayAqY2xrOwogCWNvbnN0IGNoYXIgKmRpdmlkZXJfbmFtZTsKKwlpbnQgcmV0OwogCiAJaWYgKGRhdGEtPmZpeGVkX2RpdmlkZXIgIT0gMSkgewogCQlkaXZpZGVyX25hbWUgPSBkZXZtX2thc3ByaW50ZihjcHJtYW4tPmRldiwgR0ZQX0tFUk5FTCwKQEAgLTExODgsMzIgKzEyMTgsMzMgQEAKIAlkaXZpZGVyLT5jcHJtYW4gPSBjcHJtYW47CiAJZGl2aWRlci0+ZGF0YSA9IGRhdGE7CiAKLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcihjcHJtYW4tPmRldiwgJmRpdmlkZXItPmRpdi5odyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm4gY2xrOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGNwcm1hbi0+ZGV2LCAmZGl2aWRlci0+ZGl2Lmh3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCiAJLyoKIAkgKiBQTExIJ3MgY2hhbm5lbHMgaGF2ZSBhIGZpeGVkIGRpdmlkZSBieSAxMCBhZnRlcndhcmRzLCB3aGljaAogCSAqIGlzIHdoYXQgb3VyIGNvbnN1bWVycyBhcmUgYWN0dWFsbHkgdXNpbmcuCiAJICovCiAJaWYgKGRhdGEtPmZpeGVkX2RpdmlkZXIgIT0gMSkgewotCQlyZXR1cm4gY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihjcHJtYW4tPmRldiwgZGF0YS0+bmFtZSwKLQkJCQkJCSBkaXZpZGVyX25hbWUsCi0JCQkJCQkgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKLQkJCQkJCSAxLAotCQkJCQkJIGRhdGEtPmZpeGVkX2RpdmlkZXIpOworCQlyZXR1cm4gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihjcHJtYW4tPmRldiwgZGF0YS0+bmFtZSwKKwkJCQkJCSAgICBkaXZpZGVyX25hbWUsCisJCQkJCQkgICAgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKKwkJCQkJCSAgICAxLAorCQkJCQkJICAgIGRhdGEtPmZpeGVkX2RpdmlkZXIpOwogCX0KIAotCXJldHVybiBjbGs7CisJcmV0dXJuICZkaXZpZGVyLT5kaXYuaHc7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrICpiY20yODM1X3JlZ2lzdGVyX2Nsb2NrKHN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAorc3RhdGljIHN0cnVjdCBjbGtfaHcgKmJjbTI4MzVfcmVnaXN0ZXJfY2xvY2soc3RydWN0IGJjbTI4MzVfY3BybWFuICpjcHJtYW4sCiAJCQkJCSAgY29uc3Qgc3RydWN0IGJjbTI4MzVfY2xvY2tfZGF0YSAqZGF0YSkKIHsKIAlzdHJ1Y3QgYmNtMjgzNV9jbG9jayAqY2xvY2s7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKIAljb25zdCBjaGFyICpwYXJlbnRzWzEgPDwgQ01fU1JDX0JJVFNdOwogCXNpemVfdCBpOworCWludCByZXQ7CiAKIAkvKgogCSAqIFJlcGxhY2Ugb3VyICJ4b3NjIiByZWZlcmVuY2VzIHdpdGggdGhlIG9zY2lsbGF0b3IncwpAQCAtMTIzMCwxMyArMTI2MSwxOSBAQAogCWluaXQucGFyZW50X25hbWVzID0gcGFyZW50czsKIAlpbml0Lm51bV9wYXJlbnRzID0gZGF0YS0+bnVtX211eF9wYXJlbnRzOwogCWluaXQubmFtZSA9IGRhdGEtPm5hbWU7Ci0JaW5pdC5mbGFncyA9IENMS19JR05PUkVfVU5VU0VEOworCWluaXQuZmxhZ3MgPSBkYXRhLT5mbGFncyB8IENMS19JR05PUkVfVU5VU0VEOwogCiAJaWYgKGRhdGEtPmlzX3ZwdV9jbG9jaykgewogCQlpbml0Lm9wcyA9ICZiY20yODM1X3ZwdV9jbG9ja19jbGtfb3BzOwogCX0gZWxzZSB7CiAJCWluaXQub3BzID0gJmJjbTI4MzVfY2xvY2tfY2xrX29wczsKIAkJaW5pdC5mbGFncyB8PSBDTEtfU0VUX1JBVEVfR0FURSB8IENMS19TRVRfUEFSRU5UX0dBVEU7CisKKwkJLyogSWYgdGhlIGNsb2NrIHdhc24ndCBhY3R1YWxseSBlbmFibGVkIGF0IGJvb3QsIGl0J3Mgbm90CisJCSAqIGNyaXRpY2FsLgorCQkgKi8KKwkJaWYgKCEoY3BybWFuX3JlYWQoY3BybWFuLCBkYXRhLT5jdGxfcmVnKSAmIENNX0VOQUJMRSkpCisJCQlpbml0LmZsYWdzICY9IH5DTEtfSVNfQ1JJVElDQUw7CiAJfQogCiAJY2xvY2sgPSBkZXZtX2t6YWxsb2MoY3BybWFuLT5kZXYsIHNpemVvZigqY2xvY2spLCBHRlBfS0VSTkVMKTsKQEAgLTEyNDcsNyArMTI4NCwxMCBAQAogCWNsb2NrLT5kYXRhID0gZGF0YTsKIAljbG9jay0+aHcuaW5pdCA9ICZpbml0OwogCi0JcmV0dXJuIGRldm1fY2xrX3JlZ2lzdGVyKGNwcm1hbi0+ZGV2LCAmY2xvY2stPmh3KTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihjcHJtYW4tPmRldiwgJmNsb2NrLT5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwlyZXR1cm4gJmNsb2NrLT5odzsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGsgKmJjbTI4MzVfcmVnaXN0ZXJfZ2F0ZShzdHJ1Y3QgYmNtMjgzNV9jcHJtYW4gKmNwcm1hbiwKQEAgLTEyNTksOCArMTI5OSw4IEBACiAJCQkJIENNX0dBVEVfQklULCAwLCAmY3BybWFuLT5yZWdzX2xvY2spOwogfQogCi10eXBlZGVmIHN0cnVjdCBjbGsgKigqYmNtMjgzNV9jbGtfcmVnaXN0ZXIpKHN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAotCQkJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSk7Cit0eXBlZGVmIHN0cnVjdCBjbGtfaHcgKigqYmNtMjgzNV9jbGtfcmVnaXN0ZXIpKHN0cnVjdCBiY20yODM1X2Nwcm1hbiAqY3BybWFuLAorCQkJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSk7CiBzdHJ1Y3QgYmNtMjgzNV9jbGtfZGVzYyB7CiAJYmNtMjgzNV9jbGtfcmVnaXN0ZXIgY2xrX3JlZ2lzdGVyOwogCWNvbnN0IHZvaWQgKmRhdGE7CkBAIC0xNjQ5LDYgKzE2ODksNyBAQAogCQkuZGl2X3JlZyA9IENNX1ZQVURJViwKIAkJLmludF9iaXRzID0gMTIsCiAJCS5mcmFjX2JpdHMgPSA4LAorCQkuZmxhZ3MgPSBDTEtfSVNfQ1JJVElDQUwsCiAJCS5pc192cHVfY2xvY2sgPSB0cnVlKSwKIAogCS8qIGNsb2NrcyB3aXRoIHBlciBwYXJlbnQgbXV4ICovCkBAIC0xNzA1LDEzICsxNzQ2LDE1IEBACiAJCS5kaXZfcmVnID0gQ01fR1AxRElWLAogCQkuaW50X2JpdHMgPSAxMiwKIAkJLmZyYWNfYml0cyA9IDEyLAorCQkuZmxhZ3MgPSBDTEtfSVNfQ1JJVElDQUwsCiAJCS5pc19tYXNoX2Nsb2NrID0gdHJ1ZSksCiAJW0JDTTI4MzVfQ0xPQ0tfR1AyXQk9IFJFR0lTVEVSX1BFUl9DTEsoCiAJCS5uYW1lID0gImdwMiIsCiAJCS5jdGxfcmVnID0gQ01fR1AyQ1RMLAogCQkuZGl2X3JlZyA9IENNX0dQMkRJViwKIAkJLmludF9iaXRzID0gMTIsCi0JCS5mcmFjX2JpdHMgPSAxMiksCisJCS5mcmFjX2JpdHMgPSAxMiwKKwkJLmZsYWdzID0gQ0xLX0lTX0NSSVRJQ0FMKSwKIAogCS8qIEhETUkgc3RhdGUgbWFjaGluZSAqLwogCVtCQ00yODM1X0NMT0NLX0hTTV0JPSBSRUdJU1RFUl9QRVJfQ0xLKApAQCAtMTc5MCwxOCArMTgzMywzOCBAQAogCQkuY3RsX3JlZyA9IENNX1BFUklJQ1RMKSwKIH07CiAKKy8qCisgKiBQZXJtYW5lbnRseSB0YWtlIGEgcmVmZXJlbmNlIG9uIHRoZSBwYXJlbnQgb2YgdGhlIFNEUkFNIGNsb2NrLgorICoKKyAqIFdoaWxlIHRoZSBTRFJBTSBpcyBiZWluZyBkcml2ZW4gYnkgaXRzIGRlZGljYXRlZCBQTEwgbW9zdCBvZiB0aGUKKyAqIHRpbWUsIHRoZXJlIGlzIGEgbGl0dGxlIGxvb3AgcnVubmluZyBpbiB0aGUgZmlybXdhcmUgdGhhdAorICogcGVyaW9kaWNhbGx5IHN3aXRjaGVzIHRoZSBTRFJBTSB0byB1c2luZyBvdXIgQ00gY2xvY2sgdG8gZG8gUFZUCisgKiByZWNhbGlicmF0aW9uLCB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHByZXZpb3VzbHkgY29uZmlndXJlZAorICogU0RSQU0gcGFyZW50IGlzIHN0aWxsIGVuYWJsZWQgYW5kIHJ1bm5pbmcuCisgKi8KK3N0YXRpYyBpbnQgYmNtMjgzNV9tYXJrX3NkY19wYXJlbnRfY3JpdGljYWwoc3RydWN0IGNsayAqc2RjKQoreworCXN0cnVjdCBjbGsgKnBhcmVudCA9IGNsa19nZXRfcGFyZW50KHNkYyk7CisKKwlpZiAoSVNfRVJSKHBhcmVudCkpCisJCXJldHVybiBQVFJfRVJSKHBhcmVudCk7CisKKwlyZXR1cm4gY2xrX3ByZXBhcmVfZW5hYmxlKHBhcmVudCk7Cit9CisKIHN0YXRpYyBpbnQgYmNtMjgzNV9jbGtfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCBjbGsgKipjbGtzOworCXN0cnVjdCBjbGtfaHcgKipod3M7CiAJc3RydWN0IGJjbTI4MzVfY3BybWFuICpjcHJtYW47CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJY29uc3Qgc3RydWN0IGJjbTI4MzVfY2xrX2Rlc2MgKmRlc2M7CiAJY29uc3Qgc2l6ZV90IGFzaXplID0gQVJSQVlfU0laRShjbGtfZGVzY19hcnJheSk7CiAJc2l6ZV90IGk7CisJaW50IHJldDsKIAotCWNwcm1hbiA9IGRldm1fa3phbGxvYyhkZXYsCi0JCQkgICAgICBzaXplb2YoKmNwcm1hbikgKyBhc2l6ZSAqIHNpemVvZigqY2xrcyksCisJY3BybWFuID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjcHJtYW4pICsKKwkJCSAgICAgIHNpemVvZigqY3BybWFuLT5vbmVjZWxsLmh3cykgKiBhc2l6ZSwKIAkJCSAgICAgIEdGUF9LRVJORUwpOwogCWlmICghY3BybWFuKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE4MTksMTggKzE4ODIsMjEgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNwcm1hbik7CiAKLQljcHJtYW4tPm9uZWNlbGwuY2xrX251bSA9IGFzaXplOwotCWNwcm1hbi0+b25lY2VsbC5jbGtzID0gY3BybWFuLT5jbGtzOwotCWNsa3MgPSBjcHJtYW4tPmNsa3M7CisJY3BybWFuLT5vbmVjZWxsLm51bSA9IGFzaXplOworCWh3cyA9IGNwcm1hbi0+b25lY2VsbC5od3M7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXNpemU7IGkrKykgewogCQlkZXNjID0gJmNsa19kZXNjX2FycmF5W2ldOwogCQlpZiAoZGVzYy0+Y2xrX3JlZ2lzdGVyICYmIGRlc2MtPmRhdGEpCi0JCQljbGtzW2ldID0gZGVzYy0+Y2xrX3JlZ2lzdGVyKGNwcm1hbiwgZGVzYy0+ZGF0YSk7CisJCQlod3NbaV0gPSBkZXNjLT5jbGtfcmVnaXN0ZXIoY3BybWFuLCBkZXNjLT5kYXRhKTsKIAl9CiAKLQlyZXR1cm4gb2ZfY2xrX2FkZF9wcm92aWRlcihkZXYtPm9mX25vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsCi0JCQkJICAgJmNwcm1hbi0+b25lY2VsbCk7CisJcmV0ID0gYmNtMjgzNV9tYXJrX3NkY19wYXJlbnRfY3JpdGljYWwoaHdzW0JDTTI4MzVfQ0xPQ0tfU0RSQU1dLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihkZXYtPm9mX25vZGUsIG9mX2Nsa19od19vbmVjZWxsX2dldCwKKwkJCQkgICAgICAmY3BybWFuLT5vbmVjZWxsKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYmNtMjgzNV9jbGtfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2JjbS9jbGstYmNtNTM1NzMtaWxwLmMgYi9kcml2ZXJzL2Nsay9iY20vY2xrLWJjbTUzNTczLWlscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZWIzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9iY20vY2xrLWJjbTUzNTczLWlscC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFJhZmHFgiBNacWCZWNraSA8cmFmYWxAbWlsZWNraS5wbD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNkZWZpbmUgUE1VX1hUQUxfRlJFUV9SQVRJTwkJCTB4NjZjCisjZGVmaW5lICBYVEFMX0FMUF9QRVJfNElMUAkJCTB4MDAwMDFmZmYKKyNkZWZpbmUgIFhUQUxfQ1RMX0VOCQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgUE1VX1NMT1dfQ0xLX1BFUklPRAkJCTB4NmRjCisKK3N0cnVjdCBiY201MzU3M19pbHAgeworCXN0cnVjdCBjbGtfaHcgaHc7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworfTsKKworc3RhdGljIGludCBiY201MzU3M19pbHBfZW5hYmxlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBiY201MzU3M19pbHAgKmlscCA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IGJjbTUzNTczX2lscCwgaHcpOworCisJcmVnbWFwX3dyaXRlKGlscC0+cmVnbWFwLCBQTVVfU0xPV19DTEtfUEVSSU9ELCAweDEwMTk5KTsKKwlyZWdtYXBfd3JpdGUoaWxwLT5yZWdtYXAsIDB4Njc0LCAweDEwMDAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiY201MzU3M19pbHBfZGlzYWJsZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgYmNtNTM1NzNfaWxwICppbHAgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBiY201MzU3M19pbHAsIGh3KTsKKworCXJlZ21hcF93cml0ZShpbHAtPnJlZ21hcCwgUE1VX1NMT1dfQ0xLX1BFUklPRCwgMCk7CisJcmVnbWFwX3dyaXRlKGlscC0+cmVnbWFwLCAweDY3NCwgMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJjbTUzNTczX2lscF9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKK3sKKwlzdHJ1Y3QgYmNtNTM1NzNfaWxwICppbHAgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCBiY201MzU3M19pbHAsIGh3KTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBpbHAtPnJlZ21hcDsKKwl1MzIgbGFzdF92YWwsIGN1cl92YWw7CisJaW50IHN1bSA9IDAsIG51bSA9IDAsIGxvb3BfbnVtID0gMDsKKwlpbnQgYXZnOworCisJLyogRW5hYmxlIG1lYXN1cmVtZW50ICovCisJcmVnbWFwX3dyaXRlKHJlZ21hcCwgUE1VX1hUQUxfRlJFUV9SQVRJTywgWFRBTF9DVExfRU4pOworCisJLyogUmVhZCBpbml0aWFsIHZhbHVlICovCisJcmVnbWFwX3JlYWQocmVnbWFwLCBQTVVfWFRBTF9GUkVRX1JBVElPLCAmbGFzdF92YWwpOworCWxhc3RfdmFsICY9IFhUQUxfQUxQX1BFUl80SUxQOworCisJLyoKKwkgKiBBdCBtaW5pbXVtIHdlIHNob3VsZCBsb29wIGZvciBhIGJpdCB0byBsZXQgaGFyZHdhcmUgZG8gdGhlCisJICogbWVhc3VyZW1lbnQuIFRoaXMgaXNuJ3QgdmVyeSBhY2N1cmF0ZSBob3dldmVyLCBzbyBmb3IgYSBiZXR0ZXIKKwkgKiBwcmVjaXNpb24gbGV0cyB0cnkgZ2V0dGluZyAyMCBkaWZmZXJlbnQgdmFsdWVzIGZvciBhbmQgdXNlIGF2ZXJhZ2UuCisJICovCisJd2hpbGUgKG51bSA8IDIwKSB7CisJCXJlZ21hcF9yZWFkKHJlZ21hcCwgUE1VX1hUQUxfRlJFUV9SQVRJTywgJmN1cl92YWwpOworCQljdXJfdmFsICY9IFhUQUxfQUxQX1BFUl80SUxQOworCisJCWlmIChjdXJfdmFsICE9IGxhc3RfdmFsKSB7CisJCQkvKiBHb3QgZGlmZmVyZW50IHZhbHVlLCB1c2UgaXQgKi8KKwkJCXN1bSArPSBjdXJfdmFsOworCQkJbnVtKys7CisJCQlsb29wX251bSA9IDA7CisJCQlsYXN0X3ZhbCA9IGN1cl92YWw7CisJCX0gZWxzZSBpZiAoKytsb29wX251bSA+IDUwMDApIHsKKwkJCS8qIFNhbWUgdmFsdWUgb3ZlciBhbmQgb3ZlciwgZ2l2ZSB1cCAqLworCQkJc3VtICs9IGN1cl92YWw7CisJCQludW0rKzsKKwkJCWJyZWFrOworCQl9CisKKwkJY3B1X3JlbGF4KCk7CisJfQorCisJLyogRGlzYWJsZSBtZWFzdXJlbWVudCB0byBzYXZlIHBvd2VyICovCisJcmVnbWFwX3dyaXRlKHJlZ21hcCwgUE1VX1hUQUxfRlJFUV9SQVRJTywgMHgwKTsKKworCWF2ZyA9IHN1bSAvIG51bTsKKworCXJldHVybiBwYXJlbnRfcmF0ZSAqIDQgLyBhdmc7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyBiY201MzU3M19pbHBfY2xrX29wcyA9IHsKKwkuZW5hYmxlID0gYmNtNTM1NzNfaWxwX2VuYWJsZSwKKwkuZGlzYWJsZSA9IGJjbTUzNTczX2lscF9kaXNhYmxlLAorCS5yZWNhbGNfcmF0ZSA9IGJjbTUzNTczX2lscF9yZWNhbGNfcmF0ZSwKK307CisKK3N0YXRpYyB2b2lkIGJjbTUzNTczX2lscF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGJjbTUzNTczX2lscCAqaWxwOworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQgPSB7IH07CisJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CisJaW50IGVycjsKKworCWlscCA9IGt6YWxsb2Moc2l6ZW9mKCppbHApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlscCkKKwkJcmV0dXJuOworCisJcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKTsKKwlpZiAoIXBhcmVudF9uYW1lKSB7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX2ZyZWVfaWxwOworCX0KKworCWlscC0+cmVnbWFwID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKG9mX2dldF9wYXJlbnQobnApKTsKKwlpZiAoSVNfRVJSKGlscC0+cmVnbWFwKSkgeworCQllcnIgPSBQVFJfRVJSKGlscC0+cmVnbWFwKTsKKwkJZ290byBlcnJfZnJlZV9pbHA7CisJfQorCisJaW5pdC5uYW1lID0gbnAtPm5hbWU7CisJaW5pdC5vcHMgPSAmYmNtNTM1NzNfaWxwX2Nsa19vcHM7CisJaW5pdC5wYXJlbnRfbmFtZXMgPSAmcGFyZW50X25hbWU7CisJaW5pdC5udW1fcGFyZW50cyA9IDE7CisKKwlpbHAtPmh3LmluaXQgPSAmaW5pdDsKKwllcnIgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJmlscC0+aHcpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWVfaWxwOworCisJZXJyID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsICZpbHAtPmh3KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9jbGtfaHdfdW5yZWdpc3RlcjsKKworCXJldHVybjsKKworZXJyX2Nsa19od191bnJlZ2lzdGVyOgorCWNsa19od191bnJlZ2lzdGVyKCZpbHAtPmh3KTsKK2Vycl9mcmVlX2lscDoKKwlrZnJlZShpbHApOworCXByX2VycigiRmFpbGVkIHRvIGluaXQgSUxQIGNsb2NrOiAlZFxuIiwgZXJyKTsKK30KKworLyogV2UgbmVlZCBpdCB2ZXJ5IGVhcmx5IGZvciBhcmNoIGNvZGUsIGJlZm9yZSBkZXZpY2UgbW9kZWwgZ2V0cyByZWFkeSAqLworQ0xLX09GX0RFQ0xBUkUoYmNtNTM1NzNfaWxwX2NsaywgImJyY20sYmNtNTM1NzMtaWxwIiwgYmNtNTM1NzNfaWxwX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLXNldHVwLmMgYi9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEtc2V0dXAuYwppbmRleCA1MjZiMGIwLi5jMzdhN2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEtc2V0dXAuYworKysgYi9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEtc2V0dXAuYwpAQCAtNTg2LDggKzU4Niw4IEBACiAJfQogCiAJLyogVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBhcmVudCwgc28gYWxsb2NhdGUgYSBzZWxlY3RvciBhcnJheSAqLwotCi0JcGFyZW50X3NlbCA9IGttYWxsb2MocGFyZW50X2NvdW50ICogc2l6ZW9mKCpwYXJlbnRfc2VsKSwgR0ZQX0tFUk5FTCk7CisJcGFyZW50X3NlbCA9IGttYWxsb2NfYXJyYXkocGFyZW50X2NvdW50LCBzaXplb2YoKnBhcmVudF9zZWwpLAorCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghcGFyZW50X3NlbCkgewogCQlwcl9lcnIoIiVzOiBlcnJvciBhbGxvY2F0aW5nICV1IHBhcmVudCBzZWxlY3RvcnNcbiIsIF9fZnVuY19fLAogCQkJCXBhcmVudF9jb3VudCk7CkBAIC02OTYsNzcgKzY5Niw2OSBAQAogCWJjbV9jbGstPnR5cGUgPSBiY21fY2xrX25vbmU7CiB9CiAKLXN0YXRpYyB2b2lkIGtvbmFfY2xrX3RlYXJkb3duKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB2b2lkIGtvbmFfY2xrX3RlYXJkb3duKHN0cnVjdCBjbGtfaHcgKmh3KQogewotCXN0cnVjdCBjbGtfaHcgKmh3OwogCXN0cnVjdCBrb25hX2NsayAqYmNtX2NsazsKIAotCWlmICghY2xrKQorCWlmICghaHcpCiAJCXJldHVybjsKIAotCWh3ID0gX19jbGtfZ2V0X2h3KGNsayk7Ci0JaWYgKCFodykgewotCQlwcl9lcnIoIiVzOiBjbGsgJXAgaGFzIG51bGwgaHcgcG9pbnRlclxuIiwgX19mdW5jX18sIGNsayk7Ci0JCXJldHVybjsKLQl9Ci0JY2xrX3VucmVnaXN0ZXIoY2xrKTsKKwljbGtfaHdfdW5yZWdpc3Rlcihodyk7CiAKIAliY21fY2xrID0gdG9fa29uYV9jbGsoaHcpOwogCWJjbV9jbGtfdGVhcmRvd24oYmNtX2Nsayk7CiB9CiAKLXN0cnVjdCBjbGsgKmtvbmFfY2xrX3NldHVwKHN0cnVjdCBrb25hX2NsayAqYmNtX2NsaykKK3N0YXRpYyBpbnQga29uYV9jbGtfc2V0dXAoc3RydWN0IGtvbmFfY2xrICpiY21fY2xrKQogeworCWludCByZXQ7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgKmluaXRfZGF0YSA9ICZiY21fY2xrLT5pbml0X2RhdGE7Ci0Jc3RydWN0IGNsayAqY2xrID0gTlVMTDsKIAogCXN3aXRjaCAoYmNtX2Nsay0+dHlwZSkgewogCWNhc2UgYmNtX2Nsa19wZXJpOgotCQlpZiAocGVyaV9jbGtfc2V0dXAoYmNtX2Nsay0+dS5kYXRhLCBpbml0X2RhdGEpKQotCQkJcmV0dXJuIE5VTEw7CisJCXJldCA9IHBlcmlfY2xrX3NldHVwKGJjbV9jbGstPnUuZGF0YSwgaW5pdF9kYXRhKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2VycigiJXM6IGNsb2NrIHR5cGUgJWQgaW52YWxpZCBmb3IgJXNcbiIsIF9fZnVuY19fLAogCQkJKGludCliY21fY2xrLT50eXBlLCBpbml0X2RhdGEtPm5hbWUpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogTWFrZSBzdXJlIGV2ZXJ5dGhpbmcgbWFrZXMgc2Vuc2UgYmVmb3JlIHdlIHNldCBpdCB1cCAqLwogCWlmICgha29uYV9jbGtfdmFsaWQoYmNtX2NsaykpIHsKIAkJcHJfZXJyKCIlczogY2xvY2sgZGF0YSBpbnZhbGlkIGZvciAlc1xuIiwgX19mdW5jX18sCiAJCQlpbml0X2RhdGEtPm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dF90ZWFyZG93bjsKIAl9CiAKIAliY21fY2xrLT5ody5pbml0ID0gaW5pdF9kYXRhOwotCWNsayA9IGNsa19yZWdpc3RlcihOVUxMLCAmYmNtX2Nsay0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkgewotCQlwcl9lcnIoIiVzOiBlcnJvciByZWdpc3RlcmluZyBjbG9jayAlcyAoJWxkKVxuIiwgX19mdW5jX18sCi0JCQlpbml0X2RhdGEtPm5hbWUsIFBUUl9FUlIoY2xrKSk7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZiY21fY2xrLT5odyk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBlcnJvciByZWdpc3RlcmluZyBjbG9jayAlcyAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJCWluaXRfZGF0YS0+bmFtZSwgcmV0KTsKIAkJZ290byBvdXRfdGVhcmRvd247CiAJfQotCUJVR19PTighY2xrKTsKIAotCXJldHVybiBjbGs7CisJcmV0dXJuIDA7CiBvdXRfdGVhcmRvd246CiAJYmNtX2Nsa190ZWFyZG93bihiY21fY2xrKTsKIAotCXJldHVybiBOVUxMOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGNjdV9jbGtzX3RlYXJkb3duKHN0cnVjdCBjY3VfZGF0YSAqY2N1KQogewogCXUzMiBpOwogCi0JZm9yIChpID0gMDsgaSA8IGNjdS0+Y2xrX2RhdGEuY2xrX251bTsgaSsrKQotCQlrb25hX2Nsa190ZWFyZG93bihjY3UtPmNsa19kYXRhLmNsa3NbaV0pOwotCWtmcmVlKGNjdS0+Y2xrX2RhdGEuY2xrcyk7CisJZm9yIChpID0gMDsgaSA8IGNjdS0+Y2xrX251bTsgaSsrKQorCQlrb25hX2Nsa190ZWFyZG93bigmY2N1LT5rb25hX2Nsa3NbaV0uaHcpOwogfQogCiBzdGF0aWMgdm9pZCBrb25hX2NjdV90ZWFyZG93bihzdHJ1Y3QgY2N1X2RhdGEgKmNjdSkKIHsKLQlrZnJlZShjY3UtPmNsa19kYXRhLmNsa3MpOwotCWNjdS0+Y2xrX2RhdGEuY2xrcyA9IE5VTEw7CiAJaWYgKCFjY3UtPmJhc2UpCiAJCXJldHVybjsKIApAQCAtNzkzLDYgKzc4NSwyMCBAQAogCXJldHVybiB0cnVlOwogfQogCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitvZl9jbGtfa29uYV9vbmVjZWxsX2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjY3VfZGF0YSAqY2N1ID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gY2N1LT5jbGtfbnVtKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggJXVcbiIsIF9fZnVuY19fLCBpZHgpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gJmNjdS0+a29uYV9jbGtzW2lkeF0uaHc7Cit9CisKIC8qCiAgKiBTZXQgdXAgYSBDQ1UuICBDYWxsIHRoZSBwcm92aWRlZCBjY3VfY2xrc19zZXR1cCBjYWxsYmFjayB0bwogICogaW5pdGlhbGl6ZSB0aGUgYXJyYXkgb2YgY2xvY2tzIHByb3ZpZGVkIGJ5IHRoZSBDQ1UuCkBAIC04MDUsMTggKzgxMSw2IEBACiAJdW5zaWduZWQgaW50IGk7CiAJaW50IHJldDsKIAotCWlmIChjY3UtPmNsa19kYXRhLmNsa19udW0pIHsKLQkJc2l6ZV90IHNpemU7Ci0KLQkJc2l6ZSA9IGNjdS0+Y2xrX2RhdGEuY2xrX251bSAqIHNpemVvZigqY2N1LT5jbGtfZGF0YS5jbGtzKTsKLQkJY2N1LT5jbGtfZGF0YS5jbGtzID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjY3UtPmNsa19kYXRhLmNsa3MpIHsKLQkJCXByX2VycigiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSAldSBjbG9ja3MgZm9yICVzXG4iLAotCQkJCV9fZnVuY19fLCBjY3UtPmNsa19kYXRhLmNsa19udW0sIG5vZGUtPm5hbWUpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCiAJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmcmVzKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiJXM6IG5vIHZhbGlkIENDVSByZWdpc3RlcnMgZm91bmQgZm9yICVzXG4iLCBfX2Z1bmNfXywKQEAgLTg1MSwxMyArODQ1LDEzIEBACiAJICogdGhlIGNsb2NrIGZyYW1ld29yayBjbG9jayBhcnJheSAoaW4gY2N1LT5kYXRhKS4gIFRoZW4KIAkgKiByZWdpc3RlciBhcyBhIHByb3ZpZGVyIGZvciB0aGVzZSBjbG9ja3MuCiAJICovCi0JZm9yIChpID0gMDsgaSA8IGNjdS0+Y2xrX2RhdGEuY2xrX251bTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGNjdS0+Y2xrX251bTsgaSsrKSB7CiAJCWlmICghY2N1LT5rb25hX2Nsa3NbaV0uY2N1KQogCQkJY29udGludWU7Ci0JCWNjdS0+Y2xrX2RhdGEuY2xrc1tpXSA9IGtvbmFfY2xrX3NldHVwKCZjY3UtPmtvbmFfY2xrc1tpXSk7CisJCWtvbmFfY2xrX3NldHVwKCZjY3UtPmtvbmFfY2xrc1tpXSk7CiAJfQogCi0JcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LCAmY2N1LT5jbGtfZGF0YSk7CisJcmV0ID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfa29uYV9vbmVjZWxsX2dldCwgY2N1KTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiJXM6IGVycm9yIGFkZGluZyBjY3UgJXMgYXMgcHJvdmlkZXIgKCVkKVxuIiwgX19mdW5jX18sCiAJCQkJbm9kZS0+bmFtZSwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS5jIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLmMKaW5kZXggM2ExNTM0Ny4uZWVlNjRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLmMKKysrIGIvZHJpdmVycy9jbGsvYmNtL2Nsay1rb25hLmMKQEAgLTEyNTYsMTkgKzEyNTYsMTggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCB3aGljaDsKLQlzdHJ1Y3QgY2xrICoqY2xrcyA9IGNjdS0+Y2xrX2RhdGEuY2xrczsKIAlzdHJ1Y3Qga29uYV9jbGsgKmtvbmFfY2xrcyA9IGNjdS0+a29uYV9jbGtzOwogCWJvb2wgc3VjY2VzcyA9IHRydWU7CiAKIAlmbGFncyA9IGNjdV9sb2NrKGNjdSk7CiAJX19jY3Vfd3JpdGVfZW5hYmxlKGNjdSk7CiAKLQlmb3IgKHdoaWNoID0gMDsgd2hpY2ggPCBjY3UtPmNsa19kYXRhLmNsa19udW07IHdoaWNoKyspIHsKLQkJc3RydWN0IGtvbmFfY2xrICpiY21fY2xrOworCWZvciAod2hpY2ggPSAwOyB3aGljaCA8IGNjdS0+Y2xrX251bTsgd2hpY2grKykgeworCQlzdHJ1Y3Qga29uYV9jbGsgKmJjbV9jbGsgPSAma29uYV9jbGtzW3doaWNoXTsKIAotCQlpZiAoIWNsa3Nbd2hpY2hdKQorCQlpZiAoIWJjbV9jbGstPmNjdSkKIAkJCWNvbnRpbnVlOwotCQliY21fY2xrID0gJmtvbmFfY2xrc1t3aGljaF07CisKIAkJc3VjY2VzcyAmPSBfX2tvbmFfY2xrX2luaXQoYmNtX2Nsayk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iY20vY2xrLWtvbmEuaCBiL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS5oCmluZGV4IDkwNjU3NmUuLmY0YjM5YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS5oCisrKyBiL2RyaXZlcnMvY2xrL2JjbS9jbGsta29uYS5oCkBAIC00ODEsNyArNDgxLDcgQEAKIAlib29sIHdyaXRlX2VuYWJsZWQ7CS8qIHdyaXRlIGFjY2VzcyBpcyBjdXJyZW50bHkgZW5hYmxlZCAqLwogCXN0cnVjdCBjY3VfcG9saWN5IHBvbGljeTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGE7CisJc2l6ZV90IGNsa19udW07CiAJY29uc3QgY2hhciAqbmFtZTsKIAl1MzIgcmFuZ2U7CQkvKiBieXRlIHJhbmdlIG9mIGFkZHJlc3Mgc3BhY2UgKi8KIAlzdHJ1Y3Qga29uYV9jbGsga29uYV9jbGtzW107CS8qIG11c3QgYmUgbGFzdCAqLwpAQCAtNDkxLDkgKzQ5MSw3IEBACiAjZGVmaW5lIEtPTkFfQ0NVX0NPTU1PTihfcHJlZml4LCBfbmFtZSwgX2NjdW5hbWUpCQkJICAgIFwKIAkubmFtZQkJPSAjX25hbWUgIl9jY3UiLAkJCQkgICAgXAogCS5sb2NrCQk9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKF9uYW1lICMjIF9jY3VfZGF0YS5sb2NrKSwgICAgXAotCS5jbGtfZGF0YQk9IHsJCQkJCQkgICAgXAotCQkuY2xrX251bSA9IF9wcmVmaXggIyMgXyAjIyBfY2N1bmFtZSAjIyBfQ0NVX0NMT0NLX0NPVU5ULCAgICBcCi0JfQorCS5jbGtfbnVtCT0gX3ByZWZpeCAjIyBfICMjIF9jY3VuYW1lICMjIF9DQ1VfQ0xPQ0tfQ09VTlQKIAogLyogRXhwb3J0ZWQgZ2xvYmFscyAqLwogCkBAIC01MDUsNyArNTAzLDYgQEAKIGV4dGVybiB1NjQgc2NhbGVkX2Rpdl9idWlsZChzdHJ1Y3QgYmNtX2Nsa19kaXYgKmRpdiwgdTMyIGRpdl92YWx1ZSwKIAkJCQl1MzIgYmlsbGlvbnRocyk7CiAKLWV4dGVybiBzdHJ1Y3QgY2xrICprb25hX2Nsa19zZXR1cChzdHJ1Y3Qga29uYV9jbGsgKmJjbV9jbGspOwogZXh0ZXJuIHZvaWQgX19pbml0IGtvbmFfZHRfY2N1X3NldHVwKHN0cnVjdCBjY3VfZGF0YSAqY2N1LAogCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7CiBleHRlcm4gYm9vbCBfX2luaXQga29uYV9jY3VfaW5pdChzdHJ1Y3QgY2N1X2RhdGEgKmNjdSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1hdnBsbC5jIGIvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItYXZwbGwuYwppbmRleCBmZDBmMjZjLi5jZmNhZTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1hdnBsbC5jCisrKyBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWF2cGxsLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogCS5yZWNhbGNfcmF0ZQk9IGJlcmxpbjJfYXZwbGxfdmNvX3JlY2FsY19yYXRlLAogfTsKIAotc3RydWN0IGNsayAqIF9faW5pdCBiZXJsaW4yX2F2cGxsX3Zjb19yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsCitpbnQgX19pbml0IGJlcmxpbjJfYXZwbGxfdmNvX3JlZ2lzdGVyKHZvaWQgX19pb21lbSAqYmFzZSwKIAkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKIAkJCSAgICAgICB1OCB2Y29fZmxhZ3MsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CkBAIC0xOTcsNyArMTk3LDcgQEAKIAogCXZjbyA9IGt6YWxsb2Moc2l6ZW9mKCp2Y28pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZjbykKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJldHVybiAtRU5PTUVNOwogCiAJdmNvLT5iYXNlID0gYmFzZTsKIAl2Y28tPmZsYWdzID0gdmNvX2ZsYWdzOwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJaW5pdC5udW1fcGFyZW50cyA9IDE7CiAJaW5pdC5mbGFncyA9IGZsYWdzOwogCi0JcmV0dXJuIGNsa19yZWdpc3RlcihOVUxMLCAmdmNvLT5odyk7CisJcmV0dXJuIGNsa19od19yZWdpc3RlcihOVUxMLCAmdmNvLT5odyk7CiB9CiAKIHN0cnVjdCBiZXJsaW4yX2F2cGxsX2NoYW5uZWwgewpAQCAtMzY0LDcgKzM2NCw3IEBACiAgKi8KIHN0YXRpYyBjb25zdCB1OCBxdWlya19pbmRleFtdIF9faW5pdGNvbnN0ID0geyAwLCA2LCA1LCA0LCAzLCAyLCAxLCA3IH07CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQgYmVybGluMl9hdnBsbF9jaGFubmVsX3JlZ2lzdGVyKHZvaWQgX19pb21lbSAqYmFzZSwKK2ludCBfX2luaXQgYmVybGluMl9hdnBsbF9jaGFubmVsX3JlZ2lzdGVyKHZvaWQgX19pb21lbSAqYmFzZSwKIAkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHU4IGluZGV4LCBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKIAkJCSAgIHU4IGNoX2ZsYWdzLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewpAQCAtMzczLDcgKzM3Myw3IEBACiAKIAljaCA9IGt6YWxsb2Moc2l6ZW9mKCpjaCksIEdGUF9LRVJORUwpOwogCWlmICghY2gpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlyZXR1cm4gLUVOT01FTTsKIAogCWNoLT5iYXNlID0gYmFzZTsKIAlpZiAoY2hfZmxhZ3MgJiBCRVJMSU4yX0FWUExMX1NDUkFNQkxFX1FVSVJLKQpAQCAtMzg5LDUgKzM4OSw1IEBACiAJaW5pdC5udW1fcGFyZW50cyA9IDE7CiAJaW5pdC5mbGFncyA9IGZsYWdzOwogCi0JcmV0dXJuIGNsa19yZWdpc3RlcihOVUxMLCAmY2gtPmh3KTsKKwlyZXR1cm4gY2xrX2h3X3JlZ2lzdGVyKE5VTEwsICZjaC0+aHcpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItYXZwbGwuaCBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWF2cGxsLmgKaW5kZXggYTM3ZjUwNi4uMTdlMzExMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItYXZwbGwuaAorKysgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1hdnBsbC5oCkBAIC0xOSwxNyArMTksMTMgQEAKICNpZm5kZWYgX19CRVJMSU4yX0FWUExMX0gKICNkZWZpbmUgX19CRVJMSU4yX0FWUExMX0gKIAotc3RydWN0IGNsazsKLQogI2RlZmluZSBCRVJMSU4yX0FWUExMX0JJVF9RVUlSSwkJQklUKDApCiAjZGVmaW5lIEJFUkxJTjJfQVZQTExfU0NSQU1CTEVfUVVJUksJQklUKDEpCiAKLXN0cnVjdCBjbGsgKiBfX2luaXQKLWJlcmxpbjJfYXZwbGxfdmNvX3JlZ2lzdGVyKHZvaWQgX19pb21lbSAqYmFzZSwgY29uc3QgY2hhciAqbmFtZSwKK2ludCBiZXJsaW4yX2F2cGxsX3Zjb19yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsCiAJICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIHU4IHZjb19mbGFncywgdW5zaWduZWQgbG9uZyBmbGFncyk7CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQKLWJlcmxpbjJfYXZwbGxfY2hhbm5lbF9yZWdpc3Rlcih2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsCitpbnQgYmVybGluMl9hdnBsbF9jaGFubmVsX3JlZ2lzdGVyKHZvaWQgX19pb21lbSAqYmFzZSwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICAgIHU4IGluZGV4LCBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwgdTggY2hfZmxhZ3MsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItZGl2LmMgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1kaXYuYwppbmRleCA4MWZmOTdmLi40MWFiMmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1kaXYuYworKysgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1kaXYuYwpAQCAtMjM0LDcgKzIzNCw3IEBACiAJLmdldF9wYXJlbnQJPSBiZXJsaW4yX2Rpdl9nZXRfcGFyZW50LAogfTsKIAotc3RydWN0IGNsayAqIF9faW5pdAorc3RydWN0IGNsa19odyAqIF9faW5pdAogYmVybGluMl9kaXZfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGJlcmxpbjJfZGl2X21hcCAqbWFwLAogCQkgICAgIHZvaWQgX19pb21lbSAqYmFzZSwgY29uc3QgY2hhciAqbmFtZSwgdTggZGl2X2ZsYWdzLAogCQkgICAgIGNvbnN0IGNoYXIgKipwYXJlbnRfbmFtZXMsIGludCBudW1fcGFyZW50cywKQEAgLTI1OSw3ICsyNTksNyBAQAogCWlmICgoZGl2X2ZsYWdzICYgQkVSTElOMl9ESVZfSEFTX01VWCkgPT0gMCkKIAkJbXV4X29wcyA9IE5VTEw7CiAKLQlyZXR1cm4gY2xrX3JlZ2lzdGVyX2NvbXBvc2l0ZShOVUxMLCBuYW1lLCBwYXJlbnRfbmFtZXMsIG51bV9wYXJlbnRzLAorCXJldHVybiBjbGtfaHdfcmVnaXN0ZXJfY29tcG9zaXRlKE5VTEwsIG5hbWUsIHBhcmVudF9uYW1lcywgbnVtX3BhcmVudHMsCiAJCQkJICAgICAgJmRpdi0+aHcsIG11eF9vcHMsICZkaXYtPmh3LCByYXRlX29wcywKIAkJCQkgICAgICAmZGl2LT5odywgZ2F0ZV9vcHMsIGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLWRpdi5oIGIvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItZGl2LmgKaW5kZXggMTVlMzM4NC4uZTgzNWRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItZGl2LmgKKysrIGIvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItZGl2LmgKQEAgLTE5LDcgKzE5LDcgQEAKICNpZm5kZWYgX19CRVJMSU4yX0RJVl9ICiAjZGVmaW5lIF9fQkVSTElOMl9ESVZfSAogCi1zdHJ1Y3QgY2xrOworc3RydWN0IGNsa19odzsKIAogI2RlZmluZSBCRVJMSU4yX0RJVl9IQVNfR0FURQkJQklUKDApCiAjZGVmaW5lIEJFUkxJTjJfRElWX0hBU19NVVgJCUJJVCgxKQpAQCAtODAsNyArODAsNyBAQAogCXU4IGRpdl9mbGFnczsKIH07CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQKK3N0cnVjdCBjbGtfaHcgKgogYmVybGluMl9kaXZfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGJlcmxpbjJfZGl2X21hcCAqbWFwLAogCSAgICAgdm9pZCBfX2lvbWVtICpiYXNlLCAgY29uc3QgY2hhciAqbmFtZSwgdTggZGl2X2ZsYWdzLAogCSAgICAgY29uc3QgY2hhciAqKnBhcmVudF9uYW1lcywgaW50IG51bV9wYXJlbnRzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvYmVybGluL2JlcmxpbjItcGxsLmMgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1wbGwuYwppbmRleCAxYzIyOTRkLi40ZmZiZTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1wbGwuYworKysgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1wbGwuYwpAQCAtODQsNyArODQsNyBAQAogCS5yZWNhbGNfcmF0ZQk9IGJlcmxpbjJfcGxsX3JlY2FsY19yYXRlLAogfTsKIAotc3RydWN0IGNsayAqIF9faW5pdAoraW50IF9faW5pdAogYmVybGluMl9wbGxfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGJlcmxpbjJfcGxsX21hcCAqbWFwLAogCQkgICAgIHZvaWQgX19pb21lbSAqYmFzZSwgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwgdW5zaWduZWQgbG9uZyBmbGFncykKQEAgLTk0LDcgKzk0LDcgQEAKIAogCXBsbCA9IGt6YWxsb2Moc2l6ZW9mKCpwbGwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBsbCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJldHVybiAtRU5PTUVNOwogCiAJLyogY29weSBwbGxfbWFwIHRvIGFsbG93IF9faW5pdGNvbnN0ICovCiAJbWVtY3B5KCZwbGwtPm1hcCwgbWFwLCBzaXplb2YoKm1hcCkpOwpAQCAtMTA2LDUgKzEwNiw1IEBACiAJaW5pdC5udW1fcGFyZW50cyA9IDE7CiAJaW5pdC5mbGFncyA9IGZsYWdzOwogCi0JcmV0dXJuIGNsa19yZWdpc3RlcihOVUxMLCAmcGxsLT5odyk7CisJcmV0dXJuIGNsa19od19yZWdpc3RlcihOVUxMLCAmcGxsLT5odyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmVybGluMi1wbGwuaCBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLXBsbC5oCmluZGV4IDg4MzFjZTIuLjU4M2UwMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLXBsbC5oCisrKyBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZXJsaW4yLXBsbC5oCkBAIC0xOSw4ICsxOSw2IEBACiAjaWZuZGVmIF9fQkVSTElOMl9QTExfSAogI2RlZmluZSBfX0JFUkxJTjJfUExMX0gKIAotc3RydWN0IGNsazsKLQogc3RydWN0IGJlcmxpbjJfcGxsX21hcCB7CiAJY29uc3QgdTggdmNvZGl2WzE2XTsKIAl1OCBtdWx0OwpAQCAtMjksOSArMjcsOCBAQAogCXU4IGRpdnNlbF9zaGlmdDsKIH07CiAKLXN0cnVjdCBjbGsgKiBfX2luaXQKLWJlcmxpbjJfcGxsX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBiZXJsaW4yX3BsbF9tYXAgKm1hcCwKLQkJICAgICB2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCSAgICAgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworaW50IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBiZXJsaW4yX3BsbF9tYXAgKm1hcCwKKwkJCSB2b2lkIF9faW9tZW0gKmJhc2UsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgY29uc3QgY2hhciAqcGFyZW50X25hbWUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCiAjZW5kaWYgLyogX19CRVJMSU4yX1BMTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9iZXJsaW4vYmcyLmMgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmcyLmMKaW5kZXggMjNlMGUzYi4uZWRmM2I5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvYmVybGluL2JnMi5jCisrKyBiL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZzIuYwpAQCAtOTIsOCArOTIsNyBAQAogICovCiAKICNkZWZpbmUJTUFYX0NMS1MgNDEKLXN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzW01BWF9DTEtTXTsKLXN0YXRpYyBzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBjbGtfZGF0YTsKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOwogc3RhdGljIHZvaWQgX19pb21lbSAqZ2Jhc2U7CiAKQEAgLTUwNSw4ICs1MDQsMTcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudF9ucCA9IG9mX2dldF9wYXJlbnQobnApOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1s5XTsKIAlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyAqaHc7CisJc3RydWN0IGNsa19odyAqKmh3czsKIAl1OCBhdnBsbF9mbGFncyA9IDA7Ci0JaW50IG47CisJaW50IG4sIHJldDsKKworCWNsa19kYXRhID0ga3phbGxvYyhzaXplb2YoKmNsa19kYXRhKSArCisJCQkgICBzaXplb2YoKmNsa19kYXRhLT5od3MpICogTUFYX0NMS1MsIEdGUF9LRVJORUwpOworCWlmICghY2xrX2RhdGEpCisJCXJldHVybjsKKwljbGtfZGF0YS0+bnVtID0gTUFYX0NMS1M7CisJaHdzID0gY2xrX2RhdGEtPmh3czsKIAogCWdiYXNlID0gb2ZfaW9tYXAocGFyZW50X25wLCAwKTsKIAlpZiAoIWdiYXNlKQpAQCAtNTI2LDExOCArNTM0LDExOCBAQAogCX0KIAogCS8qIHNpbXBsZSByZWdpc3RlciBQTExzICovCi0JY2xrID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMl9wbGxfbWFwLCBnYmFzZSArIFJFR19TWVNQTExDVEwwLAorCXJldCA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfU1lTUExMQ1RMMCwKIAkJCQkgICBjbGtfbmFtZXNbU1lTUExMXSwgY2xrX25hbWVzW1JFRkNMS10sIDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAocmV0KQogCQlnb3RvIGJnMl9mYWlsOwogCi0JY2xrID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMl9wbGxfbWFwLCBnYmFzZSArIFJFR19NRU1QTExDVEwwLAorCXJldCA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfTUVNUExMQ1RMMCwKIAkJCQkgICBjbGtfbmFtZXNbTUVNUExMXSwgY2xrX25hbWVzW1JFRkNMS10sIDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAocmV0KQogCQlnb3RvIGJnMl9mYWlsOwogCi0JY2xrID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMl9wbGxfbWFwLCBnYmFzZSArIFJFR19DUFVQTExDVEwwLAorCXJldCA9IGJlcmxpbjJfcGxsX3JlZ2lzdGVyKCZiZzJfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfQ1BVUExMQ1RMMCwKIAkJCQkgICBjbGtfbmFtZXNbQ1BVUExMXSwgY2xrX25hbWVzW1JFRkNMS10sIDApOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAocmV0KQogCQlnb3RvIGJnMl9mYWlsOwogCiAJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAibWFydmVsbCxiZXJsaW4yLWdsb2JhbC1yZWdpc3RlciIpKQogCQlhdnBsbF9mbGFncyB8PSBCRVJMSU4yX0FWUExMX1NDUkFNQkxFX1FVSVJLOwogCiAJLyogYXVkaW8vdmlkZW8gVkNPcyAqLwotCWNsayA9IGJlcmxpbjJfYXZwbGxfdmNvX3JlZ2lzdGVyKGdiYXNlICsgUkVHX0FWUExMQ1RMMCwgImF2cGxsX3Zjb0EiLAorCXJldCA9IGJlcmxpbjJfYXZwbGxfdmNvX3JlZ2lzdGVyKGdiYXNlICsgUkVHX0FWUExMQ1RMMCwgImF2cGxsX3Zjb0EiLAogCQkJIGNsa19uYW1lc1tSRUZDTEtdLCBhdnBsbF9mbGFncywgMCk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChyZXQpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAlmb3IgKG4gPSAwOyBuIDwgODsgbisrKSB7Ci0JCWNsayA9IGJlcmxpbjJfYXZwbGxfY2hhbm5lbF9yZWdpc3RlcihnYmFzZSArIFJFR19BVlBMTENUTDAsCisJCXJldCA9IGJlcmxpbjJfYXZwbGxfY2hhbm5lbF9yZWdpc3RlcihnYmFzZSArIFJFR19BVlBMTENUTDAsCiAJCQkgICAgIGNsa19uYW1lc1tBVlBMTF9BMSArIG5dLCBuLCAiYXZwbGxfdmNvQSIsCiAJCQkgICAgIGF2cGxsX2ZsYWdzLCAwKTsKLQkJaWYgKElTX0VSUihjbGspKQorCQlpZiAocmV0KQogCQkJZ290byBiZzJfZmFpbDsKIAl9CiAKLQljbGsgPSBiZXJsaW4yX2F2cGxsX3Zjb19yZWdpc3RlcihnYmFzZSArIFJFR19BVlBMTENUTDMxLCAiYXZwbGxfdmNvQiIsCisJcmV0ID0gYmVybGluMl9hdnBsbF92Y29fcmVnaXN0ZXIoZ2Jhc2UgKyBSRUdfQVZQTExDVEwzMSwgImF2cGxsX3Zjb0IiLAogCQkJCSBjbGtfbmFtZXNbUkVGQ0xLXSwgQkVSTElOMl9BVlBMTF9CSVRfUVVJUksgfAogCQkJCSBhdnBsbF9mbGFncywgMCk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChyZXQpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAlmb3IgKG4gPSAwOyBuIDwgODsgbisrKSB7Ci0JCWNsayA9IGJlcmxpbjJfYXZwbGxfY2hhbm5lbF9yZWdpc3RlcihnYmFzZSArIFJFR19BVlBMTENUTDMxLAorCQlyZXQgPSBiZXJsaW4yX2F2cGxsX2NoYW5uZWxfcmVnaXN0ZXIoZ2Jhc2UgKyBSRUdfQVZQTExDVEwzMSwKIAkJCSAgICAgY2xrX25hbWVzW0FWUExMX0IxICsgbl0sIG4sICJhdnBsbF92Y29CIiwKIAkJCSAgICAgQkVSTElOMl9BVlBMTF9CSVRfUVVJUksgfCBhdnBsbF9mbGFncywgMCk7Ci0JCWlmIChJU19FUlIoY2xrKSkKKwkJaWYgKHJldCkKIAkJCWdvdG8gYmcyX2ZhaWw7CiAJfQogCiAJLyogcmVmZXJlbmNlIGNsb2NrIGJ5cGFzcyBzd2l0Y2hlcyAqLwogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tTWVNQTExdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tSRUZDTEtdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgInN5c3BsbF9ieXAiLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsICJzeXNwbGxfYnlwIiwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NXSVRDSDAsIDAsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7Ci0JY2xrX25hbWVzW1NZU1BMTF0gPSBfX2Nsa19nZXRfbmFtZShjbGspOworCWNsa19uYW1lc1tTWVNQTExdID0gY2xrX2h3X2dldF9uYW1lKGh3KTsKIAogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tNRU1QTExdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tSRUZDTEtdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgIm1lbXBsbF9ieXAiLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsICJtZW1wbGxfYnlwIiwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NXSVRDSDAsIDEsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7Ci0JY2xrX25hbWVzW01FTVBMTF0gPSBfX2Nsa19nZXRfbmFtZShjbGspOworCWNsa19uYW1lc1tNRU1QTExdID0gY2xrX2h3X2dldF9uYW1lKGh3KTsKIAogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tDUFVQTExdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tSRUZDTEtdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgImNwdXBsbF9ieXAiLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsICJjcHVwbGxfYnlwIiwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NXSVRDSDAsIDIsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7Ci0JY2xrX25hbWVzW0NQVVBMTF0gPSBfX2Nsa19nZXRfbmFtZShjbGspOworCWNsa19uYW1lc1tDUFVQTExdID0gY2xrX2h3X2dldF9uYW1lKGh3KTsKIAogCS8qIGNsb2NrIG11eGVzICovCiAJcGFyZW50X25hbWVzWzBdID0gY2xrX25hbWVzW0FWUExMX0IzXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbQVZQTExfQTNdOwotCWNsayA9IGNsa19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW0FVRElPMV9QTExdLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsIGNsa19uYW1lc1tBVURJTzFfUExMXSwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NFTEVDVDIsIDI5LCAxLCAwLCAmbG9jayk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChJU19FUlIoaHcpKQogCQlnb3RvIGJnMl9mYWlsOwogCiAJcGFyZW50X25hbWVzWzBdID0gY2xrX25hbWVzW1ZJREVPMF9QTExdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tWSURFT19FWFQwXTsKLQljbGsgPSBjbGtfcmVnaXN0ZXJfbXV4KE5VTEwsIGNsa19uYW1lc1tWSURFTzBfSU5dLCBwYXJlbnRfbmFtZXMsIDIsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4KE5VTEwsIGNsa19uYW1lc1tWSURFTzBfSU5dLCBwYXJlbnRfbmFtZXMsIDIsCiAJCQkgICAgICAgMCwgZ2Jhc2UgKyBSRUdfQ0xLU0VMRUNUMywgNCwgMSwgMCwgJmxvY2spOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJZ290byBiZzJfZmFpbDsKIAogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tWSURFTzFfUExMXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbVklERU9fRVhUMF07Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8xX0lOXSwgcGFyZW50X25hbWVzLCAyLAorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8xX0lOXSwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NFTEVDVDMsIDYsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAlwYXJlbnRfbmFtZXNbMF0gPSBjbGtfbmFtZXNbQVZQTExfQTJdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tBVlBMTF9CMl07Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8xX1BMTF0sIHBhcmVudF9uYW1lcywgMiwKKwlodyA9IGNsa19od19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW1ZJREVPMV9QTExdLCBwYXJlbnRfbmFtZXMsIDIsCiAJCQkgICAgICAgMCwgZ2Jhc2UgKyBSRUdfQ0xLU0VMRUNUMywgNywgMSwgMCwgJmxvY2spOwotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJZ290byBiZzJfZmFpbDsKIAogCXBhcmVudF9uYW1lc1swXSA9IGNsa19uYW1lc1tWSURFTzJfUExMXTsKIAlwYXJlbnRfbmFtZXNbMV0gPSBjbGtfbmFtZXNbVklERU9fRVhUMF07Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8yX0lOXSwgcGFyZW50X25hbWVzLCAyLAorCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8yX0lOXSwgcGFyZW50X25hbWVzLCAyLAogCQkJICAgICAgIDAsIGdiYXNlICsgUkVHX0NMS1NFTEVDVDMsIDksIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAlwYXJlbnRfbmFtZXNbMF0gPSBjbGtfbmFtZXNbQVZQTExfQjFdOwogCXBhcmVudF9uYW1lc1sxXSA9IGNsa19uYW1lc1tBVlBMTF9BNV07Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCBjbGtfbmFtZXNbVklERU8yX1BMTF0sIHBhcmVudF9uYW1lcywgMiwKKwlodyA9IGNsa19od19yZWdpc3Rlcl9tdXgoTlVMTCwgY2xrX25hbWVzW1ZJREVPMl9QTExdLCBwYXJlbnRfbmFtZXMsIDIsCiAJCQkgICAgICAgMCwgZ2Jhc2UgKyBSRUdfQ0xLU0VMRUNUMywgMTAsIDEsIDAsICZsb2NrKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihodykpCiAJCWdvdG8gYmcyX2ZhaWw7CiAKIAkvKiBjbG9jayBkaXZpZGVyIGNlbGxzICovCkBAIC02NDgsNyArNjU2LDcgQEAKIAkJZm9yIChrID0gMDsgayA8IGRkLT5udW1fcGFyZW50czsgaysrKQogCQkJcGFyZW50X25hbWVzW2tdID0gY2xrX25hbWVzW2RkLT5wYXJlbnRfaWRzW2tdXTsKIAotCQljbGtzW0NMS0lEX1NZUyArIG5dID0gYmVybGluMl9kaXZfcmVnaXN0ZXIoJmRkLT5tYXAsIGdiYXNlLAorCQlod3NbQ0xLSURfU1lTICsgbl0gPSBiZXJsaW4yX2Rpdl9yZWdpc3RlcigmZGQtPm1hcCwgZ2Jhc2UsCiAJCQkJZGQtPm5hbWUsIGRkLT5kaXZfZmxhZ3MsIHBhcmVudF9uYW1lcywKIAkJCQlkZC0+bnVtX3BhcmVudHMsIGRkLT5mbGFncywgJmxvY2spOwogCX0KQEAgLTY1NywxOCArNjY1LDE4IEBACiAJZm9yIChuID0gMDsgbiA8IEFSUkFZX1NJWkUoYmcyX2dhdGVzKTsgbisrKSB7CiAJCWNvbnN0IHN0cnVjdCBiZXJsaW4yX2dhdGVfZGF0YSAqZ2QgPSAmYmcyX2dhdGVzW25dOwogCi0JCWNsa3NbQ0xLSURfR0VUSDAgKyBuXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsIGdkLT5uYW1lLAorCQlod3NbQ0xLSURfR0VUSDAgKyBuXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsIGdkLT5uYW1lLAogCQkJICAgIGdkLT5wYXJlbnRfbmFtZSwgZ2QtPmZsYWdzLCBnYmFzZSArIFJFR19DTEtFTkFCTEUsCiAJCQkgICAgZ2QtPmJpdF9pZHgsIDAsICZsb2NrKTsKIAl9CiAKIAkvKiB0d2RjbGsgaXMgZGVyaXZlZCBmcm9tIGNwdS8zICovCi0JY2xrc1tDTEtJRF9UV0RdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAidHdkIiwgImNwdSIsIDAsIDEsIDMpOworCWh3c1tDTEtJRF9UV0RdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAidHdkIiwgImNwdSIsIDAsIDEsIDMpOwogCiAJLyogY2hlY2sgZm9yIGVycm9ycyBvbiBsZWFmIGNsb2NrcyAqLwogCWZvciAobiA9IDA7IG4gPCBNQVhfQ0xLUzsgbisrKSB7Ci0JCWlmICghSVNfRVJSKGNsa3Nbbl0pKQorCQlpZiAoIUlTX0VSUihod3Nbbl0pKQogCQkJY29udGludWU7CiAKIAkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIGxlYWYgY2xvY2sgJWRcbiIsCkBAIC02NzcsOSArNjg1LDcgQEAKIAl9CiAKIAkvKiByZWdpc3RlciBjbGstcHJvdmlkZXIgKi8KLQljbGtfZGF0YS5jbGtzID0gY2xrczsKLQljbGtfZGF0YS5jbGtfbnVtID0gTUFYX0NMS1M7Ci0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgJmNsa19kYXRhKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7CiAKIAlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZzJxLmMgYi9kcml2ZXJzL2Nsay9iZXJsaW4vYmcycS5jCmluZGV4IGYxNDQ1NDcuLjA3MThlODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Jlcmxpbi9iZzJxLmMKKysrIGIvZHJpdmVycy9jbGsvYmVybGluL2JnMnEuYwpAQCAtNDYsOCArNDYsNyBAQAogI2RlZmluZSBSRUdfU0RJTzFYSU5fQ0xLQ1RMCTB4MDE1YwogCiAjZGVmaW5lCU1BWF9DTEtTIDI4Ci1zdGF0aWMgc3RydWN0IGNsayAqY2xrc1tNQVhfQ0xLU107Ci1zdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGE7CitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOwogc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKIHN0YXRpYyB2b2lkIF9faW9tZW0gKmdiYXNlOwogc3RhdGljIHZvaWQgX19pb21lbSAqY3B1cGxsX2Jhc2U7CkBAIC0yOTMsNyArMjkyLDE1IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnRfbnAgPSBvZl9nZXRfcGFyZW50KG5wKTsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbOV07CiAJc3RydWN0IGNsayAqY2xrOwotCWludCBuOworCXN0cnVjdCBjbGtfaHcgKipod3M7CisJaW50IG4sIHJldDsKKworCWNsa19kYXRhID0ga3phbGxvYyhzaXplb2YoKmNsa19kYXRhKSArCisJCQkgICBzaXplb2YoKmNsa19kYXRhLT5od3MpICogTUFYX0NMS1MsIEdGUF9LRVJORUwpOworCWlmICghY2xrX2RhdGEpCisJCXJldHVybjsKKwljbGtfZGF0YS0+bnVtID0gTUFYX0NMS1M7CisJaHdzID0gY2xrX2RhdGEtPmh3czsKIAogCWdiYXNlID0gb2ZfaW9tYXAocGFyZW50X25wLCAwKTsKIAlpZiAoIWdiYXNlKSB7CkBAIC0zMTcsMTQgKzMyNCwxNCBAQAogCX0KIAogCS8qIHNpbXBsZSByZWdpc3RlciBQTExzICovCi0JY2xrID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMnFfcGxsX21hcCwgZ2Jhc2UgKyBSRUdfU1lTUExMQ1RMMCwKKwlyZXQgPSBiZXJsaW4yX3BsbF9yZWdpc3RlcigmYmcycV9wbGxfbWFwLCBnYmFzZSArIFJFR19TWVNQTExDVEwwLAogCQkJCSAgIGNsa19uYW1lc1tTWVNQTExdLCBjbGtfbmFtZXNbUkVGQ0xLXSwgMCk7Ci0JaWYgKElTX0VSUihjbGspKQorCWlmIChyZXQpCiAJCWdvdG8gYmcycV9mYWlsOwogCi0JY2xrID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMnFfcGxsX21hcCwgY3B1cGxsX2Jhc2UsCisJcmV0ID0gYmVybGluMl9wbGxfcmVnaXN0ZXIoJmJnMnFfcGxsX21hcCwgY3B1cGxsX2Jhc2UsCiAJCQkJICAgY2xrX25hbWVzW0NQVVBMTF0sIGNsa19uYW1lc1tSRUZDTEtdLCAwKTsKLQlpZiAoSVNfRVJSKGNsaykpCisJaWYgKHJldCkKIAkJZ290byBiZzJxX2ZhaWw7CiAKIAkvKiBUT0RPOiBhZGQgQkcyUSBBVlBMTCAqLwpAQCAtMzQyLDcgKzM0OSw3IEBACiAJCWZvciAoayA9IDA7IGsgPCBkZC0+bnVtX3BhcmVudHM7IGsrKykKIAkJCXBhcmVudF9uYW1lc1trXSA9IGNsa19uYW1lc1tkZC0+cGFyZW50X2lkc1trXV07CiAKLQkJY2xrc1tDTEtJRF9TWVMgKyBuXSA9IGJlcmxpbjJfZGl2X3JlZ2lzdGVyKCZkZC0+bWFwLCBnYmFzZSwKKwkJaHdzW0NMS0lEX1NZUyArIG5dID0gYmVybGluMl9kaXZfcmVnaXN0ZXIoJmRkLT5tYXAsIGdiYXNlLAogCQkJCWRkLT5uYW1lLCBkZC0+ZGl2X2ZsYWdzLCBwYXJlbnRfbmFtZXMsCiAJCQkJZGQtPm51bV9wYXJlbnRzLCBkZC0+ZmxhZ3MsICZsb2NrKTsKIAl9CkBAIC0zNTEsMjIgKzM1OCwyMiBAQAogCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKGJnMnFfZ2F0ZXMpOyBuKyspIHsKIAkJY29uc3Qgc3RydWN0IGJlcmxpbjJfZ2F0ZV9kYXRhICpnZCA9ICZiZzJxX2dhdGVzW25dOwogCi0JCWNsa3NbQ0xLSURfR0ZYMkRBWEkgKyBuXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsIGdkLT5uYW1lLAorCQlod3NbQ0xLSURfR0ZYMkRBWEkgKyBuXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsIGdkLT5uYW1lLAogCQkJICAgIGdkLT5wYXJlbnRfbmFtZSwgZ2QtPmZsYWdzLCBnYmFzZSArIFJFR19DTEtFTkFCTEUsCiAJCQkgICAgZ2QtPmJpdF9pZHgsIDAsICZsb2NrKTsKIAl9CiAKIAkvKiBjcHVjbGsgZGl2aWRlciBpcyBmaXhlZCB0byAxICovCi0JY2xrc1tDTEtJRF9DUFVdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAiY3B1IiwgY2xrX25hbWVzW0NQVVBMTF0sCisJaHdzW0NMS0lEX0NQVV0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsICJjcHUiLCBjbGtfbmFtZXNbQ1BVUExMXSwKIAkJCQkJICAwLCAxLCAxKTsKIAkvKiB0d2RjbGsgaXMgZGVyaXZlZCBmcm9tIGNwdS8zICovCi0JY2xrc1tDTEtJRF9UV0RdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAidHdkIiwgImNwdSIsIDAsIDEsIDMpOworCWh3c1tDTEtJRF9UV0RdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAidHdkIiwgImNwdSIsIDAsIDEsIDMpOwogCiAJLyogY2hlY2sgZm9yIGVycm9ycyBvbiBsZWFmIGNsb2NrcyAqLwogCWZvciAobiA9IDA7IG4gPCBNQVhfQ0xLUzsgbisrKSB7Ci0JCWlmICghSVNfRVJSKGNsa3Nbbl0pKQorCQlpZiAoIUlTX0VSUihod3Nbbl0pKQogCQkJY29udGludWU7CiAKIAkJcHJfZXJyKCIlczogVW5hYmxlIHRvIHJlZ2lzdGVyIGxlYWYgY2xvY2sgJWRcbiIsCkBAIC0zNzUsOSArMzgyLDcgQEAKIAl9CiAKIAkvKiByZWdpc3RlciBjbGstcHJvdmlkZXIgKi8KLQljbGtfZGF0YS5jbGtzID0gY2xrczsKLQljbGtfZGF0YS5jbGtfbnVtID0gTUFYX0NMS1M7Ci0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgJmNsa19kYXRhKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7CiAKIAlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1hc205MjYwLmMgYi9kcml2ZXJzL2Nsay9jbGstYXNtOTI2MC5jCmluZGV4IDkwODk3YWYuLmVhODU2ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1hc205MjYwLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWFzbTkyNjAuYwpAQCAtNjgsOCArNjgsNyBAQAogI2RlZmluZSBIV19MQ0RDTEtESVYJCTB4MDFmYwogI2RlZmluZSBIV19BRENBTkFDTEtESVYJCTB4MDIwMAogCi1zdGF0aWMgc3RydWN0IGNsayAqY2xrc1tNQVhfQ0xLU107Ci1zdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGE7CitzdGF0aWMgc3RydWN0IGNsa19od19vbmVjZWxsX2RhdGEgKmNsa19kYXRhOwogc3RhdGljIERFRklORV9TUElOTE9DSyhhc205MjYwX2Nsa19sb2NrKTsKIAogc3RydWN0IGFzbTkyNjBfZGl2X2NsayB7CkBAIC0yNjcsMTIgKzI2NiwyMCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgYXNtOTI2MF9hY2NfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlzdHJ1Y3QgY2xrX2h3ICoqaHdzOwogCWNvbnN0IGNoYXIgKnJlZl9jbGssICpwbGxfY2xrID0gInBsbCI7CiAJdTMyIHJhdGU7CiAJaW50IG47CiAJdTMyIGFjY3VyYWN5ID0gMDsKIAorCWNsa19kYXRhID0ga3phbGxvYyhzaXplb2YoKmNsa19kYXRhKSArCisJCQkgICBzaXplb2YoKmNsa19kYXRhLT5od3MpICogTUFYX0NMS1MsIEdGUF9LRVJORUwpOworCWlmICghY2xrX2RhdGEpCisJCXJldHVybjsKKwljbGtfZGF0YS0+bnVtID0gTUFYX0NMS1M7CisJaHdzID0gY2xrX2RhdGEtPmh3czsKKwogCWJhc2UgPSBvZl9pb19yZXF1ZXN0X2FuZF9tYXAobnAsIDAsIG5wLT5uYW1lKTsKIAlpZiAoSVNfRVJSKGJhc2UpKQogCQlwYW5pYygiJXM6IHVuYWJsZSB0byBtYXAgcmVzb3VyY2UiLCBucC0+bmFtZSk7CkBAIC0yODIsMTAgKzI4OSwxMCBAQAogCiAJcmVmX2NsayA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUobnAsIDApOwogCWFjY3VyYWN5ID0gY2xrX2dldF9hY2N1cmFjeShfX2Nsa19sb29rdXAocmVmX2NsaykpOwotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlX3dpdGhfYWNjdXJhY3koTlVMTCwgcGxsX2NsaywKKwlodyA9IGNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlX3dpdGhfYWNjdXJhY3koTlVMTCwgcGxsX2NsaywKIAkJCXJlZl9jbGssIDAsIHJhdGUsIGFjY3VyYWN5KTsKIAotCWlmIChJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGh3KSkKIAkJcGFuaWMoIiVzOiBjYW4ndCByZWdpc3RlciBSRUZDTEsuIENoZWNrIERUISIsIG5wLT5uYW1lKTsKIAogCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKGFzbTkyNjBfbXV4X2Nsa3MpOyBuKyspIHsKQEAgLTI5Myw3ICszMDAsNyBAQAogCiAJCW1jLT5wYXJlbnRfbmFtZXNbMF0gPSByZWZfY2xrOwogCQltYy0+cGFyZW50X25hbWVzWzFdID0gcGxsX2NsazsKLQkJY2xrID0gY2xrX3JlZ2lzdGVyX211eF90YWJsZShOVUxMLCBtYy0+bmFtZSwgbWMtPnBhcmVudF9uYW1lcywKKwkJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfbXV4X3RhYmxlKE5VTEwsIG1jLT5uYW1lLCBtYy0+cGFyZW50X25hbWVzLAogCQkJCW1jLT5udW1fcGFyZW50cywgbWMtPmZsYWdzLCBiYXNlICsgbWMtPm9mZnNldCwKIAkJCQkwLCBtYy0+bWFzaywgMCwgbWMtPnRhYmxlLCAmYXNtOTI2MF9jbGtfbG9jayk7CiAJfQpAQCAtMzAyLDcgKzMwOSw3IEBACiAJZm9yIChuID0gMDsgbiA8IEFSUkFZX1NJWkUoYXNtOTI2MF9tdXhfZ2F0ZXMpOyBuKyspIHsKIAkJY29uc3Qgc3RydWN0IGFzbTkyNjBfZ2F0ZV9kYXRhICpnZCA9ICZhc205MjYwX211eF9nYXRlc1tuXTsKIAotCQljbGsgPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCBnZC0+bmFtZSwKKwkJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCBnZC0+bmFtZSwKIAkJCWdkLT5wYXJlbnRfbmFtZSwgZ2QtPmZsYWdzIHwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKIAkJCWJhc2UgKyBnZC0+cmVnLCBnZC0+Yml0X2lkeCwgMCwgJmFzbTkyNjBfY2xrX2xvY2spOwogCX0KQEAgLTMxMSw3ICszMTgsNyBAQAogCWZvciAobiA9IDA7IG4gPCBBUlJBWV9TSVpFKGFzbTkyNjBfZGl2X2Nsa3MpOyBuKyspIHsKIAkJY29uc3Qgc3RydWN0IGFzbTkyNjBfZGl2X2NsayAqZGMgPSAmYXNtOTI2MF9kaXZfY2xrc1tuXTsKIAotCQljbGtzW2RjLT5pZHhdID0gY2xrX3JlZ2lzdGVyX2RpdmlkZXIoTlVMTCwgZGMtPm5hbWUsCisJCWh3c1tkYy0+aWR4XSA9IGNsa19od19yZWdpc3Rlcl9kaXZpZGVyKE5VTEwsIGRjLT5uYW1lLAogCQkJCWRjLT5wYXJlbnRfbmFtZSwgQ0xLX1NFVF9SQVRFX1BBUkVOVCwKIAkJCQliYXNlICsgZGMtPnJlZywgMCwgOCwgQ0xLX0RJVklERVJfT05FX0JBU0VELAogCQkJCSZhc205MjYwX2Nsa19sb2NrKTsKQEAgLTMyMSwxNCArMzI4LDE0IEBACiAJZm9yIChuID0gMDsgbiA8IEFSUkFZX1NJWkUoYXNtOTI2MF9haGJfZ2F0ZXMpOyBuKyspIHsKIAkJY29uc3Qgc3RydWN0IGFzbTkyNjBfZ2F0ZV9kYXRhICpnZCA9ICZhc205MjYwX2FoYl9nYXRlc1tuXTsKIAotCQljbGtzW2dkLT5pZHhdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgZ2QtPm5hbWUsCisJCWh3c1tnZC0+aWR4XSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsIGdkLT5uYW1lLAogCQkJCWdkLT5wYXJlbnRfbmFtZSwgZ2QtPmZsYWdzLCBiYXNlICsgZ2QtPnJlZywKIAkJCQlnZC0+Yml0X2lkeCwgMCwgJmFzbTkyNjBfY2xrX2xvY2spOwogCX0KIAogCS8qIGNoZWNrIGZvciBlcnJvcnMgb24gbGVhZiBjbG9ja3MgKi8KIAlmb3IgKG4gPSAwOyBuIDwgTUFYX0NMS1M7IG4rKykgewotCQlpZiAoIUlTX0VSUihjbGtzW25dKSkKKwkJaWYgKCFJU19FUlIoaHdzW25dKSkKIAkJCWNvbnRpbnVlOwogCiAJCXByX2VycigiJXM6IFVuYWJsZSB0byByZWdpc3RlciBsZWFmIGNsb2NrICVkXG4iLApAQCAtMzM3LDkgKzM0NCw3IEBACiAJfQogCiAJLyogcmVnaXN0ZXIgY2xrLXByb3ZpZGVyICovCi0JY2xrX2RhdGEuY2xrcyA9IGNsa3M7Ci0JY2xrX2RhdGEuY2xrX251bSA9IE1BWF9DTEtTOwotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihucCwgb2ZfY2xrX2h3X29uZWNlbGxfZ2V0LCBjbGtfZGF0YSk7CiAJcmV0dXJuOwogZmFpbDoKIAlpb3VubWFwKGJhc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWF4aS1jbGtnZW4uYyBiL2RyaXZlcnMvY2xrL2Nsay1heGktY2xrZ2VuLmMKaW5kZXggMzI5NGRiMy4uNWU5MThlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLWF4aS1jbGtnZW4uYworKysgYi9kcml2ZXJzL2Nsay9jbGstYXhpLWNsa2dlbi5jCkBAIC0zOTIsOCArMzkyLDggQEAKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbMl07CiAJY29uc3QgY2hhciAqY2xrX25hbWU7CiAJc3RydWN0IHJlc291cmNlICptZW07Ci0Jc3RydWN0IGNsayAqY2xrOwogCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CiAKIAlpZiAoIXBkZXYtPmRldi5vZl9ub2RlKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQzMywxMiArNDMzLDEyIEBACiAJYXhpX2Nsa2dlbl9tbWNtX2VuYWJsZShheGlfY2xrZ2VuLCBmYWxzZSk7CiAKIAlheGlfY2xrZ2VuLT5jbGtfaHcuaW5pdCA9ICZpbml0OwotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZheGlfY2xrZ2VuLT5jbGtfaHcpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmcGRldi0+ZGV2LCAmYXhpX2Nsa2dlbi0+Y2xrX2h3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIG9mX2Nsa19hZGRfcHJvdmlkZXIocGRldi0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwKLQkJCQkgICAgY2xrKTsKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihwZGV2LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsCisJCQkJICAgICAgJmF4aV9jbGtnZW4tPmNsa19odyk7CiB9CiAKIHN0YXRpYyBpbnQgYXhpX2Nsa2dlbl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1heG01NTE2LmMgYi9kcml2ZXJzL2Nsay9jbGstYXhtNTUxNi5jCmluZGV4IGM3YzkxYTUuLjVkN2FlMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1heG01NTE2LmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWF4bTU1MTYuYwpAQCAtNTE2LDYgKzUxNiwxOSBAQAogCVtBWFhJQV9DTEtfTU1DXSAgICAgID0gJmNsa19tbWNfbXV4LmFjbGssCiB9OwogCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitvZl9jbGtfYXhtY2xrX2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICp1bnVzZWQpCit7CisJdW5zaWduZWQgaW50IGlkeCA9IGNsa3NwZWMtPmFyZ3NbMF07CisKKwlpZiAoaWR4ID49IEFSUkFZX1NJWkUoYXhtY2xrX2Nsb2NrcykpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBpbmRleCAldVxuIiwgX19mdW5jX18sIGlkeCk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXJldHVybiAmYXhtY2xrX2Nsb2Nrc1tpZHhdLT5odzsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGF4bWNsa19yZWdtYXBfY29uZmlnID0gewogCS5yZWdfYml0cwk9IDMyLAogCS5yZWdfc3RyaWRlCT0gNCwKQEAgLTUzMCwyMSArNTQzLDE0IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYXhtY2xrX21hdGNoX3RhYmxlKTsKIAotc3RydWN0IGF4bWNsa19wcml2IHsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBvbmVjZWxsOwotCXN0cnVjdCBjbGsgKmNsa3NbXTsKLX07Ci0KIHN0YXRpYyBpbnQgYXhtY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCBpLCByZXQ7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXNpemVfdCBudW1fY2xrczsKLQlzdHJ1Y3QgYXhtY2xrX3ByaXYgKnByaXY7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOwpAQCAtNTU3LDI5ICs1NjMsMTggQEAKIAogCW51bV9jbGtzID0gQVJSQVlfU0laRShheG1jbGtfY2xvY2tzKTsKIAlwcl9pbmZvKCJheG1jbGs6IHN1cHBvcnRpbmcgJXp1IGNsb2Nrc1xuIiwgbnVtX2Nsa3MpOwotCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByaXYpICsgc2l6ZW9mKCpwcml2LT5jbGtzKSAqIG51bV9jbGtzLAotCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghcHJpdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcml2LT5vbmVjZWxsLmNsa3MgPSBwcml2LT5jbGtzOwotCXByaXYtPm9uZWNlbGwuY2xrX251bSA9IG51bV9jbGtzOwogCiAJLyogVXBkYXRlIGVhY2ggZW50cnkgd2l0aCB0aGUgYWxsb2NhdGVkIHJlZ21hcCBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrCiAJICogd2l0aCB0aGUgY29tbW9uIGNsb2NrIGZyYW1ld29yawogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fY2xrczsgaSsrKSB7CiAJCWF4bWNsa19jbG9ja3NbaV0tPnJlZ21hcCA9IHJlZ21hcDsKLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoZGV2LCAmYXhtY2xrX2Nsb2Nrc1tpXS0+aHcpOwotCQlpZiAoSVNfRVJSKGNsaykpCi0JCQlyZXR1cm4gUFRSX0VSUihjbGspOwotCQlwcml2LT5jbGtzW2ldID0gY2xrOworCQlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihkZXYsICZheG1jbGtfY2xvY2tzW2ldLT5odyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIoZGV2LT5vZl9ub2RlLAotCQkJCSAgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgJnByaXYtPm9uZWNlbGwpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihkZXYtPm9mX25vZGUsIG9mX2Nsa19heG1jbGtfZ2V0LCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBheG1jbGtfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstY2RjZTcwNi5jIGIvZHJpdmVycy9jbGsvY2xrLWNkY2U3MDYuYwppbmRleCAwMTg3N2Y2Li5mMjFkOTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstY2RjZTcwNi5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1jZGNlNzA2LmMKQEAgLTcxLDcgKzcxLDYgQEAKIAlzdHJ1Y3QgY2RjZTcwNl9kZXZfZGF0YSAqZGV2X2RhdGE7CiAJdW5zaWduZWQgaWR4OwogCXVuc2lnbmVkIHBhcmVudDsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IGNsa19odyBodzsKIAl1bnNpZ25lZCBkaXY7CiAJdW5zaWduZWQgbXVsOwpAQCAtODEsOCArODAsNiBAQAogc3RydWN0IGNkY2U3MDZfZGV2X2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIG9uZWNlbGw7Ci0Jc3RydWN0IGNsayAqY2xrc1s2XTsKIAlzdHJ1Y3QgY2xrICpjbGtpbl9jbGtbMl07CiAJY29uc3QgY2hhciAqY2xraW5fbmFtZVsyXTsKIAlzdHJ1Y3QgY2RjZTcwNl9od19kYXRhIGNsa2luWzFdOwpAQCAtNDU1LDE4ICs0NTIsMTkgQEAKIAkJCSAgICAgICBzdHJ1Y3QgY2xrX2luaXRfZGF0YSAqaW5pdCkKIHsKIAl1bnNpZ25lZCBpOworCWludCByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2h3OyArK2ksICsraHcpIHsKIAkJaW5pdC0+bmFtZSA9IGNsa19uYW1lc1tpXTsKIAkJaHctPmRldl9kYXRhID0gY2RjZTsKIAkJaHctPmlkeCA9IGk7CiAJCWh3LT5ody5pbml0ID0gaW5pdDsKLQkJaHctPmNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjZGNlLT5jbGllbnQtPmRldiwKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNkY2UtPmNsaWVudC0+ZGV2LAogCQkJCQkgICAgJmh3LT5odyk7Ci0JCWlmIChJU19FUlIoaHctPmNsaykpIHsKKwkJaWYgKHJldCkgewogCQkJZGV2X2VycigmY2RjZS0+Y2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgJXNcbiIsCiAJCQkJY2xrX25hbWVzW2ldKTsKLQkJCXJldHVybiBQVFJfRVJSKGh3LT5jbGspOworCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIAlyZXR1cm4gMDsKQEAgLTYxMywxMyArNjExLDIzIEBACiAJCQljZGNlLT5jbGtvdXRbaV0ucGFyZW50KTsKIAl9CiAKLQlyZXQgPSBjZGNlNzA2X3JlZ2lzdGVyX2h3KGNkY2UsIGNkY2UtPmNsa291dCwKLQkJCQkgIEFSUkFZX1NJWkUoY2RjZS0+Y2xrb3V0KSwKLQkJCQkgIGNkY2U3MDZfY2xrb3V0X25hbWUsICZpbml0KTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjZGNlLT5jbGtvdXQpOyArK2kpCi0JCWNkY2UtPmNsa3NbaV0gPSBjZGNlLT5jbGtvdXRbaV0uY2xrOworCXJldHVybiBjZGNlNzA2X3JlZ2lzdGVyX2h3KGNkY2UsIGNkY2UtPmNsa291dCwKKwkJCQkgICBBUlJBWV9TSVpFKGNkY2UtPmNsa291dCksCisJCQkJICAgY2RjZTcwNl9jbGtvdXRfbmFtZSwgJmluaXQpOworfQogCi0JcmV0dXJuIHJldDsKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICoKK29mX2Nsa19jZGNlX2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjZGNlNzA2X2Rldl9kYXRhICpjZGNlID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gQVJSQVlfU0laRShjZGNlLT5jbGtvdXQpKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggJXVcbiIsIF9fZnVuY19fLCBpZHgpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gJmNkY2UtPmNsa291dFtpZHhdLmh3OwogfQogCiBzdGF0aWMgaW50IGNkY2U3MDZfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKQEAgLTY1NywxMiArNjY1LDggQEAKIAlyZXQgPSBjZGNlNzA2X3JlZ2lzdGVyX2Nsa291dHMoY2RjZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JY2RjZS0+b25lY2VsbC5jbGtzID0gY2RjZS0+Y2xrczsKLQljZGNlLT5vbmVjZWxsLmNsa19udW0gPSBBUlJBWV9TSVpFKGNkY2UtPmNsa3MpOwotCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIoY2xpZW50LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwKLQkJCQkgICZjZGNlLT5vbmVjZWxsKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIoY2xpZW50LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX2NkY2VfZ2V0LAorCQkJCSAgICAgIGNkY2UpOwogfQogCiBzdGF0aWMgaW50IGNkY2U3MDZfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstY2RjZTkyNS5jIGIvZHJpdmVycy9jbGsvY2xrLWNkY2U5MjUuYwppbmRleCAwODliZjg4Li5iODQ1OWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstY2RjZTkyNS5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1jZGNlOTI1LmMKQEAgLTYyLDggKzYyLDYgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudDsKIAlzdHJ1Y3QgY2xrX2NkY2U5MjVfcGxsIHBsbFtOVU1CRVJfT0ZfUExMU107CiAJc3RydWN0IGNsa19jZGNlOTI1X291dHB1dCBjbGtbTlVNQkVSX09GX09VVFBVVFNdOwotCXN0cnVjdCBjbGsgKmR0X2Nsa1tOVU1CRVJfT0ZfT1VUUFVUU107Ci0Jc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgb25lY2VsbDsKIH07CiAKIC8qICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICoqICovCkBAIC01NTcsNiArNTU1LDIwIEBACiAJCXJldHVybiAtRUlPOwogfQogCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitvZl9jbGtfY2RjZTkyNV9nZXQoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYywgdm9pZCAqX2RhdGEpCit7CisJc3RydWN0IGNsa19jZGNlOTI1X2NoaXAgKmRhdGEgPSBfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gQVJSQVlfU0laRShkYXRhLT5jbGspKSB7CisJCXByX2VycigiJXM6IGludmFsaWQgaW5kZXggJXVcbiIsIF9fZnVuY19fLCBpZHgpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gJmRhdGEtPmNsa1tpZHhdLmh3OworfQorCiAvKiBUaGUgQ0RDRTkyNSB1c2VzIGEgZnVua3kgd2F5IHRvIHJlYWQvd3JpdGUgcmVnaXN0ZXJzLiBCdWxrIG1vZGUgaXMKICAqIGp1c3Qgd2VpcmQsIHNvIGp1c3QgdXNlIHRoZSBzaW5nbGUgYnl0ZSBtb2RlIGV4Y2x1c2l2ZWx5LiAqLwogc3RhdGljIHN0cnVjdCByZWdtYXBfYnVzIHJlZ21hcF9jZGNlOTI1X2J1cyA9IHsKQEAgLTU3Miw3ICs1ODQsNiBAQAogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCWNvbnN0IGNoYXIgKnBsbF9jbGtfbmFtZVtOVU1CRVJfT0ZfUExMU10gPSB7TlVMTCx9OwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0Jc3RydWN0IGNsayAqY2xrOwogCXUzMiB2YWx1ZTsKIAlpbnQgaTsKIAlpbnQgZXJyOwpAQCAtNjIyLDEwICs2MzMsOSBAQAogCQlkYXRhLT5wbGxbaV0uY2hpcCA9IGRhdGE7CiAJCWRhdGEtPnBsbFtpXS5ody5pbml0ID0gJmluaXQ7CiAJCWRhdGEtPnBsbFtpXS5pbmRleCA9IGk7Ci0JCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRhdGEtPnBsbFtpXS5odyk7Ci0JCWlmIChJU19FUlIoY2xrKSkgeworCQllcnIgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkYXRhLT5wbGxbaV0uaHcpOworCQlpZiAoZXJyKSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCByZWdpc3RlciBQTEwgJWRcbiIsIGkpOwotCQkJZXJyID0gUFRSX0VSUihjbGspOwogCQkJZ290byBlcnJvcjsKIAkJfQogCQlzcHJpbnRmKGNoaWxkX25hbWUsICJQTEwlZCIsIGkrMSk7CkBAIC02MzQsNyArNjQ0LDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wX291dHB1dCwKIAkJCSJjbG9jay1mcmVxdWVuY3kiLCAmdmFsdWUpKSB7Ci0JCQllcnIgPSBjbGtfc2V0X3JhdGUoY2xrLCB2YWx1ZSk7CisJCQllcnIgPSBjbGtfc2V0X3JhdGUoZGF0YS0+cGxsW2ldLmh3LmNsaywgdmFsdWUpOwogCQkJaWYgKGVycikKIAkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKIAkJCQkJInVuYWJsZSB0byBzZXQgUExMIGZyZXF1ZW5jeSAldWRcbiIsCkBAIC02NjMsMTQgKzY3MywxMiBAQAogCWRhdGEtPmNsa1swXS5ody5pbml0ID0gJmluaXQ7CiAJZGF0YS0+Y2xrWzBdLmluZGV4ID0gMDsKIAlkYXRhLT5jbGtbMF0ucGRpdiA9IDE7Ci0JY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGF0YS0+Y2xrWzBdLmh3KTsKKwllcnIgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkYXRhLT5jbGtbMF0uaHcpOwogCWtmcmVlKGluaXQubmFtZSk7IC8qIGNsb2NrIGZyYW1ld29yayBtYWRlIGEgY29weSBvZiB0aGUgbmFtZSAqLwotCWlmIChJU19FUlIoY2xrKSkgeworCWlmIChlcnIpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjbG9jayByZWdpc3RyYXRpb24gWTEgZmFpbGVkXG4iKTsKLQkJZXJyID0gUFRSX0VSUihjbGspOwogCQlnb3RvIGVycm9yOwogCX0KLQlkYXRhLT5kdF9jbGtbMF0gPSBjbGs7CiAKIAkvKiBSZWdpc3RlciBvdXRwdXQgY2xvY2tzIFkyIC4uIFk1Ki8KIAlpbml0Lm9wcyA9ICZjZGNlOTI1X2Nsa19vcHM7CkBAIC02OTUsMjEgKzcwMywxNyBAQAogCQkJaW5pdC5wYXJlbnRfbmFtZXMgPSAmcGxsX2Nsa19uYW1lWzFdOwogCQkJYnJlYWs7CiAJCX0KLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGF0YS0+Y2xrW2ldLmh3KTsKKwkJZXJyID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGF0YS0+Y2xrW2ldLmh3KTsKIAkJa2ZyZWUoaW5pdC5uYW1lKTsgLyogY2xvY2sgZnJhbWV3b3JrIG1hZGUgYSBjb3B5IG9mIHRoZSBuYW1lICovCi0JCWlmIChJU19FUlIoY2xrKSkgeworCQlpZiAoZXJyKSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNsb2NrIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOwotCQkJZXJyID0gUFRSX0VSUihjbGspOwogCQkJZ290byBlcnJvcjsKIAkJfQotCQlkYXRhLT5kdF9jbGtbaV0gPSBjbGs7CiAJfQogCiAJLyogUmVnaXN0ZXIgdGhlIG91dHB1dCBjbG9ja3MgKi8KLQlkYXRhLT5vbmVjZWxsLmNsa19udW0gPSBOVU1CRVJfT0ZfT1VUUFVUUzsKLQlkYXRhLT5vbmVjZWxsLmNsa3MgPSBkYXRhLT5kdF9jbGs7Ci0JZXJyID0gb2ZfY2xrX2FkZF9wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlLCBvZl9jbGtfc3JjX29uZWNlbGxfZ2V0LAotCQkmZGF0YS0+b25lY2VsbCk7CisJZXJyID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlLCBvZl9jbGtfY2RjZTkyNV9nZXQsCisJCQkJICBkYXRhKTsKIAlpZiAoZXJyKQogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byBhZGQgT0YgY2xvY2sgcHJvdmlkZXJcbiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstY2xwczcxMXguYyBiL2RyaXZlcnMvY2xrL2Nsay1jbHBzNzExeC5jCmluZGV4IGFkYWYxMDkuLjkxOTNmNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1jbHBzNzExeC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1jbHBzNzExeC5jCkBAIC00MCw5ICs0MCw4IEBACiB9OwogCiBzdHJ1Y3QgY2xwczcxMXhfY2xrIHsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YQljbGtfZGF0YTsKLQlzcGlubG9ja190CQlsb2NrOwotCXN0cnVjdCBjbGsJCSpjbGtzW0NMUFM3MTFYX0NMS19NQVhdOworCXNwaW5sb2NrX3QJCQlsb2NrOworCXN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhCWNsa19kYXRhOwogfTsKIAogc3RhdGljIHN0cnVjdCBjbHBzNzExeF9jbGsgKiBfX2luaXQgX2NscHM3MTF4X2Nsa19pbml0KHZvaWQgX19pb21lbSAqYmFzZSwKQEAgLTU1LDcgKzU0LDkgQEAKIAlpZiAoIWJhc2UpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCi0JY2xwczcxMXhfY2xrID0ga3phbGxvYyhzaXplb2YoKmNscHM3MTF4X2NsayksIEdGUF9LRVJORUwpOworCWNscHM3MTF4X2NsayA9IGt6YWxsb2Moc2l6ZW9mKCpjbHBzNzExeF9jbGspICsKKwkJCXNpemVvZigqY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3MpICogQ0xQUzcxMVhfQ0xLX01BWCwKKwkJCUdGUF9LRVJORUwpOwogCWlmICghY2xwczcxMXhfY2xrKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIApAQCAtMTA2LDQwICsxMDcsNDAgQEAKIAl0bXAgfD0gU1lTQ09OMV9UQzJNIHwgU1lTQ09OMV9UQzJTOwogCXdyaXRlbCh0bXAsIGJhc2UgKyBDTFBTNzExWF9TWVNDT04xKTsKIAotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfRFVNTVldID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImR1bW15IiwgTlVMTCwgMCwgMCk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19DUFVdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImNwdSIsIE5VTEwsIDAsIGZfY3B1KTsKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX0JVU10gPQotCQljbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAiYnVzIiwgTlVMTCwgMCwgZl9idXMpOwotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfUExMXSA9Ci0JCWNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJwbGwiLCBOVUxMLCAwLCBmX3BsbCk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19USU1FUlJFRl0gPQotCQljbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAidGltZXJfcmVmIiwgTlVMTCwgMCwgZl90aW0pOwotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfVElNRVIxXSA9Ci0JCWNsa19yZWdpc3Rlcl9kaXZpZGVyX3RhYmxlKE5VTEwsICJ0aW1lcjEiLCAidGltZXJfcmVmIiwgMCwKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfRFVNTVldID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImR1bW15IiwgTlVMTCwgMCwgMCk7CisJY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX0NQVV0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAiY3B1IiwgTlVMTCwgMCwgZl9jcHUpOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19CVVNdID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgImJ1cyIsIE5VTEwsIDAsIGZfYnVzKTsKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfUExMXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJwbGwiLCBOVUxMLCAwLCBmX3BsbCk7CisJY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX1RJTUVSUkVGXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJ0aW1lcl9yZWYiLCBOVUxMLCAwLCBmX3RpbSk7CisJY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX1RJTUVSMV0gPQorCQljbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcl90YWJsZShOVUxMLCAidGltZXIxIiwgInRpbWVyX3JlZiIsIDAsCiAJCQkJCSAgIGJhc2UgKyBDTFBTNzExWF9TWVNDT04xLCA1LCAxLCAwLAogCQkJCQkgICB0aW1lcl9kaXZfdGFibGUsICZjbHBzNzExeF9jbGstPmxvY2spOwotCWNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfVElNRVIyXSA9Ci0JCWNsa19yZWdpc3Rlcl9kaXZpZGVyX3RhYmxlKE5VTEwsICJ0aW1lcjIiLCAidGltZXJfcmVmIiwgMCwKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfVElNRVIyXSA9CisJCWNsa19od19yZWdpc3Rlcl9kaXZpZGVyX3RhYmxlKE5VTEwsICJ0aW1lcjIiLCAidGltZXJfcmVmIiwgMCwKIAkJCQkJICAgYmFzZSArIENMUFM3MTFYX1NZU0NPTjEsIDcsIDEsIDAsCiAJCQkJCSAgIHRpbWVyX2Rpdl90YWJsZSwgJmNscHM3MTF4X2Nsay0+bG9jayk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19QV01dID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgInB3bSIsIE5VTEwsIDAsIGZfcHdtKTsKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1NQSVJFRl0gPQotCQljbGtfcmVnaXN0ZXJfZml4ZWRfcmF0ZShOVUxMLCAic3BpX3JlZiIsIE5VTEwsIDAsIGZfc3BpKTsKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1NQSV0gPQotCQljbGtfcmVnaXN0ZXJfZGl2aWRlcl90YWJsZShOVUxMLCAic3BpIiwgInNwaV9yZWYiLCAwLAorCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19QV01dID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgInB3bSIsIE5VTEwsIDAsIGZfcHdtKTsKKwljbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfU1BJUkVGXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJzcGlfcmVmIiwgTlVMTCwgMCwgZl9zcGkpOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19TUEldID0KKwkJY2xrX2h3X3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgInNwaSIsICJzcGlfcmVmIiwgMCwKIAkJCQkJICAgYmFzZSArIENMUFM3MTFYX1NZU0NPTjEsIDE2LCAyLCAwLAogCQkJCQkgICBzcGlfZGl2X3RhYmxlLCAmY2xwczcxMXhfY2xrLT5sb2NrKTsKLQljbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1VBUlRdID0KLQkJY2xrX3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCAidWFydCIsICJidXMiLCAwLCAxLCAxMCk7Ci0JY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19USUNLXSA9Ci0JCWNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJ0aWNrIiwgTlVMTCwgMCwgNjQpOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19VQVJUXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgInVhcnQiLCAiYnVzIiwgMCwgMSwgMTApOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19USUNLXSA9CisJCWNsa19od19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJ0aWNrIiwgTlVMTCwgMCwgNjQpOwogCWZvciAoaSA9IDA7IGkgPCBDTFBTNzExWF9DTEtfTUFYOyBpKyspCi0JCWlmIChJU19FUlIoY2xwczcxMXhfY2xrLT5jbGtzW2ldKSkKKwkJaWYgKElTX0VSUihjbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tpXSkpCiAJCQlwcl9lcnIoImNsayAlaTogcmVnaXN0ZXIgZmFpbGVkIHdpdGggJWxkXG4iLAotCQkJICAgICAgIGksIFBUUl9FUlIoY2xwczcxMXhfY2xrLT5jbGtzW2ldKSk7CisJCQkgICAgICAgaSwgUFRSX0VSUihjbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tpXSkpOwogCiAJcmV0dXJuIGNscHM3MTF4X2NsazsKIH0KQEAgLTE1MywxNyArMTU0LDE3IEBACiAJQlVHX09OKElTX0VSUihjbHBzNzExeF9jbGspKTsKIAogCS8qIENsb2Nrc291cmNlICovCi0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbHBzNzExeF9jbGstPmNsa3NbQ0xQUzcxMVhfQ0xLX1RJTUVSMV0sCisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihjbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfVElNRVIxXSwKIAkJCSAgICBOVUxMLCAiY2xwczcxMXgtdGltZXIuMCIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19USU1FUjJdLAorCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoY2xwczcxMXhfY2xrLT5jbGtfZGF0YS5od3NbQ0xQUzcxMVhfQ0xLX1RJTUVSMl0sCiAJCQkgICAgTlVMTCwgImNscHM3MTF4LXRpbWVyLjEiKTsKIAogCS8qIERyaXZlcnMgKi8KLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfUFdNXSwKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19QV01dLAogCQkJICAgIE5VTEwsICJjbHBzNzExeC1wd20iKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNscHM3MTF4X2Nsay0+Y2xrc1tDTFBTNzExWF9DTEtfVUFSVF0sCisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihjbHBzNzExeF9jbGstPmNsa19kYXRhLmh3c1tDTFBTNzExWF9DTEtfVUFSVF0sCiAJCQkgICAgTlVMTCwgImNscHM3MTF4LXVhcnQuMCIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xwczcxMXhfY2xrLT5jbGtzW0NMUFM3MTFYX0NMS19VQVJUXSwKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuaHdzW0NMUFM3MTFYX0NMS19VQVJUXSwKIAkJCSAgICBOVUxMLCAiY2xwczcxMXgtdWFydC4xIik7CiB9CiAKQEAgLTE3OSwxMCArMTgwLDkgQEAKIAljbHBzNzExeF9jbGsgPSBfY2xwczcxMXhfY2xrX2luaXQoYmFzZSwgZnJlZik7CiAJQlVHX09OKElTX0VSUihjbHBzNzExeF9jbGspKTsKIAotCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEuY2xrcyA9IGNscHM3MTF4X2Nsay0+Y2xrczsKLQljbHBzNzExeF9jbGstPmNsa19kYXRhLmNsa19udW0gPSBDTFBTNzExWF9DTEtfTUFYOwotCW9mX2Nsa19hZGRfcHJvdmlkZXIobnAsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsCi0JCQkgICAgJmNscHM3MTF4X2Nsay0+Y2xrX2RhdGEpOworCWNscHM3MTF4X2Nsay0+Y2xrX2RhdGEubnVtID0gQ0xQUzcxMVhfQ0xLX01BWDsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsCisJCQkgICAgICAgJmNscHM3MTF4X2Nsay0+Y2xrX2RhdGEpOwogfQogQ0xLX09GX0RFQ0xBUkUoY2xwczcxMXgsICJjaXJydXMsZXA3MjA5LWNsayIsIGNscHM3MTF4X2Nsa19pbml0X2R0KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWNzMjAwMC1jcC5jIGIvZHJpdmVycy9jbGsvY2xrLWNzMjAwMC1jcC5jCmluZGV4IDczNzlkZTguLjAyMWYzZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1jczIwMDAtY3AuYworKysgYi9kcml2ZXJzL2Nsay9jbGstY3MyMDAwLWNwLmMKQEAgLTU5LDcgKzU5LDYgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBjbGsgKmNsa19pbjsKIAlzdHJ1Y3QgY2xrICpyZWZfY2xrOwotCXN0cnVjdCBjbGsgKmNsa19vdXQ7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjczIwMDBfb2ZfbWF0Y2hbXSA9IHsKQEAgLTM3MSw3ICszNzAsNiBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKIAljb25zdCBjaGFyICpuYW1lID0gbnAtPm5hbWU7Ci0Jc3RydWN0IGNsayAqY2xrOwogCXN0YXRpYyBjb25zdCBjaGFyICpwYXJlbnRfbmFtZXNbQ0xLX01BWF07CiAJaW50IGNoID0gMDsgLyogaXQgdXNlcyBjaDAgb25seSBhdCB0aGlzIHBvaW50ICovCiAJaW50IHJhdGU7CkBAIC00MDAsMTggKzM5OCwxNiBAQAogCiAJcHJpdi0+aHcuaW5pdCA9ICZpbml0OwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKGRldiwgJnByaXYtPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpCi0JCXJldHVybiBQVFJfRVJSKGNsayk7CisJcmV0ID0gY2xrX2h3X3JlZ2lzdGVyKGRldiwgJnByaXYtPmh3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCXJldCA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCAmcHJpdi0+aHcpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWNsa191bnJlZ2lzdGVyKGNsayk7CisJCWNsa19od191bnJlZ2lzdGVyKCZwcml2LT5odyk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JcHJpdi0+Y2xrX291dCA9IGNsazsKLQogCXJldHVybiAwOwogfQogCkBAIC00NTQsNyArNDUwLDcgQEAKIAogCW9mX2Nsa19kZWxfcHJvdmlkZXIobnApOwogCi0JY2xrX3VucmVnaXN0ZXIocHJpdi0+Y2xrX291dCk7CisJY2xrX2h3X3VucmVnaXN0ZXIoJnByaXYtPmh3KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWRpdmlkZXIuYyBiL2RyaXZlcnMvY2xrL2Nsay1kaXZpZGVyLmMKaW5kZXggYTBmNTViYy4uOTYzODZmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLWRpdmlkZXIuYworKysgYi9kcml2ZXJzL2Nsay9jbGstZGl2aWRlci5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAogCS8qIGlmIHJlYWQgb25seSwganVzdCByZXR1cm4gY3VycmVudCB2YWx1ZSAqLwogCWlmIChkaXZpZGVyLT5mbGFncyAmIENMS19ESVZJREVSX1JFQURfT05MWSkgewotCQliZXN0ZGl2ID0gcmVhZGwoZGl2aWRlci0+cmVnKSA+PiBkaXZpZGVyLT5zaGlmdDsKKwkJYmVzdGRpdiA9IGNsa19yZWFkbChkaXZpZGVyLT5yZWcpID4+IGRpdmlkZXItPnNoaWZ0OwogCQliZXN0ZGl2ICY9IGRpdl9tYXNrKGRpdmlkZXItPndpZHRoKTsKIAkJYmVzdGRpdiA9IF9nZXRfZGl2KGRpdmlkZXItPnRhYmxlLCBiZXN0ZGl2LCBkaXZpZGVyLT5mbGFncywKIAkJCWRpdmlkZXItPndpZHRoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1lZm0zMmdnLmMgYi9kcml2ZXJzL2Nsay9jbGstZWZtMzJnZy5jCmluZGV4IDIyZTRjNjUuLjg4MDJhMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1lZm0zMmdnLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWVmbTMyZ2cuYwpAQCAtMTAsMjQgKzEwLDMxIEBACiAjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svZWZtMzItY211Lmg+CiAKICNkZWZpbmUgQ01VX0hGUEVSQ0xLRU4wCQkweDQ0CisjZGVmaW5lIENNVV9NQVhfQ0xLUwkJMzcKIAotc3RhdGljIHN0cnVjdCBjbGsgKmNsa1szN107Ci1zdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGEgPSB7Ci0JLmNsa3MgPSBjbGssCi0JLmNsa19udW0gPSBBUlJBWV9TSVpFKGNsayksCi19Oworc3RhdGljIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhICpjbGtfZGF0YTsKIAogc3RhdGljIHZvaWQgX19pbml0IGVmbTMyZ2dfY211X2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlpbnQgaTsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IGNsa19odyAqKmh3czsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsayk7ICsraSkKLQkJY2xrW2ldID0gRVJSX1BUUigtRU5PRU5UKTsKKwljbGtfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpjbGtfZGF0YSkgKworCQkJICAgc2l6ZW9mKCpjbGtfZGF0YS0+aHdzKSAqIENNVV9NQVhfQ0xLUywgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWNsa19kYXRhKQorCQlyZXR1cm47CisKKwlod3MgPSBjbGtfZGF0YS0+aHdzOworCisJZm9yIChpID0gMDsgaSA8IENNVV9NQVhfQ0xLUzsgKytpKQorCQlod3NbaV0gPSBFUlJfUFRSKC1FTk9FTlQpOwogCiAJYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKIAlpZiAoIWJhc2UpIHsKQEAgLTM1LDQ2ICs0Miw0NiBAQAogCQlyZXR1cm47CiAJfQogCi0JY2xrW2Nsa19IRlhPXSA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJIRlhPIiwgTlVMTCwKLQkJCTAsIDQ4MDAwMDAwKTsKKwlod3NbY2xrX0hGWE9dID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgIkhGWE8iLCBOVUxMLCAwLAorCQkJCQkJICAgNDgwMDAwMDApOwogCi0JY2xrW2Nsa19IRlBFUkNMS1VTQVJUMF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVVNBUlQwIiwKKwlod3NbY2xrX0hGUEVSQ0xLVVNBUlQwXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VU0FSVDAiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAwLCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLVVNBUlQxXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VU0FSVDEiLAorCWh3c1tjbGtfSEZQRVJDTEtVU0FSVDFdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlVTQVJUMSIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDEsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtVU0FSVDJdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlVTQVJUMiIsCisJaHdzW2Nsa19IRlBFUkNMS1VTQVJUMl0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVVNBUlQyIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMiwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS1VBUlQwXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VQVJUMCIsCisJaHdzW2Nsa19IRlBFUkNMS1VBUlQwXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5VQVJUMCIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDMsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtVQVJUMV0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVUFSVDEiLAorCWh3c1tjbGtfSEZQRVJDTEtVQVJUMV0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVUFSVDEiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCA0LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLVElNRVIwXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5USU1FUjAiLAorCWh3c1tjbGtfSEZQRVJDTEtUSU1FUjBdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlRJTUVSMCIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDUsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtUSU1FUjFdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlRJTUVSMSIsCisJaHdzW2Nsa19IRlBFUkNMS1RJTUVSMV0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVElNRVIxIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgNiwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS1RJTUVSMl0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVElNRVIyIiwKKwlod3NbY2xrX0hGUEVSQ0xLVElNRVIyXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5USU1FUjIiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCA3LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLVElNRVIzXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5USU1FUjMiLAorCWh3c1tjbGtfSEZQRVJDTEtUSU1FUjNdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlRJTUVSMyIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDgsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtBQ01QMF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuQUNNUDAiLAorCWh3c1tjbGtfSEZQRVJDTEtBQ01QMF0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuQUNNUDAiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCA5LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLQUNNUDFdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkFDTVAxIiwKKwlod3NbY2xrX0hGUEVSQ0xLQUNNUDFdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkFDTVAxIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMTAsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtJMkMwXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5JMkMwIiwKKwlod3NbY2xrX0hGUEVSQ0xLSTJDMF0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuSTJDMCIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDExLCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLSTJDMV0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuSTJDMSIsCisJaHdzW2Nsa19IRlBFUkNMS0kyQzFdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkkyQzEiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAxMiwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS0dQSU9dID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkdQSU8iLAorCWh3c1tjbGtfSEZQRVJDTEtHUElPXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5HUElPIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMTMsIDAsIE5VTEwpOwotCWNsa1tjbGtfSEZQRVJDTEtWQ01QXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5WQ01QIiwKKwlod3NbY2xrX0hGUEVSQ0xLVkNNUF0gPSBjbGtfaHdfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuVkNNUCIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDE0LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLUFJTXSA9IGNsa19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5QUlMiLAorCWh3c1tjbGtfSEZQRVJDTEtQUlNdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLlBSUyIsCiAJCQkiSEZYTyIsIDAsIGJhc2UgKyBDTVVfSEZQRVJDTEtFTjAsIDE1LCAwLCBOVUxMKTsKLQljbGtbY2xrX0hGUEVSQ0xLQURDMF0gPSBjbGtfcmVnaXN0ZXJfZ2F0ZShOVUxMLCAiSEZQRVJDTEsuQURDMCIsCisJaHdzW2Nsa19IRlBFUkNMS0FEQzBdID0gY2xrX2h3X3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkFEQzAiLAogCQkJIkhGWE8iLCAwLCBiYXNlICsgQ01VX0hGUEVSQ0xLRU4wLCAxNiwgMCwgTlVMTCk7Ci0JY2xrW2Nsa19IRlBFUkNMS0RBQzBdID0gY2xrX3JlZ2lzdGVyX2dhdGUoTlVMTCwgIkhGUEVSQ0xLLkRBQzAiLAorCWh3c1tjbGtfSEZQRVJDTEtEQUMwXSA9IGNsa19od19yZWdpc3Rlcl9nYXRlKE5VTEwsICJIRlBFUkNMSy5EQUMwIiwKIAkJCSJIRlhPIiwgMCwgYmFzZSArIENNVV9IRlBFUkNMS0VOMCwgMTcsIDAsIE5VTEwpOwogCi0Jb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwgJmNsa19kYXRhKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsICZjbGtfZGF0YSk7CiB9CiBDTEtfT0ZfREVDTEFSRShlZm0zMmdnY211LCAiZWZtMzJnZyxjbXUiLCBlZm0zMmdnX2NtdV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1maXhlZC1mYWN0b3IuYyBiL2RyaXZlcnMvY2xrL2Nsay1maXhlZC1mYWN0b3IuYwppbmRleCA0ZGIzYmUyLi5hNWQ0MDJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstZml4ZWQtZmFjdG9yLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLWZpeGVkLWZhY3Rvci5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKIC8qCiAgKiBET0M6IGJhc2ljIGZpeGVkIG11bHRpcGxpZXIgYW5kIGRpdmlkZXIgY2xvY2sgdGhhdCBjYW5ub3QgZ2F0ZQpAQCAtMTQ3LDI3ICsxNDgsMjUgQEAKIAl7IC8qIFNlbnRpbmVsICovIH0sCiB9OwogCi0vKioKLSAqIG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfc2V0dXAoKSAtIFNldHVwIGZ1bmN0aW9uIGZvciBzaW1wbGUgZml4ZWQgZmFjdG9yIGNsb2NrCi0gKi8KLXZvaWQgX19pbml0IG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQorc3RhdGljIHN0cnVjdCBjbGsgKl9vZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJY29uc3QgY2hhciAqY2xrX25hbWUgPSBub2RlLT5uYW1lOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCXUzMiBkaXYsIG11bHQ7CisJaW50IHJldDsKIAogCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2xvY2stZGl2IiwgJmRpdikpIHsKIAkJcHJfZXJyKCIlcyBGaXhlZCBmYWN0b3IgY2xvY2sgPCVzPiBtdXN0IGhhdmUgYSBjbG9jay1kaXYgcHJvcGVydHlcbiIsCiAJCQlfX2Z1bmNfXywgbm9kZS0+bmFtZSk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiAJfQogCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJjbG9jay1tdWx0IiwgJm11bHQpKSB7CiAJCXByX2VycigiJXMgRml4ZWQgZmFjdG9yIGNsb2NrIDwlcz4gbXVzdCBoYXZlIGEgY2xvY2stbXVsdCBwcm9wZXJ0eVxuIiwKIAkJCV9fZnVuY19fLCBub2RlLT5uYW1lKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAl9CiAKIAlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhub2RlLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJmNsa19uYW1lKTsKQEAgLTE3OCwxMCArMTc3LDY3IEBACiAKIAljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIGNsa19uYW1lLCBwYXJlbnRfbmFtZSwgZmxhZ3MsCiAJCQkJCW11bHQsIGRpdik7Ci0JaWYgKCFJU19FUlIoY2xrKSkKLQkJb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJaWYgKElTX0VSUihjbGspKQorCQlyZXR1cm4gY2xrOworCisJcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJaWYgKHJldCkgeworCQljbGtfdW5yZWdpc3RlcihjbGspOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXJldHVybiBjbGs7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKTsKKworLyoqCisgKiBvZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKCkgLSBTZXR1cCBmdW5jdGlvbiBmb3Igc2ltcGxlIGZpeGVkIGZhY3RvciBjbG9jaworICovCit2b2lkIF9faW5pdCBvZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlfb2ZfZml4ZWRfZmFjdG9yX2Nsa19zZXR1cChub2RlKTsKK30KIENMS19PRl9ERUNMQVJFKGZpeGVkX2ZhY3Rvcl9jbGssICJmaXhlZC1mYWN0b3ItY2xvY2siLAogCQlvZl9maXhlZF9mYWN0b3JfY2xrX3NldHVwKTsKKworc3RhdGljIGludCBvZl9maXhlZF9mYWN0b3JfY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjbGsgKmNsayA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2xrX3VucmVnaXN0ZXJfZml4ZWRfZmFjdG9yKGNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvZl9maXhlZF9mYWN0b3JfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleGVjdXRlZCB3aGVuIG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfc2V0dXAKKwkgKiBzdWNjZWVkZWQuCisJICovCisJY2xrID0gX29mX2ZpeGVkX2ZhY3Rvcl9jbGtfc2V0dXAocGRldi0+ZGV2Lm9mX25vZGUpOworCWlmIChJU19FUlIoY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfZml4ZWRfZmFjdG9yX2Nsa19pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZpeGVkLWZhY3Rvci1jbG9jayIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9maXhlZF9mYWN0b3JfY2xrX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm9mX2ZpeGVkX2ZhY3Rvcl9jbGsiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9maXhlZF9mYWN0b3JfY2xrX2lkcywKKwl9LAorCS5wcm9iZSA9IG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfcHJvYmUsCisJLnJlbW92ZSA9IG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfcmVtb3ZlLAorfTsKK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKG9mX2ZpeGVkX2ZhY3Rvcl9jbGtfZHJpdmVyKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLWZpeGVkLXJhdGUuYyBiL2RyaXZlcnMvY2xrL2Nsay1maXhlZC1yYXRlLmMKaW5kZXggMmVkYjM5My4uYjVjNDZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLWZpeGVkLXJhdGUuYworKysgYi9kcml2ZXJzL2Nsay9jbGstZml4ZWQtcmF0ZS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAvKgogICogRE9DOiBiYXNpYyBmaXhlZC1yYXRlIGNsb2NrIHRoYXQgY2Fubm90IGdhdGUKQEAgLTE1NywxOCArMTU4LDE2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChjbGtfaHdfdW5yZWdpc3Rlcl9maXhlZF9yYXRlKTsKIAogI2lmZGVmIENPTkZJR19PRgotLyoqCi0gKiBvZl9maXhlZF9jbGtfc2V0dXAoKSAtIFNldHVwIGZ1bmN0aW9uIGZvciBzaW1wbGUgZml4ZWQgcmF0ZSBjbG9jawotICovCi12b2lkIG9mX2ZpeGVkX2Nsa19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCitzdGF0aWMgc3RydWN0IGNsayAqX29mX2ZpeGVkX2Nsa19zZXR1cChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7CiAJc3RydWN0IGNsayAqY2xrOwogCWNvbnN0IGNoYXIgKmNsa19uYW1lID0gbm9kZS0+bmFtZTsKIAl1MzIgcmF0ZTsKIAl1MzIgYWNjdXJhY3kgPSAwOworCWludCByZXQ7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIsICZyYXRlKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKIAogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJjbG9jay1hY2N1cmFjeSIsICZhY2N1cmFjeSk7CiAKQEAgLTE3Niw5ICsxNzUsNjYgQEAKIAogCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlX3dpdGhfYWNjdXJhY3koTlVMTCwgY2xrX25hbWUsIE5VTEwsCiAJCQkJCQkgICAgMCwgcmF0ZSwgYWNjdXJhY3kpOwotCWlmICghSVNfRVJSKGNsaykpCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCWlmIChJU19FUlIoY2xrKSkKKwkJcmV0dXJuIGNsazsKKworCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCWlmIChyZXQpIHsKKwkJY2xrX3VucmVnaXN0ZXIoY2xrKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlyZXR1cm4gY2xrOwogfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfZml4ZWRfY2xrX3NldHVwKTsKKworLyoqCisgKiBvZl9maXhlZF9jbGtfc2V0dXAoKSAtIFNldHVwIGZ1bmN0aW9uIGZvciBzaW1wbGUgZml4ZWQgcmF0ZSBjbG9jaworICovCit2b2lkIF9faW5pdCBvZl9maXhlZF9jbGtfc2V0dXAoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCV9vZl9maXhlZF9jbGtfc2V0dXAobm9kZSk7Cit9CiBDTEtfT0ZfREVDTEFSRShmaXhlZF9jbGssICJmaXhlZC1jbG9jayIsIG9mX2ZpeGVkX2Nsa19zZXR1cCk7CisKK3N0YXRpYyBpbnQgb2ZfZml4ZWRfY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjbGsgKmNsayA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2xrX3VucmVnaXN0ZXJfZml4ZWRfcmF0ZShjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2ZfZml4ZWRfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleGVjdXRlZCB3aGVuIG9mX2ZpeGVkX2Nsa19zZXR1cAorCSAqIHN1Y2NlZWRlZC4KKwkgKi8KKwljbGsgPSBfb2ZfZml4ZWRfY2xrX3NldHVwKHBkZXYtPmRldi5vZl9ub2RlKTsKKwlpZiAoSVNfRVJSKGNsaykpCisJCXJldHVybiBQVFJfRVJSKGNsayk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2ZpeGVkX2Nsa19pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX2ZpeGVkX2Nsa19pZHMpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvZl9maXhlZF9jbGtfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm9mX2ZpeGVkX2NsayIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX2ZpeGVkX2Nsa19pZHMsCisJfSwKKwkucHJvYmUgPSBvZl9maXhlZF9jbGtfcHJvYmUsCisJLnJlbW92ZSA9IG9mX2ZpeGVkX2Nsa19yZW1vdmUsCit9OworYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXIob2ZfZml4ZWRfY2xrX2RyaXZlcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1sczF4LmMgYi9kcml2ZXJzL2Nsay9jbGstbHMxeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDk3ODMxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2xrL2Nsay1sczF4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiBaaGFuZywgS2VndWFuZyA8a2VndWFuZy56aGFuZ0BnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0KLSNpbmNsdWRlIDxsb29uZ3NvbjEuaD4KLQotI2RlZmluZSBPU0MJCSgzMyAqIDEwMDAwMDApCi0jZGVmaW5lIERJVl9BUEIJCTIKLQotc3RhdGljIERFRklORV9TUElOTE9DSyhfbG9jayk7Ci0KLXN0YXRpYyBpbnQgbHMxeF9wbGxfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbHMxeF9wbGxfY2xrX2Rpc2FibGUoc3RydWN0IGNsa19odyAqaHcpCi17Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxzMXhfcGxsX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCi17Ci0JdTMyIHBsbCwgcmF0ZTsKLQotCXBsbCA9IF9fcmF3X3JlYWRsKExTMVhfQ0xLX1BMTF9GUkVRKTsKLQlyYXRlID0gMTIgKyAocGxsICYgMHgzZikgKyAoKChwbGwgPj4gOCkgJiAweDNmZikgPj4gMTApOwotCXJhdGUgKj0gT1NDOwotCXJhdGUgPj49IDE7Ci0KLQlyZXR1cm4gcmF0ZTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGxzMXhfcGxsX2Nsa19vcHMgPSB7Ci0JLmVuYWJsZSA9IGxzMXhfcGxsX2Nsa19lbmFibGUsCi0JLmRpc2FibGUgPSBsczF4X3BsbF9jbGtfZGlzYWJsZSwKLQkucmVjYWxjX3JhdGUgPSBsczF4X3BsbF9yZWNhbGNfcmF0ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICpfX2luaXQgY2xrX3JlZ2lzdGVyX3BsbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSAgIGNvbnN0IGNoYXIgKnBhcmVudF9uYW1lLAotCQkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBjbGtfaHcgKmh3OwotCXN0cnVjdCBjbGsgKmNsazsKLQlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCi0JLyogYWxsb2NhdGUgdGhlIGRpdmlkZXIgKi8KLQlodyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbGtfaHcpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWh3KSB7Ci0JCXByX2VycigiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBjbGtfaHdcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQotCi0JaW5pdC5uYW1lID0gbmFtZTsKLQlpbml0Lm9wcyA9ICZsczF4X3BsbF9jbGtfb3BzOwotCWluaXQuZmxhZ3MgPSBmbGFncyB8IENMS19JU19CQVNJQzsKLQlpbml0LnBhcmVudF9uYW1lcyA9IChwYXJlbnRfbmFtZSA/ICZwYXJlbnRfbmFtZSA6IE5VTEwpOwotCWluaXQubnVtX3BhcmVudHMgPSAocGFyZW50X25hbWUgPyAxIDogMCk7Ci0JaHctPmluaXQgPSAmaW5pdDsKLQotCS8qIHJlZ2lzdGVyIHRoZSBjbG9jayAqLwotCWNsayA9IGNsa19yZWdpc3RlcihkZXYsIGh3KTsKLQotCWlmIChJU19FUlIoY2xrKSkKLQkJa2ZyZWUoaHcpOwotCi0JcmV0dXJuIGNsazsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjcHVfcGFyZW50c1tdID0geyAiY3B1X2Nsa19kaXYiLCAib3NjXzMzbV9jbGsiLCB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhaGJfcGFyZW50c1tdID0geyAiYWhiX2Nsa19kaXYiLCAib3NjXzMzbV9jbGsiLCB9Owotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkY19wYXJlbnRzW10gPSB7ICJkY19jbGtfZGl2IiwgIm9zY18zM21fY2xrIiwgfTsKLQotdm9pZCBfX2luaXQgbHMxeF9jbGtfaW5pdCh2b2lkKQotewotCXN0cnVjdCBjbGsgKmNsazsKLQotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsICJvc2NfMzNtX2NsayIsIE5VTEwsIDAsIE9TQyk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJvc2NfMzNtX2NsayIsIE5VTEwpOwotCi0JLyogY2xvY2sgZGVyaXZlZCBmcm9tIDMzIE1IeiBPU0MgY2xrICovCi0JY2xrID0gY2xrX3JlZ2lzdGVyX3BsbChOVUxMLCAicGxsX2NsayIsICJvc2NfMzNtX2NsayIsIDApOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAicGxsX2NsayIsIE5VTEwpOwotCi0JLyogY2xvY2sgZGVyaXZlZCBmcm9tIFBMTCBjbGsgKi8KLQkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fCi0JICogICAgICAgICBfX19fX19fX19fX19fX19fX19fX19fX3wgICAgIHwKLQkgKiBPU0MgX19fLyAgICAgICAgICAgICAgICAgICAgICAgfCBNVVggfF9fXyBDUFUgQ0xLCi0JICogICAgICAgIFxfX18gUExMIF9fXyBDUFUgRElWIF9fX3wgICAgIHwKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19ffAotCSAqLwotCWNsayA9IGNsa19yZWdpc3Rlcl9kaXZpZGVyKE5VTEwsICJjcHVfY2xrX2RpdiIsICJwbGxfY2xrIiwKLQkJCQkgICBDTEtfR0VUX1JBVEVfTk9DQUNIRSwgTFMxWF9DTEtfUExMX0RJViwKLQkJCQkgICBESVZfQ1BVX1NISUZULCBESVZfQ1BVX1dJRFRILAotCQkJCSAgIENMS19ESVZJREVSX09ORV9CQVNFRCB8Ci0JCQkJICAgQ0xLX0RJVklERVJfUk9VTkRfQ0xPU0VTVCwgJl9sb2NrKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImNwdV9jbGtfZGl2IiwgTlVMTCk7Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCAiY3B1X2NsayIsIGNwdV9wYXJlbnRzLAotCQkJICAgICAgIEFSUkFZX1NJWkUoY3B1X3BhcmVudHMpLAotCQkJICAgICAgIENMS19TRVRfUkFURV9OT19SRVBBUkVOVCwgTFMxWF9DTEtfUExMX0RJViwKLQkJCSAgICAgICBCWVBBU1NfQ1BVX1NISUZULCBCWVBBU1NfQ1BVX1dJRFRILCAwLCAmX2xvY2spOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAiY3B1X2NsayIsIE5VTEwpOwotCi0JLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fXwotCSAqICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX198ICAgICB8Ci0JICogT1NDIF9fXy8gICAgICAgICAgICAgICAgICAgICAgIHwgTVVYIHxfX18gREMgIENMSwotCSAqICAgICAgICBcX19fIFBMTCBfX18gREMgIERJViBfX198ICAgICB8Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLQkgKi8KLQljbGsgPSBjbGtfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCAiZGNfY2xrX2RpdiIsICJwbGxfY2xrIiwKLQkJCQkgICAwLCBMUzFYX0NMS19QTExfRElWLCBESVZfRENfU0hJRlQsCi0JCQkJICAgRElWX0RDX1dJRFRILCBDTEtfRElWSURFUl9PTkVfQkFTRUQsICZfbG9jayk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJkY19jbGtfZGl2IiwgTlVMTCk7Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCAiZGNfY2xrIiwgZGNfcGFyZW50cywKLQkJCSAgICAgICBBUlJBWV9TSVpFKGRjX3BhcmVudHMpLAotCQkJICAgICAgIENMS19TRVRfUkFURV9OT19SRVBBUkVOVCwgTFMxWF9DTEtfUExMX0RJViwKLQkJCSAgICAgICBCWVBBU1NfRENfU0hJRlQsIEJZUEFTU19EQ19XSURUSCwgMCwgJl9sb2NrKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImRjX2NsayIsIE5VTEwpOwotCi0JLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fXwotCSAqICAgICAgICAgX19fX19fX19fX19fX19fX19fX19fX198ICAgICB8Ci0JICogT1NDIF9fXy8gICAgICAgICAgICAgICAgICAgICAgIHwgTVVYIHxfX18gRERSIENMSwotCSAqICAgICAgICBcX19fIFBMTCBfX18gRERSIERJViBfX198ICAgICB8Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX3wKLQkgKi8KLQljbGsgPSBjbGtfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCAiYWhiX2Nsa19kaXYiLCAicGxsX2NsayIsCi0JCQkJICAgMCwgTFMxWF9DTEtfUExMX0RJViwgRElWX0REUl9TSElGVCwKLQkJCQkgICBESVZfRERSX1dJRFRILCBDTEtfRElWSURFUl9PTkVfQkFTRUQsCi0JCQkJICAgJl9sb2NrKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImFoYl9jbGtfZGl2IiwgTlVMTCk7Ci0JY2xrID0gY2xrX3JlZ2lzdGVyX211eChOVUxMLCAiYWhiX2NsayIsIGFoYl9wYXJlbnRzLAotCQkJICAgICAgIEFSUkFZX1NJWkUoYWhiX3BhcmVudHMpLAotCQkJICAgICAgIENMS19TRVRfUkFURV9OT19SRVBBUkVOVCwgTFMxWF9DTEtfUExMX0RJViwKLQkJCSAgICAgICBCWVBBU1NfRERSX1NISUZULCBCWVBBU1NfRERSX1dJRFRILCAwLCAmX2xvY2spOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAiYWhiX2NsayIsIE5VTEwpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAic3RtbWFjZXRoIiwgTlVMTCk7Ci0KLQkvKiBjbG9jayBkZXJpdmVkIGZyb20gQUhCIGNsayAqLwotCS8qIEFQQiBjbGsgaXMgYWx3YXlzIGhhbGYgb2YgdGhlIEFIQiBjbGsgKi8KLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsICJhcGJfY2xrIiwgImFoYl9jbGsiLCAwLCAxLAotCQkJCQlESVZfQVBCKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImFwYl9jbGsiLCBOVUxMKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgImxzMXhfaTJjIiwgTlVMTCk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJsczF4X3B3bXRpbWVyIiwgTlVMTCk7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGssICJsczF4X3NwaSIsIE5VTEwpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCAibHMxeF93ZHQiLCBOVUxMKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgInNlcmlhbDgyNTAiLCBOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1tYXgtZ2VuLmMgYi9kcml2ZXJzL2Nsay9jbGstbWF4LWdlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWFmOWNiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2xrL2Nsay1tYXgtZ2VuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIGNsay1tYXgtZ2VuLmMgLSBHZW5lcmljIGNsb2NrIGRyaXZlciBmb3IgTWF4aW0gUE1JQ3MgY2xvY2tzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEdvb2dsZSwgSW5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Rvcm5pY3MKLSAqIEpvbmdod2EgTGVlIDxqb25naHdhMy5sZWVAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIGNsay1tYXg3NzY4Ni5jCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotCi0jaW5jbHVkZSAiY2xrLW1heC1nZW4uaCIKLQotc3RydWN0IG1heF9nZW5fY2xrIHsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7Ci0JdTMyIG1hc2s7Ci0JdTMyIHJlZzsKLQlzdHJ1Y3QgY2xrX2h3IGh3OwotfTsKLQotc3RhdGljIHN0cnVjdCBtYXhfZ2VuX2NsayAqdG9fbWF4X2dlbl9jbGsoc3RydWN0IGNsa19odyAqaHcpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihodywgc3RydWN0IG1heF9nZW5fY2xrLCBodyk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4X2dlbl9jbGtfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgbWF4X2dlbl9jbGsgKm1heF9nZW4gPSB0b19tYXhfZ2VuX2Nsayhodyk7Ci0KLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1heF9nZW4tPnJlZ21hcCwgbWF4X2dlbi0+cmVnLAotCQkJCSAgbWF4X2dlbi0+bWFzaywgbWF4X2dlbi0+bWFzayk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1heF9nZW5fY2xrX3VucHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKLXsKLQlzdHJ1Y3QgbWF4X2dlbl9jbGsgKm1heF9nZW4gPSB0b19tYXhfZ2VuX2Nsayhodyk7Ci0KLQlyZWdtYXBfdXBkYXRlX2JpdHMobWF4X2dlbi0+cmVnbWFwLCBtYXhfZ2VuLT5yZWcsCi0JCQkgICBtYXhfZ2VuLT5tYXNrLCB+bWF4X2dlbi0+bWFzayk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4X2dlbl9jbGtfaXNfcHJlcGFyZWQoc3RydWN0IGNsa19odyAqaHcpCi17Ci0Jc3RydWN0IG1heF9nZW5fY2xrICptYXhfZ2VuID0gdG9fbWF4X2dlbl9jbGsoaHcpOwotCWludCByZXQ7Ci0JdTMyIHZhbDsKLQotCXJldCA9IHJlZ21hcF9yZWFkKG1heF9nZW4tPnJlZ21hcCwgbWF4X2dlbi0+cmVnLCAmdmFsKTsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiB2YWwgJiBtYXhfZ2VuLT5tYXNrOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhfZ2VuX3JlY2FsY19yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAotCQkJCQkgdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSkKLXsKLQlyZXR1cm4gMzI3Njg7Ci19Ci0KLXN0cnVjdCBjbGtfb3BzIG1heF9nZW5fY2xrX29wcyA9IHsKLQkucHJlcGFyZQk9IG1heF9nZW5fY2xrX3ByZXBhcmUsCi0JLnVucHJlcGFyZQk9IG1heF9nZW5fY2xrX3VucHJlcGFyZSwKLQkuaXNfcHJlcGFyZWQJPSBtYXhfZ2VuX2Nsa19pc19wcmVwYXJlZCwKLQkucmVjYWxjX3JhdGUJPSBtYXhfZ2VuX3JlY2FsY19yYXRlLAotfTsKLUVYUE9SVF9TWU1CT0xfR1BMKG1heF9nZW5fY2xrX29wcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrICptYXhfZ2VuX2Nsa19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBtYXhfZ2VuX2NsayAqbWF4X2dlbikKLXsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0Jc3RydWN0IGNsa19odyAqaHcgPSAmbWF4X2dlbi0+aHc7Ci0JaW50IHJldDsKLQotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKGRldiwgaHcpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuIGNsazsKLQotCXJldCA9IGNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCBody0+aW5pdC0+bmFtZSwgTlVMTCk7Ci0KLQlpZiAocmV0KQotCQlyZXR1cm4gRVJSX1BUUihyZXQpOwotCi0JcmV0dXJuIGNsazsKLX0KLQotaW50IG1heF9nZW5fY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKLQkJICAgICAgdTMyIHJlZywgc3RydWN0IGNsa19pbml0X2RhdGEgKmNsa3NfaW5pdCwgaW50IG51bV9pbml0KQotewotCWludCBpLCByZXQ7Ci0Jc3RydWN0IG1heF9nZW5fY2xrICptYXhfZ2VuX2Nsa3M7Ci0Jc3RydWN0IGNsayAqKmNsb2NrczsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwZGV2LT5kZXYucGFyZW50OwotCWNvbnN0IGNoYXIgKmNsa19uYW1lOwotCXN0cnVjdCBjbGtfaW5pdF9kYXRhICppbml0OwotCi0JY2xvY2tzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBjbGsgKikgKiBudW1faW5pdCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbG9ja3MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWF4X2dlbl9jbGtzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBtYXhfZ2VuX2NsaykKLQkJCQkgICAgKiBudW1faW5pdCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXhfZ2VuX2Nsa3MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9pbml0OyBpKyspIHsKLQkJbWF4X2dlbl9jbGtzW2ldLnJlZ21hcCA9IHJlZ21hcDsKLQkJbWF4X2dlbl9jbGtzW2ldLm1hc2sgPSAxIDw8IGk7Ci0JCW1heF9nZW5fY2xrc1tpXS5yZWcgPSByZWc7Ci0KLQkJaW5pdCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaW5pdCksIEdGUF9LRVJORUwpOwotCQlpZiAoIWluaXQpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlpZiAoZGV2LT5vZl9ub2RlICYmCi0JCSAgICAhb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgoZGV2LT5vZl9ub2RlLAotCQkJCQkJICAgImNsb2NrLW91dHB1dC1uYW1lcyIsCi0JCQkJCQkgICBpLCAmY2xrX25hbWUpKQotCQkJaW5pdC0+bmFtZSA9IGNsa19uYW1lOwotCQllbHNlCi0JCQlpbml0LT5uYW1lID0gY2xrc19pbml0W2ldLm5hbWU7Ci0KLQkJaW5pdC0+b3BzID0gY2xrc19pbml0W2ldLm9wczsKLQkJaW5pdC0+ZmxhZ3MgPSBjbGtzX2luaXRbaV0uZmxhZ3M7Ci0KLQkJbWF4X2dlbl9jbGtzW2ldLmh3LmluaXQgPSBpbml0OwotCi0JCWNsb2Nrc1tpXSA9IG1heF9nZW5fY2xrX3JlZ2lzdGVyKGRldiwgJm1heF9nZW5fY2xrc1tpXSk7Ci0JCWlmIChJU19FUlIoY2xvY2tzW2ldKSkgewotCQkJcmV0ID0gUFRSX0VSUihjbG9ja3NbaV0pOwotCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgJXNcbiIsCi0JCQkJbWF4X2dlbl9jbGtzW2ldLmh3LmluaXQtPm5hbWUpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNsb2Nrcyk7Ci0KLQlpZiAoZGV2LT5vZl9ub2RlKSB7Ci0JCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhICpvZl9kYXRhOwotCi0JCW9mX2RhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKm9mX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFvZl9kYXRhKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJb2ZfZGF0YS0+Y2xrcyA9IGNsb2NrczsKLQkJb2ZfZGF0YS0+Y2xrX251bSA9IG51bV9pbml0OwotCQlyZXQgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKGRldi0+b2Zfbm9kZSwgb2ZfY2xrX3NyY19vbmVjZWxsX2dldCwKLQkJCQkJICBvZl9kYXRhKTsKLQotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBPRiBjbG9jayBwcm92aWRlclxuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChtYXhfZ2VuX2Nsa19wcm9iZSk7Ci0KLWludCBtYXhfZ2VuX2Nsa19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IG51bV9pbml0KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBkZXYtPmRldi5wYXJlbnQ7Ci0KLQlpZiAoZGV2LT5vZl9ub2RlKQotCQlvZl9jbGtfZGVsX3Byb3ZpZGVyKGRldi0+b2Zfbm9kZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG1heF9nZW5fY2xrX3JlbW92ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstbWF4LWdlbi5oIGIvZHJpdmVycy9jbGsvY2xrLW1heC1nZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3ZTg2Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2Nsay9jbGstbWF4LWdlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIGNsay1tYXgtZ2VuLmggLSBHZW5lcmljIGNsb2NrIGRyaXZlciBmb3IgTWF4aW0gUE1JQ3MgY2xvY2tzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEdvb2dsZSwgSW5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fQ0xLX01BWF9HRU5fSF9fCi0jZGVmaW5lIF9fQ0xLX01BWF9HRU5fSF9fCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotCi1pbnQgbWF4X2dlbl9jbGtfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwLAotCQkgICAgICB1MzIgcmVnLCBzdHJ1Y3QgY2xrX2luaXRfZGF0YSAqY2xrc19pbml0LCBpbnQgbnVtX2luaXQpOwotaW50IG1heF9nZW5fY2xrX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgbnVtX2luaXQpOwotZXh0ZXJuIHN0cnVjdCBjbGtfb3BzIG1heF9nZW5fY2xrX29wczsKLQotI2VuZGlmIC8qIF9fQ0xLX01BWF9HRU5fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstbWF4Nzc2ODYuYyBiL2RyaXZlcnMvY2xrL2Nsay1tYXg3NzY4Ni5jCmluZGV4IDliNmYyNzcuLmI2MzdmNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1tYXg3NzY4Ni5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1tYXg3NzY4Ni5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGNsay1tYXg3NzY4Ni5jIC0gQ2xvY2sgZHJpdmVyIGZvciBNYXhpbSA3NzY4NgorICogY2xrLW1heDc3Njg2LmMgLSBDbG9jayBkcml2ZXIgZm9yIE1heGltIDc3Njg2L01BWDc3ODAyCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDEyIFNhbXN1bmcgRWxlY3Rvcm5pY3MKICAqIEpvbmdod2EgTGVlIDxqb25naHdhMy5sZWVAc2Ftc3VuZy5jb20+CkBAIC0yNSw0NiArMjUsMjg0IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDc3NjIwLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL21heDc3Njg2Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL21heDc3Njg2LXByaXZhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAKICNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzY4Ni5oPgotI2luY2x1ZGUgImNsay1tYXgtZ2VuLmgiCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc4MDIuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzYyMC5oPgogCi1zdGF0aWMgc3RydWN0IGNsa19pbml0X2RhdGEgbWF4Nzc2ODZfY2xrc19pbml0W01BWDc3Njg2X0NMS1NfTlVNXSA9IHsKKyNkZWZpbmUgTUFYNzc4MDJfQ0xPQ0tfTE9XX0pJVFRFUl9TSElGVCAweDMKKworZW51bSBtYXg3NzY4Nl9jaGlwX25hbWUgeworCUNISVBfTUFYNzc2ODYsCisJQ0hJUF9NQVg3NzgwMiwKKwlDSElQX01BWDc3NjIwLAorfTsKKworc3RydWN0IG1heDc3Njg2X2h3X2Nsa19pbmZvIHsKKwljb25zdCBjaGFyICpuYW1lOworCXUzMiBjbGtfcmVnOworCXUzMiBjbGtfZW5hYmxlX21hc2s7CisJdTMyIGZsYWdzOworfTsKKworc3RydWN0IG1heDc3Njg2X2Nsa19pbml0X2RhdGEgeworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgY2xrX2h3IGh3OworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGNsa19pZGF0YTsKKwljb25zdCBzdHJ1Y3QgbWF4Nzc2ODZfaHdfY2xrX2luZm8gKmNsa19pbmZvOworfTsKKworc3RydWN0IG1heDc3Njg2X2Nsa19kcml2ZXJfZGF0YSB7CisJZW51bSBtYXg3NzY4Nl9jaGlwX25hbWUgY2hpcDsKKwlzdHJ1Y3QgbWF4Nzc2ODZfY2xrX2luaXRfZGF0YSAqbWF4X2Nsa19kYXRhOworCXNpemVfdCBudW1fY2xrczsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QKK21heDc3Njg2X2h3X2Nsa19pbmZvIG1heDc3Njg2X2h3X2Nsa3NfaW5mb1tNQVg3NzY4Nl9DTEtTX05VTV0gPSB7CiAJW01BWDc3Njg2X0NMS19BUF0gPSB7CiAJCS5uYW1lID0gIjMya2h6X2FwIiwKLQkJLm9wcyA9ICZtYXhfZ2VuX2Nsa19vcHMsCisJCS5jbGtfcmVnID0gTUFYNzc2ODZfUkVHXzMyS0haLAorCQkuY2xrX2VuYWJsZV9tYXNrID0gQklUKE1BWDc3Njg2X0NMS19BUCksCiAJfSwKIAlbTUFYNzc2ODZfQ0xLX0NQXSA9IHsKIAkJLm5hbWUgPSAiMzJraHpfY3AiLAotCQkub3BzID0gJm1heF9nZW5fY2xrX29wcywKKwkJLmNsa19yZWcgPSBNQVg3NzY4Nl9SRUdfMzJLSFosCisJCS5jbGtfZW5hYmxlX21hc2sgPSBCSVQoTUFYNzc2ODZfQ0xLX0NQKSwKIAl9LAogCVtNQVg3NzY4Nl9DTEtfUE1JQ10gPSB7CiAJCS5uYW1lID0gIjMya2h6X3BtaWMiLAotCQkub3BzID0gJm1heF9nZW5fY2xrX29wcywKKwkJLmNsa19yZWcgPSBNQVg3NzY4Nl9SRUdfMzJLSFosCisJCS5jbGtfZW5hYmxlX21hc2sgPSBCSVQoTUFYNzc2ODZfQ0xLX1BNSUMpLAogCX0sCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0CittYXg3NzY4Nl9od19jbGtfaW5mbyBtYXg3NzgwMl9od19jbGtzX2luZm9bTUFYNzc4MDJfQ0xLU19OVU1dID0geworCVtNQVg3NzgwMl9DTEtfMzJLX0FQXSA9IHsKKwkJLm5hbWUgPSAiMzJraHpfYXAiLAorCQkuY2xrX3JlZyA9IE1BWDc3ODAyX1JFR18zMktIWiwKKwkJLmNsa19lbmFibGVfbWFzayA9IEJJVChNQVg3NzgwMl9DTEtfMzJLX0FQKSwKKwl9LAorCVtNQVg3NzgwMl9DTEtfMzJLX0NQXSA9IHsKKwkJLm5hbWUgPSAiMzJraHpfY3AiLAorCQkuY2xrX3JlZyA9IE1BWDc3ODAyX1JFR18zMktIWiwKKwkJLmNsa19lbmFibGVfbWFzayA9IEJJVChNQVg3NzgwMl9DTEtfMzJLX0NQKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdAorbWF4Nzc2ODZfaHdfY2xrX2luZm8gbWF4Nzc2MjBfaHdfY2xrc19pbmZvW01BWDc3NjIwX0NMS1NfTlVNXSA9IHsKKwlbTUFYNzc2MjBfQ0xLXzMyS19PVVQwXSA9IHsKKwkJLm5hbWUgPSAiMzJraHpfb3V0MCIsCisJCS5jbGtfcmVnID0gTUFYNzc2MjBfUkVHX0NORkcxXzMySywKKwkJLmNsa19lbmFibGVfbWFzayA9IE1BWDc3NjIwX0NORkcxXzMyS19PVVQwX0VOLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG1heDc3Njg2X2Nsa19pbml0X2RhdGEgKnRvX21heDc3Njg2X2Nsa19pbml0X2RhdGEoCisJCQkJc3RydWN0IGNsa19odyAqaHcpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihodywgc3RydWN0IG1heDc3Njg2X2Nsa19pbml0X2RhdGEsIGh3KTsKK30KKworc3RhdGljIGludCBtYXg3NzY4Nl9jbGtfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgbWF4Nzc2ODZfY2xrX2luaXRfZGF0YSAqbWF4Nzc2ODYgPSB0b19tYXg3NzY4Nl9jbGtfaW5pdF9kYXRhKGh3KTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMobWF4Nzc2ODYtPnJlZ21hcCwgbWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfcmVnLAorCQkJCSAgbWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfZW5hYmxlX21hc2ssCisJCQkJICBtYXg3NzY4Ni0+Y2xrX2luZm8tPmNsa19lbmFibGVfbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIG1heDc3Njg2X2Nsa191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IG1heDc3Njg2X2Nsa19pbml0X2RhdGEgKm1heDc3Njg2ID0gdG9fbWF4Nzc2ODZfY2xrX2luaXRfZGF0YShodyk7CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMobWF4Nzc2ODYtPnJlZ21hcCwgbWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfcmVnLAorCQkJICAgbWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfZW5hYmxlX21hc2ssCisJCQkgICB+bWF4Nzc2ODYtPmNsa19pbmZvLT5jbGtfZW5hYmxlX21hc2spOworfQorCitzdGF0aWMgaW50IG1heDc3Njg2X2Nsa19pc19wcmVwYXJlZChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgbWF4Nzc2ODZfY2xrX2luaXRfZGF0YSAqbWF4Nzc2ODYgPSB0b19tYXg3NzY4Nl9jbGtfaW5pdF9kYXRhKGh3KTsKKwlpbnQgcmV0OworCXUzMiB2YWw7CisKKwlyZXQgPSByZWdtYXBfcmVhZChtYXg3NzY4Ni0+cmVnbWFwLCBtYXg3NzY4Ni0+Y2xrX2luZm8tPmNsa19yZWcsICZ2YWwpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHZhbCAmIG1heDc3Njg2LT5jbGtfaW5mby0+Y2xrX2VuYWJsZV9tYXNrOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXg3NzY4Nl9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJCQkJICB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQoreworCXJldHVybiAzMjc2ODsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIG1heDc3Njg2X2Nsa19vcHMgPSB7CisJLnByZXBhcmUJPSBtYXg3NzY4Nl9jbGtfcHJlcGFyZSwKKwkudW5wcmVwYXJlCT0gbWF4Nzc2ODZfY2xrX3VucHJlcGFyZSwKKwkuaXNfcHJlcGFyZWQJPSBtYXg3NzY4Nl9jbGtfaXNfcHJlcGFyZWQsCisJLnJlY2FsY19yYXRlCT0gbWF4Nzc2ODZfcmVjYWxjX3JhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitvZl9jbGtfbWF4Nzc2ODZfZ2V0KHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmNsa3NwZWMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1heDc3Njg2X2Nsa19kcml2ZXJfZGF0YSAqZHJ2X2RhdGEgPSBkYXRhOworCXVuc2lnbmVkIGludCBpZHggPSBjbGtzcGVjLT5hcmdzWzBdOworCisJaWYgKGlkeCA+PSBkcnZfZGF0YS0+bnVtX2Nsa3MpIHsKKwkJcHJfZXJyKCIlczogaW52YWxpZCBpbmRleCAldVxuIiwgX19mdW5jX18sIGlkeCk7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXJldHVybiAmZHJ2X2RhdGEtPm1heF9jbGtfZGF0YVtpZHhdLmh3OworfQorCiBzdGF0aWMgaW50IG1heDc3Njg2X2Nsa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBtYXg3NzY4Nl9kZXYgKmlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gZGV2LT5wYXJlbnQ7CisJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqaWQgPSBwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpOworCXN0cnVjdCBtYXg3NzY4Nl9jbGtfZHJpdmVyX2RhdGEgKmRydl9kYXRhOworCWNvbnN0IHN0cnVjdCBtYXg3NzY4Nl9od19jbGtfaW5mbyAqaHdfY2xrczsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJaW50IGksIHJldCwgbnVtX2Nsa3M7CiAKLQlyZXR1cm4gbWF4X2dlbl9jbGtfcHJvYmUocGRldiwgaW9kZXYtPnJlZ21hcCwgTUFYNzc2ODZfUkVHXzMyS0haLAotCQkJCSBtYXg3NzY4Nl9jbGtzX2luaXQsIE1BWDc3Njg2X0NMS1NfTlVNKTsKKwlkcnZfZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZHJ2X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRydl9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlZ21hcCA9IGRldl9nZXRfcmVnbWFwKHBhcmVudCwgTlVMTCk7CisJaWYgKCFyZWdtYXApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHJ0YyByZWdtYXBcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkcnZfZGF0YS0+Y2hpcCA9IGlkLT5kcml2ZXJfZGF0YTsKKworCXN3aXRjaCAoZHJ2X2RhdGEtPmNoaXApIHsKKwljYXNlIENISVBfTUFYNzc2ODY6CisJCW51bV9jbGtzID0gTUFYNzc2ODZfQ0xLU19OVU07CisJCWh3X2Nsa3MgPSBtYXg3NzY4Nl9od19jbGtzX2luZm87CisJCWJyZWFrOworCisJY2FzZSBDSElQX01BWDc3ODAyOgorCQludW1fY2xrcyA9IE1BWDc3ODAyX0NMS1NfTlVNOworCQlod19jbGtzID0gbWF4Nzc4MDJfaHdfY2xrc19pbmZvOworCQlicmVhazsKKworCWNhc2UgQ0hJUF9NQVg3NzYyMDoKKwkJbnVtX2Nsa3MgPSBNQVg3NzYyMF9DTEtTX05VTTsKKwkJaHdfY2xrcyA9IG1heDc3NjIwX2h3X2Nsa3NfaW5mbzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIlVua25vd24gQ2hpcCBJRFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRydl9kYXRhLT5tYXhfY2xrX2RhdGEgPSBkZXZtX2tjYWxsb2MoZGV2LCBudW1fY2xrcywKKwkJCQkJICAgICAgc2l6ZW9mKCpkcnZfZGF0YS0+bWF4X2Nsa19kYXRhKSwKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnZfZGF0YS0+bWF4X2Nsa19kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY2xrczsgaSsrKSB7CisJCXN0cnVjdCBtYXg3NzY4Nl9jbGtfaW5pdF9kYXRhICptYXhfY2xrX2RhdGE7CisJCWNvbnN0IGNoYXIgKmNsa19uYW1lOworCisJCW1heF9jbGtfZGF0YSA9ICZkcnZfZGF0YS0+bWF4X2Nsa19kYXRhW2ldOworCisJCW1heF9jbGtfZGF0YS0+cmVnbWFwID0gcmVnbWFwOworCQltYXhfY2xrX2RhdGEtPmNsa19pbmZvID0gJmh3X2Nsa3NbaV07CisJCW1heF9jbGtfZGF0YS0+Y2xrX2lkYXRhLmZsYWdzID0gaHdfY2xrc1tpXS5mbGFnczsKKwkJbWF4X2Nsa19kYXRhLT5jbGtfaWRhdGEub3BzID0gJm1heDc3Njg2X2Nsa19vcHM7CisKKwkJaWYgKHBhcmVudC0+b2Zfbm9kZSAmJgorCQkgICAgIW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KHBhcmVudC0+b2Zfbm9kZSwKKwkJCQkJCSAgICJjbG9jay1vdXRwdXQtbmFtZXMiLAorCQkJCQkJICAgaSwgJmNsa19uYW1lKSkKKwkJCW1heF9jbGtfZGF0YS0+Y2xrX2lkYXRhLm5hbWUgPSBjbGtfbmFtZTsKKwkJZWxzZQorCQkJbWF4X2Nsa19kYXRhLT5jbGtfaWRhdGEubmFtZSA9IGh3X2Nsa3NbaV0ubmFtZTsKKworCQltYXhfY2xrX2RhdGEtPmh3LmluaXQgPSAmbWF4X2Nsa19kYXRhLT5jbGtfaWRhdGE7CisKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoZGV2LCAmbWF4X2Nsa19kYXRhLT5odyk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNsb2NrIHJlZ2lzdGVyOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBjbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KCZtYXhfY2xrX2RhdGEtPmh3LAorCQkJCQkgICAgIG1heF9jbGtfZGF0YS0+Y2xrX2lkYXRhLm5hbWUsIE5VTEwpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY2xrZGV2IHJlZ2lzdGVyOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlpZiAocGFyZW50LT5vZl9ub2RlKSB7CisJCXJldCA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIocGFyZW50LT5vZl9ub2RlLCBvZl9jbGtfbWF4Nzc2ODZfZ2V0LAorCQkJCQkgICAgIGRydl9kYXRhKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgT0YgY2xvY2sgcHJvdmlkZXI6ICVkXG4iLAorCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogTUFYNzc4MDI6IEVuYWJsZSBsb3ctaml0dGVyIG1vZGUgb24gdGhlIDMya2h6IGNsb2Nrcy4gKi8KKwlpZiAoZHJ2X2RhdGEtPmNoaXAgPT0gQ0hJUF9NQVg3NzgwMikgeworCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocmVnbWFwLCBNQVg3NzgwMl9SRUdfMzJLSFosCisJCQkJCSAxIDw8IE1BWDc3ODAyX0NMT0NLX0xPV19KSVRURVJfU0hJRlQsCisJCQkJCSAxIDw8IE1BWDc3ODAyX0NMT0NLX0xPV19KSVRURVJfU0hJRlQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY29uZmlnIGxvdy1qaXR0ZXI6ICVkXG4iLCByZXQpOworCQkJZ290byByZW1vdmVfb2ZfY2xrX3Byb3ZpZGVyOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK3JlbW92ZV9vZl9jbGtfcHJvdmlkZXI6CisJaWYgKHBhcmVudC0+b2Zfbm9kZSkKKwkJb2ZfY2xrX2RlbF9wcm92aWRlcihwYXJlbnQtPm9mX25vZGUpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBtYXg3NzY4Nl9jbGtfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JcmV0dXJuIG1heF9nZW5fY2xrX3JlbW92ZShwZGV2LCBNQVg3NzY4Nl9DTEtTX05VTSk7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gcGRldi0+ZGV2LnBhcmVudDsKKworCWlmIChwYXJlbnQtPm9mX25vZGUpCisJCW9mX2Nsa19kZWxfcHJvdmlkZXIocGFyZW50LT5vZl9ub2RlKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBtYXg3NzY4Nl9jbGtfaWRbXSA9IHsKLQl7ICJtYXg3NzY4Ni1jbGsiLCAwfSwKLQl7IH0sCisJeyAibWF4Nzc2ODYtY2xrIiwgLmRyaXZlcl9kYXRhID0gQ0hJUF9NQVg3NzY4NiwgfSwKKwl7ICJtYXg3NzgwMi1jbGsiLCAuZHJpdmVyX2RhdGEgPSBDSElQX01BWDc3ODAyLCB9LAorCXsgIm1heDc3NjIwLWNsb2NrIiwgLmRyaXZlcl9kYXRhID0gQ0hJUF9NQVg3NzYyMCwgfSwKKwl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBtYXg3NzY4Nl9jbGtfaWQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstbWF4Nzc4MDIuYyBiL2RyaXZlcnMvY2xrL2Nsay1tYXg3NzgwMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTVkZDJlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvY2xrL2Nsay1tYXg3NzgwMi5jCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIGNsay1tYXg3NzgwMi5jIC0gQ2xvY2sgZHJpdmVyIGZvciBNYXhpbSA3NzgwMgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBHb29nbGUsIEluYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0b3JuaWNzCi0gKiBKb25naHdhIExlZSA8am9uZ2h3YTMubGVlQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiBjbGstbWF4Nzc2ODYuYwotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21heDc3Njg2LXByaXZhdGUuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgotCi0jaW5jbHVkZSA8ZHQtYmluZGluZ3MvY2xvY2svbWF4aW0sbWF4Nzc4MDIuaD4KLSNpbmNsdWRlICJjbGstbWF4LWdlbi5oIgotCi0jZGVmaW5lIE1BWDc3ODAyX0NMT0NLX09QTU9ERV9NQVNLCTB4MQotI2RlZmluZSBNQVg3NzgwMl9DTE9DS19MT1dfSklUVEVSX1NISUZUIDB4MwotCi1zdGF0aWMgc3RydWN0IGNsa19pbml0X2RhdGEgbWF4Nzc4MDJfY2xrc19pbml0W01BWDc3ODAyX0NMS1NfTlVNXSA9IHsKLQlbTUFYNzc4MDJfQ0xLXzMyS19BUF0gPSB7Ci0JCS5uYW1lID0gIjMya2h6X2FwIiwKLQkJLm9wcyA9ICZtYXhfZ2VuX2Nsa19vcHMsCi0JfSwKLQlbTUFYNzc4MDJfQ0xLXzMyS19DUF0gPSB7Ci0JCS5uYW1lID0gIjMya2h6X2NwIiwKLQkJLm9wcyA9ICZtYXhfZ2VuX2Nsa19vcHMsCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgbWF4Nzc4MDJfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1heDc3Njg2X2RldiAqaW9kZXYgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0JaW50IHJldDsKLQotCXJldCA9IG1heF9nZW5fY2xrX3Byb2JlKHBkZXYsIGlvZGV2LT5yZWdtYXAsIE1BWDc3ODAyX1JFR18zMktIWiwKLQkJCQltYXg3NzgwMl9jbGtzX2luaXQsIE1BWDc3ODAyX0NMS1NfTlVNKTsKLQotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZ2VuZXJpYyBwcm9iZSBmYWlsZWQgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogRW5hYmxlIGxvdy1qaXR0ZXIgbW9kZSBvbiB0aGUgMzJraHogY2xvY2tzLiAqLwotCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhpb2Rldi0+cmVnbWFwLCBNQVg3NzgwMl9SRUdfMzJLSFosCi0JCQkJIDEgPDwgTUFYNzc4MDJfQ0xPQ0tfTE9XX0pJVFRFUl9TSElGVCwKLQkJCQkgMSA8PCBNQVg3NzgwMl9DTE9DS19MT1dfSklUVEVSX1NISUZUKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBsb3ctaml0dGVyIG1vZGVcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtYXg3NzgwMl9jbGtfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIG1heF9nZW5fY2xrX3JlbW92ZShwZGV2LCBNQVg3NzgwMl9DTEtTX05VTSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG1heDc3ODAyX2Nsa19pZFtdID0gewotCXsgIm1heDc3ODAyLWNsayIsIDB9LAotCXsgfSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBtYXg3NzgwMl9jbGtfaWQpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtYXg3NzgwMl9jbGtfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lICA9ICJtYXg3NzgwMi1jbGsiLAotCX0sCi0JLnByb2JlID0gbWF4Nzc4MDJfY2xrX3Byb2JlLAotCS5yZW1vdmUgPSBtYXg3NzgwMl9jbGtfcmVtb3ZlLAotCS5pZF90YWJsZSA9IG1heDc3ODAyX2Nsa19pZCwKLX07Ci0KLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWF4Nzc4MDJfY2xrX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiTUFYSU0gNzc4MDIgQ2xvY2sgRHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJKYXZpZXIgTWFydGluZXogQ2FuaWxsYXMgPGphdmllckBvc2cuc2Ftc3VuZy5jb20iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1tYjg2czd4LmMgYi9kcml2ZXJzL2Nsay9jbGstbWI4NnM3eC5jCmluZGV4IGUwODE3NzUuLjJhODNhM2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstbWI4NnM3eC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1tYjg2czd4LmMKQEAgLTMyNywxMCArMzI3LDExIEBACiAJLnNldF9yYXRlID0gY2xjX3NldF9yYXRlLAogfTsKIAotc3RydWN0IGNsayAqbWI4NnM3eF9jbGNsa19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpjcHVfZGV2KQorc3RhdGljIHN0cnVjdCBjbGtfaHcgKm1iODZzN3hfY2xjbGtfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqY3B1X2RldikKIHsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwogCXN0cnVjdCBjbF9jbGsgKmNsYzsKKwlpbnQgcmV0OwogCiAJY2xjID0ga3phbGxvYyhzaXplb2YoKmNsYyksIEdGUF9LRVJORUwpOwogCWlmICghY2xjKQpAQCAtMzQ0LDE0ICszNDUsMTcgQEAKIAlpbml0LmZsYWdzID0gQ0xLX0dFVF9SQVRFX05PQ0FDSEU7CiAJaW5pdC5udW1fcGFyZW50cyA9IDA7CiAKLQlyZXR1cm4gZGV2bV9jbGtfcmVnaXN0ZXIoY3B1X2RldiwgJmNsYy0+aHcpOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGNwdV9kZXYsICZjbGMtPmh3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCXJldHVybiAmY2xjLT5odzsKIH0KIAogc3RhdGljIGludCBtYjg2czd4X2NsY2xrX29mX2luaXQodm9pZCkKIHsKIAlpbnQgY3B1LCByZXQgPSAtRU5PREVWOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCiAJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnVqaXRzdSxtYjg2czcwLXNjYi0xLjAiKTsKIAlpZiAoIW5wIHx8ICFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKG5wKSkKQEAgLTM2NSwxMiArMzY5LDEyIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWNsayA9IG1iODZzN3hfY2xjbGtfcmVnaXN0ZXIoY3B1X2Rldik7Ci0JCWlmIChJU19FUlIoY2xrKSkgeworCQlodyA9IG1iODZzN3hfY2xjbGtfcmVnaXN0ZXIoY3B1X2Rldik7CisJCWlmIChJU19FUlIoaHcpKSB7CiAJCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBjcHUlZCBjbG9ja1xuIiwgY3B1KTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmIChjbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgTlVMTCwgZGV2X25hbWUoY3B1X2RldikpKSB7CisJCWlmIChjbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCBOVUxMLCBkZXZfbmFtZShjcHVfZGV2KSkpIHsKIAkJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIGNwdSVkIGNsb2NrIGxvb2t1cFxuIiwgY3B1KTsKIAkJCWNvbnRpbnVlOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstbW94YXJ0LmMgYi9kcml2ZXJzL2Nsay9jbGstbW94YXJ0LmMKaW5kZXggZjM3ZjcxOS4uYjg2ZGFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLW1veGFydC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1tb3hhcnQuYwpAQCAtMTksNyArMTksOCBAQAogc3RhdGljIHZvaWQgX19pbml0IG1veGFydF9vZl9wbGxfY2xrX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewogCXN0YXRpYyB2b2lkIF9faW9tZW0gKmJhc2U7Ci0Jc3RydWN0IGNsayAqY2xrLCAqcmVmX2NsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKKwlzdHJ1Y3QgY2xrICpyZWZfY2xrOwogCXVuc2lnbmVkIGludCBtdWw7CiAJY29uc3QgY2hhciAqbmFtZSA9IG5vZGUtPm5hbWU7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CkBAIC00MiwxNCArNDMsMTQgQEAKIAkJcmV0dXJuOwogCX0KIAotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9mYWN0b3IoTlVMTCwgbmFtZSwgcGFyZW50X25hbWUsIDAsIG11bCwgMSk7Ci0JaWYgKElTX0VSUihjbGspKSB7CisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIG5hbWUsIHBhcmVudF9uYW1lLCAwLCBtdWwsIDEpOworCWlmIChJU19FUlIoaHcpKSB7CiAJCXByX2VycigiJXM6IGZhaWxlZCB0byByZWdpc3RlciBjbG9ja1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKIAkJcmV0dXJuOwogCX0KIAotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCBOVUxMLCBuYW1lKTsKLQlvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwljbGtfaHdfcmVnaXN0ZXJfY2xrZGV2KGh3LCBOVUxMLCBuYW1lKTsKKwlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiB9CiBDTEtfT0ZfREVDTEFSRShtb3hhcnRfcGxsX2Nsb2NrLCAibW94YSxtb3hhcnQtcGxsLWNsb2NrIiwKIAkgICAgICAgbW94YXJ0X29mX3BsbF9jbGtfaW5pdCk7CkBAIC01Nyw3ICs1OCw4IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgbW94YXJ0X29mX2FwYl9jbGtfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7CiAJc3RhdGljIHZvaWQgX19pb21lbSAqYmFzZTsKLQlzdHJ1Y3QgY2xrICpjbGssICpwbGxfY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OworCXN0cnVjdCBjbGsgKnBsbF9jbGs7CiAJdW5zaWduZWQgaW50IGRpdiwgdmFsOwogCXVuc2lnbmVkIGludCBkaXZfaWR4W10gPSB7IDIsIDMsIDQsIDYsIDh9OwogCWNvbnN0IGNoYXIgKm5hbWUgPSBub2RlLT5uYW1lOwpAQCAtODUsMTQgKzg3LDE0IEBACiAJCXJldHVybjsKIAl9CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIG5hbWUsIHBhcmVudF9uYW1lLCAwLCAxLCBkaXYpOwotCWlmIChJU19FUlIoY2xrKSkgeworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX2ZhY3RvcihOVUxMLCBuYW1lLCBwYXJlbnRfbmFtZSwgMCwgMSwgZGl2KTsKKwlpZiAoSVNfRVJSKGh3KSkgewogCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2tcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CiAJCXJldHVybjsKIAl9CiAKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgTlVMTCwgbmFtZSk7Ci0Jb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgTlVMTCwgbmFtZSk7CisJb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOwogfQogQ0xLX09GX0RFQ0xBUkUobW94YXJ0X2FwYl9jbG9jaywgIm1veGEsbW94YXJ0LWFwYi1jbG9jayIsCiAJICAgICAgIG1veGFydF9vZl9hcGJfY2xrX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLW5zcGlyZS5jIGIvZHJpdmVycy9jbGsvY2xrLW5zcGlyZS5jCmluZGV4IDY0ZjE5NmEuLmY4NjEwMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1uc3BpcmUuYworKysgYi9kcml2ZXJzL2Nsay9jbGstbnNwaXJlLmMKQEAgLTY5LDcgKzY5LDcgQEAKIHsKIAl1MzIgdmFsOwogCXZvaWQgX19pb21lbSAqaW87Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKmNsa19uYW1lID0gbm9kZS0+bmFtZTsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAlzdHJ1Y3QgbnNwaXJlX2Nsa19pbmZvIGluZm87CkBAIC04NSwxMCArODUsMTAgQEAKIAlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhub2RlLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJmNsa19uYW1lKTsKIAlwYXJlbnRfbmFtZSA9IG9mX2Nsa19nZXRfcGFyZW50X25hbWUobm9kZSwgMCk7CiAKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIGNsa19uYW1lLCBwYXJlbnRfbmFtZSwgMCwKLQkJCQkJMSwgaW5mby5iYXNlX2FoYl9yYXRpbyk7Ci0JaWYgKCFJU19FUlIoY2xrKSkKLQkJb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZml4ZWRfZmFjdG9yKE5VTEwsIGNsa19uYW1lLCBwYXJlbnRfbmFtZSwgMCwKKwkJCQkJICAxLCBpbmZvLmJhc2VfYWhiX3JhdGlvKTsKKwlpZiAoIUlTX0VSUihodykpCisJCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG5zcGlyZV9haGJkaXZfc2V0dXBfY3goc3RydWN0IGRldmljZV9ub2RlICpub2RlKQpAQCAtMTExLDcgKzExMSw3IEBACiB7CiAJdTMyIHZhbDsKIAl2b2lkIF9faW9tZW0gKmlvOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAljb25zdCBjaGFyICpjbGtfbmFtZSA9IG5vZGUtPm5hbWU7CiAJc3RydWN0IG5zcGlyZV9jbGtfaW5mbyBpbmZvOwogCkBAIC0xMjUsOSArMTI1LDEwIEBACiAKIAlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhub2RlLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJmNsa19uYW1lKTsKIAotCWNsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKE5VTEwsIGNsa19uYW1lLCBOVUxMLCAwLCBpbmZvLmJhc2VfY2xvY2spOwotCWlmICghSVNfRVJSKGNsaykpCi0JCW9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCWh3ID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoTlVMTCwgY2xrX25hbWUsIE5VTEwsIDAsCisJCQkJCWluZm8uYmFzZV9jbG9jayk7CisJaWYgKCFJU19FUlIoaHcpKQorCQlvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CiAJZWxzZQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1wYWxtYXMuYyBiL2RyaXZlcnMvY2xrL2Nsay1wYWxtYXMuYwppbmRleCA4MzI4ODYzLi4zMWY1OTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstcGFsbWFzLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXBhbG1hcy5jCkBAIC00MSw3ICs0MSw2IEBACiAKIHN0cnVjdCBwYWxtYXNfY2xvY2tfaW5mbyB7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBjbGsgKmNsazsKIAlzdHJ1Y3QgY2xrX2h3IGh3OwogCXN0cnVjdCBwYWxtYXMgKnBhbG1hczsKIAljb25zdCBzdHJ1Y3QgcGFsbWFzX2NsazMya19kZXNjICpjbGtfZGVzYzsKQEAgLTIxOCw3ICsyMTcsNyBAQAogCX0KIAogCWlmIChjaW5mby0+ZXh0X2NvbnRyb2xfcGluKSB7Ci0JCXJldCA9IGNsa19wcmVwYXJlKGNpbmZvLT5jbGspOworCQlyZXQgPSBjbGtfcHJlcGFyZShjaW5mby0+aHcuY2xrKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoY2luZm8tPmRldiwgIkNsb2NrIHByZXAgZmFpbGVkLCAlZFxuIiwgcmV0KTsKIAkJCXJldHVybiByZXQ7CkBAIC0yNDIsNyArMjQxLDYgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAljb25zdCBzdHJ1Y3QgcGFsbWFzX2Nsa3Nfb2ZfbWF0Y2hfZGF0YSAqbWF0Y2hfZGF0YTsKIAlzdHJ1Y3QgcGFsbWFzX2Nsb2NrX2luZm8gKmNpbmZvOwotCXN0cnVjdCBjbGsgKmNsazsKIAlpbnQgcmV0OwogCiAJbWF0Y2hfZGF0YSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKQEAgLTI2MSwyMiArMjU5LDIwIEBACiAKIAljaW5mby0+Y2xrX2Rlc2MgPSAmbWF0Y2hfZGF0YS0+ZGVzYzsKIAljaW5mby0+aHcuaW5pdCA9ICZtYXRjaF9kYXRhLT5pbml0OwotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjaW5mby0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkgewotCQlyZXQgPSBQVFJfRVJSKGNsayk7CisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNpbmZvLT5odyk7CisJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsIHRvIHJlZ2lzdGVyIGNsb2NrICVzLCAlZFxuIiwKIAkJCW1hdGNoX2RhdGEtPmRlc2MuY2xrX25hbWUsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JY2luZm8tPmNsayA9IGNsazsKIAlyZXQgPSBwYWxtYXNfY2xrc19pbml0X2NvbmZpZ3VyZShjaW5mbyk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2xvY2sgY29uZmlnIGZhaWxlZCwgJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNpbmZvLT5jbGspOworCXJldCA9IG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsICZjaW5mby0+aHcpOwogCWlmIChyZXQgPCAwKQogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsIHRvIGFkZCBjbG9jayBkcml2ZXIsICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstcHdtLmMgYi9kcml2ZXJzL2Nsay9jbGstcHdtLmMKaW5kZXggMTYzMGExZi4uOGNiOWQxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXB3bS5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1wd20uYwpAQCAtNjEsNyArNjEsNiBAQAogCXN0cnVjdCBwd21fZGV2aWNlICpwd207CiAJc3RydWN0IHB3bV9hcmdzIHBhcmdzOwogCWNvbnN0IGNoYXIgKmNsa19uYW1lOwotCXN0cnVjdCBjbGsgKmNsazsKIAlpbnQgcmV0OwogCiAJY2xrX3B3bSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNsa19wd20pLCBHRlBfS0VSTkVMKTsKQEAgLTEwNywxMSArMTA2LDExIEBACiAKIAljbGtfcHdtLT5wd20gPSBwd207CiAJY2xrX3B3bS0+aHcuaW5pdCA9ICZpbml0OwotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtfcHdtLT5odyk7Ci0JaWYgKElTX0VSUihjbGspKQotCQlyZXR1cm4gUFRSX0VSUihjbGspOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtfcHdtLT5odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCXJldHVybiBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKKwlyZXR1cm4gb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgJmNsa19wd20tPmh3KTsKIH0KIAogc3RhdGljIGludCBjbGtfcHdtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXFvcmlxLmMgYi9kcml2ZXJzL2Nsay9jbGstcW9yaXEuYwppbmRleCA1ODU2NmExNy4uMjBiMTA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXFvcmlxLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXFvcmlxLmMKQEAgLTc2Niw3ICs3NjYsMTEgQEAKIAlpZiAoIWh3YykKIAkJcmV0dXJuIE5VTEw7CiAKLQlod2MtPnJlZyA9IGNnLT5yZWdzICsgMHgyMCAqIGlkeDsKKwlpZiAoY2ctPmluZm8uZmxhZ3MgJiBDR19WRVIzKQorCQlod2MtPnJlZyA9IGNnLT5yZWdzICsgMHg3MDAwMCArIDB4MjAgKiBpZHg7CisJZWxzZQorCQlod2MtPnJlZyA9IGNnLT5yZWdzICsgMHgyMCAqIGlkeDsKKwogCWh3Yy0+aW5mbyA9IGNnLT5pbmZvLmNtdXhfZ3JvdXBzW2NnLT5pbmZvLmNtdXhfdG9fZ3JvdXBbaWR4XV07CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXJrODA4LmMgYi9kcml2ZXJzL2Nsay9jbGstcms4MDguYwppbmRleCA3NDM4MzAzLi42NDYxZjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstcms4MDguYworKysgYi9kcml2ZXJzL2Nsay9jbGstcms4MDguYwpAQCAtMjIsMTEgKzIyLDggQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvcms4MDguaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAotI2RlZmluZSBSSzgwOF9OUl9PVVRQVVQgMgotCiBzdHJ1Y3Qgcms4MDhfY2xrb3V0IHsKIAlzdHJ1Y3Qgcms4MDggKnJrODA4OwotCXN0cnVjdCBjbGtfb25lY2VsbF9kYXRhIGNsa19kYXRhOwogCXN0cnVjdCBjbGtfaHcJCWNsa291dDFfaHc7CiAJc3RydWN0IGNsa19odwkJY2xrb3V0Ml9odzsKIH07CkBAIC04NSwxNCArODIsMjggQEAKIAkucmVjYWxjX3JhdGUgPSByazgwOF9jbGtvdXRfcmVjYWxjX3JhdGUsCiB9OwogCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitvZl9jbGtfcms4MDhfZ2V0KHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmNsa3NwZWMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJrODA4X2Nsa291dCAqcms4MDhfY2xrb3V0ID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gMikgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGluZGV4ICV1XG4iLCBfX2Z1bmNfXywgaWR4KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuIGlkeCA/ICZyazgwOF9jbGtvdXQtPmNsa291dDJfaHcgOiAmcms4MDhfY2xrb3V0LT5jbGtvdXQxX2h3OworfQorCiBzdGF0aWMgaW50IHJrODA4X2Nsa291dF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCByazgwOCAqcms4MDggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHJrODA4LT5pMmM7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gY2xpZW50LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0ID0ge307Ci0Jc3RydWN0IGNsayAqKmNsa190YWJsZTsKIAlzdHJ1Y3Qgcms4MDhfY2xrb3V0ICpyazgwOF9jbGtvdXQ7CisJaW50IHJldDsKIAogCXJrODA4X2Nsa291dCA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsCiAJCQkJICAgIHNpemVvZigqcms4MDhfY2xrb3V0KSwgR0ZQX0tFUk5FTCk7CkBAIC0xMDEsMTEgKzExMiw2IEBACiAKIAlyazgwOF9jbGtvdXQtPnJrODA4ID0gcms4MDg7CiAKLQljbGtfdGFibGUgPSBkZXZtX2tjYWxsb2MoJmNsaWVudC0+ZGV2LCBSSzgwOF9OUl9PVVRQVVQsCi0JCQkJIHNpemVvZihzdHJ1Y3QgY2xrICopLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNsa190YWJsZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlpbml0LnBhcmVudF9uYW1lcyA9IE5VTEw7CiAJaW5pdC5udW1fcGFyZW50cyA9IDA7CiAJaW5pdC5uYW1lID0gInJrODA4LWNsa291dDEiOwpAQCAtMTE2LDEwICsxMjIsOSBAQAogCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2luZGV4KG5vZGUsICJjbG9jay1vdXRwdXQtbmFtZXMiLAogCQkJCSAgICAgIDAsICZpbml0Lm5hbWUpOwogCi0JY2xrX3RhYmxlWzBdID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAotCQkJCQkgJnJrODA4X2Nsa291dC0+Y2xrb3V0MV9odyk7Ci0JaWYgKElTX0VSUihjbGtfdGFibGVbMF0pKQotCQlyZXR1cm4gUFRSX0VSUihjbGtfdGFibGVbMF0pOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJnJrODA4X2Nsa291dC0+Y2xrb3V0MV9odyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCWluaXQubmFtZSA9ICJyazgwOC1jbGtvdXQyIjsKIAlpbml0Lm9wcyA9ICZyazgwOF9jbGtvdXQyX29wczsKQEAgLTEyOSwxNiArMTM0LDExIEBACiAJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfaW5kZXgobm9kZSwgImNsb2NrLW91dHB1dC1uYW1lcyIsCiAJCQkJICAgICAgMSwgJmluaXQubmFtZSk7CiAKLQljbGtfdGFibGVbMV0gPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsCi0JCQkJCSAmcms4MDhfY2xrb3V0LT5jbGtvdXQyX2h3KTsKLQlpZiAoSVNfRVJSKGNsa190YWJsZVsxXSkpCi0JCXJldHVybiBQVFJfRVJSKGNsa190YWJsZVsxXSk7CisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmcms4MDhfY2xrb3V0LT5jbGtvdXQyX2h3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0Jcms4MDhfY2xrb3V0LT5jbGtfZGF0YS5jbGtzID0gY2xrX3RhYmxlOwotCXJrODA4X2Nsa291dC0+Y2xrX2RhdGEuY2xrX251bSA9IFJLODA4X05SX09VVFBVVDsKLQotCXJldHVybiBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsCi0JCQkJICAgJnJrODA4X2Nsa291dC0+Y2xrX2RhdGEpOworCXJldHVybiBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19yazgwOF9nZXQsIHJrODA4X2Nsa291dCk7CiB9CiAKIHN0YXRpYyBpbnQgcms4MDhfY2xrb3V0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXNjcGkuYyBiL2RyaXZlcnMvY2xrL2Nsay1zY3BpLmMKaW5kZXggNjk2MmVlNS4uMmEzZTlkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXNjcGkuYworKysgYi9kcml2ZXJzL2Nsay9jbGstc2NwaS5jCkBAIC0xNDYsMTMgKzE0NiwxMyBAQAogCXt9CiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqCitzdGF0aWMgaW50CiBzY3BpX2Nsa19vcHNfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoLAogCQkgIHN0cnVjdCBzY3BpX2NsayAqc2NsaywgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgY2xrX2luaXRfZGF0YSBpbml0OwotCXN0cnVjdCBjbGsgKmNsazsKIAl1bnNpZ25lZCBsb25nIG1pbiA9IDAsIG1heCA9IDA7CisJaW50IHJldDsKIAogCWluaXQubmFtZSA9IG5hbWU7CiAJaW5pdC5mbGFncyA9IDA7CkBAIC0xNjQsMTggKzE2NCwxOCBAQAogCWlmIChpbml0Lm9wcyA9PSAmc2NwaV9kdmZzX29wcykgewogCQlzY2xrLT5pbmZvID0gc2Nsay0+c2NwaV9vcHMtPmR2ZnNfZ2V0X2luZm8oc2Nsay0+aWQpOwogCQlpZiAoSVNfRVJSKHNjbGstPmluZm8pKQotCQkJcmV0dXJuIE5VTEw7CisJCQlyZXR1cm4gUFRSX0VSUihzY2xrLT5pbmZvKTsKIAl9IGVsc2UgaWYgKGluaXQub3BzID09ICZzY3BpX2Nsa19vcHMpIHsKIAkJaWYgKHNjbGstPnNjcGlfb3BzLT5jbGtfZ2V0X3JhbmdlKHNjbGstPmlkLCAmbWluLCAmbWF4KSB8fCAhbWF4KQotCQkJcmV0dXJuIE5VTEw7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgewotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoZGV2LCAmc2Nsay0+aHcpOwotCWlmICghSVNfRVJSKGNsaykgJiYgbWF4KQorCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKGRldiwgJnNjbGstPmh3KTsKKwlpZiAoIXJldCAmJiBtYXgpCiAJCWNsa19od19zZXRfcmF0ZV9yYW5nZSgmc2Nsay0+aHcsIG1pbiwgbWF4KTsKLQlyZXR1cm4gY2xrOworCXJldHVybiByZXQ7CiB9CiAKIHN0cnVjdCBzY3BpX2Nsa19kYXRhIHsKQEAgLTE4Myw3ICsxODMsNyBAQAogCXVuc2lnbmVkIGludCBjbGtfbnVtOwogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgKgorc3RhdGljIHN0cnVjdCBjbGtfaHcgKgogc2NwaV9vZl9jbGtfc3JjX2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBzY3BpX2NsayAqc2NsazsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGNsa19kYXRhLT5jbGtfbnVtOyBjb3VudCsrKSB7CiAJCXNjbGsgPSBjbGtfZGF0YS0+Y2xrW2NvdW50XTsKIAkJaWYgKGlkeCA9PSBzY2xrLT5pZCkKLQkJCXJldHVybiBzY2xrLT5ody5jbGs7CisJCQlyZXR1cm4gJnNjbGstPmh3OwogCX0KIAogCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMjAyLDggKzIwMiw3IEBACiBzdGF0aWMgaW50IHNjcGlfY2xrX2FkZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlzdHJ1Y3QgY2xrICoqY2xrczsKLQlpbnQgaWR4LCBjb3VudDsKKwlpbnQgaWR4LCBjb3VudCwgZXJyOwogCXN0cnVjdCBzY3BpX2Nsa19kYXRhICpjbGtfZGF0YTsKIAogCWNvdW50ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhucCwgImNsb2NrLW91dHB1dC1uYW1lcyIpOwpAQCAtMjIyLDEwICsyMjEsNiBAQAogCWlmICghY2xrX2RhdGEtPmNsaykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQljbGtzID0gZGV2bV9rY2FsbG9jKGRldiwgY291bnQsIHNpemVvZigqY2xrcyksIEdGUF9LRVJORUwpOwotCWlmICghY2xrcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgewogCQlzdHJ1Y3Qgc2NwaV9jbGsgKnNjbGs7CiAJCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC0yNDksMTUgKzI0NCwxNSBAQAogCiAJCXNjbGstPmlkID0gdmFsOwogCi0JCWNsa3NbaWR4XSA9IHNjcGlfY2xrX29wc19pbml0KGRldiwgbWF0Y2gsIHNjbGssIG5hbWUpOwotCQlpZiAoSVNfRVJSX09SX05VTEwoY2xrc1tpZHhdKSkKKwkJZXJyID0gc2NwaV9jbGtfb3BzX2luaXQoZGV2LCBtYXRjaCwgc2NsaywgbmFtZSk7CisJCWlmIChlcnIpCiAJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBjbG9jayAnJXMnXG4iLCBuYW1lKTsKIAkJZWxzZQogCQkJZGV2X2RiZyhkZXYsICJSZWdpc3RlcmVkIGNsb2NrICclcydcbiIsIG5hbWUpOwogCQljbGtfZGF0YS0+Y2xrW2lkeF0gPSBzY2xrOwogCX0KIAotCXJldHVybiBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5wLCBzY3BpX29mX2Nsa19zcmNfZ2V0LCBjbGtfZGF0YSk7CisJcmV0dXJuIG9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobnAsIHNjcGlfb2ZfY2xrX3NyY19nZXQsIGNsa19kYXRhKTsKIH0KIAogc3RhdGljIGludCBzY3BpX2Nsb2Nrc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1zaTUxNC5jIGIvZHJpdmVycy9jbGsvY2xrLXNpNTE0LmMKaW5kZXggY2VlZjI1Yi4uMDliNjcxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXNpNTE0LmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXNpNTE0LmMKQEAgLTMwNSw3ICszMDUsNiBAQAogewogCXN0cnVjdCBjbGtfc2k1MTQgKmRhdGE7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJaW50IGVycjsKIAogCWRhdGEgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKQEAgLTMzMCwxMyArMzI5LDEzIEBACiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKIAotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRhdGEtPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKKwllcnIgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkYXRhLT5odyk7CisJaWYgKGVycikgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNsb2NrIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihjbGspOworCQlyZXR1cm4gZXJyOwogCX0KLQllcnIgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKGNsaWVudC0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwKLQkJCWNsayk7CisJZXJyID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwKKwkJCQkgICAgICZkYXRhLT5odyk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byBhZGQgY2xrIHByb3ZpZGVyXG4iKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay1zaTUzNTEuYyBiL2RyaXZlcnMvY2xrL2Nsay1zaTUzNTEuYwppbmRleCBiMWJjMTJjLi5iMDUxZGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9jbGstc2k1MzUxLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXNpNTM1MS5jCkBAIC01NCw3ICs1NCw2IEBACiAJZW51bSBzaTUzNTFfdmFyaWFudAl2YXJpYW50OwogCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CiAJc3RydWN0IHJlZ21hcAkJKnJlZ21hcDsKLQlzdHJ1Y3QgY2xrX29uZWNlbGxfZGF0YSBvbmVjZWxsOwogCiAJc3RydWN0IGNsawkJKnB4dGFsOwogCWNvbnN0IGNoYXIJCSpweHRhbF9uYW1lOwpAQCAtNjYsNiArNjUsNyBAQAogCXN0cnVjdCBzaTUzNTFfaHdfZGF0YQlwbGxbMl07CiAJc3RydWN0IHNpNTM1MV9od19kYXRhCSptc3ludGg7CiAJc3RydWN0IHNpNTM1MV9od19kYXRhCSpjbGtvdXQ7CisJc2l6ZV90CQkJbnVtX2Nsa291dDsKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2k1MzUxX2lucHV0X25hbWVzW10gPSB7CkBAIC0xMzA3LDExICsxMzA3LDMxIEBACiAJb2Zfbm9kZV9wdXQoY2hpbGQpOwogCXJldHVybiAtRUlOVkFMOwogfQorCitzdGF0aWMgc3RydWN0IGNsa19odyAqCitzaTUzMzUxX29mX2Nsa19nZXQoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2k1MzUxX2RyaXZlcl9kYXRhICpkcnZkYXRhID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gY2xrc3BlYy0+YXJnc1swXTsKKworCWlmIChpZHggPj0gZHJ2ZGF0YS0+bnVtX2Nsa291dCkgeworCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGluZGV4ICV1XG4iLCBfX2Z1bmNfXywgaWR4KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuICZkcnZkYXRhLT5jbGtvdXRbaWR4XS5odzsKK30KICNlbHNlCiBzdGF0aWMgaW50IHNpNTM1MV9kdF9wYXJzZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBlbnVtIHNpNTM1MV92YXJpYW50IHZhcmlhbnQpCiB7CiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2h3ICoKK3NpNTMzNTFfb2ZfY2xrX2dldChzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpjbGtzcGVjLCB2b2lkICpkYXRhKQoreworCXJldHVybiBOVUxMOworfQogI2VuZGlmIC8qIENPTkZJR19PRiAqLwogCiBzdGF0aWMgaW50IHNpNTM1MV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKQEAgLTEzMjEsNyArMTM0MSw2IEBACiAJc3RydWN0IHNpNTM1MV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3Qgc2k1MzUxX2RyaXZlcl9kYXRhICpkcnZkYXRhOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0Jc3RydWN0IGNsayAqY2xrOwogCWNvbnN0IGNoYXIgKnBhcmVudF9uYW1lc1s0XTsKIAl1OCBudW1fcGFyZW50cywgbnVtX2Nsb2NrczsKIAlpbnQgcmV0LCBuOwpAQCAtMTQzOCwxMCArMTQ1Nyw5IEBACiAJCWluaXQubnVtX3BhcmVudHMgPSAxOwogCX0KIAlkcnZkYXRhLT54dGFsLmluaXQgPSAmaW5pdDsKLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkcnZkYXRhLT54dGFsKTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkcnZkYXRhLT54dGFsKTsKKwlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyICVzXG4iLCBpbml0Lm5hbWUpOwotCQlyZXQgPSBQVFJfRVJSKGNsayk7CiAJCWdvdG8gZXJyX2NsazsKIAl9CiAKQEAgLTE0NTYsMTEgKzE0NzQsMTAgQEAKIAkJCWluaXQubnVtX3BhcmVudHMgPSAxOwogCQl9CiAJCWRydmRhdGEtPmNsa2luLmluaXQgPSAmaW5pdDsKLQkJY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZHJ2ZGF0YS0+Y2xraW4pOwotCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZHJ2ZGF0YS0+Y2xraW4pOworCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciAlc1xuIiwKIAkJCQlpbml0Lm5hbWUpOwotCQkJcmV0ID0gUFRSX0VSUihjbGspOwogCQkJZ290byBlcnJfY2xrOwogCQl9CiAJfQpAQCAtMTQ4MCwxMCArMTQ5Nyw5IEBACiAJaW5pdC5mbGFncyA9IDA7CiAJaW5pdC5wYXJlbnRfbmFtZXMgPSBwYXJlbnRfbmFtZXM7CiAJaW5pdC5udW1fcGFyZW50cyA9IG51bV9wYXJlbnRzOwotCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRydmRhdGEtPnBsbFswXS5odyk7Ci0JaWYgKElTX0VSUihjbGspKSB7CisJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZHJ2ZGF0YS0+cGxsWzBdLmh3KTsKKwlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyICVzXG4iLCBpbml0Lm5hbWUpOwotCQlyZXQgPSBQVFJfRVJSKGNsayk7CiAJCWdvdG8gZXJyX2NsazsKIAl9CiAKQEAgLTE1MDUsMTAgKzE1MjEsOSBAQAogCQlpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudF9uYW1lczsKIAkJaW5pdC5udW1fcGFyZW50cyA9IG51bV9wYXJlbnRzOwogCX0KLQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkcnZkYXRhLT5wbGxbMV0uaHcpOwotCWlmIChJU19FUlIoY2xrKSkgeworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRydmRhdGEtPnBsbFsxXS5odyk7CisJaWYgKHJldCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciAlc1xuIiwgaW5pdC5uYW1lKTsKLQkJcmV0ID0gUFRSX0VSUihjbGspOwogCQlnb3RvIGVycl9jbGs7CiAJfQogCkBAIC0xNTI0LDEzICsxNTM5LDkgQEAKIAkJCQkgICAgICAgc2l6ZW9mKCpkcnZkYXRhLT5tc3ludGgpLCBHRlBfS0VSTkVMKTsKIAlkcnZkYXRhLT5jbGtvdXQgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBudW1fY2xvY2tzICoKIAkJCQkgICAgICAgc2l6ZW9mKCpkcnZkYXRhLT5jbGtvdXQpLCBHRlBfS0VSTkVMKTsKKwlkcnZkYXRhLT5udW1fY2xrb3V0ID0gbnVtX2Nsb2NrczsKIAotCWRydmRhdGEtPm9uZWNlbGwuY2xrX251bSA9IG51bV9jbG9ja3M7Ci0JZHJ2ZGF0YS0+b25lY2VsbC5jbGtzID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwKLQkJbnVtX2Nsb2NrcyAqIHNpemVvZigqZHJ2ZGF0YS0+b25lY2VsbC5jbGtzKSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoV0FSTl9PTighZHJ2ZGF0YS0+bXN5bnRoIHx8ICFkcnZkYXRhLT5jbGtvdXQgfHwKLQkJICAgICFkcnZkYXRhLT5vbmVjZWxsLmNsa3MpKSB7CisJaWYgKFdBUk5fT04oIWRydmRhdGEtPm1zeW50aCB8fCAhZHJ2ZGF0YS0+Y2xrb3V0KSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9jbGs7CiAJfQpAQCAtMTU0NywxMSArMTU1OCwxMSBAQAogCQkJaW5pdC5mbGFncyB8PSBDTEtfU0VUX1JBVEVfUEFSRU5UOwogCQlpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudF9uYW1lczsKIAkJaW5pdC5udW1fcGFyZW50cyA9IDI7Ci0JCWNsayA9IGRldm1fY2xrX3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRydmRhdGEtPm1zeW50aFtuXS5odyk7Ci0JCWlmIChJU19FUlIoY2xrKSkgeworCQlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmY2xpZW50LT5kZXYsCisJCQkJCSAgICZkcnZkYXRhLT5tc3ludGhbbl0uaHcpOworCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInVuYWJsZSB0byByZWdpc3RlciAlc1xuIiwKIAkJCQlpbml0Lm5hbWUpOwotCQkJcmV0ID0gUFRSX0VSUihjbGspOwogCQkJZ290byBlcnJfY2xrOwogCQl9CiAJfQpAQCAtMTU3NSwxOSArMTU4NiwxOSBAQAogCQkJaW5pdC5mbGFncyB8PSBDTEtfU0VUX1JBVEVfUEFSRU5UOwogCQlpbml0LnBhcmVudF9uYW1lcyA9IHBhcmVudF9uYW1lczsKIAkJaW5pdC5udW1fcGFyZW50cyA9IG51bV9wYXJlbnRzOwotCQljbGsgPSBkZXZtX2Nsa19yZWdpc3RlcigmY2xpZW50LT5kZXYsICZkcnZkYXRhLT5jbGtvdXRbbl0uaHcpOwotCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJcmV0ID0gZGV2bV9jbGtfaHdfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LAorCQkJCQkgICAmZHJ2ZGF0YS0+Y2xrb3V0W25dLmh3KTsKKwkJaWYgKHJldCkgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgJXNcbiIsCiAJCQkJaW5pdC5uYW1lKTsKLQkJCXJldCA9IFBUUl9FUlIoY2xrKTsKIAkJCWdvdG8gZXJyX2NsazsKIAkJfQotCQlkcnZkYXRhLT5vbmVjZWxsLmNsa3Nbbl0gPSBjbGs7CiAKIAkJLyogc2V0IGluaXRpYWwgY2xrb3V0IHJhdGUgKi8KIAkJaWYgKHBkYXRhLT5jbGtvdXRbbl0ucmF0ZSAhPSAwKSB7CiAJCQlpbnQgcmV0OwotCQkJcmV0ID0gY2xrX3NldF9yYXRlKGNsaywgcGRhdGEtPmNsa291dFtuXS5yYXRlKTsKKwkJCXJldCA9IGNsa19zZXRfcmF0ZShkcnZkYXRhLT5jbGtvdXRbbl0uaHcuY2xrLAorCQkJCQkgICBwZGF0YS0+Y2xrb3V0W25dLnJhdGUpOwogCQkJaWYgKHJldCAhPSAwKSB7CiAJCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDYW5ub3Qgc2V0IHJhdGUgOiAlZFxuIiwKIAkJCQkJcmV0KTsKQEAgLTE1OTUsOCArMTYwNiw4IEBACiAJCX0KIAl9CiAKLQlyZXQgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKGNsaWVudC0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19zcmNfb25lY2VsbF9nZXQsCi0JCQkJICAmZHJ2ZGF0YS0+b25lY2VsbCk7CisJcmV0ID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihjbGllbnQtPmRldi5vZl9ub2RlLCBzaTUzMzUxX29mX2Nsa19nZXQsCisJCQkJICAgICBkcnZkYXRhKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIGFkZCBjbGsgcHJvdmlkZXJcbiIpOwogCQlnb3RvIGVycl9jbGs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstc2k1NzAuYyBiL2RyaXZlcnMvY2xrL2Nsay1zaTU3MC5jCmluZGV4IGQ1NjY0ODUuLjY0NmFmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay1zaTU3MC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay1zaTU3MC5jCkBAIC00MDgsNyArNDA4LDYgQEAKIHsKIAlzdHJ1Y3QgY2xrX3NpNTcwICpkYXRhOwogCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7Ci0Jc3RydWN0IGNsayAqY2xrOwogCXUzMiBpbml0aWFsX2ZvdXQsIGZhY3RvcnlfZm91dCwgc3RhYmlsaXR5OwogCWludCBlcnI7CiAJZW51bSBjbGtfc2k1NzBfdmFyaWFudCB2YXJpYW50ID0gaWQtPmRyaXZlcl9kYXRhOwpAQCAtNDYyLDEzICs0NjEsMTMgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JY2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmZGF0YS0+aHcpOwotCWlmIChJU19FUlIoY2xrKSkgeworCWVyciA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmRhdGEtPmh3KTsKKwlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiY2xvY2sgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7Ci0JCXJldHVybiBQVFJfRVJSKGNsayk7CisJCXJldHVybiBlcnI7CiAJfQotCWVyciA9IG9mX2Nsa19hZGRfcHJvdmlkZXIoY2xpZW50LT5kZXYub2Zfbm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LAotCQkJY2xrKTsKKwllcnIgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKGNsaWVudC0+ZGV2Lm9mX25vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LAorCQkJCSAgICAgJmRhdGEtPmh3KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5hYmxlIHRvIGFkZCBjbGsgcHJvdmlkZXJcbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtNDc3LDcgKzQ3Niw3IEBACiAJLyogUmVhZCB0aGUgcmVxdWVzdGVkIGluaXRpYWwgb3V0cHV0IGZyZXF1ZW5jeSBmcm9tIGRldmljZSB0cmVlICovCiAJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihjbGllbnQtPmRldi5vZl9ub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwKIAkJCQkmaW5pdGlhbF9mb3V0KSkgewotCQllcnIgPSBjbGtfc2V0X3JhdGUoY2xrLCBpbml0aWFsX2ZvdXQpOworCQllcnIgPSBjbGtfc2V0X3JhdGUoZGF0YS0+aHcuY2xrLCBpbml0aWFsX2ZvdXQpOwogCQlpZiAoZXJyKSB7CiAJCQlvZl9jbGtfZGVsX3Byb3ZpZGVyKGNsaWVudC0+ZGV2Lm9mX25vZGUpOwogCQkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay10d2w2MDQwLmMgYi9kcml2ZXJzL2Nsay9jbGstdHdsNjA0MC5jCmluZGV4IDY5N2M2NjcuLjdiMjIyYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay10d2w2MDQwLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXR3bDYwNDAuYwpAQCAtMjYsNjAgKzI2LDczIEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3R3bDYwNDAuaD4KICNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KIAotc3RydWN0IHR3bDYwNDBfY2xrIHsKK3N0cnVjdCB0d2w2MDQwX3BkbWNsayB7CiAJc3RydWN0IHR3bDYwNDAgKnR3bDYwNDA7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBjbGtfaHcgbWNwZG1fZmNsazsKLQlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGNsa19odyBwZG1jbGtfaHc7CiAJaW50IGVuYWJsZWQ7CiB9OwogCi1zdGF0aWMgaW50IHR3bDYwNDBfYml0Y2xrX2lzX2VuYWJsZWQoc3RydWN0IGNsa19odyAqaHcpCitzdGF0aWMgaW50IHR3bDYwNDBfcGRtY2xrX2lzX3ByZXBhcmVkKHN0cnVjdCBjbGtfaHcgKmh3KQogewotCXN0cnVjdCB0d2w2MDQwX2NsayAqdHdsNjA0MF9jbGsgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCB0d2w2MDQwX2NsaywKLQkJCQkJCSAgICAgICBtY3BkbV9mY2xrKTsKLQlyZXR1cm4gdHdsNjA0MF9jbGstPmVuYWJsZWQ7CisJc3RydWN0IHR3bDYwNDBfcGRtY2xrICpwZG1jbGsgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCB0d2w2MDQwX3BkbWNsaywKKwkJCQkJCSAgICAgcGRtY2xrX2h3KTsKKworCXJldHVybiBwZG1jbGstPmVuYWJsZWQ7CiB9CiAKLXN0YXRpYyBpbnQgdHdsNjA0MF9iaXRjbGtfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKK3N0YXRpYyBpbnQgdHdsNjA0MF9wZG1jbGtfcHJlcGFyZShzdHJ1Y3QgY2xrX2h3ICpodykKIHsKLQlzdHJ1Y3QgdHdsNjA0MF9jbGsgKnR3bDYwNDBfY2xrID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgdHdsNjA0MF9jbGssCi0JCQkJCQkgICAgICAgbWNwZG1fZmNsayk7CisJc3RydWN0IHR3bDYwNDBfcGRtY2xrICpwZG1jbGsgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCB0d2w2MDQwX3BkbWNsaywKKwkJCQkJCSAgICAgcGRtY2xrX2h3KTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gdHdsNjA0MF9wb3dlcih0d2w2MDQwX2Nsay0+dHdsNjA0MCwgMSk7CisJcmV0ID0gdHdsNjA0MF9wb3dlcihwZG1jbGstPnR3bDYwNDAsIDEpOwogCWlmICghcmV0KQotCQl0d2w2MDQwX2Nsay0+ZW5hYmxlZCA9IDE7CisJCXBkbWNsay0+ZW5hYmxlZCA9IDE7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCB0d2w2MDQwX2JpdGNsa191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCitzdGF0aWMgdm9pZCB0d2w2MDQwX3BkbWNsa191bnByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCiB7Ci0Jc3RydWN0IHR3bDYwNDBfY2xrICp0d2w2MDQwX2NsayA9IGNvbnRhaW5lcl9vZihodywgc3RydWN0IHR3bDYwNDBfY2xrLAotCQkJCQkJICAgICAgIG1jcGRtX2ZjbGspOworCXN0cnVjdCB0d2w2MDQwX3BkbWNsayAqcGRtY2xrID0gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgdHdsNjA0MF9wZG1jbGssCisJCQkJCQkgICAgIHBkbWNsa19odyk7CiAJaW50IHJldDsKIAotCXJldCA9IHR3bDYwNDBfcG93ZXIodHdsNjA0MF9jbGstPnR3bDYwNDAsIDApOworCXJldCA9IHR3bDYwNDBfcG93ZXIocGRtY2xrLT50d2w2MDQwLCAwKTsKIAlpZiAoIXJldCkKLQkJdHdsNjA0MF9jbGstPmVuYWJsZWQgPSAwOworCQlwZG1jbGstPmVuYWJsZWQgPSAwOworCiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyB0d2w2MDQwX21jcGRtX29wcyA9IHsKLQkuaXNfZW5hYmxlZCA9IHR3bDYwNDBfYml0Y2xrX2lzX2VuYWJsZWQsCi0JLnByZXBhcmUgPSB0d2w2MDQwX2JpdGNsa19wcmVwYXJlLAotCS51bnByZXBhcmUgPSB0d2w2MDQwX2JpdGNsa191bnByZXBhcmUsCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0d2w2MDQwX3BkbWNsa19yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJCQkJCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJc3RydWN0IHR3bDYwNDBfcGRtY2xrICpwZG1jbGsgPSBjb250YWluZXJfb2YoaHcsIHN0cnVjdCB0d2w2MDQwX3BkbWNsaywKKwkJCQkJCSAgICAgcGRtY2xrX2h3KTsKKworCXJldHVybiB0d2w2MDQwX2dldF9zeXNjbGsocGRtY2xrLT50d2w2MDQwKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIHR3bDYwNDBfcGRtY2xrX29wcyA9IHsKKwkuaXNfcHJlcGFyZWQgPSB0d2w2MDQwX3BkbWNsa19pc19wcmVwYXJlZCwKKwkucHJlcGFyZSA9IHR3bDYwNDBfcGRtY2xrX3ByZXBhcmUsCisJLnVucHJlcGFyZSA9IHR3bDYwNDBfcGRtY2xrX3VucHJlcGFyZSwKKwkucmVjYWxjX3JhdGUgPSB0d2w2MDQwX3BkbWNsa19yZWNhbGNfcmF0ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgY2xrX2luaXRfZGF0YSB3bTgzMXhfY2xrb3V0X2luaXQgPSB7Ci0JLm5hbWUgPSAibWNwZG1fZmNsayIsCi0JLm9wcyA9ICZ0d2w2MDQwX21jcGRtX29wcywKK3N0YXRpYyBzdHJ1Y3QgY2xrX2luaXRfZGF0YSB0d2w2MDQwX3BkbWNsa19pbml0ID0geworCS5uYW1lID0gInBkbWNsayIsCisJLm9wcyA9ICZ0d2w2MDQwX3BkbWNsa19vcHMsCisJLmZsYWdzID0gQ0xLX0dFVF9SQVRFX05PQ0FDSEUsCiB9OwogCi1zdGF0aWMgaW50IHR3bDYwNDBfY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHR3bDYwNDBfcGRtY2xrX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHR3bDYwNDAgKnR3bDYwNDAgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7Ci0Jc3RydWN0IHR3bDYwNDBfY2xrICpjbGtkYXRhOworCXN0cnVjdCB0d2w2MDQwX3BkbWNsayAqY2xrZGF0YTsKKwlpbnQgcmV0OwogCiAJY2xrZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNsa2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNsa2RhdGEpCkBAIC04OCwyNiArMTAxLDI4IEBACiAJY2xrZGF0YS0+ZGV2ID0gJnBkZXYtPmRldjsKIAljbGtkYXRhLT50d2w2MDQwID0gdHdsNjA0MDsKIAotCWNsa2RhdGEtPm1jcGRtX2ZjbGsuaW5pdCA9ICZ3bTgzMXhfY2xrb3V0X2luaXQ7Ci0JY2xrZGF0YS0+Y2xrID0gZGV2bV9jbGtfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNsa2RhdGEtPm1jcGRtX2ZjbGspOwotCWlmIChJU19FUlIoY2xrZGF0YS0+Y2xrKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrZGF0YS0+Y2xrKTsKKwljbGtkYXRhLT5wZG1jbGtfaHcuaW5pdCA9ICZ0d2w2MDQwX3BkbWNsa19pbml0OworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtkYXRhLT5wZG1jbGtfaHcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjbGtkYXRhKTsKIAotCXJldHVybiAwOworCXJldHVybiBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKHBkZXYtPmRldi5wYXJlbnQtPm9mX25vZGUsCisJCQkJICAgICAgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsCisJCQkJICAgICAgJmNsa2RhdGEtPnBkbWNsa19odyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHR3bDYwNDBfY2xrX2RyaXZlciA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHR3bDYwNDBfcGRtY2xrX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ0d2w2MDQwLWNsayIsCisJCS5uYW1lID0gInR3bDYwNDAtcGRtY2xrIiwKIAl9LAotCS5wcm9iZSA9IHR3bDYwNDBfY2xrX3Byb2JlLAorCS5wcm9iZSA9IHR3bDYwNDBfcGRtY2xrX3Byb2JlLAogfTsKIAotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0d2w2MDQwX2Nsa19kcml2ZXIpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0d2w2MDQwX3BkbWNsa19kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlRXTDYwNDAgY2xvY2sgZHJpdmVyIGZvciBNY1BETSBmdW5jdGlvbmFsIGNsb2NrIik7CiBNT0RVTEVfQVVUSE9SKCJQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAdGkuY29tPiIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0d2w2MDQwLWNsayIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0d2w2MDQwLXBkbWNsayIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvY2xrLXZ0ODUwMC5jIGIvZHJpdmVycy9jbGsvY2xrLXZ0ODUwMC5jCmluZGV4IDM3MzY4YTMuLjQxNjFhNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2Nsay12dDg1MDAuYworKysgYi9kcml2ZXJzL2Nsay9jbGstdnQ4NTAwLmMKQEAgLTIzMiw3ICsyMzIsNyBAQAogc3RhdGljIF9faW5pdCB2b2lkIHZ0d21fZGV2aWNlX2Nsa19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAl1MzIgZW5fcmVnLCBkaXZfcmVnOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX2RldmljZSAqZGV2X2NsazsKIAljb25zdCBjaGFyICpjbGtfbmFtZSA9IG5vZGUtPm5hbWU7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CkBAIC0zMDEsMTMgKzMwMSwxNCBAQAogCiAJZGV2X2Nsay0+aHcuaW5pdCA9ICZpbml0OwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZkZXZfY2xrLT5odyk7Ci0JaWYgKFdBUk5fT04oSVNfRVJSKGNsaykpKSB7CisJaHcgPSAmZGV2X2Nsay0+aHc7CisJcmMgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgaHcpOworCWlmIChXQVJOX09OKHJjKSkgewogCQlrZnJlZShkZXZfY2xrKTsKIAkJcmV0dXJuOwogCX0KLQlyYyA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrLCBjbGtfbmFtZSwgTlVMTCk7CisJcmMgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19od19zaW1wbGVfZ2V0LCBodyk7CisJY2xrX2h3X3JlZ2lzdGVyX2Nsa2RldihodywgY2xrX25hbWUsIE5VTEwpOwogfQogQ0xLX09GX0RFQ0xBUkUodnQ4NTAwX2RldmljZSwgInZpYSx2dDg1MDAtZGV2aWNlLWNsb2NrIiwgdnR3bV9kZXZpY2VfY2xrX2luaXQpOwogCkBAIC02ODEsNyArNjgyLDcgQEAKIHN0YXRpYyBfX2luaXQgdm9pZCB2dHdtX3BsbF9jbGtfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGludCBwbGxfdHlwZSkKIHsKIAl1MzIgcmVnOwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrX2h3ICpodzsKIAlzdHJ1Y3QgY2xrX3BsbCAqcGxsX2NsazsKIAljb25zdCBjaGFyICpjbGtfbmFtZSA9IG5vZGUtPm5hbWU7CiAJY29uc3QgY2hhciAqcGFyZW50X25hbWU7CkBAIC03MTQsMTMgKzcxNSwxNCBAQAogCiAJcGxsX2Nsay0+aHcuaW5pdCA9ICZpbml0OwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZwbGxfY2xrLT5odyk7Ci0JaWYgKFdBUk5fT04oSVNfRVJSKGNsaykpKSB7CisJaHcgPSAmcGxsX2Nsay0+aHc7CisJcmMgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnBsbF9jbGstPmh3KTsKKwlpZiAoV0FSTl9PTihyYykpIHsKIAkJa2ZyZWUocGxsX2Nsayk7CiAJCXJldHVybjsKIAl9Ci0JcmMgPSBvZl9jbGtfYWRkX3Byb3ZpZGVyKG5vZGUsIG9mX2Nsa19zcmNfc2ltcGxlX2dldCwgY2xrKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgY2xrX25hbWUsIE5VTEwpOworCXJjID0gb2ZfY2xrX2FkZF9od19wcm92aWRlcihub2RlLCBvZl9jbGtfaHdfc2ltcGxlX2dldCwgaHcpOworCWNsa19od19yZWdpc3Rlcl9jbGtkZXYoaHcsIGNsa19uYW1lLCBOVUxMKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsay9jbGstd204MzF4LmMgYi9kcml2ZXJzL2Nsay9jbGstd204MzF4LmMKaW5kZXggODhkZWY0Yi4uZjRmZGFjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXdtODMxeC5jCisrKyBiL2RyaXZlcnMvY2xrL2Nsay13bTgzMXguYwpAQCAtMjQsOSArMjQsNiBAQAogCXN0cnVjdCBjbGtfaHcgeHRhbF9odzsKIAlzdHJ1Y3QgY2xrX2h3IGZsbF9odzsKIAlzdHJ1Y3QgY2xrX2h3IGNsa291dF9odzsKLQlzdHJ1Y3QgY2xrICp4dGFsOwotCXN0cnVjdCBjbGsgKmZsbDsKLQlzdHJ1Y3QgY2xrICpjbGtvdXQ7CiAJYm9vbCB4dGFsX2VuYTsKIH07CiAKQEAgLTM3MCwxOSArMzY3LDE5IEBACiAJY2xrZGF0YS0+eHRhbF9lbmEgPSByZXQgJiBXTTgzMVhfWFRBTF9FTkE7CiAKIAljbGtkYXRhLT54dGFsX2h3LmluaXQgPSAmd204MzF4X3h0YWxfaW5pdDsKLQljbGtkYXRhLT54dGFsID0gZGV2bV9jbGtfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNsa2RhdGEtPnh0YWxfaHcpOwotCWlmIChJU19FUlIoY2xrZGF0YS0+eHRhbCkpCi0JCXJldHVybiBQVFJfRVJSKGNsa2RhdGEtPnh0YWwpOworCXJldCA9IGRldm1fY2xrX2h3X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtkYXRhLT54dGFsX2h3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJY2xrZGF0YS0+ZmxsX2h3LmluaXQgPSAmd204MzF4X2ZsbF9pbml0OwotCWNsa2RhdGEtPmZsbCA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtkYXRhLT5mbGxfaHcpOwotCWlmIChJU19FUlIoY2xrZGF0YS0+ZmxsKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrZGF0YS0+ZmxsKTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2xrZGF0YS0+ZmxsX2h3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJY2xrZGF0YS0+Y2xrb3V0X2h3LmluaXQgPSAmd204MzF4X2Nsa291dF9pbml0OwotCWNsa2RhdGEtPmNsa291dCA9IGRldm1fY2xrX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjbGtkYXRhLT5jbGtvdXRfaHcpOwotCWlmIChJU19FUlIoY2xrZGF0YS0+Y2xrb3V0KSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrZGF0YS0+Y2xrb3V0KTsKKwlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2xrZGF0YS0+Y2xrb3V0X2h3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2xrZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay14Z2VuZS5jIGIvZHJpdmVycy9jbGsvY2xrLXhnZW5lLmMKaW5kZXggMzQzMzEzMi4uNWRhZGRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLXhnZW5lLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLXhnZW5lLmMKQEAgLTIxNyw2ICsyMTcsMjI2IEBACiAJeGdlbmVfcGxsY2xrX2luaXQobnAsIFBMTF9UWVBFX1BDUCk7CiB9CiAKKy8qKgorICogc3RydWN0IHhnZW5lX2Nsa19wbWQgLSBQTUQgY2xvY2sKKyAqCisgKiBAaHc6CQloYW5kbGUgYmV0d2VlbiBjb21tb24gYW5kIGhhcmR3YXJlLXNwZWNpZmljIGludGVyZmFjZXMKKyAqIEByZWc6CXJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIGZyYWN0aW9uYWwgc2NhbGUgbXVsdGlwbGllciAoc2NhbGVyKQorICogQHNoaWZ0OglzaGlmdCB0byB0aGUgdW5pdCBiaXQgZmllbGQKKyAqIEBkZW5vbToJMS9kZW5vbWluYXRvciB1bml0CisgKiBAbG9jazoJcmVnaXN0ZXIgbG9jaworICogRmxhZ3M6CisgKiBYR0VORV9DTEtfUE1EX1NDQUxFX0lOVkVSVEVEIC0gQnkgZGVmYXVsdCB0aGUgc2NhbGVyIGlzIHRoZSB2YWx1ZSByZWFkCisgKglmcm9tIHRoZSByZWdpc3RlciBwbHVzIG9uZS4gRm9yIGV4YW1wbGUsCisgKgkJMCBmb3IgKDAgKyAxKSAvIGRlbm9tLAorICoJCTEgZm9yICgxICsgMSkgLyBkZW5vbSBhbmQgZXRjLgorICoJSWYgdGhpcyBmbGFnIGlzIHNldCwgaXQgaXMKKyAqCQkwIGZvciAoZGVub20gLSAwKSAvIGRlbm9tLAorICoJCTEgZm9yIChkZW5vbSAtIDEpIC8gZGVub20gYW5kIGV0Yy4KKyAqCisgKi8KK3N0cnVjdCB4Z2VuZV9jbGtfcG1kIHsKKwlzdHJ1Y3QgY2xrX2h3CWh3OworCXZvaWQgX19pb21lbQkqcmVnOworCXU4CQlzaGlmdDsKKwl1MzIJCW1hc2s7CisJdTY0CQlkZW5vbTsKKwl1MzIJCWZsYWdzOworCXNwaW5sb2NrX3QJKmxvY2s7Cit9OworCisjZGVmaW5lIHRvX3hnZW5lX2Nsa19wbWQoX2h3KSBjb250YWluZXJfb2YoX2h3LCBzdHJ1Y3QgeGdlbmVfY2xrX3BtZCwgaHcpCisKKyNkZWZpbmUgWEdFTkVfQ0xLX1BNRF9TQ0FMRV9JTlZFUlRFRAlCSVQoMCkKKyNkZWZpbmUgWEdFTkVfQ0xLX1BNRF9TSElGVAkJOAorI2RlZmluZSBYR0VORV9DTEtfUE1EX1dJRFRICQkzCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHhnZW5lX2Nsa19wbWRfcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQoreworCXN0cnVjdCB4Z2VuZV9jbGtfcG1kICpmZCA9IHRvX3hnZW5lX2Nsa19wbWQoaHcpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXU2NCByZXQsIHNjYWxlOworCXUzMiB2YWw7CisKKwlpZiAoZmQtPmxvY2spCisJCXNwaW5fbG9ja19pcnFzYXZlKGZkLT5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlfX2FjcXVpcmUoZmQtPmxvY2spOworCisJdmFsID0gY2xrX3JlYWRsKGZkLT5yZWcpOworCisJaWYgKGZkLT5sb2NrKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGZkLT5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlfX3JlbGVhc2UoZmQtPmxvY2spOworCisJcmV0ID0gKHU2NClwYXJlbnRfcmF0ZTsKKworCXNjYWxlID0gKHZhbCAmIGZkLT5tYXNrKSA+PiBmZC0+c2hpZnQ7CisJaWYgKGZkLT5mbGFncyAmIFhHRU5FX0NMS19QTURfU0NBTEVfSU5WRVJURUQpCisJCXNjYWxlID0gZmQtPmRlbm9tIC0gc2NhbGU7CisJZWxzZQorCQlzY2FsZSsrOworCisJLyogZnJlcSA9IHBhcmVudF9yYXRlICogc2NhbGVyIC8gZGVub20gKi8KKwlkb19kaXYocmV0LCBmZC0+ZGVub20pOworCXJldCAqPSBzY2FsZTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9ICh1NjQpcGFyZW50X3JhdGU7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyB4Z2VuZV9jbGtfcG1kX3JvdW5kX3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnBhcmVudF9yYXRlKQoreworCXN0cnVjdCB4Z2VuZV9jbGtfcG1kICpmZCA9IHRvX3hnZW5lX2Nsa19wbWQoaHcpOworCXU2NCByZXQsIHNjYWxlOworCisJaWYgKCFyYXRlIHx8IHJhdGUgPj0gKnBhcmVudF9yYXRlKQorCQlyZXR1cm4gKnBhcmVudF9yYXRlOworCisJLyogZnJlcSA9IHBhcmVudF9yYXRlICogc2NhbGVyIC8gZGVub20gKi8KKwlyZXQgPSByYXRlICogZmQtPmRlbm9tOworCXNjYWxlID0gRElWX1JPVU5EX1VQX1VMTChyZXQsICpwYXJlbnRfcmF0ZSk7CisKKwlyZXQgPSAodTY0KSpwYXJlbnRfcmF0ZSAqIHNjYWxlOworCWRvX2RpdihyZXQsIGZkLT5kZW5vbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHhnZW5lX2Nsa19wbWRfc2V0X3JhdGUoc3RydWN0IGNsa19odyAqaHcsIHVuc2lnbmVkIGxvbmcgcmF0ZSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUpCit7CisJc3RydWN0IHhnZW5lX2Nsa19wbWQgKmZkID0gdG9feGdlbmVfY2xrX3BtZChodyk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJdTY0IHNjYWxlLCByZXQ7CisJdTMyIHZhbDsKKworCS8qCisJICogQ29tcHV0ZSB0aGUgc2NhbGVyOgorCSAqCisJICogZnJlcSA9IHBhcmVudF9yYXRlICogc2NhbGVyIC8gZGVub20sIG9yCisJICogc2NhbGVyID0gZnJlcSAqIGRlbm9tIC8gcGFyZW50X3JhdGUKKwkgKi8KKwlyZXQgPSByYXRlICogZmQtPmRlbm9tOworCXNjYWxlID0gRElWX1JPVU5EX1VQX1VMTChyZXQsICh1NjQpcGFyZW50X3JhdGUpOworCisJLyogQ2hlY2sgaWYgaW52ZXJ0ZWQgKi8KKwlpZiAoZmQtPmZsYWdzICYgWEdFTkVfQ0xLX1BNRF9TQ0FMRV9JTlZFUlRFRCkKKwkJc2NhbGUgPSBmZC0+ZGVub20gLSBzY2FsZTsKKwllbHNlCisJCXNjYWxlLS07CisKKwlpZiAoZmQtPmxvY2spCisJCXNwaW5fbG9ja19pcnFzYXZlKGZkLT5sb2NrLCBmbGFncyk7CisJZWxzZQorCQlfX2FjcXVpcmUoZmQtPmxvY2spOworCisJdmFsID0gY2xrX3JlYWRsKGZkLT5yZWcpOworCXZhbCAmPSB+ZmQtPm1hc2s7CisJdmFsIHw9IChzY2FsZSA8PCBmZC0+c2hpZnQpOworCWNsa193cml0ZWwodmFsLCBmZC0+cmVnKTsKKworCWlmIChmZC0+bG9jaykKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShmZC0+bG9jaywgZmxhZ3MpOworCWVsc2UKKwkJX19yZWxlYXNlKGZkLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNsa19vcHMgeGdlbmVfY2xrX3BtZF9vcHMgPSB7CisJLnJlY2FsY19yYXRlID0geGdlbmVfY2xrX3BtZF9yZWNhbGNfcmF0ZSwKKwkucm91bmRfcmF0ZSA9IHhnZW5lX2Nsa19wbWRfcm91bmRfcmF0ZSwKKwkuc2V0X3JhdGUgPSB4Z2VuZV9jbGtfcG1kX3NldF9yYXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgKgoreGdlbmVfcmVnaXN0ZXJfY2xrX3BtZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpwYXJlbnRfbmFtZSwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgX19pb21lbSAqcmVnLCB1OCBzaGlmdCwKKwkJICAgICAgIHU4IHdpZHRoLCB1NjQgZGVub20sIHUzMiBjbGtfZmxhZ3MsIHNwaW5sb2NrX3QgKmxvY2spCit7CisJc3RydWN0IHhnZW5lX2Nsa19wbWQgKmZkOworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJc3RydWN0IGNsayAqY2xrOworCisJZmQgPSBremFsbG9jKHNpemVvZigqZmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZkKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWluaXQubmFtZSA9IG5hbWU7CisJaW5pdC5vcHMgPSAmeGdlbmVfY2xrX3BtZF9vcHM7CisJaW5pdC5mbGFncyA9IGZsYWdzOworCWluaXQucGFyZW50X25hbWVzID0gcGFyZW50X25hbWUgPyAmcGFyZW50X25hbWUgOiBOVUxMOworCWluaXQubnVtX3BhcmVudHMgPSBwYXJlbnRfbmFtZSA/IDEgOiAwOworCisJZmQtPnJlZyA9IHJlZzsKKwlmZC0+c2hpZnQgPSBzaGlmdDsKKwlmZC0+bWFzayA9IChCSVQod2lkdGgpIC0gMSkgPDwgc2hpZnQ7CisJZmQtPmRlbm9tID0gZGVub207CisJZmQtPmZsYWdzID0gY2xrX2ZsYWdzOworCWZkLT5sb2NrID0gbG9jazsKKwlmZC0+aHcuaW5pdCA9ICZpbml0OworCisJY2xrID0gY2xrX3JlZ2lzdGVyKGRldiwgJmZkLT5odyk7CisJaWYgKElTX0VSUihjbGspKSB7CisJCXByX2VycigiJXM6IGNvdWxkIG5vdCByZWdpc3RlciBjbGsgJXNcbiIsIF9fZnVuY19fLCBuYW1lKTsKKwkJa2ZyZWUoZmQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gY2xrOworfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9wbWRjbGtfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWNvbnN0IGNoYXIgKmNsa19uYW1lID0gbnAtPmZ1bGxfbmFtZTsKKwl2b2lkIF9faW9tZW0gKmNzcl9yZWc7CisJc3RydWN0IHJlc291cmNlIHJlczsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdTY0IGRlbm9tOworCXUzMiBmbGFncyA9IDA7CisJaW50IHJjOworCisJLyogQ2hlY2sgaWYgdGhlIGVudHJ5IGlzIGRpc2FibGVkICovCisJaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKG5wKSkKKwkJcmV0dXJuOworCisJLyogUGFyc2UgdGhlIERUUyByZWdpc3RlciBmb3IgcmVzb3VyY2UgKi8KKwlyYyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpOworCWlmIChyYyAhPSAwKSB7CisJCXByX2Vycigibm8gRFRTIHJlZ2lzdGVyIGZvciAlc1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisJY3NyX3JlZyA9IG9mX2lvbWFwKG5wLCAwKTsKKwlpZiAoIWNzcl9yZWcpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gbWFwIHJlc291cmNlIGZvciAlc1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisJCXJldHVybjsKKwl9CisJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJjbG9jay1vdXRwdXQtbmFtZXMiLCAmY2xrX25hbWUpOworCisJZGVub20gPSBCSVQoWEdFTkVfQ0xLX1BNRF9XSURUSCk7CisJZmxhZ3MgfD0gWEdFTkVfQ0xLX1BNRF9TQ0FMRV9JTlZFUlRFRDsKKworCWNsayA9IHhnZW5lX3JlZ2lzdGVyX2Nsa19wbWQoTlVMTCwgY2xrX25hbWUsCisJCQkJICAgICBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5wLCAwKSwgMCwKKwkJCQkgICAgIGNzcl9yZWcsIFhHRU5FX0NMS19QTURfU0hJRlQsCisJCQkJICAgICBYR0VORV9DTEtfUE1EX1dJRFRILCBkZW5vbSwKKwkJCQkgICAgIGZsYWdzLCAmY2xrX2xvY2spOworCWlmICghSVNfRVJSKGNsaykpIHsKKwkJb2ZfY2xrX2FkZF9wcm92aWRlcihucCwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsaywgY2xrX25hbWUsIE5VTEwpOworCQlwcl9kZWJ1ZygiQWRkICVzIGNsb2NrXG4iLCBjbGtfbmFtZSk7CisJfSBlbHNlIHsKKwkJaWYgKGNzcl9yZWcpCisJCQlpb3VubWFwKGNzcl9yZWcpOworCX0KK30KKwogLyogSVAgQ2xvY2sgKi8KIHN0cnVjdCB4Z2VuZV9kZXZfcGFyYW1ldGVycyB7CiAJdm9pZCBfX2lvbWVtICpjc3JfcmVnOwkJLyogQ1NSIGZvciBJUCBjbG9jayAqLwpAQCAtNTQzLDYgKzc2Myw3IEBACiAKIENMS19PRl9ERUNMQVJFKHhnZW5lX3NvY3BsbF9jbG9jaywgImFwbSx4Z2VuZS1zb2NwbGwtY2xvY2siLCB4Z2VuZV9zb2NwbGxjbGtfaW5pdCk7CiBDTEtfT0ZfREVDTEFSRSh4Z2VuZV9wY3BwbGxfY2xvY2ssICJhcG0seGdlbmUtcGNwcGxsLWNsb2NrIiwgeGdlbmVfcGNwcGxsY2xrX2luaXQpOworQ0xLX09GX0RFQ0xBUkUoeGdlbmVfcG1kX2Nsb2NrLCAiYXBtLHhnZW5lLXBtZC1jbG9jayIsIHhnZW5lX3BtZGNsa19pbml0KTsKIENMS19PRl9ERUNMQVJFKHhnZW5lX3NvY3BsbF92Ml9jbG9jaywgImFwbSx4Z2VuZS1zb2NwbGwtdjItY2xvY2siLAogCSAgICAgICB4Z2VuZV9zb2NwbGxjbGtfaW5pdCk7CiBDTEtfT0ZfREVDTEFSRSh4Z2VuZV9wY3BwbGxfdjJfY2xvY2ssICJhcG0seGdlbmUtcGNwcGxsLXYyLWNsb2NrIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2Nsay5jIGIvZHJpdmVycy9jbGsvY2xrLmMKaW5kZXggODIwYTkzOS4uMGZiMzlmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbGsvY2xrLmMKKysrIGIvZHJpdmVycy9jbGsvY2xrLmMKQEAgLTE5MDgsMTAgKzE5MDgsNiBAQAogCiAJY2xrX3ByZXBhcmVfbG9jaygpOwogCi0JLyogYmFpbCBlYXJseSBpZiBub3RoaW5nIHRvIGRvICovCi0JaWYgKGRlZ3JlZXMgPT0gY2xrLT5jb3JlLT5waGFzZSkKLQkJZ290byBvdXQ7Ci0KIAl0cmFjZV9jbGtfc2V0X3BoYXNlKGNsay0+Y29yZSwgZGVncmVlcyk7CiAKIAlpZiAoY2xrLT5jb3JlLT5vcHMtPnNldF9waGFzZSkKQEAgLTE5MjIsNyArMTkxOCw2IEBACiAJaWYgKCFyZXQpCiAJCWNsay0+Y29yZS0+cGhhc2UgPSBkZWdyZWVzOwogCi1vdXQ6CiAJY2xrX3ByZXBhcmVfdW5sb2NrKCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjQ0OSw4ICsyNDQ0LDE2IEBACiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvcnBoYW4sIHRtcDIsICZjbGtfb3JwaGFuX2xpc3QsIGNoaWxkX25vZGUpIHsKIAkJc3RydWN0IGNsa19jb3JlICpwYXJlbnQgPSBfX2Nsa19pbml0X3BhcmVudChvcnBoYW4pOwogCi0JCWlmIChwYXJlbnQpCi0JCQljbGtfY29yZV9yZXBhcmVudChvcnBoYW4sIHBhcmVudCk7CisJCS8qCisJCSAqIHdlIGNvdWxkIGNhbGwgX19jbGtfc2V0X3BhcmVudCwgYnV0IHRoYXQgd291bGQgcmVzdWx0IGluIGEKKwkJICogcmVkdW5kYW50IGNhbGwgdG8gdGhlIC5zZXRfcmF0ZSBvcCwgaWYgaXQgZXhpc3RzCisJCSAqLworCQlpZiAocGFyZW50KSB7CisJCQlfX2Nsa19zZXRfcGFyZW50X2JlZm9yZShvcnBoYW4sIHBhcmVudCk7CisJCQlfX2Nsa19zZXRfcGFyZW50X2FmdGVyKG9ycGhhbiwgcGFyZW50LCBOVUxMKTsKKwkJCV9fY2xrX3JlY2FsY19hY2N1cmFjaWVzKG9ycGhhbik7CisJCQlfX2Nsa19yZWNhbGNfcmF0ZXMob3JwaGFuLCAwKTsKKwkJfQogCX0KIAogCS8qCkBAIC0yNDkxLDcgKzI0OTQsNyBAQAogCiAJLyogVGhpcyBpcyB0byBhbGxvdyB0aGlzIGZ1bmN0aW9uIHRvIGJlIGNoYWluZWQgdG8gb3RoZXJzICovCiAJaWYgKElTX0VSUl9PUl9OVUxMKGh3KSkKLQkJcmV0dXJuIChzdHJ1Y3QgY2xrICopIGh3OworCQlyZXR1cm4gRVJSX0NBU1QoaHcpOwogCiAJY2xrID0ga3phbGxvYyhzaXplb2YoKmNsayksIEdGUF9LRVJORUwpOwogCWlmICghY2xrKQpAQCAtMzE2NiwxOSArMzE2OSwxNCBAQAogCQkJICAgICAgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqY2xrc3BlYykKIHsKIAlzdHJ1Y3QgY2xrICpjbGs7Ci0Jc3RydWN0IGNsa19odyAqaHcgPSBFUlJfUFRSKC1FUFJPQkVfREVGRVIpOwogCi0JaWYgKHByb3ZpZGVyLT5nZXRfaHcpIHsKLQkJaHcgPSBwcm92aWRlci0+Z2V0X2h3KGNsa3NwZWMsIHByb3ZpZGVyLT5kYXRhKTsKLQl9IGVsc2UgaWYgKHByb3ZpZGVyLT5nZXQpIHsKLQkJY2xrID0gcHJvdmlkZXItPmdldChjbGtzcGVjLCBwcm92aWRlci0+ZGF0YSk7Ci0JCWlmICghSVNfRVJSKGNsaykpCi0JCQlodyA9IF9fY2xrX2dldF9odyhjbGspOwotCQllbHNlCi0JCQlodyA9IEVSUl9DQVNUKGNsayk7Ci0JfQorCWlmIChwcm92aWRlci0+Z2V0X2h3KQorCQlyZXR1cm4gcHJvdmlkZXItPmdldF9odyhjbGtzcGVjLCBwcm92aWRlci0+ZGF0YSk7CiAKLQlyZXR1cm4gaHc7CisJY2xrID0gcHJvdmlkZXItPmdldChjbGtzcGVjLCBwcm92aWRlci0+ZGF0YSk7CisJaWYgKElTX0VSUihjbGspKQorCQlyZXR1cm4gRVJSX0NBU1QoY2xrKTsKKwlyZXR1cm4gX19jbGtfZ2V0X2h3KGNsayk7CiB9CiAKIHN0cnVjdCBjbGsgKl9fb2ZfY2xrX2dldF9mcm9tX3Byb3ZpZGVyKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmNsa3NwZWMsCkBAIC0zMTg2LDcgKzMxODQsNyBAQAogewogCXN0cnVjdCBvZl9jbGtfcHJvdmlkZXIgKnByb3ZpZGVyOwogCXN0cnVjdCBjbGsgKmNsayA9IEVSUl9QVFIoLUVQUk9CRV9ERUZFUik7Ci0Jc3RydWN0IGNsa19odyAqaHcgPSBFUlJfUFRSKC1FUFJPQkVfREVGRVIpOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCiAJaWYgKCFjbGtzcGVjKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKQEAgLTMxOTQsMTIgKzMxOTIsMTMgQEAKIAkvKiBDaGVjayBpZiB3ZSBoYXZlIHN1Y2ggYSBwcm92aWRlciBpbiBvdXIgYXJyYXkgKi8KIAltdXRleF9sb2NrKCZvZl9jbGtfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocHJvdmlkZXIsICZvZl9jbGtfcHJvdmlkZXJzLCBsaW5rKSB7Ci0JCWlmIChwcm92aWRlci0+bm9kZSA9PSBjbGtzcGVjLT5ucCkKKwkJaWYgKHByb3ZpZGVyLT5ub2RlID09IGNsa3NwZWMtPm5wKSB7CiAJCQlodyA9IF9fb2ZfY2xrX2dldF9od19mcm9tX3Byb3ZpZGVyKHByb3ZpZGVyLCBjbGtzcGVjKTsKLQkJaWYgKCFJU19FUlIoaHcpKSB7CiAJCQljbGsgPSBfX2Nsa19jcmVhdGVfY2xrKGh3LCBkZXZfaWQsIGNvbl9pZCk7CisJCX0KIAotCQkJaWYgKCFJU19FUlIoY2xrKSAmJiAhX19jbGtfZ2V0KGNsaykpIHsKKwkJaWYgKCFJU19FUlIoY2xrKSkgeworCQkJaWYgKCFfX2Nsa19nZXQoY2xrKSkgewogCQkJCV9fY2xrX2ZyZWVfY2xrKGNsayk7CiAJCQkJY2xrID0gRVJSX1BUUigtRU5PRU5UKTsKIAkJCX0KQEAgLTM0NTEsNiArMzQ1MCwxMCBAQAogCQkJCQkmY2xrX3Byb3ZpZGVyX2xpc3QsIG5vZGUpIHsKIAkJCWlmIChmb3JjZSB8fCBwYXJlbnRfcmVhZHkoY2xrX3Byb3ZpZGVyLT5ucCkpIHsKIAorCQkJCS8qIERvbid0IHBvcHVsYXRlIHBsYXRmb3JtIGRldmljZXMgKi8KKwkJCQlvZl9ub2RlX3NldF9mbGFnKGNsa19wcm92aWRlci0+bnAsCisJCQkJCQkgT0ZfUE9QVUxBVEVEKTsKKwogCQkJCWNsa19wcm92aWRlci0+Y2xrX2luaXRfY2IoY2xrX3Byb3ZpZGVyLT5ucCk7CiAJCQkJb2ZfY2xrX3NldF9kZWZhdWx0cyhjbGtfcHJvdmlkZXItPm5wLCB0cnVlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvaDgzMDAvY2xrLWRpdi5jIGIvZHJpdmVycy9jbGsvaDgzMDAvY2xrLWRpdi5jCmluZGV4IDRiZjQ0YTIuLjcxNWI4ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2g4MzAwL2Nsay1kaXYuYworKysgYi9kcml2ZXJzL2Nsay9oODMwMC9jbGstZGl2LmMKQEAgLTE0LDcgKzE0LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBoODMwMF9kaXZfY2xrX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7Ci0Jc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBjbGtfaHcgKmh3OwogCWNvbnN0IGNoYXIgKmNsa19uYW1lID0gbm9kZS0+bmFtZTsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAl2b2lkIF9faW9tZW0gKmRpdmNyID0gTlVMTDsKQEAgLTM4LDE1ICszOCwxNSBAQAogCiAJcGFyZW50X25hbWUgPSBvZl9jbGtfZ2V0X3BhcmVudF9uYW1lKG5vZGUsIDApOwogCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJyZW5lc2FzLHdpZHRoIiwgJndpZHRoKTsKLQljbGsgPSBjbGtfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCBjbGtfbmFtZSwgcGFyZW50X25hbWUsCisJaHcgPSBjbGtfaHdfcmVnaXN0ZXJfZGl2aWRlcihOVUxMLCBjbGtfbmFtZSwgcGFyZW50X25hbWUsCiAJCQkJICAgQ0xLX1NFVF9SQVRFX0dBVEUsIGRpdmNyLCBvZmZzZXQsIHdpZHRoLAogCQkJCSAgIENMS19ESVZJREVSX1BPV0VSX09GX1RXTywgJmNsa2xvY2spOwotCWlmICghSVNfRVJSKGNsaykpIHsKLQkJb2ZfY2xrX2FkZF9wcm92aWRlcihub2RlLCBvZl9jbGtfc3JjX3NpbXBsZV9nZXQsIGNsayk7CisJaWYgKCFJU19FUlIoaHcpKSB7CisJCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsIGh3KTsKIAkJcmV0dXJuOwogCX0KIAlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcmVnaXN0ZXIgJXMgZGl2IGNsb2NrICglbGQpXG4iLAotCSAgICAgICBfX2Z1bmNfXywgY2xrX25hbWUsIFBUUl9FUlIoY2xrKSk7CisJICAgICAgIF9fZnVuY19fLCBjbGtfbmFtZSwgUFRSX0VSUihodykpOwogZXJyb3I6CiAJaWYgKGRpdmNyKQogCQlpb3VubWFwKGRpdmNyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2g4MzAwL2Nsay1oOHMyNjc4LmMgYi9kcml2ZXJzL2Nsay9oODMwMC9jbGstaDhzMjY3OC5jCmluZGV4IGM5YzJmZDUuLmEyNjMxMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2g4MzAwL2Nsay1oOHMyNjc4LmMKKysrIGIvZHJpdmVycy9jbGsvaDgzMDAvY2xrLWg4czI2NzguYwpAQCAtODQsMTEgKzg0LDExIEBACiBzdGF0aWMgdm9pZCBfX2luaXQgaDhzMjY3OF9wbGxfY2xrX3NldHVwKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAl1bnNpZ25lZCBpbnQgbnVtX3BhcmVudHM7Ci0Jc3RydWN0IGNsayAqY2xrOwogCWNvbnN0IGNoYXIgKmNsa19uYW1lID0gbm9kZS0+bmFtZTsKIAljb25zdCBjaGFyICpwYXJlbnRfbmFtZTsKIAlzdHJ1Y3QgcGxsX2Nsb2NrICpwbGxfY2xvY2s7CiAJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdDsKKwlpbnQgcmV0OwogCiAJbnVtX3BhcmVudHMgPSBvZl9jbGtfZ2V0X3BhcmVudF9jb3VudChub2RlKTsKIAlpZiAoIW51bV9wYXJlbnRzKSB7CkBAIC0xMjEsMTQgKzEyMSwxNCBAQAogCWluaXQubnVtX3BhcmVudHMgPSAxOwogCXBsbF9jbG9jay0+aHcuaW5pdCA9ICZpbml0OwogCi0JY2xrID0gY2xrX3JlZ2lzdGVyKE5VTEwsICZwbGxfY2xvY2stPmh3KTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKLQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyICVzIGRpdiBjbG9jayAoJWxkKVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBjbGtfbmFtZSwgUFRSX0VSUihjbGspKTsKKwlyZXQgPSBjbGtfaHdfcmVnaXN0ZXIoTlVMTCwgJnBsbF9jbG9jay0+aHcpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyICVzIGRpdiBjbG9jayAoJWQpXG4iLAorCQkgICAgICAgX19mdW5jX18sIGNsa19uYW1lLCByZXQpOwogCQlnb3RvIHVubWFwX3BsbGNyOwogCX0KIAotCW9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBjbGspOworCW9mX2Nsa19hZGRfaHdfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX2h3X3NpbXBsZV9nZXQsICZwbGxfY2xvY2stPmh3KTsKIAlyZXR1cm47CiAKIHVubWFwX3BsbGNyOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvaW14L2Nsay1pbXgxLmMgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDEuYwppbmRleCA5OWNmODAyLi5lYWE0NjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDEuYworKysgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDEuYwpAQCAtNDUsMTAgKzQ1LDEzIEBACiAjZGVmaW5lIENDTV9QQ0RSCShjY20gKyAweDAwMjApCiAjZGVmaW5lIFNDTV9HQ0NSCShjY20gKyAweDA4MTApCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBfbXgxX2Nsb2Nrc19pbml0KHVuc2lnbmVkIGxvbmcgZnJlZikKK3N0YXRpYyB2b2lkIF9faW5pdCBteDFfY2xvY2tzX2luaXRfZHQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKKwljY20gPSBvZl9pb21hcChucCwgMCk7CisJQlVHX09OKCFjY20pOworCiAJY2xrW0lNWDFfQ0xLX0RVTU1ZXSA9IGlteF9jbGtfZml4ZWQoImR1bW15IiwgMCk7Ci0JY2xrW0lNWDFfQ0xLX0NMSzMyXSA9IGlteF9vYnRhaW5fZml4ZWRfY2xvY2soImNsazMyIiwgZnJlZik7CisJY2xrW0lNWDFfQ0xLX0NMSzMyXSA9IGlteF9vYnRhaW5fZml4ZWRfY2xvY2soImNsazMyIiwgMzI3NjgpOwogCWNsa1tJTVgxX0NMS19DTEsxNk1fRVhUXSA9IGlteF9jbGtfZml4ZWQoImNsazE2bV9leHQiLCAxNjAwMDAwMCk7CiAJY2xrW0lNWDFfQ0xLX0NMSzE2TV0gPSBpbXhfY2xrX2dhdGUoImNsazE2bSIsICJjbGsxNm1fZXh0IiwgQ0NNX0NTQ1IsIDE3KTsKIAljbGtbSU1YMV9DTEtfQ0xLMzJfUFJFTVVMVF0gPSBpbXhfY2xrX2ZpeGVkX2ZhY3RvcigiY2xrMzJfcHJlbXVsdCIsICJjbGszMiIsIDUxMiwgMSk7CkBAIC03NCw0NSArNzcsNiBAQAogCWNsa1tJTVgxX0NMS19VU0JEX0dBVEVdID0gaW14X2Nsa19nYXRlKCJ1c2JkX2dhdGUiLCAiY2xrNDhtIiwgU0NNX0dDQ1IsIDApOwogCiAJaW14X2NoZWNrX2Nsb2NrcyhjbGssIEFSUkFZX1NJWkUoY2xrKSk7Ci19Ci0KLWludCBfX2luaXQgbXgxX2Nsb2Nrc19pbml0KHVuc2lnbmVkIGxvbmcgZnJlZikKLXsKLQljY20gPSBpb3JlbWFwKE1YMV9DQ01fQkFTRV9BRERSLCBTWl80Syk7Ci0JQlVHX09OKCFjY20pOwotCi0JX214MV9jbG9ja3NfaW5pdChmcmVmKTsKLQotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrW0lNWDFfQ0xLX1BFUjFdLCAicGVyIiwgImlteC1ncHQuMCIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrW0lNWDFfQ0xLX0hDTEtdLCAiaXBnIiwgImlteC1ncHQuMCIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrW0lNWDFfQ0xLX0RNQV9HQVRFXSwgImFoYiIsICJpbXgxLWRtYSIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrW0lNWDFfQ0xLX0hDTEtdLCAiaXBnIiwgImlteDEtZG1hIik7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGtbSU1YMV9DTEtfUEVSMV0sICJwZXIiLCAiaW14MS11YXJ0LjAiKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsa1tJTVgxX0NMS19IQ0xLXSwgImlwZyIsICJpbXgxLXVhcnQuMCIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrW0lNWDFfQ0xLX1BFUjFdLCAicGVyIiwgImlteDEtdWFydC4xIik7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGtbSU1YMV9DTEtfSENMS10sICJpcGciLCAiaW14MS11YXJ0LjEiKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsa1tJTVgxX0NMS19QRVIxXSwgInBlciIsICJpbXgxLXVhcnQuMiIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrW0lNWDFfQ0xLX1VBUlQzX0dBVEVdLCAiaXBnIiwgImlteDEtdWFydC4yIik7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGtbSU1YMV9DTEtfSENMS10sIE5VTEwsICJpbXgxLWkyYy4wIik7Ci0JY2xrX3JlZ2lzdGVyX2Nsa2RldihjbGtbSU1YMV9DTEtfUEVSMl0sICJwZXIiLCAiaW14MS1jc3BpLjAiKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsa1tJTVgxX0NMS19EVU1NWV0sICJpcGciLCAiaW14MS1jc3BpLjAiKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsa1tJTVgxX0NMS19QRVIyXSwgInBlciIsICJpbXgxLWNzcGkuMSIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrW0lNWDFfQ0xLX0RVTU1ZXSwgImlwZyIsICJpbXgxLWNzcGkuMSIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrW0lNWDFfQ0xLX1BFUjJdLCAicGVyIiwgImlteDEtZmIuMCIpOwotCWNsa19yZWdpc3Rlcl9jbGtkZXYoY2xrW0lNWDFfQ0xLX0RVTU1ZXSwgImlwZyIsICJpbXgxLWZiLjAiKTsKLQljbGtfcmVnaXN0ZXJfY2xrZGV2KGNsa1tJTVgxX0NMS19EVU1NWV0sICJhaGIiLCAiaW14MS1mYi4wIik7Ci0KLQlteGNfdGltZXJfaW5pdChNWDFfVElNMV9CQVNFX0FERFIsIE1YMV9USU0xX0lOVCwgR1BUX1RZUEVfSU1YMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IG14MV9jbG9ja3NfaW5pdF9kdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQotewotCWNjbSA9IG9mX2lvbWFwKG5wLCAwKTsKLQlCVUdfT04oIWNjbSk7Ci0KLQlfbXgxX2Nsb2Nrc19pbml0KDMyNzY4KTsKIAogCWNsa19kYXRhLmNsa3MgPSBjbGs7CiAJY2xrX2RhdGEuY2xrX251bSA9IEFSUkFZX1NJWkUoY2xrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2lteC9jbGstaW14MzUuYyBiL2RyaXZlcnMvY2xrL2lteC9jbGstaW14MzUuYwppbmRleCBiMDk3OGQzLi4yMDNjYWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDM1LmMKKysrIGIvZHJpdmVycy9jbGsvaW14L2Nsay1pbXgzNS5jCkBAIC02NiwyMCArNjYsMjIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICppcGdfcGVyX3NlbFtdID0geyJhaGJfcGVyX2RpdiIsICJhcm1fcGVyX2RpdiJ9OwogCiBlbnVtIG14MzVfY2xrcyB7Ci0JY2tpaCwgbXBsbCwgcHBsbCwgbXBsbF8wNzUsIGFybSwgaHNwLCBoc3BfZGl2LCBoc3Bfc2VsLCBhaGIsIGlwZywKLQlhcm1fcGVyX2RpdiwgYWhiX3Blcl9kaXYsIGlwZ19wZXIsIHVhcnRfc2VsLCB1YXJ0X2RpdiwgZXNkaGNfc2VsLAotCWVzZGhjMV9kaXYsIGVzZGhjMl9kaXYsIGVzZGhjM19kaXYsIHNwZGlmX3NlbCwgc3BkaWZfZGl2X3ByZSwKLQlzcGRpZl9kaXZfcG9zdCwgc3NpX3NlbCwgc3NpMV9kaXZfcHJlLCBzc2kxX2Rpdl9wb3N0LCBzc2kyX2Rpdl9wcmUsCi0Jc3NpMl9kaXZfcG9zdCwgdXNiX3NlbCwgdXNiX2RpdiwgbmZjX2RpdiwgYXNyY19nYXRlLCBwYXRhX2dhdGUsCi0JYXVkbXV4X2dhdGUsIGNhbjFfZ2F0ZSwgY2FuMl9nYXRlLCBjc3BpMV9nYXRlLCBjc3BpMl9nYXRlLCBlY3RfZ2F0ZSwKLQllZGlvX2dhdGUsIGVtaV9nYXRlLCBlcGl0MV9nYXRlLCBlcGl0Ml9nYXRlLCBlc2FpX2dhdGUsIGVzZGhjMV9nYXRlLAotCWVzZGhjMl9nYXRlLCBlc2RoYzNfZ2F0ZSwgZmVjX2dhdGUsIGdwaW8xX2dhdGUsIGdwaW8yX2dhdGUsIGdwaW8zX2dhdGUsCi0JZ3B0X2dhdGUsIGkyYzFfZ2F0ZSwgaTJjMl9nYXRlLCBpMmMzX2dhdGUsIGlvbXV4Y19nYXRlLCBpcHVfZ2F0ZSwKLQlrcHBfZ2F0ZSwgbWxiX2dhdGUsIG1zaGNfZ2F0ZSwgb3dpcmVfZ2F0ZSwgcHdtX2dhdGUsIHJuZ2NfZ2F0ZSwKLQlydGNfZ2F0ZSwgcnRpY19nYXRlLCBzY2NfZ2F0ZSwgc2RtYV9nYXRlLCBzcGJhX2dhdGUsIHNwZGlmX2dhdGUsCi0Jc3NpMV9nYXRlLCBzc2kyX2dhdGUsIHVhcnQxX2dhdGUsIHVhcnQyX2dhdGUsIHVhcnQzX2dhdGUsIHVzYm90Z19nYXRlLAotCXdkb2dfZ2F0ZSwgbWF4X2dhdGUsIGFkbXV4X2dhdGUsIGNzaV9nYXRlLCBjc2lfZGl2LCBjc2lfc2VsLCBpaW1fZ2F0ZSwKLQlncHUyZF9nYXRlLCBja2lsLCBjbGtfbWF4CisJLyogIDAgKi8gY2tpaCwgbXBsbCwgcHBsbCwgbXBsbF8wNzUsIGFybSwgaHNwLCBoc3BfZGl2LCBoc3Bfc2VsLCBhaGIsCisJLyogIDkgKi8gaXBnLCBhcm1fcGVyX2RpdiwgYWhiX3Blcl9kaXYsIGlwZ19wZXIsIHVhcnRfc2VsLCB1YXJ0X2RpdiwKKwkvKiAxNSAqLyBlc2RoY19zZWwsIGVzZGhjMV9kaXYsIGVzZGhjMl9kaXYsIGVzZGhjM19kaXYsIHNwZGlmX3NlbCwKKwkvKiAyMCAqLyBzcGRpZl9kaXZfcHJlLCBzcGRpZl9kaXZfcG9zdCwgc3NpX3NlbCwgc3NpMV9kaXZfcHJlLAorCS8qIDI0ICovIHNzaTFfZGl2X3Bvc3QsIHNzaTJfZGl2X3ByZSwgc3NpMl9kaXZfcG9zdCwgdXNiX3NlbCwgdXNiX2RpdiwKKwkvKiAyOSAqLyBuZmNfZGl2LCBhc3JjX2dhdGUsIHBhdGFfZ2F0ZSwgYXVkbXV4X2dhdGUsIGNhbjFfZ2F0ZSwKKwkvKiAzNCAqLyBjYW4yX2dhdGUsIGNzcGkxX2dhdGUsIGNzcGkyX2dhdGUsIGVjdF9nYXRlLCBlZGlvX2dhdGUsCisJLyogMzkgKi8gZW1pX2dhdGUsIGVwaXQxX2dhdGUsIGVwaXQyX2dhdGUsIGVzYWlfZ2F0ZSwgZXNkaGMxX2dhdGUsCisJLyogNDQgKi8gZXNkaGMyX2dhdGUsIGVzZGhjM19nYXRlLCBmZWNfZ2F0ZSwgZ3BpbzFfZ2F0ZSwgZ3BpbzJfZ2F0ZSwKKwkvKiA0OSAqLyBncGlvM19nYXRlLCBncHRfZ2F0ZSwgaTJjMV9nYXRlLCBpMmMyX2dhdGUsIGkyYzNfZ2F0ZSwKKwkvKiA1NCAqLyBpb211eGNfZ2F0ZSwgaXB1X2dhdGUsIGtwcF9nYXRlLCBtbGJfZ2F0ZSwgbXNoY19nYXRlLAorCS8qIDU5ICovIG93aXJlX2dhdGUsIHB3bV9nYXRlLCBybmdjX2dhdGUsIHJ0Y19nYXRlLCBydGljX2dhdGUsIHNjY19nYXRlLAorCS8qIDY1ICovIHNkbWFfZ2F0ZSwgc3BiYV9nYXRlLCBzcGRpZl9nYXRlLCBzc2kxX2dhdGUsIHNzaTJfZ2F0ZSwKKwkvKiA3MCAqLyB1YXJ0MV9nYXRlLCB1YXJ0Ml9nYXRlLCB1YXJ0M19nYXRlLCB1c2JvdGdfZ2F0ZSwgd2RvZ19nYXRlLAorCS8qIDc1ICovIG1heF9nYXRlLCBhZG11eF9nYXRlLCBjc2lfZ2F0ZSwgY3NpX2RpdiwgY3NpX3NlbCwgaWltX2dhdGUsCisJLyogODEgKi8gZ3B1MmRfZ2F0ZSwgY2tpbCwgY2xrX21heAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGsgKmNsa1tjbGtfbWF4XTsKQEAgLTExNSw3ICsxMTcsNyBAQAogCX0KIAogCWNsa1tja2loXSA9IGlteF9jbGtfZml4ZWQoImNraWgiLCAyNDAwMDAwMCk7Ci0JY2xrW2NraWxdID0gaW14X2Nsa19maXhlZCgiY2tpaCIsIDMyNzY4KTsKKwljbGtbY2tpbF0gPSBpbXhfY2xrX2ZpeGVkKCJja2lsIiwgMzI3NjgpOwogCWNsa1ttcGxsXSA9IGlteF9jbGtfcGxsdjEoSU1YX1BMTFYxX0lNWDM1LCAibXBsbCIsICJja2loIiwgYmFzZSArIE1YMzVfQ0NNX01QQ1RMKTsKIAljbGtbcHBsbF0gPSBpbXhfY2xrX3BsbHYxKElNWF9QTExWMV9JTVgzNSwgInBwbGwiLCAiY2tpaCIsIGJhc2UgKyBNWDM1X0NDTV9QUENUTCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2lteC9jbGstaW14NTEtaW14NTMuYyBiL2RyaXZlcnMvY2xrL2lteC9jbGstaW14NTEtaW14NTMuYwppbmRleCAyOWQ0YzQ0Li4xZTNjOWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDUxLWlteDUzLmMKKysrIGIvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg1MS1pbXg1My5jCkBAIC0xMjYsNiArMTI2LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpteDUxX3NwZGlmMV9jb21fc2VsW10gPSB7ICJzcGRpZjFfcG9kZiIsICJzc2kyX3Jvb3RfZ2F0ZSIsIH07CiBzdGF0aWMgY29uc3QgY2hhciAqc3RlcF9zZWxzW10gPSB7ICJscF9hcG0iLCB9Owogc3RhdGljIGNvbnN0IGNoYXIgKmNwdV9wb2RmX3NlbHNbXSA9IHsgInBsbDFfc3ciLCAic3RlcF9zZWwiIH07CitzdGF0aWMgY29uc3QgY2hhciAqaWVlZTE1ODhfc2Vsc1tdID0geyAicGxsM19zdyIsICJwbGw0X3N3IiwgImR1bW15IiAvKiB1c2JwaHkyX2NsayAqLywgImR1bW15IiAvKiBmZWNfcGh5X2NsayAqLyB9OwogCiBzdGF0aWMgc3RydWN0IGNsayAqY2xrW0lNWDVfQ0xLX0VORF07CiBzdGF0aWMgc3RydWN0IGNsa19vbmVjZWxsX2RhdGEgY2xrX2RhdGE7CkBAIC01NDMsNiArNTQ0LDI1IEBACiAJY2xrW0lNWDVfQ0xLX0kyQzNfR0FURV0JCT0gaW14X2Nsa19nYXRlMigiaTJjM19nYXRlIiwgInBlcl9yb290IiwgTVhDX0NDTV9DQ0dSMSwgMjIpOwogCWNsa1tJTVg1X0NMS19TQVRBX0dBVEVdCQk9IGlteF9jbGtfZ2F0ZTIoInNhdGFfZ2F0ZSIsICJpcGciLCBNWENfQ0NNX0NDR1I0LCAyKTsKIAorCWNsa1tJTVg1X0NMS19GSVJJX1NFTF0JCT0gaW14X2Nsa19tdXgoImZpcmlfc2VsIiwgTVhDX0NDTV9DU0NNUjIsIDEyLCAyLAorCQkJCQkJc3RhbmRhcmRfcGxsX3NlbCwgQVJSQVlfU0laRShzdGFuZGFyZF9wbGxfc2VsKSk7CisJY2xrW0lNWDVfQ0xLX0ZJUklfUFJFRF0JCT0gaW14X2Nsa19kaXZpZGVyKCJmaXJpX3ByZWQiLCAiZmlyaV9zZWwiLCBNWENfQ0NNX0NTQ0RSMywgNiwgMyk7CisJY2xrW0lNWDVfQ0xLX0ZJUklfUE9ERl0JCT0gaW14X2Nsa19kaXZpZGVyKCJmaXJpX3BvZGYiLCAiZmlyaV9wcmVkIiwgTVhDX0NDTV9DU0NEUjMsIDAsIDYpOworCWNsa1tJTVg1X0NMS19GSVJJX1NFUklBTF9HQVRFXQk9IGlteF9jbGtfZ2F0ZTIoImZpcmlfc2VyaWFsX2dhdGUiLCAiZmlyaV9wb2RmIiwgTVhDX0NDTV9DQ0dSMSwgMjgpOworCWNsa1tJTVg1X0NMS19GSVJJX0lQR19HQVRFXQk9IGlteF9jbGtfZ2F0ZTIoImZpcmlfaXBnX2dhdGUiLCAiaXBnIiwgTVhDX0NDTV9DQ0dSMSwgMjYpOworCisJY2xrW0lNWDVfQ0xLX0NTSTBfTUNMSzFfU0VMXQk9IGlteF9jbGtfbXV4KCJjc2kwX21jbGsxX3NlbCIsIE1YQ19DQ01fQ1NDTVIyLCAyMiwgMiwKKwkJCQkJCXN0YW5kYXJkX3BsbF9zZWwsIEFSUkFZX1NJWkUoc3RhbmRhcmRfcGxsX3NlbCkpOworCWNsa1tJTVg1X0NMS19DU0kwX01DTEsxX1BSRURdCT0gaW14X2Nsa19kaXZpZGVyKCJjc2kwX21jbGsxX3ByZWQiLCAiY3NpMF9tY2xrMV9zZWwiLCBNWENfQ0NNX0NTQ0RSNCwgNiwgMyk7CisJY2xrW0lNWDVfQ0xLX0NTSTBfTUNMSzFfUE9ERl0JPSBpbXhfY2xrX2RpdmlkZXIoImNzaTBfbWNsazFfcG9kZiIsICJjc2kwX21jbGsxX3ByZWQiLCBNWENfQ0NNX0NTQ0RSNCwgMCwgNik7CisJY2xrW0lNWDVfQ0xLX0NTSTBfTUNMSzFfR0FURV0JPSBpbXhfY2xrX2dhdGUyKCJjc2kwX21jbGsxX3NlcmlhbF9nYXRlIiwgImNzaTBfbWNsazFfcG9kZiIsIE1YQ19DQ01fQ0NHUjYsIDQpOworCisJY2xrW0lNWDVfQ0xLX0lFRUUxNTg4X1NFTF0JPSBpbXhfY2xrX211eCgiaWVlZTE1ODhfc2VsIiwgTVhDX0NDTV9DU0NNUjIsIDE0LCAyLAorCQkJCQkJaWVlZTE1ODhfc2VscywgQVJSQVlfU0laRShpZWVlMTU4OF9zZWxzKSk7CisJY2xrW0lNWDVfQ0xLX0lFRUUxNTg4X1BSRURdCT0gaW14X2Nsa19kaXZpZGVyKCJpZWVlMTU4OF9wcmVkIiwgImllZWUxNTg4X3NlbCIsIE1YQ19DQ01fQ1NDRFIyLCA2LCAzKTsKKwljbGtbSU1YNV9DTEtfSUVFRTE1ODhfUE9ERl0JPSBpbXhfY2xrX2RpdmlkZXIoImllZWUxNTg4X3BvZGYiLCAiaWVlZTE1ODhfcHJlZCIsIE1YQ19DQ01fQ1NDRFIyLCAwLCA2KTsKKwljbGtbSU1YNV9DTEtfSUVFRTE1ODhfR0FURV0JPSBpbXhfY2xrX2dhdGUyKCJpZWVlMTU4OF9zZXJpYWxfZ2F0ZSIsICJpZWVlMTU4OF9wb2RmIiwgTVhDX0NDTV9DQ0dSNywgNik7CisKIAljbGtbSU1YNV9DTEtfQ0tPMV9TRUxdCQk9IGlteF9jbGtfbXV4KCJja28xX3NlbCIsIE1YQ19DQ01fQ0NPU1IsIDAsIDQsCiAJCQkJCQlteDUzX2NrbzFfc2VsLCBBUlJBWV9TSVpFKG14NTNfY2tvMV9zZWwpKTsKIAljbGtbSU1YNV9DTEtfQ0tPMV9QT0RGXQkJPSBpbXhfY2xrX2RpdmlkZXIoImNrbzFfcG9kZiIsICJja28xX3NlbCIsIE1YQ19DQ01fQ0NPU1IsIDQsIDMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg2cS5jIGIvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg2cS5jCmluZGV4IGJhMWMxYWUuLmNlOGVhMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2lteC9jbGstaW14NnEuYworKysgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDZxLmMKQEAgLTMxOCwxMSArMzE4LDE2IEBACiAJCWNsa1tJTVg2UURMX0NMS19JUEdfUEVSX1NFTF0gPSBpbXhfY2xrX211eCgiaXBnX3Blcl9zZWwiLCBiYXNlICsgMHgxYywgNiwgMSwgaXBnX3Blcl9zZWxzLCBBUlJBWV9TSVpFKGlwZ19wZXJfc2VscykpOwogCQljbGtbSU1YNlFETF9DTEtfVUFSVF9TRUxdID0gaW14X2Nsa19tdXgoInVhcnRfc2VsIiwgYmFzZSArIDB4MjQsIDYsIDEsIHVhcnRfc2VscywgQVJSQVlfU0laRSh1YXJ0X3NlbHMpKTsKIAkJY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVfU0VMXSA9IGlteF9jbGtfbXV4KCJncHUyZF9jb3JlX3NlbCIsIGJhc2UgKyAweDE4LCAxNiwgMiwgZ3B1MmRfY29yZV9zZWxzXzIsIEFSUkFZX1NJWkUoZ3B1MmRfY29yZV9zZWxzXzIpKTsKKwl9IGVsc2UgaWYgKGNsa19vbl9pbXg2ZGwoKSkgeworCQljbGtbSU1YNlFETF9DTEtfTUxCX1NFTF0gPSBpbXhfY2xrX211eCgibWxiX3NlbCIsICAgYmFzZSArIDB4MTgsIDE2LCAyLCBncHUyZF9jb3JlX3NlbHMsICAgQVJSQVlfU0laRShncHUyZF9jb3JlX3NlbHMpKTsKIAl9IGVsc2UgewogCQljbGtbSU1YNlFETF9DTEtfR1BVMkRfQ09SRV9TRUxdID0gaW14X2Nsa19tdXgoImdwdTJkX2NvcmVfc2VsIiwgICBiYXNlICsgMHgxOCwgMTYsIDIsIGdwdTJkX2NvcmVfc2VscywgICBBUlJBWV9TSVpFKGdwdTJkX2NvcmVfc2VscykpOwogCX0KIAljbGtbSU1YNlFETF9DTEtfR1BVM0RfQ09SRV9TRUxdICAgPSBpbXhfY2xrX211eCgiZ3B1M2RfY29yZV9zZWwiLCAgIGJhc2UgKyAweDE4LCA0LCAgMiwgZ3B1M2RfY29yZV9zZWxzLCAgIEFSUkFZX1NJWkUoZ3B1M2RfY29yZV9zZWxzKSk7Ci0JY2xrW0lNWDZRRExfQ0xLX0dQVTNEX1NIQURFUl9TRUxdID0gaW14X2Nsa19tdXgoImdwdTNkX3NoYWRlcl9zZWwiLCBiYXNlICsgMHgxOCwgOCwgIDIsIGdwdTNkX3NoYWRlcl9zZWxzLCBBUlJBWV9TSVpFKGdwdTNkX3NoYWRlcl9zZWxzKSk7CisJaWYgKGNsa19vbl9pbXg2ZGwoKSkKKwkJY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVfU0VMXSA9IGlteF9jbGtfbXV4KCJncHUyZF9jb3JlX3NlbCIsIGJhc2UgKyAweDE4LCA4LCAgMiwgZ3B1M2Rfc2hhZGVyX3NlbHMsIEFSUkFZX1NJWkUoZ3B1M2Rfc2hhZGVyX3NlbHMpKTsKKwllbHNlCisJCWNsa1tJTVg2UURMX0NMS19HUFUzRF9TSEFERVJfU0VMXSA9IGlteF9jbGtfbXV4KCJncHUzZF9zaGFkZXJfc2VsIiwgYmFzZSArIDB4MTgsIDgsICAyLCBncHUzZF9zaGFkZXJfc2VscywgQVJSQVlfU0laRShncHUzZF9zaGFkZXJfc2VscykpOwogCWNsa1tJTVg2UURMX0NMS19JUFUxX1NFTF0gICAgICAgICA9IGlteF9jbGtfbXV4KCJpcHUxX3NlbCIsICAgICAgICAgYmFzZSArIDB4M2MsIDksICAyLCBpcHVfc2VscywgICAgICAgICAgQVJSQVlfU0laRShpcHVfc2VscykpOwogCWNsa1tJTVg2UURMX0NMS19JUFUyX1NFTF0gICAgICAgICA9IGlteF9jbGtfbXV4KCJpcHUyX3NlbCIsICAgICAgICAgYmFzZSArIDB4M2MsIDE0LCAyLCBpcHVfc2VscywgICAgICAgICAgQVJSQVlfU0laRShpcHVfc2VscykpOwogCWNsa1tJTVg2UURMX0NMS19MREJfREkwX1NFTF0gICAgICA9IGlteF9jbGtfbXV4X2ZsYWdzKCJsZGJfZGkwX3NlbCIsIGJhc2UgKyAweDJjLCA5LCAgMywgbGRiX2RpX3NlbHMsICAgICAgQVJSQVlfU0laRShsZGJfZGlfc2VscyksIENMS19TRVRfUkFURV9QQVJFTlQpOwpAQCAtNDAwLDkgKzQwNSwxNSBAQAogCQljbGtbSU1YNlFETF9DTEtfTERCX0RJMF9ESVZfM181XSA9IGlteF9jbGtfZml4ZWRfZmFjdG9yKCJsZGJfZGkwX2Rpdl8zXzUiLCAibGRiX2RpMF9zZWwiLCAyLCA3KTsKIAkJY2xrW0lNWDZRRExfQ0xLX0xEQl9ESTFfRElWXzNfNV0gPSBpbXhfY2xrX2ZpeGVkX2ZhY3RvcigibGRiX2RpMV9kaXZfM181IiwgImxkYl9kaTFfc2VsIiwgMiwgNyk7CiAJfQotCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFX1BPREZdICA9IGlteF9jbGtfZGl2aWRlcigiZ3B1MmRfY29yZV9wb2RmIiwgICJncHUyZF9jb3JlX3NlbCIsICAgIGJhc2UgKyAweDE4LCAyMywgMyk7CisJaWYgKGNsa19vbl9pbXg2ZGwoKSkKKwkJY2xrW0lNWDZRRExfQ0xLX01MQl9QT0RGXSAgPSBpbXhfY2xrX2RpdmlkZXIoIm1sYl9wb2RmIiwgICJtbGJfc2VsIiwgICAgYmFzZSArIDB4MTgsIDIzLCAzKTsKKwllbHNlCisJCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFX1BPREZdICA9IGlteF9jbGtfZGl2aWRlcigiZ3B1MmRfY29yZV9wb2RmIiwgICJncHUyZF9jb3JlX3NlbCIsICAgIGJhc2UgKyAweDE4LCAyMywgMyk7CiAJY2xrW0lNWDZRRExfQ0xLX0dQVTNEX0NPUkVfUE9ERl0gID0gaW14X2Nsa19kaXZpZGVyKCJncHUzZF9jb3JlX3BvZGYiLCAgImdwdTNkX2NvcmVfc2VsIiwgICAgYmFzZSArIDB4MTgsIDI2LCAzKTsKLQljbGtbSU1YNlFETF9DTEtfR1BVM0RfU0hBREVSXSAgICAgPSBpbXhfY2xrX2RpdmlkZXIoImdwdTNkX3NoYWRlciIsICAgICAiZ3B1M2Rfc2hhZGVyX3NlbCIsICBiYXNlICsgMHgxOCwgMjksIDMpOworCWlmIChjbGtfb25faW14NmRsKCkpCisJCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFX1BPREZdICA9IGlteF9jbGtfZGl2aWRlcigiZ3B1MmRfY29yZV9wb2RmIiwgICAgICJncHUyZF9jb3JlX3NlbCIsICBiYXNlICsgMHgxOCwgMjksIDMpOworCWVsc2UKKwkJY2xrW0lNWDZRRExfQ0xLX0dQVTNEX1NIQURFUl0gICAgID0gaW14X2Nsa19kaXZpZGVyKCJncHUzZF9zaGFkZXIiLCAgICAgImdwdTNkX3NoYWRlcl9zZWwiLCAgYmFzZSArIDB4MTgsIDI5LCAzKTsKIAljbGtbSU1YNlFETF9DTEtfSVBVMV9QT0RGXSAgICAgICAgPSBpbXhfY2xrX2RpdmlkZXIoImlwdTFfcG9kZiIsICAgICAgICAiaXB1MV9zZWwiLCAgICAgICAgICBiYXNlICsgMHgzYywgMTEsIDMpOwogCWNsa1tJTVg2UURMX0NMS19JUFUyX1BPREZdICAgICAgICA9IGlteF9jbGtfZGl2aWRlcigiaXB1Ml9wb2RmIiwgICAgICAgICJpcHUyX3NlbCIsICAgICAgICAgIGJhc2UgKyAweDNjLCAxNiwgMyk7CiAJY2xrW0lNWDZRRExfQ0xLX0xEQl9ESTBfUE9ERl0gICAgID0gaW14X2Nsa19kaXZpZGVyX2ZsYWdzKCJsZGJfZGkwX3BvZGYiLCAibGRiX2RpMF9kaXZfM181IiwgYmFzZSArIDB4MjAsIDEwLCAxLCAwKTsKQEAgLTQ3MywxNCArNDg0LDcgQEAKIAljbGtbSU1YNlFETF9DTEtfRVNBSV9NRU1dICAgICA9IGlteF9jbGtfZ2F0ZTJfc2hhcmVkKCJlc2FpX21lbSIsICJhaGIiLCAgICAgICAgICAgICBiYXNlICsgMHg2YywgMTYsICZzaGFyZV9jb3VudF9lc2FpKTsKIAljbGtbSU1YNlFETF9DTEtfR1BUX0lQR10gICAgICA9IGlteF9jbGtfZ2F0ZTIoImdwdF9pcGciLCAgICAgICAiaXBnIiwgICAgICAgICAgICAgICBiYXNlICsgMHg2YywgMjApOwogCWNsa1tJTVg2UURMX0NMS19HUFRfSVBHX1BFUl0gID0gaW14X2Nsa19nYXRlMigiZ3B0X2lwZ19wZXIiLCAgICJpcGdfcGVyIiwgICAgICAgICAgIGJhc2UgKyAweDZjLCAyMik7Ci0JaWYgKGNsa19vbl9pbXg2ZGwoKSkKLQkJLyoKLQkJICogVGhlIG11bHRpcGxleGVyIGFuZCBkaXZpZGVyIG9mIGlteDZxIGNsb2NrIGdwdTNkX3NoYWRlciBnZXQKLQkJICogcmVkZWZpbmVkL3JldXNlZCBhcyBncHUyZF9jb3JlX3NlbCBhbmQgZ3B1MmRfY29yZV9wb2RmIG9uIGlteDZkbC4KLQkJICovCi0JCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFXSA9IGlteF9jbGtfZ2F0ZTIoImdwdTJkX2NvcmUiLCAiZ3B1M2Rfc2hhZGVyIiwgYmFzZSArIDB4NmMsIDI0KTsKLQllbHNlCi0JCWNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFXSA9IGlteF9jbGtfZ2F0ZTIoImdwdTJkX2NvcmUiLCAiZ3B1MmRfY29yZV9wb2RmIiwgYmFzZSArIDB4NmMsIDI0KTsKKwljbGtbSU1YNlFETF9DTEtfR1BVMkRfQ09SRV0gPSBpbXhfY2xrX2dhdGUyKCJncHUyZF9jb3JlIiwgImdwdTJkX2NvcmVfcG9kZiIsIGJhc2UgKyAweDZjLCAyNCk7CiAJY2xrW0lNWDZRRExfQ0xLX0dQVTNEX0NPUkVdICAgPSBpbXhfY2xrX2dhdGUyKCJncHUzZF9jb3JlIiwgICAgImdwdTNkX2NvcmVfcG9kZiIsICAgYmFzZSArIDB4NmMsIDI2KTsKIAljbGtbSU1YNlFETF9DTEtfSERNSV9JQUhCXSAgICA9IGlteF9jbGtfZ2F0ZTIoImhkbWlfaWFoYiIsICAgICAiYWhiIiwgICAgICAgICAgICAgICBiYXNlICsgMHg3MCwgMCk7CiAJY2xrW0lNWDZRRExfQ0xLX0hETUlfSVNGUl0gICAgPSBpbXhfY2xrX2dhdGUyKCJoZG1pX2lzZnIiLCAgICAgInZpZGVvXzI3bSIsICAgICAgICAgYmFzZSArIDB4NzAsIDQpOwpAQCAtNTExLDcgKzUxNSw3IEBACiAJCSAqIFRoZSBtdWx0aXBsZXhlciBhbmQgZGl2aWRlciBvZiB0aGUgaW14NnEgY2xvY2sgZ3B1MmQgZ2V0CiAJCSAqIHJlZGVmaW5lZC9yZXVzZWQgYXMgbWxiX3N5c19zZWwgYW5kIG1sYl9zeXNfY2xrX3BvZGYgb24gaW14NmRsLgogCQkgKi8KLQkJY2xrW0lNWDZRRExfQ0xLX01MQl0gPSBpbXhfY2xrX2dhdGUyKCJtbGIiLCAgICAgICAgICAgICJncHUyZF9jb3JlX3BvZGYiLCAgIGJhc2UgKyAweDc0LCAxOCk7CisJCWNsa1tJTVg2UURMX0NMS19NTEJdID0gaW14X2Nsa19nYXRlMigibWxiIiwgICAgICAgICAgICAibWxiX3BvZGYiLCAgIGJhc2UgKyAweDc0LCAxOCk7CiAJZWxzZQogCQljbGtbSU1YNlFETF9DTEtfTUxCXSA9IGlteF9jbGtfZ2F0ZTIoIm1sYiIsICAgICAgICAgICAgImF4aSIsICAgICAgICAgICAgICAgYmFzZSArIDB4NzQsIDE4KTsKIAljbGtbSU1YNlFETF9DTEtfTU1EQ19DSDBfQVhJXSA9IGlteF9jbGtfZ2F0ZTIoIm1tZGNfY2gwX2F4aSIsICAibW1kY19jaDBfYXhpX3BvZGYiLCBiYXNlICsgMHg3NCwgMjApOwpAQCAtNjI5LDYgKzYzMywyNCBAQAogCWlmIChJU19FTkFCTEVEKENPTkZJR19QQ0lfSU1YNikpCiAJCWNsa19zZXRfcGFyZW50KGNsa1tJTVg2UURMX0NMS19MVkRTMV9TRUxdLCBjbGtbSU1YNlFETF9DTEtfU0FUQV9SRUZfMTAwTV0pOwogCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBHUFUgY2xvY2sgbXV4ZXMsIHNvIHRoYXQgdGhlIG1heGltdW0gc3BlY2lmaWVkIGNsb2NrCisJICogcmF0ZXMgZm9yIHRoZSByZXNwZWN0aXZlIFNvQyBhcmUgbm90IGV4Y2VlZGVkLgorCSAqLworCWlmIChjbGtfb25faW14NmRsKCkpIHsKKwkJY2xrX3NldF9wYXJlbnQoY2xrW0lNWDZRRExfQ0xLX0dQVTNEX0NPUkVfU0VMXSwKKwkJCSAgICAgICBjbGtbSU1YNlFETF9DTEtfUExMMl9QRkQxXzU5NE1dKTsKKwkJY2xrX3NldF9wYXJlbnQoY2xrW0lNWDZRRExfQ0xLX0dQVTJEX0NPUkVfU0VMXSwKKwkJCSAgICAgICBjbGtbSU1YNlFETF9DTEtfUExMMl9QRkQxXzU5NE1dKTsKKwl9IGVsc2UgaWYgKGNsa19vbl9pbXg2cSgpKSB7CisJCWNsa19zZXRfcGFyZW50KGNsa1tJTVg2UURMX0NMS19HUFUzRF9DT1JFX1NFTF0sCisJCQkgICAgICAgY2xrW0lNWDZRRExfQ0xLX01NRENfQ0gwX0FYSV0pOworCQljbGtfc2V0X3BhcmVudChjbGtbSU1YNlFETF9DTEtfR1BVM0RfU0hBREVSX1NFTF0sCisJCQkgICAgICAgY2xrW0lNWDZRRExfQ0xLX1BMTDJfUEZEMV81OTRNXSk7CisJCWNsa19zZXRfcGFyZW50KGNsa1tJTVg2UURMX0NMS19HUFUyRF9DT1JFX1NFTF0sCisJCQkgICAgICAgY2xrW0lNWDZRRExfQ0xLX1BMTDNfVVNCX09UR10pOworCX0KKwogCWlteF9yZWdpc3Rlcl91YXJ0X2Nsb2Nrcyh1YXJ0X2Nsa3MpOwogfQogQ0xLX09GX0RFQ0xBUkUoaW14NnEsICJmc2wsaW14NnEtY2NtIiwgaW14NnFfY2xvY2tzX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg3ZC5jIGIvZHJpdmVycy9jbGsvaW14L2Nsay1pbXg3ZC5jCmluZGV4IDZlZDRmOGYuLmU3YzczNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xrL2lteC9jbGstaW14N2QuYworKysgYi9kcml2ZXJzL2Nsay9pbXgvY2xrLWlteDdkLmMKQEAgLTIyLDQzICsyMiw2MyBAQAogCiAjaW5jbHVkZSAiY2xrLmgiCiAKK3N0YXRpYyB1MzIgc2hhcmVfY291bnRfc2FpMTsKK3N0YXRpYyB1MzIgc2hhcmVfY291bnRfc2FpMjsKK3N0YXRpYyB1MzIgc2hhcmVfY291bnRfc2FpMzsKKworc3RhdGljIHN0cnVjdCBjbGtfZGl2X3RhYmxlIHRlc3RfZGl2X3RhYmxlW10gPSB7CisJeyAudmFsID0gMywgLmRpdiA9IDEsIH0sCisJeyAudmFsID0gMiwgLmRpdiA9IDEsIH0sCisJeyAudmFsID0gMSwgLmRpdiA9IDIsIH0sCisJeyAudmFsID0gMCwgLmRpdiA9IDQsIH0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGNsa19kaXZfdGFibGUgcG9zdF9kaXZfdGFibGVbXSA9IHsKKwl7IC52YWwgPSAzLCAuZGl2ID0gNCwgfSwKKwl7IC52YWwgPSAyLCAuZGl2ID0gMSwgfSwKKwl7IC52YWwgPSAxLCAuZGl2ID0gMiwgfSwKKwl7IC52YWwgPSAwLCAuZGl2ID0gMSwgfSwKKwl7IH0KK307CisKIHN0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzW0lNWDdEX0NMS19FTkRdOwogc3RhdGljIGNvbnN0IGNoYXIgKmFybV9hN19zZWxbXSA9IHsgIm9zYyIsICJwbGxfYXJtX21haW5fY2xrIiwKIAkicGxsX2VuZXRfNTAwbV9jbGsiLCAicGxsX2RyYW1fbWFpbl9jbGsiLAotCSJwbGxfc3lzX21haW5fY2xrIiwgInBsbF9zeXNfcGZkMF8zOTJtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fY2xrIiwgInBsbF9zeXNfcGZkMF8zOTJtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLAogCSJwbGxfdXNiX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmFybV9tNF9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX21haW5fMjQwbV9jbGsiLAogCSJwbGxfZW5ldF8yNTBtX2NsayIsICJwbGxfc3lzX3BmZDJfMjcwbV9jbGsiLAotCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKKwkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF92aWRlb19tYWluX2NsayIsCiAJInBsbF91c2JfbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqYXJtX20wX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsCiAJInBsbF9lbmV0XzEyNW1fY2xrIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCi0JInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3VzYl9tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpheGlfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQxXzMzMm1fY2xrIiwKIAkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX2VuZXRfMjUwbV9jbGsiLCAicGxsX3N5c19wZmQ1X2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3N5c19wZmQ3X2NsayIsIH07CisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3N5c19wZmQ3X2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkaXNwX2F4aV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDFfMzMybV9jbGsiLAogCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfZW5ldF8yNTBtX2NsayIsICJwbGxfc3lzX3BmZDZfY2xrIiwKLQkicGxsX3N5c19wZmQ3X2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKKwkicGxsX3N5c19wZmQ3X2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVuZXRfYXhpX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8yNzBtX2NsayIsCiAJInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9lbmV0XzI1MG1fY2xrIiwKLQkicGxsX3N5c19tYWluXzI0MG1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fMjQwbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF92aWRlb19tYWluX2NsayIsCiAJInBsbF9zeXNfcGZkNF9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqbmFuZF91c2RoY19idXNfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzI3MG1fY2xrIiwKIAkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3N5c19tYWluXzI0MG1fY2xrIiwKIAkicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwgInBsbF9zeXNfcGZkNl9jbGsiLCAicGxsX2VuZXRfMjUwbV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCB9OworCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWhiX2NoYW5uZWxfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzI3MG1fY2xrIiwKIAkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwKLQkicGxsX2VuZXRfMTI1bV9jbGsiLCAicGxsX3VzYl9tYWluX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCSJwbGxfZW5ldF8xMjVtX2NsayIsICJwbGxfdXNiX21haW5fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsCiAJInBsbF92aWRlb19tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpkcmFtX3BoeW1fc2VsW10gPSB7ICJwbGxfZHJhbV9tYWluX2NsayIsCkBAIC02OSwxMyArODksMTMgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRyYW1fcGh5bV9hbHRfc2VsW10gPSB7ICJvc2MiLCAicGxsX2RyYW1fNTMzbV9jbGsiLAogCSJwbGxfc3lzX21haW5fY2xrIiwgInBsbF9lbmV0XzUwMG1fY2xrIiwKLQkicGxsX3VzYl9tYWluX2NsayIsICJwbGxfc3lzX3BmZDdfY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsCisJInBsbF91c2JfbWFpbl9jbGsiLCAicGxsX3N5c19wZmQ3X2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLAogCSJwbGxfdmlkZW9fbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZHJhbV9hbHRfc2VsW10gPSB7ICJvc2MiLCAicGxsX2RyYW1fNTMzbV9jbGsiLAogCSJwbGxfc3lzX21haW5fY2xrIiwgInBsbF9lbmV0XzUwMG1fY2xrIiwKIAkicGxsX2VuZXRfMjUwbV9jbGsiLCAicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF9zeXNfcGZkMl8yNzBtX2NsayIsIH07CisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfc3lzX3BmZDJfMjcwbV9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqdXNiX2hzaWNfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19tYWluX2NsayIsCiAJInBsbF91c2JfbWFpbl9jbGsiLCAicGxsX3N5c19wZmQzX2NsayIsICJwbGxfc3lzX3BmZDRfY2xrIiwKQEAgLTEwMSw1MyArMTIxLDUzIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICptaXBpX2RzaV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDVfY2xrIiwKIAkicGxsX3N5c19wZmQzX2NsayIsICJwbGxfc3lzX21haW5fY2xrIiwgInBsbF9zeXNfcGZkMF8xOTZtX2NsayIsCi0JInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLCB9OworCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKm1pcGlfY3NpX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkNF9jbGsiLAogCSJwbGxfc3lzX3BmZDNfY2xrIiwgInBsbF9zeXNfbWFpbl9jbGsiLCAicGxsX3N5c19wZmQwXzE5Nm1fY2xrIiwKLQkicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsIH07CisJInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqbWlwaV9kcGh5X3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsCiAJInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9zeXNfcGZkNV9jbGsiLCAicmVmXzFtX2NsayIsICJleHRfY2xrXzIiLAogCSJwbGxfdmlkZW9fbWFpbl9jbGsiLCAiZXh0X2Nsa18zIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNhaTFfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAogCSJwbGxfc3lzX3BmZDRfY2xrIiwgInBsbF9lbmV0XzEyNW1fY2xrIiwgImV4dF9jbGtfMiIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzYWkyX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3N5c19wZmQ0X2NsayIsICJwbGxfZW5ldF8xMjVtX2NsayIsICJleHRfY2xrXzIiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc2FpM19zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKKwkicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCiAJInBsbF9zeXNfcGZkNF9jbGsiLCAicGxsX2VuZXRfMTI1bV9jbGsiLCAiZXh0X2Nsa18zIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNwZGlmX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX2RyYW1fNTMzbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3N5c19wZmQ0X2NsayIsICJwbGxfZW5ldF8xMjVtX2NsayIsICJleHRfM19jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZW5ldDFfcmVmX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEyNW1fY2xrIiwKIAkicGxsX2VuZXRfNTBtX2NsayIsICJwbGxfZW5ldF8yNW1fY2xrIiwKLQkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF92aWRlb19tYWluX2NsayIsCiAJImV4dF9jbGtfNCIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICplbmV0MV90aW1lX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgImV4dF9jbGtfMSIsICJleHRfY2xrXzIiLCAiZXh0X2Nsa18zIiwKKwkicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgImV4dF9jbGtfMSIsICJleHRfY2xrXzIiLCAiZXh0X2Nsa18zIiwKIAkiZXh0X2Nsa180IiwgInBsbF92aWRlb19tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICplbmV0Ml9yZWZfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTI1bV9jbGsiLAogCSJwbGxfZW5ldF81MG1fY2xrIiwgInBsbF9lbmV0XzI1bV9jbGsiLAotCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCisJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkiZXh0X2Nsa180IiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVuZXQyX3RpbWVfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAiZXh0X2Nsa18xIiwgImV4dF9jbGtfMiIsICJleHRfY2xrXzMiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAiZXh0X2Nsa18xIiwgImV4dF9jbGtfMiIsICJleHRfY2xrXzMiLAogCSJleHRfY2xrXzQiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmVuZXRfcGh5X3JlZl9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8yNW1fY2xrIiwKIAkicGxsX2VuZXRfNTBtX2NsayIsICJwbGxfZW5ldF8xMjVtX2NsayIsCi0JInBsbF9kcmFtXzUzM21fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfZHJhbV81MzNtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3N5c19wZmQzX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICplaW1fc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwKQEAgLTE4OCwyMiArMjA4LDIyIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICppMmMxX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsCiAJInBsbF9lbmV0XzUwbV9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF91c2JfbWFpbl9jbGsiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF91c2JfbWFpbl9jbGsiLAogCSJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqaTJjMl9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX21haW5fMTIwbV9jbGsiLAogCSJwbGxfZW5ldF81MG1fY2xrIiwgInBsbF9kcmFtXzUzM21fY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfdXNiX21haW5fY2xrIiwKKwkicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfdXNiX21haW5fY2xrIiwKIAkicGxsX3N5c19wZmQyXzEzNW1fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmkyYzNfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19tYWluXzEyMG1fY2xrIiwKIAkicGxsX2VuZXRfNTBtX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsCi0JInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3VzYl9tYWluX2NsayIsCisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3VzYl9tYWluX2NsayIsCiAJInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICppMmM0X3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsCiAJInBsbF9lbmV0XzUwbV9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF91c2JfbWFpbl9jbGsiLAorCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgInBsbF91c2JfbWFpbl9jbGsiLAogCSJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqdWFydDFfc2VsW10gPSB7ICJvc2MiLCAicGxsX3N5c19tYWluXzI0MG1fY2xrIiwKQEAgLTI2MiwzMiArMjgyLDMyIEBACiAJInBsbF91c2JfbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqcHdtMV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCi0JInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsCisJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsCiAJImV4dF9jbGtfMSIsICJyZWZfMW1fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpwd20yX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKLQkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwKKwkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwKIAkiZXh0X2Nsa18xIiwgInJlZl8xbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnB3bTNfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAotCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLAogCSJleHRfY2xrXzIiLCAicmVmXzFtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqcHdtNF9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCi0JInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsCisJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsCiAJImV4dF9jbGtfMiIsICJyZWZfMW1fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpmbGV4dGltZXIxX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKLQkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwKKwkicGxsX3N5c19tYWluXzEyMG1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwKIAkiZXh0X2Nsa18zIiwgInJlZl8xbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmZsZXh0aW1lcjJfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAotCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLAogCSJleHRfY2xrXzMiLCAicmVmXzFtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc2ltMV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLAogCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLAotCSJwbGxfdXNiX21haW5fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfZW5ldF8xMjVtX2NsayIsCisJInBsbF91c2JfbWFpbl9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgInBsbF9lbmV0XzEyNW1fY2xrIiwKIAkicGxsX3N5c19wZmQ3X2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzaW0yX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCkBAIC0yOTcsMTkgKzMxNywxOSBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqZ3B0MV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCiAJInBsbF9zeXNfcGZkMF8zOTJtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCi0JInJlZl8xbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgImV4dF9jbGtfMSIsIH07CisJInJlZl8xbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgImV4dF9jbGtfMSIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpncHQyX3NlbFtdID0geyAib3NjIiwgInBsbF9lbmV0XzEwMG1fY2xrIiwKIAkicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwgInBsbF9lbmV0XzQwbV9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKLQkicmVmXzFtX2NsayIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLCAiZXh0X2Nsa18yIiwgfTsKKwkicmVmXzFtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAiZXh0X2Nsa18yIiwgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmdwdDNfc2VsW10gPSB7ICJvc2MiLCAicGxsX2VuZXRfMTAwbV9jbGsiLAogCSJwbGxfc3lzX3BmZDBfMzkybV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAotCSJyZWZfMW1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJleHRfY2xrXzMiLCB9OworCSJyZWZfMW1fY2xrIiwgInBsbF9hdWRpb19wb3N0X2RpdiIsICJleHRfY2xrXzMiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZ3B0NF9zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF8xMDBtX2NsayIsCiAJInBsbF9zeXNfcGZkMF8zOTJtX2NsayIsICJwbGxfZW5ldF80MG1fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsCi0JInJlZl8xbV9jbGsiLCAicGxsX2F1ZGlvX21haW5fY2xrIiwgImV4dF9jbGtfNCIsIH07CisJInJlZl8xbV9jbGsiLCAicGxsX2F1ZGlvX3Bvc3RfZGl2IiwgImV4dF9jbGtfNCIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICp0cmFjZV9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX3BmZDJfMTM1bV9jbGsiLAogCSJwbGxfc3lzX21haW5fMTIwbV9jbGsiLCAicGxsX2RyYW1fNTMzbV9jbGsiLApAQCAtMzIzLDEyICszNDMsMTIgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKmNzaV9tY2xrX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCiAJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsCi0JInBsbF9lbmV0XzEyNW1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfZW5ldF8xMjVtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3VzYl9tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICphdWRpb19tY2xrX3NlbFtdID0geyAib3NjIiwgInBsbF9zeXNfcGZkMl8xMzVtX2NsayIsCiAJInBsbF9zeXNfbWFpbl8xMjBtX2NsayIsICJwbGxfZHJhbV81MzNtX2NsayIsCi0JInBsbF9lbmV0XzEyNW1fY2xrIiwgInBsbF9hdWRpb19tYWluX2NsayIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLAorCSJwbGxfZW5ldF8xMjVtX2NsayIsICJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwKIAkicGxsX3VzYl9tYWluX2NsayIsIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICp3cmNsa19zZWxbXSA9IHsgIm9zYyIsICJwbGxfZW5ldF80MG1fY2xrIiwKQEAgLTM0MiwxMyArMzYyLDEzIEBACiAKIHN0YXRpYyBjb25zdCBjaGFyICpjbGtvMl9zZWxbXSA9IHsgIm9zYyIsICJwbGxfc3lzX21haW5fMjQwbV9jbGsiLAogCSJwbGxfc3lzX3BmZDBfMzkybV9jbGsiLCAicGxsX3N5c19wZmQxXzE2Nm1fY2xrIiwgInBsbF9zeXNfcGZkNF9jbGsiLAotCSJwbGxfYXVkaW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgImNraWwiLCB9OworCSJwbGxfYXVkaW9fcG9zdF9kaXYiLCAicGxsX3ZpZGVvX21haW5fY2xrIiwgImNraWwiLCB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqbHZkczFfc2VsW10gPSB7ICJwbGxfYXJtX21haW5fY2xrIiwKIAkicGxsX3N5c19tYWluX2NsayIsICJwbGxfc3lzX3BmZDBfMzkybV9jbGsiLCAicGxsX3N5c19wZmQxXzMzMm1fY2xrIiwKIAkicGxsX3N5c19wZmQyXzI3MG1fY2xrIiwgInBsbF9zeXNfcGZkM19jbGsiLCAicGxsX3N5c19wZmQ0X2NsayIsCiAJInBsbF9zeXNfcGZkNV9jbGsiLCAicGxsX3N5c19wZmQ2X2NsayIsICJwbGxfc3lzX3BmZDdfY2xrIiwKLQkicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF92aWRlb19tYWluX2NsayIsICJwbGxfZW5ldF81MDBtX2NsayIsCisJInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX2VuZXRfNTAwbV9jbGsiLAogCSJwbGxfZW5ldF8yNTBtX2NsayIsICJwbGxfZW5ldF8xMjVtX2NsayIsICJwbGxfZW5ldF8xMDBtX2NsayIsCiAJInBsbF9lbmV0XzUwbV9jbGsiLCAicGxsX2VuZXRfNDBtX2NsayIsICJwbGxfZW5ldF8yNW1fY2xrIiwKIAkicGxsX2RyYW1fbWFpbl9jbGsiLCB9OwpAQCAtNDMwLDYgKzQ1MCwxMSBAQAogCWNsa3NbSU1YN0RfUExMX0FVRElPX01BSU5fQ0xLXSA9IGlteF9jbGtfZ2F0ZSgicGxsX2F1ZGlvX21haW5fY2xrIiwgInBsbF9hdWRpb19tYWluX2J5cGFzcyIsIGJhc2UgKyAweGYwLCAxMyk7CiAJY2xrc1tJTVg3RF9QTExfVklERU9fTUFJTl9DTEtdID0gaW14X2Nsa19nYXRlKCJwbGxfdmlkZW9fbWFpbl9jbGsiLCAicGxsX3ZpZGVvX21haW5fYnlwYXNzIiwgYmFzZSArIDB4MTMwLCAxMyk7CiAKKwljbGtzW0lNWDdEX1BMTF9BVURJT19URVNUX0RJVl0gID0gY2xrX3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgInBsbF9hdWRpb190ZXN0X2RpdiIsICJwbGxfYXVkaW9fbWFpbl9jbGsiLAorCQkJCUNMS19TRVRfUkFURV9QQVJFTlQgfCBDTEtfU0VUX1JBVEVfR0FURSwgYmFzZSArIDB4ZjAsIDE5LCAyLCAwLCB0ZXN0X2Rpdl90YWJsZSwgJmlteF9jY21fbG9jayk7CisJY2xrc1tJTVg3RF9QTExfQVVESU9fUE9TVF9ESVZdID0gY2xrX3JlZ2lzdGVyX2RpdmlkZXJfdGFibGUoTlVMTCwgInBsbF9hdWRpb19wb3N0X2RpdiIsICJwbGxfYXVkaW9fdGVzdF9kaXYiLAorCQkJCUNMS19TRVRfUkFURV9QQVJFTlQgfCBDTEtfU0VUX1JBVEVfR0FURSwgYmFzZSArIDB4ZjAsIDIyLCAyLCAwLCBwb3N0X2Rpdl90YWJsZSwgJmlteF9jY21fbG9jayk7CisKIAljbGtzW0lNWDdEX1BMTF9TWVNfUEZEMF8zOTJNX0NMS10gPSBpbXhfY2xrX3BmZCgicGxsX3N5c19wZmQwXzM5Mm1fY2xrIiwgInBsbF9zeXNfbWFpbl9jbGsiLCBiYXNlICsgMHhjMCwgMCk7CiAJY2xrc1tJTVg3RF9QTExfU1lTX1BGRDFfMzMyTV9DTEtdID0gaW14X2Nsa19wZmQoInBsbF9zeXNfcGZkMV8zMzJtX2NsayIsICJwbGxfc3lzX21haW5fY2xrIiwgYmFzZSArIDB4YzAsIDEpOwogCWNsa3NbSU1YN0RfUExMX1NZU19QRkQyXzI3ME1fQ0xLXSA9IGlteF9jbGtfcGZkKCJwbGxfc3lzX3BmZDJfMjcwbV9jbGsiLCAicGxsX3N5c19tYWluX2NsayIsIGJhc2UgKyAweGMwLCAyKTsKQEAgLTc3OSw2ICs4MDQsNyBAQAogCWNsa3NbSU1YN0RfRFJBTV9QSFlNX0FMVF9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJkcmFtX3BoeW1fYWx0X3Jvb3RfY2xrIiwgImRyYW1fcGh5bV9hbHRfcG9zdF9kaXYiLCBiYXNlICsgMHg0MTMwLCAwKTsKIAljbGtzW0lNWDdEX0RSQU1fQUxUX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoImRyYW1fYWx0X3Jvb3RfY2xrIiwgImRyYW1fYWx0X3Bvc3RfZGl2IiwgYmFzZSArIDB4NDEzMCwgMCk7CiAJY2xrc1tJTVg3RF9VU0JfSFNJQ19ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJ1c2JfaHNpY19yb290X2NsayIsICJ1c2JfaHNpY19wb3N0X2RpdiIsIGJhc2UgKyAweDQ0MjAsIDApOworCWNsa3NbSU1YN0RfU0RNQV9DT1JFX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJzZG1hX3Jvb3RfY2xrIiwgImFoYl9yb290X2NsayIsIGJhc2UgKyAweDQ0ODAsIDApOwogCWNsa3NbSU1YN0RfUENJRV9DVFJMX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoInBjaWVfY3RybF9yb290X2NsayIsICJwY2llX2N0cmxfcG9zdF9kaXYiLCBiYXNlICsgMHg0NjAwLCAwKTsKIAljbGtzW0lNWDdEX1BDSUVfUEhZX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoInBjaWVfcGh5X3Jvb3RfY2xrIiwgInBjaWVfcGh5X3Bvc3RfZGl2IiwgYmFzZSArIDB4NDYwMCwgMCk7CiAJY2xrc1tJTVg3RF9FUERDX1BJWEVMX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoImVwZGNfcGl4ZWxfcm9vdF9jbGsiLCAiZXBkY19waXhlbF9wb3N0X2RpdiIsIGJhc2UgKyAweDQ0YTAsIDApOwpAQCAtNzg2LDkgKzgxMiwxMiBAQAogCWNsa3NbSU1YN0RfTUlQSV9EU0lfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgibWlwaV9kc2lfcm9vdF9jbGsiLCAibWlwaV9kc2lfcG9zdF9kaXYiLCBiYXNlICsgMHg0NjUwLCAwKTsKIAljbGtzW0lNWDdEX01JUElfQ1NJX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoIm1pcGlfY3NpX3Jvb3RfY2xrIiwgIm1pcGlfY3NpX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDY0MCwgMCk7CiAJY2xrc1tJTVg3RF9NSVBJX0RQSFlfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgibWlwaV9kcGh5X3Jvb3RfY2xrIiwgIm1pcGlfZHBoeV9wb3N0X2RpdiIsIGJhc2UgKyAweDQ2NjAsIDApOwotCWNsa3NbSU1YN0RfU0FJMV9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJzYWkxX3Jvb3RfY2xrIiwgInNhaTFfcG9zdF9kaXYiLCBiYXNlICsgMHg0OGMwLCAwKTsKLQljbGtzW0lNWDdEX1NBSTJfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgic2FpMl9yb290X2NsayIsICJzYWkyX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDhkMCwgMCk7Ci0JY2xrc1tJTVg3RF9TQUkzX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoInNhaTNfcm9vdF9jbGsiLCAic2FpM19wb3N0X2RpdiIsIGJhc2UgKyAweDQ4ZTAsIDApOworCWNsa3NbSU1YN0RfU0FJMV9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGUyX3NoYXJlZDIoInNhaTFfcm9vdF9jbGsiLCAic2FpMV9wb3N0X2RpdiIsIGJhc2UgKyAweDQ4YzAsIDAsICZzaGFyZV9jb3VudF9zYWkxKTsKKwljbGtzW0lNWDdEX1NBSTFfSVBHX0NMS10gID0gaW14X2Nsa19nYXRlMl9zaGFyZWQyKCJzYWkxX2lwZ19jbGsiLCAgImlwZ19yb290X2NsayIsICBiYXNlICsgMHg0OGMwLCAwLCAmc2hhcmVfY291bnRfc2FpMSk7CisJY2xrc1tJTVg3RF9TQUkyX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTJfc2hhcmVkMigic2FpMl9yb290X2NsayIsICJzYWkyX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDhkMCwgMCwgJnNoYXJlX2NvdW50X3NhaTIpOworCWNsa3NbSU1YN0RfU0FJMl9JUEdfQ0xLXSAgPSBpbXhfY2xrX2dhdGUyX3NoYXJlZDIoInNhaTJfaXBnX2NsayIsICAiaXBnX3Jvb3RfY2xrIiwgIGJhc2UgKyAweDQ4ZDAsIDAsICZzaGFyZV9jb3VudF9zYWkyKTsKKwljbGtzW0lNWDdEX1NBSTNfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlMl9zaGFyZWQyKCJzYWkzX3Jvb3RfY2xrIiwgInNhaTNfcG9zdF9kaXYiLCBiYXNlICsgMHg0OGUwLCAwLCAmc2hhcmVfY291bnRfc2FpMyk7CisJY2xrc1tJTVg3RF9TQUkzX0lQR19DTEtdICA9IGlteF9jbGtfZ2F0ZTJfc2hhcmVkMigic2FpM19pcGdfY2xrIiwgICJpcGdfcm9vdF9jbGsiLCAgYmFzZSArIDB4NDhlMCwgMCwgJnNoYXJlX2NvdW50X3NhaTMpOwogCWNsa3NbSU1YN0RfU1BESUZfUk9PVF9DTEtdID0gaW14X2Nsa19nYXRlNCgic3BkaWZfcm9vdF9jbGsiLCAic3BkaWZfcG9zdF9kaXYiLCBiYXNlICsgMHg0NGQwLCAwKTsKIAljbGtzW0lNWDdEX0VORVQxX1JFRl9ST09UX0NMS10gPSBpbXhfY2xrX2dhdGU0KCJlbmV0MV9yZWZfcm9vdF9jbGsiLCAiZW5ldDFfcmVmX3Bvc3RfZGl2IiwgYmFzZSArIDB4NDRlMCwgMCk7CiAJY2xrc1tJTVg3RF9FTkVUMV9USU1FX1JPT1RfQ0xLXSA9IGlteF9jbGtfZ2F0ZTQoImVuZXQxX3RpbWVfcm9vdF9jbGsiLCAiZW5ldDFfdGltZV9wb3N0X2RpdiIsIGJhc2UgKyAweDQ0ZjAsIDApOwpAQCAtODYwLDggKzg4OSw2IEBACiAJLyogdXNlIG9sZCBncHQgY2xrIHNldHRpbmcsIGdwdDEgcm9vdCBjbGsgbXVzdCBiZSB0d2ljZSBhcyBncHQgY291bnRlciBmcmVxICovCiAJY2xrX3NldF9wYXJlbnQoY2xrc1tJTVg3RF9HUFQxX1JPT1RfU1JDXSwgY2xrc1tJTVg3RF9PU0NfMjRNX0NMS10pOwogCi0JY2xrX3NldF9wYXJlbnQoY2xrc1tJTVg3RF9FTkVUX0FYSV9ST09UX1NSQ10sIGNsa3NbSU1YN0RfUExMX0VORVRfTUFJTl8yNTBNX0NMS10pOwotCiAJLyogc2V0IHVhcnQgbW9kdWxlIGNsb2NrJ3MgcGFyZW50IGNsb2NrIHNvdXJjZSB0aGF0IG11c3QgYmUgZ3JlYXQgdGhlbiA4ME1IeiAqLwogCWNsa19zZXRfcGFyZW50KGNsa3NbSU1YN0RfVUFSVDFfUk9PVF9TUkNdLCBjbGtzW0lNWDdEX09TQ18yNE1fQ0xLXSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2lteC9jbGsuaCBiL2RyaXZlcnMvY2xrL2lteC9jbGsuaAppbmRleCBhODFjMDM4Li4zNzk5ZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsay9pbXgvY2xrLmgKKysrIGIvZHJpdmVycy9jbGsvaW14L2Nsay5oCkBAIC0xMzQsNiArMTM0LDE1IEBACiAJCQlzaGlmdCwgMHgzLCAwLCAmaW14X2NjbV9sb2NrLCBzaGFyZV9jb3VudCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNsayAqaW14X2Nsa19nYXRlMl9zaGFyZWQyKGNvbnN0IGNoYXIgKm5hbWUsCisJCWNvbnN0IGNoYXIgKnBhcmVudCwgdm9pZCBfX2lvbWVtICpyZWcsIHU4IHNoaWZ0LAorCQl1bnNpZ25lZCBpbnQgKnNoYXJlX2NvdW50KQoreworCXJldHVybiBjbGtfcmVnaXN0ZXJfZ2F0ZTIoTlVMTCwgbmFtZSwgcGFyZW50LCBDTEtfU0VUX1JBVEVfUEFSRU5UIHwKKwkJCQkgIENMS19PUFNfUEFSRU5UX0VOQUJMRSwgcmVnLCBzaGlmdCwgMHgzLCAwLAorCQkJCSAgJmlteF9jY21fbG9jaywgc2hhcmVfY291bnQpOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjbGsgKmlteF9jbGtfZ2F0ZTJfY2dyKGNvbnN0IGNoYXIgKm5hbWUsCiAJCWNvbnN0IGNoYXIgKnBhcmVudCwgdm9pZCBfX2lvbWVtICpyZWcsIHU4IHNoaWZ0LCB1OCBjZ3JfdmFsKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbGsvbG9vbmdzb24xL01ha2VmaWxlIGIvZHJpdmVycy9jbGsvbG9vbmdzb24xL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjZhMTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsay9sb29uZ3NvbjEvTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACitvYmoteQkJCQkrPSBjbGsubworb2JqLSQoQ09ORklHX0xPT05HU09OMV9MUzFCKQkrPSBjbGstbG9vbmdzb24xYi5vCitvYmotJChDT05GSUdfTE9PTkdTT04xX0xTMUMpCSs9IGNsay1sb29uZ3NvbjFjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xrL2xvb25nc29uMS9jbGstbG9vbmdzb24xYi5jIGIvZHJpdmVycy9jbGsvbG9vbmdzb24xL2Nsay1sb29uZ3NvbjFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM2YTk3ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2xrL2xvb25nc29uMS9jbGstbG9vbmdzb24xYi5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYgWmhhbmcsIEtlZ3VhbmcgPGtlZ3VhbmcuemhhbmdAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+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+bmFtZSA9ICJhcmNoX21lbV90aW1lciI7CkBAIC01MTUsMTUgKzYwMSwxOSBAQAogCQkJYXJjaF90aW1lcl9yZWFkX2NvdW50ZXIgPSBhcmNoX2NvdW50ZXJfZ2V0X2NudHZjdDsKIAkJZWxzZQogCQkJYXJjaF90aW1lcl9yZWFkX2NvdW50ZXIgPSBhcmNoX2NvdW50ZXJfZ2V0X2NudHBjdDsKKworCQljbG9ja3NvdXJjZV9jb3VudGVyLmFyY2hkYXRhLnZkc29fZGlyZWN0ID0gdHJ1ZTsKKworI2lmZGVmIENPTkZJR19GU0xfRVJSQVRVTV9BMDA4NTg1CisJCS8qCisJCSAqIERvbid0IHVzZSB0aGUgdmRzbyBmYXN0cGF0aCBpZiBlcnJhdGEgcmVxdWlyZSB1c2luZworCQkgKiB0aGUgb3V0LW9mLWxpbmUgY291bnRlciBhY2Nlc3Nvci4KKwkJICovCisJCWlmIChzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZhcmNoX3RpbWVyX3JlYWRfb29sX2VuYWJsZWQpKQorCQkJY2xvY2tzb3VyY2VfY291bnRlci5hcmNoZGF0YS52ZHNvX2RpcmVjdCA9IGZhbHNlOworI2VuZGlmCiAJfSBlbHNlIHsKIAkJYXJjaF90aW1lcl9yZWFkX2NvdW50ZXIgPSBhcmNoX2NvdW50ZXJfZ2V0X2NudHZjdF9tZW07Ci0KLQkJLyogSWYgdGhlIGNsb2Nrc291cmNlIG5hbWUgaXMgImFyY2hfc3lzX2NvdW50ZXIiIHRoZQotCQkgKiBWRFNPIHdpbGwgYXR0ZW1wdCB0byByZWFkIHRoZSBDUDE1LWJhc2VkIGNvdW50ZXIuCi0JCSAqIEVuc3VyZSB0aGlzIGRvZXMgbm90IGhhcHBlbiB3aGVuIENQMTUtYmFzZWQKLQkJICogY291bnRlciBpcyBub3QgYXZhaWxhYmxlLgotCQkgKi8KLQkJY2xvY2tzb3VyY2VfY291bnRlci5uYW1lID0gImFyY2hfbWVtX2NvdW50ZXIiOwogCX0KIAogCXN0YXJ0X2NvdW50ID0gYXJjaF90aW1lcl9yZWFkX2NvdW50ZXIoKTsKQEAgLTgwMCw2ICs4OTAsMTUgQEAKIAogCWFyY2hfdGltZXJfYzNzdG9wID0gIW9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImFsd2F5cy1vbiIpOwogCisjaWZkZWYgQ09ORklHX0ZTTF9FUlJBVFVNX0EwMDg1ODUKKwlpZiAoZnNsX2EwMDg1ODVfZW5hYmxlIDwgMCkKKwkJZnNsX2EwMDg1ODVfZW5hYmxlID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiZnNsLGVycmF0dW0tYTAwODU4NSIpOworCWlmIChmc2xfYTAwODU4NV9lbmFibGUpIHsKKwkJc3RhdGljX2JyYW5jaF9lbmFibGUoJmFyY2hfdGltZXJfcmVhZF9vb2xfZW5hYmxlZCk7CisJCXByX2luZm8oIkVuYWJsaW5nIHdvcmthcm91bmQgZm9yIEZTTCBlcnJhdHVtIEEtMDA4NTg1XG4iKTsKKwl9CisjZW5kaWYKKwogCS8qCiAJICogSWYgd2UgY2Fubm90IHJlbHkgb24gZmlybXdhcmUgaW5pdGlhbGl6aW5nIHRoZSB0aW1lciByZWdpc3RlcnMgdGhlbgogCSAqIHdlIHNob3VsZCB1c2UgdGhlIHBoeXNpY2FsIHRpbWVycyBpbnN0ZWFkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9taXBzLWdpYy10aW1lci5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9taXBzLWdpYy10aW1lci5jCmluZGV4IGI0YjNhYjUuLjdhOTYwY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvbWlwcy1naWMtdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL21pcHMtZ2ljLXRpbWVyLmMKQEAgLTEwOSwxMiArMTA5LDE1IEBACiB7CiAJaW50IHJldDsKIAotCWlmICghY3B1X2hhc19jb3VudGVyIHx8ICFnaWNfZnJlcXVlbmN5KQorCWlmICghZ2ljX2ZyZXF1ZW5jeSkKIAkJcmV0dXJuIC1FTlhJTzsKIAogCXJldCA9IHNldHVwX3BlcmNwdV9pcnEoZ2ljX3RpbWVyX2lycSwgJmdpY19jb21wYXJlX2lycWFjdGlvbik7Ci0JaWYgKHJldCA8IDApCisJaWYgKHJldCA8IDApIHsKKwkJcHJfZXJyKCJHSUMgdGltZXIgSVJRICVkIHNldHVwIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICBnaWNfdGltZXJfaXJxLCByZXQpOwogCQlyZXR1cm4gcmV0OworCX0KIAogCWNwdWhwX3NldHVwX3N0YXRlKENQVUhQX0FQX01JUFNfR0lDX1RJTUVSX1NUQVJUSU5HLAogCQkJICAiQVBfTUlQU19HSUNfVElNRVJfU1RBUlRJTkciLCBnaWNfc3RhcnRpbmdfY3B1LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9tb3hhcnRfdGltZXIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvbW94YXJ0X3RpbWVyLmMKaW5kZXggODQxNDU0NC4uMmE4ZjQ3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9tb3hhcnRfdGltZXIuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL21veGFydF90aW1lci5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2RlZmluZSBUSU1FUjFfQkFTRQkJMHgwMAogI2RlZmluZSBUSU1FUjJfQkFTRQkJMHgxMApAQCAtMzYsNzUgKzM3LDEwOSBAQAogI2RlZmluZSBUSU1FUl9JTlRSX01BU0sJCTB4MzgKIAogLyoKLSAqIFRJTUVSX0NSIGZsYWdzOgorICogTW94YXJ0IFRJTUVSX0NSIGZsYWdzOgogICoKLSAqIFRJTUVSRUdfQ1JfKl9DTE9DSwkwOiBQQ0xLLCAxOiBFWFQxQ0xLCi0gKiBUSU1FUkVHX0NSXypfSU5UCW92ZXJmbG93IGludGVycnVwdCBlbmFibGUgYml0CisgKiBNT1hBUlRfQ1JfKl9DTE9DSwkwOiBQQ0xLLCAxOiBFWFQxQ0xLCisgKiBNT1hBUlRfQ1JfKl9JTlQJb3ZlcmZsb3cgaW50ZXJydXB0IGVuYWJsZSBiaXQKICAqLwotI2RlZmluZSBUSU1FUkVHX0NSXzFfRU5BQkxFCUJJVCgwKQotI2RlZmluZSBUSU1FUkVHX0NSXzFfQ0xPQ0sJQklUKDEpCi0jZGVmaW5lIFRJTUVSRUdfQ1JfMV9JTlQJQklUKDIpCi0jZGVmaW5lIFRJTUVSRUdfQ1JfMl9FTkFCTEUJQklUKDMpCi0jZGVmaW5lIFRJTUVSRUdfQ1JfMl9DTE9DSwlCSVQoNCkKLSNkZWZpbmUgVElNRVJFR19DUl8yX0lOVAlCSVQoNSkKLSNkZWZpbmUgVElNRVJFR19DUl8zX0VOQUJMRQlCSVQoNikKLSNkZWZpbmUgVElNRVJFR19DUl8zX0NMT0NLCUJJVCg3KQotI2RlZmluZSBUSU1FUkVHX0NSXzNfSU5UCUJJVCg4KQotI2RlZmluZSBUSU1FUkVHX0NSX0NPVU5UX1VQCUJJVCg5KQorI2RlZmluZSBNT1hBUlRfQ1JfMV9FTkFCTEUJQklUKDApCisjZGVmaW5lIE1PWEFSVF9DUl8xX0NMT0NLCUJJVCgxKQorI2RlZmluZSBNT1hBUlRfQ1JfMV9JTlQJQklUKDIpCisjZGVmaW5lIE1PWEFSVF9DUl8yX0VOQUJMRQlCSVQoMykKKyNkZWZpbmUgTU9YQVJUX0NSXzJfQ0xPQ0sJQklUKDQpCisjZGVmaW5lIE1PWEFSVF9DUl8yX0lOVAlCSVQoNSkKKyNkZWZpbmUgTU9YQVJUX0NSXzNfRU5BQkxFCUJJVCg2KQorI2RlZmluZSBNT1hBUlRfQ1JfM19DTE9DSwlCSVQoNykKKyNkZWZpbmUgTU9YQVJUX0NSXzNfSU5UCUJJVCg4KQorI2RlZmluZSBNT1hBUlRfQ1JfQ09VTlRfVVAJQklUKDkpCiAKLSNkZWZpbmUgVElNRVIxX0VOQUJMRQkJKFRJTUVSRUdfQ1JfMl9FTkFCTEUgfCBUSU1FUkVHX0NSXzFfRU5BQkxFKQotI2RlZmluZSBUSU1FUjFfRElTQUJMRQkJKFRJTUVSRUdfQ1JfMl9FTkFCTEUpCisjZGVmaW5lIE1PWEFSVF9USU1FUjFfRU5BQkxFCShNT1hBUlRfQ1JfMl9FTkFCTEUgfCBNT1hBUlRfQ1JfMV9FTkFCTEUpCisjZGVmaW5lIE1PWEFSVF9USU1FUjFfRElTQUJMRQkoTU9YQVJUX0NSXzJfRU5BQkxFKQogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpiYXNlOwotc3RhdGljIHVuc2lnbmVkIGludCBjbG9ja19jb3VudF9wZXJfdGljazsKKy8qCisgKiBUaGUgQVNwZWVkIHZhcmlhbnQgb2YgdGhlIElQIGJsb2NrIGhhcyBhIGRpZmZlcmVudCBsYXlvdXQKKyAqIGZvciB0aGUgY29udHJvbCByZWdpc3RlcgorICovCisjZGVmaW5lIEFTUEVFRF9DUl8xX0VOQUJMRQlCSVQoMCkKKyNkZWZpbmUgQVNQRUVEX0NSXzFfQ0xPQ0sJQklUKDEpCisjZGVmaW5lIEFTUEVFRF9DUl8xX0lOVAkJQklUKDIpCisjZGVmaW5lIEFTUEVFRF9DUl8yX0VOQUJMRQlCSVQoNCkKKyNkZWZpbmUgQVNQRUVEX0NSXzJfQ0xPQ0sJQklUKDUpCisjZGVmaW5lIEFTUEVFRF9DUl8yX0lOVAkJQklUKDYpCisjZGVmaW5lIEFTUEVFRF9DUl8zX0VOQUJMRQlCSVQoOCkKKyNkZWZpbmUgQVNQRUVEX0NSXzNfQ0xPQ0sJQklUKDkpCisjZGVmaW5lIEFTUEVFRF9DUl8zX0lOVAkJQklUKDEwKQorCisjZGVmaW5lIEFTUEVFRF9USU1FUjFfRU5BQkxFICAgKEFTUEVFRF9DUl8yX0VOQUJMRSB8IEFTUEVFRF9DUl8xX0VOQUJMRSkKKyNkZWZpbmUgQVNQRUVEX1RJTUVSMV9ESVNBQkxFICAoQVNQRUVEX0NSXzJfRU5BQkxFKQorCitzdHJ1Y3QgbW94YXJ0X3RpbWVyIHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgaW50IHQxX2Rpc2FibGVfdmFsOworCXVuc2lnbmVkIGludCB0MV9lbmFibGVfdmFsOworCXVuc2lnbmVkIGludCBjb3VudF9wZXJfdGljazsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGNsa2V2dDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1veGFydF90aW1lciAqdG9fbW94YXJ0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGV2dCwgc3RydWN0IG1veGFydF90aW1lciwgY2xrZXZ0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1veGFydF9kaXNhYmxlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlzdHJ1Y3QgbW94YXJ0X3RpbWVyICp0aW1lciA9IHRvX21veGFydChldnQpOworCisJd3JpdGVsKHRpbWVyLT50MV9kaXNhYmxlX3ZhbCwgdGltZXItPmJhc2UgKyBUSU1FUl9DUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtb3hhcnRfZW5hYmxlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwlzdHJ1Y3QgbW94YXJ0X3RpbWVyICp0aW1lciA9IHRvX21veGFydChldnQpOworCisJd3JpdGVsKHRpbWVyLT50MV9lbmFibGVfdmFsLCB0aW1lci0+YmFzZSArIFRJTUVSX0NSKTsKK30KIAogc3RhdGljIGludCBtb3hhcnRfc2h1dGRvd24oc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewotCXdyaXRlbChUSU1FUjFfRElTQUJMRSwgYmFzZSArIFRJTUVSX0NSKTsKKwltb3hhcnRfZGlzYWJsZShldnQpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1veGFydF9zZXRfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCiB7Ci0Jd3JpdGVsKFRJTUVSMV9ESVNBQkxFLCBiYXNlICsgVElNRVJfQ1IpOwotCXdyaXRlbCh+MCwgYmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX0xPQUQpOworCW1veGFydF9kaXNhYmxlKGV2dCk7CisJd3JpdGVsKH4wLCB0b19tb3hhcnQoZXZ0KS0+YmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX0xPQUQpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1veGFydF9zZXRfcGVyaW9kaWMoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewotCXdyaXRlbChjbG9ja19jb3VudF9wZXJfdGljaywgYmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX0xPQUQpOwotCXdyaXRlbChUSU1FUjFfRU5BQkxFLCBiYXNlICsgVElNRVJfQ1IpOworCXN0cnVjdCBtb3hhcnRfdGltZXIgKnRpbWVyID0gdG9fbW94YXJ0KGV2dCk7CisKKwltb3hhcnRfZGlzYWJsZShldnQpOworCXdyaXRlbCh0aW1lci0+Y291bnRfcGVyX3RpY2ssIHRpbWVyLT5iYXNlICsgVElNRVIxX0JBU0UgKyBSRUdfTE9BRCk7CisJd3JpdGVsKDAsIHRpbWVyLT5iYXNlICsgVElNRVIxX0JBU0UgKyBSRUdfTUFUQ0gxKTsKKwltb3hhcnRfZW5hYmxlKGV2dCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbW94YXJ0X2Nsa2V2dF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgY3ljbGVzLAotCQkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICp1bnVzZWQpCisJCQkJICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKIHsKKwlzdHJ1Y3QgbW94YXJ0X3RpbWVyICp0aW1lciA9IHRvX21veGFydChldnQpOwogCXUzMiB1OwogCi0Jd3JpdGVsKFRJTUVSMV9ESVNBQkxFLCBiYXNlICsgVElNRVJfQ1IpOworCW1veGFydF9kaXNhYmxlKGV2dCk7CiAKLQl1ID0gcmVhZGwoYmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX0NPVU5UKSAtIGN5Y2xlczsKLQl3cml0ZWwodSwgYmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX01BVENIMSk7CisJdSA9IHJlYWRsKHRpbWVyLT5iYXNlICsgVElNRVIxX0JBU0UgKyBSRUdfQ09VTlQpIC0gY3ljbGVzOworCXdyaXRlbCh1LCB0aW1lci0+YmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX01BVENIMSk7CiAKLQl3cml0ZWwoVElNRVIxX0VOQUJMRSwgYmFzZSArIFRJTUVSX0NSKTsKKwltb3hhcnRfZW5hYmxlKGV2dCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgbW94YXJ0X2Nsb2NrZXZlbnQgPSB7Ci0JLm5hbWUJCQk9ICJtb3hhcnRfdGltZXIiLAotCS5yYXRpbmcJCQk9IDIwMCwKLQkuZmVhdHVyZXMJCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfAotCQkJCSAgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKLQkuc2V0X3N0YXRlX3NodXRkb3duCT0gbW94YXJ0X3NodXRkb3duLAotCS5zZXRfc3RhdGVfcGVyaW9kaWMJPSBtb3hhcnRfc2V0X3BlcmlvZGljLAotCS5zZXRfc3RhdGVfb25lc2hvdAk9IG1veGFydF9zZXRfb25lc2hvdCwKLQkudGlja19yZXN1bWUJCT0gbW94YXJ0X3NldF9vbmVzaG90LAotCS5zZXRfbmV4dF9ldmVudAkJPSBtb3hhcnRfY2xrZXZ0X25leHRfZXZlbnQsCi19OwotCiBzdGF0aWMgaXJxcmV0dXJuX3QgbW94YXJ0X3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gZGV2X2lkOwpAQCAtMTEyLDIxICsxNDcsMTkgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIG1veGFydF90aW1lcl9pcnEgPSB7Ci0JLm5hbWUJCT0gIm1veGFydC10aW1lciIsCi0JLmZsYWdzCQk9IElSUUZfVElNRVIsCi0JLmhhbmRsZXIJPSBtb3hhcnRfdGltZXJfaW50ZXJydXB0LAotCS5kZXZfaWQJCT0gJm1veGFydF9jbG9ja2V2ZW50LAotfTsKLQogc3RhdGljIGludCBfX2luaXQgbW94YXJ0X3RpbWVyX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewogCWludCByZXQsIGlycTsKIAl1bnNpZ25lZCBsb25nIHBjbGs7CiAJc3RydWN0IGNsayAqY2xrOworCXN0cnVjdCBtb3hhcnRfdGltZXIgKnRpbWVyOwogCi0JYmFzZSA9IG9mX2lvbWFwKG5vZGUsIDApOwotCWlmICghYmFzZSkgeworCXRpbWVyID0ga3phbGxvYyhzaXplb2YoKnRpbWVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0aW1lcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0aW1lci0+YmFzZSA9IG9mX2lvbWFwKG5vZGUsIDApOworCWlmICghdGltZXItPmJhc2UpIHsKIAkJcHJfZXJyKCIlczogb2ZfaW9tYXAgZmFpbGVkXG4iLCBub2RlLT5mdWxsX25hbWUpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTEzNywxMiArMTcwLDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0ID0gc2V0dXBfaXJxKGlycSwgJm1veGFydF90aW1lcl9pcnEpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCIlczogc2V0dXBfaXJxIGZhaWxlZFxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAljbGsgPSBvZl9jbGtfZ2V0KG5vZGUsIDApOwogCWlmIChJU19FUlIoY2xrKSkgIHsKIAkJcHJfZXJyKCIlczogb2ZfY2xrX2dldCBmYWlsZWRcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CkBAIC0xNTEsNyArMTc4LDMyIEBACiAKIAlwY2xrID0gY2xrX2dldF9yYXRlKGNsayk7CiAKLQlyZXQgPSBjbG9ja3NvdXJjZV9tbWlvX2luaXQoYmFzZSArIFRJTUVSMl9CQVNFICsgUkVHX0NPVU5ULAorCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAibW94YSxtb3hhcnQtdGltZXIiKSkgeworCQl0aW1lci0+dDFfZW5hYmxlX3ZhbCA9IE1PWEFSVF9USU1FUjFfRU5BQkxFOworCQl0aW1lci0+dDFfZGlzYWJsZV92YWwgPSBNT1hBUlRfVElNRVIxX0RJU0FCTEU7CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAiYXNwZWVkLGFzdDI0MDAtdGltZXIiKSkgeworCQl0aW1lci0+dDFfZW5hYmxlX3ZhbCA9IEFTUEVFRF9USU1FUjFfRU5BQkxFOworCQl0aW1lci0+dDFfZGlzYWJsZV92YWwgPSBBU1BFRURfVElNRVIxX0RJU0FCTEU7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCIlczogdW5rbm93biBwbGF0Zm9ybVxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGltZXItPmNvdW50X3Blcl90aWNrID0gRElWX1JPVU5EX0NMT1NFU1QocGNsaywgSFopOworCisJdGltZXItPmNsa2V2dC5uYW1lID0gbm9kZS0+bmFtZTsKKwl0aW1lci0+Y2xrZXZ0LnJhdGluZyA9IDIwMDsKKwl0aW1lci0+Y2xrZXZ0LmZlYXR1cmVzID0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfAorCQkJCQlDTE9DS19FVlRfRkVBVF9PTkVTSE9UOworCXRpbWVyLT5jbGtldnQuc2V0X3N0YXRlX3NodXRkb3duID0gbW94YXJ0X3NodXRkb3duOworCXRpbWVyLT5jbGtldnQuc2V0X3N0YXRlX3BlcmlvZGljID0gbW94YXJ0X3NldF9wZXJpb2RpYzsKKwl0aW1lci0+Y2xrZXZ0LnNldF9zdGF0ZV9vbmVzaG90ID0gbW94YXJ0X3NldF9vbmVzaG90OworCXRpbWVyLT5jbGtldnQudGlja19yZXN1bWUgPSBtb3hhcnRfc2V0X29uZXNob3Q7CisJdGltZXItPmNsa2V2dC5zZXRfbmV4dF9ldmVudCA9IG1veGFydF9jbGtldnRfbmV4dF9ldmVudDsKKwl0aW1lci0+Y2xrZXZ0LmNwdW1hc2sgPSBjcHVtYXNrX29mKDApOworCXRpbWVyLT5jbGtldnQuaXJxID0gaXJxOworCisJcmV0ID0gY2xvY2tzb3VyY2VfbW1pb19pbml0KHRpbWVyLT5iYXNlICsgVElNRVIyX0JBU0UgKyBSRUdfQ09VTlQsCiAJCQkJICAgICJtb3hhcnRfdGltZXIiLCBwY2xrLCAyMDAsIDMyLAogCQkJCSAgICBjbG9ja3NvdXJjZV9tbWlvX3JlYWRsX2Rvd24pOwogCWlmIChyZXQpIHsKQEAgLTE1OSwxMyArMjExLDI2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JY2xvY2tfY291bnRfcGVyX3RpY2sgPSBESVZfUk9VTkRfQ0xPU0VTVChwY2xrLCBIWik7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBtb3hhcnRfdGltZXJfaW50ZXJydXB0LCBJUlFGX1RJTUVSLAorCQkJICBub2RlLT5uYW1lLCAmdGltZXItPmNsa2V2dCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIiVzOiBzZXR1cF9pcnEgZmFpbGVkXG4iLCBub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gcmV0OworCX0KIAotCXdyaXRlbCh+MCwgYmFzZSArIFRJTUVSMl9CQVNFICsgUkVHX0xPQUQpOwotCXdyaXRlbChUSU1FUkVHX0NSXzJfRU5BQkxFLCBiYXNlICsgVElNRVJfQ1IpOworCS8qIENsZWFyIG1hdGNoIHJlZ2lzdGVycyAqLworCXdyaXRlbCgwLCB0aW1lci0+YmFzZSArIFRJTUVSMV9CQVNFICsgUkVHX01BVENIMSk7CisJd3JpdGVsKDAsIHRpbWVyLT5iYXNlICsgVElNRVIxX0JBU0UgKyBSRUdfTUFUQ0gyKTsKKwl3cml0ZWwoMCwgdGltZXItPmJhc2UgKyBUSU1FUjJfQkFTRSArIFJFR19NQVRDSDEpOworCXdyaXRlbCgwLCB0aW1lci0+YmFzZSArIFRJTUVSMl9CQVNFICsgUkVHX01BVENIMik7CiAKLQltb3hhcnRfY2xvY2tldmVudC5jcHVtYXNrID0gY3B1bWFza19vZigwKTsKLQltb3hhcnRfY2xvY2tldmVudC5pcnEgPSBpcnE7CisJLyoKKwkgKiBTdGFydCB0aW1lciAyIHJvbGxpbmcgYXMgb3VyIG1haW4gd2FsbCBjbG9jayBzb3VyY2UsIGtlZXAgdGltZXIgMQorCSAqIGRpc2FibGVkCisJICovCisJd3JpdGVsKDAsIHRpbWVyLT5iYXNlICsgVElNRVJfQ1IpOworCXdyaXRlbCh+MCwgdGltZXItPmJhc2UgKyBUSU1FUjJfQkFTRSArIFJFR19MT0FEKTsKKwl3cml0ZWwodGltZXItPnQxX2Rpc2FibGVfdmFsLCB0aW1lci0+YmFzZSArIFRJTUVSX0NSKTsKIAogCS8qCiAJICogZG9jdW1lbnRhdGlvbiBpcyBub3QgcHVibGljbHkgYXZhaWxhYmxlOgpAQCAtMTczLDkgKzIzOCw5IEBACiAJICogbWF4X2RlbHRhIDB4ZmZmZmZmZmUgc2hvdWxkIGJlIG9rIGJlY2F1c2UgY291bnQKIAkgKiByZWdpc3RlciBzaXplIGlzIHUzMgogCSAqLwotCWNsb2NrZXZlbnRzX2NvbmZpZ19hbmRfcmVnaXN0ZXIoJm1veGFydF9jbG9ja2V2ZW50LCBwY2xrLAotCQkJCQkweDQsIDB4ZmZmZmZmZmUpOworCWNsb2NrZXZlbnRzX2NvbmZpZ19hbmRfcmVnaXN0ZXIoJnRpbWVyLT5jbGtldnQsIHBjbGssIDB4NCwgMHhmZmZmZmZmZSk7CiAKIAlyZXR1cm4gMDsKIH0KIENMT0NLU09VUkNFX09GX0RFQ0xBUkUobW94YXJ0LCAibW94YSxtb3hhcnQtdGltZXIiLCBtb3hhcnRfdGltZXJfaW5pdCk7CitDTE9DS1NPVVJDRV9PRl9ERUNMQVJFKGFzcGVlZCwgImFzcGVlZCxhc3QyNDAwLXRpbWVyIiwgbW94YXJ0X3RpbWVyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci1hdG1lbC1waXQuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItYXRtZWwtcGl0LmMKaW5kZXggMzQ5NGJjNS4uNjU1NTgyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci1hdG1lbC1waXQuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLWF0bWVsLXBpdC5jCkBAIC0xNDksMjQgKzE0OSwxMyBAQAogewogCXN0cnVjdCBwaXRfZGF0YSAqZGF0YSA9IGRldl9pZDsKIAotCS8qCi0JICogaXJxcyBzaG91bGQgYmUgZGlzYWJsZWQgaGVyZSwgYnV0IGFzIHRoZSBpcnEgaXMgc2hhcmVkIHRoZXkgYXJlIG9ubHkKLQkgKiBndWFyYW50ZWVkIHRvIGJlIG9mZiBpZiB0aGUgdGltZXIgaXJxIGlzIHJlZ2lzdGVyZWQgZmlyc3QuCi0JICovCi0JV0FSTl9PTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCkpOwotCiAJLyogVGhlIFBJVCBpbnRlcnJ1cHQgbWF5IGJlIGRpc2FibGVkLCBhbmQgaXMgc2hhcmVkICovCiAJaWYgKGNsb2NrZXZlbnRfc3RhdGVfcGVyaW9kaWMoJmRhdGEtPmNsa2V2dCkgJiYKIAkgICAgKHBpdF9yZWFkKGRhdGEtPmJhc2UsIEFUOTFfUElUX1NSKSAmIEFUOTFfUElUX1BJVFMpKSB7Ci0JCXVuc2lnbmVkIG5yX3RpY2tzOwotCiAJCS8qIEdldCBudW1iZXIgb2YgdGlja3MgcGVyZm9ybWVkIGJlZm9yZSBpcnEsIGFuZCBhY2sgaXQgKi8KLQkJbnJfdGlja3MgPSBQSVRfUElDTlQocGl0X3JlYWQoZGF0YS0+YmFzZSwgQVQ5MV9QSVRfUElWUikpOwotCQlkbyB7Ci0JCQlkYXRhLT5jbnQgKz0gZGF0YS0+Y3ljbGU7Ci0JCQlkYXRhLT5jbGtldnQuZXZlbnRfaGFuZGxlcigmZGF0YS0+Y2xrZXZ0KTsKLQkJCW5yX3RpY2tzLS07Ci0JCX0gd2hpbGUgKG5yX3RpY2tzKTsKKwkJZGF0YS0+Y250ICs9IGRhdGEtPmN5Y2xlICogUElUX1BJQ05UKHBpdF9yZWFkKGRhdGEtPmJhc2UsCisJCQkJCQkJICAgICAgQVQ5MV9QSVRfUElWUikpOworCQlkYXRhLT5jbGtldnQuZXZlbnRfaGFuZGxlcigmZGF0YS0+Y2xrZXZ0KTsKIAogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQpAQCAtMTc3LDExICsxNjYsNDEgQEAKIC8qCiAgKiBTZXQgdXAgYm90aCBjbG9ja3NvdXJjZSBhbmQgY2xvY2tldmVudCBzdXBwb3J0LgogICovCi1zdGF0aWMgaW50IF9faW5pdCBhdDkxc2FtOTI2eF9waXRfY29tbW9uX2luaXQoc3RydWN0IHBpdF9kYXRhICpkYXRhKQorc3RhdGljIGludCBfX2luaXQgYXQ5MXNhbTkyNnhfcGl0X2R0X2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewotCXVuc2lnbmVkIGxvbmcJcGl0X3JhdGU7Ci0JdW5zaWduZWQJYml0czsKLQlpbnQJCXJldDsKKwl1bnNpZ25lZCBsb25nICAgcGl0X3JhdGU7CisJdW5zaWduZWQgICAgICAgIGJpdHM7CisJaW50ICAgICAgICAgICAgIHJldDsKKwlzdHJ1Y3QgcGl0X2RhdGEgKmRhdGE7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJZGF0YS0+YmFzZSA9IG9mX2lvbWFwKG5vZGUsIDApOworCWlmICghZGF0YS0+YmFzZSkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBtYXAgUElUIGFkZHJlc3NcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWRhdGEtPm1jayA9IG9mX2Nsa19nZXQobm9kZSwgMCk7CisJaWYgKElTX0VSUihkYXRhLT5tY2spKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGdldCBtY2sgY2xrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+bWNrKTsKKwl9CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGF0YS0+bWNrKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiVW5hYmxlIHRvIGVuYWJsZSBtY2tcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEdldCB0aGUgaW50ZXJydXB0cyBwcm9wZXJ0eSAqLworCWRhdGEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDApOworCWlmICghZGF0YS0+aXJxKSB7CisJCXByX2VycigiVW5hYmxlIHRvIGdldCBJUlEgZnJvbSBEVFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCS8qCiAJICogVXNlIG91ciBhY3R1YWwgTUNLIHRvIGZpZ3VyZSBvdXQgaG93IG1hbnkgTUNLLzE2IHRpY2tzIHBlcgpAQCAtMjM2LDQ1ICsyNTUsNSBAQAogCiAJcmV0dXJuIDA7CiB9Ci0KLXN0YXRpYyBpbnQgX19pbml0IGF0OTFzYW05MjZ4X3BpdF9kdF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKLXsKLQlzdHJ1Y3QgcGl0X2RhdGEgKmRhdGE7Ci0KLQlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGF0YS0+YmFzZSA9IG9mX2lvbWFwKG5vZGUsIDApOwotCWlmICghZGF0YS0+YmFzZSkgewotCQlwcl9lcnIoIkNvdWxkIG5vdCBtYXAgUElUIGFkZHJlc3NcbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCWRhdGEtPm1jayA9IG9mX2Nsa19nZXQobm9kZSwgMCk7Ci0JaWYgKElTX0VSUihkYXRhLT5tY2spKQotCQkvKiBGYWxsYmFjayBvbiBjbGtkZXYgZm9yICFDQ0YtYmFzZWQgYm9hcmRzICovCi0JCWRhdGEtPm1jayA9IGNsa19nZXQoTlVMTCwgIm1jayIpOwotCi0JaWYgKElTX0VSUihkYXRhLT5tY2spKSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGdldCBtY2sgY2xrXG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+bWNrKTsKLQl9Ci0KLQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGF0YS0+bWNrKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGVuYWJsZSBtY2tcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIEdldCB0aGUgaW50ZXJydXB0cyBwcm9wZXJ0eSAqLwotCWRhdGEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDApOwotCWlmICghZGF0YS0+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+Y291cGxlZCkKKwkJY3B1aWRsZV9jb3VwbGVkX3ByZXZlbnRfaWRsZShkZXYtPmNvdXBsZWQpOworCisJbXV0ZXhfdW5sb2NrKCZjcHVpZGxlX2xvY2spOworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50IF9faW5pdCBjcHVpZGxlX2NvdXBsZWRfaW5pdCh2b2lkKQogewotCXJldHVybiByZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNwdWlkbGVfY291cGxlZF9jcHVfbm90aWZpZXIpOworCWludCByZXQ7CisKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0NQVUlETEVfQ09VUExFRF9QUkVQQVJFLAorCQkJCQkiY3B1aWRsZS9jb3VwbGVkOnByZXBhcmUiLAorCQkJCQljb3VwbGVkX2NwdV91cF9wcmVwYXJlLAorCQkJCQljb3VwbGVkX2NwdV9vbmxpbmUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLAorCQkJCQkiY3B1aWRsZS9jb3VwbGVkOm9ubGluZSIsCisJCQkJCWNvdXBsZWRfY3B1X29ubGluZSwKKwkJCQkJY291cGxlZF9jcHVfdXBfcHJlcGFyZSk7CisJaWYgKHJldCA8IDApCisJCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKENQVUhQX0NQVUlETEVfQ09VUExFRF9QUkVQQVJFKTsKKwlyZXR1cm4gcmV0OwogfQogY29yZV9pbml0Y2FsbChjcHVpZGxlX2NvdXBsZWRfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1hcm0uYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLWFybS5jCmluZGV4IDRiYTNkM2YuLmY0NDBkMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLWFybS5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLWFybS5jCkBAIC0xMjEsNiArMTIxLDcgQEAKIAkJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwogCQlpZiAoIWRldikgewogCQkJcHJfZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgY3B1aWRsZSBkZXZpY2VcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gb3V0X2ZhaWw7CiAJCX0KIAkJZGV2LT5jcHUgPSBjcHU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wb3dlcm52LmMgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wb3dlcm52LmMKaW5kZXggZjdjYTg5MS4uN2ZlNDQyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcG93ZXJudi5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBvd2VybnYuYwpAQCAtMTE5LDM5ICsxMTksMjkgQEAKIAkJLmVudGVyID0gc25vb3plX2xvb3AgfSwKIH07CiAKLXN0YXRpYyBpbnQgcG93ZXJudl9jcHVpZGxlX2FkZF9jcHVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuLAotCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IHBvd2VybnZfY3B1aWRsZV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JaW50IGhvdGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7Ci0Jc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPQotCQkJCXBlcl9jcHUoY3B1aWRsZV9kZXZpY2VzLCBob3RjcHUpOworCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0gcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGNwdSk7CiAKIAlpZiAoZGV2ICYmIGNwdWlkbGVfZ2V0X2RyaXZlcigpKSB7Ci0JCXN3aXRjaCAoYWN0aW9uKSB7Ci0JCWNhc2UgQ1BVX09OTElORToKLQkJY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQkJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKLQkJCWNwdWlkbGVfZW5hYmxlX2RldmljZShkZXYpOwotCQkJY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBDUFVfREVBRDoKLQkJY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCQljcHVpZGxlX3BhdXNlX2FuZF9sb2NrKCk7Ci0JCQljcHVpZGxlX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0JCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKCk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcmV0dXJuIE5PVElGWV9ET05FOwotCQl9CisJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKKwkJY3B1aWRsZV9lbmFibGVfZGV2aWNlKGRldik7CisJCWNwdWlkbGVfcmVzdW1lX2FuZF91bmxvY2soKTsKIAl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzZXR1cF9ob3RwbHVnX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gcG93ZXJudl9jcHVpZGxlX2FkZF9jcHVfbm90aWZpZXIsCi19Oworc3RhdGljIGludCBwb3dlcm52X2NwdWlkbGVfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiA9IHBlcl9jcHUoY3B1aWRsZV9kZXZpY2VzLCBjcHUpOworCisJaWYgKGRldiAmJiBjcHVpZGxlX2dldF9kcml2ZXIoKSkgeworCQljcHVpZGxlX3BhdXNlX2FuZF9sb2NrKCk7CisJCWNwdWlkbGVfZGlzYWJsZV9kZXZpY2UoZGV2KTsKKwkJY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygpOworCX0KKwlyZXR1cm4gMDsKK30KIAogLyoKICAqIHBvd2VybnZfY3B1aWRsZV9kcml2ZXJfaW5pdCgpCkBAIC0zNTUsNyArMzQ1LDE0IEBACiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZzZXR1cF9ob3RwbHVnX25vdGlmaWVyKTsKKwlyZXR2YWwgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0FQX09OTElORV9EWU4sCisJCQkJCSAgICJjcHVpZGxlL3Bvd2VybnY6b25saW5lIiwKKwkJCQkJICAgcG93ZXJudl9jcHVpZGxlX2NwdV9vbmxpbmUsIE5VTEwpOworCVdBUk5fT04ocmV0dmFsIDwgMCk7CisJcmV0dmFsID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9DUFVJRExFX0RFQUQsCisJCQkJCSAgICJjcHVpZGxlL3Bvd2VybnY6ZGVhZCIsIE5VTEwsCisJCQkJCSAgIHBvd2VybnZfY3B1aWRsZV9jcHVfZGVhZCk7CisJV0FSTl9PTihyZXR2YWwgPCAwKTsKIAlwcmludGsoS0VSTl9ERUJVRyAicG93ZXJudl9pZGxlX2RyaXZlciByZWdpc3RlcmVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBzZXJpZXMuYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXBzZXJpZXMuYwppbmRleCAwNzEzNWUwLi4xNjZjY2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1wc2VyaWVzLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtcHNlcmllcy5jCkBAIC0xNzEsMzkgKzE3MSwyOSBAQAogCQkuZW50ZXIgPSAmc2hhcmVkX2NlZGVfbG9vcCB9LAogfTsKIAotc3RhdGljIGludCBwc2VyaWVzX2NwdWlkbGVfYWRkX2NwdV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4sCi0JCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgcHNlcmllc19jcHVpZGxlX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlpbnQgaG90Y3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKLQlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiA9Ci0JCQkJcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGhvdGNwdSk7CisJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPSBwZXJfY3B1KGNwdWlkbGVfZGV2aWNlcywgY3B1KTsKIAogCWlmIChkZXYgJiYgY3B1aWRsZV9nZXRfZHJpdmVyKCkpIHsKLQkJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSBDUFVfT05MSU5FOgotCQljYXNlIENQVV9PTkxJTkVfRlJPWkVOOgotCQkJY3B1aWRsZV9wYXVzZV9hbmRfbG9jaygpOwotCQkJY3B1aWRsZV9lbmFibGVfZGV2aWNlKGRldik7Ci0JCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKCk7Ci0JCQlicmVhazsKLQotCQljYXNlIENQVV9ERUFEOgotCQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKLQkJCWNwdWlkbGVfZGlzYWJsZV9kZXZpY2UoZGV2KTsKLQkJCWNwdWlkbGVfcmVzdW1lX2FuZF91bmxvY2soKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0JCX0KKwkJY3B1aWRsZV9wYXVzZV9hbmRfbG9jaygpOworCQljcHVpZGxlX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwkJY3B1aWRsZV9yZXN1bWVfYW5kX3VubG9jaygpOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNldHVwX2hvdHBsdWdfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBwc2VyaWVzX2NwdWlkbGVfYWRkX2NwdV9ub3RpZmllciwKLX07CitzdGF0aWMgaW50IHBzZXJpZXNfY3B1aWRsZV9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2ID0gcGVyX2NwdShjcHVpZGxlX2RldmljZXMsIGNwdSk7CisKKwlpZiAoZGV2ICYmIGNwdWlkbGVfZ2V0X2RyaXZlcigpKSB7CisJCWNwdWlkbGVfcGF1c2VfYW5kX2xvY2soKTsKKwkJY3B1aWRsZV9kaXNhYmxlX2RldmljZShkZXYpOworCQljcHVpZGxlX3Jlc3VtZV9hbmRfdW5sb2NrKCk7CisJfQorCXJldHVybiAwOworfQogCiAvKgogICogcHNlcmllc19jcHVpZGxlX2RyaXZlcl9pbml0KCkKQEAgLTI3Myw3ICsyNjMsMTQgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNldHVwX2hvdHBsdWdfbm90aWZpZXIpOworCXJldHZhbCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwKKwkJCQkJICAgImNwdWlkbGUvcHNlcmllczpvbmxpbmUiLAorCQkJCQkgICBwc2VyaWVzX2NwdWlkbGVfY3B1X29ubGluZSwgTlVMTCk7CisJV0FSTl9PTihyZXR2YWwgPCAwKTsKKwlyZXR2YWwgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX0NQVUlETEVfREVBRCwKKwkJCQkJICAgImNwdWlkbGUvcHNlcmllczpERUFEIiwgTlVMTCwKKwkJCQkJICAgcHNlcmllc19jcHVpZGxlX2NwdV9kZWFkKTsKKwlXQVJOX09OKHJldHZhbCA8IDApOwogCXByaW50ayhLRVJOX0RFQlVHICJwc2VyaWVzX2lkbGVfZHJpdmVyIHJlZ2lzdGVyZWRcbiIpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vS2NvbmZpZyBiL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKaW5kZXggMWFmOTRlMi4uOWIwMzViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vS2NvbmZpZworKysgYi9kcml2ZXJzL2NyeXB0by9LY29uZmlnCkBAIC01NTAsNCArNTUwLDYgQEAKIAkgIFRoaXMgZHJpdmVyIGludGVyZmFjZXMgd2l0aCB0aGUgaGFyZHdhcmUgY3J5cHRvIGFjY2VsZXJhdG9yLgogCSAgU3VwcG9ydGluZyBjYmMvZWNiIGNoYWlubW9kZSwgYW5kIGFlcy9kZXMvZGVzM19lZGUgY2lwaGVyIG1vZGUuCiAKK3NvdXJjZSAiZHJpdmVycy9jcnlwdG8vY2hlbHNpby9LY29uZmlnIgorCiBlbmRpZiAjIENSWVBUT19IVwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vTWFrZWZpbGUgYi9kcml2ZXJzL2NyeXB0by9NYWtlZmlsZQppbmRleCAzYzY0MzJkZC4uYWQ3MjUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jcnlwdG8vTWFrZWZpbGUKQEAgLTMxLDMgKzMxLDQgQEAKIG9iai0kKENPTkZJR19DUllQVE9fREVWX1ZNWCkgKz0gdm14Lwogb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfU1VONElfU1MpICs9IHN1bnhpLXNzLwogb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfUk9DS0NISVApICs9IHJvY2tjaGlwLworb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfQ0hFTFNJTykgKz0gY2hlbHNpby8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NhYW0vY2FhbWFsZy5jIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKaW5kZXggNmRjNTk3MS4uYjMwNDQyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtYWxnLmMKQEAgLTU1Niw3ICs1NTYsMTAgQEAKIAogCS8qIFJlYWQgYW5kIHdyaXRlIGFzc29jbGVuIGJ5dGVzICovCiAJYXBwZW5kX21hdGhfYWRkKGRlc2MsIFZBUlNFUUlOTEVOLCBaRVJPLCBSRUczLCBDQUFNX0NNRF9TWik7Ci0JYXBwZW5kX21hdGhfYWRkKGRlc2MsIFZBUlNFUU9VVExFTiwgWkVSTywgUkVHMywgQ0FBTV9DTURfU1opOworCWlmIChhbGctPmNhYW0uZ2VuaXYpCisJCWFwcGVuZF9tYXRoX2FkZF9pbW1fdTMyKGRlc2MsIFZBUlNFUU9VVExFTiwgUkVHMywgSU1NLCBpdnNpemUpOworCWVsc2UKKwkJYXBwZW5kX21hdGhfYWRkKGRlc2MsIFZBUlNFUU9VVExFTiwgWkVSTywgUkVHMywgQ0FBTV9DTURfU1opOwogCiAJLyogU2tpcCBhc3NvYyBkYXRhICovCiAJYXBwZW5kX3NlcV9maWZvX3N0b3JlKGRlc2MsIDAsIEZJRk9TVF9UWVBFX1NLSVAgfCBGSUZPTERTVF9WTEYpOwpAQCAtNTY1LDYgKzU2OCwxNCBAQAogCWFwcGVuZF9zZXFfZmlmb19sb2FkKGRlc2MsIDAsIEZJRk9MRF9DTEFTU19DTEFTUzIgfCBGSUZPTERfVFlQRV9NU0cgfAogCQkJICAgICBLRVlfVkxGKTsKIAorCWlmIChhbGctPmNhYW0uZ2VuaXYpIHsKKwkJYXBwZW5kX3NlcV9sb2FkKGRlc2MsIGl2c2l6ZSwgTERTVF9DTEFTU18xX0NDQiB8CisJCQkJTERTVF9TUkNEU1RfQllURV9DT05URVhUIHwKKwkJCQkoY3R4MV9pdl9vZmYgPDwgTERTVF9PRkZTRVRfU0hJRlQpKTsKKwkJYXBwZW5kX21vdmUoZGVzYywgTU9WRV9TUkNfQ0xBU1MxQ1RYIHwgTU9WRV9ERVNUX0NMQVNTMklORklGTyB8CisJCQkgICAgKGN0eDFfaXZfb2ZmIDw8IE1PVkVfT0ZGU0VUX1NISUZUKSB8IGl2c2l6ZSk7CisJfQorCiAJLyogTG9hZCBDb3VudGVyIGludG8gQ09OVEVYVDEgcmVnICovCiAJaWYgKGlzX3JmYzM2ODYpCiAJCWFwcGVuZF9sb2FkX2ltbV91MzIoZGVzYywgYmUzMl90b19jcHUoMSksIExEU1RfSU1NIHwKQEAgLTIxNTAsNyArMjE2MSw3IEBACiAKIAlpbml0X2FlYWRfam9iKHJlcSwgZWRlc2MsIGFsbF9jb250aWcsIGVuY3J5cHQpOwogCi0JaWYgKGl2c2l6ZSAmJiAoaXNfcmZjMzY4NiB8fCAhKGFsZy0+Y2FhbS5nZW5pdiAmJiBlbmNyeXB0KSkpCisJaWYgKGl2c2l6ZSAmJiAoKGlzX3JmYzM2ODYgJiYgZW5jcnlwdCkgfHwgIWFsZy0+Y2FhbS5nZW5pdikpCiAJCWFwcGVuZF9sb2FkX2FzX2ltbShkZXNjLCByZXEtPml2LCBpdnNpemUsCiAJCQkJICAgTERTVF9DTEFTU18xX0NDQiB8CiAJCQkJICAgTERTVF9TUkNEU1RfQllURV9DT05URVhUIHwKQEAgLTI1MzcsMjAgKzI1NDgsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYWVhZF9naXZkZWNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQgPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKLQl1bnNpZ25lZCBpbnQgaXZzaXplID0gY3J5cHRvX2FlYWRfaXZzaXplKGFlYWQpOwotCi0JaWYgKHJlcS0+Y3J5cHRsZW4gPCBpdnNpemUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmVxLT5jcnlwdGxlbiAtPSBpdnNpemU7Ci0JcmVxLT5hc3NvY2xlbiArPSBpdnNpemU7Ci0KLQlyZXR1cm4gYWVhZF9kZWNyeXB0KHJlcSk7Ci19Ci0KIC8qCiAgKiBhbGxvY2F0ZSBhbmQgbWFwIHRoZSBhYmxrY2lwaGVyIGV4dGVuZGVkIGRlc2NyaXB0b3IgZm9yIGFibGtjaXBoZXIKICAqLwpAQCAtMzIxMCw3ICszMjA3LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQUVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBNRDVfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zMjU2LDcgKzMyNTMsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBBRVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTFfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zMzAyLDcgKzMyOTksNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBBRVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTIyNF9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTMzNDgsNyArMzM0NSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IEFFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzM5NCw3ICszMzkxLDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQUVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEzODRfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zNDQwLDcgKzM0MzcsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBBRVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM0ODYsNyArMzQ4Myw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFUzNfRURFX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBNRDVfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zNTM0LDcgKzM1MzEsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVMzX0VERV9CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMV9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM1ODIsNyArMzU3OSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFUzNfRURFX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEyMjRfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zNjMwLDcgKzM2MjcsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVMzX0VERV9CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzY3OCw3ICszNjc1LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTM19FREVfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTM4NF9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM3MjYsNyArMzcyMyw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFUzNfRURFX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEE1MTJfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zNzcyLDcgKzM3NjksNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IE1ENV9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM4MTgsNyArMzgxNSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMV9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTM4NjQsNyArMzg2MSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMjI0X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtMzkxMCw3ICszOTA3LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gREVTX0JMT0NLX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEyNTZfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC0zOTU2LDcgKzM5NTMsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBERVNfQkxPQ0tfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTM4NF9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTQwMDIsNyArMzk5OSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IERFU19CTE9DS19TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBNTEyX0RJR0VTVF9TSVpFLAogCQl9LApAQCAtNDA1MSw3ICs0MDQ4LDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQ1RSX1JGQzM2ODZfSVZfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IE1ENV9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTQxMDIsNyArNDA5OSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IENUUl9SRkMzNjg2X0lWX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEExX0RJR0VTVF9TSVpFLAogCQl9LApAQCAtNDE1Myw3ICs0MTUwLDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQ1RSX1JGQzM2ODZfSVZfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTIyNF9ESUdFU1RfU0laRSwKIAkJfSwKQEAgLTQyMDQsNyArNDIwMSw3IEBACiAJCQkuc2V0a2V5ID0gYWVhZF9zZXRrZXksCiAJCQkuc2V0YXV0aHNpemUgPSBhZWFkX3NldGF1dGhzaXplLAogCQkJLmVuY3J5cHQgPSBhZWFkX2VuY3J5cHQsCi0JCQkuZGVjcnlwdCA9IGFlYWRfZ2l2ZGVjcnlwdCwKKwkJCS5kZWNyeXB0ID0gYWVhZF9kZWNyeXB0LAogCQkJLml2c2l6ZSA9IENUUl9SRkMzNjg2X0lWX1NJWkUsCiAJCQkubWF4YXV0aHNpemUgPSBTSEEyNTZfRElHRVNUX1NJWkUsCiAJCX0sCkBAIC00MjU1LDcgKzQyNTIsNyBAQAogCQkJLnNldGtleSA9IGFlYWRfc2V0a2V5LAogCQkJLnNldGF1dGhzaXplID0gYWVhZF9zZXRhdXRoc2l6ZSwKIAkJCS5lbmNyeXB0ID0gYWVhZF9lbmNyeXB0LAotCQkJLmRlY3J5cHQgPSBhZWFkX2dpdmRlY3J5cHQsCisJCQkuZGVjcnlwdCA9IGFlYWRfZGVjcnlwdCwKIAkJCS5pdnNpemUgPSBDVFJfUkZDMzY4Nl9JVl9TSVpFLAogCQkJLm1heGF1dGhzaXplID0gU0hBMzg0X0RJR0VTVF9TSVpFLAogCQl9LApAQCAtNDMwNiw3ICs0MzAzLDcgQEAKIAkJCS5zZXRrZXkgPSBhZWFkX3NldGtleSwKIAkJCS5zZXRhdXRoc2l6ZSA9IGFlYWRfc2V0YXV0aHNpemUsCiAJCQkuZW5jcnlwdCA9IGFlYWRfZW5jcnlwdCwKLQkJCS5kZWNyeXB0ID0gYWVhZF9naXZkZWNyeXB0LAorCQkJLmRlY3J5cHQgPSBhZWFkX2RlY3J5cHQsCiAJCQkuaXZzaXplID0gQ1RSX1JGQzM2ODZfSVZfU0laRSwKIAkJCS5tYXhhdXRoc2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRSwKIAkJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vS2NvbmZpZyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2U2N2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9LY29uZmlnCkBAIC0wLDAgKzEsMTkgQEAKK2NvbmZpZyBDUllQVE9fREVWX0NIRUxTSU8KKwl0cmlzdGF0ZSAiQ2hlbHNpbyBDcnlwdG8gQ28tcHJvY2Vzc29yIERyaXZlciIKKwlkZXBlbmRzIG9uIENIRUxTSU9fVDQKKwlzZWxlY3QgQ1JZUFRPX1NIQTEKKwlzZWxlY3QgQ1JZUFRPX1NIQTI1NgorCXNlbGVjdCBDUllQVE9fU0hBNTEyCisJLS0taGVscC0tLQorCSAgVGhlIENoZWxzaW8gQ3J5cHRvIENvLXByb2Nlc3NvciBkcml2ZXIgZm9yIFQ2IGFkYXB0ZXJzLgorCisJICBGb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBDaGVsc2lvIGFuZCBvdXIgcHJvZHVjdHMsIHZpc2l0CisJICBvdXIgd2Vic2l0ZSBhdCA8aHR0cDovL3d3dy5jaGVsc2lvLmNvbT4uCisKKwkgIEZvciBjdXN0b21lciBzdXBwb3J0LCBwbGVhc2UgdmlzaXQgb3VyIGN1c3RvbWVyIHN1cHBvcnQgcGFnZSBhdAorCSAgPGh0dHA6Ly93d3cuY2hlbHNpby5jb20vc3VwcG9ydC5odG1sPi4KKworCSAgUGxlYXNlIHNlbmQgZmVlZGJhY2sgdG8gPGxpbnV4LWJ1Z3NAY2hlbHNpby5jb20+LgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBjaGNyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9NYWtlZmlsZSBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViZGYwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACitjY2ZsYWdzLXkgOj0gLUlkcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0CisKK29iai0kKENPTkZJR19DUllQVE9fREVWX0NIRUxTSU8pICs9IGNoY3IubworY2hjci1vYmpzIDo9ICBjaGNyX2NvcmUubyBjaGNyX2FsZ28ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2FsZ28uYyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9hbGdvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkZGI5MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9hbGdvLmMKQEAgLTAsMCArMSwxNTI1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDYgQ3J5cHRvIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICogV3JpdHRlbiBhbmQgTWFpbnRhaW5lZCBieToKKyAqCU1hbm9qIE1hbHZpeWEgKG1hbm9qbWFsdml5YUBjaGVsc2lvLmNvbSkKKyAqCUF0dWwgR3VwdGEgKGF0dWwuZ3VwdGFAY2hlbHNpby5jb20pCisgKglKaXRlbmRyYSBMdWxsYSAoamx1bGxhQGNoZWxzaW8uY29tKQorICoJWWVzaGFzd2kgTSBSIEdvd2RhICh5ZXNoYXN3aUBjaGVsc2lvLmNvbSkKKyAqCUhhcnNoIEphaW4gKGhhcnNoQGNoZWxzaW8uY29tKQorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgImNoY3I6IiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKworI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KKyNpbmNsdWRlIDxjcnlwdG8vYWxnYXBpLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKworI2luY2x1ZGUgInQ0ZndfYXBpLmgiCisjaW5jbHVkZSAidDRfbXNnLmgiCisjaW5jbHVkZSAiY2hjcl9jb3JlLmgiCisjaW5jbHVkZSAiY2hjcl9hbGdvLmgiCisjaW5jbHVkZSAiY2hjcl9jcnlwdG8uaCIKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWJsa19jdHggKkFCTEtfQ1RYKHN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gY3R4LT5jcnlwdG9fY3R4LT5hYmxrY3R4OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBobWFjX2N0eCAqSE1BQ19DVFgoc3RydWN0IGNoY3JfY29udGV4dCAqY3R4KQoreworCXJldHVybiBjdHgtPmNyeXB0b19jdHgtPmhtYWNjdHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVsZF9jdHggKlVMRF9DVFgoc3RydWN0IGNoY3JfY29udGV4dCAqY3R4KQoreworCXJldHVybiBjdHgtPmRldi0+dV9jdHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX29mbGRfaW1tKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChza2ItPmxlbiA8PSBDUllQVE9fTUFYX0lNTV9UWF9QS1RfTEVOKTsKK30KKworLyoKKyAqCXNnbF9sZW4gLSBjYWxjdWxhdGVzIHRoZSBzaXplIG9mIGFuIFNHTCBvZiB0aGUgZ2l2ZW4gY2FwYWNpdHkKKyAqCUBuOiB0aGUgbnVtYmVyIG9mIFNHTCBlbnRyaWVzCisgKglDYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgZmxpdHMgbmVlZGVkIGZvciBhIHNjYXR0ZXIvZ2F0aGVyIGxpc3QgdGhhdAorICoJY2FuIGhvbGQgdGhlIGdpdmVuIG51bWJlciBvZiBlbnRyaWVzLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzZ2xfbGVuKHVuc2lnbmVkIGludCBuKQoreworCW4tLTsKKwlyZXR1cm4gKDMgKiBuKSAvIDIgKyAobiAmIDEpICsgMjsKK30KKworLyoKKyAqCWNoY3JfaGFuZGxlX3Jlc3AgLSBVbm1hcCB0aGUgRE1BIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0CisgKglAcmVxOiBjcnlwdG8gcmVxdWVzdAorICovCitpbnQgY2hjcl9oYW5kbGVfcmVzcChzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKnJlcSwgdW5zaWduZWQgY2hhciAqaW5wdXQsCisJCSAgICAgaW50IGVycm9yX3N0YXR1cykKK3sKKwlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gcmVxLT50Zm07CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSBVTERfQ1RYKGN0eCk7CisJc3RydWN0IGNoY3JfcmVxX2N0eCBjdHhfcmVxOworCXN0cnVjdCBjcGxfZnc2X3BsZCAqZnc2X3BsZDsKKwl1bnNpZ25lZCBpbnQgZGlnZXN0c2l6ZSwgdXBkYXRlZF9kaWdlc3RzaXplOworCisJc3dpdGNoICh0Zm0tPl9fY3J0X2FsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19UWVBFX01BU0spIHsKKwljYXNlIENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVI6CisJCWN0eF9yZXEucmVxLmFibGtfcmVxID0gKHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKilyZXE7CisJCWN0eF9yZXEuY3R4LmFibGtfY3R4ID0KKwkJCWFibGtjaXBoZXJfcmVxdWVzdF9jdHgoY3R4X3JlcS5yZXEuYWJsa19yZXEpOworCQlpZiAoIWVycm9yX3N0YXR1cykgeworCQkJZnc2X3BsZCA9IChzdHJ1Y3QgY3BsX2Z3Nl9wbGQgKilpbnB1dDsKKwkJCW1lbWNweShjdHhfcmVxLnJlcS5hYmxrX3JlcS0+aW5mbywgJmZ3Nl9wbGQtPmRhdGFbMl0sCisJCQkgICAgICAgQUVTX0JMT0NLX1NJWkUpOworCQl9CisJCWRtYV91bm1hcF9zZygmdV9jdHgtPmxsZGkucGRldi0+ZGV2LCBjdHhfcmVxLnJlcS5hYmxrX3JlcS0+ZHN0LAorCQkJICAgICBBQkxLX0NUWChjdHgpLT5kc3RfbmVudHMsIERNQV9GUk9NX0RFVklDRSk7CisJCWlmIChjdHhfcmVxLmN0eC5hYmxrX2N0eC0+c2tiKSB7CisJCQlrZnJlZV9za2IoY3R4X3JlcS5jdHguYWJsa19jdHgtPnNrYik7CisJCQljdHhfcmVxLmN0eC5hYmxrX2N0eC0+c2tiID0gTlVMTDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ1JZUFRPX0FMR19UWVBFX0FIQVNIOgorCQljdHhfcmVxLnJlcS5haGFzaF9yZXEgPSAoc3RydWN0IGFoYXNoX3JlcXVlc3QgKilyZXE7CisJCWN0eF9yZXEuY3R4LmFoYXNoX2N0eCA9CisJCQlhaGFzaF9yZXF1ZXN0X2N0eChjdHhfcmVxLnJlcS5haGFzaF9yZXEpOworCQlkaWdlc3RzaXplID0KKwkJCWNyeXB0b19haGFzaF9kaWdlc3RzaXplKGNyeXB0b19haGFzaF9yZXF0Zm0oCisJCQkJCQkJY3R4X3JlcS5yZXEuYWhhc2hfcmVxKSk7CisJCXVwZGF0ZWRfZGlnZXN0c2l6ZSA9IGRpZ2VzdHNpemU7CisJCWlmIChkaWdlc3RzaXplID09IFNIQTIyNF9ESUdFU1RfU0laRSkKKwkJCXVwZGF0ZWRfZGlnZXN0c2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRTsKKwkJZWxzZSBpZiAoZGlnZXN0c2l6ZSA9PSBTSEEzODRfRElHRVNUX1NJWkUpCisJCQl1cGRhdGVkX2RpZ2VzdHNpemUgPSBTSEE1MTJfRElHRVNUX1NJWkU7CisJCWlmIChjdHhfcmVxLmN0eC5haGFzaF9jdHgtPnNrYikKKwkJCWN0eF9yZXEuY3R4LmFoYXNoX2N0eC0+c2tiID0gTlVMTDsKKwkJaWYgKGN0eF9yZXEuY3R4LmFoYXNoX2N0eC0+cmVzdWx0ID09IDEpIHsKKwkJCWN0eF9yZXEuY3R4LmFoYXNoX2N0eC0+cmVzdWx0ID0gMDsKKwkJCW1lbWNweShjdHhfcmVxLnJlcS5haGFzaF9yZXEtPnJlc3VsdCwgaW5wdXQgKworCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY3BsX2Z3Nl9wbGQpLAorCQkJICAgICAgIGRpZ2VzdHNpemUpOworCQl9IGVsc2UgeworCQkJbWVtY3B5KGN0eF9yZXEuY3R4LmFoYXNoX2N0eC0+cGFydGlhbF9oYXNoLCBpbnB1dCArCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjcGxfZnc2X3BsZCksCisJCQkgICAgICAgdXBkYXRlZF9kaWdlc3RzaXplKTsKKwkJfQorCQlrZnJlZShjdHhfcmVxLmN0eC5haGFzaF9jdHgtPmR1bW15X3BheWxvYWRfcHRyKTsKKwkJY3R4X3JlcS5jdHguYWhhc2hfY3R4LT5kdW1teV9wYXlsb2FkX3B0ciA9IE5VTEw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCWNhbGNfdHhfZmxpdHNfb2ZsZCAtIGNhbGN1bGF0ZSAjIG9mIGZsaXRzIGZvciBhbiBvZmZsb2FkIHBhY2tldAorICoJQHNrYjogdGhlIHBhY2tldAorICoJUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZsaXRzIG5lZWRlZCBmb3IgdGhlIGdpdmVuIG9mZmxvYWQgcGFja2V0LgorICoJVGhlc2UgcGFja2V0cyBhcmUgYWxyZWFkeSBmdWxseSBjb25zdHJ1Y3RlZCBhbmQgbm8gYWRkaXRpb25hbCBoZWFkZXJzCisgKgl3aWxsIGJlIGFkZGVkLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjYWxjX3R4X2ZsaXRzX29mbGQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBpbnQgZmxpdHMsIGNudDsKKworCWlmIChpc19vZmxkX2ltbShza2IpKQorCQlyZXR1cm4gRElWX1JPVU5EX1VQKHNrYi0+bGVuLCA4KTsKKworCWZsaXRzID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSAvIDg7ICAgLyogaGVhZGVycyAqLworCWNudCA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJaWYgKHNrYl90YWlsX3BvaW50ZXIoc2tiKSAhPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpKQorCQljbnQrKzsKKwlyZXR1cm4gZmxpdHMgKyBzZ2xfbGVuKGNudCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2hhc2hfZGVzYyAqY2hjcl9hbGxvY19zaGFzaCh1bnNpZ25lZCBpbnQgZHMpCit7CisJc3RydWN0IGNyeXB0b19zaGFzaCAqYmFzZV9oYXNoID0gTlVMTDsKKwlzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYzsKKworCXN3aXRjaCAoZHMpIHsKKwljYXNlIFNIQTFfRElHRVNUX1NJWkU6CisJCWJhc2VfaGFzaCA9IGNyeXB0b19hbGxvY19zaGFzaCgic2hhMS1nZW5lcmljIiwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU0hBMjI0X0RJR0VTVF9TSVpFOgorCQliYXNlX2hhc2ggPSBjcnlwdG9fYWxsb2Nfc2hhc2goInNoYTIyNC1nZW5lcmljIiwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU0hBMjU2X0RJR0VTVF9TSVpFOgorCQliYXNlX2hhc2ggPSBjcnlwdG9fYWxsb2Nfc2hhc2goInNoYTI1Ni1nZW5lcmljIiwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU0hBMzg0X0RJR0VTVF9TSVpFOgorCQliYXNlX2hhc2ggPSBjcnlwdG9fYWxsb2Nfc2hhc2goInNoYTM4NC1nZW5lcmljIiwgMCwgMCk7CisJCWJyZWFrOworCWNhc2UgU0hBNTEyX0RJR0VTVF9TSVpFOgorCQliYXNlX2hhc2ggPSBjcnlwdG9fYWxsb2Nfc2hhc2goInNoYTUxMi1nZW5lcmljIiwgMCwgMCk7CisJCWJyZWFrOworCX0KKwlpZiAoSVNfRVJSKGJhc2VfaGFzaCkpIHsKKwkJcHJfZXJyKCJDYW4gbm90IGFsbG9jYXRlIHNoYS1nZW5lcmljIGFsZ28uXG4iKTsKKwkJcmV0dXJuICh2b2lkICopYmFzZV9oYXNoOworCX0KKworCWRlc2MgPSBrbWFsbG9jKHNpemVvZigqZGVzYykgKyBjcnlwdG9fc2hhc2hfZGVzY3NpemUoYmFzZV9oYXNoKSwKKwkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghZGVzYykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZGVzYy0+dGZtID0gYmFzZV9oYXNoOworCWRlc2MtPmZsYWdzID0gY3J5cHRvX3NoYXNoX2dldF9mbGFncyhiYXNlX2hhc2gpOworCXJldHVybiBkZXNjOworfQorCitzdGF0aWMgaW50IGNoY3JfY29tcHV0ZV9wYXJ0aWFsX2hhc2goc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsCisJCQkJICAgICBjaGFyICppb3BhZCwgY2hhciAqcmVzdWx0X2hhc2gsCisJCQkJICAgICBpbnQgZGlnZXN0X3NpemUpCit7CisJc3RydWN0IHNoYTFfc3RhdGUgc2hhMV9zdDsKKwlzdHJ1Y3Qgc2hhMjU2X3N0YXRlIHNoYTI1Nl9zdDsKKwlzdHJ1Y3Qgc2hhNTEyX3N0YXRlIHNoYTUxMl9zdDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoZGlnZXN0X3NpemUgPT0gU0hBMV9ESUdFU1RfU0laRSkgeworCQllcnJvciA9IGNyeXB0b19zaGFzaF9pbml0KGRlc2MpID86CisJCQljcnlwdG9fc2hhc2hfdXBkYXRlKGRlc2MsIGlvcGFkLCBTSEExX0JMT0NLX1NJWkUpID86CisJCQljcnlwdG9fc2hhc2hfZXhwb3J0KGRlc2MsICh2b2lkICopJnNoYTFfc3QpOworCQltZW1jcHkocmVzdWx0X2hhc2gsIHNoYTFfc3Quc3RhdGUsIFNIQTFfRElHRVNUX1NJWkUpOworCX0gZWxzZSBpZiAoZGlnZXN0X3NpemUgPT0gU0hBMjI0X0RJR0VTVF9TSVpFKSB7CisJCWVycm9yID0gY3J5cHRvX3NoYXNoX2luaXQoZGVzYykgPzoKKwkJCWNyeXB0b19zaGFzaF91cGRhdGUoZGVzYywgaW9wYWQsIFNIQTI1Nl9CTE9DS19TSVpFKSA/OgorCQkJY3J5cHRvX3NoYXNoX2V4cG9ydChkZXNjLCAodm9pZCAqKSZzaGEyNTZfc3QpOworCQltZW1jcHkocmVzdWx0X2hhc2gsIHNoYTI1Nl9zdC5zdGF0ZSwgU0hBMjU2X0RJR0VTVF9TSVpFKTsKKworCX0gZWxzZSBpZiAoZGlnZXN0X3NpemUgPT0gU0hBMjU2X0RJR0VTVF9TSVpFKSB7CisJCWVycm9yID0gY3J5cHRvX3NoYXNoX2luaXQoZGVzYykgPzoKKwkJCWNyeXB0b19zaGFzaF91cGRhdGUoZGVzYywgaW9wYWQsIFNIQTI1Nl9CTE9DS19TSVpFKSA/OgorCQkJY3J5cHRvX3NoYXNoX2V4cG9ydChkZXNjLCAodm9pZCAqKSZzaGEyNTZfc3QpOworCQltZW1jcHkocmVzdWx0X2hhc2gsIHNoYTI1Nl9zdC5zdGF0ZSwgU0hBMjU2X0RJR0VTVF9TSVpFKTsKKworCX0gZWxzZSBpZiAoZGlnZXN0X3NpemUgPT0gU0hBMzg0X0RJR0VTVF9TSVpFKSB7CisJCWVycm9yID0gY3J5cHRvX3NoYXNoX2luaXQoZGVzYykgPzoKKwkJCWNyeXB0b19zaGFzaF91cGRhdGUoZGVzYywgaW9wYWQsIFNIQTUxMl9CTE9DS19TSVpFKSA/OgorCQkJY3J5cHRvX3NoYXNoX2V4cG9ydChkZXNjLCAodm9pZCAqKSZzaGE1MTJfc3QpOworCQltZW1jcHkocmVzdWx0X2hhc2gsIHNoYTUxMl9zdC5zdGF0ZSwgU0hBNTEyX0RJR0VTVF9TSVpFKTsKKworCX0gZWxzZSBpZiAoZGlnZXN0X3NpemUgPT0gU0hBNTEyX0RJR0VTVF9TSVpFKSB7CisJCWVycm9yID0gY3J5cHRvX3NoYXNoX2luaXQoZGVzYykgPzoKKwkJCWNyeXB0b19zaGFzaF91cGRhdGUoZGVzYywgaW9wYWQsIFNIQTUxMl9CTE9DS19TSVpFKSA/OgorCQkJY3J5cHRvX3NoYXNoX2V4cG9ydChkZXNjLCAodm9pZCAqKSZzaGE1MTJfc3QpOworCQltZW1jcHkocmVzdWx0X2hhc2gsIHNoYTUxMl9zdC5zdGF0ZSwgU0hBNTEyX0RJR0VTVF9TSVpFKTsKKwl9IGVsc2UgeworCQllcnJvciA9IC1FSU5WQUw7CisJCXByX2VycigiVW5rbm93biBkaWdlc3Qgc2l6ZSAlZFxuIiwgZGlnZXN0X3NpemUpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIGNoY3JfY2hhbmdlX29yZGVyKGNoYXIgKmJ1ZiwgaW50IGRzKQoreworCWludCBpOworCisJaWYgKGRzID09IFNIQTUxMl9ESUdFU1RfU0laRSkgeworCQlmb3IgKGkgPSAwOyBpIDwgKGRzIC8gc2l6ZW9mKHU2NCkpOyBpKyspCisJCQkqKChfX2JlNjQgKilidWYgKyBpKSA9CisJCQkJY3B1X3RvX2JlNjQoKigodTY0ICopYnVmICsgaSkpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAoZHMgLyBzaXplb2YodTMyKSk7IGkrKykKKwkJCSooKF9fYmUzMiAqKWJ1ZiArIGkpID0KKwkJCQljcHVfdG9fYmUzMigqKCh1MzIgKilidWYgKyBpKSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBpc19obWFjKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNyeXB0b19hbGcgKmFsZyA9IHRmbS0+X19jcnRfYWxnOworCXN0cnVjdCBjaGNyX2FsZ190ZW1wbGF0ZSAqY2hjcl9jcnlwdG9fYWxnID0KKwkJY29udGFpbmVyX29mKF9fY3J5cHRvX2FoYXNoX2FsZyhhbGcpLCBzdHJ1Y3QgY2hjcl9hbGdfdGVtcGxhdGUsCisJCQkgICAgIGFsZy5oYXNoKTsKKwlpZiAoKGNoY3JfY3J5cHRvX2FsZy0+dHlwZSAmIENSWVBUT19BTEdfU1VCX1RZUEVfTUFTSykgPT0KKwkgICAgQ1JZUFRPX0FMR19TVUJfVFlQRV9IQVNIX0hNQUMpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjaF9uZW50cyhzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX3NpemUpCit7CisJdW5zaWduZWQgaW50IG5lbnRzOworCisJZm9yIChuZW50cyA9IDAsICp0b3RhbF9zaXplID0gMDsgc2c7IHNnID0gc2dfbmV4dChzZykpIHsKKwkJbmVudHMrKzsKKwkJKnRvdGFsX3NpemUgKz0gc2ctPmxlbmd0aDsKKwl9CisJcmV0dXJuIG5lbnRzOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9waHlzX2NwbChzdHJ1Y3QgY3BsX3J4X3BoeXNfZHNnbCAqcGh5c19jcGwsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJICAgc3RydWN0IHBoeXNfc2dlX3Bhcm0gKnNnX3BhcmFtKQoreworCXN0cnVjdCBwaHlzX3NnZV9wYWlycyAqdG87CisJdW5zaWduZWQgaW50IG91dF9idWZfc2l6ZSA9IHNnX3BhcmFtLT5vYnNpemU7CisJdW5zaWduZWQgaW50IG5lbnRzID0gc2dfcGFyYW0tPm5lbnRzLCBpLCBqLCB0b3RfbGVuID0gMDsKKworCXBoeXNfY3BsLT5vcF90b190aWQgPSBodG9ubChDUExfUlhfUEhZU19EU0dMX09QQ09ERV9WKENQTF9SWF9QSFlTX0RTR0wpCisJCQkJICAgIHwgQ1BMX1JYX1BIWVNfRFNHTF9JU1JETUFfVigwKSk7CisJcGh5c19jcGwtPnBjaXJseG9yZGVyX3RvX25vb2ZzZ2VudHIgPQorCQlodG9ubChDUExfUlhfUEhZU19EU0dMX1BDSVJMWE9SREVSX1YoMCkgfAorCQkgICAgICBDUExfUlhfUEhZU19EU0dMX1BDSU5PU05PT1BfVigwKSB8CisJCSAgICAgIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRFTkJfVigwKSB8CisJCSAgICAgIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRfVigwKSB8CisJCSAgICAgIENQTF9SWF9QSFlTX0RTR0xfRENBSURfVigwKSB8CisJCSAgICAgIENQTF9SWF9QSFlTX0RTR0xfTk9PRlNHRU5UUl9WKG5lbnRzKSk7CisJcGh5c19jcGwtPnJzc19oZHJfaW50Lm9wY29kZSA9IENQTF9SWF9QSFlTX0FERFI7CisJcGh5c19jcGwtPnJzc19oZHJfaW50LnFpZCA9IGh0b25zKHNnX3BhcmFtLT5xaWQpOworCXBoeXNfY3BsLT5yc3NfaGRyX2ludC5oYXNoX3ZhbCA9IDA7CisJdG8gPSAoc3RydWN0IHBoeXNfc2dlX3BhaXJzICopKCh1bnNpZ25lZCBjaGFyICopcGh5c19jcGwgKworCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNwbF9yeF9waHlzX2RzZ2wpKTsKKworCWZvciAoaSA9IDA7IG5lbnRzOyB0bysrKSB7CisJCWZvciAoaiA9IGk7IChuZW50cyAmJiAoaiA8ICg4ICsgaSkpKTsgaisrLCBuZW50cy0tKSB7CisJCQl0by0+bGVuW2pdID0gaHRvbnMoc2ctPmxlbmd0aCk7CisJCQl0by0+YWRkcltqXSA9IGNwdV90b19iZTY0KHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCQlpZiAob3V0X2J1Zl9zaXplKSB7CisJCQkJaWYgKHRvdF9sZW4gKyBzZ19kbWFfbGVuKHNnKSA+PSBvdXRfYnVmX3NpemUpIHsKKwkJCQkJdG8tPmxlbltqXSA9IGh0b25zKG91dF9idWZfc2l6ZSAtCisJCQkJCQkJICAgdG90X2xlbik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkJdG90X2xlbiArPSBzZ19kbWFfbGVuKHNnKTsKKwkJCX0KKwkJCXNnID0gc2dfbmV4dChzZyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQKK2ludCBtYXBfd3JpdGVzZ19waHlzX2NwbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBjcGxfcnhfcGh5c19kc2dsICpwaHlzX2NwbCwKKwkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBzdHJ1Y3QgcGh5c19zZ2VfcGFybSAqc2dfcGFyYW0pCit7CisJaWYgKCFzZyB8fCAhc2dfcGFyYW0tPm5lbnRzKQorCQlyZXR1cm4gMDsKKworCXNnX3BhcmFtLT5uZW50cyA9IGRtYV9tYXBfc2coZGV2LCBzZywgc2dfcGFyYW0tPm5lbnRzLCBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChzZ19wYXJhbS0+bmVudHMgPT0gMCkgeworCQlwcl9lcnIoIkNIQ1IgOiBETUEgbWFwcGluZyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd3JpdGVfcGh5c19jcGwocGh5c19jcGwsIHNnLCBzZ19wYXJhbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9jcnlwdG9hbGdfc3VidHlwZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCXN0cnVjdCBjcnlwdG9fYWxnICphbGcgPSB0Zm0tPl9fY3J0X2FsZzsKKwlzdHJ1Y3QgY2hjcl9hbGdfdGVtcGxhdGUgKmNoY3JfY3J5cHRvX2FsZyA9CisJCWNvbnRhaW5lcl9vZihhbGcsIHN0cnVjdCBjaGNyX2FsZ190ZW1wbGF0ZSwgYWxnLmNyeXB0byk7CisKKwlyZXR1cm4gY2hjcl9jcnlwdG9fYWxnLT50eXBlICYgQ1JZUFRPX0FMR19TVUJfVFlQRV9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlX3NnX2RhdGFfcGFnZV9kZXNjKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCAqZnJhZ3MsCisJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IHBhZ2UgKnNwYWdlOworCXVuc2lnbmVkIGludCBwYWdlX2xlbjsKKworCXNrYi0+bGVuICs9IGNvdW50OworCXNrYi0+ZGF0YV9sZW4gKz0gY291bnQ7CisJc2tiLT50cnVlc2l6ZSArPSBjb3VudDsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWlmIChzZyAmJiAoIShzZy0+bGVuZ3RoKSkpCisJCQlicmVhazsKKwkJc3BhZ2UgPSBzZ19wYWdlKHNnKTsKKwkJZ2V0X3BhZ2Uoc3BhZ2UpOworCQlwYWdlX2xlbiA9IG1pbihzZy0+bGVuZ3RoLCBjb3VudCk7CisJCXNrYl9maWxsX3BhZ2VfZGVzYyhza2IsICpmcmFncywgc3BhZ2UsIHNnLT5vZmZzZXQsIHBhZ2VfbGVuKTsKKwkJKCpmcmFncykrKzsKKwkJY291bnQgLT0gcGFnZV9sZW47CisJCXNnID0gc2dfbmV4dChzZyk7CisJfQorfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX2NvcHlfcnJrZXkoc3RydWN0IGFibGtfY3R4ICphYmxrY3R4LAorCQkJICAgICAgIHN0cnVjdCBfa2V5X2N0eCAqa2V5X2N0eCkKK3sKKwlpZiAoYWJsa2N0eC0+Y2lwaF9tb2RlID09IENIQ1JfU0NNRF9DSVBIRVJfTU9ERV9BRVNfQ0JDKSB7CisJCWdldF9hZXNfZGVjcnlwdF9rZXkoa2V5X2N0eC0+a2V5LCBhYmxrY3R4LT5rZXksCisJCQkJICAgIGFibGtjdHgtPmVuY2tleV9sZW4gPDwgMyk7CisJCW1lbXNldChrZXlfY3R4LT5rZXkgKyBhYmxrY3R4LT5lbmNrZXlfbGVuLCAwLAorCQkgICAgICAgQ0hDUl9BRVNfTUFYX0tFWV9MRU4gLSBhYmxrY3R4LT5lbmNrZXlfbGVuKTsKKwl9IGVsc2UgeworCQltZW1jcHkoa2V5X2N0eC0+a2V5LAorCQkgICAgICAgYWJsa2N0eC0+a2V5ICsgKGFibGtjdHgtPmVuY2tleV9sZW4gPj4gMSksCisJCSAgICAgICBhYmxrY3R4LT5lbmNrZXlfbGVuID4+IDEpOworCQlnZXRfYWVzX2RlY3J5cHRfa2V5KGtleV9jdHgtPmtleSArIChhYmxrY3R4LT5lbmNrZXlfbGVuID4+IDEpLAorCQkJCSAgICBhYmxrY3R4LT5rZXksIGFibGtjdHgtPmVuY2tleV9sZW4gPDwgMik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3JlYXRlX3dyZXEoc3RydWN0IGNoY3JfY29udGV4dCAqY3R4LAorCQkJICAgICAgIHN0cnVjdCBmd19jcnlwdG9fbG9va2FzaWRlX3dyICp3cmVxLAorCQkJICAgICAgIHZvaWQgKnJlcSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBpbnQga2N0eF9sZW4sIGludCBoYXNoX3N6LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBwaHlzX2RzZ2wpCit7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4ID0gVUxEX0NUWChjdHgpOworCXN0cnVjdCB1bHBfdHhwa3QgKnVscHR4ID0gKHN0cnVjdCB1bHBfdHhwa3QgKikod3JlcSArIDEpOworCXN0cnVjdCB1bHB0eF9pZGF0YSAqc2NfaW1tID0gKHN0cnVjdCB1bHB0eF9pZGF0YSAqKSh1bHB0eCArIDEpOworCWludCBpdl9sb2MgPSBJVl9EU0dMOworCWludCBxaWQgPSB1X2N0eC0+bGxkaS5yeHFfaWRzW2N0eC0+dHhfY2hhbm5lbF9pZF07CisJdW5zaWduZWQgaW50IGltbWRhdGFsZW4gPSAwLCBucl9mcmFncyA9IDA7CisKKwlpZiAoaXNfb2ZsZF9pbW0oc2tiKSkgeworCQlpbW1kYXRhbGVuID0gc2tiLT5kYXRhX2xlbjsKKwkJaXZfbG9jID0gSVZfSU1NRURJQVRFOworCX0gZWxzZSB7CisJCW5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwl9CisKKwl3cmVxLT5vcF90b19jY3R4X3NpemUgPSBGSUxMX1dSX09QX0NDVFhfU0laRShpbW1kYXRhbGVuLAorCQkJCQkJICAgICAoa2N0eF9sZW4gPj4gNCkpOworCXdyZXEtPnBsZF9zaXplX2hhc2hfc2l6ZSA9CisJCWh0b25sKEZXX0NSWVBUT19MT09LQVNJREVfV1JfUExEX1NJWkVfVihzZ2xfbGVuZ3Roc1tucl9mcmFnc10pIHwKKwkJICAgICAgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9IQVNIX1NJWkVfVihoYXNoX3N6KSk7CisJd3JlcS0+bGVuMTZfcGtkID0gaHRvbmwoRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MRU4xNl9WKERJVl9ST1VORF9VUCgKKwkJCQkgICAgKGNhbGNfdHhfZmxpdHNfb2ZsZChza2IpICogOCksIDE2KSkpOworCXdyZXEtPmNvb2tpZSA9IGNwdV90b19iZTY0KCh1aW50cHRyX3QpcmVxKTsKKwl3cmVxLT5yeF9jaGlkX3RvX3J4X3FfaWQgPQorCQlGSUxMX1dSX1JYX1FfSUQoY3R4LT5kZXYtPnR4X2NoYW5uZWxfaWQsIHFpZCwKKwkJCQkoaGFzaF9zeikgPyBJVl9OT1AgOiBpdl9sb2MpOworCisJdWxwdHgtPmNtZF9kZXN0ID0gRklMTF9VTFBUWF9DTURfREVTVChjdHgtPmRldi0+dHhfY2hhbm5lbF9pZCk7CisJdWxwdHgtPmxlbiA9IGh0b25sKChESVZfUk9VTkRfVVAoKGNhbGNfdHhfZmxpdHNfb2ZsZChza2IpICogOCksCisJCQkJCSAxNikgLSAoKHNpemVvZigqd3JlcSkpID4+IDQpKSk7CisKKwlzY19pbW0tPmNtZF9tb3JlID0gRklMTF9DTURfTU9SRShpbW1kYXRhbGVuKTsKKwlzY19pbW0tPmxlbiA9IGNwdV90b19iZTMyKHNpemVvZihzdHJ1Y3QgY3BsX3R4X3NlY19wZHUpICsga2N0eF9sZW4gKworCQkJCSAgKChoYXNoX3N6KSA/IERVTU1ZX0JZVEVTIDoKKwkJCQkgIChzaXplb2Yoc3RydWN0IGNwbF9yeF9waHlzX2RzZ2wpICsKKwkJCQkgICBwaHlzX2RzZ2wpKSArIGltbWRhdGFsZW4pOworfQorCisvKioKKyAqCWNyZWF0ZV9jaXBoZXJfd3IgLSBmb3JtIHRoZSBXUiBmb3IgY2lwaGVyIG9wZXJhdGlvbnMKKyAqCUByZXE6IGNpcGhlciByZXEuCisgKglAY3R4OiBjcnlwdG8gZHJpdmVyIGNvbnRleHQgb2YgdGhlIHJlcXVlc3QuCisgKglAcWlkOiBpbmdyZXNzIHFpZCB3aGVyZSByZXNwb25zZSBvZiB0aGlzIFdSIHNob3VsZCBiZSByZWNlaXZlZC4KKyAqCUBvcF90eXBlOgllbmNyeXB0aW9uIG9yIGRlY3J5cHRpb24KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmCisqY3JlYXRlX2NpcGhlcl93cihzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKnJlcV9iYXNlLAorCQkgIHN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCwgdW5zaWduZWQgc2hvcnQgcWlkLAorCQkgIHVuc2lnbmVkIHNob3J0IG9wX3R5cGUpCit7CisJc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxID0gKHN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKilyZXFfYmFzZTsKKwlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbSA9IGNyeXB0b19hYmxrY2lwaGVyX3JlcXRmbShyZXEpOworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eCA9IFVMRF9DVFgoY3R4KTsKKwlzdHJ1Y3QgYWJsa19jdHggKmFibGtjdHggPSBBQkxLX0NUWChjdHgpOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBfa2V5X2N0eCAqa2V5X2N0eDsKKwlzdHJ1Y3QgZndfY3J5cHRvX2xvb2thc2lkZV93ciAqd3JlcTsKKwlzdHJ1Y3QgY3BsX3R4X3NlY19wZHUgKnNlY19jcGw7CisJc3RydWN0IGNwbF9yeF9waHlzX2RzZ2wgKnBoeXNfY3BsOworCXN0cnVjdCBjaGNyX2Jsa2NpcGhlcl9yZXFfY3R4ICpyZXFfY3R4ID0gYWJsa2NpcGhlcl9yZXF1ZXN0X2N0eChyZXEpOworCXN0cnVjdCBwaHlzX3NnZV9wYXJtIHNnX3BhcmFtOworCXVuc2lnbmVkIGludCBmcmFncyA9IDAsIHRyYW5zaGRyX2xlbiwgcGh5c19kc2dsLCBkc3RfYnVmc2l6ZSA9IDA7CisJdW5zaWduZWQgaW50IGl2c2l6ZSA9IGNyeXB0b19hYmxrY2lwaGVyX2l2c2l6ZSh0Zm0pLCBrY3R4X2xlbjsKKworCWlmICghcmVxLT5pbmZvKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlhYmxrY3R4LT5kc3RfbmVudHMgPSBjaF9uZW50cyhyZXEtPmRzdCwgJmRzdF9idWZzaXplKTsKKwlhYmxrY3R4LT5lbmMgPSBvcF90eXBlOworCisJaWYgKChhYmxrY3R4LT5lbmNrZXlfbGVuID09IDApIHx8IChpdnNpemUgPiBBRVNfQkxPQ0tfU0laRSkgfHwKKwkgICAgKHJlcS0+bmJ5dGVzIDw9IDApIHx8IChyZXEtPm5ieXRlcyAlIEFFU19CTE9DS19TSVpFKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlwaHlzX2RzZ2wgPSBnZXRfc3BhY2VfZm9yX3BoeXNfZHNnbChhYmxrY3R4LT5kc3RfbmVudHMpOworCisJa2N0eF9sZW4gPSBzaXplb2YoKmtleV9jdHgpICsKKwkJKERJVl9ST1VORF9VUChhYmxrY3R4LT5lbmNrZXlfbGVuLCAxNikgKiAxNik7CisJdHJhbnNoZHJfbGVuID0gQ0lQSEVSX1RSQU5TSERSX1NJWkUoa2N0eF9sZW4sIHBoeXNfZHNnbCk7CisJc2tiID0gYWxsb2Nfc2tiKCh0cmFuc2hkcl9sZW4gKyBzaXplb2Yoc3RydWN0IHNnZV9vcGFxdWVfaGRyKSksCisJCQlHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJc2tiX3Jlc2VydmUoc2tiLCBzaXplb2Yoc3RydWN0IHNnZV9vcGFxdWVfaGRyKSk7CisJd3JlcSA9IChzdHJ1Y3QgZndfY3J5cHRvX2xvb2thc2lkZV93ciAqKV9fc2tiX3B1dChza2IsIHRyYW5zaGRyX2xlbik7CisKKwlzZWNfY3BsID0gKHN0cnVjdCBjcGxfdHhfc2VjX3BkdSAqKSgodTggKil3cmVxICsgU0VDX0NQTF9PRkZTRVQpOworCXNlY19jcGwtPm9wX2l2aW5zcnRvZnN0ID0KKwkJRklMTF9TRUNfQ1BMX09QX0lWSU5TUihjdHgtPmRldi0+dHhfY2hhbm5lbF9pZCwgMiwgMSwgMSk7CisKKwlzZWNfY3BsLT5wbGRsZW4gPSBodG9ubChpdnNpemUgKyByZXEtPm5ieXRlcyk7CisJc2VjX2NwbC0+YWFkc3RhcnRfY2lwaGVyc3RvcF9oaSA9IEZJTExfU0VDX0NQTF9DSVBIRVJTVE9QX0hJKDAsIDAsCisJCQkJCQkJCWl2c2l6ZSArIDEsIDApOworCisJc2VjX2NwbC0+Y2lwaGVyc3RvcF9sb19hdXRoaW5zZXJ0ID0gIEZJTExfU0VDX0NQTF9BVVRISU5TRVJUKDAsIDAsCisJCQkJCQkJCSAgICAgMCwgMCk7CisJc2VjX2NwbC0+c2Vxbm9fbnVtaXZzID0gRklMTF9TRUNfQ1BMX1NDTUQwX1NFUU5PKG9wX3R5cGUsIDAsCisJCQkJCQkJIGFibGtjdHgtPmNpcGhfbW9kZSwKKwkJCQkJCQkgMCwgMCwgaXZzaXplID4+IDEsIDEpOworCXNlY19jcGwtPml2Z2VuX2hkcmxlbiA9IEZJTExfU0VDX0NQTF9JVkdFTl9IRFJMRU4oMCwgMCwgMCwKKwkJCQkJCQkgIDAsIDEsIHBoeXNfZHNnbCk7CisKKwlrZXlfY3R4ID0gKHN0cnVjdCBfa2V5X2N0eCAqKSgodTggKilzZWNfY3BsICsgc2l6ZW9mKCpzZWNfY3BsKSk7CisJa2V5X2N0eC0+Y3R4X2hkciA9IGFibGtjdHgtPmtleV9jdHhfaGRyOworCWlmIChvcF90eXBlID09IENIQ1JfREVDUllQVF9PUCkgeworCQlpZiAoZ2VuZXJhdGVfY29weV9ycmtleShhYmxrY3R4LCBrZXlfY3R4KSkKKwkJCWdvdG8gbWFwX2ZhaWwxOworCX0gZWxzZSB7CisJCWlmIChhYmxrY3R4LT5jaXBoX21vZGUgPT0gQ0hDUl9TQ01EX0NJUEhFUl9NT0RFX0FFU19DQkMpIHsKKwkJCW1lbWNweShrZXlfY3R4LT5rZXksIGFibGtjdHgtPmtleSwgYWJsa2N0eC0+ZW5ja2V5X2xlbik7CisJCX0gZWxzZSB7CisJCQltZW1jcHkoa2V5X2N0eC0+a2V5LCBhYmxrY3R4LT5rZXkgKworCQkJICAgICAgIChhYmxrY3R4LT5lbmNrZXlfbGVuID4+IDEpLAorCQkJICAgICAgIGFibGtjdHgtPmVuY2tleV9sZW4gPj4gMSk7CisJCQltZW1jcHkoa2V5X2N0eC0+a2V5ICsKKwkJCSAgICAgICAoYWJsa2N0eC0+ZW5ja2V5X2xlbiA+PiAxKSwKKwkJCSAgICAgICBhYmxrY3R4LT5rZXksCisJCQkgICAgICAgYWJsa2N0eC0+ZW5ja2V5X2xlbiA+PiAxKTsKKwkJfQorCX0KKwlwaHlzX2NwbCA9IChzdHJ1Y3QgY3BsX3J4X3BoeXNfZHNnbCAqKSgodTggKilrZXlfY3R4ICsga2N0eF9sZW4pOworCisJbWVtY3B5KGFibGtjdHgtPml2LCByZXEtPmluZm8sIGl2c2l6ZSk7CisJc2dfaW5pdF90YWJsZSgmYWJsa2N0eC0+aXZfc2csIDEpOworCXNnX3NldF9idWYoJmFibGtjdHgtPml2X3NnLCBhYmxrY3R4LT5pdiwgaXZzaXplKTsKKwlzZ19wYXJhbS5uZW50cyA9IGFibGtjdHgtPmRzdF9uZW50czsKKwlzZ19wYXJhbS5vYnNpemUgPSBkc3RfYnVmc2l6ZTsKKwlzZ19wYXJhbS5xaWQgPSBxaWQ7CisJc2dfcGFyYW0uYWxpZ24gPSAxOworCWlmIChtYXBfd3JpdGVzZ19waHlzX2NwbCgmdV9jdHgtPmxsZGkucGRldi0+ZGV2LCBwaHlzX2NwbCwgcmVxLT5kc3QsCisJCQkJICZzZ19wYXJhbSkpCisJCWdvdG8gbWFwX2ZhaWwxOworCisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgdHJhbnNoZHJfbGVuKTsKKwl3cml0ZV9zZ19kYXRhX3BhZ2VfZGVzYyhza2IsICZmcmFncywgJmFibGtjdHgtPml2X3NnLCBpdnNpemUpOworCXdyaXRlX3NnX2RhdGFfcGFnZV9kZXNjKHNrYiwgJmZyYWdzLCByZXEtPnNyYywgcmVxLT5uYnl0ZXMpOworCWNyZWF0ZV93cmVxKGN0eCwgd3JlcSwgcmVxLCBza2IsIGtjdHhfbGVuLCAwLCBwaHlzX2RzZ2wpOworCXJlcV9jdHgtPnNrYiA9IHNrYjsKKwlza2JfZ2V0KHNrYik7CisJcmV0dXJuIHNrYjsKK21hcF9mYWlsMToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KKworc3RhdGljIGludCBjaGNyX2Flc19jYmNfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtLCBjb25zdCB1OCAqa2V5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX2FibGtjaXBoZXJfY3R4KHRmbSk7CisJc3RydWN0IGFibGtfY3R4ICphYmxrY3R4ID0gQUJMS19DVFgoY3R4KTsKKwlzdHJ1Y3QgYWJsa2NpcGhlcl9hbGcgKmFsZyA9IGNyeXB0b19hYmxrY2lwaGVyX2FsZyh0Zm0pOworCXVuc2lnbmVkIGludCBja19zaXplLCBjb250ZXh0X3NpemU7CisJdTE2IGFsaWdubWVudCA9IDA7CisKKwlpZiAoKGtleWxlbiA8IGFsZy0+bWluX2tleXNpemUpIHx8IChrZXlsZW4gPiBhbGctPm1heF9rZXlzaXplKSkKKwkJZ290byBiYWRrZXlfZXJyOworCisJbWVtY3B5KGFibGtjdHgtPmtleSwga2V5LCBrZXlsZW4pOworCWFibGtjdHgtPmVuY2tleV9sZW4gPSBrZXlsZW47CisJaWYgKGtleWxlbiA9PSBBRVNfS0VZU0laRV8xMjgpIHsKKwkJY2tfc2l6ZSA9IENIQ1JfS0VZQ1RYX0NJUEhFUl9LRVlfU0laRV8xMjg7CisJfSBlbHNlIGlmIChrZXlsZW4gPT0gQUVTX0tFWVNJWkVfMTkyKSB7CisJCWFsaWdubWVudCA9IDg7CisJCWNrX3NpemUgPSBDSENSX0tFWUNUWF9DSVBIRVJfS0VZX1NJWkVfMTkyOworCX0gZWxzZSBpZiAoa2V5bGVuID09IEFFU19LRVlTSVpFXzI1NikgeworCQlja19zaXplID0gQ0hDUl9LRVlDVFhfQ0lQSEVSX0tFWV9TSVpFXzI1NjsKKwl9IGVsc2UgeworCQlnb3RvIGJhZGtleV9lcnI7CisJfQorCisJY29udGV4dF9zaXplID0gKEtFWV9DT05URVhUX0hEUl9TQUxUX0FORF9QQUQgKworCQkJa2V5bGVuICsgYWxpZ25tZW50KSA+PiA0OworCisJYWJsa2N0eC0+a2V5X2N0eF9oZHIgPSBGSUxMX0tFWV9DVFhfSERSKGNrX3NpemUsIENIQ1JfS0VZQ1RYX05PX0tFWSwKKwkJCQkJCTAsIDAsIGNvbnRleHRfc2l6ZSk7CisJYWJsa2N0eC0+Y2lwaF9tb2RlID0gQ0hDUl9TQ01EX0NJUEhFUl9NT0RFX0FFU19DQkM7CisJcmV0dXJuIDA7CitiYWRrZXlfZXJyOgorCWNyeXB0b19hYmxrY2lwaGVyX3NldF9mbGFncyh0Zm0sIENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOKTsKKwlhYmxrY3R4LT5lbmNrZXlfbGVuID0gMDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBjeGdiNF9pc19jcnlwdG9fcV9mdWxsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpZHgpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNnZV9vZmxkX3R4cSAqcTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG5ldGRldjJhZGFwKGRldik7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJcSA9ICZhZGFwLT5zZ2Uub2ZsZHR4cVtpZHhdOworCXNwaW5fbG9jaygmcS0+c2VuZHEubG9jayk7CisJaWYgKHEtPmZ1bGwpCisJCXJldCA9IC0xOworCXNwaW5fdW5sb2NrKCZxLT5zZW5kcS5sb2NrKTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNoY3JfYWVzX2VuY3J5cHQoc3RydWN0IGFibGtjaXBoZXJfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtID0gY3J5cHRvX2FibGtjaXBoZXJfcmVxdGZtKHJlcSk7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX2FibGtjaXBoZXJfY3R4KHRmbSk7CisJc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXFfYmFzZSA9ICZyZXEtPmJhc2U7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4ID0gVUxEX0NUWChjdHgpOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAodW5saWtlbHkoY3hnYjRfaXNfY3J5cHRvX3FfZnVsbCh1X2N0eC0+bGxkaS5wb3J0c1swXSwKKwkJCQkJICAgIGN0eC0+dHhfY2hhbm5lbF9pZCkpKSB7CisJCWlmICghKHJlcS0+YmFzZS5mbGFncyAmIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HKSkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCisJc2tiID0gY3JlYXRlX2NpcGhlcl93cihyZXFfYmFzZSwgY3R4LAorCQkJICAgICAgIHVfY3R4LT5sbGRpLnJ4cV9pZHNbY3R4LT50eF9jaGFubmVsX2lkXSwKKwkJCSAgICAgICBDSENSX0VOQ1JZUFRfT1ApOworCWlmIChJU19FUlIoc2tiKSkgeworCQlwcl9lcnIoImNoY3IgOiAlcyA6IEZhaWxlZCB0byBmb3JtIFdSLiBObyBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuICBQVFJfRVJSKHNrYik7CisJfQorCXNrYi0+ZGV2ID0gdV9jdHgtPmxsZGkucG9ydHNbMF07CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjdHgtPnR4X2NoYW5uZWxfaWQpOworCWNoY3Jfc2VuZF93cihza2IpOworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9hZXNfZGVjcnlwdChzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICp0Zm0gPSBjcnlwdG9fYWJsa2NpcGhlcl9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fYWJsa2NpcGhlcl9jdHgodGZtKTsKKwlzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKnJlcV9iYXNlID0gJnJlcS0+YmFzZTsKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSBVTERfQ1RYKGN0eCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmICh1bmxpa2VseShjeGdiNF9pc19jcnlwdG9fcV9mdWxsKHVfY3R4LT5sbGRpLnBvcnRzWzBdLAorCQkJCQkgICAgY3R4LT50eF9jaGFubmVsX2lkKSkpIHsKKwkJaWYgKCEocmVxLT5iYXNlLmZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0cpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlza2IgPSBjcmVhdGVfY2lwaGVyX3dyKHJlcV9iYXNlLCBjdHgsIHVfY3R4LT5sbGRpLnJ4cV9pZHNbMF0sCisJCQkgICAgICAgQ0hDUl9ERUNSWVBUX09QKTsKKwlpZiAoSVNfRVJSKHNrYikpIHsKKwkJcHJfZXJyKCJjaGNyIDogJXMgOiBGYWlsZWQgdG8gZm9ybSBXUi4gTm8gbWVtb3J5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBQVFJfRVJSKHNrYik7CisJfQorCXNrYi0+ZGV2ID0gdV9jdHgtPmxsZGkucG9ydHNbMF07CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjdHgtPnR4X2NoYW5uZWxfaWQpOworCWNoY3Jfc2VuZF93cihza2IpOworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9kZXZpY2VfaW5pdChzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4OworCXVuc2lnbmVkIGludCBpZDsKKwlpbnQgZXJyID0gMCwgcnhxX3BlcmNoYW4sIHJ4cV9pZHg7CisKKwlpZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAoIWN0eC0+ZGV2KSB7CisJCWVyciA9IGFzc2lnbl9jaGNyX2RldmljZSgmY3R4LT5kZXYpOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoImNoY3IgZGV2aWNlIGFzc2lnbm1lbnQgZmFpbHNcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJdV9jdHggPSBVTERfQ1RYKGN0eCk7CisJCXJ4cV9wZXJjaGFuID0gdV9jdHgtPmxsZGkubnJ4cSAvIHVfY3R4LT5sbGRpLm5jaGFuOworCQljdHgtPmRldi0+dHhfY2hhbm5lbF9pZCA9IDA7CisJCXJ4cV9pZHggPSBjdHgtPmRldi0+dHhfY2hhbm5lbF9pZCAqIHJ4cV9wZXJjaGFuOworCQlyeHFfaWR4ICs9IGlkICUgcnhxX3BlcmNoYW47CisJCXNwaW5fbG9jaygmY3R4LT5kZXYtPmxvY2tfY2hjcl9kZXYpOworCQljdHgtPnR4X2NoYW5uZWxfaWQgPSByeHFfaWR4OworCQlzcGluX3VubG9jaygmY3R4LT5kZXYtPmxvY2tfY2hjcl9kZXYpOworCX0KK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNoY3JfY3JhX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwl0Zm0tPmNydF9hYmxrY2lwaGVyLnJlcXNpemUgPSAgc2l6ZW9mKHN0cnVjdCBjaGNyX2Jsa2NpcGhlcl9yZXFfY3R4KTsKKwlyZXR1cm4gY2hjcl9kZXZpY2VfaW5pdChjcnlwdG9fdGZtX2N0eCh0Zm0pKTsKK30KKworc3RhdGljIGludCBnZXRfYWxnX2NvbmZpZyhzdHJ1Y3QgYWxnb19wYXJhbSAqcGFyYW1zLAorCQkJICB1bnNpZ25lZCBpbnQgYXV0aF9zaXplKQoreworCXN3aXRjaCAoYXV0aF9zaXplKSB7CisJY2FzZSBTSEExX0RJR0VTVF9TSVpFOgorCQlwYXJhbXMtPm1rX3NpemUgPSBDSENSX0tFWUNUWF9NQUNfS0VZX1NJWkVfMTYwOworCQlwYXJhbXMtPmF1dGhfbW9kZSA9IENIQ1JfU0NNRF9BVVRIX01PREVfU0hBMTsKKwkJcGFyYW1zLT5yZXN1bHRfc2l6ZSA9IFNIQTFfRElHRVNUX1NJWkU7CisJCWJyZWFrOworCWNhc2UgU0hBMjI0X0RJR0VTVF9TSVpFOgorCQlwYXJhbXMtPm1rX3NpemUgPSBDSENSX0tFWUNUWF9NQUNfS0VZX1NJWkVfMjU2OworCQlwYXJhbXMtPmF1dGhfbW9kZSA9IENIQ1JfU0NNRF9BVVRIX01PREVfU0hBMjI0OworCQlwYXJhbXMtPnJlc3VsdF9zaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFOworCQlicmVhazsKKwljYXNlIFNIQTI1Nl9ESUdFU1RfU0laRToKKwkJcGFyYW1zLT5ta19zaXplID0gQ0hDUl9LRVlDVFhfTUFDX0tFWV9TSVpFXzI1NjsKKwkJcGFyYW1zLT5hdXRoX21vZGUgPSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTI1NjsKKwkJcGFyYW1zLT5yZXN1bHRfc2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBTSEEzODRfRElHRVNUX1NJWkU6CisJCXBhcmFtcy0+bWtfc2l6ZSA9IENIQ1JfS0VZQ1RYX01BQ19LRVlfU0laRV81MTI7CisJCXBhcmFtcy0+YXV0aF9tb2RlID0gQ0hDUl9TQ01EX0FVVEhfTU9ERV9TSEE1MTJfMzg0OworCQlwYXJhbXMtPnJlc3VsdF9zaXplID0gU0hBNTEyX0RJR0VTVF9TSVpFOworCQlicmVhazsKKwljYXNlIFNIQTUxMl9ESUdFU1RfU0laRToKKwkJcGFyYW1zLT5ta19zaXplID0gQ0hDUl9LRVlDVFhfTUFDX0tFWV9TSVpFXzUxMjsKKwkJcGFyYW1zLT5hdXRoX21vZGUgPSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTUxMl81MTI7CisJCXBhcmFtcy0+cmVzdWx0X3NpemUgPSBTSEE1MTJfRElHRVNUX1NJWkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiY2hjciA6IEVSUk9SLCB1bnN1cHBvcnRlZCBkaWdlc3Qgc2l6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3dyaXRlX2J1ZmZlcl9kYXRhX3BhZ2VfZGVzYyhzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4ICpyZXFfY3R4LAorCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCAqZnJhZ3MsIGNoYXIgKmJmciwKKwkJCSAgICB1OCBiZnJfbGVuKQoreworCXZvaWQgKnBhZ2VfcHRyID0gTlVMTDsKKworCXNrYi0+bGVuICs9IGJmcl9sZW47CisJc2tiLT5kYXRhX2xlbiArPSBiZnJfbGVuOworCXNrYi0+dHJ1ZXNpemUgKz0gYmZyX2xlbjsKKwlwYWdlX3B0ciA9IGttYWxsb2MoQ0hDUl9IQVNIX01BWF9CTE9DS19TSVpFXzEyOCwgR0ZQX0FUT01JQyB8IEdGUF9ETUEpOworCWlmICghcGFnZV9wdHIpCisJCXJldHVybiAtRU5PTUVNOworCWdldF9wYWdlKHZpcnRfdG9fcGFnZShwYWdlX3B0cikpOworCXJlcV9jdHgtPmR1bW15X3BheWxvYWRfcHRyID0gcGFnZV9wdHI7CisJbWVtY3B5KHBhZ2VfcHRyLCBiZnIsIGJmcl9sZW4pOworCXNrYl9maWxsX3BhZ2VfZGVzYyhza2IsICpmcmFncywgdmlydF90b19wYWdlKHBhZ2VfcHRyKSwKKwkJCSAgIG9mZnNldF9pbl9wYWdlKHBhZ2VfcHRyKSwgYmZyX2xlbik7CisJKCpmcmFncykrKzsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgljcmVhdGVfZmluYWxfaGFzaF93ciAtIENyZWF0ZSBoYXNoIHdvcmsgcmVxdWVzdAorICoJQHJlcSAtIENpcGhlciByZXEgYmFzZQorICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNyZWF0ZV9maW5hbF9oYXNoX3dyKHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEsCisJCQkJCSAgICBzdHJ1Y3QgaGFzaF93cl9wYXJhbSAqcGFyYW0pCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b190Zm1fY3R4KGNyeXB0b19haGFzaF90Zm0odGZtKSk7CisJc3RydWN0IGhtYWNfY3R4ICpobWFjY3R4ID0gSE1BQ19DVFgoY3R4KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3QgX2tleV9jdHggKmtleV9jdHg7CisJc3RydWN0IGZ3X2NyeXB0b19sb29rYXNpZGVfd3IgKndyZXE7CisJc3RydWN0IGNwbF90eF9zZWNfcGR1ICpzZWNfY3BsOworCXVuc2lnbmVkIGludCBmcmFncyA9IDAsIHRyYW5zaGRyX2xlbiwgaW9wYWRfYWxpZ25tZW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgZGlnZXN0c2l6ZSA9IGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHRmbSk7CisJdW5zaWduZWQgaW50IGtjdHhfbGVuID0gc2l6ZW9mKCprZXlfY3R4KTsKKwl1OCBoYXNoX3NpemVfaW5fcmVzcG9uc2UgPSAwOworCisJaW9wYWRfYWxpZ25tZW50ID0gS0VZQ1RYX0FMSUdOX1BBRChkaWdlc3RzaXplKTsKKwlrY3R4X2xlbiArPSBwYXJhbS0+YWxnX3BybS5yZXN1bHRfc2l6ZSArIGlvcGFkX2FsaWdubWVudDsKKwlpZiAocGFyYW0tPm9wYWRfbmVlZGVkKQorCQlrY3R4X2xlbiArPSBwYXJhbS0+YWxnX3BybS5yZXN1bHRfc2l6ZSArIGlvcGFkX2FsaWdubWVudDsKKworCWlmIChyZXFfY3R4LT5yZXN1bHQpCisJCWhhc2hfc2l6ZV9pbl9yZXNwb25zZSA9IGRpZ2VzdHNpemU7CisJZWxzZQorCQloYXNoX3NpemVfaW5fcmVzcG9uc2UgPSBwYXJhbS0+YWxnX3BybS5yZXN1bHRfc2l6ZTsKKwl0cmFuc2hkcl9sZW4gPSBIQVNIX1RSQU5TSERSX1NJWkUoa2N0eF9sZW4pOworCXNrYiA9IGFsbG9jX3NrYigodHJhbnNoZHJfbGVuICsgc2l6ZW9mKHN0cnVjdCBzZ2Vfb3BhcXVlX2hkcikpLAorCQkJR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybiBza2I7CisKKwlza2JfcmVzZXJ2ZShza2IsIHNpemVvZihzdHJ1Y3Qgc2dlX29wYXF1ZV9oZHIpKTsKKwl3cmVxID0gKHN0cnVjdCBmd19jcnlwdG9fbG9va2FzaWRlX3dyICopX19za2JfcHV0KHNrYiwgdHJhbnNoZHJfbGVuKTsKKwltZW1zZXQod3JlcSwgMCwgdHJhbnNoZHJfbGVuKTsKKworCXNlY19jcGwgPSAoc3RydWN0IGNwbF90eF9zZWNfcGR1ICopKCh1OCAqKXdyZXEgKyBTRUNfQ1BMX09GRlNFVCk7CisJc2VjX2NwbC0+b3BfaXZpbnNydG9mc3QgPQorCQlGSUxMX1NFQ19DUExfT1BfSVZJTlNSKGN0eC0+ZGV2LT50eF9jaGFubmVsX2lkLCAyLCAwLCAwKTsKKwlzZWNfY3BsLT5wbGRsZW4gPSBodG9ubChwYXJhbS0+YmZyX2xlbiArIHBhcmFtLT5zZ19sZW4pOworCisJc2VjX2NwbC0+YWFkc3RhcnRfY2lwaGVyc3RvcF9oaSA9CisJCUZJTExfU0VDX0NQTF9DSVBIRVJTVE9QX0hJKDAsIDAsIDAsIDApOworCXNlY19jcGwtPmNpcGhlcnN0b3BfbG9fYXV0aGluc2VydCA9CisJCUZJTExfU0VDX0NQTF9BVVRISU5TRVJUKDAsIDEsIDAsIDApOworCXNlY19jcGwtPnNlcW5vX251bWl2cyA9CisJCUZJTExfU0VDX0NQTF9TQ01EMF9TRVFOTygwLCAwLCAwLCBwYXJhbS0+YWxnX3BybS5hdXRoX21vZGUsCisJCQkJCSBwYXJhbS0+b3BhZF9uZWVkZWQsIDAsIDApOworCisJc2VjX2NwbC0+aXZnZW5faGRybGVuID0KKwkJRklMTF9TRUNfQ1BMX0lWR0VOX0hEUkxFTihwYXJhbS0+bGFzdCwgcGFyYW0tPm1vcmUsIDAsIDEsIDAsIDApOworCisJa2V5X2N0eCA9IChzdHJ1Y3QgX2tleV9jdHggKikoKHU4ICopc2VjX2NwbCArIHNpemVvZigqc2VjX2NwbCkpOworCW1lbWNweShrZXlfY3R4LT5rZXksIHJlcV9jdHgtPnBhcnRpYWxfaGFzaCwgcGFyYW0tPmFsZ19wcm0ucmVzdWx0X3NpemUpOworCisJaWYgKHBhcmFtLT5vcGFkX25lZWRlZCkKKwkJbWVtY3B5KGtleV9jdHgtPmtleSArICgocGFyYW0tPmFsZ19wcm0ucmVzdWx0X3NpemUgPD0gMzIpID8gMzIgOgorCQkJCSAgICAgICBDSENSX0hBU0hfTUFYX0RJR0VTVF9TSVpFKSwKKwkJICAgICAgIGhtYWNjdHgtPm9wYWQsIHBhcmFtLT5hbGdfcHJtLnJlc3VsdF9zaXplKTsKKworCWtleV9jdHgtPmN0eF9oZHIgPSBGSUxMX0tFWV9DVFhfSERSKENIQ1JfS0VZQ1RYX05PX0tFWSwKKwkJCQkJICAgIHBhcmFtLT5hbGdfcHJtLm1rX3NpemUsIDAsCisJCQkJCSAgICBwYXJhbS0+b3BhZF9uZWVkZWQsCisJCQkJCSAgICAoa2N0eF9sZW4gPj4gNCkpOworCXNlY19jcGwtPnNjbWQxID0gY3B1X3RvX2JlNjQoKHU2NClwYXJhbS0+c2NtZDEpOworCisJc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKHNrYiwgdHJhbnNoZHJfbGVuKTsKKwlpZiAocGFyYW0tPmJmcl9sZW4gIT0gMCkKKwkJd3JpdGVfYnVmZmVyX2RhdGFfcGFnZV9kZXNjKHJlcV9jdHgsIHNrYiwgJmZyYWdzLCByZXFfY3R4LT5iZnIsCisJCQkJCSAgICBwYXJhbS0+YmZyX2xlbik7CisJaWYgKHBhcmFtLT5zZ19sZW4gIT0gMCkKKwkJd3JpdGVfc2dfZGF0YV9wYWdlX2Rlc2Moc2tiLCAmZnJhZ3MsIHJlcS0+c3JjLCBwYXJhbS0+c2dfbGVuKTsKKworCWNyZWF0ZV93cmVxKGN0eCwgd3JlcSwgcmVxLCBza2IsIGtjdHhfbGVuLCBoYXNoX3NpemVfaW5fcmVzcG9uc2UsCisJCSAgICAwKTsKKwlyZXFfY3R4LT5za2IgPSBza2I7CisJc2tiX2dldChza2IpOworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9haGFzaF91cGRhdGUoc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4ICpyZXFfY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKKwlzdHJ1Y3QgY3J5cHRvX2FoYXNoICpydGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b190Zm1fY3R4KGNyeXB0b19haGFzaF90Zm0ocnRmbSkpOworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eCA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCByZW1haW5kZXIgPSAwLCBiczsKKwl1bnNpZ25lZCBpbnQgbmJ5dGVzID0gcmVxLT5uYnl0ZXM7CisJc3RydWN0IGhhc2hfd3JfcGFyYW0gcGFyYW1zOworCisJYnMgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2FoYXNoX3RmbShydGZtKSk7CisKKwl1X2N0eCA9IFVMRF9DVFgoY3R4KTsKKwlpZiAodW5saWtlbHkoY3hnYjRfaXNfY3J5cHRvX3FfZnVsbCh1X2N0eC0+bGxkaS5wb3J0c1swXSwKKwkJCQkJICAgIGN0eC0+dHhfY2hhbm5lbF9pZCkpKSB7CisJCWlmICghKHJlcS0+YmFzZS5mbGFncyAmIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HKSkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKG5ieXRlcyArIHJlcV9jdHgtPmJmcl9sZW4gPj0gYnMpIHsKKwkJcmVtYWluZGVyID0gKG5ieXRlcyArIHJlcV9jdHgtPmJmcl9sZW4pICUgYnM7CisJCW5ieXRlcyA9IG5ieXRlcyArIHJlcV9jdHgtPmJmcl9sZW4gLSByZW1haW5kZXI7CisJfSBlbHNlIHsKKwkJc2dfcGNvcHlfdG9fYnVmZmVyKHJlcS0+c3JjLCBzZ19uZW50cyhyZXEtPnNyYyksIHJlcV9jdHgtPmJmciArCisJCQkJICAgcmVxX2N0eC0+YmZyX2xlbiwgbmJ5dGVzLCAwKTsKKwkJcmVxX2N0eC0+YmZyX2xlbiArPSBuYnl0ZXM7CisJCXJldHVybiAwOworCX0KKworCXBhcmFtcy5vcGFkX25lZWRlZCA9IDA7CisJcGFyYW1zLm1vcmUgPSAxOworCXBhcmFtcy5sYXN0ID0gMDsKKwlwYXJhbXMuc2dfbGVuID0gbmJ5dGVzIC0gcmVxX2N0eC0+YmZyX2xlbjsKKwlwYXJhbXMuYmZyX2xlbiA9IHJlcV9jdHgtPmJmcl9sZW47CisJcGFyYW1zLnNjbWQxID0gMDsKKwlnZXRfYWxnX2NvbmZpZygmcGFyYW1zLmFsZ19wcm0sIGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHJ0Zm0pKTsKKwlyZXFfY3R4LT5yZXN1bHQgPSAwOworCXJlcV9jdHgtPmRhdGFfbGVuICs9IHBhcmFtcy5zZ19sZW4gKyBwYXJhbXMuYmZyX2xlbjsKKwlza2IgPSBjcmVhdGVfZmluYWxfaGFzaF93cihyZXEsICZwYXJhbXMpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcV9jdHgtPmJmcl9sZW4gPSByZW1haW5kZXI7CisJaWYgKHJlbWFpbmRlcikKKwkJc2dfcGNvcHlfdG9fYnVmZmVyKHJlcS0+c3JjLCBzZ19uZW50cyhyZXEtPnNyYyksCisJCQkJICAgcmVxX2N0eC0+YmZyLCByZW1haW5kZXIsIHJlcS0+bmJ5dGVzIC0KKwkJCQkgICByZW1haW5kZXIpOworCXNrYi0+ZGV2ID0gdV9jdHgtPmxsZGkucG9ydHNbMF07CisJc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjdHgtPnR4X2NoYW5uZWxfaWQpOworCWNoY3Jfc2VuZF93cihza2IpOworCisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlX2xhc3RfaGFzaF9ibG9jayhjaGFyICpiZnJfcHRyLCB1bnNpZ25lZCBpbnQgYnMsIHU2NCBzY21kMSkKK3sKKwltZW1zZXQoYmZyX3B0ciwgMCwgYnMpOworCSpiZnJfcHRyID0gMHg4MDsKKwlpZiAoYnMgPT0gNjQpCisJCSooX19iZTY0ICopKGJmcl9wdHIgKyA1NikgPSBjcHVfdG9fYmU2NChzY21kMSAgPDwgMyk7CisJZWxzZQorCQkqKF9fYmU2NCAqKShiZnJfcHRyICsgMTIwKSA9ICBjcHVfdG9fYmU2NChzY21kMSAgPDwgMyk7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9haGFzaF9maW5hbChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnJlcV9jdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCXN0cnVjdCBjcnlwdG9fYWhhc2ggKnJ0Zm0gPSBjcnlwdG9fYWhhc2hfcmVxdGZtKHJlcSk7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoY3J5cHRvX2FoYXNoX3RmbShydGZtKSk7CisJc3RydWN0IGhhc2hfd3JfcGFyYW0gcGFyYW1zOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4ID0gTlVMTDsKKwl1OCBicyA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKTsKKworCXVfY3R4ID0gVUxEX0NUWChjdHgpOworCWlmIChpc19obWFjKGNyeXB0b19haGFzaF90Zm0ocnRmbSkpKQorCQlwYXJhbXMub3BhZF9uZWVkZWQgPSAxOworCWVsc2UKKwkJcGFyYW1zLm9wYWRfbmVlZGVkID0gMDsKKwlwYXJhbXMuc2dfbGVuID0gMDsKKwlnZXRfYWxnX2NvbmZpZygmcGFyYW1zLmFsZ19wcm0sIGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHJ0Zm0pKTsKKwlyZXFfY3R4LT5yZXN1bHQgPSAxOworCXBhcmFtcy5iZnJfbGVuID0gcmVxX2N0eC0+YmZyX2xlbjsKKwlyZXFfY3R4LT5kYXRhX2xlbiArPSBwYXJhbXMuYmZyX2xlbiArIHBhcmFtcy5zZ19sZW47CisJaWYgKHJlcV9jdHgtPmJmciAmJiAocmVxX2N0eC0+YmZyX2xlbiA9PSAwKSkgeworCQljcmVhdGVfbGFzdF9oYXNoX2Jsb2NrKHJlcV9jdHgtPmJmciwgYnMsIHJlcV9jdHgtPmRhdGFfbGVuKTsKKwkJcGFyYW1zLmxhc3QgPSAwOworCQlwYXJhbXMubW9yZSA9IDE7CisJCXBhcmFtcy5zY21kMSA9IDA7CisJCXBhcmFtcy5iZnJfbGVuID0gYnM7CisKKwl9IGVsc2UgeworCQlwYXJhbXMuc2NtZDEgPSByZXFfY3R4LT5kYXRhX2xlbjsKKwkJcGFyYW1zLmxhc3QgPSAxOworCQlwYXJhbXMubW9yZSA9IDA7CisJfQorCXNrYiA9IGNyZWF0ZV9maW5hbF9oYXNoX3dyKHJlcSwgJnBhcmFtcyk7CisJc2tiLT5kZXYgPSB1X2N0eC0+bGxkaS5wb3J0c1swXTsKKwlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGN0eC0+dHhfY2hhbm5lbF9pZCk7CisJY2hjcl9zZW5kX3dyKHNrYik7CisJcmV0dXJuIC1FSU5QUk9HUkVTUzsKK30KKworc3RhdGljIGludCBjaGNyX2FoYXNoX2ZpbnVwKHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqcnRmbSA9IGNyeXB0b19haGFzaF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKTsKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGhhc2hfd3JfcGFyYW0gcGFyYW1zOworCXU4ICBiczsKKworCWJzID0gY3J5cHRvX3RmbV9hbGdfYmxvY2tzaXplKGNyeXB0b19haGFzaF90Zm0ocnRmbSkpOworCXVfY3R4ID0gVUxEX0NUWChjdHgpOworCisJaWYgKHVubGlrZWx5KGN4Z2I0X2lzX2NyeXB0b19xX2Z1bGwodV9jdHgtPmxsZGkucG9ydHNbMF0sCisJCQkJCSAgICBjdHgtPnR4X2NoYW5uZWxfaWQpKSkgeworCQlpZiAoIShyZXEtPmJhc2UuZmxhZ3MgJiBDUllQVE9fVEZNX1JFUV9NQVlfQkFDS0xPRykpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChpc19obWFjKGNyeXB0b19haGFzaF90Zm0ocnRmbSkpKQorCQlwYXJhbXMub3BhZF9uZWVkZWQgPSAxOworCWVsc2UKKwkJcGFyYW1zLm9wYWRfbmVlZGVkID0gMDsKKworCXBhcmFtcy5zZ19sZW4gPSByZXEtPm5ieXRlczsKKwlwYXJhbXMuYmZyX2xlbiA9IHJlcV9jdHgtPmJmcl9sZW47CisJZ2V0X2FsZ19jb25maWcoJnBhcmFtcy5hbGdfcHJtLCBjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZShydGZtKSk7CisJcmVxX2N0eC0+ZGF0YV9sZW4gKz0gcGFyYW1zLmJmcl9sZW4gKyBwYXJhbXMuc2dfbGVuOworCXJlcV9jdHgtPnJlc3VsdCA9IDE7CisJaWYgKHJlcV9jdHgtPmJmciAmJiAocmVxX2N0eC0+YmZyX2xlbiArIHJlcS0+bmJ5dGVzKSA9PSAwKSB7CisJCWNyZWF0ZV9sYXN0X2hhc2hfYmxvY2socmVxX2N0eC0+YmZyLCBicywgcmVxX2N0eC0+ZGF0YV9sZW4pOworCQlwYXJhbXMubGFzdCA9IDA7CisJCXBhcmFtcy5tb3JlID0gMTsKKwkJcGFyYW1zLnNjbWQxID0gMDsKKwkJcGFyYW1zLmJmcl9sZW4gPSBiczsKKwl9IGVsc2UgeworCQlwYXJhbXMuc2NtZDEgPSByZXFfY3R4LT5kYXRhX2xlbjsKKwkJcGFyYW1zLmxhc3QgPSAxOworCQlwYXJhbXMubW9yZSA9IDA7CisJfQorCisJc2tiID0gY3JlYXRlX2ZpbmFsX2hhc2hfd3IocmVxLCAmcGFyYW1zKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisJc2tiLT5kZXYgPSB1X2N0eC0+bGxkaS5wb3J0c1swXTsKKwlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGN0eC0+dHhfY2hhbm5lbF9pZCk7CisJY2hjcl9zZW5kX3dyKHNrYik7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgaW50IGNoY3JfYWhhc2hfZGlnZXN0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqcnRmbSA9IGNyeXB0b19haGFzaF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKTsKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGhhc2hfd3JfcGFyYW0gcGFyYW1zOworCXU4ICBiczsKKworCXJ0Zm0tPmluaXQocmVxKTsKKwlicyA9IGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKTsKKworCXVfY3R4ID0gVUxEX0NUWChjdHgpOworCWlmICh1bmxpa2VseShjeGdiNF9pc19jcnlwdG9fcV9mdWxsKHVfY3R4LT5sbGRpLnBvcnRzWzBdLAorCQkJCQkgICAgY3R4LT50eF9jaGFubmVsX2lkKSkpIHsKKwkJaWYgKCEocmVxLT5iYXNlLmZsYWdzICYgQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0cpKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoaXNfaG1hYyhjcnlwdG9fYWhhc2hfdGZtKHJ0Zm0pKSkKKwkJcGFyYW1zLm9wYWRfbmVlZGVkID0gMTsKKwllbHNlCisJCXBhcmFtcy5vcGFkX25lZWRlZCA9IDA7CisKKwlwYXJhbXMubGFzdCA9IDA7CisJcGFyYW1zLm1vcmUgPSAwOworCXBhcmFtcy5zZ19sZW4gPSByZXEtPm5ieXRlczsKKwlwYXJhbXMuYmZyX2xlbiA9IDA7CisJcGFyYW1zLnNjbWQxID0gMDsKKwlnZXRfYWxnX2NvbmZpZygmcGFyYW1zLmFsZ19wcm0sIGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHJ0Zm0pKTsKKwlyZXFfY3R4LT5yZXN1bHQgPSAxOworCXJlcV9jdHgtPmRhdGFfbGVuICs9IHBhcmFtcy5iZnJfbGVuICsgcGFyYW1zLnNnX2xlbjsKKworCWlmIChyZXFfY3R4LT5iZnIgJiYgcmVxLT5uYnl0ZXMgPT0gMCkgeworCQljcmVhdGVfbGFzdF9oYXNoX2Jsb2NrKHJlcV9jdHgtPmJmciwgYnMsIDApOworCQlwYXJhbXMubW9yZSA9IDE7CisJCXBhcmFtcy5iZnJfbGVuID0gYnM7CisJfQorCisJc2tiID0gY3JlYXRlX2ZpbmFsX2hhc2hfd3IocmVxLCAmcGFyYW1zKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2ItPmRldiA9IHVfY3R4LT5sbGRpLnBvcnRzWzBdOworCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgY3R4LT50eF9jaGFubmVsX2lkKTsKKwljaGNyX3NlbmRfd3Ioc2tiKTsKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgaW50IGNoY3JfYWhhc2hfZXhwb3J0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICphcmVxLCB2b2lkICpvdXQpCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KGFyZXEpOworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnN0YXRlID0gb3V0OworCisJc3RhdGUtPmJmcl9sZW4gPSByZXFfY3R4LT5iZnJfbGVuOworCXN0YXRlLT5kYXRhX2xlbiA9IHJlcV9jdHgtPmRhdGFfbGVuOworCW1lbWNweShzdGF0ZS0+YmZyLCByZXFfY3R4LT5iZnIsIENIQ1JfSEFTSF9NQVhfQkxPQ0tfU0laRV8xMjgpOworCW1lbWNweShzdGF0ZS0+cGFydGlhbF9oYXNoLCByZXFfY3R4LT5wYXJ0aWFsX2hhc2gsCisJICAgICAgIENIQ1JfSEFTSF9NQVhfRElHRVNUX1NJWkUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoY3JfYWhhc2hfaW1wb3J0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICphcmVxLCBjb25zdCB2b2lkICppbikKK3sKKwlzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4ICpyZXFfY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgoYXJlcSk7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqc3RhdGUgPSAoc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqKWluOworCisJcmVxX2N0eC0+YmZyX2xlbiA9IHN0YXRlLT5iZnJfbGVuOworCXJlcV9jdHgtPmRhdGFfbGVuID0gc3RhdGUtPmRhdGFfbGVuOworCXJlcV9jdHgtPmR1bW15X3BheWxvYWRfcHRyID0gTlVMTDsKKwltZW1jcHkocmVxX2N0eC0+YmZyLCBzdGF0ZS0+YmZyLCBDSENSX0hBU0hfTUFYX0JMT0NLX1NJWkVfMTI4KTsKKwltZW1jcHkocmVxX2N0eC0+cGFydGlhbF9oYXNoLCBzdGF0ZS0+cGFydGlhbF9oYXNoLAorCSAgICAgICBDSENSX0hBU0hfTUFYX0RJR0VTVF9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGNyX2FoYXNoX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm0sIGNvbnN0IHU4ICprZXksCisJCQkgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoY3J5cHRvX2FoYXNoX3RmbSh0Zm0pKTsKKwlzdHJ1Y3QgaG1hY19jdHggKmhtYWNjdHggPSBITUFDX0NUWChjdHgpOworCXVuc2lnbmVkIGludCBkaWdlc3RzaXplID0gY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUodGZtKTsKKwl1bnNpZ25lZCBpbnQgYnMgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2FoYXNoX3RmbSh0Zm0pKTsKKwl1bnNpZ25lZCBpbnQgaSwgZXJyID0gMCwgdXBkYXRlZF9kaWdlc3RzaXplOworCisJLyoKKwkgKiB1c2UgdGhlIGtleSB0byBjYWxjdWxhdGUgdGhlIGlwYWQgYW5kIG9wYWQuIGlwYWQgd2lsbCBzZW50IHdpdGggdGhlCisJICogZmlyc3QgcmVxdWVzdCdzIGRhdGEuIG9wYWQgd2lsbCBiZSBzZW50IHdpdGggdGhlIGZpbmFsIGhhc2ggcmVzdWx0CisJICogaXBhZCBpbiBobWFjY3R4LT5pcGFkIGFuZCBvcGFkIGluIGhtYWNjdHgtPm9wYWQgbG9jYXRpb24KKwkgKi8KKwlpZiAoIWhtYWNjdHgtPmRlc2MpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrZXlsZW4gPiBicykgeworCQllcnIgPSBjcnlwdG9fc2hhc2hfZGlnZXN0KGhtYWNjdHgtPmRlc2MsIGtleSwga2V5bGVuLAorCQkJCQkgIGhtYWNjdHgtPmlwYWQpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWtleWxlbiA9IGRpZ2VzdHNpemU7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGhtYWNjdHgtPmlwYWQsIGtleSwga2V5bGVuKTsKKwl9CisJbWVtc2V0KGhtYWNjdHgtPmlwYWQgKyBrZXlsZW4sIDAsIGJzIC0ga2V5bGVuKTsKKwltZW1jcHkoaG1hY2N0eC0+b3BhZCwgaG1hY2N0eC0+aXBhZCwgYnMpOworCisJZm9yIChpID0gMDsgaSA8IGJzIC8gc2l6ZW9mKGludCk7IGkrKykgeworCQkqKCh1bnNpZ25lZCBpbnQgKikoJmhtYWNjdHgtPmlwYWQpICsgaSkgXj0gSVBBRF9EQVRBOworCQkqKCh1bnNpZ25lZCBpbnQgKikoJmhtYWNjdHgtPm9wYWQpICsgaSkgXj0gT1BBRF9EQVRBOworCX0KKworCXVwZGF0ZWRfZGlnZXN0c2l6ZSA9IGRpZ2VzdHNpemU7CisJaWYgKGRpZ2VzdHNpemUgPT0gU0hBMjI0X0RJR0VTVF9TSVpFKQorCQl1cGRhdGVkX2RpZ2VzdHNpemUgPSBTSEEyNTZfRElHRVNUX1NJWkU7CisJZWxzZSBpZiAoZGlnZXN0c2l6ZSA9PSBTSEEzODRfRElHRVNUX1NJWkUpCisJCXVwZGF0ZWRfZGlnZXN0c2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRTsKKwllcnIgPSBjaGNyX2NvbXB1dGVfcGFydGlhbF9oYXNoKGhtYWNjdHgtPmRlc2MsIGhtYWNjdHgtPmlwYWQsCisJCQkJCWhtYWNjdHgtPmlwYWQsIGRpZ2VzdHNpemUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWNoY3JfY2hhbmdlX29yZGVyKGhtYWNjdHgtPmlwYWQsIHVwZGF0ZWRfZGlnZXN0c2l6ZSk7CisKKwllcnIgPSBjaGNyX2NvbXB1dGVfcGFydGlhbF9oYXNoKGhtYWNjdHgtPmRlc2MsIGhtYWNjdHgtPm9wYWQsCisJCQkJCWhtYWNjdHgtPm9wYWQsIGRpZ2VzdHNpemUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWNoY3JfY2hhbmdlX29yZGVyKGhtYWNjdHgtPm9wYWQsIHVwZGF0ZWRfZGlnZXN0c2l6ZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjaGNyX2Flc194dHNfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqdGZtLCBjb25zdCB1OCAqa2V5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBrZXlfbGVuKQoreworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b19hYmxrY2lwaGVyX2N0eCh0Zm0pOworCXN0cnVjdCBhYmxrX2N0eCAqYWJsa2N0eCA9IEFCTEtfQ1RYKGN0eCk7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgc2hvcnQgY29udGV4dF9zaXplID0gMDsKKworCWlmICgoa2V5X2xlbiA9PSAoQUVTX0tFWVNJWkVfMTI4IDw8IDEpKSB8fAorCSAgICAoa2V5X2xlbiA9PSAoQUVTX0tFWVNJWkVfMjU2IDw8IDEpKSkgeworCQltZW1jcHkoYWJsa2N0eC0+a2V5LCBrZXksIGtleV9sZW4pOworCQlhYmxrY3R4LT5lbmNrZXlfbGVuID0ga2V5X2xlbjsKKwkJY29udGV4dF9zaXplID0gKEtFWV9DT05URVhUX0hEUl9TQUxUX0FORF9QQUQgKyBrZXlfbGVuKSA+PiA0OworCQlhYmxrY3R4LT5rZXlfY3R4X2hkciA9CisJCQlGSUxMX0tFWV9DVFhfSERSKChrZXlfbGVuID09IEFFU19LRVlTSVpFXzI1NikgPworCQkJCQkgQ0hDUl9LRVlDVFhfQ0lQSEVSX0tFWV9TSVpFXzEyOCA6CisJCQkJCSBDSENSX0tFWUNUWF9DSVBIRVJfS0VZX1NJWkVfMjU2LAorCQkJCQkgQ0hDUl9LRVlDVFhfTk9fS0VZLCAxLAorCQkJCQkgMCwgY29udGV4dF9zaXplKTsKKwkJYWJsa2N0eC0+Y2lwaF9tb2RlID0gQ0hDUl9TQ01EX0NJUEhFUl9NT0RFX0FFU19YVFM7CisJfSBlbHNlIHsKKwkJY3J5cHRvX3RmbV9zZXRfZmxhZ3MoKHN0cnVjdCBjcnlwdG9fdGZtICopdGZtLAorCQkJCSAgICAgQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU4pOworCQlhYmxrY3R4LT5lbmNrZXlfbGVuID0gMDsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBjaGNyX3NoYV9pbml0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICphcmVxKQoreworCXN0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggKnJlcV9jdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChhcmVxKTsKKwlzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm0gPSBjcnlwdG9fYWhhc2hfcmVxdGZtKGFyZXEpOworCWludCBkaWdlc3RzaXplID0gIGNyeXB0b19haGFzaF9kaWdlc3RzaXplKHRmbSk7CisKKwlyZXFfY3R4LT5kYXRhX2xlbiA9IDA7CisJcmVxX2N0eC0+ZHVtbXlfcGF5bG9hZF9wdHIgPSBOVUxMOworCXJlcV9jdHgtPmJmcl9sZW4gPSAwOworCXJlcV9jdHgtPnNrYiA9IE5VTEw7CisJcmVxX2N0eC0+cmVzdWx0ID0gMDsKKwljb3B5X2hhc2hfaW5pdF92YWx1ZXMocmVxX2N0eC0+cGFydGlhbF9oYXNoLCBkaWdlc3RzaXplKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGNyX3NoYV9jcmFfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworCWNyeXB0b19haGFzaF9zZXRfcmVxc2l6ZShfX2NyeXB0b19haGFzaF9jYXN0KHRmbSksCisJCQkJIHNpemVvZihzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4KSk7CisJcmV0dXJuIGNoY3JfZGV2aWNlX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9obWFjX2luaXQoc3RydWN0IGFoYXNoX3JlcXVlc3QgKmFyZXEpCit7CisJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqcmVxX2N0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KGFyZXEpOworCXN0cnVjdCBjcnlwdG9fYWhhc2ggKnJ0Zm0gPSBjcnlwdG9fYWhhc2hfcmVxdGZtKGFyZXEpOworCXN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCA9IGNyeXB0b190Zm1fY3R4KGNyeXB0b19haGFzaF90Zm0ocnRmbSkpOworCXN0cnVjdCBobWFjX2N0eCAqaG1hY2N0eCA9IEhNQUNfQ1RYKGN0eCk7CisJdW5zaWduZWQgaW50IGRpZ2VzdHNpemUgPSBjcnlwdG9fYWhhc2hfZGlnZXN0c2l6ZShydGZtKTsKKwl1bnNpZ25lZCBpbnQgYnMgPSBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2FoYXNoX3RmbShydGZtKSk7CisKKwljaGNyX3NoYV9pbml0KGFyZXEpOworCXJlcV9jdHgtPmRhdGFfbGVuID0gYnM7CisJaWYgKGlzX2htYWMoY3J5cHRvX2FoYXNoX3RmbShydGZtKSkpIHsKKwkJaWYgKGRpZ2VzdHNpemUgPT0gU0hBMjI0X0RJR0VTVF9TSVpFKQorCQkJbWVtY3B5KHJlcV9jdHgtPnBhcnRpYWxfaGFzaCwgaG1hY2N0eC0+aXBhZCwKKwkJCSAgICAgICBTSEEyNTZfRElHRVNUX1NJWkUpOworCQllbHNlIGlmIChkaWdlc3RzaXplID09IFNIQTM4NF9ESUdFU1RfU0laRSkKKwkJCW1lbWNweShyZXFfY3R4LT5wYXJ0aWFsX2hhc2gsIGhtYWNjdHgtPmlwYWQsCisJCQkgICAgICAgU0hBNTEyX0RJR0VTVF9TSVpFKTsKKwkJZWxzZQorCQkJbWVtY3B5KHJlcV9jdHgtPnBhcnRpYWxfaGFzaCwgaG1hY2N0eC0+aXBhZCwKKwkJCSAgICAgICBkaWdlc3RzaXplKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9obWFjX2NyYV9pbml0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisJc3RydWN0IGNoY3JfY29udGV4dCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKwlzdHJ1Y3QgaG1hY19jdHggKmhtYWNjdHggPSBITUFDX0NUWChjdHgpOworCXVuc2lnbmVkIGludCBkaWdlc3RzaXplID0KKwkJY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUoX19jcnlwdG9fYWhhc2hfY2FzdCh0Zm0pKTsKKworCWNyeXB0b19haGFzaF9zZXRfcmVxc2l6ZShfX2NyeXB0b19haGFzaF9jYXN0KHRmbSksCisJCQkJIHNpemVvZihzdHJ1Y3QgY2hjcl9haGFzaF9yZXFfY3R4KSk7CisJaG1hY2N0eC0+ZGVzYyA9IGNoY3JfYWxsb2Nfc2hhc2goZGlnZXN0c2l6ZSk7CisJaWYgKElTX0VSUihobWFjY3R4LT5kZXNjKSkKKwkJcmV0dXJuIFBUUl9FUlIoaG1hY2N0eC0+ZGVzYyk7CisJcmV0dXJuIGNoY3JfZGV2aWNlX2luaXQoY3J5cHRvX3RmbV9jdHgodGZtKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoY3JfZnJlZV9zaGFzaChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKK3sKKwljcnlwdG9fZnJlZV9zaGFzaChkZXNjLT50Zm0pOworCWtmcmVlKGRlc2MpOworfQorCitzdGF0aWMgdm9pZCBjaGNyX2htYWNfY3JhX2V4aXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgY2hjcl9jb250ZXh0ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCXN0cnVjdCBobWFjX2N0eCAqaG1hY2N0eCA9IEhNQUNfQ1RYKGN0eCk7CisKKwlpZiAoaG1hY2N0eC0+ZGVzYykgeworCQljaGNyX2ZyZWVfc2hhc2goaG1hY2N0eC0+ZGVzYyk7CisJCWhtYWNjdHgtPmRlc2MgPSBOVUxMOworCX0KK30KKworc3RhdGljIHN0cnVjdCBjaGNyX2FsZ190ZW1wbGF0ZSBkcml2ZXJfYWxnc1tdID0geworCS8qIEFFUy1DQkMgKi8KKwl7CisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FCTEtDSVBIRVIsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5jcnlwdG8gPSB7CisJCQkuY3JhX25hbWUJCT0gImNiYyhhZXMpIiwKKwkJCS5jcmFfZHJpdmVyX25hbWUJPSAiY2JjKGFlcy1jaGNyKSIsCisJCQkuY3JhX3ByaW9yaXR5CQk9IENIQ1JfQ1JBX1BSSU9SSVRZLAorCQkJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQlDUllQVE9fQUxHX0FTWU5DLAorCQkJLmNyYV9ibG9ja3NpemUJCT0gQUVTX0JMT0NLX1NJWkUsCisJCQkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjaGNyX2NvbnRleHQpCisJCQkJKyBzaXplb2Yoc3RydWN0IGFibGtfY3R4KSwKKwkJCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJCQkuY3JhX3R5cGUJCT0gJmNyeXB0b19hYmxrY2lwaGVyX3R5cGUsCisJCQkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkJCS5jcmFfaW5pdAkJPSBjaGNyX2NyYV9pbml0LAorCQkJLmNyYV9leGl0CQk9IE5VTEwsCisJCQkuY3JhX3UuYWJsa2NpcGhlcgk9IHsKKwkJCQkubWluX2tleXNpemUJPSBBRVNfTUlOX0tFWV9TSVpFLAorCQkJCS5tYXhfa2V5c2l6ZQk9IEFFU19NQVhfS0VZX1NJWkUsCisJCQkJLml2c2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKKwkJCQkuc2V0a2V5CQkJPSBjaGNyX2Flc19jYmNfc2V0a2V5LAorCQkJCS5lbmNyeXB0CQk9IGNoY3JfYWVzX2VuY3J5cHQsCisJCQkJLmRlY3J5cHQJCT0gY2hjcl9hZXNfZGVjcnlwdCwKKwkJCX0KKwkJfQorCX0sCisJeworCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9BQkxLQ0lQSEVSLAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuY3J5cHRvID0gICB7CisJCQkuY3JhX25hbWUJCT0gInh0cyhhZXMpIiwKKwkJCS5jcmFfZHJpdmVyX25hbWUJPSAieHRzKGFlcy1jaGNyKSIsCisJCQkuY3JhX3ByaW9yaXR5CQk9IENIQ1JfQ1JBX1BSSU9SSVRZLAorCQkJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQlDUllQVE9fQUxHX0FTWU5DLAorCQkJLmNyYV9ibG9ja3NpemUJCT0gQUVTX0JMT0NLX1NJWkUsCisJCQkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjaGNyX2NvbnRleHQpICsKKwkJCQlzaXplb2Yoc3RydWN0IGFibGtfY3R4KSwKKwkJCS5jcmFfYWxpZ25tYXNrCQk9IDAsCisJCQkuY3JhX3R5cGUJCT0gJmNyeXB0b19hYmxrY2lwaGVyX3R5cGUsCisJCQkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkJCS5jcmFfaW5pdAkJPSBjaGNyX2NyYV9pbml0LAorCQkJLmNyYV9leGl0CQk9IE5VTEwsCisJCQkuY3JhX3UgPSB7CisJCQkJLmFibGtjaXBoZXIgPSB7CisJCQkJCS5taW5fa2V5c2l6ZQk9IDIgKiBBRVNfTUlOX0tFWV9TSVpFLAorCQkJCQkubWF4X2tleXNpemUJPSAyICogQUVTX01BWF9LRVlfU0laRSwKKwkJCQkJLml2c2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKKwkJCQkJLnNldGtleQkJPSBjaGNyX2Flc194dHNfc2V0a2V5LAorCQkJCQkuZW5jcnlwdAk9IGNoY3JfYWVzX2VuY3J5cHQsCisJCQkJCS5kZWNyeXB0CT0gY2hjcl9hZXNfZGVjcnlwdCwKKwkJCQl9CisJCQl9CisJCX0KKwl9LAorCS8qIFNIQSAqLworCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUhBU0gsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5oYXNoID0geworCQkJLmhhbGcuZGlnZXN0c2l6ZSA9IFNIQTFfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJzaGExIiwKKwkJCQkuY3JhX2RyaXZlcl9uYW1lID0gInNoYTEtY2hjciIsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBTSEExX0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUhBU0gsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5oYXNoID0geworCQkJLmhhbGcuZGlnZXN0c2l6ZSA9IFNIQTI1Nl9ESUdFU1RfU0laRSwKKwkJCS5oYWxnLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gInNoYTI1NiIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJzaGEyNTYtY2hjciIsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBTSEEyNTZfQkxPQ0tfU0laRSwKKwkJCX0KKwkJfQorCX0sCisJeworCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9BSEFTSCwKKwkJLmlzX3JlZ2lzdGVyZWQgPSAwLAorCQkuYWxnLmhhc2ggPSB7CisJCQkuaGFsZy5kaWdlc3RzaXplID0gU0hBMjI0X0RJR0VTVF9TSVpFLAorCQkJLmhhbGcuYmFzZSA9IHsKKwkJCQkuY3JhX25hbWUgPSAic2hhMjI0IiwKKwkJCQkuY3JhX2RyaXZlcl9uYW1lID0gInNoYTIyNC1jaGNyIiwKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IFNIQTIyNF9CTE9DS19TSVpFLAorCQkJfQorCQl9CisJfSwKKwl7CisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FIQVNILAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuaGFzaCA9IHsKKwkJCS5oYWxnLmRpZ2VzdHNpemUgPSBTSEEzODRfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJzaGEzODQiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAic2hhMzg0LWNoY3IiLAorCQkJCS5jcmFfYmxvY2tzaXplID0gU0hBMzg0X0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUhBU0gsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5oYXNoID0geworCQkJLmhhbGcuZGlnZXN0c2l6ZSA9IFNIQTUxMl9ESUdFU1RfU0laRSwKKwkJCS5oYWxnLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gInNoYTUxMiIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJzaGE1MTItY2hjciIsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBTSEE1MTJfQkxPQ0tfU0laRSwKKwkJCX0KKwkJfQorCX0sCisJLyogSE1BQyAqLworCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfSE1BQywKKwkJLmlzX3JlZ2lzdGVyZWQgPSAwLAorCQkuYWxnLmhhc2ggPSB7CisJCQkuaGFsZy5kaWdlc3RzaXplID0gU0hBMV9ESUdFU1RfU0laRSwKKwkJCS5oYWxnLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gImhtYWMoc2hhMSkiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAiaG1hYyhzaGExLWNoY3IpIiwKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IFNIQTFfQkxPQ0tfU0laRSwKKwkJCX0KKwkJfQorCX0sCisJeworCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9ITUFDLAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuaGFzaCA9IHsKKwkJCS5oYWxnLmRpZ2VzdHNpemUgPSBTSEEyMjRfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJobWFjKHNoYTIyNCkiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAiaG1hYyhzaGEyMjQtY2hjcikiLAorCQkJCS5jcmFfYmxvY2tzaXplID0gU0hBMjI0X0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorCXsKKwkJLnR5cGUgPSBDUllQVE9fQUxHX1RZUEVfSE1BQywKKwkJLmlzX3JlZ2lzdGVyZWQgPSAwLAorCQkuYWxnLmhhc2ggPSB7CisJCQkuaGFsZy5kaWdlc3RzaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFLAorCQkJLmhhbGcuYmFzZSA9IHsKKwkJCQkuY3JhX25hbWUgPSAiaG1hYyhzaGEyNTYpIiwKKwkJCQkuY3JhX2RyaXZlcl9uYW1lID0gImhtYWMoc2hhMjU2LWNoY3IpIiwKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IFNIQTI1Nl9CTE9DS19TSVpFLAorCQkJfQorCQl9CisJfSwKKwl7CisJCS50eXBlID0gQ1JZUFRPX0FMR19UWVBFX0hNQUMsCisJCS5pc19yZWdpc3RlcmVkID0gMCwKKwkJLmFsZy5oYXNoID0geworCQkJLmhhbGcuZGlnZXN0c2l6ZSA9IFNIQTM4NF9ESUdFU1RfU0laRSwKKwkJCS5oYWxnLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gImhtYWMoc2hhMzg0KSIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJobWFjKHNoYTM4NC1jaGNyKSIsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBTSEEzODRfQkxPQ0tfU0laRSwKKwkJCX0KKwkJfQorCX0sCisJeworCQkudHlwZSA9IENSWVBUT19BTEdfVFlQRV9ITUFDLAorCQkuaXNfcmVnaXN0ZXJlZCA9IDAsCisJCS5hbGcuaGFzaCA9IHsKKwkJCS5oYWxnLmRpZ2VzdHNpemUgPSBTSEE1MTJfRElHRVNUX1NJWkUsCisJCQkuaGFsZy5iYXNlID0geworCQkJCS5jcmFfbmFtZSA9ICJobWFjKHNoYTUxMikiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAiaG1hYyhzaGE1MTItY2hjcikiLAorCQkJCS5jcmFfYmxvY2tzaXplID0gU0hBNTEyX0JMT0NLX1NJWkUsCisJCQl9CisJCX0KKwl9LAorfTsKKworLyoKKyAqCWNoY3JfdW5yZWdpc3Rlcl9hbGcgLSBEZXJlZ2lzdGVyIGNyeXB0byBhbGdvcml0aG1zIHdpdGgKKyAqCWtlcm5lbCBmcmFtZXdvcmsuCisgKi8KK3N0YXRpYyBpbnQgY2hjcl91bnJlZ2lzdGVyX2FsZyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHJpdmVyX2FsZ3MpOyBpKyspIHsKKwkJc3dpdGNoIChkcml2ZXJfYWxnc1tpXS50eXBlICYgQ1JZUFRPX0FMR19UWVBFX01BU0spIHsKKwkJY2FzZSBDUllQVE9fQUxHX1RZUEVfQUJMS0NJUEhFUjoKKwkJCWlmIChkcml2ZXJfYWxnc1tpXS5pc19yZWdpc3RlcmVkKQorCQkJCWNyeXB0b191bnJlZ2lzdGVyX2FsZygKKwkJCQkJCSZkcml2ZXJfYWxnc1tpXS5hbGcuY3J5cHRvKTsKKwkJCWJyZWFrOworCQljYXNlIENSWVBUT19BTEdfVFlQRV9BSEFTSDoKKwkJCWlmIChkcml2ZXJfYWxnc1tpXS5pc19yZWdpc3RlcmVkKQorCQkJCWNyeXB0b191bnJlZ2lzdGVyX2FoYXNoKAorCQkJCQkJJmRyaXZlcl9hbGdzW2ldLmFsZy5oYXNoKTsKKwkJCWJyZWFrOworCQl9CisJCWRyaXZlcl9hbGdzW2ldLmlzX3JlZ2lzdGVyZWQgPSAwOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBTWl9BSEFTSF9DVFggc2l6ZW9mKHN0cnVjdCBjaGNyX2NvbnRleHQpCisjZGVmaW5lIFNaX0FIQVNIX0hfQ1RYIChzaXplb2Yoc3RydWN0IGNoY3JfY29udGV4dCkgKyBzaXplb2Yoc3RydWN0IGhtYWNfY3R4KSkKKyNkZWZpbmUgU1pfQUhBU0hfUkVRX0NUWCBzaXplb2Yoc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCkKKyNkZWZpbmUgQUhBU0hfQ1JBX0ZMQUdTIChDUllQVE9fQUxHX1RZUEVfQUhBU0ggfCBDUllQVE9fQUxHX0FTWU5DKQorCisvKgorICoJY2hjcl9yZWdpc3Rlcl9hbGcgLSBSZWdpc3RlciBjcnlwdG8gYWxnb3JpdGhtcyB3aXRoIGtlcm5lbCBmcmFtZXdvcmsuCisgKi8KK3N0YXRpYyBpbnQgY2hjcl9yZWdpc3Rlcl9hbGcodm9pZCkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FsZyBhaTsKKwlzdHJ1Y3QgYWhhc2hfYWxnICphX2hhc2g7CisJaW50IGVyciA9IDAsIGk7CisJY2hhciAqbmFtZSA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkcml2ZXJfYWxncyk7IGkrKykgeworCQlpZiAoZHJpdmVyX2FsZ3NbaV0uaXNfcmVnaXN0ZXJlZCkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKGRyaXZlcl9hbGdzW2ldLnR5cGUgJiBDUllQVE9fQUxHX1RZUEVfTUFTSykgeworCQljYXNlIENSWVBUT19BTEdfVFlQRV9BQkxLQ0lQSEVSOgorCQkJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FsZygmZHJpdmVyX2FsZ3NbaV0uYWxnLmNyeXB0byk7CisJCQluYW1lID0gZHJpdmVyX2FsZ3NbaV0uYWxnLmNyeXB0by5jcmFfZHJpdmVyX25hbWU7CisJCQlicmVhazsKKwkJY2FzZSBDUllQVE9fQUxHX1RZUEVfQUhBU0g6CisJCQlhX2hhc2ggPSAmZHJpdmVyX2FsZ3NbaV0uYWxnLmhhc2g7CisJCQlhX2hhc2gtPnVwZGF0ZSA9IGNoY3JfYWhhc2hfdXBkYXRlOworCQkJYV9oYXNoLT5maW5hbCA9IGNoY3JfYWhhc2hfZmluYWw7CisJCQlhX2hhc2gtPmZpbnVwID0gY2hjcl9haGFzaF9maW51cDsKKwkJCWFfaGFzaC0+ZGlnZXN0ID0gY2hjcl9haGFzaF9kaWdlc3Q7CisJCQlhX2hhc2gtPmV4cG9ydCA9IGNoY3JfYWhhc2hfZXhwb3J0OworCQkJYV9oYXNoLT5pbXBvcnQgPSBjaGNyX2FoYXNoX2ltcG9ydDsKKwkJCWFfaGFzaC0+aGFsZy5zdGF0ZXNpemUgPSBTWl9BSEFTSF9SRVFfQ1RYOworCQkJYV9oYXNoLT5oYWxnLmJhc2UuY3JhX3ByaW9yaXR5ID0gQ0hDUl9DUkFfUFJJT1JJVFk7CisJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfbW9kdWxlID0gVEhJU19NT0RVTEU7CisJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfZmxhZ3MgPSBBSEFTSF9DUkFfRkxBR1M7CisJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfYWxpZ25tYXNrID0gMDsKKwkJCWFfaGFzaC0+aGFsZy5iYXNlLmNyYV9leGl0ID0gTlVMTDsKKwkJCWFfaGFzaC0+aGFsZy5iYXNlLmNyYV90eXBlID0gJmNyeXB0b19haGFzaF90eXBlOworCisJCQlpZiAoZHJpdmVyX2FsZ3NbaV0udHlwZSA9PSBDUllQVE9fQUxHX1RZUEVfSE1BQykgeworCQkJCWFfaGFzaC0+aGFsZy5iYXNlLmNyYV9pbml0ID0gY2hjcl9obWFjX2NyYV9pbml0OworCQkJCWFfaGFzaC0+aGFsZy5iYXNlLmNyYV9leGl0ID0gY2hjcl9obWFjX2NyYV9leGl0OworCQkJCWFfaGFzaC0+aW5pdCA9IGNoY3JfaG1hY19pbml0OworCQkJCWFfaGFzaC0+c2V0a2V5ID0gY2hjcl9haGFzaF9zZXRrZXk7CisJCQkJYV9oYXNoLT5oYWxnLmJhc2UuY3JhX2N0eHNpemUgPSBTWl9BSEFTSF9IX0NUWDsKKwkJCX0gZWxzZSB7CisJCQkJYV9oYXNoLT5pbml0ID0gY2hjcl9zaGFfaW5pdDsKKwkJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfY3R4c2l6ZSA9IFNaX0FIQVNIX0NUWDsKKwkJCQlhX2hhc2gtPmhhbGcuYmFzZS5jcmFfaW5pdCA9IGNoY3Jfc2hhX2NyYV9pbml0OworCQkJfQorCQkJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FoYXNoKCZkcml2ZXJfYWxnc1tpXS5hbGcuaGFzaCk7CisJCQlhaSA9IGRyaXZlcl9hbGdzW2ldLmFsZy5oYXNoLmhhbGcuYmFzZTsKKwkJCW5hbWUgPSBhaS5jcmFfZHJpdmVyX25hbWU7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoImNoY3IgOiAlcyA6IEFsZ29yaXRobSByZWdpc3RyYXRpb24gZmFpbGVkXG4iLAorCQkJICAgICAgIG5hbWUpOworCQkJZ290byByZWdpc3Rlcl9lcnI7CisJCX0gZWxzZSB7CisJCQlkcml2ZXJfYWxnc1tpXS5pc19yZWdpc3RlcmVkID0gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKworcmVnaXN0ZXJfZXJyOgorCWNoY3JfdW5yZWdpc3Rlcl9hbGcoKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICoJc3RhcnRfY3J5cHRvIC0gUmVnaXN0ZXIgdGhlIGNyeXB0byBhbGdvcml0aG1zLgorICoJVGhpcyBzaG91bGQgY2FsbGVkIG9uY2Ugd2hlbiB0aGUgZmlyc3QgZGV2aWNlIGNvbWVzdXAuIEFmdGVyIHRoaXMKKyAqCWtlcm5lbCB3aWxsIHN0YXJ0IGNhbGxpbmcgZHJpdmVyIEFQSXMgZm9yIGNyeXB0byBvcGVyYXRpb25zLgorICovCitpbnQgc3RhcnRfY3J5cHRvKHZvaWQpCit7CisJcmV0dXJuIGNoY3JfcmVnaXN0ZXJfYWxnKCk7Cit9CisKKy8qCisgKglzdG9wX2NyeXB0byAtIERlcmVnaXN0ZXIgYWxsIHRoZSBjcnlwdG8gYWxnb3JpdGhtcyB3aXRoIGtlcm5lbC4KKyAqCVRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHdoZW4gdGhlIGxhc3QgZGV2aWNlIGdvZXMgZG93bi4gQWZ0ZXIgdGhpcworICoJa2VybmVsIHdpbGwgbm90IGNhbGwgdGhlIGRyaXZlciBBUEkgZm9yIGNyeXB0byBvcGVyYXRpb25zLgorICovCitpbnQgc3RvcF9jcnlwdG8odm9pZCkKK3sKKwljaGNyX3VucmVnaXN0ZXJfYWxnKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL2NoY3JfYWxnby5oIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2FsZ28uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY0ZmJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2FsZ28uaApAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ2IENyeXB0byBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9fQ0hDUl9BTEdPX0hfXworI2RlZmluZSBfX0NIQ1JfQUxHT19IX18KKworLyogQ3J5cHRvIGtleSBjb250ZXh0ICovCisjZGVmaW5lIEtFWV9DT05URVhUX0NUWF9MRU5fUyAgICAgICAgICAgMjQKKyNkZWZpbmUgS0VZX0NPTlRFWFRfQ1RYX0xFTl9NICAgICAgICAgICAweGZmCisjZGVmaW5lIEtFWV9DT05URVhUX0NUWF9MRU5fVih4KSAgICAgICAgKCh4KSA8PCBLRVlfQ09OVEVYVF9DVFhfTEVOX1MpCisjZGVmaW5lIEtFWV9DT05URVhUX0NUWF9MRU5fRyh4KSBcCisJKCgoeCkgPj4gS0VZX0NPTlRFWFRfQ1RYX0xFTl9TKSAmIEtFWV9DT05URVhUX0NUWF9MRU5fTSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9EVUFMX0NLX1MgICAgICAxMgorI2RlZmluZSBLRVlfQ09OVEVYVF9EVUFMX0NLX00gICAgICAweDEKKyNkZWZpbmUgS0VZX0NPTlRFWFRfRFVBTF9DS19WKHgpICAgKCh4KSA8PCBLRVlfQ09OVEVYVF9EVUFMX0NLX1MpCisjZGVmaW5lIEtFWV9DT05URVhUX0RVQUxfQ0tfRyh4KSAgIFwKKygoKHgpID4+IEtFWV9DT05URVhUX0RVQUxfQ0tfUykgJiBLRVlfQ09OVEVYVF9EVUFMX0NLX00pCisjZGVmaW5lIEtFWV9DT05URVhUX0RVQUxfQ0tfRiAgICAgIEtFWV9DT05URVhUX0RVQUxfQ0tfVigxVSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfUyAgICAgIDEwCisjZGVmaW5lIEtFWV9DT05URVhUX1NBTFRfUFJFU0VOVF9NICAgICAgMHgxCisjZGVmaW5lIEtFWV9DT05URVhUX1NBTFRfUFJFU0VOVF9WKHgpICAgKCh4KSA8PCBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfUykKKyNkZWZpbmUgS0VZX0NPTlRFWFRfU0FMVF9QUkVTRU5UX0coeCkgICBcCisJKCgoeCkgPj4gS0VZX0NPTlRFWFRfU0FMVF9QUkVTRU5UX1MpICYgXAorCSBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfTSkKKyNkZWZpbmUgS0VZX0NPTlRFWFRfU0FMVF9QUkVTRU5UX0YgICAgICBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfVigxVSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9WQUxJRF9TICAgICAwCisjZGVmaW5lIEtFWV9DT05URVhUX1ZBTElEX00gICAgIDB4MQorI2RlZmluZSBLRVlfQ09OVEVYVF9WQUxJRF9WKHgpICAoKHgpIDw8IEtFWV9DT05URVhUX1ZBTElEX1MpCisjZGVmaW5lIEtFWV9DT05URVhUX1ZBTElEX0coeCkgIFwKKwkoKCh4KSA+PiBLRVlfQ09OVEVYVF9WQUxJRF9TKSAmIFwKKwkgS0VZX0NPTlRFWFRfVkFMSURfTSkKKyNkZWZpbmUgS0VZX0NPTlRFWFRfVkFMSURfRiAgICAgS0VZX0NPTlRFWFRfVkFMSURfVigxVSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9DS19TSVpFX1MgICAgICAgICAgIDYKKyNkZWZpbmUgS0VZX0NPTlRFWFRfQ0tfU0laRV9NICAgICAgICAgICAweGYKKyNkZWZpbmUgS0VZX0NPTlRFWFRfQ0tfU0laRV9WKHgpICAgICAgICAoKHgpIDw8IEtFWV9DT05URVhUX0NLX1NJWkVfUykKKyNkZWZpbmUgS0VZX0NPTlRFWFRfQ0tfU0laRV9HKHgpICAgICAgICBcCisJKCgoeCkgPj4gS0VZX0NPTlRFWFRfQ0tfU0laRV9TKSAmIEtFWV9DT05URVhUX0NLX1NJWkVfTSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9NS19TSVpFX1MgICAgICAgICAgIDIKKyNkZWZpbmUgS0VZX0NPTlRFWFRfTUtfU0laRV9NICAgICAgICAgICAweGYKKyNkZWZpbmUgS0VZX0NPTlRFWFRfTUtfU0laRV9WKHgpICAgICAgICAoKHgpIDw8IEtFWV9DT05URVhUX01LX1NJWkVfUykKKyNkZWZpbmUgS0VZX0NPTlRFWFRfTUtfU0laRV9HKHgpICAgICAgICBcCisJKCgoeCkgPj4gS0VZX0NPTlRFWFRfTUtfU0laRV9TKSAmIEtFWV9DT05URVhUX01LX1NJWkVfTSkKKworI2RlZmluZSBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfUyAgICAgIDExCisjZGVmaW5lIEtFWV9DT05URVhUX09QQURfUFJFU0VOVF9NICAgICAgMHgxCisjZGVmaW5lIEtFWV9DT05URVhUX09QQURfUFJFU0VOVF9WKHgpICAgKCh4KSA8PCBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfUykKKyNkZWZpbmUgS0VZX0NPTlRFWFRfT1BBRF9QUkVTRU5UX0coeCkgICBcCisJKCgoeCkgPj4gS0VZX0NPTlRFWFRfT1BBRF9QUkVTRU5UX1MpICYgXAorCSBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfTSkKKyNkZWZpbmUgS0VZX0NPTlRFWFRfT1BBRF9QUkVTRU5UX0YgICAgICBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfVigxVSkKKworI2RlZmluZSBDSENSX0hBU0hfTUFYX0RJR0VTVF9TSVpFIDY0CisjZGVmaW5lIENIQ1JfTUFYX1NIQV9ESUdFU1RfU0laRSA2NAorCisjZGVmaW5lIElQU0VDX1RSVU5DQVRFRF9JQ1ZfU0laRSAxMgorI2RlZmluZSBUTFNfVFJVTkNBVEVEX0hNQUNfU0laRSAxMAorI2RlZmluZSBDQkNNQUNfRElHRVNUX1NJWkUgMTYKKyNkZWZpbmUgTUFYX0hBU0hfTkFNRSAyMAorCisjZGVmaW5lIFNIQTFfSU5JVF9TVEFURV81WDRCICAgIDUKKyNkZWZpbmUgU0hBMjU2X0lOSVRfU1RBVEVfOFg0QiAgOAorI2RlZmluZSBTSEE1MTJfSU5JVF9TVEFURV84WDhCICA4CisjZGVmaW5lIFNIQTFfSU5JVF9TVEFURSAgICAgICAgIFNIQTFfSU5JVF9TVEFURV81WDRCCisjZGVmaW5lIFNIQTIyNF9JTklUX1NUQVRFICAgICAgIFNIQTI1Nl9JTklUX1NUQVRFXzhYNEIKKyNkZWZpbmUgU0hBMjU2X0lOSVRfU1RBVEUgICAgICAgU0hBMjU2X0lOSVRfU1RBVEVfOFg0QgorI2RlZmluZSBTSEEzODRfSU5JVF9TVEFURSAgICAgICBTSEE1MTJfSU5JVF9TVEFURV84WDhCCisjZGVmaW5lIFNIQTUxMl9JTklUX1NUQVRFICAgICAgIFNIQTUxMl9JTklUX1NUQVRFXzhYOEIKKworI2RlZmluZSBEVU1NWV9CWVRFUyAxNgorCisjZGVmaW5lIElQQURfREFUQSAweDM2MzYzNjM2CisjZGVmaW5lIE9QQURfREFUQSAweDVjNWM1YzVjCisKKyNkZWZpbmUgVFJBTlNIRFJfU0laRShhbGlnbmVka2N0eF9sZW4pXAorCShzaXplb2Yoc3RydWN0IHVscHR4X2lkYXRhKSArXAorCSBzaXplb2Yoc3RydWN0IHVscF90eHBrdCkgK1wKKwkgc2l6ZW9mKHN0cnVjdCBmd19jcnlwdG9fbG9va2FzaWRlX3dyKSArXAorCSBzaXplb2Yoc3RydWN0IGNwbF90eF9zZWNfcGR1KSArXAorCSAoYWxpZ25lZGtjdHhfbGVuKSkKKyNkZWZpbmUgQ0lQSEVSX1RSQU5TSERSX1NJWkUoYWxpZ25lZGtjdHhfbGVuLCBzZ2VfcGFpcnMpIFwKKwkoVFJBTlNIRFJfU0laRShhbGlnbmVka2N0eF9sZW4pICsgc2dlX3BhaXJzICtcCisJIHNpemVvZihzdHJ1Y3QgY3BsX3J4X3BoeXNfZHNnbCkpCisjZGVmaW5lIEhBU0hfVFJBTlNIRFJfU0laRShhbGlnbmVka2N0eF9sZW4pXAorCShUUkFOU0hEUl9TSVpFKGFsaWduZWRrY3R4X2xlbikgKyBEVU1NWV9CWVRFUykKKworI2RlZmluZSBTRUNfQ1BMX09GRlNFVCAoc2l6ZW9mKHN0cnVjdCBmd19jcnlwdG9fbG9va2FzaWRlX3dyKSArIFwKKwkJCXNpemVvZihzdHJ1Y3QgdWxwX3R4cGt0KSArIFwKKwkJCXNpemVvZihzdHJ1Y3QgdWxwdHhfaWRhdGEpKQorCisjZGVmaW5lIEZJTExfU0VDX0NQTF9PUF9JVklOU1IoaWQsIGxlbiwgaGxkciwgb2ZzdCkgICAgICBcCisJaHRvbmwoIFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfT1BDT0RFX1YoQ1BMX1RYX1NFQ19QRFUpIHwgXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9SWENISURfVigoaWQpKSB8IFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfQUNLRk9MTE9XU19WKDApIHwgXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9VTFBUWExQQktfVigxKSB8IFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfQ1BMTEVOX1YoKGxlbikpIHwgXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9QTEFDRUhPTERFUl9WKChobGRyKSkgfCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX0lWSU5TUlRPRlNUX1YoKG9mc3QpKSkKKworI2RlZmluZSAgRklMTF9TRUNfQ1BMX0NJUEhFUlNUT1BfSEkoYV9zdGFydCwgYV9zdG9wLCBjX3N0YXJ0LCBjX3N0b3BfaGkpIFwKKwlodG9ubCggXAorCSAgICAgICBDUExfVFhfU0VDX1BEVV9BQURTVEFSVF9WKChhX3N0YXJ0KSkgfCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX0FBRFNUT1BfVigoYV9zdG9wKSkgfCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUQVJUX1YoKGNfc3RhcnQpKSB8IFwKKwkgICAgICAgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9ISV9WKChjX3N0b3BfaGkpKSkKKworI2RlZmluZSAgRklMTF9TRUNfQ1BMX0FVVEhJTlNFUlQoY19zdG9wX2xvLCBhX3N0YXJ0LCBhX3N0b3AsIGFfaW5zdCkgXAorCWh0b25sKCBcCisJICAgICAgIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfTE9fVigoY19zdG9wX2xvKSkgfCBcCisJCUNQTF9UWF9TRUNfUERVX0FVVEhTVEFSVF9WKChhX3N0YXJ0KSkgfCBcCisJCUNQTF9UWF9TRUNfUERVX0FVVEhTVE9QX1YoKGFfc3RvcCkpIHwgXAorCQlDUExfVFhfU0VDX1BEVV9BVVRISU5TRVJUX1YoKGFfaW5zdCkpKQorCisjZGVmaW5lICBGSUxMX1NFQ19DUExfU0NNRDBfU0VRTk8oY3RybCwgc2VxLCBjbW9kZSwgYW1vZGUsIG9wYWQsIHNpemUsIG5pdnMpICBcCisJCWh0b25sKCBcCisJCVNDTURfU0VRX05PX0NUUkxfVigwKSB8IFwKKwkJU0NNRF9TVEFUVVNfUFJFU0VOVF9WKDApIHwgXAorCQlTQ01EX1BST1RPX1ZFUlNJT05fVihDSENSX1NDTURfUFJPVE9fVkVSU0lPTl9HRU5FUklDKSB8IFwKKwkJU0NNRF9FTkNfREVDX0NUUkxfVigoY3RybCkpIHwgXAorCQlTQ01EX0NJUEhfQVVUSF9TRVFfQ1RSTF9WKChzZXEpKSB8IFwKKwkJU0NNRF9DSVBIX01PREVfVigoY21vZGUpKSB8IFwKKwkJU0NNRF9BVVRIX01PREVfVigoYW1vZGUpKSB8IFwKKwkJU0NNRF9ITUFDX0NUUkxfVigob3BhZCkpIHwgXAorCQlTQ01EX0lWX1NJWkVfVigoc2l6ZSkpIHwgXAorCQlTQ01EX05VTV9JVlNfVigobml2cykpKQorCisjZGVmaW5lIEZJTExfU0VDX0NQTF9JVkdFTl9IRFJMRU4obGFzdCwgbW9yZSwgY3R4X2luLCBtYWMsIGl2ZHJvcCwgbGVuKSBodG9ubCggXAorCQlTQ01EX0VOQl9EQkdJRF9WKDApIHwgXAorCQlTQ01EX0lWX0dFTl9DVFJMX1YoMCkgfCBcCisJCVNDTURfTEFTVF9GUkFHX1YoKGxhc3QpKSB8IFwKKwkJU0NNRF9NT1JFX0ZSQUdTX1YoKG1vcmUpKSB8IFwKKwkJU0NNRF9UTFNfQ09NUFBEVV9WKDApIHwgXAorCQlTQ01EX0tFWV9DVFhfSU5MSU5FX1YoKGN0eF9pbikpIHwgXAorCQlTQ01EX1RMU19GUkFHX0VOQUJMRV9WKDApIHwgXAorCQlTQ01EX01BQ19PTkxZX1YoKG1hYykpIHwgIFwKKwkJU0NNRF9BQURJVkRST1BfVigoaXZkcm9wKSkgfCBcCisJCVNDTURfSERSX0xFTl9WKChsZW4pKSkKKworI2RlZmluZSAgRklMTF9LRVlfQ1RYX0hEUihja19zaXplLCBta19zaXplLCBkX2NrLCBvcGFkLCBjdHhfbGVuKSBcCisJCWh0b25sKEtFWV9DT05URVhUX1ZBTElEX1YoMSkgfCBcCisJCSAgICAgIEtFWV9DT05URVhUX0NLX1NJWkVfVigoY2tfc2l6ZSkpIHwgXAorCQkgICAgICBLRVlfQ09OVEVYVF9NS19TSVpFX1YobWtfc2l6ZSkgfCBcCisJCSAgICAgIEtFWV9DT05URVhUX0RVQUxfQ0tfVigoZF9jaykpIHwgXAorCQkgICAgICBLRVlfQ09OVEVYVF9PUEFEX1BSRVNFTlRfVigob3BhZCkpIHwgXAorCQkgICAgICBLRVlfQ09OVEVYVF9TQUxUX1BSRVNFTlRfVigxKSB8IFwKKwkJICAgICAgS0VZX0NPTlRFWFRfQ1RYX0xFTl9WKChjdHhfbGVuKSkpCisKKyNkZWZpbmUgRklMTF9XUl9PUF9DQ1RYX1NJWkUobGVuLCBjdHhfbGVuKSBcCisJCWh0b25sKCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX09QQ09ERV9WKCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSKSB8IFwKKwkJCUZXX0NSWVBUT19MT09LQVNJREVfV1JfQ09NUExfVigwKSB8IFwKKwkJCUZXX0NSWVBUT19MT09LQVNJREVfV1JfSU1NX0xFTl9WKChsZW4pKSB8IFwKKwkJCUZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9MT0NfVigxKSB8IFwKKwkJCUZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9TSVpFX1YoKGN0eF9sZW4pKSkKKworI2RlZmluZSBGSUxMX1dSX1JYX1FfSUQoY2lkLCBxaWQsIHdyX2l2KSBcCisJCWh0b25sKCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX0NISURfVigoY2lkKSkgfCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX1FfSURfVigocWlkKSkgfCBcCisJCQlGV19DUllQVE9fTE9PS0FTSURFX1dSX0xDQl9WKDApIHwgXAorCQkJRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JVl9WKCh3cl9pdikpKQorCisjZGVmaW5lIEZJTExfVUxQVFhfQ01EX0RFU1QoY2lkKSBcCisJaHRvbmwoVUxQVFhfQ01EX1YoVUxQX1RYX1BLVCkgfCBcCisJICAgICAgVUxQX1RYUEtUX0RFU1RfVigwKSB8IFwKKwkgICAgICBVTFBfVFhQS1RfREFUQU1PRElGWV9WKDApIHwgXAorCSAgICAgIFVMUF9UWFBLVF9DSEFOTkVMSURfVigoY2lkKSkgfCBcCisJICAgICAgVUxQX1RYUEtUX1JPX1YoMSkgfCBcCisJICAgICAgVUxQX1RYUEtUX0ZJRF9WKDApKQorCisjZGVmaW5lIEtFWUNUWF9BTElHTl9QQUQoYnMpICh7dW5zaWduZWQgaW50IF9icyA9IChicyk7XAorCQkJICAgICAgX2JzID09IFNIQTFfRElHRVNUX1NJWkUgPyAxMiA6IDA7IH0pCisKKyNkZWZpbmUgRklMTF9QTERfU0laRV9IQVNIX1NJWkUocGF5bG9hZF9zZ2xfbGVuLCBzZ2xfbGVuZ3RocywgdG90YWxfZnJhZ3MpIFwKKwlodG9ubChGV19DUllQVE9fTE9PS0FTSURFX1dSX1BMRF9TSVpFX1YocGF5bG9hZF9zZ2xfbGVuID8gXAorCQkJCQkJc2dsX2xlbmd0aHNbdG90YWxfZnJhZ3NdIDogMCkgfFwKKwkgICAgICBGV19DUllQVE9fTE9PS0FTSURFX1dSX0hBU0hfU0laRV9WKDApKQorCisjZGVmaW5lIEZJTExfTEVOX1BLRChjYWxjX3R4X2ZsaXRzX29mbGQsIHNrYikgXAorCWh0b25sKEZXX0NSWVBUT19MT09LQVNJREVfV1JfTEVOMTZfVihESVZfUk9VTkRfVVAoKFwKKwkJCQkJICAgY2FsY190eF9mbGl0c19vZmxkKHNrYikgKiA4KSwgMTYpKSkKKworI2RlZmluZSBGSUxMX0NNRF9NT1JFKGltbWRhdGFsZW4pIGh0b25sKFVMUFRYX0NNRF9WKFVMUF9UWF9TQ19JTU0pIHxcCisJCQkJCVVMUF9UWF9TQ19NT1JFX1YoKGltbWRhdGFsZW4pID8gMCA6IDEpKQorCisjZGVmaW5lIE1BWF9OSyA4CisjZGVmaW5lIENSWVBUT19NQVhfSU1NX1RYX1BLVF9MRU4gMjU2CisKK3N0cnVjdCBhbGdvX3BhcmFtIHsKKwl1bnNpZ25lZCBpbnQgYXV0aF9tb2RlOworCXVuc2lnbmVkIGludCBta19zaXplOworCXVuc2lnbmVkIGludCByZXN1bHRfc2l6ZTsKK307CisKK3N0cnVjdCBoYXNoX3dyX3BhcmFtIHsKKwl1bnNpZ25lZCBpbnQgb3BhZF9uZWVkZWQ7CisJdW5zaWduZWQgaW50IG1vcmU7CisJdW5zaWduZWQgaW50IGxhc3Q7CisJc3RydWN0IGFsZ29fcGFyYW0gYWxnX3BybTsKKwl1bnNpZ25lZCBpbnQgc2dfbGVuOworCXVuc2lnbmVkIGludCBiZnJfbGVuOworCXU2NCBzY21kMTsKK307CisKK2VudW0geworCUFFU19LRVlMRU5HVEhfMTI4QklUID0gMTI4LAorCUFFU19LRVlMRU5HVEhfMTkyQklUID0gMTkyLAorCUFFU19LRVlMRU5HVEhfMjU2QklUID0gMjU2Cit9OworCitlbnVtIHsKKwlLRVlMRU5HVEhfM0JZVEVTID0gMywKKwlLRVlMRU5HVEhfNEJZVEVTID0gNCwKKwlLRVlMRU5HVEhfNkJZVEVTID0gNiwKKwlLRVlMRU5HVEhfOEJZVEVTID0gOAorfTsKKworZW51bSB7CisJTlVNQkVSX09GX1JPVU5EU18xMCA9IDEwLAorCU5VTUJFUl9PRl9ST1VORFNfMTIgPSAxMiwKKwlOVU1CRVJfT0ZfUk9VTkRTXzE0ID0gMTQsCit9OworCisvKgorICogQ0NNIGRlZmluZXMgdmFsdWVzIG9mIDQsIDYsIDgsIDEwLCAxMiwgMTQsIGFuZCAxNiBvY3RldHMsCisgKiB3aGVyZSB0aGV5IGluZGljYXRlIHRoZSBzaXplIG9mIHRoZSBpbnRlZ3JpdHkgY2hlY2sgdmFsdWUgKElDVikKKyAqLworZW51bSB7CisJQUVTX0NDTV9JQ1ZfNCAgID0gNCwKKwlBRVNfQ0NNX0lDVl82ICAgPSA2LAorCUFFU19DQ01fSUNWXzggICA9IDgsCisJQUVTX0NDTV9JQ1ZfMTAgID0gMTAsCisJQUVTX0NDTV9JQ1ZfMTIgID0gMTIsCisJQUVTX0NDTV9JQ1ZfMTQgID0gMTQsCisJQUVTX0NDTV9JQ1ZfMTYgPSAxNgorfTsKKworc3RydWN0IGhhc2hfb3BfcGFyYW1zIHsKKwl1bnNpZ25lZCBjaGFyIG1rX3NpemU7CisJdW5zaWduZWQgY2hhciBwYWRfYWxpZ247CisJdW5zaWduZWQgY2hhciBhdXRoX21vZGU7CisJY2hhciBoYXNoX25hbWVbTUFYX0hBU0hfTkFNRV07CisJdW5zaWduZWQgc2hvcnQgYmxvY2tfc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCB3b3JkX3NpemU7CisJdW5zaWduZWQgc2hvcnQgaXBhZF9zaXplOworfTsKKworc3RydWN0IHBoeXNfc2dlX3BhaXJzIHsKKwlfX2JlMTYgbGVuWzhdOworCV9fYmU2NCBhZGRyWzhdOworfTsKKworc3RydWN0IHBoeXNfc2dlX3Bhcm0geworCXVuc2lnbmVkIGludCBuZW50czsKKwl1bnNpZ25lZCBpbnQgb2JzaXplOworCXVuc2lnbmVkIHNob3J0IHFpZDsKKwl1bnNpZ25lZCBjaGFyIGFsaWduOworfTsKKworc3RydWN0IGNyeXB0b19yZXN1bHQgeworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247CisJaW50IGVycjsKK307CisKK3N0YXRpYyBjb25zdCB1MzIgc2hhMV9pbml0W1NIQTFfRElHRVNUX1NJWkUgLyA0XSA9IHsKKwkJU0hBMV9IMCwgU0hBMV9IMSwgU0hBMV9IMiwgU0hBMV9IMywgU0hBMV9INCwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgc2hhMjI0X2luaXRbU0hBMjU2X0RJR0VTVF9TSVpFIC8gNF0gPSB7CisJCVNIQTIyNF9IMCwgU0hBMjI0X0gxLCBTSEEyMjRfSDIsIFNIQTIyNF9IMywKKwkJU0hBMjI0X0g0LCBTSEEyMjRfSDUsIFNIQTIyNF9INiwgU0hBMjI0X0g3LAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBzaGEyNTZfaW5pdFtTSEEyNTZfRElHRVNUX1NJWkUgLyA0XSA9IHsKKwkJU0hBMjU2X0gwLCBTSEEyNTZfSDEsIFNIQTI1Nl9IMiwgU0hBMjU2X0gzLAorCQlTSEEyNTZfSDQsIFNIQTI1Nl9INSwgU0hBMjU2X0g2LCBTSEEyNTZfSDcsCit9OworCitzdGF0aWMgY29uc3QgdTY0IHNoYTM4NF9pbml0W1NIQTUxMl9ESUdFU1RfU0laRSAvIDhdID0geworCQlTSEEzODRfSDAsIFNIQTM4NF9IMSwgU0hBMzg0X0gyLCBTSEEzODRfSDMsCisJCVNIQTM4NF9INCwgU0hBMzg0X0g1LCBTSEEzODRfSDYsIFNIQTM4NF9INywKK307CisKK3N0YXRpYyBjb25zdCB1NjQgc2hhNTEyX2luaXRbU0hBNTEyX0RJR0VTVF9TSVpFIC8gOF0gPSB7CisJCVNIQTUxMl9IMCwgU0hBNTEyX0gxLCBTSEE1MTJfSDIsIFNIQTUxMl9IMywKKwkJU0hBNTEyX0g0LCBTSEE1MTJfSDUsIFNIQTUxMl9INiwgU0hBNTEyX0g3LAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGNvcHlfaGFzaF9pbml0X3ZhbHVlcyhjaGFyICprZXksIGludCBkaWdlc3RzaXplKQoreworCXU4IGk7CisJX19iZTMyICpka2V5ID0gKF9fYmUzMiAqKWtleTsKKwl1NjQgKmxka2V5ID0gKHU2NCAqKWtleTsKKwlfX2JlNjQgKnNoYTM4NCA9IChfX2JlNjQgKilzaGEzODRfaW5pdDsKKwlfX2JlNjQgKnNoYTUxMiA9IChfX2JlNjQgKilzaGE1MTJfaW5pdDsKKworCXN3aXRjaCAoZGlnZXN0c2l6ZSkgeworCWNhc2UgU0hBMV9ESUdFU1RfU0laRToKKwkJZm9yIChpID0gMDsgaSA8IFNIQTFfSU5JVF9TVEFURTsgaSsrKQorCQkJZGtleVtpXSA9IGNwdV90b19iZTMyKHNoYTFfaW5pdFtpXSk7CisJCWJyZWFrOworCWNhc2UgU0hBMjI0X0RJR0VTVF9TSVpFOgorCQlmb3IgKGkgPSAwOyBpIDwgU0hBMjI0X0lOSVRfU1RBVEU7IGkrKykKKwkJCWRrZXlbaV0gPSBjcHVfdG9fYmUzMihzaGEyMjRfaW5pdFtpXSk7CisJCWJyZWFrOworCWNhc2UgU0hBMjU2X0RJR0VTVF9TSVpFOgorCQlmb3IgKGkgPSAwOyBpIDwgU0hBMjU2X0lOSVRfU1RBVEU7IGkrKykKKwkJCWRrZXlbaV0gPSBjcHVfdG9fYmUzMihzaGEyNTZfaW5pdFtpXSk7CisJCWJyZWFrOworCWNhc2UgU0hBMzg0X0RJR0VTVF9TSVpFOgorCQlmb3IgKGkgPSAwOyBpIDwgU0hBMzg0X0lOSVRfU1RBVEU7IGkrKykKKwkJCWxka2V5W2ldID0gYmU2NF90b19jcHUoc2hhMzg0W2ldKTsKKwkJYnJlYWs7CisJY2FzZSBTSEE1MTJfRElHRVNUX1NJWkU6CisJCWZvciAoaSA9IDA7IGkgPCBTSEE1MTJfSU5JVF9TVEFURTsgaSsrKQorCQkJbGRrZXlbaV0gPSBiZTY0X3RvX2NwdShzaGE1MTJbaV0pOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCB1OCBzZ2xfbGVuZ3Roc1syMF0gPSB7CisJMCwgMSwgMiwgMywgNCwgNCwgNSwgNiwgNywgNywgOCwgOSwgMTAsIDEwLCAxMSwgMTIsIDEzLCAxMywgMTQsIDE1Cit9OworCisvKiBOdW1iZXIgb2YgbGVuIGZpZWxkcyg4KSAqIHNpemUgb2Ygb25lIGFkZHIgZmllbGQgKi8KKyNkZWZpbmUgUEhZU0RTR0xfTUFYX0xFTl9TSVpFIDE2CisKK3N0YXRpYyBpbmxpbmUgdTE2IGdldF9zcGFjZV9mb3JfcGh5c19kc2dsKHVuc2lnbmVkIGludCBzZ2xfZW50cikKK3sKKwkvKiBsZW4gZmllbGQgc2l6ZSArIGFkZHIgZmllbGQgc2l6ZSAqLworCXJldHVybiAoKHNnbF9lbnRyID4+IDMpICsgKChzZ2xfZW50ciAlIDgpID8KKwkJCQkgICAxIDogMCkpICogUEhZU0RTR0xfTUFYX0xFTl9TSVpFICsKKwkJKHNnbF9lbnRyIDw8IDMpICsgKChzZ2xfZW50ciAlIDIgPyAxIDogMCkgPDwgMyk7Cit9CisKKy8qIFRoZSBBRVMgcy10cmFuc2Zvcm0gbWF0cml4IChzLWJveCkuICovCitzdGF0aWMgY29uc3QgdTggYWVzX3Nib3hbMjU2XSA9IHsKKwk5OSwgIDEyNCwgMTE5LCAxMjMsIDI0MiwgMTA3LCAxMTEsIDE5NywgNDgsICAxLCAgIDEwMywgNDMsICAyNTQsIDIxNSwKKwkxNzEsIDExOCwgMjAyLCAxMzAsIDIwMSwgMTI1LCAyNTAsIDg5LCAgNzEsICAyNDAsIDE3MywgMjEyLCAxNjIsIDE3NSwKKwkxNTYsIDE2NCwgMTE0LCAxOTIsIDE4MywgMjUzLCAxNDcsIDM4LCAgNTQsICA2MywgIDI0NywgMjA0LCA1MiwgIDE2NSwKKwkyMjksIDI0MSwgMTEzLCAyMTYsIDQ5LCAgMjEsIDQsICAgMTk5LCAzNSwgIDE5NSwgMjQsICAxNTAsIDUsIDE1NCwgNywKKwkxOCwgIDEyOCwgMjI2LCAyMzUsIDM5LCAgMTc4LCAxMTcsIDksICAgMTMxLCA0NCwgIDI2LCAgMjcsICAxMTAsIDkwLAorCTE2MCwgODIsICA1OSwgIDIxNCwgMTc5LCA0MSwgIDIyNywgNDcsICAxMzIsIDgzLCAgMjA5LCAwLCAgIDIzNywgMzIsCisJMjUyLCAxNzcsIDkxLCAgMTA2LCAyMDMsIDE5MCwgNTcsICA3NCwgIDc2LCAgODgsICAyMDcsIDIwOCwgMjM5LCAxNzAsCisJMjUxLCA2NywgIDc3LCAgNTEsICAxMzMsIDY5LCAgMjQ5LCAyLCAgIDEyNywgODAsICA2MCwgIDE1OSwgMTY4LCA4MSwKKwkxNjMsIDY0LCAgMTQzLCAxNDYsIDE1NywgNTYsICAyNDUsIDE4OCwgMTgyLCAyMTgsIDMzLCAgMTYsICAyNTUsIDI0MywKKwkyMTAsIDIwNSwgMTIsICAxOSwgIDIzNiwgOTUsICAxNTEsIDY4LCAgMjMsICAxOTYsIDE2NywgMTI2LCA2MSwgIDEwMCwKKwk5MywgIDI1LCAgMTE1LCA5NiwgIDEyOSwgNzksICAyMjAsIDM0LCAgNDIsICAxNDQsIDEzNiwgNzAsICAyMzgsIDE4NCwKKwkyMCwgIDIyMiwgOTQsICAxMSwgIDIxOSwgMjI0LCA1MCwgIDU4LCAgMTAsICA3MywgIDYsICAgMzYsICA5MiwgIDE5NCwKKwkyMTEsIDE3MiwgOTgsICAxNDUsIDE0OSwgMjI4LCAxMjEsIDIzMSwgMjAwLCA1NSwgIDEwOSwgMTQxLCAyMTMsIDc4LAorCTE2OSwgMTA4LCA4NiwgIDI0NCwgMjM0LCAxMDEsIDEyMiwgMTc0LCA4LCAxODYsIDEyMCwgMzcsICA0NiwgIDI4LCAxNjYsCisJMTgwLCAxOTgsIDIzMiwgMjIxLCAxMTYsIDMxLCAgNzUsICAxODksIDEzOSwgMTM4LCAxMTIsIDYyLCAgMTgxLCAxMDIsCisJNzIsICAzLCAgIDI0NiwgMTQsICA5NywgIDUzLCAgODcsICAxODUsIDEzNCwgMTkzLCAyOSwgIDE1OCwgMjI1LCAyNDgsCisJMTUyLCAxNywgIDEwNSwgMjE3LCAxNDIsIDE0OCwgMTU1LCAzMCwgIDEzNSwgMjMzLCAyMDYsIDg1LCAgNDAsICAyMjMsCisJMTQwLCAxNjEsIDEzNywgMTMsICAxOTEsIDIzMCwgNjYsICAxMDQsIDY1LCAgMTUzLCA0NSwgIDE1LCAgMTc2LCA4NCwKKwkxODcsIDIyCit9OworCitzdGF0aWMgdTMyIGFlc19rc19zdWJ3b3JkKGNvbnN0IHUzMiB3KQoreworCXU4IGJ5dGVzWzRdOworCisJKih1MzIgKikoJmJ5dGVzWzBdKSA9IHc7CisJYnl0ZXNbMF0gPSBhZXNfc2JveFtieXRlc1swXV07CisJYnl0ZXNbMV0gPSBhZXNfc2JveFtieXRlc1sxXV07CisJYnl0ZXNbMl0gPSBhZXNfc2JveFtieXRlc1syXV07CisJYnl0ZXNbM10gPSBhZXNfc2JveFtieXRlc1szXV07CisJcmV0dXJuICoodTMyICopKCZieXRlc1swXSk7Cit9CisKK3N0YXRpYyB1MzIgcm91bmRfY29uc3RhbnRbMTFdID0geworCTB4MDEwMDAwMDAsIDB4MDIwMDAwMDAsIDB4MDQwMDAwMDAsIDB4MDgwMDAwMDAsCisJMHgxMDAwMDAwMCwgMHgyMDAwMDAwMCwgMHg0MDAwMDAwMCwgMHg4MDAwMDAwMCwKKwkweDFCMDAwMDAwLCAweDM2MDAwMDAwLCAweDZDMDAwMDAwCit9OworCisvKiBkZWNfa2V5IC0gT1VUUFVUIC0gUmV2ZXJzZSByb3VuZCBrZXkKKyAqIGtleSAtIElOUFVUIC0ga2V5CisgKiBrZXlsZW5ndGggLSBJTlBVVCAtIGxlbmd0aCBvZiB0aGUga2V5IGluIG51bWJlciBvZiBiaXRzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfYWVzX2RlY3J5cHRfa2V5KHVuc2lnbmVkIGNoYXIgKmRlY19rZXksCisJCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGtleWxlbmd0aCkKK3sKKwl1MzIgdGVtcDsKKwl1MzIgd19yaW5nW01BWF9OS107CisJaW50IGksIGosIGsgPSAwOworCXU4ICBuciwgbms7CisKKwlzd2l0Y2ggKGtleWxlbmd0aCkgeworCWNhc2UgQUVTX0tFWUxFTkdUSF8xMjhCSVQ6CisJCW5rID0gS0VZTEVOR1RIXzRCWVRFUzsKKwkJbnIgPSBOVU1CRVJfT0ZfUk9VTkRTXzEwOworCQlicmVhazsKKworCWNhc2UgQUVTX0tFWUxFTkdUSF8xOTJCSVQ6CisJCW5rID0gS0VZTEVOR1RIXzZCWVRFUzsKKwkJbnIgPSBOVU1CRVJfT0ZfUk9VTkRTXzEyOworCQlicmVhazsKKwljYXNlIEFFU19LRVlMRU5HVEhfMjU2QklUOgorCQluayA9IEtFWUxFTkdUSF84QllURVM7CisJCW5yID0gTlVNQkVSX09GX1JPVU5EU18xNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbms7IGkrKyApCisJCXdfcmluZ1tpXSA9IGJlMzJfdG9fY3B1KCoodTMyICopJmtleVs0ICogaV0pOworCisJaSA9IDA7CisJdGVtcCA9IHdfcmluZ1tuayAtIDFdOworCXdoaWxlKGkgKyBuayA8IChuciArIDEpICogNCkgeworCQlpZighKGkgJSBuaykpIHsKKwkJCS8qIFJvdFdvcmQodGVtcCkgKi8KKwkJCXRlbXAgPSAodGVtcCA8PCA4KSB8ICh0ZW1wID4+IDI0KTsKKwkJCXRlbXAgPSBhZXNfa3Nfc3Vid29yZCh0ZW1wKTsKKwkJCXRlbXAgXj0gcm91bmRfY29uc3RhbnRbaSAvIG5rXTsKKwkJfQorCQllbHNlIGlmIChuayA9PSA4ICYmIChpICUgNCA9PSAwKSkKKwkJCXRlbXAgPSBhZXNfa3Nfc3Vid29yZCh0ZW1wKTsKKwkJd19yaW5nW2kgJSBua10gXj0gdGVtcDsKKwkJdGVtcCA9IHdfcmluZ1tpICUgbmtdOworCQlpKys7CisJfQorCWZvciAoayA9IDAsIGogPSBpICUgbms7IGsgPCBuazsgaysrKSB7CisJCSooKHUzMiAqKWRlY19rZXkgKyBrKSA9IGh0b25sKHdfcmluZ1tqXSk7CisJCWotLTsKKwkJaWYoaiA8IDApCisJCQlqICs9IG5rOworCX0KK30KKworI2VuZGlmIC8qIF9fQ0hDUl9BTEdPX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2NvcmUuYyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI1ZjliYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jb3JlLmMKQEAgLTAsMCArMSwyMzggQEAKKy8qKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQvVDUvVDYgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogV3JpdHRlbiBhbmQgTWFpbnRhaW5lZCBieToKKyAqIE1hbm9qIE1hbHZpeWEgKG1hbm9qbWFsdml5YUBjaGVsc2lvLmNvbSkKKyAqIEF0dWwgR3VwdGEgKGF0dWwuZ3VwdGFAY2hlbHNpby5jb20pCisgKiBKaXRlbmRyYSBMdWxsYSAoamx1bGxhQGNoZWxzaW8uY29tKQorICogWWVzaGFzd2kgTSBSIEdvd2RhICh5ZXNoYXN3aUBjaGVsc2lvLmNvbSkKKyAqIEhhcnNoIEphaW4gKGhhcnNoQGNoZWxzaW8uY29tKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKworI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KKyNpbmNsdWRlIDxjcnlwdG8vaGFzaC5oPgorCisjaW5jbHVkZSAidDRfbXNnLmgiCisjaW5jbHVkZSAiY2hjcl9jb3JlLmgiCisjaW5jbHVkZSAiY3hnYjRfdWxkLmgiCisKK3N0YXRpYyBMSVNUX0hFQUQodWxkX2N0eF9saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZGV2X211dGV4KTsKK3N0YXRpYyBhdG9taWNfdCBkZXZfY291bnQ7CisKK3R5cGVkZWYgaW50ICgqY2hjcl9oYW5kbGVyX2Z1bmMpKHN0cnVjdCBjaGNyX2RldiAqZGV2LCB1bnNpZ25lZCBjaGFyICppbnB1dCk7CitzdGF0aWMgaW50IGNwbF9mdzZfcGxkX2hhbmRsZXIoc3RydWN0IGNoY3JfZGV2ICpkZXYsIHVuc2lnbmVkIGNoYXIgKmlucHV0KTsKK3N0YXRpYyB2b2lkICpjaGNyX3VsZF9hZGQoY29uc3Qgc3RydWN0IGN4Z2I0X2xsZF9pbmZvICpsbGQpOworc3RhdGljIGludCBjaGNyX3VsZF9zdGF0ZV9jaGFuZ2Uodm9pZCAqaGFuZGxlLCBlbnVtIGN4Z2I0X3N0YXRlIHN0YXRlKTsKKworc3RhdGljIGNoY3JfaGFuZGxlcl9mdW5jIHdvcmtfaGFuZGxlcnNbTlVNX0NQTF9DTURTXSA9IHsKKwlbQ1BMX0ZXNl9QTERdID0gY3BsX2Z3Nl9wbGRfaGFuZGxlciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3hnYjRfdWxkX2luZm8gY2hjcl91bGRfaW5mbyA9IHsKKwkubmFtZSA9IERSVl9NT0RVTEVfTkFNRSwKKwkubnJ4cSA9IE1BWF9VTERfUVNFVFMsCisJLnJ4cV9zaXplID0gMTAyNCwKKwkuYWRkID0gY2hjcl91bGRfYWRkLAorCS5zdGF0ZV9jaGFuZ2UgPSBjaGNyX3VsZF9zdGF0ZV9jaGFuZ2UsCisJLnJ4X2hhbmRsZXIgPSBjaGNyX3VsZF9yeF9oYW5kbGVyLAorfTsKKworaW50IGFzc2lnbl9jaGNyX2RldmljZShzdHJ1Y3QgY2hjcl9kZXYgKipkZXYpCit7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4OworCisJLyoKKwkgKiBXaGljaCBkZXZpY2UgdG8gdXNlIGlmIG11bHRpcGxlIGRldmljZXMgYXJlIGF2YWlsYWJsZSBUT0RPCisJICogTWF5IGJlIHNlbGVjdCB0aGUgZGV2aWNlIGJhc2VkIG9uIHJvdW5kIHJvYmluLiBPbmUgc2Vzc2lvbgorCSAqIG11c3QgZ28gdG8gdGhlIHNhbWUgZGV2aWNlIHRvIG1haW50YWluIHRoZSBvcmRlcmluZy4KKwkgKi8KKwltdXRleF9sb2NrKCZkZXZfbXV0ZXgpOyAvKiBUT0RPID8gKi8KKwl1X2N0eCA9IGxpc3RfZmlyc3RfZW50cnkoJnVsZF9jdHhfbGlzdCwgc3RydWN0IHVsZF9jdHgsIGVudHJ5KTsKKwlpZiAoIXVfY3R4KSB7CisJCW11dGV4X3VubG9jaygmZGV2X211dGV4KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwkqZGV2ID0gdV9jdHgtPmRldjsKKwltdXRleF91bmxvY2soJmRldl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9kZXZfYWRkKHN0cnVjdCB1bGRfY3R4ICp1X2N0eCkKK3sKKwlzdHJ1Y3QgY2hjcl9kZXYgKmRldjsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTlhJTzsKKworCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2tfY2hjcl9kZXYpOworCXVfY3R4LT5kZXYgPSBkZXY7CisJZGV2LT51X2N0eCA9IHVfY3R4OworCWF0b21pY19pbmMoJmRldl9jb3VudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hjcl9kZXZfcmVtb3ZlKHN0cnVjdCB1bGRfY3R4ICp1X2N0eCkKK3sKKwlrZnJlZSh1X2N0eC0+ZGV2KTsKKwl1X2N0eC0+ZGV2ID0gTlVMTDsKKwlhdG9taWNfZGVjKCZkZXZfY291bnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwbF9mdzZfcGxkX2hhbmRsZXIoc3RydWN0IGNoY3JfZGV2ICpkZXYsCisJCQkgICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQpCit7CisJc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXE7CisJc3RydWN0IGNwbF9mdzZfcGxkICpmdzZfcGxkOworCXUzMiBhY2tfZXJyX3N0YXR1cyA9IDA7CisJaW50IGVycm9yX3N0YXR1cyA9IDA7CisKKwlmdzZfcGxkID0gKHN0cnVjdCBjcGxfZnc2X3BsZCAqKWlucHV0OworCXJlcSA9IChzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKikodWludHB0cl90KWJlNjRfdG9fY3B1KAorCQkJCQkJICAgIGZ3Nl9wbGQtPmRhdGFbMV0pOworCisJYWNrX2Vycl9zdGF0dXMgPQorCQludG9obCgqKF9fYmUzMiAqKSgodW5zaWduZWQgY2hhciAqKSZmdzZfcGxkLT5kYXRhWzBdICsgNCkpOworCWlmIChhY2tfZXJyX3N0YXR1cykgeworCQlpZiAoQ0hLX01BQ19FUlJfQklUKGFja19lcnJfc3RhdHVzKSB8fAorCQkgICAgQ0hLX1BBRF9FUlJfQklUKGFja19lcnJfc3RhdHVzKSkKKwkJCWVycm9yX3N0YXR1cyA9IC1FSU5WQUw7CisJfQorCS8qIGNhbGwgY29tcGxldGlvbiBjYWxsYmFjayB3aXRoIGZhaWx1cmUgc3RhdHVzICovCisJaWYgKHJlcSkgeworCQlpZiAoIWNoY3JfaGFuZGxlX3Jlc3AocmVxLCBpbnB1dCwgZXJyb3Jfc3RhdHVzKSkKKwkJCXJlcS0+Y29tcGxldGUocmVxLCBlcnJvcl9zdGF0dXMpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlwcl9lcnIoIkluY29ycmVjdCByZXF1ZXN0IGFkZHJlc3MgZnJvbSB0aGUgZmlybXdhcmVcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBjaGNyX3NlbmRfd3Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gY3hnYjRfb2ZsZF9zZW5kKHNrYi0+ZGV2LCBza2IpOworfQorCitzdGF0aWMgdm9pZCAqY2hjcl91bGRfYWRkKGNvbnN0IHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqbGxkKQoreworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eDsKKworCS8qIENyZWF0ZSB0aGUgZGV2aWNlIGFuZCBhZGQgaXQgaW4gdGhlIGRldmljZSBsaXN0ICovCisJdV9jdHggPSBremFsbG9jKHNpemVvZigqdV9jdHgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVfY3R4KSB7CisJCXVfY3R4ID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBvdXQ7CisJfQorCXVfY3R4LT5sbGRpID0gKmxsZDsKKwltdXRleF9sb2NrKCZkZXZfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJnVfY3R4LT5lbnRyeSwgJnVsZF9jdHhfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfbXV0ZXgpOworb3V0OgorCXJldHVybiB1X2N0eDsKK30KKworaW50IGNoY3JfdWxkX3J4X2hhbmRsZXIodm9pZCAqaGFuZGxlLCBjb25zdCBfX2JlNjQgKnJzcCwKKwkJCWNvbnN0IHN0cnVjdCBwa3RfZ2wgKnBnbCkKK3sKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHggPSAoc3RydWN0IHVsZF9jdHggKiloYW5kbGU7CisJc3RydWN0IGNoY3JfZGV2ICpkZXYgPSB1X2N0eC0+ZGV2OworCWNvbnN0IHN0cnVjdCBjcGxfYWN0X2VzdGFibGlzaCAqcnBsID0gKHN0cnVjdCBjcGxfYWN0X2VzdGFibGlzaAorCQkJCQkgICAgICAgKilyc3A7CisKKwlpZiAocnBsLT5vdC5vcGNvZGUgIT0gQ1BMX0ZXNl9QTEQpIHsKKwkJcHJfZXJyKCJVbnN1cHBvcnRlZCBvcGNvZGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXBnbCkKKwkJd29ya19oYW5kbGVyc1tycGwtPm90Lm9wY29kZV0oZGV2LCAodW5zaWduZWQgY2hhciAqKSZyc3BbMV0pOworCWVsc2UKKwkJd29ya19oYW5kbGVyc1tycGwtPm90Lm9wY29kZV0oZGV2LCBwZ2wtPnZhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGNyX3VsZF9zdGF0ZV9jaGFuZ2Uodm9pZCAqaGFuZGxlLCBlbnVtIGN4Z2I0X3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCB1bGRfY3R4ICp1X2N0eCA9IGhhbmRsZTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIENYR0I0X1NUQVRFX1VQOgorCQlpZiAoIXVfY3R4LT5kZXYpIHsKKwkJCXJldCA9IGNoY3JfZGV2X2FkZCh1X2N0eCk7CisJCQlpZiAocmV0ICE9IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoYXRvbWljX3JlYWQoJmRldl9jb3VudCkgPT0gMSkKKwkJCXJldCA9IHN0YXJ0X2NyeXB0bygpOworCQlicmVhazsKKworCWNhc2UgQ1hHQjRfU1RBVEVfREVUQUNIOgorCQlpZiAodV9jdHgtPmRldikgeworCQkJbXV0ZXhfbG9jaygmZGV2X211dGV4KTsKKwkJCWNoY3JfZGV2X3JlbW92ZSh1X2N0eCk7CisJCQltdXRleF91bmxvY2soJmRldl9tdXRleCk7CisJCX0KKwkJaWYgKCFhdG9taWNfcmVhZCgmZGV2X2NvdW50KSkKKwkJCXN0b3BfY3J5cHRvKCk7CisJCWJyZWFrOworCisJY2FzZSBDWEdCNF9TVEFURV9TVEFSVF9SRUNPVkVSWToKKwljYXNlIENYR0I0X1NUQVRFX0RPV046CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNoY3JfY3J5cHRvX2luaXQodm9pZCkKK3sKKwlpZiAoY3hnYjRfcmVnaXN0ZXJfdWxkKENYR0I0X1VMRF9DUllQVE8sICZjaGNyX3VsZF9pbmZvKSkgeworCQlwcl9lcnIoIlVMRCByZWdpc3RlciBmYWlsOiBObyBjaGNyIGNyeXB0byBzdXBwb3J0IGluIGN4Z2I0Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNoY3JfY3J5cHRvX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgdWxkX2N0eCAqdV9jdHgsICp0bXA7CisKKwlpZiAoYXRvbWljX3JlYWQoJmRldl9jb3VudCkpCisJCXN0b3BfY3J5cHRvKCk7CisKKwkvKiBSZW1vdmUgYWxsIGRldmljZXMgZnJvbSBsaXN0ICovCisJbXV0ZXhfbG9jaygmZGV2X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodV9jdHgsIHRtcCwgJnVsZF9jdHhfbGlzdCwgZW50cnkpIHsKKwkJaWYgKHVfY3R4LT5kZXYpCisJCQljaGNyX2Rldl9yZW1vdmUodV9jdHgpOworCQlrZnJlZSh1X2N0eCk7CisJfQorCW11dGV4X3VubG9jaygmZGV2X211dGV4KTsKKwljeGdiNF91bnJlZ2lzdGVyX3VsZChDWEdCNF9VTERfQ1JZUFRPKTsKK30KKworbW9kdWxlX2luaXQoY2hjcl9jcnlwdG9faW5pdCk7Cittb2R1bGVfZXhpdChjaGNyX2NyeXB0b19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDcnlwdG8gQ28tcHJvY2Vzc29yIGZvciBDaGVsc2lvIFRlcm1pbmF0b3IgY2FyZHMuIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDaGVsc2lvIENvbW11bmljYXRpb25zIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9jaGVsc2lvL2NoY3JfY29yZS5oIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTVjNjcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2NvcmUuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDYgQ3J5cHRvIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19DSENSX0NPUkVfSF9fCisjZGVmaW5lIF9fQ0hDUl9DT1JFX0hfXworCisjaW5jbHVkZSA8Y3J5cHRvL2FsZ2FwaS5oPgorI2luY2x1ZGUgInQ0X2h3LmgiCisjaW5jbHVkZSAiY3hnYjQuaCIKKyNpbmNsdWRlICJjeGdiNF91bGQuaCIKKworI2RlZmluZSBEUlZfTU9EVUxFX05BTUUgImNoY3IiCisjZGVmaW5lIERSVl9WRVJTSU9OICIxLjAuMC4wIgorCisjZGVmaW5lIE1BWF9QRU5ESU5HX1JFUV9UT19IVyAyMAorI2RlZmluZSBDSENSX1RFU1RfUkVTUE9OU0VfVElNRU9VVCAxMDAwCisKKyNkZWZpbmUgUEFEX0VSUk9SX0JJVAkJMQorI2RlZmluZSBDSEtfUEFEX0VSUl9CSVQoeCkJKCgoeCkgPj4gUEFEX0VSUk9SX0JJVCkgJiAxKQorCisjZGVmaW5lIE1BQ19FUlJPUl9CSVQJCTAKKyNkZWZpbmUgQ0hLX01BQ19FUlJfQklUKHgpCSgoKHgpID4+IE1BQ19FUlJPUl9CSVQpICYgMSkKKworc3RydWN0IHVsZF9jdHg7CisKK3N0cnVjdCBjaGNyX2RldiB7CisJLyogUmVxdWVzdCBzdWJtaXRlZCB0byBoL3cgYW5kIHdhaXRpbmcgZm9yIHJlc3BvbnNlLiAqLworCXNwaW5sb2NrX3QgbG9ja19jaGNyX2RldjsKKwlzdHJ1Y3QgY3J5cHRvX3F1ZXVlIHBlbmRpbmdfcXVldWU7CisJc3RydWN0IHVsZF9jdHggKnVfY3R4OworCXVuc2lnbmVkIGNoYXIgdHhfY2hhbm5lbF9pZDsKK307CisKK3N0cnVjdCB1bGRfY3R4IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5OworCXN0cnVjdCBjeGdiNF9sbGRfaW5mbyBsbGRpOworCXN0cnVjdCBjaGNyX2RldiAqZGV2OworfTsKKworaW50IGFzc2lnbl9jaGNyX2RldmljZShzdHJ1Y3QgY2hjcl9kZXYgKipkZXYpOworaW50IGNoY3Jfc2VuZF93cihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBzdGFydF9jcnlwdG8odm9pZCk7CitpbnQgc3RvcF9jcnlwdG8odm9pZCk7CitpbnQgY2hjcl91bGRfcnhfaGFuZGxlcih2b2lkICpoYW5kbGUsIGNvbnN0IF9fYmU2NCAqcnNwLAorCQkJY29uc3Qgc3RydWN0IHBrdF9nbCAqcGdsKTsKK2ludCBjaGNyX2hhbmRsZV9yZXNwKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxLCB1bnNpZ25lZCBjaGFyICppbnB1dCwKKwkJICAgICBpbnQgZXJyKTsKKyNlbmRpZiAvKiBfX0NIQ1JfQ09SRV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jcnlwdG8uaCBiL2RyaXZlcnMvY3J5cHRvL2NoZWxzaW8vY2hjcl9jcnlwdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Q3NTYwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vY2hlbHNpby9jaGNyX2NyeXB0by5oCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDYgQ3J5cHRvIGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19DSENSX0NSWVBUT19IX18KKyNkZWZpbmUgX19DSENSX0NSWVBUT19IX18KKworLyogRGVmaW5lIGZvbGxvd2luZyBpZiBoL3cgaXMgbm90IGRyb3BwaW5nIHRoZSBBQUQgYW5kIElWIGRhdGEgYmVmb3JlCisgKiBnaXZpbmcgdGhlIHByb2Nlc3NlZCBkYXRhCisgKi8KKworI2RlZmluZSBDSENSX0NSQV9QUklPUklUWSAzMDAKKworI2RlZmluZSBDSENSX0FFU19NQVhfS0VZX0xFTiAgKDIgKiAoQUVTX01BWF9LRVlfU0laRSkpIC8qIGNvbnNpZGVyIHh0cyAqLworI2RlZmluZSBDSENSX01BWF9DUllQVE9fSVZfTEVOIDE2IC8qIEFFUyBJViBsZW4gKi8KKworI2RlZmluZSBDSENSX01BWF9BVVRIRU5DX0FFU19LRVlfTEVOIDMyIC8qIG1heCBhZXMga2V5IGxlbmd0aCovCisjZGVmaW5lIENIQ1JfTUFYX0FVVEhFTkNfU0hBX0tFWV9MRU4gMTI4IC8qIG1heCBzaGEga2V5IGxlbmd0aCovCisKKyNkZWZpbmUgQ0hDUl9HSVZFTkNSWVBUX09QIDIKKy8qIENQTC9TQ01EIHBhcmFtZXRlcnMgKi8KKworI2RlZmluZSBDSENSX0VOQ1JZUFRfT1AgMAorI2RlZmluZSBDSENSX0RFQ1JZUFRfT1AgMQorCisjZGVmaW5lIENIQ1JfU0NNRF9TRVFfTk9fQ1RSTF8zMkJJVCAgICAgMQorI2RlZmluZSBDSENSX1NDTURfU0VRX05PX0NUUkxfNDhCSVQgICAgIDIKKyNkZWZpbmUgQ0hDUl9TQ01EX1NFUV9OT19DVFJMXzY0QklUICAgICAzCisKKyNkZWZpbmUgQ0hDUl9TQ01EX1BST1RPX1ZFUlNJT05fR0VORVJJQyA0CisKKyNkZWZpbmUgQ0hDUl9TQ01EX0FVVEhfQ1RSTF9BVVRIX0NJUEhFUiAwCisjZGVmaW5lIENIQ1JfU0NNRF9BVVRIX0NUUkxfQ0lQSEVSX0FVVEggMQorCisjZGVmaW5lIENIQ1JfU0NNRF9DSVBIRVJfTU9ERV9OT1AgICAgICAgICAgIDAKKyNkZWZpbmUgQ0hDUl9TQ01EX0NJUEhFUl9NT0RFX0FFU19DQkMgICAgICAgMQorI2RlZmluZSBDSENSX1NDTURfQ0lQSEVSX01PREVfR0VORVJJQ19BRVMgICA0CisjZGVmaW5lIENIQ1JfU0NNRF9DSVBIRVJfTU9ERV9BRVNfWFRTICAgICAgIDYKKworI2RlZmluZSBDSENSX1NDTURfQVVUSF9NT0RFX05PUCAgICAgICAgICAgICAwCisjZGVmaW5lIENIQ1JfU0NNRF9BVVRIX01PREVfU0hBMSAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0hDUl9TQ01EX0FVVEhfTU9ERV9TSEEyMjQgICAgICAgICAgMgorI2RlZmluZSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTI1NiAgICAgICAgICAzCisjZGVmaW5lIENIQ1JfU0NNRF9BVVRIX01PREVfU0hBNTEyXzIyNCAgICAgIDUKKyNkZWZpbmUgQ0hDUl9TQ01EX0FVVEhfTU9ERV9TSEE1MTJfMjU2ICAgICAgNgorI2RlZmluZSBDSENSX1NDTURfQVVUSF9NT0RFX1NIQTUxMl8zODQgICAgICA3CisjZGVmaW5lIENIQ1JfU0NNRF9BVVRIX01PREVfU0hBNTEyXzUxMiAgICAgIDgKKworI2RlZmluZSBDSENSX1NDTURfSE1BQ19DVFJMX05PUCAgICAgICAgICAgICAwCisjZGVmaW5lIENIQ1JfU0NNRF9ITUFDX0NUUkxfTk9fVFJVTkMgICAgICAgIDEKKworI2RlZmluZSBDSENSX1NDTURfSVZHRU5fQ1RSTF9IVyAgICAgICAgICAgICAwCisjZGVmaW5lIENIQ1JfU0NNRF9JVkdFTl9DVFJMX1NXICAgICAgICAgICAgIDEKKy8qIFRoaXMgYXJlIG5vdCByZWFsbHkgbWFjIGtleSBzaXplLiBUaGV5IGFyZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgKiBvZiBzaGEgZW5naW5lIGFuZCBpdHMgc2l6ZQorICovCisjZGVmaW5lIENIQ1JfS0VZQ1RYX01BQ19LRVlfU0laRV8xMjggICAgICAgIDAKKyNkZWZpbmUgQ0hDUl9LRVlDVFhfTUFDX0tFWV9TSVpFXzE2MCAgICAgICAgMQorI2RlZmluZSBDSENSX0tFWUNUWF9NQUNfS0VZX1NJWkVfMTkyICAgICAgICAyCisjZGVmaW5lIENIQ1JfS0VZQ1RYX01BQ19LRVlfU0laRV8yNTYgICAgICAgIDMKKyNkZWZpbmUgQ0hDUl9LRVlDVFhfTUFDX0tFWV9TSVpFXzUxMiAgICAgICAgNAorI2RlZmluZSBDSENSX0tFWUNUWF9DSVBIRVJfS0VZX1NJWkVfMTI4ICAgICAwCisjZGVmaW5lIENIQ1JfS0VZQ1RYX0NJUEhFUl9LRVlfU0laRV8xOTIgICAgIDEKKyNkZWZpbmUgQ0hDUl9LRVlDVFhfQ0lQSEVSX0tFWV9TSVpFXzI1NiAgICAgMgorI2RlZmluZSBDSENSX0tFWUNUWF9OT19LRVkgICAgICAgICAgICAgICAgICAxNQorCisjZGVmaW5lIENIQ1JfQ1BMX0ZXNF9QTERfSVZfT0ZGU0VUICAgICAgICAgICg1ICogNjQpIC8qIGJ5dGVzLiBmbHQgIzUgYW5kICM2ICovCisjZGVmaW5lIENIQ1JfQ1BMX0ZXNF9QTERfSEFTSF9SRVNVTFRfT0ZGU0VUICg3ICogNjQpIC8qIGJ5dGVzLiBmbHQgIzcgKi8KKyNkZWZpbmUgQ0hDUl9DUExfRlc0X1BMRF9EQVRBX1NJWkUgICAgICAgICAgKDQgKiA2NCkgLyogYnl0ZXMuIGZsdCAjNCB0byAjNyAqLworCisjZGVmaW5lIEtFWV9DT05URVhUX0hEUl9TQUxUX0FORF9QQUQJICAgIDE2CisjZGVmaW5lIGZsaXRzX3RvX2J5dGVzKHgpICAoeCAqIDgpCisKKyNkZWZpbmUgSVZfTk9QICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJVl9JTU1FRElBVEUgICAgICAgICAgICAxCisjZGVmaW5lIElWX0RTR0wJCQkyCisKKyNkZWZpbmUgQ1JZUFRPX0FMR19TVUJfVFlQRV9NQVNLICAgICAgICAgICAgMHgwZjAwMDAwMAorI2RlZmluZSBDUllQVE9fQUxHX1NVQl9UWVBFX0hBU0hfSE1BQyAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIENSWVBUT19BTEdfVFlQRV9ITUFDIChDUllQVE9fQUxHX1RZUEVfQUhBU0ggfFwKKwkJCSAgICAgIENSWVBUT19BTEdfU1VCX1RZUEVfSEFTSF9ITUFDKQorCisjZGVmaW5lIE1BWF9TQUxUICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgTUFYX1NDUkFUQ0hfUEFEX1NJWkUgICAgMzIKKworI2RlZmluZSBDSENSX0hBU0hfTUFYX0JMT0NLX1NJWkVfNjQgIDY0CisjZGVmaW5lIENIQ1JfSEFTSF9NQVhfQkxPQ0tfU0laRV8xMjggMTI4CisKKy8qIEFsaWduZWQgdG8gMTI4IGJpdCBib3VuZGFyeSAqLworc3RydWN0IF9rZXlfY3R4IHsKKwlfX2JlMzIgY3R4X2hkcjsKKwl1OCBzYWx0W01BWF9TQUxUXTsKKwlfX2JlNjQgcmVzZXJ2ZXJkOworCXVuc2lnbmVkIGNoYXIga2V5WzBdOworfTsKKworc3RydWN0IGFibGtfY3R4IHsKKwl1OCBlbmM7CisJdW5zaWduZWQgaW50IHByb2Nlc3NlZF9sZW47CisJX19iZTMyIGtleV9jdHhfaGRyOworCXVuc2lnbmVkIGludCBlbmNrZXlfbGVuOworCXVuc2lnbmVkIGludCBkc3RfbmVudHM7CisJc3RydWN0IHNjYXR0ZXJsaXN0IGl2X3NnOworCXU4IGtleVtDSENSX0FFU19NQVhfS0VZX0xFTl07CisJdTggaXZbQ0hDUl9NQVhfQ1JZUFRPX0lWX0xFTl07CisJdW5zaWduZWQgY2hhciBjaXBoX21vZGU7Cit9OworCitzdHJ1Y3QgaG1hY19jdHggeworCXN0cnVjdCBzaGFzaF9kZXNjICpkZXNjOworCXU4IGlwYWRbQ0hDUl9IQVNIX01BWF9CTE9DS19TSVpFXzEyOF07CisJdTggb3BhZFtDSENSX0hBU0hfTUFYX0JMT0NLX1NJWkVfMTI4XTsKK307CisKK3N0cnVjdCBfX2NyeXB0b19jdHggeworCXN0cnVjdCBobWFjX2N0eCBobWFjY3R4WzBdOworCXN0cnVjdCBhYmxrX2N0eCBhYmxrY3R4WzBdOworfTsKKworc3RydWN0IGNoY3JfY29udGV4dCB7CisJc3RydWN0IGNoY3JfZGV2ICpkZXY7CisJdW5zaWduZWQgY2hhciB0eF9jaGFubmVsX2lkOworCXN0cnVjdCBfX2NyeXB0b19jdHggY3J5cHRvX2N0eFswXTsKK307CisKK3N0cnVjdCBjaGNyX2FoYXNoX3JlcV9jdHggeworCXUzMiByZXN1bHQ7CisJY2hhciBiZnJbQ0hDUl9IQVNIX01BWF9CTE9DS19TSVpFXzEyOF07CisJdTggYmZyX2xlbjsKKwkvKiBETUEgdGhlIHBhcnRpYWwgaGFzaCBpbiBpdCAqLworCXU4IHBhcnRpYWxfaGFzaFtDSENSX0hBU0hfTUFYX0RJR0VTVF9TSVpFXTsKKwl1NjQgZGF0YV9sZW47ICAvKiBEYXRhIGxlbiB0aWxsIHRpbWUgKi8KKwl2b2lkICpkdW1teV9wYXlsb2FkX3B0cjsKKwkvKiBTS0Igd2hpY2ggaXMgYmVpbmcgc2VudCB0byB0aGUgaGFyZHdhcmUgZm9yIHByb2Nlc3NpbmcgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworfTsKKworc3RydWN0IGNoY3JfYmxrY2lwaGVyX3JlcV9jdHggeworCXN0cnVjdCBza19idWZmICpza2I7Cit9OworCitzdHJ1Y3QgY2hjcl9hbGdfdGVtcGxhdGUgeworCXUzMiB0eXBlOworCXUzMiBpc19yZWdpc3RlcmVkOworCXVuaW9uIHsKKwkJc3RydWN0IGNyeXB0b19hbGcgY3J5cHRvOworCQlzdHJ1Y3QgYWhhc2hfYWxnIGhhc2g7CisJfSBhbGc7Cit9OworCitzdHJ1Y3QgY2hjcl9yZXFfY3R4IHsKKwl1bmlvbiB7CisJCXN0cnVjdCBhaGFzaF9yZXF1ZXN0ICphaGFzaF9yZXE7CisJCXN0cnVjdCBhYmxrY2lwaGVyX3JlcXVlc3QgKmFibGtfcmVxOworCX0gcmVxOworCXVuaW9uIHsKKwkJc3RydWN0IGNoY3JfYWhhc2hfcmVxX2N0eCAqYWhhc2hfY3R4OworCQlzdHJ1Y3QgY2hjcl9ibGtjaXBoZXJfcmVxX2N0eCAqYWJsa19jdHg7CisJfSBjdHg7Cit9OworCitzdHJ1Y3Qgc2dlX29wYXF1ZV9oZHIgeworCXZvaWQgKmRldjsKKwlkbWFfYWRkcl90IGFkZHJbTUFYX1NLQl9GUkFHUyArIDFdOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2tfYnVmZiAqKCpjcmVhdGVfd3JfdCkoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXEsCisJCQkJICAgICAgIHN0cnVjdCBjaGNyX2NvbnRleHQgKmN0eCwKKwkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgcWlkLAorCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCBvcF90eXBlKTsKKworI2VuZGlmIC8qIF9fQ0hDUl9DUllQVE9fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9xYXRfYWxncy5jIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vcWF0X2FsZ3MuYwppbmRleCA3NjkxNDhkLi4yMGYzNWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9xYXRfYWxncy5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL3FhdF9hbGdzLmMKQEAgLTEyNjAsOCArMTI2MCw4IEBACiAJCQkuc2V0a2V5ID0gcWF0X2FsZ19hYmxrY2lwaGVyX3h0c19zZXRrZXksCiAJCQkuZGVjcnlwdCA9IHFhdF9hbGdfYWJsa2NpcGhlcl9kZWNyeXB0LAogCQkJLmVuY3J5cHQgPSBxYXRfYWxnX2FibGtjaXBoZXJfZW5jcnlwdCwKLQkJCS5taW5fa2V5c2l6ZSA9IEFFU19NSU5fS0VZX1NJWkUsCi0JCQkubWF4X2tleXNpemUgPSBBRVNfTUFYX0tFWV9TSVpFLAorCQkJLm1pbl9rZXlzaXplID0gMiAqIEFFU19NSU5fS0VZX1NJWkUsCisJCQkubWF4X2tleXNpemUgPSAyICogQUVTX01BWF9LRVlfU0laRSwKIAkJCS5pdnNpemUgPSBBRVNfQkxPQ0tfU0laRSwKIAkJfSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vdm14L2Flc194dHMuYyBiL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNfeHRzLmMKaW5kZXggY2ZiMjU0MS4uMjQzNTNlYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNfeHRzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vdm14L2Flc194dHMuYwpAQCAtMTI5LDggKzEyOSw4IEBACiAKIAkJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CiAKLQkJaXYgPSAodTggKil3YWxrLml2OwogCQlyZXQgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKwkJaXYgPSB3YWxrLml2OwogCQltZW1zZXQodHdlYWssIDAsIEFFU19CTE9DS19TSVpFKTsKIAkJYWVzX3A4X2VuY3J5cHQoaXYsIHR3ZWFrLCAmY3R4LT50d2Vha19rZXkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RheC9kYXguYyBiL2RyaXZlcnMvZGF4L2RheC5jCmluZGV4IDgwM2YzOTUuLjI5ZjYwMGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RheC9kYXguYworKysgYi9kcml2ZXJzL2RheC9kYXguYwpAQCAtNDU5LDcgKzQ1OSw3IEBACiAJfQogCiAJcGdvZmYgPSBsaW5lYXJfcGFnZV9pbmRleCh2bWEsIHBtZF9hZGRyKTsKLQlwaHlzID0gcGdvZmZfdG9fcGh5cyhkYXhfZGV2LCBwZ29mZiwgUEFHRV9TSVpFKTsKKwlwaHlzID0gcGdvZmZfdG9fcGh5cyhkYXhfZGV2LCBwZ29mZiwgUE1EX1NJWkUpOwogCWlmIChwaHlzID09IC0xKSB7CiAJCWRldl9kYmcoZGV2LCAiJXM6IHBoeXNfdG9fcGdvZmYoJSNseCkgZmFpbGVkXG4iLCBfX2Z1bmNfXywKIAkJCQlwZ29mZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCmluZGV4IGE1YmU1NmUuLjQxMjU0ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9LY29uZmlnCkBAIC03Niw3ICs3Niw3IEBACiAKIGNvbmZpZyBBUk1fRVhZTk9TX0JVU19ERVZGUkVRCiAJdHJpc3RhdGUgIkFSTSBFWFlOT1MgR2VuZXJpYyBNZW1vcnkgQnVzIERFVkZSRVEgRHJpdmVyIgotCWRlcGVuZHMgb24gQVJDSF9FWFlOT1MKKwlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBERVZGUkVRX0dPVl9TSU1QTEVfT05ERU1BTkQKIAlzZWxlY3QgREVWRlJFUV9HT1ZfUEFTU0lWRQogCXNlbGVjdCBERVZGUkVRX0VWRU5UX0VYWU5PU19QUE1VCkBAIC05MSwxNCArOTEsMjYgQEAKIAkgIFRoaXMgZG9lcyBub3QgeWV0IG9wZXJhdGUgd2l0aCBvcHRpbWFsIHZvbHRhZ2VzLgogCiBjb25maWcgQVJNX1RFR1JBX0RFVkZSRVEKLSAgICAgICB0cmlzdGF0ZSAiVGVncmEgREVWRlJFUSBEcml2ZXIiCi0gICAgICAgZGVwZW5kcyBvbiBBUkNIX1RFR1JBXzEyNF9TT0MKLSAgICAgICBzZWxlY3QgREVWRlJFUV9HT1ZfU0lNUExFX09OREVNQU5ECi0gICAgICAgc2VsZWN0IFBNX09QUAotICAgICAgIGhlbHAKLSAgICAgICAgIFRoaXMgYWRkcyB0aGUgREVWRlJFUSBkcml2ZXIgZm9yIHRoZSBUZWdyYSBmYW1pbHkgb2YgU29Dcy4KLSAgICAgICAgIEl0IHJlYWRzIEFDVE1PTiBjb3VudGVycyBvZiBtZW1vcnkgY29udHJvbGxlcnMgYW5kIGFkanVzdHMgdGhlCi0gICAgICAgICBvcGVyYXRpbmcgZnJlcXVlbmNpZXMgYW5kIHZvbHRhZ2VzIHdpdGggT1BQIHN1cHBvcnQuCisJdHJpc3RhdGUgIlRlZ3JhIERFVkZSRVEgRHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9URUdSQV8xMjRfU09DCisJc2VsZWN0IERFVkZSRVFfR09WX1NJTVBMRV9PTkRFTUFORAorCXNlbGVjdCBQTV9PUFAKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIERFVkZSRVEgZHJpdmVyIGZvciB0aGUgVGVncmEgZmFtaWx5IG9mIFNvQ3MuCisJICBJdCByZWFkcyBBQ1RNT04gY291bnRlcnMgb2YgbWVtb3J5IGNvbnRyb2xsZXJzIGFuZCBhZGp1c3RzIHRoZQorCSAgb3BlcmF0aW5nIGZyZXF1ZW5jaWVzIGFuZCB2b2x0YWdlcyB3aXRoIE9QUCBzdXBwb3J0LgorCitjb25maWcgQVJNX1JLMzM5OV9ETUNfREVWRlJFUQorCXRyaXN0YXRlICJBUk0gUkszMzk5IERNQyBERVZGUkVRIERyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfUk9DS0NISVAKKwlzZWxlY3QgREVWRlJFUV9FVkVOVF9ST0NLQ0hJUF9ERkkKKwlzZWxlY3QgREVWRlJFUV9HT1ZfU0lNUExFX09OREVNQU5ECisJc2VsZWN0IFBNX0RFVkZSRVFfRVZFTlQKKwlzZWxlY3QgUE1fT1BQCisJaGVscAorICAgICAgICAgIFRoaXMgYWRkcyB0aGUgREVWRlJFUSBkcml2ZXIgZm9yIHRoZSBSSzMzOTkgRE1DKER5bmFtaWMgTWVtb3J5IENvbnRyb2xsZXIpLgorICAgICAgICAgIEl0IHNldHMgdGhlIGZyZXF1ZW5jeSBmb3IgdGhlIG1lbW9yeSBjb250cm9sbGVyIGFuZCByZWFkcyB0aGUgdXNhZ2UgY291bnRzCisgICAgICAgICAgZnJvbSBoYXJkd2FyZS4KIAogc291cmNlICJkcml2ZXJzL2RldmZyZXEvZXZlbnQvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL01ha2VmaWxlIGIvZHJpdmVycy9kZXZmcmVxL01ha2VmaWxlCmluZGV4IDA5ZjExZDkuLmZiZmY0MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2RldmZyZXEvTWFrZWZpbGUKQEAgLTgsNiArOCw3IEBACiAKICMgREVWRlJFUSBEcml2ZXJzCiBvYmotJChDT05GSUdfQVJNX0VYWU5PU19CVVNfREVWRlJFUSkJKz0gZXh5bm9zLWJ1cy5vCitvYmotJChDT05GSUdfQVJNX1JLMzM5OV9ETUNfREVWRlJFUSkJKz0gcmszMzk5X2RtYy5vCiBvYmotJChDT05GSUdfQVJNX1RFR1JBX0RFVkZSRVEpCQkrPSB0ZWdyYS1kZXZmcmVxLm8KIAogIyBERVZGUkVRIEV2ZW50IERyaXZlcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9LY29uZmlnIGIvZHJpdmVycy9kZXZmcmVxL2V2ZW50L0tjb25maWcKaW5kZXggZWI2Zjc0YS4uMGZkYWU4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kZXZmcmVxL2V2ZW50L0tjb25maWcKKysrIGIvZHJpdmVycy9kZXZmcmVxL2V2ZW50L0tjb25maWcKQEAgLTE1LDcgKzE1LDcgQEAKIAogY29uZmlnIERFVkZSRVFfRVZFTlRfRVhZTk9TX05PQ1AKIAl0cmlzdGF0ZSAiRVhZTk9TIE5vQyAoTmV0d29yayBPbiBDaGlwKSBQcm9iZSBERVZGUkVRIGV2ZW50IERyaXZlciIKLQlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TCisJZGVwZW5kcyBvbiBBUkNIX0VYWU5PUyB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgUE1fT1BQCiAJaGVscAogCSAgVGhpcyBhZGQgdGhlIGRldmZyZXEtZXZlbnQgZHJpdmVyIGZvciBFeHlub3MgU29DLiBJdCBwcm92aWRlcyBOb0MKQEAgLTIzLDExICsyMywxOCBAQAogCiBjb25maWcgREVWRlJFUV9FVkVOVF9FWFlOT1NfUFBNVQogCXRyaXN0YXRlICJFWFlOT1MgUFBNVSAoUGxhdGZvcm0gUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBVbml0KSBERVZGUkVRIGV2ZW50IERyaXZlciIKLQlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TCisJZGVwZW5kcyBvbiBBUkNIX0VYWU5PUyB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgUE1fT1BQCiAJaGVscAogCSAgVGhpcyBhZGQgdGhlIGRldmZyZXEtZXZlbnQgZHJpdmVyIGZvciBFeHlub3MgU29DLiBJdCBwcm92aWRlcyBQUE1VCiAJICAoUGxhdGZvcm0gUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBVbml0KSBjb3VudGVycyB0byBlc3RpbWF0ZSB0aGUKIAkgIHV0aWxpemF0aW9uIG9mIGVhY2ggbW9kdWxlLgogCitjb25maWcgREVWRlJFUV9FVkVOVF9ST0NLQ0hJUF9ERkkKKwl0cmlzdGF0ZSAiUk9DS0NISVAgREZJIERFVkZSRVEgZXZlbnQgRHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9ST0NLQ0hJUAorCWhlbHAKKwkgIFRoaXMgYWRkIHRoZSBkZXZmcmVxLWV2ZW50IGRyaXZlciBmb3IgUm9ja2NoaXAgU29DLiBJdCBwcm92aWRlcyBERkkKKwkgIChERFIgTW9uaXRvciBNb2R1bGUpIGRyaXZlciB0byBjb3VudCBkZHIgbG9hZC4KKwogZW5kaWYgIyBQTV9ERVZGUkVRX0VWRU5UCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZXZlbnQvTWFrZWZpbGUgYi9kcml2ZXJzL2RldmZyZXEvZXZlbnQvTWFrZWZpbGUKaW5kZXggM2Q2YWZkMy4uZGRhNzA5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kZXZmcmVxL2V2ZW50L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9NYWtlZmlsZQpAQCAtMiwzICsyLDQgQEAKIAogb2JqLSQoQ09ORklHX0RFVkZSRVFfRVZFTlRfRVhZTk9TX05PQ1ApICs9IGV4eW5vcy1ub2NwLm8KIG9iai0kKENPTkZJR19ERVZGUkVRX0VWRU5UX0VYWU5PU19QUE1VKSArPSBleHlub3MtcHBtdS5vCitvYmotJChDT05GSUdfREVWRlJFUV9FVkVOVF9ST0NLQ0hJUF9ERkkpICs9IHJvY2tjaGlwLWRmaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZXZlbnQvZXh5bm9zLXBwbXUuYyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9leHlub3MtcHBtdS5jCmluZGV4IDg0NWJmMjUuLmY1NWNmMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9leHlub3MtcHBtdS5jCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9leHlub3MtcHBtdS5jCkBAIC00MDYsOCArNDA2LDYgQEAKIAkJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobm9kZSwgImV2ZW50LW5hbWUiLCAmZGVzY1tqXS5uYW1lKTsKIAogCQlqKys7Ci0KLQkJb2Zfbm9kZV9wdXQobm9kZSk7CiAJfQogCWluZm8tPmRlc2MgPSBkZXNjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZXZlbnQvcm9ja2NoaXAtZGZpLmMgYi9kcml2ZXJzL2RldmZyZXEvZXZlbnQvcm9ja2NoaXAtZGZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmY2M1YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9yb2NrY2hpcC1kZmkuYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgRnV6aG91IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKiBBdXRob3I6IExpbiBIdWFuZyA8aGxAcm9jay1jaGlwcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmcmVxLWV2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKworI2RlZmluZSBSSzMzOTlfRE1DX05VTV9DSAkyCisKKy8qIEREUk1PTl9DVFJMICovCisjZGVmaW5lIEREUk1PTl9DVFJMCTB4MDQKKyNkZWZpbmUgQ0xSX0REUk1PTl9DVFJMCSgweDFmMDAwMCA8PCAwKQorI2RlZmluZSBMUEREUjRfRU4JKDB4MTAwMDEgPDwgNCkKKyNkZWZpbmUgSEFSRFdBUkVfRU4JKDB4MTAwMDEgPDwgMykKKyNkZWZpbmUgTFBERFIzX0VOCSgweDEwMDAxIDw8IDIpCisjZGVmaW5lIFNPRlRXQVJFX0VOCSgweDEwMDAxIDw8IDEpCisjZGVmaW5lIFNPRlRXQVJFX0RJUwkoMHgxMDAwMCA8PCAxKQorI2RlZmluZSBUSU1FX0NOVF9FTgkoMHgxMDAwMSA8PCAwKQorCisjZGVmaW5lIEREUk1PTl9DSDBfQ09VTlRfTlVNCQkweDI4CisjZGVmaW5lIEREUk1PTl9DSDBfREZJX0FDQ0VTU19OVU0JMHgyYworI2RlZmluZSBERFJNT05fQ0gxX0NPVU5UX05VTQkJMHgzYworI2RlZmluZSBERFJNT05fQ0gxX0RGSV9BQ0NFU1NfTlVNCTB4NDAKKworLyogcG11IGdyZiAqLworI2RlZmluZSBQTVVHUkZfT1NfUkVHMgkweDMwOAorI2RlZmluZSBERFJUWVBFX1NISUZUCTEzCisjZGVmaW5lIEREUlRZUEVfTUFTSwk3CisKK2VudW0geworCUREUjMgPSAzLAorCUxQRERSMyA9IDYsCisJTFBERFI0ID0gNywKKwlVTlVTRUQgPSAweEZGCit9OworCitzdHJ1Y3QgZG1jX3VzYWdlIHsKKwl1MzIgYWNjZXNzOworCXUzMiB0b3RhbDsKK307CisKKy8qCisgKiBUaGUgZGZpIGNvbnRyb2xsZXIgY2FuIG1vbml0b3IgRERSIGxvYWQuIEl0IGhhcyBhbiB1cHBlciBhbmQgbG93ZXIgdGhyZXNob2xkCisgKiBmb3IgdGhlIG9wZXJhdGluZyBwb2ludHMuIFdoZW5ldmVyIHRoZSB1c2FnZSBsZWF2ZXMgdGhlc2UgYm91bmRzIGFuIGV2ZW50IGlzCisgKiBnZW5lcmF0ZWQgdG8gaW5kaWNhdGUgdGhlIEREUiBmcmVxdWVuY3kgc2hvdWxkIGJlIGNoYW5nZWQuCisgKi8KK3N0cnVjdCByb2NrY2hpcF9kZmkgeworCXN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldjsKKwlzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kZXNjICpkZXNjOworCXN0cnVjdCBkbWNfdXNhZ2UgY2hfdXNhZ2VbUkszMzk5X0RNQ19OVU1fQ0hdOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwX3BtdTsKKwlzdHJ1Y3QgY2xrICpjbGs7Cit9OworCitzdGF0aWMgdm9pZCByb2NrY2hpcF9kZmlfc3RhcnRfaGFyZHdhcmVfY291bnRlcihzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kZXYgKmVkZXYpCit7CisJc3RydWN0IHJvY2tjaGlwX2RmaSAqaW5mbyA9IGRldmZyZXFfZXZlbnRfZ2V0X2RydmRhdGEoZWRldik7CisJdm9pZCBfX2lvbWVtICpkZmlfcmVncyA9IGluZm8tPnJlZ3M7CisJdTMyIHZhbDsKKwl1MzIgZGRyX3R5cGU7CisKKwkvKiBnZXQgZGRyIHR5cGUgKi8KKwlyZWdtYXBfcmVhZChpbmZvLT5yZWdtYXBfcG11LCBQTVVHUkZfT1NfUkVHMiwgJnZhbCk7CisJZGRyX3R5cGUgPSAodmFsID4+IEREUlRZUEVfU0hJRlQpICYgRERSVFlQRV9NQVNLOworCisJLyogY2xlYXIgRERSTU9OX0NUUkwgc2V0dGluZyAqLworCXdyaXRlbF9yZWxheGVkKENMUl9ERFJNT05fQ1RSTCwgZGZpX3JlZ3MgKyBERFJNT05fQ1RSTCk7CisKKwkvKiBzZXQgZGRyIHR5cGUgdG8gZGZpICovCisJaWYgKGRkcl90eXBlID09IExQRERSMykKKwkJd3JpdGVsX3JlbGF4ZWQoTFBERFIzX0VOLCBkZmlfcmVncyArIEREUk1PTl9DVFJMKTsKKwllbHNlIGlmIChkZHJfdHlwZSA9PSBMUEREUjQpCisJCXdyaXRlbF9yZWxheGVkKExQRERSNF9FTiwgZGZpX3JlZ3MgKyBERFJNT05fQ1RSTCk7CisKKwkvKiBlbmFibGUgY291bnQsIHVzZSBzb2Z0d2FyZSBtb2RlICovCisJd3JpdGVsX3JlbGF4ZWQoU09GVFdBUkVfRU4sIGRmaV9yZWdzICsgRERSTU9OX0NUUkwpOworfQorCitzdGF0aWMgdm9pZCByb2NrY2hpcF9kZmlfc3RvcF9oYXJkd2FyZV9jb3VudGVyKHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldikKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfZGZpICppbmZvID0gZGV2ZnJlcV9ldmVudF9nZXRfZHJ2ZGF0YShlZGV2KTsKKwl2b2lkIF9faW9tZW0gKmRmaV9yZWdzID0gaW5mby0+cmVnczsKKworCXdyaXRlbF9yZWxheGVkKFNPRlRXQVJFX0RJUywgZGZpX3JlZ3MgKyBERFJNT05fQ1RSTCk7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfZGZpX2dldF9idXNpZXJfY2goc3RydWN0IGRldmZyZXFfZXZlbnRfZGV2ICplZGV2KQoreworCXN0cnVjdCByb2NrY2hpcF9kZmkgKmluZm8gPSBkZXZmcmVxX2V2ZW50X2dldF9kcnZkYXRhKGVkZXYpOworCXUzMiB0bXAsIG1heCA9IDA7CisJdTMyIGksIGJ1c2llcl9jaCA9IDA7CisJdm9pZCBfX2lvbWVtICpkZmlfcmVncyA9IGluZm8tPnJlZ3M7CisKKwlyb2NrY2hpcF9kZmlfc3RvcF9oYXJkd2FyZV9jb3VudGVyKGVkZXYpOworCisJLyogRmluZCBvdXQgd2hpY2ggY2hhbm5lbCBpcyBidXNpZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUkszMzk5X0RNQ19OVU1fQ0g7IGkrKykgeworCQlpbmZvLT5jaF91c2FnZVtpXS5hY2Nlc3MgPSByZWFkbF9yZWxheGVkKGRmaV9yZWdzICsKKwkJCQlERFJNT05fQ0gwX0RGSV9BQ0NFU1NfTlVNICsgaSAqIDIwKSAqIDQ7CisJCWluZm8tPmNoX3VzYWdlW2ldLnRvdGFsID0gcmVhZGxfcmVsYXhlZChkZmlfcmVncyArCisJCQkJRERSTU9OX0NIMF9DT1VOVF9OVU0gKyBpICogMjApOworCQl0bXAgPSBpbmZvLT5jaF91c2FnZVtpXS5hY2Nlc3M7CisJCWlmICh0bXAgPiBtYXgpIHsKKwkJCWJ1c2llcl9jaCA9IGk7CisJCQltYXggPSB0bXA7CisJCX0KKwl9CisJcm9ja2NoaXBfZGZpX3N0YXJ0X2hhcmR3YXJlX2NvdW50ZXIoZWRldik7CisKKwlyZXR1cm4gYnVzaWVyX2NoOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX2RmaV9kaXNhYmxlKHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldikKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfZGZpICppbmZvID0gZGV2ZnJlcV9ldmVudF9nZXRfZHJ2ZGF0YShlZGV2KTsKKworCXJvY2tjaGlwX2RmaV9zdG9wX2hhcmR3YXJlX2NvdW50ZXIoZWRldik7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGluZm8tPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9kZmlfZW5hYmxlKHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldikKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfZGZpICppbmZvID0gZGV2ZnJlcV9ldmVudF9nZXRfZHJ2ZGF0YShlZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGluZm8tPmNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZlZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGRmaSBjbGs6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJvY2tjaGlwX2RmaV9zdGFydF9oYXJkd2FyZV9jb3VudGVyKGVkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX2RmaV9zZXRfZXZlbnQoc3RydWN0IGRldmZyZXFfZXZlbnRfZGV2ICplZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX2RmaV9nZXRfZXZlbnQoc3RydWN0IGRldmZyZXFfZXZlbnRfZGV2ICplZGV2LAorCQkJCSAgc3RydWN0IGRldmZyZXFfZXZlbnRfZGF0YSAqZWRhdGEpCit7CisJc3RydWN0IHJvY2tjaGlwX2RmaSAqaW5mbyA9IGRldmZyZXFfZXZlbnRfZ2V0X2RydmRhdGEoZWRldik7CisJaW50IGJ1c2llcl9jaDsKKworCWJ1c2llcl9jaCA9IHJvY2tjaGlwX2RmaV9nZXRfYnVzaWVyX2NoKGVkZXYpOworCisJZWRhdGEtPmxvYWRfY291bnQgPSBpbmZvLT5jaF91c2FnZVtidXNpZXJfY2hdLmFjY2VzczsKKwllZGF0YS0+dG90YWxfY291bnQgPSBpbmZvLT5jaF91c2FnZVtidXNpZXJfY2hdLnRvdGFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9vcHMgcm9ja2NoaXBfZGZpX29wcyA9IHsKKwkuZGlzYWJsZSA9IHJvY2tjaGlwX2RmaV9kaXNhYmxlLAorCS5lbmFibGUgPSByb2NrY2hpcF9kZmlfZW5hYmxlLAorCS5nZXRfZXZlbnQgPSByb2NrY2hpcF9kZmlfZ2V0X2V2ZW50LAorCS5zZXRfZXZlbnQgPSByb2NrY2hpcF9kZmlfc2V0X2V2ZW50LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcm9ja2NoaXBfZGZpX2lkX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZGZpIiB9LAorCXsgfSwKK307CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfZGZpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3Qgcm9ja2NoaXBfZGZpICpkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkZXZmcmVxX2V2ZW50X2Rlc2MgKmRlc2M7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlLCAqbm9kZTsKKworCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHJvY2tjaGlwX2RmaSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWRhdGEtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGRhdGEtPnJlZ3MpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5yZWdzKTsKKworCWRhdGEtPmNsayA9IGRldm1fY2xrX2dldChkZXYsICJwY2xrX2Rkcl9tb24iKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsaykpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IHRoZSBjbGsgZG1jX2Nsa1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRhdGEtPmNsayk7CisJfTsKKworCS8qIHRyeSB0byBmaW5kIHRoZSBvcHRpb25hbCByZWZlcmVuY2UgdG8gdGhlIHBtdSBzeXNjb24gKi8KKwlub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInJvY2tjaGlwLHBtdSIsIDApOworCWlmIChub2RlKSB7CisJCWRhdGEtPnJlZ21hcF9wbXUgPSBzeXNjb25fbm9kZV90b19yZWdtYXAobm9kZSk7CisJCWlmIChJU19FUlIoZGF0YS0+cmVnbWFwX3BtdSkpCisJCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5yZWdtYXBfcG11KTsKKwl9CisJZGF0YS0+ZGV2ID0gZGV2OworCisJZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOworCWlmICghZGVzYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXNjLT5vcHMgPSAmcm9ja2NoaXBfZGZpX29wczsKKwlkZXNjLT5kcml2ZXJfZGF0YSA9IGRhdGE7CisJZGVzYy0+bmFtZSA9IG5wLT5uYW1lOworCWRhdGEtPmRlc2MgPSBkZXNjOworCisJZGF0YS0+ZWRldiA9IGRldm1fZGV2ZnJlcV9ldmVudF9hZGRfZWRldigmcGRldi0+ZGV2LCBkZXNjKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmVkZXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJmYWlsZWQgdG8gYWRkIGRldmZyZXEtZXZlbnQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+ZWRldik7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9ja2NoaXBfZGZpX2RyaXZlciA9IHsKKwkucHJvYmUJPSByb2NrY2hpcF9kZmlfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAicm9ja2NoaXAtZGZpIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gcm9ja2NoaXBfZGZpX2lkX21hdGNoLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyb2NrY2hpcF9kZmlfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiTGluIEh1YW5nIDxobEByb2NrLWNoaXBzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUm9ja2NoaXAgREZJIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL3JrMzM5OV9kbWMuYyBiL2RyaXZlcnMvZGV2ZnJlcS9yazMzOTlfZG1jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0YjczZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9yazMzOTlfZG1jLmMKQEAgLTAsMCArMSw0NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEZ1emhvdSBSb2NrY2hpcCBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogTGluIEh1YW5nIDxobEByb2NrLWNoaXBzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FybS1zbWNjYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnJlcS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZyZXEtZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX29wcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorCisjaW5jbHVkZSA8c29jL3JvY2tjaGlwL3JvY2tjaGlwX3NpcC5oPgorCitzdHJ1Y3QgZHJhbV90aW1pbmcgeworCXVuc2lnbmVkIGludCBkZHIzX3NwZWVkX2JpbjsKKwl1bnNpZ25lZCBpbnQgcGRfaWRsZTsKKwl1bnNpZ25lZCBpbnQgc3JfaWRsZTsKKwl1bnNpZ25lZCBpbnQgc3JfbWNfZ2F0ZV9pZGxlOworCXVuc2lnbmVkIGludCBzcnBkX2xpdGVfaWRsZTsKKwl1bnNpZ25lZCBpbnQgc3RhbmRieV9pZGxlOworCXVuc2lnbmVkIGludCBhdXRvX3BkX2Rpc19mcmVxOworCXVuc2lnbmVkIGludCBkcmFtX2RsbF9kaXNfZnJlcTsKKwl1bnNpZ25lZCBpbnQgcGh5X2RsbF9kaXNfZnJlcTsKKwl1bnNpZ25lZCBpbnQgZGRyM19vZHRfZGlzX2ZyZXE7CisJdW5zaWduZWQgaW50IGRkcjNfZHJ2OworCXVuc2lnbmVkIGludCBkZHIzX29kdDsKKwl1bnNpZ25lZCBpbnQgcGh5X2RkcjNfY2FfZHJ2OworCXVuc2lnbmVkIGludCBwaHlfZGRyM19kcV9kcnY7CisJdW5zaWduZWQgaW50IHBoeV9kZHIzX29kdDsKKwl1bnNpZ25lZCBpbnQgbHBkZHIzX29kdF9kaXNfZnJlcTsKKwl1bnNpZ25lZCBpbnQgbHBkZHIzX2RydjsKKwl1bnNpZ25lZCBpbnQgbHBkZHIzX29kdDsKKwl1bnNpZ25lZCBpbnQgcGh5X2xwZGRyM19jYV9kcnY7CisJdW5zaWduZWQgaW50IHBoeV9scGRkcjNfZHFfZHJ2OworCXVuc2lnbmVkIGludCBwaHlfbHBkZHIzX29kdDsKKwl1bnNpZ25lZCBpbnQgbHBkZHI0X29kdF9kaXNfZnJlcTsKKwl1bnNpZ25lZCBpbnQgbHBkZHI0X2RydjsKKwl1bnNpZ25lZCBpbnQgbHBkZHI0X2RxX29kdDsKKwl1bnNpZ25lZCBpbnQgbHBkZHI0X2NhX29kdDsKKwl1bnNpZ25lZCBpbnQgcGh5X2xwZGRyNF9jYV9kcnY7CisJdW5zaWduZWQgaW50IHBoeV9scGRkcjRfY2tfY3NfZHJ2OworCXVuc2lnbmVkIGludCBwaHlfbHBkZHI0X2RxX2RydjsKKwl1bnNpZ25lZCBpbnQgcGh5X2xwZGRyNF9vZHQ7Cit9OworCitzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGV2ZnJlcSAqZGV2ZnJlcTsKKwlzdHJ1Y3QgZGV2ZnJlcV9zaW1wbGVfb25kZW1hbmRfZGF0YSBvbmRlbWFuZF9kYXRhOworCXN0cnVjdCBjbGsgKmRtY19jbGs7CisJc3RydWN0IGRldmZyZXFfZXZlbnRfZGV2ICplZGV2OworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBkcmFtX3RpbWluZyB0aW1pbmc7CisKKwkvKgorCSAqIEREUiBDb252ZXJzZXIgb2YgRnJlcXVlbmN5IChEQ0YpIGlzIHVzZWQgdG8gaW1wbGVtZW50IEREUiBmcmVxdWVuY3kKKwkgKiBjb252ZXJzaW9uIHdpdGhvdXQgdGhlIHBhcnRpY2lwYXRpb24gb2YgQ1BVLCB3ZSB3aWxsIGltcGxlbWVudCBhbmQKKwkgKiBjb250cm9sIGl0IGluIGFybSB0cnVzdCBmaXJtd2FyZS4KKwkgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0X2RjZl9xdWV1ZTsKKwlpbnQgaXJxOworCWludCB3YWl0X2RjZl9mbGFnOworCXN0cnVjdCByZWd1bGF0b3IgKnZkZF9jZW50ZXI7CisJdW5zaWduZWQgbG9uZyByYXRlLCB0YXJnZXRfcmF0ZTsKKwl1bnNpZ25lZCBsb25nIHZvbHQsIHRhcmdldF92b2x0OworCXN0cnVjdCBkZXZfcG1fb3BwICpjdXJyX29wcDsKK307CisKK3N0YXRpYyBpbnQgcmszMzk5X2RtY2ZyZXFfdGFyZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyAqZnJlcSwKKwkJCQkgdTMyIGZsYWdzKQoreworCXN0cnVjdCByazMzOTlfZG1jZnJlcSAqZG1jZnJlcSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7CisJdW5zaWduZWQgbG9uZyBvbGRfY2xrX3JhdGUgPSBkbWNmcmVxLT5yYXRlOworCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X3ZvbHQsIHRhcmdldF9yYXRlOworCWludCBlcnI7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJb3BwID0gZGV2ZnJlcV9yZWNvbW1lbmRlZF9vcHAoZGV2LCBmcmVxLCBmbGFncyk7CisJaWYgKElTX0VSUihvcHApKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gUFRSX0VSUihvcHApOworCX0KKworCXRhcmdldF9yYXRlID0gZGV2X3BtX29wcF9nZXRfZnJlcShvcHApOworCXRhcmdldF92b2x0ID0gZGV2X3BtX29wcF9nZXRfdm9sdGFnZShvcHApOworCisJZG1jZnJlcS0+cmF0ZSA9IGRldl9wbV9vcHBfZ2V0X2ZyZXEoZG1jZnJlcS0+Y3Vycl9vcHApOworCWRtY2ZyZXEtPnZvbHQgPSBkZXZfcG1fb3BwX2dldF92b2x0YWdlKGRtY2ZyZXEtPmN1cnJfb3BwKTsKKworCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKGRtY2ZyZXEtPnJhdGUgPT0gdGFyZ2V0X3JhdGUpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmZG1jZnJlcS0+bG9jayk7CisKKwkvKgorCSAqIElmIGZyZXF1ZW5jeSBzY2FsaW5nIGZyb20gbG93IHRvIGhpZ2gsIGFkanVzdCB2b2x0YWdlIGZpcnN0LgorCSAqIElmIGZyZXF1ZW5jeSBzY2FsaW5nIGZyb20gaGlnaCB0byBsb3csIGFkanVzdCBmcmVxdWVuY3kgZmlyc3QuCisJICovCisJaWYgKG9sZF9jbGtfcmF0ZSA8IHRhcmdldF9yYXRlKSB7CisJCWVyciA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZShkbWNmcmVxLT52ZGRfY2VudGVyLCB0YXJnZXRfdm9sdCwKKwkJCQkJICAgIHRhcmdldF92b2x0KTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycihkZXYsICJDYW5ub3QgdG8gc2V0IHZvbHRhZ2UgJWx1IHVWXG4iLAorCQkJCXRhcmdldF92b2x0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWRtY2ZyZXEtPndhaXRfZGNmX2ZsYWcgPSAxOworCisJZXJyID0gY2xrX3NldF9yYXRlKGRtY2ZyZXEtPmRtY19jbGssIHRhcmdldF9yYXRlKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHRvIHNldCBmcmVxdWVuY3kgJWx1ICglZClcbiIsCisJCQl0YXJnZXRfcmF0ZSwgZXJyKTsKKwkJcmVndWxhdG9yX3NldF92b2x0YWdlKGRtY2ZyZXEtPnZkZF9jZW50ZXIsIGRtY2ZyZXEtPnZvbHQsCisJCQkJICAgICAgZG1jZnJlcS0+dm9sdCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2FpdCB1bnRpbCBiY2YgaXJxIGhhcHBlbiwgaXQgbWVhbnMgZnJlcSBzY2FsaW5nIGZpbmlzaCBpbgorCSAqIGFybSB0cnVzdCBmaXJtd2FyZSwgdXNlIDEwMG1zIGFzIHRpbWVvdXQgdGltZS4KKwkgKi8KKwlpZiAoIXdhaXRfZXZlbnRfdGltZW91dChkbWNmcmVxLT53YWl0X2RjZl9xdWV1ZSwKKwkJCQkhZG1jZnJlcS0+d2FpdF9kY2ZfZmxhZywgSFogLyAxMCkpCisJCWRldl93YXJuKGRldiwgIlRpbWVvdXQgd2FpdGluZyBmb3IgZGNmIGludGVycnVwdFxuIik7CisKKwkvKgorCSAqIENoZWNrIHRoZSBkcGxsIHJhdGUsCisJICogVGhlcmUgb25seSB0d28gcmVzdWx0IHdlIHdpbGwgZ2V0LAorCSAqIDEuIERkciBmcmVxdWVuY3kgc2NhbGluZyBmYWlsLCB3ZSBzdGlsbCBnZXQgdGhlIG9sZCByYXRlLgorCSAqIDIuIERkciBmcmVxdWVuY3kgc2NhbGluZyBzdWNlc3NmdWwsIHdlIGdldCB0aGUgcmF0ZSB3ZSBzZXQuCisJICovCisJZG1jZnJlcS0+cmF0ZSA9IGNsa19nZXRfcmF0ZShkbWNmcmVxLT5kbWNfY2xrKTsKKworCS8qIElmIGdldCB0aGUgaW5jb3JyZWN0IHJhdGUsIHNldCB2b2x0YWdlIHRvIG9sZCB2YWx1ZS4gKi8KKwlpZiAoZG1jZnJlcS0+cmF0ZSAhPSB0YXJnZXRfcmF0ZSkgeworCQlkZXZfZXJyKGRldiwgIkdldCB3cm9uZyBkZHIgZnJlcXVlbmN5LCBSZXF1ZXN0IGZyZXF1ZW5jeSAlbHUsXAorCQkJQ3VycmVudCBmcmVxdWVuY3kgJWx1XG4iLCB0YXJnZXRfcmF0ZSwgZG1jZnJlcS0+cmF0ZSk7CisJCXJlZ3VsYXRvcl9zZXRfdm9sdGFnZShkbWNmcmVxLT52ZGRfY2VudGVyLCBkbWNmcmVxLT52b2x0LAorCQkJCSAgICAgIGRtY2ZyZXEtPnZvbHQpOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKG9sZF9jbGtfcmF0ZSA+IHRhcmdldF9yYXRlKQorCQllcnIgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2UoZG1jZnJlcS0+dmRkX2NlbnRlciwgdGFyZ2V0X3ZvbHQsCisJCQkJCSAgICB0YXJnZXRfdm9sdCk7CisJaWYgKGVycikKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgdG8gc2V0IHZvbCAlbHUgdVZcbiIsIHRhcmdldF92b2x0KTsKKworCWRtY2ZyZXEtPmN1cnJfb3BwID0gb3BwOworb3V0OgorCW11dGV4X3VubG9jaygmZG1jZnJlcS0+bG9jayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByazMzOTlfZG1jZnJlcV9nZXRfZGV2X3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2ZnJlcV9kZXZfc3RhdHVzICpzdGF0KQoreworCXN0cnVjdCByazMzOTlfZG1jZnJlcSAqZG1jZnJlcSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBkZXZmcmVxX2V2ZW50X2RhdGEgZWRhdGE7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBkZXZmcmVxX2V2ZW50X2dldF9ldmVudChkbWNmcmVxLT5lZGV2LCAmZWRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3RhdC0+Y3VycmVudF9mcmVxdWVuY3kgPSBkbWNmcmVxLT5yYXRlOworCXN0YXQtPmJ1c3lfdGltZSA9IGVkYXRhLmxvYWRfY291bnQ7CisJc3RhdC0+dG90YWxfdGltZSA9IGVkYXRhLnRvdGFsX2NvdW50OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByazMzOTlfZG1jZnJlcV9nZXRfY3VyX2ZyZXEoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nICpmcmVxKQoreworCXN0cnVjdCByazMzOTlfZG1jZnJlcSAqZG1jZnJlcSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJKmZyZXEgPSBkbWNmcmVxLT5yYXRlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2ZnJlcV9kZXZfcHJvZmlsZSByazMzOTlfZGV2ZnJlcV9kbWNfcHJvZmlsZSA9IHsKKwkucG9sbGluZ19tcwk9IDIwMCwKKwkudGFyZ2V0CQk9IHJrMzM5OV9kbWNmcmVxX3RhcmdldCwKKwkuZ2V0X2Rldl9zdGF0dXMJPSByazMzOTlfZG1jZnJlcV9nZXRfZGV2X3N0YXR1cywKKwkuZ2V0X2N1cl9mcmVxCT0gcmszMzk5X2RtY2ZyZXFfZ2V0X2N1cl9mcmVxLAorfTsKKworc3RhdGljIF9fbWF5YmVfdW51c2VkIGludCByazMzOTlfZG1jZnJlcV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEgKmRtY2ZyZXEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGRldmZyZXFfZXZlbnRfZGlzYWJsZV9lZGV2KGRtY2ZyZXEtPmVkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGRpc2FibGUgdGhlIGRldmZyZXEtZXZlbnQgZGV2aWNlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZGV2ZnJlcV9zdXNwZW5kX2RldmljZShkbWNmcmVxLT5kZXZmcmVxKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzdXNwZW5kIHRoZSBkZXZmcmVxIGRldmljZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19tYXliZV91bnVzZWQgaW50IHJrMzM5OV9kbWNmcmVxX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJrMzM5OV9kbWNmcmVxICpkbWNmcmVxID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBkZXZmcmVxX2V2ZW50X2VuYWJsZV9lZGV2KGRtY2ZyZXEtPmVkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSB0aGUgZGV2ZnJlcS1ldmVudCBkZXZpY2VzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkZXZmcmVxX3Jlc3VtZV9kZXZpY2UoZG1jZnJlcS0+ZGV2ZnJlcSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVzdW1lIHRoZSBkZXZmcmVxIGRldmljZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMocmszMzk5X2RtY2ZyZXFfcG0sIHJrMzM5OV9kbWNmcmVxX3N1c3BlbmQsCisJCQkgcmszMzk5X2RtY2ZyZXFfcmVzdW1lKTsKKworc3RhdGljIGlycXJldHVybl90IHJrMzM5OV9kbWNfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEgKmRtY2ZyZXEgPSBkZXZfaWQ7CisJc3RydWN0IGFybV9zbWNjY19yZXMgcmVzOworCisJZG1jZnJlcS0+d2FpdF9kY2ZfZmxhZyA9IDA7CisJd2FrZV91cCgmZG1jZnJlcS0+d2FpdF9kY2ZfcXVldWUpOworCisJLyogQ2xlYXIgdGhlIERDRiBpbnRlcnJ1cHQgKi8KKwlhcm1fc21jY2Nfc21jKFJPQ0tDSElQX1NJUF9EUkFNX0ZSRVEsIDAsIDAsCisJCSAgICAgIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9DTFJfSVJRLAorCQkgICAgICAwLCAwLCAwLCAwLCAmcmVzKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBvZl9nZXRfZGRyX3RpbWluZ3Moc3RydWN0IGRyYW1fdGltaW5nICp0aW1pbmcsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxkZHIzX3NwZWVkX2JpbiIsCisJCQkJICAgJnRpbWluZy0+ZGRyM19zcGVlZF9iaW4pOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBkX2lkbGUiLAorCQkJCSAgICAmdGltaW5nLT5wZF9pZGxlKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxzcl9pZGxlIiwKKwkJCQkgICAgJnRpbWluZy0+c3JfaWRsZSk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsc3JfbWNfZ2F0ZV9pZGxlIiwKKwkJCQkgICAgJnRpbWluZy0+c3JfbWNfZ2F0ZV9pZGxlKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxzcnBkX2xpdGVfaWRsZSIsCisJCQkJICAgICZ0aW1pbmctPnNycGRfbGl0ZV9pZGxlKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxzdGFuZGJ5X2lkbGUiLAorCQkJCSAgICAmdGltaW5nLT5zdGFuZGJ5X2lkbGUpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGF1dG9fcGRfZGlzX2ZyZXEiLAorCQkJCSAgICAmdGltaW5nLT5hdXRvX3BkX2Rpc19mcmVxKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxkcmFtX2RsbF9kaXNfZnJlcSIsCisJCQkJICAgICZ0aW1pbmctPmRyYW1fZGxsX2Rpc19mcmVxKTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxwaHlfZGxsX2Rpc19mcmVxIiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2RsbF9kaXNfZnJlcSk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsZGRyM19vZHRfZGlzX2ZyZXEiLAorCQkJCSAgICAmdGltaW5nLT5kZHIzX29kdF9kaXNfZnJlcSk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsZGRyM19kcnYiLAorCQkJCSAgICAmdGltaW5nLT5kZHIzX2Rydik7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsZGRyM19vZHQiLAorCQkJCSAgICAmdGltaW5nLT5kZHIzX29kdCk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAscGh5X2RkcjNfY2FfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2RkcjNfY2FfZHJ2KTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxwaHlfZGRyM19kcV9kcnYiLAorCQkJCSAgICAmdGltaW5nLT5waHlfZGRyM19kcV9kcnYpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9kZHIzX29kdCIsCisJCQkJICAgICZ0aW1pbmctPnBoeV9kZHIzX29kdCk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsbHBkZHIzX29kdF9kaXNfZnJlcSIsCisJCQkJICAgICZ0aW1pbmctPmxwZGRyM19vZHRfZGlzX2ZyZXEpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGxwZGRyM19kcnYiLAorCQkJCSAgICAmdGltaW5nLT5scGRkcjNfZHJ2KTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxscGRkcjNfb2R0IiwKKwkJCQkgICAgJnRpbWluZy0+bHBkZHIzX29kdCk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAscGh5X2xwZGRyM19jYV9kcnYiLAorCQkJCSAgICAmdGltaW5nLT5waHlfbHBkZHIzX2NhX2Rydik7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAscGh5X2xwZGRyM19kcV9kcnYiLAorCQkJCSAgICAmdGltaW5nLT5waHlfbHBkZHIzX2RxX2Rydik7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAscGh5X2xwZGRyM19vZHQiLAorCQkJCSAgICAmdGltaW5nLT5waHlfbHBkZHIzX29kdCk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsbHBkZHI0X29kdF9kaXNfZnJlcSIsCisJCQkJICAgICZ0aW1pbmctPmxwZGRyNF9vZHRfZGlzX2ZyZXEpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLGxwZGRyNF9kcnYiLAorCQkJCSAgICAmdGltaW5nLT5scGRkcjRfZHJ2KTsKKwlyZXQgfD0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyb2NrY2hpcCxscGRkcjRfZHFfb2R0IiwKKwkJCQkgICAgJnRpbWluZy0+bHBkZHI0X2RxX29kdCk7CisJcmV0IHw9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicm9ja2NoaXAsbHBkZHI0X2NhX29kdCIsCisJCQkJICAgICZ0aW1pbmctPmxwZGRyNF9jYV9vZHQpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9scGRkcjRfY2FfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2xwZGRyNF9jYV9kcnYpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9scGRkcjRfY2tfY3NfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2xwZGRyNF9ja19jc19kcnYpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9scGRkcjRfZHFfZHJ2IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2xwZGRyNF9kcV9kcnYpOworCXJldCB8PSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJvY2tjaGlwLHBoeV9scGRkcjRfb2R0IiwKKwkJCQkgICAgJnRpbWluZy0+cGh5X2xwZGRyNF9vZHQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByazMzOTlfZG1jZnJlcV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEgKmRhdGE7CisJaW50IHJldCwgaXJxLCBpbmRleCwgc2l6ZTsKKwl1aW50MzJfdCAqdGltaW5nOworCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBnZXQgdGhlIGRtYyBpbnRlcnJ1cHQgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgcmszMzk5X2RtY2ZyZXEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CisKKwlkYXRhLT52ZGRfY2VudGVyID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGRldiwgImNlbnRlciIpOworCWlmIChJU19FUlIoZGF0YS0+dmRkX2NlbnRlcikpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IHRoZSByZWd1bGF0b3IgXCJjZW50ZXJcIlxuIik7CisJCXJldHVybiBQVFJfRVJSKGRhdGEtPnZkZF9jZW50ZXIpOworCX0KKworCWRhdGEtPmRtY19jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiZG1jX2NsayIpOworCWlmIChJU19FUlIoZGF0YS0+ZG1jX2NsaykpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IHRoZSBjbGsgZG1jX2Nsa1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRhdGEtPmRtY19jbGspOworCX07CisKKwlkYXRhLT5pcnEgPSBpcnE7CisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGlycSwgcmszMzk5X2RtY19pcnEsIDAsCisJCQkgICAgICAgZGV2X25hbWUoZGV2KSwgZGF0YSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGRtYyBpcnE6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRhdGEtPndhaXRfZGNmX3F1ZXVlKTsKKwlkYXRhLT53YWl0X2RjZl9mbGFnID0gMDsKKworCWRhdGEtPmVkZXYgPSBkZXZmcmVxX2V2ZW50X2dldF9lZGV2X2J5X3BoYW5kbGUoZGV2LCAwKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmVkZXYpKQorCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKworCXJldCA9IGRldmZyZXFfZXZlbnRfZW5hYmxlX2VkZXYoZGF0YS0+ZWRldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZW5hYmxlIGRldmZyZXEtZXZlbnQgZGV2aWNlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyoKKwkgKiBHZXQgZHJhbSB0aW1pbmcgYW5kIHBhc3MgaXQgdG8gYXJtIHRydXN0IGZpcm13YXJlLAorCSAqIHRoZSBkcmFtIGRydmllciBpbiBhcm0gdHJ1c3QgZmlybXdhcmUgd2lsbCBnZXQgdGhlc2UKKwkgKiB0aW1pbmcgYW5kIHRvIGRvIGRyYW0gaW5pdGlhbC4KKwkgKi8KKwlpZiAoIW9mX2dldF9kZHJfdGltaW5ncygmZGF0YS0+dGltaW5nLCBucCkpIHsKKwkJdGltaW5nID0gJmRhdGEtPnRpbWluZy5kZHIzX3NwZWVkX2JpbjsKKwkJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZHJhbV90aW1pbmcpIC8gNDsKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykgeworCQkJYXJtX3NtY2NjX3NtYyhST0NLQ0hJUF9TSVBfRFJBTV9GUkVRLCAqdGltaW5nKyssIGluZGV4LAorCQkJCSAgICAgIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9TRVRfUEFSQU0sCisJCQkJICAgICAgMCwgMCwgMCwgMCwgJnJlcyk7CisJCQlpZiAocmVzLmEwKSB7CisJCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IGRyYW0gcGFyYW06ICVsZFxuIiwKKwkJCQkJcmVzLmEwKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0KKworCWFybV9zbWNjY19zbWMoUk9DS0NISVBfU0lQX0RSQU1fRlJFUSwgMCwgMCwKKwkJICAgICAgUk9DS0NISVBfU0lQX0NPTkZJR19EUkFNX0lOSVQsCisJCSAgICAgIDAsIDAsIDAsIDAsICZyZXMpOworCisJLyoKKwkgKiBXZSBhZGQgYSBkZXZmcmVxIGRyaXZlciB0byBvdXIgcGFyZW50IHNpbmNlIGl0IGhhcyBhIGRldmljZSB0cmVlIG5vZGUKKwkgKiB3aXRoIG9wZXJhdGluZyBwb2ludHMuCisJICovCisJaWYgKGRldl9wbV9vcHBfb2ZfYWRkX3RhYmxlKGRldikpIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIG9wZXJhdGluZy1wb2ludHMgaW4gZGV2aWNlIHRyZWUuXG4iKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidXB0aHJlc2hvbGQiLAorCQkJICAgICAmZGF0YS0+b25kZW1hbmRfZGF0YS51cHRocmVzaG9sZCk7CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJkb3duZGlmZmVyZW50aWFsIiwKKwkJCSAgICAgJmRhdGEtPm9uZGVtYW5kX2RhdGEuZG93bmRpZmZlcmVudGlhbCk7CisKKwlkYXRhLT5yYXRlID0gY2xrX2dldF9yYXRlKGRhdGEtPmRtY19jbGspOworCisJcmN1X3JlYWRfbG9jaygpOworCW9wcCA9IGRldmZyZXFfcmVjb21tZW5kZWRfb3BwKGRldiwgJmRhdGEtPnJhdGUsIDApOworCWlmIChJU19FUlIob3BwKSkgeworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIFBUUl9FUlIob3BwKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJZGF0YS0+Y3Vycl9vcHAgPSBvcHA7CisKKwlyazMzOTlfZGV2ZnJlcV9kbWNfcHJvZmlsZS5pbml0aWFsX2ZyZXEgPSBkYXRhLT5yYXRlOworCisJZGF0YS0+ZGV2ZnJlcSA9IGRldmZyZXFfYWRkX2RldmljZShkZXYsCisJCQkJCSAgICZyazMzOTlfZGV2ZnJlcV9kbWNfcHJvZmlsZSwKKwkJCQkJICAgInNpbXBsZV9vbmRlbWFuZCIsCisJCQkJCSAgICZkYXRhLT5vbmRlbWFuZF9kYXRhKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmRldmZyZXEpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5kZXZmcmVxKTsKKwlkZXZtX2RldmZyZXFfcmVnaXN0ZXJfb3BwX25vdGlmaWVyKGRldiwgZGF0YS0+ZGV2ZnJlcSk7CisKKwlkYXRhLT5kZXYgPSBkZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcmszMzk5ZG1jX2RldmZyZXFfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1kbWMiIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmszMzk5X2RtY2ZyZXFfZHJpdmVyID0geworCS5wcm9iZQk9IHJrMzM5OV9kbWNmcmVxX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInJrMzM5OS1kbWMtZnJlcSIsCisJCS5wbQk9ICZyazMzOTlfZG1jZnJlcV9wbSwKKwkJLm9mX21hdGNoX3RhYmxlID0gcmszMzk5ZG1jX2RldmZyZXFfb2ZfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJrMzM5OV9kbWNmcmVxX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIkxpbiBIdWFuZyA8aGxAcm9jay1jaGlwcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJLMzM5OSBkbWNmcmVxIGRyaXZlciB3aXRoIGRldmZyZXEgZnJhbWV3b3JrIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYvS2NvbmZpZyBiL2RyaXZlcnMvZG1hLWJ1Zi9LY29uZmlnCmluZGV4IDI1YmNmYTAuLjI1ODU4MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hLWJ1Zi9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hLWJ1Zi9LY29uZmlnCkBAIC0xNyw0ICsxNywxNyBAQAogCSAgRmlsZXMgZmRzLCB0byB0aGUgRFJNIGRyaXZlciBmb3IgZXhhbXBsZS4gTW9yZSBkZXRhaWxzIGF0CiAJICBEb2N1bWVudGF0aW9uL3N5bmNfZmlsZS50eHQuCiAKK2NvbmZpZyBTV19TWU5DCisJYm9vbCAiU3luYyBGaWxlIFZhbGlkYXRpb24gRnJhbWV3b3JrIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU1lOQ19GSUxFCisJZGVwZW5kcyBvbiBERUJVR19GUworCS0tLWhlbHAtLS0KKwkgIEEgc3luYyBvYmplY3QgZHJpdmVyIHRoYXQgdXNlcyBhIDMyYml0IGNvdW50ZXIgdG8gY29vcmRpbmF0ZQorCSAgc3luY2hyb25pemF0aW9uLiAgVXNlZnVsIHdoZW4gdGhlcmUgaXMgbm8gaGFyZHdhcmUgcHJpbWl0aXZlIGJhY2tpbmcKKwkgIHRoZSBzeW5jaHJvbml6YXRpb24uCisKKwkgIFdBUk5JTkc6IGltcHJvcGVyIHVzZSBvZiB0aGlzIGNhbiByZXN1bHQgaW4gZGVhZGxvY2tpbmcga2VybmVsCisJICBkcml2ZXJzIGZyb20gdXNlcnNwYWNlLiBJbnRlbmRlZCBmb3IgdGVzdCBhbmQgZGVidWcgb25seS4KKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEtYnVmL01ha2VmaWxlIGIvZHJpdmVycy9kbWEtYnVmL01ha2VmaWxlCmluZGV4IGYzNTNkYjIuLjIxMGExMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hLWJ1Zi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2RtYS1idWYvTWFrZWZpbGUKQEAgLTEsMiArMSwzIEBACiBvYmoteSA6PSBkbWEtYnVmLm8gZmVuY2UubyByZXNlcnZhdGlvbi5vIHNlcW5vLWZlbmNlLm8gZmVuY2UtYXJyYXkubwogb2JqLSQoQ09ORklHX1NZTkNfRklMRSkJCSs9IHN5bmNfZmlsZS5vCitvYmotJChDT05GSUdfU1dfU1lOQykJCSs9IHN3X3N5bmMubyBzeW5jX2RlYnVnLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9zd19zeW5jLmMgYi9kcml2ZXJzL2RtYS1idWYvc3dfc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZThlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS1idWYvc3dfc3luYy5jCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogU3luYyBGaWxlIHZhbGlkYXRpb24gZnJhbWV3b3JrCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5bmNfZmlsZS5oPgorCisjaW5jbHVkZSAic3luY19kZWJ1Zy5oIgorCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlICJzeW5jX3RyYWNlLmgiCisKKy8qCisgKiBTVyBTWU5DIHZhbGlkYXRpb24gZnJhbWV3b3JrCisgKgorICogQSBzeW5jIG9iamVjdCBkcml2ZXIgdGhhdCB1c2VzIGEgMzJiaXQgY291bnRlciB0byBjb29yZGluYXRlCisgKiBzeW5jaHJvbml6YXRpb24uICBVc2VmdWwgd2hlbiB0aGVyZSBpcyBubyBoYXJkd2FyZSBwcmltaXRpdmUgYmFja2luZworICogdGhlIHN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBUbyBzdGFydCB0aGUgZnJhbWV3b3JrIGp1c3Qgb3BlbjoKKyAqCisgKiA8ZGVidWdmcz4vc3luYy9zd19zeW5jCisgKgorICogVGhhdCB3aWxsIGNyZWF0ZSBhIHN5bmMgdGltZWxpbmUsIGFsbCBmZW5jZXMgY3JlYXRlZCB1bmRlciB0aGlzIHRpbWVsaW5lCisgKiBmaWxlIGRlc2NyaXB0b3Igd2lsbCBiZWxvbmcgdG8gdGhlIHRoaXMgdGltZWxpbmUuCisgKgorICogVGhlICdzd19zeW5jJyBmaWxlIGNhbiBiZSBvcGVuZWQgbWFueSB0aW1lcyBhcyB0byBjcmVhdGUgZGlmZmVyZW50CisgKiB0aW1lbGluZXMuCisgKgorICogRmVuY2VzIGNhbiBiZSBjcmVhdGVkIHdpdGggU1dfU1lOQ19JT0NfQ1JFQVRFX0ZFTkNFIGlvY3RsIHdpdGggc3RydWN0CisgKiBzd19zeW5jX2lvY3RsX2NyZWF0ZV9mZW5jZSBhcyBwYXJhbWV0ZXIuCisgKgorICogVG8gaW5jcmVtZW50IHRoZSB0aW1lbGluZSBjb3VudGVyLCBTV19TWU5DX0lPQ19JTkMgaW9jdGwgc2hvdWxkIGJlIHVzZWQKKyAqIHdpdGggdGhlIGluY3JlbWVudCBhcyB1MzIuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIGxhc3Qgc2lnbmFsZWQgdmFsdWUKKyAqIGZyb20gdGhlIHRpbWVsaW5lIGFuZCBzaWduYWwgYW55IGZlbmNlIHRoYXQgaGFzIGEgc2Vxbm8gc21hbGxlciBvciBlcXVhbAorICogdG8gaXQuCisgKgorICogc3RydWN0IHN3X3N5bmNfaW9jdGxfY3JlYXRlX2ZlbmNlCisgKiBAdmFsdWU6CXRoZSBzZXFubyB0byBpbml0aWFsaXNlIHRoZSBmZW5jZSB3aXRoCisgKiBAbmFtZToJdGhlIG5hbWUgb2YgdGhlIG5ldyBzeW5jIHBvaW50CisgKiBAZmVuY2U6CXJldHVybiB0aGUgZmQgb2YgdGhlIG5ldyBzeW5jX2ZpbGUgd2l0aCB0aGUgY3JlYXRlZCBmZW5jZQorICovCitzdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSB7CisJX191MzIJdmFsdWU7CisJY2hhcgluYW1lWzMyXTsKKwlfX3MzMglmZW5jZTsgLyogZmQgb2YgbmV3IGZlbmNlICovCit9OworCisjZGVmaW5lIFNXX1NZTkNfSU9DX01BR0lDCSdXJworCisjZGVmaW5lIFNXX1NZTkNfSU9DX0NSRUFURV9GRU5DRQlfSU9XUihTV19TWU5DX0lPQ19NQUdJQywgMCxcCisJCXN0cnVjdCBzd19zeW5jX2NyZWF0ZV9mZW5jZV9kYXRhKQorCisjZGVmaW5lIFNXX1NZTkNfSU9DX0lOQwkJCV9JT1coU1dfU1lOQ19JT0NfTUFHSUMsIDEsIF9fdTMyKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZlbmNlX29wcyB0aW1lbGluZV9mZW5jZV9vcHM7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN5bmNfcHQgKmZlbmNlX3RvX3N5bmNfcHQoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlpZiAoZmVuY2UtPm9wcyAhPSAmdGltZWxpbmVfZmVuY2Vfb3BzKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gY29udGFpbmVyX29mKGZlbmNlLCBzdHJ1Y3Qgc3luY19wdCwgYmFzZSk7Cit9CisKKy8qKgorICogc3luY190aW1lbGluZV9jcmVhdGUoKSAtIGNyZWF0ZXMgYSBzeW5jIG9iamVjdAorICogQG5hbWU6CXN5bmNfdGltZWxpbmUgbmFtZQorICoKKyAqIENyZWF0ZXMgYSBuZXcgc3luY190aW1lbGluZS4gUmV0dXJucyB0aGUgc3luY190aW1lbGluZSBvYmplY3Qgb3IgTlVMTCBpbgorICogY2FzZSBvZiBlcnJvci4KKyAqLworc3RydWN0IHN5bmNfdGltZWxpbmUgKnN5bmNfdGltZWxpbmVfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iajsKKworCW9iaiA9IGt6YWxsb2Moc2l6ZW9mKCpvYmopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIE5VTEw7CisKKwlrcmVmX2luaXQoJm9iai0+a3JlZik7CisJb2JqLT5jb250ZXh0ID0gZmVuY2VfY29udGV4dF9hbGxvYygxKTsKKwlzdHJsY3B5KG9iai0+bmFtZSwgbmFtZSwgc2l6ZW9mKG9iai0+bmFtZSkpOworCisJSU5JVF9MSVNUX0hFQUQoJm9iai0+Y2hpbGRfbGlzdF9oZWFkKTsKKwlJTklUX0xJU1RfSEVBRCgmb2JqLT5hY3RpdmVfbGlzdF9oZWFkKTsKKwlzcGluX2xvY2tfaW5pdCgmb2JqLT5jaGlsZF9saXN0X2xvY2spOworCisJc3luY190aW1lbGluZV9kZWJ1Z19hZGQob2JqKTsKKworCXJldHVybiBvYmo7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfdGltZWxpbmVfZnJlZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqID0KKwkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBzeW5jX3RpbWVsaW5lLCBrcmVmKTsKKworCXN5bmNfdGltZWxpbmVfZGVidWdfcmVtb3ZlKG9iaik7CisKKwlrZnJlZShvYmopOworfQorCitzdGF0aWMgdm9pZCBzeW5jX3RpbWVsaW5lX2dldChzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqKQoreworCWtyZWZfZ2V0KCZvYmotPmtyZWYpOworfQorCitzdGF0aWMgdm9pZCBzeW5jX3RpbWVsaW5lX3B1dChzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqKQoreworCWtyZWZfcHV0KCZvYmotPmtyZWYsIHN5bmNfdGltZWxpbmVfZnJlZSk7Cit9CisKKy8qKgorICogc3luY190aW1lbGluZV9zaWduYWwoKSAtIHNpZ25hbCBhIHN0YXR1cyBjaGFuZ2Ugb24gYSBzeW5jX3RpbWVsaW5lCisgKiBAb2JqOglzeW5jX3RpbWVsaW5lIHRvIHNpZ25hbAorICogQGluYzoJbnVtIHRvIGluY3JlbWVudCBvbiB0aW1lbGluZS0+dmFsdWUKKyAqCisgKiBBIHN5bmMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGNhbGwgdGhpcyBhbnkgdGltZSBvbmUgb2YgaXQncyBmZW5jZXMKKyAqIGhhcyBzaWduYWxlZCBvciBoYXMgYW4gZXJyb3IgY29uZGl0aW9uLgorICovCitzdGF0aWMgdm9pZCBzeW5jX3RpbWVsaW5lX3NpZ25hbChzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqLCB1bnNpZ25lZCBpbnQgaW5jKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHN5bmNfcHQgKnB0LCAqbmV4dDsKKworCXRyYWNlX3N5bmNfdGltZWxpbmUob2JqKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvYmotPmNoaWxkX2xpc3RfbG9jaywgZmxhZ3MpOworCisJb2JqLT52YWx1ZSArPSBpbmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHQsIG5leHQsICZvYmotPmFjdGl2ZV9saXN0X2hlYWQsCisJCQkJIGFjdGl2ZV9saXN0KSB7CisJCWlmIChmZW5jZV9pc19zaWduYWxlZF9sb2NrZWQoJnB0LT5iYXNlKSkKKwkJCWxpc3RfZGVsX2luaXQoJnB0LT5hY3RpdmVfbGlzdCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBzeW5jX3B0X2NyZWF0ZSgpIC0gY3JlYXRlcyBhIHN5bmMgcHQKKyAqIEBwYXJlbnQ6CWZlbmNlJ3MgcGFyZW50IHN5bmNfdGltZWxpbmUKKyAqIEBzaXplOglzaXplIHRvIGFsbG9jYXRlIGZvciB0aGlzIHB0CisgKiBAaW5jOgl2YWx1ZSBvZiB0aGUgZmVuY2UKKyAqCisgKiBDcmVhdGVzIGEgbmV3IHN5bmNfcHQgYXMgYSBjaGlsZCBvZiBAcGFyZW50LiAgQHNpemUgYnl0ZXMgd2lsbCBiZQorICogYWxsb2NhdGVkIGFsbG93aW5nIGZvciBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBkYXRhIHRvIGJlIGtlcHQgYWZ0ZXIKKyAqIHRoZSBnZW5lcmljIHN5bmNfdGltZWxpbmUgc3RydWN0LiBSZXR1cm5zIHRoZSBzeW5jX3B0IG9iamVjdCBvcgorICogTlVMTCBpbiBjYXNlIG9mIGVycm9yLgorICovCitzdGF0aWMgc3RydWN0IHN5bmNfcHQgKnN5bmNfcHRfY3JlYXRlKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmosIGludCBzaXplLAorCQkJICAgICB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3luY19wdCAqcHQ7CisKKwlpZiAoc2l6ZSA8IHNpemVvZigqcHQpKQorCQlyZXR1cm4gTlVMTDsKKworCXB0ID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0KQorCQlyZXR1cm4gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvYmotPmNoaWxkX2xpc3RfbG9jaywgZmxhZ3MpOworCXN5bmNfdGltZWxpbmVfZ2V0KG9iaik7CisJZmVuY2VfaW5pdCgmcHQtPmJhc2UsICZ0aW1lbGluZV9mZW5jZV9vcHMsICZvYmotPmNoaWxkX2xpc3RfbG9jaywKKwkJICAgb2JqLT5jb250ZXh0LCB2YWx1ZSk7CisJbGlzdF9hZGRfdGFpbCgmcHQtPmNoaWxkX2xpc3QsICZvYmotPmNoaWxkX2xpc3RfaGVhZCk7CisJSU5JVF9MSVNUX0hFQUQoJnB0LT5hY3RpdmVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcHQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp0aW1lbGluZV9mZW5jZV9nZXRfZHJpdmVyX25hbWUoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlyZXR1cm4gInN3X3N5bmMiOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdGltZWxpbmVfZmVuY2VfZ2V0X3RpbWVsaW5lX25hbWUoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCXJldHVybiBwYXJlbnQtPm5hbWU7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVsaW5lX2ZlbmNlX3JlbGVhc2Uoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgc3luY19wdCAqcHQgPSBmZW5jZV90b19zeW5jX3B0KGZlbmNlKTsKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoZmVuY2UtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmcHQtPmNoaWxkX2xpc3QpOworCWlmICghbGlzdF9lbXB0eSgmcHQtPmFjdGl2ZV9saXN0KSkKKwkJbGlzdF9kZWwoJnB0LT5hY3RpdmVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShmZW5jZS0+bG9jaywgZmxhZ3MpOworCisJc3luY190aW1lbGluZV9wdXQocGFyZW50KTsKKwlmZW5jZV9mcmVlKGZlbmNlKTsKK30KKworc3RhdGljIGJvb2wgdGltZWxpbmVfZmVuY2Vfc2lnbmFsZWQoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCXJldHVybiAoZmVuY2UtPnNlcW5vID4gcGFyZW50LT52YWx1ZSkgPyBmYWxzZSA6IHRydWU7Cit9CisKK3N0YXRpYyBib29sIHRpbWVsaW5lX2ZlbmNlX2VuYWJsZV9zaWduYWxpbmcoc3RydWN0IGZlbmNlICpmZW5jZSkKK3sKKwlzdHJ1Y3Qgc3luY19wdCAqcHQgPSBmZW5jZV90b19zeW5jX3B0KGZlbmNlKTsKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCWlmICh0aW1lbGluZV9mZW5jZV9zaWduYWxlZChmZW5jZSkpCisJCXJldHVybiBmYWxzZTsKKworCWxpc3RfYWRkX3RhaWwoJnB0LT5hY3RpdmVfbGlzdCwgJnBhcmVudC0+YWN0aXZlX2xpc3RfaGVhZCk7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVsaW5lX2ZlbmNlX3ZhbHVlX3N0cihzdHJ1Y3QgZmVuY2UgKmZlbmNlLAorCQkJCSAgICBjaGFyICpzdHIsIGludCBzaXplKQoreworCXNucHJpbnRmKHN0ciwgc2l6ZSwgIiVkIiwgZmVuY2UtPnNlcW5vKTsKK30KKworc3RhdGljIHZvaWQgdGltZWxpbmVfZmVuY2VfdGltZWxpbmVfdmFsdWVfc3RyKHN0cnVjdCBmZW5jZSAqZmVuY2UsCisJCQkJCSAgICAgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCXNucHJpbnRmKHN0ciwgc2l6ZSwgIiVkIiwgcGFyZW50LT52YWx1ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmVuY2Vfb3BzIHRpbWVsaW5lX2ZlbmNlX29wcyA9IHsKKwkuZ2V0X2RyaXZlcl9uYW1lID0gdGltZWxpbmVfZmVuY2VfZ2V0X2RyaXZlcl9uYW1lLAorCS5nZXRfdGltZWxpbmVfbmFtZSA9IHRpbWVsaW5lX2ZlbmNlX2dldF90aW1lbGluZV9uYW1lLAorCS5lbmFibGVfc2lnbmFsaW5nID0gdGltZWxpbmVfZmVuY2VfZW5hYmxlX3NpZ25hbGluZywKKwkuc2lnbmFsZWQgPSB0aW1lbGluZV9mZW5jZV9zaWduYWxlZCwKKwkud2FpdCA9IGZlbmNlX2RlZmF1bHRfd2FpdCwKKwkucmVsZWFzZSA9IHRpbWVsaW5lX2ZlbmNlX3JlbGVhc2UsCisJLmZlbmNlX3ZhbHVlX3N0ciA9IHRpbWVsaW5lX2ZlbmNlX3ZhbHVlX3N0ciwKKwkudGltZWxpbmVfdmFsdWVfc3RyID0gdGltZWxpbmVfZmVuY2VfdGltZWxpbmVfdmFsdWVfc3RyLAorfTsKKworLyoKKyAqICpXQVJOSU5HKgorICoKKyAqIGltcHJvcGVyIHVzZSBvZiB0aGlzIGNhbiByZXN1bHQgaW4gZGVhZGxvY2tpbmcga2VybmVsIGRyaXZlcnMgZnJvbSB1c2Vyc3BhY2UuCisgKi8KKworLyogb3BlbmluZyBzd19zeW5jIGNyZWF0ZSBhIG5ldyBzeW5jIG9iaiAqLworc3RhdGljIGludCBzd19zeW5jX2RlYnVnZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqOworCWNoYXIgdGFza19jb21tW1RBU0tfQ09NTV9MRU5dOworCisJZ2V0X3Rhc2tfY29tbSh0YXNrX2NvbW0sIGN1cnJlbnQpOworCisJb2JqID0gc3luY190aW1lbGluZV9jcmVhdGUodGFza19jb21tKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBvYmo7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd19zeW5jX2RlYnVnZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJc21wX3dtYigpOworCisJc3luY190aW1lbGluZV9wdXQob2JqKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgc3dfc3luY19pb2N0bF9jcmVhdGVfZmVuY2Uoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGZkID0gZ2V0X3VudXNlZF9mZF9mbGFncyhPX0NMT0VYRUMpOworCWludCBlcnI7CisJc3RydWN0IHN5bmNfcHQgKnB0OworCXN0cnVjdCBzeW5jX2ZpbGUgKnN5bmNfZmlsZTsKKwlzdHJ1Y3Qgc3dfc3luY19jcmVhdGVfZmVuY2VfZGF0YSBkYXRhOworCisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihkYXRhKSkpIHsKKwkJZXJyID0gLUVGQVVMVDsKKwkJZ290byBlcnI7CisJfQorCisJcHQgPSBzeW5jX3B0X2NyZWF0ZShvYmosIHNpemVvZigqcHQpLCBkYXRhLnZhbHVlKTsKKwlpZiAoIXB0KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKworCXN5bmNfZmlsZSA9IHN5bmNfZmlsZV9jcmVhdGUoJnB0LT5iYXNlKTsKKwlpZiAoIXN5bmNfZmlsZSkgeworCQlmZW5jZV9wdXQoJnB0LT5iYXNlKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQorCisJZGF0YS5mZW5jZSA9IGZkOworCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKSkgeworCQlmcHV0KHN5bmNfZmlsZS0+ZmlsZSk7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyOworCX0KKworCWZkX2luc3RhbGwoZmQsIHN5bmNfZmlsZS0+ZmlsZSk7CisKKwlyZXR1cm4gMDsKKworZXJyOgorCXB1dF91bnVzZWRfZmQoZmQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBsb25nIHN3X3N5bmNfaW9jdGxfaW5jKHN0cnVjdCBzeW5jX3RpbWVsaW5lICpvYmosIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXUzMiB2YWx1ZTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsdWUsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHZhbHVlKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3luY190aW1lbGluZV9zaWduYWwob2JqLCB2YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgc3dfc3luY19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTV19TWU5DX0lPQ19DUkVBVEVfRkVOQ0U6CisJCXJldHVybiBzd19zeW5jX2lvY3RsX2NyZWF0ZV9mZW5jZShvYmosIGFyZyk7CisKKwljYXNlIFNXX1NZTkNfSU9DX0lOQzoKKwkJcmV0dXJuIHN3X3N5bmNfaW9jdGxfaW5jKG9iaiwgYXJnKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzd19zeW5jX2RlYnVnZnNfZm9wcyA9IHsKKwkub3BlbiAgICAgICAgICAgPSBzd19zeW5jX2RlYnVnZnNfb3BlbiwKKwkucmVsZWFzZSAgICAgICAgPSBzd19zeW5jX2RlYnVnZnNfcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBzd19zeW5jX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJPSBzd19zeW5jX2lvY3RsLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9zeW5jX2RlYnVnLmMgYi9kcml2ZXJzL2RtYS1idWYvc3luY19kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYjk1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS1idWYvc3luY19kZWJ1Zy5jCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogU3luYyBGaWxlIHZhbGlkYXRpb24gZnJhbWV3b3JrIGFuZCBkZWJ1ZyBpbmZvcm1hdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUsIEluYy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgInN5bmNfZGVidWcuaCIKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRiZ2ZzOworCitzdGF0aWMgTElTVF9IRUFEKHN5bmNfdGltZWxpbmVfbGlzdF9oZWFkKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3luY190aW1lbGluZV9saXN0X2xvY2spOworc3RhdGljIExJU1RfSEVBRChzeW5jX2ZpbGVfbGlzdF9oZWFkKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3luY19maWxlX2xpc3RfbG9jayk7CisKK3ZvaWQgc3luY190aW1lbGluZV9kZWJ1Z19hZGQoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmb2JqLT5zeW5jX3RpbWVsaW5lX2xpc3QsICZzeW5jX3RpbWVsaW5lX2xpc3RfaGVhZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luY190aW1lbGluZV9saXN0X2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzeW5jX3RpbWVsaW5lX2RlYnVnX3JlbW92ZShzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3luY190aW1lbGluZV9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmb2JqLT5zeW5jX3RpbWVsaW5lX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgc3luY19maWxlX2RlYnVnX2FkZChzdHJ1Y3Qgc3luY19maWxlICpzeW5jX2ZpbGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzeW5jX2ZpbGVfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmc3luY19maWxlLT5zeW5jX2ZpbGVfbGlzdCwgJnN5bmNfZmlsZV9saXN0X2hlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN5bmNfZmlsZV9saXN0X2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBzeW5jX2ZpbGVfZGVidWdfcmVtb3ZlKHN0cnVjdCBzeW5jX2ZpbGUgKnN5bmNfZmlsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmNfZmlsZV9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmc3luY19maWxlLT5zeW5jX2ZpbGVfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luY19maWxlX2xpc3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3luY19zdGF0dXNfc3RyKGludCBzdGF0dXMpCit7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlyZXR1cm4gInNpZ25hbGVkIjsKKworCWlmIChzdGF0dXMgPiAwKQorCQlyZXR1cm4gImFjdGl2ZSI7CisKKwlyZXR1cm4gImVycm9yIjsKK30KKworc3RhdGljIHZvaWQgc3luY19wcmludF9mZW5jZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBmZW5jZSAqZmVuY2UsIGJvb2wgc2hvdykKK3sKKwlpbnQgc3RhdHVzID0gMTsKKwlzdHJ1Y3Qgc3luY190aW1lbGluZSAqcGFyZW50ID0gZmVuY2VfcGFyZW50KGZlbmNlKTsKKworCWlmIChmZW5jZV9pc19zaWduYWxlZF9sb2NrZWQoZmVuY2UpKQorCQlzdGF0dXMgPSBmZW5jZS0+c3RhdHVzOworCisJc2VxX3ByaW50ZihzLCAiICAlcyVzZmVuY2UgJXMiLAorCQkgICBzaG93ID8gcGFyZW50LT5uYW1lIDogIiIsCisJCSAgIHNob3cgPyAiXyIgOiAiIiwKKwkJICAgc3luY19zdGF0dXNfc3RyKHN0YXR1cykpOworCisJaWYgKHN0YXR1cyA8PSAwKSB7CisJCXN0cnVjdCB0aW1lc3BlYzY0IHRzNjQgPQorCQkJa3RpbWVfdG9fdGltZXNwZWM2NChmZW5jZS0+dGltZXN0YW1wKTsKKworCQlzZXFfcHJpbnRmKHMsICJAJWxsZC4lMDlsZCIsIChzNjQpdHM2NC50dl9zZWMsIHRzNjQudHZfbnNlYyk7CisJfQorCisJaWYgKGZlbmNlLT5vcHMtPnRpbWVsaW5lX3ZhbHVlX3N0ciAmJgorCQlmZW5jZS0+b3BzLT5mZW5jZV92YWx1ZV9zdHIpIHsKKwkJY2hhciB2YWx1ZVs2NF07CisJCWJvb2wgc3VjY2VzczsKKworCQlmZW5jZS0+b3BzLT5mZW5jZV92YWx1ZV9zdHIoZmVuY2UsIHZhbHVlLCBzaXplb2YodmFsdWUpKTsKKwkJc3VjY2VzcyA9IHN0cmxlbih2YWx1ZSk7CisKKwkJaWYgKHN1Y2Nlc3MpIHsKKwkJCXNlcV9wcmludGYocywgIjogJXMiLCB2YWx1ZSk7CisKKwkJCWZlbmNlLT5vcHMtPnRpbWVsaW5lX3ZhbHVlX3N0cihmZW5jZSwgdmFsdWUsCisJCQkJCQkgICAgICAgc2l6ZW9mKHZhbHVlKSk7CisKKwkJCWlmIChzdHJsZW4odmFsdWUpKQorCQkJCXNlcV9wcmludGYocywgIiAvICVzIiwgdmFsdWUpOworCQl9CisJfQorCisJc2VxX3B1dHMocywgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfcHJpbnRfb2JqKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNlcV9wcmludGYocywgIiVzOiAlZFxuIiwgb2JqLT5uYW1lLCBvYmotPnZhbHVlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvYmotPmNoaWxkX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2gocG9zLCAmb2JqLT5jaGlsZF9saXN0X2hlYWQpIHsKKwkJc3RydWN0IHN5bmNfcHQgKnB0ID0KKwkJCWNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBzeW5jX3B0LCBjaGlsZF9saXN0KTsKKwkJc3luY19wcmludF9mZW5jZShzLCAmcHQtPmJhc2UsIGZhbHNlKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqLT5jaGlsZF9saXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc3luY19wcmludF9zeW5jX2ZpbGUoc3RydWN0IHNlcV9maWxlICpzLAorCQkJCSAgc3RydWN0IHN5bmNfZmlsZSAqc3luY19maWxlKQoreworCWludCBpOworCisJc2VxX3ByaW50ZihzLCAiWyVwXSAlczogJXNcbiIsIHN5bmNfZmlsZSwgc3luY19maWxlLT5uYW1lLAorCQkgICBzeW5jX3N0YXR1c19zdHIoYXRvbWljX3JlYWQoJnN5bmNfZmlsZS0+c3RhdHVzKSkpOworCisJZm9yIChpID0gMDsgaSA8IHN5bmNfZmlsZS0+bnVtX2ZlbmNlczsgKytpKQorCQlzeW5jX3ByaW50X2ZlbmNlKHMsIHN5bmNfZmlsZS0+Y2JzW2ldLmZlbmNlLCB0cnVlKTsKK30KKworc3RhdGljIGludCBzeW5jX2RlYnVnZnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnVudXNlZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworCXNlcV9wdXRzKHMsICJvYmpzOlxuLS0tLS0tLS0tLS0tLS1cbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN5bmNfdGltZWxpbmVfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaChwb3MsICZzeW5jX3RpbWVsaW5lX2xpc3RfaGVhZCkgeworCQlzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqID0KKwkJCWNvbnRhaW5lcl9vZihwb3MsIHN0cnVjdCBzeW5jX3RpbWVsaW5lLAorCQkJCSAgICAgc3luY190aW1lbGluZV9saXN0KTsKKworCQlzeW5jX3ByaW50X29iaihzLCBvYmopOworCQlzZXFfcHV0cyhzLCAiXG4iKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3luY190aW1lbGluZV9saXN0X2xvY2ssIGZsYWdzKTsKKworCXNlcV9wdXRzKHMsICJmZW5jZXM6XG4tLS0tLS0tLS0tLS0tLVxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3luY19maWxlX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2gocG9zLCAmc3luY19maWxlX2xpc3RfaGVhZCkgeworCQlzdHJ1Y3Qgc3luY19maWxlICpzeW5jX2ZpbGUgPQorCQkJY29udGFpbmVyX29mKHBvcywgc3RydWN0IHN5bmNfZmlsZSwgc3luY19maWxlX2xpc3QpOworCisJCXN5bmNfcHJpbnRfc3luY19maWxlKHMsIHN5bmNfZmlsZSk7CisJCXNlcV9wdXRzKHMsICJcbiIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzeW5jX2ZpbGVfbGlzdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3luY19pbmZvX2RlYnVnZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc3luY19kZWJ1Z2ZzX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeW5jX2luZm9fZGVidWdmc19mb3BzID0geworCS5vcGVuICAgICAgICAgICA9IHN5bmNfaW5mb19kZWJ1Z2ZzX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlICAgICAgICA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgc3luY19kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlkYmdmcyA9IGRlYnVnZnNfY3JlYXRlX2Rpcigic3luYyIsIE5VTEwpOworCisJLyoKKwkgKiBUaGUgZGVidWdmcyBmaWxlcyB3b24ndCBldmVyIGdldCByZW1vdmVkIGFuZCB0aHVzLCB0aGVyZSBpcworCSAqIG5vIG5lZWQgdG8gcHJvdGVjdCBpdCBhZ2FpbnN0IHJlbW92YWwgcmFjZXMuIFRoZSB1c2Ugb2YKKwkgKiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlX3Vuc2FmZSgpIGlzIGFjdHVhbGx5IHNhZmUgaGVyZS4KKwkgKi8KKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlX3Vuc2FmZSgiaW5mbyIsIDA0NDQsIGRiZ2ZzLCBOVUxMLAorCQkJCSAgICZzeW5jX2luZm9fZGVidWdmc19mb3BzKTsKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlX3Vuc2FmZSgic3dfc3luYyIsIDA2NDQsIGRiZ2ZzLCBOVUxMLAorCQkJCSAgICZzd19zeW5jX2RlYnVnZnNfZm9wcyk7CisKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoc3luY19kZWJ1Z2ZzX2luaXQpOworCisjZGVmaW5lIERVTVBfQ0hVTksgMjU2CitzdGF0aWMgY2hhciBzeW5jX2R1bXBfYnVmWzY0ICogMTAyNF07Cit2b2lkIHN5bmNfZHVtcCh2b2lkKQoreworCXN0cnVjdCBzZXFfZmlsZSBzID0geworCQkuYnVmID0gc3luY19kdW1wX2J1ZiwKKwkJLnNpemUgPSBzaXplb2Yoc3luY19kdW1wX2J1ZikgLSAxLAorCX07CisJaW50IGk7CisKKwlzeW5jX2RlYnVnZnNfc2hvdygmcywgTlVMTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcy5jb3VudDsgaSArPSBEVU1QX0NIVU5LKSB7CisJCWlmICgocy5jb3VudCAtIGkpID4gRFVNUF9DSFVOSykgeworCQkJY2hhciBjID0gcy5idWZbaSArIERVTVBfQ0hVTktdOworCisJCQlzLmJ1ZltpICsgRFVNUF9DSFVOS10gPSAwOworCQkJcHJfY29udCgiJXMiLCBzLmJ1ZiArIGkpOworCQkJcy5idWZbaSArIERVTVBfQ0hVTktdID0gYzsKKwkJfSBlbHNlIHsKKwkJCXMuYnVmW3MuY291bnRdID0gMDsKKwkJCXByX2NvbnQoIiVzIiwgcy5idWYgKyBpKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hLWJ1Zi9zeW5jX2RlYnVnLmggYi9kcml2ZXJzL2RtYS1idWYvc3luY19kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjlhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS1idWYvc3luY19kZWJ1Zy5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBTeW5jIEZpbGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgYW5kIGRlYnVnIGluZm9tYXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfTElOVVhfU1lOQ19ICisjZGVmaW5lIF9MSU5VWF9TWU5DX0gKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZlbmNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zeW5jX2ZpbGUuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3N5bmNfZmlsZS5oPgorCisvKioKKyAqIHN0cnVjdCBzeW5jX3RpbWVsaW5lIC0gc3luYyBvYmplY3QKKyAqIEBrcmVmOgkJcmVmZXJlbmNlIGNvdW50IG9uIGZlbmNlLgorICogQG5hbWU6CQluYW1lIG9mIHRoZSBzeW5jX3RpbWVsaW5lLiBVc2VmdWwgZm9yIGRlYnVnZ2luZworICogQGNoaWxkX2xpc3RfaGVhZDoJbGlzdCBvZiBjaGlsZHJlbiBzeW5jX3B0cyBmb3IgdGhpcyBzeW5jX3RpbWVsaW5lCisgKiBAY2hpbGRfbGlzdF9sb2NrOglsb2NrIHByb3RlY3RpbmcgQGNoaWxkX2xpc3RfaGVhZCBhbmQgZmVuY2Uuc3RhdHVzCisgKiBAYWN0aXZlX2xpc3RfaGVhZDoJbGlzdCBvZiBhY3RpdmUgKHVuc2lnbmFsZWQvZXJyb3JlZCkgc3luY19wdHMKKyAqIEBzeW5jX3RpbWVsaW5lX2xpc3Q6CW1lbWJlcnNoaXAgaW4gZ2xvYmFsIHN5bmNfdGltZWxpbmVfbGlzdAorICovCitzdHJ1Y3Qgc3luY190aW1lbGluZSB7CisJc3RydWN0IGtyZWYJCWtyZWY7CisJY2hhcgkJCW5hbWVbMzJdOworCisJLyogcHJvdGVjdGVkIGJ5IGNoaWxkX2xpc3RfbG9jayAqLworCXU2NAkJCWNvbnRleHQ7CisJaW50CQkJdmFsdWU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWNoaWxkX2xpc3RfaGVhZDsKKwlzcGlubG9ja190CQljaGlsZF9saXN0X2xvY2s7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCWFjdGl2ZV9saXN0X2hlYWQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCXN5bmNfdGltZWxpbmVfbGlzdDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN5bmNfdGltZWxpbmUgKmZlbmNlX3BhcmVudChzdHJ1Y3QgZmVuY2UgKmZlbmNlKQoreworCXJldHVybiBjb250YWluZXJfb2YoZmVuY2UtPmxvY2ssIHN0cnVjdCBzeW5jX3RpbWVsaW5lLAorCQkJICAgIGNoaWxkX2xpc3RfbG9jayk7Cit9CisKKy8qKgorICogc3RydWN0IHN5bmNfcHQgLSBzeW5jX3B0IG9iamVjdAorICogQGJhc2U6IGJhc2UgZmVuY2Ugb2JqZWN0CisgKiBAY2hpbGRfbGlzdDogc3luYyB0aW1lbGluZSBjaGlsZCdzIGxpc3QKKyAqIEBhY3RpdmVfbGlzdDogc3luYyB0aW1lbGluZSBhY3RpdmUgY2hpbGQncyBsaXN0CisgKi8KK3N0cnVjdCBzeW5jX3B0IHsKKwlzdHJ1Y3QgZmVuY2UgYmFzZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaWxkX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmVfbGlzdDsKK307CisKKyNpZmRlZiBDT05GSUdfU1dfU1lOQworCitleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzd19zeW5jX2RlYnVnZnNfZm9wczsKKwordm9pZCBzeW5jX3RpbWVsaW5lX2RlYnVnX2FkZChzdHJ1Y3Qgc3luY190aW1lbGluZSAqb2JqKTsKK3ZvaWQgc3luY190aW1lbGluZV9kZWJ1Z19yZW1vdmUoc3RydWN0IHN5bmNfdGltZWxpbmUgKm9iaik7Cit2b2lkIHN5bmNfZmlsZV9kZWJ1Z19hZGQoc3RydWN0IHN5bmNfZmlsZSAqZmVuY2UpOwordm9pZCBzeW5jX2ZpbGVfZGVidWdfcmVtb3ZlKHN0cnVjdCBzeW5jX2ZpbGUgKmZlbmNlKTsKK3ZvaWQgc3luY19kdW1wKHZvaWQpOworCisjZWxzZQorIyBkZWZpbmUgc3luY190aW1lbGluZV9kZWJ1Z19hZGQob2JqKQorIyBkZWZpbmUgc3luY190aW1lbGluZV9kZWJ1Z19yZW1vdmUob2JqKQorIyBkZWZpbmUgc3luY19maWxlX2RlYnVnX2FkZChmZW5jZSkKKyMgZGVmaW5lIHN5bmNfZmlsZV9kZWJ1Z19yZW1vdmUoZmVuY2UpCisjIGRlZmluZSBzeW5jX2R1bXAoKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfU1lOQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS1idWYvc3luY190cmFjZS5oIGIvZHJpdmVycy9kbWEtYnVmL3N5bmNfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTNkNTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEtYnVmL3N5bmNfdHJhY2UuaApAQCAtMCwwICsxLDMyIEBACisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuLi8uLi9kcml2ZXJzL2RtYS1idWYKKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIHN5bmNfdHJhY2UKKworI2lmICFkZWZpbmVkKF9UUkFDRV9TWU5DX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9TWU5DX0gKKworI2luY2x1ZGUgInN5bmNfZGVidWcuaCIKKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK1RSQUNFX0VWRU5UKHN5bmNfdGltZWxpbmUsCisJVFBfUFJPVE8oc3RydWN0IHN5bmNfdGltZWxpbmUgKnRpbWVsaW5lKSwKKworCVRQX0FSR1ModGltZWxpbmUpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJCV9fc3RyaW5nKG5hbWUsIHRpbWVsaW5lLT5uYW1lKQorCQkJX19maWVsZCh1MzIsIHZhbHVlKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJCV9fYXNzaWduX3N0cihuYW1lLCB0aW1lbGluZS0+bmFtZSk7CisJCQlfX2VudHJ5LT52YWx1ZSA9IHRpbWVsaW5lLT52YWx1ZTsKKwkpLAorCisJVFBfcHJpbnRrKCJuYW1lPSVzIHZhbHVlPSVkIiwgX19nZXRfc3RyKG5hbWUpLCBfX2VudHJ5LT52YWx1ZSkKKyk7CisKKyNlbmRpZiAvKiBpZiAhZGVmaW5lZChfVFJBQ0VfU1lOQ19IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKSAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL0tjb25maWcgYi9kcml2ZXJzL2RtYS9LY29uZmlnCmluZGV4IDczOWY3OTcuLmFmNjNhNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvS2NvbmZpZwpAQCAtMTAyLDcgKzEwMiw3IEBACiBjb25maWcgQ09IOTAxMzE4CiAJYm9vbCAiU1QtRXJpY3Nzb24gQ09IOTAxMzE4IERNQSBzdXBwb3J0IgogCXNlbGVjdCBETUFfRU5HSU5FCi0JZGVwZW5kcyBvbiBBUkNIX1UzMDAKKwlkZXBlbmRzIG9uIEFSQ0hfVTMwMCB8fCBDT01QSUxFX1RFU1QKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgU1QtRXJpY3Nzb24gQ09IIDkwMSAzMTggRE1BLgogCkBAIC0xMTQsMTMgKzExNCwxMyBAQAogCiBjb25maWcgRE1BX0paNDc0MAogCXRyaXN0YXRlICJKWjQ3NDAgRE1BIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNQUNIX0paNDc0MAorCWRlcGVuZHMgb24gTUFDSF9KWjQ3NDAgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IERNQV9FTkdJTkUKIAlzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKIAogY29uZmlnIERNQV9KWjQ3ODAKIAl0cmlzdGF0ZSAiSlo0NzgwIERNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gTUFDSF9KWjQ3ODAKKwlkZXBlbmRzIG9uIE1BQ0hfSlo0NzgwIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBETUFfRU5HSU5FCiAJc2VsZWN0IERNQV9WSVJUVUFMX0NIQU5ORUxTCiAJaGVscApAQCAtMTMwLDE0ICsxMzAsMTQgQEAKIAogY29uZmlnIERNQV9PTUFQCiAJdHJpc3RhdGUgIk9NQVAgRE1BIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX09NQVAKKwlkZXBlbmRzIG9uIEFSQ0hfT01BUCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgRE1BX0VOR0lORQogCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUwotCXNlbGVjdCBUSV9ETUFfQ1JPU1NCQVIgaWYgU09DX0RSQTdYWAorCXNlbGVjdCBUSV9ETUFfQ1JPU1NCQVIgaWYgKFNPQ19EUkE3WFggfHwgQ09NUElMRV9URVNUKQogCiBjb25maWcgRE1BX1NBMTFYMAogCXRyaXN0YXRlICJTQS0xMXgwIERNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9TQTExMDAKKwlkZXBlbmRzIG9uIEFSQ0hfU0ExMTAwIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBETUFfRU5HSU5FCiAJc2VsZWN0IERNQV9WSVJUVUFMX0NIQU5ORUxTCiAJaGVscApAQCAtMTUwLDcgKzE1MCw2IEBACiAJZGVwZW5kcyBvbiBNQUNIX1NVTjRJIHx8IE1BQ0hfU1VONUkgfHwgTUFDSF9TVU43SQogCWRlZmF1bHQgKE1BQ0hfU1VONEkgfHwgTUFDSF9TVU41SSB8fCBNQUNIX1NVTjdJKQogCXNlbGVjdCBETUFfRU5HSU5FCi0Jc2VsZWN0IERNQV9PRgogCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUwogCWhlbHAKIAkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgRE1BIGNvbnRyb2xsZXIgcHJlc2VudCBpbiB0aGUgc3VuNGksCkBAIC0xNjcsNyArMTY2LDcgQEAKIAogY29uZmlnIEVQOTNYWF9ETUEKIAlib29sICJDaXJydXMgTG9naWMgRVA5M3h4IERNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9FUDkzWFgKKwlkZXBlbmRzIG9uIEFSQ0hfRVA5M1hYIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBETUFfRU5HSU5FCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBDaXJydXMgTG9naWMgRVA5M3h4IE0yUC9NMk0gRE1BIGNvbnRyb2xsZXIuCkBAIC0yNzksNyArMjc4LDcgQEAKIAogY29uZmlnIEszX0RNQQogCXRyaXN0YXRlICJIaXNpbGljb24gSzMgRE1BIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX0hJM3h4eAorCWRlcGVuZHMgb24gQVJDSF9ISTN4eHggfHwgQVJDSF9ISVNJIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBETUFfRU5HSU5FCiAJc2VsZWN0IERNQV9WSVJUVUFMX0NIQU5ORUxTCiAJaGVscApAQCAtMjk3LDE2ICsyOTYsMTYgQEAKIAogY29uZmlnIE1NUF9QRE1BCiAJYm9vbCAiTU1QIFBETUEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIChBUkNIX01NUCB8fCBBUkNIX1BYQSkKKwlkZXBlbmRzIG9uIEFSQ0hfTU1QIHx8IEFSQ0hfUFhBIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBETUFfRU5HSU5FCiAJaGVscAogCSAgU3VwcG9ydCB0aGUgTU1QIFBETUEgZW5naW5lIGZvciBQWEEgYW5kIE1NUCBwbGF0Zm9ybS4KIAogY29uZmlnIE1NUF9URE1BCiAJYm9vbCAiTU1QIFR3by1DaGFubmVsIERNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9NTVAKKwlkZXBlbmRzIG9uIEFSQ0hfTU1QIHx8IENPTVBJTEVfVEVTVAogCXNlbGVjdCBETUFfRU5HSU5FCi0Jc2VsZWN0IE1NUF9TUkFNCisJc2VsZWN0IE1NUF9TUkFNIGlmIEFSQ0hfTU1QCiAJaGVscAogCSAgU3VwcG9ydCB0aGUgTU1QIFR3by1DaGFubmVsIERNQSBlbmdpbmUuCiAJICBUaGlzIGVuZ2luZSB1c2VkIGZvciBNTVAgQXVkaW8gRE1BIGFuZCBweGE5MTAgU1FVLgpAQCAtMzE2LDcgKzMxNSw2IEBACiAJdHJpc3RhdGUgIk1PWEFSVCBETUEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfTU9YQVJUCiAJc2VsZWN0IERNQV9FTkdJTkUKLQlzZWxlY3QgRE1BX09GCiAJc2VsZWN0IERNQV9WSVJUVUFMX0NIQU5ORUxTCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBNT1hBIEFSVCBTb0MgRE1BIGNvbnRyb2xsZXIuCkBAIC00MzksOSArNDM3LDggQEAKIAogY29uZmlnIFNUTTMyX0RNQQogCWJvb2wgIlNUTWljcm9lbGVjdHJvbmljcyBTVE0zMiBETUEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfU1RNMzIKKwlkZXBlbmRzIG9uIEFSQ0hfU1RNMzIgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IERNQV9FTkdJTkUKLQlzZWxlY3QgRE1BX09GCiAJc2VsZWN0IERNQV9WSVJUVUFMX0NIQU5ORUxTCiAJaGVscAogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBvbi1jaGlwIERNQSBjb250cm9sbGVyIG9uIFNUTWljcm9lbGVjdHJvbmljcwpAQCAtNDUxLDcgKzQ0OCw3IEBACiAKIGNvbmZpZyBTM0MyNFhYX0RNQUMKIAlib29sICJTYW1zdW5nIFMzQzI0WFggRE1BIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX1MzQzI0WFgKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjRYWCB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgRE1BX0VOR0lORQogCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUwogCWhlbHAKQEAgLTQ4MywxMCArNDgwLDkgQEAKIAogY29uZmlnIFRFR1JBMjEwX0FETUEKIAlib29sICJOVklESUEgVGVncmEyMTAgQURNQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9URUdSQV8yMTBfU09DCisJZGVwZW5kcyBvbiAoQVJDSF9URUdSQV8yMTBfU09DIHx8IENPTVBJTEVfVEVTVCkgJiYgUE1fQ0xLCiAJc2VsZWN0IERNQV9FTkdJTkUKIAlzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKLQlzZWxlY3QgUE1fQ0xLCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIE5WSURJQSBUZWdyYTIxMCBBRE1BIGNvbnRyb2xsZXIgZHJpdmVyLiBUaGUKIAkgIERNQSBjb250cm9sbGVyIGhhcyBtdWx0aXBsZSBETUEgY2hhbm5lbHMgYW5kIGlzIHVzZWQgdG8gc2VydmljZQpAQCAtNDk3LDcgKzQ5Myw3IEBACiAKIGNvbmZpZyBUSU1CX0RNQQogCXRyaXN0YXRlICJUaW1iZXJkYWxlIEZQR0EgRE1BIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBNRkRfVElNQkVSREFMRQorCWRlcGVuZHMgb24gTUZEX1RJTUJFUkRBTEUgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IERNQV9FTkdJTkUKIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFRpbWJlcmRhbGUgRlBHQSBETUEgZW5naW5lLgpAQCAtNTE1LDEwICs1MTEsMTAgQEAKIAogY29uZmlnIFRJX0VETUEKIAlib29sICJUSSBFRE1BIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX0RBVklOQ0kgfHwgQVJDSF9PTUFQIHx8IEFSQ0hfS0VZU1RPTkUKKwlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSSB8fCBBUkNIX09NQVAgfHwgQVJDSF9LRVlTVE9ORSB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgRE1BX0VOR0lORQogCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUwotCXNlbGVjdCBUSV9ETUFfQ1JPU1NCQVIgaWYgQVJDSF9PTUFQCisJc2VsZWN0IFRJX0RNQV9DUk9TU0JBUiBpZiAoQVJDSF9PTUFQIHx8IENPTVBJTEVfVEVTVCkKIAlkZWZhdWx0IG4KIAloZWxwCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFRJIEVETUEgY29udHJvbGxlci4gVGhpcyBETUEKQEAgLTU2MSw3ICs1NTcsNyBAQAogCiBjb25maWcgWlhfRE1BCiAJdHJpc3RhdGUgIlpURSBaWDI5NjcwMiBETUEgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSQ0hfWlgKKwlkZXBlbmRzIG9uIEFSQ0hfWlggfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IERNQV9FTkdJTkUKIAlzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jIGIvZHJpdmVycy9kbWEvYXRfaGRtYWMuYwppbmRleCA1M2QyMmViLi5hNGM4ZjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jCisrKyBiL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMKQEAgLTQ3MywxNSArNDczLDExIEBACiAJLyogZm9yIGN5Y2xpYyB0cmFuc2ZlcnMsCiAJICogbm8gbmVlZCB0byByZXBsYXkgY2FsbGJhY2sgZnVuY3Rpb24gd2hpbGUgc3RvcHBpbmcgKi8KIAlpZiAoIWF0Y19jaGFuX2lzX2N5Y2xpYyhhdGNoYW4pKSB7Ci0JCWRtYV9hc3luY190eF9jYWxsYmFjawljYWxsYmFjayA9IHR4ZC0+Y2FsbGJhY2s7Ci0JCXZvaWQJCQkqcGFyYW0gPSB0eGQtPmNhbGxiYWNrX3BhcmFtOwotCiAJCS8qCiAJCSAqIFRoZSBBUEkgcmVxdWlyZXMgdGhhdCBubyBzdWJtaXNzaW9ucyBhcmUgZG9uZSBmcm9tIGEKIAkJICogY2FsbGJhY2ssIHNvIHdlIGRvbid0IG5lZWQgdG8gZHJvcCB0aGUgbG9jayBoZXJlCiAJCSAqLwotCQlpZiAoY2FsbGJhY2spCi0JCQljYWxsYmFjayhwYXJhbSk7CisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UodHhkLCBOVUxMKTsKIAl9CiAKIAlkbWFfcnVuX2RlcGVuZGVuY2llcyh0eGQpOwpAQCAtNTk4LDE1ICs1OTQsMTIgQEAKIHsKIAlzdHJ1Y3QgYXRfZGVzYwkJCSpmaXJzdCA9IGF0Y19maXJzdF9hY3RpdmUoYXRjaGFuKTsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJKnR4ZCA9ICZmaXJzdC0+dHhkOwotCWRtYV9hc3luY190eF9jYWxsYmFjawkJY2FsbGJhY2sgPSB0eGQtPmNhbGxiYWNrOwotCXZvaWQJCQkJKnBhcmFtID0gdHhkLT5jYWxsYmFja19wYXJhbTsKIAogCWRldl92ZGJnKGNoYW4yZGV2KCZhdGNoYW4tPmNoYW5fY29tbW9uKSwKIAkJCSJuZXcgY3ljbGljIHBlcmlvZCBsbHAgMHglMDh4XG4iLAogCQkJY2hhbm5lbF9yZWFkbChhdGNoYW4sIERTQ1IpKTsKIAotCWlmIChjYWxsYmFjaykKLQkJY2FsbGJhY2socGFyYW0pOworCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UodHhkLCBOVUxMKTsKIH0KIAogLyotLSAgSVJRICYgVGFza2xldCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2F0X3hkbWFjLmMgYi9kcml2ZXJzL2RtYS9hdF94ZG1hYy5jCmluZGV4IGU0MzRmZmUuLmI3ZDdmMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2F0X3hkbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvYXRfeGRtYWMuYwpAQCAtMTU3Miw4ICsxNTcyLDggQEAKIAlkZXNjID0gbGlzdF9maXJzdF9lbnRyeSgmYXRjaGFuLT54ZmVyc19saXN0LCBzdHJ1Y3QgYXRfeGRtYWNfZGVzYywgeGZlcl9ub2RlKTsKIAl0eGQgPSAmZGVzYy0+dHhfZG1hX2Rlc2M7CiAKLQlpZiAodHhkLT5jYWxsYmFjayAmJiAodHhkLT5mbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVCkpCi0JCXR4ZC0+Y2FsbGJhY2sodHhkLT5jYWxsYmFja19wYXJhbSk7CisJaWYgKHR4ZC0+ZmxhZ3MgJiBETUFfUFJFUF9JTlRFUlJVUFQpCisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UodHhkLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgYXRfeGRtYWNfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCkBAIC0xNjE2LDggKzE2MTYsOCBAQAogCiAJCWlmICghYXRfeGRtYWNfY2hhbl9pc19jeWNsaWMoYXRjaGFuKSkgewogCQkJZG1hX2Nvb2tpZV9jb21wbGV0ZSh0eGQpOwotCQkJaWYgKHR4ZC0+Y2FsbGJhY2sgJiYgKHR4ZC0+ZmxhZ3MgJiBETUFfUFJFUF9JTlRFUlJVUFQpKQotCQkJCXR4ZC0+Y2FsbGJhY2sodHhkLT5jYWxsYmFja19wYXJhbSk7CisJCQlpZiAodHhkLT5mbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVCkKKwkJCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKHR4ZCwgTlVMTCk7CiAJCX0KIAogCQlkbWFfcnVuX2RlcGVuZGVuY2llcyh0eGQpOwpAQCAtMjA2Nyw3ICsyMDY3LDcgQEAKIGVycl9jbGtfZGlzYWJsZToKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoYXR4ZG1hYy0+Y2xrKTsKIGVycl9mcmVlX2lycToKLQlmcmVlX2lycShhdHhkbWFjLT5pcnEsIGF0eGRtYWMtPmRtYS5kZXYpOworCWZyZWVfaXJxKGF0eGRtYWMtPmlycSwgYXR4ZG1hYyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjA4MSw3ICsyMDgxLDcgQEAKIAlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoJmF0eGRtYWMtPmRtYSk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGF0eGRtYWMtPmNsayk7CiAKLQlmcmVlX2lycShhdHhkbWFjLT5pcnEsIGF0eGRtYWMtPmRtYS5kZXYpOworCWZyZWVfaXJxKGF0eGRtYWMtPmlycSwgYXR4ZG1hYyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXR4ZG1hYy0+ZG1hLmNoYW5jbnQ7IGkrKykgewogCQlzdHJ1Y3QgYXRfeGRtYWNfY2hhbiAqYXRjaGFuID0gJmF0eGRtYWMtPmNoYW5baV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9iZXN0Y29tbS9iZXN0Y29tbS5jIGIvZHJpdmVycy9kbWEvYmVzdGNvbW0vYmVzdGNvbW0uYwppbmRleCA3Y2U4NDM3Li43YTY3YjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9iZXN0Y29tbS9iZXN0Y29tbS5jCisrKyBiL2RyaXZlcnMvZG1hL2Jlc3Rjb21tL2Jlc3Rjb21tLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAogCS8qIEdldCBJUlEgb2YgdGhhdCB0YXNrICovCiAJdHNrLT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChiY29tX2VuZy0+b2Zub2RlLCB0c2stPnRhc2tudW0pOwotCWlmICh0c2stPmlycSA9PSBOT19JUlEpCisJaWYgKCF0c2stPmlycSkKIAkJZ290byBlcnJvcjsKIAogCS8qIEluaXQgdGhlIEJEcywgaWYgbmVlZGVkICovCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogZXJyb3I6CiAJaWYgKHRzaykgewotCQlpZiAodHNrLT5pcnEgIT0gTk9fSVJRKQorCQlpZiAodHNrLT5pcnEpCiAJCQlpcnFfZGlzcG9zZV9tYXBwaW5nKHRzay0+aXJxKTsKIAkJYmNvbV9zcmFtX2ZyZWUodHNrLT5iZCk7CiAJCWtmcmVlKHRzay0+Y29va2llKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2NvaDkwMTMxOC5jIGIvZHJpdmVycy9kbWEvY29oOTAxMzE4LmMKaW5kZXggZTRhY2Q2My4uNzQ3OTRjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvY29oOTAxMzE4LmMKKysrIGIvZHJpdmVycy9kbWEvY29oOTAxMzE4LmMKQEAgLTEzMTksMTAgKzEzMTksMTAgQEAKIAlpbnQgaSA9IDA7CiAKIAl3aGlsZSAobCkgewotCQlkZXZfdmRiZyhDT0hDXzJfREVWKGNvaGMpLCAiaSAlZCwgbGxpICVwLCBjdHJsIDB4JXgsIHNyYyAweCV4IgotCQkJICIsIGRzdCAweCV4LCBsaW5rIDB4JXggdmlydF9saW5rX2FkZHIgMHglcFxuIiwKLQkJCSBpLCBsLCBsLT5jb250cm9sLCBsLT5zcmNfYWRkciwgbC0+ZHN0X2FkZHIsCi0JCQkgbC0+bGlua19hZGRyLCBsLT52aXJ0X2xpbmtfYWRkcik7CisJCWRldl92ZGJnKENPSENfMl9ERVYoY29oYyksICJpICVkLCBsbGkgJXAsIGN0cmwgMHgleCwgc3JjIDB4JXBhZCIKKwkJCSAiLCBkc3QgMHglcGFkLCBsaW5rIDB4JXBhZCB2aXJ0X2xpbmtfYWRkciAweCVwXG4iLAorCQkJIGksIGwsIGwtPmNvbnRyb2wsICZsLT5zcmNfYWRkciwgJmwtPmRzdF9hZGRyLAorCQkJICZsLT5saW5rX2FkZHIsIGwtPnZpcnRfbGlua19hZGRyKTsKIAkJaSsrOwogCQlsID0gbC0+dmlydF9saW5rX2FkZHI7CiAJfQpAQCAtMTMzNSw3ICsxMzM1LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY29oOTAxMzE4X2Jhc2UgKmRlYnVnZnNfZG1hX2Jhc2U7CiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZG1hX2RlbnRyeTsKIAotc3RhdGljIGludCBjb2g5MDEzMThfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorc3RhdGljIHNzaXplX3QgY29oOTAxMzE4X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpmX3BvcykKIHsKIAl1NjQgc3RhcnRlZF9jaGFubmVscyA9IGRlYnVnZnNfZG1hX2Jhc2UtPnBtLnN0YXJ0ZWRfY2hhbm5lbHM7CkBAIC0xMzUyLDkgKzEzNTIsMTAgQEAKIAogCXRtcCArPSBzcHJpbnRmKHRtcCwgIkRNQSAtLSBlbmFibGVkIGRtYSBjaGFubmVsc1xuIik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgVTMwMF9ETUFfQ0hBTk5FTFM7IGkrKykKLQkJaWYgKHN0YXJ0ZWRfY2hhbm5lbHMgJiAoMSA8PCBpKSkKKwlmb3IgKGkgPSAwOyBpIDwgVTMwMF9ETUFfQ0hBTk5FTFM7IGkrKykgeworCQlpZiAoc3RhcnRlZF9jaGFubmVscyAmICgxVUxMIDw8IGkpKQogCQkJdG1wICs9IHNwcmludGYodG1wLCAiY2hhbm5lbCAlZFxuIiwgaSk7CisJfQogCiAJdG1wICs9IHNwcmludGYodG1wLCAiUG9vbCBhbGxvYyBuYnIgJWRcbiIsIHBvb2xfY291bnQpOwogCkBAIC0xNTUzLDE1ICsxNTU0LDggQEAKIHN0YXRpYyBzdHJ1Y3QgY29oOTAxMzE4X2Rlc2MgKgogY29oOTAxMzE4X2ZpcnN0X2FjdGl2ZV9nZXQoc3RydWN0IGNvaDkwMTMxOF9jaGFuICpjb2hjKQogewotCXN0cnVjdCBjb2g5MDEzMThfZGVzYyAqZDsKLQotCWlmIChsaXN0X2VtcHR5KCZjb2hjLT5hY3RpdmUpKQotCQlyZXR1cm4gTlVMTDsKLQotCWQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjb2hjLT5hY3RpdmUsCi0JCQkgICAgIHN0cnVjdCBjb2g5MDEzMThfZGVzYywKLQkJCSAgICAgbm9kZSk7Ci0JcmV0dXJuIGQ7CisJcmV0dXJuIGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmY29oYy0+YWN0aXZlLCBzdHJ1Y3QgY29oOTAxMzE4X2Rlc2MsCisJCQkJCW5vZGUpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTU3OSwxNSArMTU3Myw4IEBACiBzdGF0aWMgc3RydWN0IGNvaDkwMTMxOF9kZXNjICoKIGNvaDkwMTMxOF9maXJzdF9xdWV1ZWQoc3RydWN0IGNvaDkwMTMxOF9jaGFuICpjb2hjKQogewotCXN0cnVjdCBjb2g5MDEzMThfZGVzYyAqZDsKLQotCWlmIChsaXN0X2VtcHR5KCZjb2hjLT5xdWV1ZSkpCi0JCXJldHVybiBOVUxMOwotCi0JZCA9IGxpc3RfZmlyc3RfZW50cnkoJmNvaGMtPnF1ZXVlLAotCQkJICAgICBzdHJ1Y3QgY29oOTAxMzE4X2Rlc2MsCi0JCQkgICAgIG5vZGUpOwotCXJldHVybiBkOworCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmNvaGMtPnF1ZXVlLCBzdHJ1Y3QgY29oOTAxMzE4X2Rlc2MsCisJCQkJCW5vZGUpOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBjb2g5MDEzMThfZ2V0X2J5dGVzX2luX2xsaShzdHJ1Y3QgY29oOTAxMzE4X2xsaSAqaW5fbGxpKQpAQCAtMTc2Niw3ICsxNzUzLDcgQEAKIAogYm9vbCBjb2g5MDEzMThfZmlsdGVyX2lkKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqY2hhbl9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgY2hfbnIgPSAodW5zaWduZWQgaW50KSBjaGFuX2lkOworCXVuc2lnbmVkIGxvbmcgY2hfbnIgPSAodW5zaWduZWQgbG9uZykgY2hhbl9pZDsKIAogCWlmIChjaF9uciA9PSB0b19jb2g5MDEzMThfY2hhbihjaGFuKS0+aWQpCiAJCXJldHVybiB0cnVlOwpAQCAtMTg4OCw4ICsxODc1LDcgQEAKIAlzdHJ1Y3QgY29oOTAxMzE4X2NoYW4gKmNvaGMgPSAoc3RydWN0IGNvaDkwMTMxOF9jaGFuICopIGRhdGE7CiAJc3RydWN0IGNvaDkwMTMxOF9kZXNjICpjb2hkX2ZpbjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjazsKLQl2b2lkICpjYWxsYmFja19wYXJhbTsKKwlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgY2I7CiAKIAlkZXZfdmRiZyhDT0hDXzJfREVWKGNvaGMpLCAiWyVzXSBjaGFuX2lkICVkIgogCQkgIiBuYnJfYWN0aXZlX2RvbmUgJWxkXG4iLCBfX2Z1bmNfXywKQEAgLTE5MDQsOCArMTg5MCw3IEBACiAJCWdvdG8gZXJyOwogCiAJLyogbG9jYXRlIGNhbGxiYWNrIHRvIGNsaWVudCAqLwotCWNhbGxiYWNrID0gY29oZF9maW4tPmRlc2MuY2FsbGJhY2s7Ci0JY2FsbGJhY2tfcGFyYW0gPSBjb2hkX2Zpbi0+ZGVzYy5jYWxsYmFja19wYXJhbTsKKwlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmNvaGRfZmluLT5kZXNjLCAmY2IpOwogCiAJLyogc2lnbiB0aGlzIGpvYiBhcyBjb21wbGV0ZWQgb24gdGhlIGNoYW5uZWwgKi8KIAlkbWFfY29va2llX2NvbXBsZXRlKCZjb2hkX2Zpbi0+ZGVzYyk7CkBAIC0xOTIwLDggKzE5MDUsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvaGMtPmxvY2ssIGZsYWdzKTsKIAogCS8qIENhbGwgdGhlIGNhbGxiYWNrIHdoZW4gd2UncmUgZG9uZSAqLwotCWlmIChjYWxsYmFjaykKLQkJY2FsbGJhY2soY2FsbGJhY2tfcGFyYW0pOworCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvaGMtPmxvY2ssIGZsYWdzKTsKIApAQCAtMjI0Nyw4ICsyMjMxLDggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY29oYy0+bG9jaywgZmxnKTsKIAogCWRldl92ZGJnKENPSENfMl9ERVYoY29oYyksCi0JCSAiWyVzXSBjaGFubmVsICVkIHNyYyAweCV4IGRlc3QgMHgleCBzaXplICVkXG4iLAotCQkgX19mdW5jX18sIGNvaGMtPmlkLCBzcmMsIGRlc3QsIHNpemUpOworCQkgIlslc10gY2hhbm5lbCAlZCBzcmMgMHglcGFkIGRlc3QgMHglcGFkIHNpemUgJXp1XG4iLAorCQkgX19mdW5jX18sIGNvaGMtPmlkLCAmc3JjLCAmZGVzdCwgc2l6ZSk7CiAKIAlpZiAoZmxhZ3MgJiBETUFfUFJFUF9JTlRFUlJVUFQpCiAJCS8qIFRyaWdnZXIgaW50ZXJydXB0IGFmdGVyIGxhc3QgbGxpICovCkBAIC0yNzQ0LDggKzI3MjgsOCBAQAogCQlnb3RvIGVycl9yZWdpc3Rlcl9vZl9kbWE7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBiYXNlKTsKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiSW5pdGlhbGl6ZWQgQ09IOTAxMzE4IERNQSBvbiB2aXJ0dWFsIGJhc2UgMHglMDh4XG4iLAotCQkodTMyKSBiYXNlLT52aXJ0YmFzZSk7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkluaXRpYWxpemVkIENPSDkwMTMxOCBETUEgb24gdmlydHVhbCBiYXNlIDB4JXBcbiIsCisJCWJhc2UtPnZpcnRiYXNlKTsKIAogCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2NvaDkwMTMxOF9sbGkuYyBiL2RyaXZlcnMvZG1hL2NvaDkwMTMxOF9sbGkuYwppbmRleCA3MDIxMTJkLi5kNjEyYjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9jb2g5MDEzMThfbGxpLmMKKysrIGIvZHJpdmVycy9kbWEvY29oOTAxMzE4X2xsaS5jCkBAIC03NSw3ICs3NSw3IEBACiAJbGxpID0gaGVhZDsKIAlsbGktPnBoeV90aGlzID0gcGh5OwogCWxsaS0+bGlua19hZGRyID0gMHgwMDAwMDAwMDsKLQlsbGktPnZpcnRfbGlua19hZGRyID0gMHgwMDAwMDAwMFU7CisJbGxpLT52aXJ0X2xpbmtfYWRkciA9IE5VTEw7CiAKIAlmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKIAkJbGxpX3ByZXYgPSBsbGk7CkBAIC04OCw3ICs4OCw3IEBACiAJCURFQlVHRlNfUE9PTF9DT1VOVEVSX0FERChwb29sLCAxKTsKIAkJbGxpLT5waHlfdGhpcyA9IHBoeTsKIAkJbGxpLT5saW5rX2FkZHIgPSAweDAwMDAwMDAwOwotCQlsbGktPnZpcnRfbGlua19hZGRyID0gMHgwMDAwMDAwMFU7CisJCWxsaS0+dmlydF9saW5rX2FkZHIgPSBOVUxMOwogCiAJCWxsaV9wcmV2LT5saW5rX2FkZHIgPSBwaHk7CiAJCWxsaV9wcmV2LT52aXJ0X2xpbmtfYWRkciA9IGxsaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2NwcGk0MS5jIGIvZHJpdmVycy9kbWEvY3BwaTQxLmMKaW5kZXggNGIyMzE3NC4uYmFjNWYwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvY3BwaTQxLmMKKysrIGIvZHJpdmVycy9kbWEvY3BwaTQxLmMKQEAgLTEwOCw2ICsxMDgsOCBAQAogCXVuc2lnbmVkIHRkX3F1ZXVlZDoxOwogCXVuc2lnbmVkIHRkX3NlZW46MTsKIAl1bnNpZ25lZCB0ZF9kZXNjX3NlZW46MTsKKworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsJCS8qIE5vZGUgZm9yIHBlbmRpbmcgbGlzdCAqLwogfTsKIAogc3RydWN0IGNwcGk0MV9kZXNjIHsKQEAgLTE0Niw2ICsxNDgsOSBAQAogCWNvbnN0IHN0cnVjdCBjaGFuX3F1ZXVlcyAqcXVldWVzX3R4OwogCXN0cnVjdCBjaGFuX3F1ZXVlcyB0ZF9xdWV1ZTsKIAorCXN0cnVjdCBsaXN0X2hlYWQgcGVuZGluZzsJLyogUGVuZGluZyBxdWV1ZWQgdHJhbnNmZXJzICovCisJc3BpbmxvY2tfdCBsb2NrOwkJLyogTG9jayBmb3IgcGVuZGluZyBsaXN0ICovCisKIAkvKiBjb250ZXh0IGZvciBzdXNwZW5kL3Jlc3VtZSAqLwogCXVuc2lnbmVkIGludCBkbWFfdGRmZHE7CiB9OwpAQCAtMzMxLDcgKzMzNiwxMSBAQAogCiAJCQljLT5yZXNpZHVlID0gcGRfdHJhbnNfbGVuKGMtPmRlc2MtPnBkNikgLSBsZW47CiAJCQlkbWFfY29va2llX2NvbXBsZXRlKCZjLT50eGQpOwotCQkJYy0+dHhkLmNhbGxiYWNrKGMtPnR4ZC5jYWxsYmFja19wYXJhbSk7CisJCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKCZjLT50eGQsIE5VTEwpOworCisJCQkvKiBQYWlyZWQgd2l0aCBjcHBpNDFfZG1hX2lzc3VlX3BlbmRpbmcgKi8KKwkJCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koY2RkLT5kZGV2LmRldik7CisJCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChjZGQtPmRkZXYuZGV2KTsKIAkJfQogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0zNDksNiArMzU4LDEyIEBACiBzdGF0aWMgaW50IGNwcGk0MV9kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCXN0cnVjdCBjcHBpNDFfY2hhbm5lbCAqYyA9IHRvX2NwcDQxX2NoYW4oY2hhbik7CisJc3RydWN0IGNwcGk0MV9kZCAqY2RkID0gYy0+Y2RkOworCWludCBlcnJvcjsKKworCWVycm9yID0gcG1fcnVudGltZV9nZXRfc3luYyhjZGQtPmRkZXYuZGV2KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CiAKIAlkbWFfY29va2llX2luaXQoY2hhbik7CiAJZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3JfaW5pdCgmYy0+dHhkLCBjaGFuKTsKQEAgLTM1NywxMSArMzcyLDI2IEBACiAJaWYgKCFjLT5pc190eCkKIAkJY3BwaV93cml0ZWwoYy0+cV9udW0sIGMtPmdjcl9yZWcgKyBSWEhQQ1JBMCk7CiAKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGNkZC0+ZGRldi5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGNkZC0+ZGRldi5kZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNwcGk0MV9kbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCiB7CisJc3RydWN0IGNwcGk0MV9jaGFubmVsICpjID0gdG9fY3BwNDFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgY3BwaTQxX2RkICpjZGQgPSBjLT5jZGQ7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBwbV9ydW50aW1lX2dldF9zeW5jKGNkZC0+ZGRldi5kZXYpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybjsKKworCVdBUk5fT04oIWxpc3RfZW1wdHkoJmNkZC0+cGVuZGluZykpOworCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShjZGQtPmRkZXYuZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChjZGQtPmRkZXYuZGV2KTsKIH0KIAogc3RhdGljIGVudW0gZG1hX3N0YXR1cyBjcHBpNDFfZG1hX3R4X3N0YXR1cyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCkBAIC0zODYsMjEgKzQxNiw2IEBACiAJdTMyIGRlc2NfcGh5czsKIAl1MzIgcmVnOwogCi0JZGVzY19waHlzID0gbG93ZXJfMzJfYml0cyhjLT5kZXNjX3BoeXMpOwotCWRlc2NfbnVtID0gKGRlc2NfcGh5cyAtIGNkZC0+ZGVzY3NfcGh5cykgLyBzaXplb2Yoc3RydWN0IGNwcGk0MV9kZXNjKTsKLQlXQVJOX09OKGNkZC0+Y2hhbl9idXN5W2Rlc2NfbnVtXSk7Ci0JY2RkLT5jaGFuX2J1c3lbZGVzY19udW1dID0gYzsKLQotCXJlZyA9IChzaXplb2Yoc3RydWN0IGNwcGk0MV9kZXNjKSAtIDI0KSAvIDQ7Ci0JcmVnIHw9IGRlc2NfcGh5czsKLQljcHBpX3dyaXRlbChyZWcsIGNkZC0+cW1ncl9tZW0gKyBRTUdSX1FVRVVFX0QoYy0+cV9udW0pKTsKLX0KLQotc3RhdGljIHZvaWQgY3BwaTQxX2RtYV9pc3N1ZV9wZW5kaW5nKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKLXsKLQlzdHJ1Y3QgY3BwaTQxX2NoYW5uZWwgKmMgPSB0b19jcHA0MV9jaGFuKGNoYW4pOwotCXUzMiByZWc7Ci0KIAljLT5yZXNpZHVlID0gMDsKIAogCXJlZyA9IEdDUl9DSEFOX0VOQUJMRTsKQEAgLTQxOCw3ICs0MzMsNDYgQEAKIAkgKiBiZWZvcmUgc3RhcnRpbmcgdGhlIGRtYSBlbmdpbmUuCiAJICovCiAJX19pb3dtYigpOwotCXB1c2hfZGVzY19xdWV1ZShjKTsKKworCWRlc2NfcGh5cyA9IGxvd2VyXzMyX2JpdHMoYy0+ZGVzY19waHlzKTsKKwlkZXNjX251bSA9IChkZXNjX3BoeXMgLSBjZGQtPmRlc2NzX3BoeXMpIC8gc2l6ZW9mKHN0cnVjdCBjcHBpNDFfZGVzYyk7CisJV0FSTl9PTihjZGQtPmNoYW5fYnVzeVtkZXNjX251bV0pOworCWNkZC0+Y2hhbl9idXN5W2Rlc2NfbnVtXSA9IGM7CisKKwlyZWcgPSAoc2l6ZW9mKHN0cnVjdCBjcHBpNDFfZGVzYykgLSAyNCkgLyA0OworCXJlZyB8PSBkZXNjX3BoeXM7CisJY3BwaV93cml0ZWwocmVnLCBjZGQtPnFtZ3JfbWVtICsgUU1HUl9RVUVVRV9EKGMtPnFfbnVtKSk7Cit9CisKK3N0YXRpYyB2b2lkIHBlbmRpbmdfZGVzYyhzdHJ1Y3QgY3BwaTQxX2NoYW5uZWwgKmMpCit7CisJc3RydWN0IGNwcGk0MV9kZCAqY2RkID0gYy0+Y2RkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2RkLT5sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmYy0+bm9kZSwgJmNkZC0+cGVuZGluZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2RkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGNwcGk0MV9kbWFfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGNwcGk0MV9jaGFubmVsICpjID0gdG9fY3BwNDFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgY3BwaTQxX2RkICpjZGQgPSBjLT5jZGQ7CisJaW50IGVycm9yOworCisJLyogUE0gcnVudGltZSBwYWlyZWQgd2l0aCBkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlICovCisJZXJyb3IgPSBwbV9ydW50aW1lX2dldChjZGQtPmRkZXYuZGV2KTsKKwlpZiAoKGVycm9yICE9IC1FSU5QUk9HUkVTUykgJiYgZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoY2RkLT5kZGV2LmRldiwgIkZhaWxlZCB0byBwbV9ydW50aW1lX2dldDogJWlcbiIsCisJCQllcnJvcik7CisKKwkJcmV0dXJuOworCX0KKworCWlmIChsaWtlbHkocG1fcnVudGltZV9hY3RpdmUoY2RkLT5kZGV2LmRldikpKQorCQlwdXNoX2Rlc2NfcXVldWUoYyk7CisJZWxzZQorCQlwZW5kaW5nX2Rlc2MoYyk7CiB9CiAKIHN0YXRpYyB1MzIgZ2V0X2hvc3RfcGQwKHUzMiBsZW5ndGgpCkBAIC05NDAsMTIgKzk5NCwxOCBAQAogCWNkZC0+Y3RybF9tZW0gPSBvZl9pb21hcChkZXYtPm9mX25vZGUsIDEpOwogCWNkZC0+c2NoZWRfbWVtID0gb2ZfaW9tYXAoZGV2LT5vZl9ub2RlLCAyKTsKIAljZGQtPnFtZ3JfbWVtID0gb2ZfaW9tYXAoZGV2LT5vZl9ub2RlLCAzKTsKKwlzcGluX2xvY2tfaW5pdCgmY2RkLT5sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmY2RkLT5wZW5kaW5nKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNkZCk7CiAKIAlpZiAoIWNkZC0+dXNic3NfbWVtIHx8ICFjZGQtPmN0cmxfbWVtIHx8ICFjZGQtPnNjaGVkX21lbSB8fAogCQkJIWNkZC0+cW1ncl9tZW0pCiAJCXJldHVybiAtRU5YSU87CiAKIAlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KGRldiwgMTAwKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChkZXYpOwogCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfZ2V0X3N5bmM7CkBAIC05ODUsNyArMTA0NSw5IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfb2Y7CiAKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjZGQpOworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChkZXYpOworCiAJcmV0dXJuIDA7CiBlcnJfb2Y6CiAJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZjZGQtPmRkZXYpOwpAQCAtOTk2LDcgKzEwNTgsOCBAQAogZXJyX2NoYW5zOgogCWRlaW5pdF9jcHBpNDEoZGV2LCBjZGQpOwogZXJyX2luaXRfY3BwaToKLQlwbV9ydW50aW1lX3B1dChkZXYpOworCXBtX3J1bnRpbWVfZG9udF91c2VfYXV0b3N1c3BlbmQoZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGRldik7CiBlcnJfZ2V0X3N5bmM6CiAJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CiAJaW91bm1hcChjZGQtPnVzYnNzX21lbSk7CkBAIC0xMDIxLDEzICsxMDg0LDEzIEBACiAJaW91bm1hcChjZGQtPmN0cmxfbWVtKTsKIAlpb3VubWFwKGNkZC0+c2NoZWRfbWVtKTsKIAlpb3VubWFwKGNkZC0+cW1ncl9tZW0pOwotCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfZG9udF91c2VfYXV0b3N1c3BlbmQoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgY3BwaTQxX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBfX21heWJlX3VudXNlZCBjcHBpNDFfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGNwcGk0MV9kZCAqY2RkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKQEAgLTEwMzgsNyArMTEwMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY3BwaTQxX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGNwcGk0MV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBjcHBpNDFfZGQgKmNkZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBjcHBpNDFfY2hhbm5lbCAqYzsKQEAgLTEwNjIsOSArMTEyNSwzOCBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAotc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGNwcGk0MV9wbV9vcHMsIGNwcGk0MV9zdXNwZW5kLCBjcHBpNDFfcmVzdW1lKTsKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgY3BwaTQxX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwcGk0MV9kZCAqY2RkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlXQVJOX09OKCFsaXN0X2VtcHR5KCZjZGQtPnBlbmRpbmcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGNwcGk0MV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNwcGk0MV9kZCAqY2RkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGNwcGk0MV9jaGFubmVsICpjLCAqX2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjZGQtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYywgX2MsICZjZGQtPnBlbmRpbmcsIG5vZGUpIHsKKwkJcHVzaF9kZXNjX3F1ZXVlKGMpOworCQlsaXN0X2RlbCgmYy0+bm9kZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNkZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBjcHBpNDFfcG1fb3BzID0geworCVNFVF9MQVRFX1NZU1RFTV9TTEVFUF9QTV9PUFMoY3BwaTQxX3N1c3BlbmQsIGNwcGk0MV9yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKGNwcGk0MV9ydW50aW1lX3N1c3BlbmQsCisJCQkgICBjcHBpNDFfcnVudGltZV9yZXN1bWUsCisJCQkgICBOVUxMKQorfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY3BwNDFfZG1hX2RyaXZlciA9IHsKIAkucHJvYmUgID0gY3BwaTQxX2RtYV9wcm9iZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2RtYS1qejQ3NDAuYyBiL2RyaXZlcnMvZG1hL2RtYS1qejQ3NDAuYwppbmRleCA5Njg5YjM2Li5kNTAyNzNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kbWEtano0NzQwLmMKKysrIGIvZHJpdmVycy9kbWEvZG1hLWp6NDc0MC5jCkBAIC0yMSw4ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAKLSNpbmNsdWRlIDxhc20vbWFjaC1qejQ3NDAvZG1hLmg+Ci0KICNpbmNsdWRlICJ2aXJ0LWRtYS5oIgogCiAjZGVmaW5lIEpaX0RNQV9OUl9DSEFOUyA2CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kbWEtano0NzgwLmMgYi9kcml2ZXJzL2RtYS9kbWEtano0NzgwLmMKaW5kZXggZGFkZTdjNC4uNzM3M2I3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZG1hLWp6NDc4MC5jCisrKyBiL2RyaXZlcnMvZG1hL2RtYS1qejQ3ODAuYwpAQCAtMzI0LDggKzMyNCwxMCBAQAogCQkJCQkgICAgICBzZ19kbWFfYWRkcmVzcygmc2dsW2ldKSwKIAkJCQkJICAgICAgc2dfZG1hX2xlbigmc2dsW2ldKSwKIAkJCQkJICAgICAgZGlyZWN0aW9uKTsKLQkJaWYgKGVyciA8IDApCisJCWlmIChlcnIgPCAwKSB7CisJCQlqejQ3ODBfZG1hX2Rlc2NfZnJlZSgmanpjaGFuLT5kZXNjLT52ZGVzYyk7CiAJCQlyZXR1cm4gTlVMTDsKKwkJfQogCiAJCWRlc2MtPmRlc2NbaV0uZGNtIHw9IEpaX0RNQV9EQ01fVElFOwogCkBAIC0zNjgsOCArMzcwLDEwIEBACiAJZm9yIChpID0gMDsgaSA8IHBlcmlvZHM7IGkrKykgewogCQllcnIgPSBqejQ3ODBfZG1hX3NldHVwX2h3ZGVzYyhqemNoYW4sICZkZXNjLT5kZXNjW2ldLCBidWZfYWRkciwKIAkJCQkJICAgICAgcGVyaW9kX2xlbiwgZGlyZWN0aW9uKTsKLQkJaWYgKGVyciA8IDApCisJCWlmIChlcnIgPCAwKSB7CisJCQlqejQ3ODBfZG1hX2Rlc2NfZnJlZSgmanpjaGFuLT5kZXNjLT52ZGVzYyk7CiAJCQlyZXR1cm4gTlVMTDsKKwkJfQogCiAJCWJ1Zl9hZGRyICs9IHBlcmlvZF9sZW47CiAKQEAgLTM5Niw3ICs0MDAsNyBAQAogCXJldHVybiB2Y2hhbl90eF9wcmVwKCZqemNoYW4tPnZjaGFuLCAmZGVzYy0+dmRlc2MsIGZsYWdzKTsKIH0KIAotc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpqejQ3ODBfZG1hX3ByZXBfZG1hX21lbWNweSgKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmp6NDc4MF9kbWFfcHJlcF9kbWFfbWVtY3B5KAogCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkZXN0LCBkbWFfYWRkcl90IHNyYywKIAlzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwppbmRleCA4YzlmNDVmLi42YjUzNTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYworKysgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwpAQCAtOTk3LDYgKzk5NywxMyBAQAogCQl9CiAJCWNoYW4tPmNsaWVudF9jb3VudCA9IDA7CiAJfQorCisJaWYgKCFjaGFuY250KSB7CisJCWRldl9lcnIoZGV2aWNlLT5kZXYsICIlczogZGV2aWNlIGhhcyBubyBjaGFubmVscyFcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXQ7CisJfQorCiAJZGV2aWNlLT5jaGFuY250ID0gY2hhbmNudDsKIAogCW11dGV4X2xvY2soJmRtYV9saXN0X211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2RtYWVuZ2luZS5oIGIvZHJpdmVycy9kbWEvZG1hZW5naW5lLmgKaW5kZXggMTdmOTgzYS4uODgyZmY5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZG1hZW5naW5lLmgKKysrIGIvZHJpdmVycy9kbWEvZG1hZW5naW5lLmgKQEAgLTg2LDQgKzg2LDg4IEBACiAJCXN0YXRlLT5yZXNpZHVlID0gcmVzaWR1ZTsKIH0KIAorc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrIHsKKwlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2s7CisJZG1hX2FzeW5jX3R4X2NhbGxiYWNrX3Jlc3VsdCBjYWxsYmFja19yZXN1bHQ7CisJdm9pZCAqY2FsbGJhY2tfcGFyYW07Cit9OworCisvKioKKyAqIGRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjayAtIGdldCB0aGUgcGFzc2VkIGluIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAdHg6IHR4IGRlc2NyaXB0b3IKKyAqIEBjYjogdGVtcCBzdHJ1Y3QgdG8gaG9sZCB0aGUgY2FsbGJhY2sgaW5mbworICoKKyAqIEZpbGwgdGhlIHBhc3NlZCBpbiBjYiBzdHJ1Y3Qgd2l0aCB3aGF0J3MgYXZhaWxhYmxlIGluIHRoZSBwYXNzZWQgaW4KKyAqIHR4IGRlc2NyaXB0b3Igc3RydWN0CisgKiBObyBsb2NraW5nIGlzIHJlcXVpcmVkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjayhzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4LAorCQkJICAgIHN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayAqY2IpCit7CisJY2ItPmNhbGxiYWNrID0gdHgtPmNhbGxiYWNrOworCWNiLT5jYWxsYmFja19yZXN1bHQgPSB0eC0+Y2FsbGJhY2tfcmVzdWx0OworCWNiLT5jYWxsYmFja19wYXJhbSA9IHR4LT5jYWxsYmFja19wYXJhbTsKK30KKworLyoqCisgKiBkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UgLSBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpbiBjYiBzdHJ1Y3QKKyAqIEBjYjogdGVtcCBzdHJ1Y3QgdGhhdCBpcyBob2xkaW5nIHRoZSBjYWxsYmFjayBpbmZvCisgKiBAcmVzdWx0OiB0cmFuc2FjdGlvbiByZXN1bHQKKyAqCisgKiBDYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRlZCBpbiB0aGUgY2Igc3RydWN0IHdpdGggdGhlIHBhcmFtZXRlcgorICogaW4gdGhlIGNiIHN0cnVjdC4KKyAqIExvY2tpbmcgaXMgZGVwZW5kZW50IG9uIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKHN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayAqY2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGRtYWVuZ2luZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgZG1hZW5naW5lX3Jlc3VsdCBkdW1teV9yZXN1bHQgPSB7CisJCS5yZXN1bHQgPSBETUFfVFJBTlNfTk9FUlJPUiwKKwkJLnJlc2lkdWUgPSAwCisJfTsKKworCWlmIChjYi0+Y2FsbGJhY2tfcmVzdWx0KSB7CisJCWlmICghcmVzdWx0KQorCQkJcmVzdWx0ID0gJmR1bW15X3Jlc3VsdDsKKwkJY2ItPmNhbGxiYWNrX3Jlc3VsdChjYi0+Y2FsbGJhY2tfcGFyYW0sIHJlc3VsdCk7CisJfSBlbHNlIGlmIChjYi0+Y2FsbGJhY2spIHsKKwkJY2ItPmNhbGxiYWNrKGNiLT5jYWxsYmFja19wYXJhbSk7CisJfQorfQorCisvKioKKyAqIGRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UgLSBnZXQgdGhlIGNhbGxiYWNrIGluIHR4IGRlc2NyaXB0b3IgYW5kCisgKiAJCQkJCXRoZW4gaW1tZWRpYXRlbHkgY2FsbCB0aGUgY2FsbGJhY2suCisgKiBAdHg6IGRtYSBhc3luYyB0eCBkZXNjcmlwdG9yCisgKiBAcmVzdWx0OiB0cmFuc2FjdGlvbiByZXN1bHQKKyAqCisgKiBDYWxsIGRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjaygpIGFuZCBkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoKQorICogaW4gYSBzaW5nbGUgZnVuY3Rpb24gc2luY2Ugbm8gd29yayBpcyBuZWNlc3NhcnkgaW4gYmV0d2VlbiBmb3IgdGhlIGRyaXZlci4KKyAqIExvY2tpbmcgaXMgZGVwZW5kZW50IG9uIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZShzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBkbWFlbmdpbmVfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrIGNiOworCisJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKHR4LCAmY2IpOworCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIHJlc3VsdCk7Cit9CisKKy8qKgorICogZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfdmFsaWQgLSB2ZXJpZnkgdGhlIGNhbGxiYWNrIGlzIHZhbGlkIGluIGNiCisgKiBAY2I6IGNhbGxiYWNrIGluZm8gc3RydWN0CisgKgorICogUmV0dXJuIGEgYm9vbCB0aGF0IHZlcmlmaWVzIHdoZXRoZXIgY2FsbGJhY2sgaW4gY2IgaXMgdmFsaWQgb3Igbm90LgorICogTm8gbG9ja2luZyBpcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGlubGluZSBib29sCitkbWFlbmdpbmVfZGVzY19jYWxsYmFja192YWxpZChzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgKmNiKQoreworCXJldHVybiAoY2ItPmNhbGxiYWNrKSA/IHRydWUgOiBmYWxzZTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMgYi9kcml2ZXJzL2RtYS9kbWF0ZXN0LmMKaW5kZXggMTI0NWRiNS4uY2Y3NmZjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZG1hdGVzdC5jCisrKyBiL2RyaXZlcnMvZG1hL2RtYXRlc3QuYwpAQCAtNTYsMTAgKzU2LDEwIEBACiBNT0RVTEVfUEFSTV9ERVNDKHNnX2J1ZmZlcnMsCiAJCSJOdW1iZXIgb2Ygc2NhdHRlciBnYXRoZXIgYnVmZmVycyAoZGVmYXVsdDogMSkiKTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBkbWF0ZXN0ID0gMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZG1hdGVzdDsKIG1vZHVsZV9wYXJhbShkbWF0ZXN0LCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGRtYXRlc3QsCi0JCSJkbWF0ZXN0IDAtbWVtY3B5IDEtc2xhdmVfc2cgKGRlZmF1bHQ6IDEpIik7CisJCSJkbWF0ZXN0IDAtbWVtY3B5IDEtc2xhdmVfc2cgKGRlZmF1bHQ6IDApIik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgeG9yX3NvdXJjZXMgPSAzOwogbW9kdWxlX3BhcmFtKHhvcl9zb3VyY2VzLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CkBAIC00MjYsNyArNDI2LDkgQEAKIAlpbnQJCQlzcmNfY250OwogCWludAkJCWRzdF9jbnQ7CiAJaW50CQkJaTsKLQlrdGltZV90CQkJa3RpbWU7CisJa3RpbWVfdAkJCWt0aW1lLCBzdGFydCwgZGlmZjsKKwlrdGltZV90CQkJZmlsbHRpbWUgPSBrdGltZV9zZXQoMCwgMCk7CisJa3RpbWVfdAkJCWNvbXBhcmV0aW1lID0ga3RpbWVfc2V0KDAsIDApOwogCXM2NAkJCXJ1bnRpbWUgPSAwOwogCXVuc2lnbmVkIGxvbmcgbG9uZwl0b3RhbF9sZW4gPSAwOwogCkBAIC01MDMsNyArNTA1LDcgQEAKIAkJdG90YWxfdGVzdHMrKzsKIAogCQkvKiBob25vciBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zICovCi0JCWlmICh0aHJlYWQtPnR5cGUgPT0gRE1BX01FTUNQWSkKKwkJaWYgKHRocmVhZC0+dHlwZSA9PSBETUFfTUVNQ1BZIHx8IHRocmVhZC0+dHlwZSA9PSBETUFfU0cpCiAJCQlhbGlnbiA9IGRldi0+Y29weV9hbGlnbjsKIAkJZWxzZSBpZiAodGhyZWFkLT50eXBlID09IERNQV9YT1IpCiAJCQlhbGlnbiA9IGRldi0+eG9yX2FsaWduOwpAQCAtNTMxLDYgKzUzMyw3IEBACiAJCQlzcmNfb2ZmID0gMDsKIAkJCWRzdF9vZmYgPSAwOwogCQl9IGVsc2UgeworCQkJc3RhcnQgPSBrdGltZV9nZXQoKTsKIAkJCXNyY19vZmYgPSBkbWF0ZXN0X3JhbmRvbSgpICUgKHBhcmFtcy0+YnVmX3NpemUgLSBsZW4gKyAxKTsKIAkJCWRzdF9vZmYgPSBkbWF0ZXN0X3JhbmRvbSgpICUgKHBhcmFtcy0+YnVmX3NpemUgLSBsZW4gKyAxKTsKIApAQCAtNTQxLDYgKzU0NCw5IEBACiAJCQkJCSAgcGFyYW1zLT5idWZfc2l6ZSk7CiAJCQlkbWF0ZXN0X2luaXRfZHN0cyh0aHJlYWQtPmRzdHMsIGRzdF9vZmYsIGxlbiwKIAkJCQkJICBwYXJhbXMtPmJ1Zl9zaXplKTsKKworCQkJZGlmZiA9IGt0aW1lX3N1YihrdGltZV9nZXQoKSwgc3RhcnQpOworCQkJZmlsbHRpbWUgPSBrdGltZV9hZGQoZmlsbHRpbWUsIGRpZmYpOwogCQl9CiAKIAkJdW0gPSBkbWFlbmdpbmVfZ2V0X3VubWFwX2RhdGEoZGV2LT5kZXYsIHNyY19jbnQrZHN0X2NudCwKQEAgLTY4Myw2ICs2ODksNyBAQAogCQkJY29udGludWU7CiAJCX0KIAorCQlzdGFydCA9IGt0aW1lX2dldCgpOwogCQlwcl9kZWJ1ZygiJXM6IHZlcmlmeWluZyBzb3VyY2UgYnVmZmVyLi4uXG4iLCBjdXJyZW50LT5jb21tKTsKIAkJZXJyb3JfY291bnQgPSBkbWF0ZXN0X3ZlcmlmeSh0aHJlYWQtPnNyY3MsIDAsIHNyY19vZmYsCiAJCQkJMCwgUEFUVEVSTl9TUkMsIHRydWUpOwpAQCAtNzAzLDYgKzcxMCw5IEBACiAJCQkJcGFyYW1zLT5idWZfc2l6ZSwgZHN0X29mZiArIGxlbiwKIAkJCQlQQVRURVJOX0RTVCwgZmFsc2UpOwogCisJCWRpZmYgPSBrdGltZV9zdWIoa3RpbWVfZ2V0KCksIHN0YXJ0KTsKKwkJY29tcGFyZXRpbWUgPSBrdGltZV9hZGQoY29tcGFyZXRpbWUsIGRpZmYpOworCiAJCWlmIChlcnJvcl9jb3VudCkgewogCQkJcmVzdWx0KCJkYXRhIGVycm9yIiwgdG90YWxfdGVzdHMsIHNyY19vZmYsIGRzdF9vZmYsCiAJCQkgICAgICAgbGVuLCBlcnJvcl9jb3VudCk7CkBAIC03MTIsNyArNzIyLDEwIEBACiAJCQkJICAgICAgIGRzdF9vZmYsIGxlbiwgMCk7CiAJCX0KIAl9Ci0JcnVudGltZSA9IGt0aW1lX3VzX2RlbHRhKGt0aW1lX2dldCgpLCBrdGltZSk7CisJa3RpbWUgPSBrdGltZV9zdWIoa3RpbWVfZ2V0KCksIGt0aW1lKTsKKwlrdGltZSA9IGt0aW1lX3N1YihrdGltZSwgY29tcGFyZXRpbWUpOworCWt0aW1lID0ga3RpbWVfc3ViKGt0aW1lLCBmaWxsdGltZSk7CisJcnVudGltZSA9IGt0aW1lX3RvX3VzKGt0aW1lKTsKIAogCXJldCA9IDA7CiBlcnJfZHN0YnVmOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZHcvY29yZS5jIGIvZHJpdmVycy9kbWEvZHcvY29yZS5jCmluZGV4IGVkZjA1M2YuLmMyYzBhNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2R3L2NvcmUuYworKysgYi9kcml2ZXJzL2RtYS9kdy9jb3JlLmMKQEAgLTQ2LDkgKzQ2LDkgQEAKIAkJdTggX2Rtc2l6ZSA9IF9pc19zbGF2ZSA/IF9zY29uZmlnLT5kc3RfbWF4YnVyc3QgOglcCiAJCQlEV19ETUFfTVNJWkVfMTY7CQkJXAogCQl1OCBfZG1zID0gKF9kd2MtPmRpcmVjdGlvbiA9PSBETUFfTUVNX1RPX0RFVikgPwkJXAotCQkJX2R3Yy0+cF9tYXN0ZXIgOiBfZHdjLT5tX21hc3RlcjsJCVwKKwkJCV9kd2MtPmR3cy5wX21hc3RlciA6IF9kd2MtPmR3cy5tX21hc3RlcjsJXAogCQl1OCBfc21zID0gKF9kd2MtPmRpcmVjdGlvbiA9PSBETUFfREVWX1RPX01FTSkgPwkJXAotCQkJX2R3Yy0+cF9tYXN0ZXIgOiBfZHdjLT5tX21hc3RlcjsJCVwKKwkJCV9kd2MtPmR3cy5wX21hc3RlciA6IF9kd2MtPmR3cy5tX21hc3RlcjsJXAogCQkJCQkJCQlcCiAJCShEV0NfQ1RMTF9EU1RfTVNJWkUoX2Rtc2l6ZSkJCQlcCiAJCSB8IERXQ19DVExMX1NSQ19NU0laRShfc21zaXplKQkJCVwKQEAgLTE0MywxMiArMTQzLDE2IEBACiAJc3RydWN0IGR3X2RtYSAqZHcgPSB0b19kd19kbWEoZHdjLT5jaGFuLmRldmljZSk7CiAJdTMyIGNmZ2hpID0gRFdDX0NGR0hfRklGT19NT0RFOwogCXUzMiBjZmdsbyA9IERXQ19DRkdMX0NIX1BSSU9SKGR3Yy0+cHJpb3JpdHkpOworCWJvb2wgaHNfcG9sYXJpdHkgPSBkd2MtPmR3cy5oc19wb2xhcml0eTsKIAogCWlmICh0ZXN0X2JpdChEV19ETUFfSVNfSU5JVElBTElaRUQsICZkd2MtPmZsYWdzKSkKIAkJcmV0dXJuOwogCi0JY2ZnaGkgfD0gRFdDX0NGR0hfRFNUX1BFUihkd2MtPmRzdF9pZCk7Ci0JY2ZnaGkgfD0gRFdDX0NGR0hfU1JDX1BFUihkd2MtPnNyY19pZCk7CisJY2ZnaGkgfD0gRFdDX0NGR0hfRFNUX1BFUihkd2MtPmR3cy5kc3RfaWQpOworCWNmZ2hpIHw9IERXQ19DRkdIX1NSQ19QRVIoZHdjLT5kd3Muc3JjX2lkKTsKKworCS8qIFNldCBwb2xhcml0eSBvZiBoYW5kc2hha2UgaW50ZXJmYWNlICovCisJY2ZnbG8gfD0gaHNfcG9sYXJpdHkgPyBEV0NfQ0ZHTF9IU19EU1RfUE9MIHwgRFdDX0NGR0xfSFNfU1JDX1BPTCA6IDA7CiAKIAljaGFubmVsX3dyaXRlbChkd2MsIENGR19MTywgY2ZnbG8pOwogCWNoYW5uZWxfd3JpdGVsKGR3YywgQ0ZHX0hJLCBjZmdoaSk7CkBAIC0yMDksNyArMjEzLDcgQEAKIHN0YXRpYyB2b2lkIGR3Y19kb3N0YXJ0KHN0cnVjdCBkd19kbWFfY2hhbiAqZHdjLCBzdHJ1Y3QgZHdfZGVzYyAqZmlyc3QpCiB7CiAJc3RydWN0IGR3X2RtYQkqZHcgPSB0b19kd19kbWEoZHdjLT5jaGFuLmRldmljZSk7Ci0JdTgJCWxtcyA9IERXQ19MTFBfTE1TKGR3Yy0+bV9tYXN0ZXIpOworCXU4CQlsbXMgPSBEV0NfTExQX0xNUyhkd2MtPmR3cy5tX21hc3Rlcik7CiAJdW5zaWduZWQgbG9uZwl3YXNfc29mdF9sbHA7CiAKIAkvKiBBU1NFUlQ6ICBjaGFubmVsIGlzIGlkbGUgKi8KQEAgLTI3MCwyMCArMjc0LDE5IEBACiBkd2NfZGVzY3JpcHRvcl9jb21wbGV0ZShzdHJ1Y3QgZHdfZG1hX2NoYW4gKmR3Yywgc3RydWN0IGR3X2Rlc2MgKmRlc2MsCiAJCWJvb2wgY2FsbGJhY2tfcmVxdWlyZWQpCiB7Ci0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrCQljYWxsYmFjayA9IE5VTEw7Ci0Jdm9pZAkJCQkqcGFyYW0gPSBOVUxMOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcgkqdHhkID0gJmRlc2MtPnR4ZDsKIAlzdHJ1Y3QgZHdfZGVzYwkJCSpjaGlsZDsKIAl1bnNpZ25lZCBsb25nCQkJZmxhZ3M7CisJc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrCWNiOwogCiAJZGV2X3ZkYmcoY2hhbjJkZXYoJmR3Yy0+Y2hhbiksICJkZXNjcmlwdG9yICV1IGNvbXBsZXRlXG4iLCB0eGQtPmNvb2tpZSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZHdjLT5sb2NrLCBmbGFncyk7CiAJZG1hX2Nvb2tpZV9jb21wbGV0ZSh0eGQpOwotCWlmIChjYWxsYmFja19yZXF1aXJlZCkgewotCQljYWxsYmFjayA9IHR4ZC0+Y2FsbGJhY2s7Ci0JCXBhcmFtID0gdHhkLT5jYWxsYmFja19wYXJhbTsKLQl9CisJaWYgKGNhbGxiYWNrX3JlcXVpcmVkKQorCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2sodHhkLCAmY2IpOworCWVsc2UKKwkJbWVtc2V0KCZjYiwgMCwgc2l6ZW9mKGNiKSk7CiAKIAkvKiBhc3luY190eF9hY2sgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVzYy0+dHhfbGlzdCwgZGVzY19ub2RlKQpAQCAtMjkyLDggKzI5NSw3IEBACiAJZHdjX2Rlc2NfcHV0KGR3YywgZGVzYyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHdjLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoY2FsbGJhY2spCi0JCWNhbGxiYWNrKHBhcmFtKTsKKwlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgZHdjX2NvbXBsZXRlX2FsbChzdHJ1Y3QgZHdfZG1hICpkdywgc3RydWN0IGR3X2RtYV9jaGFuICpkd2MpCkBAIC02NjIsNyArNjY0LDcgQEAKIAlzdHJ1Y3QgZHdfZGVzYwkJKnByZXY7CiAJc2l6ZV90CQkJeGZlcl9jb3VudDsKIAlzaXplX3QJCQlvZmZzZXQ7Ci0JdTgJCQltX21hc3RlciA9IGR3Yy0+bV9tYXN0ZXI7CisJdTgJCQltX21hc3RlciA9IGR3Yy0+ZHdzLm1fbWFzdGVyOwogCXVuc2lnbmVkIGludAkJc3JjX3dpZHRoOwogCXVuc2lnbmVkIGludAkJZHN0X3dpZHRoOwogCXVuc2lnbmVkIGludAkJZGF0YV93aWR0aCA9IGR3LT5wZGF0YS0+ZGF0YV93aWR0aFttX21hc3Rlcl07CkBAIC03NDAsNyArNzQyLDcgQEAKIAlzdHJ1Y3QgZHdfZGVzYwkJKnByZXY7CiAJc3RydWN0IGR3X2Rlc2MJCSpmaXJzdDsKIAl1MzIJCQljdGxsbzsKLQl1OAkJCW1fbWFzdGVyID0gZHdjLT5tX21hc3RlcjsKKwl1OAkJCW1fbWFzdGVyID0gZHdjLT5kd3MubV9tYXN0ZXI7CiAJdTgJCQlsbXMgPSBEV0NfTExQX0xNUyhtX21hc3Rlcik7CiAJZG1hX2FkZHJfdAkJcmVnOwogCXVuc2lnbmVkIGludAkJcmVnX3dpZHRoOwpAQCAtODk1LDEyICs4OTcsNyBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiBXZSBoYXZlIHRvIGNvcHkgZGF0YSBzaW5jZSBkd3MgY2FuIGJlIHRlbXBvcmFyeSBzdG9yYWdlICovCi0KLQlkd2MtPnNyY19pZCA9IGR3cy0+c3JjX2lkOwotCWR3Yy0+ZHN0X2lkID0gZHdzLT5kc3RfaWQ7Ci0KLQlkd2MtPm1fbWFzdGVyID0gZHdzLT5tX21hc3RlcjsKLQlkd2MtPnBfbWFzdGVyID0gZHdzLT5wX21hc3RlcjsKKwltZW1jcHkoJmR3Yy0+ZHdzLCBkd3MsIHNpemVvZihzdHJ1Y3QgZHdfZG1hX3NsYXZlKSk7CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTExNjcsMTEgKzExNjQsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkd2MtPmxvY2ssIGZsYWdzKTsKIAogCS8qIENsZWFyIGN1c3RvbSBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KLQlkd2MtPnNyY19pZCA9IDA7Ci0JZHdjLT5kc3RfaWQgPSAwOwotCi0JZHdjLT5tX21hc3RlciA9IDA7Ci0JZHdjLT5wX21hc3RlciA9IDA7CisJbWVtc2V0KCZkd2MtPmR3cywgMCwgc2l6ZW9mKHN0cnVjdCBkd19kbWFfc2xhdmUpKTsKIAogCWNsZWFyX2JpdChEV19ETUFfSVNfSU5JVElBTElaRUQsICZkd2MtPmZsYWdzKTsKIApAQCAtMTI2NCw3ICsxMjU3LDcgQEAKIAlzdHJ1Y3QgZHdfY3ljbGljX2Rlc2MJCSpyZXR2YWwgPSBOVUxMOwogCXN0cnVjdCBkd19kZXNjCQkJKmRlc2M7CiAJc3RydWN0IGR3X2Rlc2MJCQkqbGFzdCA9IE5VTEw7Ci0JdTgJCQkJbG1zID0gRFdDX0xMUF9MTVMoZHdjLT5tX21hc3Rlcik7CisJdTgJCQkJbG1zID0gRFdDX0xMUF9MTVMoZHdjLT5kd3MubV9tYXN0ZXIpOwogCXVuc2lnbmVkIGxvbmcJCQl3YXNfY3ljbGljOwogCXVuc2lnbmVkIGludAkJCXJlZ193aWR0aDsKIAl1bnNpZ25lZCBpbnQJCQlwZXJpb2RzOwpAQCAtMTU3NiwxMSArMTU2OSw3IEBACiAJCQkJKGR3Y19wYXJhbXMgPj4gRFdDX1BBUkFNU19NQkxLX0VOICYgMHgxKSA9PSAwOwogCQl9IGVsc2UgewogCQkJZHdjLT5ibG9ja19zaXplID0gcGRhdGEtPmJsb2NrX3NpemU7Ci0KLQkJCS8qIENoZWNrIGlmIGNoYW5uZWwgc3VwcG9ydHMgbXVsdGkgYmxvY2sgdHJhbnNmZXIgKi8KLQkJCWNoYW5uZWxfd3JpdGVsKGR3YywgTExQLCBEV0NfTExQX0xPQygweGZmZmZmZmZmKSk7Ci0JCQlkd2MtPm5vbGxwID0gRFdDX0xMUF9MT0MoY2hhbm5lbF9yZWFkbChkd2MsIExMUCkpID09IDA7Ci0JCQljaGFubmVsX3dyaXRlbChkd2MsIExMUCwgMCk7CisJCQlkd2MtPm5vbGxwID0gcGRhdGEtPmlzX25vbGxwOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kdy9yZWdzLmggYi9kcml2ZXJzL2RtYS9kdy9yZWdzLmgKaW5kZXggNGI3YmQ3OC4uZjY1ZGQxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZHcvcmVncy5oCisrKyBiL2RyaXZlcnMvZG1hL2R3L3JlZ3MuaApAQCAtMjQ1LDEwICsyNDUsNyBAQAogCWJvb2wJCQlub2xscDsKIAogCS8qIGN1c3RvbSBzbGF2ZSBjb25maWd1cmF0aW9uICovCi0JdTgJCQlzcmNfaWQ7Ci0JdTgJCQlkc3RfaWQ7Ci0JdTgJCQltX21hc3RlcjsKLQl1OAkJCXBfbWFzdGVyOworCXN0cnVjdCBkd19kbWFfc2xhdmUJZHdzOwogCiAJLyogY29uZmlndXJhdGlvbiBwYXNzZWQgdmlhIC5kZXZpY2VfY29uZmlnICovCiAJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgZG1hX3Njb25maWc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9lZG1hLmMgYi9kcml2ZXJzL2RtYS9lZG1hLmMKaW5kZXggM2QyNzdmYS4uZTE4YTU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2VkbWEuYwpAQCAtMjYzLDIyICsyNjMsMjkgQEAKIAogI2RlZmluZSBFRE1BX0JJTkRJTkdfTEVHQUNZCTAKICNkZWZpbmUgRURNQV9CSU5ESU5HX1RQQ0MJMQorc3RhdGljIGNvbnN0IHUzMiBlZG1hX2JpbmRpbmdfdHlwZVtdID0geworCVtFRE1BX0JJTkRJTkdfTEVHQUNZXSA9IEVETUFfQklORElOR19MRUdBQ1ksCisJW0VETUFfQklORElOR19UUENDXSA9IEVETUFfQklORElOR19UUENDLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZWRtYV9vZl9pZHNbXSA9IHsKIAl7CiAJCS5jb21wYXRpYmxlID0gInRpLGVkbWEzIiwKLQkJLmRhdGEgPSAodm9pZCAqKUVETUFfQklORElOR19MRUdBQ1ksCisJCS5kYXRhID0gJmVkbWFfYmluZGluZ190eXBlW0VETUFfQklORElOR19MRUdBQ1ldLAogCX0sCiAJewogCQkuY29tcGF0aWJsZSA9ICJ0aSxlZG1hMy10cGNjIiwKLQkJLmRhdGEgPSAodm9pZCAqKUVETUFfQklORElOR19UUENDLAorCQkuZGF0YSA9ICZlZG1hX2JpbmRpbmdfdHlwZVtFRE1BX0JJTkRJTkdfVFBDQ10sCiAJfSwKIAl7fQogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGVkbWFfb2ZfaWRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZWRtYV90cHRjX29mX2lkc1tdID0gewogCXsgLmNvbXBhdGlibGUgPSAidGksZWRtYTMtdHB0YyIsIH0sCiAJe30KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBlZG1hX3RwdGNfb2ZfaWRzKTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZWRtYV9yZWFkKHN0cnVjdCBlZG1hX2NjICplY2MsIGludCBvZmZzZXQpCiB7CkBAIC00MDUsMTggKzQxMiwxMiBAQAogCWVkbWFfb3IoZWNjLCBFRE1BX1BBUk0gKyBvZmZzZXQgKyAocGFyYW1fbm8gPDwgNSksIG9yKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9iaXRzKGludCBvZmZzZXQsIGludCBsZW4sIHVuc2lnbmVkIGxvbmcgKnApCitzdGF0aWMgaW5saW5lIHZvaWQgZWRtYV9zZXRfYml0cyhpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nICpwKQogewogCWZvciAoOyBsZW4gPiAwOyBsZW4tLSkKIAkJc2V0X2JpdChvZmZzZXQgKyAobGVuIC0gMSksIHApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfYml0cyhpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1bnNpZ25lZCBsb25nICpwKQotewotCWZvciAoOyBsZW4gPiAwOyBsZW4tLSkKLQkJY2xlYXJfYml0KG9mZnNldCArIChsZW4gLSAxKSwgcCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGVkbWFfYXNzaWduX3ByaW9yaXR5X3RvX3F1ZXVlKHN0cnVjdCBlZG1hX2NjICplY2MsIGludCBxdWV1ZV9ubywKIAkJCQkJICBpbnQgcHJpb3JpdHkpCiB7CkBAIC00NjQsMTMgKzQ2NSwxNSBAQAogCW1lbWNweV90b2lvKGVjYy0+YmFzZSArIFBBUk1fT0ZGU0VUKHNsb3QpLCBwYXJhbSwgUEFSTV9TSVpFKTsKIH0KIAotc3RhdGljIHZvaWQgZWRtYV9yZWFkX3Nsb3Qoc3RydWN0IGVkbWFfY2MgKmVjYywgdW5zaWduZWQgc2xvdCwKK3N0YXRpYyBpbnQgZWRtYV9yZWFkX3Nsb3Qoc3RydWN0IGVkbWFfY2MgKmVjYywgdW5zaWduZWQgc2xvdCwKIAkJCSAgIHN0cnVjdCBlZG1hY2NfcGFyYW0gKnBhcmFtKQogewogCXNsb3QgPSBFRE1BX0NIQU5fU0xPVChzbG90KTsKIAlpZiAoc2xvdCA+PSBlY2MtPm51bV9zbG90cykKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTlZBTDsKIAltZW1jcHlfZnJvbWlvKHBhcmFtLCBlY2MtPmJhc2UgKyBQQVJNX09GRlNFVChzbG90KSwgUEFSTV9TSVpFKTsKKworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTE0NzYsMTMgKzE0NzksMTUgQEAKIAlzdHJ1Y3QgZWRtYV9jYyAqZWNjID0gZWNoYW4tPmVjYzsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBlY2hhbi0+dmNoYW4uY2hhbi5kZXZpY2UtPmRldjsKIAlzdHJ1Y3QgZWRtYWNjX3BhcmFtIHA7CisJaW50IGVycjsKIAogCWlmICghZWNoYW4tPmVkZXNjKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2soJmVjaGFuLT52Y2hhbi5sb2NrKTsKIAotCWVkbWFfcmVhZF9zbG90KGVjYywgZWNoYW4tPnNsb3RbMF0sICZwKTsKKwllcnIgPSBlZG1hX3JlYWRfc2xvdChlY2MsIGVjaGFuLT5zbG90WzBdLCAmcCk7CisKIAkvKgogCSAqIElzc3VlIGxhdGVyIGJhc2VkIG9uIG1pc3NlZCBmbGFnIHdoaWNoIHdpbGwgYmUgc3VyZQogCSAqIHRvIGhhcHBlbiBhczoKQEAgLTE0OTUsNyArMTUwMCw3IEBACiAJICogbGVhZCB0byBzb21lIG5hc3R5IHJlY3Vyc2lvbiB3aGVuIHdlIGFyZSBpbiBhIE5VTEwKIAkgKiBzbG90LiBTbyB3ZSBhdm9pZCBkb2luZyBzbyBhbmQgc2V0IHRoZSBtaXNzZWQgZmxhZy4KIAkgKi8KLQlpZiAocC5hX2JfY250ID09IDAgJiYgcC5jY250ID09IDApIHsKKwlpZiAoZXJyIHx8IChwLmFfYl9jbnQgPT0gMCAmJiBwLmNjbnQgPT0gMCkpIHsKIAkJZGV2X2RiZyhkZXYsICJFcnJvciBvbiBudWxsIHNsb3QsIHNldHRpbmcgbWlzc1xuIik7CiAJCWVjaGFuLT5taXNzZWQgPSAxOwogCX0gZWxzZSB7CkBAIC0yMDE5LDggKzIwMjQsNyBAQAogewogCXN0cnVjdCBlZG1hX3NvY19pbmZvICppbmZvOwogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKLQlzaXplX3Qgc3o7Ci0JaW50IHJldDsKKwlpbnQgc3osIHJldDsKIAogCWluZm8gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IGVkbWFfc29jX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8pCkBAIC0yMTgyLDcgKzIxODYsNyBAQAogCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAogCQltYXRjaCA9IG9mX21hdGNoX25vZGUoZWRtYV9vZl9pZHMsIG5vZGUpOwotCQlpZiAobWF0Y2ggJiYgKHUzMiltYXRjaC0+ZGF0YSA9PSBFRE1BX0JJTkRJTkdfVFBDQykKKwkJaWYgKG1hdGNoICYmICgqKHUzMiAqKW1hdGNoLT5kYXRhKSA9PSBFRE1BX0JJTkRJTkdfVFBDQykKIAkJCWxlZ2FjeV9tb2RlID0gZmFsc2U7CiAKIAkJaW5mbyA9IGVkbWFfc2V0dXBfaW5mb19mcm9tX2R0KGRldiwgbGVnYWN5X21vZGUpOwpAQCAtMjI2MCw3ICsyMjY0LDcgQEAKIAkJCWZvciAoaSA9IDA7IHJzdl9zbG90c1tpXVswXSAhPSAtMTsgaSsrKSB7CiAJCQkJb2ZmID0gcnN2X3Nsb3RzW2ldWzBdOwogCQkJCWxuID0gcnN2X3Nsb3RzW2ldWzFdOwotCQkJCXNldF9iaXRzKG9mZiwgbG4sIGVjYy0+c2xvdF9pbnVzZSk7CisJCQkJZWRtYV9zZXRfYml0cyhvZmYsIGxuLCBlY2MtPnNsb3RfaW51c2UpOwogCQkJfQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZXA5M3h4X2RtYS5jIGIvZHJpdmVycy9kbWEvZXA5M3h4X2RtYS5jCmluZGV4IDIxZjA4Y2MuLmQzN2U4ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2VwOTN4eF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9lcDkzeHhfZG1hLmMKQEAgLTI2MiwxMCArMjYyLDggQEAKIHN0YXRpYyBzdHJ1Y3QgZXA5M3h4X2RtYV9kZXNjICoKIGVwOTN4eF9kbWFfZ2V0X2FjdGl2ZShzdHJ1Y3QgZXA5M3h4X2RtYV9jaGFuICplZG1hYykKIHsKLQlpZiAobGlzdF9lbXB0eSgmZWRtYWMtPmFjdGl2ZSkpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0dXJuIGxpc3RfZmlyc3RfZW50cnkoJmVkbWFjLT5hY3RpdmUsIHN0cnVjdCBlcDkzeHhfZG1hX2Rlc2MsIG5vZGUpOworCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVkbWFjLT5hY3RpdmUsCisJCQkJCXN0cnVjdCBlcDkzeHhfZG1hX2Rlc2MsIG5vZGUpOwogfQogCiAvKioKQEAgLTczOSwxMCArNzM3LDEwIEBACiB7CiAJc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqZWRtYWMgPSAoc3RydWN0IGVwOTN4eF9kbWFfY2hhbiAqKWRhdGE7CiAJc3RydWN0IGVwOTN4eF9kbWFfZGVzYyAqZGVzYywgKmQ7Ci0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrID0gTlVMTDsKLQl2b2lkICpjYWxsYmFja19wYXJhbSA9IE5VTEw7CisJc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrIGNiOwogCUxJU1RfSEVBRChsaXN0KTsKIAorCW1lbXNldCgmY2IsIDAsIHNpemVvZihjYikpOwogCXNwaW5fbG9ja19pcnEoJmVkbWFjLT5sb2NrKTsKIAkvKgogCSAqIElmIGRtYV90ZXJtaW5hdGVfYWxsKCkgd2FzIGNhbGxlZCBiZWZvcmUgd2UgZ2V0IHRvIHJ1biwgdGhlIGFjdGl2ZQpAQCAtNzU3LDggKzc1NSw3IEBACiAJCQkJZG1hX2Nvb2tpZV9jb21wbGV0ZSgmZGVzYy0+dHhkKTsKIAkJCWxpc3Rfc3BsaWNlX2luaXQoJmVkbWFjLT5hY3RpdmUsICZsaXN0KTsKIAkJfQotCQljYWxsYmFjayA9IGRlc2MtPnR4ZC5jYWxsYmFjazsKLQkJY2FsbGJhY2tfcGFyYW0gPSBkZXNjLT50eGQuY2FsbGJhY2tfcGFyYW07CisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjaygmZGVzYy0+dHhkLCAmY2IpOwogCX0KIAlzcGluX3VubG9ja19pcnEoJmVkbWFjLT5sb2NrKTsKIApAQCAtNzcxLDggKzc2OCw3IEBACiAJCWVwOTN4eF9kbWFfZGVzY19wdXQoZWRtYWMsIGRlc2MpOwogCX0KIAotCWlmIChjYWxsYmFjaykKLQkJY2FsbGJhY2soY2FsbGJhY2tfcGFyYW0pOworCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgZXA5M3h4X2RtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQpAQCAtMTA0NywxMSArMTA0MywxMSBAQAogCiAJZmlyc3QgPSBOVUxMOwogCWZvcl9lYWNoX3NnKHNnbCwgc2csIHNnX2xlbiwgaSkgewotCQlzaXplX3Qgc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7CisJCXNpemVfdCBsZW4gPSBzZ19kbWFfbGVuKHNnKTsKIAotCQlpZiAoc2dfbGVuID4gRE1BX01BWF9DSEFOX0JZVEVTKSB7Ci0JCQlkZXZfd2FybihjaGFuMmRldihlZG1hYyksICJ0b28gYmlnIHRyYW5zZmVyIHNpemUgJWRcbiIsCi0JCQkJIHNnX2xlbik7CisJCWlmIChsZW4gPiBETUFfTUFYX0NIQU5fQllURVMpIHsKKwkJCWRldl93YXJuKGNoYW4yZGV2KGVkbWFjKSwgInRvbyBiaWcgdHJhbnNmZXIgc2l6ZSAlenVcbiIsCisJCQkJIGxlbik7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIApAQCAtMTA2OCw3ICsxMDY0LDcgQEAKIAkJCWRlc2MtPnNyY19hZGRyID0gZWRtYWMtPnJ1bnRpbWVfYWRkcjsKIAkJCWRlc2MtPmRzdF9hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOwogCQl9Ci0JCWRlc2MtPnNpemUgPSBzZ19sZW47CisJCWRlc2MtPnNpemUgPSBsZW47CiAKIAkJaWYgKCFmaXJzdCkKIAkJCWZpcnN0ID0gZGVzYzsKQEAgLTExMjUsNyArMTEyMSw3IEBACiAJfQogCiAJaWYgKHBlcmlvZF9sZW4gPiBETUFfTUFYX0NIQU5fQllURVMpIHsKLQkJZGV2X3dhcm4oY2hhbjJkZXYoZWRtYWMpLCAidG9vIGJpZyBwZXJpb2QgbGVuZ3RoICVkXG4iLAorCQlkZXZfd2FybihjaGFuMmRldihlZG1hYyksICJ0b28gYmlnIHBlcmlvZCBsZW5ndGggJXp1XG4iLAogCQkJIHBlcmlvZF9sZW4pOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9mc2xfcmFpZC5jIGIvZHJpdmVycy9kbWEvZnNsX3JhaWQuYwppbmRleCBhYWQxNjdlLi5kYjJmOWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9mc2xfcmFpZC5jCisrKyBiL2RyaXZlcnMvZG1hL2ZzbF9yYWlkLmMKQEAgLTEzNCwxNyArMTM0LDkgQEAKIAogc3RhdGljIHZvaWQgZnNsX3JlX2Rlc2NfZG9uZShzdHJ1Y3QgZnNsX3JlX2Rlc2MgKmRlc2MpCiB7Ci0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrOwotCXZvaWQgKmNhbGxiYWNrX3BhcmFtOwotCiAJZG1hX2Nvb2tpZV9jb21wbGV0ZSgmZGVzYy0+YXN5bmNfdHgpOwotCi0JY2FsbGJhY2sgPSBkZXNjLT5hc3luY190eC5jYWxsYmFjazsKLQljYWxsYmFja19wYXJhbSA9IGRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrX3BhcmFtOwotCWlmIChjYWxsYmFjaykKLQkJY2FsbGJhY2soY2FsbGJhY2tfcGFyYW0pOwotCiAJZG1hX2Rlc2NyaXB0b3JfdW5tYXAoJmRlc2MtPmFzeW5jX3R4KTsKKwlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKCZkZXNjLT5hc3luY190eCwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGZzbF9yZV9jbGVhbnVwX2Rlc2NzKHN0cnVjdCBmc2xfcmVfY2hhbiAqcmVfY2hhbikKQEAgLTY3MCw3ICs2NjIsNyBAQAogCiAJLyogcmVhZCBpcnEgcHJvcGVydHkgZnJvbSBkdHMgKi8KIAljaGFuLT5pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7Ci0JaWYgKGNoYW4tPmlycSA9PSBOT19JUlEpIHsKKwlpZiAoIWNoYW4tPmlycSkgewogCQlkZXZfZXJyKGRldiwgIk5vIElSUSBkZWZpbmVkIGZvciBKUiAlZFxuIiwgcSk7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX2ZyZWU7CkBAIC04MzYsNiArODI4LDcgQEAKIAkJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJlZyIsICZvZmYpOwogCQlpZiAocmMpIHsKIAkJCWRldl9lcnIoZGV2LCAiUmVnIHByb3BlcnR5IG5vdCBmb3VuZCBpbiBKUSBub2RlXG4iKTsKKwkJCW9mX25vZGVfcHV0KG5wKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJCS8qIEZpbmQgb3V0IHRoZSBKb2IgUmluZ3MgcHJlc2VudCB1bmRlciBlYWNoIEpRICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9mc2xkbWEuYyBiL2RyaXZlcnMvZG1hL2ZzbGRtYS5jCmluZGV4IDkxMWI3MTcuLjUxYzc1YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2ZzbGRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2ZzbGRtYS5jCkBAIC01MTYsMTMgKzUxNiw5IEBACiAJaWYgKHR4ZC0+Y29va2llID4gMCkgewogCQlyZXQgPSB0eGQtPmNvb2tpZTsKIAotCQkvKiBSdW4gdGhlIGxpbmsgZGVzY3JpcHRvciBjYWxsYmFjayBmdW5jdGlvbiAqLwotCQlpZiAodHhkLT5jYWxsYmFjaykgewotCQkJY2hhbl9kYmcoY2hhbiwgIkxEICVwIGNhbGxiYWNrXG4iLCBkZXNjKTsKLQkJCXR4ZC0+Y2FsbGJhY2sodHhkLT5jYWxsYmFja19wYXJhbSk7Ci0JCX0KLQogCQlkbWFfZGVzY3JpcHRvcl91bm1hcCh0eGQpOworCQkvKiBSdW4gdGhlIGxpbmsgZGVzY3JpcHRvciBjYWxsYmFjayBmdW5jdGlvbiAqLworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKHR4ZCwgTlVMTCk7CiAJfQogCiAJLyogUnVuIGFueSBkZXBlbmRlbmNpZXMgKi8KQEAgLTExNTMsNyArMTE0OSw3IEBACiAJc3RydWN0IGZzbGRtYV9jaGFuICpjaGFuOwogCWludCBpOwogCi0JaWYgKGZkZXYtPmlycSAhPSBOT19JUlEpIHsKKwlpZiAoZmRldi0+aXJxKSB7CiAJCWRldl9kYmcoZmRldi0+ZGV2LCAiZnJlZSBwZXItY29udHJvbGxlciBJUlFcbiIpOwogCQlmcmVlX2lycShmZGV2LT5pcnEsIGZkZXYpOwogCQlyZXR1cm47CkBAIC0xMTYxLDcgKzExNTcsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IEZTTF9ETUFfTUFYX0NIQU5TX1BFUl9ERVZJQ0U7IGkrKykgewogCQljaGFuID0gZmRldi0+Y2hhbltpXTsKLQkJaWYgKGNoYW4gJiYgY2hhbi0+aXJxICE9IE5PX0lSUSkgeworCQlpZiAoY2hhbiAmJiBjaGFuLT5pcnEpIHsKIAkJCWNoYW5fZGJnKGNoYW4sICJmcmVlIHBlci1jaGFubmVsIElSUVxuIik7CiAJCQlmcmVlX2lycShjaGFuLT5pcnEsIGNoYW4pOwogCQl9CkBAIC0xMTc1LDcgKzExNzEsNyBAQAogCWludCBpOwogCiAJLyogaWYgd2UgaGF2ZSBhIHBlci1jb250cm9sbGVyIElSUSwgdXNlIHRoYXQgKi8KLQlpZiAoZmRldi0+aXJxICE9IE5PX0lSUSkgeworCWlmIChmZGV2LT5pcnEpIHsKIAkJZGV2X2RiZyhmZGV2LT5kZXYsICJyZXF1ZXN0IHBlci1jb250cm9sbGVyIElSUVxuIik7CiAJCXJldCA9IHJlcXVlc3RfaXJxKGZkZXYtPmlycSwgZnNsZG1hX2N0cmxfaXJxLCBJUlFGX1NIQVJFRCwKIAkJCQkgICJmc2xkbWEtY29udHJvbGxlciIsIGZkZXYpOwpAQCAtMTE4OCw3ICsxMTg0LDcgQEAKIAkJaWYgKCFjaGFuKQogCQkJY29udGludWU7CiAKLQkJaWYgKGNoYW4tPmlycSA9PSBOT19JUlEpIHsKKwkJaWYgKCFjaGFuLT5pcnEpIHsKIAkJCWNoYW5fZXJyKGNoYW4sICJpbnRlcnJ1cHRzIHByb3BlcnR5IG1pc3NpbmcgaW4gZGV2aWNlIHRyZWVcbiIpOwogCQkJcmV0ID0gLUVOT0RFVjsKIAkJCWdvdG8gb3V0X3Vud2luZDsKQEAgLTEyMTEsNyArMTIwNyw3IEBACiAJCWlmICghY2hhbikKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChjaGFuLT5pcnEgPT0gTk9fSVJRKQorCQlpZiAoIWNoYW4tPmlycSkKIAkJCWNvbnRpbnVlOwogCiAJCWZyZWVfaXJxKGNoYW4tPmlycSwgY2hhbik7CkBAIC0xMzExLDcgKzEzMDcsNyBAQAogCWxpc3RfYWRkX3RhaWwoJmNoYW4tPmNvbW1vbi5kZXZpY2Vfbm9kZSwgJmZkZXYtPmNvbW1vbi5jaGFubmVscyk7CiAKIAlkZXZfaW5mbyhmZGV2LT5kZXYsICIjJWQgKCVzKSwgaXJxICVkXG4iLCBjaGFuLT5pZCwgY29tcGF0aWJsZSwKLQkJIGNoYW4tPmlycSAhPSBOT19JUlEgPyBjaGFuLT5pcnEgOiBmZGV2LT5pcnEpOworCQkgY2hhbi0+aXJxID8gY2hhbi0+aXJxIDogZmRldi0+aXJxKTsKIAogCXJldHVybiAwOwogCkBAIC0xMzUxLDcgKzEzNDcsNyBAQAogCWlmICghZmRldi0+cmVncykgewogCQlkZXZfZXJyKCZvcC0+ZGV2LCAidW5hYmxlIHRvIGlvcmVtYXAgcmVnaXN0ZXJzXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXRfZnJlZV9mZGV2OworCQlnb3RvIG91dF9mcmVlOwogCX0KIAogCS8qIG1hcCB0aGUgY2hhbm5lbCBJUlEgaWYgaXQgZXhpc3RzLCBidXQgZG9uJ3QgaG9va3VwIHRoZSBoYW5kbGVyIHlldCAqLwpAQCAtMTQxNiw2ICsxNDEyLDggQEAKIAogb3V0X2ZyZWVfZmRldjoKIAlpcnFfZGlzcG9zZV9tYXBwaW5nKGZkZXYtPmlycSk7CisJaW91bm1hcChmZGV2LT5yZWdzKTsKK291dF9mcmVlOgogCWtmcmVlKGZkZXYpOwogb3V0X3JldHVybjoKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaHN1L2hzdS5jIGIvZHJpdmVycy9kbWEvaHN1L2hzdS5jCmluZGV4IGM1ZjIxZWYuLjI5ZDA0Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2hzdS9oc3UuYworKysgYi9kcml2ZXJzL2RtYS9oc3UvaHN1LmMKQEAgLTIwMCwxMCArMjAwLDkgQEAKICAqICAgICAgaXMgbm90IGEgbm9ybWFsIHRpbWVvdXQgaW50ZXJydXB0LCBpZS4gaHN1X2RtYV9nZXRfc3RhdHVzKCkgcmV0dXJuZWQgMC4KICAqCiAgKiAgICAgIFJldHVybjoKLSAqICAgICAgSVJRX05PTkUgZm9yIGludmFsaWQgY2hhbm5lbCBudW1iZXIsIElSUV9IQU5ETEVEIG90aGVyd2lzZS4KKyAqICAgICAgMCBmb3IgaW52YWxpZCBjaGFubmVsIG51bWJlciwgMSBvdGhlcndpc2UuCiAgKi8KLWlycXJldHVybl90IGhzdV9kbWFfZG9faXJxKHN0cnVjdCBoc3VfZG1hX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHNob3J0IG5yLAotCQkJICAgdTMyIHN0YXR1cykKK2ludCBoc3VfZG1hX2RvX2lycShzdHJ1Y3QgaHN1X2RtYV9jaGlwICpjaGlwLCB1bnNpZ25lZCBzaG9ydCBuciwgdTMyIHN0YXR1cykKIHsKIAlzdHJ1Y3QgaHN1X2RtYV9jaGFuICpoc3VjOwogCXN0cnVjdCBoc3VfZG1hX2Rlc2MgKmRlc2M7CkBAIC0yMTEsNyArMjEwLDcgQEAKIAogCS8qIFNhbml0eSBjaGVjayAqLwogCWlmIChuciA+PSBjaGlwLT5oc3UtPm5yX2NoYW5uZWxzKQotCQlyZXR1cm4gSVJRX05PTkU7CisJCXJldHVybiAwOwogCiAJaHN1YyA9ICZjaGlwLT5oc3UtPmNoYW5bbnJdOwogCkBAIC0yMzAsNyArMjI5LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHN1Yy0+dmNoYW4ubG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIElSUV9IQU5ETEVEOworCXJldHVybiAxOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaHN1X2RtYV9kb19pcnEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9oc3UvcGNpLmMgYi9kcml2ZXJzL2RtYS9oc3UvcGNpLmMKaW5kZXggOTkxNjA1OC4uYjUxNjM5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaHN1L3BjaS5jCisrKyBiL2RyaXZlcnMvZG1hL2hzdS9wY2kuYwpAQCAtMjksNyArMjksNyBAQAogCXUzMiBkbWFpc3I7CiAJdTMyIHN0YXR1czsKIAl1bnNpZ25lZCBzaG9ydCBpOwotCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCWludCByZXQgPSAwOwogCWludCBlcnI7CiAKIAlkbWFpc3IgPSByZWFkbChjaGlwLT5yZWdzICsgSFNVX1BDSV9ETUFJU1IpOwpAQCAtMzcsMTQgKzM3LDE0IEBACiAJCWlmIChkbWFpc3IgJiAweDEpIHsKIAkJCWVyciA9IGhzdV9kbWFfZ2V0X3N0YXR1cyhjaGlwLCBpLCAmc3RhdHVzKTsKIAkJCWlmIChlcnIgPiAwKQotCQkJCXJldCB8PSBJUlFfSEFORExFRDsKKwkJCQlyZXQgfD0gMTsKIAkJCWVsc2UgaWYgKGVyciA9PSAwKQogCQkJCXJldCB8PSBoc3VfZG1hX2RvX2lycShjaGlwLCBpLCBzdGF0dXMpOwogCQl9CiAJCWRtYWlzciA+Pj0gMTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBJUlFfUkVUVkFMKHJldCk7CiB9CiAKIHN0YXRpYyBpbnQgaHN1X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW1nLW1kYy1kbWEuYyBiL2RyaXZlcnMvZG1hL2ltZy1tZGMtZG1hLmMKaW5kZXggYTRjNTNiZS4uNjI0ZjFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW1nLW1kYy1kbWEuYworKysgYi9kcml2ZXJzL2RtYS9pbWctbWRjLWRtYS5jCkBAIC04NjEsNyArODYxLDYgQEAKIHsKIAlzdHJ1Y3QgbWRjX2RtYSAqbWRtYTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgdmFsOwogCWludCByZXQ7CkBAIC04NzEsOCArODcwLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWRtYSk7CiAKLQltYXRjaCA9IG9mX21hdGNoX2RldmljZShtZGNfZG1hX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKLQltZG1hLT5zb2MgPSBtYXRjaC0+ZGF0YTsKKwltZG1hLT5zb2MgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCW1kbWEtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lteC1kbWEuYyBiL2RyaXZlcnMvZG1hL2lteC1kbWEuYwppbmRleCBhOTYwNjA4Li5hYjBmYjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pbXgtZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvaW14LWRtYS5jCkBAIC02NjMsOSArNjYzLDcgQEAKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbXhkbWEtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChkZXNjLT5kZXNjLmNhbGxiYWNrKQotCQlkZXNjLT5kZXNjLmNhbGxiYWNrKGRlc2MtPmRlc2MuY2FsbGJhY2tfcGFyYW0pOwotCisJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSgmZGVzYy0+ZGVzYywgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbnQgaW14ZG1hX3Rlcm1pbmF0ZV9hbGwoc3RydWN0IGRtYV9jaGFuICpjaGFuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW14LXNkbWEuYyBiL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMKaW5kZXggMDNlYzc2Zi4uYjk2MjliMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW14LXNkbWEuYworKysgYi9kcml2ZXJzL2RtYS9pbXgtc2RtYS5jCkBAIC0xODQsNyArMTg0LDcgQEAKIHN0cnVjdCBzZG1hX21vZGVfY291bnQgewogCXUzMiBjb3VudCAgIDogMTY7IC8qIHNpemUgb2YgdGhlIGJ1ZmZlciBwb2ludGVkIGJ5IHRoaXMgQkQgKi8KIAl1MzIgc3RhdHVzICA6ICA4OyAvKiBFLFIsSSxDLFcsRCBzdGF0dXMgYml0cyBzdG9yZWQgaGVyZSAqLwotCXUzMiBjb21tYW5kIDogIDg7IC8qIGNvbW1hbmQgbW9zdGxreSB1c2VkIGZvciBjaGFubmVsIDAgKi8KKwl1MzIgY29tbWFuZCA6ICA4OyAvKiBjb21tYW5kIG1vc3RseSB1c2VkIGZvciBjaGFubmVsIDAgKi8KIH07CiAKIC8qCkBAIC00NzksNiArNDc5LDI0IEBACiAJLnNjcmlwdF9hZGRycyA9ICZzZG1hX3NjcmlwdF9pbXg2cSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgc2RtYV9zY3JpcHRfaW14N2QgPSB7CisJLmFwXzJfYXBfYWRkciA9IDY0NCwKKwkudWFydF8yX21jdV9hZGRyID0gODE5LAorCS5tY3VfMl9hcHBfYWRkciA9IDc0OSwKKwkudWFydHNoXzJfbWN1X2FkZHIgPSAxMDM0LAorCS5tY3VfMl9zaHBfYWRkciA9IDk2MiwKKwkuYXBwXzJfbWN1X2FkZHIgPSA2ODUsCisJLnNocF8yX21jdV9hZGRyID0gODkzLAorCS5zcGRpZl8yX21jdV9hZGRyID0gMTEwMiwKKwkubWN1XzJfc3BkaWZfYWRkciA9IDExMzYsCit9OworCitzdGF0aWMgc3RydWN0IHNkbWFfZHJpdmVyX2RhdGEgc2RtYV9pbXg3ZCA9IHsKKwkuY2huZW5ibDAgPSBTRE1BX0NITkVOQkwwX0lNWDM1LAorCS5udW1fZXZlbnRzID0gNDgsCisJLnNjcmlwdF9hZGRycyA9ICZzZG1hX3NjcmlwdF9pbXg3ZCwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHNkbWFfZGV2dHlwZXNbXSA9IHsKIAl7CiAJCS5uYW1lID0gImlteDI1LXNkbWEiLApAQCAtNDk5LDYgKzUxNyw5IEBACiAJCS5uYW1lID0gImlteDZxLXNkbWEiLAogCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykmc2RtYV9pbXg2cSwKIAl9LCB7CisJCS5uYW1lID0gImlteDdkLXNkbWEiLAorCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykmc2RtYV9pbXg3ZCwKKwl9LCB7CiAJCS8qIHNlbnRpbmVsICovCiAJfQogfTsKQEAgLTUxMSw2ICs1MzIsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDM1LXNkbWEiLCAuZGF0YSA9ICZzZG1hX2lteDM1LCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDMxLXNkbWEiLCAuZGF0YSA9ICZzZG1hX2lteDMxLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDI1LXNkbWEiLCAuZGF0YSA9ICZzZG1hX2lteDI1LCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDdkLXNkbWEiLCAuZGF0YSA9ICZzZG1hX2lteDdkLCB9LAogCXsgLyogc2VudGluZWwgKi8gfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNkbWFfZHRfaWRzKTsKQEAgLTY0OCwxNSArNjcwLDExIEBACiAJd3JpdGVsX3JlbGF4ZWQodmFsLCBzZG1hLT5yZWdzICsgY2huZW5ibCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNkbWFfaGFuZGxlX2NoYW5uZWxfbG9vcChzdHJ1Y3Qgc2RtYV9jaGFubmVsICpzZG1hYykKLXsKLQlpZiAoc2RtYWMtPmRlc2MuY2FsbGJhY2spCi0JCXNkbWFjLT5kZXNjLmNhbGxiYWNrKHNkbWFjLT5kZXNjLmNhbGxiYWNrX3BhcmFtKTsKLX0KLQogc3RhdGljIHZvaWQgc2RtYV91cGRhdGVfY2hhbm5lbF9sb29wKHN0cnVjdCBzZG1hX2NoYW5uZWwgKnNkbWFjKQogewogCXN0cnVjdCBzZG1hX2J1ZmZlcl9kZXNjcmlwdG9yICpiZDsKKwlpbnQgZXJyb3IgPSAwOworCWVudW0gZG1hX3N0YXR1cwlvbGRfc3RhdHVzID0gc2RtYWMtPnN0YXR1czsKIAogCS8qCiAJICogbG9vcCBtb2RlLiBJdGVyYXRlIG92ZXIgZGVzY3JpcHRvcnMsIHJlLXNldHVwIHRoZW0gYW5kCkBAIC02NjgsMTcgKzY4Niw0MSBAQAogCQlpZiAoYmQtPm1vZGUuc3RhdHVzICYgQkRfRE9ORSkKIAkJCWJyZWFrOwogCi0JCWlmIChiZC0+bW9kZS5zdGF0dXMgJiBCRF9SUk9SKQorCQlpZiAoYmQtPm1vZGUuc3RhdHVzICYgQkRfUlJPUikgeworCQkJYmQtPm1vZGUuc3RhdHVzICY9IH5CRF9SUk9SOwogCQkJc2RtYWMtPnN0YXR1cyA9IERNQV9FUlJPUjsKKwkJCWVycm9yID0gLUVJTzsKKwkJfQogCisJICAgICAgIC8qCisJCSogV2UgdXNlIGJkLT5tb2RlLmNvdW50IHRvIGNhbGN1bGF0ZSB0aGUgcmVzaWR1ZSwgc2luY2UgY29udGFpbnMKKwkJKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgYnVmZmVyIGRlc2NyaXB0b3IuCisJCSovCisKKwkJc2RtYWMtPmNobl9yZWFsX2NvdW50ID0gYmQtPm1vZGUuY291bnQ7CiAJCWJkLT5tb2RlLnN0YXR1cyB8PSBCRF9ET05FOworCQliZC0+bW9kZS5jb3VudCA9IHNkbWFjLT5wZXJpb2RfbGVuOworCisJCS8qCisJCSAqIFRoZSBjYWxsYmFjayBpcyBjYWxsZWQgZnJvbSB0aGUgaW50ZXJydXB0IGNvbnRleHQgaW4gb3JkZXIKKwkJICogdG8gcmVkdWNlIGxhdGVuY3kgYW5kIHRvIGF2b2lkIHRoZSByaXNrIG9mIGFsdGVyaW5nIHRoZQorCQkgKiBTRE1BIHRyYW5zYWN0aW9uIHN0YXR1cyBieSB0aGUgdGltZSB0aGUgY2xpZW50IHRhc2tsZXQgaXMKKwkJICogZXhlY3V0ZWQuCisJCSAqLworCisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UoJnNkbWFjLT5kZXNjLCBOVUxMKTsKKwogCQlzZG1hYy0+YnVmX3RhaWwrKzsKIAkJc2RtYWMtPmJ1Zl90YWlsICU9IHNkbWFjLT5udW1fYmQ7CisKKwkJaWYgKGVycm9yKQorCQkJc2RtYWMtPnN0YXR1cyA9IG9sZF9zdGF0dXM7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBteGNfc2RtYV9oYW5kbGVfY2hhbm5lbF9ub3JtYWwoc3RydWN0IHNkbWFfY2hhbm5lbCAqc2RtYWMpCitzdGF0aWMgdm9pZCBteGNfc2RtYV9oYW5kbGVfY2hhbm5lbF9ub3JtYWwodW5zaWduZWQgbG9uZyBkYXRhKQogeworCXN0cnVjdCBzZG1hX2NoYW5uZWwgKnNkbWFjID0gKHN0cnVjdCBzZG1hX2NoYW5uZWwgKikgZGF0YTsKIAlzdHJ1Y3Qgc2RtYV9idWZmZXJfZGVzY3JpcHRvciAqYmQ7CiAJaW50IGksIGVycm9yID0gMDsKIApAQCAtNzAxLDE4ICs3NDMsOCBAQAogCQlzZG1hYy0+c3RhdHVzID0gRE1BX0NPTVBMRVRFOwogCiAJZG1hX2Nvb2tpZV9jb21wbGV0ZSgmc2RtYWMtPmRlc2MpOwotCWlmIChzZG1hYy0+ZGVzYy5jYWxsYmFjaykKLQkJc2RtYWMtPmRlc2MuY2FsbGJhY2soc2RtYWMtPmRlc2MuY2FsbGJhY2tfcGFyYW0pOwotfQogCi1zdGF0aWMgdm9pZCBzZG1hX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBzZG1hX2NoYW5uZWwgKnNkbWFjID0gKHN0cnVjdCBzZG1hX2NoYW5uZWwgKikgZGF0YTsKLQotCWlmIChzZG1hYy0+ZmxhZ3MgJiBJTVhfRE1BX1NHX0xPT1ApCi0JCXNkbWFfaGFuZGxlX2NoYW5uZWxfbG9vcChzZG1hYyk7Ci0JZWxzZQotCQlteGNfc2RtYV9oYW5kbGVfY2hhbm5lbF9ub3JtYWwoc2RtYWMpOworCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UoJnNkbWFjLT5kZXNjLCBOVUxMKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IHNkbWFfaW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQpAQCAtNzMxLDggKzc2Myw4IEBACiAKIAkJaWYgKHNkbWFjLT5mbGFncyAmIElNWF9ETUFfU0dfTE9PUCkKIAkJCXNkbWFfdXBkYXRlX2NoYW5uZWxfbG9vcChzZG1hYyk7Ci0KLQkJdGFza2xldF9zY2hlZHVsZSgmc2RtYWMtPnRhc2tsZXQpOworCQllbHNlCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZzZG1hYy0+dGFza2xldCk7CiAKIAkJX19jbGVhcl9iaXQoY2hhbm5lbCwgJnN0YXQpOwogCX0KQEAgLTEzNTMsNyArMTM4NSw4IEBACiAJdTMyIHJlc2lkdWU7CiAKIAlpZiAoc2RtYWMtPmZsYWdzICYgSU1YX0RNQV9TR19MT09QKQotCQlyZXNpZHVlID0gKHNkbWFjLT5udW1fYmQgLSBzZG1hYy0+YnVmX3RhaWwpICogc2RtYWMtPnBlcmlvZF9sZW47CisJCXJlc2lkdWUgPSAoc2RtYWMtPm51bV9iZCAtIHNkbWFjLT5idWZfdGFpbCkgKgorCQkJICAgc2RtYWMtPnBlcmlvZF9sZW4gLSBzZG1hYy0+Y2huX3JlYWxfY291bnQ7CiAJZWxzZQogCQlyZXNpZHVlID0gc2RtYWMtPmNobl9jb3VudCAtIHNkbWFjLT5jaG5fcmVhbF9jb3VudDsKIApAQCAtMTM3NSw2ICsxNDA4LDcgQEAKICNkZWZpbmUgU0RNQV9TQ1JJUFRfQUREUlNfQVJSQVlfU0laRV9WMQkzNAogI2RlZmluZSBTRE1BX1NDUklQVF9BRERSU19BUlJBWV9TSVpFX1YyCTM4CiAjZGVmaW5lIFNETUFfU0NSSVBUX0FERFJTX0FSUkFZX1NJWkVfVjMJNDEKKyNkZWZpbmUgU0RNQV9TQ1JJUFRfQUREUlNfQVJSQVlfU0laRV9WNAk0MgogCiBzdGF0aWMgdm9pZCBzZG1hX2FkZF9zY3JpcHRzKHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RtYSwKIAkJY29uc3Qgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzICphZGRyKQpAQCAtMTQyNCw2ICsxNDU4LDkgQEAKIAljYXNlIDM6CiAJCXNkbWEtPnNjcmlwdF9udW1iZXIgPSBTRE1BX1NDUklQVF9BRERSU19BUlJBWV9TSVpFX1YzOwogCQlicmVhazsKKwljYXNlIDQ6CisJCXNkbWEtPnNjcmlwdF9udW1iZXIgPSBTRE1BX1NDUklQVF9BRERSU19BUlJBWV9TSVpFX1Y0OworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKHNkbWEtPmRldiwgInVua25vd24gZmlybXdhcmUgdmVyc2lvblxuIik7CiAJCWdvdG8gZXJyX2Zpcm13YXJlOwpAQCAtMTczMiw3ICsxNzY5LDcgQEAKIAkJZG1hX2Nvb2tpZV9pbml0KCZzZG1hYy0+Y2hhbik7CiAJCXNkbWFjLT5jaGFubmVsID0gaTsKIAotCQl0YXNrbGV0X2luaXQoJnNkbWFjLT50YXNrbGV0LCBzZG1hX3Rhc2tsZXQsCisJCXRhc2tsZXRfaW5pdCgmc2RtYWMtPnRhc2tsZXQsIG14Y19zZG1hX2hhbmRsZV9jaGFubmVsX25vcm1hbCwKIAkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHNkbWFjKTsKIAkJLyoKIAkJICogQWRkIHRoZSBjaGFubmVsIHRvIHRoZSBETUFDIGxpc3QuIERvIG5vdCBhZGQgY2hhbm5lbCAwIHRob3VnaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdC9kbWEuYyBiL2RyaXZlcnMvZG1hL2lvYXQvZG1hLmMKaW5kZXggYmQwOTk2MS4uNDkzODZjZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lvYXQvZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvaW9hdC9kbWEuYwpAQCAtMzgsOCArMzgsNTQgQEAKIAogI2luY2x1ZGUgIi4uL2RtYWVuZ2luZS5oIgogCitzdGF0aWMgY2hhciAqY2hhbmVycl9zdHJbXSA9IHsKKwkiRE1BIFRyYW5zZmVyIERlc3RpbmF0aW9uIEFkZHJlc3MgRXJyb3IiLAorCSJOZXh0IERlc2NyaXB0b3IgQWRkcmVzcyBFcnJvciIsCisJIkRlc2NyaXB0b3IgRXJyb3IiLAorCSJDaGFuIEFkZHJlc3MgVmFsdWUgRXJyb3IiLAorCSJDSEFOQ01EIEVycm9yIiwKKwkiQ2hpcHNldCBVbmNvcnJlY3RhYmxlIERhdGEgSW50ZWdyaXR5IEVycm9yIiwKKwkiRE1BIFVuY29ycmVjdGFibGUgRGF0YSBJbnRlZ3JpdHkgRXJyb3IiLAorCSJSZWFkIERhdGEgRXJyb3IiLAorCSJXcml0ZSBEYXRhIEVycm9yIiwKKwkiRGVzY3JpcHRvciBDb250cm9sIEVycm9yIiwKKwkiRGVzY3JpcHRvciBUcmFuc2ZlciBTaXplIEVycm9yIiwKKwkiQ29tcGxldGlvbiBBZGRyZXNzIEVycm9yIiwKKwkiSW50ZXJydXB0IENvbmZpZ3VyYXRpb24gRXJyb3IiLAorCSJTdXBlciBleHRlbmRlZCBkZXNjcmlwdG9yIEFkZHJlc3MgRXJyb3IiLAorCSJVbmFmZmlsaWF0ZWQgRXJyb3IiLAorCSJDUkMgb3IgWE9SIFAgRXJyb3IiLAorCSJYT1IgUSBFcnJvciIsCisJIkRlc2NyaXB0b3IgQ291bnQgRXJyb3IiLAorCSJESUYgQWxsIEYgZGV0ZWN0IEVycm9yIiwKKwkiR3VhcmQgVGFnIHZlcmlmaWNhdGlvbiBFcnJvciIsCisJIkFwcGxpY2F0aW9uIFRhZyB2ZXJpZmljYXRpb24gRXJyb3IiLAorCSJSZWZlcmVuY2UgVGFnIHZlcmlmaWNhdGlvbiBFcnJvciIsCisJIkJ1bmRsZSBCaXQgRXJyb3IiLAorCSJSZXN1bHQgRElGIEFsbCBGIGRldGVjdCBFcnJvciIsCisJIlJlc3VsdCBHdWFyZCBUYWcgdmVyaWZpY2F0aW9uIEVycm9yIiwKKwkiUmVzdWx0IEFwcGxpY2F0aW9uIFRhZyB2ZXJpZmljYXRpb24gRXJyb3IiLAorCSJSZXN1bHQgUmVmZXJlbmNlIFRhZyB2ZXJpZmljYXRpb24gRXJyb3IiLAorCU5VTEwKK307CisKIHN0YXRpYyB2b2lkIGlvYXRfZWgoc3RydWN0IGlvYXRkbWFfY2hhbiAqaW9hdF9jaGFuKTsKIAorc3RhdGljIHZvaWQgaW9hdF9wcmludF9jaGFuZXJycyhzdHJ1Y3QgaW9hdGRtYV9jaGFuICppb2F0X2NoYW4sIHUzMiBjaGFuZXJyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaWYgKChjaGFuZXJyID4+IGkpICYgMSkgeworCQkJaWYgKGNoYW5lcnJfc3RyW2ldKSB7CisJCQkJZGV2X2Vycih0b19kZXYoaW9hdF9jaGFuKSwgIkVyciglZCk6ICVzXG4iLAorCQkJCQlpLCBjaGFuZXJyX3N0cltpXSk7CisJCQl9IGVsc2UKKwkJCQlicmVhazsKKwkJfQorCX0KK30KKwogLyoqCiAgKiBpb2F0X2RtYV9kb19pbnRlcnJ1cHQgLSBoYW5kbGVyIHVzZWQgZm9yIHNpbmdsZSB2ZWN0b3IgaW50ZXJydXB0IG1vZGUKICAqIEBpcnE6IGludGVycnVwdCBpZApAQCAtNTY4LDEyICs2MTQsMTQgQEAKIAogCQl0eCA9ICZkZXNjLT50eGQ7CiAJCWlmICh0eC0+Y29va2llKSB7CisJCQlzdHJ1Y3QgZG1hZW5naW5lX3Jlc3VsdCByZXM7CisKIAkJCWRtYV9jb29raWVfY29tcGxldGUodHgpOwogCQkJZG1hX2Rlc2NyaXB0b3JfdW5tYXAodHgpOwotCQkJaWYgKHR4LT5jYWxsYmFjaykgewotCQkJCXR4LT5jYWxsYmFjayh0eC0+Y2FsbGJhY2tfcGFyYW0pOwotCQkJCXR4LT5jYWxsYmFjayA9IE5VTEw7Ci0JCQl9CisJCQlyZXMucmVzdWx0ID0gRE1BX1RSQU5TX05PRVJST1I7CisJCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKHR4LCBOVUxMKTsKKwkJCXR4LT5jYWxsYmFjayA9IE5VTEw7CisJCQl0eC0+Y2FsbGJhY2tfcmVzdWx0ID0gTlVMTDsKIAkJfQogCiAJCWlmICh0eC0+cGh5cyA9PSBwaHlzX2NvbXBsZXRlKQpAQCAtNjIyLDcgKzY3MCw4IEBACiAJaWYgKGlzX2lvYXRfaGFsdGVkKCppb2F0X2NoYW4tPmNvbXBsZXRpb24pKSB7CiAJCXUzMiBjaGFuZXJyID0gcmVhZGwoaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkVSUl9PRkZTRVQpOwogCi0JCWlmIChjaGFuZXJyICYgSU9BVF9DSEFORVJSX0hBTkRMRV9NQVNLKSB7CisJCWlmIChjaGFuZXJyICYKKwkJICAgIChJT0FUX0NIQU5FUlJfSEFORExFX01BU0sgfCBJT0FUX0NIQU5FUlJfUkVDT1ZFUl9NQVNLKSkgewogCQkJbW9kX3RpbWVyKCZpb2F0X2NoYW4tPnRpbWVyLCBqaWZmaWVzICsgSURMRV9USU1FT1VUKTsKIAkJCWlvYXRfZWgoaW9hdF9jaGFuKTsKIAkJfQpAQCAtNjUyLDYgKzcwMSw2MSBAQAogCV9faW9hdF9yZXN0YXJ0X2NoYW4oaW9hdF9jaGFuKTsKIH0KIAorCitzdGF0aWMgdm9pZCBpb2F0X2Fib3J0X2Rlc2NzKHN0cnVjdCBpb2F0ZG1hX2NoYW4gKmlvYXRfY2hhbikKK3sKKwlzdHJ1Y3QgaW9hdGRtYV9kZXZpY2UgKmlvYXRfZG1hID0gaW9hdF9jaGFuLT5pb2F0X2RtYTsKKwlzdHJ1Y3QgaW9hdF9yaW5nX2VudCAqZGVzYzsKKwl1MTYgYWN0aXZlOworCWludCBpZHggPSBpb2F0X2NoYW4tPnRhaWwsIGk7CisKKwkvKgorCSAqIFdlIGFzc3VtZSB0aGF0IHRoZSBmYWlsZWQgZGVzY3JpcHRvciBoYXMgYmVlbiBwcm9jZXNzZWQuCisJICogTm93IHdlIGFyZSBqdXN0IHJldHVybmluZyBhbGwgdGhlIHJlbWFpbmluZyBzdWJtaXR0ZWQKKwkgKiBkZXNjcmlwdG9ycyB0byBhYm9ydC4KKwkgKi8KKwlhY3RpdmUgPSBpb2F0X3JpbmdfYWN0aXZlKGlvYXRfY2hhbik7CisKKwkvKiB3ZSBza2lwIHRoZSBmYWlsZWQgZGVzY3JpcHRvciB0aGF0IHRhaWwgcG9pbnRzIHRvICovCisJZm9yIChpID0gMTsgaSA8IGFjdGl2ZTsgaSsrKSB7CisJCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHg7CisKKwkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7CisJCXByZWZldGNoKGlvYXRfZ2V0X3JpbmdfZW50KGlvYXRfY2hhbiwgaWR4ICsgaSArIDEpKTsKKwkJZGVzYyA9IGlvYXRfZ2V0X3JpbmdfZW50KGlvYXRfY2hhbiwgaWR4ICsgaSk7CisKKwkJdHggPSAmZGVzYy0+dHhkOworCQlpZiAodHgtPmNvb2tpZSkgeworCQkJc3RydWN0IGRtYWVuZ2luZV9yZXN1bHQgcmVzOworCisJCQlkbWFfY29va2llX2NvbXBsZXRlKHR4KTsKKwkJCWRtYV9kZXNjcmlwdG9yX3VubWFwKHR4KTsKKwkJCXJlcy5yZXN1bHQgPSBETUFfVFJBTlNfQUJPUlRFRDsKKwkJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UodHgsICZyZXMpOworCQkJdHgtPmNhbGxiYWNrID0gTlVMTDsKKwkJCXR4LT5jYWxsYmFja19yZXN1bHQgPSBOVUxMOworCQl9CisKKwkJLyogc2tpcCBleHRlbmRlZCBkZXNjcmlwdG9ycyAqLworCQlpZiAoZGVzY19oYXNfZXh0KGRlc2MpKSB7CisJCQlXQVJOX09OKGkgKyAxID49IGFjdGl2ZSk7CisJCQlpKys7CisJCX0KKworCQkvKiBjbGVhbnVwIHN1cGVyIGV4dGVuZGVkIGRlc2NyaXB0b3JzICovCisJCWlmIChkZXNjLT5zZWQpIHsKKwkJCWlvYXRfZnJlZV9zZWQoaW9hdF9kbWEsIGRlc2MtPnNlZCk7CisJCQlkZXNjLT5zZWQgPSBOVUxMOworCQl9CisJfQorCisJc21wX21iKCk7IC8qIGZpbmlzaCBhbGwgZGVzY3JpcHRvciByZWFkcyBiZWZvcmUgaW5jcmVtZW50aW5nIHRhaWwgKi8KKwlpb2F0X2NoYW4tPnRhaWwgPSBpZHggKyBhY3RpdmU7CisKKwlkZXNjID0gaW9hdF9nZXRfcmluZ19lbnQoaW9hdF9jaGFuLCBpb2F0X2NoYW4tPnRhaWwpOworCWlvYXRfY2hhbi0+bGFzdF9jb21wbGV0aW9uID0gKmlvYXRfY2hhbi0+Y29tcGxldGlvbiA9IGRlc2MtPnR4ZC5waHlzOworfQorCiBzdGF0aWMgdm9pZCBpb2F0X2VoKHN0cnVjdCBpb2F0ZG1hX2NoYW4gKmlvYXRfY2hhbikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BkZXYoaW9hdF9jaGFuKTsKQEAgLTY2Miw2ICs3NjYsOCBAQAogCXUzMiBlcnJfaGFuZGxlZCA9IDA7CiAJdTMyIGNoYW5lcnJfaW50OwogCXUzMiBjaGFuZXJyOworCWJvb2wgYWJvcnQgPSBmYWxzZTsKKwlzdHJ1Y3QgZG1hZW5naW5lX3Jlc3VsdCByZXM7CiAKIAkvKiBjbGVhbnVwIHNvIHRhaWwgcG9pbnRzIHRvIGRlc2NyaXB0b3IgdGhhdCBjYXVzZWQgdGhlIGVycm9yICovCiAJaWYgKGlvYXRfY2xlYW51cF9wcmVhbWJsZShpb2F0X2NoYW4sICZwaHlzX2NvbXBsZXRlKSkKQEAgLTY5NywzMCArODAzLDU1IEBACiAJCWJyZWFrOwogCX0KIAorCWlmIChjaGFuZXJyICYgSU9BVF9DSEFORVJSX1JFQ09WRVJfTUFTSykgeworCQlpZiAoY2hhbmVyciAmIElPQVRfQ0hBTkVSUl9SRUFEX0RBVEFfRVJSKSB7CisJCQlyZXMucmVzdWx0ID0gRE1BX1RSQU5TX1JFQURfRkFJTEVEOworCQkJZXJyX2hhbmRsZWQgfD0gSU9BVF9DSEFORVJSX1JFQURfREFUQV9FUlI7CisJCX0gZWxzZSBpZiAoY2hhbmVyciAmIElPQVRfQ0hBTkVSUl9XUklURV9EQVRBX0VSUikgeworCQkJcmVzLnJlc3VsdCA9IERNQV9UUkFOU19XUklURV9GQUlMRUQ7CisJCQllcnJfaGFuZGxlZCB8PSBJT0FUX0NIQU5FUlJfV1JJVEVfREFUQV9FUlI7CisJCX0KKworCQlhYm9ydCA9IHRydWU7CisJfSBlbHNlCisJCXJlcy5yZXN1bHQgPSBETUFfVFJBTlNfTk9FUlJPUjsKKwogCS8qIGZhdWx0IG9uIHVuaGFuZGxlZCBlcnJvciBvciBzcHVyaW91cyBoYWx0ICovCiAJaWYgKGNoYW5lcnIgXiBlcnJfaGFuZGxlZCB8fCBjaGFuZXJyID09IDApIHsKIAkJZGV2X2Vycih0b19kZXYoaW9hdF9jaGFuKSwgIiVzOiBmYXRhbCBlcnJvciAoJXg6JXgpXG4iLAogCQkJX19mdW5jX18sIGNoYW5lcnIsIGVycl9oYW5kbGVkKTsKKwkJZGV2X2Vycih0b19kZXYoaW9hdF9jaGFuKSwgIkVycm9ycyBoYW5kbGVkOlxuIik7CisJCWlvYXRfcHJpbnRfY2hhbmVycnMoaW9hdF9jaGFuLCBlcnJfaGFuZGxlZCk7CisJCWRldl9lcnIodG9fZGV2KGlvYXRfY2hhbiksICJFcnJvcnMgbm90IGhhbmRsZWQ6XG4iKTsKKwkJaW9hdF9wcmludF9jaGFuZXJycyhpb2F0X2NoYW4sIChjaGFuZXJyICYgfmVycl9oYW5kbGVkKSk7CisKIAkJQlVHKCk7Ci0JfSBlbHNlIHsgLyogY2xlYW51cCB0aGUgZmF1bHR5IGRlc2NyaXB0b3IgKi8KLQkJdHggPSAmZGVzYy0+dHhkOwotCQlpZiAodHgtPmNvb2tpZSkgewotCQkJZG1hX2Nvb2tpZV9jb21wbGV0ZSh0eCk7Ci0JCQlkbWFfZGVzY3JpcHRvcl91bm1hcCh0eCk7Ci0JCQlpZiAodHgtPmNhbGxiYWNrKSB7Ci0JCQkJdHgtPmNhbGxiYWNrKHR4LT5jYWxsYmFja19wYXJhbSk7Ci0JCQkJdHgtPmNhbGxiYWNrID0gTlVMTDsKLQkJCX0KLQkJfQogCX0KIAotCXdyaXRlbChjaGFuZXJyLCBpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFORVJSX09GRlNFVCk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBJT0FUX1BDSV9DSEFORVJSX0lOVF9PRkZTRVQsIGNoYW5lcnJfaW50KTsKKwkvKiBjbGVhbnVwIHRoZSBmYXVsdHkgZGVzY3JpcHRvciBzaW5jZSB3ZSBhcmUgY29udGludWluZyAqLworCXR4ID0gJmRlc2MtPnR4ZDsKKwlpZiAodHgtPmNvb2tpZSkgeworCQlkbWFfY29va2llX2NvbXBsZXRlKHR4KTsKKwkJZG1hX2Rlc2NyaXB0b3JfdW5tYXAodHgpOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKHR4LCAmcmVzKTsKKwkJdHgtPmNhbGxiYWNrID0gTlVMTDsKKwkJdHgtPmNhbGxiYWNrX3Jlc3VsdCA9IE5VTEw7CisJfQogCiAJLyogbWFyayBmYXVsdGluZyBkZXNjcmlwdG9yIGFzIGNvbXBsZXRlICovCiAJKmlvYXRfY2hhbi0+Y29tcGxldGlvbiA9IGRlc2MtPnR4ZC5waHlzOwogCiAJc3Bpbl9sb2NrX2JoKCZpb2F0X2NoYW4tPnByZXBfbG9jayk7CisJLyogd2UgbmVlZCBhYm9ydCBhbGwgZGVzY3JpcHRvcnMgKi8KKwlpZiAoYWJvcnQpIHsKKwkJaW9hdF9hYm9ydF9kZXNjcyhpb2F0X2NoYW4pOworCQkvKiBjbGVhbiB1cCB0aGUgY2hhbm5lbCwgd2UgY291bGQgYmUgaW4gd2VpcmQgc3RhdGUgKi8KKwkJaW9hdF9yZXNldF9odyhpb2F0X2NoYW4pOworCX0KKworCXdyaXRlbChjaGFuZXJyLCBpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFORVJSX09GRlNFVCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBJT0FUX1BDSV9DSEFORVJSX0lOVF9PRkZTRVQsIGNoYW5lcnJfaW50KTsKKwogCWlvYXRfcmVzdGFydF9jaGFubmVsKGlvYXRfY2hhbik7CiAJc3Bpbl91bmxvY2tfYmgoJmlvYXRfY2hhbi0+cHJlcF9sb2NrKTsKIH0KQEAgLTc1MywxMCArODg0LDI4IEBACiAJCWNoYW5lcnIgPSByZWFkbChpb2F0X2NoYW4tPnJlZ19iYXNlICsgSU9BVF9DSEFORVJSX09GRlNFVCk7CiAJCWRldl9lcnIodG9fZGV2KGlvYXRfY2hhbiksICIlczogQ2hhbm5lbCBoYWx0ZWQgKCV4KVxuIiwKIAkJCV9fZnVuY19fLCBjaGFuZXJyKTsKLQkJaWYgKHRlc3RfYml0KElPQVRfUlVOLCAmaW9hdF9jaGFuLT5zdGF0ZSkpCi0JCQlCVUdfT04oaXNfaW9hdF9idWcoY2hhbmVycikpOwotCQllbHNlIC8qIHdlIG5ldmVyIGdvdCBvZmYgdGhlIGdyb3VuZCAqLwotCQkJcmV0dXJuOworCQlkZXZfZXJyKHRvX2Rldihpb2F0X2NoYW4pLCAiRXJyb3JzOlxuIik7CisJCWlvYXRfcHJpbnRfY2hhbmVycnMoaW9hdF9jaGFuLCBjaGFuZXJyKTsKKworCQlpZiAodGVzdF9iaXQoSU9BVF9SVU4sICZpb2F0X2NoYW4tPnN0YXRlKSkgeworCQkJc3Bpbl9sb2NrX2JoKCZpb2F0X2NoYW4tPmNsZWFudXBfbG9jayk7CisJCQlzcGluX2xvY2tfYmgoJmlvYXRfY2hhbi0+cHJlcF9sb2NrKTsKKwkJCXNldF9iaXQoSU9BVF9DSEFOX0RPV04sICZpb2F0X2NoYW4tPnN0YXRlKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPnByZXBfbG9jayk7CisKKwkJCWlvYXRfYWJvcnRfZGVzY3MoaW9hdF9jaGFuKTsKKwkJCWRldl93YXJuKHRvX2Rldihpb2F0X2NoYW4pLCAiUmVzZXQgY2hhbm5lbC4uLlxuIik7CisJCQlpb2F0X3Jlc2V0X2h3KGlvYXRfY2hhbik7CisJCQlkZXZfd2Fybih0b19kZXYoaW9hdF9jaGFuKSwgIlJlc3RhcnQgY2hhbm5lbC4uLlxuIik7CisJCQlpb2F0X3Jlc3RhcnRfY2hhbm5lbChpb2F0X2NoYW4pOworCisJCQlzcGluX2xvY2tfYmgoJmlvYXRfY2hhbi0+cHJlcF9sb2NrKTsKKwkJCWNsZWFyX2JpdChJT0FUX0NIQU5fRE9XTiwgJmlvYXRfY2hhbi0+c3RhdGUpOworCQkJc3Bpbl91bmxvY2tfYmgoJmlvYXRfY2hhbi0+cHJlcF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZpb2F0X2NoYW4tPmNsZWFudXBfbG9jayk7CisJCX0KKworCQlyZXR1cm47CiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZpb2F0X2NoYW4tPmNsZWFudXBfbG9jayk7CkBAIC03ODAsMTQgKzkyOSwyNiBAQAogCQl1MzIgY2hhbmVycjsKIAogCQljaGFuZXJyID0gcmVhZGwoaW9hdF9jaGFuLT5yZWdfYmFzZSArIElPQVRfQ0hBTkVSUl9PRkZTRVQpOwotCQlkZXZfd2Fybih0b19kZXYoaW9hdF9jaGFuKSwgIlJlc3RhcnRpbmcgY2hhbm5lbC4uLlxuIik7Ci0JCWRldl93YXJuKHRvX2Rldihpb2F0X2NoYW4pLCAiQ0hBTlNUUzogJSNMeCBDSEFORVJSOiAlI3hcbiIsCi0JCQkgc3RhdHVzLCBjaGFuZXJyKTsKLQkJZGV2X3dhcm4odG9fZGV2KGlvYXRfY2hhbiksICJBY3RpdmUgZGVzY3JpcHRvcnM6ICVkXG4iLAotCQkJIGlvYXRfcmluZ19hY3RpdmUoaW9hdF9jaGFuKSk7CisJCWRldl9lcnIodG9fZGV2KGlvYXRfY2hhbiksICJDSEFOU1RTOiAlI0x4IENIQU5FUlI6ICUjeFxuIiwKKwkJCXN0YXR1cywgY2hhbmVycik7CisJCWRldl9lcnIodG9fZGV2KGlvYXRfY2hhbiksICJFcnJvcnM6XG4iKTsKKwkJaW9hdF9wcmludF9jaGFuZXJycyhpb2F0X2NoYW4sIGNoYW5lcnIpOworCisJCWRldl9kYmcodG9fZGV2KGlvYXRfY2hhbiksICJBY3RpdmUgZGVzY3JpcHRvcnM6ICVkXG4iLAorCQkJaW9hdF9yaW5nX2FjdGl2ZShpb2F0X2NoYW4pKTsKIAogCQlzcGluX2xvY2tfYmgoJmlvYXRfY2hhbi0+cHJlcF9sb2NrKTsKKwkJc2V0X2JpdChJT0FUX0NIQU5fRE9XTiwgJmlvYXRfY2hhbi0+c3RhdGUpOworCQlzcGluX3VubG9ja19iaCgmaW9hdF9jaGFuLT5wcmVwX2xvY2spOworCisJCWlvYXRfYWJvcnRfZGVzY3MoaW9hdF9jaGFuKTsKKwkJZGV2X3dhcm4odG9fZGV2KGlvYXRfY2hhbiksICJSZXNldHRpbmcgY2hhbm5lbC4uLlxuIik7CisJCWlvYXRfcmVzZXRfaHcoaW9hdF9jaGFuKTsKKwkJZGV2X3dhcm4odG9fZGV2KGlvYXRfY2hhbiksICJSZXN0YXJ0aW5nIGNoYW5uZWwuLi5cbiIpOwogCQlpb2F0X3Jlc3RhcnRfY2hhbm5lbChpb2F0X2NoYW4pOworCisJCXNwaW5fbG9ja19iaCgmaW9hdF9jaGFuLT5wcmVwX2xvY2spOworCQljbGVhcl9iaXQoSU9BVF9DSEFOX0RPV04sICZpb2F0X2NoYW4tPnN0YXRlKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmlvYXRfY2hhbi0+cHJlcF9sb2NrKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmlvYXRfY2hhbi0+Y2xlYW51cF9sb2NrKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW9hdC9pbml0LmMgYi9kcml2ZXJzL2RtYS9pb2F0L2luaXQuYwppbmRleCA3MTQ1Zjc3Li4wMTVmNzExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pb2F0L2luaXQuYworKysgYi9kcml2ZXJzL2RtYS9pb2F0L2luaXQuYwpAQCAtODI4LDcgKzgyOCw3IEBACiAKIAlkZXN0X2RtYSA9IGRtYV9tYXBfcGFnZShkZXYsIGRlc3QsIDAsIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKIAlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBkZXN0X2RtYSkpCi0JCWdvdG8gZG1hX3VubWFwOworCQlnb3RvIGZyZWVfcmVzb3VyY2VzOwogCiAJZm9yIChpID0gMDsgaSA8IElPQVRfTlVNX1NSQ19URVNUOyBpKyspCiAJCWRtYV9zcmNzW2ldID0gRE1BX0VSUk9SX0NPREU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pb2F0L3JlZ2lzdGVycy5oIGIvZHJpdmVycy9kbWEvaW9hdC9yZWdpc3RlcnMuaAppbmRleCA3MDUzNDk4Li40OGZhNGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pb2F0L3JlZ2lzdGVycy5oCisrKyBiL2RyaXZlcnMvZG1hL2lvYXQvcmVnaXN0ZXJzLmgKQEAgLTI0MCw2ICsyNDAsOCBAQAogI2RlZmluZSBJT0FUX0NIQU5FUlJfREVTQ1JJUFRPUl9DT1VOVF9FUlIJMHg0MDAwMAogCiAjZGVmaW5lIElPQVRfQ0hBTkVSUl9IQU5ETEVfTUFTSyAoSU9BVF9DSEFORVJSX1hPUl9QX09SX0NSQ19FUlIgfCBJT0FUX0NIQU5FUlJfWE9SX1FfRVJSKQorI2RlZmluZSBJT0FUX0NIQU5FUlJfUkVDT1ZFUl9NQVNLIChJT0FUX0NIQU5FUlJfUkVBRF9EQVRBX0VSUiB8IFwKKwkJCQkgICBJT0FUX0NIQU5FUlJfV1JJVEVfREFUQV9FUlIpCiAKICNkZWZpbmUgSU9BVF9DSEFORVJSX01BU0tfT0ZGU0VUCQkweDJDCS8qIDMyLWJpdCBDaGFubmVsIEVycm9yIFJlZ2lzdGVyICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvcC1hZG1hLmMgYi9kcml2ZXJzL2RtYS9pb3AtYWRtYS5jCmluZGV4IGYwMzljZmEuLmE0MTA2NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lvcC1hZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvaW9wLWFkbWEuYwpAQCAtNzEsOCArNzEsNyBAQAogCQkvKiBjYWxsIHRoZSBjYWxsYmFjayAobXVzdCBub3Qgc2xlZXAgb3Igc3VibWl0IG5ldwogCQkgKiBvcGVyYXRpb25zIHRvIHRoaXMgY2hhbm5lbCkKIAkJICovCi0JCWlmICh0eC0+Y2FsbGJhY2spCi0JCQl0eC0+Y2FsbGJhY2sodHgtPmNhbGxiYWNrX3BhcmFtKTsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSh0eCwgTlVMTCk7CiAKIAkJZG1hX2Rlc2NyaXB0b3JfdW5tYXAodHgpOwogCQlpZiAoZGVzYy0+Z3JvdXBfaGVhZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lwdS9pcHVfaWRtYWMuYyBiL2RyaXZlcnMvZG1hL2lwdS9pcHVfaWRtYWMuYwppbmRleCBiNTRmNjJkLi5lZDc2MDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9pcHUvaXB1X2lkbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvaXB1L2lwdV9pZG1hYy5jCkBAIC0xMTYwLDExICsxMTYwLDEwIEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0ICoqc2csICpzZ25leHQsICpzZ25ldyA9IE5VTEw7CiAJLyogTmV4dCB0cmFuc2ZlciBkZXNjcmlwdG9yICovCiAJc3RydWN0IGlkbWFjX3R4X2Rlc2MgKmRlc2MsICpkZXNjbmV3OwotCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjazsKLQl2b2lkICpjYWxsYmFja19wYXJhbTsKIAlib29sIGRvbmUgPSBmYWxzZTsKIAl1MzIgcmVhZHkwLCByZWFkeTEsIGN1cmJ1ZiwgZXJyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrIGNiOwogCiAJLyogSURNQUMgaGFzIGNsZWFyZWQgdGhlIHJlc3BlY3RpdmUgQlVGeF9SRFkgYml0LCB3ZSBtYW5hZ2UgdGhlIGJ1ZmZlciAqLwogCkBAIC0xMjc4LDEyICsxMjc3LDEyIEBACiAKIAlpZiAobGlrZWx5KHNnbmV3KSAmJgogCSAgICBpcHVfc3VibWl0X2J1ZmZlcihpY2hhbiwgZGVzY25ldywgc2duZXcsIGljaGFuLT5hY3RpdmVfYnVmZmVyKSA8IDApIHsKLQkJY2FsbGJhY2sgPSBkZXNjbmV3LT50eGQuY2FsbGJhY2s7Ci0JCWNhbGxiYWNrX3BhcmFtID0gZGVzY25ldy0+dHhkLmNhbGxiYWNrX3BhcmFtOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmRlc2NuZXctPnR4ZCwgJmNiKTsKKwogCQlsaXN0X2RlbF9pbml0KCZkZXNjbmV3LT5saXN0KTsKIAkJc3Bpbl91bmxvY2soJmljaGFuLT5sb2NrKTsKLQkJaWYgKGNhbGxiYWNrKQotCQkJY2FsbGJhY2soY2FsbGJhY2tfcGFyYW0pOworCisJCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCQlzcGluX2xvY2soJmljaGFuLT5sb2NrKTsKIAl9CiAKQEAgLTEyOTIsMTMgKzEyOTEsMTIgQEAKIAlpZiAoZG9uZSkKIAkJZG1hX2Nvb2tpZV9jb21wbGV0ZSgmZGVzYy0+dHhkKTsKIAotCWNhbGxiYWNrID0gZGVzYy0+dHhkLmNhbGxiYWNrOwotCWNhbGxiYWNrX3BhcmFtID0gZGVzYy0+dHhkLmNhbGxiYWNrX3BhcmFtOworCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjaygmZGVzYy0+dHhkLCAmY2IpOwogCiAJc3Bpbl91bmxvY2soJmljaGFuLT5sb2NrKTsKIAotCWlmIChkb25lICYmIChkZXNjLT50eGQuZmxhZ3MgJiBETUFfUFJFUF9JTlRFUlJVUFQpICYmIGNhbGxiYWNrKQotCQljYWxsYmFjayhjYWxsYmFja19wYXJhbSk7CisJaWYgKGRvbmUgJiYgKGRlc2MtPnR4ZC5mbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVCkpCisJCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaXB1L2lwdV9pcnEuYyBiL2RyaXZlcnMvZG1hL2lwdS9pcHVfaXJxLmMKaW5kZXggMmJmMzdlNi4uZGQxODRiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaXB1L2lwdV9pcnEuYworKysgYi9kcml2ZXJzL2RtYS9pcHUvaXB1X2lycS5jCkBAIC0yODYsMjIgKzI4NiwyMSBAQAogCQlyYXdfc3Bpbl91bmxvY2soJmJhbmtfbG9jayk7CiAJCXdoaWxlICgobGluZSA9IGZmcyhzdGF0dXMpKSkgewogCQkJc3RydWN0IGlwdV9pcnFfbWFwICptYXA7Ci0JCQl1bnNpZ25lZCBpbnQgaXJxID0gTk9fSVJROworCQkJdW5zaWduZWQgaW50IGlycTsKIAogCQkJbGluZS0tOwogCQkJc3RhdHVzICY9IH4oMVVMIDw8IGxpbmUpOwogCiAJCQlyYXdfc3Bpbl9sb2NrKCZiYW5rX2xvY2spOwogCQkJbWFwID0gc3JjMm1hcCgzMiAqIGkgKyBsaW5lKTsKLQkJCWlmIChtYXApCi0JCQkJaXJxID0gbWFwLT5pcnE7Ci0JCQlyYXdfc3Bpbl91bmxvY2soJmJhbmtfbG9jayk7Ci0KIAkJCWlmICghbWFwKSB7CisJCQkJcmF3X3NwaW5fdW5sb2NrKCZiYW5rX2xvY2spOwogCQkJCXByX2VycigiSVBVOiBJbnRlcnJ1cHQgb24gdW5tYXBwZWQgc291cmNlICV1IGJhbmsgJWRcbiIsCiAJCQkJICAgICAgIGxpbmUsIGkpOwogCQkJCWNvbnRpbnVlOwogCQkJfQorCQkJaXJxID0gbWFwLT5pcnE7CisJCQlyYXdfc3Bpbl91bmxvY2soJmJhbmtfbG9jayk7CiAJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2szZG1hLmMgYi9kcml2ZXJzL2RtYS9rM2RtYS5jCmluZGV4IDM5ZGU4OTguLmFhYmNiNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2szZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvazNkbWEuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMgTGluYXJvIEx0ZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMyAtIDIwMTUgTGluYXJvIEx0ZC4KICAqIENvcHlyaWdodCAoYykgMjAxMyBIaXNpbGljb24gTGltaXRlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtOCw2ICs4LDggQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMjUsMjIgKzI3LDI4IEBACiAKICNkZWZpbmUgRFJJVkVSX05BTUUJCSJrMy1kbWEiCiAjZGVmaW5lIERNQV9NQVhfU0laRQkJMHgxZmZjCisjZGVmaW5lIERNQV9DWUNMSUNfTUFYX1BFUklPRAkweDEwMDAKKyNkZWZpbmUgTExJX0JMT0NLX1NJWkUJCSg0ICogUEFHRV9TSVpFKQogCiAjZGVmaW5lIElOVF9TVEFUCQkweDAwCiAjZGVmaW5lIElOVF9UQzEJCQkweDA0CisjZGVmaW5lIElOVF9UQzIJCQkweDA4CiAjZGVmaW5lIElOVF9FUlIxCQkweDBjCiAjZGVmaW5lIElOVF9FUlIyCQkweDEwCiAjZGVmaW5lIElOVF9UQzFfTUFTSwkJMHgxOAorI2RlZmluZSBJTlRfVEMyX01BU0sJCTB4MWMKICNkZWZpbmUgSU5UX0VSUjFfTUFTSwkJMHgyMAogI2RlZmluZSBJTlRfRVJSMl9NQVNLCQkweDI0CiAjZGVmaW5lIElOVF9UQzFfUkFXCQkweDYwMAotI2RlZmluZSBJTlRfRVJSMV9SQVcJCTB4NjA4Ci0jZGVmaW5lIElOVF9FUlIyX1JBVwkJMHg2MTAKKyNkZWZpbmUgSU5UX1RDMl9SQVcJCTB4NjA4CisjZGVmaW5lIElOVF9FUlIxX1JBVwkJMHg2MTAKKyNkZWZpbmUgSU5UX0VSUjJfUkFXCQkweDYxOAogI2RlZmluZSBDSF9QUkkJCQkweDY4OAogI2RlZmluZSBDSF9TVEFUCQkJMHg2OTAKICNkZWZpbmUgQ1hfQ1VSX0NOVAkJMHg3MDQKICNkZWZpbmUgQ1hfTExJCQkJMHg4MDAKLSNkZWZpbmUgQ1hfQ05UCQkJMHg4MTAKKyNkZWZpbmUgQ1hfQ05UMQkJCTB4ODBjCisjZGVmaW5lIENYX0NOVDAJCQkweDgxMAogI2RlZmluZSBDWF9TUkMJCQkweDgxNAogI2RlZmluZSBDWF9EU1QJCQkweDgxOAogI2RlZmluZSBDWF9DRkcJCQkweDgxYwpAQCAtNDksNiArNTcsNyBAQAogCiAjZGVmaW5lIENYX0xMSV9DSEFJTl9FTgkJMHgyCiAjZGVmaW5lIENYX0NGR19FTgkJMHgxCisjZGVmaW5lIENYX0NGR19OT0RFSVJRCQlCSVQoMSkKICNkZWZpbmUgQ1hfQ0ZHX01FTTJQRVIJCSgweDEgPDwgMikKICNkZWZpbmUgQ1hfQ0ZHX1BFUjJNRU0JCSgweDIgPDwgMikKICNkZWZpbmUgQ1hfQ0ZHX1NSQ0lOQ1IJCSgweDEgPDwgMzEpCkBAIC02OCw3ICs3Nyw3IEBACiAJZG1hX2FkZHJfdAkJZGVzY19od19sbGk7CiAJc2l6ZV90CQkJZGVzY19udW07CiAJc2l6ZV90CQkJc2l6ZTsKLQlzdHJ1Y3QgazNfZGVzY19odwlkZXNjX2h3WzBdOworCXN0cnVjdCBrM19kZXNjX2h3CSpkZXNjX2h3OwogfTsKIAogc3RydWN0IGszX2RtYV9waHk7CkBAIC04MSw2ICs5MCw3IEBACiAJZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcjsKIAlkbWFfYWRkcl90CQlkZXZfYWRkcjsKIAllbnVtIGRtYV9zdGF0dXMJCXN0YXR1czsKKwlib29sCQkJY3ljbGljOwogfTsKIAogc3RydWN0IGszX2RtYV9waHkgewpAQCAtMTAwLDYgKzExMCw3IEBACiAJc3RydWN0IGszX2RtYV9waHkJKnBoeTsKIAlzdHJ1Y3QgazNfZG1hX2NoYW4JKmNoYW5zOwogCXN0cnVjdCBjbGsJCSpjbGs7CisJc3RydWN0IGRtYV9wb29sCQkqcG9vbDsKIAl1MzIJCQlkbWFfY2hhbm5lbHM7CiAJdTMyCQkJZG1hX3JlcXVlc3RzOwogCXVuc2lnbmVkIGludAkJaXJxOwpAQCAtMTM1LDYgKzE0Niw3IEBACiAKIAl2YWwgPSAweDEgPDwgcGh5LT5pZHg7CiAJd3JpdGVsX3JlbGF4ZWQodmFsLCBkLT5iYXNlICsgSU5UX1RDMV9SQVcpOworCXdyaXRlbF9yZWxheGVkKHZhbCwgZC0+YmFzZSArIElOVF9UQzJfUkFXKTsKIAl3cml0ZWxfcmVsYXhlZCh2YWwsIGQtPmJhc2UgKyBJTlRfRVJSMV9SQVcpOwogCXdyaXRlbF9yZWxheGVkKHZhbCwgZC0+YmFzZSArIElOVF9FUlIyX1JBVyk7CiB9CkBAIC0xNDIsNyArMTU0LDcgQEAKIHN0YXRpYyB2b2lkIGszX2RtYV9zZXRfZGVzYyhzdHJ1Y3QgazNfZG1hX3BoeSAqcGh5LCBzdHJ1Y3QgazNfZGVzY19odyAqaHcpCiB7CiAJd3JpdGVsX3JlbGF4ZWQoaHctPmxsaSwgcGh5LT5iYXNlICsgQ1hfTExJKTsKLQl3cml0ZWxfcmVsYXhlZChody0+Y291bnQsIHBoeS0+YmFzZSArIENYX0NOVCk7CisJd3JpdGVsX3JlbGF4ZWQoaHctPmNvdW50LCBwaHktPmJhc2UgKyBDWF9DTlQwKTsKIAl3cml0ZWxfcmVsYXhlZChody0+c2FkZHIsIHBoeS0+YmFzZSArIENYX1NSQyk7CiAJd3JpdGVsX3JlbGF4ZWQoaHctPmRhZGRyLCBwaHktPmJhc2UgKyBDWF9EU1QpOwogCXdyaXRlbF9yZWxheGVkKEFYSV9DRkdfREVGQVVMVCwgcGh5LT5iYXNlICsgQVhJX0NGRyk7CkBAIC0xNzYsMTEgKzE4OCwxMyBAQAogCiAJCS8qIHVubWFzayBpcnEgKi8KIAkJd3JpdGVsX3JlbGF4ZWQoMHhmZmZmLCBkLT5iYXNlICsgSU5UX1RDMV9NQVNLKTsKKwkJd3JpdGVsX3JlbGF4ZWQoMHhmZmZmLCBkLT5iYXNlICsgSU5UX1RDMl9NQVNLKTsKIAkJd3JpdGVsX3JlbGF4ZWQoMHhmZmZmLCBkLT5iYXNlICsgSU5UX0VSUjFfTUFTSyk7CiAJCXdyaXRlbF9yZWxheGVkKDB4ZmZmZiwgZC0+YmFzZSArIElOVF9FUlIyX01BU0spOwogCX0gZWxzZSB7CiAJCS8qIG1hc2sgaXJxICovCiAJCXdyaXRlbF9yZWxheGVkKDB4MCwgZC0+YmFzZSArIElOVF9UQzFfTUFTSyk7CisJCXdyaXRlbF9yZWxheGVkKDB4MCwgZC0+YmFzZSArIElOVF9UQzJfTUFTSyk7CiAJCXdyaXRlbF9yZWxheGVkKDB4MCwgZC0+YmFzZSArIElOVF9FUlIxX01BU0spOwogCQl3cml0ZWxfcmVsYXhlZCgweDAsIGQtPmJhc2UgKyBJTlRfRVJSMl9NQVNLKTsKIAl9CkBAIC0xOTMsMjIgKzIwNywzMSBAQAogCXN0cnVjdCBrM19kbWFfY2hhbiAqYzsKIAl1MzIgc3RhdCA9IHJlYWRsX3JlbGF4ZWQoZC0+YmFzZSArIElOVF9TVEFUKTsKIAl1MzIgdGMxICA9IHJlYWRsX3JlbGF4ZWQoZC0+YmFzZSArIElOVF9UQzEpOworCXUzMiB0YzIgID0gcmVhZGxfcmVsYXhlZChkLT5iYXNlICsgSU5UX1RDMik7CiAJdTMyIGVycjEgPSByZWFkbF9yZWxheGVkKGQtPmJhc2UgKyBJTlRfRVJSMSk7CiAJdTMyIGVycjIgPSByZWFkbF9yZWxheGVkKGQtPmJhc2UgKyBJTlRfRVJSMik7CiAJdTMyIGksIGlycV9jaGFuID0gMDsKIAogCXdoaWxlIChzdGF0KSB7CiAJCWkgPSBfX2ZmcyhzdGF0KTsKLQkJc3RhdCAmPSAoc3RhdCAtIDEpOwotCQlpZiAobGlrZWx5KHRjMSAmIEJJVChpKSkpIHsKKwkJc3RhdCAmPSB+QklUKGkpOworCQlpZiAobGlrZWx5KHRjMSAmIEJJVChpKSkgfHwgKHRjMiAmIEJJVChpKSkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAkJCXAgPSAmZC0+cGh5W2ldOwogCQkJYyA9IHAtPnZjaGFuOwotCQkJaWYgKGMpIHsKLQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCisJCQlpZiAoYyAmJiAodGMxICYgQklUKGkpKSkgewogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZjLT52Yy5sb2NrLCBmbGFncyk7CiAJCQkJdmNoYW5fY29va2llX2NvbXBsZXRlKCZwLT5kc19ydW4tPnZkKTsKKwkJCQlXQVJOX09OX09OQ0UocC0+ZHNfZG9uZSk7CiAJCQkJcC0+ZHNfZG9uZSA9IHAtPmRzX3J1bjsKKwkJCQlwLT5kc19ydW4gPSBOVUxMOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWlmIChjICYmICh0YzIgJiBCSVQoaSkpKSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAocC0+ZHNfcnVuICE9IE5VTEwpCisJCQkJCXZjaGFuX2N5Y2xpY19jYWxsYmFjaygmcC0+ZHNfcnVuLT52ZCk7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+dmMubG9jaywgZmxhZ3MpOwogCQkJfQogCQkJaXJxX2NoYW4gfD0gQklUKGkpOwpAQCAtMjE4LDE0ICsyNDEsMTcgQEAKIAl9CiAKIAl3cml0ZWxfcmVsYXhlZChpcnFfY2hhbiwgZC0+YmFzZSArIElOVF9UQzFfUkFXKTsKKwl3cml0ZWxfcmVsYXhlZChpcnFfY2hhbiwgZC0+YmFzZSArIElOVF9UQzJfUkFXKTsKIAl3cml0ZWxfcmVsYXhlZChlcnIxLCBkLT5iYXNlICsgSU5UX0VSUjFfUkFXKTsKIAl3cml0ZWxfcmVsYXhlZChlcnIyLCBkLT5iYXNlICsgSU5UX0VSUjJfUkFXKTsKIAotCWlmIChpcnFfY2hhbikgeworCWlmIChpcnFfY2hhbikKIAkJdGFza2xldF9zY2hlZHVsZSgmZC0+dGFzayk7CisKKwlpZiAoaXJxX2NoYW4gfHwgZXJyMSB8fCBlcnIyKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfSBlbHNlCi0JCXJldHVybiBJUlFfTk9ORTsKKworCXJldHVybiBJUlFfTk9ORTsKIH0KIAogc3RhdGljIGludCBrM19kbWFfc3RhcnRfdHhkKHN0cnVjdCBrM19kbWFfY2hhbiAqYykKQEAgLTI0NywxNCArMjczLDE0IEBACiAJCSAqIHNvIHZjLT5kZXNjX2lzc3VlZCBvbmx5IGNvbnRhaW5zIGRlc2MgcGVuZGluZwogCQkgKi8KIAkJbGlzdF9kZWwoJmRzLT52ZC5ub2RlKTsKKworCQlXQVJOX09OX09OQ0UoYy0+cGh5LT5kc19ydW4pOworCQlXQVJOX09OX09OQ0UoYy0+cGh5LT5kc19kb25lKTsKIAkJYy0+cGh5LT5kc19ydW4gPSBkczsKLQkJYy0+cGh5LT5kc19kb25lID0gTlVMTDsKIAkJLyogc3RhcnQgZG1hICovCiAJCWszX2RtYV9zZXRfZGVzYyhjLT5waHksICZkcy0+ZGVzY19od1swXSk7CiAJCXJldHVybiAwOwogCX0KLQljLT5waHktPmRzX2RvbmUgPSBOVUxMOwotCWMtPnBoeS0+ZHNfcnVuID0gTlVMTDsKIAlyZXR1cm4gLUVBR0FJTjsKIH0KIApAQCAtMzUxLDcgKzM3Nyw3IEBACiAJICogaXRzIHRvdGFsIHNpemUuCiAJICovCiAJdmQgPSB2Y2hhbl9maW5kX2Rlc2MoJmMtPnZjLCBjb29raWUpOwotCWlmICh2ZCkgeworCWlmICh2ZCAmJiAhYy0+Y3ljbGljKSB7CiAJCWJ5dGVzID0gY29udGFpbmVyX29mKHZkLCBzdHJ1Y3QgazNfZG1hX2Rlc2Nfc3csIHZkKS0+c2l6ZTsKIAl9IGVsc2UgaWYgKCghcCkgfHwgKCFwLT5kc19ydW4pKSB7CiAJCWJ5dGVzID0gMDsKQEAgLTM2MSw3ICszODcsOCBAQAogCiAJCWJ5dGVzID0gazNfZG1hX2dldF9jdXJyX2NudChkLCBwKTsKIAkJY2xsaSA9IGszX2RtYV9nZXRfY3Vycl9sbGkocCk7Ci0JCWluZGV4ID0gKGNsbGkgLSBkcy0+ZGVzY19od19sbGkpIC8gc2l6ZW9mKHN0cnVjdCBrM19kZXNjX2h3KTsKKwkJaW5kZXggPSAoKGNsbGkgLSBkcy0+ZGVzY19od19sbGkpIC8KKwkJCQlzaXplb2Yoc3RydWN0IGszX2Rlc2NfaHcpKSArIDE7CiAJCWZvciAoOyBpbmRleCA8IGRzLT5kZXNjX251bTsgaW5kZXgrKykgewogCQkJYnl0ZXMgKz0gZHMtPmRlc2NfaHdbaW5kZXhdLmNvdW50OwogCQkJLyogZW5kIG9mIGxsaSAqLwpAQCAtNDAyLDkgKzQyOSwxMCBAQAogc3RhdGljIHZvaWQgazNfZG1hX2ZpbGxfZGVzYyhzdHJ1Y3QgazNfZG1hX2Rlc2Nfc3cgKmRzLCBkbWFfYWRkcl90IGRzdCwKIAkJCWRtYV9hZGRyX3Qgc3JjLCBzaXplX3QgbGVuLCB1MzIgbnVtLCB1MzIgY2NmZykKIHsKLQlpZiAoKG51bSArIDEpIDwgZHMtPmRlc2NfbnVtKQorCWlmIChudW0gIT0gZHMtPmRlc2NfbnVtIC0gMSkKIAkJZHMtPmRlc2NfaHdbbnVtXS5sbGkgPSBkcy0+ZGVzY19od19sbGkgKyAobnVtICsgMSkgKgogCQkJc2l6ZW9mKHN0cnVjdCBrM19kZXNjX2h3KTsKKwogCWRzLT5kZXNjX2h3W251bV0ubGxpIHw9IENYX0xMSV9DSEFJTl9FTjsKIAlkcy0+ZGVzY19od1tudW1dLmNvdW50ID0gbGVuOwogCWRzLT5kZXNjX2h3W251bV0uc2FkZHIgPSBzcmM7CkBAIC00MTIsNiArNDQwLDM1IEBACiAJZHMtPmRlc2NfaHdbbnVtXS5jb25maWcgPSBjY2ZnOwogfQogCitzdGF0aWMgc3RydWN0IGszX2RtYV9kZXNjX3N3ICprM19kbWFfYWxsb2NfZGVzY19yZXNvdXJjZShpbnQgbnVtLAorCQkJCQkJCXN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgazNfZG1hX2NoYW4gKmMgPSB0b19rM19jaGFuKGNoYW4pOworCXN0cnVjdCBrM19kbWFfZGVzY19zdyAqZHM7CisJc3RydWN0IGszX2RtYV9kZXYgKmQgPSB0b19rM19kbWEoY2hhbi0+ZGV2aWNlKTsKKwlpbnQgbGxpX2xpbWl0ID0gTExJX0JMT0NLX1NJWkUgLyBzaXplb2Yoc3RydWN0IGszX2Rlc2NfaHcpOworCisJaWYgKG51bSA+IGxsaV9saW1pdCkgeworCQlkZXZfZGJnKGNoYW4tPmRldmljZS0+ZGV2LCAidmNoICVwOiBzZyBudW0gJWQgZXhjZWVkIG1heCAlZFxuIiwKKwkJCSZjLT52YywgbnVtLCBsbGlfbGltaXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkcyA9IGt6YWxsb2Moc2l6ZW9mKCpkcyksIEdGUF9OT1dBSVQpOworCWlmICghZHMpCisJCXJldHVybiBOVUxMOworCisJZHMtPmRlc2NfaHcgPSBkbWFfcG9vbF9hbGxvYyhkLT5wb29sLCBHRlBfTk9XQUlULCAmZHMtPmRlc2NfaHdfbGxpKTsKKwlpZiAoIWRzLT5kZXNjX2h3KSB7CisJCWRldl9kYmcoY2hhbi0+ZGV2aWNlLT5kZXYsICJ2Y2ggJXA6IGRtYSBhbGxvYyBmYWlsXG4iLCAmYy0+dmMpOworCQlrZnJlZShkcyk7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoZHMtPmRlc2NfaHcsIDAsIHNpemVvZihzdHJ1Y3QgazNfZGVzY19odykgKiBudW0pOworCWRzLT5kZXNjX251bSA9IG51bTsKKwlyZXR1cm4gZHM7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmszX2RtYV9wcmVwX21lbWNweSgKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCWRtYV9hZGRyX3QgZHN0LCBkbWFfYWRkcl90IHNyYywKIAlzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQpAQCAtNDI1LDEzICs0ODIsMTMgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAludW0gPSBESVZfUk9VTkRfVVAobGVuLCBETUFfTUFYX1NJWkUpOwotCWRzID0ga3phbGxvYyhzaXplb2YoKmRzKSArIG51bSAqIHNpemVvZihkcy0+ZGVzY19od1swXSksIEdGUF9BVE9NSUMpOworCisJZHMgPSBrM19kbWFfYWxsb2NfZGVzY19yZXNvdXJjZShudW0sIGNoYW4pOwogCWlmICghZHMpCiAJCXJldHVybiBOVUxMOwogCi0JZHMtPmRlc2NfaHdfbGxpID0gX192aXJ0X3RvX3BoeXMoKHVuc2lnbmVkIGxvbmcpJmRzLT5kZXNjX2h3WzBdKTsKKwljLT5jeWNsaWMgPSAwOwogCWRzLT5zaXplID0gbGVuOwotCWRzLT5kZXNjX251bSA9IG51bTsKIAludW0gPSAwOwogCiAJaWYgKCFjLT5jY2ZnKSB7CkBAIC00NzQsMTggKzUzMSwxNyBAQAogCWlmIChzZ2wgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKKwljLT5jeWNsaWMgPSAwOworCiAJZm9yX2VhY2hfc2coc2dsLCBzZywgc2dsZW4sIGkpIHsKIAkJYXZhaWwgPSBzZ19kbWFfbGVuKHNnKTsKIAkJaWYgKGF2YWlsID4gRE1BX01BWF9TSVpFKQogCQkJbnVtICs9IERJVl9ST1VORF9VUChhdmFpbCwgRE1BX01BWF9TSVpFKSAtIDE7CiAJfQogCi0JZHMgPSBremFsbG9jKHNpemVvZigqZHMpICsgbnVtICogc2l6ZW9mKGRzLT5kZXNjX2h3WzBdKSwgR0ZQX0FUT01JQyk7CisJZHMgPSBrM19kbWFfYWxsb2NfZGVzY19yZXNvdXJjZShudW0sIGNoYW4pOwogCWlmICghZHMpCiAJCXJldHVybiBOVUxMOwotCi0JZHMtPmRlc2NfaHdfbGxpID0gX192aXJ0X3RvX3BoeXMoKHVuc2lnbmVkIGxvbmcpJmRzLT5kZXNjX2h3WzBdKTsKLQlkcy0+ZGVzY19udW0gPSBudW07CiAJbnVtID0gMDsKIAogCWZvcl9lYWNoX3NnKHNnbCwgc2csIHNnbGVuLCBpKSB7CkBAIC01MTYsNiArNTcyLDczIEBACiAJcmV0dXJuIHZjaGFuX3R4X3ByZXAoJmMtPnZjLCAmZHMtPnZkLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorazNfZG1hX3ByZXBfZG1hX2N5Y2xpYyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgYnVmX2FkZHIsCisJCSAgICAgICBzaXplX3QgYnVmX2xlbiwgc2l6ZV90IHBlcmlvZF9sZW4sCisJCSAgICAgICBlbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgazNfZG1hX2NoYW4gKmMgPSB0b19rM19jaGFuKGNoYW4pOworCXN0cnVjdCBrM19kbWFfZGVzY19zdyAqZHM7CisJc2l6ZV90IGxlbiwgYXZhaWwsIHRvdGFsID0gMDsKKwlkbWFfYWRkcl90IGFkZHIsIHNyYyA9IDAsIGRzdCA9IDA7CisJaW50IG51bSA9IDEsIHNpbmNlID0gMDsKKwlzaXplX3QgbW9kdWxvID0gRE1BX0NZQ0xJQ19NQVhfUEVSSU9EOworCXUzMiBlbl90YzIgPSAwOworCisJZGV2X2RiZyhjaGFuLT5kZXZpY2UtPmRldiwgIiVzOiBidWYgJXBhZCwgZHN0ICVwYWQsIGJ1ZiBsZW4gJXp1LCBwZXJpb2RfbGVuID0gJXp1LCBkaXIgJWRcbiIsCisJICAgICAgIF9fZnVuY19fLCAmYnVmX2FkZHIsICZ0b19rM19jaGFuKGNoYW4pLT5kZXZfYWRkciwKKwkgICAgICAgYnVmX2xlbiwgcGVyaW9kX2xlbiwgKGludClkaXIpOworCisJYXZhaWwgPSBidWZfbGVuOworCWlmIChhdmFpbCA+IG1vZHVsbykKKwkJbnVtICs9IERJVl9ST1VORF9VUChhdmFpbCwgbW9kdWxvKSAtIDE7CisKKwlkcyA9IGszX2RtYV9hbGxvY19kZXNjX3Jlc291cmNlKG51bSwgY2hhbik7CisJaWYgKCFkcykKKwkJcmV0dXJuIE5VTEw7CisKKwljLT5jeWNsaWMgPSAxOworCWFkZHIgPSBidWZfYWRkcjsKKwlhdmFpbCA9IGJ1Zl9sZW47CisJdG90YWwgPSBhdmFpbDsKKwludW0gPSAwOworCisJaWYgKHBlcmlvZF9sZW4gPCBtb2R1bG8pCisJCW1vZHVsbyA9IHBlcmlvZF9sZW47CisKKwlkbyB7CisJCWxlbiA9IG1pbl90KHNpemVfdCwgYXZhaWwsIG1vZHVsbyk7CisKKwkJaWYgKGRpciA9PSBETUFfTUVNX1RPX0RFVikgeworCQkJc3JjID0gYWRkcjsKKwkJCWRzdCA9IGMtPmRldl9hZGRyOworCQl9IGVsc2UgaWYgKGRpciA9PSBETUFfREVWX1RPX01FTSkgeworCQkJc3JjID0gYy0+ZGV2X2FkZHI7CisJCQlkc3QgPSBhZGRyOworCQl9CisJCXNpbmNlICs9IGxlbjsKKwkJaWYgKHNpbmNlID49IHBlcmlvZF9sZW4pIHsKKwkJCS8qIGRlc2NyaXB0b3IgYXNrcyBmb3IgVEMyIGludGVycnVwdCBvbiBjb21wbGV0aW9uICovCisJCQllbl90YzIgPSBDWF9DRkdfTk9ERUlSUTsKKwkJCXNpbmNlIC09IHBlcmlvZF9sZW47CisJCX0gZWxzZQorCQkJZW5fdGMyID0gMDsKKworCQlrM19kbWFfZmlsbF9kZXNjKGRzLCBkc3QsIHNyYywgbGVuLCBudW0rKywgYy0+Y2NmZyB8IGVuX3RjMik7CisKKwkJYWRkciArPSBsZW47CisJCWF2YWlsIC09IGxlbjsKKwl9IHdoaWxlIChhdmFpbCk7CisKKwkvKiAiQ3ljbGljIiA9PSBlbmQgb2YgbGluayBwb2ludHMgYmFjayB0byBzdGFydCBvZiBsaW5rICovCisJZHMtPmRlc2NfaHdbbnVtIC0gMV0ubGxpIHw9IGRzLT5kZXNjX2h3X2xsaTsKKworCWRzLT5zaXplID0gdG90YWw7CisKKwlyZXR1cm4gdmNoYW5fdHhfcHJlcCgmYy0+dmMsICZkcy0+dmQsIGZsYWdzKTsKK30KKwogc3RhdGljIGludCBrM19kbWFfY29uZmlnKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKIAkJCSBzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqY2ZnKQogewpAQCAtNTUxLDcgKzY3NCw3IEBACiAJYy0+Y2NmZyB8PSAodmFsIDw8IDEyKSB8ICh2YWwgPDwgMTYpOwogCiAJaWYgKChtYXhidXJzdCA9PSAwKSB8fCAobWF4YnVyc3QgPiAxNikpCi0JCXZhbCA9IDE2OworCQl2YWwgPSAxNTsKIAllbHNlCiAJCXZhbCA9IG1heGJ1cnN0IC0gMTsKIAljLT5jY2ZnIHw9ICh2YWwgPDwgMjApIHwgKHZhbCA8PCAyNCk7CkBAIC01NjMsNiArNjg2LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGszX2RtYV9mcmVlX2Rlc2Moc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkKQoreworCXN0cnVjdCBrM19kbWFfZGVzY19zdyAqZHMgPQorCQljb250YWluZXJfb2YodmQsIHN0cnVjdCBrM19kbWFfZGVzY19zdywgdmQpOworCXN0cnVjdCBrM19kbWFfZGV2ICpkID0gdG9fazNfZG1hKHZkLT50eC5jaGFuLT5kZXZpY2UpOworCisJZG1hX3Bvb2xfZnJlZShkLT5wb29sLCBkcy0+ZGVzY19odywgZHMtPmRlc2NfaHdfbGxpKTsKKwlrZnJlZShkcyk7Cit9CisKIHN0YXRpYyBpbnQgazNfZG1hX3Rlcm1pbmF0ZV9hbGwoc3RydWN0IGRtYV9jaGFuICpjaGFuKQogewogCXN0cnVjdCBrM19kbWFfY2hhbiAqYyA9IHRvX2szX2NoYW4oY2hhbik7CkBAIC01ODYsNyArNzE5LDE1IEBACiAJCWszX2RtYV90ZXJtaW5hdGVfY2hhbihwLCBkKTsKIAkJYy0+cGh5ID0gTlVMTDsKIAkJcC0+dmNoYW4gPSBOVUxMOwotCQlwLT5kc19ydW4gPSBwLT5kc19kb25lID0gTlVMTDsKKwkJaWYgKHAtPmRzX3J1bikgeworCQkJazNfZG1hX2ZyZWVfZGVzYygmcC0+ZHNfcnVuLT52ZCk7CisJCQlwLT5kc19ydW4gPSBOVUxMOworCQl9CisJCWlmIChwLT5kc19kb25lKSB7CisJCQlrM19kbWFfZnJlZV9kZXNjKCZwLT5kc19kb25lLT52ZCk7CisJCQlwLT5kc19kb25lID0gTlVMTDsKKwkJfQorCiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKIAl2Y2hhbl9kbWFfZGVzY19mcmVlX2xpc3QoJmMtPnZjLCAmaGVhZCk7CkBAIC02MzksMTQgKzc4MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGszX2RtYV9mcmVlX2Rlc2Moc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkKQotewotCXN0cnVjdCBrM19kbWFfZGVzY19zdyAqZHMgPQotCQljb250YWluZXJfb2YodmQsIHN0cnVjdCBrM19kbWFfZGVzY19zdywgdmQpOwotCi0Ja2ZyZWUoZHMpOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBrM19wZG1hX2R0X2lkc1tdID0gewogCXsgLmNvbXBhdGlibGUgPSAiaGlzaWxpY29uLGszLWRtYS0xLjAiLCB9LAogCXt9CkBAIC03MDYsNiArODM5LDEyIEBACiAKIAlkLT5pcnEgPSBpcnE7CiAKKwkvKiBBIERNQSBtZW1vcnkgcG9vbCBmb3IgTExJcywgYWxpZ24gb24gMzItYnl0ZSBib3VuZGFyeSAqLworCWQtPnBvb2wgPSBkbWFtX3Bvb2xfY3JlYXRlKERSSVZFUl9OQU1FLCAmb3AtPmRldiwKKwkJCQkJTExJX0JMT0NLX1NJWkUsIDMyLCAwKTsKKwlpZiAoIWQtPnBvb2wpCisJCXJldHVybiAtRU5PTUVNOworCiAJLyogaW5pdCBwaHkgY2hhbm5lbCAqLwogCWQtPnBoeSA9IGRldm1fa3phbGxvYygmb3AtPmRldiwKIAkJZC0+ZG1hX2NoYW5uZWxzICogc2l6ZW9mKHN0cnVjdCBrM19kbWFfcGh5KSwgR0ZQX0tFUk5FTCk7CkBAIC03MjIsMTEgKzg2MSwxMyBAQAogCUlOSVRfTElTVF9IRUFEKCZkLT5zbGF2ZS5jaGFubmVscyk7CiAJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBkLT5zbGF2ZS5jYXBfbWFzayk7CiAJZG1hX2NhcF9zZXQoRE1BX01FTUNQWSwgZC0+c2xhdmUuY2FwX21hc2spOworCWRtYV9jYXBfc2V0KERNQV9DWUNMSUMsIGQtPnNsYXZlLmNhcF9tYXNrKTsKIAlkLT5zbGF2ZS5kZXYgPSAmb3AtPmRldjsKIAlkLT5zbGF2ZS5kZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNlcyA9IGszX2RtYV9mcmVlX2NoYW5fcmVzb3VyY2VzOwogCWQtPnNsYXZlLmRldmljZV90eF9zdGF0dXMgPSBrM19kbWFfdHhfc3RhdHVzOwogCWQtPnNsYXZlLmRldmljZV9wcmVwX2RtYV9tZW1jcHkgPSBrM19kbWFfcHJlcF9tZW1jcHk7CiAJZC0+c2xhdmUuZGV2aWNlX3ByZXBfc2xhdmVfc2cgPSBrM19kbWFfcHJlcF9zbGF2ZV9zZzsKKwlkLT5zbGF2ZS5kZXZpY2VfcHJlcF9kbWFfY3ljbGljID0gazNfZG1hX3ByZXBfZG1hX2N5Y2xpYzsKIAlkLT5zbGF2ZS5kZXZpY2VfaXNzdWVfcGVuZGluZyA9IGszX2RtYV9pc3N1ZV9wZW5kaW5nOwogCWQtPnNsYXZlLmRldmljZV9jb25maWcgPSBrM19kbWFfY29uZmlnOwogCWQtPnNsYXZlLmRldmljZV9wYXVzZSA9IGszX2RtYV90cmFuc2Zlcl9wYXVzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21pY194MTAwX2RtYS5jIGIvZHJpdmVycy9kbWEvbWljX3gxMDBfZG1hLmMKaW5kZXggMTUwMmIyNC4uODE4MjU1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbWljX3gxMDBfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvbWljX3gxMDBfZG1hLmMKQEAgLTEwNCwxMCArMTA0LDggQEAKIAkJdHggPSAmY2gtPnR4X2FycmF5W2xhc3RfdGFpbF07CiAJCWlmICh0eC0+Y29va2llKSB7CiAJCQlkbWFfY29va2llX2NvbXBsZXRlKHR4KTsKLQkJCWlmICh0eC0+Y2FsbGJhY2spIHsKLQkJCQl0eC0+Y2FsbGJhY2sodHgtPmNhbGxiYWNrX3BhcmFtKTsKLQkJCQl0eC0+Y2FsbGJhY2sgPSBOVUxMOwotCQkJfQorCQkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSh0eCwgTlVMTCk7CisJCQl0eC0+Y2FsbGJhY2sgPSBOVUxMOwogCQl9CiAJCWxhc3RfdGFpbCA9IG1pY19kbWFfaHdfcmluZ19pbmMobGFzdF90YWlsKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tbXBfcGRtYS5jIGIvZHJpdmVycy9kbWEvbW1wX3BkbWEuYwppbmRleCBmNGIyNWZiLi5lYjNhMWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9tbXBfcGRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL21tcF9wZG1hLmMKQEAgLTg2NCwxOSArODY0LDE1IEBACiAJc3RydWN0IG1tcF9wZG1hX2Rlc2Nfc3cgKmRlc2MsICpfZGVzYzsKIAlMSVNUX0hFQUQoY2hhaW5fY2xlYW51cCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgY2I7CiAKIAlpZiAoY2hhbi0+Y3ljbGljX2ZpcnN0KSB7Ci0JCWRtYV9hc3luY190eF9jYWxsYmFjayBjYiA9IE5VTEw7Ci0JCXZvaWQgKmNiX2RhdGEgPSBOVUxMOwotCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5kZXNjX2xvY2ssIGZsYWdzKTsKIAkJZGVzYyA9IGNoYW4tPmN5Y2xpY19maXJzdDsKLQkJY2IgPSBkZXNjLT5hc3luY190eC5jYWxsYmFjazsKLQkJY2JfZGF0YSA9IGRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrX3BhcmFtOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmRlc2MtPmFzeW5jX3R4LCAmY2IpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5kZXNjX2xvY2ssIGZsYWdzKTsKIAotCQlpZiAoY2IpCi0JCQljYihjYl9kYXRhKTsKKwkJZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCZjYiwgTlVMTCk7CiAKIAkJcmV0dXJuOwogCX0KQEAgLTkyMSw4ICs5MTcsOCBAQAogCQkvKiBSZW1vdmUgZnJvbSB0aGUgbGlzdCBvZiB0cmFuc2FjdGlvbnMgKi8KIAkJbGlzdF9kZWwoJmRlc2MtPm5vZGUpOwogCQkvKiBSdW4gdGhlIGxpbmsgZGVzY3JpcHRvciBjYWxsYmFjayBmdW5jdGlvbiAqLwotCQlpZiAodHhkLT5jYWxsYmFjaykKLQkJCXR4ZC0+Y2FsbGJhY2sodHhkLT5jYWxsYmFja19wYXJhbSk7CisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjayh0eGQsICZjYik7CisJCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCiAJCWRtYV9wb29sX2ZyZWUoY2hhbi0+ZGVzY19wb29sLCBkZXNjLCB0eGQtPnBoeXMpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21tcF90ZG1hLmMgYi9kcml2ZXJzL2RtYS9tbXBfdGRtYS5jCmluZGV4IGIzNDQxZjUuLjEzYzY4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL21tcF90ZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvbW1wX3RkbWEuYwpAQCAtMzQ5LDkgKzM0OSw3IEBACiB7CiAJc3RydWN0IG1tcF90ZG1hX2NoYW4gKnRkbWFjID0gKHN0cnVjdCBtbXBfdGRtYV9jaGFuICopZGF0YTsKIAotCWlmICh0ZG1hYy0+ZGVzYy5jYWxsYmFjaykKLQkJdGRtYWMtPmRlc2MuY2FsbGJhY2sodGRtYWMtPmRlc2MuY2FsbGJhY2tfcGFyYW0pOwotCisJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSgmdGRtYWMtPmRlc2MsIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBtbXBfdGRtYV9mcmVlX2Rlc2NyaXB0b3Ioc3RydWN0IG1tcF90ZG1hX2NoYW4gKnRkbWFjKQpAQCAtNDMzLDcgKzQzMSw3IEBACiAKIAlpZiAocGVyaW9kX2xlbiA+IFRETUFfTUFYX1hGRVJfQllURVMpIHsKIAkJZGV2X2Vycih0ZG1hYy0+ZGV2LAotCQkJCSJtYXhpbXVtIHBlcmlvZCBzaXplIGV4Y2VlZGVkOiAlZCA+ICVkXG4iLAorCQkJCSJtYXhpbXVtIHBlcmlvZCBzaXplIGV4Y2VlZGVkOiAlenUgPiAlZFxuIiwKIAkJCQlwZXJpb2RfbGVuLCBURE1BX01BWF9YRkVSX0JZVEVTKTsKIAkJZ290byBlcnJfb3V0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21veGFydC1kbWEuYyBiL2RyaXZlcnMvZG1hL21veGFydC1kbWEuYwppbmRleCBhNmU2NDI3Li5lMWE1YzIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9tb3hhcnQtZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvbW94YXJ0LWRtYS5jCkBAIC01NzksNyArNTc5LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChub2RlLCAwKTsKLQlpZiAoaXJxID09IE5PX0lSUSkgeworCWlmICghaXJxKSB7CiAJCWRldl9lcnIoZGV2LCAibm8gSVJRIHJlc291cmNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbXBjNTEyeF9kbWEuYyBiL2RyaXZlcnMvZG1hL21wYzUxMnhfZG1hLmMKaW5kZXggZmE4NjU5Mi4uZGRlNzEzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbXBjNTEyeF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9tcGM1MTJ4X2RtYS5jCkBAIC00MTEsOCArNDExLDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShtZGVzYywgJmxpc3QsIG5vZGUpIHsKIAkJCWRlc2MgPSAmbWRlc2MtPmRlc2M7CiAKLQkJCWlmIChkZXNjLT5jYWxsYmFjaykKLQkJCQlkZXNjLT5jYWxsYmFjayhkZXNjLT5jYWxsYmFja19wYXJhbSk7CisJCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKGRlc2MsIE5VTEwpOwogCiAJCQlsYXN0X2Nvb2tpZSA9IGRlc2MtPmNvb2tpZTsKIAkJCWRtYV9ydW5fZGVwZW5kZW5jaWVzKGRlc2MpOwpAQCAtOTI2LDcgKzkyNSw3IEBACiAJfQogCiAJbWRtYS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZG4sIDApOwotCWlmIChtZG1hLT5pcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFtZG1hLT5pcnEpIHsKIAkJZGV2X2VycihkZXYsICJFcnJvciBtYXBwaW5nIElSUSFcbiIpOwogCQlyZXR2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGVycjsKQEAgLTkzNSw3ICs5MzQsNyBAQAogCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkbiwgImZzbCxtcGM4MzA4LWRtYSIpKSB7CiAJCW1kbWEtPmlzX21wYzgzMDggPSAxOwogCQltZG1hLT5pcnEyID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZG4sIDEpOwotCQlpZiAobWRtYS0+aXJxMiA9PSBOT19JUlEpIHsKKwkJaWYgKCFtZG1hLT5pcnEyKSB7CiAJCQlkZXZfZXJyKGRldiwgIkVycm9yIG1hcHBpbmcgSVJRIVxuIik7CiAJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJZ290byBlcnJfZGlzcG9zZTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tdl94b3IuYyBiL2RyaXZlcnMvZG1hL212X3hvci5jCmluZGV4IGY0YzlmOTguLjIzZjc1MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL212X3hvci5jCisrKyBiL2RyaXZlcnMvZG1hL212X3hvci5jCkBAIC0yMDYsMTQgKzIwNiwxMSBAQAogCWlmIChkZXNjLT5hc3luY190eC5jb29raWUgPiAwKSB7CiAJCWNvb2tpZSA9IGRlc2MtPmFzeW5jX3R4LmNvb2tpZTsKIAorCQlkbWFfZGVzY3JpcHRvcl91bm1hcCgmZGVzYy0+YXN5bmNfdHgpOwogCQkvKiBjYWxsIHRoZSBjYWxsYmFjayAobXVzdCBub3Qgc2xlZXAgb3Igc3VibWl0IG5ldwogCQkgKiBvcGVyYXRpb25zIHRvIHRoaXMgY2hhbm5lbCkKIAkJICovCi0JCWlmIChkZXNjLT5hc3luY190eC5jYWxsYmFjaykKLQkJCWRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrKAotCQkJCWRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrX3BhcmFtKTsKLQotCQlkbWFfZGVzY3JpcHRvcl91bm1hcCgmZGVzYy0+YXN5bmNfdHgpOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKCZkZXNjLT5hc3luY190eCwgTlVMTCk7CiAJfQogCiAJLyogcnVuIGRlcGVuZGVudCBvcGVyYXRpb25zICovCkBAIC00NzAsMTIgKzQ2Nyw5MCBAQAogCXJldHVybiBtdl9jaGFuLT5zbG90c19hbGxvY2F0ZWQgPyA6IC1FTk9NRU07CiB9CiAKKy8qCisgKiBDaGVjayBpZiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gaXMgYW4gUENJZS9JTyBhZGRyZXNzIChub24tU0RSQU0pIGFuZCBhZGQKKyAqIGEgbmV3IE1CdXMgd2luZG93IGlmIG5lY2Vzc2FyeS4gVXNlIGEgY2FjaGUgZm9yIHRoZXNlIGNoZWNrIHNvIHRoYXQKKyAqIHRoZSBNTUlPIG1hcHBlZCByZWdpc3RlcnMgZG9uJ3QgaGF2ZSB0byBiZSBhY2Nlc3NlZCBmb3IgdGhpcyBjaGVjaworICogdG8gc3BlZWQgdXAgdGhpcyBwcm9jZXNzLgorICovCitzdGF0aWMgaW50IG12X3hvcl9hZGRfaW9fd2luKHN0cnVjdCBtdl94b3JfY2hhbiAqbXZfY2hhbiwgdTMyIGFkZHIpCit7CisJc3RydWN0IG12X3hvcl9kZXZpY2UgKnhvcmRldiA9IG12X2NoYW4tPnhvcmRldjsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBtdl9jaGFuLT5tbXJfaGlnaF9iYXNlOworCXUzMiB3aW5fZW5hYmxlOworCXUzMiBzaXplOworCXU4IHRhcmdldCwgYXR0cjsKKwlpbnQgcmV0OworCWludCBpOworCisJLyogTm90aGluZyBuZWVkcyB0byBnZXQgZG9uZSBmb3IgdGhlIEFybWFkYSAzNzAwICovCisJaWYgKHhvcmRldi0+eG9yX3R5cGUgPT0gWE9SX0FSTUFEQV8zN1hYKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogTG9vcCBvdmVyIHRoZSBjYWNoZWQgd2luZG93cyB0byBjaGVjaywgaWYgdGhlIHJlcXVlc3RlZCBhcmVhCisJICogaXMgYWxyZWFkeSBtYXBwZWQuIElmIHRoaXMgdGhlIGNhc2UsIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZQorCSAqIGFuZCB3ZSBjYW4gcmV0dXJuLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBXSU5ET1dfQ09VTlQ7IGkrKykgeworCQlpZiAoYWRkciA+PSB4b3JkZXYtPndpbl9zdGFydFtpXSAmJgorCQkgICAgYWRkciA8PSB4b3JkZXYtPndpbl9lbmRbaV0pIHsKKwkJCS8qIFdpbmRvdyBpcyBhbHJlYWR5IG1hcHBlZCAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoZSB3aW5kb3cgaXMgbm90IG1hcHBlZCwgc28gd2UgbmVlZCB0byBjcmVhdGUgdGhlIG5ldyBtYXBwaW5nCisJICovCisKKwkvKiBJZiBubyBJTyB3aW5kb3cgaXMgZm91bmQgdGhhdCBhZGRyIGhhcyB0byBiZSBsb2NhdGVkIGluIFNEUkFNICovCisJcmV0ID0gbXZlYnVfbWJ1c19nZXRfaW9fd2luX2luZm8oYWRkciwgJnNpemUsICZ0YXJnZXQsICZhdHRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIE1hc2sgdGhlIGJhc2UgYWRkciAnYWRkcicgYWNjb3JkaW5nIHRvICdzaXplJyByZWFkIGJhY2sgZnJvbSB0aGUKKwkgKiBNQnVzIHdpbmRvdy4gT3RoZXJ3aXNlIHdlIG1pZ2h0IGVuZCB1cCB3aXRoIGFuIGFkZHJlc3MgbG9jYXRlZAorCSAqIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoaXMgYXJlYSBoZXJlLgorCSAqLworCXNpemUgLT0gMTsKKwlhZGRyICY9IH5zaXplOworCisJLyoKKwkgKiBSZWFkaW5nIG9uZSBvZiBib3RoIGVuYWJsZWQgcmVnaXN0ZXIgaXMgZW5vdWdoLCBhcyB0aGV5IGFyZSBhbHdheXMKKwkgKiBwcm9ncmFtbWVkIHRvIHRoZSBpZGVudGljYWwgdmFsdWVzCisJICovCisJd2luX2VuYWJsZSA9IHJlYWRsKGJhc2UgKyBXSU5ET1dfQkFSX0VOQUJMRSgwKSk7CisKKwkvKiBTZXQgJ2knIHRvIHRoZSBmaXJzdCBmcmVlIHdpbmRvdyB0byB3cml0ZSB0aGUgbmV3IHZhbHVlcyB0byAqLworCWkgPSBmZnMofndpbl9lbmFibGUpIC0gMTsKKwlpZiAoaSA+PSBXSU5ET1dfQ09VTlQpCisJCXJldHVybiAtRU5PTUVNOworCisJd3JpdGVsKChhZGRyICYgMHhmZmZmMDAwMCkgfCAoYXR0ciA8PCA4KSB8IHRhcmdldCwKKwkgICAgICAgYmFzZSArIFdJTkRPV19CQVNFKGkpKTsKKwl3cml0ZWwoc2l6ZSAmIDB4ZmZmZjAwMDAsIGJhc2UgKyBXSU5ET1dfU0laRShpKSk7CisKKwkvKiBGaWxsIHRoZSBjYWNoaW5nIHZhcmlhYmxlcyBmb3IgbGF0ZXIgdXNlICovCisJeG9yZGV2LT53aW5fc3RhcnRbaV0gPSBhZGRyOworCXhvcmRldi0+d2luX2VuZFtpXSA9IGFkZHIgKyBzaXplOworCisJd2luX2VuYWJsZSB8PSAoMSA8PCBpKTsKKwl3aW5fZW5hYmxlIHw9IDMgPDwgKDE2ICsgKDIgKiBpKSk7CisJd3JpdGVsKHdpbl9lbmFibGUsIGJhc2UgKyBXSU5ET1dfQkFSX0VOQUJMRSgwKSk7CisJd3JpdGVsKHdpbl9lbmFibGUsIGJhc2UgKyBXSU5ET1dfQkFSX0VOQUJMRSgxKSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCiBtdl94b3JfcHJlcF9kbWFfeG9yKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkZXN0LCBkbWFfYWRkcl90ICpzcmMsCiAJCSAgICB1bnNpZ25lZCBpbnQgc3JjX2NudCwgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlzdHJ1Y3QgbXZfeG9yX2NoYW4gKm12X2NoYW4gPSB0b19tdl94b3JfY2hhbihjaGFuKTsKIAlzdHJ1Y3QgbXZfeG9yX2Rlc2Nfc2xvdCAqc3dfZGVzYzsKKwlpbnQgcmV0OwogCiAJaWYgKHVubGlrZWx5KGxlbiA8IE1WX1hPUl9NSU5fQllURV9DT1VOVCkpCiAJCXJldHVybiBOVUxMOwpAQCAtNDg2LDYgKzU2MSwxMSBAQAogCQkiJXMgc3JjX2NudDogJWQgbGVuOiAlenUgZGVzdCAlcGFkIGZsYWdzOiAlbGRcbiIsCiAJCV9fZnVuY19fLCBzcmNfY250LCBsZW4sICZkZXN0LCBmbGFncyk7CiAKKwkvKiBDaGVjayBpZiBhIG5ldyB3aW5kb3cgbmVlZHMgdG8gZ2V0IGFkZGVkIGZvciAnZGVzdCcgKi8KKwlyZXQgPSBtdl94b3JfYWRkX2lvX3dpbihtdl9jaGFuLCBkZXN0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gTlVMTDsKKwogCXN3X2Rlc2MgPSBtdl9jaGFuX2FsbG9jX3Nsb3QobXZfY2hhbik7CiAJaWYgKHN3X2Rlc2MpIHsKIAkJc3dfZGVzYy0+dHlwZSA9IERNQV9YT1I7CkBAIC00OTMsOCArNTczLDEzIEBACiAJCW12X2Rlc2NfaW5pdChzd19kZXNjLCBkZXN0LCBsZW4sIGZsYWdzKTsKIAkJaWYgKG12X2NoYW4tPm9wX2luX2Rlc2MgPT0gWE9SX01PREVfSU5fREVTQykKIAkJCW12X2Rlc2Nfc2V0X21vZGUoc3dfZGVzYyk7Ci0JCXdoaWxlIChzcmNfY250LS0pCisJCXdoaWxlIChzcmNfY250LS0pIHsKKwkJCS8qIENoZWNrIGlmIGEgbmV3IHdpbmRvdyBuZWVkcyB0byBnZXQgYWRkZWQgZm9yICdzcmMnICovCisJCQlyZXQgPSBtdl94b3JfYWRkX2lvX3dpbihtdl9jaGFuLCBzcmNbc3JjX2NudF0pOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gTlVMTDsKIAkJCW12X2Rlc2Nfc2V0X3NyY19hZGRyKHN3X2Rlc2MsIHNyY19jbnQsIHNyY1tzcmNfY250XSk7CisJCX0KIAl9CiAKIAlkZXZfZGJnKG12X2NoYW5fdG9fZGV2cChtdl9jaGFuKSwKQEAgLTk1OSw2ICsxMDQ0LDcgQEAKIAkJbXZfY2hhbi0+b3BfaW5fZGVzYyA9IFhPUl9NT0RFX0lOX0RFU0M7CiAKIAlkbWFfZGV2ID0gJm12X2NoYW4tPmRtYWRldjsKKwltdl9jaGFuLT54b3JkZXYgPSB4b3JkZXY7CiAKIAkvKgogCSAqIFRoZXNlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZHVtbXkgYnVmZmVycyBhcmUgdXNlZCB0byBpbXBsZW1lbnQKQEAgLTEwODYsNiArMTE3MiwxMCBAQAogCQkgICAgICAgZHJhbS0+bWJ1c19kcmFtX3RhcmdldF9pZCwgYmFzZSArIFdJTkRPV19CQVNFKGkpKTsKIAkJd3JpdGVsKChjcy0+c2l6ZSAtIDEpICYgMHhmZmZmMDAwMCwgYmFzZSArIFdJTkRPV19TSVpFKGkpKTsKIAorCQkvKiBGaWxsIHRoZSBjYWNoaW5nIHZhcmlhYmxlcyBmb3IgbGF0ZXIgdXNlICovCisJCXhvcmRldi0+d2luX3N0YXJ0W2ldID0gY3MtPmJhc2U7CisJCXhvcmRldi0+d2luX2VuZFtpXSA9IGNzLT5iYXNlICsgY3MtPnNpemUgLSAxOworCiAJCXdpbl9lbmFibGUgfD0gKDEgPDwgaSk7CiAJCXdpbl9lbmFibGUgfD0gMyA8PCAoMTYgKyAoMiAqIGkpKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tdl94b3IuaCBiL2RyaXZlcnMvZG1hL212X3hvci5oCmluZGV4IGJmNTZlMDguLjg4ZWVhYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL212X3hvci5oCisrKyBiL2RyaXZlcnMvZG1hL212X3hvci5oCkBAIC04MCwxMiArODAsMTcgQEAKICNkZWZpbmUgV0lORE9XX0JBUl9FTkFCTEUoY2hhbikJKDB4NDAgKyAoKGNoYW4pIDw8IDIpKQogI2RlZmluZSBXSU5ET1dfT1ZFUlJJREVfQ1RSTChjaGFuKQkoMHhBMCArICgoY2hhbikgPDwgMikpCiAKKyNkZWZpbmUgV0lORE9XX0NPVU5UCQk4CisKIHN0cnVjdCBtdl94b3JfZGV2aWNlIHsKIAl2b2lkIF9faW9tZW0JICAgICAqeG9yX2Jhc2U7CiAJdm9pZCBfX2lvbWVtCSAgICAgKnhvcl9oaWdoX2Jhc2U7CiAJc3RydWN0IGNsawkgICAgICpjbGs7CiAJc3RydWN0IG12X3hvcl9jaGFuICAgKmNoYW5uZWxzW01WX1hPUl9NQVhfQ0hBTk5FTFNdOwogCWludAkJICAgICB4b3JfdHlwZTsKKworCXUzMiAgICAgICAgICAgICAgICAgIHdpbl9zdGFydFtXSU5ET1dfQ09VTlRdOworCXUzMiAgICAgICAgICAgICAgICAgIHdpbl9lbmRbV0lORE9XX0NPVU5UXTsKIH07CiAKIC8qKgpAQCAtMTI3LDYgKzEzMiw4IEBACiAJY2hhcgkJCWR1bW15X2RzdFtNVl9YT1JfTUlOX0JZVEVfQ09VTlRdOwogCWRtYV9hZGRyX3QJCWR1bW15X3NyY19hZGRyLCBkdW1teV9kc3RfYWRkcjsKIAl1MzIgICAgICAgICAgICAgICAgICAgICBzYXZlZF9jb25maWdfcmVnLCBzYXZlZF9pbnRfbWFza19yZWc7CisKKwlzdHJ1Y3QgbXZfeG9yX2RldmljZQkqeG9yZGV2OwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9teHMtZG1hLmMgYi9kcml2ZXJzL2RtYS9teHMtZG1hLmMKaW5kZXggNjBkZTM1Mi4uZTIxNzI2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbXhzLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL214cy1kbWEuYwpAQCAtMzI2LDggKzMyNiw3IEBACiB7CiAJc3RydWN0IG14c19kbWFfY2hhbiAqbXhzX2NoYW4gPSAoc3RydWN0IG14c19kbWFfY2hhbiAqKSBkYXRhOwogCi0JaWYgKG14c19jaGFuLT5kZXNjLmNhbGxiYWNrKQotCQlteHNfY2hhbi0+ZGVzYy5jYWxsYmFjayhteHNfY2hhbi0+ZGVzYy5jYWxsYmFja19wYXJhbSk7CisJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSgmbXhzX2NoYW4tPmRlc2MsIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IG14c19kbWFfaXJxX3RvX2NoYW4oc3RydWN0IG14c19kbWFfZW5naW5lICpteHNfZG1hLCBpbnQgaXJxKQpAQCAtNDI5LDEyICs0MjgsMTAgQEAKIAkJZ290byBlcnJfYWxsb2M7CiAJfQogCi0JaWYgKG14c19jaGFuLT5jaGFuX2lycSAhPSBOT19JUlEpIHsKLQkJcmV0ID0gcmVxdWVzdF9pcnEobXhzX2NoYW4tPmNoYW5faXJxLCBteHNfZG1hX2ludF9oYW5kbGVyLAotCQkJCQkwLCAibXhzLWRtYSIsIG14c19kbWEpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJfaXJxOwotCX0KKwlyZXQgPSByZXF1ZXN0X2lycShteHNfY2hhbi0+Y2hhbl9pcnEsIG14c19kbWFfaW50X2hhbmRsZXIsCisJCQkgIDAsICJteHMtZG1hIiwgbXhzX2RtYSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfaXJxOwogCiAJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG14c19kbWEtPmNsayk7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL25icGZheGkuYyBiL2RyaXZlcnMvZG1hL25icGZheGkuYwppbmRleCAwOGM0NWMxLi4wOWRlNzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9uYnBmYXhpLmMKKysrIGIvZHJpdmVycy9kbWEvbmJwZmF4aS5jCkBAIC0xMTAyLDggKzExMDIsNyBAQAogewogCXN0cnVjdCBuYnBmX2NoYW5uZWwgKmNoYW4gPSAoc3RydWN0IG5icGZfY2hhbm5lbCAqKWRhdGE7CiAJc3RydWN0IG5icGZfZGVzYyAqZGVzYywgKnRtcDsKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2s7Ci0Jdm9pZCAqcGFyYW07CisJc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrIGNiOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZjaGFuLT5kb25lKSkgewogCQlib29sIGZvdW5kID0gZmFsc2UsIG11c3RfcHV0LCByZWN5Y2xpbmcgPSBmYWxzZTsKQEAgLTExNTEsMTQgKzExNTAsMTIgQEAKIAkJCW11c3RfcHV0ID0gZmFsc2U7CiAJCX0KIAotCQljYWxsYmFjayA9IGRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrOwotCQlwYXJhbSA9IGRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrX3BhcmFtOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmRlc2MtPmFzeW5jX3R4LCAmY2IpOwogCiAJCS8qIGFjayBhbmQgY2FsbGJhY2sgY29tcGxldGVkIGRlc2NyaXB0b3IgKi8KIAkJc3Bpbl91bmxvY2tfaXJxKCZjaGFuLT5sb2NrKTsKIAotCQlpZiAoY2FsbGJhY2spCi0JCQljYWxsYmFjayhwYXJhbSk7CisJCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCiAJCWlmIChtdXN0X3B1dCkKIAkJCW5icGZfZGVzY19wdXQoZGVzYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9vbWFwLWRtYS5jIGIvZHJpdmVycy9kbWEvb21hcC1kbWEuYwppbmRleCBkOTljYTJiLi43Y2EyN2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9vbWFwLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL29tYXAtZG1hLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0zMiwxMCArMzMsMTIgQEAKIAljb25zdCBzdHJ1Y3Qgb21hcF9kbWFfcmVnICpyZWdfbWFwOwogCXN0cnVjdCBvbWFwX3N5c3RlbV9kbWFfcGxhdF9pbmZvICpwbGF0OwogCWJvb2wgbGVnYWN5OworCWJvb2wgbGwxMjNfc3VwcG9ydGVkOworCXN0cnVjdCBkbWFfcG9vbCAqZGVzY19wb29sOwogCXVuc2lnbmVkIGRtYV9yZXF1ZXN0czsKIAlzcGlubG9ja190IGlycV9sb2NrOwogCXVpbnQzMl90IGlycV9lbmFibGVfbWFzazsKLQlzdHJ1Y3Qgb21hcF9jaGFuICpsY2hfbWFwW09NQVBfU0RNQV9DSEFOTkVMU107CisJc3RydWN0IG9tYXBfY2hhbiAqKmxjaF9tYXA7CiB9OwogCiBzdHJ1Y3Qgb21hcF9jaGFuIHsKQEAgLTU1LDE2ICs1OCw0MCBAQAogCXVuc2lnbmVkIHNnaWR4OwogfTsKIAorI2RlZmluZSBERVNDX05YVF9TVl9SRUZSRVNICSgweDEgPDwgMjQpCisjZGVmaW5lIERFU0NfTlhUX1NWX1JFVVNFCSgweDIgPDwgMjQpCisjZGVmaW5lIERFU0NfTlhUX0RWX1JFRlJFU0gJKDB4MSA8PCAyNikKKyNkZWZpbmUgREVTQ19OWFRfRFZfUkVVU0UJKDB4MiA8PCAyNikKKyNkZWZpbmUgREVTQ19OVFlQRV9UWVBFMgkoMHgyIDw8IDI5KQorCisvKiBUeXBlIDIgZGVzY3JpcHRvciB3aXRoIFNvdXJjZSBvciBEZXN0aW5hdGlvbiBhZGRyZXNzIHVwZGF0ZSAqLworc3RydWN0IG9tYXBfdHlwZTJfZGVzYyB7CisJdWludDMyX3QgbmV4dF9kZXNjOworCXVpbnQzMl90IGVuOworCXVpbnQzMl90IGFkZHI7IC8qIHNyYyBvciBkc3QgKi8KKwl1aW50MTZfdCBmbjsKKwl1aW50MTZfdCBjaWNyOworCWludDE2X3QgY2RlaTsKKwlpbnQxNl90IGNzZWk7CisJaW50MzJfdCBjZGZpOworCWludDMyX3QgY3NmaTsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCBvbWFwX3NnIHsKIAlkbWFfYWRkcl90IGFkZHI7CiAJdWludDMyX3QgZW47CQkvKiBudW1iZXIgb2YgZWxlbWVudHMgKDI0LWJpdCkgKi8KIAl1aW50MzJfdCBmbjsJCS8qIG51bWJlciBvZiBmcmFtZXMgKDE2LWJpdCkgKi8KIAlpbnQzMl90IGZpOwkJLyogZm9yIGRvdWJsZSBpbmRleGluZyAqLwogCWludDE2X3QgZWk7CQkvKiBmb3IgZG91YmxlIGluZGV4aW5nICovCisKKwkvKiBMaW5rZWQgbGlzdCAqLworCXN0cnVjdCBvbWFwX3R5cGUyX2Rlc2MgKnQyX2Rlc2M7CisJZG1hX2FkZHJfdCB0Ml9kZXNjX3BhZGRyOwogfTsKIAogc3RydWN0IG9tYXBfZGVzYyB7CiAJc3RydWN0IHZpcnRfZG1hX2Rlc2MgdmQ7CisJYm9vbCB1c2luZ19sbDsKIAllbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyOwogCWRtYV9hZGRyX3QgZGV2X2FkZHI7CiAKQEAgLTgxLDYgKzEwOCw5IEBACiB9OwogCiBlbnVtIHsKKwlDQVBTXzBfU1VQUE9SVF9MTDEyMwk9IEJJVCgyMCksCS8qIExpbmtlZCBMaXN0IHR5cGUxLzIvMyAqLworCUNBUFNfMF9TVVBQT1JUX0xMNAk9IEJJVCgyMSksCS8qIExpbmtlZCBMaXN0IHR5cGU0ICovCisKIAlDQ1JfRlMJCQk9IEJJVCg1KSwKIAlDQ1JfUkVBRF9QUklPUklUWQk9IEJJVCg2KSwKIAlDQ1JfRU5BQkxFCQk9IEJJVCg3KSwKQEAgLTE1MSw2ICsxODEsMTkgQEAKIAlDSUNSX1NVUEVSX0JMT0NLX0lFCT0gQklUKDE0KSwJLyogT01BUDIrIG9ubHkgKi8KIAogCUNMTktfQ1RSTF9FTkFCTEVfTE5LCT0gQklUKDE1KSwKKworCUNEUF9EU1RfVkFMSURfSU5DCT0gMCA8PCAwLAorCUNEUF9EU1RfVkFMSURfUkVMT0FECT0gMSA8PCAwLAorCUNEUF9EU1RfVkFMSURfUkVVU0UJPSAyIDw8IDAsCisJQ0RQX1NSQ19WQUxJRF9JTkMJPSAwIDw8IDIsCisJQ0RQX1NSQ19WQUxJRF9SRUxPQUQJPSAxIDw8IDIsCisJQ0RQX1NSQ19WQUxJRF9SRVVTRQk9IDIgPDwgMiwKKwlDRFBfTlRZUEVfVFlQRTEJCT0gMSA8PCA0LAorCUNEUF9OVFlQRV9UWVBFMgkJPSAyIDw8IDQsCisJQ0RQX05UWVBFX1RZUEUzCQk9IDMgPDwgNCwKKwlDRFBfVE1PREVfTk9STUFMCT0gMCA8PCA4LAorCUNEUF9UTU9ERV9MTElTVAkJPSAxIDw8IDgsCisJQ0RQX0ZBU1QJCT0gQklUKDEwKSwKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBlc19ieXRlc1tdID0gewpAQCAtMTgwLDcgKzIyMyw2NCBAQAogCiBzdGF0aWMgdm9pZCBvbWFwX2RtYV9kZXNjX2ZyZWUoc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkKQogewotCWtmcmVlKGNvbnRhaW5lcl9vZih2ZCwgc3RydWN0IG9tYXBfZGVzYywgdmQpKTsKKwlzdHJ1Y3Qgb21hcF9kZXNjICpkID0gdG9fb21hcF9kbWFfZGVzYygmdmQtPnR4KTsKKworCWlmIChkLT51c2luZ19sbCkgeworCQlzdHJ1Y3Qgb21hcF9kbWFkZXYgKm9kID0gdG9fb21hcF9kbWFfZGV2KHZkLT50eC5jaGFuLT5kZXZpY2UpOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgZC0+c2dsZW47IGkrKykgeworCQkJaWYgKGQtPnNnW2ldLnQyX2Rlc2MpCisJCQkJZG1hX3Bvb2xfZnJlZShvZC0+ZGVzY19wb29sLCBkLT5zZ1tpXS50Ml9kZXNjLAorCQkJCQkgICAgICBkLT5zZ1tpXS50Ml9kZXNjX3BhZGRyKTsKKwkJfQorCX0KKworCWtmcmVlKGQpOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2RtYV9maWxsX3R5cGUyX2Rlc2Moc3RydWN0IG9tYXBfZGVzYyAqZCwgaW50IGlkeCwKKwkJCQkgICAgIGVudW0gZG1hX3RyYW5zZmVyX2RpcmVjdGlvbiBkaXIsIGJvb2wgbGFzdCkKK3sKKwlzdHJ1Y3Qgb21hcF9zZyAqc2cgPSAmZC0+c2dbaWR4XTsKKwlzdHJ1Y3Qgb21hcF90eXBlMl9kZXNjICp0Ml9kZXNjID0gc2ctPnQyX2Rlc2M7CisKKwlpZiAoaWR4KQorCQlkLT5zZ1tpZHggLSAxXS50Ml9kZXNjLT5uZXh0X2Rlc2MgPSBzZy0+dDJfZGVzY19wYWRkcjsKKwlpZiAobGFzdCkKKwkJdDJfZGVzYy0+bmV4dF9kZXNjID0gMHhmZmZmZmZmYzsKKworCXQyX2Rlc2MtPmVuID0gc2ctPmVuOworCXQyX2Rlc2MtPmFkZHIgPSBzZy0+YWRkcjsKKwl0Ml9kZXNjLT5mbiA9IHNnLT5mbiAmIDB4ZmZmZjsKKwl0Ml9kZXNjLT5jaWNyID0gZC0+Y2ljcjsKKwlpZiAoIWxhc3QpCisJCXQyX2Rlc2MtPmNpY3IgJj0gfkNJQ1JfQkxPQ0tfSUU7CisKKwlzd2l0Y2ggKGRpcikgeworCWNhc2UgRE1BX0RFVl9UT19NRU06CisJCXQyX2Rlc2MtPmNkZWkgPSBzZy0+ZWk7CisJCXQyX2Rlc2MtPmNzZWkgPSBkLT5laTsKKwkJdDJfZGVzYy0+Y2RmaSA9IHNnLT5maTsKKwkJdDJfZGVzYy0+Y3NmaSA9IGQtPmZpOworCisJCXQyX2Rlc2MtPmVuIHw9IERFU0NfTlhUX0RWX1JFRlJFU0g7CisJCXQyX2Rlc2MtPmVuIHw9IERFU0NfTlhUX1NWX1JFVVNFOworCQlicmVhazsKKwljYXNlIERNQV9NRU1fVE9fREVWOgorCQl0Ml9kZXNjLT5jZGVpID0gZC0+ZWk7CisJCXQyX2Rlc2MtPmNzZWkgPSBzZy0+ZWk7CisJCXQyX2Rlc2MtPmNkZmkgPSBkLT5maTsKKwkJdDJfZGVzYy0+Y3NmaSA9IHNnLT5maTsKKworCQl0Ml9kZXNjLT5lbiB8PSBERVNDX05YVF9TVl9SRUZSRVNIOworCQl0Ml9kZXNjLT5lbiB8PSBERVNDX05YVF9EVl9SRVVTRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCXQyX2Rlc2MtPmVuIHw9IERFU0NfTlRZUEVfVFlQRTI7CiB9CiAKIHN0YXRpYyB2b2lkIG9tYXBfZG1hX3dyaXRlKHVpbnQzMl90IHZhbCwgdW5zaWduZWQgdHlwZSwgdm9pZCBfX2lvbWVtICphZGRyKQpAQCAtMjg1LDYgKzM4NSw3IEBACiBzdGF0aWMgdm9pZCBvbWFwX2RtYV9zdGFydChzdHJ1Y3Qgb21hcF9jaGFuICpjLCBzdHJ1Y3Qgb21hcF9kZXNjICpkKQogewogCXN0cnVjdCBvbWFwX2RtYWRldiAqb2QgPSB0b19vbWFwX2RtYV9kZXYoYy0+dmMuY2hhbi5kZXZpY2UpOworCXVpbnQxNl90IGNpY3IgPSBkLT5jaWNyOwogCiAJaWYgKF9fZG1hX29tYXAxNXh4KG9kLT5wbGF0LT5kbWFfYXR0cikpCiAJCW9tYXBfZG1hX2NoYW5fd3JpdGUoYywgQ1BDLCAwKTsKQEAgLTI5Myw4ICszOTQsMjcgQEAKIAogCW9tYXBfZG1hX2NsZWFyX2NzcihjKTsKIAorCWlmIChkLT51c2luZ19sbCkgeworCQl1aW50MzJfdCBjZHAgPSBDRFBfVE1PREVfTExJU1QgfCBDRFBfTlRZUEVfVFlQRTIgfCBDRFBfRkFTVDsKKworCQlpZiAoZC0+ZGlyID09IERNQV9ERVZfVE9fTUVNKQorCQkJY2RwIHw9IChDRFBfRFNUX1ZBTElEX1JFTE9BRCB8IENEUF9TUkNfVkFMSURfUkVVU0UpOworCQllbHNlCisJCQljZHAgfD0gKENEUF9EU1RfVkFMSURfUkVVU0UgfCBDRFBfU1JDX1ZBTElEX1JFTE9BRCk7CisJCW9tYXBfZG1hX2NoYW5fd3JpdGUoYywgQ0RQLCBjZHApOworCisJCW9tYXBfZG1hX2NoYW5fd3JpdGUoYywgQ05EUCwgZC0+c2dbMF0udDJfZGVzY19wYWRkcik7CisJCW9tYXBfZG1hX2NoYW5fd3JpdGUoYywgQ0NETiwgMCk7CisJCW9tYXBfZG1hX2NoYW5fd3JpdGUoYywgQ0NGTiwgMHhmZmZmKTsKKwkJb21hcF9kbWFfY2hhbl93cml0ZShjLCBDQ0VOLCAweGZmZmZmZik7CisKKwkJY2ljciAmPSB+Q0lDUl9CTE9DS19JRTsKKwl9IGVsc2UgaWYgKG9kLT5sbDEyM19zdXBwb3J0ZWQpIHsKKwkJb21hcF9kbWFfY2hhbl93cml0ZShjLCBDRFAsIDApOworCX0KKwogCS8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCi0Jb21hcF9kbWFfY2hhbl93cml0ZShjLCBDSUNSLCBkLT5jaWNyKTsKKwlvbWFwX2RtYV9jaGFuX3dyaXRlKGMsIENJQ1IsIGNpY3IpOwogCiAJLyogRW5hYmxlIGNoYW5uZWwgKi8KIAlvbWFwX2RtYV9jaGFuX3dyaXRlKGMsIENDUiwgZC0+Y2NyIHwgQ0NSX0VOQUJMRSk7CkBAIC0zNjUsMTAgKzQ4NSw5IEBACiAJYy0+cnVubmluZyA9IGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCBvbWFwX2RtYV9zdGFydF9zZyhzdHJ1Y3Qgb21hcF9jaGFuICpjLCBzdHJ1Y3Qgb21hcF9kZXNjICpkLAotCXVuc2lnbmVkIGlkeCkKK3N0YXRpYyB2b2lkIG9tYXBfZG1hX3N0YXJ0X3NnKHN0cnVjdCBvbWFwX2NoYW4gKmMsIHN0cnVjdCBvbWFwX2Rlc2MgKmQpCiB7Ci0Jc3RydWN0IG9tYXBfc2cgKnNnID0gZC0+c2cgKyBpZHg7CisJc3RydWN0IG9tYXBfc2cgKnNnID0gZC0+c2cgKyBjLT5zZ2lkeDsKIAl1bnNpZ25lZCBjeHNhLCBjeGVpLCBjeGZpOwogCiAJaWYgKGQtPmRpciA9PSBETUFfREVWX1RPX01FTSB8fCBkLT5kaXIgPT0gRE1BX01FTV9UT19NRU0pIHsKQEAgLTM4OCw2ICs1MDcsNyBAQAogCW9tYXBfZG1hX2NoYW5fd3JpdGUoYywgQ0ZOLCBzZy0+Zm4pOwogCiAJb21hcF9kbWFfc3RhcnQoYywgZCk7CisJYy0+c2dpZHgrKzsKIH0KIAogc3RhdGljIHZvaWQgb21hcF9kbWFfc3RhcnRfZGVzYyhzdHJ1Y3Qgb21hcF9jaGFuICpjKQpAQCAtNDMzLDcgKzU1Myw3IEBACiAJb21hcF9kbWFfY2hhbl93cml0ZShjLCBDU0RQLCBkLT5jc2RwKTsKIAlvbWFwX2RtYV9jaGFuX3dyaXRlKGMsIENMTktfQ1RSTCwgZC0+Y2xua19jdHJsKTsKIAotCW9tYXBfZG1hX3N0YXJ0X3NnKGMsIGQsIDApOworCW9tYXBfZG1hX3N0YXJ0X3NnKGMsIGQpOwogfQogCiBzdGF0aWMgdm9pZCBvbWFwX2RtYV9jYWxsYmFjayhpbnQgY2gsIHUxNiBzdGF0dXMsIHZvaWQgKmRhdGEpCkBAIC00NDUsMTUgKzU2NSwxMyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZjLT52Yy5sb2NrLCBmbGFncyk7CiAJZCA9IGMtPmRlc2M7CiAJaWYgKGQpIHsKLQkJaWYgKCFjLT5jeWNsaWMpIHsKLQkJCWlmICgrK2MtPnNnaWR4IDwgZC0+c2dsZW4pIHsKLQkJCQlvbWFwX2RtYV9zdGFydF9zZyhjLCBkLCBjLT5zZ2lkeCk7Ci0JCQl9IGVsc2UgewotCQkJCW9tYXBfZG1hX3N0YXJ0X2Rlc2MoYyk7Ci0JCQkJdmNoYW5fY29va2llX2NvbXBsZXRlKCZkLT52ZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7CisJCWlmIChjLT5jeWNsaWMpIHsKIAkJCXZjaGFuX2N5Y2xpY19jYWxsYmFjaygmZC0+dmQpOworCQl9IGVsc2UgaWYgKGQtPnVzaW5nX2xsIHx8IGMtPnNnaWR4ID09IGQtPnNnbGVuKSB7CisJCQlvbWFwX2RtYV9zdGFydF9kZXNjKGMpOworCQkJdmNoYW5fY29va2llX2NvbXBsZXRlKCZkLT52ZCk7CisJCX0gZWxzZSB7CisJCQlvbWFwX2RtYV9zdGFydF9zZyhjLCBkKTsKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7CkBAIC01MDMsNiArNjIxLDcgQEAKIHsKIAlzdHJ1Y3Qgb21hcF9kbWFkZXYgKm9kID0gdG9fb21hcF9kbWFfZGV2KGNoYW4tPmRldmljZSk7CiAJc3RydWN0IG9tYXBfY2hhbiAqYyA9IHRvX29tYXBfZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gb2QtPmRkZXYuZGV2OwogCWludCByZXQ7CiAKIAlpZiAob2QtPmxlZ2FjeSkgewpAQCAtNTEzLDggKzYzMiw3IEBACiAJCQkJICAgICAgICZjLT5kbWFfY2gpOwogCX0KIAotCWRldl9kYmcob2QtPmRkZXYuZGV2LCAiYWxsb2NhdGluZyBjaGFubmVsICV1IGZvciAldVxuIiwKLQkJYy0+ZG1hX2NoLCBjLT5kbWFfc2lnKTsKKwlkZXZfZGJnKGRldiwgImFsbG9jYXRpbmcgY2hhbm5lbCAldSBmb3IgJXVcbiIsIGMtPmRtYV9jaCwgYy0+ZG1hX3NpZyk7CiAKIAlpZiAocmV0ID49IDApIHsKIAkJb21hcF9kbWFfYXNzaWduKG9kLCBjLCBjLT5kbWFfY2gpOwpAQCAtNTcwLDcgKzY4OCw4IEBACiAJdmNoYW5fZnJlZV9jaGFuX3Jlc291cmNlcygmYy0+dmMpOwogCW9tYXBfZnJlZV9kbWEoYy0+ZG1hX2NoKTsKIAotCWRldl9kYmcob2QtPmRkZXYuZGV2LCAiZnJlZWluZyBjaGFubmVsIGZvciAldVxuIiwgYy0+ZG1hX3NpZyk7CisJZGV2X2RiZyhvZC0+ZGRldi5kZXYsICJmcmVlaW5nIGNoYW5uZWwgJXUgdXNlZCBmb3IgJXVcbiIsIGMtPmRtYV9jaCwKKwkJYy0+ZG1hX3NpZyk7CiAJYy0+ZG1hX3NpZyA9IDA7CiB9CiAKQEAgLTc0NCw2ICs4NjMsNyBAQAogCXN0cnVjdCBvbWFwX2Rlc2MgKmQ7CiAJZG1hX2FkZHJfdCBkZXZfYWRkcjsKIAl1bnNpZ25lZCBpLCBlcywgZW4sIGZyYW1lX2J5dGVzOworCWJvb2wgbGxfZmFpbGVkID0gZmFsc2U7CiAJdTMyIGJ1cnN0OwogCiAJaWYgKGRpciA9PSBETUFfREVWX1RPX01FTSkgewpAQCAtNzg0LDEzICs5MDQsMTYgQEAKIAlkLT5lcyA9IGVzOwogCiAJZC0+Y2NyID0gYy0+Y2NyIHwgQ0NSX1NZTkNfRlJBTUU7Ci0JaWYgKGRpciA9PSBETUFfREVWX1RPX01FTSkKKwlpZiAoZGlyID09IERNQV9ERVZfVE9fTUVNKSB7CiAJCWQtPmNjciB8PSBDQ1JfRFNUX0FNT0RFX1BPU1RJTkMgfCBDQ1JfU1JDX0FNT0RFX0NPTlNUQU5UOwotCWVsc2UKKwkJZC0+Y3NkcCA9IENTRFBfRFNUX0JVUlNUXzY0IHwgQ1NEUF9EU1RfUEFDS0VEOworCX0gZWxzZSB7CiAJCWQtPmNjciB8PSBDQ1JfRFNUX0FNT0RFX0NPTlNUQU5UIHwgQ0NSX1NSQ19BTU9ERV9QT1NUSU5DOworCQlkLT5jc2RwID0gQ1NEUF9TUkNfQlVSU1RfNjQgfCBDU0RQX1NSQ19QQUNLRUQ7CisJfQogCiAJZC0+Y2ljciA9IENJQ1JfRFJPUF9JRSB8IENJQ1JfQkxPQ0tfSUU7Ci0JZC0+Y3NkcCA9IGVzOworCWQtPmNzZHAgfD0gZXM7CiAKIAlpZiAoZG1hX29tYXAxKCkpIHsKIAkJZC0+Y2ljciB8PSBDSUNSX1RPVVRfSUU7CkBAIC04MTksMTQgKzk0Miw0NyBAQAogCSAqLwogCWVuID0gYnVyc3Q7CiAJZnJhbWVfYnl0ZXMgPSBlc19ieXRlc1tlc10gKiBlbjsKKworCWlmIChzZ2xlbiA+PSAyKQorCQlkLT51c2luZ19sbCA9IG9kLT5sbDEyM19zdXBwb3J0ZWQ7CisKIAlmb3JfZWFjaF9zZyhzZ2wsIHNnZW50LCBzZ2xlbiwgaSkgewotCQlkLT5zZ1tpXS5hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2dlbnQpOwotCQlkLT5zZ1tpXS5lbiA9IGVuOwotCQlkLT5zZ1tpXS5mbiA9IHNnX2RtYV9sZW4oc2dlbnQpIC8gZnJhbWVfYnl0ZXM7CisJCXN0cnVjdCBvbWFwX3NnICpvc2cgPSAmZC0+c2dbaV07CisKKwkJb3NnLT5hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2dlbnQpOworCQlvc2ctPmVuID0gZW47CisJCW9zZy0+Zm4gPSBzZ19kbWFfbGVuKHNnZW50KSAvIGZyYW1lX2J5dGVzOworCisJCWlmIChkLT51c2luZ19sbCkgeworCQkJb3NnLT50Ml9kZXNjID0gZG1hX3Bvb2xfYWxsb2Mob2QtPmRlc2NfcG9vbCwgR0ZQX0FUT01JQywKKwkJCQkJCSAgICAgICZvc2ctPnQyX2Rlc2NfcGFkZHIpOworCQkJaWYgKCFvc2ctPnQyX2Rlc2MpIHsKKwkJCQlkZXZfZXJyKGNoYW4tPmRldmljZS0+ZGV2LAorCQkJCQkidDJfZGVzY1slZF0gYWxsb2NhdGlvbiBmYWlsZWRcbiIsIGkpOworCQkJCWxsX2ZhaWxlZCA9IHRydWU7CisJCQkJZC0+dXNpbmdfbGwgPSBmYWxzZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJb21hcF9kbWFfZmlsbF90eXBlMl9kZXNjKGQsIGksIGRpciwgKGkgPT0gc2dsZW4gLSAxKSk7CisJCX0KIAl9CiAKIAlkLT5zZ2xlbiA9IHNnbGVuOwogCisJLyogUmVsZWFzZSB0aGUgZG1hX3Bvb2wgZW50cmllcyBpZiBvbmUgYWxsb2NhdGlvbiBmYWlsZWQgKi8KKwlpZiAobGxfZmFpbGVkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkLT5zZ2xlbjsgaSsrKSB7CisJCQlzdHJ1Y3Qgb21hcF9zZyAqb3NnID0gJmQtPnNnW2ldOworCisJCQlpZiAob3NnLT50Ml9kZXNjKSB7CisJCQkJZG1hX3Bvb2xfZnJlZShvZC0+ZGVzY19wb29sLCBvc2ctPnQyX2Rlc2MsCisJCQkJCSAgICAgIG9zZy0+dDJfZGVzY19wYWRkcik7CisJCQkJb3NnLT50Ml9kZXNjID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwogCXJldHVybiB2Y2hhbl90eF9wcmVwKCZjLT52YywgJmQtPnZkLCB0eF9mbGFncyk7CiB9CiAKQEAgLTEyMjUsMTYgKzEzODEsMjQgQEAKIAlzcGluX2xvY2tfaW5pdCgmb2QtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZvZC0+aXJxX2xvY2spOwogCi0Jb2QtPmRtYV9yZXF1ZXN0cyA9IE9NQVBfU0RNQV9SRVFVRVNUUzsKLQlpZiAocGRldi0+ZGV2Lm9mX25vZGUgJiYgb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCQkgICAgICAiZG1hLXJlcXVlc3RzIiwKLQkJCQkJCSAgICAgICZvZC0+ZG1hX3JlcXVlc3RzKSkgeworCWlmICghcGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJb2QtPmRtYV9yZXF1ZXN0cyA9IG9kLT5wbGF0LT5kbWFfYXR0ci0+bGNoX2NvdW50OworCQlpZiAodW5saWtlbHkoIW9kLT5kbWFfcmVxdWVzdHMpKQorCQkJb2QtPmRtYV9yZXF1ZXN0cyA9IE9NQVBfU0RNQV9SRVFVRVNUUzsKKwl9IGVsc2UgaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAiZG1hLXJlcXVlc3RzIiwKKwkJCQkJJm9kLT5kbWFfcmVxdWVzdHMpKSB7CiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsCiAJCQkgIk1pc3NpbmcgZG1hLXJlcXVlc3RzIHByb3BlcnR5LCB1c2luZyAldS5cbiIsCiAJCQkgT01BUF9TRE1BX1JFUVVFU1RTKTsKKwkJb2QtPmRtYV9yZXF1ZXN0cyA9IE9NQVBfU0RNQV9SRVFVRVNUUzsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgT01BUF9TRE1BX0NIQU5ORUxTOyBpKyspIHsKKwlvZC0+bGNoX21hcCA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBvZC0+ZG1hX3JlcXVlc3RzLAorCQkJCSAgIHNpemVvZigqb2QtPmxjaF9tYXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9kLT5sY2hfbWFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBvZC0+ZG1hX3JlcXVlc3RzOyBpKyspIHsKIAkJcmMgPSBvbWFwX2RtYV9jaGFuX2luaXQob2QpOwogCQlpZiAocmMpIHsKIAkJCW9tYXBfZG1hX2ZyZWUob2QpOwpAQCAtMTI1NywxMCArMTQyMSwyNSBAQAogCQkJcmV0dXJuIHJjOwogCX0KIAorCWlmIChvbWFwX2RtYV9nbGJsX3JlYWQob2QsIENBUFNfMCkgJiBDQVBTXzBfU1VQUE9SVF9MTDEyMykKKwkJb2QtPmxsMTIzX3N1cHBvcnRlZCA9IHRydWU7CisKIAlvZC0+ZGRldi5maWx0ZXIubWFwID0gb2QtPnBsYXQtPnNsYXZlX21hcDsKIAlvZC0+ZGRldi5maWx0ZXIubWFwY250ID0gb2QtPnBsYXQtPnNsYXZlY250OwogCW9kLT5kZGV2LmZpbHRlci5mbiA9IG9tYXBfZG1hX2ZpbHRlcl9mbjsKIAorCWlmIChvZC0+bGwxMjNfc3VwcG9ydGVkKSB7CisJCW9kLT5kZXNjX3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUoZGV2X25hbWUoJnBkZXYtPmRldiksCisJCQkJCQkmcGRldi0+ZGV2LAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBvbWFwX3R5cGUyX2Rlc2MpLAorCQkJCQkJNCwgMCk7CisJCWlmICghb2QtPmRlc2NfcG9vbCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgZGVzY3JpcHRvciBwb29sXG4iKTsKKwkJCW9kLT5sbDEyM19zdXBwb3J0ZWQgPSBmYWxzZTsKKwkJfQorCX0KKwogCXJjID0gZG1hX2FzeW5jX2RldmljZV9yZWdpc3Rlcigmb2QtPmRkZXYpOwogCWlmIChyYykgewogCQlwcl93YXJuKCJPTUFQLURNQTogZmFpbGVkIHRvIHJlZ2lzdGVyIHNsYXZlIERNQSBlbmdpbmUgZGV2aWNlOiAlZFxuIiwKQEAgLTEyODQsNyArMTQ2Myw4IEBACiAJCX0KIAl9CiAKLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiT01BUCBETUEgZW5naW5lIGRyaXZlclxuIik7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIk9NQVAgRE1BIGVuZ2luZSBkcml2ZXIlc1xuIiwKKwkJIG9kLT5sbDEyM19zdXBwb3J0ZWQgPyAiIChMaW5rZWRMaXN0MS8yLzMgc3VwcG9ydGVkKSIgOiAiIik7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0xMzA3LDYgKzE0ODcsOSBAQAogCQlvbWFwX2RtYV9nbGJsX3dyaXRlKG9kLCBJUlFFTkFCTEVfTDAsIDApOwogCX0KIAorCWlmIChvZC0+bGwxMjNfc3VwcG9ydGVkKQorCQlkbWFfcG9vbF9kZXN0cm95KG9kLT5kZXNjX3Bvb2wpOworCiAJb21hcF9kbWFfZnJlZShvZCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3BjaF9kbWEuYyBiL2RyaXZlcnMvZG1hL3BjaF9kbWEuYwppbmRleCAxMTM2MDVmLi5kZjk1NzI3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvcGNoX2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3BjaF9kbWEuYwpAQCAtMzU3LDE0ICszNTcsMTMgQEAKIAkJCSAgICAgICBzdHJ1Y3QgcGNoX2RtYV9kZXNjICpkZXNjKQogewogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkID0gJmRlc2MtPnR4ZDsKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgY2FsbGJhY2sgPSB0eGQtPmNhbGxiYWNrOwotCXZvaWQgKnBhcmFtID0gdHhkLT5jYWxsYmFja19wYXJhbTsKKwlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgY2I7CiAKKwlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2sodHhkLCAmY2IpOwogCWxpc3Rfc3BsaWNlX2luaXQoJmRlc2MtPnR4X2xpc3QsICZwZF9jaGFuLT5mcmVlX2xpc3QpOwogCWxpc3RfbW92ZSgmZGVzYy0+ZGVzY19ub2RlLCAmcGRfY2hhbi0+ZnJlZV9saXN0KTsKIAotCWlmIChjYWxsYmFjaykKLQkJY2FsbGJhY2socGFyYW0pOworCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCBwZGNfY29tcGxldGVfYWxsKHN0cnVjdCBwY2hfZG1hX2NoYW4gKnBkX2NoYW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9wbDMzMC5jIGIvZHJpdmVycy9kbWEvcGwzMzAuYwppbmRleCA0ZmMzZmZiLi4wMzBmZTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9wbDMzMC5jCisrKyBiL2RyaXZlcnMvZG1hL3BsMzMwLmMKQEAgLTIwMzksMTQgKzIwMzksMTIgQEAKIAl9CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnBjaC0+Y29tcGxldGVkX2xpc3QpKSB7Ci0JCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjazsKLQkJdm9pZCAqY2FsbGJhY2tfcGFyYW07CisJCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKIAogCQlkZXNjID0gbGlzdF9maXJzdF9lbnRyeSgmcGNoLT5jb21wbGV0ZWRfbGlzdCwKIAkJCQkJc3RydWN0IGRtYV9wbDMzMF9kZXNjLCBub2RlKTsKIAotCQljYWxsYmFjayA9IGRlc2MtPnR4ZC5jYWxsYmFjazsKLQkJY2FsbGJhY2tfcGFyYW0gPSBkZXNjLT50eGQuY2FsbGJhY2tfcGFyYW07CisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjaygmZGVzYy0+dHhkLCAmY2IpOwogCiAJCWlmIChwY2gtPmN5Y2xpYykgewogCQkJZGVzYy0+c3RhdHVzID0gUFJFUDsKQEAgLTIwNjQsOSArMjA2Miw5IEBACiAKIAkJZG1hX2Rlc2NyaXB0b3JfdW5tYXAoJmRlc2MtPnR4ZCk7CiAKLQkJaWYgKGNhbGxiYWNrKSB7CisJCWlmIChkbWFlbmdpbmVfZGVzY19jYWxsYmFja192YWxpZCgmY2IpKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2gtPmxvY2ssIGZsYWdzKTsKLQkJCWNhbGxiYWNrKGNhbGxiYWNrX3BhcmFtKTsKKwkJCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBjaC0+bG9jaywgZmxhZ3MpOwogCQl9CiAJfQpAQCAtMjI3NCw3ICsyMjcyLDcgQEAKIHsKIAllbnVtIGRtYV9zdGF0dXMgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGRtYV9wbDMzMF9kZXNjICpkZXNjLCAqcnVubmluZyA9IE5VTEw7CisJc3RydWN0IGRtYV9wbDMzMF9kZXNjICpkZXNjLCAqcnVubmluZyA9IE5VTEwsICpsYXN0X2VucSA9IE5VTEw7CiAJc3RydWN0IGRtYV9wbDMzMF9jaGFuICpwY2ggPSB0b19wY2hhbihjaGFuKTsKIAl1bnNpZ25lZCBpbnQgdHJhbnNmZXJyZWQsIHJlc2lkdWFsID0gMDsKIApAQCAtMjI4NywxMCArMjI4NSwxMyBAQAogCQlnb3RvIG91dDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY2gtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJnBjaC0+dGhyZWFkLT5kbWFjLT5sb2NrKTsKIAogCWlmIChwY2gtPnRocmVhZC0+cmVxX3J1bm5pbmcgIT0gLTEpCiAJCXJ1bm5pbmcgPSBwY2gtPnRocmVhZC0+cmVxW3BjaC0+dGhyZWFkLT5yZXFfcnVubmluZ10uZGVzYzsKIAorCWxhc3RfZW5xID0gcGNoLT50aHJlYWQtPnJlcVtwY2gtPnRocmVhZC0+bHN0ZW5xXS5kZXNjOworCiAJLyogQ2hlY2sgaW4gcGVuZGluZyBsaXN0ICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXNjLCAmcGNoLT53b3JrX2xpc3QsIG5vZGUpIHsKIAkJaWYgKGRlc2MtPnN0YXR1cyA9PSBET05FKQpAQCAtMjI5OCw2ICsyMjk5LDE1IEBACiAJCWVsc2UgaWYgKHJ1bm5pbmcgJiYgZGVzYyA9PSBydW5uaW5nKQogCQkJdHJhbnNmZXJyZWQgPQogCQkJCXBsMzMwX2dldF9jdXJyZW50X3hmZXJyZWRfY291bnQocGNoLCBkZXNjKTsKKwkJZWxzZSBpZiAoZGVzYy0+c3RhdHVzID09IEJVU1kpCisJCQkvKgorCQkJICogQnVzeSBidXQgbm90IHJ1bm5pbmcgbWVhbnMgZWl0aGVyIGp1c3QgZW5xdWV1ZWQsCisJCQkgKiBvciBmaW5pc2hlZCBhbmQgbm90IHlldCBtYXJrZWQgZG9uZQorCQkJICovCisJCQlpZiAoZGVzYyA9PSBsYXN0X2VucSkKKwkJCQl0cmFuc2ZlcnJlZCA9IDA7CisJCQllbHNlCisJCQkJdHJhbnNmZXJyZWQgPSBkZXNjLT5ieXRlc19yZXF1ZXN0ZWQ7CiAJCWVsc2UKIAkJCXRyYW5zZmVycmVkID0gMDsKIAkJcmVzaWR1YWwgKz0gZGVzYy0+Ynl0ZXNfcmVxdWVzdGVkIC0gdHJhbnNmZXJyZWQ7CkBAIC0yMzE4LDYgKzIzMjgsNyBAQAogCQlpZiAoZGVzYy0+bGFzdCkKIAkJCXJlc2lkdWFsID0gMDsKIAl9CisJc3Bpbl91bmxvY2soJnBjaC0+dGhyZWFkLT5kbWFjLT5sb2NrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY2gtPmxvY2ssIGZsYWdzKTsKIAogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcHBjNHh4L2FkbWEuYyBiL2RyaXZlcnMvZG1hL3BwYzR4eC9hZG1hLmMKaW5kZXggZGEzNjg4Yi4uYjE1MzViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvcHBjNHh4L2FkbWEuYworKysgYi9kcml2ZXJzL2RtYS9wcGM0eHgvYWRtYS5jCkBAIC0xNDgyLDE0ICsxNDgyLDExIEBACiAJCWNvb2tpZSA9IGRlc2MtPmFzeW5jX3R4LmNvb2tpZTsKIAkJZGVzYy0+YXN5bmNfdHguY29va2llID0gMDsKIAorCQlkbWFfZGVzY3JpcHRvcl91bm1hcCgmZGVzYy0+YXN5bmNfdHgpOwogCQkvKiBjYWxsIHRoZSBjYWxsYmFjayAobXVzdCBub3Qgc2xlZXAgb3Igc3VibWl0IG5ldwogCQkgKiBvcGVyYXRpb25zIHRvIHRoaXMgY2hhbm5lbCkKIAkJICovCi0JCWlmIChkZXNjLT5hc3luY190eC5jYWxsYmFjaykKLQkJCWRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrKAotCQkJCWRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrX3BhcmFtKTsKLQotCQlkbWFfZGVzY3JpcHRvcl91bm1hcCgmZGVzYy0+YXN5bmNfdHgpOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKCZkZXNjLT5hc3luY190eCwgTlVMTCk7CiAJfQogCiAJLyogcnVuIGRlcGVuZGVudCBvcGVyYXRpb25zICovCkBAIC0zODkxLDcgKzM4ODgsNyBAQAogCW5wID0gb2ZkZXYtPmRldi5vZl9ub2RlOwogCWlmIChhZGV2LT5pZCAhPSBQUEM0NDBTUEVfWE9SX0lEKSB7CiAJCWFkZXYtPmVycl9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMSk7Ci0JCWlmIChhZGV2LT5lcnJfaXJxID09IE5PX0lSUSkgeworCQlpZiAoIWFkZXYtPmVycl9pcnEpIHsKIAkJCWRldl93YXJuKGFkZXYtPmRldiwgIm5vIGVyciBpcnEgcmVzb3VyY2U/XG4iKTsKIAkJCSppbml0Y29kZSA9IFBQQ19BRE1BX0lOSVRfSVJRMjsKIAkJCWFkZXYtPmVycl9pcnEgPSAtRU5YSU87CkBAIC0zOTAyLDcgKzM4OTksNyBAQAogCX0KIAogCWFkZXYtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQlpZiAoYWRldi0+aXJxID09IE5PX0lSUSkgeworCWlmICghYWRldi0+aXJxKSB7CiAJCWRldl9lcnIoYWRldi0+ZGV2LCAibm8gaXJxIHJlc291cmNlXG4iKTsKIAkJKmluaXRjb2RlID0gUFBDX0FETUFfSU5JVF9JUlExOwogCQlyZXQgPSAtRU5YSU87CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9weGFfZG1hLmMgYi9kcml2ZXJzL2RtYS9weGFfZG1hLmMKaW5kZXggZGM3ODUwYS4uM2Y1NmY5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvcHhhX2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3B4YV9kbWEuYwpAQCAtNjM4LDcgKzYzOCw3IEBACiAJCXZkX2xhc3RfaXNzdWVkID0gbGlzdF9lbnRyeSh2Yy0+ZGVzY19pc3N1ZWQucHJldiwKIAkJCQkJICAgIHN0cnVjdCB2aXJ0X2RtYV9kZXNjLCBub2RlKTsKIAkJcHhhZF9kZXNjX2NoYWluKHZkX2xhc3RfaXNzdWVkLCB2ZCk7Ci0JCWlmIChpc19jaGFuX3J1bm5pbmcoY2hhbikgfHwgaXNfZGVzY19jb21wbGV0ZWQodmRfbGFzdF9pc3N1ZWQpKQorCQlpZiAoaXNfY2hhbl9ydW5uaW5nKGNoYW4pIHx8IGlzX2Rlc2NfY29tcGxldGVkKHZkKSkKIAkJCXJldHVybiB0cnVlOwogCX0KIApAQCAtNjcxLDYgKzY3MSw3IEBACiAJc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkLCAqdG1wOwogCXVuc2lnbmVkIGludCBkY3NyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCB2ZF9jb21wbGV0ZWQ7CiAJZG1hX2Nvb2tpZV90IGxhc3Rfc3RhcnRlZCA9IDA7CiAKIAlCVUdfT04oIWNoYW4pOwpAQCAtNjgxLDE1ICs2ODIsMTcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT52Yy5sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZkLCB0bXAsICZjaGFuLT52Yy5kZXNjX2lzc3VlZCwgbm9kZSkgeworCQl2ZF9jb21wbGV0ZWQgPSBpc19kZXNjX2NvbXBsZXRlZCh2ZCk7CiAJCWRldl9kYmcoJmNoYW4tPnZjLmNoYW4uZGV2LT5kZXZpY2UsCi0JCQkiJXMoKTogY2hlY2tpbmcgdHhkICVwWyV4XTogY29tcGxldGVkPSVkXG4iLAotCQkJX19mdW5jX18sIHZkLCB2ZC0+dHguY29va2llLCBpc19kZXNjX2NvbXBsZXRlZCh2ZCkpOworCQkJIiVzKCk6IGNoZWNraW5nIHR4ZCAlcFsleF06IGNvbXBsZXRlZD0lZCBkY3NyPTB4JXhcbiIsCisJCQlfX2Z1bmNfXywgdmQsIHZkLT50eC5jb29raWUsIHZkX2NvbXBsZXRlZCwKKwkJCWRjc3IpOwogCQlsYXN0X3N0YXJ0ZWQgPSB2ZC0+dHguY29va2llOwogCQlpZiAodG9fcHhhZF9zd19kZXNjKHZkKS0+Y3ljbGljKSB7CiAJCQl2Y2hhbl9jeWNsaWNfY2FsbGJhY2sodmQpOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKGlzX2Rlc2NfY29tcGxldGVkKHZkKSkgeworCQlpZiAodmRfY29tcGxldGVkKSB7CiAJCQlsaXN0X2RlbCgmdmQtPm5vZGUpOwogCQkJdmNoYW5fY29va2llX2NvbXBsZXRlKHZkKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3Fjb20vaGlkbWEuYyBiL2RyaXZlcnMvZG1hL3Fjb20vaGlkbWEuYwppbmRleCBiMjM3NGNkLi5lMjQ0ZTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9xY29tL2hpZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvcWNvbS9oaWRtYS5jCkBAIC0xMTEsNiArMTExLDcgQEAKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CiAJZG1hX2Nvb2tpZV90IGxhc3RfY29va2llOwogCXN0cnVjdCBoaWRtYV9kZXNjICptZGVzYzsKKwlzdHJ1Y3QgaGlkbWFfZGVzYyAqbmV4dDsKIAl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIApAQCAtMTIyLDI4ICsxMjMsMzYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2hhbi0+bG9jaywgaXJxZmxhZ3MpOwogCiAJLyogRXhlY3V0ZSBjYWxsYmFja3MgYW5kIHJ1biBkZXBlbmRlbmNpZXMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1kZXNjLCAmbGlzdCwgbm9kZSkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtZGVzYywgbmV4dCwgJmxpc3QsIG5vZGUpIHsKIAkJZW51bSBkbWFfc3RhdHVzIGxsc3RhdDsKKwkJc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrIGNiOworCQlzdHJ1Y3QgZG1hZW5naW5lX3Jlc3VsdCByZXN1bHQ7CiAKIAkJZGVzYyA9ICZtZGVzYy0+ZGVzYzsKKwkJbGFzdF9jb29raWUgPSBkZXNjLT5jb29raWU7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm1jaGFuLT5sb2NrLCBpcnFmbGFncyk7CiAJCWRtYV9jb29raWVfY29tcGxldGUoZGVzYyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jaGFuLT5sb2NrLCBpcnFmbGFncyk7CiAKIAkJbGxzdGF0ID0gaGlkbWFfbGxfc3RhdHVzKG1kbWEtPmxsZGV2LCBtZGVzYy0+dHJlX2NoKTsKLQkJaWYgKGRlc2MtPmNhbGxiYWNrICYmIChsbHN0YXQgPT0gRE1BX0NPTVBMRVRFKSkKLQkJCWRlc2MtPmNhbGxiYWNrKGRlc2MtPmNhbGxiYWNrX3BhcmFtKTsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKGRlc2MsICZjYik7CiAKLQkJbGFzdF9jb29raWUgPSBkZXNjLT5jb29raWU7CiAJCWRtYV9ydW5fZGVwZW5kZW5jaWVzKGRlc2MpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZtY2hhbi0+bG9jaywgaXJxZmxhZ3MpOworCQlsaXN0X21vdmUoJm1kZXNjLT5ub2RlLCAmbWNoYW4tPmZyZWUpOworCisJCWlmIChsbHN0YXQgPT0gRE1BX0NPTVBMRVRFKSB7CisJCQltY2hhbi0+bGFzdF9zdWNjZXNzID0gbGFzdF9jb29raWU7CisJCQlyZXN1bHQucmVzdWx0ID0gRE1BX1RSQU5TX05PRVJST1I7CisJCX0gZWxzZQorCQkJcmVzdWx0LnJlc3VsdCA9IERNQV9UUkFOU19BQk9SVEVEOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jaGFuLT5sb2NrLCBpcnFmbGFncyk7CisKKwkJZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCZjYiwgJnJlc3VsdCk7CiAJfQotCi0JLyogRnJlZSBkZXNjcmlwdG9ycyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZtY2hhbi0+bG9jaywgaXJxZmxhZ3MpOwotCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmbGlzdCwgJm1jaGFuLT5mcmVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2hhbi0+bG9jaywgaXJxZmxhZ3MpOwotCiB9CiAKIC8qCkBAIC0yMzgsNiArMjQ3LDE5IEBACiAJCWhpZG1hX2xsX3N0YXJ0KGRtYWRldi0+bGxkZXYpOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgaGlkbWFfdHhuX2lzX3N1Y2Nlc3MoZG1hX2Nvb2tpZV90IGNvb2tpZSwKKwkJZG1hX2Nvb2tpZV90IGxhc3Rfc3VjY2VzcywgZG1hX2Nvb2tpZV90IGxhc3RfdXNlZCkKK3sKKwlpZiAobGFzdF9zdWNjZXNzIDw9IGxhc3RfdXNlZCkgeworCQlpZiAoKGNvb2tpZSA8PSBsYXN0X3N1Y2Nlc3MpIHx8IChjb29raWUgPiBsYXN0X3VzZWQpKQorCQkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKChjb29raWUgPD0gbGFzdF9zdWNjZXNzKSAmJiAoY29va2llID4gbGFzdF91c2VkKSkKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBlbnVtIGRtYV9zdGF0dXMgaGlkbWFfdHhfc3RhdHVzKHN0cnVjdCBkbWFfY2hhbiAqZG1hY2gsCiAJCQkJICAgICAgIGRtYV9jb29raWVfdCBjb29raWUsCiAJCQkJICAgICAgIHN0cnVjdCBkbWFfdHhfc3RhdGUgKnR4c3RhdGUpCkBAIC0yNDYsOCArMjY4LDEzIEBACiAJZW51bSBkbWFfc3RhdHVzIHJldDsKIAogCXJldCA9IGRtYV9jb29raWVfc3RhdHVzKGRtYWNoLCBjb29raWUsIHR4c3RhdGUpOwotCWlmIChyZXQgPT0gRE1BX0NPTVBMRVRFKQotCQlyZXR1cm4gcmV0OworCWlmIChyZXQgPT0gRE1BX0NPTVBMRVRFKSB7CisJCWJvb2wgaXNfc3VjY2VzczsKKworCQlpc19zdWNjZXNzID0gaGlkbWFfdHhuX2lzX3N1Y2Nlc3MoY29va2llLCBtY2hhbi0+bGFzdF9zdWNjZXNzLAorCQkJCQkJICBkbWFjaC0+Y29va2llKTsKKwkJcmV0dXJuIGlzX3N1Y2Nlc3MgPyByZXQgOiBETUFfRVJST1I7CisJfQogCiAJaWYgKG1jaGFuLT5wYXVzZWQgJiYgKHJldCA9PSBETUFfSU5fUFJPR1JFU1MpKSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zOTgsNiArNDI1LDcgQEAKIAloaWRtYV9wcm9jZXNzX2NvbXBsZXRlZChtY2hhbik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWNoYW4tPmxvY2ssIGlycWZsYWdzKTsKKwltY2hhbi0+bGFzdF9zdWNjZXNzID0gMDsKIAlsaXN0X3NwbGljZV9pbml0KCZtY2hhbi0+YWN0aXZlLCAmbGlzdCk7CiAJbGlzdF9zcGxpY2VfaW5pdCgmbWNoYW4tPnByZXBhcmVkLCAmbGlzdCk7CiAJbGlzdF9zcGxpY2VfaW5pdCgmbWNoYW4tPmNvbXBsZXRlZCwgJmxpc3QpOwpAQCAtNDEzLDE0ICs0NDEsOSBAQAogCS8qIHJldHVybiBhbGwgdXNlciByZXF1ZXN0cyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtZGVzYywgdG1wLCAmbGlzdCwgbm9kZSkgewogCQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ZCA9ICZtZGVzYy0+ZGVzYzsKLQkJZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrID0gbWRlc2MtPmRlc2MuY2FsbGJhY2s7Ci0JCXZvaWQgKnBhcmFtID0gbWRlc2MtPmRlc2MuY2FsbGJhY2tfcGFyYW07CiAKIAkJZG1hX2Rlc2NyaXB0b3JfdW5tYXAodHhkKTsKLQotCQlpZiAoY2FsbGJhY2spCi0JCQljYWxsYmFjayhwYXJhbSk7Ci0KKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrX2ludm9rZSh0eGQsIE5VTEwpOwogCQlkbWFfcnVuX2RlcGVuZGVuY2llcyh0eGQpOwogCiAJCS8qIG1vdmUgbXlzZWxmIHRvIGZyZWVfbGlzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcWNvbS9oaWRtYS5oIGIvZHJpdmVycy9kbWEvcWNvbS9oaWRtYS5oCmluZGV4IGRiNDEzYTUuLmU1MmUyMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3Fjb20vaGlkbWEuaAorKysgYi9kcml2ZXJzL2RtYS9xY29tL2hpZG1hLmgKQEAgLTcyLDcgKzcyLDYgQEAKIAogCXUzMiB0cmVfd3JpdGVfb2Zmc2V0OyAgICAgICAgICAgLyogVFJFIHdyaXRlIGxvY2F0aW9uICAgICAgICAgICAgICAqLwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrOwkvKiB0YXNrIGRlbGl2ZXJpbmcgbm90aWZpY2F0aW9ucyAgICovCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHJzdF90YXNrOwkvKiB0YXNrIHRvIHJlc2V0IEhXICAgICAgICAgICAgICAgICovCiAJREVDTEFSRV9LRklGT19QVFIoaGFuZG9mZl9maWZvLAogCQlzdHJ1Y3QgaGlkbWFfdHJlICopOyAgICAvKiBwZW5kaW5nIFRSRXMgRklGTyAgICAgICAgICAgICAgICovCiB9OwpAQCAtODksNiArODgsNyBAQAogCWJvb2wJCQkJYWxsb2NhdGVkOwogCWNoYXIJCQkJZGJnX25hbWVbMTZdOwogCXUzMgkJCQlkbWFfc2lnOworCWRtYV9jb29raWVfdAkJCWxhc3Rfc3VjY2VzczsKIAogCS8qCiAJICogYWN0aXZlIGRlc2NyaXB0b3Igb24gdGhpcyBjaGFubmVsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9xY29tL2hpZG1hX2xsLmMgYi9kcml2ZXJzL2RtYS9xY29tL2hpZG1hX2xsLmMKaW5kZXggYWQyMGRmYi4uMzIyNGYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvcWNvbS9oaWRtYV9sbC5jCisrKyBiL2RyaXZlcnMvZG1hL3Fjb20vaGlkbWFfbGwuYwpAQCAtMzgxLDI3ICszODEsNiBAQAogfQogCiAvKgotICogQWJvcnQgYWxsIHRyYW5zYWN0aW9ucyBhbmQgcGVyZm9ybSBhIHJlc2V0LgotICovCi1zdGF0aWMgdm9pZCBoaWRtYV9sbF9hYm9ydCh1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgaGlkbWFfbGxkZXYgKmxsZGV2ID0gKHN0cnVjdCBoaWRtYV9sbGRldiAqKWFyZzsKLQl1OCBlcnJfY29kZSA9IEhJRE1BX0VWUkVfU1RBVFVTX0VSUk9SOwotCXU4IGVycl9pbmZvID0gMHhGRjsKLQlpbnQgcmM7Ci0KLQloaWRtYV9jbGVhbnVwX3BlbmRpbmdfdHJlKGxsZGV2LCBlcnJfaW5mbywgZXJyX2NvZGUpOwotCi0JLyogcmVzZXQgdGhlIGNoYW5uZWwgZm9yIHJlY292ZXJ5ICovCi0JcmMgPSBoaWRtYV9sbF9zZXR1cChsbGRldik7Ci0JaWYgKHJjKSB7Ci0JCWRldl9lcnIobGxkZXYtPmRldiwgImNoYW5uZWwgcmVpbml0aWFsaXplIGZhaWxlZCBhZnRlciBlcnJvclxuIik7Ci0JCXJldHVybjsKLQl9Ci0Jd3JpdGVsKEVOQUJMRV9JUlFTLCBsbGRldi0+ZXZjYSArIEhJRE1BX0VWQ0FfSVJRX0VOX1JFRyk7Ci19Ci0KLS8qCiAgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXIgZm9yIEhJRE1BIHdpbGwgdHJ5IHRvIGNvbnN1bWUgYXMgbWFueSBwZW5kaW5nCiAgKiBFVlJFIGZyb20gdGhlIGV2ZW50IHF1ZXVlIGFzIHBvc3NpYmxlLiBFYWNoIEVWUkUgaGFzIGFuIGFzc29jaWF0ZWQKICAqIFRSRSB0aGF0IGhvbGRzIHRoZSB1c2VyIGludGVyZmFjZSBwYXJhbWV0ZXJzLiBFVlJFIHJlcG9ydHMgdGhlCkBAIC00NTQsMTMgKzQzMywxOCBAQAogCiAJd2hpbGUgKGNhdXNlKSB7CiAJCWlmIChjYXVzZSAmIEhJRE1BX0VSUl9JTlRfTUFTSykgewotCQkJZGV2X2VycihsbGRldi0+ZGV2LCAiZXJyb3IgMHgleCwgcmVzZXR0aW5nLi4uXG4iLAorCQkJZGV2X2VycihsbGRldi0+ZGV2LCAiZXJyb3IgMHgleCwgZGlzYWJsaW5nLi4uXG4iLAogCQkJCQljYXVzZSk7CiAKIAkJCS8qIENsZWFyIG91dCBwZW5kaW5nIGludGVycnVwdHMgKi8KIAkJCXdyaXRlbChjYXVzZSwgbGxkZXYtPmV2Y2EgKyBISURNQV9FVkNBX0lSUV9DTFJfUkVHKTsKIAotCQkJdGFza2xldF9zY2hlZHVsZSgmbGxkZXYtPnJzdF90YXNrKTsKKwkJCS8qIE5vIGZ1cnRoZXIgc3VibWlzc2lvbnMuICovCisJCQloaWRtYV9sbF9kaXNhYmxlKGxsZGV2KTsKKworCQkJLyogRHJpdmVyIGNvbXBsZXRlcyB0aGUgdHhuIGFuZCBpbnRpbWF0ZXMgdGhlIGNsaWVudC4qLworCQkJaGlkbWFfY2xlYW51cF9wZW5kaW5nX3RyZShsbGRldiwgMHhGRiwKKwkJCQkJCSAgSElETUFfRVZSRV9TVEFUVVNfRVJST1IpOwogCQkJZ290byBvdXQ7CiAJCX0KIApAQCAtODA4LDcgKzc5Miw2IEBACiAJCXJldHVybiBOVUxMOwogCiAJc3Bpbl9sb2NrX2luaXQoJmxsZGV2LT5sb2NrKTsKLQl0YXNrbGV0X2luaXQoJmxsZGV2LT5yc3RfdGFzaywgaGlkbWFfbGxfYWJvcnQsICh1bnNpZ25lZCBsb25nKWxsZGV2KTsKIAl0YXNrbGV0X2luaXQoJmxsZGV2LT50YXNrLCBoaWRtYV9sbF90cmVfY29tcGxldGUsICh1bnNpZ25lZCBsb25nKWxsZGV2KTsKIAlsbGRldi0+aW5pdGlhbGl6ZWQgPSAxOwogCXdyaXRlbChFTkFCTEVfSVJRUywgbGxkZXYtPmV2Y2EgKyBISURNQV9FVkNBX0lSUV9FTl9SRUcpOwpAQCAtODMxLDcgKzgxNCw2IEBACiAKIAlyZXF1aXJlZF9ieXRlcyA9IHNpemVvZihzdHJ1Y3QgaGlkbWFfdHJlKSAqIGxsZGV2LT5ucl90cmVzOwogCXRhc2tsZXRfa2lsbCgmbGxkZXYtPnRhc2spOwotCXRhc2tsZXRfa2lsbCgmbGxkZXYtPnJzdF90YXNrKTsKIAltZW1zZXQobGxkZXYtPnRyZXBvb2wsIDAsIHJlcXVpcmVkX2J5dGVzKTsKIAlsbGRldi0+dHJlcG9vbCA9IE5VTEw7CiAJbGxkZXYtPnBlbmRpbmdfdHJlX2NvdW50ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3MzYzI0eHgtZG1hLmMgYi9kcml2ZXJzL2RtYS9zM2MyNHh4LWRtYS5jCmluZGV4IGNlNjcwNzUuLjNjNTc5YWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zM2MyNHh4LWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3MzYzI0eHgtZG1hLmMKQEAgLTgyMywxMSArODIzLDExIEBACiAJc3RydWN0IHMzYzI0eHhfc2cgKmRzZzsKIAlpbnQgc3JjX21vZCwgZGVzdF9tb2Q7CiAKLQlkZXZfZGJnKCZzM2NkbWEtPnBkZXYtPmRldiwgInByZXBhcmUgbWVtY3B5IG9mICVkIGJ5dGVzIGZyb20gJXNcbiIsCisJZGV2X2RiZygmczNjZG1hLT5wZGV2LT5kZXYsICJwcmVwYXJlIG1lbWNweSBvZiAlenUgYnl0ZXMgZnJvbSAlc1xuIiwKIAkJCWxlbiwgczNjY2hhbi0+bmFtZSk7CiAKIAlpZiAoKGxlbiAmIFMzQzI0WFhfRENPTl9UQ19NQVNLKSAhPSBsZW4pIHsKLQkJZGV2X2VycigmczNjZG1hLT5wZGV2LT5kZXYsICJtZW1jcHkgc2l6ZSAlZCB0byBsYXJnZVxuIiwgbGVuKTsKKwkJZGV2X2VycigmczNjZG1hLT5wZGV2LT5kZXYsICJtZW1jcHkgc2l6ZSAlenUgdG8gbGFyZ2VcbiIsIGxlbik7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTMwMSw2ICsxMzAxLDkgQEAKIAlzM2NkbWEtPnNsYXZlLmRldmljZV9wcmVwX2RtYV9jeWNsaWMgPSBzM2MyNHh4X2RtYV9wcmVwX2RtYV9jeWNsaWM7CiAJczNjZG1hLT5zbGF2ZS5kZXZpY2VfY29uZmlnID0gczNjMjR4eF9kbWFfc2V0X3J1bnRpbWVfY29uZmlnOwogCXMzY2RtYS0+c2xhdmUuZGV2aWNlX3Rlcm1pbmF0ZV9hbGwgPSBzM2MyNHh4X2RtYV90ZXJtaW5hdGVfYWxsOworCXMzY2RtYS0+c2xhdmUuZmlsdGVyLm1hcCA9IHBkYXRhLT5zbGF2ZV9tYXA7CisJczNjZG1hLT5zbGF2ZS5maWx0ZXIubWFwY250ID0gcGRhdGEtPnNsYXZlY250OworCXMzY2RtYS0+c2xhdmUuZmlsdGVyLmZuID0gczNjMjR4eF9kbWFfZmlsdGVyOwogCiAJLyogUmVnaXN0ZXIgYXMgbWFueSBtZW1jcHkgY2hhbm5lbHMgYXMgdGhlcmUgYXJlIHBoeXNpY2FsIGNoYW5uZWxzICovCiAJcmV0ID0gczNjMjR4eF9kbWFfaW5pdF92aXJ0dWFsX2NoYW5uZWxzKHMzY2RtYSwgJnMzY2RtYS0+bWVtY3B5LApAQCAtMTQxOCw3ICsxNDIxLDcgQEAKIAogCXMzY2NoYW4gPSB0b19zM2MyNHh4X2RtYV9jaGFuKGNoYW4pOwogCi0JcmV0dXJuIHMzY2NoYW4tPmlkID09IChpbnQpcGFyYW07CisJcmV0dXJuIHMzY2NoYW4tPmlkID09ICh1aW50cHRyX3QpcGFyYW07CiB9CiBFWFBPUlRfU1lNQk9MKHMzYzI0eHhfZG1hX2ZpbHRlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3NhMTF4MC1kbWEuYyBiL2RyaXZlcnMvZG1hL3NhMTF4MC1kbWEuYwppbmRleCA0M2RiMjU1Li4xYWRlYjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zYTExeDAtZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvc2ExMXgwLWRtYS5jCkBAIC00NjMsNyArNDYzLDcgQEAKIAkJCWRtYV9hZGRyX3QgYWRkciA9IHNhMTF4MF9kbWFfcG9zKHApOwogCQkJdW5zaWduZWQgaTsKIAotCQkJZGV2X3ZkYmcoZC0+c2xhdmUuZGV2LCAidHhfc3RhdHVzOiBhZGRyOiV4XG4iLCBhZGRyKTsKKwkJCWRldl92ZGJnKGQtPnNsYXZlLmRldiwgInR4X3N0YXR1czogYWRkcjolcGFkXG4iLCAmYWRkcik7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCB0eGQtPnNnbGVuOyBpKyspIHsKIAkJCQlkZXZfdmRiZyhkLT5zbGF2ZS5kZXYsICJ0eF9zdGF0dXM6IFsldV0gJXgrJXhcbiIsCkBAIC00OTEsNyArNDkxLDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+dmMubG9jaywgZmxhZ3MpOwogCi0JZGV2X3ZkYmcoZC0+c2xhdmUuZGV2LCAidHhfc3RhdHVzOiBieXRlcyAweCV6eFxuIiwgc3RhdGUtPnJlc2lkdWUpOworCWRldl92ZGJnKGQtPnNsYXZlLmRldiwgInR4X3N0YXR1czogYnl0ZXMgMHgleFxuIiwgc3RhdGUtPnJlc2lkdWUpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU1MSw4ICs1NTEsOCBAQAogCQlpZiAobGVuID4gRE1BX01BWF9TSVpFKQogCQkJaiArPSBESVZfUk9VTkRfVVAobGVuLCBETUFfTUFYX1NJWkUgJiB+RE1BX0FMSUdOKSAtIDE7CiAJCWlmIChhZGRyICYgRE1BX0FMSUdOKSB7Ci0JCQlkZXZfZGJnKGNoYW4tPmRldmljZS0+ZGV2LCAidmNoYW4gJXA6IGJhZCBidWZmZXIgYWxpZ25tZW50OiAlMDh4XG4iLAotCQkJCSZjLT52YywgYWRkcik7CisJCQlkZXZfZGJnKGNoYW4tPmRldmljZS0+ZGV2LCAidmNoYW4gJXA6IGJhZCBidWZmZXIgYWxpZ25tZW50OiAlcGFkXG4iLAorCQkJCSZjLT52YywgJmFkZHIpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9CkBAIC01OTksNyArNTk5LDcgQEAKIAl0eGQtPnNpemUgPSBzaXplOwogCXR4ZC0+c2dsZW4gPSBqOwogCi0JZGV2X2RiZyhjaGFuLT5kZXZpY2UtPmRldiwgInZjaGFuICVwOiB0eGQgJXA6IHNpemUgJXUgbnIgJXVcbiIsCisJZGV2X2RiZyhjaGFuLT5kZXZpY2UtPmRldiwgInZjaGFuICVwOiB0eGQgJXA6IHNpemUgJXp1IG5yICV1XG4iLAogCQkmYy0+dmMsICZ0eGQtPnZkLCB0eGQtPnNpemUsIHR4ZC0+c2dsZW4pOwogCiAJcmV0dXJuIHZjaGFuX3R4X3ByZXAoJmMtPnZjLCAmdHhkLT52ZCwgZmxhZ3MpOwpAQCAtNjkzLDggKzY5Myw4IEBACiAJaWYgKG1heGJ1cnN0ID09IDgpCiAJCWRkYXIgfD0gRERBUl9CUzsKIAotCWRldl9kYmcoYy0+dmMuY2hhbi5kZXZpY2UtPmRldiwgInZjaGFuICVwOiBkbWFfc2xhdmVfY29uZmlnIGFkZHIgJXggd2lkdGggJXUgYnVyc3QgJXVcbiIsCi0JCSZjLT52YywgYWRkciwgd2lkdGgsIG1heGJ1cnN0KTsKKwlkZXZfZGJnKGMtPnZjLmNoYW4uZGV2aWNlLT5kZXYsICJ2Y2hhbiAlcDogZG1hX3NsYXZlX2NvbmZpZyBhZGRyICVwYWQgd2lkdGggJXUgYnVyc3QgJXVcbiIsCisJCSZjLT52YywgJmFkZHIsIHdpZHRoLCBtYXhidXJzdCk7CiAKIAljLT5kZGFyID0gZGRhciB8IChhZGRyICYgMHhmMDAwMDAwMCkgfCAoYWRkciAmIDB4MDAzZmZmZmMpIDw8IDY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3NoL3JjYXItZG1hYy5jIGIvZHJpdmVycy9kbWEvc2gvcmNhci1kbWFjLmMKaW5kZXggMGRkOTUzOC4uMmU0NDFkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc2gvcmNhci1kbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvc2gvcmNhci1kbWFjLmMKQEAgLTExOCwxNCArMTE4LDM0IEBACiAJc2l6ZW9mKHN0cnVjdCByY2FyX2RtYWNfeGZlcl9jaHVuaykpCiAKIC8qCisgKiBzdHJ1Y3QgcmNhcl9kbWFjX2NoYW5fc2xhdmUgLSBTbGF2ZSBjb25maWd1cmF0aW9uCisgKiBAc2xhdmVfYWRkcjogc2xhdmUgbWVtb3J5IGFkZHJlc3MKKyAqIEB4ZmVyX3NpemU6IHNpemUgKGluIGJ5dGVzKSBvZiBoYXJkd2FyZSB0cmFuc2ZlcnMKKyAqLworc3RydWN0IHJjYXJfZG1hY19jaGFuX3NsYXZlIHsKKwlwaHlzX2FkZHJfdCBzbGF2ZV9hZGRyOworCXVuc2lnbmVkIGludCB4ZmVyX3NpemU7Cit9OworCisvKgorICogc3RydWN0IHJjYXJfZG1hY19jaGFuX21hcCAtIE1hcCBvZiBzbGF2ZSBkZXZpY2UgcGh5cyB0byBkbWEgYWRkcmVzcworICogQGFkZHI6IHNsYXZlIGRtYSBhZGRyZXNzCisgKiBAZGlyOiBkaXJlY3Rpb24gb2YgbWFwcGluZworICogQHNsYXZlOiBzbGF2ZSBjb25maWd1cmF0aW9uIHRoYXQgaXMgbWFwcGVkCisgKi8KK3N0cnVjdCByY2FyX2RtYWNfY2hhbl9tYXAgeworCWRtYV9hZGRyX3QgYWRkcjsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7CisJc3RydWN0IHJjYXJfZG1hY19jaGFuX3NsYXZlIHNsYXZlOworfTsKKworLyoKICAqIHN0cnVjdCByY2FyX2RtYWNfY2hhbiAtIFItQ2FyIEdlbjIgRE1BIENvbnRyb2xsZXIgQ2hhbm5lbAogICogQGNoYW46IGJhc2UgRE1BIGNoYW5uZWwgb2JqZWN0CiAgKiBAaW9tZW06IGNoYW5uZWwgSS9PIG1lbW9yeSBiYXNlCiAgKiBAaW5kZXg6IGluZGV4IG9mIHRoaXMgY2hhbm5lbCBpbiB0aGUgY29udHJvbGxlcgotICogQHNyY194ZmVyX3NpemU6IHNpemUgKGluIGJ5dGVzKSBvZiBoYXJkd2FyZSB0cmFuc2ZlcnMgb24gdGhlIHNvdXJjZSBzaWRlCi0gKiBAZHN0X3hmZXJfc2l6ZTogc2l6ZSAoaW4gYnl0ZXMpIG9mIGhhcmR3YXJlIHRyYW5zZmVycyBvbiB0aGUgZGVzdGluYXRpb24gc2lkZQotICogQHNyY19zbGF2ZV9hZGRyOiBzbGF2ZSBzb3VyY2UgbWVtb3J5IGFkZHJlc3MKLSAqIEBkc3Rfc2xhdmVfYWRkcjogc2xhdmUgZGVzdGluYXRpb24gbWVtb3J5IGFkZHJlc3MKKyAqIEBzcmM6IHNsYXZlIG1lbW9yeSBhZGRyZXNzIGFuZCBzaXplIG9uIHRoZSBzb3VyY2Ugc2lkZQorICogQGRzdDogc2xhdmUgbWVtb3J5IGFkZHJlc3MgYW5kIHNpemUgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUKICAqIEBtaWRfcmlkOiBoYXJkd2FyZSBNSUQvUklEIGZvciB0aGUgRE1BIGNsaWVudCB1c2luZyB0aGlzIGNoYW5uZWwKICAqIEBsb2NrOiBwcm90ZWN0cyB0aGUgY2hhbm5lbCBDSENSIHJlZ2lzdGVyIGFuZCB0aGUgZGVzYyBtZW1iZXJzCiAgKiBAZGVzYy5mcmVlOiBsaXN0IG9mIGZyZWUgZGVzY3JpcHRvcnMKQEAgLTE0MiwxMCArMTYyLDkgQEAKIAl2b2lkIF9faW9tZW0gKmlvbWVtOwogCXVuc2lnbmVkIGludCBpbmRleDsKIAotCXVuc2lnbmVkIGludCBzcmNfeGZlcl9zaXplOwotCXVuc2lnbmVkIGludCBkc3RfeGZlcl9zaXplOwotCWRtYV9hZGRyX3Qgc3JjX3NsYXZlX2FkZHI7Ci0JZG1hX2FkZHJfdCBkc3Rfc2xhdmVfYWRkcjsKKwlzdHJ1Y3QgcmNhcl9kbWFjX2NoYW5fc2xhdmUgc3JjOworCXN0cnVjdCByY2FyX2RtYWNfY2hhbl9zbGF2ZSBkc3Q7CisJc3RydWN0IHJjYXJfZG1hY19jaGFuX21hcCBtYXA7CiAJaW50IG1pZF9yaWQ7CiAKIAlzcGlubG9ja190IGxvY2s7CkBAIC03OTMsMTMgKzgxMiwxMyBAQAogCWNhc2UgRE1BX0RFVl9UT19NRU06CiAJCWNoY3IgPSBSQ0FSX0RNQUNIQ1JfRE1fSU5DIHwgUkNBUl9ETUFDSENSX1NNX0ZJWEVECiAJCSAgICAgfCBSQ0FSX0RNQUNIQ1JfUlNfRE1BUlM7Ci0JCXhmZXJfc2l6ZSA9IGNoYW4tPnNyY194ZmVyX3NpemU7CisJCXhmZXJfc2l6ZSA9IGNoYW4tPnNyYy54ZmVyX3NpemU7CiAJCWJyZWFrOwogCiAJY2FzZSBETUFfTUVNX1RPX0RFVjoKIAkJY2hjciA9IFJDQVJfRE1BQ0hDUl9ETV9GSVhFRCB8IFJDQVJfRE1BQ0hDUl9TTV9JTkMKIAkJICAgICB8IFJDQVJfRE1BQ0hDUl9SU19ETUFSUzsKLQkJeGZlcl9zaXplID0gY2hhbi0+ZHN0X3hmZXJfc2l6ZTsKKwkJeGZlcl9zaXplID0gY2hhbi0+ZHN0LnhmZXJfc2l6ZTsKIAkJYnJlYWs7CiAKIAljYXNlIERNQV9NRU1fVE9fTUVNOgpAQCAtMTAyMywxMyArMTA0Miw2NSBAQAogCQkJCSAgICAgIERNQV9NRU1fVE9fTUVNLCBmbGFncywgZmFsc2UpOwogfQogCitzdGF0aWMgaW50IHJjYXJfZG1hY19tYXBfc2xhdmVfYWRkcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCisJCQkJICAgIGVudW0gZG1hX3RyYW5zZmVyX2RpcmVjdGlvbiBkaXIpCit7CisJc3RydWN0IHJjYXJfZG1hY19jaGFuICpyY2hhbiA9IHRvX3JjYXJfZG1hY19jaGFuKGNoYW4pOworCXN0cnVjdCByY2FyX2RtYWNfY2hhbl9tYXAgKm1hcCA9ICZyY2hhbi0+bWFwOworCXBoeXNfYWRkcl90IGRldl9hZGRyOworCXNpemVfdCBkZXZfc2l6ZTsKKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkZXZfZGlyOworCisJaWYgKGRpciA9PSBETUFfREVWX1RPX01FTSkgeworCQlkZXZfYWRkciA9IHJjaGFuLT5zcmMuc2xhdmVfYWRkcjsKKwkJZGV2X3NpemUgPSByY2hhbi0+c3JjLnhmZXJfc2l6ZTsKKwkJZGV2X2RpciA9IERNQV9UT19ERVZJQ0U7CisJfSBlbHNlIHsKKwkJZGV2X2FkZHIgPSByY2hhbi0+ZHN0LnNsYXZlX2FkZHI7CisJCWRldl9zaXplID0gcmNoYW4tPmRzdC54ZmVyX3NpemU7CisJCWRldl9kaXIgPSBETUFfRlJPTV9ERVZJQ0U7CisJfQorCisJLyogUmV1c2UgY3VycmVudCBtYXAgaWYgcG9zc2libGUuICovCisJaWYgKGRldl9hZGRyID09IG1hcC0+c2xhdmUuc2xhdmVfYWRkciAmJgorCSAgICBkZXZfc2l6ZSA9PSBtYXAtPnNsYXZlLnhmZXJfc2l6ZSAmJgorCSAgICBkZXZfZGlyID09IG1hcC0+ZGlyKQorCQlyZXR1cm4gMDsKKworCS8qIFJlbW92ZSBvbGQgbWFwcGluZyBpZiBwcmVzZW50LiAqLworCWlmIChtYXAtPnNsYXZlLnhmZXJfc2l6ZSkKKwkJZG1hX3VubWFwX3Jlc291cmNlKGNoYW4tPmRldmljZS0+ZGV2LCBtYXAtPmFkZHIsCisJCQkJICAgbWFwLT5zbGF2ZS54ZmVyX3NpemUsIG1hcC0+ZGlyLCAwKTsKKwltYXAtPnNsYXZlLnhmZXJfc2l6ZSA9IDA7CisKKwkvKiBDcmVhdGUgbmV3IHNsYXZlIGFkZHJlc3MgbWFwLiAqLworCW1hcC0+YWRkciA9IGRtYV9tYXBfcmVzb3VyY2UoY2hhbi0+ZGV2aWNlLT5kZXYsIGRldl9hZGRyLCBkZXZfc2l6ZSwKKwkJCQkgICAgIGRldl9kaXIsIDApOworCisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGNoYW4tPmRldmljZS0+ZGV2LCBtYXAtPmFkZHIpKSB7CisJCWRldl9lcnIoY2hhbi0+ZGV2aWNlLT5kZXYsCisJCQkiY2hhbiV1OiBmYWlsZWQgdG8gbWFwICV6eEAlcGFwIiwgcmNoYW4tPmluZGV4LAorCQkJZGV2X3NpemUsICZkZXZfYWRkcik7CisJCXJldHVybiAtRUlPOworCX0KKworCWRldl9kYmcoY2hhbi0+ZGV2aWNlLT5kZXYsICJjaGFuJXU6IG1hcCAlenhAJXBhcCB0byAlcGFkIGRpcjogJXNcbiIsCisJCXJjaGFuLT5pbmRleCwgZGV2X3NpemUsICZkZXZfYWRkciwgJm1hcC0+YWRkciwKKwkJZGV2X2RpciA9PSBETUFfVE9fREVWSUNFID8gIkRNQV9UT19ERVZJQ0UiIDogIkRNQV9GUk9NX0RFVklDRSIpOworCisJbWFwLT5zbGF2ZS5zbGF2ZV9hZGRyID0gZGV2X2FkZHI7CisJbWFwLT5zbGF2ZS54ZmVyX3NpemUgPSBkZXZfc2l6ZTsKKwltYXAtPmRpciA9IGRldl9kaXI7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCiByY2FyX2RtYWNfcHJlcF9zbGF2ZV9zZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLAogCQkJdW5zaWduZWQgaW50IHNnX2xlbiwgZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpciwKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IHJjYXJfZG1hY19jaGFuICpyY2hhbiA9IHRvX3JjYXJfZG1hY19jaGFuKGNoYW4pOwotCWRtYV9hZGRyX3QgZGV2X2FkZHI7CiAKIAkvKiBTb21lb25lIGNhbGxpbmcgc2xhdmUgRE1BIG9uIGEgZ2VuZXJpYyBjaGFubmVsPyAqLwogCWlmIChyY2hhbi0+bWlkX3JpZCA8IDAgfHwgIXNnX2xlbikgewpAQCAtMTAzOSw5ICsxMTEwLDEwIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWRldl9hZGRyID0gZGlyID09IERNQV9ERVZfVE9fTUVNCi0JCSA/IHJjaGFuLT5zcmNfc2xhdmVfYWRkciA6IHJjaGFuLT5kc3Rfc2xhdmVfYWRkcjsKLQlyZXR1cm4gcmNhcl9kbWFjX2NoYW5fcHJlcF9zZyhyY2hhbiwgc2dsLCBzZ19sZW4sIGRldl9hZGRyLAorCWlmIChyY2FyX2RtYWNfbWFwX3NsYXZlX2FkZHIoY2hhbiwgZGlyKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gcmNhcl9kbWFjX2NoYW5fcHJlcF9zZyhyY2hhbiwgc2dsLCBzZ19sZW4sIHJjaGFuLT5tYXAuYWRkciwKIAkJCQkgICAgICBkaXIsIGZsYWdzLCBmYWxzZSk7CiB9CiAKQEAgLTEwNTUsNyArMTEyNyw2IEBACiAJc3RydWN0IHJjYXJfZG1hY19jaGFuICpyY2hhbiA9IHRvX3JjYXJfZG1hY19jaGFuKGNoYW4pOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbDsKLQlkbWFfYWRkcl90IGRldl9hZGRyOwogCXVuc2lnbmVkIGludCBzZ19sZW47CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTEwNjcsNiArMTEzOCw5IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAorCWlmIChyY2FyX2RtYWNfbWFwX3NsYXZlX2FkZHIoY2hhbiwgZGlyKSkKKwkJcmV0dXJuIE5VTEw7CisKIAlzZ19sZW4gPSBidWZfbGVuIC8gcGVyaW9kX2xlbjsKIAlpZiAoc2dfbGVuID4gUkNBUl9ETUFDX01BWF9TR19MRU4pIHsKIAkJZGV2X2VycihjaGFuLT5kZXZpY2UtPmRldiwKQEAgLTEwOTQsOSArMTE2OCw3IEBACiAJCXNnX2RtYV9sZW4oJnNnbFtpXSkgPSBwZXJpb2RfbGVuOwogCX0KIAotCWRldl9hZGRyID0gZGlyID09IERNQV9ERVZfVE9fTUVNCi0JCSA/IHJjaGFuLT5zcmNfc2xhdmVfYWRkciA6IHJjaGFuLT5kc3Rfc2xhdmVfYWRkcjsKLQlkZXNjID0gcmNhcl9kbWFjX2NoYW5fcHJlcF9zZyhyY2hhbiwgc2dsLCBzZ19sZW4sIGRldl9hZGRyLAorCWRlc2MgPSByY2FyX2RtYWNfY2hhbl9wcmVwX3NnKHJjaGFuLCBzZ2wsIHNnX2xlbiwgcmNoYW4tPm1hcC5hZGRyLAogCQkJCSAgICAgIGRpciwgZmxhZ3MsIHRydWUpOwogCiAJa2ZyZWUoc2dsKTsKQEAgLTExMTIsMTAgKzExODQsMTAgQEAKIAkgKiBXZSBjb3VsZCBsb2NrIHRoaXMsIGJ1dCB5b3Ugc2hvdWxkbid0IGJlIGNvbmZpZ3VyaW5nIHRoZQogCSAqIGNoYW5uZWwsIHdoaWxlIHVzaW5nIGl0Li4uCiAJICovCi0JcmNoYW4tPnNyY19zbGF2ZV9hZGRyID0gY2ZnLT5zcmNfYWRkcjsKLQlyY2hhbi0+ZHN0X3NsYXZlX2FkZHIgPSBjZmctPmRzdF9hZGRyOwotCXJjaGFuLT5zcmNfeGZlcl9zaXplID0gY2ZnLT5zcmNfYWRkcl93aWR0aDsKLQlyY2hhbi0+ZHN0X3hmZXJfc2l6ZSA9IGNmZy0+ZHN0X2FkZHJfd2lkdGg7CisJcmNoYW4tPnNyYy5zbGF2ZV9hZGRyID0gY2ZnLT5zcmNfYWRkcjsKKwlyY2hhbi0+ZHN0LnNsYXZlX2FkZHIgPSBjZmctPmRzdF9hZGRyOworCXJjaGFuLT5zcmMueGZlcl9zaXplID0gY2ZnLT5zcmNfYWRkcl93aWR0aDsKKwlyY2hhbi0+ZHN0LnhmZXJfc2l6ZSA9IGNmZy0+ZHN0X2FkZHJfd2lkdGg7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzODksMjEgKzE0NjEsMTggQEAKIHsKIAlzdHJ1Y3QgcmNhcl9kbWFjX2NoYW4gKmNoYW4gPSBkZXY7CiAJc3RydWN0IHJjYXJfZG1hY19kZXNjICpkZXNjOworCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKIAogCXNwaW5fbG9ja19pcnEoJmNoYW4tPmxvY2spOwogCiAJLyogRm9yIGN5Y2xpYyB0cmFuc2ZlcnMgbm90aWZ5IHRoZSB1c2VyIGFmdGVyIGV2ZXJ5IGNodW5rLiAqLwogCWlmIChjaGFuLT5kZXNjLnJ1bm5pbmcgJiYgY2hhbi0+ZGVzYy5ydW5uaW5nLT5jeWNsaWMpIHsKLQkJZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrOwotCQl2b2lkICpjYWxsYmFja19wYXJhbTsKLQogCQlkZXNjID0gY2hhbi0+ZGVzYy5ydW5uaW5nOwotCQljYWxsYmFjayA9IGRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrOwotCQljYWxsYmFja19wYXJhbSA9IGRlc2MtPmFzeW5jX3R4LmNhbGxiYWNrX3BhcmFtOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmRlc2MtPmFzeW5jX3R4LCAmY2IpOwogCi0JCWlmIChjYWxsYmFjaykgeworCQlpZiAoZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfdmFsaWQoJmNiKSkgewogCQkJc3Bpbl91bmxvY2tfaXJxKCZjaGFuLT5sb2NrKTsKLQkJCWNhbGxiYWNrKGNhbGxiYWNrX3BhcmFtKTsKKwkJCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCQkJc3Bpbl9sb2NrX2lycSgmY2hhbi0+bG9jayk7CiAJCX0KIAl9CkBAIC0xNDE4LDE0ICsxNDg3LDE1IEBACiAJCWRtYV9jb29raWVfY29tcGxldGUoJmRlc2MtPmFzeW5jX3R4KTsKIAkJbGlzdF9kZWwoJmRlc2MtPm5vZGUpOwogCi0JCWlmIChkZXNjLT5hc3luY190eC5jYWxsYmFjaykgeworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmRlc2MtPmFzeW5jX3R4LCAmY2IpOworCQlpZiAoZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfdmFsaWQoJmNiKSkgewogCQkJc3Bpbl91bmxvY2tfaXJxKCZjaGFuLT5sb2NrKTsKIAkJCS8qCiAJCQkgKiBXZSBvd24gdGhlIG9ubHkgcmVmZXJlbmNlIHRvIHRoaXMgZGVzY3JpcHRvciwgd2UgY2FuCiAJCQkgKiBzYWZlbHkgZGVyZWZlcmVuY2UgaXQgd2l0aG91dCBob2xkaW5nIHRoZSBjaGFubmVsCiAJCQkgKiBsb2NrLgogCQkJICovCi0JCQlkZXNjLT5hc3luY190eC5jYWxsYmFjayhkZXNjLT5hc3luY190eC5jYWxsYmFja19wYXJhbSk7CisJCQlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAkJCXNwaW5fbG9ja19pcnEoJmNoYW4tPmxvY2spOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3NoL3NoZG1hLWJhc2UuYyBiL2RyaXZlcnMvZG1hL3NoL3NoZG1hLWJhc2UuYwppbmRleCAxMGZjYWJhLi4xMmZhNDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zaC9zaGRtYS1iYXNlLmMKKysrIGIvZHJpdmVycy9kbWEvc2gvc2hkbWEtYmFzZS5jCkBAIC0zMzAsMTAgKzMzMCwxMSBAQAogCWJvb2wgaGVhZF9hY2tlZCA9IGZhbHNlOwogCWRtYV9jb29raWVfdCBjb29raWUgPSAwOwogCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjayA9IE5VTEw7Ci0Jdm9pZCAqcGFyYW0gPSBOVUxMOworCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCUxJU1RfSEVBRChjeWNsaWNfbGlzdCk7CiAKKwltZW1zZXQoJmNiLCAwLCBzaXplb2YoY2IpKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2NoYW4tPmNoYW5fbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZGVzYywgJnNjaGFuLT5sZF9xdWV1ZSwgbm9kZSkgewogCQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ID0gJmRlc2MtPmFzeW5jX3R4OwpAQCAtMzY3LDggKzM2OCw4IEBACiAJCS8qIENhbGwgY2FsbGJhY2sgb24gdGhlIGxhc3QgY2h1bmsgKi8KIAkJaWYgKGRlc2MtPm1hcmsgPT0gREVTQ19DT01QTEVURUQgJiYgdHgtPmNhbGxiYWNrKSB7CiAJCQlkZXNjLT5tYXJrID0gREVTQ19XQUlUSU5HOworCQkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKHR4LCAmY2IpOwogCQkJY2FsbGJhY2sgPSB0eC0+Y2FsbGJhY2s7Ci0JCQlwYXJhbSA9IHR4LT5jYWxsYmFja19wYXJhbTsKIAkJCWRldl9kYmcoc2NoYW4tPmRldiwgImRlc2NyaXB0b3IgIyVkQCVwIG9uICVkIGNhbGxiYWNrXG4iLAogCQkJCXR4LT5jb29raWUsIHR4LCBzY2hhbi0+aWQpOwogCQkJQlVHX09OKGRlc2MtPmNodW5rcyAhPSAxKTsKQEAgLTQzMCw4ICs0MzEsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NoYW4tPmNoYW5fbG9jaywgZmxhZ3MpOwogCi0JaWYgKGNhbGxiYWNrKQotCQljYWxsYmFjayhwYXJhbSk7CisJZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCZjYiwgTlVMTCk7CiAKIAlyZXR1cm4gY2FsbGJhY2s7CiB9CkBAIC04ODUsOSArODg1LDkgQEAKIAkJLyogQ29tcGxldGUgYWxsICAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkZXNjLCAmZGwsIG5vZGUpIHsKIAkJCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHggPSAmc2Rlc2MtPmFzeW5jX3R4OworCiAJCQlzZGVzYy0+bWFyayA9IERFU0NfSURMRTsKLQkJCWlmICh0eC0+Y2FsbGJhY2spCi0JCQkJdHgtPmNhbGxiYWNrKHR4LT5jYWxsYmFja19wYXJhbSk7CisJCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKHR4LCBOVUxMKTsKIAkJfQogCiAJCXNwaW5fbG9jaygmc2NoYW4tPmNoYW5fbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaC91c2ItZG1hYy5jIGIvZHJpdmVycy9kbWEvc2gvdXNiLWRtYWMuYwppbmRleCA3NDlmMWJkLi4wNmVjZGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zaC91c2ItZG1hYy5jCisrKyBiL2RyaXZlcnMvZG1hL3NoL3VzYi1kbWFjLmMKQEAgLTYwMCwyNyArNjAwLDMwIEBACiB7CiAJc3RydWN0IHVzYl9kbWFjX2NoYW4gKmNoYW4gPSBkZXY7CiAJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7Ci0JdTMyIG1hc2sgPSBVU0JfRE1BQ0hDUl9URTsKLQl1MzIgY2hlY2tfYml0cyA9IFVTQl9ETUFDSENSX1RFIHwgVVNCX0RNQUNIQ1JfU1A7CisJdTMyIG1hc2sgPSAwOwogCXUzMiBjaGNyOworCWJvb2wgeGZlcl9lbmQgPSBmYWxzZTsKIAogCXNwaW5fbG9jaygmY2hhbi0+dmMubG9jayk7CiAKIAljaGNyID0gdXNiX2RtYWNfY2hhbl9yZWFkKGNoYW4sIFVTQl9ETUFDSENSKTsKLQlpZiAoY2hjciAmIGNoZWNrX2JpdHMpCi0JCW1hc2sgfD0gVVNCX0RNQUNIQ1JfREUgfCBjaGVja19iaXRzOworCWlmIChjaGNyICYgKFVTQl9ETUFDSENSX1RFIHwgVVNCX0RNQUNIQ1JfU1ApKSB7CisJCW1hc2sgfD0gVVNCX0RNQUNIQ1JfREUgfCBVU0JfRE1BQ0hDUl9URSB8IFVTQl9ETUFDSENSX1NQOworCQlpZiAoY2hjciAmIFVTQl9ETUFDSENSX0RFKQorCQkJeGZlcl9lbmQgPSB0cnVlOworCQlyZXQgfD0gSVJRX0hBTkRMRUQ7CisJfQogCWlmIChjaGNyICYgVVNCX0RNQUNIQ1JfTlVMTCkgewogCQkvKiBBbiBpbnRlcnJ1cHRpb24gb2YgVEUgd2lsbCBoYXBwZW4gYWZ0ZXIgd2Ugc2V0IEZURSAqLwogCQltYXNrIHw9IFVTQl9ETUFDSENSX05VTEw7CiAJCWNoY3IgfD0gVVNCX0RNQUNIQ1JfRlRFOwogCQlyZXQgfD0gSVJRX0hBTkRMRUQ7CiAJfQotCXVzYl9kbWFjX2NoYW5fd3JpdGUoY2hhbiwgVVNCX0RNQUNIQ1IsIGNoY3IgJiB+bWFzayk7CisJaWYgKG1hc2spCisJCXVzYl9kbWFjX2NoYW5fd3JpdGUoY2hhbiwgVVNCX0RNQUNIQ1IsIGNoY3IgJiB+bWFzayk7CiAKLQlpZiAoY2hjciAmIGNoZWNrX2JpdHMpIHsKKwlpZiAoeGZlcl9lbmQpCiAJCXVzYl9kbWFjX2lzcl90cmFuc2Zlcl9lbmQoY2hhbik7Ci0JCXJldCB8PSBJUlFfSEFORExFRDsKLQl9CiAKIAlzcGluX3VubG9jaygmY2hhbi0+dmMubG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3NpcmYtZG1hLmMgYi9kcml2ZXJzL2RtYS9zaXJmLWRtYS5jCmluZGV4IGQ4YmMzZjIuLjhmNjJlZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3NpcmYtZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvc2lyZi1kbWEuYwpAQCAtMzYwLDkgKzM2MCw3IEBACiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNkZXNjLCAmbGlzdCwgbm9kZSkgewogCQkJCWRlc2MgPSAmc2Rlc2MtPmRlc2M7CiAKLQkJCQlpZiAoZGVzYy0+Y2FsbGJhY2spCi0JCQkJCWRlc2MtPmNhbGxiYWNrKGRlc2MtPmNhbGxiYWNrX3BhcmFtKTsKLQorCQkJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFja19pbnZva2UoZGVzYywgTlVMTCk7CiAJCQkJbGFzdF9jb29raWUgPSBkZXNjLT5jb29raWU7CiAJCQkJZG1hX3J1bl9kZXBlbmRlbmNpZXMoZGVzYyk7CiAJCQl9CkBAIC0zODgsOCArMzg2LDcgQEAKIAogCQkJZGVzYyA9ICZzZGVzYy0+ZGVzYzsKIAkJCXdoaWxlIChoYXBwZW5lZF9jeWNsaWMgIT0gc2NoYW4tPmNvbXBsZXRlZF9jeWNsaWMpIHsKLQkJCQlpZiAoZGVzYy0+Y2FsbGJhY2spCi0JCQkJCWRlc2MtPmNhbGxiYWNrKGRlc2MtPmNhbGxiYWNrX3BhcmFtKTsKKwkJCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKGRlc2MsIE5VTEwpOwogCQkJCXNjaGFuLT5jb21wbGV0ZWRfY3ljbGljKys7CiAJCQl9CiAJCX0KQEAgLTg2OSw3ICs4NjYsNyBAQAogCX0KIAogCXNkbWEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRuLCAwKTsKLQlpZiAoc2RtYS0+aXJxID09IE5PX0lSUSkgeworCWlmICghc2RtYS0+aXJxKSB7CiAJCWRldl9lcnIoZGV2LCAiRXJyb3IgbWFwcGluZyBJUlEhXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMgYi9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYwppbmRleCA4YjE4ZTQ0Li44Njg0ZDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYworKysgYi9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYwpAQCAtODc0LDcgKzg3NCw3IEBACiAJfQogCiAJaWYgKGN1cnJfbGNsYSA8IDApCi0JCWdvdG8gb3V0OworCQlnb3RvIHNldF9jdXJyZW50OwogCiAJZm9yICg7IGxsaV9jdXJyZW50IDwgbGxpX2xlbjsgbGxpX2N1cnJlbnQrKykgewogCQl1bnNpZ25lZCBpbnQgbGNsYV9vZmZzZXQgPSBjaGFuLT5waHlfY2hhbi0+bnVtICogMTAyNCArCkBAIC05MjUsOCArOTI1LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfQotCi1vdXQ6Cisgc2V0X2N1cnJlbnQ6CiAJZGVzYy0+bGxpX2N1cnJlbnQgPSBsbGlfY3VycmVudDsKIH0KIApAQCAtOTQxLDE1ICs5NDAsNyBAQAogCiBzdGF0aWMgc3RydWN0IGQ0MF9kZXNjICpkNDBfZmlyc3RfYWN0aXZlX2dldChzdHJ1Y3QgZDQwX2NoYW4gKmQ0MGMpCiB7Ci0Jc3RydWN0IGQ0MF9kZXNjICpkOwotCi0JaWYgKGxpc3RfZW1wdHkoJmQ0MGMtPmFjdGl2ZSkpCi0JCXJldHVybiBOVUxMOwotCi0JZCA9IGxpc3RfZmlyc3RfZW50cnkoJmQ0MGMtPmFjdGl2ZSwKLQkJCSAgICAgc3RydWN0IGQ0MF9kZXNjLAotCQkJICAgICBub2RlKTsKLQlyZXR1cm4gZDsKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZkNDBjLT5hY3RpdmUsIHN0cnVjdCBkNDBfZGVzYywgbm9kZSk7CiB9CiAKIC8qIHJlbW92ZSBkZXNjIGZyb20gY3VycmVudCBxdWV1ZSBhbmQgYWRkIGl0IHRvIHRoZSBwZW5kaW5nX3F1ZXVlICovCkBAIC05NjIsMzYgKzk1MywxOCBAQAogCiBzdGF0aWMgc3RydWN0IGQ0MF9kZXNjICpkNDBfZmlyc3RfcGVuZGluZyhzdHJ1Y3QgZDQwX2NoYW4gKmQ0MGMpCiB7Ci0Jc3RydWN0IGQ0MF9kZXNjICpkOwotCi0JaWYgKGxpc3RfZW1wdHkoJmQ0MGMtPnBlbmRpbmdfcXVldWUpKQotCQlyZXR1cm4gTlVMTDsKLQotCWQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkNDBjLT5wZW5kaW5nX3F1ZXVlLAotCQkJICAgICBzdHJ1Y3QgZDQwX2Rlc2MsCi0JCQkgICAgIG5vZGUpOwotCXJldHVybiBkOworCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmQ0MGMtPnBlbmRpbmdfcXVldWUsIHN0cnVjdCBkNDBfZGVzYywKKwkJCQkJbm9kZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZDQwX2Rlc2MgKmQ0MF9maXJzdF9xdWV1ZWQoc3RydWN0IGQ0MF9jaGFuICpkNDBjKQogewotCXN0cnVjdCBkNDBfZGVzYyAqZDsKLQotCWlmIChsaXN0X2VtcHR5KCZkNDBjLT5xdWV1ZSkpCi0JCXJldHVybiBOVUxMOwotCi0JZCA9IGxpc3RfZmlyc3RfZW50cnkoJmQ0MGMtPnF1ZXVlLAotCQkJICAgICBzdHJ1Y3QgZDQwX2Rlc2MsCi0JCQkgICAgIG5vZGUpOwotCXJldHVybiBkOworCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmQ0MGMtPnF1ZXVlLCBzdHJ1Y3QgZDQwX2Rlc2MsIG5vZGUpOwogfQogCiBzdGF0aWMgc3RydWN0IGQ0MF9kZXNjICpkNDBfZmlyc3RfZG9uZShzdHJ1Y3QgZDQwX2NoYW4gKmQ0MGMpCiB7Ci0JaWYgKGxpc3RfZW1wdHkoJmQ0MGMtPmRvbmUpKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5KCZkNDBjLT5kb25lLCBzdHJ1Y3QgZDQwX2Rlc2MsIG5vZGUpOworCXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmQ0MGMtPmRvbmUsIHN0cnVjdCBkNDBfZGVzYywgbm9kZSk7CiB9CiAKIHN0YXRpYyBpbnQgZDQwX3BzaXplXzJfYnVyc3Rfc2l6ZShib29sIGlzX2xvZywgaW50IHBzaXplKQpAQCAtMTA4Myw3ICsxMDU2LDcgQEAKIAkJCUQ0MF9DSEFOX1BPUyhkNDBjLT5waHlfY2hhbi0+bnVtKTsKIAogCQlpZiAoc3RhdHVzID09IEQ0MF9ETUFfU1VTUEVOREVEIHx8IHN0YXR1cyA9PSBENDBfRE1BX1NUT1ApCi0JCQlnb3RvIGRvbmU7CisJCQlnb3RvIHVubG9jazsKIAl9CiAKIAl3bWFzayA9IDB4ZmZmZmZmZmYgJiB+KEQ0MF9DSEFOX1BPU19NQVNLKGQ0MGMtPnBoeV9jaGFuLT5udW0pKTsKQEAgLTExMTksNyArMTA5Miw3IEBACiAJCX0KIAogCX0KLWRvbmU6CisgdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQ0MGMtPmJhc2UtPmV4ZWNtZF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1OTYsOCArMTU2OSw3IEBACiAJc3RydWN0IGQ0MF9kZXNjICpkNDBkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYm9vbCBjYWxsYmFja19hY3RpdmU7Ci0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrOwotCXZvaWQgKmNhbGxiYWNrX3BhcmFtOworCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkNDBjLT5sb2NrLCBmbGFncyk7CiAKQEAgLTE2MDcsNyArMTU3OSw3IEBACiAJCS8qIENoZWNrIGlmIHdlIGhhdmUgcmVhY2hlZCBoZXJlIGZvciBjeWNsaWMgam9iICovCiAJCWQ0MGQgPSBkNDBfZmlyc3RfYWN0aXZlX2dldChkNDBjKTsKIAkJaWYgKGQ0MGQgPT0gTlVMTCB8fCAhZDQwZC0+Y3ljbGljKQotCQkJZ290byBlcnI7CisJCQlnb3RvIGNoZWNrX3BlbmRpbmdfdHg7CiAJfQogCiAJaWYgKCFkNDBkLT5jeWNsaWMpCkBAIC0xNjI0LDggKzE1OTYsNyBAQAogCiAJLyogQ2FsbGJhY2sgdG8gY2xpZW50ICovCiAJY2FsbGJhY2tfYWN0aXZlID0gISEoZDQwZC0+dHhkLmZsYWdzICYgRE1BX1BSRVBfSU5URVJSVVBUKTsKLQljYWxsYmFjayA9IGQ0MGQtPnR4ZC5jYWxsYmFjazsKLQljYWxsYmFja19wYXJhbSA9IGQ0MGQtPnR4ZC5jYWxsYmFja19wYXJhbTsKKwlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmQ0MGQtPnR4ZCwgJmNiKTsKIAogCWlmICghZDQwZC0+Y3ljbGljKSB7CiAJCWlmIChhc3luY190eF90ZXN0X2FjaygmZDQwZC0+dHhkKSkgewpAQCAtMTY0NiwxMiArMTYxNywxMSBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZDQwYy0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKGNhbGxiYWNrX2FjdGl2ZSAmJiBjYWxsYmFjaykKLQkJY2FsbGJhY2soY2FsbGJhY2tfcGFyYW0pOworCWlmIChjYWxsYmFja19hY3RpdmUpCisJCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCiAJcmV0dXJuOwotCi1lcnI6CisgY2hlY2tfcGVuZGluZ190eDoKIAkvKiBSZXNjdWUgbWFub3V2ZXIgaWYgcmVjZWl2aW5nIGRvdWJsZSBpbnRlcnJ1cHRzICovCiAJaWYgKGQ0MGMtPnBlbmRpbmdfdHggPiAwKQogCQlkNDBjLT5wZW5kaW5nX3R4LS07CkBAIC0xNzgwLDQyICsxNzUwLDQwIEBACiAJCSAgICBwaHktPmFsbG9jYXRlZF9kc3QgPT0gRDQwX0FMTE9DX0ZSRUUpIHsKIAkJCXBoeS0+YWxsb2NhdGVkX2RzdCA9IEQ0MF9BTExPQ19QSFk7CiAJCQlwaHktPmFsbG9jYXRlZF9zcmMgPSBENDBfQUxMT0NfUEhZOwotCQkJZ290byBmb3VuZDsKKwkJCWdvdG8gZm91bmRfdW5sb2NrOwogCQl9IGVsc2UKLQkJCWdvdG8gbm90X2ZvdW5kOworCQkJZ290byBub3RfZm91bmRfdW5sb2NrOwogCX0KIAogCS8qIExvZ2ljYWwgY2hhbm5lbCAqLwogCWlmIChpc19zcmMpIHsKIAkJaWYgKHBoeS0+YWxsb2NhdGVkX3NyYyA9PSBENDBfQUxMT0NfUEhZKQotCQkJZ290byBub3RfZm91bmQ7CisJCQlnb3RvIG5vdF9mb3VuZF91bmxvY2s7CiAKIAkJaWYgKHBoeS0+YWxsb2NhdGVkX3NyYyA9PSBENDBfQUxMT0NfRlJFRSkKIAkJCXBoeS0+YWxsb2NhdGVkX3NyYyA9IEQ0MF9BTExPQ19MT0dfRlJFRTsKIAogCQlpZiAoIShwaHktPmFsbG9jYXRlZF9zcmMgJiBCSVQobG9nX2V2ZW50X2xpbmUpKSkgewogCQkJcGh5LT5hbGxvY2F0ZWRfc3JjIHw9IEJJVChsb2dfZXZlbnRfbGluZSk7Ci0JCQlnb3RvIGZvdW5kOworCQkJZ290byBmb3VuZF91bmxvY2s7CiAJCX0gZWxzZQotCQkJZ290byBub3RfZm91bmQ7CisJCQlnb3RvIG5vdF9mb3VuZF91bmxvY2s7CiAJfSBlbHNlIHsKIAkJaWYgKHBoeS0+YWxsb2NhdGVkX2RzdCA9PSBENDBfQUxMT0NfUEhZKQotCQkJZ290byBub3RfZm91bmQ7CisJCQlnb3RvIG5vdF9mb3VuZF91bmxvY2s7CiAKIAkJaWYgKHBoeS0+YWxsb2NhdGVkX2RzdCA9PSBENDBfQUxMT0NfRlJFRSkKIAkJCXBoeS0+YWxsb2NhdGVkX2RzdCA9IEQ0MF9BTExPQ19MT0dfRlJFRTsKIAogCQlpZiAoIShwaHktPmFsbG9jYXRlZF9kc3QgJiBCSVQobG9nX2V2ZW50X2xpbmUpKSkgewogCQkJcGh5LT5hbGxvY2F0ZWRfZHN0IHw9IEJJVChsb2dfZXZlbnRfbGluZSk7Ci0JCQlnb3RvIGZvdW5kOwotCQl9IGVsc2UKLQkJCWdvdG8gbm90X2ZvdW5kOworCQkJZ290byBmb3VuZF91bmxvY2s7CisJCX0KIAl9Ci0KLW5vdF9mb3VuZDoKKyBub3RfZm91bmRfdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoeS0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBmYWxzZTsKLWZvdW5kOgorIGZvdW5kX3VubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaHktPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTE4MzEsNyArMTc5OSw3IEBACiAJCXBoeS0+YWxsb2NhdGVkX2RzdCA9IEQ0MF9BTExPQ19GUkVFOwogCQlwaHktPmFsbG9jYXRlZF9zcmMgPSBENDBfQUxMT0NfRlJFRTsKIAkJaXNfZnJlZSA9IHRydWU7Ci0JCWdvdG8gb3V0OworCQlnb3RvIHVubG9jazsKIAl9CiAKIAkvKiBMb2dpY2FsIGNoYW5uZWwgKi8KQEAgLTE4NDcsOCArMTgxNSw3IEBACiAKIAlpc19mcmVlID0gKChwaHktPmFsbG9jYXRlZF9zcmMgfCBwaHktPmFsbG9jYXRlZF9kc3QpID09CiAJCSAgIEQ0MF9BTExPQ19GUkVFKTsKLQotb3V0OgorIHVubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaHktPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiBpc19mcmVlOwpAQCAtMjA0Nyw3ICsyMDE0LDcgQEAKIAlyZXMgPSBkNDBfY2hhbm5lbF9leGVjdXRlX2NvbW1hbmQoZDQwYywgRDQwX0RNQV9TVE9QKTsKIAlpZiAocmVzKSB7CiAJCWNoYW5fZXJyKGQ0MGMsICJzdG9wIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG1hcmtfbGFzdF9idXN5OwogCX0KIAogCWQ0MF9hbGxvY19tYXNrX2ZyZWUocGh5LCBpc19zcmMsIGNoYW5faXNfbG9naWNhbChkNDBjKSA/IGV2ZW50IDogMCk7CkBAIC0yMDY1LDggKzIwMzIsNyBAQAogCWQ0MGMtPmJ1c3kgPSBmYWxzZTsKIAlkNDBjLT5waHlfY2hhbiA9IE5VTEw7CiAJZDQwYy0+Y29uZmlndXJlZCA9IGZhbHNlOwotb3V0OgotCisgbWFya19sYXN0X2J1c3k6CiAJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkNDBjLT5iYXNlLT5kZXYpOwogCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGQ0MGMtPmJhc2UtPmRldik7CiAJcmV0dXJuIHJlczsKQEAgLTIwOTQsOCArMjA2MCw3IEBACiAJCQlENDBfQ0hBTl9QT1MoZDQwYy0+cGh5X2NoYW4tPm51bSk7CiAJCWlmIChzdGF0dXMgPT0gRDQwX0RNQV9TVVNQRU5ERUQgfHwgc3RhdHVzID09IEQ0MF9ETUFfU1RPUCkKIAkJCWlzX3BhdXNlZCA9IHRydWU7Ci0KLQkJZ290byBfZXhpdDsKKwkJZ290byB1bmxvY2s7CiAJfQogCiAJaWYgKGQ0MGMtPmRtYV9jZmcuZGlyID09IERNQV9NRU1fVE9fREVWIHx8CkBAIC0yMTA1LDcgKzIwNzAsNyBAQAogCQlzdGF0dXMgPSByZWFkbChjaGFuYmFzZSArIEQ0MF9DSEFOX1JFR19TU0xOSyk7CiAJfSBlbHNlIHsKIAkJY2hhbl9lcnIoZDQwYywgIlVua25vd24gZGlyZWN0aW9uXG4iKTsKLQkJZ290byBfZXhpdDsKKwkJZ290byB1bmxvY2s7CiAJfQogCiAJc3RhdHVzID0gKHN0YXR1cyAmIEQ0MF9FVkVOVExJTkVfTUFTSyhldmVudCkpID4+CkBAIC0yMTEzLDcgKzIwNzgsNyBAQAogCiAJaWYgKHN0YXR1cyAhPSBENDBfRE1BX1JVTikKIAkJaXNfcGF1c2VkID0gdHJ1ZTsKLV9leGl0OgorIHVubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkNDBjLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGlzX3BhdXNlZDsKIApAQCAtMjE5OCw3ICsyMTYzLDcgQEAKIGQ0MF9wcmVwX2Rlc2Moc3RydWN0IGQ0MF9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAogCSAgICAgIHVuc2lnbmVkIGludCBzZ19sZW4sIHVuc2lnbmVkIGxvbmcgZG1hX2ZsYWdzKQogewotCXN0cnVjdCBzdGVkbWE0MF9jaGFuX2NmZyAqY2ZnID0gJmNoYW4tPmRtYV9jZmc7CisJc3RydWN0IHN0ZWRtYTQwX2NoYW5fY2ZnICpjZmc7CiAJc3RydWN0IGQ0MF9kZXNjICpkZXNjOwogCWludCByZXQ7CiAKQEAgLTIyMDYsMTcgKzIxNzEsMTggQEAKIAlpZiAoIWRlc2MpCiAJCXJldHVybiBOVUxMOwogCisJY2ZnID0gJmNoYW4tPmRtYV9jZmc7CiAJZGVzYy0+bGxpX2xlbiA9IGQ0MF9zZ18yX2RtYWxlbihzZywgc2dfbGVuLCBjZmctPnNyY19pbmZvLmRhdGFfd2lkdGgsCiAJCQkJCWNmZy0+ZHN0X2luZm8uZGF0YV93aWR0aCk7CiAJaWYgKGRlc2MtPmxsaV9sZW4gPCAwKSB7CiAJCWNoYW5fZXJyKGNoYW4sICJVbmFsaWduZWQgc2l6ZVxuIik7Ci0JCWdvdG8gZXJyOworCQlnb3RvIGZyZWVfZGVzYzsKIAl9CiAKIAlyZXQgPSBkNDBfcG9vbF9sbGlfYWxsb2MoY2hhbiwgZGVzYywgZGVzYy0+bGxpX2xlbik7CiAJaWYgKHJldCA8IDApIHsKIAkJY2hhbl9lcnIoY2hhbiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBsbGlcbiIpOwotCQlnb3RvIGVycjsKKwkJZ290byBmcmVlX2Rlc2M7CiAJfQogCiAJZGVzYy0+bGxpX2N1cnJlbnQgPSAwOwpAQCAtMjIyNiw4ICsyMTkyLDcgQEAKIAlkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcl9pbml0KCZkZXNjLT50eGQsICZjaGFuLT5jaGFuKTsKIAogCXJldHVybiBkZXNjOwotCi1lcnI6CisgZnJlZV9kZXNjOgogCWQ0MF9kZXNjX2ZyZWUoY2hhbiwgZGVzYyk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0yMjM4LDggKzIyMDMsOCBAQAogCSAgICBlbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyZWN0aW9uLCB1bnNpZ25lZCBsb25nIGRtYV9mbGFncykKIHsKIAlzdHJ1Y3QgZDQwX2NoYW4gKmNoYW4gPSBjb250YWluZXJfb2YoZGNoYW4sIHN0cnVjdCBkNDBfY2hhbiwgY2hhbik7Ci0JZG1hX2FkZHJfdCBzcmNfZGV2X2FkZHIgPSAwOwotCWRtYV9hZGRyX3QgZHN0X2Rldl9hZGRyID0gMDsKKwlkbWFfYWRkcl90IHNyY19kZXZfYWRkcjsKKwlkbWFfYWRkcl90IGRzdF9kZXZfYWRkcjsKIAlzdHJ1Y3QgZDQwX2Rlc2MgKmRlc2M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwpAQCAtMjI1MywxMSArMjIxOCwxMyBAQAogCiAJZGVzYyA9IGQ0MF9wcmVwX2Rlc2MoY2hhbiwgc2dfc3JjLCBzZ19sZW4sIGRtYV9mbGFncyk7CiAJaWYgKGRlc2MgPT0gTlVMTCkKLQkJZ290byBlcnI7CisJCWdvdG8gdW5sb2NrOwogCiAJaWYgKHNnX25leHQoJnNnX3NyY1tzZ19sZW4gLSAxXSkgPT0gc2dfc3JjKQogCQlkZXNjLT5jeWNsaWMgPSB0cnVlOwogCisJc3JjX2Rldl9hZGRyID0gMDsKKwlkc3RfZGV2X2FkZHIgPSAwOwogCWlmIChkaXJlY3Rpb24gPT0gRE1BX0RFVl9UT19NRU0pCiAJCXNyY19kZXZfYWRkciA9IGNoYW4tPnJ1bnRpbWVfYWRkcjsKIAllbHNlIGlmIChkaXJlY3Rpb24gPT0gRE1BX01FTV9UT19ERVYpCkBAIC0yMjczLDcgKzIyNDAsNyBAQAogCWlmIChyZXQpIHsKIAkJY2hhbl9lcnIoY2hhbiwgIkZhaWxlZCB0byBwcmVwYXJlICVzIHNnIGpvYjogJWRcbiIsCiAJCQkgY2hhbl9pc19sb2dpY2FsKGNoYW4pID8gImxvZyIgOiAicGh5IiwgcmV0KTsKLQkJZ290byBlcnI7CisJCWdvdG8gZnJlZV9kZXNjOwogCX0KIAogCS8qCkBAIC0yMjg1LDEwICsyMjUyLDkgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gJmRlc2MtPnR4ZDsKLQotZXJyOgotCWlmIChkZXNjKQotCQlkNDBfZGVzY19mcmVlKGNoYW4sIGRlc2MpOworIGZyZWVfZGVzYzoKKwlkNDBfZGVzY19mcmVlKGNoYW4sIGRlc2MpOworIHVubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0yNDI2LDcgKzIzOTIsNyBAQAogCQllcnIgPSBkNDBfY29uZmlnX21lbWNweShkNDBjKTsKIAkJaWYgKGVycikgewogCQkJY2hhbl9lcnIoZDQwYywgIkZhaWxlZCB0byBjb25maWd1cmUgbWVtY3B5IGNoYW5uZWxcbiIpOwotCQkJZ290byBmYWlsOworCQkJZ290byBtYXJrX2xhc3RfYnVzeTsKIAkJfQogCX0KIApAQCAtMjQzNCw3ICsyNDAwLDcgQEAKIAlpZiAoZXJyKSB7CiAJCWNoYW5fZXJyKGQ0MGMsICJGYWlsZWQgdG8gYWxsb2NhdGUgY2hhbm5lbFxuIik7CiAJCWQ0MGMtPmNvbmZpZ3VyZWQgPSBmYWxzZTsKLQkJZ290byBmYWlsOworCQlnb3RvIG1hcmtfbGFzdF9idXN5OwogCX0KIAogCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZDQwYy0+YmFzZS0+ZGV2KTsKQEAgLTI0NjgsNyArMjQzNCw3IEBACiAJICovCiAJaWYgKGlzX2ZyZWVfcGh5KQogCQlkNDBfY29uZmlnX3dyaXRlKGQ0MGMpOwotZmFpbDoKKyBtYXJrX2xhc3RfYnVzeToKIAlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGQ0MGMtPmJhc2UtPmRldik7CiAJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoZDQwYy0+YmFzZS0+ZGV2KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkNDBjLT5sb2NrLCBmbGFncyk7CkBAIC0yODkxLDcgKzI4NTcsNyBAQAogCiAJaWYgKGVycikgewogCQlkNDBfZXJyKGJhc2UtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBzbGF2ZSBjaGFubmVsc1xuIik7Ci0JCWdvdG8gZmFpbHVyZTE7CisJCWdvdG8gZXhpdDsKIAl9CiAKIAlkNDBfY2hhbl9pbml0KGJhc2UsICZiYXNlLT5kbWFfbWVtY3B5LCBiYXNlLT5sb2dfY2hhbnMsCkBAIC0yOTA4LDcgKzI4NzQsNyBAQAogCWlmIChlcnIpIHsKIAkJZDQwX2VycihiYXNlLT5kZXYsCiAJCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIG1lbWNweSBvbmx5IGNoYW5uZWxzXG4iKTsKLQkJZ290byBmYWlsdXJlMjsKKwkJZ290byB1bnJlZ2lzdGVyX3NsYXZlOwogCX0KIAogCWQ0MF9jaGFuX2luaXQoYmFzZSwgJmJhc2UtPmRtYV9ib3RoLCBiYXNlLT5waHlfY2hhbnMsCkBAIC0yOTI2LDE0ICsyODkyLDE0IEBACiAJaWYgKGVycikgewogCQlkNDBfZXJyKGJhc2UtPmRldiwKIAkJCSJGYWlsZWQgdG8gcmVnaXN0ZXIgbG9naWNhbCBhbmQgcGh5c2ljYWwgY2FwYWJsZSBjaGFubmVsc1xuIik7Ci0JCWdvdG8gZmFpbHVyZTM7CisJCWdvdG8gdW5yZWdpc3Rlcl9tZW1jcHk7CiAJfQogCXJldHVybiAwOwotZmFpbHVyZTM6CisgdW5yZWdpc3Rlcl9tZW1jcHk6CiAJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZiYXNlLT5kbWFfbWVtY3B5KTsKLWZhaWx1cmUyOgorIHVucmVnaXN0ZXJfc2xhdmU6CiAJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZiYXNlLT5kbWFfc2xhdmUpOwotZmFpbHVyZTE6CisgZXhpdDoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zMTQ0LDExICszMTEwLDExIEBACiBzdGF0aWMgc3RydWN0IGQ0MF9iYXNlICogX19pbml0IGQ0MF9od19kZXRlY3RfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzdGVkbWE0MF9wbGF0Zm9ybV9kYXRhICpwbGF0X2RhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwotCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7Ci0Jdm9pZCBfX2lvbWVtICp2aXJ0YmFzZSA9IE5VTEw7Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSBOVUxMOwotCXN0cnVjdCBkNDBfYmFzZSAqYmFzZSA9IE5VTEw7Ci0JaW50IG51bV9sb2dfY2hhbnMgPSAwOworCXN0cnVjdCBjbGsgKmNsazsKKwl2b2lkIF9faW9tZW0gKnZpcnRiYXNlOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBkNDBfYmFzZSAqYmFzZTsKKwlpbnQgbnVtX2xvZ19jaGFuczsKIAlpbnQgbnVtX3BoeV9jaGFuczsKIAlpbnQgbnVtX21lbWNweV9jaGFuczsKIAlpbnQgY2xrX3JldCA9IC1FSU5WQUw7CkBAIC0zMTYwLDI3ICszMTI2LDI3IEBACiAJY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGNsaykpIHsKIAkJZDQwX2VycigmcGRldi0+ZGV2LCAiTm8gbWF0Y2hpbmcgY2xvY2sgZm91bmRcbiIpOwotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gY2hlY2tfcHJlcGFyZV9lbmFibGVkOwogCX0KIAogCWNsa19yZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKIAlpZiAoY2xrX3JldCkgewogCQlkNDBfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcHJlcGFyZS9lbmFibGUgY2xvY2tcbiIpOwotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gZGlzYWJsZV91bnByZXBhcmU7CiAJfQogCiAJLyogR2V0IElPIGZvciBETUFDIGJhc2UgYWRkcmVzcyAqLwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJiYXNlIik7CiAJaWYgKCFyZXMpCi0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBkaXNhYmxlX3VucHJlcGFyZTsKIAogCWlmIChyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLAogCQkJICAgICAgIEQ0MF9OQU1FICIgSS9PIGJhc2UiKSA9PSBOVUxMKQotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gcmVsZWFzZV9yZWdpb247CiAKIAl2aXJ0YmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAoIXZpcnRiYXNlKQotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gcmVsZWFzZV9yZWdpb247CiAKIAkvKiBUaGlzIGlzIGp1c3QgYSByZWd1bGFyIEFNQkEgUHJpbWVDZWxsIElEIGFjdHVhbGx5ICovCiAJZm9yIChwaWQgPSAwLCBpID0gMDsgaSA8IDQ7IGkrKykKQEAgLTMxOTIsMTMgKzMxNTgsMTMgQEAKIAogCWlmIChjaWQgIT0gQU1CQV9DSUQpIHsKIAkJZDQwX2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBoYXJkd2FyZSEgTm8gUHJpbWVDZWxsIElEXG4iKTsKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIHVubWFwX2lvOwogCX0KIAlpZiAoQU1CQV9NQU5GX0JJVFMocGlkKSAhPSBBTUJBX1ZFTkRPUl9TVCkgewogCQlkNDBfZXJyKCZwZGV2LT5kZXYsICJVbmtub3duIGRlc2lnbmVyISBHb3QgJXggd2FudGVkICV4XG4iLAogCQkJQU1CQV9NQU5GX0JJVFMocGlkKSwKIAkJCUFNQkFfVkVORE9SX1NUKTsKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIHVubWFwX2lvOwogCX0KIAkvKgogCSAqIEhXIHJldmlzaW9uOgpAQCAtMzIxMiw3ICszMTc4LDcgQEAKIAlyZXYgPSBBTUJBX1JFVl9CSVRTKHBpZCk7CiAJaWYgKHJldiA8IDIpIHsKIAkJZDQwX2VycigmcGRldi0+ZGV2LCAiaGFyZHdhcmUgcmV2aXNpb246ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLCByZXYpOwotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gdW5tYXBfaW87CiAJfQogCiAJLyogVGhlIG51bWJlciBvZiBwaHlzaWNhbCBjaGFubmVscyBvbiB0aGlzIEhXICovCkBAIC0zMjM4LDcgKzMyMDQsNyBAQAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkNDBfY2hhbiksIEdGUF9LRVJORUwpOwogCiAJaWYgKGJhc2UgPT0gTlVMTCkKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIHVubWFwX2lvOwogCiAJYmFzZS0+cmV2ID0gcmV2OwogCWJhc2UtPmNsayA9IGNsazsKQEAgLTMyODMsNjUgKzMyNDksNjYgQEAKIAkJYmFzZS0+Z2VuX2RtYWMuaW5pdF9yZWdfc2l6ZSA9IEFSUkFZX1NJWkUoZG1hX2luaXRfcmVnX3Y0YSk7CiAJfQogCi0JYmFzZS0+cGh5X3JlcyA9IGt6YWxsb2MobnVtX3BoeV9jaGFucyAqIHNpemVvZihzdHJ1Y3QgZDQwX3BoeV9yZXMpLAorCWJhc2UtPnBoeV9yZXMgPSBrY2FsbG9jKG51bV9waHlfY2hhbnMsCisJCQkJc2l6ZW9mKCpiYXNlLT5waHlfcmVzKSwKIAkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWJhc2UtPnBoeV9yZXMpCi0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBmcmVlX2Jhc2U7CiAKLQliYXNlLT5sb29rdXBfcGh5X2NoYW5zID0ga3phbGxvYyhudW1fcGh5X2NoYW5zICoKLQkJCQkJIHNpemVvZihzdHJ1Y3QgZDQwX2NoYW4gKiksCisJYmFzZS0+bG9va3VwX3BoeV9jaGFucyA9IGtjYWxsb2MobnVtX3BoeV9jaGFucywKKwkJCQkJIHNpemVvZigqYmFzZS0+bG9va3VwX3BoeV9jaGFucyksCiAJCQkJCSBHRlBfS0VSTkVMKTsKIAlpZiAoIWJhc2UtPmxvb2t1cF9waHlfY2hhbnMpCi0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBmcmVlX3BoeV9yZXM7CiAKLQliYXNlLT5sb29rdXBfbG9nX2NoYW5zID0ga3phbGxvYyhudW1fbG9nX2NoYW5zICoKLQkJCQkJIHNpemVvZihzdHJ1Y3QgZDQwX2NoYW4gKiksCisJYmFzZS0+bG9va3VwX2xvZ19jaGFucyA9IGtjYWxsb2MobnVtX2xvZ19jaGFucywKKwkJCQkJIHNpemVvZigqYmFzZS0+bG9va3VwX2xvZ19jaGFucyksCiAJCQkJCSBHRlBfS0VSTkVMKTsKIAlpZiAoIWJhc2UtPmxvb2t1cF9sb2dfY2hhbnMpCi0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBmcmVlX3BoeV9jaGFuczsKIAotCWJhc2UtPnJlZ192YWxfYmFja3VwX2NoYW4gPSBrbWFsbG9jKGJhc2UtPm51bV9waHlfY2hhbnMgKgotCQkJCQkgICAgc2l6ZW9mKGQ0MF9iYWNrdXBfcmVnc19jaGFuKSwKLQkJCQkJICAgIEdGUF9LRVJORUwpOworCWJhc2UtPnJlZ192YWxfYmFja3VwX2NoYW4gPSBrbWFsbG9jX2FycmF5KGJhc2UtPm51bV9waHlfY2hhbnMsCisJCQkJCQkgIHNpemVvZihkNDBfYmFja3VwX3JlZ3NfY2hhbiksCisJCQkJCQkgIEdGUF9LRVJORUwpOwogCWlmICghYmFzZS0+cmVnX3ZhbF9iYWNrdXBfY2hhbikKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIGZyZWVfbG9nX2NoYW5zOwogCi0JYmFzZS0+bGNsYV9wb29sLmFsbG9jX21hcCA9Ci0JCWt6YWxsb2MobnVtX3BoeV9jaGFucyAqIHNpemVvZihzdHJ1Y3QgZDQwX2Rlc2MgKikKLQkJCSogRDQwX0xDTEFfTElOS19QRVJfRVZFTlRfR1JQLCBHRlBfS0VSTkVMKTsKKwliYXNlLT5sY2xhX3Bvb2wuYWxsb2NfbWFwID0ga2NhbGxvYyhudW1fcGh5X2NoYW5zCisJCQkJCSAgICAqIEQ0MF9MQ0xBX0xJTktfUEVSX0VWRU5UX0dSUCwKKwkJCQkJICAgIHNpemVvZigqYmFzZS0+bGNsYV9wb29sLmFsbG9jX21hcCksCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWJhc2UtPmxjbGFfcG9vbC5hbGxvY19tYXApCi0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBmcmVlX2JhY2t1cF9jaGFuOwogCiAJYmFzZS0+ZGVzY19zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoRDQwX05BTUUsIHNpemVvZihzdHJ1Y3QgZDQwX2Rlc2MpLAogCQkJCQkgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAogCQkJCQkgICAgTlVMTCk7CiAJaWYgKGJhc2UtPmRlc2Nfc2xhYiA9PSBOVUxMKQotCQlnb3RvIGZhaWx1cmU7CisJCWdvdG8gZnJlZV9tYXA7CiAKIAlyZXR1cm4gYmFzZTsKLQotZmFpbHVyZToKKyBmcmVlX21hcDoKKwlrZnJlZShiYXNlLT5sY2xhX3Bvb2wuYWxsb2NfbWFwKTsKKyBmcmVlX2JhY2t1cF9jaGFuOgorCWtmcmVlKGJhc2UtPnJlZ192YWxfYmFja3VwX2NoYW4pOworIGZyZWVfbG9nX2NoYW5zOgorCWtmcmVlKGJhc2UtPmxvb2t1cF9sb2dfY2hhbnMpOworIGZyZWVfcGh5X2NoYW5zOgorCWtmcmVlKGJhc2UtPmxvb2t1cF9waHlfY2hhbnMpOworIGZyZWVfcGh5X3JlczoKKwlrZnJlZShiYXNlLT5waHlfcmVzKTsKKyBmcmVlX2Jhc2U6CisJa2ZyZWUoYmFzZSk7CisgdW5tYXBfaW86CisJaW91bm1hcCh2aXJ0YmFzZSk7CisgcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisgY2hlY2tfcHJlcGFyZV9lbmFibGVkOgogCWlmICghY2xrX3JldCkKKyBkaXNhYmxlX3VucHJlcGFyZToKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNsayk7CiAJaWYgKCFJU19FUlIoY2xrKSkKIAkJY2xrX3B1dChjbGspOwotCWlmICh2aXJ0YmFzZSkKLQkJaW91bm1hcCh2aXJ0YmFzZSk7Ci0JaWYgKHJlcykKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsCi0JCQkJICAgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQlpZiAodmlydGJhc2UpCi0JCWlvdW5tYXAodmlydGJhc2UpOwotCi0JaWYgKGJhc2UpIHsKLQkJa2ZyZWUoYmFzZS0+bGNsYV9wb29sLmFsbG9jX21hcCk7Ci0JCWtmcmVlKGJhc2UtPnJlZ192YWxfYmFja3VwX2NoYW4pOwotCQlrZnJlZShiYXNlLT5sb29rdXBfbG9nX2NoYW5zKTsKLQkJa2ZyZWUoYmFzZS0+bG9va3VwX3BoeV9jaGFucyk7Ci0JCWtmcmVlKGJhc2UtPnBoeV9yZXMpOwotCQlrZnJlZShiYXNlKTsKLQl9Ci0KIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzQwNCwyMCArMzM3MSwxOCBAQAogCXN0cnVjdCBkNDBfbGNsYV9wb29sICpwb29sID0gJmJhc2UtPmxjbGFfcG9vbDsKIAl1bnNpZ25lZCBsb25nICpwYWdlX2xpc3Q7CiAJaW50IGksIGo7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCS8qCiAJICogVGhpcyBpcyBzb21ld2hhdCB1Z2x5LiBXZSBuZWVkIDgxOTIgYnl0ZXMgdGhhdCBhcmUgMTggYml0IGFsaWduZWQsCiAJICogVG8gZnVsbCBmaWxsIHRoaXMgaGFyZHdhcmUgcmVxdWlyZW1lbnQgd2l0aG91dCB3YXN0aW5nIDI1NiBrYgogCSAqIHdlIGFsbG9jYXRlIHBhZ2VzIHVudGlsIHdlIGdldCBhbiBhbGlnbmVkIG9uZS4KIAkgKi8KLQlwYWdlX2xpc3QgPSBrbWFsbG9jKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIE1BWF9MQ0xBX0FMTE9DX0FUVEVNUFRTLAotCQkJICAgIEdGUF9LRVJORUwpOwotCi0JaWYgKCFwYWdlX2xpc3QpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsdXJlOwotCX0KKwlwYWdlX2xpc3QgPSBrbWFsbG9jX2FycmF5KE1BWF9MQ0xBX0FMTE9DX0FUVEVNUFRTLAorCQkJCSAgc2l6ZW9mKCpwYWdlX2xpc3QpLAorCQkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWdlX2xpc3QpCisJCXJldHVybiAtRU5PTUVNOwogCiAJLyogQ2FsY3VsYXRpbmcgaG93IG1hbnkgcGFnZXMgdGhhdCBhcmUgcmVxdWlyZWQgKi8KIAliYXNlLT5sY2xhX3Bvb2wucGFnZXMgPSBTWl8xSyAqIGJhc2UtPm51bV9waHlfY2hhbnMgLyBQQUdFX1NJWkU7CkBAIC0zNDMzLDcgKzMzOTgsNyBAQAogCiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQkJCWZyZWVfcGFnZXMocGFnZV9saXN0W2pdLCBiYXNlLT5sY2xhX3Bvb2wucGFnZXMpOwotCQkJZ290byBmYWlsdXJlOworCQkJZ290byBmcmVlX3BhZ2VfbGlzdDsKIAkJfQogCiAJCWlmICgodmlydF90b19waHlzKCh2b2lkICopcGFnZV9saXN0W2ldKSAmCkBAIC0zNDYwLDcgKzM0MjUsNyBAQAogCQkJCQkJCSBHRlBfS0VSTkVMKTsKIAkJaWYgKCFiYXNlLT5sY2xhX3Bvb2wuYmFzZV91bmFsaWduZWQpIHsKIAkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGZhaWx1cmU7CisJCQlnb3RvIGZyZWVfcGFnZV9saXN0OwogCQl9CiAKIAkJYmFzZS0+bGNsYV9wb29sLmJhc2UgPSBQVFJfQUxJR04oYmFzZS0+bGNsYV9wb29sLmJhc2VfdW5hbGlnbmVkLApAQCAtMzQ3MywxMiArMzQzOCwxMyBAQAogCWlmIChkbWFfbWFwcGluZ19lcnJvcihiYXNlLT5kZXYsIHBvb2wtPmRtYV9hZGRyKSkgewogCQlwb29sLT5kbWFfYWRkciA9IDA7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBmcmVlX3BhZ2VfbGlzdDsKIAl9CiAKIAl3cml0ZWwodmlydF90b19waHlzKGJhc2UtPmxjbGFfcG9vbC5iYXNlKSwKIAkgICAgICAgYmFzZS0+dmlydGJhc2UgKyBENDBfRFJFR19MQ0xBKTsKLWZhaWx1cmU6CisJcmV0ID0gMDsKKyBmcmVlX3BhZ2VfbGlzdDoKIAlrZnJlZShwYWdlX2xpc3QpOwogCXJldHVybiByZXQ7CiB9CkBAIC0zNDkwLDkgKzM0NTYsNyBAQAogCWludCBudW1fcGh5ID0gMCwgbnVtX21lbWNweSA9IDAsIG51bV9kaXNhYmxlZCA9IDA7CiAJY29uc3QgX19iZTMyICpsaXN0OwogCi0JcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzdGVkbWE0MF9wbGF0Zm9ybV9kYXRhKSwKLQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zNTc0LDcgKzM1MzgsNyBAQAogCWlmICghcmVzKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWQ0MF9lcnIoJnBkZXYtPmRldiwgIk5vIFwibGNwYVwiIG1lbW9yeSByZXNvdXJjZVxuIik7Ci0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBkZXN0cm95X2NhY2hlOwogCX0KIAliYXNlLT5sY3BhX3NpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CiAJYmFzZS0+cGh5X2xjcGEgPSByZXMtPnN0YXJ0OwpAQCAtMzU4Myw3ICszNTQ3LDcgQEAKIAkJCSAgICAgICBENDBfTkFNRSAiIEkvTyBsY3BhIikgPT0gTlVMTCkgewogCQlyZXQgPSAtRUJVU1k7CiAJCWQ0MF9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IExDUEEgcmVnaW9uICVwUlxuIiwgcmVzKTsKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIGRlc3Ryb3lfY2FjaGU7CiAJfQogCiAJLyogV2UgbWFrZSB1c2Ugb2YgRVNSQU0gbWVtb3J5IGZvciB0aGlzLiAqLwpAQCAtMzU5OSw3ICszNTYzLDcgQEAKIAlpZiAoIWJhc2UtPmxjcGFfYmFzZSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlkNDBfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW9yZW1hcCBMQ1BBIHJlZ2lvblxuIik7Ci0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBkZXN0cm95X2NhY2hlOwogCX0KIAkvKiBJZiBsY2xhIGhhcyB0byBiZSBsb2NhdGVkIGluIEVTUkFNIHdlIGRvbid0IG5lZWQgdG8gYWxsb2NhdGUgKi8KIAlpZiAoYmFzZS0+cGxhdF9kYXRhLT51c2VfZXNyYW1fbGNsYSkgewpAQCAtMzYwOSwxNCArMzU3MywxNCBAQAogCQkJcmV0ID0gLUVOT0VOVDsKIAkJCWQ0MF9lcnIoJnBkZXYtPmRldiwKIAkJCQkiTm8gXCJsY2xhX2VzcmFtXCIgbWVtb3J5IHJlc291cmNlXG4iKTsKLQkJCWdvdG8gZmFpbHVyZTsKKwkJCWdvdG8gZGVzdHJveV9jYWNoZTsKIAkJfQogCQliYXNlLT5sY2xhX3Bvb2wuYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwKIAkJCQkJCXJlc291cmNlX3NpemUocmVzKSk7CiAJCWlmICghYmFzZS0+bGNsYV9wb29sLmJhc2UpIHsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlkNDBfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW9yZW1hcCBMQ0xBIHJlZ2lvblxuIik7Ci0JCQlnb3RvIGZhaWx1cmU7CisJCQlnb3RvIGRlc3Ryb3lfY2FjaGU7CiAJCX0KIAkJd3JpdGVsKHJlcy0+c3RhcnQsIGJhc2UtPnZpcnRiYXNlICsgRDQwX0RSRUdfTENMQSk7CiAKQEAgLTM2MjQsNyArMzU4OCw3IEBACiAJCXJldCA9IGQ0MF9sY2xhX2FsbG9jYXRlKGJhc2UpOwogCQlpZiAocmV0KSB7CiAJCQlkNDBfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgTENMQSBhcmVhXG4iKTsKLQkJCWdvdG8gZmFpbHVyZTsKKwkJCWdvdG8gZGVzdHJveV9jYWNoZTsKIAkJfQogCX0KIApAQCAtMzYzNSw3ICszNTk5LDcgQEAKIAlyZXQgPSByZXF1ZXN0X2lycShiYXNlLT5pcnEsIGQ0MF9oYW5kbGVfaW50ZXJydXB0LCAwLCBENDBfTkFNRSwgYmFzZSk7CiAJaWYgKHJldCkgewogCQlkNDBfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgZGVmaW5lZFxuIik7Ci0JCWdvdG8gZmFpbHVyZTsKKwkJZ290byBkZXN0cm95X2NhY2hlOwogCX0KIAogCWlmIChiYXNlLT5wbGF0X2RhdGEtPnVzZV9lc3JhbV9sY2xhKSB7CkBAIC0zNjQ1LDcgKzM2MDksNyBAQAogCQkJZDQwX2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBsY3BhX3JlZ3VsYXRvclxuIik7CiAJCQlyZXQgPSBQVFJfRVJSKGJhc2UtPmxjcGFfcmVndWxhdG9yKTsKIAkJCWJhc2UtPmxjcGFfcmVndWxhdG9yID0gTlVMTDsKLQkJCWdvdG8gZmFpbHVyZTsKKwkJCWdvdG8gZGVzdHJveV9jYWNoZTsKIAkJfQogCiAJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYmFzZS0+bGNwYV9yZWd1bGF0b3IpOwpAQCAtMzY1NCw3ICszNjE4LDcgQEAKIAkJCQkiRmFpbGVkIHRvIGVuYWJsZSBsY3BhX3JlZ3VsYXRvclxuIik7CiAJCQlyZWd1bGF0b3JfcHV0KGJhc2UtPmxjcGFfcmVndWxhdG9yKTsKIAkJCWJhc2UtPmxjcGFfcmVndWxhdG9yID0gTlVMTDsKLQkJCWdvdG8gZmFpbHVyZTsKKwkJCWdvdG8gZGVzdHJveV9jYWNoZTsKIAkJfQogCX0KIApAQCAtMzY2OSwxMyArMzYzMywxMyBAQAogCiAJcmV0ID0gZDQwX2RtYWVuZ2luZV9pbml0KGJhc2UsIG51bV9yZXNlcnZlZF9jaGFucyk7CiAJaWYgKHJldCkKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIGRlc3Ryb3lfY2FjaGU7CiAKIAliYXNlLT5kZXYtPmRtYV9wYXJtcyA9ICZiYXNlLT5kbWFfcGFybXM7CiAJcmV0ID0gZG1hX3NldF9tYXhfc2VnX3NpemUoYmFzZS0+ZGV2LCBTVEVETUE0MF9NQVhfU0VHX1NJWkUpOwogCWlmIChyZXQpIHsKIAkJZDQwX2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBkbWEgbWF4IHNlZyBzaXplXG4iKTsKLQkJZ290byBmYWlsdXJlOworCQlnb3RvIGRlc3Ryb3lfY2FjaGU7CiAJfQogCiAJZDQwX2h3X2luaXQoYmFzZSk7CkBAIC0zNjg5LDggKzM2NTMsNyBAQAogCiAJZGV2X2luZm8oYmFzZS0+ZGV2LCAiaW5pdGlhbGl6ZWRcbiIpOwogCXJldHVybiAwOwotCi1mYWlsdXJlOgorIGRlc3Ryb3lfY2FjaGU6CiAJa21lbV9jYWNoZV9kZXN0cm95KGJhc2UtPmRlc2Nfc2xhYik7CiAJaWYgKGJhc2UtPnZpcnRiYXNlKQogCQlpb3VubWFwKGJhc2UtPnZpcnRiYXNlKTsKQEAgLTM3MzIsNyArMzY5NSw3IEBACiAJa2ZyZWUoYmFzZS0+bG9va3VwX3BoeV9jaGFucyk7CiAJa2ZyZWUoYmFzZS0+cGh5X3Jlcyk7CiAJa2ZyZWUoYmFzZSk7Ci1yZXBvcnRfZmFpbHVyZToKKyByZXBvcnRfZmFpbHVyZToKIAlkNDBfZXJyKCZwZGV2LT5kZXYsICJwcm9iZSBmYWlsZWRcbiIpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zdG0zMi1kbWEuYyBiL2RyaXZlcnMvZG1hL3N0bTMyLWRtYS5jCmluZGV4IDA0NzQ3NmEuLjMwNzU0N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3N0bTMyLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3N0bTMyLWRtYS5jCkBAIC05NTQsNyArOTU0LDcgQEAKIAlrZnJlZShjb250YWluZXJfb2YodmRlc2MsIHN0cnVjdCBzdG0zMl9kbWFfZGVzYywgdmRlc2MpKTsKIH0KIAotdm9pZCBzdG0zMl9kbWFfc2V0X2NvbmZpZyhzdHJ1Y3Qgc3RtMzJfZG1hX2NoYW4gKmNoYW4sCitzdGF0aWMgdm9pZCBzdG0zMl9kbWFfc2V0X2NvbmZpZyhzdHJ1Y3Qgc3RtMzJfZG1hX2NoYW4gKmNoYW4sCiAJCQkgIHN0cnVjdCBzdG0zMl9kbWFfY2ZnICpjZmcpCiB7CiAJc3RtMzJfZG1hX2NsZWFyX3JlZygmY2hhbi0+Y2hhbl9yZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvc3VuNmktZG1hLmMgYi9kcml2ZXJzL2RtYS9zdW42aS1kbWEuYwppbmRleCAzODM1ZmNkLi44MzQ2MTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zdW42aS1kbWEuYworKysgYi9kcml2ZXJzL2RtYS9zdW42aS1kbWEuYwpAQCAtMTAxMSw2ICsxMDExLDEyIEBACiAJLm5yX21heF92Y2hhbnMgICA9IDM3LAogfTsKIAorc3RhdGljIHN0cnVjdCBzdW42aV9kbWFfY29uZmlnIHN1bjhpX2E4M3RfZG1hX2NmZyA9IHsKKwkubnJfbWF4X2NoYW5uZWxzID0gOCwKKwkubnJfbWF4X3JlcXVlc3RzID0gMjgsCisJLm5yX21heF92Y2hhbnMgICA9IDM5LAorfTsKKwogLyoKICAqIFRoZSBIMyBoYXMgMTIgcGh5c2ljYWwgY2hhbm5lbHMsIGEgbWF4aW11bSBEUlEgcG9ydCBpZCBvZiAyNywKICAqIGFuZCBhIHRvdGFsIG9mIDM0IHVzYWJsZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGVuZHBvaW50cy4KQEAgLTEwMjUsNiArMTAzMSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW42aV9kbWFfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW42aS1hMzEtZG1hIiwgLmRhdGEgPSAmc3VuNmlfYTMxX2RtYV9jZmcgfSwKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW44aS1hMjMtZG1hIiwgLmRhdGEgPSAmc3VuOGlfYTIzX2RtYV9jZmcgfSwKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW44aS1hODN0LWRtYSIsIC5kYXRhID0gJnN1bjhpX2E4M3RfZG1hX2NmZyB9LAogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjhpLWgzLWRtYSIsIC5kYXRhID0gJnN1bjhpX2gzX2RtYV9jZmcgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS90ZWdyYTIwLWFwYi1kbWEuYyBiL2RyaXZlcnMvZG1hL3RlZ3JhMjAtYXBiLWRtYS5jCmluZGV4IDZhYjllYjkuLjM3MjJiOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3RlZ3JhMjAtYXBiLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3RlZ3JhMjAtYXBiLWRtYS5jCkBAIC02NTUsOCArNjU1LDcgQEAKIHN0YXRpYyB2b2lkIHRlZ3JhX2RtYV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgdGVncmFfZG1hX2NoYW5uZWwgKnRkYyA9IChzdHJ1Y3QgdGVncmFfZG1hX2NoYW5uZWwgKilkYXRhOwotCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjayA9IE5VTEw7Ci0Jdm9pZCAqY2FsbGJhY2tfcGFyYW0gPSBOVUxMOworCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKIAlzdHJ1Y3QgdGVncmFfZG1hX2Rlc2MgKmRtYV9kZXNjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNiX2NvdW50OwpAQCAtNjY2LDEzICs2NjUsMTIgQEAKIAkJZG1hX2Rlc2MgID0gbGlzdF9maXJzdF9lbnRyeSgmdGRjLT5jYl9kZXNjLAogCQkJCQl0eXBlb2YoKmRtYV9kZXNjKSwgY2Jfbm9kZSk7CiAJCWxpc3RfZGVsKCZkbWFfZGVzYy0+Y2Jfbm9kZSk7Ci0JCWNhbGxiYWNrID0gZG1hX2Rlc2MtPnR4ZC5jYWxsYmFjazsKLQkJY2FsbGJhY2tfcGFyYW0gPSBkbWFfZGVzYy0+dHhkLmNhbGxiYWNrX3BhcmFtOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJmRtYV9kZXNjLT50eGQsICZjYik7CiAJCWNiX2NvdW50ID0gZG1hX2Rlc2MtPmNiX2NvdW50OwogCQlkbWFfZGVzYy0+Y2JfY291bnQgPSAwOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0ZGMtPmxvY2ssIGZsYWdzKTsKLQkJd2hpbGUgKGNiX2NvdW50LS0gJiYgY2FsbGJhY2spCi0JCQljYWxsYmFjayhjYWxsYmFja19wYXJhbSk7CisJCXdoaWxlIChjYl9jb3VudC0tKQorCQkJZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCZjYiwgTlVMTCk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ0ZGMtPmxvY2ssIGZsYWdzKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGRjLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS90ZWdyYTIxMC1hZG1hLmMgYi9kcml2ZXJzL2RtYS90ZWdyYTIxMC1hZG1hLmMKaW5kZXggYzRiMTIxYy4uYjEwY2JhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvdGVncmEyMTAtYWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3RlZ3JhMjEwLWFkbWEuYwpAQCAtNjcwLDcgKzY3MCw2IEBACiAJY29uc3Qgc3RydWN0IHRlZ3JhX2FkbWFfY2hpcF9kYXRhICpjZGF0YTsKIAlzdHJ1Y3QgdGVncmFfYWRtYSAqdGRtYTsKIAlzdHJ1Y3QgcmVzb3VyY2UJKnJlczsKLQlzdHJ1Y3QgY2xrICpjbGs7CiAJaW50IHJldCwgaTsKIAogCWNkYXRhID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOwpAQCAtNjk3LDE4ICs2OTYsOSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJkX2F1ZGlvIik7Ci0JaWYgKElTX0VSUihjbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkFETUEgY2xvY2sgbm90IGZvdW5kXG4iKTsKLQkJcmV0ID0gUFRSX0VSUihjbGspOworCXJldCA9IG9mX3BtX2Nsa19hZGRfY2xrKCZwZGV2LT5kZXYsICJkX2F1ZGlvIik7CisJaWYgKHJldCkKIAkJZ290byBjbGtfZGVzdHJveTsKLQl9Ci0KLQlyZXQgPSBwbV9jbGtfYWRkX2NsaygmcGRldi0+ZGV2LCBjbGspOwotCWlmIChyZXQpIHsKLQkJY2xrX3B1dChjbGspOwotCQlnb3RvIGNsa19kZXN0cm95OwotCX0KIAogCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS90aS1kbWEtY3Jvc3NiYXIuYyBiL2RyaXZlcnMvZG1hL3RpLWRtYS1jcm9zc2Jhci5jCmluZGV4IDVhZTI5NGIuLjNmMjRhZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3RpLWRtYS1jcm9zc2Jhci5jCisrKyBiL2RyaXZlcnMvZG1hL3RpLWRtYS1jcm9zc2Jhci5jCkBAIC0xOCwxNSArMTgsMTkgQEAKIAogI2RlZmluZSBUSV9YQkFSX0RSQTcJCTAKICNkZWZpbmUgVElfWEJBUl9BTTMzNVgJCTEKK3N0YXRpYyBjb25zdCB1MzIgdGlfeGJhcl90eXBlW10gPSB7CisJW1RJX1hCQVJfRFJBN10gPSBUSV9YQkFSX0RSQTcsCisJW1RJX1hCQVJfQU0zMzVYXSA9IFRJX1hCQVJfQU0zMzVYLAorfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGlfZG1hX3hiYXJfbWF0Y2hbXSA9IHsKIAl7CiAJCS5jb21wYXRpYmxlID0gInRpLGRyYTctZG1hLWNyb3NzYmFyIiwKLQkJLmRhdGEgPSAodm9pZCAqKVRJX1hCQVJfRFJBNywKKwkJLmRhdGEgPSAmdGlfeGJhcl90eXBlW1RJX1hCQVJfRFJBN10sCiAJfSwKIAl7CiAJCS5jb21wYXRpYmxlID0gInRpLGFtMzM1eC1lZG1hLWNyb3NzYmFyIiwKLQkJLmRhdGEgPSAodm9pZCAqKVRJX1hCQVJfQU0zMzVYLAorCQkuZGF0YSA9ICZ0aV94YmFyX3R5cGVbVElfWEJBUl9BTTMzNVhdLAogCX0sCiAJe30sCiB9OwpAQCAtMTkwLDkgKzE5NCw2IEBACiAjZGVmaW5lIFRJX0RSQTdfWEJBUl9PVVRQVVRTCTEyNwogI2RlZmluZSBUSV9EUkE3X1hCQVJfSU5QVVRTCTI1NgogCi0jZGVmaW5lIFRJX1hCQVJfRURNQV9PRkZTRVQJMAotI2RlZmluZSBUSV9YQkFSX1NETUFfT0ZGU0VUCTEKLQogc3RydWN0IHRpX2RyYTdfeGJhcl9kYXRhIHsKIAl2b2lkIF9faW9tZW0gKmlvbWVtOwogCkBAIC0yODAsMTggKzI4MSwyNSBAQAogCXJldHVybiBtYXA7CiB9CiAKKyNkZWZpbmUgVElfWEJBUl9FRE1BX09GRlNFVAkwCisjZGVmaW5lIFRJX1hCQVJfU0RNQV9PRkZTRVQJMQorc3RhdGljIGNvbnN0IHUzMiB0aV9kbWFfb2Zmc2V0W10gPSB7CisJW1RJX1hCQVJfRURNQV9PRkZTRVRdID0gMCwKKwlbVElfWEJBUl9TRE1BX09GRlNFVF0gPSAxLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGlfZHJhN19tYXN0ZXJfbWF0Y2hbXSA9IHsKIAl7CiAJCS5jb21wYXRpYmxlID0gInRpLG9tYXA0NDMwLXNkbWEiLAotCQkuZGF0YSA9ICh2b2lkICopVElfWEJBUl9TRE1BX09GRlNFVCwKKwkJLmRhdGEgPSAmdGlfZG1hX29mZnNldFtUSV9YQkFSX1NETUFfT0ZGU0VUXSwKIAl9LAogCXsKIAkJLmNvbXBhdGlibGUgPSAidGksZWRtYTMiLAotCQkuZGF0YSA9ICh2b2lkICopVElfWEJBUl9FRE1BX09GRlNFVCwKKwkJLmRhdGEgPSAmdGlfZG1hX29mZnNldFtUSV9YQkFSX0VETUFfT0ZGU0VUXSwKIAl9LAogCXsKIAkJLmNvbXBhdGlibGUgPSAidGksZWRtYTMtdHBjYyIsCi0JCS5kYXRhID0gKHZvaWQgKilUSV9YQkFSX0VETUFfT0ZGU0VULAorCQkuZGF0YSA9ICZ0aV9kbWFfb2Zmc2V0W1RJX1hCQVJfRURNQV9PRkZTRVRdLAogCX0sCiAJe30sCiB9OwpAQCAtMzExLDcgKzMxOSw3IEBACiAJc3RydWN0IHByb3BlcnR5ICpwcm9wOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXUzMiBzYWZlX3ZhbDsKLQlzaXplX3Qgc3o7CisJaW50IHN6OwogCXZvaWQgX19pb21lbSAqaW9tZW07CiAJaW50IGksIHJldDsKIApAQCAtMzk1LDcgKzQwMyw3IEBACiAKIAl4YmFyLT5kbWFyb3V0ZXIuZGV2ID0gJnBkZXYtPmRldjsKIAl4YmFyLT5kbWFyb3V0ZXIucm91dGVfZnJlZSA9IHRpX2RyYTdfeGJhcl9mcmVlOwotCXhiYXItPmRtYV9vZmZzZXQgPSAodTMyKW1hdGNoLT5kYXRhOworCXhiYXItPmRtYV9vZmZzZXQgPSAqKHUzMiAqKW1hdGNoLT5kYXRhOwogCiAJbXV0ZXhfaW5pdCgmeGJhci0+bXV0ZXgpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHhiYXIpOwpAQCAtNDI4LDcgKzQzNiw3IEBACiAJaWYgKHVubGlrZWx5KCFtYXRjaCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3dpdGNoICgodTMyKW1hdGNoLT5kYXRhKSB7CisJc3dpdGNoICgqKHUzMiAqKW1hdGNoLT5kYXRhKSB7CiAJY2FzZSBUSV9YQkFSX0RSQTc6CiAJCXJldCA9IHRpX2RyYTdfeGJhcl9wcm9iZShwZGV2KTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS90aW1iX2RtYS5jIGIvZHJpdmVycy9kbWEvdGltYl9kbWEuYwppbmRleCBlODI3NDVhLi44OTZiYWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS90aW1iX2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3RpbWJfZG1hLmMKQEAgLTIyNiw4ICsyMjYsNyBAQAogCiBzdGF0aWMgdm9pZCBfX3RkX2ZpbmlzaChzdHJ1Y3QgdGltYl9kbWFfY2hhbiAqdGRfY2hhbikKIHsKLQlkbWFfYXN5bmNfdHhfY2FsbGJhY2sJCWNhbGxiYWNrOwotCXZvaWQJCQkJKnBhcmFtOworCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjawljYjsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJKnR4ZDsKIAlzdHJ1Y3QgdGltYl9kbWFfZGVzYwkJKnRkX2Rlc2M7CiAKQEAgLTI1Miw4ICsyNTEsNyBAQAogCWRtYV9jb29raWVfY29tcGxldGUodHhkKTsKIAl0ZF9jaGFuLT5vbmdvaW5nID0gZmFsc2U7CiAKLQljYWxsYmFjayA9IHR4ZC0+Y2FsbGJhY2s7Ci0JcGFyYW0gPSB0eGQtPmNhbGxiYWNrX3BhcmFtOworCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjayh0eGQsICZjYik7CiAKIAlsaXN0X21vdmUoJnRkX2Rlc2MtPmRlc2Nfbm9kZSwgJnRkX2NoYW4tPmZyZWVfbGlzdCk7CiAKQEAgLTI2Miw4ICsyNjAsNyBAQAogCSAqIFRoZSBBUEkgcmVxdWlyZXMgdGhhdCBubyBzdWJtaXNzaW9ucyBhcmUgZG9uZSBmcm9tIGEKIAkgKiBjYWxsYmFjaywgc28gd2UgZG9uJ3QgbmVlZCB0byBkcm9wIHRoZSBsb2NrIGhlcmUKIAkgKi8KLQlpZiAoY2FsbGJhY2spCi0JCWNhbGxiYWNrKHBhcmFtKTsKKwlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIH0KIAogc3RhdGljIHUzMiBfX3RkX2llcl9tYXNrKHN0cnVjdCB0aW1iX2RtYSAqdGQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS90eHg5ZG1hYy5jIGIvZHJpdmVycy9kbWEvdHh4OWRtYWMuYwppbmRleCA3NjMyMjkwLi40ZDhjN2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS90eHg5ZG1hYy5jCisrKyBiL2RyaXZlcnMvZG1hL3R4eDlkbWFjLmMKQEAgLTQwMywxNiArNDAzLDE0IEBACiB0eHg5ZG1hY19kZXNjcmlwdG9yX2NvbXBsZXRlKHN0cnVjdCB0eHg5ZG1hY19jaGFuICpkYywKIAkJCSAgICAgc3RydWN0IHR4eDlkbWFjX2Rlc2MgKmRlc2MpCiB7Ci0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrOwotCXZvaWQgKnBhcmFtOworCXN0cnVjdCBkbWFlbmdpbmVfZGVzY19jYWxsYmFjayBjYjsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ZCA9ICZkZXNjLT50eGQ7CiAKIAlkZXZfdmRiZyhjaGFuMmRldigmZGMtPmNoYW4pLCAiZGVzY3JpcHRvciAldSAlcCBjb21wbGV0ZVxuIiwKIAkJIHR4ZC0+Y29va2llLCBkZXNjKTsKIAogCWRtYV9jb29raWVfY29tcGxldGUodHhkKTsKLQljYWxsYmFjayA9IHR4ZC0+Y2FsbGJhY2s7Ci0JcGFyYW0gPSB0eGQtPmNhbGxiYWNrX3BhcmFtOworCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjayh0eGQsICZjYik7CiAKIAl0eHg5ZG1hY19zeW5jX2Rlc2NfZm9yX2NwdShkYywgZGVzYyk7CiAJbGlzdF9zcGxpY2VfaW5pdCgmZGVzYy0+dHhfbGlzdCwgJmRjLT5mcmVlX2xpc3QpOwpAQCAtNDIzLDggKzQyMSw3IEBACiAJICogVGhlIEFQSSByZXF1aXJlcyB0aGF0IG5vIHN1Ym1pc3Npb25zIGFyZSBkb25lIGZyb20gYQogCSAqIGNhbGxiYWNrLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGRyb3AgdGhlIGxvY2sgaGVyZQogCSAqLwotCWlmIChjYWxsYmFjaykKLQkJY2FsbGJhY2socGFyYW0pOworCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCWRtYV9ydW5fZGVwZW5kZW5jaWVzKHR4ZCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3ZpcnQtZG1hLmMgYi9kcml2ZXJzL2RtYS92aXJ0LWRtYS5jCmluZGV4IGEzNWMyMTEuLmU0N2ZjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3ZpcnQtZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvdmlydC1kbWEuYwpAQCAtODcsOCArODcsNyBAQAogewogCXN0cnVjdCB2aXJ0X2RtYV9jaGFuICp2YyA9IChzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqKWFyZzsKIAlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmQ7Ci0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNiID0gTlVMTDsKLQl2b2lkICpjYl9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2sgY2I7CiAJTElTVF9IRUFEKGhlYWQpOwogCiAJc3Bpbl9sb2NrX2lycSgmdmMtPmxvY2spOwpAQCAtOTYsMTggKzk1LDE3IEBACiAJdmQgPSB2Yy0+Y3ljbGljOwogCWlmICh2ZCkgewogCQl2Yy0+Y3ljbGljID0gTlVMTDsKLQkJY2IgPSB2ZC0+dHguY2FsbGJhY2s7Ci0JCWNiX2RhdGEgPSB2ZC0+dHguY2FsbGJhY2tfcGFyYW07CisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjaygmdmQtPnR4LCAmY2IpOworCX0gZWxzZSB7CisJCW1lbXNldCgmY2IsIDAsIHNpemVvZihjYikpOwogCX0KIAlzcGluX3VubG9ja19pcnEoJnZjLT5sb2NrKTsKIAotCWlmIChjYikKLQkJY2IoY2JfZGF0YSk7CisJZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCZjYiwgTlVMTCk7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmhlYWQpKSB7CiAJCXZkID0gbGlzdF9maXJzdF9lbnRyeSgmaGVhZCwgc3RydWN0IHZpcnRfZG1hX2Rlc2MsIG5vZGUpOwotCQljYiA9IHZkLT50eC5jYWxsYmFjazsKLQkJY2JfZGF0YSA9IHZkLT50eC5jYWxsYmFja19wYXJhbTsKKwkJZG1hZW5naW5lX2Rlc2NfZ2V0X2NhbGxiYWNrKCZ2ZC0+dHgsICZjYik7CiAKIAkJbGlzdF9kZWwoJnZkLT5ub2RlKTsKIAkJaWYgKGRtYWVuZ2luZV9kZXNjX3Rlc3RfcmV1c2UoJnZkLT50eCkpCkBAIC0xMTUsOCArMTEzLDcgQEAKIAkJZWxzZQogCQkJdmMtPmRlc2NfZnJlZSh2ZCk7CiAKLQkJaWYgKGNiKQotCQkJY2IoY2JfZGF0YSk7CisJCWRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrX2ludm9rZSgmY2IsIE5VTEwpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvdmlydC1kbWEuaCBiL2RyaXZlcnMvZG1hL3ZpcnQtZG1hLmgKaW5kZXggZDk3MzFjYS4uM2Y3NzZhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvdmlydC1kbWEuaAorKysgYi9kcml2ZXJzL2RtYS92aXJ0LWRtYS5oCkBAIC00NSw2ICs0NSw4IEBACiB2b2lkIHZjaGFuX2RtYV9kZXNjX2ZyZWVfbGlzdChzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqdmMsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwogdm9pZCB2Y2hhbl9pbml0KHN0cnVjdCB2aXJ0X2RtYV9jaGFuICp2Yywgc3RydWN0IGRtYV9kZXZpY2UgKmRtYWRldik7CiBzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmNoYW5fZmluZF9kZXNjKHN0cnVjdCB2aXJ0X2RtYV9jaGFuICosIGRtYV9jb29raWVfdCk7CitleHRlcm4gZG1hX2Nvb2tpZV90IHZjaGFuX3R4X3N1Ym1pdChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKik7CitleHRlcm4gaW50IHZjaGFuX3R4X2Rlc2NfZnJlZShzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKik7CiAKIC8qKgogICogdmNoYW5fdHhfcHJlcCAtIHByZXBhcmUgYSBkZXNjcmlwdG9yCkBAIC01NSw4ICs1Nyw2IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdmNoYW5fdHhfcHJlcChzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqdmMsCiAJc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkLCB1bnNpZ25lZCBsb25nIHR4X2ZsYWdzKQogewotCWV4dGVybiBkbWFfY29va2llX3QgdmNoYW5fdHhfc3VibWl0KHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqKTsKLQlleHRlcm4gaW50IHZjaGFuX3R4X2Rlc2NfZnJlZShzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJnZkLT50eCwgJnZjLT5jaGFuKTsKQEAgLTEyMywxMCArMTIzLDggQEAKICAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmNoYW5fbmV4dF9kZXNjKHN0cnVjdCB2aXJ0X2RtYV9jaGFuICp2YykKIHsKLQlpZiAobGlzdF9lbXB0eSgmdmMtPmRlc2NfaXNzdWVkKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeSgmdmMtPmRlc2NfaXNzdWVkLCBzdHJ1Y3QgdmlydF9kbWFfZGVzYywgbm9kZSk7CisJcmV0dXJuIGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmdmMtPmRlc2NfaXNzdWVkLAorCQkJCQlzdHJ1Y3QgdmlydF9kbWFfZGVzYywgbm9kZSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEveGdlbmUtZG1hLmMgYi9kcml2ZXJzL2RtYS94Z2VuZS1kbWEuYwppbmRleCA5Y2I5M2M1Li44YjY5M2I3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS94Z2VuZS1kbWEuYworKysgYi9kcml2ZXJzL2RtYS94Z2VuZS1kbWEuYwpAQCAtNjA2LDEyICs2MDYsMTAgQEAKIAkJcmV0dXJuOwogCiAJZG1hX2Nvb2tpZV9jb21wbGV0ZSh0eCk7CisJZG1hX2Rlc2NyaXB0b3JfdW5tYXAodHgpOwogCiAJLyogUnVuIHRoZSBsaW5rIGRlc2NyaXB0b3IgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQlpZiAodHgtPmNhbGxiYWNrKQotCQl0eC0+Y2FsbGJhY2sodHgtPmNhbGxiYWNrX3BhcmFtKTsKLQotCWRtYV9kZXNjcmlwdG9yX3VubWFwKHR4KTsKKwlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2tfaW52b2tlKHR4LCBOVUxMKTsKIAogCS8qIFJ1biBhbnkgZGVwZW5kZW5jaWVzICovCiAJZG1hX3J1bl9kZXBlbmRlbmNpZXModHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEveGlsaW54L3hpbGlueF9kbWEuYyBiL2RyaXZlcnMvZG1hL3hpbGlueC94aWxpbnhfZG1hLmMKaW5kZXggNGUyMjNkMC4uODI4OGZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEveGlsaW54L3hpbGlueF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS94aWxpbngveGlsaW54X2RtYS5jCkBAIC03NTUsOCArNzU1LDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIG5leHQsICZjaGFuLT5kb25lX2xpc3QsIG5vZGUpIHsKLQkJZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrOwotCQl2b2lkICpjYWxsYmFja19wYXJhbTsKKwkJc3RydWN0IGRtYWVuZ2luZV9kZXNjX2NhbGxiYWNrIGNiOwogCiAJCWlmIChkZXNjLT5jeWNsaWMpIHsKIAkJCXhpbGlueF9kbWFfY2hhbl9oYW5kbGVfY3ljbGljKGNoYW4sIGRlc2MsICZmbGFncyk7CkBAIC03NjcsMTEgKzc2NiwxMCBAQAogCQlsaXN0X2RlbCgmZGVzYy0+bm9kZSk7CiAKIAkJLyogUnVuIHRoZSBsaW5rIGRlc2NyaXB0b3IgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLQkJY2FsbGJhY2sgPSBkZXNjLT5hc3luY190eC5jYWxsYmFjazsKLQkJY2FsbGJhY2tfcGFyYW0gPSBkZXNjLT5hc3luY190eC5jYWxsYmFja19wYXJhbTsKLQkJaWYgKGNhbGxiYWNrKSB7CisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjaygmZGVzYy0+YXN5bmNfdHgsICZjYik7CisJCWlmIChkbWFlbmdpbmVfZGVzY19jYWxsYmFja192YWxpZCgmY2IpKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7Ci0JCQljYWxsYmFjayhjYWxsYmFja19wYXJhbSk7CisJCQlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZva2UoJmNiLCBOVUxMKTsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5sb2NrLCBmbGFncyk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL0tjb25maWcgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwppbmRleCBkZmYxYTRhLi44MmQ4NWNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL0tjb25maWcKKysrIGIvZHJpdmVycy9lZGFjL0tjb25maWcKQEAgLTI2Niw2ICsyNjYsMTMgQEAKIAkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUgRnJlZXNjYWxlCiAJICBNUEM4MzQ5LCBNUEM4NTYwLCBNUEM4NTQwLCBNUEM4NTQ4LCBUNDI0MAogCitjb25maWcgRURBQ19MQVlFUlNDQVBFCisJdHJpc3RhdGUgIkZyZWVzY2FsZSBMYXllcnNjYXBlIEREUiIKKwlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBBUkNIX0xBWUVSU0NBUEUKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gRnJlZXNjYWxlIG1lbW9yeQorCSAgY29udHJvbGxlcnMgb24gTGF5ZXJzY2FwZSBTb0NzLgorCiBjb25maWcgRURBQ19NVjY0WDYwCiAJdHJpc3RhdGUgIk1hcnZlbGwgTVY2NHg2MCIKIAlkZXBlbmRzIG9uIEVEQUNfTU1fRURBQyAmJiBNVjY0WDYwCkBAIC00MDYsNiArNDEzLDQxIEBACiAJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCiAJICBBbHRlcmEgRXRoZXJuZXQgRklGTyBNZW1vcnkgZm9yIEFsdGVyYSBTb0NzLgogCitjb25maWcgRURBQ19BTFRFUkFfTkFORAorCWJvb2wgIkFsdGVyYSBOQU5EIEZJRk8gRUNDIgorCWRlcGVuZHMgb24gRURBQ19BTFRFUkE9eSAmJiBNVERfTkFORF9ERU5BTEkKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCisJICBBbHRlcmEgTkFORCBGSUZPIE1lbW9yeSBmb3IgQWx0ZXJhIFNvQ3MuCisKK2NvbmZpZyBFREFDX0FMVEVSQV9ETUEKKwlib29sICJBbHRlcmEgRE1BIEZJRk8gRUNDIgorCWRlcGVuZHMgb24gRURBQ19BTFRFUkE9eSAmJiBQTDMzMF9ETUE9eQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUKKwkgIEFsdGVyYSBETUEgRklGTyBNZW1vcnkgZm9yIEFsdGVyYSBTb0NzLgorCitjb25maWcgRURBQ19BTFRFUkFfVVNCCisJYm9vbCAiQWx0ZXJhIFVTQiBGSUZPIEVDQyIKKwlkZXBlbmRzIG9uIEVEQUNfQUxURVJBPXkgJiYgVVNCX0RXQzIKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCisJICBBbHRlcmEgVVNCIEZJRk8gTWVtb3J5IGZvciBBbHRlcmEgU29Dcy4KKworY29uZmlnIEVEQUNfQUxURVJBX1FTUEkKKwlib29sICJBbHRlcmEgUVNQSSBGSUZPIEVDQyIKKwlkZXBlbmRzIG9uIEVEQUNfQUxURVJBPXkgJiYgU1BJX0NBREVOQ0VfUVVBRFNQSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiBvbiB0aGUKKwkgIEFsdGVyYSBRU1BJIEZJRk8gTWVtb3J5IGZvciBBbHRlcmEgU29Dcy4KKworY29uZmlnIEVEQUNfQUxURVJBX1NETU1DCisJYm9vbCAiQWx0ZXJhIFNETU1DIEZJRk8gRUNDIgorCWRlcGVuZHMgb24gRURBQ19BTFRFUkE9eSAmJiBNTUNfRFcKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlCisJICBBbHRlcmEgU0RNTUMgRklGTyBNZW1vcnkgZm9yIEFsdGVyYSBTb0NzLgorCiBjb25maWcgRURBQ19TWU5PUFNZUwogCXRyaXN0YXRlICJTeW5vcHN5cyBERFIgTWVtb3J5IENvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBFREFDX01NX0VEQUMgJiYgQVJDSF9aWU5RCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvTWFrZWZpbGUgYi9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKaW5kZXggOTg2MDQ5OS4uODhlNDcyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQpAQCAtNTEsNyArNTEsMTMgQEAKIG9iai0kKENPTkZJR19FREFDX0FNRDY0KQkJKz0gYW1kNjRfZWRhY19tb2QubwogCiBvYmotJChDT05GSUdfRURBQ19QQVNFTUkpCQkrPSBwYXNlbWlfZWRhYy5vCi1vYmotJChDT05GSUdfRURBQ19NUEM4NVhYKQkJKz0gbXBjODV4eF9lZGFjLm8KKworbXBjODV4eF9lZGFjX21vZC15CQkJOj0gZnNsX2Rkcl9lZGFjLm8gbXBjODV4eF9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX01QQzg1WFgpCQkrPSBtcGM4NXh4X2VkYWNfbW9kLm8KKworbGF5ZXJzY2FwZV9lZGFjX21vZC15CQkJOj0gZnNsX2Rkcl9lZGFjLm8gbGF5ZXJzY2FwZV9lZGFjLm8KK29iai0kKENPTkZJR19FREFDX0xBWUVSU0NBUEUpCQkrPSBsYXllcnNjYXBlX2VkYWNfbW9kLm8KKwogb2JqLSQoQ09ORklHX0VEQUNfTVY2NFg2MCkJCSs9IG12NjR4NjBfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19DRUxMKQkJCSs9IGNlbGxfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19QUEM0WFgpCQkrPSBwcGM0eHhfZWRhYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYWx0ZXJhX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5jCmluZGV4IDIzOThkMDcuLjU4ZDNlMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbHRlcmFfZWRhYy5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAlpZiAoIW1jaS0+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+aXJxcy5zZWMJCT0gTk9fSVJROwotCXBkYXRhLT5pcnFzLmRlZAkJPSBOT19JUlE7CiAKIAkvKiBJbml0aWFsaXplIGNvbnRyb2xsZXIgY2FwYWJpbGl0aWVzIGFuZCBjb25maWd1cmF0aW9uICovCiAKQEAgLTExMTEsNyArMTEwOSw3IEBACiAJZGVkX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCBJTlRNQVBfRUNDREVEX0lOREVYKTsKIAlzZWNfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIElOVE1BUF9FQ0NTRUNfSU5ERVgpOwogCi0JaWYgKGRlZF9pcnEgPT0gTk9fSVJRIHx8IHNlY19pcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFkZWRfaXJxIHx8ICFzZWNfaXJxKSB7CiAJCXBwYzR4eF9lZGFjX21jX3ByaW50ayhLRVJOX0VSUiwgbWNpLAogCQkJCSAgICAgICJVbmFibGUgdG8gbWFwIGludGVycnVwdHMuXG4iKTsKIAkJc3RhdHVzID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvc2JfZWRhYy5jCmluZGV4IGNlMDA2N2IuLjU0Nzc1MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL3NiX2VkYWMuYwpAQCAtMjQ3NCw3ICsyNDc0LDcgQEAKIAogCS8qIENoZWNrIGlmIGV2ZXJ5dGhpbmcgd2VyZSByZWdpc3RlcmVkICovCiAJaWYgKCFwdnQtPnBjaV9zYWQwIHx8ICFwdnQtPnBjaV9zYWQxIHx8ICFwdnQtPnBjaV9oYTAgfHwKLQkgICAgIXB2dC0+IHBjaV90YWQgfHwgIXB2dC0+cGNpX3JhcyAgfHwgIXB2dC0+cGNpX3RhKQorCSAgICAhcHZ0LT5wY2lfcmFzIHx8ICFwdnQtPnBjaV90YSkKIAkJZ290byBlbm9kZXY7CiAKIAlpZiAoc2F3X2NoYW5fbWFzayAhPSAweDBmKQpAQCAtMjU2Myw4ICsyNTYzLDcgQEAKIAogCS8qIENoZWNrIGlmIGV2ZXJ5dGhpbmcgd2VyZSByZWdpc3RlcmVkICovCiAJaWYgKCFwdnQtPnBjaV9zYWQwIHx8ICFwdnQtPnBjaV9oYTAgfHwgIXB2dC0+cGNpX2JyMCB8fAotCSAgICAhcHZ0LT5wY2lfYnIxIHx8ICFwdnQtPnBjaV90YWQgfHwgIXB2dC0+cGNpX3JhcyAgfHwKLQkgICAgIXB2dC0+cGNpX3RhKQorCSAgICAhcHZ0LT5wY2lfYnIxIHx8ICFwdnQtPnBjaV9yYXMgfHwgIXB2dC0+cGNpX3RhKQogCQlnb3RvIGVub2RldjsKIAogCWlmIChzYXdfY2hhbl9tYXNrICE9IDB4MGYgJiYgLyogLUVOICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvd3EuYyBiL2RyaXZlcnMvZWRhYy93cS5jCmluZGV4IDFiOGMwN2UuLjJhOWExMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy93cS5jCisrKyBiL2RyaXZlcnMvZWRhYy93cS5jCkBAIC0yNyw3ICsyNyw3IEBACiAKIGludCBlZGFjX3dvcmtxdWV1ZV9zZXR1cCh2b2lkKQogewotCXdxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImVkYWMtcG9sbGVyIik7CisJd3EgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgiZWRhYy1wb2xsZXIiLCBXUV9NRU1fUkVDTEFJTSk7CiAJaWYgKCF3cSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vS2NvbmZpZyBiL2RyaXZlcnMvZXh0Y29uL0tjb25maWcKaW5kZXggM2Q4OWU2MC4uMDQ3ODhkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2V4dGNvbi9LY29uZmlnCkBAIC05Niw2ICs5NiwxMiBAQAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgVVNCIHBlcmlwaGVyYWwgYW5kIFVTQiBob3N0CiAJICBkZXRlY3Rpb24gYnkgcGFsbWFzIHVzYi4KIAorY29uZmlnIEVYVENPTl9RQ09NX1NQTUlfTUlTQworCXRyaXN0YXRlICJRdWFsY29tbSBVU0IgZXh0Y29uIHN1cHBvcnQiCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgU1BNSSBQTUlDIGJhc2VkIFVTQiBjYWJsZSBkZXRlY3Rpb24KKwkgIHN1cHBvcnQgb24gUXVhbGNvbW0gUE1JQ3Mgc3VjaCBhcyBQTTg5NDEuCisKIGNvbmZpZyBFWFRDT05fUlQ4OTczQQogCXRyaXN0YXRlICJSaWNodGVrIFJUODk3M0EgRVhUQ09OIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJMkMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL01ha2VmaWxlIGIvZHJpdmVycy9leHRjb24vTWFrZWZpbGUKaW5kZXggOTcyYzgxMy4uMzFhMGE5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9leHRjb24vTWFrZWZpbGUKQEAgLTE0LDYgKzE0LDcgQEAKIG9iai0kKENPTkZJR19FWFRDT05fTUFYNzc4NDMpCSs9IGV4dGNvbi1tYXg3Nzg0My5vCiBvYmotJChDT05GSUdfRVhUQ09OX01BWDg5OTcpCSs9IGV4dGNvbi1tYXg4OTk3Lm8KIG9iai0kKENPTkZJR19FWFRDT05fUEFMTUFTKQkrPSBleHRjb24tcGFsbWFzLm8KK29iai0kKENPTkZJR19FWFRDT05fUUNPTV9TUE1JX01JU0MpICs9IGV4dGNvbi1xY29tLXNwbWktbWlzYy5vCiBvYmotJChDT05GSUdfRVhUQ09OX1JUODk3M0EpCSs9IGV4dGNvbi1ydDg5NzNhLm8KIG9iai0kKENPTkZJR19FWFRDT05fU001NTAyKQkrPSBleHRjb24tc201NTAyLm8KIG9iai0kKENPTkZJR19FWFRDT05fVVNCX0dQSU8pCSs9IGV4dGNvbi11c2ItZ3Bpby5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tYWRjLWphY2suYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1hZGMtamFjay5jCmluZGV4IDQ0ZTQ4YWEuLmJjNTM4NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1hZGMtamFjay5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1hZGMtamFjay5jCkBAIC0zLDYgKzMsOSBAQAogICoKICAqIEFuYWxvZyBKYWNrIGV4dGNvbiBkcml2ZXIgd2l0aCBBREMtYmFzZWQgZGV0ZWN0aW9uIGNhcGFiaWxpdHkuCiAgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIENoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgorICoKICAqIENvcHlyaWdodCAoQykgMjAxMiBTYW1zdW5nIEVsZWN0cm9uaWNzCiAgKiBNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1zdW5nLmNvbT4KICAqCkBAIC01OCw3ICs2MSw3IEBACiAJc3RydWN0IGFkY19qYWNrX2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLAogCQkJc3RydWN0IGFkY19qYWNrX2RhdGEsCiAJCQloYW5kbGVyKTsKLQl1MzIgc3RhdGUgPSAwOworCXN0cnVjdCBhZGNfamFja19jb25kICpkZWY7CiAJaW50IHJldCwgYWRjX3ZhbDsKIAlpbnQgaTsKIApAQCAtNzAsMTcgKzczLDE4IEBACiAKIAkvKiBHZXQgc3RhdGUgZnJvbSBhZGMgdmFsdWUgd2l0aCBhZGNfY29uZGl0aW9ucyAqLwogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5udW1fY29uZGl0aW9uczsgaSsrKSB7Ci0JCXN0cnVjdCBhZGNfamFja19jb25kICpkZWYgPSAmZGF0YS0+YWRjX2NvbmRpdGlvbnNbaV07Ci0JCWlmICghZGVmLT5zdGF0ZSkKLQkJCWJyZWFrOworCQlkZWYgPSAmZGF0YS0+YWRjX2NvbmRpdGlvbnNbaV07CiAJCWlmIChkZWYtPm1pbl9hZGMgPD0gYWRjX3ZhbCAmJiBkZWYtPm1heF9hZGMgPj0gYWRjX3ZhbCkgewotCQkJc3RhdGUgPSBkZWYtPnN0YXRlOwotCQkJYnJlYWs7CisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZGF0YS0+ZWRldiwgZGVmLT5pZCwgdHJ1ZSk7CisJCQlyZXR1cm47CiAJCX0KIAl9Ci0JLyogaWYgbm8gZGVmIGhhcyBtZXQsIGl0IG1lYW5zIHN0YXRlID0gMCAobm8gY2FibGVzIGF0dGFjaGVkKSAqLwogCi0JZXh0Y29uX3NldF9zdGF0ZShkYXRhLT5lZGV2LCBzdGF0ZSk7CisJLyogU2V0IHRoZSBkZXRhY2hlZCBzdGF0ZSBpZiBhZGMgdmFsdWUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSByYW5nZSAqLworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5udW1fY29uZGl0aW9uczsgaSsrKSB7CisJCWRlZiA9ICZkYXRhLT5hZGNfY29uZGl0aW9uc1tpXTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGRhdGEtPmVkZXYsIGRlZi0+aWQsIGZhbHNlKTsKKwl9CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhZGNfamFja19pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKl9kYXRhKQpAQCAtMTE0LDE2ICsxMTgsMTQgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JaWYgKCFwZGF0YS0+YWRjX2NvbmRpdGlvbnMgfHwKLQkJCSFwZGF0YS0+YWRjX2NvbmRpdGlvbnNbMF0uc3RhdGUpIHsKKwlpZiAoIXBkYXRhLT5hZGNfY29uZGl0aW9ucykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlcnJvcjogYWRjX2NvbmRpdGlvbnMgbm90IGRlZmluZWQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRhdGEtPmFkY19jb25kaXRpb25zID0gcGRhdGEtPmFkY19jb25kaXRpb25zOwogCiAJLyogQ2hlY2sgdGhlIGxlbmd0aCBvZiBhcnJheSBhbmQgc2V0IG51bV9jb25kaXRpb25zICovCi0JZm9yIChpID0gMDsgZGF0YS0+YWRjX2NvbmRpdGlvbnNbaV0uc3RhdGU7IGkrKykKLQkJOworCWZvciAoaSA9IDA7IGRhdGEtPmFkY19jb25kaXRpb25zW2ldLmlkICE9IEVYVENPTl9OT05FOyBpKyspOwogCWRhdGEtPm51bV9jb25kaXRpb25zID0gaTsKIAogCWRhdGEtPmNoYW4gPSBpaW9fY2hhbm5lbF9nZXQoJnBkZXYtPmRldiwgcGRhdGEtPmNvbnN1bWVyX2NoYW5uZWwpOwpAQCAtMTU4LDYgKzE2MCw3IEBACiAJaWYgKGRhdGEtPndha2V1cF9zb3VyY2UpCiAJCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKIAorCWFkY19qYWNrX2hhbmRsZXIoJmRhdGEtPmhhbmRsZXIud29yayk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1hcml6b25hLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tYXJpem9uYS5jCmluZGV4IDFkOGUwYTUuLjU2ZTZjNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1hcml6b25hLmMKKysrIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWFyaXpvbmEuYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAJCWlmIChjbGFtcCkKIAkJCXZhbCA9IEFSSVpPTkFfUk1WX1NIUlRfSFAxTDsKIAkJYnJlYWs7Ci0JfTsKKwl9CiAKIAlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhhcml6b25hLT5kYXBtKTsKIApAQCAtNjE0LDcgKzYxNCw3IEBACiAJfQogCiAJLyogSWYgdGhlIGNhYmxlIHdhcyByZW1vdmVkIHdoaWxlIG1lYXN1cmluZyBpZ25vcmUgdGhlIHJlc3VsdCAqLwotCXJldCA9IGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9NRUNIQU5JQ0FMKTsKKwlyZXQgPSBleHRjb25fZ2V0X3N0YXRlKGluZm8tPmVkZXYsIEVYVENPTl9NRUNIQU5JQ0FMKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkZhaWxlZCB0byBjaGVjayBjYWJsZSBzdGF0ZTogJWRcbiIsCiAJCQlyZXQpOwpAQCAtNjQ5LDcgKzY0OSw3IEBACiAJZWxzZQogCQlyZXBvcnQgPSBFWFRDT05fSkFDS19IRUFEUEhPTkU7CiAKLQlyZXQgPSBleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCByZXBvcnQsIHRydWUpOworCXJldCA9IGV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCByZXBvcnQsIHRydWUpOwogCWlmIChyZXQgIT0gMCkKIAkJZGV2X2Vycihhcml6b25hLT5kZXYsICJGYWlsZWQgdG8gcmVwb3J0IEhQL2xpbmU6ICVkXG4iLAogCQkJcmV0KTsKQEAgLTczMiw3ICs3MzIsNyBAQAogCQkJICAgQVJJWk9OQV9BQ0NERVRfTU9ERV9NQVNLLCBBUklaT05BX0FDQ0RFVF9NT0RFX01JQyk7CiAKIAkvKiBKdXN0IHJlcG9ydCBoZWFkcGhvbmUgKi8KLQlyZXQgPSBleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fSkFDS19IRUFEUEhPTkUsIHRydWUpOworCXJldCA9IGV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fSkFDS19IRUFEUEhPTkUsIHRydWUpOwogCWlmIChyZXQgIT0gMCkKIAkJZGV2X2Vycihhcml6b25hLT5kZXYsICJGYWlsZWQgdG8gcmVwb3J0IGhlYWRwaG9uZTogJWRcbiIsIHJldCk7CiAKQEAgLTc4OSw3ICs3ODksNyBAQAogCQkJICAgQVJJWk9OQV9BQ0NERVRfTU9ERV9NQVNLLCBBUklaT05BX0FDQ0RFVF9NT0RFX01JQyk7CiAKIAkvKiBKdXN0IHJlcG9ydCBoZWFkcGhvbmUgKi8KLQlyZXQgPSBleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fSkFDS19IRUFEUEhPTkUsIHRydWUpOworCXJldCA9IGV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fSkFDS19IRUFEUEhPTkUsIHRydWUpOwogCWlmIChyZXQgIT0gMCkKIAkJZGV2X2Vycihhcml6b25hLT5kZXYsICJGYWlsZWQgdG8gcmVwb3J0IGhlYWRwaG9uZTogJWRcbiIsIHJldCk7CiAKQEAgLTgyOSw3ICs4MjksNyBAQAogCW11dGV4X2xvY2soJmluZm8tPmxvY2spOwogCiAJLyogSWYgdGhlIGNhYmxlIHdhcyByZW1vdmVkIHdoaWxlIG1lYXN1cmluZyBpZ25vcmUgdGhlIHJlc3VsdCAqLwotCXJldCA9IGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9NRUNIQU5JQ0FMKTsKKwlyZXQgPSBleHRjb25fZ2V0X3N0YXRlKGluZm8tPmVkZXYsIEVYVENPTl9NRUNIQU5JQ0FMKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkZhaWxlZCB0byBjaGVjayBjYWJsZSBzdGF0ZTogJWRcbiIsCiAJCQkJcmV0KTsKQEAgLTkxNCw3ICs5MTQsNyBAQAogCiAJCWFyaXpvbmFfaWRlbnRpZnlfaGVhZHBob25lKGluZm8pOwogCi0JCXJldCA9IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsCisJCXJldCA9IGV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LAogCQkJCQkgICAgICBFWFRDT05fSkFDS19NSUNST1BIT05FLCB0cnVlKTsKIAkJaWYgKHJldCAhPSAwKQogCQkJZGV2X2Vycihhcml6b25hLT5kZXYsICJIZWFkc2V0IHJlcG9ydCBmYWlsZWQ6ICVkXG4iLApAQCAtMTEwOCw3ICsxMTA4LDcgQEAKIAogCWlmIChpbmZvLT5sYXN0X2phY2tkZXQgPT0gcHJlc2VudCkgewogCQlkZXZfZGJnKGFyaXpvbmEtPmRldiwgIkRldGVjdGVkIGphY2tcbiIpOwotCQlyZXQgPSBleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LAorCQlyZXQgPSBleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwKIAkJCQkJICAgICAgRVhUQ09OX01FQ0hBTklDQUwsIHRydWUpOwogCiAJCWlmIChyZXQgIT0gMCkKQEAgLTExNDksMTAgKzExNDksMTMgQEAKIAkJCQkJIGluZm8tPm1pY2RfcmFuZ2VzW2ldLmtleSwgMCk7CiAJCWlucHV0X3N5bmMoaW5mby0+aW5wdXQpOwogCi0JCXJldCA9IGV4dGNvbl91cGRhdGVfc3RhdGUoaW5mby0+ZWRldiwgMHhmZmZmZmZmZiwgMCk7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCWRldl9lcnIoYXJpem9uYS0+ZGV2LCAiUmVtb3ZhbCByZXBvcnQgZmFpbGVkOiAlZFxuIiwKLQkJCQlyZXQpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhcml6b25hX2NhYmxlKSAtIDE7IGkrKykgeworCQkJcmV0ID0gZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsCisJCQkJCWFyaXpvbmFfY2FibGVbaV0sIGZhbHNlKTsKKwkJCWlmIChyZXQgIT0gMCkKKwkJCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwKKwkJCQkJIlJlbW92YWwgcmVwb3J0IGZhaWxlZDogJWRcbiIsIHJldCk7CisJCX0KIAogCQlyZWdtYXBfdXBkYXRlX2JpdHMoYXJpem9uYS0+cmVnbWFwLAogCQkJCSAgIEFSSVpPTkFfSkFDS19ERVRFQ1RfREVCT1VOQ0UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tYXhwMjg4LmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tYXhwMjg4LmMKaW5kZXggZmQ1NWMyZi4uNDJmNDFlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWF4cDI4OC5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1heHAyODguYwpAQCAtMTg5LDE5ICsxODksMTkgQEAKIAogCXN3aXRjaCAoY2hyZ190eXBlKSB7CiAJY2FzZSBERVRfU1RBVF9TRFA6Ci0JCWRldl9kYmcoaW5mby0+ZGV2LCAic2RwIGNhYmxlIGlzIGNvbm5lY2V0ZFxuIik7CisJCWRldl9kYmcoaW5mby0+ZGV2LCAic2RwIGNhYmxlIGlzIGNvbm5lY3RlZFxuIik7CiAJCW5vdGlmeV9vdGcgPSB0cnVlOwogCQlub3RpZnlfY2hhcmdlciA9IHRydWU7CiAJCWNhYmxlID0gRVhUQ09OX0NIR19VU0JfU0RQOwogCQlicmVhazsKIAljYXNlIERFVF9TVEFUX0NEUDoKLQkJZGV2X2RiZyhpbmZvLT5kZXYsICJjZHAgY2FibGUgaXMgY29ubmVjZXRkXG4iKTsKKwkJZGV2X2RiZyhpbmZvLT5kZXYsICJjZHAgY2FibGUgaXMgY29ubmVjdGVkXG4iKTsKIAkJbm90aWZ5X290ZyA9IHRydWU7CiAJCW5vdGlmeV9jaGFyZ2VyID0gdHJ1ZTsKIAkJY2FibGUgPSBFWFRDT05fQ0hHX1VTQl9DRFA7CiAJCWJyZWFrOwogCWNhc2UgREVUX1NUQVRfRENQOgotCQlkZXZfZGJnKGluZm8tPmRldiwgImRjcCBjYWJsZSBpcyBjb25uZWNldGRcbiIpOworCQlkZXZfZGJnKGluZm8tPmRldiwgImRjcCBjYWJsZSBpcyBjb25uZWN0ZWRcbiIpOwogCQlub3RpZnlfY2hhcmdlciA9IHRydWU7CiAJCWNhYmxlID0gRVhUQ09OX0NIR19VU0JfRENQOwogCQlicmVhazsKQEAgLTIyNiw3ICsyMjYsNyBAQAogCX0KIAogCWlmIChub3RpZnlfY2hhcmdlcikKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgY2FibGUsIHZidXNfYXR0YWNoKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIGNhYmxlLCB2YnVzX2F0dGFjaCk7CiAKIAkvKiBDbGVhciB0aGUgZmxhZ3Mgb24gZGlzY29ubmVjdCBldmVudCAqLwogCWlmICghdmJ1c19hdHRhY2gpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tZ3Bpby5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLWdwaW8uYwppbmRleCBkMDIzNzg5Li5lYmVkMjJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tZ3Bpby5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ncGlvLmMKQEAgLTQ5LDcgKzQ5LDggQEAKIAlzdGF0ZSA9IGdwaW9kX2dldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5pZF9ncGlvZCk7CiAJaWYgKGRhdGEtPnBkYXRhLT5ncGlvX2FjdGl2ZV9sb3cpCiAJCXN0YXRlID0gIXN0YXRlOwotCWV4dGNvbl9zZXRfc3RhdGUoZGF0YS0+ZWRldiwgc3RhdGUpOworCisJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGRhdGEtPmVkZXYsIGRhdGEtPnBkYXRhLT5leHRjb25faWQsIHN0YXRlKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGdwaW9faXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLW1heDE0NTc3LmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4MTQ1NzcuYwppbmRleCA4NTJhNzExLi4xMmUyNmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4MTQ1NzcuYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4MTQ1NzcuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMsMjAxNCBTYW1zdW5nIEVsZWN0cm9uaWNzCiAgKiBDaGFud29vIENob2kgPGN3MDAuY2hvaUBzYW1zdW5nLmNvbT4KLSAqIEtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgorICogS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fSklHLCBhdHRhY2hlZCk7CisJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9KSUcsIGF0dGFjaGVkKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDU0LDI0ICs0NTQsMjQgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGF0dGFjaGVkKTsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwgYXR0YWNoZWQpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX0RFRElDQVRFRF9DSEc6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9ET1dOU1RSRUFNX1BPUlQ6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0NEUCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0NEUCwKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9TUEVDSUFMXzUwME1BOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TTE9XLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0xPVywKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9TUEVDSUFMXzFBOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9GQVNULAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRkFTVCwKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9OT05FOgpAQCAtNzkxLDYgKzc5MSw2IEBACiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1heDE0NTc3X211aWNfZHJpdmVyKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbSAxNDU3Ny83NzgzNiBFeHRjb24gZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJDaGFud29vIENob2kgPGN3MDAuY2hvaUBzYW1zdW5nLmNvbT4sIEtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiQ2hhbndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+LCBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmV4dGNvbi1tYXgxNDU3NyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLW1heDMzNTUuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXgzMzU1LmMKaW5kZXggYzI0YWJlYy4uNTMzZTE2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLW1heDMzNTUuYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4MzM1NS5jCkBAIC0zOSwxNiArMzksMTYgQEAKIAkJICogQXMgd2UgZG9uJ3QgaGF2ZSBldmVudCBmb3IgVVNCIHBlcmlwaGVyYWwgY2FibGUgYXR0YWNoZWQsCiAJCSAqIHdlIHNpbXVsYXRlIFVTQiBwZXJpcGhlcmFsIGF0dGFjaCBoZXJlLgogCQkgKi8KLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZGF0YS0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGRhdGEtPmVkZXYsIEVYVENPTl9VU0IsIHRydWUpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZGF0YS0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhkYXRhLT5lZGV2LCBFWFRDT05fVVNCLCB0cnVlKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBJRCA9IDAgbWVhbnMgVVNCIEhPU1QgY2FibGUgYXR0YWNoZWQuCiAJCSAqIEFzIHdlIGRvbid0IGhhdmUgZXZlbnQgZm9yIFVTQiBwZXJpcGhlcmFsIGNhYmxlIGRldGFjaGVkLAogCQkgKiB3ZSBzaW11bGF0ZSBVU0IgcGVyaXBoZXJhbCBkZXRhY2ggaGVyZS4KIAkJICovCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGRhdGEtPmVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZGF0YS0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGRhdGEtPmVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGRhdGEtPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgdHJ1ZSk7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLW1heDc3NjkzLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4Nzc2OTMuYwppbmRleCBmMTdjYjc2Li42OGRiY2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4Nzc2OTMuYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4Nzc2OTMuYwpAQCAtNTA1LDggKzUwNSw4IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRE9DSywgYXR0YWNoZWQpOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9ET0NLLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsIGF0dGFjaGVkKTsKIAkJZ290byBvdXQ7CiAJY2FzZSBNQVg3NzY5M19NVUlDX0FEQ19BVURJT19NT0RFX1JFTU9URToJLyogRG9jay1EZXNrICovCiAJCWRvY2tfaWQgPSBFWFRDT05fRE9DSzsKQEAgLTUxNCw4ICs1MTQsOCBAQAogCWNhc2UgTUFYNzc2OTNfTVVJQ19BRENfQVZfQ0FCTEVfTk9MT0FEOgkJLyogRG9jay1BdWRpbyAqLwogCQlkb2NrX2lkID0gRVhUQ09OX0RPQ0s7CiAJCWlmICghYXR0YWNoZWQpIHsKLQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKLQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBmYWxzZSk7CisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAogCQkJCQkJZmFsc2UpOwogCQl9CiAJCWJyZWFrOwpAQCAtNTMwLDcgKzUzMCw3IEBACiAJCQkJCWF0dGFjaGVkKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBkb2NrX2lkLCBhdHRhY2hlZCk7CisJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIGRvY2tfaWQsIGF0dGFjaGVkKTsKIAogb3V0OgogCXJldHVybiAwOwpAQCAtNTk2LDcgKzU5Niw3IEBACiAJCQkJCQlhdHRhY2hlZCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQl9IT1NULCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIGF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3NzY5M19NVUlDX0dORF9BVl9DQUJMRV9MT0FEOgogCQkvKiBBdWRpbyBWaWRlbyBDYWJsZSB3aXRoIGxvYWQsIFBBVEg6QVVESU8gKi8KQEAgLTYwNCwxNCArNjA0LDE0IEBACiAJCQkJCQlhdHRhY2hlZCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwgYXR0YWNoZWQpOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3NzY5M19NVUlDX0dORF9NSEw6CiAJY2FzZSBNQVg3NzY5M19NVUlDX0dORF9NSExfVkI6CiAJCS8qIE1ITCBvciBNSEwgd2l0aCBVU0IvVEEgY2FibGUgKi8KLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0RJU1BfTUhMLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsIGF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycihpbmZvLT5kZXYsICJmYWlsZWQgdG8gZGV0ZWN0ICVzIGNhYmxlIG9mIGduZCB0eXBlXG4iLApAQCAtNjUzLDcgKzY1Myw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fSklHLCBhdHRhY2hlZCk7CisJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9KSUcsIGF0dGFjaGVkKTsKIAogCXJldHVybiAwOwogfQpAQCAtODA3LDEwICs4MDcsMTAgQEAKIAkJCSAqIC0gU3VwcG9ydCBjaGFyZ2luZyB0aHJvdWdoIG1pY3JvLXVzYiBwb3J0IHdpdGhvdXQKIAkJCSAqICAgZGF0YSBjb25uZWN0aW9uCiAJCQkgKi8KLQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCiAJCQkJCQlhdHRhY2hlZCk7CiAJCQlpZiAoIWNhYmxlX2F0dGFjaGVkKQotCQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsCisJCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsCiAJCQkJCUVYVENPTl9ESVNQX01ITCwgY2FibGVfYXR0YWNoZWQpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTgzNCwxMyArODM0LDEzIEBACiAJCQkgKiAtIFN1cHBvcnQgY2hhcmdpbmcgdGhyb3VnaCBtaWNyby11c2IgcG9ydCB3aXRob3V0CiAJCQkgKiAgIGRhdGEgY29ubmVjdGlvbi4KIAkJCSAqLwotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLAogCQkJCQkJYXR0YWNoZWQpOwotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKIAkJCQkJCWF0dGFjaGVkKTsKIAogCQkJaWYgKCFjYWJsZV9hdHRhY2hlZCkKLQkJCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRE9DSywKKwkJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0RPQ0ssCiAJCQkJCQkJY2FibGVfYXR0YWNoZWQpOwogCQkJYnJlYWs7CiAJCWNhc2UgTUFYNzc2OTNfTVVJQ19BRENfUkVTRVJWRURfQUNDXzM6CQkvKiBEb2NrLVNtYXJ0ICovCkBAIC04NjksOSArODY5LDkgQEAKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAKLQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9ET0NLLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9ET0NLLAogCQkJCQkJYXR0YWNoZWQpOwotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0RJU1BfTUhMLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9ESVNQX01ITCwKIAkJCQkJCWF0dGFjaGVkKTsKIAkJCWJyZWFrOwogCQl9CkBAIC05MDUsMjggKzkwNSwyOCBAQAogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKIAotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLAogCQkJCQkJYXR0YWNoZWQpOwotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NEUCwKIAkJCQkJCWF0dGFjaGVkKTsKIAkJCWJyZWFrOwogCQljYXNlIE1BWDc3NjkzX0NIQVJHRVJfVFlQRV9ERURJQ0FURURfQ0hHOgogCQkJLyogT25seSBUQSBjYWJsZSAqLwotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKIAkJCQkJCWF0dGFjaGVkKTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc2OTNfQ0hBUkdFUl9UWVBFX0RPV05TVFJFQU1fUE9SVDoKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc2OTNfQ0hBUkdFUl9UWVBFX0FQUExFXzUwME1BOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TTE9XLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0xPVywKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDc3NjkzX0NIQVJHRVJfVFlQRV9BUFBMRV8xQV8yQToKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRkFTVCwKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0ZBU1QsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3NzY5M19DSEFSR0VSX1RZUEVfREVBRF9CQVRURVJZOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLW1heDc3ODQzLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4Nzc4NDMuYwppbmRleCBiMTg4YmQ2Li41ZDExZmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4Nzc4NDMuYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4Nzc4NDMuYwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDc3ODQzX01VSUNfR05EX01ITF9WQjoKIAljYXNlIE1BWDc3ODQzX01VSUNfR05EX01ITDoKQEAgLTM1Niw3ICszNTYsNyBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0RJU1BfTUhMLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsIGF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycihpbmZvLT5kZXYsICJmYWlsZWQgdG8gZGV0ZWN0ICVzIGFjY2Vzc29yeShnbmQ6MHgleClcbiIsCkBAIC0zOTIsNyArMzkyLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9KSUcsIGF0dGFjaGVkKTsKKwlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0pJRywgYXR0YWNoZWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00ODYsOCArNDg2LDggQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0IsIGF0dGFjaGVkKTsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwgYXR0YWNoZWQpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0RQLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc4NDNfTVVJQ19DSEdfRE9XTlNUUkVBTToKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc4NDNfTVVJQ19DSEdfREVESUNBVEVEOgpAQCAtNTA3LDcgKzUwNyw3IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3Nzg0M19NVUlDX0NIR19TUEVDSUFMXzUwME1BOgpAQCAtNTE3LDcgKzUxNyw3IEBACiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TTE9XLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfU0xPVywKIAkJCQkJYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDc3ODQzX01VSUNfQ0hHX1NQRUNJQUxfMUE6CkBAIC01MjcsNyArNTI3LDcgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0ZBU1QsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9GQVNULAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc4NDNfTVVJQ19DSEdfR05EOgpAQCAtNTM2LDEwICs1MzYsMTAgQEAKIAogCQkvKiBDaGFyZ2VyIGNhYmxlIG9uIE1ITCBhY2Nlc3NvcnkgaXMgYXR0YWNoIG9yIGRldGFjaCAqLwogCQlpZiAoZ25kX3R5cGUgPT0gTUFYNzc4NDNfTVVJQ19HTkRfTUhMX1ZCKQotCQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAorCQkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0RDUCwKIAkJCQkJCXRydWUpOwogCQllbHNlIGlmIChnbmRfdHlwZSA9PSBNQVg3Nzg0M19NVUlDX0dORF9NSEwpCi0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9EQ1AsCisJCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAogCQkJCQkJZmFsc2UpOwogCQlicmVhazsKIAljYXNlIE1BWDc3ODQzX01VSUNfQ0hHX05PTkU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4ODk5Ny5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLW1heDg5OTcuYwppbmRleCA5YTg5MzIwLi40YTA2MTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tbWF4ODk5Ny5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1tYXg4OTk3LmMKQEAgLTMzMSwxMSArMzMxLDExIEBACiAKIAlzd2l0Y2ggKHVzYl90eXBlKSB7CiAJY2FzZSBNQVg4OTk3X1VTQl9IT1NUOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIGF0dGFjaGVkKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgYXR0YWNoZWQpOwogCQlicmVhazsKIAljYXNlIE1BWDg5OTdfVVNCX0RFVklDRToKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwgYXR0YWNoZWQpOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTM2MSw3ICszNjEsNyBAQAogCXN3aXRjaCAoY2FibGVfdHlwZSkgewogCWNhc2UgTUFYODk5N19NVUlDX0FEQ19BVl9DQUJMRV9OT0xPQUQ6CiAJY2FzZSBNQVg4OTk3X01VSUNfQURDX0ZBQ1RPUllfTU9ERV9VQVJUX09OOgotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fRE9DSywgYXR0YWNoZWQpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0RPQ0ssIGF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2VycihpbmZvLT5kZXYsICJmYWlsZWQgdG8gZGV0ZWN0ICVzIGRvY2sgZGV2aWNlXG4iLApAQCAtMzg0LDcgKzM4NCw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0pJRywgYXR0YWNoZWQpOworCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fSklHLCBhdHRhY2hlZCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQwNiw3ICs0MDYsNyBAQAogCQkJcmV0dXJuIHJldDsKIAkJYnJlYWs7CiAJY2FzZSBNQVg4OTk3X01VSUNfQURDX01ITDoKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0RJU1BfTUhMLCBhdHRhY2hlZCk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fRElTUF9NSEwsIGF0dGFjaGVkKTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg4OTk3X01VSUNfQURDX0ZBQ1RPUllfTU9ERV9VU0JfT0ZGOgogCWNhc2UgTUFYODk5N19NVUlDX0FEQ19GQUNUT1JZX01PREVfVVNCX09OOgpAQCAtNDg5LDE5ICs0ODksMTkgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIE1BWDg5OTdfQ0hBUkdFUl9UWVBFX0RPV05TVFJFQU1fUE9SVDoKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfQ0RQLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYODk5N19DSEFSR0VSX1RZUEVfREVESUNBVEVEX0NIRzoKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAorCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX0NIR19VU0JfRENQLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYODk5N19DSEFSR0VSX1RZUEVfNTAwTUE6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX1NMT1csCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TTE9XLAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWNhc2UgTUFYODk5N19DSEFSR0VSX1RZUEVfMUE6Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9DSEdfVVNCX0ZBU1QsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9GQVNULAogCQkJCQlhdHRhY2hlZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tcGFsbWFzLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tcGFsbWFzLmMKaW5kZXggY2FmZjQ2Yy4uNjM0YmE3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLXBhbG1hcy5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1wYWxtYXMuYwpAQCAtNjEsNyArNjEsNyBAQAogCWlmICh2YnVzX2xpbmVfc3RhdGUgJiBQQUxNQVNfSU5UM19MSU5FX1NUQVRFX1ZCVVMpIHsKIAkJaWYgKHBhbG1hc191c2ItPmxpbmtzdGF0ICE9IFBBTE1BU19VU0JfU1RBVEVfVkJVUykgewogCQkJcGFsbWFzX3VzYi0+bGlua3N0YXQgPSBQQUxNQVNfVVNCX1NUQVRFX1ZCVVM7Ci0JCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhlZGV2LCBFWFRDT05fVVNCLCB0cnVlKTsKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhlZGV2LCBFWFRDT05fVVNCLCB0cnVlKTsKIAkJCWRldl9pbmZvKHBhbG1hc191c2ItPmRldiwgIlVTQiBjYWJsZSBpcyBhdHRhY2hlZFxuIik7CiAJCX0gZWxzZSB7CiAJCQlkZXZfZGJnKHBhbG1hc191c2ItPmRldiwKQEAgLTcwLDcgKzcwLDcgQEAKIAl9IGVsc2UgaWYgKCEodmJ1c19saW5lX3N0YXRlICYgUEFMTUFTX0lOVDNfTElORV9TVEFURV9WQlVTKSkgewogCQlpZiAocGFsbWFzX3VzYi0+bGlua3N0YXQgPT0gUEFMTUFTX1VTQl9TVEFURV9WQlVTKSB7CiAJCQlwYWxtYXNfdXNiLT5saW5rc3RhdCA9IFBBTE1BU19VU0JfU1RBVEVfRElTQ09OTkVDVDsKLQkJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9VU0IsIGZhbHNlKTsKKwkJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhlZGV2LCBFWFRDT05fVVNCLCBmYWxzZSk7CiAJCQlkZXZfaW5mbyhwYWxtYXNfdXNiLT5kZXYsICJVU0IgY2FibGUgaXMgZGV0YWNoZWRcbiIpOwogCQl9IGVsc2UgewogCQkJZGV2X2RiZyhwYWxtYXNfdXNiLT5kZXYsCkBAIC05OCw3ICs5OCw3IEBACiAJCQlQQUxNQVNfVVNCX0lEX0lOVF9MQVRDSF9DTFIsCiAJCQlQQUxNQVNfVVNCX0lEX0lOVF9FTl9ISV9DTFJfSURfR05EKTsKIAkJcGFsbWFzX3VzYi0+bGlua3N0YXQgPSBQQUxNQVNfVVNCX1NUQVRFX0lEOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhlZGV2LCBFWFRDT05fVVNCX0hPU1QsIHRydWUpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKIAkJZGV2X2luZm8ocGFsbWFzX3VzYi0+ZGV2LCAiVVNCLUhPU1QgY2FibGUgaXMgYXR0YWNoZWRcbiIpOwogCX0gZWxzZSBpZiAoKHNldCAmIFBBTE1BU19VU0JfSURfSU5UX1NSQ19JRF9GTE9BVCkgJiYKIAkJCQkoaWRfc3JjICYgUEFMTUFTX1VTQl9JRF9JTlRfU1JDX0lEX0ZMT0FUKSkgewpAQCAtMTA2LDE3ICsxMDYsMTcgQEAKIAkJCVBBTE1BU19VU0JfSURfSU5UX0xBVENIX0NMUiwKIAkJCVBBTE1BU19VU0JfSURfSU5UX0VOX0hJX0NMUl9JRF9GTE9BVCk7CiAJCXBhbG1hc191c2ItPmxpbmtzdGF0ID0gUEFMTUFTX1VTQl9TVEFURV9ESVNDT05ORUNUOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhlZGV2LCBFWFRDT05fVVNCX0hPU1QsIGZhbHNlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGVkZXYsIEVYVENPTl9VU0JfSE9TVCwgZmFsc2UpOwogCQlkZXZfaW5mbyhwYWxtYXNfdXNiLT5kZXYsICJVU0ItSE9TVCBjYWJsZSBpcyBkZXRhY2hlZFxuIik7CiAJfSBlbHNlIGlmICgocGFsbWFzX3VzYi0+bGlua3N0YXQgPT0gUEFMTUFTX1VTQl9TVEFURV9JRCkgJiYKIAkJCQkoIShzZXQgJiBQQUxNQVNfVVNCX0lEX0lOVF9TUkNfSURfR05EKSkpIHsKIAkJcGFsbWFzX3VzYi0+bGlua3N0YXQgPSBQQUxNQVNfVVNCX1NUQVRFX0RJU0NPTk5FQ1Q7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGVkZXYsIEVYVENPTl9VU0JfSE9TVCwgZmFsc2UpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoZWRldiwgRVhUQ09OX1VTQl9IT1NULCBmYWxzZSk7CiAJCWRldl9pbmZvKHBhbG1hc191c2ItPmRldiwgIlVTQi1IT1NUIGNhYmxlIGlzIGRldGFjaGVkXG4iKTsKIAl9IGVsc2UgaWYgKChwYWxtYXNfdXNiLT5saW5rc3RhdCA9PSBQQUxNQVNfVVNCX1NUQVRFX0RJU0NPTk5FQ1QpICYmCiAJCQkJKGlkX3NyYyAmIFBBTE1BU19VU0JfSURfSU5UX1NSQ19JRF9HTkQpKSB7CiAJCXBhbG1hc191c2ItPmxpbmtzdGF0ID0gUEFMTUFTX1VTQl9TVEFURV9JRDsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGVkZXYsIEVYVENPTl9VU0JfSE9TVCwgdHJ1ZSk7CiAJCWRldl9pbmZvKHBhbG1hc191c2ItPmRldiwgIiBVU0ItSE9TVCBjYWJsZSBpcyBhdHRhY2hlZFxuIik7CiAJfQogCkBAIC0xMzcsMTAgKzEzNywxMCBAQAogCWlkID0gZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKHBhbG1hc191c2ItPmlkX2dwaW9kKTsKIAogCWlmIChpZCkgewotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhlZGV2LCBFWFRDT05fVVNCX0hPU1QsIGZhbHNlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGVkZXYsIEVYVENPTl9VU0JfSE9TVCwgZmFsc2UpOwogCQlkZXZfaW5mbyhwYWxtYXNfdXNiLT5kZXYsICJVU0ItSE9TVCBjYWJsZSBpcyBkZXRhY2hlZFxuIik7CiAJfSBlbHNlIHsKLQkJZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8oZWRldiwgRVhUQ09OX1VTQl9IT1NULCB0cnVlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGVkZXYsIEVYVENPTl9VU0JfSE9TVCwgdHJ1ZSk7CiAJCWRldl9pbmZvKHBhbG1hc191c2ItPmRldiwgIlVTQi1IT1NUIGNhYmxlIGlzIGF0dGFjaGVkXG4iKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tcWNvbS1zcG1pLW1pc2MuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1xY29tLXNwbWktbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOTU3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tcWNvbS1zcG1pLW1pc2MuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoqCisgKiBleHRjb24tcWNvbS1zcG1pLW1pc2MuYyAtIFF1YWxjb21tIFVTQiBleHRjb24gZHJpdmVyIHRvIHN1cHBvcnQgVVNCIElECisgKgkJCQlkZXRlY3Rpb24gYmFzZWQgb24gZXh0Y29uLXVzYi1ncGlvLmMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IExpbmFybywgTHRkLgorICogU3RlcGhlbiBCb3lkIDxzdGVwaGVuLmJveWRAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2V4dGNvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNkZWZpbmUgVVNCX0lEX0RFQk9VTkNFX01TCTUJLyogbXMgKi8KKworc3RydWN0IHFjb21fdXNiX2V4dGNvbl9pbmZvIHsKKwlzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldjsKKwlpbnQgaXJxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgd3FfZGV0Y2FibGU7CisJdW5zaWduZWQgbG9uZyBkZWJvdW5jZV9qaWZmaWVzOworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBxY29tX3VzYl9leHRjb25fY2FibGVbXSA9IHsKKwlFWFRDT05fVVNCX0hPU1QsCisJRVhUQ09OX05PTkUsCit9OworCitzdGF0aWMgdm9pZCBxY29tX3VzYl9leHRjb25fZGV0ZWN0X2NhYmxlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlib29sIGlkOworCWludCByZXQ7CisJc3RydWN0IHFjb21fdXNiX2V4dGNvbl9pbmZvICppbmZvID0gY29udGFpbmVyX29mKHRvX2RlbGF5ZWRfd29yayh3b3JrKSwKKwkJCQkJCSAgICBzdHJ1Y3QgcWNvbV91c2JfZXh0Y29uX2luZm8sCisJCQkJCQkgICAgd3FfZGV0Y2FibGUpOworCisJLyogY2hlY2sgSUQgYW5kIHVwZGF0ZSBjYWJsZSBzdGF0ZSAqLworCXJldCA9IGlycV9nZXRfaXJxY2hpcF9zdGF0ZShpbmZvLT5pcnEsIElSUUNISVBfU1RBVEVfTElORV9MRVZFTCwgJmlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm47CisKKwlleHRjb25fc2V0X3N0YXRlKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgIWlkKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHFjb21fdXNiX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcWNvbV91c2JfZXh0Y29uX2luZm8gKmluZm8gPSBkZXZfaWQ7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwgJmluZm8tPndxX2RldGNhYmxlLAorCQkJICAgaW5mby0+ZGVib3VuY2VfamlmZmllcyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcWNvbV91c2JfZXh0Y29uX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgcWNvbV91c2JfZXh0Y29uX2luZm8gKmluZm87CisJaW50IHJldDsKKworCWluZm8gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJaW5mby0+ZWRldiA9IGRldm1fZXh0Y29uX2Rldl9hbGxvY2F0ZShkZXYsIHFjb21fdXNiX2V4dGNvbl9jYWJsZSk7CisJaWYgKElTX0VSUihpbmZvLT5lZGV2KSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBleHRjb24gZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gZGV2bV9leHRjb25fZGV2X3JlZ2lzdGVyKGRldiwgaW5mby0+ZWRldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0Y29uIGRldmljZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJaW5mby0+ZGVib3VuY2VfamlmZmllcyA9IG1zZWNzX3RvX2ppZmZpZXMoVVNCX0lEX0RFQk9VTkNFX01TKTsKKwlJTklUX0RFTEFZRURfV09SSygmaW5mby0+d3FfZGV0Y2FibGUsIHFjb21fdXNiX2V4dGNvbl9kZXRlY3RfY2FibGUpOworCisJaW5mby0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInVzYl9pZCIpOworCWlmIChpbmZvLT5pcnEgPCAwKQorCQlyZXR1cm4gaW5mby0+aXJxOworCisJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIGluZm8tPmlycSwgTlVMTCwKKwkJCQkJcWNvbV91c2JfaXJxX2hhbmRsZXIsCisJCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfAorCQkJCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfT05FU0hPVCwKKwkJCQkJcGRldi0+bmFtZSwgaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBoYW5kbGVyIGZvciBJRCBJUlFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZm8pOworCWRldmljZV9pbml0X3dha2V1cChkZXYsIDEpOworCisJLyogUGVyZm9ybSBpbml0aWFsIGRldGVjdGlvbiAqLworCXFjb21fdXNiX2V4dGNvbl9kZXRlY3RfY2FibGUoJmluZm8tPndxX2RldGNhYmxlLndvcmspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWNvbV91c2JfZXh0Y29uX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBxY29tX3VzYl9leHRjb25faW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZpbmZvLT53cV9kZXRjYWJsZSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBxY29tX3VzYl9leHRjb25fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHFjb21fdXNiX2V4dGNvbl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJcmV0ID0gZW5hYmxlX2lycV93YWtlKGluZm8tPmlycSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFjb21fdXNiX2V4dGNvbl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBxY29tX3VzYl9leHRjb25faW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSAwOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCXJldCA9IGRpc2FibGVfaXJxX3dha2UoaW5mby0+aXJxKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHFjb21fdXNiX2V4dGNvbl9wbV9vcHMsCisJCQkgcWNvbV91c2JfZXh0Y29uX3N1c3BlbmQsIHFjb21fdXNiX2V4dGNvbl9yZXN1bWUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBxY29tX3VzYl9leHRjb25fZHRfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20scG04OTQxLW1pc2MiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHFjb21fdXNiX2V4dGNvbl9kdF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHFjb21fdXNiX2V4dGNvbl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHFjb21fdXNiX2V4dGNvbl9wcm9iZSwKKwkucmVtb3ZlCQk9IHFjb21fdXNiX2V4dGNvbl9yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImV4dGNvbi1wbTg5NDEtbWlzYyIsCisJCS5wbQk9ICZxY29tX3VzYl9leHRjb25fcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBxY29tX3VzYl9leHRjb25fZHRfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHFjb21fdXNiX2V4dGNvbl9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlFDT00gVVNCIElEIGV4dGNvbiBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlN0ZXBoZW4gQm95ZCA8c3RlcGhlbi5ib3lkQGxpbmFyby5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tcnQ4OTczYS5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLXJ0ODk3M2EuYwppbmRleCA5N2UwNzRkLi4xNzRjMzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tcnQ4OTczYS5jCisrKyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1ydDg5NzNhLmMKQEAgLTM5OCw5ICszOTgsOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBleHRlcm5hbCBhY2Nlc3NvcnkgKi8KLQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBpZCwgYXR0YWNoZWQpOworCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBpZCwgYXR0YWNoZWQpOwogCWlmIChpZCA9PSBFWFRDT05fVVNCKQotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLXNtNTUwMi5jIGIvZHJpdmVycy9leHRjb24vZXh0Y29uLXNtNTUwMi5jCmluZGV4IGRmNzY5YTEuLmIyMjMyNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1zbTU1MDIuYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tc201NTAyLmMKQEAgLTQxMSw5ICs0MTEsOSBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBleHRlcm5hbCBhY2Nlc3NvcnkgKi8KLQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBpZCwgYXR0YWNoZWQpOworCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBpZCwgYXR0YWNoZWQpOwogCWlmIChpZCA9PSBFWFRDT05fVVNCKQotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fQ0hHX1VTQl9TRFAsCiAJCQkJCWF0dGFjaGVkKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLXVzYi1ncGlvLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tdXNiLWdwaW8uYwppbmRleCAyNTEyNjYwLi5hMjdkMzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24tdXNiLWdwaW8uYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tdXNiLWdwaW8uYwpAQCAtNjMsMTYgKzYzLDE2IEBACiAJCSAqIEFzIHdlIGRvbid0IGhhdmUgZXZlbnQgZm9yIFVTQiBwZXJpcGhlcmFsIGNhYmxlIGF0dGFjaGVkLAogCQkgKiB3ZSBzaW11bGF0ZSBVU0IgcGVyaXBoZXJhbCBhdHRhY2ggaGVyZS4KIAkJICovCi0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgZmFsc2UpOwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCB0cnVlKTsKKwkJZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgZmFsc2UpOworCQlleHRjb25fc2V0X3N0YXRlX3N5bmMoaW5mby0+ZWRldiwgRVhUQ09OX1VTQiwgdHJ1ZSk7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogSUQgPSAwIG1lYW5zIFVTQiBIT1NUIGNhYmxlIGF0dGFjaGVkLgogCQkgKiBBcyB3ZSBkb24ndCBoYXZlIGV2ZW50IGZvciBVU0IgcGVyaXBoZXJhbCBjYWJsZSBkZXRhY2hlZCwKIAkJICogd2Ugc2ltdWxhdGUgVVNCIHBlcmlwaGVyYWwgZGV0YWNoIGhlcmUuCiAJCSAqLwotCQlleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBmYWxzZSk7Ci0JCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGluZm8tPmVkZXYsIEVYVENPTl9VU0JfSE9TVCwgdHJ1ZSk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCLCBmYWxzZSk7CisJCWV4dGNvbl9zZXRfc3RhdGVfc3luYyhpbmZvLT5lZGV2LCBFWFRDT05fVVNCX0hPU1QsIHRydWUpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLmMgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24uYwppbmRleCA4NjgyZWZjLi43ODI5ODQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2V4dGNvbi9leHRjb24uYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24uYwpAQCAtMzgsNDMgKzM4LDE1OSBAQAogI2RlZmluZSBTVVBQT1JURURfQ0FCTEVfTUFYCTMyCiAjZGVmaW5lIENBQkxFX05BTUVfTUFYCQkzMAogCi1zdGF0aWMgY29uc3QgY2hhciAqZXh0Y29uX25hbWVbXSA9ICB7Ci0JW0VYVENPTl9OT05FXQkJCT0gIk5PTkUiLAorc3RydWN0IF9fZXh0Y29uX2luZm8geworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBpZDsKKwljb25zdCBjaGFyICpuYW1lOworCit9IGV4dGNvbl9pbmZvW10gPSB7CisJW0VYVENPTl9OT05FXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9NSVNDLAorCQkuaWQgPSBFWFRDT05fTk9ORSwKKwkJLm5hbWUgPSAiTk9ORSIsCisJfSwKIAogCS8qIFVTQiBleHRlcm5hbCBjb25uZWN0b3IgKi8KLQlbRVhUQ09OX1VTQl0JCQk9ICJVU0IiLAotCVtFWFRDT05fVVNCX0hPU1RdCQk9ICJVU0ItSE9TVCIsCisJW0VYVENPTl9VU0JdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX1VTQiwKKwkJLmlkID0gRVhUQ09OX1VTQiwKKwkJLm5hbWUgPSAiVVNCIiwKKwl9LAorCVtFWFRDT05fVVNCX0hPU1RdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX1VTQiwKKwkJLmlkID0gRVhUQ09OX1VTQl9IT1NULAorCQkubmFtZSA9ICJVU0JfSE9TVCIsCisJfSwKIAogCS8qIENoYXJnaW5nIGV4dGVybmFsIGNvbm5lY3RvciAqLwotCVtFWFRDT05fQ0hHX1VTQl9TRFBdCQk9ICJTRFAiLAotCVtFWFRDT05fQ0hHX1VTQl9EQ1BdCQk9ICJEQ1AiLAotCVtFWFRDT05fQ0hHX1VTQl9DRFBdCQk9ICJDRFAiLAotCVtFWFRDT05fQ0hHX1VTQl9BQ0FdCQk9ICJBQ0EiLAotCVtFWFRDT05fQ0hHX1VTQl9GQVNUXQkJPSAiRkFTVC1DSEFSR0VSIiwKLQlbRVhUQ09OX0NIR19VU0JfU0xPV10JCT0gIlNMT1ctQ0hBUkdFUiIsCisJW0VYVENPTl9DSEdfVVNCX1NEUF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfQ0hHIHwgRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fQ0hHX1VTQl9TRFAsCisJCS5uYW1lID0gIlNEUCIsCisJfSwKKwlbRVhUQ09OX0NIR19VU0JfRENQXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9DSEcgfCBFWFRDT05fVFlQRV9VU0IsCisJCS5pZCA9IEVYVENPTl9DSEdfVVNCX0RDUCwKKwkJLm5hbWUgPSAiRENQIiwKKwl9LAorCVtFWFRDT05fQ0hHX1VTQl9DRFBdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0NIRyB8IEVYVENPTl9UWVBFX1VTQiwKKwkJLmlkID0gRVhUQ09OX0NIR19VU0JfQ0RQLAorCQkubmFtZSA9ICJDRFAiLAorCX0sCisJW0VYVENPTl9DSEdfVVNCX0FDQV0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfQ0hHIHwgRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fQ0hHX1VTQl9BQ0EsCisJCS5uYW1lID0gIkFDQSIsCisJfSwKKwlbRVhUQ09OX0NIR19VU0JfRkFTVF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfQ0hHIHwgRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fQ0hHX1VTQl9GQVNULAorCQkubmFtZSA9ICJGQVNULUNIQVJHRVIiLAorCX0sCisJW0VYVENPTl9DSEdfVVNCX1NMT1ddID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0NIRyB8IEVYVENPTl9UWVBFX1VTQiwKKwkJLmlkID0gRVhUQ09OX0NIR19VU0JfU0xPVywKKwkJLm5hbWUgPSAiU0xPVy1DSEFSR0VSIiwKKwl9LAorCVtFWFRDT05fQ0hHX1dQVF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfQ0hHLAorCQkuaWQgPSBFWFRDT05fQ0hHX1dQVCwKKwkJLm5hbWUgPSAiV1BUIiwKKwl9LAogCiAJLyogSmFjayBleHRlcm5hbCBjb25uZWN0b3IgKi8KLQlbRVhUQ09OX0pBQ0tfTUlDUk9QSE9ORV0JPSAiTUlDUk9QSE9ORSIsCi0JW0VYVENPTl9KQUNLX0hFQURQSE9ORV0JCT0gIkhFQURQSE9ORSIsCi0JW0VYVENPTl9KQUNLX0xJTkVfSU5dCQk9ICJMSU5FLUlOIiwKLQlbRVhUQ09OX0pBQ0tfTElORV9PVVRdCQk9ICJMSU5FLU9VVCIsCi0JW0VYVENPTl9KQUNLX1ZJREVPX0lOXQkJPSAiVklERU8tSU4iLAotCVtFWFRDT05fSkFDS19WSURFT19PVVRdCQk9ICJWSURFTy1PVVQiLAotCVtFWFRDT05fSkFDS19TUERJRl9JTl0JCT0gIlNQRElGLUlOIiwKLQlbRVhUQ09OX0pBQ0tfU1BESUZfT1VUXQkJPSAiU1BESUYtT1VUIiwKKwlbRVhUQ09OX0pBQ0tfTUlDUk9QSE9ORV0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfSkFDSywKKwkJLmlkID0gRVhUQ09OX0pBQ0tfTUlDUk9QSE9ORSwKKwkJLm5hbWUgPSAiTUlDUk9QSE9ORSIsCisJfSwKKwlbRVhUQ09OX0pBQ0tfSEVBRFBIT05FXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9KQUNLLAorCQkuaWQgPSBFWFRDT05fSkFDS19IRUFEUEhPTkUsCisJCS5uYW1lID0gIkhFQURQSE9ORSIsCisJfSwKKwlbRVhUQ09OX0pBQ0tfTElORV9JTl0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfSkFDSywKKwkJLmlkID0gRVhUQ09OX0pBQ0tfTElORV9JTiwKKwkJLm5hbWUgPSAiTElORS1JTiIsCisJfSwKKwlbRVhUQ09OX0pBQ0tfTElORV9PVVRdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0pBQ0ssCisJCS5pZCA9IEVYVENPTl9KQUNLX0xJTkVfT1VULAorCQkubmFtZSA9ICJMSU5FLU9VVCIsCisJfSwKKwlbRVhUQ09OX0pBQ0tfVklERU9fSU5dID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0pBQ0ssCisJCS5pZCA9IEVYVENPTl9KQUNLX1ZJREVPX0lOLAorCQkubmFtZSA9ICJWSURFTy1JTiIsCisJfSwKKwlbRVhUQ09OX0pBQ0tfVklERU9fT1VUXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9KQUNLLAorCQkuaWQgPSBFWFRDT05fSkFDS19WSURFT19PVVQsCisJCS5uYW1lID0gIlZJREVPLU9VVCIsCisJfSwKKwlbRVhUQ09OX0pBQ0tfU1BESUZfSU5dID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0pBQ0ssCisJCS5pZCA9IEVYVENPTl9KQUNLX1NQRElGX0lOLAorCQkubmFtZSA9ICJTUERJRi1JTiIsCisJfSwKKwlbRVhUQ09OX0pBQ0tfU1BESUZfT1VUXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9KQUNLLAorCQkuaWQgPSBFWFRDT05fSkFDS19TUERJRl9PVVQsCisJCS5uYW1lID0gIlNQRElGLU9VVCIsCisJfSwKIAogCS8qIERpc3BsYXkgZXh0ZXJuYWwgY29ubmVjdG9yICovCi0JW0VYVENPTl9ESVNQX0hETUldCQk9ICJIRE1JIiwKLQlbRVhUQ09OX0RJU1BfTUhMXQkJPSAiTUhMIiwKLQlbRVhUQ09OX0RJU1BfRFZJXQkJPSAiRFZJIiwKLQlbRVhUQ09OX0RJU1BfVkdBXQkJPSAiVkdBIiwKKwlbRVhUQ09OX0RJU1BfSERNSV0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfRElTUCwKKwkJLmlkID0gRVhUQ09OX0RJU1BfSERNSSwKKwkJLm5hbWUgPSAiSERNSSIsCisJfSwKKwlbRVhUQ09OX0RJU1BfTUhMXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9ESVNQLAorCQkuaWQgPSBFWFRDT05fRElTUF9NSEwsCisJCS5uYW1lID0gIk1ITCIsCisJfSwKKwlbRVhUQ09OX0RJU1BfRFZJXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9ESVNQLAorCQkuaWQgPSBFWFRDT05fRElTUF9EVkksCisJCS5uYW1lID0gIkRWSSIsCisJfSwKKwlbRVhUQ09OX0RJU1BfVkdBXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9ESVNQLAorCQkuaWQgPSBFWFRDT05fRElTUF9WR0EsCisJCS5uYW1lID0gIlZHQSIsCisJfSwKKwlbRVhUQ09OX0RJU1BfRFBdID0geworCQkudHlwZSA9IEVYVENPTl9UWVBFX0RJU1AgfCBFWFRDT05fVFlQRV9VU0IsCisJCS5pZCA9IEVYVENPTl9ESVNQX0RQLAorCQkubmFtZSA9ICJEUCIsCisJfSwKKwlbRVhUQ09OX0RJU1BfSE1EXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9ESVNQIHwgRVhUQ09OX1RZUEVfVVNCLAorCQkuaWQgPSBFWFRDT05fRElTUF9ITUQsCisJCS5uYW1lID0gIkhNRCIsCisJfSwKIAogCS8qIE1pc2NlbGxhbmVvdXMgZXh0ZXJuYWwgY29ubmVjdG9yICovCi0JW0VYVENPTl9ET0NLXQkJCT0gIkRPQ0siLAotCVtFWFRDT05fSklHXQkJCT0gIkpJRyIsCi0JW0VYVENPTl9NRUNIQU5JQ0FMXQkJPSAiTUVDSEFOSUNBTCIsCisJW0VYVENPTl9ET0NLXSA9IHsKKwkJLnR5cGUgPSBFWFRDT05fVFlQRV9NSVNDLAorCQkuaWQgPSBFWFRDT05fRE9DSywKKwkJLm5hbWUgPSAiRE9DSyIsCisJfSwKKwlbRVhUQ09OX0pJR10gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfTUlTQywKKwkJLmlkID0gRVhUQ09OX0pJRywKKwkJLm5hbWUgPSAiSklHIiwKKwl9LAorCVtFWFRDT05fTUVDSEFOSUNBTF0gPSB7CisJCS50eXBlID0gRVhUQ09OX1RZUEVfTUlTQywKKwkJLmlkID0gRVhUQ09OX01FQ0hBTklDQUwsCisJCS5uYW1lID0gIk1FQ0hBTklDQUwiLAorCX0sCiAKLQlOVUxMLAorCXsgLyogc2VudGluZWwgKi8gfQogfTsKIAogLyoqCkBAIC05NSw2ICsyMTEsMTYgQEAKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBhdHRyX3N0YXRlOwogCiAJc3RydWN0IGF0dHJpYnV0ZSAqYXR0cnNbM107IC8qIHRvIGJlIGZlZCB0byBhdHRyX2cuYXR0cnMgKi8KKworCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSB1c2JfcHJvcHZhbFtFWFRDT05fUFJPUF9VU0JfQ05UXTsKKwl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgY2hnX3Byb3B2YWxbRVhUQ09OX1BST1BfQ0hHX0NOVF07CisJdW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIGphY2tfcHJvcHZhbFtFWFRDT05fUFJPUF9KQUNLX0NOVF07CisJdW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIGRpc3BfcHJvcHZhbFtFWFRDT05fUFJPUF9ESVNQX0NOVF07CisKKwl1bnNpZ25lZCBsb25nIHVzYl9iaXRzW0JJVFNfVE9fTE9OR1MoRVhUQ09OX1BST1BfVVNCX0NOVCldOworCXVuc2lnbmVkIGxvbmcgY2hnX2JpdHNbQklUU19UT19MT05HUyhFWFRDT05fUFJPUF9DSEdfQ05UKV07CisJdW5zaWduZWQgbG9uZyBqYWNrX2JpdHNbQklUU19UT19MT05HUyhFWFRDT05fUFJPUF9KQUNLX0NOVCldOworCXVuc2lnbmVkIGxvbmcgZGlzcF9iaXRzW0JJVFNfVE9fTE9OR1MoRVhUQ09OX1BST1BfRElTUF9DTlQpXTsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKmV4dGNvbl9jbGFzczsKQEAgLTE0NywxNCArMjczLDkzIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBib29sIGlzX2V4dGNvbl9jaGFuZ2VkKHUzMiBwcmV2LCB1MzIgbmV3LCBpbnQgaWR4LCBib29sICphdHRhY2hlZCkKK3N0YXRpYyBpbnQgZ2V0X2V4dGNvbl90eXBlKHVuc2lnbmVkIGludCBwcm9wKQogewotCWlmICgoKHByZXYgPj4gaWR4KSAmIDB4MSkgIT0gKChuZXcgPj4gaWR4KSAmIDB4MSkpIHsKLQkJKmF0dGFjaGVkID0gKChuZXcgPj4gaWR4KSAmIDB4MSkgPyB0cnVlIDogZmFsc2U7Ci0JCXJldHVybiB0cnVlOworCXN3aXRjaCAocHJvcCkgeworCWNhc2UgRVhUQ09OX1BST1BfVVNCX01JTiAuLi4gRVhUQ09OX1BST1BfVVNCX01BWDoKKwkJcmV0dXJuIEVYVENPTl9UWVBFX1VTQjsKKwljYXNlIEVYVENPTl9QUk9QX0NIR19NSU4gLi4uIEVYVENPTl9QUk9QX0NIR19NQVg6CisJCXJldHVybiBFWFRDT05fVFlQRV9DSEc7CisJY2FzZSBFWFRDT05fUFJPUF9KQUNLX01JTiAuLi4gRVhUQ09OX1BST1BfSkFDS19NQVg6CisJCXJldHVybiBFWFRDT05fVFlQRV9KQUNLOworCWNhc2UgRVhUQ09OX1BST1BfRElTUF9NSU4gLi4uIEVYVENPTl9QUk9QX0RJU1BfTUFYOgorCQlyZXR1cm4gRVhUQ09OX1RZUEVfRElTUDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBib29sIGlzX2V4dGNvbl9hdHRhY2hlZChzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGluZGV4KQoreworCXJldHVybiAhIShlZGV2LT5zdGF0ZSAmIEJJVChpbmRleCkpOworfQorCitzdGF0aWMgYm9vbCBpc19leHRjb25fY2hhbmdlZChzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgaW50IGluZGV4LAorCQkJCWJvb2wgbmV3X3N0YXRlKQoreworCWludCBzdGF0ZSA9ICEhKGVkZXYtPnN0YXRlICYgQklUKGluZGV4KSk7CisJcmV0dXJuIChzdGF0ZSAhPSBuZXdfc3RhdGUpOworfQorCitzdGF0aWMgYm9vbCBpc19leHRjb25fcHJvcGVydHlfc3VwcG9ydGVkKHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHByb3ApCit7CisJaW50IHR5cGU7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgb3Igbm90LiAqLworCXR5cGUgPSBnZXRfZXh0Y29uX3R5cGUocHJvcCk7CisJaWYgKHR5cGUgPCAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBDaGVjayB3aGV0aGVyIGEgc3BlY2lmaWMgZXh0Y29uIGlkIHN1cHBvcnRzIHRoZSBwcm9wZXJ0eSBvciBub3QuICovCisJcmV0dXJuICEhKGV4dGNvbl9pbmZvW2lkXS50eXBlICYgdHlwZSk7Cit9CisKK3N0YXRpYyBpbnQgaXNfZXh0Y29uX3Byb3BlcnR5X2NhcGFiaWxpdHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsCisJCQkJdW5zaWduZWQgaW50IGlkLCBpbnQgaW5kZXgsdW5zaWduZWQgaW50IHByb3ApCit7CisJc3RydWN0IGV4dGNvbl9jYWJsZSAqY2FibGU7CisJaW50IHR5cGUsIHJldDsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBvciBub3QuICovCisJdHlwZSA9IGdldF9leHRjb25fdHlwZShwcm9wKTsKKwlpZiAodHlwZSA8IDApCisJCXJldHVybiB0eXBlOworCisJY2FibGUgPSAmZWRldi0+Y2FibGVzW2luZGV4XTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgRVhUQ09OX1RZUEVfVVNCOgorCQlyZXQgPSB0ZXN0X2JpdChwcm9wIC0gRVhUQ09OX1BST1BfVVNCX01JTiwgY2FibGUtPnVzYl9iaXRzKTsKKwkJYnJlYWs7CisJY2FzZSBFWFRDT05fVFlQRV9DSEc6CisJCXJldCA9IHRlc3RfYml0KHByb3AgLSBFWFRDT05fUFJPUF9DSEdfTUlOLCBjYWJsZS0+Y2hnX2JpdHMpOworCQlicmVhazsKKwljYXNlIEVYVENPTl9UWVBFX0pBQ0s6CisJCXJldCA9IHRlc3RfYml0KHByb3AgLSBFWFRDT05fUFJPUF9KQUNLX01JTiwgY2FibGUtPmphY2tfYml0cyk7CisJCWJyZWFrOworCWNhc2UgRVhUQ09OX1RZUEVfRElTUDoKKwkJcmV0ID0gdGVzdF9iaXQocHJvcCAtIEVYVENPTl9QUk9QX0RJU1BfTUlOLCBjYWJsZS0+ZGlzcF9iaXRzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9wcm9wZXJ0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IHR5cGUgPSBleHRjb25faW5mb1tpZF0udHlwZTsKKwlzdHJ1Y3QgZXh0Y29uX2NhYmxlICpjYWJsZSA9ICZlZGV2LT5jYWJsZXNbaW5kZXhdOworCisJaWYgKEVYVENPTl9UWVBFX1VTQiAmIHR5cGUpCisJCW1lbXNldChjYWJsZS0+dXNiX3Byb3B2YWwsIDAsIHNpemVvZihjYWJsZS0+dXNiX3Byb3B2YWwpKTsKKwlpZiAoRVhUQ09OX1RZUEVfQ0hHICYgdHlwZSkKKwkJbWVtc2V0KGNhYmxlLT5jaGdfcHJvcHZhbCwgMCwgc2l6ZW9mKGNhYmxlLT5jaGdfcHJvcHZhbCkpOworCWlmIChFWFRDT05fVFlQRV9KQUNLICYgdHlwZSkKKwkJbWVtc2V0KGNhYmxlLT5qYWNrX3Byb3B2YWwsIDAsIHNpemVvZihjYWJsZS0+amFja19wcm9wdmFsKSk7CisJaWYgKEVYVENPTl9UWVBFX0RJU1AgJiB0eXBlKQorCQltZW1zZXQoY2FibGUtPmRpc3BfcHJvcHZhbCwgMCwgc2l6ZW9mKGNhYmxlLT5kaXNwX3Byb3B2YWwpKTsKIH0KIAogc3RhdGljIHNzaXplX3Qgc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtMTY4LDMyICszNzMsMTMgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBlZGV2LT5tYXhfc3VwcG9ydGVkOyBpKyspIHsKIAkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIiVzPSVkXG4iLAotCQkJCWV4dGNvbl9uYW1lW2VkZXYtPnN1cHBvcnRlZF9jYWJsZVtpXV0sCisJCQkJZXh0Y29uX2luZm9bZWRldi0+c3VwcG9ydGVkX2NhYmxlW2ldXS5uYW1lLAogCQkJCSAhIShlZGV2LT5zdGF0ZSAmICgxIDw8IGkpKSk7CiAJfQogCiAJcmV0dXJuIGNvdW50OwogfQotCi1zdGF0aWMgc3NpemVfdCBzdGF0ZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdTMyIHN0YXRlOwotCXNzaXplX3QgcmV0ID0gMDsKLQlzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0ID0gc3NjYW5mKGJ1ZiwgIjB4JXgiLCAmc3RhdGUpOwotCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gLUVJTlZBTDsKLQllbHNlCi0JCXJldCA9IGV4dGNvbl9zZXRfc3RhdGUoZWRldiwgc3RhdGUpOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFJfUlcoc3RhdGUpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHN0YXRlKTsKIAogc3RhdGljIHNzaXplX3QgbmFtZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCWNoYXIgKmJ1ZikKQEAgLTIxMiw3ICszOTgsNyBAQAogCWludCBpID0gY2FibGUtPmNhYmxlX2luZGV4OwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsCi0JCQlleHRjb25fbmFtZVtjYWJsZS0+ZWRldi0+c3VwcG9ydGVkX2NhYmxlW2ldXSk7CisJCQlleHRjb25faW5mb1tjYWJsZS0+ZWRldi0+c3VwcG9ydGVkX2NhYmxlW2ldXS5uYW1lKTsKIH0KIAogc3RhdGljIHNzaXplX3QgY2FibGVfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0yMjQsMjYgKzQxMCwxNyBAQAogCWludCBpID0gY2FibGUtPmNhYmxlX2luZGV4OwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCSAgICAgICBleHRjb25fZ2V0X2NhYmxlX3N0YXRlXyhjYWJsZS0+ZWRldiwKLQkJCQkJICAgICAgIGNhYmxlLT5lZGV2LT5zdXBwb3J0ZWRfY2FibGVbaV0pKTsKKwkJZXh0Y29uX2dldF9zdGF0ZShjYWJsZS0+ZWRldiwgY2FibGUtPmVkZXYtPnN1cHBvcnRlZF9jYWJsZVtpXSkpOwogfQogCiAvKioKLSAqIGV4dGNvbl91cGRhdGVfc3RhdGUoKSAtIFVwZGF0ZSB0aGUgY2FibGUgYXR0YWNoIHN0YXRlcyBvZiB0aGUgZXh0Y29uIGRldmljZQotICoJCQkgICBvbmx5IGZvciB0aGUgbWFza2VkIGJpdHMuCi0gKiBAZWRldjoJdGhlIGV4dGNvbiBkZXZpY2UKLSAqIEBtYXNrOgl0aGUgYml0IG1hc2sgdG8gZGVzaWduYXRlIHVwZGF0ZWQgYml0cy4KLSAqIEBzdGF0ZToJbmV3IGNhYmxlIGF0dGFjaCBzdGF0dXMgZm9yIEBlZGV2CisgKiBleHRjb25fc3luYygpCS0gU3luY2hyb25pemUgdGhlIHN0YXRlcyBmb3IgYm90aCB0aGUgYXR0YWNoZWQvZGV0YWNoZWQKKyAqIEBlZGV2OgkJdGhlIGV4dGNvbiBkZXZpY2UgdGhhdCBoYXMgdGhlIGNhYmxlLgogICoKLSAqIENoYW5naW5nIHRoZSBzdGF0ZSBzZW5kcyB1ZXZlbnQgd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjb250YWluaW5nCi0gKiB0aGUgbmFtZSBvZiBleHRjb24gZGV2aWNlIChlbnZwWzBdKSBhbmQgdGhlIHN0YXRlIG91dHB1dCAoZW52cFsxXSkuCi0gKiBUaXplbiB1c2VzIHRoaXMgZm9ybWF0IGZvciBleHRjb24gZGV2aWNlIHRvIGdldCBldmVudHMgZnJvbSBwb3J0cy4KLSAqIEFuZHJvaWQgdXNlcyB0aGlzIGZvcm1hdCBhcyB3ZWxsLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgbm90aWZpZXIgcHJvdmlkZXMgd2hpY2ggYml0cyBhcmUgY2hhbmdlZCBpbiB0aGUgc3RhdGUKLSAqIHZhcmlhYmxlIHdpdGggdGhlIHZhbCBwYXJhbWV0ZXIgKHNlY29uZCkgdG8gdGhlIGNhbGxiYWNrLgorICogVGhpcyBmdW5jdGlvbiBzZW5kIGEgbm90aWZpY2F0aW9uIHRvIHN5bmNocm9uaXplIHRoZSBhbGwgc3RhdGVzIG9mIGEKKyAqIHNwZWNpZmljIGV4dGVybmFsIGNvbm5lY3RvcgogICovCi1pbnQgZXh0Y29uX3VwZGF0ZV9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdTMyIG1hc2ssIHUzMiBzdGF0ZSkKK2ludCBleHRjb25fc3luYyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkKQogewogCWNoYXIgbmFtZV9idWZbMTIwXTsKIAljaGFyIHN0YXRlX2J1ZlsxMjBdOwpAQCAtMjUyLDEwMCArNDI5LDggQEAKIAlpbnQgZW52X29mZnNldCA9IDA7CiAJaW50IGxlbmd0aDsKIAlpbnQgaW5kZXg7CisJaW50IHN0YXRlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYm9vbCBhdHRhY2hlZDsKLQotCWlmICghZWRldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWRldi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGVkZXYtPnN0YXRlICE9ICgoZWRldi0+c3RhdGUgJiB+bWFzaykgfCAoc3RhdGUgJiBtYXNrKSkpIHsKLQkJdTMyIG9sZF9zdGF0ZTsKLQotCQlpZiAoY2hlY2tfbXV0dWFsbHlfZXhjbHVzaXZlKGVkZXYsIChlZGV2LT5zdGF0ZSAmIH5tYXNrKSB8Ci0JCQkJCQkgICAoc3RhdGUgJiBtYXNrKSkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAtRVBFUk07Ci0JCX0KLQotCQlvbGRfc3RhdGUgPSBlZGV2LT5zdGF0ZTsKLQkJZWRldi0+c3RhdGUgJj0gfm1hc2s7Ci0JCWVkZXYtPnN0YXRlIHw9IHN0YXRlICYgbWFzazsKLQotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBlZGV2LT5tYXhfc3VwcG9ydGVkOyBpbmRleCsrKSB7Ci0JCQlpZiAoaXNfZXh0Y29uX2NoYW5nZWQob2xkX3N0YXRlLCBlZGV2LT5zdGF0ZSwgaW5kZXgsCi0JCQkJCSAgICAgICZhdHRhY2hlZCkpCi0JCQkJcmF3X25vdGlmaWVyX2NhbGxfY2hhaW4oJmVkZXYtPm5oW2luZGV4XSwKLQkJCQkJCQlhdHRhY2hlZCwgZWRldik7Ci0JCX0KLQotCQkvKiBUaGlzIGNvdWxkIGJlIGluIGludGVycnVwdCBoYW5kbGVyICovCi0JCXByb3BfYnVmID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7Ci0JCWlmIChwcm9wX2J1ZikgewotCQkJbGVuZ3RoID0gbmFtZV9zaG93KCZlZGV2LT5kZXYsIE5VTEwsIHByb3BfYnVmKTsKLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJaWYgKHByb3BfYnVmW2xlbmd0aCAtIDFdID09ICdcbicpCi0JCQkJCXByb3BfYnVmW2xlbmd0aCAtIDFdID0gMDsKLQkJCQlzbnByaW50ZihuYW1lX2J1Ziwgc2l6ZW9mKG5hbWVfYnVmKSwKLQkJCQkJIk5BTUU9JXMiLCBwcm9wX2J1Zik7Ci0JCQkJZW52cFtlbnZfb2Zmc2V0KytdID0gbmFtZV9idWY7Ci0JCQl9Ci0JCQlsZW5ndGggPSBzdGF0ZV9zaG93KCZlZGV2LT5kZXYsIE5VTEwsIHByb3BfYnVmKTsKLQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJaWYgKHByb3BfYnVmW2xlbmd0aCAtIDFdID09ICdcbicpCi0JCQkJCXByb3BfYnVmW2xlbmd0aCAtIDFdID0gMDsKLQkJCQlzbnByaW50ZihzdGF0ZV9idWYsIHNpemVvZihzdGF0ZV9idWYpLAotCQkJCQkiU1RBVEU9JXMiLCBwcm9wX2J1Zik7Ci0JCQkJZW52cFtlbnZfb2Zmc2V0KytdID0gc3RhdGVfYnVmOwotCQkJfQotCQkJZW52cFtlbnZfb2Zmc2V0XSA9IE5VTEw7Ci0JCQkvKiBVbmxvY2sgZWFybHkgYmVmb3JlIHVldmVudCAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOwotCi0JCQlrb2JqZWN0X3VldmVudF9lbnYoJmVkZXYtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSwgZW52cCk7Ci0JCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcHJvcF9idWYpOwotCQl9IGVsc2UgewotCQkJLyogVW5sb2NrIGVhcmx5IGJlZm9yZSB1ZXZlbnQgKi8KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKLQotCQkJZGV2X2VycigmZWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeSBpbiBleHRjb25fc2V0X3N0YXRlXG4iKTsKLQkJCWtvYmplY3RfdWV2ZW50KCZlZGV2LT5kZXYua29iaiwgS09CSl9DSEFOR0UpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogTm8gY2hhbmdlcyAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGV2LT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChleHRjb25fdXBkYXRlX3N0YXRlKTsKLQotLyoqCi0gKiBleHRjb25fc2V0X3N0YXRlKCkgLSBTZXQgdGhlIGNhYmxlIGF0dGFjaCBzdGF0ZXMgb2YgdGhlIGV4dGNvbiBkZXZpY2UuCi0gKiBAZWRldjoJdGhlIGV4dGNvbiBkZXZpY2UKLSAqIEBzdGF0ZToJbmV3IGNhYmxlIGF0dGFjaCBzdGF0dXMgZm9yIEBlZGV2Ci0gKgotICogTm90ZSB0aGF0IG5vdGlmaWVyIHByb3ZpZGVzIHdoaWNoIGJpdHMgYXJlIGNoYW5nZWQgaW4gdGhlIHN0YXRlCi0gKiB2YXJpYWJsZSB3aXRoIHRoZSB2YWwgcGFyYW1ldGVyIChzZWNvbmQpIHRvIHRoZSBjYWxsYmFjay4KLSAqLwotaW50IGV4dGNvbl9zZXRfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHUzMiBzdGF0ZSkKLXsKLQlpZiAoIWVkZXYpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIGV4dGNvbl91cGRhdGVfc3RhdGUoZWRldiwgMHhmZmZmZmZmZiwgc3RhdGUpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZXh0Y29uX3NldF9zdGF0ZSk7Ci0KLS8qKgotICogZXh0Y29uX2dldF9jYWJsZV9zdGF0ZV8oKSAtIEdldCB0aGUgc3RhdHVzIG9mIGEgc3BlY2lmaWMgY2FibGUuCi0gKiBAZWRldjoJdGhlIGV4dGNvbiBkZXZpY2UgdGhhdCBoYXMgdGhlIGNhYmxlLgotICogQGlkOgkJdGhlIHVuaXF1ZSBpZCBvZiBlYWNoIGV4dGVybmFsIGNvbm5lY3RvciBpbiBleHRjb24gZW51bWVyYXRpb24uCi0gKi8KLWludCBleHRjb25fZ2V0X2NhYmxlX3N0YXRlXyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgY29uc3QgdW5zaWduZWQgaW50IGlkKQotewotCWludCBpbmRleDsKIAogCWlmICghZWRldikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNTQsMjYgKzQzOSw5MiBAQAogCWlmIChpbmRleCA8IDApCiAJCXJldHVybiBpbmRleDsKIAotCWlmIChlZGV2LT5tYXhfc3VwcG9ydGVkICYmIGVkZXYtPm1heF9zdXBwb3J0ZWQgPD0gaW5kZXgpCi0JCXJldHVybiAtRUlOVkFMOworCXNwaW5fbG9ja19pcnFzYXZlKCZlZGV2LT5sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gISEoZWRldi0+c3RhdGUgJiAoMSA8PCBpbmRleCkpOworCXN0YXRlID0gISEoZWRldi0+c3RhdGUgJiBCSVQoaW5kZXgpKTsKKwlyYXdfbm90aWZpZXJfY2FsbF9jaGFpbigmZWRldi0+bmhbaW5kZXhdLCBzdGF0ZSwgZWRldik7CisKKwkvKiBUaGlzIGNvdWxkIGJlIGluIGludGVycnVwdCBoYW5kbGVyICovCisJcHJvcF9idWYgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKKwlpZiAoIXByb3BfYnVmKSB7CisJCS8qIFVubG9jayBlYXJseSBiZWZvcmUgdWV2ZW50ICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKworCQlkZXZfZXJyKCZlZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5IGluIGV4dGNvbl9zZXRfc3RhdGVcbiIpOworCQlrb2JqZWN0X3VldmVudCgmZWRldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlsZW5ndGggPSBuYW1lX3Nob3coJmVkZXYtPmRldiwgTlVMTCwgcHJvcF9idWYpOworCWlmIChsZW5ndGggPiAwKSB7CisJCWlmIChwcm9wX2J1ZltsZW5ndGggLSAxXSA9PSAnXG4nKQorCQkJcHJvcF9idWZbbGVuZ3RoIC0gMV0gPSAwOworCQlzbnByaW50ZihuYW1lX2J1Ziwgc2l6ZW9mKG5hbWVfYnVmKSwgIk5BTUU9JXMiLCBwcm9wX2J1Zik7CisJCWVudnBbZW52X29mZnNldCsrXSA9IG5hbWVfYnVmOworCX0KKworCWxlbmd0aCA9IHN0YXRlX3Nob3coJmVkZXYtPmRldiwgTlVMTCwgcHJvcF9idWYpOworCWlmIChsZW5ndGggPiAwKSB7CisJCWlmIChwcm9wX2J1ZltsZW5ndGggLSAxXSA9PSAnXG4nKQorCQkJcHJvcF9idWZbbGVuZ3RoIC0gMV0gPSAwOworCQlzbnByaW50ZihzdGF0ZV9idWYsIHNpemVvZihzdGF0ZV9idWYpLCAiU1RBVEU9JXMiLCBwcm9wX2J1Zik7CisJCWVudnBbZW52X29mZnNldCsrXSA9IHN0YXRlX2J1ZjsKKwl9CisJZW52cFtlbnZfb2Zmc2V0XSA9IE5VTEw7CisKKwkvKiBVbmxvY2sgZWFybHkgYmVmb3JlIHVldmVudCAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKwlrb2JqZWN0X3VldmVudF9lbnYoJmVkZXYtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSwgZW52cCk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXByb3BfYnVmKTsKKworCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoZXh0Y29uX2dldF9jYWJsZV9zdGF0ZV8pOworRVhQT1JUX1NZTUJPTF9HUEwoZXh0Y29uX3N5bmMpOwogCiAvKioKLSAqIGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKCkgLSBTZXQgdGhlIHN0YXR1cyBvZiBhIHNwZWNpZmljIGNhYmxlLgorICogZXh0Y29uX2dldF9zdGF0ZSgpIC0gR2V0IHRoZSBzdGF0ZSBvZiBhIGV4dGVybmFsIGNvbm5lY3Rvci4KKyAqIEBlZGV2Ogl0aGUgZXh0Y29uIGRldmljZSB0aGF0IGhhcyB0aGUgY2FibGUuCisgKiBAaWQ6CQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yIGluIGV4dGNvbiBlbnVtZXJhdGlvbi4KKyAqLworaW50IGV4dGNvbl9nZXRfc3RhdGUoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIGNvbnN0IHVuc2lnbmVkIGludCBpZCkKK3sKKwlpbnQgaW5kZXgsIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWVkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5kZXggPSBmaW5kX2NhYmxlX2luZGV4X2J5X2lkKGVkZXYsIGlkKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gaW5kZXg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCXN0YXRlID0gaXNfZXh0Y29uX2F0dGFjaGVkKGVkZXYsIGluZGV4KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc3RhdGU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fZ2V0X3N0YXRlKTsKKworLyoqCisgKiBleHRjb25fc2V0X3N0YXRlKCkgLSBTZXQgdGhlIHN0YXRlIG9mIGEgZXh0ZXJuYWwgY29ubmVjdG9yLgorICoJCQl3aXRob3V0IGEgbm90aWZpY2F0aW9uLgogICogQGVkZXY6CQl0aGUgZXh0Y29uIGRldmljZSB0aGF0IGhhcyB0aGUgY2FibGUuCiAgKiBAaWQ6CQkJdGhlIHVuaXF1ZSBpZCBvZiBlYWNoIGV4dGVybmFsIGNvbm5lY3RvcgogICoJCQlpbiBleHRjb24gZW51bWVyYXRpb24uCiAgKiBAc3RhdGU6CQl0aGUgbmV3IGNhYmxlIHN0YXR1cy4gVGhlIGRlZmF1bHQgc2VtYW50aWNzIGlzCiAgKgkJCXRydWU6IGF0dGFjaGVkIC8gZmFsc2U6IGRldGFjaGVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gb25seSBzZXQgdGhlIHN0YXRlIG9mIGEgZXh0ZXJuYWwgY29ubmVjdG9yIHdpdGhvdXQKKyAqIGEgbm90aWZpY2F0aW9uLiBUbyBzeW5jaHJvbml6ZSB0aGUgZGF0YSBvZiBhIGV4dGVybmFsIGNvbm5lY3RvciwKKyAqIHVzZSBleHRjb25fc2V0X3N0YXRlX3N5bmMoKSBhbmQgZXh0Y29uX3N5bmMoKS4KICAqLwotaW50IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCitpbnQgZXh0Y29uX3NldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAogCQkJCWJvb2wgY2FibGVfc3RhdGUpCiB7Ci0JdTMyIHN0YXRlOwotCWludCBpbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpbmRleCwgcmV0ID0gMDsKIAogCWlmICghZWRldikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zODIsMTMgKzUzMywzMzggQEAKIAlpZiAoaW5kZXggPCAwKQogCQlyZXR1cm4gaW5kZXg7CiAKLQlpZiAoZWRldi0+bWF4X3N1cHBvcnRlZCAmJiBlZGV2LT5tYXhfc3VwcG9ydGVkIDw9IGluZGV4KQorCXNwaW5fbG9ja19pcnFzYXZlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayB3aGV0aGVyIHRoZSBleHRlcm5hbCBjb25uZWN0b3IncyBzdGF0ZSBpcyBjaGFuZ2VkLiAqLworCWlmICghaXNfZXh0Y29uX2NoYW5nZWQoZWRldiwgaW5kZXgsIGNhYmxlX3N0YXRlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoY2hlY2tfbXV0dWFsbHlfZXhjbHVzaXZlKGVkZXYsCisJCShlZGV2LT5zdGF0ZSAmIH5CSVQoaW5kZXgpKSB8IChjYWJsZV9zdGF0ZSAmIEJJVChpbmRleCkpKSkgeworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgdmFsdWUgb2YgZXh0Y29uIHByb3BlcnR5IGJlZm9yZSBzZXR0aW5nCisJICogdGhlIGRldGFjaGVkIHN0YXRlIGZvciBhbiBleHRlcm5hbCBjb25uZWN0b3IuCisJICovCisJaWYgKCFjYWJsZV9zdGF0ZSkKKwkJaW5pdF9wcm9wZXJ0eShlZGV2LCBpZCwgaW5kZXgpOworCisJLyogVXBkYXRlIHRoZSBzdGF0ZSBmb3IgYSBleHRlcm5hbCBjb25uZWN0b3IuICovCisJaWYgKGNhYmxlX3N0YXRlKQorCQllZGV2LT5zdGF0ZSB8PSBCSVQoaW5kZXgpOworCWVsc2UKKwkJZWRldi0+c3RhdGUgJj0gfihCSVQoaW5kZXgpKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZXh0Y29uX3NldF9zdGF0ZSk7CisKKy8qKgorICogZXh0Y29uX3NldF9zdGF0ZV9zeW5jKCkgLSBTZXQgdGhlIHN0YXRlIG9mIGEgZXh0ZXJuYWwgY29ubmVjdG9yCisgKgkJCXdpdGggYSBub3RpZmljYXRpb24uCisgKiBAZWRldjoJCXRoZSBleHRjb24gZGV2aWNlIHRoYXQgaGFzIHRoZSBjYWJsZS4KKyAqIEBpZDoJCQl0aGUgdW5pcXVlIGlkIG9mIGVhY2ggZXh0ZXJuYWwgY29ubmVjdG9yCisgKgkJCWluIGV4dGNvbiBlbnVtZXJhdGlvbi4KKyAqIEBzdGF0ZToJCXRoZSBuZXcgY2FibGUgc3RhdHVzLiBUaGUgZGVmYXVsdCBzZW1hbnRpY3MgaXMKKyAqCQkJdHJ1ZTogYXR0YWNoZWQgLyBmYWxzZTogZGV0YWNoZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXQgdGhlIHN0YXRlIG9mIGV4dGVybmFsIGNvbm5lY3RvciBhbmQgc3luY2hyb25pemUgdGhlIGRhdGEKKyAqIGJ5IHVzbmluZyBhIG5vdGlmaWNhdGlvbi4KKyAqLworaW50IGV4dGNvbl9zZXRfc3RhdGVfc3luYyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCWJvb2wgY2FibGVfc3RhdGUpCit7CisJaW50IHJldCwgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWluZGV4ID0gZmluZF9jYWJsZV9pbmRleF9ieV9pZChlZGV2LCBpZCk7CisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIGluZGV4OworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgZXh0ZXJuYWwgY29ubmVjdG9yJ3Mgc3RhdGUgaXMgY2hhbmdlZC4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCXJldCA9IGlzX2V4dGNvbl9jaGFuZ2VkKGVkZXYsIGluZGV4LCBjYWJsZV9zdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCXJldCA9IGV4dGNvbl9zZXRfc3RhdGUoZWRldiwgaWQsIGNhYmxlX3N0YXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBleHRjb25fc3luYyhlZGV2LCBpZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fc2V0X3N0YXRlX3N5bmMpOworCisvKioKKyAqIGV4dGNvbl9nZXRfcHJvcGVydHkoKSAtIEdldCB0aGUgcHJvcGVydHkgdmFsdWUgb2YgYSBzcGVjaWZpYyBjYWJsZS4KKyAqIEBlZGV2OgkJdGhlIGV4dGNvbiBkZXZpY2UgdGhhdCBoYXMgdGhlIGNhYmxlLgorICogQGlkOgkJCXRoZSB1bmlxdWUgaWQgb2YgZWFjaCBleHRlcm5hbCBjb25uZWN0b3IKKyAqCQkJaW4gZXh0Y29uIGVudW1lcmF0aW9uLgorICogQHByb3A6CQl0aGUgcHJvcGVydHkgaWQgYW1vbmcgZW51bSBleHRjb25fcHJvcGVydHkuCisgKiBAcHJvcF92YWw6CQl0aGUgcG9pbnRlciB3aGljaCBzdG9yZSB0aGUgdmFsdWUgb2YgcHJvcGVydHkuCisgKgorICogV2hlbiBnZXR0aW5nIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiBleHRlcm5hbCBjb25uZWN0b3IsIHRoZSBleHRlcm5hbCBjb25uZWN0b3IKKyAqIHNob3VsZCBiZSBhdHRhY2hlZC4gSWYgZGV0YWNoZWQgc3RhdGUsIGZ1bmN0aW9uIGp1c3QgcmV0dXJuIDAgd2l0aG91dAorICogcHJvcGVydHkgdmFsdWUuIEFsc28sIHRoZSBlYWNoIHByb3BlcnR5IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZgorICogc3VwcG9ydGVkIHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIGV4dGVybmFsIGNvbm5lY3RvcnMuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3Mgb3IgZXJyb3IgbnVtYmVyIGlmIGZhaWwKKyAqLworaW50IGV4dGNvbl9nZXRfcHJvcGVydHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKKwkJCQl1bnNpZ25lZCBpbnQgcHJvcCwKKwkJCQl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgKnByb3BfdmFsKQoreworCXN0cnVjdCBleHRjb25fY2FibGUgKmNhYmxlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGluZGV4LCByZXQgPSAwOworCisJKnByb3BfdmFsID0gKHVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSkoMCk7CisKKwlpZiAoIWVkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3RhdGUgPSBjYWJsZV9zdGF0ZSA/ICgxIDw8IGluZGV4KSA6IDA7Ci0JcmV0dXJuIGV4dGNvbl91cGRhdGVfc3RhdGUoZWRldiwgMSA8PCBpbmRleCwgc3RhdGUpOworCS8qIENoZWNrIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBvciBub3QgKi8KKwlpZiAoIWlzX2V4dGNvbl9wcm9wZXJ0eV9zdXBwb3J0ZWQoaWQsIHByb3ApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZpbmQgdGhlIGNhYmxlIGluZGV4IG9mIGV4dGVybmFsIGNvbm5lY3RvciBieSB1c2luZyBpZCAqLworCWluZGV4ID0gZmluZF9jYWJsZV9pbmRleF9ieV9pZChlZGV2LCBpZCk7CisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIGluZGV4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIGF2YWlsYWJsZSBvciBub3QuICovCisJaWYgKCFpc19leHRjb25fcHJvcGVydHlfY2FwYWJpbGl0eShlZGV2LCBpZCwgaW5kZXgsIHByb3ApKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlIGV4dGVybmFsIGNvbm5lY3RvciBpcyBhdHRhY2hlZC4KKwkgKiBJZiBleHRlcm5hbCBjb25uZWN0b3IgaXMgZGV0YWNoZWQsIHRoZSB1c2VyIGNhbiBub3QKKwkgKiBnZXQgdGhlIHByb3BlcnR5IHZhbHVlLgorCSAqLworCWlmICghaXNfZXh0Y29uX2F0dGFjaGVkKGVkZXYsIGluZGV4KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWNhYmxlID0gJmVkZXYtPmNhYmxlc1tpbmRleF07CisKKwkvKiBHZXQgdGhlIHByb3BlcnR5IHZhbHVlIGFjY29yZGluZyB0byBleHRjb24gdHlwZSAqLworCXN3aXRjaCAocHJvcCkgeworCWNhc2UgRVhUQ09OX1BST1BfVVNCX01JTiAuLi4gRVhUQ09OX1BST1BfVVNCX01BWDoKKwkJKnByb3BfdmFsID0gY2FibGUtPnVzYl9wcm9wdmFsW3Byb3AgLSBFWFRDT05fUFJPUF9VU0JfTUlOXTsKKwkJYnJlYWs7CisJY2FzZSBFWFRDT05fUFJPUF9DSEdfTUlOIC4uLiBFWFRDT05fUFJPUF9DSEdfTUFYOgorCQkqcHJvcF92YWwgPSBjYWJsZS0+Y2hnX3Byb3B2YWxbcHJvcCAtIEVYVENPTl9QUk9QX0NIR19NSU5dOworCQlicmVhazsKKwljYXNlIEVYVENPTl9QUk9QX0pBQ0tfTUlOIC4uLiBFWFRDT05fUFJPUF9KQUNLX01BWDoKKwkJKnByb3BfdmFsID0gY2FibGUtPmphY2tfcHJvcHZhbFtwcm9wIC0gRVhUQ09OX1BST1BfSkFDS19NSU5dOworCQlicmVhazsKKwljYXNlIEVYVENPTl9QUk9QX0RJU1BfTUlOIC4uLiBFWFRDT05fUFJPUF9ESVNQX01BWDoKKwkJKnByb3BfdmFsID0gY2FibGUtPmRpc3BfcHJvcHZhbFtwcm9wIC0gRVhUQ09OX1BST1BfRElTUF9NSU5dOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwoZXh0Y29uX3NldF9jYWJsZV9zdGF0ZV8pOworRVhQT1JUX1NZTUJPTF9HUEwoZXh0Y29uX2dldF9wcm9wZXJ0eSk7CisKKy8qKgorICogZXh0Y29uX3NldF9wcm9wZXJ0eSgpIC0gU2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBvZiBhIHNwZWNpZmljIGNhYmxlLgorICogQGVkZXY6CQl0aGUgZXh0Y29uIGRldmljZSB0aGF0IGhhcyB0aGUgY2FibGUuCisgKiBAaWQ6CQkJdGhlIHVuaXF1ZSBpZCBvZiBlYWNoIGV4dGVybmFsIGNvbm5lY3RvcgorICoJCQlpbiBleHRjb24gZW51bWVyYXRpb24uCisgKiBAcHJvcDoJCXRoZSBwcm9wZXJ0eSBpZCBhbW9uZyBlbnVtIGV4dGNvbl9wcm9wZXJ0eS4KKyAqIEBwcm9wX3ZhbDoJCXRoZSBwb2ludGVyIGluY2x1ZGluZyB0aGUgbmV3IHZhbHVlIG9mIHByb3BlcnR5LgorICoKKyAqIFRoZSBlYWNoIHByb3BlcnR5IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgcHJvcGVydGllcworICogYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIGV4dGVybmFsIGNvbm5lY3RvcnMuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3Mgb3IgZXJyb3IgbnVtYmVyIGlmIGZhaWwKKyAqLworaW50IGV4dGNvbl9zZXRfcHJvcGVydHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKKwkJCQl1bnNpZ25lZCBpbnQgcHJvcCwKKwkJCQl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgcHJvcF92YWwpCit7CisJc3RydWN0IGV4dGNvbl9jYWJsZSAqY2FibGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaW5kZXgsIHJldCA9IDA7CisKKwlpZiAoIWVkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIG9yIG5vdCAqLworCWlmICghaXNfZXh0Y29uX3Byb3BlcnR5X3N1cHBvcnRlZChpZCwgcHJvcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRmluZCB0aGUgY2FibGUgaW5kZXggb2YgZXh0ZXJuYWwgY29ubmVjdG9yIGJ5IHVzaW5nIGlkICovCisJaW5kZXggPSBmaW5kX2NhYmxlX2luZGV4X2J5X2lkKGVkZXYsIGlkKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gaW5kZXg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgYXZhaWxhYmxlIG9yIG5vdC4gKi8KKwlpZiAoIWlzX2V4dGNvbl9wcm9wZXJ0eV9jYXBhYmlsaXR5KGVkZXYsIGlkLCBpbmRleCwgcHJvcCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRldi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWNhYmxlID0gJmVkZXYtPmNhYmxlc1tpbmRleF07CisKKwkvKiBTZXQgdGhlIHByb3BlcnR5IHZhbHVlIGFjY29yZGluZyB0byBleHRjb24gdHlwZSAqLworCXN3aXRjaCAocHJvcCkgeworCWNhc2UgRVhUQ09OX1BST1BfVVNCX01JTiAuLi4gRVhUQ09OX1BST1BfVVNCX01BWDoKKwkJY2FibGUtPnVzYl9wcm9wdmFsW3Byb3AgLSBFWFRDT05fUFJPUF9VU0JfTUlOXSA9IHByb3BfdmFsOworCQlicmVhazsKKwljYXNlIEVYVENPTl9QUk9QX0NIR19NSU4gLi4uIEVYVENPTl9QUk9QX0NIR19NQVg6CisJCWNhYmxlLT5jaGdfcHJvcHZhbFtwcm9wIC0gRVhUQ09OX1BST1BfQ0hHX01JTl0gPSBwcm9wX3ZhbDsKKwkJYnJlYWs7CisJY2FzZSBFWFRDT05fUFJPUF9KQUNLX01JTiAuLi4gRVhUQ09OX1BST1BfSkFDS19NQVg6CisJCWNhYmxlLT5qYWNrX3Byb3B2YWxbcHJvcCAtIEVYVENPTl9QUk9QX0pBQ0tfTUlOXSA9IHByb3BfdmFsOworCQlicmVhazsKKwljYXNlIEVYVENPTl9QUk9QX0RJU1BfTUlOIC4uLiBFWFRDT05fUFJPUF9ESVNQX01BWDoKKwkJY2FibGUtPmRpc3BfcHJvcHZhbFtwcm9wIC0gRVhUQ09OX1BST1BfRElTUF9NSU5dID0gcHJvcF92YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fc2V0X3Byb3BlcnR5KTsKKworLyoqCisgKiBleHRjb25fc2V0X3Byb3BlcnR5X3N5bmMoKSAtIFNldCB0aGUgcHJvcGVydHkgdmFsdWUgb2YgYSBzcGVjaWZpYyBjYWJsZQorCQkJd2l0aCBhIG5vdGlmaWNhdGlvbi4KKyAqIEBwcm9wX3ZhbDoJCXRoZSBwb2ludGVyIGluY2x1ZGluZyB0aGUgbmV3IHZhbHVlIG9mIHByb3BlcnR5LgorICoKKyAqIFdoZW4gc2V0dGluZyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgZXh0ZXJuYWwgY29ubmVjdG9yLCB0aGUgZXh0ZXJuYWwgY29ubmVjdG9yCisgKiBzaG91bGQgYmUgYXR0YWNoZWQuIFRoZSBlYWNoIHByb3BlcnR5IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZgorICogc3VwcG9ydGVkIHByb3BlcnRpZXMgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIGV4dGVybmFsIGNvbm5lY3RvcnMuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3Mgb3IgZXJyb3IgbnVtYmVyIGlmIGZhaWwKKyAqLworaW50IGV4dGNvbl9zZXRfcHJvcGVydHlfc3luYyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wX3ZhbCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZXh0Y29uX3NldF9wcm9wZXJ0eShlZGV2LCBpZCwgcHJvcCwgcHJvcF92YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGV4dGNvbl9zeW5jKGVkZXYsIGlkKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGV4dGNvbl9zZXRfcHJvcGVydHlfc3luYyk7CisKKy8qKgorICogZXh0Y29uX2dldF9wcm9wZXJ0eV9jYXBhYmlsaXR5KCkgLSBHZXQgdGhlIGNhcGFiaWxpdHkgb2YgcHJvcGVydHkKKyAqCQkJb2YgYW4gZXh0ZXJuYWwgY29ubmVjdG9yLgorICogQGVkZXY6CQl0aGUgZXh0Y29uIGRldmljZSB0aGF0IGhhcyB0aGUgY2FibGUuCisgKiBAaWQ6CQkJdGhlIHVuaXF1ZSBpZCBvZiBlYWNoIGV4dGVybmFsIGNvbm5lY3RvcgorICoJCQlpbiBleHRjb24gZW51bWVyYXRpb24uCisgKiBAcHJvcDoJCXRoZSBwcm9wZXJ0eSBpZCBhbW9uZyBlbnVtIGV4dGNvbl9wcm9wZXJ0eS4KKyAqCisgKiBSZXR1cm5zIDEgaWYgdGhlIHByb3BlcnR5IGlzIGF2YWlsYWJsZSBvciAwIGlmIG5vdCBhdmFpbGFibGUuCisgKi8KK2ludCBleHRjb25fZ2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKKwkJCQkJdW5zaWduZWQgaW50IHByb3ApCit7CisJaW50IGluZGV4OworCisJaWYgKCFlZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENoZWNrIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBvciBub3QgKi8KKwlpZiAoIWlzX2V4dGNvbl9wcm9wZXJ0eV9zdXBwb3J0ZWQoaWQsIHByb3ApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZpbmQgdGhlIGNhYmxlIGluZGV4IG9mIGV4dGVybmFsIGNvbm5lY3RvciBieSB1c2luZyBpZCAqLworCWluZGV4ID0gZmluZF9jYWJsZV9pbmRleF9ieV9pZChlZGV2LCBpZCk7CisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIGluZGV4OworCisJcmV0dXJuIGlzX2V4dGNvbl9wcm9wZXJ0eV9jYXBhYmlsaXR5KGVkZXYsIGlkLCBpbmRleCwgcHJvcCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fZ2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkpOworCisvKioKKyAqIGV4dGNvbl9zZXRfcHJvcGVydHlfY2FwYWJpbGl0eSgpIC0gU2V0IHRoZSBjYXBhYmlsaXR5IG9mIGEgcHJvcGVydHkKKyAqCQkJb2YgYW4gZXh0ZXJuYWwgY29ubmVjdG9yLgorICogQGVkZXY6CQl0aGUgZXh0Y29uIGRldmljZSB0aGF0IGhhcyB0aGUgY2FibGUuCisgKiBAaWQ6CQkJdGhlIHVuaXF1ZSBpZCBvZiBlYWNoIGV4dGVybmFsIGNvbm5lY3RvcgorICoJCQlpbiBleHRjb24gZW51bWVyYXRpb24uCisgKiBAcHJvcDoJCXRoZSBwcm9wZXJ0eSBpZCBhbW9uZyBlbnVtIGV4dGNvbl9wcm9wZXJ0eS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldCB0aGUgY2FwYWJpbGl0eSBvZiBhIHByb3BlcnR5IGZvciBhbiBleHRlcm5hbCBjb25uZWN0b3IKKyAqIHRvIG1hcmsgdGhlIGJpdCBpbiBjYXBhYmlsaXR5IGJpdG1hcCB3aGljaCBtZWFuIHRoZSBhdmFpbGFibGUgc3RhdGUgb2YKKyAqIGEgcHJvcGVydHkuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3Mgb3IgZXJyb3IgbnVtYmVyIGlmIGZhaWwKKyAqLworaW50IGV4dGNvbl9zZXRfcHJvcGVydHlfY2FwYWJpbGl0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCQl1bnNpZ25lZCBpbnQgcHJvcCkKK3sKKwlzdHJ1Y3QgZXh0Y29uX2NhYmxlICpjYWJsZTsKKwlpbnQgaW5kZXgsIHR5cGUsIHJldCA9IDA7CisKKwlpZiAoIWVkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgc3VwcG9ydGVkIG9yIG5vdC4gKi8KKwlpZiAoIWlzX2V4dGNvbl9wcm9wZXJ0eV9zdXBwb3J0ZWQoaWQsIHByb3ApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEZpbmQgdGhlIGNhYmxlIGluZGV4IG9mIGV4dGVybmFsIGNvbm5lY3RvciBieSB1c2luZyBpZC4gKi8KKwlpbmRleCA9IGZpbmRfY2FibGVfaW5kZXhfYnlfaWQoZWRldiwgaWQpOworCWlmIChpbmRleCA8IDApCisJCXJldHVybiBpbmRleDsKKworCXR5cGUgPSBnZXRfZXh0Y29uX3R5cGUocHJvcCk7CisJaWYgKHR5cGUgPCAwKQorCQlyZXR1cm4gdHlwZTsKKworCWNhYmxlID0gJmVkZXYtPmNhYmxlc1tpbmRleF07CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEVYVENPTl9UWVBFX1VTQjoKKwkJX19zZXRfYml0KHByb3AgLSBFWFRDT05fUFJPUF9VU0JfTUlOLCBjYWJsZS0+dXNiX2JpdHMpOworCQlicmVhazsKKwljYXNlIEVYVENPTl9UWVBFX0NIRzoKKwkJX19zZXRfYml0KHByb3AgLSBFWFRDT05fUFJPUF9DSEdfTUlOLCBjYWJsZS0+Y2hnX2JpdHMpOworCQlicmVhazsKKwljYXNlIEVYVENPTl9UWVBFX0pBQ0s6CisJCV9fc2V0X2JpdChwcm9wIC0gRVhUQ09OX1BST1BfSkFDS19NSU4sIGNhYmxlLT5qYWNrX2JpdHMpOworCQlicmVhazsKKwljYXNlIEVYVENPTl9UWVBFX0RJU1A6CisJCV9fc2V0X2JpdChwcm9wIC0gRVhUQ09OX1BST1BfRElTUF9NSU4sIGNhYmxlLT5kaXNwX2JpdHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChleHRjb25fc2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkpOwogCiAvKioKICAqIGV4dGNvbl9nZXRfZXh0Y29uX2RldigpIC0gR2V0IHRoZSBleHRjb24gZGV2aWNlIGluc3RhbmNlIGZyb20gdGhlIG5hbWUKQEAgLTQyOCw3ICs5MDQsNyBAQAogCQkJICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCwgaWR4OworCWludCByZXQsIGlkeCA9IC1FSU5WQUw7CiAKIAlpZiAoIW5iKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg0NiwxMyArMTMyMiwxMyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCWlmICghZGV2LT5vZl9ub2RlKSB7Ci0JCWRldl9lcnIoZGV2LCAiZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBkZXZpY2Ugbm9kZSBlbnRyeVxuIik7CisJCWRldl9kYmcoZGV2LCAiZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBkZXZpY2Ugbm9kZSBlbnRyeVxuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAogCW5vZGUgPSBvZl9wYXJzZV9waGFuZGxlKGRldi0+b2Zfbm9kZSwgImV4dGNvbiIsIGluZGV4KTsKIAlpZiAoIW5vZGUpIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHBoYW5kbGUgaW4gJXMgbm9kZVxuIiwKKwkJZGV2X2RiZyhkZXYsICJmYWlsZWQgdG8gZ2V0IHBoYW5kbGUgaW4gJXMgbm9kZVxuIiwKIAkJCWRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9hcm1fc2NwaS5jIGIvZHJpdmVycy9maXJtd2FyZS9hcm1fc2NwaS5jCmluZGV4IDQzODg5MzcuLmNlMmJjMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvYXJtX3NjcGkuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2FybV9zY3BpLmMKQEAgLTcwOSw5ICs3MDksMTAgQEAKIAkJc3RydWN0IG1ib3hfY2xpZW50ICpjbCA9ICZwY2hhbi0+Y2w7CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc2htZW0gPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAic2htZW0iLCBpZHgpOwogCi0JCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHNobWVtLCAwLCAmcmVzKSkgeworCQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKHNobWVtLCAwLCAmcmVzKTsKKwkJb2Zfbm9kZV9wdXQoc2htZW0pOworCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgU0NQSSBwYXlsb2FkIG1lbSByZXNvdXJjZVxuIik7Ci0JCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBlcnI7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYyBiL2RyaXZlcnMvZmlybXdhcmUvZGNkYmFzLmMKaW5kZXggODI5ZWVjOC4uMmZlMWExMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kY2RiYXMuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RjZGJhcy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTIzOCwzMyArMjM5LDE0IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi0vKioKLSAqIGRjZGJhc19zbWlfcmVxdWVzdDogZ2VuZXJhdGUgU01JIHJlcXVlc3QKLSAqCi0gKiBDYWxsZWQgd2l0aCBzbWlfZGF0YV9sb2NrLgotICovCi1pbnQgZGNkYmFzX3NtaV9yZXF1ZXN0KHN0cnVjdCBzbWlfY21kICpzbWlfY21kKQorc3RhdGljIGludCByYWlzZV9zbWkodm9pZCAqcGFyKQogewotCWNwdW1hc2tfdmFyX3Qgb2xkX21hc2s7Ci0JaW50IHJldCA9IDA7CisJc3RydWN0IHNtaV9jbWQgKnNtaV9jbWQgPSBwYXI7CiAKLQlpZiAoc21pX2NtZC0+bWFnaWMgIT0gU01JX0NNRF9NQUdJQykgewotCQlkZXZfaW5mbygmZGNkYmFzX3BkZXYtPmRldiwgIiVzOiBpbnZhbGlkIG1hZ2ljIHZhbHVlXG4iLAotCQkJIF9fZnVuY19fKTsKLQkJcmV0dXJuIC1FQkFEUjsKLQl9Ci0KLQkvKiBTTUkgcmVxdWlyZXMgQ1BVIDAgKi8KLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZvbGRfbWFzaywgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY3B1bWFza19jb3B5KG9sZF9tYXNrLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkKTsKLQlzZXRfY3B1c19hbGxvd2VkX3B0cihjdXJyZW50LCBjcHVtYXNrX29mKDApKTsKIAlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApIHsKIAkJZGV2X2RiZygmZGNkYmFzX3BkZXYtPmRldiwgIiVzOiBmYWlsZWQgdG8gZ2V0IENQVSAwXG4iLAogCQkJX19mdW5jX18pOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCS8qIGdlbmVyYXRlIFNNSSAqLwpAQCAtMjgwLDkgKzI2MiwyOCBAQAogCQk6ICJtZW1vcnkiCiAJKTsKIAotb3V0OgotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIG9sZF9tYXNrKTsKLQlmcmVlX2NwdW1hc2tfdmFyKG9sZF9tYXNrKTsKKwlyZXR1cm4gMDsKK30KKy8qKgorICogZGNkYmFzX3NtaV9yZXF1ZXN0OiBnZW5lcmF0ZSBTTUkgcmVxdWVzdAorICoKKyAqIENhbGxlZCB3aXRoIHNtaV9kYXRhX2xvY2suCisgKi8KK2ludCBkY2RiYXNfc21pX3JlcXVlc3Qoc3RydWN0IHNtaV9jbWQgKnNtaV9jbWQpCit7CisJaW50IHJldDsKKworCWlmIChzbWlfY21kLT5tYWdpYyAhPSBTTUlfQ01EX01BR0lDKSB7CisJCWRldl9pbmZvKCZkY2RiYXNfcGRldi0+ZGV2LCAiJXM6IGludmFsaWQgbWFnaWMgdmFsdWVcbiIsCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gLUVCQURSOworCX0KKworCS8qIFNNSSByZXF1aXJlcyBDUFUgMCAqLworCWdldF9vbmxpbmVfY3B1cygpOworCXJldCA9IHNtcF9jYWxsX29uX2NwdSgwLCByYWlzZV9zbWksIHNtaV9jbWQsIHRydWUpOworCXB1dF9vbmxpbmVfY3B1cygpOworCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9kbWktaWQuYyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pLWlkLmMKaW5kZXggOTRhNThhMC4uNDRjMDEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kbWktaWQuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jCkBAIC0yMjksMTQgKzIyOSwxNCBAQAogCiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKGRtaV9kZXYpOwogCWlmIChyZXQpCi0JCWdvdG8gZmFpbF9mcmVlX2RtaV9kZXY7CisJCWdvdG8gZmFpbF9wdXRfZG1pX2RldjsKIAogCXJldHVybiAwOwogCi1mYWlsX2ZyZWVfZG1pX2RldjoKLQlrZnJlZShkbWlfZGV2KTsKLWZhaWxfY2xhc3NfdW5yZWdpc3RlcjoKK2ZhaWxfcHV0X2RtaV9kZXY6CisJcHV0X2RldmljZShkbWlfZGV2KTsKIAorZmFpbF9jbGFzc191bnJlZ2lzdGVyOgogCWNsYXNzX3VucmVnaXN0ZXIoJmRtaV9jbGFzcyk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvS2NvbmZpZyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL0tjb25maWcKaW5kZXggNjM5NDE1Mi4uYzk4MWJlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvS2NvbmZpZworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9LY29uZmlnCkBAIC0xMTIsNiArMTEyLDIzIEBACiAKIAkgIE1vc3QgdXNlcnMgc2hvdWxkIHNheSBOLgogCitjb25maWcgRUZJX1RFU1QKKwl0cmlzdGF0ZSAiRUZJIFJ1bnRpbWUgU2VydmljZSBUZXN0cyBTdXBwb3J0IgorCWRlcGVuZHMgb24gRUZJCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBkcml2ZXIgdXNlcyB0aGUgZWZpLjxzZXJ2aWNlPiBmdW5jdGlvbiBwb2ludGVycyBkaXJlY3RseSBpbnN0ZWFkCisJICBvZiBnb2luZyB0aHJvdWdoIHRoZSBlZml2YXIgQVBJLCBiZWNhdXNlIGl0IGlzIG5vdCB0cnlpbmcgdG8gdGVzdCB0aGUKKwkgIGtlcm5lbCBzdWJzeXN0ZW0sIGp1c3QgZm9yIHRlc3RpbmcgdGhlIFVFRkkgcnVudGltZSBzZXJ2aWNlCisJICBpbnRlcmZhY2VzIHdoaWNoIGFyZSBwcm92aWRlZCBieSB0aGUgZmlybXdhcmUuIFRoaXMgZHJpdmVyIGlzIHVzZWQKKwkgIGJ5IHRoZSBGaXJtd2FyZSBUZXN0IFN1aXRlIChGV1RTKSBmb3IgdGVzdGluZyB0aGUgVUVGSSBydW50aW1lCisJICBpbnRlcmZhY2VzIHJlYWRpbmVzcyBvZiB0aGUgZmlybXdhcmUuCisJICBEZXRhaWxzIGZvciBGV1RTIGFyZSBhdmFpbGFibGUgZnJvbToKKwkgIDxodHRwczovL3dpa2kudWJ1bnR1LmNvbS9GaXJtd2FyZVRlc3RTdWl0ZT4KKworCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIHJ1bnRpbWUgc2VydmljZXMgc3VwcG9ydCB2aWEgL2Rldi9lZmlfdGVzdC4KKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGVuZG1lbnUKIAogY29uZmlnIFVFRklfQ1BFUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9NYWtlZmlsZQppbmRleCBhMjE5NjQwLi5jOGE0MzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9NYWtlZmlsZQpAQCAtMTAsNyArMTAsNyBAQAogS0FTQU5fU0FOSVRJWkVfcnVudGltZS13cmFwcGVycy5vCTo9IG4KIAogb2JqLSQoQ09ORklHX0VGSSkJCQkrPSBlZmkubyB2YXJzLm8gcmVib290Lm8gbWVtYXR0ci5vCi1vYmotJChDT05GSUdfRUZJKQkJCSs9IGNhcHN1bGUubworb2JqLSQoQ09ORklHX0VGSSkJCQkrPSBjYXBzdWxlLm8gbWVtbWFwLm8KIG9iai0kKENPTkZJR19FRklfVkFSUykJCQkrPSBlZml2YXJzLm8KIG9iai0kKENPTkZJR19FRklfRVNSVCkJCQkrPSBlc3J0Lm8KIG9iai0kKENPTkZJR19FRklfVkFSU19QU1RPUkUpCQkrPSBlZmktcHN0b3JlLm8KQEAgLTIwLDYgKzIwLDcgQEAKIG9iai0kKENPTkZJR19FRklfU1RVQikJCQkrPSBsaWJzdHViLwogb2JqLSQoQ09ORklHX0VGSV9GQUtFX01FTU1BUCkJCSs9IGZha2VfbWVtLm8KIG9iai0kKENPTkZJR19FRklfQk9PVExPQURFUl9DT05UUk9MKQkrPSBlZmliYy5vCitvYmotJChDT05GSUdfRUZJX1RFU1QpCQkJKz0gdGVzdC8KIAogYXJtLW9iai0kKENPTkZJR19FRkkpCQkJOj0gYXJtLWluaXQubyBhcm0tcnVudGltZS5vCiBvYmotJChDT05GSUdfQVJNKQkJCSs9ICQoYXJtLW9iai15KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvYXJtLWluaXQuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2FybS1pbml0LmMKaW5kZXggYzQ5ZDUwZS4uOGVmZTEzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvYXJtLWluaXQuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9hcm0taW5pdC5jCkBAIC0yNiw5ICsyNiw5IEBACiAKIHU2NCBlZmlfc3lzdGVtX3RhYmxlOwogCi1zdGF0aWMgaW50IF9faW5pdCBpc19ub3JtYWxfcmFtKGVmaV9tZW1vcnlfZGVzY190ICptZCkKK3N0YXRpYyBpbnQgX19pbml0IGlzX21lbW9yeShlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpCiB7Ci0JaWYgKG1kLT5hdHRyaWJ1dGUgJiBFRklfTUVNT1JZX1dCKQorCWlmIChtZC0+YXR0cmlidXRlICYgKEVGSV9NRU1PUllfV0J8RUZJX01FTU9SWV9XVHxFRklfTUVNT1JZX1dDKSkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNTIsOSArMTUyLDkgQEAKIH0KIAogLyoKLSAqIFJldHVybiB0cnVlIGZvciBSQU0gcmVnaW9ucyB3ZSB3YW50IHRvIHBlcm1hbmVudGx5IHJlc2VydmUuCisgKiBSZXR1cm4gdHJ1ZSBmb3IgcmVnaW9ucyB0aGF0IGNhbiBiZSB1c2VkIGFzIFN5c3RlbSBSQU0uCiAgKi8KLXN0YXRpYyBfX2luaXQgaW50IGlzX3Jlc2VydmVfcmVnaW9uKGVmaV9tZW1vcnlfZGVzY190ICptZCkKK3N0YXRpYyBfX2luaXQgaW50IGlzX3VzYWJsZV9tZW1vcnkoZWZpX21lbW9yeV9kZXNjX3QgKm1kKQogewogCXN3aXRjaCAobWQtPnR5cGUpIHsKIAljYXNlIEVGSV9MT0FERVJfQ09ERToKQEAgLTE2MywxOCArMTYzLDIyIEBACiAJY2FzZSBFRklfQk9PVF9TRVJWSUNFU19EQVRBOgogCWNhc2UgRUZJX0NPTlZFTlRJT05BTF9NRU1PUlk6CiAJY2FzZSBFRklfUEVSU0lTVEVOVF9NRU1PUlk6Ci0JCXJldHVybiAwOworCQkvKgorCQkgKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHRoZXNlIHJlZ2lvbnMgYXJlIG5vIGxvbmdlciByZXNlcnZlZAorCQkgKiBhZnRlciBjYWxsaW5nIEV4aXRCb290U2VydmljZXMoKS4gSG93ZXZlciwgd2UgY2FuIG9ubHkgdXNlCisJCSAqIHRoZW0gYXMgU3lzdGVtIFJBTSBpZiB0aGV5IGNhbiBiZSBtYXBwZWQgd3JpdGViYWNrIGNhY2hlYWJsZS4KKwkJICovCisJCXJldHVybiAobWQtPmF0dHJpYnV0ZSAmIEVGSV9NRU1PUllfV0IpOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLQlyZXR1cm4gaXNfbm9ybWFsX3JhbShtZCk7CisJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgX19pbml0IHZvaWQgcmVzZXJ2ZV9yZWdpb25zKHZvaWQpCiB7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwogCXU2NCBwYWRkciwgbnBhZ2VzLCBzaXplOwotCWludCByZXN2OwogCiAJaWYgKGVmaV9lbmFibGVkKEVGSV9EQkcpKQogCQlwcl9pbmZvKCJQcm9jZXNzaW5nIEVGSSBtZW1vcnkgbWFwOlxuIik7CkBAIC0xOTEsMzIgKzE5NSwyOSBAQAogCQlwYWRkciA9IG1kLT5waHlzX2FkZHI7CiAJCW5wYWdlcyA9IG1kLT5udW1fcGFnZXM7CiAKLQkJcmVzdiA9IGlzX3Jlc2VydmVfcmVnaW9uKG1kKTsKIAkJaWYgKGVmaV9lbmFibGVkKEVGSV9EQkcpKSB7CiAJCQljaGFyIGJ1Zls2NF07CiAKLQkJCXByX2luZm8oIiAgMHglMDEybGx4LTB4JTAxMmxseCAlcyVzXG4iLAorCQkJcHJfaW5mbygiICAweCUwMTJsbHgtMHglMDEybGx4ICVzXG4iLAogCQkJCXBhZGRyLCBwYWRkciArIChucGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpIC0gMSwKLQkJCQllZmlfbWRfdHlwZWF0dHJfZm9ybWF0KGJ1Ziwgc2l6ZW9mKGJ1ZiksIG1kKSwKLQkJCQlyZXN2ID8gIioiIDogIiIpOworCQkJCWVmaV9tZF90eXBlYXR0cl9mb3JtYXQoYnVmLCBzaXplb2YoYnVmKSwgbWQpKTsKIAkJfQogCiAJCW1lbXJhbmdlX2VmaV90b19uYXRpdmUoJnBhZGRyLCAmbnBhZ2VzKTsKIAkJc2l6ZSA9IG5wYWdlcyA8PCBQQUdFX1NISUZUOwogCi0JCWlmIChpc19ub3JtYWxfcmFtKG1kKSkKKwkJaWYgKGlzX21lbW9yeShtZCkpIHsKIAkJCWVhcmx5X2luaXRfZHRfYWRkX21lbW9yeV9hcmNoKHBhZGRyLCBzaXplKTsKIAotCQlpZiAocmVzdikKLQkJCW1lbWJsb2NrX21hcmtfbm9tYXAocGFkZHIsIHNpemUpOwotCisJCQlpZiAoIWlzX3VzYWJsZV9tZW1vcnkobWQpKQorCQkJCW1lbWJsb2NrX21hcmtfbm9tYXAocGFkZHIsIHNpemUpOworCQl9CiAJfQotCi0Jc2V0X2JpdChFRklfTUVNTUFQLCAmZWZpLmZsYWdzKTsKIH0KIAogdm9pZCBfX2luaXQgZWZpX2luaXQodm9pZCkKIHsKKwlzdHJ1Y3QgZWZpX21lbW9yeV9tYXBfZGF0YSBkYXRhOwogCXN0cnVjdCBlZmlfZmR0X3BhcmFtcyBwYXJhbXM7CiAKIAkvKiBHcmFiIFVFRkkgaW5mb3JtYXRpb24gcGxhY2VkIGluIEZEVCBieSBzdHViICovCkBAIC0yMjUsOSArMjI2LDEyIEBACiAKIAllZmlfc3lzdGVtX3RhYmxlID0gcGFyYW1zLnN5c3RlbV90YWJsZTsKIAotCWVmaS5tZW1tYXAucGh5c19tYXAgPSBwYXJhbXMubW1hcDsKLQllZmkubWVtbWFwLm1hcCA9IGVhcmx5X21lbXJlbWFwX3JvKHBhcmFtcy5tbWFwLCBwYXJhbXMubW1hcF9zaXplKTsKLQlpZiAoZWZpLm1lbW1hcC5tYXAgPT0gTlVMTCkgeworCWRhdGEuZGVzY192ZXJzaW9uID0gcGFyYW1zLmRlc2NfdmVyOworCWRhdGEuZGVzY19zaXplID0gcGFyYW1zLmRlc2Nfc2l6ZTsKKwlkYXRhLnNpemUgPSBwYXJhbXMubW1hcF9zaXplOworCWRhdGEucGh5c19tYXAgPSBwYXJhbXMubW1hcDsKKworCWlmIChlZmlfbWVtbWFwX2luaXRfZWFybHkoJmRhdGEpIDwgMCkgewogCQkvKgogCQkqIElmIHdlIGFyZSBib290aW5nIHZpYSBVRUZJLCB0aGUgVUVGSSBtZW1vcnkgbWFwIGlzIHRoZSBvbmx5CiAJCSogZGVzY3JpcHRpb24gb2YgbWVtb3J5IHdlIGhhdmUsIHNvIHRoZXJlIGlzIGxpdHRsZSBwb2ludCBpbgpAQCAtMjM1LDkgKzIzOSw2IEBACiAJCSovCiAJCXBhbmljKCJVbmFibGUgdG8gbWFwIEVGSSBtZW1vcnkgbWFwLlxuIik7CiAJfQotCWVmaS5tZW1tYXAubWFwX2VuZCA9IGVmaS5tZW1tYXAubWFwICsgcGFyYW1zLm1tYXBfc2l6ZTsKLQllZmkubWVtbWFwLmRlc2Nfc2l6ZSA9IHBhcmFtcy5kZXNjX3NpemU7Ci0JZWZpLm1lbW1hcC5kZXNjX3ZlcnNpb24gPSBwYXJhbXMuZGVzY192ZXI7CiAKIAlXQVJOKGVmaS5tZW1tYXAuZGVzY192ZXJzaW9uICE9IDEsCiAJICAgICAiVW5leHBlY3RlZCBFRklfTUVNT1JZX0RFU0NSSVBUT1IgdmVyc2lvbiAlbGQiLApAQCAtMjQ4LDcgKzI0OSw4IEBACiAKIAlyZXNlcnZlX3JlZ2lvbnMoKTsKIAllZmlfbWVtYXR0cl9pbml0KCk7Ci0JZWFybHlfbWVtdW5tYXAoZWZpLm1lbW1hcC5tYXAsIHBhcmFtcy5tbWFwX3NpemUpOworCWVmaV9lc3J0X2luaXQoKTsKKwllZmlfbWVtbWFwX3VubWFwKCk7CiAKIAltZW1ibG9ja19yZXNlcnZlKHBhcmFtcy5tbWFwICYgUEFHRV9NQVNLLAogCQkJIFBBR0VfQUxJR04ocGFyYW1zLm1tYXBfc2l6ZSArCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9hcm0tcnVudGltZS5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvYXJtLXJ1bnRpbWUuYwppbmRleCBjMzk0YjgxLi43Yzc1YThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9hcm0tcnVudGltZS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2FybS1ydW50aW1lLmMKQEAgLTM5LDYgKzM5LDI2IEBACiAJLm1tbGlzdAkJCT0gTElTVF9IRUFEX0lOSVQoZWZpX21tLm1tbGlzdCksCiB9OwogCisjaWZkZWYgQ09ORklHX0FSTTY0X1BURFVNUAorI2luY2x1ZGUgPGFzbS9wdGR1bXAuaD4KKworc3RhdGljIHN0cnVjdCBwdGR1bXBfaW5mbyBlZmlfcHRkdW1wX2luZm8gPSB7CisJLm1tCQk9ICZlZmlfbW0sCisJLm1hcmtlcnMJPSAoc3RydWN0IGFkZHJfbWFya2VyW10peworCQl7IDAsCQkiVUVGSSBydW50aW1lIHN0YXJ0IiB9LAorCQl7IFRBU0tfU0laRV82NCwJIlVFRkkgcnVudGltZSBlbmQiIH0KKwl9LAorCS5iYXNlX2FkZHIJPSAwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHRkdW1wX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcHRkdW1wX3JlZ2lzdGVyKCZlZmlfcHRkdW1wX2luZm8sICJlZmlfcGFnZV90YWJsZXMiKTsKK30KK2RldmljZV9pbml0Y2FsbChwdGR1bXBfaW5pdCk7CisKKyNlbmRpZgorCiBzdGF0aWMgYm9vbCBfX2luaXQgZWZpX3ZpcnRtYXBfaW5pdCh2b2lkKQogewogCWVmaV9tZW1vcnlfZGVzY190ICptZDsKQEAgLTExNCwxNCArMTM0LDEyIEBACiAKIAlwcl9pbmZvKCJSZW1hcHBpbmcgYW5kIGVuYWJsaW5nIEVGSSBzZXJ2aWNlcy5cbiIpOwogCi0JbWFwc2l6ZSA9IGVmaS5tZW1tYXAubWFwX2VuZCAtIGVmaS5tZW1tYXAubWFwOworCW1hcHNpemUgPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZSAqIGVmaS5tZW1tYXAubnJfbWFwOwogCi0JZWZpLm1lbW1hcC5tYXAgPSBtZW1yZW1hcChlZmkubWVtbWFwLnBoeXNfbWFwLCBtYXBzaXplLCBNRU1SRU1BUF9XQik7Ci0JaWYgKCFlZmkubWVtbWFwLm1hcCkgeworCWlmIChlZmlfbWVtbWFwX2luaXRfbGF0ZShlZmkubWVtbWFwLnBoeXNfbWFwLCBtYXBzaXplKSkgewogCQlwcl9lcnIoIkZhaWxlZCB0byByZW1hcCBFRkkgbWVtb3J5IG1hcFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQllZmkubWVtbWFwLm1hcF9lbmQgPSBlZmkubWVtbWFwLm1hcCArIG1hcHNpemU7CiAKIAlpZiAoIWVmaV92aXJ0bWFwX2luaXQoKSkgewogCQlwcl9lcnIoIlVFRkkgdmlydHVhbCBtYXBwaW5nIG1pc3Npbmcgb3IgaW52YWxpZCAtLSBydW50aW1lIHNlcnZpY2VzIHdpbGwgbm90IGJlIGF2YWlsYWJsZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmktcHN0b3JlLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmktcHN0b3JlLmMKaW5kZXggMzBhMjRkMC4uZjQwMmJhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLXBzdG9yZS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaS1wc3RvcmUuYwpAQCAtMTI1LDE2ICsxMjUsMTkgQEAKICAqIEBlbnRyeTogZGVsZXRpbmcgZW50cnkKICAqIEB0dXJuX29mZl9zY2FubmluZzogQ2hlY2sgaWYgYSBzY2FubmluZyBmbGFnIHNob3VsZCBiZSB0dXJuZWQgb2ZmCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2VmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5LAorc3RhdGljIGlubGluZSBpbnQgX19lZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdChzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwKIAkJCQkJCWJvb2wgdHVybl9vZmZfc2Nhbm5pbmcpCiB7CiAJaWYgKGVudHJ5LT5kZWxldGluZykgewogCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwogCQllZml2YXJfZW50cnlfaXRlcl9lbmQoKTsKIAkJZWZpdmFyX3VucmVnaXN0ZXIoZW50cnkpOwotCQllZml2YXJfZW50cnlfaXRlcl9iZWdpbigpOworCQlpZiAoZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4oKSkKKwkJCXJldHVybiAtRUlOVFI7CiAJfSBlbHNlIGlmICh0dXJuX29mZl9zY2FubmluZykKIAkJZW50cnktPnNjYW5uaW5nID0gZmFsc2U7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xNDQsMTMgKzE0NywxOCBAQAogICogQGhlYWQ6IGxpc3QgaGVhZAogICogQHN0b3A6IGEgZmxhZyBjaGVja2luZyBpZiBzY2FubmluZyB3aWxsIHN0b3AKICAqLwotc3RhdGljIHZvaWQgZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2V4aXQoc3RydWN0IGVmaXZhcl9lbnRyeSAqcG9zLAorc3RhdGljIGludCBlZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdChzdHJ1Y3QgZWZpdmFyX2VudHJ5ICpwb3MsCiAJCQkJICAgICAgIHN0cnVjdCBlZml2YXJfZW50cnkgKm5leHQsCiAJCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGJvb2wgc3RvcCkKIHsKLQlfX2VmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KHBvcywgdHJ1ZSk7CisJaW50IHJldCA9IF9fZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2V4aXQocG9zLCB0cnVlKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAlpZiAoc3RvcCkKLQkJX19lZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdChuZXh0LCAmbmV4dC0+bGlzdCAhPSBoZWFkKTsKKwkJcmV0ID0gX19lZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdChuZXh0LCAmbmV4dC0+bGlzdCAhPSBoZWFkKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTE3MiwxMyArMTgwLDE3IEBACiAJc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksICpuOwogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZWZpdmFyX3N5c2ZzX2xpc3Q7CiAJaW50IHNpemUgPSAwOworCWludCByZXQ7CiAKIAlpZiAoISpwb3MpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuLCBoZWFkLCBsaXN0KSB7CiAJCQllZmlfcHN0b3JlX3NjYW5fc3lzZnNfZW50ZXIoZW50cnksIG4sIGhlYWQpOwogCiAJCQlzaXplID0gZWZpX3BzdG9yZV9yZWFkX2Z1bmMoZW50cnksIGRhdGEpOwotCQkJZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2V4aXQoZW50cnksIG4sIGhlYWQsIHNpemUgPCAwKTsKKwkJCXJldCA9IGVmaV9wc3RvcmVfc2Nhbl9zeXNmc19leGl0KGVudHJ5LCBuLCBoZWFkLAorCQkJCQkJCSBzaXplIDwgMCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CiAJCQlpZiAoc2l6ZSkKIAkJCQlicmVhazsKIAkJfQpAQCAtMTkwLDcgKzIwMiw5IEBACiAJCWVmaV9wc3RvcmVfc2Nhbl9zeXNmc19lbnRlcigoKnBvcyksIG4sIGhlYWQpOwogCiAJCXNpemUgPSBlZmlfcHN0b3JlX3JlYWRfZnVuYygoKnBvcyksIGRhdGEpOwotCQllZmlfcHN0b3JlX3NjYW5fc3lzZnNfZXhpdCgoKnBvcyksIG4sIGhlYWQsIHNpemUgPCAwKTsKKwkJcmV0ID0gZWZpX3BzdG9yZV9zY2FuX3N5c2ZzX2V4aXQoKCpwb3MpLCBuLCBoZWFkLCBzaXplIDwgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCQlpZiAoc2l6ZSkKIAkJCWJyZWFrOwogCX0KQEAgLTIzMiw3ICsyNDYsMTAgQEAKIAlpZiAoISpkYXRhLmJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQllZml2YXJfZW50cnlfaXRlcl9iZWdpbigpOworCWlmIChlZml2YXJfZW50cnlfaXRlcl9iZWdpbigpKSB7CisJCWtmcmVlKCpkYXRhLmJ1Zik7CisJCXJldHVybiAtRUlOVFI7CisJfQogCXNpemUgPSBlZmlfcHN0b3JlX3N5c2ZzX2VudHJ5X2l0ZXIoJmRhdGEsCiAJCQkJCSAgIChzdHJ1Y3QgZWZpdmFyX2VudHJ5ICoqKSZwc2ktPmRhdGEpOwogCWVmaXZhcl9lbnRyeV9pdGVyX2VuZCgpOwpAQCAtMzQ3LDcgKzM2NCw4IEBACiAJZWRhdGEudGltZSA9IHRpbWU7CiAJZWRhdGEubmFtZSA9IGVmaV9uYW1lOwogCi0JZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4oKTsKKwlpZiAoZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4oKSkKKwkJcmV0dXJuIC1FSU5UUjsKIAlmb3VuZCA9IF9fZWZpdmFyX2VudHJ5X2l0ZXIoZWZpX3BzdG9yZV9lcmFzZV9mdW5jLCAmZWZpdmFyX3N5c2ZzX2xpc3QsICZlZGF0YSwgJmVudHJ5KTsKIAogCWlmIChmb3VuZCAmJiAhZW50cnktPnNjYW5uaW5nKSB7CkBAIC0zNjIsNyArMzgwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHN0b3JlX2luZm8gZWZpX3BzdG9yZV9pbmZvID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkubmFtZQkJPSAiZWZpIiwKLQkuZmxhZ3MJCT0gUFNUT1JFX0ZMQUdTX0ZSQUdJTEUsCisJLmZsYWdzCQk9IFBTVE9SRV9GTEFHU19ETUVTRywKIAkub3BlbgkJPSBlZmlfcHN0b3JlX29wZW4sCiAJLmNsb3NlCQk9IGVmaV9wc3RvcmVfY2xvc2UsCiAJLnJlYWQJCT0gZWZpX3BzdG9yZV9yZWFkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmkuYwppbmRleCA1YTI2MzFhLi4xYWMxOTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmkuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZmkuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvdWNzMl9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2Vhcmx5X2lvcmVtYXAuaD4KIApAQCAtMzQ3LDU2ICszNDgsMzEgQEAKIAogLyoKICAqIEZpbmQgdGhlIGVmaSBtZW1vcnkgZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBwaHlzaWNhbCBhZGRyZXNzLiAgR2l2ZW4gYQotICogcGh5c2ljYWxsIGFkZHJlc3MsIGRldGVybWluZSBpZiBpdCBleGlzdHMgd2l0aGluIGFuIEVGSSBNZW1vcnkgTWFwIGVudHJ5LAorICogcGh5c2ljYWwgYWRkcmVzcywgZGV0ZXJtaW5lIGlmIGl0IGV4aXN0cyB3aXRoaW4gYW4gRUZJIE1lbW9yeSBNYXAgZW50cnksCiAgKiBhbmQgaWYgc28sIHBvcHVsYXRlIHRoZSBzdXBwbGllZCBtZW1vcnkgZGVzY3JpcHRvciB3aXRoIHRoZSBhcHByb3ByaWF0ZQogICogZGF0YS4KICAqLwogaW50IF9faW5pdCBlZmlfbWVtX2Rlc2NfbG9va3VwKHU2NCBwaHlzX2FkZHIsIGVmaV9tZW1vcnlfZGVzY190ICpvdXRfbWQpCiB7Ci0Jc3RydWN0IGVmaV9tZW1vcnlfbWFwICptYXAgPSAmZWZpLm1lbW1hcDsKLQlwaHlzX2FkZHJfdCBwLCBlOworCWVmaV9tZW1vcnlfZGVzY190ICptZDsKIAogCWlmICghZWZpX2VuYWJsZWQoRUZJX01FTU1BUCkpIHsKIAkJcHJfZXJyX29uY2UoIkVGSV9NRU1NQVAgaXMgbm90IGVuYWJsZWQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFtYXApIHsKLQkJcHJfZXJyX29uY2UoImVmaS5tZW1tYXAgaXMgbm90IHNldC5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAJaWYgKCFvdXRfbWQpIHsKIAkJcHJfZXJyX29uY2UoIm91dF9tZCBpcyBudWxsLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogICAgICAgICB9Ci0JaWYgKFdBUk5fT05fT05DRSghbWFwLT5waHlzX21hcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChXQVJOX09OX09OQ0UobWFwLT5ucl9tYXAgPT0gMCkgfHwgV0FSTl9PTl9PTkNFKG1hcC0+ZGVzY19zaXplID09IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKIAotCWUgPSBtYXAtPnBoeXNfbWFwICsgbWFwLT5ucl9tYXAgKiBtYXAtPmRlc2Nfc2l6ZTsKLQlmb3IgKHAgPSBtYXAtPnBoeXNfbWFwOyBwIDwgZTsgcCArPSBtYXAtPmRlc2Nfc2l6ZSkgewotCQllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CisJZm9yX2VhY2hfZWZpX21lbW9yeV9kZXNjKG1kKSB7CiAJCXU2NCBzaXplOwogCQl1NjQgZW5kOwogCi0JCS8qCi0JCSAqIElmIGEgZHJpdmVyIGNhbGxzIHRoaXMgYWZ0ZXIgZWZpX2ZyZWVfYm9vdF9zZXJ2aWNlcywKLQkJICogLT5tYXAgd2lsbCBiZSBOVUxMLCBhbmQgdGhlIHRhcmdldCBtYXkgYWxzbyBub3QgYmUgbWFwcGVkLgotCQkgKiBTbyBqdXN0IGFsd2F5cyBnZXQgb3VyIG93biB2aXJ0dWFsIG1hcCBvbiB0aGUgQ1BVLgotCQkgKgotCQkgKi8KLQkJbWQgPSBlYXJseV9tZW1yZW1hcChwLCBzaXplb2YgKCptZCkpOwotCQlpZiAoIW1kKSB7Ci0JCQlwcl9lcnJfb25jZSgiZWFybHlfbWVtcmVtYXAoJXBhLCAlenUpIGZhaWxlZC5cbiIsCi0JCQkJICAgICZwLCBzaXplb2YgKCptZCkpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQogCQlpZiAoIShtZC0+YXR0cmlidXRlICYgRUZJX01FTU9SWV9SVU5USU1FKSAmJgogCQkgICAgbWQtPnR5cGUgIT0gRUZJX0JPT1RfU0VSVklDRVNfREFUQSAmJgogCQkgICAgbWQtPnR5cGUgIT0gRUZJX1JVTlRJTUVfU0VSVklDRVNfREFUQSkgewotCQkJZWFybHlfbWVtdW5tYXAobWQsIHNpemVvZiAoKm1kKSk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC00MDQsMTEgKzM4MCw4IEBACiAJCWVuZCA9IG1kLT5waHlzX2FkZHIgKyBzaXplOwogCQlpZiAocGh5c19hZGRyID49IG1kLT5waHlzX2FkZHIgJiYgcGh5c19hZGRyIDwgZW5kKSB7CiAJCQltZW1jcHkob3V0X21kLCBtZCwgc2l6ZW9mKCpvdXRfbWQpKTsKLQkJCWVhcmx5X21lbXVubWFwKG1kLCBzaXplb2YgKCptZCkpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQotCQllYXJseV9tZW11bm1hcChtZCwgc2l6ZW9mICgqbWQpKTsKIAl9CiAJcHJfZXJyX29uY2UoInJlcXVlc3RlZCBtYXAgbm90IGZvdW5kLlxuIik7CiAJcmV0dXJuIC1FTk9FTlQ7CkBAIC00MjQsNiArMzk3LDM1IEBACiAJcmV0dXJuIGVuZDsKIH0KIAordm9pZCBfX2luaXQgX193ZWFrIGVmaV9hcmNoX21lbV9yZXNlcnZlKHBoeXNfYWRkcl90IGFkZHIsIHU2NCBzaXplKSB7fQorCisvKioKKyAqIGVmaV9tZW1fcmVzZXJ2ZSAtIFJlc2VydmUgYW4gRUZJIG1lbW9yeSByZWdpb24KKyAqIEBhZGRyOiBQaHlzaWNhbCBhZGRyZXNzIHRvIHJlc2VydmUKKyAqIEBzaXplOiBTaXplIG9mIHJlc2VydmF0aW9uCisgKgorICogTWFyayBhIHJlZ2lvbiBhcyByZXNlcnZlZCBmcm9tIGdlbmVyYWwga2VybmVsIGFsbG9jYXRpb24gYW5kCisgKiBwcmV2ZW50IGl0IGJlaW5nIHJlbGVhc2VkIGJ5IGVmaV9mcmVlX2Jvb3Rfc2VydmljZXMoKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZHJpdmVycyBvbmNlIHRoZXkndmUgcGFyc2VkIEVGSQorICogY29uZmlndXJhdGlvbiB0YWJsZXMgdG8gZmlndXJlIG91dCB3aGVyZSB0aGVpciBkYXRhIGxpdmVzLCBlLmcuCisgKiBlZmlfZXNydF9pbml0KCkuCisgKi8KK3ZvaWQgX19pbml0IGVmaV9tZW1fcmVzZXJ2ZShwaHlzX2FkZHJfdCBhZGRyLCB1NjQgc2l6ZSkKK3sKKwlpZiAoIW1lbWJsb2NrX2lzX3JlZ2lvbl9yZXNlcnZlZChhZGRyLCBzaXplKSkKKwkJbWVtYmxvY2tfcmVzZXJ2ZShhZGRyLCBzaXplKTsKKworCS8qCisJICogU29tZSBhcmNoaXRlY3R1cmVzICh4ODYpIHJlc2VydmUgYWxsIGJvb3Qgc2VydmljZXMgcmFuZ2VzCisJICogdW50aWwgZWZpX2ZyZWVfYm9vdF9zZXJ2aWNlcygpIGJlY2F1c2Ugb2YgYnVnZ3kgZmlybXdhcmUKKwkgKiBpbXBsZW1lbnRhdGlvbnMuIFRoaXMgbWVhbnMgdGhlIGFib3ZlIG1lbWJsb2NrX3Jlc2VydmUoKSBpcworCSAqIHN1cGVyZmx1b3VzIG9uIHg4NiBhbmQgaW5zdGVhZCB3aGF0IGl0IG5lZWRzIHRvIGRvIGlzCisJICogZW5zdXJlIHRoZSBAc3RhcnQsIEBzaXplIGlzIG5vdCBmcmVlZC4KKwkgKi8KKwllZmlfYXJjaF9tZW1fcmVzZXJ2ZShhZGRyLCBzaXplKTsKK30KKwogc3RhdGljIF9faW5pdGRhdGEgZWZpX2NvbmZpZ190YWJsZV90eXBlX3QgY29tbW9uX3RhYmxlc1tdID0gewogCXtBQ1BJXzIwX1RBQkxFX0dVSUQsICJBQ1BJIDIuMCIsICZlZmkuYWNwaTIwfSwKIAl7QUNQSV9UQUJMRV9HVUlELCAiQUNQSSIsICZlZmkuYWNwaX0sCkBAIC02NTcsOSArNjU5LDEyIEBACiAJCX0KIAogCQlpZiAoc3Vibm9kZSkgewotCQkJbm9kZSA9IG9mX2dldF9mbGF0X2R0X3N1Ym5vZGVfYnlfbmFtZShub2RlLCBzdWJub2RlKTsKLQkJCWlmIChub2RlIDwgMCkKKwkJCWludCBlcnIgPSBvZl9nZXRfZmxhdF9kdF9zdWJub2RlX2J5X25hbWUobm9kZSwgc3Vibm9kZSk7CisKKwkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiAwOworCisJCQlub2RlID0gZXJyOwogCQl9CiAKIAkJcmV0dXJuIF9fZmluZF91ZWZpX3BhcmFtcyhub2RlLCBpbmZvLCBkdF9wYXJhbXNbaV0ucGFyYW1zKTsKQEAgLTgwOCw2ICs4MTMsOSBAQAogCWNhc2UgRUZJX05PVF9GT1VORDoKIAkJZXJyID0gLUVOT0VOVDsKIAkJYnJlYWs7CisJY2FzZSBFRklfQUJPUlRFRDoKKwkJZXJyID0gLUVJTlRSOworCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnIgPSAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaXZhcnMuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VmaXZhcnMuYwppbmRleCAxMTZiMjQ0Li4zZTYyNmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lZml2YXJzLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvZWZpdmFycy5jCkBAIC01MTAsNyArNTEwLDggQEAKIAkJdmVuZG9yID0gZGVsX3Zhci0+VmVuZG9yR3VpZDsKIAl9CiAKLQllZml2YXJfZW50cnlfaXRlcl9iZWdpbigpOworCWlmIChlZml2YXJfZW50cnlfaXRlcl9iZWdpbigpKQorCQlyZXR1cm4gLUVJTlRSOwogCWVudHJ5ID0gZWZpdmFyX2VudHJ5X2ZpbmQobmFtZSwgdmVuZG9yLCAmZWZpdmFyX3N5c2ZzX2xpc3QsIHRydWUpOwogCWlmICghZW50cnkpCiAJCWVyciA9IC1FSU5WQUw7CkBAIC01NzUsNyArNTc2LDEwIEBACiAJCXJldHVybiByZXQ7CiAKIAlrb2JqZWN0X3VldmVudCgmbmV3X3Zhci0+a29iaiwgS09CSl9BREQpOwotCWVmaXZhcl9lbnRyeV9hZGQobmV3X3ZhciwgJmVmaXZhcl9zeXNmc19saXN0KTsKKwlpZiAoZWZpdmFyX2VudHJ5X2FkZChuZXdfdmFyLCAmZWZpdmFyX3N5c2ZzX2xpc3QpKSB7CisJCWVmaXZhcl91bnJlZ2lzdGVyKG5ld192YXIpOworCQlyZXR1cm4gLUVJTlRSOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtNjkwLDcgKzY5NCwxMCBAQAogCiBzdGF0aWMgaW50IGVmaXZhcl9zeXNmc19kZXN0cm95KHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5LCB2b2lkICpkYXRhKQogewotCWVmaXZhcl9lbnRyeV9yZW1vdmUoZW50cnkpOworCWludCBlcnIgPSBlZml2YXJfZW50cnlfcmVtb3ZlKGVudHJ5KTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAJZWZpdmFyX3VucmVnaXN0ZXIoZW50cnkpOwogCXJldHVybiAwOwogfQpAQCAtNjk4LDcgKzcwNSwxNCBAQAogc3RhdGljIHZvaWQgZWZpdmFyc19zeXNmc19leGl0KHZvaWQpCiB7CiAJLyogUmVtb3ZlIGFsbCBlbnRyaWVzIGFuZCBkZXN0cm95ICovCi0JX19lZml2YXJfZW50cnlfaXRlcihlZml2YXJfc3lzZnNfZGVzdHJveSwgJmVmaXZhcl9zeXNmc19saXN0LCBOVUxMLCBOVUxMKTsKKwlpbnQgZXJyOworCisJZXJyID0gX19lZml2YXJfZW50cnlfaXRlcihlZml2YXJfc3lzZnNfZGVzdHJveSwgJmVmaXZhcl9zeXNmc19saXN0LAorCQkJCSAgTlVMTCwgTlVMTCk7CisJaWYgKGVycikgeworCQlwcl9lcnIoImVmaXZhcnM6IEZhaWxlZCB0byBkZXN0cm95IHN5c2ZzIGVudHJpZXNcbiIpOworCQlyZXR1cm47CisJfQogCiAJaWYgKGVmaXZhcnNfbmV3X3ZhcikKIAkJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZlZml2YXJzX2tzZXQtPmtvYmosIGVmaXZhcnNfbmV3X3Zhcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lc3J0LmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9lc3J0LmMKaW5kZXggNzVmZWIzZi4uMTQ5MTQwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZXNydC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2VzcnQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CkBAIC0yMzUsNyArMjM2LDcgQEAKIH07CiAKIC8qCi0gKiByZW1hcCB0aGUgdGFibGUsIGNvcHkgaXQgdG8ga21hbGxvY2VkIHBhZ2VzLCBhbmQgdW5tYXAgaXQuCisgKiByZW1hcCB0aGUgdGFibGUsIHZhbGlkYXRlIGl0LCBtYXJrIGl0IHJlc2VydmVkIGFuZCB1bm1hcCBpdC4KICAqLwogdm9pZCBfX2luaXQgZWZpX2VzcnRfaW5pdCh2b2lkKQogewpAQCAtMzM1LDcgKzMzNiw3IEBACiAKIAllbmQgPSBlc3J0X2RhdGEgKyBzaXplOwogCXByX2luZm8oIlJlc2VydmluZyBFU1JUIHNwYWNlIGZyb20gJXBhIHRvICVwYS5cbiIsICZlc3J0X2RhdGEsICZlbmQpOwotCW1lbWJsb2NrX3Jlc2VydmUoZXNydF9kYXRhLCBlc3J0X2RhdGFfc2l6ZSk7CisJZWZpX21lbV9yZXNlcnZlKGVzcnRfZGF0YSwgZXNydF9kYXRhX3NpemUpOwogCiAJcHJfZGVidWcoImVzcnQtaW5pdDogbG9hZGVkLlxuIik7CiBlcnJfbWVtdW5tYXA6CkBAIC0zODIsMjggKzM4MywxOCBAQAogc3RhdGljIGludCBfX2luaXQgZXNydF9zeXNmc19pbml0KHZvaWQpCiB7CiAJaW50IGVycm9yOwotCXN0cnVjdCBlZmlfc3lzdGVtX3Jlc291cmNlX3RhYmxlIF9faW9tZW0gKmlvZXNydDsKIAogCXByX2RlYnVnKCJlc3J0LXN5c2ZzOiBsb2FkaW5nLlxuIik7CiAJaWYgKCFlc3J0X2RhdGEgfHwgIWVzcnRfZGF0YV9zaXplKQogCQlyZXR1cm4gLUVOT1NZUzsKIAotCWlvZXNydCA9IGlvcmVtYXAoZXNydF9kYXRhLCBlc3J0X2RhdGFfc2l6ZSk7Ci0JaWYgKCFpb2VzcnQpIHsKLQkJcHJfZXJyKCJpb3JlbWFwKCVwYSwgJXp1KSBmYWlsZWQuXG4iLCAmZXNydF9kYXRhLAorCWVzcnQgPSBtZW1yZW1hcChlc3J0X2RhdGEsIGVzcnRfZGF0YV9zaXplLCBNRU1SRU1BUF9XQik7CisJaWYgKCFlc3J0KSB7CisJCXByX2VycigibWVtcmVtYXAoJXBhLCAlenUpIGZhaWxlZC5cbiIsICZlc3J0X2RhdGEsCiAJCSAgICAgICBlc3J0X2RhdGFfc2l6ZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWVzcnQgPSBrbWFsbG9jKGVzcnRfZGF0YV9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVzcnQpIHsKLQkJcHJfZXJyKCJrbWFsbG9jIGZhaWxlZC4gKHdhbnRlZCAlenUgYnl0ZXMpXG4iLCBlc3J0X2RhdGFfc2l6ZSk7Ci0JCWlvdW5tYXAoaW9lc3J0KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbWVtY3B5X2Zyb21pbyhlc3J0LCBpb2VzcnQsIGVzcnRfZGF0YV9zaXplKTsKLQogCWVzcnRfa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImVzcnQiLCBlZmlfa29iaik7CiAJaWYgKCFlc3J0X2tvYmopIHsKIAkJcHJfZXJyKCJGaXJtd2FyZSB0YWJsZSByZWdpc3RyYXRpb24gZmFpbGVkLlxuIik7CkBAIC00MjksOCArNDIwLDYgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyX2NsZWFudXBfbGlzdDsKIAotCW1lbWJsb2NrX3JlbW92ZShlc3J0X2RhdGEsIGVzcnRfZGF0YV9zaXplKTsKLQogCXByX2RlYnVnKCJlc3J0LXN5c2ZzOiBsb2FkZWQuXG4iKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZmFrZV9tZW0uYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2Zha2VfbWVtLmMKaW5kZXggNDg0MzBhYi4uNTIwYTQwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvZmFrZV9tZW0uYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9mYWtlX21lbS5jCkBAIC0zNSwxNyArMzUsMTMgQEAKIAogI2RlZmluZSBFRklfTUFYX0ZBS0VNRU0gQ09ORklHX0VGSV9NQVhfRkFLRV9NRU0KIAotc3RydWN0IGZha2VfbWVtIHsKLQlzdHJ1Y3QgcmFuZ2UgcmFuZ2U7Ci0JdTY0IGF0dHJpYnV0ZTsKLX07Ci1zdGF0aWMgc3RydWN0IGZha2VfbWVtIGZha2VfbWVtc1tFRklfTUFYX0ZBS0VNRU1dOworc3RhdGljIHN0cnVjdCBlZmlfbWVtX3JhbmdlIGZha2VfbWVtc1tFRklfTUFYX0ZBS0VNRU1dOwogc3RhdGljIGludCBucl9mYWtlX21lbTsKIAogc3RhdGljIGludCBfX2luaXQgY21wX2Zha2VfbWVtKGNvbnN0IHZvaWQgKngxLCBjb25zdCB2b2lkICp4MikKIHsKLQljb25zdCBzdHJ1Y3QgZmFrZV9tZW0gKm0xID0geDE7Ci0JY29uc3Qgc3RydWN0IGZha2VfbWVtICptMiA9IHgyOworCWNvbnN0IHN0cnVjdCBlZmlfbWVtX3JhbmdlICptMSA9IHgxOworCWNvbnN0IHN0cnVjdCBlZmlfbWVtX3JhbmdlICptMiA9IHgyOwogCiAJaWYgKG0xLT5yYW5nZS5zdGFydCA8IG0yLT5yYW5nZS5zdGFydCkKIAkJcmV0dXJuIC0xOwpAQCAtNTYsNDAgKzUyLDIxIEBACiAKIHZvaWQgX19pbml0IGVmaV9mYWtlX21lbW1hcCh2b2lkKQogewotCXU2NCBzdGFydCwgZW5kLCBtX3N0YXJ0LCBtX2VuZCwgbV9hdHRyOwogCWludCBuZXdfbnJfbWFwID0gZWZpLm1lbW1hcC5ucl9tYXA7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1kOwogCXBoeXNfYWRkcl90IG5ld19tZW1tYXBfcGh5OwogCXZvaWQgKm5ld19tZW1tYXA7Ci0Jdm9pZCAqb2xkLCAqbmV3OwogCWludCBpOwogCi0JaWYgKCFucl9mYWtlX21lbSB8fCAhZWZpX2VuYWJsZWQoRUZJX01FTU1BUCkpCisJaWYgKCFucl9mYWtlX21lbSkKIAkJcmV0dXJuOwogCiAJLyogY291bnQgdXAgdGhlIG51bWJlciBvZiBFRkkgbWVtb3J5IGRlc2NyaXB0b3IgKi8KLQlmb3JfZWFjaF9lZmlfbWVtb3J5X2Rlc2MobWQpIHsKLQkJc3RhcnQgPSBtZC0+cGh5c19hZGRyOwotCQllbmQgPSBzdGFydCArIChtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSAtIDE7CisJZm9yIChpID0gMDsgaSA8IG5yX2Zha2VfbWVtOyBpKyspIHsKKwkJZm9yX2VhY2hfZWZpX21lbW9yeV9kZXNjKG1kKSB7CisJCQlzdHJ1Y3QgcmFuZ2UgKnIgPSAmZmFrZV9tZW1zW2ldLnJhbmdlOwogCi0JCWZvciAoaSA9IDA7IGkgPCBucl9mYWtlX21lbTsgaSsrKSB7Ci0JCQkvKiBtb2RpZnlpbmcgcmFuZ2UgKi8KLQkJCW1fc3RhcnQgPSBmYWtlX21lbXNbaV0ucmFuZ2Uuc3RhcnQ7Ci0JCQltX2VuZCA9IGZha2VfbWVtc1tpXS5yYW5nZS5lbmQ7Ci0KLQkJCWlmIChtX3N0YXJ0IDw9IHN0YXJ0KSB7Ci0JCQkJLyogc3BsaXQgaW50byAyIHBhcnRzICovCi0JCQkJaWYgKHN0YXJ0IDwgbV9lbmQgJiYgbV9lbmQgPCBlbmQpCi0JCQkJCW5ld19ucl9tYXArKzsKLQkJCX0KLQkJCWlmIChzdGFydCA8IG1fc3RhcnQgJiYgbV9zdGFydCA8IGVuZCkgewotCQkJCS8qIHNwbGl0IGludG8gMyBwYXJ0cyAqLwotCQkJCWlmIChtX2VuZCA8IGVuZCkKLQkJCQkJbmV3X25yX21hcCArPSAyOwotCQkJCS8qIHNwbGl0IGludG8gMiBwYXJ0cyAqLwotCQkJCWlmIChlbmQgPD0gbV9lbmQpCi0JCQkJCW5ld19ucl9tYXArKzsKLQkJCX0KKwkJCW5ld19ucl9tYXAgKz0gZWZpX21lbW1hcF9zcGxpdF9jb3VudChtZCwgcik7CiAJCX0KIAl9CiAKQEAgLTEwNyw4NSArODQsMTMgQEAKIAkJcmV0dXJuOwogCX0KIAotCWZvciAob2xkID0gZWZpLm1lbW1hcC5tYXAsIG5ldyA9IG5ld19tZW1tYXA7Ci0JICAgICBvbGQgPCBlZmkubWVtbWFwLm1hcF9lbmQ7Ci0JICAgICBvbGQgKz0gZWZpLm1lbW1hcC5kZXNjX3NpemUsIG5ldyArPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZSkgewotCi0JCS8qIGNvcHkgb3JpZ2luYWwgRUZJIG1lbW9yeSBkZXNjcmlwdG9yICovCi0JCW1lbWNweShuZXcsIG9sZCwgZWZpLm1lbW1hcC5kZXNjX3NpemUpOwotCQltZCA9IG5ldzsKLQkJc3RhcnQgPSBtZC0+cGh5c19hZGRyOwotCQllbmQgPSBtZC0+cGh5c19hZGRyICsgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpIC0gMTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgbnJfZmFrZV9tZW07IGkrKykgewotCQkJLyogbW9kaWZ5aW5nIHJhbmdlICovCi0JCQltX3N0YXJ0ID0gZmFrZV9tZW1zW2ldLnJhbmdlLnN0YXJ0OwotCQkJbV9lbmQgPSBmYWtlX21lbXNbaV0ucmFuZ2UuZW5kOwotCQkJbV9hdHRyID0gZmFrZV9tZW1zW2ldLmF0dHJpYnV0ZTsKLQotCQkJaWYgKG1fc3RhcnQgPD0gc3RhcnQgJiYgZW5kIDw9IG1fZW5kKQotCQkJCW1kLT5hdHRyaWJ1dGUgfD0gbV9hdHRyOwotCi0JCQlpZiAobV9zdGFydCA8PSBzdGFydCAmJgotCQkJICAgIChzdGFydCA8IG1fZW5kICYmIG1fZW5kIDwgZW5kKSkgewotCQkJCS8qIGZpcnN0IHBhcnQgKi8KLQkJCQltZC0+YXR0cmlidXRlIHw9IG1fYXR0cjsKLQkJCQltZC0+bnVtX3BhZ2VzID0gKG1fZW5kIC0gbWQtPnBoeXNfYWRkciArIDEpID4+Ci0JCQkJCUVGSV9QQUdFX1NISUZUOwotCQkJCS8qIGxhdHRlciBwYXJ0ICovCi0JCQkJbmV3ICs9IGVmaS5tZW1tYXAuZGVzY19zaXplOwotCQkJCW1lbWNweShuZXcsIG9sZCwgZWZpLm1lbW1hcC5kZXNjX3NpemUpOwotCQkJCW1kID0gbmV3OwotCQkJCW1kLT5waHlzX2FkZHIgPSBtX2VuZCArIDE7Ci0JCQkJbWQtPm51bV9wYWdlcyA9IChlbmQgLSBtZC0+cGh5c19hZGRyICsgMSkgPj4KLQkJCQkJRUZJX1BBR0VfU0hJRlQ7Ci0JCQl9Ci0KLQkJCWlmICgoc3RhcnQgPCBtX3N0YXJ0ICYmIG1fc3RhcnQgPCBlbmQpICYmIG1fZW5kIDwgZW5kKSB7Ci0JCQkJLyogZmlyc3QgcGFydCAqLwotCQkJCW1kLT5udW1fcGFnZXMgPSAobV9zdGFydCAtIG1kLT5waHlzX2FkZHIpID4+Ci0JCQkJCUVGSV9QQUdFX1NISUZUOwotCQkJCS8qIG1pZGRsZSBwYXJ0ICovCi0JCQkJbmV3ICs9IGVmaS5tZW1tYXAuZGVzY19zaXplOwotCQkJCW1lbWNweShuZXcsIG9sZCwgZWZpLm1lbW1hcC5kZXNjX3NpemUpOwotCQkJCW1kID0gbmV3OwotCQkJCW1kLT5hdHRyaWJ1dGUgfD0gbV9hdHRyOwotCQkJCW1kLT5waHlzX2FkZHIgPSBtX3N0YXJ0OwotCQkJCW1kLT5udW1fcGFnZXMgPSAobV9lbmQgLSBtX3N0YXJ0ICsgMSkgPj4KLQkJCQkJRUZJX1BBR0VfU0hJRlQ7Ci0JCQkJLyogbGFzdCBwYXJ0ICovCi0JCQkJbmV3ICs9IGVmaS5tZW1tYXAuZGVzY19zaXplOwotCQkJCW1lbWNweShuZXcsIG9sZCwgZWZpLm1lbW1hcC5kZXNjX3NpemUpOwotCQkJCW1kID0gbmV3OwotCQkJCW1kLT5waHlzX2FkZHIgPSBtX2VuZCArIDE7Ci0JCQkJbWQtPm51bV9wYWdlcyA9IChlbmQgLSBtX2VuZCkgPj4KLQkJCQkJRUZJX1BBR0VfU0hJRlQ7Ci0JCQl9Ci0KLQkJCWlmICgoc3RhcnQgPCBtX3N0YXJ0ICYmIG1fc3RhcnQgPCBlbmQpICYmCi0JCQkgICAgKGVuZCA8PSBtX2VuZCkpIHsKLQkJCQkvKiBmaXJzdCBwYXJ0ICovCi0JCQkJbWQtPm51bV9wYWdlcyA9IChtX3N0YXJ0IC0gbWQtPnBoeXNfYWRkcikgPj4KLQkJCQkJRUZJX1BBR0VfU0hJRlQ7Ci0JCQkJLyogbGF0dGVyIHBhcnQgKi8KLQkJCQluZXcgKz0gZWZpLm1lbW1hcC5kZXNjX3NpemU7Ci0JCQkJbWVtY3B5KG5ldywgb2xkLCBlZmkubWVtbWFwLmRlc2Nfc2l6ZSk7Ci0JCQkJbWQgPSBuZXc7Ci0JCQkJbWQtPnBoeXNfYWRkciA9IG1fc3RhcnQ7Ci0JCQkJbWQtPm51bV9wYWdlcyA9IChlbmQgLSBtZC0+cGh5c19hZGRyICsgMSkgPj4KLQkJCQkJRUZJX1BBR0VfU0hJRlQ7Ci0JCQkJbWQtPmF0dHJpYnV0ZSB8PSBtX2F0dHI7Ci0JCQl9Ci0JCX0KLQl9CisJZm9yIChpID0gMDsgaSA8IG5yX2Zha2VfbWVtOyBpKyspCisJCWVmaV9tZW1tYXBfaW5zZXJ0KCZlZmkubWVtbWFwLCBuZXdfbWVtbWFwLCAmZmFrZV9tZW1zW2ldKTsKIAogCS8qIHN3YXAgaW50byBuZXcgRUZJIG1lbW1hcCAqLwotCWVmaV91bm1hcF9tZW1tYXAoKTsKLQllZmkubWVtbWFwLm1hcCA9IG5ld19tZW1tYXA7Ci0JZWZpLm1lbW1hcC5waHlzX21hcCA9IG5ld19tZW1tYXBfcGh5OwotCWVmaS5tZW1tYXAubnJfbWFwID0gbmV3X25yX21hcDsKLQllZmkubWVtbWFwLm1hcF9lbmQgPSBlZmkubWVtbWFwLm1hcCArIGVmaS5tZW1tYXAubnJfbWFwICogZWZpLm1lbW1hcC5kZXNjX3NpemU7Ci0Jc2V0X2JpdChFRklfTUVNTUFQLCAmZWZpLmZsYWdzKTsKKwllYXJseV9tZW11bm1hcChuZXdfbWVtbWFwLCBlZmkubWVtbWFwLmRlc2Nfc2l6ZSAqIG5ld19ucl9tYXApOworCisJZWZpX21lbW1hcF9pbnN0YWxsKG5ld19tZW1tYXBfcGh5LCBuZXdfbnJfbWFwKTsKIAogCS8qIHByaW50IG5ldyBFRkkgbWVtbWFwICovCiAJZWZpX3ByaW50X21lbW1hcCgpOwpAQCAtMjIzLDcgKzEyOCw3IEBACiAJCQlwKys7CiAJfQogCi0Jc29ydChmYWtlX21lbXMsIG5yX2Zha2VfbWVtLCBzaXplb2Yoc3RydWN0IGZha2VfbWVtKSwKKwlzb3J0KGZha2VfbWVtcywgbnJfZmFrZV9tZW0sIHNpemVvZihzdHJ1Y3QgZWZpX21lbV9yYW5nZSksCiAJICAgICBjbXBfZmFrZV9tZW0sIE5VTEwpOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX2Zha2VfbWVtOyBpKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2VmaS1zdHViLWhlbHBlci5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9lZmktc3R1Yi1oZWxwZXIuYwppbmRleCAzYmQxMjdmOS4uYWRlZDEwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9lZmktc3R1Yi1oZWxwZXIuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2VmaS1zdHViLWhlbHBlci5jCkBAIC00MSw2ICs0MSw4IEBACiAjZGVmaW5lIEVGSV9BTExPQ19BTElHTgkJRUZJX1BBR0VfU0laRQogI2VuZGlmCiAKKyNkZWZpbmUgRUZJX01NQVBfTlJfU0xBQ0tfU0xPVFMJOAorCiBzdHJ1Y3QgZmlsZV9pbmZvIHsKIAllZmlfZmlsZV9oYW5kbGVfdCAqaGFuZGxlOwogCXU2NCBzaXplOwpAQCAtNjMsNDkgKzY1LDYyIEBACiAJfQogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgbW1hcF9oYXNfaGVhZHJvb20odW5zaWduZWQgbG9uZyBidWZmX3NpemUsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG1hcF9zaXplLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBkZXNjX3NpemUpCit7CisJdW5zaWduZWQgbG9uZyBzbGFjayA9IGJ1ZmZfc2l6ZSAtIG1hcF9zaXplOworCisJcmV0dXJuIHNsYWNrIC8gZGVzY19zaXplID49IEVGSV9NTUFQX05SX1NMQUNLX1NMT1RTOworfQorCiBlZmlfc3RhdHVzX3QgZWZpX2dldF9tZW1vcnlfbWFwKGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlX2FyZywKLQkJCQllZmlfbWVtb3J5X2Rlc2NfdCAqKm1hcCwKLQkJCQl1bnNpZ25lZCBsb25nICptYXBfc2l6ZSwKLQkJCQl1bnNpZ25lZCBsb25nICpkZXNjX3NpemUsCi0JCQkJdTMyICpkZXNjX3ZlciwKLQkJCQl1bnNpZ25lZCBsb25nICprZXlfcHRyKQorCQkJCXN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgKm1hcCkKIHsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbSA9IE5VTEw7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGtleTsKIAl1MzIgZGVzY192ZXJzaW9uOwogCi0JKm1hcF9zaXplID0gc2l6ZW9mKCptKSAqIDMyOworCSptYXAtPmRlc2Nfc2l6ZSA9CXNpemVvZigqbSk7CisJKm1hcC0+bWFwX3NpemUgPQkqbWFwLT5kZXNjX3NpemUgKiAzMjsKKwkqbWFwLT5idWZmX3NpemUgPQkqbWFwLT5tYXBfc2l6ZTsKIGFnYWluOgotCS8qCi0JICogQWRkIGFuIGFkZGl0aW9uYWwgZWZpX21lbW9yeV9kZXNjX3QgYmVjYXVzZSB3ZSdyZSBkb2luZyBhbgotCSAqIGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIGluIGEgbmV3IGRlc2NyaXB0b3IgcmVnaW9uLgotCSAqLwotCSptYXBfc2l6ZSArPSBzaXplb2YoKm0pOwogCXN0YXR1cyA9IGVmaV9jYWxsX2Vhcmx5KGFsbG9jYXRlX3Bvb2wsIEVGSV9MT0FERVJfREFUQSwKLQkJCQkqbWFwX3NpemUsICh2b2lkICoqKSZtKTsKKwkJCQkqbWFwLT5tYXBfc2l6ZSwgKHZvaWQgKiopJm0pOwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCWdvdG8gZmFpbDsKIAotCSpkZXNjX3NpemUgPSAwOworCSptYXAtPmRlc2Nfc2l6ZSA9IDA7CiAJa2V5ID0gMDsKLQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShnZXRfbWVtb3J5X21hcCwgbWFwX3NpemUsIG0sCi0JCQkJJmtleSwgZGVzY19zaXplLCAmZGVzY192ZXJzaW9uKTsKLQlpZiAoc3RhdHVzID09IEVGSV9CVUZGRVJfVE9PX1NNQUxMKSB7CisJc3RhdHVzID0gZWZpX2NhbGxfZWFybHkoZ2V0X21lbW9yeV9tYXAsIG1hcC0+bWFwX3NpemUsIG0sCisJCQkJJmtleSwgbWFwLT5kZXNjX3NpemUsICZkZXNjX3ZlcnNpb24pOworCWlmIChzdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwgfHwKKwkgICAgIW1tYXBfaGFzX2hlYWRyb29tKCptYXAtPmJ1ZmZfc2l6ZSwgKm1hcC0+bWFwX3NpemUsCisJCQkgICAgICAgKm1hcC0+ZGVzY19zaXplKSkgewogCQllZmlfY2FsbF9lYXJseShmcmVlX3Bvb2wsIG0pOworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZSBlbnRyaWVzIG9mIGhlYWRyb29tIHNvIHRoYXQgdGhlCisJCSAqIGJ1ZmZlciBjYW4gYmUgcmV1c2VkIGZvciBhIG5ldyBtYXAgYWZ0ZXIgYWxsb2NhdGlvbnMgYXJlCisJCSAqIG5vIGxvbmdlciBwZXJtaXR0ZWQuICBJdHMgdW5saWtlbHkgdGhhdCB0aGUgbWFwIHdpbGwgZ3JvdyB0bworCQkgKiBleGNlZWQgdGhpcyBoZWFkcm9vbSBvbmNlIHdlIGFyZSByZWFkeSB0byB0cmlnZ2VyCisJCSAqIEV4aXRCb290U2VydmljZXMoKQorCQkgKi8KKwkJKm1hcC0+bWFwX3NpemUgKz0gKm1hcC0+ZGVzY19zaXplICogRUZJX01NQVBfTlJfU0xBQ0tfU0xPVFM7CisJCSptYXAtPmJ1ZmZfc2l6ZSA9ICptYXAtPm1hcF9zaXplOwogCQlnb3RvIGFnYWluOwogCX0KIAogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCWVmaV9jYWxsX2Vhcmx5KGZyZWVfcG9vbCwgbSk7CiAKLQlpZiAoa2V5X3B0ciAmJiBzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpCi0JCSprZXlfcHRyID0ga2V5OwotCWlmIChkZXNjX3ZlciAmJiBzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpCi0JCSpkZXNjX3ZlciA9IGRlc2NfdmVyc2lvbjsKKwlpZiAobWFwLT5rZXlfcHRyICYmIHN0YXR1cyA9PSBFRklfU1VDQ0VTUykKKwkJKm1hcC0+a2V5X3B0ciA9IGtleTsKKwlpZiAobWFwLT5kZXNjX3ZlciAmJiBzdGF0dXMgPT0gRUZJX1NVQ0NFU1MpCisJCSptYXAtPmRlc2NfdmVyID0gZGVzY192ZXJzaW9uOwogCiBmYWlsOgotCSptYXAgPSBtOworCSptYXAtPm1hcCA9IG07CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTEzLDEzICsxMjgsMjAgQEAKIHVuc2lnbmVkIGxvbmcgZ2V0X2RyYW1fYmFzZShlZmlfc3lzdGVtX3RhYmxlX3QgKnN5c190YWJsZV9hcmcpCiB7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKLQl1bnNpZ25lZCBsb25nIG1hcF9zaXplOworCXVuc2lnbmVkIGxvbmcgbWFwX3NpemUsIGJ1ZmZfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIG1lbWJhc2UgID0gRUZJX0VSUk9SOwogCXN0cnVjdCBlZmlfbWVtb3J5X21hcCBtYXA7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1kOworCXN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgYm9vdF9tYXA7CiAKLQlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlX2FyZywgKGVmaV9tZW1vcnlfZGVzY190ICoqKSZtYXAubWFwLAotCQkJCSAgICAmbWFwX3NpemUsICZtYXAuZGVzY19zaXplLCBOVUxMLCBOVUxMKTsKKwlib290X21hcC5tYXAgPQkJKGVmaV9tZW1vcnlfZGVzY190ICoqKSZtYXAubWFwOworCWJvb3RfbWFwLm1hcF9zaXplID0JJm1hcF9zaXplOworCWJvb3RfbWFwLmRlc2Nfc2l6ZSA9CSZtYXAuZGVzY19zaXplOworCWJvb3RfbWFwLmRlc2NfdmVyID0JTlVMTDsKKwlib290X21hcC5rZXlfcHRyID0JTlVMTDsKKwlib290X21hcC5idWZmX3NpemUgPQkmYnVmZl9zaXplOworCisJc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZV9hcmcsICZib290X21hcCk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJcmV0dXJuIG1lbWJhc2U7CiAKQEAgLTE0NCwxNSArMTY2LDIyIEBACiAJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbWF4KQogewotCXVuc2lnbmVkIGxvbmcgbWFwX3NpemUsIGRlc2Nfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG1hcF9zaXplLCBkZXNjX3NpemUsIGJ1ZmZfc2l6ZTsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWFwOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKIAl1NjQgbWF4X2FkZHIgPSAwOwogCWludCBpOworCXN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgYm9vdF9tYXA7CiAKLQlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlX2FyZywgJm1hcCwgJm1hcF9zaXplLCAmZGVzY19zaXplLAotCQkJCSAgICBOVUxMLCBOVUxMKTsKKwlib290X21hcC5tYXAgPQkJJm1hcDsKKwlib290X21hcC5tYXBfc2l6ZSA9CSZtYXBfc2l6ZTsKKwlib290X21hcC5kZXNjX3NpemUgPQkmZGVzY19zaXplOworCWJvb3RfbWFwLmRlc2NfdmVyID0JTlVMTDsKKwlib290X21hcC5rZXlfcHRyID0JTlVMTDsKKwlib290X21hcC5idWZmX3NpemUgPQkmYnVmZl9zaXplOworCisJc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZV9hcmcsICZib290X21hcCk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJZ290byBmYWlsOwogCkBAIC0yMzAsMTQgKzI1OSwyMSBAQAogCQkJICAgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGFsaWduLAogCQkJICAgdW5zaWduZWQgbG9uZyAqYWRkcikKIHsKLQl1bnNpZ25lZCBsb25nIG1hcF9zaXplLCBkZXNjX3NpemU7CisJdW5zaWduZWQgbG9uZyBtYXBfc2l6ZSwgZGVzY19zaXplLCBidWZmX3NpemU7CiAJZWZpX21lbW9yeV9kZXNjX3QgKm1hcDsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXM7CiAJaW50IGk7CisJc3RydWN0IGVmaV9ib290X21lbW1hcCBib290X21hcDsKIAotCXN0YXR1cyA9IGVmaV9nZXRfbWVtb3J5X21hcChzeXNfdGFibGVfYXJnLCAmbWFwLCAmbWFwX3NpemUsICZkZXNjX3NpemUsCi0JCQkJICAgIE5VTEwsIE5VTEwpOworCWJvb3RfbWFwLm1hcCA9CQkmbWFwOworCWJvb3RfbWFwLm1hcF9zaXplID0JJm1hcF9zaXplOworCWJvb3RfbWFwLmRlc2Nfc2l6ZSA9CSZkZXNjX3NpemU7CisJYm9vdF9tYXAuZGVzY192ZXIgPQlOVUxMOworCWJvb3RfbWFwLmtleV9wdHIgPQlOVUxMOworCWJvb3RfbWFwLmJ1ZmZfc2l6ZSA9CSZidWZmX3NpemU7CisKKwlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlX2FyZywgJmJvb3RfbWFwKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQogCQlnb3RvIGZhaWw7CiAKQEAgLTcwNCwzICs3NDAsNzYgQEAKIAkqY21kX2xpbmVfbGVuID0gb3B0aW9uc19ieXRlczsKIAlyZXR1cm4gKGNoYXIgKiljbWRsaW5lX2FkZHI7CiB9CisKKy8qCisgKiBIYW5kbGUgY2FsbGluZyBFeGl0Qm9vdFNlcnZpY2VzIGFjY29yZGluZyB0byB0aGUgcmVxdWlyZW1lbnRzIHNldCBvdXQgYnkgdGhlCisgKiBzcGVjLiAgT2J0YWlucyB0aGUgY3VycmVudCBtZW1vcnkgbWFwLCBhbmQgcmV0dXJucyB0aGF0IGluZm8gYWZ0ZXIgY2FsbGluZworICogRXhpdEJvb3RTZXJ2aWNlcy4gIFRoZSBjbGllbnQgbXVzdCBzcGVjaWZ5IGEgZnVuY3Rpb24gdG8gcGVyZm9ybSBhbnkKKyAqIHByb2Nlc3Npbmcgb2YgdGhlIG1lbW9yeSBtYXAgZGF0YSBwcmlvciB0byBFeGl0Qm9vdFNlcnZpY2VzLiAgQSBjbGllbnQKKyAqIHNwZWNpZmljIHN0cnVjdHVyZSBtYXkgYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiB2aWEgcHJpdi4gIFRoZSBjbGllbnQKKyAqIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCisgKi8KK2VmaV9zdGF0dXNfdCBlZmlfZXhpdF9ib290X3NlcnZpY2VzKGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlX2FyZywKKwkJCQkgICAgdm9pZCAqaGFuZGxlLAorCQkJCSAgICBzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwICptYXAsCisJCQkJICAgIHZvaWQgKnByaXYsCisJCQkJICAgIGVmaV9leGl0X2Jvb3RfbWFwX3Byb2Nlc3NpbmcgcHJpdl9mdW5jKQoreworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisKKwlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlX2FyZywgbWFwKTsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCWdvdG8gZmFpbDsKKworCXN0YXR1cyA9IHByaXZfZnVuYyhzeXNfdGFibGVfYXJnLCBtYXAsIHByaXYpOworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCWdvdG8gZnJlZV9tYXA7CisKKwlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShleGl0X2Jvb3Rfc2VydmljZXMsIGhhbmRsZSwgKm1hcC0+a2V5X3B0cik7CisKKwlpZiAoc3RhdHVzID09IEVGSV9JTlZBTElEX1BBUkFNRVRFUikgeworCQkvKgorCQkgKiBUaGUgbWVtb3J5IG1hcCBjaGFuZ2VkIGJldHdlZW4gZWZpX2dldF9tZW1vcnlfbWFwKCkgYW5kCisJCSAqIGV4aXRfYm9vdF9zZXJ2aWNlcygpLiAgUGVyIHRoZSBVRUZJIFNwZWMgdjIuNiwgU2VjdGlvbiA2LjQ6CisJCSAqIEVGSV9CT09UX1NFUlZJQ0VTLkV4aXRCb290U2VydmljZXMgd2UgbmVlZCB0byBnZXQgdGhlCisJCSAqIHVwZGF0ZWQgbWFwLCBhbmQgdHJ5IGFnYWluLiAgVGhlIHNwZWMgaW1wbGllcyBvbmUgcmV0cnkKKwkJICogc2hvdWxkIGJlIHN1ZmZpY2VudCwgd2hpY2ggaXMgY29uZmlybWVkIGFnYWluc3QgdGhlIEVESzIKKwkJICogaW1wbGVtZW50YXRpb24uICBQZXIgdGhlIHNwZWMsIHdlIGNhbiBvbmx5IGludm9rZQorCQkgKiBnZXRfbWVtb3J5X21hcCgpIGFuZCBleGl0X2Jvb3Rfc2VydmljZXMoKSAtIHdlIGNhbm5vdCBhbGxvYworCQkgKiBzbyBlZmlfZ2V0X21lbW9yeV9tYXAoKSBjYW5ub3QgYmUgdXNlZCwgYW5kIHdlIG11c3QgcmV1c2UKKwkJICogdGhlIGJ1ZmZlci4gIEZvciBhbGwgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGUgaGVhZHJvb20gaW4gdGhlCisJCSAqIGJ1ZmZlciBzaG91bGQgYWNjb3VudCBmb3IgYW55IGNoYW5nZXMgaW4gdGhlIG1hcCBzbyB0aGUgY2FsbAorCQkgKiB0byBnZXRfbWVtb3J5X21hcCgpIGlzIGV4cGVjdGVkIHRvIHN1Y2NlZWQgaGVyZS4KKwkJICovCisJCSptYXAtPm1hcF9zaXplID0gKm1hcC0+YnVmZl9zaXplOworCQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShnZXRfbWVtb3J5X21hcCwKKwkJCQkJbWFwLT5tYXBfc2l6ZSwKKwkJCQkJKm1hcC0+bWFwLAorCQkJCQltYXAtPmtleV9wdHIsCisJCQkJCW1hcC0+ZGVzY19zaXplLAorCQkJCQltYXAtPmRlc2NfdmVyKTsKKworCQkvKiBleGl0X2Jvb3Rfc2VydmljZXMoKSB3YXMgY2FsbGVkLCB0aHVzIGNhbm5vdCBmcmVlICovCisJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCQlnb3RvIGZhaWw7CisKKwkJc3RhdHVzID0gcHJpdl9mdW5jKHN5c190YWJsZV9hcmcsIG1hcCwgcHJpdik7CisJCS8qIGV4aXRfYm9vdF9zZXJ2aWNlcygpIHdhcyBjYWxsZWQsIHRodXMgY2Fubm90IGZyZWUgKi8KKwkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJCWdvdG8gZmFpbDsKKworCQlzdGF0dXMgPSBlZmlfY2FsbF9lYXJseShleGl0X2Jvb3Rfc2VydmljZXMsIGhhbmRsZSwgKm1hcC0+a2V5X3B0cik7CisJfQorCisJLyogZXhpdF9ib290X3NlcnZpY2VzKCkgd2FzIGNhbGxlZCwgdGh1cyBjYW5ub3QgZnJlZSAqLworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCWdvdG8gZmFpbDsKKworCXJldHVybiBFRklfU1VDQ0VTUzsKKworZnJlZV9tYXA6CisJZWZpX2NhbGxfZWFybHkoZnJlZV9wb29sLCAqbWFwLT5tYXApOworZmFpbDoKKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9mZHQuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvZmR0LmMKaW5kZXggZTU4YWJmYS4uYTZhOTMxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9mZHQuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2ZkdC5jCkBAIC0xNTIsNiArMTUyLDI3IEBACiAjZGVmaW5lIEVGSV9GRFRfQUxJR04gRUZJX1BBR0VfU0laRQogI2VuZGlmCiAKK3N0cnVjdCBleGl0X2Jvb3Rfc3RydWN0IHsKKwllZmlfbWVtb3J5X2Rlc2NfdCAqcnVudGltZV9tYXA7CisJaW50ICpydW50aW1lX2VudHJ5X2NvdW50OworfTsKKworc3RhdGljIGVmaV9zdGF0dXNfdCBleGl0X2Jvb3RfZnVuYyhlZmlfc3lzdGVtX3RhYmxlX3QgKnN5c190YWJsZV9hcmcsCisJCQkJICAgc3RydWN0IGVmaV9ib290X21lbW1hcCAqbWFwLAorCQkJCSAgIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGV4aXRfYm9vdF9zdHJ1Y3QgKnAgPSBwcml2OworCS8qCisJICogVXBkYXRlIHRoZSBtZW1vcnkgbWFwIHdpdGggdmlydHVhbCBhZGRyZXNzZXMuIFRoZSBmdW5jdGlvbiB3aWxsIGFsc28KKwkgKiBwb3B1bGF0ZSBAcnVudGltZV9tYXAgd2l0aCBjb3BpZXMgb2YganVzdCB0aGUgRUZJX01FTU9SWV9SVU5USU1FCisJICogZW50cmllcyBzbyB0aGF0IHdlIGNhbiBwYXNzIGl0IHN0cmFpZ2h0IHRvIFNldFZpcnR1YWxBZGRyZXNzTWFwKCkKKwkgKi8KKwllZmlfZ2V0X3ZpcnRtYXAoKm1hcC0+bWFwLCAqbWFwLT5tYXBfc2l6ZSwgKm1hcC0+ZGVzY19zaXplLAorCQkJcC0+cnVudGltZV9tYXAsIHAtPnJ1bnRpbWVfZW50cnlfY291bnQpOworCisJcmV0dXJuIEVGSV9TVUNDRVNTOworfQorCiAvKgogICogQWxsb2NhdGUgbWVtb3J5IGZvciBhIG5ldyBGRFQsIHRoZW4gYWRkIEVGSSwgY29tbWFuZGxpbmUsIGFuZAogICogaW5pdHJkIHJlbGF0ZWQgZmllbGRzIHRvIHRoZSBGRFQuICBUaGlzIHJvdXRpbmUgaW5jcmVhc2VzIHRoZQpAQCAtMTc1LDEzICsxOTYsMjIgQEAKIAkJCQkJICAgIHVuc2lnbmVkIGxvbmcgZmR0X2FkZHIsCiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIGZkdF9zaXplKQogewotCXVuc2lnbmVkIGxvbmcgbWFwX3NpemUsIGRlc2Nfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG1hcF9zaXplLCBkZXNjX3NpemUsIGJ1ZmZfc2l6ZTsKIAl1MzIgZGVzY192ZXI7CiAJdW5zaWduZWQgbG9uZyBtbWFwX2tleTsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWVtb3J5X21hcCwgKnJ1bnRpbWVfbWFwOwogCXVuc2lnbmVkIGxvbmcgbmV3X2ZkdF9zaXplOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAJaW50IHJ1bnRpbWVfZW50cnlfY291bnQgPSAwOworCXN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgbWFwOworCXN0cnVjdCBleGl0X2Jvb3Rfc3RydWN0IHByaXY7CisKKwltYXAubWFwID0JJnJ1bnRpbWVfbWFwOworCW1hcC5tYXBfc2l6ZSA9CSZtYXBfc2l6ZTsKKwltYXAuZGVzY19zaXplID0JJmRlc2Nfc2l6ZTsKKwltYXAuZGVzY192ZXIgPQkmZGVzY192ZXI7CisJbWFwLmtleV9wdHIgPQkmbW1hcF9rZXk7CisJbWFwLmJ1ZmZfc2l6ZSA9CSZidWZmX3NpemU7CiAKIAkvKgogCSAqIEdldCBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgbWVtb3J5IG1hcCB0aGF0IHdlIHdpbGwgdXNlIHRvIHByZXBhcmUKQEAgLTE4OSw4ICsyMTksNyBAQAogCSAqIHN1YnNlcXVlbnQgYWxsb2NhdGlvbnMgYWRkaW5nIGVudHJpZXMsIHNpbmNlIHRoZXkgY291bGQgbm90IGFmZmVjdAogCSAqIHRoZSBudW1iZXIgb2YgRUZJX01FTU9SWV9SVU5USU1FIHJlZ2lvbnMuCiAJICovCi0Jc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZSwgJnJ1bnRpbWVfbWFwLCAmbWFwX3NpemUsCi0JCQkJICAgICZkZXNjX3NpemUsICZkZXNjX3ZlciwgJm1tYXBfa2V5KTsKKwlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlLCAmbWFwKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CiAJCXByX2VmaV9lcnIoc3lzX3RhYmxlLCAiVW5hYmxlIHRvIHJldHJpZXZlIFVFRkkgbWVtb3J5IG1hcC5cbiIpOwogCQlyZXR1cm4gc3RhdHVzOwpAQCAtMTk5LDYgKzIyOCw3IEBACiAJcHJfZWZpKHN5c190YWJsZSwKIAkgICAgICAgIkV4aXRpbmcgYm9vdCBzZXJ2aWNlcyBhbmQgaW5zdGFsbGluZyB2aXJ0dWFsIGFkZHJlc3MgbWFwLi4uXG4iKTsKIAorCW1hcC5tYXAgPSAmbWVtb3J5X21hcDsKIAkvKgogCSAqIEVzdGltYXRlIHNpemUgb2YgbmV3IEZEVCwgYW5kIGFsbG9jYXRlIG1lbW9yeSBmb3IgaXQuIFdlCiAJICogd2lsbCBhbGxvY2F0ZSBhIGJpZ2dlciBidWZmZXIgaWYgdGhpcyBlbmRzIHVwIGJlaW5nIHRvbwpAQCAtMjE4LDggKzI0OCw3IEBACiAJCSAqIHdlIGNhbiBnZXQgdGhlIG1lbW9yeSBtYXAga2V5ICBuZWVkZWQgZm9yCiAJCSAqIGV4aXRfYm9vdF9zZXJ2aWNlcygpLgogCQkgKi8KLQkJc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZSwgJm1lbW9yeV9tYXAsICZtYXBfc2l6ZSwKLQkJCQkJICAgICZkZXNjX3NpemUsICZkZXNjX3ZlciwgJm1tYXBfa2V5KTsKKwkJc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZSwgJm1hcCk7CiAJCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCiAJCQlnb3RvIGZhaWxfZnJlZV9uZXdfZmR0OwogCkBAIC0yNTAsMTYgKzI3OSwxMSBAQAogCQl9CiAJfQogCi0JLyoKLQkgKiBVcGRhdGUgdGhlIG1lbW9yeSBtYXAgd2l0aCB2aXJ0dWFsIGFkZHJlc3Nlcy4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxzbwotCSAqIHBvcHVsYXRlIEBydW50aW1lX21hcCB3aXRoIGNvcGllcyBvZiBqdXN0IHRoZSBFRklfTUVNT1JZX1JVTlRJTUUKLQkgKiBlbnRyaWVzIHNvIHRoYXQgd2UgY2FuIHBhc3MgaXQgc3RyYWlnaHQgaW50byBTZXRWaXJ0dWFsQWRkcmVzc01hcCgpCi0JICovCi0JZWZpX2dldF92aXJ0bWFwKG1lbW9yeV9tYXAsIG1hcF9zaXplLCBkZXNjX3NpemUsIHJ1bnRpbWVfbWFwLAotCQkJJnJ1bnRpbWVfZW50cnlfY291bnQpOwotCi0JLyogTm93IHdlIGFyZSByZWFkeSB0byBleGl0X2Jvb3Rfc2VydmljZXMuKi8KLQlzdGF0dXMgPSBzeXNfdGFibGUtPmJvb3R0aW1lLT5leGl0X2Jvb3Rfc2VydmljZXMoaGFuZGxlLCBtbWFwX2tleSk7CisJc3lzX3RhYmxlLT5ib290dGltZS0+ZnJlZV9wb29sKG1lbW9yeV9tYXApOworCXByaXYucnVudGltZV9tYXAgPSBydW50aW1lX21hcDsKKwlwcml2LnJ1bnRpbWVfZW50cnlfY291bnQgPSAmcnVudGltZV9lbnRyeV9jb3VudDsKKwlzdGF0dXMgPSBlZmlfZXhpdF9ib290X3NlcnZpY2VzKHN5c190YWJsZSwgaGFuZGxlLCAmbWFwLCAmcHJpdiwKKwkJCQkJZXhpdF9ib290X2Z1bmMpOwogCiAJaWYgKHN0YXR1cyA9PSBFRklfU1VDQ0VTUykgewogCQllZmlfc2V0X3ZpcnR1YWxfYWRkcmVzc19tYXBfdCAqc3ZhbTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvcmFuZG9tLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL3JhbmRvbS5jCmluZGV4IDUzZjZkM2YuLjBjOWY1OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvcmFuZG9tLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9yYW5kb20uYwpAQCAtNzMsMTIgKzczLDIwIEBACiAJCQkgICAgICB1bnNpZ25lZCBsb25nIHJhbmRvbV9zZWVkKQogewogCXVuc2lnbmVkIGxvbmcgbWFwX3NpemUsIGRlc2Nfc2l6ZSwgdG90YWxfc2xvdHMgPSAwLCB0YXJnZXRfc2xvdDsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZfc2l6ZTsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCWVmaV9tZW1vcnlfZGVzY190ICptZW1vcnlfbWFwOwogCWludCBtYXBfb2Zmc2V0OworCXN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgbWFwOwogCi0Jc3RhdHVzID0gZWZpX2dldF9tZW1vcnlfbWFwKHN5c190YWJsZV9hcmcsICZtZW1vcnlfbWFwLCAmbWFwX3NpemUsCi0JCQkJICAgICZkZXNjX3NpemUsIE5VTEwsIE5VTEwpOworCW1hcC5tYXAgPQkmbWVtb3J5X21hcDsKKwltYXAubWFwX3NpemUgPQkmbWFwX3NpemU7CisJbWFwLmRlc2Nfc2l6ZSA9CSZkZXNjX3NpemU7CisJbWFwLmRlc2NfdmVyID0JTlVMTDsKKwltYXAua2V5X3B0ciA9CU5VTEw7CisJbWFwLmJ1ZmZfc2l6ZSA9CSZidWZmX3NpemU7CisKKwlzdGF0dXMgPSBlZmlfZ2V0X21lbW9yeV9tYXAoc3lzX3RhYmxlX2FyZywgJm1hcCk7CiAJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKIAkJcmV0dXJuIHN0YXR1czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvbWVtbWFwLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9tZW1tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDNkZGVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvbWVtbWFwLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBDb21tb24gRUZJIG1lbW9yeSBtYXAgZnVuY3Rpb25zLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgImVmaTogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9lYXJseV9pb3JlbWFwLmg+CisKKy8qKgorICogX19lZmlfbWVtbWFwX2luaXQgLSBDb21tb24gY29kZSBmb3IgbWFwcGluZyB0aGUgRUZJIG1lbW9yeSBtYXAKKyAqIEBkYXRhOiBFRkkgbWVtb3J5IG1hcCBkYXRhCisgKiBAbGF0ZTogVXNlIGVhcmx5IG9yIGxhdGUgbWFwcGluZyBmdW5jdGlvbj8KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgZmlndXJpbmcgb3V0IHdoaWNoIGZ1bmN0aW9uIHRvIHVzZSB0bworICogbWFwIHRoZSBFRkkgbWVtb3J5IG1hcCBpbiBlZmkubWVtbWFwIGJhc2VkIG9uIGhvdyBmYXIgaW50byB0aGUgYm9vdAorICogd2UgYXJlLgorICoKKyAqIER1cmluZyBib290dXAgQGxhdGUgc2hvdWxkIGJlICVmYWxzZSBzaW5jZSB3ZSBvbmx5IGhhdmUgYWNjZXNzIHRvCisgKiB0aGUgZWFybHlfbWVtcmVtYXAqKCkgZnVuY3Rpb25zIGFzIHRoZSB2bWFsbG9jIHNwYWNlIGlzbid0IHNldHVwLgorICogT25jZSB0aGUga2VybmVsIGlzIGZ1bGx5IGJvb3RlZCB3ZSBjYW4gZmFsbGJhY2sgdG8gdGhlIG1vcmUgcm9idXN0CisgKiBtZW1yZW1hcCooKSBBUEkuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9faW5pdAorX19lZmlfbWVtbWFwX2luaXQoc3RydWN0IGVmaV9tZW1vcnlfbWFwX2RhdGEgKmRhdGEsIGJvb2wgbGF0ZSkKK3sKKwlzdHJ1Y3QgZWZpX21lbW9yeV9tYXAgbWFwOworCXBoeXNfYWRkcl90IHBoeXNfbWFwOworCisJaWYgKGVmaV9lbmFibGVkKEVGSV9QQVJBVklSVCkpCisJCXJldHVybiAwOworCisJcGh5c19tYXAgPSBkYXRhLT5waHlzX21hcDsKKworCWlmIChsYXRlKQorCQltYXAubWFwID0gbWVtcmVtYXAocGh5c19tYXAsIGRhdGEtPnNpemUsIE1FTVJFTUFQX1dCKTsKKwllbHNlCisJCW1hcC5tYXAgPSBlYXJseV9tZW1yZW1hcChwaHlzX21hcCwgZGF0YS0+c2l6ZSk7CisKKwlpZiAoIW1hcC5tYXApIHsKKwkJcHJfZXJyKCJDb3VsZCBub3QgbWFwIHRoZSBtZW1vcnkgbWFwIVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1hcC5waHlzX21hcCA9IGRhdGEtPnBoeXNfbWFwOworCW1hcC5ucl9tYXAgPSBkYXRhLT5zaXplIC8gZGF0YS0+ZGVzY19zaXplOworCW1hcC5tYXBfZW5kID0gbWFwLm1hcCArIGRhdGEtPnNpemU7CisKKwltYXAuZGVzY192ZXJzaW9uID0gZGF0YS0+ZGVzY192ZXJzaW9uOworCW1hcC5kZXNjX3NpemUgPSBkYXRhLT5kZXNjX3NpemU7CisJbWFwLmxhdGUgPSBsYXRlOworCisJc2V0X2JpdChFRklfTUVNTUFQLCAmZWZpLmZsYWdzKTsKKworCWVmaS5tZW1tYXAgPSBtYXA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlZmlfbWVtbWFwX2luaXRfZWFybHkgLSBNYXAgdGhlIEVGSSBtZW1vcnkgbWFwIGRhdGEgc3RydWN0dXJlCisgKiBAZGF0YTogRUZJIG1lbW9yeSBtYXAgZGF0YQorICoKKyAqIFVzZSBlYXJseV9tZW1yZW1hcCgpIHRvIG1hcCB0aGUgcGFzc2VkIGluIEVGSSBtZW1vcnkgbWFwIGFuZCBhc3NpZ24KKyAqIGl0IHRvIGVmaS5tZW1tYXAuCisgKi8KK2ludCBfX2luaXQgZWZpX21lbW1hcF9pbml0X2Vhcmx5KHN0cnVjdCBlZmlfbWVtb3J5X21hcF9kYXRhICpkYXRhKQoreworCS8qIENhbm5vdCBnbyBiYWNrd2FyZHMgKi8KKwlXQVJOX09OKGVmaS5tZW1tYXAubGF0ZSk7CisKKwlyZXR1cm4gX19lZmlfbWVtbWFwX2luaXQoZGF0YSwgZmFsc2UpOworfQorCit2b2lkIF9faW5pdCBlZmlfbWVtbWFwX3VubWFwKHZvaWQpCit7CisJaWYgKCFlZmkubWVtbWFwLmxhdGUpIHsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCisJCXNpemUgPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZSAqIGVmaS5tZW1tYXAubnJfbWFwOworCQllYXJseV9tZW11bm1hcChlZmkubWVtbWFwLm1hcCwgc2l6ZSk7CisJfSBlbHNlIHsKKwkJbWVtdW5tYXAoZWZpLm1lbW1hcC5tYXApOworCX0KKworCWVmaS5tZW1tYXAubWFwID0gTlVMTDsKKwljbGVhcl9iaXQoRUZJX01FTU1BUCwgJmVmaS5mbGFncyk7Cit9CisKKy8qKgorICogZWZpX21lbW1hcF9pbml0X2xhdGUgLSBNYXAgZWZpLm1lbW1hcCB3aXRoIG1lbXJlbWFwKCkKKyAqIEBwaHlzX2FkZHI6IFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG5ldyBFRkkgbWVtb3J5IG1hcAorICogQHNpemU6IFNpemUgaW4gYnl0ZXMgb2YgdGhlIG5ldyBFRkkgbWVtb3J5IG1hcAorICoKKyAqIFNldHVwIGEgbWFwcGluZyBvZiB0aGUgRUZJIG1lbW9yeSBtYXAgdXNpbmcgaW9yZW1hcF9jYWNoZSgpLiBUaGlzCisgKiBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSB0aGUgdm1hbGxvYyBzcGFjZSBoYXMgYmVlbgorICogc2V0dXAgYW5kIGlzIHRoZXJlZm9yZSBub3Qgc3VpdGFibGUgZm9yIGNhbGxpbmcgZHVyaW5nIGVhcmx5IEVGSQorICogaW5pdGlhbGlzZSwgZS5nLiBpbiBlZmlfaW5pdCgpLiBBZGRpdGlvbmFsbHksIGl0IGV4cGVjdHMKKyAqIGVmaV9tZW1tYXBfaW5pdF9lYXJseSgpIHRvIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZC4KKyAqCisgKiBUaGUgcmVhc29uIHRoZXJlIGFyZSB0d28gRUZJIG1lbW1hcCBpbml0aWFsaXNhdGlvbgorICogKGVmaV9tZW1tYXBfaW5pdF9lYXJseSgpIGFuZCB0aGlzIGxhdGUgdmVyc2lvbikgaXMgYmVjYXVzZSB0aGUKKyAqIGVhcmx5IEVGSSBtZW1tYXAgc2hvdWxkIGJlIGV4cGxpY2l0bHkgdW5tYXBwZWQgb25jZSBFRkkKKyAqIGluaXRpYWxpc2F0aW9uIGlzIGNvbXBsZXRlIGFzIHRoZSBmaXhtYXAgc3BhY2UgdXNlZCB0byBtYXAgdGhlIEVGSQorICogbWVtbWFwICh2aWEgZWFybHlfbWVtcmVtYXAoKSkgaXMgYSBzY2FyY2UgcmVzb3VyY2UuCisgKgorICogVGhpcyBsYXRlIG1hcHBpbmcgaXMgaW50ZW5kZWQgdG8gcGVyc2lzdCBmb3IgdGhlIGR1cmF0aW9uIG9mCisgKiBydW50aW1lIHNvIHRoYXQgdGhpbmdzIGxpa2UgZWZpX21lbV9kZXNjX2xvb2t1cCgpIGFuZAorICogZWZpX21lbV9hdHRyaWJ1dGVzKCkgYWx3YXlzIHdvcmsuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgX19pbml0IGVmaV9tZW1tYXBfaW5pdF9sYXRlKHBoeXNfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3QgZWZpX21lbW9yeV9tYXBfZGF0YSBkYXRhID0geworCQkucGh5c19tYXAgPSBhZGRyLAorCQkuc2l6ZSA9IHNpemUsCisJfTsKKworCS8qIERpZCB3ZSBmb3JnZXQgdG8gdW5tYXAgdGhlIGVhcmx5IEVGSSBtZW1tYXA/ICovCisJV0FSTl9PTihlZmkubWVtbWFwLm1hcCk7CisKKwkvKiBXZXJlIHdlIGFscmVhZHkgY2FsbGVkPyAqLworCVdBUk5fT04oZWZpLm1lbW1hcC5sYXRlKTsKKworCS8qCisJICogSXQgbWFrZXMgbm8gc2Vuc2UgdG8gYWxsb3cgY2FsbGVycyB0byByZWdpc3RlciBkaWZmZXJlbnQKKwkgKiB2YWx1ZXMgZm9yIHRoZSBmb2xsb3dpbmcgZmllbGRzLiBDb3B5IHRoZW0gb3V0IG9mIHRoZQorCSAqIGV4aXN0aW5nIGVhcmx5IEVGSSBtZW1tYXAuCisJICovCisJZGF0YS5kZXNjX3ZlcnNpb24gPSBlZmkubWVtbWFwLmRlc2NfdmVyc2lvbjsKKwlkYXRhLmRlc2Nfc2l6ZSA9IGVmaS5tZW1tYXAuZGVzY19zaXplOworCisJcmV0dXJuIF9fZWZpX21lbW1hcF9pbml0KCZkYXRhLCB0cnVlKTsKK30KKworLyoqCisgKiBlZmlfbWVtbWFwX2luc3RhbGwgLSBJbnN0YWxsIGEgbmV3IEVGSSBtZW1vcnkgbWFwIGluIGVmaS5tZW1tYXAKKyAqIEBhZGRyOiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgbWFwCisgKiBAbnJfbWFwOiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbWVtb3J5IG1hcAorICoKKyAqIFVubGlrZSBlZmlfbWVtbWFwX2luaXRfKigpLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsbG93IHRoZSBjYWxsZXIKKyAqIHRvIHN3aXRjaCBmcm9tIGVhcmx5IHRvIGxhdGUgbWFwcGluZ3MuIEl0IHNpbXBseSB1c2VzIHRoZSBleGlzdGluZworICogbWFwcGluZyBmdW5jdGlvbiBhbmQgaW5zdGFsbHMgdGhlIG5ldyBtZW1tYXAuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgX19pbml0IGVmaV9tZW1tYXBfaW5zdGFsbChwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBpbnQgbnJfbWFwKQoreworCXN0cnVjdCBlZmlfbWVtb3J5X21hcF9kYXRhIGRhdGE7CisKKwllZmlfbWVtbWFwX3VubWFwKCk7CisKKwlkYXRhLnBoeXNfbWFwID0gYWRkcjsKKwlkYXRhLnNpemUgPSBlZmkubWVtbWFwLmRlc2Nfc2l6ZSAqIG5yX21hcDsKKwlkYXRhLmRlc2NfdmVyc2lvbiA9IGVmaS5tZW1tYXAuZGVzY192ZXJzaW9uOworCWRhdGEuZGVzY19zaXplID0gZWZpLm1lbW1hcC5kZXNjX3NpemU7CisKKwlyZXR1cm4gX19lZmlfbWVtbWFwX2luaXQoJmRhdGEsIGVmaS5tZW1tYXAubGF0ZSk7Cit9CisKKy8qKgorICogZWZpX21lbW1hcF9zcGxpdF9jb3VudCAtIENvdW50IG51bWJlciBvZiBhZGRpdGlvbmFsIEVGSSBtZW1tYXAgZW50cmllcworICogQG1kOiBFRkkgbWVtb3J5IGRlc2NyaXB0b3IgdG8gc3BsaXQKKyAqIEByYW5nZTogQWRkcmVzcyByYW5nZSAoc3RhcnQsIGVuZCkgdG8gc3BsaXQgYXJvdW5kCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgRUZJIG1lbW1hcCBlbnRyaWVzIHJlcXVpcmVkIHRvCisgKiBhY2NvbW9kYXRlIEByYW5nZS4KKyAqLworaW50IF9faW5pdCBlZmlfbWVtbWFwX3NwbGl0X2NvdW50KGVmaV9tZW1vcnlfZGVzY190ICptZCwgc3RydWN0IHJhbmdlICpyYW5nZSkKK3sKKwl1NjQgbV9zdGFydCwgbV9lbmQ7CisJdTY0IHN0YXJ0LCBlbmQ7CisJaW50IGNvdW50ID0gMDsKKworCXN0YXJ0ID0gbWQtPnBoeXNfYWRkcjsKKwllbmQgPSBzdGFydCArIChtZC0+bnVtX3BhZ2VzIDw8IEVGSV9QQUdFX1NISUZUKSAtIDE7CisKKwkvKiBtb2RpZnlpbmcgcmFuZ2UgKi8KKwltX3N0YXJ0ID0gcmFuZ2UtPnN0YXJ0OworCW1fZW5kID0gcmFuZ2UtPmVuZDsKKworCWlmIChtX3N0YXJ0IDw9IHN0YXJ0KSB7CisJCS8qIHNwbGl0IGludG8gMiBwYXJ0cyAqLworCQlpZiAoc3RhcnQgPCBtX2VuZCAmJiBtX2VuZCA8IGVuZCkKKwkJCWNvdW50Kys7CisJfQorCisJaWYgKHN0YXJ0IDwgbV9zdGFydCAmJiBtX3N0YXJ0IDwgZW5kKSB7CisJCS8qIHNwbGl0IGludG8gMyBwYXJ0cyAqLworCQlpZiAobV9lbmQgPCBlbmQpCisJCQljb3VudCArPSAyOworCQkvKiBzcGxpdCBpbnRvIDIgcGFydHMgKi8KKwkJaWYgKGVuZCA8PSBtX2VuZCkKKwkJCWNvdW50Kys7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqIGVmaV9tZW1tYXBfaW5zZXJ0IC0gSW5zZXJ0IGEgbWVtb3J5IHJlZ2lvbiBpbiBhbiBFRkkgbWVtbWFwCisgKiBAb2xkX21lbW1hcDogVGhlIGV4aXN0aW5nIEVGSSBtZW1vcnkgbWFwIHN0cnVjdHVyZQorICogQGJ1ZjogQWRkcmVzcyBvZiBidWZmZXIgdG8gc3RvcmUgbmV3IG1hcAorICogQG1lbTogTWVtb3J5IG1hcCBlbnRyeSB0byBpbnNlcnQKKyAqCisgKiBJdCBpcyBzdWdnZXN0ZWQgdGhhdCB5b3UgY2FsbCBlZmlfbWVtbWFwX3NwbGl0X2NvdW50KCkgZmlyc3QKKyAqIHRvIHNlZSBob3cgbGFyZ2UgQGJ1ZiBuZWVkcyB0byBiZS4KKyAqLwordm9pZCBfX2luaXQgZWZpX21lbW1hcF9pbnNlcnQoc3RydWN0IGVmaV9tZW1vcnlfbWFwICpvbGRfbWVtbWFwLCB2b2lkICpidWYsCisJCQkgICAgICBzdHJ1Y3QgZWZpX21lbV9yYW5nZSAqbWVtKQoreworCXU2NCBtX3N0YXJ0LCBtX2VuZCwgbV9hdHRyOworCWVmaV9tZW1vcnlfZGVzY190ICptZDsKKwl1NjQgc3RhcnQsIGVuZDsKKwl2b2lkICpvbGQsICpuZXc7CisKKwkvKiBtb2RpZnlpbmcgcmFuZ2UgKi8KKwltX3N0YXJ0ID0gbWVtLT5yYW5nZS5zdGFydDsKKwltX2VuZCA9IG1lbS0+cmFuZ2UuZW5kOworCW1fYXR0ciA9IG1lbS0+YXR0cmlidXRlOworCisJLyoKKwkgKiBUaGUgRUZJIG1lbW9yeSBtYXAgZGVhbHMgd2l0aCByZWdpb25zIGluIEVGSV9QQUdFX1NJWkUKKwkgKiB1bml0cy4gRW5zdXJlIHRoYXQgdGhlIHJlZ2lvbiBkZXNjcmliZWQgYnkgJ21lbScgaXMgYWxpZ25lZAorCSAqIGNvcnJlY3RseS4KKwkgKi8KKwlpZiAoIUlTX0FMSUdORUQobV9zdGFydCwgRUZJX1BBR0VfU0laRSkgfHwKKwkgICAgIUlTX0FMSUdORUQobV9lbmQgKyAxLCBFRklfUEFHRV9TSVpFKSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCisJZm9yIChvbGQgPSBvbGRfbWVtbWFwLT5tYXAsIG5ldyA9IGJ1ZjsKKwkgICAgIG9sZCA8IG9sZF9tZW1tYXAtPm1hcF9lbmQ7CisJICAgICBvbGQgKz0gb2xkX21lbW1hcC0+ZGVzY19zaXplLCBuZXcgKz0gb2xkX21lbW1hcC0+ZGVzY19zaXplKSB7CisKKwkJLyogY29weSBvcmlnaW5hbCBFRkkgbWVtb3J5IGRlc2NyaXB0b3IgKi8KKwkJbWVtY3B5KG5ldywgb2xkLCBvbGRfbWVtbWFwLT5kZXNjX3NpemUpOworCQltZCA9IG5ldzsKKwkJc3RhcnQgPSBtZC0+cGh5c19hZGRyOworCQllbmQgPSBtZC0+cGh5c19hZGRyICsgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpIC0gMTsKKworCQlpZiAobV9zdGFydCA8PSBzdGFydCAmJiBlbmQgPD0gbV9lbmQpCisJCQltZC0+YXR0cmlidXRlIHw9IG1fYXR0cjsKKworCQlpZiAobV9zdGFydCA8PSBzdGFydCAmJgorCQkgICAgKHN0YXJ0IDwgbV9lbmQgJiYgbV9lbmQgPCBlbmQpKSB7CisJCQkvKiBmaXJzdCBwYXJ0ICovCisJCQltZC0+YXR0cmlidXRlIHw9IG1fYXR0cjsKKwkJCW1kLT5udW1fcGFnZXMgPSAobV9lbmQgLSBtZC0+cGh5c19hZGRyICsgMSkgPj4KKwkJCQlFRklfUEFHRV9TSElGVDsKKwkJCS8qIGxhdHRlciBwYXJ0ICovCisJCQluZXcgKz0gb2xkX21lbW1hcC0+ZGVzY19zaXplOworCQkJbWVtY3B5KG5ldywgb2xkLCBvbGRfbWVtbWFwLT5kZXNjX3NpemUpOworCQkJbWQgPSBuZXc7CisJCQltZC0+cGh5c19hZGRyID0gbV9lbmQgKyAxOworCQkJbWQtPm51bV9wYWdlcyA9IChlbmQgLSBtZC0+cGh5c19hZGRyICsgMSkgPj4KKwkJCQlFRklfUEFHRV9TSElGVDsKKwkJfQorCisJCWlmICgoc3RhcnQgPCBtX3N0YXJ0ICYmIG1fc3RhcnQgPCBlbmQpICYmIG1fZW5kIDwgZW5kKSB7CisJCQkvKiBmaXJzdCBwYXJ0ICovCisJCQltZC0+bnVtX3BhZ2VzID0gKG1fc3RhcnQgLSBtZC0+cGh5c19hZGRyKSA+PgorCQkJCUVGSV9QQUdFX1NISUZUOworCQkJLyogbWlkZGxlIHBhcnQgKi8KKwkJCW5ldyArPSBvbGRfbWVtbWFwLT5kZXNjX3NpemU7CisJCQltZW1jcHkobmV3LCBvbGQsIG9sZF9tZW1tYXAtPmRlc2Nfc2l6ZSk7CisJCQltZCA9IG5ldzsKKwkJCW1kLT5hdHRyaWJ1dGUgfD0gbV9hdHRyOworCQkJbWQtPnBoeXNfYWRkciA9IG1fc3RhcnQ7CisJCQltZC0+bnVtX3BhZ2VzID0gKG1fZW5kIC0gbV9zdGFydCArIDEpID4+CisJCQkJRUZJX1BBR0VfU0hJRlQ7CisJCQkvKiBsYXN0IHBhcnQgKi8KKwkJCW5ldyArPSBvbGRfbWVtbWFwLT5kZXNjX3NpemU7CisJCQltZW1jcHkobmV3LCBvbGQsIG9sZF9tZW1tYXAtPmRlc2Nfc2l6ZSk7CisJCQltZCA9IG5ldzsKKwkJCW1kLT5waHlzX2FkZHIgPSBtX2VuZCArIDE7CisJCQltZC0+bnVtX3BhZ2VzID0gKGVuZCAtIG1fZW5kKSA+PgorCQkJCUVGSV9QQUdFX1NISUZUOworCQl9CisKKwkJaWYgKChzdGFydCA8IG1fc3RhcnQgJiYgbV9zdGFydCA8IGVuZCkgJiYKKwkJICAgIChlbmQgPD0gbV9lbmQpKSB7CisJCQkvKiBmaXJzdCBwYXJ0ICovCisJCQltZC0+bnVtX3BhZ2VzID0gKG1fc3RhcnQgLSBtZC0+cGh5c19hZGRyKSA+PgorCQkJCUVGSV9QQUdFX1NISUZUOworCQkJLyogbGF0dGVyIHBhcnQgKi8KKwkJCW5ldyArPSBvbGRfbWVtbWFwLT5kZXNjX3NpemU7CisJCQltZW1jcHkobmV3LCBvbGQsIG9sZF9tZW1tYXAtPmRlc2Nfc2l6ZSk7CisJCQltZCA9IG5ldzsKKwkJCW1kLT5waHlzX2FkZHIgPSBtX3N0YXJ0OworCQkJbWQtPm51bV9wYWdlcyA9IChlbmQgLSBtZC0+cGh5c19hZGRyICsgMSkgPj4KKwkJCQlFRklfUEFHRV9TSElGVDsKKwkJCW1kLT5hdHRyaWJ1dGUgfD0gbV9hdHRyOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvcnVudGltZS1tYXAuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3J1bnRpbWUtbWFwLmMKaW5kZXggNWM1NTIyNy4uOGU2NGI3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvcnVudGltZS1tYXAuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9ydW50aW1lLW1hcC5jCkBAIC0xNCwxMCArMTQsNiBAQAogCiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKLXN0YXRpYyB2b2lkICplZmlfcnVudGltZV9tYXA7Ci1zdGF0aWMgaW50IG5yX2VmaV9ydW50aW1lX21hcDsKLXN0YXRpYyB1MzIgZWZpX21lbWRlc2Nfc2l6ZTsKLQogc3RydWN0IGVmaV9ydW50aW1lX21hcF9lbnRyeSB7CiAJZWZpX21lbW9yeV9kZXNjX3QgbWQ7CiAJc3RydWN0IGtvYmplY3Qga29iajsgICAvKiBrb2JqZWN0IGZvciBlYWNoIGVudHJ5ICovCkBAIC0xMDYsNyArMTAyLDggQEAKIHN0YXRpYyBzdHJ1Y3Qga3NldCAqbWFwX2tzZXQ7CiAKIHN0YXRpYyBzdHJ1Y3QgZWZpX3J1bnRpbWVfbWFwX2VudHJ5ICoKLWFkZF9zeXNmc19ydW50aW1lX21hcF9lbnRyeShzdHJ1Y3Qga29iamVjdCAqa29iaiwgaW50IG5yKQorYWRkX3N5c2ZzX3J1bnRpbWVfbWFwX2VudHJ5KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBpbnQgbnIsCisJCQkgICAgZWZpX21lbW9yeV9kZXNjX3QgKm1kKQogewogCWludCByZXQ7CiAJc3RydWN0IGVmaV9ydW50aW1lX21hcF9lbnRyeSAqZW50cnk7CkBAIC0xMjQsOCArMTIxLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCi0JbWVtY3B5KCZlbnRyeS0+bWQsIGVmaV9ydW50aW1lX21hcCArIG5yICogZWZpX21lbWRlc2Nfc2l6ZSwKLQkgICAgICAgc2l6ZW9mKGVmaV9tZW1vcnlfZGVzY190KSk7CisJbWVtY3B5KCZlbnRyeS0+bWQsIG1kLCBzaXplb2YoZWZpX21lbW9yeV9kZXNjX3QpKTsKIAogCWtvYmplY3RfaW5pdCgmZW50cnktPmtvYmosICZtYXBfa3R5cGUpOwogCWVudHJ5LT5rb2JqLmtzZXQgPSBtYXBfa3NldDsKQEAgLTE0MiwxMiArMTM4LDEyIEBACiAKIGludCBlZmlfZ2V0X3J1bnRpbWVfbWFwX3NpemUodm9pZCkKIHsKLQlyZXR1cm4gbnJfZWZpX3J1bnRpbWVfbWFwICogZWZpX21lbWRlc2Nfc2l6ZTsKKwlyZXR1cm4gZWZpLm1lbW1hcC5ucl9tYXAgKiBlZmkubWVtbWFwLmRlc2Nfc2l6ZTsKIH0KIAogaW50IGVmaV9nZXRfcnVudGltZV9tYXBfZGVzY19zaXplKHZvaWQpCiB7Ci0JcmV0dXJuIGVmaV9tZW1kZXNjX3NpemU7CisJcmV0dXJuIGVmaS5tZW1tYXAuZGVzY19zaXplOwogfQogCiBpbnQgZWZpX3J1bnRpbWVfbWFwX2NvcHkodm9pZCAqYnVmLCBzaXplX3QgYnVmc3opCkBAIC0xNTcsMzggKzE1MywzMyBAQAogCWlmIChzeiA+IGJ1ZnN6KQogCQlzeiA9IGJ1ZnN6OwogCi0JbWVtY3B5KGJ1ZiwgZWZpX3J1bnRpbWVfbWFwLCBzeik7CisJbWVtY3B5KGJ1ZiwgZWZpLm1lbW1hcC5tYXAsIHN6KTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBlZmlfcnVudGltZV9tYXBfc2V0dXAodm9pZCAqbWFwLCBpbnQgbnJfZW50cmllcywgdTMyIGRlc2Nfc2l6ZSkKLXsKLQllZmlfcnVudGltZV9tYXAgPSBtYXA7Ci0JbnJfZWZpX3J1bnRpbWVfbWFwID0gbnJfZW50cmllczsKLQllZmlfbWVtZGVzY19zaXplID0gZGVzY19zaXplOwotfQotCiBpbnQgX19pbml0IGVmaV9ydW50aW1lX21hcF9pbml0KHN0cnVjdCBrb2JqZWN0ICplZmlfa29iaikKIHsKIAlpbnQgaSwgaiwgcmV0ID0gMDsKIAlzdHJ1Y3QgZWZpX3J1bnRpbWVfbWFwX2VudHJ5ICplbnRyeTsKKwllZmlfbWVtb3J5X2Rlc2NfdCAqbWQ7CiAKLQlpZiAoIWVmaV9ydW50aW1lX21hcCkKKwlpZiAoIWVmaV9lbmFibGVkKEVGSV9NRU1NQVApKQogCQlyZXR1cm4gMDsKIAotCW1hcF9lbnRyaWVzID0ga3phbGxvYyhucl9lZmlfcnVudGltZV9tYXAgKiBzaXplb2YoZW50cnkpLCBHRlBfS0VSTkVMKTsKKwltYXBfZW50cmllcyA9IGt6YWxsb2MoZWZpLm1lbW1hcC5ucl9tYXAgKiBzaXplb2YoZW50cnkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1hcF9lbnRyaWVzKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBucl9lZmlfcnVudGltZV9tYXA7IGkrKykgewotCQllbnRyeSA9IGFkZF9zeXNmc19ydW50aW1lX21hcF9lbnRyeShlZmlfa29iaiwgaSk7CisJaSA9IDA7CisJZm9yX2VhY2hfZWZpX21lbW9yeV9kZXNjKG1kKSB7CisJCWVudHJ5ID0gYWRkX3N5c2ZzX3J1bnRpbWVfbWFwX2VudHJ5KGVmaV9rb2JqLCBpLCBtZCk7CiAJCWlmIChJU19FUlIoZW50cnkpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGVudHJ5KTsKIAkJCWdvdG8gb3V0X2FkZF9lbnRyeTsKIAkJfQotCQkqKG1hcF9lbnRyaWVzICsgaSkgPSBlbnRyeTsKKwkJKihtYXBfZW50cmllcyArIGkrKykgPSBlbnRyeTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL3J1bnRpbWUtd3JhcHBlcnMuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3J1bnRpbWUtd3JhcHBlcnMuYwppbmRleCA0MTk1ODc3Li5hZTU0ODcwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvcnVudGltZS13cmFwcGVycy5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3J1bnRpbWUtd3JhcHBlcnMuYwpAQCAtMTQsMTEgKzE0LDEzIEBACiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkJImVmaTogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogI2luY2x1ZGUgPGFzbS9lZmkuaD4KIApAQCAtODEsMjAgKzgzLDIxIEBACiAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgKgogICogRHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIEVGSSBwc3RvcmUgbWF5IHdyaXRlIHRvIHRoZSB2YXJpYWJsZSBzdG9yZSBpbgotICogaW50ZXJydXB0IGNvbnRleHQsIHdlIG5lZWQgdG8gdXNlIGEgc3BpbmxvY2sgZm9yIGF0IGxlYXN0IHRoZSBncm91cHMgdGhhdAorICogaW50ZXJydXB0IGNvbnRleHQsIHdlIG5lZWQgdG8gdXNlIGEgbG9jayBmb3IgYXQgbGVhc3QgdGhlIGdyb3VwcyB0aGF0CiAgKiBjb250YWluIFNldFZhcmlhYmxlKCkgYW5kIFF1ZXJ5VmFyaWFibGVJbmZvKCkuIFRoYXQgbGVhdmVzIGxpdHRsZSBlbHNlLCBhcwogICogbm9uZSBvZiB0aGUgcmVtYWluaW5nIGZ1bmN0aW9ucyBhcmUgYWN0dWFsbHkgZXZlciBjYWxsZWQgYXQgcnVudGltZS4KLSAqIFNvIGxldCdzIGp1c3QgdXNlIGEgc2luZ2xlIHNwaW5sb2NrIHRvIHNlcmlhbGl6ZSBhbGwgUnVudGltZSBTZXJ2aWNlcyBjYWxscy4KKyAqIFNvIGxldCdzIGp1c3QgdXNlIGEgc2luZ2xlIGxvY2sgdG8gc2VyaWFsaXplIGFsbCBSdW50aW1lIFNlcnZpY2VzIGNhbGxzLgogICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGVmaV9ydW50aW1lX2xvY2spOworc3RhdGljIERFRklORV9TRU1BUEhPUkUoZWZpX3J1bnRpbWVfbG9jayk7CiAKIHN0YXRpYyBlZmlfc3RhdHVzX3QgdmlydF9lZmlfZ2V0X3RpbWUoZWZpX3RpbWVfdCAqdG0sIGVmaV90aW1lX2NhcF90ICp0YykKIHsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkKKwkJcmV0dXJuIEVGSV9BQk9SVEVEOwogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQoZ2V0X3RpbWUsIHRtLCB0Yyk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xMDIsOSArMTA1LDEwIEBACiB7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpCisJCXJldHVybiBFRklfQUJPUlRFRDsKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KHNldF90aW1lLCB0bSk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xMTQsOSArMTE4LDEwIEBACiB7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpCisJCXJldHVybiBFRklfQUJPUlRFRDsKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KGdldF93YWtldXBfdGltZSwgZW5hYmxlZCwgcGVuZGluZywgdG0pOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTI0LDkgKzEyOSwxMCBAQAogewogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKQorCQlyZXR1cm4gRUZJX0FCT1JURUQ7CiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChzZXRfd2FrZXVwX3RpbWUsIGVuYWJsZWQsIHRtKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTEzOCwxMCArMTQ0LDExIEBACiB7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpCisJCXJldHVybiBFRklfQUJPUlRFRDsKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KGdldF92YXJpYWJsZSwgbmFtZSwgdmVuZG9yLCBhdHRyLCBkYXRhX3NpemUsCiAJCQkgICAgICAgZGF0YSk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNTEsOSArMTU4LDEwIEBACiB7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpCisJCXJldHVybiBFRklfQUJPUlRFRDsKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KGdldF9uZXh0X3ZhcmlhYmxlLCBuYW1lX3NpemUsIG5hbWUsIHZlbmRvcik7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNjUsMTAgKzE3MywxMSBAQAogewogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKQorCQlyZXR1cm4gRUZJX0FCT1JURUQ7CiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChzZXRfdmFyaWFibGUsIG5hbWUsIHZlbmRvciwgYXR0ciwgZGF0YV9zaXplLAogCQkJICAgICAgIGRhdGEpOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTc5LDEyICsxODgsMTIgQEAKIHsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0JaWYgKCFzcGluX3RyeWxvY2soJmVmaV9ydW50aW1lX2xvY2spKQorCWlmIChkb3duX3RyeWxvY2soJmVmaV9ydW50aW1lX2xvY2spKQogCQlyZXR1cm4gRUZJX05PVF9SRUFEWTsKIAogCXN0YXR1cyA9IGVmaV9jYWxsX3ZpcnQoc2V0X3ZhcmlhYmxlLCBuYW1lLCB2ZW5kb3IsIGF0dHIsIGRhdGFfc2l6ZSwKIAkJCSAgICAgICBkYXRhKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE5OSwxMCArMjA4LDExIEBACiAJaWYgKGVmaS5ydW50aW1lX3ZlcnNpb24gPCBFRklfMl8wMF9TWVNURU1fVEFCTEVfUkVWSVNJT04pCiAJCXJldHVybiBFRklfVU5TVVBQT1JURUQ7CiAKLQlzcGluX2xvY2soJmVmaV9ydW50aW1lX2xvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaV9ydW50aW1lX2xvY2spKQorCQlyZXR1cm4gRUZJX0FCT1JURUQ7CiAJc3RhdHVzID0gZWZpX2NhbGxfdmlydChxdWVyeV92YXJpYWJsZV9pbmZvLCBhdHRyLCBzdG9yYWdlX3NwYWNlLAogCQkJICAgICAgIHJlbWFpbmluZ19zcGFjZSwgbWF4X3ZhcmlhYmxlX3NpemUpOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjE3LDEyICsyMjcsMTIgQEAKIAlpZiAoZWZpLnJ1bnRpbWVfdmVyc2lvbiA8IEVGSV8yXzAwX1NZU1RFTV9UQUJMRV9SRVZJU0lPTikKIAkJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKIAotCWlmICghc3Bpbl90cnlsb2NrKCZlZmlfcnVudGltZV9sb2NrKSkKKwlpZiAoZG93bl90cnlsb2NrKCZlZmlfcnVudGltZV9sb2NrKSkKIAkJcmV0dXJuIEVGSV9OT1RfUkVBRFk7CiAKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KHF1ZXJ5X3ZhcmlhYmxlX2luZm8sIGF0dHIsIHN0b3JhZ2Vfc3BhY2UsCiAJCQkgICAgICAgcmVtYWluaW5nX3NwYWNlLCBtYXhfdmFyaWFibGVfc2l6ZSk7Ci0Jc3Bpbl91bmxvY2soJmVmaV9ydW50aW1lX2xvY2spOworCXVwKCZlZmlfcnVudGltZV9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yMzAsOSArMjQwLDEwIEBACiB7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpCisJCXJldHVybiBFRklfQUJPUlRFRDsKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KGdldF9uZXh0X2hpZ2hfbW9ub19jb3VudCwgY291bnQpOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjQxLDkgKzI1MiwxMyBAQAogCQkJCSAgdW5zaWduZWQgbG9uZyBkYXRhX3NpemUsCiAJCQkJICBlZmlfY2hhcjE2X3QgKmRhdGEpCiB7Ci0Jc3Bpbl9sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZmlfcnVudGltZV9sb2NrKSkgeworCQlwcl93YXJuKCJmYWlsZWQgdG8gaW52b2tlIHRoZSByZXNldF9zeXN0ZW0oKSBydW50aW1lIHNlcnZpY2U6XG4iCisJCQkiY291bGQgbm90IGdldCBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBmaXJtd2FyZVxuIik7CisJCXJldHVybjsKKwl9CiAJX19lZmlfY2FsbF92aXJ0KHJlc2V0X3N5c3RlbSwgcmVzZXRfdHlwZSwgc3RhdHVzLCBkYXRhX3NpemUsIGRhdGEpOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiB9CiAKIHN0YXRpYyBlZmlfc3RhdHVzX3QgdmlydF9lZmlfdXBkYXRlX2NhcHN1bGUoZWZpX2NhcHN1bGVfaGVhZGVyX3QgKipjYXBzdWxlcywKQEAgLTI1NSw5ICsyNzAsMTAgQEAKIAlpZiAoZWZpLnJ1bnRpbWVfdmVyc2lvbiA8IEVGSV8yXzAwX1NZU1RFTV9UQUJMRV9SRVZJU0lPTikKIAkJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKIAotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpCisJCXJldHVybiBFRklfQUJPUlRFRDsKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KHVwZGF0ZV9jYXBzdWxlLCBjYXBzdWxlcywgY291bnQsIHNnX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZlZmlfcnVudGltZV9sb2NrKTsKKwl1cCgmZWZpX3J1bnRpbWVfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjcxLDEwICsyODcsMTEgQEAKIAlpZiAoZWZpLnJ1bnRpbWVfdmVyc2lvbiA8IEVGSV8yXzAwX1NZU1RFTV9UQUJMRV9SRVZJU0lPTikKIAkJcmV0dXJuIEVGSV9VTlNVUFBPUlRFRDsKIAotCXNwaW5fbG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpX3J1bnRpbWVfbG9jaykpCisJCXJldHVybiBFRklfQUJPUlRFRDsKIAlzdGF0dXMgPSBlZmlfY2FsbF92aXJ0KHF1ZXJ5X2NhcHN1bGVfY2FwcywgY2Fwc3VsZXMsIGNvdW50LCBtYXhfc2l6ZSwKIAkJCSAgICAgICByZXNldF90eXBlKTsKLQlzcGluX3VubG9jaygmZWZpX3J1bnRpbWVfbG9jayk7CisJdXAoJmVmaV9ydW50aW1lX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL3Rlc3QvTWFrZWZpbGUgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS90ZXN0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZDQ1NzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS90ZXN0L01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19FRklfVEVTVCkJCQkrPSBlZmlfdGVzdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS90ZXN0L2VmaV90ZXN0LmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS90ZXN0L2VmaV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxYmI1MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3Rlc3QvZWZpX3Rlc3QuYwpAQCAtMCwwICsxLDc0OSBAQAorLyoKKyAqIEVGSSBUZXN0IERyaXZlciBmb3IgUnVudGltZSBTZXJ2aWNlcworICoKKyAqIENvcHlyaWdodChDKSAyMDEyLTIwMTYgQ2Fub25pY2FsIEx0ZC4KKyAqCisgKiBUaGlzIGRyaXZlciBleHBvcnRzIEVGSSBydW50aW1lIHNlcnZpY2VzIGludGVyZmFjZXMgaW50byB1c2Vyc3BhY2UsIHdoaWNoCisgKiBhbGxvdyB0byB1c2UgYW5kIHRlc3QgVUVGSSBydW50aW1lIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IGZpcm13YXJlLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJlZmlfdGVzdC5oIgorCitNT0RVTEVfQVVUSE9SKCJJdmFuIEh1IDxpdmFuLmh1QGNhbm9uaWNhbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVGSSBUZXN0IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogQ291bnQgdGhlIGJ5dGVzIGluICdzdHInLCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTEwuCisgKgorICogTm90ZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiAqYnl0ZXMqLCBub3QgdGhlIG51bWJlciBvZgorICogdWNzMiBjaGFyYWN0ZXJzLgorICovCitzdGF0aWMgaW5saW5lIHNpemVfdCB1c2VyX3VjczJfc3Ryc2l6ZShlZmlfY2hhcjE2X3QgIF9fdXNlciAqc3RyKQoreworCWVmaV9jaGFyMTZfdCAqcyA9IHN0ciwgYzsKKwlzaXplX3QgbGVuOworCisJaWYgKCFzdHIpCisJCXJldHVybiAwOworCisJLyogSW5jbHVkZSB0ZXJtaW5hdGluZyBOVUxMICovCisJbGVuID0gc2l6ZW9mKGVmaV9jaGFyMTZfdCk7CisKKwlpZiAoZ2V0X3VzZXIoYywgcysrKSkgeworCQkvKiBDYW4ndCByZWFkIHVzZXJzcGFjZSBtZW1vcnkgZm9yIHNpemUgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGMgIT0gMCkgeworCQlpZiAoZ2V0X3VzZXIoYywgcysrKSkgeworCQkJLyogQ2FuJ3QgcmVhZCB1c2Vyc3BhY2UgbWVtb3J5IGZvciBzaXplICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQlsZW4gKz0gc2l6ZW9mKGVmaV9jaGFyMTZfdCk7CisJfQorCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIGJ1ZmZlciBhbmQgY29weSBhIHVjczIgc3RyaW5nIGZyb20gdXNlciBzcGFjZSBpbnRvIGl0LgorICovCitzdGF0aWMgaW5saW5lIGludAorY29weV91Y3MyX2Zyb21fdXNlcl9sZW4oZWZpX2NoYXIxNl90ICoqZHN0LCBlZmlfY2hhcjE2X3QgX191c2VyICpzcmMsCisJCQlzaXplX3QgbGVuKQoreworCWVmaV9jaGFyMTZfdCAqYnVmOworCisJaWYgKCFzcmMpIHsKKwkJKmRzdCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQkqZHN0ID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCSpkc3QgPSBidWY7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoKmRzdCwgc3JjLCBsZW4pKSB7CisJCWtmcmVlKGJ1Zik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogQ291bnQgdGhlIGJ5dGVzIGluICdzdHInLCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTEwuCisgKgorICogSnVzdCBhIHdyYXAgZm9yIHVzZXJfdWNzMl9zdHJzaXplCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitnZXRfdWNzMl9zdHJzaXplX2Zyb21fdXNlcihlZmlfY2hhcjE2X3QgX191c2VyICpzcmMsIHNpemVfdCAqbGVuKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzcmMsIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCSpsZW4gPSB1c2VyX3VjczJfc3Ryc2l6ZShzcmMpOworCWlmICgqbGVuID09IDApCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIHJlcXVpcmVkIGJ1ZmZlciBhbGxvY2F0aW9uIHNpemUgYW5kIGNvcHkgYSB1Y3MyIHN0cmluZworICogZnJvbSB1c2VyIHNwYWNlIGludG8gaXQuCisgKgorICogVGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gY29weV91Y3MyX2Zyb21fdXNlcl9sZW4oKSBiZWNhdXNlIGl0CisgKiBjYWxjdWxhdGVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgdG8gYWxsb2NhdGUgYnkgdGFraW5nIHRoZSBsZW5ndGggb2YKKyAqIHRoZSBzdHJpbmcgJ3NyYycuCisgKgorICogSWYgYSBub24temVybyB2YWx1ZSBpcyByZXR1cm5lZCwgdGhlIGNhbGxlciBNVVNUIE5PVCBhY2Nlc3MgJ2RzdCcuCisgKgorICogSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZyZWUgJ2RzdCcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citjb3B5X3VjczJfZnJvbV91c2VyKGVmaV9jaGFyMTZfdCAqKmRzdCwgZWZpX2NoYXIxNl90IF9fdXNlciAqc3JjKQoreworCXNpemVfdCBsZW47CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3JjLCAxKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlsZW4gPSB1c2VyX3VjczJfc3Ryc2l6ZShzcmMpOworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIGNvcHlfdWNzMl9mcm9tX3VzZXJfbGVuKGRzdCwgc3JjLCBsZW4pOworfQorCisvKgorICogQ29weSBhIHVjczIgc3RyaW5nIHRvIGEgdXNlciBidWZmZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBjb3B5X3RvX3VzZXIoKSB0aGF0IGRvZXMKKyAqIG5vdGhpbmcgaWYgJ3NyYycgaXMgTlVMTCwgd2hpY2ggaXMgdXNlZnVsIGZvciByZWR1Y2luZyB0aGUgYW1vdW50IG9mCisgKiBOVUxMIGNoZWNraW5nIHRoZSBjYWxsZXIgaGFzIHRvIGRvLgorICoKKyAqICdsZW4nIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citjb3B5X3VjczJfdG9fdXNlcl9sZW4oZWZpX2NoYXIxNl90IF9fdXNlciAqZHN0LCBlZmlfY2hhcjE2X3QgKnNyYywgc2l6ZV90IGxlbikKK3sKKwlpZiAoIXNyYykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRzdCwgMSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGNvcHlfdG9fdXNlcihkc3QsIHNyYywgbGVuKTsKK30KKworc3RhdGljIGxvbmcgZWZpX3J1bnRpbWVfZ2V0X3ZhcmlhYmxlKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlZmlfZ2V0dmFyaWFibGUgX191c2VyICpnZXR2YXJpYWJsZV91c2VyOworCXN0cnVjdCBlZmlfZ2V0dmFyaWFibGUgZ2V0dmFyaWFibGU7CisJdW5zaWduZWQgbG9uZyBkYXRhc2l6ZSwgcHJldl9kYXRhc2l6ZSwgKmR6OworCWVmaV9ndWlkX3QgdmVuZG9yX2d1aWQsICp2ZCA9IE5VTEw7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwllZmlfY2hhcjE2X3QgKm5hbWUgPSBOVUxMOworCXUzMiBhdHRyLCAqYXQ7CisJdm9pZCAqZGF0YSA9IE5VTEw7CisJaW50IHJ2ID0gMDsKKworCWdldHZhcmlhYmxlX3VzZXIgPSAoc3RydWN0IGVmaV9nZXR2YXJpYWJsZSBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmdldHZhcmlhYmxlLCBnZXR2YXJpYWJsZV91c2VyLAorCQkJICAgc2l6ZW9mKGdldHZhcmlhYmxlKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChnZXR2YXJpYWJsZS5kYXRhX3NpemUgJiYKKwkgICAgZ2V0X3VzZXIoZGF0YXNpemUsIGdldHZhcmlhYmxlLmRhdGFfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChnZXR2YXJpYWJsZS52ZW5kb3JfZ3VpZCkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJnZlbmRvcl9ndWlkLCBnZXR2YXJpYWJsZS52ZW5kb3JfZ3VpZCwKKwkJCQkJc2l6ZW9mKHZlbmRvcl9ndWlkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdmQgPSAmdmVuZG9yX2d1aWQ7CisJfQorCisJaWYgKGdldHZhcmlhYmxlLnZhcmlhYmxlX25hbWUpIHsKKwkJcnYgPSBjb3B5X3VjczJfZnJvbV91c2VyKCZuYW1lLCBnZXR2YXJpYWJsZS52YXJpYWJsZV9uYW1lKTsKKwkJaWYgKHJ2KQorCQkJcmV0dXJuIHJ2OworCX0KKworCWF0ID0gZ2V0dmFyaWFibGUuYXR0cmlidXRlcyA/ICZhdHRyIDogTlVMTDsKKwlkeiA9IGdldHZhcmlhYmxlLmRhdGFfc2l6ZSA/ICZkYXRhc2l6ZSA6IE5VTEw7CisKKwlpZiAoZ2V0dmFyaWFibGUuZGF0YV9zaXplICYmIGdldHZhcmlhYmxlLmRhdGEpIHsKKwkJZGF0YSA9IGttYWxsb2MoZGF0YXNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWRhdGEpIHsKKwkJCWtmcmVlKG5hbWUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlwcmV2X2RhdGFzaXplID0gZGF0YXNpemU7CisJc3RhdHVzID0gZWZpLmdldF92YXJpYWJsZShuYW1lLCB2ZCwgYXQsIGR6LCBkYXRhKTsKKwlrZnJlZShuYW1lKTsKKworCWlmIChwdXRfdXNlcihzdGF0dXMsIGdldHZhcmlhYmxlLnN0YXR1cykpIHsKKwkJcnYgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7CisJCWlmIChzdGF0dXMgPT0gRUZJX0JVRkZFUl9UT09fU01BTEwpIHsKKwkJCWlmIChkeiAmJiBwdXRfdXNlcihkYXRhc2l6ZSwgZ2V0dmFyaWFibGUuZGF0YV9zaXplKSkgeworCQkJCXJ2ID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlydiA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwcmV2X2RhdGFzaXplIDwgZGF0YXNpemUpIHsKKwkJcnYgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZGF0YSkgeworCQlpZiAoY29weV90b191c2VyKGdldHZhcmlhYmxlLmRhdGEsIGRhdGEsIGRhdGFzaXplKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoYXQgJiYgcHV0X3VzZXIoYXR0ciwgZ2V0dmFyaWFibGUuYXR0cmlidXRlcykpIHsKKwkJcnYgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZHogJiYgcHV0X3VzZXIoZGF0YXNpemUsIGdldHZhcmlhYmxlLmRhdGFfc2l6ZSkpCisJCXJ2ID0gLUVGQVVMVDsKKworb3V0OgorCWtmcmVlKGRhdGEpOworCXJldHVybiBydjsKKworfQorCitzdGF0aWMgbG9uZyBlZmlfcnVudGltZV9zZXRfdmFyaWFibGUodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVmaV9zZXR2YXJpYWJsZSBfX3VzZXIgKnNldHZhcmlhYmxlX3VzZXI7CisJc3RydWN0IGVmaV9zZXR2YXJpYWJsZSBzZXR2YXJpYWJsZTsKKwllZmlfZ3VpZF90IHZlbmRvcl9ndWlkOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX2NoYXIxNl90ICpuYW1lID0gTlVMTDsKKwl2b2lkICpkYXRhOworCWludCBydiA9IDA7CisKKwlzZXR2YXJpYWJsZV91c2VyID0gKHN0cnVjdCBlZmlfc2V0dmFyaWFibGUgX191c2VyICopYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZzZXR2YXJpYWJsZSwgc2V0dmFyaWFibGVfdXNlciwgc2l6ZW9mKHNldHZhcmlhYmxlKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmdmVuZG9yX2d1aWQsIHNldHZhcmlhYmxlLnZlbmRvcl9ndWlkLAorCQkJCXNpemVvZih2ZW5kb3JfZ3VpZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzZXR2YXJpYWJsZS52YXJpYWJsZV9uYW1lKSB7CisJCXJ2ID0gY29weV91Y3MyX2Zyb21fdXNlcigmbmFtZSwgc2V0dmFyaWFibGUudmFyaWFibGVfbmFtZSk7CisJCWlmIChydikKKwkJCXJldHVybiBydjsKKwl9CisKKwlkYXRhID0ga21hbGxvYyhzZXR2YXJpYWJsZS5kYXRhX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQlrZnJlZShuYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBzZXR2YXJpYWJsZS5kYXRhLCBzZXR2YXJpYWJsZS5kYXRhX3NpemUpKSB7CisJCXJ2ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJc3RhdHVzID0gZWZpLnNldF92YXJpYWJsZShuYW1lLCAmdmVuZG9yX2d1aWQsCisJCQkJc2V0dmFyaWFibGUuYXR0cmlidXRlcywKKwkJCQlzZXR2YXJpYWJsZS5kYXRhX3NpemUsIGRhdGEpOworCisJaWYgKHB1dF91c2VyKHN0YXR1cywgc2V0dmFyaWFibGUuc3RhdHVzKSkgeworCQlydiA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCXJ2ID0gc3RhdHVzID09IEVGSV9TVUNDRVNTID8gMCA6IC1FSU5WQUw7CisKK291dDoKKwlrZnJlZShkYXRhKTsKKwlrZnJlZShuYW1lKTsKKworCXJldHVybiBydjsKK30KKworc3RhdGljIGxvbmcgZWZpX3J1bnRpbWVfZ2V0X3RpbWUodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVmaV9nZXR0aW1lIF9fdXNlciAqZ2V0dGltZV91c2VyOworCXN0cnVjdCBlZmlfZ2V0dGltZSAgZ2V0dGltZTsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV90aW1lX2NhcF90IGNhcDsKKwllZmlfdGltZV90IGVmaV90aW1lOworCisJZ2V0dGltZV91c2VyID0gKHN0cnVjdCBlZmlfZ2V0dGltZSBfX3VzZXIgKilhcmc7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZnZXR0aW1lLCBnZXR0aW1lX3VzZXIsIHNpemVvZihnZXR0aW1lKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3RhdHVzID0gZWZpLmdldF90aW1lKGdldHRpbWUudGltZSA/ICZlZmlfdGltZSA6IE5VTEwsCisJCQkgICAgICBnZXR0aW1lLmNhcGFiaWxpdGllcyA/ICZjYXAgOiBOVUxMKTsKKworCWlmIChwdXRfdXNlcihzdGF0dXMsIGdldHRpbWUuc3RhdHVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnZXR0aW1lLmNhcGFiaWxpdGllcykgeworCQllZmlfdGltZV9jYXBfdCBfX3VzZXIgKmNhcF9sb2NhbDsKKworCQljYXBfbG9jYWwgPSAoZWZpX3RpbWVfY2FwX3QgKilnZXR0aW1lLmNhcGFiaWxpdGllczsKKwkJaWYgKHB1dF91c2VyKGNhcC5yZXNvbHV0aW9uLCAmKGNhcF9sb2NhbC0+cmVzb2x1dGlvbikpIHx8CisJCQlwdXRfdXNlcihjYXAuYWNjdXJhY3ksICYoY2FwX2xvY2FsLT5hY2N1cmFjeSkpIHx8CisJCQlwdXRfdXNlcihjYXAuc2V0c190b196ZXJvLCAmKGNhcF9sb2NhbC0+c2V0c190b196ZXJvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJaWYgKGdldHRpbWUudGltZSkgeworCQlpZiAoY29weV90b191c2VyKGdldHRpbWUudGltZSwgJmVmaV90aW1lLCBzaXplb2YoZWZpX3RpbWVfdCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nIGVmaV9ydW50aW1lX3NldF90aW1lKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlZmlfc2V0dGltZSBfX3VzZXIgKnNldHRpbWVfdXNlcjsKKwlzdHJ1Y3QgZWZpX3NldHRpbWUgc2V0dGltZTsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV90aW1lX3QgZWZpX3RpbWU7CisKKwlzZXR0aW1lX3VzZXIgPSAoc3RydWN0IGVmaV9zZXR0aW1lIF9fdXNlciAqKWFyZzsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNldHRpbWUsIHNldHRpbWVfdXNlciwgc2l6ZW9mKHNldHRpbWUpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZlZmlfdGltZSwgc2V0dGltZS50aW1lLAorCQkJCQlzaXplb2YoZWZpX3RpbWVfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlzdGF0dXMgPSBlZmkuc2V0X3RpbWUoJmVmaV90aW1lKTsKKworCWlmIChwdXRfdXNlcihzdGF0dXMsIHNldHRpbWUuc3RhdHVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gc3RhdHVzID09IEVGSV9TVUNDRVNTID8gMCA6IC1FSU5WQUw7Cit9CisKK3N0YXRpYyBsb25nIGVmaV9ydW50aW1lX2dldF93YWtldGltZSh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZWZpX2dldHdha2V1cHRpbWUgX191c2VyICpnZXR3YWtldXB0aW1lX3VzZXI7CisJc3RydWN0IGVmaV9nZXR3YWtldXB0aW1lIGdldHdha2V1cHRpbWU7CisJZWZpX2Jvb2xfdCBlbmFibGVkLCBwZW5kaW5nOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJZWZpX3RpbWVfdCBlZmlfdGltZTsKKworCWdldHdha2V1cHRpbWVfdXNlciA9IChzdHJ1Y3QgZWZpX2dldHdha2V1cHRpbWUgX191c2VyICopYXJnOworCWlmIChjb3B5X2Zyb21fdXNlcigmZ2V0d2FrZXVwdGltZSwgZ2V0d2FrZXVwdGltZV91c2VyLAorCQkJCXNpemVvZihnZXR3YWtldXB0aW1lKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3RhdHVzID0gZWZpLmdldF93YWtldXBfdGltZSgKKwkJZ2V0d2FrZXVwdGltZS5lbmFibGVkID8gKGVmaV9ib29sX3QgKikmZW5hYmxlZCA6IE5VTEwsCisJCWdldHdha2V1cHRpbWUucGVuZGluZyA/IChlZmlfYm9vbF90ICopJnBlbmRpbmcgOiBOVUxMLAorCQlnZXR3YWtldXB0aW1lLnRpbWUgPyAmZWZpX3RpbWUgOiBOVUxMKTsKKworCWlmIChwdXRfdXNlcihzdGF0dXMsIGdldHdha2V1cHRpbWUuc3RhdHVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnZXR3YWtldXB0aW1lLmVuYWJsZWQgJiYgcHV0X3VzZXIoZW5hYmxlZCwKKwkJCQkJCWdldHdha2V1cHRpbWUuZW5hYmxlZCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldHdha2V1cHRpbWUudGltZSkgeworCQlpZiAoY29weV90b191c2VyKGdldHdha2V1cHRpbWUudGltZSwgJmVmaV90aW1lLAorCQkJCXNpemVvZihlZmlfdGltZV90KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgZWZpX3J1bnRpbWVfc2V0X3dha2V0aW1lKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlZmlfc2V0d2FrZXVwdGltZSBfX3VzZXIgKnNldHdha2V1cHRpbWVfdXNlcjsKKwlzdHJ1Y3QgZWZpX3NldHdha2V1cHRpbWUgc2V0d2FrZXVwdGltZTsKKwllZmlfYm9vbF90IGVuYWJsZWQ7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwllZmlfdGltZV90IGVmaV90aW1lOworCisJc2V0d2FrZXVwdGltZV91c2VyID0gKHN0cnVjdCBlZmlfc2V0d2FrZXVwdGltZSBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnNldHdha2V1cHRpbWUsIHNldHdha2V1cHRpbWVfdXNlciwKKwkJCQlzaXplb2Yoc2V0d2FrZXVwdGltZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVuYWJsZWQgPSBzZXR3YWtldXB0aW1lLmVuYWJsZWQ7CisJaWYgKHNldHdha2V1cHRpbWUudGltZSkgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmVmaV90aW1lLCBzZXR3YWtldXB0aW1lLnRpbWUsCisJCQkJCXNpemVvZihlZmlfdGltZV90KSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzdGF0dXMgPSBlZmkuc2V0X3dha2V1cF90aW1lKGVuYWJsZWQsICZlZmlfdGltZSk7CisJfSBlbHNlCisJCXN0YXR1cyA9IGVmaS5zZXRfd2FrZXVwX3RpbWUoZW5hYmxlZCwgTlVMTCk7CisKKwlpZiAocHV0X3VzZXIoc3RhdHVzLCBzZXR3YWtldXB0aW1lLnN0YXR1cykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN0YXR1cyA9PSBFRklfU1VDQ0VTUyA/IDAgOiAtRUlOVkFMOworfQorCitzdGF0aWMgbG9uZyBlZmlfcnVudGltZV9nZXRfbmV4dHZhcmlhYmxlbmFtZSh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZWZpX2dldG5leHR2YXJpYWJsZW5hbWUgX191c2VyICpnZXRuZXh0dmFyaWFibGVuYW1lX3VzZXI7CisJc3RydWN0IGVmaV9nZXRuZXh0dmFyaWFibGVuYW1lIGdldG5leHR2YXJpYWJsZW5hbWU7CisJdW5zaWduZWQgbG9uZyBuYW1lX3NpemUsIHByZXZfbmFtZV9zaXplID0gMCwgKm5zID0gTlVMTDsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCWVmaV9ndWlkX3QgKnZkID0gTlVMTDsKKwllZmlfZ3VpZF90IHZlbmRvcl9ndWlkOworCWVmaV9jaGFyMTZfdCAqbmFtZSA9IE5VTEw7CisJaW50IHJ2OworCisJZ2V0bmV4dHZhcmlhYmxlbmFtZV91c2VyID0gKHN0cnVjdCBlZmlfZ2V0bmV4dHZhcmlhYmxlbmFtZSBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmdldG5leHR2YXJpYWJsZW5hbWUsIGdldG5leHR2YXJpYWJsZW5hbWVfdXNlciwKKwkJCSAgIHNpemVvZihnZXRuZXh0dmFyaWFibGVuYW1lKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldG5leHR2YXJpYWJsZW5hbWUudmFyaWFibGVfbmFtZV9zaXplKSB7CisJCWlmIChnZXRfdXNlcihuYW1lX3NpemUsIGdldG5leHR2YXJpYWJsZW5hbWUudmFyaWFibGVfbmFtZV9zaXplKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlucyA9ICZuYW1lX3NpemU7CisJCXByZXZfbmFtZV9zaXplID0gbmFtZV9zaXplOworCX0KKworCWlmIChnZXRuZXh0dmFyaWFibGVuYW1lLnZlbmRvcl9ndWlkKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdmVuZG9yX2d1aWQsCisJCQkJZ2V0bmV4dHZhcmlhYmxlbmFtZS52ZW5kb3JfZ3VpZCwKKwkJCQlzaXplb2YodmVuZG9yX2d1aWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2ZCA9ICZ2ZW5kb3JfZ3VpZDsKKwl9CisKKwlpZiAoZ2V0bmV4dHZhcmlhYmxlbmFtZS52YXJpYWJsZV9uYW1lKSB7CisJCXNpemVfdCBuYW1lX3N0cmluZ19zaXplID0gMDsKKworCQlydiA9IGdldF91Y3MyX3N0cnNpemVfZnJvbV91c2VyKAorCQkJCWdldG5leHR2YXJpYWJsZW5hbWUudmFyaWFibGVfbmFtZSwKKwkJCQkmbmFtZV9zdHJpbmdfc2l6ZSk7CisJCWlmIChydikKKwkJCXJldHVybiBydjsKKwkJLyoKKwkJICogVGhlIG5hbWVfc2l6ZSBtYXkgYmUgc21hbGxlciB0aGFuIHRoZSByZWFsIGJ1ZmZlciBzaXplIHdoZXJlCisJCSAqIHZhcmlhYmxlIG5hbWUgbG9jYXRlZCBpbiBzb21lIHVzZSBjYXNlcy4gVGhlIG1vc3QgdHlwaWNhbAorCQkgKiBjYXNlIGlzIHBhc3NpbmcgYSAwIHRvIGdldCB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUgZm9yIHRoZQorCQkgKiAxc3QgdGltZSBjYWxsLiBTbyB3ZSBuZWVkIHRvIGNvcHkgdGhlIGNvbnRlbnQgZnJvbSB1c2VyCisJCSAqIHNwYWNlIGZvciBhdCBsZWFzdCB0aGUgc3RyaW5nIHNpemUgb2YgdmFyaWFibGUgbmFtZSwgb3IgZWxzZQorCQkgKiB0aGUgbmFtZSBwYXNzZWQgdG8gVUVGSSBtYXkgbm90IGJlIHRlcm1pbmF0ZWQgYXMgd2UgZXhwZWN0ZWQuCisJCSAqLworCQlydiA9IGNvcHlfdWNzMl9mcm9tX3VzZXJfbGVuKCZuYW1lLAorCQkJCWdldG5leHR2YXJpYWJsZW5hbWUudmFyaWFibGVfbmFtZSwKKwkJCQlwcmV2X25hbWVfc2l6ZSA+IG5hbWVfc3RyaW5nX3NpemUgPworCQkJCXByZXZfbmFtZV9zaXplIDogbmFtZV9zdHJpbmdfc2l6ZSk7CisJCWlmIChydikKKwkJCXJldHVybiBydjsKKwl9CisKKwlzdGF0dXMgPSBlZmkuZ2V0X25leHRfdmFyaWFibGUobnMsIG5hbWUsIHZkKTsKKworCWlmIChwdXRfdXNlcihzdGF0dXMsIGdldG5leHR2YXJpYWJsZW5hbWUuc3RhdHVzKSkgeworCQlydiA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKKwkJaWYgKHN0YXR1cyA9PSBFRklfQlVGRkVSX1RPT19TTUFMTCkgeworCQkJaWYgKG5zICYmIHB1dF91c2VyKCpucywKKwkJCQlnZXRuZXh0dmFyaWFibGVuYW1lLnZhcmlhYmxlX25hbWVfc2l6ZSkpIHsKKwkJCQlydiA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJcnYgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobmFtZSkgeworCQlpZiAoY29weV91Y3MyX3RvX3VzZXJfbGVuKGdldG5leHR2YXJpYWJsZW5hbWUudmFyaWFibGVfbmFtZSwKKwkJCQkJCW5hbWUsIHByZXZfbmFtZV9zaXplKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAobnMpIHsKKwkJaWYgKHB1dF91c2VyKCpucywgZ2V0bmV4dHZhcmlhYmxlbmFtZS52YXJpYWJsZV9uYW1lX3NpemUpKSB7CisJCQlydiA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmICh2ZCkgeworCQlpZiAoY29weV90b191c2VyKGdldG5leHR2YXJpYWJsZW5hbWUudmVuZG9yX2d1aWQsIHZkLAorCQkJCQkJCXNpemVvZihlZmlfZ3VpZF90KSkpCisJCQlydiA9IC1FRkFVTFQ7CisJfQorCitvdXQ6CisJa2ZyZWUobmFtZSk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgbG9uZyBlZmlfcnVudGltZV9nZXRfbmV4dGhpZ2htb25vY291bnQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVmaV9nZXRuZXh0aGlnaG1vbm90b25pY2NvdW50IF9fdXNlciAqZ2V0bmV4dGhpZ2htb25vY291bnRfdXNlcjsKKwlzdHJ1Y3QgZWZpX2dldG5leHRoaWdobW9ub3RvbmljY291bnQgZ2V0bmV4dGhpZ2htb25vY291bnQ7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKwl1MzIgY291bnQ7CisKKwlnZXRuZXh0aGlnaG1vbm9jb3VudF91c2VyID0gKHN0cnVjdAorCQkJZWZpX2dldG5leHRoaWdobW9ub3RvbmljY291bnQgX191c2VyICopYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZnZXRuZXh0aGlnaG1vbm9jb3VudCwKKwkJCSAgIGdldG5leHRoaWdobW9ub2NvdW50X3VzZXIsCisJCQkgICBzaXplb2YoZ2V0bmV4dGhpZ2htb25vY291bnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzdGF0dXMgPSBlZmkuZ2V0X25leHRfaGlnaF9tb25vX2NvdW50KAorCQlnZXRuZXh0aGlnaG1vbm9jb3VudC5oaWdoX2NvdW50ID8gJmNvdW50IDogTlVMTCk7CisKKwlpZiAocHV0X3VzZXIoc3RhdHVzLCBnZXRuZXh0aGlnaG1vbm9jb3VudC5zdGF0dXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdldG5leHRoaWdobW9ub2NvdW50LmhpZ2hfY291bnQgJiYKKwkgICAgcHV0X3VzZXIoY291bnQsIGdldG5leHRoaWdobW9ub2NvdW50LmhpZ2hfY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBlZmlfcnVudGltZV9xdWVyeV92YXJpYWJsZWluZm8odW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVmaV9xdWVyeXZhcmlhYmxlaW5mbyBfX3VzZXIgKnF1ZXJ5dmFyaWFibGVpbmZvX3VzZXI7CisJc3RydWN0IGVmaV9xdWVyeXZhcmlhYmxlaW5mbyBxdWVyeXZhcmlhYmxlaW5mbzsKKwllZmlfc3RhdHVzX3Qgc3RhdHVzOworCXU2NCBtYXhfc3RvcmFnZSwgcmVtYWluaW5nLCBtYXhfc2l6ZTsKKworCXF1ZXJ5dmFyaWFibGVpbmZvX3VzZXIgPSAoc3RydWN0IGVmaV9xdWVyeXZhcmlhYmxlaW5mbyBfX3VzZXIgKilhcmc7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnF1ZXJ5dmFyaWFibGVpbmZvLCBxdWVyeXZhcmlhYmxlaW5mb191c2VyLAorCQkJICAgc2l6ZW9mKHF1ZXJ5dmFyaWFibGVpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3RhdHVzID0gZWZpLnF1ZXJ5X3ZhcmlhYmxlX2luZm8ocXVlcnl2YXJpYWJsZWluZm8uYXR0cmlidXRlcywKKwkJCQkJICZtYXhfc3RvcmFnZSwgJnJlbWFpbmluZywgJm1heF9zaXplKTsKKworCWlmIChwdXRfdXNlcihzdGF0dXMsIHF1ZXJ5dmFyaWFibGVpbmZvLnN0YXR1cykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocHV0X3VzZXIobWF4X3N0b3JhZ2UsCisJCSAgICAgcXVlcnl2YXJpYWJsZWluZm8ubWF4aW11bV92YXJpYWJsZV9zdG9yYWdlX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChwdXRfdXNlcihyZW1haW5pbmcsCisJCSAgICAgcXVlcnl2YXJpYWJsZWluZm8ucmVtYWluaW5nX3ZhcmlhYmxlX3N0b3JhZ2Vfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKHB1dF91c2VyKG1heF9zaXplLCBxdWVyeXZhcmlhYmxlaW5mby5tYXhpbXVtX3ZhcmlhYmxlX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyBlZmlfcnVudGltZV9xdWVyeV9jYXBzdWxlY2Fwcyh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZWZpX3F1ZXJ5Y2Fwc3VsZWNhcGFiaWxpdGllcyBfX3VzZXIgKnFjYXBzX3VzZXI7CisJc3RydWN0IGVmaV9xdWVyeWNhcHN1bGVjYXBhYmlsaXRpZXMgcWNhcHM7CisJZWZpX2NhcHN1bGVfaGVhZGVyX3QgKmNhcHN1bGVzOworCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdTY0IG1heF9zaXplOworCWludCBpLCByZXNldF90eXBlOworCWludCBydiA9IDA7CisKKwlxY2Fwc191c2VyID0gKHN0cnVjdCBlZmlfcXVlcnljYXBzdWxlY2FwYWJpbGl0aWVzIF9fdXNlciAqKWFyZzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmcWNhcHMsIHFjYXBzX3VzZXIsIHNpemVvZihxY2FwcykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNhcHN1bGVzID0ga2NhbGxvYyhxY2Fwcy5jYXBzdWxlX2NvdW50ICsgMSwKKwkJCSAgIHNpemVvZihlZmlfY2Fwc3VsZV9oZWFkZXJfdCksIEdGUF9LRVJORUwpOworCWlmICghY2Fwc3VsZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IHFjYXBzLmNhcHN1bGVfY291bnQ7IGkrKykgeworCQllZmlfY2Fwc3VsZV9oZWFkZXJfdCAqYzsKKwkJLyoKKwkJICogV2UgY2Fubm90IGRlcmVmZXJlbmNlIHFjYXBzLmNhcHN1bGVfaGVhZGVyX2FycmF5IGRpcmVjdGx5IHRvCisJCSAqIG9idGFpbiB0aGUgYWRkcmVzcyBvZiB0aGUgY2Fwc3VsZSBhcyBpdCByZXNpZGVzIGluIHRoZQorCQkgKiB1c2VyIHNwYWNlCisJCSAqLworCQlpZiAoZ2V0X3VzZXIoYywgcWNhcHMuY2Fwc3VsZV9oZWFkZXJfYXJyYXkgKyBpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjYXBzdWxlc1tpXSwgYywKKwkJCQlzaXplb2YoZWZpX2NhcHN1bGVfaGVhZGVyX3QpKSkgeworCQkJcnYgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlxY2Fwcy5jYXBzdWxlX2hlYWRlcl9hcnJheSA9ICZjYXBzdWxlczsKKworCXN0YXR1cyA9IGVmaS5xdWVyeV9jYXBzdWxlX2NhcHMoKGVmaV9jYXBzdWxlX2hlYWRlcl90ICoqKQorCQkJCQlxY2Fwcy5jYXBzdWxlX2hlYWRlcl9hcnJheSwKKwkJCQkJcWNhcHMuY2Fwc3VsZV9jb3VudCwKKwkJCQkJJm1heF9zaXplLCAmcmVzZXRfdHlwZSk7CisKKwlpZiAocHV0X3VzZXIoc3RhdHVzLCBxY2Fwcy5zdGF0dXMpKSB7CisJCXJ2ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgeworCQlydiA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChwdXRfdXNlcihtYXhfc2l6ZSwgcWNhcHMubWF4aW11bV9jYXBzdWxlX3NpemUpKSB7CisJCXJ2ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHB1dF91c2VyKHJlc2V0X3R5cGUsIHFjYXBzLnJlc2V0X3R5cGUpKQorCQlydiA9IC1FRkFVTFQ7CisKK291dDoKKwlrZnJlZShjYXBzdWxlcyk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgbG9uZyBlZmlfdGVzdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRUZJX1JVTlRJTUVfR0VUX1ZBUklBQkxFOgorCQlyZXR1cm4gZWZpX3J1bnRpbWVfZ2V0X3ZhcmlhYmxlKGFyZyk7CisKKwljYXNlIEVGSV9SVU5USU1FX1NFVF9WQVJJQUJMRToKKwkJcmV0dXJuIGVmaV9ydW50aW1lX3NldF92YXJpYWJsZShhcmcpOworCisJY2FzZSBFRklfUlVOVElNRV9HRVRfVElNRToKKwkJcmV0dXJuIGVmaV9ydW50aW1lX2dldF90aW1lKGFyZyk7CisKKwljYXNlIEVGSV9SVU5USU1FX1NFVF9USU1FOgorCQlyZXR1cm4gZWZpX3J1bnRpbWVfc2V0X3RpbWUoYXJnKTsKKworCWNhc2UgRUZJX1JVTlRJTUVfR0VUX1dBS0VUSU1FOgorCQlyZXR1cm4gZWZpX3J1bnRpbWVfZ2V0X3dha2V0aW1lKGFyZyk7CisKKwljYXNlIEVGSV9SVU5USU1FX1NFVF9XQUtFVElNRToKKwkJcmV0dXJuIGVmaV9ydW50aW1lX3NldF93YWtldGltZShhcmcpOworCisJY2FzZSBFRklfUlVOVElNRV9HRVRfTkVYVFZBUklBQkxFTkFNRToKKwkJcmV0dXJuIGVmaV9ydW50aW1lX2dldF9uZXh0dmFyaWFibGVuYW1lKGFyZyk7CisKKwljYXNlIEVGSV9SVU5USU1FX0dFVF9ORVhUSElHSE1PTk9UT05JQ0NPVU5UOgorCQlyZXR1cm4gZWZpX3J1bnRpbWVfZ2V0X25leHRoaWdobW9ub2NvdW50KGFyZyk7CisKKwljYXNlIEVGSV9SVU5USU1FX1FVRVJZX1ZBUklBQkxFSU5GTzoKKwkJcmV0dXJuIGVmaV9ydW50aW1lX3F1ZXJ5X3ZhcmlhYmxlaW5mbyhhcmcpOworCisJY2FzZSBFRklfUlVOVElNRV9RVUVSWV9DQVBTVUxFQ0FQQUJJTElUSUVTOgorCQlyZXR1cm4gZWZpX3J1bnRpbWVfcXVlcnlfY2Fwc3VsZWNhcHMoYXJnKTsKKwl9CisKKwlyZXR1cm4gLUVOT1RUWTsKK30KKworc3RhdGljIGludCBlZmlfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qCisJICogbm90aGluZyBzcGVjaWFsIHRvIGRvIGhlcmUKKwkgKiBXZSBkbyBhY2NlcHQgbXVsdGlwbGUgb3BlbiBmaWxlcyBhdCB0aGUgc2FtZSB0aW1lIGFzIHdlCisJICogc3luY2hyb25pemUgb24gdGhlIHBlciBjYWxsIG9wZXJhdGlvbi4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlZmlfdGVzdF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVRoZSB2YXJpb3VzIGZpbGUgb3BlcmF0aW9ucyB3ZSBzdXBwb3J0LgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlZmlfdGVzdF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkudW5sb2NrZWRfaW9jdGwJPSBlZmlfdGVzdF9pb2N0bCwKKwkub3BlbgkJPSBlZmlfdGVzdF9vcGVuLAorCS5yZWxlYXNlCT0gZWZpX3Rlc3RfY2xvc2UsCisJLmxsc2VlawkJPSBub19sbHNlZWssCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZWZpX3Rlc3RfZGV2ID0geworCU1JU0NfRFlOQU1JQ19NSU5PUiwKKwkiZWZpX3Rlc3QiLAorCSZlZmlfdGVzdF9mb3BzCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlZmlfdGVzdF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmVmaV90ZXN0X2Rldik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoImVmaV90ZXN0OiBjYW4ndCBtaXNjX3JlZ2lzdGVyIG9uIG1pbm9yPSVkXG4iLAorCQkJTUlTQ19EWU5BTUlDX01JTk9SKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVmaV90ZXN0X2V4aXQodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmVmaV90ZXN0X2Rldik7Cit9CisKK21vZHVsZV9pbml0KGVmaV90ZXN0X2luaXQpOworbW9kdWxlX2V4aXQoZWZpX3Rlc3RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS90ZXN0L2VmaV90ZXN0LmggYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS90ZXN0L2VmaV90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzYTZjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3Rlc3QvZWZpX3Rlc3QuaApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIEVGSSBUZXN0IGRyaXZlciBIZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQoQykgMjAxMi0yMDE2IENhbm9uaWNhbCBMdGQuCisgKgorICovCisKKyNpZm5kZWYgX0RSSVZFUlNfRklSTVdBUkVfRUZJX1RFU1RfSF8KKyNkZWZpbmUgX0RSSVZFUlNfRklSTVdBUkVfRUZJX1RFU1RfSF8KKworI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorCitzdHJ1Y3QgZWZpX2dldHZhcmlhYmxlIHsKKwllZmlfY2hhcjE2X3QJKnZhcmlhYmxlX25hbWU7CisJZWZpX2d1aWRfdAkqdmVuZG9yX2d1aWQ7CisJdTMyCQkqYXR0cmlidXRlczsKKwl1bnNpZ25lZCBsb25nCSpkYXRhX3NpemU7CisJdm9pZAkJKmRhdGE7CisJZWZpX3N0YXR1c190CSpzdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZWZpX3NldHZhcmlhYmxlIHsKKwllZmlfY2hhcjE2X3QJKnZhcmlhYmxlX25hbWU7CisJZWZpX2d1aWRfdAkqdmVuZG9yX2d1aWQ7CisJdTMyCQlhdHRyaWJ1dGVzOworCXVuc2lnbmVkIGxvbmcJZGF0YV9zaXplOworCXZvaWQJCSpkYXRhOworCWVmaV9zdGF0dXNfdAkqc3RhdHVzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGVmaV9nZXRuZXh0dmFyaWFibGVuYW1lIHsKKwl1bnNpZ25lZCBsb25nCSp2YXJpYWJsZV9uYW1lX3NpemU7CisJZWZpX2NoYXIxNl90CSp2YXJpYWJsZV9uYW1lOworCWVmaV9ndWlkX3QJKnZlbmRvcl9ndWlkOworCWVmaV9zdGF0dXNfdAkqc3RhdHVzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGVmaV9xdWVyeXZhcmlhYmxlaW5mbyB7CisJdTMyCQlhdHRyaWJ1dGVzOworCXU2NAkJKm1heGltdW1fdmFyaWFibGVfc3RvcmFnZV9zaXplOworCXU2NAkJKnJlbWFpbmluZ192YXJpYWJsZV9zdG9yYWdlX3NpemU7CisJdTY0CQkqbWF4aW11bV92YXJpYWJsZV9zaXplOworCWVmaV9zdGF0dXNfdAkqc3RhdHVzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGVmaV9nZXR0aW1lIHsKKwllZmlfdGltZV90CSp0aW1lOworCWVmaV90aW1lX2NhcF90CSpjYXBhYmlsaXRpZXM7CisJZWZpX3N0YXR1c190CSpzdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZWZpX3NldHRpbWUgeworCWVmaV90aW1lX3QJKnRpbWU7CisJZWZpX3N0YXR1c190CSpzdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgZWZpX2dldHdha2V1cHRpbWUgeworCWVmaV9ib29sX3QJKmVuYWJsZWQ7CisJZWZpX2Jvb2xfdAkqcGVuZGluZzsKKwllZmlfdGltZV90CSp0aW1lOworCWVmaV9zdGF0dXNfdAkqc3RhdHVzOworfSBfX3BhY2tlZDsKKworc3RydWN0IGVmaV9zZXR3YWtldXB0aW1lIHsKKwllZmlfYm9vbF90CWVuYWJsZWQ7CisJZWZpX3RpbWVfdAkqdGltZTsKKwllZmlfc3RhdHVzX3QJKnN0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlZmlfZ2V0bmV4dGhpZ2htb25vdG9uaWNjb3VudCB7CisJdTMyCQkqaGlnaF9jb3VudDsKKwllZmlfc3RhdHVzX3QJKnN0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlZmlfcXVlcnljYXBzdWxlY2FwYWJpbGl0aWVzIHsKKwllZmlfY2Fwc3VsZV9oZWFkZXJfdAkqKmNhcHN1bGVfaGVhZGVyX2FycmF5OworCXVuc2lnbmVkIGxvbmcJCWNhcHN1bGVfY291bnQ7CisJdTY0CQkJKm1heGltdW1fY2Fwc3VsZV9zaXplOworCWludAkJCSpyZXNldF90eXBlOworCWVmaV9zdGF0dXNfdAkJKnN0YXR1czsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgRUZJX1JVTlRJTUVfR0VUX1ZBUklBQkxFIFwKKwlfSU9XUigncCcsIDB4MDEsIHN0cnVjdCBlZmlfZ2V0dmFyaWFibGUpCisjZGVmaW5lIEVGSV9SVU5USU1FX1NFVF9WQVJJQUJMRSBcCisJX0lPVygncCcsIDB4MDIsIHN0cnVjdCBlZmlfc2V0dmFyaWFibGUpCisKKyNkZWZpbmUgRUZJX1JVTlRJTUVfR0VUX1RJTUUgXAorCV9JT1IoJ3AnLCAweDAzLCBzdHJ1Y3QgZWZpX2dldHRpbWUpCisjZGVmaW5lIEVGSV9SVU5USU1FX1NFVF9USU1FIFwKKwlfSU9XKCdwJywgMHgwNCwgc3RydWN0IGVmaV9zZXR0aW1lKQorCisjZGVmaW5lIEVGSV9SVU5USU1FX0dFVF9XQUtFVElNRSBcCisJX0lPUigncCcsIDB4MDUsIHN0cnVjdCBlZmlfZ2V0d2FrZXVwdGltZSkKKyNkZWZpbmUgRUZJX1JVTlRJTUVfU0VUX1dBS0VUSU1FIFwKKwlfSU9XKCdwJywgMHgwNiwgc3RydWN0IGVmaV9zZXR3YWtldXB0aW1lKQorCisjZGVmaW5lIEVGSV9SVU5USU1FX0dFVF9ORVhUVkFSSUFCTEVOQU1FIFwKKwlfSU9XUigncCcsIDB4MDcsIHN0cnVjdCBlZmlfZ2V0bmV4dHZhcmlhYmxlbmFtZSkKKworI2RlZmluZSBFRklfUlVOVElNRV9RVUVSWV9WQVJJQUJMRUlORk8gXAorCV9JT1IoJ3AnLCAweDA4LCBzdHJ1Y3QgZWZpX3F1ZXJ5dmFyaWFibGVpbmZvKQorCisjZGVmaW5lIEVGSV9SVU5USU1FX0dFVF9ORVhUSElHSE1PTk9UT05JQ0NPVU5UIFwKKwlfSU9SKCdwJywgMHgwOSwgc3RydWN0IGVmaV9nZXRuZXh0aGlnaG1vbm90b25pY2NvdW50KQorCisjZGVmaW5lIEVGSV9SVU5USU1FX1FVRVJZX0NBUFNVTEVDQVBBQklMSVRJRVMgXAorCV9JT1IoJ3AnLCAweDBBLCBzdHJ1Y3QgZWZpX3F1ZXJ5Y2Fwc3VsZWNhcGFiaWxpdGllcykKKworI2VuZGlmIC8qIF9EUklWRVJTX0ZJUk1XQVJFX0VGSV9URVNUX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS92YXJzLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS92YXJzLmMKaW5kZXggZDNiNzUxMy4uOTMzNmZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9lZmkvdmFycy5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpL3ZhcnMuYwpAQCAtMzcsNiArMzcsMTQgQEAKIC8qIFByaXZhdGUgcG9pbnRlciB0byByZWdpc3RlcmVkIGVmaXZhcnMgKi8KIHN0YXRpYyBzdHJ1Y3QgZWZpdmFycyAqX19lZml2YXJzOwogCisvKgorICogZWZpdmFyc19sb2NrIHByb3RlY3RzIHRocmVlIHRoaW5nczoKKyAqIDEpIGVmaXZhcmZzX2xpc3QgYW5kIGVmaXZhcnNfc3lzZnNfbGlzdAorICogMikgLT5vcHMgY2FsbHMKKyAqIDMpICh1bilyZWdpc3RyYXRpb24gb2YgX19lZml2YXJzCisgKi8KK3N0YXRpYyBERUZJTkVfU0VNQVBIT1JFKGVmaXZhcnNfbG9jayk7CisKIHN0YXRpYyBib29sIGVmaXZhcl93cV9lbmFibGVkID0gdHJ1ZTsKIERFQ0xBUkVfV09SSyhlZml2YXJfd29yaywgTlVMTCk7CiBFWFBPUlRfU1lNQk9MX0dQTChlZml2YXJfd29yayk7CkBAIC00MzQsNyArNDQyLDEwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXNwaW5fbG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkgeworCQllcnIgPSAtRUlOVFI7CisJCWdvdG8gZnJlZTsKKwl9CiAKIAkvKgogCSAqIFBlciBFRkkgc3BlYywgdGhlIG1heGltdW0gc3RvcmFnZSBhbGxvY2F0ZWQgZm9yIGJvdGgKQEAgLTQ1MCw3ICs0NjEsNyBAQAogCQlzd2l0Y2ggKHN0YXR1cykgewogCQljYXNlIEVGSV9TVUNDRVNTOgogCQkJaWYgKGR1cGxpY2F0ZXMpCi0JCQkJc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCQkJCXVwKCZlZml2YXJzX2xvY2spOwogCiAJCQl2YXJpYWJsZV9uYW1lX3NpemUgPSB2YXJfbmFtZV9zdHJuc2l6ZSh2YXJpYWJsZV9uYW1lLAogCQkJCQkJCSAgICAgICB2YXJpYWJsZV9uYW1lX3NpemUpOwpAQCAtNDc2LDggKzQ4NywxMiBAQAogCQkJCQlzdGF0dXMgPSBFRklfTk9UX0ZPVU5EOwogCQkJfQogCi0JCQlpZiAoZHVwbGljYXRlcykKLQkJCQlzcGluX2xvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCQkJaWYgKGR1cGxpY2F0ZXMpIHsKKwkJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKSB7CisJCQkJCWVyciA9IC1FSU5UUjsKKwkJCQkJZ290byBmcmVlOworCQkJCX0KKwkJCX0KIAogCQkJYnJlYWs7CiAJCWNhc2UgRUZJX05PVF9GT1VORDoKQEAgLTQ5MSw4ICs1MDYsOCBAQAogCiAJfSB3aGlsZSAoc3RhdHVzICE9IEVGSV9OT1RfRk9VTkQpOwogCi0Jc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOwotCisJdXAoJmVmaXZhcnNfbG9jayk7CitmcmVlOgogCWtmcmVlKHZhcmlhYmxlX25hbWUpOwogCiAJcmV0dXJuIGVycjsKQEAgLTUwMywyNCArNTE4LDM0IEBACiAgKiBlZml2YXJfZW50cnlfYWRkIC0gYWRkIGVudHJ5IHRvIHZhcmlhYmxlIGxpc3QKICAqIEBlbnRyeTogZW50cnkgdG8gYWRkIHRvIGxpc3QKICAqIEBoZWFkOiBsaXN0IGhlYWQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYSBrZXJuZWwgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCi12b2lkIGVmaXZhcl9lbnRyeV9hZGQoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnksIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCitpbnQgZWZpdmFyX2VudHJ5X2FkZChzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKLQlzcGluX2xvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CiAJbGlzdF9hZGQoJmVudHJ5LT5saXN0LCBoZWFkKTsKLQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJdXAoJmVmaXZhcnNfbG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVmaXZhcl9lbnRyeV9hZGQpOwogCiAvKioKICAqIGVmaXZhcl9lbnRyeV9yZW1vdmUgLSByZW1vdmUgZW50cnkgZnJvbSB2YXJpYWJsZSBsaXN0CiAgKiBAZW50cnk6IGVudHJ5IHRvIHJlbW92ZSBmcm9tIGxpc3QKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYSBrZXJuZWwgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCi12b2lkIGVmaXZhcl9lbnRyeV9yZW1vdmUoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnkpCitpbnQgZWZpdmFyX2VudHJ5X3JlbW92ZShzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSkKIHsKLQlzcGluX2xvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CiAJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKLQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJdXAoJmVmaXZhcnNfbG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVmaXZhcl9lbnRyeV9yZW1vdmUpOwogCkBAIC01MzcsMTAgKzU2Miw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIGVmaXZhcl9lbnRyeV9saXN0X2RlbF91bmxvY2soc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnkpCiB7Ci0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmX19lZml2YXJzLT5sb2NrKTsKLQogCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCXVwKCZlZml2YXJzX2xvY2spOwogfQogCiAvKioKQEAgLTU2Myw4ICs1ODYsNiBAQAogCWNvbnN0IHN0cnVjdCBlZml2YXJfb3BlcmF0aW9ucyAqb3BzID0gX19lZml2YXJzLT5vcHM7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJl9fZWZpdmFycy0+bG9jayk7Ci0KIAlzdGF0dXMgPSBvcHMtPnNldF92YXJpYWJsZShlbnRyeS0+dmFyLlZhcmlhYmxlTmFtZSwKIAkJCQkgICAmZW50cnktPnZhci5WZW5kb3JHdWlkLAogCQkJCSAgIDAsIDAsIE5VTEwpOwpAQCAtNTgxLDIwICs2MDIsMjIgQEAKICAqIHZhcmlhYmxlIGxpc3QuIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBmcmVlIEBlbnRyeQogICogb25jZSB3ZSByZXR1cm4uCiAgKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGEgY29udmVydGVkIEVGSSBzdGF0dXMgY29kZSBpZgotICogc2V0X3ZhcmlhYmxlKCkgZmFpbHMuCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlRSIGlmIHdlIGNhbid0IGdyYWIgdGhlIHNlbWFwaG9yZSwKKyAqIGNvbnZlcnRlZCBFRkkgc3RhdHVzIGNvZGUgaWYgc2V0X3ZhcmlhYmxlKCkgZmFpbHMuCiAgKi8KIGludCBlZml2YXJfZW50cnlfZGVsZXRlKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5KQogewogCWNvbnN0IHN0cnVjdCBlZml2YXJfb3BlcmF0aW9ucyAqb3BzID0gX19lZml2YXJzLT5vcHM7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCXNwaW5fbG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKKwogCXN0YXR1cyA9IG9wcy0+c2V0X3ZhcmlhYmxlKGVudHJ5LT52YXIuVmFyaWFibGVOYW1lLAogCQkJCSAgICZlbnRyeS0+dmFyLlZlbmRvckd1aWQsCiAJCQkJICAgMCwgMCwgTlVMTCk7CiAJaWYgKCEoc3RhdHVzID09IEVGSV9TVUNDRVNTIHx8IHN0YXR1cyA9PSBFRklfTk9UX0ZPVU5EKSkgewotCQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJCXVwKCZlZml2YXJzX2xvY2spOwogCQlyZXR1cm4gZWZpX3N0YXR1c190b19lcnIoc3RhdHVzKTsKIAl9CiAKQEAgLTYyMCw5ICs2NDMsOSBAQAogICogSWYgQGhlYWQgaXMgbm90IE5VTEwgYSBsb29rdXAgaXMgcGVyZm9ybWVkIHRvIGRldGVybWluZSB3aGV0aGVyCiAgKiB0aGUgZW50cnkgaXMgYWxyZWFkeSBvbiB0aGUgbGlzdC4KICAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVFWElTVCBpZiBhIGxvb2t1cCBpcyBwZXJmb3JtZWQgYW5kIHRoZSBlbnRyeQotICogYWxyZWFkeSBleGlzdHMgb24gdGhlIGxpc3QsIG9yIGEgY29udmVydGVkIEVGSSBzdGF0dXMgY29kZSBpZgotICogc2V0X3ZhcmlhYmxlKCkgZmFpbHMuCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlRSIGlmIHdlIGNhbid0IGdyYWIgdGhlIHNlbWFwaG9yZSwKKyAqIC1FRVhJU1QgaWYgYSBsb29rdXAgaXMgcGVyZm9ybWVkIGFuZCB0aGUgZW50cnkgYWxyZWFkeSBleGlzdHMgb24KKyAqIHRoZSBsaXN0LCBvciBhIGNvbnZlcnRlZCBFRkkgc3RhdHVzIGNvZGUgaWYgc2V0X3ZhcmlhYmxlKCkgZmFpbHMuCiAgKi8KIGludCBlZml2YXJfZW50cnlfc2V0KHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5LCB1MzIgYXR0cmlidXRlcywKIAkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKmRhdGEsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCkBAIC02MzIsMTAgKzY1NSwxMCBAQAogCWVmaV9jaGFyMTZfdCAqbmFtZSA9IGVudHJ5LT52YXIuVmFyaWFibGVOYW1lOwogCWVmaV9ndWlkX3QgdmVuZG9yID0gZW50cnktPnZhci5WZW5kb3JHdWlkOwogCi0Jc3Bpbl9sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKLQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CiAJaWYgKGhlYWQgJiYgZWZpdmFyX2VudHJ5X2ZpbmQobmFtZSwgdmVuZG9yLCBoZWFkLCBmYWxzZSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCQl1cCgmZWZpdmFyc19sb2NrKTsKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJfQogCkBAIC02NDQsNyArNjY3LDcgQEAKIAkJc3RhdHVzID0gb3BzLT5zZXRfdmFyaWFibGUobmFtZSwgJnZlbmRvciwKIAkJCQkJICAgYXR0cmlidXRlcywgc2l6ZSwgZGF0YSk7CiAKLQlzcGluX3VubG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJdXAoJmVmaXZhcnNfbG9jayk7CiAKIAlyZXR1cm4gZWZpX3N0YXR1c190b19lcnIoc3RhdHVzKTsKIApAQCAtNjU4LDMwICs2ODEsMjkgQEAKICAqIGZyb20gY3Jhc2gvcGFuaWMgaGFuZGxlcnMuCiAgKgogICogQ3J1Y2lhbGx5LCB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGJsb2NrIGlmIGl0IGNhbm5vdCBhY3F1aXJlCi0gKiBfX2VmaXZhcnMtPmxvY2suIEluc3RlYWQsIGl0IHJldHVybnMgLUVCVVNZLgorICogZWZpdmFyc19sb2NrLiBJbnN0ZWFkLCBpdCByZXR1cm5zIC1FQlVTWS4KICAqLwogc3RhdGljIGludAogZWZpdmFyX2VudHJ5X3NldF9ub25ibG9ja2luZyhlZmlfY2hhcjE2X3QgKm5hbWUsIGVmaV9ndWlkX3QgdmVuZG9yLAogCQkJICAgICB1MzIgYXR0cmlidXRlcywgdW5zaWduZWQgbG9uZyBzaXplLCB2b2lkICpkYXRhKQogewogCWNvbnN0IHN0cnVjdCBlZml2YXJfb3BlcmF0aW9ucyAqb3BzID0gX19lZml2YXJzLT5vcHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0JaWYgKCFzcGluX3RyeWxvY2tfaXJxc2F2ZSgmX19lZml2YXJzLT5sb2NrLCBmbGFncykpCisJaWYgKGRvd25fdHJ5bG9jaygmZWZpdmFyc19sb2NrKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCXN0YXR1cyA9IGNoZWNrX3Zhcl9zaXplX25vbmJsb2NraW5nKGF0dHJpYnV0ZXMsCiAJCQkJCSAgICBzaXplICsgdWNzMl9zdHJzaXplKG5hbWUsIDEwMjQpKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9fZWZpdmFycy0+bG9jaywgZmxhZ3MpOworCQl1cCgmZWZpdmFyc19sb2NrKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCiAJc3RhdHVzID0gb3BzLT5zZXRfdmFyaWFibGVfbm9uYmxvY2tpbmcobmFtZSwgJnZlbmRvciwgYXR0cmlidXRlcywKIAkJCQkJICAgICAgIHNpemUsIGRhdGEpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmX19lZml2YXJzLT5sb2NrLCBmbGFncyk7CisJdXAoJmVmaXZhcnNfbG9jayk7CiAJcmV0dXJuIGVmaV9zdGF0dXNfdG9fZXJyKHN0YXR1cyk7CiB9CiAKQEAgLTcwNiw3ICs3MjgsNiBAQAogCQkJICBib29sIGJsb2NrLCB1bnNpZ25lZCBsb25nIHNpemUsIHZvaWQgKmRhdGEpCiB7CiAJY29uc3Qgc3RydWN0IGVmaXZhcl9vcGVyYXRpb25zICpvcHMgPSBfX2VmaXZhcnMtPm9wczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKIAlpZiAoIW9wcy0+cXVlcnlfdmFyaWFibGVfc3RvcmUpCkBAIC03MjcsMjEgKzc0OCwyMiBAQAogCQkJCQkJICAgIHNpemUsIGRhdGEpOwogCiAJaWYgKCFibG9jaykgewotCQlpZiAoIXNwaW5fdHJ5bG9ja19pcnFzYXZlKCZfX2VmaXZhcnMtPmxvY2ssIGZsYWdzKSkKKwkJaWYgKGRvd25fdHJ5bG9jaygmZWZpdmFyc19sb2NrKSkKIAkJCXJldHVybiAtRUJVU1k7CiAJfSBlbHNlIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJl9fZWZpdmFycy0+bG9jaywgZmxhZ3MpOworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKQorCQkJcmV0dXJuIC1FSU5UUjsKIAl9CiAKIAlzdGF0dXMgPSBjaGVja192YXJfc2l6ZShhdHRyaWJ1dGVzLCBzaXplICsgdWNzMl9zdHJzaXplKG5hbWUsIDEwMjQpKTsKIAlpZiAoc3RhdHVzICE9IEVGSV9TVUNDRVNTKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9fZWZpdmFycy0+bG9jaywgZmxhZ3MpOworCQl1cCgmZWZpdmFyc19sb2NrKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCiAJc3RhdHVzID0gb3BzLT5zZXRfdmFyaWFibGUobmFtZSwgJnZlbmRvciwgYXR0cmlidXRlcywgc2l6ZSwgZGF0YSk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZfX2VmaXZhcnMtPmxvY2ssIGZsYWdzKTsKKwl1cCgmZWZpdmFyc19sb2NrKTsKIAogCXJldHVybiBlZmlfc3RhdHVzX3RvX2VycihzdGF0dXMpOwogfQpAQCAtNzcxLDggKzc5Myw2IEBACiAJaW50IHN0cnNpemUxLCBzdHJzaXplMjsKIAlib29sIGZvdW5kID0gZmFsc2U7CiAKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZfX2VmaXZhcnMtPmxvY2spOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBuLCBoZWFkLCBsaXN0KSB7CiAJCXN0cnNpemUxID0gdWNzMl9zdHJzaXplKG5hbWUsIDEwMjQpOwogCQlzdHJzaXplMiA9IHVjczJfc3Ryc2l6ZShlbnRyeS0+dmFyLlZhcmlhYmxlTmFtZSwgMTAyNCk7CkBAIC04MTQsMTAgKzgzNCwxMSBAQAogCiAJKnNpemUgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spKQorCQlyZXR1cm4gLUVJTlRSOwogCXN0YXR1cyA9IG9wcy0+Z2V0X3ZhcmlhYmxlKGVudHJ5LT52YXIuVmFyaWFibGVOYW1lLAogCQkJCSAgICZlbnRyeS0+dmFyLlZlbmRvckd1aWQsIE5VTEwsIHNpemUsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwl1cCgmZWZpdmFyc19sb2NrKTsKIAogCWlmIChzdGF0dXMgIT0gRUZJX0JVRkZFUl9UT09fU01BTEwpCiAJCXJldHVybiBlZmlfc3RhdHVzX3RvX2VycihzdGF0dXMpOwpAQCAtODQzLDggKzg2NCw2IEBACiAJY29uc3Qgc3RydWN0IGVmaXZhcl9vcGVyYXRpb25zICpvcHMgPSBfX2VmaXZhcnMtPm9wczsKIAllZmlfc3RhdHVzX3Qgc3RhdHVzOwogCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmX19lZml2YXJzLT5sb2NrKTsKLQogCXN0YXR1cyA9IG9wcy0+Z2V0X3ZhcmlhYmxlKGVudHJ5LT52YXIuVmFyaWFibGVOYW1lLAogCQkJCSAgICZlbnRyeS0+dmFyLlZlbmRvckd1aWQsCiAJCQkJICAgYXR0cmlidXRlcywgc2l6ZSwgZGF0YSk7CkBAIC04NjYsMTEgKzg4NSwxMiBAQAogCWNvbnN0IHN0cnVjdCBlZml2YXJfb3BlcmF0aW9ucyAqb3BzID0gX19lZml2YXJzLT5vcHM7CiAJZWZpX3N0YXR1c190IHN0YXR1czsKIAotCXNwaW5fbG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKIAlzdGF0dXMgPSBvcHMtPmdldF92YXJpYWJsZShlbnRyeS0+dmFyLlZhcmlhYmxlTmFtZSwKIAkJCQkgICAmZW50cnktPnZhci5WZW5kb3JHdWlkLAogCQkJCSAgIGF0dHJpYnV0ZXMsIHNpemUsIGRhdGEpOwotCXNwaW5fdW5sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwl1cCgmZWZpdmFyc19sb2NrKTsKIAogCXJldHVybiBlZmlfc3RhdHVzX3RvX2VycihzdGF0dXMpOwogfQpAQCAtOTE3LDcgKzkzNyw4IEBACiAJICogc2V0X3ZhcmlhYmxlIGNhbGwsIGFuZCByZW1vdmFsIG9mIHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBlZml2YXJzCiAJICogbGlzdCAoaW4gdGhlIGNhc2Ugb2YgYW4gYXV0aGVudGljYXRlZCBkZWxldGUpLgogCSAqLwotCXNwaW5fbG9ja19pcnEoJl9fZWZpdmFycy0+bG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKIAogCS8qCiAJICogRW5zdXJlIHRoYXQgdGhlIGF2YWlsYWJsZSBzcGFjZSBoYXNuJ3Qgc2hydW5rIGJlbG93IHRoZSBzYWZlIGxldmVsCkBAIC05NTcsNyArOTc4LDcgQEAKIAlpZiAoc3RhdHVzID09IEVGSV9OT1RfRk9VTkQpCiAJCWVmaXZhcl9lbnRyeV9saXN0X2RlbF91bmxvY2soZW50cnkpOwogCWVsc2UKLQkJc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCQl1cCgmZWZpdmFyc19sb2NrKTsKIAogCWlmIChzdGF0dXMgJiYgc3RhdHVzICE9IEVGSV9CVUZGRVJfVE9PX1NNQUxMKQogCQlyZXR1cm4gZWZpX3N0YXR1c190b19lcnIoc3RhdHVzKTsKQEAgLTk2NSw3ICs5ODYsNyBAQAogCXJldHVybiAwOwogCiBvdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCXVwKCZlZml2YXJzX2xvY2spOwogCXJldHVybiBlcnI7CiAKIH0KQEAgLTk3OCw5ICs5OTksOSBAQAogICogZWZpdmFyX2VudHJ5X2l0ZXJfZW5kKCkgaXMgY2FsbGVkLiBUaGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgdXNlZCBpbgogICogY29uanVuY3Rpb24gd2l0aCBfX2VmaXZhcl9lbnRyeV9pdGVyKCkgb3IgZWZpdmFyX2VudHJ5X2l0ZXIoKS4KICAqLwotdm9pZCBlZml2YXJfZW50cnlfaXRlcl9iZWdpbih2b2lkKQoraW50IGVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKHZvaWQpCiB7Ci0Jc3Bpbl9sb2NrX2lycSgmX19lZml2YXJzLT5sb2NrKTsKKwlyZXR1cm4gZG93bl9pbnRlcnJ1cHRpYmxlKCZlZml2YXJzX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4pOwogCkBAIC05OTEsNyArMTAxMiw3IEBACiAgKi8KIHZvaWQgZWZpdmFyX2VudHJ5X2l0ZXJfZW5kKHZvaWQpCiB7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZfX2VmaXZhcnMtPmxvY2spOworCXVwKCZlZml2YXJzX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZWZpdmFyX2VudHJ5X2l0ZXJfZW5kKTsKIApAQCAtMTA2Nyw3ICsxMDg4LDkgQEAKIHsKIAlpbnQgZXJyID0gMDsKIAotCWVmaXZhcl9lbnRyeV9pdGVyX2JlZ2luKCk7CisJZXJyID0gZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4oKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCWVyciA9IF9fZWZpdmFyX2VudHJ5X2l0ZXIoZnVuYywgaGVhZCwgZGF0YSwgTlVMTCk7CiAJZWZpdmFyX2VudHJ5X2l0ZXJfZW5kKCk7CiAKQEAgLTExMTIsMTIgKzExMzUsMTggQEAKIAkJICAgICBjb25zdCBzdHJ1Y3QgZWZpdmFyX29wZXJhdGlvbnMgKm9wcywKIAkJICAgICBzdHJ1Y3Qga29iamVjdCAqa29iamVjdCkKIHsKLQlzcGluX2xvY2tfaW5pdCgmZWZpdmFycy0+bG9jayk7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWZpdmFyc19sb2NrKSkKKwkJcmV0dXJuIC1FSU5UUjsKKwogCWVmaXZhcnMtPm9wcyA9IG9wczsKIAllZml2YXJzLT5rb2JqZWN0ID0ga29iamVjdDsKIAogCV9fZWZpdmFycyA9IGVmaXZhcnM7CiAKKwlwcl9pbmZvKCJSZWdpc3RlcmVkIGVmaXZhcnMgb3BlcmF0aW9uc1xuIik7CisKKwl1cCgmZWZpdmFyc19sb2NrKTsKKwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZWZpdmFyc19yZWdpc3Rlcik7CkBAIC0xMTMzLDYgKzExNjIsOSBAQAogewogCWludCBydjsKIAorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVmaXZhcnNfbG9jaykpCisJCXJldHVybiAtRUlOVFI7CisKIAlpZiAoIV9fZWZpdmFycykgewogCQlwcmludGsoS0VSTl9FUlIgImVmaXZhcnMgbm90IHJlZ2lzdGVyZWRcbiIpOwogCQlydiA9IC1FSU5WQUw7CkBAIC0xMTQ0LDEwICsxMTc2LDEyIEBACiAJCWdvdG8gb3V0OwogCX0KIAorCXByX2luZm8oIlVucmVnaXN0ZXJlZCBlZml2YXJzIG9wZXJhdGlvbnNcbiIpOwogCV9fZWZpdmFycyA9IE5VTEw7CiAKIAlydiA9IDA7CiBvdXQ6CisJdXAoJmVmaXZhcnNfbG9jayk7CiAJcmV0dXJuIHJ2OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZWZpdmFyc191bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYyBiL2RyaXZlcnMvZmlybXdhcmUvZ29vZ2xlL2dzbWkuYwppbmRleCBmMWFiMDVlLi5jNDYzODcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2dvb2dsZS9nc21pLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9nb29nbGUvZ3NtaS5jCkBAIC05MTAsOCArOTEwLDcgQEAKIAlnc21pX2J1Zl9mcmVlKGdzbWlfZGV2LnBhcmFtX2J1Zik7CiAJZ3NtaV9idWZfZnJlZShnc21pX2Rldi5kYXRhX2J1Zik7CiAJZ3NtaV9idWZfZnJlZShnc21pX2Rldi5uYW1lX2J1Zik7Ci0JaWYgKGdzbWlfZGV2LmRtYV9wb29sKQotCQlkbWFfcG9vbF9kZXN0cm95KGdzbWlfZGV2LmRtYV9wb29sKTsKKwlkbWFfcG9vbF9kZXN0cm95KGdzbWlfZGV2LmRtYV9wb29sKTsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3Rlcihnc21pX2Rldi5wZGV2KTsKIAlwcl9pbmZvKCJnc21pOiBmYWlsZWQgdG8gbG9hZDogJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZnBnYS9LY29uZmlnIGIvZHJpdmVycy9mcGdhL0tjb25maWcKaW5kZXggZDYxNDEwMi4uY2Q4NDkzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9mcGdhL0tjb25maWcKKysrIGIvZHJpdmVycy9mcGdhL0tjb25maWcKQEAgLTIxLDYgKzIxLDcgQEAKIAogY29uZmlnIEZQR0FfTUdSX1pZTlFfRlBHQQogCXRyaXN0YXRlICJYaWxpbnggWnlucSBGUEdBIgorCWRlcGVuZHMgb24gQVJDSF9aWU5RIHx8IENPTVBJTEVfVEVTVAogCWRlcGVuZHMgb24gSEFTX0RNQQogCWhlbHAKIAkgIEZQR0EgbWFuYWdlciBkcml2ZXIgc3VwcG9ydCBmb3IgWGlsaW54IFp5bnEgRlBHQXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vS2NvbmZpZyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCmluZGV4IDY2YTk0MTAuLjI2ZWUwMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCkBAIC0xMCwyNyArMTAsNiBAQAogCSAgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMuICBOZXcgdXNlcyBvZiB0aGlzIGFyZQogCSAgc3Ryb25nbHkgZGlzY291cmFnZWQuCiAKLWNvbmZpZyBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgotCWJvb2wKLQloZWxwCi0JICBTZWxlY3QgdGhpcyBjb25maWcgb3B0aW9uIGZyb20gdGhlIGFyY2hpdGVjdHVyZSBLY29uZmlnLCBpZgotCSAgaXQgaXMgcG9zc2libGUgdG8gdXNlIGdwaW9saWIgb24gdGhlIGFyY2hpdGVjdHVyZSwgYnV0IGxldCB0aGUKLQkgIHVzZXIgZGVjaWRlIHdoZXRoZXIgdG8gYWN0dWFsbHkgYnVpbGQgaXQgb3Igbm90LgotCSAgU2VsZWN0IHRoaXMgaW5zdGVhZCBvZiBBUkNIX1JFUVVJUkVfR1BJT0xJQiwgaWYgeW91ciBhcmNoaXRlY3R1cmUgZG9lcwotCSAgbm90IGRlcGVuZCBvbiBHUElPcyBiZWluZyBhdmFpbGFibGUsIGJ1dCByYXRoZXIgbGV0IHRoZSB1c2VyCi0JICBkZWNpZGUgd2hldGhlciBoZSBuZWVkcyBpdCBvciBub3QuCi0KLWNvbmZpZyBBUkNIX1JFUVVJUkVfR1BJT0xJQgotCWJvb2wKLQlzZWxlY3QgR1BJT0xJQgotCWhlbHAKLQkgIFBsYXRmb3JtcyBzZWxlY3QgZ3Bpb2xpYiBpZiB0aGV5IHVzZSB0aGlzIGluZnJhc3RydWN0dXJlCi0JICBmb3IgYWxsIHRoZWlyIEdQSU9zLCB1c3VhbGx5IHN0YXJ0aW5nIHdpdGggb25lcyBpbnRlZ3JhdGVkCi0JICBpbnRvIFNPQyBwcm9jZXNzb3JzLgotCSAgU2VsZWN0aW5nIHRoaXMgZnJvbSB0aGUgYXJjaGl0ZWN0dXJlIGNvZGUgd2lsbCBjYXVzZSB0aGUgZ3Bpb2xpYgotCSAgY29kZSB0byBhbHdheXMgZ2V0IGJ1aWx0IGluLgotCi0KIG1lbnVjb25maWcgR1BJT0xJQgogCWJvb2wgIkdQSU8gU3VwcG9ydCIKIAlzZWxlY3QgQU5PTl9JTk9ERVMKQEAgLTg3LDYgKzY2LDcgQEAKIAkgIGV4cG9ydGVkIHRvIHVzZXJzcGFjZTsgdGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGVidWdnaW5nLgogCiBjb25maWcgR1BJT19HRU5FUklDCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0gIyBPbmx5IGZvciBJT01FTSBkcml2ZXJzCiAJdHJpc3RhdGUKIAogIyBwdXQgZHJpdmVycyBpbiB0aGUgcmlnaHQgc2VjdGlvbiwgaW4gYWxwaGFiZXRpY2FsIG9yZGVyCkBAIC05Niw2ICs3Niw3IEBACiAJdHJpc3RhdGUKIAogbWVudSAiTWVtb3J5IG1hcHBlZCBHUElPIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAogY29uZmlnIEdQSU9fNzRYWF9NTUlPCiAJdHJpc3RhdGUgIkdQSU8gZHJpdmVyIGZvciA3NHh4LUlDcyB3aXRoIE1NSU8gYWNjZXNzIgpAQCAtMTI4LDYgKzEwOSwxMyBAQAogCSAgZHJpdmVyIGZvciBHUElPIGZ1bmN0aW9uYWxpdHkgb24gUHJvbW9udG9yeSBJT0h1YgogCSAgUmVxdWlyZSBBQ1BJIEFTTCBjb2RlIHRvIGVudW1lcmF0ZSBhcyBhIHBsYXRmb3JtIGRldmljZS4KIAorY29uZmlnIEdQSU9fQVNQRUVECisJdHJpc3RhdGUgIkFzcGVlZCBHUElPIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAoQVJDSF9BU1BFRUQgfHwgQ09NUElMRV9URVNUKSAmJiBPRl9HUElPCisJc2VsZWN0IEdQSU9MSUJfSVJRQ0hJUAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCBBc3BlZWQgQVNUMjQwMCBhbmQgQVNUMjUwMCBHUElPIGNvbnRyb2xsZXJzLgorCiBjb25maWcgR1BJT19BVEg3OQogCXRyaXN0YXRlICJBdGhlcm9zIEFSNzFYWC9BUjcyNFgvQVI5MTNYIEdQSU8gc3VwcG9ydCIKIAlkZWZhdWx0IHkgaWYgQVRINzkKQEAgLTEzOCw2ICsxMjYsMTIgQEAKIAkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgR1BJTyBkcml2ZXIgZm9yCiAJICBBdGhlcm9zIEFSNzFYWC9BUjcyNFgvQVI5MTNYIFNvQyBkZXZpY2VzLgogCitjb25maWcgR1BJT19BWFAyMDkKKwl0cmlzdGF0ZSAiWC1Qb3dlcnMgQVhQMjA5IFBNSUMgR1BJTyBTdXBwb3J0IgorCWRlcGVuZHMgb24gTUZEX0FYUDIwWAorCWhlbHAKKwkgIFNheSB5ZXMgdG8gZW5hYmxlIEdQSU8gc3VwcG9ydCBmb3IgdGhlIEFYUDIwOSBQTUlDCisKIGNvbmZpZyBHUElPX0JDTV9LT05BCiAJYm9vbCAiQnJvYWRjb20gS29uYSBHUElPIgogCWRlcGVuZHMgb24gT0ZfR1BJTyAmJiAoQVJDSF9CQ01fTU9CSUxFIHx8IENPTVBJTEVfVEVTVCkKQEAgLTIzNyw3ICsyMzEsOCBAQAogCiBjb25maWcgR1BJT19JT1AKIAl0cmlzdGF0ZSAiSW50ZWwgSU9QIEdQSU8iCi0JZGVwZW5kcyBvbiBBUk0gJiYgKEFSQ0hfSU9QMzJYIHx8IEFSQ0hfSU9QMzNYKQorCWRlcGVuZHMgb24gQVJDSF9JT1AzMlggfHwgQVJDSF9JT1AzM1ggfHwgQ09NUElMRV9URVNUCisJc2VsZWN0IEdQSU9fR0VORVJJQwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IHRoZSBHUElPIGZ1bmN0aW9uYWxpdHkgb2YgYSBudW1iZXIgb2YgSW50ZWwKIAkgIElPUDMyWCBvciBJT1AzM1guCkBAIC0yODcsNiArMjgyLDE4IEBACiAJICAoRUJVKSBmb3VuZCBvbiBMYW50aXEgU29Dcy4gVGhlIGdwaW9zIGFyZSBvdXRwdXQgb25seSBhcyB0aGV5IGFyZQogCSAgY3JlYXRlZCBieSBhdHRhY2hpbmcgYSAxNmJpdCBsYXRjaCB0byB0aGUgYnVzLgogCitjb25maWcgR1BJT19NT0NLVVAKKwl0cmlzdGF0ZSAiR1BJTyBUZXN0aW5nIERyaXZlciIKKwlkZXBlbmRzIG9uIEdQSU9MSUIKKwlzZWxlY3QgR1BJT19TWVNGUworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBHUElPIFRlc3RpbmcgZHJpdmVyLCB3aGljaCBwcm92aWRlcyBhIHdheSB0byB0ZXN0IEdQSU8KKwkgIHN1YnN5c3RlbSB0aHJvdWdoIHN5c2ZzKG9yIGNoYXIgZGV2aWNlKSBhbmQgZGVidWdmcy4gR1BJT19TWVNGUworCSAgbXVzdCBiZSBzZWxlY3RlZCBmb3IgdGhpcyB0ZXN0LgorCSAgVXNlciBjb3VsZCB1c2UgaXQgdGhyb3VnaCB0aGUgc2NyaXB0IGluCisJICB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9ncGlvL2dwaW8tbW9ja3VwLnNoLiBSZWZlcmVuY2UgdGhlIHVzYWdlIGluCisJICBpdC4KKwogY29uZmlnIEdQSU9fTU9YQVJUCiAJYm9vbCAiTU9YQVJUIEdQSU8gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfTU9YQVJUIHx8IENPTVBJTEVfVEVTVApAQCAtNTc0LDYgKzU4MSwxOSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCiAJICBiZSBjYWxsZWQgZjcxODh4LWdwaW8uCiAKK2NvbmZpZyBHUElPX0dQSU9fTU0KKwl0cmlzdGF0ZSAiRGlhbW9uZCBTeXN0ZW1zIEdQSU8tTU0gR1BJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSVNBX0JVU19BUEkKKwloZWxwCisJICBFbmFibGVzIEdQSU8gc3VwcG9ydCBmb3IgdGhlIERpYW1vbmQgU3lzdGVtcyBHUElPLU1NIGFuZCBHUElPLU1NLTEyLgorCisJICBUaGUgRGlhbW9uZCBTeXN0ZW1zIEdQSU8tTU0gZGV2aWNlIGZlYXR1cmVzIDQ4IGxpbmVzIG9mIGRpZ2l0YWwgSS9PCisJICB2aWEgdGhlIGVtdWxhdGlvbiBvZiBkdWFsIDgyQzU1QSBQUEkgY2hpcHMuIFRoaXMgZHJpdmVyIHByb3ZpZGVzIEdQSU8KKwkgIHN1cHBvcnQgZm9yIHRoZXNlIDQ4IGNoYW5uZWxzIG9mIGRpZ2l0YWwgSS9PLgorCisJICBUaGUgYmFzZSBwb3J0IGFkZHJlc3NlcyBmb3IgdGhlIGRldmljZXMgbWF5IGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBiYXNlCisJICBhcnJheSBtb2R1bGUgcGFyYW1ldGVyLgorCiBjb25maWcgR1BJT19JVDg3CiAJdHJpc3RhdGUgIklUODd4eCBHUElPIHN1cHBvcnQiCiAJaGVscApAQCAtNzgwLDYgKzgwMCwxMyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCiAJICBiZSBjYWxsZWQgZ3Bpby10cGljMjgxMC4KIAorY29uZmlnIEdQSU9fVFM0OTAwCisJdHJpc3RhdGUgIlRlY2hub2xvZ2ljIFN5c3RlbXMgRlBHQSBJMkMgR1BJTyIKKwlzZWxlY3QgUkVHTUFQX0kyQworCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBlbmFibGVkIHRoZSBHUElPIGRyaXZlciBmb3IgVGVjaG5vbG9naWMncyBGUEdBIGNvcmUuCisJICBTZXJpZXMgc3VwcG9ydGVkIGluY2x1ZGUgVFMtNDEwMCwgVFMtNDkwMCwgVFMtNzk3MCBhbmQgVFMtNzk5MC4KKwogZW5kbWVudQogCiBtZW51ICJNRkQgR1BJTyBleHBhbmRlcnMiCkBAIC04NDksNiArODc2LDE0IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGdwaW8tZGxuMi4KIAorY29uZmlnIEhUQ19FR1BJTworCWJvb2wgIkhUQyBFR1BJTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gR1BJT0xJQiAmJiBBUk0KKwloZWxwCisJICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBDUExEIGVncGlvIGNoaXAgcHJlc2VudCBvbgorCSAgICBzZXZlcmFsIEhUQyBwaG9uZXMuICBJdCBwcm92aWRlcyBiYXNpYyBzdXBwb3J0IGZvciBpbnB1dAorCSAgICBwaW5zLCBvdXRwdXQgcGlucywgYW5kIGlycXMuCisKIGNvbmZpZyBHUElPX0pBTlpfVFRMCiAJdHJpc3RhdGUgIkphbnogVk1PRC1UVEwgRGlnaXRhbCBJTyBNb2R1bGUiCiAJZGVwZW5kcyBvbiBNRkRfSkFOWl9DTU9ESU8KQEAgLTg3NSw2ICs5MTAsMTYgQEAKIAkgIExQMzk0MyBjYW4gYmUgdXNlZCBhcyBhIEdQSU8gZXhwYW5kZXIgd2hpY2ggcHJvdmlkZXMgdXAgdG8gMTYgR1BJT3MuCiAJICBPcGVuIGRyYWluIG91dHB1dHMgYXJlIHJlcXVpcmVkIGZvciB0aGlzIHVzYWdlLgogCitjb25maWcgR1BJT19MUDg3M1gKKwl0cmlzdGF0ZSAiVEkgTFA4NzNYIEdQTyIKKwlkZXBlbmRzIG9uIE1GRF9USV9MUDg3M1gKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgR1BPIG9uIFRJIExwODczeCBQTUlDcy4gMiBHUE9zIGFyZSBwcmVzZW50CisJICBvbiBMUDg3M1ggUE1JQ3MuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCisgICAgICAgICAgY2FsbGVkIGdwaW8tbHA4NzN4LgorCiBjb25maWcgR1BJT19NQVg3NzYyMAogCXRyaXN0YXRlICJHUElPIHN1cHBvcnQgZm9yIFBNSUMgTUFYNzc2MjAgYW5kIE1BWDIwMDI0IgogCWRlcGVuZHMgb24gTUZEX01BWDc3NjIwCkBAIC05ODUsNiArMTAzMCwxOSBAQAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBQaGlsaXBzIFVDQjE0MDAgR1BJTyBwaW5zLgogCSAgVGhlIFVDQjE0MDAgaXMgYW4gQUM5NyBhdWRpbyBjb2RlYy4KIAorY29uZmlnIEdQSU9fV0hJU0tFWV9DT1ZFCisJdHJpc3RhdGUgIkdQSU8gc3VwcG9ydCBmb3IgV2hpc2tleSBDb3ZlIFBNSUMiCisJZGVwZW5kcyBvbiBJTlRFTF9TT0NfUE1JQworCXNlbGVjdCBHUElPTElCX0lSUUNISVAKKwloZWxwCisJICBTdXBwb3J0IGZvciBHUElPIHBpbnMgb24gV2hpc2tleSBDb3ZlIFBNSUMuCisKKwkgIFNheSBZZXMgaWYgeW91IGhhdmUgYSBJbnRlbCBTb0MgYmFzZWQgdGFibGV0IHdpdGggV2hpc2tleSBDb3ZlIFBNSUMKKwkgIGluc2lkZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBncGlvLXdjb3ZlLgorCiBjb25maWcgR1BJT19XTTgzMVgKIAl0cmlzdGF0ZSAiV004MzF4IEdQSU9zIgogCWRlcGVuZHMgb24gTUZEX1dNODMxWApAQCAtMTEzMSw2ICsxMTg5LDcgQEAKIAogY29uZmlnIEdQSU9fTUNQMjNTMDgKIAl0cmlzdGF0ZSAiTWljcm9jaGlwIE1DUDIzeHh4IEkvTyBleHBhbmRlciIKKwlkZXBlbmRzIG9uIE9GX0dQSU8KIAlzZWxlY3QgR1BJT0xJQl9JUlFDSElQCiAJaGVscAogCSAgU1BJL0kyQyBkcml2ZXIgZm9yIE1pY3JvY2hpcCBNQ1AyM1MwOC9NQ1AyM1MxNy9NQ1AyMzAwOC9NQ1AyMzAxNwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL01ha2VmaWxlIGIvZHJpdmVycy9ncGlvL01ha2VmaWxlCmluZGV4IDJhMDM1ZWQuLmFiMjhhMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKQEAgLTI4LDYgKzI4LDggQEAKIG9iai0kKENPTkZJR19HUElPX0FNRFBUKQkrPSBncGlvLWFtZHB0Lm8KIG9iai0kKENPTkZJR19HUElPX0FSSVpPTkEpCSs9IGdwaW8tYXJpem9uYS5vCiBvYmotJChDT05GSUdfR1BJT19BVEg3OSkJKz0gZ3Bpby1hdGg3OS5vCitvYmotJChDT05GSUdfR1BJT19BU1BFRUQpCSs9IGdwaW8tYXNwZWVkLm8KK29iai0kKENPTkZJR19HUElPX0FYUDIwOSkJKz0gZ3Bpby1heHAyMDkubwogb2JqLSQoQ09ORklHX0dQSU9fQkNNX0tPTkEpCSs9IGdwaW8tYmNtLWtvbmEubwogb2JqLSQoQ09ORklHX0dQSU9fQlJDTVNUQikJKz0gZ3Bpby1icmNtc3RiLm8KIG9iai0kKENPTkZJR19HUElPX0JUOFhYKQkrPSBncGlvLWJ0OHh4Lm8KQEAgLTQ0LDcgKzQ2LDkgQEAKIG9iai0kKENPTkZJR19HUElPX0VUUkFYRlMpCSs9IGdwaW8tZXRyYXhmcy5vCiBvYmotJChDT05GSUdfR1BJT19GNzE4OFgpCSs9IGdwaW8tZjcxODh4Lm8KIG9iai0kKENPTkZJR19HUElPX0dFX0ZQR0EpCSs9IGdwaW8tZ2Uubworb2JqLSQoQ09ORklHX0dQSU9fR1BJT19NTSkJKz0gZ3Bpby1ncGlvLW1tLm8KIG9iai0kKENPTkZJR19HUElPX0dSR1BJTykJKz0gZ3Bpby1ncmdwaW8ubworb2JqLSQoQ09ORklHX0hUQ19FR1BJTykJCSs9IGdwaW8taHRjLWVncGlvLm8KIG9iai0kKENPTkZJR19HUElPX0lDSCkJCSs9IGdwaW8taWNoLm8KIG9iai0kKENPTkZJR19HUElPX0lPUCkJCSs9IGdwaW8taW9wLm8KIG9iai0kKENPTkZJR19HUElPX0lUODcpCQkrPSBncGlvLWl0ODcubwpAQCAtNTYsNiArNjAsNyBAQAogb2JqLSQoQ09ORklHX0dQSU9fTFAzOTQzKQkrPSBncGlvLWxwMzk0My5vCiBvYmotJChDT05GSUdfR1BJT19MUEMxOFhYKQkrPSBncGlvLWxwYzE4eHgubwogb2JqLSQoQ09ORklHX0FSQ0hfTFBDMzJYWCkJKz0gZ3Bpby1scGMzMnh4Lm8KK29iai0kKENPTkZJR19HUElPX0xQODczWCkJKz0gZ3Bpby1scDg3M3gubwogb2JqLSQoQ09ORklHX0dQSU9fTFlOWFBPSU5UKQkrPSBncGlvLWx5bnhwb2ludC5vCiBvYmotJChDT05GSUdfR1BJT19NQVg3MzBYKQkrPSBncGlvLW1heDczMHgubwogb2JqLSQoQ09ORklHX0dQSU9fTUFYNzMwMCkJKz0gZ3Bpby1tYXg3MzAwLm8KQEAgLTcwLDYgKzc1LDcgQEAKIG9iai0kKENPTkZJR19HUElPX01DUDIzUzA4KQkrPSBncGlvLW1jcDIzczA4Lm8KIG9iai0kKENPTkZJR19HUElPX01MX0lPSCkJKz0gZ3Bpby1tbC1pb2gubwogb2JqLSQoQ09ORklHX0dQSU9fTU1fTEFOVElRKQkrPSBncGlvLW1tLWxhbnRpcS5vCitvYmotJChDT05GSUdfR1BJT19NT0NLVVApICAgICAgKz0gZ3Bpby1tb2NrdXAubwogb2JqLSQoQ09ORklHX0dQSU9fTU9YQVJUKQkrPSBncGlvLW1veGFydC5vCiBvYmotJChDT05GSUdfR1BJT19NUEM1MjAwKQkrPSBncGlvLW1wYzUyMDAubwogb2JqLSQoQ09ORklHX0dQSU9fTVBDOFhYWCkJKz0gZ3Bpby1tcGM4eHh4Lm8KQEAgLTExMCw2ICsxMTYsNyBAQAogb2JqLSQoQ09ORklHX0dQSU9fVFBTNjU5MTApCSs9IGdwaW8tdHBzNjU5MTAubwogb2JqLSQoQ09ORklHX0dQSU9fVFBTNjU5MTIpCSs9IGdwaW8tdHBzNjU5MTIubwogb2JqLSQoQ09ORklHX0dQSU9fVFM0ODAwKQkrPSBncGlvLXRzNDgwMC5vCitvYmotJChDT05GSUdfR1BJT19UUzQ5MDApCSs9IGdwaW8tdHM0OTAwLm8KIG9iai0kKENPTkZJR19HUElPX1RTNTUwMCkJKz0gZ3Bpby10czU1MDAubwogb2JqLSQoQ09ORklHX0dQSU9fVFdMNDAzMCkJKz0gZ3Bpby10d2w0MDMwLm8KIG9iai0kKENPTkZJR19HUElPX1RXTDYwNDApCSs9IGdwaW8tdHdsNjA0MC5vCkBAIC0xMjAsNiArMTI3LDcgQEAKIG9iai0kKENPTkZJR19HUElPX1ZJUEVSQk9BUkQpCSs9IGdwaW8tdmlwZXJib2FyZC5vCiBvYmotJChDT05GSUdfR1BJT19WUjQxWFgpCSs9IGdwaW8tdnI0MXh4Lm8KIG9iai0kKENPTkZJR19HUElPX1ZYODU1KQkrPSBncGlvLXZ4ODU1Lm8KK29iai0kKENPTkZJR19HUElPX1dISVNLRVlfQ09WRSkJKz0gZ3Bpby13Y292ZS5vCiBvYmotJChDT05GSUdfR1BJT19XTTgzMVgpCSs9IGdwaW8td204MzF4Lm8KIG9iai0kKENPTkZJR19HUElPX1dNODM1MCkJKz0gZ3Bpby13bTgzNTAubwogb2JqLSQoQ09ORklHX0dQSU9fV004OTk0KQkrPSBncGlvLXdtODk5NC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1hbHRlcmEuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWFsdGVyYS5jCmluZGV4IDNmODdhMDMuLjViZGRiZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWFsdGVyYS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWFsdGVyYS5jCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+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+ZGV2LCBnYywgTlVMTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlvcDN4eF9ncGlvX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWl0ODcuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWl0ODcuYwppbmRleCA2M2E5NjJkLi40NWQyOWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1pdDg3LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8taXQ4Ny5jCkBAIC0yNzMsNyArMjczLDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIGl0ODdfdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIGl0ODdfdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9IEtCVUlMRF9NT0ROQU1FLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnJlcXVlc3QJCT0gaXQ4N19ncGlvX3JlcXVlc3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1sb29uZ3NvbjEuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxvb25nc29uMS5jCmluZGV4IDEwYzA5YmQuLjcyYjY0MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxvb25nc29uMS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxvb25nc29uMS5jCkBAIC04LDYgKzgsNyBAQAogICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCkBAIC01NSwxMSArNTYsNiBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZXMpIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IEkvTyBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlncGlvX3JlZ19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKGdwaW9fcmVnX2Jhc2UpKQogCQlyZXR1cm4gUFRSX0VSUihncGlvX3JlZ19iYXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxwODczeC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbHA4NzN4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4YzcwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWxwODczeC5jCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICoJS2VlcnRoeSA8ai1rZWVydGh5QHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzZWQgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBCYXNlZCBvbiB0aGUgVFBTNjUyMTggZHJpdmVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC9scDg3M3guaD4KKworI2RlZmluZSBCSVRTX1BFUl9HUE8JCTB4NAorI2RlZmluZSBMUDg3M1hfR1BPX0NUUkxfT0QJMHgyCisKK3N0cnVjdCBscDg3M3hfZ3BpbyB7CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworCXN0cnVjdCBscDg3M3ggKmxwODczOworfTsKKworc3RhdGljIGludCBscDg3M3hfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCS8qIFRoaXMgZGV2aWNlIGlzIG91dHB1dCBvbmx5ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHA4NzN4X2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJLyogVGhpcyBkZXZpY2UgaXMgb3V0cHV0IG9ubHkgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBscDg3M3hfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJCXVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbHA4NzN4X2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCS8qIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSAqLworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoZ3Bpby0+bHA4NzMtPnJlZ21hcCwgTFA4NzNYX1JFR19HUE9fQ1RSTCwKKwkJCQkgIEJJVChvZmZzZXQgKiBCSVRTX1BFUl9HUE8pLAorCQkJCSAgdmFsdWUgPyBCSVQob2Zmc2V0ICogQklUU19QRVJfR1BPKSA6IDApOworfQorCitzdGF0aWMgaW50IGxwODczeF9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBscDg3M3hfZ3BpbyAqZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCWludCByZXQsIHZhbDsKKworCXJldCA9IHJlZ21hcF9yZWFkKGdwaW8tPmxwODczLT5yZWdtYXAsIExQODczWF9SRUdfR1BPX0NUUkwsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHZhbCAmIEJJVChvZmZzZXQgKiBCSVRTX1BFUl9HUE8pOworfQorCitzdGF0aWMgdm9pZCBscDg3M3hfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICBpbnQgdmFsdWUpCit7CisJc3RydWN0IGxwODczeF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoZ3Bpby0+bHA4NzMtPnJlZ21hcCwgTFA4NzNYX1JFR19HUE9fQ1RSTCwKKwkJCSAgIEJJVChvZmZzZXQgKiBCSVRTX1BFUl9HUE8pLAorCQkJICAgdmFsdWUgPyBCSVQob2Zmc2V0ICogQklUU19QRVJfR1BPKSA6IDApOworfQorCitzdGF0aWMgaW50IGxwODczeF9ncGlvX3JlcXVlc3Qoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IGxwODczeF9ncGlvICpncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKG9mZnNldCkgeworCWNhc2UgMDoKKwkJLyogTm8gTVVYIFNldCB1cCBOZWVkZWQgZm9yIEdQTyAqLworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIFNldHVwIHRoZSBDTEtJTl9QSU5fU0VMIE1VWCB0byBHUE8yICovCisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhncGlvLT5scDg3My0+cmVnbWFwLCBMUDg3M1hfUkVHX0NPTkZJRywKKwkJCQkJIExQODczWF9DT05GSUdfQ0xLSU5fUElOX1NFTCwgMCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwODczeF9ncGlvX3NldF9zaW5nbGVfZW5kZWQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCisJCQkJCXVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkJCWVudW0gc2luZ2xlX2VuZGVkX21vZGUgbW9kZSkKK3sKKwlzdHJ1Y3QgbHA4NzN4X2dwaW8gKmdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIExJTkVfTU9ERV9PUEVOX0RSQUlOOgorCQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGdwaW8tPmxwODczLT5yZWdtYXAsCisJCQkJCSAgTFA4NzNYX1JFR19HUE9fQ1RSTCwKKwkJCQkJICBCSVQob2Zmc2V0ICogQklUU19QRVJfR1BPICsKKwkJCQkJICBMUDg3M1hfR1BPX0NUUkxfT0QpLAorCQkJCQkgIEJJVChvZmZzZXQgKiBCSVRTX1BFUl9HUE8gKworCQkJCQkgIExQODczWF9HUE9fQ1RSTF9PRCkpOworCWNhc2UgTElORV9NT0RFX1BVU0hfUFVMTDoKKwkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhncGlvLT5scDg3My0+cmVnbWFwLAorCQkJCQkgIExQODczWF9SRUdfR1BPX0NUUkwsCisJCQkJCSAgQklUKG9mZnNldCAqIEJJVFNfUEVSX0dQTyArCisJCQkJCSAgTFA4NzNYX0dQT19DVFJMX09EKSwgMCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CisJLmxhYmVsCQkJPSAibHA4NzN4LWdwaW8iLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLnJlcXVlc3QJCT0gbHA4NzN4X2dwaW9fcmVxdWVzdCwKKwkuZ2V0X2RpcmVjdGlvbgkJPSBscDg3M3hfZ3Bpb19nZXRfZGlyZWN0aW9uLAorCS5kaXJlY3Rpb25faW5wdXQJPSBscDg3M3hfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCisJLmRpcmVjdGlvbl9vdXRwdXQJPSBscDg3M3hfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LAorCS5nZXQJCQk9IGxwODczeF9ncGlvX2dldCwKKwkuc2V0CQkJPSBscDg3M3hfZ3Bpb19zZXQsCisJLnNldF9zaW5nbGVfZW5kZWQJPSBscDg3M3hfZ3Bpb19zZXRfc2luZ2xlX2VuZGVkLAorCS5iYXNlCQkJPSAtMSwKKwkubmdwaW8JCQk9IDIsCisJLmNhbl9zbGVlcAkJPSB0cnVlLAorfTsKKworc3RhdGljIGludCBscDg3M3hfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBscDg3M3hfZ3BpbyAqZ3BpbzsKKwlpbnQgcmV0OworCisJZ3BpbyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmdwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdwaW8pCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZ3Bpbyk7CisKKwlncGlvLT5scDg3MyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlncGlvLT5jaGlwID0gdGVtcGxhdGVfY2hpcDsKKwlncGlvLT5jaGlwLnBhcmVudCA9IGdwaW8tPmxwODczLT5kZXY7CisKKwlyZXQgPSBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKCZwZGV2LT5kZXYsICZncGlvLT5jaGlwLCBncGlvKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgcmVnaXN0ZXIgZ3Bpb2NoaXAsICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBscDg3M3hfZ3Bpb19pZF90YWJsZVtdID0geworCXsgImxwODczeC1ncGlvIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBscDg3M3hfZ3Bpb19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGxwODczeF9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJscDg3M3gtZ3BpbyIsCisJfSwKKwkucHJvYmUgPSBscDg3M3hfZ3Bpb19wcm9iZSwKKwkuaWRfdGFibGUgPSBscDg3M3hfZ3Bpb19pZF90YWJsZSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGxwODczeF9ncGlvX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIktlZXJ0aHkgPGota2VlcnRoeUB0aS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxQODczWCBHUElPIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbHBjMTh4eC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbHBjMTh4eC5jCmluZGV4IDk4ODMyYzkuLmYxMmUwMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzE4eHguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1scGMxOHh4LmMKQEAgLTc4LDcgKzc4LDcgQEAKIAlyZXR1cm4gbHBjMTh4eF9ncGlvX2RpcmVjdGlvbihjaGlwLCBvZmZzZXQsIHRydWUpOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBscGMxOHh4X2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCBscGMxOHh4X2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAibHBjMTh4eC80M3h4LWdwaW8iLAogCS5yZXF1ZXN0CQk9IGdwaW9jaGlwX2dlbmVyaWNfcmVxdWVzdCwKIAkuZnJlZQkJCT0gZ3Bpb2NoaXBfZ2VuZXJpY19mcmVlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbHBjMzJ4eC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbHBjMzJ4eC5jCmluZGV4IGZjNWYxOTcuLjkyYjNhZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWxwYzMyeHguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1scGMzMnh4LmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9ncGlvLWxwYzMyeHguaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtYWNoL3BsYXRmb3JtLmg+CkBAIC02OCw2ICs2NywyMCBAQAogI2RlZmluZSBHUEkzX1BJTl9JTl9TRUwoeCwgeSkJCQkoKCh4KSA+PiAoeSkpICYgMSkKICNkZWZpbmUgR1BPM19QSU5fSU5fU0VMKHgsIHkpCQkJKCgoeCkgPj4gKHkpKSAmIDEpCiAKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX01BWAk4CisjZGVmaW5lIExQQzMyWFhfR1BJT19QMV9NQVgJMjQKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX01BWAkxMworI2RlZmluZSBMUEMzMlhYX0dQSU9fUDNfTUFYCTYKKyNkZWZpbmUgTFBDMzJYWF9HUElfUDNfTUFYCTI5CisjZGVmaW5lIExQQzMyWFhfR1BPX1AzX01BWAkyNAorCisjZGVmaW5lIExQQzMyWFhfR1BJT19QMF9HUlAJMAorI2RlZmluZSBMUEMzMlhYX0dQSU9fUDFfR1JQCShMUEMzMlhYX0dQSU9fUDBfR1JQICsgTFBDMzJYWF9HUElPX1AwX01BWCkKKyNkZWZpbmUgTFBDMzJYWF9HUElPX1AyX0dSUAkoTFBDMzJYWF9HUElPX1AxX0dSUCArIExQQzMyWFhfR1BJT19QMV9NQVgpCisjZGVmaW5lIExQQzMyWFhfR1BJT19QM19HUlAJKExQQzMyWFhfR1BJT19QMl9HUlAgKyBMUEMzMlhYX0dQSU9fUDJfTUFYKQorI2RlZmluZSBMUEMzMlhYX0dQSV9QM19HUlAJKExQQzMyWFhfR1BJT19QM19HUlAgKyBMUEMzMlhYX0dQSU9fUDNfTUFYKQorI2RlZmluZSBMUEMzMlhYX0dQT19QM19HUlAJKExQQzMyWFhfR1BJX1AzX0dSUCArIExQQzMyWFhfR1BJX1AzX01BWCkKKwogc3RydWN0IGdwaW9fcmVncyB7CiAJdm9pZCBfX2lvbWVtICppbnBfc3RhdGU7CiAJdm9pZCBfX2lvbWVtICpvdXRwX3N0YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbWNwMjNzMDguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1jcDIzczA4LmMKaW5kZXggYWMyMmVmYy4uOTlkMzdiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbWNwMjNzMDguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tY3AyM3MwOC5jCkBAIC01NjQsNyArNTY0LDcgQEAKIAltY3AtPmNoaXAuZGlyZWN0aW9uX291dHB1dCA9IG1jcDIzczA4X2RpcmVjdGlvbl9vdXRwdXQ7CiAJbWNwLT5jaGlwLnNldCA9IG1jcDIzczA4X3NldDsKIAltY3AtPmNoaXAuZGJnX3Nob3cgPSBtY3AyM3MwOF9kYmdfc2hvdzsKLSNpZmRlZiBDT05GSUdfT0YKKyNpZmRlZiBDT05GSUdfT0ZfR1BJTwogCW1jcC0+Y2hpcC5vZl9ncGlvX25fY2VsbHMgPSAyOwogCW1jcC0+Y2hpcC5vZl9ub2RlID0gZGV2LT5vZl9ub2RlOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1tbWlvLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tbWlvLmMKaW5kZXggNmVjMTQ0Yi4uZDdkMDNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tbW1pby5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1taW8uYwpAQCAtNTczLDYgKzU3Myw3IEBACiAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJncGlvX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTYzNDUtZ3BpbyIgfSwKIAl7IC5jb21wYXRpYmxlID0gIndkLG1ibC1ncGlvIiB9LAogCXsgfQogfTsKQEAgLTU5Myw2ICs1OTQsOSBAQAogCiAJcGRhdGEtPmJhc2UgPSAtMTsKIAorCWlmIChvZl9kZXZpY2VfaXNfYmlnX2VuZGlhbihwZGV2LT5kZXYub2Zfbm9kZSkpCisJCSpmbGFncyB8PSBCR1BJT0ZfQklHX0VORElBTl9CWVRFX09SREVSOworCiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwgIm5vLW91dHB1dCIpKQogCQkqZmxhZ3MgfD0gQkdQSU9GX05PX09VVFBVVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbW9ja3VwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tb2NrdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWY4NWIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbW9ja3VwLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBHUElPIFRlc3RpbmcgRGV2aWNlIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCAgS2FtbGFrYW50IFBhdGVsIDxrYW1sYWthbnQucGF0ZWxAYnJvYWRjb20uY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE1LTIwMTYgIEJhbXZvciBKaWFuIFpoYW5nIDxiYW12b3IuemhhbmdqaWFuQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjZGVmaW5lIEdQSU9fTkFNRQkiZ3Bpby1tb2NrdXAiCisjZGVmaW5lCU1BWF9HQwkJMTAKKworZW51bSBkaXJlY3Rpb24geworCU9VVCwKKwlJTgorfTsKKworLyoKKyAqIHN0cnVjdCBncGlvX3Bpbl9zdGF0dXMgLSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIEdQSU8gc3RhdHVzCisgKiBAZGlyOiAgICAgICBDb25maWd1cmVzIGRpcmVjdGlvbiBvZiBncGlvIGFzICJpbiIgb3IgIm91dCIsIDA9aW4sIDE9b3V0CisgKiBAdmFsdWU6ICAgICBDb25maWd1cmVzIHN0YXR1cyBvZiB0aGUgZ3BpbyBhcyAwKGxvdykgb3IgMShoaWdoKQorICovCitzdHJ1Y3QgZ3Bpb19waW5fc3RhdHVzIHsKKwllbnVtIGRpcmVjdGlvbiBkaXI7CisJYm9vbCB2YWx1ZTsKK307CisKK3N0cnVjdCBtb2NrdXBfZ3Bpb19jb250cm9sbGVyIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdjOworCXN0cnVjdCBncGlvX3Bpbl9zdGF0dXMgKnN0YXRzOworfTsKKworc3RhdGljIGludCBncGlvX21vY2t1cF9yYW5nZXNbTUFYX0dDIDw8IDFdOworc3RhdGljIGludCBncGlvX21vY2t1cF9wYXJhbXNfbnI7Cittb2R1bGVfcGFyYW1fYXJyYXkoZ3Bpb19tb2NrdXBfcmFuZ2VzLCBpbnQsICZncGlvX21vY2t1cF9wYXJhbXNfbnIsIDA0MDApOworCitjb25zdCBjaGFyIHBpbnNfbmFtZV9zdGFydCA9ICdBJzsKKworc3RhdGljIGludCBtb2NrdXBfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IG1vY2t1cF9ncGlvX2NvbnRyb2xsZXIgKmNudHIgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisKKwlyZXR1cm4gY250ci0+c3RhdHNbb2Zmc2V0XS52YWx1ZTsKK30KKworc3RhdGljIHZvaWQgbW9ja3VwX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbW9ja3VwX2dwaW9fY29udHJvbGxlciAqY250ciA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKKworCWNudHItPnN0YXRzW29mZnNldF0udmFsdWUgPSAhIXZhbHVlOworfQorCitzdGF0aWMgaW50IG1vY2t1cF9ncGlvX2Rpcm91dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCSAgICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbW9ja3VwX2dwaW9fY29udHJvbGxlciAqY250ciA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKKworCW1vY2t1cF9ncGlvX3NldChnYywgb2Zmc2V0LCB2YWx1ZSk7CisJY250ci0+c3RhdHNbb2Zmc2V0XS5kaXIgPSBPVVQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW9ja3VwX2dwaW9fZGlyaW4oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IG1vY2t1cF9ncGlvX2NvbnRyb2xsZXIgKmNudHIgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisKKwljbnRyLT5zdGF0c1tvZmZzZXRdLmRpciA9IElOOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vY2t1cF9ncGlvX2dldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IG1vY2t1cF9ncGlvX2NvbnRyb2xsZXIgKmNudHIgPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CisKKwlyZXR1cm4gY250ci0+c3RhdHNbb2Zmc2V0XS5kaXI7Cit9CisKK3N0YXRpYyBpbnQgbW9ja3VwX2dwaW9fYWRkKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBtb2NrdXBfZ3Bpb19jb250cm9sbGVyICpjbnRyLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGJhc2UsIGludCBuZ3BpbykKK3sKKwlpbnQgcmV0OworCisJY250ci0+Z2MuYmFzZSA9IGJhc2U7CisJY250ci0+Z2MubmdwaW8gPSBuZ3BpbzsKKwljbnRyLT5nYy5sYWJlbCA9IG5hbWU7CisJY250ci0+Z2Mub3duZXIgPSBUSElTX01PRFVMRTsKKwljbnRyLT5nYy5wYXJlbnQgPSBkZXY7CisJY250ci0+Z2MuZ2V0ID0gbW9ja3VwX2dwaW9fZ2V0OworCWNudHItPmdjLnNldCA9IG1vY2t1cF9ncGlvX3NldDsKKwljbnRyLT5nYy5kaXJlY3Rpb25fb3V0cHV0ID0gbW9ja3VwX2dwaW9fZGlyb3V0OworCWNudHItPmdjLmRpcmVjdGlvbl9pbnB1dCA9IG1vY2t1cF9ncGlvX2RpcmluOworCWNudHItPmdjLmdldF9kaXJlY3Rpb24gPSBtb2NrdXBfZ3Bpb19nZXRfZGlyZWN0aW9uOworCWNudHItPnN0YXRzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjbnRyLT5zdGF0cykgKiBjbnRyLT5nYy5uZ3BpbywKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNudHItPnN0YXRzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwlyZXQgPSBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKGRldiwgJmNudHItPmdjLCBjbnRyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWRldl9pbmZvKGRldiwgImdwaW88JWQuLiVkPiBhZGQgc3VjY2Vzc2Z1bCEiLCBiYXNlLCBiYXNlICsgbmdwaW8pOworCXJldHVybiAwOworZXJyOgorCWRldl9lcnIoZGV2LCAiZ3BpbzwlZC4uJWQ+IGFkZCBmYWlsZWQhIiwgYmFzZSwgYmFzZSArIG5ncGlvKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1vY2t1cF9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgbW9ja3VwX2dwaW9fY29udHJvbGxlciAqY250cjsKKwlpbnQgcmV0OworCWludCBpOworCWludCBiYXNlOworCWludCBuZ3BpbzsKKwljaGFyIGNoaXBfbmFtZVtzaXplb2YoR1BJT19OQU1FKSArIDNdOworCisJaWYgKGdwaW9fbW9ja3VwX3BhcmFtc19uciA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCisJY250ciA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY250cikgKiAoZ3Bpb19tb2NrdXBfcGFyYW1zX25yID4+IDEpLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghY250cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjbnRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBncGlvX21vY2t1cF9wYXJhbXNfbnIgPj4gMTsgaSsrKSB7CisJCWJhc2UgPSBncGlvX21vY2t1cF9yYW5nZXNbaSAqIDJdOworCQlpZiAoYmFzZSA9PSAtMSkKKwkJCW5ncGlvID0gZ3Bpb19tb2NrdXBfcmFuZ2VzW2kgKiAyICsgMV07CisJCWVsc2UKKwkJCW5ncGlvID0gZ3Bpb19tb2NrdXBfcmFuZ2VzW2kgKiAyICsgMV0gLSBiYXNlOworCisJCWlmIChuZ3BpbyA+PSAwKSB7CisJCQlzcHJpbnRmKGNoaXBfbmFtZSwgIiVzLSVjIiwgR1BJT19OQU1FLAorCQkJCXBpbnNfbmFtZV9zdGFydCArIGkpOworCQkJcmV0ID0gbW9ja3VwX2dwaW9fYWRkKGRldiwgJmNudHJbaV0sCisJCQkJCSAgICAgIGNoaXBfbmFtZSwgYmFzZSwgbmdwaW8pOworCQl9IGVsc2UgeworCQkJcmV0ID0gLTE7CisJCX0KKwkJaWYgKHJldCkgeworCQkJaWYgKGJhc2UgPCAwKQorCQkJCWRldl9lcnIoZGV2LCAiZ3BpbzwlZC4uJWQ+IGFkZCBmYWlsZWRcbiIsCisJCQkJCWJhc2UsIG5ncGlvKTsKKwkJCWVsc2UKKwkJCQlkZXZfZXJyKGRldiwgImdwaW88JWQuLiVkPiBhZGQgZmFpbGVkXG4iLAorCQkJCQliYXNlLCBiYXNlICsgbmdwaW8pOworCisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1vY2t1cF9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9IEdQSU9fTkFNRSwKKwkJICAgfSwKKwkucHJvYmUgPSBtb2NrdXBfZ3Bpb19wcm9iZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2Oworc3RhdGljIGludCBfX2luaXQgbW9ja19kZXZpY2VfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKEdQSU9fTkFNRSwgLTEpOworCWlmICghcGRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChwZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1vY2t1cF9ncGlvX2RyaXZlcik7CisJaWYgKGVycikgeworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1vY2tfZGV2aWNlX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbW9ja3VwX2dwaW9fZHJpdmVyKTsKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihwZGV2KTsKK30KKworbW9kdWxlX2luaXQobW9ja19kZXZpY2VfaW5pdCk7Cittb2R1bGVfZXhpdChtb2NrX2RldmljZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiS2FtbGFrYW50IFBhdGVsIDxrYW1sYWthbnQucGF0ZWxAYnJvYWRjb20uY29tPiIpOworTU9EVUxFX0FVVEhPUigiQmFtdm9yIEppYW4gWmhhbmcgPGJhbXZvci56aGFuZ2ppYW5AbGluYXJvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiR1BJTyBUZXN0aW5nIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbXNpYy5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbXNpYy5jCmluZGV4IGQ3NTY0OTcuLjFiN2NlN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1zaWMuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tc2ljLmMKQEAgLTIwLDcgKzIwLDYgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTMyOCw5ICszMjcsNCBAQAogewogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnBsYXRmb3JtX21zaWNfZ3Bpb19kcml2ZXIpOwogfQotCiBzdWJzeXNfaW5pdGNhbGwocGxhdGZvcm1fbXNpY19ncGlvX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJNYXRoaWFzIE55bWFuIDxtYXRoaWFzLm55bWFuQGxpbnV4LmludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgTWVkZmllbGQgTVNJQyBHUElPIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbXhjLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYwppbmRleCAxYjM0MmEzLi5jMWExZTAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1teGMuYwpAQCAtMiw3ICsyLDggQEAKICAqIE1YQyBHUElPIHN1cHBvcnQuIChjKSAyMDA4IERhbmllbCBNYWNrIDxkYW5pZWxAY2FpYXEuZGU+CiAgKiBDb3B5cmlnaHQgMjAwOCBKdWVyZ2VuIEJlaXNlcnQsIGtlcm5lbEBwZW5ndXRyb25peC5kZQogICoKLSAqIEJhc2VkIG9uIGNvZGUgZnJvbSBGcmVlc2NhbGUsCisgKiBCYXNlZCBvbiBjb2RlIGZyb20gRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsCisgKiBBdXRob3JzOiBEYW5pZWwgTWFjaywgSnVlcmdlbiBCZWlzZXJ0LgogICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0zMyw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAKIGVudW0gbXhjX2dwaW9faHd0eXBlIHsKQEAgLTQ1OCw2ICs0NTgsMTEgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9iZ2lvOwogCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImdwaW8tcmFuZ2VzIikpIHsKKwkJcG9ydC0+Z2MucmVxdWVzdCA9IGdwaW9jaGlwX2dlbmVyaWNfcmVxdWVzdDsKKwkJcG9ydC0+Z2MuZnJlZSA9IGdwaW9jaGlwX2dlbmVyaWNfZnJlZTsKKwl9CisKIAlwb3J0LT5nYy50b19pcnEgPSBteGNfZ3Bpb190b19pcnE7CiAJcG9ydC0+Z2MuYmFzZSA9IChwZGV2LT5pZCA8IDApID8gb2ZfYWxpYXNfZ2V0X2lkKG5wLCAiZ3BpbyIpICogMzIgOgogCQkJCQkgICAgIHBkZXYtPmlkICogMzI7CkBAIC01MTAsMTAgKzUxNSw0IEBACiB7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXhjX2dwaW9fZHJpdmVyKTsKIH0KLXBvc3Rjb3JlX2luaXRjYWxsKGdwaW9fbXhjX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgIgotCSAgICAgICJEYW5pZWwgTWFjayA8ZGFuaWVsbmNhaWFxLmRlPiwgIgotCSAgICAgICJKdWVyZ2VuIEJlaXNlcnQgPGtlcm5lbEBwZW5ndXRyb25peC5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIE1YQyBHUElPIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CitzdWJzeXNfaW5pdGNhbGwoZ3Bpb19teGNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1wYWxtYXMuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBhbG1hcy5jCmluZGV4IDgzOTQ3NDQuLjNkODE4MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBhbG1hcy5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBhbG1hcy5jCkBAIC0xNTIsNyArMTUyLDYgQEAKIAl7IC5jb21wYXRpYmxlID0gInRpLHRwczgwMDM2LWdwaW8iLCAuZGF0YSA9ICZ0cHM4MDAzNl9kZXZfZGF0YSx9LAogCXsgfSwKIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9wYWxtYXNfZ3Bpb19tYXRjaCk7CiAKIHN0YXRpYyBpbnQgcGFsbWFzX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBjYTk1M3guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBjYTk1M3guYwppbmRleCAwMmYyYTU2Li40NWM4ODE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1wY2E5NTN4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcGNhOTUzeC5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+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+cmVnX291dHB1dCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7Ci0JcmV0ID0gcGNhOTUzeF9yZWFkX3JlZ3MoY2hpcCwgUENBOTU3WF9DRkcsIGNoaXAtPnJlZ19kaXJlY3Rpb24pOworCXJldCA9IHBjYTk1M3hfcmVhZF9yZWdzKGNoaXAsIGNoaXAtPnJlZ3MtPmRpcmVjdGlvbiwKKwkJCQljaGlwLT5yZWdfZGlyZWN0aW9uKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIApAQCAtNzM5LDEzICs3MzIsMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBjYTk1M3hfZHRfaWRzW107CiAKIHN0YXRpYyBpbnQgcGNhOTUzeF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKKwkJCQkgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQogewogCXN0cnVjdCBwY2E5NTN4X3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCBwY2E5NTN4X2NoaXAgKmNoaXA7CiAJaW50IGlycV9iYXNlID0gMDsKIAlpbnQgcmV0OwogCXUzMiBpbnZlcnQgPSAwOworCXN0cnVjdCByZWd1bGF0b3IgKnJlZzsKIAogCWNoaXAgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LAogCQkJc2l6ZW9mKHN0cnVjdCBwY2E5NTN4X2NoaXApLCBHRlBfS0VSTkVMKTsKQEAgLTc2NSw0NyArNzU5LDc3IEBACiAKIAljaGlwLT5jbGllbnQgPSBjbGllbnQ7CiAKLQlpZiAoaWQpIHsKLQkJY2hpcC0+ZHJpdmVyX2RhdGEgPSBpZC0+ZHJpdmVyX2RhdGE7CisJcmVnID0gZGV2bV9yZWd1bGF0b3JfZ2V0KCZjbGllbnQtPmRldiwgInZjYyIpOworCWlmIChJU19FUlIocmVnKSkgeworCQlyZXQgPSBQVFJfRVJSKHJlZyk7CisJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAicmVnIGdldCBlcnI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHJlZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlZyBlbiBlcnI6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwljaGlwLT5yZWd1bGF0b3IgPSByZWc7CisKKwlpZiAoaTJjX2lkKSB7CisJCWNoaXAtPmRyaXZlcl9kYXRhID0gaTJjX2lkLT5kcml2ZXJfZGF0YTsKIAl9IGVsc2UgewotCQljb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmlkOworCQljb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmFjcGlfaWQ7CiAJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCiAJCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKHBjYTk1M3hfZHRfaWRzLCAmY2xpZW50LT5kZXYpOwogCQlpZiAobWF0Y2gpIHsKIAkJCWNoaXAtPmRyaXZlcl9kYXRhID0gKGludCkodWludHB0cl90KW1hdGNoLT5kYXRhOwogCQl9IGVsc2UgewotCQkJaWQgPSBhY3BpX21hdGNoX2RldmljZShwY2E5NTN4X2FjcGlfaWRzLCAmY2xpZW50LT5kZXYpOwotCQkJaWYgKCFpZCkKLQkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCWFjcGlfaWQgPSBhY3BpX21hdGNoX2RldmljZShwY2E5NTN4X2FjcGlfaWRzLCAmY2xpZW50LT5kZXYpOworCQkJaWYgKCFhY3BpX2lkKSB7CisJCQkJcmV0ID0gLUVOT0RFVjsKKwkJCQlnb3RvIGVycl9leGl0OworCQkJfQogCi0JCQljaGlwLT5kcml2ZXJfZGF0YSA9IGlkLT5kcml2ZXJfZGF0YTsKKwkJCWNoaXAtPmRyaXZlcl9kYXRhID0gYWNwaV9pZC0+ZHJpdmVyX2RhdGE7CiAJCX0KIAl9CiAKLQljaGlwLT5jaGlwX3R5cGUgPSBQQ0FfQ0hJUF9UWVBFKGNoaXAtPmRyaXZlcl9kYXRhKTsKLQogCW11dGV4X2luaXQoJmNoaXAtPmkyY19sb2NrKTsKKwlsb2NrZGVwX3NldF9zdWJjbGFzcygmY2hpcC0+aTJjX2xvY2ssCisJCQkgICAgIGkyY19hZGFwdGVyX2RlcHRoKGNsaWVudC0+YWRhcHRlcikpOwogCiAJLyogaW5pdGlhbGl6ZSBjYWNoZWQgcmVnaXN0ZXJzIGZyb20gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLgogCSAqIHdlIGNhbid0IHNoYXJlIHRoaXMgY2hpcCB3aXRoIGFub3RoZXIgaTJjIG1hc3Rlci4KIAkgKi8KIAlwY2E5NTN4X3NldHVwX2dwaW8oY2hpcCwgY2hpcC0+ZHJpdmVyX2RhdGEgJiBQQ0FfR1BJT19NQVNLKTsKIAotCWlmIChjaGlwLT5jaGlwX3R5cGUgPT0gUENBOTUzWF9UWVBFKQorCWlmIChjaGlwLT5ncGlvX2NoaXAubmdwaW8gPD0gOCkgeworCQljaGlwLT53cml0ZV9yZWdzID0gcGNhOTUzeF93cml0ZV9yZWdzXzg7CisJCWNoaXAtPnJlYWRfcmVncyA9IHBjYTk1M3hfcmVhZF9yZWdzXzg7CisJfSBlbHNlIGlmIChjaGlwLT5ncGlvX2NoaXAubmdwaW8gPj0gMjQpIHsKKwkJY2hpcC0+d3JpdGVfcmVncyA9IHBjYTk1M3hfd3JpdGVfcmVnc18yNDsKKwkJY2hpcC0+cmVhZF9yZWdzID0gcGNhOTUzeF9yZWFkX3JlZ3NfMjQ7CisJfSBlbHNlIHsKKwkJaWYgKFBDQV9DSElQX1RZUEUoY2hpcC0+ZHJpdmVyX2RhdGEpID09IFBDQTk1M1hfVFlQRSkKKwkJCWNoaXAtPndyaXRlX3JlZ3MgPSBwY2E5NTN4X3dyaXRlX3JlZ3NfMTY7CisJCWVsc2UKKwkJCWNoaXAtPndyaXRlX3JlZ3MgPSBwY2E5NTd4X3dyaXRlX3JlZ3NfMTY7CisJCWNoaXAtPnJlYWRfcmVncyA9IHBjYTk1M3hfcmVhZF9yZWdzXzE2OworCX0KKworCWlmIChQQ0FfQ0hJUF9UWVBFKGNoaXAtPmRyaXZlcl9kYXRhKSA9PSBQQ0E5NTNYX1RZUEUpCiAJCXJldCA9IGRldmljZV9wY2E5NTN4X2luaXQoY2hpcCwgaW52ZXJ0KTsKIAllbHNlCiAJCXJldCA9IGRldmljZV9wY2E5NTd4X2luaXQoY2hpcCwgaW52ZXJ0KTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9leGl0OwogCiAJcmV0ID0gZGV2bV9ncGlvY2hpcF9hZGRfZGF0YSgmY2xpZW50LT5kZXYsICZjaGlwLT5ncGlvX2NoaXAsIGNoaXApOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZXJyX2V4aXQ7CiAKIAlyZXQgPSBwY2E5NTN4X2lycV9zZXR1cChjaGlwLCBpcnFfYmFzZSk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfZXhpdDsKIAogCWlmIChwZGF0YSAmJiBwZGF0YS0+c2V0dXApIHsKIAkJcmV0ID0gcGRhdGEtPnNldHVwKGNsaWVudCwgY2hpcC0+Z3Bpb19jaGlwLmJhc2UsCkBAIC04MTYsNiArODQwLDEwIEBACiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKIAlyZXR1cm4gMDsKKworZXJyX2V4aXQ6CisJcmVndWxhdG9yX2Rpc2FibGUoY2hpcC0+cmVndWxhdG9yKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHBjYTk1M3hfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCkBAIC04MjcsMTQgKzg1NSwxNiBAQAogCWlmIChwZGF0YSAmJiBwZGF0YS0+dGVhcmRvd24pIHsKIAkJcmV0ID0gcGRhdGEtPnRlYXJkb3duKGNsaWVudCwgY2hpcC0+Z3Bpb19jaGlwLmJhc2UsCiAJCQkJY2hpcC0+Z3Bpb19jaGlwLm5ncGlvLCBwZGF0YS0+Y29udGV4dCk7Ci0JCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgPCAwKQogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlcyBmYWlsZWQsICVkXG4iLAogCQkJCQkidGVhcmRvd24iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQorCX0gZWxzZSB7CisJCXJldCA9IDA7CiAJfQogCi0JcmV0dXJuIDA7CisJcmVndWxhdG9yX2Rpc2FibGUoY2hpcC0+cmVndWxhdG9yKTsKKworCXJldHVybiByZXQ7CiB9CiAKIC8qIGNvbnZlbmllbmNlIHRvIHN0b3Agb3ZlcmxvbmcgbWF0Y2gtdGFibGUgbGluZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBpc29zci5jIGIvZHJpdmVycy9ncGlvL2dwaW8tcGlzb3NyLmMKaW5kZXggY2IxNGI4ZC4uZjU1NDUwNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBpc29zci5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXBpc29zci5jCkBAIC05MCw3ICs5MCw3IEBACiAJcmV0dXJuIChncGlvLT5idWZmZXJbb2Zmc2V0IC8gOF0gPj4gKG9mZnNldCAlIDgpKSAmIDB4MTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAicGlzb3NyLWdwaW8iLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmdldF9kaXJlY3Rpb24JCT0gcGlzb3NyX2dwaW9fZ2V0X2RpcmVjdGlvbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXJjYXIuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXJjYXIuYwppbmRleCBiOTZlMGI0Li4yYmU0OGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1yY2FyLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcmNhci5jCkBAIC0zNDgsNiArMzQ4LDEwIEBACiAJCS8qIEdlbjMgR1BJTyBpcyBpZGVudGljYWwgdG8gR2VuMi4gKi8KIAkJLmRhdGEgPSAmZ3Bpb19yY2FyX2luZm9fZ2VuMiwKIAl9LCB7CisJCS5jb21wYXRpYmxlID0gInJlbmVzYXMsZ3Bpby1yOGE3Nzk2IiwKKwkJLyogR2VuMyBHUElPIGlzIGlkZW50aWNhbCB0byBHZW4yLiAqLworCQkuZGF0YSA9ICZncGlvX3JjYXJfaW5mb19nZW4yLAorCX0sIHsKIAkJLmNvbXBhdGlibGUgPSAicmVuZXNhcyxncGlvLXJjYXIiLAogCQkuZGF0YSA9ICZncGlvX3JjYXJfaW5mb19nZW4xLAogCX0sIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNhMTEwMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tc2ExMTAwLmMKaW5kZXggMGM5OWU4Zi4uOGQ4ZWUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tc2ExMTAwLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tc2ExMTAwLmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogewogCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZzYTExMDBfZ3Bpb19pcnFfY2hpcCwKIAkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKLQlpcnFfc2V0X25vcHJvYmUoaXJxKTsKKwlpcnFfc2V0X3Byb2JlKGlycSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXNjaC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tc2NoLmMKaW5kZXggZWI0M2FlNC4uNTQ1MDA0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tc2NoLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tc2NoLmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBzY2hfZ3Bpb19jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgc2NoX2dwaW9fY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJzY2hfZ3BpbyIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZGlyZWN0aW9uX2lucHV0CT0gc2NoX2dwaW9fZGlyZWN0aW9uX2luLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tc3BlYXItc3BpY3MuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXNwZWFyLXNwaWNzLmMKaW5kZXggN2ZmZDE2NC4uMjIyNjc0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tc3BlYXItc3BpY3MuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1zcGVhci1zcGljcy5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTE4Myw3ICsxODMsNiBAQAogCXsgLmNvbXBhdGlibGUgPSAic3Qsc3BlYXItc3BpY3MtZ3BpbyIgfSwKIAl7fQogfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNwaWNzX2dwaW9fb2ZfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGljc19ncGlvX2RyaXZlciA9IHsKIAkucHJvYmUgPSBzcGljc19ncGlvX3Byb2JlLApAQCAtMTk4LDcgKzE5NywzIEBACiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3BpY3NfZ3Bpb19kcml2ZXIpOwogfQogc3Vic3lzX2luaXRjYWxsKHNwaWNzX2dwaW9faW5pdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlNoaXJheiBIYXNoaW0gPHNoaXJhei5saW51eC5rZXJuZWxAZ21haWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTVE1pY3JvZWxlY3Ryb25pY3MgU1BFQXIgU1BJIENoaXAgU2VsZWN0IEFic3RyYWN0aW9uIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1zdG1wZS5jIGIvZHJpdmVycy9ncGlvL2dwaW8tc3RtcGUuYwppbmRleCBmNjc1MTMyLi5lN2Q0MjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1zdG1wZS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXN0bXBlLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zdG1wZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKIC8qCiAgKiBUaGVzZSByZWdpc3RlcnMgYXJlIG1vZGlmaWVkIHVuZGVyIHRoZSBpcnEgYnVzIGxvY2sgYW5kIGNhY2hlZCB0byBhdm9pZApAQCAtMjAsNiArMjEsOCBAQAogICovCiBlbnVtIHsgUkVHX1JFLCBSRUdfRkUsIFJFR19JRSB9OwogCitlbnVtIHsgTFNCLCBDU0IsIE1TQiB9OworCiAjZGVmaW5lIENBQ0hFX05SX1JFR1MJMwogLyogTm8gdmFyaWFudCBoYXMgbW9yZSB0aGFuIDI0IEdQSU9zICovCiAjZGVmaW5lIENBQ0hFX05SX0JBTktTCSgyNCAvIDgpCkBAIC0zOSw4ICs0Miw4IEBACiB7CiAJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gc3RtcGVfZ3Bpby0+c3RtcGU7Ci0JdTggcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQTVJfTFNCXSAtIChvZmZzZXQgLyA4KTsKLQl1OCBtYXNrID0gMSA8PCAob2Zmc2V0ICUgOCk7CisJdTggcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQTVJfTFNCICsgKG9mZnNldCAvIDgpXTsKKwl1OCBtYXNrID0gQklUKG9mZnNldCAlIDgpOwogCWludCByZXQ7CiAKIAlyZXQgPSBzdG1wZV9yZWdfcmVhZChzdG1wZSwgcmVnKTsKQEAgLTU1LDggKzU4LDggQEAKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKIAlpbnQgd2hpY2ggPSB2YWwgPyBTVE1QRV9JRFhfR1BTUl9MU0IgOiBTVE1QRV9JRFhfR1BDUl9MU0I7Ci0JdTggcmVnID0gc3RtcGUtPnJlZ3Nbd2hpY2hdIC0gKG9mZnNldCAvIDgpOwotCXU4IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwl1OCByZWcgPSBzdG1wZS0+cmVnc1t3aGljaCArIChvZmZzZXQgLyA4KV07CisJdTggbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKIAogCS8qCiAJICogU29tZSB2YXJpYW50cyBoYXZlIHNpbmdsZSByZWdpc3RlciBmb3IgZ3BpbyBzZXQvY2xlYXIgZnVuY3Rpb25hbGl0eS4KQEAgLTc0LDcgKzc3LDcgQEAKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKIAl1OCByZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BEUl9MU0JdIC0gKG9mZnNldCAvIDgpOwotCXU4IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwl1OCBtYXNrID0gQklUKG9mZnNldCAlIDgpOwogCWludCByZXQ7CiAKIAlyZXQgPSBzdG1wZV9yZWdfcmVhZChzdG1wZSwgcmVnKTsKQEAgLTg5LDggKzkyLDggQEAKIHsKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKLQl1OCByZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BEUl9MU0JdIC0gKG9mZnNldCAvIDgpOwotCXU4IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwl1OCByZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BEUl9MU0IgKyAob2Zmc2V0IC8gOCldOworCXU4IG1hc2sgPSBCSVQob2Zmc2V0ICUgOCk7CiAKIAlzdG1wZV9ncGlvX3NldChjaGlwLCBvZmZzZXQsIHZhbCk7CiAKQEAgLTEwMiw4ICsxMDUsOCBAQAogewogCXN0cnVjdCBzdG1wZV9ncGlvICpzdG1wZV9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJc3RydWN0IHN0bXBlICpzdG1wZSA9IHN0bXBlX2dwaW8tPnN0bXBlOwotCXU4IHJlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9HUERSX0xTQl0gLSAob2Zmc2V0IC8gOCk7Ci0JdTggbWFzayA9IDEgPDwgKG9mZnNldCAlIDgpOworCXU4IHJlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9HUERSX0xTQiArIChvZmZzZXQgLyA4KV07CisJdTggbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKIAogCXJldHVybiBzdG1wZV9zZXRfYml0cyhzdG1wZSwgcmVnLCBtYXNrLCAwKTsKIH0KQEAgLTExMywxMyArMTE2LDEzIEBACiAJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gc3RtcGVfZ3Bpby0+c3RtcGU7CiAKLQlpZiAoc3RtcGVfZ3Bpby0+bm9yZXF1ZXN0X21hc2sgJiAoMSA8PCBvZmZzZXQpKQorCWlmIChzdG1wZV9ncGlvLT5ub3JlcXVlc3RfbWFzayAmIEJJVChvZmZzZXQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBzdG1wZV9zZXRfYWx0ZnVuYyhzdG1wZSwgMSA8PCBvZmZzZXQsIFNUTVBFX0JMT0NLX0dQSU8pOworCXJldHVybiBzdG1wZV9zZXRfYWx0ZnVuYyhzdG1wZSwgQklUKG9mZnNldCksIFNUTVBFX0JMT0NLX0dQSU8pOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJzdG1wZSIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZ2V0X2RpcmVjdGlvbgkJPSBzdG1wZV9ncGlvX2dldF9kaXJlY3Rpb24sCkBAIC0xMzcsMTMgKzE0MCwxNCBAQAogCXN0cnVjdCBzdG1wZV9ncGlvICpzdG1wZV9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwogCWludCBvZmZzZXQgPSBkLT5od2lycTsKIAlpbnQgcmVnb2Zmc2V0ID0gb2Zmc2V0IC8gODsKLQlpbnQgbWFzayA9IDEgPDwgKG9mZnNldCAlIDgpOworCWludCBtYXNrID0gQklUKG9mZnNldCAlIDgpOwogCiAJaWYgKHR5cGUgJiBJUlFfVFlQRV9MRVZFTF9MT1cgfHwgdHlwZSAmIElSUV9UWVBFX0xFVkVMX0hJR0gpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogU1RNUEU4MDEgZG9lc24ndCBoYXZlIFJFIGFuZCBGRSByZWdpc3RlcnMgKi8KLQlpZiAoc3RtcGVfZ3Bpby0+c3RtcGUtPnBhcnRudW0gPT0gU1RNUEU4MDEpCisJLyogU1RNUEU4MDEgYW5kIFNUTVBFIDE2MDAgZG9uJ3QgaGF2ZSBSRSBhbmQgRkUgcmVnaXN0ZXJzICovCisJaWYgKHN0bXBlX2dwaW8tPnN0bXBlLT5wYXJ0bnVtID09IFNUTVBFODAxIHx8CisJICAgIHN0bXBlX2dwaW8tPnN0bXBlLT5wYXJ0bnVtID09IFNUTVBFMTYwMCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfUklTSU5HKQpAQCAtMTczLDE3ICsxNzcsMjQgQEAKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKIAlzdHJ1Y3Qgc3RtcGUgKnN0bXBlID0gc3RtcGVfZ3Bpby0+c3RtcGU7CiAJaW50IG51bV9iYW5rcyA9IERJVl9ST1VORF9VUChzdG1wZS0+bnVtX2dwaW9zLCA4KTsKLQlzdGF0aWMgY29uc3QgdTggcmVnbWFwW10gPSB7Ci0JCVtSRUdfUkVdCT0gU1RNUEVfSURYX0dQUkVSX0xTQiwKLQkJW1JFR19GRV0JPSBTVE1QRV9JRFhfR1BGRVJfTFNCLAotCQlbUkVHX0lFXQk9IFNUTVBFX0lEWF9JRUdQSU9SX0xTQiwKKwlzdGF0aWMgY29uc3QgdTggcmVnbWFwW0NBQ0hFX05SX1JFR1NdW0NBQ0hFX05SX0JBTktTXSA9IHsKKwkJW1JFR19SRV1bTFNCXSA9IFNUTVBFX0lEWF9HUFJFUl9MU0IsCisJCVtSRUdfUkVdW0NTQl0gPSBTVE1QRV9JRFhfR1BSRVJfQ1NCLAorCQlbUkVHX1JFXVtNU0JdID0gU1RNUEVfSURYX0dQUkVSX01TQiwKKwkJW1JFR19GRV1bTFNCXSA9IFNUTVBFX0lEWF9HUEZFUl9MU0IsCisJCVtSRUdfRkVdW0NTQl0gPSBTVE1QRV9JRFhfR1BGRVJfQ1NCLAorCQlbUkVHX0ZFXVtNU0JdID0gU1RNUEVfSURYX0dQRkVSX01TQiwKKwkJW1JFR19JRV1bTFNCXSA9IFNUTVBFX0lEWF9JRUdQSU9SX0xTQiwKKwkJW1JFR19JRV1bQ1NCXSA9IFNUTVBFX0lEWF9JRUdQSU9SX0NTQiwKKwkJW1JFR19JRV1bTVNCXSA9IFNUTVBFX0lEWF9JRUdQSU9SX01TQiwKIAl9OwogCWludCBpLCBqOwogCiAJZm9yIChpID0gMDsgaSA8IENBQ0hFX05SX1JFR1M7IGkrKykgewotCQkvKiBTVE1QRTgwMSBkb2Vzbid0IGhhdmUgUkUgYW5kIEZFIHJlZ2lzdGVycyAqLwotCQlpZiAoKHN0bXBlLT5wYXJ0bnVtID09IFNUTVBFODAxKSAmJgotCQkJCShpICE9IFJFR19JRSkpCisJCS8qIFNUTVBFODAxIGFuZCBTVE1QRTE2MDAgZG9uJ3QgaGF2ZSBSRSBhbmQgRkUgcmVnaXN0ZXJzICovCisJCWlmICgoc3RtcGUtPnBhcnRudW0gPT0gU1RNUEU4MDEgfHwKKwkJICAgICBzdG1wZS0+cGFydG51bSA9PSBTVE1QRTE2MDApICYmCisJCSAgICAgKGkgIT0gUkVHX0lFKSkKIAkJCWNvbnRpbnVlOwogCiAJCWZvciAoaiA9IDA7IGogPCBudW1fYmFua3M7IGorKykgewpAQCAtMTk0LDcgKzIwNSw3IEBACiAJCQkJY29udGludWU7CiAKIAkJCXN0bXBlX2dwaW8tPm9sZHJlZ3NbaV1bal0gPSBuZXc7Ci0JCQlzdG1wZV9yZWdfd3JpdGUoc3RtcGUsIHN0bXBlLT5yZWdzW3JlZ21hcFtpXV0gLSBqLCBuZXcpOworCQkJc3RtcGVfcmVnX3dyaXRlKHN0bXBlLCBzdG1wZS0+cmVnc1tyZWdtYXBbaV1bal1dLCBuZXcpOwogCQl9CiAJfQogCkBAIC0yMDcsNyArMjE4LDcgQEAKIAlzdHJ1Y3Qgc3RtcGVfZ3BpbyAqc3RtcGVfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKIAlpbnQgb2Zmc2V0ID0gZC0+aHdpcnE7CiAJaW50IHJlZ29mZnNldCA9IG9mZnNldCAvIDg7Ci0JaW50IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwlpbnQgbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKIAogCXN0bXBlX2dwaW8tPnJlZ3NbUkVHX0lFXVtyZWdvZmZzZXRdICY9IH5tYXNrOwogfQpAQCAtMjE2LDExICsyMjcsMjEgQEAKIHsKIAlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCXN0cnVjdCBzdG1wZV9ncGlvICpzdG1wZV9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOworCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKIAlpbnQgb2Zmc2V0ID0gZC0+aHdpcnE7CiAJaW50IHJlZ29mZnNldCA9IG9mZnNldCAvIDg7Ci0JaW50IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwlpbnQgbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKIAogCXN0bXBlX2dwaW8tPnJlZ3NbUkVHX0lFXVtyZWdvZmZzZXRdIHw9IG1hc2s7CisKKwkvKgorCSAqIFNUTVBFMTYwMCB3b3JrYXJvdW5kOiB0byBiZSBhYmxlIHRvIGdldCBJUlEgZnJvbSBwaW5zLAorCSAqIGEgcmVhZCBtdXN0IGJlIGRvbmUgb24gR1BNUiByZWdpc3Rlciwgb3IgYSB3cml0ZSBpbgorCSAqIEdQU1Igb3IgR1BDUiByZWdpc3RlcnMKKwkgKi8KKwlpZiAoc3RtcGUtPnBhcnRudW0gPT0gU1RNUEUxNjAwKQorCQlzdG1wZV9yZWdfcmVhZChzdG1wZSwKKwkJCSAgICAgICBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BNUl9MU0IgKyByZWdvZmZzZXRdKTsKIH0KIAogc3RhdGljIHZvaWQgc3RtcGVfZGJnX3Nob3dfb25lKHN0cnVjdCBzZXFfZmlsZSAqcywKQEAgLTIzMCwxMCArMjUxLDEwIEBACiAJc3RydWN0IHN0bXBlX2dwaW8gKnN0bXBlX2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShnYyk7CiAJc3RydWN0IHN0bXBlICpzdG1wZSA9IHN0bXBlX2dwaW8tPnN0bXBlOwogCWNvbnN0IGNoYXIgKmxhYmVsID0gZ3Bpb2NoaXBfaXNfcmVxdWVzdGVkKGdjLCBvZmZzZXQpOwotCWludCBudW1fYmFua3MgPSBESVZfUk9VTkRfVVAoc3RtcGUtPm51bV9ncGlvcywgOCk7CiAJYm9vbCB2YWwgPSAhIXN0bXBlX2dwaW9fZ2V0KGdjLCBvZmZzZXQpOwotCXU4IGRpcl9yZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BEUl9MU0JdIC0gKG9mZnNldCAvIDgpOwotCXU4IG1hc2sgPSAxIDw8IChvZmZzZXQgJSA4KTsKKwl1OCBiYW5rID0gb2Zmc2V0IC8gODsKKwl1OCBkaXJfcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQRFJfTFNCICsgYmFua107CisJdTggbWFzayA9IEJJVChvZmZzZXQgJSA4KTsKIAlpbnQgcmV0OwogCXU4IGRpcjsKIApAQCAtMjQ3LDM5ICsyNjgsNzIgQEAKIAkJCSAgIGdwaW8sIGxhYmVsID86ICIobm9uZSkiLAogCQkJICAgdmFsID8gImhpIiA6ICJsbyIpOwogCX0gZWxzZSB7Ci0JCXU4IGVkZ2VfZGV0X3JlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9HUEVEUl9NU0JdICsgbnVtX2JhbmtzIC0gMSAtIChvZmZzZXQgLyA4KTsKLQkJdTggcmlzZV9yZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BSRVJfTFNCXSAtIChvZmZzZXQgLyA4KTsKLQkJdTggZmFsbF9yZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BGRVJfTFNCXSAtIChvZmZzZXQgLyA4KTsKLQkJdTggaXJxZW5fcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0lFR1BJT1JfTFNCXSAtIChvZmZzZXQgLyA4KTsKLQkJYm9vbCBlZGdlX2RldDsKLQkJYm9vbCByaXNlOwotCQlib29sIGZhbGw7CisJCXU4IGVkZ2VfZGV0X3JlZzsKKwkJdTggcmlzZV9yZWc7CisJCXU4IGZhbGxfcmVnOworCQl1OCBpcnFlbl9yZWc7CisKKwkJY2hhciAqZWRnZV9kZXRfdmFsdWVzW10gPSB7ImVkZ2UtaW5hY3RpdmUiLAorCQkJCQkgICAiZWRnZS1hc3NlcnRlZCIsCisJCQkJCSAgICJub3Qtc3VwcG9ydGVkIn07CisJCWNoYXIgKnJpc2VfdmFsdWVzW10gPSB7Im5vLXJpc2luZy1lZGdlLWRldGVjdGlvbiIsCisJCQkJICAgICAgICJyaXNpbmctZWRnZS1kZXRlY3Rpb24iLAorCQkJCSAgICAgICAibm90LXN1cHBvcnRlZCJ9OworCQljaGFyICpmYWxsX3ZhbHVlc1tdID0geyJuby1mYWxsaW5nLWVkZ2UtZGV0ZWN0aW9uIiwKKwkJCQkgICAgICAgImZhbGxpbmctZWRnZS1kZXRlY3Rpb24iLAorCQkJCSAgICAgICAibm90LXN1cHBvcnRlZCJ9OworCQkjZGVmaW5lIE5PVF9TVVBQT1JURURfSURYIDIKKwkJdTggZWRnZV9kZXQgPSBOT1RfU1VQUE9SVEVEX0lEWDsKKwkJdTggcmlzZSA9IE5PVF9TVVBQT1JURURfSURYOworCQl1OCBmYWxsID0gTk9UX1NVUFBPUlRFRF9JRFg7CiAJCWJvb2wgaXJxZW47CiAKLQkJcmV0ID0gc3RtcGVfcmVnX3JlYWQoc3RtcGUsIGVkZ2VfZGV0X3JlZyk7Ci0JCWlmIChyZXQgPCAwKQorCQlzd2l0Y2ggKHN0bXBlLT5wYXJ0bnVtKSB7CisJCWNhc2UgU1RNUEU2MTA6CisJCWNhc2UgU1RNUEU4MTE6CisJCWNhc2UgU1RNUEUxNjAxOgorCQljYXNlIFNUTVBFMjQwMToKKwkJY2FzZSBTVE1QRTI0MDM6CisJCQllZGdlX2RldF9yZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfR1BFRFJfTFNCICsgYmFua107CisJCQlyZXQgPSBzdG1wZV9yZWdfcmVhZChzdG1wZSwgZWRnZV9kZXRfcmVnKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybjsKKwkJCWVkZ2VfZGV0ID0gISEocmV0ICYgbWFzayk7CisKKwkJY2FzZSBTVE1QRTE4MDE6CisJCQlyaXNlX3JlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9HUFJFUl9MU0IgKyBiYW5rXTsKKwkJCWZhbGxfcmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0dQRkVSX0xTQiArIGJhbmtdOworCisJCQlyZXQgPSBzdG1wZV9yZWdfcmVhZChzdG1wZSwgcmlzZV9yZWcpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuOworCQkJcmlzZSA9ICEhKHJldCAmIG1hc2spOworCQkJcmV0ID0gc3RtcGVfcmVnX3JlYWQoc3RtcGUsIGZhbGxfcmVnKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybjsKKwkJCWZhbGwgPSAhIShyZXQgJiBtYXNrKTsKKworCQljYXNlIFNUTVBFODAxOgorCQljYXNlIFNUTVBFMTYwMDoKKwkJCWlycWVuX3JlZyA9IHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9JRUdQSU9SX0xTQiArIGJhbmtdOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKIAkJCXJldHVybjsKLQkJZWRnZV9kZXQgPSAhIShyZXQgJiBtYXNrKTsKLQkJcmV0ID0gc3RtcGVfcmVnX3JlYWQoc3RtcGUsIHJpc2VfcmVnKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm47Ci0JCXJpc2UgPSAhIShyZXQgJiBtYXNrKTsKLQkJcmV0ID0gc3RtcGVfcmVnX3JlYWQoc3RtcGUsIGZhbGxfcmVnKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm47Ci0JCWZhbGwgPSAhIShyZXQgJiBtYXNrKTsKKwkJfQorCiAJCXJldCA9IHN0bXBlX3JlZ19yZWFkKHN0bXBlLCBpcnFlbl9yZWcpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybjsKIAkJaXJxZW4gPSAhIShyZXQgJiBtYXNrKTsKIAotCQlzZXFfcHJpbnRmKHMsICIgZ3Bpby0lLTNkICglLTIwLjIwcykgaW4gICVzICVzICVzJXMlcyIsCisJCXNlcV9wcmludGYocywgIiBncGlvLSUtM2QgKCUtMjAuMjBzKSBpbiAgJXMgJTEzcyAlMTNzICUyNXMgJTI1cyIsCiAJCQkgICBncGlvLCBsYWJlbCA/OiAiKG5vbmUpIiwKIAkJCSAgIHZhbCA/ICJoaSIgOiAibG8iLAotCQkJICAgZWRnZV9kZXQgPyAiZWRnZS1hc3NlcnRlZCIgOiAiZWRnZS1pbmFjdGl2ZSIsCi0JCQkgICBpcnFlbiA/ICJJUlEtZW5hYmxlZCIgOiAiIiwKLQkJCSAgIHJpc2UgPyAiIHJpc2luZy1lZGdlLWRldGVjdGlvbiIgOiAiIiwKLQkJCSAgIGZhbGwgPyAiIGZhbGxpbmctZWRnZS1kZXRlY3Rpb24iIDogIiIpOworCQkJICAgZWRnZV9kZXRfdmFsdWVzW2VkZ2VfZGV0XSwKKwkJCSAgIGlycWVuID8gIklSUS1lbmFibGVkIiA6ICJJUlEtZGlzYWJsZWQiLAorCQkJICAgcmlzZV92YWx1ZXNbcmlzZV0sCisJCQkgICBmYWxsX3ZhbHVlc1tmYWxsXSk7CiAJfQogfQogCkBAIC0zMDcsMTggKzM2MSwzMiBAQAogewogCXN0cnVjdCBzdG1wZV9ncGlvICpzdG1wZV9ncGlvID0gZGV2OwogCXN0cnVjdCBzdG1wZSAqc3RtcGUgPSBzdG1wZV9ncGlvLT5zdG1wZTsKLQl1OCBzdGF0bXNicmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0lTR1BJT1JfTVNCXTsKKwl1OCBzdGF0bXNicmVnOwogCWludCBudW1fYmFua3MgPSBESVZfUk9VTkRfVVAoc3RtcGUtPm51bV9ncGlvcywgOCk7CiAJdTggc3RhdHVzW251bV9iYW5rc107CiAJaW50IHJldDsKIAlpbnQgaTsKIAorCS8qCisJICogdGhlIHN0bXBlX2Jsb2NrX3JlYWQoKSBjYWxsIGJlbG93LCBpbXBvc2VzIHRvIHNldCBzdGF0bXNicmVnCisJICogd2l0aCB0aGUgcmVnaXN0ZXIgbG9jYXRlZCBhdCB0aGUgbG93ZXN0IGFkZHJlc3MuIEFzIFNUTVBFMTYwMAorCSAqIHZhcmlhbnQgaXMgdGhlIG9ubHkgb25lIHdoaWNoIHJlc3BlY3QgcmVnaXN0ZXJzIGFkZHJlc3MncyBvcmRlcgorCSAqIChMU0IgcmVncyBsb2NhdGVkIGF0IGxvd2VzdCBhZGRyZXNzIHRoYW4gTVNCIG9uZXMpIHdoZXJlYXMgYWxsCisJICogdGhlIG90aGVycyBoYXZlIGEgcmVnaXN0ZXJzIGxheW91dCB3aXRoIE1TQiBsb2NhdGVkIGJlZm9yZSB0aGUKKwkgKiBMU0IgcmVncy4KKwkgKi8KKwlpZiAoc3RtcGUtPnBhcnRudW0gPT0gU1RNUEUxNjAwKQorCQlzdGF0bXNicmVnID0gc3RtcGUtPnJlZ3NbU1RNUEVfSURYX0lTR1BJT1JfTFNCXTsKKwllbHNlCisJCXN0YXRtc2JyZWcgPSBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfSVNHUElPUl9NU0JdOworCiAJcmV0ID0gc3RtcGVfYmxvY2tfcmVhZChzdG1wZSwgc3RhdG1zYnJlZywgbnVtX2JhbmtzLCBzdGF0dXMpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2JhbmtzOyBpKyspIHsKLQkJaW50IGJhbmsgPSBudW1fYmFua3MgLSBpIC0gMTsKKwkJaW50IGJhbmsgPSAoc3RtcGVfZ3Bpby0+c3RtcGUtPnBhcnRudW0gPT0gU1RNUEUxNjAwKSA/IGkgOgorCQkJICAgbnVtX2JhbmtzIC0gaSAtIDE7CiAJCXVuc2lnbmVkIGludCBlbmFibGVkID0gc3RtcGVfZ3Bpby0+cmVnc1tSRUdfSUVdW2JhbmtdOwogCQl1bnNpZ25lZCBpbnQgc3RhdCA9IHN0YXR1c1tpXTsKIApAQCAtMzMzLDE1ICs0MDEsMjEgQEAKIAkJCQkJCQkgbGluZSk7CiAKIAkJCWhhbmRsZV9uZXN0ZWRfaXJxKGNoaWxkX2lycSk7Ci0JCQlzdGF0ICY9IH4oMSA8PCBiaXQpOworCQkJc3RhdCAmPSB+QklUKGJpdCk7CiAJCX0KIAotCQlzdG1wZV9yZWdfd3JpdGUoc3RtcGUsIHN0YXRtc2JyZWcgKyBpLCBzdGF0dXNbaV0pOwotCi0JCS8qIEVkZ2UgZGV0ZWN0IHJlZ2lzdGVyIGlzIG5vdCBwcmVzZW50IG9uIDgwMSAqLwotCQlpZiAoc3RtcGUtPnBhcnRudW0gIT0gU1RNUEU4MDEpCi0JCQlzdG1wZV9yZWdfd3JpdGUoc3RtcGUsIHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9HUEVEUl9NU0JdCi0JCQkJCSsgaSwgc3RhdHVzW2ldKTsKKwkJLyoKKwkJICogaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciB3cml0ZSBoYXMgbm8gZWZmZWN0IG9uCisJCSAqIDgwMS8xODAxLzE2MDAsIGJpdHMgYXJlIGNsZWFyZWQgd2hlbiByZWFkLgorCQkgKiBFZGdlIGRldGVjdCByZWdpc3RlciBpcyBub3QgcHJlc2VudCBvbiA4MDEvMTYwMC8xODAxCisJCSAqLworCQlpZiAoc3RtcGUtPnBhcnRudW0gIT0gU1RNUEU4MDEgfHwgc3RtcGUtPnBhcnRudW0gIT0gU1RNUEUxNjAwIHx8CisJCSAgICBzdG1wZS0+cGFydG51bSAhPSBTVE1QRTE4MDEpIHsKKwkJCXN0bXBlX3JlZ193cml0ZShzdG1wZSwgc3RhdG1zYnJlZyArIGksIHN0YXR1c1tpXSk7CisJCQlzdG1wZV9yZWdfd3JpdGUoc3RtcGUsCisJCQkJCXN0bXBlLT5yZWdzW1NUTVBFX0lEWF9HUEVEUl9MU0IgKyBpXSwKKwkJCQkJc3RhdHVzW2ldKTsKKwkJfQogCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTM3Niw2ICs0NTAsOCBAQAogCiAJb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJzdCxub3JlcXVlc3QtbWFzayIsCiAJCQkmc3RtcGVfZ3Bpby0+bm9yZXF1ZXN0X21hc2spOworCWlmIChzdG1wZV9ncGlvLT5ub3JlcXVlc3RfbWFzaykKKwkJc3RtcGVfZ3Bpby0+Y2hpcC5pcnFfbmVlZF92YWxpZF9tYXNrID0gdHJ1ZTsKIAogCWlmIChpcnEgPCAwKQogCQlkZXZfaW5mbygmcGRldi0+ZGV2LApAQCAtNDAwLDYgKzQ3NiwxNCBAQAogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGdldCBpcnE6ICVkXG4iLCByZXQpOwogCQkJZ290byBvdXRfZGlzYWJsZTsKIAkJfQorCQlpZiAoc3RtcGVfZ3Bpby0+bm9yZXF1ZXN0X21hc2spIHsKKwkJCWludCBpOworCisJCQkvKiBGb3JiaWQgdW51c2VkIGxpbmVzIHRvIGJlIG1hcHBlZCBhcyBJUlFzICovCisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHUzMik7IGkrKykKKwkJCQlpZiAoc3RtcGVfZ3Bpby0+bm9yZXF1ZXN0X21hc2sgJiBCSVQoaSkpCisJCQkJCWNsZWFyX2JpdChpLCBzdG1wZV9ncGlvLT5jaGlwLmlycV92YWxpZF9tYXNrKTsKKwkJfQogCQlyZXQgPSAgZ3Bpb2NoaXBfaXJxY2hpcF9hZGQoJnN0bXBlX2dwaW8tPmNoaXAsCiAJCQkJCSAgICAmc3RtcGVfZ3Bpb19pcnFfY2hpcCwKIAkJCQkJICAgIDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1zeDE1MHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXN4MTUweC5jCmluZGV4IGExNzdlYmQuLmFmOTVkZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXN4MTUweC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXN4MTUweC5jCkBAIC0yMzYsNyArMjM2LDYgQEAKIAl7InN4MTUwMnEiLCAzfSwKIAl7fQogfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzeDE1MHhfaWQpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzeDE1MHhfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInNlbXRlY2gsc3gxNTA4cSIgfSwKQEAgLTI0NSw3ICsyNDQsNiBAQAogCXsgLmNvbXBhdGlibGUgPSAic2VtdGVjaCxzeDE1MDJxIiB9LAogCXt9LAogfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN4MTUweF9vZl9tYXRjaCk7CiAKIHN0YXRpYyBzMzIgc3gxNTB4X2kyY193cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IHZhbCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRjMzU4OXguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRjMzU4OXguYwppbmRleCA4YjM2NTkzLi41YTVhNmNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby10YzM1ODl4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdGMzNTg5eC5jCkBAIC0zNCw3ICszNCw3IEBACiAJdTggb2xkcmVnc1tDQUNIRV9OUl9SRUdTXVtDQUNIRV9OUl9CQU5LU107CiB9OwogCi1zdGF0aWMgaW50IHRjMzU4OXhfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQorc3RhdGljIGludCB0YzM1ODl4X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7CiAJc3RydWN0IHRjMzU4OXhfZ3BpbyAqdGMzNTg5eF9ncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJc3RydWN0IHRjMzU4OXggKnRjMzU4OXggPSB0YzM1ODl4X2dwaW8tPnRjMzU4OXg7CkBAIC00OSwyNCArNDksMjQgQEAKIAlyZXR1cm4gISEocmV0ICYgbWFzayk7CiB9CiAKLXN0YXRpYyB2b2lkIHRjMzU4OXhfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsKQorc3RhdGljIHZvaWQgdGMzNTg5eF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsKQogewogCXN0cnVjdCB0YzM1ODl4X2dwaW8gKnRjMzU4OXhfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCB0YzM1ODl4ICp0YzM1ODl4ID0gdGMzNTg5eF9ncGlvLT50YzM1ODl4OwogCXU4IHJlZyA9IFRDMzU4OXhfR1BJT0RBVEEwICsgKG9mZnNldCAvIDgpICogMjsKLQl1bnNpZ25lZCBwb3MgPSBvZmZzZXQgJSA4OworCXVuc2lnbmVkIGludCBwb3MgPSBvZmZzZXQgJSA4OwogCXU4IGRhdGFbXSA9IHt2YWwgPyBCSVQocG9zKSA6IDAsIEJJVChwb3MpfTsKIAogCXRjMzU4OXhfYmxvY2tfd3JpdGUodGMzNTg5eCwgcmVnLCBBUlJBWV9TSVpFKGRhdGEpLCBkYXRhKTsKIH0KIAogc3RhdGljIGludCB0YzM1ODl4X2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQkJCQkgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsKQorCQkJCQkgdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgdGMzNTg5eF9ncGlvICp0YzM1ODl4X2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3QgdGMzNTg5eCAqdGMzNTg5eCA9IHRjMzU4OXhfZ3Bpby0+dGMzNTg5eDsKIAl1OCByZWcgPSBUQzM1ODl4X0dQSU9ESVIwICsgb2Zmc2V0IC8gODsKLQl1bnNpZ25lZCBwb3MgPSBvZmZzZXQgJSA4OworCXVuc2lnbmVkIGludCBwb3MgPSBvZmZzZXQgJSA4OwogCiAJdGMzNTg5eF9ncGlvX3NldChjaGlwLCBvZmZzZXQsIHZhbCk7CiAKQEAgLTc0LDE5ICs3NCwzNSBAQAogfQogCiBzdGF0aWMgaW50IHRjMzU4OXhfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQkJCQkJdW5zaWduZWQgb2Zmc2V0KQorCQkJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCB0YzM1ODl4X2dwaW8gKnRjMzU4OXhfZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXN0cnVjdCB0YzM1ODl4ICp0YzM1ODl4ID0gdGMzNTg5eF9ncGlvLT50YzM1ODl4OwogCXU4IHJlZyA9IFRDMzU4OXhfR1BJT0RJUjAgKyBvZmZzZXQgLyA4OwotCXVuc2lnbmVkIHBvcyA9IG9mZnNldCAlIDg7CisJdW5zaWduZWQgaW50IHBvcyA9IG9mZnNldCAlIDg7CiAKIAlyZXR1cm4gdGMzNTg5eF9zZXRfYml0cyh0YzM1ODl4LCByZWcsIEJJVChwb3MpLCAwKTsKIH0KIAotc3RhdGljIGludCB0YzM1ODl4X2dwaW9fc2luZ2xlX2VuZGVkKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JCQkJICAgICB1bnNpZ25lZCBvZmZzZXQsCi0JCQkJICAgICBlbnVtIHNpbmdsZV9lbmRlZF9tb2RlIG1vZGUpCitzdGF0aWMgaW50IHRjMzU4OXhfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgdGMzNTg5eF9ncGlvICp0YzM1ODl4X2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlzdHJ1Y3QgdGMzNTg5eCAqdGMzNTg5eCA9IHRjMzU4OXhfZ3Bpby0+dGMzNTg5eDsKKwl1OCByZWcgPSBUQzM1ODl4X0dQSU9ESVIwICsgb2Zmc2V0IC8gODsKKwl1bnNpZ25lZCBpbnQgcG9zID0gb2Zmc2V0ICUgODsKKwlpbnQgcmV0OworCisJcmV0ID0gdGMzNTg5eF9yZWdfcmVhZCh0YzM1ODl4LCByZWcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuICEhKHJldCAmIEJJVChwb3MpKTsKK30KKworc3RhdGljIGludCB0YzM1ODl4X2dwaW9fc2V0X3NpbmdsZV9lbmRlZChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQkgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCQkJIGVudW0gc2luZ2xlX2VuZGVkX21vZGUgbW9kZSkKIHsKIAlzdHJ1Y3QgdGMzNTg5eF9ncGlvICp0YzM1ODl4X2dwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAlzdHJ1Y3QgdGMzNTg5eCAqdGMzNTg5eCA9IHRjMzU4OXhfZ3Bpby0+dGMzNTg5eDsKQEAgLTk3LDcgKzExMyw3IEBACiAJICovCiAJdTggb2RtcmVnID0gVEMzNTg5eF9HUElPT0RNMCArIChvZmZzZXQgLyA4KSAqIDI7CiAJdTggb2RlcmVnID0gVEMzNTg5eF9HUElPT0RFMCArIChvZmZzZXQgLyA4KSAqIDI7Ci0JdW5zaWduZWQgcG9zID0gb2Zmc2V0ICUgODsKKwl1bnNpZ25lZCBpbnQgcG9zID0gb2Zmc2V0ICUgODsKIAlpbnQgcmV0OwogCiAJc3dpdGNoKG1vZGUpIHsKQEAgLTEyNCwxNCArMTQwLDE1IEBACiAJcmV0dXJuIC1FTk9UU1VQUDsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAidGMzNTg5eCIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKLQkuZGlyZWN0aW9uX2lucHV0CT0gdGMzNTg5eF9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKIAkuZ2V0CQkJPSB0YzM1ODl4X2dwaW9fZ2V0LAotCS5kaXJlY3Rpb25fb3V0cHV0CT0gdGMzNTg5eF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQsCiAJLnNldAkJCT0gdGMzNTg5eF9ncGlvX3NldCwKLQkuc2V0X3NpbmdsZV9lbmRlZAk9IHRjMzU4OXhfZ3Bpb19zaW5nbGVfZW5kZWQsCisJLmRpcmVjdGlvbl9vdXRwdXQJPSB0YzM1ODl4X2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkuZGlyZWN0aW9uX2lucHV0CT0gdGMzNTg5eF9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKKwkuZ2V0X2RpcmVjdGlvbgkJPSB0YzM1ODl4X2dwaW9fZ2V0X2RpcmVjdGlvbiwKKwkuc2V0X3NpbmdsZV9lbmRlZAk9IHRjMzU4OXhfZ3Bpb19zZXRfc2luZ2xlX2VuZGVkLAogCS5jYW5fc2xlZXAJCT0gdHJ1ZSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRwaWMyODEwLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10cGljMjgxMC5jCmluZGV4IGNhY2U3OWMuLmM4YjM0ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRwaWMyODEwLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBpYzI4MTAuYwpAQCAtODcsNyArODcsNyBAQAogCXRwaWMyODEwX3NldF9tYXNrX2JpdHMoY2hpcCwgKm1hc2ssICpiaXRzKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAidHBpYzI4MTAiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmdldF9kaXJlY3Rpb24JCT0gdHBpYzI4MTBfZ2V0X2RpcmVjdGlvbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1MDg2LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTA4Ni5jCmluZGV4IDhlMjVmMDEuLmIyM2M0ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1MDg2LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjUwODYuYwpAQCAtNzIsNyArNzIsNyBAQAogCQkJICAgQklUKDQgKyBvZmZzZXQpLCB2YWx1ZSA/IEJJVCg0ICsgb2Zmc2V0KSA6IDApOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJ0cHM2NTA4Ni1ncGlvIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5nZXRfZGlyZWN0aW9uCQk9IHRwczY1MDg2X2dwaW9fZ2V0X2RpcmVjdGlvbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1MjE4LmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTIxOC5jCmluZGV4IDFjMDlhMTkuLmQ3NzkzMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1MjE4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjUyMTguYwpAQCAtMTcyLDcgKzE3Miw3IEBACiAJcmV0dXJuIC1FTk9UU1VQUDsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAiZ3Bpby10cHM2NTIxOCIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkucmVxdWVzdAkJPSB0cHM2NTIxOF9ncGlvX3JlcXVlc3QsCkBAIC0yMDQsNyArMjA0LDggQEAKIAl0cHM2NTIxOF9ncGlvLT5ncGlvX2NoaXAub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogI2VuZGlmCiAKLQlyZXQgPSBncGlvY2hpcF9hZGRfZGF0YSgmdHBzNjUyMThfZ3Bpby0+Z3Bpb19jaGlwLCB0cHM2NTIxOF9ncGlvKTsKKwlyZXQgPSBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKCZwZGV2LT5kZXYsICZ0cHM2NTIxOF9ncGlvLT5ncGlvX2NoaXAsCisJCQkJICAgICB0cHM2NTIxOF9ncGlvKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgZ3Bpb2NoaXAsICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpAQCAtMjE1LDE1ICsyMTYsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgdHBzNjUyMThfZ3Bpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgdHBzNjUyMThfZ3BpbyAqdHBzNjUyMThfZ3BpbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZ3Bpb2NoaXBfcmVtb3ZlKCZ0cHM2NTIxOF9ncGlvLT5ncGlvX2NoaXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRwczY1MjE4X2R0X21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJ0aSx0cHM2NTIxOC1ncGlvIiB9LAogCXsgIH0KQEAgLTI0Miw3ICsyMzQsNiBAQAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIodHBzNjUyMThfZHRfbWF0Y2gpCiAJfSwKIAkucHJvYmUgPSB0cHM2NTIxOF9ncGlvX3Byb2JlLAotCS5yZW1vdmUgPSB0cHM2NTIxOF9ncGlvX3JlbW92ZSwKIAkuaWRfdGFibGUgPSB0cHM2NTIxOF9ncGlvX2lkX3RhYmxlLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjU5MTIuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRwczY1OTEyLmMKaW5kZXggYWNmZDMwYS4uYWJjMDc5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjU5MTIuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTkxMi5jCkBAIC05MCw3ICs5MCw3IEBACiAJCQkgICBHUElPX1NFVF9NQVNLLCB2YWx1ZSA/IEdQSU9fU0VUX01BU0sgOiAwKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAidHBzNjU5MTItZ3BpbyIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZ2V0X2RpcmVjdGlvbgkJPSB0cHM2NTkxMl9ncGlvX2dldF9kaXJlY3Rpb24sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10czQ4MDAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRzNDgwMC5jCmluZGV4IDBjMTQ0YTcuLjk5MjU2MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRzNDgwMC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRzNDgwMC5jCkBAIC05LDYgKzksNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRzNDkwMC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdHM0OTAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkMjE3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXRzNDkwMC5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogRGlnaXRhbCBJL08gZHJpdmVyIGZvciBUZWNobm9sb2dpYyBTeXN0ZW1zIEkyQyBGUEdBIENvcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGVjaG5vbG9naWMgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDE2IFNhdm9pci1GYWlyZSBMaW51eAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3NlZCBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjZGVmaW5lIERFRkFVTFRfUElOX05VTUJFUgkzMgorLyoKKyAqIFJlZ2lzdGVyIGJpdHMgdXNlZCBieSB0aGUgR1BJTyBkZXZpY2UKKyAqIFNvbWUgYm9hcmRzLCBzdWNoIGFzIFRTLTc5NzAgZG8gbm90IGhhdmUgYSBzZXBhcmF0ZSBpbnB1dCBiaXQKKyAqLworI2RlZmluZSBUUzQ5MDBfR1BJT19PRQkJMHgwMQorI2RlZmluZSBUUzQ5MDBfR1BJT19PVVQJCTB4MDIKKyNkZWZpbmUgVFM0OTAwX0dQSU9fSU4JCTB4MDQKKyNkZWZpbmUgVFM3OTcwX0dQSU9fSU4JCTB4MDIKKworc3RydWN0IHRzNDkwMF9ncGlvX3ByaXYgeworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcDsKKwl1bnNpZ25lZCBpbnQgaW5wdXRfYml0OworfTsKKworc3RhdGljIGludCB0czQ5MDBfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCB0czQ5MDBfZ3Bpb19wcml2ICpwcml2ID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZ21hcF9yZWFkKHByaXYtPnJlZ21hcCwgb2Zmc2V0LCAmcmVnKTsKKworCXJldHVybiAhKHJlZyAmIFRTNDkwMF9HUElPX09FKTsKK30KKworc3RhdGljIGludCB0czQ5MDBfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgdHM0OTAwX2dwaW9fcHJpdiAqcHJpdiA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCisJLyoKKwkgKiBUaGlzIHdpbGwgY2xlYXIgdGhlIG91dHB1dCBlbmFibGUgYml0LCB0aGUgb3RoZXIgYml0cyBhcmUKKwkgKiBkb250Y2FyZSB3aGVuIHRoaXMgaXMgY2xlYXJlZAorCSAqLworCXJldHVybiByZWdtYXBfd3JpdGUocHJpdi0+cmVnbWFwLCBvZmZzZXQsIDApOworfQorCitzdGF0aWMgaW50IHRzNDkwMF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkJdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCB0czQ5MDBfZ3Bpb19wcml2ICpwcml2ID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJaW50IHJldDsKKworCWlmICh2YWx1ZSkKKwkJcmV0ID0gcmVnbWFwX3dyaXRlKHByaXYtPnJlZ21hcCwgb2Zmc2V0LCBUUzQ5MDBfR1BJT19PRSB8CisJCQkJCQkJIFRTNDkwMF9HUElPX09VVCk7CisJZWxzZQorCQlyZXQgPSByZWdtYXBfd3JpdGUocHJpdi0+cmVnbWFwLCBvZmZzZXQsIFRTNDkwMF9HUElPX09FKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHM0OTAwX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IHRzNDkwMF9ncGlvX3ByaXYgKnByaXYgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwl1bnNpZ25lZCBpbnQgcmVnOworCisJcmVnbWFwX3JlYWQocHJpdi0+cmVnbWFwLCBvZmZzZXQsICZyZWcpOworCisJcmV0dXJuICEhKHJlZyAmIHByaXYtPmlucHV0X2JpdCk7Cit9CisKK3N0YXRpYyB2b2lkIHRzNDkwMF9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgdHM0OTAwX2dwaW9fcHJpdiAqcHJpdiA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCisJaWYgKHZhbHVlKQorCQlyZWdtYXBfdXBkYXRlX2JpdHMocHJpdi0+cmVnbWFwLCBvZmZzZXQsIFRTNDkwMF9HUElPX09VVCwKKwkJCQkgICBUUzQ5MDBfR1BJT19PVVQpOworCWVsc2UKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHByaXYtPnJlZ21hcCwgb2Zmc2V0LCBUUzQ5MDBfR1BJT19PVVQsIDApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdHM0OTAwX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMTYsCisJLnZhbF9iaXRzID0gOCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CisJLmxhYmVsCQkJPSAidHM0OTAwLWdwaW8iLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmdldF9kaXJlY3Rpb24JCT0gdHM0OTAwX2dwaW9fZ2V0X2RpcmVjdGlvbiwKKwkuZGlyZWN0aW9uX2lucHV0CT0gdHM0OTAwX2dwaW9fZGlyZWN0aW9uX2lucHV0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gdHM0OTAwX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkuZ2V0CQkJPSB0czQ5MDBfZ3Bpb19nZXQsCisJLnNldAkJCT0gdHM0OTAwX2dwaW9fc2V0LAorCS5iYXNlCQkJPSAtMSwKKwkuY2FuX3NsZWVwCQk9IHRydWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0czQ5MDBfZ3Bpb19vZl9tYXRjaF90YWJsZVtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAidGVjaG5vbG9naWMsdHM0OTAwLWdwaW8iLAorCQkuZGF0YSA9ICh2b2lkICopVFM0OTAwX0dQSU9fSU4sCisJfSwgeworCQkuY29tcGF0aWJsZSA9ICJ0ZWNobm9sb2dpYyx0czc5NzAtZ3BpbyIsCisJCS5kYXRhID0gKHZvaWQgKilUUzc5NzBfR1BJT19JTiwKKwl9LAorCXsgLyogc2VudGluZWwgKi8gfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0czQ5MDBfZ3Bpb19vZl9tYXRjaF90YWJsZSk7CisKK3N0YXRpYyBpbnQgdHM0OTAwX2dwaW9fcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwlzdHJ1Y3QgdHM0OTAwX2dwaW9fcHJpdiAqcHJpdjsKKwl1MzIgbmdwaW87CisJaW50IHJldDsKKworCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKHRzNDkwMF9ncGlvX29mX21hdGNoX3RhYmxlLCAmY2xpZW50LT5kZXYpOworCWlmICghbWF0Y2gpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNsaWVudC0+ZGV2Lm9mX25vZGUsICJuZ3Bpb3MiLCAmbmdwaW8pKQorCQluZ3BpbyA9IERFRkFVTFRfUElOX05VTUJFUjsKKworCXByaXYgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+Z3Bpb19jaGlwID0gdGVtcGxhdGVfY2hpcDsKKwlwcml2LT5ncGlvX2NoaXAubGFiZWwgPSAidHM0OTAwLWdwaW8iOworCXByaXYtPmdwaW9fY2hpcC5uZ3BpbyA9IG5ncGlvOworCXByaXYtPmdwaW9fY2hpcC5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJcHJpdi0+aW5wdXRfYml0ID0gKHVpbnRwdHJfdCltYXRjaC0+ZGF0YTsKKworCXByaXYtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJnRzNDkwMF9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKHByaXYtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihwcml2LT5yZWdtYXApOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXA6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkZXZtX2dwaW9jaGlwX2FkZF9kYXRhKCZjbGllbnQtPmRldiwgJnByaXYtPmdwaW9fY2hpcCwgcHJpdik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gcmVnaXN0ZXIgZ3Bpb2NoaXBcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0czQ5MDBfZ3Bpb19pZF90YWJsZVtdID0geworCXsgInRzNDkwMC1ncGlvIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdHM0OTAwX2dwaW9faWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdHM0OTAwX2dwaW9fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInRzNDkwMC1ncGlvIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gdHM0OTAwX2dwaW9fb2ZfbWF0Y2hfdGFibGUsCisJfSwKKwkucHJvYmUgPSB0czQ5MDBfZ3Bpb19wcm9iZSwKKwkuaWRfdGFibGUgPSB0czQ5MDBfZ3Bpb19pZF90YWJsZSwKK307Cittb2R1bGVfaTJjX2RyaXZlcih0czQ5MDBfZ3Bpb19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJUZWNobm9sb2dpYyBTeXN0ZW1zIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdQSU8gaW50ZXJmYWNlIGZvciBUZWNobm9sb2dpYyBTeXN0ZW1zIEkyQy1GUEdBIGNvcmUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXR3bDQwMzAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXR3bDQwMzAuYwppbmRleCA0YjgwN2IwLi5kZmNmYmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby10d2w0MDMwLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdHdsNDAzMC5jCkBAIC0zODEsNyArMzgxLDcgQEAKIAkJOiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJ0d2w0MDMwIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5yZXF1ZXN0CQk9IHR3bF9yZXF1ZXN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tdmY2MTAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXZmNjEwLmMKaW5kZXggNjI4NGJkYi4uM2VkYjA5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tdmY2MTAuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby12ZjYxMC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIHZmNjEwIEdQSU8gc3VwcG9ydCB0aHJvdWdoIFBPUlQgYW5kIEdQSU8gbW9kdWxlCisgKiBGcmVlc2NhbGUgdmY2MTAgR1BJTyBzdXBwb3J0IHRocm91Z2ggUE9SVCBhbmQgR1BJTwogICoKICAqIENvcHlyaWdodCAoYykgMjAxNCBUb3JhZGV4IEFHLgogICoKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CkBAIC0yODksNyArMjg4LDMgQEAKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ2ZjYxMF9ncGlvX2RyaXZlcik7CiB9CiBkZXZpY2VfaW5pdGNhbGwoZ3Bpb192ZjYxMF9pbml0KTsKLQotTU9EVUxFX0FVVEhPUigiU3RlZmFuIEFnbmVyIDxzdGVmYW5AYWduZXIuY2g+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBWRjYxMCBHUElPIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby13Y292ZS5jIGIvZHJpdmVycy9ncGlvL2dwaW8td2NvdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRkYmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8td2NvdmUuYwpAQCAtMCwwICsxLDQ3MCBAQAorLyoKKyAqIEludGVsIFdoaXNrZXkgQ292ZSBQTUlDIEdQSU8gRHJpdmVyCisgKgorICogVGhpcyBkcml2ZXIgaXMgd3JpdHRlbiBiYXNlZCBvbiBncGlvLWNyeXN0YWxjb3ZlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9pbnRlbF9zb2NfcG1pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisKKy8qCisgKiBXaGlza2V5IENvdmUgUE1JQyBoYXMgMTMgcGh5c2ljYWwgR1BJTyBwaW5zIGRpdmlkZWQgaW50byAzIGJhbmtzOgorICogQmFuayAwOiBQaW4gMCAtIDYKKyAqIEJhbmsgMTogUGluIDcgLSAxMAorICogQmFuayAyOiBQaW4gMTEgLTEyCisgKiBFYWNoIHBpbiBoYXMgb25lIG91dHB1dCBjb250cm9sIHJlZ2lzdGVyIGFuZCBvbmUgaW5wdXQgY29udHJvbCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBCQU5LMF9OUl9QSU5TCQk3CisjZGVmaW5lIEJBTksxX05SX1BJTlMJCTQKKyNkZWZpbmUgQkFOSzJfTlJfUElOUwkJMgorI2RlZmluZSBXQ09WRV9HUElPX05VTQkJKEJBTkswX05SX1BJTlMgKyBCQU5LMV9OUl9QSU5TICsgQkFOSzJfTlJfUElOUykKKyNkZWZpbmUgV0NPVkVfVkdQSU9fTlVNCQk5NAorLyogR1BJTyBvdXRwdXQgY29udHJvbCByZWdpc3RlcnMgKG9uZSBwZXIgcGluKTogMHg0ZTQ0IC0gMHg0ZTUwICovCisjZGVmaW5lIEdQSU9fT1VUX0NUUkxfQkFTRQkweDRlNDQKKy8qIEdQSU8gaW5wdXQgY29udHJvbCByZWdpc3RlcnMgKG9uZSBwZXIgcGluKTogMHg0ZTUxIC0gMHg0ZTVkICovCisjZGVmaW5lIEdQSU9fSU5fQ1RSTF9CQVNFCTB4NGU1MQorCisvKgorICogR1BJTyBpbnRlcnJ1cHRzIGFyZSBvcmdhbml6ZWQgaW4gdHdvIGdyb3VwczoKKyAqIEdyb3VwIDA6IEJhbmsgMCBwaW5zIChQaW4gMCAtIDYpCisgKiBHcm91cCAxOiBCYW5rIDEgYW5kIEJhbmsgMiBwaW5zIChQaW4gNyAtIDEyKQorICogRWFjaCBncm91cCBoYXMgdHdvIHJlZ2lzdGVycyAob25lIGJpdCBwZXIgcGluKTogc3RhdHVzIGFuZCBtYXNrLgorICovCisjZGVmaW5lIEdST1VQMF9OUl9JUlFTCQk3CisjZGVmaW5lIEdST1VQMV9OUl9JUlFTCQk2CisjZGVmaW5lIElSUV9NQVNLX0JBU0UJCTB4NGUxOQorI2RlZmluZSBJUlFfU1RBVFVTX0JBU0UJCTB4NGUwYgorI2RlZmluZSBVUERBVEVfSVJRX1RZUEUJCUJJVCgwKQorI2RlZmluZSBVUERBVEVfSVJRX01BU0sJCUJJVCgxKQorCisjZGVmaW5lIENUTElfSU5UQ05UX0RJUwkJKDAgPDwgMSkKKyNkZWZpbmUgQ1RMSV9JTlRDTlRfTkUJCSgxIDw8IDEpCisjZGVmaW5lIENUTElfSU5UQ05UX1BFCQkoMiA8PCAxKQorI2RlZmluZSBDVExJX0lOVENOVF9CRQkJKDMgPDwgMSkKKworI2RlZmluZSBDVExPX0RJUl9JTgkJKDAgPDwgNSkKKyNkZWZpbmUgQ1RMT19ESVJfT1VUCQkoMSA8PCA1KQorCisjZGVmaW5lIENUTE9fRFJWX01BU0sJCSgxIDw8IDQpCisjZGVmaW5lIENUTE9fRFJWX09ECQkoMCA8PCA0KQorI2RlZmluZSBDVExPX0RSVl9DTU9TCQkoMSA8PCA0KQorCisjZGVmaW5lIENUTE9fRFJWX1JFTgkJKDEgPDwgMykKKworI2RlZmluZSBDVExPX1JWQUxfMktET1dOCSgwIDw8IDEpCisjZGVmaW5lIENUTE9fUlZBTF8yS1VQCQkoMSA8PCAxKQorI2RlZmluZSBDVExPX1JWQUxfNTBLRE9XTgkoMiA8PCAxKQorI2RlZmluZSBDVExPX1JWQUxfNTBLVVAJCSgzIDw8IDEpCisKKyNkZWZpbmUgQ1RMT19JTlBVVF9TRVQJKENUTE9fRFJWX0NNT1MgfCBDVExPX0RSVl9SRU4gfCBDVExPX1JWQUxfMktVUCkKKyNkZWZpbmUgQ1RMT19PVVRQVVRfU0VUCShDVExPX0RJUl9PVVQgfCBDVExPX0lOUFVUX1NFVCkKKworZW51bSBjdHJsX3JlZ2lzdGVyIHsKKwlDVFJMX0lOLAorCUNUUkxfT1VULAorfTsKKworLyoKKyAqIHN0cnVjdCB3Y292ZV9ncGlvIC0gV2hpc2tleSBDb3ZlIEdQSU8gY29udHJvbGxlcgorICogQGJ1c2xvY2s6IGZvciBidXMgbG9jay9zeW5jIGFuZCB1bmxvY2suCisgKiBAY2hpcDogdGhlIGFic3RyYWN0IGdwaW9fY2hpcCBzdHJ1Y3R1cmUuCisgKiBAZGV2OiB0aGUgZ3BpbyBkZXZpY2UKKyAqIEByZWdtYXA6IHRoZSByZWdtYXAgZnJvbSB0aGUgcGFyZW50IGRldmljZS4KKyAqIEByZWdtYXBfaXJxX2NoaXA6IHRoZSByZWdtYXAgb2YgdGhlIGdwaW8gaXJxIGNoaXAuCisgKiBAdXBkYXRlOiBwZW5kaW5nIElSUSBzZXR0aW5nIHVwZGF0ZSwgdG8gYmUgd3JpdHRlbiB0byB0aGUgY2hpcCB1cG9uIHVubG9jay4KKyAqIEBpbnRjbnQ6IHRoZSBJbnRlcnJ1cHQgRGV0ZWN0IHZhbHVlIHRvIGJlIHdyaXR0ZW4uCisgKiBAc2V0X2lycV9tYXNrOiB0cnVlIGlmIHRoZSBJUlEgbWFzayBuZWVkcyB0byBiZSBzZXQsIGZhbHNlIHRvIGNsZWFyLgorICovCitzdHJ1Y3Qgd2NvdmVfZ3BpbyB7CisJc3RydWN0IG11dGV4IGJ1c2xvY2s7CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IHJlZ21hcF9pcnFfY2hpcF9kYXRhICpyZWdtYXBfaXJxX2NoaXA7CisJaW50IHVwZGF0ZTsKKwlpbnQgaW50Y250OworCWJvb2wgc2V0X2lycV9tYXNrOworfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdG9fcmVnKGludCBncGlvLCBlbnVtIGN0cmxfcmVnaXN0ZXIgcmVnX3R5cGUpCit7CisJdW5zaWduZWQgaW50IHJlZzsKKwlpbnQgYmFuazsKKworCWlmIChncGlvIDwgQkFOSzBfTlJfUElOUykKKwkJYmFuayA9IDA7CisJZWxzZSBpZiAoZ3BpbyA8IEJBTkswX05SX1BJTlMgKyBCQU5LMV9OUl9QSU5TKQorCQliYW5rID0gMTsKKwllbHNlCisJCWJhbmsgPSAyOworCisJaWYgKHJlZ190eXBlID09IENUUkxfSU4pCisJCXJlZyA9IEdQSU9fSU5fQ1RSTF9CQVNFICsgYmFuazsKKwllbHNlCisJCXJlZyA9IEdQSU9fT1VUX0NUUkxfQkFTRSArIGJhbms7CisKKwlyZXR1cm4gcmVnOworfQorCitzdGF0aWMgdm9pZCB3Y292ZV91cGRhdGVfaXJxX21hc2soc3RydWN0IHdjb3ZlX2dwaW8gKndnLCBpbnQgZ3BpbykKK3sKKwl1bnNpZ25lZCBpbnQgcmVnLCBtYXNrOworCisJaWYgKGdwaW8gPCBHUk9VUDBfTlJfSVJRUykgeworCQlyZWcgPSBJUlFfTUFTS19CQVNFOworCQltYXNrID0gQklUKGdwaW8gJSBHUk9VUDBfTlJfSVJRUyk7CisJfSBlbHNlIHsKKwkJcmVnID0gSVJRX01BU0tfQkFTRSArIDE7CisJCW1hc2sgPSBCSVQoKGdwaW8gLSBHUk9VUDBfTlJfSVJRUykgJSBHUk9VUDFfTlJfSVJRUyk7CisJfQorCisJaWYgKHdnLT5zZXRfaXJxX21hc2spCisJCXJlZ21hcF91cGRhdGVfYml0cyh3Zy0+cmVnbWFwLCByZWcsIG1hc2ssIG1hc2spOworCWVsc2UKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdnLT5yZWdtYXAsIHJlZywgbWFzaywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHdjb3ZlX3VwZGF0ZV9pcnFfY3RybChzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2csIGludCBncGlvKQoreworCXVuc2lnbmVkIGludCByZWcgPSB0b19yZWcoZ3BpbywgQ1RSTF9JTik7CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMod2ctPnJlZ21hcCwgcmVnLCBDVExJX0lOVENOVF9CRSwgd2ctPmludGNudCk7Cit9CisKK3N0YXRpYyBpbnQgd2NvdmVfZ3Bpb19kaXJfaW4oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGdwaW8pCit7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisKKwlyZXR1cm4gcmVnbWFwX3dyaXRlKHdnLT5yZWdtYXAsIHRvX3JlZyhncGlvLCBDVFJMX09VVCksCisJCQkgICAgQ1RMT19JTlBVVF9TRVQpOworfQorCitzdGF0aWMgaW50IHdjb3ZlX2dwaW9fZGlyX291dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgZ3BpbywKKwkJCQkgICAgaW50IHZhbHVlKQoreworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCisJcmV0dXJuIHJlZ21hcF93cml0ZSh3Zy0+cmVnbWFwLCB0b19yZWcoZ3BpbywgQ1RSTF9PVVQpLAorCQkJICAgIENUTE9fT1VUUFVUX1NFVCB8IHZhbHVlKTsKK30KKworc3RhdGljIGludCB3Y292ZV9ncGlvX2dldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGdwaW8pCit7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3JlYWQod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfT1VUKSwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAhKHZhbCAmIENUTE9fRElSX09VVCk7Cit9CisKK3N0YXRpYyBpbnQgd2NvdmVfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGdwaW8pCit7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3JlYWQod2ctPnJlZ21hcCwgdG9fcmVnKGdwaW8sIENUUkxfSU4pLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHZhbCAmIDB4MTsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKKwkJCQkgdW5zaWduZWQgaW50IGdwaW8sIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCWlmICh2YWx1ZSkKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdnLT5yZWdtYXAsIHRvX3JlZyhncGlvLCBDVFJMX09VVCksIDEsIDEpOworCWVsc2UKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHdnLT5yZWdtYXAsIHRvX3JlZyhncGlvLCBDVFJMX09VVCksIDEsIDApOworfQorCitzdGF0aWMgaW50IHdjb3ZlX2dwaW9fc2V0X3NpbmdsZV9lbmRlZChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQl1bnNpZ25lZCBpbnQgZ3BpbywKKwkJCQkJZW51bSBzaW5nbGVfZW5kZWRfbW9kZSBtb2RlKQoreworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBMSU5FX01PREVfT1BFTl9EUkFJTjoKKwkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyh3Zy0+cmVnbWFwLCB0b19yZWcoZ3BpbywgQ1RSTF9PVVQpLAorCQkJCQkJQ1RMT19EUlZfTUFTSywgQ1RMT19EUlZfT0QpOworCWNhc2UgTElORV9NT0RFX1BVU0hfUFVMTDoKKwkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyh3Zy0+cmVnbWFwLCB0b19yZWcoZ3BpbywgQ1RSTF9PVVQpLAorCQkJCQkJQ1RMT19EUlZfTUFTSywgQ1RMT19EUlZfQ01PUyk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworc3RhdGljIGludCB3Y292ZV9pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCB0eXBlKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVJRX1RZUEVfTk9ORToKKwkJd2ctPmludGNudCA9IENUTElfSU5UQ05UX0RJUzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0JPVEg6CisJCXdnLT5pbnRjbnQgPSBDVExJX0lOVENOVF9CRTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJd2ctPmludGNudCA9IENUTElfSU5UQ05UX1BFOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwkJd2ctPmludGNudCA9IENUTElfSU5UQ05UX05FOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3Zy0+dXBkYXRlIHw9IFVQREFURV9JUlFfVFlQRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3Y292ZV9idXNfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCisJbXV0ZXhfbG9jaygmd2ctPmJ1c2xvY2spOworfQorCitzdGF0aWMgdm9pZCB3Y292ZV9idXNfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlpbnQgZ3BpbyA9IGRhdGEtPmh3aXJxOworCisJaWYgKHdnLT51cGRhdGUgJiBVUERBVEVfSVJRX1RZUEUpCisJCXdjb3ZlX3VwZGF0ZV9pcnFfY3RybCh3ZywgZ3Bpbyk7CisJaWYgKHdnLT51cGRhdGUgJiBVUERBVEVfSVJRX01BU0spCisJCXdjb3ZlX3VwZGF0ZV9pcnFfbWFzayh3ZywgZ3Bpbyk7CisJd2ctPnVwZGF0ZSA9IDA7CisKKwltdXRleF91bmxvY2soJndnLT5idXNsb2NrKTsKK30KKworc3RhdGljIHZvaWQgd2NvdmVfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCisJd2ctPnNldF9pcnFfbWFzayA9IGZhbHNlOworCXdnLT51cGRhdGUgfD0gVVBEQVRFX0lSUV9NQVNLOworfQorCitzdGF0aWMgdm9pZCB3Y292ZV9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXN0cnVjdCB3Y292ZV9ncGlvICp3ZyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCisJd2ctPnNldF9pcnFfbWFzayA9IHRydWU7CisJd2ctPnVwZGF0ZSB8PSBVUERBVEVfSVJRX01BU0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgd2NvdmVfaXJxY2hpcCA9IHsKKwkubmFtZQkJCT0gIldoaXNrZXkgQ292ZSIsCisJLmlycV9tYXNrCQk9IHdjb3ZlX2lycV9tYXNrLAorCS5pcnFfdW5tYXNrCQk9IHdjb3ZlX2lycV91bm1hc2ssCisJLmlycV9zZXRfdHlwZQkJPSB3Y292ZV9pcnFfdHlwZSwKKwkuaXJxX2J1c19sb2NrCQk9IHdjb3ZlX2J1c19sb2NrLAorCS5pcnFfYnVzX3N5bmNfdW5sb2NrCT0gd2NvdmVfYnVzX3N5bmNfdW5sb2NrLAorfTsKKworc3RhdGljIGlycXJldHVybl90IHdjb3ZlX2dwaW9faXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSAoc3RydWN0IHdjb3ZlX2dwaW8gKilkYXRhOworCXVuc2lnbmVkIGludCBwZW5kaW5nLCB2aXJxLCBncGlvLCBtYXNrLCBvZmZzZXQ7CisJdTggcFsyXTsKKworCWlmIChyZWdtYXBfYnVsa19yZWFkKHdnLT5yZWdtYXAsIElSUV9TVEFUVVNfQkFTRSwgcCwgMikpIHsKKwkJZGV2X2Vycih3Zy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgaXJxIHN0YXR1cyByZWdpc3RlclxuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlwZW5kaW5nID0gcFswXSB8IChwWzFdIDw8IDgpOworCWlmICghcGVuZGluZykKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogSXRlcmF0ZSB1bnRpbCBubyBpbnRlcnJ1cHQgaXMgcGVuZGluZyAqLworCXdoaWxlIChwZW5kaW5nKSB7CisJCS8qIE9uZSBpdGVyYXRpb24gaXMgZm9yIGFsbCBwZW5kaW5nIGJpdHMgKi8KKwkJZm9yX2VhY2hfc2V0X2JpdChncGlvLCAoY29uc3QgdW5zaWduZWQgbG9uZyAqKSZwZW5kaW5nLAorCQkJCQkJIEdST1VQMF9OUl9JUlFTKSB7CisJCQlvZmZzZXQgPSAoZ3BpbyA+IEdST1VQMF9OUl9JUlFTKSA/IDEgOiAwOworCQkJbWFzayA9IChvZmZzZXQgPT0gMSkgPyBCSVQoZ3BpbyAtIEdST1VQMF9OUl9JUlFTKSA6CisJCQkJCQkJCUJJVChncGlvKTsKKwkJCXZpcnEgPSBpcnFfZmluZF9tYXBwaW5nKHdnLT5jaGlwLmlycWRvbWFpbiwgZ3Bpbyk7CisJCQloYW5kbGVfbmVzdGVkX2lycSh2aXJxKTsKKwkJCXJlZ21hcF91cGRhdGVfYml0cyh3Zy0+cmVnbWFwLCBJUlFfU1RBVFVTX0JBU0UgKyBvZmZzZXQsCisJCQkJCQkJCW1hc2ssIG1hc2spOworCQl9CisKKwkJLyogTmV4dCBpdGVyYXRpb24gKi8KKwkJaWYgKHJlZ21hcF9idWxrX3JlYWQod2ctPnJlZ21hcCwgSVJRX1NUQVRVU19CQVNFLCBwLCAyKSkgeworCQkJZGV2X2Vycih3Zy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgaXJxIHN0YXR1c1xuIik7CisJCQlicmVhazsKKwkJfQorCisJCXBlbmRpbmcgPSBwWzBdIHwgKHBbMV0gPDwgOCk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCB3Y292ZV9ncGlvX2RiZ19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywKKwkJCQkgICAgICBzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKQoreworCXVuc2lnbmVkIGludCBjdGxvLCBjdGxpLCBpcnFfbWFzaywgaXJxX3N0YXR1czsKKwlzdHJ1Y3Qgd2NvdmVfZ3BpbyAqd2cgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlpbnQgZ3Bpbywgb2Zmc2V0LCBncm91cCwgcmV0ID0gMDsKKworCWZvciAoZ3BpbyA9IDA7IGdwaW8gPCBXQ09WRV9HUElPX05VTTsgZ3BpbysrKSB7CisJCWdyb3VwID0gZ3BpbyA8IEdST1VQMF9OUl9JUlFTID8gMCA6IDE7CisJCXJldCArPSByZWdtYXBfcmVhZCh3Zy0+cmVnbWFwLCB0b19yZWcoZ3BpbywgQ1RSTF9PVVQpLCAmY3Rsbyk7CisJCXJldCArPSByZWdtYXBfcmVhZCh3Zy0+cmVnbWFwLCB0b19yZWcoZ3BpbywgQ1RSTF9JTiksICZjdGxpKTsKKwkJcmV0ICs9IHJlZ21hcF9yZWFkKHdnLT5yZWdtYXAsIElSUV9NQVNLX0JBU0UgKyBncm91cCwKKwkJCQkJCQkmaXJxX21hc2spOworCQlyZXQgKz0gcmVnbWFwX3JlYWQod2ctPnJlZ21hcCwgSVJRX1NUQVRVU19CQVNFICsgZ3JvdXAsCisJCQkJCQkJJmlycV9zdGF0dXMpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byByZWFkIHJlZ2lzdGVyczogY3RybCBvdXQvaW4gb3IgaXJxIHN0YXR1cy9tYXNrXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJb2Zmc2V0ID0gZ3BpbyAlIDg7CisJCXNlcV9wcmludGYocywgIiBncGlvLSUtMmQgJXMgJXMgJXMgJXMgY3Rsbz0lMngsJXMgJXNcbiIsCisJCQkgICBncGlvLCBjdGxvICYgQ1RMT19ESVJfT1VUID8gIm91dCIgOiAiaW4gIiwKKwkJCSAgIGN0bGkgJiAweDEgPyAiaGkiIDogImxvIiwKKwkJCSAgIGN0bGkgJiBDVExJX0lOVENOVF9ORSA/ICJmYWxsIiA6ICIgICAgIiwKKwkJCSAgIGN0bGkgJiBDVExJX0lOVENOVF9QRSA/ICJyaXNlIiA6ICIgICAgIiwKKwkJCSAgIGN0bG8sCisJCQkgICBpcnFfbWFzayAmIEJJVChvZmZzZXQpID8gIm1hc2sgICIgOiAidW5tYXNrIiwKKwkJCSAgIGlycV9zdGF0dXMgJiBCSVQob2Zmc2V0KSA/ICJwZW5kaW5nIiA6ICIgICAgICAgIik7CisJfQorfQorCitzdGF0aWMgaW50IHdjb3ZlX2dwaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaW50ZWxfc29jX3BtaWMgKnBtaWM7CisJc3RydWN0IHdjb3ZlX2dwaW8gKndnOworCWludCB2aXJxLCByZXQsIGlycTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwkvKgorCSAqIFRoaXMgZ3BpbyBwbGF0Zm9ybSBkZXZpY2UgaXMgY3JlYXRlZCBieSBhIG1mZCBkZXZpY2UgKHNlZQorCSAqIGRyaXZlcnMvbWZkL2ludGVsX3NvY19wbWljX2J4dHdjLmMgZm9yIGRldGFpbHMpLiBJbmZvcm1hdGlvbgorCSAqIHNoYXJlZCBieSBhbGwgc3ViLWRldmljZXMgY3JlYXRlZCBieSB0aGUgbWZkIGRldmljZSwgdGhlIHJlZ21hcAorCSAqIHBvaW50ZXIgZm9yIGluc3RhbmNlLCBpcyBzdG9yZWQgYXMgZHJpdmVyIGRhdGEgb2YgdGhlIG1mZCBkZXZpY2UKKwkgKiBkcml2ZXIuCisJICovCisJcG1pYyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlpZiAoIXBtaWMpCisJCXJldHVybiAtRU5PREVWOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCWRldiA9ICZwZGV2LT5kZXY7CisKKwl3ZyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqd2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdnLT5yZWdtYXBfaXJxX2NoaXAgPSBwbWljLT5pcnFfY2hpcF9kYXRhX2xldmVsMjsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHdnKTsKKworCW11dGV4X2luaXQoJndnLT5idXNsb2NrKTsKKwl3Zy0+Y2hpcC5sYWJlbCA9IEtCVUlMRF9NT0ROQU1FOworCXdnLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IHdjb3ZlX2dwaW9fZGlyX2luOworCXdnLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSB3Y292ZV9ncGlvX2Rpcl9vdXQ7CisJd2ctPmNoaXAuZ2V0X2RpcmVjdGlvbiA9IHdjb3ZlX2dwaW9fZ2V0X2RpcmVjdGlvbjsKKwl3Zy0+Y2hpcC5nZXQgPSB3Y292ZV9ncGlvX2dldDsKKwl3Zy0+Y2hpcC5zZXQgPSB3Y292ZV9ncGlvX3NldDsKKwl3Zy0+Y2hpcC5zZXRfc2luZ2xlX2VuZGVkID0gd2NvdmVfZ3Bpb19zZXRfc2luZ2xlX2VuZGVkLAorCXdnLT5jaGlwLmJhc2UgPSAtMTsKKwl3Zy0+Y2hpcC5uZ3BpbyA9IFdDT1ZFX1ZHUElPX05VTTsKKwl3Zy0+Y2hpcC5jYW5fc2xlZXAgPSB0cnVlOworCXdnLT5jaGlwLnBhcmVudCA9IHBkZXYtPmRldi5wYXJlbnQ7CisJd2ctPmNoaXAuZGJnX3Nob3cgPSB3Y292ZV9ncGlvX2RiZ19zaG93OworCXdnLT5kZXYgPSBkZXY7CisJd2ctPnJlZ21hcCA9IHBtaWMtPnJlZ21hcDsKKworCXJldCA9IGRldm1fZ3Bpb2NoaXBfYWRkX2RhdGEoZGV2LCAmd2ctPmNoaXAsIHdnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFkZCBncGlvY2hpcDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZ3Bpb2NoaXBfaXJxY2hpcF9hZGQoJndnLT5jaGlwLCAmd2NvdmVfaXJxY2hpcCwgMCwKKwkJCSAgICAgaGFuZGxlX3NpbXBsZV9pcnEsIElSUV9UWVBFX05PTkUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWRkIGlycWNoaXA6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXZpcnEgPSByZWdtYXBfaXJxX2dldF92aXJxKHdnLT5yZWdtYXBfaXJxX2NoaXAsIGlycSk7CisJaWYgKHZpcnEgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCB2aXJxIGJ5IGlycSAlZFxuIiwgaXJxKTsKKwkJcmV0dXJuIHZpcnE7CisJfQorCisJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIHZpcnEsIE5VTEwsCisJCXdjb3ZlX2dwaW9faXJxX2hhbmRsZXIsIElSUUZfT05FU0hPVCwgcGRldi0+bmFtZSwgd2cpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsIHZpcnEpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogV2hpc2tleSBDb3ZlIFBNSUMgaXRzZWxmIGlzIGEgYW5hbG9nIGRldmljZShidXQgd2l0aCBkaWdpdGFsIGNvbnRyb2wKKyAqIGludGVyZmFjZSkgcHJvdmlkaW5nIHBvd2VyIG1hbmFnZW1lbnQgc3VwcG9ydCBmb3Igb3RoZXIgZGV2aWNlcyBpbgorICogdGhlIGFjY29tcGFuaWVkIFNvQywgc28gd2UgaGF2ZSBubyAucG0gZm9yIFdoaXNrZXkgQ292ZSBHUElPIGRyaXZlci4KKyAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd2NvdmVfZ3Bpb19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYnh0X3djb3ZlX2dwaW8iLAorCX0sCisJLnByb2JlID0gd2NvdmVfZ3Bpb19wcm9iZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIod2NvdmVfZ3Bpb19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJBamF5IFRob21hcyA8YWpheS50aG9tYXMuZGF2aWQucmFqYW1hbmlja2FtQGludGVsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkJpbiBHYW8gPGJpbi5nYW9AaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBXaGlza2V5IENvdmUgR1BJTyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06Ynh0X3djb3ZlX2dwaW8iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODMxeC5jIGIvZHJpdmVycy9ncGlvL2dwaW8td204MzF4LmMKaW5kZXggMjFmOTdiYy4uNTMzNzA3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8td204MzF4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8td204MzF4LmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogI2RlZmluZSB3bTgzMXhfZ3Bpb19kYmdfc2hvdyBOVUxMCiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAid204MzF4IiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5kaXJlY3Rpb25faW5wdXQJPSB3bTgzMXhfZ3Bpb19kaXJlY3Rpb25faW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby13bTgzNTAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODM1MC5jCmluZGV4IGU5NzY1NzAuLmU0Njc1MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODM1MC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODM1MC5jCkBAIC05Myw3ICs5Myw3IEBACiAJcmV0dXJuIHdtODM1MC0+aXJxX2Jhc2UgKyBXTTgzNTBfSVJRX0dQSU8ob2Zmc2V0KTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CiAJLmxhYmVsCQkJPSAid204MzUwIiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5kaXJlY3Rpb25faW5wdXQJPSB3bTgzNTBfZ3Bpb19kaXJlY3Rpb25faW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby13bTg5OTQuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODk5NC5jCmluZGV4IDI0NTdhYWMuLjY4NDEwZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODk5NC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLXdtODk5NC5jCkBAIC0yNDksNyArMjQ5LDcgQEAKICNkZWZpbmUgd204OTk0X2dwaW9fZGJnX3Nob3cgTlVMTAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHRlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gIndtODk5NCIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkucmVxdWVzdAkJPSB3bTg5OTRfZ3Bpb19yZXF1ZXN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tenlucS5jIGIvZHJpdmVycy9ncGlvL2dwaW8tenlucS5jCmluZGV4IGU3Mjc5NGUuLjZiNGQxMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXp5bnEuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby16eW5xLmMKQEAgLTk2LDYgKzk2LDkgQEAKIC8qIEdQSU8gdXBwZXIgMTYgYml0IG1hc2sgKi8KICNkZWZpbmUgWllOUV9HUElPX1VQUEVSX01BU0sgMHhGRkZGMDAwMAogCisvKiBGb3IgR1BJTyBxdWlya3MgKi8KKyNkZWZpbmUgWllOUV9HUElPX1FVSVJLX0ZPTwlCSVQoMCkKKwogLyoqCiAgKiBzdHJ1Y3QgenlucV9ncGlvIC0gZ3BpbyBkZXZpY2UgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQogICogQGNoaXA6CWluc3RhbmNlIG9mIHRoZSBncGlvX2NoaXAKQEAgLTEyMiw2ICsxMjUsNyBAQAogKi8KIHN0cnVjdCB6eW5xX3BsYXRmb3JtX2RhdGEgewogCWNvbnN0IGNoYXIgKmxhYmVsOworCXUzMiBxdWlya3M7CiAJdTE2IG5ncGlvOwogCWludCBtYXhfYmFuazsKIAlpbnQgYmFua19taW5bWllOUU1QX0dQSU9fTUFYX0JBTktdOwpAQCAtMjM4LDEzICsyNDIsMTkgQEAKIHN0YXRpYyBpbnQgenlucV9ncGlvX2Rpcl9pbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgcGluKQogewogCXUzMiByZWc7CisJYm9vbCBpc196eW5xX2dwaW87CiAJdW5zaWduZWQgaW50IGJhbmtfbnVtLCBiYW5rX3Bpbl9udW07CiAJc3RydWN0IHp5bnFfZ3BpbyAqZ3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCisJaXNfenlucV9ncGlvID0gZ3Bpby0+cF9kYXRhLT5xdWlya3MgJiBaWU5RX0dQSU9fUVVJUktfRk9POwogCXp5bnFfZ3Bpb19nZXRfYmFua19waW4ocGluLCAmYmFua19udW0sICZiYW5rX3Bpbl9udW0sIGdwaW8pOwogCi0JLyogYmFuayAwIHBpbnMgNyBhbmQgOCBhcmUgc3BlY2lhbCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgaW5wdXRzICovCi0JaWYgKGJhbmtfbnVtID09IDAgJiYgKGJhbmtfcGluX251bSA9PSA3IHx8IGJhbmtfcGluX251bSA9PSA4KSkKKwkvKgorCSAqIE9uIHp5bnEgYmFuayAwIHBpbnMgNyBhbmQgOCBhcmUgc3BlY2lhbCBhbmQgY2Fubm90IGJlIHVzZWQKKwkgKiBhcyBpbnB1dHMuCisJICovCisJaWYgKGlzX3p5bnFfZ3BpbyAmJiBiYW5rX251bSA9PSAwICYmCisJCShiYW5rX3Bpbl9udW0gPT0gNyB8fCBiYW5rX3Bpbl9udW0gPT0gOCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogY2xlYXIgdGhlIGJpdCBpbiBkaXJlY3Rpb24gbW9kZSByZWcgdG8gc2V0IHRoZSBwaW4gYXMgaW5wdXQgKi8KQEAgLTYyNyw2ICs2MzcsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHp5bnFfcGxhdGZvcm1fZGF0YSB6eW5xX2dwaW9fZGVmID0gewogCS5sYWJlbCA9ICJ6eW5xX2dwaW8iLAorCS5xdWlya3MgPSBaWU5RX0dQSU9fUVVJUktfRk9PLAogCS5uZ3BpbyA9IFpZTlFfR1BJT19OUl9HUElPUywKIAkubWF4X2JhbmsgPSBaWU5RX0dQSU9fTUFYX0JBTkssCiAJLmJhbmtfbWluWzBdID0gWllOUV9HUElPX0JBTkswX1BJTl9NSU4oKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLWFjcGkuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLWFjcGkuYwppbmRleCBhZjUxNDYxLi41OGVjZTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1hY3BpLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW9saWItYWNwaS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KQEAgLTM5NSw3ICszOTYsNyBAQAogCWludCBuOwogfTsKIAotc3RhdGljIGludCBhY3BpX2ZpbmRfZ3BpbyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqYXJlcywgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgYWNwaV9wb3B1bGF0ZV9ncGlvX2xvb2t1cChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqYXJlcywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYWNwaV9ncGlvX2xvb2t1cCAqbG9va3VwID0gZGF0YTsKIApAQCAtNDQwLDcgKzQ0MSw4IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmcmVzX2xpc3QpOwogCi0JcmV0ID0gYWNwaV9kZXZfZ2V0X3Jlc291cmNlcyhsb29rdXAtPmFkZXYsICZyZXNfbGlzdCwgYWNwaV9maW5kX2dwaW8sCisJcmV0ID0gYWNwaV9kZXZfZ2V0X3Jlc291cmNlcyhsb29rdXAtPmFkZXYsICZyZXNfbGlzdCwKKwkJCQkgICAgIGFjcGlfcG9wdWxhdGVfZ3Bpb19sb29rdXAsCiAJCQkJICAgICBsb29rdXApOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNTEzLDcgKzUxNSw3IEBACiAgKiBOb3RlOiBpZiB0aGUgR1BJTyByZXNvdXJjZSBoYXMgbXVsdGlwbGUgZW50cmllcyBpbiB0aGUgcGluIGxpc3QsIHRoaXMKICAqIGZ1bmN0aW9uIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QuCiAgKi8KLXN0cnVjdCBncGlvX2Rlc2MgKmFjcGlfZ2V0X2dwaW9kX2J5X2luZGV4KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldiwKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19kZXNjICphY3BpX2dldF9ncGlvZF9ieV9pbmRleChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCiAJCQkJCSAgY29uc3QgY2hhciAqcHJvcG5hbWUsIGludCBpbmRleCwKIAkJCQkJICBzdHJ1Y3QgYWNwaV9ncGlvX2luZm8gKmluZm8pCiB7CkBAIC01NDYsNiArNTQ4LDU1IEBACiAJcmV0dXJuIHJldCA/IEVSUl9QVFIocmV0KSA6IGxvb2t1cC5kZXNjOwogfQogCitzdHJ1Y3QgZ3Bpb19kZXNjICphY3BpX2ZpbmRfZ3BpbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIGNvbnN0IGNoYXIgKmNvbl9pZCwKKwkJCQkgdW5zaWduZWQgaW50IGlkeCwKKwkJCQkgZW51bSBncGlvZF9mbGFncyBmbGFncywKKwkJCQkgZW51bSBncGlvX2xvb2t1cF9mbGFncyAqbG9va3VwZmxhZ3MpCit7CisJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gQUNQSV9DT01QQU5JT04oZGV2KTsKKwlzdHJ1Y3QgYWNwaV9ncGlvX2luZm8gaW5mbzsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpkZXNjOworCWNoYXIgcHJvcG5hbWVbMzJdOworCWludCBpOworCisJLyogVHJ5IGZpcnN0IGZyb20gX0RTRCAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdwaW9fc3VmZml4ZXMpOyBpKyspIHsKKwkJaWYgKGNvbl9pZCAmJiBzdHJjbXAoY29uX2lkLCAiZ3Bpb3MiKSkgeworCQkJc25wcmludGYocHJvcG5hbWUsIHNpemVvZihwcm9wbmFtZSksICIlcy0lcyIsCisJCQkJIGNvbl9pZCwgZ3Bpb19zdWZmaXhlc1tpXSk7CisJCX0gZWxzZSB7CisJCQlzbnByaW50Zihwcm9wbmFtZSwgc2l6ZW9mKHByb3BuYW1lKSwgIiVzIiwKKwkJCQkgZ3Bpb19zdWZmaXhlc1tpXSk7CisJCX0KKworCQlkZXNjID0gYWNwaV9nZXRfZ3Bpb2RfYnlfaW5kZXgoYWRldiwgcHJvcG5hbWUsIGlkeCwgJmluZm8pOworCQlpZiAoIUlTX0VSUihkZXNjKSB8fCAoUFRSX0VSUihkZXNjKSA9PSAtRVBST0JFX0RFRkVSKSkKKwkJCWJyZWFrOworCX0KKworCS8qIFRoZW4gZnJvbSBwbGFpbiBfQ1JTIEdQSU9zICovCisJaWYgKElTX0VSUihkZXNjKSkgeworCQlpZiAoIWFjcGlfY2FuX2ZhbGxiYWNrX3RvX2NycyhhZGV2LCBjb25faWQpKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisKKwkJZGVzYyA9IGFjcGlfZ2V0X2dwaW9kX2J5X2luZGV4KGFkZXYsIE5VTEwsIGlkeCwgJmluZm8pOworCQlpZiAoSVNfRVJSKGRlc2MpKQorCQkJcmV0dXJuIGRlc2M7CisKKwkJaWYgKChmbGFncyA9PSBHUElPRF9PVVRfTE9XIHx8IGZsYWdzID09IEdQSU9EX09VVF9ISUdIKSAmJgorCQkgICAgaW5mby5ncGlvaW50KSB7CisJCQlkZXZfZGJnKGRldiwgInJlZnVzaW5nIEdwaW9JbnQoKSBlbnRyeSB3aGVuIGRvaW5nIEdQSU9EX09VVF8qIGxvb2t1cFxuIik7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwkJfQorCX0KKworCWlmIChpbmZvLnBvbGFyaXR5ID09IEdQSU9fQUNUSVZFX0xPVykKKwkJKmxvb2t1cGZsYWdzIHw9IEdQSU9fQUNUSVZFX0xPVzsKKworCXJldHVybiBkZXNjOworfQorCiAvKioKICAqIGFjcGlfbm9kZV9nZXRfZ3Bpb2QoKSAtIGdldCBhIEdQSU8gZGVzY3JpcHRvciBmcm9tIEFDUEkgcmVzb3VyY2VzCiAgKiBAZndub2RlOiBwb2ludGVyIHRvIGFuIEFDUEkgZmlybXdhcmUgbm9kZSB0byBnZXQgdGhlIEdQSU8gaW5mb3JtYXRpb24gZnJvbQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW9saWItb2YuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLW9mLmMKaW5kZXggNzVlN2IzOS4uZWNhZDNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW9saWItb2YuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1vZi5jCkBAIC0xNiw3ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CkBAIC0xMTQsNiArMTEzLDQ1IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9mX2dldF9uYW1lZF9ncGlvX2ZsYWdzKTsKIAorc3RydWN0IGdwaW9fZGVzYyAqb2ZfZmluZF9ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqY29uX2lkLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBpZHgsCisJCQkgICAgICAgZW51bSBncGlvX2xvb2t1cF9mbGFncyAqZmxhZ3MpCit7CisJY2hhciBwcm9wX25hbWVbMzJdOyAvKiAzMiBpcyBtYXggc2l6ZSBvZiBwcm9wZXJ0eSBuYW1lICovCisJZW51bSBvZl9ncGlvX2ZsYWdzIG9mX2ZsYWdzOworCXN0cnVjdCBncGlvX2Rlc2MgKmRlc2M7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShncGlvX3N1ZmZpeGVzKTsgaSsrKSB7CisJCWlmIChjb25faWQpCisJCQlzbnByaW50Zihwcm9wX25hbWUsIHNpemVvZihwcm9wX25hbWUpLCAiJXMtJXMiLCBjb25faWQsCisJCQkJIGdwaW9fc3VmZml4ZXNbaV0pOworCQllbHNlCisJCQlzbnByaW50Zihwcm9wX25hbWUsIHNpemVvZihwcm9wX25hbWUpLCAiJXMiLAorCQkJCSBncGlvX3N1ZmZpeGVzW2ldKTsKKworCQlkZXNjID0gb2ZfZ2V0X25hbWVkX2dwaW9kX2ZsYWdzKGRldi0+b2Zfbm9kZSwgcHJvcF9uYW1lLCBpZHgsCisJCQkJCQkmb2ZfZmxhZ3MpOworCQlpZiAoIUlTX0VSUihkZXNjKSB8fCAoUFRSX0VSUihkZXNjKSAhPSAtRU5PRU5UKSkKKwkJCWJyZWFrOworCX0KKworCWlmIChJU19FUlIoZGVzYykpCisJCXJldHVybiBkZXNjOworCisJaWYgKG9mX2ZsYWdzICYgT0ZfR1BJT19BQ1RJVkVfTE9XKQorCQkqZmxhZ3MgfD0gR1BJT19BQ1RJVkVfTE9XOworCisJaWYgKG9mX2ZsYWdzICYgT0ZfR1BJT19TSU5HTEVfRU5ERUQpIHsKKwkJaWYgKG9mX2ZsYWdzICYgT0ZfR1BJT19BQ1RJVkVfTE9XKQorCQkJKmZsYWdzIHw9IEdQSU9fT1BFTl9EUkFJTjsKKwkJZWxzZQorCQkJKmZsYWdzIHw9IEdQSU9fT1BFTl9TT1VSQ0U7CisJfQorCisJcmV0dXJuIGRlc2M7Cit9CisKIC8qKgogICogb2ZfcGFyc2Vfb3duX2dwaW8oKSAtIEdldCBhIEdQSU8gaG9nIGRlc2NyaXB0b3IsIG5hbWVzIGFuZCBmbGFncyBmb3IgR1BJTyBBUEkKICAqIEBucDoJCWRldmljZSBub2RlIHRvIGdldCBHUElPIGZyb20KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLXN5c2ZzLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1zeXNmcy5jCmluZGV4IDkzMmU1MTAuLjRiNDRkZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLXN5c2ZzLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW9saWItc3lzZnMuYwpAQCAtNjcwLDEwICs2NzAsMTAgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGdwaW9kX2V4cG9ydF9saW5rKTsKIAogLyoqCi0gKiBncGlvZF91bmV4cG9ydCAtIHJldmVyc2UgZWZmZWN0IG9mIGdwaW9fZXhwb3J0KCkKKyAqIGdwaW9kX3VuZXhwb3J0IC0gcmV2ZXJzZSBlZmZlY3Qgb2YgZ3Bpb2RfZXhwb3J0KCkKICAqIEBncGlvOiBncGlvIHRvIG1ha2UgdW5hdmFpbGFibGUKICAqCi0gKiBUaGlzIGlzIGltcGxpY2l0IG9uIGdwaW9fZnJlZSgpLgorICogVGhpcyBpcyBpbXBsaWNpdCBvbiBncGlvZF9mcmVlKCkuCiAgKi8KIHZvaWQgZ3Bpb2RfdW5leHBvcnQoc3RydWN0IGdwaW9fZGVzYyAqZGVzYykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5jCmluZGV4IDUzZmYyNWEuLmYwZmMzYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuYwpAQCAtNzEsNiArNzEsOCBAQAogCiBzdGF0aWMgdm9pZCBncGlvY2hpcF9mcmVlX2hvZ3Moc3RydWN0IGdwaW9fY2hpcCAqY2hpcCk7CiBzdGF0aWMgdm9pZCBncGlvY2hpcF9pcnFjaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcCk7CitzdGF0aWMgaW50IGdwaW9jaGlwX2lycWNoaXBfaW5pdF92YWxpZF9tYXNrKHN0cnVjdCBncGlvX2NoaXAgKmdwaW9jaGlwKTsKK3N0YXRpYyB2b2lkIGdwaW9jaGlwX2lycWNoaXBfZnJlZV92YWxpZF9tYXNrKHN0cnVjdCBncGlvX2NoaXAgKmdwaW9jaGlwKTsKIAogc3RhdGljIGJvb2wgZ3Bpb2xpYl9pbml0aWFsaXplZDsKIApAQCAtMTE2Nyw2ICsxMTY5LDEwIEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnJfcmVtb3ZlX2Zyb21fbGlzdDsKIAorCXN0YXR1cyA9IGdwaW9jaGlwX2lycWNoaXBfaW5pdF92YWxpZF9tYXNrKGNoaXApOworCWlmIChzdGF0dXMpCisJCWdvdG8gZXJyX3JlbW92ZV9mcm9tX2xpc3Q7CisKIAlzdGF0dXMgPSBvZl9ncGlvY2hpcF9hZGQoY2hpcCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnJfcmVtb3ZlX2NoaXA7CkBAIC0xMTkyLDYgKzExOTgsNyBAQAogCWFjcGlfZ3Bpb2NoaXBfcmVtb3ZlKGNoaXApOwogCWdwaW9jaGlwX2ZyZWVfaG9ncyhjaGlwKTsKIAlvZl9ncGlvY2hpcF9yZW1vdmUoY2hpcCk7CisJZ3Bpb2NoaXBfaXJxY2hpcF9mcmVlX3ZhbGlkX21hc2soY2hpcCk7CiBlcnJfcmVtb3ZlX2Zyb21fbGlzdDoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CiAJbGlzdF9kZWwoJmdkZXYtPmxpc3QpOwpAQCAtMTM2MywxOSArMTM3MCwxNSBAQAogCQkJCQkgICAgIHZvaWQgKmRhdGEpKQogewogCXN0cnVjdCBncGlvX2RldmljZSAqZ2RldjsKLQlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwOworCXN0cnVjdCBncGlvX2NoaXAgKmNoaXAgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShnZGV2LCAmZ3Bpb19kZXZpY2VzLCBsaXN0KQotCQlpZiAoZ2Rldi0+Y2hpcCAmJiBtYXRjaChnZGV2LT5jaGlwLCBkYXRhKSkKKwkJaWYgKGdkZXYtPmNoaXAgJiYgbWF0Y2goZ2Rldi0+Y2hpcCwgZGF0YSkpIHsKKwkJCWNoaXAgPSBnZGV2LT5jaGlwOwogCQkJYnJlYWs7Ci0KLQkvKiBObyBtYXRjaD8gKi8KLQlpZiAoJmdkZXYtPmxpc3QgPT0gJmdwaW9fZGV2aWNlcykKLQkJY2hpcCA9IE5VTEw7Ci0JZWxzZQotCQljaGlwID0gZ2Rldi0+Y2hpcDsKKwkJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19sb2NrLCBmbGFncyk7CiAKQEAgLTE0MDEsNiArMTQwNCw0MCBAQAogICogVGhlIGZvbGxvd2luZyBpcyBpcnFjaGlwIGhlbHBlciBjb2RlIGZvciBncGlvY2hpcHMuCiAgKi8KIAorc3RhdGljIGludCBncGlvY2hpcF9pcnFjaGlwX2luaXRfdmFsaWRfbWFzayhzdHJ1Y3QgZ3Bpb19jaGlwICpncGlvY2hpcCkKK3sKKwlpbnQgaTsKKworCWlmICghZ3Bpb2NoaXAtPmlycV9uZWVkX3ZhbGlkX21hc2spCisJCXJldHVybiAwOworCisJZ3Bpb2NoaXAtPmlycV92YWxpZF9tYXNrID0ga2NhbGxvYyhCSVRTX1RPX0xPTkdTKGdwaW9jaGlwLT5uZ3BpbyksCisJCQkJCSAgIHNpemVvZihsb25nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFncGlvY2hpcC0+aXJxX3ZhbGlkX21hc2spCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQXNzdW1lIGJ5IGRlZmF1bHQgYWxsIEdQSU9zIGFyZSB2YWxpZCAqLworCWZvciAoaSA9IDA7IGkgPCBncGlvY2hpcC0+bmdwaW87IGkrKykKKwkJc2V0X2JpdChpLCBncGlvY2hpcC0+aXJxX3ZhbGlkX21hc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9jaGlwX2lycWNoaXBfZnJlZV92YWxpZF9tYXNrKHN0cnVjdCBncGlvX2NoaXAgKmdwaW9jaGlwKQoreworCWtmcmVlKGdwaW9jaGlwLT5pcnFfdmFsaWRfbWFzayk7CisJZ3Bpb2NoaXAtPmlycV92YWxpZF9tYXNrID0gTlVMTDsKK30KKworc3RhdGljIGJvb2wgZ3Bpb2NoaXBfaXJxY2hpcF9pcnFfdmFsaWQoY29uc3Qgc3RydWN0IGdwaW9fY2hpcCAqZ3Bpb2NoaXAsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJLyogTm8gbWFzayBtZWFucyBhbGwgdmFsaWQgKi8KKwlpZiAobGlrZWx5KCFncGlvY2hpcC0+aXJxX3ZhbGlkX21hc2spKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gdGVzdF9iaXQob2Zmc2V0LCBncGlvY2hpcC0+aXJxX3ZhbGlkX21hc2spOworfQorCiAvKioKICAqIGdwaW9jaGlwX3NldF9jaGFpbmVkX2lycWNoaXAoKSAtIHNldHMgYSBjaGFpbmVkIGlycWNoaXAgdG8gYSBncGlvY2hpcAogICogQGdwaW9jaGlwOiB0aGUgZ3Bpb2NoaXAgdG8gc2V0IHRoZSBpcnFjaGlwIGNoYWluIHRvCkBAIC0xNDQyLDkgKzE0NzksMTIgQEAKIAl9CiAKIAkvKiBTZXQgdGhlIHBhcmVudCBJUlEgZm9yIGFsbCBhZmZlY3RlZCBJUlFzICovCi0JZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBncGlvY2hpcC0+bmdwaW87IG9mZnNldCsrKQorCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZ3Bpb2NoaXAtPm5ncGlvOyBvZmZzZXQrKykgeworCQlpZiAoIWdwaW9jaGlwX2lycWNoaXBfaXJxX3ZhbGlkKGdwaW9jaGlwLCBvZmZzZXQpKQorCQkJY29udGludWU7CiAJCWlycV9zZXRfcGFyZW50KGlycV9maW5kX21hcHBpbmcoZ3Bpb2NoaXAtPmlycWRvbWFpbiwgb2Zmc2V0KSwKIAkJCSAgICAgICBwYXJlbnRfaXJxKTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChncGlvY2hpcF9zZXRfY2hhaW5lZF9pcnFjaGlwKTsKIApAQCAtMTU1MSw5ICsxNTkxLDEyIEBACiAKIAkvKiBSZW1vdmUgYWxsIElSUSBtYXBwaW5ncyBhbmQgZGVsZXRlIHRoZSBkb21haW4gKi8KIAlpZiAoZ3Bpb2NoaXAtPmlycWRvbWFpbikgewotCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IGdwaW9jaGlwLT5uZ3Bpbzsgb2Zmc2V0KyspCisJCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZ3Bpb2NoaXAtPm5ncGlvOyBvZmZzZXQrKykgeworCQkJaWYgKCFncGlvY2hpcF9pcnFjaGlwX2lycV92YWxpZChncGlvY2hpcCwgb2Zmc2V0KSkKKwkJCQljb250aW51ZTsKIAkJCWlycV9kaXNwb3NlX21hcHBpbmcoCiAJCQkJaXJxX2ZpbmRfbWFwcGluZyhncGlvY2hpcC0+aXJxZG9tYWluLCBvZmZzZXQpKTsKKwkJfQogCQlpcnFfZG9tYWluX3JlbW92ZShncGlvY2hpcC0+aXJxZG9tYWluKTsKIAl9CiAKQEAgLTE1NjIsNiArMTYwNSw4IEBACiAJCWdwaW9jaGlwLT5pcnFjaGlwLT5pcnFfcmVsZWFzZV9yZXNvdXJjZXMgPSBOVUxMOwogCQlncGlvY2hpcC0+aXJxY2hpcCA9IE5VTEw7CiAJfQorCisJZ3Bpb2NoaXBfaXJxY2hpcF9mcmVlX3ZhbGlkX21hc2soZ3Bpb2NoaXApOwogfQogCiAvKioKQEAgLTE1OTcsNiArMTY0Miw3IEBACiAJCQkgIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqbG9ja19rZXkpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOworCWJvb2wgaXJxX2Jhc2Vfc2V0ID0gZmFsc2U7CiAJdW5zaWduZWQgaW50IG9mZnNldDsKIAl1bnNpZ25lZCBpcnFfYmFzZSA9IDA7CiAKQEAgLTE2MTcsNiArMTY2MywyMCBAQAogCWlmIChncGlvY2hpcC0+b2Zfbm9kZSkKIAkJb2Zfbm9kZSA9IGdwaW9jaGlwLT5vZl9ub2RlOwogI2VuZGlmCisJLyoKKwkgKiBTcGVjaWZ5aW5nIGEgZGVmYXVsdCB0cmlnZ2VyIGlzIGEgdGVycmlibGUgaWRlYSBpZiBEVCBvciBBQ1BJIGlzCisJICogdXNlZCB0byBjb25maWd1cmUgdGhlIGludGVycnVwdHMsIGFzIHlvdSBtYXkgZW5kLXVwIHdpdGgKKwkgKiBjb25mbGljdGluZyB0cmlnZ2Vycy4gVGVsbCB0aGUgdXNlciwgYW5kIHJlc2V0IHRvIE5PTkUuCisJICovCisJaWYgKFdBUk4ob2Zfbm9kZSAmJiB0eXBlICE9IElSUV9UWVBFX05PTkUsCisJCSAiJXM6IElnbm9yaW5nICVkIGRlZmF1bHQgdHJpZ2dlclxuIiwgb2Zfbm9kZS0+ZnVsbF9uYW1lLCB0eXBlKSkKKwkJdHlwZSA9IElSUV9UWVBFX05PTkU7CisJaWYgKGhhc19hY3BpX2NvbXBhbmlvbihncGlvY2hpcC0+cGFyZW50KSAmJiB0eXBlICE9IElSUV9UWVBFX05PTkUpIHsKKwkJYWNwaV9oYW5kbGVfd2FybihBQ1BJX0hBTkRMRShncGlvY2hpcC0+cGFyZW50KSwKKwkJCQkgIklnbm9yaW5nICVkIGRlZmF1bHQgdHJpZ2dlclxuIiwgdHlwZSk7CisJCXR5cGUgPSBJUlFfVFlQRV9OT05FOworCX0KKwogCWdwaW9jaGlwLT5pcnFjaGlwID0gaXJxY2hpcDsKIAlncGlvY2hpcC0+aXJxX2hhbmRsZXIgPSBoYW5kbGVyOwogCWdwaW9jaGlwLT5pcnFfZGVmYXVsdF90eXBlID0gdHlwZTsKQEAgLTE2NDYsMTMgKzE3MDYsMTcgQEAKIAkgKiBuZWNlc3NhcnkgdG8gYWxsb2NhdGUgZGVzY3JpcHRvcnMgZm9yIGFsbCBJUlFzLgogCSAqLwogCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZ3Bpb2NoaXAtPm5ncGlvOyBvZmZzZXQrKykgeworCQlpZiAoIWdwaW9jaGlwX2lycWNoaXBfaXJxX3ZhbGlkKGdwaW9jaGlwLCBvZmZzZXQpKQorCQkJY29udGludWU7CiAJCWlycV9iYXNlID0gaXJxX2NyZWF0ZV9tYXBwaW5nKGdwaW9jaGlwLT5pcnFkb21haW4sIG9mZnNldCk7Ci0JCWlmIChvZmZzZXQgPT0gMCkKKwkJaWYgKCFpcnFfYmFzZV9zZXQpIHsKIAkJCS8qCiAJCQkgKiBTdG9yZSB0aGUgYmFzZSBpbnRvIHRoZSBncGlvY2hpcCB0byBiZSB1c2VkIHdoZW4KIAkJCSAqIHVubWFwcGluZyB0aGUgaXJxcy4KIAkJCSAqLwogCQkJZ3Bpb2NoaXAtPmlycV9iYXNlID0gaXJxX2Jhc2U7CisJCQlpcnFfYmFzZV9zZXQgPSB0cnVlOworCQl9CiAJfQogCiAJYWNwaV9ncGlvY2hpcF9yZXF1ZXN0X2ludGVycnVwdHMoZ3Bpb2NoaXApOwpAQCAtMTY2NCw2ICsxNzI4LDEyIEBACiAjZWxzZSAvKiBDT05GSUdfR1BJT0xJQl9JUlFDSElQICovCiAKIHN0YXRpYyB2b2lkIGdwaW9jaGlwX2lycWNoaXBfcmVtb3ZlKHN0cnVjdCBncGlvX2NoaXAgKmdwaW9jaGlwKSB7fQorc3RhdGljIGlubGluZSBpbnQgZ3Bpb2NoaXBfaXJxY2hpcF9pbml0X3ZhbGlkX21hc2soc3RydWN0IGdwaW9fY2hpcCAqZ3Bpb2NoaXApCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZ3Bpb2NoaXBfaXJxY2hpcF9mcmVlX3ZhbGlkX21hc2soc3RydWN0IGdwaW9fY2hpcCAqZ3Bpb2NoaXApCit7IH0KIAogI2VuZGlmIC8qIENPTkZJR19HUElPTElCX0lSUUNISVAgKi8KIApAQCAtMjgxMyw5NCArMjg4Myw2IEBACiAJbXV0ZXhfdW5sb2NrKCZncGlvX2xvb2t1cF9sb2NrKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2Rlc2MgKm9mX2ZpbmRfZ3BpbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmNvbl9pZCwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgaWR4LAotCQkJCSAgICAgIGVudW0gZ3Bpb19sb29rdXBfZmxhZ3MgKmZsYWdzKQotewotCWNoYXIgcHJvcF9uYW1lWzMyXTsgLyogMzIgaXMgbWF4IHNpemUgb2YgcHJvcGVydHkgbmFtZSAqLwotCWVudW0gb2ZfZ3Bpb19mbGFncyBvZl9mbGFnczsKLQlzdHJ1Y3QgZ3Bpb19kZXNjICpkZXNjOwotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ3Bpb19zdWZmaXhlcyk7IGkrKykgewotCQlpZiAoY29uX2lkKQotCQkJc25wcmludGYocHJvcF9uYW1lLCBzaXplb2YocHJvcF9uYW1lKSwgIiVzLSVzIiwgY29uX2lkLAotCQkJCSBncGlvX3N1ZmZpeGVzW2ldKTsKLQkJZWxzZQotCQkJc25wcmludGYocHJvcF9uYW1lLCBzaXplb2YocHJvcF9uYW1lKSwgIiVzIiwKLQkJCQkgZ3Bpb19zdWZmaXhlc1tpXSk7Ci0KLQkJZGVzYyA9IG9mX2dldF9uYW1lZF9ncGlvZF9mbGFncyhkZXYtPm9mX25vZGUsIHByb3BfbmFtZSwgaWR4LAotCQkJCQkJJm9mX2ZsYWdzKTsKLQkJaWYgKCFJU19FUlIoZGVzYykgfHwgKFBUUl9FUlIoZGVzYykgIT0gLUVOT0VOVCkpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoSVNfRVJSKGRlc2MpKQotCQlyZXR1cm4gZGVzYzsKLQotCWlmIChvZl9mbGFncyAmIE9GX0dQSU9fQUNUSVZFX0xPVykKLQkJKmZsYWdzIHw9IEdQSU9fQUNUSVZFX0xPVzsKLQotCWlmIChvZl9mbGFncyAmIE9GX0dQSU9fU0lOR0xFX0VOREVEKSB7Ci0JCWlmIChvZl9mbGFncyAmIE9GX0dQSU9fQUNUSVZFX0xPVykKLQkJCSpmbGFncyB8PSBHUElPX09QRU5fRFJBSU47Ci0JCWVsc2UKLQkJCSpmbGFncyB8PSBHUElPX09QRU5fU09VUkNFOwotCX0KLQotCXJldHVybiBkZXNjOwotfQotCi1zdGF0aWMgc3RydWN0IGdwaW9fZGVzYyAqYWNwaV9maW5kX2dwaW8oc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQljb25zdCBjaGFyICpjb25faWQsCi0JCQkJCXVuc2lnbmVkIGludCBpZHgsCi0JCQkJCWVudW0gZ3Bpb2RfZmxhZ3MgZmxhZ3MsCi0JCQkJCWVudW0gZ3Bpb19sb29rdXBfZmxhZ3MgKmxvb2t1cGZsYWdzKQotewotCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IEFDUElfQ09NUEFOSU9OKGRldik7Ci0Jc3RydWN0IGFjcGlfZ3Bpb19pbmZvIGluZm87Ci0Jc3RydWN0IGdwaW9fZGVzYyAqZGVzYzsKLQljaGFyIHByb3BuYW1lWzMyXTsKLQlpbnQgaTsKLQotCS8qIFRyeSBmaXJzdCBmcm9tIF9EU0QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShncGlvX3N1ZmZpeGVzKTsgaSsrKSB7Ci0JCWlmIChjb25faWQgJiYgc3RyY21wKGNvbl9pZCwgImdwaW9zIikpIHsKLQkJCXNucHJpbnRmKHByb3BuYW1lLCBzaXplb2YocHJvcG5hbWUpLCAiJXMtJXMiLAotCQkJCSBjb25faWQsIGdwaW9fc3VmZml4ZXNbaV0pOwotCQl9IGVsc2UgewotCQkJc25wcmludGYocHJvcG5hbWUsIHNpemVvZihwcm9wbmFtZSksICIlcyIsCi0JCQkJIGdwaW9fc3VmZml4ZXNbaV0pOwotCQl9Ci0KLQkJZGVzYyA9IGFjcGlfZ2V0X2dwaW9kX2J5X2luZGV4KGFkZXYsIHByb3BuYW1lLCBpZHgsICZpbmZvKTsKLQkJaWYgKCFJU19FUlIoZGVzYykgfHwgKFBUUl9FUlIoZGVzYykgPT0gLUVQUk9CRV9ERUZFUikpCi0JCQlicmVhazsKLQl9Ci0KLQkvKiBUaGVuIGZyb20gcGxhaW4gX0NSUyBHUElPcyAqLwotCWlmIChJU19FUlIoZGVzYykpIHsKLQkJaWYgKCFhY3BpX2Nhbl9mYWxsYmFja190b19jcnMoYWRldiwgY29uX2lkKSkKLQkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwotCi0JCWRlc2MgPSBhY3BpX2dldF9ncGlvZF9ieV9pbmRleChhZGV2LCBOVUxMLCBpZHgsICZpbmZvKTsKLQkJaWYgKElTX0VSUihkZXNjKSkKLQkJCXJldHVybiBkZXNjOwotCi0JCWlmICgoZmxhZ3MgPT0gR1BJT0RfT1VUX0xPVyB8fCBmbGFncyA9PSBHUElPRF9PVVRfSElHSCkgJiYKLQkJICAgIGluZm8uZ3Bpb2ludCkgewotCQkJZGV2X2RiZyhkZXYsICJyZWZ1c2luZyBHcGlvSW50KCkgZW50cnkgd2hlbiBkb2luZyBHUElPRF9PVVRfKiBsb29rdXBcbiIpOwotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Ci0JCX0KLQl9Ci0KLQlpZiAoaW5mby5wb2xhcml0eSA9PSBHUElPX0FDVElWRV9MT1cpCi0JCSpsb29rdXBmbGFncyB8PSBHUElPX0FDVElWRV9MT1c7Ci0KLQlyZXR1cm4gZGVzYzsKLX0KLQogc3RhdGljIHN0cnVjdCBncGlvZF9sb29rdXBfdGFibGUgKmdwaW9kX2ZpbmRfbG9va3VwX3RhYmxlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAljb25zdCBjaGFyICpkZXZfaWQgPSBkZXYgPyBkZXZfbmFtZShkZXYpIDogTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmggYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5oCmluZGV4IDJkOWVhNWUuLjM0NmZiZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmgKKysrIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuaApAQCAtMjAsNiArMjAsNyBAQAogCiBlbnVtIG9mX2dwaW9fZmxhZ3M7CiBlbnVtIGdwaW9kX2ZsYWdzOworZW51bSBncGlvX2xvb2t1cF9mbGFnczsKIHN0cnVjdCBhY3BpX2RldmljZTsKIAogLyoqCkBAIC04Niw2ICs4NywzMiBAQAogLyogZ3BpbyBzdWZmaXhlcyB1c2VkIGZvciBBQ1BJIGFuZCBkZXZpY2UgdHJlZSBsb29rdXAgKi8KIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ3Bpb19zdWZmaXhlc1tdID0geyAiZ3Bpb3MiLCAiZ3BpbyIgfTsKIAorI2lmZGVmIENPTkZJR19PRl9HUElPCitzdHJ1Y3QgZ3Bpb19kZXNjICpvZl9maW5kX2dwaW8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmNvbl9pZCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaWR4LAorCQkJICAgICAgIGVudW0gZ3Bpb19sb29rdXBfZmxhZ3MgKmZsYWdzKTsKK3N0cnVjdCBncGlvX2Rlc2MgKm9mX2dldF9uYW1lZF9ncGlvZF9mbGFncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkgICBjb25zdCBjaGFyICpsaXN0X25hbWUsIGludCBpbmRleCwgZW51bSBvZl9ncGlvX2ZsYWdzICpmbGFncyk7CitpbnQgb2ZfZ3Bpb2NoaXBfYWRkKHN0cnVjdCBncGlvX2NoaXAgKmdjKTsKK3ZvaWQgb2ZfZ3Bpb2NoaXBfcmVtb3ZlKHN0cnVjdCBncGlvX2NoaXAgKmdjKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBncGlvX2Rlc2MgKm9mX2ZpbmRfZ3BpbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgY29uc3QgY2hhciAqY29uX2lkLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBpZHgsCisJCQkJCSAgICAgZW51bSBncGlvX2xvb2t1cF9mbGFncyAqZmxhZ3MpCit7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Cit9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBncGlvX2Rlc2MgKm9mX2dldF9uYW1lZF9ncGlvZF9mbGFncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkgICBjb25zdCBjaGFyICpsaXN0X25hbWUsIGludCBpbmRleCwgZW51bSBvZl9ncGlvX2ZsYWdzICpmbGFncykKK3sKKwlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG9mX2dwaW9jaGlwX2FkZChzdHJ1Y3QgZ3Bpb19jaGlwICpnYykgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIG9mX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYykgeyB9CisjZW5kaWYgLyogQ09ORklHX09GX0dQSU8gKi8KKwogI2lmZGVmIENPTkZJR19BQ1BJCiB2b2lkIGFjcGlfZ3Bpb2NoaXBfYWRkKHN0cnVjdCBncGlvX2NoaXAgKmNoaXApOwogdm9pZCBhY3BpX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKTsKQEAgLTkzLDkgKzEyMCwxMSBAQAogdm9pZCBhY3BpX2dwaW9jaGlwX3JlcXVlc3RfaW50ZXJydXB0cyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKTsKIHZvaWQgYWNwaV9ncGlvY2hpcF9mcmVlX2ludGVycnVwdHMoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCk7CiAKLXN0cnVjdCBncGlvX2Rlc2MgKmFjcGlfZ2V0X2dwaW9kX2J5X2luZGV4KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldiwKLQkJCQkJICBjb25zdCBjaGFyICpwcm9wbmFtZSwgaW50IGluZGV4LAotCQkJCQkgIHN0cnVjdCBhY3BpX2dwaW9faW5mbyAqaW5mbyk7CitzdHJ1Y3QgZ3Bpb19kZXNjICphY3BpX2ZpbmRfZ3BpbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIGNvbnN0IGNoYXIgKmNvbl9pZCwKKwkJCQkgdW5zaWduZWQgaW50IGlkeCwKKwkJCQkgZW51bSBncGlvZF9mbGFncyBmbGFncywKKwkJCQkgZW51bSBncGlvX2xvb2t1cF9mbGFncyAqbG9va3VwZmxhZ3MpOwogc3RydWN0IGdwaW9fZGVzYyAqYWNwaV9ub2RlX2dldF9ncGlvZChzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlLAogCQkJCSAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLCBpbnQgaW5kZXgsCiAJCQkJICAgICAgc3RydWN0IGFjcGlfZ3Bpb19pbmZvICppbmZvKTsKQEAgLTExNCwxMCArMTQzLDExIEBACiBhY3BpX2dwaW9jaGlwX2ZyZWVfaW50ZXJydXB0cyhzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwKSB7IH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZ3Bpb19kZXNjICoKLWFjcGlfZ2V0X2dwaW9kX2J5X2luZGV4KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldiwgY29uc3QgY2hhciAqcHJvcG5hbWUsCi0JCQlpbnQgaW5kZXgsIHN0cnVjdCBhY3BpX2dwaW9faW5mbyAqaW5mbykKK2FjcGlfZmluZF9ncGlvKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqY29uX2lkLAorCSAgICAgICB1bnNpZ25lZCBpbnQgaWR4LCBlbnVtIGdwaW9kX2ZsYWdzIGZsYWdzLAorCSAgICAgICBlbnVtIGdwaW9fbG9va3VwX2ZsYWdzICpsb29rdXBmbGFncykKIHsKLQlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIH0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGdwaW9fZGVzYyAqCiBhY3BpX25vZGVfZ2V0X2dwaW9kKHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUsIGNvbnN0IGNoYXIgKnByb3BuYW1lLApAQCAtMTM3LDkgKzE2Nyw2IEBACiB9CiAjZW5kaWYKIAotc3RydWN0IGdwaW9fZGVzYyAqb2ZfZ2V0X25hbWVkX2dwaW9kX2ZsYWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCSAgIGNvbnN0IGNoYXIgKmxpc3RfbmFtZSwgaW50IGluZGV4LCBlbnVtIG9mX2dwaW9fZmxhZ3MgKmZsYWdzKTsKLQogc3RydWN0IGdwaW9fZGVzYyAqZ3Bpb2NoaXBfZ2V0X2Rlc2Moc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdTE2IGh3bnVtKTsKIHZvaWQgZ3Bpb2Rfc2V0X2FycmF5X3ZhbHVlX2NvbXBsZXgoYm9vbCByYXcsIGJvb2wgY2FuX3NsZWVwLAogCQkJCSAgIHVuc2lnbmVkIGludCBhcnJheV9zaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2RldmljZS5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2RldmljZS5jCmluZGV4IGRmN2FiMjQ1Li4zOWMwMWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2RldmljZS5jCkBAIC0xNzA4LDExICsxNzA4LDExIEBACiAKIAlEUk1fSU5GTygiYW1kZ3B1OiBmaW5pc2hpbmcgZGV2aWNlLlxuIik7CiAJYWRldi0+c2h1dGRvd24gPSB0cnVlOworCWRybV9jcnRjX2ZvcmNlX2Rpc2FibGVfYWxsKGFkZXYtPmRkZXYpOwogCS8qIGV2aWN0IHZyYW0gbWVtb3J5ICovCiAJYW1kZ3B1X2JvX2V2aWN0X3ZyYW0oYWRldik7CiAJYW1kZ3B1X2liX3Bvb2xfZmluaShhZGV2KTsKIAlhbWRncHVfZmVuY2VfZHJpdmVyX2ZpbmkoYWRldik7Ci0JZHJtX2NydGNfZm9yY2VfZGlzYWJsZV9hbGwoYWRldi0+ZGRldik7CiAJYW1kZ3B1X2ZiZGV2X2ZpbmkoYWRldik7CiAJciA9IGFtZGdwdV9maW5pKGFkZXYpOwogCWtmcmVlKGFkZXYtPmlwX2Jsb2NrX3N0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfaWIuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9pYi5jCmluZGV4IGEzMWQ3ZWYuLmVjMTI4MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9pYi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9pYi5jCkBAIC0yODAsNyArMjgwLDcgQEAKIGludCBhbWRncHVfaWJfcmluZ190ZXN0cyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKIHsKIAl1bnNpZ25lZCBpOwotCWludCByOworCWludCByLCByZXQgPSAwOwogCiAJZm9yIChpID0gMDsgaSA8IEFNREdQVV9NQVhfUklOR1M7ICsraSkgewogCQlzdHJ1Y3QgYW1kZ3B1X3JpbmcgKnJpbmcgPSBhZGV2LT5yaW5nc1tpXTsKQEAgLTMwMSwxMCArMzAxLDExIEBACiAJCQl9IGVsc2UgewogCQkJCS8qIHN0aWxsIG5vdCBnb29kLCBidXQgd2UgY2FuIGxpdmUgd2l0aCBpdCAqLwogCQkJCURSTV9FUlJPUigiYW1kZ3B1OiBmYWlsZWQgdGVzdGluZyBJQiBvbiByaW5nICVkICglZCkuXG4iLCBpLCByKTsKKwkJCQlyZXQgPSByOwogCQkJfQogCQl9CiAJfQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaWtfc2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvY2lrX3NkbWEuYwppbmRleCBlZTY0NjY5Li43N2ZkZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaWtfc2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2Npa19zZG1hLmMKQEAgLTUyLDYgKzUyLDcgQEAKIHN0YXRpYyB2b2lkIGNpa19zZG1hX3NldF9pcnFfZnVuY3Moc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpOwogc3RhdGljIHZvaWQgY2lrX3NkbWFfc2V0X2J1ZmZlcl9mdW5jcyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldik7CiBzdGF0aWMgdm9pZCBjaWtfc2RtYV9zZXRfdm1fcHRlX2Z1bmNzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKK3N0YXRpYyBpbnQgY2lrX3NkbWFfc29mdF9yZXNldCh2b2lkICpoYW5kbGUpOwogCiBNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9ib25haXJlX3NkbWEuYmluIik7CiBNT0RVTEVfRklSTVdBUkUoInJhZGVvbi9ib25haXJlX3NkbWExLmJpbiIpOwpAQCAtMTAzNyw2ICsxMDM4LDggQEAKIHsKIAlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsKIAorCWNpa19zZG1hX3NvZnRfcmVzZXQoaGFuZGxlKTsKKwogCXJldHVybiBjaWtfc2RtYV9od19pbml0KGFkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9nZnhfdjdfMC5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvZ2Z4X3Y3XzAuYwppbmRleCBkODY5ZDA1Li40MjU0MTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9nZnhfdjdfMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dmeF92N18wLmMKQEAgLTI3NTUsOCArMjc1NSw3IEBACiAJdTY0IHdiX2dwdV9hZGRyOwogCXUzMiAqYnVmOwogCXN0cnVjdCBib25haXJlX21xZCAqbXFkOwotCi0JZ2Z4X3Y3XzBfY3BfY29tcHV0ZV9lbmFibGUoYWRldiwgdHJ1ZSk7CisJc3RydWN0IGFtZGdwdV9yaW5nICpyaW5nOwogCiAJLyogZml4IHVwIGNoaWNrZW4gYml0cyAqLwogCXRtcCA9IFJSRUczMihtbUNQX0NQRl9ERUJVRyk7CkBAIC0yNzkxLDcgKzI3OTAsNyBAQAogCiAJLyogaW5pdCB0aGUgcXVldWVzLiAgSnVzdCB0d28gZm9yIG5vdy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgYWRldi0+Z2Z4Lm51bV9jb21wdXRlX3JpbmdzOyBpKyspIHsKLQkJc3RydWN0IGFtZGdwdV9yaW5nICpyaW5nID0gJmFkZXYtPmdmeC5jb21wdXRlX3JpbmdbaV07CisJCXJpbmcgPSAmYWRldi0+Z2Z4LmNvbXB1dGVfcmluZ1tpXTsKIAogCQlpZiAocmluZy0+bXFkX29iaiA9PSBOVUxMKSB7CiAJCQlyID0gYW1kZ3B1X2JvX2NyZWF0ZShhZGV2LApAQCAtMjk3MCw2ICsyOTY5LDEzIEBACiAJCWFtZGdwdV9ib191bnJlc2VydmUocmluZy0+bXFkX29iaik7CiAKIAkJcmluZy0+cmVhZHkgPSB0cnVlOworCX0KKworCWdmeF92N18wX2NwX2NvbXB1dGVfZW5hYmxlKGFkZXYsIHRydWUpOworCisJZm9yIChpID0gMDsgaSA8IGFkZXYtPmdmeC5udW1fY29tcHV0ZV9yaW5nczsgaSsrKSB7CisJCXJpbmcgPSAmYWRldi0+Z2Z4LmNvbXB1dGVfcmluZ1tpXTsKKwogCQlyID0gYW1kZ3B1X3JpbmdfdGVzdF9yaW5nKHJpbmcpOwogCQlpZiAocikKIAkJCXJpbmctPnJlYWR5ID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX2NydGMuYwppbmRleCBhOTc4MzgxLi45YjE3YTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hdG1lbC1obGNkYy9hdG1lbF9obGNkY19jcnRjLmMKQEAgLTM4Nyw3ICszODcsNyBAQAogCWF0bWVsX2hsY2RjX2NydGNfZmluaXNoX3BhZ2VfZmxpcChkcm1fY3J0Y190b19hdG1lbF9obGNkY19jcnRjKGMpKTsKIH0KIAotdm9pZCBhdG1lbF9obGNkY19jcnRjX3Jlc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3N0YXRpYyB2b2lkIGF0bWVsX2hsY2RjX2NydGNfcmVzZXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQogewogCXN0cnVjdCBhdG1lbF9obGNkY19jcnRjX3N0YXRlICpzdGF0ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX3BsYW5lLmMgYi9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfcGxhbmUuYwppbmRleCAwMTZjMTkxLi41MmM1MjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfcGxhbmUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYXRtZWwtaGxjZGMvYXRtZWxfaGxjZGNfcGxhbmUuYwpAQCAtMzIwLDE5ICszMjAsMTkgQEAKIAkJCXUzMiAqY29lZmZfdGFiID0gaGVvX3Vwc2NhbGluZ195Y29lZjsKIAkJCXUzMiBtYXhfbWVtc2l6ZTsKIAotCQkJaWYgKHN0YXRlLT5jcnRjX3cgPCBzdGF0ZS0+c3JjX3cpCisJCQlpZiAoc3RhdGUtPmNydGNfaCA8IHN0YXRlLT5zcmNfaCkKIAkJCQljb2VmZl90YWIgPSBoZW9fZG93bnNjYWxpbmdfeWNvZWY7CiAJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoZW9fdXBzY2FsaW5nX3ljb2VmKTsgaSsrKQogCQkJCWF0bWVsX2hsY2RjX2xheWVyX3VwZGF0ZV9jZmcoJnBsYW5lLT5sYXllciwKIAkJCQkJCQkgICAgIDMzICsgaSwKIAkJCQkJCQkgICAgIDB4ZmZmZmZmZmYsCiAJCQkJCQkJICAgICBjb2VmZl90YWJbaV0pOwotCQkJZmFjdG9yID0gKCg4ICogMjU2ICogc3RhdGUtPnNyY193KSAtICgyNTYgKiA0KSkgLwotCQkJCSBzdGF0ZS0+Y3J0Y193OworCQkJZmFjdG9yID0gKCg4ICogMjU2ICogc3RhdGUtPnNyY19oKSAtICgyNTYgKiA0KSkgLworCQkJCSBzdGF0ZS0+Y3J0Y19oOwogCQkJZmFjdG9yKys7Ci0JCQltYXhfbWVtc2l6ZSA9ICgoZmFjdG9yICogc3RhdGUtPmNydGNfdykgKyAoMjU2ICogNCkpIC8KKwkJCW1heF9tZW1zaXplID0gKChmYWN0b3IgKiBzdGF0ZS0+Y3J0Y19oKSArICgyNTYgKiA0KSkgLwogCQkJCSAgICAgIDIwNDg7Ci0JCQlpZiAobWF4X21lbXNpemUgPiBzdGF0ZS0+c3JjX3cpCisJCQlpZiAobWF4X21lbXNpemUgPiBzdGF0ZS0+c3JjX2gpCiAJCQkJZmFjdG9yLS07CiAJCQlmYWN0b3JfcmVnIHw9IChmYWN0b3IgPDwgMTYpIHwgMHg4MDAwMDAwMDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9oZWxwZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfaGVscGVyLmMKaW5kZXggZWFlNWVmOS4uMmJkMDY0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX2hlbHBlci5jCkBAIC03OTAsNiArNzkwLDEyIEBACiAJbXV0ZXhfdW5sb2NrKCZpMmNfdG9fYXV4KGkyYyktPmh3X211dGV4KTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfbG9ja19vcGVyYXRpb25zIGRybV9kcF9pMmNfbG9ja19vcHMgPSB7CisJLmxvY2tfYnVzID0gbG9ja19idXMsCisJLnRyeWxvY2tfYnVzID0gdHJ5bG9ja19idXMsCisJLnVubG9ja19idXMgPSB1bmxvY2tfYnVzLAorfTsKKwogLyoqCiAgKiBkcm1fZHBfYXV4X2luaXQoKSAtIG1pbmltYWxseSBpbml0aWFsaXNlIGFuIGF1eCBjaGFubmVsCiAgKiBAYXV4OiBEaXNwbGF5UG9ydCBBVVggY2hhbm5lbApAQCAtODA3LDkgKzgxMyw3IEBACiAJYXV4LT5kZGMuYWxnb19kYXRhID0gYXV4OwogCWF1eC0+ZGRjLnJldHJpZXMgPSAzOwogCi0JYXV4LT5kZGMubG9ja19idXMgPSBsb2NrX2J1czsKLQlhdXgtPmRkYy50cnlsb2NrX2J1cyA9IHRyeWxvY2tfYnVzOwotCWF1eC0+ZGRjLnVubG9ja19idXMgPSB1bmxvY2tfYnVzOworCWF1eC0+ZGRjLmxvY2tfb3BzID0gJmRybV9kcF9pMmNfbG9ja19vcHM7CiB9CiBFWFBPUlRfU1lNQk9MKGRybV9kcF9hdXhfaW5pdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jMzIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faW9jMzIuYwppbmRleCA1NzY3NmY4Li5hNjI4OTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2lvYzMyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9pb2MzMi5jCkBAIC0xMDE1LDYgKzEwMTUsNyBAQAogCXJldHVybiAwOwogfQogCisjaWYgZGVmaW5lZChDT05GSUdfWDg2KSB8fCBkZWZpbmVkKENPTkZJR19JQTY0KQogdHlwZWRlZiBzdHJ1Y3QgZHJtX21vZGVfZmJfY21kMjMyIHsKIAl1MzIgZmJfaWQ7CiAJdTMyIHdpZHRoOwpAQCAtMTA3MSw2ICsxMDcyLDcgQEAKIAogCXJldHVybiAwOwogfQorI2VuZGlmCiAKIHN0YXRpYyBkcm1faW9jdGxfY29tcGF0X3QgKmRybV9jb21wYXRfaW9jdGxzW10gPSB7CiAJW0RSTV9JT0NUTF9OUihEUk1fSU9DVExfVkVSU0lPTjMyKV0gPSBjb21wYXRfZHJtX3ZlcnNpb24sCkBAIC0xMTA0LDcgKzExMDYsOSBAQAogCVtEUk1fSU9DVExfTlIoRFJNX0lPQ1RMX1VQREFURV9EUkFXMzIpXSA9IGNvbXBhdF9kcm1fdXBkYXRlX2RyYXcsCiAjZW5kaWYKIAlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9XQUlUX1ZCTEFOSzMyKV0gPSBjb21wYXRfZHJtX3dhaXRfdmJsYW5rLAorI2lmIGRlZmluZWQoQ09ORklHX1g4NikgfHwgZGVmaW5lZChDT05GSUdfSUE2NCkKIAlbRFJNX0lPQ1RMX05SKERSTV9JT0NUTF9NT0RFX0FEREZCMjMyKV0gPSBjb21wYXRfZHJtX21vZGVfYWRkZmIyLAorI2VuZGlmCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9mYi5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZiLmMKaW5kZXggZTAxNjY0MC4uNDBjZTg0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZiLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZiLmMKQEAgLTU1LDExICs1NSwxMSBAQAogCWZsYWdzID0gZXh5bm9zX2dlbS0+ZmxhZ3M7CiAKIAkvKgotCSAqIHdpdGhvdXQgaW9tbXUgc3VwcG9ydCwgbm90IHN1cHBvcnQgcGh5c2ljYWxseSBub24tY29udGludW91cyBtZW1vcnkKLQkgKiBmb3IgZnJhbWVidWZmZXIuCisJICogUGh5c2ljYWxseSBub24tY29udGlndW91cyBtZW1vcnkgdHlwZSBmb3IgZnJhbWVidWZmZXIgaXMgbm90CisJICogc3VwcG9ydGVkIHdpdGhvdXQgSU9NTVUuCiAJICovCiAJaWYgKElTX05PTkNPTlRJR19CVUZGRVIoZmxhZ3MpKSB7Ci0JCURSTV9FUlJPUigiY2Fubm90IHVzZSB0aGlzIGdlbSBtZW1vcnkgdHlwZSBmb3IgZmIuXG4iKTsKKwkJRFJNX0VSUk9SKCJOb24tY29udGlndW91cyBHRU0gbWVtb3J5IGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltYy5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWMuYwppbmRleCAwNTI1YzU2Li4xNDdlZjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9maW1jLmMKQEAgLTE3NTMsMzIgKzE3NTMsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IGZpbWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZpbWNfY29udGV4dCAqY3R4ID0gZ2V0X2ZpbWNfY29udGV4dChkZXYpOwotCi0JRFJNX0RFQlVHX0tNUygiaWRbJWRdXG4iLCBjdHgtPmlkKTsKLQotCWlmIChwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBmaW1jX2Nsa19jdHJsKGN0eCwgZmFsc2UpOwotfQotCi1zdGF0aWMgaW50IGZpbWNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZmltY19jb250ZXh0ICpjdHggPSBnZXRfZmltY19jb250ZXh0KGRldik7Ci0KLQlEUk1fREVCVUdfS01TKCJpZFslZF1cbiIsIGN0eC0+aWQpOwotCi0JaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKQotCQlyZXR1cm4gZmltY19jbGtfY3RybChjdHgsIHRydWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogc3RhdGljIGludCBmaW1jX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZpbWNfY29udGV4dCAqY3R4ID0gZ2V0X2ZpbWNfY29udGV4dChkZXYpOwpAQCAtMTc5OSw3ICsxNzczLDggQEAKICNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZmltY19wbV9vcHMgPSB7Ci0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoZmltY19zdXNwZW5kLCBmaW1jX3Jlc3VtZSkKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwbV9ydW50aW1lX2ZvcmNlX3N1c3BlbmQsCisJCQkJcG1fcnVudGltZV9mb3JjZV9yZXN1bWUpCiAJU0VUX1JVTlRJTUVfUE1fT1BTKGZpbWNfcnVudGltZV9zdXNwZW5kLCBmaW1jX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2cyZC5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2cyZC5jCmluZGV4IDRiZjAwZjUuLjZlY2E4YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nMmQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZzJkLmMKQEAgLTE0NzUsOCArMTQ3NSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgZzJkX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBnMmRfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgZzJkX2RhdGEgKmcyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCkBAIC0xNDkwLDI1ICsxNDkwLDYgQEAKIAogCWZsdXNoX3dvcmsoJmcyZC0+cnVucXVldWVfd29yayk7CiAKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnMmRfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZzJkX2RhdGEgKmcyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JZzJkLT5zdXNwZW5kZWQgPSBmYWxzZTsKLQlnMmRfZXhlY19ydW5xdWV1ZShnMmQpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBnMmRfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZzJkX2RhdGEgKmcyZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGcyZC0+Z2F0ZV9jbGspOwogCiAJcmV0dXJuIDA7CkBAIC0xNTIzLDEyICsxNTA0LDE2IEBACiAJaWYgKHJldCA8IDApCiAJCWRldl93YXJuKGRldiwgImZhaWxlZCB0byBlbmFibGUgY2xvY2suXG4iKTsKIAorCWcyZC0+c3VzcGVuZGVkID0gZmFsc2U7CisJZzJkX2V4ZWNfcnVucXVldWUoZzJkKTsKKwogCXJldHVybiByZXQ7CiB9CiAjZW5kaWYKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGcyZF9wbV9vcHMgPSB7Ci0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoZzJkX3N1c3BlbmQsIGcyZF9yZXN1bWUpCisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocG1fcnVudGltZV9mb3JjZV9zdXNwZW5kLAorCQkJCXBtX3J1bnRpbWVfZm9yY2VfcmVzdW1lKQogCVNFVF9SVU5USU1FX1BNX09QUyhnMmRfcnVudGltZV9zdXNwZW5kLCBnMmRfcnVudGltZV9yZXN1bWUsIE5VTEwpCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ3NjLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZ3NjLmMKaW5kZXggNWQyMGRhOC4uNTJhOWQyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2dzYy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9nc2MuYwpAQCAtMTc2MCwzNCArMTc2MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgZ3NjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBnc2NfY29udGV4dCAqY3R4ID0gZ2V0X2dzY19jb250ZXh0KGRldik7Ci0KLQlEUk1fREVCVUdfS01TKCJpZFslZF1cbiIsIGN0eC0+aWQpOwotCi0JaWYgKHBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldikpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGdzY19jbGtfY3RybChjdHgsIGZhbHNlKTsKLX0KLQotc3RhdGljIGludCBnc2NfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZ3NjX2NvbnRleHQgKmN0eCA9IGdldF9nc2NfY29udGV4dChkZXYpOwotCi0JRFJNX0RFQlVHX0tNUygiaWRbJWRdXG4iLCBjdHgtPmlkKTsKLQotCWlmICghcG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkKLQkJcmV0dXJuIGdzY19jbGtfY3RybChjdHgsIHRydWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBnc2NfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgZ3NjX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGdzY19jb250ZXh0ICpjdHggPSBnZXRfZ3NjX2NvbnRleHQoZGV2KTsKIApAQCAtMTc5Niw3ICsxNzY5LDcgQEAKIAlyZXR1cm4gIGdzY19jbGtfY3RybChjdHgsIGZhbHNlKTsKIH0KIAotc3RhdGljIGludCBnc2NfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBfX21heWJlX3VudXNlZCBnc2NfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBnc2NfY29udGV4dCAqY3R4ID0gZ2V0X2dzY19jb250ZXh0KGRldik7CiAKQEAgLTE4MDQsMTAgKzE3NzcsMTAgQEAKIAogCXJldHVybiAgZ3NjX2Nsa19jdHJsKGN0eCwgdHJ1ZSk7CiB9Ci0jZW5kaWYKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGdzY19wbV9vcHMgPSB7Ci0JU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMoZ3NjX3N1c3BlbmQsIGdzY19yZXN1bWUpCisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocG1fcnVudGltZV9mb3JjZV9zdXNwZW5kLAorCQkJCXBtX3J1bnRpbWVfZm9yY2VfcmVzdW1lKQogCVNFVF9SVU5USU1FX1BNX09QUyhnc2NfcnVudGltZV9zdXNwZW5kLCBnc2NfcnVudGltZV9yZXN1bWUsIE5VTEwpCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fcm90YXRvci5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX3JvdGF0b3IuYwppbmRleCA0MDQzNjdhLi42NTkxZTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fcm90YXRvci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9yb3RhdG9yLmMKQEAgLTc5NCwyOSArNzk0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IHJvdGF0b3Jfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHJvdF9jb250ZXh0ICpyb3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmIChwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiByb3RhdG9yX2Nsa19jcnRsKHJvdCwgZmFsc2UpOwotfQotCi1zdGF0aWMgaW50IHJvdGF0b3JfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgcm90X2NvbnRleHQgKnJvdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKQotCQlyZXR1cm4gcm90YXRvcl9jbGtfY3J0bChyb3QsIHRydWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogc3RhdGljIGludCByb3RhdG9yX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHJvdF9jb250ZXh0ICpyb3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKQEAgLTgzMyw3ICs4MTAsOCBAQAogI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyByb3RhdG9yX3BtX29wcyA9IHsKLQlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhyb3RhdG9yX3N1c3BlbmQsIHJvdGF0b3JfcmVzdW1lKQorCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZCwKKwkJCQlwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZSkKIAlTRVRfUlVOVElNRV9QTV9PUFMocm90YXRvcl9ydW50aW1lX3N1c3BlbmQsIHJvdGF0b3JfcnVudGltZV9yZXN1bWUsCiAJCQkJCQkJCQlOVUxMKQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCmluZGV4IDk1ZGRkNTYuLjVkZTM2ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwpAQCAtMTI4MSw2ICsxMjgxLDExIEBACiAKIAlpbnRlbF9ydW50aW1lX3BtX2VuYWJsZShkZXZfcHJpdik7CiAKKwkvKiBFdmVyeXRoaW5nIGlzIGluIHBsYWNlLCB3ZSBjYW4gbm93IHJlbGF4ISAqLworCURSTV9JTkZPKCJJbml0aWFsaXplZCAlcyAlZC4lZC4lZCAlcyBmb3IgJXMgb24gbWlub3IgJWRcbiIsCisJCSBkcml2ZXIubmFtZSwgZHJpdmVyLm1ham9yLCBkcml2ZXIubWlub3IsIGRyaXZlci5wYXRjaGxldmVsLAorCQkgZHJpdmVyLmRhdGUsIHBjaV9uYW1lKHBkZXYpLCBkZXZfcHJpdi0+ZHJtLnByaW1hcnktPmluZGV4KTsKKwogCWludGVsX3J1bnRpbWVfcG1fcHV0KGRldl9wcml2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwppbmRleCA3YTMwYWY3Li5mMzhjZWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYwpAQCAtMTIyLDggKzEyMiwxMSBAQAogCWhhc19mdWxsXzQ4Yml0X3BwZ3R0ID0KIAkgICAgICAgCUlTX0JST0FEV0VMTChkZXZfcHJpdikgfHwgSU5URUxfR0VOKGRldl9wcml2KSA+PSA5OwogCi0JaWYgKGludGVsX3ZncHVfYWN0aXZlKGRldl9wcml2KSkKLQkJaGFzX2Z1bGxfcHBndHQgPSBmYWxzZTsgLyogZW11bGF0aW9uIGlzIHRvbyBoYXJkICovCisJaWYgKGludGVsX3ZncHVfYWN0aXZlKGRldl9wcml2KSkgeworCQkvKiBlbXVsYXRpb24gaXMgdG9vIGhhcmQgKi8KKwkJaGFzX2Z1bGxfcHBndHQgPSBmYWxzZTsKKwkJaGFzX2Z1bGxfNDhiaXRfcHBndHQgPSBmYWxzZTsKKwl9CiAKIAlpZiAoIWhhc19hbGlhc2luZ19wcGd0dCkKIAkJcmV0dXJuIDA7CkBAIC0xNTgsNyArMTYxLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKElOVEVMX0dFTihkZXZfcHJpdikgPj0gOCAmJiBpOTE1LmVuYWJsZV9leGVjbGlzdHMpCisJaWYgKElOVEVMX0dFTihkZXZfcHJpdikgPj0gOCAmJiBpOTE1LmVuYWJsZV9leGVjbGlzdHMgJiYgaGFzX2Z1bGxfcHBndHQpCiAJCXJldHVybiBoYXNfZnVsbF80OGJpdF9wcGd0dCA/IDMgOiAyOwogCWVsc2UKIAkJcmV0dXJuIGhhc19hbGlhc2luZ19wcGd0dCA/IDEgOiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92Z3B1LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3ZncHUuYwppbmRleCBmNmFjYjVhLi5iODFjZmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3ZncHUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3ZncHUuYwpAQCAtNjUsOSArNjUsNiBAQAogCiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3Qgdmd0X2lmKSAhPSBWR1RfUFZJTkZPX1NJWkUpOwogCi0JaWYgKCFJU19IQVNXRUxMKGRldl9wcml2KSkKLQkJcmV0dXJuOwotCiAJbWFnaWMgPSBfX3Jhd19pOTE1X3JlYWQ2NChkZXZfcHJpdiwgdmd0aWZfcmVnKG1hZ2ljKSk7CiAJaWYgKG1hZ2ljICE9IFZHVF9NQUdJQykKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHZvLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kdm8uYwppbmRleCA0N2JkZjlkLi5iOWU1YTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kdm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kdm8uYwpAQCAtNTU0LDcgKzU1NCw2IEBACiAJCXJldHVybjsKIAl9CiAKLQlkcm1fZW5jb2Rlcl9jbGVhbnVwKCZpbnRlbF9lbmNvZGVyLT5iYXNlKTsKIAlrZnJlZShpbnRlbF9kdm8pOwogCWtmcmVlKGludGVsX2Nvbm5lY3Rvcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfb3ByZWdpb24uYwppbmRleCBhZGNhMjYyLi43YWNiYmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9vcHJlZ2lvbi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX29wcmVnaW9uLmMKQEAgLTEwNDcsNiArMTA0NywyMyBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgaW50ZWxfdXNlX29wcmVnaW9uX3BhbmVsX3R5cGVfY2FsbGJhY2soY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmlkKQoreworCURSTV9JTkZPKCJVc2luZyBwYW5lbCB0eXBlIGZyb20gT3BSZWdpb24gb24gJXNcbiIsIGlkLT5pZGVudCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBpbnRlbF91c2Vfb3ByZWdpb25fcGFuZWxfdHlwZVtdID0geworCXsKKwkJLmNhbGxiYWNrID0gaW50ZWxfdXNlX29wcmVnaW9uX3BhbmVsX3R5cGVfY2FsbGJhY2ssCisJCS5pZGVudCA9ICJDb25yYWMgR21iSCBJWDQ1R00yIiwKKwkJLm1hdGNoZXMgPSB7RE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQ29ucmFjIEdtYkgiKSwKKwkJCSAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIklYNDVHTTIiKSwKKwkJfSwKKwl9LAorCXsgfQorfTsKKwogaW50CiBpbnRlbF9vcHJlZ2lvbl9nZXRfcGFuZWxfdHlwZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CkBAIC0xMDczLDYgKzEwOTAsMTYgQEAKIAl9CiAKIAkvKgorCSAqIFNvIGZhciB3ZSBrbm93IHRoYXQgc29tZSBtYWNoaW5lZCBtdXN0IHVzZSBpdCwgb3RoZXJzIG11c3Qgbm90IHVzZSBpdC4KKwkgKiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IHdheSB0byBkZXRlcm1pbmUgd2hpY2ggd2F5IHRvIGdvLCBleGNlcHQKKwkgKiB2aWEgYSBxdWlyayBsaXN0IDooCisJICovCisJaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGludGVsX3VzZV9vcHJlZ2lvbl9wYW5lbF90eXBlKSkgeworCQlEUk1fREVCVUdfS01TKCJJZ25vcmluZyBPcFJlZ2lvbiBwYW5lbCB0eXBlICglZClcbiIsIHJldCAtIDEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKgogCSAqIEZJWE1FIE9uIERlbGwgWFBTIDEzIDkzNTAgdGhlIE9wUmVnaW9uIHBhbmVsIHR5cGUgKDApIGdpdmVzIHVzCiAJICogbG93IHZzd2luZyBmb3IgZURQLCB3aGVyZWFzIHRoZSBWQlQgcGFuZWwgdHlwZSAoMikgZ2l2ZXMgdXMgbm9ybWFsCiAJICogdnN3aW5nIGluc3RlYWQuIExvdyB2c3dpbmcgcmVzdWx0cyBpbiBzb21lIGRpc3BsYXkgZmxpY2tlcnMsIHNvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcG0uYwppbmRleCA1M2UxM2MxLi4yZDI0ODEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BtLmMKQEAgLTc4NTksNiArNzg1OSw3IEBACiAJY2FzZSBHRU42X1BDT0RFX0lMTEVHQUxfQ01EOgogCQlyZXR1cm4gLUVOWElPOwogCWNhc2UgR0VONl9QQ09ERV9NSU5fRlJFUV9UQUJMRV9HVF9SQVRJT19PVVRfT0ZfUkFOR0U6CisJY2FzZSBHRU43X1BDT0RFX01JTl9GUkVRX1RBQkxFX0dUX1JBVElPX09VVF9PRl9SQU5HRToKIAkJcmV0dXJuIC1FT1ZFUkZMT1c7CiAJY2FzZSBHRU42X1BDT0RFX1RJTUVPVVQ6CiAJCXJldHVybiAtRVRJTUVET1VUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcHNyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wc3IuYwppbmRleCAyYjBkMWJhLi5jZjE3MWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wc3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wc3IuYwpAQCAtMjU1LDE0ICsyNTUsMTQgQEAKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7CiAKIAl1aW50MzJfdCBtYXhfc2xlZXBfdGltZSA9IDB4MWY7Ci0JLyogTGF0ZWx5IGl0IHdhcyBpZGVudGlmaWVkIHRoYXQgZGVwZW5kaW5nIG9uIHBhbmVsIGlkbGUgZnJhbWUgY291bnQKLQkgKiBjYWxjdWxhdGVkIGF0IEhXIGNhbiBiZSBvZmYgYnkgMS4gU28gbGV0J3MgdXNlIHdoYXQgY2FtZQotCSAqIGZyb20gVkJUICsgMS4KLQkgKiBUaGVyZSBhcmUgYWxzbyBvdGhlciBjYXNlcyB3aGVyZSBwYW5lbCBkZW1hbmRzIGF0IGxlYXN0IDQKLQkgKiBidXQgVkJUIGlzIG5vdCBiZWluZyBzZXQuIFRvIGNvdmVyIHRoZXNlIDIgY2FzZXMgbGV0cyB1c2UKLQkgKiBhdCBsZWFzdCA1IHdoZW4gVkJUIGlzbid0IHNldCB0byBiZSBvbiB0aGUgc2FmZXN0IHNpZGUuCisJLyoKKwkgKiBMZXQncyByZXNwZWN0IFZCVCBpbiBjYXNlIFZCVCBhc2tzIGEgaGlnaGVyIGlkbGVfZnJhbWUgdmFsdWUuCisJICogTGV0J3MgdXNlIDYgYXMgdGhlIG1pbmltdW0gdG8gY292ZXIgYWxsIGtub3duIGNhc2VzIGluY2x1ZGluZworCSAqIHRoZSBvZmYtYnktb25lIGlzc3VlIHRoYXQgSFcgaGFzIGluIHNvbWUgY2FzZXMuIEFsc28gdGhlcmUgYXJlCisJICogY2FzZXMgd2hlcmUgc2luayBzaG91bGQgYmUgYWJsZSB0byB0cmFpbgorCSAqIHdpdGggdGhlIDUgb3IgNiBpZGxlIHBhdHRlcm5zLgogCSAqLwotCXVpbnQzMl90IGlkbGVfZnJhbWVzID0gZGV2X3ByaXYtPnZidC5wc3IuaWRsZV9mcmFtZXMgKyAxOworCXVpbnQzMl90IGlkbGVfZnJhbWVzID0gbWF4KDYsIGRldl9wcml2LT52YnQucHNyLmlkbGVfZnJhbWVzKTsKIAl1aW50MzJfdCB2YWwgPSBFRFBfUFNSX0VOQUJMRTsKIAogCXZhbCB8PSBtYXhfc2xlZXBfdGltZSA8PCBFRFBfUFNSX01BWF9TTEVFUF9USU1FX1NISUZUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2lteC9pbXgtZHJtLWNvcmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9pbXgvaW14LWRybS1jb3JlLmMKaW5kZXggOWY3ZGFmYy4uN2JmOTBlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2lteC9pbXgtZHJtLWNvcmUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaW14L2lteC1kcm0tY29yZS5jCkBAIC0xNzEsMTAgKzE3MSwzNCBAQAogCWRybV9mYmRldl9jbWFfaG90cGx1Z19ldmVudChpbXhkcm0tPmZiaGVscGVyKTsKIH0KIAorc3RhdGljIGludCBpbXhfZHJtX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldChkZXYsIHN0YXRlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfcGxhbmVzKGRldiwgc3RhdGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIENoZWNrIG1vZGVzZXQgYWdhaW4gaW4gY2FzZSBjcnRjX3N0YXRlLT5tb2RlX2NoYW5nZWQgaXMKKwkgKiB1cGRhdGVkIGluIHBsYW5lJ3MgLT5hdG9taWNfY2hlY2sgY2FsbGJhY2suCisJICovCisJcmV0ID0gZHJtX2F0b21pY19oZWxwZXJfY2hlY2tfbW9kZXNldChkZXYsIHN0YXRlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fbW9kZV9jb25maWdfZnVuY3MgaW14X2RybV9tb2RlX2NvbmZpZ19mdW5jcyA9IHsKIAkuZmJfY3JlYXRlID0gZHJtX2ZiX2NtYV9jcmVhdGUsCiAJLm91dHB1dF9wb2xsX2NoYW5nZWQgPSBpbXhfZHJtX291dHB1dF9wb2xsX2NoYW5nZWQsCi0JLmF0b21pY19jaGVjayA9IGRybV9hdG9taWNfaGVscGVyX2NoZWNrLAorCS5hdG9taWNfY2hlY2sgPSBpbXhfZHJtX2F0b21pY19jaGVjaywKIAkuYXRvbWljX2NvbW1pdCA9IGRybV9hdG9taWNfaGVscGVyX2NvbW1pdCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pbXgvaXB1djMtY3J0Yy5jIGIvZHJpdmVycy9ncHUvZHJtL2lteC9pcHV2My1jcnRjLmMKaW5kZXggMDhlMTg4Yi4uNDYyMDU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2lteC9pcHV2My1jcnRjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2lteC9pcHV2My1jcnRjLmMKQEAgLTc2LDYgKzc2LDggQEAKIAkJY3J0Yy0+c3RhdGUtPmV2ZW50ID0gTlVMTDsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxKCZjcnRjLT5kZXYtPmV2ZW50X2xvY2spOworCisJZHJtX2NydGNfdmJsYW5rX29mZihjcnRjKTsKIH0KIAogc3RhdGljIHZvaWQgaW14X2RybV9jcnRjX3Jlc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKQEAgLTE3NSw2ICsxNzcsOCBAQAogc3RhdGljIHZvaWQgaXB1X2NydGNfYXRvbWljX2JlZ2luKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKIAkJCQkgIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqb2xkX2NydGNfc3RhdGUpCiB7CisJZHJtX2NydGNfdmJsYW5rX29uKGNydGMpOworCiAJc3Bpbl9sb2NrX2lycSgmY3J0Yy0+ZGV2LT5ldmVudF9sb2NrKTsKIAlpZiAoY3J0Yy0+c3RhdGUtPmV2ZW50KSB7CiAJCVdBUk5fT04oZHJtX2NydGNfdmJsYW5rX2dldChjcnRjKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaW14L2lwdXYzLXBsYW5lLmMgYi9kcml2ZXJzL2dwdS9kcm0vaW14L2lwdXYzLXBsYW5lLmMKaW5kZXggNGFkNjdkMC4uMjk0MjNlNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pbXgvaXB1djMtcGxhbmUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaW14L2lwdXYzLXBsYW5lLmMKQEAgLTMxOSwxMyArMzE5LDE0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKLQkgKiBzaW5jZSB3ZSBjYW5ub3QgdG91Y2ggYWN0aXZlIElETUFDIGNoYW5uZWxzLCB3ZSBkbyBub3Qgc3VwcG9ydAotCSAqIHJlc2l6aW5nIHRoZSBlbmFibGVkIHBsYW5lIG9yIGNoYW5naW5nIGl0cyBmb3JtYXQKKwkgKiBXZSBzdXBwb3J0IHJlc2l6aW5nIGFjdGl2ZSBwbGFuZSBvciBjaGFuZ2luZyBpdHMgZm9ybWF0IGJ5CisJICogZm9yY2luZyBDUlRDIG1vZGUgY2hhbmdlIGFuZCBkaXNhYmxpbmctZW5hYmxpbmcgcGxhbmUgaW4gcGxhbmUncworCSAqIC0+YXRvbWljX3VwZGF0ZSBjYWxsYmFjay4KIAkgKi8KIAlpZiAob2xkX2ZiICYmIChzdGF0ZS0+c3JjX3cgIT0gb2xkX3N0YXRlLT5zcmNfdyB8fAogCQkJICAgICAgc3RhdGUtPnNyY19oICE9IG9sZF9zdGF0ZS0+c3JjX2ggfHwKIAkJCSAgICAgIGZiLT5waXhlbF9mb3JtYXQgIT0gb2xkX2ZiLT5waXhlbF9mb3JtYXQpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJY3J0Y19zdGF0ZS0+bW9kZV9jaGFuZ2VkID0gdHJ1ZTsKIAogCWViYSA9IGRybV9wbGFuZV9zdGF0ZV90b19lYmEoc3RhdGUpOwogCkBAIC0zMzYsNyArMzM3LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAob2xkX2ZiICYmIGZiLT5waXRjaGVzWzBdICE9IG9sZF9mYi0+cGl0Y2hlc1swXSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWNydGNfc3RhdGUtPm1vZGVfY2hhbmdlZCA9IHRydWU7CiAKIAlzd2l0Y2ggKGZiLT5waXhlbF9mb3JtYXQpIHsKIAljYXNlIERSTV9GT1JNQVRfWVVWNDIwOgpAQCAtMzcyLDcgKzM3Myw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlpZiAob2xkX2ZiICYmIG9sZF9mYi0+cGl0Y2hlc1sxXSAhPSBmYi0+cGl0Y2hlc1sxXSkKLQkJCXJldHVybiAtRUlOVkFMOworCQkJY3J0Y19zdGF0ZS0+bW9kZV9jaGFuZ2VkID0gdHJ1ZTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTM5Miw4ICszOTMsMTQgQEAKIAllbnVtIGlwdV9jb2xvcl9zcGFjZSBpY3M7CiAKIAlpZiAob2xkX3N0YXRlLT5mYikgewotCQlpcHVfcGxhbmVfYXRvbWljX3NldF9iYXNlKGlwdV9wbGFuZSwgb2xkX3N0YXRlKTsKLQkJcmV0dXJuOworCQlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGUgPSBzdGF0ZS0+Y3J0Yy0+c3RhdGU7CisKKwkJaWYgKCFjcnRjX3N0YXRlLT5tb2RlX2NoYW5nZWQpIHsKKwkJCWlwdV9wbGFuZV9hdG9taWNfc2V0X2Jhc2UoaXB1X3BsYW5lLCBvbGRfc3RhdGUpOworCQkJcmV0dXJuOworCQl9CisKKwkJaXB1X2Rpc2FibGVfcGxhbmUocGxhbmUpOwogCX0KIAogCXN3aXRjaCAoaXB1X3BsYW5lLT5kcF9mbG93KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCmluZGV4IGI0YmM3ZjEuLmQwZGE1MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oCkBAIC0xNTcsNiArMTU3LDEyIEBACiAJc3RydWN0IHNocmlua2VyIHNocmlua2VyOwogCiAJc3RydWN0IG1zbV92YmxhbmtfY3RybCB2YmxhbmtfY3RybDsKKworCS8qIHRhc2sgaG9sZGluZyBzdHJ1Y3RfbXV0ZXguLiBjdXJyZW50bHkgb25seSB1c2VkIGluIHN1Ym1pdCBwYXRoCisJICogdG8gZGV0ZWN0IGFuZCByZWplY3QgZmF1bHRzIGZyb20gY29weV9mcm9tX3VzZXIoKSBmb3Igc3VibWl0CisJICogaW9jdGwuCisJICovCisJc3RydWN0IHRhc2tfc3RydWN0ICpzdHJ1Y3RfbXV0ZXhfdGFzazsKIH07CiAKIHN0cnVjdCBtc21fZm9ybWF0IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmMKaW5kZXggNmNkNGFmNC4uODVmMzA0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtLmMKQEAgLTE5NiwxMSArMTk2LDIwIEBACiB7CiAJc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2JqLT5kZXY7CisJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJc3RydWN0IHBhZ2UgKipwYWdlczsKIAl1bnNpZ25lZCBsb25nIHBmbjsKIAlwZ29mZl90IHBnb2ZmOwogCWludCByZXQ7CiAKKwkvKiBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB1c2Vyc3BhY2UgdHJpZXMgdG8gcGFzcyBhIG1tYXAnZAorCSAqIGJ1dCB1bmZhdWx0ZWQgZ2VtIGJvIHZhZGRyIGludG8gc3VibWl0IGlvY3RsLCB0cmlnZ2VyaW5nCisJICogYSBwYWdlIGZhdWx0IHdoaWxlIHN0cnVjdF9tdXRleCBpcyBhbHJlYWR5IGhlbGQuICBUaGlzIGlzCisJICogbm90IGEgdmFsaWQgdXNlLWNhc2Ugc28ganVzdCBiYWlsLgorCSAqLworCWlmIChwcml2LT5zdHJ1Y3RfbXV0ZXhfdGFzayA9PSBjdXJyZW50KQorCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOworCiAJLyogTWFrZSBzdXJlIHdlIGRvbid0IHBhcmFsbGVsIHVwZGF0ZSBvbiBhIGZhdWx0LCBub3IgbW92ZSBvciByZW1vdmUKIAkgKiBzb21ldGhpbmcgZnJvbSBiZW5lYXRoIG91ciBmZWV0CiAJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW1fc3VibWl0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9nZW1fc3VibWl0LmMKaW5kZXggOTc2NmY5YS4uODgwZDZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL21zbS9tc21fZ2VtX3N1Ym1pdC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2dlbV9zdWJtaXQuYwpAQCAtNjQsNiArNjQsMTQgQEAKIAlrZnJlZShzdWJtaXQpOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrCitjb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkKKwkJcmV0dXJuIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pOworCXJldHVybiAtRUZBVUxUOworfQorCiBzdGF0aWMgaW50IHN1Ym1pdF9sb29rdXBfb2JqZWN0cyhzdHJ1Y3QgbXNtX2dlbV9zdWJtaXQgKnN1Ym1pdCwKIAkJc3RydWN0IGRybV9tc21fZ2VtX3N1Ym1pdCAqYXJncywgc3RydWN0IGRybV9maWxlICpmaWxlKQogewpAQCAtNzEsNiArNzksNyBAQAogCWludCByZXQgPSAwOwogCiAJc3Bpbl9sb2NrKCZmaWxlLT50YWJsZV9sb2NrKTsKKwlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCiAJZm9yIChpID0gMDsgaSA8IGFyZ3MtPm5yX2JvczsgaSsrKSB7CiAJCXN0cnVjdCBkcm1fbXNtX2dlbV9zdWJtaXRfYm8gc3VibWl0X2JvOwpAQCAtODQsMTAgKzkzLDE1IEBACiAJCSAqLwogCQlzdWJtaXQtPmJvc1tpXS5mbGFncyA9IDA7CiAKLQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJnN1Ym1pdF9ibywgdXNlcnB0ciwgc2l6ZW9mKHN1Ym1pdF9ibykpOwotCQlpZiAocmV0KSB7Ci0JCQlyZXQgPSAtRUZBVUxUOwotCQkJZ290byBvdXRfdW5sb2NrOworCQlyZXQgPSBjb3B5X2Zyb21fdXNlcl9pbmF0b21pYygmc3VibWl0X2JvLCB1c2VycHRyLCBzaXplb2Yoc3VibWl0X2JvKSk7CisJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQlwYWdlZmF1bHRfZW5hYmxlKCk7CisJCQlzcGluX3VubG9jaygmZmlsZS0+dGFibGVfbG9jayk7CisJCQlyZXQgPSBjb3B5X2Zyb21fdXNlcigmc3VibWl0X2JvLCB1c2VycHRyLCBzaXplb2Yoc3VibWl0X2JvKSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQkJc3Bpbl9sb2NrKCZmaWxlLT50YWJsZV9sb2NrKTsKKwkJCXBhZ2VmYXVsdF9kaXNhYmxlKCk7CiAJCX0KIAogCQlpZiAoc3VibWl0X2JvLmZsYWdzICYgfk1TTV9TVUJNSVRfQk9fRkxBR1MpIHsKQEAgLTEyNyw5ICsxNDEsMTIgQEAKIAl9CiAKIG91dF91bmxvY2s6Ci0Jc3VibWl0LT5ucl9ib3MgPSBpOworCXBhZ2VmYXVsdF9lbmFibGUoKTsKIAlzcGluX3VubG9jaygmZmlsZS0+dGFibGVfbG9jayk7CiAKK291dDoKKwlzdWJtaXQtPm5yX2JvcyA9IGk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNzcsNiArMzk0LDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJcHJpdi0+c3RydWN0X211dGV4X3Rhc2sgPSBjdXJyZW50OworCiAJc3VibWl0ID0gc3VibWl0X2NyZWF0ZShkZXYsIGdwdSwgYXJncy0+bnJfYm9zLCBhcmdzLT5ucl9jbWRzKTsKIAlpZiAoIXN1Ym1pdCkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtNDY4LDYgKzQ4Nyw3IEBACiAJaWYgKHJldCkKIAkJbXNtX2dlbV9zdWJtaXRfZnJlZShzdWJtaXQpOwogb3V0X3VubG9jazoKKwlwcml2LT5zdHJ1Y3RfbXV0ZXhfdGFzayA9IE5VTEw7CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2luY2x1ZGUvbnZrbS9jb3JlL2RldmljZS5oIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL2NvcmUvZGV2aWNlLmgKaW5kZXggN2VhOGFhNy4uNmJjNzEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL2NvcmUvZGV2aWNlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL2NvcmUvZGV2aWNlLmgKQEAgLTE3NSw2ICsxNzUsNyBAQAogCXZvaWQgKCpmaW5pKShzdHJ1Y3QgbnZrbV9kZXZpY2UgKiwgYm9vbCBzdXNwZW5kKTsKIAlyZXNvdXJjZV9zaXplX3QgKCpyZXNvdXJjZV9hZGRyKShzdHJ1Y3QgbnZrbV9kZXZpY2UgKiwgdW5zaWduZWQgYmFyKTsKIAlyZXNvdXJjZV9zaXplX3QgKCpyZXNvdXJjZV9zaXplKShzdHJ1Y3QgbnZrbV9kZXZpY2UgKiwgdW5zaWduZWQgYmFyKTsKKwlib29sIGNwdV9jb2hlcmVudDsKIH07CiAKIHN0cnVjdCBudmttX2RldmljZV9xdWlyayB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2FjcGkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCmluZGV4IGYyYWQxN2EuLmRjNTdiNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYWNwaS5jCkBAIC0yMjUsNiArMjI1LDE3IEBACiAJaWYgKCFwYXJlbnRfcGRldikKIAkJcmV0dXJuIGZhbHNlOwogCisJaWYgKCFwYXJlbnRfcGRldi0+YnJpZGdlX2QzKSB7CisJCS8qCisJCSAqIFBhcmVudCBQQ0kgYnJpZGdlIGlzIGN1cnJlbnRseSBub3QgcG93ZXIgbWFuYWdlZC4KKwkJICogU2luY2UgdXNlcnNwYWNlIGNhbiBjaGFuZ2UgdGhlc2UgYWZ0ZXJ3YXJkcyB0byBiZSBvbgorCQkgKiB0aGUgc2FmZSBzaWRlIHdlIHN0aWNrIHdpdGggX0RTTSBhbmQgcHJldmVudCB1c2FnZSBvZgorCQkgKiBfUFIzIGZyb20gdGhlIGJyaWRnZS4KKwkJICovCisJCXBjaV9kM2NvbGRfZGlzYWJsZShwZGV2KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwogCXBhcmVudF9hZGV2ID0gQUNQSV9DT01QQU5JT04oJnBhcmVudF9wZGV2LT5kZXYpOwogCWlmICghcGFyZW50X2FkZXYpCiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfYm8uYwppbmRleCA2MTkwMDM1Li44NjQzMjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2JvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9iby5jCkBAIC0yMDksNyArMjA5LDggQEAKIAludmJvLT50aWxlX2ZsYWdzID0gdGlsZV9mbGFnczsKIAludmJvLT5iby5iZGV2ID0gJmRybS0+dHRtLmJkZXY7CiAKLQludmJvLT5mb3JjZV9jb2hlcmVudCA9IGZsYWdzICYgVFRNX1BMX0ZMQUdfVU5DQUNIRUQ7CisJaWYgKCFudnh4X2RldmljZSgmZHJtLT5kZXZpY2UpLT5mdW5jLT5jcHVfY29oZXJlbnQpCisJCW52Ym8tPmZvcmNlX2NvaGVyZW50ID0gZmxhZ3MgJiBUVE1fUExfRkxBR19VTkNBQ0hFRDsKIAogCW52Ym8tPnBhZ2Vfc2hpZnQgPSAxMjsKIAlpZiAoZHJtLT5jbGllbnQudm0pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2RldmljZS9wY2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2RldmljZS9wY2kuYwppbmRleCBiMWI2OTMyLi42MmFkMDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvcGNpLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZGV2aWNlL3BjaS5jCkBAIC0xNjE0LDYgKzE2MTQsNyBAQAogCS5maW5pID0gbnZrbV9kZXZpY2VfcGNpX2ZpbmksCiAJLnJlc291cmNlX2FkZHIgPSBudmttX2RldmljZV9wY2lfcmVzb3VyY2VfYWRkciwKIAkucmVzb3VyY2Vfc2l6ZSA9IG52a21fZGV2aWNlX3BjaV9yZXNvdXJjZV9zaXplLAorCS5jcHVfY29oZXJlbnQgPSAhSVNfRU5BQkxFRChDT05GSUdfQVJNKSwKIH07CiAKIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZGV2aWNlL3RlZ3JhLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvdGVncmEuYwppbmRleCA5Mzk2ODJmLi45YjYzOGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvdGVncmEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvdGVncmEuYwpAQCAtMjQ1LDYgKzI0NSw3IEBACiAJLmZpbmkgPSBudmttX2RldmljZV90ZWdyYV9maW5pLAogCS5yZXNvdXJjZV9hZGRyID0gbnZrbV9kZXZpY2VfdGVncmFfcmVzb3VyY2VfYWRkciwKIAkucmVzb3VyY2Vfc2l6ZSA9IG52a21fZGV2aWNlX3RlZ3JhX3Jlc291cmNlX3NpemUsCisJLmNwdV9jb2hlcmVudCA9IGZhbHNlLAogfTsKIAogaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9maWZvL2RtYW52MDQuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2ZpZm8vZG1hbnYwNC5jCmluZGV4IGVkZWMzMGYuLjBhN2I2ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2ZpZm8vZG1hbnYwNC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2ZpZm8vZG1hbnYwNC5jCkBAIC0zNyw3ICszNywxMCBAQAogewogCXN0cnVjdCBudjA0X2ZpZm9fY2hhbiAqY2hhbiA9IG52MDRfZmlmb19jaGFuKGJhc2UpOwogCXN0cnVjdCBudmttX2luc3RtZW0gKmltZW0gPSBjaGFuLT5maWZvLT5iYXNlLmVuZ2luZS5zdWJkZXYuZGV2aWNlLT5pbWVtOworCisJbXV0ZXhfbG9jaygmY2hhbi0+Zmlmby0+YmFzZS5lbmdpbmUuc3ViZGV2Lm11dGV4KTsKIAludmttX3JhbWh0X3JlbW92ZShpbWVtLT5yYW1odCwgY29va2llKTsKKwltdXRleF91bmxvY2soJmNoYW4tPmZpZm8tPmJhc2UuZW5naW5lLnN1YmRldi5tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfZHBtLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3NpX2RwbS5jCmluZGV4IGU2YWJjMDkuLjFmNzhlYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vc2lfZHBtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9zaV9kcG0uYwpAQCAtMzAxNSw2ICszMDE1LDEyIEBACiAJaWYgKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDY4MTEgJiYKIAkgICAgcmRldi0+cGRldi0+cmV2aXNpb24gPT0gMHg4MSkKIAkJbWF4X21jbGsgPSAxMjAwMDA7CisJLyogbGltaXQgc2Nsay9tY2xrIG9uIEpldCBwYXJ0cyBmb3Igc3RhYmlsaXR5ICovCisJaWYgKHJkZXYtPnBkZXYtPmRldmljZSA9PSAweDY2NjUgJiYKKwkgICAgcmRldi0+cGRldi0+cmV2aXNpb24gPT0gMHhjMykgeworCQltYXhfc2NsayA9IDc1MDAwOworCQltYXhfbWNsayA9IDgwMDAwOworCX0KIAogCWlmIChycHMtPnZjZV9hY3RpdmUpIHsKIAkJcnBzLT5ldmNsayA9IHJkZXYtPnBtLmRwbS52Y2Vfc3RhdGVzW3JkZXYtPnBtLmRwbS52Y2VfbGV2ZWxdLmV2Y2xrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZmIuYyBiL2RyaXZlcnMvZ3B1L2RybS91ZGwvdWRsX2ZiLmMKaW5kZXggOTY4OGJmYS4uNjExYjZiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3VkbC91ZGxfZmIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdWRsL3VkbF9mYi5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJcmV0dXJuIDA7CiAJY21kID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CiAKLQlmb3IgKGkgPSB5OyBpIDwgaGVpZ2h0IDsgaSsrKSB7CisJZm9yIChpID0geTsgaSA8IHkgKyBoZWlnaHQgOyBpKyspIHsKIAkJY29uc3QgaW50IGxpbmVfb2Zmc2V0ID0gZmItPmJhc2UucGl0Y2hlc1swXSAqIGk7CiAJCWNvbnN0IGludCBieXRlX29mZnNldCA9IGxpbmVfb2Zmc2V0ICsgKHggKiBicHApOwogCQljb25zdCBpbnQgZGV2X2J5dGVfb2Zmc2V0ID0gKGZiLT5iYXNlLndpZHRoICogYnBwICogaSkgKyAoeCAqIGJwcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9iby5jIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfYm8uYwppbmRleCA1OWFkY2Y4Li4zZjY3MDRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9iby5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2JvLmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogCXJldHVybiAmdmM0LT5ib19jYWNoZS5zaXplX2xpc3RbcGFnZV9pbmRleF07CiB9CiAKLXZvaWQgdmM0X2JvX2NhY2hlX3B1cmdlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCB2YzRfYm9fY2FjaGVfcHVyZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdmM0X2RldiAqdmM0ID0gdG9fdmM0X2RldihkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2Rydi5jCmluZGV4IDhiNDJkMzEuLjllY2VmOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2Rydi5jCkBAIC01NywyMSArNTcsMjEgQEAKIAlzd2l0Y2ggKGFyZ3MtPnBhcmFtKSB7CiAJY2FzZSBEUk1fVkM0X1BBUkFNX1YzRF9JREVOVDA6CiAJCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnZjNC0+djNkLT5wZGV2LT5kZXYpOwotCQlpZiAocmV0KQorCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCWFyZ3MtPnZhbHVlID0gVjNEX1JFQUQoVjNEX0lERU5UMCk7CiAJCXBtX3J1bnRpbWVfcHV0KCZ2YzQtPnYzZC0+cGRldi0+ZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSBEUk1fVkM0X1BBUkFNX1YzRF9JREVOVDE6CiAJCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnZjNC0+djNkLT5wZGV2LT5kZXYpOwotCQlpZiAocmV0KQorCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCWFyZ3MtPnZhbHVlID0gVjNEX1JFQUQoVjNEX0lERU5UMSk7CiAJCXBtX3J1bnRpbWVfcHV0KCZ2YzQtPnYzZC0+cGRldi0+ZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSBEUk1fVkM0X1BBUkFNX1YzRF9JREVOVDI6CiAJCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnZjNC0+djNkLT5wZGV2LT5kZXYpOwotCQlpZiAocmV0KQorCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCWFyZ3MtPnZhbHVlID0gVjNEX1JFQUQoVjNEX0lERU5UMik7CiAJCXBtX3J1bnRpbWVfcHV0KCZ2YzQtPnYzZC0+cGRldi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZHJ2LmgKaW5kZXggNDg5ZTNkZS4uNDI4ZTI0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfZHJ2LmgKQEAgLTMyMSw2ICszMjEsMTUgQEAKIAkJCQlzdHJ1Y3QgdmM0X2V4ZWNfaW5mbywgaGVhZCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZjNF9leGVjX2luZm8gKgordmM0X2xhc3RfcmVuZGVyX2pvYihzdHJ1Y3QgdmM0X2RldiAqdmM0KQoreworCWlmIChsaXN0X2VtcHR5KCZ2YzQtPnJlbmRlcl9qb2JfbGlzdCkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBsaXN0X2xhc3RfZW50cnkoJnZjNC0+cmVuZGVyX2pvYl9saXN0LAorCQkJICAgICAgIHN0cnVjdCB2YzRfZXhlY19pbmZvLCBoZWFkKTsKK30KKwogLyoqCiAgKiBzdHJ1Y3QgdmM0X3RleHR1cmVfc2FtcGxlX2luZm8gLSBzYXZlcyB0aGUgb2Zmc2V0cyBpbnRvIHRoZSBVQk8gZm9yIHRleHR1cmUKICAqIHNldHVwIHBhcmFtZXRlcnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2dlbS5jCmluZGV4IDYxNTVlOGEuLmIyNjJjNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X2dlbS5jCkBAIC01MzQsOCArNTM0LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZXhlYy0+Ym8gPSBrY2FsbG9jKGV4ZWMtPmJvX2NvdW50LCBzaXplb2Yoc3RydWN0IGRybV9nZW1fY21hX29iamVjdCAqKSwKLQkJCSAgIEdGUF9LRVJORUwpOworCWV4ZWMtPmJvID0gZHJtX2NhbGxvY19sYXJnZShleGVjLT5ib19jb3VudCwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBkcm1fZ2VtX2NtYV9vYmplY3QgKikpOwogCWlmICghZXhlYy0+Ym8pIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgdmFsaWRhdGVkIEJPIHBvaW50ZXJzXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01NzIsOCArNTcyLDggQEAKIAlzcGluX3VubG9jaygmZmlsZV9wcml2LT50YWJsZV9sb2NrKTsKIAogZmFpbDoKLQlrZnJlZShoYW5kbGVzKTsKLQlyZXR1cm4gMDsKKwlkcm1fZnJlZV9sYXJnZShoYW5kbGVzKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50CkBAIC02MDgsNyArNjA4LDcgQEAKIAkgKiByZWFkIHRoZSBjb250ZW50cyBiYWNrIGZvciB2YWxpZGF0aW9uLCBhbmQgSSB0aGluayB0aGUKIAkgKiBiby0+dmFkZHIgaXMgdW5jYWNoZWQgYWNjZXNzLgogCSAqLwotCXRlbXAgPSBrbWFsbG9jKHRlbXBfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJdGVtcCA9IGRybV9tYWxsb2NfYWIodGVtcF9zaXplLCAxKTsKIAlpZiAoIXRlbXApIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgc3RvcmFnZSBmb3IgY29weWluZyAiCiAJCQkgICJpbiBiaW4vcmVuZGVyIENMcy5cbiIpOwpAQCAtNjc1LDcgKzY3NSw3IEBACiAJcmV0ID0gdmM0X3ZhbGlkYXRlX3NoYWRlcl9yZWNzKGRldiwgZXhlYyk7CiAKIGZhaWw6Ci0Ja2ZyZWUodGVtcCk7CisJZHJtX2ZyZWVfbGFyZ2UodGVtcCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjg4LDcgKzY4OCw3IEBACiAJaWYgKGV4ZWMtPmJvKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBleGVjLT5ib19jb3VudDsgaSsrKQogCQkJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoJmV4ZWMtPmJvW2ldLT5iYXNlKTsKLQkJa2ZyZWUoZXhlYy0+Ym8pOworCQlkcm1fZnJlZV9sYXJnZShleGVjLT5ibyk7CiAJfQogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZleGVjLT51bnJlZl9saXN0KSkgewpAQCAtOTQyLDggKzk0Miw4IEBACiAJCXZjNC0+b3ZlcmZsb3dfbWVtID0gTlVMTDsKIAl9CiAKLQl2YzRfYm9fY2FjaGVfZGVzdHJveShkZXYpOwotCiAJaWYgKHZjNC0+aGFuZ19zdGF0ZSkKIAkJdmM0X2ZyZWVfaGFuZ19zdGF0ZShkZXYsIHZjNC0+aGFuZ19zdGF0ZSk7CisKKwl2YzRfYm9fY2FjaGVfZGVzdHJveShkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfaXJxLmMgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF9pcnEuYwppbmRleCBiMDEwNGEzNC4uMDk0YmM2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfaXJxLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfaXJxLmMKQEAgLTgzLDggKzgzLDEwIEBACiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnZjNC0+am9iX2xvY2ssIGlycWZsYWdzKTsKIAkJY3VycmVudF9leGVjID0gdmM0X2ZpcnN0X2Jpbl9qb2IodmM0KTsKKwkJaWYgKCFjdXJyZW50X2V4ZWMpCisJCQljdXJyZW50X2V4ZWMgPSB2YzRfbGFzdF9yZW5kZXJfam9iKHZjNCk7CiAJCWlmIChjdXJyZW50X2V4ZWMpIHsKLQkJCXZjNC0+b3ZlcmZsb3dfbWVtLT5zZXFubyA9IHZjNC0+ZmluaXNoZWRfc2Vxbm8gKyAxOworCQkJdmM0LT5vdmVyZmxvd19tZW0tPnNlcW5vID0gY3VycmVudF9leGVjLT5zZXFubzsKIAkJCWxpc3RfYWRkX3RhaWwoJnZjNC0+b3ZlcmZsb3dfbWVtLT51bnJlZl9oZWFkLAogCQkJCSAgICAgICZjdXJyZW50X2V4ZWMtPnVucmVmX2xpc3QpOwogCQkJdmM0LT5vdmVyZmxvd19tZW0gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfdmFsaWRhdGVfc2hhZGVycy5jIGIvZHJpdmVycy9ncHUvZHJtL3ZjNC92YzRfdmFsaWRhdGVfc2hhZGVycy5jCmluZGV4IDQ2NTI3ZTkuLjI1NDNjZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92YzQvdmM0X3ZhbGlkYXRlX3NoYWRlcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdmM0L3ZjNF92YWxpZGF0ZV9zaGFkZXJzLmMKQEAgLTMwOSw4ICszMDksMTQgQEAKIAkgKiBvZiB1bmlmb3JtcyBvbiBlYWNoIHNpZGUuICBIb3dldmVyLCB0aGlzIHNjaGVtZSBpcyBlYXN5IHRvCiAJICogdmFsaWRhdGUgc28gaXQncyBhbGwgd2UgYWxsb3cgZm9yIG5vdy4KIAkgKi8KLQotCWlmIChRUFVfR0VUX0ZJRUxEKGluc3QsIFFQVV9TSUcpICE9IFFQVV9TSUdfTk9ORSkgeworCXN3aXRjaCAoUVBVX0dFVF9GSUVMRChpbnN0LCBRUFVfU0lHKSkgeworCWNhc2UgUVBVX1NJR19OT05FOgorCWNhc2UgUVBVX1NJR19TQ09SRUJPQVJEX1VOTE9DSzoKKwljYXNlIFFQVV9TSUdfQ09MT1JfTE9BRDoKKwljYXNlIFFQVV9TSUdfTE9BRF9UTVUwOgorCWNhc2UgUVBVX1NJR19MT0FEX1RNVTE6CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCURSTV9FUlJPUigidW5pZm9ybXMgYWRkcmVzcyBjaGFuZ2UgbXVzdCBiZSAiCiAJCQkgICJub3JtYWwgbWF0aFxuIik7CiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL0tjb25maWcgYi9kcml2ZXJzL2hpZC9LY29uZmlnCmluZGV4IDc4YWM0ODEuLmNkNDU5OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL0tjb25maWcKKysrIGIvZHJpdmVycy9oaWQvS2NvbmZpZwpAQCAtNDU3LDggKzQ1Nyw2IEBACiAJICAtIExvZ2l0ZWNoIFdpbmdNYW4gQ29yZGxlc3MgUnVtYmxlUGFkCiAJICAtIExvZ2l0ZWNoIFdpbmdNYW4gQ29yZGxlc3MgUnVtYmxlUGFkIDIKIAkgIC0gTG9naXRlY2ggV2luZ01hbiBGb3JjZSAzRAotCSAgLSBMb2dpdGVjaCBGb3JtdWxhIEZvcmNlIEVYCi0JICAtIExvZ2l0ZWNoIFdpbmdNYW4gRm9ybXVsYSBGb3JjZSBHUAogCiAJICBhbmQgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGZvcmNlIGZlZWRiYWNrIGZvciB0aGVtLgogCSAgTm90ZTogaWYgeW91IHNheSBOIGhlcmUsIHRoaXMgZGV2aWNlIHdpbGwgc3RpbGwgYmUgc3VwcG9ydGVkLCBidXQgd2l0aG91dApAQCAtNDg4LDE1ICs0ODYsMjIgQEAKIAlzZWxlY3QgSU5QVVRfRkZfTUVNTEVTUwogCWRlZmF1bHQgTE9HSVRFQ0hfRkYKIAloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBmb3JjZSBmZWVkYmFjayBhbmQgcmFuZ2Ugc2V0dGluZworCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgZm9yY2UgZmVlZGJhY2sgYW5kIHJhbmdlIHNldHRpbmcoKikKIAkgIHN1cHBvcnQgZm9yIGZvbGxvd2luZyBMb2dpdGVjaCB3aGVlbHM6CisJICAtIExvZ2l0ZWNoIEcyNSAoKikKKwkgIC0gTG9naXRlY2ggRzI3ICgqKQorCSAgLSBMb2dpdGVjaCBHMjkgKCopCiAJICAtIExvZ2l0ZWNoIERyaXZpbmcgRm9yY2UKLQkgIC0gTG9naXRlY2ggRHJpdmluZyBGb3JjZSBQcm8KLQkgIC0gTG9naXRlY2ggRHJpdmluZyBGb3JjZSBHVAotCSAgLSBMb2dpdGVjaCBHMjUKLQkgIC0gTG9naXRlY2ggRzI3Ci0JICAtIExvZ2l0ZWNoIE1PTU8vTU9NTyAyCi0JICAtIExvZ2l0ZWNoIEZvcm11bGEgRm9yY2UgRVgKKwkgIC0gTG9naXRlY2ggRHJpdmluZyBGb3JjZSBQcm8gKCopCisJICAtIExvZ2l0ZWNoIERyaXZpbmcgRm9yY2UgR1QgKCopCisJICAtIExvZ2l0ZWNoIERyaXZpbmcgRm9yY2UgRVgvUlgKKwkgIC0gTG9naXRlY2ggRHJpdmluZyBGb3JjZSBXaXJlbGVzcworCSAgLSBMb2dpdGVjaCBTcGVlZCBGb3JjZSBXaXJlbGVzcworCSAgLSBMb2dpdGVjaCBNT01PIEZvcmNlCisJICAtIExvZ2l0ZWNoIE1PTU8gUmFjaW5nIEZvcmNlCisJICAtIExvZ2l0ZWNoIEZvcm11bGEgRm9yY2UgR1AKKwkgIC0gTG9naXRlY2ggRm9ybXVsYSBGb3JjZSBFWC9SWAorCSAgLSBMb2dpdGVjaCBXaW5nbWFuIEZvcm11bGEgRm9yY2UgR1AKIAogY29uZmlnIEhJRF9NQUdJQ01PVVNFCiAJdHJpc3RhdGUgIkFwcGxlIE1hZ2ljIE1vdXNlL1RyYWNrcGFkIG11bHRpLXRvdWNoIHN1cHBvcnQiCkBAIC04NjIsNiArODY3LDcgQEAKIAlzZWxlY3QgUE9XRVJfU1VQUExZCiAJc2VsZWN0IE5FV19MRURTCiAJc2VsZWN0IExFRFNfQ0xBU1MKKwlzZWxlY3QgTEVEU19UUklHR0VSUwogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBVU0Igb3IgQlQgdmVyc2lvbiBvZiB0aGUgV2Fjb20gSW50dW9zCiAJICBvciBHcmFwaGlyZSB0YWJsZXQuCkBAIC05NjcsNCArOTczLDYgQEAKIAogc291cmNlICJkcml2ZXJzL2hpZC9pMmMtaGlkL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9LY29uZmlnIgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9NYWtlZmlsZSBiL2RyaXZlcnMvaGlkL01ha2VmaWxlCmluZGV4IGZjNGIyYWEuLjg2YjJiNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaGlkL01ha2VmaWxlCkBAIC0xMTMsMyArMTEzLDUgQEAKIG9iai0kKENPTkZJR19VU0JfS0JEKQkJKz0gdXNiaGlkLwogCiBvYmotJChDT05GSUdfSTJDX0hJRCkJCSs9IGkyYy1oaWQvCisKK29iai0kKENPTkZJR19JTlRFTF9JU0hfSElEKQkrPSBpbnRlbC1pc2gtaGlkLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWFscHMuYyBiL2RyaXZlcnMvaGlkL2hpZC1hbHBzLmMKaW5kZXggMDQ4YmVmZC4uZWQ5YzBlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWFscHMuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtYWxwcy5jCkBAIC0xMzksOCArMTM5LDggQEAKIAlpZiAocmVhZF9mbGFnKSB7CiAJCXJlYWRidWYgPSBremFsbG9jKFUxX0ZFQVRVUkVfUkVQT1JUX0xFTiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcmVhZGJ1ZikgewotCQkJa2ZyZWUoaW5wdXQpOwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBleGl0OwogCQl9CiAKIAkJcmV0ID0gaGlkX2h3X3Jhd19yZXF1ZXN0KGhkZXYsIFUxX0ZFQVRVUkVfUkVQT1JUX0lELCByZWFkYnVmLApAQCAtMTQ5LDYgKzE0OSw3IEBACiAKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoJmhkZXYtPmRldiwgImZhaWxlZCByZWFkIHJlZ2lzdGVyICglZClcbiIsIHJldCk7CisJCQlrZnJlZShyZWFkYnVmKTsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCkBAIC0xOTAsMTYgKzE5MSwxNiBAQAogCQkJaWYgKHogIT0gMCkgewogCQkJCWlucHV0X210X3JlcG9ydF9zbG90X3N0YXRlKGhkYXRhLT5pbnB1dCwKIAkJCQkJTVRfVE9PTF9GSU5HRVIsIDEpOworCQkJCWlucHV0X3JlcG9ydF9hYnMoaGRhdGEtPmlucHV0LAorCQkJCQlBQlNfTVRfUE9TSVRJT05fWCwgeCk7CisJCQkJaW5wdXRfcmVwb3J0X2FicyhoZGF0YS0+aW5wdXQsCisJCQkJCUFCU19NVF9QT1NJVElPTl9ZLCB5KTsKKwkJCQlpbnB1dF9yZXBvcnRfYWJzKGhkYXRhLT5pbnB1dCwKKwkJCQkJQUJTX01UX1BSRVNTVVJFLCB6KTsKIAkJCX0gZWxzZSB7CiAJCQkJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoaGRhdGEtPmlucHV0LAogCQkJCQlNVF9UT09MX0ZJTkdFUiwgMCk7Ci0JCQkJYnJlYWs7CiAJCQl9Ci0KLQkJCWlucHV0X3JlcG9ydF9hYnMoaGRhdGEtPmlucHV0LCBBQlNfTVRfUE9TSVRJT05fWCwgeCk7Ci0JCQlpbnB1dF9yZXBvcnRfYWJzKGhkYXRhLT5pbnB1dCwgQUJTX01UX1BPU0lUSU9OX1ksIHkpOwotCQkJaW5wdXRfcmVwb3J0X2FicyhoZGF0YS0+aW5wdXQsIEFCU19NVF9QUkVTU1VSRSwgeik7Ci0KIAkJfQogCiAJCWlucHV0X210X3N5bmNfZnJhbWUoaGRhdGEtPmlucHV0KTsKQEAgLTI0NCwxMyArMjQ1LDEzIEBACiBzdGF0aWMgaW50IGFscHNfcG9zdF9yZXNldChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKIHsKIAlyZXR1cm4gdTFfcmVhZF93cml0ZV9yZWdpc3RlcihoZGV2LCBBRERSRVNTX1UxX0RFVl9DVFJMXzEsCi0JCQkJTlVMTCwgVTFfVFBfQUJTX01PREUsIGZhbHNlKTsKKwkJCQlOVUxMLCBVMV9UUF9BQlNfTU9ERSB8IFUxX1NQX0FCU19NT0RFLCBmYWxzZSk7CiB9CiAKIHN0YXRpYyBpbnQgYWxwc19wb3N0X3Jlc3VtZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKIHsKIAlyZXR1cm4gdTFfcmVhZF93cml0ZV9yZWdpc3RlcihoZGV2LCBBRERSRVNTX1UxX0RFVl9DVFJMXzEsCi0JCQkJTlVMTCwgVTFfVFBfQUJTX01PREUsIGZhbHNlKTsKKwkJCQlOVUxMLCBVMV9UUF9BQlNfTU9ERSB8IFUxX1NQX0FCU19NT0RFLCBmYWxzZSk7CiB9CiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKQEAgLTM4Myw3ICszODQsNyBAQAogCiAJCWlucHV0MiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCQlpZiAoIWlucHV0MikgewotCQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQyKTsKKwkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIApAQCAtNDI1LDcgKzQyNiw4IEBACiAJCV9fc2V0X2JpdChJTlBVVF9QUk9QX1BPSU5URVIsIGlucHV0Mi0+cHJvcGJpdCk7CiAJCV9fc2V0X2JpdChJTlBVVF9QUk9QX1BPSU5USU5HX1NUSUNLLCBpbnB1dDItPnByb3BiaXQpOwogCi0JCWlmIChpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+aW5wdXQyKSkgeworCQlyZXQgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoZGF0YS0+aW5wdXQyKTsKKwkJaWYgKHJldCkgewogCQkJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXQyKTsKIAkJCWdvdG8gZXhpdDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKaW5kZXggMDhmNTNjNy4uMmI4OWM3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWNvcmUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCkBAIC03MjcsNiArNzI3LDcgQEAKIAkgICAgKGhpZC0+cHJvZHVjdCA9PSBVU0JfREVWSUNFX0lEX01TX1RZUEVfQ09WRVJfUFJPXzMgfHwKIAkgICAgIGhpZC0+cHJvZHVjdCA9PSBVU0JfREVWSUNFX0lEX01TX1RZUEVfQ09WRVJfUFJPXzNfMiB8fAogCSAgICAgaGlkLT5wcm9kdWN0ID09IFVTQl9ERVZJQ0VfSURfTVNfVFlQRV9DT1ZFUl9QUk9fM19KUCB8fAorCSAgICAgaGlkLT5wcm9kdWN0ID09IFVTQl9ERVZJQ0VfSURfTVNfVFlQRV9DT1ZFUl9QUk9fNF9KUCB8fAogCSAgICAgaGlkLT5wcm9kdWN0ID09IFVTQl9ERVZJQ0VfSURfTVNfVFlQRV9DT1ZFUl8zIHx8CiAJICAgICBoaWQtPnByb2R1Y3QgPT0gVVNCX0RFVklDRV9JRF9NU19QT1dFUl9DT1ZFUikgJiYKIAkgICAgaGlkLT5ncm91cCA9PSBISURfR1JPVVBfTVVMVElUT1VDSCkKQEAgLTE5MTYsNyArMTkxNyw3IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tZRSwgVVNCX0RFVklDRV9JRF9LWUVfRVJHT181MjVWKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9LWUUsIFVTQl9ERVZJQ0VfSURfS1lFX0VBU1lQRU5fSTQwNVgpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tZRSwgVVNCX0RFVklDRV9JRF9LWUVfTU9VU0VQRU5fSTYwOFgpIH0sCi0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tZRSwgVVNCX0RFVklDRV9JRF9LWUVfTU9VU0VQRU5fSTYwOFhfMikgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfS1lFLCBVU0JfREVWSUNFX0lEX0tZRV9NT1VTRVBFTl9JNjA4WF9WMikgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfS1lFLCBVU0JfREVWSUNFX0lEX0tZRV9FQVNZUEVOX002MTBYKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9LWUUsIFVTQl9ERVZJQ0VfSURfS1lFX1BFTlNLRVRDSF9NOTEyKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MQUJURUMsIFVTQl9ERVZJQ0VfSURfTEFCVEVDX1dJUkVMRVNTX0tFWUJPQVJEKSB9LApAQCAtMTk4Miw2ICsxOTgzLDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX1RZUEVfQ09WRVJfUFJPXzMpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19UWVBFX0NPVkVSX1BST18zXzIpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19UWVBFX0NPVkVSX1BST18zX0pQKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfVFlQRV9DT1ZFUl9QUk9fNF9KUCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX1RZUEVfQ09WRVJfMykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX0RJR0lUQUxfTUVESUFfN0spIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19ESUdJVEFMX01FRElBXzYwMCkgfSwKQEAgLTIwMzcsNiArMjAzOSw3IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NBSVRFSywgVVNCX0RFVklDRV9JRF9TQUlURUtfUFMxMDAwKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TQUlURUssIFVTQl9ERVZJQ0VfSURfU0FJVEVLX1JBVDdfT0xEKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TQUlURUssIFVTQl9ERVZJQ0VfSURfU0FJVEVLX1JBVDcpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NBSVRFSywgVVNCX0RFVklDRV9JRF9TQUlURUtfUkFUOSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU0FJVEVLLCBVU0JfREVWSUNFX0lEX1NBSVRFS19NTU83KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NQURDQVRaLCBVU0JfREVWSUNFX0lEX01BRENBVFpfUkFUNSkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUFEQ0FUWiwgVVNCX0RFVklDRV9JRF9NQURDQVRaX1JBVDkpIH0sCkBAIC0yMDgzLDYgKzIwODYsMTEgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9XUDEwNjIpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19XSVJFTEVTU19UQUJMRVRfVFdITDg1MCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX1RBQkxFVF9UV0hBNjApIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfWUlZTk9WQV9UQUJMRVQpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUdFRV9UQUJMRVRfODEpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUdFRV9UQUJMRVRfNDUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19EUkFXSU1BR0VfRzMpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1VHVElaRVIsIFVTQl9ERVZJQ0VfSURfVUdUSVpFUl9UQUJMRVRfR1AwNjEwKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfU01BUlRKT1lfUExVUykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEX1NVUEVSX0pPWV9CT1hfMykgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEX0RVQUxfVVNCX0pPWVBBRCkgfSwKQEAgLTI0ODAsNyArMjQ4OCw3IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1BBTkpJVCwgMHgwMDA0KSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9QSElMSVBTLCBVU0JfREVWSUNFX0lEX1BISUxJUFNfSUVFRTgwMjE1NF9ET05HTEUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1BPV0VSQ09NLCBVU0JfREVWSUNFX0lEX1BPV0VSQ09NX1VQUykgfSwKLSNpZiBkZWZpbmVkKENPTkZJR19NT1VTRV9TWU5BUFRJQ1NfVVNCKSB8fCBkZWZpbmVkKENPTkZJR19NT1VTRV9TWU5BUFRJQ1NfVVNCX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19NT1VTRV9TWU5BUFRJQ1NfVVNCKQogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TWU5BUFRJQ1MsIFVTQl9ERVZJQ0VfSURfU1lOQVBUSUNTX1RQKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TWU5BUFRJQ1MsIFVTQl9ERVZJQ0VfSURfU1lOQVBUSUNTX0lOVF9UUCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU1lOQVBUSUNTLCBVU0JfREVWSUNFX0lEX1NZTkFQVElDU19DUEFEKSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCmluZGV4IDRlZDlhNGYuLmNkNTljNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKQEAgLTI2OCw2ICsyNjgsNyBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPUlNBSVJfSzk1UkdCICAgIDB4MWIxMQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPUlNBSVJfTTY1UkdCICAgIDB4MWIxMgogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPUlNBSVJfSzcwUkdCICAgIDB4MWIxMworI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPUlNBSVJfU1RSQUZFICAgIDB4MWIxNQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0NPUlNBSVJfSzY1UkdCICAgIDB4MWIxNwogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfQ1JFQVRJVkVMQUJTCTB4MDQxZQpAQCAtNTY1LDcgKzU2Niw3IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfS1lFX0dQRU5fNTYwCTB4NTAwMwogI2RlZmluZSBVU0JfREVWSUNFX0lEX0tZRV9FQVNZUEVOX0k0MDVYCTB4NTAxMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0tZRV9NT1VTRVBFTl9JNjA4WAkweDUwMTEKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9LWUVfTU9VU0VQRU5fSTYwOFhfMgkweDUwMWEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9LWUVfTU9VU0VQRU5fSTYwOFhfVjIJMHg1MDFhCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfS1lFX0VBU1lQRU5fTTYxMFgJMHg1MDEzCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfS1lFX1BFTlNLRVRDSF9NOTEyCTB4NTAxNQogCkBAIC03MTMsNiArNzE0LDcgQEAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9NU19UWVBFX0NPVkVSX1BST18zICAgIDB4MDdkYwogI2RlZmluZSBVU0JfREVWSUNFX0lEX01TX1RZUEVfQ09WRVJfUFJPXzNfMiAgMHgwN2UyCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTVNfVFlQRV9DT1ZFUl9QUk9fM19KUCAweDA3ZGQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9NU19UWVBFX0NPVkVSX1BST180X0pQIDB4MDdlOQogI2RlZmluZSBVU0JfREVWSUNFX0lEX01TX1RZUEVfQ09WRVJfMyAgICAweDA3ZGUKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9NU19QT1dFUl9DT1ZFUiAgICAgMHgwN2RhCiAKQEAgLTg1OSw2ICs4NjEsNyBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1NBSVRFS19QUzEwMDAJMHgwNjIxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfU0FJVEVLX1JBVDdfT0xECTB4MGNjYgogI2RlZmluZSBVU0JfREVWSUNFX0lEX1NBSVRFS19SQVQ3CTB4MGNkNworI2RlZmluZSBVU0JfREVWSUNFX0lEX1NBSVRFS19SQVQ5CTB4MGNmYQogI2RlZmluZSBVU0JfREVWSUNFX0lEX1NBSVRFS19NTU83CTB4MGNkMAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfU0FNU1VORwkJMHgwNDE5CkBAIC05OTYsNiArOTk5LDEwIEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfV1AxMDYyCTB4MDA2NAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfV0lSRUxFU1NfVEFCTEVUX1RXSEw4NTAJMHgwNTIyCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfVFdIQTYwCTB4MDc4MQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfRFJBV0lNQUdFX0czCTB4MzAzMQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1VHRUVfVEFCTEVUXzgxCQkweDAwODEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9VR0VFX1RBQkxFVF80NQkJMHgwMDQ1CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfWUlZTk9WQV9UQUJMRVQJCTB4MDA0ZAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfVU5JVEVDCTB4MjI3ZAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1VOSVRFQ19VU0JfVE9VQ0hfMDcwOQkweDA3MDkKQEAgLTEwODUsNCArMTA5Miw3IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUkFQSE5FVF8yTkVTMlNORVMJMHgwMDAyCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfUkFQSE5FVF80TkVTNFNORVMJMHgwMDAzCiAKKyNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9VR1RJWkVSCQkJMHgyMTc5CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUdUSVpFUl9UQUJMRVRfR1AwNjEwCTB4MDA1MworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jIGIvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKaW5kZXggYmNmYWYzMi4uZmI5YWNlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWlucHV0LmMKQEAgLTYwNCw2ICs2MDQsMTUgQEAKIAkJCWJyZWFrOwogCQl9CiAKKwkJLyoKKwkJICogU29tZSBsYXp5IHZlbmRvcnMgZGVjbGFyZSAyNTUgdXNhZ2VzIGZvciBTeXN0ZW0gQ29udHJvbCwKKwkJICogbGVhZGluZyB0byB0aGUgY3JlYXRpb24gb2YgQUJTX1h8WSBheGlzIGFuZCB0b28gbWFueSBvdGhlcnMuCisJCSAqIEl0IHdvdWxkbid0IGJlIGEgcHJvYmxlbSBpZiBqb3lkZXYgZG9lc24ndCBjb25zaWRlciB0aGUKKwkJICogZGV2aWNlIGFzIGEgam95c3RpY2sgdGhlbi4KKwkJICovCisJCWlmIChmaWVsZC0+YXBwbGljYXRpb24gPT0gSElEX0dEX1NZU1RFTV9DT05UUk9MKQorCQkJZ290byBpZ25vcmU7CisKIAkJaWYgKCh1c2FnZS0+aGlkICYgMHhmMCkgPT0gMHg5MCkgewkvKiBELXBhZCAqLwogCQkJc3dpdGNoICh1c2FnZS0+aGlkKSB7CiAJCQljYXNlIEhJRF9HRF9VUDoJICAgdXNhZ2UtPmhhdF9kaXIgPSAxOyBicmVhazsKQEAgLTk1Myw2ICs5NjIsNyBAQAogCWNhc2UgSElEX1VQX0hQVkVORE9SMjoKIAkJc2V0X2JpdChFVl9SRVAsIGlucHV0LT5ldmJpdCk7CiAJCXN3aXRjaCAodXNhZ2UtPmhpZCAmIEhJRF9VU0FHRSkgeworCQljYXNlIDB4MDAxOiBtYXBfa2V5X2NsZWFyKEtFWV9NSUNNVVRFKTsJCWJyZWFrOwogCQljYXNlIDB4MDAzOiBtYXBfa2V5X2NsZWFyKEtFWV9CUklHSFRORVNTRE9XTik7CWJyZWFrOwogCQljYXNlIDB4MDA0OiBtYXBfa2V5X2NsZWFyKEtFWV9CUklHSFRORVNTVVApOwlicmVhazsKIAkJZGVmYXVsdDogICAgZ290byBpZ25vcmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQta3llLmMgYi9kcml2ZXJzL2hpZC9oaWQta3llLmMKaW5kZXggMzJlNmQ4ZC4uMGRkMTE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWt5ZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1reWUuYwpAQCAtMTksMTEgKzE5LDYgQEAKIAogI2luY2x1ZGUgImhpZC1pZHMuaCIKIAotLyoKLSAqIFNlZSBFYXN5UGVuIGk0MDVYIGRlc2NyaXB0aW9uLCBkZXZpY2UgYW5kIEhJRCByZXBvcnQgZGVzY3JpcHRvcnMgYXQKLSAqIGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvZGlnaW1lbmQvP3RpdGxlPUtZRV9FYXN5UGVuX2k0MDVYCi0gKi8KLQogLyogT3JpZ2luYWwgRWFzeVBlbiBpNDA1WCByZXBvcnQgZGVzY3JpcHRvciBzaXplICovCiAjZGVmaW5lIEVBU1lQRU5fSTQwNVhfUkRFU0NfT1JJR19TSVpFCTQ3NgogCkBAIC04MiwxMSArNzcsNiBAQAogCTB4QzAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICovCiB9OwogCi0vKgotICogU2VlIE1vdXNlUGVuIGk2MDhYIGRlc2NyaXB0aW9uLCBkZXZpY2UgYW5kIEhJRCByZXBvcnQgZGVzY3JpcHRvcnMgYXQKLSAqIGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvZGlnaW1lbmQvP3RpdGxlPUtZRV9Nb3VzZVBlbl9pNjA4WAotICovCi0KIC8qIE9yaWdpbmFsIE1vdXNlUGVuIGk2MDhYIHJlcG9ydCBkZXNjcmlwdG9yIHNpemUgKi8KICNkZWZpbmUgTU9VU0VQRU5fSTYwOFhfUkRFU0NfT1JJR19TSVpFCTQ3NgogCkBAIC0xODYsMTAgKzE3NiwxMDQgQEAKIAkweEMwICAgICAgICAgICAgICAvKiAgRW5kIENvbGxlY3Rpb24gICAgICAgICAgICAgICAgICAqLwogfTsKIAotLyoKLSAqIFNlZSBFYXN5UGVuIE02MTBYIGRlc2NyaXB0aW9uLCBkZXZpY2UgYW5kIEhJRCByZXBvcnQgZGVzY3JpcHRvcnMgYXQKLSAqIGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvZGlnaW1lbmQvP3RpdGxlPUtZRV9FYXN5UGVuX002MTBYCi0gKi8KKy8qIE9yaWdpbmFsIE1vdXNlUGVuIGk2MDhYIHYyIHJlcG9ydCBkZXNjcmlwdG9yIHNpemUgKi8KKyNkZWZpbmUgTU9VU0VQRU5fSTYwOFhfVjJfUkRFU0NfT1JJR19TSVpFCTQ4MgorCisvKiBGaXhlZCBNb3VzZVBlbiBpNjA4WCB2MiByZXBvcnQgZGVzY3JpcHRvciAqLworc3RhdGljIF9fdTggbW91c2VwZW5faTYwOHhfdjJfcmRlc2NfZml4ZWRbXSA9IHsKKwkweDA2LCAweDAwLCAweEZGLCAgICAgICAgICAgICAvKiAgVXNhZ2UgUGFnZSAoRkYwMGgpLCAgICAgICAgICAgICAqLworCTB4MDksIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICBVc2FnZSAoMDFoKSwgICAgICAgICAgICAgICAgICAgICovCisJMHhBMSwgMHgwMSwgICAgICAgICAgICAgICAgICAgLyogIENvbGxlY3Rpb24gKEFwcGxpY2F0aW9uKSwgICAgICAgKi8KKwkweDg1LCAweDA1LCAgICAgICAgICAgICAgICAgICAvKiAgICBSZXBvcnQgSUQgKDUpLCAgICAgICAgICAgICAgICAqLworCTB4MDksIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICAgIFVzYWdlICgwMWgpLCAgICAgICAgICAgICAgICAgICovCisJMHgxNSwgMHg4MCwgICAgICAgICAgICAgICAgICAgLyogICAgTG9naWNhbCBNaW5pbXVtICgtMTI4KSwgICAgICAgKi8KKwkweDI1LCAweDdGLCAgICAgICAgICAgICAgICAgICAvKiAgICBMb2dpY2FsIE1heGltdW0gKDEyNyksICAgICAgICAqLworCTB4NzUsIDB4MDgsICAgICAgICAgICAgICAgICAgIC8qICAgIFJlcG9ydCBTaXplICg4KSwgICAgICAgICAgICAgICovCisJMHg5NSwgMHgwNywgICAgICAgICAgICAgICAgICAgLyogICAgUmVwb3J0IENvdW50ICg3KSwgICAgICAgICAgICAgKi8KKwkweEIxLCAweDAyLCAgICAgICAgICAgICAgICAgICAvKiAgICBGZWF0dXJlIChWYXJpYWJsZSksICAgICAgICAgICAqLworCTB4QzAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiwgICAgICAgICAgICAgICAgICovCisJMHgwNSwgMHgwRCwgICAgICAgICAgICAgICAgICAgLyogIFVzYWdlIFBhZ2UgKERpZ2l0aXplciksICAgICAgICAgKi8KKwkweDA5LCAweDAyLCAgICAgICAgICAgICAgICAgICAvKiAgVXNhZ2UgKFBlbiksICAgICAgICAgICAgICAgICAgICAqLworCTB4QTEsIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICBDb2xsZWN0aW9uIChBcHBsaWNhdGlvbiksICAgICAgICovCisJMHg4NSwgMHgxMCwgICAgICAgICAgICAgICAgICAgLyogICAgUmVwb3J0IElEICgxNiksICAgICAgICAgICAgICAgKi8KKwkweDA5LCAweDIwLCAgICAgICAgICAgICAgICAgICAvKiAgICBVc2FnZSAoU3R5bHVzKSwgICAgICAgICAgICAgICAqLworCTB4QTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIENvbGxlY3Rpb24gKFBoeXNpY2FsKSwgICAgICAgICovCisJMHgxNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBMb2dpY2FsIE1pbmltdW0gKDApLCAgICAgICAgKi8KKwkweDI1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoMSksICAgICAgICAqLworCTB4NzUsIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVwb3J0IFNpemUgKDEpLCAgICAgICAgICAgICovCisJMHgwOSwgMHg0MiwgICAgICAgICAgICAgICAgICAgLyogICAgICBVc2FnZSAoVGlwIFN3aXRjaCksICAgICAgICAgKi8KKwkweDA5LCAweDQ0LCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFVzYWdlIChCYXJyZWwgU3dpdGNoKSwgICAgICAqLworCTB4MDksIDB4NDYsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgKFRhYmxldCBQaWNrKSwgICAgICAgICovCisJMHg5NSwgMHgwMywgICAgICAgICAgICAgICAgICAgLyogICAgICBSZXBvcnQgQ291bnQgKDMpLCAgICAgICAgICAgKi8KKwkweDgxLCAweDAyLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAqLworCTB4OTUsIDB4MDQsICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVwb3J0IENvdW50ICg0KSwgICAgICAgICAgICovCisJMHg4MSwgMHgwMywgICAgICAgICAgICAgICAgICAgLyogICAgICBJbnB1dCAoQ29uc3RhbnQsIFZhcmlhYmxlKSwgKi8KKwkweDA5LCAweDMyLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFVzYWdlIChJbiBSYW5nZSksICAgICAgICAgICAqLworCTB4OTUsIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVwb3J0IENvdW50ICgxKSwgICAgICAgICAgICovCisJMHg4MSwgMHgwMiwgICAgICAgICAgICAgICAgICAgLyogICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgKi8KKwkweDc1LCAweDEwLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBTaXplICgxNiksICAgICAgICAgICAqLworCTB4OTUsIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVwb3J0IENvdW50ICgxKSwgICAgICAgICAgICovCisJMHhBNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBQdXNoLCAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkweDA1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFVzYWdlIFBhZ2UgKERlc2t0b3ApLCAgICAgICAqLworCTB4NTUsIDB4RkQsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVW5pdCBFeHBvbmVudCAoLTMpLCAgICAgICAgICovCisJMHg2NSwgMHgxMywgICAgICAgICAgICAgICAgICAgLyogICAgICBVbml0IChJbmNoKSwgICAgICAgICAgICAgICAgKi8KKwkweDM0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFBoeXNpY2FsIE1pbmltdW0gKDApLCAgICAgICAqLworCTB4MDksIDB4MzAsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgKFgpLCAgICAgICAgICAgICAgICAgICovCisJMHg0NiwgMHg0MCwgMHgxRiwgICAgICAgICAgICAgLyogICAgICBQaHlzaWNhbCBNYXhpbXVtICg4MDAwKSwgICAgKi8KKwkweDI3LCAweDAwLCAweEEwLCAweDAwLCAweDAwLCAvKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoNDA5NjApLCAgICAqLworCTB4ODEsIDB4MDIsICAgICAgICAgICAgICAgICAgIC8qICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisJMHgwOSwgMHgzMSwgICAgICAgICAgICAgICAgICAgLyogICAgICBVc2FnZSAoWSksICAgICAgICAgICAgICAgICAgKi8KKwkweDQ2LCAweDcwLCAweDE3LCAgICAgICAgICAgICAvKiAgICAgIFBoeXNpY2FsIE1heGltdW0gKDYwMDApLCAgICAqLworCTB4MjYsIDB4MDAsIDB4NzgsICAgICAgICAgICAgIC8qICAgICAgTG9naWNhbCBNYXhpbXVtICgzMDcyMCksICAgICovCisJMHg4MSwgMHgwMiwgICAgICAgICAgICAgICAgICAgLyogICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgKi8KKwkweEI0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFBvcCwgICAgICAgICAgICAgICAgICAgICAgICAqLworCTB4MDksIDB4MzAsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgKFRpcCBQcmVzc3VyZSksICAgICAgICovCisJMHgyNiwgMHhGRiwgMHgwNywgICAgICAgICAgICAgLyogICAgICBMb2dpY2FsIE1heGltdW0gKDIwNDcpLCAgICAgKi8KKwkweDgxLCAweDAyLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAqLworCTB4QzAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIEVuZCBDb2xsZWN0aW9uLCAgICAgICAgICAgICAgICovCisJMHhDMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogIEVuZCBDb2xsZWN0aW9uLCAgICAgICAgICAgICAgICAgKi8KKwkweDA1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgVXNhZ2UgUGFnZSAoRGVza3RvcCksICAgICAgICAgICAqLworCTB4MDksIDB4MDIsICAgICAgICAgICAgICAgICAgIC8qICBVc2FnZSAoTW91c2UpLCAgICAgICAgICAgICAgICAgICovCisJMHhBMSwgMHgwMSwgICAgICAgICAgICAgICAgICAgLyogIENvbGxlY3Rpb24gKEFwcGxpY2F0aW9uKSwgICAgICAgKi8KKwkweDg1LCAweDExLCAgICAgICAgICAgICAgICAgICAvKiAgICBSZXBvcnQgSUQgKDE3KSwgICAgICAgICAgICAgICAqLworCTB4MDksIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICAgIFVzYWdlIChQb2ludGVyKSwgICAgICAgICAgICAgICovCisJMHhBMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgQ29sbGVjdGlvbiAoUGh5c2ljYWwpLCAgICAgICAgKi8KKwkweDE0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIExvZ2ljYWwgTWluaW11bSAoMCksICAgICAgICAqLworCTB4QTQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUHVzaCwgICAgICAgICAgICAgICAgICAgICAgICovCisJMHgwNSwgMHgwOSwgICAgICAgICAgICAgICAgICAgLyogICAgICBVc2FnZSBQYWdlIChCdXR0b24pLCAgICAgICAgKi8KKwkweDc1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBTaXplICgxKSwgICAgICAgICAgICAqLworCTB4MTksIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgTWluaW11bSAoMDFoKSwgICAgICAgICovCisJMHgyOSwgMHgwMywgICAgICAgICAgICAgICAgICAgLyogICAgICBVc2FnZSBNYXhpbXVtICgwM2gpLCAgICAgICAgKi8KKwkweDI1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoMSksICAgICAgICAqLworCTB4OTUsIDB4MDMsICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVwb3J0IENvdW50ICgzKSwgICAgICAgICAgICovCisJMHg4MSwgMHgwMiwgICAgICAgICAgICAgICAgICAgLyogICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgKi8KKwkweDk1LCAweDA1LCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBDb3VudCAoNSksICAgICAgICAgICAqLworCTB4ODEsIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICAgICAgSW5wdXQgKENvbnN0YW50KSwgICAgICAgICAgICovCisJMHhCNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBQb3AsICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkweDk1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBDb3VudCAoMSksICAgICAgICAgICAqLworCTB4QTQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUHVzaCwgICAgICAgICAgICAgICAgICAgICAgICovCisJMHg1NSwgMHhGRCwgICAgICAgICAgICAgICAgICAgLyogICAgICBVbml0IEV4cG9uZW50ICgtMyksICAgICAgICAgKi8KKwkweDY1LCAweDEzLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFVuaXQgKEluY2gpLCAgICAgICAgICAgICAgICAqLworCTB4MzQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUGh5c2ljYWwgTWluaW11bSAoMCksICAgICAgICovCisJMHg3NSwgMHgxMCwgICAgICAgICAgICAgICAgICAgLyogICAgICBSZXBvcnQgU2l6ZSAoMTYpLCAgICAgICAgICAgKi8KKwkweDA5LCAweDMwLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFVzYWdlIChYKSwgICAgICAgICAgICAgICAgICAqLworCTB4NDYsIDB4NDAsIDB4MUYsICAgICAgICAgICAgIC8qICAgICAgUGh5c2ljYWwgTWF4aW11bSAoODAwMCksICAgICovCisJMHgyNywgMHgwMCwgMHhBMCwgMHgwMCwgMHgwMCwgLyogICAgICBMb2dpY2FsIE1heGltdW0gKDQwOTYwKSwgICAgKi8KKwkweDgxLCAweDAyLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAqLworCTB4MDksIDB4MzEsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgKFkpLCAgICAgICAgICAgICAgICAgICovCisJMHg0NiwgMHg3MCwgMHgxNywgICAgICAgICAgICAgLyogICAgICBQaHlzaWNhbCBNYXhpbXVtICg2MDAwKSwgICAgKi8KKwkweDI2LCAweDAwLCAweDc4LCAgICAgICAgICAgICAvKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoMzA3MjApLCAgICAqLworCTB4ODEsIDB4MDIsICAgICAgICAgICAgICAgICAgIC8qICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisJMHhCNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBQb3AsICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkweDc1LCAweDA4LCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBTaXplICg4KSwgICAgICAgICAgICAqLworCTB4MDksIDB4MzgsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgKFdoZWVsKSwgICAgICAgICAgICAgICovCisJMHgxNSwgMHhGRiwgICAgICAgICAgICAgICAgICAgLyogICAgICBMb2dpY2FsIE1pbmltdW0gKC0xKSwgICAgICAgKi8KKwkweDI1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoMSksICAgICAgICAqLworCTB4ODEsIDB4MDYsICAgICAgICAgICAgICAgICAgIC8qICAgICAgSW5wdXQgKFZhcmlhYmxlLCBSZWxhdGl2ZSksICovCisJMHg4MSwgMHgwMSwgICAgICAgICAgICAgICAgICAgLyogICAgICBJbnB1dCAoQ29uc3RhbnQpLCAgICAgICAgICAgKi8KKwkweEMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBFbmQgQ29sbGVjdGlvbiwgICAgICAgICAgICAgICAqLworCTB4QzAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICovCit9OwogCiAvKiBPcmlnaW5hbCBFYXN5UGVuIE02MTBYIHJlcG9ydCBkZXNjcmlwdG9yIHNpemUgKi8KICNkZWZpbmUgRUFTWVBFTl9NNjEwWF9SREVTQ19PUklHX1NJWkUJNDc2CkBAIC00NTQsMTIgKzUzOCwxNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgVVNCX0RFVklDRV9JRF9LWUVfTU9VU0VQRU5fSTYwOFg6Ci0JY2FzZSBVU0JfREVWSUNFX0lEX0tZRV9NT1VTRVBFTl9JNjA4WF8yOgogCQlpZiAoKnJzaXplID09IE1PVVNFUEVOX0k2MDhYX1JERVNDX09SSUdfU0laRSkgewogCQkJcmRlc2MgPSBtb3VzZXBlbl9pNjA4eF9yZGVzY19maXhlZDsKIAkJCSpyc2l6ZSA9IHNpemVvZihtb3VzZXBlbl9pNjA4eF9yZGVzY19maXhlZCk7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBVU0JfREVWSUNFX0lEX0tZRV9NT1VTRVBFTl9JNjA4WF9WMjoKKwkJaWYgKCpyc2l6ZSA9PSBNT1VTRVBFTl9JNjA4WF9WMl9SREVTQ19PUklHX1NJWkUpIHsKKwkJCXJkZXNjID0gbW91c2VwZW5faTYwOHhfdjJfcmRlc2NfZml4ZWQ7CisJCQkqcnNpemUgPSBzaXplb2YobW91c2VwZW5faTYwOHhfdjJfcmRlc2NfZml4ZWQpOworCQl9CisJCWJyZWFrOwogCWNhc2UgVVNCX0RFVklDRV9JRF9LWUVfRUFTWVBFTl9NNjEwWDoKIAkJaWYgKCpyc2l6ZSA9PSBFQVNZUEVOX002MTBYX1JERVNDX09SSUdfU0laRSkgewogCQkJcmRlc2MgPSBlYXN5cGVuX202MTB4X3JkZXNjX2ZpeGVkOwpAQCAtNTUzLDcgKzY0Miw3IEBACiAJc3dpdGNoIChpZC0+cHJvZHVjdCkgewogCWNhc2UgVVNCX0RFVklDRV9JRF9LWUVfRUFTWVBFTl9JNDA1WDoKIAljYXNlIFVTQl9ERVZJQ0VfSURfS1lFX01PVVNFUEVOX0k2MDhYOgotCWNhc2UgVVNCX0RFVklDRV9JRF9LWUVfTU9VU0VQRU5fSTYwOFhfMjoKKwljYXNlIFVTQl9ERVZJQ0VfSURfS1lFX01PVVNFUEVOX0k2MDhYX1YyOgogCWNhc2UgVVNCX0RFVklDRV9JRF9LWUVfRUFTWVBFTl9NNjEwWDoKIAljYXNlIFVTQl9ERVZJQ0VfSURfS1lFX1BFTlNLRVRDSF9NOTEyOgogCQlyZXQgPSBreWVfdGFibGV0X2VuYWJsZShoZGV2KTsKQEAgLTU4Niw3ICs2NzUsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9LWUUsCiAJCQkJVVNCX0RFVklDRV9JRF9LWUVfTU9VU0VQRU5fSTYwOFgpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tZRSwKLQkJCQlVU0JfREVWSUNFX0lEX0tZRV9NT1VTRVBFTl9JNjA4WF8yKSB9LAorCQkJCVVTQl9ERVZJQ0VfSURfS1lFX01PVVNFUEVOX0k2MDhYX1YyKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9LWUUsCiAJCQkJVVNCX0RFVklDRV9JRF9LWUVfRUFTWVBFTl9NNjEwWCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfS1lFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwppbmRleCBmZWIyYmU3Li43NmY2NDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGcuYwpAQCAtNDksNiArNDksNyBAQAogI2RlZmluZSBGVl9SREVTQ19PUklHX1NJWkUJMTMwCiAjZGVmaW5lIE1PTU9fUkRFU0NfT1JJR19TSVpFCTg3CiAjZGVmaW5lIE1PTU8yX1JERVNDX09SSUdfU0laRQk4NworI2RlZmluZSBGRkdfUkRFU0NfT1JJR19TSVpFCTg1CiAKIC8qIEZpeGVkIHJlcG9ydCBkZXNjcmlwdG9ycyBmb3IgTG9naXRlY2ggRHJpdmluZyBGb3JjZSAoYW5kIFBybykKICAqIHdoZWVsIGNvbnRyb2xsZXJzCkBAIC0zMzQsNiArMzM1LDUyIEBACiAweEMwICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLwogfTsKIAorc3RhdGljIF9fdTggZmZnX3JkZXNjX2ZpeGVkW10gPSB7CisweDA1LCAweDAxLCAgICAgICAgIC8qICBVc2FnZSBQYWdlIChEZXNrdG9wKSwgICAgICAgICAgICAgICAqLworMHgwOSwgMHgwNCwgICAgICAgICAvKiAgVXNhZ2UgKEpveXN0aWspLCAgICAgICAgICAgICAgICAgICAgKi8KKzB4QTEsIDB4MDEsICAgICAgICAgLyogIENvbGxlY3Rpb24gKEFwcGxpY2F0aW9uKSwgICAgICAgICAgICovCisweEExLCAweDAyLCAgICAgICAgIC8qICAgICAgQ29sbGVjdGlvbiAoTG9naWNhbCksICAgICAgICAgICAqLworMHg5NSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgQ291bnQgKDEpLCAgICAgICAgICAgKi8KKzB4NzUsIDB4MEEsICAgICAgICAgLyogICAgICAgICAgUmVwb3J0IFNpemUgKDEwKSwgICAgICAgICAgICovCisweDE1LCAweDAwLCAgICAgICAgIC8qICAgICAgICAgIExvZ2ljYWwgTWluaW11bSAoMCksICAgICAgICAqLworMHgyNiwgMHhGRiwgMHgwMywgICAvKiAgICAgICAgICBMb2dpY2FsIE1heGltdW0gKDEwMjMpLCAgICAgKi8KKzB4MzUsIDB4MDAsICAgICAgICAgLyogICAgICAgICAgUGh5c2ljYWwgTWluaW11bSAoMCksICAgICAgICovCisweDQ2LCAweEZGLCAweDAzLCAgIC8qICAgICAgICAgIFBoeXNpY2FsIE1heGltdW0gKDEwMjMpLCAgICAqLworMHgwOSwgMHgzMCwgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoWCksICAgICAgICAgICAgICAgICAgKi8KKzB4ODEsIDB4MDIsICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisweDk1LCAweDA2LCAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBDb3VudCAoNiksICAgICAgICAgICAqLworMHg3NSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgU2l6ZSAoMSksICAgICAgICAgICAgKi8KKzB4MjUsIDB4MDEsICAgICAgICAgLyogICAgICAgICAgTG9naWNhbCBNYXhpbXVtICgxKSwgICAgICAgICovCisweDQ1LCAweDAxLCAgICAgICAgIC8qICAgICAgICAgIFBoeXNpY2FsIE1heGltdW0gKDEpLCAgICAgICAqLworMHgwNSwgMHgwOSwgICAgICAgICAvKiAgICAgICAgICBVc2FnZSBQYWdlIChCdXR0b24pLCAgICAgICAgKi8KKzB4MTksIDB4MDEsICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgTWluaW11bSAoMDFoKSwgICAgICAgICovCisweDI5LCAweDA2LCAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIE1heGltdW0gKDA2aCksICAgICAgICAqLworMHg4MSwgMHgwMiwgICAgICAgICAvKiAgICAgICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgKi8KKzB4OTUsIDB4MDEsICAgICAgICAgLyogICAgICAgICAgUmVwb3J0IENvdW50ICgxKSwgICAgICAgICAgICovCisweDc1LCAweDA4LCAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBTaXplICg4KSwgICAgICAgICAgICAqLworMHgyNiwgMHhGRiwgMHgwMCwgICAvKiAgICAgICAgICBMb2dpY2FsIE1heGltdW0gKDI1NSksICAgICAgKi8KKzB4NDYsIDB4RkYsIDB4MDAsICAgLyogICAgICAgICAgUGh5c2ljYWwgTWF4aW11bSAoMjU1KSwgICAgICovCisweDA2LCAweDAwLCAweEZGLCAgIC8qICAgICAgICAgIFVzYWdlIFBhZ2UgKEZGMDBoKSwgICAgICAgICAqLworMHgwOSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoMDFoKSwgICAgICAgICAgICAgICAgKi8KKzB4ODEsIDB4MDIsICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisweDA1LCAweDAxLCAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIFBhZ2UgKERlc2t0b3ApLCAgICAgICAqLworMHg4MSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBJbnB1dCAoQ29uc3RhbnQpLCAgICAgICAgICAgKi8KKzB4MDksIDB4MzEsICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgKFkpLCAgICAgICAgICAgICAgICAgICovCisweDgxLCAweDAyLCAgICAgICAgIC8qICAgICAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAqLworMHgwOSwgMHgzMiwgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoWiksICAgICAgICAgICAgICAgICAgKi8KKzB4ODEsIDB4MDIsICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisweDA2LCAweDAwLCAweEZGLCAgIC8qICAgICAgICAgIFVzYWdlIFBhZ2UgKEZGMDBoKSwgICAgICAgICAqLworMHgwOSwgMHgwMSwgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoMDFoKSwgICAgICAgICAgICAgICAgKi8KKzB4ODEsIDB4MDIsICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisweEMwLCAgICAgICAgICAgICAgIC8qICAgICAgRW5kIENvbGxlY3Rpb24sICAgICAgICAgICAgICAgICAqLworMHhBMSwgMHgwMiwgICAgICAgICAvKiAgICAgIENvbGxlY3Rpb24gKExvZ2ljYWwpLCAgICAgICAgICAgKi8KKzB4MDksIDB4MDIsICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgKDAyaCksICAgICAgICAgICAgICAgICovCisweDk1LCAweDA3LCAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBDb3VudCAoNyksICAgICAgICAgICAqLworMHg5MSwgMHgwMiwgICAgICAgICAvKiAgICAgICAgICBPdXRwdXQgKFZhcmlhYmxlKSwgICAgICAgICAgKi8KKzB4QzAsICAgICAgICAgICAgICAgLyogICAgICBFbmQgQ29sbGVjdGlvbiwgICAgICAgICAgICAgICAgICovCisweEMwICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKwogLyoKICAqIENlcnRhaW4gTG9naXRlY2gga2V5Ym9hcmRzIHNlbmQgaW4gcmVwb3J0ICMzIGtleXMgd2hpY2ggYXJlIGZhcgogICogYWJvdmUgdGhlIGxvZ2ljYWwgbWF4aW11bSBkZXNjcmliZWQgaW4gZGVzY3JpcHRvci4gVGhpcyBleHRlbmRzCkBAIC0zNDMsOCArMzkwLDYgQEAKIAkJdW5zaWduZWQgaW50ICpyc2l6ZSkKIHsKIAlzdHJ1Y3QgbGdfZHJ2X2RhdGEgKmRydl9kYXRhID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOwotCXN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKnVkZXNjOwotCV9fdTE2IGJjZERldmljZSwgcmV2X21haiwgcmV2X21pbjsKIAogCWlmICgoZHJ2X2RhdGEtPnF1aXJrcyAmIExHX1JERVNDKSAmJiAqcnNpemUgPj0gOTEgJiYgcmRlc2NbODNdID09IDB4MjYgJiYKIAkJCXJkZXNjWzg0XSA9PSAweDhjICYmIHJkZXNjWzg1XSA9PSAweDAyKSB7CkBAIC0zNjMsMjAgKzQwOCwxOCBAQAogCiAJc3dpdGNoIChoZGV2LT5wcm9kdWN0KSB7CiAKKwljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0lOR01BTl9GRkc6CisJCWlmICgqcnNpemUgPT0gRkZHX1JERVNDX09SSUdfU0laRSkgeworCQkJaGlkX2luZm8oaGRldiwKKwkJCQkiZml4aW5nIHVwIExvZ2l0ZWNoIFdpbmdtYW4gRm9ybXVsYSBGb3JjZSBHUCByZXBvcnQgZGVzY3JpcHRvclxuIik7CisJCQlyZGVzYyA9IGZmZ19yZGVzY19maXhlZDsKKwkJCSpyc2l6ZSA9IHNpemVvZihmZmdfcmRlc2NfZml4ZWQpOworCQl9CisJCWJyZWFrOworCiAJLyogU2V2ZXJhbCB3aGVlbHMgcmVwb3J0IGFzIHRoaXMgaWQgd2hlbiBvcGVyYXRpbmcgaW4gZW11bGF0aW9uIG1vZGUuICovCiAJY2FzZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dIRUVMOgotCQl1ZGVzYyA9ICYoaGlkX3RvX3VzYl9kZXYoaGRldiktPmRlc2NyaXB0b3IpOwotCQlpZiAoIXVkZXNjKSB7Ci0JCQloaWRfZXJyKGhkZXYsICJOVUxMIFVTQiBkZXZpY2UgZGVzY3JpcHRvclxuIik7Ci0JCQlicmVhazsKLQkJfQotCQliY2REZXZpY2UgPSBsZTE2X3RvX2NwdSh1ZGVzYy0+YmNkRGV2aWNlKTsKLQkJcmV2X21haiA9IGJjZERldmljZSA+PiA4OwotCQlyZXZfbWluID0gYmNkRGV2aWNlICYgMHhmZjsKLQotCQkvKiBVcGRhdGUgdGhlIHJlcG9ydCBkZXNjcmlwdG9yIGZvciBvbmx5IHRoZSBEcml2aW5nIEZvcmNlIHdoZWVsICovCi0JCWlmIChyZXZfbWFqID09IDEgJiYgcmV2X21pbiA9PSAyICYmCi0JCQkJKnJzaXplID09IERGX1JERVNDX09SSUdfU0laRSkgeworCQlpZiAoKnJzaXplID09IERGX1JERVNDX09SSUdfU0laRSkgewogCQkJaGlkX2luZm8oaGRldiwKIAkJCQkiZml4aW5nIHVwIExvZ2l0ZWNoIERyaXZpbmcgRm9yY2UgcmVwb3J0IGRlc2NyaXB0b3JcbiIpOwogCQkJcmRlc2MgPSBkZl9yZGVzY19maXhlZDsKQEAgLTYyMSw2ICs2NjQsNyBAQAogCQkJdXNhZ2UtPmNvZGUgPT0gQUJTX1JaKSkgewogCQlzd2l0Y2ggKGhkZXYtPnByb2R1Y3QpIHsKIAkJY2FzZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0cyOV9XSEVFTDoKKwkJY2FzZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dJTkdNQU5fRkZHOgogCQljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0hFRUw6CiAJCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9NT01PX1dIRUVMOgogCQljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfREZQX1dIRUVMOgpAQCAtNjU3LDYgKzcwMSwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGxnX3Jhd19ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCwKKwkJdTggKnJkLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbGdfZHJ2X2RhdGEgKmRydl9kYXRhID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKGRydl9kYXRhLT5xdWlya3MgJiBMR19GRjQpCisJCXJldHVybiBsZzRmZl9yYXdfZXZlbnQoaGRldiwgcmVwb3J0LCByZCwgc2l6ZSwgZHJ2X2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbGdfcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UgPSB0b191c2JfaW50ZXJmYWNlKGhkZXYtPmRldi5wYXJlbnQpOwpAQCAtODA5LDcgKzg2NCw3IEBACiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dJSV9XSEVFTCksCiAJCS5kcml2ZXJfZGF0YSA9IExHX0ZGNCB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSU5HTUFOX0ZGRyksCi0JCS5kcml2ZXJfZGF0YSA9IExHX0ZGIH0sCisJCS5kcml2ZXJfZGF0YSA9IExHX05PR0VUIHwgTEdfRkY0IH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1JVTUJMRVBBRDIpLAogCQkuZHJpdmVyX2RhdGEgPSBMR19GRjIgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRkxJR0hUX1NZU1RFTV9HOTQwKSwKQEAgLTgzMCw2ICs4ODUsNyBAQAogCS5pbnB1dF9tYXBwaW5nID0gbGdfaW5wdXRfbWFwcGluZywKIAkuaW5wdXRfbWFwcGVkID0gbGdfaW5wdXRfbWFwcGVkLAogCS5ldmVudCA9IGxnX2V2ZW50LAorCS5yYXdfZXZlbnQgPSBsZ19yYXdfZXZlbnQsCiAJLnByb2JlID0gbGdfcHJvYmUsCiAJLnJlbW92ZSA9IGxnX3JlbW92ZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuYyBiL2RyaXZlcnMvaGlkL2hpZC1sZzRmZi5jCmluZGV4IGFmM2E4ZWMuLjFmYzEyZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1sZzRmZi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1sZzRmZi5jCkBAIC03NSw2ICs3NSw3IEBACiAKIHN0cnVjdCBsZzRmZl93aGVlbF9kYXRhIHsKIAljb25zdCB1MzIgcHJvZHVjdF9pZDsKKwl1MTYgY29tYmluZTsKIAl1MTYgcmFuZ2U7CiAJY29uc3QgdTE2IG1pbl9yYW5nZTsKIAljb25zdCB1MTYgbWF4X3JhbmdlOwpAQCAtMTM2LDYgKzEzNyw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGxnNGZmX3doZWVsIGxnNGZmX2RldmljZXNbXSA9IHsKKwl7VVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSU5HTUFOX0ZGRywgbGc0ZmZfd2hlZWxfZWZmZWN0cywgNDAsIDE4MCwgTlVMTH0sCiAJe1VTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0hFRUwsICAgICAgIGxnNGZmX3doZWVsX2VmZmVjdHMsIDQwLCAyNzAsIE5VTEx9LAogCXtVU0JfREVWSUNFX0lEX0xPR0lURUNIX01PTU9fV0hFRUwsICBsZzRmZl93aGVlbF9lZmZlY3RzLCA0MCwgMjcwLCBOVUxMfSwKIAl7VVNCX0RFVklDRV9JRF9MT0dJVEVDSF9ERlBfV0hFRUwsICAgbGc0ZmZfd2hlZWxfZWZmZWN0cywgNDAsIDkwMCwgbGc0ZmZfc2V0X3JhbmdlX2RmcH0sCkBAIC0zMjgsNiArMzMwLDU2IEBACiAJfQogfQogCitpbnQgbGc0ZmZfcmF3X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0LAorCQl1OCAqcmQsIGludCBzaXplLCBzdHJ1Y3QgbGdfZHJ2X2RhdGEgKmRydl9kYXRhKQoreworCWludCBvZmZzZXQ7CisJc3RydWN0IGxnNGZmX2RldmljZV9lbnRyeSAqZW50cnkgPSBkcnZfZGF0YS0+ZGV2aWNlX3Byb3BzOworCisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuIDA7CisKKwkvKiBhZGp1c3QgSElEIHJlcG9ydCBwcmVzZW50IGNvbWJpbmVkIHBlZGFscyBkYXRhICovCisJaWYgKGVudHJ5LT53ZGF0YS5jb21iaW5lKSB7CisJCXN3aXRjaCAoZW50cnktPndkYXRhLnByb2R1Y3RfaWQpIHsKKwkJY2FzZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dIRUVMOgorCQkJcmRbNV0gPSByZFszXTsKKwkJCXJkWzZdID0gMHg3RjsKKwkJCXJldHVybiAxOworCQljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0lOR01BTl9GRkc6CisJCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9NT01PX1dIRUVMOgorCQljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTU9NT19XSEVFTDI6CisJCQlyZFs0XSA9IHJkWzNdOworCQkJcmRbNV0gPSAweDdGOworCQkJcmV0dXJuIDE7CisJCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9ERlBfV0hFRUw6CisJCQlyZFs1XSA9IHJkWzRdOworCQkJcmRbNl0gPSAweDdGOworCQkJcmV0dXJuIDE7CisJCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9HMjVfV0hFRUw6CisJCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9HMjdfV0hFRUw6CisJCQlvZmZzZXQgPSA1OworCQkJYnJlYWs7CisJCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9ERkdUX1dIRUVMOgorCQljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRzI5X1dIRUVMOgorCQkJb2Zmc2V0ID0gNjsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0lJX1dIRUVMOgorCQkJb2Zmc2V0ID0gMzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBDb21wdXRlIGEgY29tYmluZWQgYXhpcyB3aGVuIHdoZWVsIGRvZXMgbm90IHN1cHBseSBpdCAqLworCQlyZFtvZmZzZXRdID0gKDB4RkYgKyByZFtvZmZzZXRdIC0gcmRbb2Zmc2V0KzFdKSA+PiAxOworCQlyZFtvZmZzZXQrMV0gPSAweDdGOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgbGc0ZmZfaW5pdF93aGVlbF9kYXRhKHN0cnVjdCBsZzRmZl93aGVlbF9kYXRhICogY29uc3Qgd2RhdGEsIGNvbnN0IHN0cnVjdCBsZzRmZl93aGVlbCAqd2hlZWwsCiAJCQkJICBjb25zdCBzdHJ1Y3QgbGc0ZmZfbXVsdGltb2RlX3doZWVsICptbW9kZV93aGVlbCwKIAkJCQkgIGNvbnN0IHUxNiByZWFsX3Byb2R1Y3RfaWQpCkBAIC0zNDUsNiArMzk3LDcgQEAKIAl7CiAJCXN0cnVjdCBsZzRmZl93aGVlbF9kYXRhIHRfd2RhdGEgPSAgeyAucHJvZHVjdF9pZCA9IHdoZWVsLT5wcm9kdWN0X2lkLAogCQkJCQkJICAgICAucmVhbF9wcm9kdWN0X2lkID0gcmVhbF9wcm9kdWN0X2lkLAorCQkJCQkJICAgICAuY29tYmluZSA9IDAsCiAJCQkJCQkgICAgIC5taW5fcmFuZ2UgPSB3aGVlbC0+bWluX3JhbmdlLAogCQkJCQkJICAgICAubWF4X3JhbmdlID0gd2hlZWwtPm1heF9yYW5nZSwKIAkJCQkJCSAgICAgLnNldF9yYW5nZSA9IHdoZWVsLT5zZXRfcmFuZ2UsCkBAIC04ODUsNiArOTM4LDU4IEBACiB9CiBzdGF0aWMgREVWSUNFX0FUVFIoYWx0ZXJuYXRlX21vZGVzLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCwgbGc0ZmZfYWx0ZXJuYXRlX21vZGVzX3Nob3csIGxnNGZmX2FsdGVybmF0ZV9tb2Rlc19zdG9yZSk7CiAKK3N0YXRpYyBzc2l6ZV90IGxnNGZmX2NvbWJpbmVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdG9faGlkX2RldmljZShkZXYpOworCXN0cnVjdCBsZzRmZl9kZXZpY2VfZW50cnkgKmVudHJ5OworCXN0cnVjdCBsZ19kcnZfZGF0YSAqZHJ2X2RhdGE7CisJc2l6ZV90IGNvdW50OworCisJZHJ2X2RhdGEgPSBoaWRfZ2V0X2RydmRhdGEoaGlkKTsKKwlpZiAoIWRydl9kYXRhKSB7CisJCWhpZF9lcnIoaGlkLCAiUHJpdmF0ZSBkcml2ZXIgZGF0YSBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZW50cnkgPSBkcnZfZGF0YS0+ZGV2aWNlX3Byb3BzOworCWlmICghZW50cnkpIHsKKwkJaGlkX2VycihoaWQsICJEZXZpY2UgcHJvcGVydGllcyBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY291bnQgPSBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgZW50cnktPndkYXRhLmNvbWJpbmUpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgbGc0ZmZfY29tYmluZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdG9faGlkX2RldmljZShkZXYpOworCXN0cnVjdCBsZzRmZl9kZXZpY2VfZW50cnkgKmVudHJ5OworCXN0cnVjdCBsZ19kcnZfZGF0YSAqZHJ2X2RhdGE7CisJdTE2IGNvbWJpbmUgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRydl9kYXRhID0gaGlkX2dldF9kcnZkYXRhKGhpZCk7CisJaWYgKCFkcnZfZGF0YSkgeworCQloaWRfZXJyKGhpZCwgIlByaXZhdGUgZHJpdmVyIGRhdGEgbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVudHJ5ID0gZHJ2X2RhdGEtPmRldmljZV9wcm9wczsKKwlpZiAoIWVudHJ5KSB7CisJCWhpZF9lcnIoaGlkLCAiRGV2aWNlIHByb3BlcnRpZXMgbm90IGZvdW5kIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjb21iaW5lID4gMSkKKwkJY29tYmluZSA9IDE7CisKKwllbnRyeS0+d2RhdGEuY29tYmluZSA9IGNvbWJpbmU7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSKGNvbWJpbmVfcGVkYWxzLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lXR1JQIHwgU19JUk9USCwgbGc0ZmZfY29tYmluZV9zaG93LCBsZzRmZl9jb21iaW5lX3N0b3JlKTsKKwogLyogRXhwb3J0IHRoZSBjdXJyZW50bHkgc2V0IHJhbmdlIG9mIHRoZSB3aGVlbCAqLwogc3RhdGljIHNzaXplX3QgbGc0ZmZfcmFuZ2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCWNoYXIgKmJ1ZikKQEAgLTEyNTksNiArMTM2NCw5IEBACiAJfQogCiAJLyogQ3JlYXRlIHN5c2ZzIGludGVyZmFjZSAqLworCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZoaWQtPmRldiwgJmRldl9hdHRyX2NvbWJpbmVfcGVkYWxzKTsKKwlpZiAoZXJyb3IpCisJCWhpZF93YXJuKGhpZCwgIlVuYWJsZSB0byBjcmVhdGUgc3lzZnMgaW50ZXJmYWNlIGZvciBcImNvbWJpbmVcIiwgZXJybm8gJWRcbiIsIGVycm9yKTsKIAllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZSgmaGlkLT5kZXYsICZkZXZfYXR0cl9yYW5nZSk7CiAJaWYgKGVycm9yKQogCQloaWRfd2FybihoaWQsICJVbmFibGUgdG8gY3JlYXRlIHN5c2ZzIGludGVyZmFjZSBmb3IgXCJyYW5nZVwiLCBlcnJubyAlZFxuIiwgZXJyb3IpOwpAQCAtMTM1OCw2ICsxNDY2LDcgQEAKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZoaWQtPmRldiwgJmRldl9hdHRyX2FsdGVybmF0ZV9tb2Rlcyk7CiAJfQogCisJZGV2aWNlX3JlbW92ZV9maWxlKCZoaWQtPmRldiwgJmRldl9hdHRyX2NvbWJpbmVfcGVkYWxzKTsKIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmhpZC0+ZGV2LCAmZGV2X2F0dHJfcmFuZ2UpOwogI2lmZGVmIENPTkZJR19MRURTX0NMQVNTCiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnNGZmLmggYi9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuaAppbmRleCA2NjIwMWFmLi5kZTFmMzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuaAorKysgYi9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuaApAQCAtNiwxMSArNiwxNSBAQAogCiBpbnQgbGc0ZmZfYWRqdXN0X2lucHV0X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAogCQkJICAgICBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgczMyIHZhbHVlLCBzdHJ1Y3QgbGdfZHJ2X2RhdGEgKmRydl9kYXRhKTsKK2ludCBsZzRmZl9yYXdfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQsCisJCXU4ICpyZCwgaW50IHNpemUsIHN0cnVjdCBsZ19kcnZfZGF0YSAqZHJ2X2RhdGEpOwogaW50IGxnNGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpOwogaW50IGxnNGZmX2RlaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldik7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgbGc0ZmZfYWRqdXN0X2lucHV0X2V2ZW50KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAogCQkJCQkgICBzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgczMyIHZhbHVlLCBzdHJ1Y3QgbGdfZHJ2X2RhdGEgKmRydl9kYXRhKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBsZzRmZl9yYXdfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQsCisJCXU4ICpyZCwgaW50IHNpemUsIHN0cnVjdCBsZ19kcnZfZGF0YSAqZHJ2X2RhdGEpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGxnNGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpIHsgcmV0dXJuIC0xOyB9CiBzdGF0aWMgaW5saW5lIGludCBsZzRmZl9kZWluaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpIHsgcmV0dXJuIC0xOyB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1taWNyb3NvZnQuYyBiL2RyaXZlcnMvaGlkL2hpZC1taWNyb3NvZnQuYwppbmRleCBlOTI0ZDU1Li5jNmNkMzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbWljcm9zb2Z0LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLW1pY3Jvc29mdC5jCkBAIC0yOCw3ICsyOCw2IEBACiAjZGVmaW5lIE1TX1JERVNDCQkweDA4CiAjZGVmaW5lIE1TX05PR0VUCQkweDEwCiAjZGVmaW5lIE1TX0RVUExJQ0FURV9VU0FHRVMJMHgyMAotI2RlZmluZSBNU19SREVTQ18zSwkJMHg0MAogCiBzdGF0aWMgX191OCAqbXNfcmVwb3J0X2ZpeHVwKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBfX3U4ICpyZGVzYywKIAkJdW5zaWduZWQgaW50ICpyc2l6ZSkKQEAgLTQ1LDEzICs0NCw2IEBACiAJCXJkZXNjWzU1N10gPSAweDM1OwogCQlyZGVzY1s1NTldID0gMHg0NTsKIAl9Ci0JLyogdGhlIHNhbWUgYXMgYWJvdmUgKHMvdXNhZ2UvcGh5c2ljYWwvKSAqLwotCWlmICgocXVpcmtzICYgTVNfUkRFU0NfM0spICYmICpyc2l6ZSA9PSAxMDYgJiYgcmRlc2NbOTRdID09IDB4MTkgJiYKLQkJCXJkZXNjWzk1XSA9PSAweDAwICYmIHJkZXNjWzk2XSA9PSAweDI5ICYmCi0JCQlyZGVzY1s5N10gPT0gMHhmZikgewotCQlyZGVzY1s5NF0gPSAweDM1OwotCQlyZGVzY1s5Nl0gPSAweDQ1OwotCX0KIAlyZXR1cm4gcmRlc2M7CiB9CiAKQEAgLTI3MSw3ICsyNjMsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfUFJFU0VOVEVSXzhLX1VTQiksCiAJCS5kcml2ZXJfZGF0YSA9IE1TX1BSRVNFTlRFUiB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfRElHSVRBTF9NRURJQV8zSyksCi0JCS5kcml2ZXJfZGF0YSA9IE1TX0VSR09OT01ZIHwgTVNfUkRFU0NfM0sgfSwKKwkJLmRyaXZlcl9kYXRhID0gTVNfRVJHT05PTVkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX0RJR0lUQUxfTUVESUFfN0spLAogCQkuZHJpdmVyX2RhdGEgPSBNU19FUkdPTk9NWSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfRElHSVRBTF9NRURJQV82MDApLApAQCAtMjg4LDYgKzI4MCw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IE1TX0hJRElOUFVUIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19UWVBFX0NPVkVSX1BST18zX0pQKSwKIAkJLmRyaXZlcl9kYXRhID0gTVNfSElESU5QVVQgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX1RZUEVfQ09WRVJfUFJPXzRfSlApLAorCQkuZHJpdmVyX2RhdGEgPSBNU19ISURJTlBVVCB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfVFlQRV9DT1ZFUl8zKSwKIAkJLmRyaXZlcl9kYXRhID0gTVNfSElESU5QVVQgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX1BPV0VSX0NPVkVSKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zYWl0ZWsuYyBiL2RyaXZlcnMvaGlkL2hpZC1zYWl0ZWsuYwppbmRleCAyZjg0YjI2Zi4uMzllNjQyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXNhaXRlay5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1zYWl0ZWsuYwpAQCAtMTgzLDYgKzE4Myw4IEBACiAJCS5kcml2ZXJfZGF0YSA9IFNBSVRFS19SRUxFQVNFX01PREVfUkFUNyB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TQUlURUssIFVTQl9ERVZJQ0VfSURfU0FJVEVLX1JBVDcpLAogCQkuZHJpdmVyX2RhdGEgPSBTQUlURUtfUkVMRUFTRV9NT0RFX1JBVDcgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU0FJVEVLLCBVU0JfREVWSUNFX0lEX1NBSVRFS19SQVQ5KSwKKwkJLmRyaXZlcl9kYXRhID0gU0FJVEVLX1JFTEVBU0VfTU9ERV9SQVQ3IH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01BRENBVFosIFVTQl9ERVZJQ0VfSURfTUFEQ0FUWl9SQVQ5KSwKIAkJLmRyaXZlcl9kYXRhID0gU0FJVEVLX1JFTEVBU0VfTU9ERV9SQVQ3IH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NBSVRFSywgVVNCX0RFVklDRV9JRF9TQUlURUtfTU1PNyksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtc2Vuc29yLWh1Yi5jIGIvZHJpdmVycy9oaWQvaGlkLXNlbnNvci1odWIuYwppbmRleCAzZDViYTViLi42NThhNjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtc2Vuc29yLWh1Yi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1zZW5zb3ItaHViLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCiAgKgogICovCisKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTc5OCw2ICs3OTksOSBAQAogCXsgSElEX0RFVklDRShISURfQlVTX0FOWSwgSElEX0dST1VQX1NFTlNPUl9IVUIsIFVTQl9WRU5ET1JfSURfSVRFLAogCQkJVVNCX0RFVklDRV9JRF9JVEVfTEVOT1ZPX1lPR0E5MDApLAogCQkJLmRyaXZlcl9kYXRhID0gSElEX1NFTlNPUl9IVUJfRU5VTV9RVUlSS30sCisJeyBISURfREVWSUNFKEhJRF9CVVNfQU5ZLCBISURfR1JPVVBfU0VOU09SX0hVQiwgVVNCX1ZFTkRPUl9JRF9JTlRFTF8wLAorCQkJMHgyMkQ4KSwKKwkJCS5kcml2ZXJfZGF0YSA9IEhJRF9TRU5TT1JfSFVCX0VOVU1fUVVJUkt9LAogCXsgSElEX0RFVklDRShISURfQlVTX0FOWSwgSElEX0dST1VQX1NFTlNPUl9IVUIsIEhJRF9BTllfSUQsCiAJCSAgICAgSElEX0FOWV9JRCkgfSwKIAl7IH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zb255LmMgYi9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCmluZGV4IDMxMDQzNmEuLmIwYmI5OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1zb255LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXNvbnkuYwpAQCAtOCw3ICs4LDcgQEAKICAqICBDb3B5cmlnaHQgKGMpIDIwMTIgRGF2aWQgRGlsbG93IDxkYXZlQHRoZWRpbGxvd3Mub3JnPgogICogIENvcHlyaWdodCAoYykgMjAwNi0yMDEzIEppcmkgS29zaW5hCiAgKiAgQ29weXJpZ2h0IChjKSAyMDEzIENvbGluIExlaXRuZXIgPGNvbGluLmxlaXRuZXJAZ21haWwuY29tPgotICogIENvcHlyaWdodCAoYykgMjAxNCBGcmFuayBQcmF6bmlrIDxmcmFuay5wcmF6bmlrQGdtYWlsLmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiBGcmFuayBQcmF6bmlrIDxmcmFuay5wcmF6bmlrQGdtYWlsLmNvbT4KICAqLwogCiAvKgpAQCAtNTEsNiArNTEsNyBAQAogI2RlZmluZSBOQVZJR0FUSU9OX0NPTlRST0xMRVJfVVNCIEJJVCg5KQogI2RlZmluZSBOQVZJR0FUSU9OX0NPTlRST0xMRVJfQlQgIEJJVCgxMCkKICNkZWZpbmUgU0lOT19MSVRFX0NPTlRST0xMRVIgICAgICBCSVQoMTEpCisjZGVmaW5lIEZVVFVSRU1BWF9EQU5DRV9NQVQgICAgICAgQklUKDEyKQogCiAjZGVmaW5lIFNJWEFYSVNfQ09OVFJPTExFUiAoU0lYQVhJU19DT05UUk9MTEVSX1VTQiB8IFNJWEFYSVNfQ09OVFJPTExFUl9CVCkKICNkZWZpbmUgTU9USU9OX0NPTlRST0xMRVIgKE1PVElPTl9DT05UUk9MTEVSX1VTQiB8IE1PVElPTl9DT05UUk9MTEVSX0JUKQpAQCAtNjUsNiArNjYsOCBAQAogCQkJCU1PVElPTl9DT05UUk9MTEVSX0JUIHwgTkFWSUdBVElPTl9DT05UUk9MTEVSKQogI2RlZmluZSBTT05ZX0ZGX1NVUFBPUlQgKFNJWEFYSVNfQ09OVFJPTExFUiB8IERVQUxTSE9DSzRfQ09OVFJPTExFUiB8XAogCQkJCU1PVElPTl9DT05UUk9MTEVSKQorI2RlZmluZSBTT05ZX0JUX0RFVklDRSAoU0lYQVhJU19DT05UUk9MTEVSX0JUIHwgRFVBTFNIT0NLNF9DT05UUk9MTEVSX0JUIHxcCisJCQlNT1RJT05fQ09OVFJPTExFUl9CVCB8IE5BVklHQVRJT05fQ09OVFJPTExFUl9CVCkKIAogI2RlZmluZSBNQVhfTEVEUyA0CiAKQEAgLTEwNDgsNiArMTA1MSw3IEBACiAKIAl1OCBtYWNfYWRkcmVzc1s2XTsKIAl1OCB3b3JrZXJfaW5pdGlhbGl6ZWQ7CisJdTggZGVmZXJfaW5pdGlhbGl6YXRpb247CiAJdTggY2FibGVfc3RhdGU7CiAJdTggYmF0dGVyeV9jaGFyZ2luZzsKIAl1OCBiYXR0ZXJ5X2NhcGFjaXR5OwpAQCAtMTA1OCw2ICsxMDYyLDEyIEBACiAJdTggbGVkX2NvdW50OwogfTsKIAorc3RhdGljIGlubGluZSB2b2lkIHNvbnlfc2NoZWR1bGVfd29yayhzdHJ1Y3Qgc29ueV9zYyAqc2MpCit7CisJaWYgKCFzYy0+ZGVmZXJfaW5pdGlhbGl6YXRpb24pCisJCXNjaGVkdWxlX3dvcmsoJnNjLT5zdGF0ZV93b3JrZXIpOworfQorCiBzdGF0aWMgdTggKnNpeGF4aXNfZml4dXAoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHU4ICpyZGVzYywKIAkJCSAgICAgdW5zaWduZWQgaW50ICpyc2l6ZSkKIHsKQEAgLTExMjUsNyArMTEzNSw3IEBACiB7CiAJc3RydWN0IHNvbnlfc2MgKnNjID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOwogCi0JaWYgKHNjLT5xdWlya3MgJiBTSU5PX0xJVEVfQ09OVFJPTExFUikKKwlpZiAoc2MtPnF1aXJrcyAmIChTSU5PX0xJVEVfQ09OVFJPTExFUiB8IEZVVFVSRU1BWF9EQU5DRV9NQVQpKQogCQlyZXR1cm4gcmRlc2M7CiAKIAkvKgpAQCAtMTMxNyw2ICsxMzI3LDExIEBACiAJCWR1YWxzaG9jazRfcGFyc2VfcmVwb3J0KHNjLCByZCwgc2l6ZSk7CiAJfQogCisJaWYgKHNjLT5kZWZlcl9pbml0aWFsaXphdGlvbikgeworCQlzYy0+ZGVmZXJfaW5pdGlhbGl6YXRpb24gPSAwOworCQlzb255X3NjaGVkdWxlX3dvcmsoc2MpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xNTU0LDcgKzE1NjksNyBAQAogc3RhdGljIHZvaWQgc29ueV9zZXRfbGVkcyhzdHJ1Y3Qgc29ueV9zYyAqc2MpCiB7CiAJaWYgKCEoc2MtPnF1aXJrcyAmIEJVWlpfQ09OVFJPTExFUikpCi0JCXNjaGVkdWxlX3dvcmsoJnNjLT5zdGF0ZV93b3JrZXIpOworCQlzb255X3NjaGVkdWxlX3dvcmsoc2MpOwogCWVsc2UKIAkJYnV6el9zZXRfbGVkcyhzYyk7CiB9CkBAIC0xNjY1LDcgKzE2ODAsNyBAQAogCQluZXdfb2ZmICE9IGRydl9kYXRhLT5sZWRfZGVsYXlfb2ZmW25dKSB7CiAJCWRydl9kYXRhLT5sZWRfZGVsYXlfb25bbl0gPSBuZXdfb247CiAJCWRydl9kYXRhLT5sZWRfZGVsYXlfb2ZmW25dID0gbmV3X29mZjsKLQkJc2NoZWR1bGVfd29yaygmZHJ2X2RhdGEtPnN0YXRlX3dvcmtlcik7CisJCXNvbnlfc2NoZWR1bGVfd29yayhkcnZfZGF0YSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xODY1LDYgKzE4ODAsMTcgQEAKIAl1OCAqYnVmID0gc2MtPm91dHB1dF9yZXBvcnRfZG1hYnVmOwogCWludCBvZmZzZXQ7CiAKKwkvKgorCSAqIE5PVEU6IFRoZSBidWZbMV0gZmllbGQgb2YgdGhlIEJsdWV0b290aCByZXBvcnQgY29udHJvbHMKKwkgKiB0aGUgRHVhbHNob2NrIDQgcmVwb3J0aW5nIHJhdGUuCisJICoKKwkgKiBLbm93biB2YWx1ZXMgaW5jbHVkZToKKwkgKgorCSAqIDB4ODAgLSAxMDAwaHogKGZ1bGwgc3BlZWQpCisJICogMHhBMCAtIDMxaHoKKwkgKiAweEIwIC0gMjBoegorCSAqIDB4RDAgLSA2Nmh6CisJICovCiAJaWYgKHNjLT5xdWlya3MgJiBEVUFMU0hPQ0s0X0NPTlRST0xMRVJfVVNCKSB7CiAJCW1lbXNldChidWYsIDAsIERTNF9SRVBPUlRfMHgwNV9TSVpFKTsKIAkJYnVmWzBdID0gMHgwNTsKQEAgLTE5NzYsNyArMjAwMiw3IEBACiAJc2MtPmxlZnQgPSBlZmZlY3QtPnUucnVtYmxlLnN0cm9uZ19tYWduaXR1ZGUgLyAyNTY7CiAJc2MtPnJpZ2h0ID0gZWZmZWN0LT51LnJ1bWJsZS53ZWFrX21hZ25pdHVkZSAvIDI1NjsKIAotCXNjaGVkdWxlX3dvcmsoJnNjLT5zdGF0ZV93b3JrZXIpOworCXNvbnlfc2NoZWR1bGVfd29yayhzYyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwMzksOCArMjA2NSwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgc29ueV9iYXR0ZXJ5X3Byb2JlKHN0cnVjdCBzb255X3NjICpzYykKK3N0YXRpYyBpbnQgc29ueV9iYXR0ZXJ5X3Byb2JlKHN0cnVjdCBzb255X3NjICpzYywgaW50IGFwcGVuZF9kZXZfaWQpCiB7CisJY29uc3QgY2hhciAqYmF0dGVyeV9zdHJfZm10ID0gYXBwZW5kX2Rldl9pZCA/CisJCSJzb255X2NvbnRyb2xsZXJfYmF0dGVyeV8lcE1SXyVpIiA6CisJCSJzb255X2NvbnRyb2xsZXJfYmF0dGVyeV8lcE1SIjsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0geyAuZHJ2X2RhdGEgPSBzYywgfTsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiA9IHNjLT5oZGV2OwogCWludCByZXQ7CkBAIC0yMDU2LDkgKzIwODUsOCBAQAogCXNjLT5iYXR0ZXJ5X2Rlc2MuZ2V0X3Byb3BlcnR5ID0gc29ueV9iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKIAlzYy0+YmF0dGVyeV9kZXNjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwogCXNjLT5iYXR0ZXJ5X2Rlc2MudXNlX2Zvcl9hcG0gPSAwOwotCXNjLT5iYXR0ZXJ5X2Rlc2MubmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAotCQkJCQkgICJzb255X2NvbnRyb2xsZXJfYmF0dGVyeV8lcE1SIiwKLQkJCQkJICBzYy0+bWFjX2FkZHJlc3MpOworCXNjLT5iYXR0ZXJ5X2Rlc2MubmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCBiYXR0ZXJ5X3N0cl9mbXQsCisJCQkJCSAgc2MtPm1hY19hZGRyZXNzLCBzYy0+ZGV2aWNlX2lkKTsKIAlpZiAoIXNjLT5iYXR0ZXJ5X2Rlc2MubmFtZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTIwOTQsNyArMjEyMiwyMSBAQAogICogaXQgd2lsbCBzaG93IHVwIGFzIHR3byBkZXZpY2VzLiBBIGdsb2JhbCBsaXN0IG9mIGNvbm5lY3RlZCBjb250cm9sbGVycyBhbmQKICAqIHRoZWlyIE1BQyBhZGRyZXNzZXMgaXMgbWFpbnRhaW5lZCB0byBlbnN1cmUgdGhhdCBhIGRldmljZSBpcyBvbmx5IGNvbm5lY3RlZAogICogb25jZS4KKyAqCisgKiBTb21lIFVTQi1vbmx5IGRldmljZXMgbWFzcXVlcmFkZSBhcyBTaXhheGlzIGNvbnRyb2xsZXJzIGFuZCBhbGwgaGF2ZSB0aGUKKyAqIHNhbWUgZHVtbXkgQmx1ZXRvb3RoIGFkZHJlc3MsIHNvIGEgY29tcGFyaXNvbiBvZiB0aGUgY29ubmVjdGlvbiB0eXBlIGlzCisgKiByZXF1aXJlZC4gIERldmljZXMgYXJlIG9ubHkgcmVqZWN0ZWQgaW4gdGhlIGNhc2Ugd2hlcmUgdHdvIGRldmljZXMgaGF2ZQorICogbWF0Y2hpbmcgQmx1ZXRvb3RoIGFkZHJlc3NlcyBvbiBkaWZmZXJlbnQgYnVzIHR5cGVzLgogICovCitzdGF0aWMgaW5saW5lIGludCBzb255X2NvbXBhcmVfY29ubmVjdGlvbl90eXBlKHN0cnVjdCBzb255X3NjICpzYzAsCisJCQkJCQlzdHJ1Y3Qgc29ueV9zYyAqc2MxKQoreworCWNvbnN0IGludCBzYzBfbm90X2J0ID0gIShzYzAtPnF1aXJrcyAmIFNPTllfQlRfREVWSUNFKTsKKwljb25zdCBpbnQgc2MxX25vdF9idCA9ICEoc2MxLT5xdWlya3MgJiBTT05ZX0JUX0RFVklDRSk7CisKKwlyZXR1cm4gc2MwX25vdF9idCA9PSBzYzFfbm90X2J0OworfQorCiBzdGF0aWMgaW50IHNvbnlfY2hlY2tfYWRkX2Rldl9saXN0KHN0cnVjdCBzb255X3NjICpzYykKIHsKIAlzdHJ1Y3Qgc29ueV9zYyAqZW50cnk7CkBAIC0yMTA3LDkgKzIxNDksMTQgQEAKIAkJcmV0ID0gbWVtY21wKHNjLT5tYWNfYWRkcmVzcywgZW50cnktPm1hY19hZGRyZXNzLAogCQkJCXNpemVvZihzYy0+bWFjX2FkZHJlc3MpKTsKIAkJaWYgKCFyZXQpIHsKLQkJCXJldCA9IC1FRVhJU1Q7Ci0JCQloaWRfaW5mbyhzYy0+aGRldiwgImNvbnRyb2xsZXIgd2l0aCBNQUMgYWRkcmVzcyAlcE1SIGFscmVhZHkgY29ubmVjdGVkXG4iLAorCQkJaWYgKHNvbnlfY29tcGFyZV9jb25uZWN0aW9uX3R5cGUoc2MsIGVudHJ5KSkgeworCQkJCXJldCA9IDE7CisJCQl9IGVsc2UgeworCQkJCXJldCA9IC1FRVhJU1Q7CisJCQkJaGlkX2luZm8oc2MtPmhkZXYsCisJCQkJImNvbnRyb2xsZXIgd2l0aCBNQUMgYWRkcmVzcyAlcE1SIGFscmVhZHkgY29ubmVjdGVkXG4iLAogCQkJCXNjLT5tYWNfYWRkcmVzcyk7CisJCQl9CiAJCQlnb3RvIHVubG9jazsKIAkJfQogCX0KQEAgLTIyODUsMTAgKzIzMzIsMTQgQEAKIHN0YXRpYyBpbnQgc29ueV9wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQogewogCWludCByZXQ7CisJaW50IGFwcGVuZF9kZXZfaWQ7CiAJdW5zaWduZWQgbG9uZyBxdWlya3MgPSBpZC0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IHNvbnlfc2MgKnNjOwogCXVuc2lnbmVkIGludCBjb25uZWN0X21hc2sgPSBISURfQ09OTkVDVF9ERUZBVUxUOwogCisJaWYgKCFzdHJjbXAoaGRldi0+bmFtZSwgIkZ1dHVyZU1heCBEYW5jZSBNYXQiKSkKKwkJcXVpcmtzIHw9IEZVVFVSRU1BWF9EQU5DRV9NQVQ7CisKIAlzYyA9IGRldm1fa3phbGxvYygmaGRldi0+ZGV2LCBzaXplb2YoKnNjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNjID09IE5VTEwpIHsKIAkJaGlkX2VycihoZGV2LCAiY2FuJ3QgYWxsb2Mgc29ueSBkZXNjcmlwdG9yXG4iKTsKQEAgLTIzNDEsOSArMjM5MiwxNiBAQAogCQkgKiB0aGUgU2l4YXhpcyBkb2VzIG5vdCB3YW50IHRoZSByZXBvcnRfaWQgYXMgcGFydCBvZiB0aGUgZGF0YQogCQkgKiBwYWNrZXQsIHNvIHdlIGhhdmUgdG8gZGlzY2FyZCBidWZbMF0gd2hlbiBzZW5kaW5nIHRoZSBhY3R1YWwKIAkJICogY29udHJvbCBtZXNzYWdlLCBldmVuIGZvciBudW1iZXJlZCByZXBvcnRzLCBodW1wZiEKKwkJICoKKwkJICogQWRkaXRpb25hbGx5LCB0aGUgU2l4YXhpcyBvbiBVU0IgaXNuJ3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQKKwkJICogdW50aWwgdGhlIFBTIGxvZ28gYnV0dG9uIGlzIHByZXNzZWQgYW5kIGFzIHN1Y2ggd29uJ3QgcmV0YWluCisJCSAqIGFueSBzdGF0ZSBzZXQgYnkgYW4gb3V0cHV0IHJlcG9ydCwgc28gdGhlIGluaXRpYWwKKwkJICogY29uZmlndXJhdGlvbiByZXBvcnQgaXMgZGVmZXJyZWQgdW50aWwgdGhlIGZpcnN0IGlucHV0CisJCSAqIHJlcG9ydCBhcnJpdmVzLgogCQkgKi8KIAkJaGRldi0+cXVpcmtzIHw9IEhJRF9RVUlSS19OT19PVVRQVVRfUkVQT1JUU19PTl9JTlRSX0VQOwogCQloZGV2LT5xdWlya3MgfD0gSElEX1FVSVJLX1NLSVBfT1VUUFVUX1JFUE9SVF9JRDsKKwkJc2MtPmRlZmVyX2luaXRpYWxpemF0aW9uID0gMTsKIAkJcmV0ID0gc2l4YXhpc19zZXRfb3BlcmF0aW9uYWxfdXNiKGhkZXYpOwogCQlzb255X2luaXRfb3V0cHV0X3JlcG9ydChzYywgc2l4YXhpc19zZW5kX291dHB1dF9yZXBvcnQpOwogCX0gZWxzZSBpZiAoKHNjLT5xdWlya3MgJiBTSVhBWElTX0NPTlRST0xMRVJfQlQpIHx8CkBAIC0yMzc5LDcgKzI0MzcsNyBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9zdG9wOwogCi0JcmV0ID0gc29ueV9jaGVja19hZGQoc2MpOworCXJldCA9IGFwcGVuZF9kZXZfaWQgPSBzb255X2NoZWNrX2FkZChzYyk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX3N0b3A7CiAKQEAgLTIzOTAsNyArMjQ0OCw3IEBACiAJfQogCiAJaWYgKHNjLT5xdWlya3MgJiBTT05ZX0JBVFRFUllfU1VQUE9SVCkgewotCQlyZXQgPSBzb255X2JhdHRlcnlfcHJvYmUoc2MpOworCQlyZXQgPSBzb255X2JhdHRlcnlfcHJvYmUoc2MsIGFwcGVuZF9kZXZfaWQpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZXJyX3N0b3A7CiAKQEAgLTI0ODYsOCArMjU0NCwxMCBAQAogCQkgKiByZWluaXRpYWxpemVkIG9uIHJlc3VtZSBvciB0aGV5IHdvbid0IGJlaGF2ZSBwcm9wZXJseS4KIAkJICovCiAJCWlmICgoc2MtPnF1aXJrcyAmIFNJWEFYSVNfQ09OVFJPTExFUl9VU0IpIHx8Ci0JCQkoc2MtPnF1aXJrcyAmIE5BVklHQVRJT05fQ09OVFJPTExFUl9VU0IpKQorCQkJKHNjLT5xdWlya3MgJiBOQVZJR0FUSU9OX0NPTlRST0xMRVJfVVNCKSkgewogCQkJc2l4YXhpc19zZXRfb3BlcmF0aW9uYWxfdXNiKHNjLT5oZGV2KTsKKwkJCXNjLT5kZWZlcl9pbml0aWFsaXphdGlvbiA9IDE7CisJCX0KIAogCQlzb255X3NldF9sZWRzKHNjKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtdWNsb2dpYy5jIGIvZHJpdmVycy9oaWQvaGlkLXVjbG9naWMuYwppbmRleCA4NWFjNDM1Li4xNTA5ZDcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtdWNsb2dpYy5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC11Y2xvZ2ljLmMKQEAgLTIxLDEzICsyMSw2IEBACiAKICNpbmNsdWRlICJoaWQtaWRzLmgiCiAKLS8qCi0gKiBTZWUgV1BYWFhYVSBtb2RlbCBkZXNjcmlwdGlvbnMsIGRldmljZSBhbmQgSElEIHJlcG9ydCBkZXNjcmlwdG9ycyBhdAotICogaHR0cDovL3NmLm5ldC9hcHBzL21lZGlhd2lraS9kaWdpbWVuZC8/dGl0bGU9VUMtTG9naWNfVGFibGV0X1dQNDAzMFUKLSAqIGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvZGlnaW1lbmQvP3RpdGxlPVVDLUxvZ2ljX1RhYmxldF9XUDU1NDBVCi0gKiBodHRwOi8vc2YubmV0L2FwcHMvbWVkaWF3aWtpL2RpZ2ltZW5kLz90aXRsZT1VQy1Mb2dpY19UYWJsZXRfV1A4MDYwVQotICovCi0KIC8qIFNpemUgb2YgdGhlIG9yaWdpbmFsIGRlc2NyaXB0b3Igb2YgV1BYWFhYVSB0YWJsZXRzICovCiAjZGVmaW5lIFdQWFhYWFVfUkRFU0NfT1JJR19TSVpFCTIxMgogCkBAIC0yMjEsMTEgKzIxNCw2IEBACiAJMHhDMCAgICAgICAgICAgICAgICAvKiAgRW5kIENvbGxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgKi8KIH07CiAKLS8qCi0gKiBTZWUgV1AxMDYyIGRlc2NyaXB0aW9uLCBkZXZpY2UgYW5kIEhJRCByZXBvcnQgZGVzY3JpcHRvcnMgYXQKLSAqIGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvZGlnaW1lbmQvP3RpdGxlPVVDLUxvZ2ljX1RhYmxldF9XUDEwNjIKLSAqLwotCiAvKiBTaXplIG9mIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9yIG9mIFdQMTA2MiB0YWJsZXQgKi8KICNkZWZpbmUgV1AxMDYyX1JERVNDX09SSUdfU0laRQkyNTQKIApAQCAtMjc0LDExICsyNjIsNiBAQAogCTB4QzAgICAgICAgICAgICAgICAgLyogIEVuZCBDb2xsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICovCiB9OwogCi0vKgotICogU2VlIFBGMTIwOSBkZXNjcmlwdGlvbiwgZGV2aWNlIGFuZCBISUQgcmVwb3J0IGRlc2NyaXB0b3JzIGF0Ci0gKiBodHRwOi8vc2YubmV0L2FwcHMvbWVkaWF3aWtpL2RpZ2ltZW5kLz90aXRsZT1VQy1Mb2dpY19UYWJsZXRfUEYxMjA5Ci0gKi8KLQogLyogU2l6ZSBvZiB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvciBvZiBQRjEyMDkgdGFibGV0ICovCiAjZGVmaW5lIFBGMTIwOV9SREVTQ19PUklHX1NJWkUJMjM0CiAKQEAgLTM1NiwxMSArMzM5LDYgQEAKIAkweEMwICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLwogfTsKIAotLyoKLSAqIFNlZSBUV0hMODUwIGRlc2NyaXB0aW9uLCBkZXZpY2UgYW5kIEhJRCByZXBvcnQgZGVzY3JpcHRvcnMgYXQKLSAqIGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvZGlnaW1lbmQvP3RpdGxlPVVDLUxvZ2ljX1dpcmVsZXNzX1RhYmxldF9UV0hMODUwCi0gKi8KLQogLyogU2l6ZSBvZiB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvcnMgb2YgVFdITDg1MCB0YWJsZXQgKi8KICNkZWZpbmUgVFdITDg1MF9SREVTQ19PUklHX1NJWkUwCTE4MgogI2RlZmluZSBUV0hMODUwX1JERVNDX09SSUdfU0laRTEJMTYxCkBAIC00NjksMTEgKzQ0Nyw2IEBACiAJMHhDMCAgICAgICAgICAgICAgICAvKiAgRW5kIENvbGxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgKi8KIH07CiAKLS8qCi0gKiBTZWUgVFdIQTYwIGRlc2NyaXB0aW9uLCBkZXZpY2UgYW5kIEhJRCByZXBvcnQgZGVzY3JpcHRvcnMgYXQKLSAqIGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvZGlnaW1lbmQvP3RpdGxlPVVDLUxvZ2ljX1RhYmxldF9UV0hBNjAKLSAqLwotCiAvKiBTaXplIG9mIHRoZSBvcmlnaW5hbCBkZXNjcmlwdG9ycyBvZiBUV0hBNjAgdGFibGV0ICovCiAjZGVmaW5lIFRXSEE2MF9SREVTQ19PUklHX1NJWkUwIDI1NAogI2RlZmluZSBUV0hBNjBfUkRFU0NfT1JJR19TSVpFMSAxMzkKQEAgLTYxMyw2ICs1ODYsMjcgQEAKIAkweEMwICAgICAgICAgICAgICAgICAgICAvKiAgRW5kIENvbGxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICovCiB9OwogCisvKiBGaXhlZCB2aXJ0dWFsIHBhZCByZXBvcnQgZGVzY3JpcHRvciAqLworc3RhdGljIGNvbnN0IF9fdTggdWNsb2dpY19idXR0b25wYWRfcmRlc2NbXSA9IHsKKwkweDA1LCAweDAxLCAgICAgICAgICAgICAvKiAgVXNhZ2UgUGFnZSAoRGVza3RvcCksICAgICAgICAgICAgICAgICAgICovCisJMHgwOSwgMHgwNywgICAgICAgICAgICAgLyogIFVzYWdlIChLZXlwYWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCTB4QTEsIDB4MDEsICAgICAgICAgICAgIC8qICBDb2xsZWN0aW9uIChBcHBsaWNhdGlvbiksICAgICAgICAgICAgICAgKi8KKwkweDg1LCAweEY3LCAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBJRCAoMjQ3KSwgICAgICAgICAgICAgICAgICAgICovCisJMHgwNSwgMHgwRCwgICAgICAgICAgICAgLyogICAgICBVc2FnZSBQYWdlIChEaWdpdGl6ZXJzKSwgICAgICAgICAgICAqLworCTB4MDksIDB4MzksICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgKFRhYmxldCBGdW5jdGlvbiBLZXlzKSwgICAgICAgKi8KKwkweEEwLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIENvbGxlY3Rpb24gKFBoeXNpY2FsKSwgICAgICAgICAgICAgICovCisJMHgwNSwgMHgwOSwgICAgICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgUGFnZSAoQnV0dG9uKSwgICAgICAgICAgICAqLworCTB4NzUsIDB4MDEsICAgICAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBTaXplICgxKSwgICAgICAgICAgICAgICAgKi8KKwkweDk1LCAweDE4LCAgICAgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgQ291bnQgKDI0KSwgICAgICAgICAgICAgICovCisJMHg4MSwgMHgwMywgICAgICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKENvbnN0YW50LCBWYXJpYWJsZSksICAgICAqLworCTB4MTksIDB4MDEsICAgICAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIE1pbmltdW0gKDAxaCksICAgICAgICAgICAgKi8KKwkweDI5LCAweDA4LCAgICAgICAgICAgICAvKiAgICAgICAgICBVc2FnZSBNYXhpbXVtICgwOGgpLCAgICAgICAgICAgICovCisJMHg5NSwgMHgwOCwgICAgICAgICAgICAgLyogICAgICAgICAgUmVwb3J0IENvdW50ICg4KSwgICAgICAgICAgICAgICAqLworCTB4ODEsIDB4MDIsICAgICAgICAgICAgIC8qICAgICAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAgICAgKi8KKwkweEMwLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIEVuZCBDb2xsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICovCisJMHhDMCAgICAgICAgICAgICAgICAgICAgLyogIEVuZCBDb2xsZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfTsKKwogLyogUGFyYW1ldGVyIGluZGljZXMgKi8KIGVudW0gdWNsb2dpY19wcm0gewogCVVDTE9HSUNfUFJNX1hfTE0JPSAxLApAQCAtNjI4LDYgKzYyMiw3IEBACiAJdW5zaWduZWQgaW50IHJzaXplOwogCWJvb2wgaW52ZXJ0X3Blbl9pbnJhbmdlOwogCWJvb2wgaWdub3JlX3Blbl91c2FnZTsKKwlib29sIGhhc192aXJ0dWFsX3BhZF9pbnRlcmZhY2U7CiB9OwogCiBzdGF0aWMgX191OCAqdWNsb2dpY19yZXBvcnRfZml4dXAoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIF9fdTggKnJkZXNjLApAQCAtNjM3LDYgKzYzMiwxMiBAQAogCV9fdTggaWZhY2VfbnVtID0gaWZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CiAJc3RydWN0IHVjbG9naWNfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKIAorCWlmIChkcnZkYXRhLT5yZGVzYyAhPSBOVUxMKSB7CisJCXJkZXNjID0gZHJ2ZGF0YS0+cmRlc2M7CisJCSpyc2l6ZSA9IGRydmRhdGEtPnJzaXplOworCQlyZXR1cm4gcmRlc2M7CisJfQorCiAJc3dpdGNoIChoZGV2LT5wcm9kdWN0KSB7CiAJY2FzZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1BGMTIwOToKIAkJaWYgKCpyc2l6ZSA9PSBQRjEyMDlfUkRFU0NfT1JJR19TSVpFKSB7CkBAIC03MDYsMTEgKzcwNyw2IEBACiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKLQlkZWZhdWx0OgotCQlpZiAoZHJ2ZGF0YS0+cmRlc2MgIT0gTlVMTCkgewotCQkJcmRlc2MgPSBkcnZkYXRhLT5yZGVzYzsKLQkJCSpyc2l6ZSA9IGRydmRhdGEtPnJzaXplOwotCQl9CiAJfQogCiAJcmV0dXJuIHJkZXNjOwpAQCAtODA0LDcgKzgwMCw2IEBACiAJbGVuID0gVUNMT0dJQ19QUk1fTlVNICogc2l6ZW9mKCpidWYpOwogCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmID09IE5VTEwpIHsKLQkJaGlkX2VycihoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHBhcmFtZXRlciBidWZmZXJcbiIpOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC04NDgsNyArODQzLDYgQEAKIAkJCQlzaXplb2YodWNsb2dpY190YWJsZXRfcmRlc2NfdGVtcGxhdGUpLAogCQkJCUdGUF9LRVJORUwpOwogCWlmIChkcnZkYXRhLT5yZGVzYyA9PSBOVUxMKSB7Ci0JCWhpZF9lcnIoaGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBmaXhlZCByZGVzY1xuIik7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBjbGVhbnVwOwogCX0KQEAgLTg3NiwxMSArODcwLDc1IEBACiAJcmV0dXJuIHJjOwogfQogCisvKioKKyAqIEVuYWJsZSBhY3R1YWwgYnV0dG9uIG1vZGUuCisgKgorICogQGhkZXY6CUhJRCBkZXZpY2UKKyAqLworc3RhdGljIGludCB1Y2xvZ2ljX2J1dHRvbl9lbmFibGUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCit7CisJaW50IHJjOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaGlkX3RvX3VzYl9kZXYoaGRldik7CisJc3RydWN0IHVjbG9naWNfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKwljaGFyICpzdHJfYnVmOworCXNpemVfdCBzdHJfbGVuID0gMTY7CisJdW5zaWduZWQgY2hhciAqcmRlc2M7CisJc2l6ZV90IHJkZXNjX2xlbjsKKworCXN0cl9idWYgPSBremFsbG9jKHN0cl9sZW4sIEdGUF9LRVJORUwpOworCWlmIChzdHJfYnVmID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogRW5hYmxlIGFic3RyYWN0IGtleWJvYXJkIG1vZGUgKi8KKwlyYyA9IHVzYl9zdHJpbmcodXNiX2RldiwgMHg3Yiwgc3RyX2J1Ziwgc3RyX2xlbik7CisJaWYgKHJjID09IC1FUElQRSkgeworCQloaWRfaW5mbyhoZGV2LCAiYnV0dG9uIG1vZGUgc2V0dGluZyBub3QgZm91bmRcbiIpOworCQlyYyA9IDA7CisJCWdvdG8gY2xlYW51cDsKKwl9IGVsc2UgaWYgKHJjIDwgMCkgeworCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gZW5hYmxlIGFic3RyYWN0IGtleWJvYXJkXG4iKTsKKwkJZ290byBjbGVhbnVwOworCX0gZWxzZSBpZiAoc3RybmNtcChzdHJfYnVmLCAiSEsgT24iLCByYykpIHsKKwkJaGlkX2luZm8oaGRldiwgImludmFsaWQgYW5zd2VyIHdoZW4gcmVxdWVzdGluZyBidXR0b25zOiAnJXMnXG4iLAorCQkJc3RyX2J1Zik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIFJlLWFsbG9jYXRlIGZpeGVkIHJlcG9ydCBkZXNjcmlwdG9yICovCisJcmRlc2NfbGVuID0gZHJ2ZGF0YS0+cnNpemUgKyBzaXplb2YodWNsb2dpY19idXR0b25wYWRfcmRlc2MpOworCXJkZXNjID0gZGV2bV9remFsbG9jKCZoZGV2LT5kZXYsIHJkZXNjX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZGVzYykgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwltZW1jcHkocmRlc2MsIGRydmRhdGEtPnJkZXNjLCBkcnZkYXRhLT5yc2l6ZSk7CisKKwkvKiBBcHBlbmQgdGhlIGJ1dHRvbnBhZCBkZXNjcmlwdG9yICovCisJbWVtY3B5KHJkZXNjICsgZHJ2ZGF0YS0+cnNpemUsIHVjbG9naWNfYnV0dG9ucGFkX3JkZXNjLAorCSAgICAgICBzaXplb2YodWNsb2dpY19idXR0b25wYWRfcmRlc2MpKTsKKworCS8qIGNsZWFuIHVwIG9sZCByZGVzYyBhbmQgdXNlIHRoZSBuZXcgb25lICovCisJZHJ2ZGF0YS0+cnNpemUgPSByZGVzY19sZW47CisJZGV2bV9rZnJlZSgmaGRldi0+ZGV2LCBkcnZkYXRhLT5yZGVzYyk7CisJZHJ2ZGF0YS0+cmRlc2MgPSByZGVzYzsKKworCXJjID0gMDsKKworY2xlYW51cDoKKwlrZnJlZShzdHJfYnVmKTsKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbnQgdWNsb2dpY19wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKIAkJY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQogewogCWludCByYzsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoaGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBoaWRfdG9fdXNiX2RldihoZGV2KTsKIAlzdHJ1Y3QgdWNsb2dpY19kcnZkYXRhICpkcnZkYXRhOwogCiAJLyoKQEAgLTg5OSw2ICs5NTcsMTAgQEAKIAogCXN3aXRjaCAoaWQtPnByb2R1Y3QpIHsKIAljYXNlIFVTQl9ERVZJQ0VfSURfSFVJT05fVEFCTEVUOgorCWNhc2UgVVNCX0RFVklDRV9JRF9ZSVlOT1ZBX1RBQkxFVDoKKwljYXNlIFVTQl9ERVZJQ0VfSURfVUdFRV9UQUJMRVRfODE6CisJY2FzZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfRFJBV0lNQUdFX0czOgorCWNhc2UgVVNCX0RFVklDRV9JRF9VR0VFX1RBQkxFVF80NToKIAkJLyogSWYgdGhpcyBpcyB0aGUgcGVuIGludGVyZmFjZSAqLwogCQlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlciA9PSAwKSB7CiAJCQlyYyA9IHVjbG9naWNfdGFibGV0X2VuYWJsZShoZGV2KTsKQEAgLTkwNywxMCArOTY5LDQ4IEBACiAJCQkJcmV0dXJuIHJjOwogCQkJfQogCQkJZHJ2ZGF0YS0+aW52ZXJ0X3Blbl9pbnJhbmdlID0gdHJ1ZTsKKworCQkJcmMgPSB1Y2xvZ2ljX2J1dHRvbl9lbmFibGUoaGRldik7CisJCQlkcnZkYXRhLT5oYXNfdmlydHVhbF9wYWRfaW50ZXJmYWNlID0gIXJjOwogCQl9IGVsc2UgewogCQkJZHJ2ZGF0YS0+aWdub3JlX3Blbl91c2FnZSA9IHRydWU7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBVU0JfREVWSUNFX0lEX1VHVElaRVJfVEFCTEVUX0dQMDYxMDoKKwkJLyogSWYgdGhpcyBpcyB0aGUgcGVuIGludGVyZmFjZSAqLworCQlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlciA9PSAxKSB7CisJCQlyYyA9IHVjbG9naWNfdGFibGV0X2VuYWJsZShoZGV2KTsKKwkJCWlmIChyYykgeworCQkJCWhpZF9lcnIoaGRldiwgInRhYmxldCBlbmFibGluZyBmYWlsZWRcbiIpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJCWRydmRhdGEtPmludmVydF9wZW5faW5yYW5nZSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlkcnZkYXRhLT5pZ25vcmVfcGVuX3VzYWdlID0gdHJ1ZTsKKwkJfQorCQlicmVhazsKKwljYXNlIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfVFdIQTYwOgorCQkvKgorCQkgKiBJZiBpdCBpcyB0aGUgdGhyZWUtaW50ZXJmYWNlIHZlcnNpb24sIHdoaWNoIGlzIGtub3duIHRvCisJCSAqIHJlc3BvbmQgdG8gaW5pdGlhbGl6YXRpb24uCisJCSAqLworCQlpZiAodWRldi0+Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzID09IDMpIHsKKwkJCS8qIElmIGl0IGlzIHRoZSBwZW4gaW50ZXJmYWNlICovCisJCQlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlciA9PSAwKSB7CisJCQkJcmMgPSB1Y2xvZ2ljX3RhYmxldF9lbmFibGUoaGRldik7CisJCQkJaWYgKHJjKSB7CisJCQkJCWhpZF9lcnIoaGRldiwgInRhYmxldCBlbmFibGluZyBmYWlsZWRcbiIpOworCQkJCQlyZXR1cm4gcmM7CisJCQkJfQorCQkJCWRydmRhdGEtPmludmVydF9wZW5faW5yYW5nZSA9IHRydWU7CisKKwkJCQlyYyA9IHVjbG9naWNfYnV0dG9uX2VuYWJsZShoZGV2KTsKKwkJCQlkcnZkYXRhLT5oYXNfdmlydHVhbF9wYWRfaW50ZXJmYWNlID0gIXJjOworCQkJfSBlbHNlIHsKKwkJCQlkcnZkYXRhLT5pZ25vcmVfcGVuX3VzYWdlID0gdHJ1ZTsKKwkJCX0KKwkJfQorCQlicmVhazsKIAl9CiAKIAlyYyA9IGhpZF9wYXJzZShoZGV2KTsKQEAgLTkzMywxMiArMTAzMywxNiBAQAogewogCXN0cnVjdCB1Y2xvZ2ljX2RydmRhdGEgKmRydmRhdGEgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CiAKLQlpZiAoKGRydmRhdGEtPmludmVydF9wZW5faW5yYW5nZSkgJiYKLQkgICAgKHJlcG9ydC0+dHlwZSA9PSBISURfSU5QVVRfUkVQT1JUKSAmJgorCWlmICgocmVwb3J0LT50eXBlID09IEhJRF9JTlBVVF9SRVBPUlQpICYmCiAJICAgIChyZXBvcnQtPmlkID09IFVDTE9HSUNfUEVOX1JFUE9SVF9JRCkgJiYKLQkgICAgKHNpemUgPj0gMikpCi0JCS8qIEludmVydCB0aGUgaW4tcmFuZ2UgYml0ICovCi0JCWRhdGFbMV0gXj0gMHg0MDsKKwkgICAgKHNpemUgPj0gMikpIHsKKwkJaWYgKGRydmRhdGEtPmhhc192aXJ0dWFsX3BhZF9pbnRlcmZhY2UgJiYgKGRhdGFbMV0gJiAweDIwKSkKKwkJCS8qIENoYW5nZSB0byB2aXJ0dWFsIGZyYW1lIGJ1dHRvbiByZXBvcnQgSUQgKi8KKwkJCWRhdGFbMF0gPSAweGY3OworCQllbHNlIGlmIChkcnZkYXRhLT5pbnZlcnRfcGVuX2lucmFuZ2UpCisJCQkvKiBJbnZlcnQgdGhlIGluLXJhbmdlIGJpdCAqLworCQkJZGF0YVsxXSBePSAweDQwOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtOTYwLDYgKzEwNjQsMTEgQEAKIAkJCQlVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1RXSEE2MCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfSFVJT04sIFVTQl9ERVZJQ0VfSURfSFVJT05fVEFCTEVUKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9VQ0xPR0lDLCBVU0JfREVWSUNFX0lEX0hVSU9OX1RBQkxFVCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9ZSVlOT1ZBX1RBQkxFVCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9VR0VFX1RBQkxFVF84MSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9VR0VFX1RBQkxFVF80NSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywgVVNCX0RFVklDRV9JRF9VQ0xPR0lDX0RSQVdJTUFHRV9HMykgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUdUSVpFUiwgVVNCX0RFVklDRV9JRF9VR1RJWkVSX1RBQkxFVF9HUDA2MTApIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIHVjbG9naWNfZGV2aWNlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtd2FsdG9wLmMgYi9kcml2ZXJzL2hpZC9oaWQtd2FsdG9wLmMKaW5kZXggMDU5OTMxZC4uYTkxYWFiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXdhbHRvcC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC13YWx0b3AuYwpAQCAtNDIsMTEgKzQyLDYgQEAKICAqIDAyIDE2IDAyICAgICBpbmsKICAqLwogCi0vKgotICogU2VlIFNsaW0gVGFibGV0IDUuOCBpbmNoIGRlc2NyaXB0aW9uLCBkZXZpY2UgYW5kIEhJRCByZXBvcnQgZGVzY3JpcHRvcnMgYXQKLSAqIGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvZGlnaW1lbmQvP3RpdGxlPVdhbHRvcF9TbGltX1RhYmxldF81LjglMjIKLSAqLwotCiAvKiBTaXplIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQgZGVzY3JpcHRvciBvZiBTbGltIFRhYmxldCA1LjggaW5jaCAqLwogI2RlZmluZSBTTElNX1RBQkxFVF81XzhfSU5DSF9SREVTQ19PUklHX1NJWkUJMjIyCiAKQEAgLTk4LDExICs5Myw2IEBACiAJMHhDMCAgICAgICAgICAgICAgICAvKiAgRW5kIENvbGxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgKi8KIH07CiAKLS8qCi0gKiBTZWUgU2xpbSBUYWJsZXQgMTIuMSBpbmNoIGRlc2NyaXB0aW9uLCBkZXZpY2UgYW5kIEhJRCByZXBvcnQgZGVzY3JpcHRvcnMgYXQKLSAqIGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvZGlnaW1lbmQvP3RpdGxlPVdhbHRvcF9TbGltX1RhYmxldF8xMi4xJTIyCi0gKi8KLQogLyogU2l6ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0IGRlc2NyaXB0b3Igb2YgU2xpbSBUYWJsZXQgMTIuMSBpbmNoICovCiAjZGVmaW5lIFNMSU1fVEFCTEVUXzEyXzFfSU5DSF9SREVTQ19PUklHX1NJWkUJMjY5CiAKQEAgLTE1NCwxMSArMTQ0LDYgQEAKIAkweEMwICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLwogfTsKIAotLyoKLSAqIFNlZSBRIFBhZCBkZXNjcmlwdGlvbiwgZGV2aWNlIGFuZCBISUQgcmVwb3J0IGRlc2NyaXB0b3JzIGF0Ci0gKiBodHRwOi8vc2YubmV0L2FwcHMvbWVkaWF3aWtpL2RpZ2ltZW5kLz90aXRsZT1XYWx0b3BfUV9QYWQKLSAqLwotCiAvKiBTaXplIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQgZGVzY3JpcHRvciBvZiBRIFBhZCAqLwogI2RlZmluZSBRX1BBRF9SREVTQ19PUklHX1NJWkUJMjQxCiAKQEAgLTIxMCwxMSArMTk1LDYgQEAKIAkweEMwICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLwogfTsKIAotLyoKLSAqIFNlZSBkZXNjcmlwdGlvbiwgZGV2aWNlIGFuZCBISUQgcmVwb3J0IGRlc2NyaXB0b3JzIG9mIHRhYmxldCB3aXRoIFBJRCAwMDM4IGF0Ci0gKiBodHRwOi8vc2YubmV0L2FwcHMvbWVkaWF3aWtpL2RpZ2ltZW5kLz90aXRsZT1XYWx0b3BfUElEXzAwMzgKLSAqLwotCiAvKiBTaXplIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQgZGVzY3JpcHRvciBvZiB0YWJsZXQgd2l0aCBQSUQgMDAzOCAqLwogI2RlZmluZSBQSURfMDAzOF9SREVTQ19PUklHX1NJWkUJMjQxCiAKQEAgLTI2OCwxMSArMjQ4LDYgQEAKIAkweEMwICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLwogfTsKIAotLyoKLSAqIFNlZSBNZWRpYSBUYWJsZXQgMTAuNiBpbmNoIGRlc2NyaXB0aW9uLCBkZXZpY2UgYW5kIEhJRCByZXBvcnQgZGVzY3JpcHRvcnMgYXQKLSAqIGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvZGlnaW1lbmQvP3RpdGxlPVdhbHRvcF9NZWRpYV9UYWJsZXRfMTAuNiUyMgotICovCi0KIC8qIFNpemUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydCBkZXNjcmlwdG9yIG9mIE1lZGlhIFRhYmxldCAxMC42IGluY2ggKi8KICNkZWZpbmUgTUVESUFfVEFCTEVUXzEwXzZfSU5DSF9SREVTQ19PUklHX1NJWkUJMzAwCiAKQEAgLTM4NiwxMSArMzYxLDYgQEAKIAkweEMwICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLwogfTsKIAotLyoKLSAqIFNlZSBNZWRpYSBUYWJsZXQgMTQuMSBpbmNoIGRlc2NyaXB0aW9uLCBkZXZpY2UgYW5kIEhJRCByZXBvcnQgZGVzY3JpcHRvcnMgYXQKLSAqIGh0dHA6Ly9zZi5uZXQvYXBwcy9tZWRpYXdpa2kvZGlnaW1lbmQvP3RpdGxlPVdhbHRvcF9NZWRpYV9UYWJsZXRfMTQuMSUyMgotICovCi0KIC8qIFNpemUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydCBkZXNjcmlwdG9yIG9mIE1lZGlhIFRhYmxldCAxNC4xIGluY2ggKi8KICNkZWZpbmUgTUVESUFfVEFCTEVUXzE0XzFfSU5DSF9SREVTQ19PUklHX1NJWkUJMzA5CiAKQEAgLTUwMiwxMiArNDcyLDYgQEAKIAkweEMwICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAqLwogfTsKIAotLyoKLSAqIFNlZSBTaXJpdXMgQmF0dGVyeSBGcmVlIFRhYmxldCBkZXNjcmlwdGlvbiwgZGV2aWNlIGFuZCBISUQgcmVwb3J0IGRlc2NyaXB0b3JzCi0gKiBhdAotICogaHR0cDovL3NmLm5ldC9hcHBzL21lZGlhd2lraS9kaWdpbWVuZC8/dGl0bGU9V2FsdG9wX1Npcml1c19CYXR0ZXJ5X0ZyZWVfVGFibGV0Ci0gKi8KLQogLyogU2l6ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0IGRlc2NyaXB0b3Igb2YgU2lyaXVzIEJhdHRlcnkgRnJlZSBUYWJsZXQgKi8KICNkZWZpbmUgU0lSSVVTX0JBVFRFUllfRlJFRV9UQUJMRVRfUkRFU0NfT1JJR19TSVpFCTMzNQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL0tjb25maWcgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwNjViMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvS2NvbmZpZwpAQCAtMCwwICsxLDE3IEBACittZW51ICJJbnRlbCBJU0ggSElEIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBYODZfNjQgJiYgUENJCisKK2NvbmZpZyBJTlRFTF9JU0hfSElECisJdHJpc3RhdGUgIkludGVsIEludGVncmF0ZWQgU2Vuc29yIEh1YiIKKwlkZWZhdWx0IG4KKwlzZWxlY3QgSElECisJaGVscAorCSAgVGhlIEludGVncmF0ZWQgU2Vuc29yIEh1YiAoSVNIKSBlbmFibGVzIHRoZSBhYmlsaXR5IHRvIG9mZmxvYWQKKwkgIHNlbnNvciBwb2xsaW5nIGFuZCBhbGdvcml0aG0gcHJvY2Vzc2luZyB0byBhIGRlZGljYXRlZCBsb3cgcG93ZXIKKwkgIHByb2Nlc3NvciBpbiB0aGUgY2hpcHNldC4gVGhpcyBhbGxvd3MgdGhlIGNvcmUgcHJvY2Vzc29yIHRvIGdvIGludG8KKwkgIGxvdyBwb3dlciBtb2RlcyBtb3JlIG9mdGVuLCByZXN1bHRpbmcgaW4gdGhlIGluY3JlYXNlZCBiYXR0ZXJ5IGxpZmUuCisJICBUaGUgY3VycmVudCBwcm9jZXNzb3JzIHRoYXQgc3VwcG9ydCBJU0ggYXJlOiBDaGVycnl0cmFpbCwgU2t5bGFrZSwKKwkgIEJyb3h0b24gYW5kIEthYnkgTGFrZS4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IEludGVsIElTSC4gSWYgdW5zdXJlLCBzYXkgTi4KK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvTWFrZWZpbGUgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDhiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL01ha2VmaWxlCkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgTWFrZWZpbGUgLSBJbnRlbCBJU0ggSElEIGRyaXZlcnMKKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEludGVsIENvcnBvcmF0aW9uLgorIworIworb2JqLSQoQ09ORklHX0lOVEVMX0lTSF9ISUQpICs9IGludGVsLWlzaHRwLm8KK2ludGVsLWlzaHRwLW9ianMgOj0gaXNodHAvaW5pdC5vCitpbnRlbC1pc2h0cC1vYmpzICs9IGlzaHRwL2hibS5vCitpbnRlbC1pc2h0cC1vYmpzICs9IGlzaHRwL2NsaWVudC5vCitpbnRlbC1pc2h0cC1vYmpzICs9IGlzaHRwL2J1cy5vCitpbnRlbC1pc2h0cC1vYmpzICs9IGlzaHRwL2RtYS1pZi5vCitpbnRlbC1pc2h0cC1vYmpzICs9IGlzaHRwL2NsaWVudC1idWZmZXJzLm8KKworb2JqLSQoQ09ORklHX0lOVEVMX0lTSF9ISUQpICs9IGludGVsLWlzaC1pcGMubworaW50ZWwtaXNoLWlwYy1vYmpzIDo9IGlwYy9pcGMubworaW50ZWwtaXNoLWlwYy1vYmpzICs9IGlwYy9wY2ktaXNoLm8KKworb2JqLSQoQ09ORklHX0lOVEVMX0lTSF9ISUQpICs9IGludGVsLWlzaHRwLWhpZC5vCitpbnRlbC1pc2h0cC1oaWQtb2JqcyA6PSBpc2h0cC1oaWQubworaW50ZWwtaXNodHAtaGlkLW9ianMgKz0gaXNodHAtaGlkLWNsaWVudC5vCisKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXBjL2h3LWlzaC1yZWdzLmggYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lwYy9ody1pc2gtcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNjhhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lwYy9ody1pc2gtcmVncy5oCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogSVNIIHJlZ2lzdGVycyBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9JU0hUUF9JU0hfUkVHU19IXworI2RlZmluZSBfSVNIVFBfSVNIX1JFR1NfSF8KKworCisvKioqIElQQyBQQ0kgT2Zmc2V0cyBhbmQgc2l6ZXMgKioqLworLyogSVNIIElQQyBCYXNlIEFkZHJlc3MgKi8KKyNkZWZpbmUgSVBDX1JFR19CQVNFCQkweDAwMDAKKy8qIFBlcmlwaGVyYWwgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJUENfUkVHX1BJU1JfQ0hWX0FCICAgICAgKElQQ19SRUdfQkFTRSArIDB4MDApCisvKiBQZXJpcGhlcmFsIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyICovCisjZGVmaW5lIElQQ19SRUdfUElNUl9DSFZfQUIgICAgICAoSVBDX1JFR19CQVNFICsgMHgwNCkKKy8qQlhULCBDSFZfSzAqLworLypQZXJpcGhlcmFsIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVBDX1JFR19QSVNSX0JYVAkgKElQQ19SRUdfQkFTRSArIDB4MEMpCisvKlBlcmlwaGVyYWwgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVBDX1JFR19QSU1SX0JYVAkgKElQQ19SRUdfQkFTRSArIDB4MDgpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBJU0ggSG9zdCBGaXJtd2FyZSBzdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVBDX1JFR19JU0hfSE9TVF9GV1NUUwkoSVBDX1JFR19CQVNFICsgMHgzNCkKKy8qIEhvc3QgQ29tbXVuaWNhdGlvbiBSZWdpc3RlciAqLworI2RlZmluZSBJUENfUkVHX0hPU1RfQ09NTQkoSVBDX1JFR19CQVNFICsgMHgzOCkKKy8qIFJlc2V0IHJlZ2lzdGVyICovCisjZGVmaW5lIElQQ19SRUdfSVNIX1JTVAkJKElQQ19SRUdfQkFTRSArIDB4NDQpCisKKy8qIEluYm91bmQgZG9vcmJlbGwgcmVnaXN0ZXIgSG9zdCB0byBJU0ggKi8KKyNkZWZpbmUgSVBDX1JFR19IT1NUMklTSF9EUkJMCShJUENfUkVHX0JBU0UgKyAweDQ4KQorLyogT3V0Ym91bmQgZG9vcmJlbGwgcmVnaXN0ZXIgSVNIIHRvIEhvc3QgKi8KKyNkZWZpbmUgSVBDX1JFR19JU0gySE9TVF9EUkJMCShJUENfUkVHX0JBU0UgKyAweDU0KQorLyogSVNIIHRvIEhPU1QgbWVzc2FnZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSVBDX1JFR19JU0gySE9TVF9NU0cJKElQQ19SRUdfQkFTRSArIDB4NjApCisvKiBIT1NUIHRvIElTSCBtZXNzYWdlIHJlZ2lzdGVycyAqLworI2RlZmluZSBJUENfUkVHX0hPU1QySVNIX01TRwkoSVBDX1JFR19CQVNFICsgMHhFMCkKKy8qIFJFTUFQMiB0byBlbmFibGUgRE1BIChEMyBSQ1IpICovCisjZGVmaW5lCUlQQ19SRUdfSVNIX1JNUDIJKElQQ19SRUdfQkFTRSArIDB4MzY4KQorCisjZGVmaW5lCUlQQ19SRUdfTUFYCQkoSVBDX1JFR19CQVNFICsgMHg0MDApCisKKy8qKiogcmVnaXN0ZXIgYml0cyAtIEhJU1IgKioqLworLyogYml0IGNvcnJlc3BvbmRzIEhPU1QySVNIIGludGVycnVwdCBpbiBQSVNSIGFuZCBQSU1SIHJlZ2lzdGVycyAqLworI2RlZmluZSBJUENfSU5UX0hPU1QySVNIX0JJVCAgICAgICAgICAgICgxPDwwKQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLypDSFZfQTAsIENIVl9CMCovCisvKiBiaXQgY29ycmVzcG9uZHMgSVNIMkhPU1QgaW50ZXJydXB0IGluIFBJU1IgYW5kIFBJTVIgcmVnaXN0ZXJzICovCisjZGVmaW5lIElQQ19JTlRfSVNIMkhPU1RfQklUX0NIVl9BQgkoMTw8MykKKy8qQlhULCBDSFZfSzAqLworLyogYml0IGNvcnJlc3BvbmRzIElTSDJIT1NUIGludGVycnVwdCBpbiBQSVNSIGFuZCBQSU1SIHJlZ2lzdGVycyAqLworI2RlZmluZSBJUENfSU5UX0lTSDJIT1NUX0JJVF9CWFQJKDE8PDApCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGJpdCBjb3JyZXNwb25kcyBJU0gySE9TVCBidXN5IGNsZWFyIGludGVycnVwdCBpbiBQSU1SIHJlZ2lzdGVyICovCisjZGVmaW5lIElQQ19JTlRfSVNIMkhPU1RfQ0xSX01BU0tfQklUCSgxPDwxMSkKKworLyogb2Zmc2V0IG9mIElTSDJIT1NUIGJ1c3kgY2xlYXIgaW50ZXJydXB0IGluIElQQ19CVVNZX0NMUiByZWdpc3RlciAqLworI2RlZmluZSBJUENfSU5UX0lTSDJIT1NUX0NMUl9PRkZTCSgwKQorCisvKiBiaXQgY29ycmVzcG9uZHMgSVNIMkhPU1QgYnVzeSBjbGVhciBpbnRlcnJ1cHQgaW4gSVBDX0JVU1lfQ0xSIHJlZ2lzdGVyICovCisjZGVmaW5lIElQQ19JTlRfSVNIMkhPU1RfQ0xSX0JJVAkoMTw8SVBDX0lOVF9JU0gySE9TVF9DTFJfT0ZGUykKKworLyogYml0IGNvcnJlc3BvbmRzIGJ1c3kgYml0IGluIGRvb3JiZWxsIHJlZ2lzdGVycyAqLworI2RlZmluZSBJUENfRFJCTF9CVVNZX09GRlMJCSgzMSkKKyNkZWZpbmUgSVBDX0RSQkxfQlVTWV9CSVQJCSgxPDxJUENfRFJCTF9CVVNZX09GRlMpCisKKyNkZWZpbmUJSVBDX0hPU1RfT1dOU19NU0dfT0ZGUwkJKDMwKQorCisvKgorICogQTA6IGJpdCBtZWFucyB0aGF0IGhvc3Qgb3ducyBNU0dubiByZWdpc3RlcnMgYW5kIGlzIHJlYWRpbmcgdGhlbS4KKyAqIElTSCBGVyBtYXkgbm90IHdyaXRlIHRvIHRoZW0KKyAqLworI2RlZmluZQlJUENfSE9TVF9PV05TX01TR19CSVQJCSgxPDxJUENfSE9TVF9PV05TX01TR19PRkZTKQorCisvKgorICogSG9zdCBzdGF0dXMgYml0cyAoSE9TVENPTU0pCisgKi8KKy8qIGJpdCBjb3JyZXNwb25kcyBob3N0IHJlYWR5IGJpdCBpbiBIb3N0IFN0YXR1cyBSZWdpc3RlciAoSE9TVF9DT01NKSAqLworI2RlZmluZSBJUENfSE9TVENPTU1fUkVBRFlfT0ZGUwkJKDcpCisjZGVmaW5lIElQQ19IT1NUQ09NTV9SRUFEWV9CSVQJCSgxPDxJUENfSE9TVENPTU1fUkVBRFlfT0ZGUykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLypDSFZfQTAsIENIVl9CMCovCisjZGVmaW5lCUlQQ19IT1NUQ09NTV9JTlRfRU5fT0ZGU19DSFZfQUIJKDMxKQorI2RlZmluZQlJUENfSE9TVENPTU1fSU5UX0VOX0JJVF9DSFZfQUIJCVwKKwkoMTw8SVBDX0hPU1RDT01NX0lOVF9FTl9PRkZTX0NIVl9BQikKKy8qQlhULCBDSFZfSzAqLworI2RlZmluZSBJUENfUElNUl9JTlRfRU5fT0ZGU19CWFQJKDApCisjZGVmaW5lIElQQ19QSU1SX0lOVF9FTl9CSVRfQlhUCQkoMTw8SVBDX1BJTVJfSU5UX0VOX09GRlNfQlhUKQorCisjZGVmaW5lIElQQ19IT1NUMklTSF9CVVNZQ0xFQVJfTUFTS19PRkZTX0JYVAkoOCkKKyNkZWZpbmUgSVBDX0hPU1QySVNIX0JVU1lDTEVBUl9NQVNLX0JJVAkJXAorCSgxPDxJUENfSE9TVDJJU0hfQlVTWUNMRUFSX01BU0tfT0ZGU19CWFQpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYm90aCBIb3N0IGFuZCBJU0ggaGF2ZSBJTFVQIGF0IGJpdCAwCisgKiBiaXQgY29ycmVzcG9uZHMgaG9zdCByZWFkeSBiaXQgaW4gYm90aCBzdGF0dXMgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgSVBDX0lMVVBfT0ZGUwkJCSgwKQorI2RlZmluZSBJUENfSUxVUF9CSVQJCQkoMTw8SVBDX0lMVVBfT0ZGUykKKworLyoKKyAqIEZXIHN0YXR1cyBiaXRzIChyZWxldmFudCkKKyAqLworI2RlZmluZQlJUENfRldTVFNfSUxVUAkJMHgxCisjZGVmaW5lCUlQQ19GV1NUU19JU0hUUF9VUAkoMTw8MSkKKyNkZWZpbmUJSVBDX0ZXU1RTX0RNQTAJCSgxPDwxNikKKyNkZWZpbmUJSVBDX0ZXU1RTX0RNQTEJCSgxPDwxNykKKyNkZWZpbmUJSVBDX0ZXU1RTX0RNQTIJCSgxPDwxOCkKKyNkZWZpbmUJSVBDX0ZXU1RTX0RNQTMJCSgxPDwxOSkKKworI2RlZmluZQlJUENfSVNIX0lOX0RNQQkJXAorCShJUENfRldTVFNfRE1BMCB8IElQQ19GV1NUU19ETUExIHwgSVBDX0ZXU1RTX0RNQTIgfCBJUENfRldTVFNfRE1BMykKKworLyogYml0IGNvcnJlc3BvbmRzIGhvc3QgcmVhZHkgYml0IGluIElTSCBGVyBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVBDX0lTSF9JU0hUUF9SRUFEWV9PRkZTCQkoMSkKKyNkZWZpbmUgSVBDX0lTSF9JU0hUUF9SRUFEWV9CSVQJCSgxPDxJUENfSVNIX0lTSFRQX1JFQURZX09GRlMpCisKKyNkZWZpbmUJSVBDX1JNUDJfRE1BX0VOQUJMRUQJMHgxCS8qIFZhbHVlIHRvIGVuYWJsZSBETUEsIHBlciBEMyBSQ1IgKi8KKworI2RlZmluZSBJUENfTVNHX01BWF9TSVpFCTB4ODAKKworCisjZGVmaW5lIElQQ19IRUFERVJfTEVOR1RIX01BU0sJCTB4MDNGRgorI2RlZmluZSBJUENfSEVBREVSX1BST1RPQ09MX01BU0sJMHgwRgorI2RlZmluZSBJUENfSEVBREVSX01OR19DTURfTUFTSwkJMHgwRgorCisjZGVmaW5lIElQQ19IRUFERVJfTEVOR1RIX09GRlNFVAkwCisjZGVmaW5lIElQQ19IRUFERVJfUFJPVE9DT0xfT0ZGU0VUCTEwCisjZGVmaW5lIElQQ19IRUFERVJfTU5HX0NNRF9PRkZTRVQJMTYKKworI2RlZmluZSBJUENfSEVBREVSX0dFVF9MRU5HVEgoZHJibF9yZWcpCQlcCisJKCgoZHJibF9yZWcpID4+IElQQ19IRUFERVJfTEVOR1RIX09GRlNFVCkmSVBDX0hFQURFUl9MRU5HVEhfTUFTSykKKyNkZWZpbmUgSVBDX0hFQURFUl9HRVRfUFJPVE9DT0woZHJibF9yZWcpCVwKKwkoKChkcmJsX3JlZykgPj4gSVBDX0hFQURFUl9QUk9UT0NPTF9PRkZTRVQpJklQQ19IRUFERVJfUFJPVE9DT0xfTUFTSykKKyNkZWZpbmUgSVBDX0hFQURFUl9HRVRfTU5HX0NNRChkcmJsX3JlZykJXAorCSgoKGRyYmxfcmVnKSA+PiBJUENfSEVBREVSX01OR19DTURfT0ZGU0VUKSZJUENfSEVBREVSX01OR19DTURfTUFTSykKKworI2RlZmluZSBJUENfSVNfQlVTWShkcmJsX3JlZykJCQlcCisJKCgoZHJibF9yZWcpJklQQ19EUkJMX0JVU1lfQklUKSA9PSAoKHVpbnQzMl90KUlQQ19EUkJMX0JVU1lfQklUKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLypDSFZfQTAsIENIVl9CMCovCisjZGVmaW5lIElQQ19JTlRfRlJPTV9JU0hfVE9fSE9TVF9DSFZfQUIoZHJibF9yZWcpIFwKKwkoKChkcmJsX3JlZykmSVBDX0lOVF9JU0gySE9TVF9CSVRfQ0hWX0FCKSA9PSBcCisJKCh1MzIpSVBDX0lOVF9JU0gySE9TVF9CSVRfQ0hWX0FCKSkKKy8qQlhULCBDSFZfSzAqLworI2RlZmluZSBJUENfSU5UX0ZST01fSVNIX1RPX0hPU1RfQlhUKGRyYmxfcmVnKSBcCisJKCgoZHJibF9yZWcpJklQQ19JTlRfSVNIMkhPU1RfQklUX0JYVCkgPT0gXAorCSgodTMyKUlQQ19JTlRfSVNIMkhPU1RfQklUX0JYVCkpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVBDX0JVSUxEX0hFQURFUihsZW5ndGgsIHByb3RvY29sLCBidXN5KQkJXAorCSgoKGJ1c3kpPDxJUENfRFJCTF9CVVNZX09GRlMpIHwJCQkJXAorCSgocHJvdG9jb2wpIDw8IElQQ19IRUFERVJfUFJPVE9DT0xfT0ZGU0VUKSB8CQlcCisJKChsZW5ndGgpPDxJUENfSEVBREVSX0xFTkdUSF9PRkZTRVQpKQorCisjZGVmaW5lIElQQ19CVUlMRF9NTkdfTVNHKGNtZCwgbGVuZ3RoKQkJCQlcCisJKCgoMSk8PElQQ19EUkJMX0JVU1lfT0ZGUyl8CQkJCVwKKwkoKElQQ19QUk9UT0NPTF9NTkcpPDxJUENfSEVBREVSX1BST1RPQ09MX09GRlNFVCl8CVwKKwkoKGNtZCk8PElQQ19IRUFERVJfTU5HX0NNRF9PRkZTRVQpfAkJCVwKKwkgKChsZW5ndGgpPDxJUENfSEVBREVSX0xFTkdUSF9PRkZTRVQpKQorCisKKyNkZWZpbmUgSVBDX1NFVF9IT1NUX1JFQURZKGhvc3Rfc3RhdHVzKQkJXAorCQkJCSgoaG9zdF9zdGF0dXMpIHw9IChJUENfSE9TVENPTU1fUkVBRFlfQklUKSkKKworI2RlZmluZSBJUENfU0VUX0hPU1RfSUxVUChob3N0X3N0YXR1cykJCVwKKwkJCQkoKGhvc3Rfc3RhdHVzKSB8PSAoSVBDX0lMVVBfQklUKSkKKworI2RlZmluZSBJUENfQ0xFQVJfSE9TVF9SRUFEWShob3N0X3N0YXR1cykJXAorCQkJCSgoaG9zdF9zdGF0dXMpIF49IChJUENfSE9TVENPTU1fUkVBRFlfQklUKSkKKworI2RlZmluZSBJUENfQ0xFQVJfSE9TVF9JTFVQKGhvc3Rfc3RhdHVzKQlcCisJCQkJKChob3N0X3N0YXR1cykgXj0gKElQQ19JTFVQX0JJVCkpCisKKy8qIHRvZG8gLSB0ZW1wIHVudGlsIFBJTVIgSFcgcmVhZHkgKi8KKyNkZWZpbmUgSVBDX0hPU1RfQlVTWV9SRUFESU5HX09GRlMJNgorCisvKiBiaXQgY29ycmVzcG9uZHMgaG9zdCByZWFkeSBiaXQgaW4gSG9zdCBTdGF0dXMgUmVnaXN0ZXIgKEhPU1RfQ09NTSkgKi8KKyNkZWZpbmUgSVBDX0hPU1RfQlVTWV9SRUFESU5HX0JJVAkoMTw8SVBDX0hPU1RfQlVTWV9SRUFESU5HX09GRlMpCisKKyNkZWZpbmUgSVBDX1NFVF9IT1NUX0JVU1lfUkVBRElORyhob3N0X3N0YXR1cykJXAorCQkJCSgoaG9zdF9zdGF0dXMpIHw9IChJUENfSE9TVF9CVVNZX1JFQURJTkdfQklUKSkKKworI2RlZmluZSBJUENfQ0xFQVJfSE9TVF9CVVNZX1JFQURJTkcoaG9zdF9zdGF0dXMpXAorCQkJCSgoaG9zdF9zdGF0dXMpIF49IChJUENfSE9TVF9CVVNZX1JFQURJTkdfQklUKSkKKworCisjZGVmaW5lIElQQ19JU19JU0hfSVNIVFBfUkVBRFkoaXNoX3N0YXR1cykJXAorCQkoKChpc2hfc3RhdHVzKSAmIElQQ19JU0hfSVNIVFBfUkVBRFlfQklUKSA9PQlcCisJCQkoKHVpbnQzMl90KUlQQ19JU0hfSVNIVFBfUkVBRFlfQklUKSkKKworI2RlZmluZSBJUENfSVNfSVNIX0lMVVAoaXNoX3N0YXR1cykJCVwKKwkJKCgoaXNoX3N0YXR1cykgJiBJUENfSUxVUF9CSVQpID09ICgodWludDMyX3QpSVBDX0lMVVBfQklUKSkKKworCisjZGVmaW5lIElQQ19QUk9UT0NPTF9JU0hUUAkJMQorI2RlZmluZSBJUENfUFJPVE9DT0xfTU5HCQkzCisKKyNkZWZpbmUgTU5HX1JYX0NNUExfRU5BQkxFCQkwCisjZGVmaW5lIE1OR19SWF9DTVBMX0RJU0FCTEUJCTEKKyNkZWZpbmUgTU5HX1JYX0NNUExfSU5ESUNBVElPTgkJMgorI2RlZmluZSBNTkdfUkVTRVRfTk9USUZZCQkzCisjZGVmaW5lIE1OR19SRVNFVF9OT1RJRllfQUNLCQk0CisjZGVmaW5lIE1OR19TWU5DX0ZXX0NMT0NLCQk1CisjZGVmaW5lIE1OR19JTExFR0FMX0NNRAkJCTB4RkYKKworI2VuZGlmIC8qIF9JU0hUUF9JU0hfUkVHU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pcGMvaHctaXNoLmggYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lwYy9ody1pc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjYxNWEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pcGMvaHctaXNoLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIEgvVyBsYXllciBvZiBJU0hUUCBwcm92aWRlciBkZXZpY2UgKElTSCkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfSVNIVFBfSFdfSVNIX0hfCisjZGVmaW5lIF9JU0hUUF9IV19JU0hfSF8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgImh3LWlzaC1yZWdzLmgiCisjaW5jbHVkZSAiaXNodHAtZGV2LmgiCisKKyNkZWZpbmUgQ0hWX0RFVklDRV9JRAkJMHgyMkQ4CisjZGVmaW5lIEJYVF9BeF9ERVZJQ0VfSUQJMHgwQUEyCisjZGVmaW5lIEJYVF9CeF9ERVZJQ0VfSUQJMHgxQUEyCisjZGVmaW5lIEFQTF9BeF9ERVZJQ0VfSUQJMHg1QUEyCisjZGVmaW5lIFNQVF9BeF9ERVZJQ0VfSUQJMHg5RDM1CisKKyNkZWZpbmUJUkVWSVNJT05fSURfQ0hUX0EwCTB4NgorI2RlZmluZQlSRVZJU0lPTl9JRF9DSFRfQXhfU0kJMHgwCisjZGVmaW5lCVJFVklTSU9OX0lEX0NIVF9CeF9TSQkweDEwCisjZGVmaW5lCVJFVklTSU9OX0lEX0NIVF9LeF9TSQkweDIwCisjZGVmaW5lCVJFVklTSU9OX0lEX0NIVF9EeF9TSQkweDMwCisjZGVmaW5lCVJFVklTSU9OX0lEX0NIVF9CMAkweEIwCisjZGVmaW5lCVJFVklTSU9OX0lEX1NJX01BU0sJMHg3MAorCitzdHJ1Y3QgaXBjX3JzdF9wYXlsb2FkX3R5cGUgeworCXVpbnQxNl90CXJlc2V0X2lkOworCXVpbnQxNl90CXJlc2VydmVkOworfTsKKworc3RydWN0IHRpbWVfc3luY19mb3JtYXQgeworCXVpbnQ4X3QgdHMxX3NvdXJjZTsKKwl1aW50OF90IHRzMl9zb3VyY2U7CisJdWludDE2X3QgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaXBjX3RpbWVfdXBkYXRlX21zZyB7CisJdWludDY0X3QgcHJpbWFyeV9ob3N0X3RpbWU7CisJc3RydWN0IHRpbWVfc3luY19mb3JtYXQgc3luY19pbmZvOworCXVpbnQ2NF90IHNlY29uZGFyeV9ob3N0X3RpbWU7Cit9IF9fcGFja2VkOworCitlbnVtIHsKKwlIT1NUX1VUQ19USU1FX1VTRUMgPSAwLAorCUhPU1RfU1lTVEVNX1RJTUVfVVNFQyA9IDEKK307CisKK3N0cnVjdCBpc2hfaHcgeworCXZvaWQgX19pb21lbSAqbWVtX2FkZHI7Cit9OworCisjZGVmaW5lIHRvX2lzaF9odyhkZXYpIChzdHJ1Y3QgaXNoX2h3ICopKChkZXYpLT5odykKKworaXJxcmV0dXJuX3QgaXNoX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CitzdHJ1Y3QgaXNodHBfZGV2aWNlICppc2hfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworaW50IGlzaF9od19zdGFydChzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpOwordm9pZCBpc2hfZGV2aWNlX2Rpc2FibGUoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KTsKKworI2VuZGlmIC8qIF9JU0hUUF9IV19JU0hfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXBjL2lwYy5jIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pcGMvaXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1MTdjMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXBjL2lwYy5jCkBAIC0wLDAgKzEsODgxIEBACisvKgorICogSC9XIGxheWVyIG9mIElTSFRQIHByb3ZpZGVyIGRldmljZSAoSVNIKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgImNsaWVudC5oIgorI2luY2x1ZGUgImh3LWlzaC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiaGJtLmgiCisKKy8qIEZvciBGVyByZXNldCBmbG93ICovCitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGZ3X3Jlc2V0X3dvcms7CitzdGF0aWMgc3RydWN0IGlzaHRwX2RldmljZSAqaXNodHBfZGV2OworCisvKioKKyAqIGlzaF9yZWdfcmVhZCgpIC0gUmVhZCByZWdpc3RlcgorICogQGRldjogSVNIVFAgZGV2aWNlIHBvaW50ZXIKKyAqIEBvZmZzZXQ6IFJlZ2lzdGVyIG9mZnNldAorICoKKyAqIFJlYWQgMzIgYml0IHJlZ2lzdGVyIGF0IGEgZ2l2ZW4gb2Zmc2V0CisgKgorICogUmV0dXJuOiBSZWFkIHJlZ2lzdGVyIHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgaXNoX3JlZ19yZWFkKGNvbnN0IHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3QgaXNoX2h3ICpodyA9IHRvX2lzaF9odyhkZXYpOworCisJcmV0dXJuIHJlYWRsKGh3LT5tZW1fYWRkciArIG9mZnNldCk7Cit9CisKKy8qKgorICogaXNoX3JlZ193cml0ZSgpIC0gV3JpdGUgcmVnaXN0ZXIKKyAqIEBkZXY6IElTSFRQIGRldmljZSBwb2ludGVyCisgKiBAb2Zmc2V0OiBSZWdpc3RlciBvZmZzZXQKKyAqIEB2YWx1ZTogVmFsdWUgdG8gd3JpdGUKKyAqCisgKiBXcml0ZXMgMzIgYml0IHJlZ2lzdGVyIGF0IGEgZ2l2ZSBvZmZzZXQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGlzaF9yZWdfd3JpdGUoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LAorCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgdWludDMyX3QgdmFsdWUpCit7CisJc3RydWN0IGlzaF9odyAqaHcgPSB0b19pc2hfaHcoZGV2KTsKKworCXdyaXRlbCh2YWx1ZSwgaHctPm1lbV9hZGRyICsgb2Zmc2V0KTsKK30KKworLyoqCisgKiBfaXNoX3JlYWRfZndfc3RzX3JlZygpIC0gUmVhZCBGVyBzdGF0dXMgcmVnaXN0ZXIKKyAqIEBkZXY6IElTSFRQIGRldmljZSBwb2ludGVyCisgKgorICogUmVhZCBGVyBzdGF0dXMgcmVnaXN0ZXIKKyAqCisgKiBSZXR1cm46IFJlYWQgcmVnaXN0ZXIgdmFsdWUKKyAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBfaXNoX3JlYWRfZndfc3RzX3JlZyhzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGlzaF9yZWdfcmVhZChkZXYsIElQQ19SRUdfSVNIX0hPU1RfRldTVFMpOworfQorCisvKioKKyAqIGNoZWNrX2dlbmVyYXRlZF9pbnRlcnJ1cHQoKSAtIENoZWNrIGlmIElTSCBpbnRlcnJ1cHQKKyAqIEBkZXY6IElTSFRQIGRldmljZSBwb2ludGVyCisgKgorICogQ2hlY2sgaWYgYW4gaW50ZXJydXB0IHdhcyBnZW5lcmF0ZWQgZm9yIElTSAorICoKKyAqIFJldHVybjogUmVhZCB0cnVlIG9yIGZhbHNlCisgKi8KK3N0YXRpYyBib29sIGNoZWNrX2dlbmVyYXRlZF9pbnRlcnJ1cHQoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCWJvb2wgaW50ZXJydXB0X2dlbmVyYXRlZCA9IHRydWU7CisJdWludDMyX3QgcGlzcl92YWwgPSAwOworCisJaWYgKGRldi0+cGRldi0+ZGV2aWNlID09IENIVl9ERVZJQ0VfSUQpIHsKKwkJcGlzcl92YWwgPSBpc2hfcmVnX3JlYWQoZGV2LCBJUENfUkVHX1BJU1JfQ0hWX0FCKTsKKwkJaW50ZXJydXB0X2dlbmVyYXRlZCA9CisJCQlJUENfSU5UX0ZST01fSVNIX1RPX0hPU1RfQ0hWX0FCKHBpc3JfdmFsKTsKKwl9IGVsc2UgeworCQlwaXNyX3ZhbCA9IGlzaF9yZWdfcmVhZChkZXYsIElQQ19SRUdfUElTUl9CWFQpOworCQlpbnRlcnJ1cHRfZ2VuZXJhdGVkID0gSVBDX0lOVF9GUk9NX0lTSF9UT19IT1NUX0JYVChwaXNyX3ZhbCk7CisJfQorCisJcmV0dXJuIGludGVycnVwdF9nZW5lcmF0ZWQ7Cit9CisKKy8qKgorICogaXNoX2lzX2lucHV0X3JlYWR5KCkgLSBDaGVjayBpZiBGVyByZWFkeSBmb3IgUlgKKyAqIEBkZXY6IElTSFRQIGRldmljZSBwb2ludGVyCisgKgorICogQ2hlY2sgaWYgSVNIIEZXIGlzIHJlYWR5IGZvciByZWNlaXZpbmcgZGF0YQorICoKKyAqIFJldHVybjogUmVhZCB0cnVlIG9yIGZhbHNlCisgKi8KK3N0YXRpYyBib29sIGlzaF9pc19pbnB1dF9yZWFkeShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJdWludDMyX3QgZG9vcmJlbGxfdmFsOworCisJZG9vcmJlbGxfdmFsID0gaXNoX3JlZ19yZWFkKGRldiwgSVBDX1JFR19IT1NUMklTSF9EUkJMKTsKKwlyZXR1cm4gIUlQQ19JU19CVVNZKGRvb3JiZWxsX3ZhbCk7Cit9CisKKy8qKgorICogc2V0X2hvc3RfcmVhZHkoKSAtIEluZGljYXRlIGhvc3QgcmVhZHkKKyAqIEBkZXY6IElTSFRQIGRldmljZSBwb2ludGVyCisgKgorICogU2V0IGhvc3QgcmVhZHkgaW5kaWNhdGlvbiB0byBGVworICovCitzdGF0aWMgdm9pZCBzZXRfaG9zdF9yZWFkeShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+cGRldi0+ZGV2aWNlID09IENIVl9ERVZJQ0VfSUQpIHsKKwkJaWYgKGRldi0+cGRldi0+cmV2aXNpb24gPT0gUkVWSVNJT05fSURfQ0hUX0EwIHx8CisJCQkJKGRldi0+cGRldi0+cmV2aXNpb24gJiBSRVZJU0lPTl9JRF9TSV9NQVNLKSA9PQorCQkJCVJFVklTSU9OX0lEX0NIVF9BeF9TSSkKKwkJCWlzaF9yZWdfd3JpdGUoZGV2LCBJUENfUkVHX0hPU1RfQ09NTSwgMHg4MSk7CisJCWVsc2UgaWYgKGRldi0+cGRldi0+cmV2aXNpb24gPT0gUkVWSVNJT05fSURfQ0hUX0IwIHx8CisJCQkJKGRldi0+cGRldi0+cmV2aXNpb24gJiBSRVZJU0lPTl9JRF9TSV9NQVNLKSA9PQorCQkJCVJFVklTSU9OX0lEX0NIVF9CeF9TSSB8fAorCQkJCShkZXYtPnBkZXYtPnJldmlzaW9uICYgUkVWSVNJT05fSURfU0lfTUFTSykgPT0KKwkJCQlSRVZJU0lPTl9JRF9DSFRfS3hfU0kgfHwKKwkJCQkoZGV2LT5wZGV2LT5yZXZpc2lvbiAmIFJFVklTSU9OX0lEX1NJX01BU0spID09CisJCQkJUkVWSVNJT05fSURfQ0hUX0R4X1NJKSB7CisJCQl1aW50MzJfdCBob3N0X2NvbW1fdmFsOworCisJCQlob3N0X2NvbW1fdmFsID0gaXNoX3JlZ19yZWFkKGRldiwgSVBDX1JFR19IT1NUX0NPTU0pOworCQkJaG9zdF9jb21tX3ZhbCB8PSBJUENfSE9TVENPTU1fSU5UX0VOX0JJVF9DSFZfQUIgfCAweDgxOworCQkJaXNoX3JlZ193cml0ZShkZXYsIElQQ19SRUdfSE9TVF9DT01NLCBob3N0X2NvbW1fdmFsKTsKKwkJfQorCX0gZWxzZSB7CisJCQl1aW50MzJfdCBob3N0X3BpbXJfdmFsOworCisJCQlob3N0X3BpbXJfdmFsID0gaXNoX3JlZ19yZWFkKGRldiwgSVBDX1JFR19QSU1SX0JYVCk7CisJCQlob3N0X3BpbXJfdmFsIHw9IElQQ19QSU1SX0lOVF9FTl9CSVRfQlhUOworCQkJLyoKKwkJCSAqIGRpc2FibGUgaW50ZXJydXB0IGdlbmVyYXRlZCBpbnN0ZWFkIG9mCisJCQkgKiBSWF9jb21wbGV0ZV9tc2cKKwkJCSAqLworCQkJaG9zdF9waW1yX3ZhbCAmPSB+SVBDX0hPU1QySVNIX0JVU1lDTEVBUl9NQVNLX0JJVDsKKworCQkJaXNoX3JlZ193cml0ZShkZXYsIElQQ19SRUdfUElNUl9CWFQsIGhvc3RfcGltcl92YWwpOworCX0KK30KKworLyoqCisgKiBpc2h0cF9md19pc19yZWFkeSgpIC0gQ2hlY2sgaWYgRlcgcmVhZHkKKyAqIEBkZXY6IElTSFRQIGRldmljZSBwb2ludGVyCisgKgorICogQ2hlY2sgaWYgSVNIIEZXIGlzIHJlYWR5CisgKgorICogUmV0dXJuOiBSZWFkIHRydWUgb3IgZmFsc2UKKyAqLworc3RhdGljIGJvb2wgaXNodHBfZndfaXNfcmVhZHkoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCXVpbnQzMl90IGlzaF9zdGF0dXMgPSBfaXNoX3JlYWRfZndfc3RzX3JlZyhkZXYpOworCisJcmV0dXJuIElQQ19JU19JU0hfSUxVUChpc2hfc3RhdHVzKSAmJgorCQlJUENfSVNfSVNIX0lTSFRQX1JFQURZKGlzaF9zdGF0dXMpOworfQorCisvKioKKyAqIGlzaF9zZXRfaG9zdF9yZHkoKSAtIEluZGljYXRlIGhvc3QgcmVhZHkKKyAqIEBkZXY6IElTSFRQIGRldmljZSBwb2ludGVyCisgKgorICogU2V0IGhvc3QgcmVhZHkgaW5kaWNhdGlvbiB0byBGVworICovCitzdGF0aWMgdm9pZCBpc2hfc2V0X2hvc3RfcmR5KHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldikKK3sKKwl1aW50MzJfdCBob3N0X3N0YXR1cyA9IGlzaF9yZWdfcmVhZChkZXYsIElQQ19SRUdfSE9TVF9DT01NKTsKKworCUlQQ19TRVRfSE9TVF9SRUFEWShob3N0X3N0YXR1cyk7CisJaXNoX3JlZ193cml0ZShkZXYsIElQQ19SRUdfSE9TVF9DT01NLCBob3N0X3N0YXR1cyk7Cit9CisKKy8qKgorICogaXNoX2Nscl9ob3N0X3JkeSgpIC0gSW5kaWNhdGUgaG9zdCBub3QgcmVhZHkKKyAqIEBkZXY6IElTSFRQIGRldmljZSBwb2ludGVyCisgKgorICogU2VuZCBob3N0IG5vdCByZWFkeSBpbmRpY2F0aW9uIHRvIEZXCisgKi8KK3N0YXRpYyB2b2lkIGlzaF9jbHJfaG9zdF9yZHkoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCXVpbnQzMl90IGhvc3Rfc3RhdHVzID0gaXNoX3JlZ19yZWFkKGRldiwgSVBDX1JFR19IT1NUX0NPTU0pOworCisJSVBDX0NMRUFSX0hPU1RfUkVBRFkoaG9zdF9zdGF0dXMpOworCWlzaF9yZWdfd3JpdGUoZGV2LCBJUENfUkVHX0hPU1RfQ09NTSwgaG9zdF9zdGF0dXMpOworfQorCisvKioKKyAqIF9pc2h0cF9yZWFkX2hkcigpIC0gUmVhZCBtZXNzYWdlIGhlYWRlcgorICogQGRldjogSVNIVFAgZGV2aWNlIHBvaW50ZXIKKyAqCisgKiBSZWFkIGhlYWRlciBvZiAzMmJpdCBsZW5ndGgKKyAqCisgKiBSZXR1cm46IFJlYWQgcmVnaXN0ZXIgdmFsdWUKKyAqLworc3RhdGljIHVpbnQzMl90IF9pc2h0cF9yZWFkX2hkcihjb25zdCBzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGlzaF9yZWdfcmVhZChkZXYsIElQQ19SRUdfSVNIMkhPU1RfTVNHKTsKK30KKworLyoqCisgKiBfaXNodHBfcmVhZCAtIFJlYWQgbWVzc2FnZQorICogQGRldjogSVNIVFAgZGV2aWNlIHBvaW50ZXIKKyAqIEBidWZmZXI6IG1lc3NhZ2UgYnVmZmVyCisgKiBAYnVmZmVyX2xlbmd0aDogbGVuZ3RoIG9mIG1lc3NhZ2UgYnVmZmVyCisgKgorICogUmVhZCBtZXNzYWdlIGZyb20gRlcKKyAqCisgKiBSZXR1cm46IEFsd2F5cyAwCisgKi8KK3N0YXRpYyBpbnQgX2lzaHRwX3JlYWQoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJdW5zaWduZWQgbG9uZyBidWZmZXJfbGVuZ3RoKQoreworCXVpbnQzMl90CWk7CisJdWludDMyX3QJKnJfYnVmID0gKHVpbnQzMl90ICopYnVmZmVyOworCXVpbnQzMl90CW1zZ19vZmZzOworCisJbXNnX29mZnMgPSBJUENfUkVHX0lTSDJIT1NUX01TRyArIHNpemVvZihzdHJ1Y3QgaXNodHBfbXNnX2hkcik7CisJZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9sZW5ndGg7IGkgKz0gc2l6ZW9mKHVpbnQzMl90KSkKKwkJKnJfYnVmKysgPSBpc2hfcmVnX3JlYWQoZGV2LCBtc2dfb2ZmcyArIGkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd3JpdGVfaXBjX2Zyb21fcXVldWUoKSAtIHRyeSB0byB3cml0ZSBpcGMgbXNnIGZyb20gVHggcXVldWUgdG8gZGV2aWNlCisgKiBAZGV2OiBpc2h0cCBkZXZpY2UgcG9pbnRlcgorICoKKyAqIENoZWNrIGlmIERSQkwgaXMgY2xlYXJlZC4gaWYgaXQgaXMgLSB3cml0ZSB0aGUgZmlyc3QgSVBDIG1zZywgIHRoZW4gY2FsbAorICogdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICh1bmxlc3MgaXQncyBOVUxMKQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBlbHNlIGZhaWx1cmUgY29kZQorICovCitzdGF0aWMgaW50IHdyaXRlX2lwY19mcm9tX3F1ZXVlKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd3JfbXNnX2N0bF9pbmZvCSppcGNfbGluazsKKwl1bnNpZ25lZCBsb25nCWxlbmd0aDsKKwl1bnNpZ25lZCBsb25nCXJlbTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXVpbnQzMl90CWRvb3JiZWxsX3ZhbDsKKwl1aW50MzJfdAkqcl9idWY7CisJdWludDMyX3QJcmVnX2FkZHI7CisJaW50CWk7CisJdm9pZAkoKmlwY19zZW5kX2NvbXBsKSh2b2lkICopOworCXZvaWQJKmlwY19zZW5kX2NvbXBsX3BybTsKKwlzdGF0aWMgaW50CW91dF9pcGNfbG9ja2VkOworCXVuc2lnbmVkIGxvbmcJb3V0X2lwY19mbGFnczsKKworCWlmIChkZXYtPmRldl9zdGF0ZSA9PSBJU0hUUF9ERVZfRElTQUJMRUQpCisJCXJldHVybgktRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+b3V0X2lwY19zcGlubG9jaywgb3V0X2lwY19mbGFncyk7CisJaWYgKG91dF9pcGNfbG9ja2VkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+b3V0X2lwY19zcGlubG9jaywgb3V0X2lwY19mbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCW91dF9pcGNfbG9ja2VkID0gMTsKKwlpZiAoIWlzaF9pc19pbnB1dF9yZWFkeShkZXYpKSB7CisJCW91dF9pcGNfbG9ja2VkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5vdXRfaXBjX3NwaW5sb2NrLCBvdXRfaXBjX2ZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5vdXRfaXBjX3NwaW5sb2NrLCBvdXRfaXBjX2ZsYWdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPndyX3Byb2Nlc3Npbmdfc3BpbmxvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGlmIHR4IHNlbmQgbGlzdCBpcyBlbXB0eSAtIHJldHVybiAwOworCSAqIG1heSBoYXBwZW4sIGFzIFJYX0NPTVBMRVRFIGhhbmRsZXIgZG9lc24ndCBjaGVjayBsaXN0IGVtcHRpbmVzcy4KKwkgKi8KKwlpZiAobGlzdF9lbXB0eSgmZGV2LT53cl9wcm9jZXNzaW5nX2xpc3RfaGVhZC5saW5rKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPndyX3Byb2Nlc3Npbmdfc3BpbmxvY2ssIGZsYWdzKTsKKwkJb3V0X2lwY19sb2NrZWQgPSAwOworCQlyZXR1cm4JMDsKKwl9CisKKwlpcGNfbGluayA9IGxpc3RfZW50cnkoZGV2LT53cl9wcm9jZXNzaW5nX2xpc3RfaGVhZC5saW5rLm5leHQsCisJCQkgICAgICBzdHJ1Y3Qgd3JfbXNnX2N0bF9pbmZvLCBsaW5rKTsKKwkvKiBmaXJzdCA0IGJ5dGVzIG9mIHRoZSBkYXRhIGlzIHRoZSBkb29yYmVsbCB2YWx1ZSAoSVBDIGhlYWRlcikgKi8KKwlsZW5ndGggPSBpcGNfbGluay0+bGVuZ3RoIC0gc2l6ZW9mKHVpbnQzMl90KTsKKwlkb29yYmVsbF92YWwgPSAqKHVpbnQzMl90ICopaXBjX2xpbmstPmlubGluZV9kYXRhOworCXJfYnVmID0gKHVpbnQzMl90ICopKGlwY19saW5rLT5pbmxpbmVfZGF0YSArIHNpemVvZih1aW50MzJfdCkpOworCisJLyogSWYgc2VuZGluZyBNTkdfU1lOQ19GV19DTE9DSywgdXBkYXRlIGNsb2NrIGFnYWluICovCisJaWYgKElQQ19IRUFERVJfR0VUX1BST1RPQ09MKGRvb3JiZWxsX3ZhbCkgPT0gSVBDX1BST1RPQ09MX01ORyAmJgorCQlJUENfSEVBREVSX0dFVF9NTkdfQ01EKGRvb3JiZWxsX3ZhbCkgPT0gTU5HX1NZTkNfRldfQ0xPQ0spIHsKKwkJc3RydWN0IHRpbWVzcGVjIHRzX3N5c3RlbTsKKwkJc3RydWN0IHRpbWV2YWwgdHZfdXRjOworCQl1aW50NjRfdCAgICAgICAgdXNlY19zeXN0ZW0sIHVzZWNfdXRjOworCQlzdHJ1Y3QgaXBjX3RpbWVfdXBkYXRlX21zZyB0aW1lX3VwZGF0ZTsKKwkJc3RydWN0IHRpbWVfc3luY19mb3JtYXQgdHNfZm9ybWF0OworCisJCWdldF9tb25vdG9uaWNfYm9vdHRpbWUoJnRzX3N5c3RlbSk7CisJCWRvX2dldHRpbWVvZmRheSgmdHZfdXRjKTsKKwkJdXNlY19zeXN0ZW0gPSAodGltZXNwZWNfdG9fbnMoJnRzX3N5c3RlbSkpIC8gTlNFQ19QRVJfVVNFQzsKKwkJdXNlY191dGMgPSAodWludDY0X3QpdHZfdXRjLnR2X3NlYyAqIDEwMDAwMDAgKworCQkJCQkJKCh1aW50MzJfdCl0dl91dGMudHZfdXNlYyk7CisJCXRzX2Zvcm1hdC50czFfc291cmNlID0gSE9TVF9TWVNURU1fVElNRV9VU0VDOworCQl0c19mb3JtYXQudHMyX3NvdXJjZSA9IEhPU1RfVVRDX1RJTUVfVVNFQzsKKworCQl0aW1lX3VwZGF0ZS5wcmltYXJ5X2hvc3RfdGltZSA9IHVzZWNfc3lzdGVtOworCQl0aW1lX3VwZGF0ZS5zZWNvbmRhcnlfaG9zdF90aW1lID0gdXNlY191dGM7CisJCXRpbWVfdXBkYXRlLnN5bmNfaW5mbyA9IHRzX2Zvcm1hdDsKKworCQltZW1jcHkocl9idWYsICZ0aW1lX3VwZGF0ZSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXBjX3RpbWVfdXBkYXRlX21zZykpOworCX0KKworCWZvciAoaSA9IDAsIHJlZ19hZGRyID0gSVBDX1JFR19IT1NUMklTSF9NU0c7IGkgPCBsZW5ndGggPj4gMjsgaSsrLAorCQkJcmVnX2FkZHIgKz0gNCkKKwkJaXNoX3JlZ193cml0ZShkZXYsIHJlZ19hZGRyLCByX2J1ZltpXSk7CisKKwlyZW0gPSBsZW5ndGggJiAweDM7CisJaWYgKHJlbSA+IDApIHsKKwkJdWludDMyX3QgcmVnID0gMDsKKworCQltZW1jcHkoJnJlZywgJnJfYnVmW2xlbmd0aCA+PiAyXSwgcmVtKTsKKwkJaXNoX3JlZ193cml0ZShkZXYsIHJlZ19hZGRyLCByZWcpOworCX0KKwkvKiBGbHVzaCB3cml0ZXMgdG8gbXNnIHJlZ2lzdGVycyBhbmQgZG9vcmJlbGwgKi8KKwlpc2hfcmVnX3JlYWQoZGV2LCBJUENfUkVHX0lTSF9IT1NUX0ZXU1RTKTsKKworCS8qIFVwZGF0ZSBJUEMgY291bnRlcnMgKi8KKwkrK2Rldi0+aXBjX3R4X2NudDsKKwlkZXYtPmlwY190eF9ieXRlc19jbnQgKz0gSVBDX0hFQURFUl9HRVRfTEVOR1RIKGRvb3JiZWxsX3ZhbCk7CisKKwlpc2hfcmVnX3dyaXRlKGRldiwgSVBDX1JFR19IT1NUMklTSF9EUkJMLCBkb29yYmVsbF92YWwpOworCW91dF9pcGNfbG9ja2VkID0gMDsKKworCWlwY19zZW5kX2NvbXBsID0gaXBjX2xpbmstPmlwY19zZW5kX2NvbXBsOworCWlwY19zZW5kX2NvbXBsX3BybSA9IGlwY19saW5rLT5pcGNfc2VuZF9jb21wbF9wcm07CisJbGlzdF9kZWxfaW5pdCgmaXBjX2xpbmstPmxpbmspOworCWxpc3RfYWRkX3RhaWwoJmlwY19saW5rLT5saW5rLCAmZGV2LT53cl9mcmVlX2xpc3RfaGVhZC5saW5rKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPndyX3Byb2Nlc3Npbmdfc3BpbmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgb3V0IG9mIHNwaW5sb2NrLAorCSAqIGFmdGVyIGlwY19saW5rIHJldHVybmVkIHRvIGZyZWUgbGlzdAorCSAqLworCWlmIChpcGNfc2VuZF9jb21wbCkKKwkJaXBjX3NlbmRfY29tcGwoaXBjX3NlbmRfY29tcGxfcHJtKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHdyaXRlX2lwY190b19xdWV1ZSgpIC0gd3JpdGUgaXBjIG1zZyB0byBUeCBxdWV1ZQorICogQGRldjogaXNodHAgZGV2aWNlIGluc3RhbmNlCisgKiBAaXBjX3NlbmRfY29tcGw6IFNlbmQgY29tcGxldGUgY2FsbGJhY2sKKyAqIEBpcGNfc2VuZF9jb21wbF9wcm06CVBhcmFtZXRlciB0byBzZW5kIGluIGNvbXBsZXRlIGNhbGxiYWNrCisgKiBAbXNnOiBQb2ludGVyIHRvIG1lc3NhZ2UKKyAqIEBsZW5ndGg6IExlbmd0aCBvZiBtZXNzYWdlCisgKgorICogUmVjaXZlZCBtc2cgd2l0aCBJUEMgKGFuZCB1cHBlciBwcm90b2NvbCkgaGVhZGVyICBhbmQgYWRkIGl0IHRvIHRoZSBkZXZpY2UKKyAqICBUeC10by13cml0ZSBsaXN0IHRoZW4gdHJ5IHRvIHNlbmQgdGhlIGZpcnN0IElQQyB3YWl0aW5nIG1zZworICogIChpZiBEUkJMIGlzIGNsZWFyZWQpCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgbmVnYXRpdmUgdmFsdWUgZm9yIGZhaWx1cmUgKG1lYW5zIGZyZWUgbGlzdAorICogIGlzIGVtcHR5LCBvciBtc2cgdG9vIGxvbmcpIGFuZCAwIGZvciBzdWNjZXNzLgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBlbHNlIGZhaWx1cmUgY29kZQorICovCitzdGF0aWMgaW50IHdyaXRlX2lwY190b19xdWV1ZShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsCisJdm9pZCAoKmlwY19zZW5kX2NvbXBsKSh2b2lkICopLCB2b2lkICppcGNfc2VuZF9jb21wbF9wcm0sCisJdW5zaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCB3cl9tc2dfY3RsX2luZm8gKmlwY19saW5rOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAobGVuZ3RoID4gSVBDX0ZVTExfTVNHX1NJWkUpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT53cl9wcm9jZXNzaW5nX3NwaW5sb2NrLCBmbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJmRldi0+d3JfZnJlZV9saXN0X2hlYWQubGluaykpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT53cl9wcm9jZXNzaW5nX3NwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpcGNfbGluayA9IGxpc3RfZW50cnkoZGV2LT53cl9mcmVlX2xpc3RfaGVhZC5saW5rLm5leHQsCisJCXN0cnVjdCB3cl9tc2dfY3RsX2luZm8sIGxpbmspOworCWxpc3RfZGVsX2luaXQoJmlwY19saW5rLT5saW5rKTsKKworCWlwY19saW5rLT5pcGNfc2VuZF9jb21wbCA9IGlwY19zZW5kX2NvbXBsOworCWlwY19saW5rLT5pcGNfc2VuZF9jb21wbF9wcm0gPSBpcGNfc2VuZF9jb21wbF9wcm07CisJaXBjX2xpbmstPmxlbmd0aCA9IGxlbmd0aDsKKwltZW1jcHkoaXBjX2xpbmstPmlubGluZV9kYXRhLCBtc2csIGxlbmd0aCk7CisKKwlsaXN0X2FkZF90YWlsKCZpcGNfbGluay0+bGluaywgJmRldi0+d3JfcHJvY2Vzc2luZ19saXN0X2hlYWQubGluayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT53cl9wcm9jZXNzaW5nX3NwaW5sb2NrLCBmbGFncyk7CisKKwl3cml0ZV9pcGNfZnJvbV9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXBjX3NlbmRfbW5nX21zZygpIC0gU2VuZCBtYW5hZ2VtZW50IG1lc3NhZ2UKKyAqIEBkZXY6IGlzaHRwIGRldmljZSBpbnN0YW5jZQorICogQG1zZ19jb2RlOiBNZXNzYWdlIGNvZGUKKyAqIEBtc2c6IFBvaW50ZXIgdG8gbWVzc2FnZQorICogQHNpemU6IExlbmd0aCBvZiBtZXNzYWdlCisgKgorICogU2VuZCBtYW5hZ2VtZW50IG1lc3NhZ2UgdG8gRlcKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MgZWxzZSBmYWlsdXJlIGNvZGUKKyAqLworc3RhdGljIGludCBpcGNfc2VuZF9tbmdfbXNnKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwgdWludDMyX3QgbXNnX2NvZGUsCisJdm9pZCAqbXNnLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBjaGFyCWlwY19tc2dbSVBDX0ZVTExfTVNHX1NJWkVdOworCXVpbnQzMl90CWRyYmxfdmFsID0gSVBDX0JVSUxEX01OR19NU0cobXNnX2NvZGUsIHNpemUpOworCisJbWVtY3B5KGlwY19tc2csICZkcmJsX3ZhbCwgc2l6ZW9mKHVpbnQzMl90KSk7CisJbWVtY3B5KGlwY19tc2cgKyBzaXplb2YodWludDMyX3QpLCBtc2csIHNpemUpOworCXJldHVybgl3cml0ZV9pcGNfdG9fcXVldWUoZGV2LCBOVUxMLCBOVUxMLCBpcGNfbXNnLAorCQlzaXplb2YodWludDMyX3QpICsgc2l6ZSk7Cit9CisKKy8qKgorICogaXNoX2Z3X3Jlc2V0X2hhbmRsZXIoKSAtIEZXIHJlc2V0IGhhbmRsZXIKKyAqIEBkZXY6IGlzaHRwIGRldmljZSBwb2ludGVyCisgKgorICogSGFuZGxlIEZXIHJlc2V0CisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZSBjb2RlCisgKi8KK3N0YXRpYyBpbnQgaXNoX2Z3X3Jlc2V0X2hhbmRsZXIoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCXVpbnQzMl90CXJlc2V0X2lkOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IHdyX21zZ19jdGxfaW5mbyAqcHJvY2Vzc2luZywgKm5leHQ7CisKKwkvKiBSZWFkIHJlc2V0IElEICovCisJcmVzZXRfaWQgPSBpc2hfcmVnX3JlYWQoZGV2LCBJUENfUkVHX0lTSDJIT1NUX01TRykgJiAweEZGRkY7CisKKwkvKiBDbGVhciBJUEMgb3V0cHV0IHF1ZXVlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+d3JfcHJvY2Vzc2luZ19zcGlubG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwcm9jZXNzaW5nLCBuZXh0LAorCQkJJmRldi0+d3JfcHJvY2Vzc2luZ19saXN0X2hlYWQubGluaywgbGluaykgeworCQlsaXN0X21vdmVfdGFpbCgmcHJvY2Vzc2luZy0+bGluaywgJmRldi0+d3JfZnJlZV9saXN0X2hlYWQubGluayk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+d3JfcHJvY2Vzc2luZ19zcGlubG9jaywgZmxhZ3MpOworCisJLyogSVNIVFAgbm90aWZpY2F0aW9uIGluIElQQ19SRVNFVCAqLworCWlzaHRwX3Jlc2V0X2hhbmRsZXIoZGV2KTsKKworCWlmICghaXNoX2lzX2lucHV0X3JlYWR5KGRldikpCisJCXRpbWVkX3dhaXRfZm9yX3RpbWVvdXQoV0FJVF9GT1JfU0VORF9TTElDRSwKKwkJCWlzaF9pc19pbnB1dF9yZWFkeShkZXYpLCAoMiAqIEhaKSk7CisKKwkvKiBJU0ggRlcgaXMgZGVhZCAqLworCWlmICghaXNoX2lzX2lucHV0X3JlYWR5KGRldikpCisJCXJldHVybgktRVBJUEU7CisJLyoKKwkgKiBTZXQgSE9TVDJJU0guSUxVUC4gQXBwYXJlbnRseSB3ZSBuZWVkIHRoaXMgQkVGT1JFIHNlbmRpbmcKKwkgKiBSRVNFVF9OT1RJRllfQUNLIC0gRlcgd2lsbCBiZSBjaGVja2luZyBmb3IgaXQKKwkgKi8KKwlpc2hfc2V0X2hvc3RfcmR5KGRldik7CisJLyogU2VuZCBSRVNFVF9OT1RJRllfQUNLICh3aXRoIHJlc2V0X2lkKSAqLworCWlwY19zZW5kX21uZ19tc2coZGV2LCBNTkdfUkVTRVRfTk9USUZZX0FDSywgJnJlc2V0X2lkLAorCQkJIHNpemVvZih1aW50MzJfdCkpOworCisJLyogV2FpdCBmb3IgSVNIIEZXJ2VzIElMVVAgYW5kIElTSFRQX1JFQURZICovCisJdGltZWRfd2FpdF9mb3JfdGltZW91dChXQUlUX0ZPUl9TRU5EX1NMSUNFLCBpc2h0cF9md19pc19yZWFkeShkZXYpLAorCQkoMiAqIEhaKSk7CisJaWYgKCFpc2h0cF9md19pc19yZWFkeShkZXYpKSB7CisJCS8qIElTSCBGVyBpcyBkZWFkICovCisJCXVpbnQzMl90CWlzaF9zdGF0dXM7CisKKwkJaXNoX3N0YXR1cyA9IF9pc2hfcmVhZF9md19zdHNfcmVnKGRldik7CisJCWRldl9lcnIoZGV2LT5kZXZjLAorCQkJIltpc2h0cC1pc2hdOiBjb21wbGV0ZWQgcmVzZXQsIElTSCBpcyBkZWFkIChGV1NUUyA9ICUwOFgpXG4iLAorCQkJaXNoX3N0YXR1cyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4JMDsKK30KKworLyoqCisgKiBpc2hfZndfcmVzZXRfd29ya19mbigpIC0gRlcgcmVzZXQgd29ya2VyIGZ1bmN0aW9uCisgKiBAdW51c2VkOiBub3QgdXNlZAorICoKKyAqIENhbGwgaXNoX2Z3X3Jlc2V0X2hhbmRsZXIgdG8gY29tcGxldGUgRlcgcmVzZXQKKyAqLworc3RhdGljIHZvaWQgZndfcmVzZXRfd29ya19mbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnVudXNlZCkKK3sKKwlpbnQJcnY7CisKKwlydiA9IGlzaF9md19yZXNldF9oYW5kbGVyKGlzaHRwX2Rldik7CisJaWYgKCFydikgeworCQkvKiBJU0ggaXMgSUxVUCAmIElTSFRQLXJlYWR5LiBSZXN0YXJ0IElTSFRQICovCisJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAzKTsKKwkJaXNodHBfZGV2LT5yZWN2ZF9od19yZWFkeSA9IDE7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaXNodHBfZGV2LT53YWl0X2h3X3JlYWR5KTsKKworCQkvKiBJU0hUUCBub3RpZmljYXRpb24gaW4gSVBDX1JFU0VUIHNlcXVlbmNlIGNvbXBsZXRpb24gKi8KKwkJaXNodHBfcmVzZXRfY29tcGxfaGFuZGxlcihpc2h0cF9kZXYpOworCX0gZWxzZQorCQlkZXZfZXJyKGlzaHRwX2Rldi0+ZGV2YywgIltpc2h0cC1pc2hdOiBGVyByZXNldCBmYWlsZWQgKCVkKVxuIiwKKwkJCXJ2KTsKK30KKworLyoqCisgKiBfaXNoX3N5bmNfZndfY2xvY2soKSAtU3luYyBGVyBjbG9jayB3aXRoIHRoZSBPUyBjbG9jaworICogQGRldjogaXNodHAgZGV2aWNlIHBvaW50ZXIKKyAqCisgKiBTeW5jIEZXIGFuZCBPUyB0aW1lCisgKi8KK3N0YXRpYyB2b2lkIF9pc2hfc3luY19md19jbG9jayhzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcJcHJldl9zeW5jOworCXN0cnVjdCB0aW1lc3BlYwl0czsKKwl1aW50NjRfdAl1c2VjOworCisJaWYgKHByZXZfc3luYyAmJiBqaWZmaWVzIC0gcHJldl9zeW5jIDwgMjAgKiBIWikKKwkJcmV0dXJuOworCisJcHJldl9zeW5jID0gamlmZmllczsKKwlnZXRfbW9ub3RvbmljX2Jvb3R0aW1lKCZ0cyk7CisJdXNlYyA9ICh0aW1lc3BlY190b19ucygmdHMpKSAvIE5TRUNfUEVSX1VTRUM7CisJaXBjX3NlbmRfbW5nX21zZyhkZXYsIE1OR19TWU5DX0ZXX0NMT0NLLCAmdXNlYywgc2l6ZW9mKHVpbnQ2NF90KSk7Cit9CisKKy8qKgorICogcmVjdl9pcGMoKSAtIFJlY2VpdmUgYW5kIHByb2Nlc3MgSVBDIG1hbmFnZW1lbnQgbWVzc2FnZXMKKyAqIEBkZXY6IGlzaHRwIGRldmljZSBpbnN0YW5jZQorICogQGRvb3JiZWxsX3ZhbDogZG9vcmJlbGwgdmFsdWUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgaW4gSVNSIGNvbnRleHQuCisgKiBOT1RFOiBBbnkgb3RoZXIgbW5nIGNvbW1hbmQgdGhhbiByZXNldF9ub3RpZnkgYW5kIHJlc2V0X25vdGlmeV9hY2sKKyAqIHdvbid0IHdha2UgQkggaGFuZGxlcgorICovCitzdGF0aWMgdm9pZAlyZWN2X2lwYyhzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsIHVpbnQzMl90IGRvb3JiZWxsX3ZhbCkKK3sKKwl1aW50MzJfdAltbmdfY21kOworCisJbW5nX2NtZCA9IElQQ19IRUFERVJfR0VUX01OR19DTUQoZG9vcmJlbGxfdmFsKTsKKworCXN3aXRjaCAobW5nX2NtZCkgeworCWRlZmF1bHQ6CisJCWJyZWFrOworCisJY2FzZSBNTkdfUlhfQ01QTF9JTkRJQ0FUSU9OOgorCQlpZiAoZGV2LT5zdXNwZW5kX2ZsYWcpIHsKKwkJCWRldi0+c3VzcGVuZF9mbGFnID0gMDsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5zdXNwZW5kX3dhaXQpOworCQl9CisJCWlmIChkZXYtPnJlc3VtZV9mbGFnKSB7CisJCQlkZXYtPnJlc3VtZV9mbGFnID0gMDsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5yZXN1bWVfd2FpdCk7CisJCX0KKworCQl3cml0ZV9pcGNfZnJvbV9xdWV1ZShkZXYpOworCQlicmVhazsKKworCWNhc2UgTU5HX1JFU0VUX05PVElGWToKKwkJaWYgKCFpc2h0cF9kZXYpIHsKKwkJCWlzaHRwX2RldiA9IGRldjsKKwkJCUlOSVRfV09SSygmZndfcmVzZXRfd29yaywgZndfcmVzZXRfd29ya19mbik7CisJCX0KKwkJc2NoZWR1bGVfd29yaygmZndfcmVzZXRfd29yayk7CisJCWJyZWFrOworCisJY2FzZSBNTkdfUkVTRVRfTk9USUZZX0FDSzoKKwkJZGV2LT5yZWN2ZF9od19yZWFkeSA9IDE7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT53YWl0X2h3X3JlYWR5KTsKKwkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIGlzaF9pcnFfaGFuZGxlcigpIC0gSVNIIElSUSBoYW5kbGVyCisgKiBAaXJxOiBpcnEgbnVtYmVyCisgKiBAZGV2X2lkOiBpc2h0cCBkZXZpY2UgcG9pbnRlcgorICoKKyAqIElTSCBJUlEgaGFuZGxlci4gSWYgaW50ZXJydXB0IGlzIGdlbmVyYXRlZCBhbmQgaXMgZm9yIElTSCBpdCB3aWxsIHByb2Nlc3MKKyAqIHRoZSBpbnRlcnJ1cHQuCisgKi8KK2lycXJldHVybl90IGlzaF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGlzaHRwX2RldmljZQkqZGV2ID0gZGV2X2lkOworCXVpbnQzMl90CWRvb3JiZWxsX3ZhbDsKKwlib29sCWludGVycnVwdF9nZW5lcmF0ZWQ7CisKKwkvKiBDaGVjayB0aGF0IGl0J3MgaW50ZXJydXB0IGZyb20gSVNIIChtYXkgYmUgc2hhcmVkKSAqLworCWludGVycnVwdF9nZW5lcmF0ZWQgPSBjaGVja19nZW5lcmF0ZWRfaW50ZXJydXB0KGRldik7CisKKwlpZiAoIWludGVycnVwdF9nZW5lcmF0ZWQpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWRvb3JiZWxsX3ZhbCA9IGlzaF9yZWdfcmVhZChkZXYsIElQQ19SRUdfSVNIMkhPU1RfRFJCTCk7CisJaWYgKCFJUENfSVNfQlVTWShkb29yYmVsbF92YWwpKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlpZiAoZGV2LT5kZXZfc3RhdGUgPT0gSVNIVFBfREVWX0RJU0FCTEVEKQorCQlyZXR1cm4JSVJRX0hBTkRMRUQ7CisKKwkvKiBTYW5pdHkgY2hlY2s6IElQQyBkZ3JhbSBsZW5ndGggaW4gaGVhZGVyICovCisJaWYgKElQQ19IRUFERVJfR0VUX0xFTkdUSChkb29yYmVsbF92YWwpID4gSVBDX1BBWUxPQURfU0laRSkgeworCQlkZXZfZXJyKGRldi0+ZGV2YywKKwkJCSJJUEMgaGRyIC0gYmFkIGxlbmd0aDogJXU7IGRyb3BwZWRcbiIsCisJCQkodW5zaWduZWQgaW50KUlQQ19IRUFERVJfR0VUX0xFTkdUSChkb29yYmVsbF92YWwpKTsKKwkJZ290bwllb2k7CisJfQorCisJc3dpdGNoIChJUENfSEVBREVSX0dFVF9QUk9UT0NPTChkb29yYmVsbF92YWwpKSB7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJY2FzZSBJUENfUFJPVE9DT0xfTU5HOgorCQlyZWN2X2lwYyhkZXYsIGRvb3JiZWxsX3ZhbCk7CisJCWJyZWFrOworCWNhc2UgSVBDX1BST1RPQ09MX0lTSFRQOgorCQlpc2h0cF9yZWN2KGRldik7CisJCWJyZWFrOworCX0KKworZW9pOgorCS8qIFVwZGF0ZSBJUEMgY291bnRlcnMgKi8KKwkrK2Rldi0+aXBjX3J4X2NudDsKKwlkZXYtPmlwY19yeF9ieXRlc19jbnQgKz0gSVBDX0hFQURFUl9HRVRfTEVOR1RIKGRvb3JiZWxsX3ZhbCk7CisKKwlpc2hfcmVnX3dyaXRlKGRldiwgSVBDX1JFR19JU0gySE9TVF9EUkJMLCAwKTsKKwkvKiBGbHVzaCB3cml0ZSB0byBkb29yYmVsbCAqLworCWlzaF9yZWdfcmVhZChkZXYsIElQQ19SRUdfSVNIX0hPU1RfRldTVFMpOworCisJcmV0dXJuCUlSUV9IQU5ETEVEOworfQorCisvKioKKyAqIF9pc2hfaHdfcmVzZXQoKSAtIEhXIHJlc2V0CisgKiBAZGV2OiBpc2h0cCBkZXZpY2UgcG9pbnRlcgorICoKKyAqIFJlc2V0IElTSCBIVyB0byByZWNvdmVyIGlmIGFueSBlcnJvcgorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBlbHNlIGVycm9yIGZhdWx0IGNvZGUKKyAqLworc3RhdGljIGludCBfaXNoX2h3X3Jlc2V0KHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldi0+cGRldjsKKwlpbnQJcnY7CisJdW5zaWduZWQgaW50CWRtYV9kZWxheTsKKwl1aW50MTZfdCBjc3I7CisKKwlpZiAoIXBkZXYpCisJCXJldHVybgktRU5PREVWOworCisJcnYgPSBwY2lfcmVzZXRfZnVuY3Rpb24ocGRldik7CisJaWYgKCFydikKKwkJZGV2LT5kZXZfc3RhdGUgPSBJU0hUUF9ERVZfUkVTRVRUSU5HOworCisJaWYgKCFwZGV2LT5wbV9jYXApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgcmVzZXQgLSBubyBQTSBjYXBzXG4iKTsKKwkJcmV0dXJuCS1FSU5WQUw7CisJfQorCisJLyogTm93IHRyaWdnZXIgcmVzZXQgdG8gRlcgKi8KKwlpc2hfcmVnX3dyaXRlKGRldiwgSVBDX1JFR19JU0hfUk1QMiwgMCk7CisKKwlmb3IgKGRtYV9kZWxheSA9IDA7IGRtYV9kZWxheSA8IE1BWF9ETUFfREVMQVkgJiYKKwkJX2lzaF9yZWFkX2Z3X3N0c19yZWcoZGV2KSAmIChJUENfSVNIX0lOX0RNQSk7CisJCWRtYV9kZWxheSArPSA1KQorCQltZGVsYXkoNSk7CisKKwlpZiAoZG1hX2RlbGF5ID49IE1BWF9ETUFfREVMQVkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkNhbid0IHJlc2V0IC0gc3R1Y2sgd2l0aCBETUEgaW4tcHJvZ3Jlc3NcbiIpOworCQlyZXR1cm4JLUVCVVNZOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBkZXYtPnBtX2NhcCArIFBDSV9QTV9DVFJMLCAmY3NyKTsKKworCWNzciAmPSB+UENJX1BNX0NUUkxfU1RBVEVfTUFTSzsKKwljc3IgfD0gUENJX0QzaG90OworCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBwZGV2LT5wbV9jYXAgKyBQQ0lfUE1fQ1RSTCwgY3NyKTsKKworCW1kZWxheShwZGV2LT5kM19kZWxheSk7CisKKwljc3IgJj0gflBDSV9QTV9DVFJMX1NUQVRFX01BU0s7CisJY3NyIHw9IFBDSV9EMDsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcGRldi0+cG1fY2FwICsgUENJX1BNX0NUUkwsIGNzcik7CisKKwlpc2hfcmVnX3dyaXRlKGRldiwgSVBDX1JFR19JU0hfUk1QMiwgSVBDX1JNUDJfRE1BX0VOQUJMRUQpOworCisJLyoKKwkgKiBTZW5kIDAgSVBDIG1lc3NhZ2Ugc28gdGhhdCBJU0ggRlcgd2FrZXMgdXAgaWYgaXQgd2FzIGFscmVhZHkKKwkgKiBhc2xlZXAKKwkgKi8KKwlpc2hfcmVnX3dyaXRlKGRldiwgSVBDX1JFR19IT1NUMklTSF9EUkJMLCBJUENfRFJCTF9CVVNZX0JJVCk7CisKKwkvKiBGbHVzaCB3cml0ZXMgdG8gZG9vcmJlbGwgYW5kIFJFTUFQMiAqLworCWlzaF9yZWdfcmVhZChkZXYsIElQQ19SRUdfSVNIX0hPU1RfRldTVFMpOworCisJcmV0dXJuCTA7Cit9CisKKy8qKgorICogX2lzaF9pcGNfcmVzZXQoKSAtIElQQyByZXNldAorICogQGRldjogaXNodHAgZGV2aWNlIHBvaW50ZXIKKyAqCisgKiBSZXNldHMgaG9zdCBhbmQgZncgSVBDIGFuZCB1cHBlciBsYXllcnMKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MgZWxzZSBlcnJvciBmYXVsdCBjb2RlCisgKi8KK3N0YXRpYyBpbnQgX2lzaF9pcGNfcmVzZXQoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcGNfcnN0X3BheWxvYWRfdHlwZSBpcGNfbW5nX21zZzsKKwlpbnQJcnYgPSAwOworCisJaXBjX21uZ19tc2cucmVzZXRfaWQgPSAxOworCWlwY19tbmdfbXNnLnJlc2VydmVkID0gMDsKKworCXNldF9ob3N0X3JlYWR5KGRldik7CisKKwkvKiBDbGVhciB0aGUgaW5jb21pbmcgZG9vcmJlbGwgKi8KKwlpc2hfcmVnX3dyaXRlKGRldiwgSVBDX1JFR19JU0gySE9TVF9EUkJMLCAwKTsKKwkvKiBGbHVzaCB3cml0ZSB0byBkb29yYmVsbCAqLworCWlzaF9yZWdfcmVhZChkZXYsIElQQ19SRUdfSVNIX0hPU1RfRldTVFMpOworCisJZGV2LT5yZWN2ZF9od19yZWFkeSA9IDA7CisKKwkvKiBzZW5kIG1lc3NhZ2UgKi8KKwlydiA9IGlwY19zZW5kX21uZ19tc2coZGV2LCBNTkdfUkVTRVRfTk9USUZZLCAmaXBjX21uZ19tc2csCisJCXNpemVvZihzdHJ1Y3QgaXBjX3JzdF9wYXlsb2FkX3R5cGUpKTsKKwlpZiAocnYpIHsKKwkJZGV2X2VycihkZXYtPmRldmMsICJGYWlsZWQgdG8gc2VuZCBJUEMgTU5HX1JFU0VUX05PVElGWVxuIik7CisJCXJldHVybglydjsKKwl9CisKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPndhaXRfaHdfcmVhZHksCisJCQkJCSBkZXYtPnJlY3ZkX2h3X3JlYWR5LCAyICogSFopOworCWlmICghZGV2LT5yZWN2ZF9od19yZWFkeSkgeworCQlkZXZfZXJyKGRldi0+ZGV2YywgIlRpbWVkIG91dCB3YWl0aW5nIGZvciBIVyByZWFkeVxuIik7CisJCXJ2ID0gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisKKy8qKgorICogaXNoX2h3X3N0YXJ0KCkgLVN0YXJ0IElTSCBIVworICogQGRldjogaXNodHAgZGV2aWNlIHBvaW50ZXIKKyAqCisgKiBTZXQgaG9zdCB0byByZWFkeSBzdGF0ZSBhbmQgd2FpdCBmb3IgRlcgcmVzZXQKKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3MgZWxzZSBlcnJvciBmYXVsdCBjb2RlCisgKi8KK2ludCBpc2hfaHdfc3RhcnQoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCWlzaF9zZXRfaG9zdF9yZHkoZGV2KTsKKwkvKiBBZnRlciB0aGF0IHdlIGNhbiBlbmFibGUgSVNIIERNQSBvcGVyYXRpb24gKi8KKwlpc2hfcmVnX3dyaXRlKGRldiwgSVBDX1JFR19JU0hfUk1QMiwgSVBDX1JNUDJfRE1BX0VOQUJMRUQpOworCisJLyoKKwkgKiBTZW5kIDAgSVBDIG1lc3NhZ2Ugc28gdGhhdCBJU0ggRlcgd2FrZXMgdXAgaWYgaXQgd2FzIGFscmVhZHkKKwkgKiBhc2xlZXAKKwkgKi8KKwlpc2hfcmVnX3dyaXRlKGRldiwgSVBDX1JFR19IT1NUMklTSF9EUkJMLCBJUENfRFJCTF9CVVNZX0JJVCk7CisJLyogRmx1c2ggd3JpdGUgdG8gZG9vcmJlbGwgKi8KKwlpc2hfcmVnX3JlYWQoZGV2LCBJUENfUkVHX0lTSF9IT1NUX0ZXU1RTKTsKKworCXNldF9ob3N0X3JlYWR5KGRldik7CisKKwkvKiB3YWl0IGZvciBGVy1pbml0aWF0ZWQgcmVzZXQgZmxvdyAqLworCWlmICghZGV2LT5yZWN2ZF9od19yZWFkeSkKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZGV2LT53YWl0X2h3X3JlYWR5LAorCQkJCQkJIGRldi0+cmVjdmRfaHdfcmVhZHksCisJCQkJCQkgMTAgKiBIWik7CisKKwlpZiAoIWRldi0+cmVjdmRfaHdfcmVhZHkpIHsKKwkJZGV2X2VycihkZXYtPmRldmMsCisJCQkiW2lzaHRwLWlzaF06IFRpbWVkIG91dCB3YWl0aW5nIGZvciBGVy1pbml0aWF0ZWQgcmVzZXRcbiIpOworCQlyZXR1cm4JLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpc2hfaXBjX2dldF9oZWFkZXIoKSAtR2V0IGRvb3JiZWxsIHZhbHVlCisgKiBAZGV2OiBpc2h0cCBkZXZpY2UgcG9pbnRlcgorICogQGxlbmd0aDogbGVuZ3RoIG9mIG1lc3NhZ2UKKyAqIEBidXN5OiBidXN5IHN0YXR1cworICoKKyAqIEdldCBkb29yIGJlbGwgdmFsdWUgZnJvbSBtZXNzYWdlIGhlYWRlcgorICoKKyAqIFJldHVybjogZG9vciBiZWxsIHZhbHVlCisgKi8KK3N0YXRpYyB1aW50MzJfdCBpc2hfaXBjX2dldF9oZWFkZXIoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LCBpbnQgbGVuZ3RoLAorCQkJCSAgIGludCBidXN5KQoreworCXVpbnQzMl90IGRyYmxfdmFsOworCisJZHJibF92YWwgPSBJUENfQlVJTERfSEVBREVSKGxlbmd0aCwgSVBDX1BST1RPQ09MX0lTSFRQLCBidXN5KTsKKworCXJldHVybiBkcmJsX3ZhbDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpc2h0cF9od19vcHMgaXNoX2h3X29wcyA9IHsKKwkuaHdfcmVzZXQgPSBfaXNoX2h3X3Jlc2V0LAorCS5pcGNfcmVzZXQgPSBfaXNoX2lwY19yZXNldCwKKwkuaXBjX2dldF9oZWFkZXIgPSBpc2hfaXBjX2dldF9oZWFkZXIsCisJLmlzaHRwX3JlYWQgPSBfaXNodHBfcmVhZCwKKwkud3JpdGUgPSB3cml0ZV9pcGNfdG9fcXVldWUsCisJLmdldF9md19zdGF0dXMgPSBfaXNoX3JlYWRfZndfc3RzX3JlZywKKwkuc3luY19md19jbG9jayA9IF9pc2hfc3luY19md19jbG9jaywKKwkuaXNodHBfcmVhZF9oZHIgPSBfaXNodHBfcmVhZF9oZHIKK307CisKKy8qKgorICogaXNoX2Rldl9pbml0KCkgLUluaXRpYWxpemUgSVNIIGRldm9jZQorICogQHBkZXY6IFBDSSBkZXZpY2UKKyAqCisgKiBBbGxvY2F0ZSBJU0hUUCBkZXZpY2UgYW5kIGluaXRpYWxpemUgSVBDIHByb2Nlc3NpbmcKKyAqCisgKiBSZXR1cm46IElTSFRQIGRldmljZSBpbnN0YW5jZSBvbiBzdWNjZXNzIGVsc2UgTlVMTAorICovCitzdHJ1Y3QgaXNodHBfZGV2aWNlICppc2hfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGlzaHRwX2RldmljZSAqZGV2OworCWludAlpOworCisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlzaHRwX2RldmljZSkgKyBzaXplb2Yoc3RydWN0IGlzaF9odyksCisJCUdGUF9LRVJORUwpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCWlzaHRwX2RldmljZV9pbml0KGRldik7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndhaXRfaHdfcmVhZHkpOworCisJc3Bpbl9sb2NrX2luaXQoJmRldi0+d3JfcHJvY2Vzc2luZ19zcGlubG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+b3V0X2lwY19zcGlubG9jayk7CisKKwkvKiBJbml0IElQQyBwcm9jZXNzaW5nIGFuZCBmcmVlIGxpc3RzICovCisJSU5JVF9MSVNUX0hFQUQoJmRldi0+d3JfcHJvY2Vzc2luZ19saXN0X2hlYWQubGluayk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+d3JfZnJlZV9saXN0X2hlYWQubGluayk7CisJZm9yIChpID0gMDsgaSA8IElQQ19UWF9GSUZPX1NJWkU7ICsraSkgeworCQlzdHJ1Y3Qgd3JfbXNnX2N0bF9pbmZvCSp0eF9idWY7CisKKwkJdHhfYnVmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdyX21zZ19jdGxfaW5mbyksIEdGUF9LRVJORUwpOworCQlpZiAoIXR4X2J1ZikgeworCQkJLyoKKwkJCSAqIElQQyBidWZmZXJzIG1heSBiZSBsaW1pdGVkIG9yIG5vdCBhdmFpbGFibGUKKwkJCSAqIGF0IGFsbCAtIGFsdGhvdWdoIHRoaXMgc2hvdWxkbid0IGhhcHBlbgorCQkJICovCisJCQlkZXZfZXJyKGRldi0+ZGV2YywKKwkJCQkiW2lzaHRwLWlzaF06IGZhaWx1cmUgaW4gVHggRklGTyBhbGxvY2F0aW9ucyAoJWQpXG4iLAorCQkJCWkpOworCQkJYnJlYWs7CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmdHhfYnVmLT5saW5rLCAmZGV2LT53cl9mcmVlX2xpc3RfaGVhZC5saW5rKTsKKwl9CisKKwlkZXYtPm9wcyA9ICZpc2hfaHdfb3BzOworCWRldi0+ZGV2YyA9ICZwZGV2LT5kZXY7CisJZGV2LT5tdHUgPSBJUENfUEFZTE9BRF9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBpc2h0cF9tc2dfaGRyKTsKKwlyZXR1cm4gZGV2OworfQorCisvKioKKyAqIGlzaF9kZXZpY2VfZGlzYWJsZSgpIC0gRGlzYWJsZSBJU0ggZGV2aWNlCisgKiBAZGV2OiBJU0hUUCBkZXZpY2UgcG9pbnRlcgorICoKKyAqIERpc2FibGUgSVNIIGJ5IGNsZWFyaW5nIGhvc3QgcmVhZHkgdG8gaW5mb3JtIGZpcm13YXJlLgorICovCit2b2lkCWlzaF9kZXZpY2VfZGlzYWJsZShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJZGV2LT5kZXZfc3RhdGUgPSBJU0hUUF9ERVZfRElTQUJMRUQ7CisJaXNoX2Nscl9ob3N0X3JkeShkZXYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pcGMvcGNpLWlzaC5jIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pcGMvcGNpLWlzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZjBiZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lwYy9wY2ktaXNoLmMKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBQQ0kgZ2x1ZSBmb3IgSVNIVFAgcHJvdmlkZXIgZGV2aWNlIChJU0gpIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9pbnRlbF9pc2guaD4KKyNpbmNsdWRlICJpc2h0cC1kZXYuaCIKKyNpbmNsdWRlICJody1pc2guaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlzaF9wY2lfdGJsW10gPSB7CisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgQ0hWX0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIEJYVF9BeF9ERVZJQ0VfSUQpfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBCWFRfQnhfREVWSUNFX0lEKX0sCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgQVBMX0F4X0RFVklDRV9JRCl9LAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFNQVF9BeF9ERVZJQ0VfSUQpfSwKKwl7MCwgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpc2hfcGNpX3RibCk7CisKKy8qKgorICogaXNoX2V2ZW50X3RyYWNlcigpIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gZHVtcCB0cmFjZSBtZXNzYWdlcworICogQGRldjoJaXNodHAgZGV2aWNlCisgKiBAZm9ybWF0OglwcmludGYgc3R5bGUgZm9ybWF0CisgKgorICogQ2FsbGJhY2sgdG8gZGlyZWN0IGxvZyBtZXNzYWdlcyB0byBMaW51eCB0cmFjZSBidWZmZXJzCisgKi8KK3N0YXRpYyB2b2lkIGlzaF9ldmVudF90cmFjZXIoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwlpZiAodHJhY2VfaXNodHBfZHVtcF9lbmFibGVkKCkpIHsKKwkJdmFfbGlzdCBhcmdzOworCQljaGFyIHRtcF9idWZbMTAwXTsKKworCQl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCQl2c25wcmludGYodG1wX2J1Ziwgc2l6ZW9mKHRtcF9idWYpLCBmb3JtYXQsIGFyZ3MpOworCQl2YV9lbmQoYXJncyk7CisKKwkJdHJhY2VfaXNodHBfZHVtcCh0bXBfYnVmKTsKKwl9Cit9CisKKy8qKgorICogaXNoX2luaXQoKSAtIEluaXQgZnVuY3Rpb24KKyAqIEBkZXY6CWlzaHRwIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSB3YWl0IHF1ZXVlcyBmb3Igc3VzcGVuZC9yZXN1bWUgYW5kIGNhbGwKKyAqIGNhbGxzIGhhZHdhcmUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uIFRoaXMgd2lsbCBpbml0aWF0ZQorICogc3RhcnR1cCBzZXF1ZW5jZQorICoKKyAqIFJldHVybjogMCBmb3Igc3VjY2VzcyBvciBlcnJvciBjb2RlIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgaXNoX2luaXQoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisKKwkvKiBTZXQgdGhlIHN0YXRlIG9mIElTSCBIVyB0byBzdGFydCAqLworCXJldCA9IGlzaF9od19zdGFydChkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYtPmRldmMsICJJU0g6IGh3IHN0YXJ0IGZhaWxlZC5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFN0YXJ0IHRoZSBpbnRlciBwcm9jZXNzIGNvbW11bmljYXRpb24gdG8gSVNIIHByb2Nlc3NvciAqLworCXJldCA9IGlzaHRwX3N0YXJ0KGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldi0+ZGV2YywgIklTSFRQOiBQcm90b2NvbCBpbml0IGZhaWxlZC5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlzaF9wcm9iZSgpIC0gUENJIGRyaXZlciBwcm9iZSBjYWxsYmFjaworICogQHBkZXY6CXBjaSBkZXZpY2UKKyAqIEBlbnQ6CXBjaSBkZXZpY2UgaWQKKyAqCisgKiBJbml0aWFsaXplIFBDSSBmdW5jdGlvbiwgc2V0dXAgaW50ZXJydXB0IGFuZCBjYWxsIGZvciBJU0ggaW5pdGlhbGl6YXRpb24KKyAqCisgKiBSZXR1cm46IDAgZm9yIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IGlzaF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXY7CisJc3RydWN0IGlzaF9odyAqaHc7CisJaW50CXJldDsKKworCS8qIGVuYWJsZSBwY2kgZGV2ICovCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJU0g6IEZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2V0IFBDSSBob3N0IG1hc3RlcmluZyAqLworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogcGNpIHJlcXVlc3QgcmVnaW9ucyBmb3IgSVNIIGRyaXZlciAqLworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgS0JVSUxEX01PRE5BTUUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSVNIOiBGYWlsZWQgdG8gZ2V0IFBDSSByZWdpb25zXG4iKTsKKwkJZ290byBkaXNhYmxlX2RldmljZTsKKwl9CisKKwkvKiBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIHRoZSBJU0ggZGV2IHN0cnVjdHVyZSAqLworCWRldiA9IGlzaF9kZXZfaW5pdChwZGV2KTsKKwlpZiAoIWRldikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHJlbGVhc2VfcmVnaW9uczsKKwl9CisJaHcgPSB0b19pc2hfaHcoZGV2KTsKKwlkZXYtPnByaW50X2xvZyA9IGlzaF9ldmVudF90cmFjZXI7CisKKwkvKiBtYXBwaW5nIElPIGRldmljZSBtZW1vcnkgKi8KKwlody0+bWVtX2FkZHIgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7CisJaWYgKCFody0+bWVtX2FkZHIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiSVNIOiBtYXBwaW5nIEkvTyByYW5nZSBmYWlsdXJlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmcmVlX2RldmljZTsKKwl9CisKKwlkZXYtPnBkZXYgPSBwZGV2OworCisJcGRldi0+ZGV2X2ZsYWdzIHw9IFBDSV9ERVZfRkxBR1NfTk9fRDM7CisKKwkvKiByZXF1ZXN0IGFuZCBlbmFibGUgaW50ZXJydXB0ICovCisJcmV0ID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpc2hfaXJxX2hhbmRsZXIsIElSUUZfTk9fU1VTUEVORCwKKwkJCSAgS0JVSUxEX01PRE5BTUUsIGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJU0g6IHJlcXVlc3QgSVJRIGZhaWx1cmUgKCVkKVxuIiwKKwkJCXBkZXYtPmlycSk7CisJCWdvdG8gZnJlZV9kZXZpY2U7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKGRldi0+ZGV2YywgZGV2KTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+c3VzcGVuZF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnJlc3VtZV93YWl0KTsKKworCXJldCA9IGlzaF9pbml0KGRldik7CisJaWYgKHJldCkKKwkJZ290byBmcmVlX2lycTsKKworCXJldHVybiAwOworCitmcmVlX2lycToKKwlmcmVlX2lycShwZGV2LT5pcnEsIGRldik7CitmcmVlX2RldmljZToKKwlwY2lfaW91bm1hcChwZGV2LCBody0+bWVtX2FkZHIpOworCWtmcmVlKGRldik7CityZWxlYXNlX3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Rpc2FibGVfZGV2aWNlOgorCXBjaV9jbGVhcl9tYXN0ZXIocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCWRldl9lcnIoJnBkZXYtPmRldiwgIklTSDogUENJIGRyaXZlciBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXNoX3JlbW92ZSgpIC0gUENJIGRyaXZlciByZW1vdmUgY2FsbGJhY2sKKyAqIEBwZGV2OglwY2kgZGV2aWNlCisgKgorICogVGhpcyBmdW5jdGlvbiBkb2VzIGNsZWFudXAgb2YgSVNIIG9uIHBjaSByZW1vdmUgY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgaXNoX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgaXNodHBfZGV2aWNlICppc2h0cF9kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGlzaF9odyAqaHcgPSB0b19pc2hfaHcoaXNodHBfZGV2KTsKKworCWlzaHRwX2J1c19yZW1vdmVfYWxsX2NsaWVudHMoaXNodHBfZGV2LCBmYWxzZSk7CisJaXNoX2RldmljZV9kaXNhYmxlKGlzaHRwX2Rldik7CisKKwlmcmVlX2lycShwZGV2LT5pcnEsIGlzaHRwX2Rldik7CisJcGNpX2lvdW5tYXAocGRldiwgaHctPm1lbV9hZGRyKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9jbGVhcl9tYXN0ZXIocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCWtmcmVlKGlzaHRwX2Rldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICppc2hfcmVzdW1lX2RldmljZTsKKworLyoqCisgKiBpc2hfcmVzdW1lX2hhbmRsZXIoKSAtIFdvcmsgZnVuY3Rpb24gdG8gY29tcGxldGUgcmVzdW1lCisgKiBAd29yazoJd29yayBzdHJ1Y3QKKyAqCisgKiBUaGUgcmVzdW1lIHdvcmsgZnVuY3Rpb24gdG8gY29tcGxldGUgcmVzdW1lIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LgorICogVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBwbGF0Zm9ybXMsIG9uZSB3aGVyZSBJU0ggaXMgbm90IHBvd2VyZWQgb2ZmLAorICogaW4gdGhhdCBjYXNlIGEgc2ltcGxlIHJlc3VtZSBtZXNzYWdlIGlzIGVub3VnaCwgb3RoZXJzIHdlIG5lZWQKKyAqIGEgcmVzZXQgc2VxdWVuY2UuCisgKi8KK3N0YXRpYyB2b2lkIGlzaF9yZXN1bWVfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGlzaF9yZXN1bWVfZGV2aWNlKTsKKwlzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJaW50IHJldDsKKworCWlzaHRwX3NlbmRfcmVzdW1lKGRldik7CisKKwkvKiA1MCBtcyB0byBnZXQgcmVzdW1lIHJlc3BvbnNlICovCisJaWYgKGRldi0+cmVzdW1lX2ZsYWcpCisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRldi0+cmVzdW1lX3dhaXQsCisJCQkJCQkgICAgICAgIWRldi0+cmVzdW1lX2ZsYWcsCisJCQkJCQkgICAgICAgbXNlY3NfdG9famlmZmllcyg1MCkpOworCisJLyoKKwkgKiBJZiBubyByZXN1bWUgcmVzcG9uc2UuIFRoaXMgcGxhdGZvcm0gIGlzIG5vdCBTMGl4IGNvbXBhdGlibGUKKwkgKiBTbyBvbiByZXN1bWUgZnVsbCByZWJvb3Qgb2YgSVNIIHByb2Nlc3NvciB3aWxsIGhhcHBlbiwgc28KKwkgKiBuZWVkIHRvIGdvIHRocm91Z2ggaW5pdCBzZXF1ZW5jZSBhZ2FpbgorCSAqLworCWlmIChkZXYtPnJlc3VtZV9mbGFnKQorCQlpc2hfaW5pdChkZXYpOworfQorCisvKioKKyAqIGlzaF9zdXNwZW5kKCkgLSBJU0ggc3VzcGVuZCBjYWxsYmFjaworICogQGRldmljZToJZGV2aWNlIHBvaW50ZXIKKyAqCisgKiBJU0ggc3VzcGVuZCBjYWxsYmFjaworICoKKyAqIFJldHVybjogMCB0byB0aGUgcG0gY29yZQorICovCitzdGF0aWMgaW50IGlzaF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKKwlzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwllbmFibGVfaXJxX3dha2UocGRldi0+aXJxKTsKKwkvKgorCSAqIElmIHByZXZpb3VzIHN1c3BlbmQgaGFzbid0IGJlZW4gYXNud2VyZWQgdGhlbiBJU0ggaXMgbGlrZWx5IGRlYWQsCisJICogZG9uJ3QgYXR0ZW1wdCBuZXN0ZWQgbm90aWZpY2F0aW9uCisJICovCisJaWYgKGRldi0+c3VzcGVuZF9mbGFnKQorCQlyZXR1cm4JMDsKKworCWRldi0+cmVzdW1lX2ZsYWcgPSAwOworCWRldi0+c3VzcGVuZF9mbGFnID0gMTsKKwlpc2h0cF9zZW5kX3N1c3BlbmQoZGV2KTsKKworCS8qIDI1IG1zIHNob3VsZCBiZSBlbm91Z2ggZm9yIGxpdmUgSVNIIHRvIGZsdXNoIGFsbCBJUEMgYnVmICovCisJaWYgKGRldi0+c3VzcGVuZF9mbGFnKQorCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChkZXYtPnN1c3BlbmRfd2FpdCwKKwkJCQkJCSAhZGV2LT5zdXNwZW5kX2ZsYWcsCisJCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMjUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgREVDTEFSRV9XT1JLKHJlc3VtZV93b3JrLCBpc2hfcmVzdW1lX2hhbmRsZXIpOworLyoqCisgKiBpc2hfcmVzdW1lKCkgLSBJU0ggcmVzdW1lIGNhbGxiYWNrCisgKiBAZGV2aWNlOglkZXZpY2UgcG9pbnRlcgorICoKKyAqIElTSCByZXN1bWUgY2FsbGJhY2sKKyAqCisgKiBSZXR1cm46IDAgdG8gdGhlIHBtIGNvcmUKKyAqLworc3RhdGljIGludCBpc2hfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKKwlzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpc2hfcmVzdW1lX2RldmljZSA9IGRldmljZTsKKwlkZXYtPnJlc3VtZV9mbGFnID0gMTsKKworCWRpc2FibGVfaXJxX3dha2UocGRldi0+aXJxKTsKKwlzY2hlZHVsZV93b3JrKCZyZXN1bWVfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGlzaF9wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSBpc2hfc3VzcGVuZCwKKwkucmVzdW1lID0gaXNoX3Jlc3VtZSwKK307CisjZGVmaW5lIElTSFRQX0lTSF9QTV9PUFMJKCZpc2hfcG1fb3BzKQorI2Vsc2UKKyNkZWZpbmUgSVNIVFBfSVNIX1BNX09QUwlOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlzaF9kcml2ZXIgPSB7CisJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKKwkuaWRfdGFibGUgPSBpc2hfcGNpX3RibCwKKwkucHJvYmUgPSBpc2hfcHJvYmUsCisJLnJlbW92ZSA9IGlzaF9yZW1vdmUsCisJLmRyaXZlci5wbSA9IElTSFRQX0lTSF9QTV9PUFMsCit9OworCittb2R1bGVfcGNpX2RyaXZlcihpc2hfZHJpdmVyKTsKKworLyogT3JpZ2luYWwgYXV0aG9yICovCitNT0RVTEVfQVVUSE9SKCJEYW5pZWwgRHJ1YmluIDxkYW5pZWwuZHJ1YmluQGludGVsLmNvbT4iKTsKKy8qIEFkb3B0aW9uIHRvIHVwc3RyZWFtIExpbnV4IGtlcm5lbCAqLworTU9EVUxFX0FVVEhPUigiU3Jpbml2YXMgUGFuZHJ1dmFkYSA8c3Jpbml2YXMucGFuZHJ1dmFkYUBsaW51eC5pbnRlbC5jb20+Iik7CisKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwoUikgSW50ZWdyYXRlZCBTZW5zb3IgSHViIFBDSSBEZXZpY2UgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lwYy91dGlscy5oIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pcGMvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTgyMTIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pcGMvdXRpbHMuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogVXRpbGl0eSBtYWNyb3Mgb2YgSVNICisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIFVUSUxTX19ICisjZGVmaW5lIFVUSUxTX19ICisKKyNkZWZpbmUJV0FJVF9GT1JfU0VORF9TTElDRQkoSFogLyAxMCkKKyNkZWZpbmUJV0FJVF9GT1JfQ09OTkVDVF9TTElDRQkoSFogLyAxMCkKKworLyoKKyAqIFdhaXRzIGZvciBzcGVjaWZpZWQgZXZlbnQgd2hlbiBhIHRocmVhZCB0aGF0IHRyaWdnZXJzIGV2ZW50IGNhbid0IHNpZ25hbAorICogQWxzbywgd2FpdHMgKmF0X2xlYXN0KiBgdGltZWluY2AgYWZ0ZXIgY29uZGl0aW9uIGlzIHNhdGlzZmllZAorICovCisjZGVmaW5lCXRpbWVkX3dhaXRfZm9yKHRpbWVpbmMsIGNvbmRpdGlvbikJCQlcCisJZG8gewkJCQkJCQlcCisJCWludCBjb21wbGV0ZWQgPSAwOwkJCQlcCisJCWRvIHsJCQkJCQlcCisJCQl1bnNpZ25lZCBsb25nCWo7CQkJXAorCQkJaW50CWRvbmUgPSAwOwkJCVwKKwkJCQkJCQkJXAorCQkJY29tcGxldGVkID0gKGNvbmRpdGlvbik7CQlcCisJCQlmb3IgKGogPSBqaWZmaWVzLCBkb25lID0gMDsgIWRvbmU7ICkgewlcCisJCQkJc2NoZWR1bGVfdGltZW91dCh0aW1laW5jKTsJXAorCQkJCWlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGogKyB0aW1laW5jKSkgXAorCQkJCQlkb25lID0gMTsJCVwKKwkJCX0JCQkJCVwKKwkJfSB3aGlsZSAoIShjb21wbGV0ZWQpKTsJCQkJXAorCX0gd2hpbGUgKDApCisKKworLyoKKyAqIFdhaXRzIGZvciBzcGVjaWZpZWQgZXZlbnQgd2hlbiBhIHRocmVhZCB0aGF0IHRyaWdnZXJzIGV2ZW50CisgKiBjYW4ndCBzaWduYWwgd2l0aCB0aW1lb3V0ICh1c2Ugd2hlbmV2ZXIgd2UgbWF5IGhhbmcpCisgKi8KKyNkZWZpbmUJdGltZWRfd2FpdF9mb3JfdGltZW91dCh0aW1laW5jLCBjb25kaXRpb24sIHRpbWVvdXQpCVwKKwlkbyB7CQkJCQkJCVwKKwkJaW50CXQgPSB0aW1lb3V0OwkJCQlcCisJCWRvIHsJCQkJCQlcCisJCQl1bnNpZ25lZCBsb25nCWo7CQkJXAorCQkJaW50CWRvbmUgPSAwOwkJCVwKKwkJCQkJCQkJXAorCQkJZm9yIChqID0gamlmZmllcywgZG9uZSA9IDA7ICFkb25lOyApIHsJXAorCQkJCXNjaGVkdWxlX3RpbWVvdXQodGltZWluYyk7CVwKKwkJCQlpZiAodGltZV9pc19iZWZvcmVfZXFfamlmZmllcyhqICsgdGltZWluYykpIFwKKwkJCQkJZG9uZSA9IDE7CQlcCisJCQl9IFwKKwkJCXQgLT0gdGltZWluYzsJCQkJXAorCQkJaWYgKHQgPD0gMCkJCQkJXAorCQkJCWJyZWFrOwkJCQlcCisJCX0gd2hpbGUgKCEoY29uZGl0aW9uKSk7CQkJCVwKKwl9IHdoaWxlICgwKQorCisjZW5kaWYgLyogVVRJTFNfX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAtaGlkLWNsaWVudC5jIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC1oaWQtY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2NDNkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwLWhpZC1jbGllbnQuYwpAQCAtMCwwICsxLDk3OCBAQAorLyoKKyAqIElTSFRQIGNsaWVudCBkcml2ZXIgZm9yIEhJRCAoSVNIKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaGlkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlICJpc2h0cC9pc2h0cC1kZXYuaCIKKyNpbmNsdWRlICJpc2h0cC9jbGllbnQuaCIKKyNpbmNsdWRlICJpc2h0cC1oaWQuaCIKKworLyogUnggcmluZyBidWZmZXIgcG9vbCBzaXplICovCisjZGVmaW5lIEhJRF9DTF9SWF9SSU5HX1NJWkUJMzIKKyNkZWZpbmUgSElEX0NMX1RYX1JJTkdfU0laRQkxNgorCisvKioKKyAqIHJlcG9ydF9iYWRfcGFja2V0cygpIC0gUmVwb3J0IGJhZCBwYWNrZXRzCisgKiBAaGlkX2lzaHRwX2NsOglDbGllbnQgaW5zdGFuY2UgdG8gZ2V0IHN0YXRzCisgKiBAcmVjdl9idWY6CQlSYXcgcmVjZWl2ZWQgaG9zdCBpbnRlcmZhY2UgbWVzc2FnZQorICogQGN1cl9wb3M6CQlDdXJyZW50IHBvc2l0aW9uIGluZGV4IGluIHBheWxvYWQKKyAqIEBwYXlsb2FkX2xlbjoJTGVuZ3RoIG9mIHBheWxvYWQgZXhwZWN0ZWQKKyAqCisgKiBEdW1wcyBlcnJvciBpbiBjYXNlIGJhZCBwYWNrZXQgaXMgcmVjZWl2ZWQKKyAqLworc3RhdGljIHZvaWQgcmVwb3J0X2JhZF9wYWNrZXQoc3RydWN0IGlzaHRwX2NsICpoaWRfaXNodHBfY2wsIHZvaWQgKnJlY3ZfYnVmLAorCQkJICAgICAgc2l6ZV90IGN1cl9wb3MsICBzaXplX3QgcGF5bG9hZF9sZW4pCit7CisJc3RydWN0IGhvc3RpZl9tc2cgKnJlY3ZfbXNnID0gcmVjdl9idWY7CisJc3RydWN0IGlzaHRwX2NsX2RhdGEgKmNsaWVudF9kYXRhID0gaGlkX2lzaHRwX2NsLT5jbGllbnRfZGF0YTsKKworCWRldl9lcnIoJmNsaWVudF9kYXRhLT5jbF9kZXZpY2UtPmRldiwgIltoaWQtaXNoXTogQkFEIHBhY2tldCAlMDJYXG4iCisJCSJ0b3RhbF9iYWQ9JXUgY3VyX3Bvcz0ldVxuIgorCQkiWyUwMlggJTAyWCAlMDJYICUwMlhdXG4iCisJCSJwYXlsb2FkX2xlbj0ldVxuIgorCQkibXVsdGlfcGFja2V0X2NudD0ldVxuIgorCQkiaXNfcmVzcG9uc2U9JTAyWFxuIiwKKwkJcmVjdl9tc2ctPmhkci5jb21tYW5kLCBjbGllbnRfZGF0YS0+YmFkX3JlY3ZfY250LAorCQkodW5zaWduZWQgaW50KWN1cl9wb3MsCisJCSgodW5zaWduZWQgY2hhciAqKXJlY3ZfbXNnKVswXSwgKCh1bnNpZ25lZCBjaGFyICopcmVjdl9tc2cpWzFdLAorCQkoKHVuc2lnbmVkIGNoYXIgKilyZWN2X21zZylbMl0sICgodW5zaWduZWQgY2hhciAqKXJlY3ZfbXNnKVszXSwKKwkJKHVuc2lnbmVkIGludClwYXlsb2FkX2xlbiwgY2xpZW50X2RhdGEtPm11bHRpX3BhY2tldF9jbnQsCisJCXJlY3ZfbXNnLT5oZHIuY29tbWFuZCAmIH5DTURfTUFTSyk7Cit9CisKKy8qKgorICogcHJvY2Vzc19yZWN2KCkgLSBSZWNlaXZlZCBhbmQgcGFyc2UgaW5jb21pbmcgcGFja2V0CisgKiBAaGlkX2lzaHRwX2NsOglDbGllbnQgaW5zdGFuY2UgdG8gZ2V0IHN0YXRzCisgKiBAcmVjdl9idWY6CQlSYXcgcmVjZWl2ZWQgaG9zdCBpbnRlcmZhY2UgbWVzc2FnZQorICogQGRhdGFfbGVuOgkJbGVuZ3RoIG9mIHRoZSBtZXNzYWdlCisgKgorICogUGFyc2UgdGhlIGluY29taW5nIHBhY2tldC4gSWYgaXQgaXMgYSByZXNwb25zZSBwYWNrZXQgdGhlbiBpdCB3aWxsIHVwZGF0ZQorICogcGVyIGluc3RhbmNlIGZsYWdzIGFuZCB3YWtlIHVwIHRoZSBjYWxsZXIgd2FpdGluZyB0byBmb3IgdGhlIHJlc3BvbnNlLgorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3JlY3Yoc3RydWN0IGlzaHRwX2NsICpoaWRfaXNodHBfY2wsIHZvaWQgKnJlY3ZfYnVmLAorCQkJIHNpemVfdCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgaG9zdGlmX21zZyAqcmVjdl9tc2c7CisJdW5zaWduZWQgY2hhciAqcGF5bG9hZDsKKwlzdHJ1Y3QgZGV2aWNlX2luZm8gKmRldl9pbmZvOworCWludCBpLCBqOworCXNpemVfdAlwYXlsb2FkX2xlbiwgdG90YWxfbGVuLCBjdXJfcG9zOworCWludCByZXBvcnRfdHlwZTsKKwlzdHJ1Y3QgcmVwb3J0X2xpc3QgKnJlcG9ydHNfbGlzdDsKKwljaGFyICpyZXBvcnRzOworCXNpemVfdCByZXBvcnRfbGVuOworCXN0cnVjdCBpc2h0cF9jbF9kYXRhICpjbGllbnRfZGF0YSA9IGhpZF9pc2h0cF9jbC0+Y2xpZW50X2RhdGE7CisJaW50IGN1cnJfaGlkX2RldiA9IGNsaWVudF9kYXRhLT5jdXJfaGlkX2RldjsKKworCWlmIChkYXRhX2xlbiA8IHNpemVvZihzdHJ1Y3QgaG9zdGlmX21zZ19oZHIpKSB7CisJCWRldl9lcnIoJmNsaWVudF9kYXRhLT5jbF9kZXZpY2UtPmRldiwKKwkJCSJbaGlkLWlzaF06IGVycm9yLCByZWNlaXZlZCAldSB3aGljaCBpcyBsZXNzIHRoYW4gZGF0YSBoZWFkZXIgJXVcbiIsCisJCQkodW5zaWduZWQgaW50KWRhdGFfbGVuLAorCQkJKHVuc2lnbmVkIGludClzaXplb2Yoc3RydWN0IGhvc3RpZl9tc2dfaGRyKSk7CisJCSsrY2xpZW50X2RhdGEtPmJhZF9yZWN2X2NudDsKKwkJaXNoX2h3X3Jlc2V0KGhpZF9pc2h0cF9jbC0+ZGV2KTsKKwkJcmV0dXJuOworCX0KKworCXBheWxvYWQgPSByZWN2X2J1ZiArIHNpemVvZihzdHJ1Y3QgaG9zdGlmX21zZ19oZHIpOworCXRvdGFsX2xlbiA9IGRhdGFfbGVuOworCWN1cl9wb3MgPSAwOworCisJZG8geworCQlyZWN2X21zZyA9IChzdHJ1Y3QgaG9zdGlmX21zZyAqKShyZWN2X2J1ZiArIGN1cl9wb3MpOworCQlwYXlsb2FkX2xlbiA9IHJlY3ZfbXNnLT5oZHIuc2l6ZTsKKworCQkvKiBTYW5pdHkgY2hlY2tzICovCisJCWlmIChjdXJfcG9zICsgcGF5bG9hZF9sZW4gKyBzaXplb2Yoc3RydWN0IGhvc3RpZl9tc2cpID4KKwkJCQl0b3RhbF9sZW4pIHsKKwkJCSsrY2xpZW50X2RhdGEtPmJhZF9yZWN2X2NudDsKKwkJCXJlcG9ydF9iYWRfcGFja2V0KGhpZF9pc2h0cF9jbCwgcmVjdl9tc2csIGN1cl9wb3MsCisJCQkJCSAgcGF5bG9hZF9sZW4pOworCQkJaXNoX2h3X3Jlc2V0KGhpZF9pc2h0cF9jbC0+ZGV2KTsKKwkJCWJyZWFrOworCQl9CisKKwkJaGlkX2lzaHRwX3RyYWNlKGNsaWVudF9kYXRhLCAgIiVzICVkXG4iLAorCQkJCV9fZnVuY19fLCByZWN2X21zZy0+aGRyLmNvbW1hbmQgJiBDTURfTUFTSyk7CisKKwkJc3dpdGNoIChyZWN2X21zZy0+aGRyLmNvbW1hbmQgJiBDTURfTUFTSykgeworCQljYXNlIEhPU1RJRl9ETV9FTlVNX0RFVklDRVM6CisJCQlpZiAoKCEocmVjdl9tc2ctPmhkci5jb21tYW5kICYgfkNNRF9NQVNLKSB8fAorCQkJCQljbGllbnRfZGF0YS0+aW5pdF9kb25lKSkgeworCQkJCSsrY2xpZW50X2RhdGEtPmJhZF9yZWN2X2NudDsKKwkJCQlyZXBvcnRfYmFkX3BhY2tldChoaWRfaXNodHBfY2wsIHJlY3ZfbXNnLAorCQkJCQkJICBjdXJfcG9zLAorCQkJCQkJICBwYXlsb2FkX2xlbik7CisJCQkJaXNoX2h3X3Jlc2V0KGhpZF9pc2h0cF9jbC0+ZGV2KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNsaWVudF9kYXRhLT5oaWRfZGV2X2NvdW50ID0gKHVuc2lnbmVkIGludCkqcGF5bG9hZDsKKwkJCWlmICghY2xpZW50X2RhdGEtPmhpZF9kZXZpY2VzKQorCQkJCWNsaWVudF9kYXRhLT5oaWRfZGV2aWNlcyA9IGRldm1fa3phbGxvYygKKwkJCQkJCSZjbGllbnRfZGF0YS0+Y2xfZGV2aWNlLT5kZXYsCisJCQkJCQljbGllbnRfZGF0YS0+aGlkX2Rldl9jb3VudCAqCisJCQkJCQlzaXplb2Yoc3RydWN0IGRldmljZV9pbmZvKSwKKwkJCQkJCUdGUF9LRVJORUwpOworCQkJaWYgKCFjbGllbnRfZGF0YS0+aGlkX2RldmljZXMpIHsKKwkJCQlkZXZfZXJyKCZjbGllbnRfZGF0YS0+Y2xfZGV2aWNlLT5kZXYsCisJCQkJIk1lbSBhbGxvYyBmYWlsZWQgZm9yIGhpZCBkZXZpY2UgaW5mb1xuIik7CisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjbGllbnRfZGF0YS0+aW5pdF93YWl0KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBjbGllbnRfZGF0YS0+aGlkX2Rldl9jb3VudDsgKytpKSB7CisJCQkJaWYgKDEgKyBzaXplb2Yoc3RydWN0IGRldmljZV9pbmZvKSAqIGkgPj0KKwkJCQkJCXBheWxvYWRfbGVuKSB7CisJCQkJCWRldl9lcnIoJmNsaWVudF9kYXRhLT5jbF9kZXZpY2UtPmRldiwKKwkJCQkJCSJbaGlkLWlzaF06IFtFTlVNX0RFVklDRVNdOiBjb250ZW50IHNpemUgJWx1IGlzIGJpZ2dlciB0aGFuIHBheWxvYWRfbGVuICV1XG4iLAorCQkJCQkJMSArIHNpemVvZihzdHJ1Y3QgZGV2aWNlX2luZm8pCisJCQkJCQkqIGksCisJCQkJCQkodW5zaWduZWQgaW50KXBheWxvYWRfbGVuKTsKKwkJCQl9CisKKwkJCQlpZiAoMSArIHNpemVvZihzdHJ1Y3QgZGV2aWNlX2luZm8pICogaSA+PQorCQkJCQkJZGF0YV9sZW4pCisJCQkJCWJyZWFrOworCisJCQkJZGV2X2luZm8gPSAoc3RydWN0IGRldmljZV9pbmZvICopKHBheWxvYWQgKyAxICsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBkZXZpY2VfaW5mbykgKiBpKTsKKwkJCQlpZiAoY2xpZW50X2RhdGEtPmhpZF9kZXZpY2VzKQorCQkJCQltZW1jcHkoY2xpZW50X2RhdGEtPmhpZF9kZXZpY2VzICsgaSwKKwkJCQkJICAgICAgIGRldl9pbmZvLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkZXZpY2VfaW5mbykpOworCQkJfQorCisJCQljbGllbnRfZGF0YS0+ZW51bV9kZXZpY2VzX2RvbmUgPSB0cnVlOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjbGllbnRfZGF0YS0+aW5pdF93YWl0KTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBIT1NUSUZfR0VUX0hJRF9ERVNDUklQVE9SOgorCQkJaWYgKCghKHJlY3ZfbXNnLT5oZHIuY29tbWFuZCAmIH5DTURfTUFTSykgfHwKKwkJCQkJY2xpZW50X2RhdGEtPmluaXRfZG9uZSkpIHsKKwkJCQkrK2NsaWVudF9kYXRhLT5iYWRfcmVjdl9jbnQ7CisJCQkJcmVwb3J0X2JhZF9wYWNrZXQoaGlkX2lzaHRwX2NsLCByZWN2X21zZywKKwkJCQkJCSAgY3VyX3BvcywKKwkJCQkJCSAgcGF5bG9hZF9sZW4pOworCQkJCWlzaF9od19yZXNldChoaWRfaXNodHBfY2wtPmRldik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWNsaWVudF9kYXRhLT5oaWRfZGVzY3JbY3Vycl9oaWRfZGV2XSkKKwkJCQljbGllbnRfZGF0YS0+aGlkX2Rlc2NyW2N1cnJfaGlkX2Rldl0gPQorCQkJCWRldm1fa21hbGxvYygmY2xpZW50X2RhdGEtPmNsX2RldmljZS0+ZGV2LAorCQkJCQkgICAgIHBheWxvYWRfbGVuLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChjbGllbnRfZGF0YS0+aGlkX2Rlc2NyW2N1cnJfaGlkX2Rldl0pIHsKKwkJCQltZW1jcHkoY2xpZW50X2RhdGEtPmhpZF9kZXNjcltjdXJyX2hpZF9kZXZdLAorCQkJCSAgICAgICBwYXlsb2FkLCBwYXlsb2FkX2xlbik7CisJCQkJY2xpZW50X2RhdGEtPmhpZF9kZXNjcl9zaXplW2N1cnJfaGlkX2Rldl0gPQorCQkJCQlwYXlsb2FkX2xlbjsKKwkJCQljbGllbnRfZGF0YS0+aGlkX2Rlc2NyX2RvbmUgPSB0cnVlOworCQkJfQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjbGllbnRfZGF0YS0+aW5pdF93YWl0KTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBIT1NUSUZfR0VUX1JFUE9SVF9ERVNDUklQVE9SOgorCQkJaWYgKCghKHJlY3ZfbXNnLT5oZHIuY29tbWFuZCAmIH5DTURfTUFTSykgfHwKKwkJCQkJY2xpZW50X2RhdGEtPmluaXRfZG9uZSkpIHsKKwkJCQkrK2NsaWVudF9kYXRhLT5iYWRfcmVjdl9jbnQ7CisJCQkJcmVwb3J0X2JhZF9wYWNrZXQoaGlkX2lzaHRwX2NsLCByZWN2X21zZywKKwkJCQkJCSAgY3VyX3BvcywKKwkJCQkJCSAgcGF5bG9hZF9sZW4pOworCQkJCWlzaF9od19yZXNldChoaWRfaXNodHBfY2wtPmRldik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIWNsaWVudF9kYXRhLT5yZXBvcnRfZGVzY3JbY3Vycl9oaWRfZGV2XSkKKwkJCQljbGllbnRfZGF0YS0+cmVwb3J0X2Rlc2NyW2N1cnJfaGlkX2Rldl0gPQorCQkJCWRldm1fa21hbGxvYygmY2xpZW50X2RhdGEtPmNsX2RldmljZS0+ZGV2LAorCQkJCQkgICAgIHBheWxvYWRfbGVuLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChjbGllbnRfZGF0YS0+cmVwb3J0X2Rlc2NyW2N1cnJfaGlkX2Rldl0pICB7CisJCQkJbWVtY3B5KGNsaWVudF9kYXRhLT5yZXBvcnRfZGVzY3JbY3Vycl9oaWRfZGV2XSwKKwkJCQkgICAgICAgcGF5bG9hZCwKKwkJCQkgICAgICAgcGF5bG9hZF9sZW4pOworCQkJCWNsaWVudF9kYXRhLT5yZXBvcnRfZGVzY3Jfc2l6ZVtjdXJyX2hpZF9kZXZdID0KKwkJCQkJcGF5bG9hZF9sZW47CisJCQkJY2xpZW50X2RhdGEtPnJlcG9ydF9kZXNjcl9kb25lID0gdHJ1ZTsKKwkJCX0KKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2xpZW50X2RhdGEtPmluaXRfd2FpdCk7CisKKwkJCWJyZWFrOworCisJCWNhc2UgSE9TVElGX0dFVF9GRUFUVVJFX1JFUE9SVDoKKwkJCXJlcG9ydF90eXBlID0gSElEX0ZFQVRVUkVfUkVQT1JUOworCQkJZ290bwlkb19nZXRfcmVwb3J0OworCisJCWNhc2UgSE9TVElGX0dFVF9JTlBVVF9SRVBPUlQ6CisJCQlyZXBvcnRfdHlwZSA9IEhJRF9JTlBVVF9SRVBPUlQ7Citkb19nZXRfcmVwb3J0OgorCQkJLyogR2V0IGluZGV4IG9mIGRldmljZSB0aGF0IG1hdGNoZXMgdGhpcyBpZCAqLworCQkJZm9yIChpID0gMDsgaSA8IGNsaWVudF9kYXRhLT5udW1faGlkX2RldmljZXM7ICsraSkgeworCQkJCWlmIChyZWN2X21zZy0+aGRyLmRldmljZV9pZCA9PQorCQkJCQljbGllbnRfZGF0YS0+aGlkX2RldmljZXNbaV0uZGV2X2lkKQorCQkJCQlpZiAoY2xpZW50X2RhdGEtPmhpZF9zZW5zb3JfaHVic1tpXSkgeworCQkJCQkJaGlkX2lucHV0X3JlcG9ydCgKKwkJCQkJCWNsaWVudF9kYXRhLT5oaWRfc2Vuc29yX2h1YnNbCisJCQkJCQkJCQlpXSwKKwkJCQkJCXJlcG9ydF90eXBlLCBwYXlsb2FkLAorCQkJCQkJcGF5bG9hZF9sZW4sIDApOworCQkJCQkJaXNodHBfaGlkX3dha2V1cCgKKwkJCQkJCWNsaWVudF9kYXRhLT5oaWRfc2Vuc29yX2h1YnNbCisJCQkJCQkJaV0pOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgSE9TVElGX1NFVF9GRUFUVVJFX1JFUE9SVDoKKwkJCS8qIEdldCBpbmRleCBvZiBkZXZpY2UgdGhhdCBtYXRjaGVzIHRoaXMgaWQgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBjbGllbnRfZGF0YS0+bnVtX2hpZF9kZXZpY2VzOyArK2kpIHsKKwkJCQlpZiAocmVjdl9tc2ctPmhkci5kZXZpY2VfaWQgPT0KKwkJCQkJY2xpZW50X2RhdGEtPmhpZF9kZXZpY2VzW2ldLmRldl9pZCkKKwkJCQkJaWYgKGNsaWVudF9kYXRhLT5oaWRfc2Vuc29yX2h1YnNbaV0pIHsKKwkJCQkJCWlzaHRwX2hpZF93YWtldXAoCisJCQkJCQljbGllbnRfZGF0YS0+aGlkX3NlbnNvcl9odWJzWworCQkJCQkJCWldKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEhPU1RJRl9QVUJMSVNIX0lOUFVUX1JFUE9SVDoKKwkJCXJlcG9ydF90eXBlID0gSElEX0lOUFVUX1JFUE9SVDsKKwkJCWZvciAoaSA9IDA7IGkgPCBjbGllbnRfZGF0YS0+bnVtX2hpZF9kZXZpY2VzOyArK2kpCisJCQkJaWYgKHJlY3ZfbXNnLT5oZHIuZGV2aWNlX2lkID09CisJCQkJCWNsaWVudF9kYXRhLT5oaWRfZGV2aWNlc1tpXS5kZXZfaWQpCisJCQkJCWlmIChjbGllbnRfZGF0YS0+aGlkX3NlbnNvcl9odWJzW2ldKQorCQkJCQkJaGlkX2lucHV0X3JlcG9ydCgKKwkJCQkJCWNsaWVudF9kYXRhLT5oaWRfc2Vuc29yX2h1YnNbCisJCQkJCQkJCQlpXSwKKwkJCQkJCXJlcG9ydF90eXBlLCBwYXlsb2FkLAorCQkJCQkJcGF5bG9hZF9sZW4sIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBIT1NUSUZfUFVCTElTSF9JTlBVVF9SRVBPUlRfTElTVDoKKwkJCXJlcG9ydF90eXBlID0gSElEX0lOUFVUX1JFUE9SVDsKKwkJCXJlcG9ydHNfbGlzdCA9IChzdHJ1Y3QgcmVwb3J0X2xpc3QgKilwYXlsb2FkOworCQkJcmVwb3J0cyA9IChjaGFyICopcmVwb3J0c19saXN0LT5yZXBvcnRzOworCisJCQlmb3IgKGogPSAwOyBqIDwgcmVwb3J0c19saXN0LT5udW1fb2ZfcmVwb3J0czsgaisrKSB7CisJCQkJcmVjdl9tc2cgPSAoc3RydWN0IGhvc3RpZl9tc2cgKikocmVwb3J0cyArCisJCQkJCXNpemVvZih1aW50MTZfdCkpOworCQkJCXJlcG9ydF9sZW4gPSAqKHVpbnQxNl90ICopcmVwb3J0czsKKwkJCQlwYXlsb2FkID0gcmVwb3J0cyArIHNpemVvZih1aW50MTZfdCkgKworCQkJCQlzaXplb2Yoc3RydWN0IGhvc3RpZl9tc2dfaGRyKTsKKwkJCQlwYXlsb2FkX2xlbiA9IHJlcG9ydF9sZW4gLQorCQkJCQlzaXplb2Yoc3RydWN0IGhvc3RpZl9tc2dfaGRyKTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBjbGllbnRfZGF0YS0+bnVtX2hpZF9kZXZpY2VzOworCQkJCSAgICAgKytpKQorCQkJCQlpZiAocmVjdl9tc2ctPmhkci5kZXZpY2VfaWQgPT0KKwkJCQkJY2xpZW50X2RhdGEtPmhpZF9kZXZpY2VzW2ldLmRldl9pZCAmJgorCQkJCQljbGllbnRfZGF0YS0+aGlkX3NlbnNvcl9odWJzW2ldKSB7CisJCQkJCQloaWRfaW5wdXRfcmVwb3J0KAorCQkJCQkJY2xpZW50X2RhdGEtPmhpZF9zZW5zb3JfaHVic1sKKwkJCQkJCQkJCWldLAorCQkJCQkJcmVwb3J0X3R5cGUsCisJCQkJCQlwYXlsb2FkLCBwYXlsb2FkX2xlbiwKKwkJCQkJCTApOworCQkJCQl9CisKKwkJCQlyZXBvcnRzICs9IHNpemVvZih1aW50MTZfdCkgKyByZXBvcnRfbGVuOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkrK2NsaWVudF9kYXRhLT5iYWRfcmVjdl9jbnQ7CisJCQlyZXBvcnRfYmFkX3BhY2tldChoaWRfaXNodHBfY2wsIHJlY3ZfbXNnLCBjdXJfcG9zLAorCQkJCQkgIHBheWxvYWRfbGVuKTsKKwkJCWlzaF9od19yZXNldChoaWRfaXNodHBfY2wtPmRldik7CisJCQlicmVhazsKKworCQl9CisKKwkJaWYgKCFjdXJfcG9zICYmIGN1cl9wb3MgKyBwYXlsb2FkX2xlbiArCisJCQkJc2l6ZW9mKHN0cnVjdCBob3N0aWZfbXNnKSA8IHRvdGFsX2xlbikKKwkJCSsrY2xpZW50X2RhdGEtPm11bHRpX3BhY2tldF9jbnQ7CisKKwkJY3VyX3BvcyArPSBwYXlsb2FkX2xlbiArIHNpemVvZihzdHJ1Y3QgaG9zdGlmX21zZyk7CisJCXBheWxvYWQgKz0gcGF5bG9hZF9sZW4gKyBzaXplb2Yoc3RydWN0IGhvc3RpZl9tc2cpOworCisJfSB3aGlsZSAoY3VyX3BvcyA8IHRvdGFsX2xlbik7Cit9CisKKy8qKgorICogaXNoX2NsX2V2ZW50X2NiKCkgLSBidXMgZHJpdmVyIGNhbGxiYWNrIGZvciBpbmNvbWluZyBtZXNzYWdlL3BhY2tldAorICogQGRldmljZToJUG9pbnRlciB0byB0aGUgdGhlIGlzaHRwIGNsaWVudCBkZXZpY2UgZm9yIHdoaWNoIHRoaXMgbWVzc2FnZQorICoJCWlzIHRhcmdldGVkCisgKgorICogUmVtb3ZlIHRoZSBwYWNrZXQgZnJvbSB0aGUgbGlzdCBhbmQgcHJvY2VzcyB0aGUgbWVzc2FnZSBieSBjYWxsaW5nCisgKiBwcm9jZXNzX3JlY3YKKyAqLworc3RhdGljIHZvaWQgaXNoX2NsX2V2ZW50X2NiKHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgaXNodHBfY2wJKmhpZF9pc2h0cF9jbCA9IGRldmljZS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaHRwX2NsX3JiICpyYl9pbl9wcm9jOworCXNpemVfdCByX2xlbmd0aDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFoaWRfaXNodHBfY2wpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZoaWRfaXNodHBfY2wtPmluX3Byb2Nlc3Nfc3BpbmxvY2ssIGZsYWdzKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmhpZF9pc2h0cF9jbC0+aW5fcHJvY2Vzc19saXN0Lmxpc3QpKSB7CisJCXJiX2luX3Byb2MgPSBsaXN0X2VudHJ5KAorCQkJaGlkX2lzaHRwX2NsLT5pbl9wcm9jZXNzX2xpc3QubGlzdC5uZXh0LAorCQkJc3RydWN0IGlzaHRwX2NsX3JiLCBsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmcmJfaW5fcHJvYy0+bGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhpZF9pc2h0cF9jbC0+aW5fcHJvY2Vzc19zcGlubG9jaywKKwkJCWZsYWdzKTsKKworCQlpZiAoIXJiX2luX3Byb2MtPmJ1ZmZlci5kYXRhKQorCQkJcmV0dXJuOworCisJCXJfbGVuZ3RoID0gcmJfaW5fcHJvYy0+YnVmX2lkeDsKKworCQkvKiBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHJlY2VpdmVkIGRhdGEgKi8KKwkJcHJvY2Vzc19yZWN2KGhpZF9pc2h0cF9jbCwgcmJfaW5fcHJvYy0+YnVmZmVyLmRhdGEsIHJfbGVuZ3RoKTsKKworCQlpc2h0cF9jbF9pb19yYl9yZWN5Y2xlKHJiX2luX3Byb2MpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGlkX2lzaHRwX2NsLT5pbl9wcm9jZXNzX3NwaW5sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhpZF9pc2h0cF9jbC0+aW5fcHJvY2Vzc19zcGlubG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGhpZF9pc2h0cF9zZXRfZmVhdHVyZSgpIC0gc2VuZCByZXF1ZXN0IHRvIElTSCBGVyB0byBzZXQgYSBmZWF0dXJlIHJlcXVlc3QKKyAqIEBoaWQ6CWhpZCBkZXZpY2UgaW5zdGFuY2UgZm9yIHRoaXMgcmVxdWVzdAorICogQGJ1ZjoJZmVhdHVyZSBidWZmZXIKKyAqIEBsZW46CUxlbmd0aCBvZiBmZWF0dXJlIGJ1ZmZlcgorICogQHJlcG9ydF9pZDoJUmVwb3J0IGlkIGZvciB0aGUgZmVhdHVyZSBzZXQgcmVxdWVzdAorICoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gaGlkIGNvcmUgLnJlcXVlc3QoKSBjYWxsYmFjay4gVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHdhaXQKKyAqIGZvciByZXNwb25zZS4KKyAqLwordm9pZCBoaWRfaXNodHBfc2V0X2ZlYXR1cmUoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJICAgaW50IHJlcG9ydF9pZCkKK3sKKwlzdHJ1Y3QgaXNodHBfaGlkX2RhdGEgKmhpZF9kYXRhID0gIGhpZC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaHRwX2NsX2RhdGEgKmNsaWVudF9kYXRhID0gaGlkX2RhdGEtPmNsaWVudF9kYXRhOworCXN0cnVjdCBob3N0aWZfbXNnICptc2cgPSAoc3RydWN0IGhvc3RpZl9tc2cgKilidWY7CisJaW50CXJ2OworCWludAlpOworCisJaGlkX2lzaHRwX3RyYWNlKGNsaWVudF9kYXRhLCAgIiVzIGhpZCAlcFxuIiwgX19mdW5jX18sIGhpZCk7CisKKwlydiA9IGlzaHRwX2hpZF9saW5rX3JlYWR5X3dhaXQoY2xpZW50X2RhdGEpOworCWlmIChydikgeworCQloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICAiJXMgaGlkICVwIGxpbmsgbm90IHJlYWR5XG4iLAorCQkJCV9fZnVuY19fLCBoaWQpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKHN0cnVjdCBob3N0aWZfbXNnKSk7CisJbXNnLT5oZHIuY29tbWFuZCA9IEhPU1RJRl9TRVRfRkVBVFVSRV9SRVBPUlQ7CisJZm9yIChpID0gMDsgaSA8IGNsaWVudF9kYXRhLT5udW1faGlkX2RldmljZXM7ICsraSkgeworCQlpZiAoaGlkID09IGNsaWVudF9kYXRhLT5oaWRfc2Vuc29yX2h1YnNbaV0pIHsKKwkJCW1zZy0+aGRyLmRldmljZV9pZCA9CisJCQkJY2xpZW50X2RhdGEtPmhpZF9kZXZpY2VzW2ldLmRldl9pZDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPT0gY2xpZW50X2RhdGEtPm51bV9oaWRfZGV2aWNlcykKKwkJcmV0dXJuOworCisJcnYgPSBpc2h0cF9jbF9zZW5kKGNsaWVudF9kYXRhLT5oaWRfaXNodHBfY2wsIGJ1ZiwgbGVuKTsKKwlpZiAocnYpCisJCWhpZF9pc2h0cF90cmFjZShjbGllbnRfZGF0YSwgICIlcyBoaWQgJXAgc2VuZCBmYWlsZWRcbiIsCisJCQkJX19mdW5jX18sIGhpZCk7Cit9CisKKy8qKgorICogaGlkX2lzaHRwX2dldF9yZXBvcnQoKSAtIHJlcXVlc3QgdG8gZ2V0IGZlYXR1cmUvaW5wdXQgcmVwb3J0CisgKiBAaGlkOgloaWQgZGV2aWNlIGluc3RhbmNlIGZvciB0aGlzIHJlcXVlc3QKKyAqIEByZXBvcnRfaWQ6CVJlcG9ydCBpZCBmb3IgdGhlIGdldCByZXF1ZXN0CisgKiBAcmVwb3J0X3R5cGU6CVJlcG9ydCB0eXBlIGZvciB0aGUgdGhpcyByZXF1ZXN0CisgKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSBoaWQgY29yZSAucmVxdWVzdCgpIGNhbGxiYWNrLiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VuZAorICogcmVxdWVzdCB0byBGVyBhbmQgcmV0dXJuIHdpdGhvdXQgd2FpdGluZyBmb3IgcmVzcG9uc2UuCisgKi8KK3ZvaWQgaGlkX2lzaHRwX2dldF9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgaW50IHJlcG9ydF9pZCwKKwkJCSAgaW50IHJlcG9ydF90eXBlKQoreworCXN0cnVjdCBpc2h0cF9oaWRfZGF0YSAqaGlkX2RhdGEgPSAgaGlkLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNodHBfY2xfZGF0YSAqY2xpZW50X2RhdGEgPSBoaWRfZGF0YS0+Y2xpZW50X2RhdGE7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIJYnVmWzEwXTsKKwl1bnNpZ25lZCBpbnQJbGVuOworCXN0cnVjdCBob3N0aWZfbXNnX3RvX3NlbnNvciAqbXNnID0gKHN0cnVjdCBob3N0aWZfbXNnX3RvX3NlbnNvciAqKWJ1ZjsKKwlpbnQJcnY7CisJaW50CWk7CisKKwloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICAiJXMgaGlkICVwXG4iLCBfX2Z1bmNfXywgaGlkKTsKKwlydiA9IGlzaHRwX2hpZF9saW5rX3JlYWR5X3dhaXQoY2xpZW50X2RhdGEpOworCWlmIChydikgeworCQloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICAiJXMgaGlkICVwIGxpbmsgbm90IHJlYWR5XG4iLAorCQkJCV9fZnVuY19fLCBoaWQpOworCQlyZXR1cm47CisJfQorCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0aWZfbXNnX3RvX3NlbnNvcik7CisKKwltZW1zZXQobXNnLCAwLCBzaXplb2Yoc3RydWN0IGhvc3RpZl9tc2dfdG9fc2Vuc29yKSk7CisJbXNnLT5oZHIuY29tbWFuZCA9IChyZXBvcnRfdHlwZSA9PSBISURfRkVBVFVSRV9SRVBPUlQpID8KKwkJSE9TVElGX0dFVF9GRUFUVVJFX1JFUE9SVCA6IEhPU1RJRl9HRVRfSU5QVVRfUkVQT1JUOworCWZvciAoaSA9IDA7IGkgPCBjbGllbnRfZGF0YS0+bnVtX2hpZF9kZXZpY2VzOyArK2kpIHsKKwkJaWYgKGhpZCA9PSBjbGllbnRfZGF0YS0+aGlkX3NlbnNvcl9odWJzW2ldKSB7CisJCQltc2ctPmhkci5kZXZpY2VfaWQgPQorCQkJCWNsaWVudF9kYXRhLT5oaWRfZGV2aWNlc1tpXS5kZXZfaWQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpID09IGNsaWVudF9kYXRhLT5udW1faGlkX2RldmljZXMpCisJCXJldHVybjsKKworCW1zZy0+cmVwb3J0X2lkID0gcmVwb3J0X2lkOworCXJ2ID0gaXNodHBfY2xfc2VuZChjbGllbnRfZGF0YS0+aGlkX2lzaHRwX2NsLCBidWYsIGxlbik7CisJaWYgKHJ2KQorCQloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICAiJXMgaGlkICVwIHNlbmQgZmFpbGVkXG4iLAorCQkJCV9fZnVuY19fLCBoaWQpOworfQorCisvKioKKyAqIGlzaHRwX2hpZF9saW5rX3JlYWR5X3dhaXQoKSAtIFdhaXQgZm9yIGxpbmsgcmVhZHkKKyAqIEBjbGllbnRfZGF0YToJY2xpZW50IGRhdGEgaW5zdGFuY2UKKyAqCisgKiBJZiB0aGUgdHJhbnNwb3J0IGxpbmsgc3RhcnRlZCBzdXNwZW5kIHByb2Nlc3MsIHRoZW4gd2FpdCwgdGlsbCBlaXRoZXIKKyAqIHJlc3VtZWQgb3IgdGltZW91dAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24gemVybyBvbiBlcnJvcgorICovCitpbnQgaXNodHBfaGlkX2xpbmtfcmVhZHlfd2FpdChzdHJ1Y3QgaXNodHBfY2xfZGF0YSAqY2xpZW50X2RhdGEpCit7CisJaW50IHJjOworCisJaWYgKGNsaWVudF9kYXRhLT5zdXNwZW5kZWQpIHsKKwkJaGlkX2lzaHRwX3RyYWNlKGNsaWVudF9kYXRhLCAgIndhaXQgZm9yIGxpbmsgcmVhZHlcbiIpOworCQlyYyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJCQljbGllbnRfZGF0YS0+aXNodHBfcmVzdW1lX3dhaXQsCisJCQkJCSFjbGllbnRfZGF0YS0+c3VzcGVuZGVkLAorCQkJCQk1ICogSFopOworCisJCWlmIChyYyA9PSAwKSB7CisJCQloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICAibGluayBub3QgcmVhZHlcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaGlkX2lzaHRwX3RyYWNlKGNsaWVudF9kYXRhLCAgImxpbmsgcmVhZHlcbiIpOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlzaHRwX2VudW1fZW51bV9kZXZpY2VzKCkgLSBFbnVtZXJhdGUgaGlkIGRldmljZXMKKyAqIEBoaWRfaXNodHBfY2w6CWNsaWVudCBpbnN0YW5jZQorICoKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBzZW5kIHJlcXVlc3QgdG8gZmlybXdhcmUgdG8gZW51bWVyYXRlIEhJRCBkZXZpY2VzCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbiB6ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgaXNodHBfZW51bV9lbnVtX2RldmljZXMoc3RydWN0IGlzaHRwX2NsICpoaWRfaXNodHBfY2wpCit7CisJc3RydWN0IGhvc3RpZl9tc2cgbXNnOworCXN0cnVjdCBpc2h0cF9jbF9kYXRhICpjbGllbnRfZGF0YSA9IGhpZF9pc2h0cF9jbC0+Y2xpZW50X2RhdGE7CisJaW50IHJldHJ5X2NvdW50OworCWludCBydjsKKworCS8qIFNlbmQgSE9TVElGX0RNX0VOVU1fREVWSUNFUyAqLworCW1lbXNldCgmbXNnLCAwLCBzaXplb2Yoc3RydWN0IGhvc3RpZl9tc2cpKTsKKwltc2cuaGRyLmNvbW1hbmQgPSBIT1NUSUZfRE1fRU5VTV9ERVZJQ0VTOworCXJ2ID0gaXNodHBfY2xfc2VuZChoaWRfaXNodHBfY2wsICh1bnNpZ25lZCBjaGFyICopJm1zZywKKwkJCSAgIHNpemVvZihzdHJ1Y3QgaG9zdGlmX21zZykpOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCisJcmV0cnlfY291bnQgPSAwOworCXdoaWxlICghY2xpZW50X2RhdGEtPmVudW1fZGV2aWNlc19kb25lICYmCisJICAgICAgIHJldHJ5X2NvdW50IDwgMTApIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoY2xpZW50X2RhdGEtPmluaXRfd2FpdCwKKwkJCQkJIGNsaWVudF9kYXRhLT5lbnVtX2RldmljZXNfZG9uZSwKKwkJCQkJIDMgKiBIWik7CisJCSsrcmV0cnlfY291bnQ7CisJCWlmICghY2xpZW50X2RhdGEtPmVudW1fZGV2aWNlc19kb25lKQorCQkJLyogU2VuZCBIT1NUSUZfRE1fRU5VTV9ERVZJQ0VTICovCisJCQlydiA9IGlzaHRwX2NsX3NlbmQoaGlkX2lzaHRwX2NsLAorCQkJCQkgICAodW5zaWduZWQgY2hhciAqKSAmbXNnLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IGhvc3RpZl9tc2cpKTsKKwl9CisJaWYgKCFjbGllbnRfZGF0YS0+ZW51bV9kZXZpY2VzX2RvbmUpIHsKKwkJZGV2X2VycigmY2xpZW50X2RhdGEtPmNsX2RldmljZS0+ZGV2LAorCQkJIltoaWQtaXNoXTogdGltZWQgb3V0IHdhaXRpbmcgZm9yIGVudW1fZGV2aWNlc1xuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKwlpZiAoIWNsaWVudF9kYXRhLT5oaWRfZGV2aWNlcykgeworCQlkZXZfZXJyKCZjbGllbnRfZGF0YS0+Y2xfZGV2aWNlLT5kZXYsCisJCQkiW2hpZC1pc2hdOiBmYWlsZWQgdG8gYWxsb2NhdGUgSElEIGRldiBzdHJ1Y3R1cmVzXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2xpZW50X2RhdGEtPm51bV9oaWRfZGV2aWNlcyA9IGNsaWVudF9kYXRhLT5oaWRfZGV2X2NvdW50OworCWRldl9pbmZvKCZoaWRfaXNodHBfY2wtPmRldmljZS0+ZGV2LAorCQkiW2hpZC1pc2hdOiBlbnVtX2RldmljZXNfZG9uZSBPSywgbnVtX2hpZF9kZXZpY2VzPSVkXG4iLAorCQljbGllbnRfZGF0YS0+bnVtX2hpZF9kZXZpY2VzKTsKKworCXJldHVybgkwOworfQorCisvKioKKyAqIGlzaHRwX2dldF9oaWRfZGVzY3JpcHRvcigpIC0gR2V0IGhpZCBkZXNjcmlwdG9yCisgKiBAaGlkX2lzaHRwX2NsOgljbGllbnQgaW5zdGFuY2UKKyAqIEBpbmRleDoJCUluZGV4IGludG8gdGhlIGhpZF9kZXNjciBhcnJheQorICoKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBzZW5kIHJlcXVlc3QgdG8gZmlybXdhcmUgZ2V0IEhJRCBkZXNjcmlwdG9yIG9mIGEgZGV2aWNlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbiB6ZXJvIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgaXNodHBfZ2V0X2hpZF9kZXNjcmlwdG9yKHN0cnVjdCBpc2h0cF9jbCAqaGlkX2lzaHRwX2NsLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGhvc3RpZl9tc2cgbXNnOworCXN0cnVjdCBpc2h0cF9jbF9kYXRhICpjbGllbnRfZGF0YSA9IGhpZF9pc2h0cF9jbC0+Y2xpZW50X2RhdGE7CisJaW50IHJ2OworCisJLyogR2V0IEhJRCBkZXNjcmlwdG9yICovCisJY2xpZW50X2RhdGEtPmhpZF9kZXNjcl9kb25lID0gZmFsc2U7CisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihzdHJ1Y3QgaG9zdGlmX21zZykpOworCW1zZy5oZHIuY29tbWFuZCA9IEhPU1RJRl9HRVRfSElEX0RFU0NSSVBUT1I7CisJbXNnLmhkci5kZXZpY2VfaWQgPSBjbGllbnRfZGF0YS0+aGlkX2RldmljZXNbaW5kZXhdLmRldl9pZDsKKwlydiA9IGlzaHRwX2NsX3NlbmQoaGlkX2lzaHRwX2NsLCAodW5zaWduZWQgY2hhciAqKSAmbXNnLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBob3N0aWZfbXNnKSk7CisJaWYgKHJ2KQorCQlyZXR1cm4gcnY7CisKKwlpZiAoIWNsaWVudF9kYXRhLT5oaWRfZGVzY3JfZG9uZSkgeworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChjbGllbnRfZGF0YS0+aW5pdF93YWl0LAorCQkJCQkJIGNsaWVudF9kYXRhLT5oaWRfZGVzY3JfZG9uZSwKKwkJCQkJCSAzICogSFopOworCQlpZiAoIWNsaWVudF9kYXRhLT5oaWRfZGVzY3JfZG9uZSkgeworCQkJZGV2X2VycigmY2xpZW50X2RhdGEtPmNsX2RldmljZS0+ZGV2LAorCQkJCSJbaGlkLWlzaF06IHRpbWVkIG91dCBmb3IgaGlkX2Rlc2NyX2RvbmVcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAoIWNsaWVudF9kYXRhLT5oaWRfZGVzY3JbaW5kZXhdKSB7CisJCQlkZXZfZXJyKCZjbGllbnRfZGF0YS0+Y2xfZGV2aWNlLT5kZXYsCisJCQkJIltoaWQtaXNoXTogYWxsb2NhdGlvbiBISUQgZGVzYyBmYWlsXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXNodHBfZ2V0X3JlcG9ydF9kZXNjcmlwdG9yKCkgLSBHZXQgcmVwb3J0IGRlc2NyaXB0b3IKKyAqIEBoaWRfaXNodHBfY2w6CWNsaWVudCBpbnN0YW5jZQorICogQGluZGV4OgkJSW5kZXggaW50byB0aGUgaGlkX2Rlc2NyIGFycmF5CisgKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIHNlbmQgcmVxdWVzdCB0byBmaXJtd2FyZSBnZXQgSElEIHJlcG9ydCBkZXNjcmlwdG9yIG9mCisgKiBhIGRldmljZQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24gemVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IGlzaHRwX2dldF9yZXBvcnRfZGVzY3JpcHRvcihzdHJ1Y3QgaXNodHBfY2wgKmhpZF9pc2h0cF9jbCwKKwkJCQkgICAgICAgaW50IGluZGV4KQoreworCXN0cnVjdCBob3N0aWZfbXNnIG1zZzsKKwlzdHJ1Y3QgaXNodHBfY2xfZGF0YSAqY2xpZW50X2RhdGEgPSBoaWRfaXNodHBfY2wtPmNsaWVudF9kYXRhOworCWludCBydjsKKworCS8qIEdldCByZXBvcnQgZGVzY3JpcHRvciAqLworCWNsaWVudF9kYXRhLT5yZXBvcnRfZGVzY3JfZG9uZSA9IGZhbHNlOworCW1lbXNldCgmbXNnLCAwLCBzaXplb2Yoc3RydWN0IGhvc3RpZl9tc2cpKTsKKwltc2cuaGRyLmNvbW1hbmQgPSBIT1NUSUZfR0VUX1JFUE9SVF9ERVNDUklQVE9SOworCW1zZy5oZHIuZGV2aWNlX2lkID0gY2xpZW50X2RhdGEtPmhpZF9kZXZpY2VzW2luZGV4XS5kZXZfaWQ7CisJcnYgPSBpc2h0cF9jbF9zZW5kKGhpZF9pc2h0cF9jbCwgKHVuc2lnbmVkIGNoYXIgKikgJm1zZywKKwkJCSAgIHNpemVvZihzdHJ1Y3QgaG9zdGlmX21zZykpOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCisJaWYgKCFjbGllbnRfZGF0YS0+cmVwb3J0X2Rlc2NyX2RvbmUpCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGNsaWVudF9kYXRhLT5pbml0X3dhaXQsCisJCQkJCSBjbGllbnRfZGF0YS0+cmVwb3J0X2Rlc2NyX2RvbmUsCisJCQkJCSAzICogSFopOworCWlmICghY2xpZW50X2RhdGEtPnJlcG9ydF9kZXNjcl9kb25lKSB7CisJCWRldl9lcnIoJmNsaWVudF9kYXRhLT5jbF9kZXZpY2UtPmRldiwKKwkJCQkiW2hpZC1pc2hdOiB0aW1lZCBvdXQgZm9yIHJlcG9ydCBkZXNjclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoIWNsaWVudF9kYXRhLT5yZXBvcnRfZGVzY3JbaW5kZXhdKSB7CisJCWRldl9lcnIoJmNsaWVudF9kYXRhLT5jbF9kZXZpY2UtPmRldiwKKwkJCSJbaGlkLWlzaF06IGZhaWxlZCB0byBhbGxvYyByZXBvcnQgZGVzY3JcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBoaWRfaXNodHBfY2xfaW5pdCgpIC0gSW5pdCBmdW5jdGlvbiBmb3IgSVNIVFAgY2xpZW50CisgKiBAaGlkX2lzaHRwX2NsOglJU0hUUCBjbGllbnQgaW5zdGFuY2UKKyAqIEByZXNldDoJCXRydWUgaWYgY2FsbGVkIGZvciBpbml0IGFmdGVyIHJlc2V0CisgKgorICogVGhpcyBmdW5jdGlvbiBjb21wbGV0ZSB0aGUgaW5pdGlhbGl6dGlvbiBvZiB0aGUgY2xpZW50LiBUaGUgc3VtbWFyeSBvZgorICogcHJvY2Vzc2luZzoKKyAqIC0gU2VuZCByZXF1ZXN0IHRvIGVudW1lcmF0ZSB0aGUgaGlkIGNsaWVudHMKKyAqCUdldCB0aGUgSElEIGRlc2NyaXB0b3IgZm9yIGVhY2ggZW51bWVhcmF0ZWQgZGV2aWNlCisgKglHZXQgcmVwb3J0IGRlc2NyaXB0aW9uIG9mIGVhY2ggZGV2aWNlCisgKglSZWdpc3RlciBlYWNoIGRldmljZSB3aWsgaGlkIGNvcmUgYnkgY2FsbGluZyBpc2h0cF9oaWRfcHJvYmUKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgbm9uIHplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBoaWRfaXNodHBfY2xfaW5pdChzdHJ1Y3QgaXNodHBfY2wgKmhpZF9pc2h0cF9jbCwgaW50IHJlc2V0KQoreworCXN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpc2h0cF9jbF9kYXRhICpjbGllbnRfZGF0YSA9IGhpZF9pc2h0cF9jbC0+Y2xpZW50X2RhdGE7CisJaW50IGk7CisJaW50IHJ2OworCisJZGV2X2RiZygmY2xpZW50X2RhdGEtPmNsX2RldmljZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICAiJXMgcmVzZXQgZmxhZzogJWRcbiIsIF9fZnVuY19fLCByZXNldCk7CisKKwlydiA9IGlzaHRwX2NsX2xpbmsoaGlkX2lzaHRwX2NsLCBJU0hUUF9IT1NUX0NMSUVOVF9JRF9BTlkpOworCWlmIChydikgeworCQlkZXZfZXJyKCZjbGllbnRfZGF0YS0+Y2xfZGV2aWNlLT5kZXYsCisJCQkiaXNodHBfY2xfbGluayBmYWlsZWRcbiIpOworCQlyZXR1cm4JLUVOT01FTTsKKwl9CisKKwljbGllbnRfZGF0YS0+aW5pdF9kb25lID0gMDsKKworCWRldiA9IGhpZF9pc2h0cF9jbC0+ZGV2OworCisJLyogQ29ubmVjdCB0byBGVyBjbGllbnQgKi8KKwloaWRfaXNodHBfY2wtPnJ4X3Jpbmdfc2l6ZSA9IEhJRF9DTF9SWF9SSU5HX1NJWkU7CisJaGlkX2lzaHRwX2NsLT50eF9yaW5nX3NpemUgPSBISURfQ0xfVFhfUklOR19TSVpFOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZndfY2xpZW50c19sb2NrLCBmbGFncyk7CisJaSA9IGlzaHRwX2Z3X2NsX2J5X3V1aWQoZGV2LCAmaGlkX2lzaHRwX2d1aWQpOworCWlmIChpIDwgMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmZ3X2NsaWVudHNfbG9jaywgZmxhZ3MpOworCQlkZXZfZXJyKCZjbGllbnRfZGF0YS0+Y2xfZGV2aWNlLT5kZXYsCisJCQkiaXNoIGNsaWVudCB1dWlkIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiBpOworCX0KKwloaWRfaXNodHBfY2wtPmZ3X2NsaWVudF9pZCA9IGRldi0+ZndfY2xpZW50c1tpXS5jbGllbnRfaWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5md19jbGllbnRzX2xvY2ssIGZsYWdzKTsKKwloaWRfaXNodHBfY2wtPnN0YXRlID0gSVNIVFBfQ0xfQ09OTkVDVElORzsKKworCXJ2ID0gaXNodHBfY2xfY29ubmVjdChoaWRfaXNodHBfY2wpOworCWlmIChydikgeworCQlkZXZfZXJyKCZjbGllbnRfZGF0YS0+Y2xfZGV2aWNlLT5kZXYsCisJCQkiY2xpZW50IGNvbm5lY3QgZmFpbFxuIik7CisJCWdvdG8gZXJyX2NsX3VubGluazsKKwl9CisKKwloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICAiJXMgY2xpZW50IGNvbm5lY3RlZFxuIiwgX19mdW5jX18pOworCisJLyogUmVnaXN0ZXIgcmVhZCBjYWxsYmFjayAqLworCWlzaHRwX3JlZ2lzdGVyX2V2ZW50X2NiKGhpZF9pc2h0cF9jbC0+ZGV2aWNlLCBpc2hfY2xfZXZlbnRfY2IpOworCisJcnYgPSBpc2h0cF9lbnVtX2VudW1fZGV2aWNlcyhoaWRfaXNodHBfY2wpOworCWlmIChydikKKwkJZ290byBlcnJfY2xfZGlzY29ubmVjdDsKKworCWhpZF9pc2h0cF90cmFjZShjbGllbnRfZGF0YSwgICIlcyBlbnVtZXJhdGVkIGRldmljZSBjb3VudCAlZFxuIiwKKwkJCV9fZnVuY19fLCBjbGllbnRfZGF0YS0+bnVtX2hpZF9kZXZpY2VzKTsKKworCWZvciAoaSA9IDA7IGkgPCBjbGllbnRfZGF0YS0+bnVtX2hpZF9kZXZpY2VzOyArK2kpIHsKKwkJY2xpZW50X2RhdGEtPmN1cl9oaWRfZGV2ID0gaTsKKworCQlydiA9IGlzaHRwX2dldF9oaWRfZGVzY3JpcHRvcihoaWRfaXNodHBfY2wsIGkpOworCQlpZiAocnYpCisJCQlnb3RvIGVycl9jbF9kaXNjb25uZWN0OworCisJCXJ2ID0gaXNodHBfZ2V0X3JlcG9ydF9kZXNjcmlwdG9yKGhpZF9pc2h0cF9jbCwgaSk7CisJCWlmIChydikKKwkJCWdvdG8gZXJyX2NsX2Rpc2Nvbm5lY3Q7CisKKwkJaWYgKCFyZXNldCkgeworCQkJcnYgPSBpc2h0cF9oaWRfcHJvYmUoaSwgY2xpZW50X2RhdGEpOworCQkJaWYgKHJ2KSB7CisJCQkJZGV2X2VycigmY2xpZW50X2RhdGEtPmNsX2RldmljZS0+ZGV2LAorCQkJCSJbaGlkLWlzaF06IEhJRCBwcm9iZSBmb3IgIyV1IGZhaWxlZDogJWRcbiIsCisJCQkJaSwgcnYpOworCQkJCWdvdG8gZXJyX2NsX2Rpc2Nvbm5lY3Q7CisJCQl9CisJCX0KKwl9IC8qIGZvcigpIG9uIGFsbCBoaWQgZGV2aWNlcyAqLworCisJY2xpZW50X2RhdGEtPmluaXRfZG9uZSA9IDE7CisJY2xpZW50X2RhdGEtPnN1c3BlbmRlZCA9IGZhbHNlOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2xpZW50X2RhdGEtPmlzaHRwX3Jlc3VtZV93YWl0KTsKKwloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICAiJXMgc3VjY2Vzc2Z1bCBpbml0XG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7CisKK2Vycl9jbF9kaXNjb25uZWN0OgorCWhpZF9pc2h0cF9jbC0+c3RhdGUgPSBJU0hUUF9DTF9ESVNDT05ORUNUSU5HOworCWlzaHRwX2NsX2Rpc2Nvbm5lY3QoaGlkX2lzaHRwX2NsKTsKK2Vycl9jbF91bmxpbms6CisJaXNodHBfY2xfdW5saW5rKGhpZF9pc2h0cF9jbCk7CisJcmV0dXJuIHJ2OworfQorCisvKioKKyAqIGhpZF9pc2h0cF9jbF9kZWluaXQoKSAtIERlaW5pdCBmdW5jdGlvbiBmb3IgSVNIVFAgY2xpZW50CisgKiBAaGlkX2lzaHRwX2NsOglJU0hUUCBjbGllbnQgaW5zdGFuY2UKKyAqCisgKiBVbmxpbmsgYW5kIGZyZWUgaGlkIGNsaWVudAorICovCitzdGF0aWMgdm9pZCBoaWRfaXNodHBfY2xfZGVpbml0KHN0cnVjdCBpc2h0cF9jbCAqaGlkX2lzaHRwX2NsKQoreworCWlzaHRwX2NsX3VubGluayhoaWRfaXNodHBfY2wpOworCWlzaHRwX2NsX2ZsdXNoX3F1ZXVlcyhoaWRfaXNodHBfY2wpOworCisJLyogZGlzYmFuZCBhbmQgZnJlZSBhbGwgVHggYW5kIFJ4IGNsaWVudC1sZXZlbCByaW5ncyAqLworCWlzaHRwX2NsX2ZyZWUoaGlkX2lzaHRwX2NsKTsKK30KKworc3RhdGljIHZvaWQgaGlkX2lzaHRwX2NsX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpc2h0cF9jbF9kYXRhICpjbGllbnRfZGF0YTsKKwlzdHJ1Y3QgaXNodHBfY2wgKmhpZF9pc2h0cF9jbDsKKwlzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICpjbF9kZXZpY2U7CisJaW50IHJldHJ5OworCWludCBydjsKKworCWNsaWVudF9kYXRhID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpc2h0cF9jbF9kYXRhLCB3b3JrKTsKKworCWhpZF9pc2h0cF9jbCA9IGNsaWVudF9kYXRhLT5oaWRfaXNodHBfY2w7CisJY2xfZGV2aWNlID0gY2xpZW50X2RhdGEtPmNsX2RldmljZTsKKworCWhpZF9pc2h0cF90cmFjZShjbGllbnRfZGF0YSwgIiVzIGhpZF9pc2h0cF9jbCAlcFxuIiwgX19mdW5jX18sCisJCQloaWRfaXNodHBfY2wpOworCWRldl9kYmcoJmNsX2RldmljZS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWhpZF9pc2h0cF9jbF9kZWluaXQoaGlkX2lzaHRwX2NsKTsKKworCWhpZF9pc2h0cF9jbCA9IGlzaHRwX2NsX2FsbG9jYXRlKGNsX2RldmljZS0+aXNodHBfZGV2KTsKKwlpZiAoIWhpZF9pc2h0cF9jbCkKKwkJcmV0dXJuOworCisJY2xfZGV2aWNlLT5kcml2ZXJfZGF0YSA9IGhpZF9pc2h0cF9jbDsKKwloaWRfaXNodHBfY2wtPmNsaWVudF9kYXRhID0gY2xpZW50X2RhdGE7CisJY2xpZW50X2RhdGEtPmhpZF9pc2h0cF9jbCA9IGhpZF9pc2h0cF9jbDsKKworCWNsaWVudF9kYXRhLT5udW1faGlkX2RldmljZXMgPSAwOworCisJZm9yIChyZXRyeSA9IDA7IHJldHJ5IDwgMzsgKytyZXRyeSkgeworCQlydiA9IGhpZF9pc2h0cF9jbF9pbml0KGhpZF9pc2h0cF9jbCwgMSk7CisJCWlmICghcnYpCisJCQlicmVhazsKKwkJZGV2X2VycigmY2xpZW50X2RhdGEtPmNsX2RldmljZS0+ZGV2LCAiUmV0cnkgcmVzZXQgaW5pdFxuIik7CisJfQorCWlmIChydikgeworCQlkZXZfZXJyKCZjbGllbnRfZGF0YS0+Y2xfZGV2aWNlLT5kZXYsICJSZXNldCBGYWlsZWRcbiIpOworCQloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICIlcyBGYWlsZWQgaGlkX2lzaHRwX2NsICVwXG4iLAorCQkJCV9fZnVuY19fLCBoaWRfaXNodHBfY2wpOworCX0KK30KKworLyoqCisgKiBoaWRfaXNodHBfY2xfcHJvYmUoKSAtIElTSFRQIGNsaWVudCBkcml2ZXIgcHJvYmUKKyAqIEBjbF9kZXZpY2U6CQlJU0hUUCBjbGllbnQgZGV2aWNlIGluc3RhbmNlCisgKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBvbiBkZXZpY2UgY3JlYXRlIG9uIElTSFRQIGJ1cworICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBub24gemVybyBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IGhpZF9pc2h0cF9jbF9wcm9iZShzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICpjbF9kZXZpY2UpCit7CisJc3RydWN0IGlzaHRwX2NsICpoaWRfaXNodHBfY2w7CisJc3RydWN0IGlzaHRwX2NsX2RhdGEgKmNsaWVudF9kYXRhOworCWludCBydjsKKworCWlmICghY2xfZGV2aWNlKQorCQlyZXR1cm4JLUVOT0RFVjsKKworCWlmICh1dWlkX2xlX2NtcChoaWRfaXNodHBfZ3VpZCwKKwkJCWNsX2RldmljZS0+ZndfY2xpZW50LT5wcm9wcy5wcm90b2NvbF9uYW1lKSAhPSAwKQorCQlyZXR1cm4JLUVOT0RFVjsKKworCWNsaWVudF9kYXRhID0gZGV2bV9remFsbG9jKCZjbF9kZXZpY2UtPmRldiwgc2l6ZW9mKCpjbGllbnRfZGF0YSksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbGllbnRfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloaWRfaXNodHBfY2wgPSBpc2h0cF9jbF9hbGxvY2F0ZShjbF9kZXZpY2UtPmlzaHRwX2Rldik7CisJaWYgKCFoaWRfaXNodHBfY2wpCisJCXJldHVybiAtRU5PTUVNOworCisJY2xfZGV2aWNlLT5kcml2ZXJfZGF0YSA9IGhpZF9pc2h0cF9jbDsKKwloaWRfaXNodHBfY2wtPmNsaWVudF9kYXRhID0gY2xpZW50X2RhdGE7CisJY2xpZW50X2RhdGEtPmhpZF9pc2h0cF9jbCA9IGhpZF9pc2h0cF9jbDsKKwljbGllbnRfZGF0YS0+Y2xfZGV2aWNlID0gY2xfZGV2aWNlOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2xpZW50X2RhdGEtPmluaXRfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY2xpZW50X2RhdGEtPmlzaHRwX3Jlc3VtZV93YWl0KTsKKworCUlOSVRfV09SSygmY2xpZW50X2RhdGEtPndvcmssIGhpZF9pc2h0cF9jbF9yZXNldF9oYW5kbGVyKTsKKworCXJ2ID0gaGlkX2lzaHRwX2NsX2luaXQoaGlkX2lzaHRwX2NsLCAwKTsKKwlpZiAocnYpIHsKKwkJaXNodHBfY2xfZnJlZShoaWRfaXNodHBfY2wpOworCQlyZXR1cm4gcnY7CisJfQorCWlzaHRwX2dldF9kZXZpY2UoY2xfZGV2aWNlKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGhpZF9pc2h0cF9jbF9yZW1vdmUoKSAtIElTSFRQIGNsaWVudCBkcml2ZXIgcmVtb3ZlCisgKiBAY2xfZGV2aWNlOgkJSVNIVFAgY2xpZW50IGRldmljZSBpbnN0YW5jZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgb24gZGV2aWNlIHJlbW92ZSBvbiBJU0hUUCBidXMKKyAqCisgKiBSZXR1cm46IDAKKyAqLworc3RhdGljIGludCBoaWRfaXNodHBfY2xfcmVtb3ZlKHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UgKmNsX2RldmljZSkKK3sKKwlzdHJ1Y3QgaXNodHBfY2wgKmhpZF9pc2h0cF9jbCA9IGNsX2RldmljZS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaHRwX2NsX2RhdGEgKmNsaWVudF9kYXRhID0gaGlkX2lzaHRwX2NsLT5jbGllbnRfZGF0YTsKKworCWhpZF9pc2h0cF90cmFjZShjbGllbnRfZGF0YSwgIiVzIGhpZF9pc2h0cF9jbCAlcFxuIiwgX19mdW5jX18sCisJCQloaWRfaXNodHBfY2wpOworCisJZGV2X2RiZygmY2xfZGV2aWNlLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCWhpZF9pc2h0cF9jbC0+c3RhdGUgPSBJU0hUUF9DTF9ESVNDT05ORUNUSU5HOworCWlzaHRwX2NsX2Rpc2Nvbm5lY3QoaGlkX2lzaHRwX2NsKTsKKwlpc2h0cF9wdXRfZGV2aWNlKGNsX2RldmljZSk7CisJaXNodHBfaGlkX3JlbW92ZShjbGllbnRfZGF0YSk7CisJaGlkX2lzaHRwX2NsX2RlaW5pdChoaWRfaXNodHBfY2wpOworCisJaGlkX2lzaHRwX2NsID0gTlVMTDsKKworCWNsaWVudF9kYXRhLT5udW1faGlkX2RldmljZXMgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGlkX2lzaHRwX2NsX3Jlc2V0KCkgLSBJU0hUUCBjbGllbnQgZHJpdmVyIHJlc2V0CisgKiBAY2xfZGV2aWNlOgkJSVNIVFAgY2xpZW50IGRldmljZSBpbnN0YW5jZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgb24gZGV2aWNlIHJlc2V0IG9uIElTSFRQIGJ1cworICoKKyAqIFJldHVybjogMAorICovCitzdGF0aWMgaW50IGhpZF9pc2h0cF9jbF9yZXNldChzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICpjbF9kZXZpY2UpCit7CisJc3RydWN0IGlzaHRwX2NsICpoaWRfaXNodHBfY2wgPSBjbF9kZXZpY2UtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBpc2h0cF9jbF9kYXRhICpjbGllbnRfZGF0YSA9IGhpZF9pc2h0cF9jbC0+Y2xpZW50X2RhdGE7CisKKwloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICIlcyBoaWRfaXNodHBfY2wgJXBcbiIsIF9fZnVuY19fLAorCQkJaGlkX2lzaHRwX2NsKTsKKworCXNjaGVkdWxlX3dvcmsoJmNsaWVudF9kYXRhLT53b3JrKTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIHRvX2lzaHRwX2NsX2RldmljZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGlzaHRwX2NsX2RldmljZSwgZGV2KQorCisvKioKKyAqIGhpZF9pc2h0cF9jbF9zdXNwZW5kKCkgLSBJU0hUUCBjbGllbnQgZHJpdmVyIHN1c3BlbmQKKyAqIEBkZXZpY2U6CWRldmljZSBpbnN0YW5jZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgb24gc3lzdGVtIHN1c3BlbmQKKyAqCisgKiBSZXR1cm46IDAKKyAqLworc3RhdGljIGludCBoaWRfaXNodHBfY2xfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IGlzaHRwX2NsX2RldmljZSAqY2xfZGV2aWNlID0gdG9faXNodHBfY2xfZGV2aWNlKGRldmljZSk7CisJc3RydWN0IGlzaHRwX2NsICpoaWRfaXNodHBfY2wgPSBjbF9kZXZpY2UtPmRyaXZlcl9kYXRhOworCXN0cnVjdCBpc2h0cF9jbF9kYXRhICpjbGllbnRfZGF0YSA9IGhpZF9pc2h0cF9jbC0+Y2xpZW50X2RhdGE7CisKKwloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICIlcyBoaWRfaXNodHBfY2wgJXBcbiIsIF9fZnVuY19fLAorCQkJaGlkX2lzaHRwX2NsKTsKKwljbGllbnRfZGF0YS0+c3VzcGVuZGVkID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGhpZF9pc2h0cF9jbF9yZXN1bWUoKSAtIElTSFRQIGNsaWVudCBkcml2ZXIgcmVzdW1lCisgKiBAZGV2aWNlOglkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkIG9uIHN5c3RlbSByZXN1bWUKKyAqCisgKiBSZXR1cm46IDAKKyAqLworc3RhdGljIGludCBoaWRfaXNodHBfY2xfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICpjbF9kZXZpY2UgPSB0b19pc2h0cF9jbF9kZXZpY2UoZGV2aWNlKTsKKwlzdHJ1Y3QgaXNodHBfY2wgKmhpZF9pc2h0cF9jbCA9IGNsX2RldmljZS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaHRwX2NsX2RhdGEgKmNsaWVudF9kYXRhID0gaGlkX2lzaHRwX2NsLT5jbGllbnRfZGF0YTsKKworCWhpZF9pc2h0cF90cmFjZShjbGllbnRfZGF0YSwgIiVzIGhpZF9pc2h0cF9jbCAlcFxuIiwgX19mdW5jX18sCisJCQloaWRfaXNodHBfY2wpOworCWNsaWVudF9kYXRhLT5zdXNwZW5kZWQgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGhpZF9pc2h0cF9wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSBoaWRfaXNodHBfY2xfc3VzcGVuZCwKKwkucmVzdW1lID0gaGlkX2lzaHRwX2NsX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaXNodHBfY2xfZHJpdmVyCWhpZF9pc2h0cF9jbF9kcml2ZXIgPSB7CisJLm5hbWUgPSAiaXNoLWhpZCIsCisJLnByb2JlID0gaGlkX2lzaHRwX2NsX3Byb2JlLAorCS5yZW1vdmUgPSBoaWRfaXNodHBfY2xfcmVtb3ZlLAorCS5yZXNldCA9IGhpZF9pc2h0cF9jbF9yZXNldCwKKwkuZHJpdmVyLnBtID0gJmhpZF9pc2h0cF9wbV9vcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpc2hfaGlkX2luaXQodm9pZCkKK3sKKwlpbnQJcnY7CisKKwkvKiBSZWdpc3RlciBJU0hUUCBjbGllbnQgZGV2aWNlIGRyaXZlciB3aXRoIElTSFRQIEJ1cyAqLworCXJ2ID0gaXNodHBfY2xfZHJpdmVyX3JlZ2lzdGVyKCZoaWRfaXNodHBfY2xfZHJpdmVyKTsKKworCXJldHVybiBydjsKKworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXNoX2hpZF9leGl0KHZvaWQpCit7CisJaXNodHBfY2xfZHJpdmVyX3VucmVnaXN0ZXIoJmhpZF9pc2h0cF9jbF9kcml2ZXIpOworfQorCitsYXRlX2luaXRjYWxsKGlzaF9oaWRfaW5pdCk7Cittb2R1bGVfZXhpdChpc2hfaGlkX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIklTSCBJU0hUUCBISUQgY2xpZW50IGRyaXZlciIpOworLyogUHJpbWFyeSBhdXRob3IgKi8KK01PRFVMRV9BVVRIT1IoIkRhbmllbCBEcnViaW4gPGRhbmllbC5kcnViaW5AaW50ZWwuY29tPiIpOworLyoKKyAqIFNldmVyYWwgbW9kaWZpY2F0aW9uIGZvciBtdWx0aSBpbnN0YW5jZSBzdXBwb3J0CisgKiBzdXNwZW5kL3Jlc3VtZSBhbmQgY2xlYW4gdXAKKyAqLworTU9EVUxFX0FVVEhPUigiU3Jpbml2YXMgUGFuZHJ1dmFkYSA8c3Jpbml2YXMucGFuZHJ1dmFkYUBsaW51eC5pbnRlbC5jb20+Iik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXNodHA6KiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC1oaWQuYyBiL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAtaGlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3OTgzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAtaGlkLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBJU0hUUC1ISUQgZ2x1ZSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSAiaXNodHAvY2xpZW50LmgiCisjaW5jbHVkZSAiaXNodHAtaGlkLmgiCisKKy8qKgorICogaXNodHBfaGlkX3BhcnNlKCkgLSBoaWQtY29yZSAucGFyc2UoKSBjYWxsYmFjaworICogQGhpZDoJaGlkIGRldmljZSBpbnN0YW5jZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZHVyaW5nIGNhbGwgdG8gaGlkX2FkZF9kZXZpY2UKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBhbmQgbm9uIHplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBpc2h0cF9oaWRfcGFyc2Uoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKK3sKKwlzdHJ1Y3QgaXNodHBfaGlkX2RhdGEgKmhpZF9kYXRhID0gIGhpZC0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlzaHRwX2NsX2RhdGEgKmNsaWVudF9kYXRhID0gaGlkX2RhdGEtPmNsaWVudF9kYXRhOworCWludCBydjsKKworCXJ2ID0gaGlkX3BhcnNlX3JlcG9ydChoaWQsIGNsaWVudF9kYXRhLT5yZXBvcnRfZGVzY3JbaGlkX2RhdGEtPmluZGV4XSwKKwkJCSAgICAgIGNsaWVudF9kYXRhLT5yZXBvcnRfZGVzY3Jfc2l6ZVtoaWRfZGF0YS0+aW5kZXhdKTsKKwlpZiAocnYpCisJCXJldHVybglydjsKKworCXJldHVybiAwOworfQorCisvKiBFbXB0eSBjYWxsYmFja3Mgd2l0aCBzdWNjZXNzIHJldHVybiBjb2RlICovCitzdGF0aWMgaW50IGlzaHRwX2hpZF9zdGFydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpc2h0cF9oaWRfc3RvcChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworfQorCitzdGF0aWMgaW50IGlzaHRwX2hpZF9vcGVuKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlzaHRwX2hpZF9jbG9zZShzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworfQorCitzdGF0aWMgaW50IGlzaHRwX3Jhd19yZXF1ZXN0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCB1bnNpZ25lZCBjaGFyIHJlcG9ydG51bSwKKwlfX3U4ICpidWYsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGNoYXIgcnR5cGUsIGludCByZXF0eXBlKQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIGlzaHRwX2hpZF9yZXF1ZXN0KCkgLSBoaWQtY29yZSAucmVxdWVzdCgpIGNhbGxiYWNrCisgKiBAaGlkOgloaWQgZGV2aWNlIGluc3RhbmNlCisgKiBAcmVwOglwb2ludGVyIHRvIGhpZF9yZXBvcnQKKyAqIEByZXF0eXBlOgl0eXBlIG9mIHJlcS4gW0dFVHxTRVRdX1JFUE9SVAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQvZ2V0IGZlYXVyZS9pbnB1dCByZXBvcnQuCisgKi8KK3N0YXRpYyB2b2lkIGlzaHRwX2hpZF9yZXF1ZXN0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXAsCisJaW50IHJlcXR5cGUpCit7CisJc3RydWN0IGlzaHRwX2hpZF9kYXRhICpoaWRfZGF0YSA9ICBoaWQtPmRyaXZlcl9kYXRhOworCS8qIHRoZSBzcGVjaWZpYyByZXBvcnQgbGVuZ3RoLCBqdXN0IEhJRCBwYXJ0IG9mIGl0ICovCisJdW5zaWduZWQgaW50IGxlbiA9ICgocmVwLT5zaXplIC0gMSkgPj4gMykgKyAxICsgKHJlcC0+aWQgPiAwKTsKKwljaGFyICpidWY7CisJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBob3N0aWZfbXNnKTsKKworCWxlbiArPSBoZWFkZXJfc2l6ZTsKKworCWhpZF9kYXRhLT5yZXF1ZXN0X2RvbmUgPSBmYWxzZTsKKwlzd2l0Y2ggKHJlcXR5cGUpIHsKKwljYXNlIEhJRF9SRVFfR0VUX1JFUE9SVDoKKwkJaGlkX2lzaHRwX2dldF9yZXBvcnQoaGlkLCByZXAtPmlkLCByZXAtPnR5cGUpOworCQlicmVhazsKKwljYXNlIEhJRF9SRVFfU0VUX1JFUE9SVDoKKwkJLyoKKwkJICogU3BhcmUgNyBieXRlcyBmb3IgNjRiIGFjY2Vzc2VzIHRocm91Z2gKKwkJICogZ2V0L3B1dF91bmFsaWduZWRfbGU2NCgpCisJCSAqLworCQlidWYgPSBremFsbG9jKGxlbiArIDcsIEdGUF9LRVJORUwpOworCQlpZiAoIWJ1ZikKKwkJCXJldHVybjsKKworCQloaWRfb3V0cHV0X3JlcG9ydChyZXAsIGJ1ZiArIGhlYWRlcl9zaXplKTsKKwkJaGlkX2lzaHRwX3NldF9mZWF0dXJlKGhpZCwgYnVmLCBsZW4sIHJlcC0+aWQpOworCQlrZnJlZShidWYpOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogaXNodHBfd2FpdF9mb3JfcmVzcG9uc2UoKSAtIGhpZC1jb3JlIC53YWl0KCkgY2FsbGJhY2sKKyAqIEBoaWQ6CWhpZCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gd2FpdCBhZnRlciBnZXQgZmVhdXJlL2lucHV0IHJlcG9ydC4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBhbmQgbm9uIHplcm8gb24gZXJyb3IKKyAqLworc3RhdGljIGludCBpc2h0cF93YWl0X2Zvcl9yZXNwb25zZShzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCXN0cnVjdCBpc2h0cF9oaWRfZGF0YSAqaGlkX2RhdGEgPSAgaGlkLT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaXNodHBfY2xfZGF0YSAqY2xpZW50X2RhdGEgPSBoaWRfZGF0YS0+Y2xpZW50X2RhdGE7CisJaW50IHJ2OworCisJaGlkX2lzaHRwX3RyYWNlKGNsaWVudF9kYXRhLCAgIiVzIGhpZCAlcFxuIiwgX19mdW5jX18sIGhpZCk7CisKKwlydiA9IGlzaHRwX2hpZF9saW5rX3JlYWR5X3dhaXQoaGlkX2RhdGEtPmNsaWVudF9kYXRhKTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKKworCWlmICghaGlkX2RhdGEtPnJlcXVlc3RfZG9uZSkKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoaGlkX2RhdGEtPmhpZF93YWl0LAorCQkJCQloaWRfZGF0YS0+cmVxdWVzdF9kb25lLCAzICogSFopOworCisJaWYgKCFoaWRfZGF0YS0+cmVxdWVzdF9kb25lKSB7CisJCWhpZF9lcnIoaGlkLAorCQkJInRpbWVvdXQgd2FpdGluZyBmb3IgcmVzcG9uc2UgZnJvbSBJU0hUUCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisJaGlkX2lzaHRwX3RyYWNlKGNsaWVudF9kYXRhLCAgIiVzIGhpZCAlcCBkb25lXG4iLCBfX2Z1bmNfXywgaGlkKTsKKworCWhpZF9kYXRhLT5yZXF1ZXN0X2RvbmUgPSBmYWxzZTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlzaHRwX2hpZF93YWtldXAoKSAtIFdha2V1cCBjYWxsZXIKKyAqIEBoaWQ6CWhpZCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgd2FrZXVwIGNhbGxlciB3YWl0aW5nIGZvciBHZXQvU2V0IGZlYXR1cmUgcmVwb3J0CisgKi8KK3ZvaWQgaXNodHBfaGlkX3dha2V1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQoreworCXN0cnVjdCBpc2h0cF9oaWRfZGF0YSAqaGlkX2RhdGEgPSBoaWQtPmRyaXZlcl9kYXRhOworCisJaGlkX2RhdGEtPnJlcXVlc3RfZG9uZSA9IHRydWU7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZoaWRfZGF0YS0+aGlkX3dhaXQpOworfQorCitzdGF0aWMgc3RydWN0IGhpZF9sbF9kcml2ZXIgaXNodHBfaGlkX2xsX2RyaXZlciA9IHsKKwkucGFyc2UgPSBpc2h0cF9oaWRfcGFyc2UsCisJLnN0YXJ0ID0gaXNodHBfaGlkX3N0YXJ0LAorCS5zdG9wID0gaXNodHBfaGlkX3N0b3AsCisJLm9wZW4gPSBpc2h0cF9oaWRfb3BlbiwKKwkuY2xvc2UgPSBpc2h0cF9oaWRfY2xvc2UsCisJLnJlcXVlc3QgPSBpc2h0cF9oaWRfcmVxdWVzdCwKKwkud2FpdCA9IGlzaHRwX3dhaXRfZm9yX3Jlc3BvbnNlLAorCS5yYXdfcmVxdWVzdCA9IGlzaHRwX3Jhd19yZXF1ZXN0Cit9OworCisvKioKKyAqIGlzaHRwX2hpZF9wcm9iZSgpIC0gaGlkIHJlZ2lzdGVyIGxsIGRyaXZlcgorICogQGN1cl9oaWRfZGV2OglJbmRleCBvZiBoaWQgZGV2aWNlIGNhbGxpbmcgdG8gcmVnaXN0ZXIKKyAqIEBjbGllbnRfZGF0YToJQ2xpZW50IGRhdGEgcG9pbnRlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhbGxvY2F0ZSBhbmQgYWRkIEhJRCBkZXZpY2UuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG5vbiB6ZXJvIG9uIGVycm9yCisgKi8KK2ludCBpc2h0cF9oaWRfcHJvYmUodW5zaWduZWQgaW50IGN1cl9oaWRfZGV2LAorCQkgICAgc3RydWN0IGlzaHRwX2NsX2RhdGEgKmNsaWVudF9kYXRhKQoreworCWludCBydjsKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkOworCXN0cnVjdCBpc2h0cF9oaWRfZGF0YSAqaGlkX2RhdGE7CisKKwloaWQgPSBoaWRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKElTX0VSUihoaWQpKSB7CisJCXJ2ID0gUFRSX0VSUihoaWQpOworCQlyZXR1cm4JLUVOT01FTTsKKwl9CisKKwloaWRfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpoaWRfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghaGlkX2RhdGEpIHsKKwkJcnYgPSAtRU5PTUVNOworCQlnb3RvIGVycl9oaWRfZGF0YTsKKwl9CisKKwloaWRfZGF0YS0+aW5kZXggPSBjdXJfaGlkX2RldjsKKwloaWRfZGF0YS0+Y2xpZW50X2RhdGEgPSBjbGllbnRfZGF0YTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoaWRfZGF0YS0+aGlkX3dhaXQpOworCisJaGlkLT5kcml2ZXJfZGF0YSA9IGhpZF9kYXRhOworCisJY2xpZW50X2RhdGEtPmhpZF9zZW5zb3JfaHVic1tjdXJfaGlkX2Rldl0gPSBoaWQ7CisKKwloaWQtPmxsX2RyaXZlciA9ICZpc2h0cF9oaWRfbGxfZHJpdmVyOworCWhpZC0+YnVzID0gQlVTX0lOVEVMX0lTSFRQOworCWhpZC0+ZGV2LnBhcmVudCA9ICZjbGllbnRfZGF0YS0+Y2xfZGV2aWNlLT5kZXY7CisJaGlkLT52ZXJzaW9uID0gbGUxNl90b19jcHUoSVNIX0hJRF9WRVJTSU9OKTsKKwloaWQtPnZlbmRvciA9IGxlMTZfdG9fY3B1KElTSF9ISURfVkVORE9SKTsKKwloaWQtPnByb2R1Y3QgPSBsZTE2X3RvX2NwdShJU0hfSElEX1BST0RVQ1QpOworCXNucHJpbnRmKGhpZC0+bmFtZSwgc2l6ZW9mKGhpZC0+bmFtZSksICIlcyAlMDRoWDolMDRoWCIsICJoaWQtaXNodHAiLAorCQloaWQtPnZlbmRvciwgaGlkLT5wcm9kdWN0KTsKKworCXJ2ID0gaGlkX2FkZF9kZXZpY2UoaGlkKTsKKwlpZiAocnYpCisJCWdvdG8gZXJyX2hpZF9kZXZpY2U7CisKKwloaWRfaXNodHBfdHJhY2UoY2xpZW50X2RhdGEsICAiJXMgYWxsb2NhdGVkIGhpZCAlcFxuIiwgX19mdW5jX18sIGhpZCk7CisKKwlyZXR1cm4gMDsKKworZXJyX2hpZF9kZXZpY2U6CisJa2ZyZWUoaGlkX2RhdGEpOworZXJyX2hpZF9kYXRhOgorCWtmcmVlKGhpZCk7CisJcmV0dXJuIHJ2OworfQorCisvKioKKyAqIGlzaHRwX2hpZF9wcm9iZSgpIC0gUmVtb3ZlIHJlZ2lzdGVyZWQgaGlkIGRldmljZQorICogQGNsaWVudF9kYXRhOgljbGllbnQgZGF0YSBwb2ludGVyCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGRlc3Ryb3kgYWxsb2NhdGQgSElEIGRldmljZS4KKyAqLwordm9pZCBpc2h0cF9oaWRfcmVtb3ZlKHN0cnVjdCBpc2h0cF9jbF9kYXRhICpjbGllbnRfZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjbGllbnRfZGF0YS0+bnVtX2hpZF9kZXZpY2VzOyArK2kpIHsKKwkJaWYgKGNsaWVudF9kYXRhLT5oaWRfc2Vuc29yX2h1YnNbaV0pIHsKKwkJCWtmcmVlKGNsaWVudF9kYXRhLT5oaWRfc2Vuc29yX2h1YnNbaV0tPmRyaXZlcl9kYXRhKTsKKwkJCWhpZF9kZXN0cm95X2RldmljZShjbGllbnRfZGF0YS0+aGlkX3NlbnNvcl9odWJzW2ldKTsKKwkJCWNsaWVudF9kYXRhLT5oaWRfc2Vuc29yX2h1YnNbaV0gPSBOVUxMOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC1oaWQuaCBiL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAtaGlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjN2ViNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwLWhpZC5oCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogSVNIVFAtSElEIGdsdWUgZHJpdmVyJ3MgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIElTSFRQX0hJRF9fSAorI2RlZmluZQlJU0hUUF9ISURfX0gKKworLyogVGhlIGZpeGVkIElTSCBwcm9kdWN0IGFuZCB2ZW5kb3IgaWQgKi8KKyNkZWZpbmUJSVNIX0hJRF9WRU5ET1IJMHg4MDg2CisjZGVmaW5lCUlTSF9ISURfUFJPRFVDVAkweDIyRDgKKyNkZWZpbmUJSVNIX0hJRF9WRVJTSU9OCTB4MDIwMAorCisjZGVmaW5lCUNNRF9NQVNLCTB4N0YKKyNkZWZpbmUJSVNfUkVTUE9OU0UJMHg4MAorCisvKiBVc2VkIHRvIGR1bXAgdG8gTGludXggdHJhY2UgYnVmZmVyLCBpZiBlbmFibGVkICovCisjZGVmaW5lIGhpZF9pc2h0cF90cmFjZShjbGllbnQsIC4uLikJXAorCWNsaWVudC0+Y2xfZGV2aWNlLT5pc2h0cF9kZXYtPnByaW50X2xvZyhcCisJCWNsaWVudC0+Y2xfZGV2aWNlLT5pc2h0cF9kZXYsIF9fVkFfQVJHU19fKQorCisvKiBJU0ggVHJhbnNwb3J0IHByb3RvY29sIChJU0hUUCBpbiBzaG9ydCkgR1VJRCAqLworc3RhdGljIGNvbnN0IHV1aWRfbGUgaGlkX2lzaHRwX2d1aWQgPSBVVUlEX0xFKDB4MzNBRUNENTgsIDB4QjY3OSwgMHg0RTU0LAorCQkJCQkgICAgICAweDlCLCAweEQ5LCAweEEwLCAweDRELCAweDM0LAorCQkJCQkgICAgICAweEYwLCAweEMyLCAweDI2KTsKKworLyogSVNIIEhJRCBtZXNzYWdlIHN0cnVjdHVyZSAqLworc3RydWN0IGhvc3RpZl9tc2dfaGRyIHsKKwl1aW50OF90CWNvbW1hbmQ7IC8qIEJpdCA3OiBpc19yZXNwb25zZSAqLworCXVpbnQ4X3QJZGV2aWNlX2lkOworCXVpbnQ4X3QJc3RhdHVzOworCXVpbnQ4X3QJZmxhZ3M7CisJdWludDE2X3Qgc2l6ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBob3N0aWZfbXNnIHsKKwlzdHJ1Y3QgaG9zdGlmX21zZ19oZHIJaGRyOworfSBfX3BhY2tlZDsKKworc3RydWN0IGhvc3RpZl9tc2dfdG9fc2Vuc29yIHsKKwlzdHJ1Y3QgaG9zdGlmX21zZ19oZHIJaGRyOworCXVpbnQ4X3QJcmVwb3J0X2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGRldmljZV9pbmZvIHsKKwl1aW50MzJfdCBkZXZfaWQ7CisJdWludDhfdCBkZXZfY2xhc3M7CisJdWludDE2X3QgcGlkOworCXVpbnQxNl90IHZpZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpc2h0cF92ZXJzaW9uIHsKKwl1aW50OF90CW1ham9yOworCXVpbnQ4X3QJbWlub3I7CisJdWludDhfdAlob3RmaXg7CisJdWludDE2X3QgYnVpbGQ7Cit9IF9fcGFja2VkOworCisvKiBzdHJ1Y3QgZm9yIElTSFRQIGFnZ3JlZ2F0ZWQgaW5wdXQgZGF0YSAqLworc3RydWN0IHJlcG9ydF9saXN0IHsKKwl1aW50MTZfdCB0b3RhbF9zaXplOworCXVpbnQ4X3QJbnVtX29mX3JlcG9ydHM7CisJdWludDhfdAlmbGFnczsKKwlzdHJ1Y3QgeworCQl1aW50MTZfdAlzaXplX29mX3JlcG9ydDsKKwkJdWludDhfdCByZXBvcnRbMV07CisJfSBfX3BhY2tlZCByZXBvcnRzWzFdOworfSBfX3BhY2tlZDsKKworLyogSE9TVElGIGNvbW1hbmRzICovCisjZGVmaW5lCUhPU1RJRl9ISURfQ09NTUFORF9CQVNFCQkJMAorI2RlZmluZQlIT1NUSUZfR0VUX0hJRF9ERVNDUklQVE9SCQkwCisjZGVmaW5lCUhPU1RJRl9HRVRfUkVQT1JUX0RFU0NSSVBUT1IJCTEKKyNkZWZpbmUgSE9TVElGX0dFVF9GRUFUVVJFX1JFUE9SVAkJMgorI2RlZmluZQlIT1NUSUZfU0VUX0ZFQVRVUkVfUkVQT1JUCQkzCisjZGVmaW5lCUhPU1RJRl9HRVRfSU5QVVRfUkVQT1JUCQkJNAorI2RlZmluZQlIT1NUSUZfUFVCTElTSF9JTlBVVF9SRVBPUlQJCTUKKyNkZWZpbmUJSE9TVElGX1BVQkxJU0hfSU5QVVRfUkVQT1JUX0xJU1QJNgorI2RlZmluZQlIT1NUSUZfRE1fQ09NTUFORF9CQVNFCQkJMzIKKyNkZWZpbmUJSE9TVElGX0RNX0VOVU1fREVWSUNFUwkJCTMzCisjZGVmaW5lCUhPU1RJRl9ETV9BRERfREVWSUNFCQkJMzQKKworI2RlZmluZQlNQVhfSElEX0RFVklDRVMJCQkJMzIKKworLyoqCisgKiBzdHJ1Y3QgaXNodHBfY2xfZGF0YSAtIEVuY2Fwc3VsYXRlIHBlciBJU0ggVFAgSElEIENsaWVudAorICogQGVudW1fZGV2aWNlX2RvbmU6CUVudW0gZGV2aWNlcyByZXNwb25zZSBjb21wbGV0ZSBmbGFnCisgKiBAaGlkX2Rlc2NyX2RvbmU6CUhJRCBkZXNjcmlwdG9yIGNvbXBsZXRlIGZsYWcKKyAqIEByZXBvcnRfZGVzY3JfZG9uZToJR2V0IHJlcG9ydCBkZXNjcmlwdG9yIGNvbXBsZXRlIGZsYWcKKyAqIEBpbml0X2RvbmU6CQlJbml0IHByb2Nlc3MgY29tcGxldGVkIHN1Y2Nlc3NmdWxseQorICogQHN1c3BlbmRlZDoJCVN5c3RlbSBpcyB1bmRlciBzdXNwZW5kIHN0YXRlIG9yIGluIHByb2dyZXNzCisgKiBAbnVtX2hpZF9kZXZpY2VzOglOdW1iZXIgb2YgSElEIGRldmljZXMgZW51bWVyYXRlZCBpbiB0aGlzIGNsaWVudAorICogQGN1cl9oaWRfZGV2OglUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBkZXZpY2UgaW5kZXggZm9yIHdoaWNoCisgKgkJCWluaXRpYWxpemF0aW9uIGFuZCByZWdpc3RyYXRpb24gd2l0aCBISUQgY29yZQorICoJCQlpbiBwcm9ncmVzcy4KKyAqIEBoaWRfZGV2aWNlczoJU3RvcmUgdmlkL3BpZC9kZXZpZCBmb3IgZWFjaCBlbnVtZXJhdGVkIEhJRCBkZXZpY2UKKyAqIEByZXBvcnRfZGVzY3I6CVN0b3JlcyB0aGUgcmF3IHJlcG9ydCBkZXNjcmlwdG9ycyBmb3IgZWFjaCBISUQgZGV2aWNlCisgKiBAcmVwb3J0X2Rlc2NyX3NpemU6CVJlcG9ydCBkZXNjcmlwdGlvbiBvZiBzaXplIG9mIGFib3ZlIHJlcG9fZGVzY3JbXQorICogQGhpZF9zZW5zb3JfaHViczoJUG9pbnRlciB0byBoaWRfZGV2aWNlIGZvciBhbGwgSElEIGRldmljZSwgc28gdGhhdAorICoJCQl3aGVuIGNsaWVudHMgYXJlIHJlbW92ZWQsIHRoZXkgY2FuIGJlIGZyZWVkCisgKiBAaGlkX2Rlc2NyOgkJUG9pbnRlciB0byBoaWQgZGVzY3JpcHRvciBmb3IgZWFjaCBlbnVtZXJhdGVkIGhpZAorICoJCQlkZXZpY2UKKyAqIEBoaWRfZGVzY3Jfc2l6ZToJU2l6ZSBvZiBlYWNoIGFib3ZlIHJlcG9ydCBkZXNjcmlwdG9yCisgKiBAaW5pdF93YWl0OgkJV2FpdCBxdWV1ZSB0byB3YWl0IGR1cmluZyBpbml0aWFsaXphdGlvbiwgd2hlcmUgdGhlCisgKgkJCWNsaWVudCBzZW5kIG1lc3NhZ2UgdG8gSVNIIEZXIGFuZCB3YWl0IGZvciByZXNwb25zZQorICogQGlzaHRwX2hpZF93YWl0OglUaGUgd2FpdCBmb3IgZ2V0IHJlcG9ydCBkdXJpbmcgd2FpdCBjYWxsYmFjayBmcm9tIGhpZAorICoJCQljb3JlCisgKiBAYmFkX3JlY3ZfY250OglSdW5uaW5nIGNvdW50IG9mIHBhY2tldHMgcmVjZWl2ZWQgd2l0aCBlcnJvcgorICogQG11bHRpX3BhY2tldF9jbnQ6CUNvdW50IG9mIGZyYWdtZW50ZWQgcGFja2V0IGNvdW50CisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSBjb21wbGV0aW9uIGZsYWdzIGFuZCBwZXIgY2xpZW50IGRhdGEgbGlrZQorICogbGlrZSByZXBvcnQgZGVzY3JpcHRpb24sIG51bWJlciBvZiBISUQgZGV2aWNlcyBldGMuCisgKi8KK3N0cnVjdCBpc2h0cF9jbF9kYXRhIHsKKwkvKiBjb21wbGV0aW9uIGZsYWdzICovCisJYm9vbCBlbnVtX2RldmljZXNfZG9uZTsKKwlib29sIGhpZF9kZXNjcl9kb25lOworCWJvb2wgcmVwb3J0X2Rlc2NyX2RvbmU7CisJYm9vbCBpbml0X2RvbmU7CisJYm9vbCBzdXNwZW5kZWQ7CisKKwl1bnNpZ25lZCBpbnQgbnVtX2hpZF9kZXZpY2VzOworCXVuc2lnbmVkIGludCBjdXJfaGlkX2RldjsKKwl1bnNpZ25lZCBpbnQgaGlkX2Rldl9jb3VudDsKKworCXN0cnVjdCBkZXZpY2VfaW5mbyAqaGlkX2RldmljZXM7CisJdW5zaWduZWQgY2hhciAqcmVwb3J0X2Rlc2NyW01BWF9ISURfREVWSUNFU107CisJaW50IHJlcG9ydF9kZXNjcl9zaXplW01BWF9ISURfREVWSUNFU107CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZF9zZW5zb3JfaHVic1tNQVhfSElEX0RFVklDRVNdOworCXVuc2lnbmVkIGNoYXIgKmhpZF9kZXNjcltNQVhfSElEX0RFVklDRVNdOworCWludCBoaWRfZGVzY3Jfc2l6ZVtNQVhfSElEX0RFVklDRVNdOworCisJd2FpdF9xdWV1ZV9oZWFkX3QgaW5pdF93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IGlzaHRwX3Jlc3VtZV93YWl0OworCXN0cnVjdCBpc2h0cF9jbCAqaGlkX2lzaHRwX2NsOworCisJLyogU3RhdGlzdGljcyAqLworCXVuc2lnbmVkIGludCBiYWRfcmVjdl9jbnQ7CisJaW50IG11bHRpX3BhY2tldF9jbnQ7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKwlzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICpjbF9kZXZpY2U7Cit9OworCisvKioKKyAqIHN0cnVjdCBpc2h0cF9oaWRfZGF0YSAtIFBlciBpbnN0YW5jZSBISUQgZGF0YQorICogQGluZGV4OgkJRGV2aWNlIGluZGV4IGluIHRoZSBvcmRlciBvZiBlbnVtZXJhdGlvbgorICogQHJlcXVlc3RfZG9uZToJR2V0IEZlYXR1cmUvSW5wdXQgcmVwb3J0IGNvbXBsZXRlIGZsYWcKKyAqCQkJdXNlZCBkdXJpbmcgZ2V0L3NldCByZXF1ZXN0IGZyb20gaGlkIGNvcmUKKyAqIEBjbGllbnRfZGF0YToJTGluayB0byB0aGUgY2xpZW50IGluc3RhbmNlCisgKiBAaGlkX3dhaXQ6CQlDb21wbGV0aW9uIHdhaXRxCisgKgorICogVXNlZCB0byB0aWUgaGlkIGhpZC0+ZHJpdmVyIGRhdGEgdG8gZHJpdmVyIGNsaWVudCBpbnN0YW5jZQorICovCitzdHJ1Y3QgaXNodHBfaGlkX2RhdGEgeworCWludCBpbmRleDsKKwlib29sIHJlcXVlc3RfZG9uZTsKKwlzdHJ1Y3QgaXNodHBfY2xfZGF0YSAqY2xpZW50X2RhdGE7CisJd2FpdF9xdWV1ZV9oZWFkX3QgaGlkX3dhaXQ7Cit9OworCisvKiBJbnRlcmZhY2UgZnVuY3Rpb25zIGJldHdlZW4gSElEIExMIGRyaXZlciBhbmQgSVNIIFRQIGNsaWVudCAqLwordm9pZCBoaWRfaXNodHBfc2V0X2ZlYXR1cmUoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJICAgaW50IHJlcG9ydF9pZCk7Cit2b2lkIGhpZF9pc2h0cF9nZXRfcmVwb3J0KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIGludCByZXBvcnRfaWQsCisJCQkgIGludCByZXBvcnRfdHlwZSk7CitpbnQgaXNodHBfaGlkX3Byb2JlKHVuc2lnbmVkIGludCBjdXJfaGlkX2RldiwKKwkJICAgIHN0cnVjdCBpc2h0cF9jbF9kYXRhICpjbGllbnRfZGF0YSk7Cit2b2lkIGlzaHRwX2hpZF9yZW1vdmUoc3RydWN0IGlzaHRwX2NsX2RhdGEgKmNsaWVudF9kYXRhKTsKK2ludCBpc2h0cF9oaWRfbGlua19yZWFkeV93YWl0KHN0cnVjdCBpc2h0cF9jbF9kYXRhICpjbGllbnRfZGF0YSk7Cit2b2lkIGlzaHRwX2hpZF93YWtldXAoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCk7CisKKyNlbmRpZgkvKiBJU0hUUF9ISURfX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAvYnVzLmMgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwL2J1cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjUyMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwL2J1cy5jCkBAIC0wLDAgKzEsNzg4IEBACisvKgorICogSVNIVFAgYnVzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImJ1cy5oIgorI2luY2x1ZGUgImlzaHRwLWRldi5oIgorI2luY2x1ZGUgImNsaWVudC5oIgorI2luY2x1ZGUgImhibS5oIgorCitzdGF0aWMgaW50IGlzaHRwX3VzZV9kbWE7Cittb2R1bGVfcGFyYW1fbmFtZWQoaXNodHBfdXNlX2RtYSwgaXNodHBfdXNlX2RtYSwgaW50LCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXNodHBfdXNlX2RtYSwgIlVzZSBETUEgdG8gc2VuZCBtZXNzYWdlcyIpOworCisjZGVmaW5lIHRvX2lzaHRwX2NsX2RyaXZlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGlzaHRwX2NsX2RyaXZlciwgZHJpdmVyKQorI2RlZmluZSB0b19pc2h0cF9jbF9kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UsIGRldikKK3N0YXRpYyBib29sIGlzaHRwX2RldmljZV9yZWFkeTsKKworLyoqCisgKiBpc2h0cF9yZWN2KCkgLSBwcm9jZXNzIGlzaHRwIG1lc3NhZ2UKKyAqIEBkZXY6IGlzaHRwIGRldmljZQorICoKKyAqIElmIGEgbWVzc2FnZSB3aXRoIHZhbGlkIGhlYWRlciBhbmQgc2l6ZSBpcyByZWNlaXZlZCwgdGhlbgorICogdGhpcyBmdW5jdGlvbiBjYWxscyBhcHByb3ByaWF0ZSBoYW5kbGVyLiBUaGUgaG9zdCBvciBmaXJtd2FyZQorICogYWRkcmVzcyBpcyB6ZXJvLCB0aGVuIHRoZXkgYXJlIGhvc3QgYnVzIG1hbmFnZW1lbnQgbWVzc2FnZSwKKyAqIG90aGVyd2lzZSB0aGV5IGFyZSBtZXNzYWdlIGZvIGNsaWVudHMuCisgKi8KK3ZvaWQgaXNodHBfcmVjdihzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJdWludDMyX3QJbXNnX2hkcjsKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkcgkqaXNodHBfaGRyOworCisJLyogUmVhZCBJU0hUUCBoZWFkZXIgZHdvcmQgKi8KKwltc2dfaGRyID0gZGV2LT5vcHMtPmlzaHRwX3JlYWRfaGRyKGRldik7CisJaWYgKCFtc2dfaGRyKQorCQlyZXR1cm47CisKKwlkZXYtPm9wcy0+c3luY19md19jbG9jayhkZXYpOworCisJaXNodHBfaGRyID0gKHN0cnVjdCBpc2h0cF9tc2dfaGRyICopJm1zZ19oZHI7CisJZGV2LT5pc2h0cF9tc2dfaGRyID0gbXNnX2hkcjsKKworCS8qIFNhbml0eSBjaGVjazogSVNIVFAgZnJhZy4gbGVuZ3RoIGluIGhlYWRlciAqLworCWlmIChpc2h0cF9oZHItPmxlbmd0aCA+IGRldi0+bXR1KSB7CisJCWRldl9lcnIoZGV2LT5kZXZjLAorCQkJIklTSFRQIGhkciAtIGJhZCBsZW5ndGg6ICV1OyBkcm9wcGVkIFslMDhYXVxuIiwKKwkJCSh1bnNpZ25lZCBpbnQpaXNodHBfaGRyLT5sZW5ndGgsIG1zZ19oZHIpOworCQlyZXR1cm47CisJfQorCisJLyogSVNIVFAgYnVzIG1lc3NhZ2UgKi8KKwlpZiAoIWlzaHRwX2hkci0+aG9zdF9hZGRyICYmICFpc2h0cF9oZHItPmZ3X2FkZHIpCisJCXJlY3ZfaGJtKGRldiwgaXNodHBfaGRyKTsKKwkvKiBJU0hUUCBmaXhlZC1jbGllbnQgbWVzc2FnZSAqLworCWVsc2UgaWYgKCFpc2h0cF9oZHItPmhvc3RfYWRkcikKKwkJcmVjdl9maXhlZF9jbF9tc2coZGV2LCBpc2h0cF9oZHIpOworCWVsc2UKKwkJLyogSVNIVFAgY2xpZW50IG1lc3NhZ2UgKi8KKwkJcmVjdl9pc2h0cF9jbF9tc2coZGV2LCBpc2h0cF9oZHIpOworfQorRVhQT1JUX1NZTUJPTChpc2h0cF9yZWN2KTsKKworLyoqCisgKiBpc2h0cF9zZW5kX21zZygpIC0gU2VuZCBpc2h0cCBtZXNzYWdlCisgKiBAZGV2OiBpc2h0cCBkZXZpY2UKKyAqIEBoZHI6IE1lc3NhZ2UgaGVhZGVyCisgKiBAbXNnOiBNZXNzYWdlIGNvbnRlbnRzCisgKiBAaXBjX3NlbmRfY29tcGw6IGNvbXBsZXRpb24gY2FsbGJhY2sKKyAqIEBpcGNfc2VuZF9jb21wbF9wcm06IGNvbXBsZXRpb24gY2FsbGJhY2sgcGFyYW1ldGVyCisgKgorICogU2VuZCBhIG11bHRpIGZyYWdtZW50IG1lc3NhZ2UgdmlhIElQQy4gQWZ0ZXIgc2VuZGluZyB0aGUgZmlyc3QgZnJhZ21lbnQKKyAqIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZCB0byBzY2hlZHVsZSB0cmFuc21pdCBvZiBuZXh0IGZyYWdtZW50LgorICoKKyAqIFJldHVybjogVGhpcyByZXR1cm5zIElQQyBzZW5kIG1lc3NhZ2Ugc3RhdHVzLgorICovCitpbnQgaXNodHBfc2VuZF9tc2coc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LCBzdHJ1Y3QgaXNodHBfbXNnX2hkciAqaGRyLAorCQkgICAgICAgdm9pZCAqbXNnLCB2b2lkKCppcGNfc2VuZF9jb21wbCkodm9pZCAqKSwKKwkJICAgICAgIHZvaWQgKmlwY19zZW5kX2NvbXBsX3BybSkKK3sKKwl1bnNpZ25lZCBjaGFyCWlwY19tc2dbSVBDX0ZVTExfTVNHX1NJWkVdOworCXVpbnQzMl90CWRyYmxfdmFsOworCisJZHJibF92YWwgPSBkZXYtPm9wcy0+aXBjX2dldF9oZWFkZXIoZGV2LCBoZHItPmxlbmd0aCArCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGlzaHRwX21zZ19oZHIpLAorCQkJCQkgICAgMSk7CisKKwltZW1jcHkoaXBjX21zZywgJmRyYmxfdmFsLCBzaXplb2YodWludDMyX3QpKTsKKwltZW1jcHkoaXBjX21zZyArIHNpemVvZih1aW50MzJfdCksIGhkciwgc2l6ZW9mKHVpbnQzMl90KSk7CisJbWVtY3B5KGlwY19tc2cgKyAyICogc2l6ZW9mKHVpbnQzMl90KSwgbXNnLCBoZHItPmxlbmd0aCk7CisJcmV0dXJuCWRldi0+b3BzLT53cml0ZShkZXYsIGlwY19zZW5kX2NvbXBsLCBpcGNfc2VuZF9jb21wbF9wcm0sCisJCQkJaXBjX21zZywgMiAqIHNpemVvZih1aW50MzJfdCkgKyBoZHItPmxlbmd0aCk7Cit9CisKKy8qKgorICogaXNodHBfd3JpdGVfbWVzc2FnZSgpIC0gU2VuZCBpc2h0cCBzaW5nbGUgZnJhZ21lbnQgbWVzc2FnZQorICogQGRldjogaXNodHAgZGV2aWNlCisgKiBAaGRyOiBNZXNzYWdlIGhlYWRlcgorICogQGJ1ZjogbWVzc2FnZSBkYXRhCisgKgorICogU2VuZCBhIHNpbmdsZSBmcmFnbWVudCBtZXNzYWdlIHZpYSBJUEMuICBUaGlzIHJldHVybnMgSVBDIHNlbmQgbWVzc2FnZQorICogc3RhdHVzLgorICoKKyAqIFJldHVybjogVGhpcyByZXR1cm5zIElQQyBzZW5kIG1lc3NhZ2Ugc3RhdHVzLgorICovCitpbnQgaXNodHBfd3JpdGVfbWVzc2FnZShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsIHN0cnVjdCBpc2h0cF9tc2dfaGRyICpoZHIsCisJCQl1bnNpZ25lZCBjaGFyICpidWYpCit7CisJcmV0dXJuIGlzaHRwX3NlbmRfbXNnKGRldiwgaGRyLCBidWYsIE5VTEwsIE5VTEwpOworfQorCisvKioKKyAqIGlzaHRwX2Z3X2NsX2J5X3V1aWQoKSAtIGxvY2F0ZSBpbmRleCBvZiBmdyBjbGllbnQKKyAqIEBkZXY6IGlzaHRwIGRldmljZQorICogQHV1aWQ6IHV1aWQgb2YgdGhlIGNsaWVudCB0byBzZWFyY2gKKyAqCisgKiBTZWFyY2ggZmlybXdhcmUgY2xpZW50IHVzaW5nIFVVSUQuCisgKgorICogUmV0dXJuOiBmdyBjbGllbnQgaW5kZXggb3IgLUVOT0VOVCBpZiBub3QgZm91bmQKKyAqLworaW50IGlzaHRwX2Z3X2NsX2J5X3V1aWQoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LCBjb25zdCB1dWlkX2xlICp1dWlkKQoreworCWludCBpLCByZXMgPSAtRU5PRU5UOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+ZndfY2xpZW50c19udW07ICsraSkgeworCQlpZiAodXVpZF9sZV9jbXAoKnV1aWQsIGRldi0+ZndfY2xpZW50c1tpXS5wcm9wcy5wcm90b2NvbF9uYW1lKQorCQkJCT09IDApIHsKKwkJCXJlcyA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTChpc2h0cF9md19jbF9ieV91dWlkKTsKKworLyoqCisgKiBpc2h0cF9md19jbF9ieV9pZCgpIC0gcmV0dXJuIGluZGV4IHRvIGZ3X2NsaWVudHMgZm9yIGNsaWVudF9pZAorICogQGRldjogdGhlIGlzaHRwIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBjbGllbnRfaWQ6IGZ3IGNsaWVudCBpZCB0byBzZWFyY2gKKyAqCisgKiBTZWFyY2ggZmlybXdhcmUgY2xpZW50IHVzaW5nIGNsaWVudCBpZC4KKyAqCisgKiBSZXR1cm46IGluZGV4IG9uIHN1Y2Nlc3MsIC1FTk9FTlQgb24gZmFpbHVyZS4KKyAqLworaW50IGlzaHRwX2Z3X2NsX2J5X2lkKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwgdWludDhfdCBjbGllbnRfaWQpCit7CisJaW50IGksIHJlcyA9IC1FTk9FTlQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmZ3X2NsaWVudHNfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmZ3X2NsaWVudHNfbnVtOyBpKyspIHsKKwkJaWYgKGRldi0+ZndfY2xpZW50c1tpXS5jbGllbnRfaWQgPT0gY2xpZW50X2lkKSB7CisJCQlyZXMgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5md19jbGllbnRzX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogaXNodHBfY2xfZGV2aWNlX3Byb2JlKCkgLSBCdXMgcHJvYmUoKSBjYWxsYmFjaworICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGlzIGEgYnVzIHByb2JlIGNhbGxiYWNrIGFuZCBjYWxscyB0aGUgZHJpdmUgcHJvYmUgZnVuY3Rpb24uCisgKgorICogUmV0dXJuOiBSZXR1cm4gdmFsdWUgZnJvbSBkcml2ZXIgcHJvYmUoKSBjYWxsLgorICovCitzdGF0aWMgaW50IGlzaHRwX2NsX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlzaHRwX2NsX2RldmljZSAqZGV2aWNlID0gdG9faXNodHBfY2xfZGV2aWNlKGRldik7CisJc3RydWN0IGlzaHRwX2NsX2RyaXZlciAqZHJpdmVyOworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAwOworCisJZHJpdmVyID0gdG9faXNodHBfY2xfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpZiAoIWRyaXZlciB8fCAhZHJpdmVyLT5wcm9iZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gZHJpdmVyLT5wcm9iZShkZXZpY2UpOworfQorCisvKioKKyAqIGlzaHRwX2NsX2RldmljZV9yZW1vdmUoKSAtIEJ1cyByZW1vdmUoKSBjYWxsYmFjaworICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGlzIGEgYnVzIHJlbW92ZSBjYWxsYmFjayBhbmQgY2FsbHMgdGhlIGRyaXZlIHJlbW92ZSBmdW5jdGlvbi4KKyAqIFNpbmNlIHRoZSBJU0ggZHJpdmVyIG1vZGVsIHN1cHBvcnRzIG9ubHkgYnVpbHQgaW4sIHRoaXMgaXMKKyAqIHByaW1hcmlseSBjYW4gYmUgY2FsbGVkIGR1cmluZyBwY2kgZHJpdmVyIGluaXQgZmFpbHVyZS4KKyAqCisgKiBSZXR1cm46IFJldHVybiB2YWx1ZSBmcm9tIGRyaXZlciByZW1vdmUoKSBjYWxsLgorICovCitzdGF0aWMgaW50IGlzaHRwX2NsX2RldmljZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpc2h0cF9jbF9kZXZpY2UgKmRldmljZSA9IHRvX2lzaHRwX2NsX2RldmljZShkZXYpOworCXN0cnVjdCBpc2h0cF9jbF9kcml2ZXIgKmRyaXZlcjsKKworCWlmICghZGV2aWNlIHx8ICFkZXYtPmRyaXZlcikKKwkJcmV0dXJuIDA7CisKKwlpZiAoZGV2aWNlLT5ldmVudF9jYikgeworCQlkZXZpY2UtPmV2ZW50X2NiID0gTlVMTDsKKwkJY2FuY2VsX3dvcmtfc3luYygmZGV2aWNlLT5ldmVudF93b3JrKTsKKwl9CisKKwlkcml2ZXIgPSB0b19pc2h0cF9jbF9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmICghZHJpdmVyLT5yZW1vdmUpIHsKKwkJZGV2LT5kcml2ZXIgPSBOVUxMOworCisJCXJldHVybiAwOworCX0KKworCXJldHVybiBkcml2ZXItPnJlbW92ZShkZXZpY2UpOworfQorCisvKioKKyAqIGlzaHRwX2NsX2RldmljZV9zdXNwZW5kKCkgLSBCdXMgc3VzcGVuZCBjYWxsYmFjaworICogQGRldjoJZGV2aWNlCisgKgorICogQ2FsbGVkIGR1cmluZyBkZXZpY2Ugc3VzcGVuZCBwcm9jZXNzLgorICoKKyAqIFJldHVybjogUmV0dXJuIHZhbHVlIGZyb20gZHJpdmVyIHN1c3BlbmQoKSBjYWxsLgorICovCitzdGF0aWMgaW50IGlzaHRwX2NsX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICpkZXZpY2UgPSB0b19pc2h0cF9jbF9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgaXNodHBfY2xfZHJpdmVyICpkcml2ZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIDA7CisKKwlkcml2ZXIgPSB0b19pc2h0cF9jbF9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmIChkcml2ZXIgJiYgZHJpdmVyLT5kcml2ZXIucG0pIHsKKwkJaWYgKGRyaXZlci0+ZHJpdmVyLnBtLT5zdXNwZW5kKQorCQkJcmV0ID0gZHJpdmVyLT5kcml2ZXIucG0tPnN1c3BlbmQoZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGlzaHRwX2NsX2RldmljZV9yZXN1bWUoKSAtIEJ1cyByZXN1bWUgY2FsbGJhY2sKKyAqIEBkZXY6CWRldmljZQorICoKKyAqIENhbGxlZCBkdXJpbmcgZGV2aWNlIHJlc3VtZSBwcm9jZXNzLgorICoKKyAqIFJldHVybjogUmV0dXJuIHZhbHVlIGZyb20gZHJpdmVyIHJlc3VtZSgpIGNhbGwuCisgKi8KK3N0YXRpYyBpbnQgaXNodHBfY2xfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlzaHRwX2NsX2RldmljZSAqZGV2aWNlID0gdG9faXNodHBfY2xfZGV2aWNlKGRldik7CisJc3RydWN0IGlzaHRwX2NsX2RyaXZlciAqZHJpdmVyOworCWludCByZXQgPSAwOworCisJaWYgKCFkZXZpY2UpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBXaGVuIElTSCBuZWVkcyBoYXJkIHJlc2V0LCBpdCBpcyBkb25lIGFzeW5jaHJub3VzbHksIGhlbmNlIGJ1cworCSAqIHJlc3VtZSB3aWxsICBiZSBjYWxsZWQgYmVmb3JlIGZ1bGwgSVNIIHJlc3VtZQorCSAqLworCWlmIChkZXZpY2UtPmlzaHRwX2Rldi0+cmVzdW1lX2ZsYWcpCisJCXJldHVybiAwOworCisJZHJpdmVyID0gdG9faXNodHBfY2xfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpZiAoZHJpdmVyICYmIGRyaXZlci0+ZHJpdmVyLnBtKSB7CisJCWlmIChkcml2ZXItPmRyaXZlci5wbS0+cmVzdW1lKQorCQkJcmV0ID0gZHJpdmVyLT5kcml2ZXIucG0tPnJlc3VtZShkZXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaXNodHBfY2xfZGV2aWNlX3Jlc2V0KCkgLSBSZXNldCBjYWxsYmFjaworICogQGRldmljZToJaXNodHAgY2xpZW50IGRldmljZSBpbnN0YW5jZQorICoKKyAqIFRoaXMgaXMgYSBjYWxsYmFjayB3aGVuIEhXIHJlc2V0IGlzIGRvbmUgYW5kIHRoZSBkZXZpY2UgbmVlZAorICogcmVpbml0LgorICoKKyAqIFJldHVybjogUmV0dXJuIHZhbHVlIGZyb20gZHJpdmVyIHJlc2V0KCkgY2FsbC4KKyAqLworc3RhdGljIGludCBpc2h0cF9jbF9kZXZpY2VfcmVzZXQoc3RydWN0IGlzaHRwX2NsX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBpc2h0cF9jbF9kcml2ZXIgKmRyaXZlcjsKKwlpbnQgcmV0ID0gMDsKKworCWRldmljZS0+ZXZlbnRfY2IgPSBOVUxMOworCWNhbmNlbF93b3JrX3N5bmMoJmRldmljZS0+ZXZlbnRfd29yayk7CisKKwlkcml2ZXIgPSB0b19pc2h0cF9jbF9kcml2ZXIoZGV2aWNlLT5kZXYuZHJpdmVyKTsKKwlpZiAoZHJpdmVyICYmIGRyaXZlci0+cmVzZXQpCisJCXJldCA9IGRyaXZlci0+cmVzZXQoZGV2aWNlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1vZGFsaWFzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYSwKKwljaGFyICpidWYpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiaXNodHA6JXNcbiIsIGRldl9uYW1lKGRldikpOworCXJldHVybiAobGVuID49IFBBR0VfU0laRSkgPyAoUEFHRV9TSVpFIC0gMSkgOiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBpc2h0cF9jbF9kZXZfYXR0cnNbXSA9IHsKKwlfX0FUVFJfUk8obW9kYWxpYXMpLAorCV9fQVRUUl9OVUxMLAorfTsKKworc3RhdGljIGludCBpc2h0cF9jbF91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPWlzaHRwOiVzIiwgZGV2X25hbWUoZGV2KSkpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaXNodHBfY2xfYnVzX2Rldl9wbV9vcHMgPSB7CisJLyogU3VzcGVuZCBjYWxsYmFja3MgKi8KKwkuc3VzcGVuZCA9IGlzaHRwX2NsX2RldmljZV9zdXNwZW5kLAorCS5yZXN1bWUgPSBpc2h0cF9jbF9kZXZpY2VfcmVzdW1lLAorCS8qIEhpYmVybmF0ZSBjYWxsYmFja3MgKi8KKwkuZnJlZXplID0gaXNodHBfY2xfZGV2aWNlX3N1c3BlbmQsCisJLnRoYXcgPSBpc2h0cF9jbF9kZXZpY2VfcmVzdW1lLAorCS5yZXN0b3JlID0gaXNodHBfY2xfZGV2aWNlX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgaXNodHBfY2xfYnVzX3R5cGUgPSB7CisJLm5hbWUJCT0gImlzaHRwIiwKKwkuZGV2X2F0dHJzCT0gaXNodHBfY2xfZGV2X2F0dHJzLAorCS5wcm9iZQkJPSBpc2h0cF9jbF9kZXZpY2VfcHJvYmUsCisJLnJlbW92ZQkJPSBpc2h0cF9jbF9kZXZpY2VfcmVtb3ZlLAorCS5wbQkJPSAmaXNodHBfY2xfYnVzX2Rldl9wbV9vcHMsCisJLnVldmVudAkJPSBpc2h0cF9jbF91ZXZlbnQsCit9OworCitzdGF0aWMgdm9pZCBpc2h0cF9jbF9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJa2ZyZWUodG9faXNodHBfY2xfZGV2aWNlKGRldikpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV90eXBlIGlzaHRwX2NsX2RldmljZV90eXBlID0geworCS5yZWxlYXNlCT0gaXNodHBfY2xfZGV2X3JlbGVhc2UsCit9OworCisvKioKKyAqIGlzaHRwX2J1c19hZGRfZGV2aWNlKCkgLSBGdW5jdGlvbiB0byBjcmVhdGUgZGV2aWNlIG9uIGJ1cworICogQGRldjoJaXNodHAgZGV2aWNlCisgKiBAdXVpZDoJdXVpZCBvZiB0aGUgY2xpZW50CisgKiBAbmFtZToJTmFtZSBvZiB0aGUgY2xpZW50CisgKgorICogQWxsb2NhdGUgSVNIVFAgYnVzIGNsaWVudCBkZXZpY2UsIGF0dGFjaCBpdCB0byB1dWlkCisgKiBhbmQgcmVnaXN0ZXIgd2l0aCBJU0hUUCBidXMuCisgKgorICogUmV0dXJuOiBpc2h0cF9jbF9kZXZpY2UgcG9pbnRlciBvciBOVUxMIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UgKmlzaHRwX2J1c19hZGRfZGV2aWNlKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwkJCQkJCSAgICB1dWlkX2xlIHV1aWQsIGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGlzaHRwX2NsX2RldmljZSAqZGV2aWNlOworCWludCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmRldmljZV9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmRldi0+ZGV2aWNlX2xpc3QsIGRldmljZV9saW5rKSB7CisJCWlmICghc3RyY21wKG5hbWUsIGRldl9uYW1lKCZkZXZpY2UtPmRldikpKSB7CisJCQlkZXZpY2UtPmZ3X2NsaWVudCA9ICZkZXYtPmZ3X2NsaWVudHNbCisJCQkJZGV2LT5md19jbGllbnRfcHJlc2VudGF0aW9uX251bSAtIDFdOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisJCQlpc2h0cF9jbF9kZXZpY2VfcmVzZXQoZGV2aWNlKTsKKwkJCXJldHVybiBkZXZpY2U7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlkZXZpY2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZpY2UpCisJCXJldHVybiBOVUxMOworCisJZGV2aWNlLT5kZXYucGFyZW50ID0gZGV2LT5kZXZjOworCWRldmljZS0+ZGV2LmJ1cyA9ICZpc2h0cF9jbF9idXNfdHlwZTsKKwlkZXZpY2UtPmRldi50eXBlID0gJmlzaHRwX2NsX2RldmljZV90eXBlOworCWRldmljZS0+aXNodHBfZGV2ID0gZGV2OworCisJZGV2aWNlLT5md19jbGllbnQgPQorCQkmZGV2LT5md19jbGllbnRzW2Rldi0+ZndfY2xpZW50X3ByZXNlbnRhdGlvbl9udW0gLSAxXTsKKworCWRldl9zZXRfbmFtZSgmZGV2aWNlLT5kZXYsICIlcyIsIG5hbWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZGV2aWNlX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+ZGV2aWNlX2xpbmssICZkZXYtPmRldmljZV9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmRldmljZV9saXN0X2xvY2ssIGZsYWdzKTsKKworCXN0YXR1cyA9IGRldmljZV9yZWdpc3RlcigmZGV2aWNlLT5kZXYpOworCWlmIChzdGF0dXMpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZGV2aWNlX2xpc3RfbG9jaywgZmxhZ3MpOworCQlsaXN0X2RlbCgmZGV2aWNlLT5kZXZpY2VfbGluayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZGV2aWNlX2xpc3RfbG9jaywgZmxhZ3MpOworCQlkZXZfZXJyKGRldi0+ZGV2YywgIkZhaWxlZCB0byByZWdpc3RlciBJU0hUUCBjbGllbnQgZGV2aWNlXG4iKTsKKwkJa2ZyZWUoZGV2aWNlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaXNodHBfZGV2aWNlX3JlYWR5ID0gdHJ1ZTsKKworCXJldHVybiBkZXZpY2U7Cit9CisKKy8qKgorICogaXNodHBfYnVzX3JlbW92ZV9kZXZpY2UoKSAtIEZ1bmN0aW9uIHRvIHJlbGFzZSBkZXZpY2Ugb24gYnVzCisgKiBAZGV2aWNlOgljbGllbnQgZGV2aWNlIGluc3RhbmNlCisgKgorICogVGhpcyBpcyBhIGNvdW50ZXJwYXJ0IG9mIGlzaHRwX2J1c19hZGRfZGV2aWNlLgorICogRGV2aWNlIGlzIHVucmVnaXN0ZXJlZC4KKyAqIHRoZSBkZXZpY2Ugc3RydWN0dXJlIGlzIGZyZWVkIGluICdpc2h0cF9jbF9kZXZfcmVsZWFzZScgZnVuY3Rpb24KKyAqIENhbGxlZCBvbmx5IGR1cmluZyBlcnJvciBpbiBwY2kgZHJpdmVyIGluaXQgcGF0aC4KKyAqLworc3RhdGljIHZvaWQgaXNodHBfYnVzX3JlbW92ZV9kZXZpY2Uoc3RydWN0IGlzaHRwX2NsX2RldmljZSAqZGV2aWNlKQoreworCWRldmljZV91bnJlZ2lzdGVyKCZkZXZpY2UtPmRldik7Cit9CisKKy8qKgorICogX19pc2h0cF9jbF9kcml2ZXJfcmVnaXN0ZXIoKSAtIENsaWVudCBkcml2ZXIgcmVnaXN0ZXIKKyAqIEBkcml2ZXI6CXRoZSBjbGllbnQgZHJpdmVyIGluc3RhbmNlCisgKiBAb3duZXI6CU93bmVyIG9mIHRoaXMgZHJpdmVyIG1vZHVsZQorICoKKyAqIE9uY2UgYSBjbGllbnQgZHJpdmVyIGlzIHByb2JlZCwgaXQgY3JlYXRlZCBhIGNsaWVudAorICogaW5zdGFuY2UgYW5kIHJlZ2lzdGVycyB3aXRoIHRoZSBidXMuCisgKgorICogUmV0dXJuOiBSZXR1cm4gdmFsdWUgb2YgZHJpdmVyX3JlZ2lzdGVyIG9yIC1FTk9ERVYgaWYgbm90IHJlYWR5CisgKi8KK2ludCBfX2lzaHRwX2NsX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgaXNodHBfY2xfZHJpdmVyICpkcml2ZXIsCisJCQkgICAgICAgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJaW50IGVycjsKKworCWlmICghaXNodHBfZGV2aWNlX3JlYWR5KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRyaXZlci0+ZHJpdmVyLm5hbWUgPSBkcml2ZXItPm5hbWU7CisJZHJpdmVyLT5kcml2ZXIub3duZXIgPSBvd25lcjsKKwlkcml2ZXItPmRyaXZlci5idXMgPSAmaXNodHBfY2xfYnVzX3R5cGU7CisKKwllcnIgPSBkcml2ZXJfcmVnaXN0ZXIoJmRyaXZlci0+ZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKF9faXNodHBfY2xfZHJpdmVyX3JlZ2lzdGVyKTsKKworLyoqCisgKiBpc2h0cF9jbF9kcml2ZXJfdW5yZWdpc3RlcigpIC0gQ2xpZW50IGRyaXZlciB1bnJlZ2lzdGVyCisgKiBAZHJpdmVyOgl0aGUgY2xpZW50IGRyaXZlciBpbnN0YW5jZQorICoKKyAqIFVucmVnaXN0ZXIgY2xpZW50IGR1cmluZyBkZXZpY2UgcmVtb3ZhbCBwcm9jZXNzLgorICovCit2b2lkIGlzaHRwX2NsX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBpc2h0cF9jbF9kcml2ZXIgKmRyaXZlcikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTChpc2h0cF9jbF9kcml2ZXJfdW5yZWdpc3Rlcik7CisKKy8qKgorICogaXNodHBfYnVzX2V2ZW50X3dvcmsoKSAtIGV2ZW50IHdvcmsgZnVuY3Rpb24KKyAqIEB3b3JrOgl3b3JrIHN0cnVjdCBwb2ludGVyCisgKgorICogT25jZSBhbiBldmVudCBpcyByZWNlaXZlZCBmb3IgYSBjbGllbnQgdGhpcyB3b3JrCisgKiBmdW5jdGlvbiBpcyBjYWxsZWQuIElmIHRoZSBkZXZpY2UgaGFzIHJlZ2lzdGVyZWQgYQorICogY2FsbGJhY2sgdGhlbiB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkLgorICovCitzdGF0aWMgdm9pZCBpc2h0cF9idXNfZXZlbnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGlzaHRwX2NsX2RldmljZSAqZGV2aWNlOworCisJZGV2aWNlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UsIGV2ZW50X3dvcmspOworCisJaWYgKGRldmljZS0+ZXZlbnRfY2IpCisJCWRldmljZS0+ZXZlbnRfY2IoZGV2aWNlKTsKK30KKworLyoqCisgKiBpc2h0cF9jbF9idXNfcnhfZXZlbnQoKSAtIHNjaGVkdWxlIGV2ZW50IHdvcmsKKyAqIEBkZXZpY2U6CWNsaWVudCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBPbmNlIGFuIGV2ZW50IGlzIHJlY2VpdmVkIGZvciBhIGNsaWVudCB0aGlzIHNjaGVkdWxlcworICogYSB3b3JrIGZ1bmN0aW9uIHRvIHByb2Nlc3MuCisgKi8KK3ZvaWQgaXNodHBfY2xfYnVzX3J4X2V2ZW50KHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UgKmRldmljZSkKK3sKKwlpZiAoIWRldmljZSB8fCAhZGV2aWNlLT5ldmVudF9jYikKKwkJcmV0dXJuOworCisJaWYgKGRldmljZS0+ZXZlbnRfY2IpCisJCXNjaGVkdWxlX3dvcmsoJmRldmljZS0+ZXZlbnRfd29yayk7Cit9CisKKy8qKgorICogaXNodHBfcmVnaXN0ZXJfZXZlbnRfY2IoKSAtIFJlZ2lzdGVyIGNhbGxiYWNrCisgKiBAZGV2aWNlOgljbGllbnQgZGV2aWNlIGluc3RhbmNlCisgKiBAZXZlbnRfY2I6CUV2ZW50IHByb2Nlc3NvciBmb3IgYW4gY2xpZW50CisgKgorICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgZXZlbnRzLCBjYWxsZWQgZnJvbSBjbGllbnQgZHJpdmVyCisgKgorICogUmV0dXJuOiBSZXR1cm4gMCBvciAtRUFMUkVBRFkgaWYgYWxyZWFkeSByZWdpc3RlcmVkCisgKi8KK2ludCBpc2h0cF9yZWdpc3Rlcl9ldmVudF9jYihzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICpkZXZpY2UsCisJdm9pZCAoKmV2ZW50X2NiKShzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICopKQoreworCWlmIChkZXZpY2UtPmV2ZW50X2NiKQorCQlyZXR1cm4gLUVBTFJFQURZOworCisJZGV2aWNlLT5ldmVudF9jYiA9IGV2ZW50X2NiOworCUlOSVRfV09SSygmZGV2aWNlLT5ldmVudF93b3JrLCBpc2h0cF9idXNfZXZlbnRfd29yayk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaXNodHBfcmVnaXN0ZXJfZXZlbnRfY2IpOworCisvKioKKyAqIGlzaHRwX2dldF9kZXZpY2UoKSAtIHVwZGF0ZSB1c2FnZSBjb3VudCBmb3IgdGhlIGRldmljZQorICogQGNsX2RldmljZToJY2xpZW50IGRldmljZSBpbnN0YW5jZQorICoKKyAqIEluY3JlbWVudCB0aGUgdXNhZ2UgY291bnQuIFRoZSBkZXZpY2UgY2FuJ3QgYmUgZGVsZXRlZAorICovCit2b2lkIGlzaHRwX2dldF9kZXZpY2Uoc3RydWN0IGlzaHRwX2NsX2RldmljZSAqY2xfZGV2aWNlKQoreworCWNsX2RldmljZS0+cmVmZXJlbmNlX2NvdW50Kys7Cit9CitFWFBPUlRfU1lNQk9MKGlzaHRwX2dldF9kZXZpY2UpOworCisvKioKKyAqIGlzaHRwX3B1dF9kZXZpY2UoKSAtIGRlY3JlbWVudCB1c2FnZSBjb3VudCBmb3IgdGhlIGRldmljZQorICogQGNsX2RldmljZToJY2xpZW50IGRldmljZSBpbnN0YW5jZQorICoKKyAqIERlY3JlbWVudCB0aGUgdXNhZ2UgY291bnQuIFRoZSBkZXZpY2UgY2FuIGJlIGRlbGV0ZWQgaXMgY291bnQgPSAwCisgKi8KK3ZvaWQgaXNodHBfcHV0X2RldmljZShzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICpjbF9kZXZpY2UpCit7CisJY2xfZGV2aWNlLT5yZWZlcmVuY2VfY291bnQtLTsKK30KK0VYUE9SVF9TWU1CT0woaXNodHBfcHV0X2RldmljZSk7CisKKy8qKgorICogaXNodHBfYnVzX25ld19jbGllbnQoKSAtIENyZWF0ZSBhIG5ldyBjbGllbnQKKyAqIEBkZXY6CUlTSFRQIGRldmljZSBpbnN0YW5jZQorICoKKyAqIE9uY2UgYnVzIHByb3RvY29sIGVudW1lcmF0ZXMgYSBjbGllbnQsIHRoaXMgaXMgY2FsbGVkCisgKiB0byBhZGQgYSBkZXZpY2UgZm9yIHRoZSBjbGllbnQuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBpc2h0cF9idXNfbmV3X2NsaWVudChzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJaW50CWk7CisJY2hhcgkqZGV2X25hbWU7CisJc3RydWN0IGlzaHRwX2NsX2RldmljZQkqY2xfZGV2aWNlOworCXV1aWRfbGUJZGV2aWNlX3V1aWQ7CisKKwkvKgorCSAqIEZvciBhbGwgcmVwb3J0ZWQgY2xpZW50cywgY3JlYXRlIGFuIHVuY29ubmVjdGVkIGNsaWVudCBhbmQgYWRkIGl0cworCSAqIGRldmljZSB0byBJU0hUUCBidXMuCisJICogSWYgYXBwcm9wcmlhdGUgZHJpdmVyIGhhcyBsb2FkZWQsIHRoaXMgd2lsbCB0cmlnZ2VyIGl0cyBwcm9iZSgpLgorCSAqIE90aGVyd2lzZSwgcHJvYmUoKSB3aWxsIGJlIGNhbGxlZCB3aGVuIGRyaXZlciBpcyBsb2FkZWQKKwkgKi8KKwlpID0gZGV2LT5md19jbGllbnRfcHJlc2VudGF0aW9uX251bSAtIDE7CisJZGV2aWNlX3V1aWQgPSBkZXYtPmZ3X2NsaWVudHNbaV0ucHJvcHMucHJvdG9jb2xfbmFtZTsKKwlkZXZfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAorCQkieyUwMlglMDJYJTAyWCUwMlgtJTAyWCUwMlgtJTAyWCUwMlgtJTAyWCUwMlgtJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYfSIsCisJCWRldmljZV91dWlkLmJbM10sIGRldmljZV91dWlkLmJbMl0sIGRldmljZV91dWlkLmJbMV0sCisJCWRldmljZV91dWlkLmJbMF0sIGRldmljZV91dWlkLmJbNV0sIGRldmljZV91dWlkLmJbNF0sCisJCWRldmljZV91dWlkLmJbN10sIGRldmljZV91dWlkLmJbNl0sIGRldmljZV91dWlkLmJbOF0sCisJCWRldmljZV91dWlkLmJbOV0sIGRldmljZV91dWlkLmJbMTBdLCBkZXZpY2VfdXVpZC5iWzExXSwKKwkJZGV2aWNlX3V1aWQuYlsxMl0sIGRldmljZV91dWlkLmJbMTNdLCBkZXZpY2VfdXVpZC5iWzE0XSwKKwkJZGV2aWNlX3V1aWQuYlsxNV0pOworCWlmICghZGV2X25hbWUpCisJCXJldHVybgktRU5PTUVNOworCisJY2xfZGV2aWNlID0gaXNodHBfYnVzX2FkZF9kZXZpY2UoZGV2LCBkZXZpY2VfdXVpZCwgZGV2X25hbWUpOworCWlmICghY2xfZGV2aWNlKSB7CisJCWtmcmVlKGRldl9uYW1lKTsKKwkJcmV0dXJuCS1FTk9FTlQ7CisJfQorCisJa2ZyZWUoZGV2X25hbWUpOworCisJcmV0dXJuCTA7Cit9CisKKy8qKgorICogaXNodHBfY2xfZGV2aWNlX2JpbmQoKSAtIGJpbmQgYSBkZXZpY2UKKyAqIEBjbDoJCWlzaHRwIGNsaWVudCBkZXZpY2UKKyAqCisgKiBCaW5kcyBjb25uZWN0ZWQgaXNodHBfY2wgdG8gSVNIVFAgYnVzIGRldmljZQorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIGZhdWx0IGNvZGUKKyAqLworaW50IGlzaHRwX2NsX2RldmljZV9iaW5kKHN0cnVjdCBpc2h0cF9jbCAqY2wpCit7CisJc3RydWN0IGlzaHRwX2NsX2RldmljZQkqY2xfZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50CXJ2OworCisJaWYgKCFjbC0+ZndfY2xpZW50X2lkIHx8IGNsLT5zdGF0ZSAhPSBJU0hUUF9DTF9DT05ORUNURUQpCisJCXJldHVybgktRUZBVUxUOworCisJcnYgPSAtRU5PRU5UOworCXNwaW5fbG9ja19pcnFzYXZlKCZjbC0+ZGV2LT5kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbF9kZXZpY2UsICZjbC0+ZGV2LT5kZXZpY2VfbGlzdCwKKwkJCWRldmljZV9saW5rKSB7CisJCWlmIChjbF9kZXZpY2UtPmZ3X2NsaWVudC0+Y2xpZW50X2lkID09IGNsLT5md19jbGllbnRfaWQpIHsKKwkJCWNsLT5kZXZpY2UgPSBjbF9kZXZpY2U7CisJCQlydiA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbC0+ZGV2LT5kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuCXJ2OworfQorCisvKioKKyAqIGlzaHRwX2J1c19yZW1vdmVfYWxsX2NsaWVudHMoKSAtIFJlbW92ZSBhbGwgY2xpZW50cworICogQGlzaHRwX2RldjoJCWlzaHRwIGRldmljZQorICogQHdhcm1fcmVzZXQ6CQlSZXNldCBkdWUgdG8gRlcgcmVzZXQgZHVyZSB0byBlcnJvcnMgb3IgUzMgc3VzcGVuZAorICoKKyAqIFRoaXMgaXMgcGFydCBvZiByZXNldC9yZW1vdmUgZmxvdy4gVGhpcyBmdW5jdGlvbiB0aGUgbWFpbiBwcm9jZXNzaW5nCisgKiBvbmx5IHRhcmdldHMgZXJyb3IgcHJvY2Vzc2luZywgaWYgdGhlIEZXIGhhcyBmb3JjZWQgcmVzZXQgb3IKKyAqIGVycm9yIHRvIHJlbW92ZSBjb25uZWN0ZWQgY2xpZW50cy4gV2hlbiB3YXJtIHJlc2V0IHRoZSBjbGllbnQgZGV2aWNlcyBhcmUKKyAqIG5vdCByZW1vdmVkLgorICovCit2b2lkIGlzaHRwX2J1c19yZW1vdmVfYWxsX2NsaWVudHMoc3RydWN0IGlzaHRwX2RldmljZSAqaXNodHBfZGV2LAorCQkJCSAgYm9vbCB3YXJtX3Jlc2V0KQoreworCXN0cnVjdCBpc2h0cF9jbF9kZXZpY2UJKmNsX2RldmljZSwgKm47CisJc3RydWN0IGlzaHRwX2NsCSpjbDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzaHRwX2Rldi0+Y2xfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmlzaHRwX2Rldi0+Y2xfbGlzdCwgbGluaykgeworCQljbC0+c3RhdGUgPSBJU0hUUF9DTF9ESVNDT05ORUNURUQ7CisKKwkJLyoKKwkJICogV2FrZSBhbnkgcGVuZGluZyBwcm9jZXNzLiBUaGUgd2FpdGVyIHdvdWxkIGNoZWNrIGRldi0+c3RhdGUKKwkJICogYW5kIGRldGVybWluZSB0aGF0IGl0J3Mgbm90IGVuYWJsZWQgYWxyZWFkeSwKKwkJICogYW5kIHdpbGwgcmV0dXJuIGVycm9yIHRvIGl0cyBjYWxsZXIKKwkJICovCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2wtPndhaXRfY3RybF9yZXMpOworCisJCS8qIERpc2JhbmQgYW55IHBlbmRpbmcgcmVhZC93cml0ZSByZXF1ZXN0cyBhbmQgZnJlZSByYiAqLworCQlpc2h0cF9jbF9mbHVzaF9xdWV1ZXMoY2wpOworCisJCS8qIFJlbW92ZSBhbGwgZnJlZSBhbmQgaW5fcHJvY2VzcyByaW5ncywgYm90aCBSeCBhbmQgVHggKi8KKwkJaXNodHBfY2xfZnJlZV9yeF9yaW5nKGNsKTsKKwkJaXNodHBfY2xfZnJlZV90eF9yaW5nKGNsKTsKKworCQkvKgorCQkgKiBGcmVlIGNsaWVudCBhbmQgSVNIVFAgYnVzIGNsaWVudCBkZXZpY2Ugc3RydWN0dXJlcworCQkgKiBkb24ndCBmcmVlIGhvc3QgY2xpZW50IGJlY2F1c2UgaXQgaXMgcGFydCBvZiB0aGUgT1MgZmQKKwkJICogc3RydWN0dXJlCisJCSAqLworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2h0cF9kZXYtPmNsX2xpc3RfbG9jaywgZmxhZ3MpOworCisJLyogUmVsZWFzZSBETUEgYnVmZmVycyBmb3IgY2xpZW50IG1lc3NhZ2VzICovCisJaXNodHBfY2xfZnJlZV9kbWFfYnVmKGlzaHRwX2Rldik7CisKKwkvKiByZW1vdmUgYnVzIGNsaWVudHMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXNodHBfZGV2LT5kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsX2RldmljZSwgbiwgJmlzaHRwX2Rldi0+ZGV2aWNlX2xpc3QsCisJCQkJIGRldmljZV9saW5rKSB7CisJCWlmICh3YXJtX3Jlc2V0ICYmIGNsX2RldmljZS0+cmVmZXJlbmNlX2NvdW50KQorCQkJY29udGludWU7CisKKwkJbGlzdF9kZWwoJmNsX2RldmljZS0+ZGV2aWNlX2xpbmspOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2h0cF9kZXYtPmRldmljZV9saXN0X2xvY2ssIGZsYWdzKTsKKwkJaXNodHBfYnVzX3JlbW92ZV9kZXZpY2UoY2xfZGV2aWNlKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlzaHRwX2Rldi0+ZGV2aWNlX2xpc3RfbG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpc2h0cF9kZXYtPmRldmljZV9saXN0X2xvY2ssIGZsYWdzKTsKKworCS8qIEZyZWUgYWxsIGNsaWVudCBzdHJ1Y3R1cmVzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzaHRwX2Rldi0+ZndfY2xpZW50c19sb2NrLCBmbGFncyk7CisJa2ZyZWUoaXNodHBfZGV2LT5md19jbGllbnRzKTsKKwlpc2h0cF9kZXYtPmZ3X2NsaWVudHMgPSBOVUxMOworCWlzaHRwX2Rldi0+ZndfY2xpZW50c19udW0gPSAwOworCWlzaHRwX2Rldi0+ZndfY2xpZW50X3ByZXNlbnRhdGlvbl9udW0gPSAwOworCWlzaHRwX2Rldi0+ZndfY2xpZW50X2luZGV4ID0gMDsKKwliaXRtYXBfemVybyhpc2h0cF9kZXYtPmZ3X2NsaWVudHNfbWFwLCBJU0hUUF9DTElFTlRTX01BWCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXNodHBfZGV2LT5md19jbGllbnRzX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woaXNodHBfYnVzX3JlbW92ZV9hbGxfY2xpZW50cyk7CisKKy8qKgorICogaXNodHBfcmVzZXRfaGFuZGxlcigpIC0gSVBDIHJlc2V0IGhhbmRsZXIKKyAqIEBkZXY6CWlzaHRwIGRldmljZQorICoKKyAqIElTSFRQIEhhbmRsZXIgZm9yIElQQ19SRVNFVCBub3RpZmljYXRpb24KKyAqLwordm9pZCBpc2h0cF9yZXNldF9oYW5kbGVyKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJLyogSGFuZGxlIEZXLWluaXRpYXRlZCByZXNldCAqLworCWRldi0+ZGV2X3N0YXRlID0gSVNIVFBfREVWX1JFU0VUVElORzsKKworCS8qIENsZWFyIEJIIHByb2Nlc3NpbmcgcXVldWUgLSBubyBmdXJ0aGVyIEhCTXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5yZF9tc2dfc3BpbmxvY2ssIGZsYWdzKTsKKwlkZXYtPnJkX21zZ19maWZvX2hlYWQgPSBkZXYtPnJkX21zZ19maWZvX3RhaWwgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmRfbXNnX3NwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBIYW5kbGUgSVNIIEZXIHJlc2V0IGFnYWluc3QgdXBwZXIgbGF5ZXJzICovCisJaXNodHBfYnVzX3JlbW92ZV9hbGxfY2xpZW50cyhkZXYsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTChpc2h0cF9yZXNldF9oYW5kbGVyKTsKKworLyoqCisgKiBpc2h0cF9yZXNldF9jb21wbF9oYW5kbGVyKCkgLSBSZXNldCBjb21wbGV0aW9uIGhhbmRsZXIKKyAqIEBkZXY6CWlzaHRwIGRldmljZQorICoKKyAqIElTSFRQIGhhbmRsZXIgZm9yIElQQ19SRVNFVCBzZXF1ZW5jZSBjb21wbGV0aW9uIHRvIHN0YXJ0CisgKiBob3N0IG1lc3NhZ2UgYnVzIHN0YXJ0IHByb3RvY29sIHNlcXVlbmNlLgorICovCit2b2lkIGlzaHRwX3Jlc2V0X2NvbXBsX2hhbmRsZXIoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCWRldi0+ZGV2X3N0YXRlID0gSVNIVFBfREVWX0lOSVRfQ0xJRU5UUzsKKwlkZXYtPmhibV9zdGF0ZSA9IElTSFRQX0hCTV9TVEFSVDsKKwlpc2h0cF9oYm1fc3RhcnRfcmVxKGRldik7Cit9CitFWFBPUlRfU1lNQk9MKGlzaHRwX3Jlc2V0X2NvbXBsX2hhbmRsZXIpOworCisvKioKKyAqIGlzaHRwX3VzZV9kbWFfdHJhbnNmZXIoKSAtIEZ1bmN0aW9uIHRvIHVzZSBETUEKKyAqCisgKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGVuYWJsZSB1c2FnZSBvZiBETUEKKyAqCisgKiBSZXR1cm4gbm9uIHplcm8gaWYgRE1BIGNhbiBiZSBlbmFibGVkCisgKi8KK2ludCBpc2h0cF91c2VfZG1hX3RyYW5zZmVyKHZvaWQpCit7CisJcmV0dXJuIGlzaHRwX3VzZV9kbWE7Cit9CisKKy8qKgorICogaXNodHBfYnVzX3JlZ2lzdGVyKCkgLSBGdW5jdGlvbiB0byByZWdpc3RlciBidXMKKyAqCisgKiBUaGlzIHJlZ2lzdGVyIGlzaHRwIGJ1cworICoKKyAqIFJldHVybjogUmV0dXJuIG91dHB1dCBvZiBidXNfcmVnaXN0ZXIKKyAqLworc3RhdGljIGludCAgX19pbml0IGlzaHRwX2J1c19yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiBidXNfcmVnaXN0ZXIoJmlzaHRwX2NsX2J1c190eXBlKTsKK30KKworLyoqCisgKiBpc2h0cF9idXNfdW5yZWdpc3RlcigpIC0gRnVuY3Rpb24gdG8gdW5yZWdpc3RlciBidXMKKyAqCisgKiBUaGlzIHVucmVnaXN0ZXIgaXNodHAgYnVzCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBpc2h0cF9idXNfdW5yZWdpc3Rlcih2b2lkKQoreworCWJ1c191bnJlZ2lzdGVyKCZpc2h0cF9jbF9idXNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGlzaHRwX2J1c19yZWdpc3Rlcik7Cittb2R1bGVfZXhpdChpc2h0cF9idXNfdW5yZWdpc3Rlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAvYnVzLmggYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwL2J1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZmZhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwL2J1cy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogSVNIVFAgYnVzIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9MSU5VWF9JU0hUUF9DTF9CVVNfSAorI2RlZmluZSBfTElOVVhfSVNIVFBfQ0xfQlVTX0gKKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorCitzdHJ1Y3QgaXNodHBfY2w7CitzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlOworc3RydWN0IGlzaHRwX2RldmljZTsKK3N0cnVjdCBpc2h0cF9tc2dfaGRyOworCisvKioKKyAqIHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UgLSBJU0hUUCBkZXZpY2UgaGFuZGxlCisgKiBAZGV2OglkZXZpY2UgcG9pbnRlcgorICogQGlzaHRwX2RldjoJcG9pbnRlciB0byBpc2h0cCBkZXZpY2Ugc3RydWN0dXJlIHRvIHByaW1hcmlseSB0byBhY2Nlc3MKKyAqCQlodyBkZXZpY2Ugb3BlcmF0aW9uIGNhbGxiYWNrcyBhbmQgcHJvcGVydGllcworICogQGZ3X2NsaWVudDoJZndfY2xpZW50IHBvaW50ZXIgdG8gZ2V0IGZ3IGluZm9ybWF0aW9uIGxpa2UgcHJvdG9jb2wgbmFtZQorICoJCW1heCBtZXNzYWdlIGxlbmd0aCBldGMuCisgKiBAZGV2aWNlX2xpbms6IExpbmsgdG8gbmV4dCBjbGllbnQgaW4gdGhlIGxpc3Qgb24gYSBidXMKKyAqIEBldmVudF93b3JrOglVc2VkIHRvIHNjaGVkdWxlIHJ4IGV2ZW50IGZvciBjbGllbnQKKyAqIEBkcml2ZXJfZGF0YTogU3RvcmFnZSBkcml2ZXIgcHJpdmF0ZSBkYXRhCisgKiBAcmVmZXJlbmNlX2NvdW50OglVc2VkIGZvciBnZXQvcHV0IGRldmljZQorICogQGV2ZW50X2NiOglDYWxsYmFjayB0byBkcml2ZXIgdG8gc2VuZCBldmVudHMKKyAqCisgKiBBbiBpc2h0cF9jbF9kZXZpY2UgcG9pbnRlciBpcyByZXR1cm5lZCBmcm9tIGlzaHRwX2FkZF9kZXZpY2UoKQorICogYW5kIGxpbmtzIElTSFRQIGJ1cyBjbGllbnRzIHRvIHRoZWlyIGFjdHVhbCBob3N0IGNsaWVudCBwb2ludGVyLgorICogRHJpdmVycyBmb3IgSVNIVFAgZGV2aWNlcyB3aWxsIGdldCBhbiBpc2h0cF9jbF9kZXZpY2UgcG9pbnRlcgorICogd2hlbiBiZWluZyBwcm9iZWQgYW5kIHNoYWxsIHVzZSBpdCBmb3IgZG9pbmcgYnVzIEkvTy4KKyAqLworc3RydWN0IGlzaHRwX2NsX2RldmljZSB7CisJc3RydWN0IGRldmljZQkJZGV2OworCXN0cnVjdCBpc2h0cF9kZXZpY2UJKmlzaHRwX2RldjsKKwlzdHJ1Y3QgaXNodHBfZndfY2xpZW50CSpmd19jbGllbnQ7CisJc3RydWN0IGxpc3RfaGVhZAlkZXZpY2VfbGluazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJZXZlbnRfd29yazsKKwl2b2lkCQkJKmRyaXZlcl9kYXRhOworCWludAkJCXJlZmVyZW5jZV9jb3VudDsKKwl2b2lkICgqZXZlbnRfY2IpKHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UgKmRldmljZSk7Cit9OworCisvKioKKyAqIHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UgLSBJU0hUUCBkZXZpY2UgaGFuZGxlCisgKiBAZHJpdmVyOglkcml2ZXIgaW5zdGFuY2Ugb24gYSBidXMKKyAqIEBuYW1lOglOYW1lIG9mIHRoZSBkZXZpY2UgZm9yIHByb2JlCisgKiBAcHJvYmU6CWRyaXZlciBjYWxsYmFjayBmb3IgZGV2aWNlIHByb2JlCisgKiBAcmVtb3ZlOglkcml2ZXIgY2FsbGJhY2sgb24gZGV2aWNlIHJlbW92YWwKKyAqCisgKiBDbGllbnQgZHJpdmVycyBkZWZpbmVzIHRvIGdldCBwcm9iZWQvcmVtb3ZlZCBmb3IgSVNIVFAgY2xpZW50IGRldmljZS4KKyAqLworc3RydWN0IGlzaHRwX2NsX2RyaXZlciB7CisJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqcHJvYmUpKHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UgKmRldik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICpkZXYpOworCWludCAoKnJlc2V0KShzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICpkZXYpOworCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbTsKK307CisKKworaW50CWlzaHRwX2J1c19uZXdfY2xpZW50KHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldik7Cit2b2lkCWlzaHRwX3JlbW92ZV9hbGxfY2xpZW50cyhzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpOworaW50CWlzaHRwX2NsX2RldmljZV9iaW5kKHN0cnVjdCBpc2h0cF9jbCAqY2wpOwordm9pZAlpc2h0cF9jbF9idXNfcnhfZXZlbnQoc3RydWN0IGlzaHRwX2NsX2RldmljZSAqZGV2aWNlKTsKKworLyogV3JpdGUgYSBtdWx0aS1mcmFnbWVudCBtZXNzYWdlICovCitpbnQJaXNodHBfc2VuZF9tc2coc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGlzaHRwX21zZ19oZHIgKmhkciwgdm9pZCAqbXNnLAorCQkgICAgICAgdm9pZCAoKmlwY19zZW5kX2NvbXBsKSh2b2lkICopLAorCQkgICAgICAgdm9pZCAqaXBjX3NlbmRfY29tcGxfcHJtKTsKKworLyogV3JpdGUgYSBzaW5nbGUtZnJhZ21lbnQgbWVzc2FnZSAqLworaW50CWlzaHRwX3dyaXRlX21lc3NhZ2Uoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpc2h0cF9tc2dfaGRyICpoZHIsCisJCQkgICAgdW5zaWduZWQgY2hhciAqYnVmKTsKKworLyogVXNlIERNQSB0byBzZW5kL3JlY2VpdmUgbWVzc2FnZXMgKi8KK2ludCBpc2h0cF91c2VfZG1hX3RyYW5zZmVyKHZvaWQpOworCisvKiBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KK3ZvaWQJaXNodHBfYnVzX3JlbW92ZV9hbGxfY2xpZW50cyhzdHJ1Y3QgaXNodHBfZGV2aWNlICppc2h0cF9kZXYsCisJCQkJICAgICBib29sIHdhcm1fcmVzZXQpOworCit2b2lkCWlzaHRwX3JlY3Yoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KTsKK3ZvaWQJaXNodHBfcmVzZXRfaGFuZGxlcihzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpOwordm9pZAlpc2h0cF9yZXNldF9jb21wbF9oYW5kbGVyKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldik7CisKK3ZvaWQJaXNodHBfcHV0X2RldmljZShzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICopOwordm9pZAlpc2h0cF9nZXRfZGV2aWNlKHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UgKik7CisKK2ludAlfX2lzaHRwX2NsX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgaXNodHBfY2xfZHJpdmVyICpkcml2ZXIsCisJCQkJICAgc3RydWN0IG1vZHVsZSAqb3duZXIpOworI2RlZmluZSBpc2h0cF9jbF9kcml2ZXJfcmVnaXN0ZXIoZHJpdmVyKQkJXAorCV9faXNodHBfY2xfZHJpdmVyX3JlZ2lzdGVyKGRyaXZlciwgVEhJU19NT0RVTEUpCit2b2lkCWlzaHRwX2NsX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBpc2h0cF9jbF9kcml2ZXIgKmRyaXZlcik7CisKK2ludAlpc2h0cF9yZWdpc3Rlcl9ldmVudF9jYihzdHJ1Y3QgaXNodHBfY2xfZGV2aWNlICpkZXZpY2UsCisJCQkJdm9pZCAoKnJlYWRfY2IpKHN0cnVjdCBpc2h0cF9jbF9kZXZpY2UgKikpOworaW50CWlzaHRwX2Z3X2NsX2J5X3V1aWQoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LCBjb25zdCB1dWlkX2xlICpjdXVpZCk7CisKKyNlbmRpZiAvKiBfTElOVVhfSVNIVFBfQ0xfQlVTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAvY2xpZW50LWJ1ZmZlcnMuYyBiL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAvY2xpZW50LWJ1ZmZlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWI5MTdkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC9jbGllbnQtYnVmZmVycy5jCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogSVNIVFAgUmluZyBCdWZmZXJzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImNsaWVudC5oIgorCisvKioKKyAqIGlzaHRwX2NsX2FsbG9jX3J4X3JpbmcoKSAtIEFsbG9jYXRlIFJYIHJpbmcgYnVmZmVycworICogQGNsOiBjbGllbnQgZGV2aWNlIGluc3RhbmNlCisgKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgUlggcmluZyBidWZmZXJzCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgZWxzZSAtRU5PTUVNCisgKi8KK2ludCBpc2h0cF9jbF9hbGxvY19yeF9yaW5nKHN0cnVjdCBpc2h0cF9jbCAqY2wpCit7CisJc2l6ZV90CWxlbiA9IGNsLT5kZXZpY2UtPmZ3X2NsaWVudC0+cHJvcHMubWF4X21zZ19sZW5ndGg7CisJaW50CWo7CisJc3RydWN0IGlzaHRwX2NsX3JiICpyYjsKKwlpbnQJcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJZm9yIChqID0gMDsgaiA8IGNsLT5yeF9yaW5nX3NpemU7ICsraikgeworCQlyYiA9IGlzaHRwX2lvX3JiX2luaXQoY2wpOworCQlpZiAoIXJiKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmV0ID0gaXNodHBfaW9fcmJfYWxsb2NfYnVmKHJiLCBsZW4pOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbC0+ZnJlZV9saXN0X3NwaW5sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJnJiLT5saXN0LCAmY2wtPmZyZWVfcmJfbGlzdC5saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPmZyZWVfbGlzdF9zcGlubG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybgkwOworCitvdXQ6CisJZGV2X2VycigmY2wtPmRldmljZS0+ZGV2LCAiZXJyb3IgaW4gYWxsb2NhdGluZyBSeCBidWZmZXJzXG4iKTsKKwlpc2h0cF9jbF9mcmVlX3J4X3JpbmcoY2wpOworCXJldHVybglyZXQ7Cit9CisKKy8qKgorICogaXNodHBfY2xfYWxsb2NfdHhfcmluZygpIC0gQWxsb2NhdGUgVFggcmluZyBidWZmZXJzCisgKiBAY2w6IGNsaWVudCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBUWCByaW5nIGJ1ZmZlcnMKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBlbHNlIC1FTk9NRU0KKyAqLworaW50IGlzaHRwX2NsX2FsbG9jX3R4X3Jpbmcoc3RydWN0IGlzaHRwX2NsICpjbCkKK3sKKwlzaXplX3QJbGVuID0gY2wtPmRldmljZS0+ZndfY2xpZW50LT5wcm9wcy5tYXhfbXNnX2xlbmd0aDsKKwlpbnQJajsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJLyogQWxsb2NhdGUgcG9vbCB0byBmcmVlIFR4IGJ1ZnMgKi8KKwlmb3IgKGogPSAwOyBqIDwgY2wtPnR4X3Jpbmdfc2l6ZTsgKytqKSB7CisJCXN0cnVjdCBpc2h0cF9jbF90eF9yaW5nCSp0eF9idWY7CisKKwkJdHhfYnVmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlzaHRwX2NsX3R4X3JpbmcpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0eF9idWYpCisJCQlnb3RvCW91dDsKKworCQl0eF9idWYtPnNlbmRfYnVmLmRhdGEgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghdHhfYnVmLT5zZW5kX2J1Zi5kYXRhKSB7CisJCQlrZnJlZSh0eF9idWYpOworCQkJZ290bwlvdXQ7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2wtPnR4X2ZyZWVfbGlzdF9zcGlubG9jaywgZmxhZ3MpOworCQlsaXN0X2FkZF90YWlsKCZ0eF9idWYtPmxpc3QsICZjbC0+dHhfZnJlZV9saXN0Lmxpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbC0+dHhfZnJlZV9saXN0X3NwaW5sb2NrLCBmbGFncyk7CisJfQorCXJldHVybgkwOworb3V0OgorCWRldl9lcnIoJmNsLT5kZXZpY2UtPmRldiwgImVycm9yIGluIGFsbG9jYXRpbmcgVHggcG9vbFxuIik7CisJaXNodHBfY2xfZnJlZV9yeF9yaW5nKGNsKTsKKwlyZXR1cm4JLUVOT01FTTsKK30KKworLyoqCisgKiBpc2h0cF9jbF9mcmVlX3J4X3JpbmcoKSAtIEZyZWUgUlggcmluZyBidWZmZXJzCisgKiBAY2w6IGNsaWVudCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBGcmVlIFJYIHJpbmcgYnVmZmVycworICovCit2b2lkIGlzaHRwX2NsX2ZyZWVfcnhfcmluZyhzdHJ1Y3QgaXNodHBfY2wgKmNsKQoreworCXN0cnVjdCBpc2h0cF9jbF9yYiAqcmI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCS8qIHJlbGVhc2UgYWxsb2NhdGVkIG1lbW9yeSAtIHBhc3Mgb3ZlciBmcmVlX3JiX2xpc3QgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2wtPmZyZWVfbGlzdF9zcGlubG9jaywgZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmY2wtPmZyZWVfcmJfbGlzdC5saXN0KSkgeworCQlyYiA9IGxpc3RfZW50cnkoY2wtPmZyZWVfcmJfbGlzdC5saXN0Lm5leHQsIHN0cnVjdCBpc2h0cF9jbF9yYiwKKwkJCQlsaXN0KTsKKwkJbGlzdF9kZWwoJnJiLT5saXN0KTsKKwkJa2ZyZWUocmItPmJ1ZmZlci5kYXRhKTsKKwkJa2ZyZWUocmIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbC0+ZnJlZV9saXN0X3NwaW5sb2NrLCBmbGFncyk7CisJLyogcmVsZWFzZSBhbGxvY2F0ZWQgbWVtb3J5IC0gcGFzcyBvdmVyIGluX3Byb2Nlc3NfbGlzdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjbC0+aW5fcHJvY2Vzc19zcGlubG9jaywgZmxhZ3MpOworCXdoaWxlICghbGlzdF9lbXB0eSgmY2wtPmluX3Byb2Nlc3NfbGlzdC5saXN0KSkgeworCQlyYiA9IGxpc3RfZW50cnkoY2wtPmluX3Byb2Nlc3NfbGlzdC5saXN0Lm5leHQsCisJCQkJc3RydWN0IGlzaHRwX2NsX3JiLCBsaXN0KTsKKwkJbGlzdF9kZWwoJnJiLT5saXN0KTsKKwkJa2ZyZWUocmItPmJ1ZmZlci5kYXRhKTsKKwkJa2ZyZWUocmIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbC0+aW5fcHJvY2Vzc19zcGlubG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGlzaHRwX2NsX2ZyZWVfdHhfcmluZygpIC0gRnJlZSBUWCByaW5nIGJ1ZmZlcnMKKyAqIEBjbDogY2xpZW50IGRldmljZSBpbnN0YW5jZQorICoKKyAqIEZyZWUgVFggcmluZyBidWZmZXJzCisgKi8KK3ZvaWQgaXNodHBfY2xfZnJlZV90eF9yaW5nKHN0cnVjdCBpc2h0cF9jbCAqY2wpCit7CisJc3RydWN0IGlzaHRwX2NsX3R4X3JpbmcJKnR4X2J1ZjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsLT50eF9mcmVlX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKKwkvKiByZWxlYXNlIGFsbG9jYXRlZCBtZW1vcnkgLSBwYXNzIG92ZXIgdHhfZnJlZV9saXN0ICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjbC0+dHhfZnJlZV9saXN0Lmxpc3QpKSB7CisJCXR4X2J1ZiA9IGxpc3RfZW50cnkoY2wtPnR4X2ZyZWVfbGlzdC5saXN0Lm5leHQsCisJCQkJICAgIHN0cnVjdCBpc2h0cF9jbF90eF9yaW5nLCBsaXN0KTsKKwkJbGlzdF9kZWwoJnR4X2J1Zi0+bGlzdCk7CisJCWtmcmVlKHR4X2J1Zi0+c2VuZF9idWYuZGF0YSk7CisJCWtmcmVlKHR4X2J1Zik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsLT50eF9mcmVlX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjbC0+dHhfbGlzdF9zcGlubG9jaywgZmxhZ3MpOworCS8qIHJlbGVhc2UgYWxsb2NhdGVkIG1lbW9yeSAtIHBhc3Mgb3ZlciB0eF9saXN0ICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjbC0+dHhfbGlzdC5saXN0KSkgeworCQl0eF9idWYgPSBsaXN0X2VudHJ5KGNsLT50eF9saXN0Lmxpc3QubmV4dCwKKwkJCQkgICAgc3RydWN0IGlzaHRwX2NsX3R4X3JpbmcsIGxpc3QpOworCQlsaXN0X2RlbCgmdHhfYnVmLT5saXN0KTsKKwkJa2ZyZWUodHhfYnVmLT5zZW5kX2J1Zi5kYXRhKTsKKwkJa2ZyZWUodHhfYnVmKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPnR4X2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBpc2h0cF9pb19yYl9mcmVlKCkgLSBGcmVlIElPIHJlcXVlc3QgYmxvY2sKKyAqIEByYjogSU8gcmVxdWVzdCBibG9jaworICoKKyAqIEZyZWUgaW8gcmVxdWVzdCBibG9jayBtZW1vcnkKKyAqLwordm9pZCBpc2h0cF9pb19yYl9mcmVlKHN0cnVjdCBpc2h0cF9jbF9yYiAqcmIpCit7CisJaWYgKHJiID09IE5VTEwpCisJCXJldHVybjsKKworCWtmcmVlKHJiLT5idWZmZXIuZGF0YSk7CisJa2ZyZWUocmIpOworfQorCisvKioKKyAqIGlzaHRwX2lvX3JiX2luaXQoKSAtIEFsbG9jYXRlIGFuZCBpbml0IElPIHJlcXVlc3QgYmxvY2sKKyAqIEBjbDogY2xpZW50IGRldmljZSBpbnN0YW5jZQorICoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHJlcXVlc3QgYmxvY2sKKyAqCisgKiBSZXR1cm46IEFsbG9jdGVkIElPIHJlcXVlc3QgYmxvY2sgcG9pbnRlcgorICovCitzdHJ1Y3QgaXNodHBfY2xfcmIgKmlzaHRwX2lvX3JiX2luaXQoc3RydWN0IGlzaHRwX2NsICpjbCkKK3sKKwlzdHJ1Y3QgaXNodHBfY2xfcmIgKnJiOworCisJcmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXNodHBfY2xfcmIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJiKQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTElTVF9IRUFEKCZyYi0+bGlzdCk7CisJcmItPmNsID0gY2w7CisJcmItPmJ1Zl9pZHggPSAwOworCXJldHVybiByYjsKK30KKworLyoqCisgKiBpc2h0cF9pb19yYl9hbGxvY19idWYoKSAtIEFsbG9jYXRlIGFuZCBpbml0IHJlc3BvbnNlIGJ1ZmZlcgorICogQHJiOiBJTyByZXF1ZXN0IGJsb2NrCisgKiBAbGVuZ3RoOiBsZW5ndGggb2YgcmVzcG9uc2UgYnVmZmVyCisgKgorICogQWxsb2NhdGUgcmVzcG9zZSBidWZmZXIKKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBlbHNlIC1FTk9NRU0KKyAqLworaW50IGlzaHRwX2lvX3JiX2FsbG9jX2J1ZihzdHJ1Y3QgaXNodHBfY2xfcmIgKnJiLCBzaXplX3QgbGVuZ3RoKQoreworCWlmICghcmIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxlbmd0aCA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJiLT5idWZmZXIuZGF0YSA9IGttYWxsb2MobGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJiLT5idWZmZXIuZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyYi0+YnVmZmVyLnNpemUgPSBsZW5ndGg7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXNodHBfY2xfaW9fcmJfcmVjeWNsZSgpIC0gUmVjeWNsZSBJTyByZXF1ZXN0IGJsb2NrcworICogQHJiOiBJTyByZXF1ZXN0IGJsb2NrCisgKgorICogUmUtYXBwZW5kIHJiIHRvIGl0cyBjbGllbnQncyBmcmVlIGxpc3QgYW5kIHNlbmQgZmxvdyBjb250cm9sIGlmIG5lZWRlZAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIGVsc2UgLUVGQVVMVAorICovCitpbnQgaXNodHBfY2xfaW9fcmJfcmVjeWNsZShzdHJ1Y3QgaXNodHBfY2xfcmIgKnJiKQoreworCXN0cnVjdCBpc2h0cF9jbCAqY2w7CisJaW50CXJldHMgPSAwOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoIXJiIHx8ICFyYi0+Y2wpCisJCXJldHVybgktRUZBVUxUOworCisJY2wgPSByYi0+Y2w7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsLT5mcmVlX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZyYi0+bGlzdCwgJmNsLT5mcmVlX3JiX2xpc3QubGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPmZyZWVfbGlzdF9zcGlubG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBJZiB3ZSByZXR1cm5lZCB0aGUgZmlyc3QgYnVmZmVyIHRvIGVtcHR5ICdmcmVlJyBsaXN0LAorCSAqIHNlbmQgZmxvdyBjb250cm9sCisJICovCisJaWYgKCFjbC0+b3V0X2Zsb3dfY3RybF9jcmVkcykKKwkJcmV0cyA9IGlzaHRwX2NsX3JlYWRfc3RhcnQoY2wpOworCisJcmV0dXJuCXJldHM7Cit9CitFWFBPUlRfU1lNQk9MKGlzaHRwX2NsX2lvX3JiX3JlY3ljbGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC9jbGllbnQuYyBiL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAvY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkNjEzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAvY2xpZW50LmMKQEAgLTAsMCArMSwxMDU0IEBACisvKgorICogSVNIVFAgY2xpZW50IGxvZ2ljCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlICJoYm0uaCIKKyNpbmNsdWRlICJjbGllbnQuaCIKKworLyoqCisgKiBpc2h0cF9yZWFkX2xpc3RfZmx1c2goKSAtIEZsdXNoIHJlYWQgcXVldWUKKyAqIEBjbDogaXNodHAgY2xpZW50IGluc3RhbmNlCisgKgorICogVXNlZCB0byByZW1vdmUgYWxsIGVudHJpZXMgZnJvbSByZWFkIHF1ZXVlIGZvciBhIGNsaWVudAorICovCitzdGF0aWMgdm9pZCBpc2h0cF9yZWFkX2xpc3RfZmx1c2goc3RydWN0IGlzaHRwX2NsICpjbCkKK3sKKwlzdHJ1Y3QgaXNodHBfY2xfcmIgKnJiOworCXN0cnVjdCBpc2h0cF9jbF9yYiAqbmV4dDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsLT5kZXYtPnJlYWRfbGlzdF9zcGlubG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyYiwgbmV4dCwgJmNsLT5kZXYtPnJlYWRfbGlzdC5saXN0LCBsaXN0KQorCQlpZiAocmItPmNsICYmIGlzaHRwX2NsX2NtcF9pZChjbCwgcmItPmNsKSkgeworCQkJbGlzdF9kZWwoJnJiLT5saXN0KTsKKwkJCWlzaHRwX2lvX3JiX2ZyZWUocmIpOworCQl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPmRldi0+cmVhZF9saXN0X3NwaW5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogaXNodHBfY2xfZmx1c2hfcXVldWVzKCkgLSBGbHVzaCBhbGwgcXVldWVzIGZvciBhIGNsaWVudAorICogQGNsOiBpc2h0cCBjbGllbnQgaW5zdGFuY2UKKyAqCisgKiBVc2VkIHRvIHJlbW92ZSBhbGwgcXVldWVzIGZvciBhIGNsaWVudC4gVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudCBkZXZpY2UKKyAqIG5lZWRzIHJlc2V0IGR1ZSB0byBlcnJvciwgUzMgcmVzdW1lIG9yIGR1cmluZyBtb2R1bGUgcmVtb3ZhbAorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIGVsc2UgLUVJTlZBTCBpZiBkZXZpY2UgaXMgTlVMTAorICovCitpbnQgaXNodHBfY2xfZmx1c2hfcXVldWVzKHN0cnVjdCBpc2h0cF9jbCAqY2wpCit7CisJaWYgKFdBUk5fT04oIWNsIHx8ICFjbC0+ZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpc2h0cF9yZWFkX2xpc3RfZmx1c2goY2wpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlzaHRwX2NsX2ZsdXNoX3F1ZXVlcyk7CisKKy8qKgorICogaXNodHBfY2xfaW5pdCgpIC0gSW5pdGlhbGl6ZSBhbGwgZmllbGRzIG9mIGEgY2xpZW50IGRldmljZQorICogQGNsOiBpc2h0cCBjbGllbnQgaW5zdGFuY2UKKyAqIEBkZXY6IGlzaHRwIGRldmljZQorICoKKyAqIEluaXRpYWxpemVzIGEgY2xpZW50IGRldmljZSBmaWVsZHM6IEluaXQgc3BpbmxvY2tzLCBpbml0IHF1ZXVlcyBldGMuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgbmV3IGNsaWVudCBjcmVhdGlvbgorICovCitzdGF0aWMgdm9pZCBpc2h0cF9jbF9pbml0KHN0cnVjdCBpc2h0cF9jbCAqY2wsIHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldikKK3sKKwltZW1zZXQoY2wsIDAsIHNpemVvZihzdHJ1Y3QgaXNodHBfY2wpKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjbC0+d2FpdF9jdHJsX3Jlcyk7CisJc3Bpbl9sb2NrX2luaXQoJmNsLT5mcmVlX2xpc3Rfc3BpbmxvY2spOworCXNwaW5fbG9ja19pbml0KCZjbC0+aW5fcHJvY2Vzc19zcGlubG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmNsLT50eF9saXN0X3NwaW5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY2wtPnR4X2ZyZWVfbGlzdF9zcGlubG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmNsLT5mY19zcGlubG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmNsLT5saW5rKTsKKwljbC0+ZGV2ID0gZGV2OworCisJSU5JVF9MSVNUX0hFQUQoJmNsLT5mcmVlX3JiX2xpc3QubGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmNsLT50eF9saXN0Lmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjbC0+dHhfZnJlZV9saXN0Lmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjbC0+aW5fcHJvY2Vzc19saXN0Lmxpc3QpOworCisJY2wtPnJ4X3Jpbmdfc2l6ZSA9IENMX0RFRl9SWF9SSU5HX1NJWkU7CisJY2wtPnR4X3Jpbmdfc2l6ZSA9IENMX0RFRl9UWF9SSU5HX1NJWkU7CisKKwkvKiBkbWEgKi8KKwljbC0+bGFzdF90eF9wYXRoID0gQ0xfVFhfUEFUSF9JUEM7CisJY2wtPmxhc3RfZG1hX2Fja2VkID0gMTsKKwljbC0+bGFzdF9kbWFfYWRkciA9IE5VTEw7CisJY2wtPmxhc3RfaXBjX2Fja2VkID0gMTsKK30KKworLyoqCisgKiBpc2h0cF9jbF9hbGxvY2F0ZSgpIC0gYWxsb2NhdGVzIGNsaWVudCBzdHJ1Y3R1cmUgYW5kIHNldHMgaXQgdXAuCisgKiBAZGV2OiBpc2h0cCBkZXZpY2UKKyAqCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIG5ldyBjbGllbnQgZGV2aWNlIGFuZCBjYWxsIHRvIGluaXRpYWxpemUgZWFjaCBmaWVsZC4KKyAqCisgKiBSZXR1cm46IFRoZSBhbGxvY2F0ZWQgY2xpZW50IGluc3RhbmNlIG9yIE5VTEwgb24gZmFpbHVyZQorICovCitzdHJ1Y3QgaXNodHBfY2wgKmlzaHRwX2NsX2FsbG9jYXRlKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNodHBfY2wgKmNsOworCisJY2wgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXNodHBfY2wpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNsKQorCQlyZXR1cm4gTlVMTDsKKworCWlzaHRwX2NsX2luaXQoY2wsIGRldik7CisJcmV0dXJuIGNsOworfQorRVhQT1JUX1NZTUJPTChpc2h0cF9jbF9hbGxvY2F0ZSk7CisKKy8qKgorICogaXNodHBfY2xfZnJlZSgpIC0gRnJlZXMgYSBjbGllbnQgZGV2aWNlCisgKiBAY2w6IGNsaWVudCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBGcmVlcyBhIGNsaWVudCBkZXZpY2UKKyAqLwordm9pZAlpc2h0cF9jbF9mcmVlKHN0cnVjdCBpc2h0cF9jbCAqY2wpCit7CisJc3RydWN0IGlzaHRwX2RldmljZSAqZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNsKQorCQlyZXR1cm47CisKKwlkZXYgPSBjbC0+ZGV2OworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jbF9saXN0X2xvY2ssIGZsYWdzKTsKKwlpc2h0cF9jbF9mcmVlX3J4X3JpbmcoY2wpOworCWlzaHRwX2NsX2ZyZWVfdHhfcmluZyhjbCk7CisJa2ZyZWUoY2wpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y2xfbGlzdF9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGlzaHRwX2NsX2ZyZWUpOworCisvKioKKyAqIGlzaHRwX2NsX2xpbmsoKSAtIFJlc2VydmUgYSBob3N0IGlkIGFuZCBsaW5rIHRoZSBjbGllbnQgaW5zdGFuY2UKKyAqIEBjbDogY2xpZW50IGRldmljZSBpbnN0YW5jZQorICogQGlkOiBob3N0IGNsaWVudCBpZCB0byB1c2UuIEl0IGNhbiBiZSBJU0hUUF9IT1NUX0NMSUVOVF9JRF9BTlkgaWYgYW55CisgKglpZCBmcm9tIHRoZSBhdmFpbGFibGUgY2FuIGJlIHVzZWQKKyAqCisgKgorICogVGhpcyBhbGxvY2F0ZXMgYSBzaW5nbGUgYml0IGluIHRoZSBob3N0bWFwLiBUaGlzIGZ1bmN0aW9uIHdpbGwgbWFrZSBzdXJlCisgKiB0aGF0IG5vdCBtYW55IGNsaWVudCBzZXNzaW9ucyBhcmUgb3BlbmVkIGF0IHRoZSBzYW1lIHRpbWUuIE9uY2UgYWxsb2NhdGVkCisgKiB0aGUgY2xpZW50IGRldmljZSBpbnN0YW5jZSBpcyBhZGRlZCB0byB0aGUgaXNodHAgZGV2aWNlIGluIHRoZSBjdXJyZW50CisgKiBjbGllbnQgbGlzdAorICoKKyAqIFJldHVybjogMCBvciBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGlzaHRwX2NsX2xpbmsoc3RydWN0IGlzaHRwX2NsICpjbCwgaW50IGlkKQoreworCXN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzLCBmbGFnc19jbDsKKwlpbnQJcmV0ID0gMDsKKworCWlmIChXQVJOX09OKCFjbCB8fCAhY2wtPmRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2ID0gY2wtPmRldjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmRldmljZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoZGV2LT5vcGVuX2hhbmRsZV9jb3VudCA+PSBJU0hUUF9NQVhfT1BFTl9IQU5ETEVfQ09VTlQpIHsKKwkJcmV0ID0gLUVNRklMRTsKKwkJZ290byB1bmxvY2tfZGV2OworCX0KKworCS8qIElmIElkIGlzIG5vdCBhc3NpZ25lZCBnZXQgb25lKi8KKwlpZiAoaWQgPT0gSVNIVFBfSE9TVF9DTElFTlRfSURfQU5ZKQorCQlpZCA9IGZpbmRfZmlyc3RfemVyb19iaXQoZGV2LT5ob3N0X2NsaWVudHNfbWFwLAorCQkJSVNIVFBfQ0xJRU5UU19NQVgpOworCisJaWYgKGlkID49IElTSFRQX0NMSUVOVFNfTUFYKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwkJZGV2X2VycigmY2wtPmRldmljZS0+ZGV2LCAiaWQgZXhjZWVkZWQgJWQiLCBJU0hUUF9DTElFTlRTX01BWCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWRldi0+b3Blbl9oYW5kbGVfY291bnQrKzsKKwljbC0+aG9zdF9jbGllbnRfaWQgPSBpZDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jbF9saXN0X2xvY2ssIGZsYWdzX2NsKTsKKwlpZiAoZGV2LT5kZXZfc3RhdGUgIT0gSVNIVFBfREVWX0VOQUJMRUQpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfY2w7CisJfQorCWxpc3RfYWRkX3RhaWwoJmNsLT5saW5rLCAmZGV2LT5jbF9saXN0KTsKKwlzZXRfYml0KGlkLCBkZXYtPmhvc3RfY2xpZW50c19tYXApOworCWNsLT5zdGF0ZSA9IElTSFRQX0NMX0lOSVRJQUxJWklORzsKKwordW5sb2NrX2NsOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y2xfbGlzdF9sb2NrLCBmbGFnc19jbCk7Cit1bmxvY2tfZGV2OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpc2h0cF9jbF9saW5rKTsKKworLyoqCisgKiBpc2h0cF9jbF91bmxpbmsoKSAtIHJlbW92ZSBmd19jbCBmcm9tIHRoZSBjbGllbnQgZGV2aWNlIGxpc3QKKyAqIEBjbDogY2xpZW50IGRldmljZSBpbnN0YW5jZQorICoKKyAqIFJlbW92ZSBhIHByZXZpb3VzbHkgbGlua2VkIGRldmljZSB0byBhIGlzaHRwIGRldmljZQorICovCit2b2lkIGlzaHRwX2NsX3VubGluayhzdHJ1Y3QgaXNodHBfY2wgKmNsKQoreworCXN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaXNodHBfY2wgKnBvczsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJLyogZG9uJ3Qgc2hvdXQgb24gZXJyb3IgZXhpdCBwYXRoICovCisJaWYgKCFjbCB8fCAhY2wtPmRldikKKwkJcmV0dXJuOworCisJZGV2ID0gY2wtPmRldjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmRldmljZV9sb2NrLCBmbGFncyk7CisJaWYgKGRldi0+b3Blbl9oYW5kbGVfY291bnQgPiAwKSB7CisJCWNsZWFyX2JpdChjbC0+aG9zdF9jbGllbnRfaWQsIGRldi0+aG9zdF9jbGllbnRzX21hcCk7CisJCWRldi0+b3Blbl9oYW5kbGVfY291bnQtLTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kZXZpY2VfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBUaGlzIGNoZWNrcyB0aGF0ICdjbCcgaXMgYWN0dWFsbHkgbGlua2VkIGludG8gZGV2aWNlJ3Mgc3RydWN0dXJlLAorCSAqIGJlZm9yZSBhdHRlbXB0aW5nICdsaXN0X2RlbCcKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jbF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmRldi0+Y2xfbGlzdCwgbGluaykKKwkJaWYgKGNsLT5ob3N0X2NsaWVudF9pZCA9PSBwb3MtPmhvc3RfY2xpZW50X2lkKSB7CisJCQlsaXN0X2RlbF9pbml0KCZwb3MtPmxpbmspOworCQkJYnJlYWs7CisJCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmNsX2xpc3RfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChpc2h0cF9jbF91bmxpbmspOworCisvKioKKyAqIGlzaHRwX2NsX2Rpc2Nvbm5lY3QoKSAtIFNlbmQgZGlzY29ubmVjdCByZXF1ZXN0IHRvIGZpcm13YXJlCisgKiBAY2w6IGNsaWVudCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBTZW5kIGEgZGlzY29ubmVjdCByZXF1ZXN0IGZvciBhIGNsaWVudCB0byBmaXJtd2FyZS4KKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2Vzc2Z1bCBkaXNjb25uZWN0IHJlc3BvbnNlIGZyb20gdGhlIGZpcm13YXJlIG9yIGVycm9yCisgKiBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGlzaHRwX2NsX2Rpc2Nvbm5lY3Qoc3RydWN0IGlzaHRwX2NsICpjbCkKK3sKKwlzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXY7CisJaW50IGVycjsKKworCWlmIChXQVJOX09OKCFjbCB8fCAhY2wtPmRldikpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2ID0gY2wtPmRldjsKKworCWRldi0+cHJpbnRfbG9nKGRldiwgIiVzKCkgc3RhdGUgJWRcbiIsIF9fZnVuY19fLCBjbC0+c3RhdGUpOworCisJaWYgKGNsLT5zdGF0ZSAhPSBJU0hUUF9DTF9ESVNDT05ORUNUSU5HKSB7CisJCWRldi0+cHJpbnRfbG9nKGRldiwgIiVzKCkgRGlzY29ubmVjdCBpbiBwcm9ncmVzc1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaXNodHBfaGJtX2NsX2Rpc2Nvbm5lY3RfcmVxKGRldiwgY2wpKSB7CisJCWRldi0+cHJpbnRfbG9nKGRldiwgIiVzKCkgRmFpbGVkIHRvIGRpc2Nvbm5lY3RcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2VycigmY2wtPmRldmljZS0+ZGV2LCAiZmFpbGVkIHRvIGRpc2Nvbm5lY3QuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZXJyID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoY2wtPndhaXRfY3RybF9yZXMsCisJCQkoZGV2LT5kZXZfc3RhdGUgIT0gSVNIVFBfREVWX0VOQUJMRUQgfHwKKwkJCWNsLT5zdGF0ZSA9PSBJU0hUUF9DTF9ESVNDT05ORUNURUQpLAorCQkJaXNodHBfc2Vjc190b19qaWZmaWVzKElTSFRQX0NMX0NPTk5FQ1RfVElNRU9VVCkpOworCisJLyoKKwkgKiBJZiBGVyByZXNldCBhcnJpdmVkLCB0aGlzIHdpbGwgaGFwcGVuLiBEb24ndCBjaGVjayBjbC0+LAorCSAqIGFzICdjbCcgbWF5IGJlIGZyZWVkIGFscmVhZHkKKwkgKi8KKwlpZiAoZGV2LT5kZXZfc3RhdGUgIT0gSVNIVFBfREVWX0VOQUJMRUQpIHsKKwkJZGV2LT5wcmludF9sb2coZGV2LCAiJXMoKSBkZXZfc3RhdGUgIT0gSVNIVFBfREVWX0VOQUJMRURcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoY2wtPnN0YXRlID09IElTSFRQX0NMX0RJU0NPTk5FQ1RFRCkgeworCQlkZXYtPnByaW50X2xvZyhkZXYsICIlcygpIHN1Y2Nlc3NmdWxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CitFWFBPUlRfU1lNQk9MKGlzaHRwX2NsX2Rpc2Nvbm5lY3QpOworCisvKioKKyAqIGlzaHRwX2NsX2lzX290aGVyX2Nvbm5lY3RpbmcoKSAtIENoZWNrIG90aGVyIGNsaWVudCBpcyBjb25uZWN0aW5nCisgKiBAY2w6IGNsaWVudCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBDaGVja3MgaWYgb3RoZXIgY2xpZW50IHdpdGggdGhlIHNhbWUgZncgY2xpZW50IGlkIGlzIGNvbm5lY3RpbmcKKyAqCisgKiBSZXR1cm46IHRydWUgaWYgb3RoZXIgY2xpZW50IGlzIGNvbm5lY3RlZCBlbHNlIGZhbHNlCisgKi8KK3N0YXRpYyBib29sIGlzaHRwX2NsX2lzX290aGVyX2Nvbm5lY3Rpbmcoc3RydWN0IGlzaHRwX2NsICpjbCkKK3sKKwlzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXY7CisJc3RydWN0IGlzaHRwX2NsICpwb3M7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmIChXQVJOX09OKCFjbCB8fCAhY2wtPmRldikpCisJCXJldHVybiBmYWxzZTsKKworCWRldiA9IGNsLT5kZXY7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+Y2xfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZkZXYtPmNsX2xpc3QsIGxpbmspIHsKKwkJaWYgKChwb3MtPnN0YXRlID09IElTSFRQX0NMX0NPTk5FQ1RJTkcpICYmIChwb3MgIT0gY2wpICYmCisJCQkJY2wtPmZ3X2NsaWVudF9pZCA9PSBwb3MtPmZ3X2NsaWVudF9pZCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jbF9saXN0X2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y2xfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogaXNodHBfY2xfY29ubmVjdCgpIC0gU2VuZCBjb25uZWN0IHJlcXVlc3QgdG8gZmlybXdhcmUKKyAqIEBjbDogY2xpZW50IGRldmljZSBpbnN0YW5jZQorICoKKyAqIFNlbmQgYSBjb25uZWN0IHJlcXVlc3QgZm9yIGEgY2xpZW50IHRvIGZpcm13YXJlLiBJZiBzdWNjZXNzZnVsIGl0IHdpbGwKKyAqIFJYIGFuZCBUWCByaW5nIGJ1ZmZlcnMKKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2Vzc2Z1bCBjb25uZWN0IHJlc3BvbnNlIGZyb20gdGhlIGZpcm13YXJlIGFuZCBhYmxlCisgKiB0byBiaW5kIGFuZCBhbGxvY2F0ZSByaW5nIGJ1ZmZlcnMgb3IgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBpc2h0cF9jbF9jb25uZWN0KHN0cnVjdCBpc2h0cF9jbCAqY2wpCit7CisJc3RydWN0IGlzaHRwX2RldmljZSAqZGV2OworCWludCByZXRzOworCisJaWYgKFdBUk5fT04oIWNsIHx8ICFjbC0+ZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXYgPSBjbC0+ZGV2OworCisJZGV2LT5wcmludF9sb2coZGV2LCAiJXMoKSBjdXJyZW50X3N0YXRlID0gJWRcbiIsIF9fZnVuY19fLCBjbC0+c3RhdGUpOworCisJaWYgKGlzaHRwX2NsX2lzX290aGVyX2Nvbm5lY3RpbmcoY2wpKSB7CisJCWRldi0+cHJpbnRfbG9nKGRldiwgIiVzKCkgQnVzeVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4JLUVCVVNZOworCX0KKworCWlmIChpc2h0cF9oYm1fY2xfY29ubmVjdF9yZXEoZGV2LCBjbCkpIHsKKwkJZGV2LT5wcmludF9sb2coZGV2LCAiJXMoKSBIQk0gY29ubmVjdCByZXEgZmFpbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXRzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoY2wtPndhaXRfY3RybF9yZXMsCisJCQkJKGRldi0+ZGV2X3N0YXRlID09IElTSFRQX0RFVl9FTkFCTEVEICYmCisJCQkJKGNsLT5zdGF0ZSA9PSBJU0hUUF9DTF9DT05ORUNURUQgfHwKKwkJCQkgY2wtPnN0YXRlID09IElTSFRQX0NMX0RJU0NPTk5FQ1RFRCkpLAorCQkJCWlzaHRwX3NlY3NfdG9famlmZmllcygKKwkJCQkJSVNIVFBfQ0xfQ09OTkVDVF9USU1FT1VUKSk7CisJLyoKKwkgKiBJZiBGVyByZXNldCBhcnJpdmVkLCB0aGlzIHdpbGwgaGFwcGVuLiBEb24ndCBjaGVjayBjbC0+LAorCSAqIGFzICdjbCcgbWF5IGJlIGZyZWVkIGFscmVhZHkKKwkgKi8KKwlpZiAoZGV2LT5kZXZfc3RhdGUgIT0gSVNIVFBfREVWX0VOQUJMRUQpIHsKKwkJZGV2LT5wcmludF9sb2coZGV2LCAiJXMoKSBkZXZfc3RhdGUgIT0gSVNIVFBfREVWX0VOQUJMRURcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoY2wtPnN0YXRlICE9IElTSFRQX0NMX0NPTk5FQ1RFRCkgeworCQlkZXYtPnByaW50X2xvZyhkZXYsICIlcygpIHN0YXRlICE9IElTSFRQX0NMX0NPTk5FQ1RFRFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXJldHMgPSBjbC0+c3RhdHVzOworCWlmIChyZXRzKSB7CisJCWRldi0+cHJpbnRfbG9nKGRldiwgIiVzKCkgSW52YWxpZCBzdGF0dXNcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldHM7CisJfQorCisJcmV0cyA9IGlzaHRwX2NsX2RldmljZV9iaW5kKGNsKTsKKwlpZiAocmV0cykgeworCQlkZXYtPnByaW50X2xvZyhkZXYsICIlcygpIEJpbmQgZXJyb3JcbiIsIF9fZnVuY19fKTsKKwkJaXNodHBfY2xfZGlzY29ubmVjdChjbCk7CisJCXJldHVybiByZXRzOworCX0KKworCXJldHMgPSBpc2h0cF9jbF9hbGxvY19yeF9yaW5nKGNsKTsKKwlpZiAocmV0cykgeworCQlkZXYtPnByaW50X2xvZyhkZXYsICIlcygpIEFsbG9jIFJYIHJpbmcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCS8qIGlmIGZhaWxlZCBhbGxvY2F0aW9uLCBkaXNjb25uZWN0ICovCisJCWlzaHRwX2NsX2Rpc2Nvbm5lY3QoY2wpOworCQlyZXR1cm4gcmV0czsKKwl9CisKKwlyZXRzID0gaXNodHBfY2xfYWxsb2NfdHhfcmluZyhjbCk7CisJaWYgKHJldHMpIHsKKwkJZGV2LT5wcmludF9sb2coZGV2LCAiJXMoKSBBbGxvYyBUWCByaW5nIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkvKiBpZiBmYWlsZWQgYWxsb2NhdGlvbiwgZGlzY29ubmVjdCAqLworCQlpc2h0cF9jbF9mcmVlX3J4X3JpbmcoY2wpOworCQlpc2h0cF9jbF9kaXNjb25uZWN0KGNsKTsKKwkJcmV0dXJuIHJldHM7CisJfQorCisJLyogVXBvbiBzdWNjZXNzZnVsIGNvbm5lY3Rpb24gYW5kIGFsbG9jYXRpb24sIGVtaXQgZmxvdy1jb250cm9sICovCisJcmV0cyA9IGlzaHRwX2NsX3JlYWRfc3RhcnQoY2wpOworCisJZGV2LT5wcmludF9sb2coZGV2LCAiJXMoKSBzdWNjZXNzZnVsXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0czsKK30KK0VYUE9SVF9TWU1CT0woaXNodHBfY2xfY29ubmVjdCk7CisKKy8qKgorICogaXNodHBfY2xfcmVhZF9zdGFydCgpIC0gUHJlcGFyZSB0byByZWFkIGNsaWVudCBtZXNzYWdlCisgKiBAY2w6IGNsaWVudCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBHZXQgYSBmcmVlIGJ1ZmZlciBmcm9tIHBvb2wgb2YgZnJlZSByZWFkIGJ1ZmZlcnMgYW5kIGFkZCB0byByZWFkIGJ1ZmZlcgorICogcG9vbCB0byBhZGQgY29udGVudHMuIFNlbmQgYSBmbG93IGNvbnRyb2wgcmVxdWVzdCB0byBmaXJtd2FyZSB0byBiZSBhYmxlCisgKiBzZW5kIG5leHQgbWVzc2FnZS4KKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2Vzc2Z1bCBvciBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGlzaHRwX2NsX3JlYWRfc3RhcnQoc3RydWN0IGlzaHRwX2NsICpjbCkKK3sKKwlzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXY7CisJc3RydWN0IGlzaHRwX2NsX3JiICpyYjsKKwlpbnQgcmV0czsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXVuc2lnbmVkIGxvbmcJZGV2X2ZsYWdzOworCisJaWYgKFdBUk5fT04oIWNsIHx8ICFjbC0+ZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXYgPSBjbC0+ZGV2OworCisJaWYgKGNsLT5zdGF0ZSAhPSBJU0hUUF9DTF9DT05ORUNURUQpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGRldi0+ZGV2X3N0YXRlICE9IElTSFRQX0RFVl9FTkFCTEVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWkgPSBpc2h0cF9md19jbF9ieV9pZChkZXYsIGNsLT5md19jbGllbnRfaWQpOworCWlmIChpIDwgMCkgeworCQlkZXZfZXJyKCZjbC0+ZGV2aWNlLT5kZXYsICJubyBzdWNoIGZ3IGNsaWVudCAlZFxuIiwKKwkJCWNsLT5md19jbGllbnRfaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBUaGUgY3VycmVudCByYiBpcyB0aGUgaGVhZCBvZiB0aGUgZnJlZSByYiBsaXN0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsLT5mcmVlX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmY2wtPmZyZWVfcmJfbGlzdC5saXN0KSkgeworCQlkZXZfd2FybigmY2wtPmRldmljZS0+ZGV2LAorCQkJICJbaXNodHAtaXNoXSBSeCBidWZmZXJzIHBvb2wgaXMgZW1wdHlcbiIpOworCQlyZXRzID0gLUVOT01FTTsKKwkJcmIgPSBOVUxMOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbC0+ZnJlZV9saXN0X3NwaW5sb2NrLCBmbGFncyk7CisJCWdvdG8gb3V0OworCX0KKwlyYiA9IGxpc3RfZW50cnkoY2wtPmZyZWVfcmJfbGlzdC5saXN0Lm5leHQsIHN0cnVjdCBpc2h0cF9jbF9yYiwgbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgmcmItPmxpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsLT5mcmVlX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKKworCXJiLT5jbCA9IGNsOworCXJiLT5idWZfaWR4ID0gMDsKKworCUlOSVRfTElTVF9IRUFEKCZyYi0+bGlzdCk7CisJcmV0cyA9IDA7CisKKwkvKgorCSAqIFRoaXMgbXVzdCBiZSBCRUZPUkUgc2VuZGluZyBmbG93IGNvbnRyb2wgLQorCSAqIHJlc3BvbnNlIGluIElTUiBtYXkgY29tZSB0b28gZmFzdC4uLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJlYWRfbGlzdF9zcGlubG9jaywgZGV2X2ZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZyYi0+bGlzdCwgJmRldi0+cmVhZF9saXN0Lmxpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmVhZF9saXN0X3NwaW5sb2NrLCBkZXZfZmxhZ3MpOworCWlmIChpc2h0cF9oYm1fY2xfZmxvd19jb250cm9sX3JlcShkZXYsIGNsKSkgeworCQlyZXRzID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorb3V0OgorCS8qIGlmIGlzaHRwX2hibV9jbF9mbG93X2NvbnRyb2xfcmVxIGZhaWxlZCwgcmV0dXJuIHJiIHRvIGZyZWUgbGlzdCAqLworCWlmIChyZXRzICYmIHJiKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnJlYWRfbGlzdF9zcGlubG9jaywgZGV2X2ZsYWdzKTsKKwkJbGlzdF9kZWwoJnJiLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5yZWFkX2xpc3Rfc3BpbmxvY2ssIGRldl9mbGFncyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNsLT5mcmVlX2xpc3Rfc3BpbmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmcmItPmxpc3QsICZjbC0+ZnJlZV9yYl9saXN0Lmxpc3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbC0+ZnJlZV9saXN0X3NwaW5sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiByZXRzOworfQorCisvKioKKyAqIGlzaHRwX2NsX3NlbmQoKSAtIFNlbmQgYSBtZXNzYWdlIHRvIGZpcm13YXJlCisgKiBAY2w6IGNsaWVudCBkZXZpY2UgaW5zdGFuY2UKKyAqIEBidWY6IG1lc3NhZ2UgYnVmZmVyCisgKiBAbGVuZ3RoOiBsZW5ndGggb2YgbWVzc2FnZQorICoKKyAqIElmIHRoZSBjbGllbnQgaXMgY29ycmVjdCBzdGF0ZSB0byBzZW5kIG1lc3NhZ2UsIHRoaXMgZnVuY3Rpb24gZ2V0cyBhIGJ1ZmZlcgorICogZnJvbSB0eCByaW5nIGJ1ZmZlcnMsIGNvcHkgdGhlIG1lc3NhZ2UgZGF0YSBhbmQgY2FsbCB0byBzZW5kIHRoZSBtZXNzYWdlCisgKiB1c2luZyBpc2h0cF9jbF9zZW5kX21zZygpCisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3NmdWwgb3IgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK2ludCBpc2h0cF9jbF9zZW5kKHN0cnVjdCBpc2h0cF9jbCAqY2wsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgaXNodHBfZGV2aWNlCSpkZXY7CisJaW50CWlkOworCXN0cnVjdCBpc2h0cF9jbF90eF9yaW5nCSpjbF9tc2c7CisJaW50CWhhdmVfbXNnX3RvX3NlbmQgPSAwOworCXVuc2lnbmVkIGxvbmcJdHhfZmxhZ3MsIHR4X2ZyZWVfZmxhZ3M7CisKKwlpZiAoV0FSTl9PTighY2wgfHwgIWNsLT5kZXYpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldiA9IGNsLT5kZXY7CisKKwlpZiAoY2wtPnN0YXRlICE9IElTSFRQX0NMX0NPTk5FQ1RFRCkgeworCQkrK2NsLT5lcnJfc2VuZF9tc2c7CisJCXJldHVybiAtRVBJUEU7CisJfQorCisJaWYgKGRldi0+ZGV2X3N0YXRlICE9IElTSFRQX0RFVl9FTkFCTEVEKSB7CisJCSsrY2wtPmVycl9zZW5kX21zZzsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSBmdyBjbGllbnQgZGV2aWNlICovCisJaWQgPSBpc2h0cF9md19jbF9ieV9pZChkZXYsIGNsLT5md19jbGllbnRfaWQpOworCWlmIChpZCA8IDApIHsKKwkJKytjbC0+ZXJyX3NlbmRfbXNnOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpZiAobGVuZ3RoID4gZGV2LT5md19jbGllbnRzW2lkXS5wcm9wcy5tYXhfbXNnX2xlbmd0aCkgeworCQkrK2NsLT5lcnJfc2VuZF9tc2c7CisJCXJldHVybiAtRU1TR1NJWkU7CisJfQorCisJLyogTm8gZnJlZSBidWZzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsLT50eF9mcmVlX2xpc3Rfc3BpbmxvY2ssIHR4X2ZyZWVfZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZjbC0+dHhfZnJlZV9saXN0Lmxpc3QpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsLT50eF9mcmVlX2xpc3Rfc3BpbmxvY2ssCisJCQl0eF9mcmVlX2ZsYWdzKTsKKwkJKytjbC0+ZXJyX3NlbmRfbXNnOworCQlyZXR1cm4JLUVOT01FTTsKKwl9CisKKwljbF9tc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjbC0+dHhfZnJlZV9saXN0Lmxpc3QsCisJCXN0cnVjdCBpc2h0cF9jbF90eF9yaW5nLCBsaXN0KTsKKwlpZiAoIWNsX21zZy0+c2VuZF9idWYuZGF0YSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbC0+dHhfZnJlZV9saXN0X3NwaW5sb2NrLAorCQkJdHhfZnJlZV9mbGFncyk7CisJCXJldHVybgktRUlPOworCQkvKiBTaG91bGQgbm90IGhhcHBlbiwgYXMgZnJlZSBsaXN0IGlzIHByZS1hbGxvY2F0ZWQgKi8KKwl9CisJLyoKKwkgKiBUaGlzIGlzIHNhZmUsIGFzICdsZW5ndGgnIGlzIGFscmVhZHkgY2hlY2tlZCBmb3Igbm90IGV4Y2VlZGluZworCSAqIG1heCBJU0hUUCBtZXNzYWdlIHNpemUgcGVyIGNsaWVudAorCSAqLworCWxpc3RfZGVsX2luaXQoJmNsX21zZy0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPnR4X2ZyZWVfbGlzdF9zcGlubG9jaywgdHhfZnJlZV9mbGFncyk7CisJbWVtY3B5KGNsX21zZy0+c2VuZF9idWYuZGF0YSwgYnVmLCBsZW5ndGgpOworCWNsX21zZy0+c2VuZF9idWYuc2l6ZSA9IGxlbmd0aDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2wtPnR4X2xpc3Rfc3BpbmxvY2ssIHR4X2ZsYWdzKTsKKwloYXZlX21zZ190b19zZW5kID0gIWxpc3RfZW1wdHkoJmNsLT50eF9saXN0Lmxpc3QpOworCWxpc3RfYWRkX3RhaWwoJmNsX21zZy0+bGlzdCwgJmNsLT50eF9saXN0Lmxpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsLT50eF9saXN0X3NwaW5sb2NrLCB0eF9mbGFncyk7CisKKwlpZiAoIWhhdmVfbXNnX3RvX3NlbmQgJiYgY2wtPmlzaHRwX2Zsb3dfY3RybF9jcmVkcyA+IDApCisJCWlzaHRwX2NsX3NlbmRfbXNnKGRldiwgY2wpOworCisJcmV0dXJuCTA7Cit9CitFWFBPUlRfU1lNQk9MKGlzaHRwX2NsX3NlbmQpOworCisvKioKKyAqIGlzaHRwX2NsX3JlYWRfY29tcGxldGUoKSAtIHJlYWQgY29tcGxldGUKKyAqIEByYjogUG9pbnRlciB0byBjbGllbnQgcmVxdWVzdCBibG9jaworICoKKyAqIElmIHRoZSBtZXNzYWdlIGlzIGNvbXBsZXRlbHkgcmVjZWl2ZWQgY2FsbCBpc2h0cF9jbF9idXNfcnhfZXZlbnQoKQorICogdG8gcHJvY2VzcyBtZXNzYWdlCisgKi8KK3N0YXRpYyB2b2lkIGlzaHRwX2NsX3JlYWRfY29tcGxldGUoc3RydWN0IGlzaHRwX2NsX3JiICpyYikKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCWludAlzY2hlZHVsZV93b3JrX2ZsYWcgPSAwOworCXN0cnVjdCBpc2h0cF9jbAkqY2wgPSByYi0+Y2w7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2wtPmluX3Byb2Nlc3Nfc3BpbmxvY2ssIGZsYWdzKTsKKwkvKgorCSAqIGlmIGluLXByb2Nlc3MgbGlzdCBpcyBlbXB0eSwgdGhlbiBuZWVkIHRvIHNjaGVkdWxlCisJICogdGhlIHByb2Nlc3NpbmcgdGhyZWFkCisJICovCisJc2NoZWR1bGVfd29ya19mbGFnID0gbGlzdF9lbXB0eSgmY2wtPmluX3Byb2Nlc3NfbGlzdC5saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZyYi0+bGlzdCwgJmNsLT5pbl9wcm9jZXNzX2xpc3QubGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPmluX3Byb2Nlc3Nfc3BpbmxvY2ssIGZsYWdzKTsKKworCWlmIChzY2hlZHVsZV93b3JrX2ZsYWcpCisJCWlzaHRwX2NsX2J1c19yeF9ldmVudChjbC0+ZGV2aWNlKTsKK30KKworLyoqCisgKiBpcGNfdHhfY2FsbGJhY2soKSAtIElQQyB0eCBjYWxsYmFjayBmdW5jdGlvbgorICogQHBybTogUG9pbnRlciB0byBjbGllbnQgZGV2aWNlIGluc3RhbmNlCisgKgorICogU2VuZCBtZXNzYWdlIG92ZXIgSVBDIGVpdGhlciBmaXJzdCB0aW1lIG9yIG9uIGNhbGxiYWNrIG9uIHByZXZpb3VzIG1lc3NhZ2UKKyAqIGNvbXBsZXRpb24KKyAqLworc3RhdGljIHZvaWQgaXBjX3R4X2NhbGxiYWNrKHZvaWQgKnBybSkKK3sKKwlzdHJ1Y3QgaXNodHBfY2wJKmNsID0gcHJtOworCXN0cnVjdCBpc2h0cF9jbF90eF9yaW5nCSpjbF9tc2c7CisJc2l6ZV90CXJlbTsKKwlzdHJ1Y3QgaXNodHBfZGV2aWNlCSpkZXYgPSAoY2wgPyBjbC0+ZGV2IDogTlVMTCk7CisJc3RydWN0IGlzaHRwX21zZ19oZHIJaXNodHBfaGRyOworCXVuc2lnbmVkIGxvbmcJdHhfZmxhZ3MsIHR4X2ZyZWVfZmxhZ3M7CisJdW5zaWduZWQgY2hhcgkqcG1zZzsKKworCWlmICghZGV2KQorCQlyZXR1cm47CisKKwkvKgorCSAqIE90aGVyIGNvbmRpdGlvbnMgaWYgc29tZSBjcml0aWNhbCBlcnJvciBoYXMKKwkgKiBvY2N1cnJlZCBiZWZvcmUgdGhpcyBjYWxsYmFjayBpcyBjYWxsZWQKKwkgKi8KKwlpZiAoZGV2LT5kZXZfc3RhdGUgIT0gSVNIVFBfREVWX0VOQUJMRUQpCisJCXJldHVybjsKKworCWlmIChjbC0+c3RhdGUgIT0gSVNIVFBfQ0xfQ09OTkVDVEVEKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2wtPnR4X2xpc3Rfc3BpbmxvY2ssIHR4X2ZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmY2wtPnR4X2xpc3QubGlzdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPnR4X2xpc3Rfc3BpbmxvY2ssIHR4X2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjbC0+aXNodHBfZmxvd19jdHJsX2NyZWRzICE9IDEgJiYgIWNsLT5zZW5kaW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsLT50eF9saXN0X3NwaW5sb2NrLCB0eF9mbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWNsLT5zZW5kaW5nKSB7CisJCS0tY2wtPmlzaHRwX2Zsb3dfY3RybF9jcmVkczsKKwkJY2wtPmxhc3RfaXBjX2Fja2VkID0gMDsKKwkJY2wtPmxhc3RfdHhfcGF0aCA9IENMX1RYX1BBVEhfSVBDOworCQljbC0+c2VuZGluZyA9IDE7CisJfQorCisJY2xfbXNnID0gbGlzdF9lbnRyeShjbC0+dHhfbGlzdC5saXN0Lm5leHQsIHN0cnVjdCBpc2h0cF9jbF90eF9yaW5nLAorCQkJICAgIGxpc3QpOworCXJlbSA9IGNsX21zZy0+c2VuZF9idWYuc2l6ZSAtIGNsLT50eF9vZmZzOworCisJaXNodHBfaGRyLmhvc3RfYWRkciA9IGNsLT5ob3N0X2NsaWVudF9pZDsKKwlpc2h0cF9oZHIuZndfYWRkciA9IGNsLT5md19jbGllbnRfaWQ7CisJaXNodHBfaGRyLnJlc2VydmVkID0gMDsKKwlwbXNnID0gY2xfbXNnLT5zZW5kX2J1Zi5kYXRhICsgY2wtPnR4X29mZnM7CisKKwlpZiAocmVtIDw9IGRldi0+bXR1KSB7CisJCWlzaHRwX2hkci5sZW5ndGggPSByZW07CisJCWlzaHRwX2hkci5tc2dfY29tcGxldGUgPSAxOworCQljbC0+c2VuZGluZyA9IDA7CisJCWxpc3RfZGVsX2luaXQoJmNsX21zZy0+bGlzdCk7CS8qIE11c3QgYmUgYmVmb3JlIHdyaXRlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsLT50eF9saXN0X3NwaW5sb2NrLCB0eF9mbGFncyk7CisJCS8qIFN1Ym1pdCB0byBJUEMgcXVldWUgd2l0aCBubyBjYWxsYmFjayAqLworCQlpc2h0cF93cml0ZV9tZXNzYWdlKGRldiwgJmlzaHRwX2hkciwgcG1zZyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbC0+dHhfZnJlZV9saXN0X3NwaW5sb2NrLCB0eF9mcmVlX2ZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmY2xfbXNnLT5saXN0LCAmY2wtPnR4X2ZyZWVfbGlzdC5saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPnR4X2ZyZWVfbGlzdF9zcGlubG9jaywKKwkJCXR4X2ZyZWVfZmxhZ3MpOworCX0gZWxzZSB7CisJCS8qIFNlbmQgSVBDIGZyYWdtZW50ICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsLT50eF9saXN0X3NwaW5sb2NrLCB0eF9mbGFncyk7CisJCWNsLT50eF9vZmZzICs9IGRldi0+bXR1OworCQlpc2h0cF9oZHIubGVuZ3RoID0gZGV2LT5tdHU7CisJCWlzaHRwX2hkci5tc2dfY29tcGxldGUgPSAwOworCQlpc2h0cF9zZW5kX21zZyhkZXYsICZpc2h0cF9oZHIsIHBtc2csIGlwY190eF9jYWxsYmFjaywgY2wpOworCX0KK30KKworLyoqCisgKiBpc2h0cF9jbF9zZW5kX21zZ19pcGMoKSAtU2VuZCBtZXNzYWdlIHVzaW5nIElQQworICogQGRldjogSVNIVFAgZGV2aWNlIGluc3RhbmNlCisgKiBAY2w6IFBvaW50ZXIgdG8gY2xpZW50IGRldmljZSBpbnN0YW5jZQorICoKKyAqIFNlbmQgbWVzc2FnZSBvdmVyIElQQyBub3QgdXNpbmcgRE1BCisgKi8KK3N0YXRpYyB2b2lkIGlzaHRwX2NsX3NlbmRfbXNnX2lwYyhzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgaXNodHBfY2wgKmNsKQoreworCS8qIElmIGxhc3QgRE1BIG1lc3NhZ2Ugd2Fzbid0IGFja2VkIHlldCwgbGVhdmUgdGhpcyBvbmUgaW4gVHggcXVldWUgKi8KKwlpZiAoY2wtPmxhc3RfdHhfcGF0aCA9PSBDTF9UWF9QQVRIX0RNQSAmJiBjbC0+bGFzdF9kbWFfYWNrZWQgPT0gMCkKKwkJcmV0dXJuOworCisJY2wtPnR4X29mZnMgPSAwOworCWlwY190eF9jYWxsYmFjayhjbCk7CisJKytjbC0+c2VuZF9tc2dfY250X2lwYzsKK30KKworLyoqCisgKiBpc2h0cF9jbF9zZW5kX21zZ19kbWEoKSAtU2VuZCBtZXNzYWdlIHVzaW5nIERNQQorICogQGRldjogSVNIVFAgZGV2aWNlIGluc3RhbmNlCisgKiBAY2w6IFBvaW50ZXIgdG8gY2xpZW50IGRldmljZSBpbnN0YW5jZQorICoKKyAqIFNlbmQgbWVzc2FnZSB1c2luZyBETUEKKyAqLworc3RhdGljIHZvaWQgaXNodHBfY2xfc2VuZF9tc2dfZG1hKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaXNodHBfY2wgKmNsKQoreworCXN0cnVjdCBpc2h0cF9tc2dfaGRyCWhkcjsKKwlzdHJ1Y3QgZG1hX3hmZXJfaGJtCWRtYV94ZmVyOworCXVuc2lnbmVkIGNoYXIJKm1zZ19hZGRyOworCWludCBvZmY7CisJc3RydWN0IGlzaHRwX2NsX3R4X3JpbmcJKmNsX21zZzsKKwl1bnNpZ25lZCBsb25nIHR4X2ZsYWdzLCB0eF9mcmVlX2ZsYWdzOworCisJLyogSWYgbGFzdCBJUEMgbWVzc2FnZSB3YXNuJ3QgYWNrZWQgeWV0LCBsZWF2ZSB0aGlzIG9uZSBpbiBUeCBxdWV1ZSAqLworCWlmIChjbC0+bGFzdF90eF9wYXRoID09IENMX1RYX1BBVEhfSVBDICYmIGNsLT5sYXN0X2lwY19hY2tlZCA9PSAwKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2wtPnR4X2xpc3Rfc3BpbmxvY2ssIHR4X2ZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmY2wtPnR4X2xpc3QubGlzdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPnR4X2xpc3Rfc3BpbmxvY2ssIHR4X2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWNsX21zZyA9IGxpc3RfZW50cnkoY2wtPnR4X2xpc3QubGlzdC5uZXh0LCBzdHJ1Y3QgaXNodHBfY2xfdHhfcmluZywKKwkJbGlzdCk7CisKKwltc2dfYWRkciA9IGlzaHRwX2NsX2dldF9kbWFfc2VuZF9idWYoZGV2LCBjbF9tc2ctPnNlbmRfYnVmLnNpemUpOworCWlmICghbXNnX2FkZHIpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPnR4X2xpc3Rfc3BpbmxvY2ssIHR4X2ZsYWdzKTsKKwkJaWYgKGRldi0+dHJhbnNmZXJfcGF0aCA9PSBDTF9UWF9QQVRIX0RFRkFVTFQpCisJCQlpc2h0cF9jbF9zZW5kX21zZ19pcGMoZGV2LCBjbCk7CisJCXJldHVybjsKKwl9CisKKwlsaXN0X2RlbF9pbml0KCZjbF9tc2ctPmxpc3QpOwkvKiBNdXN0IGJlIGJlZm9yZSB3cml0ZSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsLT50eF9saXN0X3NwaW5sb2NrLCB0eF9mbGFncyk7CisKKwktLWNsLT5pc2h0cF9mbG93X2N0cmxfY3JlZHM7CisJY2wtPmxhc3RfZG1hX2Fja2VkID0gMDsKKwljbC0+bGFzdF9kbWFfYWRkciA9IG1zZ19hZGRyOworCWNsLT5sYXN0X3R4X3BhdGggPSBDTF9UWF9QQVRIX0RNQTsKKworCS8qIHdyaXRlIG1zZyB0byBkbWEgYnVmICovCisJbWVtY3B5KG1zZ19hZGRyLCBjbF9tc2ctPnNlbmRfYnVmLmRhdGEsIGNsX21zZy0+c2VuZF9idWYuc2l6ZSk7CisKKwkvKiBzZW5kIGRtYV94ZmVyIGhibSBtc2cgKi8KKwlvZmYgPSBtc2dfYWRkciAtICh1bnNpZ25lZCBjaGFyICopZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWY7CisJaXNodHBfaGJtX2hkcigmaGRyLCBzaXplb2Yoc3RydWN0IGRtYV94ZmVyX2hibSkpOworCWRtYV94ZmVyLmhibSA9IERNQV9YRkVSOworCWRtYV94ZmVyLmZ3X2NsaWVudF9pZCA9IGNsLT5md19jbGllbnRfaWQ7CisJZG1hX3hmZXIuaG9zdF9jbGllbnRfaWQgPSBjbC0+aG9zdF9jbGllbnRfaWQ7CisJZG1hX3hmZXIucmVzZXJ2ZWQgPSAwOworCWRtYV94ZmVyLm1zZ19hZGRyID0gZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWZfcGh5cyArIG9mZjsKKwlkbWFfeGZlci5tc2dfbGVuZ3RoID0gY2xfbXNnLT5zZW5kX2J1Zi5zaXplOworCWRtYV94ZmVyLnJlc2VydmVkMiA9IDA7CisJaXNodHBfd3JpdGVfbWVzc2FnZShkZXYsICZoZHIsICh1bnNpZ25lZCBjaGFyICopJmRtYV94ZmVyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2wtPnR4X2ZyZWVfbGlzdF9zcGlubG9jaywgdHhfZnJlZV9mbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmY2xfbXNnLT5saXN0LCAmY2wtPnR4X2ZyZWVfbGlzdC5saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbC0+dHhfZnJlZV9saXN0X3NwaW5sb2NrLCB0eF9mcmVlX2ZsYWdzKTsKKwkrK2NsLT5zZW5kX21zZ19jbnRfZG1hOworfQorCisvKioKKyAqIGlzaHRwX2NsX3NlbmRfbXNnKCkgLVNlbmQgbWVzc2FnZSB1c2luZyBETUEgb3IgSVBDCisgKiBAZGV2OiBJU0hUUCBkZXZpY2UgaW5zdGFuY2UKKyAqIEBjbDogUG9pbnRlciB0byBjbGllbnQgZGV2aWNlIGluc3RhbmNlCisgKgorICogU2VuZCBtZXNzYWdlIHVzaW5nIERNQSBvciBJUEMgYmFzZWQgb24gdHJhbnNmZXJfcGF0aAorICovCit2b2lkIGlzaHRwX2NsX3NlbmRfbXNnKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwgc3RydWN0IGlzaHRwX2NsICpjbCkKK3sKKwlpZiAoZGV2LT50cmFuc2Zlcl9wYXRoID09IENMX1RYX1BBVEhfRE1BKQorCQlpc2h0cF9jbF9zZW5kX21zZ19kbWEoZGV2LCBjbCk7CisJZWxzZQorCQlpc2h0cF9jbF9zZW5kX21zZ19pcGMoZGV2LCBjbCk7Cit9CisKKy8qKgorICogcmVjdl9pc2h0cF9jbF9tc2coKSAtUmVjZWl2ZSBjbGllbnQgbWVzc2FnZQorICogQGRldjogSVNIVFAgZGV2aWNlIGluc3RhbmNlCisgKiBAaXNodHBfaGRyOiBQb2ludGVyIHRvIG1lc3NhZ2UgaGVhZGVyCisgKgorICogUmVjZWl2ZSBhbmQgZGlzcGF0Y2ggSVNIVFAgY2xpZW50IG1lc3NhZ2VzLiBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzIGluIElTUgorICogY29udGV4dAorICovCit2b2lkIHJlY3ZfaXNodHBfY2xfbXNnKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpc2h0cF9tc2dfaGRyICppc2h0cF9oZHIpCit7CisJc3RydWN0IGlzaHRwX2NsICpjbDsKKwlzdHJ1Y3QgaXNodHBfY2xfcmIgKnJiOworCXN0cnVjdCBpc2h0cF9jbF9yYiAqbmV3X3JiOworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CisJc3RydWN0IGlzaHRwX2NsX3JiICpjb21wbGV0ZV9yYiA9IE5VTEw7CisJdW5zaWduZWQgbG9uZwlkZXZfZmxhZ3M7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQJcmJfY291bnQ7CisKKwlpZiAoaXNodHBfaGRyLT5yZXNlcnZlZCkgeworCQlkZXZfZXJyKGRldi0+ZGV2YywgImNvcnJ1cHRlZCBtZXNzYWdlIGhlYWRlci5cbiIpOworCQlnb3RvCWVvaTsKKwl9CisKKwlpZiAoaXNodHBfaGRyLT5sZW5ndGggPiBJUENfUEFZTE9BRF9TSVpFKSB7CisJCWRldl9lcnIoZGV2LT5kZXZjLAorCQkJIklTSFRQIG1lc3NhZ2UgbGVuZ3RoIGluIGhkciBleGNlZWRzIElQQyBNVFVcbiIpOworCQlnb3RvCWVvaTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5yZWFkX2xpc3Rfc3BpbmxvY2ssIGRldl9mbGFncyk7CisJcmJfY291bnQgPSAtMTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJiLCAmZGV2LT5yZWFkX2xpc3QubGlzdCwgbGlzdCkgeworCQkrK3JiX2NvdW50OworCQljbCA9IHJiLT5jbDsKKwkJaWYgKCFjbCB8fCAhKGNsLT5ob3N0X2NsaWVudF9pZCA9PSBpc2h0cF9oZHItPmhvc3RfYWRkciAmJgorCQkJCWNsLT5md19jbGllbnRfaWQgPT0gaXNodHBfaGRyLT5md19hZGRyKSB8fAorCQkJCSEoY2wtPnN0YXRlID09IElTSFRQX0NMX0NPTk5FQ1RFRCkpCisJCQljb250aW51ZTsKKworCQkgLyogSWYgbm8gUnggYnVmZmVyIGlzIGFsbG9jYXRlZCwgZGlzYmFuZCB0aGUgcmIgKi8KKwkJaWYgKHJiLT5idWZmZXIuc2l6ZSA9PSAwIHx8IHJiLT5idWZmZXIuZGF0YSA9PSBOVUxMKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlYWRfbGlzdF9zcGlubG9jaywKKwkJCQlkZXZfZmxhZ3MpOworCQkJZGV2X2VycigmY2wtPmRldmljZS0+ZGV2LAorCQkJCSJSeCBidWZmZXIgaXMgbm90IGFsbG9jYXRlZC5cbiIpOworCQkJbGlzdF9kZWwoJnJiLT5saXN0KTsKKwkJCWlzaHRwX2lvX3JiX2ZyZWUocmIpOworCQkJY2wtPnN0YXR1cyA9IC1FTk9NRU07CisJCQlnb3RvCWVvaTsKKwkJfQorCisJCS8qCisJCSAqIElmIG1lc3NhZ2UgYnVmZmVyIG92ZXJmbG93biAoZXhjZWVkcyBtYXguIGNsaWVudCBtc2cKKwkJICogc2l6ZSwgZHJvcCBtZXNzYWdlIGFuZCByZXR1cm4gdG8gZnJlZSBidWZmZXIuCisJCSAqIERvIHdlIG5lZWQgdG8gZGlzY29ubmVjdCBzdWNoIGEgY2xpZW50PyAoV2UgZG9uJ3Qgc2VuZAorCQkgKiBiYWNrIEZDLCBzbyBjb21tdW5pY2F0aW9uIHdpbGwgYmUgc3R1Y2sgYW55d2F5KQorCQkgKi8KKwkJaWYgKHJiLT5idWZmZXIuc2l6ZSA8IGlzaHRwX2hkci0+bGVuZ3RoICsgcmItPmJ1Zl9pZHgpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmVhZF9saXN0X3NwaW5sb2NrLAorCQkJCWRldl9mbGFncyk7CisJCQlkZXZfZXJyKCZjbC0+ZGV2aWNlLT5kZXYsCisJCQkJIm1lc3NhZ2Ugb3ZlcmZsb3cuIHNpemUgJWQgbGVuICVkIGlkeCAlbGRcbiIsCisJCQkJcmItPmJ1ZmZlci5zaXplLCBpc2h0cF9oZHItPmxlbmd0aCwKKwkJCQlyYi0+YnVmX2lkeCk7CisJCQlsaXN0X2RlbCgmcmItPmxpc3QpOworCQkJaXNodHBfY2xfaW9fcmJfcmVjeWNsZShyYik7CisJCQljbC0+c3RhdHVzID0gLUVJTzsKKwkJCWdvdG8JZW9pOworCQl9CisKKwkJYnVmZmVyID0gcmItPmJ1ZmZlci5kYXRhICsgcmItPmJ1Zl9pZHg7CisJCWRldi0+b3BzLT5pc2h0cF9yZWFkKGRldiwgYnVmZmVyLCBpc2h0cF9oZHItPmxlbmd0aCk7CisKKwkJcmItPmJ1Zl9pZHggKz0gaXNodHBfaGRyLT5sZW5ndGg7CisJCWlmIChpc2h0cF9oZHItPm1zZ19jb21wbGV0ZSkgeworCQkJLyogTGFzdCBmcmFnbWVudCBpbiBtZXNzYWdlIC0gaXQncyBjb21wbGV0ZSAqLworCQkJY2wtPnN0YXR1cyA9IDA7CisJCQlsaXN0X2RlbCgmcmItPmxpc3QpOworCQkJY29tcGxldGVfcmIgPSByYjsKKworCQkJLS1jbC0+b3V0X2Zsb3dfY3RybF9jcmVkczsKKwkJCS8qCisJCQkgKiB0aGUgd2hvbGUgbXNnIGFycml2ZWQsIHNlbmQgYSBuZXcgRkMsIGFuZCBhZGQgYSBuZXcKKwkJCSAqIHJiIGJ1ZmZlciBmb3IgdGhlIG5leHQgY29taW5nIG1zZworCQkJICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2wtPmZyZWVfbGlzdF9zcGlubG9jaywgZmxhZ3MpOworCisJCQlpZiAoIWxpc3RfZW1wdHkoJmNsLT5mcmVlX3JiX2xpc3QubGlzdCkpIHsKKwkJCQluZXdfcmIgPSBsaXN0X2VudHJ5KGNsLT5mcmVlX3JiX2xpc3QubGlzdC5uZXh0LAorCQkJCQlzdHJ1Y3QgaXNodHBfY2xfcmIsIGxpc3QpOworCQkJCWxpc3RfZGVsX2luaXQoJm5ld19yYi0+bGlzdCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPmZyZWVfbGlzdF9zcGlubG9jaywKKwkJCQkJZmxhZ3MpOworCQkJCW5ld19yYi0+Y2wgPSBjbDsKKwkJCQluZXdfcmItPmJ1Zl9pZHggPSAwOworCQkJCUlOSVRfTElTVF9IRUFEKCZuZXdfcmItPmxpc3QpOworCQkJCWxpc3RfYWRkX3RhaWwoJm5ld19yYi0+bGlzdCwKKwkJCQkJJmRldi0+cmVhZF9saXN0Lmxpc3QpOworCisJCQkJaXNodHBfaGJtX2NsX2Zsb3dfY29udHJvbF9yZXEoZGV2LCBjbCk7CisJCQl9IGVsc2UgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsLT5mcmVlX2xpc3Rfc3BpbmxvY2ssCisJCQkJCWZsYWdzKTsKKwkJCX0KKwkJfQorCQkvKiBPbmUgbW9yZSBmcmFnbWVudCBpbiBtZXNzYWdlIChldmVuIGlmIHRoaXMgd2FzIGxhc3QpICovCisJCSsrY2wtPnJlY3ZfbXNnX251bV9mcmFnczsKKworCQkvKgorCQkgKiBXZSBjYW4gc2FmZWx5IGJyZWFrIGhlcmUgKGFuZCBpbiBCSCB0b28pLAorCQkgKiBhIHNpbmdsZSBpbnB1dCBtZXNzYWdlIGNhbiBnbyBvbmx5IHRvIGEgc2luZ2xlIHJlcXVlc3QhCisJCSAqLworCQlicmVhazsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlYWRfbGlzdF9zcGlubG9jaywgZGV2X2ZsYWdzKTsKKwkvKiBJZiBpdCdzIG5vYm9keSdzIG1lc3NhZ2UsIGp1c3QgcmVhZCBhbmQgZGlzY2FyZCBpdCAqLworCWlmICghYnVmZmVyKSB7CisJCXVpbnQ4X3QJcmRfbXNnX2J1ZltJU0hUUF9SRF9NU0dfQlVGX1NJWkVdOworCisJCWRldl9lcnIoZGV2LT5kZXZjLCAiRHJvcHBlZCBSeCBtc2cgLSBubyByZXF1ZXN0XG4iKTsKKwkJZGV2LT5vcHMtPmlzaHRwX3JlYWQoZGV2LCByZF9tc2dfYnVmLCBpc2h0cF9oZHItPmxlbmd0aCk7CisJCWdvdG8JZW9pOworCX0KKworCWlmIChjb21wbGV0ZV9yYikgeworCQlnZXRuc3RpbWVvZmRheSgmY2wtPnRzX3J4KTsKKwkJKytjbC0+cmVjdl9tc2dfY250X2lwYzsKKwkJaXNodHBfY2xfcmVhZF9jb21wbGV0ZShjb21wbGV0ZV9yYik7CisJfQorZW9pOgorCXJldHVybjsKK30KKworLyoqCisgKiByZWN2X2lzaHRwX2NsX21zZ19kbWEoKSAtUmVjZWl2ZSBjbGllbnQgbWVzc2FnZQorICogQGRldjogSVNIVFAgZGV2aWNlIGluc3RhbmNlCisgKiBAbXNnOiBtZXNzYWdlIHBvaW50ZXIKKyAqIEBoYm06IGhibSBidWZmZXIKKyAqCisgKiBSZWNlaXZlIGFuZCBkaXNwYXRjaCBJU0hUUCBjbGllbnQgbWVzc2FnZXMgdXNpbmcgRE1BLiBUaGlzIGZ1bmN0aW9uIGV4ZWN1dGVzCisgKiBpbiBJU1IgY29udGV4dAorICovCit2b2lkIHJlY3ZfaXNodHBfY2xfbXNnX2RtYShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsIHZvaWQgKm1zZywKKwkJCSAgIHN0cnVjdCBkbWFfeGZlcl9oYm0gKmhibSkKK3sKKwlzdHJ1Y3QgaXNodHBfY2wgKmNsOworCXN0cnVjdCBpc2h0cF9jbF9yYiAqcmI7CisJc3RydWN0IGlzaHRwX2NsX3JiICpuZXdfcmI7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyID0gTlVMTDsKKwlzdHJ1Y3QgaXNodHBfY2xfcmIgKmNvbXBsZXRlX3JiID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nCWRldl9mbGFnczsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cmVhZF9saXN0X3NwaW5sb2NrLCBkZXZfZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocmIsICZkZXYtPnJlYWRfbGlzdC5saXN0LCBsaXN0KSB7CisJCWNsID0gcmItPmNsOworCQlpZiAoIWNsIHx8ICEoY2wtPmhvc3RfY2xpZW50X2lkID09IGhibS0+aG9zdF9jbGllbnRfaWQgJiYKKwkJCQljbC0+ZndfY2xpZW50X2lkID09IGhibS0+ZndfY2xpZW50X2lkKSB8fAorCQkJCSEoY2wtPnN0YXRlID09IElTSFRQX0NMX0NPTk5FQ1RFRCkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBJZiBubyBSeCBidWZmZXIgaXMgYWxsb2NhdGVkLCBkaXNiYW5kIHRoZSByYgorCQkgKi8KKwkJaWYgKHJiLT5idWZmZXIuc2l6ZSA9PSAwIHx8IHJiLT5idWZmZXIuZGF0YSA9PSBOVUxMKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJlYWRfbGlzdF9zcGlubG9jaywKKwkJCQlkZXZfZmxhZ3MpOworCQkJZGV2X2VycigmY2wtPmRldmljZS0+ZGV2LAorCQkJCSJyZXNwb25zZSBidWZmZXIgaXMgbm90IGFsbG9jYXRlZC5cbiIpOworCQkJbGlzdF9kZWwoJnJiLT5saXN0KTsKKwkJCWlzaHRwX2lvX3JiX2ZyZWUocmIpOworCQkJY2wtPnN0YXR1cyA9IC1FTk9NRU07CisJCQlnb3RvCWVvaTsKKwkJfQorCisJCS8qCisJCSAqIElmIG1lc3NhZ2UgYnVmZmVyIG92ZXJmbG93biAoZXhjZWVkcyBtYXguIGNsaWVudCBtc2cKKwkJICogc2l6ZSwgZHJvcCBtZXNzYWdlIGFuZCByZXR1cm4gdG8gZnJlZSBidWZmZXIuCisJCSAqIERvIHdlIG5lZWQgdG8gZGlzY29ubmVjdCBzdWNoIGEgY2xpZW50PyAoV2UgZG9uJ3Qgc2VuZAorCQkgKiBiYWNrIEZDLCBzbyBjb21tdW5pY2F0aW9uIHdpbGwgYmUgc3R1Y2sgYW55d2F5KQorCQkgKi8KKwkJaWYgKHJiLT5idWZmZXIuc2l6ZSA8IGhibS0+bXNnX2xlbmd0aCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5yZWFkX2xpc3Rfc3BpbmxvY2ssCisJCQkJZGV2X2ZsYWdzKTsKKwkJCWRldl9lcnIoJmNsLT5kZXZpY2UtPmRldiwKKwkJCQkibWVzc2FnZSBvdmVyZmxvdy4gc2l6ZSAlZCBsZW4gJWQgaWR4ICVsZFxuIiwKKwkJCQlyYi0+YnVmZmVyLnNpemUsIGhibS0+bXNnX2xlbmd0aCwgcmItPmJ1Zl9pZHgpOworCQkJbGlzdF9kZWwoJnJiLT5saXN0KTsKKwkJCWlzaHRwX2NsX2lvX3JiX3JlY3ljbGUocmIpOworCQkJY2wtPnN0YXR1cyA9IC1FSU87CisJCQlnb3RvCWVvaTsKKwkJfQorCisJCWJ1ZmZlciA9IHJiLT5idWZmZXIuZGF0YTsKKwkJbWVtY3B5KGJ1ZmZlciwgbXNnLCBoYm0tPm1zZ19sZW5ndGgpOworCQlyYi0+YnVmX2lkeCA9IGhibS0+bXNnX2xlbmd0aDsKKworCQkvKiBMYXN0IGZyYWdtZW50IGluIG1lc3NhZ2UgLSBpdCdzIGNvbXBsZXRlICovCisJCWNsLT5zdGF0dXMgPSAwOworCQlsaXN0X2RlbCgmcmItPmxpc3QpOworCQljb21wbGV0ZV9yYiA9IHJiOworCisJCS0tY2wtPm91dF9mbG93X2N0cmxfY3JlZHM7CisJCS8qCisJCSAqIHRoZSB3aG9sZSBtc2cgYXJyaXZlZCwgc2VuZCBhIG5ldyBGQywgYW5kIGFkZCBhIG5ldworCQkgKiByYiBidWZmZXIgZm9yIHRoZSBuZXh0IGNvbWluZyBtc2cKKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjbC0+ZnJlZV9saXN0X3NwaW5sb2NrLCBmbGFncyk7CisKKwkJaWYgKCFsaXN0X2VtcHR5KCZjbC0+ZnJlZV9yYl9saXN0Lmxpc3QpKSB7CisJCQluZXdfcmIgPSBsaXN0X2VudHJ5KGNsLT5mcmVlX3JiX2xpc3QubGlzdC5uZXh0LAorCQkJCXN0cnVjdCBpc2h0cF9jbF9yYiwgbGlzdCk7CisJCQlsaXN0X2RlbF9pbml0KCZuZXdfcmItPmxpc3QpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPmZyZWVfbGlzdF9zcGlubG9jaywKKwkJCQlmbGFncyk7CisJCQluZXdfcmItPmNsID0gY2w7CisJCQluZXdfcmItPmJ1Zl9pZHggPSAwOworCQkJSU5JVF9MSVNUX0hFQUQoJm5ld19yYi0+bGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZuZXdfcmItPmxpc3QsCisJCQkJJmRldi0+cmVhZF9saXN0Lmxpc3QpOworCisJCQlpc2h0cF9oYm1fY2xfZmxvd19jb250cm9sX3JlcShkZXYsIGNsKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsLT5mcmVlX2xpc3Rfc3BpbmxvY2ssCisJCQkJZmxhZ3MpOworCQl9CisKKwkJLyogT25lIG1vcmUgZnJhZ21lbnQgaW4gbWVzc2FnZSAodGhpcyBpcyBhbHdheXMgbGFzdCkgKi8KKwkJKytjbC0+cmVjdl9tc2dfbnVtX2ZyYWdzOworCisJCS8qCisJCSAqIFdlIGNhbiBzYWZlbHkgYnJlYWsgaGVyZSAoYW5kIGluIEJIIHRvbyksCisJCSAqIGEgc2luZ2xlIGlucHV0IG1lc3NhZ2UgY2FuIGdvIG9ubHkgdG8gYSBzaW5nbGUgcmVxdWVzdCEKKwkJICovCisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmVhZF9saXN0X3NwaW5sb2NrLCBkZXZfZmxhZ3MpOworCS8qIElmIGl0J3Mgbm9ib2R5J3MgbWVzc2FnZSwganVzdCByZWFkIGFuZCBkaXNjYXJkIGl0ICovCisJaWYgKCFidWZmZXIpIHsKKwkJZGV2X2VycihkZXYtPmRldmMsICJEcm9wcGVkIFJ4IChETUEpIG1zZyAtIG5vIHJlcXVlc3RcbiIpOworCQlnb3RvCWVvaTsKKwl9CisKKwlpZiAoY29tcGxldGVfcmIpIHsKKwkJZ2V0bnN0aW1lb2ZkYXkoJmNsLT50c19yeCk7CisJCSsrY2wtPnJlY3ZfbXNnX2NudF9kbWE7CisJCWlzaHRwX2NsX3JlYWRfY29tcGxldGUoY29tcGxldGVfcmIpOworCX0KK2VvaToKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwL2NsaWVudC5oIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC9jbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRkMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC9jbGllbnQuaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIElTSFRQIGNsaWVudCBsb2dpYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfSVNIVFBfQ0xJRU5UX0hfCisjZGVmaW5lIF9JU0hUUF9DTElFTlRfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAiaXNodHAtZGV2LmgiCisKKy8qIENsaWVudCBzdGF0ZSAqLworZW51bSBjbF9zdGF0ZSB7CisJSVNIVFBfQ0xfSU5JVElBTElaSU5HID0gMCwKKwlJU0hUUF9DTF9DT05ORUNUSU5HLAorCUlTSFRQX0NMX0NPTk5FQ1RFRCwKKwlJU0hUUF9DTF9ESVNDT05ORUNUSU5HLAorCUlTSFRQX0NMX0RJU0NPTk5FQ1RFRAorfTsKKworLyogVHggYW5kIFJ4IHJpbmcgc2l6ZSAqLworI2RlZmluZQlDTF9ERUZfUlhfUklOR19TSVpFCTIKKyNkZWZpbmUJQ0xfREVGX1RYX1JJTkdfU0laRQkyCisjZGVmaW5lCUNMX01BWF9SWF9SSU5HX1NJWkUJMzIKKyNkZWZpbmUJQ0xfTUFYX1RYX1JJTkdfU0laRQkzMgorCisjZGVmaW5lIERNQV9TTE9UX1NJWkUJCTQwOTYKKy8qIE51bWJlciBvZiBJUEMgZnJhZ21lbnRzIGFmdGVyIHdoaWNoIGl0J3Mgd29ydGggc2VuZGluZyB2aWEgRE1BICovCisjZGVmaW5lCURNQV9XT1JUSF9USFJFU0hPTEQJMworCisvKiBETUEvSVBDIFR4IHBhdGhzLiBPdGhlciB0aGUgZGVmYXVsdCBtZWFucyBlbmZvcmNlbWVudCAqLworI2RlZmluZQlDTF9UWF9QQVRIX0RFRkFVTFQJMAorI2RlZmluZQlDTF9UWF9QQVRIX0lQQwkJMQorI2RlZmluZQlDTF9UWF9QQVRIX0RNQQkJMgorCisvKiBDbGllbnQgVHggYnVmZmVyIGxpc3QgZW50cnkgKi8KK3N0cnVjdCBpc2h0cF9jbF90eF9yaW5nIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJc3RydWN0IGlzaHRwX21zZ19kYXRhCXNlbmRfYnVmOworfTsKKworLyogSVNIVFAgY2xpZW50IGluc3RhbmNlICovCitzdHJ1Y3QgaXNodHBfY2wgeworCXN0cnVjdCBsaXN0X2hlYWQJbGluazsKKwlzdHJ1Y3QgaXNodHBfZGV2aWNlCSpkZXY7CisJZW51bSBjbF9zdGF0ZQkJc3RhdGU7CisJaW50CQkJc3RhdHVzOworCisJLyogTGluayB0byBJU0hUUCBidXMgZGV2aWNlICovCisJc3RydWN0IGlzaHRwX2NsX2RldmljZQkqZGV2aWNlOworCisJLyogSUQgb2YgY2xpZW50IGNvbm5lY3RlZCAqLworCXVpbnQ4X3QJaG9zdF9jbGllbnRfaWQ7CisJdWludDhfdAlmd19jbGllbnRfaWQ7CisJdWludDhfdAlpc2h0cF9mbG93X2N0cmxfY3JlZHM7CisJdWludDhfdAlvdXRfZmxvd19jdHJsX2NyZWRzOworCisJLyogZG1hICovCisJaW50CWxhc3RfdHhfcGF0aDsKKwkvKiAwOiBhY2sgd2Fzbid0IHJlY2VpdmVkLDE6YWNrIHdhcyByZWNlaXZlZCAqLworCWludAlsYXN0X2RtYV9hY2tlZDsKKwl1bnNpZ25lZCBjaGFyCSpsYXN0X2RtYV9hZGRyOworCS8qIDA6IGFjayB3YXNuJ3QgcmVjZWl2ZWQsMTphY2sgd2FzIHJlY2VpdmVkICovCisJaW50CWxhc3RfaXBjX2Fja2VkOworCisJLyogUnggcmluZyBidWZmZXIgcG9vbCAqLworCXVuc2lnbmVkIGludAlyeF9yaW5nX3NpemU7CisJc3RydWN0IGlzaHRwX2NsX3JiCWZyZWVfcmJfbGlzdDsKKwlzcGlubG9ja190CWZyZWVfbGlzdF9zcGlubG9jazsKKwkvKiBSeCBpbi1wcm9jZXNzIGxpc3QgKi8KKwlzdHJ1Y3QgaXNodHBfY2xfcmIJaW5fcHJvY2Vzc19saXN0OworCXNwaW5sb2NrX3QJaW5fcHJvY2Vzc19zcGlubG9jazsKKworCS8qIENsaWVudCBUeCBidWZmZXJzIGxpc3QgKi8KKwl1bnNpZ25lZCBpbnQJdHhfcmluZ19zaXplOworCXN0cnVjdCBpc2h0cF9jbF90eF9yaW5nCXR4X2xpc3QsIHR4X2ZyZWVfbGlzdDsKKwlzcGlubG9ja190CXR4X2xpc3Rfc3BpbmxvY2s7CisJc3BpbmxvY2tfdAl0eF9mcmVlX2xpc3Rfc3BpbmxvY2s7CisJc2l6ZV90CXR4X29mZnM7CS8qIE9mZnNldCBpbiBidWZmZXIgYXQgaGVhZCBvZiAndHhfbGlzdCcgKi8KKworCS8qKgorCSAqIGlmIHdlIGdldCBhIEZDLCBhbmQgdGhlIGxpc3QgaXMgbm90IGVtcHR5LCB3ZSBtdXN0IGtub3cgd2hldGhlciB3ZQorCSAqIGFyZSBhdCB0aGUgbWlkZGxlIG9mIHNlbmRpbmcuCisJICogaWYgc28gLW5lZWQgdG8gaW5jcmVhc2UgRkMgY291bnRlciwgb3RoZXJ3aXNlLCBuZWVkIHRvIHN0YXJ0IHNlbmRpbmcKKwkgKiB0aGUgZmlyc3QgbXNnIGluIGxpc3QKKwkgKiAoISlUaGlzIGlzIGZvciBjb3VudGluZy1GQyBpbXBsZW1lbnRhdGlvbiBvbmx5LiBXaXRoaW4gc2luZ2xlLUZDIHRoZQorCSAqIG90aGVyIHBhcnR5IG1heSBOT1Qgc2VuZCBGQyB1bnRpbCBpdCByZWNlaXZlcyBjb21wbGV0ZSBtZXNzYWdlCisJICovCisJaW50CXNlbmRpbmc7CisKKwkvKiBTZW5kIEZDIHNwaW5sb2NrICovCisJc3BpbmxvY2tfdAlmY19zcGlubG9jazsKKworCS8qIHdhaXQgcXVldWUgZm9yIGNvbm5lY3QgYW5kIGRpc2Nvbm5lY3QgcmVzcG9uc2UgZnJvbSBGVyAqLworCXdhaXRfcXVldWVfaGVhZF90CXdhaXRfY3RybF9yZXM7CisKKwkvKiBFcnJvciBzdGF0cyAqLworCXVuc2lnbmVkIGludAllcnJfc2VuZF9tc2c7CisJdW5zaWduZWQgaW50CWVycl9zZW5kX2ZjOworCisJLyogU2VuZC9yZWN2IHN0YXRzICovCisJdW5zaWduZWQgaW50CXNlbmRfbXNnX2NudF9pcGM7CisJdW5zaWduZWQgaW50CXNlbmRfbXNnX2NudF9kbWE7CisJdW5zaWduZWQgaW50CXJlY3ZfbXNnX2NudF9pcGM7CisJdW5zaWduZWQgaW50CXJlY3ZfbXNnX2NudF9kbWE7CisJdW5zaWduZWQgaW50CXJlY3ZfbXNnX251bV9mcmFnczsKKwl1bnNpZ25lZCBpbnQJaXNodHBfZmxvd19jdHJsX2NudDsKKwl1bnNpZ25lZCBpbnQJb3V0X2Zsb3dfY3RybF9jbnQ7CisKKwkvKiBSeCBtc2cgLi4uIG91dCBGQyB0aW1pbmcgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgdHNfcng7CisJc3RydWN0IHRpbWVzcGVjIHRzX291dF9mYzsKKwlzdHJ1Y3QgdGltZXNwZWMgdHNfbWF4X2ZjX2RlbGF5OworCXZvaWQgKmNsaWVudF9kYXRhOworfTsKKworLyogQ2xpZW50IGNvbm5lY3Rpb24gbWFuYWdlbm1lbnQgaW50ZXJuYWwgZnVuY3Rpb25zICovCitpbnQgaXNodHBfY2FuX2NsaWVudF9jb25uZWN0KHN0cnVjdCBpc2h0cF9kZXZpY2UgKmlzaHRwX2RldiwgdXVpZF9sZSAqdXVpZCk7CitpbnQgaXNodHBfZndfY2xfYnlfaWQoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LCB1aW50OF90IGNsaWVudF9pZCk7Cit2b2lkIGlzaHRwX2NsX3NlbmRfbXNnKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwgc3RydWN0IGlzaHRwX2NsICpjbCk7Cit2b2lkIHJlY3ZfaXNodHBfY2xfbXNnKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwkJICAgICAgIHN0cnVjdCBpc2h0cF9tc2dfaGRyICppc2h0cF9oZHIpOworaW50IGlzaHRwX2NsX3JlYWRfc3RhcnQoc3RydWN0IGlzaHRwX2NsICpjbCk7CisKKy8qIFJpbmcgQnVmZmVyIEkvRiAqLworaW50IGlzaHRwX2NsX2FsbG9jX3J4X3Jpbmcoc3RydWN0IGlzaHRwX2NsICpjbCk7CitpbnQgaXNodHBfY2xfYWxsb2NfdHhfcmluZyhzdHJ1Y3QgaXNodHBfY2wgKmNsKTsKK3ZvaWQgaXNodHBfY2xfZnJlZV9yeF9yaW5nKHN0cnVjdCBpc2h0cF9jbCAqY2wpOwordm9pZCBpc2h0cF9jbF9mcmVlX3R4X3Jpbmcoc3RydWN0IGlzaHRwX2NsICpjbCk7CisKKy8qIERNQSBJL0YgZnVuY3Rpb25zICovCit2b2lkIHJlY3ZfaXNodHBfY2xfbXNnX2RtYShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsIHZvaWQgKm1zZywKKwkJCSAgIHN0cnVjdCBkbWFfeGZlcl9oYm0gKmhibSk7Cit2b2lkIGlzaHRwX2NsX2FsbG9jX2RtYV9idWYoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KTsKK3ZvaWQgaXNodHBfY2xfZnJlZV9kbWFfYnVmKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldik7Cit2b2lkICppc2h0cF9jbF9nZXRfZG1hX3NlbmRfYnVmKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwkJCQl1aW50MzJfdCBzaXplKTsKK3ZvaWQgaXNodHBfY2xfcmVsZWFzZV9kbWFfYWNrZWRfbWVtKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwkJCQkgICAgdm9pZCAqbXNnX2FkZHIsCisJCQkJICAgIHVpbnQ4X3Qgc2l6ZSk7CisKKy8qIFJlcXVlc3QgYmxvY2tzIGFsbG9jL2ZyZWUgSS9GICovCitzdHJ1Y3QgaXNodHBfY2xfcmIgKmlzaHRwX2lvX3JiX2luaXQoc3RydWN0IGlzaHRwX2NsICpjbCk7Cit2b2lkIGlzaHRwX2lvX3JiX2ZyZWUoc3RydWN0IGlzaHRwX2NsX3JiICpwcml2X3JiKTsKK2ludCBpc2h0cF9pb19yYl9hbGxvY19idWYoc3RydWN0IGlzaHRwX2NsX3JiICpyYiwgc2l6ZV90IGxlbmd0aCk7CisKKy8qKgorICogaXNodHBfY2xfY21wX2lkIC0gdGVsbHMgaWYgZmlsZSBwcml2YXRlIGRhdGEgaGF2ZSBzYW1lIGlkCisgKiByZXR1cm5zIHRydWUgIC0gaWYgaWRzIGFyZSB0aGUgc2FtZSBhbmQgbm90IE5VTEwKKyAqLworc3RhdGljIGlubGluZSBib29sIGlzaHRwX2NsX2NtcF9pZChjb25zdCBzdHJ1Y3QgaXNodHBfY2wgKmNsMSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgaXNodHBfY2wgKmNsMikKK3sKKwlyZXR1cm4gY2wxICYmIGNsMiAmJgorCQkoY2wxLT5ob3N0X2NsaWVudF9pZCA9PSBjbDItPmhvc3RfY2xpZW50X2lkKSAmJgorCQkoY2wxLT5md19jbGllbnRfaWQgPT0gY2wyLT5md19jbGllbnRfaWQpOworfQorCisvKiBleHBvcnRlZCBmdW5jdGlvbnMgZnJvbSBJU0hUUCB1bmRlciBjbGllbnQgbWFuYWdlbWVudCBzY29wZSAqLworc3RydWN0IGlzaHRwX2NsCSppc2h0cF9jbF9hbGxvY2F0ZShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpOwordm9pZCBpc2h0cF9jbF9mcmVlKHN0cnVjdCBpc2h0cF9jbCAqY2wpOworaW50IGlzaHRwX2NsX2xpbmsoc3RydWN0IGlzaHRwX2NsICpjbCwgaW50IGlkKTsKK3ZvaWQgaXNodHBfY2xfdW5saW5rKHN0cnVjdCBpc2h0cF9jbCAqY2wpOworaW50IGlzaHRwX2NsX2Rpc2Nvbm5lY3Qoc3RydWN0IGlzaHRwX2NsICpjbCk7CitpbnQgaXNodHBfY2xfY29ubmVjdChzdHJ1Y3QgaXNodHBfY2wgKmNsKTsKK2ludCBpc2h0cF9jbF9zZW5kKHN0cnVjdCBpc2h0cF9jbCAqY2wsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGxlbmd0aCk7CitpbnQgaXNodHBfY2xfZmx1c2hfcXVldWVzKHN0cnVjdCBpc2h0cF9jbCAqY2wpOworCisvKiBleHBvcnRlZCBmdW5jdGlvbnMgZnJvbSBJU0hUUCBjbGllbnQgYnVmZmVyIG1hbmFnZW1lbnQgc2NvcGUgKi8KK2ludCBpc2h0cF9jbF9pb19yYl9yZWN5Y2xlKHN0cnVjdCBpc2h0cF9jbF9yYiAqcmIpOworCisjZW5kaWYgLyogX0lTSFRQX0NMSUVOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC9kbWEtaWYuYyBiL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAvZG1hLWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4M2YzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAvZG1hLWlmLmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBJU0hUUCBETUEgSS9GIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSAiaXNodHAtZGV2LmgiCisjaW5jbHVkZSAiY2xpZW50LmgiCisKKy8qKgorICogaXNodHBfY2xfYWxsb2NfZG1hX2J1ZigpIC0gQWxsb2NhdGUgRE1BIFJYIGFuZCBUWCBidWZmZXIKKyAqIEBkZXY6IGlzaHRwIGRldmljZQorICoKKyAqIEFsbG9jYXRlIFJYIGFuZCBUWCBETUEgYnVmZmVyIG9uY2UgZHVyaW5nIGJ1cyBzZXR1cC4KKyAqIEl0IGFsbG9jYXRlcyAxTUIsIFJYIGFuZCBUWCBETUEgYnVmZmVyLCB3aGljaCBhcmUgZGl2aWRlZAorICogaW50byBzbG90cy4KKyAqLwordm9pZAlpc2h0cF9jbF9hbGxvY19kbWFfYnVmKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldikKK3sKKwlkbWFfYWRkcl90CWg7CisKKwlpZiAoZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWYpCisJCXJldHVybjsKKworCWRldi0+aXNodHBfaG9zdF9kbWFfdHhfYnVmX3NpemUgPSAxMDI0KjEwMjQ7CisJZGV2LT5pc2h0cF9ob3N0X2RtYV9yeF9idWZfc2l6ZSA9IDEwMjQqMTAyNDsKKworCS8qIEFsbG9jYXRlIFR4IGJ1ZmZlciBhbmQgaW5pdCB1c2FnZSBiaXRtYXAgKi8KKwlkZXYtPmlzaHRwX2hvc3RfZG1hX3R4X2J1ZiA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYtPmRldmMsCisJCQkJCWRldi0+aXNodHBfaG9zdF9kbWFfdHhfYnVmX3NpemUsCisJCQkJCSZoLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWYpCisJCWRldi0+aXNodHBfaG9zdF9kbWFfdHhfYnVmX3BoeXMgPSBoOworCisJZGV2LT5pc2h0cF9kbWFfbnVtX3Nsb3RzID0gZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWZfc2l6ZSAvCisJCQkJCQlETUFfU0xPVF9TSVpFOworCisJZGV2LT5pc2h0cF9kbWFfdHhfbWFwID0ga2NhbGxvYyhkZXYtPmlzaHRwX2RtYV9udW1fc2xvdHMsCisJCQkJCXNpemVvZih1aW50OF90KSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+aXNodHBfZG1hX3R4X2xvY2spOworCisJLyogQWxsb2NhdGUgUnggYnVmZmVyICovCisJZGV2LT5pc2h0cF9ob3N0X2RtYV9yeF9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LT5kZXZjLAorCQkJCQlkZXYtPmlzaHRwX2hvc3RfZG1hX3J4X2J1Zl9zaXplLAorCQkJCQkgJmgsIEdGUF9LRVJORUwpOworCisJaWYgKGRldi0+aXNodHBfaG9zdF9kbWFfcnhfYnVmKQorCQlkZXYtPmlzaHRwX2hvc3RfZG1hX3J4X2J1Zl9waHlzID0gaDsKK30KKworLyoqCisgKiBpc2h0cF9jbF9mcmVlX2RtYV9idWYoKSAtIEZyZWUgRE1BIFJYIGFuZCBUWCBidWZmZXIKKyAqIEBkZXY6IGlzaHRwIGRldmljZQorICoKKyAqIEZyZWUgRE1BIGJ1ZmZlciB3aGVuIGFsbCBjbGllbnRzIGFyZSByZWxlYXNlZC4gVGhpcyBpcworICogb25seSBoYXBwZW5zIGR1cmluZyBlcnJvciBwYXRoIGluIElTSCBidWlsdCBpbiBkcml2ZXIKKyAqIG1vZGVsCisgKi8KK3ZvaWQJaXNodHBfY2xfZnJlZV9kbWFfYnVmKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldikKK3sKKwlkbWFfYWRkcl90CWg7CisKKwlpZiAoZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWYpIHsKKwkJaCA9IGRldi0+aXNodHBfaG9zdF9kbWFfdHhfYnVmX3BoeXM7CisJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+ZGV2YywgZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWZfc2l6ZSwKKwkJCQkgIGRldi0+aXNodHBfaG9zdF9kbWFfdHhfYnVmLCBoKTsKKwl9CisKKwlpZiAoZGV2LT5pc2h0cF9ob3N0X2RtYV9yeF9idWYpIHsKKwkJaCA9IGRldi0+aXNodHBfaG9zdF9kbWFfcnhfYnVmX3BoeXM7CisJCWRtYV9mcmVlX2NvaGVyZW50KGRldi0+ZGV2YywgZGV2LT5pc2h0cF9ob3N0X2RtYV9yeF9idWZfc2l6ZSwKKwkJCQkgIGRldi0+aXNodHBfaG9zdF9kbWFfcnhfYnVmLCBoKTsKKwl9CisKKwlrZnJlZShkZXYtPmlzaHRwX2RtYV90eF9tYXApOworCWRldi0+aXNodHBfaG9zdF9kbWFfdHhfYnVmID0gTlVMTDsKKwlkZXYtPmlzaHRwX2hvc3RfZG1hX3J4X2J1ZiA9IE5VTEw7CisJZGV2LT5pc2h0cF9kbWFfdHhfbWFwID0gTlVMTDsKK30KKworLyoKKyAqIGlzaHRwX2NsX2dldF9kbWFfc2VuZF9idWYoKSAtIEdldCBhIERNQSBtZW1vcnkgc2xvdAorICogQGRldjoJaXNodHAgZGV2aWNlCisgKiBAc2l6ZToJU2l6ZSBvZiBtZW1vcnkgdG8gZ2V0CisgKgorICogRmluZCBhbmQgcmV0dXJuIGZyZWUgYWRkcmVzcyBvZiAic2l6ZSIgYnl0ZXMgaW4gZG1hIHR4IGJ1ZmZlci4KKyAqIHRoZSBmdW5jdGlvbiB3aWxsIG1hcmsgdGhpcyBhZGRyZXNzIGFzICJpbi11c2VkIiBtZW1vcnkuCisgKgorICogUmV0dXJuOiBOVUxMIHdoZW4gbm8gZnJlZSBidWZmZXIgZWxzZSBhIGJ1ZmZlciB0byBjb3B5CisgKi8KK3ZvaWQgKmlzaHRwX2NsX2dldF9kbWFfc2VuZF9idWYoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LAorCQkJCXVpbnQzMl90IHNpemUpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQgaSwgaiwgZnJlZTsKKwkvKiBhZGRpdGlvbmFsIHNsb3QgaXMgbmVlZGVkIGlmIHRoZXJlIGlzIHJlbSAqLworCWludCByZXF1aXJlZF9zbG90cyA9IChzaXplIC8gRE1BX1NMT1RfU0laRSkKKwkJKyAxICogKHNpemUgJSBETUFfU0xPVF9TSVpFICE9IDApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXNodHBfZG1hX3R4X2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDw9IChkZXYtPmlzaHRwX2RtYV9udW1fc2xvdHMgLSByZXF1aXJlZF9zbG90cyk7IGkrKykgeworCQlmcmVlID0gMTsKKwkJZm9yIChqID0gMDsgaiA8IHJlcXVpcmVkX3Nsb3RzOyBqKyspCisJCQlpZiAoZGV2LT5pc2h0cF9kbWFfdHhfbWFwW2kral0pIHsKKwkJCQlmcmVlID0gMDsKKwkJCQlpICs9IGo7CisJCQkJYnJlYWs7CisJCQl9CisJCWlmIChmcmVlKSB7CisJCQkvKiBtYXJrIG1lbW9yeSBhcyAiY2F1Z2h0IiAqLworCQkJZm9yIChqID0gMDsgaiA8IHJlcXVpcmVkX3Nsb3RzOyBqKyspCisJCQkJZGV2LT5pc2h0cF9kbWFfdHhfbWFwW2kral0gPSAxOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pc2h0cF9kbWFfdHhfbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIChpICogRE1BX1NMT1RfU0laRSkgKworCQkJCSh1bnNpZ25lZCBjaGFyICopZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWY7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pc2h0cF9kbWFfdHhfbG9jaywgZmxhZ3MpOworCWRldl9lcnIoZGV2LT5kZXZjLCAiTm8gZnJlZSBETUEgYnVmZmVyIHRvIHNlbmQgbXNnXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIGlzaHRwX2NsX3JlbGVhc2VfZG1hX2Fja2VkX21lbSgpIC0gUmVsZWFzZSBETUEgbWVtb3J5IHNsb3QKKyAqIEBkZXY6CWlzaHRwIGRldmljZQorICogQG1zZ19hZGRyOgltZXNzYWdlIGFkZHJlc3Mgb2Ygc2xvdAorICogQHNpemU6CVNpemUgb2YgbWVtb3J5IHRvIGdldAorICoKKyAqIFJlbGVhc2VfZG1hX2Fja2VkX21lbSAtIHJldHVybmVzIHRoZSBhY2tlZCBtZW1vcnkgdG8gZnJlZSBsaXN0LgorICogKGZyb20gbXNnX2FkZHIsIHNpemUgYnl0ZXMgbG9uZykKKyAqLwordm9pZCBpc2h0cF9jbF9yZWxlYXNlX2RtYV9hY2tlZF9tZW0oc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LAorCQkJCSAgICB2b2lkICptc2dfYWRkciwKKwkJCQkgICAgdWludDhfdCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJaW50IGFja2VkX3Nsb3RzID0gKHNpemUgLyBETUFfU0xPVF9TSVpFKQorCQkrIDEgKiAoc2l6ZSAlIERNQV9TTE9UX1NJWkUgIT0gMCk7CisJaW50IGksIGo7CisKKwlpZiAoKG1zZ19hZGRyIC0gZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWYpICUgRE1BX1NMT1RfU0laRSkgeworCQlkZXZfZXJyKGRldi0+ZGV2YywgIkJhZCBETUEgVHggYWNrIGFkZHJlc3NcbiIpOworCQlyZXR1cm47CisJfQorCisJaSA9IChtc2dfYWRkciAtIGRldi0+aXNodHBfaG9zdF9kbWFfdHhfYnVmKSAvIERNQV9TTE9UX1NJWkU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXNodHBfZG1hX3R4X2xvY2ssIGZsYWdzKTsKKwlmb3IgKGogPSAwOyBqIDwgYWNrZWRfc2xvdHM7IGorKykgeworCQlpZiAoKGkgKyBqKSA+PSBkZXYtPmlzaHRwX2RtYV9udW1fc2xvdHMgfHwKKwkJCQkJIWRldi0+aXNodHBfZG1hX3R4X21hcFtpK2pdKSB7CisJCQkvKiBubyBzdWNoIHNsb3QsIG9yIG1lbW9yeSBpcyBhbHJlYWR5IGZyZWUgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXNodHBfZG1hX3R4X2xvY2ssIGZsYWdzKTsKKwkJCWRldl9lcnIoZGV2LT5kZXZjLCAiQmFkIERNQSBUeCBhY2sgYWRkcmVzc1xuIik7CisJCQlyZXR1cm47CisJCX0KKwkJZGV2LT5pc2h0cF9kbWFfdHhfbWFwW2kral0gPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlzaHRwX2RtYV90eF9sb2NrLCBmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwL2hibS5jIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC9oYm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGJmZmVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC9oYm0uYwpAQCAtMCwwICsxLDEwMzIgQEAKKy8qCisgKiBJU0hUUCBidXMgbGF5ZXIgbWVzc2FnZXMgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSAiaXNodHAtZGV2LmgiCisjaW5jbHVkZSAiaGJtLmgiCisjaW5jbHVkZSAiY2xpZW50LmgiCisKKy8qKgorICogaXNodHBfaGJtX2Z3X2NsX2FsbG9jYXRlKCkgLSBBbGxvY2F0ZSBGVyBjbGllbnRzCisgKiBAZGV2OiBJU0hUUCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBBbGxvY2F0ZXMgc3RvcmFnZSBmb3IgZncgY2xpZW50cworICovCitzdGF0aWMgdm9pZCBpc2h0cF9oYm1fZndfY2xfYWxsb2NhdGUoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpc2h0cF9md19jbGllbnQgKmNsaWVudHM7CisJaW50IGI7CisKKwkvKiBjb3VudCBob3cgbWFueSBJU0ggY2xpZW50cyB3ZSBoYXZlICovCisJZm9yX2VhY2hfc2V0X2JpdChiLCBkZXYtPmZ3X2NsaWVudHNfbWFwLCBJU0hUUF9DTElFTlRTX01BWCkKKwkJZGV2LT5md19jbGllbnRzX251bSsrOworCisJaWYgKGRldi0+ZndfY2xpZW50c19udW0gPD0gMCkKKwkJcmV0dXJuOworCisJLyogYWxsb2NhdGUgc3RvcmFnZSBmb3IgZncgY2xpZW50cyByZXByZXNlbnRhdGlvbiAqLworCWNsaWVudHMgPSBrY2FsbG9jKGRldi0+ZndfY2xpZW50c19udW0sIHNpemVvZihzdHJ1Y3QgaXNodHBfZndfY2xpZW50KSwKKwkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbGllbnRzKSB7CisJCWRldi0+ZGV2X3N0YXRlID0gSVNIVFBfREVWX1JFU0VUVElORzsKKwkJaXNoX2h3X3Jlc2V0KGRldik7CisJCXJldHVybjsKKwl9CisJZGV2LT5md19jbGllbnRzID0gY2xpZW50czsKK30KKworLyoqCisgKiBpc2h0cF9oYm1fY2xfaGRyKCkgLSBjb25zdHJ1Y3QgY2xpZW50IGhibSBoZWFkZXIKKyAqIEBjbDogY2xpZW50CisgKiBAaGJtX2NtZDogaG9zdCBidXMgbWVzc2FnZSBjb21tYW5kCisgKiBAYnVmOiBidWZmZXIgZm9yIGNsIGhlYWRlcgorICogQGxlbjogYnVmZmVyIGxlbmd0aAorICoKKyAqIEluaXRpYWxpemUgSEJNIGJ1ZmZlcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXNodHBfaGJtX2NsX2hkcihzdHJ1Y3QgaXNodHBfY2wgKmNsLCB1aW50OF90IGhibV9jbWQsCisJdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpc2h0cF9oYm1fY2xfY21kICpjbWQgPSBidWY7CisKKwltZW1zZXQoY21kLCAwLCBsZW4pOworCisJY21kLT5oYm1fY21kID0gaGJtX2NtZDsKKwljbWQtPmhvc3RfYWRkciA9IGNsLT5ob3N0X2NsaWVudF9pZDsKKwljbWQtPmZ3X2FkZHIgPSBjbC0+ZndfY2xpZW50X2lkOworfQorCisvKioKKyAqIGlzaHRwX2hibV9jbF9hZGRyX2VxdWFsKCkgLSBDb21wYXJlIGNsaWVudCBhZGRyZXNzCisgKiBAY2w6IGNsaWVudAorICogQGJ1ZjogQ2xpZW50IGNvbW1hbmQgYnVmZmVyCisgKgorICogQ29tcGFyZSBjbGllbnQgYWRkcmVzcyB3aXRoIHRoZSBhZGRyZXNzIGluIGNvbW1hbmQgYnVmZmVyCisgKgorICogUmV0dXJuOiBUcnVlIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc2h0cF9oYm1fY2xfYWRkcl9lcXVhbChzdHJ1Y3QgaXNodHBfY2wgKmNsLCB2b2lkICpidWYpCit7CisJc3RydWN0IGlzaHRwX2hibV9jbF9jbWQgKmNtZCA9IGJ1ZjsKKworCXJldHVybiBjbC0+aG9zdF9jbGllbnRfaWQgPT0gY21kLT5ob3N0X2FkZHIgJiYKKwkJY2wtPmZ3X2NsaWVudF9pZCA9PSBjbWQtPmZ3X2FkZHI7Cit9CisKKy8qKgorICogaXNodHBfaGJtX3N0YXJ0X3dhaXQoKSAtIFdhaXQgZm9yIEhCTSBzdGFydCBtZXNzYWdlCisgKiBAZGV2OiBJU0hUUCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBXYWl0IGZvciBIQk0gc3RhcnQgbWVzc2FnZSBmcm9tIGZpcm13YXJlCisgKgorICogUmV0dXJuOiAwIGlmIEhCTSBzdGFydCBpcy93YXMgcmVjZWl2ZWQgZWxzZSB0aW1lb3V0IGVycm9yCisgKi8KK2ludCBpc2h0cF9oYm1fc3RhcnRfd2FpdChzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKworCWlmIChkZXYtPmhibV9zdGF0ZSA+IElTSFRQX0hCTV9TVEFSVCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGRldi0+ZGV2YywgIkdvaW5nIHRvIHdhaXQgZm9yIGlzaHRwIHN0YXJ0LiBoYm1fc3RhdGU9JTA4WFxuIiwKKwkJZGV2LT5oYm1fc3RhdGUpOworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGRldi0+d2FpdF9oYm1fcmVjdmRfbXNnLAorCQkJCQlkZXYtPmhibV9zdGF0ZSA+PSBJU0hUUF9IQk1fU1RBUlRFRCwKKwkJCQkJKElTSFRQX0lOVEVST1BfVElNRU9VVCAqIEhaKSk7CisKKwlkZXZfZGJnKGRldi0+ZGV2YywKKwkJIldva2UgdXAgZnJvbSB3YWl0aW5nIGZvciBpc2h0cCBzdGFydC4gaGJtX3N0YXRlPSUwOFhcbiIsCisJCWRldi0+aGJtX3N0YXRlKTsKKworCWlmIChyZXQgPD0gMCAmJiAoZGV2LT5oYm1fc3RhdGUgPD0gSVNIVFBfSEJNX1NUQVJUKSkgeworCQlkZXYtPmhibV9zdGF0ZSA9IElTSFRQX0hCTV9JRExFOworCQlkZXZfZXJyKGRldi0+ZGV2YywKKwkJIndhaXRpbmcgZm9yIGlzaHRwIHN0YXJ0IGZhaWxlZC4gcmV0PSVkIGhibV9zdGF0ZT0lMDhYXG4iLAorCQkJcmV0LCBkZXYtPmhibV9zdGF0ZSk7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpc2h0cF9oYm1fc3RhcnRfcmVxKCkgLSBTZW5kIEhCTSBzdGFydCBtZXNzYWdlCisgKiBAZGV2OiBJU0hUUCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBTZW5kIEhCTSBzdGFydCBtZXNzYWdlIHRvIGZpcm13YXJlCisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3MgZWxzZSBlcnJvciBjb2RlCisgKi8KK2ludCBpc2h0cF9oYm1fc3RhcnRfcmVxKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkciBoZHI7CisJdW5zaWduZWQgY2hhciBkYXRhWzEyOF07CisJc3RydWN0IGlzaHRwX21zZ19oZHIgKmlzaHRwX2hkciA9ICZoZHI7CisJc3RydWN0IGhibV9ob3N0X3ZlcnNpb25fcmVxdWVzdCAqc3RhcnRfcmVxOworCWNvbnN0IHNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IGhibV9ob3N0X3ZlcnNpb25fcmVxdWVzdCk7CisKKwlpc2h0cF9oYm1faGRyKGlzaHRwX2hkciwgbGVuKTsKKworCS8qIGhvc3Qgc3RhcnQgbWVzc2FnZSAqLworCXN0YXJ0X3JlcSA9IChzdHJ1Y3QgaGJtX2hvc3RfdmVyc2lvbl9yZXF1ZXN0ICopZGF0YTsKKwltZW1zZXQoc3RhcnRfcmVxLCAwLCBsZW4pOworCXN0YXJ0X3JlcS0+aGJtX2NtZCA9IEhPU1RfU1RBUlRfUkVRX0NNRDsKKwlzdGFydF9yZXEtPmhvc3RfdmVyc2lvbi5tYWpvcl92ZXJzaW9uID0gSEJNX01BSk9SX1ZFUlNJT047CisJc3RhcnRfcmVxLT5ob3N0X3ZlcnNpb24ubWlub3JfdmVyc2lvbiA9IEhCTV9NSU5PUl9WRVJTSU9OOworCisJLyoKKwkgKiAoISkgUmVzcG9uc2UgdG8gSEJNIHN0YXJ0IG1heSBiZSBzbyBxdWljayB0aGF0IHRoaXMgdGhyZWFkIHdvdWxkIGdldAorCSAqIHByZWVtcHRlZCBCRUZPUkUgbWFuYWdpbmcgdG8gc2V0IGhibV9zdGF0ZSA9IElTSFRQX0hCTV9TVEFSVC4KKwkgKiBTbyBzZXQgaXQgYXQgZmlyc3QsIGNoYW5nZSBiYWNrIHRvIElTSFRQX0hCTV9JRExFIHVwb24gZmFpbHVyZQorCSAqLworCWRldi0+aGJtX3N0YXRlID0gSVNIVFBfSEJNX1NUQVJUOworCWlmIChpc2h0cF93cml0ZV9tZXNzYWdlKGRldiwgaXNodHBfaGRyLCBkYXRhKSkgeworCQlkZXZfZXJyKGRldi0+ZGV2YywgInZlcnNpb24gbWVzc2FnZSBzZW5kIGZhaWxlZFxuIik7CisJCWRldi0+ZGV2X3N0YXRlID0gSVNIVFBfREVWX1JFU0VUVElORzsKKwkJZGV2LT5oYm1fc3RhdGUgPSBJU0hUUF9IQk1fSURMRTsKKwkJaXNoX2h3X3Jlc2V0KGRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlzaHRwX2hibV9lbnVtX2NsaWVudHNfcmVxKCkgLSBTZW5kIGNsaWVudCBlbnVtIHJlcQorICogQGRldjogSVNIVFAgZGV2aWNlIGluc3RhbmNlCisgKgorICogU2VuZCBlbnVtZXJhdGlvbiBjbGllbnQgcmVxdWVzdCBtZXNzYWdlCisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3MgZWxzZSBlcnJvciBjb2RlCisgKi8KK3ZvaWQgaXNodHBfaGJtX2VudW1fY2xpZW50c19yZXEoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpc2h0cF9tc2dfaGRyIGhkcjsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMTI4XTsKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkciAqaXNodHBfaGRyID0gJmhkcjsKKwlzdHJ1Y3QgaGJtX2hvc3RfZW51bV9yZXF1ZXN0ICplbnVtX3JlcTsKKwljb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBoYm1faG9zdF9lbnVtX3JlcXVlc3QpOworCisJLyogZW51bWVyYXRlIGNsaWVudHMgKi8KKwlpc2h0cF9oYm1faGRyKGlzaHRwX2hkciwgbGVuKTsKKworCWVudW1fcmVxID0gKHN0cnVjdCBoYm1faG9zdF9lbnVtX3JlcXVlc3QgKilkYXRhOworCW1lbXNldChlbnVtX3JlcSwgMCwgbGVuKTsKKwllbnVtX3JlcS0+aGJtX2NtZCA9IEhPU1RfRU5VTV9SRVFfQ01EOworCisJaWYgKGlzaHRwX3dyaXRlX21lc3NhZ2UoZGV2LCBpc2h0cF9oZHIsIGRhdGEpKSB7CisJCWRldi0+ZGV2X3N0YXRlID0gSVNIVFBfREVWX1JFU0VUVElORzsKKwkJZGV2X2VycihkZXYtPmRldmMsICJlbnVtZXJhdGlvbiByZXF1ZXN0IHNlbmQgZmFpbGVkXG4iKTsKKwkJaXNoX2h3X3Jlc2V0KGRldik7CisJfQorCWRldi0+aGJtX3N0YXRlID0gSVNIVFBfSEJNX0VOVU1fQ0xJRU5UUzsKK30KKworLyoqCisgKiBpc2h0cF9oYm1fcHJvcF9yZXEoKSAtIFJlcXVlc3QgcHJvcGVydHkKKyAqIEBkZXY6IElTSFRQIGRldmljZSBpbnN0YW5jZQorICoKKyAqIFJlcXVlc3QgcHJvcGVydHkgZm9yIGEgc2luZ2xlIGNsaWVudAorICoKKyAqIFJldHVybjogMCBpZiBzdWNjZXNzIGVsc2UgZXJyb3IgY29kZQorICovCitzdGF0aWMgaW50IGlzaHRwX2hibV9wcm9wX3JlcShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkciBoZHI7CisJdW5zaWduZWQgY2hhciBkYXRhWzEyOF07CisJc3RydWN0IGlzaHRwX21zZ19oZHIgKmlzaHRwX2hkciA9ICZoZHI7CisJc3RydWN0IGhibV9wcm9wc19yZXF1ZXN0ICpwcm9wX3JlcTsKKwljb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBoYm1fcHJvcHNfcmVxdWVzdCk7CisJdW5zaWduZWQgbG9uZyBuZXh0X2NsaWVudF9pbmRleDsKKwl1aW50OF90IGNsaWVudF9udW07CisKKwljbGllbnRfbnVtID0gZGV2LT5md19jbGllbnRfcHJlc2VudGF0aW9uX251bTsKKworCW5leHRfY2xpZW50X2luZGV4ID0gZmluZF9uZXh0X2JpdChkZXYtPmZ3X2NsaWVudHNfbWFwLAorCQlJU0hUUF9DTElFTlRTX01BWCwgZGV2LT5md19jbGllbnRfaW5kZXgpOworCisJLyogV2UgZ290IGFsbCBjbGllbnQgcHJvcGVydGllcyAqLworCWlmIChuZXh0X2NsaWVudF9pbmRleCA9PSBJU0hUUF9DTElFTlRTX01BWCkgeworCQlkZXYtPmhibV9zdGF0ZSA9IElTSFRQX0hCTV9XT1JLSU5HOworCQlkZXYtPmRldl9zdGF0ZSA9IElTSFRQX0RFVl9FTkFCTEVEOworCisJCWZvciAoZGV2LT5md19jbGllbnRfcHJlc2VudGF0aW9uX251bSA9IDE7CisJCQlkZXYtPmZ3X2NsaWVudF9wcmVzZW50YXRpb25fbnVtIDwgY2xpZW50X251bSArIDE7CisJCQkJKytkZXYtPmZ3X2NsaWVudF9wcmVzZW50YXRpb25fbnVtKQorCQkJLyogQWRkIG5ldyBjbGllbnQgZGV2aWNlICovCisJCQlpc2h0cF9idXNfbmV3X2NsaWVudChkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXYtPmZ3X2NsaWVudHNbY2xpZW50X251bV0uY2xpZW50X2lkID0gbmV4dF9jbGllbnRfaW5kZXg7CisKKwlpc2h0cF9oYm1faGRyKGlzaHRwX2hkciwgbGVuKTsKKwlwcm9wX3JlcSA9IChzdHJ1Y3QgaGJtX3Byb3BzX3JlcXVlc3QgKilkYXRhOworCisJbWVtc2V0KHByb3BfcmVxLCAwLCBzaXplb2Yoc3RydWN0IGhibV9wcm9wc19yZXF1ZXN0KSk7CisKKwlwcm9wX3JlcS0+aGJtX2NtZCA9IEhPU1RfQ0xJRU5UX1BST1BFUlRJRVNfUkVRX0NNRDsKKwlwcm9wX3JlcS0+YWRkcmVzcyA9IG5leHRfY2xpZW50X2luZGV4OworCisJaWYgKGlzaHRwX3dyaXRlX21lc3NhZ2UoZGV2LCBpc2h0cF9oZHIsIGRhdGEpKSB7CisJCWRldi0+ZGV2X3N0YXRlID0gSVNIVFBfREVWX1JFU0VUVElORzsKKwkJZGV2X2VycihkZXYtPmRldmMsICJwcm9wZXJ0aWVzIHJlcXVlc3Qgc2VuZCBmYWlsZWRcbiIpOworCQlpc2hfaHdfcmVzZXQoZGV2KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZGV2LT5md19jbGllbnRfaW5kZXggPSBuZXh0X2NsaWVudF9pbmRleDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlzaHRwX2hibV9zdG9wX3JlcSgpIC0gU2VuZCBIQk0gc3RvcAorICogQGRldjogSVNIVFAgZGV2aWNlIGluc3RhbmNlCisgKgorICogU2VuZCBzdG9wIHJlcXVlc3QgbWVzc2FnZQorICovCitzdGF0aWMgdm9pZCBpc2h0cF9oYm1fc3RvcF9yZXEoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpc2h0cF9tc2dfaGRyIGhkcjsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMTI4XTsKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkciAqaXNodHBfaGRyID0gJmhkcjsKKwlzdHJ1Y3QgaGJtX2hvc3Rfc3RvcF9yZXF1ZXN0ICpyZXE7CisJY29uc3Qgc2l6ZV90IGxlbiA9IHNpemVvZihzdHJ1Y3QgaGJtX2hvc3Rfc3RvcF9yZXF1ZXN0KTsKKworCWlzaHRwX2hibV9oZHIoaXNodHBfaGRyLCBsZW4pOworCXJlcSA9IChzdHJ1Y3QgaGJtX2hvc3Rfc3RvcF9yZXF1ZXN0ICopZGF0YTsKKworCW1lbXNldChyZXEsIDAsIHNpemVvZihzdHJ1Y3QgaGJtX2hvc3Rfc3RvcF9yZXF1ZXN0KSk7CisJcmVxLT5oYm1fY21kID0gSE9TVF9TVE9QX1JFUV9DTUQ7CisJcmVxLT5yZWFzb24gPSBEUklWRVJfU1RPUF9SRVFVRVNUOworCisJaXNodHBfd3JpdGVfbWVzc2FnZShkZXYsIGlzaHRwX2hkciwgZGF0YSk7Cit9CisKKy8qKgorICogaXNodHBfaGJtX2NsX2Zsb3dfY29udHJvbF9yZXEoKSAtIFNlbmQgZmxvdyBjb250cm9sIHJlcXVlc3QKKyAqIEBkZXY6IElTSFRQIGRldmljZSBpbnN0YW5jZQorICogQGNsOiBJU0hUUCBjbGllbnQgaW5zdGFuY2UKKyAqCisgKiBTZW5kIGZsb3cgY29udHJvbCByZXF1ZXN0CisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3MgZWxzZSBlcnJvciBjb2RlCisgKi8KK2ludCBpc2h0cF9oYm1fY2xfZmxvd19jb250cm9sX3JlcShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgaXNodHBfY2wgKmNsKQoreworCXN0cnVjdCBpc2h0cF9tc2dfaGRyIGhkcjsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMTI4XTsKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkciAqaXNodHBfaGRyID0gJmhkcjsKKwljb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBoYm1fZmxvd19jb250cm9sKTsKKwlpbnQJcnY7CisJdW5zaWduZWQgaW50CW51bV9mcmFnczsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsLT5mY19zcGlubG9jaywgZmxhZ3MpOworCWlzaHRwX2hibV9oZHIoaXNodHBfaGRyLCBsZW4pOworCWlzaHRwX2hibV9jbF9oZHIoY2wsIElTSFRQX0ZMT1dfQ09OVFJPTF9DTUQsIGRhdGEsIGxlbik7CisKKwkvKgorCSAqIFN5bmMgcG9zc2libGUgcmFjZSB3aGVuIFJCIHJlY3ljbGUgYW5kIHBhY2tldCByZWNlaXZlIHBhdGhzCisJICogYm90aCB0cnkgdG8gc2VuZCBhbiBvdXQgRkMKKwkgKi8KKwlpZiAoY2wtPm91dF9mbG93X2N0cmxfY3JlZHMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2wtPmZjX3NwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybgkwOworCX0KKworCW51bV9mcmFncyA9IGNsLT5yZWN2X21zZ19udW1fZnJhZ3M7CisJY2wtPnJlY3ZfbXNnX251bV9mcmFncyA9IDA7CisKKwlydiA9IGlzaHRwX3dyaXRlX21lc3NhZ2UoZGV2LCBpc2h0cF9oZHIsIGRhdGEpOworCWlmICghcnYpIHsKKwkJKytjbC0+b3V0X2Zsb3dfY3RybF9jcmVkczsKKwkJKytjbC0+b3V0X2Zsb3dfY3RybF9jbnQ7CisJCWdldG5zdGltZW9mZGF5KCZjbC0+dHNfb3V0X2ZjKTsKKwkJaWYgKGNsLT50c19yeC50dl9zZWMgJiYgY2wtPnRzX3J4LnR2X25zZWMpIHsKKwkJCXN0cnVjdCB0aW1lc3BlYyB0c19kaWZmOworCisJCQl0c19kaWZmID0gdGltZXNwZWNfc3ViKGNsLT50c19vdXRfZmMsIGNsLT50c19yeCk7CisJCQlpZiAodGltZXNwZWNfY29tcGFyZSgmdHNfZGlmZiwgJmNsLT50c19tYXhfZmNfZGVsYXkpCisJCQkJCT4gMCkKKwkJCQljbC0+dHNfbWF4X2ZjX2RlbGF5ID0gdHNfZGlmZjsKKwkJfQorCX0gZWxzZSB7CisJCSsrY2wtPmVycl9zZW5kX2ZjOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsLT5mY19zcGlubG9jaywgZmxhZ3MpOworCXJldHVybglydjsKK30KKworLyoqCisgKiBpc2h0cF9oYm1fY2xfZGlzY29ubmVjdF9yZXEoKSAtIFNlbmQgZGlzY29ubmVjdCByZXF1ZXN0CisgKiBAZGV2OiBJU0hUUCBkZXZpY2UgaW5zdGFuY2UKKyAqIEBjbDogSVNIVFAgY2xpZW50IGluc3RhbmNlCisgKgorICogU2VuZCBkaXNjb25uZWN0IG1lc3NhZ2UgdG8gZncKKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2VzcyBlbHNlIGVycm9yIGNvZGUKKyAqLworaW50IGlzaHRwX2hibV9jbF9kaXNjb25uZWN0X3JlcShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsIHN0cnVjdCBpc2h0cF9jbCAqY2wpCit7CisJc3RydWN0IGlzaHRwX21zZ19oZHIgaGRyOworCXVuc2lnbmVkIGNoYXIgZGF0YVsxMjhdOworCXN0cnVjdCBpc2h0cF9tc2dfaGRyICppc2h0cF9oZHIgPSAmaGRyOworCWNvbnN0IHNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXF1ZXN0KTsKKworCWlzaHRwX2hibV9oZHIoaXNodHBfaGRyLCBsZW4pOworCWlzaHRwX2hibV9jbF9oZHIoY2wsIENMSUVOVF9ESVNDT05ORUNUX1JFUV9DTUQsIGRhdGEsIGxlbik7CisKKwlyZXR1cm4gaXNodHBfd3JpdGVfbWVzc2FnZShkZXYsIGlzaHRwX2hkciwgZGF0YSk7Cit9CisKKy8qKgorICogaXNodHBfaGJtX2NsX2Rpc2Nvbm5lY3RfcmVzKCkgLSBHZXQgZGlzY29ubmVjdCByZXNwb25zZQorICogQGRldjogSVNIVFAgZGV2aWNlIGluc3RhbmNlCisgKiBAcnM6IFJlc3BvbnNlIG1lc3NhZ2UKKyAqCisgKiBSZWNlaXZlZCBkaXNjb25uZWN0IHJlc3BvbnNlIGZyb20gZncKKyAqLworc3RhdGljIHZvaWQgaXNodHBfaGJtX2NsX2Rpc2Nvbm5lY3RfcmVzKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlICpycykKK3sKKwlzdHJ1Y3QgaXNodHBfY2wgKmNsID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+Y2xfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+Y2xfbGlzdCwgbGluaykgeworCQlpZiAoIXJzLT5zdGF0dXMgJiYgaXNodHBfaGJtX2NsX2FkZHJfZXF1YWwoY2wsIHJzKSkgeworCQkJY2wtPnN0YXRlID0gSVNIVFBfQ0xfRElTQ09OTkVDVEVEOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGNsKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNsLT53YWl0X2N0cmxfcmVzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmNsX2xpc3RfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGlzaHRwX2hibV9jbF9jb25uZWN0X3JlcSgpIC0gU2VuZCBjb25uZWN0IHJlcXVlc3QKKyAqIEBkZXY6IElTSFRQIGRldmljZSBpbnN0YW5jZQorICogQGNsOiBjbGllbnQgZGV2aWNlIGluc3RhbmNlCisgKgorICogU2VuZCBjb25uZWN0aW9uIHJlcXVlc3QgdG8gc3BlY2lmaWMgZncgY2xpZW50CisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3MgZWxzZSBlcnJvciBjb2RlCisgKi8KK2ludCBpc2h0cF9oYm1fY2xfY29ubmVjdF9yZXEoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LCBzdHJ1Y3QgaXNodHBfY2wgKmNsKQoreworCXN0cnVjdCBpc2h0cF9tc2dfaGRyIGhkcjsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbMTI4XTsKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkciAqaXNodHBfaGRyID0gJmhkcjsKKwljb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKHN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVxdWVzdCk7CisKKwlpc2h0cF9oYm1faGRyKGlzaHRwX2hkciwgbGVuKTsKKwlpc2h0cF9oYm1fY2xfaGRyKGNsLCBDTElFTlRfQ09OTkVDVF9SRVFfQ01ELCBkYXRhLCBsZW4pOworCisJcmV0dXJuIGlzaHRwX3dyaXRlX21lc3NhZ2UoZGV2LCBpc2h0cF9oZHIsIGRhdGEpOworfQorCisvKioKKyAqIGlzaHRwX2hibV9jbF9jb25uZWN0X3JlcygpIC0gR2V0IGNvbm5lY3QgcmVzcG9uc2UKKyAqIEBkZXY6IElTSFRQIGRldmljZSBpbnN0YW5jZQorICogQHJzOiBSZXNwb25zZSBtZXNzYWdlCisgKgorICogUmVjZWl2ZWQgY29ubmVjdCByZXNwb25zZSBmcm9tIGZ3CisgKi8KK3N0YXRpYyB2b2lkIGlzaHRwX2hibV9jbF9jb25uZWN0X3JlcyhzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsCisJc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXNwb25zZSAqcnMpCit7CisJc3RydWN0IGlzaHRwX2NsICpjbCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmNsX2xpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2wsICZkZXYtPmNsX2xpc3QsIGxpbmspIHsKKwkJaWYgKGlzaHRwX2hibV9jbF9hZGRyX2VxdWFsKGNsLCBycykpIHsKKwkJCWlmICghcnMtPnN0YXR1cykgeworCQkJCWNsLT5zdGF0ZSA9IElTSFRQX0NMX0NPTk5FQ1RFRDsKKwkJCQljbC0+c3RhdHVzID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJY2wtPnN0YXRlID0gSVNIVFBfQ0xfRElTQ09OTkVDVEVEOworCQkJCWNsLT5zdGF0dXMgPSAtRU5PREVWOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGNsKQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNsLT53YWl0X2N0cmxfcmVzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmNsX2xpc3RfbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGlzaHRwX2NsaWVudF9kaXNjb25uZWN0X3JlcXVlc3QoKSAtIFJlY2VpdmUgZGlzY29ubmVjdCByZXF1ZXN0CisgKiBAZGV2OiBJU0hUUCBkZXZpY2UgaW5zdGFuY2UKKyAqIEBkaXNjb25uZWN0X3JlcTogZGlzY29ubmVjdCByZXF1ZXN0IHN0cnVjdHVyZQorICoKKyAqIERpc2Nvbm5lY3QgcmVxdWVzdCBidXMgbWVzc2FnZSBmcm9tIHRoZSBmdy4gU2VuZCBkaWNvbm5lY3QgcmVzcG9uc2UuCisgKi8KK3N0YXRpYyB2b2lkIGlzaHRwX2hibV9md19kaXNjb25uZWN0X3JlcShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsCisJc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXF1ZXN0ICpkaXNjb25uZWN0X3JlcSkKK3sKKwlzdHJ1Y3QgaXNodHBfY2wgKmNsOworCWNvbnN0IHNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXNwb25zZSk7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkciBoZHI7CisJdW5zaWduZWQgY2hhciBkYXRhWzRdOwkvKiBBbGwgSEJNIG1lc3NhZ2VzIGFyZSA0IGJ5dGVzICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jbF9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsLCAmZGV2LT5jbF9saXN0LCBsaW5rKSB7CisJCWlmIChpc2h0cF9oYm1fY2xfYWRkcl9lcXVhbChjbCwgZGlzY29ubmVjdF9yZXEpKSB7CisJCQljbC0+c3RhdGUgPSBJU0hUUF9DTF9ESVNDT05ORUNURUQ7CisKKwkJCS8qIHNlbmQgZGlzY29ubmVjdCByZXNwb25zZSAqLworCQkJaXNodHBfaGJtX2hkcigmaGRyLCBsZW4pOworCQkJaXNodHBfaGJtX2NsX2hkcihjbCwgQ0xJRU5UX0RJU0NPTk5FQ1RfUkVTX0NNRCwgZGF0YSwKKwkJCQlsZW4pOworCQkJaXNodHBfd3JpdGVfbWVzc2FnZShkZXYsICZoZHIsIGRhdGEpOworCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jbF9saXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBpc2h0cF9oYm1fZG1hX3hmZXJfYWNrKCgpIC0gUmVjZWl2ZSB0cmFuc2ZlciBBQ0sKKyAqIEBkZXY6IElTSFRQIGRldmljZSBpbnN0YW5jZQorICogQGRtYV94ZmVyOiBIQk0gdHJhbnNmZXIgbWVzc2FnZQorICoKKyAqIFJlY2VpdmUgYWNrIGZvciBJU0hUUC1vdmVyLURNQSBjbGllbnQgbWVzc2FnZQorICovCitzdGF0aWMgdm9pZCBpc2h0cF9oYm1fZG1hX3hmZXJfYWNrKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZG1hX3hmZXJfaGJtICpkbWFfeGZlcikKK3sKKwl2b2lkCSptc2c7CisJdWludDY0X3QJb2ZmczsKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkcgkqaXNodHBfaGRyID0KKwkJKHN0cnVjdCBpc2h0cF9tc2dfaGRyICopJmRldi0+aXNodHBfbXNnX2hkcjsKKwl1bnNpZ25lZCBpbnQJbXNnX29mZnM7CisJc3RydWN0IGlzaHRwX2NsICpjbDsKKworCWZvciAobXNnX29mZnMgPSAwOyBtc2dfb2ZmcyA8IGlzaHRwX2hkci0+bGVuZ3RoOworCQltc2dfb2ZmcyArPSBzaXplb2Yoc3RydWN0IGRtYV94ZmVyX2hibSkpIHsKKwkJb2ZmcyA9IGRtYV94ZmVyLT5tc2dfYWRkciAtIGRldi0+aXNodHBfaG9zdF9kbWFfdHhfYnVmX3BoeXM7CisJCWlmIChvZmZzID4gZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWZfc2l6ZSkgeworCQkJZGV2X2VycihkZXYtPmRldmMsICJCYWQgRE1BIFR4IGFjayBtZXNzYWdlIGFkZHJlc3NcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChkbWFfeGZlci0+bXNnX2xlbmd0aCA+CisJCQkJZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWZfc2l6ZSAtIG9mZnMpIHsKKwkJCWRldl9lcnIoZGV2LT5kZXZjLCAiQmFkIERNQSBUeCBhY2sgbWVzc2FnZSBzaXplXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIGxvZ2ljYWwgYWRkcmVzcyBvZiB0aGUgYWNrZWQgbWVtICovCisJCW1zZyA9ICh1bnNpZ25lZCBjaGFyICopZGV2LT5pc2h0cF9ob3N0X2RtYV90eF9idWYgKyBvZmZzOworCQlpc2h0cF9jbF9yZWxlYXNlX2RtYV9hY2tlZF9tZW0oZGV2LCBtc2csIGRtYV94ZmVyLT5tc2dfbGVuZ3RoKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsLCAmZGV2LT5jbF9saXN0LCBsaW5rKSB7CisJCQlpZiAoY2wtPmZ3X2NsaWVudF9pZCA9PSBkbWFfeGZlci0+ZndfY2xpZW50X2lkICYmCisJCQkgICAgY2wtPmhvc3RfY2xpZW50X2lkID09IGRtYV94ZmVyLT5ob3N0X2NsaWVudF9pZCkKKwkJCQkvKgorCQkJCSAqIGluIGNhc2UgdGhhdCBhIHNpbmdsZSBhY2sgbWF5IGJlIHNlbnQKKwkJCQkgKiBvdmVyIHNldmVyYWwgZG1hIHRyYW5zZmVycywgYW5kIHRoZSBsYXN0IG1zZworCQkJCSAqIGFkZHIgd2FzIGluc2lkZSB0aGUgYWNrZWQgbWVtb3J5LCBidXQgbm90IGluCisJCQkJICogaXRzIHN0YXJ0CisJCQkJICovCisJCQkJaWYgKGNsLT5sYXN0X2RtYV9hZGRyID49CisJCQkJCQkJKHVuc2lnbmVkIGNoYXIgKiltc2cgJiYKKwkJCQkJCWNsLT5sYXN0X2RtYV9hZGRyIDwKKwkJCQkJCSh1bnNpZ25lZCBjaGFyICopbXNnICsKKwkJCQkJCWRtYV94ZmVyLT5tc2dfbGVuZ3RoKSB7CisJCQkJCWNsLT5sYXN0X2RtYV9hY2tlZCA9IDE7CisKKwkJCQkJaWYgKCFsaXN0X2VtcHR5KCZjbC0+dHhfbGlzdC5saXN0KSAmJgorCQkJCQkJY2wtPmlzaHRwX2Zsb3dfY3RybF9jcmVkcykgeworCQkJCQkJLyoKKwkJCQkJCSAqIHN0YXJ0IHNlbmRpbmcgdGhlIGZpcnN0IG1zZworCQkJCQkJICovCisJCQkJCQlpc2h0cF9jbF9zZW5kX21zZyhkZXYsIGNsKTsKKwkJCQkJfQorCQkJCX0KKwkJfQorCQkrK2RtYV94ZmVyOworCX0KK30KKworLyoqCisgKiBpc2h0cF9oYm1fZG1hX3hmZXIoKSAtIFJlY2VpdmUgRE1BIHRyYW5zZmVyIG1lc3NhZ2UKKyAqIEBkZXY6IElTSFRQIGRldmljZSBpbnN0YW5jZQorICogQGRtYV94ZmVyOiBIQk0gdHJhbnNmZXIgbWVzc2FnZQorICoKKyAqIFJlY2VpdmUgSVNIVFAtb3Zlci1ETUEgY2xpZW50IG1lc3NhZ2UKKyAqLworc3RhdGljIHZvaWQgaXNodHBfaGJtX2RtYV94ZmVyKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZG1hX3hmZXJfaGJtICpkbWFfeGZlcikKK3sKKwl2b2lkCSptc2c7CisJdWludDY0X3QJb2ZmczsKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkcgloZHI7CisJc3RydWN0IGlzaHRwX21zZ19oZHIJKmlzaHRwX2hkciA9CisJCShzdHJ1Y3QgaXNodHBfbXNnX2hkciAqKSAmZGV2LT5pc2h0cF9tc2dfaGRyOworCXN0cnVjdCBkbWFfeGZlcl9oYm0JKnBybSA9IGRtYV94ZmVyOworCXVuc2lnbmVkIGludAltc2dfb2ZmczsKKworCWZvciAobXNnX29mZnMgPSAwOyBtc2dfb2ZmcyA8IGlzaHRwX2hkci0+bGVuZ3RoOworCQltc2dfb2ZmcyArPSBzaXplb2Yoc3RydWN0IGRtYV94ZmVyX2hibSkpIHsKKworCQlvZmZzID0gZG1hX3hmZXItPm1zZ19hZGRyIC0gZGV2LT5pc2h0cF9ob3N0X2RtYV9yeF9idWZfcGh5czsKKwkJaWYgKG9mZnMgPiBkZXYtPmlzaHRwX2hvc3RfZG1hX3J4X2J1Zl9zaXplKSB7CisJCQlkZXZfZXJyKGRldi0+ZGV2YywgIkJhZCBETUEgUnggbWVzc2FnZSBhZGRyZXNzXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoZG1hX3hmZXItPm1zZ19sZW5ndGggPgorCQkJCWRldi0+aXNodHBfaG9zdF9kbWFfcnhfYnVmX3NpemUgLSBvZmZzKSB7CisJCQlkZXZfZXJyKGRldi0+ZGV2YywgIkJhZCBETUEgUnggbWVzc2FnZSBzaXplXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQltc2cgPSBkZXYtPmlzaHRwX2hvc3RfZG1hX3J4X2J1ZiArIG9mZnM7CisJCXJlY3ZfaXNodHBfY2xfbXNnX2RtYShkZXYsIG1zZywgZG1hX3hmZXIpOworCQlkbWFfeGZlci0+aGJtID0gRE1BX1hGRVJfQUNLOwkvKiBQcmVwYXJlIGZvciByZXNwb25zZSAqLworCQkrK2RtYV94ZmVyOworCX0KKworCS8qIFNlbmQgRE1BX1hGRVJfQUNLIFsuLi5dICovCisJaXNodHBfaGJtX2hkcigmaGRyLCBpc2h0cF9oZHItPmxlbmd0aCk7CisJaXNodHBfd3JpdGVfbWVzc2FnZShkZXYsICZoZHIsICh1bnNpZ25lZCBjaGFyICopcHJtKTsKK30KKworLyoqCisgKiBpc2h0cF9oYm1fZGlzcGF0Y2goKSAtIEhCTSBkaXNwYXRjaCBmdW5jdGlvbgorICogQGRldjogSVNIVFAgZGV2aWNlIGluc3RhbmNlCisgKiBAaGRyOiBidXMgbWVzc2FnZQorICoKKyAqIEJvdHRvbSBoYWxmIHJlYWQgcm91dGluZSBhZnRlciBJU1IgdG8gaGFuZGxlIHRoZSByZWFkIGJ1cyBtZXNzYWdlIGNtZAorICogcHJvY2Vzc2luZworICovCit2b2lkIGlzaHRwX2hibV9kaXNwYXRjaChzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgaXNodHBfYnVzX21lc3NhZ2UgKmhkcikKK3sKKwlzdHJ1Y3QgaXNodHBfYnVzX21lc3NhZ2UgKmlzaHRwX21zZzsKKwlzdHJ1Y3QgaXNodHBfZndfY2xpZW50ICpmd19jbGllbnQ7CisJc3RydWN0IGhibV9ob3N0X3ZlcnNpb25fcmVzcG9uc2UgKnZlcnNpb25fcmVzOworCXN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVzcG9uc2UgKmNvbm5lY3RfcmVzOworCXN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVzcG9uc2UgKmRpc2Nvbm5lY3RfcmVzOworCXN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVxdWVzdCAqZGlzY29ubmVjdF9yZXE7CisJc3RydWN0IGhibV9wcm9wc19yZXNwb25zZSAqcHJvcHNfcmVzOworCXN0cnVjdCBoYm1faG9zdF9lbnVtX3Jlc3BvbnNlICplbnVtX3JlczsKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkciBpc2h0cF9oZHI7CisJc3RydWN0IGRtYV9hbGxvY19ub3RpZnkJZG1hX2FsbG9jX25vdGlmeTsKKwlzdHJ1Y3QgZG1hX3hmZXJfaGJtCSpkbWFfeGZlcjsKKworCWlzaHRwX21zZyA9IGhkcjsKKworCXN3aXRjaCAoaXNodHBfbXNnLT5oYm1fY21kKSB7CisJY2FzZSBIT1NUX1NUQVJUX1JFU19DTUQ6CisJCXZlcnNpb25fcmVzID0gKHN0cnVjdCBoYm1faG9zdF92ZXJzaW9uX3Jlc3BvbnNlICopaXNodHBfbXNnOworCQlpZiAoIXZlcnNpb25fcmVzLT5ob3N0X3ZlcnNpb25fc3VwcG9ydGVkKSB7CisJCQlkZXYtPnZlcnNpb24gPSB2ZXJzaW9uX3Jlcy0+ZndfbWF4X3ZlcnNpb247CisKKwkJCWRldi0+aGJtX3N0YXRlID0gSVNIVFBfSEJNX1NUT1BQRUQ7CisJCQlpc2h0cF9oYm1fc3RvcF9yZXEoZGV2KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWRldi0+dmVyc2lvbi5tYWpvcl92ZXJzaW9uID0gSEJNX01BSk9SX1ZFUlNJT047CisJCWRldi0+dmVyc2lvbi5taW5vcl92ZXJzaW9uID0gSEJNX01JTk9SX1ZFUlNJT047CisJCWlmIChkZXYtPmRldl9zdGF0ZSA9PSBJU0hUUF9ERVZfSU5JVF9DTElFTlRTICYmCisJCQkJZGV2LT5oYm1fc3RhdGUgPT0gSVNIVFBfSEJNX1NUQVJUKSB7CisJCQlkZXYtPmhibV9zdGF0ZSA9IElTSFRQX0hCTV9TVEFSVEVEOworCQkJaXNodHBfaGJtX2VudW1fY2xpZW50c19yZXEoZGV2KTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoZGV2LT5kZXZjLAorCQkJCSJyZXNldDogd3JvbmcgaG9zdCBzdGFydCByZXNwb25zZVxuIik7CisJCQkvKiBCVUc6IHdoeSBkbyB3ZSBhcnJpdmUgaGVyZT8gKi8KKwkJCWlzaF9od19yZXNldChkZXYpOworCQkJcmV0dXJuOworCQl9CisKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPndhaXRfaGJtX3JlY3ZkX21zZyk7CisJCWJyZWFrOworCisJY2FzZSBDTElFTlRfQ09OTkVDVF9SRVNfQ01EOgorCQljb25uZWN0X3JlcyA9IChzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlICopaXNodHBfbXNnOworCQlpc2h0cF9oYm1fY2xfY29ubmVjdF9yZXMoZGV2LCBjb25uZWN0X3Jlcyk7CisJCWJyZWFrOworCisJY2FzZSBDTElFTlRfRElTQ09OTkVDVF9SRVNfQ01EOgorCQlkaXNjb25uZWN0X3JlcyA9CisJCQkoc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXNwb25zZSAqKWlzaHRwX21zZzsKKwkJaXNodHBfaGJtX2NsX2Rpc2Nvbm5lY3RfcmVzKGRldiwgZGlzY29ubmVjdF9yZXMpOworCQlicmVhazsKKworCWNhc2UgSE9TVF9DTElFTlRfUFJPUEVSVElFU19SRVNfQ01EOgorCQlwcm9wc19yZXMgPSAoc3RydWN0IGhibV9wcm9wc19yZXNwb25zZSAqKWlzaHRwX21zZzsKKwkJZndfY2xpZW50ID0gJmRldi0+ZndfY2xpZW50c1tkZXYtPmZ3X2NsaWVudF9wcmVzZW50YXRpb25fbnVtXTsKKworCQlpZiAocHJvcHNfcmVzLT5zdGF0dXMgfHwgIWRldi0+ZndfY2xpZW50cykgeworCQkJZGV2X2VycihkZXYtPmRldmMsCisJCQkicmVzZXQ6IHByb3BlcnRpZXMgcmVzcG9uc2UgaGJtIHdyb25nIHN0YXR1c1xuIik7CisJCQlpc2hfaHdfcmVzZXQoZGV2KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChmd19jbGllbnQtPmNsaWVudF9pZCAhPSBwcm9wc19yZXMtPmFkZHJlc3MpIHsKKwkJCWRldl9lcnIoZGV2LT5kZXZjLAorCQkJCSJyZXNldDogaG9zdCBwcm9wZXJ0aWVzIHJlc3BvbnNlIGFkZHJlc3MgbWlzbWF0Y2ggWyUwMlggJTAyWF1cbiIsCisJCQkJZndfY2xpZW50LT5jbGllbnRfaWQsIHByb3BzX3Jlcy0+YWRkcmVzcyk7CisJCQlpc2hfaHdfcmVzZXQoZGV2KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChkZXYtPmRldl9zdGF0ZSAhPSBJU0hUUF9ERVZfSU5JVF9DTElFTlRTIHx8CisJCQlkZXYtPmhibV9zdGF0ZSAhPSBJU0hUUF9IQk1fQ0xJRU5UX1BST1BFUlRJRVMpIHsKKwkJCWRldl9lcnIoZGV2LT5kZXZjLAorCQkJCSJyZXNldDogdW5leHBlY3RlZCBwcm9wZXJ0aWVzIHJlc3BvbnNlXG4iKTsKKwkJCWlzaF9od19yZXNldChkZXYpOworCQkJcmV0dXJuOworCQl9CisKKwkJZndfY2xpZW50LT5wcm9wcyA9IHByb3BzX3Jlcy0+Y2xpZW50X3Byb3BlcnRpZXM7CisJCWRldi0+ZndfY2xpZW50X2luZGV4Kys7CisJCWRldi0+ZndfY2xpZW50X3ByZXNlbnRhdGlvbl9udW0rKzsKKworCQkvKiByZXF1ZXN0IHByb3BlcnR5IGZvciB0aGUgbmV4dCBjbGllbnQgKi8KKwkJaXNodHBfaGJtX3Byb3BfcmVxKGRldik7CisKKwkJaWYgKGRldi0+ZGV2X3N0YXRlICE9IElTSFRQX0RFVl9FTkFCTEVEKQorCQkJYnJlYWs7CisKKwkJaWYgKCFpc2h0cF91c2VfZG1hX3RyYW5zZmVyKCkpCisJCQlicmVhazsKKworCQlkZXZfZGJnKGRldi0+ZGV2YywgIlJlcXVlc3RpbmcgdG8gdXNlIERNQVxuIik7CisJCWlzaHRwX2NsX2FsbG9jX2RtYV9idWYoZGV2KTsKKwkJaWYgKGRldi0+aXNodHBfaG9zdF9kbWFfcnhfYnVmKSB7CisJCQljb25zdCBzaXplX3QgbGVuID0gc2l6ZW9mKGRtYV9hbGxvY19ub3RpZnkpOworCisJCQltZW1zZXQoJmRtYV9hbGxvY19ub3RpZnksIDAsIHNpemVvZihkbWFfYWxsb2Nfbm90aWZ5KSk7CisJCQlkbWFfYWxsb2Nfbm90aWZ5LmhibSA9IERNQV9CVUZGRVJfQUxMT0NfTk9USUZZOworCQkJZG1hX2FsbG9jX25vdGlmeS5idWZfc2l6ZSA9CisJCQkJCWRldi0+aXNodHBfaG9zdF9kbWFfcnhfYnVmX3NpemU7CisJCQlkbWFfYWxsb2Nfbm90aWZ5LmJ1Zl9hZGRyZXNzID0KKwkJCQkJZGV2LT5pc2h0cF9ob3N0X2RtYV9yeF9idWZfcGh5czsKKwkJCWlzaHRwX2hibV9oZHIoJmlzaHRwX2hkciwgbGVuKTsKKwkJCWlzaHRwX3dyaXRlX21lc3NhZ2UoZGV2LCAmaXNodHBfaGRyLAorCQkJCSh1bnNpZ25lZCBjaGFyICopJmRtYV9hbGxvY19ub3RpZnkpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIEhPU1RfRU5VTV9SRVNfQ01EOgorCQllbnVtX3JlcyA9IChzdHJ1Y3QgaGJtX2hvc3RfZW51bV9yZXNwb25zZSAqKSBpc2h0cF9tc2c7CisJCW1lbWNweShkZXYtPmZ3X2NsaWVudHNfbWFwLCBlbnVtX3Jlcy0+dmFsaWRfYWRkcmVzc2VzLCAzMik7CisJCWlmIChkZXYtPmRldl9zdGF0ZSA9PSBJU0hUUF9ERVZfSU5JVF9DTElFTlRTICYmCisJCQlkZXYtPmhibV9zdGF0ZSA9PSBJU0hUUF9IQk1fRU5VTV9DTElFTlRTKSB7CisJCQlkZXYtPmZ3X2NsaWVudF9wcmVzZW50YXRpb25fbnVtID0gMDsKKwkJCWRldi0+ZndfY2xpZW50X2luZGV4ID0gMDsKKworCQkJaXNodHBfaGJtX2Z3X2NsX2FsbG9jYXRlKGRldik7CisJCQlkZXYtPmhibV9zdGF0ZSA9IElTSFRQX0hCTV9DTElFTlRfUFJPUEVSVElFUzsKKworCQkJLyogZmlyc3QgcHJvcGVydHkgcmVxdWVzdCAqLworCQkJaXNodHBfaGJtX3Byb3BfcmVxKGRldik7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKGRldi0+ZGV2YywKKwkJCSAgICAgICJyZXNldDogdW5leHBlY3RlZCBlbnVtZXJhdGlvbiByZXNwb25zZSBoYm1cbiIpOworCQkJaXNoX2h3X3Jlc2V0KGRldik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEhPU1RfU1RPUF9SRVNfQ01EOgorCQlpZiAoZGV2LT5oYm1fc3RhdGUgIT0gSVNIVFBfSEJNX1NUT1BQRUQpCisJCQlkZXZfZXJyKGRldi0+ZGV2YywgInVuZXhwZWN0ZWQgc3RvcCByZXNwb25zZVxuIik7CisKKwkJZGV2LT5kZXZfc3RhdGUgPSBJU0hUUF9ERVZfRElTQUJMRUQ7CisJCWRldl9pbmZvKGRldi0+ZGV2YywgInJlc2V0OiBGVyBzdG9wIHJlc3BvbnNlXG4iKTsKKwkJaXNoX2h3X3Jlc2V0KGRldik7CisJCWJyZWFrOworCisJY2FzZSBDTElFTlRfRElTQ09OTkVDVF9SRVFfQ01EOgorCQkvKiBzZWFyY2ggZm9yIGNsaWVudCAqLworCQlkaXNjb25uZWN0X3JlcSA9CisJCQkoc3RydWN0IGhibV9jbGllbnRfY29ubmVjdF9yZXF1ZXN0ICopaXNodHBfbXNnOworCQlpc2h0cF9oYm1fZndfZGlzY29ubmVjdF9yZXEoZGV2LCBkaXNjb25uZWN0X3JlcSk7CisJCWJyZWFrOworCisJY2FzZSBGV19TVE9QX1JFUV9DTUQ6CisJCWRldi0+aGJtX3N0YXRlID0gSVNIVFBfSEJNX1NUT1BQRUQ7CisJCWJyZWFrOworCisJY2FzZSBETUFfQlVGRkVSX0FMTE9DX1JFU1BPTlNFOgorCQlkZXYtPmlzaHRwX2hvc3RfZG1hX2VuYWJsZWQgPSAxOworCQlicmVhazsKKworCWNhc2UgRE1BX1hGRVI6CisJCWRtYV94ZmVyID0gKHN0cnVjdCBkbWFfeGZlcl9oYm0gKilpc2h0cF9tc2c7CisJCWlmICghZGV2LT5pc2h0cF9ob3N0X2RtYV9lbmFibGVkKSB7CisJCQlkZXZfZXJyKGRldi0+ZGV2YywKKwkJCQkiRE1BIFhGRVIgcmVxdWVzdGVkIGJ1dCBETUEgaXMgbm90IGVuYWJsZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJaXNodHBfaGJtX2RtYV94ZmVyKGRldiwgZG1hX3hmZXIpOworCQlicmVhazsKKworCWNhc2UgRE1BX1hGRVJfQUNLOgorCQlkbWFfeGZlciA9IChzdHJ1Y3QgZG1hX3hmZXJfaGJtICopaXNodHBfbXNnOworCQlpZiAoIWRldi0+aXNodHBfaG9zdF9kbWFfZW5hYmxlZCB8fAorCQkgICAgIWRldi0+aXNodHBfaG9zdF9kbWFfdHhfYnVmKSB7CisJCQlkZXZfZXJyKGRldi0+ZGV2YywKKwkJCQkiRE1BIFhGRVIgYWNrZWQgYnV0IERNQSBUeCBpcyBub3QgZW5hYmxlZFxuIik7CisJCQlicmVhazsKKwkJfQorCQlpc2h0cF9oYm1fZG1hX3hmZXJfYWNrKGRldiwgZG1hX3hmZXIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LT5kZXZjLCAidW5rbm93biBIQk06ICV1XG4iLAorCQkJKHVuc2lnbmVkIGludClpc2h0cF9tc2ctPmhibV9jbWQpOworCisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBiaF9oYm1fd29ya19mbigpIC0gSEJNIHdvcmsgZnVuY3Rpb24KKyAqIEB3b3JrOiB3b3JrIHN0cnVjdAorICoKKyAqIEJvdHRvbSBoYWxmIHByb2Nlc3Npbmcgd29yayBmdW5jdGlvbiAoaW5zdGVhZCBvZiB0aHJlYWQgaGFuZGxlcikKKyAqIGZvciBwcm9jZXNzaW5nIGhibSBtZXNzYWdlcworICovCit2b2lkCWJoX2hibV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXN0cnVjdCBpc2h0cF9kZXZpY2UJKmRldjsKKwl1bnNpZ25lZCBjaGFyCWhibVtJUENfUEFZTE9BRF9TSVpFXTsKKworCWRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXNodHBfZGV2aWNlLCBiaF9oYm1fd29yayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+cmRfbXNnX3NwaW5sb2NrLCBmbGFncyk7CisJaWYgKGRldi0+cmRfbXNnX2ZpZm9faGVhZCAhPSBkZXYtPnJkX21zZ19maWZvX3RhaWwpIHsKKwkJbWVtY3B5KGhibSwgZGV2LT5yZF9tc2dfZmlmbyArIGRldi0+cmRfbXNnX2ZpZm9faGVhZCwKKwkJCUlQQ19QQVlMT0FEX1NJWkUpOworCQlkZXYtPnJkX21zZ19maWZvX2hlYWQgPQorCQkJKGRldi0+cmRfbXNnX2ZpZm9faGVhZCArIElQQ19QQVlMT0FEX1NJWkUpICUKKwkJCShSRF9JTlRfRklGT19TSVpFICogSVBDX1BBWUxPQURfU0laRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmRfbXNnX3NwaW5sb2NrLCBmbGFncyk7CisJCWlzaHRwX2hibV9kaXNwYXRjaChkZXYsIChzdHJ1Y3QgaXNodHBfYnVzX21lc3NhZ2UgKiloYm0pOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+cmRfbXNnX3NwaW5sb2NrLCBmbGFncyk7CisJfQorfQorCisvKioKKyAqIHJlY3ZfaGJtKCkgLSBSZWNlaXZlIEhCTSBtZXNzYWdlCisgKiBAZGV2OiBJU0hUUCBkZXZpY2UgaW5zdGFuY2UKKyAqIEBpc2h0cF9oZHI6IHJlY2VpdmVkIGJ1cyBtZXNzYWdlCisgKgorICogUmVjZWl2ZSBhbmQgcHJvY2VzcyBJU0hUUCBidXMgbWVzc2FnZXMgaW4gSVNSIGNvbnRleHQuIFRoaXMgd2lsbCBzY2hlZHVsZQorICogd29yayBmdW5jdGlvbiB0byBwcm9jZXNzIG1lc3NhZ2UKKyAqLwordm9pZAlyZWN2X2hibShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsIHN0cnVjdCBpc2h0cF9tc2dfaGRyICppc2h0cF9oZHIpCit7CisJdWludDhfdAlyZF9tc2dfYnVmW0lTSFRQX1JEX01TR19CVUZfU0laRV07CisJc3RydWN0IGlzaHRwX2J1c19tZXNzYWdlCSppc2h0cF9tc2cgPQorCQkoc3RydWN0IGlzaHRwX2J1c19tZXNzYWdlICopcmRfbXNnX2J1ZjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJZGV2LT5vcHMtPmlzaHRwX3JlYWQoZGV2LCByZF9tc2dfYnVmLCBpc2h0cF9oZHItPmxlbmd0aCk7CisKKwkvKiBGbG93IGNvbnRyb2wgLSBoYW5kbGUgaW4gcGxhY2UgKi8KKwlpZiAoaXNodHBfbXNnLT5oYm1fY21kID09IElTSFRQX0ZMT1dfQ09OVFJPTF9DTUQpIHsKKwkJc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKmZsb3dfY29udHJvbCA9CisJCQkoc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKilpc2h0cF9tc2c7CisJCXN0cnVjdCBpc2h0cF9jbCAqY2wgPSBOVUxMOworCQl1bnNpZ25lZCBsb25nCWZsYWdzLCB0eF9mbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jbF9saXN0X2xvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjbCwgJmRldi0+Y2xfbGlzdCwgbGluaykgeworCQkJaWYgKGNsLT5ob3N0X2NsaWVudF9pZCA9PSBmbG93X2NvbnRyb2wtPmhvc3RfYWRkciAmJgorCQkJCQljbC0+ZndfY2xpZW50X2lkID09CisJCQkJCWZsb3dfY29udHJvbC0+ZndfYWRkcikgeworCQkJCS8qCisJCQkJICogTk9URTogSXQncyB2YWxpZCBvbmx5IGZvciBjb3VudGluZworCQkJCSAqIGZsb3ctY29udHJvbCBpbXBsZW1lbnRhdGlvbiB0byByZWNlaXZlIGEKKwkJCQkgKiBGQyBpbiB0aGUgbWlkZGxlIG9mIHNlbmRpbmcuIE1lYW53aGlsZSBub3QKKwkJCQkgKiBzdXBwb3J0ZWQKKwkJCQkgKi8KKwkJCQlpZiAoY2wtPmlzaHRwX2Zsb3dfY3RybF9jcmVkcykKKwkJCQkJZGV2X2VycihkZXYtPmRldmMsCisJCQkJCSAicmVjdiBleHRyYSBGQyBmcm9tIEZXIGNsaWVudCAldSAoaG9zdCBjbGllbnQgJXUpIChGQyBjb3VudCB3YXMgJWQpXG4iLAorCQkJCQkgKHVuc2lnbmVkIGludCljbC0+ZndfY2xpZW50X2lkLAorCQkJCQkgKHVuc2lnbmVkIGludCljbC0+aG9zdF9jbGllbnRfaWQsCisJCQkJCSBjbC0+aXNodHBfZmxvd19jdHJsX2NyZWRzKTsKKwkJCQllbHNlIHsKKwkJCQkJKytjbC0+aXNodHBfZmxvd19jdHJsX2NyZWRzOworCQkJCQkrK2NsLT5pc2h0cF9mbG93X2N0cmxfY250OworCQkJCQljbC0+bGFzdF9pcGNfYWNrZWQgPSAxOworCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgKKwkJCQkJCQkmY2wtPnR4X2xpc3Rfc3BpbmxvY2ssCisJCQkJCQkJdHhfZmxhZ3MpOworCQkJCQlpZiAoIWxpc3RfZW1wdHkoJmNsLT50eF9saXN0Lmxpc3QpKSB7CisJCQkJCQkvKgorCQkJCQkJICogc3RhcnQgc2VuZGluZyB0aGUgZmlyc3QgbXNnCisJCQkJCQkgKgk9IHRoZSBjYWxsYmFjayBmdW5jdGlvbgorCQkJCQkJICovCisJCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKAorCQkJCQkJCSZjbC0+dHhfbGlzdF9zcGlubG9jaywKKwkJCQkJCQl0eF9mbGFncyk7CisJCQkJCQlpc2h0cF9jbF9zZW5kX21zZyhkZXYsIGNsKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCisJCQkJCQkJJmNsLT50eF9saXN0X3NwaW5sb2NrLAorCQkJCQkJCXR4X2ZsYWdzKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmNsX2xpc3RfbG9jaywgZmxhZ3MpOworCQlnb3RvCWVvaTsKKwl9CisKKwkvKgorCSAqIFNvbWUgbWVzc2FnZXMgdGhhdCBhcmUgc2FmZSBmb3IgSVNSIHByb2Nlc3NpbmcgYW5kIGltcG9ydGFudAorCSAqIHRvIGJlIGRvbmUgInF1aWNrbHkiIGFuZCBpbi1vcmRlciwgZ28gaGVyZQorCSAqLworCWlmIChpc2h0cF9tc2ctPmhibV9jbWQgPT0gQ0xJRU5UX0NPTk5FQ1RfUkVTX0NNRCB8fAorCQkJaXNodHBfbXNnLT5oYm1fY21kID09IENMSUVOVF9ESVNDT05ORUNUX1JFU19DTUQgfHwKKwkJCWlzaHRwX21zZy0+aGJtX2NtZCA9PSBDTElFTlRfRElTQ09OTkVDVF9SRVFfQ01EIHx8CisJCQlpc2h0cF9tc2ctPmhibV9jbWQgPT0gRE1BX1hGRVIpIHsKKwkJaXNodHBfaGJtX2Rpc3BhdGNoKGRldiwgaXNodHBfbXNnKTsKKwkJZ290bwllb2k7CisJfQorCisJLyoKKwkgKiBBbGwgb3RoZXIgSEJNcyBnbyBoZXJlLgorCSAqIFdlIHNjaGVkdWxlIEhCTXMgZm9yIHByb2Nlc3Npbmcgc2VyaWFsbHkgYnkgdXNpbmcgc3lzdGVtIHdxLAorCSAqIHBvc3NpYmx5IHRoZXJlIHdpbGwgYmUgbXVsdGlwbGUgSEJNcyBzY2hlZHVsZWQgYXQgdGhlIHNhbWUgdGltZS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5yZF9tc2dfc3BpbmxvY2ssIGZsYWdzKTsKKwlpZiAoKGRldi0+cmRfbXNnX2ZpZm9fdGFpbCArIElQQ19QQVlMT0FEX1NJWkUpICUKKwkJCShSRF9JTlRfRklGT19TSVpFICogSVBDX1BBWUxPQURfU0laRSkgPT0KKwkJCWRldi0+cmRfbXNnX2ZpZm9faGVhZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnJkX21zZ19zcGlubG9jaywgZmxhZ3MpOworCQlkZXZfZXJyKGRldi0+ZGV2YywgIkJIIGJ1ZmZlciBvdmVyZmxvdywgZHJvcHBpbmcgSEJNICV1XG4iLAorCQkJKHVuc2lnbmVkIGludClpc2h0cF9tc2ctPmhibV9jbWQpOworCQlnb3RvCWVvaTsKKwl9CisJbWVtY3B5KGRldi0+cmRfbXNnX2ZpZm8gKyBkZXYtPnJkX21zZ19maWZvX3RhaWwsIGlzaHRwX21zZywKKwkJaXNodHBfaGRyLT5sZW5ndGgpOworCWRldi0+cmRfbXNnX2ZpZm9fdGFpbCA9IChkZXYtPnJkX21zZ19maWZvX3RhaWwgKyBJUENfUEFZTE9BRF9TSVpFKSAlCisJCShSRF9JTlRfRklGT19TSVpFICogSVBDX1BBWUxPQURfU0laRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5yZF9tc2dfc3BpbmxvY2ssIGZsYWdzKTsKKwlzY2hlZHVsZV93b3JrKCZkZXYtPmJoX2hibV93b3JrKTsKK2VvaToKKwlyZXR1cm47Cit9CisKKy8qKgorICogcmVjdl9maXhlZF9jbF9tc2coKSAtIFJlY2VpdmUgZml4ZWQgY2xpZW50IG1lc3NhZ2UKKyAqIEBkZXY6IElTSFRQIGRldmljZSBpbnN0YW5jZQorICogQGlzaHRwX2hkcjogcmVjZWl2ZWQgYnVzIG1lc3NhZ2UKKyAqCisgKiBSZWNlaXZlIGFuZCBwcm9jZXNzIElTSFRQIGZpeGVkIGNsaWVudCBtZXNzYWdlcyAoYWRkcmVzcyA9PSAwKQorICogaW4gSVNSIGNvbnRleHQKKyAqLwordm9pZCByZWN2X2ZpeGVkX2NsX21zZyhzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYsCisJc3RydWN0IGlzaHRwX21zZ19oZHIgKmlzaHRwX2hkcikKK3sKKwl1aW50OF90IHJkX21zZ19idWZbSVNIVFBfUkRfTVNHX0JVRl9TSVpFXTsKKworCWRldi0+cHJpbnRfbG9nKGRldiwKKwkJIiVzKCkgZ290IGZpeGVkIGNsaWVudCBtc2cgZnJvbSBjbGllbnQgIyVkXG4iLAorCQlfX2Z1bmNfXywgaXNodHBfaGRyLT5md19hZGRyKTsKKwlkZXYtPm9wcy0+aXNodHBfcmVhZChkZXYsIHJkX21zZ19idWYsIGlzaHRwX2hkci0+bGVuZ3RoKTsKKwlpZiAoaXNodHBfaGRyLT5md19hZGRyID09IElTSFRQX1NZU1RFTV9TVEFURV9DTElFTlRfQUREUikgeworCQlzdHJ1Y3QgaXNoX3N5c3RlbV9zdGF0ZXNfaGVhZGVyICptc2dfaGRyID0KKwkJCShzdHJ1Y3QgaXNoX3N5c3RlbV9zdGF0ZXNfaGVhZGVyICopcmRfbXNnX2J1ZjsKKwkJaWYgKG1zZ19oZHItPmNtZCA9PSBTWVNURU1fU1RBVEVfU1VCU0NSSUJFKQorCQkJaXNodHBfc2VuZF9yZXN1bWUoZGV2KTsKKwkJLyogaWYgRlcgcmVxdWVzdCBhcnJpdmVkIGhlcmUsIHRoZSBzeXN0ZW0gaXMgbm90IHN1c3BlbmRlZCAqLworCQllbHNlCisJCQlkZXZfZXJyKGRldi0+ZGV2YywgInVua25vd24gZml4ZWQgY2xpZW50IG1zZyBbJTAyWF1cbiIsCisJCQkJbXNnX2hkci0+Y21kKTsKKwl9Cit9CisKKy8qKgorICogZml4X2NsX2hkcigpIC0gSW5pdGlhbGl6ZSBmaXhlZCBjbGllbnQgaGVhZGVyCisgKiBAaGRyOiBtZXNzYWdlIGhlYWRlcgorICogQGxlbmd0aDogbGVuZ3RoIG9mIG1lc3NhZ2UKKyAqIEBjbF9hZGRyOiBDbGllbnQgYWRkcmVzcworICoKKyAqIEluaXRpYWxpemUgbWVzc2FnZSBoZWFkZXIgZm9yIGZpeGVkIGNsaWVudAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZml4X2NsX2hkcihzdHJ1Y3QgaXNodHBfbXNnX2hkciAqaGRyLCBzaXplX3QgbGVuZ3RoLAorCXVpbnQ4X3QgY2xfYWRkcikKK3sKKwloZHItPmhvc3RfYWRkciA9IDA7CisJaGRyLT5md19hZGRyID0gY2xfYWRkcjsKKwloZHItPmxlbmd0aCA9IGxlbmd0aDsKKwloZHItPm1zZ19jb21wbGV0ZSA9IDE7CisJaGRyLT5yZXNlcnZlZCA9IDA7Cit9CisKKy8qKiogU3VzcGVuZCBhbmQgcmVzdW1lIG5vdGlmaWNhdGlvbiAqKiovCisKK3N0YXRpYyB1aW50MzJfdCBjdXJyZW50X3N0YXRlOworc3RhdGljIHVpbnQzMl90IHN1cHBvcnRlZF9zdGF0ZXMgPSAwIHwgU1VTUEVORF9TVEFURV9CSVQ7CisKKy8qKgorICogaXNodHBfc2VuZF9zdXNwZW5kKCkgLSBTZW5kIHN1c3BlbmQgbWVzc2FnZSB0byBGVworICogQGRldjogSVNIVFAgZGV2aWNlIGluc3RhbmNlCisgKgorICogU2VuZCBzdXNwZW5kIG1lc3NhZ2UgdG8gRlcuIFRoaXMgaXMgdXNlZnVsIGZvciBzeXN0ZW0gZnJlZXplIChub24gUzMpIGNhc2UKKyAqLwordm9pZCBpc2h0cF9zZW5kX3N1c3BlbmQoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpc2h0cF9tc2dfaGRyCWlzaHRwX2hkcjsKKwlzdHJ1Y3QgaXNoX3N5c3RlbV9zdGF0ZXNfc3RhdHVzIHN0YXRlX3N0YXR1c19tc2c7CisJY29uc3Qgc2l6ZV90IGxlbiA9IHNpemVvZihzdHJ1Y3QgaXNoX3N5c3RlbV9zdGF0ZXNfc3RhdHVzKTsKKworCWZpeF9jbF9oZHIoJmlzaHRwX2hkciwgbGVuLCBJU0hUUF9TWVNURU1fU1RBVEVfQ0xJRU5UX0FERFIpOworCisJbWVtc2V0KCZzdGF0ZV9zdGF0dXNfbXNnLCAwLCBsZW4pOworCXN0YXRlX3N0YXR1c19tc2cuaGRyLmNtZCA9IFNZU1RFTV9TVEFURV9TVEFUVVM7CisJc3RhdGVfc3RhdHVzX21zZy5zdXBwb3J0ZWRfc3RhdGVzID0gc3VwcG9ydGVkX3N0YXRlczsKKwljdXJyZW50X3N0YXRlIHw9IFNVU1BFTkRfU1RBVEVfQklUOworCWRldi0+cHJpbnRfbG9nKGRldiwgIiVzKCkgc2VuZHMgU1VTUEVORCBub3RpZmljYXRpb25cbiIsIF9fZnVuY19fKTsKKwlzdGF0ZV9zdGF0dXNfbXNnLnN0YXRlc19zdGF0dXMgPSBjdXJyZW50X3N0YXRlOworCisJaXNodHBfd3JpdGVfbWVzc2FnZShkZXYsICZpc2h0cF9oZHIsCisJCSh1bnNpZ25lZCBjaGFyICopJnN0YXRlX3N0YXR1c19tc2cpOworfQorRVhQT1JUX1NZTUJPTChpc2h0cF9zZW5kX3N1c3BlbmQpOworCisvKioKKyAqIGlzaHRwX3NlbmRfcmVzdW1lKCkgLSBTZW5kIHJlc3VtZSBtZXNzYWdlIHRvIEZXCisgKiBAZGV2OiBJU0hUUCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBTZW5kIHJlc3VtZSBtZXNzYWdlIHRvIEZXLiBUaGlzIGlzIHVzZWZ1bCBmb3Igc3lzdGVtIGZyZWV6ZSAobm9uIFMzKSBjYXNlCisgKi8KK3ZvaWQgaXNodHBfc2VuZF9yZXN1bWUoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpc2h0cF9tc2dfaGRyCWlzaHRwX2hkcjsKKwlzdHJ1Y3QgaXNoX3N5c3RlbV9zdGF0ZXNfc3RhdHVzIHN0YXRlX3N0YXR1c19tc2c7CisJY29uc3Qgc2l6ZV90IGxlbiA9IHNpemVvZihzdHJ1Y3QgaXNoX3N5c3RlbV9zdGF0ZXNfc3RhdHVzKTsKKworCWZpeF9jbF9oZHIoJmlzaHRwX2hkciwgbGVuLCBJU0hUUF9TWVNURU1fU1RBVEVfQ0xJRU5UX0FERFIpOworCisJbWVtc2V0KCZzdGF0ZV9zdGF0dXNfbXNnLCAwLCBsZW4pOworCXN0YXRlX3N0YXR1c19tc2cuaGRyLmNtZCA9IFNZU1RFTV9TVEFURV9TVEFUVVM7CisJc3RhdGVfc3RhdHVzX21zZy5zdXBwb3J0ZWRfc3RhdGVzID0gc3VwcG9ydGVkX3N0YXRlczsKKwljdXJyZW50X3N0YXRlICY9IH5TVVNQRU5EX1NUQVRFX0JJVDsKKwlkZXYtPnByaW50X2xvZyhkZXYsICIlcygpIHNlbmRzIFJFU1VNRSBub3RpZmljYXRpb25cbiIsIF9fZnVuY19fKTsKKwlzdGF0ZV9zdGF0dXNfbXNnLnN0YXRlc19zdGF0dXMgPSBjdXJyZW50X3N0YXRlOworCisJaXNodHBfd3JpdGVfbWVzc2FnZShkZXYsICZpc2h0cF9oZHIsCisJCSh1bnNpZ25lZCBjaGFyICopJnN0YXRlX3N0YXR1c19tc2cpOworfQorRVhQT1JUX1NZTUJPTChpc2h0cF9zZW5kX3Jlc3VtZSk7CisKKy8qKgorICogaXNodHBfcXVlcnlfc3Vic2NyaWJlcnMoKSAtIFNlbmQgcXVlcnkgc3Vic2NyaWJlcnMgbWVzc2FnZQorICogQGRldjogSVNIVFAgZGV2aWNlIGluc3RhbmNlCisgKgorICogU2VuZCBtZXNzYWdlIHRvIHF1ZXJ5IHN1YnNjcmliZXJzCisgKi8KK3ZvaWQgaXNodHBfcXVlcnlfc3Vic2NyaWJlcnMoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpc2h0cF9tc2dfaGRyCWlzaHRwX2hkcjsKKwlzdHJ1Y3QgaXNoX3N5c3RlbV9zdGF0ZXNfcXVlcnlfc3Vic2NyaWJlcnMgcXVlcnlfc3Vic2NyaWJlcnNfbXNnOworCWNvbnN0IHNpemVfdCBsZW4gPSBzaXplb2Yoc3RydWN0IGlzaF9zeXN0ZW1fc3RhdGVzX3F1ZXJ5X3N1YnNjcmliZXJzKTsKKworCWZpeF9jbF9oZHIoJmlzaHRwX2hkciwgbGVuLCBJU0hUUF9TWVNURU1fU1RBVEVfQ0xJRU5UX0FERFIpOworCisJbWVtc2V0KCZxdWVyeV9zdWJzY3JpYmVyc19tc2csIDAsIGxlbik7CisJcXVlcnlfc3Vic2NyaWJlcnNfbXNnLmhkci5jbWQgPSBTWVNURU1fU1RBVEVfUVVFUllfU1VCU0NSSUJFUlM7CisKKwlpc2h0cF93cml0ZV9tZXNzYWdlKGRldiwgJmlzaHRwX2hkciwKKwkJKHVuc2lnbmVkIGNoYXIgKikmcXVlcnlfc3Vic2NyaWJlcnNfbXNnKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2ludGVsLWlzaC1oaWQvaXNodHAvaGJtLmggYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwL2hibS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NjExMWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwL2hibS5oCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogSVNIVFAgYnVzIGxheWVyIG1lc3NhZ2VzIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0lTSFRQX0hCTV9IXworI2RlZmluZSBfSVNIVFBfSEJNX0hfCisKKyNpbmNsdWRlIDxsaW51eC91dWlkLmg+CisKK3N0cnVjdCBpc2h0cF9kZXZpY2U7CitzdHJ1Y3QgaXNodHBfbXNnX2hkcjsKK3N0cnVjdCBpc2h0cF9jbDsKKworLyoKKyAqIFRpbWVvdXRzIGluIFNlY29uZHMKKyAqLworI2RlZmluZSBJU0hUUF9JTlRFUk9QX1RJTUVPVVQJCTcgLyogVGltZW91dCBvbiByZWFkeSBtZXNzYWdlICovCisKKyNkZWZpbmUgSVNIVFBfQ0xfQ09OTkVDVF9USU1FT1VUCTE1IC8qIEhQUzogQ2xpZW50IENvbm5lY3QgVGltZW91dCAqLworCisvKgorICogSVNIVFAgVmVyc2lvbgorICovCisjZGVmaW5lIEhCTV9NSU5PUl9WRVJTSU9OCQkwCisjZGVmaW5lIEhCTV9NQUpPUl9WRVJTSU9OCQkxCisKKy8qIEhvc3QgYnVzIG1lc3NhZ2UgY29tbWFuZCBvcGNvZGUgKi8KKyNkZWZpbmUgSVNIVFBfSEJNX0NNRF9PUF9NU0sJCTB4N2YKKy8qIEhvc3QgYnVzIG1lc3NhZ2UgY29tbWFuZCBSRVNQT05TRSAqLworI2RlZmluZSBJU0hUUF9IQk1fQ01EX1JFU19NU0sJCTB4ODAKKworLyoKKyAqIElTSFRQIEJ1cyBNZXNzYWdlIENvbW1hbmQgSURzCisgKi8KKyNkZWZpbmUgSE9TVF9TVEFSVF9SRVFfQ01ECQkweDAxCisjZGVmaW5lIEhPU1RfU1RBUlRfUkVTX0NNRAkJMHg4MQorCisjZGVmaW5lIEhPU1RfU1RPUF9SRVFfQ01ECQkweDAyCisjZGVmaW5lIEhPU1RfU1RPUF9SRVNfQ01ECQkweDgyCisKKyNkZWZpbmUgRldfU1RPUF9SRVFfQ01ECQkJMHgwMworCisjZGVmaW5lIEhPU1RfRU5VTV9SRVFfQ01ECQkweDA0CisjZGVmaW5lIEhPU1RfRU5VTV9SRVNfQ01ECQkweDg0CisKKyNkZWZpbmUgSE9TVF9DTElFTlRfUFJPUEVSVElFU19SRVFfQ01ECTB4MDUKKyNkZWZpbmUgSE9TVF9DTElFTlRfUFJPUEVSVElFU19SRVNfQ01ECTB4ODUKKworI2RlZmluZSBDTElFTlRfQ09OTkVDVF9SRVFfQ01ECQkweDA2CisjZGVmaW5lIENMSUVOVF9DT05ORUNUX1JFU19DTUQJCTB4ODYKKworI2RlZmluZSBDTElFTlRfRElTQ09OTkVDVF9SRVFfQ01ECTB4MDcKKyNkZWZpbmUgQ0xJRU5UX0RJU0NPTk5FQ1RfUkVTX0NNRAkweDg3CisKKyNkZWZpbmUgSVNIVFBfRkxPV19DT05UUk9MX0NNRAkJMHgwOAorCisjZGVmaW5lIERNQV9CVUZGRVJfQUxMT0NfTk9USUZZCQkweDExCisjZGVmaW5lIERNQV9CVUZGRVJfQUxMT0NfUkVTUE9OU0UJMHg5MQorCisjZGVmaW5lIERNQV9YRkVSCQkJMHgxMgorI2RlZmluZSBETUFfWEZFUl9BQ0sJCQkweDkyCisKKy8qCisgKiBJU0hUUCBTdG9wIFJlYXNvbgorICogdXNlZCBieSBoYm1faG9zdF9zdG9wX3JlcXVlc3QucmVhc29uCisgKi8KKyNkZWZpbmUJRFJJVkVSX1NUT1BfUkVRVUVTVAkJMHgwMAorCisvKgorICogSVNIVFAgQlVTIEludGVyZmFjZSBTZWN0aW9uCisgKi8KK3N0cnVjdCBpc2h0cF9tc2dfaGRyIHsKKwl1aW50MzJfdCBmd19hZGRyOjg7CisJdWludDMyX3QgaG9zdF9hZGRyOjg7CisJdWludDMyX3QgbGVuZ3RoOjk7CisJdWludDMyX3QgcmVzZXJ2ZWQ6NjsKKwl1aW50MzJfdCBtc2dfY29tcGxldGU6MTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpc2h0cF9idXNfbWVzc2FnZSB7CisJdWludDhfdCBoYm1fY21kOworCXVpbnQ4X3QgZGF0YVswXTsKK30gX19wYWNrZWQ7CisKKy8qKgorICogc3RydWN0IGhibV9jbF9jbWQgLSBjbGllbnQgc3BlY2lmaWMgaG9zdCBidXMgY29tbWFuZAorICoJQ09OTkVDVCwgRElTQ09OTkVDVCwgYW5kIEZsT1cgQ09OVFJPTAorICoKKyAqIEBoYm1fY21kIC0gYnVzIG1lc3NhZ2UgY29tbWFuZCBoZWFkZXIKKyAqIEBmd19hZGRyIC0gYWRkcmVzcyBvZiB0aGUgZncgY2xpZW50CisgKiBAaG9zdF9hZGRyIC0gYWRkcmVzcyBvZiB0aGUgY2xpZW50IGluIHRoZSBkcml2ZXIKKyAqIEBkYXRhCisgKi8KK3N0cnVjdCBpc2h0cF9oYm1fY2xfY21kIHsKKwl1aW50OF90IGhibV9jbWQ7CisJdWludDhfdCBmd19hZGRyOworCXVpbnQ4X3QgaG9zdF9hZGRyOworCXVpbnQ4X3QgZGF0YTsKK307CisKK3N0cnVjdCBoYm1fdmVyc2lvbiB7CisJdWludDhfdCBtaW5vcl92ZXJzaW9uOworCXVpbnQ4X3QgbWFqb3JfdmVyc2lvbjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoYm1faG9zdF92ZXJzaW9uX3JlcXVlc3QgeworCXVpbnQ4X3QgaGJtX2NtZDsKKwl1aW50OF90IHJlc2VydmVkOworCXN0cnVjdCBoYm1fdmVyc2lvbiBob3N0X3ZlcnNpb247Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaGJtX2hvc3RfdmVyc2lvbl9yZXNwb25zZSB7CisJdWludDhfdCBoYm1fY21kOworCXVpbnQ4X3QgaG9zdF92ZXJzaW9uX3N1cHBvcnRlZDsKKwlzdHJ1Y3QgaGJtX3ZlcnNpb24gZndfbWF4X3ZlcnNpb247Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaGJtX2hvc3Rfc3RvcF9yZXF1ZXN0IHsKKwl1aW50OF90IGhibV9jbWQ7CisJdWludDhfdCByZWFzb247CisJdWludDhfdCByZXNlcnZlZFsyXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoYm1faG9zdF9zdG9wX3Jlc3BvbnNlIHsKKwl1aW50OF90IGhibV9jbWQ7CisJdWludDhfdCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoYm1faG9zdF9lbnVtX3JlcXVlc3QgeworCXVpbnQ4X3QgaGJtX2NtZDsKKwl1aW50OF90IHJlc2VydmVkWzNdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGhibV9ob3N0X2VudW1fcmVzcG9uc2UgeworCXVpbnQ4X3QgaGJtX2NtZDsKKwl1aW50OF90IHJlc2VydmVkWzNdOworCXVpbnQ4X3QgdmFsaWRfYWRkcmVzc2VzWzMyXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpc2h0cF9jbGllbnRfcHJvcGVydGllcyB7CisJdXVpZF9sZSBwcm90b2NvbF9uYW1lOworCXVpbnQ4X3QgcHJvdG9jb2xfdmVyc2lvbjsKKwl1aW50OF90IG1heF9udW1iZXJfb2ZfY29ubmVjdGlvbnM7CisJdWludDhfdCBmaXhlZF9hZGRyZXNzOworCXVpbnQ4X3Qgc2luZ2xlX3JlY3ZfYnVmOworCXVpbnQzMl90IG1heF9tc2dfbGVuZ3RoOworCXVpbnQ4X3QgZG1hX2hkcl9sZW47CisjZGVmaW5lCUlTSFRQX0NMSUVOVF9ETUFfRU5BQkxFRAkweDgwCisJdWludDhfdCByZXNlcnZlZDQ7CisJdWludDhfdCByZXNlcnZlZDU7CisJdWludDhfdCByZXNlcnZlZDY7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaGJtX3Byb3BzX3JlcXVlc3QgeworCXVpbnQ4X3QgaGJtX2NtZDsKKwl1aW50OF90IGFkZHJlc3M7CisJdWludDhfdCByZXNlcnZlZFsyXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoYm1fcHJvcHNfcmVzcG9uc2UgeworCXVpbnQ4X3QgaGJtX2NtZDsKKwl1aW50OF90IGFkZHJlc3M7CisJdWludDhfdCBzdGF0dXM7CisJdWludDhfdCByZXNlcnZlZFsxXTsKKwlzdHJ1Y3QgaXNodHBfY2xpZW50X3Byb3BlcnRpZXMgY2xpZW50X3Byb3BlcnRpZXM7Cit9IF9fcGFja2VkOworCisvKioKKyAqIHN0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVxdWVzdCAtIGNvbm5lY3QvZGlzY29ubmVjdCByZXF1ZXN0CisgKgorICogQGhibV9jbWQgLSBidXMgbWVzc2FnZSBjb21tYW5kIGhlYWRlcgorICogQGZ3X2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBmdyBjbGllbnQKKyAqIEBob3N0X2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBjbGllbnQgaW4gdGhlIGRyaXZlcgorICogQHJlc2VydmVkCisgKi8KK3N0cnVjdCBoYm1fY2xpZW50X2Nvbm5lY3RfcmVxdWVzdCB7CisJdWludDhfdCBoYm1fY21kOworCXVpbnQ4X3QgZndfYWRkcjsKKwl1aW50OF90IGhvc3RfYWRkcjsKKwl1aW50OF90IHJlc2VydmVkOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlIC0gY29ubmVjdC9kaXNjb25uZWN0IHJlc3BvbnNlCisgKgorICogQGhibV9jbWQgLSBidXMgbWVzc2FnZSBjb21tYW5kIGhlYWRlcgorICogQGZ3X2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBmdyBjbGllbnQKKyAqIEBob3N0X2FkZHIgLSBhZGRyZXNzIG9mIHRoZSBjbGllbnQgaW4gdGhlIGRyaXZlcgorICogQHN0YXR1cyAtIHN0YXR1cyBvZiB0aGUgcmVxdWVzdAorICovCitzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3Jlc3BvbnNlIHsKKwl1aW50OF90IGhibV9jbWQ7CisJdWludDhfdCBmd19hZGRyOworCXVpbnQ4X3QgaG9zdF9hZGRyOworCXVpbnQ4X3Qgc3RhdHVzOworfSBfX3BhY2tlZDsKKworCisjZGVmaW5lIElTSFRQX0ZDX01FU1NBR0VfUkVTRVJWRURfTEVOR1RICQk1CisKK3N0cnVjdCBoYm1fZmxvd19jb250cm9sIHsKKwl1aW50OF90IGhibV9jbWQ7CisJdWludDhfdCBmd19hZGRyOworCXVpbnQ4X3QgaG9zdF9hZGRyOworCXVpbnQ4X3QgcmVzZXJ2ZWRbSVNIVFBfRkNfTUVTU0FHRV9SRVNFUlZFRF9MRU5HVEhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IGRtYV9hbGxvY19ub3RpZnkgeworCXVpbnQ4X3QgaGJtOworCXVpbnQ4X3Qgc3RhdHVzOworCXVpbnQ4X3QgcmVzZXJ2ZWRbMl07CisJdWludDMyX3QgYnVmX3NpemU7CisJdWludDY0X3QgYnVmX2FkZHJlc3M7CisJLyogWy4uLl0gTWF5IGNvbWUgbW9yZSBzaXplL2FkZHJlc3MgcGFpcnMgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBkbWFfeGZlcl9oYm0geworCXVpbnQ4X3QgaGJtOworCXVpbnQ4X3QgZndfY2xpZW50X2lkOworCXVpbnQ4X3QgaG9zdF9jbGllbnRfaWQ7CisJdWludDhfdCByZXNlcnZlZDsKKwl1aW50NjRfdCBtc2dfYWRkcjsKKwl1aW50MzJfdCBtc2dfbGVuZ3RoOworCXVpbnQzMl90IHJlc2VydmVkMjsKK30gX19wYWNrZWQ7CisKKy8qIFN5c3RlbSBzdGF0ZSAqLworI2RlZmluZSBJU0hUUF9TWVNURU1fU1RBVEVfQ0xJRU5UX0FERFIJCTEzCisKKyNkZWZpbmUgU1lTVEVNX1NUQVRFX1NVQlNDUklCRQkJCTB4MQorI2RlZmluZSBTWVNURU1fU1RBVEVfU1RBVFVTCQkJMHgyCisjZGVmaW5lIFNZU1RFTV9TVEFURV9RVUVSWV9TVUJTQ1JJQkVSUwkJMHgzCisjZGVmaW5lIFNZU1RFTV9TVEFURV9TVEFURV9DSEFOR0VfUkVRCQkweDQKKy8qaW5kaWNhdGVzIHN1c3BlbmQgYW5kIHJlc3VtZSBzdGF0ZXMqLworI2RlZmluZSBTVVNQRU5EX1NUQVRFX0JJVAkJCSgxPDwxKQorCitzdHJ1Y3QgaXNoX3N5c3RlbV9zdGF0ZXNfaGVhZGVyIHsKKwl1aW50MzJfdCBjbWQ7CisJdWludDMyX3QgY21kX3N0YXR1czsJLypyZXNwb25zZXMgd2lsbCBoYXZlIHRoaXMgc2V0Ki8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpc2hfc3lzdGVtX3N0YXRlc19zdWJzY3JpYmUgeworCXN0cnVjdCBpc2hfc3lzdGVtX3N0YXRlc19oZWFkZXIgaGRyOworCXVpbnQzMl90IHN0YXRlczsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpc2hfc3lzdGVtX3N0YXRlc19zdGF0dXMgeworCXN0cnVjdCBpc2hfc3lzdGVtX3N0YXRlc19oZWFkZXIgaGRyOworCXVpbnQzMl90IHN1cHBvcnRlZF9zdGF0ZXM7CisJdWludDMyX3Qgc3RhdGVzX3N0YXR1czsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpc2hfc3lzdGVtX3N0YXRlc19xdWVyeV9zdWJzY3JpYmVycyB7CisJc3RydWN0IGlzaF9zeXN0ZW1fc3RhdGVzX2hlYWRlciBoZHI7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaXNoX3N5c3RlbV9zdGF0ZXNfc3RhdGVfY2hhbmdlX3JlcSB7CisJc3RydWN0IGlzaF9zeXN0ZW1fc3RhdGVzX2hlYWRlciBoZHI7CisJdWludDMyX3QgcmVxdWVzdGVkX3N0YXRlczsKKwl1aW50MzJfdCBzdGF0ZXNfc3RhdHVzOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBlbnVtIGlzaHRwX2hibV9zdGF0ZSAtIGhvc3QgYnVzIG1lc3NhZ2UgcHJvdG9jb2wgc3RhdGUKKyAqCisgKiBASVNIVFBfSEJNX0lETEUgOiBwcm90b2NvbCBub3Qgc3RhcnRlZAorICogQElTSFRQX0hCTV9TVEFSVCA6IHN0YXJ0IHJlcXVlc3QgbWVzc2FnZSB3YXMgc2VudAorICogQElTSFRQX0hCTV9FTlVNX0NMSUVOVFMgOiBlbnVtZXJhdGlvbiByZXF1ZXN0IHdhcyBzZW50CisgKiBASVNIVFBfSEJNX0NMSUVOVF9QUk9QRVJUSUVTIDogYWNxdWlyaW5nIGNsaWVudHMgcHJvcGVydGllcworICovCitlbnVtIGlzaHRwX2hibV9zdGF0ZSB7CisJSVNIVFBfSEJNX0lETEUgPSAwLAorCUlTSFRQX0hCTV9TVEFSVCwKKwlJU0hUUF9IQk1fU1RBUlRFRCwKKwlJU0hUUF9IQk1fRU5VTV9DTElFTlRTLAorCUlTSFRQX0hCTV9DTElFTlRfUFJPUEVSVElFUywKKwlJU0hUUF9IQk1fV09SS0lORywKKwlJU0hUUF9IQk1fU1RPUFBFRCwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc2h0cF9oYm1faGRyKHN0cnVjdCBpc2h0cF9tc2dfaGRyICpoZHIsIHNpemVfdCBsZW5ndGgpCit7CisJaGRyLT5ob3N0X2FkZHIgPSAwOworCWhkci0+ZndfYWRkciA9IDA7CisJaGRyLT5sZW5ndGggPSBsZW5ndGg7CisJaGRyLT5tc2dfY29tcGxldGUgPSAxOworCWhkci0+cmVzZXJ2ZWQgPSAwOworfQorCitpbnQgaXNodHBfaGJtX3N0YXJ0X3JlcShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpOworaW50IGlzaHRwX2hibV9zdGFydF93YWl0KHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldik7CitpbnQgaXNodHBfaGJtX2NsX2Zsb3dfY29udHJvbF9yZXEoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGlzaHRwX2NsICpjbCk7CitpbnQgaXNodHBfaGJtX2NsX2Rpc2Nvbm5lY3RfcmVxKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwgc3RydWN0IGlzaHRwX2NsICpjbCk7CitpbnQgaXNodHBfaGJtX2NsX2Nvbm5lY3RfcmVxKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwgc3RydWN0IGlzaHRwX2NsICpjbCk7Cit2b2lkIGlzaHRwX2hibV9lbnVtX2NsaWVudHNfcmVxKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldik7Cit2b2lkIGJoX2hibV93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIHJlY3ZfaGJtKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwgc3RydWN0IGlzaHRwX21zZ19oZHIgKmlzaHRwX2hkcik7Cit2b2lkIHJlY3ZfZml4ZWRfY2xfbXNnKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaXNodHBfbXNnX2hkciAqaXNodHBfaGRyKTsKK3ZvaWQgaXNodHBfaGJtX2Rpc3BhdGNoKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaXNodHBfYnVzX21lc3NhZ2UgKmhkcik7CisKK3ZvaWQgaXNodHBfcXVlcnlfc3Vic2NyaWJlcnMoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KTsKKworLyogRXhwb3J0ZWQgSS9GICovCit2b2lkIGlzaHRwX3NlbmRfc3VzcGVuZChzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpOwordm9pZCBpc2h0cF9zZW5kX3Jlc3VtZShzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpOworCisjZW5kaWYgLyogX0lTSFRQX0hCTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC9pbml0LmMgYi9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwL2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzM2NDQxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC9pbml0LmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBJbml0aWFsaXphdGlvbiBwcm90b2NvbCBmb3IgSVNIVFAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSAiaXNodHAtZGV2LmgiCisjaW5jbHVkZSAiaGJtLmgiCisjaW5jbHVkZSAiY2xpZW50LmgiCisKKy8qKgorICogaXNodHBfZGV2X3N0YXRlX3N0cigpIC1Db252ZXJ0IHRvIHN0cmluZyBmb3JtYXQKKyAqIEBzdGF0ZTogc3RhdGUgdG8gY29udmVydAorICoKKyAqIENvbnZlcnQgc3RhdGUgdG8gc3RyaW5nIGZvciBwcmludHMKKyAqCisgKiBSZXR1cm46IGNoYXJhY3RlciBwb2ludGVyIHRvIGNvbnZlcnRlZCBzdHJpbmcKKyAqLworY29uc3QgY2hhciAqaXNodHBfZGV2X3N0YXRlX3N0cihpbnQgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgSVNIVFBfREVWX0lOSVRJQUxJWklORzoKKwkJcmV0dXJuCSJJTklUSUFMSVpJTkciOworCWNhc2UgSVNIVFBfREVWX0lOSVRfQ0xJRU5UUzoKKwkJcmV0dXJuCSJJTklUX0NMSUVOVFMiOworCWNhc2UgSVNIVFBfREVWX0VOQUJMRUQ6CisJCXJldHVybgkiRU5BQkxFRCI7CisJY2FzZSBJU0hUUF9ERVZfUkVTRVRUSU5HOgorCQlyZXR1cm4JIlJFU0VUVElORyI7CisJY2FzZSBJU0hUUF9ERVZfRElTQUJMRUQ6CisJCXJldHVybgkiRElTQUJMRUQiOworCWNhc2UgSVNIVFBfREVWX1BPV0VSX0RPV046CisJCXJldHVybgkiUE9XRVJfRE9XTiI7CisJY2FzZSBJU0hUUF9ERVZfUE9XRVJfVVA6CisJCXJldHVybgkiUE9XRVJfVVAiOworCWRlZmF1bHQ6CisJCXJldHVybiAidW5rbm93biI7CisJfQorfQorCisvKioKKyAqIGlzaHRwX2RldmljZV9pbml0KCkgLSBpc2h0cCBkZXZpY2UgaW5pdAorICogQGRldjogSVNIVFAgZGV2aWNlIGluc3RhbmNlCisgKgorICogQWZ0ZXIgSVNIVFAgZGV2aWNlIGlzIGFsbG9hY3RlZCwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGluaXRpYWxpemUKKyAqIGVhY2ggZmllbGQgd2hpY2ggaW5jbHVkZXMgc3BpbiBsb2NrLCB3b3JrIHN0cnVjdCBhbmQgbGlzdHMKKyAqLwordm9pZCBpc2h0cF9kZXZpY2VfaW5pdChzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJZGV2LT5kZXZfc3RhdGUgPSBJU0hUUF9ERVZfSU5JVElBTElaSU5HOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmNsX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmRldmljZV9saXN0KTsKKwlkZXYtPnJkX21zZ19maWZvX2hlYWQgPSAwOworCWRldi0+cmRfbXNnX2ZpZm9fdGFpbCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+cmRfbXNnX3NwaW5sb2NrKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+d2FpdF9oYm1fcmVjdmRfbXNnKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5yZWFkX2xpc3Rfc3BpbmxvY2spOworCXNwaW5fbG9ja19pbml0KCZkZXYtPmRldmljZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5kZXZpY2VfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5jbF9saXN0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZkZXYtPmZ3X2NsaWVudHNfbG9jayk7CisJSU5JVF9XT1JLKCZkZXYtPmJoX2hibV93b3JrLCBiaF9oYm1fd29ya19mbik7CisKKwliaXRtYXBfemVybyhkZXYtPmhvc3RfY2xpZW50c19tYXAsIElTSFRQX0NMSUVOVFNfTUFYKTsKKwlkZXYtPm9wZW5faGFuZGxlX2NvdW50ID0gMDsKKworCS8qCisJICogUmVzZXJ2aW5nIGNsaWVudCBJRCAwIGZvciBJU0hUUCBCdXMgTWVzc2FnZSBjb21tdW5pY2F0aW9ucworCSAqLworCWJpdG1hcF9zZXQoZGV2LT5ob3N0X2NsaWVudHNfbWFwLCAwLCAxKTsKKworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnJlYWRfbGlzdC5saXN0KTsKKworfQorRVhQT1JUX1NZTUJPTChpc2h0cF9kZXZpY2VfaW5pdCk7CisKKy8qKgorICogaXNodHBfc3RhcnQoKSAtIFN0YXJ0IElTSCBwcm9jZXNzaW5nCisgKiBAZGV2OiBJU0hUUCBkZXZpY2UgaW5zdGFuY2UKKyAqCisgKiBTdGFydCBJU0hUUCBwcm9jZXNzaW5nIGJ5IHNlbmRpbmcgcXVlcnkgc3Vic2NyaWJlciBtZXNzYWdlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgZWxzZSAtRU5PREVWCisgKi8KK2ludCBpc2h0cF9zdGFydChzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJaWYgKGlzaHRwX2hibV9zdGFydF93YWl0KGRldikpIHsKKwkJZGV2X2VycihkZXYtPmRldmMsICJIQk0gaGF2ZW4ndCBzdGFydGVkIik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIHN1c3BlbmQgJiByZXN1bWUgbm90aWZpY2F0aW9uIC0gc2VuZCBRVUVSWV9TVUJTQ1JJQkVSUyBtc2cgKi8KKwlpc2h0cF9xdWVyeV9zdWJzY3JpYmVycyhkZXYpOworCisJcmV0dXJuIDA7CitlcnI6CisJZGV2X2VycihkZXYtPmRldmMsICJsaW5rIGxheWVyIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworCWRldi0+ZGV2X3N0YXRlID0gSVNIVFBfREVWX0RJU0FCTEVEOworCXJldHVybiAtRU5PREVWOworfQorRVhQT1JUX1NZTUJPTChpc2h0cF9zdGFydCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9pbnRlbC1pc2gtaGlkL2lzaHRwL2lzaHRwLWRldi5oIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC9pc2h0cC1kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTRmOWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9oaWQvaW50ZWwtaXNoLWhpZC9pc2h0cC9pc2h0cC1kZXYuaApAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIE1vc3QgSVNIVFAgcHJvdmlkZXIgZGV2aWNlIGFuZCBJU0hUUCBsb2dpYyBkZWNsYXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfSVNIVFBfREVWX0hfCisjZGVmaW5lIF9JU0hUUF9ERVZfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJidXMuaCIKKyNpbmNsdWRlICJoYm0uaCIKKworI2RlZmluZQlJUENfUEFZTE9BRF9TSVpFCTEyOAorI2RlZmluZSBJU0hUUF9SRF9NU0dfQlVGX1NJWkUJSVBDX1BBWUxPQURfU0laRQorI2RlZmluZQlJUENfRlVMTF9NU0dfU0laRQkxMzIKKworLyogTnVtYmVyIG9mIG1lc3NhZ2VzIHRvIGJlIGhlbGQgaW4gSVNSLT5CSCBGSUZPICovCisjZGVmaW5lCVJEX0lOVF9GSUZPX1NJWkUJNjQKKworLyoKKyAqIE51bWJlciBvZiBJUEMgbWVzc2FnZXMgdG8gYmUgaGVsZCBpbiBUeCBGSUZPLCB0byBiZSBzZW50IGJ5IElTUiAtCisgKiBUeCBjb21wbGV0ZSBpbnRlcnJ1cHQgb3IgUlhfQ09NUExFVEUgaGFuZGxlcgorICovCisjZGVmaW5lCUlQQ19UWF9GSUZPX1NJWkUJNTEyCisKKy8qCisgKiBOdW1iZXIgb2YgTWF4aW11bSBJU0hUUCBDbGllbnRzCisgKi8KKyNkZWZpbmUgSVNIVFBfQ0xJRU5UU19NQVggMjU2CisKKy8qCisgKiBOdW1iZXIgb2YgRmlsZSBkZXNjcmlwdG9ycy9oYW5kbGVzCisgKiB0aGF0IGNhbiBiZSBvcGVuZWQgdG8gdGhlIGRyaXZlci4KKyAqCisgKiBMaW1pdCB0byAyNTU6IDI1NiBUb3RhbCBDbGllbnRzCisgKiBtaW51cyBpbnRlcm5hbCBjbGllbnQgZm9yIElTSFRQIEJ1cyBNZXNzYWdlcworICovCisjZGVmaW5lIElTSFRQX01BWF9PUEVOX0hBTkRMRV9DT1VOVCAoSVNIVFBfQ0xJRU5UU19NQVggLSAxKQorCisvKiBJbnRlcm5hbCBDbGllbnRzIE51bWJlciAqLworI2RlZmluZSBJU0hUUF9IT1NUX0NMSUVOVF9JRF9BTlkJCSgtMSkKKyNkZWZpbmUgSVNIVFBfSEJNX0hPU1RfQ0xJRU5UX0lECQkwCisKKyNkZWZpbmUJTUFYX0RNQV9ERUxBWQkyMAorCisvKiBJU0hUUCBkZXZpY2Ugc3RhdGVzICovCitlbnVtIGlzaHRwX2Rldl9zdGF0ZSB7CisJSVNIVFBfREVWX0lOSVRJQUxJWklORyA9IDAsCisJSVNIVFBfREVWX0lOSVRfQ0xJRU5UUywKKwlJU0hUUF9ERVZfRU5BQkxFRCwKKwlJU0hUUF9ERVZfUkVTRVRUSU5HLAorCUlTSFRQX0RFVl9ESVNBQkxFRCwKKwlJU0hUUF9ERVZfUE9XRVJfRE9XTiwKKwlJU0hUUF9ERVZfUE9XRVJfVVAKK307Citjb25zdCBjaGFyICppc2h0cF9kZXZfc3RhdGVfc3RyKGludCBzdGF0ZSk7CisKK3N0cnVjdCBpc2h0cF9jbDsKKworLyoqCisgKiBzdHJ1Y3QgaXNodHBfZndfY2xpZW50IC0gcmVwcmVzZW50YXRpb24gb2YgZncgY2xpZW50CisgKgorICogQHByb3BzIC0gY2xpZW50IHByb3BlcnRpZXMKKyAqIEBjbGllbnRfaWQgLSBmdyBjbGllbnQgaWQKKyAqLworc3RydWN0IGlzaHRwX2Z3X2NsaWVudCB7CisJc3RydWN0IGlzaHRwX2NsaWVudF9wcm9wZXJ0aWVzIHByb3BzOworCXVpbnQ4X3QgY2xpZW50X2lkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaXNodHBfbXNnX2RhdGEgLSBJU0hUUCBtZXNzYWdlIGRhdGEgc3RydWN0CisgKiBAc2l6ZToJU2l6ZSBvZiBkYXRhIGluIHRoZSAqZGF0YQorICogQGRhdGE6CVBvaW50ZXIgdG8gZGF0YQorICovCitzdHJ1Y3QgaXNodHBfbXNnX2RhdGEgeworCXVpbnQzMl90IHNpemU7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKK307CisKKy8qCisgKiBzdHJ1Y3QgaXNodHBfY2xfcmIgLSByZXF1ZXN0IGJsb2NrIHN0cnVjdHVyZQorICogQGxpc3Q6CUxpbmsgdG8gbGlzdCBtZW1iZXJzCisgKiBAY2w6CQlJU0hUUCBjbGllbnQgaW5zdGFuY2UKKyAqIEBidWZmZXI6CW1lc3NhZ2UgaGVhZGVyCisgKiBAYnVmX2lkeDoJSW5kZXggaW50byBidWZmZXIKKyAqIEByZWFkX3RpbWU6CSB1bnVzZWQgYXQgdGhpcyB0aW1lCisgKi8KK3N0cnVjdCBpc2h0cF9jbF9yYiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBpc2h0cF9jbCAqY2w7CisJc3RydWN0IGlzaHRwX21zZ19kYXRhIGJ1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIGJ1Zl9pZHg7CisJdW5zaWduZWQgbG9uZyByZWFkX3RpbWU7Cit9OworCisvKgorICogQ29udHJvbCBpbmZvIGZvciBJUEMgbWVzc2FnZXMgSVNIVFAvSVBDIHNlbmRpbmcgRklGTyAtCisgKiBsaXN0IHdpdGggaW5saW5lIGRhdGEgYnVmZmVyCisgKiBUaGlzIHN0cnVjdHVyZSB3aWxsIGJlIGZpbGxlZCB3aXRoIHBhcmFtZXRlcnMgc3VibWl0dGVkCisgKiBieSB0aGUgY2FsbGVyIGdsdWUgbGF5ZXIKKyAqICdidWYnIG1heSBiZSBwb2ludGluZyB0byB0aGUgZXh0ZXJuYWwgYnVmZmVyIG9yIHRvICdpbmxpbmVfZGF0YScKKyAqICdvZmZzZXQnIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gMCBieSBzdWJtaXR0aW5nCisgKgorICogJ2lwY19zZW5kX2NvbXBsJyBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGNsaWVudHMgdGhhdCBzZW5kIGZyYWdtZW50ZWQKKyAqIG1lc3NhZ2VzLiBXaGVuIGEgZnJhZ21lbnQgaXMgc2VudCBkb3duIHRvIElQQyBtc2cgcmVncywKKyAqIGl0IHdpbGwgYmUgY2FsbGVkLgorICogSWYgaXQgaGFzIG1vcmUgZnJhZ21lbnRzIHRvIHNlbmQsIGl0IHdpbGwgZG8gaXQuIFdpdGggbGFzdCBmcmFnbWVudAorICogaXQgd2lsbCBzZW5kIGFwcHJvcHJpYXRlIElTSFRQICJtZXNzYWdlLWNvbXBsZXRlIiBmbGFnLgorICogSXQgd2lsbCByZW1vdmUgdGhlIG91dHN0YW5kaW5nIG1lc3NhZ2UKKyAqIChtYXJrIG91dHN0YW5kaW5nIGJ1ZmZlciBhcyBhdmFpbGFibGUpLgorICogSWYgY291bnRpbmcgZmxvdyBjb250cm9sIGlzIGluIHdvcmsgYW5kIHRoZXJlIGFyZSBtb3JlIGZsb3cgY29udHJvbAorICogY3JlZGl0cywgaXQgY2FuIHB1dCB0aGUgbmV4dCBjbGllbnQgbWVzc2FnZSBxdWV1ZWQgaW4gY2wuCisgKiBzdHJ1Y3R1cmUgZm9yIElQQyBwcm9jZXNzaW5nLgorICoKKyAqLworc3RydWN0IHdyX21zZ19jdGxfaW5mbyB7CisJLyogV2lsbCBiZSBjYWxsZWQgd2l0aCAnaXBjX3NlbmRfY29tcGxfcHJtJyBhcyBwYXJhbWV0ZXIgKi8KKwl2b2lkICgqaXBjX3NlbmRfY29tcGwpKHZvaWQgKik7CisKKwl2b2lkICppcGNfc2VuZF9jb21wbF9wcm07CisJc2l6ZV90IGxlbmd0aDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CisJdW5zaWduZWQgY2hhcglpbmxpbmVfZGF0YVtJUENfRlVMTF9NU0dfU0laRV07Cit9OworCisvKgorICogVGhlIElTSFRQIGxheWVyIHRhbGtzIHRvIGhhcmR3YXJlIElQQyBtZXNzYWdlIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAqIGNhbGxiYWNrcworICovCitzdHJ1Y3QgaXNodHBfaHdfb3BzIHsKKwlpbnQJKCpod19yZXNldCkoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KTsKKwlpbnQJKCppcGNfcmVzZXQpKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldik7CisJdWludDMyX3QgKCppcGNfZ2V0X2hlYWRlcikoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LCBpbnQgbGVuZ3RoLAorCQkJCSAgIGludCBidXN5KTsKKwlpbnQJKCp3cml0ZSkoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2LAorCQl2b2lkICgqaXBjX3NlbmRfY29tcGwpKHZvaWQgKiksIHZvaWQgKmlwY19zZW5kX2NvbXBsX3BybSwKKwkJdW5zaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuZ3RoKTsKKwl1aW50MzJfdAkoKmlzaHRwX3JlYWRfaGRyKShjb25zdCBzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpOworCWludAkoKmlzaHRwX3JlYWQpKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJdW5zaWduZWQgbG9uZyBidWZmZXJfbGVuZ3RoKTsKKwl1aW50MzJfdAkoKmdldF9md19zdGF0dXMpKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldik7CisJdm9pZAkoKnN5bmNfZndfY2xvY2spKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldik7Cit9OworCisvKioKKyAqIHN0cnVjdCBpc2h0cF9kZXZpY2UgLSBJU0hUUCBwcml2YXRlIGRldmljZSBzdHJ1Y3QKKyAqLworc3RydWN0IGlzaHRwX2RldmljZSB7CisJc3RydWN0IGRldmljZSAqZGV2YzsJLyogcG9pbnRlciB0byBsb3dlc3QgZGV2aWNlICovCisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CS8qIFBDSSBkZXZpY2UgdG8gZ2V0IGRldmljZSBpZHMgKi8KKworCS8qIHdhaXRxIGZvciB3YWl0aW5nIGZvciBzdXNwZW5kIHJlc3BvbnNlICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3VzcGVuZF93YWl0OworCWJvb2wgc3VzcGVuZF9mbGFnOwkvKiBTdXNwZW5kIGlzIGFjdGl2ZSAqLworCisJLyogd2FpdHEgZm9yIHdhaXRpbmcgZm9yIHJlc3VtZSByZXNwb25zZSAqLworCXdhaXRfcXVldWVfaGVhZF90IHJlc3VtZV93YWl0OworCWJvb2wgcmVzdW1lX2ZsYWc7CS8qUmVzdW1lIGlzIGFjdGl2ZSAqLworCisJLyoKKwkgKiBsb2NrIGZvciB0aGUgZGV2aWNlLCBmb3IgZXZlcnl0aGluZyB0aGF0IGRvZXNuJ3QgaGF2ZQorCSAqIGEgZGVkaWNhdGVkIHNwaW5sb2NrCisJICovCisJc3BpbmxvY2tfdCBkZXZpY2VfbG9jazsKKworCWJvb2wgcmVjdmRfaHdfcmVhZHk7CisJc3RydWN0IGhibV92ZXJzaW9uIHZlcnNpb247CisJaW50IHRyYW5zZmVyX3BhdGg7IC8qIENob2ljZSBvZiB0cmFuc2ZlciBwYXRoOiBJUEMgb3IgRE1BICovCisKKwkvKiBpc2h0cCBkZXZpY2Ugc3RhdGVzICovCisJZW51bSBpc2h0cF9kZXZfc3RhdGUgZGV2X3N0YXRlOworCWVudW0gaXNodHBfaGJtX3N0YXRlIGhibV9zdGF0ZTsKKworCS8qIGRyaXZlciByZWFkIHF1ZXVlICovCisJc3RydWN0IGlzaHRwX2NsX3JiIHJlYWRfbGlzdDsKKwlzcGlubG9ja190IHJlYWRfbGlzdF9zcGlubG9jazsKKworCS8qIGxpc3Qgb2YgaXNodHBfY2wncyAqLworCXN0cnVjdCBsaXN0X2hlYWQgY2xfbGlzdDsKKwlzcGlubG9ja190IGNsX2xpc3RfbG9jazsKKwlsb25nIG9wZW5faGFuZGxlX2NvdW50OworCisJLyogTGlzdCBvZiBidXMgZGV2aWNlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2aWNlX2xpc3Q7CisJc3BpbmxvY2tfdCBkZXZpY2VfbGlzdF9sb2NrOworCisJLyogd2FpdGluZyBxdWV1ZXMgZm9yIHJlY2VpdmUgbWVzc2FnZSBmcm9tIEZXICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9od19yZWFkeTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X2hibV9yZWN2ZF9tc2c7CisKKwkvKiBGSUZPIGZvciBpbnB1dCBtZXNzYWdlcyBmb3IgQkggcHJvY2Vzc2luZyAqLworCXVuc2lnbmVkIGNoYXIgcmRfbXNnX2ZpZm9bUkRfSU5UX0ZJRk9fU0laRSAqIElQQ19QQVlMT0FEX1NJWkVdOworCXVuc2lnbmVkIGludCByZF9tc2dfZmlmb19oZWFkLCByZF9tc2dfZmlmb190YWlsOworCXNwaW5sb2NrX3QgcmRfbXNnX3NwaW5sb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdCBiaF9oYm1fd29yazsKKworCS8qIElQQyB3cml0ZSBxdWV1ZSAqLworCXN0cnVjdCB3cl9tc2dfY3RsX2luZm8gd3JfcHJvY2Vzc2luZ19saXN0X2hlYWQsIHdyX2ZyZWVfbGlzdF9oZWFkOworCS8qIEZvciBib3RoIHByb2Nlc3NpbmcgbGlzdCAgYW5kIGZyZWUgbGlzdCAqLworCXNwaW5sb2NrX3Qgd3JfcHJvY2Vzc2luZ19zcGlubG9jazsKKworCXNwaW5sb2NrX3Qgb3V0X2lwY19zcGlubG9jazsKKworCXN0cnVjdCBpc2h0cF9md19jbGllbnQgKmZ3X2NsaWVudHM7IC8qTm90ZTptZW1vcnkgaGFzIHRvIGJlIGFsbG9jYXRlZCovCisJREVDTEFSRV9CSVRNQVAoZndfY2xpZW50c19tYXAsIElTSFRQX0NMSUVOVFNfTUFYKTsKKwlERUNMQVJFX0JJVE1BUChob3N0X2NsaWVudHNfbWFwLCBJU0hUUF9DTElFTlRTX01BWCk7CisJdWludDhfdCBmd19jbGllbnRzX251bTsKKwl1aW50OF90IGZ3X2NsaWVudF9wcmVzZW50YXRpb25fbnVtOworCXVpbnQ4X3QgZndfY2xpZW50X2luZGV4OworCXNwaW5sb2NrX3QgZndfY2xpZW50c19sb2NrOworCisJLyogVFggRE1BIGJ1ZmZlcnMgYW5kIHNsb3RzICovCisJaW50IGlzaHRwX2hvc3RfZG1hX2VuYWJsZWQ7CisJdm9pZCAqaXNodHBfaG9zdF9kbWFfdHhfYnVmOworCXVuc2lnbmVkIGludCBpc2h0cF9ob3N0X2RtYV90eF9idWZfc2l6ZTsKKwl1aW50NjRfdCBpc2h0cF9ob3N0X2RtYV90eF9idWZfcGh5czsKKwlpbnQgaXNodHBfZG1hX251bV9zbG90czsKKworCS8qIG1hcCBvZiA0ayBibG9ja3MgaW4gVHggZG1hIGJ1ZjogMC1mcmVlLCAxLXVzZWQgKi8KKwl1aW50OF90ICppc2h0cF9kbWFfdHhfbWFwOworCXNwaW5sb2NrX3QgaXNodHBfZG1hX3R4X2xvY2s7CisKKwkvKiBSWCBETUEgYnVmZmVycyBhbmQgc2xvdHMgKi8KKwl2b2lkICppc2h0cF9ob3N0X2RtYV9yeF9idWY7CisJdW5zaWduZWQgaW50IGlzaHRwX2hvc3RfZG1hX3J4X2J1Zl9zaXplOworCXVpbnQ2NF90IGlzaHRwX2hvc3RfZG1hX3J4X2J1Zl9waHlzOworCisJLyogRHVtcCB0byB0cmFjZSBidWZmZXJzIGlmIGVuYWJsZWQqLworCXZvaWQgKCpwcmludF9sb2cpKHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldiwgY2hhciAqZm9ybWF0LCAuLi4pOworCisJLyogRGVidWcgc3RhdHMgKi8KKwl1bnNpZ25lZCBpbnQJaXBjX3J4X2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcJaXBjX3J4X2J5dGVzX2NudDsKKwl1bnNpZ25lZCBpbnQJaXBjX3R4X2NudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcJaXBjX3R4X2J5dGVzX2NudDsKKworCWNvbnN0IHN0cnVjdCBpc2h0cF9od19vcHMgKm9wczsKKwlzaXplX3QJbXR1OworCXVpbnQzMl90CWlzaHRwX21zZ19oZHI7CisJY2hhciBod1swXSBfX2FsaWduZWQoc2l6ZW9mKHZvaWQgKikpOworfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGlzaHRwX3NlY3NfdG9famlmZmllcyh1bnNpZ25lZCBsb25nIHNlYykKK3sKKwlyZXR1cm4gbXNlY3NfdG9famlmZmllcyhzZWMgKiBNU0VDX1BFUl9TRUMpOworfQorCisvKgorICogUmVnaXN0ZXIgQWNjZXNzIEZ1bmN0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzaF9pcGNfcmVzZXQoc3RydWN0IGlzaHRwX2RldmljZSAqZGV2KQoreworCXJldHVybiBkZXYtPm9wcy0+aXBjX3Jlc2V0KGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzaF9od19yZXNldChzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+b3BzLT5od19yZXNldChkZXYpOworfQorCisvKiBFeHBvcnRlZCBmdW5jdGlvbiAqLwordm9pZAlpc2h0cF9kZXZpY2VfaW5pdChzdHJ1Y3QgaXNodHBfZGV2aWNlICpkZXYpOworaW50CWlzaHRwX3N0YXJ0KHN0cnVjdCBpc2h0cF9kZXZpY2UgKmRldik7CisKKyNlbmRpZiAvKl9JU0hUUF9ERVZfSF8qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvdWhpZC5jIGIvZHJpdmVycy9oaWQvdWhpZC5jCmluZGV4IDk5ZWMzZmYuLjdmOGZmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3VoaWQuYworKysgYi9kcml2ZXJzL2hpZC91aGlkLmMKQEAgLTc3OSwxOSArNzc5LDggQEAKIAkubWlub3IJCT0gVUhJRF9NSU5PUiwKIAkubmFtZQkJPSBVSElEX05BTUUsCiB9OworbW9kdWxlX21pc2NfZGV2aWNlKHVoaWRfbWlzYyk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHVoaWRfaW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZ1aGlkX21pc2MpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdWhpZF9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZ1aGlkX21pc2MpOwotfQotCi1tb2R1bGVfaW5pdCh1aGlkX2luaXQpOwotbW9kdWxlX2V4aXQodWhpZF9leGl0KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIEhlcnJtYW5uIDxkaC5oZXJybWFubkBnbWFpbC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlVzZXItc3BhY2UgSS9PIGRyaXZlciBzdXBwb3J0IGZvciBISUQgc3Vic3lzdGVtIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwppbmRleCBiNGI4YzZhLi4wYTBlY2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCisrKyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcXVpcmtzLmMKQEAgLTc2LDYgKzc2LDcgQEAKIAl7IFVTQl9WRU5ET1JfSURfQ09SU0FJUiwgVVNCX0RFVklDRV9JRF9DT1JTQUlSX0s5NVJHQiwgSElEX1FVSVJLX05PX0lOSVRfUkVQT1JUUyB8IEhJRF9RVUlSS19BTFdBWVNfUE9MTCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9DT1JTQUlSLCBVU0JfREVWSUNFX0lEX0NPUlNBSVJfSzcwUkdCLCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCiAJeyBVU0JfVkVORE9SX0lEX0NPUlNBSVIsIFVTQl9ERVZJQ0VfSURfQ09SU0FJUl9LNjVSR0IsIEhJRF9RVUlSS19OT19JTklUX1JFUE9SVFMgfSwKKwl7IFVTQl9WRU5ET1JfSURfQ09SU0FJUiwgVVNCX0RFVklDRV9JRF9DT1JTQUlSX1NUUkFGRSwgSElEX1FVSVJLX05PX0lOSVRfUkVQT1JUUyB8IEhJRF9RVUlSS19BTFdBWVNfUE9MTCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9DUkVBVElWRUxBQlMsIFVTQl9ERVZJQ0VfSURfQ1JFQVRJVkVfU0JfT01OSV9TVVJST1VORF81MSwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX0RNSSwgVVNCX0RFVklDRV9JRF9ETUlfRU5DLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfRFJBR09OUklTRSwgVVNCX0RFVklDRV9JRF9EUkFHT05SSVNFX1dJSVUsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LApAQCAtOTgsNiArOTksNyBAQAogCXsgVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfVFlQRV9DT1ZFUl9QUk9fMywgSElEX1FVSVJLX05PX0lOSVRfUkVQT1JUUyB9LAogCXsgVVNCX1ZFTkRPUl9JRF9NSUNST1NPRlQsIFVTQl9ERVZJQ0VfSURfTVNfVFlQRV9DT1ZFUl9QUk9fM18yLCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCiAJeyBVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19UWVBFX0NPVkVSX1BST18zX0pQLCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCisJeyBVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19UWVBFX0NPVkVSX1BST180X0pQLCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCiAJeyBVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19UWVBFX0NPVkVSXzMsIEhJRF9RVUlSS19OT19JTklUX1JFUE9SVFMgfSwKIAl7IFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX1BPV0VSX0NPVkVSLCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCiAJeyBVU0JfVkVORE9SX0lEX01TSSwgVVNCX0RFVklDRV9JRF9NU0lfR1Q2ODNSX0xFRF9QQU5FTCwgSElEX1FVSVJLX05PX0lOSVRfUkVQT1JUUyB9LApAQCAtMTQzLDcgKzE0NSw3IEBACiAJeyBVU0JfVkVORE9SX0lEX0NISUNPTlksIFVTQl9ERVZJQ0VfSURfQ0hJQ09OWV9XSVJFTEVTUywgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1NJR01BX01JQ1JPLCBVU0JfREVWSUNFX0lEX1NJR01BX01JQ1JPX0tFWUJPQVJELCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCiAJeyBVU0JfVkVORE9SX0lEX0tZRSwgVVNCX0RFVklDRV9JRF9LWUVfTU9VU0VQRU5fSTYwOFgsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9LWUUsIFVTQl9ERVZJQ0VfSURfS1lFX01PVVNFUEVOX0k2MDhYXzIsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9LWUUsIFVTQl9ERVZJQ0VfSURfS1lFX01PVVNFUEVOX0k2MDhYX1YyLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfS1lFLCBVU0JfREVWSUNFX0lEX0tZRV9FQVNZUEVOX002MTBYLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfS1lFLCBVU0JfREVWSUNFX0lEX0tZRV9QRU5TS0VUQ0hfTTkxMiwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX05UUklHLCBVU0JfREVWSUNFX0lEX05UUklHX0RVT1NFTlNFLCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC93YWNvbS5oIGIvZHJpdmVycy9oaWQvd2Fjb20uaAppbmRleCA0NjgxYTY1Li5iNDgwMGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC93YWNvbS5oCisrKyBiL2RyaXZlcnMvaGlkL3dhY29tLmgKQEAgLTkwLDYgKzkwLDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CkBAIC0xMDUsMzIgKzEwNyw5NSBAQAogI2RlZmluZSBVU0JfVkVORE9SX0lEX1dBQ09NCTB4MDU2YQogI2RlZmluZSBVU0JfVkVORE9SX0lEX0xFTk9WTwkweDE3ZWYKIAorZW51bSB3YWNvbV93b3JrZXIgeworCVdBQ09NX1dPUktFUl9XSVJFTEVTUywKKwlXQUNPTV9XT1JLRVJfQkFUVEVSWSwKKwlXQUNPTV9XT1JLRVJfUkVNT1RFLAorfTsKKworc3RydWN0IHdhY29tOworCitzdHJ1Y3Qgd2Fjb21fbGVkIHsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGNkZXY7CisJc3RydWN0IGxlZF90cmlnZ2VyIHRyaWdnZXI7CisJc3RydWN0IHdhY29tICp3YWNvbTsKKwl1bnNpZ25lZCBpbnQgZ3JvdXA7CisJdW5zaWduZWQgaW50IGlkOworCXU4IGxsdjsKKwl1OCBobHY7CisJYm9vbCBoZWxkOworfTsKKworc3RydWN0IHdhY29tX2dyb3VwX2xlZHMgeworCXU4IHNlbGVjdDsgLyogc3RhdHVzIGxlZCBzZWxlY3RvciAoMC4uMykgKi8KKwlzdHJ1Y3Qgd2Fjb21fbGVkICpsZWRzOworCXVuc2lnbmVkIGludCBjb3VudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cit9OworCitzdHJ1Y3Qgd2Fjb21fYmF0dGVyeSB7CisJc3RydWN0IHdhY29tICp3YWNvbTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYmF0X2Rlc2M7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeTsKKwljaGFyIGJhdF9uYW1lW1dBQ09NX05BTUVfTUFYXTsKKwlpbnQgYmF0dGVyeV9jYXBhY2l0eTsKKwlpbnQgYmF0X2NoYXJnaW5nOworCWludCBiYXRfY29ubmVjdGVkOworCWludCBwc19jb25uZWN0ZWQ7Cit9OworCitzdHJ1Y3Qgd2Fjb21fcmVtb3RlIHsKKwlzcGlubG9ja190IHJlbW90ZV9sb2NrOworCXN0cnVjdCBrZmlmbyByZW1vdGVfZmlmbzsKKwlzdHJ1Y3Qga29iamVjdCAqcmVtb3RlX2RpcjsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGdyb3VwOworCQl1MzIgc2VyaWFsOworCQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKwkJYm9vbCByZWdpc3RlcmVkOworCQlzdHJ1Y3Qgd2Fjb21fYmF0dGVyeSBiYXR0ZXJ5OworCX0gcmVtb3Rlc1tXQUNPTV9NQVhfUkVNT1RFU107Cit9OworCiBzdHJ1Y3Qgd2Fjb20gewogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CiAJc3RydWN0IHdhY29tX3dhYyB3YWNvbV93YWM7CiAJc3RydWN0IGhpZF9kZXZpY2UgKmhkZXY7CiAJc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci0Jc3RydWN0IHdhY29tX2xlZCB7Ci0JCXU4IHNlbGVjdFs1XTsgLyogc3RhdHVzIGxlZCBzZWxlY3RvciAoMC4uMykgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2lyZWxlc3Nfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYmF0dGVyeV93b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCByZW1vdGVfd29yazsKKwlzdHJ1Y3Qgd2Fjb21fcmVtb3RlICpyZW1vdGU7CisJc3RydWN0IHdhY29tX2xlZHMgeworCQlzdHJ1Y3Qgd2Fjb21fZ3JvdXBfbGVkcyAqZ3JvdXBzOworCQl1bnNpZ25lZCBpbnQgY291bnQ7CiAJCXU4IGxsdjsgICAgICAgLyogc3RhdHVzIGxlZCBicmlnaHRuZXNzIG5vIGJ1dHRvbiAoMS4uMTI3KSAqLwogCQl1OCBobHY7ICAgICAgIC8qIHN0YXR1cyBsZWQgYnJpZ2h0bmVzcyBidXR0b24gcHJlc3NlZCAoMS4uMTI3KSAqLwogCQl1OCBpbWdfbHVtOyAgIC8qIE9MRUQgbWF0cml4IGRpc3BsYXkgYnJpZ2h0bmVzcyAqLworCQl1OCBtYXhfbGx2OyAgIC8qIG1heGltdW0gYnJpZ2h0bmVzcyBvZiBMRUQgKGxsdikgKi8KKwkJdTggbWF4X2hsdjsgICAvKiBtYXhpbXVtIGJyaWdodG5lc3Mgb2YgTEVEIChobHYpICovCiAJfSBsZWQ7Ci0JYm9vbCBsZWRfaW5pdGlhbGl6ZWQ7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICphYzsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYmF0dGVyeV9kZXNjOwotCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBhY19kZXNjOwotCXN0cnVjdCBrb2JqZWN0ICpyZW1vdGVfZGlyOwotCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcmVtb3RlX2dyb3VwWzVdOworCXN0cnVjdCB3YWNvbV9iYXR0ZXJ5IGJhdHRlcnk7CisJYm9vbCByZXNvdXJjZXM7CiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgd2Fjb21fc2NoZWR1bGVfd29yayhzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpCitzdGF0aWMgaW5saW5lIHZvaWQgd2Fjb21fc2NoZWR1bGVfd29yayhzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMsCisJCQkJICAgICAgIGVudW0gd2Fjb21fd29ya2VyIHdoaWNoKQogewogCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBjb250YWluZXJfb2Yod2Fjb21fd2FjLCBzdHJ1Y3Qgd2Fjb20sIHdhY29tX3dhYyk7Ci0Jc2NoZWR1bGVfd29yaygmd2Fjb20tPndvcmspOworCisJc3dpdGNoICh3aGljaCkgeworCWNhc2UgV0FDT01fV09SS0VSX1dJUkVMRVNTOgorCQlzY2hlZHVsZV93b3JrKCZ3YWNvbS0+d2lyZWxlc3Nfd29yayk7CisJCWJyZWFrOworCWNhc2UgV0FDT01fV09SS0VSX0JBVFRFUlk6CisJCXNjaGVkdWxlX3dvcmsoJndhY29tLT5iYXR0ZXJ5X3dvcmspOworCQlicmVhazsKKwljYXNlIFdBQ09NX1dPUktFUl9SRU1PVEU6CisJCXNjaGVkdWxlX3dvcmsoJndhY29tLT5yZW1vdGVfd29yayk7CisJCWJyZWFrOworCX0KIH0KIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkIHdhY29tX2lkc1tdOwpAQCAtMTQ5LDcgKzIxNCw4IEBACiAJCXN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSk7CiB2b2lkIHdhY29tX3dhY19yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQpOwogdm9pZCB3YWNvbV9iYXR0ZXJ5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLWludCB3YWNvbV9yZW1vdGVfY3JlYXRlX2F0dHJfZ3JvdXAoc3RydWN0IHdhY29tICp3YWNvbSwgX191MzIgc2VyaWFsLAotCQkJCSAgIGludCBpbmRleCk7Ci12b2lkIHdhY29tX3JlbW90ZV9kZXN0cm95X2F0dHJfZ3JvdXAoc3RydWN0IHdhY29tICp3YWNvbSwgX191MzIgc2VyaWFsKTsKK2VudW0gbGVkX2JyaWdodG5lc3Mgd2Fjb21fbGVkc19icmlnaHRuZXNzX2dldChzdHJ1Y3Qgd2Fjb21fbGVkICpsZWQpOworc3RydWN0IHdhY29tX2xlZCAqd2Fjb21fbGVkX2ZpbmQoc3RydWN0IHdhY29tICp3YWNvbSwgdW5zaWduZWQgaW50IGdyb3VwLAorCQkJCSB1bnNpZ25lZCBpbnQgaWQpOworc3RydWN0IHdhY29tX2xlZCAqd2Fjb21fbGVkX25leHQoc3RydWN0IHdhY29tICp3YWNvbSwgc3RydWN0IHdhY29tX2xlZCAqY3VyKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvd2Fjb21fc3lzLmMgYi9kcml2ZXJzL2hpZC93YWNvbV9zeXMuYwppbmRleCA0OTljYzgyLi41ZTdhNTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC93YWNvbV9zeXMuYworKysgYi9kcml2ZXJzL2hpZC93YWNvbV9zeXMuYwpAQCAtMjUsNyArMjUsNiBAQAogI2RlZmluZSBXQUNfQ01EX1JFVFJJRVMJCTEwCiAjZGVmaW5lIFdBQ19DTURfREVMRVRFX1BBSVJJTkcJMHgyMAogI2RlZmluZSBXQUNfQ01EX1VOUEFJUl9BTEwJMHhGRgotI2RlZmluZSBXQUNfUkVNT1RFX1NFUklBTF9NQVhfU1RSTEVOCTkKIAogI2RlZmluZSBERVZfQVRUUl9SV19QRVJNIChTX0lSVUdPIHwgU19JV1VTUiB8IFNfSVdHUlApCiAjZGVmaW5lIERFVl9BVFRSX1dPX1BFUk0gKFNfSVdVU1IgfCBTX0lXR1JQKQpAQCAtOTEsNyArOTAsMTIgQEAKIHsKIAlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKIAotCWhpZF9od19jbG9zZSh3YWNvbS0+aGRldik7CisJLyoKKwkgKiB3YWNvbS0+aGRldiBzaG91bGQgbmV2ZXIgYmUgbnVsbCwgYnV0IHN1cnByaXNpbmdseSwgSSBoYWQgdGhlIGNhc2UKKwkgKiBvbmNlIHdoaWxlIHVucGx1Z2dpbmcgdGhlIFdhY29tIFdpcmVsZXNzIFJlY2VpdmVyLgorCSAqLworCWlmICh3YWNvbS0+aGRldikKKwkJaGlkX2h3X2Nsb3NlKHdhY29tLT5oZGV2KTsKIH0KIAogLyoKQEAgLTUyMywzNiArNTI3LDk1IEBACiBzdGF0aWMgTElTVF9IRUFEKHdhY29tX3VkZXZfbGlzdCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHdhY29tX3VkZXZfbGlzdF9sb2NrKTsKIAorc3RhdGljIGJvb2wgY29tcGFyZV9kZXZpY2VfcGF0aHMoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXZfYSwKKwkJc3RydWN0IGhpZF9kZXZpY2UgKmhkZXZfYiwgY2hhciBzZXBhcmF0b3IpCit7CisJaW50IG4xID0gc3RycmNocihoZGV2X2EtPnBoeXMsIHNlcGFyYXRvcikgLSBoZGV2X2EtPnBoeXM7CisJaW50IG4yID0gc3RycmNocihoZGV2X2ItPnBoeXMsIHNlcGFyYXRvcikgLSBoZGV2X2ItPnBoeXM7CisKKwlpZiAobjEgIT0gbjIgfHwgbjEgPD0gMCB8fCBuMiA8PSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gIXN0cm5jbXAoaGRldl9hLT5waHlzLCBoZGV2X2ItPnBoeXMsIG4xKTsKK30KKwogc3RhdGljIGJvb2wgd2Fjb21fYXJlX3NpYmxpbmcoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCiAJCXN0cnVjdCBoaWRfZGV2aWNlICpzaWJsaW5nKQogewogCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CiAJc3RydWN0IHdhY29tX2ZlYXR1cmVzICpmZWF0dXJlcyA9ICZ3YWNvbS0+d2Fjb21fd2FjLmZlYXR1cmVzOwotCWludCB2aWQgPSBmZWF0dXJlcy0+b1ZpZDsKLQlpbnQgcGlkID0gZmVhdHVyZXMtPm9QaWQ7Ci0JaW50IG4xLG4yOworCXN0cnVjdCB3YWNvbSAqc2libGluZ193YWNvbSA9IGhpZF9nZXRfZHJ2ZGF0YShzaWJsaW5nKTsKKwlzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgKnNpYmxpbmdfZmVhdHVyZXMgPSAmc2libGluZ193YWNvbS0+d2Fjb21fd2FjLmZlYXR1cmVzOworCV9fdTMyIG9WaWQgPSBmZWF0dXJlcy0+b1ZpZCA/IGZlYXR1cmVzLT5vVmlkIDogaGRldi0+dmVuZG9yOworCV9fdTMyIG9QaWQgPSBmZWF0dXJlcy0+b1BpZCA/IGZlYXR1cmVzLT5vUGlkIDogaGRldi0+cHJvZHVjdDsKIAotCWlmICh2aWQgPT0gMCAmJiBwaWQgPT0gMCkgewotCQl2aWQgPSBoZGV2LT52ZW5kb3I7Ci0JCXBpZCA9IGhkZXYtPnByb2R1Y3Q7CisJLyogVGhlIGRlZmluZWQgb1ZpZC9vUGlkIG11c3QgbWF0Y2ggdGhhdCBvZiB0aGUgc2libGluZyAqLworCWlmIChmZWF0dXJlcy0+b1ZpZCAhPSBISURfQU5ZX0lEICYmIHNpYmxpbmctPnZlbmRvciAhPSBvVmlkKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKGZlYXR1cmVzLT5vUGlkICE9IEhJRF9BTllfSUQgJiYgc2libGluZy0+cHJvZHVjdCAhPSBvUGlkKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIERldmljZXMgd2l0aCB0aGUgc2FtZSBWSUQvUElEIG11c3Qgc2hhcmUgdGhlIHNhbWUgcGh5c2ljYWwKKwkgKiBkZXZpY2UgcGF0aCwgd2hpbGUgdGhvc2Ugd2l0aCBkaWZmZXJlbnQgVklEL1BJRCBtdXN0IHNoYXJlCisJICogdGhlIHNhbWUgcGh5c2ljYWwgcGFyZW50IGRldmljZSBwYXRoLgorCSAqLworCWlmIChoZGV2LT52ZW5kb3IgPT0gc2libGluZy0+dmVuZG9yICYmIGhkZXYtPnByb2R1Y3QgPT0gc2libGluZy0+cHJvZHVjdCkgeworCQlpZiAoIWNvbXBhcmVfZGV2aWNlX3BhdGhzKGhkZXYsIHNpYmxpbmcsICcvJykpCisJCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJaWYgKCFjb21wYXJlX2RldmljZV9wYXRocyhoZGV2LCBzaWJsaW5nLCAnLicpKQorCQkJcmV0dXJuIGZhbHNlOwogCX0KIAotCWlmICh2aWQgIT0gc2libGluZy0+dmVuZG9yIHx8IHBpZCAhPSBzaWJsaW5nLT5wcm9kdWN0KQorCS8qIFNraXAgdGhlIHJlbWFpbmluZyBoZXVyaXN0aWNzIHVubGVzcyB5b3UgYXJlIGEgSElEX0dFTkVSSUMgZGV2aWNlICovCisJaWYgKGZlYXR1cmVzLT50eXBlICE9IEhJRF9HRU5FUklDKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qCisJICogRGlyZWN0LWlucHV0IGRldmljZXMgbWF5IG5vdCBiZSBzaWJsaW5ncyBvZiBpbmRpcmVjdC1pbnB1dAorCSAqIGRldmljZXMuCisJICovCisJaWYgKChmZWF0dXJlcy0+ZGV2aWNlX3R5cGUgJiBXQUNPTV9ERVZJQ0VUWVBFX0RJUkVDVCkgJiYKKwkgICAgIShzaWJsaW5nX2ZlYXR1cmVzLT5kZXZpY2VfdHlwZSAmIFdBQ09NX0RFVklDRVRZUEVfRElSRUNUKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JLyogQ29tcGFyZSB0aGUgcGh5c2ljYWwgcGF0aC4gKi8KLQluMSA9IHN0cnJjaHIoaGRldi0+cGh5cywgJy4nKSAtIGhkZXYtPnBoeXM7Ci0JbjIgPSBzdHJyY2hyKHNpYmxpbmctPnBoeXMsICcuJykgLSBzaWJsaW5nLT5waHlzOwotCWlmIChuMSAhPSBuMiB8fCBuMSA8PSAwIHx8IG4yIDw9IDApCisJLyoKKwkgKiBJbmRpcmVjdC1pbnB1dCBkZXZpY2VzIG1heSBub3QgYmUgc2libGluZ3Mgb2YgZGlyZWN0LWlucHV0CisJICogZGV2aWNlcy4KKwkgKi8KKwlpZiAoIShmZWF0dXJlcy0+ZGV2aWNlX3R5cGUgJiBXQUNPTV9ERVZJQ0VUWVBFX0RJUkVDVCkgJiYKKwkgICAgKHNpYmxpbmdfZmVhdHVyZXMtPmRldmljZV90eXBlICYgV0FDT01fREVWSUNFVFlQRV9ESVJFQ1QpKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlyZXR1cm4gIXN0cm5jbXAoaGRldi0+cGh5cywgc2libGluZy0+cGh5cywgbjEpOworCS8qIFBlbiBkZXZpY2VzIG1heSBvbmx5IGJlIHNpYmxpbmdzIG9mIHRvdWNoIGRldmljZXMgKi8KKwlpZiAoKGZlYXR1cmVzLT5kZXZpY2VfdHlwZSAmIFdBQ09NX0RFVklDRVRZUEVfUEVOKSAmJgorCSAgICAhKHNpYmxpbmdfZmVhdHVyZXMtPmRldmljZV90eXBlICYgV0FDT01fREVWSUNFVFlQRV9UT1VDSCkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFRvdWNoIGRldmljZXMgbWF5IG9ubHkgYmUgc2libGluZ3Mgb2YgcGVuIGRldmljZXMgKi8KKwlpZiAoKGZlYXR1cmVzLT5kZXZpY2VfdHlwZSAmIFdBQ09NX0RFVklDRVRZUEVfVE9VQ0gpICYmCisJICAgICEoc2libGluZ19mZWF0dXJlcy0+ZGV2aWNlX3R5cGUgJiBXQUNPTV9ERVZJQ0VUWVBFX1BFTikpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogTm8gcmVhc29uIGNvdWxkIGJlIGZvdW5kIGZvciB0aGVzZSB0d28gZGV2aWNlcyB0byBOT1QgYmUKKwkgKiBzaWJsaW5ncywgc28gdGhlcmUncyBhIGdvb2QgY2hhbmNlIHRoZXkgQVJFIHNpYmxpbmdzCisJICovCisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgd2Fjb21faGRldl9kYXRhICp3YWNvbV9nZXRfaGRldl9kYXRhKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQogewogCXN0cnVjdCB3YWNvbV9oZGV2X2RhdGEgKmRhdGE7CiAKKwkvKiBUcnkgdG8gZmluZCBhbiBhbHJlYWR5LXByb2JlZCBpbnRlcmZhY2UgZnJvbSB0aGUgc2FtZSBkZXZpY2UgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRhdGEsICZ3YWNvbV91ZGV2X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNvbXBhcmVfZGV2aWNlX3BhdGhzKGhkZXYsIGRhdGEtPmRldiwgJy8nKSkKKwkJCXJldHVybiBkYXRhOworCX0KKworCS8qIEZhbGxiYWNrIHRvIGZpbmRpbmcgZGV2aWNlcyB0aGF0IGFwcGVhciB0byBiZSAic2libGluZ3MiICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkYXRhLCAmd2Fjb21fdWRldl9saXN0LCBsaXN0KSB7CiAJCWlmICh3YWNvbV9hcmVfc2libGluZyhoZGV2LCBkYXRhLT5kZXYpKSB7CiAJCQlrcmVmX2dldCgmZGF0YS0+a3JlZik7CkBAIC01NjMsNiArNjI2LDM4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIHdhY29tX3JlbGVhc2Vfc2hhcmVkX2RhdGEoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHdhY29tX2hkZXZfZGF0YSAqZGF0YSA9CisJCWNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3Qgd2Fjb21faGRldl9kYXRhLCBrcmVmKTsKKworCW11dGV4X2xvY2soJndhY29tX3VkZXZfbGlzdF9sb2NrKTsKKwlsaXN0X2RlbCgmZGF0YS0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZ3YWNvbV91ZGV2X2xpc3RfbG9jayk7CisKKwlrZnJlZShkYXRhKTsKK30KKworc3RhdGljIHZvaWQgd2Fjb21fcmVtb3ZlX3NoYXJlZF9kYXRhKHZvaWQgKnJlcykKK3sKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gcmVzOworCXN0cnVjdCB3YWNvbV9oZGV2X2RhdGEgKmRhdGE7CisJc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjID0gJndhY29tLT53YWNvbV93YWM7CisKKwlpZiAod2Fjb21fd2FjLT5zaGFyZWQpIHsKKwkJZGF0YSA9IGNvbnRhaW5lcl9vZih3YWNvbV93YWMtPnNoYXJlZCwgc3RydWN0IHdhY29tX2hkZXZfZGF0YSwKKwkJCQkgICAgc2hhcmVkKTsKKworCQlpZiAod2Fjb21fd2FjLT5zaGFyZWQtPnRvdWNoID09IHdhY29tLT5oZGV2KQorCQkJd2Fjb21fd2FjLT5zaGFyZWQtPnRvdWNoID0gTlVMTDsKKwkJZWxzZSBpZiAod2Fjb21fd2FjLT5zaGFyZWQtPnBlbiA9PSB3YWNvbS0+aGRldikKKwkJCXdhY29tX3dhYy0+c2hhcmVkLT5wZW4gPSBOVUxMOworCisJCWtyZWZfcHV0KCZkYXRhLT5rcmVmLCB3YWNvbV9yZWxlYXNlX3NoYXJlZF9kYXRhKTsKKwkJd2Fjb21fd2FjLT5zaGFyZWQgPSBOVUxMOworCX0KK30KKwogc3RhdGljIGludCB3YWNvbV9hZGRfc2hhcmVkX2RhdGEoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCiB7CiAJc3RydWN0IHdhY29tICp3YWNvbSA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKQEAgLTU4Nyw2ICs2ODIsMTMgQEAKIAogCXdhY29tX3dhYy0+c2hhcmVkID0gJmRhdGEtPnNoYXJlZDsKIAorCXJldHZhbCA9IGRldm1fYWRkX2FjdGlvbigmaGRldi0+ZGV2LCB3YWNvbV9yZW1vdmVfc2hhcmVkX2RhdGEsIHdhY29tKTsKKwlpZiAocmV0dmFsKSB7CisJCW11dGV4X3VubG9jaygmd2Fjb21fdWRldl9saXN0X2xvY2spOworCQl3YWNvbV9yZW1vdmVfc2hhcmVkX2RhdGEod2Fjb20pOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwogCWlmICh3YWNvbV93YWMtPmZlYXR1cmVzLmRldmljZV90eXBlICYgV0FDT01fREVWSUNFVFlQRV9UT1VDSCkKIAkJd2Fjb21fd2FjLT5zaGFyZWQtPnRvdWNoID0gaGRldjsKIAllbHNlIGlmICh3YWNvbV93YWMtPmZlYXR1cmVzLmRldmljZV90eXBlICYgV0FDT01fREVWSUNFVFlQRV9QRU4pCkBAIC01OTcsMzcgKzY5OSw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgd2Fjb21fcmVsZWFzZV9zaGFyZWRfZGF0YShzdHJ1Y3Qga3JlZiAqa3JlZikKLXsKLQlzdHJ1Y3Qgd2Fjb21faGRldl9kYXRhICpkYXRhID0KLQkJY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCB3YWNvbV9oZGV2X2RhdGEsIGtyZWYpOwotCi0JbXV0ZXhfbG9jaygmd2Fjb21fdWRldl9saXN0X2xvY2spOwotCWxpc3RfZGVsKCZkYXRhLT5saXN0KTsKLQltdXRleF91bmxvY2soJndhY29tX3VkZXZfbGlzdF9sb2NrKTsKLQotCWtmcmVlKGRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCB3YWNvbV9yZW1vdmVfc2hhcmVkX2RhdGEoc3RydWN0IHdhY29tICp3YWNvbSkKLXsKLQlzdHJ1Y3Qgd2Fjb21faGRldl9kYXRhICpkYXRhOwotCXN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYyA9ICZ3YWNvbS0+d2Fjb21fd2FjOwotCi0JaWYgKHdhY29tX3dhYy0+c2hhcmVkKSB7Ci0JCWRhdGEgPSBjb250YWluZXJfb2Yod2Fjb21fd2FjLT5zaGFyZWQsIHN0cnVjdCB3YWNvbV9oZGV2X2RhdGEsCi0JCQkJICAgIHNoYXJlZCk7Ci0KLQkJaWYgKHdhY29tX3dhYy0+c2hhcmVkLT50b3VjaCA9PSB3YWNvbS0+aGRldikKLQkJCXdhY29tX3dhYy0+c2hhcmVkLT50b3VjaCA9IE5VTEw7Ci0JCWVsc2UgaWYgKHdhY29tX3dhYy0+c2hhcmVkLT5wZW4gPT0gd2Fjb20tPmhkZXYpCi0JCQl3YWNvbV93YWMtPnNoYXJlZC0+cGVuID0gTlVMTDsKLQotCQlrcmVmX3B1dCgmZGF0YS0+a3JlZiwgd2Fjb21fcmVsZWFzZV9zaGFyZWRfZGF0YSk7Ci0JCXdhY29tX3dhYy0+c2hhcmVkID0gTlVMTDsKLQl9Ci19Ci0KIHN0YXRpYyBpbnQgd2Fjb21fbGVkX2NvbnRyb2woc3RydWN0IHdhY29tICp3YWNvbSkKIHsKIAl1bnNpZ25lZCBjaGFyICpidWY7CkBAIC02MzUsNiArNzA2LDEyIEBACiAJdW5zaWduZWQgY2hhciByZXBvcnRfaWQgPSBXQUNfQ01EX0xFRF9DT05UUk9MOwogCWludCBidWZfc2l6ZSA9IDk7CiAKKwlpZiAoIWhpZF9nZXRfZHJ2ZGF0YSh3YWNvbS0+aGRldikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCF3YWNvbS0+bGVkLmdyb3VwcykKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwogCWlmICh3YWNvbS0+d2Fjb21fd2FjLnBpZCkgeyAvKiB3aXJlbGVzcyBjb25uZWN0ZWQgKi8KIAkJcmVwb3J0X2lkID0gV0FDX0NNRF9XTF9MRURfQ09OVFJPTDsKIAkJYnVmX3NpemUgPSAxMzsKQEAgLTY1MCw3ICs3MjcsNyBAQAogCQkgKiBvbmUgb2YgZm91ciB2YWx1ZXM6CiAJCSAqICAgIDAgPSBMb3c7IDEgPSBNZWRpdW07IDIgPSBIaWdoOyAzID0gT2ZmCiAJCSAqLwotCQlpbnQgcmluZ19sZWQgPSB3YWNvbS0+bGVkLnNlbGVjdFswXSAmIDB4MDM7CisJCWludCByaW5nX2xlZCA9IHdhY29tLT5sZWQuZ3JvdXBzWzBdLnNlbGVjdCAmIDB4MDM7CiAJCWludCByaW5nX2x1bSA9ICgoKHdhY29tLT5sZWQubGx2ICYgMHg2MCkgPj4gNSkgLSAxKSAmIDB4MDM7CiAJCWludCBjcm9wX2x1bSA9IDA7CiAJCXVuc2lnbmVkIGNoYXIgbGVkX2JpdHMgPSAoY3JvcF9sdW0gPDwgNCkgfCAocmluZ19sdW0gPDwgMikgfCAocmluZ19sZWQpOwpAQCAtNjY1LDExICs3NDIsMTEgQEAKIAkJCWJ1ZlsxXSA9IGxlZF9iaXRzOwogCX0KIAllbHNlIHsKLQkJaW50IGxlZCA9IHdhY29tLT5sZWQuc2VsZWN0WzBdIHwgMHg0OworCQlpbnQgbGVkID0gd2Fjb20tPmxlZC5ncm91cHNbMF0uc2VsZWN0IHwgMHg0OwogCiAJCWlmICh3YWNvbS0+d2Fjb21fd2FjLmZlYXR1cmVzLnR5cGUgPT0gV0FDT01fMjFVWDIgfHwKIAkJICAgIHdhY29tLT53YWNvbV93YWMuZmVhdHVyZXMudHlwZSA9PSBXQUNPTV8yNEhEKQotCQkJbGVkIHw9ICh3YWNvbS0+bGVkLnNlbGVjdFsxXSA8PCA0KSB8IDB4NDA7CisJCQlsZWQgfD0gKHdhY29tLT5sZWQuZ3JvdXBzWzFdLnNlbGVjdCA8PCA0KSB8IDB4NDA7CiAKIAkJYnVmWzBdID0gcmVwb3J0X2lkOwogCQlidWZbMV0gPSBsZWQ7CkBAIC03NDEsNyArODE4LDcgQEAKIAogCW11dGV4X2xvY2soJndhY29tLT5sb2NrKTsKIAotCXdhY29tLT5sZWQuc2VsZWN0W3NldF9pZF0gPSBpZCAmIDB4MzsKKwl3YWNvbS0+bGVkLmdyb3Vwc1tzZXRfaWRdLnNlbGVjdCA9IGlkICYgMHgzOwogCWVyciA9IHdhY29tX2xlZF9jb250cm9sKHdhY29tKTsKIAogCW11dGV4X3VubG9jaygmd2Fjb20tPmxvY2spOwpAQCAtNzYxLDcgKzgzOCw3IEBACiAJc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYgPSB0b19oaWRfZGV2aWNlKGRldik7XAogCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CQkJXAogCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwJCQlcCi0JCQkgd2Fjb20tPmxlZC5zZWxlY3RbU0VUX0lEXSk7CQkJXAorCQkJIHdhY29tLT5sZWQuZ3JvdXBzW1NFVF9JRF0uc2VsZWN0KTsJCVwKIH0JCQkJCQkJCQlcCiBzdGF0aWMgREVWSUNFX0FUVFIoc3RhdHVzX2xlZCMjU0VUX0lEIyNfc2VsZWN0LCBERVZfQVRUUl9SV19QRVJNLAlcCiAJCSAgICB3YWNvbV9sZWQjI1NFVF9JRCMjX3NlbGVjdF9zaG93LAkJCVwKQEAgLTkwNCw2ICs5ODEsMzI3IEBACiAJLmF0dHJzID0gaW50dW9zNV9sZWRfYXR0cnMsCiB9OwogCitzdHJ1Y3Qgd2Fjb21fc3lzZnNfZ3JvdXBfZGV2cmVzIHsKKwlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpncm91cDsKKwlzdHJ1Y3Qga29iamVjdCAqcm9vdDsKK307CisKK3N0YXRpYyB2b2lkIHdhY29tX2Rldm1fc3lzZnNfZ3JvdXBfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcykKK3sKKwlzdHJ1Y3Qgd2Fjb21fc3lzZnNfZ3JvdXBfZGV2cmVzICpkZXZyZXMgPSByZXM7CisJc3RydWN0IGtvYmplY3QgKmtvYmogPSBkZXZyZXMtPnJvb3Q7CisKKwlkZXZfZGJnKGRldiwgIiVzOiBkcm9wcGluZyByZWZlcmVuY2UgdG8gJXNcbiIsCisJCV9fZnVuY19fLCBkZXZyZXMtPmdyb3VwLT5uYW1lKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoa29iaiwgZGV2cmVzLT5ncm91cCk7Cit9CisKK3N0YXRpYyBpbnQgX193YWNvbV9kZXZtX3N5c2ZzX2NyZWF0ZV9ncm91cChzdHJ1Y3Qgd2Fjb20gKndhY29tLAorCQkJCQkgICBzdHJ1Y3Qga29iamVjdCAqcm9vdCwKKwkJCQkJICAgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqZ3JvdXApCit7CisJc3RydWN0IHdhY29tX3N5c2ZzX2dyb3VwX2RldnJlcyAqZGV2cmVzOworCWludCBlcnJvcjsKKworCWRldnJlcyA9IGRldnJlc19hbGxvYyh3YWNvbV9kZXZtX3N5c2ZzX2dyb3VwX3JlbGVhc2UsCisJCQkgICAgICBzaXplb2Yoc3RydWN0IHdhY29tX3N5c2ZzX2dyb3VwX2RldnJlcyksCisJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldnJlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZyZXMtPmdyb3VwID0gZ3JvdXA7CisJZGV2cmVzLT5yb290ID0gcm9vdDsKKworCWVycm9yID0gc3lzZnNfY3JlYXRlX2dyb3VwKGRldnJlcy0+cm9vdCwgZ3JvdXApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZGV2cmVzX2FkZCgmd2Fjb20tPmhkZXYtPmRldiwgZGV2cmVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdhY29tX2Rldm1fc3lzZnNfY3JlYXRlX2dyb3VwKHN0cnVjdCB3YWNvbSAqd2Fjb20sCisJCQkJCSBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpncm91cCkKK3sKKwlyZXR1cm4gX193YWNvbV9kZXZtX3N5c2ZzX2NyZWF0ZV9ncm91cCh3YWNvbSwgJndhY29tLT5oZGV2LT5kZXYua29iaiwKKwkJCQkJICAgICAgIGdyb3VwKTsKK30KKworZW51bSBsZWRfYnJpZ2h0bmVzcyB3YWNvbV9sZWRzX2JyaWdodG5lc3NfZ2V0KHN0cnVjdCB3YWNvbV9sZWQgKmxlZCkKK3sKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gbGVkLT53YWNvbTsKKworCWlmICh3YWNvbS0+bGVkLm1heF9obHYpCisJCXJldHVybiBsZWQtPmhsdiAqIExFRF9GVUxMIC8gd2Fjb20tPmxlZC5tYXhfaGx2OworCisJaWYgKHdhY29tLT5sZWQubWF4X2xsdikKKwkJcmV0dXJuIGxlZC0+bGx2ICogTEVEX0ZVTEwgLyB3YWNvbS0+bGVkLm1heF9sbHY7CisKKwkvKiBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGJyaWdodG5lc3MgdHVuaW5nICovCisJcmV0dXJuIExFRF9GVUxMOworfQorCitzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyBfX3dhY29tX2xlZF9icmlnaHRuZXNzX2dldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2KQoreworCXN0cnVjdCB3YWNvbV9sZWQgKmxlZCA9IGNvbnRhaW5lcl9vZihjZGV2LCBzdHJ1Y3Qgd2Fjb21fbGVkLCBjZGV2KTsKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gbGVkLT53YWNvbTsKKworCWlmICh3YWNvbS0+bGVkLmdyb3Vwc1tsZWQtPmdyb3VwXS5zZWxlY3QgIT0gbGVkLT5pZCkKKwkJcmV0dXJuIExFRF9PRkY7CisKKwlyZXR1cm4gd2Fjb21fbGVkc19icmlnaHRuZXNzX2dldChsZWQpOworfQorCitzdGF0aWMgaW50IHdhY29tX2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2LAorCQkJCSAgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCit7CisJc3RydWN0IHdhY29tX2xlZCAqbGVkID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCB3YWNvbV9sZWQsIGNkZXYpOworCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBsZWQtPndhY29tOworCWludCBlcnJvcjsKKworCW11dGV4X2xvY2soJndhY29tLT5sb2NrKTsKKworCWlmICghd2Fjb20tPmxlZC5ncm91cHMgfHwgKGJyaWdodG5lc3MgPT0gTEVEX09GRiAmJgorCSAgICB3YWNvbS0+bGVkLmdyb3Vwc1tsZWQtPmdyb3VwXS5zZWxlY3QgIT0gbGVkLT5pZCkpIHsKKwkJZXJyb3IgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlsZWQtPmxsdiA9IHdhY29tLT5sZWQubGx2ID0gd2Fjb20tPmxlZC5tYXhfbGx2ICogYnJpZ2h0bmVzcyAvIExFRF9GVUxMOworCWxlZC0+aGx2ID0gd2Fjb20tPmxlZC5obHYgPSB3YWNvbS0+bGVkLm1heF9obHYgKiBicmlnaHRuZXNzIC8gTEVEX0ZVTEw7CisKKwl3YWNvbS0+bGVkLmdyb3Vwc1tsZWQtPmdyb3VwXS5zZWxlY3QgPSBsZWQtPmlkOworCisJZXJyb3IgPSB3YWNvbV9sZWRfY29udHJvbCh3YWNvbSk7CisKK291dDoKKwltdXRleF91bmxvY2soJndhY29tLT5sb2NrKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgd2Fjb21fbGVkX3JlYWRvbmx5X2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYsCisJCQkJCSAgICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCit7Cit9CisKK3N0YXRpYyBpbnQgd2Fjb21fbGVkX3JlZ2lzdGVyX29uZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB3YWNvbSAqd2Fjb20sCisJCQkJICBzdHJ1Y3Qgd2Fjb21fbGVkICpsZWQsIHVuc2lnbmVkIGludCBncm91cCwKKwkJCQkgIHVuc2lnbmVkIGludCBpZCwgYm9vbCByZWFkX29ubHkpCit7CisJaW50IGVycm9yOworCWNoYXIgKm5hbWU7CisKKwluYW1lID0gZGV2bV9rYXNwcmludGYoZGV2LCBHRlBfS0VSTkVMLAorCQkJICAgICAgIiVzOjp3YWNvbS0lZC4lZCIsCisJCQkgICAgICBkZXZfbmFtZShkZXYpLAorCQkJICAgICAgZ3JvdXAsCisJCQkgICAgICBpZCk7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghcmVhZF9vbmx5KSB7CisJCWxlZC0+dHJpZ2dlci5uYW1lID0gbmFtZTsKKwkJZXJyb3IgPSBkZXZtX2xlZF90cmlnZ2VyX3JlZ2lzdGVyKGRldiwgJmxlZC0+dHJpZ2dlcik7CisJCWlmIChlcnJvcikgeworCQkJaGlkX2Vycih3YWNvbS0+aGRldiwKKwkJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyIExFRCB0cmlnZ2VyICVzOiAlZFxuIiwKKwkJCQlsZWQtPmNkZXYubmFtZSwgZXJyb3IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCisJbGVkLT5ncm91cCA9IGdyb3VwOworCWxlZC0+aWQgPSBpZDsKKwlsZWQtPndhY29tID0gd2Fjb207CisJbGVkLT5sbHYgPSB3YWNvbS0+bGVkLmxsdjsKKwlsZWQtPmhsdiA9IHdhY29tLT5sZWQuaGx2OworCWxlZC0+Y2Rldi5uYW1lID0gbmFtZTsKKwlsZWQtPmNkZXYubWF4X2JyaWdodG5lc3MgPSBMRURfRlVMTDsKKwlsZWQtPmNkZXYuZmxhZ3MgPSBMRURfSFdfUExVR0dBQkxFOworCWxlZC0+Y2Rldi5icmlnaHRuZXNzX2dldCA9IF9fd2Fjb21fbGVkX2JyaWdodG5lc3NfZ2V0OworCWlmICghcmVhZF9vbmx5KSB7CisJCWxlZC0+Y2Rldi5icmlnaHRuZXNzX3NldF9ibG9ja2luZyA9IHdhY29tX2xlZF9icmlnaHRuZXNzX3NldDsKKwkJbGVkLT5jZGV2LmRlZmF1bHRfdHJpZ2dlciA9IGxlZC0+Y2Rldi5uYW1lOworCX0gZWxzZSB7CisJCWxlZC0+Y2Rldi5icmlnaHRuZXNzX3NldCA9IHdhY29tX2xlZF9yZWFkb25seV9icmlnaHRuZXNzX3NldDsKKwl9CisKKwllcnJvciA9IGRldm1fbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKGRldiwgJmxlZC0+Y2Rldik7CisJaWYgKGVycm9yKSB7CisJCWhpZF9lcnIod2Fjb20tPmhkZXYsCisJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyIExFRCAlczogJWRcbiIsCisJCQlsZWQtPmNkZXYubmFtZSwgZXJyb3IpOworCQlsZWQtPmNkZXYubmFtZSA9IE5VTEw7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2Fjb21fbGVkX2dyb3Vwc19yZWxlYXNlX29uZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCB3YWNvbV9ncm91cF9sZWRzICpncm91cCA9IGRhdGE7CisKKwlkZXZyZXNfcmVsZWFzZV9ncm91cChncm91cC0+ZGV2LCBncm91cCk7Cit9CisKK3N0YXRpYyBpbnQgd2Fjb21fbGVkX2dyb3Vwc19hbGxvY19hbmRfcmVnaXN0ZXJfb25lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCSAgIHN0cnVjdCB3YWNvbSAqd2Fjb20sCisJCQkJCQkgICBpbnQgZ3JvdXBfaWQsIGludCBjb3VudCwKKwkJCQkJCSAgIGJvb2wgcmVhZF9vbmx5KQoreworCXN0cnVjdCB3YWNvbV9sZWQgKmxlZHM7CisJaW50IGksIGVycm9yOworCisJaWYgKGdyb3VwX2lkID49IHdhY29tLT5sZWQuY291bnQgfHwgY291bnQgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWRldnJlc19vcGVuX2dyb3VwKGRldiwgJndhY29tLT5sZWQuZ3JvdXBzW2dyb3VwX2lkXSwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVkcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3Qgd2Fjb21fbGVkKSAqIGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxlZHMpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisKKwl3YWNvbS0+bGVkLmdyb3Vwc1tncm91cF9pZF0ubGVkcyA9IGxlZHM7CisJd2Fjb20tPmxlZC5ncm91cHNbZ3JvdXBfaWRdLmNvdW50ID0gY291bnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQllcnJvciA9IHdhY29tX2xlZF9yZWdpc3Rlcl9vbmUoZGV2LCB3YWNvbSwgJmxlZHNbaV0sCisJCQkJCSAgICAgICBncm91cF9pZCwgaSwgcmVhZF9vbmx5KTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnI7CisJfQorCisJd2Fjb20tPmxlZC5ncm91cHNbZ3JvdXBfaWRdLmRldiA9IGRldjsKKworCWRldnJlc19jbG9zZV9ncm91cChkZXYsICZ3YWNvbS0+bGVkLmdyb3Vwc1tncm91cF9pZF0pOworCisJLyoKKwkgKiBUaGVyZSBpcyBhIGJ1ZyAoPykgaW4gZGV2bV9sZWRfY2xhc3NkZXZfcmVnaXN0ZXIoKSBpbiB3aGljaCBpdHMKKwkgKiBpbmNyZW1lbnRzIHRoZSByZWZjb3VudCBvZiB0aGUgcGFyZW50LiBJZiB0aGUgcGFyZW50IGlzIGFuIGlucHV0CisJICogZGV2aWNlLCB0aGF0IG1lYW5zIHRoZSByZWYgY291bnQgbmV2ZXIgcmVhY2hlcyAwIHdoZW4KKwkgKiBkZXZtX2lucHV0X2RldmljZV9yZWxlYXNlKCkgZ2V0cyBjYWxsZWQuCisJICogVGhpcyBtZWFucyB0aGF0IHRoZSBMRURzIGFyZSBzdGlsbCB0aGVyZSBhZnRlciBkaXNjb25uZWN0LgorCSAqIE1hbnVhbGx5IGZvcmNlIHRoZSByZWxlYXNlIG9mIHRoZSBncm91cCBzbyB0aGF0IHRoZSBsZWRzIGFyZSByZWxlYXNlZAorCSAqIG9uY2Ugd2UgYXJlIGRvbmUgdXNpbmcgdGhlbS4KKwkgKi8KKwllcnJvciA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldCgmd2Fjb20tPmhkZXYtPmRldiwKKwkJCQkJIHdhY29tX2xlZF9ncm91cHNfcmVsZWFzZV9vbmUsCisJCQkJCSAmd2Fjb20tPmxlZC5ncm91cHNbZ3JvdXBfaWRdKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiAwOworCitlcnI6CisJZGV2cmVzX3JlbGVhc2VfZ3JvdXAoZGV2LCAmd2Fjb20tPmxlZC5ncm91cHNbZ3JvdXBfaWRdKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0cnVjdCB3YWNvbV9sZWQgKndhY29tX2xlZF9maW5kKHN0cnVjdCB3YWNvbSAqd2Fjb20sIHVuc2lnbmVkIGludCBncm91cF9pZCwKKwkJCQkgdW5zaWduZWQgaW50IGlkKQoreworCXN0cnVjdCB3YWNvbV9ncm91cF9sZWRzICpncm91cDsKKworCWlmIChncm91cF9pZCA+PSB3YWNvbS0+bGVkLmNvdW50KQorCQlyZXR1cm4gTlVMTDsKKworCWdyb3VwID0gJndhY29tLT5sZWQuZ3JvdXBzW2dyb3VwX2lkXTsKKworCWlmICghZ3JvdXAtPmxlZHMpCisJCXJldHVybiBOVUxMOworCisJaWQgJT0gZ3JvdXAtPmNvdW50OworCisJcmV0dXJuICZncm91cC0+bGVkc1tpZF07Cit9CisKKy8qKgorICogd2Fjb21fbGVkX25leHQ6IGdpdmVzIHRoZSBuZXh0IGF2YWlsYWJsZSBsZWQgd2l0aCBhIHdhY29tIHRyaWdnZXIuCisgKgorICogcmV0dXJucyB0aGUgbmV4dCBhdmFpbGFibGUgc3RydWN0IHdhY29tX2xlZCB3aGljaCBoYXMgaXRzIGRlZmF1bHQgdHJpZ2dlcgorICogb3IgdGhlIGN1cnJlbnQgb25lIGlmIG5vbmUgaXMgYXZhaWxhYmxlLgorICovCitzdHJ1Y3Qgd2Fjb21fbGVkICp3YWNvbV9sZWRfbmV4dChzdHJ1Y3Qgd2Fjb20gKndhY29tLCBzdHJ1Y3Qgd2Fjb21fbGVkICpjdXIpCit7CisJc3RydWN0IHdhY29tX2xlZCAqbmV4dF9sZWQ7CisJaW50IGdyb3VwLCBuZXh0OworCisJaWYgKCF3YWNvbSB8fCAhY3VyKQorCQlyZXR1cm4gTlVMTDsKKworCWdyb3VwID0gY3VyLT5ncm91cDsKKwluZXh0ID0gY3VyLT5pZDsKKworCWRvIHsKKwkJbmV4dF9sZWQgPSB3YWNvbV9sZWRfZmluZCh3YWNvbSwgZ3JvdXAsICsrbmV4dCk7CisJCWlmICghbmV4dF9sZWQgfHwgbmV4dF9sZWQgPT0gY3VyKQorCQkJcmV0dXJuIG5leHRfbGVkOworCX0gd2hpbGUgKG5leHRfbGVkLT5jZGV2LnRyaWdnZXIgIT0gJm5leHRfbGVkLT50cmlnZ2VyKTsKKworCXJldHVybiBuZXh0X2xlZDsKK30KKworc3RhdGljIHZvaWQgd2Fjb21fbGVkX2dyb3Vwc19yZWxlYXNlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHdhY29tICp3YWNvbSA9IGRhdGE7CisKKwl3YWNvbS0+bGVkLmdyb3VwcyA9IE5VTEw7CisJd2Fjb20tPmxlZC5jb3VudCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgd2Fjb21fbGVkX2dyb3Vwc19hbGxvY2F0ZShzdHJ1Y3Qgd2Fjb20gKndhY29tLCBpbnQgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJndhY29tLT5oZGV2LT5kZXY7CisJc3RydWN0IHdhY29tX2dyb3VwX2xlZHMgKmdyb3VwczsKKwlpbnQgZXJyb3I7CisKKwlncm91cHMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHdhY29tX2dyb3VwX2xlZHMpICogY291bnQsCisJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWdyb3VwcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnJvciA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIHdhY29tX2xlZF9ncm91cHNfcmVsZWFzZSwgd2Fjb20pOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJd2Fjb20tPmxlZC5ncm91cHMgPSBncm91cHM7CisJd2Fjb20tPmxlZC5jb3VudCA9IGNvdW50OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2Fjb21fbGVkc19hbGxvY19hbmRfcmVnaXN0ZXIoc3RydWN0IHdhY29tICp3YWNvbSwgaW50IGdyb3VwX2NvdW50LAorCQkJCQkgaW50IGxlZF9wZXJfZ3JvdXAsIGJvb2wgcmVhZF9vbmx5KQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgaSwgZXJyb3I7CisKKwlpZiAoIXdhY29tLT53YWNvbV93YWMucGFkX2lucHV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9ICZ3YWNvbS0+d2Fjb21fd2FjLnBhZF9pbnB1dC0+ZGV2OworCisJZXJyb3IgPSB3YWNvbV9sZWRfZ3JvdXBzX2FsbG9jYXRlKHdhY29tLCBncm91cF9jb3VudCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ3JvdXBfY291bnQ7IGkrKykgeworCQllcnJvciA9IHdhY29tX2xlZF9ncm91cHNfYWxsb2NfYW5kX3JlZ2lzdGVyX29uZShkZXYsIHdhY29tLCBpLAorCQkJCQkJCQlsZWRfcGVyX2dyb3VwLAorCQkJCQkJCQlyZWFkX29ubHkpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgd2Fjb21faW5pdGlhbGl6ZV9sZWRzKHN0cnVjdCB3YWNvbSAqd2Fjb20pCiB7CiAJaW50IGVycm9yOwpAQCAtOTE3LDI1ICsxMzE1LDM4IEBACiAJY2FzZSBJTlRVT1M0OgogCWNhc2UgSU5UVU9TNFdMOgogCWNhc2UgSU5UVU9TNEw6Ci0JCXdhY29tLT5sZWQuc2VsZWN0WzBdID0gMDsKLQkJd2Fjb20tPmxlZC5zZWxlY3RbMV0gPSAwOwogCQl3YWNvbS0+bGVkLmxsdiA9IDEwOwogCQl3YWNvbS0+bGVkLmhsdiA9IDIwOworCQl3YWNvbS0+bGVkLm1heF9sbHYgPSAxMjc7CisJCXdhY29tLT5sZWQubWF4X2hsdiA9IDEyNzsKIAkJd2Fjb20tPmxlZC5pbWdfbHVtID0gMTA7Ci0JCWVycm9yID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZ3YWNvbS0+aGRldi0+ZGV2LmtvYmosCi0JCQkJCSAgICZpbnR1b3M0X2xlZF9hdHRyX2dyb3VwKTsKKworCQllcnJvciA9IHdhY29tX2xlZHNfYWxsb2NfYW5kX3JlZ2lzdGVyKHdhY29tLCAxLCA0LCBmYWxzZSk7CisJCWlmIChlcnJvcikgeworCQkJaGlkX2Vycih3YWNvbS0+aGRldiwKKwkJCQkiY2Fubm90IGNyZWF0ZSBsZWRzIGVycjogJWRcbiIsIGVycm9yKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCisJCWVycm9yID0gd2Fjb21fZGV2bV9zeXNmc19jcmVhdGVfZ3JvdXAod2Fjb20sCisJCQkJCQkgICAgICAmaW50dW9zNF9sZWRfYXR0cl9ncm91cCk7CiAJCWJyZWFrOwogCiAJY2FzZSBXQUNPTV8yNEhEOgogCWNhc2UgV0FDT01fMjFVWDI6Ci0JCXdhY29tLT5sZWQuc2VsZWN0WzBdID0gMDsKLQkJd2Fjb20tPmxlZC5zZWxlY3RbMV0gPSAwOwogCQl3YWNvbS0+bGVkLmxsdiA9IDA7CiAJCXdhY29tLT5sZWQuaGx2ID0gMDsKIAkJd2Fjb20tPmxlZC5pbWdfbHVtID0gMDsKIAotCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmd2Fjb20tPmhkZXYtPmRldi5rb2JqLAotCQkJCQkgICAmY2ludGlxX2xlZF9hdHRyX2dyb3VwKTsKKwkJZXJyb3IgPSB3YWNvbV9sZWRzX2FsbG9jX2FuZF9yZWdpc3Rlcih3YWNvbSwgMiwgNCwgZmFsc2UpOworCQlpZiAoZXJyb3IpIHsKKwkJCWhpZF9lcnIod2Fjb20tPmhkZXYsCisJCQkJImNhbm5vdCBjcmVhdGUgbGVkcyBlcnI6ICVkXG4iLCBlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKworCQllcnJvciA9IHdhY29tX2Rldm1fc3lzZnNfY3JlYXRlX2dyb3VwKHdhY29tLAorCQkJCQkJICAgICAgJmNpbnRpcV9sZWRfYXR0cl9ncm91cCk7CiAJCWJyZWFrOwogCiAJY2FzZSBJTlRVT1M1UzoKQEAgLTk0NCwxNiArMTM1NSwzMSBAQAogCWNhc2UgSU5UVU9TUFM6CiAJY2FzZSBJTlRVT1NQTToKIAljYXNlIElOVFVPU1BMOgotCQl3YWNvbS0+bGVkLnNlbGVjdFswXSA9IDA7Ci0JCXdhY29tLT5sZWQuc2VsZWN0WzFdID0gMDsKIAkJd2Fjb20tPmxlZC5sbHYgPSAzMjsKLQkJd2Fjb20tPmxlZC5obHYgPSAwOwotCQl3YWNvbS0+bGVkLmltZ19sdW0gPSAwOworCQl3YWNvbS0+bGVkLm1heF9sbHYgPSA5NjsKIAotCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmd2Fjb20tPmhkZXYtPmRldi5rb2JqLAotCQkJCQkgICZpbnR1b3M1X2xlZF9hdHRyX2dyb3VwKTsKKwkJZXJyb3IgPSB3YWNvbV9sZWRzX2FsbG9jX2FuZF9yZWdpc3Rlcih3YWNvbSwgMSwgNCwgZmFsc2UpOworCQlpZiAoZXJyb3IpIHsKKwkJCWhpZF9lcnIod2Fjb20tPmhkZXYsCisJCQkJImNhbm5vdCBjcmVhdGUgbGVkcyBlcnI6ICVkXG4iLCBlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKworCQllcnJvciA9IHdhY29tX2Rldm1fc3lzZnNfY3JlYXRlX2dyb3VwKHdhY29tLAorCQkJCQkJICAgICAgJmludHVvczVfbGVkX2F0dHJfZ3JvdXApOwogCQlicmVhazsKIAorCWNhc2UgUkVNT1RFOgorCQl3YWNvbS0+bGVkLmxsdiA9IDI1NTsKKwkJd2Fjb20tPmxlZC5tYXhfbGx2ID0gMjU1OworCQllcnJvciA9IHdhY29tX2xlZF9ncm91cHNfYWxsb2NhdGUod2Fjb20sIDUpOworCQlpZiAoZXJyb3IpIHsKKwkJCWhpZF9lcnIod2Fjb20tPmhkZXYsCisJCQkJImNhbm5vdCBjcmVhdGUgbGVkcyBlcnI6ICVkXG4iLCBlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJcmV0dXJuIDA7CisKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKIAl9CkBAIC05NjQsODYgKzEzOTAsNDUgQEAKIAkJcmV0dXJuIGVycm9yOwogCX0KIAl3YWNvbV9sZWRfY29udHJvbCh3YWNvbSk7Ci0Jd2Fjb20tPmxlZF9pbml0aWFsaXplZCA9IHRydWU7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgd2Fjb21fZGVzdHJveV9sZWRzKHN0cnVjdCB3YWNvbSAqd2Fjb20pCi17Ci0JaWYgKCF3YWNvbS0+bGVkX2luaXRpYWxpemVkKQotCQlyZXR1cm47Ci0KLQlpZiAoISh3YWNvbS0+d2Fjb21fd2FjLmZlYXR1cmVzLmRldmljZV90eXBlICYgV0FDT01fREVWSUNFVFlQRV9QQUQpKQotCQlyZXR1cm47Ci0KLQl3YWNvbS0+bGVkX2luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQlzd2l0Y2ggKHdhY29tLT53YWNvbV93YWMuZmVhdHVyZXMudHlwZSkgewotCWNhc2UgSU5UVU9TNFM6Ci0JY2FzZSBJTlRVT1M0OgotCWNhc2UgSU5UVU9TNFdMOgotCWNhc2UgSU5UVU9TNEw6Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmd2Fjb20tPmhkZXYtPmRldi5rb2JqLAotCQkJCSAgICZpbnR1b3M0X2xlZF9hdHRyX2dyb3VwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdBQ09NXzI0SEQ6Ci0JY2FzZSBXQUNPTV8yMVVYMjoKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZ3YWNvbS0+aGRldi0+ZGV2LmtvYmosCi0JCQkJICAgJmNpbnRpcV9sZWRfYXR0cl9ncm91cCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJTlRVT1M1UzoKLQljYXNlIElOVFVPUzU6Ci0JY2FzZSBJTlRVT1M1TDoKLQljYXNlIElOVFVPU1BTOgotCWNhc2UgSU5UVU9TUE06Ci0JY2FzZSBJTlRVT1NQTDoKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZ3YWNvbS0+aGRldi0+ZGV2LmtvYmosCi0JCQkJICAgJmludHVvczVfbGVkX2F0dHJfZ3JvdXApOwotCQlicmVhazsKLQl9Ci19Ci0KIHN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSB3YWNvbV9iYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAogCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKIAlQT1dFUl9TVVBQTFlfUFJPUF9TQ09QRSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWQogfTsKIAotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHdhY29tX2FjX3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCi0JUE9XRVJfU1VQUExZX1BST1BfU0NPUEUsCi19OwotCiBzdGF0aWMgaW50IHdhY29tX2JhdHRlcnlfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKIAkJCQkgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisJc3RydWN0IHdhY29tX2JhdHRlcnkgKmJhdHRlcnkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAlpbnQgcmV0ID0gMDsKIAogCXN3aXRjaCAocHNwKSB7CisJCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKKwkJCXZhbC0+c3RydmFsID0gYmF0dGVyeS0+d2Fjb20tPndhY29tX3dhYy5uYW1lOworCQkJYnJlYWs7CiAJCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKLQkJCXZhbC0+aW50dmFsID0gd2Fjb20tPndhY29tX3dhYy5iYXRfY29ubmVjdGVkOworCQkJdmFsLT5pbnR2YWwgPSBiYXR0ZXJ5LT5iYXRfY29ubmVjdGVkOwogCQkJYnJlYWs7CiAJCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU0NPUEU6CiAJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TQ09QRV9ERVZJQ0U7CiAJCQlicmVhazsKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKLQkJCXZhbC0+aW50dmFsID0KLQkJCQl3YWNvbS0+d2Fjb21fd2FjLmJhdHRlcnlfY2FwYWNpdHk7CisJCQl2YWwtPmludHZhbCA9IGJhdHRlcnktPmJhdHRlcnlfY2FwYWNpdHk7CiAJCQlicmVhazsKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Ci0JCQlpZiAod2Fjb20tPndhY29tX3dhYy5iYXRfY2hhcmdpbmcpCisJCQlpZiAoYmF0dGVyeS0+YmF0X2NoYXJnaW5nKQogCQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKLQkJCWVsc2UgaWYgKHdhY29tLT53YWNvbV93YWMuYmF0dGVyeV9jYXBhY2l0eSA9PSAxMDAgJiYKLQkJCQkgICAgd2Fjb20tPndhY29tX3dhYy5wc19jb25uZWN0ZWQpCisJCQllbHNlIGlmIChiYXR0ZXJ5LT5iYXR0ZXJ5X2NhcGFjaXR5ID09IDEwMCAmJgorCQkJCSAgICBiYXR0ZXJ5LT5wc19jb25uZWN0ZWQpCiAJCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7Ci0JCQllbHNlIGlmICh3YWNvbS0+d2Fjb21fd2FjLnBzX2Nvbm5lY3RlZCkKKwkJCWVsc2UgaWYgKGJhdHRlcnktPnBzX2Nvbm5lY3RlZCkKIAkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwogCQkJZWxzZQogCQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKQEAgLTEwNTYsODQgKzE0NDEsNjQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdhY29tX2FjX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAotCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCitzdGF0aWMgaW50IF9fd2Fjb21faW5pdGlhbGl6ZV9iYXR0ZXJ5KHN0cnVjdCB3YWNvbSAqd2Fjb20sCisJCQkJICAgICAgc3RydWN0IHdhY29tX2JhdHRlcnkgKmJhdHRlcnkpCiB7Ci0Jc3RydWN0IHdhY29tICp3YWNvbSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwotCWludCByZXQgPSAwOworCXN0YXRpYyBhdG9taWNfdCBiYXR0ZXJ5X25vID0gQVRPTUlDX0lOSVQoMCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJndhY29tLT5oZGV2LT5kZXY7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHsgLmRydl9kYXRhID0gYmF0dGVyeSwgfTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc19iYXQ7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjICpiYXRfZGVzYyA9ICZiYXR0ZXJ5LT5iYXRfZGVzYzsKKwl1bnNpZ25lZCBsb25nIG47CisJaW50IGVycm9yOwogCi0Jc3dpdGNoIChwc3ApIHsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgotCQl2YWwtPmludHZhbCA9IHdhY29tLT53YWNvbV93YWMucHNfY29ubmVjdGVkOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NDT1BFOgotCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TQ09QRV9ERVZJQ0U7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOworCWlmICghZGV2cmVzX29wZW5fZ3JvdXAoZGV2LCBiYXRfZGVzYywgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJYmF0dGVyeS0+d2Fjb20gPSB3YWNvbTsKKworCW4gPSBhdG9taWNfaW5jX3JldHVybigmYmF0dGVyeV9ubykgLSAxOworCisJYmF0X2Rlc2MtPnByb3BlcnRpZXMgPSB3YWNvbV9iYXR0ZXJ5X3Byb3BzOworCWJhdF9kZXNjLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod2Fjb21fYmF0dGVyeV9wcm9wcyk7CisJYmF0X2Rlc2MtPmdldF9wcm9wZXJ0eSA9IHdhY29tX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OworCXNwcmludGYoYmF0dGVyeS0+YmF0X25hbWUsICJ3YWNvbV9iYXR0ZXJ5XyVsZCIsIG4pOworCWJhdF9kZXNjLT5uYW1lID0gYmF0dGVyeS0+YmF0X25hbWU7CisJYmF0X2Rlc2MtPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CisJYmF0X2Rlc2MtPnVzZV9mb3JfYXBtID0gMDsKKworCXBzX2JhdCA9IGRldm1fcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRldiwgYmF0X2Rlc2MsICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKHBzX2JhdCkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKHBzX2JhdCk7CisJCWdvdG8gZXJyOwogCX0KLQlyZXR1cm4gcmV0OworCisJcG93ZXJfc3VwcGx5X3Bvd2Vycyhwc19iYXQsICZ3YWNvbS0+aGRldi0+ZGV2KTsKKworCWJhdHRlcnktPmJhdHRlcnkgPSBwc19iYXQ7CisKKwlkZXZyZXNfY2xvc2VfZ3JvdXAoZGV2LCBiYXRfZGVzYyk7CisJcmV0dXJuIDA7CisKK2VycjoKKwlkZXZyZXNfcmVsZWFzZV9ncm91cChkZXYsIGJhdF9kZXNjKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQgd2Fjb21faW5pdGlhbGl6ZV9iYXR0ZXJ5KHN0cnVjdCB3YWNvbSAqd2Fjb20pCiB7Ci0Jc3RhdGljIGF0b21pY190IGJhdHRlcnlfbm8gPSBBVE9NSUNfSU5JVCgwKTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0geyAuZHJ2X2RhdGEgPSB3YWNvbSwgfTsKLQl1bnNpZ25lZCBsb25nIG47Ci0KLQlpZiAod2Fjb20tPndhY29tX3dhYy5mZWF0dXJlcy5xdWlya3MgJiBXQUNPTV9RVUlSS19CQVRURVJZKSB7Ci0JCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqYmF0X2Rlc2MgPSAmd2Fjb20tPmJhdHRlcnlfZGVzYzsKLQkJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjICphY19kZXNjID0gJndhY29tLT5hY19kZXNjOwotCQluID0gYXRvbWljX2luY19yZXR1cm4oJmJhdHRlcnlfbm8pIC0gMTsKLQotCQliYXRfZGVzYy0+cHJvcGVydGllcyA9IHdhY29tX2JhdHRlcnlfcHJvcHM7Ci0JCWJhdF9kZXNjLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod2Fjb21fYmF0dGVyeV9wcm9wcyk7Ci0JCWJhdF9kZXNjLT5nZXRfcHJvcGVydHkgPSB3YWNvbV9iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKLQkJc3ByaW50Zih3YWNvbS0+d2Fjb21fd2FjLmJhdF9uYW1lLCAid2Fjb21fYmF0dGVyeV8lbGQiLCBuKTsKLQkJYmF0X2Rlc2MtPm5hbWUgPSB3YWNvbS0+d2Fjb21fd2FjLmJhdF9uYW1lOwotCQliYXRfZGVzYy0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JCWJhdF9kZXNjLT51c2VfZm9yX2FwbSA9IDA7Ci0KLQkJYWNfZGVzYy0+cHJvcGVydGllcyA9IHdhY29tX2FjX3Byb3BzOwotCQlhY19kZXNjLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod2Fjb21fYWNfcHJvcHMpOwotCQlhY19kZXNjLT5nZXRfcHJvcGVydHkgPSB3YWNvbV9hY19nZXRfcHJvcGVydHk7Ci0JCXNwcmludGYod2Fjb20tPndhY29tX3dhYy5hY19uYW1lLCAid2Fjb21fYWNfJWxkIiwgbik7Ci0JCWFjX2Rlc2MtPm5hbWUgPSB3YWNvbS0+d2Fjb21fd2FjLmFjX25hbWU7Ci0JCWFjX2Rlc2MtPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKLQkJYWNfZGVzYy0+dXNlX2Zvcl9hcG0gPSAwOwotCi0JCXdhY29tLT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZ3YWNvbS0+aGRldi0+ZGV2LAotCQkJCQkgICAgICAmd2Fjb20tPmJhdHRlcnlfZGVzYywgJnBzeV9jZmcpOwotCQlpZiAoSVNfRVJSKHdhY29tLT5iYXR0ZXJ5KSkKLQkJCXJldHVybiBQVFJfRVJSKHdhY29tLT5iYXR0ZXJ5KTsKLQotCQlwb3dlcl9zdXBwbHlfcG93ZXJzKHdhY29tLT5iYXR0ZXJ5LCAmd2Fjb20tPmhkZXYtPmRldik7Ci0KLQkJd2Fjb20tPmFjID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZ3YWNvbS0+aGRldi0+ZGV2LAotCQkJCQkJICAmd2Fjb20tPmFjX2Rlc2MsCi0JCQkJCQkgICZwc3lfY2ZnKTsKLQkJaWYgKElTX0VSUih3YWNvbS0+YWMpKSB7Ci0JCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcih3YWNvbS0+YmF0dGVyeSk7Ci0JCQlyZXR1cm4gUFRSX0VSUih3YWNvbS0+YWMpOwotCQl9Ci0KLQkJcG93ZXJfc3VwcGx5X3Bvd2Vycyh3YWNvbS0+YWMsICZ3YWNvbS0+aGRldi0+ZGV2KTsKLQl9CisJaWYgKHdhY29tLT53YWNvbV93YWMuZmVhdHVyZXMucXVpcmtzICYgV0FDT01fUVVJUktfQkFUVEVSWSkKKwkJcmV0dXJuIF9fd2Fjb21faW5pdGlhbGl6ZV9iYXR0ZXJ5KHdhY29tLCAmd2Fjb20tPmJhdHRlcnkpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHdhY29tX2Rlc3Ryb3lfYmF0dGVyeShzdHJ1Y3Qgd2Fjb20gKndhY29tKQogewotCWlmICh3YWNvbS0+YmF0dGVyeSkgewotCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcih3YWNvbS0+YmF0dGVyeSk7Ci0JCXdhY29tLT5iYXR0ZXJ5ID0gTlVMTDsKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIod2Fjb20tPmFjKTsKLQkJd2Fjb20tPmFjID0gTlVMTDsKKwlpZiAod2Fjb20tPmJhdHRlcnkuYmF0dGVyeSkgeworCQlkZXZyZXNfcmVsZWFzZV9ncm91cCgmd2Fjb20tPmhkZXYtPmRldiwKKwkJCQkgICAgICZ3YWNvbS0+YmF0dGVyeS5iYXRfZGVzYyk7CisJCXdhY29tLT5iYXR0ZXJ5LmJhdHRlcnkgPSBOVUxMOwogCX0KIH0KIApAQCAtMTE3OSw3ICsxNTQ0LDcgQEAKIAlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOwogCXU4IG1vZGU7CiAKLQltb2RlID0gd2Fjb20tPmxlZC5zZWxlY3RbaW5kZXhdOworCW1vZGUgPSB3YWNvbS0+bGVkLmdyb3Vwc1tpbmRleF0uc2VsZWN0OwogCWlmIChtb2RlID49IDAgJiYgbW9kZSA8IDMpCiAJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBtb2RlKTsKIAllbHNlCkBAIC0xMjEyLDU0ICsxNTc3LDMwIEBACiBERVZJQ0VfRUtSX0FUVFJfR1JPVVAoMyk7CiBERVZJQ0VfRUtSX0FUVFJfR1JPVVAoNCk7CiAKLWludCB3YWNvbV9yZW1vdGVfY3JlYXRlX2F0dHJfZ3JvdXAoc3RydWN0IHdhY29tICp3YWNvbSwgX191MzIgc2VyaWFsLCBpbnQgaW5kZXgpCitzdGF0aWMgaW50IHdhY29tX3JlbW90ZV9jcmVhdGVfYXR0cl9ncm91cChzdHJ1Y3Qgd2Fjb20gKndhY29tLCBfX3UzMiBzZXJpYWwsCisJCQkJCSAgaW50IGluZGV4KQogewogCWludCBlcnJvciA9IDA7Ci0JY2hhciAqYnVmOwotCXN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYyA9ICZ3YWNvbS0+d2Fjb21fd2FjOworCXN0cnVjdCB3YWNvbV9yZW1vdGUgKnJlbW90ZSA9IHdhY29tLT5yZW1vdGU7CiAKLQl3YWNvbV93YWMtPnNlcmlhbFtpbmRleF0gPSBzZXJpYWw7Ci0KLQlidWYgPSBremFsbG9jKFdBQ19SRU1PVEVfU0VSSUFMX01BWF9TVFJMRU4sIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQorCXJlbW90ZS0+cmVtb3Rlc1tpbmRleF0uZ3JvdXAubmFtZSA9IGRldm1fa2FzcHJpbnRmKCZ3YWNvbS0+aGRldi0+ZGV2LAorCQkJCQkJCSAgR0ZQX0tFUk5FTCwKKwkJCQkJCQkgICIlZCIsIHNlcmlhbCk7CisJaWYgKCFyZW1vdGUtPnJlbW90ZXNbaW5kZXhdLmdyb3VwLm5hbWUpCiAJCXJldHVybiAtRU5PTUVNOwotCXNucHJpbnRmKGJ1ZiwgV0FDX1JFTU9URV9TRVJJQUxfTUFYX1NUUkxFTiwgIiVkIiwgc2VyaWFsKTsKLQl3YWNvbS0+cmVtb3RlX2dyb3VwW2luZGV4XS5uYW1lID0gYnVmOwogCi0JZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAod2Fjb20tPnJlbW90ZV9kaXIsCi0JCQkJICAgJndhY29tLT5yZW1vdGVfZ3JvdXBbaW5kZXhdKTsKKwllcnJvciA9IF9fd2Fjb21fZGV2bV9zeXNmc19jcmVhdGVfZ3JvdXAod2Fjb20sIHJlbW90ZS0+cmVtb3RlX2RpciwKKwkJCQkJCSZyZW1vdGUtPnJlbW90ZXNbaW5kZXhdLmdyb3VwKTsKIAlpZiAoZXJyb3IpIHsKKwkJcmVtb3RlLT5yZW1vdGVzW2luZGV4XS5ncm91cC5uYW1lID0gTlVMTDsKIAkJaGlkX2Vycih3YWNvbS0+aGRldiwKIAkJCSJjYW5ub3QgY3JlYXRlIHN5c2ZzIGdyb3VwIGVycjogJWRcbiIsIGVycm9yKTsKLQkJa29iamVjdF9wdXQod2Fjb20tPnJlbW90ZV9kaXIpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgd2Fjb21fcmVtb3RlX2Rlc3Ryb3lfYXR0cl9ncm91cChzdHJ1Y3Qgd2Fjb20gKndhY29tLCBfX3UzMiBzZXJpYWwpCi17Ci0Jc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjID0gJndhY29tLT53YWNvbV93YWM7Ci0JaW50IGk7Ci0KLQlpZiAoIXNlcmlhbCkKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IFdBQ09NX01BWF9SRU1PVEVTOyBpKyspIHsKLQkJaWYgKHdhY29tX3dhYy0+c2VyaWFsW2ldID09IHNlcmlhbCkgewotCQkJd2Fjb21fd2FjLT5zZXJpYWxbaV0gPSAwOwotCQkJd2Fjb20tPmxlZC5zZWxlY3RbaV0gPSBXQUNPTV9TVEFUVVNfVU5LTk9XTjsKLQkJCWlmICh3YWNvbS0+cmVtb3RlX2dyb3VwW2ldLm5hbWUpIHsKLQkJCQlzeXNmc19yZW1vdmVfZ3JvdXAod2Fjb20tPnJlbW90ZV9kaXIsCi0JCQkJCQkgICAmd2Fjb20tPnJlbW90ZV9ncm91cFtpXSk7Ci0JCQkJa2ZyZWUod2Fjb20tPnJlbW90ZV9ncm91cFtpXS5uYW1lKTsKLQkJCQl3YWNvbS0+cmVtb3RlX2dyb3VwW2ldLm5hbWUgPSBOVUxMOwotCQkJfQotCQl9Ci0JfQotfQotCiBzdGF0aWMgaW50IHdhY29tX2NtZF91bnBhaXJfcmVtb3RlKHN0cnVjdCB3YWNvbSAqd2Fjb20sIHVuc2lnbmVkIGNoYXIgc2VsZWN0b3IpCiB7CiAJY29uc3Qgc2l6ZV90IGJ1Zl9zaXplID0gMjsKQEAgLTEzMTYsMjcgKzE2NTcsNTcgQEAKIAlOVUxMCiB9OwogCi1zdGF0aWMgaW50IHdhY29tX2luaXRpYWxpemVfcmVtb3RlKHN0cnVjdCB3YWNvbSAqd2Fjb20pCitzdGF0aWMgdm9pZCB3YWNvbV9yZW1vdGVzX2Rlc3Ryb3kodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gZGF0YTsKKwlzdHJ1Y3Qgd2Fjb21fcmVtb3RlICpyZW1vdGUgPSB3YWNvbS0+cmVtb3RlOworCisJaWYgKCFyZW1vdGUpCisJCXJldHVybjsKKworCWtvYmplY3RfcHV0KHJlbW90ZS0+cmVtb3RlX2Rpcik7CisJa2ZpZm9fZnJlZSgmcmVtb3RlLT5yZW1vdGVfZmlmbyk7CisJd2Fjb20tPnJlbW90ZSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgd2Fjb21faW5pdGlhbGl6ZV9yZW1vdGVzKHN0cnVjdCB3YWNvbSAqd2Fjb20pCiB7CiAJaW50IGVycm9yID0gMDsKLQlzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMgPSAmKHdhY29tLT53YWNvbV93YWMpOworCXN0cnVjdCB3YWNvbV9yZW1vdGUgKnJlbW90ZTsKIAlpbnQgaTsKIAogCWlmICh3YWNvbS0+d2Fjb21fd2FjLmZlYXR1cmVzLnR5cGUgIT0gUkVNT1RFKQogCQlyZXR1cm4gMDsKIAotCXdhY29tLT5yZW1vdGVfZ3JvdXBbMF0gPSByZW1vdGUwX3NlcmlhbF9ncm91cDsKLQl3YWNvbS0+cmVtb3RlX2dyb3VwWzFdID0gcmVtb3RlMV9zZXJpYWxfZ3JvdXA7Ci0Jd2Fjb20tPnJlbW90ZV9ncm91cFsyXSA9IHJlbW90ZTJfc2VyaWFsX2dyb3VwOwotCXdhY29tLT5yZW1vdGVfZ3JvdXBbM10gPSByZW1vdGUzX3NlcmlhbF9ncm91cDsKLQl3YWNvbS0+cmVtb3RlX2dyb3VwWzRdID0gcmVtb3RlNF9zZXJpYWxfZ3JvdXA7Ci0KLQl3YWNvbS0+cmVtb3RlX2RpciA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoIndhY29tX3JlbW90ZSIsCi0JCQkJCQkgICAmd2Fjb20tPmhkZXYtPmRldi5rb2JqKTsKLQlpZiAoIXdhY29tLT5yZW1vdGVfZGlyKQorCXJlbW90ZSA9IGRldm1fa3phbGxvYygmd2Fjb20tPmhkZXYtPmRldiwgc2l6ZW9mKCp3YWNvbS0+cmVtb3RlKSwKKwkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghcmVtb3RlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWVycm9yID0gc3lzZnNfY3JlYXRlX2ZpbGVzKHdhY29tLT5yZW1vdGVfZGlyLCByZW1vdGVfdW5wYWlyX2F0dHJzKTsKKwl3YWNvbS0+cmVtb3RlID0gcmVtb3RlOworCisJc3Bpbl9sb2NrX2luaXQoJnJlbW90ZS0+cmVtb3RlX2xvY2spOworCisJZXJyb3IgPSBrZmlmb19hbGxvYygmcmVtb3RlLT5yZW1vdGVfZmlmbywKKwkJCTUgKiBzaXplb2Yoc3RydWN0IHdhY29tX3JlbW90ZV9kYXRhKSwKKwkJCUdGUF9LRVJORUwpOworCWlmIChlcnJvcikgeworCQloaWRfZXJyKHdhY29tLT5oZGV2LCAiZmFpbGVkIGFsbG9jYXRpbmcgcmVtb3RlX2ZpZm9cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZW1vdGUtPnJlbW90ZXNbMF0uZ3JvdXAgPSByZW1vdGUwX3NlcmlhbF9ncm91cDsKKwlyZW1vdGUtPnJlbW90ZXNbMV0uZ3JvdXAgPSByZW1vdGUxX3NlcmlhbF9ncm91cDsKKwlyZW1vdGUtPnJlbW90ZXNbMl0uZ3JvdXAgPSByZW1vdGUyX3NlcmlhbF9ncm91cDsKKwlyZW1vdGUtPnJlbW90ZXNbM10uZ3JvdXAgPSByZW1vdGUzX3NlcmlhbF9ncm91cDsKKwlyZW1vdGUtPnJlbW90ZXNbNF0uZ3JvdXAgPSByZW1vdGU0X3NlcmlhbF9ncm91cDsKKworCXJlbW90ZS0+cmVtb3RlX2RpciA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoIndhY29tX3JlbW90ZSIsCisJCQkJCQkgICAgJndhY29tLT5oZGV2LT5kZXYua29iaik7CisJaWYgKCFyZW1vdGUtPnJlbW90ZV9kaXIpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyb3IgPSBzeXNmc19jcmVhdGVfZmlsZXMocmVtb3RlLT5yZW1vdGVfZGlyLCByZW1vdGVfdW5wYWlyX2F0dHJzKTsKIAogCWlmIChlcnJvcikgewogCQloaWRfZXJyKHdhY29tLT5oZGV2LApAQCAtMTM0NSwxMCArMTcxNiwxNSBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBXQUNPTV9NQVhfUkVNT1RFUzsgaSsrKSB7Ci0JCXdhY29tLT5sZWQuc2VsZWN0W2ldID0gV0FDT01fU1RBVFVTX1VOS05PV047Ci0JCXdhY29tX3dhYy0+c2VyaWFsW2ldID0gMDsKKwkJd2Fjb20tPmxlZC5ncm91cHNbaV0uc2VsZWN0ID0gV0FDT01fU1RBVFVTX1VOS05PV047CisJCXJlbW90ZS0+cmVtb3Rlc1tpXS5zZXJpYWwgPSAwOwogCX0KIAorCWVycm9yID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KCZ3YWNvbS0+aGRldi0+ZGV2LAorCQkJCQkgd2Fjb21fcmVtb3Rlc19kZXN0cm95LCB3YWNvbSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM1OCw3ICsxNzM0LDcgQEAKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiA9IHdhY29tLT5oZGV2OwogCXN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYyA9ICYod2Fjb20tPndhY29tX3dhYyk7CiAKLQlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpbnB1dF9kZXYgPSBkZXZtX2lucHV0X2FsbG9jYXRlX2RldmljZSgmaGRldi0+ZGV2KTsKIAlpZiAoIWlucHV0X2RldikKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTEzNzcsMzYgKzE3NTMsNiBAQAogCXJldHVybiBpbnB1dF9kZXY7CiB9CiAKLXN0YXRpYyB2b2lkIHdhY29tX2NsZWFuX2lucHV0cyhzdHJ1Y3Qgd2Fjb20gKndhY29tKQotewotCWlmICh3YWNvbS0+d2Fjb21fd2FjLnBlbl9pbnB1dCkgewotCQlpZiAod2Fjb20tPndhY29tX3dhYy5wZW5fcmVnaXN0ZXJlZCkKLQkJCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHdhY29tLT53YWNvbV93YWMucGVuX2lucHV0KTsKLQkJZWxzZQotCQkJaW5wdXRfZnJlZV9kZXZpY2Uod2Fjb20tPndhY29tX3dhYy5wZW5faW5wdXQpOwotCX0KLQlpZiAod2Fjb20tPndhY29tX3dhYy50b3VjaF9pbnB1dCkgewotCQlpZiAod2Fjb20tPndhY29tX3dhYy50b3VjaF9yZWdpc3RlcmVkKQotCQkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uod2Fjb20tPndhY29tX3dhYy50b3VjaF9pbnB1dCk7Ci0JCWVsc2UKLQkJCWlucHV0X2ZyZWVfZGV2aWNlKHdhY29tLT53YWNvbV93YWMudG91Y2hfaW5wdXQpOwotCX0KLQlpZiAod2Fjb20tPndhY29tX3dhYy5wYWRfaW5wdXQpIHsKLQkJaWYgKHdhY29tLT53YWNvbV93YWMucGFkX3JlZ2lzdGVyZWQpCi0JCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh3YWNvbS0+d2Fjb21fd2FjLnBhZF9pbnB1dCk7Ci0JCWVsc2UKLQkJCWlucHV0X2ZyZWVfZGV2aWNlKHdhY29tLT53YWNvbV93YWMucGFkX2lucHV0KTsKLQl9Ci0Ja29iamVjdF9wdXQod2Fjb20tPnJlbW90ZV9kaXIpOwotCXdhY29tLT53YWNvbV93YWMucGVuX2lucHV0ID0gTlVMTDsKLQl3YWNvbS0+d2Fjb21fd2FjLnRvdWNoX2lucHV0ID0gTlVMTDsKLQl3YWNvbS0+d2Fjb21fd2FjLnBhZF9pbnB1dCA9IE5VTEw7Ci0Jd2Fjb20tPndhY29tX3dhYy5wZW5fcmVnaXN0ZXJlZCA9IGZhbHNlOwotCXdhY29tLT53YWNvbV93YWMudG91Y2hfcmVnaXN0ZXJlZCA9IGZhbHNlOwotCXdhY29tLT53YWNvbV93YWMucGFkX3JlZ2lzdGVyZWQgPSBmYWxzZTsKLQl3YWNvbV9kZXN0cm95X2xlZHMod2Fjb20pOwotfQotCiBzdGF0aWMgaW50IHdhY29tX2FsbG9jYXRlX2lucHV0cyhzdHJ1Y3Qgd2Fjb20gKndhY29tKQogewogCXN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYyA9ICYod2Fjb20tPndhY29tX3dhYyk7CkBAIC0xNDE0LDEwICsxNzYwLDEwIEBACiAJd2Fjb21fd2FjLT5wZW5faW5wdXQgPSB3YWNvbV9hbGxvY2F0ZV9pbnB1dCh3YWNvbSk7CiAJd2Fjb21fd2FjLT50b3VjaF9pbnB1dCA9IHdhY29tX2FsbG9jYXRlX2lucHV0KHdhY29tKTsKIAl3YWNvbV93YWMtPnBhZF9pbnB1dCA9IHdhY29tX2FsbG9jYXRlX2lucHV0KHdhY29tKTsKLQlpZiAoIXdhY29tX3dhYy0+cGVuX2lucHV0IHx8ICF3YWNvbV93YWMtPnRvdWNoX2lucHV0IHx8ICF3YWNvbV93YWMtPnBhZF9pbnB1dCkgewotCQl3YWNvbV9jbGVhbl9pbnB1dHMod2Fjb20pOworCWlmICghd2Fjb21fd2FjLT5wZW5faW5wdXQgfHwKKwkgICAgIXdhY29tX3dhYy0+dG91Y2hfaW5wdXQgfHwKKwkgICAgIXdhY29tX3dhYy0+cGFkX2lucHV0KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAl3YWNvbV93YWMtPnBlbl9pbnB1dC0+bmFtZSA9IHdhY29tX3dhYy0+cGVuX25hbWU7CiAJd2Fjb21fd2FjLT50b3VjaF9pbnB1dC0+bmFtZSA9IHdhY29tX3dhYy0+dG91Y2hfbmFtZTsKQEAgLTE0NDgsOCArMTc5NCw3IEBACiAJfSBlbHNlIHsKIAkJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocGVuX2lucHV0X2Rldik7CiAJCWlmIChlcnJvcikKLQkJCWdvdG8gZmFpbF9yZWdpc3Rlcl9wZW5faW5wdXQ7Ci0JCXdhY29tX3dhYy0+cGVuX3JlZ2lzdGVyZWQgPSB0cnVlOworCQkJZ290byBmYWlsOwogCX0KIAogCWVycm9yID0gd2Fjb21fc2V0dXBfdG91Y2hfaW5wdXRfY2FwYWJpbGl0aWVzKHRvdWNoX2lucHV0X2Rldiwgd2Fjb21fd2FjKTsKQEAgLTE0NjEsOCArMTgwNiw3IEBACiAJfSBlbHNlIHsKIAkJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UodG91Y2hfaW5wdXRfZGV2KTsKIAkJaWYgKGVycm9yKQotCQkJZ290byBmYWlsX3JlZ2lzdGVyX3RvdWNoX2lucHV0OwotCQl3YWNvbV93YWMtPnRvdWNoX3JlZ2lzdGVyZWQgPSB0cnVlOworCQkJZ290byBmYWlsOwogCX0KIAogCWVycm9yID0gd2Fjb21fc2V0dXBfcGFkX2lucHV0X2NhcGFiaWxpdGllcyhwYWRfaW5wdXRfZGV2LCB3YWNvbV93YWMpOwpAQCAtMTQ3NCwzNyArMTgxOCwxNSBAQAogCX0gZWxzZSB7CiAJCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHBhZF9pbnB1dF9kZXYpOwogCQlpZiAoZXJyb3IpCi0JCQlnb3RvIGZhaWxfcmVnaXN0ZXJfcGFkX2lucHV0OwotCQl3YWNvbV93YWMtPnBhZF9yZWdpc3RlcmVkID0gdHJ1ZTsKLQotCQllcnJvciA9IHdhY29tX2luaXRpYWxpemVfbGVkcyh3YWNvbSk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gZmFpbF9sZWRzOwotCi0JCWVycm9yID0gd2Fjb21faW5pdGlhbGl6ZV9yZW1vdGUod2Fjb20pOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIGZhaWxfcmVtb3RlOworCQkJZ290byBmYWlsOwogCX0KIAogCXJldHVybiAwOwogCi1mYWlsX3JlbW90ZToKLQl3YWNvbV9kZXN0cm95X2xlZHMod2Fjb20pOwotZmFpbF9sZWRzOgotCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHBhZF9pbnB1dF9kZXYpOwotCXBhZF9pbnB1dF9kZXYgPSBOVUxMOwotCXdhY29tX3dhYy0+cGFkX3JlZ2lzdGVyZWQgPSBmYWxzZTsKLWZhaWxfcmVnaXN0ZXJfcGFkX2lucHV0OgotCWlmICh0b3VjaF9pbnB1dF9kZXYpCi0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHRvdWNoX2lucHV0X2Rldik7CitmYWlsOgorCXdhY29tX3dhYy0+cGFkX2lucHV0ID0gTlVMTDsKIAl3YWNvbV93YWMtPnRvdWNoX2lucHV0ID0gTlVMTDsKLQl3YWNvbV93YWMtPnRvdWNoX3JlZ2lzdGVyZWQgPSBmYWxzZTsKLWZhaWxfcmVnaXN0ZXJfdG91Y2hfaW5wdXQ6Ci0JaWYgKHBlbl9pbnB1dF9kZXYpCi0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHBlbl9pbnB1dF9kZXYpOwogCXdhY29tX3dhYy0+cGVuX2lucHV0ID0gTlVMTDsKLQl3YWNvbV93YWMtPnBlbl9yZWdpc3RlcmVkID0gZmFsc2U7Ci1mYWlsX3JlZ2lzdGVyX3Blbl9pbnB1dDoKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE1NDMsMTQgKzE4NjUsMTQgQEAKIAogdm9pZCB3YWNvbV9iYXR0ZXJ5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdhY29tLCB3b3JrKTsKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3YWNvbSwgYmF0dGVyeV93b3JrKTsKIAogCWlmICgod2Fjb20tPndhY29tX3dhYy5mZWF0dXJlcy5xdWlya3MgJiBXQUNPTV9RVUlSS19CQVRURVJZKSAmJgotCSAgICAgIXdhY29tLT5iYXR0ZXJ5KSB7CisJICAgICAhd2Fjb20tPmJhdHRlcnkuYmF0dGVyeSkgewogCQl3YWNvbV9pbml0aWFsaXplX2JhdHRlcnkod2Fjb20pOwogCX0KIAllbHNlIGlmICghKHdhY29tLT53YWNvbV93YWMuZmVhdHVyZXMucXVpcmtzICYgV0FDT01fUVVJUktfQkFUVEVSWSkgJiYKLQkJIHdhY29tLT5iYXR0ZXJ5KSB7CisJCSB3YWNvbS0+YmF0dGVyeS5iYXR0ZXJ5KSB7CiAJCXdhY29tX2Rlc3Ryb3lfYmF0dGVyeSh3YWNvbSk7CiAJfQogfQpAQCAtMTYwNiw2ICsxOTI4LDkgQEAKIAkJc3RybGNweShuYW1lLCBmZWF0dXJlcy0+bmFtZSwgc2l6ZW9mKG5hbWUpKTsKIAl9CiAKKwlzbnByaW50Zih3YWNvbV93YWMtPm5hbWUsIHNpemVvZih3YWNvbV93YWMtPm5hbWUpLCAiJXMlcyIsCisJCSBuYW1lLCBzdWZmaXgpOworCiAJLyogQXBwZW5kIHRoZSBkZXZpY2UgdHlwZSB0byB0aGUgbmFtZSAqLwogCXNucHJpbnRmKHdhY29tX3dhYy0+cGVuX25hbWUsIHNpemVvZih3YWNvbV93YWMtPnBlbl9uYW1lKSwKIAkJIiVzJXMgUGVuIiwgbmFtZSwgc3VmZml4KTsKQEAgLTE2MTUsNiArMTk0MCwyMiBAQAogCQkiJXMlcyBQYWQiLCBuYW1lLCBzdWZmaXgpOwogfQogCitzdGF0aWMgdm9pZCB3YWNvbV9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3Qgd2Fjb20gKndhY29tKQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoZGV2ID0gd2Fjb20tPmhkZXY7CisKKwlpZiAoIXdhY29tLT5yZXNvdXJjZXMpCisJCXJldHVybjsKKworCWRldnJlc19yZWxlYXNlX2dyb3VwKCZoZGV2LT5kZXYsIHdhY29tKTsKKworCXdhY29tLT5yZXNvdXJjZXMgPSBmYWxzZTsKKworCXdhY29tLT53YWNvbV93YWMucGVuX2lucHV0ID0gTlVMTDsKKwl3YWNvbS0+d2Fjb21fd2FjLnRvdWNoX2lucHV0ID0gTlVMTDsKKwl3YWNvbS0+d2Fjb21fd2FjLnBhZF9pbnB1dCA9IE5VTEw7Cit9CisKIHN0YXRpYyBpbnQgd2Fjb21fcGFyc2VfYW5kX3JlZ2lzdGVyKHN0cnVjdCB3YWNvbSAqd2Fjb20sIGJvb2wgd2lyZWxlc3MpCiB7CiAJc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjID0gJndhY29tLT53YWNvbV93YWM7CkBAIC0xNjI3LDkgKzE5NjgsMTQgQEAKIAlpZiAoZmVhdHVyZXMtPnBrdGxlbiA+IFdBQ09NX1BLR0xFTl9NQVgpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKCFkZXZyZXNfb3Blbl9ncm91cCgmaGRldi0+ZGV2LCB3YWNvbSwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJd2Fjb20tPnJlc291cmNlcyA9IHRydWU7CisKIAllcnJvciA9IHdhY29tX2FsbG9jYXRlX2lucHV0cyh3YWNvbSk7CiAJaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7CisJCWdvdG8gZmFpbDsKIAogCS8qCiAJICogQmFtYm9vIFBhZCBoYXMgYSBnZW5lcmljIGhpZCBoYW5kbGluZyBmb3IgdGhlIFBlbiwgYW5kIHdlIHN3aXRjaCBpdApAQCAtMTY0Miw3ICsxOTg4LDcgQEAKIAkJfSBlbHNlIGlmICgoZmVhdHVyZXMtPnBrdGxlbiAhPSBXQUNPTV9QS0dMRU5fQlBBRF9UT1VDSCkgJiYKIAkJCSAgIChmZWF0dXJlcy0+cGt0bGVuICE9IFdBQ09NX1BLR0xFTl9CUEFEX1RPVUNIX1VTQikpIHsKIAkJCWVycm9yID0gLUVOT0RFVjsKLQkJCWdvdG8gZmFpbF9hbGxvY2F0ZV9pbnB1dHM7CisJCQlnb3RvIGZhaWw7CiAJCX0KIAl9CiAKQEAgLTE2NjIsNyArMjAwOCw3IEBACiAJCQkgZXJyb3IgPyAiSWdub3JpbmciIDogIkFzc3VtaW5nIHBlbiIpOwogCiAJCWlmIChlcnJvcikKLQkJCWdvdG8gZmFpbF9wYXJzZWQ7CisJCQlnb3RvIGZhaWw7CiAKIAkJZmVhdHVyZXMtPmRldmljZV90eXBlIHw9IFdBQ09NX0RFVklDRVRZUEVfUEVOOwogCX0KQEAgLTE2NzMsMTggKzIwMTksMjggQEAKIAogCWVycm9yID0gd2Fjb21fYWRkX3NoYXJlZF9kYXRhKGhkZXYpOwogCWlmIChlcnJvcikKLQkJZ290byBmYWlsX3NoYXJlZF9kYXRhOworCQlnb3RvIGZhaWw7CiAKIAlpZiAoIShmZWF0dXJlcy0+ZGV2aWNlX3R5cGUgJiBXQUNPTV9ERVZJQ0VUWVBFX1dMX01PTklUT1IpICYmCiAJICAgICAoZmVhdHVyZXMtPnF1aXJrcyAmIFdBQ09NX1FVSVJLX0JBVFRFUlkpKSB7CiAJCWVycm9yID0gd2Fjb21faW5pdGlhbGl6ZV9iYXR0ZXJ5KHdhY29tKTsKIAkJaWYgKGVycm9yKQotCQkJZ290byBmYWlsX2JhdHRlcnk7CisJCQlnb3RvIGZhaWw7CiAJfQogCiAJZXJyb3IgPSB3YWNvbV9yZWdpc3Rlcl9pbnB1dHMod2Fjb20pOwogCWlmIChlcnJvcikKLQkJZ290byBmYWlsX3JlZ2lzdGVyX2lucHV0czsKKwkJZ290byBmYWlsOworCisJaWYgKHdhY29tLT53YWNvbV93YWMuZmVhdHVyZXMuZGV2aWNlX3R5cGUgJiBXQUNPTV9ERVZJQ0VUWVBFX1BBRCkgeworCQllcnJvciA9IHdhY29tX2luaXRpYWxpemVfbGVkcyh3YWNvbSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZmFpbDsKKworCQllcnJvciA9IHdhY29tX2luaXRpYWxpemVfcmVtb3Rlcyh3YWNvbSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZmFpbDsKKwl9CiAKIAlpZiAoZmVhdHVyZXMtPnR5cGUgPT0gSElEX0dFTkVSSUMpCiAJCWNvbm5lY3RfbWFzayB8PSBISURfQ09OTkVDVF9EUklWRVI7CkBAIC0xNjkzLDcgKzIwNDksNyBAQAogCWVycm9yID0gaGlkX2h3X3N0YXJ0KGhkZXYsIGNvbm5lY3RfbWFzayk7CiAJaWYgKGVycm9yKSB7CiAJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7Ci0JCWdvdG8gZmFpbF9od19zdGFydDsKKwkJZ290byBmYWlsOwogCX0KIAogCWlmICghd2lyZWxlc3MpIHsKQEAgLTE3MDUsNyArMjA2MSw3IEBACiAJaWYgKChmZWF0dXJlcy0+dHlwZSA9PSBCQU1CT09fVE9VQ0gpICYmCiAJICAgIChmZWF0dXJlcy0+ZGV2aWNlX3R5cGUgJiBXQUNPTV9ERVZJQ0VUWVBFX1BFTikpIHsKIAkJZXJyb3IgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxfaHdfc3RhcnQ7CisJCWdvdG8gZmFpbF9xdWlya3M7CiAJfQogCiAJLyogcGVuIG9ubHkgQmFtYm9vIG5laXRoZXIgc3VwcG9ydCB0b3VjaCBub3IgcGFkICovCkBAIC0xNzEzLDM3ICsyMDY5LDMzIEBACiAJICAgICgoZmVhdHVyZXMtPmRldmljZV90eXBlICYgV0FDT01fREVWSUNFVFlQRV9UT1VDSCkgfHwKIAkgICAgKGZlYXR1cmVzLT5kZXZpY2VfdHlwZSAmIFdBQ09NX0RFVklDRVRZUEVfUEFEKSkpIHsKIAkJZXJyb3IgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxfaHdfc3RhcnQ7CisJCWdvdG8gZmFpbF9xdWlya3M7CiAJfQogCiAJaWYgKGZlYXR1cmVzLT5kZXZpY2VfdHlwZSAmIFdBQ09NX0RFVklDRVRZUEVfV0xfTU9OSVRPUikKIAkJZXJyb3IgPSBoaWRfaHdfb3BlbihoZGV2KTsKIAogCWlmICgod2Fjb21fd2FjLT5mZWF0dXJlcy50eXBlID09IElOVFVPU0hUIHx8Ci0JICAgIHdhY29tX3dhYy0+ZmVhdHVyZXMudHlwZSA9PSBJTlRVT1NIVDIpICYmCisJICAgICB3YWNvbV93YWMtPmZlYXR1cmVzLnR5cGUgPT0gSU5UVU9TSFQyKSAmJgogCSAgICAod2Fjb21fd2FjLT5mZWF0dXJlcy5kZXZpY2VfdHlwZSAmIFdBQ09NX0RFVklDRVRZUEVfVE9VQ0gpKSB7Ci0JCQl3YWNvbV93YWMtPnNoYXJlZC0+dG91Y2hfaW5wdXQgPSB3YWNvbV93YWMtPnRvdWNoX2lucHV0OworCQl3YWNvbV93YWMtPnNoYXJlZC0+dHlwZSA9IHdhY29tX3dhYy0+ZmVhdHVyZXMudHlwZTsKKwkJd2Fjb21fd2FjLT5zaGFyZWQtPnRvdWNoX2lucHV0ID0gd2Fjb21fd2FjLT50b3VjaF9pbnB1dDsKIAl9CiAKKwlkZXZyZXNfY2xvc2VfZ3JvdXAoJmhkZXYtPmRldiwgd2Fjb20pOworCiAJcmV0dXJuIDA7CiAKLWZhaWxfaHdfc3RhcnQ6CitmYWlsX3F1aXJrczoKIAloaWRfaHdfc3RvcChoZGV2KTsKLWZhaWxfcmVnaXN0ZXJfaW5wdXRzOgotCXdhY29tX2NsZWFuX2lucHV0cyh3YWNvbSk7Ci0Jd2Fjb21fZGVzdHJveV9iYXR0ZXJ5KHdhY29tKTsKLWZhaWxfYmF0dGVyeToKLQl3YWNvbV9yZW1vdmVfc2hhcmVkX2RhdGEod2Fjb20pOwotZmFpbF9zaGFyZWRfZGF0YToKLWZhaWxfcGFyc2VkOgotZmFpbF9hbGxvY2F0ZV9pbnB1dHM6Ci0Jd2Fjb21fY2xlYW5faW5wdXRzKHdhY29tKTsKK2ZhaWw6CisJd2Fjb21fcmVsZWFzZV9yZXNvdXJjZXMod2Fjb20pOwogCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIHZvaWQgd2Fjb21fd2lyZWxlc3Nfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHdhY29tICp3YWNvbSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd2Fjb20sIHdvcmspOworCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdhY29tLCB3aXJlbGVzc193b3JrKTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2ID0gd2Fjb20tPnVzYmRldjsKIAlzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMgPSAmd2Fjb20tPndhY29tX3dhYzsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGRldjEsICpoZGV2MjsKQEAgLTE3NjIsMTcgKzIxMTQsMTYgQEAKIAloZGV2MSA9IHVzYl9nZXRfaW50ZmRhdGEodXNiZGV2LT5jb25maWctPmludGVyZmFjZVsxXSk7CiAJd2Fjb20xID0gaGlkX2dldF9kcnZkYXRhKGhkZXYxKTsKIAl3YWNvbV93YWMxID0gJih3YWNvbTEtPndhY29tX3dhYyk7Ci0Jd2Fjb21fY2xlYW5faW5wdXRzKHdhY29tMSk7CisJd2Fjb21fcmVsZWFzZV9yZXNvdXJjZXMod2Fjb20xKTsKIAogCS8qIFRvdWNoIGludGVyZmFjZSAqLwogCWhkZXYyID0gdXNiX2dldF9pbnRmZGF0YSh1c2JkZXYtPmNvbmZpZy0+aW50ZXJmYWNlWzJdKTsKIAl3YWNvbTIgPSBoaWRfZ2V0X2RydmRhdGEoaGRldjIpOwogCXdhY29tX3dhYzIgPSAmKHdhY29tMi0+d2Fjb21fd2FjKTsKLQl3YWNvbV9jbGVhbl9pbnB1dHMod2Fjb20yKTsKKwl3YWNvbV9yZWxlYXNlX3Jlc291cmNlcyh3YWNvbTIpOwogCiAJaWYgKHdhY29tX3dhYy0+cGlkID09IDApIHsKIAkJaGlkX2luZm8od2Fjb20tPmhkZXYsICJ3aXJlbGVzcyB0YWJsZXQgZGlzY29ubmVjdGVkXG4iKTsKLQkJd2Fjb21fd2FjMS0+c2hhcmVkLT50eXBlID0gMDsKIAl9IGVsc2UgewogCQljb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCAqaWQgPSB3YWNvbV9pZHM7CiAKQEAgLTE4MTQsNiArMjE2NSw4IEBACiAJCQkJZ290byBmYWlsOwogCQl9CiAKKwkJc3RybGNweSh3YWNvbV93YWMtPm5hbWUsIHdhY29tX3dhYzEtPm5hbWUsCisJCQlzaXplb2Yod2Fjb21fd2FjLT5uYW1lKSk7CiAJCWVycm9yID0gd2Fjb21faW5pdGlhbGl6ZV9iYXR0ZXJ5KHdhY29tKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBmYWlsOwpAQCAtMTgyMiwxMSArMjE3NSwxNzcgQEAKIAlyZXR1cm47CiAKIGZhaWw6Ci0Jd2Fjb21fY2xlYW5faW5wdXRzKHdhY29tMSk7Ci0Jd2Fjb21fY2xlYW5faW5wdXRzKHdhY29tMik7CisJd2Fjb21fcmVsZWFzZV9yZXNvdXJjZXMod2Fjb20xKTsKKwl3YWNvbV9yZWxlYXNlX3Jlc291cmNlcyh3YWNvbTIpOwogCXJldHVybjsKIH0KIAorc3RhdGljIHZvaWQgd2Fjb21fcmVtb3RlX2Rlc3Ryb3lfb25lKHN0cnVjdCB3YWNvbSAqd2Fjb20sIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlzdHJ1Y3Qgd2Fjb21fcmVtb3RlICpyZW1vdGUgPSB3YWNvbS0+cmVtb3RlOworCXUzMiBzZXJpYWwgPSByZW1vdGUtPnJlbW90ZXNbaW5kZXhdLnNlcmlhbDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJlbW90ZS0+cmVtb3RlX2xvY2ssIGZsYWdzKTsKKwlyZW1vdGUtPnJlbW90ZXNbaW5kZXhdLnJlZ2lzdGVyZWQgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZW1vdGUtPnJlbW90ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAocmVtb3RlLT5yZW1vdGVzW2luZGV4XS5iYXR0ZXJ5LmJhdHRlcnkpCisJCWRldnJlc19yZWxlYXNlX2dyb3VwKCZ3YWNvbS0+aGRldi0+ZGV2LAorCQkJCSAgICAgJnJlbW90ZS0+cmVtb3Rlc1tpbmRleF0uYmF0dGVyeS5iYXRfZGVzYyk7CisKKwlpZiAocmVtb3RlLT5yZW1vdGVzW2luZGV4XS5ncm91cC5uYW1lKQorCQlkZXZyZXNfcmVsZWFzZV9ncm91cCgmd2Fjb20tPmhkZXYtPmRldiwKKwkJCQkgICAgICZyZW1vdGUtPnJlbW90ZXNbaW5kZXhdKTsKKworCWZvciAoaSA9IDA7IGkgPCBXQUNPTV9NQVhfUkVNT1RFUzsgaSsrKSB7CisJCWlmIChyZW1vdGUtPnJlbW90ZXNbaV0uc2VyaWFsID09IHNlcmlhbCkgeworCQkJcmVtb3RlLT5yZW1vdGVzW2ldLnNlcmlhbCA9IDA7CisJCQlyZW1vdGUtPnJlbW90ZXNbaV0uZ3JvdXAubmFtZSA9IE5VTEw7CisJCQlyZW1vdGUtPnJlbW90ZXNbaV0ucmVnaXN0ZXJlZCA9IGZhbHNlOworCQkJcmVtb3RlLT5yZW1vdGVzW2ldLmJhdHRlcnkuYmF0dGVyeSA9IE5VTEw7CisJCQl3YWNvbS0+bGVkLmdyb3Vwc1tpXS5zZWxlY3QgPSBXQUNPTV9TVEFUVVNfVU5LTk9XTjsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB3YWNvbV9yZW1vdGVfY3JlYXRlX29uZShzdHJ1Y3Qgd2Fjb20gKndhY29tLCB1MzIgc2VyaWFsLAorCQkJCSAgIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlzdHJ1Y3Qgd2Fjb21fcmVtb3RlICpyZW1vdGUgPSB3YWNvbS0+cmVtb3RlOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ3YWNvbS0+aGRldi0+ZGV2OworCWludCBlcnJvciwgazsKKworCS8qIEEgcmVtb3RlIGNhbiBwYWlyIG1vcmUgdGhhbiBvbmNlIHdpdGggYW4gRUtSLAorCSAqIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGlzIHNlcmlhbCBpc24ndCBhbHJlYWR5IHBhaXJlZC4KKwkgKi8KKwlmb3IgKGsgPSAwOyBrIDwgV0FDT01fTUFYX1JFTU9URVM7IGsrKykgeworCQlpZiAocmVtb3RlLT5yZW1vdGVzW2tdLnNlcmlhbCA9PSBzZXJpYWwpCisJCQlicmVhazsKKwl9CisKKwlpZiAoayA8IFdBQ09NX01BWF9SRU1PVEVTKSB7CisJCXJlbW90ZS0+cmVtb3Rlc1tpbmRleF0uc2VyaWFsID0gc2VyaWFsOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRldnJlc19vcGVuX2dyb3VwKGRldiwgJnJlbW90ZS0+cmVtb3Rlc1tpbmRleF0sIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVycm9yID0gd2Fjb21fcmVtb3RlX2NyZWF0ZV9hdHRyX2dyb3VwKHdhY29tLCBzZXJpYWwsIGluZGV4KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbDsKKworCXJlbW90ZS0+cmVtb3Rlc1tpbmRleF0uaW5wdXQgPSB3YWNvbV9hbGxvY2F0ZV9pbnB1dCh3YWNvbSk7CisJaWYgKCFyZW1vdGUtPnJlbW90ZXNbaW5kZXhdLmlucHV0KSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwlyZW1vdGUtPnJlbW90ZXNbaW5kZXhdLmlucHV0LT51bmlxID0gcmVtb3RlLT5yZW1vdGVzW2luZGV4XS5ncm91cC5uYW1lOworCXJlbW90ZS0+cmVtb3Rlc1tpbmRleF0uaW5wdXQtPm5hbWUgPSB3YWNvbS0+d2Fjb21fd2FjLnBhZF9uYW1lOworCisJaWYgKCFyZW1vdGUtPnJlbW90ZXNbaW5kZXhdLmlucHV0LT5uYW1lKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBmYWlsOworCX0KKworCWVycm9yID0gd2Fjb21fc2V0dXBfcGFkX2lucHV0X2NhcGFiaWxpdGllcyhyZW1vdGUtPnJlbW90ZXNbaW5kZXhdLmlucHV0LAorCQkJCQkJICAgJndhY29tLT53YWNvbV93YWMpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOworCisJcmVtb3RlLT5yZW1vdGVzW2luZGV4XS5zZXJpYWwgPSBzZXJpYWw7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShyZW1vdGUtPnJlbW90ZXNbaW5kZXhdLmlucHV0KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbDsKKworCWVycm9yID0gd2Fjb21fbGVkX2dyb3Vwc19hbGxvY19hbmRfcmVnaXN0ZXJfb25lKAorCQkJCQkmcmVtb3RlLT5yZW1vdGVzW2luZGV4XS5pbnB1dC0+ZGV2LAorCQkJCQl3YWNvbSwgaW5kZXgsIDMsIHRydWUpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOworCisJcmVtb3RlLT5yZW1vdGVzW2luZGV4XS5yZWdpc3RlcmVkID0gdHJ1ZTsKKworCWRldnJlc19jbG9zZV9ncm91cChkZXYsICZyZW1vdGUtPnJlbW90ZXNbaW5kZXhdKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlkZXZyZXNfcmVsZWFzZV9ncm91cChkZXYsICZyZW1vdGUtPnJlbW90ZXNbaW5kZXhdKTsKKwlyZW1vdGUtPnJlbW90ZXNbaW5kZXhdLnNlcmlhbCA9IDA7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHdhY29tX3JlbW90ZV9hdHRhY2hfYmF0dGVyeShzdHJ1Y3Qgd2Fjb20gKndhY29tLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHdhY29tX3JlbW90ZSAqcmVtb3RlID0gd2Fjb20tPnJlbW90ZTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIXJlbW90ZS0+cmVtb3Rlc1tpbmRleF0ucmVnaXN0ZXJlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocmVtb3RlLT5yZW1vdGVzW2luZGV4XS5iYXR0ZXJ5LmJhdHRlcnkpCisJCXJldHVybiAwOworCisJaWYgKHdhY29tLT5sZWQuZ3JvdXBzW2luZGV4XS5zZWxlY3QgPT0gV0FDT01fU1RBVFVTX1VOS05PV04pCisJCXJldHVybiAwOworCisJZXJyb3IgPSBfX3dhY29tX2luaXRpYWxpemVfYmF0dGVyeSh3YWNvbSwKKwkJCQkJJndhY29tLT5yZW1vdGUtPnJlbW90ZXNbaW5kZXhdLmJhdHRlcnkpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdhY29tX3JlbW90ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3YWNvbSwgcmVtb3RlX3dvcmspOworCXN0cnVjdCB3YWNvbV9yZW1vdGUgKnJlbW90ZSA9IHdhY29tLT5yZW1vdGU7CisJc3RydWN0IHdhY29tX3JlbW90ZV9kYXRhIGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdTMyIHNlcmlhbDsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyZW1vdGUtPnJlbW90ZV9sb2NrLCBmbGFncyk7CisKKwljb3VudCA9IGtmaWZvX291dCgmcmVtb3RlLT5yZW1vdGVfZmlmbywgJmRhdGEsIHNpemVvZihkYXRhKSk7CisKKwlpZiAoY291bnQgIT0gc2l6ZW9mKGRhdGEpKSB7CisJCWhpZF9lcnIod2Fjb20tPmhkZXYsCisJCQkid29ya2l0ZW0gdHJpZ2dlcmVkIHdpdGhvdXQgc3RhdHVzIGF2YWlsYWJsZVxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlbW90ZS0+cmVtb3RlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgha2ZpZm9faXNfZW1wdHkoJnJlbW90ZS0+cmVtb3RlX2ZpZm8pKQorCQl3YWNvbV9zY2hlZHVsZV93b3JrKCZ3YWNvbS0+d2Fjb21fd2FjLCBXQUNPTV9XT1JLRVJfUkVNT1RFKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlbW90ZS0+cmVtb3RlX2xvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBXQUNPTV9NQVhfUkVNT1RFUzsgaSsrKSB7CisJCXNlcmlhbCA9IGRhdGEucmVtb3RlW2ldLnNlcmlhbDsKKwkJaWYgKGRhdGEucmVtb3RlW2ldLmNvbm5lY3RlZCkgeworCisJCQlpZiAocmVtb3RlLT5yZW1vdGVzW2ldLnNlcmlhbCA9PSBzZXJpYWwpIHsKKwkJCQl3YWNvbV9yZW1vdGVfYXR0YWNoX2JhdHRlcnkod2Fjb20sIGkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAocmVtb3RlLT5yZW1vdGVzW2ldLnNlcmlhbCkKKwkJCQl3YWNvbV9yZW1vdGVfZGVzdHJveV9vbmUod2Fjb20sIGkpOworCisJCQl3YWNvbV9yZW1vdGVfY3JlYXRlX29uZSh3YWNvbSwgc2VyaWFsLCBpKTsKKworCQl9IGVsc2UgaWYgKHJlbW90ZS0+cmVtb3Rlc1tpXS5zZXJpYWwpIHsKKwkJCXdhY29tX3JlbW90ZV9kZXN0cm95X29uZSh3YWNvbSwgaSk7CisJCX0KKwl9Cit9CisKIHN0YXRpYyBpbnQgd2Fjb21fcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCiAJCWNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKIHsKQEAgLTE4NDUsNyArMjM2NCw3IEBACiAJLyogaGlkLWNvcmUgc2V0cyB0aGlzIHF1aXJrIGZvciB0aGUgYm9vdCBpbnRlcmZhY2UgKi8KIAloZGV2LT5xdWlya3MgJj0gfkhJRF9RVUlSS19OT0dFVDsKIAotCXdhY29tID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdhY29tKSwgR0ZQX0tFUk5FTCk7CisJd2Fjb20gPSBkZXZtX2t6YWxsb2MoJmhkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCB3YWNvbSksIEdGUF9LRVJORUwpOwogCWlmICghd2Fjb20pCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xODU4LDcgKzIzNzcsNyBAQAogCiAJaWYgKGZlYXR1cmVzLT5jaGVja19mb3JfaGlkX3R5cGUgJiYgZmVhdHVyZXMtPmhpZF90eXBlICE9IGhkZXYtPnR5cGUpIHsKIAkJZXJyb3IgPSAtRU5PREVWOwotCQlnb3RvIGZhaWxfdHlwZTsKKwkJZ290byBmYWlsOwogCX0KIAogCXdhY29tX3dhYy0+aGlkX2RhdGEuaW5wdXRtb2RlID0gLTE7CkBAIC0xODY3LDE4ICsyMzg2LDIwIEBACiAJd2Fjb20tPnVzYmRldiA9IGRldjsKIAl3YWNvbS0+aW50ZiA9IGludGY7CiAJbXV0ZXhfaW5pdCgmd2Fjb20tPmxvY2spOwotCUlOSVRfV09SSygmd2Fjb20tPndvcmssIHdhY29tX3dpcmVsZXNzX3dvcmspOworCUlOSVRfV09SSygmd2Fjb20tPndpcmVsZXNzX3dvcmssIHdhY29tX3dpcmVsZXNzX3dvcmspOworCUlOSVRfV09SSygmd2Fjb20tPmJhdHRlcnlfd29yaywgd2Fjb21fYmF0dGVyeV93b3JrKTsKKwlJTklUX1dPUksoJndhY29tLT5yZW1vdGVfd29yaywgd2Fjb21fcmVtb3RlX3dvcmspOwogCiAJLyogYXNrIGZvciB0aGUgcmVwb3J0IGRlc2NyaXB0b3IgdG8gYmUgbG9hZGVkIGJ5IEhJRCAqLwogCWVycm9yID0gaGlkX3BhcnNlKGhkZXYpOwogCWlmIChlcnJvcikgewogCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwotCQlnb3RvIGZhaWxfcGFyc2U7CisJCWdvdG8gZmFpbDsKIAl9CiAKIAllcnJvciA9IHdhY29tX3BhcnNlX2FuZF9yZWdpc3Rlcih3YWNvbSwgZmFsc2UpOwogCWlmIChlcnJvcikKLQkJZ290byBmYWlsX3BhcnNlOworCQlnb3RvIGZhaWw7CiAKIAlpZiAoaGRldi0+YnVzID09IEJVU19CTFVFVE9PVEgpIHsKIAkJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmhkZXYtPmRldiwgJmRldl9hdHRyX3NwZWVkKTsKQEAgLTE4OTAsOSArMjQxMSw3IEBACiAKIAlyZXR1cm4gMDsKIAotZmFpbF90eXBlOgotZmFpbF9wYXJzZToKLQlrZnJlZSh3YWNvbSk7CitmYWlsOgogCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBOVUxMKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xOTA4LDE1ICsyNDI3LDEzIEBACiAKIAloaWRfaHdfc3RvcChoZGV2KTsKIAotCWNhbmNlbF93b3JrX3N5bmMoJndhY29tLT53b3JrKTsKLQl3YWNvbV9jbGVhbl9pbnB1dHMod2Fjb20pOworCWNhbmNlbF93b3JrX3N5bmMoJndhY29tLT53aXJlbGVzc193b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZ3YWNvbS0+YmF0dGVyeV93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZ3YWNvbS0+cmVtb3RlX3dvcmspOwogCWlmIChoZGV2LT5idXMgPT0gQlVTX0JMVUVUT09USCkKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZoZGV2LT5kZXYsICZkZXZfYXR0cl9zcGVlZCk7Ci0Jd2Fjb21fZGVzdHJveV9iYXR0ZXJ5KHdhY29tKTsKLQl3YWNvbV9yZW1vdmVfc2hhcmVkX2RhdGEod2Fjb20pOwogCiAJaGlkX3NldF9kcnZkYXRhKGhkZXYsIE5VTEwpOwotCWtmcmVlKHdhY29tKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvd2Fjb21fd2FjLmMgYi9kcml2ZXJzL2hpZC93YWNvbV93YWMuYwppbmRleCAxZWFlMTNjLi4xY2I3OTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC93YWNvbV93YWMuYworKysgYi9kcml2ZXJzL2hpZC93YWNvbV93YWMuYwpAQCAtMzQsNiArMzQsMTAgQEAKICAqLwogI2RlZmluZSBXQUNPTV9DT05UQUNUX0FSRUFfU0NBTEUgMjYwNwogCitzdGF0aWMgYm9vbCB0b3VjaF9hcmJpdHJhdGlvbiA9IDE7Cittb2R1bGVfcGFyYW0odG91Y2hfYXJiaXRyYXRpb24sIGJvb2wsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyh0b3VjaF9hcmJpdHJhdGlvbiwgIiBvbiAoWSkgb2ZmIChOKSIpOworCiBzdGF0aWMgdm9pZCB3YWNvbV9yZXBvcnRfbnVtYmVyZWRfYnV0dG9ucyhzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsCiAJCQkJaW50IGJ1dHRvbl9jb3VudCwgaW50IG1hc2spOwogCkBAIC00OCwyNSArNTIsMzQgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIHNob3J0IGJhdGNhcF9pNFs4XSA9IHsgMSwgMTUsIDMwLCA0NSwgNjAsIDcwLCA4NSwgMTAwIH07CiAKK3N0YXRpYyB2b2lkIF9fd2Fjb21fbm90aWZ5X2JhdHRlcnkoc3RydWN0IHdhY29tX2JhdHRlcnkgKmJhdHRlcnksCisJCQkJICAgaW50IGJhdF9jYXBhY2l0eSwgYm9vbCBiYXRfY2hhcmdpbmcsCisJCQkJICAgYm9vbCBiYXRfY29ubmVjdGVkLCBib29sIHBzX2Nvbm5lY3RlZCkKK3sKKwlib29sIGNoYW5nZWQgPSBiYXR0ZXJ5LT5iYXR0ZXJ5X2NhcGFjaXR5ICE9IGJhdF9jYXBhY2l0eSAgfHwKKwkJICAgICAgIGJhdHRlcnktPmJhdF9jaGFyZ2luZyAgICAgIT0gYmF0X2NoYXJnaW5nICB8fAorCQkgICAgICAgYmF0dGVyeS0+YmF0X2Nvbm5lY3RlZCAgICAhPSBiYXRfY29ubmVjdGVkIHx8CisJCSAgICAgICBiYXR0ZXJ5LT5wc19jb25uZWN0ZWQgICAgICE9IHBzX2Nvbm5lY3RlZDsKKworCWlmIChjaGFuZ2VkKSB7CisJCWJhdHRlcnktPmJhdHRlcnlfY2FwYWNpdHkgPSBiYXRfY2FwYWNpdHk7CisJCWJhdHRlcnktPmJhdF9jaGFyZ2luZyA9IGJhdF9jaGFyZ2luZzsKKwkJYmF0dGVyeS0+YmF0X2Nvbm5lY3RlZCA9IGJhdF9jb25uZWN0ZWQ7CisJCWJhdHRlcnktPnBzX2Nvbm5lY3RlZCA9IHBzX2Nvbm5lY3RlZDsKKworCQlpZiAoYmF0dGVyeS0+YmF0dGVyeSkKKwkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGJhdHRlcnktPmJhdHRlcnkpOworCX0KK30KKwogc3RhdGljIHZvaWQgd2Fjb21fbm90aWZ5X2JhdHRlcnkoc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjLAogCWludCBiYXRfY2FwYWNpdHksIGJvb2wgYmF0X2NoYXJnaW5nLCBib29sIGJhdF9jb25uZWN0ZWQsCiAJYm9vbCBwc19jb25uZWN0ZWQpCiB7CiAJc3RydWN0IHdhY29tICp3YWNvbSA9IGNvbnRhaW5lcl9vZih3YWNvbV93YWMsIHN0cnVjdCB3YWNvbSwgd2Fjb21fd2FjKTsKLQlib29sIGNoYW5nZWQgPSB3YWNvbV93YWMtPmJhdHRlcnlfY2FwYWNpdHkgIT0gYmF0X2NhcGFjaXR5ICB8fAotCQkgICAgICAgd2Fjb21fd2FjLT5iYXRfY2hhcmdpbmcgICAgICE9IGJhdF9jaGFyZ2luZyAgfHwKLQkJICAgICAgIHdhY29tX3dhYy0+YmF0X2Nvbm5lY3RlZCAgICAhPSBiYXRfY29ubmVjdGVkIHx8Ci0JCSAgICAgICB3YWNvbV93YWMtPnBzX2Nvbm5lY3RlZCAgICAgIT0gcHNfY29ubmVjdGVkOwogCi0JaWYgKGNoYW5nZWQpIHsKLQkJd2Fjb21fd2FjLT5iYXR0ZXJ5X2NhcGFjaXR5ID0gYmF0X2NhcGFjaXR5OwotCQl3YWNvbV93YWMtPmJhdF9jaGFyZ2luZyA9IGJhdF9jaGFyZ2luZzsKLQkJd2Fjb21fd2FjLT5iYXRfY29ubmVjdGVkID0gYmF0X2Nvbm5lY3RlZDsKLQkJd2Fjb21fd2FjLT5wc19jb25uZWN0ZWQgPSBwc19jb25uZWN0ZWQ7Ci0KLQkJaWYgKHdhY29tLT5iYXR0ZXJ5KQotCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQod2Fjb20tPmJhdHRlcnkpOwotCX0KKwlfX3dhY29tX25vdGlmeV9iYXR0ZXJ5KCZ3YWNvbS0+YmF0dGVyeSwgYmF0X2NhcGFjaXR5LCBiYXRfY2hhcmdpbmcsCisJCQkgICAgICAgYmF0X2Nvbm5lY3RlZCwgcHNfY29ubmVjdGVkKTsKIH0KIAogc3RhdGljIGludCB3YWNvbV9wZW5wYXJ0bmVyX2lycShzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSkKQEAgLTc1MSwyMiArNzY0LDM3IEBACiBzdGF0aWMgaW50IHdhY29tX3JlbW90ZV9pcnEoc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjLCBzaXplX3QgbGVuKQogewogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB3YWNvbV93YWMtPmRhdGE7Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB3YWNvbV93YWMtPnBhZF9pbnB1dDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKIAlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gY29udGFpbmVyX29mKHdhY29tX3dhYywgc3RydWN0IHdhY29tLCB3YWNvbV93YWMpOwotCXN0cnVjdCB3YWNvbV9mZWF0dXJlcyAqZmVhdHVyZXMgPSAmd2Fjb21fd2FjLT5mZWF0dXJlczsKKwlzdHJ1Y3Qgd2Fjb21fcmVtb3RlICpyZW1vdGUgPSB3YWNvbS0+cmVtb3RlOwogCWludCBiYXRfY2hhcmdpbmcsIGJhdF9wZXJjZW50LCB0b3VjaF9yaW5nX21vZGU7CiAJX191MzIgc2VyaWFsOwotCWludCBpOworCWludCBpLCBpbmRleCA9IC0xOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoZGF0YVswXSAhPSBXQUNPTV9SRVBPUlRfUkVNT1RFKSB7Ci0JCWRldl9kYmcoaW5wdXQtPmRldi5wYXJlbnQsCi0JCQkiJXM6IHJlY2VpdmVkIHVua25vd24gcmVwb3J0ICMlZCIsIF9fZnVuY19fLCBkYXRhWzBdKTsKKwkJaGlkX2RiZyh3YWNvbS0+aGRldiwgIiVzOiByZWNlaXZlZCB1bmtub3duIHJlcG9ydCAjJWQiLAorCQkJX19mdW5jX18sIGRhdGFbMF0pOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlzZXJpYWwgPSBkYXRhWzNdICsgKGRhdGFbNF0gPDwgOCkgKyAoZGF0YVs1XSA8PCAxNik7CiAJd2Fjb21fd2FjLT5pZFswXSA9IFBBRF9ERVZJQ0VfSUQ7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmVtb3RlLT5yZW1vdGVfbG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IFdBQ09NX01BWF9SRU1PVEVTOyBpKyspIHsKKwkJaWYgKHJlbW90ZS0+cmVtb3Rlc1tpXS5zZXJpYWwgPT0gc2VyaWFsKSB7CisJCQlpbmRleCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpbmRleCA8IDAgfHwgIXJlbW90ZS0+cmVtb3Rlc1tpbmRleF0ucmVnaXN0ZXJlZCkKKwkJZ290byBvdXQ7CisKKwlpbnB1dCA9IHJlbW90ZS0+cmVtb3Rlc1tpbmRleF0uaW5wdXQ7CisKIAlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fMCwgKGRhdGFbOV0gJiAweDAxKSk7CiAJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgQlROXzEsIChkYXRhWzldICYgMHgwMikpOwogCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl8yLCAoZGF0YVs5XSAmIDB4MDQpKTsKQEAgLTgwMyw3MyArODMxLDY5IEBACiAKIAlpbnB1dF9ldmVudChpbnB1dCwgRVZfTVNDLCBNU0NfU0VSSUFMLCBzZXJpYWwpOwogCisJaW5wdXRfc3luYyhpbnB1dCk7CisKIAkvKldoaWNoIG1vZGUgc2VsZWN0IChMRUQgbGlnaHQpIGlzIGN1cnJlbnRseSBvbj8qLwogCXRvdWNoX3JpbmdfbW9kZSA9IChkYXRhWzExXSAmIDB4QzApID4+IDY7CiAKIAlmb3IgKGkgPSAwOyBpIDwgV0FDT01fTUFYX1JFTU9URVM7IGkrKykgewotCQlpZiAod2Fjb21fd2FjLT5zZXJpYWxbaV0gPT0gc2VyaWFsKQotCQkJd2Fjb20tPmxlZC5zZWxlY3RbaV0gPSB0b3VjaF9yaW5nX21vZGU7CisJCWlmIChyZW1vdGUtPnJlbW90ZXNbaV0uc2VyaWFsID09IHNlcmlhbCkKKwkJCXdhY29tLT5sZWQuZ3JvdXBzW2ldLnNlbGVjdCA9IHRvdWNoX3JpbmdfbW9kZTsKIAl9CiAKLQlpZiAoIXdhY29tLT5iYXR0ZXJ5ICYmCi0JICAgICEoZmVhdHVyZXMtPnF1aXJrcyAmIFdBQ09NX1FVSVJLX0JBVFRFUlkpKSB7Ci0JCWZlYXR1cmVzLT5xdWlya3MgfD0gV0FDT01fUVVJUktfQkFUVEVSWTsKLQkJSU5JVF9XT1JLKCZ3YWNvbS0+d29yaywgd2Fjb21fYmF0dGVyeV93b3JrKTsKLQkJd2Fjb21fc2NoZWR1bGVfd29yayh3YWNvbV93YWMpOwotCX0KKwlfX3dhY29tX25vdGlmeV9iYXR0ZXJ5KCZyZW1vdGUtPnJlbW90ZXNbaW5kZXhdLmJhdHRlcnksIGJhdF9wZXJjZW50LAorCQkJCWJhdF9jaGFyZ2luZywgMSwgYmF0X2NoYXJnaW5nKTsKIAotCXdhY29tX25vdGlmeV9iYXR0ZXJ5KHdhY29tX3dhYywgYmF0X3BlcmNlbnQsIGJhdF9jaGFyZ2luZywgMSwKLQkJCSAgICAgYmF0X2NoYXJnaW5nKTsKLQotCXJldHVybiAxOworb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlbW90ZS0+cmVtb3RlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3YWNvbV9yZW1vdGVfc3RhdHVzX2lycShzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMsIHNpemVfdCBsZW4pCitzdGF0aWMgdm9pZCB3YWNvbV9yZW1vdGVfc3RhdHVzX2lycShzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMsIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IHdhY29tICp3YWNvbSA9IGNvbnRhaW5lcl9vZih3YWNvbV93YWMsIHN0cnVjdCB3YWNvbSwgd2Fjb21fd2FjKTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gd2Fjb21fd2FjLT5kYXRhOwotCWludCBpOworCXN0cnVjdCB3YWNvbV9yZW1vdGUgKnJlbW90ZSA9IHdhY29tLT5yZW1vdGU7CisJc3RydWN0IHdhY29tX3JlbW90ZV9kYXRhIHJlbW90ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIHJldDsKIAogCWlmIChkYXRhWzBdICE9IFdBQ09NX1JFUE9SVF9ERVZJQ0VfTElTVCkKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKKworCW1lbXNldCgmcmVtb3RlX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3Qgd2Fjb21fcmVtb3RlX2RhdGEpKTsKIAogCWZvciAoaSA9IDA7IGkgPCBXQUNPTV9NQVhfUkVNT1RFUzsgaSsrKSB7CiAJCWludCBqID0gaSAqIDY7CiAJCWludCBzZXJpYWwgPSAoZGF0YVtqKzZdIDw8IDE2KSArIChkYXRhW2orNV0gPDwgOCkgKyBkYXRhW2orNF07CiAJCWJvb2wgY29ubmVjdGVkID0gZGF0YVtqKzJdOwogCi0JCWlmIChjb25uZWN0ZWQpIHsKLQkJCWludCBrOwotCi0JCQlpZiAod2Fjb21fd2FjLT5zZXJpYWxbaV0gPT0gc2VyaWFsKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAod2Fjb21fd2FjLT5zZXJpYWxbaV0pIHsKLQkJCQl3YWNvbV9yZW1vdGVfZGVzdHJveV9hdHRyX2dyb3VwKHdhY29tLAotCQkJCQkJCXdhY29tX3dhYy0+c2VyaWFsW2ldKTsKLQkJCX0KLQotCQkJLyogQSByZW1vdGUgY2FuIHBhaXIgbW9yZSB0aGFuIG9uY2Ugd2l0aCBhbiBFS1IsCi0JCQkgKiBjaGVjayB0byBtYWtlIHN1cmUgdGhpcyBzZXJpYWwgaXNuJ3QgYWxyZWFkeSBwYWlyZWQuCi0JCQkgKi8KLQkJCWZvciAoayA9IDA7IGsgPCBXQUNPTV9NQVhfUkVNT1RFUzsgaysrKSB7Ci0JCQkJaWYgKHdhY29tX3dhYy0+c2VyaWFsW2tdID09IHNlcmlhbCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChrIDwgV0FDT01fTUFYX1JFTU9URVMpIHsKLQkJCQl3YWNvbV93YWMtPnNlcmlhbFtpXSA9IHNlcmlhbDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXdhY29tX3JlbW90ZV9jcmVhdGVfYXR0cl9ncm91cCh3YWNvbSwgc2VyaWFsLCBpKTsKLQotCQl9IGVsc2UgaWYgKHdhY29tX3dhYy0+c2VyaWFsW2ldKSB7Ci0JCQl3YWNvbV9yZW1vdGVfZGVzdHJveV9hdHRyX2dyb3VwKHdhY29tLAotCQkJCQkJCXdhY29tX3dhYy0+c2VyaWFsW2ldKTsKLQkJfQorCQlyZW1vdGVfZGF0YS5yZW1vdGVbaV0uc2VyaWFsID0gc2VyaWFsOworCQlyZW1vdGVfZGF0YS5yZW1vdGVbaV0uY29ubmVjdGVkID0gY29ubmVjdGVkOwogCX0KIAotCXJldHVybiAwOworCXNwaW5fbG9ja19pcnFzYXZlKCZyZW1vdGUtPnJlbW90ZV9sb2NrLCBmbGFncyk7CisKKwlyZXQgPSBrZmlmb19pbigmcmVtb3RlLT5yZW1vdGVfZmlmbywgJnJlbW90ZV9kYXRhLCBzaXplb2YocmVtb3RlX2RhdGEpKTsKKwlpZiAocmV0ICE9IHNpemVvZihyZW1vdGVfZGF0YSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVtb3RlLT5yZW1vdGVfbG9jaywgZmxhZ3MpOworCQloaWRfZXJyKHdhY29tLT5oZGV2LCAiQ2FuJ3QgcXVldWUgUmVtb3RlIHN0YXR1cyBldmVudC5cbiIpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmVtb3RlLT5yZW1vdGVfbG9jaywgZmxhZ3MpOworCisJd2Fjb21fc2NoZWR1bGVfd29yayh3YWNvbV93YWMsIFdBQ09NX1dPUktFUl9SRU1PVEUpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcmVwb3J0X3RvdWNoX2V2ZW50cyhzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSkKK3sKKwlyZXR1cm4gKHRvdWNoX2FyYml0cmF0aW9uID8gIXdhY29tLT5zaGFyZWQtPnN0eWx1c19pbl9wcm94aW1pdHkgOiAxKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGRlbGF5X3Blbl9ldmVudHMoc3RydWN0IHdhY29tX3dhYyAqd2Fjb20pCit7CisJcmV0dXJuICh3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duICYmIHRvdWNoX2FyYml0cmF0aW9uKTsKIH0KIAogc3RhdGljIGludCB3YWNvbV9pbnR1b3NfZ2VuZXJhbChzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSkKQEAgLTg4NSw3ICs5MDksNyBAQAogCQlkYXRhWzBdICE9IFdBQ09NX1JFUE9SVF9JTlRVT1NfUEVOKQogCQlyZXR1cm4gMDsKIAotCWlmICh3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duKQorCWlmIChkZWxheV9wZW5fZXZlbnRzKHdhY29tKSkKIAkJcmV0dXJuIDE7CiAKIAkvKiBkb24ndCByZXBvcnQgZXZlbnRzIGlmIHdlIGRvbid0IGtub3cgdGhlIHRvb2wgSUQgKi8KQEAgLTExNDUsNyArMTE2OSw3IEBACiAKIAlpZiAodG91Y2hfbWF4ID09IDEpCiAJCXJldHVybiB0ZXN0X2JpdChCVE5fVE9VQ0gsIGlucHV0LT5rZXkpICYmCi0JCSAgICAgICAhd2Fjb20tPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eTsKKwkJCXJlcG9ydF90b3VjaF9ldmVudHMod2Fjb20pOwogCiAJZm9yIChpID0gMDsgaSA8IGlucHV0LT5tdC0+bnVtX3Nsb3RzOyBpKyspIHsKIAkJc3RydWN0IGlucHV0X210X3Nsb3QgKnBzID0gJmlucHV0LT5tdC0+c2xvdHNbaV07CkBAIC0xMTg2LDcgKzEyMTAsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGNvbnRhY3RzX3RvX3NlbmQ7IGkrKykgewogCQlpbnQgb2Zmc2V0ID0gKGJ5dGVfcGVyX3BhY2tldCAqIGkpICsgMTsKLQkJYm9vbCB0b3VjaCA9IChkYXRhW29mZnNldF0gJiAweDEpICYmICF3YWNvbS0+c2hhcmVkLT5zdHlsdXNfaW5fcHJveGltaXR5OworCQlib29sIHRvdWNoID0gKGRhdGFbb2Zmc2V0XSAmIDB4MSkgJiYgcmVwb3J0X3RvdWNoX2V2ZW50cyh3YWNvbSk7CiAJCWludCBzbG90ID0gaW5wdXRfbXRfZ2V0X3Nsb3RfYnlfa2V5KGlucHV0LCBkYXRhW29mZnNldCArIDFdKTsKIAogCQlpZiAoc2xvdCA8IDApCkBAIC0xMjUwLDcgKzEyNzQsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGNvbnRhY3RzX3RvX3NlbmQ7IGkrKykgewogCQlpbnQgb2Zmc2V0ID0gKFdBQ09NX0JZVEVTX1BFUl9NVF9QQUNLRVQgKyB4X29mZnNldCkgKiBpICsgMzsKLQkJYm9vbCB0b3VjaCA9IChkYXRhW29mZnNldF0gJiAweDEpICYmICF3YWNvbS0+c2hhcmVkLT5zdHlsdXNfaW5fcHJveGltaXR5OworCQlib29sIHRvdWNoID0gKGRhdGFbb2Zmc2V0XSAmIDB4MSkgJiYgcmVwb3J0X3RvdWNoX2V2ZW50cyh3YWNvbSk7CiAJCWludCBpZCA9IGdldF91bmFsaWduZWRfbGUxNigmZGF0YVtvZmZzZXQgKyAxXSk7CiAJCWludCBzbG90ID0gaW5wdXRfbXRfZ2V0X3Nsb3RfYnlfa2V5KGlucHV0LCBpZCk7CiAKQEAgLTEyODQsNyArMTMwOCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAJCWludCBwID0gZGF0YVsxXSAmICgxIDw8IGkpOwotCQlib29sIHRvdWNoID0gcCAmJiAhd2Fjb20tPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eTsKKwkJYm9vbCB0b3VjaCA9IHAgJiYgcmVwb3J0X3RvdWNoX2V2ZW50cyh3YWNvbSk7CiAKIAkJaW5wdXRfbXRfc2xvdChpbnB1dCwgaSk7CiAJCWlucHV0X210X3JlcG9ydF9zbG90X3N0YXRlKGlucHV0LCBNVF9UT09MX0ZJTkdFUiwgdG91Y2gpOwpAQCAtMTMwOCw3ICsxMzMyLDcgQEAKIHsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gd2Fjb20tPmRhdGE7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB3YWNvbS0+dG91Y2hfaW5wdXQ7Ci0JYm9vbCBwcm94ID0gIXdhY29tLT5zaGFyZWQtPnN0eWx1c19pbl9wcm94aW1pdHk7CisJYm9vbCBwcm94ID0gcmVwb3J0X3RvdWNoX2V2ZW50cyh3YWNvbSk7CiAJaW50IHggPSAwLCB5ID0gMDsKIAogCWlmICh3YWNvbS0+ZmVhdHVyZXMudG91Y2hfbWF4ID4gMSB8fCBsZW4gPiBXQUNPTV9QS0dMRU5fVFBDMkZHKQpAQCAtMTM1Myw4ICsxMzc3LDEwIEBACiAJLyoga2VlcCBwZW4gc3RhdGUgZm9yIHRvdWNoIGV2ZW50cyAqLwogCXdhY29tLT5zaGFyZWQtPnN0eWx1c19pbl9wcm94aW1pdHkgPSBwcm94OwogCi0JLyogc2VuZCBwZW4gZXZlbnRzIG9ubHkgd2hlbiB0b3VjaCBpcyB1cCBvciBmb3JjZWQgb3V0ICovCi0JaWYgKCF3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duKSB7CisJLyogc2VuZCBwZW4gZXZlbnRzIG9ubHkgd2hlbiB0b3VjaCBpcyB1cCBvciBmb3JjZWQgb3V0CisJICogb3IgdG91Y2ggYXJiaXRyYXRpb24gaXMgb2ZmCisJICovCisJaWYgKCFkZWxheV9wZW5fZXZlbnRzKHdhY29tKSkgewogCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fU1RZTFVTLCBkYXRhWzFdICYgMHgwMik7CiAJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIEJUTl9TVFlMVVMyLCBkYXRhWzFdICYgMHgxMCk7CiAJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19YLCBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZkYXRhWzJdKSk7CkBAIC0xNDk2LDggKzE1MjIsMTAgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JLyogc2VuZCBwZW4gZXZlbnRzIG9ubHkgd2hlbiB0b3VjaCBpcyB1cCBvciBmb3JjZWQgb3V0ICovCi0JaWYgKCF1c2FnZS0+dHlwZSB8fCB3YWNvbV93YWMtPnNoYXJlZC0+dG91Y2hfZG93bikKKwkvKiBzZW5kIHBlbiBldmVudHMgb25seSB3aGVuIHRvdWNoIGlzIHVwIG9yIGZvcmNlZCBvdXQKKwkgKiBvciB0b3VjaCBhcmJpdHJhdGlvbiBpcyBvZmYKKwkgKi8KKwlpZiAoIXVzYWdlLT50eXBlIHx8IGRlbGF5X3Blbl9ldmVudHMod2Fjb21fd2FjKSkKIAkJcmV0dXJuIDA7CiAKIAlpbnB1dF9ldmVudChpbnB1dCwgdXNhZ2UtPnR5cGUsIHVzYWdlLT5jb2RlLCB2YWx1ZSk7CkBAIC0xNTI3LDggKzE1NTUsNyBAQAogCS8qIGtlZXAgcGVuIHN0YXRlIGZvciB0b3VjaCBldmVudHMgKi8KIAl3YWNvbV93YWMtPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eSA9IHByb3g7CiAKLQkvKiBzZW5kIHBlbiBldmVudHMgb25seSB3aGVuIHRvdWNoIGlzIHVwIG9yIGZvcmNlZCBvdXQgKi8KLQlpZiAoIXdhY29tX3dhYy0+c2hhcmVkLT50b3VjaF9kb3duKSB7CisJaWYgKCFkZWxheV9wZW5fZXZlbnRzKHdhY29tX3dhYykpIHsKIAkJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgQlROX1RPVUNILAogCQkJCXdhY29tX3dhYy0+aGlkX2RhdGEudGlwc3dpdGNoKTsKIAkJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgd2Fjb21fd2FjLT50b29sWzBdLCBwcm94KTsKQEAgLTE1NDQsMTMgKzE1NzEsMTEgQEAKIHsKIAlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOwogCXN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYyA9ICZ3YWNvbS0+d2Fjb21fd2FjOwotCXN0cnVjdCB3YWNvbV9mZWF0dXJlcyAqZmVhdHVyZXMgPSAmd2Fjb21fd2FjLT5mZWF0dXJlczsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHdhY29tX3dhYy0+dG91Y2hfaW5wdXQ7CiAJdW5zaWduZWQgdG91Y2hfbWF4ID0gd2Fjb21fd2FjLT5mZWF0dXJlcy50b3VjaF9tYXg7CiAKIAlzd2l0Y2ggKHVzYWdlLT5oaWQpIHsKIAljYXNlIEhJRF9HRF9YOgotCQlmZWF0dXJlcy0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKIAkJaWYgKHRvdWNoX21heCA9PSAxKQogCQkJd2Fjb21fbWFwX3VzYWdlKGlucHV0LCB1c2FnZSwgZmllbGQsIEVWX0FCUywgQUJTX1gsIDQpOwogCQllbHNlCkBAIC0xNTU4LDcgKzE1ODMsNiBAQAogCQkJCQlBQlNfTVRfUE9TSVRJT05fWCwgNCk7CiAJCWJyZWFrOwogCWNhc2UgSElEX0dEX1k6Ci0JCWZlYXR1cmVzLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwogCQlpZiAodG91Y2hfbWF4ID09IDEpCiAJCQl3YWNvbV9tYXBfdXNhZ2UoaW5wdXQsIHVzYWdlLCBmaWVsZCwgRVZfQUJTLCBBQlNfWSwgNCk7CiAJCWVsc2UKQEAgLTE1NjcsMjIgKzE1OTEsMTEgQEAKIAkJYnJlYWs7CiAJY2FzZSBISURfREdfV0lEVEg6CiAJY2FzZSBISURfREdfSEVJR0hUOgotCQlmZWF0dXJlcy0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKIAkJd2Fjb21fbWFwX3VzYWdlKGlucHV0LCB1c2FnZSwgZmllbGQsIEVWX0FCUywgQUJTX01UX1RPVUNIX01BSk9SLCAwKTsKIAkJd2Fjb21fbWFwX3VzYWdlKGlucHV0LCB1c2FnZSwgZmllbGQsIEVWX0FCUywgQUJTX01UX1RPVUNIX01JTk9SLCAwKTsKIAkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19NVF9PUklFTlRBVElPTiwgMCwgMSwgMCwgMCk7CiAJCWJyZWFrOwotCWNhc2UgSElEX0RHX0NPTlRBQ1RJRDoKLQkJZmVhdHVyZXMtPmxhc3Rfc2xvdF9maWVsZCA9IHVzYWdlLT5oaWQ7Ci0JCWJyZWFrOwotCWNhc2UgSElEX0RHX0lOUkFOR0U6Ci0JCWZlYXR1cmVzLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwotCQlicmVhazsKLQljYXNlIEhJRF9ER19JTlZFUlQ6Ci0JCWZlYXR1cmVzLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwotCQlicmVhazsKIAljYXNlIEhJRF9ER19USVBTV0lUQ0g6Ci0JCWZlYXR1cmVzLT5sYXN0X3Nsb3RfZmllbGQgPSB1c2FnZS0+aGlkOwogCQl3YWNvbV9tYXBfdXNhZ2UoaW5wdXQsIHVzYWdlLCBmaWVsZCwgRVZfS0VZLCBCVE5fVE9VQ0gsIDApOwogCQlicmVhazsKIAljYXNlIEhJRF9ER19DT05UQUNUQ09VTlQ6CkBAIC0xNTk5LDcgKzE2MTIsNyBAQAogCXN0cnVjdCBoaWRfZGF0YSAqaGlkX2RhdGEgPSAmd2Fjb21fd2FjLT5oaWRfZGF0YTsKIAlib29sIG10ID0gd2Fjb21fd2FjLT5mZWF0dXJlcy50b3VjaF9tYXggPiAxOwogCWJvb2wgcHJveCA9IGhpZF9kYXRhLT50aXBzd2l0Y2ggJiYKLQkJICAgICF3YWNvbV93YWMtPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eTsKKwkJICAgIHJlcG9ydF90b3VjaF9ldmVudHMod2Fjb21fd2FjKTsKIAogCXdhY29tX3dhYy0+aGlkX2RhdGEubnVtX3JlY2VpdmVkKys7CiAJaWYgKHdhY29tX3dhYy0+aGlkX2RhdGEubnVtX3JlY2VpdmVkID4gd2Fjb21fd2FjLT5oaWRfZGF0YS5udW1fZXhwZWN0ZWQpCkBAIC0xNjYwLDcgKzE2NzMsNyBAQAogCiAKIAlpZiAodXNhZ2UtPnVzYWdlX2luZGV4ICsgMSA9PSBmaWVsZC0+cmVwb3J0X2NvdW50KSB7Ci0JCWlmICh1c2FnZS0+aGlkID09IHdhY29tX3dhYy0+ZmVhdHVyZXMubGFzdF9zbG90X2ZpZWxkKQorCQlpZiAodXNhZ2UtPmhpZCA9PSB3YWNvbV93YWMtPmhpZF9kYXRhLmxhc3Rfc2xvdF9maWVsZCkKIAkJCXdhY29tX3dhY19maW5nZXJfc2xvdCh3YWNvbV93YWMsIHdhY29tX3dhYy0+dG91Y2hfaW5wdXQpOwogCX0KIApAQCAtMTY3MywzMSArMTY4NiwzNSBAQAogCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CiAJc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjID0gJndhY29tLT53YWNvbV93YWM7CiAJc3RydWN0IGhpZF9kYXRhKiBoaWRfZGF0YSA9ICZ3YWNvbV93YWMtPmhpZF9kYXRhOworCWludCBpOwogCi0JaWYgKGhpZF9kYXRhLT5jY19yZXBvcnQgIT0gMCAmJgotCSAgICBoaWRfZGF0YS0+Y2NfcmVwb3J0ICE9IHJlcG9ydC0+aWQpIHsKLQkJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHJlcG9ydC0+bWF4ZmllbGQ7IGkrKykgeworCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCA9IHJlcG9ydC0+ZmllbGRbaV07CisJCWludCBqOwogCi0JCWhpZF9kYXRhLT5jY19yZXBvcnQgPSByZXBvcnQtPmlkOwotCQloaWRfZGF0YS0+Y2NfaW5kZXggPSAtMTsKLQkJaGlkX2RhdGEtPmNjX3ZhbHVlX2luZGV4ID0gLTE7CisJCWZvciAoaiA9IDA7IGogPCBmaWVsZC0+bWF4dXNhZ2U7IGorKykgeworCQkJc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UgPSAmZmllbGQtPnVzYWdlW2pdOwogCi0JCWZvciAoaSA9IDA7IGkgPCByZXBvcnQtPm1heGZpZWxkOyBpKyspIHsKLQkJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkID0gcmVwb3J0LT5maWVsZFtpXTsKLQkJCWludCBqOwotCi0JCQlmb3IgKGogPSAwOyBqIDwgZmllbGQtPm1heHVzYWdlOyBqKyspIHsKLQkJCQlpZiAoZmllbGQtPnVzYWdlW2pdLmhpZCA9PSBISURfREdfQ09OVEFDVENPVU5UKSB7Ci0JCQkJCWhpZF9kYXRhLT5jY19pbmRleCA9IGk7Ci0JCQkJCWhpZF9kYXRhLT5jY192YWx1ZV9pbmRleCA9IGo7Ci0KLQkJCQkJLyogYnJlYWsgKi8KLQkJCQkJaSA9IHJlcG9ydC0+bWF4ZmllbGQ7Ci0JCQkJCWogPSBmaWVsZC0+bWF4dXNhZ2U7Ci0JCQkJfQorCQkJc3dpdGNoICh1c2FnZS0+aGlkKSB7CisJCQljYXNlIEhJRF9HRF9YOgorCQkJY2FzZSBISURfR0RfWToKKwkJCWNhc2UgSElEX0RHX1dJRFRIOgorCQkJY2FzZSBISURfREdfSEVJR0hUOgorCQkJY2FzZSBISURfREdfQ09OVEFDVElEOgorCQkJY2FzZSBISURfREdfSU5SQU5HRToKKwkJCWNhc2UgSElEX0RHX0lOVkVSVDoKKwkJCWNhc2UgSElEX0RHX1RJUFNXSVRDSDoKKwkJCQloaWRfZGF0YS0+bGFzdF9zbG90X2ZpZWxkID0gdXNhZ2UtPmhpZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgSElEX0RHX0NPTlRBQ1RDT1VOVDoKKwkJCQloaWRfZGF0YS0+Y2NfcmVwb3J0ID0gcmVwb3J0LT5pZDsKKwkJCQloaWRfZGF0YS0+Y2NfaW5kZXggPSBpOworCQkJCWhpZF9kYXRhLT5jY192YWx1ZV9pbmRleCA9IGo7CisJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAl9CisKIAlpZiAoaGlkX2RhdGEtPmNjX3JlcG9ydCAhPSAwICYmCiAJICAgIGhpZF9kYXRhLT5jY19pbmRleCA+PSAwKSB7CiAJCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkID0gcmVwb3J0LT5maWVsZFtoaWRfZGF0YS0+Y2NfaW5kZXhdOwpAQCAtMTc0MCwxMCArMTc1NywxMCBAQAogewogCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CiAJc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjID0gJndhY29tLT53YWNvbV93YWM7CisJc3RydWN0IHdhY29tX2ZlYXR1cmVzICpmZWF0dXJlcyA9ICZ3YWNvbV93YWMtPmZlYXR1cmVzOwogCiAJLyogY3VycmVudGx5LCBvbmx5IGRpcmVjdCBkZXZpY2VzIGhhdmUgcHJvcGVyIGhpZCByZXBvcnQgZGVzY3JpcHRvcnMgKi8KLQlfX3NldF9iaXQoSU5QVVRfUFJPUF9ESVJFQ1QsIHdhY29tX3dhYy0+cGVuX2lucHV0LT5wcm9wYml0KTsKLQlfX3NldF9iaXQoSU5QVVRfUFJPUF9ESVJFQ1QsIHdhY29tX3dhYy0+dG91Y2hfaW5wdXQtPnByb3BiaXQpOworCWZlYXR1cmVzLT5kZXZpY2VfdHlwZSB8PSBXQUNPTV9ERVZJQ0VUWVBFX0RJUkVDVDsKIAogCWlmIChXQUNPTV9QRU5fRklFTEQoZmllbGQpKQogCQlyZXR1cm4gd2Fjb21fd2FjX3Blbl91c2FnZV9tYXBwaW5nKGhkZXYsIGZpZWxkLCB1c2FnZSk7CkBAIC0xODI1LDE1ICsxODQyLDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKIAkJaW50IG9mZnNldCA9IChkYXRhWzFdICYgMHg4MCkgPyAoOCAqIGkpIDogKDkgKiBpKTsKLQkJYm9vbCB0b3VjaCA9IGRhdGFbb2Zmc2V0ICsgM10gJiAweDgwOwotCi0JCS8qCi0JCSAqIFRvdWNoIGV2ZW50cyBuZWVkIHRvIGJlIGRpc2FibGVkIHdoaWxlIHN0eWx1cyBpcwotCQkgKiBpbiBwcm94aW1pdHkgYmVjYXVzZSB1c2VyJ3MgaGFuZCBpcyByZXN0aW5nIG9uIHRvdWNocGFkCi0JCSAqIGFuZCBzZW5kaW5nIHVud2FudGVkIGV2ZW50cy4gIFVzZXIgZXhwZWN0cyB0YWJsZXQgYnV0dG9ucwotCQkgKiB0byBjb250aW51ZSB3b3JraW5nIHRob3VnaC4KLQkJICovCi0JCXRvdWNoID0gdG91Y2ggJiYgIXdhY29tLT5zaGFyZWQtPnN0eWx1c19pbl9wcm94aW1pdHk7CisJCWJvb2wgdG91Y2ggPSByZXBvcnRfdG91Y2hfZXZlbnRzKHdhY29tKQorCQkJICAgJiYgKGRhdGFbb2Zmc2V0ICsgM10gJiAweDgwKTsKIAogCQlpbnB1dF9tdF9zbG90KGlucHV0LCBpKTsKIAkJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoaW5wdXQsIE1UX1RPT0xfRklOR0VSLCB0b3VjaCk7CkBAIC0xODcwLDcgKzE4ODAsNyBAQAogCWlmIChzbG90IDwgMCkKIAkJcmV0dXJuOwogCi0JdG91Y2ggPSB0b3VjaCAmJiAhd2Fjb20tPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eTsKKwl0b3VjaCA9IHRvdWNoICYmIHJlcG9ydF90b3VjaF9ldmVudHMod2Fjb20pOwogCiAJaW5wdXRfbXRfc2xvdChpbnB1dCwgc2xvdCk7CiAJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoaW5wdXQsIE1UX1RPT0xfRklOR0VSLCB0b3VjaCk7CkBAIC0xOTQyLDcgKzE5NTIsNyBAQAogCX0KIAogCS8qIG9ubHkgdXBkYXRlIHRvdWNoIGlmIHdlIGFjdHVhbGx5IGhhdmUgYSB0b3VjaHBhZCBhbmQgdG91Y2ggZGF0YSBjaGFuZ2VkICovCi0JaWYgKHdhY29tLT50b3VjaF9yZWdpc3RlcmVkICYmIHRvdWNoX2NoYW5nZWQpIHsKKwlpZiAod2Fjb20tPnRvdWNoX2lucHV0ICYmIHRvdWNoX2NoYW5nZWQpIHsKIAkJaW5wdXRfbXRfc3luY19mcmFtZSh3YWNvbS0+dG91Y2hfaW5wdXQpOwogCQl3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duID0gd2Fjb21fd2FjX2Zpbmdlcl9jb3VudF90b3VjaGVzKHdhY29tKTsKIAl9CkBAIC0xOTgzLDcgKzE5OTMsNyBAQAogCX0KIAogCXdhY29tLT5zaGFyZWQtPnN0eWx1c19pbl9wcm94aW1pdHkgPSBwcm94OwotCWlmICh3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duKQorCWlmIChkZWxheV9wZW5fZXZlbnRzKHdhY29tKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAocHJveCkgewpAQCAtMjA3Nyw3ICsyMDg3LDcgQEAKIAogCWZvciAoaWQgPSAwOyBpZCA8IHdhY29tLT5mZWF0dXJlcy50b3VjaF9tYXg7IGlkKyspIHsKIAkJdmFsaWQgPSAhIShwcmVmaXggJiBCSVQoaWQpKSAmJgotCQkJIXdhY29tLT5zaGFyZWQtPnN0eWx1c19pbl9wcm94aW1pdHk7CisJCQlyZXBvcnRfdG91Y2hfZXZlbnRzKHdhY29tKTsKIAogCQlpbnB1dF9tdF9zbG90KGlucHV0LCBpZCk7CiAJCWlucHV0X210X3JlcG9ydF9zbG90X3N0YXRlKGlucHV0LCBNVF9UT09MX0ZJTkdFUiwgdmFsaWQpOwpAQCAtMjA5OSw4ICsyMTA5LDcgQEAKIAlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fUklHSFQsIHByZWZpeCAmIDB4ODApOwogCiAJLyoga2VlcCB0b3VjaCBzdGF0ZSBmb3IgcGVuIGV2ZW50ICovCi0Jd2Fjb20tPnNoYXJlZC0+dG91Y2hfZG93biA9ICEhcHJlZml4ICYmCi0JCQkJICAgICF3YWNvbS0+c2hhcmVkLT5zdHlsdXNfaW5fcHJveGltaXR5OworCXdhY29tLT5zaGFyZWQtPnRvdWNoX2Rvd24gPSAhIXByZWZpeCAmJiByZXBvcnRfdG91Y2hfZXZlbnRzKHdhY29tKTsKIAogCXJldHVybiAxOwogfQpAQCAtMjE0OSwxNiArMjE1OCwxNSBAQAogCQljaGFyZ2luZyA9ICEhKGRhdGFbNV0gJiAweDgwKTsKIAkJaWYgKHdhY29tLT5waWQgIT0gcGlkKSB7CiAJCQl3YWNvbS0+cGlkID0gcGlkOwotCQkJd2Fjb21fc2NoZWR1bGVfd29yayh3YWNvbSk7CisJCQl3YWNvbV9zY2hlZHVsZV93b3JrKHdhY29tLCBXQUNPTV9XT1JLRVJfV0lSRUxFU1MpOwogCQl9CiAKLQkJaWYgKHdhY29tLT5zaGFyZWQtPnR5cGUpCi0JCQl3YWNvbV9ub3RpZnlfYmF0dGVyeSh3YWNvbSwgYmF0dGVyeSwgY2hhcmdpbmcsIDEsIDApOworCQl3YWNvbV9ub3RpZnlfYmF0dGVyeSh3YWNvbSwgYmF0dGVyeSwgY2hhcmdpbmcsIDEsIDApOwogCiAJfSBlbHNlIGlmICh3YWNvbS0+cGlkICE9IDApIHsKIAkJLyogZGlzY29ubmVjdGVkIHdoaWxlIHByZXZpb3VzbHkgY29ubmVjdGVkICovCiAJCXdhY29tLT5waWQgPSAwOwotCQl3YWNvbV9zY2hlZHVsZV93b3JrKHdhY29tKTsKKwkJd2Fjb21fc2NoZWR1bGVfd29yayh3YWNvbSwgV0FDT01fV09SS0VSX1dJUkVMRVNTKTsKIAkJd2Fjb21fbm90aWZ5X2JhdHRlcnkod2Fjb20sIDAsIDAsIDAsIDApOwogCX0KIApAQCAtMjE5MCwxOCArMjE5OCwxNiBAQAogCQl3YWNvbV9ub3RpZnlfYmF0dGVyeSh3YWNvbV93YWMsIGJhdHRlcnksIGNoYXJnaW5nLAogCQkJCSAgICAgYmF0dGVyeSB8fCBjaGFyZ2luZywgMSk7CiAKLQkJaWYgKCF3YWNvbS0+YmF0dGVyeSAmJgorCQlpZiAoIXdhY29tLT5iYXR0ZXJ5LmJhdHRlcnkgJiYKIAkJICAgICEoZmVhdHVyZXMtPnF1aXJrcyAmIFdBQ09NX1FVSVJLX0JBVFRFUlkpKSB7CiAJCQlmZWF0dXJlcy0+cXVpcmtzIHw9IFdBQ09NX1FVSVJLX0JBVFRFUlk7Ci0JCQlJTklUX1dPUksoJndhY29tLT53b3JrLCB3YWNvbV9iYXR0ZXJ5X3dvcmspOwotCQkJd2Fjb21fc2NoZWR1bGVfd29yayh3YWNvbV93YWMpOworCQkJd2Fjb21fc2NoZWR1bGVfd29yayh3YWNvbV93YWMsIFdBQ09NX1dPUktFUl9CQVRURVJZKTsKIAkJfQogCX0KIAllbHNlIGlmICgoZmVhdHVyZXMtPnF1aXJrcyAmIFdBQ09NX1FVSVJLX0JBVFRFUlkpICYmCi0JCSB3YWNvbS0+YmF0dGVyeSkgeworCQkgd2Fjb20tPmJhdHRlcnkuYmF0dGVyeSkgewogCQlmZWF0dXJlcy0+cXVpcmtzICY9IH5XQUNPTV9RVUlSS19CQVRURVJZOwotCQlJTklUX1dPUksoJndhY29tLT53b3JrLCB3YWNvbV9iYXR0ZXJ5X3dvcmspOwotCQl3YWNvbV9zY2hlZHVsZV93b3JrKHdhY29tX3dhYyk7CisJCXdhY29tX3NjaGVkdWxlX3dvcmsod2Fjb21fd2FjLCBXQUNPTV9XT1JLRVJfQkFUVEVSWSk7CiAJCXdhY29tX25vdGlmeV9iYXR0ZXJ5KHdhY29tX3dhYywgMCwgMCwgMCwgMCk7CiAJfQogCXJldHVybiAwOwpAQCAtMjMxMiw4ICsyMzE4LDkgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFJFTU9URToKKwkJc3luYyA9IGZhbHNlOwogCQlpZiAod2Fjb21fd2FjLT5kYXRhWzBdID09IFdBQ09NX1JFUE9SVF9ERVZJQ0VfTElTVCkKLQkJCXN5bmMgPSB3YWNvbV9yZW1vdGVfc3RhdHVzX2lycSh3YWNvbV93YWMsIGxlbik7CisJCQl3YWNvbV9yZW1vdGVfc3RhdHVzX2lycSh3YWNvbV93YWMsIGxlbik7CiAJCWVsc2UKIAkJCXN5bmMgPSB3YWNvbV9yZW1vdGVfaXJxKHdhY29tX3dhYywgbGVuKTsKIAkJYnJlYWs7CkBAIC0yNDUxLDYgKzI0NTgsMzMgQEAKIAlpZiAoZmVhdHVyZXMtPnR5cGUgPT0gUkVNT1RFKQogCQlmZWF0dXJlcy0+ZGV2aWNlX3R5cGUgPSBXQUNPTV9ERVZJQ0VUWVBFX1BBRDsKIAorCXN3aXRjaCAoZmVhdHVyZXMtPnR5cGUpIHsKKwljYXNlIFBMOgorCWNhc2UgRFRVOgorCWNhc2UgRFRVUzoKKwljYXNlIERUVVNYOgorCWNhc2UgV0FDT01fMjFVWDI6CisJY2FzZSBXQUNPTV8yMkhEOgorCWNhc2UgRFRLOgorCWNhc2UgV0FDT01fMjRIRDoKKwljYXNlIFdBQ09NXzI3UUhEOgorCWNhc2UgQ0lOVElRX0hZQlJJRDoKKwljYXNlIENJTlRJUV9DT01QQU5JT05fMjoKKwljYXNlIENJTlRJUToKKwljYXNlIFdBQ09NX0JFRToKKwljYXNlIFdBQ09NXzEzSEQ6CisJY2FzZSBXQUNPTV8yNEhEVDoKKwljYXNlIFdBQ09NXzI3UUhEVDoKKwljYXNlIFRBQkxFVFBDOgorCWNhc2UgVEFCTEVUUENFOgorCWNhc2UgVEFCTEVUUEMyRkc6CisJY2FzZSBNVFNDUkVFTjoKKwljYXNlIE1UVFBDOgorCWNhc2UgTVRUUENfQjoKKwkJZmVhdHVyZXMtPmRldmljZV90eXBlIHw9IFdBQ09NX0RFVklDRVRZUEVfRElSRUNUOworCQlicmVhazsKKwl9CisKIAlpZiAod2Fjb20tPmhkZXYtPmJ1cyA9PSBCVVNfQkxVRVRPT1RIKQogCQlmZWF0dXJlcy0+cXVpcmtzIHw9IFdBQ09NX1FVSVJLX0JBVFRFUlk7CiAKQEAgLTI0NjksNiArMjUwMyw5IEBACiAJCQlmZWF0dXJlcy0+cXVpcmtzIHw9IFdBQ09NX1FVSVJLX0JBVFRFUlk7CiAJCX0KIAl9CisKKwlpZiAoZmVhdHVyZXMtPnR5cGUgPT0gUkVNT1RFKQorCQlmZWF0dXJlcy0+ZGV2aWNlX3R5cGUgfD0gV0FDT01fREVWSUNFVFlQRV9XTF9NT05JVE9SOwogfQogCiBpbnQgd2Fjb21fc2V0dXBfcGVuX2lucHV0X2NhcGFiaWxpdGllcyhzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsCkBAIC0yNDgxLDYgKzI1MTgsMTEgQEAKIAlpZiAoIShmZWF0dXJlcy0+ZGV2aWNlX3R5cGUgJiBXQUNPTV9ERVZJQ0VUWVBFX1BFTikpCiAJCXJldHVybiAtRU5PREVWOwogCisJaWYgKGZlYXR1cmVzLT5kZXZpY2VfdHlwZSAmIFdBQ09NX0RFVklDRVRZUEVfRElSRUNUKQorCQlfX3NldF9iaXQoSU5QVVRfUFJPUF9ESVJFQ1QsIGlucHV0X2Rldi0+cHJvcGJpdCk7CisJZWxzZQorCQlfX3NldF9iaXQoSU5QVVRfUFJPUF9QT0lOVEVSLCBpbnB1dF9kZXYtPnByb3BiaXQpOworCiAJaWYgKGZlYXR1cmVzLT50eXBlID09IEhJRF9HRU5FUklDKQogCQkvKiBzZXR1cCBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgKi8KIAkJcmV0dXJuIDA7CkBAIC0yNDk5LDcgKzI1NDEsNiBAQAogCWlucHV0X2Fic19zZXRfcmVzKGlucHV0X2RldiwgQUJTX1gsIGZlYXR1cmVzLT54X3Jlc29sdXRpb24pOwogCWlucHV0X2Fic19zZXRfcmVzKGlucHV0X2RldiwgQUJTX1ksIGZlYXR1cmVzLT55X3Jlc29sdXRpb24pOwogCi0KIAlzd2l0Y2ggKGZlYXR1cmVzLT50eXBlKSB7CiAJY2FzZSBHUkFQSElSRV9CVDoKIAkJX19jbGVhcl9iaXQoQUJTX01JU0MsIGlucHV0X2Rldi0+YWJzYml0KTsKQEAgLTI1MjMsOCArMjU2NCw2IEBACiAJCV9fc2V0X2JpdChCVE5fVE9PTF9NT1VTRSwgaW5wdXRfZGV2LT5rZXliaXQpOwogCQlfX3NldF9iaXQoQlROX1NUWUxVUywgaW5wdXRfZGV2LT5rZXliaXQpOwogCQlfX3NldF9iaXQoQlROX1NUWUxVUzIsIGlucHV0X2Rldi0+a2V5Yml0KTsKLQotCQlfX3NldF9iaXQoSU5QVVRfUFJPUF9QT0lOVEVSLCBpbnB1dF9kZXYtPnByb3BiaXQpOwogCQlicmVhazsKIAogCWNhc2UgV0FDT01fMjdRSEQ6CkBAIC0yNTM5LDcgKzI1NzgsNiBAQAogCWNhc2UgQ0lOVElRX0NPTVBBTklPTl8yOgogCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19aLCAtOTAwLCA4OTksIDAsIDApOwogCQlpbnB1dF9hYnNfc2V0X3JlcyhpbnB1dF9kZXYsIEFCU19aLCAyODcpOwotCQlfX3NldF9iaXQoSU5QVVRfUFJPUF9ESVJFQ1QsIGlucHV0X2Rldi0+cHJvcGJpdCk7CiAJCXdhY29tX3NldHVwX2NpbnRpcSh3YWNvbV93YWMpOwogCQlicmVhazsKIApAQCAtMjU1NSw4ICsyNTkzLDYgQEAKIAkJLyogZmFsbCB0aHJvdWdoICovCiAKIAljYXNlIElOVFVPUzoKLQkJX19zZXRfYml0KElOUFVUX1BST1BfUE9JTlRFUiwgaW5wdXRfZGV2LT5wcm9wYml0KTsKLQogCQl3YWNvbV9zZXR1cF9pbnR1b3Mod2Fjb21fd2FjKTsKIAkJYnJlYWs7CiAKQEAgLTI1NjYsOCArMjYwMiw2IEBACiAJY2FzZSBJTlRVT1NQTDoKIAljYXNlIElOVFVPUzVTOgogCWNhc2UgSU5UVU9TUFM6Ci0JCV9fc2V0X2JpdChJTlBVVF9QUk9QX1BPSU5URVIsIGlucHV0X2Rldi0+cHJvcGJpdCk7Ci0KIAkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfRElTVEFOQ0UsIDAsCiAJCQkJICAgICAgZmVhdHVyZXMtPmRpc3RhbmNlX21heCwKIAkJCQkgICAgICBmZWF0dXJlcy0+ZGlzdGFuY2VfZnV6eiwgMCk7CkBAIC0yNTk3LDggKzI2MzEsNiBAQAogCQlfX3NldF9iaXQoQlROX1RPT0xfUlVCQkVSLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAJCV9fc2V0X2JpdChCVE5fU1RZTFVTLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAJCV9fc2V0X2JpdChCVE5fU1RZTFVTMiwgaW5wdXRfZGV2LT5rZXliaXQpOwotCi0JCV9fc2V0X2JpdChJTlBVVF9QUk9QX0RJUkVDVCwgaW5wdXRfZGV2LT5wcm9wYml0KTsKIAkJYnJlYWs7CiAKIAljYXNlIFBUVToKQEAgLTI2MDksMTYgKzI2NDEsMTIgQEAKIAkJX19zZXRfYml0KEJUTl9UT09MX1BFTiwgaW5wdXRfZGV2LT5rZXliaXQpOwogCQlfX3NldF9iaXQoQlROX1RPT0xfUlVCQkVSLCBpbnB1dF9kZXYtPmtleWJpdCk7CiAJCV9fc2V0X2JpdChCVE5fU1RZTFVTLCBpbnB1dF9kZXYtPmtleWJpdCk7Ci0KLQkJX19zZXRfYml0KElOUFVUX1BST1BfUE9JTlRFUiwgaW5wdXRfZGV2LT5wcm9wYml0KTsKIAkJYnJlYWs7CiAKIAljYXNlIElOVFVPU0hUOgogCWNhc2UgQkFNQk9PX1BUOgogCWNhc2UgQkFNQk9PX1BFTjoKIAljYXNlIElOVFVPU0hUMjoKLQkJX19zZXRfYml0KElOUFVUX1BST1BfUE9JTlRFUiwgaW5wdXRfZGV2LT5wcm9wYml0KTsKLQogCQlpZiAoZmVhdHVyZXMtPnR5cGUgPT0gSU5UVU9TSFQyKSB7CiAJCQl3YWNvbV9zZXR1cF9iYXNpY19wcm9fcGVuKHdhY29tX3dhYyk7CiAJCX0gZWxzZSB7CkBAIC0yNjQ5LDYgKzI2NzcsMTEgQEAKIAlpZiAoIShmZWF0dXJlcy0+ZGV2aWNlX3R5cGUgJiBXQUNPTV9ERVZJQ0VUWVBFX1RPVUNIKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoZmVhdHVyZXMtPmRldmljZV90eXBlICYgV0FDT01fREVWSUNFVFlQRV9ESVJFQ1QpCisJCV9fc2V0X2JpdChJTlBVVF9QUk9QX0RJUkVDVCwgaW5wdXRfZGV2LT5wcm9wYml0KTsKKwllbHNlCisJCV9fc2V0X2JpdChJTlBVVF9QUk9QX1BPSU5URVIsIGlucHV0X2Rldi0+cHJvcGJpdCk7CisKIAlpZiAoZmVhdHVyZXMtPnR5cGUgPT0gSElEX0dFTkVSSUMpCiAJCS8qIHNldHVwIGhhcyBhbHJlYWR5IGJlZW4gZG9uZSAqLwogCQlyZXR1cm4gMDsKQEAgLTI2ODMsOCArMjcxNiw2IEBACiAJY2FzZSBJTlRVT1NQTDoKIAljYXNlIElOVFVPUzVTOgogCWNhc2UgSU5UVU9TUFM6Ci0JCV9fc2V0X2JpdChJTlBVVF9QUk9QX1BPSU5URVIsIGlucHV0X2Rldi0+cHJvcGJpdCk7Ci0KIAkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfTVRfVE9VQ0hfTUFKT1IsIDAsIGZlYXR1cmVzLT54X21heCwgMCwgMCk7CiAJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX01UX1RPVUNIX01JTk9SLCAwLCBmZWF0dXJlcy0+eV9tYXgsIDAsIDApOwogCQlpbnB1dF9tdF9pbml0X3Nsb3RzKGlucHV0X2RldiwgZmVhdHVyZXMtPnRvdWNoX21heCwgSU5QVVRfTVRfUE9JTlRFUik7CkBAIC0yNzA3LDcgKzI3MzgsNiBAQAogCiAJY2FzZSBUQUJMRVRQQzoKIAljYXNlIFRBQkxFVFBDRToKLQkJX19zZXRfYml0KElOUFVUX1BST1BfRElSRUNULCBpbnB1dF9kZXYtPnByb3BiaXQpOwogCQlicmVhazsKIAogCWNhc2UgSU5UVU9TSFQ6CkBAIC0yNzUyLDExICsyNzgyLDEwNSBAQAogCQlfX3NldF9iaXQoQlROX0JBU0UgKyAoaS0xNiksIGlucHV0X2Rldi0+a2V5Yml0KTsKIH0KIAorc3RhdGljIHZvaWQgd2Fjb21fMjRoZF91cGRhdGVfbGVkcyhzdHJ1Y3Qgd2Fjb20gKndhY29tLCBpbnQgbWFzaywgaW50IGdyb3VwKQoreworCXN0cnVjdCB3YWNvbV9sZWQgKmxlZDsKKwlpbnQgaTsKKwlib29sIHVwZGF0ZWQgPSBmYWxzZTsKKworCS8qCisJICogMjRIRCBoYXMgTEVEIGdyb3VwIDEgdG8gdGhlIGxlZnQgYW5kIExFRCBncm91cCAwIHRvIHRoZSByaWdodC4KKwkgKiBTbyBncm91cCAwIG1hdGNoZXMgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBidXR0b25zIGFuZCB0aHVzIHRoZSBtYXNrCisJICogbmVlZHMgdG8gYmUgc2hpZnRlZC4KKwkgKi8KKwlpZiAoZ3JvdXAgPT0gMCkKKwkJbWFzayA+Pj0gODsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJbGVkID0gd2Fjb21fbGVkX2ZpbmQod2Fjb20sIGdyb3VwLCBpKTsKKwkJaWYgKCFsZWQpIHsKKwkJCWhpZF9lcnIod2Fjb20tPmhkZXYsICJjYW4ndCBmaW5kIExFRCAlZCBpbiBncm91cCAlZFxuIiwKKwkJCQlpLCBncm91cCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXVwZGF0ZWQgJiYgbWFzayAmIEJJVChpKSkgeworCQkJbGVkLT5oZWxkID0gdHJ1ZTsKKwkJCWxlZF90cmlnZ2VyX2V2ZW50KCZsZWQtPnRyaWdnZXIsIExFRF9GVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWxlZC0+aGVsZCA9IGZhbHNlOworCQl9CisJfQorfQorCitzdGF0aWMgYm9vbCB3YWNvbV9pc19sZWRfdG9nZ2xlZChzdHJ1Y3Qgd2Fjb20gKndhY29tLCBpbnQgYnV0dG9uX2NvdW50LAorCQkJCSBpbnQgbWFzaywgaW50IGdyb3VwKQoreworCWludCBidXR0b25fcGVyX2dyb3VwOworCisJLyoKKwkgKiAyMVVYMiBoYXMgTEVEIGdyb3VwIDEgdG8gdGhlIGxlZnQgYW5kIExFRCBncm91cCAwCisJICogdG8gdGhlIHJpZ2h0LiBXZSBuZWVkIHRvIHJldmVyc2UgdGhlIGdyb3VwIHRvIG1hdGNoIHRoaXMKKwkgKiBoaXN0b3JpY2FsIGJlaGF2aW9yLgorCSAqLworCWlmICh3YWNvbS0+d2Fjb21fd2FjLmZlYXR1cmVzLnR5cGUgPT0gV0FDT01fMjFVWDIpCisJCWdyb3VwID0gMSAtIGdyb3VwOworCisJYnV0dG9uX3Blcl9ncm91cCA9IGJ1dHRvbl9jb3VudC93YWNvbS0+bGVkLmNvdW50OworCisJcmV0dXJuIG1hc2sgJiAoMSA8PCAoZ3JvdXAgKiBidXR0b25fcGVyX2dyb3VwKSk7Cit9CisKK3N0YXRpYyB2b2lkIHdhY29tX3VwZGF0ZV9sZWQoc3RydWN0IHdhY29tICp3YWNvbSwgaW50IGJ1dHRvbl9jb3VudCwgaW50IG1hc2ssCisJCQkgICAgIGludCBncm91cCkKK3sKKwlzdHJ1Y3Qgd2Fjb21fbGVkICpsZWQsICpuZXh0X2xlZDsKKwlpbnQgY3VyOworCWJvb2wgcHJlc3NlZDsKKworCWlmICh3YWNvbS0+d2Fjb21fd2FjLmZlYXR1cmVzLnR5cGUgPT0gV0FDT01fMjRIRCkKKwkJcmV0dXJuIHdhY29tXzI0aGRfdXBkYXRlX2xlZHMod2Fjb20sIG1hc2ssIGdyb3VwKTsKKworCXByZXNzZWQgPSB3YWNvbV9pc19sZWRfdG9nZ2xlZCh3YWNvbSwgYnV0dG9uX2NvdW50LCBtYXNrLCBncm91cCk7CisJY3VyID0gd2Fjb20tPmxlZC5ncm91cHNbZ3JvdXBdLnNlbGVjdDsKKworCWxlZCA9IHdhY29tX2xlZF9maW5kKHdhY29tLCBncm91cCwgY3VyKTsKKwlpZiAoIWxlZCkgeworCQloaWRfZXJyKHdhY29tLT5oZGV2LCAiY2FuJ3QgZmluZCBjdXJyZW50IExFRCAlZCBpbiBncm91cCAlZFxuIiwKKwkJCWN1ciwgZ3JvdXApOworCQlyZXR1cm47CisJfQorCisJaWYgKCFwcmVzc2VkKSB7CisJCWxlZC0+aGVsZCA9IGZhbHNlOworCQlyZXR1cm47CisJfQorCisJaWYgKGxlZC0+aGVsZCAmJiBwcmVzc2VkKQorCQlyZXR1cm47CisKKwluZXh0X2xlZCA9IHdhY29tX2xlZF9uZXh0KHdhY29tLCBsZWQpOworCWlmICghbmV4dF9sZWQpIHsKKwkJaGlkX2Vycih3YWNvbS0+aGRldiwgImNhbid0IGZpbmQgbmV4dCBMRUQgaW4gZ3JvdXAgJWRcbiIsCisJCQlncm91cCk7CisJCXJldHVybjsKKwl9CisJaWYgKG5leHRfbGVkID09IGxlZCkKKwkJcmV0dXJuOworCisJbmV4dF9sZWQtPmhlbGQgPSB0cnVlOworCWxlZF90cmlnZ2VyX2V2ZW50KCZuZXh0X2xlZC0+dHJpZ2dlciwKKwkJCSAgd2Fjb21fbGVkc19icmlnaHRuZXNzX2dldChuZXh0X2xlZCkpOworfQorCiBzdGF0aWMgdm9pZCB3YWNvbV9yZXBvcnRfbnVtYmVyZWRfYnV0dG9ucyhzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsCiAJCQkJaW50IGJ1dHRvbl9jb3VudCwgaW50IG1hc2spCiB7CisJc3RydWN0IHdhY29tICp3YWNvbSA9IGlucHV0X2dldF9kcnZkYXRhKGlucHV0X2Rldik7CiAJaW50IGk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgd2Fjb20tPmxlZC5jb3VudDsgaSsrKQorCQl3YWNvbV91cGRhdGVfbGVkKHdhY29tLCAgYnV0dG9uX2NvdW50LCBtYXNrLCBpKTsKKwogCWZvciAoaSA9IDA7IGkgPCBidXR0b25fY291bnQgJiYgaSA8IDEwOyBpKyspCiAJCWlucHV0X3JlcG9ydF9rZXkoaW5wdXRfZGV2LCBCVE5fMCArIGksIG1hc2sgJiAoMSA8PCBpKSk7CiAJZm9yIChpID0gMTA7IGkgPCBidXR0b25fY291bnQgJiYgaSA8IDE2OyBpKyspCkBAIC0yNzczLDYgKzI4OTcsOSBAQAogCWlmICghKGZlYXR1cmVzLT5kZXZpY2VfdHlwZSAmIFdBQ09NX0RFVklDRVRZUEVfUEFEKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoZmVhdHVyZXMtPnR5cGUgPT0gUkVNT1RFICYmIGlucHV0X2RldiA9PSB3YWNvbV93YWMtPnBhZF9pbnB1dCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVF9NQVNLKEVWX0tFWSkgfCBCSVRfTUFTSyhFVl9BQlMpOwogCiAJLyoga2VwdCBmb3IgbWFraW5nIGxlZ2FjeSB4Zjg2LWlucHV0LXdhY29tIHdvcmtpbmcgd2l0aCB0aGUgd2hlZWxzICovCkBAIC0zNDAzLDcgKzM1MzAsNyBAQAogCSAgV0FDT01fRFRVX09GRlNFVCwgV0FDT01fRFRVX09GRlNFVCB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzX0hJRF9BTllfSUQgPQotCXsgIldhY29tIEhJRCIsIC50eXBlID0gSElEX0dFTkVSSUMgfTsKKwl7ICJXYWNvbSBISUQiLCAudHlwZSA9IEhJRF9HRU5FUklDLCAub1ZpZCA9IEhJRF9BTllfSUQsIC5vUGlkID0gSElEX0FOWV9JRCB9OwogCiAjZGVmaW5lIFVTQl9ERVZJQ0VfV0FDT00ocHJvZCkJCQkJCQlcCiAJSElEX0RFVklDRShCVVNfVVNCLCBISURfR1JPVVBfV0FDT00sIFVTQl9WRU5ET1JfSURfV0FDT00sIHByb2QpLFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3dhY29tX3dhYy5oIGIvZHJpdmVycy9oaWQvd2Fjb21fd2FjLmgKaW5kZXggNTNkMTY1My4uMzI0YzQwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvd2Fjb21fd2FjLmgKKysrIGIvZHJpdmVycy9oaWQvd2Fjb21fd2FjLmgKQEAgLTgyLDYgKzgyLDcgQEAKICNkZWZpbmUgV0FDT01fREVWSUNFVFlQRV9UT1VDSCAgICAgICAgICAweDAwMDIKICNkZWZpbmUgV0FDT01fREVWSUNFVFlQRV9QQUQgICAgICAgICAgICAweDAwMDQKICNkZWZpbmUgV0FDT01fREVWSUNFVFlQRV9XTF9NT05JVE9SICAgICAweDAwMDgKKyNkZWZpbmUgV0FDT01fREVWSUNFVFlQRV9ESVJFQ1QgICAgICAgICAweDAwMTAKIAogI2RlZmluZSBXQUNPTV9WRU5ET1JERUZJTkVEX1BFTgkJMHhmZjBkMDAwMQogI2RlZmluZSBXQUNPTV9HOV9QQUdFCQkJMHhmZjA5MDAwMApAQCAtMTg1LDcgKzE4Niw2IEBACiAJaW50IHBrdGxlbjsKIAlib29sIGNoZWNrX2Zvcl9oaWRfdHlwZTsKIAlpbnQgaGlkX3R5cGU7Ci0JaW50IGxhc3Rfc2xvdF9maWVsZDsKIH07CiAKIHN0cnVjdCB3YWNvbV9zaGFyZWQgewpAQCAtMjE0LDM1ICsyMTQsMzUgQEAKIAlpbnQgY2NfcmVwb3J0OwogCWludCBjY19pbmRleDsKIAlpbnQgY2NfdmFsdWVfaW5kZXg7CisJaW50IGxhc3Rfc2xvdF9maWVsZDsKIAlpbnQgbnVtX2V4cGVjdGVkOwogCWludCBudW1fcmVjZWl2ZWQ7CiB9OwogCitzdHJ1Y3Qgd2Fjb21fcmVtb3RlX2RhdGEgeworCXN0cnVjdCB7CisJCXUzMiBzZXJpYWw7CisJCWJvb2wgY29ubmVjdGVkOworCX0gcmVtb3RlW1dBQ09NX01BWF9SRU1PVEVTXTsKK307CisKIHN0cnVjdCB3YWNvbV93YWMgeworCWNoYXIgbmFtZVtXQUNPTV9OQU1FX01BWF07CiAJY2hhciBwZW5fbmFtZVtXQUNPTV9OQU1FX01BWF07CiAJY2hhciB0b3VjaF9uYW1lW1dBQ09NX05BTUVfTUFYXTsKIAljaGFyIHBhZF9uYW1lW1dBQ09NX05BTUVfTUFYXTsKLQljaGFyIGJhdF9uYW1lW1dBQ09NX05BTUVfTUFYXTsKLQljaGFyIGFjX25hbWVbV0FDT01fTkFNRV9NQVhdOwogCXVuc2lnbmVkIGNoYXIgZGF0YVtXQUNPTV9QS0dMRU5fTUFYXTsKIAlpbnQgdG9vbFsyXTsKIAlpbnQgaWRbMl07Ci0JX191MzIgc2VyaWFsWzVdOworCV9fdTMyIHNlcmlhbFsyXTsKIAlib29sIHJlcG9ydGluZ19kYXRhOwogCXN0cnVjdCB3YWNvbV9mZWF0dXJlcyBmZWF0dXJlczsKIAlzdHJ1Y3Qgd2Fjb21fc2hhcmVkICpzaGFyZWQ7CiAJc3RydWN0IGlucHV0X2RldiAqcGVuX2lucHV0OwogCXN0cnVjdCBpbnB1dF9kZXYgKnRvdWNoX2lucHV0OwogCXN0cnVjdCBpbnB1dF9kZXYgKnBhZF9pbnB1dDsKLQlib29sIHBlbl9yZWdpc3RlcmVkOwotCWJvb2wgdG91Y2hfcmVnaXN0ZXJlZDsKLQlib29sIHBhZF9yZWdpc3RlcmVkOwogCWludCBwaWQ7Ci0JaW50IGJhdHRlcnlfY2FwYWNpdHk7CiAJaW50IG51bV9jb250YWN0c19sZWZ0OwotCWludCBiYXRfY2hhcmdpbmc7Ci0JaW50IGJhdF9jb25uZWN0ZWQ7Ci0JaW50IHBzX2Nvbm5lY3RlZDsKIAl1OCBidF9mZWF0dXJlczsKIAl1OCBidF9oaWdoX3NwZWVkOwogCWludCBtb2RlX3JlcG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvY2hhbm5lbC5jIGIvZHJpdmVycy9odi9jaGFubmVsLmMKaW5kZXggNTZkZDI2MS4uMTZmOTFjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9odi9jaGFubmVsLmMKKysrIGIvZHJpdmVycy9odi9jaGFubmVsLmMKQEAgLTQzLDcgKzQzLDEyIEBACiB7CiAJc3RydWN0IGh2X21vbml0b3JfcGFnZSAqbW9uaXRvcnBhZ2U7CiAKLQlpZiAoY2hhbm5lbC0+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+ZGV2LCBIV01PTl9JRF9GT1JNQVQsIGlkKTsKLQllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJmh3ZGV2LT5kZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZnJlZTsKLQotCXJldHVybiAmaHdkZXYtPmRldjsKLQotZnJlZToKLQlrZnJlZShod2Rldik7Ci1pZGFfcmVtb3ZlOgotCWlkYV9zaW1wbGVfcmVtb3ZlKCZod21vbl9pZGEsIGlkKTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOworCXJldHVybiBfX2h3bW9uX2RldmljZV9yZWdpc3RlcihkZXYsIG5hbWUsIGRydmRhdGEsIE5VTEwsIGdyb3Vwcyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMpOwogCiAvKioKKyAqIGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gLSByZWdpc3RlciB3LyBod21vbgorICogQGRldjogdGhlIHBhcmVudCBkZXZpY2UKKyAqIEBuYW1lOiBod21vbiBuYW1lIGF0dHJpYnV0ZQorICogQGRydmRhdGE6IGRyaXZlciBkYXRhIHRvIGF0dGFjaCB0byBjcmVhdGVkIGRldmljZQorICogQGluZm86IFBvaW50ZXIgdG8gaHdtb24gY2hpcCBpbmZvcm1hdGlvbgorICogQGdyb3VwcyAtIHBvaW50ZXIgdG8gbGlzdCBvZiBkcml2ZXIgc3BlY2lmaWMgYXR0cmlidXRlIGdyb3VwcworICoKKyAqIGh3bW9uX2RldmljZV91bnJlZ2lzdGVyKCkgbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIG5vCisgKiBsb25nZXIgbmVlZGVkLgorICoKKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBkZXZpY2UuCisgKi8KK3N0cnVjdCBkZXZpY2UgKgoraHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJdm9pZCAqZHJ2ZGF0YSwKKwkJCQljb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvICpjaGlwLAorCQkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCit7CisJaWYgKGNoaXAgJiYgKCFjaGlwLT5vcHMgfHwgIWNoaXAtPmluZm8pKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCXJldHVybiBfX2h3bW9uX2RldmljZV9yZWdpc3RlcihkZXYsIG5hbWUsIGRydmRhdGEsIGNoaXAsIGdyb3Vwcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKTsKKworLyoqCiAgKiBod21vbl9kZXZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciB3LyBod21vbgogICogQGRldjogdGhlIGRldmljZSB0byByZWdpc3RlcgogICoKQEAgLTIxMyw2ICs3MjMsNDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKTsKIAorLyoqCisgKiBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8gLSByZWdpc3RlciB3LyBod21vbgorICogQGRldjogdGhlIHBhcmVudCBkZXZpY2UKKyAqIEBuYW1lOiBod21vbiBuYW1lIGF0dHJpYnV0ZQorICogQGRydmRhdGE6IGRyaXZlciBkYXRhIHRvIGF0dGFjaCB0byBjcmVhdGVkIGRldmljZQorICogQGluZm86IFBvaW50ZXIgdG8gaHdtb24gY2hpcCBpbmZvcm1hdGlvbgorICogQGdyb3VwcyAtIHBvaW50ZXIgdG8gbGlzdCBvZiBkcml2ZXIgc3BlY2lmaWMgYXR0cmlidXRlIGdyb3VwcworICoKKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBkZXZpY2UuIFRoZSBuZXcgZGV2aWNlIGlzIGF1dG9tYXRpY2FsbHkKKyAqIHVucmVnaXN0ZXJlZCB3aXRoIHRoZSBwYXJlbnQgZGV2aWNlLgorICovCitzdHJ1Y3QgZGV2aWNlICoKK2Rldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICB2b2lkICpkcnZkYXRhLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyAqY2hpcCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpCit7CisJc3RydWN0IGRldmljZSAqKnB0ciwgKmh3ZGV2OworCisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcHRyID0gZGV2cmVzX2FsbG9jKGRldm1faHdtb25fcmVsZWFzZSwgc2l6ZW9mKCpwdHIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlod2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBuYW1lLCBkcnZkYXRhLCBjaGlwLAorCQkJCQkJZ3JvdXBzKTsKKwlpZiAoSVNfRVJSKGh3ZGV2KSkKKwkJZ290byBlcnJvcjsKKworCSpwdHIgPSBod2RldjsKKwlkZXZyZXNfYWRkKGRldiwgcHRyKTsKKworCXJldHVybiBod2RldjsKKworZXJyb3I6CisJZGV2cmVzX2ZyZWUocHRyKTsKKwlyZXR1cm4gaHdkZXY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8pOworCiBzdGF0aWMgaW50IGRldm1faHdtb25fbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGRldmljZSAqKmh3ZGV2ID0gcmVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pYm1wb3dlcm52LmMgYi9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYwppbmRleCA1NWI1YThmLi42ZDJlNjYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYworKysgYi9kcml2ZXJzL2h3bW9uL2libXBvd2VybnYuYwpAQCAtMTQzLDEzICsxNDMsMTEgQEAKIAkJaWYgKGNwdWlkID49IDApCiAJCQkvKgogCQkJICogVGhlIGRpZ2l0YWwgdGhlcm1hbCBzZW5zb3JzIGFyZSBhc3NvY2lhdGVkCi0JCQkgKiB3aXRoIGEgY29yZS4gTGV0J3MgcHJpbnQgb3V0IHRoZSByYW5nZSBvZgotCQkJICogY3B1IGlkcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYXJkd2FyZQotCQkJICogdGhyZWFkcyBvZiB0aGUgY29yZS4KKwkJCSAqIHdpdGggYSBjb3JlLgogCQkJICovCiAJCQluICs9IHNucHJpbnRmKHNkYXRhLT5sYWJlbCArIG4sCi0JCQkJICAgICAgc2l6ZW9mKHNkYXRhLT5sYWJlbCkgLSBuLCAiICVkLSVkIiwKLQkJCQkgICAgICBjcHVpZCwgY3B1aWQgKyB0aHJlYWRzX3Blcl9jb3JlIC0gMSk7CisJCQkJICAgICAgc2l6ZW9mKHNkYXRhLT5sYWJlbCkgLSBuLCAiICVkIiwKKwkJCQkgICAgICBjcHVpZCk7CiAJCWVsc2UKIAkJCW4gKz0gc25wcmludGYoc2RhdGEtPmxhYmVsICsgbiwKIAkJCQkgICAgICBzaXplb2Yoc2RhdGEtPmxhYmVsKSAtIG4sICIgcGh5JWQiLCBpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2lpb19od21vbi5jIGIvZHJpdmVycy9od21vbi9paW9faHdtb24uYwppbmRleCA4OTQ0OTg3Li5mNmE3NjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2lpb19od21vbi5jCisrKyBiL2RyaXZlcnMvaHdtb24vaWlvX2h3bW9uLmMKQEAgLTczLDggKzczLDExIEBACiAJCW5hbWUgPSBkZXYtPm9mX25vZGUtPm5hbWU7CiAKIAljaGFubmVscyA9IGlpb19jaGFubmVsX2dldF9hbGwoZGV2KTsKLQlpZiAoSVNfRVJSKGNoYW5uZWxzKSkKKwlpZiAoSVNfRVJSKGNoYW5uZWxzKSkgeworCQlpZiAoUFRSX0VSUihjaGFubmVscykgPT0gLUVOT0RFVikKKwkJCXJldHVybiAtRVBST0JFX0RFRkVSOwogCQlyZXR1cm4gUFRSX0VSUihjaGFubmVscyk7CisJfQogCiAJc3QgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0ID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKaW5kZXggZDAyMDNhMS4uYWQ4MmNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pdDg3LmMKKysrIGIvZHJpdmVycy9od21vbi9pdDg3LmMKQEAgLTIwMTEsMTAgKzIwMTEsMTEgQEAKIAkmc2Vuc29yX2Rldl9hdHRyX2luN19iZWVwLmRldl9hdHRyLmF0dHIsCS8qIDM5ICovCiAKIAkmc2Vuc29yX2Rldl9hdHRyX2luOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAkvKiA0MCAqLwotCSZzZW5zb3JfZGV2X2F0dHJfaW45X2lucHV0LmRldl9hdHRyLmF0dHIsCS8qIDQxICovCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjEwX2lucHV0LmRldl9hdHRyLmF0dHIsCS8qIDQxICovCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjExX2lucHV0LmRldl9hdHRyLmF0dHIsCS8qIDQxICovCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjEyX2lucHV0LmRldl9hdHRyLmF0dHIsCS8qIDQxICovCisJJnNlbnNvcl9kZXZfYXR0cl9pbjlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpdDg3X2dyb3VwX2luID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9qYzQyLmMgYi9kcml2ZXJzL2h3bW9uL2pjNDIuYwppbmRleCA5ZDVmODVmLi4xYmYyMmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2pjNDIuYworKysgYi9kcml2ZXJzL2h3bW9uL2pjNDIuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgotI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgpAQCAtMjU0LDE3MCArMjUzLDE0OCBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIHN5c2ZzIGZ1bmN0aW9ucyAqLwotCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCSBjaGFyICpidWYpCitzdGF0aWMgaW50IGpjNDJfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCXN0cnVjdCBqYzQyX2RhdGEgKmRhdGEgPSBqYzQyX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpZiAoSVNfRVJSKGRhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKLQkJICAgICAgIGpjNDJfdGVtcF9mcm9tX3JlZyhkYXRhLT50ZW1wW2F0dHItPmluZGV4XSkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXBfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKIAlzdHJ1Y3QgamM0Ml9kYXRhICpkYXRhID0gamM0Ml91cGRhdGVfZGV2aWNlKGRldik7CiAJaW50IHRlbXAsIGh5c3Q7CiAKIAlpZiAoSVNfRVJSKGRhdGEpKQogCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKIAotCXRlbXAgPSBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFthdHRyLT5pbmRleF0pOwotCWh5c3QgPSBqYzQyX2h5c3RlcmVzaXNbKGRhdGEtPmNvbmZpZyAmIEpDNDJfQ0ZHX0hZU1RfTUFTSykKLQkJCSAgICAgICA+PiBKQzQyX0NGR19IWVNUX1NISUZUXTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCAtIGh5c3QpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwkJKnZhbCA9IGpjNDJfdGVtcF9mcm9tX3JlZyhkYXRhLT50ZW1wW3RfaW5wdXRdKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX21pbjoKKwkJKnZhbCA9IGpjNDJfdGVtcF9mcm9tX3JlZyhkYXRhLT50ZW1wW3RfbWluXSk7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9tYXg6CisJCSp2YWwgPSBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFt0X21heF0pOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdDoKKwkJKnZhbCA9IGpjNDJfdGVtcF9mcm9tX3JlZyhkYXRhLT50ZW1wW3RfY3JpdF0pOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2h5c3Q6CisJCXRlbXAgPSBqYzQyX3RlbXBfZnJvbV9yZWcoZGF0YS0+dGVtcFt0X21heF0pOworCQloeXN0ID0gamM0Ml9oeXN0ZXJlc2lzWyhkYXRhLT5jb25maWcgJiBKQzQyX0NGR19IWVNUX01BU0spCisJCQkJCQk+PiBKQzQyX0NGR19IWVNUX1NISUZUXTsKKwkJKnZhbCA9IHRlbXAgLSBoeXN0OworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQl0ZW1wID0gamM0Ml90ZW1wX2Zyb21fcmVnKGRhdGEtPnRlbXBbdF9jcml0XSk7CisJCWh5c3QgPSBqYzQyX2h5c3RlcmVzaXNbKGRhdGEtPmNvbmZpZyAmIEpDNDJfQ0ZHX0hZU1RfTUFTSykKKwkJCQkJCT4+IEpDNDJfQ0ZHX0hZU1RfU0hJRlRdOworCQkqdmFsID0gdGVtcCAtIGh5c3Q7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9taW5fYWxhcm06CisJCSp2YWwgPSAoZGF0YS0+dGVtcFt0X2lucHV0XSA+PiBKQzQyX0FMQVJNX01JTl9CSVQpICYgMTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX21heF9hbGFybToKKwkJKnZhbCA9IChkYXRhLT50ZW1wW3RfaW5wdXRdID4+IEpDNDJfQUxBUk1fTUFYX0JJVCkgJiAxOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9hbGFybToKKwkJKnZhbCA9IChkYXRhLT50ZW1wW3RfaW5wdXRdID4+IEpDNDJfQUxBUk1fQ1JJVF9CSVQpICYgMTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgamM0Ml9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IGVyciwgcmV0ID0gY291bnQ7Ci0JaW50IG5yID0gYXR0ci0+aW5kZXg7Ci0JbG9uZyB2YWw7Ci0KLQlpZiAoa3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlkYXRhLT50ZW1wW25yXSA9IGpjNDJfdGVtcF90b19yZWcodmFsLCBkYXRhLT5leHRlbmRlZCk7Ci0JZXJyID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChkYXRhLT5jbGllbnQsIHRlbXBfcmVnc1tucl0sCi0JCQkJCSAgIGRhdGEtPnRlbXBbbnJdKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0ID0gZXJyOwotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBKQzQyLjQgY29tcGxpYW50IGNoaXBzIG9ubHkgc3VwcG9ydCBmb3VyIGh5c3RlcmVzaXMgdmFsdWVzLgotICogUGljayBiZXN0IGNob2ljZSBhbmQgZ28gZnJvbSB0aGVyZS4KLSAqLwotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXBfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IGpjNDJfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgdmFsKQogewogCXN0cnVjdCBqYzQyX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlsb25nIHZhbDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCWludCBkaWZmLCBoeXN0OwotCWludCBlcnI7Ci0JaW50IHJldCA9IGNvdW50OworCWludCByZXQ7CiAKLQlpZiAoa3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCXZhbCA9IGNsYW1wX3ZhbCh2YWwsIChkYXRhLT5leHRlbmRlZCA/IEpDNDJfVEVNUF9NSU5fRVhURU5ERUQgOgotCQkJICAgICAgSkM0Ml9URU1QX01JTikgLSA2MDAwLCBKQzQyX1RFTVBfTUFYKTsKLQlkaWZmID0gamM0Ml90ZW1wX2Zyb21fcmVnKGRhdGEtPnRlbXBbdF9jcml0XSkgLSB2YWw7Ci0KLQloeXN0ID0gMDsKLQlpZiAoZGlmZiA+IDApIHsKLQkJaWYgKGRpZmYgPCAyMjUwKQotCQkJaHlzdCA9IDE7CS8qIDEuNSBkZWdyZWVzIEMgKi8KLQkJZWxzZSBpZiAoZGlmZiA8IDQ1MDApCi0JCQloeXN0ID0gMjsJLyogMy4wIGRlZ3JlZXMgQyAqLwotCQllbHNlCi0JCQloeXN0ID0gMzsJLyogNi4wIGRlZ3JlZXMgQyAqLworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9taW46CisJCWRhdGEtPnRlbXBbdF9taW5dID0gamM0Ml90ZW1wX3RvX3JlZyh2YWwsIGRhdGEtPmV4dGVuZGVkKTsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIHRlbXBfcmVnc1t0X21pbl0sCisJCQkJCQkgICBkYXRhLT50ZW1wW3RfbWluXSk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9tYXg6CisJCWRhdGEtPnRlbXBbdF9tYXhdID0gamM0Ml90ZW1wX3RvX3JlZyh2YWwsIGRhdGEtPmV4dGVuZGVkKTsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfc3dhcHBlZChjbGllbnQsIHRlbXBfcmVnc1t0X21heF0sCisJCQkJCQkgICBkYXRhLT50ZW1wW3RfbWF4XSk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9jcml0OgorCQlkYXRhLT50ZW1wW3RfY3JpdF0gPSBqYzQyX3RlbXBfdG9fcmVnKHZhbCwgZGF0YS0+ZXh0ZW5kZWQpOworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwgdGVtcF9yZWdzW3RfY3JpdF0sCisJCQkJCQkgICBkYXRhLT50ZW1wW3RfY3JpdF0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQkvKgorCQkgKiBKQzQyLjQgY29tcGxpYW50IGNoaXBzIG9ubHkgc3VwcG9ydCBmb3VyIGh5c3RlcmVzaXMgdmFsdWVzLgorCQkgKiBQaWNrIGJlc3QgY2hvaWNlIGFuZCBnbyBmcm9tIHRoZXJlLgorCQkgKi8KKwkJdmFsID0gY2xhbXBfdmFsKHZhbCwgKGRhdGEtPmV4dGVuZGVkID8gSkM0Ml9URU1QX01JTl9FWFRFTkRFRAorCQkJCQkJICAgICA6IEpDNDJfVEVNUF9NSU4pIC0gNjAwMCwKKwkJCQlKQzQyX1RFTVBfTUFYKTsKKwkJZGlmZiA9IGpjNDJfdGVtcF9mcm9tX3JlZyhkYXRhLT50ZW1wW3RfY3JpdF0pIC0gdmFsOworCQloeXN0ID0gMDsKKwkJaWYgKGRpZmYgPiAwKSB7CisJCQlpZiAoZGlmZiA8IDIyNTApCisJCQkJaHlzdCA9IDE7CS8qIDEuNSBkZWdyZWVzIEMgKi8KKwkJCWVsc2UgaWYgKGRpZmYgPCA0NTAwKQorCQkJCWh5c3QgPSAyOwkvKiAzLjAgZGVncmVlcyBDICovCisJCQllbHNlCisJCQkJaHlzdCA9IDM7CS8qIDYuMCBkZWdyZWVzIEMgKi8KKwkJfQorCQlkYXRhLT5jb25maWcgPSAoZGF0YS0+Y29uZmlnICYgfkpDNDJfQ0ZHX0hZU1RfTUFTSykgfAorCQkJCShoeXN0IDw8IEpDNDJfQ0ZHX0hZU1RfU0hJRlQpOworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGRhdGEtPmNsaWVudCwKKwkJCQkJCSAgIEpDNDJfUkVHX0NPTkZJRywKKwkJCQkJCSAgIGRhdGEtPmNvbmZpZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKIAl9CiAKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JZGF0YS0+Y29uZmlnID0gKGRhdGEtPmNvbmZpZyAmIH5KQzQyX0NGR19IWVNUX01BU0spCi0JICB8IChoeXN0IDw8IEpDNDJfQ0ZHX0hZU1RfU0hJRlQpOwotCWVyciA9IGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoZGF0YS0+Y2xpZW50LCBKQzQyX1JFR19DT05GSUcsCi0JCQkJCSAgIGRhdGEtPmNvbmZpZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldCA9IGVycjsKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHVtb2RlX3QgamM0Ml9pc192aXNpYmxlKGNvbnN0IHZvaWQgKl9kYXRhLCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJICAgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQl1MTYgYml0ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgamM0Ml9kYXRhICpkYXRhID0gamM0Ml91cGRhdGVfZGV2aWNlKGRldik7Ci0JdTE2IHZhbDsKLQotCWlmIChJU19FUlIoZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKGRhdGEpOwotCi0JdmFsID0gZGF0YS0+dGVtcFt0X2lucHV0XTsKLQlpZiAoYml0ICE9IEpDNDJfQUxBUk1fQ1JJVF9CSVQgJiYgKGRhdGEtPmNvbmZpZyAmIEpDNDJfQ0ZHX0NSSVRfT05MWSkpCi0JCXZhbCA9IDA7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsICh2YWwgPj4gYml0KSAmIDEpOwotfQotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIHRfaW5wdXQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0LCBTX0lSVUdPLCBzaG93X3RlbXAsIHNldF90ZW1wLCB0X2NyaXQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW4sIFNfSVJVR08sIHNob3dfdGVtcCwgc2V0X3RlbXAsIHRfbWluKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lSVUdPLCBzaG93X3RlbXAsIHNldF90ZW1wLCB0X21heCk7Ci0KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9oeXN0LCBTX0lSVUdPLCBzaG93X3RlbXBfaHlzdCwKLQkJCSAgc2V0X3RlbXBfY3JpdF9oeXN0LCB0X2NyaXQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXhfaHlzdCwgU19JUlVHTywgc2hvd190ZW1wX2h5c3QsIE5VTEwsIHRfbWF4KTsKLQotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAotCQkJICBKQzQyX0FMQVJNX0NSSVRfQklUKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAotCQkJICBKQzQyX0FMQVJNX01JTl9CSVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCi0JCQkgIEpDNDJfQUxBUk1fTUFYX0JJVCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpqYzQyX2F0dHJpYnV0ZXNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW4uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXhfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgdW1vZGVfdCBqYzQyX2F0dHJpYnV0ZV9tb2RlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IGluZGV4KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKLQlzdHJ1Y3QgamM0Ml9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJY29uc3Qgc3RydWN0IGpjNDJfZGF0YSAqZGF0YSA9IF9kYXRhOwogCXVuc2lnbmVkIGludCBjb25maWcgPSBkYXRhLT5jb25maWc7Ci0JYm9vbCByZWFkb25seTsKKwl1bW9kZV90IG1vZGUgPSBTX0lSVUdPOwogCi0JaWYgKGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0LmRldl9hdHRyLmF0dHIpCi0JCXJlYWRvbmx5ID0gY29uZmlnICYgSkM0Ml9DRkdfVENSSVRfTE9DSzsKLQllbHNlIGlmIChhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluLmRldl9hdHRyLmF0dHIgfHwKLQkJIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0cikKLQkJcmVhZG9ubHkgPSBjb25maWcgJiBKQzQyX0NGR19FVkVOVF9MT0NLOwotCWVsc2UgaWYgKGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0X2h5c3QuZGV2X2F0dHIuYXR0cikKLQkJcmVhZG9ubHkgPSBjb25maWcgJiAoSkM0Ml9DRkdfRVZFTlRfTE9DSyB8IEpDNDJfQ0ZHX1RDUklUX0xPQ0spOwotCWVsc2UKLQkJcmVhZG9ubHkgPSB0cnVlOwotCi0JcmV0dXJuIFNfSVJVR08gfCAocmVhZG9ubHkgPyAwIDogU19JV1VTUik7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX21pbjoKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlpZiAoIShjb25maWcgJiBKQzQyX0NGR19FVkVOVF9MT0NLKSkKKwkJCW1vZGUgfD0gU19JV1VTUjsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2NyaXQ6CisJCWlmICghKGNvbmZpZyAmIEpDNDJfQ0ZHX1RDUklUX0xPQ0spKQorCQkJbW9kZSB8PSBTX0lXVVNSOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQlpZiAoIShjb25maWcgJiAoSkM0Ml9DRkdfRVZFTlRfTE9DSyB8IEpDNDJfQ0ZHX1RDUklUX0xPQ0spKSkKKwkJCW1vZGUgfD0gU19JV1VTUjsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCWNhc2UgaHdtb25fdGVtcF9tYXhfaHlzdDoKKwljYXNlIGh3bW9uX3RlbXBfbWluX2FsYXJtOgorCWNhc2UgaHdtb25fdGVtcF9tYXhfYWxhcm06CisJY2FzZSBod21vbl90ZW1wX2NyaXRfYWxhcm06CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1vZGUgPSAwOworCQlicmVhazsKKwl9CisJcmV0dXJuIG1vZGU7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGpjNDJfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gamM0Ml9hdHRyaWJ1dGVzLAotCS5pc192aXNpYmxlID0gamM0Ml9hdHRyaWJ1dGVfbW9kZSwKLX07Ci1fX0FUVFJJQlVURV9HUk9VUFMoamM0Mik7Ci0KIC8qIFJldHVybiAwIGlmIGRldGVjdGlvbiBpcyBzdWNjZXNzZnVsLCAtRU5PREVWIG90aGVyd2lzZSAqLwogc3RhdGljIGludCBqYzQyX2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCiB7CkBAIC00NTAsNiArNDI3LDM0IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKK3N0YXRpYyBjb25zdCB1MzIgamM0Ml90ZW1wX2NvbmZpZ1tdID0geworCUhXTU9OX1RfSU5QVVQgfCBIV01PTl9UX01JTiB8IEhXTU9OX1RfTUFYIHwgSFdNT05fVF9DUklUIHwKKwlIV01PTl9UX01BWF9IWVNUIHwgSFdNT05fVF9DUklUX0hZU1QgfAorCUhXTU9OX1RfTUlOX0FMQVJNIHwgSFdNT05fVF9NQVhfQUxBUk0gfCBIV01PTl9UX0NSSVRfQUxBUk0sCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gamM0Ml90ZW1wID0geworCS50eXBlID0gaHdtb25fdGVtcCwKKwkuY29uZmlnID0gamM0Ml90ZW1wX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICpqYzQyX2luZm9bXSA9IHsKKwkmamM0Ml90ZW1wLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIGpjNDJfaHdtb25fb3BzID0geworCS5pc192aXNpYmxlID0gamM0Ml9pc192aXNpYmxlLAorCS5yZWFkID0gamM0Ml9yZWFkLAorCS53cml0ZSA9IGpjNDJfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyBqYzQyX2NoaXBfaW5mbyA9IHsKKwkub3BzID0gJmpjNDJfaHdtb25fb3BzLAorCS5pbmZvID0gamM0Ml9pbmZvLAorfTsKKwogc3RhdGljIGludCBqYzQyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CkBAIC00ODIsOSArNDg3LDkgQEAKIAl9CiAJZGF0YS0+Y29uZmlnID0gY29uZmlnOwogCi0JaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsCi0JCQkJCQkJICAgZGF0YSwKLQkJCQkJCQkgICBqYzQyX2dyb3Vwcyk7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSBkYXRhLCAmamM0Ml9jaGlwX2luZm8sCisJCQkJCQkJIE5VTEwpOwogCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTc1LmMgYi9kcml2ZXJzL2h3bW9uL2xtNzUuYwppbmRleCA5MmY5ZDRiLi5lZmYzYjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtNzUuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtNzUuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGhlcm1hbC5oPgogI2luY2x1ZGUgImxtNzUuaCIKIAogCkBAIC04OCw1NiArODcsNzUgQEAKIAlyZXR1cm4gKCh0ZW1wID4+ICgxNiAtIHJlc29sdXRpb24pKSAqIDEwMDApID4+IChyZXNvbHV0aW9uIC0gOCk7CiB9CiAKLS8qIHN5c2ZzIGF0dHJpYnV0ZXMgZm9yIGh3bW9uICovCi0KLXN0YXRpYyBpbnQgbG03NV9yZWFkX3RlbXAodm9pZCAqZGV2LCBpbnQgKnRlbXApCitzdGF0aWMgaW50IGxtNzVfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCiB7CiAJc3RydWN0IGxtNzVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGludCBfdGVtcDsKLQlpbnQgZXJyOworCXVuc2lnbmVkIGludCByZWd2YWw7CisJaW50IGVyciwgcmVnOwogCi0JZXJyID0gcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFwLCBMTTc1X1JFR19URU1QLCAmX3RlbXApOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJc3dpdGNoIChhdHRyKSB7CisJCWNhc2UgaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWw6CisJCQkqdmFsID0gZGF0YS0+c2FtcGxlX3RpbWU7CisJCQlicmVhazs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXA6CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCQlyZWcgPSBMTTc1X1JFR19URU1QOworCQkJYnJlYWs7CisJCWNhc2UgaHdtb25fdGVtcF9tYXg6CisJCQlyZWcgPSBMTTc1X1JFR19NQVg7CisJCQlicmVhazsKKwkJY2FzZSBod21vbl90ZW1wX21heF9oeXN0OgorCQkJcmVnID0gTE03NV9SRUdfSFlTVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJZXJyID0gcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFwLCByZWcsICZyZWd2YWwpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CiAKLQkqdGVtcCA9IGxtNzVfcmVnX3RvX21jKF90ZW1wLCBkYXRhLT5yZXNvbHV0aW9uKTsKLQorCQkqdmFsID0gbG03NV9yZWdfdG9fbWMocmVndmFsLCBkYXRhLT5yZXNvbHV0aW9uKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCi0JCQkgY2hhciAqYnVmKQorc3RhdGljIGludCBsbTc1X3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJICAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHRlbXApCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKIAlzdHJ1Y3QgbG03NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgaW50IHRlbXAgPSAwOwotCWludCBlcnI7Ci0KLQllcnIgPSByZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAsIGF0dHItPmluZGV4LCAmdGVtcCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIGxtNzVfcmVnX3RvX21jKHRlbXAsIGRhdGEtPnJlc29sdXRpb24pKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCi0JCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGEpOwotCXN0cnVjdCBsbTc1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlsb25nIHRlbXA7Ci0JaW50IGVycm9yOwogCXU4IHJlc29sdXRpb247CisJaW50IHJlZzsKIAotCWVycm9yID0ga3N0cnRvbChidWYsIDEwLCAmdGVtcCk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7CisJaWYgKHR5cGUgIT0gaHdtb25fdGVtcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlyZWcgPSBMTTc1X1JFR19NQVg7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9tYXhfaHlzdDoKKwkJcmVnID0gTE03NV9SRUdfSFlTVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyoKIAkgKiBSZXNvbHV0aW9uIG9mIGxpbWl0IHJlZ2lzdGVycyBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lIGFzIHRoZQogCSAqIHRlbXBlcmF0dXJlIGlucHV0IHJlZ2lzdGVyIHJlc29sdXRpb24gdW5sZXNzIGdpdmVuIGV4cGxpY2l0bHkuCiAJICovCi0JaWYgKGF0dHItPmluZGV4ICYmIGRhdGEtPnJlc29sdXRpb25fbGltaXRzKQorCWlmIChkYXRhLT5yZXNvbHV0aW9uX2xpbWl0cykKIAkJcmVzb2x1dGlvbiA9IGRhdGEtPnJlc29sdXRpb25fbGltaXRzOwogCWVsc2UKIAkJcmVzb2x1dGlvbiA9IGRhdGEtPnJlc29sdXRpb247CkBAIC0xNDUsNDYgKzE2Myw3OCBAQAogCXRlbXAgPSBjbGFtcF92YWwodGVtcCwgTE03NV9URU1QX01JTiwgTE03NV9URU1QX01BWCk7CiAJdGVtcCA9IERJVl9ST1VORF9DTE9TRVNUKHRlbXAgIDw8IChyZXNvbHV0aW9uIC0gOCksCiAJCQkJIDEwMDApIDw8ICgxNiAtIHJlc29sdXRpb24pOwotCWVycm9yID0gcmVnbWFwX3dyaXRlKGRhdGEtPnJlZ21hcCwgYXR0ci0+aW5kZXgsIHRlbXApOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKIAotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gcmVnbWFwX3dyaXRlKGRhdGEtPnJlZ21hcCwgcmVnLCB0ZW1wKTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd191cGRhdGVfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsIGNoYXIgKmJ1ZikKK3N0YXRpYyB1bW9kZV90IGxtNzVfaXNfdmlzaWJsZShjb25zdCB2b2lkICpkYXRhLCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJICAgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgbG03NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZGF0YS0+c2FtcGxlX3RpbWUpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJc3dpdGNoIChhdHRyKSB7CisJCWNhc2UgaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWw6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJfQorCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXA6CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJY2FzZSBod21vbl90ZW1wX21heDoKKwkJY2FzZSBod21vbl90ZW1wX21heF9oeXN0OgorCQkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQkJc2hvd190ZW1wLCBzZXRfdGVtcCwgTE03NV9SRUdfTUFYKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4X2h5c3QsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQkJc2hvd190ZW1wLCBzZXRfdGVtcCwgTE03NV9SRUdfSFlTVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXAsIE5VTEwsIExNNzVfUkVHX1RFTVApOwotc3RhdGljIERFVklDRV9BVFRSKHVwZGF0ZV9pbnRlcnZhbCwgU19JUlVHTywgc2hvd191cGRhdGVfaW50ZXJ2YWwsIE5VTEwpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG03NV9hdHRyc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2h5c3QuZGV2X2F0dHIuYXR0ciwKLQkmZGV2X2F0dHJfdXBkYXRlX2ludGVydmFsLmF0dHIsCi0KLQlOVUxMCi19OwotQVRUUklCVVRFX0dST1VQUyhsbTc1KTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB0aGVybWFsX3pvbmVfb2ZfZGV2aWNlX29wcyBsbTc1X29mX3RoZXJtYWxfb3BzID0gewotCS5nZXRfdGVtcCA9IGxtNzVfcmVhZF90ZW1wLAotfTsKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZhbCAqLwogCisvKiBjaGlwIGNvbmZpZ3VyYXRpb24gKi8KKworc3RhdGljIGNvbnN0IHUzMiBsbTc1X2NoaXBfY29uZmlnW10gPSB7CisJSFdNT05fQ19SRUdJU1RFUl9UWiB8IEhXTU9OX0NfVVBEQVRFX0lOVEVSVkFMLAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtNzVfY2hpcCA9IHsKKwkudHlwZSA9IGh3bW9uX2NoaXAsCisJLmNvbmZpZyA9IGxtNzVfY2hpcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3QgdTMyIGxtNzVfdGVtcF9jb25maWdbXSA9IHsKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NQVggfCBIV01PTl9UX01BWF9IWVNULAorCTAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIGxtNzVfdGVtcCA9IHsKKwkudHlwZSA9IGh3bW9uX3RlbXAsCisJLmNvbmZpZyA9IGxtNzVfdGVtcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqbG03NV9pbmZvW10gPSB7CisJJmxtNzVfY2hpcCwKKwkmbG03NV90ZW1wLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIGxtNzVfaHdtb25fb3BzID0geworCS5pc192aXNpYmxlID0gbG03NV9pc192aXNpYmxlLAorCS5yZWFkID0gbG03NV9yZWFkLAorCS53cml0ZSA9IGxtNzVfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyBsbTc1X2NoaXBfaW5mbyA9IHsKKwkub3BzID0gJmxtNzVfaHdtb25fb3BzLAorCS5pbmZvID0gbG03NV9pbmZvLAorfTsKKwogc3RhdGljIGJvb2wgbG03NV9pc193cml0ZWFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKIHsKIAlyZXR1cm4gcmVnICE9IExNNzVfUkVHX1RFTVA7CkBAIC0zMzcsMTUgKzM4NywxMiBAQAogCiAJZGV2X2RiZyhkZXYsICJDb25maWcgJTAyeFxuIiwgbmV3KTsKIAotCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAotCQkJCQkJCSAgIGRhdGEsIGxtNzVfZ3JvdXBzKTsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJIGRhdGEsICZsbTc1X2NoaXBfaW5mbywKKwkJCQkJCQkgTlVMTCk7CiAJaWYgKElTX0VSUihod21vbl9kZXYpKQogCQlyZXR1cm4gUFRSX0VSUihod21vbl9kZXYpOwogCi0JZGV2bV90aGVybWFsX3pvbmVfb2Zfc2Vuc29yX3JlZ2lzdGVyKGh3bW9uX2RldiwgMCwKLQkJCQkJICAgICBod21vbl9kZXYsCi0JCQkJCSAgICAgJmxtNzVfb2ZfdGhlcm1hbF9vcHMpOwotCiAJZGV2X2luZm8oZGV2LCAiJXM6IHNlbnNvciAnJXMnXG4iLCBkZXZfbmFtZShod21vbl9kZXYpLCBjbGllbnQtPm5hbWUpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTAuYyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCmluZGV4IDQ5NmU3NzEuLjMyMmVkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCkBAIC04OSw3ICs4OSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KQEAgLTMyNiw3ICszMjUsNyBAQAogCQkuYWxlcnRfYWxhcm1zID0gMHg3YywKIAkJLm1heF9jb252cmF0ZSA9IDksCiAJCS5yZWdfbG9jYWxfZXh0ID0gVE1QNDUxX1JFR19SX0xPQ0FMX1RFTVBMLAotCX0KKwl9LAogfTsKIAogLyoKQEAgLTM2NSw3ICszNjQsMTAgQEAKIAogc3RydWN0IGxtOTBfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpncm91cHNbNl07CisJdTMyIGNoYW5uZWxfY29uZmlnWzRdOworCXN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gdGVtcF9pbmZvOworCWNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKmluZm9bM107CisJc3RydWN0IGh3bW9uX2NoaXBfaW5mbyBjaGlwOwogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKIAlib29sIHZhbGlkOwkJLyogdHJ1ZSBpZiByZWdpc3RlciB2YWx1ZXMgYXJlIHZhbGlkICovCiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7IC8qIGluIGppZmZpZXMgKi8KQEAgLTQ4OSwxMSArNDkxLDExIEBACiAgKiBjbGllbnQtPnVwZGF0ZV9sb2NrIG11c3QgYmUgaGVsZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAodW5sZXNzIHdlIGFyZQogICogaW4gZGV0ZWN0aW9uIG9yIGluaXRpYWxpemF0aW9uIHN0ZXBzKS4KICAqLwotc3RhdGljIHZvaWQgbG05MF9zZXRfY29udnJhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBpbnRlcnZhbCkKK3N0YXRpYyBpbnQgbG05MF9zZXRfY29udnJhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IGxtOTBfZGF0YSAqZGF0YSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGludGVydmFsKQogewotCWludCBpOwogCXVuc2lnbmVkIGludCB1cGRhdGVfaW50ZXJ2YWw7CisJaW50IGksIGVycjsKIAogCS8qIFNoaWZ0IGNhbGN1bGF0aW9ucyB0byBhdm9pZCByb3VuZGluZyBlcnJvcnMgKi8KIAlpbnRlcnZhbCA8PD0gNjsKQEAgLTUwNCw4ICs1MDYsOSBAQAogCQlpZiAoaW50ZXJ2YWwgPj0gdXBkYXRlX2ludGVydmFsICogMyAvIDQpCiAJCQlicmVhazsKIAotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTkwX1JFR19XX0NPTlZSQVRFLCBpKTsKKwllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfV19DT05WUkFURSwgaSk7CiAJZGF0YS0+dXBkYXRlX2ludGVydmFsID0gRElWX1JPVU5EX0NMT1NFU1QodXBkYXRlX2ludGVydmFsLCA2NCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBsbTkwX3VwZGF0ZV9saW1pdHMoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtNjA0LDE5ICs2MDcsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBsbTkwX2RhdGEgKmxtOTBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGxtOTBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CiAJdW5zaWduZWQgbG9uZyBuZXh0X3VwZGF0ZTsKLQlpbnQgdmFsID0gMDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlpbnQgdmFsOwogCiAJaWYgKCFkYXRhLT52YWxpZCkgewogCQl2YWwgPSBsbTkwX3VwZGF0ZV9saW1pdHMoZGV2KTsKIAkJaWYgKHZhbCA8IDApCi0JCQlnb3RvIGVycm9yOworCQkJcmV0dXJuIHZhbDsKIAl9CiAKIAluZXh0X3VwZGF0ZSA9IGRhdGEtPmxhc3RfdXBkYXRlZCArCkBAIC02MjgsNTMgKzYyOSw1NSBAQAogCiAJCXZhbCA9IGxtOTBfcmVhZF9yZWcoY2xpZW50LCBMTTkwX1JFR19SX0xPQ0FMX0xPVyk7CiAJCWlmICh2YWwgPCAwKQotCQkJZ290byBlcnJvcjsKKwkJCXJldHVybiB2YWw7CiAJCWRhdGEtPnRlbXA4W0xPQ0FMX0xPV10gPSB2YWw7CiAKIAkJdmFsID0gbG05MF9yZWFkX3JlZyhjbGllbnQsIExNOTBfUkVHX1JfTE9DQUxfSElHSCk7CiAJCWlmICh2YWwgPCAwKQotCQkJZ290byBlcnJvcjsKKwkJCXJldHVybiB2YWw7CiAJCWRhdGEtPnRlbXA4W0xPQ0FMX0hJR0hdID0gdmFsOwogCiAJCWlmIChkYXRhLT5yZWdfbG9jYWxfZXh0KSB7CiAJCQl2YWwgPSBsbTkwX3JlYWQxNihjbGllbnQsIExNOTBfUkVHX1JfTE9DQUxfVEVNUCwKIAkJCQkJICBkYXRhLT5yZWdfbG9jYWxfZXh0KTsKIAkJCWlmICh2YWwgPCAwKQotCQkJCWdvdG8gZXJyb3I7CisJCQkJcmV0dXJuIHZhbDsKIAkJCWRhdGEtPnRlbXAxMVtMT0NBTF9URU1QXSA9IHZhbDsKIAkJfSBlbHNlIHsKIAkJCXZhbCA9IGxtOTBfcmVhZF9yZWcoY2xpZW50LCBMTTkwX1JFR19SX0xPQ0FMX1RFTVApOwogCQkJaWYgKHZhbCA8IDApCi0JCQkJZ290byBlcnJvcjsKKwkJCQlyZXR1cm4gdmFsOwogCQkJZGF0YS0+dGVtcDExW0xPQ0FMX1RFTVBdID0gdmFsIDw8IDg7CiAJCX0KIAkJdmFsID0gbG05MF9yZWFkMTYoY2xpZW50LCBMTTkwX1JFR19SX1JFTU9URV9URU1QSCwKIAkJCQkgIExNOTBfUkVHX1JfUkVNT1RFX1RFTVBMKTsKIAkJaWYgKHZhbCA8IDApCi0JCQlnb3RvIGVycm9yOworCQkJcmV0dXJuIHZhbDsKIAkJZGF0YS0+dGVtcDExW1JFTU9URV9URU1QXSA9IHZhbDsKIAogCQl2YWwgPSBsbTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9TVEFUVVMpOwogCQlpZiAodmFsIDwgMCkKLQkJCWdvdG8gZXJyb3I7CisJCQlyZXR1cm4gdmFsOwogCQlkYXRhLT5hbGFybXMgPSB2YWw7CS8qIGxvd2VyIDggYml0IG9mIGFsYXJtcyAqLwogCiAJCWlmIChkYXRhLT5raW5kID09IG1heDY2OTYpIHsKIAkJCXZhbCA9IGxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgMSk7CiAJCQlpZiAodmFsIDwgMCkKLQkJCQlnb3RvIGVycm9yOworCQkJCXJldHVybiB2YWw7CiAKIAkJCXZhbCA9IGxtOTBfcmVhZDE2KGNsaWVudCwgTE05MF9SRUdfUl9SRU1PVEVfVEVNUEgsCiAJCQkJCSAgTE05MF9SRUdfUl9SRU1PVEVfVEVNUEwpOwotCQkJaWYgKHZhbCA8IDApCi0JCQkJZ290byBlcnJvcjsKKwkJCWlmICh2YWwgPCAwKSB7CisJCQkJbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCAwKTsKKwkJCQlyZXR1cm4gdmFsOworCQkJfQogCQkJZGF0YS0+dGVtcDExW1JFTU9URTJfVEVNUF0gPSB2YWw7CiAKIAkJCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgMCk7CiAKIAkJCXZhbCA9IGxtOTBfcmVhZF9yZWcoY2xpZW50LCBNQVg2Njk2X1JFR19SX1NUQVRVUzIpOwogCQkJaWYgKHZhbCA8IDApCi0JCQkJZ290byBlcnJvcjsKKwkJCQlyZXR1cm4gdmFsOwogCQkJZGF0YS0+YWxhcm1zIHw9IHZhbCA8PCA4OwogCQl9CiAKQEAgLTY4Niw3ICs2ODksNyBAQAogCQkgICAgIShkYXRhLT5hbGFybXMgJiBkYXRhLT5hbGVydF9hbGFybXMpKSB7CiAJCQl2YWwgPSBsbTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9DT05GSUcxKTsKIAkJCWlmICh2YWwgPCAwKQotCQkJCWdvdG8gZXJyb3I7CisJCQkJcmV0dXJuIHZhbDsKIAogCQkJaWYgKHZhbCAmIDB4ODApIHsKIAkJCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlJlLWVuYWJsaW5nIEFMRVJUI1xuIik7CkBAIC03MDAsMTMgKzcwMyw3IEBACiAJCWRhdGEtPnZhbGlkID0gdHJ1ZTsKIAl9CiAKLWVycm9yOgotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JaWYgKHZhbCA8IDApCi0JCXJldHVybiBFUlJfUFRSKHZhbCk7Ci0KLQlyZXR1cm4gZGF0YTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTgzMiw0MjIgKzgyOSwxMiBAQAogCXJldHVybiAodmFsICsgMTI1KSAvIDI1MCAqIDY0OwogfQogCi0vKgotICogU3lzZnMgc3R1ZmYKLSAqLwotCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXA4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7Ci0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGxtOTBfdXBkYXRlX2RldmljZShkZXYpOwotCWludCB0ZW1wOwotCi0JaWYgKElTX0VSUihkYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7Ci0KLQlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQotCQl0ZW1wID0gdGVtcF9mcm9tX3U4X2FkdDc0NjEoZGF0YSwgZGF0YS0+dGVtcDhbYXR0ci0+aW5kZXhdKTsKLQllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCi0JCXRlbXAgPSB0ZW1wX2Zyb21fdTgoZGF0YS0+dGVtcDhbYXR0ci0+aW5kZXhdKTsKLQllbHNlCi0JCXRlbXAgPSB0ZW1wX2Zyb21fczgoZGF0YS0+dGVtcDhbYXR0ci0+aW5kZXhdKTsKLQotCS8qICsxNiBkZWdyZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9yIHRoZSBMTTk5ICovCi0JaWYgKGRhdGEtPmtpbmQgPT0gbG05OSAmJiBhdHRyLT5pbmRleCA9PSAzKQotCQl0ZW1wICs9IDE2MDAwOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfdGVtcDgoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdGF0aWMgY29uc3QgdTggcmVnW1RFTVA4X1JFR19OVU1dID0gewotCQlMTTkwX1JFR19XX0xPQ0FMX0xPVywKLQkJTE05MF9SRUdfV19MT0NBTF9ISUdILAotCQlMTTkwX1JFR19XX0xPQ0FMX0NSSVQsCi0JCUxNOTBfUkVHX1dfUkVNT1RFX0NSSVQsCi0JCU1BWDY2NTlfUkVHX1dfTE9DQUxfRU1FUkcsCi0JCU1BWDY2NTlfUkVHX1dfUkVNT1RFX0VNRVJHLAotCQlMTTkwX1JFR19XX1JFTU9URV9DUklULAotCQlNQVg2NjU5X1JFR19XX1JFTU9URV9FTUVSRywKLQl9OwotCi0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCWludCBuciA9IGF0dHItPmluZGV4OwotCWxvbmcgdmFsOwotCWludCBlcnI7Ci0KLQllcnIgPSBrc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JLyogKzE2IGRlZ3JlZXMgb2Zmc2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KLQlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGF0dHItPmluZGV4ID09IDMpCi0JCXZhbCAtPSAxNjAwMDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQotCQlkYXRhLT50ZW1wOFtucl0gPSB0ZW1wX3RvX3U4X2FkdDc0NjEoZGF0YSwgdmFsKTsKLQllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCi0JCWRhdGEtPnRlbXA4W25yXSA9IHRlbXBfdG9fdTgodmFsKTsKLQllbHNlCi0JCWRhdGEtPnRlbXA4W25yXSA9IHRlbXBfdG9fczgodmFsKTsKLQotCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgbnIgPj0gNik7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZ1tucl0sIGRhdGEtPnRlbXA4W25yXSk7Ci0JbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCAwKTsKLQotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wMTEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpOwotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgdGVtcDsKLQotCWlmIChJU19FUlIoZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKGRhdGEpOwotCi0JaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKLQkJdGVtcCA9IHRlbXBfZnJvbV91MTZfYWR0NzQ2MShkYXRhLCBkYXRhLT50ZW1wMTFbYXR0ci0+aW5kZXhdKTsKLQllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCi0JCXRlbXAgPSB0ZW1wX2Zyb21fdTE2KGRhdGEtPnRlbXAxMVthdHRyLT5pbmRleF0pOwotCWVsc2UKLQkJdGVtcCA9IHRlbXBfZnJvbV9zMTYoZGF0YS0+dGVtcDExW2F0dHItPmluZGV4XSk7Ci0KLQkvKiArMTYgZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLwotCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgIGF0dHItPmluZGV4IDw9IDIpCi0JCXRlbXAgKz0gMTYwMDA7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF90ZW1wMTEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHsKLQkJdTggaGlnaDsKLQkJdTggbG93OwotCQlpbnQgY2hhbm5lbDsKLQl9IHJlZ1s1XSA9IHsKLQkJeyBMTTkwX1JFR19XX1JFTU9URV9MT1dILCBMTTkwX1JFR19XX1JFTU9URV9MT1dMLCAwIH0sCi0JCXsgTE05MF9SRUdfV19SRU1PVEVfSElHSEgsIExNOTBfUkVHX1dfUkVNT1RFX0hJR0hMLCAwIH0sCi0JCXsgTE05MF9SRUdfV19SRU1PVEVfT0ZGU0gsIExNOTBfUkVHX1dfUkVNT1RFX09GRlNMLCAwIH0sCi0JCXsgTE05MF9SRUdfV19SRU1PVEVfTE9XSCwgTE05MF9SRUdfV19SRU1PVEVfTE9XTCwgMSB9LAotCQl7IExNOTBfUkVHX1dfUkVNT1RFX0hJR0hILCBMTTkwX1JFR19XX1JFTU9URV9ISUdITCwgMSB9Ci0JfTsKLQotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0cik7Ci0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7Ci0JaW50IG5yID0gYXR0ci0+bnI7Ci0JaW50IGluZGV4ID0gYXR0ci0+aW5kZXg7Ci0JbG9uZyB2YWw7Ci0JaW50IGVycjsKLQotCWVyciA9IGtzdHJ0b2woYnVmLCAxMCwgJnZhbCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQkvKiArMTYgZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLwotCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgaW5kZXggPD0gMikKLQkJdmFsIC09IDE2MDAwOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+a2luZCA9PSB0bXA0NTEpCi0JCWRhdGEtPnRlbXAxMVtpbmRleF0gPSB0ZW1wX3RvX3UxNl9hZHQ3NDYxKGRhdGEsIHZhbCk7Ci0JZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQotCQlkYXRhLT50ZW1wMTFbaW5kZXhdID0gdGVtcF90b191OCh2YWwpIDw8IDg7Ci0JZWxzZSBpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfUkVNX0xJTUlUX0VYVCkKLQkJZGF0YS0+dGVtcDExW2luZGV4XSA9IHRlbXBfdG9fczE2KHZhbCk7Ci0JZWxzZQotCQlkYXRhLT50ZW1wMTFbaW5kZXhdID0gdGVtcF90b19zOCh2YWwpIDw8IDg7Ci0KLQlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIHJlZ1tucl0uY2hhbm5lbCk7Ci0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZ1tucl0uaGlnaCwKLQkJCQkgIGRhdGEtPnRlbXAxMVtpbmRleF0gPj4gOCk7Ci0JaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX1JFTV9MSU1JVF9FWFQpCi0JCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWdbbnJdLmxvdywKLQkJCQkJICBkYXRhLT50ZW1wMTFbaW5kZXhdICYgMHhmZik7Ci0JbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCAwKTsKLQotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1waHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJICAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgdGVtcDsKLQotCWlmIChJU19FUlIoZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKGRhdGEpOwotCi0JaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKLQkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYxKGRhdGEsIGRhdGEtPnRlbXA4W2F0dHItPmluZGV4XSk7Ci0JZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQotCQl0ZW1wID0gdGVtcF9mcm9tX3U4KGRhdGEtPnRlbXA4W2F0dHItPmluZGV4XSk7Ci0JZWxzZQotCQl0ZW1wID0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXA4W2F0dHItPmluZGV4XSk7Ci0KLQkvKiArMTYgZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLwotCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgYXR0ci0+aW5kZXggPT0gMykKLQkJdGVtcCArPSAxNjAwMDsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wIC0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXBfaHlzdCkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfdGVtcGh5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZHVtbXksCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7Ci0JbG9uZyB2YWw7Ci0JaW50IGVycjsKLQlpbnQgdGVtcDsKLQotCWVyciA9IGtzdHJ0b2woYnVmLCAxMCwgJnZhbCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0JaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKLQkJdGVtcCA9IHRlbXBfZnJvbV91OF9hZHQ3NDYxKGRhdGEsIGRhdGEtPnRlbXA4W0xPQ0FMX0NSSVRdKTsKLQllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCi0JCXRlbXAgPSB0ZW1wX2Zyb21fdTgoZGF0YS0+dGVtcDhbTE9DQUxfQ1JJVF0pOwotCWVsc2UKLQkJdGVtcCA9IHRlbXBfZnJvbV9zOChkYXRhLT50ZW1wOFtMT0NBTF9DUklUXSk7Ci0KLQlkYXRhLT50ZW1wX2h5c3QgPSBoeXN0X3RvX3JlZyh0ZW1wIC0gdmFsKTsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05MF9SRUdfV19UQ1JJVF9IWVNULAotCQkJCSAgZGF0YS0+dGVtcF9oeXN0KTsKLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm1zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmR1bW15LAotCQkJICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQotCWlmIChJU19FUlIoZGF0YSkpCi0JCXJldHVybiBQVFJfRVJSKGRhdGEpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmFsYXJtcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQotCQkJICAqZGV2YXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKLQlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IGJpdG5yID0gYXR0ci0+aW5kZXg7Ci0KLQlpZiAoSVNfRVJSKGRhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoZGF0YS0+YWxhcm1zID4+IGJpdG5yKSAmIDEpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3VwZGF0ZV9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPnVwZGF0ZV9pbnRlcnZhbCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF91cGRhdGVfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBlcnI7Ci0KLQllcnIgPSBrc3RydG91bChidWYsIDEwLCAmdmFsKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWxtOTBfc2V0X2NvbnZyYXRlKGNsaWVudCwgZGF0YSwgY2xhbXBfdmFsKHZhbCwgMCwgMTAwMDAwKSk7Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wMTEsIE5VTEwsCi0JMCwgTE9DQUxfVEVNUCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcDExLCBOVUxMLAotCTAsIFJFTU9URV9URU1QKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wOCwKLQlzZXRfdGVtcDgsIExPQ0FMX0xPVyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wMTEsCi0Jc2V0X3RlbXAxMSwgMCwgUkVNT1RFX0xPVyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDgsCi0Jc2V0X3RlbXA4LCBMT0NBTF9ISUdIKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wMl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAxMSwKLQlzZXRfdGVtcDExLCAxLCBSRU1PVEVfSElHSCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAotCXNldF90ZW1wOCwgTE9DQUxfQ1JJVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXQsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXA4LAotCXNldF90ZW1wOCwgUkVNT1RFX0NSSVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2h5c3QsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXBoeXN0LAotCXNldF90ZW1waHlzdCwgTE9DQUxfQ1JJVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd190ZW1waHlzdCwgTlVMTCwKLQlSRU1PVEVfQ1JJVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDJfb2Zmc2V0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wMTEsCi0Jc2V0X3RlbXAxMSwgMiwgUkVNT1RFX09GRlNFVCk7Ci0KLS8qIEluZGl2aWR1YWwgYWxhcm0gZmlsZXMgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9mYXVsdCwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21pbl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21heF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21pbl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNik7Ci0vKiBSYXcgYWxhcm0gZmlsZSBmb3IgY29tcGF0aWJpbGl0eSAqLwotc3RhdGljIERFVklDRV9BVFRSKGFsYXJtcywgU19JUlVHTywgc2hvd19hbGFybXMsIE5VTEwpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2ludGVydmFsLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd191cGRhdGVfaW50ZXJ2YWwsCi0JCSAgIHNldF91cGRhdGVfaW50ZXJ2YWwpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05MF9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWluLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9jcml0X2h5c3QuZGV2X2F0dHIuYXR0ciwKLQotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfZmF1bHQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZkZXZfYXR0cl9hbGFybXMuYXR0ciwKLQkmZGV2X2F0dHJfdXBkYXRlX2ludGVydmFsLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbG05MF9ncm91cCA9IHsKLQkuYXR0cnMgPSBsbTkwX2F0dHJpYnV0ZXMsCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05MF90ZW1wMl9vZmZzZXRfYXR0cmlidXRlc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbG05MF90ZW1wMl9vZmZzZXRfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbG05MF90ZW1wMl9vZmZzZXRfYXR0cmlidXRlcywKLX07Ci0KLS8qCi0gKiBBZGRpdGlvbmFsIGF0dHJpYnV0ZXMgZm9yIGRldmljZXMgd2l0aCBlbWVyZ2VuY3kgc2Vuc29ycwotICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2VtZXJnZW5jeSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDgsCi0Jc2V0X3RlbXA4LCBMT0NBTF9FTUVSRyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2VtZXJnZW5jeSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDgsCi0Jc2V0X3RlbXA4LCBSRU1PVEVfRU1FUkcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9lbWVyZ2VuY3lfaHlzdCwgU19JUlVHTywgc2hvd190ZW1waHlzdCwKLQkJCSAgTlVMTCwgTE9DQUxfRU1FUkcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9lbWVyZ2VuY3lfaHlzdCwgU19JUlVHTywgc2hvd190ZW1waHlzdCwKLQkJCSAgTlVMTCwgUkVNT1RFX0VNRVJHKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTBfZW1lcmdlbmN5X2F0dHJpYnV0ZXNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2VtZXJnZW5jeS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfZW1lcmdlbmN5LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9lbWVyZ2VuY3lfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfZW1lcmdlbmN5X2h5c3QuZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsbTkwX2VtZXJnZW5jeV9ncm91cCA9IHsKLQkuYXR0cnMgPSBsbTkwX2VtZXJnZW5jeV9hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9lbWVyZ2VuY3lfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDE1KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZW1lcmdlbmN5X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxMyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTkwX2VtZXJnZW5jeV9hbGFybV9hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9lbWVyZ2VuY3lfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2VtZXJnZW5jeV9hbGFybS5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGxtOTBfZW1lcmdlbmN5X2FsYXJtX2dyb3VwID0gewotCS5hdHRycyA9IGxtOTBfZW1lcmdlbmN5X2FsYXJtX2F0dHJpYnV0ZXMsCi19OwotCi0vKgotICogQWRkaXRpb25hbCBhdHRyaWJ1dGVzIGZvciBkZXZpY2VzIHdpdGggMyB0ZW1wZXJhdHVyZSBzZW5zb3JzCi0gKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wMTEsIE5VTEwsCi0JMCwgUkVNT1RFMl9URU1QKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMih0ZW1wM19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3RlbXAxMSwKLQlzZXRfdGVtcDExLCAzLCBSRU1PVEUyX0xPVyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIodGVtcDNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wMTEsCi0Jc2V0X3RlbXAxMSwgNCwgUkVNT1RFMl9ISUdIKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdGVtcDgsCi0Jc2V0X3RlbXA4LCBSRU1PVEUyX0NSSVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19jcml0X2h5c3QsIFNfSVJVR08sIHNob3dfdGVtcGh5c3QsIE5VTEwsCi0JUkVNT1RFMl9DUklUKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfZW1lcmdlbmN5LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190ZW1wOCwKLQlzZXRfdGVtcDgsIFJFTU9URTJfRU1FUkcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19lbWVyZ2VuY3lfaHlzdCwgU19JUlVHTywgc2hvd190ZW1waHlzdCwKLQkJCSAgTlVMTCwgUkVNT1RFMl9FTUVSRyk7Ci0KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgOSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2ZhdWx0LCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21pbl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19tYXhfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfZW1lcmdlbmN5X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxNCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpsbTkwX3RlbXAzX2F0dHJpYnV0ZXNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19taW4uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfY3JpdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19lbWVyZ2VuY3kuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2VtZXJnZW5jeV9oeXN0LmRldl9hdHRyLmF0dHIsCi0KLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfY3JpdF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfZW1lcmdlbmN5X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbG05MF90ZW1wM19ncm91cCA9IHsKLQkuYXR0cnMgPSBsbTkwX3RlbXAzX2F0dHJpYnV0ZXMsCi19OwotCiAvKiBwZWMgdXNlZCBmb3IgQURNMTAzMiBvbmx5ICovCiBzdGF0aWMgc3NpemVfdCBzaG93X3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkdW1teSwKIAkJCWNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNsaWVudC0+ZmxhZ3MgJiBJMkNfQ0xJRU5UX1BFQykpOwogfQogCkBAIC0xMjc4LDkgKzg2NSw0MzEgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKHBlYywgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfcGVjLCBzZXRfcGVjKTsKIAotLyoKLSAqIFJlYWwgY29kZQotICovCitzdGF0aWMgaW50IGxtOTBfZ2V0X3RlbXAxMShzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLCBpbnQgaW5kZXgpCit7CisJczE2IHRlbXAxMSA9IGRhdGEtPnRlbXAxMVtpbmRleF07CisJaW50IHRlbXA7CisKKwlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQorCQl0ZW1wID0gdGVtcF9mcm9tX3UxNl9hZHQ3NDYxKGRhdGEsIHRlbXAxMSk7CisJZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQorCQl0ZW1wID0gdGVtcF9mcm9tX3UxNih0ZW1wMTEpOworCWVsc2UKKwkJdGVtcCA9IHRlbXBfZnJvbV9zMTYodGVtcDExKTsKKworCS8qICsxNiBkZWdyZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9yIHRoZSBMTTk5ICovCisJaWYgKGRhdGEtPmtpbmQgPT0gbG05OSAmJiBpbmRleCA8PSAyKQorCQl0ZW1wICs9IDE2MDAwOworCisJcmV0dXJuIHRlbXA7Cit9CisKK3N0YXRpYyBpbnQgbG05MF9zZXRfdGVtcDExKHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsIGludCBpbmRleCwgbG9uZyB2YWwpCit7CisJc3RhdGljIHN0cnVjdCByZWcgeworCQl1OCBoaWdoOworCQl1OCBsb3c7CisJfSByZWdbXSA9IHsKKwlbUkVNT1RFX0xPV10gPSB7IExNOTBfUkVHX1dfUkVNT1RFX0xPV0gsIExNOTBfUkVHX1dfUkVNT1RFX0xPV0wgfSwKKwlbUkVNT1RFX0hJR0hdID0geyBMTTkwX1JFR19XX1JFTU9URV9ISUdISCwgTE05MF9SRUdfV19SRU1PVEVfSElHSEwgfSwKKwlbUkVNT1RFX09GRlNFVF0gPSB7IExNOTBfUkVHX1dfUkVNT1RFX09GRlNILCBMTTkwX1JFR19XX1JFTU9URV9PRkZTTCB9LAorCVtSRU1PVEUyX0xPV10gPSB7IExNOTBfUkVHX1dfUkVNT1RFX0xPV0gsIExNOTBfUkVHX1dfUkVNT1RFX0xPV0wgfSwKKwlbUkVNT1RFMl9ISUdIXSA9IHsgTE05MF9SRUdfV19SRU1PVEVfSElHSEgsIExNOTBfUkVHX1dfUkVNT1RFX0hJR0hMIH0KKwl9OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJc3RydWN0IHJlZyAqcmVncCA9ICZyZWdbaW5kZXhdOworCWludCBlcnI7CisKKwkvKiArMTYgZGVncmVlcyBvZmZzZXQgZm9yIHRlbXAyIGZvciB0aGUgTE05OSAqLworCWlmIChkYXRhLT5raW5kID09IGxtOTkgJiYgaW5kZXggPD0gMikKKwkJdmFsIC09IDE2MDAwOworCisJaWYgKGRhdGEtPmtpbmQgPT0gYWR0NzQ2MSB8fCBkYXRhLT5raW5kID09IHRtcDQ1MSkKKwkJZGF0YS0+dGVtcDExW2luZGV4XSA9IHRlbXBfdG9fdTE2X2FkdDc0NjEoZGF0YSwgdmFsKTsKKwllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCisJCWRhdGEtPnRlbXAxMVtpbmRleF0gPSB0ZW1wX3RvX3U4KHZhbCkgPDwgODsKKwllbHNlIGlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9SRU1fTElNSVRfRVhUKQorCQlkYXRhLT50ZW1wMTFbaW5kZXhdID0gdGVtcF90b19zMTYodmFsKTsKKwllbHNlCisJCWRhdGEtPnRlbXAxMVtpbmRleF0gPSB0ZW1wX3RvX3M4KHZhbCkgPDwgODsKKworCWxtOTBfc2VsZWN0X3JlbW90ZV9jaGFubmVsKGNsaWVudCwgZGF0YSwgaW5kZXggPj0gMyk7CisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZ3AtPmhpZ2gsCisJCQkJICBkYXRhLT50ZW1wMTFbaW5kZXhdID4+IDgpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9SRU1fTElNSVRfRVhUKQorCQllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVncC0+bG93LAorCQkJCQkJZGF0YS0+dGVtcDExW2luZGV4XSAmIDB4ZmYpOworCisJbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCAwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGxtOTBfZ2V0X3RlbXA4KHN0cnVjdCBsbTkwX2RhdGEgKmRhdGEsIGludCBpbmRleCkKK3sKKwlzOCB0ZW1wOCA9IGRhdGEtPnRlbXA4W2luZGV4XTsKKwlpbnQgdGVtcDsKKworCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+a2luZCA9PSB0bXA0NTEpCisJCXRlbXAgPSB0ZW1wX2Zyb21fdThfYWR0NzQ2MShkYXRhLCB0ZW1wOCk7CisJZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBtYXg2NjQ2KQorCQl0ZW1wID0gdGVtcF9mcm9tX3U4KHRlbXA4KTsKKwllbHNlCisJCXRlbXAgPSB0ZW1wX2Zyb21fczgodGVtcDgpOworCisJLyogKzE2IGRlZ3JlZXMgb2Zmc2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KKwlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGluZGV4ID09IDMpCisJCXRlbXAgKz0gMTYwMDA7CisKKwlyZXR1cm4gdGVtcDsKK30KKworc3RhdGljIGludCBsbTkwX3NldF90ZW1wOChzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLCBpbnQgaW5kZXgsIGxvbmcgdmFsKQoreworCXN0YXRpYyBjb25zdCB1OCByZWdbVEVNUDhfUkVHX05VTV0gPSB7CisJCUxNOTBfUkVHX1dfTE9DQUxfTE9XLAorCQlMTTkwX1JFR19XX0xPQ0FMX0hJR0gsCisJCUxNOTBfUkVHX1dfTE9DQUxfQ1JJVCwKKwkJTE05MF9SRUdfV19SRU1PVEVfQ1JJVCwKKwkJTUFYNjY1OV9SRUdfV19MT0NBTF9FTUVSRywKKwkJTUFYNjY1OV9SRUdfV19SRU1PVEVfRU1FUkcsCisJCUxNOTBfUkVHX1dfUkVNT1RFX0NSSVQsCisJCU1BWDY2NTlfUkVHX1dfUkVNT1RFX0VNRVJHLAorCX07CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlpbnQgZXJyOworCisJLyogKzE2IGRlZ3JlZXMgb2Zmc2V0IGZvciB0ZW1wMiBmb3IgdGhlIExNOTkgKi8KKwlpZiAoZGF0YS0+a2luZCA9PSBsbTk5ICYmIGluZGV4ID09IDMpCisJCXZhbCAtPSAxNjAwMDsKKworCWlmIChkYXRhLT5raW5kID09IGFkdDc0NjEgfHwgZGF0YS0+a2luZCA9PSB0bXA0NTEpCisJCWRhdGEtPnRlbXA4W2luZGV4XSA9IHRlbXBfdG9fdThfYWR0NzQ2MShkYXRhLCB2YWwpOworCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4NjY0NikKKwkJZGF0YS0+dGVtcDhbaW5kZXhdID0gdGVtcF90b191OCh2YWwpOworCWVsc2UKKwkJZGF0YS0+dGVtcDhbaW5kZXhdID0gdGVtcF90b19zOCh2YWwpOworCisJbG05MF9zZWxlY3RfcmVtb3RlX2NoYW5uZWwoY2xpZW50LCBkYXRhLCBpbmRleCA+PSA2KTsKKwllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgcmVnW2luZGV4XSwgZGF0YS0+dGVtcDhbaW5kZXhdKTsKKwlsbTkwX3NlbGVjdF9yZW1vdGVfY2hhbm5lbChjbGllbnQsIGRhdGEsIDApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBsbTkwX2dldF90ZW1waHlzdChzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLCBpbnQgaW5kZXgpCit7CisJaW50IHRlbXA7CisKKwlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQorCQl0ZW1wID0gdGVtcF9mcm9tX3U4X2FkdDc0NjEoZGF0YSwgZGF0YS0+dGVtcDhbaW5kZXhdKTsKKwllbHNlIGlmIChkYXRhLT5raW5kID09IG1heDY2NDYpCisJCXRlbXAgPSB0ZW1wX2Zyb21fdTgoZGF0YS0+dGVtcDhbaW5kZXhdKTsKKwllbHNlCisJCXRlbXAgPSB0ZW1wX2Zyb21fczgoZGF0YS0+dGVtcDhbaW5kZXhdKTsKKworCS8qICsxNiBkZWdyZWVzIG9mZnNldCBmb3IgdGVtcDIgZm9yIHRoZSBMTTk5ICovCisJaWYgKGRhdGEtPmtpbmQgPT0gbG05OSAmJiBpbmRleCA9PSAzKQorCQl0ZW1wICs9IDE2MDAwOworCisJcmV0dXJuIHRlbXAgLSB0ZW1wX2Zyb21fczgoZGF0YS0+dGVtcF9oeXN0KTsKK30KKworc3RhdGljIGludCBsbTkwX3NldF90ZW1waHlzdChzdHJ1Y3QgbG05MF9kYXRhICpkYXRhLCBsb25nIHZhbCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCWludCB0ZW1wOworCWludCBlcnI7CisKKwlpZiAoZGF0YS0+a2luZCA9PSBhZHQ3NDYxIHx8IGRhdGEtPmtpbmQgPT0gdG1wNDUxKQorCQl0ZW1wID0gdGVtcF9mcm9tX3U4X2FkdDc0NjEoZGF0YSwgZGF0YS0+dGVtcDhbTE9DQUxfQ1JJVF0pOworCWVsc2UgaWYgKGRhdGEtPmtpbmQgPT0gbWF4NjY0NikKKwkJdGVtcCA9IHRlbXBfZnJvbV91OChkYXRhLT50ZW1wOFtMT0NBTF9DUklUXSk7CisJZWxzZQorCQl0ZW1wID0gdGVtcF9mcm9tX3M4KGRhdGEtPnRlbXA4W0xPQ0FMX0NSSVRdKTsKKworCWRhdGEtPnRlbXBfaHlzdCA9IGh5c3RfdG9fcmVnKHRlbXAgLSB2YWwpOworCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTkwX1JFR19XX1RDUklUX0hZU1QsCisJCQkJCWRhdGEtPnRlbXBfaHlzdCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHU4IGxtOTBfdGVtcF9pbmRleFszXSA9IHsKKwlMT0NBTF9URU1QLCBSRU1PVEVfVEVNUCwgUkVNT1RFMl9URU1QCit9OworCitzdGF0aWMgY29uc3QgdTggbG05MF90ZW1wX21pbl9pbmRleFszXSA9IHsKKwlMT0NBTF9MT1csIFJFTU9URV9MT1csIFJFTU9URTJfTE9XCit9OworCitzdGF0aWMgY29uc3QgdTggbG05MF90ZW1wX21heF9pbmRleFszXSA9IHsKKwlMT0NBTF9ISUdILCBSRU1PVEVfSElHSCwgUkVNT1RFMl9ISUdICit9OworCitzdGF0aWMgY29uc3QgdTggbG05MF90ZW1wX2NyaXRfaW5kZXhbM10gPSB7CisJTE9DQUxfQ1JJVCwgUkVNT1RFX0NSSVQsIFJFTU9URTJfQ1JJVAorfTsKKworc3RhdGljIGNvbnN0IHU4IGxtOTBfdGVtcF9lbWVyZ19pbmRleFszXSA9IHsKKwlMT0NBTF9FTUVSRywgUkVNT1RFX0VNRVJHLCBSRU1PVEUyX0VNRVJHCit9OworCitzdGF0aWMgY29uc3QgdTggbG05MF9taW5fYWxhcm1fYml0c1szXSA9IHsgNSwgMywgMTEgfTsKK3N0YXRpYyBjb25zdCB1OCBsbTkwX21heF9hbGFybV9iaXRzWzNdID0geyAwLCA0LCAxMiB9Oworc3RhdGljIGNvbnN0IHU4IGxtOTBfY3JpdF9hbGFybV9iaXRzWzNdID0geyAwLCAxLCA5IH07CitzdGF0aWMgY29uc3QgdTggbG05MF9lbWVyZ2VuY3lfYWxhcm1fYml0c1szXSA9IHsgMTUsIDEzLCAxNCB9Oworc3RhdGljIGNvbnN0IHU4IGxtOTBfZmF1bHRfYml0c1szXSA9IHsgMCwgMiwgMTAgfTsKKworc3RhdGljIGludCBsbTkwX3RlbXBfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQoreworCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWVyciA9IGxtOTBfdXBkYXRlX2RldmljZShkZXYpOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCSp2YWwgPSBsbTkwX2dldF90ZW1wMTEoZGF0YSwgbG05MF90ZW1wX2luZGV4W2NoYW5uZWxdKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX21pbl9hbGFybToKKwkJKnZhbCA9IChkYXRhLT5hbGFybXMgPj4gbG05MF9taW5fYWxhcm1fYml0c1tjaGFubmVsXSkgJiAxOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2FsYXJtOgorCQkqdmFsID0gKGRhdGEtPmFsYXJtcyA+PiBsbTkwX21heF9hbGFybV9iaXRzW2NoYW5uZWxdKSAmIDE7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9jcml0X2FsYXJtOgorCQkqdmFsID0gKGRhdGEtPmFsYXJtcyA+PiBsbTkwX2NyaXRfYWxhcm1fYml0c1tjaGFubmVsXSkgJiAxOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfZW1lcmdlbmN5X2FsYXJtOgorCQkqdmFsID0gKGRhdGEtPmFsYXJtcyA+PiBsbTkwX2VtZXJnZW5jeV9hbGFybV9iaXRzW2NoYW5uZWxdKSAmIDE7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9mYXVsdDoKKwkJKnZhbCA9IChkYXRhLT5hbGFybXMgPj4gbG05MF9mYXVsdF9iaXRzW2NoYW5uZWxdKSAmIDE7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9taW46CisJCWlmIChjaGFubmVsID09IDApCisJCQkqdmFsID0gbG05MF9nZXRfdGVtcDgoZGF0YSwKKwkJCQkJICAgICAgbG05MF90ZW1wX21pbl9pbmRleFtjaGFubmVsXSk7CisJCWVsc2UKKwkJCSp2YWwgPSBsbTkwX2dldF90ZW1wMTEoZGF0YSwKKwkJCQkJICAgICAgIGxtOTBfdGVtcF9taW5faW5kZXhbY2hhbm5lbF0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlpZiAoY2hhbm5lbCA9PSAwKQorCQkJKnZhbCA9IGxtOTBfZ2V0X3RlbXA4KGRhdGEsCisJCQkJCSAgICAgIGxtOTBfdGVtcF9tYXhfaW5kZXhbY2hhbm5lbF0pOworCQllbHNlCisJCQkqdmFsID0gbG05MF9nZXRfdGVtcDExKGRhdGEsCisJCQkJCSAgICAgICBsbTkwX3RlbXBfbWF4X2luZGV4W2NoYW5uZWxdKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2NyaXQ6CisJCSp2YWwgPSBsbTkwX2dldF90ZW1wOChkYXRhLCBsbTkwX3RlbXBfY3JpdF9pbmRleFtjaGFubmVsXSk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9jcml0X2h5c3Q6CisJCSp2YWwgPSBsbTkwX2dldF90ZW1waHlzdChkYXRhLCBsbTkwX3RlbXBfY3JpdF9pbmRleFtjaGFubmVsXSk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9lbWVyZ2VuY3k6CisJCSp2YWwgPSBsbTkwX2dldF90ZW1wOChkYXRhLCBsbTkwX3RlbXBfZW1lcmdfaW5kZXhbY2hhbm5lbF0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfZW1lcmdlbmN5X2h5c3Q6CisJCSp2YWwgPSBsbTkwX2dldF90ZW1waHlzdChkYXRhLCBsbTkwX3RlbXBfZW1lcmdfaW5kZXhbY2hhbm5lbF0pOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfb2Zmc2V0OgorCQkqdmFsID0gbG05MF9nZXRfdGVtcDExKGRhdGEsIFJFTU9URV9PRkZTRVQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxtOTBfdGVtcF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpCit7CisJc3RydWN0IGxtOTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwllcnIgPSBsbTkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX21pbjoKKwkJaWYgKGNoYW5uZWwgPT0gMCkKKwkJCWVyciA9IGxtOTBfc2V0X3RlbXA4KGRhdGEsCisJCQkJCSAgICAgIGxtOTBfdGVtcF9taW5faW5kZXhbY2hhbm5lbF0sCisJCQkJCSAgICAgIHZhbCk7CisJCWVsc2UKKwkJCWVyciA9IGxtOTBfc2V0X3RlbXAxMShkYXRhLAorCQkJCQkgICAgICBsbTkwX3RlbXBfbWluX2luZGV4W2NoYW5uZWxdLAorCQkJCQkgICAgICB2YWwpOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlpZiAoY2hhbm5lbCA9PSAwKQorCQkJZXJyID0gbG05MF9zZXRfdGVtcDgoZGF0YSwKKwkJCQkJICAgICBsbTkwX3RlbXBfbWF4X2luZGV4W2NoYW5uZWxdLAorCQkJCQkgICAgIHZhbCk7CisJCWVsc2UKKwkJCWVyciA9IGxtOTBfc2V0X3RlbXAxMShkYXRhLAorCQkJCQkgICAgICBsbTkwX3RlbXBfbWF4X2luZGV4W2NoYW5uZWxdLAorCQkJCQkgICAgICB2YWwpOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdDoKKwkJZXJyID0gbG05MF9zZXRfdGVtcDgoZGF0YSwgbG05MF90ZW1wX2NyaXRfaW5kZXhbY2hhbm5lbF0sIHZhbCk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9jcml0X2h5c3Q6CisJCWVyciA9IGxtOTBfc2V0X3RlbXBoeXN0KGRhdGEsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9lbWVyZ2VuY3k6CisJCWVyciA9IGxtOTBfc2V0X3RlbXA4KGRhdGEsIGxtOTBfdGVtcF9lbWVyZ19pbmRleFtjaGFubmVsXSwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX29mZnNldDoKKwkJZXJyID0gbG05MF9zZXRfdGVtcDExKGRhdGEsIFJFTU9URV9PRkZTRVQsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CitlcnJvcjoKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1bW9kZV90IGxtOTBfdGVtcF9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKK3sKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJY2FzZSBod21vbl90ZW1wX21pbl9hbGFybToKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2FsYXJtOgorCWNhc2UgaHdtb25fdGVtcF9jcml0X2FsYXJtOgorCWNhc2UgaHdtb25fdGVtcF9lbWVyZ2VuY3lfYWxhcm06CisJY2FzZSBod21vbl90ZW1wX2VtZXJnZW5jeV9oeXN0OgorCWNhc2UgaHdtb25fdGVtcF9mYXVsdDoKKwkJcmV0dXJuIFNfSVJVR087CisJY2FzZSBod21vbl90ZW1wX21pbjoKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCWNhc2UgaHdtb25fdGVtcF9jcml0OgorCWNhc2UgaHdtb25fdGVtcF9lbWVyZ2VuY3k6CisJY2FzZSBod21vbl90ZW1wX29mZnNldDoKKwkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCWNhc2UgaHdtb25fdGVtcF9jcml0X2h5c3Q6CisJCWlmIChjaGFubmVsID09IDApCisJCQlyZXR1cm4gU19JUlVHTyB8IFNfSVdVU1I7CisJCXJldHVybiBTX0lSVUdPOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBsbTkwX2NoaXBfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQoreworCXN0cnVjdCBsbTkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWVyciA9IGxtOTBfdXBkYXRlX2RldmljZShkZXYpOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQkqdmFsID0gZGF0YS0+dXBkYXRlX2ludGVydmFsOworCQlicmVhazsKKwljYXNlIGh3bW9uX2NoaXBfYWxhcm1zOgorCQkqdmFsID0gZGF0YS0+YWxhcm1zOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbG05MF9jaGlwX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHZhbCkKK3sKKwlzdHJ1Y3QgbG05MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJZXJyID0gbG05MF91cGRhdGVfZGV2aWNlKGRldik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWw6CisJCWVyciA9IGxtOTBfc2V0X2NvbnZyYXRlKGNsaWVudCwgZGF0YSwKKwkJCQkJY2xhbXBfdmFsKHZhbCwgMCwgMTAwMDAwKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CitlcnJvcjoKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1bW9kZV90IGxtOTBfY2hpcF9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKK3sKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsOgorCQlyZXR1cm4gU19JUlVHTyB8IFNfSVdVU1I7CisJY2FzZSBod21vbl9jaGlwX2FsYXJtczoKKwkJcmV0dXJuIFNfSVJVR087CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IGxtOTBfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICAgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9jaGlwOgorCQlyZXR1cm4gbG05MF9jaGlwX3JlYWQoZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIGxtOTBfdGVtcF9yZWFkKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgaW50IGxtOTBfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgdmFsKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJcmV0dXJuIGxtOTBfY2hpcF93cml0ZShkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl90ZW1wOgorCQlyZXR1cm4gbG05MF90ZW1wX3dyaXRlKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgdW1vZGVfdCBsbTkwX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqZGF0YSwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCSAgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9jaGlwOgorCQlyZXR1cm4gbG05MF9jaGlwX2lzX3Zpc2libGUoZGF0YSwgYXR0ciwgY2hhbm5lbCk7CisJY2FzZSBod21vbl90ZW1wOgorCQlyZXR1cm4gbG05MF90ZW1wX2lzX3Zpc2libGUoZGF0YSwgYXR0ciwgY2hhbm5lbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQogCiAvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgbG05MF9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKQEAgLTE2MTcsMTUgKzE2MjYsMzIgQEAKIAlyZWd1bGF0b3JfZGlzYWJsZShyZWd1bGF0b3IpOwogfQogCitzdGF0aWMgY29uc3QgdTMyIGxtOTBfY2hpcF9jb25maWdbXSA9IHsKKwlIV01PTl9DX1JFR0lTVEVSX1RaIHwgSFdNT05fQ19VUERBVEVfSU5URVJWQUwgfCBIV01PTl9DX0FMQVJNUywKKwkwCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBsbTkwX2NoaXBfaW5mbyA9IHsKKwkudHlwZSA9IGh3bW9uX2NoaXAsCisJLmNvbmZpZyA9IGxtOTBfY2hpcF9jb25maWcsCit9OworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIGxtOTBfb3BzID0geworCS5pc192aXNpYmxlID0gbG05MF9pc192aXNpYmxlLAorCS5yZWFkID0gbG05MF9yZWFkLAorCS53cml0ZSA9IGxtOTBfd3JpdGUsCit9OworCiBzdGF0aWMgaW50IGxtOTBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihkZXYtPnBhcmVudCk7Ci0Jc3RydWN0IGxtOTBfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICppbmZvOwogCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcjsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7Ci0JaW50IGdyb3VwcyA9IDA7CisJc3RydWN0IGxtOTBfZGF0YSAqZGF0YTsKIAlpbnQgZXJyOwogCiAJcmVndWxhdG9yID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGRldiwgInZjYyIpOwpAQCAtMTY2NSw2ICsxNjkxLDQ5IEBACiAKIAkvKiBTZXQgY2hpcCBjYXBhYmlsaXRpZXMgKi8KIAlkYXRhLT5mbGFncyA9IGxtOTBfcGFyYW1zW2RhdGEtPmtpbmRdLmZsYWdzOworCisJZGF0YS0+Y2hpcC5vcHMgPSAmbG05MF9vcHM7CisJZGF0YS0+Y2hpcC5pbmZvID0gZGF0YS0+aW5mbzsKKworCWRhdGEtPmluZm9bMF0gPSAmbG05MF9jaGlwX2luZm87CisJZGF0YS0+aW5mb1sxXSA9ICZkYXRhLT50ZW1wX2luZm87CisKKwlpbmZvID0gJmRhdGEtPnRlbXBfaW5mbzsKKwlpbmZvLT50eXBlID0gaHdtb25fdGVtcDsKKwlpbmZvLT5jb25maWcgPSBkYXRhLT5jaGFubmVsX2NvbmZpZzsKKworCWRhdGEtPmNoYW5uZWxfY29uZmlnWzBdID0gSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfTUlOIHwgSFdNT05fVF9NQVggfAorCQlIV01PTl9UX0NSSVQgfCBIV01PTl9UX0NSSVRfSFlTVCB8IEhXTU9OX1RfTUlOX0FMQVJNIHwKKwkJSFdNT05fVF9NQVhfQUxBUk0gfCBIV01PTl9UX0NSSVRfQUxBUk07CisJZGF0YS0+Y2hhbm5lbF9jb25maWdbMV0gPSBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NSU4gfCBIV01PTl9UX01BWCB8CisJCUhXTU9OX1RfQ1JJVCB8IEhXTU9OX1RfQ1JJVF9IWVNUIHwgSFdNT05fVF9NSU5fQUxBUk0gfAorCQlIV01PTl9UX01BWF9BTEFSTSB8IEhXTU9OX1RfQ1JJVF9BTEFSTSB8IEhXTU9OX1RfRkFVTFQ7CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfT0ZGU0VUKQorCQlkYXRhLT5jaGFubmVsX2NvbmZpZ1sxXSB8PSBIV01PTl9UX09GRlNFVDsKKworCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9FTUVSR0VOQ1kpIHsKKwkJZGF0YS0+Y2hhbm5lbF9jb25maWdbMF0gfD0gSFdNT05fVF9FTUVSR0VOQ1kgfAorCQkJSFdNT05fVF9FTUVSR0VOQ1lfSFlTVDsKKwkJZGF0YS0+Y2hhbm5lbF9jb25maWdbMV0gfD0gSFdNT05fVF9FTUVSR0VOQ1kgfAorCQkJSFdNT05fVF9FTUVSR0VOQ1lfSFlTVDsKKwl9CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfRU1FUkdFTkNZX0FMQVJNKSB7CisJCWRhdGEtPmNoYW5uZWxfY29uZmlnWzBdIHw9IEhXTU9OX1RfRU1FUkdFTkNZX0FMQVJNOworCQlkYXRhLT5jaGFubmVsX2NvbmZpZ1sxXSB8PSBIV01PTl9UX0VNRVJHRU5DWV9BTEFSTTsKKwl9CisKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfVEVNUDMpIHsKKwkJZGF0YS0+Y2hhbm5lbF9jb25maWdbMl0gPSBIV01PTl9UX0lOUFVUIHwKKwkJCUhXTU9OX1RfTUlOIHwgSFdNT05fVF9NQVggfAorCQkJSFdNT05fVF9DUklUIHwgSFdNT05fVF9DUklUX0hZU1QgfAorCQkJSFdNT05fVF9FTUVSR0VOQ1kgfCBIV01PTl9UX0VNRVJHRU5DWV9IWVNUIHwKKwkJCUhXTU9OX1RfTUlOX0FMQVJNIHwgSFdNT05fVF9NQVhfQUxBUk0gfAorCQkJSFdNT05fVF9DUklUX0FMQVJNIHwgSFdNT05fVF9FTUVSR0VOQ1lfQUxBUk0gfAorCQkJSFdNT05fVF9GQVVMVDsKKwl9CisKIAlkYXRhLT5yZWdfbG9jYWxfZXh0ID0gbG05MF9wYXJhbXNbZGF0YS0+a2luZF0ucmVnX2xvY2FsX2V4dDsKIAogCS8qIFNldCBtYXhpbXVtIGNvbnZlcnNpb24gcmF0ZSAqLwpAQCAtMTY3NywyMSArMTc0NiwxMCBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCi0JZGF0YS0+Z3JvdXBzW2dyb3VwcysrXSA9ICZsbTkwX2dyb3VwOwotCi0JaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX09GRlNFVCkKLQkJZGF0YS0+Z3JvdXBzW2dyb3VwcysrXSA9ICZsbTkwX3RlbXAyX29mZnNldF9ncm91cDsKLQotCWlmIChkYXRhLT5mbGFncyAmIExNOTBfSEFWRV9FTUVSR0VOQ1kpCi0JCWRhdGEtPmdyb3Vwc1tncm91cHMrK10gPSAmbG05MF9lbWVyZ2VuY3lfZ3JvdXA7Ci0KLQlpZiAoZGF0YS0+ZmxhZ3MgJiBMTTkwX0hBVkVfRU1FUkdFTkNZX0FMQVJNKQotCQlkYXRhLT5ncm91cHNbZ3JvdXBzKytdID0gJmxtOTBfZW1lcmdlbmN5X2FsYXJtX2dyb3VwOwotCi0JaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX1RFTVAzKQotCQlkYXRhLT5ncm91cHNbZ3JvdXBzKytdID0gJmxtOTBfdGVtcDNfZ3JvdXA7Ci0KKwkvKgorCSAqIFRoZSAncGVjJyBhdHRyaWJ1dGUgaXMgYXR0YWNoZWQgdG8gdGhlIGkyYyBkZXZpY2UgYW5kIHRodXMgY3JlYXRlZAorCSAqIHNlcGFyYXRlbHkuCisJICovCiAJaWYgKGNsaWVudC0+ZmxhZ3MgJiBJMkNfQ0xJRU5UX1BFQykgewogCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfcGVjKTsKIAkJaWYgKGVycikKQEAgLTE3MDEsOCArMTc1OSw5IEBACiAJCQlyZXR1cm4gZXJyOwogCX0KIAotCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAotCQkJCQkJCSAgIGRhdGEsIGRhdGEtPmdyb3Vwcyk7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9pbmZvKGRldiwgY2xpZW50LT5uYW1lLAorCQkJCQkJCSBkYXRhLCAmZGF0YS0+Y2hpcCwKKwkJCQkJCQkgTlVMTCk7CiAJaWYgKElTX0VSUihod21vbl9kZXYpKQogCQlyZXR1cm4gUFRSX0VSUihod21vbl9kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCmluZGV4IGNkZjE5YWQuLjhjNTczZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCkBAIC0xNSwyMiArMTUsMTcgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2RlZmluZSBERVZOQU1FICJsbTk1MjQxIgogCkBAIC01NCwyNiArNDksMjUgQEAKICNkZWZpbmUgTE05NTI0MV9SRUdfUldfUkVNT1RFX01PREVMCTB4MzAKIAogLyogTE05NTI0MSBzcGVjaWZpYyBiaXRmaWVsZHMgKi8KLSNkZWZpbmUgQ0ZHX1NUT1AgMHg0MAotI2RlZmluZSBDRkdfQ1IwMDc2IDB4MDAKLSNkZWZpbmUgQ0ZHX0NSMDE4MiAweDEwCi0jZGVmaW5lIENGR19DUjEwMDAgMHgyMAotI2RlZmluZSBDRkdfQ1IyNzAwIDB4MzAKLSNkZWZpbmUgUjFNU19TSElGVCAwCi0jZGVmaW5lIFIyTVNfU0hJRlQgMgotI2RlZmluZSBSMU1TX01BU0sgKDB4MDEgPDwgKFIxTVNfU0hJRlQpKQotI2RlZmluZSBSMk1TX01BU0sgKDB4MDEgPDwgKFIyTVNfU0hJRlQpKQotI2RlZmluZSBSMURGX1NISUZUIDEKLSNkZWZpbmUgUjJERl9TSElGVCAyCi0jZGVmaW5lIFIxREZfTUFTSyAoMHgwMSA8PCAoUjFERl9TSElGVCkpCi0jZGVmaW5lIFIyREZfTUFTSyAoMHgwMSA8PCAoUjJERl9TSElGVCkpCi0jZGVmaW5lIFIxRkVfTUFTSyAweDAxCi0jZGVmaW5lIFIyRkVfTUFTSyAweDA1Ci0jZGVmaW5lIFRUMV9TSElGVCAwCi0jZGVmaW5lIFRUMl9TSElGVCA0Ci0jZGVmaW5lIFRUX09GRiAwCi0jZGVmaW5lIFRUX09OIDEKLSNkZWZpbmUgVFRfTUFTSyA3CisjZGVmaW5lIENGR19TVE9QCUJJVCg2KQorI2RlZmluZSBDRkdfQ1IwMDc2CTB4MDAKKyNkZWZpbmUgQ0ZHX0NSMDE4MglCSVQoNCkKKyNkZWZpbmUgQ0ZHX0NSMTAwMAlCSVQoNSkKKyNkZWZpbmUgQ0ZHX0NSMjcwMAkoQklUKDQpIHwgQklUKDUpKQorI2RlZmluZSBDRkdfQ1JNQVNLCShCSVQoNCkgfCBCSVQoNSkpCisjZGVmaW5lIFIxTVNfTUFTSwlCSVQoMCkKKyNkZWZpbmUgUjJNU19NQVNLCUJJVCgyKQorI2RlZmluZSBSMURGX01BU0sJQklUKDEpCisjZGVmaW5lIFIyREZfTUFTSwlCSVQoMikKKyNkZWZpbmUgUjFGRV9NQVNLCUJJVCgwKQorI2RlZmluZSBSMkZFX01BU0sJQklUKDIpCisjZGVmaW5lIFIxRE0JCUJJVCgwKQorI2RlZmluZSBSMkRNCQlCSVQoMSkKKyNkZWZpbmUgVFQxX1NISUZUCTAKKyNkZWZpbmUgVFQyX1NISUZUCTQKKyNkZWZpbmUgVFRfT0ZGCQkwCisjZGVmaW5lIFRUX09OCQkxCisjZGVmaW5lIFRUX01BU0sJCTcKICNkZWZpbmUgTkFUU0VNSV9NQU5fSUQJMHgwMQogI2RlZmluZSBMTTk1MjMxX0NISVBfSUQJMHhBMQogI2RlZmluZSBMTTk1MjQxX0NISVBfSUQJMHhBNApAQCAtOTEsMTEgKzg1LDEyIEBACiBzdHJ1Y3QgbG05NTI0MV9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKLQl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZCwgaW50ZXJ2YWw7CS8qIGluIGppZmZpZXMgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogaW4gamlmZmllcyAqLworCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7CQkvKiBpbiBtaWxsaS1zZWNvbmRzICovCiAJY2hhciB2YWxpZDsJCS8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KIAkvKiByZWdpc3RlcnMgdmFsdWVzICovCiAJdTggdGVtcFtBUlJBWV9TSVpFKGxtOTUyNDFfcmVnX2FkZHJlc3MpXTsKLQl1OCBjb25maWcsIG1vZGVsLCB0cnV0aGVybTsKKwl1OCBzdGF0dXMsIGNvbmZpZywgbW9kZWwsIHRydXRoZXJtOwogfTsKIAogLyogQ29udmVyc2lvbnMgKi8KQEAgLTExOCw3ICsxMTMsOCBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgZGF0YS0+aW50ZXJ2YWwpIHx8CisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkCisJCSAgICAgICArIG1zZWNzX3RvX2ppZmZpZXMoZGF0YS0+aW50ZXJ2YWwpKSB8fAogCSAgICAhZGF0YS0+dmFsaWQpIHsKIAkJaW50IGk7CiAKQEAgLTEyNyw2ICsxMjMsOSBAQAogCQkJZGF0YS0+dGVtcFtpXQogCQkJICA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCiAJCQkJCQkgICAgIGxtOTUyNDFfcmVnX2FkZHJlc3NbaV0pOworCisJCWRhdGEtPnN0YXR1cyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQkJTE05NTI0MV9SRUdfUl9TVEFUVVMpOwogCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOwogCQlkYXRhLT52YWxpZCA9IDE7CiAJfQpAQCAtMTM2LDE5NyArMTM1LDI0MSBAQAogCXJldHVybiBkYXRhOwogfQogCi0vKiBTeXNmcyBzdHVmZiAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGxtOTUyNDFfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWRcbiIsCi0JCQlpbmRleCA9PSAwIHx8IChkYXRhLT5jb25maWcgJiAoMSA8PCAoaW5kZXggLyAyKSkpID8KLQkJdGVtcF9mcm9tX3JlZ19zaWduZWQoZGF0YS0+dGVtcFtpbmRleF0sIGRhdGEtPnRlbXBbaW5kZXggKyAxXSkgOgotCQl0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKGRhdGEtPnRlbXBbaW5kZXhdLAotCQkJCSAgICAgICBkYXRhLT50ZW1wW2luZGV4ICsgMV0pKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2hvd190eXBlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY2hhciAqYnVmKQorc3RhdGljIGludCBsbTk1MjQxX3JlYWRfY2hpcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgbG9uZyAqdmFsKQogewogCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCi0JCWRhdGEtPm1vZGVsICYgdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleCA/ICIxXG4iIDogIjJcbiIpOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWw6CisJCSp2YWwgPSBkYXRhLT5pbnRlcnZhbDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2V0X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIGludCBsbTk1MjQxX3JlYWRfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgbG9uZyAqdmFsKQoreworCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBsbTk1MjQxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwkJaWYgKCFjaGFubmVsIHx8IChkYXRhLT5jb25maWcgJiBCSVQoY2hhbm5lbCAtIDEpKSkKKwkJCSp2YWwgPSB0ZW1wX2Zyb21fcmVnX3NpZ25lZChkYXRhLT50ZW1wW2NoYW5uZWwgKiAyXSwKKwkJCQkJCWRhdGEtPnRlbXBbY2hhbm5lbCAqIDIgKyAxXSk7CisJCWVsc2UKKwkJCSp2YWwgPSB0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKGRhdGEtPnRlbXBbY2hhbm5lbCAqIDJdLAorCQkJCQkJZGF0YS0+dGVtcFtjaGFubmVsICogMiArIDFdKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX21pbjoKKwkJaWYgKGNoYW5uZWwgPT0gMSkKKwkJCSp2YWwgPSAoZGF0YS0+Y29uZmlnICYgUjFERl9NQVNLKSA/IC0xMjgwMDAgOiAwOworCQllbHNlCisJCQkqdmFsID0gKGRhdGEtPmNvbmZpZyAmIFIyREZfTUFTSykgPyAtMTI4MDAwIDogMDsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJaWYgKGNoYW5uZWwgPT0gMSkKKwkJCSp2YWwgPSAoZGF0YS0+Y29uZmlnICYgUjFERl9NQVNLKSA/IDEyNzg3NSA6IDI1NTg3NTsKKwkJZWxzZQorCQkJKnZhbCA9IChkYXRhLT5jb25maWcgJiBSMkRGX01BU0spID8gMTI3ODc1IDogMjU1ODc1OworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfdHlwZToKKwkJaWYgKGNoYW5uZWwgPT0gMSkKKwkJCSp2YWwgPSAoZGF0YS0+bW9kZWwgJiBSMU1TX01BU0spID8gMSA6IDI7CisJCWVsc2UKKwkJCSp2YWwgPSAoZGF0YS0+bW9kZWwgJiBSMk1TX01BU0spID8gMSA6IDI7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9mYXVsdDoKKwkJaWYgKGNoYW5uZWwgPT0gMSkKKwkJCSp2YWwgPSAhIShkYXRhLT5zdGF0dXMgJiBSMURNKTsKKwkJZWxzZQorCQkJKnZhbCA9ICEhKGRhdGEtPnN0YXR1cyAmIFIyRE0pOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgaW50IGxtOTUyNDFfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQl1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2NoaXA6CisJCXJldHVybiBsbTk1MjQxX3JlYWRfY2hpcChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl90ZW1wOgorCQlyZXR1cm4gbG05NTI0MV9yZWFkX3RlbXAoZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbG05NTI0MV93cml0ZV9jaGlwKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICAgbG9uZyB2YWwpCit7CisJc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBjb252cmF0ZTsKKwl1OCBjb25maWc7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWw6CisJCWNvbmZpZyA9IGRhdGEtPmNvbmZpZyAmIH5DRkdfQ1JNQVNLOworCQlpZiAodmFsIDwgMTMwKSB7CisJCQljb252cmF0ZSA9IDc2OworCQkJY29uZmlnIHw9IENGR19DUjAwNzY7CisJCX0gZWxzZSBpZiAodmFsIDwgNTkwKSB7CisJCQljb252cmF0ZSA9IDE4MjsKKwkJCWNvbmZpZyB8PSBDRkdfQ1IwMTgyOworCQl9IGVsc2UgaWYgKHZhbCA8IDE4NTApIHsKKwkJCWNvbnZyYXRlID0gMTAwMDsKKwkJCWNvbmZpZyB8PSBDRkdfQ1IxMDAwOworCQl9IGVsc2UgeworCQkJY29udnJhdGUgPSAyNzAwOworCQkJY29uZmlnIHw9IENGR19DUjI3MDA7CisJCX0KKwkJZGF0YS0+aW50ZXJ2YWwgPSBjb252cmF0ZTsKKwkJZGF0YS0+Y29uZmlnID0gY29uZmlnOworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJCUxNOTUyNDFfUkVHX1JXX0NPTkZJRywgY29uZmlnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxtOTUyNDFfd3JpdGVfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgIGxvbmcgdmFsKQogewogCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBzaGlmdDsKLQl1OCBtYXNrID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQotCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzaGlmdCA9IG1hc2sgPT0gUjFNU19NQVNLID8gVFQxX1NISUZUIDogVFQyX1NISUZUOworCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLQlkYXRhLT50cnV0aGVybSAmPSB+KFRUX01BU0sgPDwgc2hpZnQpOwotCWlmICh2YWwgPT0gMSkgewotCQlkYXRhLT5tb2RlbCB8PSBtYXNrOwotCQlkYXRhLT50cnV0aGVybSB8PSAoVFRfT04gPDwgc2hpZnQpOwotCX0gZWxzZSB7Ci0JCWRhdGEtPm1vZGVsICY9IH5tYXNrOwotCQlkYXRhLT50cnV0aGVybSB8PSAoVFRfT0ZGIDw8IHNoaWZ0KTsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfbWluOgorCQlpZiAoY2hhbm5lbCA9PSAxKSB7CisJCQlpZiAodmFsIDwgMCkKKwkJCQlkYXRhLT5jb25maWcgfD0gUjFERl9NQVNLOworCQkJZWxzZQorCQkJCWRhdGEtPmNvbmZpZyAmPSB+UjFERl9NQVNLOworCQl9IGVsc2UgeworCQkJaWYgKHZhbCA8IDApCisJCQkJZGF0YS0+Y29uZmlnIHw9IFIyREZfTUFTSzsKKwkJCWVsc2UKKwkJCQlkYXRhLT5jb25maWcgJj0gflIyREZfTUFTSzsKKwkJfQorCQlkYXRhLT52YWxpZCA9IDA7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsCisJCQkJCQlkYXRhLT5jb25maWcpOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlpZiAoY2hhbm5lbCA9PSAxKSB7CisJCQlpZiAodmFsIDw9IDEyNzg3NSkKKwkJCQlkYXRhLT5jb25maWcgfD0gUjFERl9NQVNLOworCQkJZWxzZQorCQkJCWRhdGEtPmNvbmZpZyAmPSB+UjFERl9NQVNLOworCQl9IGVsc2UgeworCQkJaWYgKHZhbCA8PSAxMjc4NzUpCisJCQkJZGF0YS0+Y29uZmlnIHw9IFIyREZfTUFTSzsKKwkJCWVsc2UKKwkJCQlkYXRhLT5jb25maWcgJj0gflIyREZfTUFTSzsKKwkJfQorCQlkYXRhLT52YWxpZCA9IDA7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQxX1JFR19SV19DT05GSUcsCisJCQkJCQlkYXRhLT5jb25maWcpOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfdHlwZToKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNoYW5uZWwgPT0gMSkgeworCQkJZGF0YS0+dHJ1dGhlcm0gJj0gfihUVF9NQVNLIDw8IFRUMV9TSElGVCk7CisJCQlpZiAodmFsID09IDEpIHsKKwkJCQlkYXRhLT5tb2RlbCB8PSBSMU1TX01BU0s7CisJCQkJZGF0YS0+dHJ1dGhlcm0gfD0gKFRUX09OIDw8IFRUMV9TSElGVCk7CisJCQl9IGVsc2UgeworCQkJCWRhdGEtPm1vZGVsICY9IH5SMU1TX01BU0s7CisJCQkJZGF0YS0+dHJ1dGhlcm0gfD0gKFRUX09GRiA8PCBUVDFfU0hJRlQpOworCQkJfQorCQl9IGVsc2UgeworCQkJZGF0YS0+dHJ1dGhlcm0gJj0gfihUVF9NQVNLIDw8IFRUMl9TSElGVCk7CisJCQlpZiAodmFsID09IDEpIHsKKwkJCQlkYXRhLT5tb2RlbCB8PSBSMk1TX01BU0s7CisJCQkJZGF0YS0+dHJ1dGhlcm0gfD0gKFRUX09OIDw8IFRUMl9TSElGVCk7CisJCQl9IGVsc2UgeworCQkJCWRhdGEtPm1vZGVsICY9IH5SMk1TX01BU0s7CisJCQkJZGF0YS0+dHJ1dGhlcm0gfD0gKFRUX09GRiA8PCBUVDJfU0hJRlQpOworCQkJfQorCQl9CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJTE05NTI0MV9SRUdfUldfUkVNT1RFX01PREVMLAorCQkJCQkJZGF0YS0+bW9kZWwpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfVFJVVEhFUk0sCisJCQkJCQlkYXRhLT50cnV0aGVybSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKIAl9Ci0JZGF0YS0+dmFsaWQgPSAwOwotCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX1JFTU9URV9NT0RFTCwKLQkJCQkgIGRhdGEtPm1vZGVsKTsKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0MV9SRUdfUldfVFJVVEhFUk0sCi0JCQkJICBkYXRhLT50cnV0aGVybSk7CiAKIAltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKQorc3RhdGljIGludCBsbTk1MjQxX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCSB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgdmFsKQogewotCXN0cnVjdCBsbTk1MjQxX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsCi0JCQlkYXRhLT5jb25maWcgJiB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4ID8KLQkJCSItMTI3MDAwXG4iIDogIjBcbiIpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJcmV0dXJuIGxtOTUyNDFfd3JpdGVfY2hpcChkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl90ZW1wOgorCQlyZXR1cm4gbG05NTI0MV93cml0ZV90ZW1wKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgc3NpemVfdCBzZXRfbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyB1bW9kZV90IGxtOTUyNDFfaXNfdmlzaWJsZShjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCQkgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JbG9uZyB2YWw7Ci0KLQlpZiAoa3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh2YWwgPCAtMTI4MDAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmICh2YWwgPCAwKQotCQlkYXRhLT5jb25maWcgfD0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQllbHNlCi0JCWRhdGEtPmNvbmZpZyAmPSB+dG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQlkYXRhLT52YWxpZCA9IDA7Ci0KLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLAotCQkJCSAgZGF0YS0+Y29uZmlnKTsKLQotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuIGNvdW50OworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJc3dpdGNoIChhdHRyKSB7CisJCWNhc2UgaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWw6CisJCQlyZXR1cm4gU19JUlVHTyB8IFNfSVdVU1I7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wOgorCQlzd2l0Y2ggKGF0dHIpIHsKKwkJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQkJcmV0dXJuIFNfSVJVR087CisJCWNhc2UgaHdtb25fdGVtcF9mYXVsdDoKKwkJCXJldHVybiBTX0lSVUdPOworCQljYXNlIGh3bW9uX3RlbXBfbWluOgorCQljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQljYXNlIGh3bW9uX3RlbXBfdHlwZToKKwkJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGxtOTUyNDFfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwKLQkJCWRhdGEtPmNvbmZpZyAmIHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXggPwotCQkJIjEyNzAwMFxuIiA6ICIyNTUwMDBcbiIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JbG9uZyB2YWw7Ci0KLQlpZiAoa3N0cnRvbChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh2YWwgPj0gMjU2MDAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmICh2YWwgPD0gMTI3MDAwKQotCQlkYXRhLT5jb25maWcgfD0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQllbHNlCi0JCWRhdGEtPmNvbmZpZyAmPSB+dG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQlkYXRhLT52YWxpZCA9IDA7Ci0KLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgTE05NTI0MV9SRUdfUldfQ09ORklHLAotCQkJCSAgZGF0YS0+Y29uZmlnKTsKLQotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gbG05NTI0MV91cGRhdGVfZGV2aWNlKGRldik7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWx1XG4iLCAxMDAwICogZGF0YS0+aW50ZXJ2YWwKLQkJCS8gSFopOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0KLQlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRhdGEtPmludGVydmFsID0gdmFsICogSFogLyAxMDAwOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5wdXQsIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd19pbnB1dCwgTlVMTCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX3R5cGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3R5cGUsIHNldF90eXBlLAotCQkJICBSMU1TX01BU0spOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM190eXBlLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd190eXBlLCBzZXRfdHlwZSwKLQkJCSAgUjJNU19NQVNLKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19taW4sIHNldF9taW4sCi0JCQkgIFIxREZfTUFTSyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbWluLCBzZXRfbWluLAotCQkJICBSMkRGX01BU0spOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X21heCwgc2V0X21heCwKLQkJCSAgUjFERl9NQVNLKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19tYXgsIHNldF9tYXgsCi0JCQkgIFIyREZfTUFTSyk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2ludGVydmFsLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbnRlcnZhbCwKLQkJICAgc2V0X2ludGVydmFsKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTUyNDFfYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX3R5cGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX3R5cGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21pbi5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWluLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXguZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21heC5kZXZfYXR0ci5hdHRyLAotCSZkZXZfYXR0cl91cGRhdGVfaW50ZXJ2YWwuYXR0ciwKLQlOVUxMCi19OwotQVRUUklCVVRFX0dST1VQUyhsbTk1MjQxKTsKLQogLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCiBzdGF0aWMgaW50IGxtOTUyNDFfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LAogCQkJICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8pCkBAIC0zNjIsOCArNDA1LDggQEAKIHN0YXRpYyB2b2lkIGxtOTUyNDFfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCQlzdHJ1Y3QgbG05NTI0MV9kYXRhICpkYXRhKQogewotCWRhdGEtPmludGVydmFsID0gSFo7CS8qIDEgc2VjIGRlZmF1bHQgKi8KLQlkYXRhLT5jb25maWcgPSBDRkdfQ1IwMDc2OworCWRhdGEtPmludGVydmFsID0gMTAwMDsKKwlkYXRhLT5jb25maWcgPSBDRkdfQ1IxMDAwOwogCWRhdGEtPnRydXRoZXJtID0gKFRUX09GRiA8PCBUVDFfU0hJRlQpIHwgKFRUX09GRiA8PCBUVDJfU0hJRlQpOwogCiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDFfUkVHX1JXX0NPTkZJRywgZGF0YS0+Y29uZmlnKTsKQEAgLTM3NSw2ICs0MTgsNDcgQEAKIAkJCQkgIGRhdGEtPm1vZGVsKTsKIH0KIAorc3RhdGljIGNvbnN0IHUzMiBsbTk1MjQxX2NoaXBfY29uZmlnW10gPSB7CisJSFdNT05fQ19VUERBVEVfSU5URVJWQUwsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbG05NTI0MV9jaGlwID0geworCS50eXBlID0gaHdtb25fY2hpcCwKKwkuY29uZmlnID0gbG05NTI0MV9jaGlwX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgbG05NTI0MV90ZW1wX2NvbmZpZ1tdID0geworCUhXTU9OX1RfSU5QVVQsCisJSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfTUFYIHwgSFdNT05fVF9NSU4gfCBIV01PTl9UX1RZUEUgfAorCQlIV01PTl9UX0ZBVUxULAorCUhXTU9OX1RfSU5QVVQgfCBIV01PTl9UX01BWCB8IEhXTU9OX1RfTUlOIHwgSFdNT05fVF9UWVBFIHwKKwkJSFdNT05fVF9GQVVMVCwKKwkwCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBsbTk1MjQxX3RlbXAgPSB7CisJLnR5cGUgPSBod21vbl90ZW1wLAorCS5jb25maWcgPSBsbTk1MjQxX3RlbXBfY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKmxtOTUyNDFfaW5mb1tdID0geworCSZsbTk1MjQxX2NoaXAsCisJJmxtOTUyNDFfdGVtcCwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBsbTk1MjQxX2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IGxtOTUyNDFfaXNfdmlzaWJsZSwKKwkucmVhZCA9IGxtOTUyNDFfcmVhZCwKKwkud3JpdGUgPSBsbTk1MjQxX3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gbG05NTI0MV9jaGlwX2luZm8gPSB7CisJLm9wcyA9ICZsbTk1MjQxX2h3bW9uX29wcywKKwkuaW5mbyA9IGxtOTUyNDFfaW5mbywKK307CisKIHN0YXRpYyBpbnQgbG05NTI0MV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKQEAgLTM5Miw5ICs0NzYsMTAgQEAKIAkvKiBJbml0aWFsaXplIHRoZSBMTTk1MjQxIGNoaXAgKi8KIAlsbTk1MjQxX2luaXRfY2xpZW50KGNsaWVudCwgZGF0YSk7CiAKLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBjbGllbnQtPm5hbWUsCiAJCQkJCQkJICAgZGF0YSwKLQkJCQkJCQkgICBsbTk1MjQxX2dyb3Vwcyk7CisJCQkJCQkJICAgJmxtOTUyNDFfY2hpcF9pbmZvLAorCQkJCQkJCSAgIE5VTEwpOwogCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIApAQCAtNDIwLDUgKzUwNSw1IEBACiBtb2R1bGVfaTJjX2RyaXZlcihsbTk1MjQxX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkRhdmlkZSBSaXp6byA8ZWxwYS5yaXp6b0BnbWFpbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkxNOTUyNDEgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMTTk1MjMxL0xNOTUyNDEgc2Vuc29yIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9sbTk1MjQ1LmMgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDUuYwppbmRleCBlN2FlZjQ1Li5hM2JmZDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDUuYworKysgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDUuYwpAQCAtMTUsMjIgKzE1LDE2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi5oPgotI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKIAkweDE4LCAweDE5LCAweDI5LCAweDRjLCAweDRkLCBJMkNfQ0xJRU5UX0VORCB9OwpAQCAtODksNiArODMsNyBAQAogI2RlZmluZSBSQVRFX0NSMTAwMAkweDAyCiAjZGVmaW5lIFJBVEVfQ1IyNTAwCTB4MDMKIAorI2RlZmluZSBTVEFUVVMxX1JPUwkJMHgxMAogI2RlZmluZSBTVEFUVVMxX0RJT0RFX0ZBVUxUCTB4MDQKICNkZWZpbmUgU1RBVFVTMV9SVENSSVQJCTB4MDIKICNkZWZpbmUgU1RBVFVTMV9MT0MJCTB4MDEKQEAgLTExMiwxNCArMTA3LDkgQEAKIAogLyogQ2xpZW50IGRhdGEgKGVhY2ggY2xpZW50IGdldHMgaXRzIG93bikgKi8KIHN0cnVjdCBsbTk1MjQ1X2RhdGEgewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXN0cnVjdCBtdXRleCB1cGRhdGVfbG9jazsKLQl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogaW4gamlmZmllcyAqLwotCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7CS8qIGluIG1zZWNzICovCi0JYm9vbCB2YWxpZDsJCS8qIHplcm8gdW50aWwgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KLQkvKiByZWdpc3RlcnMgdmFsdWVzICovCi0JdTggcmVnc1tBUlJBWV9TSVpFKGxtOTUyNDVfcmVnX2FkZHJlc3MpXTsKLQl1OCBjb25maWcxLCBjb25maWcyOworCWludCBpbnRlcnZhbDsJLyogaW4gbXNlY3MgKi8KIH07CiAKIC8qIENvbnZlcnNpb25zICovCkBAIC0xMzUsNjAgKzEyNSwzNiBAQAogCXJldHVybiB0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKHZhbF9oLCB2YWxfbCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbG05NTI0NV9kYXRhICpsbTk1MjQ1X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBsbTk1MjQ1X3JlYWRfY29udmVyc2lvbl9yYXRlKHN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEpCiB7Ci0Jc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJdW5zaWduZWQgaW50IHJhdGU7CisJaW50IHJldDsKIAotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZAotCQkrIG1zZWNzX3RvX2ppZmZpZXMoZGF0YS0+aW50ZXJ2YWwpKSB8fCAhZGF0YS0+dmFsaWQpIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobG05NTI0NV9yZWdfYWRkcmVzcyk7IGkrKykKLQkJCWRhdGEtPnJlZ3NbaV0KLQkJCSAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQkJCQkJICAgICBsbTk1MjQ1X3JlZ19hZGRyZXNzW2ldKTsKLQkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKLQkJZGF0YS0+dmFsaWQgPSAxOwotCX0KLQotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxtOTUyNDVfcmVhZF9jb252ZXJzaW9uX3JhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlpbnQgcmF0ZTsKLQl1bnNpZ25lZCBsb25nIGludGVydmFsOwotCi0JcmF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTlZFUlNfUkFURSk7CisJcmV0ID0gcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFwLCBMTTk1MjQ1X1JFR19SV19DT05WRVJTX1JBVEUsICZyYXRlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCXN3aXRjaCAocmF0ZSkgewogCWNhc2UgUkFURV9DUjAwNjM6Ci0JCWludGVydmFsID0gNjM7CisJCWRhdGEtPmludGVydmFsID0gNjM7CiAJCWJyZWFrOwogCWNhc2UgUkFURV9DUjAzNjQ6Ci0JCWludGVydmFsID0gMzY0OworCQlkYXRhLT5pbnRlcnZhbCA9IDM2NDsKIAkJYnJlYWs7CiAJY2FzZSBSQVRFX0NSMTAwMDoKLQkJaW50ZXJ2YWwgPSAxMDAwOworCQlkYXRhLT5pbnRlcnZhbCA9IDEwMDA7CiAJCWJyZWFrOwogCWNhc2UgUkFURV9DUjI1MDA6CiAJZGVmYXVsdDoKLQkJaW50ZXJ2YWwgPSAyNTAwOworCQlkYXRhLT5pbnRlcnZhbCA9IDI1MDA7CiAJCWJyZWFrOwogCX0KLQotCXJldHVybiBpbnRlcnZhbDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG05NTI0NV9zZXRfY29udmVyc2lvbl9yYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQl1bnNpZ25lZCBsb25nIGludGVydmFsKQorc3RhdGljIGludCBsbTk1MjQ1X3NldF9jb252ZXJzaW9uX3JhdGUoc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSwgbG9uZyBpbnRlcnZhbCkKIHsKLQlpbnQgcmF0ZTsKKwlpbnQgcmV0LCByYXRlOwogCiAJaWYgKGludGVydmFsIDw9IDYzKSB7CiAJCWludGVydmFsID0gNjM7CkBAIC0yMDQsMjIwICsxNzAsMjg4IEBACiAJCXJhdGUgPSBSQVRFX0NSMjUwMDsKIAl9CiAKLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0NV9SRUdfUldfQ09OVkVSU19SQVRFLCByYXRlKTsKKwlyZXQgPSByZWdtYXBfd3JpdGUoZGF0YS0+cmVnbWFwLCBMTTk1MjQ1X1JFR19SV19DT05WRVJTX1JBVEUsIHJhdGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIGludGVydmFsOworCWRhdGEtPmludGVydmFsID0gaW50ZXJ2YWw7CisJcmV0dXJuIDA7CiB9CiAKLS8qIFN5c2ZzIHN0dWZmICovCi1zdGF0aWMgc3NpemVfdCBzaG93X2lucHV0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IHRlbXA7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQotCS8qCi0JICogSW5kZXggMCAoTG9jYWwgdGVtcCkgaXMgYWx3YXlzIHNpZ25lZAotCSAqIEluZGV4IDIgKFJlbW90ZSB0ZW1wKSBoYXMgYm90aCBzaWduZWQgYW5kIHVuc2lnbmVkIGRhdGEKLQkgKiB1c2Ugc2lnbmVkIGNhbGN1bGF0aW9uIGZvciByZW1vdGUgaWYgc2lnbmVkIGJpdCBpcyBzZXQKLQkgKi8KLQlpZiAoaW5kZXggPT0gMCB8fCBkYXRhLT5yZWdzW2luZGV4XSAmIDB4ODApCi0JCXRlbXAgPSB0ZW1wX2Zyb21fcmVnX3NpZ25lZChkYXRhLT5yZWdzW2luZGV4XSwKLQkJCSAgICBkYXRhLT5yZWdzW2luZGV4ICsgMV0pOwotCWVsc2UKLQkJdGVtcCA9IHRlbXBfZnJvbV9yZWdfdW5zaWduZWQoZGF0YS0+cmVnc1tpbmRleCArIDJdLAotCQkJICAgIGRhdGEtPnJlZ3NbaW5kZXggKyAzXSk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWRcbiIsIHRlbXApOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X2xpbWl0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY2hhciAqYnVmKQotewotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBsbTk1MjQ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLAotCQkJZGF0YS0+cmVnc1tpbmRleF0gKiAxMDAwKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X2xpbWl0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBpbnQgbG05NTI0NV9yZWFkX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgIGxvbmcgKnZhbCkKIHsKIAlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCXVuc2lnbmVkIGxvbmcgdmFsOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRhdGEtPnJlZ21hcDsKKwlpbnQgcmV0LCByZWdsLCByZWdoLCByZWd2YWxsLCByZWd2YWxoOwogCi0JaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl2YWwgLz0gMTAwMDsKLQotCXZhbCA9IGNsYW1wX3ZhbCh2YWwsIDAsIChpbmRleCA9PSA2ID8gMTI3IDogMjU1KSk7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlkYXRhLT52YWxpZCA9IDA7Ci0KLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgbG05NTI0NV9yZWdfYWRkcmVzc1tpbmRleF0sIHZhbCk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCXJldHVybiBjb3VudDsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCXJlZ2wgPSBjaGFubmVsID8gTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUExfUyA6CisJCQkJIExNOTUyNDVfUkVHX1JfTE9DQUxfVEVNUExfUzsKKwkJcmVnaCA9IGNoYW5uZWwgPyBMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QSF9TIDoKKwkJCQkgTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QSF9TOworCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIHJlZ2wsICZyZWd2YWxsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIHJlZ2gsICZyZWd2YWxoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkvKgorCQkgKiBMb2NhbCB0ZW1wIGlzIGFsd2F5cyBzaWduZWQuCisJCSAqIFJlbW90ZSB0ZW1wIGhhcyBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQgZGF0YS4KKwkJICogVXNlIHNpZ25lZCBjYWxjdWxhdGlvbiBmb3IgcmVtb3RlIGlmIHNpZ25lZCBiaXQgaXMgc2V0CisJCSAqIG9yIGlmIHJlcG9ydGVkIHRlbXBlcmF0dXJlIGlzIGJlbG93IHNpZ25lZCBsaW1pdC4KKwkJICovCisJCWlmICghY2hhbm5lbCB8fCAocmVndmFsaCAmIDB4ODApIHx8IHJlZ3ZhbGggPCAweDdmKSB7CisJCQkqdmFsID0gdGVtcF9mcm9tX3JlZ19zaWduZWQocmVndmFsaCwgcmVndmFsbCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1UsCisJCQkJICAmcmVndmFsbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QSF9VLAorCQkJCSAgJnJlZ3ZhbGgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSB0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKHJlZ3ZhbGgsIHJlZ3ZhbGwpOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PU19MSU1JVCwKKwkJCQkgICZyZWd2YWxoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gcmVndmFsaCAqIDEwMDA7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9jcml0OgorCQlyZWdoID0gY2hhbm5lbCA/IExNOTUyNDVfUkVHX1JXX1JFTU9URV9UQ1JJVF9MSU1JVCA6CisJCQkJIExNOTUyNDVfUkVHX1JXX0xPQ0FMX09TX1RDUklUX0xJTUlUOworCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIHJlZ2gsICZyZWd2YWxoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gcmVndmFsaCAqIDEwMDA7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9tYXhfaHlzdDoKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SV19SRU1PVEVfT1NfTElNSVQsCisJCQkJICAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SV19DT01NT05fSFlTVEVSRVNJUywKKwkJCQkgICZyZWd2YWxsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gKHJlZ3ZhbGggLSByZWd2YWxsKSAqIDEwMDA7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9jcml0X2h5c3Q6CisJCXJlZ2ggPSBjaGFubmVsID8gTE05NTI0NV9SRUdfUldfUkVNT1RFX1RDUklUX0xJTUlUIDoKKwkJCQkgTE05NTI0NV9SRUdfUldfTE9DQUxfT1NfVENSSVRfTElNSVQ7CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgcmVnaCwgJnJlZ3ZhbGgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfQ09NTU9OX0hZU1RFUkVTSVMsCisJCQkJICAmcmVndmFsbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IChyZWd2YWxoIC0gcmVndmFsbCkgKiAxMDAwOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3RlbXBfdHlwZToKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SV19DT05GSUcyLCAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IChyZWd2YWxoICYgQ0ZHMl9SRU1PVEVfVFQpID8gMSA6IDI7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9vZmZzZXQ6CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfUkVNT1RFX09GRkwsCisJCQkJICAmcmVndmFsbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SV19SRU1PVEVfT0ZGSCwKKwkJCQkgICZyZWd2YWxoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gdGVtcF9mcm9tX3JlZ19zaWduZWQocmVndmFsaCwgcmVndmFsbCk7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9tYXhfYWxhcm06CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUl9TVEFUVVMxLCAmcmVndmFsaCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9ICEhKHJlZ3ZhbGggJiBTVEFUVVMxX1JPUyk7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9jcml0X2FsYXJtOgorCQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIExNOTUyNDVfUkVHX1JfU1RBVFVTMSwgJnJlZ3ZhbGgpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSAhIShyZWd2YWxoICYgKGNoYW5uZWwgPyBTVEFUVVMxX1JUQ1JJVCA6IFNUQVRVUzFfTE9DKSk7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fdGVtcF9mYXVsdDoKKwkJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBMTTk1MjQ1X1JFR19SX1NUQVRVUzEsICZyZWd2YWxoKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gISEocmVndmFsaCAmIFNUQVRVUzFfRElPREVfRkFVTFQpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2NyaXRfaHlzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBsbTk1MjQ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwotCWludCBoeXN0ID0gZGF0YS0+cmVnc1tpbmRleF0gLSBkYXRhLT5yZWdzWzhdOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLCBoeXN0ICogMTAwMCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF9jcml0X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIGludCBsbTk1MjQ1X3dyaXRlX3RlbXAoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgICBsb25nIHZhbCkKIHsKIAlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBoeXN0LCBsaW1pdDsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBkYXRhLT5yZWdtYXA7CisJdW5zaWduZWQgaW50IHJlZ3ZhbDsKKwlpbnQgcmV0LCByZWc7CiAKLQlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWxpbWl0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgbG05NTI0NV9yZWdfYWRkcmVzc1tpbmRleF0pOwotCWh5c3QgPSBsaW1pdCAtIHZhbCAvIDEwMDA7Ci0JaHlzdCA9IGNsYW1wX3ZhbChoeXN0LCAwLCAzMSk7Ci0JZGF0YS0+cmVnc1s4XSA9IGh5c3Q7Ci0KLQkvKiBzaGFyZWQgY3JpdCBoeXN0ZXJlc2lzICovCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTU1PTl9IWVNURVJFU0lTLAotCQloeXN0KTsKLQotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JcmV0dXJuIGNvdW50OworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9tYXg6CisJCXZhbCA9IGNsYW1wX3ZhbCh2YWwgLyAxMDAwLCAwLCAyNTUpOworCQlyZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCBMTTk1MjQ1X1JFR19SV19SRU1PVEVfT1NfTElNSVQsIHZhbCk7CisJCXJldHVybiByZXQ7CisJY2FzZSBod21vbl90ZW1wX2NyaXQ6CisJCXJlZyA9IGNoYW5uZWwgPyBMTTk1MjQ1X1JFR19SV19SRU1PVEVfVENSSVRfTElNSVQgOgorCQkJCUxNOTUyNDVfUkVHX1JXX0xPQ0FMX09TX1RDUklUX0xJTUlUOworCQl2YWwgPSBjbGFtcF92YWwodmFsIC8gMTAwMCwgMCwgY2hhbm5lbCA/IDI1NSA6IDEyNyk7CisJCXJldCA9IHJlZ21hcF93cml0ZShyZWdtYXAsIHJlZywgdmFsKTsKKwkJcmV0dXJuIHJldDsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfTE9DQUxfT1NfVENSSVRfTElNSVQsCisJCQkJICAmcmVndmFsKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQkvKiBDbGFtcCB0byByZWFzb25hYmxlIHJhbmdlIHRvIHByZXZlbnQgb3ZlcmZsb3cgKi8KKwkJdmFsID0gY2xhbXBfdmFsKHZhbCwgLTEwMDAwMDAsIDEwMDAwMDApOworCQl2YWwgPSByZWd2YWwgLSB2YWwgLyAxMDAwOworCQl2YWwgPSBjbGFtcF92YWwodmFsLCAwLCAzMSk7CisJCXJldCA9IHJlZ21hcF93cml0ZShyZWdtYXAsIExNOTUyNDVfUkVHX1JXX0NPTU1PTl9IWVNURVJFU0lTLAorCQkJCSAgIHZhbCk7CisJCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXR1cm4gcmV0OworCWNhc2UgaHdtb25fdGVtcF9vZmZzZXQ6CisJCXZhbCA9IGNsYW1wX3ZhbCh2YWwsIC0xMjgwMDAsIDEyNzg3NSk7CisJCXZhbCA9IHZhbCAqIDI1NiAvIDEwMDA7CisJCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0ID0gcmVnbWFwX3dyaXRlKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfUkVNT1RFX09GRkwsCisJCQkJICAgdmFsICYgMHhlMCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0ID0gcmVnbWFwX3dyaXRlKHJlZ21hcCwgTE05NTI0NV9SRUdfUldfUkVNT1RFX09GRkgsCisJCQkJICAgKHZhbCA+PiA4KSAmIDB4ZmYpOworCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwljYXNlIGh3bW9uX3RlbXBfdHlwZToKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIExNOTUyNDVfUkVHX1JXX0NPTkZJRzIsCisJCQkJCSBDRkcyX1JFTU9URV9UVCwKKwkJCQkJIHZhbCA9PSAxID8gQ0ZHMl9SRU1PVEVfVFQgOiAwKTsKKwkJcmV0dXJuIHJldDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjaGFyICpidWYpCitzdGF0aWMgaW50IGxtOTUyNDVfcmVhZF9jaGlwKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICBsb25nICp2YWwpCiB7CiAJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwKLQkJZGF0YS0+Y29uZmlnMiAmIENGRzJfUkVNT1RFX1RUID8gIjFcbiIgOiAiMlxuIik7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9jaGlwX3VwZGF0ZV9pbnRlcnZhbDoKKwkJKnZhbCA9IGRhdGEtPmludGVydmFsOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgc3NpemVfdCBzZXRfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IGxtOTUyNDVfd3JpdGVfY2hpcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgIGxvbmcgdmFsKQogewogCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CiAKLQlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JaWYgKHZhbCA9PSAxKQotCQlkYXRhLT5jb25maWcyIHw9IENGRzJfUkVNT1RFX1RUOwotCWVsc2UKLQkJZGF0YS0+Y29uZmlnMiAmPSB+Q0ZHMl9SRU1PVEVfVFQ7Ci0KLQlkYXRhLT52YWxpZCA9IDA7Ci0KLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0NV9SRUdfUldfQ09ORklHMiwKLQkJCQkgIGRhdGEtPmNvbmZpZzIpOwotCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlyZXR1cm4gY291bnQ7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9jaGlwX3VwZGF0ZV9pbnRlcnZhbDoKKwkJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCQlyZXQgPSBsbTk1MjQ1X3NldF9jb252ZXJzaW9uX3JhdGUoZGF0YSwgdmFsKTsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJCXJldHVybiByZXQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbG05NTI0NV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCXUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKQogewotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBsbTk1MjQ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLAotCQkJISEoZGF0YS0+cmVnc1s5XSAmIGluZGV4KSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9jaGlwOgorCQlyZXR1cm4gbG05NTI0NV9yZWFkX2NoaXAoZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIGxtOTUyNDVfcmVhZF90ZW1wKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbG05NTI0NV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHZhbCkKIHsKLQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLCAiJWx1XG4iLCBkYXRhLT5pbnRlcnZhbCk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9jaGlwOgorCQlyZXR1cm4gbG05NTI0NV93cml0ZV9jaGlwKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwljYXNlIGh3bW9uX3RlbXA6CisJCXJldHVybiBsbTk1MjQ1X3dyaXRlX3RlbXAoZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNldF9pbnRlcnZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIHVtb2RlX3QgbG05NTI0NV90ZW1wX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqZGF0YSwgdTMyIGF0dHIsIGludCBjaGFubmVsKQogewotCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCi0JaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KLQlkYXRhLT5pbnRlcnZhbCA9IGxtOTUyNDVfc2V0X2NvbnZlcnNpb25fcmF0ZShjbGllbnQsIHZhbCk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCXJldHVybiBjb3VudDsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJY2FzZSBod21vbl90ZW1wX21heF9hbGFybToKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2h5c3Q6CisJY2FzZSBod21vbl90ZW1wX2NyaXRfYWxhcm06CisJY2FzZSBod21vbl90ZW1wX2ZhdWx0OgorCQlyZXR1cm4gU19JUlVHTzsKKwljYXNlIGh3bW9uX3RlbXBfdHlwZToKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCWNhc2UgaHdtb25fdGVtcF9jcml0OgorCWNhc2UgaHdtb25fdGVtcF9vZmZzZXQ6CisJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9oeXN0OgorCQlyZXR1cm4gKGNoYW5uZWwgPT0gMCkgPyBTX0lSVUdPIHwgU19JV1VTUiA6IFNfSVJVR087CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQogfQogCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCi0JCXNldF9saW1pdCwgNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfY3JpdF9oeXN0LAotCQlzZXRfY3JpdF9oeXN0LCA2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKLQkJU1RBVFVTMV9MT0MpOwotCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCi0JCXNldF9saW1pdCwgNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXRfaHlzdCwgU19JUlVHTywgc2hvd19jcml0X2h5c3QsIE5VTEwsIDcpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAotCQlTVEFUVVMxX1JUQ1JJVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX3R5cGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3R5cGUsCi0JCXNldF90eXBlLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfZmF1bHQsIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCi0JCVNUQVRVUzFfRElPREVfRkFVTFQpOwotCi1zdGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX2ludGVydmFsLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbnRlcnZhbCwKLQkJc2V0X2ludGVydmFsKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxtOTUyNDVfYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0X2h5c3QuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2NyaXRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9jcml0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9jcml0X2h5c3QuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2NyaXRfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX3R5cGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJmRldl9hdHRyX3VwZGF0ZV9pbnRlcnZhbC5hdHRyLAotCU5VTEwKLX07Ci1BVFRSSUJVVEVfR1JPVVBTKGxtOTUyNDUpOworc3RhdGljIHVtb2RlX3QgbG05NTI0NV9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJICBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJCSAgdTMyIGF0dHIsIGludCBjaGFubmVsKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY2hpcDoKKwkJc3dpdGNoIChhdHRyKSB7CisJCWNhc2UgaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWw6CisJCQlyZXR1cm4gU19JUlVHTyB8IFNfSVdVU1I7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIGxtOTUyNDVfdGVtcF9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KIAogLyogUmV0dXJuIDAgaWYgZGV0ZWN0aW9uIGlzIHN1Y2Nlc3NmdWwsIC1FTk9ERVYgb3RoZXJ3aXNlICovCiBzdGF0aWMgaW50IGxtOTUyNDVfZGV0ZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LApAQCAtNDUzLDQ0ICs0ODcsMTMwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGxtOTUyNDVfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCQlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhKQorc3RhdGljIGludCBsbTk1MjQ1X2luaXRfY2xpZW50KHN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEpCiB7Ci0JZGF0YS0+aW50ZXJ2YWwgPSBsbTk1MjQ1X3JlYWRfY29udmVyc2lvbl9yYXRlKGNsaWVudCk7CisJaW50IHJldDsKIAotCWRhdGEtPmNvbmZpZzEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAotCQlMTTk1MjQ1X1JFR19SV19DT05GSUcxKTsKLQlkYXRhLT5jb25maWcyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKLQkJTE05NTI0NV9SRUdfUldfQ09ORklHMik7CisJcmV0ID0gbG05NTI0NV9yZWFkX2NvbnZlcnNpb25fcmF0ZShkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAotCWlmIChkYXRhLT5jb25maWcxICYgQ0ZHX1NUT1ApIHsKLQkJLyogQ2xlYXIgdGhlIHN0YW5kYnkgYml0ICovCi0JCWRhdGEtPmNvbmZpZzEgJj0gfkNGR19TVE9QOwotCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0NV9SRUdfUldfQ09ORklHMSwKLQkJCWRhdGEtPmNvbmZpZzEpOworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoZGF0YS0+cmVnbWFwLCBMTTk1MjQ1X1JFR19SV19DT05GSUcxLAorCQkJCSAgQ0ZHX1NUT1AsIDApOworfQorCitzdGF0aWMgYm9vbCBsbTk1MjQ1X2lzX3dyaXRlYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBMTTk1MjQ1X1JFR19SV19DT05GSUcxOgorCWNhc2UgTE05NTI0NV9SRUdfUldfQ09OVkVSU19SQVRFOgorCWNhc2UgTE05NTI0NV9SRUdfV19PTkVfU0hPVDoKKwljYXNlIExNOTUyNDVfUkVHX1JXX0NPTkZJRzI6CisJY2FzZSBMTTk1MjQ1X1JFR19SV19SRU1PVEVfT0ZGSDoKKwljYXNlIExNOTUyNDVfUkVHX1JXX1JFTU9URV9PRkZMOgorCWNhc2UgTE05NTI0NV9SRUdfUldfUkVNT1RFX09TX0xJTUlUOgorCWNhc2UgTE05NTI0NV9SRUdfUldfTE9DQUxfT1NfVENSSVRfTElNSVQ6CisJY2FzZSBMTTk1MjQ1X1JFR19SV19SRU1PVEVfVENSSVRfTElNSVQ6CisJY2FzZSBMTTk1MjQ1X1JFR19SV19DT01NT05fSFlTVEVSRVNJUzoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOwogCX0KIH0KIAorc3RhdGljIGJvb2wgbG05NTI0NV9pc192b2xhdGlsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBMTTk1MjQ1X1JFR19SX1NUQVRVUzE6CisJY2FzZSBMTTk1MjQ1X1JFR19SX1NUQVRVUzI6CisJY2FzZSBMTTk1MjQ1X1JFR19SX0xPQ0FMX1RFTVBIX1M6CisJY2FzZSBMTTk1MjQ1X1JFR19SX0xPQ0FMX1RFTVBMX1M6CisJY2FzZSBMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QSF9TOgorCWNhc2UgTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUExfUzoKKwljYXNlIExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBIX1U6CisJY2FzZSBMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QTF9VOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgbG05NTI0NV9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKKwkud3JpdGVhYmxlX3JlZyA9IGxtOTUyNDVfaXNfd3JpdGVhYmxlX3JlZywKKwkudm9sYXRpbGVfcmVnID0gbG05NTI0NV9pc192b2xhdGlsZV9yZWcsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnVzZV9zaW5nbGVfcncgPSB0cnVlLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBsbTk1MjQ1X2NoaXBfY29uZmlnW10gPSB7CisJSFdNT05fQ19VUERBVEVfSU5URVJWQUwsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbG05NTI0NV9jaGlwID0geworCS50eXBlID0gaHdtb25fY2hpcCwKKwkuY29uZmlnID0gbG05NTI0NV9jaGlwX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgbG05NTI0NV90ZW1wX2NvbmZpZ1tdID0geworCUhXTU9OX1RfSU5QVVQgfCBIV01PTl9UX0NSSVQgfCBIV01PTl9UX0NSSVRfSFlTVCB8IEhXTU9OX1RfQ1JJVF9BTEFSTSwKKwlIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9NQVggfCBIV01PTl9UX01BWF9IWVNUIHwgSFdNT05fVF9DUklUIHwKKwkJSFdNT05fVF9DUklUX0hZU1QgfCBIV01PTl9UX0ZBVUxUIHwgSFdNT05fVF9NQVhfQUxBUk0gfAorCQlIV01PTl9UX0NSSVRfQUxBUk0gfCBIV01PTl9UX1RZUEUgfCBIV01PTl9UX09GRlNFVCwKKwkwCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBsbTk1MjQ1X3RlbXAgPSB7CisJLnR5cGUgPSBod21vbl90ZW1wLAorCS5jb25maWcgPSBsbTk1MjQ1X3RlbXBfY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKmxtOTUyNDVfaW5mb1tdID0geworCSZsbTk1MjQ1X2NoaXAsCisJJmxtOTUyNDVfdGVtcCwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX29wcyBsbTk1MjQ1X2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IGxtOTUyNDVfaXNfdmlzaWJsZSwKKwkucmVhZCA9IGxtOTUyNDVfcmVhZCwKKwkud3JpdGUgPSBsbTk1MjQ1X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gbG05NTI0NV9jaGlwX2luZm8gPSB7CisJLm9wcyA9ICZsbTk1MjQ1X2h3bW9uX29wcywKKwkuaW5mbyA9IGxtOTUyNDVfaW5mbywKK307CisKIHN0YXRpYyBpbnQgbG05NTI0NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJaW50IHJldDsKIAogCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IGxtOTUyNDVfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJZGF0YS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmbG05NTI0NV9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKGRhdGEtPnJlZ21hcCkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEtPnJlZ21hcCk7CisKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBMTTk1MjQ1IGNoaXAgKi8KLQlsbTk1MjQ1X2luaXRfY2xpZW50KGNsaWVudCwgZGF0YSk7CisJcmV0ID0gbG05NTI0NV9pbml0X2NsaWVudChkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAotCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAotCQkJCQkJCSAgIGRhdGEsCi0JCQkJCQkJICAgbG05NTI0NV9ncm91cHMpOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgZGF0YSwKKwkJCQkJCQkgJmxtOTUyNDVfY2hpcF9pbmZvLAorCQkJCQkJCSBOVUxMKTsKIAlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbHRjNDE1MS5jIGIvZHJpdmVycy9od21vbi9sdGM0MTUxLmMKaW5kZXggYzg2YTE4NC4uODQ0NWM5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sdGM0MTUxLmMKKysrIGIvZHJpdmVycy9od21vbi9sdGM0MTUxLmMKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTUyLDYgKzUzLDcgQEAKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiAJYm9vbCB2YWxpZDsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLworCXVuc2lnbmVkIGludCBzaHVudDsgLyogaW4gbWljcm8gb2htcyAqLwogCiAJLyogUmVnaXN0ZXJzICovCiAJdTggcmVnc1s2XTsKQEAgLTExMSw5ICsxMTMsOSBAQAogCWNhc2UgTFRDNDE1MV9TRU5TRV9IOgogCQkvKgogCQkgKiAyMHVWIHJlc29sdXRpb24uIENvbnZlcnQgdG8gY3VycmVudCBhcyBtZWFzdXJlZCB3aXRoCi0JCSAqIGFuIDEgbU9obSBzZW5zZSByZXNpc3RvciwgaW4gbUEuCisJCSAqIGEgZ2l2ZW4gc2Vuc2UgcmVzaXN0b3IsIGluIG1BLgogCQkgKi8KLQkJdmFsID0gdmFsICogMjA7CisJCXZhbCA9IHZhbCAqIDIwICogMTAwMCAvIGRhdGEtPnNodW50OwogCQlicmVhazsKIAljYXNlIExUQzQxNTFfVklOX0g6CiAJCS8qIDI1IG1WIHBlciBpbmNyZW1lbnQgKi8KQEAgLTE3Niw2ICsxNzgsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAlzdHJ1Y3QgbHRjNDE1MV9kYXRhICpkYXRhOwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwl1MzIgc2h1bnQ7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTg0LDYgKzE4NywxNSBAQAogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIoY2xpZW50LT5kZXYub2Zfbm9kZSwKKwkJCQkgInNodW50LXJlc2lzdG9yLW1pY3JvLW9obXMiLCAmc2h1bnQpKQorCQlzaHVudCA9IDEwMDA7IC8qIDEgbU9obSBpZiBub3Qgc2V0IHZpYSBEVCAqLworCisJaWYgKHNodW50ID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YS0+c2h1bnQgPSBzaHVudDsKKwogCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKIAltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CiAKQEAgLTE5OSwxMCArMjExLDE2IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGx0YzQxNTFfaWQpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBsdGM0MTUxX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJsbHRjLGx0YzQxNTEiIH0sCisJe30sCit9OworCiAvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbHRjNDE1MV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAibHRjNDE1MSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihsdGM0MTUxX21hdGNoKSwKIAl9LAogCS5wcm9iZQkJPSBsdGM0MTUxX3Byb2JlLAogCS5pZF90YWJsZQk9IGx0YzQxNTFfaWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2x0YzQyNDUuYyBiL2RyaXZlcnMvaHdtb24vbHRjNDI0NS5jCmluZGV4IDY4MWI1YjcuLjQ2ODBkODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbHRjNDI0NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbHRjNDI0NS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KQEAgLTUzLDggKzU0LDYgQEAKIHN0cnVjdCBsdGM0MjQ1X2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAKLQljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpncm91cHNbM107Ci0KIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiAJYm9vbCB2YWxpZDsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsgLyogaW4gamlmZmllcyAqLwpAQCAtMTYyLDcgKzE2MSw3IEBACiAJCWx0YzQyNDVfdXBkYXRlX2dwaW9zKGRldik7CiAKIAkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKLQkJZGF0YS0+dmFsaWQgPSAxOworCQlkYXRhLT52YWxpZCA9IHRydWU7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CkBAIC0yNTYsMjE0ICsyNTUsMjA1IEBACiAJcmV0dXJuIGN1cnI7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd192b2x0YWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQkJCSAgICBjaGFyICpidWYpCisvKiBNYXAgZnJvbSB2b2x0YWdlIGNoYW5uZWwgaW5kZXggdG8gdm9sdGFnZSByZWdpc3RlciAqLworCitzdGF0aWMgY29uc3QgczggbHRjNDI0NV9pbl9yZWdzW10gPSB7CisJTFRDNDI0NV8xMlZJTiwgTFRDNDI0NV81VklOLCBMVEM0MjQ1XzNWSU4sIExUQzQyNDVfVkVFSU4sCisJTFRDNDI0NV8xMlZPVVQsIExUQzQyNDVfNVZPVVQsIExUQzQyNDVfM1ZPVVQsIExUQzQyNDVfVkVFT1VULAorfTsKKworLyogTWFwIGZyb20gY3VycmVudCBjaGFubmVsIGluZGV4IHRvIGN1cnJlbnQgcmVnaXN0ZXIgKi8KKworc3RhdGljIGNvbnN0IHM4IGx0YzQyNDVfY3Vycl9yZWdzW10gPSB7CisJTFRDNDI0NV8xMlZTRU5TRSwgTFRDNDI0NV81VlNFTlNFLCBMVEM0MjQ1XzNWU0VOU0UsIExUQzQyNDVfVkVFU0VOU0UsCit9OworCitzdGF0aWMgaW50IGx0YzQyNDVfcmVhZF9jdXJyKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICBsb25nICp2YWwpCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKLQljb25zdCBpbnQgdm9sdGFnZSA9IGx0YzQyNDVfZ2V0X3ZvbHRhZ2UoZGV2LCBhdHRyLT5pbmRleCk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgdm9sdGFnZSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd19jdXJyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQkJCSAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKLQljb25zdCB1bnNpZ25lZCBpbnQgY3VyciA9IGx0YzQyNDVfZ2V0X2N1cnJlbnQoZGV2LCBhdHRyLT5pbmRleCk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgY3Vycik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd19wb3dlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCi0JCQkJICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKLQljb25zdCB1bnNpZ25lZCBpbnQgY3VyciA9IGx0YzQyNDVfZ2V0X2N1cnJlbnQoZGV2LCBhdHRyLT5pbmRleCk7Ci0JY29uc3QgaW50IG91dHB1dF92b2x0YWdlID0gbHRjNDI0NV9nZXRfdm9sdGFnZShkZXYsIGF0dHItPmluZGV4KzEpOwotCi0JLyogY3VycmVudCBpbiBtQSAqIHZvbHRhZ2UgaW4gbVYgPT0gcG93ZXIgaW4gdVcgKi8KLQljb25zdCB1bnNpZ25lZCBpbnQgcG93ZXIgPSBhYnMob3V0cHV0X3ZvbHRhZ2UgKiBjdXJyKTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCBwb3dlcik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGx0YzQyNDVfc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhLAotCQkJCQkgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRhKTsKIAlzdHJ1Y3QgbHRjNDI0NV9kYXRhICpkYXRhID0gbHRjNDI0NV91cGRhdGVfZGV2aWNlKGRldik7Ci0JY29uc3QgdTggcmVnID0gZGF0YS0+Y3JlZ3NbYXR0ci0+aW5kZXhdOwotCWNvbnN0IHUzMiBtYXNrID0gYXR0ci0+bnI7CiAKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgKHJlZyAmIG1hc2spID8gMSA6IDApOworCXN3aXRjaCAoYXR0cikgeworCWNhc2UgaHdtb25fY3Vycl9pbnB1dDoKKwkJKnZhbCA9IGx0YzQyNDVfZ2V0X2N1cnJlbnQoZGV2LCBsdGM0MjQ1X2N1cnJfcmVnc1tjaGFubmVsXSk7CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fY3Vycl9tYXhfYWxhcm06CisJCSp2YWwgPSAhIShkYXRhLT5jcmVnc1tMVEM0MjQ1X0ZBVUxUMV0gJiBCSVQoY2hhbm5lbCArIDQpKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3QgbHRjNDI0NV9zaG93X2dwaW8oc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGEsCi0JCQkJIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbHRjNDI0NV9yZWFkX2luKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRhKTsKIAlzdHJ1Y3QgbHRjNDI0NV9kYXRhICpkYXRhID0gbHRjNDI0NV91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IHZhbCA9IGRhdGEtPmdwaW9zW2F0dHItPmluZGV4XTsKIAotCS8qIGhhbmRsZSBzdGFsZSBHUElPJ3MgKi8KLQlpZiAodmFsIDwgMCkKLQkJcmV0dXJuIHZhbDsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX2luX2lucHV0OgorCQlpZiAoY2hhbm5lbCA8IDgpIHsKKwkJCSp2YWwgPSBsdGM0MjQ1X2dldF92b2x0YWdlKGRldiwKKwkJCQkJCWx0YzQyNDVfaW5fcmVnc1tjaGFubmVsXSk7CisJCX0gZWxzZSB7CisJCQlpbnQgcmVndmFsID0gZGF0YS0+Z3Bpb3NbY2hhbm5lbCAtIDhdOwogCi0JLyogQ29udmVydCB0byBtaWxsaXZvbHRzIGFuZCBwcmludCAqLwotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCB2YWwgKiAxMCk7CisJCQlpZiAocmVndmFsIDwgMCkKKwkJCQlyZXR1cm4gcmVndmFsOworCQkJKnZhbCA9IHJlZ3ZhbCAqIDEwOworCQl9CisJCXJldHVybiAwOworCWNhc2UgaHdtb25faW5fbWluX2FsYXJtOgorCQlpZiAoY2hhbm5lbCA8IDQpCisJCQkqdmFsID0gISEoZGF0YS0+Y3JlZ3NbTFRDNDI0NV9GQVVMVDFdICYgQklUKGNoYW5uZWwpKTsKKwkJZWxzZQorCQkJKnZhbCA9ICEhKGRhdGEtPmNyZWdzW0xUQzQyNDVfRkFVTFQyXSAmCisJCQkJICBCSVQoY2hhbm5lbCAtIDQpKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotLyogQ29uc3RydWN0IGEgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc3RydWN0dXJlIGZvciBlYWNoIHJlZ2lzdGVyICovCi0KLS8qIElucHV0IHZvbHRhZ2VzICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X3ZvbHRhZ2UsIE5VTEwsCi0JCQkgIExUQzQyNDVfMTJWSU4pOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd192b2x0YWdlLCBOVUxMLAotCQkJICBMVEM0MjQ1XzVWSU4pOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjNfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd192b2x0YWdlLCBOVUxMLAotCQkJICBMVEM0MjQ1XzNWSU4pOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd192b2x0YWdlLCBOVUxMLAotCQkJICBMVEM0MjQ1X1ZFRUlOKTsKLQotLyogSW5wdXQgdW5kZXJ2b2x0YWdlIGFsYXJtcyAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluMV9taW5fYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDAsIExUQzQyNDVfRkFVTFQxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjJfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsCi0JCQkgICAgMSA8PCAxLCBMVEM0MjQ1X0ZBVUxUMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW4zX21pbl9hbGFybSwgU19JUlVHTywgbHRjNDI0NV9zaG93X2FsYXJtLCBOVUxMLAotCQkJICAgIDEgPDwgMiwgTFRDNDI0NV9GQVVMVDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNF9taW5fYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDMsIExUQzQyNDVfRkFVTFQxKTsKLQotLyogQ3VycmVudHMgKHZpYSBzZW5zZSByZXNpc3RvcikgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjFfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd19jdXJyZW50LCBOVUxMLAotCQkJICBMVEM0MjQ1XzEyVlNFTlNFKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoY3VycjJfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd19jdXJyZW50LCBOVUxMLAotCQkJICBMVEM0MjQ1XzVWU0VOU0UpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihjdXJyM19pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X2N1cnJlbnQsIE5VTEwsCi0JCQkgIExUQzQyNDVfM1ZTRU5TRSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGN1cnI0X2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfY3VycmVudCwgTlVMTCwKLQkJCSAgTFRDNDI0NV9WRUVTRU5TRSk7Ci0KLS8qIE92ZXJjdXJyZW50IGFsYXJtcyAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGN1cnIxX21heF9hbGFybSwgU19JUlVHTywgbHRjNDI0NV9zaG93X2FsYXJtLCBOVUxMLAotCQkJICAgIDEgPDwgNCwgTFRDNDI0NV9GQVVMVDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGN1cnIyX21heF9hbGFybSwgU19JUlVHTywgbHRjNDI0NV9zaG93X2FsYXJtLCBOVUxMLAotCQkJICAgIDEgPDwgNSwgTFRDNDI0NV9GQVVMVDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGN1cnIzX21heF9hbGFybSwgU19JUlVHTywgbHRjNDI0NV9zaG93X2FsYXJtLCBOVUxMLAotCQkJICAgIDEgPDwgNiwgTFRDNDI0NV9GQVVMVDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGN1cnI0X21heF9hbGFybSwgU19JUlVHTywgbHRjNDI0NV9zaG93X2FsYXJtLCBOVUxMLAotCQkJICAgIDEgPDwgNywgTFRDNDI0NV9GQVVMVDEpOwotCi0vKiBPdXRwdXQgdm9sdGFnZXMgKi8KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW41X2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfdm9sdGFnZSwgTlVMTCwKLQkJCSAgTFRDNDI0NV8xMlZPVVQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjZfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd192b2x0YWdlLCBOVUxMLAotCQkJICBMVEM0MjQ1XzVWT1VUKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW43X2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfdm9sdGFnZSwgTlVMTCwKLQkJCSAgTFRDNDI0NV8zVk9VVCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluOF9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X3ZvbHRhZ2UsIE5VTEwsCi0JCQkgIExUQzQyNDVfVkVFT1VUKTsKLQotLyogUG93ZXIgQmFkIGFsYXJtcyAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluNV9taW5fYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDAsIExUQzQyNDVfRkFVTFQyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihpbjZfbWluX2FsYXJtLCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfYWxhcm0sIE5VTEwsCi0JCQkgICAgMSA8PCAxLCBMVEM0MjQ1X0ZBVUxUMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoaW43X21pbl9hbGFybSwgU19JUlVHTywgbHRjNDI0NV9zaG93X2FsYXJtLCBOVUxMLAotCQkJICAgIDEgPDwgMiwgTFRDNDI0NV9GQVVMVDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGluOF9taW5fYWxhcm0sIFNfSVJVR08sIGx0YzQyNDVfc2hvd19hbGFybSwgTlVMTCwKLQkJCSAgICAxIDw8IDMsIExUQzQyNDVfRkFVTFQyKTsKLQotLyogR1BJTyB2b2x0YWdlcyAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjlfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd19ncGlvLCBOVUxMLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMF9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X2dwaW8sIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjExX2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfZ3BpbywgTlVMTCwgMik7Ci0KLS8qIFBvd2VyIENvbnN1bXB0aW9uICh2aXJ0dWFsKSAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjFfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd19wb3dlciwgTlVMTCwKLQkJCSAgTFRDNDI0NV8xMlZTRU5TRSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHBvd2VyMl9pbnB1dCwgU19JUlVHTywgbHRjNDI0NV9zaG93X3Bvd2VyLCBOVUxMLAotCQkJICBMVEM0MjQ1XzVWU0VOU0UpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwb3dlcjNfaW5wdXQsIFNfSVJVR08sIGx0YzQyNDVfc2hvd19wb3dlciwgTlVMTCwKLQkJCSAgTFRDNDI0NV8zVlNFTlNFKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocG93ZXI0X2lucHV0LCBTX0lSVUdPLCBsdGM0MjQ1X3Nob3dfcG93ZXIsIE5VTEwsCi0JCQkgIExUQzQyNDVfVkVFU0VOU0UpOwotCi0vKgotICogRmluYWxseSwgY29uc3RydWN0IGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIG1lbWJlcnMgb2YgdGhlIGFib3ZlIG9iamVjdHMsCi0gKiBhcyByZXF1aXJlZCBmb3Igc3lzZnNfY3JlYXRlX2dyb3VwKCkKLSAqLwotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmx0YzQyNDVfc3RkX2F0dHJpYnV0ZXNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjNfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCi0KLQkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9jdXJyMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfY3VycjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2N1cnI0X2lucHV0LmRldl9hdHRyLmF0dHIsCi0KLQkmc2Vuc29yX2Rldl9hdHRyX2N1cnIxX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfY3VycjJfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9jdXJyM19tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2N1cnI0X21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAotCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW43X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQotCSZzZW5zb3JfZGV2X2F0dHJfaW41X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW42X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW43X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW44X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAotCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQotCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXIxX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wb3dlcjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3Bvd2VyM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcG93ZXI0X2lucHV0LmRldl9hdHRyLmF0dHIsCi0KLQlOVUxMLAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmx0YzQyNDVfZ3Bpb19hdHRyaWJ1dGVzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl9pbjEwX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjExX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGx0YzQyNDVfc3RkX2dyb3VwID0gewotCS5hdHRycyA9IGx0YzQyNDVfc3RkX2F0dHJpYnV0ZXMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsdGM0MjQ1X2dwaW9fZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbHRjNDI0NV9ncGlvX2F0dHJpYnV0ZXMsCi19OwotCi1zdGF0aWMgdm9pZCBsdGM0MjQ1X3N5c2ZzX2FkZF9ncm91cHMoc3RydWN0IGx0YzQyNDVfZGF0YSAqZGF0YSkKK3N0YXRpYyBpbnQgbHRjNDI0NV9yZWFkX3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICAgbG9uZyAqdmFsKQogewotCS8qIHN0YW5kYXJkIHN5c2ZzIGF0dHJpYnV0ZXMgKi8KLQlkYXRhLT5ncm91cHNbMF0gPSAmbHRjNDI0NV9zdGRfZ3JvdXA7CisJdW5zaWduZWQgbG9uZyBjdXJyOworCWxvbmcgdm9sdGFnZTsKIAotCS8qIGlmIHdlJ3JlIHVzaW5nIHRoZSBleHRyYSBncGlvIHN1cHBvcnQsIHJlZ2lzdGVyIGl0J3MgYXR0cmlidXRlcyAqLwotCWlmIChkYXRhLT51c2VfZXh0cmFfZ3Bpb3MpCi0JCWRhdGEtPmdyb3Vwc1sxXSA9ICZsdGM0MjQ1X2dwaW9fZ3JvdXA7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9wb3dlcl9pbnB1dDoKKwkJKHZvaWQpbHRjNDI0NV91cGRhdGVfZGV2aWNlKGRldik7CisJCWN1cnIgPSBsdGM0MjQ1X2dldF9jdXJyZW50KGRldiwgbHRjNDI0NV9jdXJyX3JlZ3NbY2hhbm5lbF0pOworCQl2b2x0YWdlID0gbHRjNDI0NV9nZXRfdm9sdGFnZShkZXYsIGx0YzQyNDVfaW5fcmVnc1tjaGFubmVsXSk7CisJCSp2YWwgPSBhYnMoY3VyciAqIHZvbHRhZ2UpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCitzdGF0aWMgaW50IGx0YzQyNDVfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQl1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKK3sKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgaHdtb25fY3VycjoKKwkJcmV0dXJuIGx0YzQyNDVfcmVhZF9jdXJyKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwljYXNlIGh3bW9uX3Bvd2VyOgorCQlyZXR1cm4gbHRjNDI0NV9yZWFkX3Bvd2VyKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwljYXNlIGh3bW9uX2luOgorCQlyZXR1cm4gbHRjNDI0NV9yZWFkX2luKGRldiwgYXR0ciwgY2hhbm5lbCAtIDEsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKworc3RhdGljIHVtb2RlX3QgbHRjNDI0NV9pc192aXNpYmxlKGNvbnN0IHZvaWQgKl9kYXRhLAorCQkJCSAgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCQkgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKK3sKKwljb25zdCBzdHJ1Y3QgbHRjNDI0NV9kYXRhICpkYXRhID0gX2RhdGE7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2luOgorCQlpZiAoY2hhbm5lbCA9PSAwKQorCQkJcmV0dXJuIDA7CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX2luX2lucHV0OgorCQkJaWYgKGNoYW5uZWwgPiA5ICYmICFkYXRhLT51c2VfZXh0cmFfZ3Bpb3MpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJY2FzZSBod21vbl9pbl9taW5fYWxhcm06CisJCQlpZiAoY2hhbm5lbCA+IDgpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gU19JUlVHTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBod21vbl9jdXJyOgorCQlzd2l0Y2ggKGF0dHIpIHsKKwkJY2FzZSBod21vbl9jdXJyX2lucHV0OgorCQljYXNlIGh3bW9uX2N1cnJfbWF4X2FsYXJtOgorCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgaHdtb25fcG93ZXI6CisJCXN3aXRjaCAoYXR0cikgeworCQljYXNlIGh3bW9uX3Bvd2VyX2lucHV0OgorCQkJcmV0dXJuIFNfSVJVR087CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGNvbnN0IHUzMiBsdGM0MjQ1X2luX2NvbmZpZ1tdID0geworCUhXTU9OX0lfSU5QVVQsCQkJLyogZHVtbXksIHNraXBwZWQgaW4gaXNfdmlzaWJsZSAqLworCUhXTU9OX0lfSU5QVVQgfCBIV01PTl9JX01JTl9BTEFSTSwKKwlIV01PTl9JX0lOUFVUIHwgSFdNT05fSV9NSU5fQUxBUk0sCisJSFdNT05fSV9JTlBVVCB8IEhXTU9OX0lfTUlOX0FMQVJNLAorCUhXTU9OX0lfSU5QVVQgfCBIV01PTl9JX01JTl9BTEFSTSwKKwlIV01PTl9JX0lOUFVUIHwgSFdNT05fSV9NSU5fQUxBUk0sCisJSFdNT05fSV9JTlBVVCB8IEhXTU9OX0lfTUlOX0FMQVJNLAorCUhXTU9OX0lfSU5QVVQgfCBIV01PTl9JX01JTl9BTEFSTSwKKwlIV01PTl9JX0lOUFVUIHwgSFdNT05fSV9NSU5fQUxBUk0sCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbHRjNDI0NV9pbiA9IHsKKwkudHlwZSA9IGh3bW9uX2luLAorCS5jb25maWcgPSBsdGM0MjQ1X2luX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgbHRjNDI0NV9jdXJyX2NvbmZpZ1tdID0geworCUhXTU9OX0NfSU5QVVQgfCBIV01PTl9DX01BWF9BTEFSTSwKKwlIV01PTl9DX0lOUFVUIHwgSFdNT05fQ19NQVhfQUxBUk0sCisJSFdNT05fQ19JTlBVVCB8IEhXTU9OX0NfTUFYX0FMQVJNLAorCUhXTU9OX0NfSU5QVVQgfCBIV01PTl9DX01BWF9BTEFSTSwKKwkwCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBsdGM0MjQ1X2N1cnIgPSB7CisJLnR5cGUgPSBod21vbl9jdXJyLAorCS5jb25maWcgPSBsdGM0MjQ1X2N1cnJfY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBsdGM0MjQ1X3Bvd2VyX2NvbmZpZ1tdID0geworCUhXTU9OX1BfSU5QVVQsCisJSFdNT05fUF9JTlBVVCwKKwlIV01PTl9QX0lOUFVULAorCUhXTU9OX1BfSU5QVVQsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbHRjNDI0NV9wb3dlciA9IHsKKwkudHlwZSA9IGh3bW9uX3Bvd2VyLAorCS5jb25maWcgPSBsdGM0MjQ1X3Bvd2VyX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvICpsdGM0MjQ1X2luZm9bXSA9IHsKKwkmbHRjNDI0NV9pbiwKKwkmbHRjNDI0NV9jdXJyLAorCSZsdGM0MjQ1X3Bvd2VyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIGx0YzQyNDVfaHdtb25fb3BzID0geworCS5pc192aXNpYmxlID0gbHRjNDI0NV9pc192aXNpYmxlLAorCS5yZWFkID0gbHRjNDI0NV9yZWFkLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gbHRjNDI0NV9jaGlwX2luZm8gPSB7CisJLm9wcyA9ICZsdGM0MjQ1X2h3bW9uX29wcywKKwkuaW5mbyA9IGx0YzQyNDVfaW5mbywKK307CisKIHN0YXRpYyBib29sIGx0YzQyNDVfdXNlX2V4dHJhX2dwaW9zKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IGx0YzQyNDVfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZjbGllbnQtPmRldik7CkBAIC01MDIsMTIgKzQ5MiwxMCBAQAogCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMVEM0MjQ1X0ZBVUxUMSwgMHgwMCk7CiAJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExUQzQyNDVfRkFVTFQyLCAweDAwKTsKIAotCS8qIEFkZCBzeXNmcyBob29rcyAqLwotCWx0YzQyNDVfc3lzZnNfYWRkX2dyb3VwcyhkYXRhKTsKLQotCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKCZjbGllbnQtPmRldiwKLQkJCQkJCQkgICBjbGllbnQtPm5hbWUsIGRhdGEsCi0JCQkJCQkJICAgZGF0YS0+Z3JvdXBzKTsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oJmNsaWVudC0+ZGV2LAorCQkJCQkJCSBjbGllbnQtPm5hbWUsIGRhdGEsCisJCQkJCQkJICZsdGM0MjQ1X2NoaXBfaW5mbywKKwkJCQkJCQkgTlVMTCk7CiAJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL21heDMxNzkwLmMgYi9kcml2ZXJzL2h3bW9uL21heDMxNzkwLmMKaW5kZXggNjljMGFjOC4uYmVmODRlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXgzMTc5MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbWF4MzE3OTAuYwpAQCAtMTcsNyArMTcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CkBAIC0xNjksMzYyICsxNjgsMjg4IEBACiAJcmV0dXJuIGJpdHM7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGdldF9mYW4oc3RydWN0IGRldmljZSAqZGV2LAotCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbWF4MzE3OTBfcmVhZF9mYW4oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgIGxvbmcgKnZhbCkKIHsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7CiAJc3RydWN0IG1heDMxNzkwX2RhdGEgKmRhdGEgPSBtYXgzMTc5MF91cGRhdGVfZGV2aWNlKGRldik7CiAJaW50IHNyLCBycG07CiAKIAlpZiAoSVNfRVJSKGRhdGEpKQogCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKIAotCXNyID0gZ2V0X3RhY2hfcGVyaW9kKGRhdGEtPmZhbl9keW5hbWljc1thdHRyLT5pbmRleF0pOwotCXJwbSA9IFJQTV9GUk9NX1JFRyhkYXRhLT50YWNoW2F0dHItPmluZGV4XSwgc3IpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJwbSk7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9mYW5faW5wdXQ6CisJCXNyID0gZ2V0X3RhY2hfcGVyaW9kKGRhdGEtPmZhbl9keW5hbWljc1tjaGFubmVsXSk7CisJCXJwbSA9IFJQTV9GUk9NX1JFRyhkYXRhLT50YWNoW2NoYW5uZWxdLCBzcik7CisJCSp2YWwgPSBycG07CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fZmFuX3RhcmdldDoKKwkJc3IgPSBnZXRfdGFjaF9wZXJpb2QoZGF0YS0+ZmFuX2R5bmFtaWNzW2NoYW5uZWxdKTsKKwkJcnBtID0gUlBNX0ZST01fUkVHKGRhdGEtPnRhcmdldF9jb3VudFtjaGFubmVsXSwgc3IpOworCQkqdmFsID0gcnBtOworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX2Zhbl9mYXVsdDoKKwkJKnZhbCA9ICEhKGRhdGEtPmZhdWx0X3N0YXR1cyAmICgxIDw8IGNoYW5uZWwpKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIHNzaXplX3QgZ2V0X2Zhbl90YXJnZXQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgbWF4MzE3OTBfd3JpdGVfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICAgbG9uZyB2YWwpCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCXN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gbWF4MzE3OTBfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBzciwgcnBtOwotCi0JaWYgKElTX0VSUihkYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7Ci0KLQlzciA9IGdldF90YWNoX3BlcmlvZChkYXRhLT5mYW5fZHluYW1pY3NbYXR0ci0+aW5kZXhdKTsKLQlycG0gPSBSUE1fRlJPTV9SRUcoZGF0YS0+dGFyZ2V0X2NvdW50W2F0dHItPmluZGV4XSwgc3IpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJwbSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNldF9mYW5fdGFyZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwogCXN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlpbnQgdGFyZ2V0X2NvdW50OworCWludCBlcnIgPSAwOwogCXU4IGJpdHM7CiAJaW50IHNyOwotCWludCB0YXJnZXRfY291bnQ7Ci0JdW5zaWduZWQgbG9uZyBycG07Ci0JaW50IGVycjsKLQotCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZycG0pOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLQlycG0gPSBjbGFtcF92YWwocnBtLCBGQU5fUlBNX01JTiwgRkFOX1JQTV9NQVgpOwotCWJpdHMgPSBiaXRzX2Zvcl90YWNoX3BlcmlvZChycG0pOwotCWRhdGEtPmZhbl9keW5hbWljc1thdHRyLT5pbmRleF0gPQotCQkJKChkYXRhLT5mYW5fZHluYW1pY3NbYXR0ci0+aW5kZXhdCi0JCQkgICYgfk1BWDMxNzkwX0ZBTl9EWU5fU1JfTUFTSykKLQkJCSB8IChiaXRzIDw8IE1BWDMxNzkwX0ZBTl9EWU5fU1JfU0hJRlQpKTsKLQllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKLQkJCU1BWDMxNzkwX1JFR19GQU5fRFlOQU1JQ1MoYXR0ci0+aW5kZXgpLAotCQkJZGF0YS0+ZmFuX2R5bmFtaWNzW2F0dHItPmluZGV4XSk7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9mYW5fdGFyZ2V0OgorCQl2YWwgPSBjbGFtcF92YWwodmFsLCBGQU5fUlBNX01JTiwgRkFOX1JQTV9NQVgpOworCQliaXRzID0gYml0c19mb3JfdGFjaF9wZXJpb2QodmFsKTsKKwkJZGF0YS0+ZmFuX2R5bmFtaWNzW2NoYW5uZWxdID0KKwkJCSgoZGF0YS0+ZmFuX2R5bmFtaWNzW2NoYW5uZWxdICYKKwkJCSAgfk1BWDMxNzkwX0ZBTl9EWU5fU1JfTUFTSykgfAorCQkJIChiaXRzIDw8IE1BWDMxNzkwX0ZBTl9EWU5fU1JfU0hJRlQpKTsKKwkJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCU1BWDMxNzkwX1JFR19GQU5fRFlOQU1JQ1MoY2hhbm5lbCksCisJCQkJCWRhdGEtPmZhbl9keW5hbWljc1tjaGFubmVsXSk7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CiAKLQlpZiAoZXJyIDwgMCkgewotCQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJCXNyID0gZ2V0X3RhY2hfcGVyaW9kKGRhdGEtPmZhbl9keW5hbWljc1tjaGFubmVsXSk7CisJCXRhcmdldF9jb3VudCA9IFJQTV9UT19SRUcodmFsLCBzcik7CisJCXRhcmdldF9jb3VudCA9IGNsYW1wX3ZhbCh0YXJnZXRfY291bnQsIDB4MSwgMHg3RkYpOwogCi0Jc3IgPSBnZXRfdGFjaF9wZXJpb2QoZGF0YS0+ZmFuX2R5bmFtaWNzW2F0dHItPmluZGV4XSk7Ci0JdGFyZ2V0X2NvdW50ID0gUlBNX1RPX1JFRyhycG0sIHNyKTsKLQl0YXJnZXRfY291bnQgPSBjbGFtcF92YWwodGFyZ2V0X2NvdW50LCAweDEsIDB4N0ZGKTsKKwkJZGF0YS0+dGFyZ2V0X2NvdW50W2NoYW5uZWxdID0gdGFyZ2V0X2NvdW50IDw8IDU7CiAKLQlkYXRhLT50YXJnZXRfY291bnRbYXR0ci0+aW5kZXhdID0gdGFyZ2V0X2NvdW50IDw8IDU7Ci0KLQllcnIgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwKLQkJCU1BWDMxNzkwX1JFR19UQVJHRVRfQ09VTlQoYXR0ci0+aW5kZXgpLAotCQkJZGF0YS0+dGFyZ2V0X2NvdW50W2F0dHItPmluZGV4XSk7Ci0KLQltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBnZXRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCXN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gbWF4MzE3OTBfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBwd207Ci0KLQlpZiAoSVNfRVJSKGRhdGEpKQotCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKLQotCXB3bSA9IGRhdGEtPnB3bVthdHRyLT5pbmRleF0gPj4gODsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwd20pOwotfQotCi1zdGF0aWMgc3NpemVfdCBzZXRfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCXN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQl1bnNpZ25lZCBsb25nIHB3bTsKLQlpbnQgZXJyOwotCi0JZXJyID0ga3N0cnRvdWwoYnVmLCAxMCwgJnB3bSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWlmIChwd20gPiAyNTUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JZGF0YS0+cHdtW2F0dHItPmluZGV4XSA9IHB3bSA8PCA4OwotCWVyciA9IGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LAotCQkJTUFYMzE3OTBfUkVHX1BXTU9VVChhdHRyLT5pbmRleCksCi0JCQlkYXRhLT5wd21bYXR0ci0+aW5kZXhdKTsKLQotCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCi0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGdldF9wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOwotCXN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gbWF4MzE3OTBfdXBkYXRlX2RldmljZShkZXYpOwotCWludCBtb2RlOwotCi0JaWYgKElTX0VSUihkYXRhKSkKLQkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7Ci0KLQlpZiAoZGF0YS0+ZmFuX2NvbmZpZ1thdHRyLT5pbmRleF0gJiBNQVgzMTc5MF9GQU5fQ0ZHX1JQTV9NT0RFKQotCQltb2RlID0gMjsKLQllbHNlIGlmIChkYXRhLT5mYW5fY29uZmlnW2F0dHItPmluZGV4XSAmIE1BWDMxNzkwX0ZBTl9DRkdfVEFDSF9JTlBVVF9FTikKLQkJbW9kZSA9IDE7Ci0JZWxzZQotCQltb2RlID0gMDsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBtb2RlKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2V0X3B3bV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0cik7Ci0Jc3RydWN0IG1heDMxNzkwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwotCXVuc2lnbmVkIGxvbmcgbW9kZTsKLQlpbnQgZXJyOwotCi0JZXJyID0ga3N0cnRvdWwoYnVmLCAxMCwgJm1vZGUpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIDA6Ci0JCWRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdID0KLQkJCWRhdGEtPmZhbl9jb25maWdbYXR0ci0+aW5kZXhdCi0JCQkmIH4oTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUX0VOCi0JCQkgICAgfCBNQVgzMTc5MF9GQU5fQ0ZHX1JQTV9NT0RFKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlkYXRhLT5mYW5fY29uZmlnW2F0dHItPmluZGV4XSA9Ci0JCQkoZGF0YS0+ZmFuX2NvbmZpZ1thdHRyLT5pbmRleF0KLQkJCSB8IE1BWDMxNzkwX0ZBTl9DRkdfVEFDSF9JTlBVVF9FTikKLQkJCSYgfk1BWDMxNzkwX0ZBTl9DRkdfUlBNX01PREU7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJZGF0YS0+ZmFuX2NvbmZpZ1thdHRyLT5pbmRleF0gPQotCQkJZGF0YS0+ZmFuX2NvbmZpZ1thdHRyLT5pbmRleF0KLQkJCXwgTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUX0VOCi0JCQl8IE1BWDMxNzkwX0ZBTl9DRkdfUlBNX01PREU7CisJCWVyciA9IGkyY19zbWJ1c193cml0ZV93b3JkX3N3YXBwZWQoY2xpZW50LAorCQkJCQlNQVgzMTc5MF9SRUdfVEFSR0VUX0NPVU5UKGNoYW5uZWwpLAorCQkJCQlkYXRhLT50YXJnZXRfY291bnRbY2hhbm5lbF0pOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOwogCX0KIAotCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKLQotCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAotCQkJTUFYMzE3OTBfUkVHX0ZBTl9DT05GSUcoYXR0ci0+aW5kZXgpLAotCQkJZGF0YS0+ZmFuX2NvbmZpZ1thdHRyLT5pbmRleF0pOwotCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXJldHVybiBjb3VudDsKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgc3NpemVfdCBnZXRfZmFuX2ZhdWx0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyB1bW9kZV90IG1heDMxNzkwX2Zhbl9pc192aXNpYmxlKGNvbnN0IHZvaWQgKl9kYXRhLCB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCWNvbnN0IHN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gX2RhdGE7CisJdTggZmFuX2NvbmZpZyA9IGRhdGEtPmZhbl9jb25maWdbY2hhbm5lbCAlIE5SX0NIQU5ORUxdOworCisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9mYW5faW5wdXQ6CisJY2FzZSBod21vbl9mYW5fZmF1bHQ6CisJCWlmIChjaGFubmVsIDwgTlJfQ0hBTk5FTCB8fAorCQkgICAgKGZhbl9jb25maWcgJiBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVQpKQorCQkJcmV0dXJuIFNfSVJVR087CisJCXJldHVybiAwOworCWNhc2UgaHdtb25fZmFuX3RhcmdldDoKKwkJaWYgKGNoYW5uZWwgPCBOUl9DSEFOTkVMICYmCisJCSAgICAhKGZhbl9jb25maWcgJiBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVQpKQorCQkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWF4MzE3OTBfcmVhZF9wd20oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgIGxvbmcgKnZhbCkKK3sKIAlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IG1heDMxNzkwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlpbnQgZmF1bHQ7CisJdTggZmFuX2NvbmZpZyA9IGRhdGEtPmZhbl9jb25maWdbY2hhbm5lbF07CiAKIAlpZiAoSVNfRVJSKGRhdGEpKQogCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKIAotCWZhdWx0ID0gISEoZGF0YS0+ZmF1bHRfc3RhdHVzICYgKDEgPDwgYXR0ci0+aW5kZXgpKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBmYXVsdCk7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9wd21faW5wdXQ6CisJCSp2YWwgPSBkYXRhLT5wd21bY2hhbm5lbF0gPj4gODsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl9wd21fZW5hYmxlOgorCQlpZiAoZmFuX2NvbmZpZyAmIE1BWDMxNzkwX0ZBTl9DRkdfUlBNX01PREUpCisJCQkqdmFsID0gMjsKKwkJZWxzZSBpZiAoZmFuX2NvbmZpZyAmIE1BWDMxNzkwX0ZBTl9DRkdfVEFDSF9JTlBVVF9FTikKKwkJCSp2YWwgPSAxOworCQllbHNlCisJCQkqdmFsID0gMDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KIH0KIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuLCBOVUxMLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjNfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4sIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW40X2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuLCBOVUxMLCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNV9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjZfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4sIE5VTEwsIDUpOworc3RhdGljIGludCBtYXgzMTc5MF93cml0ZV9wd20oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYXR0ciwgaW50IGNoYW5uZWwsCisJCQkgICAgICBsb25nIHZhbCkKK3sKKwlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJdTggZmFuX2NvbmZpZzsKKwlpbnQgZXJyID0gMDsKIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2ZhdWx0LCBTX0lSVUdPLCBnZXRfZmFuX2ZhdWx0LCBOVUxMLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMl9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjNfZmF1bHQsIFNfSVJVR08sIGdldF9mYW5fZmF1bHQsIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW40X2ZhdWx0LCBTX0lSVUdPLCBnZXRfZmFuX2ZhdWx0LCBOVUxMLCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNV9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjZfZmF1bHQsIFNfSVJVR08sIGdldF9mYW5fZmF1bHQsIE5VTEwsIDUpOworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW43X2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuLCBOVUxMLCA2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuOF9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjlfaW5wdXQsIFNfSVJVR08sIGdldF9mYW4sIE5VTEwsIDgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMF9pbnB1dCwgU19JUlVHTywgZ2V0X2ZhbiwgTlVMTCwgOSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjExX2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuLCBOVUxMLCAxMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjEyX2lucHV0LCBTX0lSVUdPLCBnZXRfZmFuLCBOVUxMLCAxMSk7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl9wd21faW5wdXQ6CisJCWlmICh2YWwgPCAwIHx8IHZhbCA+IDI1NSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWRhdGEtPnB3bVtjaGFubmVsXSA9IHZhbCA8PCA4OworCQllcnIgPSBpMmNfc21idXNfd3JpdGVfd29yZF9zd2FwcGVkKGNsaWVudCwKKwkJCQkJCSAgIE1BWDMxNzkwX1JFR19QV01PVVQoY2hhbm5lbCksCisJCQkJCQkgICB2YWwpOworCQlicmVhazsKKwljYXNlIGh3bW9uX3B3bV9lbmFibGU6CisJCWZhbl9jb25maWcgPSBkYXRhLT5mYW5fY29uZmlnW2NoYW5uZWxdOworCQlpZiAodmFsID09IDApIHsKKwkJCWZhbl9jb25maWcgJj0gfihNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVRfRU4gfAorCQkJCQlNQVgzMTc5MF9GQU5fQ0ZHX1JQTV9NT0RFKTsKKwkJfSBlbHNlIGlmICh2YWwgPT0gMSkgeworCQkJZmFuX2NvbmZpZyA9IChmYW5fY29uZmlnIHwKKwkJCQkgICAgICBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVRfRU4pICYKKwkJCQkgICAgIH5NQVgzMTc5MF9GQU5fQ0ZHX1JQTV9NT0RFOworCQl9IGVsc2UgaWYgKHZhbCA9PSAyKSB7CisJCQlmYW5fY29uZmlnIHw9IE1BWDMxNzkwX0ZBTl9DRkdfVEFDSF9JTlBVVF9FTiB8CisJCQkJICAgICAgTUFYMzE3OTBfRkFOX0NGR19SUE1fTU9ERTsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlkYXRhLT5mYW5fY29uZmlnW2NoYW5uZWxdID0gZmFuX2NvbmZpZzsKKwkJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCU1BWDMxNzkwX1JFR19GQU5fQ09ORklHKGNoYW5uZWwpLAorCQkJCQlmYW5fY29uZmlnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW43X2ZhdWx0LCBTX0lSVUdPLCBnZXRfZmFuX2ZhdWx0LCBOVUxMLCA2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuOF9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgNyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjlfZmF1bHQsIFNfSVJVR08sIGdldF9mYW5fZmF1bHQsIE5VTEwsIDgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMF9mYXVsdCwgU19JUlVHTywgZ2V0X2Zhbl9mYXVsdCwgTlVMTCwgOSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjExX2ZhdWx0LCBTX0lSVUdPLCBnZXRfZmFuX2ZhdWx0LCBOVUxMLCAxMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjEyX2ZhdWx0LCBTX0lSVUdPLCBnZXRfZmFuX2ZhdWx0LCBOVUxMLCAxMSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV90YXJnZXQsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfZmFuX3RhcmdldCwgc2V0X2Zhbl90YXJnZXQsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX3RhcmdldCwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9mYW5fdGFyZ2V0LCBzZXRfZmFuX3RhcmdldCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjNfdGFyZ2V0LCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X2Zhbl90YXJnZXQsIHNldF9mYW5fdGFyZ2V0LCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNF90YXJnZXQsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfZmFuX3RhcmdldCwgc2V0X2Zhbl90YXJnZXQsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW41X3RhcmdldCwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9mYW5fdGFyZ2V0LCBzZXRfZmFuX3RhcmdldCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjZfdGFyZ2V0LCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X2Zhbl90YXJnZXQsIHNldF9mYW5fdGFyZ2V0LCA1KTsKKwlyZXR1cm4gZXJyOworfQogCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTEsIFNfSVdVU1IgfCBTX0lSVUdPLCBnZXRfcHdtLCBzZXRfcHdtLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMiwgU19JV1VTUiB8IFNfSVJVR08sIGdldF9wd20sIHNldF9wd20sIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20zLCBTX0lXVVNSIHwgU19JUlVHTywgZ2V0X3B3bSwgc2V0X3B3bSwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTQsIFNfSVdVU1IgfCBTX0lSVUdPLCBnZXRfcHdtLCBzZXRfcHdtLCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtNSwgU19JV1VTUiB8IFNfSVJVR08sIGdldF9wd20sIHNldF9wd20sIDQpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd202LCBTX0lXVVNSIHwgU19JUlVHTywgZ2V0X3B3bSwgc2V0X3B3bSwgNSk7CitzdGF0aWMgdW1vZGVfdCBtYXgzMTc5MF9wd21faXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwgdTMyIGF0dHIsIGludCBjaGFubmVsKQoreworCWNvbnN0IHN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gX2RhdGE7CisJdTggZmFuX2NvbmZpZyA9IGRhdGEtPmZhbl9jb25maWdbY2hhbm5lbF07CiAKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMV9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfcHdtX2VuYWJsZSwgc2V0X3B3bV9lbmFibGUsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20yX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9wd21fZW5hYmxlLCBzZXRfcHdtX2VuYWJsZSwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTNfZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X3B3bV9lbmFibGUsIHNldF9wd21fZW5hYmxlLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtNF9lbmFibGUsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQlnZXRfcHdtX2VuYWJsZSwgc2V0X3B3bV9lbmFibGUsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd201X2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCWdldF9wd21fZW5hYmxlLCBzZXRfcHdtX2VuYWJsZSwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTZfZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJZ2V0X3B3bV9lbmFibGUsIHNldF9wd21fZW5hYmxlLCA1KTsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3B3bV9pbnB1dDoKKwljYXNlIGh3bW9uX3B3bV9lbmFibGU6CisJCWlmICghKGZhbl9jb25maWcgJiBNQVgzMTc5MF9GQU5fQ0ZHX1RBQ0hfSU5QVVQpKQorCQkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYXgzMTc5MF9hdHRyc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorc3RhdGljIGludCBtYXgzMTc5MF9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCSB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2ZhbjoKKwkJcmV0dXJuIG1heDMxNzkwX3JlYWRfZmFuKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwljYXNlIGh3bW9uX3B3bToKKwkJcmV0dXJuIG1heDMxNzkwX3JlYWRfcHdtKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQogCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW40X2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW41X2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW42X2ZhdWx0LmRldl9hdHRyLmF0dHIsCitzdGF0aWMgaW50IG1heDMxNzkwX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCSAgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHZhbCkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2ZhbjoKKwkJcmV0dXJuIG1heDMxNzkwX3dyaXRlX2ZhbihkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl9wd206CisJCXJldHVybiBtYXgzMTc5MF93cml0ZV9wd20oZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CiAKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjEwX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMTJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKK3N0YXRpYyB1bW9kZV90IG1heDMxNzkwX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqZGF0YSwKKwkJCQkgICBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJCSAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2ZhbjoKKwkJcmV0dXJuIG1heDMxNzkwX2Zhbl9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWNhc2UgaHdtb25fcHdtOgorCQlyZXR1cm4gbWF4MzE3OTBfcHdtX2lzX3Zpc2libGUoZGF0YSwgYXR0ciwgY2hhbm5lbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQogCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW43X2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW44X2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW45X2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xMF9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMTFfZmF1bHQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjEyX2ZhdWx0LmRldl9hdHRyLmF0dHIsCitzdGF0aWMgY29uc3QgdTMyIG1heDMxNzkwX2Zhbl9jb25maWdbXSA9IHsKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9UQVJHRVQgfCBIV01PTl9GX0ZBVUxULAorCUhXTU9OX0ZfSU5QVVQgfCBIV01PTl9GX1RBUkdFVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfVEFSR0VUIHwgSFdNT05fRl9GQVVMVCwKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9UQVJHRVQgfCBIV01PTl9GX0ZBVUxULAorCUhXTU9OX0ZfSU5QVVQgfCBIV01PTl9GX1RBUkdFVCB8IEhXTU9OX0ZfRkFVTFQsCisJSFdNT05fRl9JTlBVVCB8IEhXTU9OX0ZfVEFSR0VUIHwgSFdNT05fRl9GQVVMVCwKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9GQVVMVCwKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9GQVVMVCwKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9GQVVMVCwKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9GQVVMVCwKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9GQVVMVCwKKwlIV01PTl9GX0lOUFVUIHwgSFdNT05fRl9GQVVMVCwKKwkwCit9OwogCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xX3RhcmdldC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl90YXJnZXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfdGFyZ2V0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW40X3RhcmdldC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuNV90YXJnZXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjZfdGFyZ2V0LmRldl9hdHRyLmF0dHIsCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBtYXgzMTc5MF9mYW4gPSB7CisJLnR5cGUgPSBod21vbl9mYW4sCisJLmNvbmZpZyA9IG1heDMxNzkwX2Zhbl9jb25maWcsCit9OwogCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20xLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20zLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd200LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd201LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd202LmRldl9hdHRyLmF0dHIsCitzdGF0aWMgY29uc3QgdTMyIG1heDMxNzkwX3B3bV9jb25maWdbXSA9IHsKKwlIV01PTl9QV01fSU5QVVQgfCBIV01PTl9QV01fRU5BQkxFLAorCUhXTU9OX1BXTV9JTlBVVCB8IEhXTU9OX1BXTV9FTkFCTEUsCisJSFdNT05fUFdNX0lOUFVUIHwgSFdNT05fUFdNX0VOQUJMRSwKKwlIV01PTl9QV01fSU5QVVQgfCBIV01PTl9QV01fRU5BQkxFLAorCUhXTU9OX1BXTV9JTlBVVCB8IEhXTU9OX1BXTV9FTkFCTEUsCisJSFdNT05fUFdNX0lOUFVUIHwgSFdNT05fUFdNX0VOQUJMRSwKKwkwCit9OwogCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20xX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMl9lbmFibGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTNfZW5hYmxlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd200X2VuYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtNV9lbmFibGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTZfZW5hYmxlLmRldl9hdHRyLmF0dHIsCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBtYXgzMTc5MF9wd20gPSB7CisJLnR5cGUgPSBod21vbl9wd20sCisJLmNvbmZpZyA9IG1heDMxNzkwX3B3bV9jb25maWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqbWF4MzE3OTBfaW5mb1tdID0geworCSZtYXgzMTc5MF9mYW4sCisJJm1heDMxNzkwX3B3bSwKIAlOVUxMCiB9OwogCi1zdGF0aWMgdW1vZGVfdCBtYXgzMTc5MF9hdHRyc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYSwgaW50IG4pCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwotCXN0cnVjdCBtYXgzMTc5MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIgPQotCQkJY29udGFpbmVyX29mKGEsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlLCBhdHRyKTsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4ICUgTlJfQ0hBTk5FTDsKLQl1OCBmYW5fY29uZmlnOwotCi0JZmFuX2NvbmZpZyA9IGRhdGEtPmZhbl9jb25maWdbaW5kZXhdOwotCi0JaWYgKG4gPj0gTlJfQ0hBTk5FTCAqIDIgJiYgbiA8IE5SX0NIQU5ORUwgKiA0ICYmCi0JICAgICEoZmFuX2NvbmZpZyAmIE1BWDMxNzkwX0ZBTl9DRkdfVEFDSF9JTlBVVCkpCi0JCXJldHVybiAwOwotCWlmIChuID49IE5SX0NIQU5ORUwgKiA0ICYmIChmYW5fY29uZmlnICYgTUFYMzE3OTBfRkFOX0NGR19UQUNIX0lOUFVUKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gYS0+bW9kZTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbWF4MzE3OTBfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbWF4MzE3OTBfYXR0cnMsCi0JLmlzX3Zpc2libGUgPSBtYXgzMTc5MF9hdHRyc192aXNpYmxlLAorc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgbWF4MzE3OTBfaHdtb25fb3BzID0geworCS5pc192aXNpYmxlID0gbWF4MzE3OTBfaXNfdmlzaWJsZSwKKwkucmVhZCA9IG1heDMxNzkwX3JlYWQsCisJLndyaXRlID0gbWF4MzE3OTBfd3JpdGUsCiB9OwotX19BVFRSSUJVVEVfR1JPVVBTKG1heDMxNzkwKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gbWF4MzE3OTBfY2hpcF9pbmZvID0geworCS5vcHMgPSAmbWF4MzE3OTBfaHdtb25fb3BzLAorCS5pbmZvID0gbWF4MzE3OTBfaW5mbywKK307CiAKIHN0YXRpYyBpbnQgbWF4MzE3OTBfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCQlzdHJ1Y3QgbWF4MzE3OTBfZGF0YSAqZGF0YSkKQEAgLTU3NSw4ICs1MDAsMTAgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LAotCQkJY2xpZW50LT5uYW1lLCBkYXRhLCBtYXgzMTc5MF9ncm91cHMpOworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgZGF0YSwKKwkJCQkJCQkgJm1heDMxNzkwX2NoaXBfaW5mbywKKwkJCQkJCQkgTlVMTCk7CiAKIAlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKGh3bW9uX2Rldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL21heDY2NTAuYyBiL2RyaXZlcnMvaHdtb24vbWF4NjY1MC5jCmluZGV4IDE2MmE1MjAuLmE5OTNiNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbWF4NjY1MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbWF4NjY1MC5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KICNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogCiAvKgogICogSW5zbW9kIHBhcmFtZXRlcnMKQEAgLTQ4LDcgKzQ5LDcgQEAKIHN0YXRpYyBpbnQgZmFuX3ZvbHRhZ2U7CiAvKiBwcmVzY2FsZXI6IFBvc3NpYmxlIHZhbHVlcyBhcmUgMSwgMiwgNCwgOCwgMTYgb3IgMCBmb3IgZG9uJ3QgY2hhbmdlICovCiBzdGF0aWMgaW50IHByZXNjYWxlcjsKLS8qIGNsb2NrOiBUaGUgY2xvY2sgZnJlcXVlbmN5IG9mIHRoZSBjaGlwIHRoZSBkcml2ZXIgc2hvdWxkIGFzc3VtZSAqLworLyogY2xvY2s6IFRoZSBjbG9jayBmcmVxdWVuY3kgb2YgdGhlIGNoaXAgKG1heDY2NTEgY2FuIGJlIGNsb2NrZWQgZXh0ZXJuYWxseSkgKi8KIHN0YXRpYyBpbnQgY2xvY2sgPSAyNTQwMDA7CiAKIG1vZHVsZV9wYXJhbShmYW5fdm9sdGFnZSwgaW50LCBTX0lSVUdPKTsKQEAgLTEzMyw2ICsxMzQsMTkgQEAKIAlNQVg2NjUwX1JFR19UQUNIMywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1heDY2NTBfZHRfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gIm1heGltLG1heDY2NTAiLAorCQkuZGF0YSA9ICh2b2lkICopMQorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg2NjUxIiwKKwkJLmRhdGEgPSAodm9pZCAqKTQKKwl9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtYXg2NjUwX2R0X21hdGNoKTsKKwogc3RhdGljIHN0cnVjdCBtYXg2NjUwX2RhdGEgKm1heDY2NTBfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1heDY2NTBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtMTcxLDYgKzE4NSwzMCBAQAogCXJldHVybiBkYXRhOwogfQogCisvKgorICogQ2hhbmdlIHRoZSBvcGVyYXRpbmcgbW9kZSBvZiB0aGUgY2hpcCAoaWYgbmVlZGVkKS4KKyAqIG1vZGUgaXMgb25lIG9mIHRoZSBNQVg2NjUwX0NGR19NT0RFXyogdmFsdWVzLgorICovCitzdGF0aWMgaW50IG1heDY2NTBfc2V0X29wZXJhdGluZ19tb2RlKHN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEsIHU4IG1vZGUpCit7CisJaW50IHJlc3VsdDsKKwl1OCBjb25maWcgPSBkYXRhLT5jb25maWc7CisKKwlpZiAobW9kZSA9PSAoY29uZmlnICYgTUFYNjY1MF9DRkdfTU9ERV9NQVNLKSkKKwkJcmV0dXJuIDA7CisKKwljb25maWcgPSAoY29uZmlnICYgfk1BWDY2NTBfQ0ZHX01PREVfTUFTSykgfCBtb2RlOworCisJcmVzdWx0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIE1BWDY2NTBfUkVHX0NPTkZJRywKKwkJCQkJICAgY29uZmlnKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWRhdGEtPmNvbmZpZyA9IGNvbmZpZzsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3NpemVfdCBnZXRfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCiAJCSAgICAgICBjaGFyICpidWYpCiB7CkBAIC0yNTIsMTggKzI5MCwxMiBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBycG0pOwogfQogCi1zdGF0aWMgc3NpemVfdCBzZXRfdGFyZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCitzdGF0aWMgaW50IG1heDY2NTBfc2V0X3RhcmdldChzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhLCB1bnNpZ25lZCBsb25nIHJwbSkKIHsKLQlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlpbnQga3NjYWxlLCBrdGFjaDsKLQl1bnNpZ25lZCBsb25nIHJwbTsKLQlpbnQgZXJyOwogCi0JZXJyID0ga3N0cnRvdWwoYnVmLCAxMCwgJnJwbSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwlpZiAocnBtID09IDApCisJCXJldHVybiBtYXg2NjUwX3NldF9vcGVyYXRpbmdfbW9kZShkYXRhLCBNQVg2NjUwX0NGR19NT0RFX09GRik7CiAKIAlycG0gPSBjbGFtcF92YWwocnBtLCBGQU5fUlBNX01JTiwgRkFOX1JQTV9NQVgpOwogCkBAIC0yNzQsOCArMzA2LDYgQEAKIAkgKiAgICAgS1RBQ0ggPSBbKGZDTEsgeCBLU0NBTEUpIC8gKDI1NiB4IEZhblNwZWVkKV0gLSAxCiAJICovCiAKLQltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7Ci0KIAlrc2NhbGUgPSBESVZfRlJPTV9SRUcoZGF0YS0+Y29uZmlnKTsKIAlrdGFjaCA9ICgoY2xvY2sgKiBrc2NhbGUpIC8gKDI1NiAqIHJwbSAvIDYwKSkgLSAxOwogCWlmIChrdGFjaCA8IDApCkBAIC0yODQsMTAgKzMxNCwzMCBAQAogCQlrdGFjaCA9IDI1NTsKIAlkYXRhLT5zcGVlZCA9IGt0YWNoOwogCi0JaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX1NQRUVELCBkYXRhLT5zcGVlZCk7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBNQVg2NjUwX1JFR19TUEVFRCwKKwkJCQkJIGRhdGEtPnNwZWVkKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3RhcmdldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHJwbTsKKwlpbnQgZXJyOworCisJZXJyID0ga3N0cnRvdWwoYnVmLCAxMCwgJnJwbSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWVyciA9IG1heDY2NTBfc2V0X3RhcmdldChkYXRhLCBycG0pOwogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMzQxLDEyICszOTEsMTEgQEAKIAkJZGF0YS0+ZGFjID0gMTgwIC0gKDE4MCAqIHB3bSkvMjU1OwogCWVsc2UKIAkJZGF0YS0+ZGFjID0gNzYgLSAoNzYgKiBwd20pLzI1NTsKLQotCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19EQUMsIGRhdGEtPmRhYyk7CisJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0RBQywgZGF0YS0+ZGFjKTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JcmV0dXJuIGNvdW50OworCXJldHVybiBlcnIgPCAwID8gZXJyIDogY291bnQ7CiB9CiAKIC8qCkBAIC0zNTUsMTQgKzQwNCwxNCBAQAogICogMCA9IEZhbiBhbHdheXMgb24KICAqIDEgPSBPcGVuIGxvb3AsIFZvbHRhZ2UgaXMgc2V0IGFjY29yZGluZyB0byBzcGVlZCwgbm90IHJlZ3VsYXRlZC4KICAqIDIgPSBDbG9zZWQgbG9vcCwgUlBNIGZvciBhbGwgZmFucyByZWd1bGF0ZWQgYnkgZmFuMSB0YWNob21ldGVyCisgKiAzID0gRmFuIG9mZgogICovCi0KIHN0YXRpYyBzc2l6ZV90IGdldF9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKIAkJCSAgY2hhciAqYnVmKQogewogCXN0cnVjdCBtYXg2NjUwX2RhdGEgKmRhdGEgPSBtYXg2NjUwX3VwZGF0ZV9kZXZpY2UoZGV2KTsKIAlpbnQgbW9kZSA9IChkYXRhLT5jb25maWcgJiBNQVg2NjUwX0NGR19NT0RFX01BU0spID4+IDQ7Ci0JaW50IHN5c2ZzX21vZGVzWzRdID0gezAsIDEsIDIsIDF9OworCWludCBzeXNmc19tb2Rlc1s0XSA9IHswLCAzLCAyLCAxfTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzeXNmc19tb2Rlc1ttb2RlXSk7CiB9CkBAIC0zNzEsMjUgKzQyMCwyNSBAQAogCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQlpbnQgbWF4NjY1MF9tb2Rlc1szXSA9IHswLCAzLCAyfTsKIAl1bnNpZ25lZCBsb25nIG1vZGU7CiAJaW50IGVycjsKKwljb25zdCB1OCBtYXg2NjUwX21vZGVzW10gPSB7CisJCU1BWDY2NTBfQ0ZHX01PREVfT04sCisJCU1BWDY2NTBfQ0ZHX01PREVfT1BFTl9MT09QLAorCQlNQVg2NjUwX0NGR19NT0RFX0NMT1NFRF9MT09QLAorCQlNQVg2NjUwX0NGR19NT0RFX09GRiwKKwkJfTsKIAogCWVyciA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZtb2RlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKG1vZGUgPiAyKQorCWlmIChtb2RlID49IEFSUkFZX1NJWkUobWF4NjY1MF9tb2RlcykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCi0JZGF0YS0+Y29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfQ09ORklHKTsKLQlkYXRhLT5jb25maWcgPSAoZGF0YS0+Y29uZmlnICYgfk1BWDY2NTBfQ0ZHX01PREVfTUFTSykKLQkJICAgICAgIHwgKG1heDY2NTBfbW9kZXNbbW9kZV0gPDwgNCk7Ci0KLQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfQ09ORklHLCBkYXRhLT5jb25maWcpOworCW1heDY2NTBfc2V0X29wZXJhdGluZ19tb2RlKGRhdGEsIG1heDY2NTBfbW9kZXNbbW9kZV0pOwogCiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKQEAgLTU2Niw2ICs2MTUsMTggQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJaW50IGNvbmZpZzsKIAlpbnQgZXJyID0gLUVJTzsKKwl1MzIgdm9sdGFnZTsKKwl1MzIgcHJlc2NhbGU7CisJdTMyIHRhcmdldF9ycG07CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAibWF4aW0sZmFuLW1pY3Jvdm9sdCIsCisJCQkJICZ2b2x0YWdlKSkKKwkJdm9sdGFnZSA9IGZhbl92b2x0YWdlOworCWVsc2UKKwkJdm9sdGFnZSAvPSAxMDAwMDAwOyAvKiBNaWNyb3ZvbHRzIHRvIHZvbHRzICovCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgIm1heGltLGZhbi1wcmVzY2FsZSIsCisJCQkJICZwcmVzY2FsZSkpCisJCXByZXNjYWxlID0gcHJlc2NhbGVyOwogCiAJY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfQ09ORklHKTsKIApAQCAtNTc0LDcgKzYzNSw3IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Jc3dpdGNoIChmYW5fdm9sdGFnZSkgeworCXN3aXRjaCAodm9sdGFnZSkgewogCWNhc2UgMDoKIAkJYnJlYWs7CiAJY2FzZSA1OgpAQCAtNTg0LDE0ICs2NDUsMTAgQEAKIAkJY29uZmlnIHw9IE1BWDY2NTBfQ0ZHX1YxMjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihkZXYsICJpbGxlZ2FsIHZhbHVlIGZvciBmYW5fdm9sdGFnZSAoJWQpXG4iLAotCQkJZmFuX3ZvbHRhZ2UpOworCQlkZXZfZXJyKGRldiwgImlsbGVnYWwgdmFsdWUgZm9yIGZhbl92b2x0YWdlICglZClcbiIsIHZvbHRhZ2UpOwogCX0KIAotCWRldl9pbmZvKGRldiwgIkZhbiB2b2x0YWdlIGlzIHNldCB0byAlZFYuXG4iLAotCQkgKGNvbmZpZyAmIE1BWDY2NTBfQ0ZHX1YxMikgPyAxMiA6IDUpOwotCi0Jc3dpdGNoIChwcmVzY2FsZXIpIHsKKwlzd2l0Y2ggKHByZXNjYWxlKSB7CiAJY2FzZSAwOgogCQlicmVhazsKIAljYXNlIDE6CkBAIC02MTQsMjggKzY3MSwxMyBAQAogCQkJIHwgTUFYNjY1MF9DRkdfUFJFU0NBTEVSXzE2OwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGRldiwgImlsbGVnYWwgdmFsdWUgZm9yIHByZXNjYWxlciAoJWQpXG4iLCBwcmVzY2FsZXIpOworCQlkZXZfZXJyKGRldiwgImlsbGVnYWwgdmFsdWUgZm9yIHByZXNjYWxlciAoJWQpXG4iLCBwcmVzY2FsZSk7CiAJfQogCi0JZGV2X2luZm8oZGV2LCAiUHJlc2NhbGVyIGlzIHNldCB0byAlZC5cbiIsCisJZGV2X2luZm8oZGV2LCAiRmFuIHZvbHRhZ2U6ICVkViwgcHJlc2NhbGVyOiAlZC5cbiIsCisJCSAoY29uZmlnICYgTUFYNjY1MF9DRkdfVjEyKSA/IDEyIDogNSwKIAkJIDEgPDwgKGNvbmZpZyAmIE1BWDY2NTBfQ0ZHX1BSRVNDQUxFUl9NQVNLKSk7CiAKLQkvKgotCSAqIElmIG1vZGUgaXMgc2V0IHRvICJmdWxsIG9mZiIsIHdlIGNoYW5nZSBpdCB0byAib3BlbiBsb29wIiBhbmQKLQkgKiBzZXQgREFDIHRvIDI1NSwgd2hpY2ggaGFzIHRoZSBzYW1lIGVmZmVjdC4gV2UgZG8gdGhpcyBiZWNhdXNlCi0JICogdGhlcmUncyBubyAiZnVsbCBvZmYiIG1vZGUgZGVmaW5lZCBpbiBod21vbiBzcGVjaWZpY2F0aW9ucy4KLQkgKi8KLQotCWlmICgoY29uZmlnICYgTUFYNjY1MF9DRkdfTU9ERV9NQVNLKSA9PSBNQVg2NjUwX0NGR19NT0RFX09GRikgewotCQlkZXZfZGJnKGRldiwgIkNoYW5nZSBtb2RlIHRvIG9wZW4gbG9vcCwgZnVsbCBvZmYuXG4iKTsKLQkJY29uZmlnID0gKGNvbmZpZyAmIH5NQVg2NjUwX0NGR19NT0RFX01BU0spCi0JCQkgfCBNQVg2NjUwX0NGR19NT0RFX09QRU5fTE9PUDsKLQkJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBNQVg2NjUwX1JFR19EQUMsIDI1NSkpIHsKLQkJCWRldl9lcnIoZGV2LCAiREFDIHdyaXRlIGVycm9yLCBhYm9ydGluZy5cbiIpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KLQogCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUFYNjY1MF9SRUdfQ09ORklHLCBjb25maWcpKSB7CiAJCWRldl9lcnIoZGV2LCAiQ29uZmlnIHdyaXRlIGVycm9yLCBhYm9ydGluZy5cbiIpOwogCQlyZXR1cm4gZXJyOwpAQCAtNjQ0LDYgKzY4NiwxMiBAQAogCWRhdGEtPmNvbmZpZyA9IGNvbmZpZzsKIAlkYXRhLT5jb3VudCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDY2NTBfUkVHX0NPVU5UKTsKIAorCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIoY2xpZW50LT5kZXYub2Zfbm9kZSwgIm1heGltLGZhbi10YXJnZXQtcnBtIiwKKwkJCQkgICZ0YXJnZXRfcnBtKSkgeworCQltYXg2NjUwX3NldF90YXJnZXQoZGF0YSwgdGFyZ2V0X3JwbSk7CisJCW1heDY2NTBfc2V0X29wZXJhdGluZ19tb2RlKGRhdGEsIE1BWDY2NTBfQ0ZHX01PREVfQ0xPU0VEX0xPT1ApOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC02NTEsNiArNjk5LDggQEAKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkID0KKwkJb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihtYXg2NjUwX2R0X21hdGNoKSwgZGV2KTsKIAlzdHJ1Y3QgbWF4NjY1MF9kYXRhICpkYXRhOwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAlpbnQgZXJyOwpAQCAtNjYxLDcgKzcxMSw3IEBACiAKIAlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwotCWRhdGEtPm5yX2ZhbnMgPSBpZC0+ZHJpdmVyX2RhdGE7CisJZGF0YS0+bnJfZmFucyA9IG9mX2lkID8gKGludCkodWludHB0cl90KW9mX2lkLT5kYXRhIDogaWQtPmRyaXZlcl9kYXRhOwogCiAJLyoKIAkgKiBJbml0aWFsaXplIHRoZSBtYXg2NjUwIGNoaXAKQEAgLTY5MSw2ICs3NDEsNyBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1heDY2NTBfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gIm1heDY2NTAiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobWF4NjY1MF9kdF9tYXRjaCksCiAJfSwKIAkucHJvYmUJCT0gbWF4NjY1MF9wcm9iZSwKIAkuaWRfdGFibGUJPSBtYXg2NjUwX2lkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9uY3Q2Nzc1LmMgYi9kcml2ZXJzL2h3bW9uL25jdDY3NzUuYwppbmRleCBkMDg3YThlLi5jZTc1ZGQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL25jdDY3NzUuYworKysgYi9kcml2ZXJzL2h3bW9uL25jdDY3NzUuYwpAQCAtMTk1LDYgKzE5NSw4IEBACiAKICNkZWZpbmUgTlVNX0ZBTgkJNgogCisjZGVmaW5lIFRFTVBfU09VUkNFX1ZJUlRVQUwJMHgxZgorCiAvKiBDb21tb24gYW5kIE5DVDY3NzUgc3BlY2lmaWMgZGF0YSAqLwogCiAvKiBWb2x0YWdlIG1pbi9tYXggcmVnaXN0ZXJzIGZvciBucj03Li4xNCBhcmUgaW4gYmFuayA1ICovCkBAIC0zOTQwLDcgKzM5NDIsNyBAQAogCQkJY29udGludWU7CiAKIAkJc3JjID0gbmN0Njc3NV9yZWFkX3ZhbHVlKGRhdGEsIGRhdGEtPlJFR19URU1QX1NFTFtpXSkgJiAweDFmOwotCQlpZiAoIXNyYyB8fCAobWFzayAmICgxIDw8IHNyYykpKQorCQlpZiAoIXNyYykKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChzcmMgPj0gZGF0YS0+dGVtcF9sYWJlbF9udW0gfHwKQEAgLTM5NTIsNyArMzk1NCwxNiBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQltYXNrIHw9IDEgPDwgc3JjOworCQkvKgorCQkgKiBGb3IgdmlydHVhbCB0ZW1wZXJhdHVyZSBzb3VyY2VzLCB0aGUgJ3ZpcnR1YWwnIHRlbXBlcmF0dXJlCisJCSAqIGZvciBlYWNoIGZhbiByZWZsZWN0cyBhIGRpZmZlcmVudCB0ZW1wZXJhdHVyZSwgYW5kIHRoZXJlCisJCSAqIGFyZSBubyBkdXBsaWNhdGVzLgorCQkgKi8KKwkJaWYgKHNyYyAhPSBURU1QX1NPVVJDRV9WSVJUVUFMKSB7CisJCQlpZiAobWFzayAmICgxIDw8IHNyYykpCisJCQkJY29udGludWU7CisJCQltYXNrIHw9IDEgPDwgc3JjOworCQl9CiAKIAkJLyogVXNlIGZpeGVkIGluZGV4IGZvciBTWVNUSU4oMSksIENQVVRJTigyKSwgQVVYVElOKDMpICovCiAJCWlmIChzcmMgPD0gZGF0YS0+dGVtcF9maXhlZF9udW0pIHsKQEAgLTQyMzIsMTEgKzQyNDMsMTEgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKGZvcmNlX2lkKQorCXZhbCA9IChzdXBlcmlvX2luYihzaW9hZGRyLCBTSU9fUkVHX0RFVklEKSA8PCA4KSB8CisJCXN1cGVyaW9faW5iKHNpb2FkZHIsIFNJT19SRUdfREVWSUQgKyAxKTsKKwlpZiAoZm9yY2VfaWQgJiYgdmFsICE9IDB4ZmZmZikKIAkJdmFsID0gZm9yY2VfaWQ7Ci0JZWxzZQotCQl2YWwgPSAoc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19ERVZJRCkgPDwgOCkKLQkJICAgIHwgc3VwZXJpb19pbmIoc2lvYWRkciwgU0lPX1JFR19ERVZJRCArIDEpOworCiAJc3dpdGNoICh2YWwgJiBTSU9fSURfTUFTSykgewogCWNhc2UgU0lPX05DVDYxMDZfSUQ6CiAJCXNpb19kYXRhLT5raW5kID0gbmN0NjEwNjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbmN0NzkwNC5jIGIvZHJpdmVycy9od21vbi9uY3Q3OTA0LmMKaW5kZXggMDhmZjg5ZC4uOTVhNjhhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9uY3Q3OTA0LmMKKysrIGIvZHJpdmVycy9od21vbi9uY3Q3OTA0LmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KIAogI2RlZmluZSBWRU5ET1JfSURfUkVHCQkweDdBCS8qIEFueSBiYW5rICovCiAjZGVmaW5lIE5VVk9UT05fSUQJCTB4NTAKQEAgLTE1MywzNDEgKzE1MiwyMzAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBGQU5JTiBBVFRSICovCi1zdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQorc3RhdGljIGludCBuY3Q3OTA0X3JlYWRfZmFuKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgIGxvbmcgKnZhbCkKIHsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwogCXN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgY250LCBycG07CiAJaW50IHJldDsKLQl1bnNpZ25lZCBjbnQsIHJwbTsKIAotCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsIEZBTklOMV9IVl9SRUcgKyBpbmRleCAqIDIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCWNudCA9ICgocmV0ICYgMHhmZjAwKSA+PiAzKSB8IChyZXQgJiAweDFmKTsKLQlpZiAoY250ID09IDB4MWZmZikKLQkJcnBtID0gMDsKLQllbHNlCi0JCXJwbSA9IDEzNTAwMDAgLyBjbnQ7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHJwbSk7CisJc3dpdGNoKGF0dHIpIHsKKwljYXNlIGh3bW9uX2Zhbl9pbnB1dDoKKwkJcmV0ID0gbmN0NzkwNF9yZWFkX3JlZzE2KGRhdGEsIEJBTktfMCwKKwkJCQkJIEZBTklOMV9IVl9SRUcgKyBjaGFubmVsICogMik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJY250ID0gKChyZXQgJiAweGZmMDApID4+IDMpIHwgKHJldCAmIDB4MWYpOworCQlpZiAoY250ID09IDB4MWZmZikKKwkJCXJwbSA9IDA7CisJCWVsc2UKKwkJCXJwbSA9IDEzNTAwMDAgLyBjbnQ7CisJCSp2YWwgPSBycG07CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiB9CiAKLXN0YXRpYyB1bW9kZV90IG5jdDc5MDRfZmFuaW5faXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkJc3RydWN0IGF0dHJpYnV0ZSAqYSwgaW50IG4pCitzdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X2Zhbl9pc192aXNpYmxlKGNvbnN0IHZvaWQgKl9kYXRhLCB1MzIgYXR0ciwgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwotCXN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwljb25zdCBzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gX2RhdGE7CiAKLQlpZiAoZGF0YS0+ZmFuaW5fbWFzayAmICgxIDw8IG4pKQotCQlyZXR1cm4gYS0+bW9kZTsKKwlpZiAoYXR0ciA9PSBod21vbl9mYW5faW5wdXQgJiYgZGF0YS0+ZmFuaW5fbWFzayAmICgxIDw8IGNoYW5uZWwpKQorCQlyZXR1cm4gU19JUlVHTzsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuM19pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjVfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCA0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNl9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW43X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjhfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCA3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuOV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMF9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDEwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMTJfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAxMSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpuY3Q3OTA0X2ZhbmluX2F0dHJzW10gPSB7Ci0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW40X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW41X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW42X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW43X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW44X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW45X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9mYW4xMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfZmFuMTFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2ZhbjEyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JTlVMTAorc3RhdGljIHU4IG5jdDc5MDRfY2hhbl90b19pbmRleFtdID0geworCTAsCS8qIE5vdCB1c2VkICovCisJMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKwkxOCwgMTksIDIwLCAxNgogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbmN0NzkwNF9mYW5pbl9ncm91cCA9IHsKLQkuYXR0cnMgPSBuY3Q3OTA0X2ZhbmluX2F0dHJzLAotCS5pc192aXNpYmxlID0gbmN0NzkwNF9mYW5pbl9pc192aXNpYmxlLAotfTsKLQotLyogVlNFTiBBVFRSICovCi1zdGF0aWMgc3NpemVfdCBzaG93X3ZvbHRhZ2Uoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgaW50IG5jdDc5MDRfcmVhZF9pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgIGxvbmcgKnZhbCkKIHsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwogCXN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgcmV0OwotCWludCB2b2x0OworCWludCByZXQsIHZvbHQsIGluZGV4OwogCi0JcmV0ID0gbmN0NzkwNF9yZWFkX3JlZzE2KGRhdGEsIEJBTktfMCwgVlNFTjFfSFZfUkVHICsgaW5kZXggKiAyKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQl2b2x0ID0gKChyZXQgJiAweGZmMDApID4+IDUpIHwgKHJldCAmIDB4Nyk7Ci0JaWYgKGluZGV4IDwgMTQpCi0JCXZvbHQgKj0gMjsgLyogMC4wMDJWIHNjYWxlICovCi0JZWxzZQotCQl2b2x0ICo9IDY7IC8qIDAuMDA2ViBzY2FsZSAqLworCWluZGV4ID0gbmN0NzkwNF9jaGFuX3RvX2luZGV4W2NoYW5uZWxdOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZvbHQpOworCXN3aXRjaChhdHRyKSB7CisJY2FzZSBod21vbl9pbl9pbnB1dDoKKwkJcmV0ID0gbmN0NzkwNF9yZWFkX3JlZzE2KGRhdGEsIEJBTktfMCwKKwkJCQkJIFZTRU4xX0hWX1JFRyArIGluZGV4ICogMik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJdm9sdCA9ICgocmV0ICYgMHhmZjAwKSA+PiA1KSB8IChyZXQgJiAweDcpOworCQlpZiAoaW5kZXggPCAxNCkKKwkJCXZvbHQgKj0gMjsgLyogMC4wMDJWIHNjYWxlICovCisJCWVsc2UKKwkJCXZvbHQgKj0gNjsgLyogMC4wMDZWIHNjYWxlICovCisJCSp2YWwgPSB2b2x0OworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X2x0ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyB1bW9kZV90IG5jdDc5MDRfaW5faXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwgdTMyIGF0dHIsIGludCBjaGFubmVsKQogewotCXN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgcmV0OwotCWludCB0ZW1wOworCWNvbnN0IHN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBfZGF0YTsKKwlpbnQgaW5kZXggPSBuY3Q3OTA0X2NoYW5fdG9faW5kZXhbY2hhbm5lbF07CiAKLQlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnMTYoZGF0YSwgQkFOS18wLCBMVERfSFZfUkVHKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQl0ZW1wID0gKChyZXQgJiAweGZmMDApID4+IDUpIHwgKHJldCAmIDB4Nyk7Ci0JdGVtcCA9IHNpZ25fZXh0ZW5kMzIodGVtcCwgMTApICogMTI1OworCWlmIChjaGFubmVsID4gMCAmJiBhdHRyID09IGh3bW9uX2luX2lucHV0ICYmCisJICAgIChkYXRhLT52c2VuX21hc2sgJiBCSVQoaW5kZXgpKSkKKwkJcmV0dXJuIFNfSVJVR087CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCk7Ci19Ci0KLXN0YXRpYyB1bW9kZV90IG5jdDc5MDRfdnNlbl9pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCSAgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphLCBpbnQgbikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JaWYgKGRhdGEtPnZzZW5fbWFzayAmICgxIDw8IG4pKQotCQlyZXR1cm4gYS0+bW9kZTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4zX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCA0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW42X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjdfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgNik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluOF9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCA3KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW45X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDgpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjEwX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjExX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDEwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMl9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTNfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjE0X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDEzKTsKLS8qCi0gKiBOZXh0IDMgdm9sdGFnZSBzZW5zb3JzIGhhdmUgc3BlY2lmaWMgbmFtZXMgaW4gdGhlIE51dm90b24gZG9jCi0gKiAoM1ZERCwgVkJBVCwgM1ZTQikgYnV0IHdlIHVzZSB2YWNhbnQgbnVtYmVycyBmb3IgdGhlbS4KLSAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjE1X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDE0KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xNl9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxNSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMjBfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTYpOwotLyogVGhpcyBpcyBub3QgYSB2b2x0YWdlLCBidXQgYSBsb2NhbCB0ZW1wZXJhdHVyZSBzZW5zb3IuICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X2x0ZW1wLCBOVUxMLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xN19pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxOCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMThfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTkpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjE5X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDIwKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm5jdDc5MDRfdnNlbl9hdHRyc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfaW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW40X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW43X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9pbjhfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4xMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4xM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4xNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4xNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4xNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfaW4yMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMThfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX2luMTlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBuY3Q3OTA0X3ZzZW5fZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbmN0NzkwNF92c2VuX2F0dHJzLAotCS5pc192aXNpYmxlID0gbmN0NzkwNF92c2VuX2lzX3Zpc2libGUsCi19OwotCi0vKiBDUFVfVEVNUCBBVFRSICovCi1zdGF0aWMgc3NpemVfdCBzaG93X3RjcHUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCitzdGF0aWMgaW50IG5jdDc5MDRfcmVhZF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGF0dHIsIGludCBjaGFubmVsLAorCQkJICAgICBsb25nICp2YWwpCiB7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHJldDsKLQlpbnQgdGVtcDsKKwlpbnQgcmV0LCB0ZW1wOwogCi0JcmV0ID0gbmN0NzkwNF9yZWFkX3JlZzE2KGRhdGEsIEJBTktfMCwgVF9DUFUxX0hWX1JFRyArIGluZGV4ICogMik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQl0ZW1wID0gKChyZXQgJiAweGZmMDApID4+IDUpIHwgKHJldCAmIDB4Nyk7Ci0JdGVtcCA9IHNpZ25fZXh0ZW5kMzIodGVtcCwgMTApICogMTI1OwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wKTsKKwlzd2l0Y2goYXR0cikgeworCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwkJaWYgKGNoYW5uZWwgPT0gMCkKKwkJCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsIExURF9IVl9SRUcpOworCQllbHNlCisJCQlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnMTYoZGF0YSwgQkFOS18wLAorCQkJCQlUX0NQVTFfSFZfUkVHICsgKGNoYW5uZWwgLSAxKSAqIDIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXRlbXAgPSAoKHJldCAmIDB4ZmYwMCkgPj4gNSkgfCAocmV0ICYgMHg3KTsKKwkJKnZhbCA9IHNpZ25fZXh0ZW5kMzIodGVtcCwgMTApICogMTI1OworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X3RjcHVfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYSwgaW50IG4pCitzdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X3RlbXBfaXNfdmlzaWJsZShjb25zdCB2b2lkICpfZGF0YSwgdTMyIGF0dHIsIGludCBjaGFubmVsKQogewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKLQlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJY29uc3Qgc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IF9kYXRhOwogCi0JaWYgKGRhdGEtPnRjcHVfbWFzayAmICgxIDw8IG4pKQotCQlyZXR1cm4gYS0+bW9kZTsKKwlpZiAoYXR0ciA9PSBod21vbl90ZW1wX2lucHV0KSB7CisJCWlmIChjaGFubmVsID09IDApIHsKKwkJCWlmIChkYXRhLT52c2VuX21hc2sgJiBCSVQoMTcpKQorCQkJCXJldHVybiBTX0lSVUdPOworCQl9IGVsc2UgeworCQkJaWYgKGRhdGEtPnRjcHVfbWFzayAmIEJJVChjaGFubmVsIC0gMSkpCisJCQkJcmV0dXJuIFNfSVJVR087CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIAotLyogInRlbXAxX2lucHV0IiByZXNlcnZlZCBmb3IgbG9jYWwgdGVtcCAqLwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190Y3B1LCBOVUxMLCAwKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X2lucHV0LCBTX0lSVUdPLCBzaG93X3RjcHUsIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNV9pbnB1dCwgU19JUlVHTywgc2hvd190Y3B1LCBOVUxMLCAzKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDZfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgNCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA3X2lucHV0LCBTX0lSVUdPLCBzaG93X3RjcHUsIE5VTEwsIDUpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wOF9pbnB1dCwgU19JUlVHTywgc2hvd190Y3B1LCBOVUxMLCA2KTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDlfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgNyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpuY3Q3OTA0X3RjcHVfYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA1X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNl9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDdfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXA4X2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wOV9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG5jdDc5MDRfdGNwdV9ncm91cCA9IHsKLQkuYXR0cnMgPSBuY3Q3OTA0X3RjcHVfYXR0cnMsCi0JLmlzX3Zpc2libGUgPSBuY3Q3OTA0X3RjcHVfaXNfdmlzaWJsZSwKLX07Ci0KLS8qIFBXTSBBVFRSICovCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9wd20oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyBpbnQgbmN0NzkwNF9yZWFkX3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICBsb25nICp2YWwpCiB7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IHJldDsKIAotCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh2YWwgPiAyNTUpCi0JCXJldHVybiAtRUlOVkFMOworCXN3aXRjaChhdHRyKSB7CisJY2FzZSBod21vbl9wd21faW5wdXQ6CisJCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX09VVF9SRUcgKyBjaGFubmVsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gcmV0OworCQlyZXR1cm4gMDsKKwljYXNlIGh3bW9uX3B3bV9lbmFibGU6CisJCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX0ZNUl9SRUcgKyBjaGFubmVsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gbmN0NzkwNF93cml0ZV9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX09VVF9SRUcgKyBpbmRleCwgdmFsKTsKLQotCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKKwkJKnZhbCA9IHJldCA/IDIgOiAxOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi1zdGF0aWMgc3NpemVfdCBzaG93X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQorc3RhdGljIGludCBuY3Q3OTA0X3dyaXRlX3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwKKwkJCSAgICAgbG9uZyB2YWwpCiB7Ci0JaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKIAlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IHZhbDsKLQotCXZhbCA9IG5jdDc5MDRfcmVhZF9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX09VVF9SRUcgKyBpbmRleCk7Ci0JaWYgKHZhbCA8IDApCi0JCXJldHVybiB2YWw7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3RvcmVfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKLQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCXN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKIAlpbnQgcmV0OwogCi0JaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHZhbCA8IDEgfHwgdmFsID4gMiB8fCAodmFsID09IDIgJiYgIWRhdGEtPmZhbl9tb2RlW2luZGV4XSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gbmN0NzkwNF93cml0ZV9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX0ZNUl9SRUcgKyBpbmRleCwKLQkJCQl2YWwgPT0gMiA/IGRhdGEtPmZhbl9tb2RlW2luZGV4XSA6IDApOwotCi0JcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OworCXN3aXRjaChhdHRyKSB7CisJY2FzZSBod21vbl9wd21faW5wdXQ6CisJCWlmICh2YWwgPCAwIHx8IHZhbCA+IDI1NSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSBuY3Q3OTA0X3dyaXRlX3JlZyhkYXRhLCBCQU5LXzMsIEZBTkNUTDFfT1VUX1JFRyArIGNoYW5uZWwsCisJCQkJCXZhbCk7CisJCXJldHVybiByZXQ7CisJY2FzZSBod21vbl9wd21fZW5hYmxlOgorCQlpZiAodmFsIDwgMSB8fCB2YWwgPiAyIHx8CisJCSAgICAodmFsID09IDIgJiYgIWRhdGEtPmZhbl9tb2RlW2NoYW5uZWxdKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSBuY3Q3OTA0X3dyaXRlX3JlZyhkYXRhLCBCQU5LXzMsIEZBTkNUTDFfRk1SX1JFRyArIGNoYW5uZWwsCisJCQkJCXZhbCA9PSAyID8gZGF0YS0+ZmFuX21vZGVbY2hhbm5lbF0gOiAwKTsKKwkJcmV0dXJuIHJldDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogfQogCi0vKiBSZXR1cm4gMSBmb3IgbWFudWFsIG1vZGUgb3IgMiBmb3IgU21hcnRGYW4gbW9kZSAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYyB1bW9kZV90IG5jdDc5MDRfcHdtX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqX2RhdGEsIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCXN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgdmFsOwotCi0JdmFsID0gbmN0NzkwNF9yZWFkX3JlZyhkYXRhLCBCQU5LXzMsIEZBTkNUTDFfRk1SX1JFRyArIGluZGV4KTsKLQlpZiAodmFsIDwgMCkKLQkJcmV0dXJuIHZhbDsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwgPyAyIDogMSk7CisJc3dpdGNoKGF0dHIpIHsKKwljYXNlIGh3bW9uX3B3bV9pbnB1dDoKKwljYXNlIGh3bW9uX3B3bV9lbmFibGU6CisJCXJldHVybiBTX0lSVUdPIHwgU19JV1VTUjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CiB9CiAKLS8qIDIgYXR0cmlidXRlcyBwZXIgY2hhbm5lbDogcHdtIGFuZCBtb2RlICovCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTEsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJc2hvd19wd20sIHN0b3JlX3B3bSwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTFfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCXNob3dfZW5hYmxlLCBzdG9yZV9lbmFibGUsIDApOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20yLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCXNob3dfcHdtLCBzdG9yZV9wd20sIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihwd20yX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQlzaG93X2VuYWJsZSwgc3RvcmVfZW5hYmxlLCAxKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMywgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQlzaG93X3B3bSwgc3RvcmVfcHdtLCAyKTsKLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtM19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJc2hvd19lbmFibGUsIHN0b3JlX2VuYWJsZSwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTQsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJc2hvd19wd20sIHN0b3JlX3B3bSwgMyk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHB3bTRfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCXNob3dfZW5hYmxlLCBzdG9yZV9lbmFibGUsIDMpOworc3RhdGljIGludCBuY3Q3OTA0X3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkJdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nICp2YWwpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBod21vbl9pbjoKKwkJcmV0dXJuIG5jdDc5MDRfcmVhZF9pbihkZXYsIGF0dHIsIGNoYW5uZWwsIHZhbCk7CisJY2FzZSBod21vbl9mYW46CisJCXJldHVybiBuY3Q3OTA0X3JlYWRfZmFuKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwljYXNlIGh3bW9uX3B3bToKKwkJcmV0dXJuIG5jdDc5MDRfcmVhZF9wd20oZGV2LCBhdHRyLCBjaGFubmVsLCB2YWwpOworCWNhc2UgaHdtb25fdGVtcDoKKwkJcmV0dXJuIG5jdDc5MDRfcmVhZF90ZW1wKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbmN0NzkwNF9mYW5jdGxfYXR0cnNbXSA9IHsKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTEuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTFfZW5hYmxlLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20yLmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl9wd20yX2VuYWJsZS5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtMy5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfcHdtM19lbmFibGUuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3B3bTRfZW5hYmxlLmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKK3N0YXRpYyBpbnQgbmN0NzkwNF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgdTMyIGF0dHIsIGludCBjaGFubmVsLCBsb25nIHZhbCkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX3B3bToKKwkJcmV0dXJuIG5jdDc5MDRfd3JpdGVfcHdtKGRldiwgYXR0ciwgY2hhbm5lbCwgdmFsKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBuY3Q3OTA0X2ZhbmN0bF9ncm91cCA9IHsKLQkuYXR0cnMgPSBuY3Q3OTA0X2ZhbmN0bF9hdHRycywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpuY3Q3OTA0X2dyb3Vwc1tdID0gewotCSZuY3Q3OTA0X2ZhbmluX2dyb3VwLAotCSZuY3Q3OTA0X3ZzZW5fZ3JvdXAsCi0JJm5jdDc5MDRfdGNwdV9ncm91cCwKLQkmbmN0NzkwNF9mYW5jdGxfZ3JvdXAsCi0JTlVMTAotfTsKK3N0YXRpYyB1bW9kZV90IG5jdDc5MDRfaXNfdmlzaWJsZShjb25zdCB2b2lkICpkYXRhLAorCQkJCSAgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCQkgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIGh3bW9uX2luOgorCQlyZXR1cm4gbmN0NzkwNF9pbl9pc192aXNpYmxlKGRhdGEsIGF0dHIsIGNoYW5uZWwpOworCWNhc2UgaHdtb25fZmFuOgorCQlyZXR1cm4gbmN0NzkwNF9mYW5faXNfdmlzaWJsZShkYXRhLCBhdHRyLCBjaGFubmVsKTsKKwljYXNlIGh3bW9uX3B3bToKKwkJcmV0dXJuIG5jdDc5MDRfcHdtX2lzX3Zpc2libGUoZGF0YSwgYXR0ciwgY2hhbm5lbCk7CisJY2FzZSBod21vbl90ZW1wOgorCQlyZXR1cm4gbmN0NzkwNF90ZW1wX2lzX3Zpc2libGUoZGF0YSwgYXR0ciwgY2hhbm5lbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQogCiAvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KIHN0YXRpYyBpbnQgbmN0NzkwNF9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKQEAgLTUxMiw2ICs0MDAsMTAzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCB1MzIgbmN0NzkwNF9pbl9jb25maWdbXSA9IHsKKwlIV01PTl9JX0lOUFVULCAgICAgICAgICAgICAgICAgIC8qIGR1bW15LCBza2lwcGVkIGluIGlzX3Zpc2libGUgKi8KKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJSFdNT05fSV9JTlBVVCwKKwlIV01PTl9JX0lOUFVULAorCUhXTU9OX0lfSU5QVVQsCisJMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbmN0NzkwNF9pbiA9IHsKKwkudHlwZSA9IGh3bW9uX2luLAorCS5jb25maWcgPSBuY3Q3OTA0X2luX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgbmN0NzkwNF9mYW5fY29uZmlnW10gPSB7CisgICAgICAgICAgICBIV01PTl9GX0lOUFVULAorICAgICAgICAgICAgSFdNT05fRl9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX0ZfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9GX0lOUFVULAorICAgICAgICAgICAgSFdNT05fRl9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX0ZfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9GX0lOUFVULAorICAgICAgICAgICAgSFdNT05fRl9JTlBVVCwKKwkgICAgMAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gbmN0NzkwNF9mYW4gPSB7CisJLnR5cGUgPSBod21vbl9mYW4sCisJLmNvbmZpZyA9IG5jdDc5MDRfZmFuX2NvbmZpZywKK307CisKK3N0YXRpYyBjb25zdCB1MzIgbmN0NzkwNF9wd21fY29uZmlnW10gPSB7CisgICAgICAgICAgICBIV01PTl9QV01fSU5QVVQgfCBIV01PTl9QV01fRU5BQkxFLAorICAgICAgICAgICAgSFdNT05fUFdNX0lOUFVUIHwgSFdNT05fUFdNX0VOQUJMRSwKKyAgICAgICAgICAgIEhXTU9OX1BXTV9JTlBVVCB8IEhXTU9OX1BXTV9FTkFCTEUsCisgICAgICAgICAgICBIV01PTl9QV01fSU5QVVQgfCBIV01PTl9QV01fRU5BQkxFLAorCSAgICAwCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyBuY3Q3OTA0X3B3bSA9IHsKKwkudHlwZSA9IGh3bW9uX3B3bSwKKwkuY29uZmlnID0gbmN0NzkwNF9wd21fY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHUzMiBuY3Q3OTA0X3RlbXBfY29uZmlnW10gPSB7CisgICAgICAgICAgICBIV01PTl9UX0lOUFVULAorICAgICAgICAgICAgSFdNT05fVF9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX1RfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9UX0lOUFVULAorICAgICAgICAgICAgSFdNT05fVF9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX1RfSU5QVVQsCisgICAgICAgICAgICBIV01PTl9UX0lOUFVULAorICAgICAgICAgICAgSFdNT05fVF9JTlBVVCwKKyAgICAgICAgICAgIEhXTU9OX1RfSU5QVVQsCisJICAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIG5jdDc5MDRfdGVtcCA9IHsKKwkudHlwZSA9IGh3bW9uX3RlbXAsCisJLmNvbmZpZyA9IG5jdDc5MDRfdGVtcF9jb25maWcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqbmN0NzkwNF9pbmZvW10gPSB7CisJJm5jdDc5MDRfaW4sCisJJm5jdDc5MDRfZmFuLAorCSZuY3Q3OTA0X3B3bSwKKwkmbmN0NzkwNF90ZW1wLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fb3BzIG5jdDc5MDRfaHdtb25fb3BzID0geworCS5pc192aXNpYmxlID0gbmN0NzkwNF9pc192aXNpYmxlLAorCS5yZWFkID0gbmN0NzkwNF9yZWFkLAorCS53cml0ZSA9IG5jdDc5MDRfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoaXBfaW5mbyBuY3Q3OTA0X2NoaXBfaW5mbyA9IHsKKwkub3BzID0gJm5jdDc5MDRfaHdtb25fb3BzLAorCS5pbmZvID0gbmN0NzkwNF9pbmZvLAorfTsKKwogc3RhdGljIGludCBuY3Q3OTA0X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewpAQCAtNTY2LDggKzU1MSw4IEBACiAJfQogCiAJaHdtb25fZGV2ID0KLQkJZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBjbGllbnQtPm5hbWUsIGRhdGEsCi0JCQkJCQkgICAgICAgbmN0NzkwNF9ncm91cHMpOworCQlkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBjbGllbnQtPm5hbWUsIGRhdGEsCisJCQkJCQkgICAgICZuY3Q3OTA0X2NoaXBfaW5mbywgTlVMTCk7CiAJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL250Y190aGVybWlzdG9yLmMgYi9kcml2ZXJzL2h3bW9uL250Y190aGVybWlzdG9yLmMKaW5kZXggOGVmN2I3MS4uYzUyZDA3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9udGNfdGhlcm1pc3Rvci5jCisrKyBiL2RyaXZlcnMvaHdtb24vbnRjX3RoZXJtaXN0b3IuYwpAQCAtMjUzLDEyICsyNTMsOSBAQAogfTsKIAogc3RydWN0IG50Y19kYXRhIHsKLQlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJc3RydWN0IG50Y190aGVybWlzdG9yX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCWNvbnN0IHN0cnVjdCBudGNfY29tcGVuc2F0aW9uICpjb21wOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgbl9jb21wOwotCWNoYXIgbmFtZVtQTEFURk9STV9OQU1FX1NJWkVdOwogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX09GKSAmJiBJU19FTkFCTEVEKENPTkZJR19JSU8pCkBAIC0zMTYsMjIgKzMxMywyMiBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbnRjX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICoKLW50Y190aGVybWlzdG9yX3BhcnNlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitudGNfdGhlcm1pc3Rvcl9wYXJzZV9kdChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGlpb19jaGFubmVsICpjaGFuOwogCWVudW0gaWlvX2NoYW5fdHlwZSB0eXBlOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwogCXN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlpbnQgcmV0OwogCiAJaWYgKCFucCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJcGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQljaGFuID0gaWlvX2NoYW5uZWxfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWNoYW4gPSBkZXZtX2lpb19jaGFubmVsX2dldChkZXYsIE5VTEwpOwogCWlmIChJU19FUlIoY2hhbikpCiAJCXJldHVybiBFUlJfQ0FTVChjaGFuKTsKIApAQCAtMzU5LDIyICszNTYsMTUgQEAKIAogCXJldHVybiBwZGF0YTsKIH0KLXN0YXRpYyB2b2lkIG50Y19paW9fY2hhbm5lbF9yZWxlYXNlKHN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKLXsKLQlpZiAocGRhdGEtPmNoYW4pCi0JCWlpb19jaGFubmVsX3JlbGVhc2UocGRhdGEtPmNoYW4pOwotfQogI2Vsc2UKIHN0YXRpYyBzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqCi1udGNfdGhlcm1pc3Rvcl9wYXJzZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorbnRjX3RoZXJtaXN0b3JfcGFyc2VfZHQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXJldHVybiBOVUxMOwogfQogCiAjZGVmaW5lIG50Y19tYXRjaAlOVUxMCiAKLXN0YXRpYyB2b2lkIG50Y19paW9fY2hhbm5lbF9yZWxlYXNlKHN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YSkKLXsgfQogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdTY0IGRpdjY0X3U2NF9zYWZlKHU2NCBkaXZpZGVuZCwgdTY0IGRpdmlzb3IpCkBAIC01MTYsOSArNTA2LDggQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBudGNfcmVhZF90ZW1wKHZvaWQgKmRldiwgaW50ICp0ZW1wKQorc3RhdGljIGludCBudGNfcmVhZF90ZW1wKHZvaWQgKmRhdGEsIGludCAqdGVtcCkKIHsKLQlzdHJ1Y3QgbnRjX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgb2htOwogCiAJb2htID0gbnRjX3RoZXJtaXN0b3JfZ2V0X29obShkYXRhKTsKQEAgLTUzMCwxNCArNTE5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QgbnRjX3Nob3dfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IG50Y19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgZGF0YS0+bmFtZSk7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IG50Y19zaG93X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtNTU5LDE4ICs1NDAsMTMgQEAKIAogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV90eXBlLCBTX0lSVUdPLCBudGNfc2hvd190eXBlLCBOVUxMLCAwKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIG50Y19zaG93X3RlbXAsIE5VTEwsIDApOwotc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIG50Y19zaG93X25hbWUsIE5VTEwpOwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbnRjX2F0dHJpYnV0ZXNbXSA9IHsKLQkmZGV2X2F0dHJfbmFtZS5hdHRyLAorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm50Y19hdHRyc1tdID0gewogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfdHlwZS5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAlOVUxMLAogfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbnRjX2F0dHJfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbnRjX2F0dHJpYnV0ZXMsCi19OworQVRUUklCVVRFX0dST1VQUyhudGMpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRoZXJtYWxfem9uZV9vZl9kZXZpY2Vfb3BzIG50Y19vZl90aGVybWFsX29wcyA9IHsKIAkuZ2V0X3RlbXAgPSBudGNfcmVhZF90ZW1wLApAQCAtNTc5LDMzICs1NTUsMzQgQEAKIHN0YXRpYyBpbnQgbnRjX3RoZXJtaXN0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHo7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZCA9Ci0JCQlvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKG50Y19tYXRjaCksICZwZGV2LT5kZXYpOworCQkJb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihudGNfbWF0Y2gpLCBkZXYpOwogCWNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgKnBkZXZfaWQ7CiAJc3RydWN0IG50Y190aGVybWlzdG9yX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKIAlzdHJ1Y3QgbnRjX2RhdGEgKmRhdGE7Ci0JaW50IHJldDsKIAotCXBkYXRhID0gbnRjX3RoZXJtaXN0b3JfcGFyc2VfZHQocGRldik7CisJcGRhdGEgPSBudGNfdGhlcm1pc3Rvcl9wYXJzZV9kdChkZXYpOwogCWlmIChJU19FUlIocGRhdGEpKQogCQlyZXR1cm4gUFRSX0VSUihwZGF0YSk7CiAJZWxzZSBpZiAocGRhdGEgPT0gTlVMTCkKLQkJcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCQlwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKIAogCWlmICghcGRhdGEpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gaW5pdCBkYXRhIHN1cHBsaWVkLlxuIik7CisJCWRldl9lcnIoZGV2LCAiTm8gcGxhdGZvcm0gaW5pdCBkYXRhIHN1cHBsaWVkLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCS8qIEVpdGhlciBvbmUgb2YgdGhlIHR3byBpcyByZXF1aXJlZC4gKi8KIAlpZiAoIXBkYXRhLT5yZWFkX3V2ICYmICFwZGF0YS0+cmVhZF9vaG0pIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQlkZXZfZXJyKGRldiwKIAkJCSJCb3RoIHJlYWRfdXYgYW5kIHJlYWRfb2htIG1pc3NpbmcuIE5lZWQgZWl0aGVyIG9uZSBvZiB0aGUgdHdvLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChwZGF0YS0+cmVhZF91diAmJiBwZGF0YS0+cmVhZF9vaG0pIHsKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJZGV2X3dhcm4oZGV2LAogCQkJICJPbmx5IG9uZSBvZiByZWFkX3V2IGFuZCByZWFkX29obSBpcyBuZWVkZWQ7IGlnbm9yaW5nIHJlYWRfdXYuXG4iKTsKIAkJcGRhdGEtPnJlYWRfdXYgPSBOVUxMOwogCX0KQEAgLTYxNywyMCArNTk0LDE3IEBACiAJCQkJIE5UQ19DT05ORUNURURfUE9TSVRJVkUpIHx8CiAJCQkJKHBkYXRhLT5jb25uZWN0ICE9IE5UQ19DT05ORUNURURfUE9TSVRJVkUgJiYKIAkJCQkgcGRhdGEtPmNvbm5lY3QgIT0gTlRDX0NPTk5FQ1RFRF9HUk9VTkQpKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiUmVxdWlyZWQgZGF0YSB0byB1c2UgcmVhZF91diBub3Qgc3VwcGxpZWQuXG4iKTsKKwkJZGV2X2VycihkZXYsICJSZXF1aXJlZCBkYXRhIHRvIHVzZSByZWFkX3V2IG5vdCBzdXBwbGllZC5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbnRjX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBudGNfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwZGV2X2lkID0gb2ZfaWQgPyBvZl9pZC0+ZGF0YSA6IHBsYXRmb3JtX2dldF9kZXZpY2VfaWQocGRldik7CiAKLQlkYXRhLT5kZXYgPSAmcGRldi0+ZGV2OwogCWRhdGEtPnBkYXRhID0gcGRhdGE7Ci0Jc3RybGNweShkYXRhLT5uYW1lLCBwZGV2X2lkLT5uYW1lLCBzaXplb2YoZGF0YS0+bmFtZSkpOwogCiAJc3dpdGNoIChwZGV2X2lkLT5kcml2ZXJfZGF0YSkgewogCWNhc2UgVFlQRV9OQ1BYWFdCNDczOgpAQCAtNjU0LDQ5ICs2MjgsMjUgQEAKIAkJZGF0YS0+bl9jb21wID0gQVJSQVlfU0laRShuY3BYWHhoMTAzKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBkZXZpY2UgdHlwZTogJWx1KCVzKVxuIiwKKwkJZGV2X2VycihkZXYsICJVbmtub3duIGRldmljZSB0eXBlOiAlbHUoJXMpXG4iLAogCQkJCXBkZXZfaWQtPmRyaXZlcl9kYXRhLCBwZGV2X2lkLT5uYW1lKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7Ci0KLQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRhdGEtPmRldi0+a29iaiwgJm50Y19hdHRyX2dyb3VwKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGF0YS0+ZGV2LCAidW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyBmaWxlc1xuIik7Ci0JCXJldHVybiByZXQ7CisJaHdtb25fZGV2ID0gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoZGV2LCBwZGV2X2lkLT5uYW1lLAorCQkJCQkJCSAgIGRhdGEsIG50Y19ncm91cHMpOworCWlmIChJU19FUlIoaHdtb25fZGV2KSkgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byByZWdpc3RlciBhcyBod21vbiBkZXZpY2UuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoaHdtb25fZGV2KTsKIAl9CiAKLQlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoZGF0YS0+ZGV2KTsKLQlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKLQkJZGV2X2VycihkYXRhLT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgYXMgaHdtb24gZGV2aWNlLlxuIik7Ci0JCXJldCA9IFBUUl9FUlIoZGF0YS0+aHdtb25fZGV2KTsKLQkJZ290byBlcnJfYWZ0ZXJfc3lzZnM7Ci0JfQorCWRldl9pbmZvKGRldiwgIlRoZXJtaXN0b3IgdHlwZTogJXMgc3VjY2Vzc2Z1bGx5IHByb2JlZC5cbiIsCisJCSBwZGV2X2lkLT5uYW1lKTsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJUaGVybWlzdG9yIHR5cGU6ICVzIHN1Y2Nlc3NmdWxseSBwcm9iZWQuXG4iLAotCQkJCQkJCQlwZGV2X2lkLT5uYW1lKTsKLQotCXR6ID0gZGV2bV90aGVybWFsX3pvbmVfb2Zfc2Vuc29yX3JlZ2lzdGVyKGRhdGEtPmRldiwgMCwgZGF0YS0+ZGV2LAorCXR6ID0gZGV2bV90aGVybWFsX3pvbmVfb2Zfc2Vuc29yX3JlZ2lzdGVyKGRldiwgMCwgZGF0YSwKIAkJCQkJCSAgJm50Y19vZl90aGVybWFsX29wcyk7CiAJaWYgKElTX0VSUih0eikpCi0JCWRldl9kYmcoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciB0byB0aGVybWFsIGZ3LlxuIik7Ci0KLQlyZXR1cm4gMDsKLWVycl9hZnRlcl9zeXNmczoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRhdGEtPmRldi0+a29iaiwgJm50Y19hdHRyX2dyb3VwKTsKLQludGNfaWlvX2NoYW5uZWxfcmVsZWFzZShwZGF0YSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBudGNfdGhlcm1pc3Rvcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbnRjX2RhdGEgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkYXRhLT5wZGF0YTsKLQotCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkYXRhLT5kZXYtPmtvYmosICZudGNfYXR0cl9ncm91cCk7Ci0JbnRjX2lpb19jaGFubmVsX3JlbGVhc2UocGRhdGEpOworCQlkZXZfZGJnKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciB0byB0aGVybWFsIGZ3LlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTcwNyw3ICs2NTcsNiBAQAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobnRjX21hdGNoKSwKIAl9LAogCS5wcm9iZSA9IG50Y190aGVybWlzdG9yX3Byb2JlLAotCS5yZW1vdmUgPSBudGNfdGhlcm1pc3Rvcl9yZW1vdmUsCiAJLmlkX3RhYmxlID0gbnRjX3RoZXJtaXN0b3JfaWQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL0tjb25maWcKaW5kZXggMDU0ZDNkOC4uY2FkMTIyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wbWJ1cy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvS2NvbmZpZwpAQCAtMTI2LDEyICsxMjYsMTIgQEAKIAkgIGJlIGNhbGxlZCB0cHM0MDQyMi4KIAogY29uZmlnIFNFTlNPUlNfVUNEOTAwMAotCXRyaXN0YXRlICJUSSBVQ0Q5MDEyMCwgVUNEOTAxMjQsIFVDRDkwOTAsIFVDRDkwOTEwIgorCXRyaXN0YXRlICJUSSBVQ0Q5MDEyMCwgVUNEOTAxMjQsIFVDRDkwMTYwLCBVQ0Q5MDkwLCBVQ0Q5MDkxMCIKIAlkZWZhdWx0IG4KIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBUSQotCSAgVUNEOTAxMjAsIFVDRDkwMTI0LCBVQ0Q5MDkwLCBVQ0Q5MDkxMCBTZXF1ZW5jZXIgYW5kIFN5c3RlbSBIZWFsdGgKLQkgIENvbnRyb2xsZXJzLgorCSAgVUNEOTAxMjAsIFVDRDkwMTI0LCBVQ0Q5MDE2MCwgVUNEOTA5MCwgVUNEOTA5MTAsIFNlcXVlbmNlciBhbmQgU3lzdGVtCisJICBIZWFsdGggQ29udHJvbGxlcnMuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCiAJICBiZSBjYWxsZWQgdWNkOTAwMC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXMuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXMuYwppbmRleCAwYTc0OTkxLi40NGNhOGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9wbWJ1cy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjL3BtYnVzLmg+CiAjaW5jbHVkZSAicG1idXMuaCIKIAogLyoKQEAgLTE2NywxNCArMTY4LDI2IEBACiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvICppbmZvOworCXN0cnVjdCBwbWJ1c19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OwogCi0JaW5mbyA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8pLAotCQkJICAgIEdGUF9LRVJORUwpOworCWluZm8gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWlmICghc3RyY21wKGlkLT5uYW1lLCAiZHBzNDYwIikgfHwgIXN0cmNtcChpZC0+bmFtZSwgImRwczgwMCIpIHx8CisJICAgICFzdHJjbXAoaWQtPm5hbWUsICJzZ2QwMDkiKSkgeworCQlwZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgcG1idXNfcGxhdGZvcm1fZGF0YSksCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZGF0YSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXBkYXRhLT5mbGFncyA9IFBNQlVTX1NLSVBfU1RBVFVTX0NIRUNLOworCX0KKwogCWluZm8tPnBhZ2VzID0gaWQtPmRyaXZlcl9kYXRhOwogCWluZm8tPmlkZW50aWZ5ID0gcG1idXNfaWRlbnRpZnk7CisJZGV2LT5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7CiAKIAlyZXR1cm4gcG1idXNfZG9fcHJvYmUoY2xpZW50LCBpZCwgaW5mbyk7CiB9CkBAIC0xODYsNiArMTk5LDggQEAKIAl7ImFkcDQwMDAiLCAxfSwKIAl7ImJtcjQ1MyIsIDF9LAogCXsiYm1yNDU0IiwgMX0sCisJeyJkcHM0NjAiLCAxfSwKKwl7ImRwczgwMCIsIDF9LAogCXsibWR0MDQwIiwgMX0sCiAJeyJuY3A0MjAwIiwgMX0sCiAJeyJuY3A0MjA4IiwgMX0sCkBAIC0xOTMsNiArMjA4LDcgQEAKIAl7InBkdDAwNiIsIDF9LAogCXsicGR0MDEyIiwgMX0sCiAJeyJwbWJ1cyIsIDB9LAorCXsic2dkMDA5IiwgMX0sCiAJeyJ0cHM0MDQwMCIsIDF9LAogCXsidHBzNTQ0YjIwIiwgMX0sCiAJeyJ0cHM1NDRiMjUiLCAxfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXMvdWNkOTAwMC5jIGIvZHJpdmVycy9od21vbi9wbWJ1cy91Y2Q5MDAwLmMKaW5kZXggZmJiMTQ3OS4uM2UzYWE5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wbWJ1cy91Y2Q5MDAwLmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy91Y2Q5MDAwLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMvcG1idXMuaD4KICNpbmNsdWRlICJwbWJ1cy5oIgogCi1lbnVtIGNoaXBzIHsgdWNkOTAwMCwgdWNkOTAxMjAsIHVjZDkwMTI0LCB1Y2Q5MDkwLCB1Y2Q5MDkxMCB9OworZW51bSBjaGlwcyB7IHVjZDkwMDAsIHVjZDkwMTIwLCB1Y2Q5MDEyNCwgdWNkOTAxNjAsIHVjZDkwOTAsIHVjZDkwOTEwIH07CiAKICNkZWZpbmUgVUNEOTAwMF9NT05JVE9SX0NPTkZJRwkJMHhkNQogI2RlZmluZSBVQ0Q5MDAwX05VTV9QQUdFUwkJMHhkNgpAQCAtMTEyLDYgKzExMiw3IEBACiAJeyJ1Y2Q5MDAwIiwgdWNkOTAwMH0sCiAJeyJ1Y2Q5MDEyMCIsIHVjZDkwMTIwfSwKIAl7InVjZDkwMTI0IiwgdWNkOTAxMjR9LAorCXsidWNkOTAxNjAiLCB1Y2Q5MDE2MH0sCiAJeyJ1Y2Q5MDkwIiwgdWNkOTA5MH0sCiAJeyJ1Y2Q5MDkxMCIsIHVjZDkwOTEwfSwKIAl7fQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zY3BpLWh3bW9uLmMgYi9kcml2ZXJzL2h3bW9uL3NjcGktaHdtb24uYwppbmRleCAyNWI0NGU2Li41NTlhM2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3NjcGktaHdtb24uYworKysgYi9kcml2ZXJzL2h3bW9uL3NjcGktaHdtb24uYwpAQCAtMjU1LDcgKzI1NSw2IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzY3BpX2h3bW9uX3BsYXRkcnYgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAic2NwaS1od21vbiIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBzY3BpX29mX21hdGNoLAogCX0sCiAJLnByb2JlCQk9IHNjcGlfaHdtb25fcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3RtcDEwMi5jIGIvZHJpdmVycy9od21vbi90bXAxMDIuYwppbmRleCA4NDc5YWM1Li4zNmJiYTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3RtcDEwMi5jCisrKyBiL2RyaXZlcnMvaHdtb24vdG1wMTAyLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvdGhlcm1hbC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNkZWZpbmUJRFJJVkVSX05BTUUgInRtcDEwMiIKQEAgLTc5LDg0ICs3OCwxMTMgQEAKIAlyZXR1cm4gKHZhbCAqIDEyOCkgLyAxMDAwOwogfQogCi1zdGF0aWMgaW50IHRtcDEwMl9yZWFkX3RlbXAodm9pZCAqZGV2LCBpbnQgKnRlbXApCitzdGF0aWMgaW50IHRtcDEwMl9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJICAgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdGVtcCkKIHsKIAlzdHJ1Y3QgdG1wMTAyICp0bXAxMDIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBpbnQgcmVnOwotCWludCByZXQ7CisJdW5zaWduZWQgaW50IHJlZ3ZhbDsKKwlpbnQgZXJyLCByZWc7CiAKLQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgdG1wMTAyLT5yZWFkeV90aW1lKSkgewotCQlkZXZfZGJnKGRldiwgIiVzOiBDb252ZXJzaW9uIG5vdCByZWFkeSB5ZXQuLlxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVBR0FJTjsKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9uX3RlbXBfaW5wdXQ6CisJCS8qIElzIGl0IHRvbyBlYXJseSB0byByZXR1cm4gYSBjb252ZXJzaW9uID8gKi8KKwkJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRtcDEwMi0+cmVhZHlfdGltZSkpIHsKKwkJCWRldl9kYmcoZGV2LCAiJXM6IENvbnZlcnNpb24gbm90IHJlYWR5IHlldC4uXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCQlyZWcgPSBUTVAxMDJfVEVNUF9SRUc7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9tYXhfaHlzdDoKKwkJcmVnID0gVE1QMTAyX1RMT1dfUkVHOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlyZWcgPSBUTVAxMDJfVEhJR0hfUkVHOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JcmV0ID0gcmVnbWFwX3JlYWQodG1wMTAyLT5yZWdtYXAsIFRNUDEwMl9URU1QX1JFRywgJnJlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkqdGVtcCA9IHRtcDEwMl9yZWdfdG9fbUMocmVnKTsKKwllcnIgPSByZWdtYXBfcmVhZCh0bXAxMDItPnJlZ21hcCwgcmVnLCAmcmVndmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkqdGVtcCA9IHRtcDEwMl9yZWdfdG9fbUMocmVndmFsKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3NpemVfdCB0bXAxMDJfc2hvd190ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljaGFyICpidWYpCitzdGF0aWMgaW50IHRtcDEwMl93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQl1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgdGVtcCkKIHsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNkYSA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKIAlzdHJ1Y3QgdG1wMTAyICp0bXAxMDIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgcmVnYWRkciA9IHNkYS0+aW5kZXg7Ci0JdW5zaWduZWQgaW50IHJlZzsKLQlpbnQgZXJyOworCWludCByZWc7CiAKLQlpZiAocmVnYWRkciA9PSBUTVAxMDJfVEVNUF9SRUcgJiYKLQkgICAgdGltZV9iZWZvcmUoamlmZmllcywgdG1wMTAyLT5yZWFkeV90aW1lKSkKLQkJcmV0dXJuIC1FQUdBSU47CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX21heF9oeXN0OgorCQlyZWcgPSBUTVAxMDJfVExPV19SRUc7CisJCWJyZWFrOworCWNhc2UgaHdtb25fdGVtcF9tYXg6CisJCXJlZyA9IFRNUDEwMl9USElHSF9SRUc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiAKLQllcnIgPSByZWdtYXBfcmVhZCh0bXAxMDItPnJlZ21hcCwgcmVnYWRkciwgJnJlZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdG1wMTAyX3JlZ190b19tQyhyZWcpKTsKKwl0ZW1wID0gY2xhbXBfdmFsKHRlbXAsIC0yNTYwMDAsIDI1NTAwMCk7CisJcmV0dXJuIHJlZ21hcF93cml0ZSh0bXAxMDItPnJlZ21hcCwgcmVnLCB0bXAxMDJfbUNfdG9fcmVnKHRlbXApKTsKIH0KIAotc3RhdGljIHNzaXplX3QgdG1wMTAyX3NldF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3N0YXRpYyB1bW9kZV90IHRtcDEwMl9pc192aXNpYmxlKGNvbnN0IHZvaWQgKmRhdGEsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkJIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKIHsKLQlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNkYSA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKLQlzdHJ1Y3QgdG1wMTAyICp0bXAxMDIgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgcmVnID0gc2RhLT5pbmRleDsKLQlsb25nIHZhbDsKLQlpbnQgZXJyOworCWlmICh0eXBlICE9IGh3bW9uX3RlbXApCisJCXJldHVybiAwOwogCi0JaWYgKGtzdHJ0b2woYnVmLCAxMCwgJnZhbCkgPCAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQl2YWwgPSBjbGFtcF92YWwodmFsLCAtMjU2MDAwLCAyNTUwMDApOwotCi0JZXJyID0gcmVnbWFwX3dyaXRlKHRtcDEwMi0+cmVnbWFwLCByZWcsIHRtcDEwMl9tQ190b19yZWcodmFsKSk7Ci0JcmV0dXJuIGVyciA/IDogY291bnQ7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQlyZXR1cm4gU19JUlVHTzsKKwljYXNlIGh3bW9uX3RlbXBfbWF4X2h5c3Q6CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJcmV0dXJuIFNfSVJVR08gfCBTX0lXVVNSOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KIH0KIAotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgdG1wMTAyX3Nob3dfdGVtcCwgTlVMTCwKLQkJCSAgVE1QMTAyX1RFTVBfUkVHKTsKK3N0YXRpYyB1MzIgdG1wMTAyX2NoaXBfY29uZmlnW10gPSB7CisJSFdNT05fQ19SRUdJU1RFUl9UWiwKKwkwCit9OwogCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgdG1wMTAyX3Nob3dfdGVtcCwKLQkJCSAgdG1wMTAyX3NldF90ZW1wLCBUTVAxMDJfVExPV19SRUcpOworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gdG1wMTAyX2NoaXAgPSB7CisJLnR5cGUgPSBod21vbl9jaGlwLAorCS5jb25maWcgPSB0bXAxMDJfY2hpcF9jb25maWcsCit9OwogCi1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHRtcDEwMl9zaG93X3RlbXAsCi0JCQkgIHRtcDEwMl9zZXRfdGVtcCwgVE1QMTAyX1RISUdIX1JFRyk7CitzdGF0aWMgdTMyIHRtcDEwMl90ZW1wX2NvbmZpZ1tdID0geworCUhXTU9OX1RfSU5QVVQgfCBIV01PTl9UX01BWCB8IEhXTU9OX1RfTUFYX0hZU1QsCisJMAorfTsKIAotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnRtcDEwMl9hdHRyc1tdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heF9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9tYXguZGV2X2F0dHIuYXR0ciwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIHRtcDEwMl90ZW1wID0geworCS50eXBlID0gaHdtb25fdGVtcCwKKwkuY29uZmlnID0gdG1wMTAyX3RlbXBfY29uZmlnLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKnRtcDEwMl9pbmZvW10gPSB7CisJJnRtcDEwMl9jaGlwLAorCSZ0bXAxMDJfdGVtcCwKIAlOVUxMCiB9OwotQVRUUklCVVRFX0dST1VQUyh0bXAxMDIpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHRoZXJtYWxfem9uZV9vZl9kZXZpY2Vfb3BzIHRtcDEwMl9vZl90aGVybWFsX29wcyA9IHsKLQkuZ2V0X3RlbXAgPSB0bXAxMDJfcmVhZF90ZW1wLAorc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgdG1wMTAyX2h3bW9uX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IHRtcDEwMl9pc192aXNpYmxlLAorCS5yZWFkID0gdG1wMTAyX3JlYWQsCisJLndyaXRlID0gdG1wMTAyX3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gdG1wMTAyX2NoaXBfaW5mbyA9IHsKKwkub3BzID0gJnRtcDEwMl9od21vbl9vcHMsCisJLmluZm8gPSB0bXAxMDJfaW5mbywKIH07CiAKIHN0YXRpYyB2b2lkIHRtcDEwMl9yZXN0b3JlX2NvbmZpZyh2b2lkICpkYXRhKQpAQCAtMTg4LDcgKzIxNiw3IEBACiB9OwogCiBzdGF0aWMgaW50IHRtcDEwMl9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCSAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CkBAIC0yNDksMTYgKzI3NywxNCBAQAogCQl0bXAxMDItPnJlYWR5X3RpbWUgKz0gbXNlY3NfdG9famlmZmllcyhDT05WRVJTSU9OX1RJTUVfTVMpOwogCX0KIAotCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGRldiwgY2xpZW50LT5uYW1lLAotCQkJCQkJCSAgIHRtcDEwMiwKLQkJCQkJCQkgICB0bXAxMDJfZ3JvdXBzKTsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBjbGllbnQtPm5hbWUsCisJCQkJCQkJIHRtcDEwMiwKKwkJCQkJCQkgJnRtcDEwMl9jaGlwX2luZm8sCisJCQkJCQkJIE5VTEwpOwogCWlmIChJU19FUlIoaHdtb25fZGV2KSkgewogCQlkZXZfZGJnKGRldiwgInVuYWJsZSB0byByZWdpc3RlciBod21vbiBkZXZpY2VcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihod21vbl9kZXYpOwogCX0KLQlkZXZtX3RoZXJtYWxfem9uZV9vZl9zZW5zb3JfcmVnaXN0ZXIoaHdtb25fZGV2LCAwLCBod21vbl9kZXYsCi0JCQkJCSAgICAgJnRtcDEwMl9vZl90aGVybWFsX29wcyk7Ci0KIAlkZXZfaW5mbyhkZXYsICJpbml0aWFsaXplZFxuIik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdG1wNDIxLmMgYi9kcml2ZXJzL2h3bW9uL3RtcDQyMS5jCmluZGV4IDg1ZDQ4ZDguLmJmYjk4YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdG1wNDIxLmMKKysrIGIvZHJpdmVycy9od21vbi90bXA0MjEuYwpAQCAtNzIsNiArNzIsMTAgQEAKIHN0cnVjdCB0bXA0MjFfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CisJdTMyIHRlbXBfY29uZmlnWzVdOworCXN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gdGVtcF9pbmZvOworCWNvbnN0IHN0cnVjdCBod21vbl9jaGFubmVsX2luZm8gKmluZm9bMl07CisJc3RydWN0IGh3bW9uX2NoaXBfaW5mbyBjaGlwOwogCWNoYXIgdmFsaWQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CiAJaW50IGNoYW5uZWxzOwpAQCAtMTI1LDg1ICsxMjksNDYgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQorc3RhdGljIGludCB0bXA0MjFfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCSAgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZhbCkKIHsKLQlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCXN0cnVjdCB0bXA0MjFfZGF0YSAqZGF0YSA9IHRtcDQyMV91cGRhdGVfZGV2aWNlKGRldik7Ci0JaW50IHRlbXA7CisJc3RydWN0IHRtcDQyMV9kYXRhICp0bXA0MjEgPSB0bXA0MjFfdXBkYXRlX2RldmljZShkZXYpOwogCi0JbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwotCWlmIChkYXRhLT5jb25maWcgJiBUTVA0MjFfQ09ORklHX1JBTkdFKQotCQl0ZW1wID0gdGVtcF9mcm9tX3UxNihkYXRhLT50ZW1wW2luZGV4XSk7Ci0JZWxzZQotCQl0ZW1wID0gdGVtcF9mcm9tX3MxNihkYXRhLT50ZW1wW2luZGV4XSk7Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCQlpZiAodG1wNDIxLT5jb25maWcgJiBUTVA0MjFfQ09ORklHX1JBTkdFKQorCQkJKnZhbCA9IHRlbXBfZnJvbV91MTYodG1wNDIxLT50ZW1wW2NoYW5uZWxdKTsKKwkJZWxzZQorCQkJKnZhbCA9IHRlbXBfZnJvbV9zMTYodG1wNDIxLT50ZW1wW2NoYW5uZWxdKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBod21vbl90ZW1wX2ZhdWx0OgorCQkvKgorCQkgKiBUaGUgT1BFTiBiaXQgc2lnbmFscyBhIGZhdWx0LiBUaGlzIGlzIGJpdCAwIG9mIHRoZSB0ZW1wZXJhdHVyZQorCQkgKiByZWdpc3RlciAobG93IGJ5dGUpLgorCQkgKi8KKwkJKnZhbCA9IHRtcDQyMS0+dGVtcFtjaGFubmVsXSAmIDB4MDE7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdGVtcCk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNob3dfZmF1bHQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHVtb2RlX3QgdG1wNDIxX2lzX3Zpc2libGUoY29uc3Qgdm9pZCAqZGF0YSwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJCQkgdTMyIGF0dHIsIGludCBjaGFubmVsKQogewotCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7Ci0Jc3RydWN0IHRtcDQyMV9kYXRhICpkYXRhID0gdG1wNDIxX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQotCS8qCi0JICogVGhlIE9QRU4gYml0IHNpZ25hbHMgYSBmYXVsdC4gVGhpcyBpcyBiaXQgMCBvZiB0aGUgdGVtcGVyYXR1cmUKLQkgKiByZWdpc3RlciAobG93IGJ5dGUpLgotCSAqLwotCWlmIChkYXRhLT50ZW1wW2luZGV4XSAmIDB4MDEpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOwotCWVsc2UKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7CisJc3dpdGNoIChhdHRyKSB7CisJY2FzZSBod21vbl90ZW1wX2ZhdWx0OgorCQlpZiAoY2hhbm5lbCA9PSAwKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBTX0lSVUdPOworCWNhc2UgaHdtb25fdGVtcF9pbnB1dDoKKwkJcmV0dXJuIFNfSVJVR087CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQogfQogCi1zdGF0aWMgdW1vZGVfdCB0bXA0MjFfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYSwKLQkJCQlpbnQgbikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IHRtcDQyMV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHI7Ci0JdW5zaWduZWQgaW50IGluZGV4OwotCi0JZGV2YXR0ciA9IGNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSwgYXR0cik7Ci0JaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OwotCi0JaWYgKGluZGV4IDwgZGF0YS0+Y2hhbm5lbHMpCi0JCXJldHVybiBhLT5tb2RlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcF92YWx1ZSwgTlVMTCwgMCk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDEpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9mYXVsdCwgU19JUlVHTywgc2hvd19mYXVsdCwgTlVMTCwgMSk7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDIpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19mYXVsdCwgU19JUlVHTywgc2hvd19mYXVsdCwgTlVMTCwgMik7Ci1zdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X2lucHV0LCBTX0lSVUdPLCBzaG93X3RlbXBfdmFsdWUsIE5VTEwsIDMpOwotc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9mYXVsdCwgU19JUlVHTywgc2hvd19mYXVsdCwgTlVMTCwgMyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0bXA0MjFfYXR0cltdID0gewotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKLQkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAotCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfZmF1bHQuZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB0bXA0MjFfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gdG1wNDIxX2F0dHIsCi0JLmlzX3Zpc2libGUgPSB0bXA0MjFfaXNfdmlzaWJsZSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICp0bXA0MjFfZ3JvdXBzW10gPSB7Ci0JJnRtcDQyMV9ncm91cCwKLQlOVUxMCi19OwotCiBzdGF0aWMgaW50IHRtcDQyMV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCWludCBjb25maWcsIGNvbmZpZ19vcmlnOwpAQCAtMjg5LDEzICsyNTQsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgdG1wNDIxX29wcyA9IHsKKwkuaXNfdmlzaWJsZSA9IHRtcDQyMV9pc192aXNpYmxlLAorCS5yZWFkID0gdG1wNDIxX3JlYWQsCit9OworCiBzdGF0aWMgaW50IHRtcDQyMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CiAJc3RydWN0IHRtcDQyMV9kYXRhICpkYXRhOwotCWludCBlcnI7CisJaW50IGksIGVycjsKIAogCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IHRtcDQyMV9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQpAQCAtMzA5LDggKzI3OSwyMSBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwKLQkJCQkJCQkgICBkYXRhLCB0bXA0MjFfZ3JvdXBzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+Y2hhbm5lbHM7IGkrKykKKwkJZGF0YS0+dGVtcF9jb25maWdbaV0gPSBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9GQVVMVDsKKworCWRhdGEtPmNoaXAub3BzID0gJnRtcDQyMV9vcHM7CisJZGF0YS0+Y2hpcC5pbmZvID0gZGF0YS0+aW5mbzsKKworCWRhdGEtPmluZm9bMF0gPSAmZGF0YS0+dGVtcF9pbmZvOworCisJZGF0YS0+dGVtcF9pbmZvLnR5cGUgPSBod21vbl90ZW1wOworCWRhdGEtPnRlbXBfaW5mby5jb25maWcgPSBkYXRhLT50ZW1wX2NvbmZpZzsKKworCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhkZXYsIGNsaWVudC0+bmFtZSwKKwkJCQkJCQkgZGF0YSwKKwkJCQkJCQkgJmRhdGEtPmNoaXAsCisJCQkJCQkJIE5VTEwpOwogCXJldHVybiBQVFJfRVJSX09SX1pFUk8oaHdtb25fZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi94Z2VuZS1od21vbi5jIGIvZHJpdmVycy9od21vbi94Z2VuZS1od21vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMGRiYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL3hnZW5lLWh3bW9uLmMKQEAgLTAsMCArMSw3ODcgQEAKKy8qCisgKiBBUE0gWC1HZW5lIFNvQyBIYXJkd2FyZSBNb25pdG9yaW5nIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgQXBwbGllZCBNaWNybyBDaXJjdWl0cyBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBMb2MgSG8gPGxob0BhcG0uY29tPgorICogICAgICAgICBIb2FuIFRyYW4gPGhvdHJhbkBhcG0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBUaGlzIGRyaXZlciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgorICogIC0gUmV0cmlldmUgQ1BVIHRvdGFsIHBvd2VyICh1VykKKyAqICAtIFJldHJpZXZlIElPIHRvdGFsIHBvd2VyICh1VykKKyAqICAtIFJldHJpZXZlIFNvQyB0ZW1wZXJhdHVyZSAobWlsbGktZGVncmVlIEMpIGFuZCBhbGFybQorICovCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWlsYm94X2NvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWlsYm94X2NsaWVudC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhY3BpL3BjYy5oPgorCisvKiBTTElNcHJvIG1lc3NhZ2UgZGVmaW5lcyAqLworI2RlZmluZSBNU0dfVFlQRV9EQkcJCQkwCisjZGVmaW5lIE1TR19UWVBFX0VSUgkJCTcKKyNkZWZpbmUgTVNHX1RZUEVfUFdSTUdNVAkJOQorCisjZGVmaW5lIE1TR19UWVBFKHYpCQkJKCgodikgJiAweEYwMDAwMDAwKSA+PiAyOCkKKyNkZWZpbmUgTVNHX1RZUEVfU0VUKHYpCQkJKCgodikgPDwgMjgpICYgMHhGMDAwMDAwMCkKKyNkZWZpbmUgTVNHX1NVQlRZUEUodikJCQkoKCh2KSAmIDB4MEYwMDAwMDApID4+IDI0KQorI2RlZmluZSBNU0dfU1VCVFlQRV9TRVQodikJCSgoKHYpIDw8IDI0KSAmIDB4MEYwMDAwMDApCisKKyNkZWZpbmUgREJHX1NVQlRZUEVfU0VOU09SX1JFQUQJCTQKKyNkZWZpbmUgU0VOU09SX1JEX01TRwkJCTB4MDRGRkU5MDIKKyNkZWZpbmUgU0VOU09SX1JEX0VOX0FERFIoYSkJCSgoYSkgJiAweDAwMEZGRkZGKQorI2RlZmluZSBQTURfUFdSX1JFRwkJCTB4MjAKKyNkZWZpbmUgUE1EX1BXUl9NV19SRUcJCQkweDI2CisjZGVmaW5lIFNPQ19QV1JfUkVHCQkJMHgyMQorI2RlZmluZSBTT0NfUFdSX01XX1JFRwkJCTB4MjcKKyNkZWZpbmUgU09DX1RFTVBfUkVHCQkJMHgxMAorCisjZGVmaW5lIFRFTVBfTkVHQVRJVkVfQklUCQk4CisjZGVmaW5lIFNFTlNPUl9JTlZBTElEX0RBVEEJCUJJVCgxNSkKKworI2RlZmluZSBQV1JNR01UX1NVQlRZUEVfVFBDCQkxCisjZGVmaW5lIFRQQ19BTEFSTQkJCTIKKyNkZWZpbmUgVFBDX0dFVF9BTEFSTQkJCTMKKyNkZWZpbmUgVFBDX0NNRCh2KQkJCSgoKHYpICYgMHgwMEZGMDAwMCkgPj4gMTYpCisjZGVmaW5lIFRQQ19DTURfU0VUKHYpCQkJKCgodikgPDwgMTYpICYgMHgwMEZGMDAwMCkKKyNkZWZpbmUgVFBDX0VOX01TRyhobmRsLCBjbWQsIHR5cGUpIFwKKwkoTVNHX1RZUEVfU0VUKE1TR19UWVBFX1BXUk1HTVQpIHwgXAorCU1TR19TVUJUWVBFX1NFVChobmRsKSB8IFRQQ19DTURfU0VUKGNtZCkgfCB0eXBlKQorCisvKiBQQ0MgZGVmaW5lcyAqLworI2RlZmluZSBQQ0NfU0lHTkFUVVJFX01BU0sJCTB4NTA0MjQzMDAKKyNkZWZpbmUgUENDQ19HRU5FUkFURV9EQl9JTlQJCUJJVCgxNSkKKyNkZWZpbmUgUENDU19DTURfQ09NUExFVEUJCUJJVCgwKQorI2RlZmluZSBQQ0NTX1NDSV9ET09SQkVMCQlCSVQoMSkKKyNkZWZpbmUgUENDU19QTEFURk9STV9OT1RJRklDQVRJT04JQklUKDMpCisvKgorICogQXJiaXRyYXJ5IHJldHJpZXMgaW4gY2FzZSB0aGUgcmVtb3RlIHByb2Nlc3NvciBpcyBzbG93IHRvIHJlc3BvbmQKKyAqIHRvIFBDQyBjb21tYW5kcworICovCisjZGVmaW5lIFBDQ19OVU1fUkVUUklFUwkJCTUwMAorCisjZGVmaW5lIEFTWU5DX01TR19GSUZPX1NJWkUJCTE2CisjZGVmaW5lIE1CT1hfT1BfVElNRU9VVE1TCQkxMDAwCisKKyNkZWZpbmUgV0FUVF9UT19tV0FUVCh4KQkJKCh4KSAqIDEwMDApCisjZGVmaW5lIG1XQVRUX1RPX3VXQVRUKHgpCQkoKHgpICogMTAwMCkKKyNkZWZpbmUgQ0VMU0lVU19UT19tQ0VMU0lVUyh4KQkJKCh4KSAqIDEwMDApCisKKyNkZWZpbmUgdG9feGdlbmVfaHdtb25fZGV2KGNsKQkJXAorCWNvbnRhaW5lcl9vZihjbCwgc3RydWN0IHhnZW5lX2h3bW9uX2RldiwgbWJveF9jbGllbnQpCisKK3N0cnVjdCBzbGltcHJvX3Jlc3BfbXNnIHsKKwl1MzIgbXNnOworCXUzMiBwYXJhbTE7CisJdTMyIHBhcmFtMjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB4Z2VuZV9od21vbl9kZXYgeworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IG1ib3hfY2hhbgkqbWJveF9jaGFuOworCXN0cnVjdCBtYm94X2NsaWVudAltYm94X2NsaWVudDsKKwlpbnQJCQltYm94X2lkeDsKKworCXNwaW5sb2NrX3QJCWtmaWZvX2xvY2s7CisJc3RydWN0IG11dGV4CQlyZF9tdXRleDsKKwlzdHJ1Y3QgY29tcGxldGlvbglyZF9jb21wbGV0ZTsKKwlpbnQJCQlyZXNwX3BlbmRpbmc7CisJc3RydWN0IHNsaW1wcm9fcmVzcF9tc2cgc3luY19tc2c7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29ya3E7CisJc3RydWN0IGtmaWZvX3JlY19wdHJfMQlhc3luY19tc2dfZmlmbzsKKworCXN0cnVjdCBkZXZpY2UJCSpod21vbl9kZXY7CisJYm9vbAkJCXRlbXBfY3JpdGljYWxfYWxhcm07CisKKwlwaHlzX2FkZHJfdAkJY29tbV9iYXNlX2FkZHI7CisJdm9pZAkJCSpwY2NfY29tbV9hZGRyOworCXU2NAkJCXVzZWNzX2xhdDsKK307CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHRlc3RzIGFuZCBjbGVhcnMgYSBiaXRtYXNrIHRoZW4gcmV0dXJucyBpdHMgb2xkIHZhbHVlCisgKi8KK3N0YXRpYyB1MTYgeGdlbmVfd29yZF90c3RfYW5kX2Nscih1MTYgKmFkZHIsIHUxNiBtYXNrKQoreworCXUxNiByZXQsIHZhbDsKKworCXZhbCA9IGxlMTZfdG9fY3B1KFJFQURfT05DRSgqYWRkcikpOworCXJldCA9IHZhbCAmIG1hc2s7CisJdmFsICY9IH5tYXNrOworCVdSSVRFX09OQ0UoKmFkZHIsIGNwdV90b19sZTE2KHZhbCkpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9wY2NfcmQoc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4LCB1MzIgKm1zZykKK3sKKwlzdHJ1Y3QgYWNwaV9wY2N0X3NoYXJlZF9tZW1vcnkgKmdlbmVyaWNfY29tbV9iYXNlID0gY3R4LT5wY2NfY29tbV9hZGRyOworCXUzMiAqcHRyID0gKHZvaWQgKikoZ2VuZXJpY19jb21tX2Jhc2UgKyAxKTsKKwlpbnQgcmMsIGk7CisJdTE2IHZhbDsKKworCW11dGV4X2xvY2soJmN0eC0+cmRfbXV0ZXgpOworCWluaXRfY29tcGxldGlvbigmY3R4LT5yZF9jb21wbGV0ZSk7CisJY3R4LT5yZXNwX3BlbmRpbmcgPSB0cnVlOworCisJLyogV3JpdGUgc2lnbmF0dXJlIGZvciBzdWJzcGFjZSAqLworCVdSSVRFX09OQ0UoZ2VuZXJpY19jb21tX2Jhc2UtPnNpZ25hdHVyZSwKKwkJICAgY3B1X3RvX2xlMzIoUENDX1NJR05BVFVSRV9NQVNLIHwgY3R4LT5tYm94X2lkeCkpOworCisJLyogV3JpdGUgdG8gdGhlIHNoYXJlZCBjb21tYW5kIHJlZ2lvbiAqLworCVdSSVRFX09OQ0UoZ2VuZXJpY19jb21tX2Jhc2UtPmNvbW1hbmQsCisJCSAgIGNwdV90b19sZTE2KE1TR19UWVBFKG1zZ1swXSkgfCBQQ0NDX0dFTkVSQVRFX0RCX0lOVCkpOworCisJLyogRmxpcCBDTUQgQ09NUExFVEUgYml0ICovCisJdmFsID0gbGUxNl90b19jcHUoUkVBRF9PTkNFKGdlbmVyaWNfY29tbV9iYXNlLT5zdGF0dXMpKTsKKwl2YWwgJj0gflBDQ1NfQ01EX0NPTVBMRVRFOworCVdSSVRFX09OQ0UoZ2VuZXJpY19jb21tX2Jhc2UtPnN0YXR1cywgY3B1X3RvX2xlMTYodmFsKSk7CisKKwkvKiBDb3B5IHRoZSBtZXNzYWdlIHRvIHRoZSBQQ0MgY29tbSBzcGFjZSAqLworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc3RydWN0IHNsaW1wcm9fcmVzcF9tc2cpIC8gNDsgaSsrKQorCQlXUklURV9PTkNFKHB0cltpXSwgY3B1X3RvX2xlMzIobXNnW2ldKSk7CisKKwkvKiBSaW5nIHRoZSBkb29yYmVsbCAqLworCXJjID0gbWJveF9zZW5kX21lc3NhZ2UoY3R4LT5tYm94X2NoYW4sIG1zZyk7CisJaWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiTWFpbGJveCBzZW5kIGVycm9yICVkXG4iLCByYyk7CisJCWdvdG8gZXJyOworCX0KKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY3R4LT5yZF9jb21wbGV0ZSwKKwkJCQkJIHVzZWNzX3RvX2ppZmZpZXMoY3R4LT51c2Vjc19sYXQpKSkgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiTWFpbGJveCBvcGVyYXRpb24gdGltZWQgb3V0XG4iKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBDaGVjayBmb3IgZXJyb3IgbWVzc2FnZSAqLworCWlmIChNU0dfVFlQRShjdHgtPnN5bmNfbXNnLm1zZykgPT0gTVNHX1RZUEVfRVJSKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJbXNnWzBdID0gY3R4LT5zeW5jX21zZy5tc2c7CisJbXNnWzFdID0gY3R4LT5zeW5jX21zZy5wYXJhbTE7CisJbXNnWzJdID0gY3R4LT5zeW5jX21zZy5wYXJhbTI7CisKK2VycjoKKwltYm94X2NoYW5fdHhkb25lKGN0eC0+bWJveF9jaGFuLCAwKTsKKwljdHgtPnJlc3BfcGVuZGluZyA9IGZhbHNlOworCW11dGV4X3VubG9jaygmY3R4LT5yZF9tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHhnZW5lX2h3bW9uX3JkKHN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCwgdTMyICptc2cpCit7CisJaW50IHJjOworCisJbXV0ZXhfbG9jaygmY3R4LT5yZF9tdXRleCk7CisJaW5pdF9jb21wbGV0aW9uKCZjdHgtPnJkX2NvbXBsZXRlKTsKKwljdHgtPnJlc3BfcGVuZGluZyA9IHRydWU7CisKKwlyYyA9IG1ib3hfc2VuZF9tZXNzYWdlKGN0eC0+bWJveF9jaGFuLCBtc2cpOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2VycihjdHgtPmRldiwgIk1haWxib3ggc2VuZCBlcnJvciAlZFxuIiwgcmMpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY3R4LT5yZF9jb21wbGV0ZSwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXMoTUJPWF9PUF9USU1FT1VUTVMpKSkgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiTWFpbGJveCBvcGVyYXRpb24gdGltZWQgb3V0XG4iKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBDaGVjayBmb3IgZXJyb3IgbWVzc2FnZSAqLworCWlmIChNU0dfVFlQRShjdHgtPnN5bmNfbXNnLm1zZykgPT0gTVNHX1RZUEVfRVJSKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJbXNnWzBdID0gY3R4LT5zeW5jX21zZy5tc2c7CisJbXNnWzFdID0gY3R4LT5zeW5jX21zZy5wYXJhbTE7CisJbXNnWzJdID0gY3R4LT5zeW5jX21zZy5wYXJhbTI7CisKK2VycjoKKwljdHgtPnJlc3BfcGVuZGluZyA9IGZhbHNlOworCW11dGV4X3VubG9jaygmY3R4LT5yZF9tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHhnZW5lX2h3bW9uX3JlZ19tYXBfcmQoc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4LCB1MzIgYWRkciwKKwkJCQkgIHUzMiAqZGF0YSkKK3sKKwl1MzIgbXNnWzNdOworCWludCByYzsKKworCW1zZ1swXSA9IFNFTlNPUl9SRF9NU0c7CisJbXNnWzFdID0gU0VOU09SX1JEX0VOX0FERFIoYWRkcik7CisJbXNnWzJdID0gMDsKKworCWlmIChhY3BpX2Rpc2FibGVkKQorCQlyYyA9IHhnZW5lX2h3bW9uX3JkKGN0eCwgbXNnKTsKKwllbHNlCisJCXJjID0geGdlbmVfaHdtb25fcGNjX3JkKGN0eCwgbXNnKTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qCisJICogQ2hlY2sgaWYgc2Vuc29yIGRhdGEgaXMgdmFsaWQuCisJICovCisJaWYgKG1zZ1sxXSAmIFNFTlNPUl9JTlZBTElEX0RBVEEpCisJCXJldHVybiAtRU5PREFUQTsKKworCSpkYXRhID0gbXNnWzFdOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHhnZW5lX2h3bW9uX2dldF9ub3RpZmljYXRpb25fbXNnKHN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCwKKwkJCQkJICAgIHUzMiAqYW1zZykKK3sKKwl1MzIgbXNnWzNdOworCWludCByYzsKKworCW1zZ1swXSA9IFRQQ19FTl9NU0coUFdSTUdNVF9TVUJUWVBFX1RQQywgVFBDX0dFVF9BTEFSTSwgMCk7CisJbXNnWzFdID0gMDsKKwltc2dbMl0gPSAwOworCisJcmMgPSB4Z2VuZV9od21vbl9wY2NfcmQoY3R4LCBtc2cpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWFtc2dbMF0gPSBtc2dbMF07CisJYW1zZ1sxXSA9IG1zZ1sxXTsKKwlhbXNnWzJdID0gbXNnWzJdOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHhnZW5lX2h3bW9uX2dldF9jcHVfcHdyKHN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCwgdTMyICp2YWwpCit7CisJdTMyIHdhdHQsIG13YXR0OworCWludCByYzsKKworCXJjID0geGdlbmVfaHdtb25fcmVnX21hcF9yZChjdHgsIFBNRF9QV1JfUkVHLCAmd2F0dCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmMgPSB4Z2VuZV9od21vbl9yZWdfbWFwX3JkKGN0eCwgUE1EX1BXUl9NV19SRUcsICZtd2F0dCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJKnZhbCA9IFdBVFRfVE9fbVdBVFQod2F0dCkgKyBtd2F0dDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9nZXRfaW9fcHdyKHN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCwgdTMyICp2YWwpCit7CisJdTMyIHdhdHQsIG13YXR0OworCWludCByYzsKKworCXJjID0geGdlbmVfaHdtb25fcmVnX21hcF9yZChjdHgsIFNPQ19QV1JfUkVHLCAmd2F0dCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmMgPSB4Z2VuZV9od21vbl9yZWdfbWFwX3JkKGN0eCwgU09DX1BXUl9NV19SRUcsICZtd2F0dCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJKnZhbCA9IFdBVFRfVE9fbVdBVFQod2F0dCkgKyBtd2F0dDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9nZXRfdGVtcChzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsIHUzMiAqdmFsKQoreworCXJldHVybiB4Z2VuZV9od21vbl9yZWdfbWFwX3JkKGN0eCwgU09DX1RFTVBfUkVHLCB2YWwpOworfQorCisvKgorICogU2Vuc29yIHRlbXBlcmF0dXJlL3Bvd2VyIGZ1bmN0aW9ucworICovCitzdGF0aWMgc3NpemVfdCB0ZW1wMV9pbnB1dF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJjLCB0ZW1wOworCXUzMiB2YWw7CisKKwlyYyA9IHhnZW5lX2h3bW9uX2dldF90ZW1wKGN0eCwgJnZhbCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJdGVtcCA9IHNpZ25fZXh0ZW5kMzIodmFsLCBURU1QX05FR0FUSVZFX0JJVCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgQ0VMU0lVU19UT19tQ0VMU0lVUyh0ZW1wKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRlbXAxX2xhYmVsX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJTb0MgVGVtcGVyYXR1cmVcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCB0ZW1wMV9jcml0aWNhbF9hbGFybV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIGN0eC0+dGVtcF9jcml0aWNhbF9hbGFybSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBvd2VyMV9sYWJlbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJDUFUgcG93ZXJcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBwb3dlcjJfbGFiZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiSU8gcG93ZXJcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBwb3dlcjFfaW5wdXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIHZhbDsKKwlpbnQgcmM7CisKKwlyYyA9IHhnZW5lX2h3bW9uX2dldF9jcHVfcHdyKGN0eCwgJnZhbCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIG1XQVRUX1RPX3VXQVRUKHZhbCkpOworfQorCitzdGF0aWMgc3NpemVfdCBwb3dlcjJfaW5wdXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdTMyIHZhbDsKKwlpbnQgcmM7CisKKwlyYyA9IHhnZW5lX2h3bW9uX2dldF9pb19wd3IoY3R4LCAmdmFsKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgbVdBVFRfVE9fdVdBVFQodmFsKSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyh0ZW1wMV9sYWJlbCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odGVtcDFfaW5wdXQpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHRlbXAxX2NyaXRpY2FsX2FsYXJtKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3dlcjFfbGFiZWwpOworc3RhdGljIERFVklDRV9BVFRSX1JPKHBvd2VyMV9pbnB1dCk7CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocG93ZXIyX2xhYmVsKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3dlcjJfaW5wdXQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqeGdlbmVfaHdtb25fYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfdGVtcDFfbGFiZWwuYXR0ciwKKwkmZGV2X2F0dHJfdGVtcDFfaW5wdXQuYXR0ciwKKwkmZGV2X2F0dHJfdGVtcDFfY3JpdGljYWxfYWxhcm0uYXR0ciwKKwkmZGV2X2F0dHJfcG93ZXIxX2xhYmVsLmF0dHIsCisJJmRldl9hdHRyX3Bvd2VyMV9pbnB1dC5hdHRyLAorCSZkZXZfYXR0cl9wb3dlcjJfbGFiZWwuYXR0ciwKKwkmZGV2X2F0dHJfcG93ZXIyX2lucHV0LmF0dHIsCisJTlVMTCwKK307CisKK0FUVFJJQlVURV9HUk9VUFMoeGdlbmVfaHdtb24pOworCitzdGF0aWMgaW50IHhnZW5lX2h3bW9uX3RwY19hbGFybShzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHgsCisJCQkJIHN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnICphbXNnKQoreworCWN0eC0+dGVtcF9jcml0aWNhbF9hbGFybSA9ICEhYW1zZy0+cGFyYW0yOworCXN5c2ZzX25vdGlmeSgmY3R4LT5kZXYtPmtvYmosIE5VTEwsICJ0ZW1wMV9jcml0aWNhbF9hbGFybSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX2h3bW9uX3Byb2Nlc3NfcHdybXNnKHN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCwKKwkJCQkgICAgICAgc3RydWN0IHNsaW1wcm9fcmVzcF9tc2cgKmFtc2cpCit7CisJaWYgKChNU0dfU1VCVFlQRShhbXNnLT5tc2cpID09IFBXUk1HTVRfU1VCVFlQRV9UUEMpICYmCisJICAgIChUUENfQ01EKGFtc2ctPm1zZykgPT0gVFBDX0FMQVJNKSkKKwkJeGdlbmVfaHdtb25fdHBjX2FsYXJtKGN0eCwgYW1zZyk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBwcm9jZXNzIGFzeW5jIHdvcmsgcXVldWUKKyAqLworc3RhdGljIHZvaWQgeGdlbmVfaHdtb25fZXZ0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnIGFtc2c7CisJc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4OworCWludCByZXQ7CisKKwljdHggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHhnZW5lX2h3bW9uX2Rldiwgd29ya3EpOworCXdoaWxlIChrZmlmb19vdXRfc3BpbmxvY2tlZCgmY3R4LT5hc3luY19tc2dfZmlmbywgJmFtc2csCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2xpbXByb19yZXNwX21zZyksCisJCQkJICAgICZjdHgtPmtmaWZvX2xvY2spKSB7CisJCS8qCisJCSAqIElmIFBDQywgc2VuZCBhIGNvbnN1bWVyIGNvbW1hbmQgdG8gUGxhdGZvcm0gdG8gZ2V0IGluZm8KKwkJICogSWYgU2xpbXBybyBNYWlsYm94LCBnZXQgbWVzc2FnZSBmcm9tIHNwZWNpZmljIEZJRk8KKwkJICovCisJCWlmICghYWNwaV9kaXNhYmxlZCkgeworCQkJcmV0ID0geGdlbmVfaHdtb25fZ2V0X25vdGlmaWNhdGlvbl9tc2coY3R4LAorCQkJCQkJCSAgICAgICAodTMyICopJmFtc2cpOworCQkJaWYgKHJldCA8IDApCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAoTVNHX1RZUEUoYW1zZy5tc2cpID09IE1TR19UWVBFX1BXUk1HTVQpCisJCQl4Z2VuZV9od21vbl9wcm9jZXNzX3B3cm1zZyhjdHgsICZhbXNnKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgeGdlbmVfaHdtb25fcnhfcmVhZHkoc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4LCB2b2lkICptc2cpCit7CisJaWYgKElTX0VSUl9PUl9OVUxMKGN0eC0+aHdtb25fZGV2KSAmJiAhY3R4LT5yZXNwX3BlbmRpbmcpIHsKKwkJLyogRW5xdWV1ZSB0byB0aGUgRklGTyAqLworCQlrZmlmb19pbl9zcGlubG9ja2VkKCZjdHgtPmFzeW5jX21zZ19maWZvLCBtc2csCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2xpbXByb19yZXNwX21zZyksCisJCQkJICAgICZjdHgtPmtmaWZvX2xvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIFNMSU1wcm8gTWFpbGJveCByZWNlaXZlZCBhIG1lc3NhZ2UKKyAqLworc3RhdGljIHZvaWQgeGdlbmVfaHdtb25fcnhfY2Ioc3RydWN0IG1ib3hfY2xpZW50ICpjbCwgdm9pZCAqbXNnKQoreworCXN0cnVjdCB4Z2VuZV9od21vbl9kZXYgKmN0eCA9IHRvX3hnZW5lX2h3bW9uX2RldihjbCk7CisKKwkvKgorCSAqIFdoaWxlIHRoZSBkcml2ZXIgcmVnaXN0ZXJzIHdpdGggdGhlIG1haWxib3ggZnJhbWV3b3JrLCBhbiBpbnRlcnJ1cHQKKwkgKiBjYW4gYmUgcGVuZGluZyBiZWZvcmUgdGhlIHByb2JlIGZ1bmN0aW9uIGNvbXBsZXRlcyBpdHMKKwkgKiBpbml0aWFsaXphdGlvbi4gSWYgc3VjaCBjb25kaXRpb24gb2NjdXJzLCBqdXN0IHF1ZXVlIHVwIHRoZSBtZXNzYWdlCisJICogYXMgdGhlIGRyaXZlciBpcyBub3QgcmVhZHkgZm9yIHNlcnZpY2luZyB0aGUgY2FsbGJhY2suCisJICovCisJaWYgKHhnZW5lX2h3bW9uX3J4X3JlYWR5KGN0eCwgbXNnKSA8IDApCisJCXJldHVybjsKKworCS8qCisJICogUmVzcG9uc2UgbWVzc2FnZSBmb3JtYXQ6CisJICogbXNnWzBdIGlzIHRoZSByZXR1cm4gY29kZSBvZiB0aGUgb3BlcmF0aW9uCisJICogbXNnWzFdIGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgd29yZAorCSAqIG1zZ1syXSBpcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB3b3JkCisJICoKKwkgKiBBcyBtZXNzYWdlIG9ubHkgc3VwcG9ydHMgZHdvcmQgc2l6ZSwganVzdCBhc3NpZ24gaXQuCisJICovCisKKwkvKiBDaGVjayBmb3Igc3luYyBxdWVyeSAqLworCWlmIChjdHgtPnJlc3BfcGVuZGluZyAmJgorCSAgICAoKE1TR19UWVBFKCgodTMyICopbXNnKVswXSkgPT0gTVNHX1RZUEVfRVJSKSB8fAorCSAgICAgKE1TR19UWVBFKCgodTMyICopbXNnKVswXSkgPT0gTVNHX1RZUEVfREJHICYmCisJICAgICAgTVNHX1NVQlRZUEUoKCh1MzIgKiltc2cpWzBdKSA9PSBEQkdfU1VCVFlQRV9TRU5TT1JfUkVBRCkgfHwKKwkgICAgIChNU0dfVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IE1TR19UWVBFX1BXUk1HTVQgJiYKKwkgICAgICBNU0dfU1VCVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IFBXUk1HTVRfU1VCVFlQRV9UUEMgJiYKKwkgICAgICBUUENfQ01EKCgodTMyICopbXNnKVswXSkgPT0gVFBDX0FMQVJNKSkpIHsKKwkJY3R4LT5zeW5jX21zZy5tc2cgPSAoKHUzMiAqKW1zZylbMF07CisJCWN0eC0+c3luY19tc2cucGFyYW0xID0gKCh1MzIgKiltc2cpWzFdOworCQljdHgtPnN5bmNfbXNnLnBhcmFtMiA9ICgodTMyICopbXNnKVsyXTsKKworCQkvKiBPcGVyYXRpb24gd2FpdGluZyBmb3IgcmVzcG9uc2UgKi8KKwkJY29tcGxldGUoJmN0eC0+cmRfY29tcGxldGUpOworCisJCXJldHVybjsKKwl9CisKKwkvKiBFbnF1ZXVlIHRvIHRoZSBGSUZPICovCisJa2ZpZm9faW5fc3BpbmxvY2tlZCgmY3R4LT5hc3luY19tc2dfZmlmbywgbXNnLAorCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2xpbXByb19yZXNwX21zZyksICZjdHgtPmtmaWZvX2xvY2spOworCS8qIFNjaGVkdWxlIHRoZSBib3R0b20gaGFuZGxlciAqLworCXNjaGVkdWxlX3dvcmsoJmN0eC0+d29ya3EpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgUENDIE1haWxib3ggcmVjZWl2ZWQgYSBtZXNzYWdlCisgKi8KK3N0YXRpYyB2b2lkIHhnZW5lX2h3bW9uX3BjY19yeF9jYihzdHJ1Y3QgbWJveF9jbGllbnQgKmNsLCB2b2lkICptc2cpCit7CisJc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4ID0gdG9feGdlbmVfaHdtb25fZGV2KGNsKTsKKwlzdHJ1Y3QgYWNwaV9wY2N0X3NoYXJlZF9tZW1vcnkgKmdlbmVyaWNfY29tbV9iYXNlID0gY3R4LT5wY2NfY29tbV9hZGRyOworCXN0cnVjdCBzbGltcHJvX3Jlc3BfbXNnIGFtc2c7CisKKwkvKgorCSAqIFdoaWxlIHRoZSBkcml2ZXIgcmVnaXN0ZXJzIHdpdGggdGhlIG1haWxib3ggZnJhbWV3b3JrLCBhbiBpbnRlcnJ1cHQKKwkgKiBjYW4gYmUgcGVuZGluZyBiZWZvcmUgdGhlIHByb2JlIGZ1bmN0aW9uIGNvbXBsZXRlcyBpdHMKKwkgKiBpbml0aWFsaXphdGlvbi4gSWYgc3VjaCBjb25kaXRpb24gb2NjdXJzLCBqdXN0IHF1ZXVlIHVwIHRoZSBtZXNzYWdlCisJICogYXMgdGhlIGRyaXZlciBpcyBub3QgcmVhZHkgZm9yIHNlcnZpY2luZyB0aGUgY2FsbGJhY2suCisJICovCisJaWYgKHhnZW5lX2h3bW9uX3J4X3JlYWR5KGN0eCwgJmFtc2cpIDwgMCkKKwkJcmV0dXJuOworCisJbXNnID0gZ2VuZXJpY19jb21tX2Jhc2UgKyAxOworCS8qIENoZWNrIGlmIHBsYXRmb3JtIHNlbmRzIGludGVycnVwdCAqLworCWlmICgheGdlbmVfd29yZF90c3RfYW5kX2NscigmZ2VuZXJpY19jb21tX2Jhc2UtPnN0YXR1cywKKwkJCQkgICAgUENDU19TQ0lfRE9PUkJFTCkpCisJCXJldHVybjsKKworCS8qCisJICogUmVzcG9uc2UgbWVzc2FnZSBmb3JtYXQ6CisJICogbXNnWzBdIGlzIHRoZSByZXR1cm4gY29kZSBvZiB0aGUgb3BlcmF0aW9uCisJICogbXNnWzFdIGlzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgd29yZAorCSAqIG1zZ1syXSBpcyB0aGUgc2Vjb25kIHBhcmFtZXRlciB3b3JkCisJICoKKwkgKiBBcyBtZXNzYWdlIG9ubHkgc3VwcG9ydHMgZHdvcmQgc2l6ZSwganVzdCBhc3NpZ24gaXQuCisJICovCisKKwkvKiBDaGVjayBmb3Igc3luYyBxdWVyeSAqLworCWlmIChjdHgtPnJlc3BfcGVuZGluZyAmJgorCSAgICAoKE1TR19UWVBFKCgodTMyICopbXNnKVswXSkgPT0gTVNHX1RZUEVfRVJSKSB8fAorCSAgICAgKE1TR19UWVBFKCgodTMyICopbXNnKVswXSkgPT0gTVNHX1RZUEVfREJHICYmCisJICAgICAgTVNHX1NVQlRZUEUoKCh1MzIgKiltc2cpWzBdKSA9PSBEQkdfU1VCVFlQRV9TRU5TT1JfUkVBRCkgfHwKKwkgICAgIChNU0dfVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IE1TR19UWVBFX1BXUk1HTVQgJiYKKwkgICAgICBNU0dfU1VCVFlQRSgoKHUzMiAqKW1zZylbMF0pID09IFBXUk1HTVRfU1VCVFlQRV9UUEMgJiYKKwkgICAgICBUUENfQ01EKCgodTMyICopbXNnKVswXSkgPT0gVFBDX0FMQVJNKSkpIHsKKwkJLyogQ2hlY2sgaWYgcGxhdGZvcm0gY29tcGxldGVzIGNvbW1hbmQgKi8KKwkJaWYgKHhnZW5lX3dvcmRfdHN0X2FuZF9jbHIoJmdlbmVyaWNfY29tbV9iYXNlLT5zdGF0dXMsCisJCQkJCSAgIFBDQ1NfQ01EX0NPTVBMRVRFKSkgeworCQkJY3R4LT5zeW5jX21zZy5tc2cgPSAoKHUzMiAqKW1zZylbMF07CisJCQljdHgtPnN5bmNfbXNnLnBhcmFtMSA9ICgodTMyICopbXNnKVsxXTsKKwkJCWN0eC0+c3luY19tc2cucGFyYW0yID0gKCh1MzIgKiltc2cpWzJdOworCisJCQkvKiBPcGVyYXRpb24gd2FpdGluZyBmb3IgcmVzcG9uc2UgKi8KKwkJCWNvbXBsZXRlKCZjdHgtPnJkX2NvbXBsZXRlKTsKKworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyoKKwkgKiBQbGF0Zm9ybSBub3RpZmllcyBpbnRlcnJ1cHQgdG8gT1NQTS4KKwkgKiBPUFNNIHNjaGVkdWxlcyBhIGNvbnN1bWVyIGNvbW1hbmQgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24KKwkgKiBpbiBhIHdvcmtxdWV1ZS4gUGxhdGZvcm0gbXVzdCB3YWl0IHVudGlsIE9TUE0gaGFzIGlzc3VlZAorCSAqIGEgY29uc3VtZXIgY29tbWFuZCB0aGF0IHNlcnZlcyB0aGlzIG5vdGlmaWNhdGlvbi4KKwkgKi8KKworCS8qIEVucXVldWUgdG8gdGhlIEZJRk8gKi8KKwlrZmlmb19pbl9zcGlubG9ja2VkKCZjdHgtPmFzeW5jX21zZ19maWZvLCAmYW1zZywKKwkJCSAgICBzaXplb2Yoc3RydWN0IHNsaW1wcm9fcmVzcF9tc2cpLCAmY3R4LT5rZmlmb19sb2NrKTsKKwkvKiBTY2hlZHVsZSB0aGUgYm90dG9tIGhhbmRsZXIgKi8KKwlzY2hlZHVsZV93b3JrKCZjdHgtPndvcmtxKTsKK30KKworc3RhdGljIHZvaWQgeGdlbmVfaHdtb25fdHhfZG9uZShzdHJ1Y3QgbWJveF9jbGllbnQgKmNsLCB2b2lkICptc2csIGludCByZXQpCit7CisJaWYgKHJldCkgeworCQlkZXZfZGJnKGNsLT5kZXYsICJUWCBkaWQgbm90IGNvbXBsZXRlOiBDTUQgc2VudDoleCwgcmV0OiVkXG4iLAorCQkJKih1MTYgKiltc2csIHJldCk7CisJfSBlbHNlIHsKKwkJZGV2X2RiZyhjbC0+ZGV2LCAiVFggY29tcGxldGVkLiBDTUQgc2VudDoleCwgcmV0OiVkXG4iLAorCQkJKih1MTYgKiltc2csIHJldCk7CisJfQorfQorCitzdGF0aWMgaW50IHhnZW5lX2h3bW9uX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHhnZW5lX2h3bW9uX2RldiAqY3R4OworCXN0cnVjdCBtYm94X2NsaWVudCAqY2w7CisJaW50IHJjOworCisJY3R4ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpCisJCXJldHVybiAtRU5PTUVNOworCisJY3R4LT5kZXYgPSAmcGRldi0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0eCk7CisJY2wgPSAmY3R4LT5tYm94X2NsaWVudDsKKworCXNwaW5fbG9ja19pbml0KCZjdHgtPmtmaWZvX2xvY2spOworCW11dGV4X2luaXQoJmN0eC0+cmRfbXV0ZXgpOworCisJcmMgPSBrZmlmb19hbGxvYygmY3R4LT5hc3luY19tc2dfZmlmbywKKwkJCSBzaXplb2Yoc3RydWN0IHNsaW1wcm9fcmVzcF9tc2cpICogQVNZTkNfTVNHX0ZJRk9fU0laRSwKKwkJCSBHRlBfS0VSTkVMKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0X21ib3hfZnJlZTsKKworCUlOSVRfV09SSygmY3R4LT53b3JrcSwgeGdlbmVfaHdtb25fZXZ0X3dvcmspOworCisJLyogUmVxdWVzdCBtYWlsYm94IGNoYW5uZWwgKi8KKwljbC0+ZGV2ID0gJnBkZXYtPmRldjsKKwljbC0+dHhfZG9uZSA9IHhnZW5lX2h3bW9uX3R4X2RvbmU7CisJY2wtPnR4X2Jsb2NrID0gZmFsc2U7CisJY2wtPnR4X3RvdXQgPSBNQk9YX09QX1RJTUVPVVRNUzsKKwljbC0+a25vd3NfdHhkb25lID0gZmFsc2U7CisJaWYgKGFjcGlfZGlzYWJsZWQpIHsKKwkJY2wtPnJ4X2NhbGxiYWNrID0geGdlbmVfaHdtb25fcnhfY2I7CisJCWN0eC0+bWJveF9jaGFuID0gbWJveF9yZXF1ZXN0X2NoYW5uZWwoY2wsIDApOworCQlpZiAoSVNfRVJSKGN0eC0+bWJveF9jaGFuKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJTTElNcHJvIG1haWxib3ggY2hhbm5lbCByZXF1ZXN0IGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZCAqY3BwY19zczsKKworCQlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKCZwZGV2LT5kZXYsICJwY2MtY2hhbm5lbCIsCisJCQkJCSAgICAgJmN0eC0+bWJveF9pZHgpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBwY2MtY2hhbm5lbCBwcm9wZXJ0eVxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCWNsLT5yeF9jYWxsYmFjayA9IHhnZW5lX2h3bW9uX3BjY19yeF9jYjsKKwkJY3R4LT5tYm94X2NoYW4gPSBwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoY2wsIGN0eC0+bWJveF9pZHgpOworCQlpZiAoSVNfRVJSKGN0eC0+bWJveF9jaGFuKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJQUEMgY2hhbm5lbCByZXF1ZXN0IGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBQQ0MgbWFpbGJveCBjb250cm9sbGVyIGRyaXZlciBzaG91bGQKKwkJICogaGF2ZSBwYXJzZWQgdGhlIFBDQ1QgKGdsb2JhbCB0YWJsZSBvZiBhbGwKKwkJICogUENDIGNoYW5uZWxzKSBhbmQgc3RvcmVkIHBvaW50ZXJzIHRvIHRoZQorCQkgKiBzdWJzcGFjZSBjb21tdW5pY2F0aW9uIHJlZ2lvbiBpbiBjb25fcHJpdi4KKwkJICovCisJCWNwcGNfc3MgPSBjdHgtPm1ib3hfY2hhbi0+Y29uX3ByaXY7CisJCWlmICghY3BwY19zcykgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiUFBDIHN1YnNwYWNlIG5vdCBmb3VuZFxuIik7CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIG91dF9tYm94X2ZyZWU7CisJCX0KKworCQlpZiAoIWN0eC0+bWJveF9jaGFuLT5tYm94LT50eGRvbmVfaXJxKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJQQ0MgSVJRIG5vdCBzdXBwb3J0ZWRcbiIpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBvdXRfbWJveF9mcmVlOworCQl9CisKKwkJLyoKKwkJICogVGhpcyBpcyB0aGUgc2hhcmVkIGNvbW11bmljYXRpb24gcmVnaW9uCisJCSAqIGZvciB0aGUgT1MgYW5kIFBsYXRmb3JtIHRvIGNvbW11bmljYXRlIG92ZXIuCisJCSAqLworCQljdHgtPmNvbW1fYmFzZV9hZGRyID0gY3BwY19zcy0+YmFzZV9hZGRyZXNzOworCQlpZiAoY3R4LT5jb21tX2Jhc2VfYWRkcikgeworCQkJY3R4LT5wY2NfY29tbV9hZGRyID0gbWVtcmVtYXAoY3R4LT5jb21tX2Jhc2VfYWRkciwKKwkJCQkJCQljcHBjX3NzLT5sZW5ndGgsCisJCQkJCQkJTUVNUkVNQVBfV0IpOworCQl9IGVsc2UgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBQQ0MgY29tbSByZWdpb25cbiIpOworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBvdXRfbWJveF9mcmVlOworCQl9CisKKwkJaWYgKCFjdHgtPnBjY19jb21tX2FkZHIpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiRmFpbGVkIHRvIGlvcmVtYXAgUENDIGNvbW0gcmVnaW9uXG4iKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X21ib3hfZnJlZTsKKwkJfQorCisJCS8qCisJCSAqIGNwcGNfc3MtPmxhdGVuY3kgaXMganVzdCBhIE5vbWluYWwgdmFsdWUuIEluIHJlYWxpdHkKKwkJICogdGhlIHJlbW90ZSBwcm9jZXNzb3IgY291bGQgYmUgbXVjaCBzbG93ZXIgdG8gcmVwbHkuCisJCSAqIFNvIGFkZCBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHdhaXQgb24gdG9wIG9mIE5vbWluYWwuCisJCSAqLworCQljdHgtPnVzZWNzX2xhdCA9IFBDQ19OVU1fUkVUUklFUyAqIGNwcGNfc3MtPmxhdGVuY3k7CisJfQorCisJY3R4LT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoY3R4LT5kZXYsCisJCQkJCQkJICAgImFwbV94Z2VuZSIsCisJCQkJCQkJICAgY3R4LAorCQkJCQkJCSAgIHhnZW5lX2h3bW9uX2dyb3Vwcyk7CisJaWYgKElTX0VSUihjdHgtPmh3bW9uX2RldikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIEhXIG1vbml0b3IgZGV2aWNlXG4iKTsKKwkJcmMgPSBQVFJfRVJSKGN0eC0+aHdtb25fZGV2KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBTY2hlZHVsZSB0aGUgYm90dG9tIGhhbmRsZXIgaWYgdGhlcmUgaXMgYSBwZW5kaW5nIG1lc3NhZ2UuCisJICovCisJc2NoZWR1bGVfd29yaygmY3R4LT53b3JrcSk7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQVBNIFgtR2VuZSBTb0MgSFcgbW9uaXRvciBkcml2ZXIgcmVnaXN0ZXJlZFxuIik7CisKKwlyZXR1cm4gMDsKKworb3V0OgorCWlmIChhY3BpX2Rpc2FibGVkKQorCQltYm94X2ZyZWVfY2hhbm5lbChjdHgtPm1ib3hfY2hhbik7CisJZWxzZQorCQlwY2NfbWJveF9mcmVlX2NoYW5uZWwoY3R4LT5tYm94X2NoYW4pOworb3V0X21ib3hfZnJlZToKKwlrZmlmb19mcmVlKCZjdHgtPmFzeW5jX21zZ19maWZvKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4Z2VuZV9od21vbl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgeGdlbmVfaHdtb25fZGV2ICpjdHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGN0eC0+aHdtb25fZGV2KTsKKwlrZmlmb19mcmVlKCZjdHgtPmFzeW5jX21zZ19maWZvKTsKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJbWJveF9mcmVlX2NoYW5uZWwoY3R4LT5tYm94X2NoYW4pOworCWVsc2UKKwkJcGNjX21ib3hfZnJlZV9jaGFubmVsKGN0eC0+bWJveF9jaGFuKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0FDUEkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgeGdlbmVfaHdtb25fYWNwaV9tYXRjaFtdID0geworCXsiQVBNQzBEMjkiLCAwfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHhnZW5lX2h3bW9uX2FjcGlfbWF0Y2gpOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhnZW5lX2h3bW9uX29mX21hdGNoW10gPSB7CisJey5jb21wYXRpYmxlID0gImFwbSx4Z2VuZS1zbGltcHJvLWh3bW9uIn0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4Z2VuZV9od21vbl9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHhnZW5lX2h3bW9uX2RyaXZlciBfX3JlZmRhdGEgPSB7CisJLnByb2JlID0geGdlbmVfaHdtb25fcHJvYmUsCisJLnJlbW92ZSA9IHhnZW5lX2h3bW9uX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ4Z2VuZS1zbGltcHJvLWh3bW9uIiwKKwkJLm9mX21hdGNoX3RhYmxlID0geGdlbmVfaHdtb25fb2ZfbWF0Y2gsCisJCS5hY3BpX21hdGNoX3RhYmxlID0gQUNQSV9QVFIoeGdlbmVfaHdtb25fYWNwaV9tYXRjaCksCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHhnZW5lX2h3bW9uX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVBNIFgtR2VuZSBTb0MgaGFyZHdhcmUgbW9uaXRvciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldGIxMC5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldGIxMC5jCmluZGV4IDRkMjBiMGIuLmQ3MzI1YzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0YjEwLmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldGIxMC5jCkBAIC0xODQsOCArMTg0LDcgQEAKIAogCWlmIChjb3Jlc2lnaHRfdGltZW91dChkcnZkYXRhLT5iYXNlLCBFVEJfRkZDUiwgRVRCX0ZGQ1JfQklULCAwKSkgewogCQlkZXZfZXJyKGRydmRhdGEtPmRldiwKLQkJCSJ0aW1lb3V0IG9ic2VydmVkIHdoZW4gcHJvYmluZyBhdCBvZmZzZXQgJSN4XG4iLAotCQkJRVRCX0ZGQ1IpOworCQkidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBjb21wbGV0aW9uIG9mIE1hbnVhbCBGbHVzaFxuIik7CiAJfQogCiAJLyogZGlzYWJsZSB0cmFjZSBjYXB0dXJlICovCkBAIC0xOTMsOCArMTkyLDcgQEAKIAogCWlmIChjb3Jlc2lnaHRfdGltZW91dChkcnZkYXRhLT5iYXNlLCBFVEJfRkZTUiwgRVRCX0ZGU1JfQklULCAxKSkgewogCQlkZXZfZXJyKGRydmRhdGEtPmRldiwKLQkJCSJ0aW1lb3V0IG9ic2VydmVkIHdoZW4gcHJvYmluZyBhdCBvZmZzZXQgJSN4XG4iLAotCQkJRVRCX0ZGQ1IpOworCQkJInRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgRm9ybWF0dGVyIHRvIFN0b3BcbiIpOwogCX0KIAogCUNTX0xPQ0soZHJ2ZGF0YS0+YmFzZSk7CkBAIC01NjEsNyArNTU5LDcgQEAKIH07CiAKICNkZWZpbmUgY29yZXNpZ2h0X2V0YjEwX3NpbXBsZV9mdW5jKG5hbWUsIG9mZnNldCkgICAgICAgICAgICAgICAgICAgICAgIFwKLQljb3Jlc2lnaHRfc2ltcGxlX2Z1bmMoc3RydWN0IGV0Yl9kcnZkYXRhLCBuYW1lLCBvZmZzZXQpCisJY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCBldGJfZHJ2ZGF0YSwgTlVMTCwgbmFtZSwgb2Zmc2V0KQogCiBjb3Jlc2lnaHRfZXRiMTBfc2ltcGxlX2Z1bmMocmRwLCBFVEJfUkFNX0RFUFRIX1JFRyk7CiBjb3Jlc2lnaHRfZXRiMTBfc2ltcGxlX2Z1bmMoc3RzLCBFVEJfU1RBVFVTX1JFRyk7CkBAIC02MzgsNyArNjM2LDcgQEAKIAlzdHJ1Y3QgY29yZXNpZ2h0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gTlVMTDsKIAlzdHJ1Y3QgZXRiX2RydmRhdGEgKmRydmRhdGE7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSAmYWRldi0+cmVzOwotCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgZGVzYyA9IHsgMCB9OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBhZGV2LT5kZXYub2Zfbm9kZTsKIAogCWlmIChucCkgewpAQCAtNjg0LDE3ICs2ODIsMTMgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghZGVzYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkZXNjLT50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NJTks7Ci0JZGVzYy0+c3VidHlwZS5zaW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU0lOS19CVUZGRVI7Ci0JZGVzYy0+b3BzID0gJmV0Yl9jc19vcHM7Ci0JZGVzYy0+cGRhdGEgPSBwZGF0YTsKLQlkZXNjLT5kZXYgPSBkZXY7Ci0JZGVzYy0+Z3JvdXBzID0gY29yZXNpZ2h0X2V0Yl9ncm91cHM7Ci0JZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoZGVzYyk7CisJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NJTks7CisJZGVzYy5zdWJ0eXBlLnNpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TSU5LX0JVRkZFUjsKKwlkZXNjLm9wcyA9ICZldGJfY3Nfb3BzOworCWRlc2MucGRhdGEgPSBwZGF0YTsKKwlkZXNjLmRldiA9IGRldjsKKwlkZXNjLmdyb3VwcyA9IGNvcmVzaWdodF9ldGJfZ3JvdXBzOworCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKCZkZXNjKTsKIAlpZiAoSVNfRVJSKGRydmRhdGEtPmNzZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoZHJ2ZGF0YS0+Y3NkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bS1wZXJmLmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bS1wZXJmLmMKaW5kZXggNzU1MTI1Zi4uMmNkN2M3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0tcGVyZi5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtLXBlcmYuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKKyNpbmNsdWRlICJjb3Jlc2lnaHQtZXRtLXBlcmYuaCIKICNpbmNsdWRlICJjb3Jlc2lnaHQtcHJpdi5oIgogCiBzdGF0aWMgc3RydWN0IHBtdSBldG1fcG11OwpAQCAtNzEsMTQgKzcyLDQ4IEBACiAKIHN0YXRpYyB2b2lkIGV0bV9ldmVudF9yZWFkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkge30KIAotc3RhdGljIGludCBldG1fZXZlbnRfaW5pdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCitzdGF0aWMgaW50IGV0bV9hZGRyX2ZpbHRlcnNfYWxsb2Moc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewotCWlmIChldmVudC0+YXR0ci50eXBlICE9IGV0bV9wbXUudHlwZSkKLQkJcmV0dXJuIC1FTk9FTlQ7CisJc3RydWN0IGV0bV9maWx0ZXJzICpmaWx0ZXJzOworCWludCBub2RlID0gZXZlbnQtPmNwdSA9PSAtMSA/IC0xIDogY3B1X3RvX25vZGUoZXZlbnQtPmNwdSk7CisKKwlmaWx0ZXJzID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgZXRtX2ZpbHRlcnMpLCBHRlBfS0VSTkVMLCBub2RlKTsKKwlpZiAoIWZpbHRlcnMpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGV2ZW50LT5wYXJlbnQpCisJCW1lbWNweShmaWx0ZXJzLCBldmVudC0+cGFyZW50LT5ody5hZGRyX2ZpbHRlcnMsCisJCSAgICAgICBzaXplb2YoKmZpbHRlcnMpKTsKKworCWV2ZW50LT5ody5hZGRyX2ZpbHRlcnMgPSBmaWx0ZXJzOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGV0bV9ldmVudF9kZXN0cm95KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlrZnJlZShldmVudC0+aHcuYWRkcl9maWx0ZXJzKTsKKwlldmVudC0+aHcuYWRkcl9maWx0ZXJzID0gTlVMTDsKK30KKworc3RhdGljIGludCBldG1fZXZlbnRfaW5pdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZXZlbnQtPmF0dHIudHlwZSAhPSBldG1fcG11LnR5cGUpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gZXRtX2FkZHJfZmlsdGVyc19hbGxvYyhldmVudCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlldmVudC0+ZGVzdHJveSA9IGV0bV9ldmVudF9kZXN0cm95Oworb3V0OgorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyB2b2lkIGZyZWVfZXZlbnRfZGF0YShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJaW50IGNwdTsKQEAgLTEwMCw3ICsxMzUsNyBAQAogCX0KIAogCWZvcl9lYWNoX2NwdShjcHUsIG1hc2spIHsKLQkJaWYgKGV2ZW50X2RhdGEtPnBhdGhbY3B1XSkKKwkJaWYgKCEoSVNfRVJSX09SX05VTEwoZXZlbnRfZGF0YS0+cGF0aFtjcHVdKSkpCiAJCQljb3Jlc2lnaHRfcmVsZWFzZV9wYXRoKGV2ZW50X2RhdGEtPnBhdGhbY3B1XSk7CiAJfQogCkBAIC0xODUsNyArMjIwLDcgQEAKIAkJICogcmVmZXJlbmNlZCBsYXRlciB3aGVuIHRoZSBwYXRoIGlzIGFjdHVhbGx5IG5lZWRlZC4KIAkJICovCiAJCWV2ZW50X2RhdGEtPnBhdGhbY3B1XSA9IGNvcmVzaWdodF9idWlsZF9wYXRoKGNzZGV2KTsKLQkJaWYgKCFldmVudF9kYXRhLT5wYXRoW2NwdV0pCisJCWlmIChJU19FUlIoZXZlbnRfZGF0YS0+cGF0aFtjcHVdKSkKIAkJCWdvdG8gZXJyOwogCX0KIApAQCAtMjU4LDcgKzI5Myw3IEBACiAJZXZlbnQtPmh3LnN0YXRlID0gMDsKIAogCS8qIEZpbmFsbHkgZW5hYmxlIHRoZSB0cmFjZXIgKi8KLQlpZiAoc291cmNlX29wcyhjc2RldiktPmVuYWJsZShjc2RldiwgJmV2ZW50LT5hdHRyLCBDU19NT0RFX1BFUkYpKQorCWlmIChzb3VyY2Vfb3BzKGNzZGV2KS0+ZW5hYmxlKGNzZGV2LCBldmVudCwgQ1NfTU9ERV9QRVJGKSkKIAkJZ290byBmYWlsX2VuZF9zdG9wOwogCiBvdXQ6CkBAIC0yOTEsNyArMzI2LDcgQEAKIAkJcmV0dXJuOwogCiAJLyogc3RvcCB0cmFjZXIgKi8KLQlzb3VyY2Vfb3BzKGNzZGV2KS0+ZGlzYWJsZShjc2Rldik7CisJc291cmNlX29wcyhjc2RldiktPmRpc2FibGUoY3NkZXYsIGV2ZW50KTsKIAogCS8qIHRlbGwgdGhlIGNvcmUgKi8KIAlldmVudC0+aHcuc3RhdGUgPSBQRVJGX0hFU19TVE9QUEVEOwpAQCAtMzQyLDYgKzM3Nyw4NyBAQAogCWV0bV9ldmVudF9zdG9wKGV2ZW50LCBQRVJGX0VGX1VQREFURSk7CiB9CiAKK3N0YXRpYyBpbnQgZXRtX2FkZHJfZmlsdGVyc192YWxpZGF0ZShzdHJ1Y3QgbGlzdF9oZWFkICpmaWx0ZXJzKQoreworCWJvb2wgcmFuZ2UgPSBmYWxzZSwgYWRkcmVzcyA9IGZhbHNlOworCWludCBpbmRleCA9IDA7CisJc3RydWN0IHBlcmZfYWRkcl9maWx0ZXIgKmZpbHRlcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmlsdGVyLCBmaWx0ZXJzLCBlbnRyeSkgeworCQkvKgorCQkgKiBObyBuZWVkIHRvIGdvIGZ1cnRoZXIgaWYgdGhlcmUncyBubyBtb3JlCisJCSAqIHJvb20gZm9yIGZpbHRlcnMuCisJCSAqLworCQlpZiAoKytpbmRleCA+IEVUTV9BRERSX0NNUF9NQVgpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkJLyoKKwkJICogQXMgdGFrZW4gZnJvbSB0aGUgc3RydWN0IHBlcmZfYWRkcl9maWx0ZXIgZG9jdW1lbnRhdGlvbjoKKwkJICoJQHJhbmdlOgkxOiByYW5nZSwgMDogYWRkcmVzcworCQkgKgorCQkgKiBBdCB0aGlzIHRpbWUgd2UgZG9uJ3QgYWxsb3cgcmFuZ2UgYW5kIHN0YXJ0L3N0b3AgZmlsdGVyaW5nCisJCSAqIHRvIGNvaGFiaXRhdGUsIHRoZXkgaGF2ZSB0byBiZSBtdXR1YWxseSBleGNsdXNpdmUuCisJCSAqLworCQlpZiAoKGZpbHRlci0+cmFuZ2UgPT0gMSkgJiYgYWRkcmVzcykKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCQlpZiAoKGZpbHRlci0+cmFuZ2UgPT0gMCkgJiYgcmFuZ2UpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkJLyoKKwkJICogRm9yIHJhbmdlIGZpbHRlcmluZywgdGhlIHNlY29uZCBhZGRyZXNzIGluIHRoZSBhZGRyZXNzCisJCSAqIHJhbmdlIGNvbXBhcmF0b3IgbmVlZHMgdG8gYmUgaGlnaGVyIHRoYW4gdGhlIGZpcnN0LgorCQkgKiBJbnZhbGlkIG90aGVyd2lzZS4KKwkJICovCisJCWlmIChmaWx0ZXItPnJhbmdlICYmIGZpbHRlci0+c2l6ZSA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyoKKwkJICogRXZlcnl0aGluZyBjaGVja3Mgb3V0IHdpdGggdGhpcyBmaWx0ZXIsIHJlY29yZCB3aGF0IHdlJ3ZlCisJCSAqIHJlY2VpdmVkIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlIG5leHQgb25lLgorCQkgKi8KKwkJaWYgKGZpbHRlci0+cmFuZ2UpCisJCQlyYW5nZSA9IHRydWU7CisJCWVsc2UKKwkJCWFkZHJlc3MgPSB0cnVlOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBldG1fYWRkcl9maWx0ZXJzX3N5bmMoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBwZXJmX2FkZHJfZmlsdGVyc19oZWFkICpoZWFkID0gcGVyZl9ldmVudF9hZGRyX2ZpbHRlcnMoZXZlbnQpOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHN0b3AsICpvZmZzID0gZXZlbnQtPmFkZHJfZmlsdGVyc19vZmZzOworCXN0cnVjdCBldG1fZmlsdGVycyAqZmlsdGVycyA9IGV2ZW50LT5ody5hZGRyX2ZpbHRlcnM7CisJc3RydWN0IGV0bV9maWx0ZXIgKmV0bV9maWx0ZXI7CisJc3RydWN0IHBlcmZfYWRkcl9maWx0ZXIgKmZpbHRlcjsKKwlpbnQgaSA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpbHRlciwgJmhlYWQtPmxpc3QsIGVudHJ5KSB7CisJCXN0YXJ0ID0gZmlsdGVyLT5vZmZzZXQgKyBvZmZzW2ldOworCQlzdG9wID0gc3RhcnQgKyBmaWx0ZXItPnNpemU7CisJCWV0bV9maWx0ZXIgPSAmZmlsdGVycy0+ZXRtX2ZpbHRlcltpXTsKKworCQlpZiAoZmlsdGVyLT5yYW5nZSA9PSAxKSB7CisJCQlldG1fZmlsdGVyLT5zdGFydF9hZGRyID0gc3RhcnQ7CisJCQlldG1fZmlsdGVyLT5zdG9wX2FkZHIgPSBzdG9wOworCQkJZXRtX2ZpbHRlci0+dHlwZSA9IEVUTV9BRERSX1RZUEVfUkFOR0U7CisJCX0gZWxzZSB7CisJCQlpZiAoZmlsdGVyLT5maWx0ZXIgPT0gMSkgeworCQkJCWV0bV9maWx0ZXItPnN0YXJ0X2FkZHIgPSBzdGFydDsKKwkJCQlldG1fZmlsdGVyLT50eXBlID0gRVRNX0FERFJfVFlQRV9TVEFSVDsKKwkJCX0gZWxzZSB7CisJCQkJZXRtX2ZpbHRlci0+c3RvcF9hZGRyID0gc3RvcDsKKwkJCQlldG1fZmlsdGVyLT50eXBlID0gRVRNX0FERFJfVFlQRV9TVE9QOworCQkJfQorCQl9CisJCWkrKzsKKwl9CisKKwlmaWx0ZXJzLT5ucl9maWx0ZXJzID0gaTsKK30KKwogaW50IGV0bV9wZXJmX3N5bWxpbmsoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LCBib29sIGxpbmspCiB7CiAJY2hhciBlbnRyeVtzaXplb2YoImNwdTk5OTk5OTkiKV07CkBAIC0zNzEsMTggKzQ4NywyMSBAQAogewogCWludCByZXQ7CiAKLQlldG1fcG11LmNhcGFiaWxpdGllcwk9IFBFUkZfUE1VX0NBUF9FWENMVVNJVkU7CisJZXRtX3BtdS5jYXBhYmlsaXRpZXMJCT0gUEVSRl9QTVVfQ0FQX0VYQ0xVU0lWRTsKIAotCWV0bV9wbXUuYXR0cl9ncm91cHMJPSBldG1fcG11X2F0dHJfZ3JvdXBzOwotCWV0bV9wbXUudGFza19jdHhfbnIJPSBwZXJmX3N3X2NvbnRleHQ7Ci0JZXRtX3BtdS5yZWFkCQk9IGV0bV9ldmVudF9yZWFkOwotCWV0bV9wbXUuZXZlbnRfaW5pdAk9IGV0bV9ldmVudF9pbml0OwotCWV0bV9wbXUuc2V0dXBfYXV4CT0gZXRtX3NldHVwX2F1eDsKLQlldG1fcG11LmZyZWVfYXV4CT0gZXRtX2ZyZWVfYXV4OwotCWV0bV9wbXUuc3RhcnQJCT0gZXRtX2V2ZW50X3N0YXJ0OwotCWV0bV9wbXUuc3RvcAkJPSBldG1fZXZlbnRfc3RvcDsKLQlldG1fcG11LmFkZAkJPSBldG1fZXZlbnRfYWRkOwotCWV0bV9wbXUuZGVsCQk9IGV0bV9ldmVudF9kZWw7CisJZXRtX3BtdS5hdHRyX2dyb3VwcwkJPSBldG1fcG11X2F0dHJfZ3JvdXBzOworCWV0bV9wbXUudGFza19jdHhfbnIJCT0gcGVyZl9zd19jb250ZXh0OworCWV0bV9wbXUucmVhZAkJCT0gZXRtX2V2ZW50X3JlYWQ7CisJZXRtX3BtdS5ldmVudF9pbml0CQk9IGV0bV9ldmVudF9pbml0OworCWV0bV9wbXUuc2V0dXBfYXV4CQk9IGV0bV9zZXR1cF9hdXg7CisJZXRtX3BtdS5mcmVlX2F1eAkJPSBldG1fZnJlZV9hdXg7CisJZXRtX3BtdS5zdGFydAkJCT0gZXRtX2V2ZW50X3N0YXJ0OworCWV0bV9wbXUuc3RvcAkJCT0gZXRtX2V2ZW50X3N0b3A7CisJZXRtX3BtdS5hZGQJCQk9IGV0bV9ldmVudF9hZGQ7CisJZXRtX3BtdS5kZWwJCQk9IGV0bV9ldmVudF9kZWw7CisJZXRtX3BtdS5hZGRyX2ZpbHRlcnNfc3luYwk9IGV0bV9hZGRyX2ZpbHRlcnNfc3luYzsKKwlldG1fcG11LmFkZHJfZmlsdGVyc192YWxpZGF0ZQk9IGV0bV9hZGRyX2ZpbHRlcnNfdmFsaWRhdGU7CisJZXRtX3BtdS5ucl9hZGRyX2ZpbHRlcnMJCT0gRVRNX0FERFJfQ01QX01BWDsKIAogCXJldCA9IHBlcmZfcG11X3JlZ2lzdGVyKCZldG1fcG11LCBDT1JFU0lHSFRfRVRNX1BNVV9OQU1FLCAtMSk7CiAJaWYgKHJldCA9PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0tcGVyZi5oIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0tcGVyZi5oCmluZGV4IDg3ZjVhMTMuLjNmZmM5ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtLXBlcmYuaAorKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bS1wZXJmLmgKQEAgLTE4LDggKzE4LDQyIEBACiAjaWZuZGVmIF9DT1JFU0lHSFRfRVRNX1BFUkZfSAogI2RlZmluZSBfQ09SRVNJR0hUX0VUTV9QRVJGX0gKIAorI2luY2x1ZGUgImNvcmVzaWdodC1wcml2LmgiCisKIHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlOwogCisvKgorICogSW4gYm90aCBFVE12MyBhbmQgdjQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGFkZHJlc3MgY29tcGFyYXRvciBpbXBsZW50YWJsZQorICogaXMgOC4gIFRoZSBhY3R1YWwgbnVtYmVyIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGFuZCB3aWxsIGJlIGNoZWNrZWQKKyAqIHdoZW4gZmlsdGVycyBhcmUgYXBwbGllZC4KKyAqLworI2RlZmluZSBFVE1fQUREUl9DTVBfTUFYCTgKKworLyoqCisgKiBzdHJ1Y3QgZXRtX2ZpbHRlciAtIHNpbmdsZSBpbnN0cnVjdGlvbiByYW5nZSBvciBzdGFydC9zdG9wIGNvbmZpZ3VyYXRpb24uCisgKiBAc3RhcnRfYWRkcjoJVGhlIGFkZHJlc3MgdG8gc3RhcnQgdHJhY2luZyBvbi4KKyAqIEBzdG9wX2FkZHI6CVRoZSBhZGRyZXNzIHRvIHN0b3AgdHJhY2luZyBvbi4KKyAqIEB0eXBlOglJcyB0aGlzIGEgcmFuZ2Ugb3Igc3RhcnQvc3RvcCBmaWx0ZXIuCisgKi8KK3N0cnVjdCBldG1fZmlsdGVyIHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHI7CisJdW5zaWduZWQgbG9uZyBzdG9wX2FkZHI7CisJZW51bSBldG1fYWRkcl90eXBlIHR5cGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBldG1fZmlsdGVycyAtIHNldCBvZiBmaWx0ZXJzIGZvciBhIHNlc3Npb24KKyAqIEBldG1fZmlsdGVyOglBbGwgdGhlIGZpbHRlcnMgZm9yIHRoaXMgc2Vzc2lvbi4KKyAqIEBucl9maWx0ZXJzOglOdW1iZXIgb2YgZmlsdGVycworICogQHNzc3RhdHVzOglTdGF0dXMgb2YgdGhlIHN0YXJ0L3N0b3AgbG9naWMuCisgKi8KK3N0cnVjdCBldG1fZmlsdGVycyB7CisJc3RydWN0IGV0bV9maWx0ZXIJZXRtX2ZpbHRlcltFVE1fQUREUl9DTVBfTUFYXTsKKwl1bnNpZ25lZCBpbnQJCW5yX2ZpbHRlcnM7CisJYm9vbAkJCXNzc3RhdHVzOworfTsKKworCiAjaWZkZWYgQ09ORklHX0NPUkVTSUdIVAogaW50IGV0bV9wZXJmX3N5bWxpbmsoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LCBib29sIGxpbmspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bS5oIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0uaAppbmRleCA1MTU5N2NiLi40YTE4ZWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bS5oCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtLmgKQEAgLTI1OSwxNCArMjU5LDYgQEAKIAlzdHJ1Y3QgZXRtX2NvbmZpZwkJY29uZmlnOwogfTsKIAotZW51bSBldG1fYWRkcl90eXBlIHsKLQlFVE1fQUREUl9UWVBFX05PTkUsCi0JRVRNX0FERFJfVFlQRV9TSU5HTEUsCi0JRVRNX0FERFJfVFlQRV9SQU5HRSwKLQlFVE1fQUREUl9UWVBFX1NUQVJULAotCUVUTV9BRERSX1RZUEVfU1RPUCwKLX07Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBldG1fd3JpdGVsKHN0cnVjdCBldG1fZHJ2ZGF0YSAqZHJ2ZGF0YSwKIAkJCSAgICAgIHUzMiB2YWwsIHUzMiBvZmYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTN4LXN5c2ZzLmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTN4LXN5c2ZzLmMKaW5kZXggMDJkNGI2Mi4uZTliMDcxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0zeC1zeXNmcy5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtM3gtc3lzZnMuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgImNvcmVzaWdodC1ldG0uaCIKKyNpbmNsdWRlICJjb3Jlc2lnaHQtcHJpdi5oIgogCiBzdGF0aWMgc3NpemVfdCBucl9hZGRyX2NtcF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtMTIyMiw3ICsxMjIzLDcgQEAKIH07CiAKICNkZWZpbmUgY29yZXNpZ2h0X2V0bTN4X3NpbXBsZV9mdW5jKG5hbWUsIG9mZnNldCkJCQlcCi0JY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCBldG1fZHJ2ZGF0YSwgbmFtZSwgb2Zmc2V0KQorCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3QgZXRtX2RydmRhdGEsIE5VTEwsIG5hbWUsIG9mZnNldCkKIAogY29yZXNpZ2h0X2V0bTN4X3NpbXBsZV9mdW5jKGV0bWNjciwgRVRNQ0NSKTsKIGNvcmVzaWdodF9ldG0zeF9zaW1wbGVfZnVuYyhldG1jY2VyLCBFVE1DQ0VSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtM3guYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtM3guYwppbmRleCAyZGU0Y2FkLi4zZmUzNjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTN4LmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG0zeC5jCkBAIC0zMTEsOSArMzExLDEwIEBACiAjZGVmaW5lIEVUTTNYX1NVUFBPUlRFRF9PUFRJT05TIChFVE1DUl9DWUNfQUNDIHwgRVRNQ1JfVElNRVNUQU1QX0VOKQogCiBzdGF0aWMgaW50IGV0bV9wYXJzZV9ldmVudF9jb25maWcoc3RydWN0IGV0bV9kcnZkYXRhICpkcnZkYXRhLAotCQkJCSAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cikKKwkJCQkgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgZXRtX2NvbmZpZyAqY29uZmlnID0gJmRydmRhdGEtPmNvbmZpZzsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyID0gJmV2ZW50LT5hdHRyOwogCiAJaWYgKCFhdHRyKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ1OSw3ICs0NjAsNyBAQAogfQogCiBzdGF0aWMgaW50IGV0bV9lbmFibGVfcGVyZihzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYsCi0JCQkgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQorCQkJICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBldG1fZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjc2Rldi0+ZGV2LnBhcmVudCk7CiAKQEAgLTQ2Nyw3ICs0NjgsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIENvbmZpZ3VyZSB0aGUgdHJhY2VyIGJhc2VkIG9uIHRoZSBzZXNzaW9uJ3Mgc3BlY2lmaWNzICovCi0JZXRtX3BhcnNlX2V2ZW50X2NvbmZpZyhkcnZkYXRhLCBhdHRyKTsKKwlldG1fcGFyc2VfZXZlbnRfY29uZmlnKGRydmRhdGEsIGV2ZW50KTsKIAkvKiBBbmQgZW5hYmxlIGl0ICovCiAJZXRtX2VuYWJsZV9odyhkcnZkYXRhKTsKIApAQCAtNTA0LDcgKzUwNSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZXRtX2VuYWJsZShzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYsCi0JCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsIHUzMiBtb2RlKQorCQkgICAgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIHUzMiBtb2RlKQogewogCWludCByZXQ7CiAJdTMyIHZhbDsKQEAgLTUyMSw3ICs1MjIsNyBAQAogCQlyZXQgPSBldG1fZW5hYmxlX3N5c2ZzKGNzZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSBDU19NT0RFX1BFUkY6Ci0JCXJldCA9IGV0bV9lbmFibGVfcGVyZihjc2RldiwgYXR0cik7CisJCXJldCA9IGV0bV9lbmFibGVfcGVyZihjc2RldiwgZXZlbnQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwpAQCAtNjAxLDcgKzYwMiw4IEBACiAJZGV2X2luZm8oZHJ2ZGF0YS0+ZGV2LCAiRVRNIHRyYWNpbmcgZGlzYWJsZWRcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBldG1fZGlzYWJsZShzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYpCitzdGF0aWMgdm9pZCBldG1fZGlzYWJsZShzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYsCisJCQlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJdTMyIG1vZGU7CiAJc3RydWN0IGV0bV9kcnZkYXRhICpkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGNzZGV2LT5kZXYucGFyZW50KTsKQEAgLTc1NiwxMyArNzU4LDkgQEAKIAlzdHJ1Y3QgY29yZXNpZ2h0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gTlVMTDsKIAlzdHJ1Y3QgZXRtX2RydmRhdGEgKmRydmRhdGE7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSAmYWRldi0+cmVzOwotCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgZGVzYyA9IHsgMCB9OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBhZGV2LT5kZXYub2Zfbm9kZTsKIAotCWRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2MpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJZHJ2ZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZHJ2ZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZHJ2ZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC04MjUsMTMgKzgyMywxMyBAQAogCWV0bV9pbml0X3RyYWNlX2lkKGRydmRhdGEpOwogCWV0bV9zZXRfZGVmYXVsdCgmZHJ2ZGF0YS0+Y29uZmlnKTsKIAotCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU09VUkNFOwotCWRlc2MtPnN1YnR5cGUuc291cmNlX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU09VUkNFX1BST0M7Ci0JZGVzYy0+b3BzID0gJmV0bV9jc19vcHM7Ci0JZGVzYy0+cGRhdGEgPSBwZGF0YTsKLQlkZXNjLT5kZXYgPSBkZXY7Ci0JZGVzYy0+Z3JvdXBzID0gY29yZXNpZ2h0X2V0bV9ncm91cHM7Ci0JZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoZGVzYyk7CisJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NPVVJDRTsKKwlkZXNjLnN1YnR5cGUuc291cmNlX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU09VUkNFX1BST0M7CisJZGVzYy5vcHMgPSAmZXRtX2NzX29wczsKKwlkZXNjLnBkYXRhID0gcGRhdGE7CisJZGVzYy5kZXYgPSBkZXY7CisJZGVzYy5ncm91cHMgPSBjb3Jlc2lnaHRfZXRtX2dyb3VwczsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpIHsKIAkJcmV0ID0gUFRSX0VSUihkcnZkYXRhLT5jc2Rldik7CiAJCWdvdG8gZXJyX2FyY2hfc3VwcG9ydGVkOwpAQCAtODkzLDYgKzg5MSwxMSBAQAogCQkubWFzawk9IDB4MDAwM2ZmZmYsCiAJCS5kYXRhCT0gIkVUTSAzLjMiLAogCX0sCisJewkvKiBFVE0gMy41IC0gQ29ydGV4LUE1ICovCisJCS5pZAk9IDB4MDAwM2I5NTUsCisJCS5tYXNrCT0gMHgwMDAzZmZmZiwKKwkJLmRhdGEJPSAiRVRNIDMuNSIsCisJfSwKIAl7CS8qIEVUTSAzLjUgKi8KIAkJLmlkCT0gMHgwMDAzYjk1NiwKIAkJLm1hc2sJPSAweDAwMDNmZmZmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC1zeXNmcy5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC1zeXNmcy5jCmluZGV4IDdjODQzMDguLmI5YjFlOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHgtc3lzZnMuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTR4LXN5c2ZzLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlICJjb3Jlc2lnaHQtZXRtNHguaCIKKyNpbmNsdWRlICJjb3Jlc2lnaHQtcHJpdi5oIgogCiBzdGF0aWMgaW50IGV0bTRfc2V0X21vZGVfZXhjbHVkZShzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSAqZHJ2ZGF0YSwgYm9vbCBleGNsdWRlKQogewpAQCAtMjAzOSwxNSArMjA0MCw0MiBAQAogCU5VTEwsCiB9OwogCi0jZGVmaW5lIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyhuYW1lLCBvZmZzZXQpCQkJXAotCWNvcmVzaWdodF9zaW1wbGVfZnVuYyhzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSwgbmFtZSwgb2Zmc2V0KQorc3RydWN0IGV0bXY0X3JlZyB7CisJdm9pZCBfX2lvbWVtICphZGRyOworCXUzMiBkYXRhOworfTsKIAotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY29zbHNyLCBUUkNPU0xTUik7CitzdGF0aWMgdm9pZCBkb19zbXBfY3Jvc3NfcmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBldG12NF9yZWcgKnJlZyA9IGRhdGE7CisKKwlyZWctPmRhdGEgPSByZWFkbF9yZWxheGVkKHJlZy0+YWRkcik7Cit9CisKK3N0YXRpYyB1MzIgZXRtdjRfY3Jvc3NfcmVhZChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZmZzZXQpCit7CisJc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgZXRtdjRfcmVnIHJlZzsKKworCXJlZy5hZGRyID0gZHJ2ZGF0YS0+YmFzZSArIG9mZnNldDsKKwkvKgorCSAqIHNtcCBjcm9zcyBjYWxsIGVuc3VyZXMgdGhlIENQVSB3aWxsIGJlIHBvd2VyZWQgdXAgYmVmb3JlCisJICogYWNjZXNzaW5nIHRoZSBFVE12NCB0cmFjZSBjb3JlIHJlZ2lzdGVycworCSAqLworCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShkcnZkYXRhLT5jcHUsIGRvX3NtcF9jcm9zc19yZWFkLCAmcmVnLCAxKTsKKwlyZXR1cm4gcmVnLmRhdGE7Cit9CisKKyNkZWZpbmUgY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKG5hbWUsIG9mZnNldCkJCQlcCisJY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCBldG12NF9kcnZkYXRhLCBOVUxMLCBuYW1lLCBvZmZzZXQpCisKKyNkZWZpbmUgY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQobmFtZSwgb2Zmc2V0KQkJCVwKKwljb3Jlc2lnaHRfc2ltcGxlX2Z1bmMoc3RydWN0IGV0bXY0X2RydmRhdGEsIGV0bXY0X2Nyb3NzX3JlYWQsCVwKKwkJCSAgICAgIG5hbWUsIG9mZnNldCkKKwogY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY3BkY3IsIFRSQ1BEQ1IpOwogY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY3Bkc3IsIFRSQ1BEU1IpOwogY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2xzciwgVFJDTFNSKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNjb25maWcsIFRSQ0NPTkZJR1IpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY3RyYWNlaWQsIFRSQ1RSQUNFSURSKTsKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNhdXRoc3RhdHVzLCBUUkNBVVRIU1RBVFVTKTsKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNkZXZpZCwgVFJDREVWSUQpOwogY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2RldnR5cGUsIFRSQ0RFVlRZUEUpOwpAQCAtMjA1NSw2ICsyMDgzLDkgQEAKIGNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNwaWRyMSwgVFJDUElEUjEpOwogY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY3BpZHIyLCBUUkNQSURSMik7CiBjb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjcGlkcjMsIFRSQ1BJRFIzKTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY29zbHNyLCBUUkNPU0xTUik7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNjb25maWcsIFRSQ0NPTkZJR1IpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjdHJhY2VpZCwgVFJDVFJBQ0VJRFIpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY29yZXNpZ2h0X2V0bXY0X21nbXRfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfdHJjb3Nsc3IuYXR0ciwKQEAgLTIwNzMsMTkgKzIxMDQsMTkgQEAKIAlOVUxMLAogfTsKIAotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjAsIFRSQ0lEUjApOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjEsIFRSQ0lEUjEpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjIsIFRSQ0lEUjIpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjMsIFRSQ0lEUjMpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjQsIFRSQ0lEUjQpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjUsIFRSQ0lEUjUpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyMCwgVFJDSURSMCk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHIxLCBUUkNJRFIxKTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjIsIFRSQ0lEUjIpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyMywgVFJDSURSMyk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHI0LCBUUkNJRFI0KTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjUsIFRSQ0lEUjUpOwogLyogdHJjaWRyWzYsN10gYXJlIHJlc2VydmVkICovCi1jb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjaWRyOCwgVFJDSURSOCk7Ci1jb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjaWRyOSwgVFJDSURSOSk7Ci1jb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjaWRyMTAsIFRSQ0lEUjEwKTsKLWNvcmVzaWdodF9ldG00eF9zaW1wbGVfZnVuYyh0cmNpZHIxMSwgVFJDSURSMTEpOwotY29yZXNpZ2h0X2V0bTR4X3NpbXBsZV9mdW5jKHRyY2lkcjEyLCBUUkNJRFIxMik7Ci1jb3Jlc2lnaHRfZXRtNHhfc2ltcGxlX2Z1bmModHJjaWRyMTMsIFRSQ0lEUjEzKTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjgsIFRSQ0lEUjgpOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyOSwgVFJDSURSOSk7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHIxMCwgVFJDSURSMTApOworY29yZXNpZ2h0X2V0bTR4X2Nyb3NzX3JlYWQodHJjaWRyMTEsIFRSQ0lEUjExKTsKK2NvcmVzaWdodF9ldG00eF9jcm9zc19yZWFkKHRyY2lkcjEyLCBUUkNJRFIxMik7Citjb3Jlc2lnaHRfZXRtNHhfY3Jvc3NfcmVhZCh0cmNpZHIxMywgVFJDSURSMTMpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY29yZXNpZ2h0X2V0bXY0X3RyY2lkcl9hdHRyc1tdID0gewogCSZkZXZfYXR0cl90cmNpZHIwLmF0dHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTR4LmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTR4LmMKaW5kZXggMWE1ZTBkMS4uNGRiOGQ2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHguYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vbG9jYWwuaD4KIApAQCAtNDYsNyArNDUsOSBAQAogLyogVGhlIG51bWJlciBvZiBFVE12NCBjdXJyZW50bHkgcmVnaXN0ZXJlZCAqLwogc3RhdGljIGludCBldG00X2NvdW50Owogc3RhdGljIHN0cnVjdCBldG12NF9kcnZkYXRhICpldG1kcnZkYXRhW05SX0NQVVNdOwotc3RhdGljIHZvaWQgZXRtNF9zZXRfZGVmYXVsdChzdHJ1Y3QgZXRtdjRfY29uZmlnICpjb25maWcpOworc3RhdGljIHZvaWQgZXRtNF9zZXRfZGVmYXVsdF9jb25maWcoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKTsKK3N0YXRpYyBpbnQgZXRtNF9zZXRfZXZlbnRfZmlsdGVycyhzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSAqZHJ2ZGF0YSwKKwkJCQkgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAKIHN0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIGhwX29ubGluZTsKIApAQCAtNzksMjIgKzgwLDggQEAKIHN0YXRpYyBpbnQgZXRtNF90cmFjZV9pZChzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYpCiB7CiAJc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoY3NkZXYtPmRldi5wYXJlbnQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHRyYWNlX2lkID0gLTE7CiAKLQlpZiAoIWxvY2FsX3JlYWQoJmRydmRhdGEtPm1vZGUpKQotCQlyZXR1cm4gZHJ2ZGF0YS0+dHJjaWQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZHJ2ZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCUNTX1VOTE9DSyhkcnZkYXRhLT5iYXNlKTsKLQl0cmFjZV9pZCA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRSQ1RSQUNFSURSKTsKLQl0cmFjZV9pZCAmPSBFVE1fVFJBQ0VJRF9NQVNLOwotCUNTX0xPQ0soZHJ2ZGF0YS0+YmFzZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHRyYWNlX2lkOworCXJldHVybiBkcnZkYXRhLT50cmNpZDsKIH0KIAogc3RhdGljIHZvaWQgZXRtNF9lbmFibGVfaHcodm9pZCAqaW5mbykKQEAgLTExMyw4ICsxMDAsNyBAQAogCS8qIHdhaXQgZm9yIFRSQ1NUQVRSLklETEUgdG8gZ28gdXAgKi8KIAlpZiAoY29yZXNpZ2h0X3RpbWVvdXQoZHJ2ZGF0YS0+YmFzZSwgVFJDU1RBVFIsIFRSQ1NUQVRSX0lETEVfQklULCAxKSkKIAkJZGV2X2VycihkcnZkYXRhLT5kZXYsCi0JCQkidGltZW91dCBvYnNlcnZlZCB3aGVuIHByb2JpbmcgYXQgb2Zmc2V0ICUjeFxuIiwKLQkJCVRSQ1NUQVRSKTsKKwkJCSJ0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIElkbGUgVHJhY2UgU3RhdHVzXG4iKTsKIAogCXdyaXRlbF9yZWxheGVkKGNvbmZpZy0+cGVfc2VsLCBkcnZkYXRhLT5iYXNlICsgVFJDUFJPQ1NFTFIpOwogCXdyaXRlbF9yZWxheGVkKGNvbmZpZy0+Y2ZnLCBkcnZkYXRhLT5iYXNlICsgVFJDQ09ORklHUik7CkBAIC0xODAsMTQgKzE2NiwyMCBAQAogCXdyaXRlbF9yZWxheGVkKGNvbmZpZy0+dm1pZF9tYXNrMCwgZHJ2ZGF0YS0+YmFzZSArIFRSQ1ZNSURDQ1RMUjApOwogCXdyaXRlbF9yZWxheGVkKGNvbmZpZy0+dm1pZF9tYXNrMSwgZHJ2ZGF0YS0+YmFzZSArIFRSQ1ZNSURDQ1RMUjEpOwogCisJLyoKKwkgKiBSZXF1ZXN0IHRvIGtlZXAgdGhlIHRyYWNlIHVuaXQgcG93ZXJlZCBhbmQgYWxzbworCSAqIGVtdWxhdGlvbiBvZiBwb3dlcmRvd24KKwkgKi8KKwl3cml0ZWxfcmVsYXhlZChyZWFkbF9yZWxheGVkKGRydmRhdGEtPmJhc2UgKyBUUkNQRENSKSB8IFRSQ1BEQ1JfUFUsCisJCSAgICAgICBkcnZkYXRhLT5iYXNlICsgVFJDUERDUik7CisKIAkvKiBFbmFibGUgdGhlIHRyYWNlIHVuaXQgKi8KIAl3cml0ZWxfcmVsYXhlZCgxLCBkcnZkYXRhLT5iYXNlICsgVFJDUFJHQ1RMUik7CiAKIAkvKiB3YWl0IGZvciBUUkNTVEFUUi5JRExFIHRvIGdvIGJhY2sgZG93biB0byAnMCcgKi8KIAlpZiAoY29yZXNpZ2h0X3RpbWVvdXQoZHJ2ZGF0YS0+YmFzZSwgVFJDU1RBVFIsIFRSQ1NUQVRSX0lETEVfQklULCAwKSkKIAkJZGV2X2VycihkcnZkYXRhLT5kZXYsCi0JCQkidGltZW91dCBvYnNlcnZlZCB3aGVuIHByb2JpbmcgYXQgb2Zmc2V0ICUjeFxuIiwKLQkJCVRSQ1NUQVRSKTsKKwkJCSJ0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIElkbGUgVHJhY2UgU3RhdHVzXG4iKTsKIAogCUNTX0xPQ0soZHJ2ZGF0YS0+YmFzZSk7CiAKQEAgLTE5NSwxMiArMTg3LDE2IEBACiB9CiAKIHN0YXRpYyBpbnQgZXRtNF9wYXJzZV9ldmVudF9jb25maWcoc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEsCi0JCQkJICAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cikKKwkJCQkgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CisJaW50IHJldCA9IDA7CiAJc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnID0gJmRydmRhdGEtPmNvbmZpZzsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyID0gJmV2ZW50LT5hdHRyOwogCi0JaWYgKCFhdHRyKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWF0dHIpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQogCiAJLyogQ2xlYXIgY29uZmlndXJhdGlvbiBmcm9tIHByZXZpb3VzIHJ1biAqLwogCW1lbXNldChjb25maWcsIDAsIHNpemVvZihzdHJ1Y3QgZXRtdjRfY29uZmlnKSk7CkBAIC0yMTIsMTQgKzIwOCwxMiBAQAogCQljb25maWctPm1vZGUgPSBFVE1fTU9ERV9FWENMX1VTRVI7CiAKIAkvKiBBbHdheXMgc3RhcnQgZnJvbSB0aGUgZGVmYXVsdCBjb25maWcgKi8KLQlldG00X3NldF9kZWZhdWx0KGNvbmZpZyk7CisJZXRtNF9zZXRfZGVmYXVsdF9jb25maWcoY29uZmlnKTsKIAotCS8qCi0JICogQnkgZGVmYXVsdCB0aGUgdHJhY2VycyBhcmUgY29uZmlndXJlZCB0byB0cmFjZSB0aGUgd2hvbGUgYWRkcmVzcwotCSAqIHJhbmdlLiAgTmFycm93IHRoZSBmaWVsZCBvbmx5IGlmIHJlcXVlc3RlZCBieSB1c2VyIHNwYWNlLgotCSAqLwotCWlmIChjb25maWctPm1vZGUpCi0JCWV0bTRfY29uZmlnX3RyYWNlX21vZGUoY29uZmlnKTsKKwkvKiBDb25maWd1cmUgZmlsdGVycyBzcGVjaWZpZWQgb24gdGhlIHBlcmYgY21kIGxpbmUsIGlmIGFueS4gKi8KKwlyZXQgPSBldG00X3NldF9ldmVudF9maWx0ZXJzKGRydmRhdGEsIGV2ZW50KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKIAogCS8qIEdvIGZyb20gZ2VuZXJpYyBvcHRpb24gdG8gRVRNdjQgc3BlY2lmaWNzICovCiAJaWYgKGF0dHItPmNvbmZpZyAmIEJJVChFVE1fT1BUX0NZQ0FDQykpCkBAIC0yMjcsMjMgKzIyMSwzMCBAQAogCWlmIChhdHRyLT5jb25maWcgJiBCSVQoRVRNX09QVF9UUykpCiAJCWNvbmZpZy0+Y2ZnIHw9IEVUTXY0X01PREVfVElNRVNUQU1QOwogCi0JcmV0dXJuIDA7CitvdXQ6CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBldG00X2VuYWJsZV9wZXJmKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldiwKLQkJCSAgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQorCQkJICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKKwlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjc2Rldi0+ZGV2LnBhcmVudCk7CiAKLQlpZiAoV0FSTl9PTl9PTkNFKGRydmRhdGEtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoV0FSTl9PTl9PTkNFKGRydmRhdGEtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KIAogCS8qIENvbmZpZ3VyZSB0aGUgdHJhY2VyIGJhc2VkIG9uIHRoZSBzZXNzaW9uJ3Mgc3BlY2lmaWNzICovCi0JZXRtNF9wYXJzZV9ldmVudF9jb25maWcoZHJ2ZGF0YSwgYXR0cik7CisJcmV0ID0gZXRtNF9wYXJzZV9ldmVudF9jb25maWcoZHJ2ZGF0YSwgZXZlbnQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCS8qIEFuZCBlbmFibGUgaXQgKi8KIAlldG00X2VuYWJsZV9odyhkcnZkYXRhKTsKIAotCXJldHVybiAwOworb3V0OgorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZXRtNF9lbmFibGVfc3lzZnMoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2KQpAQCAtMjc0LDcgKzI3NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZXRtNF9lbmFibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAotCQkgICAgICAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwgdTMyIG1vZGUpCisJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIHUzMiBtb2RlKQogewogCWludCByZXQ7CiAJdTMyIHZhbDsKQEAgLTI5MSw3ICsyOTIsNyBAQAogCQlyZXQgPSBldG00X2VuYWJsZV9zeXNmcyhjc2Rldik7CiAJCWJyZWFrOwogCWNhc2UgQ1NfTU9ERV9QRVJGOgotCQlyZXQgPSBldG00X2VuYWJsZV9wZXJmKGNzZGV2LCBhdHRyKTsKKwkJcmV0ID0gZXRtNF9lbmFibGVfcGVyZihjc2RldiwgZXZlbnQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMzExLDYgKzMxMiwxMSBAQAogCiAJQ1NfVU5MT0NLKGRydmRhdGEtPmJhc2UpOwogCisJLyogcG93ZXIgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgdHJhY2UgdW5pdCBub3cgKi8KKwljb250cm9sID0gcmVhZGxfcmVsYXhlZChkcnZkYXRhLT5iYXNlICsgVFJDUERDUik7CisJY29udHJvbCAmPSB+VFJDUERDUl9QVTsKKwl3cml0ZWxfcmVsYXhlZChjb250cm9sLCBkcnZkYXRhLT5iYXNlICsgVFJDUERDUik7CisKIAljb250cm9sID0gcmVhZGxfcmVsYXhlZChkcnZkYXRhLT5iYXNlICsgVFJDUFJHQ1RMUik7CiAKIAkvKiBFTiwgYml0WzBdIFRyYWNlIHVuaXQgZW5hYmxlIGJpdCAqLwpAQCAtMzI2LDE0ICszMzIsMjggQEAKIAlkZXZfZGJnKGRydmRhdGEtPmRldiwgImNwdTogJWQgZGlzYWJsZSBzbXAgY2FsbCBkb25lXG4iLCBkcnZkYXRhLT5jcHUpOwogfQogCi1zdGF0aWMgaW50IGV0bTRfZGlzYWJsZV9wZXJmKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2RldikKK3N0YXRpYyBpbnQgZXRtNF9kaXNhYmxlX3BlcmYoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAorCQkJICAgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CisJdTMyIGNvbnRyb2w7CisJc3RydWN0IGV0bV9maWx0ZXJzICpmaWx0ZXJzID0gZXZlbnQtPmh3LmFkZHJfZmlsdGVyczsKIAlzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjc2Rldi0+ZGV2LnBhcmVudCk7CiAKIAlpZiAoV0FSTl9PTl9PTkNFKGRydmRhdGEtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWV0bTRfZGlzYWJsZV9odyhkcnZkYXRhKTsKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIHN0YXJ0L3N0b3AgbG9naWMgd2FzIGFjdGl2ZSB3aGVuIHRoZSB1bml0IHdhcyBzdG9wcGVkLgorCSAqIFRoYXQgd2F5IHdlIGNhbiByZS1lbmFibGUgdGhlIHN0YXJ0L3N0b3AgbG9naWMgd2hlbiB0aGUgcHJvY2VzcyBpcworCSAqIHNjaGVkdWxlZCBhZ2Fpbi4gIENvbmZpZ3VyYXRpb24gb2YgdGhlIHN0YXJ0L3N0b3AgbG9naWMgaGFwcGVucyBpbgorCSAqIGZ1bmN0aW9uIGV0bTRfc2V0X2V2ZW50X2ZpbHRlcnMoKS4KKwkgKi8KKwljb250cm9sID0gcmVhZGxfcmVsYXhlZChkcnZkYXRhLT5iYXNlICsgVFJDVklDVExSKTsKKwkvKiBUUkNWSUNUTFI6OlNTU1RBVFVTLCBiaXRbOV0gKi8KKwlmaWx0ZXJzLT5zc3N0YXR1cyA9IChjb250cm9sICYgQklUKDkpKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0zNjIsNyArMzgyLDggQEAKIAlkZXZfaW5mbyhkcnZkYXRhLT5kZXYsICJFVE0gdHJhY2luZyBkaXNhYmxlZFxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIGV0bTRfZGlzYWJsZShzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYpCitzdGF0aWMgdm9pZCBldG00X2Rpc2FibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAorCQkJIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAl1MzIgbW9kZTsKIAlzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjc2Rldi0+ZGV2LnBhcmVudCk7CkBAIC0zODEsNyArNDAyLDcgQEAKIAkJZXRtNF9kaXNhYmxlX3N5c2ZzKGNzZGV2KTsKIAkJYnJlYWs7CiAJY2FzZSBDU19NT0RFX1BFUkY6Ci0JCWV0bTRfZGlzYWJsZV9wZXJmKGNzZGV2KTsKKwkJZXRtNF9kaXNhYmxlX3BlcmYoY3NkZXYsIGV2ZW50KTsKIAkJYnJlYWs7CiAJfQogCkBAIC01NjQsMjEgKzU4NSw4IEBACiAJQ1NfTE9DSyhkcnZkYXRhLT5iYXNlKTsKIH0KIAotc3RhdGljIHZvaWQgZXRtNF9zZXRfZGVmYXVsdChzdHJ1Y3QgZXRtdjRfY29uZmlnICpjb25maWcpCitzdGF0aWMgdm9pZCBldG00X3NldF9kZWZhdWx0X2NvbmZpZyhzdHJ1Y3QgZXRtdjRfY29uZmlnICpjb25maWcpCiB7Ci0JaWYgKFdBUk5fT05fT05DRSghY29uZmlnKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBNYWtlIGRlZmF1bHQgaW5pdGlhbGlzYXRpb24gdHJhY2UgZXZlcnl0aGluZwotCSAqCi0JICogU2VsZWN0IHRoZSAiYWx3YXlzIHRydWUiIHJlc291cmNlIHNlbGVjdG9yIG9uIHRoZQotCSAqICJFbmFibGlnbiBFdmVudCIgbGluZSBhbmQgY29uZmlndXJlIGFkZHJlc3MgcmFuZ2UgY29tcGFyYXRvcgotCSAqICcwJyB0byB0cmFjZSBhbGwgdGhlIHBvc3NpYmxlIGFkZHJlc3MgcmFuZ2UuICBGcm9tIHRoZXJlCi0JICogY29uZmlndXJlIHRoZSAiaW5jbHVkZS9leGNsdWRlIiBlbmdpbmUgdG8gaW5jbHVkZSBhZGRyZXNzCi0JICogcmFuZ2UgY29tcGFyYXRvciAnMCcuCi0JICovCi0KIAkvKiBkaXNhYmxlIGFsbCBldmVudHMgdHJhY2luZyAqLwogCWNvbmZpZy0+ZXZlbnRjdHJsMCA9IDB4MDsKIAljb25maWctPmV2ZW50Y3RybDEgPSAweDA7CkBAIC01OTQsNiArNjAyLDEwOCBAQAogCiAJLyogVFJDVklDVExSOjpFVkVOVCA9IDB4MDEsIHNlbGVjdCB0aGUgYWx3YXlzIG9uIGxvZ2ljICovCiAJY29uZmlnLT52aW5zdF9jdHJsIHw9IEJJVCgwKTsKK30KKworc3RhdGljIHU2NCBldG00X2dldF9hY2Nlc3NfdHlwZShzdHJ1Y3QgZXRtdjRfY29uZmlnICpjb25maWcpCit7CisJdTY0IGFjY2Vzc190eXBlID0gMDsKKworCS8qCisJICogRVhMRVZFTF9OUywgYml0c1sxNToxMl0KKwkgKiBUaGUgRXhjZXB0aW9uIGxldmVscyBhcmU6CisJICogICBCaXRbMTJdIEV4Y2VwdGlvbiBsZXZlbCAwIC0gQXBwbGljYXRpb24KKwkgKiAgIEJpdFsxM10gRXhjZXB0aW9uIGxldmVsIDEgLSBPUworCSAqICAgQml0WzE0XSBFeGNlcHRpb24gbGV2ZWwgMiAtIEh5cGVydmlzb3IKKwkgKiAgIEJpdFsxNV0gTmV2ZXIgaW1wbGVtZW50ZWQKKwkgKgorCSAqIEFsd2F5cyBzdGF5IGF3YXkgZnJvbSBoeXBlcnZpc29yIG1vZGUuCisJICovCisJYWNjZXNzX3R5cGUgPSBFVE1fRVhMRVZFTF9OU19IWVA7CisKKwlpZiAoY29uZmlnLT5tb2RlICYgRVRNX01PREVfRVhDTF9LRVJOKQorCQlhY2Nlc3NfdHlwZSB8PSBFVE1fRVhMRVZFTF9OU19PUzsKKworCWlmIChjb25maWctPm1vZGUgJiBFVE1fTU9ERV9FWENMX1VTRVIpCisJCWFjY2Vzc190eXBlIHw9IEVUTV9FWExFVkVMX05TX0FQUDsKKworCS8qCisJICogRVhMRVZFTF9TLCBiaXRzWzExOjhdLCBkb24ndCB0cmFjZSBhbnl0aGluZyBoYXBwZW5pbmcKKwkgKiBpbiBzZWN1cmUgc3RhdGUuCisJICovCisJYWNjZXNzX3R5cGUgfD0gKEVUTV9FWExFVkVMX1NfQVBQCXwKKwkJCUVUTV9FWExFVkVMX1NfT1MJfAorCQkJRVRNX0VYTEVWRUxfU19IWVApOworCisJcmV0dXJuIGFjY2Vzc190eXBlOworfQorCitzdGF0aWMgdm9pZCBldG00X3NldF9jb21wYXJhdG9yX2ZpbHRlcihzdHJ1Y3QgZXRtdjRfY29uZmlnICpjb25maWcsCisJCQkJICAgICAgIHU2NCBzdGFydCwgdTY0IHN0b3AsIGludCBjb21wYXJhdG9yKQoreworCXU2NCBhY2Nlc3NfdHlwZSA9IGV0bTRfZ2V0X2FjY2Vzc190eXBlKGNvbmZpZyk7CisKKwkvKiBGaXJzdCBoYWxmIG9mIGRlZmF1bHQgYWRkcmVzcyBjb21wYXJhdG9yICovCisJY29uZmlnLT5hZGRyX3ZhbFtjb21wYXJhdG9yXSA9IHN0YXJ0OworCWNvbmZpZy0+YWRkcl9hY2NbY29tcGFyYXRvcl0gPSBhY2Nlc3NfdHlwZTsKKwljb25maWctPmFkZHJfdHlwZVtjb21wYXJhdG9yXSA9IEVUTV9BRERSX1RZUEVfUkFOR0U7CisKKwkvKiBTZWNvbmQgaGFsZiBvZiBkZWZhdWx0IGFkZHJlc3MgY29tcGFyYXRvciAqLworCWNvbmZpZy0+YWRkcl92YWxbY29tcGFyYXRvciArIDFdID0gc3RvcDsKKwljb25maWctPmFkZHJfYWNjW2NvbXBhcmF0b3IgKyAxXSA9IGFjY2Vzc190eXBlOworCWNvbmZpZy0+YWRkcl90eXBlW2NvbXBhcmF0b3IgKyAxXSA9IEVUTV9BRERSX1RZUEVfUkFOR0U7CisKKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgVmlld0luc3QgZnVuY3Rpb24gdG8gaW5jbHVkZSB0aGlzIGFkZHJlc3MgcmFuZ2UKKwkgKiBjb21wYXJhdG9yLgorCSAqCisJICogQGNvbXBhcmF0b3IgaXMgZGl2aWRlZCBieSB0d28gc2luY2UgaXQgaXMgdGhlIGluZGV4IGluIHRoZQorCSAqIGV0bXY0X2NvbmZpZzo6YWRkcl92YWwgYXJyYXkgYnV0IHJlZ2lzdGVyIFRSQ1ZJSUVDVExSIGRlYWxzIHdpdGgKKwkgKiBhZGRyZXNzIHJhbmdlIGNvbXBhcmF0b3IgX3BhaXJzXy4KKwkgKgorCSAqIFRoZXJlZm9yZToKKwkgKglpbmRleCAwIC0+IGNvbXBhdGF0b3IgcGFpciAwCisJICoJaW5kZXggMiAtPiBjb21wYXJhdG9yIHBhaXIgMQorCSAqCWluZGV4IDQgLT4gY29tcGFyYXRvciBwYWlyIDIKKwkgKgkuLi4KKwkgKglpbmRleCAxNCAtPiBjb21wYXJhdG9yIHBhaXIgNworCSAqLworCWNvbmZpZy0+dmlpZWN0bHIgfD0gQklUKGNvbXBhcmF0b3IgLyAyKTsKK30KKworc3RhdGljIHZvaWQgZXRtNF9zZXRfc3RhcnRfc3RvcF9maWx0ZXIoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnLAorCQkJCSAgICAgICB1NjQgYWRkcmVzcywgaW50IGNvbXBhcmF0b3IsCisJCQkJICAgICAgIGVudW0gZXRtX2FkZHJfdHlwZSB0eXBlKQoreworCWludCBzaGlmdDsKKwl1NjQgYWNjZXNzX3R5cGUgPSBldG00X2dldF9hY2Nlc3NfdHlwZShjb25maWcpOworCisJLyogQ29uZmlndXJlIHRoZSBjb21wYXJhdG9yICovCisJY29uZmlnLT5hZGRyX3ZhbFtjb21wYXJhdG9yXSA9IGFkZHJlc3M7CisJY29uZmlnLT5hZGRyX2FjY1tjb21wYXJhdG9yXSA9IGFjY2Vzc190eXBlOworCWNvbmZpZy0+YWRkcl90eXBlW2NvbXBhcmF0b3JdID0gdHlwZTsKKworCS8qCisJICogQ29uZmlndXJlIFZpZXdJbnN0IFN0YXJ0LVN0b3AgY29udHJvbCByZWdpc3Rlci4KKwkgKiBBZGRyZXNzZXMgY29uZmlndXJlZCB0byBzdGFydCB0cmFjaW5nIGdvIGZyb20gYml0IDAgdG8gbi0xLAorCSAqIHdoaWxlIHRob3NlIGNvbmZpZ3VyZWQgdG8gc3RvcCB0cmFjaW5nIGZyb20gMTYgdG8gMTYgKyBuLTEuCisJICovCisJc2hpZnQgPSAodHlwZSA9PSBFVE1fQUREUl9UWVBFX1NUQVJUID8gMCA6IDE2KTsKKwljb25maWctPnZpc3NjdGxyIHw9IEJJVChzaGlmdCArIGNvbXBhcmF0b3IpOworfQorCitzdGF0aWMgdm9pZCBldG00X3NldF9kZWZhdWx0X2ZpbHRlcihzdHJ1Y3QgZXRtdjRfY29uZmlnICpjb25maWcpCit7CisJdTY0IHN0YXJ0LCBzdG9wOworCisJLyoKKwkgKiBDb25maWd1cmUgYWRkcmVzcyByYW5nZSBjb21wYXJhdG9yICcwJyB0byBlbmNvbXBhc3MgYWxsCisJICogcG9zc2libGUgYWRkcmVzc2VzLgorCSAqLworCXN0YXJ0ID0gMHgwOworCXN0b3AgPSB+MHgwOworCisJZXRtNF9zZXRfY29tcGFyYXRvcl9maWx0ZXIoY29uZmlnLCBzdGFydCwgc3RvcCwKKwkJCQkgICBFVE1fREVGQVVMVF9BRERSX0NPTVApOwogCiAJLyoKIAkgKiBUUkNWSUNUTFI6OlNTU1RBVFVTID09IDEsIHRoZSBzdGFydC1zdG9wIGxvZ2ljIGlzCkBAIC02MDEsNDUgKzcxMSwxNTggQEAKIAkgKi8KIAljb25maWctPnZpbnN0X2N0cmwgfD0gQklUKDkpOwogCi0JLyoKLQkgKiBDb25maWd1cmUgYWRkcmVzcyByYW5nZSBjb21wYXJhdG9yICcwJyB0byBlbmNvbXBhc3MgYWxsCi0JICogcG9zc2libGUgYWRkcmVzc2VzLgotCSAqLwotCi0JLyogRmlyc3QgaGFsZiBvZiBkZWZhdWx0IGFkZHJlc3MgY29tcGFyYXRvcjogc3RhcnQgYXQgYWRkcmVzcyAwICovCi0JY29uZmlnLT5hZGRyX3ZhbFtFVE1fREVGQVVMVF9BRERSX0NPTVBdID0gMHgwOwotCS8qIHRyYWNlIGluc3RydWN0aW9uIGFkZHJlc3NlcyAqLwotCWNvbmZpZy0+YWRkcl9hY2NbRVRNX0RFRkFVTFRfQUREUl9DT01QXSAmPSB+KEJJVCgwKSB8IEJJVCgxKSk7Ci0JLyogRVhMRVZFTF9OUywgYml0c1sxMjoxNV0sIG9ubHkgdHJhY2UgYXBwbGljYXRpb24gYW5kIGtlcm5lbCBzcGFjZSAqLwotCWNvbmZpZy0+YWRkcl9hY2NbRVRNX0RFRkFVTFRfQUREUl9DT01QXSB8PSBFVE1fRVhMRVZFTF9OU19IWVA7Ci0JLyogRVhMRVZFTF9TLCBiaXRzWzExOjhdLCBkb24ndCB0cmFjZSBhbnl0aGluZyBpbiBzZWN1cmUgc3RhdGUgKi8KLQljb25maWctPmFkZHJfYWNjW0VUTV9ERUZBVUxUX0FERFJfQ09NUF0gfD0gKEVUTV9FWExFVkVMX1NfQVBQIHwKLQkJCQkJCSAgICBFVE1fRVhMRVZFTF9TX09TIHwKLQkJCQkJCSAgICBFVE1fRVhMRVZFTF9TX0hZUCk7Ci0JY29uZmlnLT5hZGRyX3R5cGVbRVRNX0RFRkFVTFRfQUREUl9DT01QXSA9IEVUTV9BRERSX1RZUEVfUkFOR0U7Ci0KLQkvKgotCSAqIFNlY29uZCBoYWxmIG9mIGRlZmF1bHQgYWRkcmVzcyBjb21wYXJhdG9yOiBnbyBhbGwKLQkgKiB0aGUgd2F5IHRvIHRoZSB0b3AuCi0JKi8KLQljb25maWctPmFkZHJfdmFsW0VUTV9ERUZBVUxUX0FERFJfQ09NUCArIDFdID0gfjB4MDsKLQkvKiB0cmFjZSBpbnN0cnVjdGlvbiBhZGRyZXNzZXMgKi8KLQljb25maWctPmFkZHJfYWNjW0VUTV9ERUZBVUxUX0FERFJfQ09NUCArIDFdICY9IH4oQklUKDApIHwgQklUKDEpKTsKLQkvKiBBZGRyZXNzIGNvbXBhcmF0b3IgdHlwZSBtdXN0IGJlIGVxdWFsIGZvciBib3RoIGhhbHZlcyAqLwotCWNvbmZpZy0+YWRkcl9hY2NbRVRNX0RFRkFVTFRfQUREUl9DT01QICsgMV0gPQotCQkJCQljb25maWctPmFkZHJfYWNjW0VUTV9ERUZBVUxUX0FERFJfQ09NUF07Ci0JY29uZmlnLT5hZGRyX3R5cGVbRVRNX0RFRkFVTFRfQUREUl9DT01QICsgMV0gPSBFVE1fQUREUl9UWVBFX1JBTkdFOwotCi0JLyoKLQkgKiBDb25maWd1cmUgdGhlIFZpZXdJbnN0IGZ1bmN0aW9uIHRvIGZpbHRlciBvbiBhZGRyZXNzIHJhbmdlCi0JICogY29tcGFyYXRvciAnMCcuCi0JICovCi0JY29uZmlnLT52aWllY3RsciA9IEJJVCgwKTsKLQotCS8qIG5vIHN0YXJ0LXN0b3AgZmlsdGVyaW5nIGZvciBWaWV3SW5zdCAqLworCS8qIE5vIHN0YXJ0LXN0b3AgZmlsdGVyaW5nIGZvciBWaWV3SW5zdCAqLwogCWNvbmZpZy0+dmlzc2N0bHIgPSAweDA7CiB9CiAKK3N0YXRpYyB2b2lkIGV0bTRfc2V0X2RlZmF1bHQoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKQoreworCWlmIChXQVJOX09OX09OQ0UoIWNvbmZpZykpCisJCXJldHVybjsKKworCS8qCisJICogTWFrZSBkZWZhdWx0IGluaXRpYWxpc2F0aW9uIHRyYWNlIGV2ZXJ5dGhpbmcKKwkgKgorCSAqIFNlbGVjdCB0aGUgImFsd2F5cyB0cnVlIiByZXNvdXJjZSBzZWxlY3RvciBvbiB0aGUKKwkgKiAiRW5hYmxpZ24gRXZlbnQiIGxpbmUgYW5kIGNvbmZpZ3VyZSBhZGRyZXNzIHJhbmdlIGNvbXBhcmF0b3IKKwkgKiAnMCcgdG8gdHJhY2UgYWxsIHRoZSBwb3NzaWJsZSBhZGRyZXNzIHJhbmdlLiAgRnJvbSB0aGVyZQorCSAqIGNvbmZpZ3VyZSB0aGUgImluY2x1ZGUvZXhjbHVkZSIgZW5naW5lIHRvIGluY2x1ZGUgYWRkcmVzcworCSAqIHJhbmdlIGNvbXBhcmF0b3IgJzAnLgorCSAqLworCWV0bTRfc2V0X2RlZmF1bHRfY29uZmlnKGNvbmZpZyk7CisJZXRtNF9zZXRfZGVmYXVsdF9maWx0ZXIoY29uZmlnKTsKK30KKworc3RhdGljIGludCBldG00X2dldF9uZXh0X2NvbXBhcmF0b3Ioc3RydWN0IGV0bXY0X2RydmRhdGEgKmRydmRhdGEsIHUzMiB0eXBlKQoreworCWludCBucl9jb21wYXJhdG9yLCBpbmRleCA9IDA7CisJc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnID0gJmRydmRhdGEtPmNvbmZpZzsKKworCS8qCisJICogbnJfYWRkcl9jbXAgaG9sZHMgdGhlIG51bWJlciBvZiBjb21wYXJhdG9yIF9wYWlyXywgc28gdGltZSAyCisJICogZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgY29tcGFyYXRvcnMuCisJICovCisJbnJfY29tcGFyYXRvciA9IGRydmRhdGEtPm5yX2FkZHJfY21wICogMjsKKworCS8qIEdvIHRocm91Z2ggdGhlIHRhbGx5IG9mIGNvbXBhcmF0b3JzIGxvb2tpbmcgZm9yIGEgZnJlZSBvbmUuICovCisJd2hpbGUgKGluZGV4IDwgbnJfY29tcGFyYXRvcikgeworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBFVE1fQUREUl9UWVBFX1JBTkdFOgorCQkJaWYgKGNvbmZpZy0+YWRkcl90eXBlW2luZGV4XSA9PSBFVE1fQUREUl9UWVBFX05PTkUgJiYKKwkJCSAgICBjb25maWctPmFkZHJfdHlwZVtpbmRleCArIDFdID09IEVUTV9BRERSX1RZUEVfTk9ORSkKKwkJCQlyZXR1cm4gaW5kZXg7CisKKwkJCS8qIEFkZHJlc3MgcmFuZ2UgY29tcGFyYXRvcnMgZ28gaW4gcGFpcnMgKi8KKwkJCWluZGV4ICs9IDI7CisJCQlicmVhazsKKwkJY2FzZSBFVE1fQUREUl9UWVBFX1NUQVJUOgorCQljYXNlIEVUTV9BRERSX1RZUEVfU1RPUDoKKwkJCWlmIChjb25maWctPmFkZHJfdHlwZVtpbmRleF0gPT0gRVRNX0FERFJfVFlQRV9OT05FKQorCQkJCXJldHVybiBpbmRleDsKKworCQkJLyogU3RhcnQvc3RvcCBhZGRyZXNzIGNhbiBoYXZlIG9kZCBpbmRleGVzICovCisJCQlpbmRleCArPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIElmIHdlIGFyZSBoZXJlIGFsbCB0aGUgY29tcGFyYXRvcnMgaGF2ZSBiZWVuIHVzZWQuICovCisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3N0YXRpYyBpbnQgZXRtNF9zZXRfZXZlbnRfZmlsdGVycyhzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSAqZHJ2ZGF0YSwKKwkJCQkgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlpbnQgaSwgY29tcGFyYXRvciwgcmV0ID0gMDsKKwl1NjQgYWRkcmVzczsKKwlzdHJ1Y3QgZXRtdjRfY29uZmlnICpjb25maWcgPSAmZHJ2ZGF0YS0+Y29uZmlnOworCXN0cnVjdCBldG1fZmlsdGVycyAqZmlsdGVycyA9IGV2ZW50LT5ody5hZGRyX2ZpbHRlcnM7CisKKwlpZiAoIWZpbHRlcnMpCisJCWdvdG8gZGVmYXVsdF9maWx0ZXI7CisKKwkvKiBTeW5jIGV2ZW50cyB3aXRoIHdoYXQgUGVyZiBnb3QgKi8KKwlwZXJmX2V2ZW50X2FkZHJfZmlsdGVyc19zeW5jKGV2ZW50KTsKKworCS8qCisJICogSWYgdGhlcmUgYXJlIG5vIGZpbHRlcnMgdG8gZGVhbCB3aXRoIHNpbXBseSBnbyBhaGVhZCB3aXRoCisJICogdGhlIGRlZmF1bHQgZmlsdGVyLCBpLmUgdGhlIGVudGlyZSBhZGRyZXNzIHJhbmdlLgorCSAqLworCWlmICghZmlsdGVycy0+bnJfZmlsdGVycykKKwkJZ290byBkZWZhdWx0X2ZpbHRlcjsKKworCWZvciAoaSA9IDA7IGkgPCBmaWx0ZXJzLT5ucl9maWx0ZXJzOyBpKyspIHsKKwkJc3RydWN0IGV0bV9maWx0ZXIgKmZpbHRlciA9ICZmaWx0ZXJzLT5ldG1fZmlsdGVyW2ldOworCQllbnVtIGV0bV9hZGRyX3R5cGUgdHlwZSA9IGZpbHRlci0+dHlwZTsKKworCQkvKiBTZWUgaWYgYSBjb21wYXJhdG9yIGlzIGZyZWUuICovCisJCWNvbXBhcmF0b3IgPSBldG00X2dldF9uZXh0X2NvbXBhcmF0b3IoZHJ2ZGF0YSwgdHlwZSk7CisJCWlmIChjb21wYXJhdG9yIDwgMCkgeworCQkJcmV0ID0gY29tcGFyYXRvcjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgRVRNX0FERFJfVFlQRV9SQU5HRToKKwkJCWV0bTRfc2V0X2NvbXBhcmF0b3JfZmlsdGVyKGNvbmZpZywKKwkJCQkJCSAgIGZpbHRlci0+c3RhcnRfYWRkciwKKwkJCQkJCSAgIGZpbHRlci0+c3RvcF9hZGRyLAorCQkJCQkJICAgY29tcGFyYXRvcik7CisJCQkvKgorCQkJICogVFJDVklDVExSOjpTU1NUQVRVUyA9PSAxLCB0aGUgc3RhcnQtc3RvcCBsb2dpYyBpcworCQkJICogaW4gdGhlIHN0YXJ0ZWQgc3RhdGUKKwkJCSAqLworCQkJY29uZmlnLT52aW5zdF9jdHJsIHw9IEJJVCg5KTsKKworCQkJLyogTm8gc3RhcnQtc3RvcCBmaWx0ZXJpbmcgZm9yIFZpZXdJbnN0ICovCisJCQljb25maWctPnZpc3NjdGxyID0gMHgwOworCQkJYnJlYWs7CisJCWNhc2UgRVRNX0FERFJfVFlQRV9TVEFSVDoKKwkJY2FzZSBFVE1fQUREUl9UWVBFX1NUT1A6CisJCQkvKiBHZXQgdGhlIHJpZ2h0IHN0YXJ0IG9yIHN0b3AgYWRkcmVzcyAqLworCQkJYWRkcmVzcyA9ICh0eXBlID09IEVUTV9BRERSX1RZUEVfU1RBUlQgPworCQkJCSAgIGZpbHRlci0+c3RhcnRfYWRkciA6CisJCQkJICAgZmlsdGVyLT5zdG9wX2FkZHIpOworCisJCQkvKiBDb25maWd1cmUgY29tcGFyYXRvciAqLworCQkJZXRtNF9zZXRfc3RhcnRfc3RvcF9maWx0ZXIoY29uZmlnLCBhZGRyZXNzLAorCQkJCQkJICAgY29tcGFyYXRvciwgdHlwZSk7CisKKwkJCS8qCisJCQkgKiBJZiBmaWx0ZXJzOjpzc3N0YXR1cyA9PSAxLCB0cmFjZSBhY3F1aXNpdGlvbiB3YXMKKwkJCSAqIHN0YXJ0ZWQgYnV0IHRoZSBwcm9jZXNzIHdhcyB5YW5rZWQgYXdheSBiZWZvcmUgdGhlCisJCQkgKiB0aGUgc3RvcCBhZGRyZXNzIHdhcyBoaXQuICBBcyBzdWNoIHRoZSBzdGFydC9zdG9wCisJCQkgKiBsb2dpYyBuZWVkcyB0byBiZSByZS1zdGFydGVkIHNvIHRoYXQgdHJhY2luZyBjYW4KKwkJCSAqIHJlc3VtZSB3aGVyZSBpdCBsZWZ0LgorCQkJICoKKwkJCSAqIFRoZSBzdGFydC9zdG9wIGxvZ2ljIHN0YXR1cyB3aGVuIGEgcHJvY2VzcyBpcworCQkJICogc2NoZWR1bGVkIG91dCBpcyBjaGVja2VkIGluIGZ1bmN0aW9uCisJCQkgKiBldG00X2Rpc2FibGVfcGVyZigpLgorCQkJICovCisJCQlpZiAoZmlsdGVycy0+c3NzdGF0dXMpCisJCQkJY29uZmlnLT52aW5zdF9jdHJsIHw9IEJJVCg5KTsKKworCQkJLyogTm8gaW5jbHVkZS9leGNsdWRlIGZpbHRlcmluZyBmb3IgVmlld0luc3QgKi8KKwkJCWNvbmZpZy0+dmlpZWN0bHIgPSAweDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWdvdG8gb3V0OworCisKK2RlZmF1bHRfZmlsdGVyOgorCWV0bTRfc2V0X2RlZmF1bHRfZmlsdGVyKGNvbmZpZyk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCiB2b2lkIGV0bTRfY29uZmlnX3RyYWNlX21vZGUoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKQogewogCXUzMiBhZGRyX2FjYywgbW9kZTsKQEAgLTcyNywxMyArOTUwLDkgQEAKIAlzdHJ1Y3QgY29yZXNpZ2h0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gTlVMTDsKIAlzdHJ1Y3QgZXRtdjRfZHJ2ZGF0YSAqZHJ2ZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZhZGV2LT5yZXM7Ci0Jc3RydWN0IGNvcmVzaWdodF9kZXNjICpkZXNjOworCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyBkZXNjID0geyAwIH07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGFkZXYtPmRldi5vZl9ub2RlOwogCi0JZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghZGVzYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlkcnZkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkcnZkYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkcnZkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTc4OCwxMyArMTAwNywxMyBAQAogCWV0bTRfaW5pdF90cmFjZV9pZChkcnZkYXRhKTsKIAlldG00X3NldF9kZWZhdWx0KCZkcnZkYXRhLT5jb25maWcpOwogCi0JZGVzYy0+dHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TT1VSQ0U7Ci0JZGVzYy0+c3VidHlwZS5zb3VyY2Vfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TT1VSQ0VfUFJPQzsKLQlkZXNjLT5vcHMgPSAmZXRtNF9jc19vcHM7Ci0JZGVzYy0+cGRhdGEgPSBwZGF0YTsKLQlkZXNjLT5kZXYgPSBkZXY7Ci0JZGVzYy0+Z3JvdXBzID0gY29yZXNpZ2h0X2V0bXY0X2dyb3VwczsKLQlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcihkZXNjKTsKKwlkZXNjLnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU09VUkNFOworCWRlc2Muc3VidHlwZS5zb3VyY2Vfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TT1VSQ0VfUFJPQzsKKwlkZXNjLm9wcyA9ICZldG00X2NzX29wczsKKwlkZXNjLnBkYXRhID0gcGRhdGE7CisJZGVzYy5kZXYgPSBkZXY7CisJZGVzYy5ncm91cHMgPSBjb3Jlc2lnaHRfZXRtdjRfZ3JvdXBzOworCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKCZkZXNjKTsKIAlpZiAoSVNfRVJSKGRydmRhdGEtPmNzZGV2KSkgewogCQlyZXQgPSBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKIAkJZ290byBlcnJfYXJjaF9zdXBwb3J0ZWQ7CkBAIC04MjYsMTIgKzEwNDUsMTIgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBhbWJhX2lkIGV0bTRfaWRzW10gPSB7Ci0JeyAgICAgICAvKiBFVE0gNC4wIC0gUXVhbGNvbW0gKi8KLQkJLmlkCT0gMHgwMDAzYjk1ZCwKLQkJLm1hc2sJPSAweDAwMDNmZmZmLAorCXsgICAgICAgLyogRVRNIDQuMCAtIENvcnRleC1BNTMgICovCisJCS5pZAk9IDB4MDAwYmI5NWQsCisJCS5tYXNrCT0gMHgwMDBmZmZmZiwKIAkJLmRhdGEJPSAiRVRNIDQuMCIsCiAJfSwKLQl7ICAgICAgIC8qIEVUTSA0LjAgLSBKdW5vIGJvYXJkICovCisJeyAgICAgICAvKiBFVE0gNC4wIC0gQ29ydGV4LUE1NyAqLwogCQkuaWQJPSAweDAwMGJiOTVlLAogCQkubWFzawk9IDB4MDAwZmZmZmYsCiAJCS5kYXRhCT0gIkVUTSA0LjAiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC5oIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1ldG00eC5oCmluZGV4IDUzNTljNTEuLmJhOGQzZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZXRtNHguaAorKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWV0bTR4LmgKQEAgLTE4Myw2ICsxODMsOSBAQAogI2RlZmluZSBUUkNTVEFUUl9JRExFX0JJVAkJMAogI2RlZmluZSBFVE1fREVGQVVMVF9BRERSX0NPTVAJCTAKIAorLyogUG93ZXJEb3duIENvbnRyb2wgUmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBUUkNQRENSX1BVCQkJQklUKDMpCisKIC8qIHNlY3VyZSBzdGF0ZSBhY2Nlc3MgbGV2ZWxzICovCiAjZGVmaW5lIEVUTV9FWExFVkVMX1NfQVBQCQlCSVQoOCkKICNkZWZpbmUgRVRNX0VYTEVWRUxfU19PUwkJQklUKDkpCkBAIC00MDcsMTQgKzQxMCw2IEBACiAJRVRNX0NUWF9DVFhJRF9WTUlELAogfTsKIAotZW51bSBldG1fYWRkcl90eXBlIHsKLQlFVE1fQUREUl9UWVBFX05PTkUsCi0JRVRNX0FERFJfVFlQRV9TSU5HTEUsCi0JRVRNX0FERFJfVFlQRV9SQU5HRSwKLQlFVE1fQUREUl9UWVBFX1NUQVJULAotCUVUTV9BRERSX1RZUEVfU1RPUCwKLX07Ci0KIGV4dGVybiBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpjb3Jlc2lnaHRfZXRtdjRfZ3JvdXBzW107CiB2b2lkIGV0bTRfY29uZmlnX3RyYWNlX21vZGUoc3RydWN0IGV0bXY0X2NvbmZpZyAqY29uZmlnKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1mdW5uZWwuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtZnVubmVsLmMKaW5kZXggMDVkZjc4OS4uODYwZmU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1mdW5uZWwuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LWZ1bm5lbC5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAlzdHJ1Y3QgY29yZXNpZ2h0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gTlVMTDsKIAlzdHJ1Y3QgZnVubmVsX2RydmRhdGEgKmRydmRhdGE7CiAJc3RydWN0IHJlc291cmNlICpyZXMgPSAmYWRldi0+cmVzOwotCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgZGVzYyA9IHsgMCB9OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBhZGV2LT5kZXYub2Zfbm9kZTsKIAogCWlmIChucCkgewpAQCAtMjA3LDE3ICsyMDcsMTMgQEAKIAlkcnZkYXRhLT5iYXNlID0gYmFzZTsKIAlwbV9ydW50aW1lX3B1dCgmYWRldi0+ZGV2KTsKIAotCWRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGVzYy0+dHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9MSU5LOwotCWRlc2MtPnN1YnR5cGUubGlua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX0xJTktfTUVSRzsKLQlkZXNjLT5vcHMgPSAmZnVubmVsX2NzX29wczsKLQlkZXNjLT5wZGF0YSA9IHBkYXRhOwotCWRlc2MtPmRldiA9IGRldjsKLQlkZXNjLT5ncm91cHMgPSBjb3Jlc2lnaHRfZnVubmVsX2dyb3VwczsKLQlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcihkZXNjKTsKKwlkZXNjLnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOSzsKKwlkZXNjLnN1YnR5cGUubGlua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX0xJTktfTUVSRzsKKwlkZXNjLm9wcyA9ICZmdW5uZWxfY3Nfb3BzOworCWRlc2MucGRhdGEgPSBwZGF0YTsKKwlkZXNjLmRldiA9IGRldjsKKwlkZXNjLmdyb3VwcyA9IGNvcmVzaWdodF9mdW5uZWxfZ3JvdXBzOworCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKCZkZXNjKTsKIAlpZiAoSVNfRVJSKGRydmRhdGEtPmNzZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoZHJ2ZGF0YS0+Y3NkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXByaXYuaCBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtcHJpdi5oCmluZGV4IGFkOTc1YzUuLjE5NmExNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtcHJpdi5oCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtcHJpdi5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9jb3Jlc2lnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKIC8qCiAgKiBDb3Jlc2lnaHQgbWFuYWdlbWVudCByZWdpc3RlcnMgKDB4ZjAwLTB4ZmNjKQpAQCAtMzcsMTYgKzM4LDMyIEBACiAjZGVmaW5lIEVUTV9NT0RFX0VYQ0xfS0VSTglCSVQoMzApCiAjZGVmaW5lIEVUTV9NT0RFX0VYQ0xfVVNFUglCSVQoMzEpCiAKLSNkZWZpbmUgY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHR5cGUsIG5hbWUsIG9mZnNldCkJCQlcCit0eXBlZGVmIHUzMiAoKmNvcmVzaWdodF9yZWFkX2ZuKShjb25zdCBzdHJ1Y3QgZGV2aWNlICosIHUzMiBvZmZzZXQpOworI2RlZmluZSBjb3Jlc2lnaHRfc2ltcGxlX2Z1bmModHlwZSwgZnVuYywgbmFtZSwgb2Zmc2V0KQkJCVwKIHN0YXRpYyBzc2l6ZV90IG5hbWUjI19zaG93KHN0cnVjdCBkZXZpY2UgKl9kZXYsCQkJCVwKIAkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKIHsJCQkJCQkJCQlcCiAJdHlwZSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShfZGV2LT5wYXJlbnQpOwkJCVwKLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiMHgleFxuIiwJCQlcCi0JCQkgcmVhZGxfcmVsYXhlZChkcnZkYXRhLT5iYXNlICsgb2Zmc2V0KSk7CVwKKwljb3Jlc2lnaHRfcmVhZF9mbiBmbiA9IGZ1bmM7CQkJCQlcCisJdTMyIHZhbDsJCQkJCQkJXAorCXBtX3J1bnRpbWVfZ2V0X3N5bmMoX2Rldi0+cGFyZW50KTsJCQkJXAorCWlmIChmbikJCQkJCQkJCVwKKwkJdmFsID0gZm4oX2Rldi0+cGFyZW50LCBvZmZzZXQpOwkJCQlcCisJZWxzZQkJCQkJCQkJXAorCQl2YWwgPSByZWFkbF9yZWxheGVkKGRydmRhdGEtPmJhc2UgKyBvZmZzZXQpOwkJXAorCXBtX3J1bnRpbWVfcHV0X3N5bmMoX2Rldi0+cGFyZW50KTsJCQkJXAorCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIweCV4XG4iLCB2YWwpOwkJXAogfQkJCQkJCQkJCVwKIHN0YXRpYyBERVZJQ0VfQVRUUl9STyhuYW1lKQogCitlbnVtIGV0bV9hZGRyX3R5cGUgeworCUVUTV9BRERSX1RZUEVfTk9ORSwKKwlFVE1fQUREUl9UWVBFX1NJTkdMRSwKKwlFVE1fQUREUl9UWVBFX1JBTkdFLAorCUVUTV9BRERSX1RZUEVfU1RBUlQsCisJRVRNX0FERFJfVFlQRV9TVE9QLAorfTsKKwogZW51bSBjc19tb2RlIHsKIAlDU19NT0RFX0RJU0FCTEVELAogCUNTX01PREVfU1lTRlMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXJlcGxpY2F0b3ItcWNvbS5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1yZXBsaWNhdG9yLXFjb20uYwppbmRleCA3MDBmNzEwLi4wYTNkMTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXJlcGxpY2F0b3ItcWNvbS5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtcmVwbGljYXRvci1xY29tLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmFkZXYtPnJlczsKIAlzdHJ1Y3QgY29yZXNpZ2h0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gTlVMTDsKIAlzdHJ1Y3QgcmVwbGljYXRvcl9zdGF0ZSAqZHJ2ZGF0YTsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWRldi0+ZGV2Lm9mX25vZGU7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCkBAIC0xMzQsMTYgKzEzNCwxMiBAQAogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGRydmRhdGEpOwogCXBtX3J1bnRpbWVfcHV0KCZhZGV2LT5kZXYpOwogCi0JZGVzYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGVzYyksIEdGUF9LRVJORUwpOwotCWlmICghZGVzYykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkZXNjLT50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX0xJTks7Ci0JZGVzYy0+c3VidHlwZS5saW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfTElOS19TUExJVDsKLQlkZXNjLT5vcHMgPSAmcmVwbGljYXRvcl9jc19vcHM7Ci0JZGVzYy0+cGRhdGEgPSBhZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlkZXNjLT5kZXYgPSAmYWRldi0+ZGV2OwotCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKGRlc2MpOworCWRlc2MudHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9MSU5LOworCWRlc2Muc3VidHlwZS5saW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfTElOS19TUExJVDsKKwlkZXNjLm9wcyA9ICZyZXBsaWNhdG9yX2NzX29wczsKKwlkZXNjLnBkYXRhID0gYWRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJZGVzYy5kZXYgPSAmYWRldi0+ZGV2OworCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKCZkZXNjKTsKIAlpZiAoSVNfRVJSKGRydmRhdGEtPmNzZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoZHJ2ZGF0YS0+Y3NkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXJlcGxpY2F0b3IuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtcmVwbGljYXRvci5jCmluZGV4IGM2OTgyZTMuLjM3NTZlNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtcmVwbGljYXRvci5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtcmVwbGljYXRvci5jCkBAIC02OSw3ICs2OSw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlzdHJ1Y3QgY29yZXNpZ2h0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gTlVMTDsKIAlzdHJ1Y3QgcmVwbGljYXRvcl9kcnZkYXRhICpkcnZkYXRhOwotCXN0cnVjdCBjb3Jlc2lnaHRfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgZGVzYyA9IHsgMCB9OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAogCWlmIChucCkgewpAQCAtOTUsMTggKzk1LDEyIEBACiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZHJ2ZGF0YSk7CiAKLQlkZXNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2Rpc2FibGVfcG07Ci0JfQotCi0JZGVzYy0+dHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9MSU5LOwotCWRlc2MtPnN1YnR5cGUubGlua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX0xJTktfU1BMSVQ7Ci0JZGVzYy0+b3BzID0gJnJlcGxpY2F0b3JfY3Nfb3BzOwotCWRlc2MtPnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JZGVzYy0+ZGV2ID0gJnBkZXYtPmRldjsKLQlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcihkZXNjKTsKKwlkZXNjLnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfTElOSzsKKwlkZXNjLnN1YnR5cGUubGlua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX0xJTktfU1BMSVQ7CisJZGVzYy5vcHMgPSAmcmVwbGljYXRvcl9jc19vcHM7CisJZGVzYy5wZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWRlc2MuZGV2ID0gJnBkZXYtPmRldjsKKwlkcnZkYXRhLT5jc2RldiA9IGNvcmVzaWdodF9yZWdpc3RlcigmZGVzYyk7CiAJaWYgKElTX0VSUihkcnZkYXRhLT5jc2RldikpIHsKIAkJcmV0ID0gUFRSX0VSUihkcnZkYXRhLT5jc2Rldik7CiAJCWdvdG8gb3V0X2Rpc2FibGVfcG07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXN0bS5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC1zdG0uYwppbmRleCA3M2JlNThhLi40OWUwZjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXN0bS5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtc3RtLmMKQEAgLTEwNSwxMCArMTA1LDEyIEBACiAvKioKICAqIHN0cnVjdCBjaGFubmVsX3NwYWNlIC0gY2VudHJhbCBtYW5hZ2VtZW50IGVudGl0eSBmb3IgZXh0ZW5kZWQgcG9ydHMKICAqIEBiYXNlOgkJbWVtb3J5IG1hcHBlZCBiYXNlIGFkZHJlc3Mgd2hlcmUgY2hhbm5lbHMgc3RhcnQuCisgKiBAcGh5czoJCXBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiBjaGFubmVsIHJlZ2lvbi4KICAqIEBndWFyYW5lZWQ6CQlpcyB0aGUgY2hhbm5lbCBkZWxpdmVyeSBndWFyYW50ZWVkLgogICovCiBzdHJ1Y3QgY2hhbm5lbF9zcGFjZSB7CiAJdm9pZCBfX2lvbWVtCQkqYmFzZTsKKwlwaHlzX2FkZHJfdAkJcGh5czsKIAl1bnNpZ25lZCBsb25nCQkqZ3VhcmFudGVlZDsKIH07CiAKQEAgLTE5Niw3ICsxOTgsNyBAQAogfQogCiBzdGF0aWMgaW50IHN0bV9lbmFibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAotCQkgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCB1MzIgbW9kZSkKKwkJICAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1MzIgbW9kZSkKIHsKIAl1MzIgdmFsOwogCXN0cnVjdCBzdG1fZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjc2Rldi0+ZGV2LnBhcmVudCk7CkBAIC0yNTgsNyArMjYwLDggQEAKIAkJc3RtX2h3ZXZlbnRfZGlzYWJsZV9odyhkcnZkYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgc3RtX2Rpc2FibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2KQorc3RhdGljIHZvaWQgc3RtX2Rpc2FibGUoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAorCQkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBzdG1fZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShjc2Rldi0+ZGV2LnBhcmVudCk7CiAKQEAgLTM1Myw3ICszNTYsMjQgQEAKIAlpZiAoIWRydmRhdGEgfHwgIWRydmRhdGEtPmNzZGV2KQogCQlyZXR1cm47CiAKLQlzdG1fZGlzYWJsZShkcnZkYXRhLT5jc2Rldik7CisJc3RtX2Rpc2FibGUoZHJ2ZGF0YS0+Y3NkZXYsIE5VTEwpOworfQorCitzdGF0aWMgcGh5c19hZGRyX3QKK3N0bV9tbWlvX2FkZHIoc3RydWN0IHN0bV9kYXRhICpzdG1fZGF0YSwgdW5zaWduZWQgaW50IG1hc3RlciwKKwkgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IG5yX2NoYW5zKQoreworCXN0cnVjdCBzdG1fZHJ2ZGF0YSAqZHJ2ZGF0YSA9IGNvbnRhaW5lcl9vZihzdG1fZGF0YSwKKwkJCQkJCSAgIHN0cnVjdCBzdG1fZHJ2ZGF0YSwgc3RtKTsKKwlwaHlzX2FkZHJfdCBhZGRyOworCisJYWRkciA9IGRydmRhdGEtPmNocy5waHlzICsgY2hhbm5lbCAqIEJZVEVTX1BFUl9DSEFOTkVMOworCisJaWYgKG9mZnNldF9pbl9wYWdlKGFkZHIpIHx8CisJICAgIG9mZnNldF9pbl9wYWdlKG5yX2NoYW5zICogQllURVNfUEVSX0NIQU5ORUwpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBhZGRyOwogfQogCiBzdGF0aWMgbG9uZyBzdG1fZ2VuZXJpY19zZXRfb3B0aW9ucyhzdHJ1Y3Qgc3RtX2RhdGEgKnN0bV9kYXRhLApAQCAtNjE2LDcgKzYzNiw3IEBACiBzdGF0aWMgREVWSUNFX0FUVFJfUlcodHJhY2VpZCk7CiAKICNkZWZpbmUgY29yZXNpZ2h0X3N0bV9zaW1wbGVfZnVuYyhuYW1lLCBvZmZzZXQpCVwKLQljb3Jlc2lnaHRfc2ltcGxlX2Z1bmMoc3RydWN0IHN0bV9kcnZkYXRhLCBuYW1lLCBvZmZzZXQpCisJY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCBzdG1fZHJ2ZGF0YSwgTlVMTCwgbmFtZSwgb2Zmc2V0KQogCiBjb3Jlc2lnaHRfc3RtX3NpbXBsZV9mdW5jKHRjc3IsIFNUTVRDU1IpOwogY29yZXNpZ2h0X3N0bV9zaW1wbGVfZnVuYyh0c2ZyZXFyLCBTVE1UU0ZSRVFSKTsKQEAgLTc2MSw3ICs3ODEsOSBAQAogCWRydmRhdGEtPnN0bS5zd19lbmQgPSAxOwogCWRydmRhdGEtPnN0bS5od19vdmVycmlkZSA9IHRydWU7CiAJZHJ2ZGF0YS0+c3RtLnN3X25jaGFubmVscyA9IGRydmRhdGEtPm51bXNwOworCWRydmRhdGEtPnN0bS5zd19tbWlvc3ogPSBCWVRFU19QRVJfQ0hBTk5FTDsKIAlkcnZkYXRhLT5zdG0ucGFja2V0ID0gc3RtX2dlbmVyaWNfcGFja2V0OworCWRydmRhdGEtPnN0bS5tbWlvX2FkZHIgPSBzdG1fbW1pb19hZGRyOwogCWRydmRhdGEtPnN0bS5saW5rID0gc3RtX2dlbmVyaWNfbGluazsKIAlkcnZkYXRhLT5zdG0udW5saW5rID0gc3RtX2dlbmVyaWNfdW5saW5rOwogCWRydmRhdGEtPnN0bS5zZXRfb3B0aW9ucyA9IHN0bV9nZW5lcmljX3NldF9vcHRpb25zOwpAQCAtNzc4LDcgKzgwMCw3IEBACiAJc3RydWN0IHJlc291cmNlICpyZXMgPSAmYWRldi0+cmVzOwogCXN0cnVjdCByZXNvdXJjZSBjaF9yZXM7CiAJc2l6ZV90IHJlc19zaXplLCBiaXRtYXBfc2l6ZTsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWRldi0+ZGV2Lm9mX25vZGU7CiAKIAlpZiAobnApIHsKQEAgLTgwOCw2ICs4MzAsNyBAQAogCXJldCA9IHN0bV9nZXRfcmVzb3VyY2VfYnluYW1lKG5wLCAic3RtLXN0aW11bHVzLWJhc2UiLCAmY2hfcmVzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OworCWRydmRhdGEtPmNocy5waHlzID0gY2hfcmVzLnN0YXJ0OwogCiAJYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsICZjaF9yZXMpOwogCWlmIChJU19FUlIoYmFzZSkpCkBAIC04NDMsMTkgKzg2NiwxMyBAQAogCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKIAl9CiAKLQlkZXNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gc3RtX3VucmVnaXN0ZXI7Ci0JfQotCi0JZGVzYy0+dHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TT1VSQ0U7Ci0JZGVzYy0+c3VidHlwZS5zb3VyY2Vfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TT1VSQ0VfU09GVFdBUkU7Ci0JZGVzYy0+b3BzID0gJnN0bV9jc19vcHM7Ci0JZGVzYy0+cGRhdGEgPSBwZGF0YTsKLQlkZXNjLT5kZXYgPSBkZXY7Ci0JZGVzYy0+Z3JvdXBzID0gY29yZXNpZ2h0X3N0bV9ncm91cHM7Ci0JZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoZGVzYyk7CisJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NPVVJDRTsKKwlkZXNjLnN1YnR5cGUuc291cmNlX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfU09VUkNFX1NPRlRXQVJFOworCWRlc2Mub3BzID0gJnN0bV9jc19vcHM7CisJZGVzYy5wZGF0YSA9IHBkYXRhOworCWRlc2MuZGV2ID0gZGV2OworCWRlc2MuZ3JvdXBzID0gY29yZXNpZ2h0X3N0bV9ncm91cHM7CisJZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoJmRlc2MpOwogCWlmIChJU19FUlIoZHJ2ZGF0YS0+Y3NkZXYpKSB7CiAJCXJldCA9IFBUUl9FUlIoZHJ2ZGF0YS0+Y3NkZXYpOwogCQlnb3RvIHN0bV91bnJlZ2lzdGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMtZXRmLmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy1ldGYuYwppbmRleCA0NjZhZjg2Li5kNjk0MWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy1ldGYuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy1ldGYuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgImNvcmVzaWdodC1wcml2LmgiCiAjaW5jbHVkZSAiY29yZXNpZ2h0LXRtYy5oIgogCi12b2lkIHRtY19ldGJfZW5hYmxlX2h3KHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSkKK3N0YXRpYyB2b2lkIHRtY19ldGJfZW5hYmxlX2h3KHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSkKIHsKIAlDU19VTkxPQ0soZHJ2ZGF0YS0+YmFzZSk7CiAKQEAgLTQ4LDYgKzQ4LDcgQEAKIAlpbnQgaTsKIAogCWJ1ZnAgPSBkcnZkYXRhLT5idWY7CisJZHJ2ZGF0YS0+bGVuID0gMDsKIAl3aGlsZSAoMSkgewogCQlmb3IgKGkgPSAwOyBpIDwgZHJ2ZGF0YS0+bWVtd2lkdGg7IGkrKykgewogCQkJcmVhZF9kYXRhID0gcmVhZGxfcmVsYXhlZChkcnZkYXRhLT5iYXNlICsgVE1DX1JSRCk7CkBAIC01NSw2ICs1Niw3IEBACiAJCQkJcmV0dXJuOwogCQkJbWVtY3B5KGJ1ZnAsICZyZWFkX2RhdGEsIDQpOwogCQkJYnVmcCArPSA0OworCQkJZHJ2ZGF0YS0+bGVuICs9IDQ7CiAJCX0KIAl9CiB9CkBAIC0xNjYsNyArMTY4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnZkYXRhLT5zcGlubG9jaywgZmxhZ3MpOwogCiAJLyogRnJlZSBtZW1vcnkgb3V0c2lkZSB0aGUgc3BpbmxvY2sgaWYgbmVlZCBiZSAqLwotCWlmICghdXNlZCAmJiBidWYpCisJaWYgKCF1c2VkKQogCQlrZnJlZShidWYpOwogCiAJaWYgKCFyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy1ldHIuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLWV0ci5jCmluZGV4IDY4OGJlOWUuLjg4NmVhODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLWV0ci5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLWV0ci5jCkBAIC0yMCw3ICsyMCw3IEBACiAjaW5jbHVkZSAiY29yZXNpZ2h0LXByaXYuaCIKICNpbmNsdWRlICJjb3Jlc2lnaHQtdG1jLmgiCiAKLXZvaWQgdG1jX2V0cl9lbmFibGVfaHcoc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhKQorc3RhdGljIHZvaWQgdG1jX2V0cl9lbmFibGVfaHcoc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhKQogewogCXUzMiBheGljdGw7CiAKQEAgLTY0LDExICs2NCwxNyBAQAogCXJ3cCA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRNQ19SV1ApOwogCXZhbCA9IHJlYWRsX3JlbGF4ZWQoZHJ2ZGF0YS0+YmFzZSArIFRNQ19TVFMpOwogCi0JLyogSG93IG11Y2ggbWVtb3J5IGRvIHdlIHN0aWxsIGhhdmUgKi8KLQlpZiAodmFsICYgQklUKDApKQorCS8qCisJICogQWRqdXN0IHRoZSBidWZmZXIgdG8gcG9pbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdHJhY2UgZGF0YQorCSAqIGFuZCB1cGRhdGUgdGhlIGF2YWlsYWJsZSB0cmFjZSBkYXRhLgorCSAqLworCWlmICh2YWwgJiBUTUNfU1RTX0ZVTEwpIHsKIAkJZHJ2ZGF0YS0+YnVmID0gZHJ2ZGF0YS0+dmFkZHIgKyByd3AgLSBkcnZkYXRhLT5wYWRkcjsKLQllbHNlCisJCWRydmRhdGEtPmxlbiA9IGRydmRhdGEtPnNpemU7CisJfSBlbHNlIHsKIAkJZHJ2ZGF0YS0+YnVmID0gZHJ2ZGF0YS0+dmFkZHI7CisJCWRydmRhdGEtPmxlbiA9IHJ3cCAtIGRydmRhdGEtPnBhZGRyOworCX0KIH0KIAogc3RhdGljIHZvaWQgdG1jX2V0cl9kaXNhYmxlX2h3KHN0cnVjdCB0bWNfZHJ2ZGF0YSAqZHJ2ZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5jCmluZGV4IDllMDJhYzkuLmQ4NTE3ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmMKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuYwpAQCAtMzgsOCArMzgsNyBAQAogCWlmIChjb3Jlc2lnaHRfdGltZW91dChkcnZkYXRhLT5iYXNlLAogCQkJICAgICAgVE1DX1NUUywgVE1DX1NUU19UTUNSRUFEWV9CSVQsIDEpKSB7CiAJCWRldl9lcnIoZHJ2ZGF0YS0+ZGV2LAotCQkJInRpbWVvdXQgb2JzZXJ2ZWQgd2hlbiBwcm9iaW5nIGF0IG9mZnNldCAlI3hcbiIsCi0JCQlUTUNfU1RTKTsKKwkJCSJ0aW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIFRNQyB0byBiZSBSZWFkeVxuIik7CiAJfQogfQogCkBAIC01Niw4ICs1NSw3IEBACiAJaWYgKGNvcmVzaWdodF90aW1lb3V0KGRydmRhdGEtPmJhc2UsCiAJCQkgICAgICBUTUNfRkZDUiwgVE1DX0ZGQ1JfRkxVU0hNQU5fQklULCAwKSkgewogCQlkZXZfZXJyKGRydmRhdGEtPmRldiwKLQkJCSJ0aW1lb3V0IG9ic2VydmVkIHdoZW4gcHJvYmluZyBhdCBvZmZzZXQgJSN4XG4iLAotCQkJVE1DX0ZGQ1IpOworCQkidGltZW91dCB3aGlsZSB3YWl0aW5nIGZvciBjb21wbGV0aW9uIG9mIE1hbnVhbCBGbHVzaFxuIik7CiAJfQogCiAJdG1jX3dhaXRfZm9yX3RtY3JlYWR5KGRydmRhdGEpOwpAQCAtMTQwLDggKzEzOCw4IEBACiAJCQkJCQkgICBzdHJ1Y3QgdG1jX2RydmRhdGEsIG1pc2NkZXYpOwogCWNoYXIgKmJ1ZnAgPSBkcnZkYXRhLT5idWYgKyAqcHBvczsKIAotCWlmICgqcHBvcyArIGxlbiA+IGRydmRhdGEtPnNpemUpCi0JCWxlbiA9IGRydmRhdGEtPnNpemUgLSAqcHBvczsKKwlpZiAoKnBwb3MgKyBsZW4gPiBkcnZkYXRhLT5sZW4pCisJCWxlbiA9IGRydmRhdGEtPmxlbiAtICpwcG9zOwogCiAJaWYgKGRydmRhdGEtPmNvbmZpZ190eXBlID09IFRNQ19DT05GSUdfVFlQRV9FVFIpIHsKIAkJaWYgKGJ1ZnAgPT0gKGNoYXIgKikoZHJ2ZGF0YS0+dmFkZHIgKyBkcnZkYXRhLT5zaXplKSkKQEAgLTE2MCw3ICsxNTgsNyBAQAogCSpwcG9zICs9IGxlbjsKIAogCWRldl9kYmcoZHJ2ZGF0YS0+ZGV2LCAiJXM6ICV6dSBieXRlcyBjb3BpZWQsICVkIGJ5dGVzIGxlZnRcbiIsCi0JCV9fZnVuY19fLCBsZW4sIChpbnQpKGRydmRhdGEtPnNpemUgLSAqcHBvcykpOworCQlfX2Z1bmNfXywgbGVuLCAoaW50KShkcnZkYXRhLT5sZW4gLSAqcHBvcykpOwogCXJldHVybiBsZW47CiB9CiAKQEAgLTIyMCw3ICsyMTgsNyBAQAogfQogCiAjZGVmaW5lIGNvcmVzaWdodF90bWNfc2ltcGxlX2Z1bmMobmFtZSwgb2Zmc2V0KQkJCVwKLQljb3Jlc2lnaHRfc2ltcGxlX2Z1bmMoc3RydWN0IHRtY19kcnZkYXRhLCBuYW1lLCBvZmZzZXQpCisJY29yZXNpZ2h0X3NpbXBsZV9mdW5jKHN0cnVjdCB0bWNfZHJ2ZGF0YSwgTlVMTCwgbmFtZSwgb2Zmc2V0KQogCiBjb3Jlc2lnaHRfdG1jX3NpbXBsZV9mdW5jKHJzeiwgVE1DX1JTWik7CiBjb3Jlc2lnaHRfdG1jX3NpbXBsZV9mdW5jKHN0cywgVE1DX1NUUyk7CkBAIC0yNDksOCArMjQ3LDggQEAKIAlOVUxMLAogfTsKIAotc3NpemVfdCB0cmlnZ2VyX2NudHJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCitzdGF0aWMgc3NpemVfdCB0cmlnZ2VyX2NudHJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKIAl1bnNpZ25lZCBsb25nIHZhbCA9IGRydmRhdGEtPnRyaWdnZXJfY250cjsKQEAgLTMwNCwyNyArMzAyLDMyIEBACiAJc3RydWN0IGNvcmVzaWdodF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IHRtY19kcnZkYXRhICpkcnZkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmFkZXYtPnJlczsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWRldi0+ZGV2Lm9mX25vZGU7CiAKIAlpZiAobnApIHsKIAkJcGRhdGEgPSBvZl9nZXRfY29yZXNpZ2h0X3BsYXRmb3JtX2RhdGEoZGV2LCBucCk7Ci0JCWlmIChJU19FUlIocGRhdGEpKQotCQkJcmV0dXJuIFBUUl9FUlIocGRhdGEpOworCQlpZiAoSVNfRVJSKHBkYXRhKSkgeworCQkJcmV0ID0gUFRSX0VSUihwZGF0YSk7CisJCQlnb3RvIG91dDsKKwkJfQogCQlhZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHBkYXRhOwogCX0KIAorCXJldCA9IC1FTk9NRU07CiAJZHJ2ZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZHJ2ZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZHJ2ZGF0YSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gb3V0OwogCiAJZHJ2ZGF0YS0+ZGV2ID0gJmFkZXYtPmRldjsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBkcnZkYXRhKTsKIAogCS8qIFZhbGlkaXR5IGZvciB0aGUgcmVzb3VyY2UgaXMgYWxyZWFkeSBjaGVja2VkIGJ5IHRoZSBBTUJBIGNvcmUgKi8KIAliYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKLQlpZiAoSVNfRVJSKGJhc2UpKQotCQlyZXR1cm4gUFRSX0VSUihiYXNlKTsKKwlpZiAoSVNfRVJSKGJhc2UpKSB7CisJCXJldCA9IFBUUl9FUlIoYmFzZSk7CisJCWdvdG8gb3V0OworCX0KIAogCWRydmRhdGEtPmJhc2UgPSBiYXNlOwogCkBAIC0zNDcsMzMgKzM1MCwyOCBAQAogCiAJcG1fcnVudGltZV9wdXQoJmFkZXYtPmRldik7CiAKLQlkZXNjID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkZXNjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2Rldm1fa3phbGxvYzsKLQl9Ci0KLQlkZXNjLT5wZGF0YSA9IHBkYXRhOwotCWRlc2MtPmRldiA9IGRldjsKLQlkZXNjLT5zdWJ0eXBlLnNpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TSU5LX0JVRkZFUjsKLQlkZXNjLT5ncm91cHMgPSBjb3Jlc2lnaHRfdG1jX2dyb3VwczsKKwlkZXNjLnBkYXRhID0gcGRhdGE7CisJZGVzYy5kZXYgPSBkZXY7CisJZGVzYy5ncm91cHMgPSBjb3Jlc2lnaHRfdG1jX2dyb3VwczsKIAogCWlmIChkcnZkYXRhLT5jb25maWdfdHlwZSA9PSBUTUNfQ09ORklHX1RZUEVfRVRCKSB7Ci0JCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU0lOSzsKLQkJZGVzYy0+b3BzID0gJnRtY19ldGJfY3Nfb3BzOworCQlkZXNjLnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU0lOSzsKKwkJZGVzYy5zdWJ0eXBlLnNpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TSU5LX0JVRkZFUjsKKwkJZGVzYy5vcHMgPSAmdG1jX2V0Yl9jc19vcHM7CiAJfSBlbHNlIGlmIChkcnZkYXRhLT5jb25maWdfdHlwZSA9PSBUTUNfQ09ORklHX1RZUEVfRVRSKSB7Ci0JCWRlc2MtPnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU0lOSzsKLQkJZGVzYy0+b3BzID0gJnRtY19ldHJfY3Nfb3BzOworCQlkZXNjLnR5cGUgPSBDT1JFU0lHSFRfREVWX1RZUEVfU0lOSzsKKwkJZGVzYy5zdWJ0eXBlLnNpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TSU5LX0JVRkZFUjsKKwkJZGVzYy5vcHMgPSAmdG1jX2V0cl9jc19vcHM7CiAJfSBlbHNlIHsKLQkJZGVzYy0+dHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9MSU5LU0lOSzsKLQkJZGVzYy0+c3VidHlwZS5saW5rX3N1YnR5cGUgPSBDT1JFU0lHSFRfREVWX1NVQlRZUEVfTElOS19GSUZPOwotCQlkZXNjLT5vcHMgPSAmdG1jX2V0Zl9jc19vcHM7CisJCWRlc2MudHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9MSU5LU0lOSzsKKwkJZGVzYy5zdWJ0eXBlLmxpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9MSU5LX0ZJRk87CisJCWRlc2Mub3BzID0gJnRtY19ldGZfY3Nfb3BzOwogCX0KIAotCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKGRlc2MpOworCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKCZkZXNjKTsKIAlpZiAoSVNfRVJSKGRydmRhdGEtPmNzZGV2KSkgewogCQlyZXQgPSBQVFJfRVJSKGRydmRhdGEtPmNzZGV2KTsKLQkJZ290byBlcnJfZGV2bV9remFsbG9jOworCQlnb3RvIG91dDsKIAl9CiAKIAlkcnZkYXRhLT5taXNjZGV2Lm5hbWUgPSBwZGF0YS0+bmFtZTsKQEAgLTM4MSwxNiArMzc5LDggQEAKIAlkcnZkYXRhLT5taXNjZGV2LmZvcHMgPSAmdG1jX2ZvcHM7CiAJcmV0ID0gbWlzY19yZWdpc3RlcigmZHJ2ZGF0YS0+bWlzY2Rldik7CiAJaWYgKHJldCkKLQkJZ290byBlcnJfbWlzY19yZWdpc3RlcjsKLQotCXJldHVybiAwOwotCi1lcnJfbWlzY19yZWdpc3RlcjoKLQljb3Jlc2lnaHRfdW5yZWdpc3RlcihkcnZkYXRhLT5jc2Rldik7Ci1lcnJfZGV2bV9remFsbG9jOgotCWlmIChkcnZkYXRhLT5jb25maWdfdHlwZSA9PSBUTUNfQ09ORklHX1RZUEVfRVRSKQotCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIGRydmRhdGEtPnNpemUsCi0JCQkJZHJ2ZGF0YS0+dmFkZHIsIGRydmRhdGEtPnBhZGRyKTsKKwkJY29yZXNpZ2h0X3VucmVnaXN0ZXIoZHJ2ZGF0YS0+Y3NkZXYpOworb3V0OgogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmggYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRtYy5oCmluZGV4IDVjNWZlMmEuLjQ0YjNhZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdG1jLmgKKysrIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC10bWMuaApAQCAtOTgsNyArOTgsOCBAQAogICogQGJ1ZjoJYXJlYSBvZiBtZW1vcnkgd2hlcmUgdHJhY2UgZGF0YSBnZXQgc2VudC4KICAqIEBwYWRkcjoJRE1BIHN0YXJ0IGxvY2F0aW9uIGluIFJBTS4KICAqIEB2YWRkcjoJdmlydHVhbCByZXByZXNlbnRhdGlvbiBvZiBAcGFkZHIuCi0gKiBAc2l6ZToJQGJ1ZiBzaXplLgorICogQHNpemU6CXRyYWNlIGJ1ZmZlciBzaXplLgorICogQGxlbjoJc2l6ZSBvZiB0aGUgYXZhaWxhYmxlIHRyYWNlLgogICogQG1vZGU6CWhvdyB0aGlzIFRNQyBpcyBiZWluZyB1c2VkLgogICogQGNvbmZpZ190eXBlOiBUTUMgdmFyaWFudCwgbXVzdCBiZSBvZiB0eXBlIEB0bWNfY29uZmlnX3R5cGUuCiAgKiBAbWVtd2lkdGg6CXdpZHRoIG9mIHRoZSBtZW1vcnkgaW50ZXJmYWNlIGRhdGFidXMsIGluIGJ5dGVzLgpAQCAtMTE1LDYgKzExNiw3IEBACiAJZG1hX2FkZHJfdAkJcGFkZHI7CiAJdm9pZCBfX2lvbWVtCQkqdmFkZHI7CiAJdTMyCQkJc2l6ZTsKKwl1MzIJCQlsZW47CiAJbG9jYWxfdAkJCW1vZGU7CiAJZW51bSB0bWNfY29uZmlnX3R5cGUJY29uZmlnX3R5cGU7CiAJZW51bSB0bWNfbWVtX2ludGZfd2lkdGgJbWVtd2lkdGg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LXRwaXUuYyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdHBpdS5jCmluZGV4IDRlNDcxZTIuLjA2NzNiYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdHBpdS5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQtdHBpdS5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAlzdHJ1Y3QgY29yZXNpZ2h0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gTlVMTDsKIAlzdHJ1Y3QgdHBpdV9kcnZkYXRhICpkcnZkYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJmFkZXYtPnJlczsKLQlzdHJ1Y3QgY29yZXNpZ2h0X2Rlc2MgKmRlc2M7CisJc3RydWN0IGNvcmVzaWdodF9kZXNjIGRlc2MgPSB7IDAgfTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gYWRldi0+ZGV2Lm9mX25vZGU7CiAKIAlpZiAobnApIHsKQEAgLTE1NCwxNiArMTU0LDEyIEBACiAKIAlwbV9ydW50aW1lX3B1dCgmYWRldi0+ZGV2KTsKIAotCWRlc2MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlc2MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGVzYy0+dHlwZSA9IENPUkVTSUdIVF9ERVZfVFlQRV9TSU5LOwotCWRlc2MtPnN1YnR5cGUuc2lua19zdWJ0eXBlID0gQ09SRVNJR0hUX0RFVl9TVUJUWVBFX1NJTktfUE9SVDsKLQlkZXNjLT5vcHMgPSAmdHBpdV9jc19vcHM7Ci0JZGVzYy0+cGRhdGEgPSBwZGF0YTsKLQlkZXNjLT5kZXYgPSBkZXY7Ci0JZHJ2ZGF0YS0+Y3NkZXYgPSBjb3Jlc2lnaHRfcmVnaXN0ZXIoZGVzYyk7CisJZGVzYy50eXBlID0gQ09SRVNJR0hUX0RFVl9UWVBFX1NJTks7CisJZGVzYy5zdWJ0eXBlLnNpbmtfc3VidHlwZSA9IENPUkVTSUdIVF9ERVZfU1VCVFlQRV9TSU5LX1BPUlQ7CisJZGVzYy5vcHMgPSAmdHBpdV9jc19vcHM7CisJZGVzYy5wZGF0YSA9IHBkYXRhOworCWRlc2MuZGV2ID0gZGV2OworCWRydmRhdGEtPmNzZGV2ID0gY29yZXNpZ2h0X3JlZ2lzdGVyKCZkZXNjKTsKIAlpZiAoSVNfRVJSKGRydmRhdGEtPmNzZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoZHJ2ZGF0YS0+Y3NkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LmMgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvY29yZXNpZ2h0LmMKaW5kZXggZDA4ZDFhYi4uN2JmMDBhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L2NvcmVzaWdodC5jCisrKyBiL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9jb3Jlc2lnaHQuYwpAQCAtMjU3LDcgKzI1Nyw3IEBACiB7CiAJaWYgKGF0b21pY19kZWNfcmV0dXJuKGNzZGV2LT5yZWZjbnQpID09IDApIHsKIAkJaWYgKHNvdXJjZV9vcHMoY3NkZXYpLT5kaXNhYmxlKSB7Ci0JCQlzb3VyY2Vfb3BzKGNzZGV2KS0+ZGlzYWJsZShjc2Rldik7CisJCQlzb3VyY2Vfb3BzKGNzZGV2KS0+ZGlzYWJsZShjc2RldiwgTlVMTCk7CiAJCQljc2Rldi0+ZW5hYmxlID0gZmFsc2U7CiAJCX0KIAl9CkBAIC00MjksNyArNDI5LDcgQEAKIAogCXBhdGggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwYXRoKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlJTklUX0xJU1RfSEVBRChwYXRoKTsKIApAQCAtNzI1LDcgKzcyNSw4IEBACiAJCS8qIFdlIGhhdmUgZm91bmQgYXQgbGVhc3Qgb25lIG9ycGhhbiBjb25uZWN0aW9uICovCiAJCWlmIChjb25uLT5jaGlsZF9kZXYgPT0gTlVMTCkgewogCQkJLyogRG9lcyBpdCBtYXRjaCB0aGlzIG5ld2x5IGFkZGVkIGRldmljZT8gKi8KLQkJCWlmICghc3RyY21wKGRldl9uYW1lKCZjc2Rldi0+ZGV2KSwgY29ubi0+Y2hpbGRfbmFtZSkpIHsKKwkJCWlmIChjb25uLT5jaGlsZF9uYW1lICYmCisJCQkgICAgIXN0cmNtcChkZXZfbmFtZSgmY3NkZXYtPmRldiksIGNvbm4tPmNoaWxkX25hbWUpKSB7CiAJCQkJY29ubi0+Y2hpbGRfZGV2ID0gY3NkZXY7CiAJCQl9IGVsc2UgewogCQkJCS8qIFRoaXMgY29tcG9uZW50IHN0aWxsIGhhcyBhbiBvcnBoYW4gKi8KQEAgLTg5Myw3ICs4OTQsNyBAQAogCWludCBucl9yZWZjbnRzID0gMTsKIAlhdG9taWNfdCAqcmVmY250cyA9IE5VTEw7CiAJc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2OwotCXN0cnVjdCBjb3Jlc2lnaHRfY29ubmVjdGlvbiAqY29ubnM7CisJc3RydWN0IGNvcmVzaWdodF9jb25uZWN0aW9uICpjb25ucyA9IE5VTEw7CiAKIAljc2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpjc2RldiksIEdGUF9LRVJORUwpOwogCWlmICghY3NkZXYpIHsKQEAgLTkyMSwxNiArOTIyLDIwIEBACiAKIAljc2Rldi0+bnJfaW5wb3J0ID0gZGVzYy0+cGRhdGEtPm5yX2lucG9ydDsKIAljc2Rldi0+bnJfb3V0cG9ydCA9IGRlc2MtPnBkYXRhLT5ucl9vdXRwb3J0OwotCWNvbm5zID0ga2NhbGxvYyhjc2Rldi0+bnJfb3V0cG9ydCwgc2l6ZW9mKCpjb25ucyksIEdGUF9LRVJORUwpOwotCWlmICghY29ubnMpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfa3phbGxvY19jb25uczsKLQl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgY3NkZXYtPm5yX291dHBvcnQ7IGkrKykgewotCQljb25uc1tpXS5vdXRwb3J0ID0gZGVzYy0+cGRhdGEtPm91dHBvcnRzW2ldOwotCQljb25uc1tpXS5jaGlsZF9uYW1lID0gZGVzYy0+cGRhdGEtPmNoaWxkX25hbWVzW2ldOwotCQljb25uc1tpXS5jaGlsZF9wb3J0ID0gZGVzYy0+cGRhdGEtPmNoaWxkX3BvcnRzW2ldOworCS8qIEluaXRpYWxpc2UgY29ubmVjdGlvbnMgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIG91dHBvcnQgKi8KKwlpZiAoY3NkZXYtPm5yX291dHBvcnQpIHsKKwkJY29ubnMgPSBrY2FsbG9jKGNzZGV2LT5ucl9vdXRwb3J0LCBzaXplb2YoKmNvbm5zKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY29ubnMpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycl9remFsbG9jX2Nvbm5zOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGNzZGV2LT5ucl9vdXRwb3J0OyBpKyspIHsKKwkJCWNvbm5zW2ldLm91dHBvcnQgPSBkZXNjLT5wZGF0YS0+b3V0cG9ydHNbaV07CisJCQljb25uc1tpXS5jaGlsZF9uYW1lID0gZGVzYy0+cGRhdGEtPmNoaWxkX25hbWVzW2ldOworCQkJY29ubnNbaV0uY2hpbGRfcG9ydCA9IGRlc2MtPnBkYXRhLT5jaGlsZF9wb3J0c1tpXTsKKwkJfQogCX0KIAogCWNzZGV2LT5jb25ucyA9IGNvbm5zOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L29mX2NvcmVzaWdodC5jIGIvZHJpdmVycy9od3RyYWNpbmcvY29yZXNpZ2h0L29mX2NvcmVzaWdodC5jCmluZGV4IGI2OGRhMTguLjYyOWUwMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHd0cmFjaW5nL2NvcmVzaWdodC9vZl9jb3Jlc2lnaHQuYworKysgYi9kcml2ZXJzL2h3dHJhY2luZy9jb3Jlc2lnaHQvb2ZfY29yZXNpZ2h0LmMKQEAgLTE2Niw3ICsxNjYsNyBAQAogCiAJCQlyZGV2ID0gb2ZfY29yZXNpZ2h0X2dldF9lbmRwb2ludF9kZXZpY2UocnBhcmVudCk7CiAJCQlpZiAoIXJkZXYpCi0JCQkJY29udGludWU7CisJCQkJcmV0dXJuIEVSUl9QVFIoLUVQUk9CRV9ERUZFUik7CiAKIAkJCXBkYXRhLT5jaGlsZF9uYW1lc1tpXSA9IGRldl9uYW1lKHJkZXYpOwogCQkJcGRhdGEtPmNoaWxkX3BvcnRzW2ldID0gcmVuZHBvaW50LmlkOwpAQCAtMTg0LDYgKzE4NCw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KKwlvZl9ub2RlX3B1dChkbik7CiAKIAlyZXR1cm4gcGRhdGE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCmluZGV4IDVjMzk5M2IuLjZkOTRlMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCkBAIC04MzYsNyArODM2LDcgQEAKIGNvbmZpZyBJMkNfU0hfTU9CSUxFCiAJdHJpc3RhdGUgIlN1cGVySCBNb2JpbGUgSTJDIENvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBIQVNfRE1BCi0JZGVwZW5kcyBvbiBTVVBFUkggfHwgQVJDSF9SRU5FU0FTIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gQVJDSF9TSE1PQklMRSB8fCBBUkNIX1JFTkVTQVMgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlCiAJICBidWlsdC1pbiBJMkMgaW50ZXJmYWNlIG9uIHRoZSBSZW5lc2FzIFNILU1vYmlsZSBwcm9jZXNzb3IuCkBAIC05NTYsNiArOTU2LDE3IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtb2N0ZW9uLgogCitjb25maWcgSTJDX1RIVU5ERVJYCisJdHJpc3RhdGUgIkNhdml1bSBUaHVuZGVyWCBJMkMgYnVzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiA2NEJJVCAmJiBQQ0kgJiYgKEFSTTY0IHx8IENPTVBJTEVfVEVTVCkKKwlzZWxlY3QgSTJDX1NNQlVTCisJaGVscAorCSAgU2F5IHllcyBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoZSBJMkMgc2VyaWFsIGJ1cyBvbiBDYXZpdW0KKwkgIFRodW5kZXJYIFNPQy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLXRodW5kZXJ4LgorCiBjb25maWcgSTJDX1hJTElOWAogCXRyaXN0YXRlICJYaWxpbnggSTJDIENvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBIQVNfSU9NRU0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQppbmRleCAzN2YyODE5Li4yOTc2NGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCkBAIC05MSw3ICs5MSwxMCBAQAogb2JqLSQoQ09ORklHX0kyQ19VTklQSElFUl9GKQkrPSBpMmMtdW5pcGhpZXItZi5vCiBvYmotJChDT05GSUdfSTJDX1ZFUlNBVElMRSkJKz0gaTJjLXZlcnNhdGlsZS5vCiBvYmotJChDT05GSUdfSTJDX1dNVCkJCSs9IGkyYy13bXQubworaTJjLW9jdGVvbi1vYmpzIDo9IGkyYy1vY3Rlb24tY29yZS5vIGkyYy1vY3Rlb24tcGxhdGRydi5vCiBvYmotJChDT05GSUdfSTJDX09DVEVPTikJKz0gaTJjLW9jdGVvbi5vCitpMmMtdGh1bmRlcngtb2JqcyA6PSBpMmMtb2N0ZW9uLWNvcmUubyBpMmMtdGh1bmRlcngtcGNpZHJ2Lm8KK29iai0kKENPTkZJR19JMkNfVEhVTkRFUlgpCSs9IGkyYy10aHVuZGVyeC5vCiBvYmotJChDT05GSUdfSTJDX1hJTElOWCkJKz0gaTJjLXhpaWMubwogb2JqLSQoQ09ORklHX0kyQ19YTFIpCQkrPSBpMmMteGxyLm8KIG9iai0kKENPTkZJR19JMkNfWExQOVhYKQkrPSBpMmMteGxwOXh4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni5jCmluZGV4IDZjNzExM2QuLjI3NDkwOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYwpAQCAtMzc4LDExICszNzgsOCBAQAogCQkgYW1kNzU2X2lvcG9ydCk7CiAKIAllcnJvciA9IGkyY19hZGRfYWRhcHRlcigmYW1kNzU2X3NtYnVzKTsKLQlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIkFkYXB0ZXIgcmVnaXN0cmF0aW9uIGZhaWxlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZFxuIik7CisJaWYgKGVycm9yKQogCQlnb3RvIG91dF9lcnI7Ci0JfQogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXQ5MS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdDkxLmMKaW5kZXggMWJiOTdmNi4uMGI4NmM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdDkxLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdDkxLmMKQEAgLTExMjIsOCArMTEyMiw2IEBACiAKIAlyYyA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcigmZGV2LT5hZGFwdGVyKTsKIAlpZiAocmMpIHsKLQkJZGV2X2VycihkZXYtPmRldiwgIkFkYXB0ZXIgJXMgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwKLQkJCWRldi0+YWRhcHRlci5uYW1lKTsKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRldi0+Y2xrKTsKIAogCQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1heHhpYS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1heHhpYS5jCmluZGV4IGMzMzVjYzcuLjQzNTFhOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXh4aWEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF4eGlhLmMKQEAgLTU0NSw3ICs1NDUsMTEgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQljbGtfcHJlcGFyZV9lbmFibGUoaWRldi0+aTJjX2Nsayk7CisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGlkZXYtPmkyY19jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBjbG9ja1xuIik7CisJCXJldHVybiByZXQ7CisJfQogCiAJaTJjX3NldF9hZGFwZGF0YSgmaWRldi0+YWRhcHRlciwgaWRldik7CiAJc3RybGNweShpZGV2LT5hZGFwdGVyLm5hbWUsIHBkZXYtPm5hbWUsIHNpemVvZihpZGV2LT5hZGFwdGVyLm5hbWUpKTsKQEAgLTU2MCw3ICs1NjQsNyBAQAogCiAJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZpZGV2LT5hZGFwdGVyKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhZGQgYWRhcHRlclxuIik7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShpZGV2LT5pMmNfY2xrKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmNtLWlwcm9jLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbS1pcHJvYy5jCmluZGV4IDk1ZjdjYWMuLjMyNmIzZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmNtLWlwcm9jLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iY20taXByb2MuYwpAQCAtNDg4LDEzICs0ODgsNyBAQAogCWFkYXAtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCWFkYXAtPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAKLQlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGlwcm9jX2kyYy0+ZGV2aWNlLCAiZmFpbGVkIHRvIGFkZCBhZGFwdGVyXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX2FkZF9hZGFwdGVyKGFkYXApOwogfQogCiBzdGF0aWMgaW50IGJjbV9pcHJvY19pMmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbS1rb25hLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbS1rb25hLmMKaW5kZXggZjk4NzQzMi4uNGU0ODlhOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmNtLWtvbmEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbS1rb25hLmMKQEAgLTY0Myw3ICs2NDMsNyBAQAogCQkJaWYgKHJjIDwgMCkgewogCQkJCWRldl9lcnIoZGV2LT5kZXZpY2UsCiAJCQkJCSJyZXN0YXJ0IGNtZCBmYWlsZWQgcmMgPSAlZFxuIiwgcmMpOwotCQkJCQlnb3RvIHhmZXJfc2VuZF9zdG9wOworCQkJCWdvdG8geGZlcl9zZW5kX3N0b3A7CiAJCQl9CiAJCX0KIApAQCAtODU4LDEwICs4NTgsOCBAQAogCWFkYXAtPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAKIAlyYyA9IGkyY19hZGRfYWRhcHRlcihhZGFwKTsKLQlpZiAocmMpIHsKLQkJZGV2X2VycihkZXYtPmRldmljZSwgImZhaWxlZCB0byBhZGQgYWRhcHRlclxuIik7CisJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JfQogCiAJZGV2X2luZm8oZGV2LT5kZXZpY2UsICJkZXZpY2UgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHlcbiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJmaW4tdHdpLmMKaW5kZXggMDI1Njg2ZC4uMjlkMDBjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iZmluLXR3aS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmZpbi10d2kuYwpAQCAtNjg1LDEwICs2ODUsOCBAQAogCXdyaXRlX0NPTlRST0woaWZhY2UsIHJlYWRfQ09OVFJPTChpZmFjZSkgfCBUV0lfRU5BKTsKIAogCXJjID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKHBfYWRhcCk7Ci0JaWYgKHJjIDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBhZGQgaTJjIGFkYXB0ZXIhXG4iKTsKKwlpZiAocmMgPCAwKQogCQlnb3RvIG91dF9lcnJvcjsKLQl9CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpZmFjZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYnJjbXN0Yi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1icmNtc3RiLmMKaW5kZXggMzg1YjU3Yi4uMDY1MjI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1icmNtc3RiLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1icmNtc3RiLmMKQEAgLTY0OCwxMCArNjQ4LDggQEAKIAlhZGFwLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKIAlhZGFwLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXJjID0gaTJjX2FkZF9hZGFwdGVyKGFkYXApOwotCWlmIChyYykgewotCQlkZXZfZXJyKGRldi0+ZGV2aWNlLCAiZmFpbGVkIHRvIGFkZCBhZGFwdGVyXG4iKTsKKwlpZiAocmMpCiAJCWdvdG8gcHJvYmVfZXJyb3JvdXQ7Ci0JfQogCiAJZGV2X2luZm8oZGV2LT5kZXZpY2UsICIlc0AlZGh6IHJlZ2lzdGVyZWQgaW4gJXMgbW9kZVxuIiwKIAkJIGludF9uYW1lID8gaW50X25hbWUgOiAiICIsIGRldi0+Y2xrX2ZyZXFfaHosCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNhZGVuY2UuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCmluZGV4IDkwYmJkOWYuLjY4Njk3MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCkBAIC03NjcsNyArNzY3LDcgQEAKICAqIGRlcGVuZGluZyBvbiB0aGUgc2NhbGluZyBkaXJlY3Rpb24uCiAgKgogICogUmV0dXJuOglOT1RJRllfU1RPUCBpZiB0aGUgcmF0ZSBjaGFuZ2Ugc2hvdWxkIGJlIGFib3J0ZWQsIE5PVElGWV9PSwotICoJCXRvIGFja25vd2VkZ2UgdGhlIGNoYW5nZSwgTk9USUZZX0RPTkUgaWYgdGhlIG5vdGlmaWNhdGlvbiBpcworICoJCXRvIGFja25vd2xlZGdlIHRoZSBjaGFuZ2UsIE5PVElGWV9ET05FIGlmIHRoZSBub3RpZmljYXRpb24gaXMKICAqCQljb25zaWRlcmVkIGlycmVsZXZhbnQuCiAgKi8KIHN0YXRpYyBpbnQgY2Ruc19pMmNfY2xrX25vdGlmaWVyX2NiKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcKQEAgLTk2MywxMCArOTYzLDggQEAKIAl9CiAKIAlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJmlkLT5hZGFwKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZWcgYWRhcCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9jbGtfZGlzOwotCX0KIAogCS8qCiAJICogQ2FkZW5jZSBJMkMgY29udHJvbGxlciBoYXMgYSBidWcgd2hlcmVpbiBpdCBnZW5lcmF0ZXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3BtLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNwbS5jCmluZGV4IGVlNTdjMWUuLmQ4OWJkZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3BtLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcG0uYwpAQCAtNjY1LDEwICs2NjUsOCBAQAogCWNwbS0+YWRhcC5uciA9IChkYXRhICYmIGxlbiA9PSA0KSA/IGJlMzJfdG9fY3B1cChkYXRhKSA6IC0xOwogCXJlc3VsdCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcigmY3BtLT5hZGFwKTsKIAotCWlmIChyZXN1bHQgPCAwKSB7Ci0JCWRldl9lcnIoJm9mZGV2LT5kZXYsICJVbmFibGUgdG8gcmVnaXN0ZXIgd2l0aCBJMkNcbiIpOworCWlmIChyZXN1bHQgPCAwKQogCQlnb3RvIG91dF9zaHV0OwotCX0KIAogCWRldl9kYmcoJm9mZGV2LT5kZXYsICJodyByb3V0aW5lcyBmb3IgJXMgcmVnaXN0ZXJlZC5cbiIsCiAJCWNwbS0+YWRhcC5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3Jvcy1lYy10dW5uZWwuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3Jvcy1lYy10dW5uZWwuYwppbmRleCAyZDVmZjg2My4uOWIzNmE3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcm9zLWVjLXR1bm5lbC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3Jvcy1lYy10dW5uZWwuYwpAQCAtMjgxLDEwICsyODEsOCBAQAogCWJ1cy0+YWRhcC5yZXRyaWVzID0gSTJDX01BWF9SRVRSSUVTOwogCiAJZXJyID0gaTJjX2FkZF9hZGFwdGVyKCZidXMtPmFkYXApOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycihkZXYsICJjYW5ub3QgcmVnaXN0ZXIgaTJjIGFkYXB0ZXJcbiIpOworCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JfQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGJ1cyk7CiAKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kYXZpbmNpLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRhdmluY2kuYwppbmRleCBhOGJkY2I1Li45ZTdlZjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRhdmluY2kuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRhdmluY2kuYwpAQCAtODQ2LDEwICs4NDYsOCBAQAogCiAJYWRhcC0+bnIgPSBwZGV2LT5pZDsKIAlyID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKGFkYXApOwotCWlmIChyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWx1cmUgYWRkaW5nIGFkYXB0ZXJcbiIpOworCWlmIChyKQogCQlnb3RvIGVycl91bnVzZV9jbG9ja3M7Ci0JfQogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1jb3JlLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtY29yZS5jCmluZGV4IGM2OTIyYjguLjFmZTkzYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1jb3JlLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuYwpAQCAtNDIsNiArNDIsOCBAQAogI2RlZmluZSBEV19JQ19TU19TQ0xfTENOVAkweDE4CiAjZGVmaW5lIERXX0lDX0ZTX1NDTF9IQ05UCTB4MWMKICNkZWZpbmUgRFdfSUNfRlNfU0NMX0xDTlQJMHgyMAorI2RlZmluZSBEV19JQ19IU19TQ0xfSENOVAkweDI0CisjZGVmaW5lIERXX0lDX0hTX1NDTF9MQ05UCTB4MjgKICNkZWZpbmUgRFdfSUNfSU5UUl9TVEFUCQkweDJjCiAjZGVmaW5lIERXX0lDX0lOVFJfTUFTSwkJMHgzMAogI2RlZmluZSBEV19JQ19SQVdfSU5UUl9TVEFUCTB4MzQKQEAgLTg5LDEyICs5MSwxNyBAQAogCQkJCQkgRFdfSUNfSU5UUl9UWF9BQlJUIHwgXAogCQkJCQkgRFdfSUNfSU5UUl9TVE9QX0RFVCkKIAotI2RlZmluZSBEV19JQ19TVEFUVVNfQUNUSVZJVFkJMHgxCisjZGVmaW5lIERXX0lDX1NUQVRVU19BQ1RJVklUWQkJMHgxCisjZGVmaW5lIERXX0lDX1NUQVRVU19URkUJCUJJVCgyKQorI2RlZmluZSBEV19JQ19TVEFUVVNfTVNUX0FDVElWSVRZCUJJVCg1KQogCiAjZGVmaW5lIERXX0lDX0VSUl9UWF9BQlJUCTB4MQogCiAjZGVmaW5lIERXX0lDX1RBUl8xMEJJVEFERFJfTUFTVEVSIEJJVCgxMikKIAorI2RlZmluZSBEV19JQ19DT01QX1BBUkFNXzFfU1BFRURfTU9ERV9ISUdICShCSVQoMikgfCBCSVQoMykpCisjZGVmaW5lIERXX0lDX0NPTVBfUEFSQU1fMV9TUEVFRF9NT0RFX01BU0sJR0VOTUFTSygzLCAyKQorCiAvKgogICogc3RhdHVzIGNvZGVzCiAgKi8KQEAgLTI1MiwxMCArMjU5LDE1IEBACiAKIHN0YXRpYyB2b2lkIF9faTJjX2R3X2VuYWJsZShzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2LCBib29sIGVuYWJsZSkKIHsKKwlkd193cml0ZWwoZGV2LCBlbmFibGUsIERXX0lDX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faTJjX2R3X2VuYWJsZV9hbmRfd2FpdChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2LCBib29sIGVuYWJsZSkKK3sKIAlpbnQgdGltZW91dCA9IDEwMDsKIAogCWRvIHsKLQkJZHdfd3JpdGVsKGRldiwgZW5hYmxlLCBEV19JQ19FTkFCTEUpOworCQlfX2kyY19kd19lbmFibGUoZGV2LCBlbmFibGUpOwogCQlpZiAoKGR3X3JlYWRsKGRldiwgRFdfSUNfRU5BQkxFX1NUQVRVUykgJiAxKSA9PSBlbmFibGUpCiAJCQlyZXR1cm47CiAKQEAgLTI4Miw2ICsyOTQsMjggQEAKIAlyZXR1cm4gZGV2LT5nZXRfY2xrX3JhdGVfa2h6KGRldik7CiB9CiAKK3N0YXRpYyBpbnQgaTJjX2R3X2FjcXVpcmVfbG9jayhzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQoreworCWludCByZXQ7CisKKwlpZiAoIWRldi0+YWNxdWlyZV9sb2NrKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGRldi0+YWNxdWlyZV9sb2NrKGRldik7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJZGV2X2VycihkZXYtPmRldiwgImNvdWxkbid0IGFjcXVpcmUgYnVzIG93bmVyc2hpcFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpMmNfZHdfcmVsZWFzZV9sb2NrKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpCit7CisJaWYgKGRldi0+cmVsZWFzZV9sb2NrKQorCQlkZXYtPnJlbGVhc2VfbG9jayhkZXYpOworfQorCiAvKioKICAqIGkyY19kd19pbml0KCkgLSBpbml0aWFsaXplIHRoZSBkZXNpZ253YXJlIGkyYyBtYXN0ZXIgaGFyZHdhcmUKICAqIEBkZXY6IGRldmljZSBwcml2YXRlIGRhdGEKQEAgLTI5MywxNyArMzI3LDEzIEBACiBpbnQgaTJjX2R3X2luaXQoc3RydWN0IGR3X2kyY19kZXYgKmRldikKIHsKIAl1MzIgaGNudCwgbGNudDsKLQl1MzIgcmVnOworCXUzMiByZWcsIGNvbXBfcGFyYW0xOwogCXUzMiBzZGFfZmFsbGluZ190aW1lLCBzY2xfZmFsbGluZ190aW1lOwogCWludCByZXQ7CiAKLQlpZiAoZGV2LT5hY3F1aXJlX2xvY2spIHsKLQkJcmV0ID0gZGV2LT5hY3F1aXJlX2xvY2soZGV2KTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkZXYtPmRldiwgImNvdWxkbid0IGFjcXVpcmUgYnVzIG93bmVyc2hpcFxuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQorCXJldCA9IGkyY19kd19hY3F1aXJlX2xvY2soZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJcmVnID0gZHdfcmVhZGwoZGV2LCBEV19JQ19DT01QX1RZUEUpOwogCWlmIChyZWcgPT0gX19fY29uc3RhbnRfc3dhYjMyKERXX0lDX0NPTVBfVFlQRV9WQUxVRSkpIHsKQEAgLTMxNSwxMyArMzQ1LDE0IEBACiAJfSBlbHNlIGlmIChyZWcgIT0gRFdfSUNfQ09NUF9UWVBFX1ZBTFVFKSB7CiAJCWRldl9lcnIoZGV2LT5kZXYsICJVbmtub3duIFN5bm9wc3lzIGNvbXBvbmVudCB0eXBlOiAiCiAJCQkiMHglMDh4XG4iLCByZWcpOwotCQlpZiAoZGV2LT5yZWxlYXNlX2xvY2spCi0JCQlkZXYtPnJlbGVhc2VfbG9jayhkZXYpOworCQlpMmNfZHdfcmVsZWFzZV9sb2NrKGRldik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCWNvbXBfcGFyYW0xID0gZHdfcmVhZGwoZGV2LCBEV19JQ19DT01QX1BBUkFNXzEpOworCiAJLyogRGlzYWJsZSB0aGUgYWRhcHRlciAqLwotCV9faTJjX2R3X2VuYWJsZShkZXYsIGZhbHNlKTsKKwlfX2kyY19kd19lbmFibGVfYW5kX3dhaXQoZGV2LCBmYWxzZSk7CiAKIAkvKiBzZXQgc3RhbmRhcmQgYW5kIGZhc3Qgc3BlZWQgZGV2aWRlcnMgZm9yIGhpZ2gvbG93IHBlcmlvZHMgKi8KIApAQCAtMzQ3LDggKzM3OCwxMSBAQAogCWR3X3dyaXRlbChkZXYsIGxjbnQsIERXX0lDX1NTX1NDTF9MQ05UKTsKIAlkZXZfZGJnKGRldi0+ZGV2LCAiU3RhbmRhcmQtbW9kZSBIQ05UOkxDTlQgPSAlZDolZFxuIiwgaGNudCwgbGNudCk7CiAKLQkvKiBTZXQgU0NMIHRpbWluZyBwYXJhbWV0ZXJzIGZvciBmYXN0LW1vZGUgKi8KLQlpZiAoZGV2LT5mc19oY250ICYmIGRldi0+ZnNfbGNudCkgeworCS8qIFNldCBTQ0wgdGltaW5nIHBhcmFtZXRlcnMgZm9yIGZhc3QtbW9kZSBvciBmYXN0LW1vZGUgcGx1cyAqLworCWlmICgoZGV2LT5jbGtfZnJlcSA9PSAxMDAwMDAwKSAmJiBkZXYtPmZwX2hjbnQgJiYgZGV2LT5mcF9sY250KSB7CisJCWhjbnQgPSBkZXYtPmZwX2hjbnQ7CisJCWxjbnQgPSBkZXYtPmZwX2xjbnQ7CisJfSBlbHNlIGlmIChkZXYtPmZzX2hjbnQgJiYgZGV2LT5mc19sY250KSB7CiAJCWhjbnQgPSBkZXYtPmZzX2hjbnQ7CiAJCWxjbnQgPSBkZXYtPmZzX2xjbnQ7CiAJfSBlbHNlIHsKQEAgLTM2NiwxNCArNDAwLDM1IEBACiAJZHdfd3JpdGVsKGRldiwgbGNudCwgRFdfSUNfRlNfU0NMX0xDTlQpOwogCWRldl9kYmcoZGV2LT5kZXYsICJGYXN0LW1vZGUgSENOVDpMQ05UID0gJWQ6JWRcbiIsIGhjbnQsIGxjbnQpOwogCisJaWYgKChkZXYtPm1hc3Rlcl9jZmcgJiBEV19JQ19DT05fU1BFRURfTUFTSykgPT0KKwkJRFdfSUNfQ09OX1NQRUVEX0hJR0gpIHsKKwkJaWYgKChjb21wX3BhcmFtMSAmIERXX0lDX0NPTVBfUEFSQU1fMV9TUEVFRF9NT0RFX01BU0spCisJCQkhPSBEV19JQ19DT01QX1BBUkFNXzFfU1BFRURfTU9ERV9ISUdIKSB7CisJCQlkZXZfZXJyKGRldi0+ZGV2LCAiSGlnaCBTcGVlZCBub3Qgc3VwcG9ydGVkIVxuIik7CisJCQlkZXYtPm1hc3Rlcl9jZmcgJj0gfkRXX0lDX0NPTl9TUEVFRF9NQVNLOworCQkJZGV2LT5tYXN0ZXJfY2ZnIHw9IERXX0lDX0NPTl9TUEVFRF9GQVNUOworCQl9IGVsc2UgaWYgKGRldi0+aHNfaGNudCAmJiBkZXYtPmhzX2xjbnQpIHsKKwkJCWhjbnQgPSBkZXYtPmhzX2hjbnQ7CisJCQlsY250ID0gZGV2LT5oc19sY250OworCQkJZHdfd3JpdGVsKGRldiwgaGNudCwgRFdfSUNfSFNfU0NMX0hDTlQpOworCQkJZHdfd3JpdGVsKGRldiwgbGNudCwgRFdfSUNfSFNfU0NMX0xDTlQpOworCQkJZGV2X2RiZyhkZXYtPmRldiwgIkhpZ2hTcGVlZC1tb2RlIEhDTlQ6TENOVCA9ICVkOiVkXG4iLAorCQkJCWhjbnQsIGxjbnQpOworCQl9CisJfQorCiAJLyogQ29uZmlndXJlIFNEQSBIb2xkIFRpbWUgaWYgcmVxdWlyZWQgKi8KLQlpZiAoZGV2LT5zZGFfaG9sZF90aW1lKSB7Ci0JCXJlZyA9IGR3X3JlYWRsKGRldiwgRFdfSUNfQ09NUF9WRVJTSU9OKTsKLQkJaWYgKHJlZyA+PSBEV19JQ19TREFfSE9MRF9NSU5fVkVSUykKKwlyZWcgPSBkd19yZWFkbChkZXYsIERXX0lDX0NPTVBfVkVSU0lPTik7CisJaWYgKHJlZyA+PSBEV19JQ19TREFfSE9MRF9NSU5fVkVSUykgeworCQlpZiAoZGV2LT5zZGFfaG9sZF90aW1lKSB7CiAJCQlkd193cml0ZWwoZGV2LCBkZXYtPnNkYV9ob2xkX3RpbWUsIERXX0lDX1NEQV9IT0xEKTsKLQkJZWxzZQotCQkJZGV2X3dhcm4oZGV2LT5kZXYsCi0JCQkJIkhhcmR3YXJlIHRvbyBvbGQgdG8gYWRqdXN0IFNEQSBob2xkIHRpbWUuIik7CisJCX0gZWxzZSB7CisJCQkvKiBLZWVwIHByZXZpb3VzIGhvbGQgdGltZSBzZXR0aW5nIGlmIG5vIG9uZSBzZXQgaXQgKi8KKwkJCWRldi0+c2RhX2hvbGRfdGltZSA9IGR3X3JlYWRsKGRldiwgRFdfSUNfU0RBX0hPTEQpOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oZGV2LT5kZXYsCisJCQkiSGFyZHdhcmUgdG9vIG9sZCB0byBhZGp1c3QgU0RBIGhvbGQgdGltZS5cbiIpOwogCX0KIAogCS8qIENvbmZpZ3VyZSBUeC9SeCBGSUZPIHRocmVzaG9sZCBsZXZlbHMgKi8KQEAgLTM4Myw4ICs0MzgsOCBAQAogCS8qIGNvbmZpZ3VyZSB0aGUgaTJjIG1hc3RlciAqLwogCWR3X3dyaXRlbChkZXYsIGRldi0+bWFzdGVyX2NmZyAsIERXX0lDX0NPTik7CiAKLQlpZiAoZGV2LT5yZWxlYXNlX2xvY2spCi0JCWRldi0+cmVsZWFzZV9sb2NrKGRldik7CisJaTJjX2R3X3JlbGVhc2VfbG9jayhkZXYpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpMmNfZHdfaW5pdCk7CkBAIC00MTEsMjcgKzQ2Niw0NSBAQAogc3RhdGljIHZvaWQgaTJjX2R3X3hmZXJfaW5pdChzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQogewogCXN0cnVjdCBpMmNfbXNnICptc2dzID0gZGV2LT5tc2dzOwotCXUzMiBpY19jb24sIGljX3RhciA9IDA7CisJdTMyIGljX3RhciA9IDA7CisJYm9vbCBlbmFibGVkOwogCi0JLyogRGlzYWJsZSB0aGUgYWRhcHRlciAqLwotCV9faTJjX2R3X2VuYWJsZShkZXYsIGZhbHNlKTsKKwllbmFibGVkID0gZHdfcmVhZGwoZGV2LCBEV19JQ19FTkFCTEVfU1RBVFVTKSAmIDE7CiAKLQkvKiBpZiB0aGUgc2xhdmUgYWRkcmVzcyBpcyB0ZW4gYml0IGFkZHJlc3MsIGVuYWJsZSAxMEJJVEFERFIgKi8KLQlpY19jb24gPSBkd19yZWFkbChkZXYsIERXX0lDX0NPTik7Ci0JaWYgKG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5mbGFncyAmIEkyQ19NX1RFTikgewotCQlpY19jb24gfD0gRFdfSUNfQ09OXzEwQklUQUREUl9NQVNURVI7CisJaWYgKGVuYWJsZWQpIHsKKwkJdTMyIGljX3N0YXR1czsKKwogCQkvKgotCQkgKiBJZiBJMkNfRFlOQU1JQ19UQVJfVVBEQVRFIGlzIHNldCwgdGhlIDEwLWJpdCBhZGRyZXNzaW5nCi0JCSAqIG1vZGUgaGFzIHRvIGJlIGVuYWJsZWQgdmlhIGJpdCAxMiBvZiBJQ19UQVIgcmVnaXN0ZXIuCi0JCSAqIFdlIHNldCBpdCBhbHdheXMgYXMgSTJDX0RZTkFNSUNfVEFSX1VQREFURSBjYW4ndCBiZQotCQkgKiBkZXRlY3RlZCBmcm9tIHJlZ2lzdGVycy4KKwkJICogT25seSBkaXNhYmxlIGFkYXB0ZXIgaWYgaWNfdGFyIGFuZCBpY19jb24gY2FuJ3QgYmUKKwkJICogZHluYW1pY2FsbHkgdXBkYXRlZAogCQkgKi8KLQkJaWNfdGFyID0gRFdfSUNfVEFSXzEwQklUQUREUl9NQVNURVI7Ci0JfSBlbHNlIHsKLQkJaWNfY29uICY9IH5EV19JQ19DT05fMTBCSVRBRERSX01BU1RFUjsKKwkJaWNfc3RhdHVzID0gZHdfcmVhZGwoZGV2LCBEV19JQ19TVEFUVVMpOworCQlpZiAoIWRldi0+ZHluYW1pY190YXJfdXBkYXRlX2VuYWJsZWQgfHwKKwkJICAgIChpY19zdGF0dXMgJiBEV19JQ19TVEFUVVNfTVNUX0FDVElWSVRZKSB8fAorCQkgICAgIShpY19zdGF0dXMgJiBEV19JQ19TVEFUVVNfVEZFKSkgeworCQkJX19pMmNfZHdfZW5hYmxlX2FuZF93YWl0KGRldiwgZmFsc2UpOworCQkJZW5hYmxlZCA9IGZhbHNlOworCQl9CiAJfQogCi0JZHdfd3JpdGVsKGRldiwgaWNfY29uLCBEV19JQ19DT04pOworCS8qIGlmIHRoZSBzbGF2ZSBhZGRyZXNzIGlzIHRlbiBiaXQgYWRkcmVzcywgZW5hYmxlIDEwQklUQUREUiAqLworCWlmIChkZXYtPmR5bmFtaWNfdGFyX3VwZGF0ZV9lbmFibGVkKSB7CisJCS8qCisJCSAqIElmIEkyQ19EWU5BTUlDX1RBUl9VUERBVEUgaXMgc2V0LCB0aGUgMTAtYml0IGFkZHJlc3NpbmcKKwkJICogbW9kZSBoYXMgdG8gYmUgZW5hYmxlZCB2aWEgYml0IDEyIG9mIElDX1RBUiByZWdpc3RlciwKKwkJICogb3RoZXJ3aXNlIGJpdCA0IG9mIElDX0NPTiBpcyB1c2VkLgorCQkgKi8KKwkJaWYgKG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5mbGFncyAmIEkyQ19NX1RFTikKKwkJCWljX3RhciA9IERXX0lDX1RBUl8xMEJJVEFERFJfTUFTVEVSOworCX0gZWxzZSB7CisJCXUzMiBpY19jb24gPSBkd19yZWFkbChkZXYsIERXX0lDX0NPTik7CisKKwkJaWYgKG1zZ3NbZGV2LT5tc2dfd3JpdGVfaWR4XS5mbGFncyAmIEkyQ19NX1RFTikKKwkJCWljX2NvbiB8PSBEV19JQ19DT05fMTBCSVRBRERSX01BU1RFUjsKKwkJZWxzZQorCQkJaWNfY29uICY9IH5EV19JQ19DT05fMTBCSVRBRERSX01BU1RFUjsKKwkJZHdfd3JpdGVsKGRldiwgaWNfY29uLCBEV19JQ19DT04pOworCX0KIAogCS8qCiAJICogU2V0IHRoZSBzbGF2ZSAodGFyZ2V0KSBhZGRyZXNzIGFuZCBlbmFibGUgMTAtYml0IGFkZHJlc3NpbmcgbW9kZQpAQCAtNDQyLDggKzUxNSw4IEBACiAJLyogZW5mb3JjZSBkaXNhYmxlZCBpbnRlcnJ1cHRzIChkdWUgdG8gSFcgaXNzdWVzKSAqLwogCWkyY19kd19kaXNhYmxlX2ludChkZXYpOwogCi0JLyogRW5hYmxlIHRoZSBhZGFwdGVyICovCi0JX19pMmNfZHdfZW5hYmxlKGRldiwgdHJ1ZSk7CisJaWYgKCFlbmFibGVkKQorCQlfX2kyY19kd19lbmFibGUoZGV2LCB0cnVlKTsKIAogCS8qIENsZWFyIGFuZCBlbmFibGUgaW50ZXJydXB0cyAqLwogCWR3X3JlYWRsKGRldiwgRFdfSUNfQ0xSX0lOVFIpOwpAQCAtNjI0LDcgKzY5Nyw4IEBACiB9CiAKIC8qCi0gKiBQcmVwYXJlIGNvbnRyb2xsZXIgZm9yIGEgdHJhbnNhY3Rpb24gYW5kIGNhbGwgaTJjX2R3X3hmZXJfbXNnCisgKiBQcmVwYXJlIGNvbnRyb2xsZXIgZm9yIGEgdHJhbnNhY3Rpb24gYW5kIHN0YXJ0IHRyYW5zZmVyIGJ5IGNhbGxpbmcKKyAqIGkyY19kd194ZmVyX2luaXQoKQogICovCiBzdGF0aWMgaW50CiBpMmNfZHdfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnIG1zZ3NbXSwgaW50IG51bSkKQEAgLTY0NywxMyArNzIxLDkgQEAKIAlkZXYtPmFib3J0X3NvdXJjZSA9IDA7CiAJZGV2LT5yeF9vdXRzdGFuZGluZyA9IDA7CiAKLQlpZiAoZGV2LT5hY3F1aXJlX2xvY2spIHsKLQkJcmV0ID0gZGV2LT5hY3F1aXJlX2xvY2soZGV2KTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkZXYtPmRldiwgImNvdWxkbid0IGFjcXVpcmUgYnVzIG93bmVyc2hpcFxuIik7Ci0JCQlnb3RvIGRvbmVfbm9sb2NrOwotCQl9Ci0JfQorCXJldCA9IGkyY19kd19hY3F1aXJlX2xvY2soZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmVfbm9sb2NrOwogCiAJcmV0ID0gaTJjX2R3X3dhaXRfYnVzX25vdF9idXN5KGRldik7CiAJaWYgKHJldCA8IDApCkBAIC02NzEsMTYgKzc0MSw2IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQkvKgotCSAqIFdlIG11c3QgZGlzYWJsZSB0aGUgYWRhcHRlciBiZWZvcmUgcmV0dXJuaW5nIGFuZCBzaWduYWxpbmcgdGhlIGVuZAotCSAqIG9mIHRoZSBjdXJyZW50IHRyYW5zZmVyLiBPdGhlcndpc2UgdGhlIGhhcmR3YXJlIG1pZ2h0IGNvbnRpbnVlCi0JICogZ2VuZXJhdGluZyBpbnRlcnJ1cHRzIHdoaWNoIGluIHR1cm4gY2F1c2VzIGEgcmFjZSBjb25kaXRpb24gd2l0aAotCSAqIHRoZSBmb2xsb3dpbmcgdHJhbnNmZXIuICBOZWVkcyBzb21lIG1vcmUgaW52ZXN0aWdhdGlvbiBpZiB0aGUKLQkgKiBhZGRpdGlvbmFsIGludGVycnVwdHMgYXJlIGEgaGFyZHdhcmUgYnVnIG9yIHRoaXMgZHJpdmVyIGRvZXNuJ3QKLQkgKiBoYW5kbGUgdGhlbSBjb3JyZWN0bHkgeWV0LgotCSAqLwotCV9faTJjX2R3X2VuYWJsZShkZXYsIGZhbHNlKTsKLQogCWlmIChkZXYtPm1zZ19lcnIpIHsKIAkJcmV0ID0gZGV2LT5tc2dfZXJyOwogCQlnb3RvIGRvbmU7CkBAIC03MDAsOCArNzYwLDcgQEAKIAlyZXQgPSAtRUlPOwogCiBkb25lOgotCWlmIChkZXYtPnJlbGVhc2VfbG9jaykKLQkJZGV2LT5yZWxlYXNlX2xvY2soZGV2KTsKKwlpMmNfZHdfcmVsZWFzZV9sb2NrKGRldik7CiAKIGRvbmVfbm9sb2NrOgogCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZGV2LT5kZXYpOwpAQCAtODE4LDkgKzg3NywxOSBAQAogCSAqLwogCiB0eF9hYm9ydGVkOgotCWlmICgoc3RhdCAmIChEV19JQ19JTlRSX1RYX0FCUlQgfCBEV19JQ19JTlRSX1NUT1BfREVUKSkgfHwgZGV2LT5tc2dfZXJyKQorCWlmICgoc3RhdCAmIChEV19JQ19JTlRSX1RYX0FCUlQgfCBEV19JQ19JTlRSX1NUT1BfREVUKSkKKwkJCXx8IGRldi0+bXNnX2VycikgeworCQkvKgorCQkgKiBXZSBtdXN0IGRpc2FibGUgaW50ZXJydXRzIGJlZm9yZSByZXR1cm5pbmcgYW5kIHNpZ25hbGluZworCQkgKiB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHRyYW5zZmVyLiBPdGhlcndpc2UgdGhlIGhhcmR3YXJlCisJCSAqIG1pZ2h0IGNvbnRpbnVlIGdlbmVyYXRpbmcgaW50ZXJydXB0cyBmb3Igbm9uLWV4aXN0ZW50CisJCSAqIHRyYW5zZmVycy4KKwkJICovCisJCWkyY19kd19kaXNhYmxlX2ludChkZXYpOworCQlkd19yZWFkbChkZXYsIERXX0lDX0NMUl9JTlRSKTsKKwogCQljb21wbGV0ZSgmZGV2LT5jbWRfY29tcGxldGUpOwotCWVsc2UgaWYgKHVubGlrZWx5KGRldi0+YWNjZXNzb3JfZmxhZ3MgJiBBQ0NFU1NfSU5UUl9NQVNLKSkgeworCX0gZWxzZSBpZiAodW5saWtlbHkoZGV2LT5hY2Nlc3Nvcl9mbGFncyAmIEFDQ0VTU19JTlRSX01BU0spKSB7CiAJCS8qIHdvcmthcm91bmQgdG8gdHJpZ2dlciBwZW5kaW5nIGludGVycnVwdCAqLwogCQlzdGF0ID0gZHdfcmVhZGwoZGV2LCBEV19JQ19JTlRSX01BU0spOwogCQlpMmNfZHdfZGlzYWJsZV9pbnQoZGV2KTsKQEAgLTgzMyw3ICs5MDIsNyBAQAogdm9pZCBpMmNfZHdfZGlzYWJsZShzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KQogewogCS8qIERpc2FibGUgY29udHJvbGxlciAqLwotCV9faTJjX2R3X2VuYWJsZShkZXYsIGZhbHNlKTsKKwlfX2kyY19kd19lbmFibGVfYW5kX3dhaXQoZGV2LCBmYWxzZSk7CiAKIAkvKiBEaXNhYmxlIGFsbCBpbnRlcnVwdHMgKi8KIAlkd193cml0ZWwoZGV2LCAwLCBEV19JQ19JTlRSX01BU0spOwpAQCAtODU3LDYgKzkyNiw3IEBACiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gJmRldi0+YWRhcHRlcjsKIAlpbnQgcjsKKwl1MzIgcmVnOwogCiAJaW5pdF9jb21wbGV0aW9uKCZkZXYtPmNtZF9jb21wbGV0ZSk7CiAKQEAgLTg2NCw2ICs5MzQsMjYgQEAKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKKwlyID0gaTJjX2R3X2FjcXVpcmVfbG9jayhkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCS8qCisJICogVGVzdCBpZiBkeW5hbWljIFRBUiB1cGRhdGUgaXMgZW5hYmxlZCBpbiB0aGlzIGNvbnRyb2xsZXIgYnkgd3JpdGluZworCSAqIHRvIElDXzEwQklUQUREUl9NQVNURVIgZmllbGQgaW4gSUNfQ09OOiB3aGVuIGl0IGlzIGVuYWJsZWQgdGhpcworCSAqIGZpZWxkIGlzIHJlYWQtb25seSBzbyBpdCBzaG91bGQgbm90IHN1Y2NlZWQKKwkgKi8KKwlyZWcgPSBkd19yZWFkbChkZXYsIERXX0lDX0NPTik7CisJZHdfd3JpdGVsKGRldiwgcmVnIF4gRFdfSUNfQ09OXzEwQklUQUREUl9NQVNURVIsIERXX0lDX0NPTik7CisKKwlpZiAoKGR3X3JlYWRsKGRldiwgRFdfSUNfQ09OKSAmIERXX0lDX0NPTl8xMEJJVEFERFJfTUFTVEVSKSA9PQorCSAgICAocmVnICYgRFdfSUNfQ09OXzEwQklUQUREUl9NQVNURVIpKSB7CisJCWRldi0+ZHluYW1pY190YXJfdXBkYXRlX2VuYWJsZWQgPSB0cnVlOworCQlkZXZfZGJnKGRldi0+ZGV2LCAiRHluYW1pYyBUQVIgdXBkYXRlIGVuYWJsZWQiKTsKKwl9CisKKwlpMmNfZHdfcmVsZWFzZV9sb2NrKGRldik7CisKIAlzbnByaW50ZihhZGFwLT5uYW1lLCBzaXplb2YoYWRhcC0+bmFtZSksCiAJCSAiU3lub3BzeXMgRGVzaWduV2FyZSBJMkMgYWRhcHRlciIpOwogCWFkYXAtPnJldHJpZXMgPSAzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuaCBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1jb3JlLmgKaW5kZXggMzg0OTNhNy4uMGQ0NGQyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuaAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtY29yZS5oCkBAIC0yNiw2ICsyNiw3IEBACiAjZGVmaW5lIERXX0lDX0NPTl9NQVNURVIJCTB4MQogI2RlZmluZSBEV19JQ19DT05fU1BFRURfU1RECQkweDIKICNkZWZpbmUgRFdfSUNfQ09OX1NQRUVEX0ZBU1QJCTB4NAorI2RlZmluZSBEV19JQ19DT05fU1BFRURfSElHSAkJMHg2CiAjZGVmaW5lIERXX0lDX0NPTl9TUEVFRF9NQVNLCQkweDYKICNkZWZpbmUgRFdfSUNfQ09OXzEwQklUQUREUl9NQVNURVIJMHgxMAogI2RlZmluZSBEV19JQ19DT05fUkVTVEFSVF9FTgkJMHgyMApAQCAtNTcsMTAgKzU4LDE1IEBACiAgKiBAdHhfZmlmb19kZXB0aDogZGVwdGggb2YgdGhlIGhhcmR3YXJlIHR4IGZpZm8KICAqIEByeF9maWZvX2RlcHRoOiBkZXB0aCBvZiB0aGUgaGFyZHdhcmUgcnggZmlmbwogICogQHJ4X291dHN0YW5kaW5nOiBjdXJyZW50IG1hc3Rlci1yeCBlbGVtZW50cyBpbiB0eCBmaWZvCisgKiBAY2xrX2ZyZXE6IGJ1cyBjbG9jayBmcmVxdWVuY3kKICAqIEBzc19oY250OiBzdGFuZGFyZCBzcGVlZCBIQ05UIHZhbHVlCiAgKiBAc3NfbGNudDogc3RhbmRhcmQgc3BlZWQgTENOVCB2YWx1ZQogICogQGZzX2hjbnQ6IGZhc3Qgc3BlZWQgSENOVCB2YWx1ZQogICogQGZzX2xjbnQ6IGZhc3Qgc3BlZWQgTENOVCB2YWx1ZQorICogQGZwX2hjbnQ6IGZhc3QgcGx1cyBIQ05UIHZhbHVlCisgKiBAZnBfbGNudDogZmFzdCBwbHVzIExDTlQgdmFsdWUKKyAqIEBoc19oY250OiBoaWdoIHNwZWVkIEhDTlQgdmFsdWUKKyAqIEBoc19sY250OiBoaWdoIHNwZWVkIExDTlQgdmFsdWUKICAqIEBhY3F1aXJlX2xvY2s6IGZ1bmN0aW9uIHRvIGFjcXVpcmUgYSBoYXJkd2FyZSBsb2NrIG9uIHRoZSBidXMKICAqIEByZWxlYXNlX2xvY2s6IGZ1bmN0aW9uIHRvIHJlbGVhc2UgYSBoYXJkd2FyZSBsb2NrIG9uIHRoZSBidXMKICAqIEBwbV9ydW50aW1lX2Rpc2FibGVkOiB0cnVlIGlmIHBtIHJ1bnRpbWUgaXMgZGlzYWJsZWQKQEAgLTk2LDYgKzEwMiw3IEBACiAJdW5zaWduZWQgaW50CQl0eF9maWZvX2RlcHRoOwogCXVuc2lnbmVkIGludAkJcnhfZmlmb19kZXB0aDsKIAlpbnQJCQlyeF9vdXRzdGFuZGluZzsKKwl1MzIJCQljbGtfZnJlcTsKIAl1MzIJCQlzZGFfaG9sZF90aW1lOwogCXUzMgkJCXNkYV9mYWxsaW5nX3RpbWU7CiAJdTMyCQkJc2NsX2ZhbGxpbmdfdGltZTsKQEAgLTEwMyw5ICsxMTAsMTQgQEAKIAl1MTYJCQlzc19sY250OwogCXUxNgkJCWZzX2hjbnQ7CiAJdTE2CQkJZnNfbGNudDsKKwl1MTYJCQlmcF9oY250OworCXUxNgkJCWZwX2xjbnQ7CisJdTE2CQkJaHNfaGNudDsKKwl1MTYJCQloc19sY250OwogCWludAkJCSgqYWNxdWlyZV9sb2NrKShzdHJ1Y3QgZHdfaTJjX2RldiAqZGV2KTsKIAl2b2lkCQkJKCpyZWxlYXNlX2xvY2spKHN0cnVjdCBkd19pMmNfZGV2ICpkZXYpOwogCWJvb2wJCQlwbV9ydW50aW1lX2Rpc2FibGVkOworCWJvb2wJCQlkeW5hbWljX3Rhcl91cGRhdGVfZW5hYmxlZDsKIH07CiAKICNkZWZpbmUgQUNDRVNTX1NXQVAJCTB4MDAwMDAwMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1wbGF0ZHJ2LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtcGxhdGRydi5jCmluZGV4IGQ2NTY2NTcuLjBiNDJhMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1wbGF0ZHJ2LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLXBsYXRkcnYuYwpAQCAtMTA3LDYgKzEwNyw4IEBACiAJZHdfaTJjX2FjcGlfcGFyYW1zKHBkZXYsICJTU0NOIiwgJmRldi0+c3NfaGNudCwgJmRldi0+c3NfbGNudCwgTlVMTCk7CiAJZHdfaTJjX2FjcGlfcGFyYW1zKHBkZXYsICJGTUNOIiwgJmRldi0+ZnNfaGNudCwgJmRldi0+ZnNfbGNudCwKIAkJCSAgICZkZXYtPnNkYV9ob2xkX3RpbWUpOworCWR3X2kyY19hY3BpX3BhcmFtcyhwZGV2LCAiRlBDTiIsICZkZXYtPmZwX2hjbnQsICZkZXYtPmZwX2xjbnQsIE5VTEwpOworCWR3X2kyY19hY3BpX3BhcmFtcyhwZGV2LCAiSFNDTiIsICZkZXYtPmhzX2hjbnQsICZkZXYtPmhzX2xjbnQsIE5VTEwpOwogCiAJaWQgPSBhY3BpX21hdGNoX2RldmljZShwZGV2LT5kZXYuZHJpdmVyLT5hY3BpX21hdGNoX3RhYmxlLCAmcGRldi0+ZGV2KTsKIAlpZiAoaWQgJiYgaWQtPmRyaXZlcl9kYXRhKQpAQCAtMTU1LDcgKzE1Nyw3IEBACiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwOwogCXN0cnVjdCByZXNvdXJjZSAqbWVtOwogCWludCBpcnEsIHI7Ci0JdTMyIGNsa19mcmVxLCBodCA9IDA7CisJdTMyIGFjcGlfc3BlZWQsIGh0ID0gMDsKIAogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJaWYgKGlycSA8IDApCkBAIC0xNzUsMTAgKzE3NywxMCBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKIAkvKiBmYXN0IG1vZGUgYnkgZGVmYXVsdCBiZWNhdXNlIG9mIGxlZ2FjeSByZWFzb25zICovCi0JY2xrX2ZyZXEgPSA0MDAwMDA7CisJZGV2LT5jbGtfZnJlcSA9IDQwMDAwMDsKIAogCWlmIChwZGF0YSkgewotCQljbGtfZnJlcSA9IHBkYXRhLT5pMmNfc2NsX2ZyZXE7CisJCWRldi0+Y2xrX2ZyZXEgPSBwZGF0YS0+aTJjX3NjbF9mcmVxOwogCX0gZWxzZSB7CiAJCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMigmcGRldi0+ZGV2LCAiaTJjLXNkYS1ob2xkLXRpbWUtbnMiLAogCQkJCQkgJmh0KTsKQEAgLTE4NywxNyArMTg5LDI0IEBACiAJCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMigmcGRldi0+ZGV2LCAiaTJjLXNjbC1mYWxsaW5nLXRpbWUtbnMiLAogCQkJCQkgJmRldi0+c2NsX2ZhbGxpbmdfdGltZSk7CiAJCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMigmcGRldi0+ZGV2LCAiY2xvY2stZnJlcXVlbmN5IiwKLQkJCQkJICZjbGtfZnJlcSk7CisJCQkJCSAmZGV2LT5jbGtfZnJlcSk7CiAJfQogCisJYWNwaV9zcGVlZCA9IGkyY19hY3BpX2ZpbmRfYnVzX3NwZWVkKCZwZGV2LT5kZXYpOworCWlmIChhY3BpX3NwZWVkKQorCQlkZXYtPmNsa19mcmVxID0gYWNwaV9zcGVlZDsKKwogCWlmIChoYXNfYWNwaV9jb21wYW5pb24oJnBkZXYtPmRldikpCiAJCWR3X2kyY19hY3BpX2NvbmZpZ3VyZShwZGV2KTsKIAogCS8qCi0JICogT25seSBzdGFuZGFyZCBtb2RlIGF0IDEwMGtIeiBhbmQgZmFzdCBtb2RlIGF0IDQwMGtIeiBhcmUgc3VwcG9ydGVkLgorCSAqIE9ubHkgc3RhbmRhcmQgbW9kZSBhdCAxMDBrSHosIGZhc3QgbW9kZSBhdCA0MDBrSHosCisJICogZmFzdCBtb2RlIHBsdXMgYXQgMU1IeiBhbmQgaGlnaCBzcGVlZCBtb2RlIGF0IDMuNE1IeiBhcmUgc3VwcG9ydGVkLgogCSAqLwotCWlmIChjbGtfZnJlcSAhPSAxMDAwMDAgJiYgY2xrX2ZyZXEgIT0gNDAwMDAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIk9ubHkgMTAwa0h6IGFuZCA0MDBrSHogc3VwcG9ydGVkIik7CisJaWYgKGRldi0+Y2xrX2ZyZXEgIT0gMTAwMDAwICYmIGRldi0+Y2xrX2ZyZXEgIT0gNDAwMDAwCisJICAgICYmIGRldi0+Y2xrX2ZyZXEgIT0gMTAwMDAwMCAmJiBkZXYtPmNsa19mcmVxICE9IDM0MDAwMDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIk9ubHkgMTAwa0h6LCA0MDBrSHosIDFNSHogYW5kIDMuNE1IeiBzdXBwb3J0ZWQiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMTIsMTIgKzIyMSwyMCBAQAogCQlJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEgfAogCQlJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfAogCQlJMkNfRlVOQ19TTUJVU19JMkNfQkxPQ0s7Ci0JaWYgKGNsa19mcmVxID09IDEwMDAwMCkKLQkJZGV2LT5tYXN0ZXJfY2ZnID0gIERXX0lDX0NPTl9NQVNURVIgfCBEV19JQ19DT05fU0xBVkVfRElTQUJMRSB8Ci0JCQlEV19JQ19DT05fUkVTVEFSVF9FTiB8IERXX0lDX0NPTl9TUEVFRF9TVEQ7Ci0JZWxzZQotCQlkZXYtPm1hc3Rlcl9jZmcgPSAgRFdfSUNfQ09OX01BU1RFUiB8IERXX0lDX0NPTl9TTEFWRV9ESVNBQkxFIHwKLQkJCURXX0lDX0NPTl9SRVNUQVJUX0VOIHwgRFdfSUNfQ09OX1NQRUVEX0ZBU1Q7CisKKwlkZXYtPm1hc3Rlcl9jZmcgPSBEV19JQ19DT05fTUFTVEVSIHwgRFdfSUNfQ09OX1NMQVZFX0RJU0FCTEUgfAorCQkJICBEV19JQ19DT05fUkVTVEFSVF9FTjsKKworCXN3aXRjaCAoZGV2LT5jbGtfZnJlcSkgeworCWNhc2UgMTAwMDAwOgorCQlkZXYtPm1hc3Rlcl9jZmcgfD0gRFdfSUNfQ09OX1NQRUVEX1NURDsKKwkJYnJlYWs7CisJY2FzZSAzNDAwMDAwOgorCQlkZXYtPm1hc3Rlcl9jZmcgfD0gRFdfSUNfQ09OX1NQRUVEX0hJR0g7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldi0+bWFzdGVyX2NmZyB8PSBEV19JQ19DT05fU1BFRURfRkFTVDsKKwl9CiAKIAlkZXYtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoIWkyY19kd19wbGF0X3ByZXBhcmVfY2xrKGRldiwgdHJ1ZSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGlvbGFuLXUyYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kaW9sYW4tdTJjLmMKaW5kZXggYjE5YTMxMC4uZjcxOGVlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kaW9sYW4tdTJjLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kaW9sYW4tdTJjLmMKQEAgLTQ4NywxMCArNDg3LDggQEAKIAogCS8qIGFuZCBmaW5hbGx5IGF0dGFjaCB0byBpMmMgbGF5ZXIgKi8KIAlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJmRldi0+YWRhcHRlcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJmYWlsZWQgdG8gYWRkIEkyQyBhZGFwdGVyXG4iKTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcl9mcmVlOwotCX0KIAogCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAiY29ubmVjdGVkICIgRFJJVkVSX05BTUUgIlxuIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGxuMi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kbG4yLmMKaW5kZXggZjJlYjRmNy4uOGFjZGEyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kbG4yLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kbG4yLmMKQEAgLTIyOCwxMCArMjI4LDggQEAKIAogCS8qIGFuZCBmaW5hbGx5IGF0dGFjaCB0byBpMmMgbGF5ZXIgKi8KIAlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJmRsbjItPmFkYXB0ZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFkZCBJMkMgYWRhcHRlcjogJWRcbiIsIHJldCk7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X2Rpc2FibGU7Ci0JfQogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWZtMzIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWZtMzIuYwppbmRleCBlMjUzNTk4Li5hYTMzNmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVmbTMyLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1lZm0zMi5jCkBAIC00MzgsNyArNDM4LDYgQEAKIAogCXJldCA9IGkyY19hZGRfYWRhcHRlcigmZGRhdGEtPmFkYXB0ZXIpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBpMmMgYWRhcHRlciAoJWQpXG4iLCByZXQpOwogCQlmcmVlX2lycShkZGF0YS0+aXJxLCBkZGF0YSk7CiAKIGVycl9kaXNhYmxlX2NsazoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYwppbmRleCAxMzcxMjViLi41Y2U3MWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVnMjB0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1lZzIwdC5jCkBAIC03NzMsMTMgKzc3Myw2IEBACiAJLyogU2V0IHRoZSBudW1iZXIgb2YgSTJDIGNoYW5uZWwgaW5zdGFuY2UgKi8KIAlhZGFwX2luZm8tPmNoX251bSA9IGlkLT5kcml2ZXJfZGF0YTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgcGNoX2kyY19oYW5kbGVyLCBJUlFGX1NIQVJFRCwKLQkJICBLQlVJTERfTU9ETkFNRSwgYWRhcF9pbmZvKTsKLQlpZiAocmV0KSB7Ci0JCXBjaF9wY2lfZXJyKHBkZXYsICJyZXF1ZXN0X2lycSBGQUlMRURcbiIpOwotCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKLQl9Ci0KIAlmb3IgKGkgPSAwOyBpIDwgYWRhcF9pbmZvLT5jaF9udW07IGkrKykgewogCQlwY2hfYWRhcCA9ICZhZGFwX2luZm8tPnBjaF9kYXRhW2ldLnBjaF9hZGFwdGVyOwogCQlhZGFwX2luZm8tPnBjaF9pMmNfc3VzcGVuZGVkID0gZmFsc2U7CkBAIC03OTcsNiArNzkwLDE3IEBACiAKIAkJcGNoX2FkYXAtPmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJCXBjaF9hZGFwLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHBjaF9pMmNfaGFuZGxlciwgSVJRRl9TSEFSRUQsCisJCSAgS0JVSUxEX01PRE5BTUUsIGFkYXBfaW5mbyk7CisJaWYgKHJldCkgeworCQlwY2hfcGNpX2VycihwZGV2LCAicmVxdWVzdF9pcnEgRkFJTEVEXG4iKTsKKwkJZ290byBlcnJfcmVxdWVzdF9pcnE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFkYXBfaW5mby0+Y2hfbnVtOyBpKyspIHsKKwkJcGNoX2FkYXAgPSAmYWRhcF9pbmZvLT5wY2hfZGF0YVtpXS5wY2hfYWRhcHRlcjsKIAogCQlwY2hfaTJjX2luaXQoJmFkYXBfaW5mby0+cGNoX2RhdGFbaV0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWV4eW5vczUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZXh5bm9zNS5jCmluZGV4IGMwZTNhZGEuLmJlYTYwNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZXh5bm9zNS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZXh5bm9zNS5jCkBAIC03OTYsMTAgKzc5Niw4IEBACiAJZXh5bm9zNV9pMmNfcmVzZXQoaTJjKTsKIAogCXJldCA9IGkyY19hZGRfYWRhcHRlcigmaTJjLT5hZGFwKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWRkIGJ1cyB0byBpMmMgY29yZVxuIik7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX2NsazsKLQl9CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpMmMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWhpeDVoZDIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaGl4NWhkMi5jCmluZGV4IDdjNjk2NjQuLmFlN2YzMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaGl4NWhkMi5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaGl4NWhkMi5jCkBAIC00NzgsMTAgKzQ3OCw4IEBACiAJcG1fcnVudGltZV9lbmFibGUocHJpdi0+ZGV2KTsKIAogCXJldCA9IGkyY19hZGRfYWRhcHRlcigmcHJpdi0+YWRhcCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBidXMgdG8gaTJjIGNvcmVcbiIpOworCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9ydW50aW1lOwotCX0KIAogCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKaW5kZXggNWVmOWI3My4uMDg4NDdlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKQEAgLTY0LDYgKzY0LDcgQEAKICAqIEJyb3h0b24gKFNPQykJCTB4NWFkNAkzMgloYXJkCXllcwl5ZXMJeWVzCiAgKiBMZXdpc2J1cmcgKFBDSCkJCTB4YTFhMwkzMgloYXJkCXllcwl5ZXMJeWVzCiAgKiBMZXdpc2J1cmcgU3VwZXJza3UgKFBDSCkJMHhhMjIzCTMyCWhhcmQJeWVzCXllcwl5ZXMKKyAqIEthYnkgTGFrZSBQQ0gtSCAoUENIKQkweGEyYTMJMzIJaGFyZAl5ZXMJeWVzCXllcwogICoKICAqIEZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlcjoKICAqIFNvZnR3YXJlIFBFQwkJCQlubwpAQCAtMjI2LDYgKzIyNyw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfU1VOUklTRVBPSU5UX0hfU01CVVMJMHhhMTIzCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfTEVXSVNCVVJHX1NNQlVTCQkweGExYTMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9MRVdJU0JVUkdfU1NLVV9TTUJVUwkweGEyMjMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9LQUJZTEFLRV9QQ0hfSF9TTUJVUwkweGEyYTMKIAogc3RydWN0IGk4MDFfbXV4X2NvbmZpZyB7CiAJY2hhciAqZ3Bpb19jaGlwOwpAQCAtMTAwNiw2ICsxMDA4LDcgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9CUk9YVE9OX1NNQlVTKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0xFV0lTQlVSR19TTUJVUykgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9MRVdJU0JVUkdfU1NLVV9TTUJVUykgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9LQUJZTEFLRV9QQ0hfSF9TTUJVUykgfSwKIAl7IDAsIH0KIH07CiAKQEAgLTE0ODIsMTEgKzE0ODUsMTQgQEAKIAljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTEVXSVNCVVJHX1NNQlVTOgogCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9MRVdJU0JVUkdfU1NLVV9TTUJVUzoKIAljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfRE5WX1NNQlVTOgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9LQUJZTEFLRV9QQ0hfSF9TTUJVUzoKIAkJcHJpdi0+ZmVhdHVyZXMgfD0gRkVBVFVSRV9JMkNfQkxPQ0tfUkVBRDsKIAkJcHJpdi0+ZmVhdHVyZXMgfD0gRkVBVFVSRV9JUlE7CiAJCXByaXYtPmZlYXR1cmVzIHw9IEZFQVRVUkVfU01CVVNfUEVDOwogCQlwcml2LT5mZWF0dXJlcyB8PSBGRUFUVVJFX0JMT0NLX0JVRkZFUjsKLQkJcHJpdi0+ZmVhdHVyZXMgfD0gRkVBVFVSRV9UQ087CisJCS8qIElmIHdlIGhhdmUgQUNQSSBiYXNlZCB3YXRjaGRvZyB1c2UgdGhhdCBpbnN0ZWFkICovCisJCWlmICghYWNwaV9oYXNfd2F0Y2hkb2coKSkKKwkJCXByaXYtPmZlYXR1cmVzIHw9IEZFQVRVUkVfVENPOwogCQlwcml2LT5mZWF0dXJlcyB8PSBGRUFUVVJFX0hPU1RfTk9USUZZOwogCQlicmVhazsKIApAQCAtMTYxMyw3ICsxNjE5LDYgQEAKIAkJIlNNQnVzIEk4MDEgYWRhcHRlciBhdCAlMDRseCIsIHByaXYtPnNtYmEpOwogCWVyciA9IGkyY19hZGRfYWRhcHRlcigmcHJpdi0+YWRhcHRlcik7CiAJaWYgKGVycikgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIkZhaWxlZCB0byBhZGQgU01CdXMgYWRhcHRlclxuIik7CiAJCWk4MDFfYWNwaV9yZW1vdmUocHJpdik7CiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pYm1faWljLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYwppbmRleCBjZGFhN2JlLi40MTJiOTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYwpAQCAtNzUxLDEwICs3NTEsOCBAQAogCWFkYXAtPnRpbWVvdXQgPSBIWjsKIAogCXJldCA9IGkyY19hZGRfYWRhcHRlcihhZGFwKTsKLQlpZiAocmV0ICA8IDApIHsKLQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBpMmMgYWRhcHRlclxuIik7CisJaWYgKHJldCAgPCAwKQogCQlnb3RvIGVycm9yX2NsZWFudXA7Ci0JfQogCiAJZGV2X2luZm8oJm9mZGV2LT5kZXYsICJ1c2luZyAlcyBtb2RlXG4iLAogCQkgZGV2LT5mYXN0X21vZGUgPyAiZmFzdCAoNDAwIGtIeikiIDogInN0YW5kYXJkICgxMDAga0h6KSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbWctc2NiLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWltZy1zY2IuYwppbmRleCBlYTIwNDI1Yi4uZGI4ZThiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbWctc2NiLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbWctc2NiLmMKQEAgLTEzOTQsMTAgKzEzOTQsOCBAQAogCQlnb3RvIGRpc2FibGVfY2xrOwogCiAJcmV0ID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKCZpMmMtPmFkYXApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhZGQgYWRhcHRlclxuIik7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gZGlzYWJsZV9jbGs7Ci0JfQogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW14LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlteC5jCmluZGV4IDE4NDRiYzkuLjU5MmE4ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW14LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbXguYwpAQCAtOTg0LDExICs5ODQsMjQgQEAKIAlwaW5jdHJsX3NlbGVjdF9zdGF0ZShpMmNfaW14LT5waW5jdHJsLCBpMmNfaW14LT5waW5jdHJsX3BpbnNfZGVmYXVsdCk7CiB9CiAKLXN0YXRpYyB2b2lkIGkyY19pbXhfaW5pdF9yZWNvdmVyeV9pbmZvKHN0cnVjdCBpbXhfaTJjX3N0cnVjdCAqaTJjX2lteCwKKy8qCisgKiBXZSBzd2l0Y2ggU0NMIGFuZCBTREEgdG8gdGhlaXIgR1BJTyBmdW5jdGlvbiBhbmQgZG8gc29tZSBiaXRiYW5naW5nCisgKiBmb3IgYnVzIHJlY292ZXJ5LiBUaGVzZSBhbHRlcm5hdGl2ZSBwaW5tdXggc2V0dGluZ3MgY2FuIGJlCisgKiBkZXNjcmliZWQgaW4gdGhlIGRldmljZSB0cmVlIGJ5IGEgc2VwYXJhdGUgcGluY3RybCBzdGF0ZSAiZ3BpbyIuIElmCisgKiB0aGlzIGlzIG1pc3NpbmcgdGhpcyBpcyBub3QgYSBiaWcgcHJvYmxlbSwgdGhlIG9ubHkgaW1wbGljYXRpb24gaXMKKyAqIHRoYXQgd2UgY2FuJ3QgZG8gYnVzIHJlY292ZXJ5LgorICovCitzdGF0aWMgaW50IGkyY19pbXhfaW5pdF9yZWNvdmVyeV9pbmZvKHN0cnVjdCBpbXhfaTJjX3N0cnVjdCAqaTJjX2lteCwKIAkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgaTJjX2J1c19yZWNvdmVyeV9pbmZvICpyaW5mbyA9ICZpMmNfaW14LT5yaW5mbzsKIAorCWkyY19pbXgtPnBpbmN0cmwgPSBkZXZtX3BpbmN0cmxfZ2V0KCZwZGV2LT5kZXYpOworCWlmICghaTJjX2lteC0+cGluY3RybCB8fCBJU19FUlIoaTJjX2lteC0+cGluY3RybCkpIHsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgImNhbid0IGdldCBwaW5jdHJsLCBidXMgcmVjb3Zlcnkgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiBQVFJfRVJSKGkyY19pbXgtPnBpbmN0cmwpOworCX0KKwogCWkyY19pbXgtPnBpbmN0cmxfcGluc19kZWZhdWx0ID0gcGluY3RybF9sb29rdXBfc3RhdGUoaTJjX2lteC0+cGluY3RybCwKIAkJCVBJTkNUUkxfU1RBVEVfREVGQVVMVCk7CiAJaTJjX2lteC0+cGluY3RybF9waW5zX2dwaW8gPSBwaW5jdHJsX2xvb2t1cF9zdGF0ZShpMmNfaW14LT5waW5jdHJsLApAQCAtMTAwMSw3ICsxMDE0LDcgQEAKIAkgICAgSVNfRVJSKGkyY19pbXgtPnBpbmN0cmxfcGluc19kZWZhdWx0KSB8fAogCSAgICBJU19FUlIoaTJjX2lteC0+cGluY3RybF9waW5zX2dwaW8pKSB7CiAJCWRldl9kYmcoJnBkZXYtPmRldiwgInJlY292ZXJ5IGluZm9ybWF0aW9uIGluY29tcGxldGVcbiIpOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAogCWRldl9kYmcoJnBkZXYtPmRldiwgInVzaW5nIHNjbC1ncGlvICVkIGFuZCBzZGEtZ3BpbyAlZCBmb3IgcmVjb3ZlcnlcbiIsCkBAIC0xMDExLDYgKzEwMjQsOCBAQAogCXJpbmZvLT51bnByZXBhcmVfcmVjb3ZlcnkgPSBpMmNfaW14X3VucHJlcGFyZV9yZWNvdmVyeTsKIAlyaW5mby0+cmVjb3Zlcl9idXMgPSBpMmNfZ2VuZXJpY19ncGlvX3JlY292ZXJ5OwogCWkyY19pbXgtPmFkYXB0ZXIuYnVzX3JlY292ZXJ5X2luZm8gPSByaW5mbzsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdTMyIGkyY19pbXhfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0xMDgxLDEyICsxMDk2LDYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpMmNfaW14LT5waW5jdHJsID0gZGV2bV9waW5jdHJsX2dldCgmcGRldi0+ZGV2KTsKLQlpZiAoSVNfRVJSKGkyY19pbXgtPnBpbmN0cmwpKSB7Ci0JCXJldCA9IFBUUl9FUlIoaTJjX2lteC0+cGluY3RybCk7Ci0JCWdvdG8gY2xrX2Rpc2FibGU7Ci0JfQotCiAJLyogUmVxdWVzdCBJUlEgKi8KIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgaTJjX2lteF9pc3IsIDAsCiAJCQkJcGRldi0+bmFtZSwgaTJjX2lteCk7CkBAIC0xMTI1LDE0ICsxMTM0LDE2IEBACiAJCQlpMmNfaW14LCBJTVhfSTJDX0kyQ1IpOwogCWlteF9pMmNfd3JpdGVfcmVnKGkyY19pbXgtPmh3ZGF0YS0+aTJzcl9jbHJfb3Bjb2RlLCBpMmNfaW14LCBJTVhfSTJDX0kyU1IpOwogCi0JaTJjX2lteF9pbml0X3JlY292ZXJ5X2luZm8oaTJjX2lteCwgcGRldik7CisJLyogSW5pdCBvcHRpb25hbCBidXMgcmVjb3ZlcnkgZnVuY3Rpb24gKi8KKwlyZXQgPSBpMmNfaW14X2luaXRfcmVjb3ZlcnlfaW5mbyhpMmNfaW14LCBwZGV2KTsKKwkvKiBHaXZlIGl0IGFub3RoZXIgY2hhbmNlIGlmIHBpbmN0cmwgdXNlZCBpcyBub3QgcmVhZHkgeWV0ICovCisJaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKQorCQlnb3RvIHJwbV9kaXNhYmxlOwogCiAJLyogQWRkIEkyQyBhZGFwdGVyICovCiAJcmV0ID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKCZpMmNfaW14LT5hZGFwdGVyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBycG1fZGlzYWJsZTsKLQl9CiAKIAlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKCZwZGV2LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc2NoLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzY2guYwppbmRleCBjMmYyNWYxLi4wY2YxMzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzY2guYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzY2guYwpAQCAtMjg4LDEwICsyODgsOCBAQAogCQkiU01CdXMgU0NIIGFkYXB0ZXIgYXQgJTA0eCIsIHNjaF9zbWJhKTsKIAogCXJldHZhbCA9IGkyY19hZGRfYWRhcHRlcigmc2NoX2FkYXB0ZXIpOwotCWlmIChyZXR2YWwpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJDb3VsZG4ndCByZWdpc3RlciBhZGFwdGVyIVxuIik7CisJaWYgKHJldHZhbCkKIAkJc2NoX3NtYmEgPSAwOwotCX0KIAogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzbXQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNtdC5jCmluZGV4IDFjODcwNzcuLmY1NzM0NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNtdC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNtdC5jCkBAIC05MjIsMTAgKzkyMiw4IEBACiAJCXJldHVybiBlcnI7CiAKIAllcnIgPSBpMmNfYWRkX2FkYXB0ZXIoJnByaXYtPmFkYXB0ZXIpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBTTUJ1cyBpU01UIGFkYXB0ZXJcbiIpOworCWlmIChlcnIpCiAJCXJldHVybiAtRU5PREVWOwotCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1qejQ3ODAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtano0NzgwLmMKaW5kZXggY2Q5ODcyNS4uYjhlYTYyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1qejQ3ODAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWp6NDc4MC5jCkBAIC03OTgsMTAgKzc5OCw4IEBACiAJCWdvdG8gZXJyOwogCiAJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZpMmMtPmFkYXApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhZGQgYnVzXG4iKTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7Ci0JfQogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbHBjMmsuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbHBjMmsuYwppbmRleCA1ODZhMTUyLi45YjFmZWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWxwYzJrLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1scGMyay5jCkBAIC00MzIsMTAgKzQzMiw4IEBACiAJaTJjLT5hZGFwLmRldi5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAKIAlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJmkyYy0+YWRhcCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBhZGFwdGVyIVxuIik7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gZmFpbF9jbGs7Ci0JfQogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIkxQQzJLIEkyQyBhZGFwdGVyXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tZXNvbi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tZXNvbi5jCmluZGV4IDc2ZTI4OTguLjJhYTYxYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbWVzb24uYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1lc29uLmMKQEAgLTQ1Myw3ICs0NTMsNiBAQAogCiAJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZpMmMtPmFkYXApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlZ2lzdGVyIGFkYXB0ZXJcbiIpOwogCQljbGtfdW5wcmVwYXJlKGkyYy0+Y2xrKTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC00NzMsNiArNDcyLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWVzb25faTJjX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLG1lc29uNi1pMmMiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbWxvZ2ljLG1lc29uLWd4YmItaTJjIiB9LAogCXsgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtZXNvbl9pMmNfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXBjLmMKaW5kZXggNDhlY2ZmZS4uNTY1YTQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jCkBAIC03MzcsMTAgKzczNyw4IEBACiAJaTJjLT5hZGFwLmRldi5vZl9ub2RlID0gb2Zfbm9kZV9nZXQob3AtPmRldi5vZl9ub2RlKTsKIAogCXJlc3VsdCA9IGkyY19hZGRfYWRhcHRlcigmaTJjLT5hZGFwKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlkZXZfZXJyKGkyYy0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBhZGFwdGVyXG4iKTsKKwlpZiAocmVzdWx0IDwgMCkKIAkJZ290byBmYWlsX2FkZDsKLQl9CiAKIAlyZXR1cm4gcmVzdWx0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW10NjV4eC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tdDY1eHguYwppbmRleCBkOTM3M2U2Li40YTdkOWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW10NjV4eC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXQ2NXh4LmMKQEAgLTc4NiwxMCArNzg2LDggQEAKIAogCWkyY19zZXRfYWRhcGRhdGEoJmkyYy0+YWRhcCwgaTJjKTsKIAlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJmkyYy0+YWRhcCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIGkyYyBidXMgdG8gaTJjIGNvcmVcbiIpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1teHMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXhzLmMKaW5kZXggMDMzODQ2Yy4uNTczODU1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1teHMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW14cy5jCkBAIC04NjgsNyArODY4LDYgQEAKIAlpMmNfc2V0X2FkYXBkYXRhKGFkYXAsIGkyYyk7CiAJZXJyID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKGFkYXApOwogCWlmIChlcnIpIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gYWRkIGFkYXB0ZXIgKCVkKVxuIiwgZXJyKTsKIAkJd3JpdGVsKE1YU19JMkNfQ1RSTDBfU0ZUUlNULAogCQkJCWkyYy0+cmVncyArIE1YU19JMkNfQ1RSTDBfU0VUKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbmZvcmNlMi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMKaW5kZXggNDJmY2M5NC4uMzc0YjM1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMKQEAgLTM2Niw3ICszNjYsNiBAQAogCiAJZXJyb3IgPSBpMmNfYWRkX2FkYXB0ZXIoJnNtYnVzLT5hZGFwdGVyKTsKIAlpZiAoZXJyb3IpIHsKLQkJZGV2X2Vycigmc21idXMtPmFkYXB0ZXIuZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGFkYXB0ZXIuXG4iKTsKIAkJcmVsZWFzZV9yZWdpb24oc21idXMtPmJhc2UsIHNtYnVzLT5zaXplKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbm9tYWRpay5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1ub21hZGlrLmMKaW5kZXggYmNkMTdlOC4uZGE2NjA5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1ub21hZGlrLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1ub21hZGlrLmMKQEAgLTEwNDYsMTAgKzEwNDYsOCBAQAogCQkgYWRhcC0+bmFtZSwgZGV2LT52aXJ0YmFzZSk7CiAKIAlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJmYWlsZWQgdG8gYWRkIGFkYXB0ZXJcbiIpOworCWlmIChyZXQpCiAJCWdvdG8gZXJyX25vX2FkYXA7Ci0JfQogCiAJcG1fcnVudGltZV9wdXQoJmFkZXYtPmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jb3Jlcy5jCmluZGV4IGFjODhhNTIuLjM0ZjE4ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY29yZXMuYwpAQCAtNDk0LDEwICs0OTQsOCBAQAogCiAJLyogYWRkIGkyYyBhZGFwdGVyIHRvIGkyYyB0cmVlICovCiAJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZpMmMtPmFkYXApOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBhZGFwdGVyXG4iKTsKKwlpZiAocmV0KQogCQlnb3RvIGVycl9jbGs7Ci0JfQogCiAJLyogYWRkIGluIGtub3duIGRldmljZXMgdG8gdGhlIGJ1cyAqLwogCWlmIChwZGF0YSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY3Rlb24tY29yZS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY3Rlb24tY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOWI1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jdGVvbi1jb3JlLmMKQEAgLTAsMCArMSw4MjcgQEAKKy8qCisgKiAoQykgQ29weXJpZ2h0IDIwMDktMjAxMAorICogTm9raWEgU2llbWVucyBOZXR3b3JrcywgbWljaGFlbC5sYXduaWNrLmV4dEBuc24uY29tCisgKgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxNiBDYXZpdW0sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNoYXJlZCBwYXJ0IG9mIHRoZSBkcml2ZXIgZm9yIHRoZSBpMmMgYWRhcHRlciBpbgorICogQ2F2aXVtIE5ldHdvcmtzJyBPQ1RFT04gcHJvY2Vzc29ycyBhbmQgVGh1bmRlclggU09Dcy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAiaTJjLW9jdGVvbi1jb3JlLmgiCisKKy8qIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KK2lycXJldHVybl90IG9jdGVvbl9pMmNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gZGV2X2lkOworCisJaTJjLT5pbnRfZGlzYWJsZShpMmMpOworCXdha2VfdXAoJmkyYy0+cXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgYm9vbCBvY3Rlb25faTJjX3Rlc3RfaWZsZyhzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQoreworCXJldHVybiAob2N0ZW9uX2kyY19jdGxfcmVhZChpMmMpICYgVFdTSV9DVExfSUZMRyk7Cit9CisKK3N0YXRpYyBib29sIG9jdGVvbl9pMmNfdGVzdF9yZWFkeShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjLCBib29sICpmaXJzdCkKK3sKKwlpZiAob2N0ZW9uX2kyY190ZXN0X2lmbGcoaTJjKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoKmZpcnN0KSB7CisJCSpmaXJzdCA9IGZhbHNlOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBJUlEgaGFzIHNpZ25hbGVkIGFuIGV2ZW50IGJ1dCBJRkxHIGhhc24ndCBjaGFuZ2VkLgorCSAqIFNsZWVwIGFuZCByZXRyeSBvbmNlLgorCSAqLworCXVzbGVlcF9yYW5nZShJMkNfT0NURU9OX0VWRU5UX1dBSVQsIDIgKiBJMkNfT0NURU9OX0VWRU5UX1dBSVQpOworCXJldHVybiBvY3Rlb25faTJjX3Rlc3RfaWZsZyhpMmMpOworfQorCisvKioKKyAqIG9jdGVvbl9pMmNfd2FpdCAtIHdhaXQgZm9yIHRoZSBJRkxHIHRvIGJlIHNldAorICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm5vLgorICovCitzdGF0aWMgaW50IG9jdGVvbl9pMmNfd2FpdChzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQoreworCWxvbmcgdGltZV9sZWZ0OworCWJvb2wgZmlyc3QgPSB0cnVlOworCisJLyoKKwkgKiBTb21lIGNoaXAgcmV2aXNpb25zIGRvbid0IGFzc2VydCB0aGUgaXJxIGluIHRoZSBpbnRlcnJ1cHQKKwkgKiBjb250cm9sbGVyLiBTbyB3ZSBtdXN0IHBvbGwgZm9yIHRoZSBJRkxHIGNoYW5nZS4KKwkgKi8KKwlpZiAoaTJjLT5icm9rZW5faXJxX21vZGUpIHsKKwkJdTY0IGVuZCA9IGdldF9qaWZmaWVzXzY0KCkgKyBpMmMtPmFkYXAudGltZW91dDsKKworCQl3aGlsZSAoIW9jdGVvbl9pMmNfdGVzdF9pZmxnKGkyYykgJiYKKwkJICAgICAgIHRpbWVfYmVmb3JlNjQoZ2V0X2ppZmZpZXNfNjQoKSwgZW5kKSkKKwkJCXVzbGVlcF9yYW5nZShJMkNfT0NURU9OX0VWRU5UX1dBSVQgLyAyLCBJMkNfT0NURU9OX0VWRU5UX1dBSVQpOworCisJCXJldHVybiBvY3Rlb25faTJjX3Rlc3RfaWZsZyhpMmMpID8gMCA6IC1FVElNRURPVVQ7CisJfQorCisJaTJjLT5pbnRfZW5hYmxlKGkyYyk7CisJdGltZV9sZWZ0ID0gd2FpdF9ldmVudF90aW1lb3V0KGkyYy0+cXVldWUsIG9jdGVvbl9pMmNfdGVzdF9yZWFkeShpMmMsICZmaXJzdCksCisJCQkJICAgICAgIGkyYy0+YWRhcC50aW1lb3V0KTsKKwlpMmMtPmludF9kaXNhYmxlKGkyYyk7CisKKwlpZiAoaTJjLT5icm9rZW5faXJxX2NoZWNrICYmICF0aW1lX2xlZnQgJiYKKwkgICAgb2N0ZW9uX2kyY190ZXN0X2lmbGcoaTJjKSkgeworCQlkZXZfZXJyKGkyYy0+ZGV2LCAiYnJva2VuIGlycSBjb25uZWN0aW9uIGRldGVjdGVkLCBzd2l0Y2hpbmcgdG8gcG9sbGluZyBtb2RlLlxuIik7CisJCWkyYy0+YnJva2VuX2lycV9tb2RlID0gdHJ1ZTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF0aW1lX2xlZnQpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIG9jdGVvbl9pMmNfaGxjX3Rlc3RfdmFsaWQoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKK3sKKwlyZXR1cm4gKF9fcmF3X3JlYWRxKGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSShpMmMpKSAmIFNXX1RXU0lfVikgPT0gMDsKK30KKworc3RhdGljIGJvb2wgb2N0ZW9uX2kyY19obGNfdGVzdF9yZWFkeShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjLCBib29sICpmaXJzdCkKK3sKKwkvKiBjaGVjayBpZiB2YWxpZCBiaXQgaXMgY2xlYXJlZCAqLworCWlmIChvY3Rlb25faTJjX2hsY190ZXN0X3ZhbGlkKGkyYykpCisJCXJldHVybiB0cnVlOworCisJaWYgKCpmaXJzdCkgeworCQkqZmlyc3QgPSBmYWxzZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogSVJRIGhhcyBzaWduYWxlZCBhbiBldmVudCBidXQgdmFsaWQgYml0IGlzbid0IGNsZWFyZWQuCisJICogU2xlZXAgYW5kIHJldHJ5IG9uY2UuCisJICovCisJdXNsZWVwX3JhbmdlKEkyQ19PQ1RFT05fRVZFTlRfV0FJVCwgMiAqIEkyQ19PQ1RFT05fRVZFTlRfV0FJVCk7CisJcmV0dXJuIG9jdGVvbl9pMmNfaGxjX3Rlc3RfdmFsaWQoaTJjKTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19obGNfaW50X2NsZWFyKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCit7CisJLyogY2xlYXIgU1QvVFMgZXZlbnRzLCBsaXN0ZW4gZm9yIG5laXRoZXIgKi8KKwlvY3Rlb25faTJjX3dyaXRlX2ludChpMmMsIFRXU0lfSU5UX1NUX0lOVCB8IFRXU0lfSU5UX1RTX0lOVCk7Cit9CisKKy8qCisgKiBDbGVhbnVwIGxvdy1sZXZlbCBzdGF0ZSAmIGVuYWJsZSBoaWdoLWxldmVsIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl9pMmNfaGxjX2VuYWJsZShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQoreworCWludCB0cnkgPSAwOworCXU2NCB2YWw7CisKKwlpZiAoaTJjLT5obGNfZW5hYmxlZCkKKwkJcmV0dXJuOworCWkyYy0+aGxjX2VuYWJsZWQgPSB0cnVlOworCisJd2hpbGUgKDEpIHsKKwkJdmFsID0gb2N0ZW9uX2kyY19jdGxfcmVhZChpMmMpOworCQlpZiAoISh2YWwgJiAoVFdTSV9DVExfU1RBIHwgVFdTSV9DVExfU1RQKSkpCisJCQlicmVhazsKKworCQkvKiBjbGVhciBJRkxHIGV2ZW50ICovCisJCWlmICh2YWwgJiBUV1NJX0NUTF9JRkxHKQorCQkJb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJX0NUTF9FTkFCKTsKKworCQlpZiAodHJ5KysgPiAxMDApIHsKKwkJCXByX2VycigiJXM6IGdpdmluZyB1cFxuIiwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBzcGluIHVudGlsIGFueSBzdGFydC9zdG9wIGhhcyBmaW5pc2hlZCAqLworCQl1ZGVsYXkoMTApOworCX0KKwlvY3Rlb25faTJjX2N0bF93cml0ZShpMmMsIFRXU0lfQ1RMX0NFIHwgVFdTSV9DVExfQUFLIHwgVFdTSV9DVExfRU5BQik7Cit9CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9pMmNfaGxjX2Rpc2FibGUoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKK3sKKwlpZiAoIWkyYy0+aGxjX2VuYWJsZWQpCisJCXJldHVybjsKKworCWkyYy0+aGxjX2VuYWJsZWQgPSBmYWxzZTsKKwlvY3Rlb25faTJjX2N0bF93cml0ZShpMmMsIFRXU0lfQ1RMX0VOQUIpOworfQorCisvKioKKyAqIG9jdGVvbl9pMmNfaGxjX3dhaXQgLSB3YWl0IGZvciBhbiBITEMgb3BlcmF0aW9uIHRvIGNvbXBsZXRlCisgKiBAaTJjOiBUaGUgc3RydWN0IG9jdGVvbl9pMmMKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIC1FVElNRURPVVQuCisgKi8KK3N0YXRpYyBpbnQgb2N0ZW9uX2kyY19obGNfd2FpdChzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQoreworCWJvb2wgZmlyc3QgPSB0cnVlOworCWludCB0aW1lX2xlZnQ7CisKKwkvKgorCSAqIFNvbWUgY24zOHh4IGJvYXJkcyBkb24ndCBhc3NlcnQgdGhlIGlycSBpbiB0aGUgaW50ZXJydXB0CisJICogY29udHJvbGxlci4gU28gd2UgbXVzdCBwb2xsIGZvciB0aGUgdmFsaWQgYml0IGNoYW5nZS4KKwkgKi8KKwlpZiAoaTJjLT5icm9rZW5faXJxX21vZGUpIHsKKwkJdTY0IGVuZCA9IGdldF9qaWZmaWVzXzY0KCkgKyBpMmMtPmFkYXAudGltZW91dDsKKworCQl3aGlsZSAoIW9jdGVvbl9pMmNfaGxjX3Rlc3RfdmFsaWQoaTJjKSAmJgorCQkgICAgICAgdGltZV9iZWZvcmU2NChnZXRfamlmZmllc182NCgpLCBlbmQpKQorCQkJdXNsZWVwX3JhbmdlKEkyQ19PQ1RFT05fRVZFTlRfV0FJVCAvIDIsIEkyQ19PQ1RFT05fRVZFTlRfV0FJVCk7CisKKwkJcmV0dXJuIG9jdGVvbl9pMmNfaGxjX3Rlc3RfdmFsaWQoaTJjKSA/IDAgOiAtRVRJTUVET1VUOworCX0KKworCWkyYy0+aGxjX2ludF9lbmFibGUoaTJjKTsKKwl0aW1lX2xlZnQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaTJjLT5xdWV1ZSwKKwkJCQkgICAgICAgb2N0ZW9uX2kyY19obGNfdGVzdF9yZWFkeShpMmMsICZmaXJzdCksCisJCQkJICAgICAgIGkyYy0+YWRhcC50aW1lb3V0KTsKKwlpMmMtPmhsY19pbnRfZGlzYWJsZShpMmMpOworCWlmICghdGltZV9sZWZ0KQorCQlvY3Rlb25faTJjX2hsY19pbnRfY2xlYXIoaTJjKTsKKworCWlmIChpMmMtPmJyb2tlbl9pcnFfY2hlY2sgJiYgIXRpbWVfbGVmdCAmJgorCSAgICBvY3Rlb25faTJjX2hsY190ZXN0X3ZhbGlkKGkyYykpIHsKKwkJZGV2X2VycihpMmMtPmRldiwgImJyb2tlbiBpcnEgY29ubmVjdGlvbiBkZXRlY3RlZCwgc3dpdGNoaW5nIHRvIHBvbGxpbmcgbW9kZS5cbiIpOworCQlpMmMtPmJyb2tlbl9pcnFfbW9kZSA9IHRydWU7CisJCXJldHVybiAwOworCX0KKworCWlmICghdGltZV9sZWZ0KQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY3Rlb25faTJjX2NoZWNrX3N0YXR1cyhzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjLCBpbnQgZmluYWxfcmVhZCkKK3sKKwl1OCBzdGF0OworCisJLyoKKwkgKiBUaGlzIGlzIHVnbHkuLi4gaW4gSExDIG1vZGUgdGhlIHN0YXR1cyBpcyBub3QgaW4gdGhlIHN0YXR1cyByZWdpc3RlcgorCSAqIGJ1dCBpbiB0aGUgbG93ZXIgOCBiaXRzIG9mIFNXX1RXU0kuCisJICovCisJaWYgKGkyYy0+aGxjX2VuYWJsZWQpCisJCXN0YXQgPSBfX3Jhd19yZWFkcShpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0koaTJjKSk7CisJZWxzZQorCQlzdGF0ID0gb2N0ZW9uX2kyY19zdGF0X3JlYWQoaTJjKTsKKworCXN3aXRjaCAoc3RhdCkgeworCS8qIEV2ZXJ5dGhpbmcgaXMgZmluZSAqLworCWNhc2UgU1RBVF9JRExFOgorCWNhc2UgU1RBVF9BRDJXX0FDSzoKKwljYXNlIFNUQVRfUlhBRERSX0FDSzoKKwljYXNlIFNUQVRfVFhBRERSX0FDSzoKKwljYXNlIFNUQVRfVFhEQVRBX0FDSzoKKwkJcmV0dXJuIDA7CisKKwkvKiBBQ0sgYWxsb3dlZCBvbiBwcmUtdGVybWluYWwgYnl0ZXMgb25seSAqLworCWNhc2UgU1RBVF9SWERBVEFfQUNLOgorCQlpZiAoIWZpbmFsX3JlYWQpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBOQUsgYWxsb3dlZCBvbiB0ZXJtaW5hbCBieXRlIG9ubHkgKi8KKwljYXNlIFNUQVRfUlhEQVRBX05BSzoKKwkJaWYgKGZpbmFsX3JlYWQpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBBcmJpdHJhdGlvbiBsb3N0ICovCisJY2FzZSBTVEFUX0xPU1RfQVJCXzM4OgorCWNhc2UgU1RBVF9MT1NUX0FSQl82ODoKKwljYXNlIFNUQVRfTE9TVF9BUkJfNzg6CisJY2FzZSBTVEFUX0xPU1RfQVJCX0IwOgorCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qIEJlaW5nIGFkZHJlc3NlZCBhcyBzbGF2ZSwgc2hvdWxkIGJhY2sgb2ZmICYgbGlzdGVuICovCisJY2FzZSBTVEFUX1NMQVZFXzYwOgorCWNhc2UgU1RBVF9TTEFWRV83MDoKKwljYXNlIFNUQVRfR0VOREFUQV9BQ0s6CisJY2FzZSBTVEFUX0dFTkRBVEFfTkFLOgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBDb3JlIGJ1c3kgYXMgc2xhdmUgKi8KKwljYXNlIFNUQVRfU0xBVkVfODA6CisJY2FzZSBTVEFUX1NMQVZFXzg4OgorCWNhc2UgU1RBVF9TTEFWRV9BMDoKKwljYXNlIFNUQVRfU0xBVkVfQTg6CisJY2FzZSBTVEFUX1NMQVZFX0xPU1Q6CisJY2FzZSBTVEFUX1NMQVZFX05BSzoKKwljYXNlIFNUQVRfU0xBVkVfQUNLOgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwljYXNlIFNUQVRfVFhEQVRBX05BSzoKKwkJcmV0dXJuIC1FSU87CisJY2FzZSBTVEFUX1RYQUREUl9OQUs6CisJY2FzZSBTVEFUX1JYQUREUl9OQUs6CisJY2FzZSBTVEFUX0FEMldfTkFLOgorCQlyZXR1cm4gLUVOWElPOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaTJjLT5kZXYsICJ1bmhhbmRsZWQgc3RhdGU6ICVkXG4iLCBzdGF0KTsKKwkJcmV0dXJuIC1FSU87CisJfQorfQorCitzdGF0aWMgaW50IG9jdGVvbl9pMmNfcmVjb3Zlcnkoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3JlY292ZXJfYnVzKCZpMmMtPmFkYXApOworCWlmIChyZXQpCisJCS8qIHJlY292ZXIgZmFpbGVkLCB0cnkgaGFyZHdhcmUgcmUtaW5pdCAqLworCQlyZXQgPSBvY3Rlb25faTJjX2luaXRfbG93bGV2ZWwoaTJjKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG9jdGVvbl9pMmNfc3RhcnQgLSBzZW5kIFNUQVJUIHRvIHRoZSBidXMKKyAqIEBpMmM6IFRoZSBzdHJ1Y3Qgb2N0ZW9uX2kyYworICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJuby4KKyAqLworc3RhdGljIGludCBvY3Rlb25faTJjX3N0YXJ0KHN0cnVjdCBvY3Rlb25faTJjICppMmMpCit7CisJaW50IHJldDsKKwl1OCBzdGF0OworCisJb2N0ZW9uX2kyY19obGNfZGlzYWJsZShpMmMpOworCisJb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJX0NUTF9FTkFCIHwgVFdTSV9DVExfU1RBKTsKKwlyZXQgPSBvY3Rlb25faTJjX3dhaXQoaTJjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJc3RhdCA9IG9jdGVvbl9pMmNfc3RhdF9yZWFkKGkyYyk7CisJaWYgKHN0YXQgPT0gU1RBVF9TVEFSVCB8fCBzdGF0ID09IFNUQVRfUkVQX1NUQVJUKQorCQkvKiBTVEFSVCBzdWNjZXNzZnVsLCBiYWlsIG91dCAqLworCQlyZXR1cm4gMDsKKworZXJyb3I6CisJLyogU1RBUlQgZmFpbGVkLCB0cnkgdG8gcmVjb3ZlciAqLworCXJldCA9IG9jdGVvbl9pMmNfcmVjb3ZlcnkoaTJjKTsKKwlyZXR1cm4gKHJldCkgPyByZXQgOiAtRUFHQUlOOworfQorCisvKiBzZW5kIFNUT1AgdG8gdGhlIGJ1cyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19zdG9wKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCit7CisJb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJX0NUTF9FTkFCIHwgVFdTSV9DVExfU1RQKTsKK30KKworLyoqCisgKiBvY3Rlb25faTJjX3JlYWQgLSByZWNlaXZlIGRhdGEgZnJvbSB0aGUgYnVzIHZpYSBsb3ctbGV2ZWwgY29udHJvbGxlcgorICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCisgKiBAdGFyZ2V0OiBUYXJnZXQgYWRkcmVzcworICogQGRhdGE6IFBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBkYXRhCisgKiBAcmxlbmd0aDogTGVuZ3RoIG9mIHRoZSBkYXRhCisgKiBAcmVjdl9sZW46IGZsYWcgZm9yIGxlbmd0aCBieXRlCisgKgorICogVGhlIGFkZHJlc3MgaXMgc2VudCBvdmVyIHRoZSBidXMsIHRoZW4gdGhlIGRhdGEgaXMgcmVhZC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgb2N0ZW9uX2kyY19yZWFkKHN0cnVjdCBvY3Rlb25faTJjICppMmMsIGludCB0YXJnZXQsCisJCQkgICB1OCAqZGF0YSwgdTE2ICpybGVuZ3RoLCBib29sIHJlY3ZfbGVuKQoreworCWludCBpLCByZXN1bHQsIGxlbmd0aCA9ICpybGVuZ3RoOworCWJvb2wgZmluYWxfcmVhZCA9IGZhbHNlOworCisJb2N0ZW9uX2kyY19kYXRhX3dyaXRlKGkyYywgKHRhcmdldCA8PCAxKSB8IDEpOworCW9jdGVvbl9pMmNfY3RsX3dyaXRlKGkyYywgVFdTSV9DVExfRU5BQik7CisKKwlyZXN1bHQgPSBvY3Rlb25faTJjX3dhaXQoaTJjKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJLyogYWRkcmVzcyBPSyA/ICovCisJcmVzdWx0ID0gb2N0ZW9uX2kyY19jaGVja19zdGF0dXMoaTJjLCBmYWxzZSk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQkvKgorCQkgKiBGb3IgdGhlIGxhc3QgYnl0ZSB0byByZWNlaXZlIFRXU0lfQ1RMX0FBSyBtdXN0IG5vdCBiZSBzZXQuCisJCSAqCisJCSAqIEEgc3BlY2lhbCBjYXNlIGlzIEkyQ19NX1JFQ1ZfTEVOIHdoZXJlIHdlIGRvbid0IGtub3cgdGhlCisJCSAqIGFkZGl0aW9uYWwgbGVuZ3RoIHlldC4gSWYgcmVjdl9sZW4gaXMgc2V0IHdlIGFzc3VtZSB3ZSdyZQorCQkgKiBub3QgcmVhZGluZyB0aGUgZmluYWwgYnl0ZSBhbmQgdGhlcmVmb3JlIG5lZWQgdG8gc2V0CisJCSAqIFRXU0lfQ1RMX0FBSy4KKwkJICovCisJCWlmICgoaSArIDEgPT0gbGVuZ3RoKSAmJiAhKHJlY3ZfbGVuICYmIGkgPT0gMCkpCisJCQlmaW5hbF9yZWFkID0gdHJ1ZTsKKworCQkvKiBjbGVhciBpZmxnIHRvIGFsbG93IG5leHQgZXZlbnQgKi8KKwkJaWYgKGZpbmFsX3JlYWQpCisJCQlvY3Rlb25faTJjX2N0bF93cml0ZShpMmMsIFRXU0lfQ1RMX0VOQUIpOworCQllbHNlCisJCQlvY3Rlb25faTJjX2N0bF93cml0ZShpMmMsIFRXU0lfQ1RMX0VOQUIgfCBUV1NJX0NUTF9BQUspOworCisJCXJlc3VsdCA9IG9jdGVvbl9pMmNfd2FpdChpMmMpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQlkYXRhW2ldID0gb2N0ZW9uX2kyY19kYXRhX3JlYWQoaTJjLCAmcmVzdWx0KTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWlmIChyZWN2X2xlbiAmJiBpID09IDApIHsKKwkJCWlmIChkYXRhW2ldID4gSTJDX1NNQlVTX0JMT0NLX01BWCArIDEpCisJCQkJcmV0dXJuIC1FUFJPVE87CisJCQlsZW5ndGggKz0gZGF0YVtpXTsKKwkJfQorCisJCXJlc3VsdCA9IG9jdGVvbl9pMmNfY2hlY2tfc3RhdHVzKGkyYywgZmluYWxfcmVhZCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCX0KKwkqcmxlbmd0aCA9IGxlbmd0aDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBvY3Rlb25faTJjX3dyaXRlIC0gc2VuZCBkYXRhIHRvIHRoZSBidXMgdmlhIGxvdy1sZXZlbCBjb250cm9sbGVyCisgKiBAaTJjOiBUaGUgc3RydWN0IG9jdGVvbl9pMmMKKyAqIEB0YXJnZXQ6IFRhcmdldCBhZGRyZXNzCisgKiBAZGF0YTogUG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBzZW50CisgKiBAbGVuZ3RoOiBMZW5ndGggb2YgdGhlIGRhdGEKKyAqCisgKiBUaGUgYWRkcmVzcyBpcyBzZW50IG92ZXIgdGhlIGJ1cywgdGhlbiB0aGUgZGF0YS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8uCisgKi8KK3N0YXRpYyBpbnQgb2N0ZW9uX2kyY193cml0ZShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjLCBpbnQgdGFyZ2V0LAorCQkJICAgIGNvbnN0IHU4ICpkYXRhLCBpbnQgbGVuZ3RoKQoreworCWludCBpLCByZXN1bHQ7CisKKwlvY3Rlb25faTJjX2RhdGFfd3JpdGUoaTJjLCB0YXJnZXQgPDwgMSk7CisJb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJX0NUTF9FTkFCKTsKKworCXJlc3VsdCA9IG9jdGVvbl9pMmNfd2FpdChpMmMpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJcmVzdWx0ID0gb2N0ZW9uX2kyY19jaGVja19zdGF0dXMoaTJjLCBmYWxzZSk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0OworCisJCW9jdGVvbl9pMmNfZGF0YV93cml0ZShpMmMsIGRhdGFbaV0pOworCQlvY3Rlb25faTJjX2N0bF93cml0ZShpMmMsIFRXU0lfQ1RMX0VOQUIpOworCisJCXJlc3VsdCA9IG9jdGVvbl9pMmNfd2FpdChpMmMpOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogaGlnaC1sZXZlbC1jb250cm9sbGVyIHB1cmUgcmVhZCBvZiB1cCB0byA4IGJ5dGVzICovCitzdGF0aWMgaW50IG9jdGVvbl9pMmNfaGxjX3JlYWQoc3RydWN0IG9jdGVvbl9pMmMgKmkyYywgc3RydWN0IGkyY19tc2cgKm1zZ3MpCit7CisJaW50IGksIGosIHJldCA9IDA7CisJdTY0IGNtZDsKKworCW9jdGVvbl9pMmNfaGxjX2VuYWJsZShpMmMpOworCW9jdGVvbl9pMmNfaGxjX2ludF9jbGVhcihpMmMpOworCisJY21kID0gU1dfVFdTSV9WIHwgU1dfVFdTSV9SIHwgU1dfVFdTSV9TT1ZSOworCS8qIFNJWkUgKi8KKwljbWQgfD0gKHU2NCkobXNnc1swXS5sZW4gLSAxKSA8PCBTV19UV1NJX1NJWkVfU0hJRlQ7CisJLyogQSAqLworCWNtZCB8PSAodTY0KShtc2dzWzBdLmFkZHIgJiAweDdmdWxsKSA8PCBTV19UV1NJX0FERFJfU0hJRlQ7CisKKwlpZiAobXNnc1swXS5mbGFncyAmIEkyQ19NX1RFTikKKwkJY21kIHw9IFNXX1RXU0lfT1BfMTA7CisJZWxzZQorCQljbWQgfD0gU1dfVFdTSV9PUF83OworCisJb2N0ZW9uX2kyY193cml0ZXFfZmx1c2goY21kLCBpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0koaTJjKSk7CisJcmV0ID0gb2N0ZW9uX2kyY19obGNfd2FpdChpMmMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJY21kID0gX19yYXdfcmVhZHEoaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJKGkyYykpOworCWlmICgoY21kICYgU1dfVFdTSV9SKSA9PSAwKQorCQlyZXR1cm4gb2N0ZW9uX2kyY19jaGVja19zdGF0dXMoaTJjLCBmYWxzZSk7CisKKwlmb3IgKGkgPSAwLCBqID0gbXNnc1swXS5sZW4gLSAxOyBpICA8IG1zZ3NbMF0ubGVuICYmIGkgPCA0OyBpKyssIGotLSkKKwkJbXNnc1swXS5idWZbal0gPSAoY21kID4+ICg4ICogaSkpICYgMHhmZjsKKworCWlmIChtc2dzWzBdLmxlbiA+IDQpIHsKKwkJY21kID0gX19yYXdfcmVhZHEoaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJX0VYVChpMmMpKTsKKwkJZm9yIChpID0gMDsgaSAgPCBtc2dzWzBdLmxlbiAtIDQgJiYgaSA8IDQ7IGkrKywgai0tKQorCQkJbXNnc1swXS5idWZbal0gPSAoY21kID4+ICg4ICogaSkpICYgMHhmZjsKKwl9CisKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCisvKiBoaWdoLWxldmVsLWNvbnRyb2xsZXIgcHVyZSB3cml0ZSBvZiB1cCB0byA4IGJ5dGVzICovCitzdGF0aWMgaW50IG9jdGVvbl9pMmNfaGxjX3dyaXRlKHN0cnVjdCBvY3Rlb25faTJjICppMmMsIHN0cnVjdCBpMmNfbXNnICptc2dzKQoreworCWludCBpLCBqLCByZXQgPSAwOworCXU2NCBjbWQ7CisKKwlvY3Rlb25faTJjX2hsY19lbmFibGUoaTJjKTsKKwlvY3Rlb25faTJjX2hsY19pbnRfY2xlYXIoaTJjKTsKKworCWNtZCA9IFNXX1RXU0lfViB8IFNXX1RXU0lfU09WUjsKKwkvKiBTSVpFICovCisJY21kIHw9ICh1NjQpKG1zZ3NbMF0ubGVuIC0gMSkgPDwgU1dfVFdTSV9TSVpFX1NISUZUOworCS8qIEEgKi8KKwljbWQgfD0gKHU2NCkobXNnc1swXS5hZGRyICYgMHg3ZnVsbCkgPDwgU1dfVFdTSV9BRERSX1NISUZUOworCisJaWYgKG1zZ3NbMF0uZmxhZ3MgJiBJMkNfTV9URU4pCisJCWNtZCB8PSBTV19UV1NJX09QXzEwOworCWVsc2UKKwkJY21kIHw9IFNXX1RXU0lfT1BfNzsKKworCWZvciAoaSA9IDAsIGogPSBtc2dzWzBdLmxlbiAtIDE7IGkgIDwgbXNnc1swXS5sZW4gJiYgaSA8IDQ7IGkrKywgai0tKQorCQljbWQgfD0gKHU2NCltc2dzWzBdLmJ1ZltqXSA8PCAoOCAqIGkpOworCisJaWYgKG1zZ3NbMF0ubGVuID4gNCkgeworCQl1NjQgZXh0ID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbXNnc1swXS5sZW4gLSA0ICYmIGkgPCA0OyBpKyssIGotLSkKKwkJCWV4dCB8PSAodTY0KW1zZ3NbMF0uYnVmW2pdIDw8ICg4ICogaSk7CisJCW9jdGVvbl9pMmNfd3JpdGVxX2ZsdXNoKGV4dCwgaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJX0VYVChpMmMpKTsKKwl9CisKKwlvY3Rlb25faTJjX3dyaXRlcV9mbHVzaChjbWQsIGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSShpMmMpKTsKKwlyZXQgPSBvY3Rlb25faTJjX2hsY193YWl0KGkyYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwljbWQgPSBfX3Jhd19yZWFkcShpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0koaTJjKSk7CisJaWYgKChjbWQgJiBTV19UV1NJX1IpID09IDApCisJCXJldHVybiBvY3Rlb25faTJjX2NoZWNrX3N0YXR1cyhpMmMsIGZhbHNlKTsKKworZXJyOgorCXJldHVybiByZXQ7Cit9CisKKy8qIGhpZ2gtbGV2ZWwtY29udHJvbGxlciBjb21wb3NpdGUgd3JpdGUrcmVhZCwgbXNnMD1hZGRyLCBtc2cxPWRhdGEgKi8KK3N0YXRpYyBpbnQgb2N0ZW9uX2kyY19obGNfY29tcF9yZWFkKHN0cnVjdCBvY3Rlb25faTJjICppMmMsIHN0cnVjdCBpMmNfbXNnICptc2dzKQoreworCWludCBpLCBqLCByZXQgPSAwOworCXU2NCBjbWQ7CisKKwlvY3Rlb25faTJjX2hsY19lbmFibGUoaTJjKTsKKworCWNtZCA9IFNXX1RXU0lfViB8IFNXX1RXU0lfUiB8IFNXX1RXU0lfU09WUjsKKwkvKiBTSVpFICovCisJY21kIHw9ICh1NjQpKG1zZ3NbMV0ubGVuIC0gMSkgPDwgU1dfVFdTSV9TSVpFX1NISUZUOworCS8qIEEgKi8KKwljbWQgfD0gKHU2NCkobXNnc1swXS5hZGRyICYgMHg3ZnVsbCkgPDwgU1dfVFdTSV9BRERSX1NISUZUOworCisJaWYgKG1zZ3NbMF0uZmxhZ3MgJiBJMkNfTV9URU4pCisJCWNtZCB8PSBTV19UV1NJX09QXzEwX0lBOworCWVsc2UKKwkJY21kIHw9IFNXX1RXU0lfT1BfN19JQTsKKworCWlmIChtc2dzWzBdLmxlbiA9PSAyKSB7CisJCXU2NCBleHQgPSAwOworCisJCWNtZCB8PSBTV19UV1NJX0VJQTsKKwkJZXh0ID0gKHU2NCltc2dzWzBdLmJ1ZlswXSA8PCBTV19UV1NJX0lBX1NISUZUOworCQljbWQgfD0gKHU2NCltc2dzWzBdLmJ1ZlsxXSA8PCBTV19UV1NJX0lBX1NISUZUOworCQlvY3Rlb25faTJjX3dyaXRlcV9mbHVzaChleHQsIGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSV9FWFQoaTJjKSk7CisJfSBlbHNlIHsKKwkJY21kIHw9ICh1NjQpbXNnc1swXS5idWZbMF0gPDwgU1dfVFdTSV9JQV9TSElGVDsKKwl9CisKKwlvY3Rlb25faTJjX2hsY19pbnRfY2xlYXIoaTJjKTsKKwlvY3Rlb25faTJjX3dyaXRlcV9mbHVzaChjbWQsIGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSShpMmMpKTsKKworCXJldCA9IG9jdGVvbl9pMmNfaGxjX3dhaXQoaTJjKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWNtZCA9IF9fcmF3X3JlYWRxKGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSShpMmMpKTsKKwlpZiAoKGNtZCAmIFNXX1RXU0lfUikgPT0gMCkKKwkJcmV0dXJuIG9jdGVvbl9pMmNfY2hlY2tfc3RhdHVzKGkyYywgZmFsc2UpOworCisJZm9yIChpID0gMCwgaiA9IG1zZ3NbMV0ubGVuIC0gMTsgaSAgPCBtc2dzWzFdLmxlbiAmJiBpIDwgNDsgaSsrLCBqLS0pCisJCW1zZ3NbMV0uYnVmW2pdID0gKGNtZCA+PiAoOCAqIGkpKSAmIDB4ZmY7CisKKwlpZiAobXNnc1sxXS5sZW4gPiA0KSB7CisJCWNtZCA9IF9fcmF3X3JlYWRxKGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSV9FWFQoaTJjKSk7CisJCWZvciAoaSA9IDA7IGkgIDwgbXNnc1sxXS5sZW4gLSA0ICYmIGkgPCA0OyBpKyssIGotLSkKKwkJCW1zZ3NbMV0uYnVmW2pdID0gKGNtZCA+PiAoOCAqIGkpKSAmIDB4ZmY7CisJfQorCitlcnI6CisJcmV0dXJuIHJldDsKK30KKworLyogaGlnaC1sZXZlbC1jb250cm9sbGVyIGNvbXBvc2l0ZSB3cml0ZSt3cml0ZSwgbVswXWxlbjw9MiwgbVsxXWxlbjw9OCAqLworc3RhdGljIGludCBvY3Rlb25faTJjX2hsY19jb21wX3dyaXRlKHN0cnVjdCBvY3Rlb25faTJjICppMmMsIHN0cnVjdCBpMmNfbXNnICptc2dzKQoreworCWJvb2wgc2V0X2V4dCA9IGZhbHNlOworCWludCBpLCBqLCByZXQgPSAwOworCXU2NCBjbWQsIGV4dCA9IDA7CisKKwlvY3Rlb25faTJjX2hsY19lbmFibGUoaTJjKTsKKworCWNtZCA9IFNXX1RXU0lfViB8IFNXX1RXU0lfU09WUjsKKwkvKiBTSVpFICovCisJY21kIHw9ICh1NjQpKG1zZ3NbMV0ubGVuIC0gMSkgPDwgU1dfVFdTSV9TSVpFX1NISUZUOworCS8qIEEgKi8KKwljbWQgfD0gKHU2NCkobXNnc1swXS5hZGRyICYgMHg3ZnVsbCkgPDwgU1dfVFdTSV9BRERSX1NISUZUOworCisJaWYgKG1zZ3NbMF0uZmxhZ3MgJiBJMkNfTV9URU4pCisJCWNtZCB8PSBTV19UV1NJX09QXzEwX0lBOworCWVsc2UKKwkJY21kIHw9IFNXX1RXU0lfT1BfN19JQTsKKworCWlmIChtc2dzWzBdLmxlbiA9PSAyKSB7CisJCWNtZCB8PSBTV19UV1NJX0VJQTsKKwkJZXh0IHw9ICh1NjQpbXNnc1swXS5idWZbMF0gPDwgU1dfVFdTSV9JQV9TSElGVDsKKwkJc2V0X2V4dCA9IHRydWU7CisJCWNtZCB8PSAodTY0KW1zZ3NbMF0uYnVmWzFdIDw8IFNXX1RXU0lfSUFfU0hJRlQ7CisJfSBlbHNlIHsKKwkJY21kIHw9ICh1NjQpbXNnc1swXS5idWZbMF0gPDwgU1dfVFdTSV9JQV9TSElGVDsKKwl9CisKKwlmb3IgKGkgPSAwLCBqID0gbXNnc1sxXS5sZW4gLSAxOyBpICA8IG1zZ3NbMV0ubGVuICYmIGkgPCA0OyBpKyssIGotLSkKKwkJY21kIHw9ICh1NjQpbXNnc1sxXS5idWZbal0gPDwgKDggKiBpKTsKKworCWlmIChtc2dzWzFdLmxlbiA+IDQpIHsKKwkJZm9yIChpID0gMDsgaSA8IG1zZ3NbMV0ubGVuIC0gNCAmJiBpIDwgNDsgaSsrLCBqLS0pCisJCQlleHQgfD0gKHU2NCltc2dzWzFdLmJ1ZltqXSA8PCAoOCAqIGkpOworCQlzZXRfZXh0ID0gdHJ1ZTsKKwl9CisJaWYgKHNldF9leHQpCisJCW9jdGVvbl9pMmNfd3JpdGVxX2ZsdXNoKGV4dCwgaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJX0VYVChpMmMpKTsKKworCW9jdGVvbl9pMmNfaGxjX2ludF9jbGVhcihpMmMpOworCW9jdGVvbl9pMmNfd3JpdGVxX2ZsdXNoKGNtZCwgaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJKGkyYykpOworCisJcmV0ID0gb2N0ZW9uX2kyY19obGNfd2FpdChpMmMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJY21kID0gX19yYXdfcmVhZHEoaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJKGkyYykpOworCWlmICgoY21kICYgU1dfVFdTSV9SKSA9PSAwKQorCQlyZXR1cm4gb2N0ZW9uX2kyY19jaGVja19zdGF0dXMoaTJjLCBmYWxzZSk7CisKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG9jdGVvbl9pMmNfeGZlciAtIFRoZSBkcml2ZXIncyBtYXN0ZXJfeGZlciBmdW5jdGlvbgorICogQGFkYXA6IFBvaW50ZXIgdG8gdGhlIGkyY19hZGFwdGVyIHN0cnVjdHVyZQorICogQG1zZ3M6IFBvaW50ZXIgdG8gdGhlIG1lc3NhZ2VzIHRvIGJlIHByb2Nlc3NlZAorICogQG51bTogTGVuZ3RoIG9mIHRoZSBNU0dTIGFycmF5CisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHByb2Nlc3NlZCwgb3IgYSBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgorICovCitpbnQgb2N0ZW9uX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCit7CisJc3RydWN0IG9jdGVvbl9pMmMgKmkyYyA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJaW50IGksIHJldCA9IDA7CisKKwlpZiAobnVtID09IDEpIHsKKwkJaWYgKG1zZ3NbMF0ubGVuID4gMCAmJiBtc2dzWzBdLmxlbiA8PSA4KSB7CisJCQlpZiAobXNnc1swXS5mbGFncyAmIEkyQ19NX1JEKQorCQkJCXJldCA9IG9jdGVvbl9pMmNfaGxjX3JlYWQoaTJjLCBtc2dzKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBvY3Rlb25faTJjX2hsY193cml0ZShpMmMsIG1zZ3MpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgaWYgKG51bSA9PSAyKSB7CisJCWlmICgobXNnc1swXS5mbGFncyAmIEkyQ19NX1JEKSA9PSAwICYmCisJCSAgICAobXNnc1sxXS5mbGFncyAmIEkyQ19NX1JFQ1ZfTEVOKSA9PSAwICYmCisJCSAgICBtc2dzWzBdLmxlbiA+IDAgJiYgbXNnc1swXS5sZW4gPD0gMiAmJgorCQkgICAgbXNnc1sxXS5sZW4gPiAwICYmIG1zZ3NbMV0ubGVuIDw9IDggJiYKKwkJICAgIG1zZ3NbMF0uYWRkciA9PSBtc2dzWzFdLmFkZHIpIHsKKwkJCWlmIChtc2dzWzFdLmZsYWdzICYgSTJDX01fUkQpCisJCQkJcmV0ID0gb2N0ZW9uX2kyY19obGNfY29tcF9yZWFkKGkyYywgbXNncyk7CisJCQllbHNlCisJCQkJcmV0ID0gb2N0ZW9uX2kyY19obGNfY29tcF93cml0ZShpMmMsIG1zZ3MpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyByZXQgPT0gMCAmJiBpIDwgbnVtOyBpKyspIHsKKwkJc3RydWN0IGkyY19tc2cgKnBtc2cgPSAmbXNnc1tpXTsKKworCQkvKiB6ZXJvLWxlbmd0aCBtZXNzYWdlcyBhcmUgbm90IHN1cHBvcnRlZCAqLworCQlpZiAoIXBtc2ctPmxlbikgeworCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IG9jdGVvbl9pMmNfc3RhcnQoaTJjKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKHBtc2ctPmZsYWdzICYgSTJDX01fUkQpCisJCQlyZXQgPSBvY3Rlb25faTJjX3JlYWQoaTJjLCBwbXNnLT5hZGRyLCBwbXNnLT5idWYsCisJCQkJCSAgICAgICZwbXNnLT5sZW4sIHBtc2ctPmZsYWdzICYgSTJDX01fUkVDVl9MRU4pOworCQllbHNlCisJCQlyZXQgPSBvY3Rlb25faTJjX3dyaXRlKGkyYywgcG1zZy0+YWRkciwgcG1zZy0+YnVmLAorCQkJCQkgICAgICAgcG1zZy0+bGVuKTsKKwl9CisJb2N0ZW9uX2kyY19zdG9wKGkyYyk7CitvdXQ6CisJcmV0dXJuIChyZXQgIT0gMCkgPyByZXQgOiBudW07Cit9CisKKy8qIGNhbGN1bGF0ZSBhbmQgc2V0IGNsb2NrIGRpdmlzb3JzICovCit2b2lkIG9jdGVvbl9pMmNfc2V0X2Nsb2NrKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCit7CisJaW50IHRjbGssIHRocF9iYXNlLCBpbmMsIHRocF9pZHgsIG1kaXZfaWR4LCBuZGl2X2lkeCwgZm9zY2wsIGRpZmY7CisJaW50IHRocCA9IDB4MTgsIG1kaXYgPSAyLCBuZGl2ID0gMCwgZGVsdGFfaHogPSAxMDAwMDAwOworCisJZm9yIChuZGl2X2lkeCA9IDA7IG5kaXZfaWR4IDwgOCAmJiBkZWx0YV9oeiAhPSAwOyBuZGl2X2lkeCsrKSB7CisJCS8qCisJCSAqIEFuIG1kaXYgdmFsdWUgb2YgbGVzcyB0aGFuIDIgc2VlbXMgdG8gbm90IHdvcmsgd2VsbAorCQkgKiB3aXRoIGRzMTMzNyBSVENzLCBzbyB3ZSBjb25zdHJhaW4gaXQgdG8gbGFyZ2VyIHZhbHVlcy4KKwkJICovCisJCWZvciAobWRpdl9pZHggPSAxNTsgbWRpdl9pZHggPj0gMiAmJiBkZWx0YV9oeiAhPSAwOyBtZGl2X2lkeC0tKSB7CisJCQkvKgorCQkJICogRm9yIGdpdmVuIG5kaXYgYW5kIG1kaXYgdmFsdWVzIGNoZWNrIHRoZQorCQkJICogdHdvIGNsb3Nlc3QgdGhwIHZhbHVlcy4KKwkJCSAqLworCQkJdGNsayA9IGkyYy0+dHdzaV9mcmVxICogKG1kaXZfaWR4ICsgMSkgKiAxMDsKKwkJCXRjbGsgKj0gKDEgPDwgbmRpdl9pZHgpOworCQkJdGhwX2Jhc2UgPSAoaTJjLT5zeXNfZnJlcSAvICh0Y2xrICogMikpIC0gMTsKKworCQkJZm9yIChpbmMgPSAwOyBpbmMgPD0gMTsgaW5jKyspIHsKKwkJCQl0aHBfaWR4ID0gdGhwX2Jhc2UgKyBpbmM7CisJCQkJaWYgKHRocF9pZHggPCA1IHx8IHRocF9pZHggPiAweGZmKQorCQkJCQljb250aW51ZTsKKworCQkJCWZvc2NsID0gaTJjLT5zeXNfZnJlcSAvICgyICogKHRocF9pZHggKyAxKSk7CisJCQkJZm9zY2wgPSBmb3NjbCAvICgxIDw8IG5kaXZfaWR4KTsKKwkJCQlmb3NjbCA9IGZvc2NsIC8gKG1kaXZfaWR4ICsgMSkgLyAxMDsKKwkJCQlkaWZmID0gYWJzKGZvc2NsIC0gaTJjLT50d3NpX2ZyZXEpOworCQkJCWlmIChkaWZmIDwgZGVsdGFfaHopIHsKKwkJCQkJZGVsdGFfaHogPSBkaWZmOworCQkJCQl0aHAgPSB0aHBfaWR4OworCQkJCQltZGl2ID0gbWRpdl9pZHg7CisJCQkJCW5kaXYgPSBuZGl2X2lkeDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJb2N0ZW9uX2kyY19yZWdfd3JpdGUoaTJjLCBTV19UV1NJX09QX1RXU0lfQ0xLLCB0aHApOworCW9jdGVvbl9pMmNfcmVnX3dyaXRlKGkyYywgU1dfVFdTSV9FT1BfVFdTSV9DTEtDVEwsIChtZGl2IDw8IDMpIHwgbmRpdik7Cit9CisKK2ludCBvY3Rlb25faTJjX2luaXRfbG93bGV2ZWwoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKK3sKKwl1OCBzdGF0dXMgPSAwOworCWludCB0cmllczsKKworCS8qIHJlc2V0IGNvbnRyb2xsZXIgKi8KKwlvY3Rlb25faTJjX3JlZ193cml0ZShpMmMsIFNXX1RXU0lfRU9QX1RXU0lfUlNULCAwKTsKKworCWZvciAodHJpZXMgPSAxMDsgdHJpZXMgJiYgc3RhdHVzICE9IFNUQVRfSURMRTsgdHJpZXMtLSkgeworCQl1ZGVsYXkoMSk7CisJCXN0YXR1cyA9IG9jdGVvbl9pMmNfc3RhdF9yZWFkKGkyYyk7CisJCWlmIChzdGF0dXMgPT0gU1RBVF9JRExFKQorCQkJYnJlYWs7CisJfQorCisJaWYgKHN0YXR1cyAhPSBTVEFUX0lETEUpIHsKKwkJZGV2X2VycihpMmMtPmRldiwgIiVzOiBUV1NJX1JTVCBmYWlsZWQhICgweCV4KVxuIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiB0b2dnbGUgdHdpY2UgdG8gZm9yY2UgYm90aCB0ZWFyZG93bnMgKi8KKwlvY3Rlb25faTJjX2hsY19lbmFibGUoaTJjKTsKKwlvY3Rlb25faTJjX2hsY19kaXNhYmxlKGkyYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2N0ZW9uX2kyY19nZXRfc2NsKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKwl1NjQgc3RhdGU7CisKKwlzdGF0ZSA9IG9jdGVvbl9pMmNfcmVhZF9pbnQoaTJjKTsKKwlyZXR1cm4gc3RhdGUgJiBUV1NJX0lOVF9TQ0w7Cit9CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9pMmNfc2V0X3NjbChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCB2YWwpCit7CisJc3RydWN0IG9jdGVvbl9pMmMgKmkyYyA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisKKwlvY3Rlb25faTJjX3dyaXRlX2ludChpMmMsIHZhbCA/IDAgOiBUV1NJX0lOVF9TQ0xfT1ZSKTsKK30KKworc3RhdGljIGludCBvY3Rlb25faTJjX2dldF9zZGEoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBvY3Rlb25faTJjICppMmMgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCXU2NCBzdGF0ZTsKKworCXN0YXRlID0gb2N0ZW9uX2kyY19yZWFkX2ludChpMmMpOworCXJldHVybiBzdGF0ZSAmIFRXU0lfSU5UX1NEQTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19wcmVwYXJlX3JlY292ZXJ5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKworCW9jdGVvbl9pMmNfaGxjX2Rpc2FibGUoaTJjKTsKKworCS8qCisJICogQnJpbmcgY29udHJvbCByZWdpc3RlciB0byBhIGdvb2Qgc3RhdGUgcmVnYXJkbGVzcworCSAqIG9mIEhMQyBzdGF0ZS4KKwkgKi8KKwlvY3Rlb25faTJjX2N0bF93cml0ZShpMmMsIFRXU0lfQ1RMX0VOQUIpOworCisJb2N0ZW9uX2kyY193cml0ZV9pbnQoaTJjLCAwKTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX2kyY191bnByZXBhcmVfcmVjb3Zlcnkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBvY3Rlb25faTJjICppMmMgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCisJLyoKKwkgKiBHZW5lcmF0ZSBTVE9QIHRvIGZpbmlzaCB0aGUgdW5maW5pc2hlZCB0cmFuc2FjdGlvbi4KKwkgKiBDYW4ndCBnZW5lcmF0ZSBTVE9QIHZpYSB0aGUgVFdTSSBDVEwgcmVnaXN0ZXIKKwkgKiBzaW5jZSBpdCBjb3VsZCBicmluZyB0aGUgVFdTSSBjb250cm9sbGVyIGludG8gYW4gaW5vcGVyYWJsZSBzdGF0ZS4KKwkgKi8KKwlvY3Rlb25faTJjX3dyaXRlX2ludChpMmMsIFRXU0lfSU5UX1NEQV9PVlIgfCBUV1NJX0lOVF9TQ0xfT1ZSKTsKKwl1ZGVsYXkoNSk7CisJb2N0ZW9uX2kyY193cml0ZV9pbnQoaTJjLCBUV1NJX0lOVF9TREFfT1ZSKTsKKwl1ZGVsYXkoNSk7CisJb2N0ZW9uX2kyY193cml0ZV9pbnQoaTJjLCAwKTsKK30KKworc3RydWN0IGkyY19idXNfcmVjb3ZlcnlfaW5mbyBvY3Rlb25faTJjX3JlY292ZXJ5X2luZm8gPSB7CisJLnJlY292ZXJfYnVzID0gaTJjX2dlbmVyaWNfc2NsX3JlY292ZXJ5LAorCS5nZXRfc2NsID0gb2N0ZW9uX2kyY19nZXRfc2NsLAorCS5zZXRfc2NsID0gb2N0ZW9uX2kyY19zZXRfc2NsLAorCS5nZXRfc2RhID0gb2N0ZW9uX2kyY19nZXRfc2RhLAorCS5wcmVwYXJlX3JlY292ZXJ5ID0gb2N0ZW9uX2kyY19wcmVwYXJlX3JlY292ZXJ5LAorCS51bnByZXBhcmVfcmVjb3ZlcnkgPSBvY3Rlb25faTJjX3VucHJlcGFyZV9yZWNvdmVyeSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jdGVvbi1jb3JlLmggYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jdGVvbi1jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiN2M4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2N0ZW9uLWNvcmUuaApAQCAtMCwwICsxLDIxNiBAQAorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNtYnVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworLyogQ29udHJvbGxlciBjb21tYW5kIHBhdHRlcm5zICovCisjZGVmaW5lIFNXX1RXU0lfVgkJQklUX1VMTCg2MykJLyogVmFsaWQgYml0ICovCisjZGVmaW5lIFNXX1RXU0lfRUlBCQlCSVRfVUxMKDYxKQkvKiBFeHRlbmRlZCBpbnRlcm5hbCBhZGRyZXNzICovCisjZGVmaW5lIFNXX1RXU0lfUgkJQklUX1VMTCg1NikJLyogUmVzdWx0IG9yIHJlYWQgYml0ICovCisjZGVmaW5lIFNXX1RXU0lfU09WUgkJQklUX1VMTCg1NSkJLyogU2l6ZSBvdmVycmlkZSAqLworI2RlZmluZSBTV19UV1NJX1NJWkVfU0hJRlQJNTIKKyNkZWZpbmUgU1dfVFdTSV9BRERSX1NISUZUCTQwCisjZGVmaW5lIFNXX1RXU0lfSUFfU0hJRlQJMzIJCS8qIEludGVybmFsIGFkZHJlc3MgKi8KKworLyogQ29udHJvbGxlciBvcGNvZGUgd29yZCAoYml0cyA2MDo1NykgKi8KKyNkZWZpbmUgU1dfVFdTSV9PUF9TSElGVAk1NworI2RlZmluZSBTV19UV1NJX09QXzcJCSgwVUxMIDw8IFNXX1RXU0lfT1BfU0hJRlQpCisjZGVmaW5lIFNXX1RXU0lfT1BfN19JQQkJKDFVTEwgPDwgU1dfVFdTSV9PUF9TSElGVCkKKyNkZWZpbmUgU1dfVFdTSV9PUF8xMAkJKDJVTEwgPDwgU1dfVFdTSV9PUF9TSElGVCkKKyNkZWZpbmUgU1dfVFdTSV9PUF8xMF9JQQkoM1VMTCA8PCBTV19UV1NJX09QX1NISUZUKQorI2RlZmluZSBTV19UV1NJX09QX1RXU0lfQ0xLCSg0VUxMIDw8IFNXX1RXU0lfT1BfU0hJRlQpCisjZGVmaW5lIFNXX1RXU0lfT1BfRU9QCQkoNlVMTCA8PCBTV19UV1NJX09QX1NISUZUKSAvKiBFeHRlbmRlZCBvcGNvZGUgKi8KKworLyogQ29udHJvbGxlciBleHRlbmRlZCBvcGNvZGUgd29yZCAoYml0cyAzNDozMikgKi8KKyNkZWZpbmUgU1dfVFdTSV9FT1BfU0hJRlQJMzIKKyNkZWZpbmUgU1dfVFdTSV9FT1BfVFdTSV9EQVRBCShTV19UV1NJX09QX0VPUCB8IDFVTEwgPDwgU1dfVFdTSV9FT1BfU0hJRlQpCisjZGVmaW5lIFNXX1RXU0lfRU9QX1RXU0lfQ1RMCShTV19UV1NJX09QX0VPUCB8IDJVTEwgPDwgU1dfVFdTSV9FT1BfU0hJRlQpCisjZGVmaW5lIFNXX1RXU0lfRU9QX1RXU0lfQ0xLQ1RMCShTV19UV1NJX09QX0VPUCB8IDNVTEwgPDwgU1dfVFdTSV9FT1BfU0hJRlQpCisjZGVmaW5lIFNXX1RXU0lfRU9QX1RXU0lfU1RBVAkoU1dfVFdTSV9PUF9FT1AgfCAzVUxMIDw8IFNXX1RXU0lfRU9QX1NISUZUKQorI2RlZmluZSBTV19UV1NJX0VPUF9UV1NJX1JTVAkoU1dfVFdTSV9PUF9FT1AgfCA3VUxMIDw8IFNXX1RXU0lfRU9QX1NISUZUKQorCisvKiBDb250cm9sbGVyIGNvbW1hbmQgYW5kIHN0YXR1cyBiaXRzICovCisjZGVmaW5lIFRXU0lfQ1RMX0NFCQkweDgwCS8qIEhpZ2ggbGV2ZWwgY29udHJvbGxlciBlbmFibGUgKi8KKyNkZWZpbmUgVFdTSV9DVExfRU5BQgkJMHg0MAkvKiBCdXMgZW5hYmxlICovCisjZGVmaW5lIFRXU0lfQ1RMX1NUQQkJMHgyMAkvKiBNYXN0ZXItbW9kZSBzdGFydCwgSFcgY2xlYXJzIHdoZW4gZG9uZSAqLworI2RlZmluZSBUV1NJX0NUTF9TVFAJCTB4MTAJLyogTWFzdGVyLW1vZGUgc3RvcCwgSFcgY2xlYXJzIHdoZW4gZG9uZSAqLworI2RlZmluZSBUV1NJX0NUTF9JRkxHCQkweDA4CS8qIEhXIGV2ZW50LCBTVyB3cml0ZXMgMCB0byBBQ0sgKi8KKyNkZWZpbmUgVFdTSV9DVExfQUFLCQkweDA0CS8qIEFzc2VydCBBQ0sgKi8KKworLyogU3RhdHVzIHZhbHVlcyAqLworI2RlZmluZSBTVEFUX0VSUk9SCQkweDAwCisjZGVmaW5lIFNUQVRfU1RBUlQJCTB4MDgKKyNkZWZpbmUgU1RBVF9SRVBfU1RBUlQJCTB4MTAKKyNkZWZpbmUgU1RBVF9UWEFERFJfQUNLCQkweDE4CisjZGVmaW5lIFNUQVRfVFhBRERSX05BSwkJMHgyMAorI2RlZmluZSBTVEFUX1RYREFUQV9BQ0sJCTB4MjgKKyNkZWZpbmUgU1RBVF9UWERBVEFfTkFLCQkweDMwCisjZGVmaW5lIFNUQVRfTE9TVF9BUkJfMzgJMHgzOAorI2RlZmluZSBTVEFUX1JYQUREUl9BQ0sJCTB4NDAKKyNkZWZpbmUgU1RBVF9SWEFERFJfTkFLCQkweDQ4CisjZGVmaW5lIFNUQVRfUlhEQVRBX0FDSwkJMHg1MAorI2RlZmluZSBTVEFUX1JYREFUQV9OQUsJCTB4NTgKKyNkZWZpbmUgU1RBVF9TTEFWRV82MAkJMHg2MAorI2RlZmluZSBTVEFUX0xPU1RfQVJCXzY4CTB4NjgKKyNkZWZpbmUgU1RBVF9TTEFWRV83MAkJMHg3MAorI2RlZmluZSBTVEFUX0xPU1RfQVJCXzc4CTB4NzgKKyNkZWZpbmUgU1RBVF9TTEFWRV84MAkJMHg4MAorI2RlZmluZSBTVEFUX1NMQVZFXzg4CQkweDg4CisjZGVmaW5lIFNUQVRfR0VOREFUQV9BQ0sJMHg5MAorI2RlZmluZSBTVEFUX0dFTkRBVEFfTkFLCTB4OTgKKyNkZWZpbmUgU1RBVF9TTEFWRV9BMAkJMHhBMAorI2RlZmluZSBTVEFUX1NMQVZFX0E4CQkweEE4CisjZGVmaW5lIFNUQVRfTE9TVF9BUkJfQjAJMHhCMAorI2RlZmluZSBTVEFUX1NMQVZFX0xPU1QJCTB4QjgKKyNkZWZpbmUgU1RBVF9TTEFWRV9OQUsJCTB4QzAKKyNkZWZpbmUgU1RBVF9TTEFWRV9BQ0sJCTB4QzgKKyNkZWZpbmUgU1RBVF9BRDJXX0FDSwkJMHhEMAorI2RlZmluZSBTVEFUX0FEMldfTkFLCQkweEQ4CisjZGVmaW5lIFNUQVRfSURMRQkJMHhGOAorCisvKiBUV1NJX0lOVCB2YWx1ZXMgKi8KKyNkZWZpbmUgVFdTSV9JTlRfU1RfSU5UCQlCSVRfVUxMKDApCisjZGVmaW5lIFRXU0lfSU5UX1RTX0lOVAkJQklUX1VMTCgxKQorI2RlZmluZSBUV1NJX0lOVF9DT1JFX0lOVAlCSVRfVUxMKDIpCisjZGVmaW5lIFRXU0lfSU5UX1NUX0VOCQlCSVRfVUxMKDQpCisjZGVmaW5lIFRXU0lfSU5UX1RTX0VOCQlCSVRfVUxMKDUpCisjZGVmaW5lIFRXU0lfSU5UX0NPUkVfRU4JQklUX1VMTCg2KQorI2RlZmluZSBUV1NJX0lOVF9TREFfT1ZSCUJJVF9VTEwoOCkKKyNkZWZpbmUgVFdTSV9JTlRfU0NMX09WUglCSVRfVUxMKDkpCisjZGVmaW5lIFRXU0lfSU5UX1NEQQkJQklUX1VMTCgxMCkKKyNkZWZpbmUgVFdTSV9JTlRfU0NMCQlCSVRfVUxMKDExKQorCisjZGVmaW5lIEkyQ19PQ1RFT05fRVZFTlRfV0FJVCA4MCAvKiBtaWNyb3NlY29uZHMgKi8KKworLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLworc3RydWN0IG9jdGVvbl9pMmNfcmVnX29mZnNldCB7CisJdW5zaWduZWQgaW50IHN3X3R3c2k7CisJdW5zaWduZWQgaW50IHR3c2lfaW50OworCXVuc2lnbmVkIGludCBzd190d3NpX2V4dDsKK307CisKKyNkZWZpbmUgU1dfVFdTSSh4KQkoeC0+cm9mZi5zd190d3NpKQorI2RlZmluZSBUV1NJX0lOVCh4KQkoeC0+cm9mZi50d3NpX2ludCkKKyNkZWZpbmUgU1dfVFdTSV9FWFQoeCkJKHgtPnJvZmYuc3dfdHdzaV9leHQpCisKK3N0cnVjdCBvY3Rlb25faTJjIHsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcDsKKwlzdHJ1Y3Qgb2N0ZW9uX2kyY19yZWdfb2Zmc2V0IHJvZmY7CisJc3RydWN0IGNsayAqY2xrOworCWludCBpcnE7CisJaW50IGhsY19pcnE7CQkvKiBGb3IgY243ODkwIG9ubHkgKi8KKwl1MzIgdHdzaV9mcmVxOworCWludCBzeXNfZnJlcTsKKwl2b2lkIF9faW9tZW0gKnR3c2lfYmFzZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJYm9vbCBobGNfZW5hYmxlZDsKKwlib29sIGJyb2tlbl9pcnFfbW9kZTsKKwlib29sIGJyb2tlbl9pcnFfY2hlY2s7CisJdm9pZCAoKmludF9lbmFibGUpKHN0cnVjdCBvY3Rlb25faTJjICopOworCXZvaWQgKCppbnRfZGlzYWJsZSkoc3RydWN0IG9jdGVvbl9pMmMgKik7CisJdm9pZCAoKmhsY19pbnRfZW5hYmxlKShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqKTsKKwl2b2lkICgqaGxjX2ludF9kaXNhYmxlKShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqKTsKKwlhdG9taWNfdCBpbnRfZW5hYmxlX2NudDsKKwlhdG9taWNfdCBobGNfaW50X2VuYWJsZV9jbnQ7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSTJDX1RIVU5ERVJYKQorCXN0cnVjdCBtc2l4X2VudHJ5IGkyY19tc2l4OworI2VuZGlmCisJc3RydWN0IGkyY19zbWJ1c19hbGVydF9zZXR1cCBhbGVydF9kYXRhOworCXN0cnVjdCBpMmNfY2xpZW50ICphcmE7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgb2N0ZW9uX2kyY193cml0ZXFfZmx1c2godTY0IHZhbCwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCV9fcmF3X3dyaXRlcSh2YWwsIGFkZHIpOworCV9fcmF3X3JlYWRxKGFkZHIpOwkvKiB3YWl0IGZvciB3cml0ZSB0byBsYW5kICovCit9CisKKy8qKgorICogb2N0ZW9uX2kyY19yZWdfd3JpdGUgLSB3cml0ZSBhbiBJMkMgY29yZSByZWdpc3RlcgorICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCisgKiBAZW9wX3JlZzogUmVnaXN0ZXIgc2VsZWN0b3IKKyAqIEBkYXRhOiBWYWx1ZSB0byBiZSB3cml0dGVuCisgKgorICogVGhlIEkyQyBjb3JlIHJlZ2lzdGVycyBhcmUgYWNjZXNzZWQgaW5kaXJlY3RseSB2aWEgdGhlIFNXX1RXU0kgQ1NSLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgb2N0ZW9uX2kyY19yZWdfd3JpdGUoc3RydWN0IG9jdGVvbl9pMmMgKmkyYywgdTY0IGVvcF9yZWcsIHU4IGRhdGEpCit7CisJdTY0IHRtcDsKKworCV9fcmF3X3dyaXRlcShTV19UV1NJX1YgfCBlb3BfcmVnIHwgZGF0YSwgaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJKGkyYykpOworCisJcmVhZHFfcG9sbF90aW1lb3V0KGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSShpMmMpLCB0bXAsIHRtcCAmIFNXX1RXU0lfViwKKwkJCSAgIEkyQ19PQ1RFT05fRVZFTlRfV0FJVCwgaTJjLT5hZGFwLnRpbWVvdXQpOworfQorCisjZGVmaW5lIG9jdGVvbl9pMmNfY3RsX3dyaXRlKGkyYywgdmFsKQkJCQkJXAorCW9jdGVvbl9pMmNfcmVnX3dyaXRlKGkyYywgU1dfVFdTSV9FT1BfVFdTSV9DVEwsIHZhbCkKKyNkZWZpbmUgb2N0ZW9uX2kyY19kYXRhX3dyaXRlKGkyYywgdmFsKQkJCQkJXAorCW9jdGVvbl9pMmNfcmVnX3dyaXRlKGkyYywgU1dfVFdTSV9FT1BfVFdTSV9EQVRBLCB2YWwpCisKKy8qKgorICogb2N0ZW9uX2kyY19yZWdfcmVhZCAtIHJlYWQgbG93ZXIgYml0cyBvZiBhbiBJMkMgY29yZSByZWdpc3RlcgorICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCisgKiBAZW9wX3JlZzogUmVnaXN0ZXIgc2VsZWN0b3IKKyAqCisgKiBSZXR1cm5zIHRoZSBkYXRhLgorICoKKyAqIFRoZSBJMkMgY29yZSByZWdpc3RlcnMgYXJlIGFjY2Vzc2VkIGluZGlyZWN0bHkgdmlhIHRoZSBTV19UV1NJIENTUi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2N0ZW9uX2kyY19yZWdfcmVhZChzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjLCB1NjQgZW9wX3JlZywKKwkJCQkgICAgICBpbnQgKmVycm9yKQoreworCXU2NCB0bXA7CisJaW50IHJldDsKKworCV9fcmF3X3dyaXRlcShTV19UV1NJX1YgfCBlb3BfcmVnIHwgU1dfVFdTSV9SLCBpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0koaTJjKSk7CisKKwlyZXQgPSByZWFkcV9wb2xsX3RpbWVvdXQoaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJKGkyYyksIHRtcCwKKwkJCQkgdG1wICYgU1dfVFdTSV9WLCBJMkNfT0NURU9OX0VWRU5UX1dBSVQsCisJCQkJIGkyYy0+YWRhcC50aW1lb3V0KTsKKwlpZiAoZXJyb3IpCisJCSplcnJvciA9IHJldDsKKwlyZXR1cm4gdG1wICYgMHhGRjsKK30KKworI2RlZmluZSBvY3Rlb25faTJjX2N0bF9yZWFkKGkyYykJCQkJCVwKKwlvY3Rlb25faTJjX3JlZ19yZWFkKGkyYywgU1dfVFdTSV9FT1BfVFdTSV9DVEwsIE5VTEwpCisjZGVmaW5lIG9jdGVvbl9pMmNfZGF0YV9yZWFkKGkyYywgZXJyb3IpCQkJCVwKKwlvY3Rlb25faTJjX3JlZ19yZWFkKGkyYywgU1dfVFdTSV9FT1BfVFdTSV9EQVRBLCBlcnJvcikKKyNkZWZpbmUgb2N0ZW9uX2kyY19zdGF0X3JlYWQoaTJjKQkJCQkJXAorCW9jdGVvbl9pMmNfcmVnX3JlYWQoaTJjLCBTV19UV1NJX0VPUF9UV1NJX1NUQVQsIE5VTEwpCisKKy8qKgorICogb2N0ZW9uX2kyY19yZWFkX2ludCAtIHJlYWQgdGhlIFRXU0lfSU5UIHJlZ2lzdGVyCisgKiBAaTJjOiBUaGUgc3RydWN0IG9jdGVvbl9pMmMKKyAqCisgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTY0IG9jdGVvbl9pMmNfcmVhZF9pbnQoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZHEoaTJjLT50d3NpX2Jhc2UgKyBUV1NJX0lOVChpMmMpKTsKK30KKworLyoqCisgKiBvY3Rlb25faTJjX3dyaXRlX2ludCAtIHdyaXRlIHRoZSBUV1NJX0lOVCByZWdpc3RlcgorICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCisgKiBAZGF0YTogVmFsdWUgdG8gYmUgd3JpdHRlbgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgb2N0ZW9uX2kyY193cml0ZV9pbnQoc3RydWN0IG9jdGVvbl9pMmMgKmkyYywgdTY0IGRhdGEpCit7CisJb2N0ZW9uX2kyY193cml0ZXFfZmx1c2goZGF0YSwgaTJjLT50d3NpX2Jhc2UgKyBUV1NJX0lOVChpMmMpKTsKK30KKworLyogUHJvdG90eXBlcyAqLworaXJxcmV0dXJuX3Qgb2N0ZW9uX2kyY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKK2ludCBvY3Rlb25faTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNncywgaW50IG51bSk7CitpbnQgb2N0ZW9uX2kyY19pbml0X2xvd2xldmVsKHN0cnVjdCBvY3Rlb25faTJjICppMmMpOwordm9pZCBvY3Rlb25faTJjX3NldF9jbG9jayhzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKTsKK2V4dGVybiBzdHJ1Y3QgaTJjX2J1c19yZWNvdmVyeV9pbmZvIG9jdGVvbl9pMmNfcmVjb3ZlcnlfaW5mbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2N0ZW9uLXBsYXRkcnYuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2N0ZW9uLXBsYXRkcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTc1MjRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY3Rlb24tcGxhdGRydi5jCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogKEMpIENvcHlyaWdodCAyMDA5LTIwMTAKKyAqIE5va2lhIFNpZW1lbnMgTmV0d29ya3MsIG1pY2hhZWwubGF3bmljay5leHRAbnNuLmNvbQorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTYgQ2F2aXVtLCBJbmMuCisgKgorICogVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIGkyYyBhZGFwdGVyIGluIENhdml1bSBOZXR3b3JrcycgT0NURU9OIHByb2Nlc3NvcnMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vb2N0ZW9uL29jdGVvbi5oPgorI2luY2x1ZGUgImkyYy1vY3Rlb24tY29yZS5oIgorCisjZGVmaW5lIERSVl9OQU1FICJpMmMtb2N0ZW9uIgorCisvKioKKyAqIG9jdGVvbl9pMmNfaW50X2VuYWJsZSAtIGVuYWJsZSB0aGUgQ09SRSBpbnRlcnJ1cHQKKyAqIEBpMmM6IFRoZSBzdHJ1Y3Qgb2N0ZW9uX2kyYworICoKKyAqIFRoZSBpbnRlcnJ1cHQgd2lsbCBiZSBhc3NlcnRlZCB3aGVuIHRoZXJlIGlzIG5vbi1TVEFUX0lETEUgc3RhdGUgaW4KKyAqIHRoZSBTV19UV1NJX0VPUF9UV1NJX1NUQVQgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIG9jdGVvbl9pMmNfaW50X2VuYWJsZShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQoreworCW9jdGVvbl9pMmNfd3JpdGVfaW50KGkyYywgVFdTSV9JTlRfQ09SRV9FTik7Cit9CisKKy8qIGRpc2FibGUgdGhlIENPUkUgaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBvY3Rlb25faTJjX2ludF9kaXNhYmxlKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCit7CisJLyogY2xlYXIgVFMvU1QvSUZMRyBldmVudHMgKi8KKwlvY3Rlb25faTJjX3dyaXRlX2ludChpMmMsIDApOworfQorCisvKioKKyAqIG9jdGVvbl9pMmNfaW50X2VuYWJsZTc4IC0gZW5hYmxlIHRoZSBDT1JFIGludGVycnVwdAorICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCisgKgorICogVGhlIGludGVycnVwdCB3aWxsIGJlIGFzc2VydGVkIHdoZW4gdGhlcmUgaXMgbm9uLVNUQVRfSURMRSBzdGF0ZSBpbiB0aGUKKyAqIFNXX1RXU0lfRU9QX1RXU0lfU1RBVCByZWdpc3Rlci4KKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19pbnRfZW5hYmxlNzgoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKK3sKKwlhdG9taWNfaW5jX3JldHVybigmaTJjLT5pbnRfZW5hYmxlX2NudCk7CisJZW5hYmxlX2lycShpMmMtPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fb2N0ZW9uX2kyY19pcnFfZGlzYWJsZShhdG9taWNfdCAqY250LCBpbnQgaXJxKQoreworCWludCBjb3VudDsKKworCS8qCisJICogVGhlIGludGVycnVwdCBjYW4gYmUgZGlzYWJsZWQgaW4gdHdvIHBsYWNlcywgYnV0IHdlIG9ubHkKKwkgKiB3YW50IHRvIG1ha2UgdGhlIGRpc2FibGVfaXJxX25vc3luYygpIGNhbGwgb25jZSwgc28ga2VlcAorCSAqIHRyYWNrIHdpdGggdGhlIGF0b21pYyB2YXJpYWJsZS4KKwkgKi8KKwljb3VudCA9IGF0b21pY19kZWNfaWZfcG9zaXRpdmUoY250KTsKKwlpZiAoY291bnQgPj0gMCkKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Cit9CisKKy8qIGRpc2FibGUgdGhlIENPUkUgaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBvY3Rlb25faTJjX2ludF9kaXNhYmxlNzgoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKK3sKKwlfX29jdGVvbl9pMmNfaXJxX2Rpc2FibGUoJmkyYy0+aW50X2VuYWJsZV9jbnQsIGkyYy0+aXJxKTsKK30KKworLyoqCisgKiBvY3Rlb25faTJjX2hsY19pbnRfZW5hYmxlNzggLSBlbmFibGUgdGhlIFNUIGludGVycnVwdAorICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCisgKgorICogVGhlIGludGVycnVwdCB3aWxsIGJlIGFzc2VydGVkIHdoZW4gdGhlcmUgaXMgbm9uLVNUQVRfSURMRSBzdGF0ZSBpbgorICogdGhlIFNXX1RXU0lfRU9QX1RXU0lfU1RBVCByZWdpc3Rlci4KKyAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19obGNfaW50X2VuYWJsZTc4KHN0cnVjdCBvY3Rlb25faTJjICppMmMpCit7CisJYXRvbWljX2luY19yZXR1cm4oJmkyYy0+aGxjX2ludF9lbmFibGVfY250KTsKKwllbmFibGVfaXJxKGkyYy0+aGxjX2lycSk7Cit9CisKKy8qIGRpc2FibGUgdGhlIFNUIGludGVycnVwdCAqLworc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19obGNfaW50X2Rpc2FibGU3OChzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQoreworCV9fb2N0ZW9uX2kyY19pcnFfZGlzYWJsZSgmaTJjLT5obGNfaW50X2VuYWJsZV9jbnQsIGkyYy0+aGxjX2lycSk7Cit9CisKKy8qIEhMQyBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lICovCitzdGF0aWMgaXJxcmV0dXJuX3Qgb2N0ZW9uX2kyY19obGNfaXNyNzgoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBvY3Rlb25faTJjICppMmMgPSBkZXZfaWQ7CisKKwlpMmMtPmhsY19pbnRfZGlzYWJsZShpMmMpOworCXdha2VfdXAoJmkyYy0+cXVldWUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25faTJjX2hsY19pbnRfZW5hYmxlKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCit7CisJb2N0ZW9uX2kyY193cml0ZV9pbnQoaTJjLCBUV1NJX0lOVF9TVF9FTik7Cit9CisKK3N0YXRpYyB1MzIgb2N0ZW9uX2kyY19mdW5jdGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgKEkyQ19GVU5DX1NNQlVTX0VNVUwgJiB+STJDX0ZVTkNfU01CVVNfUVVJQ0spIHwKKwkgICAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9CTE9DS19EQVRBIHwgSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIG9jdGVvbl9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgPSBvY3Rlb25faTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBvY3Rlb25faTJjX2Z1bmN0aW9uYWxpdHksCit9OworCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIG9jdGVvbl9pMmNfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gIk9DVEVPTiBhZGFwdGVyIiwKKwkuYWxnbyA9ICZvY3Rlb25faTJjX2FsZ28sCit9OworCitzdGF0aWMgaW50IG9jdGVvbl9pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlpbnQgaXJxLCByZXN1bHQgPSAwLCBobGNfaXJxID0gMDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlc19tZW07CisJc3RydWN0IG9jdGVvbl9pMmMgKmkyYzsKKwlib29sIGNuNzh4eF9zdHlsZTsKKworCWNuNzh4eF9zdHlsZSA9IG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJjYXZpdW0sb2N0ZW9uLTc4OTAtdHdzaSIpOworCWlmIChjbjc4eHhfc3R5bGUpIHsKKwkJaGxjX2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJCWlmIChobGNfaXJxIDwgMCkKKwkJCXJldHVybiBobGNfaXJxOworCisJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMik7CisJCWlmIChpcnEgPCAwKQorCQkJcmV0dXJuIGlycTsKKwl9IGVsc2UgeworCQkvKiBBbGwgYWRhcHRvcnMgaGF2ZSBhbiBpcnEuICAqLworCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCQlpZiAoaXJxIDwgMCkKKwkJCXJldHVybiBpcnE7CisJfQorCisJaTJjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaTJjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpMmMpIHsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWkyYy0+ZGV2ID0gJnBkZXYtPmRldjsKKworCWkyYy0+cm9mZi5zd190d3NpID0gMHgwMDsKKwlpMmMtPnJvZmYudHdzaV9pbnQgPSAweDEwOworCWkyYy0+cm9mZi5zd190d3NpX2V4dCA9IDB4MTg7CisKKwlyZXNfbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpMmMtPnR3c2lfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXNfbWVtKTsKKwlpZiAoSVNfRVJSKGkyYy0+dHdzaV9iYXNlKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKGkyYy0+dHdzaV9iYXNlKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiAiY2xvY2stcmF0ZSIgaXMgYSBsZWdhY3kgYmluZGluZywgdGhlIG9mZmljaWFsIGJpbmRpbmcgaXMKKwkgKiAiY2xvY2stZnJlcXVlbmN5Ii4gIFRyeSB0aGUgb2ZmaWNpYWwgb25lIGZpcnN0IGFuZCB0aGVuCisJICogZmFsbCBiYWNrIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisJICovCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJjbG9jay1mcmVxdWVuY3kiLCAmaTJjLT50d3NpX2ZyZXEpICYmCisJICAgIG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJjbG9jay1yYXRlIiwgJmkyYy0+dHdzaV9mcmVxKSkgeworCQlkZXZfZXJyKGkyYy0+ZGV2LAorCQkJIm5vIEkyQyAnY2xvY2stcmF0ZScgb3IgJ2Nsb2NrLWZyZXF1ZW5jeScgcHJvcGVydHlcbiIpOworCQlyZXN1bHQgPSAtRU5YSU87CisJCWdvdG8gb3V0OworCX0KKworCWkyYy0+c3lzX2ZyZXEgPSBvY3Rlb25fZ2V0X2lvX2Nsb2NrX3JhdGUoKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmkyYy0+cXVldWUpOworCisJaTJjLT5pcnEgPSBpcnE7CisKKwlpZiAoY243OHh4X3N0eWxlKSB7CisJCWkyYy0+aGxjX2lycSA9IGhsY19pcnE7CisKKwkJaTJjLT5pbnRfZW5hYmxlID0gb2N0ZW9uX2kyY19pbnRfZW5hYmxlNzg7CisJCWkyYy0+aW50X2Rpc2FibGUgPSBvY3Rlb25faTJjX2ludF9kaXNhYmxlNzg7CisJCWkyYy0+aGxjX2ludF9lbmFibGUgPSBvY3Rlb25faTJjX2hsY19pbnRfZW5hYmxlNzg7CisJCWkyYy0+aGxjX2ludF9kaXNhYmxlID0gb2N0ZW9uX2kyY19obGNfaW50X2Rpc2FibGU3ODsKKworCQlpcnFfc2V0X3N0YXR1c19mbGFncyhpMmMtPmlycSwgSVJRX05PQVVUT0VOKTsKKwkJaXJxX3NldF9zdGF0dXNfZmxhZ3MoaTJjLT5obGNfaXJxLCBJUlFfTk9BVVRPRU4pOworCisJCXJlc3VsdCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaTJjLT5obGNfaXJxLAorCQkJCQkgIG9jdGVvbl9pMmNfaGxjX2lzcjc4LCAwLAorCQkJCQkgIERSVl9OQU1FLCBpMmMpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJZGV2X2VycihpMmMtPmRldiwgImZhaWxlZCB0byBhdHRhY2ggaW50ZXJydXB0XG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJaTJjLT5pbnRfZW5hYmxlID0gb2N0ZW9uX2kyY19pbnRfZW5hYmxlOworCQlpMmMtPmludF9kaXNhYmxlID0gb2N0ZW9uX2kyY19pbnRfZGlzYWJsZTsKKwkJaTJjLT5obGNfaW50X2VuYWJsZSA9IG9jdGVvbl9pMmNfaGxjX2ludF9lbmFibGU7CisJCWkyYy0+aGxjX2ludF9kaXNhYmxlID0gb2N0ZW9uX2kyY19pbnRfZGlzYWJsZTsKKwl9CisKKwlyZXN1bHQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGkyYy0+aXJxLAorCQkJCSAgb2N0ZW9uX2kyY19pc3IsIDAsIERSVl9OQU1FLCBpMmMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWRldl9lcnIoaTJjLT5kZXYsICJmYWlsZWQgdG8gYXR0YWNoIGludGVycnVwdFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzhYWCkpCisJCWkyYy0+YnJva2VuX2lycV9jaGVjayA9IHRydWU7CisKKwlyZXN1bHQgPSBvY3Rlb25faTJjX2luaXRfbG93bGV2ZWwoaTJjKTsKKwlpZiAocmVzdWx0KSB7CisJCWRldl9lcnIoaTJjLT5kZXYsICJpbml0IGxvdyBsZXZlbCBmYWlsZWRcbiIpOworCQlnb3RvICBvdXQ7CisJfQorCisJb2N0ZW9uX2kyY19zZXRfY2xvY2soaTJjKTsKKworCWkyYy0+YWRhcCA9IG9jdGVvbl9pMmNfb3BzOworCWkyYy0+YWRhcC50aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcygyKTsKKwlpMmMtPmFkYXAucmV0cmllcyA9IDU7CisJaTJjLT5hZGFwLmJ1c19yZWNvdmVyeV9pbmZvID0gJm9jdGVvbl9pMmNfcmVjb3ZlcnlfaW5mbzsKKwlpMmMtPmFkYXAuZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaTJjLT5hZGFwLmRldi5vZl9ub2RlID0gbm9kZTsKKwlpMmNfc2V0X2FkYXBkYXRhKCZpMmMtPmFkYXAsIGkyYyk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjKTsKKworCXJlc3VsdCA9IGkyY19hZGRfYWRhcHRlcigmaTJjLT5hZGFwKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXQ7CisJZGV2X2luZm8oaTJjLT5kZXYsICJwcm9iZWRcbiIpOworCXJldHVybiAwOworCitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK307CisKK3N0YXRpYyBpbnQgb2N0ZW9uX2kyY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpMmNfZGVsX2FkYXB0ZXIoJmkyYy0+YWRhcCk7CisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvY3Rlb25faTJjX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJjYXZpdW0sb2N0ZW9uLTM4NjAtdHdzaSIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJjYXZpdW0sb2N0ZW9uLTc4OTAtdHdzaSIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2N0ZW9uX2kyY19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9jdGVvbl9pMmNfZHJpdmVyID0geworCS5wcm9iZQkJPSBvY3Rlb25faTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gb2N0ZW9uX2kyY19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gRFJWX05BTUUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9jdGVvbl9pMmNfbWF0Y2gsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIob2N0ZW9uX2kyY19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIExhd25pY2sgPG1pY2hhZWwubGF3bmljay5leHRAbnNuLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDLUJ1cyBhZGFwdGVyIGZvciBDYXZpdW0gT0NURU9OIHByb2Nlc3NvcnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2N0ZW9uLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jdGVvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGFlMzUxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2N0ZW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjU1ICswLDAgQEAKLS8qCi0gKiAoQykgQ29weXJpZ2h0IDIwMDktMjAxMAotICogTm9raWEgU2llbWVucyBOZXR3b3JrcywgbWljaGFlbC5sYXduaWNrLmV4dEBuc24uY29tCi0gKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxNiBDYXZpdW0sIEluYy4KLSAqCi0gKiBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgaTJjIGFkYXB0ZXIgaW4gQ2F2aXVtIE5ldHdvcmtzJyBPQ1RFT04gcHJvY2Vzc29ycy4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLQotI2luY2x1ZGUgPGFzbS9vY3Rlb24vb2N0ZW9uLmg+Ci0KLSNkZWZpbmUgRFJWX05BTUUgImkyYy1vY3Rlb24iCi0KLS8qIFJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgU1dfVFdTSQkJCTB4MDAKLSNkZWZpbmUgVFdTSV9JTlQJCTB4MTAKLSNkZWZpbmUgU1dfVFdTSV9FWFQJCTB4MTgKLQotLyogQ29udHJvbGxlciBjb21tYW5kIHBhdHRlcm5zICovCi0jZGVmaW5lIFNXX1RXU0lfVgkJQklUX1VMTCg2MykJLyogVmFsaWQgYml0ICovCi0jZGVmaW5lIFNXX1RXU0lfRUlBCQlCSVRfVUxMKDYxKQkvKiBFeHRlbmRlZCBpbnRlcm5hbCBhZGRyZXNzICovCi0jZGVmaW5lIFNXX1RXU0lfUgkJQklUX1VMTCg1NikJLyogUmVzdWx0IG9yIHJlYWQgYml0ICovCi0jZGVmaW5lIFNXX1RXU0lfU09WUgkJQklUX1VMTCg1NSkJLyogU2l6ZSBvdmVycmlkZSAqLwotI2RlZmluZSBTV19UV1NJX1NJWkVfU0hJRlQJNTIKLSNkZWZpbmUgU1dfVFdTSV9BRERSX1NISUZUCTQwCi0jZGVmaW5lIFNXX1RXU0lfSUFfU0hJRlQJMzIJCS8qIEludGVybmFsIGFkZHJlc3MgKi8KLQotLyogQ29udHJvbGxlciBvcGNvZGUgd29yZCAoYml0cyA2MDo1NykgKi8KLSNkZWZpbmUgU1dfVFdTSV9PUF9TSElGVAk1NwotI2RlZmluZSBTV19UV1NJX09QXzcJCSgwVUxMIDw8IFNXX1RXU0lfT1BfU0hJRlQpCi0jZGVmaW5lIFNXX1RXU0lfT1BfN19JQQkJKDFVTEwgPDwgU1dfVFdTSV9PUF9TSElGVCkKLSNkZWZpbmUgU1dfVFdTSV9PUF8xMAkJKDJVTEwgPDwgU1dfVFdTSV9PUF9TSElGVCkKLSNkZWZpbmUgU1dfVFdTSV9PUF8xMF9JQQkoM1VMTCA8PCBTV19UV1NJX09QX1NISUZUKQotI2RlZmluZSBTV19UV1NJX09QX1RXU0lfQ0xLCSg0VUxMIDw8IFNXX1RXU0lfT1BfU0hJRlQpCi0jZGVmaW5lIFNXX1RXU0lfT1BfRU9QCQkoNlVMTCA8PCBTV19UV1NJX09QX1NISUZUKSAvKiBFeHRlbmRlZCBvcGNvZGUgKi8KLQotLyogQ29udHJvbGxlciBleHRlbmRlZCBvcGNvZGUgd29yZCAoYml0cyAzNDozMikgKi8KLSNkZWZpbmUgU1dfVFdTSV9FT1BfU0hJRlQJMzIKLSNkZWZpbmUgU1dfVFdTSV9FT1BfVFdTSV9EQVRBCShTV19UV1NJX09QX0VPUCB8IDFVTEwgPDwgU1dfVFdTSV9FT1BfU0hJRlQpCi0jZGVmaW5lIFNXX1RXU0lfRU9QX1RXU0lfQ1RMCShTV19UV1NJX09QX0VPUCB8IDJVTEwgPDwgU1dfVFdTSV9FT1BfU0hJRlQpCi0jZGVmaW5lIFNXX1RXU0lfRU9QX1RXU0lfQ0xLQ1RMCShTV19UV1NJX09QX0VPUCB8IDNVTEwgPDwgU1dfVFdTSV9FT1BfU0hJRlQpCi0jZGVmaW5lIFNXX1RXU0lfRU9QX1RXU0lfU1RBVAkoU1dfVFdTSV9PUF9FT1AgfCAzVUxMIDw8IFNXX1RXU0lfRU9QX1NISUZUKQotI2RlZmluZSBTV19UV1NJX0VPUF9UV1NJX1JTVAkoU1dfVFdTSV9PUF9FT1AgfCA3VUxMIDw8IFNXX1RXU0lfRU9QX1NISUZUKQotCi0vKiBDb250cm9sbGVyIGNvbW1hbmQgYW5kIHN0YXR1cyBiaXRzICovCi0jZGVmaW5lIFRXU0lfQ1RMX0NFCQkweDgwCS8qIEhpZ2ggbGV2ZWwgY29udHJvbGxlciBlbmFibGUgKi8KLSNkZWZpbmUgVFdTSV9DVExfRU5BQgkJMHg0MAkvKiBCdXMgZW5hYmxlICovCi0jZGVmaW5lIFRXU0lfQ1RMX1NUQQkJMHgyMAkvKiBNYXN0ZXItbW9kZSBzdGFydCwgSFcgY2xlYXJzIHdoZW4gZG9uZSAqLwotI2RlZmluZSBUV1NJX0NUTF9TVFAJCTB4MTAJLyogTWFzdGVyLW1vZGUgc3RvcCwgSFcgY2xlYXJzIHdoZW4gZG9uZSAqLwotI2RlZmluZSBUV1NJX0NUTF9JRkxHCQkweDA4CS8qIEhXIGV2ZW50LCBTVyB3cml0ZXMgMCB0byBBQ0sgKi8KLSNkZWZpbmUgVFdTSV9DVExfQUFLCQkweDA0CS8qIEFzc2VydCBBQ0sgKi8KLQotLyogU3RhdHVzIHZhbHVlcyAqLwotI2RlZmluZSBTVEFUX0VSUk9SCQkweDAwCi0jZGVmaW5lIFNUQVRfU1RBUlQJCTB4MDgKLSNkZWZpbmUgU1RBVF9SRVBfU1RBUlQJCTB4MTAKLSNkZWZpbmUgU1RBVF9UWEFERFJfQUNLCQkweDE4Ci0jZGVmaW5lIFNUQVRfVFhBRERSX05BSwkJMHgyMAotI2RlZmluZSBTVEFUX1RYREFUQV9BQ0sJCTB4MjgKLSNkZWZpbmUgU1RBVF9UWERBVEFfTkFLCQkweDMwCi0jZGVmaW5lIFNUQVRfTE9TVF9BUkJfMzgJMHgzOAotI2RlZmluZSBTVEFUX1JYQUREUl9BQ0sJCTB4NDAKLSNkZWZpbmUgU1RBVF9SWEFERFJfTkFLCQkweDQ4Ci0jZGVmaW5lIFNUQVRfUlhEQVRBX0FDSwkJMHg1MAotI2RlZmluZSBTVEFUX1JYREFUQV9OQUsJCTB4NTgKLSNkZWZpbmUgU1RBVF9TTEFWRV82MAkJMHg2MAotI2RlZmluZSBTVEFUX0xPU1RfQVJCXzY4CTB4NjgKLSNkZWZpbmUgU1RBVF9TTEFWRV83MAkJMHg3MAotI2RlZmluZSBTVEFUX0xPU1RfQVJCXzc4CTB4NzgKLSNkZWZpbmUgU1RBVF9TTEFWRV84MAkJMHg4MAotI2RlZmluZSBTVEFUX1NMQVZFXzg4CQkweDg4Ci0jZGVmaW5lIFNUQVRfR0VOREFUQV9BQ0sJMHg5MAotI2RlZmluZSBTVEFUX0dFTkRBVEFfTkFLCTB4OTgKLSNkZWZpbmUgU1RBVF9TTEFWRV9BMAkJMHhBMAotI2RlZmluZSBTVEFUX1NMQVZFX0E4CQkweEE4Ci0jZGVmaW5lIFNUQVRfTE9TVF9BUkJfQjAJMHhCMAotI2RlZmluZSBTVEFUX1NMQVZFX0xPU1QJCTB4QjgKLSNkZWZpbmUgU1RBVF9TTEFWRV9OQUsJCTB4QzAKLSNkZWZpbmUgU1RBVF9TTEFWRV9BQ0sJCTB4QzgKLSNkZWZpbmUgU1RBVF9BRDJXX0FDSwkJMHhEMAotI2RlZmluZSBTVEFUX0FEMldfTkFLCQkweEQ4Ci0jZGVmaW5lIFNUQVRfSURMRQkJMHhGOAotCi0vKiBUV1NJX0lOVCB2YWx1ZXMgKi8KLSNkZWZpbmUgVFdTSV9JTlRfU1RfSU5UCQlCSVRfVUxMKDApCi0jZGVmaW5lIFRXU0lfSU5UX1RTX0lOVAkJQklUX1VMTCgxKQotI2RlZmluZSBUV1NJX0lOVF9DT1JFX0lOVAlCSVRfVUxMKDIpCi0jZGVmaW5lIFRXU0lfSU5UX1NUX0VOCQlCSVRfVUxMKDQpCi0jZGVmaW5lIFRXU0lfSU5UX1RTX0VOCQlCSVRfVUxMKDUpCi0jZGVmaW5lIFRXU0lfSU5UX0NPUkVfRU4JQklUX1VMTCg2KQotI2RlZmluZSBUV1NJX0lOVF9TREFfT1ZSCUJJVF9VTEwoOCkKLSNkZWZpbmUgVFdTSV9JTlRfU0NMX09WUglCSVRfVUxMKDkpCi0jZGVmaW5lIFRXU0lfSU5UX1NEQQkJQklUX1VMTCgxMCkKLSNkZWZpbmUgVFdTSV9JTlRfU0NMCQlCSVRfVUxMKDExKQotCi0jZGVmaW5lIEkyQ19PQ1RFT05fRVZFTlRfV0FJVCA4MCAvKiBtaWNyb3NlY29uZHMgKi8KLQotc3RydWN0IG9jdGVvbl9pMmMgewotCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOwotCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwOwotCWludCBpcnE7Ci0JaW50IGhsY19pcnE7CQkvKiBGb3IgY243ODkwIG9ubHkgKi8KLQl1MzIgdHdzaV9mcmVxOwotCWludCBzeXNfZnJlcTsKLQl2b2lkIF9faW9tZW0gKnR3c2lfYmFzZTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JYm9vbCBobGNfZW5hYmxlZDsKLQlib29sIGJyb2tlbl9pcnFfbW9kZTsKLQlib29sIGJyb2tlbl9pcnFfY2hlY2s7Ci0Jdm9pZCAoKmludF9lbmFibGUpKHN0cnVjdCBvY3Rlb25faTJjICopOwotCXZvaWQgKCppbnRfZGlzYWJsZSkoc3RydWN0IG9jdGVvbl9pMmMgKik7Ci0Jdm9pZCAoKmhsY19pbnRfZW5hYmxlKShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqKTsKLQl2b2lkICgqaGxjX2ludF9kaXNhYmxlKShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqKTsKLQlhdG9taWNfdCBpbnRfZW5hYmxlX2NudDsKLQlhdG9taWNfdCBobGNfaW50X2VuYWJsZV9jbnQ7Ci19OwotCi1zdGF0aWMgdm9pZCBvY3Rlb25faTJjX3dyaXRlcV9mbHVzaCh1NjQgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCi17Ci0JX19yYXdfd3JpdGVxKHZhbCwgYWRkcik7Ci0JX19yYXdfcmVhZHEoYWRkcik7CS8qIHdhaXQgZm9yIHdyaXRlIHRvIGxhbmQgKi8KLX0KLQotLyoqCi0gKiBvY3Rlb25faTJjX3JlZ193cml0ZSAtIHdyaXRlIGFuIEkyQyBjb3JlIHJlZ2lzdGVyCi0gKiBAaTJjOiBUaGUgc3RydWN0IG9jdGVvbl9pMmMKLSAqIEBlb3BfcmVnOiBSZWdpc3RlciBzZWxlY3RvcgotICogQGRhdGE6IFZhbHVlIHRvIGJlIHdyaXR0ZW4KLSAqCi0gKiBUaGUgSTJDIGNvcmUgcmVnaXN0ZXJzIGFyZSBhY2Nlc3NlZCBpbmRpcmVjdGx5IHZpYSB0aGUgU1dfVFdTSSBDU1IuCi0gKi8KLXN0YXRpYyB2b2lkIG9jdGVvbl9pMmNfcmVnX3dyaXRlKHN0cnVjdCBvY3Rlb25faTJjICppMmMsIHU2NCBlb3BfcmVnLCB1OCBkYXRhKQotewotCXU2NCB0bXA7Ci0KLQlfX3Jhd193cml0ZXEoU1dfVFdTSV9WIHwgZW9wX3JlZyB8IGRhdGEsIGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSSk7Ci0JZG8gewotCQl0bXAgPSBfX3Jhd19yZWFkcShpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0kpOwotCX0gd2hpbGUgKCh0bXAgJiBTV19UV1NJX1YpICE9IDApOwotfQotCi0jZGVmaW5lIG9jdGVvbl9pMmNfY3RsX3dyaXRlKGkyYywgdmFsKQkJCQkJXAotCW9jdGVvbl9pMmNfcmVnX3dyaXRlKGkyYywgU1dfVFdTSV9FT1BfVFdTSV9DVEwsIHZhbCkKLSNkZWZpbmUgb2N0ZW9uX2kyY19kYXRhX3dyaXRlKGkyYywgdmFsKQkJCQkJXAotCW9jdGVvbl9pMmNfcmVnX3dyaXRlKGkyYywgU1dfVFdTSV9FT1BfVFdTSV9EQVRBLCB2YWwpCi0KLS8qKgotICogb2N0ZW9uX2kyY19yZWdfcmVhZCAtIHJlYWQgbG93ZXIgYml0cyBvZiBhbiBJMkMgY29yZSByZWdpc3RlcgotICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCi0gKiBAZW9wX3JlZzogUmVnaXN0ZXIgc2VsZWN0b3IKLSAqCi0gKiBSZXR1cm5zIHRoZSBkYXRhLgotICoKLSAqIFRoZSBJMkMgY29yZSByZWdpc3RlcnMgYXJlIGFjY2Vzc2VkIGluZGlyZWN0bHkgdmlhIHRoZSBTV19UV1NJIENTUi4KLSAqLwotc3RhdGljIHU4IG9jdGVvbl9pMmNfcmVnX3JlYWQoc3RydWN0IG9jdGVvbl9pMmMgKmkyYywgdTY0IGVvcF9yZWcpCi17Ci0JdTY0IHRtcDsKLQotCV9fcmF3X3dyaXRlcShTV19UV1NJX1YgfCBlb3BfcmVnIHwgU1dfVFdTSV9SLCBpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0kpOwotCWRvIHsKLQkJdG1wID0gX19yYXdfcmVhZHEoaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJKTsKLQl9IHdoaWxlICgodG1wICYgU1dfVFdTSV9WKSAhPSAwKTsKLQotCXJldHVybiB0bXAgJiAweEZGOwotfQotCi0jZGVmaW5lIG9jdGVvbl9pMmNfY3RsX3JlYWQoaTJjKQkJCQkJXAotCW9jdGVvbl9pMmNfcmVnX3JlYWQoaTJjLCBTV19UV1NJX0VPUF9UV1NJX0NUTCkKLSNkZWZpbmUgb2N0ZW9uX2kyY19kYXRhX3JlYWQoaTJjKQkJCQkJXAotCW9jdGVvbl9pMmNfcmVnX3JlYWQoaTJjLCBTV19UV1NJX0VPUF9UV1NJX0RBVEEpCi0jZGVmaW5lIG9jdGVvbl9pMmNfc3RhdF9yZWFkKGkyYykJCQkJCVwKLQlvY3Rlb25faTJjX3JlZ19yZWFkKGkyYywgU1dfVFdTSV9FT1BfVFdTSV9TVEFUKQotCi0vKioKLSAqIG9jdGVvbl9pMmNfcmVhZF9pbnQgLSByZWFkIHRoZSBUV1NJX0lOVCByZWdpc3RlcgotICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCi0gKgotICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJlZ2lzdGVyLgotICovCi1zdGF0aWMgdTY0IG9jdGVvbl9pMmNfcmVhZF9pbnQoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKLXsKLQlyZXR1cm4gX19yYXdfcmVhZHEoaTJjLT50d3NpX2Jhc2UgKyBUV1NJX0lOVCk7Ci19Ci0KLS8qKgotICogb2N0ZW9uX2kyY193cml0ZV9pbnQgLSB3cml0ZSB0aGUgVFdTSV9JTlQgcmVnaXN0ZXIKLSAqIEBpMmM6IFRoZSBzdHJ1Y3Qgb2N0ZW9uX2kyYwotICogQGRhdGE6IFZhbHVlIHRvIGJlIHdyaXR0ZW4KLSAqLwotc3RhdGljIHZvaWQgb2N0ZW9uX2kyY193cml0ZV9pbnQoc3RydWN0IG9jdGVvbl9pMmMgKmkyYywgdTY0IGRhdGEpCi17Ci0Jb2N0ZW9uX2kyY193cml0ZXFfZmx1c2goZGF0YSwgaTJjLT50d3NpX2Jhc2UgKyBUV1NJX0lOVCk7Ci19Ci0KLS8qKgotICogb2N0ZW9uX2kyY19pbnRfZW5hYmxlIC0gZW5hYmxlIHRoZSBDT1JFIGludGVycnVwdAotICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCi0gKgotICogVGhlIGludGVycnVwdCB3aWxsIGJlIGFzc2VydGVkIHdoZW4gdGhlcmUgaXMgbm9uLVNUQVRfSURMRSBzdGF0ZSBpbgotICogdGhlIFNXX1RXU0lfRU9QX1RXU0lfU1RBVCByZWdpc3Rlci4KLSAqLwotc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19pbnRfZW5hYmxlKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCi17Ci0Jb2N0ZW9uX2kyY193cml0ZV9pbnQoaTJjLCBUV1NJX0lOVF9DT1JFX0VOKTsKLX0KLQotLyogZGlzYWJsZSB0aGUgQ09SRSBpbnRlcnJ1cHQgKi8KLXN0YXRpYyB2b2lkIG9jdGVvbl9pMmNfaW50X2Rpc2FibGUoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKLXsKLQkvKiBjbGVhciBUUy9TVC9JRkxHIGV2ZW50cyAqLwotCW9jdGVvbl9pMmNfd3JpdGVfaW50KGkyYywgMCk7Ci19Ci0KLS8qKgotICogb2N0ZW9uX2kyY19pbnRfZW5hYmxlNzggLSBlbmFibGUgdGhlIENPUkUgaW50ZXJydXB0Ci0gKiBAaTJjOiBUaGUgc3RydWN0IG9jdGVvbl9pMmMKLSAqCi0gKiBUaGUgaW50ZXJydXB0IHdpbGwgYmUgYXNzZXJ0ZWQgd2hlbiB0aGVyZSBpcyBub24tU1RBVF9JRExFIHN0YXRlIGluIHRoZQotICogU1dfVFdTSV9FT1BfVFdTSV9TVEFUIHJlZ2lzdGVyLgotICovCi1zdGF0aWMgdm9pZCBvY3Rlb25faTJjX2ludF9lbmFibGU3OChzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQotewotCWF0b21pY19pbmNfcmV0dXJuKCZpMmMtPmludF9lbmFibGVfY250KTsKLQllbmFibGVfaXJxKGkyYy0+aXJxKTsKLX0KLQotc3RhdGljIHZvaWQgX19vY3Rlb25faTJjX2lycV9kaXNhYmxlKGF0b21pY190ICpjbnQsIGludCBpcnEpCi17Ci0JaW50IGNvdW50OwotCi0JLyoKLQkgKiBUaGUgaW50ZXJydXB0IGNhbiBiZSBkaXNhYmxlZCBpbiB0d28gcGxhY2VzLCBidXQgd2Ugb25seQotCSAqIHdhbnQgdG8gbWFrZSB0aGUgZGlzYWJsZV9pcnFfbm9zeW5jKCkgY2FsbCBvbmNlLCBzbyBrZWVwCi0JICogdHJhY2sgd2l0aCB0aGUgYXRvbWljIHZhcmlhYmxlLgotCSAqLwotCWNvdW50ID0gYXRvbWljX2RlY19pZl9wb3NpdGl2ZShjbnQpOwotCWlmIChjb3VudCA+PSAwKQotCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLX0KLQotLyogZGlzYWJsZSB0aGUgQ09SRSBpbnRlcnJ1cHQgKi8KLXN0YXRpYyB2b2lkIG9jdGVvbl9pMmNfaW50X2Rpc2FibGU3OChzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQotewotCV9fb2N0ZW9uX2kyY19pcnFfZGlzYWJsZSgmaTJjLT5pbnRfZW5hYmxlX2NudCwgaTJjLT5pcnEpOwotfQotCi0vKioKLSAqIG9jdGVvbl9pMmNfaGxjX2ludF9lbmFibGU3OCAtIGVuYWJsZSB0aGUgU1QgaW50ZXJydXB0Ci0gKiBAaTJjOiBUaGUgc3RydWN0IG9jdGVvbl9pMmMKLSAqCi0gKiBUaGUgaW50ZXJydXB0IHdpbGwgYmUgYXNzZXJ0ZWQgd2hlbiB0aGVyZSBpcyBub24tU1RBVF9JRExFIHN0YXRlIGluCi0gKiB0aGUgU1dfVFdTSV9FT1BfVFdTSV9TVEFUIHJlZ2lzdGVyLgotICovCi1zdGF0aWMgdm9pZCBvY3Rlb25faTJjX2hsY19pbnRfZW5hYmxlNzgoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKLXsKLQlhdG9taWNfaW5jX3JldHVybigmaTJjLT5obGNfaW50X2VuYWJsZV9jbnQpOwotCWVuYWJsZV9pcnEoaTJjLT5obGNfaXJxKTsKLX0KLQotLyogZGlzYWJsZSB0aGUgU1QgaW50ZXJydXB0ICovCi1zdGF0aWMgdm9pZCBvY3Rlb25faTJjX2hsY19pbnRfZGlzYWJsZTc4KHN0cnVjdCBvY3Rlb25faTJjICppMmMpCi17Ci0JX19vY3Rlb25faTJjX2lycV9kaXNhYmxlKCZpMmMtPmhsY19pbnRfZW5hYmxlX2NudCwgaTJjLT5obGNfaXJxKTsKLX0KLQotLyoKLSAqIENsZWFudXAgbG93LWxldmVsIHN0YXRlICYgZW5hYmxlIGhpZ2gtbGV2ZWwgY29udHJvbGxlci4KLSAqLwotc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19obGNfZW5hYmxlKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCi17Ci0JaW50IHRyeSA9IDA7Ci0JdTY0IHZhbDsKLQotCWlmIChpMmMtPmhsY19lbmFibGVkKQotCQlyZXR1cm47Ci0JaTJjLT5obGNfZW5hYmxlZCA9IHRydWU7Ci0KLQl3aGlsZSAoMSkgewotCQl2YWwgPSBvY3Rlb25faTJjX2N0bF9yZWFkKGkyYyk7Ci0JCWlmICghKHZhbCAmIChUV1NJX0NUTF9TVEEgfCBUV1NJX0NUTF9TVFApKSkKLQkJCWJyZWFrOwotCi0JCS8qIGNsZWFyIElGTEcgZXZlbnQgKi8KLQkJaWYgKHZhbCAmIFRXU0lfQ1RMX0lGTEcpCi0JCQlvY3Rlb25faTJjX2N0bF93cml0ZShpMmMsIFRXU0lfQ1RMX0VOQUIpOwotCi0JCWlmICh0cnkrKyA+IDEwMCkgewotCQkJcHJfZXJyKCIlczogZ2l2aW5nIHVwXG4iLCBfX2Z1bmNfXyk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIHNwaW4gdW50aWwgYW55IHN0YXJ0L3N0b3AgaGFzIGZpbmlzaGVkICovCi0JCXVkZWxheSgxMCk7Ci0JfQotCW9jdGVvbl9pMmNfY3RsX3dyaXRlKGkyYywgVFdTSV9DVExfQ0UgfCBUV1NJX0NUTF9BQUsgfCBUV1NJX0NUTF9FTkFCKTsKLX0KLQotc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19obGNfZGlzYWJsZShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQotewotCWlmICghaTJjLT5obGNfZW5hYmxlZCkKLQkJcmV0dXJuOwotCi0JaTJjLT5obGNfZW5hYmxlZCA9IGZhbHNlOwotCW9jdGVvbl9pMmNfY3RsX3dyaXRlKGkyYywgVFdTSV9DVExfRU5BQik7Ci19Ci0KLS8qIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBvY3Rlb25faTJjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IG9jdGVvbl9pMmMgKmkyYyA9IGRldl9pZDsKLQotCWkyYy0+aW50X2Rpc2FibGUoaTJjKTsKLQl3YWtlX3VwKCZpMmMtPnF1ZXVlKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotLyogSExDIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBvY3Rlb25faTJjX2hsY19pc3I3OChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IG9jdGVvbl9pMmMgKmkyYyA9IGRldl9pZDsKLQotCWkyYy0+aGxjX2ludF9kaXNhYmxlKGkyYyk7Ci0Jd2FrZV91cCgmaTJjLT5xdWV1ZSk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBib29sIG9jdGVvbl9pMmNfdGVzdF9pZmxnKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCi17Ci0JcmV0dXJuIChvY3Rlb25faTJjX2N0bF9yZWFkKGkyYykgJiBUV1NJX0NUTF9JRkxHKTsKLX0KLQotc3RhdGljIGJvb2wgb2N0ZW9uX2kyY190ZXN0X3JlYWR5KHN0cnVjdCBvY3Rlb25faTJjICppMmMsIGJvb2wgKmZpcnN0KQotewotCWlmIChvY3Rlb25faTJjX3Rlc3RfaWZsZyhpMmMpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWlmICgqZmlyc3QpIHsKLQkJKmZpcnN0ID0gZmFsc2U7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIElSUSBoYXMgc2lnbmFsZWQgYW4gZXZlbnQgYnV0IElGTEcgaGFzbid0IGNoYW5nZWQuCi0JICogU2xlZXAgYW5kIHJldHJ5IG9uY2UuCi0JICovCi0JdXNsZWVwX3JhbmdlKEkyQ19PQ1RFT05fRVZFTlRfV0FJVCwgMiAqIEkyQ19PQ1RFT05fRVZFTlRfV0FJVCk7Ci0JcmV0dXJuIG9jdGVvbl9pMmNfdGVzdF9pZmxnKGkyYyk7Ci19Ci0KLS8qKgotICogb2N0ZW9uX2kyY193YWl0IC0gd2FpdCBmb3IgdGhlIElGTEcgdG8gYmUgc2V0Ci0gKiBAaTJjOiBUaGUgc3RydWN0IG9jdGVvbl9pMmMKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8uCi0gKi8KLXN0YXRpYyBpbnQgb2N0ZW9uX2kyY193YWl0KHN0cnVjdCBvY3Rlb25faTJjICppMmMpCi17Ci0JbG9uZyB0aW1lX2xlZnQ7Ci0JYm9vbCBmaXJzdCA9IDE7Ci0KLQkvKgotCSAqIFNvbWUgY2hpcCByZXZpc2lvbnMgZG9uJ3QgYXNzZXJ0IHRoZSBpcnEgaW4gdGhlIGludGVycnVwdAotCSAqIGNvbnRyb2xsZXIuIFNvIHdlIG11c3QgcG9sbCBmb3IgdGhlIElGTEcgY2hhbmdlLgotCSAqLwotCWlmIChpMmMtPmJyb2tlbl9pcnFfbW9kZSkgewotCQl1NjQgZW5kID0gZ2V0X2ppZmZpZXNfNjQoKSArIGkyYy0+YWRhcC50aW1lb3V0OwotCi0JCXdoaWxlICghb2N0ZW9uX2kyY190ZXN0X2lmbGcoaTJjKSAmJgotCQkgICAgICAgdGltZV9iZWZvcmU2NChnZXRfamlmZmllc182NCgpLCBlbmQpKQotCQkJdXNsZWVwX3JhbmdlKEkyQ19PQ1RFT05fRVZFTlRfV0FJVCAvIDIsIEkyQ19PQ1RFT05fRVZFTlRfV0FJVCk7Ci0KLQkJcmV0dXJuIG9jdGVvbl9pMmNfdGVzdF9pZmxnKGkyYykgPyAwIDogLUVUSU1FRE9VVDsKLQl9Ci0KLQlpMmMtPmludF9lbmFibGUoaTJjKTsKLQl0aW1lX2xlZnQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaTJjLT5xdWV1ZSwgb2N0ZW9uX2kyY190ZXN0X3JlYWR5KGkyYywgJmZpcnN0KSwKLQkJCQkgICAgICAgaTJjLT5hZGFwLnRpbWVvdXQpOwotCWkyYy0+aW50X2Rpc2FibGUoaTJjKTsKLQotCWlmIChpMmMtPmJyb2tlbl9pcnFfY2hlY2sgJiYgIXRpbWVfbGVmdCAmJgotCSAgICBvY3Rlb25faTJjX3Rlc3RfaWZsZyhpMmMpKSB7Ci0JCWRldl9lcnIoaTJjLT5kZXYsICJicm9rZW4gaXJxIGNvbm5lY3Rpb24gZGV0ZWN0ZWQsIHN3aXRjaGluZyB0byBwb2xsaW5nIG1vZGUuXG4iKTsKLQkJaTJjLT5icm9rZW5faXJxX21vZGUgPSB0cnVlOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoIXRpbWVfbGVmdCkKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvY3Rlb25faTJjX2NoZWNrX3N0YXR1cyhzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjLCBpbnQgZmluYWxfcmVhZCkKLXsKLQl1OCBzdGF0ID0gb2N0ZW9uX2kyY19zdGF0X3JlYWQoaTJjKTsKLQotCXN3aXRjaCAoc3RhdCkgewotCS8qIEV2ZXJ5dGhpbmcgaXMgZmluZSAqLwotCWNhc2UgU1RBVF9JRExFOgotCWNhc2UgU1RBVF9BRDJXX0FDSzoKLQljYXNlIFNUQVRfUlhBRERSX0FDSzoKLQljYXNlIFNUQVRfVFhBRERSX0FDSzoKLQljYXNlIFNUQVRfVFhEQVRBX0FDSzoKLQkJcmV0dXJuIDA7Ci0KLQkvKiBBQ0sgYWxsb3dlZCBvbiBwcmUtdGVybWluYWwgYnl0ZXMgb25seSAqLwotCWNhc2UgU1RBVF9SWERBVEFfQUNLOgotCQlpZiAoIWZpbmFsX3JlYWQpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIC1FSU87Ci0KLQkvKiBOQUsgYWxsb3dlZCBvbiB0ZXJtaW5hbCBieXRlIG9ubHkgKi8KLQljYXNlIFNUQVRfUlhEQVRBX05BSzoKLQkJaWYgKGZpbmFsX3JlYWQpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIC1FSU87Ci0KLQkvKiBBcmJpdHJhdGlvbiBsb3N0ICovCi0JY2FzZSBTVEFUX0xPU1RfQVJCXzM4OgotCWNhc2UgU1RBVF9MT1NUX0FSQl82ODoKLQljYXNlIFNUQVRfTE9TVF9BUkJfNzg6Ci0JY2FzZSBTVEFUX0xPU1RfQVJCX0IwOgotCQlyZXR1cm4gLUVBR0FJTjsKLQotCS8qIEJlaW5nIGFkZHJlc3NlZCBhcyBzbGF2ZSwgc2hvdWxkIGJhY2sgb2ZmICYgbGlzdGVuICovCi0JY2FzZSBTVEFUX1NMQVZFXzYwOgotCWNhc2UgU1RBVF9TTEFWRV83MDoKLQljYXNlIFNUQVRfR0VOREFUQV9BQ0s6Ci0JY2FzZSBTVEFUX0dFTkRBVEFfTkFLOgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQkvKiBDb3JlIGJ1c3kgYXMgc2xhdmUgKi8KLQljYXNlIFNUQVRfU0xBVkVfODA6Ci0JY2FzZSBTVEFUX1NMQVZFXzg4OgotCWNhc2UgU1RBVF9TTEFWRV9BMDoKLQljYXNlIFNUQVRfU0xBVkVfQTg6Ci0JY2FzZSBTVEFUX1NMQVZFX0xPU1Q6Ci0JY2FzZSBTVEFUX1NMQVZFX05BSzoKLQljYXNlIFNUQVRfU0xBVkVfQUNLOgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQljYXNlIFNUQVRfVFhEQVRBX05BSzoKLQkJcmV0dXJuIC1FSU87Ci0JY2FzZSBTVEFUX1RYQUREUl9OQUs6Ci0JY2FzZSBTVEFUX1JYQUREUl9OQUs6Ci0JY2FzZSBTVEFUX0FEMldfTkFLOgotCQlyZXR1cm4gLUVOWElPOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoaTJjLT5kZXYsICJ1bmhhbmRsZWQgc3RhdGU6ICVkXG4iLCBzdGF0KTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotfQotCi1zdGF0aWMgYm9vbCBvY3Rlb25faTJjX2hsY190ZXN0X3ZhbGlkKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCi17Ci0JcmV0dXJuIChfX3Jhd19yZWFkcShpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0kpICYgU1dfVFdTSV9WKSA9PSAwOwotfQotCi1zdGF0aWMgYm9vbCBvY3Rlb25faTJjX2hsY190ZXN0X3JlYWR5KHN0cnVjdCBvY3Rlb25faTJjICppMmMsIGJvb2wgKmZpcnN0KQotewotCS8qIGNoZWNrIGlmIHZhbGlkIGJpdCBpcyBjbGVhcmVkICovCi0JaWYgKG9jdGVvbl9pMmNfaGxjX3Rlc3RfdmFsaWQoaTJjKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZiAoKmZpcnN0KSB7Ci0JCSpmaXJzdCA9IGZhbHNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBJUlEgaGFzIHNpZ25hbGVkIGFuIGV2ZW50IGJ1dCB2YWxpZCBiaXQgaXNuJ3QgY2xlYXJlZC4KLQkgKiBTbGVlcCBhbmQgcmV0cnkgb25jZS4KLQkgKi8KLQl1c2xlZXBfcmFuZ2UoSTJDX09DVEVPTl9FVkVOVF9XQUlULCAyICogSTJDX09DVEVPTl9FVkVOVF9XQUlUKTsKLQlyZXR1cm4gb2N0ZW9uX2kyY19obGNfdGVzdF92YWxpZChpMmMpOwotfQotCi1zdGF0aWMgdm9pZCBvY3Rlb25faTJjX2hsY19pbnRfZW5hYmxlKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCi17Ci0Jb2N0ZW9uX2kyY193cml0ZV9pbnQoaTJjLCBUV1NJX0lOVF9TVF9FTik7Ci19Ci0KLXN0YXRpYyB2b2lkIG9jdGVvbl9pMmNfaGxjX2ludF9jbGVhcihzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQotewotCS8qIGNsZWFyIFNUL1RTIGV2ZW50cywgbGlzdGVuIGZvciBuZWl0aGVyICovCi0Jb2N0ZW9uX2kyY193cml0ZV9pbnQoaTJjLCBUV1NJX0lOVF9TVF9JTlQgfCBUV1NJX0lOVF9UU19JTlQpOwotfQotCi0vKioKLSAqIG9jdGVvbl9pMmNfaGxjX3dhaXQgLSB3YWl0IGZvciBhbiBITEMgb3BlcmF0aW9uIHRvIGNvbXBsZXRlCi0gKiBAaTJjOiBUaGUgc3RydWN0IG9jdGVvbl9pMmMKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIC1FVElNRURPVVQuCi0gKi8KLXN0YXRpYyBpbnQgb2N0ZW9uX2kyY19obGNfd2FpdChzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQotewotCWJvb2wgZmlyc3QgPSAxOwotCWludCB0aW1lX2xlZnQ7Ci0KLQkvKgotCSAqIFNvbWUgY24zOHh4IGJvYXJkcyBkb24ndCBhc3NlcnQgdGhlIGlycSBpbiB0aGUgaW50ZXJydXB0Ci0JICogY29udHJvbGxlci4gU28gd2UgbXVzdCBwb2xsIGZvciB0aGUgdmFsaWQgYml0IGNoYW5nZS4KLQkgKi8KLQlpZiAoaTJjLT5icm9rZW5faXJxX21vZGUpIHsKLQkJdTY0IGVuZCA9IGdldF9qaWZmaWVzXzY0KCkgKyBpMmMtPmFkYXAudGltZW91dDsKLQotCQl3aGlsZSAoIW9jdGVvbl9pMmNfaGxjX3Rlc3RfdmFsaWQoaTJjKSAmJgotCQkgICAgICAgdGltZV9iZWZvcmU2NChnZXRfamlmZmllc182NCgpLCBlbmQpKQotCQkJdXNsZWVwX3JhbmdlKEkyQ19PQ1RFT05fRVZFTlRfV0FJVCAvIDIsIEkyQ19PQ1RFT05fRVZFTlRfV0FJVCk7Ci0KLQkJcmV0dXJuIG9jdGVvbl9pMmNfaGxjX3Rlc3RfdmFsaWQoaTJjKSA/IDAgOiAtRVRJTUVET1VUOwotCX0KLQotCWkyYy0+aGxjX2ludF9lbmFibGUoaTJjKTsKLQl0aW1lX2xlZnQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaTJjLT5xdWV1ZSwKLQkJCQkgICAgICAgb2N0ZW9uX2kyY19obGNfdGVzdF9yZWFkeShpMmMsICZmaXJzdCksCi0JCQkJICAgICAgIGkyYy0+YWRhcC50aW1lb3V0KTsKLQlpMmMtPmhsY19pbnRfZGlzYWJsZShpMmMpOwotCWlmICghdGltZV9sZWZ0KQotCQlvY3Rlb25faTJjX2hsY19pbnRfY2xlYXIoaTJjKTsKLQotCWlmIChpMmMtPmJyb2tlbl9pcnFfY2hlY2sgJiYgIXRpbWVfbGVmdCAmJgotCSAgICBvY3Rlb25faTJjX2hsY190ZXN0X3ZhbGlkKGkyYykpIHsKLQkJZGV2X2VycihpMmMtPmRldiwgImJyb2tlbiBpcnEgY29ubmVjdGlvbiBkZXRlY3RlZCwgc3dpdGNoaW5nIHRvIHBvbGxpbmcgbW9kZS5cbiIpOwotCQlpMmMtPmJyb2tlbl9pcnFfbW9kZSA9IHRydWU7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghdGltZV9sZWZ0KQotCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQlyZXR1cm4gMDsKLX0KLQotLyogaGlnaC1sZXZlbC1jb250cm9sbGVyIHB1cmUgcmVhZCBvZiB1cCB0byA4IGJ5dGVzICovCi1zdGF0aWMgaW50IG9jdGVvbl9pMmNfaGxjX3JlYWQoc3RydWN0IG9jdGVvbl9pMmMgKmkyYywgc3RydWN0IGkyY19tc2cgKm1zZ3MpCi17Ci0JaW50IGksIGosIHJldCA9IDA7Ci0JdTY0IGNtZDsKLQotCW9jdGVvbl9pMmNfaGxjX2VuYWJsZShpMmMpOwotCW9jdGVvbl9pMmNfaGxjX2ludF9jbGVhcihpMmMpOwotCi0JY21kID0gU1dfVFdTSV9WIHwgU1dfVFdTSV9SIHwgU1dfVFdTSV9TT1ZSOwotCS8qIFNJWkUgKi8KLQljbWQgfD0gKHU2NCkobXNnc1swXS5sZW4gLSAxKSA8PCBTV19UV1NJX1NJWkVfU0hJRlQ7Ci0JLyogQSAqLwotCWNtZCB8PSAodTY0KShtc2dzWzBdLmFkZHIgJiAweDdmdWxsKSA8PCBTV19UV1NJX0FERFJfU0hJRlQ7Ci0KLQlpZiAobXNnc1swXS5mbGFncyAmIEkyQ19NX1RFTikKLQkJY21kIHw9IFNXX1RXU0lfT1BfMTA7Ci0JZWxzZQotCQljbWQgfD0gU1dfVFdTSV9PUF83OwotCi0Jb2N0ZW9uX2kyY193cml0ZXFfZmx1c2goY21kLCBpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0kpOwotCXJldCA9IG9jdGVvbl9pMmNfaGxjX3dhaXQoaTJjKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCWNtZCA9IF9fcmF3X3JlYWRxKGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSSk7Ci0JaWYgKChjbWQgJiBTV19UV1NJX1IpID09IDApCi0JCXJldHVybiAtRUFHQUlOOwotCi0JZm9yIChpID0gMCwgaiA9IG1zZ3NbMF0ubGVuIC0gMTsgaSAgPCBtc2dzWzBdLmxlbiAmJiBpIDwgNDsgaSsrLCBqLS0pCi0JCW1zZ3NbMF0uYnVmW2pdID0gKGNtZCA+PiAoOCAqIGkpKSAmIDB4ZmY7Ci0KLQlpZiAobXNnc1swXS5sZW4gPiA0KSB7Ci0JCWNtZCA9IF9fcmF3X3JlYWRxKGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSV9FWFQpOwotCQlmb3IgKGkgPSAwOyBpICA8IG1zZ3NbMF0ubGVuIC0gNCAmJiBpIDwgNDsgaSsrLCBqLS0pCi0JCQltc2dzWzBdLmJ1ZltqXSA9IChjbWQgPj4gKDggKiBpKSkgJiAweGZmOwotCX0KLQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLS8qIGhpZ2gtbGV2ZWwtY29udHJvbGxlciBwdXJlIHdyaXRlIG9mIHVwIHRvIDggYnl0ZXMgKi8KLXN0YXRpYyBpbnQgb2N0ZW9uX2kyY19obGNfd3JpdGUoc3RydWN0IG9jdGVvbl9pMmMgKmkyYywgc3RydWN0IGkyY19tc2cgKm1zZ3MpCi17Ci0JaW50IGksIGosIHJldCA9IDA7Ci0JdTY0IGNtZDsKLQotCW9jdGVvbl9pMmNfaGxjX2VuYWJsZShpMmMpOwotCW9jdGVvbl9pMmNfaGxjX2ludF9jbGVhcihpMmMpOwotCi0JY21kID0gU1dfVFdTSV9WIHwgU1dfVFdTSV9TT1ZSOwotCS8qIFNJWkUgKi8KLQljbWQgfD0gKHU2NCkobXNnc1swXS5sZW4gLSAxKSA8PCBTV19UV1NJX1NJWkVfU0hJRlQ7Ci0JLyogQSAqLwotCWNtZCB8PSAodTY0KShtc2dzWzBdLmFkZHIgJiAweDdmdWxsKSA8PCBTV19UV1NJX0FERFJfU0hJRlQ7Ci0KLQlpZiAobXNnc1swXS5mbGFncyAmIEkyQ19NX1RFTikKLQkJY21kIHw9IFNXX1RXU0lfT1BfMTA7Ci0JZWxzZQotCQljbWQgfD0gU1dfVFdTSV9PUF83OwotCi0JZm9yIChpID0gMCwgaiA9IG1zZ3NbMF0ubGVuIC0gMTsgaSAgPCBtc2dzWzBdLmxlbiAmJiBpIDwgNDsgaSsrLCBqLS0pCi0JCWNtZCB8PSAodTY0KW1zZ3NbMF0uYnVmW2pdIDw8ICg4ICogaSk7Ci0KLQlpZiAobXNnc1swXS5sZW4gPiA0KSB7Ci0JCXU2NCBleHQgPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBtc2dzWzBdLmxlbiAtIDQgJiYgaSA8IDQ7IGkrKywgai0tKQotCQkJZXh0IHw9ICh1NjQpbXNnc1swXS5idWZbal0gPDwgKDggKiBpKTsKLQkJb2N0ZW9uX2kyY193cml0ZXFfZmx1c2goZXh0LCBpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0lfRVhUKTsKLQl9Ci0KLQlvY3Rlb25faTJjX3dyaXRlcV9mbHVzaChjbWQsIGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSSk7Ci0JcmV0ID0gb2N0ZW9uX2kyY19obGNfd2FpdChpMmMpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JY21kID0gX19yYXdfcmVhZHEoaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJKTsKLQlpZiAoKGNtZCAmIFNXX1RXU0lfUikgPT0gMCkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlyZXQgPSBvY3Rlb25faTJjX2NoZWNrX3N0YXR1cyhpMmMsIGZhbHNlKTsKLQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLS8qIGhpZ2gtbGV2ZWwtY29udHJvbGxlciBjb21wb3NpdGUgd3JpdGUrcmVhZCwgbXNnMD1hZGRyLCBtc2cxPWRhdGEgKi8KLXN0YXRpYyBpbnQgb2N0ZW9uX2kyY19obGNfY29tcF9yZWFkKHN0cnVjdCBvY3Rlb25faTJjICppMmMsIHN0cnVjdCBpMmNfbXNnICptc2dzKQotewotCWludCBpLCBqLCByZXQgPSAwOwotCXU2NCBjbWQ7Ci0KLQlvY3Rlb25faTJjX2hsY19lbmFibGUoaTJjKTsKLQotCWNtZCA9IFNXX1RXU0lfViB8IFNXX1RXU0lfUiB8IFNXX1RXU0lfU09WUjsKLQkvKiBTSVpFICovCi0JY21kIHw9ICh1NjQpKG1zZ3NbMV0ubGVuIC0gMSkgPDwgU1dfVFdTSV9TSVpFX1NISUZUOwotCS8qIEEgKi8KLQljbWQgfD0gKHU2NCkobXNnc1swXS5hZGRyICYgMHg3ZnVsbCkgPDwgU1dfVFdTSV9BRERSX1NISUZUOwotCi0JaWYgKG1zZ3NbMF0uZmxhZ3MgJiBJMkNfTV9URU4pCi0JCWNtZCB8PSBTV19UV1NJX09QXzEwX0lBOwotCWVsc2UKLQkJY21kIHw9IFNXX1RXU0lfT1BfN19JQTsKLQotCWlmIChtc2dzWzBdLmxlbiA9PSAyKSB7Ci0JCXU2NCBleHQgPSAwOwotCi0JCWNtZCB8PSBTV19UV1NJX0VJQTsKLQkJZXh0ID0gKHU2NCltc2dzWzBdLmJ1ZlswXSA8PCBTV19UV1NJX0lBX1NISUZUOwotCQljbWQgfD0gKHU2NCltc2dzWzBdLmJ1ZlsxXSA8PCBTV19UV1NJX0lBX1NISUZUOwotCQlvY3Rlb25faTJjX3dyaXRlcV9mbHVzaChleHQsIGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSV9FWFQpOwotCX0gZWxzZSB7Ci0JCWNtZCB8PSAodTY0KW1zZ3NbMF0uYnVmWzBdIDw8IFNXX1RXU0lfSUFfU0hJRlQ7Ci0JfQotCi0Jb2N0ZW9uX2kyY19obGNfaW50X2NsZWFyKGkyYyk7Ci0Jb2N0ZW9uX2kyY193cml0ZXFfZmx1c2goY21kLCBpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0kpOwotCi0JcmV0ID0gb2N0ZW9uX2kyY19obGNfd2FpdChpMmMpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JY21kID0gX19yYXdfcmVhZHEoaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJKTsKLQlpZiAoKGNtZCAmIFNXX1RXU0lfUikgPT0gMCkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlmb3IgKGkgPSAwLCBqID0gbXNnc1sxXS5sZW4gLSAxOyBpICA8IG1zZ3NbMV0ubGVuICYmIGkgPCA0OyBpKyssIGotLSkKLQkJbXNnc1sxXS5idWZbal0gPSAoY21kID4+ICg4ICogaSkpICYgMHhmZjsKLQotCWlmIChtc2dzWzFdLmxlbiA+IDQpIHsKLQkJY21kID0gX19yYXdfcmVhZHEoaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJX0VYVCk7Ci0JCWZvciAoaSA9IDA7IGkgIDwgbXNnc1sxXS5sZW4gLSA0ICYmIGkgPCA0OyBpKyssIGotLSkKLQkJCW1zZ3NbMV0uYnVmW2pdID0gKGNtZCA+PiAoOCAqIGkpKSAmIDB4ZmY7Ci0JfQotCi1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogaGlnaC1sZXZlbC1jb250cm9sbGVyIGNvbXBvc2l0ZSB3cml0ZSt3cml0ZSwgbVswXWxlbjw9MiwgbVsxXWxlbjw9OCAqLwotc3RhdGljIGludCBvY3Rlb25faTJjX2hsY19jb21wX3dyaXRlKHN0cnVjdCBvY3Rlb25faTJjICppMmMsIHN0cnVjdCBpMmNfbXNnICptc2dzKQotewotCWJvb2wgc2V0X2V4dCA9IGZhbHNlOwotCWludCBpLCBqLCByZXQgPSAwOwotCXU2NCBjbWQsIGV4dCA9IDA7Ci0KLQlvY3Rlb25faTJjX2hsY19lbmFibGUoaTJjKTsKLQotCWNtZCA9IFNXX1RXU0lfViB8IFNXX1RXU0lfU09WUjsKLQkvKiBTSVpFICovCi0JY21kIHw9ICh1NjQpKG1zZ3NbMV0ubGVuIC0gMSkgPDwgU1dfVFdTSV9TSVpFX1NISUZUOwotCS8qIEEgKi8KLQljbWQgfD0gKHU2NCkobXNnc1swXS5hZGRyICYgMHg3ZnVsbCkgPDwgU1dfVFdTSV9BRERSX1NISUZUOwotCi0JaWYgKG1zZ3NbMF0uZmxhZ3MgJiBJMkNfTV9URU4pCi0JCWNtZCB8PSBTV19UV1NJX09QXzEwX0lBOwotCWVsc2UKLQkJY21kIHw9IFNXX1RXU0lfT1BfN19JQTsKLQotCWlmIChtc2dzWzBdLmxlbiA9PSAyKSB7Ci0JCWNtZCB8PSBTV19UV1NJX0VJQTsKLQkJZXh0IHw9ICh1NjQpbXNnc1swXS5idWZbMF0gPDwgU1dfVFdTSV9JQV9TSElGVDsKLQkJc2V0X2V4dCA9IHRydWU7Ci0JCWNtZCB8PSAodTY0KW1zZ3NbMF0uYnVmWzFdIDw8IFNXX1RXU0lfSUFfU0hJRlQ7Ci0JfSBlbHNlIHsKLQkJY21kIHw9ICh1NjQpbXNnc1swXS5idWZbMF0gPDwgU1dfVFdTSV9JQV9TSElGVDsKLQl9Ci0KLQlmb3IgKGkgPSAwLCBqID0gbXNnc1sxXS5sZW4gLSAxOyBpICA8IG1zZ3NbMV0ubGVuICYmIGkgPCA0OyBpKyssIGotLSkKLQkJY21kIHw9ICh1NjQpbXNnc1sxXS5idWZbal0gPDwgKDggKiBpKTsKLQotCWlmIChtc2dzWzFdLmxlbiA+IDQpIHsKLQkJZm9yIChpID0gMDsgaSA8IG1zZ3NbMV0ubGVuIC0gNCAmJiBpIDwgNDsgaSsrLCBqLS0pCi0JCQlleHQgfD0gKHU2NCltc2dzWzFdLmJ1ZltqXSA8PCAoOCAqIGkpOwotCQlzZXRfZXh0ID0gdHJ1ZTsKLQl9Ci0JaWYgKHNldF9leHQpCi0JCW9jdGVvbl9pMmNfd3JpdGVxX2ZsdXNoKGV4dCwgaTJjLT50d3NpX2Jhc2UgKyBTV19UV1NJX0VYVCk7Ci0KLQlvY3Rlb25faTJjX2hsY19pbnRfY2xlYXIoaTJjKTsKLQlvY3Rlb25faTJjX3dyaXRlcV9mbHVzaChjbWQsIGkyYy0+dHdzaV9iYXNlICsgU1dfVFdTSSk7Ci0KLQlyZXQgPSBvY3Rlb25faTJjX2hsY193YWl0KGkyYyk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnI7Ci0KLQljbWQgPSBfX3Jhd19yZWFkcShpMmMtPnR3c2lfYmFzZSArIFNXX1RXU0kpOwotCWlmICgoY21kICYgU1dfVFdTSV9SKSA9PSAwKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXJldCA9IG9jdGVvbl9pMmNfY2hlY2tfc3RhdHVzKGkyYywgZmFsc2UpOwotCi1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogY2FsY3VsYXRlIGFuZCBzZXQgY2xvY2sgZGl2aXNvcnMgKi8KLXN0YXRpYyB2b2lkIG9jdGVvbl9pMmNfc2V0X2Nsb2NrKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCi17Ci0JaW50IHRjbGssIHRocF9iYXNlLCBpbmMsIHRocF9pZHgsIG1kaXZfaWR4LCBuZGl2X2lkeCwgZm9zY2wsIGRpZmY7Ci0JaW50IHRocCA9IDB4MTgsIG1kaXYgPSAyLCBuZGl2ID0gMCwgZGVsdGFfaHogPSAxMDAwMDAwOwotCi0JZm9yIChuZGl2X2lkeCA9IDA7IG5kaXZfaWR4IDwgOCAmJiBkZWx0YV9oeiAhPSAwOyBuZGl2X2lkeCsrKSB7Ci0JCS8qCi0JCSAqIEFuIG1kaXYgdmFsdWUgb2YgbGVzcyB0aGFuIDIgc2VlbXMgdG8gbm90IHdvcmsgd2VsbAotCQkgKiB3aXRoIGRzMTMzNyBSVENzLCBzbyB3ZSBjb25zdHJhaW4gaXQgdG8gbGFyZ2VyIHZhbHVlcy4KLQkJICovCi0JCWZvciAobWRpdl9pZHggPSAxNTsgbWRpdl9pZHggPj0gMiAmJiBkZWx0YV9oeiAhPSAwOyBtZGl2X2lkeC0tKSB7Ci0JCQkvKgotCQkJICogRm9yIGdpdmVuIG5kaXYgYW5kIG1kaXYgdmFsdWVzIGNoZWNrIHRoZQotCQkJICogdHdvIGNsb3Nlc3QgdGhwIHZhbHVlcy4KLQkJCSAqLwotCQkJdGNsayA9IGkyYy0+dHdzaV9mcmVxICogKG1kaXZfaWR4ICsgMSkgKiAxMDsKLQkJCXRjbGsgKj0gKDEgPDwgbmRpdl9pZHgpOwotCQkJdGhwX2Jhc2UgPSAoaTJjLT5zeXNfZnJlcSAvICh0Y2xrICogMikpIC0gMTsKLQotCQkJZm9yIChpbmMgPSAwOyBpbmMgPD0gMTsgaW5jKyspIHsKLQkJCQl0aHBfaWR4ID0gdGhwX2Jhc2UgKyBpbmM7Ci0JCQkJaWYgKHRocF9pZHggPCA1IHx8IHRocF9pZHggPiAweGZmKQotCQkJCQljb250aW51ZTsKLQotCQkJCWZvc2NsID0gaTJjLT5zeXNfZnJlcSAvICgyICogKHRocF9pZHggKyAxKSk7Ci0JCQkJZm9zY2wgPSBmb3NjbCAvICgxIDw8IG5kaXZfaWR4KTsKLQkJCQlmb3NjbCA9IGZvc2NsIC8gKG1kaXZfaWR4ICsgMSkgLyAxMDsKLQkJCQlkaWZmID0gYWJzKGZvc2NsIC0gaTJjLT50d3NpX2ZyZXEpOwotCQkJCWlmIChkaWZmIDwgZGVsdGFfaHopIHsKLQkJCQkJZGVsdGFfaHogPSBkaWZmOwotCQkJCQl0aHAgPSB0aHBfaWR4OwotCQkJCQltZGl2ID0gbWRpdl9pZHg7Ci0JCQkJCW5kaXYgPSBuZGl2X2lkeDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0Jb2N0ZW9uX2kyY19yZWdfd3JpdGUoaTJjLCBTV19UV1NJX09QX1RXU0lfQ0xLLCB0aHApOwotCW9jdGVvbl9pMmNfcmVnX3dyaXRlKGkyYywgU1dfVFdTSV9FT1BfVFdTSV9DTEtDVEwsIChtZGl2IDw8IDMpIHwgbmRpdik7Ci19Ci0KLXN0YXRpYyBpbnQgb2N0ZW9uX2kyY19pbml0X2xvd2xldmVsKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCi17Ci0JdTggc3RhdHVzID0gMDsKLQlpbnQgdHJpZXM7Ci0KLQkvKiByZXNldCBjb250cm9sbGVyICovCi0Jb2N0ZW9uX2kyY19yZWdfd3JpdGUoaTJjLCBTV19UV1NJX0VPUF9UV1NJX1JTVCwgMCk7Ci0KLQlmb3IgKHRyaWVzID0gMTA7IHRyaWVzICYmIHN0YXR1cyAhPSBTVEFUX0lETEU7IHRyaWVzLS0pIHsKLQkJdWRlbGF5KDEpOwotCQlzdGF0dXMgPSBvY3Rlb25faTJjX3N0YXRfcmVhZChpMmMpOwotCQlpZiAoc3RhdHVzID09IFNUQVRfSURMRSkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChzdGF0dXMgIT0gU1RBVF9JRExFKSB7Ci0JCWRldl9lcnIoaTJjLT5kZXYsICIlczogVFdTSV9SU1QgZmFpbGVkISAoMHgleClcbiIsCi0JCQlfX2Z1bmNfXywgc3RhdHVzKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogdG9nZ2xlIHR3aWNlIHRvIGZvcmNlIGJvdGggdGVhcmRvd25zICovCi0Jb2N0ZW9uX2kyY19obGNfZW5hYmxlKGkyYyk7Ci0Jb2N0ZW9uX2kyY19obGNfZGlzYWJsZShpMmMpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9jdGVvbl9pMmNfcmVjb3Zlcnkoc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaTJjX3JlY292ZXJfYnVzKCZpMmMtPmFkYXApOwotCWlmIChyZXQpCi0JCS8qIHJlY292ZXIgZmFpbGVkLCB0cnkgaGFyZHdhcmUgcmUtaW5pdCAqLwotCQlyZXQgPSBvY3Rlb25faTJjX2luaXRfbG93bGV2ZWwoaTJjKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIG9jdGVvbl9pMmNfc3RhcnQgLSBzZW5kIFNUQVJUIHRvIHRoZSBidXMKLSAqIEBpMmM6IFRoZSBzdHJ1Y3Qgb2N0ZW9uX2kyYwotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJuby4KLSAqLwotc3RhdGljIGludCBvY3Rlb25faTJjX3N0YXJ0KHN0cnVjdCBvY3Rlb25faTJjICppMmMpCi17Ci0JaW50IHJldDsKLQl1OCBzdGF0OwotCi0Jb2N0ZW9uX2kyY19obGNfZGlzYWJsZShpMmMpOwotCi0Jb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJX0NUTF9FTkFCIHwgVFdTSV9DVExfU1RBKTsKLQlyZXQgPSBvY3Rlb25faTJjX3dhaXQoaTJjKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yOwotCi0Jc3RhdCA9IG9jdGVvbl9pMmNfc3RhdF9yZWFkKGkyYyk7Ci0JaWYgKHN0YXQgPT0gU1RBVF9TVEFSVCB8fCBzdGF0ID09IFNUQVRfUkVQX1NUQVJUKQotCQkvKiBTVEFSVCBzdWNjZXNzZnVsLCBiYWlsIG91dCAqLwotCQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0JLyogU1RBUlQgZmFpbGVkLCB0cnkgdG8gcmVjb3ZlciAqLwotCXJldCA9IG9jdGVvbl9pMmNfcmVjb3ZlcnkoaTJjKTsKLQlyZXR1cm4gKHJldCkgPyByZXQgOiAtRUFHQUlOOwotfQotCi0vKiBzZW5kIFNUT1AgdG8gdGhlIGJ1cyAqLwotc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19zdG9wKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCi17Ci0Jb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJX0NUTF9FTkFCIHwgVFdTSV9DVExfU1RQKTsKLX0KLQotLyoqCi0gKiBvY3Rlb25faTJjX3dyaXRlIC0gc2VuZCBkYXRhIHRvIHRoZSBidXMgdmlhIGxvdy1sZXZlbCBjb250cm9sbGVyCi0gKiBAaTJjOiBUaGUgc3RydWN0IG9jdGVvbl9pMmMKLSAqIEB0YXJnZXQ6IFRhcmdldCBhZGRyZXNzCi0gKiBAZGF0YTogUG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBzZW50Ci0gKiBAbGVuZ3RoOiBMZW5ndGggb2YgdGhlIGRhdGEKLSAqCi0gKiBUaGUgYWRkcmVzcyBpcyBzZW50IG92ZXIgdGhlIGJ1cywgdGhlbiB0aGUgZGF0YS4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8uCi0gKi8KLXN0YXRpYyBpbnQgb2N0ZW9uX2kyY193cml0ZShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjLCBpbnQgdGFyZ2V0LAotCQkJICAgIGNvbnN0IHU4ICpkYXRhLCBpbnQgbGVuZ3RoKQotewotCWludCBpLCByZXN1bHQ7Ci0KLQlvY3Rlb25faTJjX2RhdGFfd3JpdGUoaTJjLCB0YXJnZXQgPDwgMSk7Ci0Jb2N0ZW9uX2kyY19jdGxfd3JpdGUoaTJjLCBUV1NJX0NUTF9FTkFCKTsKLQotCXJlc3VsdCA9IG9jdGVvbl9pMmNfd2FpdChpMmMpOwotCWlmIChyZXN1bHQpCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJcmVzdWx0ID0gb2N0ZW9uX2kyY19jaGVja19zdGF0dXMoaTJjLCBmYWxzZSk7Ci0JCWlmIChyZXN1bHQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCW9jdGVvbl9pMmNfZGF0YV93cml0ZShpMmMsIGRhdGFbaV0pOwotCQlvY3Rlb25faTJjX2N0bF93cml0ZShpMmMsIFRXU0lfQ1RMX0VOQUIpOwotCi0JCXJlc3VsdCA9IG9jdGVvbl9pMmNfd2FpdChpMmMpOwotCQlpZiAocmVzdWx0KQotCQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBvY3Rlb25faTJjX3JlYWQgLSByZWNlaXZlIGRhdGEgZnJvbSB0aGUgYnVzIHZpYSBsb3ctbGV2ZWwgY29udHJvbGxlcgotICogQGkyYzogVGhlIHN0cnVjdCBvY3Rlb25faTJjCi0gKiBAdGFyZ2V0OiBUYXJnZXQgYWRkcmVzcwotICogQGRhdGE6IFBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBkYXRhCi0gKiBAcmxlbmd0aDogTGVuZ3RoIG9mIHRoZSBkYXRhCi0gKiBAcmVjdl9sZW46IGZsYWcgZm9yIGxlbmd0aCBieXRlCi0gKgotICogVGhlIGFkZHJlc3MgaXMgc2VudCBvdmVyIHRoZSBidXMsIHRoZW4gdGhlIGRhdGEgaXMgcmVhZC4KLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJybm8uCi0gKi8KLXN0YXRpYyBpbnQgb2N0ZW9uX2kyY19yZWFkKHN0cnVjdCBvY3Rlb25faTJjICppMmMsIGludCB0YXJnZXQsCi0JCQkgICB1OCAqZGF0YSwgdTE2ICpybGVuZ3RoLCBib29sIHJlY3ZfbGVuKQotewotCWludCBpLCByZXN1bHQsIGxlbmd0aCA9ICpybGVuZ3RoOwotCWJvb2wgZmluYWxfcmVhZCA9IGZhbHNlOwotCi0Jb2N0ZW9uX2kyY19kYXRhX3dyaXRlKGkyYywgKHRhcmdldCA8PCAxKSB8IDEpOwotCW9jdGVvbl9pMmNfY3RsX3dyaXRlKGkyYywgVFdTSV9DVExfRU5BQik7Ci0KLQlyZXN1bHQgPSBvY3Rlb25faTJjX3dhaXQoaTJjKTsKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OwotCi0JLyogYWRkcmVzcyBPSyA/ICovCi0JcmVzdWx0ID0gb2N0ZW9uX2kyY19jaGVja19zdGF0dXMoaTJjLCBmYWxzZSk7Ci0JaWYgKHJlc3VsdCkKLQkJcmV0dXJuIHJlc3VsdDsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkvKgotCQkgKiBGb3IgdGhlIGxhc3QgYnl0ZSB0byByZWNlaXZlIFRXU0lfQ1RMX0FBSyBtdXN0IG5vdCBiZSBzZXQuCi0JCSAqCi0JCSAqIEEgc3BlY2lhbCBjYXNlIGlzIEkyQ19NX1JFQ1ZfTEVOIHdoZXJlIHdlIGRvbid0IGtub3cgdGhlCi0JCSAqIGFkZGl0aW9uYWwgbGVuZ3RoIHlldC4gSWYgcmVjdl9sZW4gaXMgc2V0IHdlIGFzc3VtZSB3ZSdyZQotCQkgKiBub3QgcmVhZGluZyB0aGUgZmluYWwgYnl0ZSBhbmQgdGhlcmVmb3JlIG5lZWQgdG8gc2V0Ci0JCSAqIFRXU0lfQ1RMX0FBSy4KLQkJICovCi0JCWlmICgoaSArIDEgPT0gbGVuZ3RoKSAmJiAhKHJlY3ZfbGVuICYmIGkgPT0gMCkpCi0JCQlmaW5hbF9yZWFkID0gdHJ1ZTsKLQotCQkvKiBjbGVhciBpZmxnIHRvIGFsbG93IG5leHQgZXZlbnQgKi8KLQkJaWYgKGZpbmFsX3JlYWQpCi0JCQlvY3Rlb25faTJjX2N0bF93cml0ZShpMmMsIFRXU0lfQ1RMX0VOQUIpOwotCQllbHNlCi0JCQlvY3Rlb25faTJjX2N0bF93cml0ZShpMmMsIFRXU0lfQ1RMX0VOQUIgfCBUV1NJX0NUTF9BQUspOwotCi0JCXJlc3VsdCA9IG9jdGVvbl9pMmNfd2FpdChpMmMpOwotCQlpZiAocmVzdWx0KQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlkYXRhW2ldID0gb2N0ZW9uX2kyY19kYXRhX3JlYWQoaTJjKTsKLQkJaWYgKHJlY3ZfbGVuICYmIGkgPT0gMCkgewotCQkJaWYgKGRhdGFbaV0gPiBJMkNfU01CVVNfQkxPQ0tfTUFYICsgMSkKLQkJCQlyZXR1cm4gLUVQUk9UTzsKLQkJCWxlbmd0aCArPSBkYXRhW2ldOwotCQl9Ci0KLQkJcmVzdWx0ID0gb2N0ZW9uX2kyY19jaGVja19zdGF0dXMoaTJjLCBmaW5hbF9yZWFkKTsKLQkJaWYgKHJlc3VsdCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JfQotCSpybGVuZ3RoID0gbGVuZ3RoOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIG9jdGVvbl9pMmNfeGZlciAtIFRoZSBkcml2ZXIncyBtYXN0ZXJfeGZlciBmdW5jdGlvbgotICogQGFkYXA6IFBvaW50ZXIgdG8gdGhlIGkyY19hZGFwdGVyIHN0cnVjdHVyZQotICogQG1zZ3M6IFBvaW50ZXIgdG8gdGhlIG1lc3NhZ2VzIHRvIGJlIHByb2Nlc3NlZAotICogQG51bTogTGVuZ3RoIG9mIHRoZSBNU0dTIGFycmF5Ci0gKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHByb2Nlc3NlZCwgb3IgYSBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50IG9jdGVvbl9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLAotCQkJICAgaW50IG51bSkKLXsKLQlzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKLQlpbnQgaSwgcmV0ID0gMDsKLQotCWlmIChudW0gPT0gMSkgewotCQlpZiAobXNnc1swXS5sZW4gPiAwICYmIG1zZ3NbMF0ubGVuIDw9IDgpIHsKLQkJCWlmIChtc2dzWzBdLmZsYWdzICYgSTJDX01fUkQpCi0JCQkJcmV0ID0gb2N0ZW9uX2kyY19obGNfcmVhZChpMmMsIG1zZ3MpOwotCQkJZWxzZQotCQkJCXJldCA9IG9jdGVvbl9pMmNfaGxjX3dyaXRlKGkyYywgbXNncyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0gZWxzZSBpZiAobnVtID09IDIpIHsKLQkJaWYgKChtc2dzWzBdLmZsYWdzICYgSTJDX01fUkQpID09IDAgJiYKLQkJICAgIChtc2dzWzFdLmZsYWdzICYgSTJDX01fUkVDVl9MRU4pID09IDAgJiYKLQkJICAgIG1zZ3NbMF0ubGVuID4gMCAmJiBtc2dzWzBdLmxlbiA8PSAyICYmCi0JCSAgICBtc2dzWzFdLmxlbiA+IDAgJiYgbXNnc1sxXS5sZW4gPD0gOCAmJgotCQkgICAgbXNnc1swXS5hZGRyID09IG1zZ3NbMV0uYWRkcikgewotCQkJaWYgKG1zZ3NbMV0uZmxhZ3MgJiBJMkNfTV9SRCkKLQkJCQlyZXQgPSBvY3Rlb25faTJjX2hsY19jb21wX3JlYWQoaTJjLCBtc2dzKTsKLQkJCWVsc2UKLQkJCQlyZXQgPSBvY3Rlb25faTJjX2hsY19jb21wX3dyaXRlKGkyYywgbXNncyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IHJldCA9PSAwICYmIGkgPCBudW07IGkrKykgewotCQlzdHJ1Y3QgaTJjX21zZyAqcG1zZyA9ICZtc2dzW2ldOwotCi0JCS8qIHplcm8tbGVuZ3RoIG1lc3NhZ2VzIGFyZSBub3Qgc3VwcG9ydGVkICovCi0JCWlmICghcG1zZy0+bGVuKSB7Ci0JCQlyZXQgPSAtRU9QTk9UU1VQUDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0ID0gb2N0ZW9uX2kyY19zdGFydChpMmMpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlpZiAocG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkKLQkJCXJldCA9IG9jdGVvbl9pMmNfcmVhZChpMmMsIHBtc2ctPmFkZHIsIHBtc2ctPmJ1ZiwKLQkJCQkJICAgICAgJnBtc2ctPmxlbiwgcG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRUNWX0xFTik7Ci0JCWVsc2UKLQkJCXJldCA9IG9jdGVvbl9pMmNfd3JpdGUoaTJjLCBwbXNnLT5hZGRyLCBwbXNnLT5idWYsCi0JCQkJCSAgICAgICBwbXNnLT5sZW4pOwotCX0KLQlvY3Rlb25faTJjX3N0b3AoaTJjKTsKLW91dDoKLQlyZXR1cm4gKHJldCAhPSAwKSA/IHJldCA6IG51bTsKLX0KLQotc3RhdGljIGludCBvY3Rlb25faTJjX2dldF9zY2woc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCXN0cnVjdCBvY3Rlb25faTJjICppMmMgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOwotCXU2NCBzdGF0ZTsKLQotCXN0YXRlID0gb2N0ZW9uX2kyY19yZWFkX2ludChpMmMpOwotCXJldHVybiBzdGF0ZSAmIFRXU0lfSU5UX1NDTDsKLX0KLQotc3RhdGljIHZvaWQgb2N0ZW9uX2kyY19zZXRfc2NsKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IHZhbCkKLXsKLQlzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKLQotCW9jdGVvbl9pMmNfd3JpdGVfaW50KGkyYywgVFdTSV9JTlRfU0NMX09WUik7Ci19Ci0KLXN0YXRpYyBpbnQgb2N0ZW9uX2kyY19nZXRfc2RhKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKLQl1NjQgc3RhdGU7Ci0KLQlzdGF0ZSA9IG9jdGVvbl9pMmNfcmVhZF9pbnQoaTJjKTsKLQlyZXR1cm4gc3RhdGUgJiBUV1NJX0lOVF9TREE7Ci19Ci0KLXN0YXRpYyB2b2lkIG9jdGVvbl9pMmNfcHJlcGFyZV9yZWNvdmVyeShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0Jc3RydWN0IG9jdGVvbl9pMmMgKmkyYyA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7Ci0KLQkvKgotCSAqIFRoZSBzdG9wIHJlc2V0cyB0aGUgc3RhdGUgbWFjaGluZSwgZG9lcyBub3QgX3RyYW5zbWl0XyBTVE9QIHVubGVzcwotCSAqIGVuZ2luZSB3YXMgYWN0aXZlLgotCSAqLwotCW9jdGVvbl9pMmNfc3RvcChpMmMpOwotCi0Jb2N0ZW9uX2kyY19obGNfZGlzYWJsZShpMmMpOwotCW9jdGVvbl9pMmNfd3JpdGVfaW50KGkyYywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG9jdGVvbl9pMmNfdW5wcmVwYXJlX3JlY292ZXJ5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKLQotCW9jdGVvbl9pMmNfd3JpdGVfaW50KGkyYywgMCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2J1c19yZWNvdmVyeV9pbmZvIG9jdGVvbl9pMmNfcmVjb3ZlcnlfaW5mbyA9IHsKLQkucmVjb3Zlcl9idXMgPSBpMmNfZ2VuZXJpY19zY2xfcmVjb3ZlcnksCi0JLmdldF9zY2wgPSBvY3Rlb25faTJjX2dldF9zY2wsCi0JLnNldF9zY2wgPSBvY3Rlb25faTJjX3NldF9zY2wsCi0JLmdldF9zZGEgPSBvY3Rlb25faTJjX2dldF9zZGEsCi0JLnByZXBhcmVfcmVjb3ZlcnkgPSBvY3Rlb25faTJjX3ByZXBhcmVfcmVjb3ZlcnksCi0JLnVucHJlcGFyZV9yZWNvdmVyeSA9IG9jdGVvbl9pMmNfdW5wcmVwYXJlX3JlY292ZXJ5LAotfTsKLQotc3RhdGljIHUzMiBvY3Rlb25faTJjX2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCXJldHVybiBJMkNfRlVOQ19JMkMgfCAoSTJDX0ZVTkNfU01CVVNfRU1VTCAmIH5JMkNfRlVOQ19TTUJVU19RVUlDSykgfAotCSAgICAgICBJMkNfRlVOQ19TTUJVU19SRUFEX0JMT0NLX0RBVEEgfCBJMkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gb2N0ZW9uX2kyY19hbGdvID0gewotCS5tYXN0ZXJfeGZlciA9IG9jdGVvbl9pMmNfeGZlciwKLQkuZnVuY3Rpb25hbGl0eSA9IG9jdGVvbl9pMmNfZnVuY3Rpb25hbGl0eSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgb2N0ZW9uX2kyY19vcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm5hbWUgPSAiT0NURU9OIGFkYXB0ZXIiLAotCS5hbGdvID0gJm9jdGVvbl9pMmNfYWxnbywKLX07Ci0KLXN0YXRpYyBpbnQgb2N0ZW9uX2kyY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwotCWludCBpcnEsIHJlc3VsdCA9IDAsIGhsY19pcnEgPSAwOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzX21lbTsKLQlzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjOwotCWJvb2wgY243OHh4X3N0eWxlOwotCi0JY243OHh4X3N0eWxlID0gb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgImNhdml1bSxvY3Rlb24tNzg5MC10d3NpIik7Ci0JaWYgKGNuNzh4eF9zdHlsZSkgewotCQlobGNfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQkJaWYgKGhsY19pcnEgPCAwKQotCQkJcmV0dXJuIGhsY19pcnE7Ci0KLQkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAyKTsKLQkJaWYgKGlycSA8IDApCi0JCQlyZXR1cm4gaXJxOwotCX0gZWxzZSB7Ci0JCS8qIEFsbCBhZGFwdG9ycyBoYXZlIGFuIGlycS4gICovCi0JCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JCWlmIChpcnEgPCAwKQotCQkJcmV0dXJuIGlycTsKLQl9Ci0KLQlpMmMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCppMmMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWkyYykgewotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0JaTJjLT5kZXYgPSAmcGRldi0+ZGV2OwotCi0JcmVzX21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaTJjLT50d3NpX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzX21lbSk7Ci0JaWYgKElTX0VSUihpMmMtPnR3c2lfYmFzZSkpIHsKLQkJcmVzdWx0ID0gUFRSX0VSUihpMmMtPnR3c2lfYmFzZSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogImNsb2NrLXJhdGUiIGlzIGEgbGVnYWN5IGJpbmRpbmcsIHRoZSBvZmZpY2lhbCBiaW5kaW5nIGlzCi0JICogImNsb2NrLWZyZXF1ZW5jeSIuICBUcnkgdGhlIG9mZmljaWFsIG9uZSBmaXJzdCBhbmQgdGhlbgotCSAqIGZhbGwgYmFjayBpZiBpdCBkb2Vzbid0IGV4aXN0LgotCSAqLwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwgJmkyYy0+dHdzaV9mcmVxKSAmJgotCSAgICBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY2xvY2stcmF0ZSIsICZpMmMtPnR3c2lfZnJlcSkpIHsKLQkJZGV2X2VycihpMmMtPmRldiwKLQkJCSJubyBJMkMgJ2Nsb2NrLXJhdGUnIG9yICdjbG9jay1mcmVxdWVuY3knIHByb3BlcnR5XG4iKTsKLQkJcmVzdWx0ID0gLUVOWElPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpMmMtPnN5c19mcmVxID0gb2N0ZW9uX2dldF9pb19jbG9ja19yYXRlKCk7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpMmMtPnF1ZXVlKTsKLQotCWkyYy0+aXJxID0gaXJxOwotCi0JaWYgKGNuNzh4eF9zdHlsZSkgewotCQlpMmMtPmhsY19pcnEgPSBobGNfaXJxOwotCi0JCWkyYy0+aW50X2VuYWJsZSA9IG9jdGVvbl9pMmNfaW50X2VuYWJsZTc4OwotCQlpMmMtPmludF9kaXNhYmxlID0gb2N0ZW9uX2kyY19pbnRfZGlzYWJsZTc4OwotCQlpMmMtPmhsY19pbnRfZW5hYmxlID0gb2N0ZW9uX2kyY19obGNfaW50X2VuYWJsZTc4OwotCQlpMmMtPmhsY19pbnRfZGlzYWJsZSA9IG9jdGVvbl9pMmNfaGxjX2ludF9kaXNhYmxlNzg7Ci0KLQkJaXJxX3NldF9zdGF0dXNfZmxhZ3MoaTJjLT5pcnEsIElSUV9OT0FVVE9FTik7Ci0JCWlycV9zZXRfc3RhdHVzX2ZsYWdzKGkyYy0+aGxjX2lycSwgSVJRX05PQVVUT0VOKTsKLQotCQlyZXN1bHQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGkyYy0+aGxjX2lycSwKLQkJCQkJICBvY3Rlb25faTJjX2hsY19pc3I3OCwgMCwKLQkJCQkJICBEUlZfTkFNRSwgaTJjKTsKLQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCWRldl9lcnIoaTJjLT5kZXYsICJmYWlsZWQgdG8gYXR0YWNoIGludGVycnVwdFxuIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0gZWxzZSB7Ci0JCWkyYy0+aW50X2VuYWJsZSA9IG9jdGVvbl9pMmNfaW50X2VuYWJsZTsKLQkJaTJjLT5pbnRfZGlzYWJsZSA9IG9jdGVvbl9pMmNfaW50X2Rpc2FibGU7Ci0JCWkyYy0+aGxjX2ludF9lbmFibGUgPSBvY3Rlb25faTJjX2hsY19pbnRfZW5hYmxlOwotCQlpMmMtPmhsY19pbnRfZGlzYWJsZSA9IG9jdGVvbl9pMmNfaW50X2Rpc2FibGU7Ci0JfQotCi0JcmVzdWx0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpMmMtPmlycSwKLQkJCQkgIG9jdGVvbl9pMmNfaXNyLCAwLCBEUlZfTkFNRSwgaTJjKTsKLQlpZiAocmVzdWx0IDwgMCkgewotCQlkZXZfZXJyKGkyYy0+ZGV2LCAiZmFpbGVkIHRvIGF0dGFjaCBpbnRlcnJ1cHRcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjM4WFgpKQotCQlpMmMtPmJyb2tlbl9pcnFfY2hlY2sgPSB0cnVlOwotCi0JcmVzdWx0ID0gb2N0ZW9uX2kyY19pbml0X2xvd2xldmVsKGkyYyk7Ci0JaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKGkyYy0+ZGV2LCAiaW5pdCBsb3cgbGV2ZWwgZmFpbGVkXG4iKTsKLQkJZ290byAgb3V0OwotCX0KLQotCW9jdGVvbl9pMmNfc2V0X2Nsb2NrKGkyYyk7Ci0KLQlpMmMtPmFkYXAgPSBvY3Rlb25faTJjX29wczsKLQlpMmMtPmFkYXAudGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMik7Ci0JaTJjLT5hZGFwLnJldHJpZXMgPSA1OwotCWkyYy0+YWRhcC5idXNfcmVjb3ZlcnlfaW5mbyA9ICZvY3Rlb25faTJjX3JlY292ZXJ5X2luZm87Ci0JaTJjLT5hZGFwLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwotCWkyYy0+YWRhcC5kZXYub2Zfbm9kZSA9IG5vZGU7Ci0JaTJjX3NldF9hZGFwZGF0YSgmaTJjLT5hZGFwLCBpMmMpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGkyYyk7Ci0KLQlyZXN1bHQgPSBpMmNfYWRkX2FkYXB0ZXIoJmkyYy0+YWRhcCk7Ci0JaWYgKHJlc3VsdCA8IDApIHsKLQkJZGV2X2VycihpMmMtPmRldiwgImZhaWxlZCB0byBhZGQgYWRhcHRlclxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQlkZXZfaW5mbyhpMmMtPmRldiwgInByb2JlZFxuIik7Ci0JcmV0dXJuIDA7Ci0KLW91dDoKLQlyZXR1cm4gcmVzdWx0OwotfTsKLQotc3RhdGljIGludCBvY3Rlb25faTJjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBvY3Rlb25faTJjICppMmMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWkyY19kZWxfYWRhcHRlcigmaTJjLT5hZGFwKTsKLQlyZXR1cm4gMDsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9jdGVvbl9pMmNfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImNhdml1bSxvY3Rlb24tMzg2MC10d3NpIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImNhdml1bSxvY3Rlb24tNzg5MC10d3NpIiwgfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvY3Rlb25faTJjX21hdGNoKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb2N0ZW9uX2kyY19kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IG9jdGVvbl9pMmNfcHJvYmUsCi0JLnJlbW92ZQkJPSBvY3Rlb25faTJjX3JlbW92ZSwKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJPSBEUlZfTkFNRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gb2N0ZW9uX2kyY19tYXRjaCwKLQl9LAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihvY3Rlb25faTJjX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIk1pY2hhZWwgTGF3bmljayA8bWljaGFlbC5sYXduaWNrLmV4dEBuc24uY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMtQnVzIGFkYXB0ZXIgZm9yIENhdml1bSBPQ1RFT04gcHJvY2Vzc29ycyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYwppbmRleCBhYjEyNzliLi5jN2RhMGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYwpAQCAtMTQyNSwxMCArMTQyNSw4IEBACiAJLyogaTJjIGRldmljZSBkcml2ZXJzIG1heSBiZSBhY3RpdmUgb24gcmV0dXJuIGZyb20gYWRkX2FkYXB0ZXIoKSAqLwogCWFkYXAtPm5yID0gcGRldi0+aWQ7CiAJciA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcihhZGFwKTsKLQlpZiAocikgewotCQlkZXZfZXJyKG9tYXAtPmRldiwgImZhaWx1cmUgYWRkaW5nIGFkYXB0ZXJcbiIpOworCWlmIChyKQogCQlnb3RvIGVycl91bnVzZV9jbG9ja3M7Ci0JfQogCiAJZGV2X2luZm8ob21hcC0+ZGV2LCAiYnVzICVkIHJldiVkLiVkIGF0ICVkIGtIelxuIiwgYWRhcC0+bnIsCiAJCSBtYWpvciwgbWlub3IsIG9tYXAtPnNwZWVkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYwppbmRleCAyM2QxYzE2Li5jMjI2OGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBpaXg0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jCkBAIC02OTQsNyArNjk0LDYgQEAKIAogCXJldHZhbCA9IGkyY19hZGRfYWRhcHRlcihhZGFwKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiQ291bGRuJ3QgcmVnaXN0ZXIgYWRhcHRlciFcbiIpOwogCQlrZnJlZShhZGFwZGF0YSk7CiAJCWtmcmVlKGFkYXApOwogCQlyZWxlYXNlX3JlZ2lvbihzbWJhLCBTTUJJT1NJWkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMKaW5kZXggMmM0MGVkYi4uMjE3Yzc4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtY21zcC5jCkBAIC0zMjksMTAgKzMyOSw4IEBACiAJaTJjX3NldF9hZGFwZGF0YSgmcG1jbXNwdHdpX2FkYXB0ZXIsICZwbWNtc3B0d2lfZGF0YSk7CiAKIAlyYyA9IGkyY19hZGRfYWRhcHRlcigmcG1jbXNwdHdpX2FkYXB0ZXIpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwbGRldi0+ZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIEkyQyBhZGFwdGVyXG4iKTsKKwlpZiAocmMpCiAJCWdvdG8gcmV0X3VubWFwOwotCX0KIAogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBueC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbnguYwppbmRleCA3ZWE2N2FhLi5mZDVmOWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBueC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG54LmMKQEAgLTcxNCwxMCArNzE0LDggQEAKIAogCS8qIFJlZ2lzdGVyIHRoaXMgYWRhcHRlciB3aXRoIHRoZSBJMkMgc3Vic3lzdGVtICovCiAJcmV0ID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKCZhbGdfZGF0YS0+YWRhcHRlcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiSTJDOiBGYWlsZWQgdG8gYWRkIGJ1c1xuIik7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X2Nsb2NrOwotCX0KIAogCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzOiBNYXN0ZXIgYXQgJSM4eCwgaXJxICVkLlxuIiwKIAkJYWxnX2RhdGEtPmFkYXB0ZXIubmFtZSwgcmVzLT5zdGFydCwgYWxnX2RhdGEtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB1djMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHV2My5jCmluZGV4IDgyYjZmMDIuLjBjOGIxNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHV2My5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHV2My5jCkBAIC0yMTIsMTEgKzIxMiw4IEBACiAKIAlhZGFwdGVyLT5uciA9IHBkZXYtPmlkOwogCXJjID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKGFkYXB0ZXIpOwotCWlmIChyYykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJBZGFwdGVyICclcycgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIiwKLQkJCQlhZGFwdGVyLT5uYW1lKTsKKwlpZiAocmMpCiAJCWdvdG8gZmFpbF9hZGRfYWRhcHRlcjsKLQl9CiAKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiUEtVbml0eSB2MyBpMmMgYnVzIGFkYXB0ZXIuXG4iKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCmluZGV4IDBkMzUxOTUuLmUyOGI4MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYwpAQCAtMTI5MiwxMCArMTI5Miw4IEBACiAjZW5kaWYKIAogCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcigmaTJjLT5hZGFwKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBhZGQgYnVzOiAlZFxuIiwgcmV0KTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBlcmVxaXJxOwotCX0KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgaTJjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1xdXAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcXVwLmMKaW5kZXggNTAxYmQxNS4uYTg0OTdjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1xdXAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXF1cC5jCkBAIC0xNTk5LDcgKzE1OTksOCBAQAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBxdXBfaTJjX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2aWNlKQogewotCXF1cF9pMmNfcG1fc3VzcGVuZF9ydW50aW1lKGRldmljZSk7CisJaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChkZXZpY2UpKQorCQlyZXR1cm4gcXVwX2kyY19wbV9zdXNwZW5kX3J1bnRpbWUoZGV2aWNlKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1yY2FyLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJjYXIuYwppbmRleCA1MjQwN2YzLi43MjY2MTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJjYXIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJjYXIuYwpAQCAtMzc4LDcgKzM3OCw3IEBACiAJfQogCiAJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShjaGFuLT5kZXZpY2UtPmRldiwgYnVmLCBsZW4sIGRpcik7Ci0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgZG1hX2FkZHIpKSB7CisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGNoYW4tPmRldmljZS0+ZGV2LCBkbWFfYWRkcikpIHsKIAkJZGV2X2RiZyhkZXYsICJkbWEgbWFwIGZhaWxlZCwgdXNpbmcgUElPXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTgwMiw2ICs4MDIsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxpMmMtcjhhNzc5MyIsIC5kYXRhID0gKHZvaWQgKilJMkNfUkNBUl9HRU4yIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLGkyYy1yOGE3Nzk0IiwgLmRhdGEgPSAodm9pZCAqKUkyQ19SQ0FSX0dFTjIgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsaTJjLXI4YTc3OTUiLCAuZGF0YSA9ICh2b2lkICopSTJDX1JDQVJfR0VOMyB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxpMmMtcjhhNzc5NiIsIC5kYXRhID0gKHZvaWQgKilJMkNfUkNBUl9HRU4zIH0sCiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcmNhcl9pMmNfZHRfaWRzKTsKQEAgLTg3NSwxMCArODc2LDggQEAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKIAogCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcihhZGFwKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgInJlZyBhZGFwIGZhaWxlZDogJWRcbiIsIHJldCk7CisJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X3BtX2Rpc2FibGU7Ci0JfQogCiAJZGV2X2luZm8oZGV2LCAicHJvYmVkXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1yaWljLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJpaWMuYwppbmRleCBkN2UzYWY2Li42MjYzZWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJpaWMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJpaWMuYwpAQCAtMzgzLDEwICszODMsOCBAQAogCiAKIAlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWRkIGFkYXB0ZXJcbiIpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcmlpYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcmszeC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1yazN4LmMKaW5kZXggMmJjOGIwMS4uNTA3MDJjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1yazN4LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1yazN4LmMKQEAgLTU4LDcgKzU4LDcgQEAKICNkZWZpbmUgUkVHX0NPTl9MQVNUQUNLICAgQklUKDUpIC8qIDE6IHNlbmQgTkFDSyBhZnRlciBsYXN0IHJlY2VpdmVkIGJ5dGUgKi8KICNkZWZpbmUgUkVHX0NPTl9BQ1RBQ0sgICAgQklUKDYpIC8qIDE6IHN0b3AgaWYgTkFDSyBpcyByZWNlaXZlZCAqLwogCi0jZGVmaW5lIFJFR19DT05fVFVOSU5HX01BU0sgR0VOTUFTSygxNSwgOCkKKyNkZWZpbmUgUkVHX0NPTl9UVU5JTkdfTUFTSyBHRU5NQVNLX1VMTCgxNSwgOCkKIAogI2RlZmluZSBSRUdfQ09OX1NEQV9DRkcoY2ZnKSAoKGNmZykgPDwgOCkKICNkZWZpbmUgUkVHX0NPTl9TVEFfQ0ZHKGNmZykgKChjZmcpIDw8IDEyKQpAQCAtNzQyLDcgKzc0Miw3IEBACiAJCQkJICAgIHN0cnVjdCBpMmNfdGltaW5ncyAqdCwKIAkJCQkgICAgc3RydWN0IHJrM3hfaTJjX2NhbGNlZF90aW1pbmdzICp0X2NhbGMpCiB7Ci0JdW5zaWduZWQgbG9uZyBtaW5fbG93X25zLCBtaW5faGlnaF9ucywgbWluX3RvdGFsX25zOworCXVuc2lnbmVkIGxvbmcgbWluX2xvd19ucywgbWluX2hpZ2hfbnM7CiAJdW5zaWduZWQgbG9uZyBtaW5fc2V0dXBfc3RhcnRfbnMsIG1pbl9zZXR1cF9kYXRhX25zOwogCXVuc2lnbmVkIGxvbmcgbWluX3NldHVwX3N0b3BfbnMsIG1heF9ob2xkX2RhdGFfbnM7CiAKQEAgLTc5Myw3ICs3OTMsNiBAQAogCiAJLyogVGhlc2UgYXJlIHRoZSBtaW4gZGl2aWRlcnMgbmVlZGVkIGZvciBtaW4gaG9sZCB0aW1lcy4gKi8KIAltaW5fZGl2X2Zvcl9ob2xkID0gKG1pbl9sb3dfZGl2ICsgbWluX2hpZ2hfZGl2KTsKLQltaW5fdG90YWxfbnMgPSBtaW5fbG93X25zICsgbWluX2hpZ2hfbnM7CiAKIAkvKgogCSAqIFRoaXMgaXMgdGhlIG1heGltdW0gZGl2aWRlciBzbyB3ZSBkb24ndCBnbyBvdmVyIHRoZSBtYXhpbXVtLgpAQCAtOTE4LDcgKzkxNyw3IEBACiAgKiBDb2RlIGFkYXB0ZWQgZnJvbSBpMmMtY2FkZW5jZS5jLgogICoKICAqIFJldHVybjoJTk9USUZZX1NUT1AgaWYgdGhlIHJhdGUgY2hhbmdlIHNob3VsZCBiZSBhYm9ydGVkLCBOT1RJRllfT0sKLSAqCQl0byBhY2tub3dlZGdlIHRoZSBjaGFuZ2UsIE5PVElGWV9ET05FIGlmIHRoZSBub3RpZmljYXRpb24gaXMKKyAqCQl0byBhY2tub3dsZWRnZSB0aGUgY2hhbmdlLCBOT1RJRllfRE9ORSBpZiB0aGUgbm90aWZpY2F0aW9uIGlzCiAgKgkJY29uc2lkZXJlZCBpcnJlbGV2YW50LgogICovCiBzdGF0aWMgaW50IHJrM3hfaTJjX2Nsa19ub3RpZmllcl9jYihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nCkBAIC0xMTExLDYgKzExMTAsMTUgQEAKIAlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IG51bTsKIH0KIAorc3RhdGljIF9fbWF5YmVfdW51c2VkIGludCByazN4X2kyY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCByazN4X2kyYyAqaTJjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyazN4X2kyY19hZGFwdF9kaXYoaTJjLCBjbGtfZ2V0X3JhdGUoaTJjLT5jbGspKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdTMyIHJrM3hfaTJjX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQogewogCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMIHwgSTJDX0ZVTkNfUFJPVE9DT0xfTUFOR0xJTkc7CkBAIC0xMzAzLDEwICsxMzExLDggQEAKIAlyazN4X2kyY19hZGFwdF9kaXYoaTJjLCBjbGtfcmF0ZSk7CiAKIAlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJmkyYy0+YWRhcCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIGFkYXB0ZXJcbiIpOworCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9jbGtfbm90aWZpZXI7Ci0JfQogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIkluaXRpYWxpemVkIFJLM3h4eCBJMkMgYnVzIGF0ICVwXG4iLCBpMmMtPnJlZ3MpOwogCkBAIC0xMzM0LDEyICsxMzQwLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhyazN4X2kyY19wbV9vcHMsIE5VTEwsIHJrM3hfaTJjX3Jlc3VtZSk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJrM3hfaTJjX2RyaXZlciA9IHsKIAkucHJvYmUgICA9IHJrM3hfaTJjX3Byb2JlLAogCS5yZW1vdmUgID0gcmszeF9pMmNfcmVtb3ZlLAogCS5kcml2ZXIgID0gewogCQkubmFtZSAgPSAicmszeC1pMmMiLAogCQkub2ZfbWF0Y2hfdGFibGUgPSByazN4X2kyY19tYXRjaCwKKwkJLnBtID0gJnJrM3hfaTJjX3BtX29wcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zM2MyNDEwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYwppbmRleCAzOGRjMWNhLi40OTlhZjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYwpAQCAtMTIxNSw3ICsxMjE1LDYgQEAKIAogCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcigmaTJjLT5hZGFwKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWRkIGJ1cyB0byBpMmMgY29yZVxuIik7CiAJCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAkJczNjMjR4eF9pMmNfZGVyZWdpc3Rlcl9jcHVmcmVxKGkyYyk7CiAJCWNsa191bnByZXBhcmUoaTJjLT5jbGspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaDc3NjAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMKaW5kZXggMjQ5NjgzOC4uYzIwMDVjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaDc3NjAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoNzc2MC5jCkBAIC01MTAsMTAgKzUxMCw4IEBACiAJfQogCiAJcmV0ID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKCZpZC0+YWRhcCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVnIGFkYXAgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ0OwotCX0KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGlkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2hfbW9iaWxlLmMKaW5kZXggNmZiM2UyNi4uMTkyZjM2ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2hfbW9iaWxlLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaF9tb2JpbGUuYwpAQCAtNjEwLDcgKzYxMCw3IEBACiAJCXJldHVybjsKIAogCWRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoY2hhbi0+ZGV2aWNlLT5kZXYsIHBkLT5tc2ctPmJ1ZiwgcGQtPm1zZy0+bGVuLCBkaXIpOwotCWlmIChkbWFfbWFwcGluZ19lcnJvcihwZC0+ZGV2LCBkbWFfYWRkcikpIHsKKwlpZiAoZG1hX21hcHBpbmdfZXJyb3IoY2hhbi0+ZGV2aWNlLT5kZXYsIGRtYV9hZGRyKSkgewogCQlkZXZfZGJnKHBkLT5kZXYsICJkbWEgbWFwIGZhaWxlZCwgdXNpbmcgUElPXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTk4MSw3ICs5ODEsNiBAQAogCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcihhZGFwKTsKIAlpZiAocmV0IDwgMCkgewogCQlzaF9tb2JpbGVfaTJjX3JlbGVhc2VfZG1hKHBkKTsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJjYW5ub3QgYWRkIG51bWJlcmVkIGFkYXB0ZXJcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXJmLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpcmYuYwppbmRleCA3OTJhNDJiLi45NWU4MWQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpcmYuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpcmYuYwpAQCAtMzg3LDEwICszODcsOCBAQAogCQl3cml0ZWwocmVndmFsLCBzaWljLT5iYXNlICsgU0lSRlNPQ19JMkNfU0RBX0RFTEFZKTsKIAogCWVyciA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcihhZGFwKTsKLQlpZiAoZXJyIDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBhZGQgbmV3IGkyYyBhZGFwdGVyXG4iKTsKKwlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7Ci0JfQogCiAJY2xrX2Rpc2FibGUoY2xrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdC5jCmluZGV4IDk0NGVjNDIwLi4xMzcxNTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdC5jCkBAIC04NzQsMTAgKzg3NCw4IEBACiAJaW5pdF9jb21wbGV0aW9uKCZpMmNfZGV2LT5jb21wbGV0ZSk7CiAKIAlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIGFkYXB0ZXJcbiIpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc3R1MzAwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0dTMwMC5jCmluZGV4IDQ2MGMxMzQuLmRjNjMyMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc3R1MzAwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdHUzMDAuYwpAQCAtOTIwLDExICs5MjAsOCBAQAogCiAJLyogaTJjIGRldmljZSBkcml2ZXJzIG1heSBiZSBhY3RpdmUgb24gcmV0dXJuIGZyb20gYWRkX2FkYXB0ZXIoKSAqLwogCXJldCA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcihhZGFwKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWx1cmUgYWRkaW5nIFNUIE1pY3JvIEREQyAiCi0JCSAgICAgICAiSTJDIGFkYXB0ZXJcbiIpOworCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiU1QgRERDIEkyQyBAICVwLCBpcnEgJWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRlZ3JhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRlZ3JhLmMKaW5kZXggYjEyNmRiYS4uNGFmOWJiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10ZWdyYS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGVncmEuYwpAQCAtMjgsNiArMjgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwuaD4KIAogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIApAQCAtMzYsMjEgKzM5LDIxIEBACiAKICNkZWZpbmUgSTJDX0NORkcJCQkJMHgwMDAKICNkZWZpbmUgSTJDX0NORkdfREVCT1VOQ0VfQ05UX1NISUZUCQkxMgotI2RlZmluZSBJMkNfQ05GR19QQUNLRVRfTU9ERV9FTgkJCSgxPDwxMCkKLSNkZWZpbmUgSTJDX0NORkdfTkVXX01BU1RFUl9GU00JCQkoMTw8MTEpCi0jZGVmaW5lIEkyQ19DTkZHX01VTFRJX01BU1RFUl9NT0RFCQkoMTw8MTcpCisjZGVmaW5lIEkyQ19DTkZHX1BBQ0tFVF9NT0RFX0VOCQkJQklUKDEwKQorI2RlZmluZSBJMkNfQ05GR19ORVdfTUFTVEVSX0ZTTQkJCUJJVCgxMSkKKyNkZWZpbmUgSTJDX0NORkdfTVVMVElfTUFTVEVSX01PREUJCUJJVCgxNykKICNkZWZpbmUgSTJDX1NUQVRVUwkJCQkweDAxQwogI2RlZmluZSBJMkNfU0xfQ05GRwkJCQkweDAyMAotI2RlZmluZSBJMkNfU0xfQ05GR19OQUNLCQkJKDE8PDEpCi0jZGVmaW5lIEkyQ19TTF9DTkZHX05FV1NMCQkJKDE8PDIpCisjZGVmaW5lIEkyQ19TTF9DTkZHX05BQ0sJCQlCSVQoMSkKKyNkZWZpbmUgSTJDX1NMX0NORkdfTkVXU0wJCQlCSVQoMikKICNkZWZpbmUgSTJDX1NMX0FERFIxCQkJCTB4MDJjCiAjZGVmaW5lIEkyQ19TTF9BRERSMgkJCQkweDAzMAogI2RlZmluZSBJMkNfVFhfRklGTwkJCQkweDA1MAogI2RlZmluZSBJMkNfUlhfRklGTwkJCQkweDA1NAogI2RlZmluZSBJMkNfUEFDS0VUX1RSQU5TRkVSX1NUQVRVUwkJMHgwNTgKICNkZWZpbmUgSTJDX0ZJRk9fQ09OVFJPTAkJCTB4MDVjCi0jZGVmaW5lIEkyQ19GSUZPX0NPTlRST0xfVFhfRkxVU0gJCSgxPDwxKQotI2RlZmluZSBJMkNfRklGT19DT05UUk9MX1JYX0ZMVVNICQkoMTw8MCkKKyNkZWZpbmUgSTJDX0ZJRk9fQ09OVFJPTF9UWF9GTFVTSAkJQklUKDEpCisjZGVmaW5lIEkyQ19GSUZPX0NPTlRST0xfUlhfRkxVU0gJCUJJVCgwKQogI2RlZmluZSBJMkNfRklGT19DT05UUk9MX1RYX1RSSUdfU0hJRlQJCTUKICNkZWZpbmUgSTJDX0ZJRk9fQ09OVFJPTF9SWF9UUklHX1NISUZUCQkyCiAjZGVmaW5lIEkyQ19GSUZPX1NUQVRVUwkJCQkweDA2MApAQCAtNjAsMjYgKzYzLDI2IEBACiAjZGVmaW5lIEkyQ19GSUZPX1NUQVRVU19SWF9TSElGVAkJMAogI2RlZmluZSBJMkNfSU5UX01BU0sJCQkJMHgwNjQKICNkZWZpbmUgSTJDX0lOVF9TVEFUVVMJCQkJMHgwNjgKLSNkZWZpbmUgSTJDX0lOVF9QQUNLRVRfWEZFUl9DT01QTEVURQkJKDE8PDcpCi0jZGVmaW5lIEkyQ19JTlRfQUxMX1BBQ0tFVFNfWEZFUl9DT01QTEVURQkoMTw8NikKLSNkZWZpbmUgSTJDX0lOVF9UWF9GSUZPX09WRVJGTE9XCQkoMTw8NSkKLSNkZWZpbmUgSTJDX0lOVF9SWF9GSUZPX1VOREVSRkxPVwkJKDE8PDQpCi0jZGVmaW5lIEkyQ19JTlRfTk9fQUNLCQkJCSgxPDwzKQotI2RlZmluZSBJMkNfSU5UX0FSQklUUkFUSU9OX0xPU1QJCSgxPDwyKQotI2RlZmluZSBJMkNfSU5UX1RYX0ZJRk9fREFUQV9SRVEJCSgxPDwxKQotI2RlZmluZSBJMkNfSU5UX1JYX0ZJRk9fREFUQV9SRVEJCSgxPDwwKQorI2RlZmluZSBJMkNfSU5UX1BBQ0tFVF9YRkVSX0NPTVBMRVRFCQlCSVQoNykKKyNkZWZpbmUgSTJDX0lOVF9BTExfUEFDS0VUU19YRkVSX0NPTVBMRVRFCUJJVCg2KQorI2RlZmluZSBJMkNfSU5UX1RYX0ZJRk9fT1ZFUkZMT1cJCUJJVCg1KQorI2RlZmluZSBJMkNfSU5UX1JYX0ZJRk9fVU5ERVJGTE9XCQlCSVQoNCkKKyNkZWZpbmUgSTJDX0lOVF9OT19BQ0sJCQkJQklUKDMpCisjZGVmaW5lIEkyQ19JTlRfQVJCSVRSQVRJT05fTE9TVAkJQklUKDIpCisjZGVmaW5lIEkyQ19JTlRfVFhfRklGT19EQVRBX1JFUQkJQklUKDEpCisjZGVmaW5lIEkyQ19JTlRfUlhfRklGT19EQVRBX1JFUQkJQklUKDApCiAjZGVmaW5lIEkyQ19DTEtfRElWSVNPUgkJCQkweDA2YwogI2RlZmluZSBJMkNfQ0xLX0RJVklTT1JfU1REX0ZBU1RfTU9ERV9TSElGVAkxNgogI2RlZmluZSBJMkNfQ0xLX01VTFRJUExJRVJfU1REX0ZBU1RfTU9ERQk4CiAKICNkZWZpbmUgRFZDX0NUUkxfUkVHMQkJCQkweDAwMAotI2RlZmluZSBEVkNfQ1RSTF9SRUcxX0lOVFJfRU4JCQkoMTw8MTApCisjZGVmaW5lIERWQ19DVFJMX1JFRzFfSU5UUl9FTgkJCUJJVCgxMCkKICNkZWZpbmUgRFZDX0NUUkxfUkVHMgkJCQkweDAwNAogI2RlZmluZSBEVkNfQ1RSTF9SRUczCQkJCTB4MDA4Ci0jZGVmaW5lIERWQ19DVFJMX1JFRzNfU1dfUFJPRwkJCSgxPDwyNikKLSNkZWZpbmUgRFZDX0NUUkxfUkVHM19JMkNfRE9ORV9JTlRSX0VOCQkoMTw8MzApCisjZGVmaW5lIERWQ19DVFJMX1JFRzNfU1dfUFJPRwkJCUJJVCgyNikKKyNkZWZpbmUgRFZDX0NUUkxfUkVHM19JMkNfRE9ORV9JTlRSX0VOCQlCSVQoMzApCiAjZGVmaW5lIERWQ19TVEFUVVMJCQkJMHgwMGMKLSNkZWZpbmUgRFZDX1NUQVRVU19JMkNfRE9ORV9JTlRSCQkoMTw8MzApCisjZGVmaW5lIERWQ19TVEFUVVNfSTJDX0RPTkVfSU5UUgkJQklUKDMwKQogCiAjZGVmaW5lIEkyQ19FUlJfTk9ORQkJCQkweDAwCiAjZGVmaW5lIEkyQ19FUlJfTk9fQUNLCQkJCTB4MDEKQEAgLTg5LDI2ICs5MiwyOCBAQAogI2RlZmluZSBQQUNLRVRfSEVBREVSMF9IRUFERVJfU0laRV9TSElGVAkyOAogI2RlZmluZSBQQUNLRVRfSEVBREVSMF9QQUNLRVRfSURfU0hJRlQJCTE2CiAjZGVmaW5lIFBBQ0tFVF9IRUFERVIwX0NPTlRfSURfU0hJRlQJCTEyCi0jZGVmaW5lIFBBQ0tFVF9IRUFERVIwX1BST1RPQ09MX0kyQwkJKDE8PDQpCisjZGVmaW5lIFBBQ0tFVF9IRUFERVIwX1BST1RPQ09MX0kyQwkJQklUKDQpCiAKLSNkZWZpbmUgSTJDX0hFQURFUl9ISUdIU1BFRURfTU9ERQkJKDE8PDIyKQotI2RlZmluZSBJMkNfSEVBREVSX0NPTlRfT05fTkFLCQkJKDE8PDIxKQotI2RlZmluZSBJMkNfSEVBREVSX1NFTkRfU1RBUlRfQllURQkJKDE8PDIwKQotI2RlZmluZSBJMkNfSEVBREVSX1JFQUQJCQkJKDE8PDE5KQotI2RlZmluZSBJMkNfSEVBREVSXzEwQklUX0FERFIJCQkoMTw8MTgpCi0jZGVmaW5lIEkyQ19IRUFERVJfSUVfRU5BQkxFCQkJKDE8PDE3KQotI2RlZmluZSBJMkNfSEVBREVSX1JFUEVBVF9TVEFSVAkJCSgxPDwxNikKLSNkZWZpbmUgSTJDX0hFQURFUl9DT05USU5VRV9YRkVSCQkoMTw8MTUpCisjZGVmaW5lIEkyQ19IRUFERVJfSElHSFNQRUVEX01PREUJCUJJVCgyMikKKyNkZWZpbmUgSTJDX0hFQURFUl9DT05UX09OX05BSwkJCUJJVCgyMSkKKyNkZWZpbmUgSTJDX0hFQURFUl9TRU5EX1NUQVJUX0JZVEUJCUJJVCgyMCkKKyNkZWZpbmUgSTJDX0hFQURFUl9SRUFECQkJCUJJVCgxOSkKKyNkZWZpbmUgSTJDX0hFQURFUl8xMEJJVF9BRERSCQkJQklUKDE4KQorI2RlZmluZSBJMkNfSEVBREVSX0lFX0VOQUJMRQkJCUJJVCgxNykKKyNkZWZpbmUgSTJDX0hFQURFUl9SRVBFQVRfU1RBUlQJCQlCSVQoMTYpCisjZGVmaW5lIEkyQ19IRUFERVJfQ09OVElOVUVfWEZFUgkJQklUKDE1KQogI2RlZmluZSBJMkNfSEVBREVSX01BU1RFUl9BRERSX1NISUZUCQkxMgogI2RlZmluZSBJMkNfSEVBREVSX1NMQVZFX0FERFJfU0hJRlQJCTEKIAogI2RlZmluZSBJMkNfQ09ORklHX0xPQUQJCQkJMHgwOEMKLSNkZWZpbmUgSTJDX01TVFJfQ09ORklHX0xPQUQJCQkoMSA8PCAwKQotI2RlZmluZSBJMkNfU0xWX0NPTkZJR19MT0FECQkJKDEgPDwgMSkKLSNkZWZpbmUgSTJDX1RJTUVPVVRfQ09ORklHX0xPQUQJCQkoMSA8PCAyKQorI2RlZmluZSBJMkNfTVNUUl9DT05GSUdfTE9BRAkJCUJJVCgwKQorI2RlZmluZSBJMkNfU0xWX0NPTkZJR19MT0FECQkJQklUKDEpCisjZGVmaW5lIEkyQ19USU1FT1VUX0NPTkZJR19MT0FECQkJQklUKDIpCiAKICNkZWZpbmUgSTJDX0NMS0VOX09WRVJSSURFCQkJMHgwOTAKLSNkZWZpbmUgSTJDX01TVF9DT1JFX0NMS0VOX09WUgkJCSgxIDw8IDApCisjZGVmaW5lIEkyQ19NU1RfQ09SRV9DTEtFTl9PVlIJCQlCSVQoMCkKKworI2RlZmluZSBJMkNfQ09ORklHX0xPQURfVElNRU9VVAkJCTEwMDAwMDAKIAogLyoKICAqIG1zZ19lbmRfdHlwZTogVGhlIGJ1cyBjb250cm9sIHdoaWNoIG5lZWQgdG8gYmUgc2VuZCBhdCBlbmQgb2YgdHJhbnNmZXIuCkBAIC0xOTEsOSArMTk2LDExIEBACiAJdTE2IGNsa19kaXZpc29yX25vbl9oc19tb2RlOwogCWJvb2wgaXNfc3VzcGVuZGVkOwogCWJvb2wgaXNfbXVsdGltYXN0ZXJfbW9kZTsKKwlzcGlubG9ja190IHhmZXJfbG9jazsKIH07CiAKLXN0YXRpYyB2b2lkIGR2Y193cml0ZWwoc3RydWN0IHRlZ3JhX2kyY19kZXYgKmkyY19kZXYsIHUzMiB2YWwsIHVuc2lnbmVkIGxvbmcgcmVnKQorc3RhdGljIHZvaWQgZHZjX3dyaXRlbChzdHJ1Y3QgdGVncmFfaTJjX2RldiAqaTJjX2RldiwgdTMyIHZhbCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgcmVnKQogewogCXdyaXRlbCh2YWwsIGkyY19kZXYtPmJhc2UgKyByZWcpOwogfQpAQCAtMjQ0LDE1ICsyNTEsMTcgQEAKIAogc3RhdGljIHZvaWQgdGVncmFfaTJjX21hc2tfaXJxKHN0cnVjdCB0ZWdyYV9pMmNfZGV2ICppMmNfZGV2LCB1MzIgbWFzaykKIHsKLQl1MzIgaW50X21hc2sgPSBpMmNfcmVhZGwoaTJjX2RldiwgSTJDX0lOVF9NQVNLKTsKLQlpbnRfbWFzayAmPSB+bWFzazsKKwl1MzIgaW50X21hc2s7CisKKwlpbnRfbWFzayA9IGkyY19yZWFkbChpMmNfZGV2LCBJMkNfSU5UX01BU0spICYgfm1hc2s7CiAJaTJjX3dyaXRlbChpMmNfZGV2LCBpbnRfbWFzaywgSTJDX0lOVF9NQVNLKTsKIH0KIAogc3RhdGljIHZvaWQgdGVncmFfaTJjX3VubWFza19pcnEoc3RydWN0IHRlZ3JhX2kyY19kZXYgKmkyY19kZXYsIHUzMiBtYXNrKQogewotCXUzMiBpbnRfbWFzayA9IGkyY19yZWFkbChpMmNfZGV2LCBJMkNfSU5UX01BU0spOwotCWludF9tYXNrIHw9IG1hc2s7CisJdTMyIGludF9tYXNrOworCisJaW50X21hc2sgPSBpMmNfcmVhZGwoaTJjX2RldiwgSTJDX0lOVF9NQVNLKSB8IG1hc2s7CiAJaTJjX3dyaXRlbChpMmNfZGV2LCBpbnRfbWFzaywgSTJDX0lOVF9NQVNLKTsKIH0KIApAQCAtMjYwLDYgKzI2OSw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaOwogCXUzMiB2YWwgPSBpMmNfcmVhZGwoaTJjX2RldiwgSTJDX0ZJRk9fQ09OVFJPTCk7CisKIAl2YWwgfD0gSTJDX0ZJRk9fQ09OVFJPTF9UWF9GTFVTSCB8IEkyQ19GSUZPX0NPTlRST0xfUlhfRkxVU0g7CiAJaTJjX3dyaXRlbChpMmNfZGV2LCB2YWwsIEkyQ19GSUZPX0NPTlRST0wpOwogCkBAIC0zODUsNyArMzk1LDggQEAKICAqLwogc3RhdGljIHZvaWQgdGVncmFfZHZjX2luaXQoc3RydWN0IHRlZ3JhX2kyY19kZXYgKmkyY19kZXYpCiB7Ci0JdTMyIHZhbCA9IDA7CisJdTMyIHZhbDsKKwogCXZhbCA9IGR2Y19yZWFkbChpMmNfZGV2LCBEVkNfQ1RSTF9SRUczKTsKIAl2YWwgfD0gRFZDX0NUUkxfUkVHM19TV19QUk9HOwogCXZhbCB8PSBEVkNfQ1RSTF9SRUczX0kyQ19ET05FX0lOVFJfRU47CkBAIC0zOTYsOSArNDA3LDE1IEBACiAJZHZjX3dyaXRlbChpMmNfZGV2LCB2YWwsIERWQ19DVFJMX1JFRzEpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB0ZWdyYV9pMmNfY2xvY2tfZW5hYmxlKHN0cnVjdCB0ZWdyYV9pMmNfZGV2ICppMmNfZGV2KQorc3RhdGljIGludCB0ZWdyYV9pMmNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCB0ZWdyYV9pMmNfZGV2ICppMmNfZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IHJldDsKKworCXJldCA9IHBpbmN0cmxfcG1fc2VsZWN0X2RlZmF1bHRfc3RhdGUoaTJjX2Rldi0+ZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJaWYgKCFpMmNfZGV2LT5ody0+aGFzX3NpbmdsZV9jbGtfc291cmNlKSB7CiAJCXJldCA9IGNsa19lbmFibGUoaTJjX2Rldi0+ZmFzdF9jbGspOwogCQlpZiAocmV0IDwgMCkgewpAQCAtNDA3LDMyICs0MjQsNjYgQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CisKIAlyZXQgPSBjbGtfZW5hYmxlKGkyY19kZXYtPmRpdl9jbGspOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoaTJjX2Rldi0+ZGV2LAogCQkJIkVuYWJsaW5nIGRpdiBjbGsgZmFpbGVkLCBlcnIgJWRcbiIsIHJldCk7CiAJCWNsa19kaXNhYmxlKGkyY19kZXYtPmZhc3RfY2xrKTsKKwkJcmV0dXJuIHJldDsKIAl9Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGVncmFfaTJjX2Nsb2NrX2Rpc2FibGUoc3RydWN0IHRlZ3JhX2kyY19kZXYgKmkyY19kZXYpCitzdGF0aWMgaW50IHRlZ3JhX2kyY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCB0ZWdyYV9pMmNfZGV2ICppMmNfZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKIAljbGtfZGlzYWJsZShpMmNfZGV2LT5kaXZfY2xrKTsKIAlpZiAoIWkyY19kZXYtPmh3LT5oYXNfc2luZ2xlX2Nsa19zb3VyY2UpCiAJCWNsa19kaXNhYmxlKGkyY19kZXYtPmZhc3RfY2xrKTsKKworCXJldHVybiBwaW5jdHJsX3BtX3NlbGVjdF9pZGxlX3N0YXRlKGkyY19kZXYtPmRldik7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfaTJjX3dhaXRfZm9yX2NvbmZpZ19sb2FkKHN0cnVjdCB0ZWdyYV9pMmNfZGV2ICppMmNfZGV2KQoreworCXVuc2lnbmVkIGxvbmcgcmVnX29mZnNldDsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisJdTMyIHZhbDsKKwlpbnQgZXJyOworCisJaWYgKGkyY19kZXYtPmh3LT5oYXNfY29uZmlnX2xvYWRfcmVnKSB7CisJCXJlZ19vZmZzZXQgPSB0ZWdyYV9pMmNfcmVnX2FkZHIoaTJjX2RldiwgSTJDX0NPTkZJR19MT0FEKTsKKwkJYWRkciA9IGkyY19kZXYtPmJhc2UgKyByZWdfb2Zmc2V0OworCQlpMmNfd3JpdGVsKGkyY19kZXYsIEkyQ19NU1RSX0NPTkZJR19MT0FELCBJMkNfQ09ORklHX0xPQUQpOworCQlpZiAoaW5faW50ZXJydXB0KCkpCisJCQllcnIgPSByZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljKGFkZHIsIHZhbCwgdmFsID09IDAsCisJCQkJCTEwMDAsIEkyQ19DT05GSUdfTE9BRF9USU1FT1VUKTsKKwkJZWxzZQorCQkJZXJyID0gcmVhZGxfcG9sbF90aW1lb3V0KGFkZHIsIHZhbCwgdmFsID09IDAsCisJCQkJCTEwMDAsIEkyQ19DT05GSUdfTE9BRF9USU1FT1VUKTsKKworCQlpZiAoZXJyKSB7CisJCQlkZXZfd2FybihpMmNfZGV2LT5kZXYsCisJCQkJICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGNvbmZpZyBsb2FkXG4iKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB0ZWdyYV9pMmNfaW5pdChzdHJ1Y3QgdGVncmFfaTJjX2RldiAqaTJjX2RldikKIHsKIAl1MzIgdmFsOwotCWludCBlcnIgPSAwOworCWludCBlcnI7CiAJdTMyIGNsa19kaXZpc29yOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWjsKIAotCWVyciA9IHRlZ3JhX2kyY19jbG9ja19lbmFibGUoaTJjX2Rldik7CisJZXJyID0gcG1fcnVudGltZV9nZXRfc3luYyhpMmNfZGV2LT5kZXYpOwogCWlmIChlcnIgPCAwKSB7Ci0JCWRldl9lcnIoaTJjX2Rldi0+ZGV2LCAiQ2xvY2sgZW5hYmxlIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZGV2X2VycihpMmNfZGV2LT5kZXYsICJydW50aW1lIHJlc3VtZSBmYWlsZWQgJWRcbiIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCkBAIC00NjAsNTQgKzUxMSw1OSBAQAogCiAJaWYgKCFpMmNfZGV2LT5pc19kdmMpIHsKIAkJdTMyIHNsX2NmZyA9IGkyY19yZWFkbChpMmNfZGV2LCBJMkNfU0xfQ05GRyk7CisKIAkJc2xfY2ZnIHw9IEkyQ19TTF9DTkZHX05BQ0sgfCBJMkNfU0xfQ05GR19ORVdTTDsKIAkJaTJjX3dyaXRlbChpMmNfZGV2LCBzbF9jZmcsIEkyQ19TTF9DTkZHKTsKIAkJaTJjX3dyaXRlbChpMmNfZGV2LCAweGZjLCBJMkNfU0xfQUREUjEpOwogCQlpMmNfd3JpdGVsKGkyY19kZXYsIDB4MDAsIEkyQ19TTF9BRERSMik7Ci0KIAl9CiAKIAl2YWwgPSA3IDw8IEkyQ19GSUZPX0NPTlRST0xfVFhfVFJJR19TSElGVCB8CiAJCTAgPDwgSTJDX0ZJRk9fQ09OVFJPTF9SWF9UUklHX1NISUZUOwogCWkyY193cml0ZWwoaTJjX2RldiwgdmFsLCBJMkNfRklGT19DT05UUk9MKTsKIAotCWlmICh0ZWdyYV9pMmNfZmx1c2hfZmlmb3MoaTJjX2RldikpCi0JCWVyciA9IC1FVElNRURPVVQ7CisJZXJyID0gdGVncmFfaTJjX2ZsdXNoX2ZpZm9zKGkyY19kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOwogCiAJaWYgKGkyY19kZXYtPmlzX211bHRpbWFzdGVyX21vZGUgJiYgaTJjX2Rldi0+aHctPmhhc19zbGNnX292ZXJyaWRlX3JlZykKIAkJaTJjX3dyaXRlbChpMmNfZGV2LCBJMkNfTVNUX0NPUkVfQ0xLRU5fT1ZSLCBJMkNfQ0xLRU5fT1ZFUlJJREUpOwogCi0JaWYgKGkyY19kZXYtPmh3LT5oYXNfY29uZmlnX2xvYWRfcmVnKSB7Ci0JCWkyY193cml0ZWwoaTJjX2RldiwgSTJDX01TVFJfQ09ORklHX0xPQUQsIEkyQ19DT05GSUdfTE9BRCk7Ci0JCXdoaWxlIChpMmNfcmVhZGwoaTJjX2RldiwgSTJDX0NPTkZJR19MT0FEKSAhPSAwKSB7Ci0JCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewotCQkJCWRldl93YXJuKGkyY19kZXYtPmRldiwKLQkJCQkJInRpbWVvdXQgd2FpdGluZyBmb3IgY29uZmlnIGxvYWRcbiIpOwotCQkJCWVyciA9IC1FVElNRURPVVQ7Ci0JCQkJZ290byBlcnI7Ci0JCQl9Ci0JCQltc2xlZXAoMSk7Ci0JCX0KLQl9CisJZXJyID0gdGVncmFfaTJjX3dhaXRfZm9yX2NvbmZpZ19sb2FkKGkyY19kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOwogCiAJaWYgKGkyY19kZXYtPmlycV9kaXNhYmxlZCkgewotCQlpMmNfZGV2LT5pcnFfZGlzYWJsZWQgPSAwOworCQlpMmNfZGV2LT5pcnFfZGlzYWJsZWQgPSBmYWxzZTsKIAkJZW5hYmxlX2lycShpMmNfZGV2LT5pcnEpOwogCX0KIAogZXJyOgotCXRlZ3JhX2kyY19jbG9ja19kaXNhYmxlKGkyY19kZXYpOworCXBtX3J1bnRpbWVfcHV0KGkyY19kZXYtPmRldik7CiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCB0ZWdyYV9pMmNfZGlzYWJsZV9wYWNrZXRfbW9kZShzdHJ1Y3QgdGVncmFfaTJjX2RldiAqaTJjX2RldikKK3sKKwl1MzIgY25mZzsKKworCWNuZmcgPSBpMmNfcmVhZGwoaTJjX2RldiwgSTJDX0NORkcpOworCWlmIChjbmZnICYgSTJDX0NORkdfUEFDS0VUX01PREVfRU4pCisJCWkyY193cml0ZWwoaTJjX2RldiwgY25mZyAmIH5JMkNfQ05GR19QQUNLRVRfTU9ERV9FTiwgSTJDX0NORkcpOworCisJcmV0dXJuIHRlZ3JhX2kyY193YWl0X2Zvcl9jb25maWdfbG9hZChpMmNfZGV2KTsKK30KKwogc3RhdGljIGlycXJldHVybl90IHRlZ3JhX2kyY19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXUzMiBzdGF0dXM7CiAJY29uc3QgdTMyIHN0YXR1c19lcnIgPSBJMkNfSU5UX05PX0FDSyB8IEkyQ19JTlRfQVJCSVRSQVRJT05fTE9TVDsKIAlzdHJ1Y3QgdGVncmFfaTJjX2RldiAqaTJjX2RldiA9IGRldl9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3RhdHVzID0gaTJjX3JlYWRsKGkyY19kZXYsIEkyQ19JTlRfU1RBVFVTKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZpMmNfZGV2LT54ZmVyX2xvY2ssIGZsYWdzKTsKIAlpZiAoc3RhdHVzID09IDApIHsKIAkJZGV2X3dhcm4oaTJjX2Rldi0+ZGV2LCAiaXJxIHN0YXR1cyAwICUwOHggJTA4eCAlMDh4XG4iLAogCQkJIGkyY19yZWFkbChpMmNfZGV2LCBJMkNfUEFDS0VUX1RSQU5TRkVSX1NUQVRVUyksCkBAIC01MTcsMTIgKzU3MywxMyBAQAogCiAJCWlmICghaTJjX2Rldi0+aXJxX2Rpc2FibGVkKSB7CiAJCQlkaXNhYmxlX2lycV9ub3N5bmMoaTJjX2Rldi0+aXJxKTsKLQkJCWkyY19kZXYtPmlycV9kaXNhYmxlZCA9IDE7CisJCQlpMmNfZGV2LT5pcnFfZGlzYWJsZWQgPSB0cnVlOwogCQl9CiAJCWdvdG8gZXJyOwogCX0KIAogCWlmICh1bmxpa2VseShzdGF0dXMgJiBzdGF0dXNfZXJyKSkgeworCQl0ZWdyYV9pMmNfZGlzYWJsZV9wYWNrZXRfbW9kZShpMmNfZGV2KTsKIAkJaWYgKHN0YXR1cyAmIEkyQ19JTlRfTk9fQUNLKQogCQkJaTJjX2Rldi0+bXNnX2VyciB8PSBJMkNfRVJSX05PX0FDSzsKIAkJaWYgKHN0YXR1cyAmIEkyQ19JTlRfQVJCSVRSQVRJT05fTE9TVCkKQEAgLTU1Miw3ICs2MDksNyBAQAogCQlCVUdfT04oaTJjX2Rldi0+bXNnX2J1Zl9yZW1haW5pbmcpOwogCQljb21wbGV0ZSgmaTJjX2Rldi0+bXNnX2NvbXBsZXRlKTsKIAl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworCWdvdG8gZG9uZTsKIGVycjoKIAkvKiBBbiBlcnJvciBvY2N1cnJlZCwgbWFzayBhbGwgaW50ZXJydXB0cyAqLwogCXRlZ3JhX2kyY19tYXNrX2lycShpMmNfZGV2LCBJMkNfSU5UX05PX0FDSyB8IEkyQ19JTlRfQVJCSVRSQVRJT05fTE9TVCB8CkBAIC01NjMsNiArNjIwLDggQEAKIAkJZHZjX3dyaXRlbChpMmNfZGV2LCBEVkNfU1RBVFVTX0kyQ19ET05FX0lOVFIsIERWQ19TVEFUVVMpOwogCiAJY29tcGxldGUoJmkyY19kZXYtPm1zZ19jb21wbGV0ZSk7Citkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyY19kZXYtPnhmZXJfbG9jaywgZmxhZ3MpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNTcyLDYgKzYzMSw3IEBACiAJdTMyIHBhY2tldF9oZWFkZXI7CiAJdTMyIGludF9tYXNrOwogCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAl0ZWdyYV9pMmNfZmx1c2hfZmlmb3MoaTJjX2Rldik7CiAKQEAgLTU4NCw2ICs2NDQsMTEgQEAKIAlpMmNfZGV2LT5tc2dfcmVhZCA9IChtc2ctPmZsYWdzICYgSTJDX01fUkQpOwogCXJlaW5pdF9jb21wbGV0aW9uKCZpMmNfZGV2LT5tc2dfY29tcGxldGUpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyY19kZXYtPnhmZXJfbG9jaywgZmxhZ3MpOworCisJaW50X21hc2sgPSBJMkNfSU5UX05PX0FDSyB8IEkyQ19JTlRfQVJCSVRSQVRJT05fTE9TVDsKKwl0ZWdyYV9pMmNfdW5tYXNrX2lycShpMmNfZGV2LCBpbnRfbWFzayk7CisKIAlwYWNrZXRfaGVhZGVyID0gKDAgPDwgUEFDS0VUX0hFQURFUjBfSEVBREVSX1NJWkVfU0hJRlQpIHwKIAkJCVBBQ0tFVF9IRUFERVIwX1BST1RPQ09MX0kyQyB8CiAJCQkoaTJjX2Rldi0+Y29udF9pZCA8PCBQQUNLRVRfSEVBREVSMF9DT05UX0lEX1NISUZUKSB8CkBAIC02MTMsMTQgKzY3OCwxNSBAQAogCWlmICghKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkpCiAJCXRlZ3JhX2kyY19maWxsX3R4X2ZpZm8oaTJjX2Rldik7CiAKLQlpbnRfbWFzayA9IEkyQ19JTlRfTk9fQUNLIHwgSTJDX0lOVF9BUkJJVFJBVElPTl9MT1NUOwogCWlmIChpMmNfZGV2LT5ody0+aGFzX3Blcl9wa3RfeGZlcl9jb21wbGV0ZV9pcnEpCiAJCWludF9tYXNrIHw9IEkyQ19JTlRfUEFDS0VUX1hGRVJfQ09NUExFVEU7CiAJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkKIAkJaW50X21hc2sgfD0gSTJDX0lOVF9SWF9GSUZPX0RBVEFfUkVROwogCWVsc2UgaWYgKGkyY19kZXYtPm1zZ19idWZfcmVtYWluaW5nKQogCQlpbnRfbWFzayB8PSBJMkNfSU5UX1RYX0ZJRk9fREFUQV9SRVE7CisKIAl0ZWdyYV9pMmNfdW5tYXNrX2lycShpMmNfZGV2LCBpbnRfbWFzayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTJjX2Rldi0+eGZlcl9sb2NrLCBmbGFncyk7CiAJZGV2X2RiZyhpMmNfZGV2LT5kZXYsICJ1bm1hc2tlZCBpcnE6ICUwMnhcbiIsCiAJCWkyY19yZWFkbChpMmNfZGV2LCBJMkNfSU5UX01BU0spKTsKIApAQCAtNjQzLDkgKzcwOSwxMCBAQAogCQlyZXR1cm4gMDsKIAogCS8qCi0JICogTkFDSyBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGJlZm9yZSB0aGUgSTJDIGNvbnRyb2xsZXIgZ2VuZXJhdGVzIHRoZQotCSAqIFNUT1AgY29uZGl0aW9uIG9uIHRoZSBidXMuIFNvIHdhaXQgZm9yIDIgY2xvY2sgcGVyaW9kcyBiZWZvcmUgcmVzZXR0aW5nCi0JICogdGhlIGNvbnRyb2xsZXIgc28gdGhhdCBTVE9QIGNvbmRpdGlvbiBoYXMgYmVlbiBkZWxpdmVyZWQgcHJvcGVybHkuCisJICogTkFDSyBpbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIGJlZm9yZSB0aGUgSTJDIGNvbnRyb2xsZXIgZ2VuZXJhdGVzCisJICogdGhlIFNUT1AgY29uZGl0aW9uIG9uIHRoZSBidXMuIFNvIHdhaXQgZm9yIDIgY2xvY2sgcGVyaW9kcworCSAqIGJlZm9yZSByZXNldHRpbmcgdGhlIGNvbnRyb2xsZXIgc28gdGhhdCB0aGUgU1RPUCBjb25kaXRpb24gaGFzCisJICogYmVlbiBkZWxpdmVyZWQgcHJvcGVybHkuCiAJICovCiAJaWYgKGkyY19kZXYtPm1zZ19lcnIgPT0gSTJDX0VSUl9OT19BQ0spCiAJCXVkZWxheShESVZfUk9VTkRfVVAoMiAqIDEwMDAwMDAsIGkyY19kZXYtPmJ1c19jbGtfcmF0ZSkpOwpAQCAtNjcwLDE0ICs3MzcsMTUgQEAKIAlpZiAoaTJjX2Rldi0+aXNfc3VzcGVuZGVkKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JcmV0ID0gdGVncmFfaTJjX2Nsb2NrX2VuYWJsZShpMmNfZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGkyY19kZXYtPmRldik7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihpMmNfZGV2LT5kZXYsICJDbG9jayBlbmFibGUgZmFpbGVkICVkXG4iLCByZXQpOworCQlkZXZfZXJyKGkyY19kZXYtPmRldiwgInJ1bnRpbWUgcmVzdW1lIGZhaWxlZCAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKIAkJZW51bSBtc2dfZW5kX3R5cGUgZW5kX3R5cGUgPSBNU0dfRU5EX1NUT1A7CisKIAkJaWYgKGkgPCAobnVtIC0gMSkpIHsKIAkJCWlmIChtc2dzW2kgKyAxXS5mbGFncyAmIEkyQ19NX05PU1RBUlQpCiAJCQkJZW5kX3R5cGUgPSBNU0dfRU5EX0NPTlRJTlVFOwpAQCAtNjg4LDcgKzc1Niw5IEBACiAJCWlmIChyZXQpCiAJCQlicmVhazsKIAl9Ci0JdGVncmFfaTJjX2Nsb2NrX2Rpc2FibGUoaTJjX2Rldik7CisKKwlwbV9ydW50aW1lX3B1dChpMmNfZGV2LT5kZXYpOworCiAJcmV0dXJuIHJldCA/OiBpOwogfQogCkBAIC04MjUsNyArODk1LDcgQEAKIAogCWRpdl9jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImRpdi1jbGsiKTsKIAlpZiAoSVNfRVJSKGRpdl9jbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm1pc3NpbmcgY29udHJvbGxlciBjbG9jayIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIGNvbnRyb2xsZXIgY2xvY2tcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihkaXZfY2xrKTsKIAl9CiAKQEAgLTg0MywyNyArOTEzLDIyIEBACiAKIAlpMmNfZGV2LT5yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsICJpMmMiKTsKIAlpZiAoSVNfRVJSKGkyY19kZXYtPnJzdCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibWlzc2luZyBjb250cm9sbGVyIHJlc2V0Iik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1pc3NpbmcgY29udHJvbGxlciByZXNldFxuIik7CiAJCXJldHVybiBQVFJfRVJSKGkyY19kZXYtPnJzdCk7CiAJfQogCiAJdGVncmFfaTJjX3BhcnNlX2R0KGkyY19kZXYpOwogCi0JaTJjX2Rldi0+aHcgPSAmdGVncmEyMF9pMmNfaHc7Ci0KLQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpIHsKLQkJaTJjX2Rldi0+aHcgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7Ci0JCWkyY19kZXYtPmlzX2R2YyA9IG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBkZXYtPmRldi5vZl9ub2RlLAotCQkJCQkJIm52aWRpYSx0ZWdyYTIwLWkyYy1kdmMiKTsKLQl9IGVsc2UgaWYgKHBkZXYtPmlkID09IDMpIHsKLQkJaTJjX2Rldi0+aXNfZHZjID0gMTsKLQl9CisJaTJjX2Rldi0+aHcgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7CisJaTJjX2Rldi0+aXNfZHZjID0gb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkgICJudmlkaWEsdGVncmEyMC1pMmMtZHZjIik7CiAJaW5pdF9jb21wbGV0aW9uKCZpMmNfZGV2LT5tc2dfY29tcGxldGUpOworCXNwaW5fbG9ja19pbml0KCZpMmNfZGV2LT54ZmVyX2xvY2spOwogCiAJaWYgKCFpMmNfZGV2LT5ody0+aGFzX3NpbmdsZV9jbGtfc291cmNlKSB7CiAJCWZhc3RfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJmYXN0LWNsayIpOwogCQlpZiAoSVNfRVJSKGZhc3RfY2xrKSkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAibWlzc2luZyBmYXN0IGNsb2NrIik7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nIGZhc3QgY2xvY2tcbiIpOwogCQkJcmV0dXJuIFBUUl9FUlIoZmFzdF9jbGspOwogCQl9CiAJCWkyY19kZXYtPmZhc3RfY2xrID0gZmFzdF9jbGs7CkBAIC05MDAsMTggKzk2NSwyNyBAQAogCQlnb3RvIHVucHJlcGFyZV9mYXN0X2NsazsKIAl9CiAKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKwlpZiAoIXBtX3J1bnRpbWVfZW5hYmxlZCgmcGRldi0+ZGV2KSkgeworCQlyZXQgPSB0ZWdyYV9pMmNfcnVudGltZV9yZXN1bWUoJnBkZXYtPmRldik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJydW50aW1lIHJlc3VtZSBmYWlsZWRcbiIpOworCQkJZ290byB1bnByZXBhcmVfZGl2X2NsazsKKwkJfQorCX0KKwogCWlmIChpMmNfZGV2LT5pc19tdWx0aW1hc3Rlcl9tb2RlKSB7CiAJCXJldCA9IGNsa19lbmFibGUoaTJjX2Rldi0+ZGl2X2Nsayk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKGkyY19kZXYtPmRldiwgImRpdl9jbGsgZW5hYmxlIGZhaWxlZCAlZFxuIiwKIAkJCQlyZXQpOwotCQkJZ290byB1bnByZXBhcmVfZGl2X2NsazsKKwkJCWdvdG8gZGlzYWJsZV9ycG07CiAJCX0KIAl9CiAKIAlyZXQgPSB0ZWdyYV9pMmNfaW5pdChpMmNfZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGkyYyBjb250cm9sbGVyIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGkyYyBjb250cm9sbGVyXG4iKTsKIAkJZ290byBkaXNhYmxlX2Rpdl9jbGs7CiAJfQogCkBAIC05MjUsMTcgKzk5OSwxNSBAQAogCWkyY19zZXRfYWRhcGRhdGEoJmkyY19kZXYtPmFkYXB0ZXIsIGkyY19kZXYpOwogCWkyY19kZXYtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKIAlpMmNfZGV2LT5hZGFwdGVyLmNsYXNzID0gSTJDX0NMQVNTX0RFUFJFQ0FURUQ7Ci0Jc3RybGNweShpMmNfZGV2LT5hZGFwdGVyLm5hbWUsICJUZWdyYSBJMkMgYWRhcHRlciIsCisJc3RybGNweShpMmNfZGV2LT5hZGFwdGVyLm5hbWUsIGRldl9uYW1lKCZwZGV2LT5kZXYpLAogCQlzaXplb2YoaTJjX2Rldi0+YWRhcHRlci5uYW1lKSk7CiAJaTJjX2Rldi0+YWRhcHRlci5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKIAlpMmNfZGV2LT5hZGFwdGVyLm5yID0gcGRldi0+aWQ7CiAJaTJjX2Rldi0+YWRhcHRlci5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCiAJcmV0ID0gaTJjX2FkZF9udW1iZXJlZF9hZGFwdGVyKCZpMmNfZGV2LT5hZGFwdGVyKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhZGQgSTJDIGFkYXB0ZXJcbiIpOworCWlmIChyZXQpCiAJCWdvdG8gZGlzYWJsZV9kaXZfY2xrOwotCX0KIAogCXJldHVybiAwOwogCkBAIC05NDMsNiArMTAxNSwxMSBAQAogCWlmIChpMmNfZGV2LT5pc19tdWx0aW1hc3Rlcl9tb2RlKQogCQljbGtfZGlzYWJsZShpMmNfZGV2LT5kaXZfY2xrKTsKIAorZGlzYWJsZV9ycG06CisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCWlmICghcG1fcnVudGltZV9zdGF0dXNfc3VzcGVuZGVkKCZwZGV2LT5kZXYpKQorCQl0ZWdyYV9pMmNfcnVudGltZV9zdXNwZW5kKCZwZGV2LT5kZXYpOworCiB1bnByZXBhcmVfZGl2X2NsazoKIAljbGtfdW5wcmVwYXJlKGkyY19kZXYtPmRpdl9jbGspOwogCkBAIC05NTYsMTEgKzEwMzMsMTYgQEAKIHN0YXRpYyBpbnQgdGVncmFfaTJjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB0ZWdyYV9pMmNfZGV2ICppMmNfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKIAlpMmNfZGVsX2FkYXB0ZXIoJmkyY19kZXYtPmFkYXB0ZXIpOwogCiAJaWYgKGkyY19kZXYtPmlzX211bHRpbWFzdGVyX21vZGUpCiAJCWNsa19kaXNhYmxlKGkyY19kZXYtPmRpdl9jbGspOwogCisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCWlmICghcG1fcnVudGltZV9zdGF0dXNfc3VzcGVuZGVkKCZwZGV2LT5kZXYpKQorCQl0ZWdyYV9pMmNfcnVudGltZV9zdXNwZW5kKCZwZGV2LT5kZXYpOworCiAJY2xrX3VucHJlcGFyZShpMmNfZGV2LT5kaXZfY2xrKTsKIAlpZiAoIWkyY19kZXYtPmh3LT5oYXNfc2luZ2xlX2Nsa19zb3VyY2UpCiAJCWNsa191bnByZXBhcmUoaTJjX2Rldi0+ZmFzdF9jbGspOwpAQCAtOTg4LDIwICsxMDcwLDE5IEBACiAJaTJjX2xvY2tfYWRhcHRlcigmaTJjX2Rldi0+YWRhcHRlcik7CiAKIAlyZXQgPSB0ZWdyYV9pMmNfaW5pdChpMmNfZGV2KTsKLQotCWlmIChyZXQpIHsKLQkJaTJjX3VubG9ja19hZGFwdGVyKCZpMmNfZGV2LT5hZGFwdGVyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpMmNfZGV2LT5pc19zdXNwZW5kZWQgPSBmYWxzZTsKKwlpZiAoIXJldCkKKwkJaTJjX2Rldi0+aXNfc3VzcGVuZGVkID0gZmFsc2U7CiAKIAlpMmNfdW5sb2NrX2FkYXB0ZXIoJmkyY19kZXYtPmFkYXB0ZXIpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHRlZ3JhX2kyY19wbSwgdGVncmFfaTJjX3N1c3BlbmQsIHRlZ3JhX2kyY19yZXN1bWUpOworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHRlZ3JhX2kyY19wbSA9IHsKKwlTRVRfUlVOVElNRV9QTV9PUFModGVncmFfaTJjX3J1bnRpbWVfc3VzcGVuZCwgdGVncmFfaTJjX3J1bnRpbWVfcmVzdW1lLAorCQkJICAgTlVMTCkKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyh0ZWdyYV9pMmNfc3VzcGVuZCwgdGVncmFfaTJjX3Jlc3VtZSkKK307CiAjZGVmaW5lIFRFR1JBX0kyQ19QTQkoJnRlZ3JhX2kyY19wbSkKICNlbHNlCiAjZGVmaW5lIFRFR1JBX0kyQ19QTQlOVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRodW5kZXJ4LXBjaWRydi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10aHVuZGVyeC1wY2lkcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmE1YjQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10aHVuZGVyeC1wY2lkcnYuYwpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqIENhdml1bSBUaHVuZGVyWCBpMmMgZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSwyMDE2IENhdml1bSBJbmMuCisgKiBBdXRob3JzOiBGcmVkIE1hcnRpbiA8Zm1hcnRpbkBjYXZpdW1uZXR3b3Jrcy5jb20+CisgKgkgICAgSmFuIEdsYXViZXIgPGpnbGF1YmVyQGNhdml1bS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLXNtYnVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJpMmMtb2N0ZW9uLWNvcmUuaCIKKworI2RlZmluZSBEUlZfTkFNRSAiaTJjLXRodW5kZXJ4IgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVEhVTkRFUl9UV1NJCTB4YTAxMgorCisjZGVmaW5lIFNZU19GUkVRX0RFRkFVTFQJCTcwMDAwMDAwMAorCisjZGVmaW5lIFRXU0lfSU5UX0VOQV9XMUMJCTB4MTAyOAorI2RlZmluZSBUV1NJX0lOVF9FTkFfVzFTCQkweDEwMzAKKworLyoKKyAqIEVuYWJsZSB0aGUgQ09SRSBpbnRlcnJ1cHQuCisgKiBUaGUgaW50ZXJydXB0IHdpbGwgYmUgYXNzZXJ0ZWQgd2hlbiB0aGVyZSBpcyBub24tU1RBVF9JRExFIHN0YXRlIGluIHRoZQorICogU1dfVFdTSV9FT1BfVFdTSV9TVEFUIHJlZ2lzdGVyLgorICovCitzdGF0aWMgdm9pZCB0aHVuZGVyX2kyY19pbnRfZW5hYmxlKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCit7CisJb2N0ZW9uX2kyY193cml0ZXFfZmx1c2goVFdTSV9JTlRfQ09SRV9JTlQsCisJCQkJaTJjLT50d3NpX2Jhc2UgKyBUV1NJX0lOVF9FTkFfVzFTKTsKK30KKworLyoKKyAqIERpc2FibGUgdGhlIENPUkUgaW50ZXJydXB0LgorICovCitzdGF0aWMgdm9pZCB0aHVuZGVyX2kyY19pbnRfZGlzYWJsZShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQoreworCW9jdGVvbl9pMmNfd3JpdGVxX2ZsdXNoKFRXU0lfSU5UX0NPUkVfSU5ULAorCQkJCWkyYy0+dHdzaV9iYXNlICsgVFdTSV9JTlRfRU5BX1cxQyk7Cit9CisKK3N0YXRpYyB2b2lkIHRodW5kZXJfaTJjX2hsY19pbnRfZW5hYmxlKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCit7CisJb2N0ZW9uX2kyY193cml0ZXFfZmx1c2goVFdTSV9JTlRfU1RfSU5UIHwgVFdTSV9JTlRfVFNfSU5ULAorCQkJCWkyYy0+dHdzaV9iYXNlICsgVFdTSV9JTlRfRU5BX1cxUyk7Cit9CisKK3N0YXRpYyB2b2lkIHRodW5kZXJfaTJjX2hsY19pbnRfZGlzYWJsZShzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjKQoreworCW9jdGVvbl9pMmNfd3JpdGVxX2ZsdXNoKFRXU0lfSU5UX1NUX0lOVCB8IFRXU0lfSU5UX1RTX0lOVCwKKwkJCQlpMmMtPnR3c2lfYmFzZSArIFRXU0lfSU5UX0VOQV9XMUMpOworfQorCitzdGF0aWMgdTMyIHRodW5kZXJ4X2kyY19mdW5jdGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgKEkyQ19GVU5DX1NNQlVTX0VNVUwgJiB+STJDX0ZVTkNfU01CVVNfUVVJQ0spIHwKKwkgICAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9CTE9DS19EQVRBIHwgSTJDX1NNQlVTX0JMT0NLX1BST0NfQ0FMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIHRodW5kZXJ4X2kyY19hbGdvID0geworCS5tYXN0ZXJfeGZlciA9IG9jdGVvbl9pMmNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eSA9IHRodW5kZXJ4X2kyY19mdW5jdGlvbmFsaXR5LAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciB0aHVuZGVyeF9pMmNfb3BzID0geworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5uYW1lCT0gIlRodW5kZXJYIGFkYXB0ZXIiLAorCS5hbGdvCT0gJnRodW5kZXJ4X2kyY19hbGdvLAorfTsKKworc3RhdGljIHZvaWQgdGh1bmRlcl9pMmNfY2xvY2tfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG9jdGVvbl9pMmMgKmkyYykKK3sKKwlpbnQgcmV0OworCisJaTJjLT5jbGsgPSBjbGtfZ2V0KGRldiwgTlVMTCk7CisJaWYgKElTX0VSUihpMmMtPmNsaykpIHsKKwkJaTJjLT5jbGsgPSBOVUxMOworCQlnb3RvIHNraXA7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGkyYy0+Y2xrKTsKKwlpZiAocmV0KQorCQlnb3RvIHNraXA7CisJaTJjLT5zeXNfZnJlcSA9IGNsa19nZXRfcmF0ZShpMmMtPmNsayk7CisKK3NraXA6CisJaWYgKCFpMmMtPnN5c19mcmVxKQorCQlpMmMtPnN5c19mcmVxID0gU1lTX0ZSRVFfREVGQVVMVDsKK30KKworc3RhdGljIHZvaWQgdGh1bmRlcl9pMmNfY2xvY2tfZGlzYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoIWNsaykKKwkJcmV0dXJuOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShjbGspOworCWNsa19wdXQoY2xrKTsKK30KKworc3RhdGljIGludCB0aHVuZGVyX2kyY19zbWJ1c19zZXR1cF9vZihzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjLAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwl1MzIgdHlwZTsKKworCWlmICghbm9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpMmMtPmFsZXJ0X2RhdGEuaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7CisJaWYgKCFpMmMtPmFsZXJ0X2RhdGEuaXJxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXR5cGUgPSBpcnFkX2dldF90cmlnZ2VyX3R5cGUoaXJxX2dldF9pcnFfZGF0YShpMmMtPmFsZXJ0X2RhdGEuaXJxKSk7CisJaTJjLT5hbGVydF9kYXRhLmFsZXJ0X2VkZ2VfdHJpZ2dlcmVkID0KKwkJKHR5cGUgJiBJUlFfVFlQRV9MRVZFTF9NQVNLKSA/IDEgOiAwOworCisJaTJjLT5hcmEgPSBpMmNfc2V0dXBfc21idXNfYWxlcnQoJmkyYy0+YWRhcCwgJmkyYy0+YWxlcnRfZGF0YSk7CisJaWYgKCFpMmMtPmFyYSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGh1bmRlcl9pMmNfc21idXNfc2V0dXAoc3RydWN0IG9jdGVvbl9pMmMgKmkyYywKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCit7CisJLyogVE9ETzogQUNQSSBzdXBwb3J0ICovCisJaWYgKCFhY3BpX2Rpc2FibGVkKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gdGh1bmRlcl9pMmNfc21idXNfc2V0dXBfb2YoaTJjLCBub2RlKTsKK30KKworc3RhdGljIHZvaWQgdGh1bmRlcl9pMmNfc21idXNfcmVtb3ZlKHN0cnVjdCBvY3Rlb25faTJjICppMmMpCit7CisJaWYgKGkyYy0+YXJhKQorCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UoaTJjLT5hcmEpOworfQorCitzdGF0aWMgaW50IHRodW5kZXJfaTJjX3Byb2JlX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBvY3Rlb25faTJjICppMmM7CisJaW50IHJldDsKKworCWkyYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaTJjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpMmMpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjLT5yb2ZmLnN3X3R3c2kgPSAweDEwMDA7CisJaTJjLT5yb2ZmLnR3c2lfaW50ID0gMHgxMDEwOworCWkyYy0+cm9mZi5zd190d3NpX2V4dCA9IDB4MTAxODsKKworCWkyYy0+ZGV2ID0gZGV2OworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBpMmMpOworCXJldCA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWkyYy0+dHdzaV9iYXNlID0gcGNpbV9pb21hcChwZGV2LCAwLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlpZiAoIWkyYy0+dHdzaV9iYXNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRodW5kZXJfaTJjX2Nsb2NrX2VuYWJsZShkZXYsIGkyYyk7CisJcmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgImNsb2NrLWZyZXF1ZW5jeSIsICZpMmMtPnR3c2lfZnJlcSk7CisJaWYgKHJldCkKKwkJaTJjLT50d3NpX2ZyZXEgPSAxMDAwMDA7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpMmMtPnF1ZXVlKTsKKworCWkyYy0+aW50X2VuYWJsZSA9IHRodW5kZXJfaTJjX2ludF9lbmFibGU7CisJaTJjLT5pbnRfZGlzYWJsZSA9IHRodW5kZXJfaTJjX2ludF9kaXNhYmxlOworCWkyYy0+aGxjX2ludF9lbmFibGUgPSB0aHVuZGVyX2kyY19obGNfaW50X2VuYWJsZTsKKwlpMmMtPmhsY19pbnRfZGlzYWJsZSA9IHRodW5kZXJfaTJjX2hsY19pbnRfZGlzYWJsZTsKKworCXJldCA9IHBjaV9lbmFibGVfbXNpeChwZGV2LCAmaTJjLT5pMmNfbXNpeCwgMSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpMmMtPmkyY19tc2l4LnZlY3Rvciwgb2N0ZW9uX2kyY19pc3IsIDAsCisJCQkgICAgICAgRFJWX05BTUUsIGkyYyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IG9jdGVvbl9pMmNfaW5pdF9sb3dsZXZlbChpMmMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlvY3Rlb25faTJjX3NldF9jbG9jayhpMmMpOworCisJaTJjLT5hZGFwID0gdGh1bmRlcnhfaTJjX29wczsKKwlpMmMtPmFkYXAucmV0cmllcyA9IDU7CisJaTJjLT5hZGFwLmJ1c19yZWNvdmVyeV9pbmZvID0gJm9jdGVvbl9pMmNfcmVjb3ZlcnlfaW5mbzsKKwlpMmMtPmFkYXAuZGV2LnBhcmVudCA9IGRldjsKKwlpMmMtPmFkYXAuZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzbnByaW50ZihpMmMtPmFkYXAubmFtZSwgc2l6ZW9mKGkyYy0+YWRhcC5uYW1lKSwKKwkJICJDYXZpdW0gVGh1bmRlclggaTJjIGFkYXB0ZXIgYXQgJXMiLCBkZXZfbmFtZShkZXYpKTsKKwlpMmNfc2V0X2FkYXBkYXRhKCZpMmMtPmFkYXAsIGkyYyk7CisKKwlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJmkyYy0+YWRhcCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWRldl9pbmZvKGkyYy0+ZGV2LCAiUHJvYmVkLiBTZXQgc3lzdGVtIGNsb2NrIHRvICV1XG4iLCBpMmMtPnN5c19mcmVxKTsKKworCXJldCA9IHRodW5kZXJfaTJjX3NtYnVzX3NldHVwKGkyYywgcGRldi0+ZGV2Lm9mX25vZGUpOworCWlmIChyZXQpCisJCWRldl9pbmZvKGRldiwgIlNNQlVTIGFsZXJ0IG5vdCBhY3RpdmUgb24gdGhpcyBidXNcbiIpOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXRodW5kZXJfaTJjX2Nsb2NrX2Rpc2FibGUoZGV2LCBpMmMtPmNsayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdGh1bmRlcl9pMmNfcmVtb3ZlX3BjaShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2kyYyAqaTJjID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJdGh1bmRlcl9pMmNfc21idXNfcmVtb3ZlKGkyYyk7CisJdGh1bmRlcl9pMmNfY2xvY2tfZGlzYWJsZSgmcGRldi0+ZGV2LCBpMmMtPmNsayk7CisJaTJjX2RlbF9hZGFwdGVyKCZpMmMtPmFkYXApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgdGh1bmRlcl9pMmNfcGNpX2lkX3RhYmxlW10gPSB7CisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ0FWSVVNLCBQQ0lfREVWSUNFX0lEX1RIVU5ERVJfVFdTSSkgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCB0aHVuZGVyX2kyY19wY2lfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdGh1bmRlcl9pMmNfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUJPSB0aHVuZGVyX2kyY19wY2lfaWRfdGFibGUsCisJLnByb2JlCQk9IHRodW5kZXJfaTJjX3Byb2JlX3BjaSwKKwkucmVtb3ZlCQk9IHRodW5kZXJfaTJjX3JlbW92ZV9wY2ksCit9OworCittb2R1bGVfcGNpX2RyaXZlcih0aHVuZGVyX2kyY19wY2lfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRnJlZCBNYXJ0aW4gPGZtYXJ0aW5AY2F2aXVtbmV0d29ya3MuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMtQnVzIGFkYXB0ZXIgZm9yIENhdml1bSBUaHVuZGVyWCBTT0MiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdW5pcGhpZXItZi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy11bmlwaGllci1mLmMKaW5kZXggYWVlYWQwZC4uZGI5MTA1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy11bmlwaGllci1mLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy11bmlwaGllci1mLmMKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNDgsMTQgKzM0OSwxOSBAQAogCWRldl9kYmcoJmFkYXAtPmRldiwgImNvbXBsZXRlXG4iKTsKIAogCWlmICh1bmxpa2VseShwcml2LT5mbGFncyAmIFVOSVBISUVSX0ZJMkNfREVGRVJfU1RPUF9DT01QKSkgewotCQl1MzIgc3RhdHVzID0gcmVhZGwocHJpdi0+bWVtYmFzZSArIFVOSVBISUVSX0ZJMkNfU1IpOworCQl1MzIgc3RhdHVzOworCQlpbnQgcmV0OwogCi0JCWlmICghKHN0YXR1cyAmIFVOSVBISUVSX0ZJMkNfU1JfU1RTKSB8fAotCQkgICAgc3RhdHVzICYgVU5JUEhJRVJfRkkyQ19TUl9CQikgeworCQlyZXQgPSByZWFkbF9wb2xsX3RpbWVvdXQocHJpdi0+bWVtYmFzZSArIFVOSVBISUVSX0ZJMkNfU1IsCisJCQkJCSBzdGF0dXMsCisJCQkJCSAoc3RhdHVzICYgVU5JUEhJRVJfRkkyQ19TUl9TVFMpICYmCisJCQkJCSAhKHN0YXR1cyAmIFVOSVBISUVSX0ZJMkNfU1JfQkIpLAorCQkJCQkgMSwgMjApOworCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKCZhZGFwLT5kZXYsCiAJCQkJInN0b3AgY29uZGl0aW9uIHdhcyBub3QgY29tcGxldGVkLlxuIik7CiAJCQl1bmlwaGllcl9maTJjX3JlY292ZXIocHJpdik7Ci0JCQlyZXR1cm4gLUVCVVNZOworCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIApAQCAtNDU1LDU0ICs0NjEsMjUgQEAKIAkudW5wcmVwYXJlX3JlY292ZXJ5ID0gdW5pcGhpZXJfZmkyY191bnByZXBhcmVfcmVjb3ZlcnksCiB9OwogCi1zdGF0aWMgaW50IHVuaXBoaWVyX2ZpMmNfY2xrX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IHVuaXBoaWVyX2ZpMmNfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIHVuaXBoaWVyX2ZpMmNfaHdfaW5pdChzdHJ1Y3QgdW5pcGhpZXJfZmkyY19wcml2ICpwcml2LAorCQkJCSAgdTMyIGJ1c19zcGVlZCwgdW5zaWduZWQgbG9uZyBjbGtfcmF0ZSkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwotCXVuc2lnbmVkIGxvbmcgY2xrX3JhdGU7Ci0JdTMyIGJ1c19zcGVlZCwgY2xrX2NvdW50OwotCWludCByZXQ7CisJdTMyIHRtcDsKIAotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNsb2NrLWZyZXF1ZW5jeSIsICZidXNfc3BlZWQpKQotCQlidXNfc3BlZWQgPSBVTklQSElFUl9GSTJDX0RFRkFVTFRfU1BFRUQ7Ci0KLQlpZiAoIWJ1c19zcGVlZCkgewotCQlkZXZfZXJyKGRldiwgImNsb2NrLWZyZXF1ZW5jeSBzaG91bGQgbm90IGJlIHplcm9cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoYnVzX3NwZWVkID4gVU5JUEhJRVJfRkkyQ19NQVhfU1BFRUQpCi0JCWJ1c19zcGVlZCA9IFVOSVBISUVSX0ZJMkNfTUFYX1NQRUVEOwotCi0JLyogR2V0IGlucHV0IGNsayByYXRlIHRocm91Z2ggY2xrIGRyaXZlciAqLwotCXByaXYtPmNsayA9IGRldm1fY2xrX2dldChkZXYsIE5VTEwpOwotCWlmIChJU19FUlIocHJpdi0+Y2xrKSkgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgY2xvY2tcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihwcml2LT5jbGspOwotCX0KLQotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5jbGspOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQljbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShwcml2LT5jbGspOwotCWlmICghY2xrX3JhdGUpIHsKLQkJZGV2X2VycihkZXYsICJpbnB1dCBjbG9jayByYXRlIHNob3VsZCBub3QgYmUgemVyb1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwl0bXAgPSByZWFkbChwcml2LT5tZW1iYXNlICsgVU5JUEhJRVJfRkkyQ19DUik7CisJdG1wIHw9IFVOSVBISUVSX0ZJMkNfQ1JfTVNUOworCXdyaXRlbCh0bXAsIHByaXYtPm1lbWJhc2UgKyBVTklQSElFUl9GSTJDX0NSKTsKIAogCXVuaXBoaWVyX2ZpMmNfcmVzZXQocHJpdik7CiAKLQljbGtfY291bnQgPSBjbGtfcmF0ZSAvIGJ1c19zcGVlZDsKKwl0bXAgPSBjbGtfcmF0ZSAvIGJ1c19zcGVlZDsKIAotCXdyaXRlbChjbGtfY291bnQsIHByaXYtPm1lbWJhc2UgKyBVTklQSElFUl9GSTJDX0NZQyk7Ci0Jd3JpdGVsKGNsa19jb3VudCAvIDIsIHByaXYtPm1lbWJhc2UgKyBVTklQSElFUl9GSTJDX0xDVEwpOwotCXdyaXRlbChjbGtfY291bnQgLyAyLCBwcml2LT5tZW1iYXNlICsgVU5JUEhJRVJfRkkyQ19TU1VUKTsKLQl3cml0ZWwoY2xrX2NvdW50IC8gMTYsIHByaXYtPm1lbWJhc2UgKyBVTklQSElFUl9GSTJDX0RTVVQpOworCXdyaXRlbCh0bXAsIHByaXYtPm1lbWJhc2UgKyBVTklQSElFUl9GSTJDX0NZQyk7CisJd3JpdGVsKHRtcCAvIDIsIHByaXYtPm1lbWJhc2UgKyBVTklQSElFUl9GSTJDX0xDVEwpOworCXdyaXRlbCh0bXAgLyAyLCBwcml2LT5tZW1iYXNlICsgVU5JUEhJRVJfRkkyQ19TU1VUKTsKKwl3cml0ZWwodG1wIC8gMTYsIHByaXYtPm1lbWJhc2UgKyBVTklQSElFUl9GSTJDX0RTVVQpOwogCiAJdW5pcGhpZXJfZmkyY19wcmVwYXJlX29wZXJhdGlvbihwcml2KTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHVuaXBoaWVyX2ZpMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTUxMCw4ICs0ODcsOSBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IHVuaXBoaWVyX2ZpMmNfcHJpdiAqcHJpdjsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7Ci0JaW50IGlycTsKLQlpbnQgcmV0OworCXUzMiBidXNfc3BlZWQ7CisJdW5zaWduZWQgbG9uZyBjbGtfcmF0ZTsKKwlpbnQgaXJxLCByZXQ7CiAKIAlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQpAQCAtNTI4LDYgKzUwNiwzMSBAQAogCQlyZXR1cm4gaXJxOwogCX0KIAorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihkZXYtPm9mX25vZGUsICJjbG9jay1mcmVxdWVuY3kiLCAmYnVzX3NwZWVkKSkKKwkJYnVzX3NwZWVkID0gVU5JUEhJRVJfRkkyQ19ERUZBVUxUX1NQRUVEOworCisJaWYgKCFidXNfc3BlZWQgfHwgYnVzX3NwZWVkID4gVU5JUEhJRVJfRkkyQ19NQVhfU1BFRUQpIHsKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIGNsb2NrLWZyZXF1ZW5jeSAlZFxuIiwgYnVzX3NwZWVkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpdi0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgTlVMTCk7CisJaWYgKElTX0VSUihwcml2LT5jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKHByaXYtPmNsayk7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHByaXYtPmNsayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNsa19yYXRlID0gY2xrX2dldF9yYXRlKHByaXYtPmNsayk7CisJaWYgKCFjbGtfcmF0ZSkgeworCQlkZXZfZXJyKGRldiwgImlucHV0IGNsb2NrIHJhdGUgc2hvdWxkIG5vdCBiZSB6ZXJvXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCiAJaW5pdF9jb21wbGV0aW9uKCZwcml2LT5jb21wKTsKIAlwcml2LT5hZGFwLm93bmVyID0gVEhJU19NT0RVTEU7CiAJcHJpdi0+YWRhcC5hbGdvID0gJnVuaXBoaWVyX2ZpMmNfYWxnbzsKQEAgLTUzOCw5ICs1NDEsNyBAQAogCWkyY19zZXRfYWRhcGRhdGEoJnByaXYtPmFkYXAsIHByaXYpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwogCi0JcmV0ID0gdW5pcGhpZXJfZmkyY19jbGtfaW5pdChkZXYsIHByaXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOworCXVuaXBoaWVyX2ZpMmNfaHdfaW5pdChwcml2LCBidXNfc3BlZWQsIGNsa19yYXRlKTsKIAogCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsIHVuaXBoaWVyX2ZpMmNfaW50ZXJydXB0LCAwLAogCQkJICAgICAgIHBkZXYtPm5hbWUsIHByaXYpOwpAQCAtNTUwLDExICs1NTEsNiBAQAogCX0KIAogCXJldCA9IGkyY19hZGRfYWRhcHRlcigmcHJpdi0+YWRhcCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhZGQgSTJDIGFkYXB0ZXJcbiIpOwotCQlnb3RvIGVycjsKLQl9Ci0KIGVycjoKIAlpZiAocmV0KQogCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdW5pcGhpZXIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdW5pcGhpZXIuYwppbmRleCA0NzVhNWViLi41NmU5MmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXVuaXBoaWVyLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy11bmlwaGllci5jCkBAIC0zMTYsNTAgKzMxNiwxNSBAQAogCS51bnByZXBhcmVfcmVjb3ZlcnkgPSB1bmlwaGllcl9pMmNfdW5wcmVwYXJlX3JlY292ZXJ5LAogfTsKIAotc3RhdGljIGludCB1bmlwaGllcl9pMmNfY2xrX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgdW5pcGhpZXJfaTJjX3ByaXYgKnByaXYpCitzdGF0aWMgdm9pZCB1bmlwaGllcl9pMmNfaHdfaW5pdChzdHJ1Y3QgdW5pcGhpZXJfaTJjX3ByaXYgKnByaXYsCisJCQkJIHUzMiBidXNfc3BlZWQsIHVuc2lnbmVkIGxvbmcgY2xrX3JhdGUpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKLQl1bnNpZ25lZCBsb25nIGNsa19yYXRlOwotCXUzMiBidXNfc3BlZWQ7Ci0JaW50IHJldDsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNsb2NrLWZyZXF1ZW5jeSIsICZidXNfc3BlZWQpKQotCQlidXNfc3BlZWQgPSBVTklQSElFUl9JMkNfREVGQVVMVF9TUEVFRDsKLQotCWlmICghYnVzX3NwZWVkKSB7Ci0JCWRldl9lcnIoZGV2LCAiY2xvY2stZnJlcXVlbmN5IHNob3VsZCBub3QgYmUgemVyb1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChidXNfc3BlZWQgPiBVTklQSElFUl9JMkNfTUFYX1NQRUVEKQotCQlidXNfc3BlZWQgPSBVTklQSElFUl9JMkNfTUFYX1NQRUVEOwotCi0JLyogR2V0IGlucHV0IGNsayByYXRlIHRocm91Z2ggY2xrIGRyaXZlciAqLwotCXByaXYtPmNsayA9IGRldm1fY2xrX2dldChkZXYsIE5VTEwpOwotCWlmIChJU19FUlIocHJpdi0+Y2xrKSkgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgY2xvY2tcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihwcml2LT5jbGspOwotCX0KLQotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5jbGspOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQljbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShwcml2LT5jbGspOwotCWlmICghY2xrX3JhdGUpIHsKLQkJZGV2X2VycihkZXYsICJpbnB1dCBjbG9jayByYXRlIHNob3VsZCBub3QgYmUgemVyb1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCXVuaXBoaWVyX2kyY19yZXNldChwcml2LCB0cnVlKTsKIAogCXdyaXRlbCgoY2xrX3JhdGUgLyBidXNfc3BlZWQgLyAyIDw8IDE2KSB8IChjbGtfcmF0ZSAvIGJ1c19zcGVlZCksCiAJICAgICAgIHByaXYtPm1lbWJhc2UgKyBVTklQSElFUl9JMkNfQ0xLKTsKIAogCXVuaXBoaWVyX2kyY19yZXNldChwcml2LCBmYWxzZSk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1bmlwaGllcl9pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTM2Nyw4ICszMzIsOSBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IHVuaXBoaWVyX2kyY19wcml2ICpwcml2OwogCXN0cnVjdCByZXNvdXJjZSAqcmVnczsKLQlpbnQgaXJxOwotCWludCByZXQ7CisJdTMyIGJ1c19zcGVlZDsKKwl1bnNpZ25lZCBsb25nIGNsa19yYXRlOworCWludCBpcnEsIHJldDsKIAogCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYpCkBAIC0zODUsNiArMzUxLDMxIEBACiAJCXJldHVybiBpcnE7CiAJfQogCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIsICZidXNfc3BlZWQpKQorCQlidXNfc3BlZWQgPSBVTklQSElFUl9JMkNfREVGQVVMVF9TUEVFRDsKKworCWlmICghYnVzX3NwZWVkIHx8IGJ1c19zcGVlZCA+IFVOSVBISUVSX0kyQ19NQVhfU1BFRUQpIHsKKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIGNsb2NrLWZyZXF1ZW5jeSAlZFxuIiwgYnVzX3NwZWVkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpdi0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgTlVMTCk7CisJaWYgKElTX0VSUihwcml2LT5jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9ja1xuIik7CisJCXJldHVybiBQVFJfRVJSKHByaXYtPmNsayk7CisJfQorCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHByaXYtPmNsayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNsa19yYXRlID0gY2xrX2dldF9yYXRlKHByaXYtPmNsayk7CisJaWYgKCFjbGtfcmF0ZSkgeworCQlkZXZfZXJyKGRldiwgImlucHV0IGNsb2NrIHJhdGUgc2hvdWxkIG5vdCBiZSB6ZXJvXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCiAJaW5pdF9jb21wbGV0aW9uKCZwcml2LT5jb21wKTsKIAlwcml2LT5hZGFwLm93bmVyID0gVEhJU19NT0RVTEU7CiAJcHJpdi0+YWRhcC5hbGdvID0gJnVuaXBoaWVyX2kyY19hbGdvOwpAQCAtMzk1LDkgKzM4Niw3IEBACiAJaTJjX3NldF9hZGFwZGF0YSgmcHJpdi0+YWRhcCwgcHJpdik7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CiAKLQlyZXQgPSB1bmlwaGllcl9pMmNfY2xrX2luaXQoZGV2LCBwcml2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKKwl1bmlwaGllcl9pMmNfaHdfaW5pdChwcml2LCBidXNfc3BlZWQsIGNsa19yYXRlKTsKIAogCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsIHVuaXBoaWVyX2kyY19pbnRlcnJ1cHQsIDAsIHBkZXYtPm5hbWUsCiAJCQkgICAgICAgcHJpdik7CkBAIC00MDcsMTEgKzM5Niw2IEBACiAJfQogCiAJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZwcml2LT5hZGFwKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFkZCBJMkMgYWRhcHRlclxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQogZXJyOgogCWlmIChyZXQpCiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy13bXQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtd210LmMKaW5kZXggZTFlM2E4NS4uZmJkMGZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy13bXQuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXdtdC5jCkBAIC00MzIsMTAgKzQzMiw4IEBACiAJfQogCiAJZXJyID0gaTJjX2FkZF9hZGFwdGVyKGFkYXApOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBhZGFwdGVyXG4iKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGkyY19kZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXhnZW5lLXNsaW1wcm8uYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGdlbmUtc2xpbXByby5jCmluZGV4IDQyMzNmNTYuLjI2MzY4NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGdlbmUtc2xpbXByby5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGdlbmUtc2xpbXByby5jCkBAIC00MTgsNyArNDE4LDYgQEAKIAlpMmNfc2V0X2FkYXBkYXRhKGFkYXB0ZXIsIGN0eCk7CiAJcmMgPSBpMmNfYWRkX2FkYXB0ZXIoYWRhcHRlcik7CiAJaWYgKHJjKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkFkYXB0ZXIgcmVnaXN0ZXJhdGlvbiBmYWlsZWRcbiIpOwogCQltYm94X2ZyZWVfY2hhbm5lbChjdHgtPm1ib3hfY2hhbik7CiAJCXJldHVybiByYzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXhpaWMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGlpYy5jCmluZGV4IDc0ZjU0ZjIuLjY2YmNlM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGlpYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGlpYy5jCkBAIC04MDQsNyArODA0LDYgQEAKIAkvKiBhZGQgaTJjIGFkYXB0ZXIgdG8gaTJjIHRyZWUgKi8KIAlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIoJmkyYy0+YWRhcCk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIGFkYXB0ZXJcbiIpOwogCQl4aWljX2RlaW5pdChpMmMpOwogCQlnb3RvIGVycl9jbGtfZGlzOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGxwOXh4LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXhscDl4eC5jCmluZGV4IDU1YTdiZWYuLjJhOTcyZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGxwOXh4LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy14bHA5eHguYwpAQCAtNDAwLDEwICs0MDAsOCBAQAogCWkyY19zZXRfYWRhcGRhdGEoJnByaXYtPmFkYXB0ZXIsIHByaXYpOwogCiAJZXJyID0gaTJjX2FkZF9hZGFwdGVyKCZwcml2LT5hZGFwdGVyKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhZGQgSTJDIGFkYXB0ZXIhXG4iKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwogCWRldl9kYmcoJnBkZXYtPmRldiwgIkkyQyBidXM6JWQgYWRkZWRcbiIsIHByaXYtPmFkYXB0ZXIubnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy14bHIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMteGxyLmMKaW5kZXggNjEzYzNhNC4uMDk2OGY1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy14bHIuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXhsci5jCkBAIC00MzIsMTAgKzQzMiw4IEBACiAKIAlpMmNfc2V0X2FkYXBkYXRhKCZwcml2LT5hZGFwLCBwcml2KTsKIAlyZXQgPSBpMmNfYWRkX251bWJlcmVkX2FkYXB0ZXIoJnByaXYtPmFkYXApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnByaXYtPmFkYXAuZGV2LCAiRmFpbGVkIHRvIGFkZCBpMmMgYnVzLlxuIik7CisJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CiAJZGV2X2luZm8oJnByaXYtPmFkYXAuZGV2LCAiQWRkZWQgSTJDIEJ1cy5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKaW5kZXggZGEzYTAyZS4uOThmZmZhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC04OCw3ICs4OCw3IEBACiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19BQ1BJKQotc3RydWN0IGFjcGlfaTJjX2hhbmRsZXJfZGF0YSB7CitzdHJ1Y3QgaTJjX2FjcGlfaGFuZGxlcl9kYXRhIHsKIAlzdHJ1Y3QgYWNwaV9jb25uZWN0aW9uX2luZm8gaW5mbzsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CiB9OwpAQCAtMTAzLDE1ICsxMDMsMTggQEAKIAl9OwogfSBfX3BhY2tlZDsKIAotc3RydWN0IGFjcGlfaTJjX2xvb2t1cCB7CitzdHJ1Y3QgaTJjX2FjcGlfbG9va3VwIHsKIAlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm87CiAJYWNwaV9oYW5kbGUgYWRhcHRlcl9oYW5kbGU7CiAJYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZTsKKwlhY3BpX2hhbmRsZSBzZWFyY2hfaGFuZGxlOworCXUzMiBzcGVlZDsKKwl1MzIgbWluX3NwZWVkOwogfTsKIAotc3RhdGljIGludCBhY3BpX2kyY19maWxsX2luZm8oc3RydWN0IGFjcGlfcmVzb3VyY2UgKmFyZXMsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGkyY19hY3BpX2ZpbGxfaW5mbyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqYXJlcywgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9pMmNfbG9va3VwICpsb29rdXAgPSBkYXRhOworCXN0cnVjdCBpMmNfYWNwaV9sb29rdXAgKmxvb2t1cCA9IGRhdGE7CiAJc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvID0gbG9va3VwLT5pbmZvOwogCXN0cnVjdCBhY3BpX3Jlc291cmNlX2kyY19zZXJpYWxidXMgKnNiOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTEzMCwxOSArMTMzLDE4IEBACiAJCXJldHVybiAxOwogCiAJaW5mby0+YWRkciA9IHNiLT5zbGF2ZV9hZGRyZXNzOworCWxvb2t1cC0+c3BlZWQgPSBzYi0+Y29ubmVjdGlvbl9zcGVlZDsKIAlpZiAoc2ItPmFjY2Vzc19tb2RlID09IEFDUElfSTJDXzEwQklUX01PREUpCiAJCWluZm8tPmZsYWdzIHw9IEkyQ19DTElFTlRfVEVOOwogCiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9pMmNfZ2V0X2luZm8oc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LAotCQkJICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8sCi0JCQkgICAgIGFjcGlfaGFuZGxlICphZGFwdGVyX2hhbmRsZSkKK3N0YXRpYyBpbnQgaTJjX2FjcGlfZG9fbG9va3VwKHN0cnVjdCBhY3BpX2RldmljZSAqYWRldiwKKwkJCSAgICAgIHN0cnVjdCBpMmNfYWNwaV9sb29rdXAgKmxvb2t1cCkKIHsKKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8gPSBsb29rdXAtPmluZm87CiAJc3RydWN0IGxpc3RfaGVhZCByZXNvdXJjZV9saXN0OwotCXN0cnVjdCByZXNvdXJjZV9lbnRyeSAqZW50cnk7Ci0Jc3RydWN0IGFjcGlfaTJjX2xvb2t1cCBsb29rdXA7CiAJaW50IHJldDsKIAogCWlmIChhY3BpX2J1c19nZXRfc3RhdHVzKGFkZXYpIHx8ICFhZGV2LT5zdGF0dXMucHJlc2VudCB8fApAQCAtMTUwLDI0ICsxNTIsNTggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7Ci0JaW5mby0+Zndub2RlID0gYWNwaV9md25vZGVfaGFuZGxlKGFkZXYpOwotCi0JbWVtc2V0KCZsb29rdXAsIDAsIHNpemVvZihsb29rdXApKTsKLQlsb29rdXAuZGV2aWNlX2hhbmRsZSA9IGFjcGlfZGV2aWNlX2hhbmRsZShhZGV2KTsKLQlsb29rdXAuaW5mbyA9IGluZm87CisJbG9va3VwLT5kZXZpY2VfaGFuZGxlID0gYWNwaV9kZXZpY2VfaGFuZGxlKGFkZXYpOwogCiAJLyogTG9vayB1cCBmb3IgSTJjU2VyaWFsQnVzIHJlc291cmNlICovCiAJSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlX2xpc3QpOwogCXJldCA9IGFjcGlfZGV2X2dldF9yZXNvdXJjZXMoYWRldiwgJnJlc291cmNlX2xpc3QsCi0JCQkJICAgICBhY3BpX2kyY19maWxsX2luZm8sICZsb29rdXApOworCQkJCSAgICAgaTJjX2FjcGlfZmlsbF9pbmZvLCBsb29rdXApOwogCWFjcGlfZGV2X2ZyZWVfcmVzb3VyY2VfbGlzdCgmcmVzb3VyY2VfbGlzdCk7CiAKIAlpZiAocmV0IDwgMCB8fCAhaW5mby0+YWRkcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkqYWRhcHRlcl9oYW5kbGUgPSBsb29rdXAuYWRhcHRlcl9oYW5kbGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJjX2FjcGlfZ2V0X2luZm8oc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LAorCQkJICAgICBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm8sCisJCQkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICAgYWNwaV9oYW5kbGUgKmFkYXB0ZXJfaGFuZGxlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgcmVzb3VyY2VfbGlzdDsKKwlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKmVudHJ5OworCXN0cnVjdCBpMmNfYWNwaV9sb29rdXAgbG9va3VwOworCWludCByZXQ7CisKKwltZW1zZXQoJmxvb2t1cCwgMCwgc2l6ZW9mKGxvb2t1cCkpOworCWxvb2t1cC5pbmZvID0gaW5mbzsKKworCXJldCA9IGkyY19hY3BpX2RvX2xvb2t1cChhZGV2LCAmbG9va3VwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGFkYXB0ZXIpIHsKKwkJLyogVGhlIGFkYXB0ZXIgbXVzdCBtYXRjaCB0aGUgb25lIGluIEkyY1NlcmlhbEJ1cygpIGNvbm5lY3RvciAqLworCQlpZiAoQUNQSV9IQU5ETEUoJmFkYXB0ZXItPmRldikgIT0gbG9va3VwLmFkYXB0ZXJfaGFuZGxlKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlIHsKKwkJc3RydWN0IGFjcGlfZGV2aWNlICphZGFwdGVyX2FkZXY7CisKKwkJLyogVGhlIGFkYXB0ZXIgbXVzdCBiZSBwcmVzZW50ICovCisJCWlmIChhY3BpX2J1c19nZXRfZGV2aWNlKGxvb2t1cC5hZGFwdGVyX2hhbmRsZSwgJmFkYXB0ZXJfYWRldikpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKGFjcGlfYnVzX2dldF9zdGF0dXMoYWRhcHRlcl9hZGV2KSB8fAorCQkgICAgIWFkYXB0ZXJfYWRldi0+c3RhdHVzLnByZXNlbnQpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpbmZvLT5md25vZGUgPSBhY3BpX2Z3bm9kZV9oYW5kbGUoYWRldik7CisJaWYgKGFkYXB0ZXJfaGFuZGxlKQorCQkqYWRhcHRlcl9oYW5kbGUgPSBsb29rdXAuYWRhcHRlcl9oYW5kbGU7CiAKIAkvKiBUaGVuIGZpbGwgSVJRIG51bWJlciBpZiBhbnkgKi8KKwlJTklUX0xJU1RfSEVBRCgmcmVzb3VyY2VfbGlzdCk7CiAJcmV0ID0gYWNwaV9kZXZfZ2V0X3Jlc291cmNlcyhhZGV2LCAmcmVzb3VyY2VfbGlzdCwgTlVMTCwgTlVMTCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTg2LDcgKzIyMiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGFjcGlfaTJjX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsCitzdGF0aWMgdm9pZCBpMmNfYWNwaV9yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAogCQkJCSAgICAgc3RydWN0IGFjcGlfZGV2aWNlICphZGV2LAogCQkJCSAgICAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQogewpAQCAtMjAxLDM5ICsyMzcsMzUgQEAKIAl9CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX2kyY19hZGRfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGxldmVsLAorc3RhdGljIGFjcGlfc3RhdHVzIGkyY19hY3BpX2FkZF9kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbGV2ZWwsCiAJCQkJICAgICAgIHZvaWQgKmRhdGEsIHZvaWQgKipyZXR1cm5fdmFsdWUpCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gZGF0YTsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXY7Ci0JYWNwaV9oYW5kbGUgYWRhcHRlcl9oYW5kbGU7CiAJc3RydWN0IGkyY19ib2FyZF9pbmZvIGluZm87CiAKIAlpZiAoYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZhZGV2KSkKIAkJcmV0dXJuIEFFX09LOwogCi0JaWYgKGFjcGlfaTJjX2dldF9pbmZvKGFkZXYsICZpbmZvLCAmYWRhcHRlcl9oYW5kbGUpKQorCWlmIChpMmNfYWNwaV9nZXRfaW5mbyhhZGV2LCAmaW5mbywgYWRhcHRlciwgTlVMTCkpCiAJCXJldHVybiBBRV9PSzsKIAotCWlmIChhZGFwdGVyX2hhbmRsZSAhPSBBQ1BJX0hBTkRMRSgmYWRhcHRlci0+ZGV2KSkKLQkJcmV0dXJuIEFFX09LOwotCi0JYWNwaV9pMmNfcmVnaXN0ZXJfZGV2aWNlKGFkYXB0ZXIsIGFkZXYsICZpbmZvKTsKKwlpMmNfYWNwaV9yZWdpc3Rlcl9kZXZpY2UoYWRhcHRlciwgYWRldiwgJmluZm8pOwogCiAJcmV0dXJuIEFFX09LOwogfQogCi0jZGVmaW5lIEFDUElfSTJDX01BWF9TQ0FOX0RFUFRIIDMyCisjZGVmaW5lIEkyQ19BQ1BJX01BWF9TQ0FOX0RFUFRIIDMyCiAKIC8qKgotICogYWNwaV9pMmNfcmVnaXN0ZXJfZGV2aWNlcyAtIGVudW1lcmF0ZSBJMkMgc2xhdmUgZGV2aWNlcyBiZWhpbmQgYWRhcHRlcgorICogaTJjX2FjcGlfcmVnaXN0ZXJfZGV2aWNlcyAtIGVudW1lcmF0ZSBJMkMgc2xhdmUgZGV2aWNlcyBiZWhpbmQgYWRhcHRlcgogICogQGFkYXA6IHBvaW50ZXIgdG8gYWRhcHRlcgogICoKICAqIEVudW1lcmF0ZSBhbGwgSTJDIHNsYXZlIGRldmljZXMgYmVoaW5kIHRoaXMgYWRhcHRlciBieSB3YWxraW5nIHRoZSBBQ1BJCiAgKiBuYW1lc3BhY2UuIFdoZW4gYSBkZXZpY2UgaXMgZm91bmQgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgTGludXggZGV2aWNlCiAgKiBtb2RlbCBhbmQgYm91bmQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgQUNQSSBoYW5kbGUuCiAgKi8KLXN0YXRpYyB2b2lkIGFjcGlfaTJjX3JlZ2lzdGVyX2RldmljZXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQorc3RhdGljIHZvaWQgaTJjX2FjcGlfcmVnaXN0ZXJfZGV2aWNlcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCkBAIC0yNDEsMTQgKzI3Myw3MiBAQAogCQlyZXR1cm47CiAKIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCi0JCQkJICAgICBBQ1BJX0kyQ19NQVhfU0NBTl9ERVBUSCwKLQkJCQkgICAgIGFjcGlfaTJjX2FkZF9kZXZpY2UsIE5VTEwsCisJCQkJICAgICBJMkNfQUNQSV9NQVhfU0NBTl9ERVBUSCwKKwkJCQkgICAgIGkyY19hY3BpX2FkZF9kZXZpY2UsIE5VTEwsCiAJCQkJICAgICBhZGFwLCBOVUxMKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCWRldl93YXJuKCZhZGFwLT5kZXYsICJmYWlsZWQgdG8gZW51bWVyYXRlIEkyQyBzbGF2ZXNcbiIpOwogfQogCi1zdGF0aWMgaW50IGFjcGlfaTJjX21hdGNoX2FkYXB0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQorc3RhdGljIGFjcGlfc3RhdHVzIGkyY19hY3BpX2xvb2t1cF9zcGVlZChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsZXZlbCwKKwkJCQkJICAgdm9pZCAqZGF0YSwgdm9pZCAqKnJldHVybl92YWx1ZSkKK3sKKwlzdHJ1Y3QgaTJjX2FjcGlfbG9va3VwICpsb29rdXAgPSBkYXRhOworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldjsKKworCWlmIChhY3BpX2J1c19nZXRfZGV2aWNlKGhhbmRsZSwgJmFkZXYpKQorCQlyZXR1cm4gQUVfT0s7CisKKwlpZiAoaTJjX2FjcGlfZG9fbG9va3VwKGFkZXYsIGxvb2t1cCkpCisJCXJldHVybiBBRV9PSzsKKworCWlmIChsb29rdXAtPnNlYXJjaF9oYW5kbGUgIT0gbG9va3VwLT5hZGFwdGVyX2hhbmRsZSkKKwkJcmV0dXJuIEFFX09LOworCisJaWYgKGxvb2t1cC0+c3BlZWQgPD0gbG9va3VwLT5taW5fc3BlZWQpCisJCWxvb2t1cC0+bWluX3NwZWVkID0gbG9va3VwLT5zcGVlZDsKKworCXJldHVybiBBRV9PSzsKK30KKworLyoqCisgKiBpMmNfYWNwaV9maW5kX2J1c19zcGVlZCAtIGZpbmQgSTJDIGJ1cyBzcGVlZCBmcm9tIEFDUEkKKyAqIEBkZXY6IFRoZSBkZXZpY2Ugb3duaW5nIHRoZSBidXMKKyAqCisgKiBGaW5kIHRoZSBJMkMgYnVzIHNwZWVkIGJ5IHdhbGtpbmcgdGhlIEFDUEkgbmFtZXNwYWNlIGZvciBhbGwgSTJDIHNsYXZlcworICogZGV2aWNlcyBjb25uZWN0ZWQgdG8gdGhpcyBidXMgYW5kIHVzZSB0aGUgc3BlZWQgb2Ygc2xvd2VzdCBkZXZpY2UuCisgKgorICogUmV0dXJucyB0aGUgc3BlZWQgaW4gSHogb3IgemVybworICovCit1MzIgaTJjX2FjcGlfZmluZF9idXNfc3BlZWQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfYWNwaV9sb29rdXAgbG9va3VwOworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyBkdW1teTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlpZiAoIWhhc19hY3BpX2NvbXBhbmlvbihkZXYpKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCgmbG9va3VwLCAwLCBzaXplb2YobG9va3VwKSk7CisJbG9va3VwLnNlYXJjaF9oYW5kbGUgPSBBQ1BJX0hBTkRMRShkZXYpOworCWxvb2t1cC5taW5fc3BlZWQgPSBVSU5UX01BWDsKKwlsb29rdXAuaW5mbyA9ICZkdW1teTsKKworCXN0YXR1cyA9IGFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0RFVklDRSwgQUNQSV9ST09UX09CSkVDVCwKKwkJCQkgICAgIEkyQ19BQ1BJX01BWF9TQ0FOX0RFUFRILAorCQkJCSAgICAgaTJjX2FjcGlfbG9va3VwX3NwZWVkLCBOVUxMLAorCQkJCSAgICAgJmxvb2t1cCwgTlVMTCk7CisKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZGV2X3dhcm4oZGV2LCAidW5hYmxlIHRvIGZpbmQgSTJDIGJ1cyBzcGVlZCBmcm9tIEFDUElcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gbG9va3VwLm1pbl9zcGVlZCAhPSBVSU5UX01BWCA/IGxvb2t1cC5taW5fc3BlZWQgOiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaTJjX2FjcGlfZmluZF9idXNfc3BlZWQpOworCitzdGF0aWMgaW50IGkyY19hY3BpX21hdGNoX2FkYXB0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGkyY192ZXJpZnlfYWRhcHRlcihkZXYpOwogCkBAIC0yNTgsMjkgKzM0OCwyOSBAQAogCXJldHVybiBBQ1BJX0hBTkRMRShkZXYpID09IChhY3BpX2hhbmRsZSlkYXRhOwogfQogCi1zdGF0aWMgaW50IGFjcGlfaTJjX21hdGNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGkyY19hY3BpX21hdGNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJuIEFDUElfQ09NUEFOSU9OKGRldikgPT0gZGF0YTsKIH0KIAotc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciAqYWNwaV9pMmNfZmluZF9hZGFwdGVyX2J5X2hhbmRsZShhY3BpX2hhbmRsZSBoYW5kbGUpCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWNwaV9maW5kX2FkYXB0ZXJfYnlfaGFuZGxlKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKIAlkZXYgPSBidXNfZmluZF9kZXZpY2UoJmkyY19idXNfdHlwZSwgTlVMTCwgaGFuZGxlLAotCQkJICAgICAgYWNwaV9pMmNfbWF0Y2hfYWRhcHRlcik7CisJCQkgICAgICBpMmNfYWNwaV9tYXRjaF9hZGFwdGVyKTsKIAlyZXR1cm4gZGV2ID8gaTJjX3ZlcmlmeV9hZGFwdGVyKGRldikgOiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKmFjcGlfaTJjX2ZpbmRfY2xpZW50X2J5X2FkZXYoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KQorc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50ICppMmNfYWNwaV9maW5kX2NsaWVudF9ieV9hZGV2KHN0cnVjdCBhY3BpX2RldmljZSAqYWRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKLQlkZXYgPSBidXNfZmluZF9kZXZpY2UoJmkyY19idXNfdHlwZSwgTlVMTCwgYWRldiwgYWNwaV9pMmNfbWF0Y2hfZGV2aWNlKTsKKwlkZXYgPSBidXNfZmluZF9kZXZpY2UoJmkyY19idXNfdHlwZSwgTlVMTCwgYWRldiwgaTJjX2FjcGlfbWF0Y2hfZGV2aWNlKTsKIAlyZXR1cm4gZGV2ID8gaTJjX3ZlcmlmeV9jbGllbnQoZGV2KSA6IE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgYWNwaV9pMmNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsdWUsCitzdGF0aWMgaW50IGkyY19hY3BpX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIHZhbHVlLAogCQkJICAgdm9pZCAqYXJnKQogewogCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IGFyZzsKQEAgLTI5MSwyMCArMzgxLDIwIEBACiAKIAlzd2l0Y2ggKHZhbHVlKSB7CiAJY2FzZSBBQ1BJX1JFQ09ORklHX0RFVklDRV9BREQ6Ci0JCWlmIChhY3BpX2kyY19nZXRfaW5mbyhhZGV2LCAmaW5mbywgJmFkYXB0ZXJfaGFuZGxlKSkKKwkJaWYgKGkyY19hY3BpX2dldF9pbmZvKGFkZXYsICZpbmZvLCBOVUxMLCAmYWRhcHRlcl9oYW5kbGUpKQogCQkJYnJlYWs7CiAKLQkJYWRhcHRlciA9IGFjcGlfaTJjX2ZpbmRfYWRhcHRlcl9ieV9oYW5kbGUoYWRhcHRlcl9oYW5kbGUpOworCQlhZGFwdGVyID0gaTJjX2FjcGlfZmluZF9hZGFwdGVyX2J5X2hhbmRsZShhZGFwdGVyX2hhbmRsZSk7CiAJCWlmICghYWRhcHRlcikKIAkJCWJyZWFrOwogCi0JCWFjcGlfaTJjX3JlZ2lzdGVyX2RldmljZShhZGFwdGVyLCBhZGV2LCAmaW5mbyk7CisJCWkyY19hY3BpX3JlZ2lzdGVyX2RldmljZShhZGFwdGVyLCBhZGV2LCAmaW5mbyk7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9SRUNPTkZJR19ERVZJQ0VfUkVNT1ZFOgogCQlpZiAoIWFjcGlfZGV2aWNlX2VudW1lcmF0ZWQoYWRldikpCiAJCQlicmVhazsKIAotCQljbGllbnQgPSBhY3BpX2kyY19maW5kX2NsaWVudF9ieV9hZGV2KGFkZXYpOworCQljbGllbnQgPSBpMmNfYWNwaV9maW5kX2NsaWVudF9ieV9hZGV2KGFkZXYpOwogCQlpZiAoIWNsaWVudCkKIAkJCWJyZWFrOwogCkBAIC0zMTcsMTAgKzQwNywxMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGkyY19hY3BpX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gYWNwaV9pMmNfbm90aWZ5LAorCS5ub3RpZmllcl9jYWxsID0gaTJjX2FjcGlfbm90aWZ5LAogfTsKICNlbHNlIC8qIENPTkZJR19BQ1BJICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9pMmNfcmVnaXN0ZXJfZGV2aWNlcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGkyY19hY3BpX3JlZ2lzdGVyX2RldmljZXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKSB7IH0KIGV4dGVybiBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaTJjX2FjcGlfbm90aWZpZXI7CiAjZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KIApAQCAtMzg2LDEyICs0NzYsMTIgQEAKIH0KIAogc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX2kyY19zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGNvbW1hbmQsCitpMmNfYWNwaV9zcGFjZV9oYW5kbGVyKHUzMiBmdW5jdGlvbiwgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGNvbW1hbmQsCiAJCQl1MzIgYml0cywgdTY0ICp2YWx1ZTY0LAogCQkJdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKIHsKIAlzdHJ1Y3QgZ3NiX2J1ZmZlciAqZ3NiID0gKHN0cnVjdCBnc2JfYnVmZmVyICopdmFsdWU2NDsKLQlzdHJ1Y3QgYWNwaV9pMmNfaGFuZGxlcl9kYXRhICpkYXRhID0gaGFuZGxlcl9jb250ZXh0OworCXN0cnVjdCBpMmNfYWNwaV9oYW5kbGVyX2RhdGEgKmRhdGEgPSBoYW5kbGVyX2NvbnRleHQ7CiAJc3RydWN0IGFjcGlfY29ubmVjdGlvbl9pbmZvICppbmZvID0gJmRhdGEtPmluZm87CiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfaTJjX3NlcmlhbGJ1cyAqc2I7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gZGF0YS0+YWRhcHRlcjsKQEAgLTUxMCwxMCArNjAwLDEwIEBACiB9CiAKIAotc3RhdGljIGludCBhY3BpX2kyY19pbnN0YWxsX3NwYWNlX2hhbmRsZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGludCBpMmNfYWNwaV9pbnN0YWxsX3NwYWNlX2hhbmRsZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewogCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9pMmNfaGFuZGxlcl9kYXRhICpkYXRhOworCXN0cnVjdCBpMmNfYWNwaV9oYW5kbGVyX2RhdGEgKmRhdGE7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJaWYgKCFhZGFwdGVyLT5kZXYucGFyZW50KQpAQCAtNTI0LDcgKzYxNCw3IEBACiAJaWYgKCFoYW5kbGUpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX2kyY19oYW5kbGVyX2RhdGEpLAorCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2FjcGlfaGFuZGxlcl9kYXRhKSwKIAkJCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTM4LDcgKzYyOCw3IEBACiAKIAlzdGF0dXMgPSBhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKGhhbmRsZSwKIAkJCQlBQ1BJX0FEUl9TUEFDRV9HU0JVUywKLQkJCQkmYWNwaV9pMmNfc3BhY2VfaGFuZGxlciwKKwkJCQkmaTJjX2FjcGlfc3BhY2VfaGFuZGxlciwKIAkJCQlOVUxMLAogCQkJCWRhdGEpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtNTUyLDEwICs2NDIsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYWNwaV9pMmNfcmVtb3ZlX3NwYWNlX2hhbmRsZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgaTJjX2FjcGlfcmVtb3ZlX3NwYWNlX2hhbmRsZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewogCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9pMmNfaGFuZGxlcl9kYXRhICpkYXRhOworCXN0cnVjdCBpMmNfYWNwaV9oYW5kbGVyX2RhdGEgKmRhdGE7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCiAJaWYgKCFhZGFwdGVyLT5kZXYucGFyZW50KQpAQCAtNTY4LDcgKzY1OCw3IEBACiAKIAlhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoaGFuZGxlLAogCQkJCUFDUElfQURSX1NQQUNFX0dTQlVTLAotCQkJCSZhY3BpX2kyY19zcGFjZV9oYW5kbGVyKTsKKwkJCQkmaTJjX2FjcGlfc3BhY2VfaGFuZGxlcik7CiAKIAlzdGF0dXMgPSBhY3BpX2J1c19nZXRfcHJpdmF0ZV9kYXRhKGhhbmRsZSwgKHZvaWQgKiopJmRhdGEpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKQEAgLTU3NywxMCArNjY3LDEwIEBACiAJYWNwaV9idXNfZGV0YWNoX3ByaXZhdGVfZGF0YShoYW5kbGUpOwogfQogI2Vsc2UgLyogQ09ORklHX0FDUElfSTJDX09QUkVHSU9OICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9pMmNfcmVtb3ZlX3NwYWNlX2hhbmRsZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGlubGluZSB2b2lkIGkyY19hY3BpX3JlbW92ZV9zcGFjZV9oYW5kbGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsgfQogCi1zdGF0aWMgaW5saW5lIGludCBhY3BpX2kyY19pbnN0YWxsX3NwYWNlX2hhbmRsZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGlubGluZSBpbnQgaTJjX2FjcGlfaW5zdGFsbF9zcGFjZV9oYW5kbGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKIHsgcmV0dXJuIDA7IH0KICNlbmRpZiAvKiBDT05GSUdfQUNQSV9JMkNfT1BSRUdJT04gKi8KIApAQCAtODUzLDcgKzk0Myw3IEBACiAJCQlzdGF0dXMgPSAwOwogCiAJCWlmIChzdGF0dXMpCi0JCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gc2V0IHVwIHdha2V1cCBpcnEiKTsKKwkJCWRldl93YXJuKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byBzZXQgdXAgd2FrZXVwIGlycVxuIik7CiAJfQogCiAJZGV2X2RiZyhkZXYsICJwcm9iZVxuIik7CkBAIC0xMjA4LDggKzEyOTgsOSBAQAogCXJldHVybiBjbGllbnQ7CiAKIG91dF9lcnI6Ci0JZGV2X2VycigmYWRhcC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGkyYyBjbGllbnQgJXMgYXQgMHglMDJ4ICIKLQkJIiglZClcbiIsIGNsaWVudC0+bmFtZSwgY2xpZW50LT5hZGRyLCBzdGF0dXMpOworCWRldl9lcnIoJmFkYXAtPmRldiwKKwkJIkZhaWxlZCB0byByZWdpc3RlciBpMmMgY2xpZW50ICVzIGF0IDB4JTAyeCAoJWQpXG4iLAorCQljbGllbnQtPm5hbWUsIGNsaWVudC0+YWRkciwgc3RhdHVzKTsKIG91dF9lcnJfc2lsZW50OgogCWtmcmVlKGNsaWVudCk7CiAJcmV0dXJuIE5VTEw7CkBAIC0xMzM1LDIxICsxNDI2LDE5IEBACiAJY29tcGxldGUoJmFkYXAtPmRldl9yZWxlYXNlZCk7CiB9CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIGZvciBtdXRleF9sb2NrX25lc3RlZCwgc28gaXQgaXMgbmV2ZXIKLSAqIGNhbGxlZCB1bmxlc3MgbG9ja2luZyBjb3JyZWN0bmVzcyBjaGVja2luZyBpcyBlbmFibGVkLiBUaHVzIHdlCi0gKiBtYWtlIGl0IGlubGluZSB0byBhdm9pZCBhIGNvbXBpbGVyIHdhcm5pbmcuIFRoYXQncyB3aGF0IGdjYyBlbmRzIHVwCi0gKiBkb2luZyBhbnl3YXkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGkyY19hZGFwdGVyX2RlcHRoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3Vuc2lnbmVkIGludCBpMmNfYWRhcHRlcl9kZXB0aChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdW5zaWduZWQgaW50IGRlcHRoID0gMDsKIAogCXdoaWxlICgoYWRhcHRlciA9IGkyY19wYXJlbnRfaXNfaTJjX2FkYXB0ZXIoYWRhcHRlcikpKQogCQlkZXB0aCsrOwogCisJV0FSTl9PTkNFKGRlcHRoID49IE1BWF9MT0NLREVQX1NVQkNMQVNTRVMsCisJCSAgImFkYXB0ZXIgZGVwdGggZXhjZWVkcyBsb2NrZGVwIHN1YmNsYXNzIGxpbWl0XG4iKTsKKwogCXJldHVybiBkZXB0aDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGkyY19hZGFwdGVyX2RlcHRoKTsKIAogLyoKICAqIExldCB1c2VycyBpbnN0YW50aWF0ZSBJMkMgZGV2aWNlcyB0aHJvdWdoIHN5c2ZzLiBUaGlzIGNhbiBiZSB1c2VkIHdoZW4KQEAgLTE2NzgsOCArMTc2Nyw4IEBACiAJaWYgKGRyaXZlci0+YXR0YWNoX2FkYXB0ZXIpIHsKIAkJZGV2X3dhcm4oJmFkYXAtPmRldiwgIiVzOiBhdHRhY2hfYWRhcHRlciBtZXRob2QgaXMgZGVwcmVjYXRlZFxuIiwKIAkJCSBkcml2ZXItPmRyaXZlci5uYW1lKTsKLQkJZGV2X3dhcm4oJmFkYXAtPmRldiwgIlBsZWFzZSB1c2UgYW5vdGhlciB3YXkgdG8gaW5zdGFudGlhdGUgIgotCQkJICJ5b3VyIGkyY19jbGllbnRcbiIpOworCQlkZXZfd2FybigmYWRhcC0+ZGV2LAorCQkJICJQbGVhc2UgdXNlIGFub3RoZXIgd2F5IHRvIGluc3RhbnRpYXRlIHlvdXIgaTJjX2NsaWVudFxuIik7CiAJCS8qIFdlIGlnbm9yZSB0aGUgcmV0dXJuIGNvZGU7IGlmIGl0IGZhaWxzLCB0b28gYmFkICovCiAJCWRyaXZlci0+YXR0YWNoX2FkYXB0ZXIoYWRhcCk7CiAJfQpAQCAtMTY5MSw2ICsxNzgwLDEyIEBACiAJcmV0dXJuIGkyY19kb19hZGRfYWRhcHRlcih0b19pMmNfZHJpdmVyKGQpLCBkYXRhKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfbG9ja19vcGVyYXRpb25zIGkyY19hZGFwdGVyX2xvY2tfb3BzID0geworCS5sb2NrX2J1cyA9ICAgIGkyY19hZGFwdGVyX2xvY2tfYnVzLAorCS50cnlsb2NrX2J1cyA9IGkyY19hZGFwdGVyX3RyeWxvY2tfYnVzLAorCS51bmxvY2tfYnVzID0gIGkyY19hZGFwdGVyX3VubG9ja19idXMsCit9OworCiBzdGF0aWMgaW50IGkyY19yZWdpc3Rlcl9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKIHsKIAlpbnQgcmVzID0gLUVJTlZBTDsKQEAgLTE3MTAsMTEgKzE4MDUsOCBAQAogCQlnb3RvIG91dF9saXN0OwogCX0KIAotCWlmICghYWRhcC0+bG9ja19idXMpIHsKLQkJYWRhcC0+bG9ja19idXMgPSBpMmNfYWRhcHRlcl9sb2NrX2J1czsKLQkJYWRhcC0+dHJ5bG9ja19idXMgPSBpMmNfYWRhcHRlcl90cnlsb2NrX2J1czsKLQkJYWRhcC0+dW5sb2NrX2J1cyA9IGkyY19hZGFwdGVyX3VubG9ja19idXM7Ci0JfQorCWlmICghYWRhcC0+bG9ja19vcHMpCisJCWFkYXAtPmxvY2tfb3BzID0gJmkyY19hZGFwdGVyX2xvY2tfb3BzOwogCiAJcnRfbXV0ZXhfaW5pdCgmYWRhcC0+YnVzX2xvY2spOwogCXJ0X211dGV4X2luaXQoJmFkYXAtPm11eF9sb2NrKTsKQEAgLTE3NTIsOCArMTg0NCw4IEBACiAKIAkvKiBjcmVhdGUgcHJlLWRlY2xhcmVkIGRldmljZSBub2RlcyAqLwogCW9mX2kyY19yZWdpc3Rlcl9kZXZpY2VzKGFkYXApOwotCWFjcGlfaTJjX3JlZ2lzdGVyX2RldmljZXMoYWRhcCk7Ci0JYWNwaV9pMmNfaW5zdGFsbF9zcGFjZV9oYW5kbGVyKGFkYXApOworCWkyY19hY3BpX3JlZ2lzdGVyX2RldmljZXMoYWRhcCk7CisJaTJjX2FjcGlfaW5zdGFsbF9zcGFjZV9oYW5kbGVyKGFkYXApOwogCiAJaWYgKGFkYXAtPm5yIDwgX19pMmNfZmlyc3RfZHluYW1pY19idXNfbnVtKQogCQlpMmNfc2Nhbl9zdGF0aWNfYm9hcmRfaW5mbyhhZGFwKTsKQEAgLTE5MjUsNyArMjAxNyw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlhY3BpX2kyY19yZW1vdmVfc3BhY2VfaGFuZGxlcihhZGFwKTsKKwlpMmNfYWNwaV9yZW1vdmVfc3BhY2VfaGFuZGxlcihhZGFwKTsKIAkvKiBUZWxsIGRyaXZlcnMgYWJvdXQgdGhpcyByZW1vdmFsICovCiAJbXV0ZXhfbG9jaygmY29yZV9sb2NrKTsKIAlidXNfZm9yX2VhY2hfZHJ2KCZpMmNfYnVzX3R5cGUsIE5VTEwsIGFkYXAsCkBAIC0yNDUxLDE1ICsyNTQzLDE2IEBACiAJaWYgKGFkYXAtPmFsZ28tPm1hc3Rlcl94ZmVyKSB7CiAjaWZkZWYgREVCVUcKIAkJZm9yIChyZXQgPSAwOyByZXQgPCBudW07IHJldCsrKSB7Ci0JCQlkZXZfZGJnKCZhZGFwLT5kZXYsICJtYXN0ZXJfeGZlclslZF0gJWMsIGFkZHI9MHglMDJ4LCAiCi0JCQkJImxlbj0lZCVzXG4iLCByZXQsIChtc2dzW3JldF0uZmxhZ3MgJiBJMkNfTV9SRCkKLQkJCQk/ICdSJyA6ICdXJywgbXNnc1tyZXRdLmFkZHIsIG1zZ3NbcmV0XS5sZW4sCisJCQlkZXZfZGJnKCZhZGFwLT5kZXYsCisJCQkJIm1hc3Rlcl94ZmVyWyVkXSAlYywgYWRkcj0weCUwMngsIGxlbj0lZCVzXG4iLAorCQkJCXJldCwgKG1zZ3NbcmV0XS5mbGFncyAmIEkyQ19NX1JEKSA/ICdSJyA6ICdXJywKKwkJCQltc2dzW3JldF0uYWRkciwgbXNnc1tyZXRdLmxlbiwKIAkJCQkobXNnc1tyZXRdLmZsYWdzICYgSTJDX01fUkVDVl9MRU4pID8gIisiIDogIiIpOwogCQl9CiAjZW5kaWYKIAogCQlpZiAoaW5fYXRvbWljKCkgfHwgaXJxc19kaXNhYmxlZCgpKSB7Ci0JCQlyZXQgPSBhZGFwLT50cnlsb2NrX2J1cyhhZGFwLCBJMkNfTE9DS19TRUdNRU5UKTsKKwkJCXJldCA9IGkyY190cnlsb2NrX2J1cyhhZGFwLCBJMkNfTE9DS19TRUdNRU5UKTsKIAkJCWlmICghcmV0KQogCQkJCS8qIEkyQyBhY3Rpdml0eSBpcyBvbmdvaW5nLiAqLwogCQkJCXJldHVybiAtRUFHQUlOOwpAQCAtMjYxOSw5ICsyNzEyLDkgQEAKIAogCS8qIENvbnNpc3RlbmN5IGNoZWNrICovCiAJaWYgKGluZm8udHlwZVswXSA9PSAnXDAnKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPmRldiwgIiVzIGRldGVjdGlvbiBmdW5jdGlvbiBwcm92aWRlZCAiCi0JCQkibm8gbmFtZSBmb3IgMHgleFxuIiwgZHJpdmVyLT5kcml2ZXIubmFtZSwKLQkJCWFkZHIpOworCQlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsCisJCQkiJXMgZGV0ZWN0aW9uIGZ1bmN0aW9uIHByb3ZpZGVkIG5vIG5hbWUgZm9yIDB4JXhcbiIsCisJCQlkcml2ZXItPmRyaXZlci5uYW1lLCBhZGRyKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCkBAIC0yNjU5LDkgKzI3NTIsOCBAQAogCS8qIFdhcm4gdGhhdCB0aGUgYWRhcHRlciBsb3N0IGNsYXNzIGJhc2VkIGluc3RhbnRpYXRpb24gKi8KIAlpZiAoYWRhcHRlci0+Y2xhc3MgPT0gSTJDX0NMQVNTX0RFUFJFQ0FURUQpIHsKIAkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAotCQkJIlRoaXMgYWRhcHRlciBkcm9wcGVkIHN1cHBvcnQgZm9yIEkyQyBjbGFzc2VzIGFuZCAiCi0JCQkid29uJ3QgYXV0by1kZXRlY3QgJXMgZGV2aWNlcyBhbnltb3JlLiBJZiB5b3UgbmVlZCBpdCwgY2hlY2sgIgotCQkJIidEb2N1bWVudGF0aW9uL2kyYy9pbnN0YW50aWF0aW5nLWRldmljZXMnIGZvciBhbHRlcm5hdGl2ZXMuXG4iLAorCQkJIlRoaXMgYWRhcHRlciBkcm9wcGVkIHN1cHBvcnQgZm9yIEkyQyBjbGFzc2VzIGFuZCB3b24ndCBhdXRvLWRldGVjdCAlcyBkZXZpY2VzIGFueW1vcmUuICIKKwkJCSJJZiB5b3UgbmVlZCBpdCwgY2hlY2sgJ0RvY3VtZW50YXRpb24vaTJjL2luc3RhbnRpYXRpbmctZGV2aWNlcycgZm9yIGFsdGVybmF0aXZlcy5cbiIsCiAJCQlkcml2ZXItPmRyaXZlci5uYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMjY3Nyw4ICsyNzY5LDkgQEAKIAl0ZW1wX2NsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CiAKIAlmb3IgKGkgPSAwOyBhZGRyZXNzX2xpc3RbaV0gIT0gSTJDX0NMSUVOVF9FTkQ7IGkgKz0gMSkgewotCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJmb3VuZCBub3JtYWwgZW50cnkgZm9yIGFkYXB0ZXIgJWQsICIKLQkJCSJhZGRyIDB4JTAyeFxuIiwgYWRhcF9pZCwgYWRkcmVzc19saXN0W2ldKTsKKwkJZGV2X2RiZygmYWRhcHRlci0+ZGV2LAorCQkJImZvdW5kIG5vcm1hbCBlbnRyeSBmb3IgYWRhcHRlciAlZCwgYWRkciAweCUwMnhcbiIsCisJCQlhZGFwX2lkLCBhZGRyZXNzX2xpc3RbaV0pOwogCQl0ZW1wX2NsaWVudC0+YWRkciA9IGFkZHJlc3NfbGlzdFtpXTsKIAkJZXJyID0gaTJjX2RldGVjdF9hZGRyZXNzKHRlbXBfY2xpZW50LCBkcml2ZXIpOwogCQlpZiAodW5saWtlbHkoZXJyKSkKQEAgLTI3MTAsMTUgKzI4MDMsMTYgQEAKIAlmb3IgKGkgPSAwOyBhZGRyX2xpc3RbaV0gIT0gSTJDX0NMSUVOVF9FTkQ7IGkrKykgewogCQkvKiBDaGVjayBhZGRyZXNzIHZhbGlkaXR5ICovCiAJCWlmIChpMmNfY2hlY2tfN2JpdF9hZGRyX3ZhbGlkaXR5X3N0cmljdChhZGRyX2xpc3RbaV0pIDwgMCkgewotCQkJZGV2X3dhcm4oJmFkYXAtPmRldiwgIkludmFsaWQgNy1iaXQgYWRkcmVzcyAiCi0JCQkJICIweCUwMnhcbiIsIGFkZHJfbGlzdFtpXSk7CisJCQlkZXZfd2FybigmYWRhcC0+ZGV2LCAiSW52YWxpZCA3LWJpdCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJCQkgYWRkcl9saXN0W2ldKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJLyogQ2hlY2sgYWRkcmVzcyBhdmFpbGFiaWxpdHkgKDcgYml0LCBubyBuZWVkIHRvIGVuY29kZSBmbGFncykgKi8KIAkJaWYgKGkyY19jaGVja19hZGRyX2J1c3koYWRhcCwgYWRkcl9saXN0W2ldKSkgewotCQkJZGV2X2RiZygmYWRhcC0+ZGV2LCAiQWRkcmVzcyAweCUwMnggYWxyZWFkeSBpbiAiCi0JCQkJInVzZSwgbm90IHByb2JpbmdcbiIsIGFkZHJfbGlzdFtpXSk7CisJCQlkZXZfZGJnKCZhZGFwLT5kZXYsCisJCQkJIkFkZHJlc3MgMHglMDJ4IGFscmVhZHkgaW4gdXNlLCBub3QgcHJvYmluZ1xuIiwKKwkJCQlhZGRyX2xpc3RbaV0pOwogCQkJY29udGludWU7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLW11eC5jIGIvZHJpdmVycy9pMmMvaTJjLW11eC5jCmluZGV4IDhlZWU5ODYuLjgzNzY4ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2kyYy1tdXguYworKysgYi9kcml2ZXJzL2kyYy9pMmMtbXV4LmMKQEAgLTE1OSw3ICsxNTksNyBAQAogCQlyZXR1cm4gMDsJLyogbXV4X2xvY2sgbm90IGxvY2tlZCwgZmFpbHVyZSAqLwogCWlmICghKGZsYWdzICYgSTJDX0xPQ0tfUk9PVF9BREFQVEVSKSkKIAkJcmV0dXJuIDE7CS8qIHdlIG9ubHkgd2FudCBtdXhfbG9jaywgc3VjY2VzcyAqLwotCWlmIChwYXJlbnQtPnRyeWxvY2tfYnVzKHBhcmVudCwgZmxhZ3MpKQorCWlmIChpMmNfdHJ5bG9ja19idXMocGFyZW50LCBmbGFncykpCiAJCXJldHVybiAxOwkvKiBwYXJlbnQgbG9ja2VkIHRvbywgc3VjY2VzcyAqLwogCXJ0X211dGV4X3VubG9jaygmcGFyZW50LT5tdXhfbG9jayk7CiAJcmV0dXJuIDA7CQkvKiBwYXJlbnQgbm90IGxvY2tlZCwgZmFpbHVyZSAqLwpAQCAtMTkzLDcgKzE5Myw3IEBACiAKIAlpZiAoIXJ0X211dGV4X3RyeWxvY2soJnBhcmVudC0+bXV4X2xvY2spKQogCQlyZXR1cm4gMDsJLyogbXV4X2xvY2sgbm90IGxvY2tlZCwgZmFpbHVyZSAqLwotCWlmIChwYXJlbnQtPnRyeWxvY2tfYnVzKHBhcmVudCwgZmxhZ3MpKQorCWlmIChpMmNfdHJ5bG9ja19idXMocGFyZW50LCBmbGFncykpCiAJCXJldHVybiAxOwkvKiBwYXJlbnQgbG9ja2VkIHRvbywgc3VjY2VzcyAqLwogCXJ0X211dGV4X3VubG9jaygmcGFyZW50LT5tdXhfbG9jayk7CiAJcmV0dXJuIDA7CQkvKiBwYXJlbnQgbm90IGxvY2tlZCwgZmFpbHVyZSAqLwpAQCAtMjU1LDYgKzI1NSwxMCBAQAogCW11eGMtPmRldiA9IGRldjsKIAlpZiAoZmxhZ3MgJiBJMkNfTVVYX0xPQ0tFRCkKIAkJbXV4Yy0+bXV4X2xvY2tlZCA9IHRydWU7CisJaWYgKGZsYWdzICYgSTJDX01VWF9BUkJJVFJBVE9SKQorCQltdXhjLT5hcmJpdHJhdG9yID0gdHJ1ZTsKKwlpZiAoZmxhZ3MgJiBJMkNfTVVYX0dBVEUpCisJCW11eGMtPmdhdGUgPSB0cnVlOwogCW11eGMtPnNlbGVjdCA9IHNlbGVjdDsKIAltdXhjLT5kZXNlbGVjdCA9IGRlc2VsZWN0OwogCW11eGMtPm1heF9hZGFwdGVycyA9IG1heF9hZGFwdGVyczsKQEAgLTI2Myw2ICsyNjcsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGkyY19tdXhfYWxsb2MpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19sb2NrX29wZXJhdGlvbnMgaTJjX211eF9sb2NrX29wcyA9IHsKKwkubG9ja19idXMgPSAgICBpMmNfbXV4X2xvY2tfYnVzLAorCS50cnlsb2NrX2J1cyA9IGkyY19tdXhfdHJ5bG9ja19idXMsCisJLnVubG9ja19idXMgPSAgaTJjX211eF91bmxvY2tfYnVzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfbG9ja19vcGVyYXRpb25zIGkyY19wYXJlbnRfbG9ja19vcHMgPSB7CisJLmxvY2tfYnVzID0gICAgaTJjX3BhcmVudF9sb2NrX2J1cywKKwkudHJ5bG9ja19idXMgPSBpMmNfcGFyZW50X3RyeWxvY2tfYnVzLAorCS51bmxvY2tfYnVzID0gIGkyY19wYXJlbnRfdW5sb2NrX2J1cywKK307CisKIGludCBpMmNfbXV4X2FkZF9hZGFwdGVyKHN0cnVjdCBpMmNfbXV4X2NvcmUgKm11eGMsCiAJCQl1MzIgZm9yY2VfbnIsIHUzMiBjaGFuX2lkLAogCQkJdW5zaWduZWQgaW50IGNsYXNzKQpAQCAtMzEyLDE1ICszMjgsMTAgQEAKIAlwcml2LT5hZGFwLnJldHJpZXMgPSBwYXJlbnQtPnJldHJpZXM7CiAJcHJpdi0+YWRhcC50aW1lb3V0ID0gcGFyZW50LT50aW1lb3V0OwogCXByaXYtPmFkYXAucXVpcmtzID0gcGFyZW50LT5xdWlya3M7Ci0JaWYgKG11eGMtPm11eF9sb2NrZWQpIHsKLQkJcHJpdi0+YWRhcC5sb2NrX2J1cyA9IGkyY19tdXhfbG9ja19idXM7Ci0JCXByaXYtPmFkYXAudHJ5bG9ja19idXMgPSBpMmNfbXV4X3RyeWxvY2tfYnVzOwotCQlwcml2LT5hZGFwLnVubG9ja19idXMgPSBpMmNfbXV4X3VubG9ja19idXM7Ci0JfSBlbHNlIHsKLQkJcHJpdi0+YWRhcC5sb2NrX2J1cyA9IGkyY19wYXJlbnRfbG9ja19idXM7Ci0JCXByaXYtPmFkYXAudHJ5bG9ja19idXMgPSBpMmNfcGFyZW50X3RyeWxvY2tfYnVzOwotCQlwcml2LT5hZGFwLnVubG9ja19idXMgPSBpMmNfcGFyZW50X3VubG9ja19idXM7Ci0JfQorCWlmIChtdXhjLT5tdXhfbG9ja2VkKQorCQlwcml2LT5hZGFwLmxvY2tfb3BzID0gJmkyY19tdXhfbG9ja19vcHM7CisJZWxzZQorCQlwcml2LT5hZGFwLmxvY2tfb3BzID0gJmkyY19wYXJlbnRfbG9ja19vcHM7CiAKIAkvKiBTYW5pdHkgY2hlY2sgb24gY2xhc3MgKi8KIAlpZiAoaTJjX211eF9wYXJlbnRfY2xhc3NlcyhwYXJlbnQpICYgY2xhc3MpCkBAIC0zMzUsMTggKzM0Niw0MiBAQAogCSAqIG5vdGhpbmcgaWYgIUNPTkZJR19PRi4KIAkgKi8KIAlpZiAobXV4Yy0+ZGV2LT5vZl9ub2RlKSB7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2X25vZGUgPSBtdXhjLT5kZXYtPm9mX25vZGU7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbXV4X25vZGUsICpjaGlsZCA9IE5VTEw7CiAJCXUzMiByZWc7CiAKLQkJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShtdXhjLT5kZXYtPm9mX25vZGUsIGNoaWxkKSB7Ci0JCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjaGlsZCwgInJlZyIsICZyZWcpOwotCQkJaWYgKHJldCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChjaGFuX2lkID09IHJlZykgewotCQkJCXByaXYtPmFkYXAuZGV2Lm9mX25vZGUgPSBjaGlsZDsKLQkJCQlicmVhazsKKwkJaWYgKG11eGMtPmFyYml0cmF0b3IpCisJCQltdXhfbm9kZSA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKGRldl9ub2RlLCAiaTJjLWFyYiIpOworCQllbHNlIGlmIChtdXhjLT5nYXRlKQorCQkJbXV4X25vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXZfbm9kZSwgImkyYy1nYXRlIik7CisJCWVsc2UKKwkJCW11eF9ub2RlID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoZGV2X25vZGUsICJpMmMtbXV4Iik7CisKKwkJaWYgKG11eF9ub2RlKSB7CisJCQkvKiBBICJyZWciIHByb3BlcnR5IGluZGljYXRlcyBhbiBvbGQtc3R5bGUgRFQgZW50cnkgKi8KKwkJCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobXV4X25vZGUsICJyZWciLCAmcmVnKSkgeworCQkJCW9mX25vZGVfcHV0KG11eF9ub2RlKTsKKwkJCQltdXhfbm9kZSA9IE5VTEw7CiAJCQl9CiAJCX0KKworCQlpZiAoIW11eF9ub2RlKQorCQkJbXV4X25vZGUgPSBvZl9ub2RlX2dldChkZXZfbm9kZSk7CisJCWVsc2UgaWYgKG11eGMtPmFyYml0cmF0b3IgfHwgbXV4Yy0+Z2F0ZSkKKwkJCWNoaWxkID0gb2Zfbm9kZV9nZXQobXV4X25vZGUpOworCisJCWlmICghY2hpbGQpIHsKKwkJCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobXV4X25vZGUsIGNoaWxkKSB7CisJCQkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoY2hpbGQsICJyZWciLCAmcmVnKTsKKwkJCQlpZiAocmV0KQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoY2hhbl9pZCA9PSByZWcpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcHJpdi0+YWRhcC5kZXYub2Zfbm9kZSA9IGNoaWxkOworCQlvZl9ub2RlX3B1dChtdXhfbm9kZSk7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL211eGVzL2kyYy1hcmItZ3Bpby1jaGFsbGVuZ2UuYyBiL2RyaXZlcnMvaTJjL211eGVzL2kyYy1hcmItZ3Bpby1jaGFsbGVuZ2UuYwppbmRleCBhOTBiYmM0Li44NmZjMmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtYXJiLWdwaW8tY2hhbGxlbmdlLmMKKysrIGIvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLWFyYi1ncGlvLWNoYWxsZW5nZS5jCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbXV4YyA9IGkyY19tdXhfYWxsb2MoTlVMTCwgZGV2LCAxLCBzaXplb2YoKmFyYiksIDAsCisJbXV4YyA9IGkyY19tdXhfYWxsb2MoTlVMTCwgZGV2LCAxLCBzaXplb2YoKmFyYiksIEkyQ19NVVhfQVJCSVRSQVRPUiwKIAkJCSAgICAgaTJjX2FyYml0cmF0b3Jfc2VsZWN0LCBpMmNfYXJiaXRyYXRvcl9kZXNlbGVjdCk7CiAJaWYgKCFtdXhjKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL211eGVzL2kyYy1kZW11eC1waW5jdHJsLmMgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtZGVtdXgtcGluY3RybC5jCmluZGV4IDIxNWFjODcuLmIzODkzZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL211eGVzL2kyYy1kZW11eC1waW5jdHJsLmMKKysrIGIvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLWRlbXV4LXBpbmN0cmwuYwpAQCAtMzcsOCArMzcsNiBAQAogCXN0cnVjdCBpMmNfZGVtdXhfcGluY3RybF9jaGFuIGNoYW5bXTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgc3RhdHVzX29rYXkgPSB7IC5uYW1lID0gInN0YXR1cyIsIC5sZW5ndGggPSAzLCAudmFsdWUgPSAib2siIH07Ci0KIHN0YXRpYyBpbnQgaTJjX2RlbXV4X21hc3Rlcl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgbXNnc1tdLCBpbnQgbnVtKQogewogCXN0cnVjdCBpMmNfZGVtdXhfcGluY3RybF9wcml2ICpwcml2ID0gYWRhcC0+YWxnb19kYXRhOwpAQCAtMTA3LDYgKzEwNSw3IEBACiAJb2ZfY2hhbmdlc2V0X3JldmVydCgmcHJpdi0+Y2hhbltuZXdfY2hhbl0uY2hnc2V0KTsKICBlcnI6CiAJZGV2X2Vycihwcml2LT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgZGVtdXgtYWRhcHRlciAlZCAoJWQpXG4iLCBuZXdfY2hhbiwgcmV0KTsKKwlwcml2LT5jdXJfY2hhbiA9IC1FSU5WQUw7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTkyLDYgKzE5MSw3IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBpMmNfZGVtdXhfcGluY3RybF9wcml2ICpwcml2OworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcHM7CiAJaW50IG51bV9jaGFuLCBpLCBqLCBlcnI7CiAKIAludW1fY2hhbiA9IG9mX2NvdW50X3BoYW5kbGVfd2l0aF9hcmdzKG5wLCAiaTJjLXBhcmVudCIsIE5VTEwpOwpAQCAtMjAyLDcgKzIwMiwxMCBAQAogCiAJcHJpdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnByaXYpCiAJCQkgICArIG51bV9jaGFuICogc2l6ZW9mKHN0cnVjdCBpMmNfZGVtdXhfcGluY3RybF9jaGFuKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2KQorCisJcHJvcHMgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgbnVtX2NoYW4sIHNpemVvZigqcHJvcHMpLCBHRlBfS0VSTkVMKTsKKworCWlmICghcHJpdiB8fCAhcHJvcHMpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJpMmMtYnVzLW5hbWUiLCAmcHJpdi0+YnVzX25hbWUpOwpAQCAtMjIwLDggKzIyMywxMiBAQAogCQl9CiAJCXByaXYtPmNoYW5baV0ucGFyZW50X25wID0gYWRhcF9ucDsKIAorCQlwcm9wc1tpXS5uYW1lID0gZGV2bV9rc3RyZHVwKCZwZGV2LT5kZXYsICJzdGF0dXMiLCBHRlBfS0VSTkVMKTsKKwkJcHJvcHNbaV0udmFsdWUgPSBkZXZtX2tzdHJkdXAoJnBkZXYtPmRldiwgIm9rIiwgR0ZQX0tFUk5FTCk7CisJCXByb3BzW2ldLmxlbmd0aCA9IDM7CisKIAkJb2ZfY2hhbmdlc2V0X2luaXQoJnByaXYtPmNoYW5baV0uY2hnc2V0KTsKLQkJb2ZfY2hhbmdlc2V0X3VwZGF0ZV9wcm9wZXJ0eSgmcHJpdi0+Y2hhbltpXS5jaGdzZXQsIGFkYXBfbnAsICZzdGF0dXNfb2theSk7CisJCW9mX2NoYW5nZXNldF91cGRhdGVfcHJvcGVydHkoJnByaXYtPmNoYW5baV0uY2hnc2V0LCBhZGFwX25wLCAmcHJvcHNbaV0pOwogCX0KIAogCXByaXYtPm51bV9jaGFuID0gbnVtX2NoYW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBjYTk1NDEuYyBiL2RyaXZlcnMvaTJjL211eGVzL2kyYy1tdXgtcGNhOTU0MS5jCmluZGV4IDNjYjhhZjYuLjRlYTdlNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL211eGVzL2kyYy1tdXgtcGNhOTU0MS5jCisrKyBiL2RyaXZlcnMvaTJjL211eGVzL2kyYy1tdXgtcGNhOTU0MS5jCkBAIC04NSw2ICs4NSwxMyBAQAogCiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcGNhOTU0MV9pZCk7CiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBjYTk1NDFfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm54cCxwY2E5NTQxIiB9LAorCXt9Cit9OworI2VuZGlmCisKIC8qCiAgKiBXcml0ZSB0byBjaGlwIHJlZ2lzdGVyLiBEb24ndCB1c2UgaTJjX3RyYW5zZmVyKCkvaTJjX3NtYnVzX3hmZXIoKQogICogYXMgdGhleSB3aWxsIHRyeSB0byBsb2NrIHRoZSBhZGFwdGVyIGEgc2Vjb25kIHRpbWUuCkBAIC0zNDksNyArMzU2LDggQEAKIAlmb3JjZSA9IDA7CiAJaWYgKHBkYXRhKQogCQlmb3JjZSA9IHBkYXRhLT5tb2Rlc1swXS5hZGFwX2lkOwotCW11eGMgPSBpMmNfbXV4X2FsbG9jKGFkYXAsICZjbGllbnQtPmRldiwgMSwgc2l6ZW9mKCpkYXRhKSwgMCwKKwltdXhjID0gaTJjX211eF9hbGxvYyhhZGFwLCAmY2xpZW50LT5kZXYsIDEsIHNpemVvZigqZGF0YSksCisJCQkgICAgIEkyQ19NVVhfQVJCSVRSQVRPUiwKIAkJCSAgICAgcGNhOTU0MV9zZWxlY3RfY2hhbiwgcGNhOTU0MV9yZWxlYXNlX2NoYW4pOwogCWlmICghbXV4YykKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0zODIsNiArMzkwLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwY2E5NTQxX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkgICAubmFtZSA9ICJwY2E5NTQxIiwKKwkJICAgLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHBjYTk1NDFfb2ZfbWF0Y2gpLAogCQkgICB9LAogCS5wcm9iZSA9IHBjYTk1NDFfcHJvYmUsCiAJLnJlbW92ZSA9IHBjYTk1NDFfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1wY2E5NTR4LmMgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBjYTk1NHguYwppbmRleCA1MjhlNzU1Li4xMDkxMzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBjYTk1NHguYworKysgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBjYTk1NHguYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy9wY2E5NTR4Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApAQCAtNTgsMTQgKzU5LDYgQEAKIAlwY2FfOTU0OCwKIH07CiAKLXN0cnVjdCBwY2E5NTR4IHsKLQllbnVtIHBjYV90eXBlIHR5cGU7Ci0KLQl1OCBsYXN0X2NoYW47CQkvKiBsYXN0IHJlZ2lzdGVyIHZhbHVlICovCi0JdTggZGVzZWxlY3Q7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLX07Ci0KIHN0cnVjdCBjaGlwX2Rlc2MgewogCXU4IG5jaGFuczsKIAl1OCBlbmFibGU7CS8qIHVzZWQgZm9yIG11eGVzIG9ubHkgKi8KQEAgLTc1LDYgKzY4LDE0IEBACiAJfSBtdXh0eXBlOwogfTsKIAorc3RydWN0IHBjYTk1NHggeworCWNvbnN0IHN0cnVjdCBjaGlwX2Rlc2MgKmNoaXA7CisKKwl1OCBsYXN0X2NoYW47CQkvKiBsYXN0IHJlZ2lzdGVyIHZhbHVlICovCisJdTggZGVzZWxlY3Q7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKK307CisKIC8qIFByb3ZpZGUgc3BlY3MgZm9yIHRoZSBQQ0E5NTR4IHR5cGVzIHdlIGtub3cgYWJvdXQgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY2hpcF9kZXNjIGNoaXBzW10gPSB7CiAJW3BjYV85NTQwXSA9IHsKQEAgLTExOSw2ICsxMjAsMjAgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcGNhOTU0eF9pZCk7CiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBjYTk1NHhfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm54cCxwY2E5NTQwIiwgLmRhdGEgPSAmY2hpcHNbcGNhXzk1NDBdIH0sCisJeyAuY29tcGF0aWJsZSA9ICJueHAscGNhOTU0MiIsIC5kYXRhID0gJmNoaXBzW3BjYV85NTQyXSB9LAorCXsgLmNvbXBhdGlibGUgPSAibnhwLHBjYTk1NDMiLCAuZGF0YSA9ICZjaGlwc1twY2FfOTU0M10gfSwKKwl7IC5jb21wYXRpYmxlID0gIm54cCxwY2E5NTQ0IiwgLmRhdGEgPSAmY2hpcHNbcGNhXzk1NDRdIH0sCisJeyAuY29tcGF0aWJsZSA9ICJueHAscGNhOTU0NSIsIC5kYXRhID0gJmNoaXBzW3BjYV85NTQ1XSB9LAorCXsgLmNvbXBhdGlibGUgPSAibnhwLHBjYTk1NDYiLCAuZGF0YSA9ICZjaGlwc1twY2FfOTU0Nl0gfSwKKwl7IC5jb21wYXRpYmxlID0gIm54cCxwY2E5NTQ3IiwgLmRhdGEgPSAmY2hpcHNbcGNhXzk1NDddIH0sCisJeyAuY29tcGF0aWJsZSA9ICJueHAscGNhOTU0OCIsIC5kYXRhID0gJmNoaXBzW3BjYV85NTQ4XSB9LAorCXt9Cit9OworI2VuZGlmCisKIC8qIFdyaXRlIHRvIG11eCByZWdpc3Rlci4gRG9uJ3QgdXNlIGkyY190cmFuc2ZlcigpL2kyY19zbWJ1c194ZmVyKCkKICAgIGZvciB0aGlzIGFzIHRoZXkgd2lsbCB0cnkgdG8gbG9jayBhZGFwdGVyIGEgc2Vjb25kIHRpbWUgKi8KIHN0YXRpYyBpbnQgcGNhOTU0eF9yZWdfd3JpdGUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLApAQCAtMTUxLDcgKzE2Niw3IEBACiB7CiAJc3RydWN0IHBjYTk1NHggKmRhdGEgPSBpMmNfbXV4X3ByaXYobXV4Yyk7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQljb25zdCBzdHJ1Y3QgY2hpcF9kZXNjICpjaGlwID0gJmNoaXBzW2RhdGEtPnR5cGVdOworCWNvbnN0IHN0cnVjdCBjaGlwX2Rlc2MgKmNoaXAgPSBkYXRhLT5jaGlwOwogCXU4IHJlZ3ZhbDsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMTY0LDcgKzE3OSw3IEBACiAJLyogT25seSBzZWxlY3QgdGhlIGNoYW5uZWwgaWYgaXRzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IGNoYW5uZWwgKi8KIAlpZiAoZGF0YS0+bGFzdF9jaGFuICE9IHJlZ3ZhbCkgewogCQlyZXQgPSBwY2E5NTR4X3JlZ193cml0ZShtdXhjLT5wYXJlbnQsIGNsaWVudCwgcmVndmFsKTsKLQkJZGF0YS0+bGFzdF9jaGFuID0gcmVndmFsOworCQlkYXRhLT5sYXN0X2NoYW4gPSByZXQgPyAwIDogcmVndmFsOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xOTcsNiArMjEyLDcgQEAKIAlpbnQgbnVtLCBmb3JjZSwgY2xhc3M7CiAJc3RydWN0IGkyY19tdXhfY29yZSAqbXV4YzsKIAlzdHJ1Y3QgcGNhOTU0eCAqZGF0YTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAlpbnQgcmV0OwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwLCBJMkNfRlVOQ19TTUJVU19CWVRFKSkKQEAgLTIyNiwxNCArMjQyLDE5IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWRhdGEtPnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CisJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKHBjYTk1NHhfb2ZfbWF0Y2gpLCAmY2xpZW50LT5kZXYpOworCWlmIChtYXRjaCkKKwkJZGF0YS0+Y2hpcCA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmY2xpZW50LT5kZXYpOworCWVsc2UKKwkJZGF0YS0+Y2hpcCA9ICZjaGlwc1tpZC0+ZHJpdmVyX2RhdGFdOworCiAJZGF0YS0+bGFzdF9jaGFuID0gMDsJCSAgIC8qIGZvcmNlIHRoZSBmaXJzdCBzZWxlY3Rpb24gKi8KIAogCWlkbGVfZGlzY29ubmVjdF9kdCA9IG9mX25vZGUgJiYKIAkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKG9mX25vZGUsICJpMmMtbXV4LWlkbGUtZGlzY29ubmVjdCIpOwogCiAJLyogTm93IGNyZWF0ZSBhbiBhZGFwdGVyIGZvciBlYWNoIGNoYW5uZWwgKi8KLQlmb3IgKG51bSA9IDA7IG51bSA8IGNoaXBzW2RhdGEtPnR5cGVdLm5jaGFuczsgbnVtKyspIHsKKwlmb3IgKG51bSA9IDA7IG51bSA8IGRhdGEtPmNoaXAtPm5jaGFuczsgbnVtKyspIHsKIAkJYm9vbCBpZGxlX2Rpc2Nvbm5lY3RfcGQgPSBmYWxzZTsKIAogCQlmb3JjZSA9IDA7CQkJICAvKiBkeW5hbWljIGFkYXAgbnVtYmVyICovCkBAIC0yNjMsNyArMjg0LDcgQEAKIAogCWRldl9pbmZvKCZjbGllbnQtPmRldiwKIAkJICJyZWdpc3RlcmVkICVkIG11bHRpcGxleGVkIGJ1c3NlcyBmb3IgSTJDICVzICVzXG4iLAotCQkgbnVtLCBjaGlwc1tkYXRhLT50eXBlXS5tdXh0eXBlID09IHBjYTk1NHhfaXNtdXgKKwkJIG51bSwgZGF0YS0+Y2hpcC0+bXV4dHlwZSA9PSBwY2E5NTR4X2lzbXV4CiAJCQkJPyAibXV4IiA6ICJzd2l0Y2giLCBjbGllbnQtPm5hbWUpOwogCiAJcmV0dXJuIDA7CkBAIC0yOTksNiArMzIwLDcgQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAicGNhOTU0eCIsCiAJCS5wbQk9ICZwY2E5NTR4X3BtLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIocGNhOTU0eF9vZl9tYXRjaCksCiAJfSwKIAkucHJvYmUJCT0gcGNhOTU0eF9wcm9iZSwKIAkucmVtb3ZlCQk9IHBjYTk1NHhfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2FjY2VsL0tjb25maWcKaW5kZXggODlkNzgyMC4uMmI3OTFmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9LY29uZmlnCkBAIC0yMCw2ICsyMCw4IEBACiBjb25maWcgQk1BMjIwCiAgICAgdHJpc3RhdGUgIkJvc2NoIEJNQTIyMCAzLUF4aXMgQWNjZWxlcm9tZXRlciBEcml2ZXIiCiAJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgogICAgIGhlbHAKICAgICAgIFNheSB5ZXMgaGVyZSB0byBhZGQgc3VwcG9ydCBmb3IgdGhlIEJvc2NoIEJNQTIyMCB0cmlheGlhbAogICAgICAgYWNjZWxlcmF0aW9uIHNlbnNvci4KQEAgLTUwLDYgKzUyLDI3IEBACiAJdHJpc3RhdGUKIAlzZWxlY3QgUkVHTUFQX1NQSQogCitjb25maWcgRE1BUkQwNgorCXRyaXN0YXRlICJEb21pbnRlY2ggRE1BUkQwNiBEaWdpdGFsIEFjY2VsZXJvbWV0ZXIgRHJpdmVyIgorCWRlcGVuZHMgb24gT0YgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIERvbWludGVjaCBsb3ctZyB0cmktYXhpYWwKKwkgIGRpZ2l0YWwgYWNjZWxlcm9tZXRlcnM6IERNQVJEMDUsIERNQVJEMDYsIERNQVJEMDcuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGRtYXJkMDYuCisKK2NvbmZpZyBETUFSRDA5CisJdHJpc3RhdGUgIkRvbWludGVjaCBETUFSRDA5IDMtYXhpcyBBY2NlbGVyb21ldGVyIERyaXZlciIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBnZXQgc3VwcG9ydCBmb3IgdGhlIERvbWludGVjaCBETUFSRDA5IDMtYXhpcworCSAgYWNjZWxlcm9tZXRlci4KKworCSAgQ2hvb3NpbmcgTSB3aWxsIGJ1aWxkIHRoZSBkcml2ZXIgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBkbWFyZDA5LgorCiBjb25maWcgSElEX1NFTlNPUl9BQ0NFTF8zRAogCWRlcGVuZHMgb24gSElEX1NFTlNPUl9IVUIKIAlzZWxlY3QgSUlPX0JVRkZFUgpAQCAtOTYsMTQgKzExOSwzNSBAQAogCiBjb25maWcgS1hTRDkKIAl0cmlzdGF0ZSAiS2lvbml4IEtYU0Q5IEFjY2VsZXJvbWV0ZXIgRHJpdmVyIgotCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIEtpb25peCBLWFNEOSBhY2NlbGVyb21ldGVyLgotCSAgQ3VycmVudGx5IHRoaXMgb25seSBzdXBwb3J0cyB0aGUgZGV2aWNlIHZpYSBhbiBTUEkgaW50ZXJmYWNlLgorCSAgSXQgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIGFuIChvcHRpb25hbCkgU1BJIG9yIEkyQyBpbnRlcmZhY2UuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGt4c2Q5LgogCitjb25maWcgS1hTRDlfU1BJCisJdHJpc3RhdGUgIktpb25peCBLWFNEOSBTUEkgdHJhbnNwb3J0IgorCWRlcGVuZHMgb24gS1hTRDkKKwlkZXBlbmRzIG9uIFNQSQorCWRlZmF1bHQgS1hTRDkKKwlzZWxlY3QgUkVHTUFQX1NQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBlbmFibGUgdGhlIEtpb25peCBLWFNEOSBhY2NlbGVyb21ldGVyCisJICBTUEkgdHJhbnNwb3J0IGNoYW5uZWwuCisKK2NvbmZpZyBLWFNEOV9JMkMKKwl0cmlzdGF0ZSAiS2lvbml4IEtYU0Q5IEkyQyB0cmFuc3BvcnQiCisJZGVwZW5kcyBvbiBLWFNEOQorCWRlcGVuZHMgb24gSTJDCisJZGVmYXVsdCBLWFNEOQorCXNlbGVjdCBSRUdNQVBfSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGVuYWJsZSB0aGUgS2lvbml4IEtYU0Q5IGFjY2VsZXJvbWV0ZXIKKwkgIEkyQyB0cmFuc3BvcnQgY2hhbm5lbC4KKwogY29uZmlnIEtYQ0pLMTAxMwogCXRyaXN0YXRlICJLaW9uaXggMy1BeGlzIEFjY2VsZXJvbWV0ZXIgRHJpdmVyIgogCWRlcGVuZHMgb24gSTJDCkBAIC0xMTcsNiArMTYxLDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKIAkgIGJlIGNhbGxlZCBreGNqay0xMDEzLgogCitjb25maWcgTUMzMjMwCisJdHJpc3RhdGUgIm1DdWJlIE1DMzIzMCBEaWdpdGFsIEFjY2VsZXJvbWV0ZXIgRHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBtQ3ViZSBNQzMyMzAgbG93LWcgdHJpLWF4aWFsCisJICBkaWdpdGFsIGFjY2VsZXJvbWV0ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1jMzIzMC4KKwogY29uZmlnIE1NQTc0NTUKIAl0cmlzdGF0ZQogCXNlbGVjdCBJSU9fQlVGRkVSCkBAIC0yMzQsNyArMjg4LDggQEAKIGNvbmZpZyBTVEs4QkE1MAogCXRyaXN0YXRlICJTZW5zb3J0ZWsgU1RLOEJBNTAgMy1BeGlzIEFjY2VsZXJvbWV0ZXIgRHJpdmVyIgogCWRlcGVuZHMgb24gSTJDCi0JZGVwZW5kcyBvbiBJSU9fVFJJR0dFUgorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGdldCBzdXBwb3J0IGZvciB0aGUgU2Vuc29ydGVrIFNUSzhCQTUwIDMtYXhpcwogCSAgYWNjZWxlcm9tZXRlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL01ha2VmaWxlIGIvZHJpdmVycy9paW8vYWNjZWwvTWFrZWZpbGUKaW5kZXggNmNlZGJlYy4uZjVkM2RkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvTWFrZWZpbGUKQEAgLTgsOSArOCwxNCBAQAogb2JqLSQoQ09ORklHX0JNQzE1MF9BQ0NFTCkgKz0gYm1jMTUwLWFjY2VsLWNvcmUubwogb2JqLSQoQ09ORklHX0JNQzE1MF9BQ0NFTF9JMkMpICs9IGJtYzE1MC1hY2NlbC1pMmMubwogb2JqLSQoQ09ORklHX0JNQzE1MF9BQ0NFTF9TUEkpICs9IGJtYzE1MC1hY2NlbC1zcGkubworb2JqLSQoQ09ORklHX0RNQVJEMDYpCSs9IGRtYXJkMDYubworb2JqLSQoQ09ORklHX0RNQVJEMDkpCSs9IGRtYXJkMDkubwogb2JqLSQoQ09ORklHX0hJRF9TRU5TT1JfQUNDRUxfM0QpICs9IGhpZC1zZW5zb3ItYWNjZWwtM2Qubwogb2JqLSQoQ09ORklHX0tYQ0pLMTAxMykgKz0ga3hjamstMTAxMy5vCiBvYmotJChDT05GSUdfS1hTRDkpCSs9IGt4c2Q5Lm8KK29iai0kKENPTkZJR19LWFNEOV9TUEkpCSs9IGt4c2Q5LXNwaS5vCitvYmotJChDT05GSUdfS1hTRDlfSTJDKQkrPSBreHNkOS1pMmMubworb2JqLSQoQ09ORklHX01DMzIzMCkJKz0gbWMzMjMwLm8KIAogb2JqLSQoQ09ORklHX01NQTc0NTUpCQkrPSBtbWE3NDU1X2NvcmUubwogb2JqLSQoQ09ORklHX01NQTc0NTVfSTJDKQkrPSBtbWE3NDU1X2kyYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9ibWExODAuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2JtYTE4MC5jCmluZGV4IGUzZjg4YmEuLjA4OTA5MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL2JtYTE4MC5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL2JtYTE4MC5jCkBAIC00NjksMTMgKzQ2OSwxNCBAQAogCiAJc3dpdGNoIChtYXNrKSB7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7Ci0JCWlmIChpaW9fYnVmZmVyX2VuYWJsZWQoaW5kaW9fZGV2KSkgewotCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9CiAJCXJldCA9IGJtYTE4MF9nZXRfZGF0YV9yZWcoZGF0YSwgY2hhbi0+c2Nhbl9pbmRleCk7CiAJCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOworCQlpaW9fZGV2aWNlX3JlbGVhc2VfZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCQkqdmFsID0gc2lnbl9leHRlbmQzMihyZXQgPj4gY2hhbi0+c2Nhbl90eXBlLnNoaWZ0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvYm1hMjIwX3NwaS5jIGIvZHJpdmVycy9paW8vYWNjZWwvYm1hMjIwX3NwaS5jCmluZGV4IDEwOThkMTAuLjUwOTlmMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL2JtYTIyMF9zcGkuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWEyMjBfc3BpLmMKQEAgLTI1Myw3ICsyNTMsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAorCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUsCiAJCQkJCSBibWEyMjBfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZzcGktPmRldiwgImlpbyB0cmlnZ2VyZWQgYnVmZmVyIHNldHVwIGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9ibWMxNTAtYWNjZWwtY29yZS5jIGIvZHJpdmVycy9paW8vYWNjZWwvYm1jMTUwLWFjY2VsLWNvcmUuYwppbmRleCBiZjE3YWFlLi41OWIzODBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9ibWMxNTAtYWNjZWwtY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL2JtYzE1MC1hY2NlbC1jb3JlLmMKQEAgLTY3LDYgKzY3LDkgQEAKICNkZWZpbmUgQk1DMTUwX0FDQ0VMX1JFR19QTVVfQlcJCTB4MTAKICNkZWZpbmUgQk1DMTUwX0FDQ0VMX0RFRl9CVwkJCTEyNQogCisjZGVmaW5lIEJNQzE1MF9BQ0NFTF9SRUdfUkVTRVQJCQkweDE0CisjZGVmaW5lIEJNQzE1MF9BQ0NFTF9SRVNFVF9WQUwJCQkweEI2CisKICNkZWZpbmUgQk1DMTUwX0FDQ0VMX1JFR19JTlRfTUFQXzAJCTB4MTkKICNkZWZpbmUgQk1DMTUwX0FDQ0VMX0lOVF9NQVBfMF9CSVRfU0xPUEUJQklUKDIpCiAKQEAgLTE0OTcsNiArMTUwMCwxNCBAQAogCWludCByZXQsIGk7CiAJdW5zaWduZWQgaW50IHZhbDsKIAorCS8qCisJICogUmVzZXQgY2hpcCB0byBnZXQgaXQgaW4gYSBrbm93biBnb29kIHN0YXRlLiBBIGRlbGF5IG9mIDEuOG1zIGFmdGVyCisJICogcmVzZXQgaXMgcmVxdWlyZWQgYWNjb3JkaW5nIHRvIHRoZSBkYXRhIHNoZWV0cyBvZiBzdXBwb3J0ZWQgY2hpcHMuCisJICovCisJcmVnbWFwX3dyaXRlKGRhdGEtPnJlZ21hcCwgQk1DMTUwX0FDQ0VMX1JFR19SRVNFVCwKKwkJICAgICBCTUMxNTBfQUNDRUxfUkVTRVRfVkFMKTsKKwl1c2xlZXBfcmFuZ2UoMTgwMCwgMjUwMCk7CisKIAlyZXQgPSByZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAsIEJNQzE1MF9BQ0NFTF9SRUdfQ0hJUF9JRCwgJnZhbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihkZXYsICJFcnJvcjogUmVhZGluZyBjaGlwIGlkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL2RtYXJkMDYuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2RtYXJkMDYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTZjYThlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvZG1hcmQwNi5jCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogSUlPIGRyaXZlciBmb3IgRG9taW50ZWNoIERNQVJEMDYgYWNjZWxlcm9tZXRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBBbGVrc2VpIE1hbWxpbiA8bWFtbGluYXZAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorCisjZGVmaW5lIERNQVJEMDZfRFJWX05BTUUJCSJkbWFyZDA2IgorCisvKiBEZXZpY2UgZGF0YSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRE1BUkQwNl9DSElQX0lEX1JFRwkJMHgwZgorI2RlZmluZSBETUFSRDA2X1RPVVRfUkVHCQkweDQwCisjZGVmaW5lIERNQVJEMDZfWE9VVF9SRUcJCTB4NDEKKyNkZWZpbmUgRE1BUkQwNl9ZT1VUX1JFRwkJMHg0MgorI2RlZmluZSBETUFSRDA2X1pPVVRfUkVHCQkweDQzCisjZGVmaW5lIERNQVJEMDZfQ1RSTDFfUkVHCQkweDQ0CisKKy8qIERldmljZSBJRCB2YWx1ZSAqLworI2RlZmluZSBETUFSRDA1X0NISVBfSUQJCQkweDA1CisjZGVmaW5lIERNQVJEMDZfQ0hJUF9JRAkJCTB4MDYKKyNkZWZpbmUgRE1BUkQwN19DSElQX0lECQkJMHgwNworCisvKiBEZXZpY2UgdmFsdWVzICovCisjZGVmaW5lIERNQVJEMDVfQVhJU19TQ0FMRV9WQUwJCTE1NjI1CisjZGVmaW5lIERNQVJEMDZfQVhJU19TQ0FMRV9WQUwJCTMxMjUwCisjZGVmaW5lIERNQVJEMDZfVEVNUF9DRU5URVJfVkFMCQkyNQorI2RlZmluZSBETUFSRDA2X1NJR05fQklUCQk3CisKKy8qIERldmljZSBwb3dlciBtb2RlcyAqLworI2RlZmluZSBETUFSRDA2X01PREVfTk9STUFMCQkweDI3CisjZGVmaW5lIERNQVJEMDZfTU9ERV9QT1dFUkRPV04JCTB4MDAKKworLyogRGV2aWNlIGNoYW5uZWxzICovCisjZGVmaW5lIERNQVJEMDZfQUNDRUxfQ0hBTk5FTChfYXhpcywgX3JlZykgewkJCVwKKwkudHlwZSA9IElJT19BQ0NFTCwJCQkJCVwKKwkuYWRkcmVzcyA9IF9yZWcsCQkJCQlcCisJLmNoYW5uZWwyID0gSUlPX01PRF8jI19heGlzLAkJCQlcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCQlcCisJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwJXAorCS5tb2RpZmllZCA9IDEsCQkJCQkJXAorfQorCisjZGVmaW5lIERNQVJEMDZfVEVNUF9DSEFOTkVMKF9yZWcpIHsJCQkJXAorCS50eXBlID0gSUlPX1RFTVAsCQkJCQlcCisJLmFkZHJlc3MgPSBfcmVnLAkJCQkJXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwJCVwKKwkJCSAgICAgIEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCksCVwKK30KKworc3RydWN0IGRtYXJkMDZfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwl1OCBjaGlwX2lkOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGRtYXJkMDZfY2hhbm5lbHNbXSA9IHsKKwlETUFSRDA2X0FDQ0VMX0NIQU5ORUwoWCwgRE1BUkQwNl9YT1VUX1JFRyksCisJRE1BUkQwNl9BQ0NFTF9DSEFOTkVMKFksIERNQVJEMDZfWU9VVF9SRUcpLAorCURNQVJEMDZfQUNDRUxfQ0hBTk5FTChaLCBETUFSRDA2X1pPVVRfUkVHKSwKKwlETUFSRDA2X1RFTVBfQ0hBTk5FTChETUFSRDA2X1RPVVRfUkVHKSwKK307CisKK3N0YXRpYyBpbnQgZG1hcmQwNl9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgIGludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgZG1hcmQwNl9kYXRhICpkbWFyZDA2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRtYXJkMDYtPmNsaWVudCwKKwkJCQkJICAgICAgIGNoYW4tPmFkZHJlc3MpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmZG1hcmQwNi0+Y2xpZW50LT5kZXYsCisJCQkJIkVycm9yIHJlYWRpbmcgZGF0YTogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJKnZhbCA9IHNpZ25fZXh0ZW5kMzIocmV0LCBETUFSRDA2X1NJR05fQklUKTsKKworCQlpZiAoZG1hcmQwNi0+Y2hpcF9pZCA9PSBETUFSRDA2X0NISVBfSUQpCisJCQkqdmFsID0gKnZhbCA+PiAxOworCisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19BQ0NFTDoKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJY2FzZSBJSU9fVEVNUDoKKwkJCWlmIChkbWFyZDA2LT5jaGlwX2lkICE9IERNQVJEMDZfQ0hJUF9JRCkKKwkJCQkqdmFsID0gKnZhbCAvIDI7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19URU1QOgorCQkJKnZhbCA9IERNQVJEMDZfVEVNUF9DRU5URVJfVkFMOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19BQ0NFTDoKKwkJCSp2YWwgPSAwOworCQkJaWYgKGRtYXJkMDYtPmNoaXBfaWQgPT0gRE1BUkQwNl9DSElQX0lEKQorCQkJCSp2YWwyID0gRE1BUkQwNl9BWElTX1NDQUxFX1ZBTDsKKwkJCWVsc2UKKwkJCQkqdmFsMiA9IERNQVJEMDVfQVhJU19TQ0FMRV9WQUw7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGRtYXJkMDZfaW5mbyA9IHsKKwkuZHJpdmVyX21vZHVsZQk9IFRISVNfTU9EVUxFLAorCS5yZWFkX3Jhdwk9IGRtYXJkMDZfcmVhZF9yYXcsCit9OworCitzdGF0aWMgaW50IGRtYXJkMDZfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IGRtYXJkMDZfZGF0YSAqZG1hcmQwNjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIGNoZWNrIGZ1bmN0aW9uYWxpdHkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRtYXJkMDYpKTsKKwlpZiAoIWluZGlvX2RldikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpaW8gZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZG1hcmQwNiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJZG1hcmQwNi0+Y2xpZW50ID0gY2xpZW50OworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRtYXJkMDYtPmNsaWVudCwgRE1BUkQwNl9DSElQX0lEX1JFRyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJFcnJvciByZWFkaW5nIGNoaXAgaWQ6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZXQgIT0gRE1BUkQwNV9DSElQX0lEICYmIHJldCAhPSBETUFSRDA2X0NISVBfSUQgJiYKKwkgICAgcmV0ICE9IERNQVJEMDdfQ0hJUF9JRCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkludmFsaWQgY2hpcCBpZDogJTAyZFxuIiwgcmV0KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZG1hcmQwNi0+Y2hpcF9pZCA9IHJldDsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IERNQVJEMDZfRFJWX05BTUU7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBkbWFyZDA2X2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShkbWFyZDA2X2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPmluZm8gPSAmZG1hcmQwNl9pbmZvOworCisJcmV0dXJuIGRldm1faWlvX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYsIGluZGlvX2Rldik7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgZG1hcmQwNl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSk7CisJc3RydWN0IGRtYXJkMDZfZGF0YSAqZG1hcmQwNiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZG1hcmQwNi0+Y2xpZW50LCBETUFSRDA2X0NUUkwxX1JFRywKKwkJCQkJRE1BUkQwNl9NT0RFX1BPV0VSRE9XTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbWFyZDA2X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YSh0b19pMmNfY2xpZW50KGRldikpOworCXN0cnVjdCBkbWFyZDA2X2RhdGEgKmRtYXJkMDYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRtYXJkMDYtPmNsaWVudCwgRE1BUkQwNl9DVFJMMV9SRUcsCisJCQkJCURNQVJEMDZfTU9ERV9OT1JNQUwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhkbWFyZDA2X3BtX29wcywgZG1hcmQwNl9zdXNwZW5kLCBkbWFyZDA2X3Jlc3VtZSk7CisjZGVmaW5lIERNQVJEMDZfUE1fT1BTICgmZG1hcmQwNl9wbV9vcHMpCisjZWxzZQorI2RlZmluZSBETUFSRDA2X1BNX09QUyBOVUxMCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGRtYXJkMDZfaWRbXSA9IHsKKwl7ICJkbWFyZDA1IiwgMCB9LAorCXsgImRtYXJkMDYiLCAwIH0sCisJeyAiZG1hcmQwNyIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgZG1hcmQwNl9pZCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGRtYXJkMDZfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImRvbWludGVjaCxkbWFyZDA1IiB9LAorCXsgLmNvbXBhdGlibGUgPSAiZG9taW50ZWNoLGRtYXJkMDYiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJkb21pbnRlY2gsZG1hcmQwNyIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBkbWFyZDA2X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRtYXJkMDZfZHJpdmVyID0geworCS5wcm9iZSA9IGRtYXJkMDZfcHJvYmUsCisJLmlkX3RhYmxlID0gZG1hcmQwNl9pZCwKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERNQVJEMDZfRFJWX05BTUUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihkbWFyZDA2X29mX21hdGNoKSwKKwkJLnBtID0gRE1BUkQwNl9QTV9PUFMsCisJfSwKK307Cittb2R1bGVfaTJjX2RyaXZlcihkbWFyZDA2X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkFsZWtzZWkgTWFtbGluIDxtYW1saW5hdkBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRvbWludGVjaCBETUFSRDA2IGFjY2VsZXJvbWV0ZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9kbWFyZDA5LmMgYi9kcml2ZXJzL2lpby9hY2NlbC9kbWFyZDA5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhMjhmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL2RtYXJkMDkuYwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIElJTyBkcml2ZXIgZm9yIHRoZSAzLWF4aXMgYWNjZWxlcm9tZXRlciBEb21pbnRlY2ggRE1BUkQwOS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEplbGxlIHZhbiBkZXIgV2FhIDxqZWxsZUB2ZHdhYS5ubD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisKKyNkZWZpbmUgRE1BUkQwOV9EUlZfTkFNRQkiZG1hcmQwOSIKKworI2RlZmluZSBETUFSRDA5X1JFR19DSElQSUQgICAgICAweDE4CisjZGVmaW5lIERNQVJEMDlfUkVHX1NUQVQJMHgwQQorI2RlZmluZSBETUFSRDA5X1JFR19YCQkweDBDCisjZGVmaW5lIERNQVJEMDlfUkVHX1kJCTB4MEUKKyNkZWZpbmUgRE1BUkQwOV9SRUdfWgkJMHgxMAorI2RlZmluZSBETUFSRDA5X0NISVBJRAkJMHg5NQorCisjZGVmaW5lIERNQVJEMDlfQlVGX0xFTiA4CisjZGVmaW5lIERNQVJEMDlfQVhJU19YIDAKKyNkZWZpbmUgRE1BUkQwOV9BWElTX1kgMQorI2RlZmluZSBETUFSRDA5X0FYSVNfWiAyCisjZGVmaW5lIERNQVJEMDlfQVhJU19YX09GRlNFVCAoKERNQVJEMDlfQVhJU19YICsgMSkgKiAyKQorI2RlZmluZSBETUFSRDA5X0FYSVNfWV9PRkZTRVQgKChETUFSRDA5X0FYSVNfWSArIDEgKSogMikKKyNkZWZpbmUgRE1BUkQwOV9BWElTX1pfT0ZGU0VUICgoRE1BUkQwOV9BWElTX1ogKyAxKSAqIDIpCisKK3N0cnVjdCBkbWFyZDA5X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Cit9OworCisjZGVmaW5lIERNQVJEMDlfQ0hBTk5FTChfYXhpcywgb2Zmc2V0KSB7CQkJXAorCS50eXBlID0gSUlPX0FDQ0VMLAkJCQkJXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAkJXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCVwKKwkubW9kaWZpZWQgPSAxLAkJCQkJCVwKKwkuYWRkcmVzcyA9IG9mZnNldCwJCQkJCVwKKwkuY2hhbm5lbDIgPSBJSU9fTU9EXyMjX2F4aXMsCQkJCVwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGRtYXJkMDlfY2hhbm5lbHNbXSA9IHsKKwlETUFSRDA5X0NIQU5ORUwoWCwgRE1BUkQwOV9BWElTX1hfT0ZGU0VUKSwKKwlETUFSRDA5X0NIQU5ORUwoWSwgRE1BUkQwOV9BWElTX1lfT0ZGU0VUKSwKKwlETUFSRDA5X0NIQU5ORUwoWiwgRE1BUkQwOV9BWElTX1pfT0ZGU0VUKSwKK307CisKK3N0YXRpYyBpbnQgZG1hcmQwOV9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgIGludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgZG1hcmQwOV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1OCBidWZbRE1BUkQwOV9CVUZfTEVOXTsKKwlpbnQgcmV0OworCXMxNiBhY2NlbDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCS8qCisJCSAqIFJlYWQgZnJvbSB0aGUgRE1BUjA5X1JFR19TVEFUIHJlZ2lzdGVyLCBzaW5jZSB0aGUgY2hpcAorCQkgKiBjYWNoZXMgcmVhZHMgZnJvbSB0aGUgaW5kaXZpZHVhbCBYLCBZLCBaIHJlZ2lzdGVycy4KKwkJICovCisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJCSAgICBETUFSRDA5X1JFR19TVEFULAorCQkJCQkJICAgIERNQVJEMDlfQlVGX0xFTiwgYnVmKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3IgcmVhZGluZyByZWcgJWRcbiIsCisJCQkJRE1BUkQwOV9SRUdfU1RBVCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJYWNjZWwgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJmJ1ZltjaGFuLT5hZGRyZXNzXSk7CisKKwkJLyogUmVtb3ZlIGxvd2VyIDMgYml0cyBhbmQgc2lnbiBleHRlbmQgKi8KKwkJYWNjZWwgPDw9IDQ7CisJCWFjY2VsID4+PSA3OworCisJCSp2YWwgPSBhY2NlbDsKKworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGRtYXJkMDlfaW5mbyA9IHsKKwkuZHJpdmVyX21vZHVsZQk9IFRISVNfTU9EVUxFLAorCS5yZWFkX3Jhdwk9IGRtYXJkMDlfcmVhZF9yYXcsCit9OworCitzdGF0aWMgaW50IGRtYXJkMDlfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IGRtYXJkMDlfZGF0YSAqZGF0YTsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOworCWlmICghaW5kaW9fZGV2KSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaWlvIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgRE1BUkQwOV9SRUdfQ0hJUElEKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkVycm9yIHJlYWRpbmcgY2hpcCBpZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAocmV0ICE9IERNQVJEMDlfQ0hJUElEKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSW52YWxpZCBjaGlwIGlkICVkXG4iLCByZXQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwlpbmRpb19kZXYtPm5hbWUgPSBETUFSRDA5X0RSVl9OQU1FOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gZG1hcmQwOV9jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoZG1hcmQwOV9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5pbmZvID0gJmRtYXJkMDlfaW5mbzsKKworCXJldHVybiBkZXZtX2lpb19kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBpbmRpb19kZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgZG1hcmQwOV9pZFtdID0geworCXsgImRtYXJkMDkiLCAwfSwKKwl7IH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgZG1hcmQwOV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkbWFyZDA5X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERNQVJEMDlfRFJWX05BTUUKKwl9LAorCS5wcm9iZSA9IGRtYXJkMDlfcHJvYmUsCisJLmlkX3RhYmxlID0gZG1hcmQwOV9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGRtYXJkMDlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSmVsbGUgdmFuIGRlciBXYWEgPGplbGxlQHZkd2FhLm5sPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJETUFSRDA5IDMtYXhpcyBhY2NlbGVyb21ldGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwva3hjamstMTAxMy5jIGIvZHJpdmVycy9paW8vYWNjZWwva3hjamstMTAxMy5jCmluZGV4IDc2NWE3MjMuLjNmOTY4YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL2t4Y2prLTEwMTMuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9reGNqay0xMDEzLmMKQEAgLTEzOTIsNiArMTM5Miw3IEBACiAJeyJLWENKMTAxMyIsIEtYQ0pLMTAxM30sCiAJeyJLWENKMTAwOCIsIEtYQ0o5MTAwOH0sCiAJeyJLWENKOTAwMCIsIEtYQ0o5MTAwOH0sCisJeyJLSU9YMDAwQSIsIEtYQ0o5MTAwOH0sCiAJeyJLWFRKMTAwOSIsIEtYVEoyMTAwOX0sCiAJeyJTTU84NTAwIiwgIEtYQ0o5MTAwOH0sCiAJeyB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwva3hzZDktaTJjLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWUyMDg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWNjZWwva3hzZDktaTJjLmMKQEAgLTAsMCArMSw2NCBAQAorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjaW5jbHVkZSAia3hzZDkuaCIKKworc3RhdGljIGludCBreHNkOV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY29uZmlnID0geworCQkucmVnX2JpdHMgPSA4LAorCQkudmFsX2JpdHMgPSA4LAorCQkubWF4X3JlZ2lzdGVyID0gMHgwZSwKKwl9OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJmNvbmZpZyk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGkyYyByZWdtYXAgJWRcbiIsCisJCQkoaW50KVBUUl9FUlIocmVnbWFwKSk7CisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisJfQorCisJcmV0dXJuIGt4c2Q5X2NvbW1vbl9wcm9iZSgmaTJjLT5kZXYsCisJCQkJICByZWdtYXAsCisJCQkJICBpMmMtPm5hbWUpOworfQorCitzdGF0aWMgaW50IGt4c2Q5X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4ga3hzZDlfY29tbW9uX3JlbW92ZSgmY2xpZW50LT5kZXYpOworfQorCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBreHNkOV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAia2lvbml4LGt4c2Q5IiwgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwga3hzZDlfb2ZfbWF0Y2gpOworI2Vsc2UKKyNkZWZpbmUga3hzZDlfb2ZfbWF0Y2ggTlVMTAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBreHNkOV9pMmNfaWRbXSA9IHsKKwl7Imt4c2Q5IiwgMH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBreHNkOV9pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIga3hzZDlfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJreHNkOSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihreHNkOV9vZl9tYXRjaCksCisJCS5wbSA9ICZreHNkOV9kZXZfcG1fb3BzLAorCX0sCisJLnByb2JlCQk9IGt4c2Q5X2kyY19wcm9iZSwKKwkucmVtb3ZlCQk9IGt4c2Q5X2kyY19yZW1vdmUsCisJLmlkX3RhYmxlCT0ga3hzZDlfaTJjX2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKGt4c2Q5X2kyY19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwva3hzZDktc3BpLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS1zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2QwMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWNjZWwva3hzZDktc3BpLmMKQEAgLTAsMCArMSw1NiBAQAorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlICJreHNkOS5oIgorCitzdGF0aWMgaW50IGt4c2Q5X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjb25maWcgPSB7CisJCS5yZWdfYml0cyA9IDgsCisJCS52YWxfYml0cyA9IDgsCisJCS5tYXhfcmVnaXN0ZXIgPSAweDBlLAorCX07CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJc3BpLT5tb2RlID0gU1BJX01PREVfMDsKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZjb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIiVzOiByZWdtYXAgYWxsb2NhdGlvbiBmYWlsZWQ6ICVsZFxuIiwKKwkJCV9fZnVuY19fLCBQVFJfRVJSKHJlZ21hcCkpOworCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCX0KKworCXJldHVybiBreHNkOV9jb21tb25fcHJvYmUoJnNwaS0+ZGV2LAorCQkJCSAgcmVnbWFwLAorCQkJCSAgc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQga3hzZDlfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXJldHVybiBreHNkOV9jb21tb25fcmVtb3ZlKCZzcGktPmRldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBreHNkOV9zcGlfaWRbXSA9IHsKKwl7Imt4c2Q5IiwgMH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCBreHNkOV9zcGlfaWQpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIga3hzZDlfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJreHNkOSIsCisJCS5wbSA9ICZreHNkOV9kZXZfcG1fb3BzLAorCX0sCisJLnByb2JlID0ga3hzZDlfc3BpX3Byb2JlLAorCS5yZW1vdmUgPSBreHNkOV9zcGlfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGt4c2Q5X3NwaV9pZCwKK307Cittb2R1bGVfc3BpX2RyaXZlcihreHNkOV9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNAa2VybmVsLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiS2lvbml4IEtYU0Q5IFNQSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL2t4c2Q5LmMgYi9kcml2ZXJzL2lpby9hY2NlbC9reHNkOS5jCmluZGV4IDNhOWYxMDYuLjlhZjYwYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL2t4c2Q5LmMKKysrIGIvZHJpdmVycy9paW8vYWNjZWwva3hzZDkuYwpAQCAtMTIsMTkgKzEyLDI1IEBACiAgKiBJIGhhdmUgYSBzdWl0YWJsZSB3aXJlIG1hZGUgdXAuCiAgKgogICogVE9ETzoJU3VwcG9ydCB0aGUgbW90aW9uIGRldGVjdG9yCi0gKgkJVXNlcyByZWdpc3RlciBhZGRyZXNzIGluY3JlbWVudGluZyBzbyBjb3VsZCBoYXZlIGEKLSAqCQloZWF2aWx5IG9wdGltaXplZCByaW5nIGJ1ZmZlciBhY2Nlc3MgZnVuY3Rpb24uCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KICNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcl9jb25zdW1lci5oPgorCisjaW5jbHVkZSAia3hzZDkuaCIKIAogI2RlZmluZSBLWFNEOV9SRUdfWAkJMHgwMAogI2RlZmluZSBLWFNEOV9SRUdfWQkJMHgwMgpAQCAtMzMsMjggKzM5LDQ1IEBACiAjZGVmaW5lIEtYU0Q5X1JFR19SRVNFVAkJMHgwYQogI2RlZmluZSBLWFNEOV9SRUdfQ1RSTF9DCTB4MGMKIAotI2RlZmluZSBLWFNEOV9GU19NQVNLCQkweDAzCisjZGVmaW5lIEtYU0Q5X0NUUkxfQ19GU19NQVNLCTB4MDMKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0ZTXzhHCTB4MDAKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0ZTXzZHCTB4MDEKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0ZTXzRHCTB4MDIKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0ZTXzJHCTB4MDMKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX01PVF9MQVQJQklUKDMpCisjZGVmaW5lIEtYU0Q5X0NUUkxfQ19NT1RfTEVWCUJJVCg0KQorI2RlZmluZSBLWFNEOV9DVFJMX0NfTFBfTUFTSwkweGUwCisjZGVmaW5lIEtYU0Q5X0NUUkxfQ19MUF9OT05FCTB4MDAKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0xQXzIwMDBIWkMJQklUKDUpCisjZGVmaW5lIEtYU0Q5X0NUUkxfQ19MUF8yMDAwSFpCCUJJVCg2KQorI2RlZmluZSBLWFNEOV9DVFJMX0NfTFBfMjAwMEhaQQkoQklUKDUpfEJJVCg2KSkKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0xQXzEwMDBIWglCSVQoNykKKyNkZWZpbmUgS1hTRDlfQ1RSTF9DX0xQXzUwMEhaCShCSVQoNyl8QklUKDUpKQorI2RlZmluZSBLWFNEOV9DVFJMX0NfTFBfMTAwSFoJKEJJVCg3KXxCSVQoNikpCisjZGVmaW5lIEtYU0Q5X0NUUkxfQ19MUF81MEhaCShCSVQoNyl8QklUKDYpfEJJVCg1KSkKIAogI2RlZmluZSBLWFNEOV9SRUdfQ1RSTF9CCTB4MGQKKworI2RlZmluZSBLWFNEOV9DVFJMX0JfQ0xLX0hMRAlCSVQoNykKKyNkZWZpbmUgS1hTRDlfQ1RSTF9CX0VOQUJMRQlCSVQoNikKKyNkZWZpbmUgS1hTRDlfQ1RSTF9CX1NUCQlCSVQoNSkgLyogU2VsZi10ZXN0ICovCisKICNkZWZpbmUgS1hTRDlfUkVHX0NUUkxfQQkweDBlCiAKLSNkZWZpbmUgS1hTRDlfUkVBRChhKSAoMHg4MCB8IChhKSkKLSNkZWZpbmUgS1hTRDlfV1JJVEUoYSkgKGEpCi0KLSNkZWZpbmUgS1hTRDlfU1RBVEVfUlhfU0laRSAyCi0jZGVmaW5lIEtYU0Q5X1NUQVRFX1RYX1NJWkUgMgogLyoqCiAgKiBzdHJ1Y3Qga3hzZDlfc3RhdGUgLSBkZXZpY2UgcmVsYXRlZCBzdG9yYWdlCi0gKiBAYnVmX2xvY2s6CXByb3RlY3QgdGhlIHJ4IGFuZCB0eCBidWZmZXJzLgotICogQHVzOgkJc3BpIGRldmljZQotICogQHJ4OgkJc2luZ2xlIHJ4IGJ1ZmZlciBzdG9yYWdlCi0gKiBAdHg6CQlzaW5nbGUgdHggYnVmZmVyIHN0b3JhZ2UKLSAqKi8KKyAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIHBhcmVudCBkZXZpY2UKKyAqIEBtYXA6IHJlZ21hcCB0byB0aGUgZGV2aWNlCisgKiBAb3JpZW50YXRpb246IG1vdW50aW5nIG1hdHJpeCwgZmxpcHBlZCBheGlzIGV0YworICogQHJlZ3M6IHJlZ3VsYXRvcnMgZm9yIHRoaXMgZGV2aWNlLCBWREQgYW5kIElPVkRECisgKiBAc2NhbGU6IHRoZSBjdXJyZW50IHNjYWxpbmcgc2V0dGluZworICovCiBzdHJ1Y3Qga3hzZDlfc3RhdGUgewotCXN0cnVjdCBtdXRleCBidWZfbG9jazsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqdXM7Ci0JdTggcnhbS1hTRDlfU1RBVEVfUlhfU0laRV0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwotCXU4IHR4W0tYU0Q5X1NUQVRFX1RYX1NJWkVdOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmVnbWFwICptYXA7CisJc3RydWN0IGlpb19tb3VudF9tYXRyaXggb3JpZW50YXRpb247CisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgcmVnc1syXTsKKwl1OCBzY2FsZTsKIH07CiAKICNkZWZpbmUgS1hTRDlfU0NBTEVfMkcgIjAuMDExOTc4IgpAQCAtNjUsNiArODgsMTQgQEAKIC8qIHJldmVyc2Ugb3JkZXIgKi8KIHN0YXRpYyBjb25zdCBpbnQga3hzZDlfbWljcm9fc2NhbGVzWzRdID0geyA0Nzg1MywgMzU5MzQsIDIzOTI3LCAxMTk3OCB9OwogCisjZGVmaW5lIEtYU0Q5X1pFUk9fR19PRkZTRVQgLTIwNDgKKworLyoKKyAqIFJlZ3VsYXRvciBuYW1lcworICovCitzdGF0aWMgY29uc3QgY2hhciBreHNkOV9yZWdfdmRkW10gPSAidmRkIjsKK3N0YXRpYyBjb25zdCBjaGFyIGt4c2Q5X3JlZ19pb3ZkZFtdID0gImlvdmRkIjsKKwogc3RhdGljIGludCBreHNkOV93cml0ZV9zY2FsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBpbnQgbWljcm8pCiB7CiAJaW50IHJldCwgaTsKQEAgLTc5LDQyICsxMTAsMTcgQEAKIAlpZiAoIWZvdW5kaXQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKLQlyZXQgPSBzcGlfdzhyOChzdC0+dXMsIEtYU0Q5X1JFQUQoS1hTRDlfUkVHX0NUUkxfQykpOworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhzdC0+bWFwLAorCQkJCSBLWFNEOV9SRUdfQ1RSTF9DLAorCQkJCSBLWFNEOV9DVFJMX0NfRlNfTUFTSywKKwkJCQkgaSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3JfcmV0OwotCXN0LT50eFswXSA9IEtYU0Q5X1dSSVRFKEtYU0Q5X1JFR19DVFJMX0MpOwotCXN0LT50eFsxXSA9IChyZXQgJiB+S1hTRDlfRlNfTUFTSykgfCBpOwogCi0JcmV0ID0gc3BpX3dyaXRlKHN0LT51cywgc3QtPnR4LCAyKTsKKwkvKiBDYWNoZWQgc2NhbGUgd2hlbiB0aGUgc2Vuc29yIGlzIHBvd2VyZWQgZG93biAqLworCXN0LT5zY2FsZSA9IGk7CisKIGVycm9yX3JldDoKLQltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBreHNkOV9yZWFkKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHU4IGFkZHJlc3MpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7Ci0JCXsKLQkJCS5iaXRzX3Blcl93b3JkID0gOCwKLQkJCS5sZW4gPSAxLAotCQkJLmRlbGF5X3VzZWNzID0gMjAwLAotCQkJLnR4X2J1ZiA9IHN0LT50eCwKLQkJfSwgewotCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAotCQkJLmxlbiA9IDIsCi0JCQkucnhfYnVmID0gc3QtPnJ4LAotCQl9LAotCX07Ci0KLQltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwotCXN0LT50eFswXSA9IEtYU0Q5X1JFQUQoYWRkcmVzcyk7Ci0JcmV0ID0gc3BpX3N5bmNfdHJhbnNmZXIoc3QtPnVzLCB4ZmVycywgQVJSQVlfU0laRSh4ZmVycykpOwotCWlmICghcmV0KQotCQlyZXQgPSAoKCh1MTYpKHN0LT5yeFswXSkpIDw8IDgpIHwgKHN0LT5yeFsxXSAmIDB4RjApOwotCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzYsNiArMTQyLDkgQEAKIAkJCSAgIGxvbmcgbWFzaykKIHsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoc3QtPmRldik7CiAKIAlpZiAobWFzayA9PSBJSU9fQ0hBTl9JTkZPX1NDQUxFKSB7CiAJCS8qIENoZWNrIG5vIGludGVnZXIgY29tcG9uZW50ICovCkBAIC0xNDQsNiArMTUzLDkgQEAKIAkJcmV0ID0ga3hzZDlfd3JpdGVfc2NhbGUoaW5kaW9fZGV2LCB2YWwyKTsKIAl9CiAKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHN0LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHN0LT5kZXYpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTUzLDQ0ICsxNjUsMTU0IEBACiB7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAJc3RydWN0IGt4c2Q5X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgaW50IHJlZ3ZhbDsKKwlfX2JlMTYgcmF3X3ZhbDsKKwl1MTYgbnZhbDsKKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoc3QtPmRldik7CiAKIAlzd2l0Y2ggKG1hc2spIHsKIAljYXNlIElJT19DSEFOX0lORk9fUkFXOgotCQlyZXQgPSBreHNkOV9yZWFkKGluZGlvX2RldiwgY2hhbi0+YWRkcmVzcyk7Ci0JCWlmIChyZXQgPCAwKQorCQlyZXQgPSByZWdtYXBfYnVsa19yZWFkKHN0LT5tYXAsIGNoYW4tPmFkZHJlc3MsICZyYXdfdmFsLAorCQkJCSAgICAgICBzaXplb2YocmF3X3ZhbCkpOworCQlpZiAocmV0KQogCQkJZ290byBlcnJvcl9yZXQ7Ci0JCSp2YWwgPSByZXQ7CisJCW52YWwgPSBiZTE2X3RvX2NwdShyYXdfdmFsKTsKKwkJLyogT25seSAxMiBiaXRzIGFyZSB2YWxpZCAqLworCQludmFsID4+PSA0OworCQkqdmFsID0gbnZhbDsKKwkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCWJyZWFrOworCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6CisJCS8qIFRoaXMgaGFzIGEgYmlhcyBvZiAtMjA0OCAqLworCQkqdmFsID0gS1hTRDlfWkVST19HX09GRlNFVDsKKwkJcmV0ID0gSUlPX1ZBTF9JTlQ7CiAJCWJyZWFrOwogCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKLQkJcmV0ID0gc3BpX3c4cjgoc3QtPnVzLCBLWFNEOV9SRUFEKEtYU0Q5X1JFR19DVFJMX0MpKTsKKwkJcmV0ID0gcmVnbWFwX3JlYWQoc3QtPm1hcCwKKwkJCQkgIEtYU0Q5X1JFR19DVFJMX0MsCisJCQkJICAmcmVndmFsKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGVycm9yX3JldDsKLQkJKnZhbDIgPSBreHNkOV9taWNyb19zY2FsZXNbcmV0ICYgS1hTRDlfRlNfTUFTS107CisJCSp2YWwgPSAwOworCQkqdmFsMiA9IGt4c2Q5X21pY3JvX3NjYWxlc1tyZWd2YWwgJiBLWFNEOV9DVFJMX0NfRlNfTUFTS107CiAJCXJldCA9IElJT19WQUxfSU5UX1BMVVNfTUlDUk87CiAJCWJyZWFrOwogCX0KIAogZXJyb3JfcmV0OgorCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koc3QtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoc3QtPmRldik7CisKIAlyZXR1cm4gcmV0OwogfTsKLSNkZWZpbmUgS1hTRDlfQUNDRUxfQ0hBTihheGlzKQkJCQkJCVwKKworc3RhdGljIGlycXJldHVybl90IGt4c2Q5X3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQoreworCWNvbnN0IHN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CisJc3RydWN0IGt4c2Q5X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKwkvKiA0ICogMTZiaXQgdmFsdWVzIEFORCB0aW1lc3RhbXAgKi8KKwlfX2JlMTYgaHdfdmFsdWVzWzhdOworCisJcmV0ID0gcmVnbWFwX2J1bGtfcmVhZChzdC0+bWFwLAorCQkJICAgICAgIEtYU0Q5X1JFR19YLAorCQkJICAgICAgICZod192YWx1ZXMsCisJCQkgICAgICAgOCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHN0LT5kZXYsCisJCQkiZXJyb3IgcmVhZGluZyBkYXRhXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwKKwkJCQkJICAgaHdfdmFsdWVzLAorCQkJCQkgICBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KSk7CisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBreHNkOV9idWZmZXJfcHJlZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGt4c2Q5X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKHN0LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga3hzZDlfYnVmZmVyX3Bvc3RkaXNhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGt4c2Q5X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHN0LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHN0LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMga3hzZDlfYnVmZmVyX3NldHVwX29wcyA9IHsKKwkucHJlZW5hYmxlID0ga3hzZDlfYnVmZmVyX3ByZWVuYWJsZSwKKwkucG9zdGVuYWJsZSA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUsCisJLnByZWRpc2FibGUgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAorCS5wb3N0ZGlzYWJsZSA9IGt4c2Q5X2J1ZmZlcl9wb3N0ZGlzYWJsZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX21vdW50X21hdHJpeCAqCitreHNkOV9nZXRfbW91bnRfbWF0cml4KGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbikKK3sKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJldHVybiAmc3QtPm9yaWVudGF0aW9uOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWNfZXh0X2luZm8ga3hzZDlfZXh0X2luZm9bXSA9IHsKKwlJSU9fTU9VTlRfTUFUUklYKElJT19TSEFSRURfQllfVFlQRSwga3hzZDlfZ2V0X21vdW50X21hdHJpeCksCisJeyB9LAorfTsKKworI2RlZmluZSBLWFNEOV9BQ0NFTF9DSEFOKGF4aXMsIGluZGV4KQkJCQkJCVwKIAl7CQkJCQkJCQlcCiAJCS50eXBlID0gSUlPX0FDQ0VMLAkJCQkJXAogCQkubW9kaWZpZWQgPSAxLAkJCQkJCVwKIAkJLmNoYW5uZWwyID0gSUlPX01PRF8jI2F4aXMsCQkJCVwKIAkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCQlcCi0JCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCVwKKwkJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8CVwKKwkJCQkJQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwJXAorCQkuZXh0X2luZm8gPSBreHNkOV9leHRfaW5mbywJCQkJXAogCQkuYWRkcmVzcyA9IEtYU0Q5X1JFR18jI2F4aXMsCQkJCVwKKwkJLnNjYW5faW5kZXggPSBpbmRleCwJCQkJCVwKKwkJLnNjYW5fdHlwZSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkuc2lnbiA9ICd1JywJCQkJCVwKKwkJCS5yZWFsYml0cyA9IDEyLAkJCQkJXAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCQkJCVwKKwkJCS5zaGlmdCA9IDQsCQkJCQlcCisJCQkuZW5kaWFubmVzcyA9IElJT19CRSwJCQkJXAorCQl9LAkJCQkJCQlcCiAJfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMga3hzZDlfY2hhbm5lbHNbXSA9IHsKLQlLWFNEOV9BQ0NFTF9DSEFOKFgpLCBLWFNEOV9BQ0NFTF9DSEFOKFkpLCBLWFNEOV9BQ0NFTF9DSEFOKFopLAorCUtYU0Q5X0FDQ0VMX0NIQU4oWCwgMCksCisJS1hTRDlfQUNDRUxfQ0hBTihZLCAxKSwKKwlLWFNEOV9BQ0NFTF9DSEFOKFosIDIpLAogCXsKIAkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKIAkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCiAJCS5pbmRleGVkID0gMSwKIAkJLmFkZHJlc3MgPSBLWFNEOV9SRUdfQVVYLAotCX0KKwkJLnNjYW5faW5kZXggPSAzLAorCQkuc2Nhbl90eXBlID0geworCQkJLnNpZ24gPSAndScsCisJCQkucmVhbGJpdHMgPSAxMiwKKwkJCS5zdG9yYWdlYml0cyA9IDE2LAorCQkJLnNoaWZ0ID0gNCwKKwkJCS5lbmRpYW5uZXNzID0gSUlPX0JFLAorCQl9LAorCX0sCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNCksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBreHNkOV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CkBAIC0yMDEsMTcgKzMyMyw2OSBAQAogewogCWludCByZXQ7CiAKLQlzdC0+dHhbMF0gPSAweDBkOwotCXN0LT50eFsxXSA9IDB4NDA7Ci0JcmV0ID0gc3BpX3dyaXRlKHN0LT51cywgc3QtPnR4LCAyKTsKKwkvKiBFbmFibGUgdGhlIHJlZ3VsYXRvcnMgKi8KKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShzdC0+cmVncyksIHN0LT5yZWdzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc3QtPmRldiwgIkNhbm5vdCBlbmFibGUgcmVndWxhdG9yc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogUG93ZXIgdXAgKi8KKwlyZXQgPSByZWdtYXBfd3JpdGUoc3QtPm1hcCwKKwkJCSAgIEtYU0Q5X1JFR19DVFJMX0IsCisJCQkgICBLWFNEOV9DVFJMX0JfRU5BQkxFKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jc3QtPnR4WzBdID0gMHgwYzsKLQlzdC0+dHhbMV0gPSAweDliOwotCXJldHVybiBzcGlfd3JpdGUoc3QtPnVzLCBzdC0+dHgsIDIpOworCS8qCisJICogU2V0IDEwMDBIeiBMUEYsIDJnIGZ1bGxzY2FsZSwgbW90aW9uIHdha2V1cCB0aHJlc2hvbGQgMWcsCisJICogbGF0Y2hlZCB3YWtldXAKKwkgKi8KKwlyZXQgPSByZWdtYXBfd3JpdGUoc3QtPm1hcCwKKwkJCSAgIEtYU0Q5X1JFR19DVFJMX0MsCisJCQkgICBLWFNEOV9DVFJMX0NfTFBfMTAwMEhaIHwKKwkJCSAgIEtYU0Q5X0NUUkxfQ19NT1RfTEVWCXwKKwkJCSAgIEtYU0Q5X0NUUkxfQ19NT1RfTEFUIHwKKwkJCSAgIHN0LT5zY2FsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogUG93ZXItdXAgdGltZSBkZXBlbmRzIG9uIHRoZSBMUEYgc2V0dGluZywgYnV0IHR5cCAxNS45IG1zLCBsZXQncworCSAqIHNldCAyMCBtcyB0byBhbGxvdyBmb3Igc29tZSBzbGFjay4KKwkgKi8KKwltc2xlZXAoMjApOworCisJcmV0dXJuIDA7CiB9OwogCitzdGF0aWMgaW50IGt4c2Q5X3Bvd2VyX2Rvd24oc3RydWN0IGt4c2Q5X3N0YXRlICpzdCkKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBTZXQgaW50byBsb3cgcG93ZXIgbW9kZSAtIHNpbmNlIHRoZXJlIG1heSBiZSBtb3JlIHVzZXJzIG9mIHRoZQorCSAqIHJlZ3VsYXRvcnMgdGhpcyBpcyB0aGUgZmlyc3Qgc3RlcCBvZiB0aGUgcG93ZXIgc2F2aW5nOiBpdCB3aWxsCisJICogbWFrZSBzdXJlIHdlIGNvbnNlcnZlIHBvd2VyIGV2ZW4gaWYgdGhlcmUgYXJlIG90aGVycyB1c2VycyBvbiB0aGUKKwkgKiByZWd1bGF0b3JzLgorCSAqLworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhzdC0+bWFwLAorCQkJCSBLWFNEOV9SRUdfQ1RSTF9CLAorCQkJCSBLWFNEOV9DVFJMX0JfRU5BQkxFLAorCQkJCSAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRGlzYWJsZSB0aGUgcmVndWxhdG9ycyAqLworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShzdC0+cmVncyksIHN0LT5yZWdzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc3QtPmRldiwgIkNhbm5vdCBkaXNhYmxlIHJlZ3VsYXRvcnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGt4c2Q5X2luZm8gPSB7CiAJLnJlYWRfcmF3ID0gJmt4c2Q5X3JlYWRfcmF3LAogCS53cml0ZV9yYXcgPSAma3hzZDlfd3JpdGVfcmF3LApAQCAtMjE5LDU3ICszOTMsMTM2IEBACiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpbnQga3hzZDlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKKy8qIEZvdXIgY2hhbm5lbHMgYXBhcnQgZnJvbSB0aW1lc3RhbXAsIHNjYW4gbWFzayA9IDB4MGYgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGt4c2Q5X3NjYW5fbWFza3NbXSA9IHsgMHhmLCAwIH07CisKK2ludCBreHNkOV9jb21tb25fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IHJlZ21hcCAqbWFwLAorCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwogCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3Q7CisJaW50IHJldDsKIAotCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmc3BpLT5kZXYsIHNpemVvZigqc3QpKTsKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoZGV2LCBzaXplb2YoKnN0KSk7CiAJaWYgKCFpbmRpb19kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGluZGlvX2Rldik7CisJc3QtPmRldiA9IGRldjsKKwlzdC0+bWFwID0gbWFwOwogCi0Jc3QtPnVzID0gc3BpOwotCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CiAJaW5kaW9fZGV2LT5jaGFubmVscyA9IGt4c2Q5X2NoYW5uZWxzOwogCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShreHNkOV9jaGFubmVscyk7Ci0JaW5kaW9fZGV2LT5uYW1lID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+bmFtZTsKLQlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJaW5kaW9fZGV2LT5uYW1lID0gbmFtZTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSBkZXY7CiAJaW5kaW9fZGV2LT5pbmZvID0gJmt4c2Q5X2luZm87CiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+YXZhaWxhYmxlX3NjYW5fbWFza3MgPSBreHNkOV9zY2FuX21hc2tzOwogCi0Jc3BpLT5tb2RlID0gU1BJX01PREVfMDsKLQlzcGlfc2V0dXAoc3BpKTsKKwkvKiBSZWFkIHRoZSBtb3VudGluZyBtYXRyaXgsIGlmIHByZXNlbnQgKi8KKwlyZXQgPSBvZl9paW9fcmVhZF9tb3VudF9tYXRyaXgoZGV2LAorCQkJCSAgICAgICAibW91bnQtbWF0cml4IiwKKwkJCQkgICAgICAgJnN0LT5vcmllbnRhdGlvbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEZldGNoIGFuZCB0dXJuIG9uIHJlZ3VsYXRvcnMgKi8KKwlzdC0+cmVnc1swXS5zdXBwbHkgPSBreHNkOV9yZWdfdmRkOworCXN0LT5yZWdzWzFdLnN1cHBseSA9IGt4c2Q5X3JlZ19pb3ZkZDsKKwlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldChkZXYsCisJCQkJICAgICAgQVJSQVlfU0laRShzdC0+cmVncyksCisJCQkJICAgICAgc3QtPnJlZ3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZ2V0IHJlZ3VsYXRvcnNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBEZWZhdWx0IHNjYWxpbmcgKi8KKwlzdC0+c2NhbGUgPSBLWFNEOV9DVFJMX0NfRlNfMkc7CisKIAlreHNkOV9wb3dlcl91cChzdCk7CiAKLQlyZXR1cm4gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotfQorCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwKKwkJCQkJIGlpb19wb2xsZnVuY19zdG9yZV90aW1lLAorCQkJCQkga3hzZDlfdHJpZ2dlcl9oYW5kbGVyLAorCQkJCQkgJmt4c2Q5X2J1ZmZlcl9zZXR1cF9vcHMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJ0cmlnZ2VyZWQgYnVmZmVyIHNldHVwIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX3Bvd2VyX2Rvd247CisJfQogCi1zdGF0aWMgaW50IGt4c2Q5X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQorCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9jbGVhbnVwX2J1ZmZlcjsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGluZGlvX2Rldik7CisKKwkvKiBFbmFibGUgcnVudGltZSBQTSAqLworCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGRldik7CisJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwkvKgorCSAqIFNldCBhdXRvc3VzcGVuZCB0byB0d28gb3JkZXJzIG9mIG1hZ25pdHVkZSBsYXJnZXIgdGhhbiB0aGUKKwkgKiBzdGFydC11cCB0aW1lLiAyMG1zIHN0YXJ0LXVwIHRpbWUgbWVhbnMgMjAwMG1zIGF1dG9zdXNwZW5kLAorCSAqIGkuZS4gMiBzZWNvbmRzLgorCSAqLworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KGRldiwgMjAwMCk7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoZGV2KTsKKwlwbV9ydW50aW1lX3B1dChkZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9jbGVhbnVwX2J1ZmZlcjoKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CitlcnJfcG93ZXJfZG93bjoKKwlreHNkOV9wb3dlcl9kb3duKHN0KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGt4c2Q5X2NvbW1vbl9wcm9iZSk7CisKK2ludCBreHNkOV9jb21tb25fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3BpX2dldF9kcnZkYXRhKHNwaSkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CisJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJa3hzZDlfcG93ZXJfZG93bihzdCk7CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woa3hzZDlfY29tbW9uX3JlbW92ZSk7CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBreHNkOV9pZFtdID0gewotCXsia3hzZDkiLCAwfSwKLQl7IH0sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGt4c2Q5X2lkKTsKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQga3hzZDlfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGt4c2Q5X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBreHNkOV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAia3hzZDkiLAotCX0sCi0JLnByb2JlID0ga3hzZDlfcHJvYmUsCi0JLnJlbW92ZSA9IGt4c2Q5X3JlbW92ZSwKLQkuaWRfdGFibGUgPSBreHNkOV9pZCwKKwlyZXR1cm4ga3hzZDlfcG93ZXJfZG93bihzdCk7Cit9CisKK3N0YXRpYyBpbnQga3hzZDlfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJldHVybiBreHNkOV9wb3dlcl91cChzdCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK2NvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGt4c2Q5X2Rldl9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocG1fcnVudGltZV9mb3JjZV9zdXNwZW5kLAorCQkJCXBtX3J1bnRpbWVfZm9yY2VfcmVzdW1lKQorCVNFVF9SVU5USU1FX1BNX09QUyhreHNkOV9ydW50aW1lX3N1c3BlbmQsCisJCQkgICBreHNkOV9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKIH07Ci1tb2R1bGVfc3BpX2RyaXZlcihreHNkOV9kcml2ZXIpOworRVhQT1JUX1NZTUJPTChreHNkOV9kZXZfcG1fb3BzKTsKIAogTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNAa2VybmVsLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiS2lvbml4IEtYU0Q5IFNQSSBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiS2lvbml4IEtYU0Q5IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwva3hzZDkuaCBiL2RyaXZlcnMvaWlvL2FjY2VsL2t4c2Q5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4YTI4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL2t4c2Q5LmgKQEAgLTAsMCArMSwxMiBAQAorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjZGVmaW5lIEtYU0Q5X1NUQVRFX1JYX1NJWkUgMgorI2RlZmluZSBLWFNEOV9TVEFURV9UWF9TSVpFIDIKKworaW50IGt4c2Q5X2NvbW1vbl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgcmVnbWFwICptYXAsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKK2ludCBreHNkOV9jb21tb25fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBreHNkOV9kZXZfcG1fb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvbWMzMjMwLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9tYzMyMzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWEyZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvbWMzMjMwLmMKQEAgLTAsMCArMSwyMTEgQEAKKy8qKgorICogbUN1YmUgTUMzMjMwIDMtQXhpcyBBY2NlbGVyb21ldGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBJSU8gZHJpdmVyIGZvciBtQ3ViZSBNQzMyMzA7IDctYml0IEkyQyBhZGRyZXNzOiAweDRjLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisKKyNkZWZpbmUgTUMzMjMwX1JFR19YT1VUCQkJMHgwMAorI2RlZmluZSBNQzMyMzBfUkVHX1lPVVQJCQkweDAxCisjZGVmaW5lIE1DMzIzMF9SRUdfWk9VVAkJCTB4MDIKKworI2RlZmluZSBNQzMyMzBfUkVHX01PREUJCQkweDA3CisjZGVmaW5lIE1DMzIzMF9NT0RFX09QQ09OX01BU0sJCTB4MDMKKyNkZWZpbmUgTUMzMjMwX01PREVfT1BDT05fV0FLRQkJMHgwMQorI2RlZmluZSBNQzMyMzBfTU9ERV9PUENPTl9TVEFOREJZCTB4MDMKKworI2RlZmluZSBNQzMyMzBfUkVHX0NISVBfSUQJCTB4MTgKKyNkZWZpbmUgTUMzMjMwX0NISVBfSUQJCQkweDAxCisKKyNkZWZpbmUgTUMzMjMwX1JFR19QUk9EVUNUX0NPREUJCTB4M2IKKyNkZWZpbmUgTUMzMjMwX1BST0RVQ1RfQ09ERQkJMHgxOQorCisvKgorICogVGhlIGFjY2VsZXJvbWV0ZXIgaGFzIG9uZSBtZWFzdXJlbWVudCByYW5nZToKKyAqCisgKiAtMS41ZyAtICsxLjVnICg4LWJpdCwgc2lnbmVkKQorICoKKyAqIHNjYWxlID0gKDEuNSArIDEuNSkgKiA5LjgxIC8gKDJeOCAtIDEpCT0gMC4xMTU0MTE3NjUKKyAqLworCitzdGF0aWMgY29uc3QgaW50IG1jMzIzMF9uc2NhbGUgPSAxMTU0MTE3NjU7CisKKyNkZWZpbmUgTUMzMjMwX0NIQU5ORUwocmVnLCBheGlzKSB7CVwKKwkudHlwZSA9IElJT19BQ0NFTCwJXAorCS5hZGRyZXNzID0gcmVnLAlcCisJLm1vZGlmaWVkID0gMSwJXAorCS5jaGFubmVsMiA9IElJT19NT0RfIyNheGlzLAlcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCVwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAlcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBtYzMyMzBfY2hhbm5lbHNbXSA9IHsKKwlNQzMyMzBfQ0hBTk5FTChNQzMyMzBfUkVHX1hPVVQsIFgpLAorCU1DMzIzMF9DSEFOTkVMKE1DMzIzMF9SRUdfWU9VVCwgWSksCisJTUMzMjMwX0NIQU5ORUwoTUMzMjMwX1JFR19aT1VULCBaKSwKK307CisKK3N0cnVjdCBtYzMyMzBfZGF0YSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKK307CisKK3N0YXRpYyBpbnQgbWMzMjMwX3NldF9vcGNvbihzdHJ1Y3QgbWMzMjMwX2RhdGEgKmRhdGEsIGludCBvcGNvbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQzMyMzBfUkVHX01PREUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgbW9kZSByZWc6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCAmPSB+TUMzMjMwX01PREVfT1BDT05fTUFTSzsKKwlyZXQgfD0gb3Bjb247CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTUMzMjMwX1JFR19NT0RFLCByZXQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHdyaXRlIG1vZGUgcmVnOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYzMyMzBfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCQlpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IG1jMzIzMF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgY2hhbi0+YWRkcmVzcyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHNpZ25fZXh0ZW5kMzIocmV0LCA3KTsKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJKnZhbCA9IDA7CisJCSp2YWwyID0gbWMzMjMwX25zY2FsZTsKKwkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTkFOTzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbWMzMjMwX2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUJPSBUSElTX01PRFVMRSwKKwkucmVhZF9yYXcJPSBtYzMyMzBfcmVhZF9yYXcsCit9OworCitzdGF0aWMgaW50IG1jMzIzMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgbWMzMjMwX2RhdGEgKmRhdGE7CisKKwkvKiBGaXJzdCBjaGVjayBjaGlwLWlkIGFuZCBwcm9kdWN0LWlkICovCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUMzMjMwX1JFR19DSElQX0lEKTsKKwlpZiAocmV0ICE9IE1DMzIzMF9DSElQX0lEKQorCQlyZXR1cm4gKHJldCA8IDApID8gcmV0IDogLUVOT0RFVjsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1DMzIzMF9SRUdfUFJPRFVDVF9DT0RFKTsKKwlpZiAocmV0ICE9IE1DMzIzMF9QUk9EVUNUX0NPREUpCisJCXJldHVybiAocmV0IDwgMCkgPyByZXQgOiAtRU5PREVWOworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFpbmRpb19kZXYpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJpaW8gYWxsb2NhdGlvbiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJaW5kaW9fZGV2LT5pbmZvID0gJm1jMzIzMF9pbmZvOworCWluZGlvX2Rldi0+bmFtZSA9ICJtYzMyMzAiOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gbWMzMjMwX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShtYzMyMzBfY2hhbm5lbHMpOworCisJcmV0ID0gbWMzMjMwX3NldF9vcGNvbihkYXRhLCBNQzMyMzBfTU9ERV9PUENPTl9XQUtFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImRldmljZV9yZWdpc3RlciBmYWlsZWRcbiIpOworCQltYzMyMzBfc2V0X29wY29uKGRhdGEsIE1DMzIzMF9NT0RFX09QQ09OX1NUQU5EQlkpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWMzMjMwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCisJcmV0dXJuIG1jMzIzMF9zZXRfb3Bjb24oaWlvX3ByaXYoaW5kaW9fZGV2KSwgTUMzMjMwX01PREVfT1BDT05fU1RBTkRCWSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgbWMzMjMwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtYzMyMzBfZGF0YSAqZGF0YTsKKworCWRhdGEgPSBpaW9fcHJpdihpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKSk7CisKKwlyZXR1cm4gbWMzMjMwX3NldF9vcGNvbihkYXRhLCBNQzMyMzBfTU9ERV9PUENPTl9TVEFOREJZKTsKK30KKworc3RhdGljIGludCBtYzMyMzBfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWMzMjMwX2RhdGEgKmRhdGE7CisKKwlkYXRhID0gaWlvX3ByaXYoaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSkpOworCisJcmV0dXJuIG1jMzIzMF9zZXRfb3Bjb24oZGF0YSwgTUMzMjMwX01PREVfT1BDT05fV0FLRSk7Cit9CisjZW5kaWYKKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG1jMzIzMF9wbV9vcHMsIG1jMzIzMF9zdXNwZW5kLCBtYzMyMzBfcmVzdW1lKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1jMzIzMF9pMmNfaWRbXSA9IHsKKwl7Im1jMzIzMCIsIDB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1jMzIzMF9pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWMzMjMwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtYzMyMzAiLAorCQkucG0gPSAmbWMzMjMwX3BtX29wcywKKwl9LAorCS5wcm9iZQkJPSBtYzMyMzBfcHJvYmUsCisJLnJlbW92ZQkJPSBtYzMyMzBfcmVtb3ZlLAorCS5pZF90YWJsZQk9IG1jMzIzMF9pMmNfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihtYzMyMzBfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigibUN1YmUgTUMzMjMwIDMtQXhpcyBBY2NlbGVyb21ldGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvbW1hNzY2MC5jIGIvZHJpdmVycy9paW8vYWNjZWwvbW1hNzY2MC5jCmluZGV4IDBhY2RlZTUuLjAzYmVhZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL21tYTc2NjAuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9tbWE3NjYwLmMKQEAgLTI1MSw2ICsyNTEsNyBAQAogCXsibW1hNzY2MCIsIDB9LAogCXt9CiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1tYTc2NjBfaTJjX2lkKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBtbWE3NjYwX2FjcGlfaWRbXSA9IHsKIAl7Ik1NQTc2NjAiLCAwfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL214YzYyNTUuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL214YzYyNTUuYwppbmRleCA5N2NjZGU3Li4wYWJhZDY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9teGM2MjU1LmMKKysrIGIvZHJpdmVycy9paW8vYWNjZWwvbXhjNjI1NS5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoY2hpcF9pZCAhPSBNWEM2MjU1X0NISVBfSUQpIHsKKwlpZiAoKGNoaXBfaWQgJiAweDFmKSAhPSBNWEM2MjU1X0NISVBfSUQpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJbnZhbGlkIGNoaXAgaWQgJXhcbiIsIGNoaXBfaWQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xNzEsMTIgKzE3MSwxNCBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIG14YzYyNTVfYWNwaV9tYXRjaFtdID0geworCXsiTVhDNjIyNSIsCTB9LAogCXsiTVhDNjI1NSIsCTB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgbXhjNjI1NV9hY3BpX21hdGNoKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG14YzYyNTVfaWRbXSA9IHsKKwl7Im14YzYyMjUiLAkwfSwKIAl7Im14YzYyNTUiLAkwfSwKIAl7IH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9zc3BfYWNjZWxfc2Vuc29yLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9zc3BfYWNjZWxfc2Vuc29yLmMKaW5kZXggNGFlMDVmYy4uMzFkYjAwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvc3NwX2FjY2VsX3NlbnNvci5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL3NzcF9hY2NlbF9zZW5zb3IuYwpAQCAtNzQsNyArNzQsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IGlpb19pbmZvIHNzcF9hY2NlbF9paW9faW5mbyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gc3NwX2FjY2VsX2lpb19pbmZvID0gewogCS5yZWFkX3JhdyA9ICZzc3BfYWNjZWxfcmVhZF9yYXcsCiAJLndyaXRlX3JhdyA9ICZzc3BfYWNjZWxfd3JpdGVfcmF3LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnIGIvZHJpdmVycy9paW8vYWRjL0tjb25maWcKaW5kZXggMWRlMzFiZGQuLjdlZGNmMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCkBAIC0yNjQsNiArMjY0LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCBscGMxOHh4X2FkYy4KIAorY29uZmlnIExUQzI0ODUKKwl0cmlzdGF0ZSAiTGluZWFyIFRlY2hub2xvZ3kgTFRDMjQ4NSBBREMgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzI0ODUgQURDLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBsdGMyNDg1LgorCiBjb25maWcgTUFYMTAyNwogCXRyaXN0YXRlICJNYXhpbSBtYXgxMDI3IEFEQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBTUEkKQEAgLTMxNyw2ICszMjYsMTkgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgbWNwMzQyMi4KIAorY29uZmlnIE1FRElBVEVLX01UNjU3N19BVVhBREMKKyAgICAgICAgdHJpc3RhdGUgIk1lZGlhVGVrIEFVWEFEQyBkcml2ZXIiCisgICAgICAgIGRlcGVuZHMgb24gQVJDSF9NRURJQVRFSyB8fCBDT01QSUxFX1RFU1QKKyAgICAgICAgZGVwZW5kcyBvbiBIQVNfSU9NRU0KKyAgICAgICAgaGVscAorICAgICAgICAgIFNheSB5ZXMgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgTWVkaWFUZWsgbXQ2NXh4IEFVWEFEQy4KKworICAgICAgICAgIFRoZSBkcml2ZXIgc3VwcG9ydHMgaW1tZWRpYXRlIG1vZGUgb3BlcmF0aW9uIHRvIHJlYWQgZnJvbSBvbmUgb2Ygc2l4dGVlbgorICAgICAgICAgIGNoYW5uZWxzIChleHRlcm5hbCBvciBpbnRlcm5hbCkuCisKKyAgICAgICAgICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbCBiZQorICAgICAgICAgIGNhbGxlZCBtdDY1NzdfYXV4YWRjLgorCiBjb25maWcgTUVOX1oxODhfQURDCiAJdHJpc3RhdGUgIk1FTiAxNnoxODggQURDIElQIENvcmUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1DQgpAQCAtMzg5LDYgKzQxMSw3IEBACiBjb25maWcgUk9DS0NISVBfU0FSQURDCiAJdHJpc3RhdGUgIlJvY2tjaGlwIFNBUkFEQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBBUkNIX1JPQ0tDSElQIHx8IChBUk0gJiYgQ09NUElMRV9URVNUKQorCWRlcGVuZHMgb24gUkVTRVRfQ09OVFJPTExFUgogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgU0FSQURDIGZvdW5kIGluIFNvQ3MgZnJvbQogCSAgUm9ja2NoaXAuCkBAIC0zOTYsNiArNDE5LDIxIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCByb2NrY2hpcF9zYXJhZGMuCiAKK2NvbmZpZyBTVFgxMDQKKwl0cmlzdGF0ZSAiQXBleCBFbWJlZGRlZCBTeXN0ZW1zIFNUWDEwNCBkcml2ZXIiCisJZGVwZW5kcyBvbiBYODYgJiYgSVNBX0JVU19BUEkKKwlzZWxlY3QgR1BJT0xJQgorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgQXBleCBFbWJlZGRlZCBTeXN0ZW1zIFNUWDEwNAorCSAgaW50ZWdyYXRlZCBhbmFsb2cgUEMvMTA0IGNhcmQuCisKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSAxNiBjaGFubmVscyBvZiBzaW5nbGUtZW5kZWQgKDggY2hhbm5lbHMgb2YKKwkgIGRpZmZlcmVudGlhbCkgYW5hbG9nIGlucHV0cywgMiBjaGFubmVscyBvZiBhbmFsb2cgb3V0cHV0LCA0IGRpZ2l0YWwKKwkgIGlucHV0cywgYW5kIDQgZGlnaXRhbCBvdXRwdXRzIHByb3ZpZGVkIGJ5IHRoZSBTVFgxMDQuCisKKwkgIFRoZSBiYXNlIHBvcnQgYWRkcmVzc2VzIGZvciB0aGUgZGV2aWNlcyBtYXkgYmUgY29uZmlndXJlZCB2aWEgdGhlIGJhc2UKKwkgIGFycmF5IG1vZHVsZSBwYXJhbWV0ZXIuCisKIGNvbmZpZyBUSV9BREMwODFDCiAJdHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIEFEQzA4MUMvQURDMTAxQy9BREMxMjFDIGZhbWlseSIKIAlkZXBlbmRzIG9uIEkyQwpAQCAtNDE2LDYgKzQ1NCwxOCBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCB0aS1hZGMwODMyLgogCitjb25maWcgVElfQURDMTIxMzgKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgQURDMTIxMzAvQURDMTIxMzIvQURDMTIxMzgiCisJZGVwZW5kcyBvbiBTUEkKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBUZXhhcyBJbnN0cnVtZW50cyBBREMxMjEzMCwKKwkgIEFEQzEyMTMyIGFuZCBBREMxMjEzOCBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB0aS1hZGMxMjEzOC4KKwogY29uZmlnIFRJX0FEQzEyOFMwNTIKIAl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgQURDMTI4UzA1Mi9BREMxMjJTMDIxL0FEQzEyNFMwMjEiCiAJZGVwZW5kcyBvbiBTUEkKQEAgLTQyNiw2ICs0NzYsMTggQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCiAJICBjYWxsZWQgdGktYWRjMTI4czA1Mi4KIAorY29uZmlnIFRJX0FEQzE2MVM2MjYKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgQURDMTYxUzYyNiAxLWNoYW5uZWwgZGlmZmVyZW50aWFsIEFEQyIKKwlkZXBlbmRzIG9uIFNQSQorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIFRleGFzIEluc3RydW1lbnRzIEFEQzE0MVM2MjYsCisJICBhbmQgQURDMTYxUzYyNiBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCB0aS1hZGMxNjFzNjI2LgorCiBjb25maWcgVElfQURTMTAxNQogCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBBRFMxMDE1IEFEQyIKIAlkZXBlbmRzIG9uIEkyQyAmJiAhU0VOU09SU19BRFMxMDE1CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUKaW5kZXggMGJhMGQ1MC4uN2E0MGMwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZQpAQCAtMjcsMTAgKzI3LDEyIEBACiBvYmotJChDT05GSUdfSU5BMlhYX0FEQykgKz0gaW5hMnh4LWFkYy5vCiBvYmotJChDT05GSUdfTFA4Nzg4X0FEQykgKz0gbHA4Nzg4X2FkYy5vCiBvYmotJChDT05GSUdfTFBDMThYWF9BREMpICs9IGxwYzE4eHhfYWRjLm8KK29iai0kKENPTkZJR19MVEMyNDg1KSArPSBsdGMyNDg1Lm8KIG9iai0kKENPTkZJR19NQVgxMDI3KSArPSBtYXgxMDI3Lm8KIG9iai0kKENPTkZJR19NQVgxMzYzKSArPSBtYXgxMzYzLm8KIG9iai0kKENPTkZJR19NQ1AzMjBYKSArPSBtY3AzMjB4Lm8KIG9iai0kKENPTkZJR19NQ1AzNDIyKSArPSBtY3AzNDIyLm8KK29iai0kKENPTkZJR19NRURJQVRFS19NVDY1NzdfQVVYQURDKSArPSBtdDY1NzdfYXV4YWRjLm8KIG9iai0kKENPTkZJR19NRU5fWjE4OF9BREMpICs9IG1lbl96MTg4X2FkYy5vCiBvYmotJChDT05GSUdfTVhTX0xSQURDKSArPSBteHMtbHJhZGMubwogb2JqLSQoQ09ORklHX05BVTc4MDIpICs9IG5hdTc4MDIubwpAQCAtMzgsOSArNDAsMTIgQEAKIG9iai0kKENPTkZJR19RQ09NX1NQTUlfSUFEQykgKz0gcWNvbS1zcG1pLWlhZGMubwogb2JqLSQoQ09ORklHX1FDT01fU1BNSV9WQURDKSArPSBxY29tLXNwbWktdmFkYy5vCiBvYmotJChDT05GSUdfUk9DS0NISVBfU0FSQURDKSArPSByb2NrY2hpcF9zYXJhZGMubworb2JqLSQoQ09ORklHX1NUWDEwNCkgKz0gc3R4MTA0Lm8KIG9iai0kKENPTkZJR19USV9BREMwODFDKSArPSB0aS1hZGMwODFjLm8KIG9iai0kKENPTkZJR19USV9BREMwODMyKSArPSB0aS1hZGMwODMyLm8KK29iai0kKENPTkZJR19USV9BREMxMjEzOCkgKz0gdGktYWRjMTIxMzgubwogb2JqLSQoQ09ORklHX1RJX0FEQzEyOFMwNTIpICs9IHRpLWFkYzEyOHMwNTIubworb2JqLSQoQ09ORklHX1RJX0FEQzE2MVM2MjYpICs9IHRpLWFkYzE2MXM2MjYubwogb2JqLSQoQ09ORklHX1RJX0FEUzEwMTUpICs9IHRpLWFkczEwMTUubwogb2JqLSQoQ09ORklHX1RJX0FEUzg2ODgpICs9IHRpLWFkczg2ODgubwogb2JqLSQoQ09ORklHX1RJX0FNMzM1WF9BREMpICs9IHRpX2FtMzM1eF9hZGMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL2FkNzI2Ni5jIGIvZHJpdmVycy9paW8vYWRjL2FkNzI2Ni5jCmluZGV4IGMwZjZhOTguLmI4ZDVjZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9hZDcyNjYuYworKysgYi9kcml2ZXJzL2lpby9hZGMvYWQ3MjY2LmMKQEAgLTQ4MSw3ICs0ODEsNyBAQAogCWlmICghc3QtPmZpeGVkX2FkZHIpCiAJCWdwaW9fZnJlZV9hcnJheShzdC0+Z3Bpb3MsIEFSUkFZX1NJWkUoc3QtPmdwaW9zKSk7CiBlcnJvcl9kaXNhYmxlX3JlZzoKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKHN0LT5yZWcpKQorCWlmICghSVNfRVJSKHN0LT5yZWcpKQogCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKIAogCXJldHVybiByZXQ7CkBAIC00OTYsNyArNDk2LDcgQEAKIAlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CiAJaWYgKCFzdC0+Zml4ZWRfYWRkcikKIAkJZ3Bpb19mcmVlX2FycmF5KHN0LT5ncGlvcywgQVJSQVlfU0laRShzdC0+Z3Bpb3MpKTsKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKHN0LT5yZWcpKQorCWlmICghSVNfRVJSKHN0LT5yZWcpKQogCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL2FkNzI5OC5jIGIvZHJpdmVycy9paW8vYWRjL2FkNzI5OC5jCmluZGV4IDEwZWM4ZmMuLmUzOTliZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9hZDcyOTguYworKysgYi9kcml2ZXJzL2lpby9hZGMvYWQ3Mjk4LmMKQEAgLTIzOSwxNiArMjM5LDE2IEBACiAKIAlzd2l0Y2ggKG0pIHsKIAljYXNlIElJT19DSEFOX0lORk9fUkFXOgotCQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKLQkJaWYgKGluZGlvX2Rldi0+Y3VycmVudG1vZGUgPT0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCkgewotCQkJcmV0ID0gLUVCVVNZOwotCQl9IGVsc2UgewotCQkJaWYgKGNoYW4tPmFkZHJlc3MgPT0gQUQ3Mjk4X0NIX1RFTVApCi0JCQkJcmV0ID0gYWQ3Mjk4X3NjYW5fdGVtcChzdCwgdmFsKTsKLQkJCWVsc2UKLQkJCQlyZXQgPSBhZDcyOThfc2Nhbl9kaXJlY3Qoc3QsIGNoYW4tPmFkZHJlc3MpOwotCQl9Ci0JCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCXJldCA9IGlpb19kZXZpY2VfY2xhaW1fZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKGNoYW4tPmFkZHJlc3MgPT0gQUQ3Mjk4X0NIX1RFTVApCisJCQlyZXQgPSBhZDcyOThfc2Nhbl90ZW1wKHN0LCB2YWwpOworCQllbHNlCisJCQlyZXQgPSBhZDcyOThfc2Nhbl9kaXJlY3Qoc3QsIGNoYW4tPmFkZHJlc3MpOworCisJCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOwogCiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9hZDc3OTMuYyBiL2RyaXZlcnMvaWlvL2FkYy9hZDc3OTMuYwppbmRleCA4NDc3ODliLi5lNjcwNmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvYWQ3NzkzLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL2FkNzc5My5jCkBAIC01MTksMTEgKzUxOSw5IEBACiAJaW50IHJldCwgaTsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCi0JbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Ci0JaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKSB7Ci0JCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQorCXJldCA9IGlpb19kZXZpY2VfY2xhaW1fZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJc3dpdGNoIChtYXNrKSB7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgpAQCAtNTQ4LDcgKzU0Niw3IEBACiAJCXJldCA9IC1FSU5WQUw7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlpaW9fZGV2aWNlX3JlbGVhc2VfZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvYWQ3OTl4LmMgYi9kcml2ZXJzL2lpby9hZGMvYWQ3OTl4LmMKaW5kZXggYjYxNjM3Ni4uOTcwNDA5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL2FkNzk5eC5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9hZDc5OXguYwpAQCAtNTI3LDYgKzUyNyw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzk5MV9pbmZvID0gewogCS5yZWFkX3JhdyA9ICZhZDc5OXhfcmVhZF9yYXcsCiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkudXBkYXRlX3NjYW5fbW9kZSA9IGFkNzk5eF91cGRhdGVfc2Nhbl9tb2RlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZDc5OTNfNF83Xzhfbm9pcnFfaW5mbyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9hdDkxX2FkYy5jIGIvZHJpdmVycy9paW8vYWRjL2F0OTFfYWRjLmMKaW5kZXggNTI0MzBiYS4uYmJkYWMwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL2F0OTFfYWRjLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL2F0OTFfYWRjLmMKQEAgLTExMyw2ICsxMTMsNyBAQAogI2RlZmluZQkJQVQ5MV9BRENfVFNNUl9UU0FWCSgzIDw8IDQpCS8qIEF2ZXJhZ2VzIHNhbXBsZXMgKi8KICNkZWZpbmUJCQlBVDkxX0FEQ19UU01SX1RTQVZfKHgpCQkoKHgpIDw8IDQpCiAjZGVmaW5lCQlBVDkxX0FEQ19UU01SX1NDVElNCSgweDBmIDw8IDE2KQkvKiBTd2l0Y2ggY2xvc3VyZSB0aW1lICovCisjZGVmaW5lCQkJQVQ5MV9BRENfVFNNUl9TQ1RJTV8oeCkJCSgoeCkgPDwgMTYpCiAjZGVmaW5lCQlBVDkxX0FEQ19UU01SX1BFTkRCQwkoMHgwZiA8PCAyOCkJLyogUGVuIERlYm91bmNlIHRpbWUgKi8KICNkZWZpbmUJCQlBVDkxX0FEQ19UU01SX1BFTkRCQ18oeCkJKCh4KSA8PCAyOCkKICNkZWZpbmUJCUFUOTFfQURDX1RTTVJfTk9UU0RNQQkoMSA8PCAyMikJLyogTm8gVG91Y2hzY3JlZW4gRE1BICovCkBAIC0xNTAsNiArMTUxLDcgQEAKICNkZWZpbmUgTUFYX1JMUE9TX0JJVFMgICAgICAgICAxMAogI2RlZmluZSBUT1VDSF9TQU1QTEVfUEVSSU9EX1VTX1JMICAgICAgMTAwMDAgICAvKiAxMG1zLCB0aGUgU29DIGNhbid0IGtlZXAgdXAgd2l0aCAybXMgKi8KICNkZWZpbmUgVE9VQ0hfU0hUSU0gICAgICAgICAgICAgICAgICAgIDB4YQorI2RlZmluZSBUT1VDSF9TQ1RJTV9VUwkJMTAJCS8qIDEwdXMgZm9yIHRoZSBUb3VjaHNjcmVlbiBTd2l0Y2hlcyBDbG9zdXJlIFRpbWUgKi8KIAogLyoqCiAgKiBzdHJ1Y3QgYXQ5MV9hZGNfcmVnX2Rlc2MgLSBWYXJpb3VzIGluZm9ybWF0aW9ucyByZWxhdGl2ZSB0byByZWdpc3RlcnMKQEAgLTM4MSw4ICszODMsOCBAQAogCQlzdC0+dHNfYnVmZmVyZWRtZWFzdXJlID0gZmFsc2U7CiAJCWlucHV0X3JlcG9ydF9rZXkoc3QtPnRzX2lucHV0LCBCVE5fVE9VQ0gsIDApOwogCQlpbnB1dF9zeW5jKHN0LT50c19pbnB1dCk7Ci0JfSBlbHNlIGlmIChzdGF0dXMgJiBBVDkxX0FEQ19FT0MoMykpIHsKLQkJLyogQ29udmVyc2lvbiBmaW5pc2hlZCAqLworCX0gZWxzZSBpZiAoc3RhdHVzICYgQVQ5MV9BRENfRU9DKDMpICYmIHN0LT50c19pbnB1dCkgeworCQkvKiBDb252ZXJzaW9uIGZpbmlzaGVkIGFuZCB3ZSd2ZSBhIHRvdWNoc2NyZWVuICovCiAJCWlmIChzdC0+dHNfYnVmZmVyZWRtZWFzdXJlKSB7CiAJCQkvKgogCQkJICogTGFzdCBtZWFzdXJlbWVudCBpcyBhbHdheXMgZGlzY2FyZGVkLCBzaW5jZSBpdCBjYW4KQEAgLTEwMDEsNyArMTAwMyw5IEBACiAKIHN0YXRpYyBpbnQgYXQ5MV90c19od19pbml0KHN0cnVjdCBhdDkxX2FkY19zdGF0ZSAqc3QsIHUzMiBhZGNfY2xrX2toeikKIHsKKwlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGlpb19wcml2X3RvX2RldihzdCk7CiAJdTMyIHJlZyA9IDA7CisJdTMyIHRzc2N0aW0gPSAwOwogCWludCBpID0gMDsKIAogCS8qIGEgUGVuIERldGVjdCBEZWJvdW5jZSBUaW1lIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIEFEQyBUb3VjaCB0byBhdm9pZApAQCAtMTAzNCwxMSArMTAzOCwyMCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwkvKiBUb3VjaHNjcmVlbiBTd2l0Y2hlcyBDbG9zdXJlIHRpbWUgbmVlZGVkIGZvciBhbGxvd2luZyB0aGUgdmFsdWUgdG8KKwkgKiBzdGFiaWxpemUuCisJICogU3dpdGNoIENsb3N1cmUgVGltZSA9IChUU1NDVElNICogNCkgQURDQ2xvY2sgcGVyaW9kcworCSAqLworCXRzc2N0aW0gPSBESVZfUk9VTkRfVVAoVE9VQ0hfU0NUSU1fVVMgKiBhZGNfY2xrX2toeiAvIDEwMDAsIDQpOworCWRldl9kYmcoJmlkZXYtPmRldiwgImFkY19jbGsgYXQ6ICVkIEtIeiwgdHNzY3RpbSBhdDogJWRcbiIsCisJCWFkY19jbGtfa2h6LCB0c3NjdGltKTsKKwogCWlmIChzdC0+dG91Y2hzY3JlZW5fdHlwZSA9PSBBVE1FTF9BRENfVE9VQ0hTQ1JFRU5fNFdJUkUpCiAJCXJlZyA9IEFUOTFfQURDX1RTTVJfVFNNT0RFXzRXSVJFX1BSRVNTOwogCWVsc2UKIAkJcmVnID0gQVQ5MV9BRENfVFNNUl9UU01PREVfNVdJUkU7CiAKKwlyZWcgfD0gQVQ5MV9BRENfVFNNUl9TQ1RJTV8odHNzY3RpbSkgJiBBVDkxX0FEQ19UU01SX1NDVElNOwogCXJlZyB8PSBBVDkxX0FEQ19UU01SX1RTQVZfKHN0LT5jYXBzLT50c19maWx0ZXJfYXZlcmFnZSkKIAkgICAgICAgJiBBVDkxX0FEQ19UU01SX1RTQVY7CiAJcmVnIHw9IEFUOTFfQURDX1RTTVJfUEVOREJDXyhzdC0+dHNfcGVuZGJjKSAmIEFUOTFfQURDX1RTTVJfUEVOREJDOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL2luYTJ4eC1hZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy9pbmEyeHgtYWRjLmMKaW5kZXggOTU1ZjNmZC4uNTliN2Q3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL2luYTJ4eC1hZGMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvaW5hMnh4LWFkYy5jCkBAIC0xMTQsNyArMTE0LDYgQEAKIAlzdHJ1Y3QgbXV0ZXggc3RhdGVfbG9jazsKIAl1bnNpZ25lZCBpbnQgc2h1bnRfcmVzaXN0b3I7CiAJaW50IGF2ZzsKLQlzNjQgcHJldl9uczsgLyogdHJhY2sgYnVmZmVyIGNhcHR1cmUgdGltZSwgY2hlY2sgZm9yIHVuZGVycnVucyAqLwogCWludCBpbnRfdGltZV92YnVzOyAvKiBCdXMgdm9sdGFnZSBpbnRlZ3JhdGlvbiB0aW1lIHVTICovCiAJaW50IGludF90aW1lX3ZzaHVudDsgLyogU2h1bnQgdm9sdGFnZSBpbnRlZ3JhdGlvbiB0aW1lIHVTICovCiAJYm9vbCBhbGxvd19hc3luY19yZWFkb3V0OwpAQCAtNTA5LDggKzUwOCw2IEBACiAJaWlvX3B1c2hfdG9fYnVmZmVyc193aXRoX3RpbWVzdGFtcChpbmRpb19kZXYsCiAJCQkJCSAgICh1bnNpZ25lZCBpbnQgKilkYXRhLCB0aW1lX2EpOwogCi0JY2hpcC0+cHJldl9ucyA9IHRpbWVfYTsKLQogCXJldHVybiAodW5zaWduZWQgbG9uZykodGltZV9iIC0gdGltZV9hKSAvIDEwMDA7CiB9OwogCkBAIC01NTQsOCArNTUxLDYgQEAKIAlkZXZfZGJnKCZpbmRpb19kZXYtPmRldiwgIkFzeW5jIHJlYWRvdXQgbW9kZTogJWRcbiIsCiAJCWNoaXAtPmFsbG93X2FzeW5jX3JlYWRvdXQpOwogCi0JY2hpcC0+cHJldl9ucyA9IGlpb19nZXRfdGltZV9ucyhpbmRpb19kZXYpOwotCiAJY2hpcC0+dGFzayA9IGt0aHJlYWRfcnVuKGluYTJ4eF9jYXB0dXJlX3RocmVhZCwgKHZvaWQgKilpbmRpb19kZXYsCiAJCQkJICIlczolZC0ldXVzIiwgaW5kaW9fZGV2LT5uYW1lLCBpbmRpb19kZXYtPmlkLAogCQkJCSBzYW1wbGluZ191cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvbHRjMjQ4NS5jIGIvZHJpdmVycy9paW8vYWRjL2x0YzI0ODUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWI5MWYxMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9sdGMyNDg1LmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBsdGMyNDg1LmMgLSBEcml2ZXIgZm9yIExpbmVhciBUZWNobm9sb2d5IExUQzI0ODUgQURDCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFsaXNvbiBTY2hvZmllbGQgPGFtc2ZpZWxkMjJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRGF0YXNoZWV0OiBodHRwOi8vY2RzLmxpbmVhci5jb20vZG9jcy9lbi9kYXRhc2hlZXQvMjQ4NWZkLnBkZgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorCisvKiBQb3dlci1vbiBjb25maWd1cmF0aW9uOiByZWplY3RzIGJvdGggNTAvNjBIeiwgb3BlcmF0ZXMgYXQgMXggc3BlZWQgKi8KKyNkZWZpbmUgTFRDMjQ4NV9DT05GSUdfREVGQVVMVAkJMAorCitzdHJ1Y3QgbHRjMjQ4NV9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCWt0aW1lX3QJCQl0aW1lX3ByZXY7CS8qIGxhc3QgY29udmVyc2lvbiAqLworfTsKKworc3RhdGljIHZvaWQgbHRjMjQ4NV93YWl0X2NvbnYoc3RydWN0IGx0YzI0ODVfZGF0YSAqZGF0YSkKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgY29udl90aW1lID0gMTQ3OwkvKiBjb252ZXJzaW9uIHRpbWUgbXMgKi8KKwl1bnNpZ25lZCBpbnQgdGltZV9lbGFwc2VkOworCisJLyogZGVsYXkgaWYgY29udmVyc2lvbiB0aW1lIG5vdCBwYXNzZWQgc2luY2UgbGFzdCByZWFkIG9yIHdyaXRlICovCisJdGltZV9lbGFwc2VkID0ga3RpbWVfbXNfZGVsdGEoa3RpbWVfZ2V0KCksIGRhdGEtPnRpbWVfcHJldik7CisKKwlpZiAodGltZV9lbGFwc2VkIDwgY29udl90aW1lKQorCQltc2xlZXAoY29udl90aW1lIC0gdGltZV9lbGFwc2VkKTsKK30KKworc3RhdGljIGludCBsdGMyNDg1X3JlYWQoc3RydWN0IGx0YzI0ODVfZGF0YSAqZGF0YSwgaW50ICp2YWwpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlfX2JlMzIgYnVmID0gMDsKKwlpbnQgcmV0OworCisJbHRjMjQ4NV93YWl0X2NvbnYoZGF0YSk7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCAoY2hhciAqKSZidWYsIDQpOworCWlmIChyZXQgPCAwKSAgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImkyY19tYXN0ZXJfcmVjdiBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlkYXRhLT50aW1lX3ByZXYgPSBrdGltZV9nZXQoKTsKKwkqdmFsID0gc2lnbl9leHRlbmQzMihiZTMyX3RvX2NwdShidWYpID4+IDYsIDI0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbHRjMjQ4NV9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgIGludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgbHRjMjQ4NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKG1hc2sgPT0gSUlPX0NIQU5fSU5GT19SQVcpIHsKKwkJcmV0ID0gbHRjMjQ4NV9yZWFkKGRhdGEsIHZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwl9IGVsc2UgaWYgKG1hc2sgPT0gSUlPX0NIQU5fSU5GT19TQ0FMRSkgeworCQkqdmFsID0gNTAwMDsJCQkvKiBvbiBib2FyZCB2cmVmIG1pbGxpdm9sdHMgKi8KKwkJKnZhbDIgPSAyNTsJCQkvKiAyNSAoMjQgKyBzaWduKSBkYXRhIGJpdHMgKi8KKwkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTF9MT0cyOworCisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgbHRjMjQ4NV9jaGFubmVsW10gPSB7CisJeworCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKQorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGx0YzI0ODVfaW5mbyA9IHsKKwkucmVhZF9yYXcgPSBsdGMyNDg1X3JlYWRfcmF3LAorCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IGx0YzI0ODVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgbHRjMjQ4NV9kYXRhICpkYXRhOworCWludCByZXQ7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDIHwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOworCWRhdGEtPmNsaWVudCA9IGNsaWVudDsKKworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwlpbmRpb19kZXYtPm5hbWUgPSBpZC0+bmFtZTsKKwlpbmRpb19kZXYtPmluZm8gPSAmbHRjMjQ4NV9pbmZvOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gbHRjMjQ4NV9jaGFubmVsOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShsdGMyNDg1X2NoYW5uZWwpOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoZGF0YS0+Y2xpZW50LCBMVEMyNDg1X0NPTkZJR19ERUZBVUxUKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRhdGEtPnRpbWVfcHJldiA9IGt0aW1lX2dldCgpOworCisJcmV0dXJuIGRldm1faWlvX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYsIGluZGlvX2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsdGMyNDg1X2lkW10gPSB7CisJeyAibHRjMjQ4NSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbHRjMjQ4NV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBsdGMyNDg1X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJsdGMyNDg1IiwKKwl9LAorCS5wcm9iZSA9IGx0YzI0ODVfcHJvYmUsCisJLmlkX3RhYmxlID0gbHRjMjQ4NV9pZCwKK307Cittb2R1bGVfaTJjX2RyaXZlcihsdGMyNDg1X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkFsaXNvbiBTY2hvZmllbGQgPGFtc2ZpZWxkMjJAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW5lYXIgVGVjaG5vbG9neSBMVEMyNDg1IEFEQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9tZW5fejE4OF9hZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy9tZW5fejE4OF9hZGMuYwppbmRleCBkMDk1ZWZlLi44ZjM2MDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvbWVuX3oxODhfYWRjLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL21lbl96MTg4X2FkYy5jCkBAIC03OCw3ICs3OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBpaW9faW5mbyB6MTg4X2FkY19pbmZvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyB6MTg4X2FkY19pbmZvID0gewogCS5yZWFkX3JhdyA9ICZ6MTg4X2lpb19yZWFkX3JhdywKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9tdDY1NzdfYXV4YWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvbXQ2NTc3X2F1eGFkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMTA0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9hZGMvbXQ2NTc3X2F1eGFkYy5jCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IE1lZGlhVGVrIEluYy4KKyAqIEF1dGhvcjogWmhpeW9uZyBUYW8gPHpoaXlvbmcudGFvQG1lZGlhdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19DT04wICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIE1UNjU3N19BVVhBRENfQ09OMSAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBNVDY1NzdfQVVYQURDX0NPTjIgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19TVEEgICAgICAgICAgICAgICAgICAgICBCSVQoMCkKKworI2RlZmluZSBNVDY1NzdfQVVYQURDX0RBVDAgICAgICAgICAgICAgICAgICAgIDB4MTQKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19SRFkwICAgICAgICAgICAgICAgICAgICBCSVQoMTIpCisKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19NSVNDICAgICAgICAgICAgICAgICAgICAweDk0CisjZGVmaW5lIE1UNjU3N19BVVhBRENfUEROX0VOICAgICAgICAgICAgICAgICAgQklUKDE0KQorCisjZGVmaW5lIE1UNjU3N19BVVhBRENfREFUX01BU0sgICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19TTEVFUF9VUyAgICAgICAgICAgICAgICAxMDAwCisjZGVmaW5lIE1UNjU3N19BVVhBRENfVElNRU9VVF9VUyAgICAgICAgICAgICAgMTAwMDAKKyNkZWZpbmUgTVQ2NTc3X0FVWEFEQ19QT1dFUl9SRUFEWV9NUyAgICAgICAgICAxCisjZGVmaW5lIE1UNjU3N19BVVhBRENfU0FNUExFX1JFQURZX1VTICAgICAgICAgMjUKKworc3RydWN0IG10NjU3N19hdXhhZGNfZGV2aWNlIHsKKwl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOworCXN0cnVjdCBjbGsgKmFkY19jbGs7CisJc3RydWN0IG11dGV4IGxvY2s7Cit9OworCisjZGVmaW5lIE1UNjU3N19BVVhBRENfQ0hBTk5FTChpZHgpIHsJCQkJICAgIFwKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJICAgIFwKKwkJLmluZGV4ZWQgPSAxLAkJCQkJICAgIFwKKwkJLmNoYW5uZWwgPSAoaWR4KSwJCQkJICAgIFwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1BST0NFU1NFRCksIFwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIG10NjU3N19hdXhhZGNfaWlvX2NoYW5uZWxzW10gPSB7CisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDApLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCgxKSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoMiksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDMpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCg0KSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoNSksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDYpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCg3KSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoOCksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDkpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCgxMCksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDExKSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoMTIpLAorCU1UNjU3N19BVVhBRENfQ0hBTk5FTCgxMyksCisJTVQ2NTc3X0FVWEFEQ19DSEFOTkVMKDE0KSwKKwlNVDY1NzdfQVVYQURDX0NIQU5ORUwoMTUpLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIG10NjU3N19hdXhhZGNfbW9kX3JlZyh2b2lkIF9faW9tZW0gKnJlZywKKwkJCQkJIHUzMiBvcl9tYXNrLCB1MzIgYW5kX21hc2spCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKHJlZyk7CisJdmFsIHw9IG9yX21hc2s7CisJdmFsICY9IH5hbmRfbWFzazsKKwl3cml0ZWwodmFsLCByZWcpOworfQorCitzdGF0aWMgaW50IG10NjU3N19hdXhhZGNfcmVhZChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4pCit7CisJdTMyIHZhbDsKKwl2b2lkIF9faW9tZW0gKnJlZ19jaGFubmVsOworCWludCByZXQ7CisJc3RydWN0IG10NjU3N19hdXhhZGNfZGV2aWNlICphZGNfZGV2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJlZ19jaGFubmVsID0gYWRjX2Rldi0+cmVnX2Jhc2UgKyBNVDY1NzdfQVVYQURDX0RBVDAgKworCQkgICAgICBjaGFuLT5jaGFubmVsICogMHgwNDsKKworCW11dGV4X2xvY2soJmFkY19kZXYtPmxvY2spOworCisJbXQ2NTc3X2F1eGFkY19tb2RfcmVnKGFkY19kZXYtPnJlZ19iYXNlICsgTVQ2NTc3X0FVWEFEQ19DT04xLAorCQkJICAgICAgMCwgMSA8PCBjaGFuLT5jaGFubmVsKTsKKworCS8qIHJlYWQgY2hhbm5lbCBhbmQgbWFrZSBzdXJlIG9sZCByZWFkeSBiaXQgPT0gMCAqLworCXJldCA9IHJlYWRsX3BvbGxfdGltZW91dChyZWdfY2hhbm5lbCwgdmFsLAorCQkJCSAoKHZhbCAmIE1UNjU3N19BVVhBRENfUkRZMCkgPT0gMCksCisJCQkJIE1UNjU3N19BVVhBRENfU0xFRVBfVVMsCisJCQkJIE1UNjU3N19BVVhBRENfVElNRU9VVF9VUyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihpbmRpb19kZXYtPmRldi5wYXJlbnQsCisJCQkid2FpdCBmb3IgY2hhbm5lbFslZF0gcmVhZHkgYml0IGNsZWFyIHRpbWUgb3V0XG4iLAorCQkJY2hhbi0+Y2hhbm5lbCk7CisJCWdvdG8gZXJyX3RpbWVvdXQ7CisJfQorCisJLyogc2V0IGJpdCB0byB0cmlnZ2VyIHNhbXBsZSAqLworCW10NjU3N19hdXhhZGNfbW9kX3JlZyhhZGNfZGV2LT5yZWdfYmFzZSArIE1UNjU3N19BVVhBRENfQ09OMSwKKwkJCSAgICAgIDEgPDwgY2hhbi0+Y2hhbm5lbCwgMCk7CisKKwkvKiB3ZSBtdXN0IGRlbGF5IGhlcmUgZm9yIGhhcmR3YXJlIHNhbXBsZSBjaGFubmVsIGRhdGEgKi8KKwl1ZGVsYXkoTVQ2NTc3X0FVWEFEQ19TQU1QTEVfUkVBRFlfVVMpOworCisJLyogY2hlY2sgTVRLX0FVWEFEQ19DT04yIGlmIGF1eGFkYyBpcyBpZGxlICovCisJcmV0ID0gcmVhZGxfcG9sbF90aW1lb3V0KGFkY19kZXYtPnJlZ19iYXNlICsgTVQ2NTc3X0FVWEFEQ19DT04yLCB2YWwsCisJCQkJICgodmFsICYgTVQ2NTc3X0FVWEFEQ19TVEEpID09IDApLAorCQkJCSBNVDY1NzdfQVVYQURDX1NMRUVQX1VTLAorCQkJCSBNVDY1NzdfQVVYQURDX1RJTUVPVVRfVVMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaW5kaW9fZGV2LT5kZXYucGFyZW50LAorCQkJIndhaXQgZm9yIGF1eGFkYyBpZGxlIHRpbWUgb3V0XG4iKTsKKwkJZ290byBlcnJfdGltZW91dDsKKwl9CisKKwkvKiByZWFkIGNoYW5uZWwgYW5kIG1ha2Ugc3VyZSByZWFkeSBiaXQgPT0gMSAqLworCXJldCA9IHJlYWRsX3BvbGxfdGltZW91dChyZWdfY2hhbm5lbCwgdmFsLAorCQkJCSAoKHZhbCAmIE1UNjU3N19BVVhBRENfUkRZMCkgIT0gMCksCisJCQkJIE1UNjU3N19BVVhBRENfU0xFRVBfVVMsCisJCQkJIE1UNjU3N19BVVhBRENfVElNRU9VVF9VUyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihpbmRpb19kZXYtPmRldi5wYXJlbnQsCisJCQkid2FpdCBmb3IgY2hhbm5lbFslZF0gZGF0YSByZWFkeSB0aW1lIG91dFxuIiwKKwkJCWNoYW4tPmNoYW5uZWwpOworCQlnb3RvIGVycl90aW1lb3V0OworCX0KKworCS8qIHJlYWQgZGF0YSAqLworCXZhbCA9IHJlYWRsKHJlZ19jaGFubmVsKSAmIE1UNjU3N19BVVhBRENfREFUX01BU0s7CisKKwltdXRleF91bmxvY2soJmFkY19kZXYtPmxvY2spOworCisJcmV0dXJuIHZhbDsKKworZXJyX3RpbWVvdXQ6CisKKwltdXRleF91bmxvY2soJmFkY19kZXYtPmxvY2spOworCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQgbXQ2NTc3X2F1eGFkY19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkJICBpbnQgKnZhbCwKKwkJCQkgIGludCAqdmFsMiwKKwkJCQkgIGxvbmcgaW5mbykKK3sKKwlzd2l0Y2ggKGluZm8pIHsKKwljYXNlIElJT19DSEFOX0lORk9fUFJPQ0VTU0VEOgorCQkqdmFsID0gbXQ2NTc3X2F1eGFkY19yZWFkKGluZGlvX2RldiwgY2hhbik7CisJCWlmICgqdmFsIDwgMCkgeworCQkJZGV2X2VycihpbmRpb19kZXYtPmRldi5wYXJlbnQsCisJCQkJImZhaWxlZCB0byBzYW1wbGUgZGF0YSBvbiBjaGFubmVsWyVkXVxuIiwKKwkJCQljaGFuLT5jaGFubmVsKTsKKwkJCXJldHVybiAqdmFsOworCQl9CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBtdDY1NzdfYXV4YWRjX2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkucmVhZF9yYXcgPSAmbXQ2NTc3X2F1eGFkY19yZWFkX3JhdywKK307CisKK3N0YXRpYyBpbnQgbXQ2NTc3X2F1eGFkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdDY1NzdfYXV4YWRjX2RldmljZSAqYWRjX2RldjsKKwl1bnNpZ25lZCBsb25nIGFkY19jbGtfcmF0ZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCWludCByZXQ7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCphZGNfZGV2KSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRjX2RldiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwlpbmRpb19kZXYtPm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlpbmRpb19kZXYtPmluZm8gPSAmbXQ2NTc3X2F1eGFkY19pbmZvOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gbXQ2NTc3X2F1eGFkY19paW9fY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKG10NjU3N19hdXhhZGNfaWlvX2NoYW5uZWxzKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJYWRjX2Rldi0+cmVnX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGFkY19kZXYtPnJlZ19iYXNlKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGF1eGFkYyBiYXNlIGFkZHJlc3NcbiIpOworCQlyZXR1cm4gUFRSX0VSUihhZGNfZGV2LT5yZWdfYmFzZSk7CisJfQorCisJYWRjX2Rldi0+YWRjX2NsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAibWFpbiIpOworCWlmIChJU19FUlIoYWRjX2Rldi0+YWRjX2NsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBhdXhhZGMgY2xvY2tcbiIpOworCQlyZXR1cm4gUFRSX0VSUihhZGNfZGV2LT5hZGNfY2xrKTsKKwl9CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYWRjX2Rldi0+YWRjX2Nsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGF1eGFkYyBjbG9ja1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJYWRjX2Nsa19yYXRlID0gY2xrX2dldF9yYXRlKGFkY19kZXYtPmFkY19jbGspOworCWlmICghYWRjX2Nsa19yYXRlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm51bGwgY2xvY2sgcmF0ZVxuIik7CisJCWdvdG8gZXJyX2Rpc2FibGVfY2xrOworCX0KKworCW11dGV4X2luaXQoJmFkY19kZXYtPmxvY2spOworCisJbXQ2NTc3X2F1eGFkY19tb2RfcmVnKGFkY19kZXYtPnJlZ19iYXNlICsgTVQ2NTc3X0FVWEFEQ19NSVNDLAorCQkJICAgICAgTVQ2NTc3X0FVWEFEQ19QRE5fRU4sIDApOworCW1kZWxheShNVDY1NzdfQVVYQURDX1BPV0VSX1JFQURZX01TKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGluZGlvX2Rldik7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGlpbyBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9wb3dlcl9vZmY7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9wb3dlcl9vZmY6CisJbXQ2NTc3X2F1eGFkY19tb2RfcmVnKGFkY19kZXYtPnJlZ19iYXNlICsgTVQ2NTc3X0FVWEFEQ19NSVNDLAorCQkJICAgICAgMCwgTVQ2NTc3X0FVWEFEQ19QRE5fRU4pOworZXJyX2Rpc2FibGVfY2xrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShhZGNfZGV2LT5hZGNfY2xrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10NjU3N19hdXhhZGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBtdDY1NzdfYXV4YWRjX2RldmljZSAqYWRjX2RldiA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKworCW10NjU3N19hdXhhZGNfbW9kX3JlZyhhZGNfZGV2LT5yZWdfYmFzZSArIE1UNjU3N19BVVhBRENfTUlTQywKKwkJCSAgICAgIDAsIE1UNjU3N19BVVhBRENfUEROX0VOKTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShhZGNfZGV2LT5hZGNfY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdDY1NzdfYXV4YWRjX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDI3MDEtYXV4YWRjIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10ODE3My1hdXhhZGMiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG10NjU3N19hdXhhZGNfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdDY1NzdfYXV4YWRjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSAgID0gIm10NjU3Ny1hdXhhZGMiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtdDY1NzdfYXV4YWRjX29mX21hdGNoLAorCX0sCisJLnByb2JlCT0gbXQ2NTc3X2F1eGFkY19wcm9iZSwKKwkucmVtb3ZlCT0gbXQ2NTc3X2F1eGFkY19yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtdDY1NzdfYXV4YWRjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlpoaXlvbmcgVGFvIDx6aGl5b25nLnRhb0BtZWRpYXRlay5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1USyBBVVhBREMgRGV2aWNlIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL25hdTc4MDIuYyBiL2RyaXZlcnMvaWlvL2FkYy9uYXU3ODAyLmMKaW5kZXggZGI5YjgyOS4uMDhmNDQ2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL25hdTc4MDIuYworKysgYi9kcml2ZXJzL2lpby9hZGMvbmF1NzgwMi5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAlpZiAoc3QtPmNvbnZlcnNpb25fY291bnQgPCBOQVU3ODAyX01JTl9DT05WRVJTSU9OUykKIAkJc3QtPmNvbnZlcnNpb25fY291bnQrKzsKIAlpZiAoc3QtPmNvbnZlcnNpb25fY291bnQgPj0gTkFVNzgwMl9NSU5fQ09OVkVSU0lPTlMpCi0JCWNvbXBsZXRlX2FsbCgmc3QtPnZhbHVlX29rKTsKKwkJY29tcGxldGUoJnN0LT52YWx1ZV9vayk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvcm9ja2NoaXBfc2FyYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvcm9ja2NoaXBfc2FyYWRjLmMKaW5kZXggZjlhZDZjMi4uODVkNzAxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL3JvY2tjaGlwX3NhcmFkYy5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9yb2NrY2hpcF9zYXJhZGMuYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgogCkBAIC01Myw2ICs1NSw3IEBACiAJc3RydWN0IGNsawkJKmNsazsKIAlzdHJ1Y3QgY29tcGxldGlvbgljb21wbGV0aW9uOwogCXN0cnVjdCByZWd1bGF0b3IJKnZyZWY7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wJKnJlc2V0OwogCWNvbnN0IHN0cnVjdCByb2NrY2hpcF9zYXJhZGNfZGF0YSAqZGF0YTsKIAl1MTYJCQlsYXN0X3ZhbDsKIH07CkBAIC0xOTAsNiArMTkzLDE2IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcm9ja2NoaXBfc2FyYWRjX21hdGNoKTsKIAorLyoqCisgKiBSZXNldCBTQVJBREMgQ29udHJvbGxlci4KKyAqLworc3RhdGljIHZvaWQgcm9ja2NoaXBfc2FyYWRjX3Jlc2V0X2NvbnRyb2xsZXIoc3RydWN0IHJlc2V0X2NvbnRyb2wgKnJlc2V0KQoreworCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHJlc2V0KTsKKwl1c2xlZXBfcmFuZ2UoMTAsIDIwKTsKKwlyZXNldF9jb250cm9sX2RlYXNzZXJ0KHJlc2V0KTsKK30KKwogc3RhdGljIGludCByb2NrY2hpcF9zYXJhZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgcm9ja2NoaXBfc2FyYWRjICppbmZvID0gTlVMTDsKQEAgLTIxOCw2ICsyMzEsMjAgQEAKIAlpZiAoSVNfRVJSKGluZm8tPnJlZ3MpKQogCQlyZXR1cm4gUFRSX0VSUihpbmZvLT5yZWdzKTsKIAorCS8qCisJICogVGhlIHJlc2V0IHNob3VsZCBiZSBhbiBvcHRpb25hbCBwcm9wZXJ0eSwgYXMgaXQgc2hvdWxkIHdvcmsKKwkgKiB3aXRoIG9sZCBkZXZpY2V0cmVlcyBhcyB3ZWxsCisJICovCisJaW5mby0+cmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KCZwZGV2LT5kZXYsICJzYXJhZGMtYXBiIik7CisJaWYgKElTX0VSUihpbmZvLT5yZXNldCkpIHsKKwkJcmV0ID0gUFRSX0VSUihpbmZvLT5yZXNldCk7CisJCWlmIChyZXQgIT0gLUVOT0VOVCkKKwkJCXJldHVybiByZXQ7CisKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAibm8gcmVzZXQgY29udHJvbCBmb3VuZFxuIik7CisJCWluZm8tPnJlc2V0ID0gTlVMTDsKKwl9CisKIAlpbml0X2NvbXBsZXRpb24oJmluZm8tPmNvbXBsZXRpb24pOwogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKQEAgLTI1Miw2ICsyNzksOSBAQAogCQlyZXR1cm4gUFRSX0VSUihpbmZvLT52cmVmKTsKIAl9CiAKKwlpZiAoaW5mby0+cmVzZXQpCisJCXJvY2tjaGlwX3NhcmFkY19yZXNldF9jb250cm9sbGVyKGluZm8tPnJlc2V0KTsKKwogCS8qCiAJICogVXNlIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGNvbnZlcnRlciBjbG9jay4KIAkgKiBUaGlzIG1heSBiZWNvbWUgdXNlci1jb25maWd1cmFibGUgaW4gdGhlIGZ1dHVyZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9zdHgxMDQuYyBiL2RyaXZlcnMvaWlvL2FkYy9zdHgxMDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTM2NDU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL3N0eDEwNC5jCkBAIC0wLDAgKzEsMzgwIEBACisvKgorICogSUlPIGRyaXZlciBmb3IgdGhlIEFwZXggRW1iZWRkZWQgU3lzdGVtcyBTVFgxMDQKKyAqIENvcHlyaWdodCAoQykgMjAxNiBXaWxsaWFtIEJyZWF0aGl0dCBHcmF5CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjZGVmaW5lIFNUWDEwNF9PVVRfQ0hBTihjaGFuKSB7CQkJCVwKKwkudHlwZSA9IElJT19WT0xUQUdFLAkJCQlcCisJLmNoYW5uZWwgPSBjaGFuLAkJCQlcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCVwKKwkuaW5kZXhlZCA9IDEsCQkJCQlcCisJLm91dHB1dCA9IDEJCQkJCVwKK30KKyNkZWZpbmUgU1RYMTA0X0lOX0NIQU4oY2hhbiwgZGlmZikgewkJCQkJXAorCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJCQkJXAorCS5jaGFubmVsID0gY2hhbiwJCQkJCQlcCisJLmNoYW5uZWwyID0gY2hhbiwJCQkJCQlcCisJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX0hBUkRXQVJFR0FJTikgfAlcCisJCUJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCkgfCBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJCQlcCisJLmluZGV4ZWQgPSAxLAkJCQkJCQlcCisJLmRpZmZlcmVudGlhbCA9IGRpZmYJCQkJCQlcCit9CisKKyNkZWZpbmUgU1RYMTA0X05VTV9PVVRfQ0hBTiAyCisKKyNkZWZpbmUgU1RYMTA0X0VYVEVOVCAxNgorCitzdGF0aWMgdW5zaWduZWQgaW50IGJhc2VbbWF4X251bV9pc2FfZGV2KFNUWDEwNF9FWFRFTlQpXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX3N0eDEwNDsKK21vZHVsZV9wYXJhbV9hcnJheShiYXNlLCB1aW50LCAmbnVtX3N0eDEwNCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJhc2UsICJBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0IGJhc2UgYWRkcmVzc2VzIik7CisKKy8qKgorICogc3RydWN0IHN0eDEwNF9paW8gLSBJSU8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBjaGFuX291dF9zdGF0ZXM6CWNoYW5uZWxzJyBvdXRwdXQgc3RhdGVzCisgKiBAYmFzZToJCWJhc2UgcG9ydCBhZGRyZXNzIG9mIHRoZSBJSU8gZGV2aWNlCisgKi8KK3N0cnVjdCBzdHgxMDRfaWlvIHsKKwl1bnNpZ25lZCBpbnQgY2hhbl9vdXRfc3RhdGVzW1NUWDEwNF9OVU1fT1VUX0NIQU5dOworCXVuc2lnbmVkIGludCBiYXNlOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc3R4MTA0X2dwaW8gLSBHUElPIGRldmljZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKiBAY2hpcDoJaW5zdGFuY2Ugb2YgdGhlIGdwaW9fY2hpcAorICogQGxvY2s6CXN5bmNocm9uaXphdGlvbiBsb2NrIHRvIHByZXZlbnQgSS9PIHJhY2UgY29uZGl0aW9ucworICogQGJhc2U6CWJhc2UgcG9ydCBhZGRyZXNzIG9mIHRoZSBHUElPIGRldmljZQorICogQG91dF9zdGF0ZToJb3V0cHV0IGJpdHMgc3RhdGUKKyAqLworc3RydWN0IHN0eDEwNF9ncGlvIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7CisJc3BpbmxvY2tfdCBsb2NrOworCXVuc2lnbmVkIGludCBiYXNlOworCXVuc2lnbmVkIGludCBvdXRfc3RhdGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBzdHgxMDRfZGV2IC0gU1RYMTA0IGRldmljZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKiBAaW5kaW9fZGV2OglJSU8gZGV2aWNlCisgKiBAY2hpcDoJaW5zdGFuY2Ugb2YgdGhlIGdwaW9fY2hpcAorICovCitzdHJ1Y3Qgc3R4MTA0X2RldiB7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwOworfTsKKworc3RhdGljIGludCBzdHgxMDRfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBzdHgxMDRfaWlvICpjb25zdCBwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgYWRjX2NvbmZpZzsKKwlpbnQgYWRidTsKKwlpbnQgZ2FpbjsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19IQVJEV0FSRUdBSU46CisJCS8qIGdldCBnYWluIGNvbmZpZ3VyYXRpb24gKi8KKwkJYWRjX2NvbmZpZyA9IGluYihwcml2LT5iYXNlICsgMTEpOworCQlnYWluID0gYWRjX2NvbmZpZyAmIDB4MzsKKworCQkqdmFsID0gMSA8PCBnYWluOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJaWYgKGNoYW4tPm91dHB1dCkgeworCQkJKnZhbCA9IHByaXYtPmNoYW5fb3V0X3N0YXRlc1tjaGFuLT5jaGFubmVsXTsKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJfQorCisJCS8qIHNlbGVjdCBBREMgY2hhbm5lbCAqLworCQlvdXRiKGNoYW4tPmNoYW5uZWwgfCAoY2hhbi0+Y2hhbm5lbCA8PCA0KSwgcHJpdi0+YmFzZSArIDIpOworCisJCS8qIHRyaWdnZXIgQURDIHNhbXBsZSBjYXB0dXJlIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uICovCisJCW91dGIoMCwgcHJpdi0+YmFzZSk7CisJCXdoaWxlIChpbmIocHJpdi0+YmFzZSArIDgpICYgQklUKDcpKTsKKworCQkqdmFsID0gaW53KHByaXYtPmJhc2UpOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJLyogZ2V0IEFEQyBiaXBvbGFyL3VuaXBvbGFyIGNvbmZpZ3VyYXRpb24gKi8KKwkJYWRjX2NvbmZpZyA9IGluYihwcml2LT5iYXNlICsgMTEpOworCQlhZGJ1ID0gIShhZGNfY29uZmlnICYgQklUKDIpKTsKKworCQkqdmFsID0gLTMyNzY4ICogYWRidTsKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJLyogZ2V0IEFEQyBiaXBvbGFyL3VuaXBvbGFyIGFuZCBnYWluIGNvbmZpZ3VyYXRpb24gKi8KKwkJYWRjX2NvbmZpZyA9IGluYihwcml2LT5iYXNlICsgMTEpOworCQlhZGJ1ID0gIShhZGNfY29uZmlnICYgQklUKDIpKTsKKwkJZ2FpbiA9IGFkY19jb25maWcgJiAweDM7CisKKwkJKnZhbCA9IDU7CisJCSp2YWwyID0gMTUgLSBhZGJ1ICsgZ2FpbjsKKwkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTF9MT0cyOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHN0eDEwNF93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3Qgc3R4MTA0X2lpbyAqY29uc3QgcHJpdiA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fSEFSRFdBUkVHQUlOOgorCQkvKiBPbmx5IGZvdXIgZ2FpbiBzdGF0ZXMgKHgxLCB4MiwgeDQsIHg4KSAqLworCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIDE6CisJCQlvdXRiKDAsIHByaXYtPmJhc2UgKyAxMSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJb3V0YigxLCBwcml2LT5iYXNlICsgMTEpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCW91dGIoMiwgcHJpdi0+YmFzZSArIDExKTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQlvdXRiKDMsIHByaXYtPmJhc2UgKyAxMSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcmV0dXJuIDA7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJaWYgKGNoYW4tPm91dHB1dCkgeworCQkJLyogREFDIGNhbiBvbmx5IGFjY2VwdCB1cCB0byBhIDE2LWJpdCB2YWx1ZSAqLworCQkJaWYgKCh1bnNpZ25lZCBpbnQpdmFsID4gNjU1MzUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXByaXYtPmNoYW5fb3V0X3N0YXRlc1tjaGFuLT5jaGFubmVsXSA9IHZhbDsKKwkJCW91dHcodmFsLCBwcml2LT5iYXNlICsgNCArIDIgKiBjaGFuLT5jaGFubmVsKTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gc3R4MTA0X2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkucmVhZF9yYXcgPSBzdHgxMDRfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9IHN0eDEwNF93cml0ZV9yYXcKK307CisKKy8qIHNpbmdsZS1lbmRlZCBpbnB1dCBjaGFubmVscyBjb25maWd1cmF0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgc3R4MTA0X2NoYW5uZWxzX3NpbmdbXSA9IHsKKwlTVFgxMDRfT1VUX0NIQU4oMCksIFNUWDEwNF9PVVRfQ0hBTigxKSwKKwlTVFgxMDRfSU5fQ0hBTigwLCAwKSwgU1RYMTA0X0lOX0NIQU4oMSwgMCksIFNUWDEwNF9JTl9DSEFOKDIsIDApLAorCVNUWDEwNF9JTl9DSEFOKDMsIDApLCBTVFgxMDRfSU5fQ0hBTig0LCAwKSwgU1RYMTA0X0lOX0NIQU4oNSwgMCksCisJU1RYMTA0X0lOX0NIQU4oNiwgMCksIFNUWDEwNF9JTl9DSEFOKDcsIDApLCBTVFgxMDRfSU5fQ0hBTig4LCAwKSwKKwlTVFgxMDRfSU5fQ0hBTig5LCAwKSwgU1RYMTA0X0lOX0NIQU4oMTAsIDApLCBTVFgxMDRfSU5fQ0hBTigxMSwgMCksCisJU1RYMTA0X0lOX0NIQU4oMTIsIDApLCBTVFgxMDRfSU5fQ0hBTigxMywgMCksIFNUWDEwNF9JTl9DSEFOKDE0LCAwKSwKKwlTVFgxMDRfSU5fQ0hBTigxNSwgMCkKK307CisvKiBkaWZmZXJlbnRpYWwgaW5wdXQgY2hhbm5lbHMgY29uZmlndXJhdGlvbiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHN0eDEwNF9jaGFubmVsc19kaWZmW10gPSB7CisJU1RYMTA0X09VVF9DSEFOKDApLCBTVFgxMDRfT1VUX0NIQU4oMSksCisJU1RYMTA0X0lOX0NIQU4oMCwgMSksIFNUWDEwNF9JTl9DSEFOKDEsIDEpLCBTVFgxMDRfSU5fQ0hBTigyLCAxKSwKKwlTVFgxMDRfSU5fQ0hBTigzLCAxKSwgU1RYMTA0X0lOX0NIQU4oNCwgMSksIFNUWDEwNF9JTl9DSEFOKDUsIDEpLAorCVNUWDEwNF9JTl9DSEFOKDYsIDEpLCBTVFgxMDRfSU5fQ0hBTig3LCAxKQorfTsKKworc3RhdGljIGludCBzdHgxMDRfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwkvKiBHUElPIDAtMyBhcmUgaW5wdXQgb25seSwgd2hpbGUgdGhlIHJlc3QgYXJlIG91dHB1dCBvbmx5ICovCisJaWYgKG9mZnNldCA8IDQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R4MTA0X2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCisJdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlpZiAob2Zmc2V0ID49IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R4MTA0X2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCXVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlpZiAob2Zmc2V0IDwgNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljaGlwLT5zZXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3R4MTA0X2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJc3RydWN0IHN0eDEwNF9ncGlvICpjb25zdCBzdHgxMDRncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisKKwlpZiAob2Zmc2V0ID49IDQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuICEhKGluYihzdHgxMDRncGlvLT5iYXNlKSAmIEJJVChvZmZzZXQpKTsKK30KKworc3RhdGljIHZvaWQgc3R4MTA0X2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJaW50IHZhbHVlKQoreworCXN0cnVjdCBzdHgxMDRfZ3BpbyAqY29uc3Qgc3R4MTA0Z3BpbyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCWNvbnN0IHVuc2lnbmVkIGludCBtYXNrID0gQklUKG9mZnNldCkgPj4gNDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKG9mZnNldCA8IDQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdHgxMDRncGlvLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodmFsdWUpCisJCXN0eDEwNGdwaW8tPm91dF9zdGF0ZSB8PSBtYXNrOworCWVsc2UKKwkJc3R4MTA0Z3Bpby0+b3V0X3N0YXRlICY9IH5tYXNrOworCisJb3V0YihzdHgxMDRncGlvLT5vdXRfc3RhdGUsIHN0eDEwNGdwaW8tPmJhc2UpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3R4MTA0Z3Bpby0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHN0eDEwNF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBzdHgxMDRfaWlvICpwcml2OworCXN0cnVjdCBzdHgxMDRfZ3BpbyAqc3R4MTA0Z3BpbzsKKwlzdHJ1Y3Qgc3R4MTA0X2RldiAqc3R4MTA0ZGV2OworCWludCBlcnI7CisKKwlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoZGV2LCBzaXplb2YoKnByaXYpKTsKKwlpZiAoIWluZGlvX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdHgxMDRncGlvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzdHgxMDRncGlvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHgxMDRncGlvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0eDEwNGRldiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqc3R4MTA0ZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHgxMDRkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFkZXZtX3JlcXVlc3RfcmVnaW9uKGRldiwgYmFzZVtpZF0sIFNUWDEwNF9FWFRFTlQsCisJCWRldl9uYW1lKGRldikpKSB7CisJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIGxvY2sgcG9ydCBhZGRyZXNzZXMgKDB4JVgtMHglWClcbiIsCisJCQliYXNlW2lkXSwgYmFzZVtpZF0gKyBTVFgxMDRfRVhURU5UKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpbmRpb19kZXYtPmluZm8gPSAmc3R4MTA0X2luZm87CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJLyogZGV0ZXJtaW5lIGlmIGRpZmZlcmVudGlhbCBpbnB1dHMgKi8KKwlpZiAoaW5iKGJhc2VbaWRdICsgOCkgJiBCSVQoNSkpIHsKKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHN0eDEwNF9jaGFubmVsc19kaWZmKTsKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IHN0eDEwNF9jaGFubmVsc19kaWZmOworCX0gZWxzZSB7CisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShzdHgxMDRfY2hhbm5lbHNfc2luZyk7CisJCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBzdHgxMDRfY2hhbm5lbHNfc2luZzsKKwl9CisKKwlpbmRpb19kZXYtPm5hbWUgPSBkZXZfbmFtZShkZXYpOworCisJcHJpdiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJcHJpdi0+YmFzZSA9IGJhc2VbaWRdOworCisJLyogY29uZmlndXJlIGRldmljZSBmb3Igc29mdHdhcmUgdHJpZ2dlciBvcGVyYXRpb24gKi8KKwlvdXRiKDAsIGJhc2VbaWRdICsgOSk7CisKKwkvKiBpbml0aWFsaXplIGdhaW4gc2V0dGluZyB0byB4MSAqLworCW91dGIoMCwgYmFzZVtpZF0gKyAxMSk7CisKKwkvKiBpbml0aWFsaXplIERBQyBvdXRwdXQgdG8gMFYgKi8KKwlvdXR3KDAsIGJhc2VbaWRdICsgNCk7CisJb3V0dygwLCBiYXNlW2lkXSArIDYpOworCisJc3R4MTA0Z3Bpby0+Y2hpcC5sYWJlbCA9IGRldl9uYW1lKGRldik7CisJc3R4MTA0Z3Bpby0+Y2hpcC5wYXJlbnQgPSBkZXY7CisJc3R4MTA0Z3Bpby0+Y2hpcC5vd25lciA9IFRISVNfTU9EVUxFOworCXN0eDEwNGdwaW8tPmNoaXAuYmFzZSA9IC0xOworCXN0eDEwNGdwaW8tPmNoaXAubmdwaW8gPSA4OworCXN0eDEwNGdwaW8tPmNoaXAuZ2V0X2RpcmVjdGlvbiA9IHN0eDEwNF9ncGlvX2dldF9kaXJlY3Rpb247CisJc3R4MTA0Z3Bpby0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBzdHgxMDRfZ3Bpb19kaXJlY3Rpb25faW5wdXQ7CisJc3R4MTA0Z3Bpby0+Y2hpcC5kaXJlY3Rpb25fb3V0cHV0ID0gc3R4MTA0X2dwaW9fZGlyZWN0aW9uX291dHB1dDsKKwlzdHgxMDRncGlvLT5jaGlwLmdldCA9IHN0eDEwNF9ncGlvX2dldDsKKwlzdHgxMDRncGlvLT5jaGlwLnNldCA9IHN0eDEwNF9ncGlvX3NldDsKKwlzdHgxMDRncGlvLT5iYXNlID0gYmFzZVtpZF0gKyAzOworCXN0eDEwNGdwaW8tPm91dF9zdGF0ZSA9IDB4MDsKKworCXNwaW5fbG9ja19pbml0KCZzdHgxMDRncGlvLT5sb2NrKTsKKworCXN0eDEwNGRldi0+aW5kaW9fZGV2ID0gaW5kaW9fZGV2OworCXN0eDEwNGRldi0+Y2hpcCA9ICZzdHgxMDRncGlvLT5jaGlwOworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHN0eDEwNGRldik7CisKKwllcnIgPSBncGlvY2hpcF9hZGRfZGF0YSgmc3R4MTA0Z3Bpby0+Y2hpcCwgc3R4MTA0Z3Bpbyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgIkdQSU8gcmVnaXN0ZXJpbmcgZmFpbGVkICglZClcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJJSU8gZGV2aWNlIHJlZ2lzdGVyaW5nIGZhaWxlZCAoJWQpXG4iLCBlcnIpOworCQlncGlvY2hpcF9yZW1vdmUoJnN0eDEwNGdwaW8tPmNoaXApOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0eDEwNF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaWQpCit7CisJc3RydWN0IHN0eDEwNF9kZXYgKmNvbnN0IHN0eDEwNGRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0eDEwNGRldi0+aW5kaW9fZGV2KTsKKwlncGlvY2hpcF9yZW1vdmUoc3R4MTA0ZGV2LT5jaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlzYV9kcml2ZXIgc3R4MTA0X2RyaXZlciA9IHsKKwkucHJvYmUgPSBzdHgxMDRfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic3R4MTA0IgorCX0sCisJLnJlbW92ZSA9IHN0eDEwNF9yZW1vdmUKK307CisKK21vZHVsZV9pc2FfZHJpdmVyKHN0eDEwNF9kcml2ZXIsIG51bV9zdHgxMDQpOworCitNT0RVTEVfQVVUSE9SKCJXaWxsaWFtIEJyZWF0aGl0dCBHcmF5IDx2aWxoZWxtLmdyYXlAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBcGV4IEVtYmVkZGVkIFN5c3RlbXMgU1RYMTA0IElJTyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy90aS1hZGMxMjEzOC5jIGIvZHJpdmVycy9paW8vYWRjL3RpLWFkYzEyMTM4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyZjAzYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90aS1hZGMxMjEzOC5jCkBAIC0wLDAgKzEsNTUyIEBACisvKgorICogQURDMTIxMzAvQURDMTIxMzIvQURDMTIxMzggMTItYml0IHBsdXMgc2lnbiBBREMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEFraW5vYnUgTWl0YSA8YWtpbm9idS5taXRhQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdmVyc2lvbiAyIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbgorICogZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIERhdGFzaGVldDogaHR0cDovL3d3dy50aS5jb20vbGl0L2RzL3N5bWxpbmsvYWRjMTIxMzgucGRmCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKworI2RlZmluZSBBREMxMjEzOF9NT0RFX0FVVE9fQ0FMCQkJMHgwOAorI2RlZmluZSBBREMxMjEzOF9NT0RFX1JFQURfU1RBVFVTCQkweDBjCisjZGVmaW5lIEFEQzEyMTM4X01PREVfQUNRVUlTSVRJT05fVElNRV82CTB4MGUKKyNkZWZpbmUgQURDMTIxMzhfTU9ERV9BQ1FVSVNJVElPTl9USU1FXzEwCTB4NGUKKyNkZWZpbmUgQURDMTIxMzhfTU9ERV9BQ1FVSVNJVElPTl9USU1FXzE4CTB4OGUKKyNkZWZpbmUgQURDMTIxMzhfTU9ERV9BQ1FVSVNJVElPTl9USU1FXzM0CTB4Y2UKKworI2RlZmluZSBBREMxMjEzOF9TVEFUVVNfQ0FMCQkJQklUKDYpCisKK2VudW0geworCWFkYzEyMTMwLAorCWFkYzEyMTMyLAorCWFkYzEyMTM4LAorfTsKKworc3RydWN0IGFkYzEyMTM4IHsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpOworCXVuc2lnbmVkIGludCBpZDsKKwkvKiBjb252ZXJzaW9uIGNsb2NrICovCisJc3RydWN0IGNsayAqY2NsazsKKwkvKiBwb3NpdGl2ZSBhbmFsb2cgdm9sdGFnZSByZWZlcmVuY2UgKi8KKwlzdHJ1Y3QgcmVndWxhdG9yICp2cmVmX3A7CisJLyogbmVnYXRpdmUgYW5hbG9nIHZvbHRhZ2UgcmVmZXJlbmNlICovCisJc3RydWN0IHJlZ3VsYXRvciAqdnJlZl9uOworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRlOworCS8qIFRoZSBudW1iZXIgb2YgY2NsayBwZXJpb2RzIGZvciB0aGUgUy9IJ3MgYWNxdWlzaXRpb24gdGltZSAqLworCXVuc2lnbmVkIGludCBhY3F1aXNpdGlvbl90aW1lOworCisJdTggdHhfYnVmWzJdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwl1OCByeF9idWZbMl07Cit9OworCisjZGVmaW5lIEFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTChjaGFuKQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJCVwKKwkJLmluZGV4ZWQgPSAxLAkJCQkJCVwKKwkJLmNoYW5uZWwgPSBjaGFuLAkJCQkJXAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJCVwKKwkJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKQlcCisJCQkJCXwgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSwJXAorCQkuc2Nhbl9pbmRleCA9IGNoYW4sCQkJCQlcCisJCS5zY2FuX3R5cGUgPSB7CQkJCQkJXAorCQkJLnNpZ24gPSAncycsCQkJCQlcCisJCQkucmVhbGJpdHMgPSAxMywJCQkJCVwKKwkJCS5zdG9yYWdlYml0cyA9IDE2LAkJCQlcCisJCQkuc2hpZnQgPSAzLAkJCQkJXAorCQkJLmVuZGlhbm5lc3MgPSBJSU9fQkUsCQkJCVwKKwkJfSwJCQkJCQkJXAorCX0KKworI2RlZmluZSBBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRihjaGFuMSwgY2hhbjIsIHNpKQkJCVwKKwl7CQkJCQkJCQlcCisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJCQlcCisJCS5pbmRleGVkID0gMSwJCQkJCQlcCisJCS5jaGFubmVsID0gKGNoYW4xKSwJCQkJCVwKKwkJLmNoYW5uZWwyID0gKGNoYW4yKSwJCQkJCVwKKwkJLmRpZmZlcmVudGlhbCA9IDEsCQkJCQlcCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLAkJXAorCQkuaW5mb19tYXNrX3NoYXJlZF9ieV90eXBlID0gQklUKElJT19DSEFOX0lORk9fU0NBTEUpCVwKKwkJCQkJfCBCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpLAlcCisJCS5zY2FuX2luZGV4ID0gc2ksCQkJCQlcCisJCS5zY2FuX3R5cGUgPSB7CQkJCQkJXAorCQkJLnNpZ24gPSAncycsCQkJCQlcCisJCQkucmVhbGJpdHMgPSAxMywJCQkJCVwKKwkJCS5zdG9yYWdlYml0cyA9IDE2LAkJCQlcCisJCQkuc2hpZnQgPSAzLAkJCQkJXAorCQkJLmVuZGlhbm5lc3MgPSBJSU9fQkUsCQkJCVwKKwkJfSwJCQkJCQkJXAorCX0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkYzEyMTMyX2NoYW5uZWxzW10gPSB7CisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKDApLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTCgxKSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRigwLCAxLCAyKSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRigxLCAwLCAzKSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBhZGMxMjEzOF9jaGFubmVsc1tdID0geworCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTCgwKSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUwoMSksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKDIpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTCgzKSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUwoNCksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMKDUpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTCg2KSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUwoNyksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMX0RJRkYoMCwgMSwgOCksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMX0RJRkYoMSwgMCwgOSksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMX0RJRkYoMiwgMywgMTApLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKDMsIDIsIDExKSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRig0LCA1LCAxMiksCisJQURDMTIxMzhfVk9MVEFHRV9DSEFOTkVMX0RJRkYoNSwgNCwgMTMpLAorCUFEQzEyMTM4X1ZPTFRBR0VfQ0hBTk5FTF9ESUZGKDYsIDcsIDE0KSwKKwlBREMxMjEzOF9WT0xUQUdFX0NIQU5ORUxfRElGRig3LCA2LCAxNSksCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMTYpLAorfTsKKworc3RhdGljIGludCBhZGMxMjEzOF9tb2RlX3Byb2dyYW1taW5nKHN0cnVjdCBhZGMxMjEzOCAqYWRjLCB1OCBtb2RlLAorCQkJCSAgICAgdm9pZCAqcnhfYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlciA9IHsKKwkJLnR4X2J1ZiA9IGFkYy0+dHhfYnVmLAorCQkucnhfYnVmID0gYWRjLT5yeF9idWYsCisJCS5sZW4gPSBsZW4sCisJfTsKKwlpbnQgcmV0OworCisJLyogU2tpcCB1bnVzZWQgYml0cyBmb3IgQURDMTIxMzAgYW5kIEFEQzEyMTMyICovCisJaWYgKGFkYy0+aWQgIT0gYWRjMTIxMzgpCisJCW1vZGUgPSAobW9kZSAmIDB4YzApIHwgKChtb2RlICYgMHgwZikgPDwgMik7CisKKwlhZGMtPnR4X2J1ZlswXSA9IG1vZGU7CisKKwlyZXQgPSBzcGlfc3luY190cmFuc2ZlcihhZGMtPnNwaSwgJnhmZXIsIDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltZW1jcHkocnhfYnVmLCBhZGMtPnJ4X2J1ZiwgbGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYzEyMTM4X3JlYWRfc3RhdHVzKHN0cnVjdCBhZGMxMjEzOCAqYWRjKQoreworCXU4IHJ4X2J1ZlsyXTsKKwlpbnQgcmV0OworCisJcmV0ID0gYWRjMTIxMzhfbW9kZV9wcm9ncmFtbWluZyhhZGMsIEFEQzEyMTM4X01PREVfUkVBRF9TVEFUVVMsCisJCQkJCXJ4X2J1ZiwgMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAocnhfYnVmWzBdIDw8IDEpIHwgKHJ4X2J1ZlsxXSA+PiA3KTsKK30KKworc3RhdGljIGludCBfX2FkYzEyMTM4X3N0YXJ0X2NvbnYoc3RydWN0IGFkYzEyMTM4ICphZGMsCisJCQkJIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFubmVsLAorCQkJCSB2b2lkICpkYXRhLCBpbnQgbGVuKQorCit7CisJY29uc3QgdTggY2hfdG9fbXV4W10gPSB7IDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgfTsKKwl1OCBtb2RlID0gKGNoX3RvX211eFtjaGFubmVsLT5jaGFubmVsXSA8PCA0KSB8CisJCSAgKGNoYW5uZWwtPmRpZmZlcmVudGlhbCA/IDAgOiAweDgwKTsKKworCXJldHVybiBhZGMxMjEzOF9tb2RlX3Byb2dyYW1taW5nKGFkYywgbW9kZSwgZGF0YSwgbGVuKTsKK30KKworc3RhdGljIGludCBhZGMxMjEzOF9zdGFydF9jb252KHN0cnVjdCBhZGMxMjEzOCAqYWRjLAorCQkJICAgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFubmVsKQoreworCXU4IHRyYXNoOworCisJcmV0dXJuIF9fYWRjMTIxMzhfc3RhcnRfY29udihhZGMsIGNoYW5uZWwsICZ0cmFzaCwgMSk7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTIxMzhfc3RhcnRfYW5kX3JlYWRfY29udihzdHJ1Y3QgYWRjMTIxMzggKmFkYywKKwkJCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW5uZWwsCisJCQkJCV9fYmUxNiAqZGF0YSkKK3sKKwlyZXR1cm4gX19hZGMxMjEzOF9zdGFydF9jb252KGFkYywgY2hhbm5lbCwgZGF0YSwgMik7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTIxMzhfcmVhZF9jb252X2RhdGEoc3RydWN0IGFkYzEyMTM4ICphZGMsIF9fYmUxNiAqdmFsdWUpCit7CisJLyogSXNzdWUgYSByZWFkIHN0YXR1cyBpbnN0cnVjdGlvbiBhbmQgcmVhZCBwcmV2aW91cyBjb252ZXJzaW9uIGRhdGEgKi8KKwlyZXR1cm4gYWRjMTIxMzhfbW9kZV9wcm9ncmFtbWluZyhhZGMsIEFEQzEyMTM4X01PREVfUkVBRF9TVEFUVVMsCisJCQkJCSB2YWx1ZSwgc2l6ZW9mKCp2YWx1ZSkpOworfQorCitzdGF0aWMgaW50IGFkYzEyMTM4X3dhaXRfZW9jKHN0cnVjdCBhZGMxMjEzOCAqYWRjLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmFkYy0+Y29tcGxldGUsIHRpbWVvdXQpKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYzEyMTM4X2FkY19jb252ZXJzaW9uKHN0cnVjdCBhZGMxMjEzOCAqYWRjLAorCQkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFubmVsLAorCQkJCSAgIF9fYmUxNiAqdmFsdWUpCit7CisJaW50IHJldDsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZhZGMtPmNvbXBsZXRlKTsKKworCXJldCA9IGFkYzEyMTM4X3N0YXJ0X2NvbnYoYWRjLCBjaGFubmVsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWRjMTIxMzhfd2FpdF9lb2MoYWRjLCBtc2Vjc190b19qaWZmaWVzKDEwMCkpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gYWRjMTIxMzhfcmVhZF9jb252X2RhdGEoYWRjLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgYWRjMTIxMzhfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmlpbywKKwkJCSAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW5uZWwsIGludCAqdmFsdWUsCisJCQkgICAgIGludCAqc2hpZnQsIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgYWRjMTIxMzggKmFkYyA9IGlpb19wcml2KGlpbyk7CisJaW50IHJldDsKKwlfX2JlMTYgZGF0YTsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCW11dGV4X2xvY2soJmFkYy0+bG9jayk7CisJCXJldCA9IGFkYzEyMTM4X2FkY19jb252ZXJzaW9uKGFkYywgY2hhbm5lbCwgJmRhdGEpOworCQltdXRleF91bmxvY2soJmFkYy0+bG9jayk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCSp2YWx1ZSA9IHNpZ25fZXh0ZW5kMzIoYmUxNl90b19jcHUoZGF0YSkgPj4gMywgMTIpOworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXJldCA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShhZGMtPnZyZWZfcCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbHVlID0gcmV0OworCisJCWlmICghSVNfRVJSKGFkYy0+dnJlZl9uKSkgeworCQkJcmV0ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKGFkYy0+dnJlZl9uKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQkqdmFsdWUgLT0gcmV0OworCQl9CisKKwkJLyogY29udmVydCByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UgdG8gbVYgKi8KKwkJKnZhbHVlIC89IDEwMDA7CisJCSpzaGlmdCA9IGNoYW5uZWwtPnNjYW5fdHlwZS5yZWFsYml0cyAtIDE7CisKKwkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTF9MT0cyOworCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6CisJCWlmICghSVNfRVJSKGFkYy0+dnJlZl9uKSkgeworCQkJKnZhbHVlID0gcmVndWxhdG9yX2dldF92b2x0YWdlKGFkYy0+dnJlZl9uKTsKKwkJCWlmICgqdmFsdWUgPCAwKQorCQkJCXJldHVybiAqdmFsdWU7CisJCX0gZWxzZSB7CisJCQkqdmFsdWUgPSAwOworCQl9CisKKwkJLyogY29udmVydCByZWd1bGF0b3Igb3V0cHV0IHZvbHRhZ2UgdG8gbVYgKi8KKwkJKnZhbHVlIC89IDEwMDA7CisKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkYzEyMTM4X2luZm8gPSB7CisJLnJlYWRfcmF3ID0gYWRjMTIxMzhfcmVhZF9yYXcsCisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgYWRjMTIxMzhfaW5pdChzdHJ1Y3QgYWRjMTIxMzggKmFkYykKK3sKKwlpbnQgcmV0OworCWludCBzdGF0dXM7CisJdTggbW9kZTsKKwl1OCB0cmFzaDsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZhZGMtPmNvbXBsZXRlKTsKKworCXJldCA9IGFkYzEyMTM4X21vZGVfcHJvZ3JhbW1pbmcoYWRjLCBBREMxMjEzOF9NT0RFX0FVVE9fQ0FMLCAmdHJhc2gsIDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBkYXRhIG91dHB1dCBhdCB0aGlzIHRpbWUgaGFzIG5vIHNpZ25pZmljYW5jZSAqLworCXN0YXR1cyA9IGFkYzEyMTM4X3JlYWRfc3RhdHVzKGFkYyk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlhZGMxMjEzOF93YWl0X2VvYyhhZGMsIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CisKKwlzdGF0dXMgPSBhZGMxMjEzOF9yZWFkX3N0YXR1cyhhZGMpOworCWlmIChzdGF0dXMgJiBBREMxMjEzOF9TVEFUVVNfQ0FMKSB7CisJCWRldl93YXJuKCZhZGMtPnNwaS0+ZGV2LAorCQkJIkF1dG8gQ2FsIHNlcXVlbmNlIGlzIHN0aWxsIGluIHByb2dyZXNzOiAlI3hcbiIsCisJCQlzdGF0dXMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzd2l0Y2ggKGFkYy0+YWNxdWlzaXRpb25fdGltZSkgeworCWNhc2UgNjoKKwkJbW9kZSA9IEFEQzEyMTM4X01PREVfQUNRVUlTSVRJT05fVElNRV82OworCQlicmVhazsKKwljYXNlIDEwOgorCQltb2RlID0gQURDMTIxMzhfTU9ERV9BQ1FVSVNJVElPTl9USU1FXzEwOworCQlicmVhazsKKwljYXNlIDE4OgorCQltb2RlID0gQURDMTIxMzhfTU9ERV9BQ1FVSVNJVElPTl9USU1FXzE4OworCQlicmVhazsKKwljYXNlIDM0OgorCQltb2RlID0gQURDMTIxMzhfTU9ERV9BQ1FVSVNJVElPTl9USU1FXzM0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gYWRjMTIxMzhfbW9kZV9wcm9ncmFtbWluZyhhZGMsIG1vZGUsICZ0cmFzaCwgMSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhZGMxMjEzOF90cmlnZ2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OworCXN0cnVjdCBhZGMxMjEzOCAqYWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlfX2JlMTYgZGF0YVsyMF0gPSB7IH07IC8qIDE2eCAyIGJ5dGVzIEFEQyBkYXRhICsgOCBieXRlcyB0aW1lc3RhbXAgKi8KKwlfX2JlMTYgdHJhc2g7CisJaW50IHJldDsKKwlpbnQgc2Nhbl9pbmRleDsKKwlpbnQgaSA9IDA7CisKKwltdXRleF9sb2NrKCZhZGMtPmxvY2spOworCisJZm9yX2VhY2hfc2V0X2JpdChzY2FuX2luZGV4LCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssCisJCQkgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKSB7CisJCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpzY2FuX2NoYW4gPQorCQkJCSZpbmRpb19kZXYtPmNoYW5uZWxzW3NjYW5faW5kZXhdOworCisJCXJlaW5pdF9jb21wbGV0aW9uKCZhZGMtPmNvbXBsZXRlKTsKKworCQlyZXQgPSBhZGMxMjEzOF9zdGFydF9hbmRfcmVhZF9jb252KGFkYywgc2Nhbl9jaGFuLAorCQkJCQkJICAgaSA/ICZkYXRhW2kgLSAxXSA6ICZ0cmFzaCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl93YXJuKCZhZGMtPnNwaS0+ZGV2LAorCQkJCSAiZmFpbGVkIHRvIHN0YXJ0IGNvbnZlcnNpb25cbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBhZGMxMjEzOF93YWl0X2VvYyhhZGMsIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl93YXJuKCZhZGMtPnNwaS0+ZGV2LCAid2FpdCBlb2MgdGltZW91dFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWkrKzsKKwl9CisKKwlpZiAoaSkgeworCQlyZXQgPSBhZGMxMjEzOF9yZWFkX2NvbnZfZGF0YShhZGMsICZkYXRhW2kgLSAxXSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl93YXJuKCZhZGMtPnNwaS0+ZGV2LAorCQkJCSAiZmFpbGVkIHRvIGdldCBjb252ZXJzaW9uIGRhdGFcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgZGF0YSwKKwkJCQkJICAgaWlvX2dldF90aW1lX25zKGluZGlvX2RldikpOworb3V0OgorCW11dGV4X3VubG9jaygmYWRjLT5sb2NrKTsKKworCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhZGMxMjEzOF9lb2NfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwOworCXN0cnVjdCBhZGMxMjEzOCAqYWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWNvbXBsZXRlKCZhZGMtPmNvbXBsZXRlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBhZGMxMjEzOF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IGFkYzEyMTM4ICphZGM7CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmc3BpLT5kZXYsIHNpemVvZigqYWRjKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRjID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlhZGMtPnNwaSA9IHNwaTsKKwlhZGMtPmlkID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+ZHJpdmVyX2RhdGE7CisJbXV0ZXhfaW5pdCgmYWRjLT5sb2NrKTsKKwlpbml0X2NvbXBsZXRpb24oJmFkYy0+Y29tcGxldGUpOworCisJaW5kaW9fZGV2LT5uYW1lID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+bmFtZTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJaW5kaW9fZGV2LT5pbmZvID0gJmFkYzEyMTM4X2luZm87CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJc3dpdGNoIChhZGMtPmlkKSB7CisJY2FzZSBhZGMxMjEzMDoKKwljYXNlIGFkYzEyMTMyOgorCQlpbmRpb19kZXYtPmNoYW5uZWxzID0gYWRjMTIxMzJfY2hhbm5lbHM7CisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShhZGMxMjEzMl9jaGFubmVscyk7CisJCWJyZWFrOworCWNhc2UgYWRjMTIxMzg6CisJCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBhZGMxMjEzOF9jaGFubmVsczsKKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFkYzEyMTM4X2NoYW5uZWxzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoc3BpLT5kZXYub2Zfbm9kZSwgInRpLGFjcXVpc2l0aW9uLXRpbWUiLAorCQkJCSAgICZhZGMtPmFjcXVpc2l0aW9uX3RpbWUpOworCWlmIChyZXQpCisJCWFkYy0+YWNxdWlzaXRpb25fdGltZSA9IDEwOworCisJYWRjLT5jY2xrID0gZGV2bV9jbGtfZ2V0KCZzcGktPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihhZGMtPmNjbGspKQorCQlyZXR1cm4gUFRSX0VSUihhZGMtPmNjbGspOworCisJYWRjLT52cmVmX3AgPSBkZXZtX3JlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidnJlZi1wIik7CisJaWYgKElTX0VSUihhZGMtPnZyZWZfcCkpCisJCXJldHVybiBQVFJfRVJSKGFkYy0+dnJlZl9wKTsKKworCWFkYy0+dnJlZl9uID0gZGV2bV9yZWd1bGF0b3JfZ2V0X29wdGlvbmFsKCZzcGktPmRldiwgInZyZWYtbiIpOworCWlmIChJU19FUlIoYWRjLT52cmVmX24pKSB7CisJCS8qCisJCSAqIEFzc3VtZSB2cmVmX24gaXMgMFYgaWYgYW4gb3B0aW9uYWwgcmVndWxhdG9yIGlzIG5vdAorCQkgKiBzcGVjaWZpZWQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGVycm9yIGNvZGUuCisJCSAqLworCQlyZXQgPSBQVFJfRVJSKGFkYy0+dnJlZl9uKTsKKwkJaWYgKHJldCAhPSAtRU5PREVWKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZzcGktPmRldiwgc3BpLT5pcnEsIGFkYzEyMTM4X2VvY19oYW5kbGVyLAorCQkJICAgICAgIElSUUZfVFJJR0dFUl9SSVNJTkcsIGluZGlvX2Rldi0+bmFtZSwgaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGFkYy0+Y2Nsayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYWRjLT52cmVmX3ApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2Nsa19kaXNhYmxlOworCisJaWYgKCFJU19FUlIoYWRjLT52cmVmX24pKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYWRjLT52cmVmX24pOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfdnJlZl9wX2Rpc2FibGU7CisJfQorCisJcmV0ID0gYWRjMTIxMzhfaW5pdChhZGMpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3ZyZWZfbl9kaXNhYmxlOworCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgaW5kaW9fZGV2KTsKKworCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgTlVMTCwKKwkJCQkJIGFkYzEyMTM4X3RyaWdnZXJfaGFuZGxlciwgTlVMTCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdnJlZl9uX2Rpc2FibGU7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfYnVmZmVyX2NsZWFudXA7CisKKwlyZXR1cm4gMDsKK2Vycl9idWZmZXJfY2xlYW51cDoKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CitlcnJfdnJlZl9uX2Rpc2FibGU6CisJaWYgKCFJU19FUlIoYWRjLT52cmVmX24pKQorCQlyZWd1bGF0b3JfZGlzYWJsZShhZGMtPnZyZWZfbik7CitlcnJfdnJlZl9wX2Rpc2FibGU6CisJcmVndWxhdG9yX2Rpc2FibGUoYWRjLT52cmVmX3ApOworZXJyX2Nsa19kaXNhYmxlOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShhZGMtPmNjbGspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZGMxMjEzOF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisJc3RydWN0IGFkYzEyMTM4ICphZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCWlmICghSVNfRVJSKGFkYy0+dnJlZl9uKSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoYWRjLT52cmVmX24pOworCXJlZ3VsYXRvcl9kaXNhYmxlKGFkYy0+dnJlZl9wKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoYWRjLT5jY2xrKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX09GCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFkYzEyMTM4X2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAidGksYWRjMTIxMzAiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksYWRjMTIxMzIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksYWRjMTIxMzgiLCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWRjMTIxMzhfZHRfaWRzKTsKKworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZGMxMjEzOF9pZFtdID0geworCXsgImFkYzEyMTMwIiwgYWRjMTIxMzAgfSwKKwl7ICJhZGMxMjEzMiIsIGFkYzEyMTMyIH0sCisJeyAiYWRjMTIxMzgiLCBhZGMxMjEzOCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGFkYzEyMTM4X2lkKTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkYzEyMTM4X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZGMxMjEzOCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihhZGMxMjEzOF9kdF9pZHMpLAorCX0sCisJLnByb2JlID0gYWRjMTIxMzhfcHJvYmUsCisJLnJlbW92ZSA9IGFkYzEyMTM4X3JlbW92ZSwKKwkuaWRfdGFibGUgPSBhZGMxMjEzOF9pZCwKK307Cittb2R1bGVfc3BpX2RyaXZlcihhZGMxMjEzOF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJBa2lub2J1IE1pdGEgPGFraW5vYnUubWl0YUBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFEQzEyMTMwL0FEQzEyMTMyL0FEQzEyMTM4IGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3RpLWFkYzE2MXM2MjYuYyBiL2RyaXZlcnMvaWlvL2FkYy90aS1hZGMxNjFzNjI2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0YjY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL2FkYy90aS1hZGMxNjFzNjI2LmMKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiB0aS1hZGMxNjFzNjI2LmMgLSBUZXhhcyBJbnN0cnVtZW50cyBBREMxNjFTNjI2IDEtY2hhbm5lbCBkaWZmZXJlbnRpYWwgQURDCisgKgorICogQURDIERldmljZXMgU3VwcG9ydGVkOgorICogIGFkYzE0MXM2MjYgLSAxNC1iaXQgQURDCisgKiAgYWRjMTYxczYyNiAtIDE2LWJpdCBBREMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTWF0dCBSYW5vc3RheSA8bXJhbm9zdGF5QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oPgorCisjZGVmaW5lIFRJX0FEQ19EUlZfTkFNRQkidGktYWRjMTYxczYyNiIKKworZW51bSB7CisJVElfQURDMTQxUzYyNiwKKwlUSV9BREMxNjFTNjI2LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHRpX2FkYzE0MXM2MjZfY2hhbm5lbHNbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCS5jaGFubmVsID0gMCwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCisJCS5zY2FuX2luZGV4ID0gMCwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5zaWduID0gJ3MnLAorCQkJLnJlYWxiaXRzID0gMTQsCisJCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJfSwKKwl9LAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHRpX2FkYzE2MXM2MjZfY2hhbm5lbHNbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCS5jaGFubmVsID0gMCwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCisJCS5zY2FuX2luZGV4ID0gMCwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5zaWduID0gJ3MnLAorCQkJLnJlYWxiaXRzID0gMTYsCisJCQkuc3RvcmFnZWJpdHMgPSAxNiwKKwkJfSwKKwl9LAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDEpLAorfTsKKworc3RydWN0IHRpX2FkY19kYXRhIHsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CisJdTggcmVhZF9zaXplOworCXU4IHNoaWZ0OworCisJdTggYnVmZmVyWzE2XSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7Cit9OworCitzdGF0aWMgaW50IHRpX2FkY19yZWFkX21lYXN1cmVtZW50KHN0cnVjdCB0aV9hZGNfZGF0YSAqZGF0YSwKKwkJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50ICp2YWwpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAoZGF0YS0+cmVhZF9zaXplKSB7CisJY2FzZSAyOiB7CisJCV9fYmUxNiBidWY7CisKKwkJcmV0ID0gc3BpX3JlYWQoZGF0YS0+c3BpLCAodm9pZCAqKSAmYnVmLCAyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJKnZhbCA9IGJlMTZfdG9fY3B1KGJ1Zik7CisJCWJyZWFrOworCX0KKwljYXNlIDM6IHsKKwkJX19iZTMyIGJ1ZjsKKworCQlyZXQgPSBzcGlfcmVhZChkYXRhLT5zcGksICh2b2lkICopICZidWYsIDMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkqdmFsID0gYmUzMl90b19jcHUoYnVmKSA+PiA4OworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKnZhbCA9IHNpZ25fZXh0ZW5kMzIoKnZhbCA+PiBkYXRhLT5zaGlmdCwgY2hhbi0+c2Nhbl90eXBlLnJlYWxiaXRzIC0gMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHRpX2FkY190cmlnZ2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwcml2YXRlOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OworCXN0cnVjdCB0aV9hZGNfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXJldCA9IHRpX2FkY19yZWFkX21lYXN1cmVtZW50KGRhdGEsICZpbmRpb19kZXYtPmNoYW5uZWxzWzBdLAorCQkJCSAgICAgKGludCAqKSAmZGF0YS0+YnVmZmVyKTsKKwlpZiAoIXJldCkKKwkJaWlvX3B1c2hfdG9fYnVmZmVyc193aXRoX3RpbWVzdGFtcChpbmRpb19kZXYsCisJCQkJCWRhdGEtPmJ1ZmZlciwKKwkJCQkJaWlvX2dldF90aW1lX25zKGluZGlvX2RldikpOworCisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB0aV9hZGNfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCB0aV9hZGNfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCWlmIChtYXNrICE9IElJT19DSEFOX0lORk9fUkFXKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGlpb19kZXZpY2VfY2xhaW1fZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdGlfYWRjX3JlYWRfbWVhc3VyZW1lbnQoZGF0YSwgY2hhbiwgdmFsKTsKKwlpaW9fZGV2aWNlX3JlbGVhc2VfZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKworCWlmICghcmV0KQorCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyB0aV9hZGNfaW5mbyA9IHsKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5yZWFkX3JhdyA9IHRpX2FkY19yZWFkX3JhdywKK307CisKK3N0YXRpYyBpbnQgdGlfYWRjX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgdGlfYWRjX2RhdGEgKmRhdGE7CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmc3BpLT5kZXYsIHNpemVvZigqZGF0YSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluZGlvX2Rldi0+aW5mbyA9ICZ0aV9hZGNfaW5mbzsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CisJaW5kaW9fZGV2LT5kZXYub2Zfbm9kZSA9IHNwaS0+ZGV2Lm9mX25vZGU7CisJaW5kaW9fZGV2LT5uYW1lID0gVElfQURDX0RSVl9OQU1FOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBpbmRpb19kZXYpOworCisJZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJZGF0YS0+c3BpID0gc3BpOworCisJc3dpdGNoIChzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YSkgeworCWNhc2UgVElfQURDMTQxUzYyNjoKKwkJaW5kaW9fZGV2LT5jaGFubmVscyA9IHRpX2FkYzE0MXM2MjZfY2hhbm5lbHM7CisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRSh0aV9hZGMxNDFzNjI2X2NoYW5uZWxzKTsKKwkJZGF0YS0+c2hpZnQgPSAwOworCQlkYXRhLT5yZWFkX3NpemUgPSAyOworCQlicmVhazsKKwljYXNlIFRJX0FEQzE2MVM2MjY6CisJCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSB0aV9hZGMxNjFzNjI2X2NoYW5uZWxzOworCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUodGlfYWRjMTYxczYyNl9jaGFubmVscyk7CisJCWRhdGEtPnNoaWZ0ID0gNjsKKwkJZGF0YS0+cmVhZF9zaXplID0gMzsKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAorCQkJCQkgdGlfYWRjX3RyaWdnZXJfaGFuZGxlciwgTlVMTCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX2J1ZmZlcjsKKworCXJldHVybiAwOworCitlcnJvcl91bnJlZ19idWZmZXI6CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0aV9hZGNfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRpX2FkY19kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLGFkYzE0MXM2MjYiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksYWRjMTYxczYyNiIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0aV9hZGNfZHRfaWRzKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIHRpX2FkY19pZFtdID0geworCXsiYWRjMTQxczYyNiIsIFRJX0FEQzE0MVM2MjZ9LAorCXsiYWRjMTYxczYyNiIsIFRJX0FEQzE2MVM2MjZ9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCB0aV9hZGNfaWQpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgdGlfYWRjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9IFRJX0FEQ19EUlZfTkFNRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRpX2FkY19kdF9pZHMpLAorCX0sCisJLnByb2JlCQk9IHRpX2FkY19wcm9iZSwKKwkucmVtb3ZlCQk9IHRpX2FkY19yZW1vdmUsCisJLmlkX3RhYmxlCT0gdGlfYWRjX2lkLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKHRpX2FkY19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJNYXR0IFJhbm9zdGF5IDxtcmFub3N0YXlAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUZXhhcyBJbnN0cnVtZW50cyBBREMxeDFTIDEtY2hhbm5lbCBkaWZmZXJlbnRpYWwgQURDIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvdGktYWRzMTAxNS5jIGIvZHJpdmVycy9paW8vYWRjL3RpLWFkczEwMTUuYwppbmRleCAxZWYzOTg3Ny4uY2RlNmYxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL3RpLWFkczEwMTUuYworKysgYi9kcml2ZXJzL2lpby9hZGMvdGktYWRzMTAxNS5jCkBAIC00ODksNyArNDg5LDggQEAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBpbnQgYWRzMTAxNV9nZXRfY2hhbm5lbHNfY29uZmlnX29mKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IGFkczEwMTVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgYWRzMTAxNV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CiAKIAlpZiAoIWNsaWVudC0+ZGV2Lm9mX25vZGUgfHwKQEAgLTUyMSw2ICs1MjIsNyBAQAogCQkJaWYgKHBnYSA+IDYpIHsKIAkJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImludmFsaWQgZ2FpbiBvbiAlc1xuIiwKIAkJCQkJbm9kZS0+ZnVsbF9uYW1lKTsKKwkJCQlvZl9ub2RlX3B1dChub2RlKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfQpAQCAtNTMxLDYgKzUzMyw3IEBACiAJCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCiAJCQkJCSJpbnZhbGlkIGRhdGFfcmF0ZSBvbiAlc1xuIiwKIAkJCQkJbm9kZS0+ZnVsbF9uYW1lKTsKKwkJCQlvZl9ub2RlX3B1dChub2RlKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3RpLWFkczg2ODguYyBiL2RyaXZlcnMvaWlvL2FkYy90aS1hZHM4Njg4LmMKaW5kZXggYzQwMDQzOS4uNGExNjM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL3RpLWFkczg2ODguYworKysgYi9kcml2ZXJzL2lpby9hZGMvdGktYWRzODY4OC5jCkBAIC00MzgsNyArNDM4LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3Jfb3V0OgotCWlmICghSVNfRVJSX09SX05VTEwoc3QtPnJlZykpCisJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCiAJcmV0dXJuIHJldDsKQEAgLTQ1MSw3ICs0NTEsNyBAQAogCiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKHN0LT5yZWcpKQorCWlmICghSVNfRVJSKHN0LT5yZWcpKQogCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL3RpX2FtMzM1eF9hZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy90aV9hbTMzNXhfYWRjLmMKaW5kZXggOGEzNjg3NS4uYzNjZmFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL3RpX2FtMzM1eF9hZGMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvdGlfYW0zMzV4X2FkYy5jCkBAIC0zMiw2ICszMiw3IEBACiAKIHN0cnVjdCB0aWFkY19kZXZpY2UgewogCXN0cnVjdCB0aV90c2NhZGNfZGV2ICptZmRfdHNjYWRjOworCXN0cnVjdCBtdXRleCBmaWZvMV9sb2NrOyAvKiB0byBwcm90ZWN0IGZpZm8gYWNjZXNzICovCiAJaW50IGNoYW5uZWxzOwogCXU4IGNoYW5uZWxfbGluZVs4XTsKIAl1OCBjaGFubmVsX3N0ZXBbOF07CkBAIC0zNTksNiArMzYwLDcgQEAKIAkJaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQogewogCXN0cnVjdCB0aWFkY19kZXZpY2UgKmFkY19kZXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQgPSBJSU9fVkFMX0lOVDsKIAlpbnQgaSwgbWFwX3ZhbDsKIAl1bnNpZ25lZCBpbnQgZmlmbzFjb3VudCwgcmVhZCwgc3RlcGlkOwogCWJvb2wgZm91bmQgPSBmYWxzZTsKQEAgLTM3MiwxMyArMzc0LDE0IEBACiAJaWYgKCFzdGVwX2VuKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCW11dGV4X2xvY2soJmFkY19kZXYtPmZpZm8xX2xvY2spOwogCWZpZm8xY291bnQgPSB0aWFkY19yZWFkbChhZGNfZGV2LCBSRUdfRklGTzFDTlQpOwogCXdoaWxlIChmaWZvMWNvdW50LS0pCiAJCXRpYWRjX3JlYWRsKGFkY19kZXYsIFJFR19GSUZPMSk7CiAKIAlhbTMzNXhfdHNjX3NlX3NldF9vbmNlKGFkY19kZXYtPm1mZF90c2NhZGMsIHN0ZXBfZW4pOwogCi0JdGltZW91dCA9IGppZmZpZXMgKyB1c2Vjc190b19qaWZmaWVzCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzCiAJCQkJKElETEVfVElNRU9VVCAqIGFkY19kZXYtPmNoYW5uZWxzKTsKIAkvKiBXYWl0IGZvciBGaWZvIHRocmVzaG9sZCBpbnRlcnJ1cHQgKi8KIAl3aGlsZSAoMSkgewpAQCAtMzg4LDcgKzM5MSw4IEBACiAKIAkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKIAkJCWFtMzM1eF90c2Nfc2VfYWRjX2RvbmUoYWRjX2Rldi0+bWZkX3RzY2FkYyk7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIGVycl91bmxvY2s7CiAJCX0KIAl9CiAJbWFwX3ZhbCA9IGFkY19kZXYtPmNoYW5uZWxfc3RlcFtjaGFuLT5zY2FuX2luZGV4XTsKQEAgLTQxNCw4ICs0MTgsMTEgQEAKIAlhbTMzNXhfdHNjX3NlX2FkY19kb25lKGFkY19kZXYtPm1mZF90c2NhZGMpOwogCiAJaWYgKGZvdW5kID09IGZhbHNlKQotCQlyZXR1cm4gLUVCVVNZOwotCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJcmV0ID0gIC1FQlVTWTsKKworZXJyX3VubG9jazoKKwltdXRleF91bmxvY2soJmFkY19kZXYtPmZpZm8xX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gdGlhZGNfaW5mbyA9IHsKQEAgLTQ4Myw2ICs0OTAsNyBAQAogCiAJdGlhZGNfc3RlcF9jb25maWcoaW5kaW9fZGV2KTsKIAl0aWFkY193cml0ZWwoYWRjX2RldiwgUkVHX0ZJRk8xVEhSLCBGSUZPMV9USFJFU0hPTEQpOworCW11dGV4X2luaXQoJmFkY19kZXYtPmZpZm8xX2xvY2spOwogCiAJZXJyID0gdGlhZGNfY2hhbm5lbF9pbml0KGluZGlvX2RldiwgYWRjX2Rldi0+Y2hhbm5lbHMpOwogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYnVmZmVyL2luZHVzdHJpYWxpby1idWZmZXItY2IuYyBiL2RyaXZlcnMvaWlvL2J1ZmZlci9pbmR1c3RyaWFsaW8tYnVmZmVyLWNiLmMKaW5kZXggMzIzMDc5Yy4uYjhmNTUwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYnVmZmVyL2luZHVzdHJpYWxpby1idWZmZXItY2IuYworKysgYi9kcml2ZXJzL2lpby9idWZmZXIvaW5kdXN0cmlhbGlvLWJ1ZmZlci1jYi5jCkBAIC0xOCw2ICsxOCw3IEBACiAJaW50ICgqY2IpKGNvbnN0IHZvaWQgKmRhdGEsIHZvaWQgKnByaXZhdGUpOwogCXZvaWQgKnByaXZhdGU7CiAJc3RydWN0IGlpb19jaGFubmVsICpjaGFubmVsczsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwogfTsKIAogc3RhdGljIHN0cnVjdCBpaW9fY2JfYnVmZmVyICpidWZmZXJfdG9fY2JfYnVmZmVyKHN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIpCkBAIC01Miw3ICs1Myw2IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2NiX2J1ZmZlciAqY2JfYnVmZjsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwogCXN0cnVjdCBpaW9fY2hhbm5lbCAqY2hhbjsKIAogCWNiX2J1ZmYgPSBremFsbG9jKHNpemVvZigqY2JfYnVmZiksIEdGUF9LRVJORUwpOwpAQCAtNzIsMTcgKzcyLDE3IEBACiAJCWdvdG8gZXJyb3JfZnJlZV9jYl9idWZmOwogCX0KIAotCWluZGlvX2RldiA9IGNiX2J1ZmYtPmNoYW5uZWxzWzBdLmluZGlvX2RldjsKKwljYl9idWZmLT5pbmRpb19kZXYgPSBjYl9idWZmLT5jaGFubmVsc1swXS5pbmRpb19kZXY7CiAJY2JfYnVmZi0+YnVmZmVyLnNjYW5fbWFzawotCQk9IGtjYWxsb2MoQklUU19UT19MT05HUyhpbmRpb19kZXYtPm1hc2tsZW5ndGgpLCBzaXplb2YobG9uZyksCi0JCQkgIEdGUF9LRVJORUwpOworCQk9IGtjYWxsb2MoQklUU19UT19MT05HUyhjYl9idWZmLT5pbmRpb19kZXYtPm1hc2tsZW5ndGgpLAorCQkJICBzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOwogCWlmIChjYl9idWZmLT5idWZmZXIuc2Nhbl9tYXNrID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9yZWxlYXNlX2NoYW5uZWxzOwogCX0KIAljaGFuID0gJmNiX2J1ZmYtPmNoYW5uZWxzWzBdOwogCXdoaWxlIChjaGFuLT5pbmRpb19kZXYpIHsKLQkJaWYgKGNoYW4tPmluZGlvX2RldiAhPSBpbmRpb19kZXYpIHsKKwkJaWYgKGNoYW4tPmluZGlvX2RldiAhPSBjYl9idWZmLT5pbmRpb19kZXYpIHsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycm9yX2ZyZWVfc2Nhbl9tYXNrOwogCQl9CkBAIC0xMDUsMTcgKzEwNSwxNCBAQAogCiBpbnQgaWlvX2NoYW5uZWxfc3RhcnRfYWxsX2NiKHN0cnVjdCBpaW9fY2JfYnVmZmVyICpjYl9idWZmKQogewotCXJldHVybiBpaW9fdXBkYXRlX2J1ZmZlcnMoY2JfYnVmZi0+Y2hhbm5lbHNbMF0uaW5kaW9fZGV2LAotCQkJCSAgJmNiX2J1ZmYtPmJ1ZmZlciwKKwlyZXR1cm4gaWlvX3VwZGF0ZV9idWZmZXJzKGNiX2J1ZmYtPmluZGlvX2RldiwgJmNiX2J1ZmYtPmJ1ZmZlciwKIAkJCQkgIE5VTEwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWlvX2NoYW5uZWxfc3RhcnRfYWxsX2NiKTsKIAogdm9pZCBpaW9fY2hhbm5lbF9zdG9wX2FsbF9jYihzdHJ1Y3QgaWlvX2NiX2J1ZmZlciAqY2JfYnVmZikKIHsKLQlpaW9fdXBkYXRlX2J1ZmZlcnMoY2JfYnVmZi0+Y2hhbm5lbHNbMF0uaW5kaW9fZGV2LAotCQkJICAgTlVMTCwKLQkJCSAgICZjYl9idWZmLT5idWZmZXIpOworCWlpb191cGRhdGVfYnVmZmVycyhjYl9idWZmLT5pbmRpb19kZXYsIE5VTEwsICZjYl9idWZmLT5idWZmZXIpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWlvX2NoYW5uZWxfc3RvcF9hbGxfY2IpOwogCkBAIC0xMzMsNiArMTMwLDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpaW9fY2hhbm5lbF9jYl9nZXRfY2hhbm5lbHMpOwogCitzdHJ1Y3QgaWlvX2RldgorKmlpb19jaGFubmVsX2NiX2dldF9paW9fZGV2KGNvbnN0IHN0cnVjdCBpaW9fY2JfYnVmZmVyICpjYl9idWZmZXIpCit7CisJcmV0dXJuIGNiX2J1ZmZlci0+aW5kaW9fZGV2OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWlvX2NoYW5uZWxfY2JfZ2V0X2lpb19kZXYpOworCiBNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BrZXJuZWwub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJbmR1c3RyaWFsIEkvTyBjYWxsYmFjayBidWZmZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2J1ZmZlci9pbmR1c3RyaWFsaW8tdHJpZ2dlcmVkLWJ1ZmZlci5jIGIvZHJpdmVycy9paW8vYnVmZmVyL2luZHVzdHJpYWxpby10cmlnZ2VyZWQtYnVmZmVyLmMKaW5kZXggNGIyODU4Yi4uZDNkYjFmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYnVmZmVyL2luZHVzdHJpYWxpby10cmlnZ2VyZWQtYnVmZmVyLmMKKysrIGIvZHJpdmVycy9paW8vYnVmZmVyL2luZHVzdHJpYWxpby10cmlnZ2VyZWQtYnVmZmVyLmMKQEAgLTk4LDYgKzk4LDQ4IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXApOwogCitzdGF0aWMgdm9pZCBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFuKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcmVzKQoreworCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoKihzdHJ1Y3QgaWlvX2RldiAqKilyZXMpOworfQorCitpbnQgZGV2bV9paW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgIGlycXJldHVybl90ICgqaCkoaW50IGlycSwgdm9pZCAqcCksCisJCQkJICAgIGlycXJldHVybl90ICgqdGhyZWFkKShpbnQgaXJxLCB2b2lkICpwKSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzICpvcHMpCit7CisJc3RydWN0IGlpb19kZXYgKipwdHI7CisJaW50IHJldDsKKworCXB0ciA9IGRldnJlc19hbGxvYyhkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFuLCBzaXplb2YoKnB0ciksCisJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkqcHRyID0gaW5kaW9fZGV2OworCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBoLCB0aHJlYWQsIG9wcyk7CisJaWYgKCFyZXQpCisJCWRldnJlc19hZGQoZGV2LCBwdHIpOworCWVsc2UKKwkJZGV2cmVzX2ZyZWUocHRyKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKTsKKwordm9pZCBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByYzsKKworCXJjID0gZGV2cmVzX3JlbGVhc2UoZGV2LCBkZXZtX2lpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFuLAorCQkJICAgIGRldm1faWlvX2RldmljZV9tYXRjaCwgaW5kaW9fZGV2KTsKKwlXQVJOX09OKHJjKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cCk7CisKIE1PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJSU8gaGVscGVyIGZ1bmN0aW9ucyBmb3Igc2V0dGluZyB1cCB0cmlnZ2VyZWQgYnVmZmVycyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY2hlbWljYWwvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2NoZW1pY2FsL0tjb25maWcKaW5kZXggNGJjYzAyNS4uY2VhN2Y5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vY2hlbWljYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9jaGVtaWNhbC9LY29uZmlnCkBAIC0xNiw2ICsxNiw3IEBACiAJIEF0bGFzIFNjaWVudGlmaWMgT0VNIFNNIHNlbnNvcnM6CiAJICAgICogcEggU00gc2Vuc29yCiAJICAgICogRUMgU00gc2Vuc29yCisJICAgICogT1JQIFNNIHNlbnNvcgogCiAJIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGF0bGFzLXBoLXNlbnNvci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2NoZW1pY2FsL2F0bGFzLXBoLXNlbnNvci5jIGIvZHJpdmVycy9paW8vY2hlbWljYWwvYXRsYXMtcGgtc2Vuc29yLmMKaW5kZXggYWUwMzhhNS4uYmQzMjFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vY2hlbWljYWwvYXRsYXMtcGgtc2Vuc29yLmMKKysrIGIvZHJpdmVycy9paW8vY2hlbWljYWwvYXRsYXMtcGgtc2Vuc29yLmMKQEAgLTY2LDEyICs2NiwxNyBAQAogI2RlZmluZSBBVExBU19SRUdfVERTX0RBVEEJCTB4MWMKICNkZWZpbmUgQVRMQVNfUkVHX1BTU19EQVRBCQkweDIwCiAKKyNkZWZpbmUgQVRMQVNfUkVHX09SUF9DQUxJQl9TVEFUVVMJMHgwZAorI2RlZmluZSBBVExBU19SRUdfT1JQX0RBVEEJCTB4MGUKKwogI2RlZmluZSBBVExBU19QSF9JTlRfVElNRV9JTl9VUwkJNDUwMDAwCiAjZGVmaW5lIEFUTEFTX0VDX0lOVF9USU1FX0lOX1VTCQk2NTAwMDAKKyNkZWZpbmUgQVRMQVNfT1JQX0lOVF9USU1FX0lOX1VTCTQ1MDAwMAogCiBlbnVtIHsKIAlBVExBU19QSF9TTSwKIAlBVExBU19FQ19TTSwKKwlBVExBU19PUlBfU00sCiB9OwogCiBzdHJ1Y3QgYXRsYXNfZGF0YSB7CkBAIC04NCwyNiArODksMTAgQEAKIAlfX2JlMzIgYnVmZmVyWzZdOyAvKiA5Ni1iaXQgZGF0YSArIDMyLWJpdCBwYWQgKyA2NC1iaXQgdGltZXN0YW1wICovCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9yYW5nZSBhdGxhc192b2xhdGlsZV9yYW5nZXNbXSA9IHsKLQlyZWdtYXBfcmVnX3JhbmdlKEFUTEFTX1JFR19JTlRfQ09OVFJPTCwgQVRMQVNfUkVHX0lOVF9DT05UUk9MKSwKLQlyZWdtYXBfcmVnX3JhbmdlKEFUTEFTX1JFR19QSF9EQVRBLCBBVExBU19SRUdfUEhfREFUQSArIDQpLAotCXJlZ21hcF9yZWdfcmFuZ2UoQVRMQVNfUkVHX0VDX0RBVEEsIEFUTEFTX1JFR19QU1NfREFUQSArIDQpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfYWNjZXNzX3RhYmxlIGF0bGFzX3ZvbGF0aWxlX3RhYmxlID0gewotCS55ZXNfcmFuZ2VzCT0gYXRsYXNfdm9sYXRpbGVfcmFuZ2VzLAotCS5uX3llc19yYW5nZXMJPSBBUlJBWV9TSVpFKGF0bGFzX3ZvbGF0aWxlX3JhbmdlcyksCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYXRsYXNfcmVnbWFwX2NvbmZpZyA9IHsKIAkubmFtZSA9IEFUTEFTX1JFR01BUF9OQU1FLAotCiAJLnJlZ19iaXRzID0gOCwKIAkudmFsX2JpdHMgPSA4LAotCi0JLnZvbGF0aWxlX3RhYmxlID0gJmF0bGFzX3ZvbGF0aWxlX3RhYmxlLAotCS5tYXhfcmVnaXN0ZXIgPSBBVExBU19SRUdfUFNTX0RBVEEgKyA0LAotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGF0bGFzX3BoX2NoYW5uZWxzW10gPSB7CkBAIC0xNzUsNiArMTY0LDIzIEBACiAJfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBhdGxhc19vcnBfY2hhbm5lbHNbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCS5hZGRyZXNzID0gQVRMQVNfUkVHX09SUF9EQVRBLAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0KKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksCisJCS5zY2FuX2luZGV4ID0gMCwKKwkJLnNjYW5fdHlwZSA9IHsKKwkJCS5zaWduID0gJ3MnLAorCQkJLnJlYWxiaXRzID0gMzIsCisJCQkuc3RvcmFnZWJpdHMgPSAzMiwKKwkJCS5lbmRpYW5uZXNzID0gSUlPX0JFLAorCQl9LAorCX0sCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMSksCit9OworCiBzdGF0aWMgaW50IGF0bGFzX2NoZWNrX3BoX2NhbGlicmF0aW9uKHN0cnVjdCBhdGxhc19kYXRhICpkYXRhKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkYXRhLT5jbGllbnQtPmRldjsKQEAgLTI0MCw2ICsyNDYsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhdGxhc19jaGVja19vcnBfY2FsaWJyYXRpb24oc3RydWN0IGF0bGFzX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmNsaWVudC0+ZGV2OworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXJldCA9IHJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgQVRMQVNfUkVHX09SUF9DQUxJQl9TVEFUVVMsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIXZhbCkKKwkJZGV2X3dhcm4oZGV2LCAiZGV2aWNlIGhhcyBub3QgYmVlbiBjYWxpYnJhdGVkXG4iKTsKKworCXJldHVybiAwOworfTsKKwogc3RydWN0IGF0bGFzX2RldmljZSB7CiAJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzOwogCWludCBudW1fY2hhbm5lbHM7CkBAIC0yNjQsNyArMjg2LDEzIEBACiAJCQkJLmNhbGlicmF0aW9uID0gJmF0bGFzX2NoZWNrX2VjX2NhbGlicmF0aW9uLAogCQkJCS5kZWxheSA9IEFUTEFTX0VDX0lOVF9USU1FX0lOX1VTLAogCX0sCi0KKwlbQVRMQVNfT1JQX1NNXSA9IHsKKwkJCQkuY2hhbm5lbHMgPSBhdGxhc19vcnBfY2hhbm5lbHMsCisJCQkJLm51bV9jaGFubmVscyA9IDIsCisJCQkJLmRhdGFfcmVnID0gQVRMQVNfUkVHX09SUF9EQVRBLAorCQkJCS5jYWxpYnJhdGlvbiA9ICZhdGxhc19jaGVja19vcnBfY2FsaWJyYXRpb24sCisJCQkJLmRlbGF5ID0gQVRMQVNfT1JQX0lOVF9USU1FX0lOX1VTLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGF0bGFzX3NldF9wb3dlcm1vZGUoc3RydWN0IGF0bGFzX2RhdGEgKmRhdGEsIGludCBvbikKQEAgLTQwMiwxNSArNDMwLDE0IEBACiAJCWNhc2UgSUlPX1BIOgogCQljYXNlIElJT19DT05DRU5UUkFUSU9OOgogCQljYXNlIElJT19FTEVDVFJJQ0FMQ09ORFVDVElWSVRZOgotCQkJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCWNhc2UgSUlPX1ZPTFRBR0U6CisJCQlyZXQgPSBpaW9fZGV2aWNlX2NsYWltX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CiAKLQkJCWlmIChpaW9fYnVmZmVyX2VuYWJsZWQoaW5kaW9fZGV2KSkKLQkJCQlyZXQgPSAtRUJVU1k7Ci0JCQllbHNlCi0JCQkJcmV0ID0gYXRsYXNfcmVhZF9tZWFzdXJlbWVudChkYXRhLAotCQkJCQkJCWNoYW4tPmFkZHJlc3MsICZyZWcpOworCQkJcmV0ID0gYXRsYXNfcmVhZF9tZWFzdXJlbWVudChkYXRhLCBjaGFuLT5hZGRyZXNzLCAmcmVnKTsKIAotCQkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXQgPSAtRUlOVkFMOwpAQCAtNDM0LDEyICs0NjEsMTYgQEAKIAkJCWJyZWFrOwogCQljYXNlIElJT19FTEVDVFJJQ0FMQ09ORFVDVElWSVRZOgogCQkJKnZhbCA9IDE7IC8qIDAuMDAwMDEgKi8KLQkJCSp2YWwgPSAxMDAwMDA7CisJCQkqdmFsMiA9IDEwMDAwMDsKIAkJCWJyZWFrOwogCQljYXNlIElJT19DT05DRU5UUkFUSU9OOgogCQkJKnZhbCA9IDA7IC8qIDAuMDAwMDAwMDAxICovCiAJCQkqdmFsMiA9IDEwMDA7CiAJCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19OQU5POworCQljYXNlIElJT19WT0xUQUdFOgorCQkJKnZhbCA9IDE7IC8qIDAuMSAqLworCQkJKnZhbDIgPSAxMDsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTQ3NSw2ICs1MDYsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGF0bGFzX2lkW10gPSB7CiAJeyAiYXRsYXMtcGgtc20iLCBBVExBU19QSF9TTX0sCiAJeyAiYXRsYXMtZWMtc20iLCBBVExBU19FQ19TTX0sCisJeyAiYXRsYXMtb3JwLXNtIiwgQVRMQVNfT1JQX1NNfSwKIAl7fQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhdGxhc19pZCk7CkBAIC00ODIsNiArNTE0LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF0bGFzX2R0X2lkc1tdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYXRsYXMscGgtc20iLCAuZGF0YSA9ICh2b2lkICopQVRMQVNfUEhfU00sIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJhdGxhcyxlYy1zbSIsIC5kYXRhID0gKHZvaWQgKilBVExBU19FQ19TTSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImF0bGFzLG9ycC1zbSIsIC5kYXRhID0gKHZvaWQgKilBVExBU19PUlBfU00sIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYXRsYXNfZHRfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2NoZW1pY2FsL3Z6ODl4LmMgYi9kcml2ZXJzL2lpby9jaGVtaWNhbC92ejg5eC5jCmluZGV4IDY1MjY0OWQuLjhlMGU0NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2NoZW1pY2FsL3Z6ODl4LmMKKysrIGIvZHJpdmVycy9paW8vY2hlbWljYWwvdno4OXguYwpAQCAtMTksMjUgKzE5LDU1IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KICNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KIAogI2RlZmluZSBWWjg5WF9SRUdfTUVBU1VSRU1FTlQJCTB4MDkKLSNkZWZpbmUgVlo4OVhfUkVHX01FQVNVUkVNRU5UX1NJWkUJNgorI2RlZmluZSBWWjg5WF9SRUdfTUVBU1VSRU1FTlRfUkRfU0laRQk2CisjZGVmaW5lIFZaODlYX1JFR19NRUFTVVJFTUVOVF9XUl9TSVpFCTMKIAogI2RlZmluZSBWWjg5WF9WT0NfQ08yX0lEWAkJMAogI2RlZmluZSBWWjg5WF9WT0NfU0hPUlRfSURYCQkxCiAjZGVmaW5lIFZaODlYX1ZPQ19UVk9DX0lEWAkJMgogI2RlZmluZSBWWjg5WF9WT0NfUkVTSVNUQU5DRV9JRFgJMwogCisjZGVmaW5lIFZaODlURV9SRUdfTUVBU1VSRU1FTlQJCTB4MGMKKyNkZWZpbmUgVlo4OVRFX1JFR19NRUFTVVJFTUVOVF9SRF9TSVpFCTcKKyNkZWZpbmUgVlo4OVRFX1JFR19NRUFTVVJFTUVOVF9XUl9TSVpFCTYKKworI2RlZmluZSBWWjg5VEVfVk9DX1RWT0NfSURYCQkwCisjZGVmaW5lIFZaODlURV9WT0NfQ08yX0lEWAkJMQorI2RlZmluZSBWWjg5VEVfVk9DX1JFU0lTVEFOQ0VfSURYCTIKKworZW51bSB7CisJVlo4OVgsCisJVlo4OVRFLAorfTsKKworc3RydWN0IHZ6ODl4X2NoaXBfZGF0YTsKKwogc3RydWN0IHZ6ODl4X2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJY29uc3Qgc3RydWN0IHZ6ODl4X2NoaXBfZGF0YSAqY2hpcDsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlpbnQgKCp4ZmVyKShzdHJ1Y3Qgdno4OXhfZGF0YSAqZGF0YSwgdTggY21kKTsKIAorCWJvb2wgaXNfdmFsaWQ7CiAJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZTsKLQl1OCBidWZmZXJbVlo4OVhfUkVHX01FQVNVUkVNRU5UX1NJWkVdOworCXU4IGJ1ZmZlcltWWjg5VEVfUkVHX01FQVNVUkVNRU5UX1JEX1NJWkVdOworfTsKKworc3RydWN0IHZ6ODl4X2NoaXBfZGF0YSB7CisJYm9vbCAoKnZhbGlkKShzdHJ1Y3Qgdno4OXhfZGF0YSAqZGF0YSk7CisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzOworCXU4IG51bV9jaGFubmVsczsKKworCXU4IGNtZDsKKwl1OCByZWFkX3NpemU7CisJdTggd3JpdGVfc2l6ZTsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyB2ejg5eF9jaGFubmVsc1tdID0gewpAQCAtNzAsNiArMTAwLDQwIEBACiAJCS5pbmZvX21hc2tfc2VwYXJhdGUgPQogCQkJQklUKElJT19DSEFOX0lORk9fUkFXKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwKIAkJLmFkZHJlc3MgPSBWWjg5WF9WT0NfUkVTSVNUQU5DRV9JRFgsCisJCS5zY2FuX2luZGV4ID0gLTEsCisJCS5zY2FuX3R5cGUgPSB7CisJCQkuZW5kaWFubmVzcyA9IElJT19MRSwKKwkJfSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHZ6ODl0ZV9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fQ09OQ0VOVFJBVElPTiwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9WT0MsCisJCS5tb2RpZmllZCA9IDEsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPQorCQkJQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCisJCS5hZGRyZXNzID0gVlo4OVRFX1ZPQ19UVk9DX0lEWCwKKwl9LAorCisJeworCQkudHlwZSA9IElJT19DT05DRU5UUkFUSU9OLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX0NPMiwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9CisJCQlCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpIHwgQklUKElJT19DSEFOX0lORk9fUkFXKSwKKwkJLmFkZHJlc3MgPSBWWjg5VEVfVk9DX0NPMl9JRFgsCisJfSwKKwl7CisJCS50eXBlID0gSUlPX1JFU0lTVEFOQ0UsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPQorCQkJQklUKElJT19DSEFOX0lORk9fUkFXKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwKKwkJLmFkZHJlc3MgPSBWWjg5VEVfVk9DX1JFU0lTVEFOQ0VfSURYLAorCQkuc2Nhbl9pbmRleCA9IC0xLAorCQkuc2Nhbl90eXBlID0geworCQkJLmVuZGlhbm5lc3MgPSBJSU9fQkUsCisJCX0sCiAJfSwKIH07CiAKQEAgLTkzLDI5ICsxNTcsNDUgQEAKICAqIGFsd2F5cyB6ZXJvLCBhbmQgYnkgYWxzbyBjb25maXJtaW5nIHRoZSBWT0Nfc2hvcnQgaXNuJ3QgemVyby4KICAqLwogCi1zdGF0aWMgaW50IHZ6ODl4X21lYXN1cmVtZW50X2lzX3ZhbGlkKHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhKQorc3RhdGljIGJvb2wgdno4OXhfbWVhc3VyZW1lbnRfaXNfdmFsaWQoc3RydWN0IHZ6ODl4X2RhdGEgKmRhdGEpCiB7CiAJaWYgKGRhdGEtPmJ1ZmZlcltWWjg5WF9WT0NfU0hPUlRfSURYXSA9PSAwKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAKLQlyZXR1cm4gISEoZGF0YS0+YnVmZmVyW1ZaODlYX1JFR19NRUFTVVJFTUVOVF9TSVpFIC0gMV0gPiAwKTsKKwlyZXR1cm4gISEoZGF0YS0+YnVmZmVyW2RhdGEtPmNoaXAtPnJlYWRfc2l6ZSAtIDFdID4gMCk7Cit9CisKKy8qIFZaODlURSBkZXZpY2UgaGFzIGEgbW9kaWZpZWQgQ1JDLTggdHdvIGNvbXBsZW1lbnQgY2hlY2sgKi8KK3N0YXRpYyBib29sIHZ6ODl0ZV9tZWFzdXJlbWVudF9pc192YWxpZChzdHJ1Y3Qgdno4OXhfZGF0YSAqZGF0YSkKK3sKKwl1OCBjcmMgPSAwOworCWludCBpLCBzdW0gPSAwOworCisJZm9yIChpID0gMDsgaSA8IChkYXRhLT5jaGlwLT5yZWFkX3NpemUgLSAxKTsgaSsrKSB7CisJCXN1bSA9IGNyYyArIGRhdGEtPmJ1ZmZlcltpXTsKKwkJY3JjID0gc3VtOworCQljcmMgKz0gc3VtIC8gMjU2OworCX0KKworCXJldHVybiAhKCgweGZmIC0gY3JjKSA9PSBkYXRhLT5idWZmZXJbZGF0YS0+Y2hpcC0+cmVhZF9zaXplIC0gMV0pOwogfQogCiBzdGF0aWMgaW50IHZ6ODl4X2kyY194ZmVyKHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhLCB1OCBjbWQpCiB7CisJY29uc3Qgc3RydWN0IHZ6ODl4X2NoaXBfZGF0YSAqY2hpcCA9IGRhdGEtPmNoaXA7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbMl07CiAJaW50IHJldDsKLQl1OCBidWZbM10gPSB7IGNtZCwgMCwgMH07CisJdTggYnVmWzZdID0geyBjbWQsIDAsIDAsIDAsIDAsIDB4ZjMgfTsKIAogCW1zZ1swXS5hZGRyID0gY2xpZW50LT5hZGRyOwogCW1zZ1swXS5mbGFncyA9IGNsaWVudC0+ZmxhZ3M7Ci0JbXNnWzBdLmxlbiA9IDM7CisJbXNnWzBdLmxlbiA9IGNoaXAtPndyaXRlX3NpemU7CiAJbXNnWzBdLmJ1ZiAgPSAoY2hhciAqKSAmYnVmOwogCiAJbXNnWzFdLmFkZHIgPSBjbGllbnQtPmFkZHI7CiAJbXNnWzFdLmZsYWdzID0gY2xpZW50LT5mbGFncyB8IEkyQ19NX1JEOwotCW1zZ1sxXS5sZW4gPSBWWjg5WF9SRUdfTUVBU1VSRU1FTlRfU0laRTsKKwltc2dbMV0ubGVuID0gY2hpcC0+cmVhZF9zaXplOwogCW1zZ1sxXS5idWYgPSAoY2hhciAqKSAmZGF0YS0+YnVmZmVyOwogCiAJcmV0ID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNnLCAyKTsKQEAgLTEzMyw3ICsyMTMsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JZm9yIChpID0gMDsgaSA8IFZaODlYX1JFR19NRUFTVVJFTUVOVF9TSVpFOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+Y2hpcC0+cmVhZF9zaXplOyBpKyspIHsKIAkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZShjbGllbnQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CkBAIC0xNDUsMzAgKzIyNSw0NyBAQAogCiBzdGF0aWMgaW50IHZ6ODl4X2dldF9tZWFzdXJlbWVudChzdHJ1Y3Qgdno4OXhfZGF0YSAqZGF0YSkKIHsKKwljb25zdCBzdHJ1Y3Qgdno4OXhfY2hpcF9kYXRhICpjaGlwID0gZGF0YS0+Y2hpcDsKIAlpbnQgcmV0OwogCiAJLyogc2Vuc29yIGNhbiBvbmx5IGJlIHBvbGxlZCBvbmNlIGEgc2Vjb25kIG1heCBwZXIgZGF0YXNoZWV0ICovCiAJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlICsgSFopKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGRhdGEtPmlzX3ZhbGlkID8gMCA6IC1FQUdBSU47CiAKLQlyZXQgPSBkYXRhLT54ZmVyKGRhdGEsIFZaODlYX1JFR19NRUFTVVJFTUVOVCk7CisJZGF0YS0+aXNfdmFsaWQgPSBmYWxzZTsKKwlkYXRhLT5sYXN0X3VwZGF0ZSA9IGppZmZpZXM7CisKKwlyZXQgPSBkYXRhLT54ZmVyKGRhdGEsIGNoaXAtPmNtZCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSB2ejg5eF9tZWFzdXJlbWVudF9pc192YWxpZChkYXRhKTsKKwlyZXQgPSBjaGlwLT52YWxpZChkYXRhKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gLUVBR0FJTjsKIAotCWRhdGEtPmxhc3RfdXBkYXRlID0gamlmZmllczsKKwlkYXRhLT5pc192YWxpZCA9IHRydWU7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2ejg5eF9nZXRfcmVzaXN0YW5jZV9yZWFkaW5nKHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhKQorc3RhdGljIGludCB2ejg5eF9nZXRfcmVzaXN0YW5jZV9yZWFkaW5nKHN0cnVjdCB2ejg5eF9kYXRhICpkYXRhLAorCQkJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCQkJaW50ICp2YWwpCiB7Ci0JdTggKmJ1ZiA9ICZkYXRhLT5idWZmZXJbVlo4OVhfVk9DX1JFU0lTVEFOQ0VfSURYXTsKKwl1OCAqdG1wID0gKHU4ICopICZkYXRhLT5idWZmZXJbY2hhbi0+YWRkcmVzc107CiAKLQlyZXR1cm4gYnVmWzBdIHwgKGJ1ZlsxXSA8PCA4KTsKKwlzd2l0Y2ggKGNoYW4tPnNjYW5fdHlwZS5lbmRpYW5uZXNzKSB7CisJY2FzZSBJSU9fTEU6CisJCSp2YWwgPSBsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKSB0bXApICYgR0VOTUFTSygyMywgMCk7CisJCWJyZWFrOworCWNhc2UgSUlPX0JFOgorCQkqdmFsID0gYmUzMl90b19jcHVwKChfX2JlMzIgKikgdG1wKSA+PiA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB2ejg5eF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LApAQCAtMTg3LDE1ICsyODQsMTUgQEAKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKLQkJc3dpdGNoIChjaGFuLT5hZGRyZXNzKSB7Ci0JCWNhc2UgVlo4OVhfVk9DX0NPMl9JRFg6Ci0JCWNhc2UgVlo4OVhfVk9DX1NIT1JUX0lEWDoKLQkJY2FzZSBWWjg5WF9WT0NfVFZPQ19JRFg6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19DT05DRU5UUkFUSU9OOgogCQkJKnZhbCA9IGRhdGEtPmJ1ZmZlcltjaGFuLT5hZGRyZXNzXTsKIAkJCXJldHVybiBJSU9fVkFMX0lOVDsKLQkJY2FzZSBWWjg5WF9WT0NfUkVTSVNUQU5DRV9JRFg6Ci0JCQkqdmFsID0gdno4OXhfZ2V0X3Jlc2lzdGFuY2VfcmVhZGluZyhkYXRhKTsKLQkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJY2FzZSBJSU9fUkVTSVNUQU5DRToKKwkJCXJldCA9IHZ6ODl4X2dldF9yZXNpc3RhbmNlX3JlYWRpbmcoZGF0YSwgY2hhbiwgdmFsKTsKKwkJCWlmICghcmV0KQorCQkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTIxMCwxMiArMzA3LDEyIEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKLQkJc3dpdGNoIChjaGFuLT5hZGRyZXNzKSB7Ci0JCWNhc2UgVlo4OVhfVk9DX0NPMl9JRFg6CisJCXN3aXRjaCAoY2hhbi0+Y2hhbm5lbDIpIHsKKwkJY2FzZSBJSU9fTU9EX0NPMjoKIAkJCSp2YWwgPSA0NDsKIAkJCSp2YWwyID0gMjUwMDAwOwogCQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87Ci0JCWNhc2UgVlo4OVhfVk9DX1RWT0NfSURYOgorCQljYXNlIElJT19NT0RfVk9DOgogCQkJKnZhbCA9IC0xMzsKIAkJCXJldHVybiBJSU9fVkFMX0lOVDsKIAkJZGVmYXVsdDoKQEAgLTIzMiwxMSArMzI5LDQzIEBACiAJLmRyaXZlcl9tb2R1bGUJPSBUSElTX01PRFVMRSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgdno4OXhfY2hpcF9kYXRhIHZ6ODl4X2NoaXBzW10gPSB7CisJeworCQkudmFsaWQgPSB2ejg5eF9tZWFzdXJlbWVudF9pc192YWxpZCwKKworCQkuY21kID0gVlo4OVhfUkVHX01FQVNVUkVNRU5ULAorCQkucmVhZF9zaXplID0gVlo4OVhfUkVHX01FQVNVUkVNRU5UX1JEX1NJWkUsCisJCS53cml0ZV9zaXplID0gVlo4OVhfUkVHX01FQVNVUkVNRU5UX1dSX1NJWkUsCisKKwkJLmNoYW5uZWxzID0gdno4OXhfY2hhbm5lbHMsCisJCS5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHZ6ODl4X2NoYW5uZWxzKSwKKwl9LAorCXsKKwkJLnZhbGlkID0gdno4OXRlX21lYXN1cmVtZW50X2lzX3ZhbGlkLAorCisJCS5jbWQgPSBWWjg5VEVfUkVHX01FQVNVUkVNRU5ULAorCQkucmVhZF9zaXplID0gVlo4OVRFX1JFR19NRUFTVVJFTUVOVF9SRF9TSVpFLAorCQkud3JpdGVfc2l6ZSA9IFZaODlURV9SRUdfTUVBU1VSRU1FTlRfV1JfU0laRSwKKworCQkuY2hhbm5lbHMgPSB2ejg5dGVfY2hhbm5lbHMsCisJCS5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHZ6ODl0ZV9jaGFubmVscyksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZ6ODl4X2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAic2d4LHZ6ODl4IiwgLmRhdGEgPSAodm9pZCAqKSBWWjg5WCB9LAorCXsgLmNvbXBhdGlibGUgPSAic2d4LHZ6ODl0ZSIsIC5kYXRhID0gKHZvaWQgKikgVlo4OVRFIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdno4OXhfZHRfaWRzKTsKKwogc3RhdGljIGludCB2ejg5eF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkgICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAJc3RydWN0IHZ6ODl4X2RhdGEgKmRhdGE7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CisJaW50IGNoaXBfaWQ7CiAKIAlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpKTsKIAlpZiAoIWluZGlvX2RldikKQEAgLTI1MSw4ICszODAsMTUgQEAKIAllbHNlCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAorCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKHZ6ODl4X2R0X2lkcywgJmNsaWVudC0+ZGV2KTsKKwlpZiAoIW9mX2lkKQorCQljaGlwX2lkID0gaWQtPmRyaXZlcl9kYXRhOworCWVsc2UKKwkJY2hpcF9pZCA9ICh1bnNpZ25lZCBsb25nKW9mX2lkLT5kYXRhOworCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKIAlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJZGF0YS0+Y2hpcCA9ICZ2ejg5eF9jaGlwc1tjaGlwX2lkXTsKIAlkYXRhLT5sYXN0X3VwZGF0ZSA9IGppZmZpZXMgLSBIWjsKIAltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKIApAQCAtMjYxLDI0ICszOTcsMTkgQEAKIAlpbmRpb19kZXYtPm5hbWUgPSBkZXZfbmFtZSgmY2xpZW50LT5kZXYpOwogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKIAotCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSB2ejg5eF9jaGFubmVsczsKLQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUodno4OXhfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBkYXRhLT5jaGlwLT5jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IGRhdGEtPmNoaXAtPm51bV9jaGFubmVsczsKIAogCXJldHVybiBkZXZtX2lpb19kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBpbmRpb19kZXYpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdno4OXhfaWRbXSA9IHsKLQl7ICJ2ejg5eCIsIDAgfSwKKwl7ICJ2ejg5eCIsIFZaODlYIH0sCisJeyAidno4OXRlIiwgVlo4OVRFIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHZ6ODl4X2lkKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdno4OXhfZHRfaWRzW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJzZ3gsdno4OXgiIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdno4OXhfZHRfaWRzKTsKLQogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHZ6ODl4X2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJ2ejg5eCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci1hdHRyaWJ1dGVzLmMgYi9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci1hdHRyaWJ1dGVzLmMKaW5kZXggZTgxZjQzNC4uZGMzM2MxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItYXR0cmlidXRlcy5jCisrKyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9oaWQtc2Vuc29ycy9oaWQtc2Vuc29yLWF0dHJpYnV0ZXMuYwpAQCAtNTYsOCArNTYsOCBAQAogCXtISURfVVNBR0VfU0VOU09SX0FMUywgMCwgMSwgMH0sCiAJe0hJRF9VU0FHRV9TRU5TT1JfQUxTLCBISURfVVNBR0VfU0VOU09SX1VOSVRTX0xVWCwgMSwgMH0sCiAKLQl7SElEX1VTQUdFX1NFTlNPUl9QUkVTU1VSRSwgMCwgMTAwMDAwLCAwfSwKLQl7SElEX1VTQUdFX1NFTlNPUl9QUkVTU1VSRSwgSElEX1VTQUdFX1NFTlNPUl9VTklUU19QQVNDQUwsIDEsIDB9LAorCXtISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFLCAwLCAxMDAsIDB9LAorCXtISURfVVNBR0VfU0VOU09SX1BSRVNTVVJFLCBISURfVVNBR0VfU0VOU09SX1VOSVRTX1BBU0NBTCwgMCwgMTAwMH0sCiB9OwogCiBzdGF0aWMgaW50IHBvd18xMCh1bnNpZ25lZCBwb3dlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2NvbW1vbi9oaWQtc2Vuc29ycy9oaWQtc2Vuc29yLXRyaWdnZXIuYyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9oaWQtc2Vuc29ycy9oaWQtc2Vuc29yLXRyaWdnZXIuYwppbmRleCA1YjQxZjlkLi5hM2NjZTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci10cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5jCkBAIC0xMjIsNiArMTIyLDE0IEBACiAjZW5kaWYKIH0KIAorc3RhdGljIHZvaWQgaGlkX3NlbnNvcl9zZXRfcG93ZXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGhpZF9zZW5zb3JfY29tbW9uICphdHRyYiA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQkJICAgICAgIHN0cnVjdCBoaWRfc2Vuc29yX2NvbW1vbiwKKwkJCQkJCSAgICAgICB3b3JrKTsKKwlfaGlkX3NlbnNvcl9wb3dlcl9zdGF0ZShhdHRyYiwgdHJ1ZSk7Cit9CisKIHN0YXRpYyBpbnQgaGlkX3NlbnNvcl9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsCiAJCQkJCQlib29sIHN0YXRlKQogewpAQCAtMTMwLDYgKzEzOCw3IEBACiAKIHZvaWQgaGlkX3NlbnNvcl9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaGlkX3NlbnNvcl9jb21tb24gKmF0dHJiKQogeworCWNhbmNlbF93b3JrX3N5bmMoJmF0dHJiLT53b3JrKTsKIAlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKGF0dHJiLT50cmlnZ2VyKTsKIAlpaW9fdHJpZ2dlcl9mcmVlKGF0dHJiLT50cmlnZ2VyKTsKIH0KQEAgLTE3MCw2ICsxNzksOSBAQAogCQlnb3RvIGVycm9yX3VucmVnX3RyaWdnZXI7CiAKIAlpaW9fZGV2aWNlX3NldF9kcnZkYXRhKGluZGlvX2RldiwgYXR0cmIpOworCisJSU5JVF9XT1JLKCZhdHRyYi0+d29yaywgaGlkX3NlbnNvcl9zZXRfcG93ZXJfd29yayk7CisKIAlwbV9zdXNwZW5kX2lnbm9yZV9jaGlsZHJlbigmYXR0cmItPnBkZXYtPmRldiwgdHJ1ZSk7CiAJcG1fcnVudGltZV9lbmFibGUoJmF0dHJiLT5wZGV2LT5kZXYpOwogCS8qIERlZmF1bHQgdG8gMyBzZWNvbmRzLCBidXQgY2FuIGJlIGNoYW5nZWQgZnJvbSBzeXNmcyAqLwpAQCAtMTg3LDggKzE5OSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGhpZF9zZW5zb3Jfc2V0dXBfdHJpZ2dlcik7CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgaGlkX3NlbnNvcl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgaGlkX3NlbnNvcl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtMTk3LDIxICsyMDgsMjcgQEAKIAlyZXR1cm4gX2hpZF9zZW5zb3JfcG93ZXJfc3RhdGUoYXR0cmIsIGZhbHNlKTsKIH0KIAotc3RhdGljIGludCBoaWRfc2Vuc29yX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGhpZF9zZW5zb3JfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBoaWRfc2Vuc29yX2NvbW1vbiAqYXR0cmIgPSBpaW9fZGV2aWNlX2dldF9kcnZkYXRhKGluZGlvX2Rldik7Ci0KLQlyZXR1cm4gX2hpZF9zZW5zb3JfcG93ZXJfc3RhdGUoYXR0cmIsIHRydWUpOworCXNjaGVkdWxlX3dvcmsoJmF0dHJiLT53b3JrKTsKKwlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGhpZF9zZW5zb3JfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGhpZF9zZW5zb3JfY29tbW9uICphdHRyYiA9IGlpb19kZXZpY2VfZ2V0X2RydmRhdGEoaW5kaW9fZGV2KTsKKwlyZXR1cm4gX2hpZF9zZW5zb3JfcG93ZXJfc3RhdGUoYXR0cmIsIHRydWUpOworfQogCiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBoaWRfc2Vuc29yX3BtX29wcyA9IHsKIAlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhoaWRfc2Vuc29yX3N1c3BlbmQsIGhpZF9zZW5zb3JfcmVzdW1lKQogCVNFVF9SVU5USU1FX1BNX09QUyhoaWRfc2Vuc29yX3N1c3BlbmQsCi0JCQkgICBoaWRfc2Vuc29yX3Jlc3VtZSwgTlVMTCkKKwkJCSAgIGhpZF9zZW5zb3JfcnVudGltZV9yZXN1bWUsIE5VTEwpCiB9OwogRVhQT1JUX1NZTUJPTChoaWRfc2Vuc29yX3BtX29wcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2NvbW1vbi9zdF9zZW5zb3JzL3N0X3NlbnNvcnNfYnVmZmVyLmMgYi9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX2J1ZmZlci5jCmluZGV4IGQwNmU3MjguLmZlNzc3NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2NvbW1vbi9zdF9zZW5zb3JzL3N0X3NlbnNvcnNfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9paW8vY29tbW9uL3N0X3NlbnNvcnMvc3Rfc2Vuc29yc19idWZmZXIuYwpAQCAtNjMsNyArNjMsNyBAQAogCSAqIHRoZSBoYXJkd2FyZSB0cmlnZ2VyKSBhbmQgdGhlIGh3X3RpbWVzdGFtcCBtYXkgZ2V0IHVwZGF0ZWQuCiAJICogQnkgc3RvcmluZyBpdCBpbiBhIGxvY2FsIHZhcmlhYmxlIGZpcnN0LCB3ZSBhcmUgc2FmZS4KIAkgKi8KLQlpZiAoc2RhdGEtPmh3X2lycV90cmlnZ2VyKQorCWlmIChpaW9fdHJpZ2dlcl91c2luZ19vd24oaW5kaW9fZGV2KSkKIAkJdGltZXN0YW1wID0gc2RhdGEtPmh3X3RpbWVzdGFtcDsKIAllbHNlCiAJCXRpbWVzdGFtcCA9IGlpb19nZXRfdGltZV9ucyhpbmRpb19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY29tbW9uL3N0X3NlbnNvcnMvc3Rfc2Vuc29yc19jb3JlLmMgYi9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX2NvcmUuYwppbmRleCAyZDUyODJlLi4yODVhNjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX2NvcmUuYworKysgYi9kcml2ZXJzL2lpby9jb21tb24vc3Rfc2Vuc29ycy9zdF9zZW5zb3JzX2NvcmUuYwpAQCAtMjM0LDM5ICsyMzQsMzUgQEAKIAlpbnQgZXJyOwogCiAJLyogUmVndWxhdG9ycyBub3QgbWFuZGF0b3J5LCBidXQgaWYgcmVxdWVzdGVkIHdlIHNob3VsZCBlbmFibGUgdGhlbS4gKi8KLQlwZGF0YS0+dmRkID0gZGV2bV9yZWd1bGF0b3JfZ2V0X29wdGlvbmFsKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwgInZkZCIpOwotCWlmICghSVNfRVJSKHBkYXRhLT52ZGQpKSB7Ci0JCWVyciA9IHJlZ3VsYXRvcl9lbmFibGUocGRhdGEtPnZkZCk7Ci0JCWlmIChlcnIgIT0gMCkgewotCQkJZGV2X3dhcm4oJmluZGlvX2Rldi0+ZGV2LAotCQkJCSAiRmFpbGVkIHRvIGVuYWJsZSBzcGVjaWZpZWQgVmRkIHN1cHBseVxuIik7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JfSBlbHNlIHsKLQkJZXJyID0gUFRSX0VSUihwZGF0YS0+dmRkKTsKLQkJaWYgKGVyciAhPSAtRU5PREVWKQotCQkJcmV0dXJuIGVycjsKKwlwZGF0YS0+dmRkID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGluZGlvX2Rldi0+ZGV2LnBhcmVudCwgInZkZCIpOworCWlmIChJU19FUlIocGRhdGEtPnZkZCkpIHsKKwkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IFZkZCBzdXBwbHlcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwZGF0YS0+dmRkKTsKKwl9CisJZXJyID0gcmVndWxhdG9yX2VuYWJsZShwZGF0YS0+dmRkKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJZGV2X3dhcm4oJmluZGlvX2Rldi0+ZGV2LAorCQkJICJGYWlsZWQgdG8gZW5hYmxlIHNwZWNpZmllZCBWZGQgc3VwcGx5XG4iKTsKKwkJcmV0dXJuIGVycjsKIAl9CiAKLQlwZGF0YS0+dmRkX2lvID0gZGV2bV9yZWd1bGF0b3JfZ2V0X29wdGlvbmFsKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwgInZkZGlvIik7Ci0JaWYgKCFJU19FUlIocGRhdGEtPnZkZF9pbykpIHsKLQkJZXJyID0gcmVndWxhdG9yX2VuYWJsZShwZGF0YS0+dmRkX2lvKTsKLQkJaWYgKGVyciAhPSAwKSB7Ci0JCQlkZXZfd2FybigmaW5kaW9fZGV2LT5kZXYsCi0JCQkJICJGYWlsZWQgdG8gZW5hYmxlIHNwZWNpZmllZCBWZGRfSU8gc3VwcGx5XG4iKTsKLQkJCWdvdG8gc3Rfc2Vuc29yc19kaXNhYmxlX3ZkZDsKLQkJfQotCX0gZWxzZSB7CisJcGRhdGEtPnZkZF9pbyA9IGRldm1fcmVndWxhdG9yX2dldChpbmRpb19kZXYtPmRldi5wYXJlbnQsICJ2ZGRpbyIpOworCWlmIChJU19FUlIocGRhdGEtPnZkZF9pbykpIHsKKwkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJ1bmFibGUgdG8gZ2V0IFZkZF9JTyBzdXBwbHlcbiIpOwogCQllcnIgPSBQVFJfRVJSKHBkYXRhLT52ZGRfaW8pOwotCQlpZiAoZXJyICE9IC1FTk9ERVYpCi0JCQlnb3RvIHN0X3NlbnNvcnNfZGlzYWJsZV92ZGQ7CisJCWdvdG8gc3Rfc2Vuc29yc19kaXNhYmxlX3ZkZDsKKwl9CisJZXJyID0gcmVndWxhdG9yX2VuYWJsZShwZGF0YS0+dmRkX2lvKTsKKwlpZiAoZXJyICE9IDApIHsKKwkJZGV2X3dhcm4oJmluZGlvX2Rldi0+ZGV2LAorCQkJICJGYWlsZWQgdG8gZW5hYmxlIHNwZWNpZmllZCBWZGRfSU8gc3VwcGx5XG4iKTsKKwkJZ290byBzdF9zZW5zb3JzX2Rpc2FibGVfdmRkOwogCX0KIAogCXJldHVybiAwOwogCiBzdF9zZW5zb3JzX2Rpc2FibGVfdmRkOgotCWlmICghSVNfRVJSX09SX05VTEwocGRhdGEtPnZkZCkpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKHBkYXRhLT52ZGQpOworCXJlZ3VsYXRvcl9kaXNhYmxlKHBkYXRhLT52ZGQpOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKHN0X3NlbnNvcnNfcG93ZXJfZW5hYmxlKTsKQEAgLTI3NSwxMSArMjcxLDggQEAKIHsKIAlzdHJ1Y3Qgc3Rfc2Vuc29yX2RhdGEgKnBkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAotCWlmICghSVNfRVJSX09SX05VTEwocGRhdGEtPnZkZCkpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKHBkYXRhLT52ZGQpOwotCi0JaWYgKCFJU19FUlJfT1JfTlVMTChwZGF0YS0+dmRkX2lvKSkKLQkJcmVndWxhdG9yX2Rpc2FibGUocGRhdGEtPnZkZF9pbyk7CisJcmVndWxhdG9yX2Rpc2FibGUocGRhdGEtPnZkZCk7CisJcmVndWxhdG9yX2Rpc2FibGUocGRhdGEtPnZkZF9pbyk7CiB9CiBFWFBPUlRfU1lNQk9MKHN0X3NlbnNvcnNfcG93ZXJfZGlzYWJsZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2NvbW1vbi9zdF9zZW5zb3JzL3N0X3NlbnNvcnNfdHJpZ2dlci5jIGIvZHJpdmVycy9paW8vY29tbW9uL3N0X3NlbnNvcnMvc3Rfc2Vuc29yc190cmlnZ2VyLmMKaW5kZXggZTY2ZjEyZS4uZmE3M2U2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vY29tbW9uL3N0X3NlbnNvcnMvc3Rfc2Vuc29yc190cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9paW8vY29tbW9uL3N0X3NlbnNvcnMvc3Rfc2Vuc29yc190cmlnZ2VyLmMKQEAgLTY2LDcgKzY2LDcgQEAKICAqIEBpcnE6IGlycSBudW1iZXIKICAqIEBwOiBwcml2YXRlIGhhbmRsZXIgZGF0YQogICovCi1pcnFyZXR1cm5fdCBzdF9zZW5zb3JzX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3Rfc2Vuc29yc19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQogewogCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyA9IHA7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGlpb190cmlnZ2VyX2dldF9kcnZkYXRhKHRyaWcpOwpAQCAtODIsNyArODIsNyBAQAogICogQGlycTogaXJxIG51bWJlcgogICogQHA6IHByaXZhdGUgaGFuZGxlciBkYXRhCiAgKi8KLWlycXJldHVybl90IHN0X3NlbnNvcnNfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpwKQorc3RhdGljIGlycXJldHVybl90IHN0X3NlbnNvcnNfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpwKQogewogCXN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyA9IHA7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGlpb190cmlnZ2VyX2dldF9kcnZkYXRhKHRyaWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vZGFjL0tjb25maWcgYi9kcml2ZXJzL2lpby9kYWMvS2NvbmZpZwppbmRleCBjYTgxNDQ3Li4xMjBiMjQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9kYWMvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9kYWMvS2NvbmZpZwpAQCAtMTgxLDYgKzE4MSwyNSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBtb2R1bGUgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAogCSAgYWQ3MzAzLgogCitjb25maWcgQ0lPX0RBQworCXRyaXN0YXRlICJNZWFzdXJlbWVudCBDb21wdXRpbmcgQ0lPLURBQyBJSU8gZHJpdmVyIgorCWRlcGVuZHMgb24gWDg2ICYmIElTQV9CVVNfQVBJCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBNZWFzdXJlbWVudCBDb21wdXRpbmcgQ0lPLURBQworCSAgYW5hbG9nIG91dHB1dCBkZXZpY2UgZmFtaWx5IChDSU8tREFDMTYsIENJTy1EQUMwOCwgUEMxMDQtREFDMDYpLiBUaGUKKwkgIGJhc2UgcG9ydCBhZGRyZXNzZXMgZm9yIHRoZSBkZXZpY2VzIG1heSBiZSBjb25maWd1cmVkIHZpYSB0aGUgYmFzZQorCSAgYXJyYXkgbW9kdWxlIHBhcmFtZXRlci4KKworY29uZmlnIEFEODgwMQorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDg4MDEvQUQ4ODAzIERBQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFEODgwMSwgQUQ4ODAzIERpZ2l0YWwgdG8KKwkgIEFuYWxvZyBDb252ZXJ0ZXJzIChEQUMpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIGFkODgwMS4KKwogY29uZmlnIExQQzE4WFhfREFDCiAJdHJpc3RhdGUgIk5YUCBMUEMxOHh4IERBQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBBUkNIX0xQQzE4WFggfHwgQ09NUElMRV9URVNUCkBAIC0yNDUsMTYgKzI2NCw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBtY3A0OTIyLgogCi1jb25maWcgU1RYMTA0Ci0JdHJpc3RhdGUgIkFwZXggRW1iZWRkZWQgU3lzdGVtcyBTVFgxMDQgREFDIGRyaXZlciIKLQlkZXBlbmRzIG9uIFg4NiAmJiBJU0FfQlVTX0FQSQotCXNlbGVjdCBHUElPTElCCi0JaGVscAotCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSAyLWNoYW5uZWwgREFDIGFuZCBHUElPIG9uIHRoZQotCSAgQXBleCBFbWJlZGRlZCBTeXN0ZW1zIFNUWDEwNCBpbnRlZ3JhdGVkIGFuYWxvZyBQQy8xMDQgY2FyZC4gVGhlIGJhc2UKLQkgIHBvcnQgYWRkcmVzc2VzIGZvciB0aGUgZGV2aWNlcyBtYXkgYmUgY29uZmlndXJlZCB2aWEgdGhlIGJhc2UgYXJyYXkKLQkgIG1vZHVsZSBwYXJhbWV0ZXIuCi0KIGNvbmZpZyBWRjYxMF9EQUMKIAl0cmlzdGF0ZSAiVnlicmlkIHZmNjEwIERBQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vZGFjL01ha2VmaWxlIGIvZHJpdmVycy9paW8vZGFjL01ha2VmaWxlCmluZGV4IDhiNzhkNWMuLjI3NjQyYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2RhYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9kYWMvTWFrZWZpbGUKQEAgLTIwLDExICsyMCwxMiBAQAogb2JqLSQoQ09ORklHX0FENTc5MSkgKz0gYWQ1NzkxLm8KIG9iai0kKENPTkZJR19BRDU2ODYpICs9IGFkNTY4Ni5vCiBvYmotJChDT05GSUdfQUQ3MzAzKSArPSBhZDczMDMubworb2JqLSQoQ09ORklHX0FEODgwMSkgKz0gYWQ4ODAxLm8KK29iai0kKENPTkZJR19DSU9fREFDKSArPSBjaW8tZGFjLm8KIG9iai0kKENPTkZJR19MUEMxOFhYX0RBQykgKz0gbHBjMTh4eF9kYWMubwogb2JqLSQoQ09ORklHX002MjMzMikgKz0gbTYyMzMyLm8KIG9iai0kKENPTkZJR19NQVg1MTcpICs9IG1heDUxNy5vCiBvYmotJChDT05GSUdfTUFYNTgyMSkgKz0gbWF4NTgyMS5vCiBvYmotJChDT05GSUdfTUNQNDcyNSkgKz0gbWNwNDcyNS5vCiBvYmotJChDT05GSUdfTUNQNDkyMikgKz0gbWNwNDkyMi5vCi1vYmotJChDT05GSUdfU1RYMTA0KSArPSBzdHgxMDQubwogb2JqLSQoQ09ORklHX1ZGNjEwX0RBQykgKz0gdmY2MTBfZGFjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2RhYy9hZDU3NTUuYyBiL2RyaXZlcnMvaWlvL2RhYy9hZDU3NTUuYwppbmRleCAwZmRlNTkzLi41Zjc5NjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9kYWMvYWQ1NzU1LmMKKysrIGIvZHJpdmVycy9paW8vZGFjL2FkNTc1NS5jCkBAIC02NTUsNyArNjU1LDcgQEAKIAogCWRldm5yID0gMDsKIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5wLCBwcCkgewotCQlpZiAoZGV2bnIgPiBBRDU3NTVfTlVNX0NIQU5ORUxTKSB7CisJCWlmIChkZXZuciA+PSBBRDU3NTVfTlVNX0NIQU5ORUxTKSB7CiAJCQlkZXZfZXJyKGRldiwKIAkJCQkiVGhlcmUgaXMgdG8gbWFueSBjaGFubmVscyBkZWZpbmVkIGluIERUXG4iKTsKIAkJCWdvdG8gZXJyb3Jfb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vZGFjL2FkODgwMS5jIGIvZHJpdmVycy9paW8vZGFjL2FkODgwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNmZhYTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9kYWMvYWQ4ODAxLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBJSU8gREFDIGRyaXZlciBmb3IgQW5hbG9nIERldmljZXMgQUQ4ODAxIERBQworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBHd2VuaGFlbCBHb2F2ZWMtTWVyb3UKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisKKyNkZWZpbmUgQUQ4ODAxX0NGR19BRERSX09GRlNFVCA4CisKK2VudW0gYWQ4ODAxX2RldmljZV9pZHMgeworCUlEX0FEODgwMSwKKwlJRF9BRDg4MDMsCit9OworCitzdHJ1Y3QgYWQ4ODAxX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpOworCXVuc2lnbmVkIGNoYXIgZGFjX2NhY2hlWzhdOyAvKiBWYWx1ZSB3cml0ZSBvbiBlYWNoIGNoYW5uZWwgKi8KKwl1bnNpZ25lZCBpbnQgdnJlZmhfbXY7CisJdW5zaWduZWQgaW50IHZyZWZsX212OworCXN0cnVjdCByZWd1bGF0b3IgKnZyZWZoX3JlZzsKKwlzdHJ1Y3QgcmVndWxhdG9yICp2cmVmbF9yZWc7CisKKwlfX2JlMTYgZGF0YSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7Cit9OworCitzdGF0aWMgaW50IGFkODgwMV9zcGlfd3JpdGUoc3RydWN0IGFkODgwMV9zdGF0ZSAqc3RhdGUsCisJdTggY2hhbm5lbCwgdW5zaWduZWQgY2hhciB2YWx1ZSkKK3sKKwlzdGF0ZS0+ZGF0YSA9IGNwdV90b19iZTE2KChjaGFubmVsIDw8IEFEODgwMV9DRkdfQUREUl9PRkZTRVQpIHwgdmFsdWUpOworCXJldHVybiBzcGlfd3JpdGUoc3RhdGUtPnNwaSwgJnN0YXRlLT5kYXRhLCBzaXplb2Yoc3RhdGUtPmRhdGEpKTsKK30KKworc3RhdGljIGludCBhZDg4MDFfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGludCB2YWwsIGludCB2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IGFkODgwMV9zdGF0ZSAqc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCQlpZiAodmFsID49IDI1NiB8fCB2YWwgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0ID0gYWQ4ODAxX3NwaV93cml0ZShzdGF0ZSwgY2hhbi0+Y2hhbm5lbCwgdmFsKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJc3RhdGUtPmRhY19jYWNoZVtjaGFuLT5jaGFubmVsXSA9IHZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkODgwMV9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIGluZm8pCit7CisJc3RydWN0IGFkODgwMV9zdGF0ZSAqc3RhdGUgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJc3dpdGNoIChpbmZvKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJKnZhbCA9IHN0YXRlLT5kYWNfY2FjaGVbY2hhbi0+Y2hhbm5lbF07CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCSp2YWwgPSBzdGF0ZS0+dnJlZmhfbXYgLSBzdGF0ZS0+dnJlZmxfbXY7CisJCSp2YWwyID0gODsKKwkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTF9MT0cyOworCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6CisJCSp2YWwgPSBzdGF0ZS0+dnJlZmxfbXY7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZDg4MDFfaW5mbyA9IHsKKwkucmVhZF9yYXcgPSBhZDg4MDFfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9IGFkODgwMV93cml0ZV9yYXcsCisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKK307CisKKyNkZWZpbmUgQUQ4ODAxX0NIQU5ORUwoY2hhbikgewkJXAorCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJXAorCS5pbmRleGVkID0gMSwJCQkJXAorCS5vdXRwdXQgPSAxLAkJCQlcCisJLmNoYW5uZWwgPSBjaGFuLAkJCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkgfAlcCisJCUJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCksIFwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkODgwMV9jaGFubmVsc1tdID0geworCUFEODgwMV9DSEFOTkVMKDApLAorCUFEODgwMV9DSEFOTkVMKDEpLAorCUFEODgwMV9DSEFOTkVMKDIpLAorCUFEODgwMV9DSEFOTkVMKDMpLAorCUFEODgwMV9DSEFOTkVMKDQpLAorCUFEODgwMV9DSEFOTkVMKDUpLAorCUFEODgwMV9DSEFOTkVMKDYpLAorCUFEODgwMV9DSEFOTkVMKDcpLAorfTsKKworc3RhdGljIGludCBhZDg4MDFfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCXN0cnVjdCBhZDg4MDFfc3RhdGUgKnN0YXRlOworCWNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkICppZDsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpzdGF0ZSkpOworCWlmIChpbmRpb19kZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RhdGUtPnNwaSA9IHNwaTsKKwlpZCA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSk7CisKKwlzdGF0ZS0+dnJlZmhfcmVnID0gZGV2bV9yZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZyZWZoIik7CisJaWYgKElTX0VSUihzdGF0ZS0+dnJlZmhfcmVnKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIlZyZWZoIHJlZ3VsYXRvciBub3Qgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoc3RhdGUtPnZyZWZoX3JlZyk7CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShzdGF0ZS0+dnJlZmhfcmVnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSB2cmVmaCByZWd1bGF0b3I6ICVkXG4iLAorCQkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHN0YXRlLT52cmVmaF9yZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgdnJlZmggcmVndWxhdG9yOiAlZFxuIiwKKwkJCQlyZXQpOworCQlnb3RvIGVycm9yX2Rpc2FibGVfdnJlZmhfcmVnOworCX0KKwlzdGF0ZS0+dnJlZmhfbXYgPSByZXQgLyAxMDAwOworCisJaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSBJRF9BRDg4MDMpIHsKKwkJc3RhdGUtPnZyZWZsX3JlZyA9IGRldm1fcmVndWxhdG9yX2dldCgmc3BpLT5kZXYsICJ2cmVmbCIpOworCQlpZiAoSVNfRVJSKHN0YXRlLT52cmVmbF9yZWcpKSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgIlZyZWZsIHJlZ3VsYXRvciBub3Qgc3BlY2lmaWVkXG4iKTsKKwkJCXJldCA9IFBUUl9FUlIoc3RhdGUtPnZyZWZsX3JlZyk7CisJCQlnb3RvIGVycm9yX2Rpc2FibGVfdnJlZmhfcmVnOworCQl9CisKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShzdGF0ZS0+dnJlZmxfcmVnKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHZyZWZsIHJlZ3VsYXRvcjogJWRcbiIsCisJCQkJCXJldCk7CisJCQlnb3RvIGVycm9yX2Rpc2FibGVfdnJlZmhfcmVnOworCQl9CisKKwkJcmV0ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHN0YXRlLT52cmVmbF9yZWcpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gcmVhZCB2cmVmbCByZWd1bGF0b3I6ICVkXG4iLAorCQkJCQlyZXQpOworCQkJZ290byBlcnJvcl9kaXNhYmxlX3ZyZWZsX3JlZzsKKwkJfQorCQlzdGF0ZS0+dnJlZmxfbXYgPSByZXQgLyAxMDAwOworCX0gZWxzZSB7CisJCXN0YXRlLT52cmVmbF9tdiA9IDA7CisJCXN0YXRlLT52cmVmbF9yZWcgPSBOVUxMOworCX0KKworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGluZGlvX2Rldik7CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCWluZGlvX2Rldi0+aW5mbyA9ICZhZDg4MDFfaW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFkODgwMV9jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWQ4ODAxX2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPm5hbWUgPSBpZC0+bmFtZTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGlpbyBkZXZpY2U6ICVkXG4iLAorCQkJCXJldCk7CisJCWdvdG8gZXJyb3JfZGlzYWJsZV92cmVmbF9yZWc7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yX2Rpc2FibGVfdnJlZmxfcmVnOgorCWlmIChzdGF0ZS0+dnJlZmxfcmVnKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdGF0ZS0+dnJlZmxfcmVnKTsKK2Vycm9yX2Rpc2FibGVfdnJlZmhfcmVnOgorCXJlZ3VsYXRvcl9kaXNhYmxlKHN0YXRlLT52cmVmaF9yZWcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ4ODAxX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgYWQ4ODAxX3N0YXRlICpzdGF0ZSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAoc3RhdGUtPnZyZWZsX3JlZykKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3RhdGUtPnZyZWZsX3JlZyk7CisJcmVndWxhdG9yX2Rpc2FibGUoc3RhdGUtPnZyZWZoX3JlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkODgwMV9pZHNbXSA9IHsKKwl7ImFkODgwMSIsIElEX0FEODgwMX0sCisJeyJhZDg4MDMiLCBJRF9BRDg4MDN9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGFkODgwMV9pZHMpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ4ODAxX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZDg4MDEiLAorCX0sCisJLnByb2JlCQk9IGFkODgwMV9wcm9iZSwKKwkucmVtb3ZlCQk9IGFkODgwMV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gYWQ4ODAxX2lkcywKK307Cittb2R1bGVfc3BpX2RyaXZlcihhZDg4MDFfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiR3dlbmhhZWwgR29hdmVjLU1lcm91IDxnd2VuaGFlbC5nb2F2ZWMtbWVyb3VAdHJhYnVjYXlyZS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEODgwMS9BRDg4MDMgREFDIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvY2lvLWRhYy5jIGIvZHJpdmVycy9paW8vZGFjL2Npby1kYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTc0M2UyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vZGFjL2Npby1kYWMuYwpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIElJTyBkcml2ZXIgZm9yIHRoZSBNZWFzdXJlbWVudCBDb21wdXRpbmcgQ0lPLURBQworICogQ29weXJpZ2h0IChDKSAyMDE2IFdpbGxpYW0gQnJlYXRoaXR0IEdyYXkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIE1lYXN1cmVtZW50IENvbXB1dGluZyBkZXZpY2VzOiBDSU8tREFDMTYsCisgKiBDSU8tREFDMDYsIGFuZCBQQzEwNC1EQUMwNi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaXNhLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2RlZmluZSBDSU9fREFDX05VTV9DSEFOIDE2CisKKyNkZWZpbmUgQ0lPX0RBQ19DSEFOKGNoYW4pIHsJCQkJXAorCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJCVwKKwkuY2hhbm5lbCA9IGNoYW4sCQkJCVwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJXAorCS5pbmRleGVkID0gMSwJCQkJCVwKKwkub3V0cHV0ID0gMQkJCQkJXAorfQorCisjZGVmaW5lIENJT19EQUNfRVhURU5UIDMyCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYmFzZVttYXhfbnVtX2lzYV9kZXYoQ0lPX0RBQ19FWFRFTlQpXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2Npb19kYWM7Cittb2R1bGVfcGFyYW1fYXJyYXkoYmFzZSwgdWludCwgJm51bV9jaW9fZGFjLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYmFzZSwgIk1lYXN1cmVtZW50IENvbXB1dGluZyBDSU8tREFDIGJhc2UgYWRkcmVzc2VzIik7CisKKy8qKgorICogc3RydWN0IGNpb19kYWNfaWlvIC0gSUlPIGRldmljZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKiBAY2hhbl9vdXRfc3RhdGVzOgljaGFubmVscycgb3V0cHV0IHN0YXRlcworICogQGJhc2U6CQliYXNlIHBvcnQgYWRkcmVzcyBvZiB0aGUgSUlPIGRldmljZQorICovCitzdHJ1Y3QgY2lvX2RhY19paW8geworCWludCBjaGFuX291dF9zdGF0ZXNbQ0lPX0RBQ19OVU1fQ0hBTl07CisJdW5zaWduZWQgaW50IGJhc2U7Cit9OworCitzdGF0aWMgaW50IGNpb19kYWNfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBjaW9fZGFjX2lpbyAqY29uc3QgcHJpdiA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlpZiAobWFzayAhPSBJSU9fQ0hBTl9JTkZPX1JBVykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqdmFsID0gcHJpdi0+Y2hhbl9vdXRfc3RhdGVzW2NoYW4tPmNoYW5uZWxdOworCisJcmV0dXJuIElJT19WQUxfSU5UOworfQorCitzdGF0aWMgaW50IGNpb19kYWNfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGludCB2YWwsIGludCB2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IGNpb19kYWNfaWlvICpjb25zdCBwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwljb25zdCB1bnNpZ25lZCBpbnQgY2hhbl9hZGRyX29mZnNldCA9IDIgKiBjaGFuLT5jaGFubmVsOworCisJaWYgKG1hc2sgIT0gSUlPX0NIQU5fSU5GT19SQVcpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogREFDIGNhbiBvbmx5IGFjY2VwdCB1cCB0byBhIDE2LWJpdCB2YWx1ZSAqLworCWlmICgodW5zaWduZWQgaW50KXZhbCA+IDY1NTM1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByaXYtPmNoYW5fb3V0X3N0YXRlc1tjaGFuLT5jaGFubmVsXSA9IHZhbDsKKwlvdXR3KHZhbCwgcHJpdi0+YmFzZSArIGNoYW5fYWRkcl9vZmZzZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gY2lvX2RhY19pbmZvID0geworCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gY2lvX2RhY19yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gY2lvX2RhY193cml0ZV9yYXcKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjaW9fZGFjX2NoYW5uZWxzW0NJT19EQUNfTlVNX0NIQU5dID0geworCUNJT19EQUNfQ0hBTigwKSwgQ0lPX0RBQ19DSEFOKDEpLCBDSU9fREFDX0NIQU4oMiksIENJT19EQUNfQ0hBTigzKSwKKwlDSU9fREFDX0NIQU4oNCksIENJT19EQUNfQ0hBTig1KSwgQ0lPX0RBQ19DSEFOKDYpLCBDSU9fREFDX0NIQU4oNyksCisJQ0lPX0RBQ19DSEFOKDgpLCBDSU9fREFDX0NIQU4oOSksIENJT19EQUNfQ0hBTigxMCksIENJT19EQUNfQ0hBTigxMSksCisJQ0lPX0RBQ19DSEFOKDEyKSwgQ0lPX0RBQ19DSEFOKDEzKSwgQ0lPX0RBQ19DSEFOKDE0KSwgQ0lPX0RBQ19DSEFOKDE1KQorfTsKKworc3RhdGljIGludCBjaW9fZGFjX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlkKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IGNpb19kYWNfaWlvICpwcml2OworCXVuc2lnbmVkIGludCBpOworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFkZXZtX3JlcXVlc3RfcmVnaW9uKGRldiwgYmFzZVtpZF0sIENJT19EQUNfRVhURU5ULAorCQlkZXZfbmFtZShkZXYpKSkgeworCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byByZXF1ZXN0IHBvcnQgYWRkcmVzc2VzICgweCVYLTB4JVgpXG4iLAorCQkJYmFzZVtpZF0sIGJhc2VbaWRdICsgQ0lPX0RBQ19FWFRFTlQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWluZGlvX2Rldi0+aW5mbyA9ICZjaW9fZGFjX2luZm87CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBjaW9fZGFjX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQ0lPX0RBQ19OVU1fQ0hBTjsKKwlpbmRpb19kZXYtPm5hbWUgPSBkZXZfbmFtZShkZXYpOworCisJcHJpdiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJcHJpdi0+YmFzZSA9IGJhc2VbaWRdOworCisJLyogaW5pdGlhbGl6ZSBEQUMgb3V0cHV0cyB0byAwViAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSArPSAyKQorCQlvdXR3KDAsIGJhc2VbaWRdICsgaSk7CisKKwlyZXR1cm4gZGV2bV9paW9fZGV2aWNlX3JlZ2lzdGVyKGRldiwgaW5kaW9fZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBpc2FfZHJpdmVyIGNpb19kYWNfZHJpdmVyID0geworCS5wcm9iZSA9IGNpb19kYWNfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiY2lvLWRhYyIKKwl9Cit9OworCittb2R1bGVfaXNhX2RyaXZlcihjaW9fZGFjX2RyaXZlciwgbnVtX2Npb19kYWMpOworCitNT0RVTEVfQVVUSE9SKCJXaWxsaWFtIEJyZWF0aGl0dCBHcmF5IDx2aWxoZWxtLmdyYXlAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNZWFzdXJlbWVudCBDb21wdXRpbmcgQ0lPLURBQyBJSU8gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvc3R4MTA0LmMgYi9kcml2ZXJzL2lpby9kYWMvc3R4MTA0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MmE5NzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9paW8vZGFjL3N0eDEwNC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qCi0gKiBEQUMgZHJpdmVyIGZvciB0aGUgQXBleCBFbWJlZGRlZCBTeXN0ZW1zIFNUWDEwNAotICogQ29weXJpZ2h0IChDKSAyMDE2IFdpbGxpYW0gQnJlYXRoaXR0IEdyYXkKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+Ci0jaW5jbHVkZSA8bGludXgvaWlvL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pc2EuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNkZWZpbmUgU1RYMTA0X05VTV9DSEFOIDIKLQotI2RlZmluZSBTVFgxMDRfQ0hBTihjaGFuKSB7CQkJCVwKLQkudHlwZSA9IElJT19WT0xUQUdFLAkJCQlcCi0JLmNoYW5uZWwgPSBjaGFuLAkJCQlcCi0JLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCVwKLQkuaW5kZXhlZCA9IDEsCQkJCQlcCi0JLm91dHB1dCA9IDEJCQkJCVwKLX0KLQotI2RlZmluZSBTVFgxMDRfRVhURU5UIDE2Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYmFzZVttYXhfbnVtX2lzYV9kZXYoU1RYMTA0X0VYVEVOVCldOwotc3RhdGljIHVuc2lnbmVkIGludCBudW1fc3R4MTA0OwotbW9kdWxlX3BhcmFtX2FycmF5KGJhc2UsIHVpbnQsICZudW1fc3R4MTA0LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoYmFzZSwgIkFwZXggRW1iZWRkZWQgU3lzdGVtcyBTVFgxMDQgYmFzZSBhZGRyZXNzZXMiKTsKLQotLyoqCi0gKiBzdHJ1Y3Qgc3R4MTA0X2lpbyAtIElJTyBkZXZpY2UgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZQotICogQGNoYW5fb3V0X3N0YXRlczoJY2hhbm5lbHMnIG91dHB1dCBzdGF0ZXMKLSAqIEBiYXNlOgkJYmFzZSBwb3J0IGFkZHJlc3Mgb2YgdGhlIElJTyBkZXZpY2UKLSAqLwotc3RydWN0IHN0eDEwNF9paW8gewotCXVuc2lnbmVkIGNoYW5fb3V0X3N0YXRlc1tTVFgxMDRfTlVNX0NIQU5dOwotCXVuc2lnbmVkIGJhc2U7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBzdHgxMDRfZ3BpbyAtIEdQSU8gZGV2aWNlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUKLSAqIEBjaGlwOglpbnN0YW5jZSBvZiB0aGUgZ3Bpb19jaGlwCi0gKiBAbG9jazoJc3luY2hyb25pemF0aW9uIGxvY2sgdG8gcHJldmVudCBJL08gcmFjZSBjb25kaXRpb25zCi0gKiBAYmFzZToJYmFzZSBwb3J0IGFkZHJlc3Mgb2YgdGhlIEdQSU8gZGV2aWNlCi0gKiBAb3V0X3N0YXRlOglvdXRwdXQgYml0cyBzdGF0ZQotICovCi1zdHJ1Y3Qgc3R4MTA0X2dwaW8gewotCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKLQlzcGlubG9ja190IGxvY2s7Ci0JdW5zaWduZWQgaW50IGJhc2U7Ci0JdW5zaWduZWQgaW50IG91dF9zdGF0ZTsKLX07Ci0KLXN0YXRpYyBpbnQgc3R4MTA0X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCi0Jc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgbWFzaykKLXsKLQlzdHJ1Y3Qgc3R4MTA0X2lpbyAqY29uc3QgcHJpdiA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0KLQlpZiAobWFzayAhPSBJSU9fQ0hBTl9JTkZPX1JBVykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkqdmFsID0gcHJpdi0+Y2hhbl9vdXRfc3RhdGVzW2NoYW4tPmNoYW5uZWxdOwotCi0JcmV0dXJuIElJT19WQUxfSU5UOwotfQotCi1zdGF0aWMgaW50IHN0eDEwNF93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKLQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50IHZhbCwgaW50IHZhbDIsIGxvbmcgbWFzaykKLXsKLQlzdHJ1Y3Qgc3R4MTA0X2lpbyAqY29uc3QgcHJpdiA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JY29uc3QgdW5zaWduZWQgY2hhbl9hZGRyX29mZnNldCA9IDIgKiBjaGFuLT5jaGFubmVsOwotCi0JaWYgKG1hc2sgIT0gSUlPX0NIQU5fSU5GT19SQVcpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcHJpdi0+Y2hhbl9vdXRfc3RhdGVzW2NoYW4tPmNoYW5uZWxdID0gdmFsOwotCW91dHcodmFsLCBwcml2LT5iYXNlICsgNCArIGNoYW5fYWRkcl9vZmZzZXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gc3R4MTA0X2luZm8gPSB7Ci0JLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKLQkucmVhZF9yYXcgPSBzdHgxMDRfcmVhZF9yYXcsCi0JLndyaXRlX3JhdyA9IHN0eDEwNF93cml0ZV9yYXcKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzdHgxMDRfY2hhbm5lbHNbU1RYMTA0X05VTV9DSEFOXSA9IHsKLQlTVFgxMDRfQ0hBTigwKSwKLQlTVFgxMDRfQ0hBTigxKQotfTsKLQotc3RhdGljIGludCBzdHgxMDRfZ3Bpb19nZXRfZGlyZWN0aW9uKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JdW5zaWduZWQgaW50IG9mZnNldCkKLXsKLQlpZiAob2Zmc2V0IDwgNCkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzdHgxMDRfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCWlmIChvZmZzZXQgPj0gNCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzdHgxMDRfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsCi0JdW5zaWduZWQgaW50IG9mZnNldCwgaW50IHZhbHVlKQotewotCWlmIChvZmZzZXQgPCA0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWNoaXAtPnNldChjaGlwLCBvZmZzZXQsIHZhbHVlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzdHgxMDRfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCkKLXsKLQlzdHJ1Y3Qgc3R4MTA0X2dwaW8gKmNvbnN0IHN0eDEwNGdwaW8gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKLQotCWlmIChvZmZzZXQgPj0gNCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gISEoaW5iKHN0eDEwNGdwaW8tPmJhc2UpICYgQklUKG9mZnNldCkpOwotfQotCi1zdGF0aWMgdm9pZCBzdHgxMDRfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNldCwKLQlpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IHN0eDEwNF9ncGlvICpjb25zdCBzdHgxMDRncGlvID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7Ci0JY29uc3QgdW5zaWduZWQgaW50IG1hc2sgPSBCSVQob2Zmc2V0KSA+PiA0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAob2Zmc2V0IDwgNCkKLQkJcmV0dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN0eDEwNGdwaW8tPmxvY2ssIGZsYWdzKTsKLQotCWlmICh2YWx1ZSkKLQkJc3R4MTA0Z3Bpby0+b3V0X3N0YXRlIHw9IG1hc2s7Ci0JZWxzZQotCQlzdHgxMDRncGlvLT5vdXRfc3RhdGUgJj0gfm1hc2s7Ci0KLQlvdXRiKHN0eDEwNGdwaW8tPm91dF9zdGF0ZSwgc3R4MTA0Z3Bpby0+YmFzZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdHgxMDRncGlvLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgc3R4MTA0X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGlkKQotewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7Ci0Jc3RydWN0IHN0eDEwNF9paW8gKnByaXY7Ci0Jc3RydWN0IHN0eDEwNF9ncGlvICpzdHgxMDRncGlvOwotCWludCBlcnI7Ci0KLQlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoZGV2LCBzaXplb2YoKnByaXYpKTsKLQlpZiAoIWluZGlvX2RldikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzdHgxMDRncGlvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzdHgxMDRncGlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzdHgxMDRncGlvKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmICghZGV2bV9yZXF1ZXN0X3JlZ2lvbihkZXYsIGJhc2VbaWRdLCBTVFgxMDRfRVhURU5ULAotCQlkZXZfbmFtZShkZXYpKSkgewotCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBsb2NrIHBvcnQgYWRkcmVzc2VzICgweCVYLTB4JVgpXG4iLAotCQkJYmFzZVtpZF0sIGJhc2VbaWRdICsgU1RYMTA0X0VYVEVOVCk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JaW5kaW9fZGV2LT5pbmZvID0gJnN0eDEwNF9pbmZvOwotCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKLQlpbmRpb19kZXYtPmNoYW5uZWxzID0gc3R4MTA0X2NoYW5uZWxzOwotCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gU1RYMTA0X05VTV9DSEFOOwotCWluZGlvX2Rldi0+bmFtZSA9IGRldl9uYW1lKGRldik7Ci0KLQlwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlwcml2LT5iYXNlID0gYmFzZVtpZF07Ci0KLQkvKiBpbml0aWFsaXplIERBQyBvdXRwdXQgdG8gMFYgKi8KLQlvdXR3KDAsIGJhc2VbaWRdICsgNCk7Ci0Jb3V0dygwLCBiYXNlW2lkXSArIDYpOwotCi0JZXJyID0gZGV2bV9paW9fZGV2aWNlX3JlZ2lzdGVyKGRldiwgaW5kaW9fZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoZGV2LCAiSUlPIGRldmljZSByZWdpc3RlcmluZyBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlzdHgxMDRncGlvLT5jaGlwLmxhYmVsID0gZGV2X25hbWUoZGV2KTsKLQlzdHgxMDRncGlvLT5jaGlwLnBhcmVudCA9IGRldjsKLQlzdHgxMDRncGlvLT5jaGlwLm93bmVyID0gVEhJU19NT0RVTEU7Ci0Jc3R4MTA0Z3Bpby0+Y2hpcC5iYXNlID0gLTE7Ci0Jc3R4MTA0Z3Bpby0+Y2hpcC5uZ3BpbyA9IDg7Ci0Jc3R4MTA0Z3Bpby0+Y2hpcC5nZXRfZGlyZWN0aW9uID0gc3R4MTA0X2dwaW9fZ2V0X2RpcmVjdGlvbjsKLQlzdHgxMDRncGlvLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IHN0eDEwNF9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKLQlzdHgxMDRncGlvLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBzdHgxMDRfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0OwotCXN0eDEwNGdwaW8tPmNoaXAuZ2V0ID0gc3R4MTA0X2dwaW9fZ2V0OwotCXN0eDEwNGdwaW8tPmNoaXAuc2V0ID0gc3R4MTA0X2dwaW9fc2V0OwotCXN0eDEwNGdwaW8tPmJhc2UgPSBiYXNlW2lkXSArIDM7Ci0Jc3R4MTA0Z3Bpby0+b3V0X3N0YXRlID0gMHgwOwotCi0Jc3Bpbl9sb2NrX2luaXQoJnN0eDEwNGdwaW8tPmxvY2spOwotCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgc3R4MTA0Z3Bpbyk7Ci0KLQllcnIgPSBncGlvY2hpcF9hZGRfZGF0YSgmc3R4MTA0Z3Bpby0+Y2hpcCwgc3R4MTA0Z3Bpbyk7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKGRldiwgIkdQSU8gcmVnaXN0ZXJpbmcgZmFpbGVkICglZClcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3R4MTA0X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpZCkKLXsKLQlzdHJ1Y3Qgc3R4MTA0X2dwaW8gKmNvbnN0IHN0eDEwNGdwaW8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWdwaW9jaGlwX3JlbW92ZSgmc3R4MTA0Z3Bpby0+Y2hpcCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBpc2FfZHJpdmVyIHN0eDEwNF9kcml2ZXIgPSB7Ci0JLnByb2JlID0gc3R4MTA0X3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInN0eDEwNCIKLQl9LAotCS5yZW1vdmUgPSBzdHgxMDRfcmVtb3ZlCi19OwotCi1tb2R1bGVfaXNhX2RyaXZlcihzdHgxMDRfZHJpdmVyLCBudW1fc3R4MTA0KTsKLQotTU9EVUxFX0FVVEhPUigiV2lsbGlhbSBCcmVhdGhpdHQgR3JheSA8dmlsaGVsbS5ncmF5QGdtYWlsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQXBleCBFbWJlZGRlZCBTeXN0ZW1zIFNUWDEwNCBEQUMgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9neXJvL3NzcF9neXJvX3NlbnNvci5jIGIvZHJpdmVycy9paW8vZ3lyby9zc3BfZ3lyb19zZW5zb3IuYwppbmRleCAwYThhZmRkLi4xZjI1ZjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9neXJvL3NzcF9neXJvX3NlbnNvci5jCisrKyBiL2RyaXZlcnMvaWlvL2d5cm8vc3NwX2d5cm9fc2Vuc29yLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCBpaW9faW5mbyBzc3BfZ3lyb19paW9faW5mbyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gc3NwX2d5cm9faWlvX2luZm8gPSB7CiAJLnJlYWRfcmF3ID0gJnNzcF9neXJvX3JlYWRfcmF3LAogCS53cml0ZV9yYXcgPSAmc3NwX2d5cm9fd3JpdGVfcmF3LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L0tjb25maWcgYi9kcml2ZXJzL2lpby9odW1pZGl0eS9LY29uZmlnCmluZGV4IDczOGE4NmQuLmIxN2UyZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvS2NvbmZpZwpAQCAtNiw2ICs2LDggQEAKIGNvbmZpZyBBTTIzMTUKICAgICB0cmlzdGF0ZSAiQW9zb25nIEFNMjMxNSByZWxhdGl2ZSBodW1pZGl0eSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yIgogICAgIGRlcGVuZHMgb24gSTJDCisgICAgc2VsZWN0IElJT19CVUZGRVIKKyAgICBzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKICAgICBoZWxwCiAgICAgICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIEFvc29uZyBBTTIzMTUKICAgICAgIHJlbGF0aXZlIGh1bWlkaXR5IGFuZCBhbWJpZW50IHRlbXBlcmF0dXJlIHNlbnNvci4KQEAgLTI2LDExICsyOCwxMSBAQAogCXRyaXN0YXRlICJUSSBIREMxMDB4IHJlbGF0aXZlIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IiCiAJZGVwZW5kcyBvbiBJMkMKIAloZWxwCi0JIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciB0aGUgVEkgSERDMTAweCBzZXJpZXMgb2YKLQkgcmVsYXRpdmUgaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFRleGFzIEluc3RydW1lbnRzCisJICBIREMxMDAwIGFuZCBIREMxMDA4IHJlbGF0aXZlIGh1bWlkaXR5IGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3JzLgogCi0JIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKLQkgd2lsbCBiZSBjYWxsZWQgaGRjMTAweC4KKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGhkYzEwMHguCiAKIGNvbmZpZyBIVFUyMQogCXRyaXN0YXRlICJNZWFzdXJlbWVudCBTcGVjaWFsdGllcyBIVFUyMSBodW1pZGl0eSAmIHRlbXBlcmF0dXJlIHNlbnNvciIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L2FtMjMxNS5jIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvYW0yMzE1LmMKaW5kZXggM2UyMDBmNi4uZmY5NmI2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaHVtaWRpdHkvYW0yMzE1LmMKKysrIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvYW0yMzE1LmMKQEAgLTI0NCw3ICsyNDQsNyBAQAogCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBhbTIzMTVfY2hhbm5lbHM7CiAJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFtMjMxNV9jaGFubmVscyk7CiAKLQlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKIAkJCQkJIGFtMjMxNV90cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaWlvIHRyaWdnZXJlZCBidWZmZXIgc2V0dXAgZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2h1bWlkaXR5L2hkYzEwMHguYyBiL2RyaXZlcnMvaWlvL2h1bWlkaXR5L2hkYzEwMHguYwppbmRleCBhMDM4MzJhLi5lMGM5YzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9odW1pZGl0eS9oZGMxMDB4LmMKKysrIGIvZHJpdmVycy9paW8vaHVtaWRpdHkvaGRjMTAweC5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCWludCBkZWxheSA9IGRhdGEtPmFkY19pbnRfdXNbY2hhbi0+YWRkcmVzc107CiAJaW50IHJldDsKLQlpbnQgdmFsOworCV9fYmUxNiB2YWw7CiAKIAkvKiBzdGFydCBtZWFzdXJlbWVudCAqLwogCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgY2hhbi0+YWRkcmVzcyk7CkBAIC0xNTQsMjYgKzE1NCwxMyBAQAogCS8qIHdhaXQgZm9yIGludGVncmF0aW9uIHRpbWUgdG8gcGFzcyAqLwogCXVzbGVlcF9yYW5nZShkZWxheSwgZGVsYXkgKyAxMDAwKTsKIAotCS8qCi0JICogaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhIGNhbm5vdCgpIGJlIHVzZWQgaGVyZSBkdWUgdG8gdGhlIGNvbW1hbmQKLQkgKiB2YWx1ZSBub3QgYmVpbmcgdW5kZXJzdG9vZCBhbmQgY2F1c2VzIE5BS3MgcHJldmVudGluZyBhbnkgcmVhZGluZwotCSAqIGZyb20gYmVpbmcgYWNjZXNzZWQuCi0JICovCi0JcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZShjbGllbnQpOworCS8qIHJlYWQgbWVhc3VyZW1lbnQgKi8KKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoZGF0YS0+Y2xpZW50LCAoY2hhciAqKSZ2YWwsIHNpemVvZih2YWwpKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNhbm5vdCByZWFkIGhpZ2ggYnl0ZSBtZWFzdXJlbWVudCIpOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNhbm5vdCByZWFkIHNlbnNvciBkYXRhXG4iKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JdmFsID0gcmV0IDw8IDg7Ci0KLQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjYW5ub3QgcmVhZCBsb3cgYnl0ZSBtZWFzdXJlbWVudCIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQl2YWwgfD0gcmV0OwotCi0JcmV0dXJuIHZhbDsKKwlyZXR1cm4gYmUxNl90b19jcHUodmFsKTsKIH0KIAogc3RhdGljIGludCBoZGMxMDB4X2dldF9oZWF0ZXJfc3RhdHVzKHN0cnVjdCBoZGMxMDB4X2RhdGEgKmRhdGEpCkBAIC0yNzIsOCArMjU5LDggQEAKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwogCXN0cnVjdCBoZGMxMDB4X2RhdGEgKmRhdGE7CiAKLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwKLQkJCQlJMkNfRlVOQ19TTUJVU19XT1JEX0RBVEEgfCBJMkNfRlVOQ19TTUJVU19CWVRFKSkKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBIHwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX0JZVEUgfCBJMkNfRlVOQ19JMkMpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYwppbmRleCA5MDQ2MmZjLi4xNThhYWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tYnVmZmVyLmMKKysrIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCkBAIC0xMDcsOSArMTA3LDEwIEBACiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmIgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKwlERUZJTkVfV0FJVF9GVU5DKHdhaXQsIHdva2VuX3dha2VfZnVuY3Rpb24pOwogCXNpemVfdCBkYXR1bV9zaXplOwogCXNpemVfdCB0b193YWl0OwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKIAlpZiAoIWluZGlvX2Rldi0+aW5mbykKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0xMzEsMTkgKzEzMiwyOSBAQAogCWVsc2UKIAkJdG9fd2FpdCA9IG1pbl90KHNpemVfdCwgbiAvIGRhdHVtX3NpemUsIHJiLT53YXRlcm1hcmspOwogCisJYWRkX3dhaXRfcXVldWUoJnJiLT5wb2xscSwgJndhaXQpOwogCWRvIHsKLQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHJiLT5wb2xscSwKLQkJICAgICAgaWlvX2J1ZmZlcl9yZWFkeShpbmRpb19kZXYsIHJiLCB0b193YWl0LCBuIC8gZGF0dW1fc2l6ZSkpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJaWYgKCFpbmRpb19kZXYtPmluZm8pIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlicmVhazsKKwkJfQogCi0JCWlmICghaW5kaW9fZGV2LT5pbmZvKQotCQkJcmV0dXJuIC1FTk9ERVY7CisJCWlmICghaWlvX2J1ZmZlcl9yZWFkeShpbmRpb19kZXYsIHJiLCB0b193YWl0LCBuIC8gZGF0dW1fc2l6ZSkpIHsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJd2FpdF93b2tlbigmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFLAorCQkJCSAgIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKKwkJCWNvbnRpbnVlOworCQl9CiAKIAkJcmV0ID0gcmItPmFjY2Vzcy0+cmVhZF9maXJzdF9uKHJiLCBuLCBidWYpOwogCQlpZiAocmV0ID09IDAgJiYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKIAkJCXJldCA9IC1FQUdBSU47Ci0JIH0gd2hpbGUgKHJldCA9PSAwKTsKKwl9IHdoaWxlIChyZXQgPT0gMCk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnJiLT5wb2xscSwgJndhaXQpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jCmluZGV4IGY5MTRkNWQuLmZjMzQwZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMKKysrIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYwpAQCAtNjEzLDkgKzYxMyw4IEBACiAJCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lMDl1XG4iLCB2YWxzWzBdLCB2YWxzWzFdKTsKIAljYXNlIElJT19WQUxfRlJBQ1RJT05BTDoKIAkJdG1wID0gZGl2X3M2NCgoczY0KXZhbHNbMF0gKiAxMDAwMDAwMDAwTEwsIHZhbHNbMV0pOwotCQl2YWxzWzFdID0gZG9fZGl2KHRtcCwgMTAwMDAwMDAwMExMKTsKLQkJdmFsc1swXSA9IHRtcDsKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQuJTA5dVxuIiwgdmFsc1swXSwgdmFsc1sxXSk7CisJCXZhbHNbMF0gPSAoaW50KWRpdl9zNjRfcmVtKHRtcCwgMTAwMDAwMDAwMCwgJnZhbHNbMV0pOworCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lMDl1XG4iLCB2YWxzWzBdLCBhYnModmFsc1sxXSkpOwogCWNhc2UgSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI6CiAJCXRtcCA9IChzNjQpdmFsc1swXSAqIDEwMDAwMDAwMDBMTCA+PiB2YWxzWzFdOwogCQl2YWxzWzFdID0gZG9fZGl2KHRtcCwgMTAwMDAwMDAwMExMKTsKQEAgLTEzMDksNyArMTMwOCw3IEBACiAJaWlvX2RldmljZV9mcmVlKCooc3RydWN0IGlpb19kZXYgKiopcmVzKTsKIH0KIAotc3RhdGljIGludCBkZXZtX2lpb19kZXZpY2VfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMsIHZvaWQgKmRhdGEpCitpbnQgZGV2bV9paW9fZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcmVzLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBpaW9fZGV2ICoqciA9IHJlczsKIAlpZiAoIXIgfHwgISpyKSB7CkBAIC0xMzE4LDYgKzEzMTcsNyBAQAogCX0KIAlyZXR1cm4gKnIgPT0gZGF0YTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1faWlvX2RldmljZV9tYXRjaCk7CiAKIC8qKgogICogZGV2bV9paW9fZGV2aWNlX2FsbG9jIC0gUmVzb3VyY2UtbWFuYWdlZCBpaW9fZGV2aWNlX2FsbG9jKCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1ldmVudC5jIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWV2ZW50LmMKaW5kZXggMGViZmM5Mi4uOTBmYWM4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWV2ZW50LmMKKysrIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWV2ZW50LmMKQEAgLTU3LDYgKzU3LDExIEBACiAgKgogICogTm90ZTogVGhlIGNhbGxlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgbm90IHJ1bm5pbmcKICAqIGNvbmN1cnJlbnRseSBmb3IgdGhlIHNhbWUgaW5kaW9fZGV2IG1vcmUgdGhhbiBvbmNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHNhZmVseSB1c2VkIGFzIHNvb24gYXMgYSB2YWxpZCByZWZlcmVuY2UgdG8gaWlvX2RldiBoYXMKKyAqIGJlZW4gb2J0YWluZWQgdmlhIGlpb19kZXZpY2VfYWxsb2MoKSwgYnV0IGFueSBldmVudHMgdGhhdCBhcmUgc3VibWl0dGVkCisgKiBiZWZvcmUgaWlvX2RldmljZV9yZWdpc3RlcigpIGhhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHdpbGwgYmUgc2lsZW50bHkKKyAqIGRpc2NhcmRlZC4KICAqKi8KIGludCBpaW9fcHVzaF9ldmVudChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1NjQgZXZfY29kZSwgczY0IHRpbWVzdGFtcCkKIHsKQEAgLTY0LDYgKzY5LDkgQEAKIAlzdHJ1Y3QgaWlvX2V2ZW50X2RhdGEgZXY7CiAJaW50IGNvcGllZDsKIAorCWlmICghZXZfaW50KQorCQlyZXR1cm4gMDsKKwogCS8qIERvZXMgYW55b25lIGNhcmU/ICovCiAJaWYgKGlpb19ldmVudF9lbmFibGVkKGV2X2ludCkpIHsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMKaW5kZXggN2FkODJmZC4uZTFlMTA0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jCkBAIC0xMTksNiArMTE5LDIyIEBACiB9CiBFWFBPUlRfU1lNQk9MKGlpb190cmlnZ2VyX3VucmVnaXN0ZXIpOwogCitpbnQgaWlvX3RyaWdnZXJfc2V0X2ltbXV0YWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpCit7CisJaWYgKCFpbmRpb19kZXYgfHwgIXRyaWcpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJV0FSTl9PTihpbmRpb19kZXYtPnRyaWdfcmVhZG9ubHkpOworCisJaW5kaW9fZGV2LT50cmlnID0gaWlvX3RyaWdnZXJfZ2V0KHRyaWcpOworCWluZGlvX2Rldi0+dHJpZ19yZWFkb25seSA9IHRydWU7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpaW9fdHJpZ2dlcl9zZXRfaW1tdXRhYmxlKTsKKwogLyogU2VhcmNoIGZvciB0cmlnZ2VyIGJ5IG5hbWUsIGFzc3VtaW5nIGlpb190cmlnZ2VyX2xpc3RfbG9jayBoZWxkICovCiBzdGF0aWMgc3RydWN0IGlpb190cmlnZ2VyICpfX2lpb190cmlnZ2VyX2ZpbmRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQogewpAQCAtMjU1LDYgKzI3MSwxNCBAQAogCQkJZ290byBvdXRfZnJlZV9pcnE7CiAJfQogCisJLyoKKwkgKiBDaGVjayBpZiB3ZSBqdXN0IHJlZ2lzdGVyZWQgdG8gb3VyIG93biB0cmlnZ2VyOiB3ZSBkZXRlcm1pbmUgdGhhdAorCSAqIHRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIElJTyBkZXZpY2UgYW5kIHRoZSB0cmlnZ2VyIGRldmljZSBzaGFyZSB0aGUKKwkgKiBzYW1lIHBhcmVudCBkZXZpY2UuCisJICovCisJaWYgKHBmLT5pbmRpb19kZXYtPmRldi5wYXJlbnQgPT0gdHJpZy0+ZGV2LnBhcmVudCkKKwkJdHJpZy0+YXR0YWNoZWRfb3duX2RldmljZSA9IHRydWU7CisKIAlyZXR1cm4gcmV0OwogCiBvdXRfZnJlZV9pcnE6CkBAIC0yNzksNiArMzAzLDggQEAKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQorCWlmIChwZi0+aW5kaW9fZGV2LT5kZXYucGFyZW50ID09IHRyaWctPmRldi5wYXJlbnQpCisJCXRyaWctPmF0dGFjaGVkX293bl9kZXZpY2UgPSBmYWxzZTsKIAlpaW9fdHJpZ2dlcl9wdXRfaXJxKHRyaWcsIHBmLT5pcnEpOwogCWZyZWVfaXJxKHBmLT5pcnEsIHBmKTsKIAltb2R1bGVfcHV0KHBmLT5pbmRpb19kZXYtPmluZm8tPmRyaXZlcl9tb2R1bGUpOwpAQCAtMzg0LDYgKzQxMCwxMCBAQAogCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KKwlpZiAoaW5kaW9fZGV2LT50cmlnX3JlYWRvbmx5KSB7CisJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCXJldHVybiAtRVBFUk07CisJfQogCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKIAl0cmlnID0gaWlvX3RyaWdnZXJfZmluZF9ieV9uYW1lKGJ1ZiwgbGVuKTsKQEAgLTYyMiw2ICs2NTIsNzEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRldm1faWlvX3RyaWdnZXJfZnJlZSk7CiAKK3N0YXRpYyB2b2lkIGRldm1faWlvX3RyaWdnZXJfdW5yZWcoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCit7CisJaWlvX3RyaWdnZXJfdW5yZWdpc3RlcigqKHN0cnVjdCBpaW9fdHJpZ2dlciAqKilyZXMpOworfQorCisvKioKKyAqIGRldm1faWlvX3RyaWdnZXJfcmVnaXN0ZXIgLSBSZXNvdXJjZS1tYW5hZ2VkIGlpb190cmlnZ2VyX3JlZ2lzdGVyKCkKKyAqIEBkZXY6CWRldmljZSB0aGlzIHRyaWdnZXIgd2FzIGFsbG9jYXRlZCBmb3IKKyAqIEB0cmlnX2luZm86CXRyaWdnZXIgdG8gcmVnaXN0ZXIKKyAqCisgKiBNYW5hZ2VkIGlpb190cmlnZ2VyX3JlZ2lzdGVyKCkuICBUaGUgSUlPIHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIHRoaXMKKyAqIGZ1bmN0aW9uIGlzIGF1dG9tYXRpY2FsbHkgdW5yZWdpc3RlcmVkIG9uIGRyaXZlciBkZXRhY2guIFRoaXMgZnVuY3Rpb24KKyAqIGNhbGxzIGlpb190cmlnZ2VyX3JlZ2lzdGVyKCkgaW50ZXJuYWxseS4gUmVmZXIgdG8gdGhhdCBmdW5jdGlvbiBmb3IgbW9yZQorICogaW5mb3JtYXRpb24uCisgKgorICogSWYgYW4gaWlvX3RyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgdW5yZWdpc3RlcmVkCisgKiBzZXBhcmF0ZWx5LCBkZXZtX2lpb190cmlnZ2VyX3VucmVnaXN0ZXIoKSBtdXN0IGJlIHVzZWQuCisgKgorICogUkVUVVJOUzoKKyAqIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkZXZtX2lpb190cmlnZ2VyX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGlpb190cmlnZ2VyICp0cmlnX2luZm8pCit7CisJc3RydWN0IGlpb190cmlnZ2VyICoqcHRyOworCWludCByZXQ7CisKKwlwdHIgPSBkZXZyZXNfYWxsb2MoZGV2bV9paW9fdHJpZ2dlcl91bnJlZywgc2l6ZW9mKCpwdHIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkqcHRyID0gdHJpZ19pbmZvOworCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHRyaWdfaW5mbyk7CisJaWYgKCFyZXQpCisJCWRldnJlc19hZGQoZGV2LCBwdHIpOworCWVsc2UKKwkJZGV2cmVzX2ZyZWUocHRyKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX2lpb190cmlnZ2VyX3JlZ2lzdGVyKTsKKworLyoqCisgKiBkZXZtX2lpb190cmlnZ2VyX3VucmVnaXN0ZXIgLSBSZXNvdXJjZS1tYW5hZ2VkIGlpb190cmlnZ2VyX3VucmVnaXN0ZXIoKQorICogQGRldjoJZGV2aWNlIHRoaXMgaWlvX3RyaWdnZXIgYmVsb25ncyB0bworICogQHRyaWdfaW5mbzoJdGhlIHRyaWdnZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UKKyAqCisgKiBVbnJlZ2lzdGVyIHRyaWdnZXIgcmVnaXN0ZXJlZCB3aXRoIGRldm1faWlvX3RyaWdnZXJfcmVnaXN0ZXIoKS4KKyAqLwordm9pZCBkZXZtX2lpb190cmlnZ2VyX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdfaW5mbykKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGRldnJlc19yZWxlYXNlKGRldiwgZGV2bV9paW9fdHJpZ2dlcl91bnJlZywgZGV2bV9paW9fdHJpZ2dlcl9tYXRjaCwKKwkJCSAgICB0cmlnX2luZm8pOworCVdBUk5fT04ocmMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9paW9fdHJpZ2dlcl91bnJlZ2lzdGVyKTsKKworYm9vbCBpaW9fdHJpZ2dlcl91c2luZ19vd24oc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gaW5kaW9fZGV2LT50cmlnLT5hdHRhY2hlZF9vd25fZGV2aWNlOworfQorRVhQT1JUX1NZTUJPTChpaW9fdHJpZ2dlcl91c2luZ19vd24pOworCiB2b2lkIGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWluZGlvX2Rldi0+Z3JvdXBzW2luZGlvX2Rldi0+Z3JvdXBjb3VudGVyKytdID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L0tjb25maWcgYi9kcml2ZXJzL2lpby9saWdodC9LY29uZmlnCmluZGV4IDdjNTY2ZjUuLmJhMmU2NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2xpZ2h0L0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvS2NvbmZpZwpAQCAtNzYsNyArNzYsNiBAQAogY29uZmlnIEJIMTc4MAogCXRyaXN0YXRlICJST0hNIEJIMTc4MCBhbWJpZW50IGxpZ2h0IHNlbnNvciIKIAlkZXBlbmRzIG9uIEkyQwotCWRlcGVuZHMgb24gIVNFTlNPUlNfQkgxNzgwCiAJaGVscAogCSBTYXkgWSBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBST0hNIEJIMTc4MEdMSSBhbWJpZW50CiAJIGxpZ2h0IHNlbnNvci4KQEAgLTIzOCw2ICsyMzcsOCBAQAogCXRyaXN0YXRlICJNQVg0NDAwMCBBbWJpZW50IGFuZCBJbmZyYXJlZCBQcm94aW1pdHkgU2Vuc29yIgogCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IFJFR01BUF9JMkMKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgogCWhlbHAKIAkgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBzdXBwb3J0IGZvciBNYXhpbSBJbnRlZ3JhdGVkJ3MKIAkgTUFYNDQwMDAgYW1iaWVudCBhbmQgaW5mcmFyZWQgcHJveGltaXR5IHNlbnNvciBkZXZpY2UuCkBAIC0yNjYsNiArMjY3LDE5IEBACiAgICAgICAgICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAgICAgICAgICB3aWxsIGJlIGNhbGxlZCBwYTEyMjAzMDAxLgogCitjb25maWcgU0kxMTQ1CisJdHJpc3RhdGUgIlNJMTEzMiBhbmQgU0kxMTQxLzIvMy81LzYvNyBjb21iaW5lZCBBTFMsIFVWIGluZGV4IGFuZCBwcm94aW1pdHkgc2Vuc29yIgorCWRlcGVuZHMgb24gSTJDCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEgZHJpdmVyIGZvciB0aGUgU2lsaWNvbiBMYWJzIFNJMTEzMiBvcgorCSAgU0kxMTQxLzIvMy81LzYvNyBjb21iaW5lZCBhbWJpZW50IGxpZ2h0LCBVViBpbmRleCBhbmQgcHJveGltaXR5IHNlbnNvcgorCSAgY2hpcHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHNpMTE0NS4KKwogY29uZmlnIFNUSzMzMTAKIAl0cmlzdGF0ZSAiU1RLMzMxMCBBTFMgYW5kIHByb3hpbWl0eSBzZW5zb3IiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTMzMywxMSArMzQ3LDExIEBACiAJIHdpbGwgYmUgY2FsbGVkIHVzNTE4MmQuCiAKIGNvbmZpZyBWQ05MNDAwMAotCXRyaXN0YXRlICJWQ05MNDAwMCBjb21iaW5lZCBBTFMgYW5kIHByb3hpbWl0eSBzZW5zb3IiCisJdHJpc3RhdGUgIlZDTkw0MDAwLzQwMTAvNDAyMCBjb21iaW5lZCBBTFMgYW5kIHByb3hpbWl0eSBzZW5zb3IiCiAJZGVwZW5kcyBvbiBJMkMKIAloZWxwCi0JIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgYSBkcml2ZXIgZm9yIHRoZSBWaXNoYXkgVkNOTDQwMDAKLQkgY29tYmluZWQgYW1iaWVudCBsaWdodCBhbmQgcHJveGltaXR5IHNlbnNvci4KKwkgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBhIGRyaXZlciBmb3IgdGhlIFZpc2hheSBWQ05MNDAwMCwKKwkgVkNOTDQwMTAsIFZDTkw0MDIwIGNvbWJpbmVkIGFtYmllbnQgbGlnaHQgYW5kIHByb3hpbWl0eSBzZW5zb3IuCiAKIAkgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2Y25sNDAwMC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L01ha2VmaWxlIGIvZHJpdmVycy9paW8vbGlnaHQvTWFrZWZpbGUKaW5kZXggNmYyYTNjNjIuLmM1NzY4ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2xpZ2h0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L01ha2VmaWxlCkBAIC0yNiw2ICsyNiw3IEBACiBvYmotJChDT05GSUdfUEExMjIwMzAwMSkJKz0gcGExMjIwMzAwMS5vCiBvYmotJChDT05GSUdfUlBSMDUyMSkJCSs9IHJwcjA1MjEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVFNMMjU2MykJKz0gdHNsMjU2My5vCitvYmotJChDT05GSUdfU0kxMTQ1KQkJKz0gc2kxMTQ1Lm8KIG9iai0kKENPTkZJR19TVEszMzEwKSAgICAgICAgICArPSBzdGszMzEwLm8KIG9iai0kKENPTkZJR19UQ1MzNDE0KQkJKz0gdGNzMzQxNC5vCiBvYmotJChDT05GSUdfVENTMzQ3MikJCSs9IHRjczM0NzIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvc2kxMTQ1LmMgYi9kcml2ZXJzL2lpby9saWdodC9zaTExNDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTYwMzRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvc2kxMTQ1LmMKQEAgLTAsMCArMSwxNDA0IEBACisvKgorICogc2kxMTQ1LmMgLSBTdXBwb3J0IGZvciBTaWxhYnMgU0kxMTMyIGFuZCBTSTExNDEvMi8zLzUvNi83IGNvbWJpbmVkIGFtYmllbnQKKyAqIGxpZ2h0LCBVViBpbmRleCBhbmQgcHJveGltaXR5IHNlbnNvcnMKKyAqCisgKiBDb3B5cmlnaHQgMjAxNC0xNiBQZXRlciBNZWVyd2FsZC1TdGFkbGVyIDxwbWVlcndAcG1lZXJ3Lm5ldD4KKyAqIENvcHlyaWdodCAyMDE2IENyZXN0ZXogRGFuIExlb25hcmQgPGxlb25hcmQuY3Jlc3RlekBpbnRlbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHZlcnNpb24gMiBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4KKyAqIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBTSTExMzIgKDctYml0IEkyQyBzbGF2ZSBhZGRyZXNzIDB4NjApCisgKiBTSTExNDEvMi8zICg3LWJpdCBJMkMgc2xhdmUgYWRkcmVzcyAweDVhKQorICogU0kxMTQ1LzYvNiAoNy1iaXQgSTJDIHNsYXZlIGFkZHJlc3MgMHg2MCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorCisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC91dGlsX21hY3Jvcy5oPgorCisjZGVmaW5lIFNJMTE0NV9SRUdfUEFSVF9JRAkJMHgwMAorI2RlZmluZSBTSTExNDVfUkVHX1JFVl9JRAkJMHgwMQorI2RlZmluZSBTSTExNDVfUkVHX1NFUV9JRAkJMHgwMgorI2RlZmluZSBTSTExNDVfUkVHX0lOVF9DRkcJCTB4MDMKKyNkZWZpbmUgU0kxMTQ1X1JFR19JUlFfRU5BQkxFCQkweDA0CisjZGVmaW5lIFNJMTE0NV9SRUdfSVJRX01PREUJCTB4MDUKKyNkZWZpbmUgU0kxMTQ1X1JFR19IV19LRVkJCTB4MDcKKyNkZWZpbmUgU0kxMTQ1X1JFR19NRUFTX1JBVEUJCTB4MDgKKyNkZWZpbmUgU0kxMTQ1X1JFR19QU19MRUQyMQkJMHgwZgorI2RlZmluZSBTSTExNDVfUkVHX1BTX0xFRDMJCTB4MTAKKyNkZWZpbmUgU0kxMTQ1X1JFR19VQ09FRjEJCTB4MTMKKyNkZWZpbmUgU0kxMTQ1X1JFR19VQ09FRjIJCTB4MTQKKyNkZWZpbmUgU0kxMTQ1X1JFR19VQ09FRjMJCTB4MTUKKyNkZWZpbmUgU0kxMTQ1X1JFR19VQ09FRjQJCTB4MTYKKyNkZWZpbmUgU0kxMTQ1X1JFR19QQVJBTV9XUgkJMHgxNworI2RlZmluZSBTSTExNDVfUkVHX0NPTU1BTkQJCTB4MTgKKyNkZWZpbmUgU0kxMTQ1X1JFR19SRVNQT05TRQkJMHgyMAorI2RlZmluZSBTSTExNDVfUkVHX0lSUV9TVEFUVVMJCTB4MjEKKyNkZWZpbmUgU0kxMTQ1X1JFR19BTFNWSVNfREFUQQkJMHgyMgorI2RlZmluZSBTSTExNDVfUkVHX0FMU0lSX0RBVEEJCTB4MjQKKyNkZWZpbmUgU0kxMTQ1X1JFR19QUzFfREFUQQkJMHgyNgorI2RlZmluZSBTSTExNDVfUkVHX1BTMl9EQVRBCQkweDI4CisjZGVmaW5lIFNJMTE0NV9SRUdfUFMzX0RBVEEJCTB4MmEKKyNkZWZpbmUgU0kxMTQ1X1JFR19BVVhfREFUQQkJMHgyYworI2RlZmluZSBTSTExNDVfUkVHX1BBUkFNX1JECQkweDJlCisjZGVmaW5lIFNJMTE0NV9SRUdfQ0hJUF9TVEFUCQkweDMwCisKKyNkZWZpbmUgU0kxMTQ1X1VDT0VGMV9ERUZBVUxUCQkweDdiCisjZGVmaW5lIFNJMTE0NV9VQ09FRjJfREVGQVVMVAkJMHg2YgorI2RlZmluZSBTSTExNDVfVUNPRUYzX0RFRkFVTFQJCTB4MDEKKyNkZWZpbmUgU0kxMTQ1X1VDT0VGNF9ERUZBVUxUCQkweDAwCisKKy8qIEhlbHBlciB0byBmaWd1cmUgb3V0IFBTX0xFRCByZWdpc3RlciAvIHNoaWZ0IHBlciBjaGFubmVsICovCisjZGVmaW5lIFNJMTE0NV9QU19MRURfUkVHKGNoKSBcCisJKCgoY2gpID09IDIpID8gU0kxMTQ1X1JFR19QU19MRUQzIDogU0kxMTQ1X1JFR19QU19MRUQyMSkKKyNkZWZpbmUgU0kxMTQ1X1BTX0xFRF9TSElGVChjaCkgXAorCSgoKGNoKSA9PSAxKSA/IDQgOiAwKQorCisvKiBQYXJhbWV0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBTSTExNDVfUEFSQU1fQ0hMSVNUCQkweDAxCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9QU0xFRDEyX1NFTEVDVAkweDAyCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9QU0xFRDNfU0VMRUNUCTB4MDMKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX1BTX0VOQ09ESU5HCTB4MDUKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU19FTkNPRElORwkweDA2CisjZGVmaW5lIFNJMTE0NV9QQVJBTV9QUzFfQURDX01VWAkweDA3CisjZGVmaW5lIFNJMTE0NV9QQVJBTV9QUzJfQURDX01VWAkweDA4CisjZGVmaW5lIFNJMTE0NV9QQVJBTV9QUzNfQURDX01VWAkweDA5CisjZGVmaW5lIFNJMTE0NV9QQVJBTV9QU19BRENfQ09VTlRFUgkweDBhCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9QU19BRENfR0FJTgkweDBiCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9QU19BRENfTUlTQwkweDBjCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9BTFNfQURDX01VWAkweDBkCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9BTFNJUl9BRENfTVVYCTB4MGUKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FVWF9BRENfTVVYCTB4MGYKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfQ09VTlRFUgkweDEwCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9BTFNWSVNfQURDX0dBSU4JMHgxMQorI2RlZmluZSBTSTExNDVfUEFSQU1fQUxTVklTX0FEQ19NSVNDCTB4MTIKKyNkZWZpbmUgU0kxMTQ1X1BBUkFNX0xFRF9SRUNPVkVSWQkweDFjCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9BTFNJUl9BRENfQ09VTlRFUgkweDFkCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9BTFNJUl9BRENfR0FJTgkweDFlCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9BTFNJUl9BRENfTUlTQwkweDFmCisjZGVmaW5lIFNJMTE0NV9QQVJBTV9BRENfT0ZGU0VUCQkweDFhCisKKy8qIENoYW5uZWwgZW5hYmxlIG1hc2tzIGZvciBDSExJU1QgcGFyYW1ldGVyICovCisjZGVmaW5lIFNJMTE0NV9DSExJU1RfRU5fUFMxCQlCSVQoMCkKKyNkZWZpbmUgU0kxMTQ1X0NITElTVF9FTl9QUzIJCUJJVCgxKQorI2RlZmluZSBTSTExNDVfQ0hMSVNUX0VOX1BTMwkJQklUKDIpCisjZGVmaW5lIFNJMTE0NV9DSExJU1RfRU5fQUxTVklTCQlCSVQoNCkKKyNkZWZpbmUgU0kxMTQ1X0NITElTVF9FTl9BTFNJUgkJQklUKDUpCisjZGVmaW5lIFNJMTE0NV9DSExJU1RfRU5fQVVYCQlCSVQoNikKKyNkZWZpbmUgU0kxMTQ1X0NITElTVF9FTl9VVgkJQklUKDcpCisKKy8qIFByb3hpbWl0eSBtZWFzdXJlbWVudCBtb2RlIGZvciBBRENfTUlTQyBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0kxMTQ1X1BTX0FEQ19NT0RFX05PUk1BTAlCSVQoMikKKy8qIFNpZ25hbCByYW5nZSBtYXNrIGZvciBBRENfTUlTQyBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgU0kxMTQ1X0FEQ19NSVNDX1JBTkdFCQlCSVQoNSkKKworLyogQ29tbWFuZHMgZm9yIFJFR19DT01NQU5EICovCisjZGVmaW5lIFNJMTE0NV9DTURfTk9QCQkJMHgwMAorI2RlZmluZSBTSTExNDVfQ01EX1JFU0VUCQkweDAxCisjZGVmaW5lIFNJMTE0NV9DTURfUFNfRk9SQ0UJCTB4MDUKKyNkZWZpbmUgU0kxMTQ1X0NNRF9BTFNfRk9SQ0UJCTB4MDYKKyNkZWZpbmUgU0kxMTQ1X0NNRF9QU0FMU19GT1JDRQkJMHgwNworI2RlZmluZSBTSTExNDVfQ01EX1BTX1BBVVNFCQkweDA5CisjZGVmaW5lIFNJMTE0NV9DTURfQUxTX1BBVVNFCQkweDBhCisjZGVmaW5lIFNJMTE0NV9DTURfUFNBTFNfUEFVU0UJCTB4MGIKKyNkZWZpbmUgU0kxMTQ1X0NNRF9QU19BVVRPCQkweDBkCisjZGVmaW5lIFNJMTE0NV9DTURfQUxTX0FVVE8JCTB4MGUKKyNkZWZpbmUgU0kxMTQ1X0NNRF9QU0FMU19BVVRPCQkweDBmCisjZGVmaW5lIFNJMTE0NV9DTURfUEFSQU1fUVVFUlkJCTB4ODAKKyNkZWZpbmUgU0kxMTQ1X0NNRF9QQVJBTV9TRVQJCTB4YTAKKworI2RlZmluZSBTSTExNDVfUlNQX0lOVkFMSURfU0VUVElORwkweDgwCisjZGVmaW5lIFNJMTE0NV9SU1BfQ09VTlRFUl9NQVNLCQkweDBGCisKKy8qIE1pbmltdW0gc2xlZXAgYWZ0ZXIgZWFjaCBjb21tYW5kIHRvIGVuc3VyZSBpdCdzIHJlY2VpdmVkICovCisjZGVmaW5lIFNJMTE0NV9DT01NQU5EX01JTlNMRUVQX01TCTUKKy8qIFJldHVybiAtRVRJTUVET1VUIGFmdGVyIHRoaXMgbG9uZyAqLworI2RlZmluZSBTSTExNDVfQ09NTUFORF9USU1FT1VUX01TCTI1CisKKy8qIEludGVycnVwdCBjb25maWd1cmF0aW9uIG1hc2tzIGZvciBJTlRfQ0ZHIHJlZ2lzdGVyICovCisjZGVmaW5lIFNJMTE0NV9JTlRfQ0ZHX09FCQlCSVQoMCkgLyogZW5hYmxlIGludGVycnVwdCAqLworI2RlZmluZSBTSTExNDVfSU5UX0NGR19NT0RFCQlCSVQoMSkgLyogYXV0byByZXNldCBpbnRlcnJ1cHQgcGluICovCisKKy8qIEludGVycnVwdCBlbmFibGUgbWFza3MgZm9yIElSUV9FTkFCTEUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0kxMTQ1X01BU0tfQUxMX0lFCQkoQklUKDQpIHwgQklUKDMpIHwgQklUKDIpIHwgQklUKDApKQorCisjZGVmaW5lIFNJMTE0NV9NVVhfVEVNUAkJCTB4NjUKKyNkZWZpbmUgU0kxMTQ1X01VWF9WREQJCQkweDc1CisKKy8qIFByb3hpbWl0eSBMRUQgY3VycmVudDsgc2VlIFRhYmxlIDIgaW4gZGF0YXNoZWV0ICovCisjZGVmaW5lIFNJMTE0NV9MRURfQ1VSUkVOVF80NW1BCQkweDA0CisKK2VudW0geworCVNJMTEzMiwKKwlTSTExNDEsCisJU0kxMTQyLAorCVNJMTE0MywKKwlTSTExNDUsCisJU0kxMTQ2LAorCVNJMTE0NywKK307CisKK3N0cnVjdCBzaTExNDVfcGFydF9pbmZvIHsKKwl1OCBwYXJ0OworCWNvbnN0IHN0cnVjdCBpaW9faW5mbyAqaWlvX2luZm87CisJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzOworCXVuc2lnbmVkIGludCBudW1fY2hhbm5lbHM7CisJdW5zaWduZWQgaW50IG51bV9sZWRzOworCWJvb2wgdW5jb21wcmVzc2VkX21lYXNfcmF0ZTsKK307CisKKy8qKgorICogc3RydWN0IHNpMTE0NV9kYXRhIC0gc2kxMTQ1IGNoaXAgc3RhdGUgZGF0YQorICogQGNsaWVudDoJSTJDIGNsaWVudAorICogQGxvY2s6CW11dGV4IHRvIHByb3RlY3Qgc2hhcmVkIHN0YXRlLgorICogQGNtZGxvY2s6CUxvdy1sZXZlbCBtdXRleCB0byBwcm90ZWN0IGNvbW1hbmQgZXhlY3V0aW9uIG9ubHkKKyAqIEByc3Bfc2VxOglOZXh0IGV4cGVjdGVkIHJlc3BvbnNlIG51bWJlciBvciAtMSBpZiBjb3VudGVyIHJlc2V0IHJlcXVpcmVkCisgKiBAc2Nhbl9tYXNrOglTYXZlZCBzY2FuIG1hc2sgdG8gYXZvaWQgZHVwbGljYXRlIHNldF9jaGxpc3QKKyAqIEBhdXRvbm9tb3VzOiBJZiBhdXRvbWF0aWMgbWVhc3VyZW1lbnRzIGFyZSBhY3RpdmUgKGZvciBidWZmZXIgc3VwcG9ydCkKKyAqIEBwYXJ0X2luZm86CVBhcnQgaW5mb3JtYXRpb24KKyAqIEB0cmlnOglQb2ludGVyIHRvIGlpbyB0cmlnZ2VyCisgKiBAbWVhc19yYXRlOglWYWx1ZSBvZiBNRUFTX1JBVEUgcmVnaXN0ZXIuIE9ubHkgc2V0IGluIEhXIGluIGF1dG8gbW9kZQorICovCitzdHJ1Y3Qgc2kxMTQ1X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IG11dGV4IGNtZGxvY2s7CisJaW50IHJzcF9zZXE7CisJY29uc3Qgc3RydWN0IHNpMTE0NV9wYXJ0X2luZm8gKnBhcnRfaW5mbzsKKwl1bnNpZ25lZCBsb25nIHNjYW5fbWFzazsKKwlib29sIGF1dG9ub21vdXM7CisJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnOworCWludCBtZWFzX3JhdGU7Cit9OworCisvKioKKyAqIF9fc2kxMTQ1X2NvbW1hbmRfcmVzZXQoKSAtIFNlbmQgQ01EX05PUCBhbmQgd2FpdCBmb3IgcmVzcG9uc2UgMAorICoKKyAqIERvZXMgbm90IG1vZGlmeSBkYXRhLT5yc3Bfc2VxCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBfX3NpMTE0NV9jb21tYW5kX3Jlc2V0KHN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+Y2xpZW50LT5kZXY7CisJdW5zaWduZWQgbG9uZyBzdG9wX2ppZmZpZXM7CisJaW50IHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBTSTExNDVfUkVHX0NPTU1BTkQsCisJCQkJCQkgICAgICBTSTExNDVfQ01EX05PUCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJbXNsZWVwKFNJMTE0NV9DT01NQU5EX01JTlNMRUVQX01TKTsKKworCXN0b3BfamlmZmllcyA9IGppZmZpZXMgKyBTSTExNDVfQ09NTUFORF9USU1FT1VUX01TICogSFogLyAxMDAwOworCXdoaWxlICh0cnVlKSB7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJCSAgICAgICBTSTExNDVfUkVHX1JFU1BPTlNFKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RvcF9qaWZmaWVzKSkgeworCQkJZGV2X3dhcm4oZGV2LCAidGltZW91dCBvbiByZXNldFxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQltc2xlZXAoU0kxMTQ1X0NPTU1BTkRfTUlOU0xFRVBfTVMpOworCQljb250aW51ZTsKKwl9Cit9CisKKy8qKgorICogc2kxMTQ1X2NvbW1hbmQoKSAtIEV4ZWN1dGUgYSBjb21tYW5kIGFuZCBwb2xsIHRoZSByZXNwb25zZSByZWdpc3RlcgorICoKKyAqIEFsbCBjb252ZXJzaW9uIG92ZXJmbG93cyBhcmUgcmVwb3J0ZWQgYXMgLUVPVkVSRkxPVworICogSU5WQUxJRF9TRVRUSU5HIGlzIHJlcG9ydGVkIGFzIC1FSU5WQUwKKyAqIFRpbWVvdXRzIGFyZSByZXBvcnRlZCBhcyAtRVRJTUVET1VUCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgLWVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBzaTExNDVfY29tbWFuZChzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEsIHU4IGNtZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+Y2xpZW50LT5kZXY7CisJdW5zaWduZWQgbG9uZyBzdG9wX2ppZmZpZXM7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPmNtZGxvY2spOworCisJaWYgKGRhdGEtPnJzcF9zZXEgPCAwKSB7CisJCXJldCA9IF9fc2kxMTQ1X2NvbW1hbmRfcmVzZXQoZGF0YSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXNldCBjb21tYW5kIGNvdW50ZXIsIHJldD0lZFxuIiwKKwkJCQlyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZGF0YS0+cnNwX3NlcSA9IDA7CisJfQorCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFNJMTE0NV9SRUdfQ09NTUFORCwgY21kKTsKKwlpZiAocmV0KSB7CisJCWRldl93YXJuKGRldiwgImZhaWxlZCB0byB3cml0ZSBjb21tYW5kLCByZXQ9JWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKwkvKiBTbGVlcCBhIGxpdHRsZSB0byBlbnN1cmUgdGhlIGNvbW1hbmQgaXMgcmVjZWl2ZWQgKi8KKwltc2xlZXAoU0kxMTQ1X0NPTU1BTkRfTUlOU0xFRVBfTVMpOworCisJc3RvcF9qaWZmaWVzID0gamlmZmllcyArIFNJMTE0NV9DT01NQU5EX1RJTUVPVVRfTVMgKiBIWiAvIDEwMDA7CisJd2hpbGUgKHRydWUpIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJICAgICAgIFNJMTE0NV9SRUdfUkVTUE9OU0UpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X3dhcm4oZGV2LCAiZmFpbGVkIHRvIHJlYWQgcmVzcG9uc2UsIHJldD0lZFxuIiwgcmV0KTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChyZXQgJiB+U0kxMTQ1X1JTUF9DT1VOVEVSX01BU0spID09IDApIHsKKwkJCWlmIChyZXQgPT0gZGF0YS0+cnNwX3NlcSkgeworCQkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0b3BfamlmZmllcykpIHsKKwkJCQkJZGV2X3dhcm4oZGV2LCAidGltZW91dCBvbiBjb21tYW5kICUjMDJoaHhcbiIsCisJCQkJCQkgY21kKTsKKwkJCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW1zbGVlcChTSTExNDVfQ09NTUFORF9NSU5TTEVFUF9NUyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAocmV0ID09ICgoZGF0YS0+cnNwX3NlcSArIDEpICYKKwkJCQlTSTExNDVfUlNQX0NPVU5URVJfTUFTSykpIHsKKwkJCQlkYXRhLT5yc3Bfc2VxID0gcmV0OworCQkJCXJldCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkZXZfd2FybihkZXYsICJ1bmV4cGVjdGVkIHJlc3BvbnNlIGNvdW50ZXIgJWQgaW5zdGVhZCBvZiAlZFxuIiwKKwkJCQkgcmV0LCAoZGF0YS0+cnNwX3NlcSArIDEpICYKKwkJCQkJU0kxMTQ1X1JTUF9DT1VOVEVSX01BU0spOworCQkJcmV0ID0gLUVJTzsKKwkJfSBlbHNlIHsKKwkJCWlmIChyZXQgPT0gU0kxMTQ1X1JTUF9JTlZBTElEX1NFVFRJTkcpIHsKKwkJCQlkZXZfd2FybihkZXYsICJJTlZBTElEX1NFVFRJTkcgZXJyb3Igb24gY29tbWFuZCAlIzAyaGh4XG4iLAorCQkJCQkgY21kKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJfSBlbHNlIHsKKwkJCQkvKiBBbGwgb3ZlcmZsb3dzIGFyZSB0cmVhdGVkIGlkZW50aWNhbGx5ICovCisJCQkJZGV2X2RiZyhkZXYsICJvdmVyZmxvdywgcmV0PSVkLCBjbWQ9JSMwMmhoeFxuIiwKKwkJCQkJcmV0LCBjbWQpOworCQkJCXJldCA9IC1FT1ZFUkZMT1c7CisJCQl9CisJCX0KKworCQkvKiBGb3JjZSBhIGNvdW50ZXIgcmVzZXQgbmV4dCB0aW1lICovCisJCWRhdGEtPnJzcF9zZXEgPSAtMTsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5jbWRsb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2kxMTQ1X3BhcmFtX3VwZGF0ZShzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEsIHU4IG9wLCB1OCBwYXJhbSwKKwkJCSAgICAgICB1OCB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCVNJMTE0NV9SRUdfUEFSQU1fV1IsIHZhbHVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzaTExNDVfY29tbWFuZChkYXRhLCBvcCB8IChwYXJhbSAmIDB4MUYpKTsKK30KKworc3RhdGljIGludCBzaTExNDVfcGFyYW1fc2V0KHN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSwgdTggcGFyYW0sIHU4IHZhbHVlKQoreworCXJldHVybiBzaTExNDVfcGFyYW1fdXBkYXRlKGRhdGEsIFNJMTE0NV9DTURfUEFSQU1fU0VULCBwYXJhbSwgdmFsdWUpOworfQorCisvKiBTZXQgcGFyYW0uIFJldHVybnMgbmVnYXRpdmUgZXJybm8gb3IgY3VycmVudCB2YWx1ZSAqLworc3RhdGljIGludCBzaTExNDVfcGFyYW1fcXVlcnkoc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhLCB1OCBwYXJhbSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc2kxMTQ1X2NvbW1hbmQoZGF0YSwgU0kxMTQ1X0NNRF9QQVJBTV9RVUVSWSB8IChwYXJhbSAmIDB4MUYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBTSTExNDVfUkVHX1BBUkFNX1JEKTsKK30KKworLyogRXhwYW5kIDggYml0IGNvbXByZXNzZWQgdmFsdWUgdG8gMTYgYml0LCBzZWUgU2lsYWJzIEFONDk4ICovCitzdGF0aWMgdTE2IHNpMTE0NV91bmNvbXByZXNzKHU4IHgpCit7CisJdTE2IHJlc3VsdCA9IDA7CisJdTggZXhwb25lbnQgPSAwOworCisJaWYgKHggPCA4KQorCQlyZXR1cm4gMDsKKworCWV4cG9uZW50ID0gKHggJiAweGYwKSA+PiA0OworCXJlc3VsdCA9IDB4MTAgfCAoeCAmIDB4MGYpOworCisJaWYgKGV4cG9uZW50ID49IDQpCisJCXJldHVybiByZXN1bHQgPDwgKGV4cG9uZW50IC0gNCk7CisJcmV0dXJuIHJlc3VsdCA+PiAoNCAtIGV4cG9uZW50KTsKK30KKworLyogQ29tcHJlc3MgMTYgYml0IHZhbHVlIHRvIDggYml0LCBzZWUgU2lsYWJzIEFONDk4ICovCitzdGF0aWMgdTggc2kxMTQ1X2NvbXByZXNzKHUxNiB4KQoreworCXUzMiBleHBvbmVudCA9IDA7CisJdTMyIHNpZ25pZmljYW5kID0gMDsKKwl1MzIgdG1wID0geDsKKworCWlmICh4ID09IDB4MDAwMCkKKwkJcmV0dXJuIDB4MDA7CisJaWYgKHggPT0gMHgwMDAxKQorCQlyZXR1cm4gMHgwODsKKworCXdoaWxlICgxKSB7CisJCXRtcCA+Pj0gMTsKKwkJZXhwb25lbnQgKz0gMTsKKwkJaWYgKHRtcCA9PSAxKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGV4cG9uZW50IDwgNSkgeworCQlzaWduaWZpY2FuZCA9IHggPDwgKDQgLSBleHBvbmVudCk7CisJCXJldHVybiAoZXhwb25lbnQgPDwgNCkgfCAoc2lnbmlmaWNhbmQgJiAweEYpOworCX0KKworCXNpZ25pZmljYW5kID0geCA+PiAoZXhwb25lbnQgLSA1KTsKKwlpZiAoc2lnbmlmaWNhbmQgJiAxKSB7CisJCXNpZ25pZmljYW5kICs9IDI7CisJCWlmIChzaWduaWZpY2FuZCAmIDB4MDA0MCkgeworCQkJZXhwb25lbnQgKz0gMTsKKwkJCXNpZ25pZmljYW5kID4+PSAxOworCQl9CisJfQorCisJcmV0dXJuIChleHBvbmVudCA8PCA0KSB8ICgoc2lnbmlmaWNhbmQgPj4gMSkgJiAweEYpOworfQorCisvKiBXcml0ZSBtZWFzX3JhdGUgaW4gaGFyZHdhcmUgKi8KK3N0YXRpYyBpbnQgc2kxMTQ1X3NldF9tZWFzX3JhdGUoc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhLCBpbnQgaW50ZXJ2YWwpCit7CisJaWYgKGRhdGEtPnBhcnRfaW5mby0+dW5jb21wcmVzc2VkX21lYXNfcmF0ZSkKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJU0kxMTQ1X1JFR19NRUFTX1JBVEUsIGludGVydmFsKTsKKwllbHNlCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCVNJMTE0NV9SRUdfTUVBU19SQVRFLCBpbnRlcnZhbCk7Cit9CisKK3N0YXRpYyBpbnQgc2kxMTQ1X3JlYWRfc2FtcF9mcmVxKHN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSwgaW50ICp2YWwsIGludCAqdmFsMikKK3sKKwkqdmFsID0gMzIwMDA7CisJaWYgKGRhdGEtPnBhcnRfaW5mby0+dW5jb21wcmVzc2VkX21lYXNfcmF0ZSkKKwkJKnZhbDIgPSBkYXRhLT5tZWFzX3JhdGU7CisJZWxzZQorCQkqdmFsMiA9IHNpMTE0NV91bmNvbXByZXNzKGRhdGEtPm1lYXNfcmF0ZSk7CisJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTDsKK30KKworLyogU2V0IHRoZSBzYW1wIGZyZXEgaW4gZHJpdmVyIHByaXZhdGUgZGF0YSAqLworc3RhdGljIGludCBzaTExNDVfc3RvcmVfc2FtcF9mcmVxKHN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSwgaW50IHZhbCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbWVhc19yYXRlOworCisJaWYgKHZhbCA8PSAwIHx8IHZhbCA+IDMyMDAwKQorCQlyZXR1cm4gLUVSQU5HRTsKKwltZWFzX3JhdGUgPSAzMjAwMCAvIHZhbDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCWlmIChkYXRhLT5hdXRvbm9tb3VzKSB7CisJCXJldCA9IHNpMTE0NV9zZXRfbWVhc19yYXRlKGRhdGEsIG1lYXNfcmF0ZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKGRhdGEtPnBhcnRfaW5mby0+dW5jb21wcmVzc2VkX21lYXNfcmF0ZSkKKwkJZGF0YS0+bWVhc19yYXRlID0gbWVhc19yYXRlOworCWVsc2UKKwkJZGF0YS0+bWVhc19yYXRlID0gc2kxMTQ1X2NvbXByZXNzKG1lYXNfcmF0ZSk7CisKK291dDoKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNpMTE0NV90cmlnZ2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwcml2YXRlOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OworCXN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJLyoKKwkgKiBNYXhpbXVtIGJ1ZmZlciBzaXplOgorCSAqICAgNioyIGJ5dGVzIGNoYW5uZWxzIGRhdGEgKyA0IGJ5dGVzIGFsaWdubWVudCArCisJICogICA4IGJ5dGVzIHRpbWVzdGFtcAorCSAqLworCXU4IGJ1ZmZlclsyNF07CisJaW50IGksIGogPSAwOworCWludCByZXQ7CisJdTggaXJxX3N0YXR1cyA9IDA7CisKKwlpZiAoIWRhdGEtPmF1dG9ub21vdXMpIHsKKwkJcmV0ID0gc2kxMTQ1X2NvbW1hbmQoZGF0YSwgU0kxMTQ1X0NNRF9QU0FMU19GT1JDRSk7CisJCWlmIChyZXQgPCAwICYmIHJldCAhPSAtRU9WRVJGTE9XKQorCQkJZ290byBkb25lOworCX0gZWxzZSB7CisJCWlycV9zdGF0dXMgPSByZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9SRUdfSVJRX1NUQVRVUyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCQlpZiAoIShpcnFfc3RhdHVzICYgU0kxMTQ1X01BU0tfQUxMX0lFKSkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwlmb3JfZWFjaF9zZXRfYml0KGksIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaywKKwkJaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKSB7CisJCWludCBydW4gPSAxOworCisJCXdoaWxlIChpICsgcnVuIDwgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKSB7CisJCQlpZiAoIXRlc3RfYml0KGkgKyBydW4sIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykpCisJCQkJYnJlYWs7CisJCQlpZiAoaW5kaW9fZGV2LT5jaGFubmVsc1tpICsgcnVuXS5hZGRyZXNzICE9CisJCQkJaW5kaW9fZGV2LT5jaGFubmVsc1tpXS5hZGRyZXNzICsgMiAqIHJ1bikKKwkJCQlicmVhazsKKwkJCXJ1bisrOworCQl9CisKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGFfb3JfZW11bGF0ZWQoCisJCQkJZGF0YS0+Y2xpZW50LCBpbmRpb19kZXYtPmNoYW5uZWxzW2ldLmFkZHJlc3MsCisJCQkJc2l6ZW9mKHUxNikgKiBydW4sICZidWZmZXJbal0pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKwkJaiArPSBydW4gKiBzaXplb2YodTE2KTsKKwkJaSArPSBydW4gLSAxOworCX0KKworCWlmIChkYXRhLT5hdXRvbm9tb3VzKSB7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9SRUdfSVJRX1NUQVRVUywKKwkJCQlpcnFfc3RhdHVzICYgU0kxMTQ1X01BU0tfQUxMX0lFKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGRvbmU7CisJfQorCisJaWlvX3B1c2hfdG9fYnVmZmVyc193aXRoX3RpbWVzdGFtcChpbmRpb19kZXYsIGJ1ZmZlciwKKwkJaWlvX2dldF90aW1lX25zKGluZGlvX2RldikpOworCitkb25lOgorCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHNpMTE0NV9zZXRfY2hsaXN0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHVuc2lnbmVkIGxvbmcgc2Nhbl9tYXNrKQoreworCXN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdTggcmVnID0gMCwgbXV4OworCWludCByZXQ7CisJaW50IGk7CisKKwkvKiBjaGFubmVsIGxpc3QgYWxyZWFkeSBzZXQsIG5vIG5lZWQgdG8gcmVwcm9ncmFtICovCisJaWYgKGRhdGEtPnNjYW5fbWFzayA9PSBzY2FuX21hc2spCisJCXJldHVybiAwOworCisJZm9yX2VhY2hfc2V0X2JpdChpLCAmc2Nhbl9tYXNrLCBpbmRpb19kZXYtPm1hc2tsZW5ndGgpIHsKKwkJc3dpdGNoIChpbmRpb19kZXYtPmNoYW5uZWxzW2ldLmFkZHJlc3MpIHsKKwkJY2FzZSBTSTExNDVfUkVHX0FMU1ZJU19EQVRBOgorCQkJcmVnIHw9IFNJMTE0NV9DSExJU1RfRU5fQUxTVklTOworCQkJYnJlYWs7CisJCWNhc2UgU0kxMTQ1X1JFR19BTFNJUl9EQVRBOgorCQkJcmVnIHw9IFNJMTE0NV9DSExJU1RfRU5fQUxTSVI7CisJCQlicmVhazsKKwkJY2FzZSBTSTExNDVfUkVHX1BTMV9EQVRBOgorCQkJcmVnIHw9IFNJMTE0NV9DSExJU1RfRU5fUFMxOworCQkJYnJlYWs7CisJCWNhc2UgU0kxMTQ1X1JFR19QUzJfREFUQToKKwkJCXJlZyB8PSBTSTExNDVfQ0hMSVNUX0VOX1BTMjsKKwkJCWJyZWFrOworCQljYXNlIFNJMTE0NV9SRUdfUFMzX0RBVEE6CisJCQlyZWcgfD0gU0kxMTQ1X0NITElTVF9FTl9QUzM7CisJCQlicmVhazsKKwkJY2FzZSBTSTExNDVfUkVHX0FVWF9EQVRBOgorCQkJc3dpdGNoIChpbmRpb19kZXYtPmNoYW5uZWxzW2ldLnR5cGUpIHsKKwkJCWNhc2UgSUlPX1VWSU5ERVg6CisJCQkJcmVnIHw9IFNJMTE0NV9DSExJU1RfRU5fVVY7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJlZyB8PSBTSTExNDVfQ0hMSVNUX0VOX0FVWDsKKwkJCQlpZiAoaW5kaW9fZGV2LT5jaGFubmVsc1tpXS50eXBlID09IElJT19URU1QKQorCQkJCQltdXggPSBTSTExNDVfTVVYX1RFTVA7CisJCQkJZWxzZQorCQkJCQltdXggPSBTSTExNDVfTVVYX1ZERDsKKwkJCQlyZXQgPSBzaTExNDVfcGFyYW1fc2V0KGRhdGEsCisJCQkJCVNJMTE0NV9QQVJBTV9BVVhfQURDX01VWCwgbXV4KTsKKwkJCQlpZiAocmV0IDwgMCkKKwkJCQkJcmV0dXJuIHJldDsKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZGF0YS0+c2Nhbl9tYXNrID0gc2Nhbl9tYXNrOworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX0NITElTVCwgcmVnKTsKKworCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKK30KKworc3RhdGljIGludCBzaTExNDVfbWVhc3VyZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbikKK3sKKwlzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXU4IGNtZDsKKwlpbnQgcmV0OworCisJcmV0ID0gc2kxMTQ1X3NldF9jaGxpc3QoaW5kaW9fZGV2LCBCSVQoY2hhbi0+c2Nhbl9pbmRleCkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJY21kID0gKGNoYW4tPnR5cGUgPT0gSUlPX1BST1hJTUlUWSkgPyBTSTExNDVfQ01EX1BTX0ZPUkNFIDoKKwkJU0kxMTQ1X0NNRF9BTFNfRk9SQ0U7CisJcmV0ID0gc2kxMTQ1X2NvbW1hbmQoZGF0YSwgY21kKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVPVkVSRkxPVykKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoZGF0YS0+Y2xpZW50LCBjaGFuLT5hZGRyZXNzKTsKK30KKworLyoKKyAqIENvbnZlcnNpb24gYmV0d2VlbiBpaW8gc2NhbGUgYW5kIEFEQ19HQUlOIHZhbHVlcworICogVGhlc2UgY291bGQgYmUgZnVydGhlciBhZGp1c3RlZCBidXQgcHJveGltaXR5L2ludGVuc2l0eSBhcmUgZGltZW5zaW9ubGVzcworICovCitzdGF0aWMgY29uc3QgaW50IHNpMTE0NV9wcm94aW1pdHlfc2NhbGVfYXZhaWxhYmxlW10gPSB7CisJMTI4LCA2NCwgMzIsIDE2LCA4LCA0fTsKK3N0YXRpYyBjb25zdCBpbnQgc2kxMTQ1X2ludGVuc2l0eV9zY2FsZV9hdmFpbGFibGVbXSA9IHsKKwkxMjgsIDY0LCAzMiwgMTYsIDgsIDQsIDIsIDF9Oworc3RhdGljIElJT19DT05TVF9BVFRSKGluX3Byb3hpbWl0eV9zY2FsZV9hdmFpbGFibGUsCisJIjEyOCA2NCAzMiAxNiA4IDQiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbl9pbnRlbnNpdHlfc2NhbGVfYXZhaWxhYmxlLAorCSIxMjggNjQgMzIgMTYgOCA0IDIgMSIpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluX2ludGVuc2l0eV9pcl9zY2FsZV9hdmFpbGFibGUsCisJIjEyOCA2NCAzMiAxNiA4IDQgMiAxIik7CisKK3N0YXRpYyBpbnQgc2kxMTQ1X3NjYWxlX2Zyb21fYWRjZ2FpbihpbnQgcmVndmFsKQoreworCXJldHVybiAxMjggPj4gcmVndmFsOworfQorCitzdGF0aWMgaW50IHNpMTE0NV9wcm94aW1pdHlfYWRjZ2Fpbl9mcm9tX3NjYWxlKGludCB2YWwsIGludCB2YWwyKQoreworCXZhbCA9IGZpbmRfY2xvc2VzdF9kZXNjZW5kaW5nKHZhbCwgc2kxMTQ1X3Byb3hpbWl0eV9zY2FsZV9hdmFpbGFibGUsCisJCQkJQVJSQVlfU0laRShzaTExNDVfcHJveGltaXR5X3NjYWxlX2F2YWlsYWJsZSkpOworCWlmICh2YWwgPCAwIHx8IHZhbCA+IDUgfHwgdmFsMiAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2kxMTQ1X2ludGVuc2l0eV9hZGNnYWluX2Zyb21fc2NhbGUoaW50IHZhbCwgaW50IHZhbDIpCit7CisJdmFsID0gZmluZF9jbG9zZXN0X2Rlc2NlbmRpbmcodmFsLCBzaTExNDVfaW50ZW5zaXR5X3NjYWxlX2F2YWlsYWJsZSwKKwkJCQlBUlJBWV9TSVpFKHNpMTE0NV9pbnRlbnNpdHlfc2NhbGVfYXZhaWxhYmxlKSk7CisJaWYgKHZhbCA8IDAgfHwgdmFsID4gNyB8fCB2YWwyICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBzaTExNDVfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCQlpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCXU4IHJlZzsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19JTlRFTlNJVFk6CisJCWNhc2UgSUlPX1BST1hJTUlUWToKKwkJY2FzZSBJSU9fVk9MVEFHRToKKwkJY2FzZSBJSU9fVEVNUDoKKwkJY2FzZSBJSU9fVVZJTkRFWDoKKwkJCXJldCA9IGlpb19kZXZpY2VfY2xhaW1fZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJCXJldCA9IHNpMTE0NV9tZWFzdXJlKGluZGlvX2RldiwgY2hhbik7CisJCQlpaW9fZGV2aWNlX3JlbGVhc2VfZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKworCQkJKnZhbCA9IHJldDsKKworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQljYXNlIElJT19DVVJSRU5UOgorCQkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQlTSTExNDVfUFNfTEVEX1JFRyhjaGFuLT5jaGFubmVsKSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQkqdmFsID0gKHJldCA+PiBTSTExNDVfUFNfTEVEX1NISUZUKGNoYW4tPmNoYW5uZWwpKQorCQkJCSYgMHgwZjsKKworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19QUk9YSU1JVFk6CisJCQlyZWcgPSBTSTExNDVfUEFSQU1fUFNfQURDX0dBSU47CisJCQlicmVhazsKKwkJY2FzZSBJSU9fSU5URU5TSVRZOgorCQkJaWYgKGNoYW4tPmNoYW5uZWwyID09IElJT19NT0RfTElHSFRfSVIpCisJCQkJcmVnID0gU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19HQUlOOworCQkJZWxzZQorCQkJCXJlZyA9IFNJMTE0NV9QQVJBTV9BTFNWSVNfQURDX0dBSU47CisJCQlicmVhazsKKwkJY2FzZSBJSU9fVEVNUDoKKwkJCSp2YWwgPSAyODsKKwkJCSp2YWwyID0gNTcxNDI5OworCQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCWNhc2UgSUlPX1VWSU5ERVg6CisJCQkqdmFsID0gMDsKKwkJCSp2YWwyID0gMTAwMDA7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcmV0ID0gc2kxMTQ1X3BhcmFtX3F1ZXJ5KGRhdGEsIHJlZyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQkqdmFsID0gc2kxMTQ1X3NjYWxlX2Zyb21fYWRjZ2FpbihyZXQgJiAweDA3KTsKKworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX1RFTVA6CisJCQkvKgorCQkJICogLUFEQyBvZmZzZXQgLSBBREMgY291bnRzIEAgMjXCsEMgLQorCQkJICogICAzNSAqIEFEQyBjb3VudHMgLyDCsEMKKwkJCSAqLworCQkJKnZhbCA9IC0yNTYgLSAxMTEzNiArIDI1ICogMzU7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogQWxsIEFEQyBtZWFzdXJlbWVudHMgaGF2ZSBhcmUgYnkgZGVmYXVsdCBvZmZzZXQKKwkJCSAqIGJ5IC0yNTYKKwkJCSAqIFNlZSBBTjQ5OCA1LjYuMworCQkJICovCisJCQlyZXQgPSBzaTExNDVfcGFyYW1fcXVlcnkoZGF0YSwgU0kxMTQ1X1BBUkFNX0FEQ19PRkZTRVQpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCSp2YWwgPSAtc2kxMTQ1X3VuY29tcHJlc3MocmV0KTsKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJfQorCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCXJldHVybiBzaTExNDVfcmVhZF9zYW1wX2ZyZXEoZGF0YSwgdmFsLCB2YWwyKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2kxMTQ1X3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgICAgIGludCB2YWwsIGludCB2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1OCByZWcxLCByZWcyLCBzaGlmdDsKKwlpbnQgcmV0OworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fUFJPWElNSVRZOgorCQkJdmFsID0gc2kxMTQ1X3Byb3hpbWl0eV9hZGNnYWluX2Zyb21fc2NhbGUodmFsLCB2YWwyKTsKKwkJCWlmICh2YWwgPCAwKQorCQkJCXJldHVybiB2YWw7CisJCQlyZWcxID0gU0kxMTQ1X1BBUkFNX1BTX0FEQ19HQUlOOworCQkJcmVnMiA9IFNJMTE0NV9QQVJBTV9QU19BRENfQ09VTlRFUjsKKwkJCWJyZWFrOworCQljYXNlIElJT19JTlRFTlNJVFk6CisJCQl2YWwgPSBzaTExNDVfaW50ZW5zaXR5X2FkY2dhaW5fZnJvbV9zY2FsZSh2YWwsIHZhbDIpOworCQkJaWYgKHZhbCA8IDApCisJCQkJcmV0dXJuIHZhbDsKKwkJCWlmIChjaGFuLT5jaGFubmVsMiA9PSBJSU9fTU9EX0xJR0hUX0lSKSB7CisJCQkJcmVnMSA9IFNJMTE0NV9QQVJBTV9BTFNJUl9BRENfR0FJTjsKKwkJCQlyZWcyID0gU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19DT1VOVEVSOworCQkJfSBlbHNlIHsKKwkJCQlyZWcxID0gU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfR0FJTjsKKwkJCQlyZWcyID0gU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfQ09VTlRFUjsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXQgPSBpaW9fZGV2aWNlX2NsYWltX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgcmVnMSwgdmFsKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQkvKiBTZXQgcmVjb3ZlcnkgcGVyaW9kIHRvIG9uZSdzIGNvbXBsZW1lbnQgb2YgZ2FpbiAqLworCQlyZXQgPSBzaTExNDVfcGFyYW1fc2V0KGRhdGEsIHJlZzIsICh+dmFsICYgMHgwNykgPDwgNCk7CisJCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQlyZXR1cm4gcmV0OworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCWlmIChjaGFuLT50eXBlICE9IElJT19DVVJSRU5UKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMTUgfHwgdmFsMiAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmVnMSA9IFNJMTE0NV9QU19MRURfUkVHKGNoYW4tPmNoYW5uZWwpOworCQlzaGlmdCA9IFNJMTE0NV9QU19MRURfU0hJRlQoY2hhbi0+Y2hhbm5lbCk7CisKKwkJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCByZWcxKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgcmVnMSwKKwkJCShyZXQgJiB+KDB4MGYgPDwgc2hpZnQpKSB8CisJCQkoKHZhbCAmIDB4MGYpIDw8IHNoaWZ0KSk7CisJCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQlyZXR1cm4gcmV0OworCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CisJCXJldHVybiBzaTExNDVfc3RvcmVfc2FtcF9mcmVxKGRhdGEsIHZhbCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisjZGVmaW5lIFNJMTE0NV9TVCB7IFwKKwkuc2lnbiA9ICd1JywgXAorCS5yZWFsYml0cyA9IDE2LCBcCisJLnN0b3JhZ2ViaXRzID0gMTYsIFwKKwkuZW5kaWFubmVzcyA9IElJT19MRSwgXAorfQorCisjZGVmaW5lIFNJMTE0NV9JTlRFTlNJVFlfQ0hBTk5FTChfc2kpIHsgXAorCS50eXBlID0gSUlPX0lOVEVOU0lUWSwgXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgXAorCQkJICAgICAgQklUKElJT19DSEFOX0lORk9fT0ZGU0VUKSB8IFwKKwkJCSAgICAgIEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X2FsbCA9IEJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSksIFwKKwkuc2Nhbl90eXBlID0gU0kxMTQ1X1NULCBcCisJLnNjYW5faW5kZXggPSBfc2ksIFwKKwkuYWRkcmVzcyA9IFNJMTE0NV9SRUdfQUxTVklTX0RBVEEsIFwKK30KKworI2RlZmluZSBTSTExNDVfSU5URU5TSVRZX0lSX0NIQU5ORUwoX3NpKSB7IFwKKwkudHlwZSA9IElJT19JTlRFTlNJVFksIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8IFwKKwkJCSAgICAgIEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCkgfCBcCisJCQkgICAgICBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSksIFwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgPSBCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpLCBcCisJLm1vZGlmaWVkID0gMSwgXAorCS5jaGFubmVsMiA9IElJT19NT0RfTElHSFRfSVIsIFwKKwkuc2Nhbl90eXBlID0gU0kxMTQ1X1NULCBcCisJLnNjYW5faW5kZXggPSBfc2ksIFwKKwkuYWRkcmVzcyA9IFNJMTE0NV9SRUdfQUxTSVJfREFUQSwgXAorfQorCisjZGVmaW5lIFNJMTE0NV9URU1QX0NIQU5ORUwoX3NpKSB7IFwKKwkudHlwZSA9IElJT19URU1QLCBcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVykgfCBcCisJCQkgICAgICBCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpIHwgXAorCQkJICAgICAgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwgXAorCS5zY2FuX3R5cGUgPSBTSTExNDVfU1QsIFwKKwkuc2Nhbl9pbmRleCA9IF9zaSwgXAorCS5hZGRyZXNzID0gU0kxMTQ1X1JFR19BVVhfREFUQSwgXAorfQorCisjZGVmaW5lIFNJMTE0NV9VVl9DSEFOTkVMKF9zaSkgeyBcCisJLnR5cGUgPSBJSU9fVVZJTkRFWCwgXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgXAorCQkJICAgICAgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwgXAorCS5zY2FuX3R5cGUgPSBTSTExNDVfU1QsIFwKKwkuc2Nhbl9pbmRleCA9IF9zaSwgXAorCS5hZGRyZXNzID0gU0kxMTQ1X1JFR19BVVhfREFUQSwgXAorfQorCisjZGVmaW5lIFNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTChfc2ksIF9jaCkgeyBcCisJLnR5cGUgPSBJSU9fUFJPWElNSVRZLCBcCisJLmluZGV4ZWQgPSAxLCBcCisJLmNoYW5uZWwgPSBfY2gsIFwKKwkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwgXAorCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19TQ0FMRSkgfCBcCisJCQkJICAgIEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCksIFwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgPSBCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpLCBcCisJLnNjYW5fdHlwZSA9IFNJMTE0NV9TVCwgXAorCS5zY2FuX2luZGV4ID0gX3NpLCBcCisJLmFkZHJlc3MgPSBTSTExNDVfUkVHX1BTMV9EQVRBICsgX2NoICogMiwgXAorfQorCisjZGVmaW5lIFNJMTE0NV9WT0xUQUdFX0NIQU5ORUwoX3NpKSB7IFwKKwkudHlwZSA9IElJT19WT0xUQUdFLCBcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksIFwKKwkuaW5mb19tYXNrX3NoYXJlZF9ieV9hbGwgPSBCSVQoSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpLCBcCisJLnNjYW5fdHlwZSA9IFNJMTE0NV9TVCwgXAorCS5zY2FuX2luZGV4ID0gX3NpLCBcCisJLmFkZHJlc3MgPSBTSTExNDVfUkVHX0FVWF9EQVRBLCBcCit9CisKKyNkZWZpbmUgU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTChfY2gpIHsgXAorCS50eXBlID0gSUlPX0NVUlJFTlQsIFwKKwkuaW5kZXhlZCA9IDEsIFwKKwkuY2hhbm5lbCA9IF9jaCwgXAorCS5vdXRwdXQgPSAxLCBcCisJLnNjYW5faW5kZXggPSAtMSwgXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLCBcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzaTExMzJfY2hhbm5lbHNbXSA9IHsKKwlTSTExNDVfSU5URU5TSVRZX0NIQU5ORUwoMCksCisJU0kxMTQ1X0lOVEVOU0lUWV9JUl9DSEFOTkVMKDEpLAorCVNJMTE0NV9URU1QX0NIQU5ORUwoMiksCisJU0kxMTQ1X1ZPTFRBR0VfQ0hBTk5FTCgzKSwKKwlTSTExNDVfVVZfQ0hBTk5FTCg0KSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg2KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzaTExNDFfY2hhbm5lbHNbXSA9IHsKKwlTSTExNDVfSU5URU5TSVRZX0NIQU5ORUwoMCksCisJU0kxMTQ1X0lOVEVOU0lUWV9JUl9DSEFOTkVMKDEpLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCgyLCAwKSwKKwlTSTExNDVfVEVNUF9DSEFOTkVMKDMpLAorCVNJMTE0NV9WT0xUQUdFX0NIQU5ORUwoNCksCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNSksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzaTExNDJfY2hhbm5lbHNbXSA9IHsKKwlTSTExNDVfSU5URU5TSVRZX0NIQU5ORUwoMCksCisJU0kxMTQ1X0lOVEVOU0lUWV9JUl9DSEFOTkVMKDEpLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCgyLCAwKSwKKwlTSTExNDVfUFJPWElNSVRZX0NIQU5ORUwoMywgMSksCisJU0kxMTQ1X1RFTVBfQ0hBTk5FTCg0KSwKKwlTSTExNDVfVk9MVEFHRV9DSEFOTkVMKDUpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDYpLAorCVNJMTE0NV9DVVJSRU5UX0NIQU5ORUwoMCksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzaTExNDNfY2hhbm5lbHNbXSA9IHsKKwlTSTExNDVfSU5URU5TSVRZX0NIQU5ORUwoMCksCisJU0kxMTQ1X0lOVEVOU0lUWV9JUl9DSEFOTkVMKDEpLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCgyLCAwKSwKKwlTSTExNDVfUFJPWElNSVRZX0NIQU5ORUwoMywgMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDQsIDIpLAorCVNJMTE0NV9URU1QX0NIQU5ORUwoNSksCisJU0kxMTQ1X1ZPTFRBR0VfQ0hBTk5FTCg2KSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg3KSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDApLAorCVNJMTE0NV9DVVJSRU5UX0NIQU5ORUwoMSksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzaTExNDVfY2hhbm5lbHNbXSA9IHsKKwlTSTExNDVfSU5URU5TSVRZX0NIQU5ORUwoMCksCisJU0kxMTQ1X0lOVEVOU0lUWV9JUl9DSEFOTkVMKDEpLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCgyLCAwKSwKKwlTSTExNDVfVEVNUF9DSEFOTkVMKDMpLAorCVNJMTE0NV9WT0xUQUdFX0NIQU5ORUwoNCksCisJU0kxMTQ1X1VWX0NIQU5ORUwoNSksCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNiksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzaTExNDZfY2hhbm5lbHNbXSA9IHsKKwlTSTExNDVfSU5URU5TSVRZX0NIQU5ORUwoMCksCisJU0kxMTQ1X0lOVEVOU0lUWV9JUl9DSEFOTkVMKDEpLAorCVNJMTE0NV9URU1QX0NIQU5ORUwoMiksCisJU0kxMTQ1X1ZPTFRBR0VfQ0hBTk5FTCgzKSwKKwlTSTExNDVfVVZfQ0hBTk5FTCg0KSwKKwlTSTExNDVfUFJPWElNSVRZX0NIQU5ORUwoNSwgMCksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDYsIDEpLAorCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDcpLAorCVNJMTE0NV9DVVJSRU5UX0NIQU5ORUwoMCksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzaTExNDdfY2hhbm5lbHNbXSA9IHsKKwlTSTExNDVfSU5URU5TSVRZX0NIQU5ORUwoMCksCisJU0kxMTQ1X0lOVEVOU0lUWV9JUl9DSEFOTkVMKDEpLAorCVNJMTE0NV9QUk9YSU1JVFlfQ0hBTk5FTCgyLCAwKSwKKwlTSTExNDVfUFJPWElNSVRZX0NIQU5ORUwoMywgMSksCisJU0kxMTQ1X1BST1hJTUlUWV9DSEFOTkVMKDQsIDIpLAorCVNJMTE0NV9URU1QX0NIQU5ORUwoNSksCisJU0kxMTQ1X1ZPTFRBR0VfQ0hBTk5FTCg2KSwKKwlTSTExNDVfVVZfQ0hBTk5FTCg3KSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg4KSwKKwlTSTExNDVfQ1VSUkVOVF9DSEFOTkVMKDApLAorCVNJMTE0NV9DVVJSRU5UX0NIQU5ORUwoMSksCisJU0kxMTQ1X0NVUlJFTlRfQ0hBTk5FTCgyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzaTExMzJfYXR0cmlidXRlc1tdID0geworCSZpaW9fY29uc3RfYXR0cl9pbl9pbnRlbnNpdHlfc2NhbGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luX2ludGVuc2l0eV9pcl9zY2FsZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnNpMTE0eF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19jb25zdF9hdHRyX2luX2ludGVuc2l0eV9zY2FsZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5faW50ZW5zaXR5X2lyX3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9wcm94aW1pdHlfc2NhbGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNpMTEzMl9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gc2kxMTMyX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBzaTExNHhfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IHNpMTE0eF9hdHRyaWJ1dGVzLAorfTsKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIHNpMTEzMl9pbmZvID0geworCS5yZWFkX3JhdyA9IHNpMTE0NV9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gc2kxMTQ1X3dyaXRlX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5hdHRycyA9ICZzaTExMzJfYXR0cmlidXRlX2dyb3VwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBzaTExNHhfaW5mbyA9IHsKKwkucmVhZF9yYXcgPSBzaTExNDVfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9IHNpMTE0NV93cml0ZV9yYXcsCisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkuYXR0cnMgPSAmc2kxMTR4X2F0dHJpYnV0ZV9ncm91cCwKK307CisKKyNkZWZpbmUgU0kxMTQ1X1BBUlQoaWQsIGlpb19pbmZvLCBjaGFucywgbGVkcywgdW5jb21wcmVzc2VkX21lYXNfcmF0ZSkgXAorCXtpZCwgaWlvX2luZm8sIGNoYW5zLCBBUlJBWV9TSVpFKGNoYW5zKSwgbGVkcywgdW5jb21wcmVzc2VkX21lYXNfcmF0ZX0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzaTExNDVfcGFydF9pbmZvIHNpMTE0NV9wYXJ0X2luZm9bXSA9IHsKKwlbU0kxMTMyXSA9IFNJMTE0NV9QQVJUKDB4MzIsICZzaTExMzJfaW5mbywgc2kxMTMyX2NoYW5uZWxzLCAwLCB0cnVlKSwKKwlbU0kxMTQxXSA9IFNJMTE0NV9QQVJUKDB4NDEsICZzaTExNHhfaW5mbywgc2kxMTQxX2NoYW5uZWxzLCAxLCBmYWxzZSksCisJW1NJMTE0Ml0gPSBTSTExNDVfUEFSVCgweDQyLCAmc2kxMTR4X2luZm8sIHNpMTE0Ml9jaGFubmVscywgMiwgZmFsc2UpLAorCVtTSTExNDNdID0gU0kxMTQ1X1BBUlQoMHg0MywgJnNpMTE0eF9pbmZvLCBzaTExNDNfY2hhbm5lbHMsIDMsIGZhbHNlKSwKKwlbU0kxMTQ1XSA9IFNJMTE0NV9QQVJUKDB4NDUsICZzaTExNHhfaW5mbywgc2kxMTQ1X2NoYW5uZWxzLCAxLCB0cnVlKSwKKwlbU0kxMTQ2XSA9IFNJMTE0NV9QQVJUKDB4NDYsICZzaTExNHhfaW5mbywgc2kxMTQ2X2NoYW5uZWxzLCAyLCB0cnVlKSwKKwlbU0kxMTQ3XSA9IFNJMTE0NV9QQVJUKDB4NDcsICZzaTExNHhfaW5mbywgc2kxMTQ3X2NoYW5uZWxzLCAzLCB0cnVlKSwKK307CisKK3N0YXRpYyBpbnQgc2kxMTQ1X2luaXRpYWxpemUoc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IHJldDsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBTSTExNDVfUkVHX0NPTU1BTkQsCisJCQkJCVNJMTE0NV9DTURfUkVTRVQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCW1zbGVlcChTSTExNDVfQ09NTUFORF9USU1FT1VUX01TKTsKKworCS8qIEhhcmR3YXJlIGtleSwgbWFnaWMgdmFsdWUgKi8KKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgU0kxMTQ1X1JFR19IV19LRVksIDB4MTcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCW1zbGVlcChTSTExNDVfQ09NTUFORF9USU1FT1VUX01TKTsKKworCS8qIFR1cm4gb2ZmIGF1dG9ub21vdXMgbW9kZSAqLworCXJldCA9IHNpMTE0NV9zZXRfbWVhc19yYXRlKGRhdGEsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogSW5pdGlhbGl6ZSBzYW1wbGluZyBmcmVxIHRvIDEwIEh6ICovCisJcmV0ID0gc2kxMTQ1X3N0b3JlX3NhbXBfZnJlcShkYXRhLCAxMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgTEVEIGN1cnJlbnRzIHRvIDQ1IG1BOyBoYXZlIDQgYml0cywgc2VlIFRhYmxlIDIgaW4gZGF0YXNoZWV0ICovCisJc3dpdGNoIChkYXRhLT5wYXJ0X2luZm8tPm51bV9sZWRzKSB7CisJY2FzZSAzOgorCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCVNJMTE0NV9SRUdfUFNfTEVEMywKKwkJCQkJCVNJMTE0NV9MRURfQ1VSUkVOVF80NW1BKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgMjoKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQlTSTExNDVfUkVHX1BTX0xFRDIxLAorCQkJCQkJKFNJMTE0NV9MRURfQ1VSUkVOVF80NW1BIDw8IDQpIHwKKwkJCQkJCVNJMTE0NV9MRURfQ1VSUkVOVF80NW1BKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCVNJMTE0NV9SRUdfUFNfTEVEMjEsCisJCQkJCQlTSTExNDVfTEVEX0NVUlJFTlRfNDVtQSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNldCBub3JtYWwgcHJveGltaXR5IG1lYXN1cmVtZW50IG1vZGUgKi8KKwlyZXQgPSBzaTExNDVfcGFyYW1fc2V0KGRhdGEsIFNJMTE0NV9QQVJBTV9QU19BRENfTUlTQywKKwkJCSAgICAgICBTSTExNDVfUFNfQURDX01PREVfTk9STUFMKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX1BTX0FEQ19HQUlOLCAweDAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEFEQ19DT1VOVEVSIHNob3VsZCBiZSBvbmUgY29tcGxlbWVudCBvZiBBRENfR0FJTiAqLworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX1BTX0FEQ19DT1VOVEVSLCAweDA2IDw8IDQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IEFMUyB2aXNpYmxlIG1lYXN1cmVtZW50IG1vZGUgKi8KKwlyZXQgPSBzaTExNDVfcGFyYW1fc2V0KGRhdGEsIFNJMTE0NV9QQVJBTV9BTFNWSVNfQURDX01JU0MsCisJCQkgICAgICAgU0kxMTQ1X0FEQ19NSVNDX1JBTkdFKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX0FMU1ZJU19BRENfR0FJTiwgMHgwMyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzaTExNDVfcGFyYW1fc2V0KGRhdGEsIFNJMTE0NV9QQVJBTV9BTFNWSVNfQURDX0NPVU5URVIsCisJCQkgICAgICAgMHgwNCA8PCA0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFNldCBBTFMgSVIgbWVhc3VyZW1lbnQgbW9kZSAqLworCXJldCA9IHNpMTE0NV9wYXJhbV9zZXQoZGF0YSwgU0kxMTQ1X1BBUkFNX0FMU0lSX0FEQ19NSVNDLAorCQkJICAgICAgIFNJMTE0NV9BRENfTUlTQ19SQU5HRSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzaTExNDVfcGFyYW1fc2V0KGRhdGEsIFNJMTE0NV9QQVJBTV9BTFNJUl9BRENfR0FJTiwgMHgwMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzaTExNDVfcGFyYW1fc2V0KGRhdGEsIFNJMTE0NV9QQVJBTV9BTFNJUl9BRENfQ09VTlRFUiwKKwkJCSAgICAgICAweDA2IDw8IDQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBJbml0aWFsaXplIFVDT0VGIHRvIGRlZmF1bHQgdmFsdWVzIGluIGRhdGFzaGVldAorCSAqIFRoZXNlIHJlZ2lzdGVycyBhcmUgbm9ybWFsbHkgemVybyBvbiByZXNldAorCSAqLworCWlmIChkYXRhLT5wYXJ0X2luZm8gPT0gJnNpMTE0NV9wYXJ0X2luZm9bU0kxMTMyXSB8fAorCQlkYXRhLT5wYXJ0X2luZm8gPT0gJnNpMTE0NV9wYXJ0X2luZm9bU0kxMTQ1XSB8fAorCQlkYXRhLT5wYXJ0X2luZm8gPT0gJnNpMTE0NV9wYXJ0X2luZm9bU0kxMTQ2XSB8fAorCQlkYXRhLT5wYXJ0X2luZm8gPT0gJnNpMTE0NV9wYXJ0X2luZm9bU0kxMTQ3XSkgeworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJCVNJMTE0NV9SRUdfVUNPRUYxLAorCQkJCQkJU0kxMTQ1X1VDT0VGMV9ERUZBVUxUKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQlTSTExNDVfUkVHX1VDT0VGMiwgU0kxMTQ1X1VDT0VGMl9ERUZBVUxUKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQlTSTExNDVfUkVHX1VDT0VGMywgU0kxMTQ1X1VDT0VGM19ERUZBVUxUKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQlTSTExNDVfUkVHX1VDT0VGNCwgU0kxMTQ1X1VDT0VGNF9ERUZBVUxUKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUHJvZ3JhbSB0aGUgY2hhbm5lbHMgd2Ugd2FudCB0byBtZWFzdXJlIHdpdGggQ01EX1BTQUxTX0FVVE8uIE5vIG5lZWQgZm9yCisgKiBfcG9zdGRpc2FibGUgYXMgd2Ugc3RvcCB3aXRoIENNRF9QU0FMU19QQVVTRTsgc2luZ2xlIG1lYXN1cmVtZW50IChkaXJlY3QpCisgKiBtb2RlIHJlcHJvZ3JhbXMgdGhlIGNoYW5uZWxzIGxpc3QgYW55d2F5Li4uCisgKi8KK3N0YXRpYyBpbnQgc2kxMTQ1X2J1ZmZlcl9wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3Qgc2kxMTQ1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKKwlyZXQgPSBzaTExNDVfc2V0X2NobGlzdChpbmRpb19kZXYsICppbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2spOworCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBzaTExNDVfdmFsaWRhdGVfc2Nhbl9tYXNrKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAqc2Nhbl9tYXNrKQoreworCXN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwlpbnQgaTsKKworCS8qIENoZWNrIHRoYXQgYXQgbW9zdCBvbmUgQVVYIGNoYW5uZWwgaXMgZW5hYmxlZCAqLworCWZvcl9lYWNoX3NldF9iaXQoaSwgc2Nhbl9tYXNrLCBkYXRhLT5wYXJ0X2luZm8tPm51bV9jaGFubmVscykgeworCQlpZiAoaW5kaW9fZGV2LT5jaGFubmVsc1tpXS5hZGRyZXNzID09IFNJMTE0NV9SRUdfQVVYX0RBVEEpCisJCQljb3VudCsrOworCX0KKworCXJldHVybiBjb3VudCA8PSAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIHNpMTE0NV9idWZmZXJfc2V0dXBfb3BzID0geworCS5wcmVlbmFibGUgPSBzaTExNDVfYnVmZmVyX3ByZWVuYWJsZSwKKwkucG9zdGVuYWJsZSA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUsCisJLnByZWRpc2FibGUgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAorCS52YWxpZGF0ZV9zY2FuX21hc2sgPSBzaTExNDVfdmFsaWRhdGVfc2Nhbl9tYXNrLAorfTsKKworLyoqCisgKiBzaTExNDVfdHJpZ2dlcl9zZXRfc3RhdGUoKSAtIFNldCB0cmlnZ2VyIHN0YXRlCisgKgorICogV2hlbiBub3QgdXNpbmcgdHJpZ2dlcnMgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQgYW5kIG1lYXN1cmVtZW50IHJhdGUgaXMKKyAqIHNldCB0byB6ZXJvIGluIG9yZGVyIHRvIG1pbmltaXplIHBvd2VyIGNvbnN1bXB0aW9uLgorICovCitzdGF0aWMgaW50IHNpMTE0NV90cmlnZ2VyX3NldF9zdGF0ZShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsIGJvb2wgc3RhdGUpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGlpb190cmlnZ2VyX2dldF9kcnZkYXRhKHRyaWcpOworCXN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IGVyciA9IDAsIHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCisJaWYgKHN0YXRlKSB7CisJCWRhdGEtPmF1dG9ub21vdXMgPSB0cnVlOworCQllcnIgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQlTSTExNDVfUkVHX0lOVF9DRkcsIFNJMTE0NV9JTlRfQ0ZHX09FKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGRpc2FibGU7CisJCWVyciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCVNJMTE0NV9SRUdfSVJRX0VOQUJMRSwgU0kxMTQ1X01BU0tfQUxMX0lFKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGRpc2FibGU7CisJCWVyciA9IHNpMTE0NV9zZXRfbWVhc19yYXRlKGRhdGEsIGRhdGEtPm1lYXNfcmF0ZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBkaXNhYmxlOworCQllcnIgPSBzaTExNDVfY29tbWFuZChkYXRhLCBTSTExNDVfQ01EX1BTQUxTX0FVVE8pOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZGlzYWJsZTsKKwl9IGVsc2UgeworZGlzYWJsZToKKwkJLyogRGlzYWJsZSBhcyBtdWNoIGFzIHBvc3NpYmxlIHNraXBwaW5nIGVycm9ycyAqLworCQlyZXQgPSBzaTExNDVfY29tbWFuZChkYXRhLCBTSTExNDVfQ01EX1BTQUxTX1BBVVNFKTsKKwkJaWYgKHJldCA8IDAgJiYgIWVycikKKwkJCWVyciA9IHJldDsKKwkJcmV0ID0gc2kxMTQ1X3NldF9tZWFzX3JhdGUoZGF0YSwgMCk7CisJCWlmIChyZXQgPCAwICYmICFlcnIpCisJCQllcnIgPSByZXQ7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCQkJU0kxMTQ1X1JFR19JUlFfRU5BQkxFLCAwKTsKKwkJaWYgKHJldCA8IDAgJiYgIWVycikKKwkJCWVyciA9IHJldDsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJCQlTSTExNDVfUkVHX0lOVF9DRkcsIDApOworCQlpZiAocmV0IDwgMCAmJiAhZXJyKQorCQkJZXJyID0gcmV0OworCQlkYXRhLT5hdXRvbm9tb3VzID0gZmFsc2U7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb190cmlnZ2VyX29wcyBzaTExNDVfdHJpZ2dlcl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnNldF90cmlnZ2VyX3N0YXRlID0gc2kxMTQ1X3RyaWdnZXJfc2V0X3N0YXRlLAorfTsKKworc3RhdGljIGludCBzaTExNDVfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWc7CisJaW50IHJldDsKKworCXRyaWcgPSBkZXZtX2lpb190cmlnZ2VyX2FsbG9jKCZjbGllbnQtPmRldiwKKwkJCSIlcy1kZXYlZCIsIGluZGlvX2Rldi0+bmFtZSwgaW5kaW9fZGV2LT5pZCk7CisJaWYgKCF0cmlnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRyaWctPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJdHJpZy0+b3BzID0gJnNpMTE0NV90cmlnZ2VyX29wczsKKwlpaW9fdHJpZ2dlcl9zZXRfZHJ2ZGF0YSh0cmlnLCBpbmRpb19kZXYpOworCisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmY2xpZW50LT5kZXYsIGNsaWVudC0+aXJxLAorCQkJICBpaW9fdHJpZ2dlcl9nZW5lcmljX2RhdGFfcmR5X3BvbGwsCisJCQkgIElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJICAic2kxMTQ1X2lycSIsCisJCQkgIHRyaWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiaXJxIHJlcXVlc3QgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3Rlcih0cmlnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZGF0YS0+dHJpZyA9IHRyaWc7CisJaW5kaW9fZGV2LT50cmlnID0gaWlvX3RyaWdnZXJfZ2V0KGRhdGEtPnRyaWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNpMTE0NV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBzaTExNDVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlpZiAoZGF0YS0+dHJpZykgeworCQlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKGRhdGEtPnRyaWcpOworCQlkYXRhLT50cmlnID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2kxMTQ1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHNpMTE0NV9kYXRhICpkYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJdTggcGFydF9pZCwgcmV2X2lkLCBzZXFfaWQ7CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqZGF0YSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCWRhdGEtPnBhcnRfaW5mbyA9ICZzaTExNDVfcGFydF9pbmZvW2lkLT5kcml2ZXJfZGF0YV07CisKKwlwYXJ0X2lkID0gcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJCSBTSTExNDVfUkVHX1BBUlRfSUQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldl9pZCA9IHJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJCQlTSTExNDVfUkVHX1JFVl9JRCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJc2VxX2lkID0gcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJCVNJMTE0NV9SRUdfU0VRX0lEKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJkZXZpY2UgSUQgcGFydCAlIzAyaGh4IHJldiAlIzAyaGh4IHNlcSAlIzAyaGh4XG4iLAorCQkJcGFydF9pZCwgcmV2X2lkLCBzZXFfaWQpOworCWlmIChwYXJ0X2lkICE9IGRhdGEtPnBhcnRfaW5mby0+cGFydCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInBhcnQgSUQgbWlzbWF0Y2ggZ290ICUjMDJoaHgsIGV4cGVjdGVkICUjMDJ4XG4iLAorCQkJCXBhcnRfaWQsIGRhdGEtPnBhcnRfaW5mby0+cGFydCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwlpbmRpb19kZXYtPm5hbWUgPSBpZC0+bmFtZTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gZGF0YS0+cGFydF9pbmZvLT5jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IGRhdGEtPnBhcnRfaW5mby0+bnVtX2NoYW5uZWxzOworCWluZGlvX2Rldi0+aW5mbyA9IGRhdGEtPnBhcnRfaW5mby0+aWlvX2luZm87CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CisJbXV0ZXhfaW5pdCgmZGF0YS0+Y21kbG9jayk7CisKKwlyZXQgPSBzaTExNDVfaW5pdGlhbGl6ZShkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgTlVMTCwKKwkJc2kxMTQ1X3RyaWdnZXJfaGFuZGxlciwgJnNpMTE0NV9idWZmZXJfc2V0dXBfb3BzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjbGllbnQtPmlycSkgeworCQlyZXQgPSBzaTExNDVfcHJvYmVfdHJpZ2dlcihpbmRpb19kZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3JfZnJlZV9idWZmZXI7CisJfSBlbHNlIHsKKwkJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAibm8gaXJxLCB1c2luZyBwb2xsaW5nXG4iKTsKKwl9CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfZnJlZV90cmlnZ2VyOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfdHJpZ2dlcjoKKwlzaTExNDVfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfYnVmZmVyOgorCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzaTExNDVfaWRzW10gPSB7CisJeyAic2kxMTMyIiwgU0kxMTMyIH0sCisJeyAic2kxMTQxIiwgU0kxMTQxIH0sCisJeyAic2kxMTQyIiwgU0kxMTQyIH0sCisJeyAic2kxMTQzIiwgU0kxMTQzIH0sCisJeyAic2kxMTQ1IiwgU0kxMTQ1IH0sCisJeyAic2kxMTQ2IiwgU0kxMTQ2IH0sCisJeyAic2kxMTQ3IiwgU0kxMTQ3IH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHNpMTE0NV9pZHMpOworCitzdGF0aWMgaW50IHNpMTE0NV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlzaTExNDVfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHNpMTE0NV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICA9ICJzaTExNDUiLAorCX0sCisJLnByb2JlICA9IHNpMTE0NV9wcm9iZSwKKwkucmVtb3ZlID0gc2kxMTQ1X3JlbW92ZSwKKwkuaWRfdGFibGUgPSBzaTExNDVfaWRzLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoc2kxMTQ1X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlBldGVyIE1lZXJ3YWxkLVN0YWRsZXIgPHBtZWVyd0BwbWVlcncubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTaWxhYnMgU0kxMTMyIGFuZCBTSTExNDEvMi8zLzUvNi83IHByb3hpbWl0eSwgYW1iaWVudCBsaWdodCBhbmQgVVYgaW5kZXggc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvdXM1MTgyZC5jIGIvZHJpdmVycy9paW8vbGlnaHQvdXM1MTgyZC5jCmluZGV4IDIwYzQwZjcuLjE4Y2YyZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2xpZ2h0L3VzNTE4MmQuYworKysgYi9kcml2ZXJzL2lpby9saWdodC91czUxODJkLmMKQEAgLTg5NCw3ICs4OTQsNyBAQAogCQlnb3RvIG91dF9lcnI7CiAKIAlpZiAoZGF0YS0+ZGVmYXVsdF9jb250aW51b3VzKSB7Ci0JCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmY2xpZW50LT5kZXYpOworCQlyZXQgPSBwbV9ydW50aW1lX3NldF9hY3RpdmUoJmNsaWVudC0+ZGV2KTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dF9lcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvdmNubDQwMDAuYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L3Zjbmw0MDAwLmMKaW5kZXggYzlkODViYi4uMzYwYjZlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvdmNubDQwMDAuYworKysgYi9kcml2ZXJzL2lpby9saWdodC92Y25sNDAwMC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIHZjbmw0MDAwLmMgLSBTdXBwb3J0IGZvciBWaXNoYXkgVkNOTDQwMDAgY29tYmluZWQgYW1iaWVudCBsaWdodCBhbmQKLSAqIHByb3hpbWl0eSBzZW5zb3IKKyAqIHZjbmw0MDAwLmMgLSBTdXBwb3J0IGZvciBWaXNoYXkgVkNOTDQwMDAvNDAxMC80MDIwIGNvbWJpbmVkIGFtYmllbnQKKyAqIGxpZ2h0IGFuZCBwcm94aW1pdHkgc2Vuc29yCiAgKgogICogQ29weXJpZ2h0IDIwMTIgUGV0ZXIgTWVlcndhbGQgPHBtZWVyd0BwbWVlcncubmV0PgogICoKQEAgLTEzLDYgKzEzLDggQEAKICAqIFRPRE86CiAgKiAgIGFsbG93IHRvIGFkanVzdCBJUiBjdXJyZW50CiAgKiAgIHByb3hpbWl0eSB0aHJlc2hvbGQgYW5kIGV2ZW50IGhhbmRsaW5nCisgKiAgIHBlcmlvZGljIEFMUy9wcm94aW1pdHkgbWVhc3VyZW1lbnQgKFZDTkw0MDEwLzIwKQorICogICBpbnRlcnJ1cHRzIChWQ05MNDAxMC8yMCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0yNCw2ICsyNiw4IEBACiAjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CiAKICNkZWZpbmUgVkNOTDQwMDBfRFJWX05BTUUgInZjbmw0MDAwIgorI2RlZmluZSBWQ05MNDAwMF9JRAkJMHgwMQorI2RlZmluZSBWQ05MNDAxMF9JRAkJMHgwMiAvKiBmb3IgVkNOTDQwMjAsIFZDTkw0MDEwICovCiAKICNkZWZpbmUgVkNOTDQwMDBfQ09NTUFORAkweDgwIC8qIENvbW1hbmQgcmVnaXN0ZXIgKi8KICNkZWZpbmUgVkNOTDQwMDBfUFJPRF9SRVYJMHg4MSAvKiBQcm9kdWN0IElEIGFuZCBSZXZpc2lvbiBJRCAqLwpAQCAtMzcsMTMgKzQxLDE0IEBACiAjZGVmaW5lIFZDTkw0MDAwX1BTX01PRF9BREoJMHg4YSAvKiBQcm94aW1pdHkgbW9kdWxhdG9yIHRpbWluZyBhZGp1c3RtZW50ICovCiAKIC8qIEJpdCBtYXNrcyBmb3IgQ09NTUFORCByZWdpc3RlciAqLwotI2RlZmluZSBWQ05MNDAwMF9BTF9SRFkJCTB4NDAgLyogQUxTIGRhdGEgcmVhZHk/ICovCi0jZGVmaW5lIFZDTkw0MDAwX1BTX1JEWQkJMHgyMCAvKiBwcm94aW1pdHkgZGF0YSByZWFkeT8gKi8KLSNkZWZpbmUgVkNOTDQwMDBfQUxfT0QJCTB4MTAgLyogc3RhcnQgb24tZGVtYW5kIEFMUyBtZWFzdXJlbWVudCAqLwotI2RlZmluZSBWQ05MNDAwMF9QU19PRAkJMHgwOCAvKiBzdGFydCBvbi1kZW1hbmQgcHJveGltaXR5IG1lYXN1cmVtZW50ICovCisjZGVmaW5lIFZDTkw0MDAwX0FMX1JEWQkJQklUKDYpIC8qIEFMUyBkYXRhIHJlYWR5PyAqLworI2RlZmluZSBWQ05MNDAwMF9QU19SRFkJCUJJVCg1KSAvKiBwcm94aW1pdHkgZGF0YSByZWFkeT8gKi8KKyNkZWZpbmUgVkNOTDQwMDBfQUxfT0QJCUJJVCg0KSAvKiBzdGFydCBvbi1kZW1hbmQgQUxTIG1lYXN1cmVtZW50ICovCisjZGVmaW5lIFZDTkw0MDAwX1BTX09ECQlCSVQoMykgLyogc3RhcnQgb24tZGVtYW5kIHByb3hpbWl0eSBtZWFzdXJlbWVudCAqLwogCiBzdHJ1Y3QgdmNubDQwMDBfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB2Y25sNDAwMF9pZFtdID0gewpAQCAtNTksMTYgKzY0LDE4IEBACiAJX19iZTE2IGJ1ZjsKIAlpbnQgcmV0OwogCisJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CisKIAlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgVkNOTDQwMDBfQ09NTUFORCwKIAkJCQkJcmVxX21hc2spOwogCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGZhaWw7CiAKIAkvKiB3YWl0IGZvciBkYXRhIHRvIGJlY29tZSByZWFkeSAqLwogCXdoaWxlICh0cmllcy0tKSB7CiAJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIFZDTkw0MDAwX0NPTU1BTkQpOwogCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIGZhaWw7CiAJCWlmIChyZXQgJiByZHlfbWFzaykKIAkJCWJyZWFrOwogCQltc2xlZXAoMjApOyAvKiBtZWFzdXJlbWVudCB0YWtlcyB1cCB0byAxMDAgbXMgKi8KQEAgLTc3LDE3ICs4NCwyMyBAQAogCWlmICh0cmllcyA8IDApIHsKIAkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsCiAJCQkidmNubDQwMDBfbWVhc3VyZSgpIGZhaWxlZCwgZGF0YSBub3QgcmVhZHlcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBmYWlsOwogCX0KIAogCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGRhdGEtPmNsaWVudCwKIAkJZGF0YV9yZWcsIHNpemVvZihidWYpLCAodTggKikgJmJ1Zik7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gZmFpbDsKIAorCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAJKnZhbCA9IGJlMTZfdG9fY3B1KGJ1Zik7CiAKIAlyZXR1cm4gMDsKKworZmFpbDoKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyB2Y25sNDAwMF9jaGFubmVsc1tdID0gewpAQCAtMTA1LDcgKzExOCw3IEBACiAJCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCiAJCQkJaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQogewotCWludCByZXQgPSAtRUlOVkFMOworCWludCByZXQ7CiAJc3RydWN0IHZjbmw0MDAwX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCiAJc3dpdGNoIChtYXNrKSB7CkBAIC0xMTcsMzIgKzEzMCwyNyBAQAogCQkJCVZDTkw0MDAwX0FMX1JFU1VMVF9ISSwgdmFsKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7Ci0JCQlyZXQgPSBJSU9fVkFMX0lOVDsKLQkJCWJyZWFrOworCQkJcmV0dXJuIElJT19WQUxfSU5UOwogCQljYXNlIElJT19QUk9YSU1JVFk6CiAJCQlyZXQgPSB2Y25sNDAwMF9tZWFzdXJlKGRhdGEsCiAJCQkJVkNOTDQwMDBfUFNfT0QsIFZDTkw0MDAwX1BTX1JEWSwKIAkJCQlWQ05MNDAwMF9QU19SRVNVTFRfSEksIHZhbCk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0OwotCQkJcmV0ID0gSUlPX1ZBTF9JTlQ7Ci0JCQlicmVhazsKKwkJCXJldHVybiBJSU9fVkFMX0lOVDsKIAkJZGVmYXVsdDoKLQkJCWJyZWFrOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJYnJlYWs7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgotCQlpZiAoY2hhbi0+dHlwZSA9PSBJSU9fTElHSFQpIHsKLQkJCSp2YWwgPSAwOwotCQkJKnZhbDIgPSAyNTAwMDA7Ci0JCQlyZXQgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KKwkJaWYgKGNoYW4tPnR5cGUgIT0gSUlPX0xJR0hUKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gcmV0OworCQkqdmFsID0gMDsKKwkJKnZhbDIgPSAyNTAwMDA7CisJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyB2Y25sNDAwMF9pbmZvID0gewpAQCAtMTU1LDcgKzE2Myw3IEBACiB7CiAJc3RydWN0IHZjbmw0MDAwX2RhdGEgKmRhdGE7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKLQlpbnQgcmV0OworCWludCByZXQsIHByb2RfaWQ7CiAKIAlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpKTsKIAlpZiAoIWluZGlvX2RldikKQEAgLTE2NCwxMyArMTcyLDE5IEBACiAJZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKIAlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CiAKIAlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBWQ05MNDAwMF9QUk9EX1JFVik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJWQ05MNDAwMCBBbWJpZW50IGxpZ2h0L3Byb3hpbWl0eSBzZW5zb3IsIFByb2QgJTAyeCwgUmV2OiAlMDJ4XG4iLAotCQlyZXQgPj4gNCwgcmV0ICYgMHhmKTsKKwlwcm9kX2lkID0gcmV0ID4+IDQ7CisJaWYgKHByb2RfaWQgIT0gVkNOTDQwMTBfSUQgJiYgcHJvZF9pZCAhPSBWQ05MNDAwMF9JRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzIEFtYmllbnQgbGlnaHQvcHJveGltaXR5IHNlbnNvciwgUmV2OiAlMDJ4XG4iLAorCQkocHJvZF9pZCA9PSBWQ05MNDAxMF9JRCkgPyAiVkNOTDQwMTAvNDAyMCIgOiAiVkNOTDQwMDAiLAorCQlyZXQgJiAweGYpOwogCiAJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OwogCWluZGlvX2Rldi0+aW5mbyA9ICZ2Y25sNDAwMF9pbmZvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL0tjb25maWcgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvS2NvbmZpZwppbmRleCAxZjg0MmFiLi40MjFhZDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvS2NvbmZpZwpAQCAtNSw4ICs1LDIyIEBACiAKIG1lbnUgIk1hZ25ldG9tZXRlciBzZW5zb3JzIgogCitjb25maWcgQUs4OTc0CisJdHJpc3RhdGUgIkFzYWhpIEthc2VpIEFLODk3NCAzLUF4aXMgTWFnbmV0b21ldGVyIgorCWRlcGVuZHMgb24gSTJDCisJZGVwZW5kcyBvbiBPRgorCXNlbGVjdCBSRUdNQVBfSTJDCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVJFRF9CVUZGRVIKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQXNhaGkgS2FzZWkgQUs4OTc0IG9yCisJICBBTUkzMDUgSTJDLWJhc2VkIDMtYXhpcyBtYWduZXRvbWV0ZXIgY2hpcHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFrODk3NC4KKwogY29uZmlnIEFLODk3NQotCXRyaXN0YXRlICJBc2FoaSBLYXNlaSBBSyAzLUF4aXMgTWFnbmV0b21ldGVyIgorCXRyaXN0YXRlICJBc2FoaSBLYXNlaSBBSzg5NzUgMy1BeGlzIE1hZ25ldG9tZXRlciIKIAlkZXBlbmRzIG9uIEkyQwogCWRlcGVuZHMgb24gR1BJT0xJQiB8fCBDT01QSUxFX1RFU1QKIAlzZWxlY3QgSUlPX0JVRkZFUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL01ha2VmaWxlIGIvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL01ha2VmaWxlCmluZGV4IDkyYTc0NWMuLmI4NmQ2Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvTWFrZWZpbGUKQEAgLTMsNiArMyw3IEBACiAjCiAKICMgV2hlbiBhZGRpbmcgbmV3IGVudHJpZXMga2VlcCB0aGUgbGlzdCBpbiBhbHBoYWJldGljYWwgb3JkZXIKK29iai0kKENPTkZJR19BSzg5NzQpCSs9IGFrODk3NC5vCiBvYmotJChDT05GSUdfQUs4OTc1KQkrPSBhazg5NzUubwogb2JqLSQoQ09ORklHX0JNQzE1MF9NQUdOKSArPSBibWMxNTBfbWFnbi5vCiBvYmotJChDT05GSUdfQk1DMTUwX01BR05fSTJDKSArPSBibWMxNTBfbWFnbl9pMmMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL2FrODk3NC5jIGIvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL2FrODk3NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNzM1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvYWs4OTc0LmMKQEAgLTAsMCArMSw4NjAgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBBc2FoaSBLYXNlaSBFTUQgQ29ycG9yYXRpb24gQUs4OTc0CisgKiBhbmQgQWljaGkgU3RlZWwgQU1JMzA1IG1hZ25ldG9tZXRlciBjaGlwcy4KKyAqIEJhc2VkIG9uIGEgcGF0Y2ggZnJvbSBTYW11IE9ua2FsbyBhbmQgdGhlIEFLODk3NSBJSU8gZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTlZJRElBIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDE2IExpbmFybyBMdGQuCisgKgorICogQXV0aG9yOiBTYW11IE9ua2FsbyA8c2FtdS5wLm9ua2Fsb0Bub2tpYS5jb20+CisgKiBBdXRob3I6IExpbnVzIFdhbGxlaWogPGxpbnVzLndhbGxlaWpAbGluYXJvLm9yZz4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPiAvKiBGb3IgaXJxX2dldF9pcnFfZGF0YSgpICovCisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oPgorCisvKgorICogMTYtYml0IHJlZ2lzdGVycyBhcmUgbGl0dGxlLWVuZGlhbi4gTFNCIGlzIGF0IHRoZSBhZGRyZXNzIGRlZmluZWQgYmVsb3cKKyAqIGFuZCBNU0IgaXMgYXQgdGhlIG5leHQgaGlnaGVyIGFkZHJlc3MuCisgKi8KKworLyogVGhlc2UgcmVnaXN0ZXJzIGFyZSBjb21tb24gZm9yIEFLODk3NCBhbmQgQU1JMzA1ICovCisjZGVmaW5lIEFLODk3NF9TRUxGVEVTVAkJMHgwQworI2RlZmluZSBBSzg5NzRfU0VMRlRFU1RfSURMRQkweDU1CisjZGVmaW5lIEFLODk3NF9TRUxGVEVTVF9PSwkweEFBCisKKyNkZWZpbmUgQUs4OTc0X0lORk8JCTB4MEQKKworI2RlZmluZSBBSzg5NzRfV0hPQU1JCQkweDBGCisjZGVmaW5lIEFLODk3NF9XSE9BTUlfVkFMVUVfQU1JMzA1IDB4NDcKKyNkZWZpbmUgQUs4OTc0X1dIT0FNSV9WQUxVRV9BSzg5NzQgMHg0OAorCisjZGVmaW5lIEFLODk3NF9EQVRBX1gJCTB4MTAKKyNkZWZpbmUgQUs4OTc0X0RBVEFfWQkJMHgxMgorI2RlZmluZSBBSzg5NzRfREFUQV9aCQkweDE0CisjZGVmaW5lIEFLODk3NF9JTlRfU1JDCQkweDE2CisjZGVmaW5lIEFLODk3NF9TVEFUVVMJCTB4MTgKKyNkZWZpbmUgQUs4OTc0X0lOVF9DTEVBUgkweDFBCisjZGVmaW5lIEFLODk3NF9DVFJMMQkJMHgxQgorI2RlZmluZSBBSzg5NzRfQ1RSTDIJCTB4MUMKKyNkZWZpbmUgQUs4OTc0X0NUUkwzCQkweDFECisjZGVmaW5lIEFLODk3NF9JTlRfQ1RSTAkJMHgxRQorI2RlZmluZSBBSzg5NzRfSU5UX1RIUkVTCTB4MjYgIC8qIEFic29sdXRlIGFueSBheGlzIHZhbHVlIHRocmVzaG9sZCAqLworI2RlZmluZSBBSzg5NzRfUFJFU0VUCQkweDMwCisKKy8qIEFLODk3NC1zcGVjaWZpYyBvZmZzZXRzICovCisjZGVmaW5lIEFLODk3NF9PRkZTRVRfWAkJMHgyMAorI2RlZmluZSBBSzg5NzRfT0ZGU0VUX1kJCTB4MjIKKyNkZWZpbmUgQUs4OTc0X09GRlNFVF9aCQkweDI0CisvKiBBTUkzMDUtc3BlY2lmaWMgb2Zmc2V0cyAqLworI2RlZmluZSBBTUkzMDVfT0ZGU0VUX1gJCTB4NkMKKyNkZWZpbmUgQU1JMzA1X09GRlNFVF9ZCQkweDcyCisjZGVmaW5lIEFNSTMwNV9PRkZTRVRfWgkJMHg3OAorCisvKiBEaWZmZXJlbnQgdGVtcGVyYXR1cmUgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFLODk3NF9URU1QCQkweDMxCisjZGVmaW5lIEFNSTMwNV9URU1QCQkweDYwCisKKyNkZWZpbmUgQUs4OTc0X0lOVF9YX0hJR0gJQklUKDcpIC8qIEF4aXMgb3ZlciArdGhyZXNob2xkICAqLworI2RlZmluZSBBSzg5NzRfSU5UX1lfSElHSAlCSVQoNikKKyNkZWZpbmUgQUs4OTc0X0lOVF9aX0hJR0gJQklUKDUpCisjZGVmaW5lIEFLODk3NF9JTlRfWF9MT1cJQklUKDQpIC8qIEF4aXMgYmVsb3cgLXRocmVzaG9sZAkqLworI2RlZmluZSBBSzg5NzRfSU5UX1lfTE9XCUJJVCgzKQorI2RlZmluZSBBSzg5NzRfSU5UX1pfTE9XCUJJVCgyKQorI2RlZmluZSBBSzg5NzRfSU5UX1JBTkdFCUJJVCgxKSAvKiBSYW5nZSBvdmVyZmxvdyAoYW55IGF4aXMpICovCisKKyNkZWZpbmUgQUs4OTc0X1NUQVRVU19EUkRZCUJJVCg2KSAvKiBEYXRhIHJlYWR5ICovCisjZGVmaW5lIEFLODk3NF9TVEFUVVNfT1ZFUlJVTglCSVQoNSkgLyogRGF0YSBvdmVycnVuICovCisjZGVmaW5lIEFLODk3NF9TVEFUVVNfSU5UCUJJVCg0KSAvKiBJbnRlcnJ1cHQgb2NjdXJyZWQgKi8KKworI2RlZmluZSBBSzg5NzRfQ1RSTDFfUE9XRVIJQklUKDcpIC8qIDAgPSBzdGFuZGJ5OyAxID0gYWN0aXZlICovCisjZGVmaW5lIEFLODk3NF9DVFJMMV9SQVRFCUJJVCg0KSAvKiAwID0gMTAgSHo7IDEgPSAyMCBIegkgKi8KKyNkZWZpbmUgQUs4OTc0X0NUUkwxX0ZPUkNFX0VOCUJJVCgxKSAvKiAwID0gbm9ybWFsOyAxID0gZm9yY2UJICovCisjZGVmaW5lIEFLODk3NF9DVFJMMV9NT0RFMglCSVQoMCkgLyogMCAqLworCisjZGVmaW5lIEFLODk3NF9DVFJMMl9JTlRfRU4JQklUKDQpICAvKiAxID0gZW5hYmxlIGludGVycnVwdHMJICAgICAgKi8KKyNkZWZpbmUgQUs4OTc0X0NUUkwyX0RSRFlfRU4JQklUKDMpICAvKiAxID0gZW5hYmxlIGRhdGEgcmVhZHkgc2lnbmFsICovCisjZGVmaW5lIEFLODk3NF9DVFJMMl9EUkRZX1BPTAlCSVQoMikgIC8qIDEgPSBkYXRhIHJlYWR5IGFjdGl2ZSBoaWdoICAgKi8KKyNkZWZpbmUgQUs4OTc0X0NUUkwyX1JFU0RFRgkoQUs4OTc0X0NUUkwyX0RSRFlfUE9MKQorCisjZGVmaW5lIEFLODk3NF9DVFJMM19SRVNFVAlCSVQoNykgLyogU29mdHdhcmUgcmVzZXQJCSAgKi8KKyNkZWZpbmUgQUs4OTc0X0NUUkwzX0ZPUkNFCUJJVCg2KSAvKiBTdGFydCBmb3JjZWQgbWVhc3VyZW1lbnQgKi8KKyNkZWZpbmUgQUs4OTc0X0NUUkwzX1NFTEZURVNUCUJJVCg0KSAvKiBTZXQgc2VsZnRlc3QgcmVnaXN0ZXIJICAqLworI2RlZmluZSBBSzg5NzRfQ1RSTDNfUkVTREVGCTB4MDAKKworI2RlZmluZSBBSzg5NzRfSU5UX0NUUkxfWEVOCUJJVCg3KSAvKiBFbmFibGUgaW50ZXJydXB0IGZvciB0aGlzIGF4aXMgKi8KKyNkZWZpbmUgQUs4OTc0X0lOVF9DVFJMX1lFTglCSVQoNikKKyNkZWZpbmUgQUs4OTc0X0lOVF9DVFJMX1pFTglCSVQoNSkKKyNkZWZpbmUgQUs4OTc0X0lOVF9DVFJMX1hZWkVOCShCSVQoNyl8QklUKDYpfEJJVCg1KSkKKyNkZWZpbmUgQUs4OTc0X0lOVF9DVFJMX1BPTAlCSVQoMykgLyogMCA9IGFjdGl2ZSBsb3c7IDEgPSBhY3RpdmUgaGlnaCAqLworI2RlZmluZSBBSzg5NzRfSU5UX0NUUkxfUFVMU0UJQklUKDEpIC8qIDAgPSBsYXRjaGVkOyAxID0gcHVsc2UgKDUwIHVzZWMpICovCisjZGVmaW5lIEFLODk3NF9JTlRfQ1RSTF9SRVNERUYJKEFLODk3NF9JTlRfQ1RSTF9YWVpFTiB8IEFLODk3NF9JTlRfQ1RSTF9QT0wpCisKKy8qIFRoZSBBTUkzMDUgaGFzIGVsYWJvcmF0ZSBGVyB2ZXJzaW9uIGFuZCBzZXJpYWwgbnVtYmVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBBTUkzMDVfVkVSCQkweEU4CisjZGVmaW5lIEFNSTMwNV9TTgkJMHhFQQorCisjZGVmaW5lIEFLODk3NF9NQVhfUkFOR0UJMjA0OAorCisjZGVmaW5lIEFLODk3NF9QT1dFUk9OX0RFTEFZCTUwCisjZGVmaW5lIEFLODk3NF9BQ1RJVkFURV9ERUxBWQkxCisjZGVmaW5lIEFLODk3NF9TRUxGVEVTVF9ERUxBWQkxCisvKgorICogU2V0IHRoZSBhdXRvc3VzcGVuZCB0byB0d28gb3JkZXJzIG9mIG1hZ25pdHVkZSBsYXJnZXIgdGhhbiB0aGUgcG93ZXJvbgorICogZGVsYXkgdG8gbWFrZSBzYW5lIHJlYXNvbmFibGUgcG93ZXIgdHJhZGVvZmYgc2F2aW5ncyAoNSBzZWNvbmRzIGluCisgKiB0aGlzIGNhc2UpLgorICovCisjZGVmaW5lIEFLODk3NF9BVVRPU1VTUEVORF9ERUxBWSA1MDAwCisKKyNkZWZpbmUgQUs4OTc0X01FQVNUSU1FCQkzCisKKyNkZWZpbmUgQUs4OTc0X1BXUl9PTgkJMQorI2RlZmluZSBBSzg5NzRfUFdSX09GRgkJMAorCisvKioKKyAqIHN0cnVjdCBhazg5NzQgLSBzdGF0ZSBjb250YWluZXIgZm9yIHRoZSBBSzg5NzQgZHJpdmVyCisgKiBAaTJjOiBwYXJlbnQgSTJDIGNsaWVudAorICogQG9yaWVudGF0aW9uOiBtb3VudGluZyBtYXRyaXgsIGZsaXBwZWQgYXhpcyBldGMKKyAqIEBtYXA6IHJlZ21hcCB0byBhY2Nlc3MgdGhlIEFLODk3NCByZWdpc3RlcnMgb3ZlciBJMkMKKyAqIEByZWdzOiB0aGUgYXZkZCBhbmQgZHZkZCBwb3dlciByZWd1bGF0b3JzCisgKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIHBhcnQKKyAqIEB2YXJpYW50OiB0aGUgd2hvYW1pIElEIHZhbHVlIChmb3Igc2VsZWN0aW5nIGNvZGUgcGF0aHMpCisgKiBAbG9jazogbG9ja3MgdGhlIG1hZ25ldG9tZXRlciBmb3IgZXhjbHVzaXZlIHVzZSBkdXJpbmcgYSBtZWFzdXJlbWVudAorICogQGRyZHlfaXJxOiB1c2VzIHRoZSBEUkRZIElSUSBsaW5lCisgKiBAZHJkeV9jb21wbGV0ZTogY29tcGxldGlvbiBmb3IgRFJEWQorICogQGRyZHlfYWN0aXZlX2xvdzogdGhlIERSRFkgSVJRIGlzIGFjdGl2ZSBsb3cKKyAqLworc3RydWN0IGFrODk3NCB7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYzsKKwlzdHJ1Y3QgaWlvX21vdW50X21hdHJpeCBvcmllbnRhdGlvbjsKKwlzdHJ1Y3QgcmVnbWFwICptYXA7CisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgcmVnc1syXTsKKwljb25zdCBjaGFyICpuYW1lOworCXU4IHZhcmlhbnQ7CisJc3RydWN0IG11dGV4IGxvY2s7CisJYm9vbCBkcmR5X2lycTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBkcmR5X2NvbXBsZXRlOworCWJvb2wgZHJkeV9hY3RpdmVfbG93OworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgYWs4OTc0X3JlZ19hdmRkW10gPSAiYXZkZCI7CitzdGF0aWMgY29uc3QgY2hhciBhazg5NzRfcmVnX2R2ZGRbXSA9ICJkdmRkIjsKKworc3RhdGljIGludCBhazg5NzRfc2V0X3Bvd2VyKHN0cnVjdCBhazg5NzQgKmFrODk3NCwgYm9vbCBtb2RlKQoreworCWludCByZXQ7CisJdTggdmFsOworCisJdmFsID0gbW9kZSA/IEFLODk3NF9DVFJMMV9QT1dFUiA6IDA7CisJdmFsIHw9IEFLODk3NF9DVFJMMV9GT1JDRV9FTjsKKwlyZXQgPSByZWdtYXBfd3JpdGUoYWs4OTc0LT5tYXAsIEFLODk3NF9DVFJMMSwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChtb2RlKQorCQltc2xlZXAoQUs4OTc0X0FDVElWQVRFX0RFTEFZKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFrODk3NF9yZXNldChzdHJ1Y3QgYWs4OTc0ICphazg5NzQpCit7CisJaW50IHJldDsKKworCS8qIFBvd2VyIG9uIHRvIGdldCByZWdpc3RlciBhY2Nlc3MuIFNldHMgQ1RSTDEgcmVnIHRvIHJlc2V0IHN0YXRlICovCisJcmV0ID0gYWs4OTc0X3NldF9wb3dlcihhazg5NzQsIEFLODk3NF9QV1JfT04pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmVnbWFwX3dyaXRlKGFrODk3NC0+bWFwLCBBSzg5NzRfQ1RSTDIsIEFLODk3NF9DVFJMMl9SRVNERUYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmVnbWFwX3dyaXRlKGFrODk3NC0+bWFwLCBBSzg5NzRfQ1RSTDMsIEFLODk3NF9DVFJMM19SRVNERUYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmVnbWFwX3dyaXRlKGFrODk3NC0+bWFwLCBBSzg5NzRfSU5UX0NUUkwsCisJCQkgICBBSzg5NzRfSU5UX0NUUkxfUkVTREVGKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogQWZ0ZXIgcmVzZXQsIHBvd2VyIG9mZiBpcyBkZWZhdWx0IHN0YXRlICovCisJcmV0dXJuIGFrODk3NF9zZXRfcG93ZXIoYWs4OTc0LCBBSzg5NzRfUFdSX09GRik7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X2NvbmZpZ3VyZShzdHJ1Y3QgYWs4OTc0ICphazg5NzQpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF93cml0ZShhazg5NzQtPm1hcCwgQUs4OTc0X0NUUkwyLCBBSzg5NzRfQ1RSTDJfRFJEWV9FTiB8CisJCQkgICBBSzg5NzRfQ1RSTDJfSU5UX0VOKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHJlZ21hcF93cml0ZShhazg5NzQtPm1hcCwgQUs4OTc0X0NUUkwzLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHJlZ21hcF93cml0ZShhazg5NzQtPm1hcCwgQUs4OTc0X0lOVF9DVFJMLCBBSzg5NzRfSU5UX0NUUkxfUE9MKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHJlZ21hcF93cml0ZShhazg5NzQtPm1hcCwgQUs4OTc0X1BSRVNFVCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X3RyaWdtZWFzKHN0cnVjdCBhazg5NzQgKmFrODk3NCkKK3sKKwl1bnNpZ25lZCBpbnQgY2xlYXI7CisJdTggbWFzazsKKwl1OCB2YWw7CisJaW50IHJldDsKKworCS8qIENsZWFyIGFueSBwcmV2aW91cyBtZWFzdXJlbWVudCBvdmVyZmxvdyBzdGF0dXMgKi8KKwlyZXQgPSByZWdtYXBfcmVhZChhazg5NzQtPm1hcCwgQUs4OTc0X0lOVF9DTEVBUiwgJmNsZWFyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogSWYgd2UgaGF2ZSBhIERSRFkgSVJRIGxpbmUsIHVzZSBpdCAqLworCWlmIChhazg5NzQtPmRyZHlfaXJxKSB7CisJCW1hc2sgPSBBSzg5NzRfQ1RSTDJfSU5UX0VOIHwKKwkJCUFLODk3NF9DVFJMMl9EUkRZX0VOIHwKKwkJCUFLODk3NF9DVFJMMl9EUkRZX1BPTDsKKwkJdmFsID0gQUs4OTc0X0NUUkwyX0RSRFlfRU47CisKKwkJaWYgKCFhazg5NzQtPmRyZHlfYWN0aXZlX2xvdykKKwkJCXZhbCB8PSBBSzg5NzRfQ1RSTDJfRFJEWV9QT0w7CisKKwkJaW5pdF9jb21wbGV0aW9uKCZhazg5NzQtPmRyZHlfY29tcGxldGUpOworCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoYWs4OTc0LT5tYXAsIEFLODk3NF9DVFJMMiwKKwkJCQkJIG1hc2ssIHZhbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEZvcmNlIGEgbWVhc3VyZW1lbnQgKi8KKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGFrODk3NC0+bWFwLAorCQkJCSAgQUs4OTc0X0NUUkwzLAorCQkJCSAgQUs4OTc0X0NUUkwzX0ZPUkNFLAorCQkJCSAgQUs4OTc0X0NUUkwzX0ZPUkNFKTsKK30KKworc3RhdGljIGludCBhazg5NzRfYXdhaXRfZHJkeShzdHJ1Y3QgYWs4OTc0ICphazg5NzQpCit7CisJaW50IHRpbWVvdXQgPSAyOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKworCWlmIChhazg5NzQtPmRyZHlfaXJxKSB7CisJCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYWs4OTc0LT5kcmR5X2NvbXBsZXRlLAorCQkJCQkxICsgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJCWlmICghcmV0KSB7CisJCQlkZXZfZXJyKCZhazg5NzQtPmkyYy0+ZGV2LAorCQkJCSJ0aW1lb3V0IHdhaXRpbmcgZm9yIERSRFkgSVJRXG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIERlZmF1bHQgZGVsYXktYmFzZWQgcG9sbCBsb29wICovCisJZG8geworCQltc2xlZXAoQUs4OTc0X01FQVNUSU1FKTsKKwkJcmV0ID0gcmVnbWFwX3JlYWQoYWs4OTc0LT5tYXAsIEFLODk3NF9TVEFUVVMsICZ2YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmICh2YWwgJiBBSzg5NzRfU1RBVFVTX0RSRFkpCisJCQlyZXR1cm4gMDsKKwl9IHdoaWxlICgtLXRpbWVvdXQpOworCWlmICghdGltZW91dCkgeworCQlkZXZfZXJyKCZhazg5NzQtPmkyYy0+ZGV2LAorCQkJInRpbWVvdXQgd2FpdGluZyBmb3IgRFJEWVxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFrODk3NF9nZXRyZXN1bHQoc3RydWN0IGFrODk3NCAqYWs4OTc0LCBzMTYgKnJlc3VsdCkKK3sKKwl1bnNpZ25lZCBpbnQgc3JjOworCWludCByZXQ7CisKKwlyZXQgPSBhazg5NzRfYXdhaXRfZHJkeShhazg5NzQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gcmVnbWFwX3JlYWQoYWs4OTc0LT5tYXAsIEFLODk3NF9JTlRfU1JDLCAmc3JjKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE91dCBvZiByYW5nZSBvdmVyZmxvdyEgU3Ryb25nIG1hZ25ldCBjbG9zZT8gKi8KKwlpZiAoc3JjICYgQUs4OTc0X0lOVF9SQU5HRSkgeworCQlkZXZfZXJyKCZhazg5NzQtPmkyYy0+ZGV2LAorCQkJInJhbmdlIG92ZXJmbG93IGluIHNlbnNvclxuIik7CisJCXJldHVybiAtRVJBTkdFOworCX0KKworCXJldCA9IHJlZ21hcF9idWxrX3JlYWQoYWs4OTc0LT5tYXAsIEFLODk3NF9EQVRBX1gsIHJlc3VsdCwgNik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhazg5NzRfZHJkeV9pcnEoaW50IGlycSwgdm9pZCAqZCkKK3sKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPSBkOworCisJaWYgKCFhazg5NzQtPmRyZHlfaXJxKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwkvKiBUT0RPOiB0aW1lc3RhbXAgaGVyZSB0byBnZXQgZ29vZCBtZWFzdXJlbWVudCBzdGFtcHMgKi8KKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWs4OTc0X2RyZHlfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkKQoreworCXN0cnVjdCBhazg5NzQgKmFrODk3NCA9IGQ7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCisJLyogQ2hlY2sgaWYgdGhpcyB3YXMgYSBEUkRZIGZyb20gdXMgKi8KKwlyZXQgPSByZWdtYXBfcmVhZChhazg5NzQtPm1hcCwgQUs4OTc0X1NUQVRVUywgJnZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmYWs4OTc0LT5pMmMtPmRldiwgImVycm9yIHJlYWRpbmcgRFJEWSBzdGF0dXNcbiIpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCWlmICh2YWwgJiBBSzg5NzRfU1RBVFVTX0RSRFkpIHsKKwkJLyogWWVzIHRoaXMgd2FzIG91ciBJUlEgKi8KKwkJY29tcGxldGUoJmFrODk3NC0+ZHJkeV9jb21wbGV0ZSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBXZSBtYXkgYmUgb24gYSBzaGFyZWQgSVJRLCBsZXQgdGhlIG5leHQgY2xpZW50IGNoZWNrICovCisJcmV0dXJuIElSUV9OT05FOworfQorCitzdGF0aWMgaW50IGFrODk3NF9zZWxmdGVzdChzdHJ1Y3QgYWs4OTc0ICphazg5NzQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmFrODk3NC0+aTJjLT5kZXY7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3JlYWQoYWs4OTc0LT5tYXAsIEFLODk3NF9TRUxGVEVTVCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlpZiAodmFsICE9IEFLODk3NF9TRUxGVEVTVF9JRExFKSB7CisJCWRldl9lcnIoZGV2LCAic2VsZnRlc3Qgbm90IGlkbGUgYmVmb3JlIHRlc3RcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBUcmlnZ2VyIHNlbGYtdGVzdCAqLworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhhazg5NzQtPm1hcCwKKwkJCUFLODk3NF9DVFJMMywKKwkJCUFLODk3NF9DVFJMM19TRUxGVEVTVCwKKwkJCUFLODk3NF9DVFJMM19TRUxGVEVTVCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCB3cml0ZSBDVFJMM1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJbXNsZWVwKEFLODk3NF9TRUxGVEVTVF9ERUxBWSk7CisKKwlyZXQgPSByZWdtYXBfcmVhZChhazg5NzQtPm1hcCwgQUs4OTc0X1NFTEZURVNULCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh2YWwgIT0gQUs4OTc0X1NFTEZURVNUX09LKSB7CisJCWRldl9lcnIoZGV2LCAic2VsZnRlc3QgcmVzdWx0IE5PVCBPSyAoJTAyeClcbiIsIHZhbCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IHJlZ21hcF9yZWFkKGFrODk3NC0+bWFwLCBBSzg5NzRfU0VMRlRFU1QsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKHZhbCAhPSBBSzg5NzRfU0VMRlRFU1RfSURMRSkgeworCQlkZXZfZXJyKGRldiwgInNlbGZ0ZXN0IG5vdCBpZGxlIGFmdGVyIHRlc3QgKCUwMngpXG4iLCB2YWwpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZGV2X2RiZyhkZXYsICJwYXNzZWQgc2VsZi10ZXN0XG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFrODk3NF9nZXRfdTE2X3ZhbChzdHJ1Y3QgYWs4OTc0ICphazg5NzQsIHU4IHJlZywgdTE2ICp2YWwpCit7CisJaW50IHJldDsKKwl1MTYgYnVsazsKKworCXJldCA9IHJlZ21hcF9idWxrX3JlYWQoYWs4OTc0LT5tYXAsIHJlZywgJmJ1bGssIDIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJKnZhbCA9IGxlMTZfdG9fY3B1KGJ1bGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X2RldGVjdChzdHJ1Y3QgYWs4OTc0ICphazg5NzQpCit7CisJdW5zaWduZWQgaW50IHdob2FtaTsKKwljb25zdCBjaGFyICpuYW1lOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGZ3OworCXUxNiBzbjsKKworCXJldCA9IHJlZ21hcF9yZWFkKGFrODk3NC0+bWFwLCBBSzg5NzRfV0hPQU1JLCAmd2hvYW1pKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoICh3aG9hbWkpIHsKKwljYXNlIEFLODk3NF9XSE9BTUlfVkFMVUVfQU1JMzA1OgorCQluYW1lID0gImFtaTMwNSI7CisJCXJldCA9IHJlZ21hcF9yZWFkKGFrODk3NC0+bWFwLCBBTUkzMDVfVkVSLCAmZncpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJZncgJj0gMHg3ZjsgLyogb25seSBiaXRzIDAgdGhydSA2IHZhbGlkICovCisJCXJldCA9IGFrODk3NF9nZXRfdTE2X3ZhbChhazg5NzQsIEFNSTMwNV9TTiwgJnNuKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWRldl9pbmZvKCZhazg5NzQtPmkyYy0+ZGV2LAorCQkJICJkZXRlY3RlZCAlcywgRlcgdmVyICUwMngsIFMvTjogJTA0eFxuIiwKKwkJCSBuYW1lLCBmdywgc24pOworCQlicmVhazsKKwljYXNlIEFLODk3NF9XSE9BTUlfVkFMVUVfQUs4OTc0OgorCQluYW1lID0gImFrODk3NCI7CisJCWRldl9pbmZvKCZhazg5NzQtPmkyYy0+ZGV2LCAiZGV0ZWN0ZWQgQUs4OTc0XG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmYWs4OTc0LT5pMmMtPmRldiwgInVuc3VwcG9ydGVkIGRldmljZSAoJTAyeCkgIiwKKwkJCXdob2FtaSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWFrODk3NC0+bmFtZSA9IG5hbWU7CisJYWs4OTc0LT52YXJpYW50ID0gd2hvYW1pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWs4OTc0X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgIGludCAqdmFsLCBpbnQgKnZhbDIsCisJCQkgICBsb25nIG1hc2spCit7CisJc3RydWN0IGFrODk3NCAqYWs4OTc0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzMTYgaHdfdmFsdWVzWzNdOworCWludCByZXQgPSAtRUlOVkFMOworCisJcG1fcnVudGltZV9nZXRfc3luYygmYWs4OTc0LT5pMmMtPmRldik7CisJbXV0ZXhfbG9jaygmYWs4OTc0LT5sb2NrKTsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCWlmIChjaGFuLT5hZGRyZXNzID4gMikgeworCQkJZGV2X2VycigmYWs4OTc0LT5pMmMtPmRldiwgImZhdWx0eSBjaGFubmVsIGFkZHJlc3NcbiIpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlyZXQgPSBhazg5NzRfdHJpZ21lYXMoYWs4OTc0KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJcmV0ID0gYWs4OTc0X2dldHJlc3VsdChhazg5NzQsIGh3X3ZhbHVlcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF91bmxvY2s7CisKKwkJLyoKKwkJICogV2UgcmVhZCBhbGwgYXhlcyBhbmQgZGlzY2FyZCBhbGwgYnV0IG9uZSwgZm9yIG9wdGltaXplZAorCQkgKiByZWFkaW5nLCB1c2UgdGhlIHRyaWdnZXJlZCBidWZmZXIuCisJCSAqLworCQkqdmFsID0gbGUxNl90b19jcHUoaHdfdmFsdWVzW2NoYW4tPmFkZHJlc3NdKTsKKworCQlyZXQgPSBJSU9fVkFMX0lOVDsKKwl9CisKKyBvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmYWs4OTc0LT5sb2NrKTsKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZhazg5NzQtPmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZCgmYWs4OTc0LT5pMmMtPmRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBhazg5NzRfZmlsbF9idWZmZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisJczE2IGh3X3ZhbHVlc1s4XTsgLyogVGhyZWUgYXhlcyArIDY0Yml0IHBhZGRpbmcgKi8KKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJmFrODk3NC0+aTJjLT5kZXYpOworCW11dGV4X2xvY2soJmFrODk3NC0+bG9jayk7CisKKwlyZXQgPSBhazg5NzRfdHJpZ21lYXMoYWs4OTc0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmFrODk3NC0+aTJjLT5kZXYsICJlcnJvciB0cmlnZ2VyaW5nIG1lYXN1cmVcbiIpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJldCA9IGFrODk3NF9nZXRyZXN1bHQoYWs4OTc0LCBod192YWx1ZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmYWs4OTc0LT5pMmMtPmRldiwgImVycm9yIGdldHRpbmcgbWVhc3VyZXNcbiIpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWlvX3B1c2hfdG9fYnVmZmVyc193aXRoX3RpbWVzdGFtcChpbmRpb19kZXYsIGh3X3ZhbHVlcywKKwkJCQkJICAgaWlvX2dldF90aW1lX25zKGluZGlvX2RldikpOworCisgb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmFrODk3NC0+bG9jayk7CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeSgmYWs4OTc0LT5pMmMtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoJmFrODk3NC0+aTJjLT5kZXYpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYWs4OTc0X2hhbmRsZV90cmlnZ2VyKGludCBpcnEsIHZvaWQgKnApCit7CisJY29uc3Qgc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKKworCWFrODk3NF9maWxsX2J1ZmZlcihpbmRpb19kZXYpOworCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX21vdW50X21hdHJpeCAqCithazg5NzRfZ2V0X21vdW50X21hdHJpeChjb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4pCit7CisJc3RydWN0IGFrODk3NCAqYWs4OTc0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJldHVybiAmYWs4OTc0LT5vcmllbnRhdGlvbjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjX2V4dF9pbmZvIGFrODk3NF9leHRfaW5mb1tdID0geworCUlJT19NT1VOVF9NQVRSSVgoSUlPX1NIQVJFRF9CWV9ESVIsIGFrODk3NF9nZXRfbW91bnRfbWF0cml4KSwKKwl7IH0sCit9OworCisjZGVmaW5lIEFLODk3NF9BWElTX0NIQU5ORUwoYXhpcywgaW5kZXgpCQkJCVwKKwl7CQkJCQkJCQlcCisJCS50eXBlID0gSUlPX01BR04sCQkJCQlcCisJCS5tb2RpZmllZCA9IDEsCQkJCQkJXAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EXyMjYXhpcywJCQkJXAorCQkuaW5mb19tYXNrX3NlcGFyYXRlID0gQklUKElJT19DSEFOX0lORk9fUkFXKSwJCVwKKwkJLmV4dF9pbmZvID0gYWs4OTc0X2V4dF9pbmZvLAkJCQlcCisJCS5hZGRyZXNzID0gaW5kZXgsCQkJCQlcCisJCS5zY2FuX2luZGV4ID0gaW5kZXgsCQkJCQlcCisJCS5zY2FuX3R5cGUgPSB7CQkJCQkJXAorCQkJLnNpZ24gPSAncycsCQkJCQlcCisJCQkucmVhbGJpdHMgPSAxNiwJCQkJCVwKKwkJCS5zdG9yYWdlYml0cyA9IDE2LAkJCQlcCisJCQkuZW5kaWFubmVzcyA9IElJT19MRQkJCQlcCisJCX0sCQkJCQkJCVwKKwl9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBhazg5NzRfY2hhbm5lbHNbXSA9IHsKKwlBSzg5NzRfQVhJU19DSEFOTkVMKFgsIDApLAorCUFLODk3NF9BWElTX0NIQU5ORUwoWSwgMSksCisJQUs4OTc0X0FYSVNfQ0hBTk5FTChaLCAyKSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgzKSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGFrODk3NF9zY2FuX21hc2tzW10gPSB7IDB4NywgMCB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFrODk3NF9pbmZvID0geworCS5yZWFkX3JhdyA9ICZhazg5NzRfcmVhZF9yYXcsCisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBib29sIGFrODk3NF93cml0ZWFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjKTsKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIEFLODk3NF9DVFJMMToKKwljYXNlIEFLODk3NF9DVFJMMjoKKwljYXNlIEFLODk3NF9DVFJMMzoKKwljYXNlIEFLODk3NF9JTlRfQ1RSTDoKKwljYXNlIEFLODk3NF9JTlRfVEhSRVM6CisJY2FzZSBBSzg5NzRfSU5UX1RIUkVTICsgMToKKwljYXNlIEFLODk3NF9QUkVTRVQ6CisJY2FzZSBBSzg5NzRfUFJFU0VUICsgMToKKwkJcmV0dXJuIHRydWU7CisJY2FzZSBBSzg5NzRfT0ZGU0VUX1g6CisJY2FzZSBBSzg5NzRfT0ZGU0VUX1ggKyAxOgorCWNhc2UgQUs4OTc0X09GRlNFVF9ZOgorCWNhc2UgQUs4OTc0X09GRlNFVF9ZICsgMToKKwljYXNlIEFLODk3NF9PRkZTRVRfWjoKKwljYXNlIEFLODk3NF9PRkZTRVRfWiArIDE6CisJCWlmIChhazg5NzQtPnZhcmlhbnQgPT0gQUs4OTc0X1dIT0FNSV9WQUxVRV9BSzg5NzQpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCWNhc2UgQU1JMzA1X09GRlNFVF9YOgorCWNhc2UgQU1JMzA1X09GRlNFVF9YICsgMToKKwljYXNlIEFNSTMwNV9PRkZTRVRfWToKKwljYXNlIEFNSTMwNV9PRkZTRVRfWSArIDE6CisJY2FzZSBBTUkzMDVfT0ZGU0VUX1o6CisJY2FzZSBBTUkzMDVfT0ZGU0VUX1ogKyAxOgorCQlpZiAoYWs4OTc0LT52YXJpYW50ID09IEFLODk3NF9XSE9BTUlfVkFMVUVfQU1JMzA1KQorCQkJcmV0dXJuIHRydWU7CisJCXJldHVybiBmYWxzZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWs4OTc0X3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gOCwKKwkudmFsX2JpdHMgPSA4LAorCS5tYXhfcmVnaXN0ZXIgPSAweGZmLAorCS53cml0ZWFibGVfcmVnID0gYWs4OTc0X3dyaXRlYWJsZV9yZWcsCit9OworCitzdGF0aWMgaW50IGFrODk3NF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IGFrODk3NCAqYWs4OTc0OworCXVuc2lnbmVkIGxvbmcgaXJxX3RyaWc7CisJaW50IGlycSA9IGkyYy0+aXJxOworCWludCByZXQ7CisKKwkvKiBSZWdpc3RlciB3aXRoIElJTyAqLworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmaTJjLT5kZXYsIHNpemVvZigqYWs4OTc0KSk7CisJaWYgKGluZGlvX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFrODk3NCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgaW5kaW9fZGV2KTsKKwlhazg5NzQtPmkyYyA9IGkyYzsKKwltdXRleF9pbml0KCZhazg5NzQtPmxvY2spOworCisJcmV0ID0gb2ZfaWlvX3JlYWRfbW91bnRfbWF0cml4KCZpMmMtPmRldiwKKwkJCQkgICAgICAgIm1vdW50LW1hdHJpeCIsCisJCQkJICAgICAgICZhazg5NzQtPm9yaWVudGF0aW9uKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYWs4OTc0LT5yZWdzWzBdLnN1cHBseSA9IGFrODk3NF9yZWdfYXZkZDsKKwlhazg5NzQtPnJlZ3NbMV0uc3VwcGx5ID0gYWs4OTc0X3JlZ19kdmRkOworCisJcmV0ID0gZGV2bV9yZWd1bGF0b3JfYnVsa19nZXQoJmkyYy0+ZGV2LAorCQkJCSAgICAgIEFSUkFZX1NJWkUoYWs4OTc0LT5yZWdzKSwKKwkJCQkgICAgICBhazg5NzQtPnJlZ3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiY2Fubm90IGdldCByZWd1bGF0b3JzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShhazg5NzQtPnJlZ3MpLCBhazg5NzQtPnJlZ3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiY2Fubm90IGVuYWJsZSByZWd1bGF0b3JzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBUYWtlIHJ1bnRpbWUgUE0gb25saW5lICovCisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoJmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoJmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmaTJjLT5kZXYpOworCisJYWs4OTc0LT5tYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhpMmMsICZhazg5NzRfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihhazg5NzQtPm1hcCkpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcmVnaXN0ZXIgbWFwXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoYWs4OTc0LT5tYXApOworCX0KKworCXJldCA9IGFrODk3NF9zZXRfcG93ZXIoYWs4OTc0LCBBSzg5NzRfUFdSX09OKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiY291bGQgbm90IHBvd2VyIG9uXG4iKTsKKwkJZ290byBwb3dlcl9vZmY7CisJfQorCisJcmV0ID0gYWs4OTc0X2RldGVjdChhazg5NzQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJuZWl0aGVyIEFLODk3NCBub3IgQU1JMzA1IGZvdW5kXG4iKTsKKwkJZ290byBwb3dlcl9vZmY7CisJfQorCisJcmV0ID0gYWs4OTc0X3NlbGZ0ZXN0KGFrODk3NCk7CisJaWYgKHJldCkKKwkJZGV2X2VycigmaTJjLT5kZXYsICJzZWxmdGVzdCBmYWlsZWQgKGNvbnRpbnVpbmcgYW55d2F5KVxuIik7CisKKwlyZXQgPSBhazg5NzRfcmVzZXQoYWs4OTc0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiQUs4OTc0IHJlc2V0IGZhaWxlZFxuIik7CisJCWdvdG8gcG93ZXJfb2ZmOworCX0KKworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KCZpMmMtPmRldiwKKwkJCQkJIEFLODk3NF9BVVRPU1VTUEVORF9ERUxBWSk7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoJmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dCgmaTJjLT5kZXYpOworCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmkyYy0+ZGV2OworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBhazg5NzRfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFrODk3NF9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5pbmZvID0gJmFrODk3NF9pbmZvOworCWluZGlvX2Rldi0+YXZhaWxhYmxlX3NjYW5fbWFza3MgPSBhazg5NzRfc2Nhbl9tYXNrczsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5uYW1lID0gYWs4OTc0LT5uYW1lOworCisJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAorCQkJCQkgYWs4OTc0X2hhbmRsZV90cmlnZ2VyLAorCQkJCQkgTlVMTCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgInRyaWdnZXJlZCBidWZmZXIgc2V0dXAgZmFpbGVkXG4iKTsKKwkJZ290byBkaXNhYmxlX3BtOworCX0KKworCS8qIElmIHdlIGhhdmUgYSB2YWxpZCBEUkRZIElSUSwgbWFrZSB1c2Ugb2YgaXQgKi8KKwlpZiAoaXJxID4gMCkgeworCQlpcnFfdHJpZyA9IGlycWRfZ2V0X3RyaWdnZXJfdHlwZShpcnFfZ2V0X2lycV9kYXRhKGlycSkpOworCQlpZiAoaXJxX3RyaWcgPT0gSVJRRl9UUklHR0VSX1JJU0lORykgeworCQkJZGV2X2luZm8oJmkyYy0+ZGV2LCAiZW5hYmxlIHJpc2luZyBlZGdlIERSRFkgSVJRXG4iKTsKKwkJfSBlbHNlIGlmIChpcnFfdHJpZyA9PSBJUlFGX1RSSUdHRVJfRkFMTElORykgeworCQkJYWs4OTc0LT5kcmR5X2FjdGl2ZV9sb3cgPSB0cnVlOworCQkJZGV2X2luZm8oJmkyYy0+ZGV2LCAiZW5hYmxlIGZhbGxpbmcgZWRnZSBEUkRZIElSUVxuIik7CisJCX0gZWxzZSB7CisJCQlpcnFfdHJpZyA9IElSUUZfVFJJR0dFUl9SSVNJTkc7CisJCX0KKwkJaXJxX3RyaWcgfD0gSVJRRl9PTkVTSE9UOworCQlpcnFfdHJpZyB8PSBJUlFGX1NIQVJFRDsKKworCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZpMmMtPmRldiwKKwkJCQkJCWlycSwKKwkJCQkJCWFrODk3NF9kcmR5X2lycSwKKwkJCQkJCWFrODk3NF9kcmR5X2lycV90aHJlYWQsCisJCQkJCQlpcnFfdHJpZywKKwkJCQkJCWFrODk3NC0+bmFtZSwKKwkJCQkJCWFrODk3NCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmkyYy0+ZGV2LCAidW5hYmxlIHRvIHJlcXVlc3QgRFJEWSBJUlEgIgorCQkJCSItIHByb2NlZWRpbmcgd2l0aG91dCBJUlFcbiIpOworCQkJZ290byBub19pcnE7CisJCX0KKwkJYWs4OTc0LT5kcmR5X2lycSA9IHRydWU7CisJfQorCitub19pcnE6CisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJkZXZpY2UgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBjbGVhbnVwX2J1ZmZlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworY2xlYW51cF9idWZmZXI6CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworZGlzYWJsZV9wbToKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJmkyYy0+ZGV2KTsKKwlhazg5NzRfc2V0X3Bvd2VyKGFrODk3NCwgQUs4OTc0X1BXUl9PRkYpOworcG93ZXJfb2ZmOgorCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShhazg5NzQtPnJlZ3MpLCBhazg5NzQtPnJlZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2V4aXQgYWs4OTc0X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjKTsKKwlzdHJ1Y3QgYWs4OTc0ICphazg5NzQgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJmkyYy0+ZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJmkyYy0+ZGV2KTsKKwlhazg5NzRfc2V0X3Bvd2VyKGFrODk3NCwgQUs4OTc0X1BXUl9PRkYpOworCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShhazg5NzQtPnJlZ3MpLCBhazg5NzQtPnJlZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgYWs4OTc0X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFrODk3NCAqYWs4OTc0ID0KKwkJaWlvX3ByaXYoaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSkpOworCisJYWs4OTc0X3NldF9wb3dlcihhazg5NzQsIEFLODk3NF9QV1JfT0ZGKTsKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUoYWs4OTc0LT5yZWdzKSwgYWs4OTc0LT5yZWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGFrODk3NF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFrODk3NCAqYWs4OTc0ID0KKwkJaWlvX3ByaXYoaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSkpOworCWludCByZXQ7CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRShhazg5NzQtPnJlZ3MpLCBhazg5NzQtPnJlZ3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJbXNsZWVwKEFLODk3NF9QT1dFUk9OX0RFTEFZKTsKKwlyZXQgPSBhazg5NzRfc2V0X3Bvd2VyKGFrODk3NCwgQUs4OTc0X1BXUl9PTik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcmVndWxhdG9yX2Rpc2FibGU7CisKKwlyZXQgPSBhazg5NzRfY29uZmlndXJlKGFrODk3NCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZGlzYWJsZV9wb3dlcjsKKworCXJldHVybiAwOworCitvdXRfZGlzYWJsZV9wb3dlcjoKKwlhazg5NzRfc2V0X3Bvd2VyKGFrODk3NCwgQUs4OTc0X1BXUl9PRkYpOworb3V0X3JlZ3VsYXRvcl9kaXNhYmxlOgorCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRShhazg5NzQtPnJlZ3MpLCBhazg5NzQtPnJlZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGFrODk3NF9kZXZfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZCwKKwkJCQlwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMoYWs4OTc0X3J1bnRpbWVfc3VzcGVuZCwKKwkJCSAgIGFrODk3NF9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhazg5NzRfaWRbXSA9IHsKKwl7ImFtaTMwNSIsIDAgfSwKKwl7ImFrODk3NCIsIDAgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhazg5NzRfaWQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhazg5NzRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFzYWhpLWthc2VpLGFrODk3NCIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhazg5NzRfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWs4OTc0X2RyaXZlciA9IHsKKwkuZHJpdmVyCSA9IHsKKwkJLm5hbWUJPSAiYWs4OTc0IiwKKwkJLnBtID0gJmFrODk3NF9kZXZfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoYWs4OTc0X29mX21hdGNoKSwKKwl9LAorCS5wcm9iZQkgID0gYWs4OTc0X3Byb2JlLAorCS5yZW1vdmUJICA9IF9fZXhpdF9wKGFrODk3NF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFrODk3NF9pZCwKK307Cittb2R1bGVfaTJjX2RyaXZlcihhazg5NzRfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBSzg5NzQgYW5kIEFNSTMwNSAzLWF4aXMgbWFnbmV0b21ldGVyIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiU2FtdSBPbmthbG8iKTsKK01PRFVMRV9BVVRIT1IoIkxpbnVzIFdhbGxlaWoiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvbWFnMzExMC5jCmluZGV4IGYyYmU0YTAuLmYyYjNiZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMKKysrIGIvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL21hZzMxMTAuYwpAQCAtMTU0LDM0ICsxNTQsNDEgQEAKIAogCXN3aXRjaCAobWFzaykgewogCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6Ci0JCWlmIChpaW9fYnVmZmVyX2VuYWJsZWQoaW5kaW9fZGV2KSkKLQkJCXJldHVybiAtRUJVU1k7CisJCXJldCA9IGlpb19kZXZpY2VfY2xhaW1fZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAKIAkJc3dpdGNoIChjaGFuLT50eXBlKSB7CiAJCWNhc2UgSUlPX01BR046IC8qIGluIDAuMSB1VCAvIExTQiAqLwogCQkJcmV0ID0gbWFnMzExMF9yZWFkKGRhdGEsIGJ1ZmZlcik7CiAJCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OworCQkJCWdvdG8gcmVsZWFzZTsKIAkJCSp2YWwgPSBzaWduX2V4dGVuZDMyKAogCQkJCWJlMTZfdG9fY3B1KGJ1ZmZlcltjaGFuLT5zY2FuX2luZGV4XSksIDE1KTsKLQkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJCXJldCA9IElJT19WQUxfSU5UOworCQkJYnJlYWs7CiAJCWNhc2UgSUlPX1RFTVA6IC8qIGluIDEgQyAvIExTQiAqLwogCQkJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7CiAJCQlyZXQgPSBtYWczMTEwX3JlcXVlc3QoZGF0YSk7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7Ci0JCQkJcmV0dXJuIHJldDsKKwkJCQlnb3RvIHJlbGVhc2U7CiAJCQl9CiAJCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAogCQkJCU1BRzMxMTBfRElFX1RFTVApOwogCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKIAkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7CisJCQkJZ290byByZWxlYXNlOwogCQkJKnZhbCA9IHNpZ25fZXh0ZW5kMzIocmV0LCA3KTsKLQkJCXJldHVybiBJSU9fVkFMX0lOVDsKKwkJCXJldCA9IElJT19WQUxfSU5UOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldCA9IC1FSU5WQUw7CiAJCX0KK3JlbGVhc2U6CisJCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCQlyZXR1cm4gcmV0OworCiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgogCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKIAkJY2FzZSBJSU9fTUFHTjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL0tjb25maWcgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9LY29uZmlnCmluZGV4IGQxMzBjZGMuLjE1Y2Q0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL0tjb25maWcKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZwpAQCAtOCw4ICs4LDYgQEAKIGNvbmZpZyBCTVAyODAKIAl0cmlzdGF0ZSAiQm9zY2ggU2Vuc29ydGVjIEJNUDE4MC9CTVAyODAgcHJlc3N1cmUgc2Vuc29yIEkyQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiAoSTJDIHx8IFNQSV9NQVNURVIpCi0JZGVwZW5kcyBvbiAhKEJNUDA4NV9JMkM9eSB8fCBCTVAwODVfSTJDPW0pCi0JZGVwZW5kcyBvbiAhKEJNUDA4NV9TUEk9eSB8fCBCTVAwODVfU1BJPW0pCiAJc2VsZWN0IFJFR01BUAogCXNlbGVjdCBCTVAyODBfSTJDIGlmIChJMkMpCiAJc2VsZWN0IEJNUDI4MF9TUEkgaWYgKFNQSV9NQVNURVIpCkBAIC0xODcsNCArMTg1LDI2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAogCSAgYmUgY2FsbGVkIGhwMjA2Yy4KIAorY29uZmlnIFpQQTIzMjYKKwl0cmlzdGF0ZSAiTXVyYXRhIFpQQTIzMjYgcHJlc3N1cmUgc2Vuc29yIGRyaXZlciIKKwlzZWxlY3QgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgorCXNlbGVjdCBSRUdNQVAKKwlzZWxlY3QgWlBBMjMyNl9JMkMgaWYgSTJDCisJc2VsZWN0IFpQQTIzMjZfU1BJIGlmIFNQSV9NQVNURVIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBhbmQKKwkgIHRlbXBlcmF0dXJlIHNlbnNvci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgenBhMjMyNi4KKworY29uZmlnIFpQQTIzMjZfSTJDCisJdHJpc3RhdGUKKwlzZWxlY3QgUkVHTUFQX0kyQworCitjb25maWcgWlBBMjMyNl9TUEkKKwl0cmlzdGF0ZQorCXNlbGVjdCBSRUdNQVBfU1BJCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL01ha2VmaWxlIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUKaW5kZXggN2YzOTViZS4uZmZmNzcxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvTWFrZWZpbGUKQEAgLTIyLDYgKzIyLDkgQEAKIHN0X3ByZXNzdXJlLSQoQ09ORklHX0lJT19CVUZGRVIpICs9IHN0X3ByZXNzdXJlX2J1ZmZlci5vCiBvYmotJChDT05GSUdfVDU0MDMpICs9IHQ1NDAzLm8KIG9iai0kKENPTkZJR19IUDIwNkMpICs9IGhwMjA2Yy5vCitvYmotJChDT05GSUdfWlBBMjMyNikgKz0genBhMjMyNi5vCitvYmotJChDT05GSUdfWlBBMjMyNl9JMkMpICs9IHpwYTIzMjZfaTJjLm8KK29iai0kKENPTkZJR19aUEEyMzI2X1NQSSkgKz0genBhMjMyNl9zcGkubwogCiBvYmotJChDT05GSUdfSUlPX1NUX1BSRVNTX0kyQykgKz0gc3RfcHJlc3N1cmVfaTJjLm8KIG9iai0kKENPTkZJR19JSU9fU1RfUFJFU1NfU1BJKSArPSBzdF9wcmVzc3VyZV9zcGkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvYm1wMjgwLWNvcmUuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL2JtcDI4MC1jb3JlLmMKaW5kZXggNjk0MzY4OC4uZTVhNTMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvYm1wMjgwLWNvcmUuYworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9ibXAyODAtY29yZS5jCkBAIC05NzAsNyArOTcwLDcgQEAKIAlkYXRhLT52ZGRhID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGRldiwgInZkZGEiKTsKIAlpZiAoSVNfRVJSKGRhdGEtPnZkZGEpKSB7CiAJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBWRERBIHJlZ3VsYXRvclxuIik7Ci0JCXJldCA9IFBUUl9FUlIoZGF0YS0+dmRkZCk7CisJCXJldCA9IFBUUl9FUlIoZGF0YS0+dmRkYSk7CiAJCWdvdG8gb3V0X2Rpc2FibGVfdmRkZDsKIAl9CiAJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShkYXRhLT52ZGRhKTsKQEAgLTEwNzksNyArMTA3OSw4IEBACiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGJtcDI4MF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBibXAyODBfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYm1wMjgwX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCByZXQ7CiAKIAlyZXQgPSByZWd1bGF0b3JfZGlzYWJsZShkYXRhLT52ZGRhKTsKQEAgLTEwOTAsNyArMTA5MSw4IEBACiAKIHN0YXRpYyBpbnQgYm1wMjgwX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYm1wMjgwX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJtcDI4MF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShkYXRhLT52ZGRkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMV9jb3JlLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTFfY29yZS5jCmluZGV4IGZlYjQxZjguLmE3NGVkMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMV9jb3JlLmMKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvbXM1NjExX2NvcmUuYwpAQCAtNDE2LDggKzQxNiw3IEBACiAJcmV0dXJuIDA7CiAKIGVycl9yZWd1bGF0b3JfZGlzYWJsZToKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKHN0LT52ZGQpKQotCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+dmRkKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShzdC0+dmRkKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MjUsOCArNDI0LDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgbXM1NjExX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKHN0LT52ZGQpKQotCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+dmRkKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShzdC0+dmRkKTsKIH0KIAogaW50IG1zNTYxMV9wcm9iZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBzdHJ1Y3QgZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS96cGEyMzI2LmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS96cGEyMzI2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkMmViNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjYuYwpAQCAtMCwwICsxLDE3MzUgQEAKKy8qCisgKiBNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yIElJTyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGFycm90IFMuQS4KKyAqCisgKiBBdXRob3I6IEdyZWdvciBCb2lyaWUgPGdyZWdvci5ib2lyaWVAcGFycm90LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiBET0M6IFpQQTIzMjYgdGhlb3J5IG9mIG9wZXJhdGlvbnMKKyAqCisgKiBUaGlzIGRyaXZlciBzdXBwb3J0cyAlSU5ESU9fRElSRUNUX01PREUgYW5kICVJTkRJT19CVUZGRVJfVFJJR0dFUkVEIElJTworICogbW9kZXMuCisgKiBBIGludGVybmFsIGhhcmR3YXJlIHRyaWdnZXIgaXMgYWxzbyBpbXBsZW1lbnRlZCB0byBkaXNwYXRjaCByZWdpc3RlcmVkIElJTworICogdHJpZ2dlciBjb25zdW1lcnMgdXBvbiAic2FtcGxlIHJlYWR5IiBpbnRlcnJ1cHRzLgorICoKKyAqIFpQQTIzMjYgaGFyZHdhcmUgc3VwcG9ydHMgMiBzYW1wbGluZyBtb2RlOiBvbmUgc2hvdCBhbmQgY29udGludW91cy4KKyAqCisgKiBBIGNvbXBsZXRlIG9uZSBzaG90IHNhbXBsaW5nIGN5Y2xlIGdldHMgZGV2aWNlIG91dCBvZiBsb3cgcG93ZXIgbW9kZSwKKyAqIHBlcmZvcm1zIHByZXNzdXJlIGFuZCB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudHMsIHRoZW4gYXV0b21hdGljYWxseSBzd2l0Y2hlcworICogYmFjayB0byBsb3cgcG93ZXIgbW9kZS4gSXQgaXMgbWVhbnQgZm9yIG9uIGRlbWFuZCBzYW1wbGluZyB3aXRoIG9wdGltYWwgcG93ZXIKKyAqIHNhdmluZyBhdCB0aGUgY29zdCBvZiBsb3dlciBzYW1wbGluZyByYXRlIGFuZCBoaWdoZXIgc29mdHdhcmUgb3ZlcmhlYWQuCisgKiBUaGlzIGlzIGEgbmF0dXJhbCBjYW5kaWRhdGUgZm9yIElJTyByZWFkX3JhdyBob29rIGltcGxlbWVudGF0aW9uCisgKiAoJUlORElPX0RJUkVDVF9NT0RFKS4gSXQgaXMgYWxzbyB1c2VkIGZvciB0cmlnZ2VyZWQgYnVmZmVyaW5nIHN1cHBvcnQgdG8KKyAqIGVuc3VyZSBleHBsaWNpdCBzeW5jaHJvbml6YXRpb24gd2l0aCBleHRlcm5hbCB0cmlnZ2VyIGV2ZW50cworICogKCVJTkRJT19CVUZGRVJfVFJJR0dFUkVEKS4KKyAqCisgKiBUaGUgY29udGludW91cyBtb2RlIHdvcmtzIGFjY29yZGluZyB0byBhIHBlcmlvZGljIGhhcmR3YXJlIG1lYXN1cmVtZW50CisgKiBwcm9jZXNzIGNvbnRpbnVvdXNseSBwdXNoaW5nIHNhbXBsZXMgaW50byBhbiBpbnRlcm5hbCBoYXJkd2FyZSBGSUZPIChmb3IKKyAqIHByZXNzdXJlIHNhbXBsZXMgb25seSkuIE1lYXN1cmVtZW50IGN5Y2xlIGNvbXBsZXRpb24gbWF5IGJlIHNpZ25hbGVkIGJ5IGEKKyAqICJzYW1wbGUgcmVhZHkiIGludGVycnVwdC4KKyAqIFR5cGljYWwgc29mdHdhcmUgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyA6CisgKiAtIGdldCBkZXZpY2Ugb3V0IG9mIGxvdyBwb3dlciBtb2RlLAorICogLSBzZXR1cCBoYXJkd2FyZSBzYW1wbGluZyBwZXJpb2QsCisgKiAtIGF0IGVuZCBvZiBwZXJpb2QsIHVwb24gZGF0YSByZWFkeSBpbnRlcnJ1cHQ6IHBvcCBwcmVzc3VyZSBzYW1wbGVzIG91dCBvZgorICogICBoYXJkd2FyZSBGSUZPIGFuZCBmZXRjaCB0ZW1wZXJhdHVyZSBzYW1wbGUKKyAqIC0gd2hlbiBubyBsb25nZXIgbmVlZGVkLCBzdG9wIHNhbXBsaW5nIHByb2Nlc3MgYnkgcHV0dGluZyBkZXZpY2UgaW50bworICogICBsb3cgcG93ZXIgbW9kZS4KKyAqIFRoaXMgbW9kZSBpcyB1c2VkIHRvIGltcGxlbWVudCAlSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCBtb2RlIGlmIGRldmljZSB0cmVlCisgKiBkZWNsYXJlcyBhIHZhbGlkIGludGVycnVwdCBsaW5lLiBJbiB0aGlzIGNhc2UsIHRoZSBpbnRlcm5hbCBoYXJkd2FyZSB0cmlnZ2VyCisgKiBkcml2ZXMgYWNxdWlzaXRpb24uCisgKgorICogTm90ZSB0aGF0IGhhcmR3YXJlIHNhbXBsaW5nIGZyZXF1ZW5jeSBpcyB0YWtlbiBpbnRvIGFjY291bnQgb25seSB3aGVuCisgKiBpbnRlcm5hbCBoYXJkd2FyZSB0cmlnZ2VyIGlzIGF0dGFjaGVkIGFzIHRoZSBoaWdoZXN0IHNhbXBsaW5nIHJhdGUgc2VlbXMgdG8KKyAqIGJlIHRoZSBtb3N0IGVuZXJneSBlZmZpY2llbnQuCisgKgorICogVE9ETzoKKyAqICAgcHJlc2V0IHByZXNzdXJlIHRocmVzaG9sZCBjcm9zc2luZyAvIElJTyBldmVudHMgOworICogICBkaWZmZXJlbnRpYWwgcHJlc3N1cmUgc2FtcGxpbmcgOworICogICBoYXJkd2FyZSBzYW1wbGVzIGF2ZXJhZ2luZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHJpZ2dlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyX2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaD4KKyNpbmNsdWRlICJ6cGEyMzI2LmgiCisKKy8qIDIwMCBtcyBzaG91bGQgYmUgZW5vdWdoIGZvciB0aGUgbG9uZ2VzdCBjb252ZXJzaW9uIHRpbWUgaW4gb25lLXNob3QgbW9kZS4gKi8KKyNkZWZpbmUgWlBBMjMyNl9DT05WRVJTSU9OX0pJRkZJRVMgKEhaIC8gNSkKKworLyogVGhlcmUgc2hvdWxkIGJlIGEgMSBtcyBkZWxheSAoVHB1cCkgYWZ0ZXIgZ2V0dGluZyBvdXQgb2YgcmVzZXQuICovCisjZGVmaW5lIFpQQTIzMjZfVFBVUF9VU0VDX01JTiAgICAgICgxMDAwKQorI2RlZmluZSBaUEEyMzI2X1RQVVBfVVNFQ19NQVggICAgICAoMjAwMCkKKworLyoqCisgKiBzdHJ1Y3QgenBhMjMyNl9mcmVxdWVuY3kgLSBIYXJkd2FyZSBzYW1wbGluZyBmcmVxdWVuY3kgZGVzY3JpcHRvcgorICogQGh6IDogRnJlcXVlbmN5IGluIEhlcnR6LgorICogQG9kcjogT3V0cHV0IERhdGEgUmF0ZSB3b3JkIGFzIGV4cGVjdGVkIGJ5ICVaUEEyMzI2X0NUUkxfUkVHM19SRUcuCisgKi8KK3N0cnVjdCB6cGEyMzI2X2ZyZXF1ZW5jeSB7CisJaW50IGh6OworCXUxNiBvZHI7Cit9OworCisvKgorICogS2VlcCB0aGVzZSBpbiBzdHJpY3QgYXNjZW5kaW5nIG9yZGVyOiBsYXN0IGFycmF5IGVudHJ5IGlzIGV4cGVjdGVkIHRvCisgKiBjb3JyZXNwb25kIHRvIHRoZSBoaWdoZXN0IHNhbXBsaW5nIGZyZXF1ZW5jeS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB6cGEyMzI2X2ZyZXF1ZW5jeSB6cGEyMzI2X3NhbXBsaW5nX2ZyZXF1ZW5jaWVzW10gPSB7CisJeyAuaHogPSAxLCAgLm9kciA9IDEgPDwgWlBBMjMyNl9DVFJMX1JFRzNfT0RSX1NISUZUIH0sCisJeyAuaHogPSA1LCAgLm9kciA9IDUgPDwgWlBBMjMyNl9DVFJMX1JFRzNfT0RSX1NISUZUIH0sCisJeyAuaHogPSAxMSwgLm9kciA9IDYgPDwgWlBBMjMyNl9DVFJMX1JFRzNfT0RSX1NISUZUIH0sCisJeyAuaHogPSAyMywgLm9kciA9IDcgPDwgWlBBMjMyNl9DVFJMX1JFRzNfT0RSX1NISUZUIH0sCit9OworCisvKiBSZXR1cm4gdGhlIGhpZ2hlc3QgaGFyZHdhcmUgc2FtcGxpbmcgZnJlcXVlbmN5IGF2YWlsYWJsZS4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgenBhMjMyNl9mcmVxdWVuY3kgKnpwYTIzMjZfaGlnaGVzdF9mcmVxdWVuY3kodm9pZCkKK3sKKwlyZXR1cm4gJnpwYTIzMjZfc2FtcGxpbmdfZnJlcXVlbmNpZXNbCisJCUFSUkFZX1NJWkUoenBhMjMyNl9zYW1wbGluZ19mcmVxdWVuY2llcykgLSAxXTsKK30KKworLyoqCisgKiBzdHJ1Y3QgenBhX3ByaXZhdGUgLSBQZXItZGV2aWNlIGludGVybmFsIHByaXZhdGUgc3RhdGUKKyAqIEB0aW1lc3RhbXA6ICBCdWZmZXJlZCBzYW1wbGVzIHJlYWR5IGRhdHVtLgorICogQHJlZ21hcDogICAgIFVuZGVybHlpbmcgSTJDIC8gU1BJIGJ1cyBhZGFwdGVyIHVzZWQgdG8gYWJzdHJhY3Qgc2xhdmUgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICBhY2Nlc3Nlcy4KKyAqIEByZXN1bHQ6ICAgICBBbGxvd3Mgc2FtcGxpbmcgbG9naWMgdG8gZ2V0IGNvbXBsZXRpb24gc3RhdHVzIG9mIG9wZXJhdGlvbnMKKyAqICAgICAgICAgICAgICB0aGF0IGludGVycnVwdCBoYW5kbGVycyBwZXJmb3JtIGFzeW5jaHJvbm91c2x5LgorICogQGRhdGFfcmVhZHk6IEludGVycnVwdCBoYW5kbGVyIHVzZXMgdGhpcyB0byB3YWtlIHVzZXIgY29udGV4dCB1cCBhdCBzYW1wbGluZworICogICAgICAgICAgICAgIG9wZXJhdGlvbiBjb21wbGV0aW9uLgorICogQHRyaWdnZXI6ICAgIE9wdGlvbmFsIGhhcmR3YXJlIC8gaW50ZXJydXB0IGRyaXZlbiB0cmlnZ2VyIHVzZWQgdG8gbm90aWZ5CisgKiAgICAgICAgICAgICAgZXh0ZXJuYWwgZGV2aWNlcyBhIG5ldyBzYW1wbGUgaXMgcmVhZHkuCisgKiBAd2FrZW46ICAgICAgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGRldmljZSBoYXMganVzdCBiZWVuIHBvd2VyZWQgb24uCisgKiBAaXJxOiAgICAgICAgT3B0aW9uYWwgaW50ZXJydXB0IGxpbmU6IG5lZ2F0aXZlIG9yIHplcm8gaWYgbm90IGRlY2xhcmVkIGludG8KKyAqICAgICAgICAgICAgICBEVCwgaW4gd2hpY2ggY2FzZSBzYW1wbGluZyBsb2dpYyBrZWVwcyBwb2xsaW5nIHN0YXR1cyByZWdpc3RlcgorICogICAgICAgICAgICAgIHRvIGRldGVjdCBjb21wbGV0aW9uLgorICogQGZyZXF1ZW5jeTogIEN1cnJlbnQgaGFyZHdhcmUgc2FtcGxpbmcgZnJlcXVlbmN5LgorICogQHZyZWY6ICAgICAgIFBvd2VyIC8gdm9sdGFnZSByZWZlcmVuY2UuCisgKiBAdmRkOiAgICAgICAgUG93ZXIgc3VwcGx5LgorICovCitzdHJ1Y3QgenBhMjMyNl9wcml2YXRlIHsKKwlzNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDsKKwlzdHJ1Y3QgcmVnbWFwICAgICAgICAgICAgICAgICAgKnJlZ21hcDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDsKKwlzdHJ1Y3QgY29tcGxldGlvbiAgICAgICAgICAgICAgIGRhdGFfcmVhZHk7CisJc3RydWN0IGlpb190cmlnZ2VyICAgICAgICAgICAgICp0cmlnZ2VyOworCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FrZW47CisJaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnE7CisJY29uc3Qgc3RydWN0IHpwYTIzMjZfZnJlcXVlbmN5ICpmcmVxdWVuY3k7CisJc3RydWN0IHJlZ3VsYXRvciAgICAgICAgICAgICAgICp2cmVmOworCXN0cnVjdCByZWd1bGF0b3IgICAgICAgICAgICAgICAqdmRkOworfTsKKworI2RlZmluZSB6cGEyMzI2X2VycihfaWRldiwgX2Zvcm1hdCwgX2FyZy4uLikgXAorCWRldl9lcnIoX2lkZXYtPmRldi5wYXJlbnQsIF9mb3JtYXQsICMjX2FyZykKKworI2RlZmluZSB6cGEyMzI2X3dhcm4oX2lkZXYsIF9mb3JtYXQsIF9hcmcuLi4pIFwKKwlkZXZfd2FybihfaWRldi0+ZGV2LnBhcmVudCwgX2Zvcm1hdCwgIyNfYXJnKQorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgenBhMjMyNl9kYmcoX2lkZXYsIF9mb3JtYXQsIF9hcmcuLi4pIFwKKwlkZXZfZGJnKF9pZGV2LT5kZXYucGFyZW50LCBfZm9ybWF0LCAjI19hcmcpCisjZWxzZQorI2RlZmluZSB6cGEyMzI2X2RiZyhfaWRldiwgX2Zvcm1hdCwgX2FyZy4uLikKKyNlbmRpZgorCitib29sIHpwYTIzMjZfaXNyZWdfd3JpdGVhYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgWlBBMjMyNl9SRUZfUF9YTF9SRUc6CisJY2FzZSBaUEEyMzI2X1JFRl9QX0xfUkVHOgorCWNhc2UgWlBBMjMyNl9SRUZfUF9IX1JFRzoKKwljYXNlIFpQQTIzMjZfUkVTX0NPTkZfUkVHOgorCWNhc2UgWlBBMjMyNl9DVFJMX1JFRzBfUkVHOgorCWNhc2UgWlBBMjMyNl9DVFJMX1JFRzFfUkVHOgorCWNhc2UgWlBBMjMyNl9DVFJMX1JFRzJfUkVHOgorCWNhc2UgWlBBMjMyNl9DVFJMX1JFRzNfUkVHOgorCWNhc2UgWlBBMjMyNl9USFNfUF9MT1dfUkVHOgorCWNhc2UgWlBBMjMyNl9USFNfUF9ISUdIX1JFRzoKKwkJcmV0dXJuIHRydWU7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoenBhMjMyNl9pc3JlZ193cml0ZWFibGUpOworCitib29sIHpwYTIzMjZfaXNyZWdfcmVhZGFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBaUEEyMzI2X1JFRl9QX1hMX1JFRzoKKwljYXNlIFpQQTIzMjZfUkVGX1BfTF9SRUc6CisJY2FzZSBaUEEyMzI2X1JFRl9QX0hfUkVHOgorCWNhc2UgWlBBMjMyNl9ERVZJQ0VfSURfUkVHOgorCWNhc2UgWlBBMjMyNl9SRVNfQ09ORl9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHMF9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHMV9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHMl9SRUc6CisJY2FzZSBaUEEyMzI2X0NUUkxfUkVHM19SRUc6CisJY2FzZSBaUEEyMzI2X0lOVF9TT1VSQ0VfUkVHOgorCWNhc2UgWlBBMjMyNl9USFNfUF9MT1dfUkVHOgorCWNhc2UgWlBBMjMyNl9USFNfUF9ISUdIX1JFRzoKKwljYXNlIFpQQTIzMjZfU1RBVFVTX1JFRzoKKwljYXNlIFpQQTIzMjZfUFJFU1NfT1VUX1hMX1JFRzoKKwljYXNlIFpQQTIzMjZfUFJFU1NfT1VUX0xfUkVHOgorCWNhc2UgWlBBMjMyNl9QUkVTU19PVVRfSF9SRUc6CisJY2FzZSBaUEEyMzI2X1RFTVBfT1VUX0xfUkVHOgorCWNhc2UgWlBBMjMyNl9URU1QX09VVF9IX1JFRzoKKwkJcmV0dXJuIHRydWU7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoenBhMjMyNl9pc3JlZ19yZWFkYWJsZSk7CisKK2Jvb2wgenBhMjMyNl9pc3JlZ19wcmVjaW91cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFpQQTIzMjZfSU5UX1NPVVJDRV9SRUc6CisJY2FzZSBaUEEyMzI2X1BSRVNTX09VVF9IX1JFRzoKKwkJcmV0dXJuIHRydWU7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoenBhMjMyNl9pc3JlZ19wcmVjaW91cyk7CisKKy8qKgorICogenBhMjMyNl9lbmFibGVfZGV2aWNlKCkgLSBFbmFibGUgZGV2aWNlLCBpLmUuIGdldCBvdXQgb2YgbG93IHBvd2VyIG1vZGUuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhhcmR3YXJlIHRvIGVuYWJsZS4KKyAqCisgKiBSZXF1aXJlZCB0byBhY2Nlc3MgY29tcGxldGUgcmVnaXN0ZXIgc3BhY2UgYW5kIHRvIHBlcmZvcm0gYW55IHNhbXBsaW5nCisgKiBvciBjb250cm9sIG9wZXJhdGlvbnMuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X2VuYWJsZV9kZXZpY2UoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcmVnbWFwX3dyaXRlKCgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkJICAgIGlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXAsCisJCQkgICAgWlBBMjMyNl9DVFJMX1JFRzBfUkVHLCBaUEEyMzI2X0NUUkxfUkVHMF9FTkFCTEUpOworCWlmIChlcnIpIHsKKwkJenBhMjMyNl9lcnIoaW5kaW9fZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBkZXZpY2UgKCVkKSIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAiZW5hYmxlZCIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenBhMjMyNl9zbGVlcCgpIC0gRGlzYWJsZSBkZXZpY2UsIGkuZS4gc3dpdGNoIHRvIGxvdyBwb3dlciBtb2RlLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBoYXJkd2FyZSB0byBkaXNhYmxlLgorICoKKyAqIE9ubHkgJVpQQTIzMjZfREVWSUNFX0lEX1JFRyBhbmQgJVpQQTIzMjZfQ1RSTF9SRUcwX1JFRyByZWdpc3RlcnMgbWF5IGJlCisgKiBhY2Nlc3NlZCBvbmNlIGRldmljZSBpcyBpbiB0aGUgZGlzYWJsZWQgc3RhdGUuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X3NsZWVwKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IGVycjsKKworCWVyciA9IHJlZ21hcF93cml0ZSgoKHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKikKKwkJCSAgICBpaW9fcHJpdihpbmRpb19kZXYpKS0+cmVnbWFwLAorCQkJICAgIFpQQTIzMjZfQ1RSTF9SRUcwX1JFRywgMCk7CisJaWYgKGVycikgeworCQl6cGEyMzI2X2VycihpbmRpb19kZXYsICJmYWlsZWQgdG8gc2xlZXAgKCVkKSIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAic2xlZXBpbmciKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHpwYTIzMjZfcmVzZXRfZGV2aWNlKCkgLSBSZXNldCBkZXZpY2UgdG8gZGVmYXVsdCBoYXJkd2FyZSBzdGF0ZS4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFyZHdhcmUgdG8gcmVzZXQuCisgKgorICogRGlzYWJsZSBzYW1wbGluZyBhbmQgZW1wdHkgaGFyZHdhcmUgRklGTy4KKyAqIERldmljZSBtdXN0IGJlIGVuYWJsZWQgYmVmb3JlIHJlc2V0LCBpLmUuIG5vdCBpbiBsb3cgcG93ZXIgbW9kZS4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfcmVzZXRfZGV2aWNlKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IGVycjsKKworCWVyciA9IHJlZ21hcF93cml0ZSgoKHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKikKKwkJCSAgICBpaW9fcHJpdihpbmRpb19kZXYpKS0+cmVnbWFwLAorCQkJICAgIFpQQTIzMjZfQ1RSTF9SRUcyX1JFRywgWlBBMjMyNl9DVFJMX1JFRzJfU1dSRVNFVCk7CisJaWYgKGVycikgeworCQl6cGEyMzI2X2VycihpbmRpb19kZXYsICJmYWlsZWQgdG8gcmVzZXQgZGV2aWNlICglZCkiLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXVzbGVlcF9yYW5nZShaUEEyMzI2X1RQVVBfVVNFQ19NSU4sIFpQQTIzMjZfVFBVUF9VU0VDX01BWCk7CisKKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJyZXNldCIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenBhMjMyNl9zdGFydF9vbmVzaG90KCkgLSBTdGFydCBhIHNpbmdsZSBzYW1wbGluZyBjeWNsZSwgaS5lLiBpbiBvbmUgc2hvdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqCisgKiBEZXZpY2UgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBlbmFibGVkIGFuZCBjb25maWd1cmVkIGZvciBvbmUgc2hvdCBtb2RlLgorICogRGV2aWNlIHdpbGwgYmUgc3dpdGNoZWQgYmFjayB0byBsb3cgcG93ZXIgbW9kZSBhdCBlbmQgb2YgY3ljbGUuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X3N0YXJ0X29uZXNob3QoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcmVnbWFwX3dyaXRlKCgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkJICAgIGlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXAsCisJCQkgICAgWlBBMjMyNl9DVFJMX1JFRzBfUkVHLAorCQkJICAgIFpQQTIzMjZfQ1RSTF9SRUcwX0VOQUJMRSB8CisJCQkgICAgWlBBMjMyNl9DVFJMX1JFRzBfT05FX1NIT1QpOworCWlmIChlcnIpIHsKKwkJenBhMjMyNl9lcnIoaW5kaW9fZGV2LCAiZmFpbGVkIHRvIHN0YXJ0IG9uZSBzaG90IGN5Y2xlICglZCkiLAorCQkJICAgIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAib25lIHNob3QgY3ljbGUgc3RhcnRlZCIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenBhMjMyNl9wb3dlcl9vbigpIC0gUG93ZXIgb24gZGV2aWNlIHRvIGFsbG93IHN1YnNlcXVlbnQgY29uZmlndXJhdGlvbi4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKiBAcHJpdmF0ZTogICBJbnRlcm5hbCBwcml2YXRlIHN0YXRlIHJlbGF0ZWQgdG8gQGluZGlvX2Rldi4KKyAqCisgKiBTYW1wbGluZyB3aWxsIGJlIGRpc2FibGVkLCBwcmV2ZW50aW5nIHN0cmFuZ2UgdGhpbmdzIGZyb20gaGFwcGVuaW5nIGluIG91cgorICogYmFjay4gSGFyZHdhcmUgRklGTyBjb250ZW50IHdpbGwgYmUgY2xlYXJlZC4KKyAqIFdoZW4gc3VjY2Vzc2Z1bCwgZGV2aWNlIHdpbGwgYmUgbGVmdCBpbiB0aGUgZW5hYmxlZCBzdGF0ZSB0byBhbGxvdyBmdXJ0aGVyCisgKiBjb25maWd1cmF0aW9uLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9wb3dlcl9vbihjb25zdCBzdHJ1Y3QgaWlvX2RldiAgICAgICAgICppbmRpb19kZXYsCisJCQkgICAgY29uc3Qgc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdmF0ZSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcmVndWxhdG9yX2VuYWJsZShwcml2YXRlLT52cmVmKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gcmVndWxhdG9yX2VuYWJsZShwcml2YXRlLT52ZGQpOworCWlmIChlcnIpCisJCWdvdG8gdnJlZjsKKworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgInBvd2VyZWQgb24iKTsKKworCWVyciA9IHpwYTIzMjZfZW5hYmxlX2RldmljZShpbmRpb19kZXYpOworCWlmIChlcnIpCisJCWdvdG8gdmRkOworCisJZXJyID0genBhMjMyNl9yZXNldF9kZXZpY2UoaW5kaW9fZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIHNsZWVwOworCisJcmV0dXJuIDA7CisKK3NsZWVwOgorCXpwYTIzMjZfc2xlZXAoaW5kaW9fZGV2KTsKK3ZkZDoKKwlyZWd1bGF0b3JfZGlzYWJsZShwcml2YXRlLT52ZGQpOwordnJlZjoKKwlyZWd1bGF0b3JfZGlzYWJsZShwcml2YXRlLT52cmVmKTsKKworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgInBvd2VyZWQgb2ZmIik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHpwYTIzMjZfcG93ZXJfb2ZmKCkgLSBQb3dlciBvZmYgZGV2aWNlLCBpLmUuIGRpc2FibGUgYXR0YWNoZWQgcG93ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICByZWd1bGF0b3JzLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqIEBwcml2YXRlOiAgIEludGVybmFsIHByaXZhdGUgc3RhdGUgcmVsYXRlZCB0byBAaW5kaW9fZGV2LgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyB2b2lkIHpwYTIzMjZfcG93ZXJfb2ZmKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICAgICAgICAgKmluZGlvX2RldiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXZhdGUpCit7CisJcmVndWxhdG9yX2Rpc2FibGUocHJpdmF0ZS0+dmRkKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShwcml2YXRlLT52cmVmKTsKKworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgInBvd2VyZWQgb2ZmIik7Cit9CisKKy8qKgorICogenBhMjMyNl9jb25maWdfb25lc2hvdCgpIC0gU2V0dXAgZGV2aWNlIGZvciBvbmUgc2hvdCAvIG9uIGRlbWFuZCBtb2RlLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqIEBpcnE6ICAgICAgIE9wdGlvbmFsIGludGVycnVwdCBsaW5lIHRoZSBoYXJkd2FyZSB1c2VzIHRvIG5vdGlmeSBuZXcgZGF0YQorICogICAgICAgICAgICAgc2FtcGxlcyBhcmUgcmVhZHkuIE5lZ2F0aXZlIG9yIHplcm8gdmFsdWVzIGluZGljYXRlIG5vIGludGVycnVwdHMKKyAqICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUsIG1lYW5pbmcgcG9sbGluZyBpcyByZXF1aXJlZC4KKyAqCisgKiBPdXRwdXQgRGF0YSBSYXRlIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHJhdGUgc28gdGhhdAorICogY29udmVyc2lvbiB0aW1lIGFuZCBwb3dlciBjb25zdW1wdGlvbiBhcmUgcmVkdWNlZCB0byBhIG1pbmltdW0uCisgKiBOb3RlIHRoYXQgaGFyZHdhcmUgaW50ZXJuYWwgYXZlcmFnaW5nIG1hY2hpbmVyeSAobm90IGltcGxlbWVudGVkIGluIHRoaXMKKyAqIGRyaXZlcikgaXMgbm90IGFwcGxpY2FibGUgaW4gdGhpcyBtb2RlLgorICoKKyAqIERldmljZSBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGVuYWJsZWQgYmVmb3JlIGNhbGxpbmcKKyAqIHpwYTIzMjZfY29uZmlnX29uZXNob3QoKS4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfY29uZmlnX29uZXNob3QoY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgIGludCAgICAgICAgICAgICAgICAgICBpcnEpCit7CisJc3RydWN0IHJlZ21hcCAgICAgICAgICAgICAgICAgICpyZWdzID0gKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJCQkJCQlpaW9fcHJpdihpbmRpb19kZXYpKS0+cmVnbWFwOworCWNvbnN0IHN0cnVjdCB6cGEyMzI2X2ZyZXF1ZW5jeSAqZnJlcSA9IHpwYTIzMjZfaGlnaGVzdF9mcmVxdWVuY3koKTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycjsKKworCS8qIFNldHVwIGhpZ2hlc3QgYXZhaWxhYmxlIE91dHB1dCBEYXRhIFJhdGUgZm9yIG9uZSBzaG90IG1vZGUuICovCisJZXJyID0gcmVnbWFwX3dyaXRlKHJlZ3MsIFpQQTIzMjZfQ1RSTF9SRUczX1JFRywgZnJlcS0+b2RyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGlycSA+IDApIHsKKwkJLyogUmVxdWVzdCBpbnRlcnJ1cHQgd2hlbiBuZXcgc2FtcGxlIGlzIGF2YWlsYWJsZS4gKi8KKwkJZXJyID0gcmVnbWFwX3dyaXRlKHJlZ3MsIFpQQTIzMjZfQ1RSTF9SRUcxX1JFRywKKwkJCQkgICAodTgpflpQQTIzMjZfQ1RSTF9SRUcxX01BU0tfREFUQV9SRUFEWSk7CisKKwkJaWYgKGVycikgeworCQkJZGV2X2VycihpbmRpb19kZXYtPmRldi5wYXJlbnQsCisJCQkJImZhaWxlZCB0byBzZXR1cCBvbmUgc2hvdCBtb2RlICglZCkiLCBlcnIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgIm9uZSBzaG90IG1vZGUgc2V0dXAgQCVkSHoiLCBmcmVxLT5oeik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6cGEyMzI2X2NsZWFyX2ZpZm8oKSAtIENsZWFyIHJlbWFpbmluZyBlbnRyaWVzIGluIGhhcmR3YXJlIEZJRk8uCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQG1pbl9jb3VudDogTnVtYmVyIG9mIHNhbXBsZXMgcHJlc2VudCB3aXRoaW4gaGFyZHdhcmUgRklGTy4KKyAqCisgKiBAbWluX2NvdW50IGFyZ3VtZW50IGlzIGEgaGludCBjb3JyZXNwb25kaW5nIHRvIHRoZSBrbm93biBtaW5pbXVtIG51bWJlciBvZgorICogc2FtcGxlcyBjdXJyZW50bHkgbGl2aW5nIGluIHRoZSBGSUZPLiBUaGlzIGFsbG93cyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBidXMKKyAqIGFjY2Vzc2VzIGJ5IHNraXBwaW5nIHN0YXR1cyByZWdpc3RlciByZWFkIG9wZXJhdGlvbiBhcyBsb25nIGFzIHdlIGtub3cgZm9yCisgKiBzdXJlIHRoZXJlIGFyZSBzdGlsbCBlbnRyaWVzIGxlZnQuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X2NsZWFyX2ZpZm8oY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCAgICAgICAgICBtaW5fY291bnQpCit7CisJc3RydWN0IHJlZ21hcCAqcmVncyA9ICgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkJICAgICAgIGlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXA7CisJaW50ICAgICAgICAgICAgZXJyOworCXVuc2lnbmVkIGludCAgIHZhbDsKKworCWlmICghbWluX2NvdW50KSB7CisJCS8qCisJCSAqIE5vIGhpbnQ6IHJlYWQgc3RhdHVzIHJlZ2lzdGVyIHRvIGRldGVybWluZSB3aGV0aGVyIEZJRk8gaXMKKwkJICogZW1wdHkgb3Igbm90LgorCQkgKi8KKwkJZXJyID0gcmVnbWFwX3JlYWQocmVncywgWlBBMjMyNl9TVEFUVVNfUkVHLCAmdmFsKTsKKworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyOworCisJCWlmICh2YWwgJiBaUEEyMzI2X1NUQVRVU19GSUZPX0UpCisJCQkvKiBGaWZvIGlzIGVtcHR5OiBub3RoaW5nIHRvIHRyYXNoLiAqLworCQkJcmV0dXJuIDA7CisJfQorCisJLyogQ2xlYXIgRklGTy4gKi8KKwlkbyB7CisJCS8qCisJCSAqIEEgc2luZ2xlIGZldGNoIGZyb20gcHJlc3N1cmUgTVNCIHJlZ2lzdGVyIGlzIGVub3VnaCB0byBwb3AKKwkJICogdmFsdWVzIG91dCBvZiBGSUZPLgorCQkgKi8KKwkJZXJyID0gcmVnbWFwX3JlYWQocmVncywgWlBBMjMyNl9QUkVTU19PVVRfSF9SRUcsICZ2YWwpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXJyOworCisJCWlmIChtaW5fY291bnQpIHsKKwkJCS8qCisJCQkgKiBXZSBrbm93IGZvciBzdXJlIHRoZXJlIGFyZSBhdCBsZWFzdCBtaW5fY291bnQgZW50cmllcworCQkJICogbGVmdCBpbiBGSUZPLiBTa2lwIHN0YXR1cyByZWdpc3RlciByZWFkLgorCQkJICovCisJCQltaW5fY291bnQtLTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZXJyID0gcmVnbWFwX3JlYWQocmVncywgWlBBMjMyNl9TVEFUVVNfUkVHLCAmdmFsKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycjsKKworCX0gd2hpbGUgKCEodmFsICYgWlBBMjMyNl9TVEFUVVNfRklGT19FKSk7CisKKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJGSUZPIGNsZWFyZWQiKTsKKworCXJldHVybiAwOworCitlcnI6CisJenBhMjMyNl9lcnIoaW5kaW9fZGV2LCAiZmFpbGVkIHRvIGNsZWFyIEZJRk8gKCVkKSIsIGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHpwYTIzMjZfZGVxdWV1ZV9wcmVzc3VyZSgpIC0gUmV0cmlldmUgdGhlIG1vc3QgcmVjZW50IHByZXNzdXJlIHNhbXBsZSBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlIEZJRk8uCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQHByZXNzdXJlOiAgU2FtcGxlZCBwcmVzc3VyZSBvdXRwdXQuCisgKgorICogTm90ZSB0aGF0IFpQQTIzMjYgaGFyZHdhcmUgRklGTyBzdG9yZXMgcHJlc3N1cmUgc2FtcGxlcyBvbmx5LgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9kZXF1ZXVlX3ByZXNzdXJlKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgIHUzMiAgICAgICAgICAgICAgICAgICpwcmVzc3VyZSkKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdzID0gKChzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICopCisJCQkgICAgICAgaWlvX3ByaXYoaW5kaW9fZGV2KSktPnJlZ21hcDsKKwl1bnNpZ25lZCBpbnQgICB2YWw7CisJaW50ICAgICAgICAgICAgZXJyOworCWludCAgICAgICAgICAgIGNsZWFyZWQgPSAtMTsKKworCWVyciA9IHJlZ21hcF9yZWFkKHJlZ3MsIFpQQTIzMjZfU1RBVFVTX1JFRywgJnZhbCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkqcHJlc3N1cmUgPSAwOworCisJaWYgKHZhbCAmIFpQQTIzMjZfU1RBVFVTX1BfT1IpIHsKKwkJLyoKKwkJICogRmlmbyBvdmVycnVuIDogZmlyc3Qgc2FtcGxlIGRlcXVldWVkIGZyb20gRklGTyBpcyB0aGUKKwkJICogbmV3ZXN0LgorCQkgKi8KKwkJenBhMjMyNl93YXJuKGluZGlvX2RldiwgIkZJRk8gb3ZlcmZsb3ciKTsKKworCQllcnIgPSByZWdtYXBfYnVsa19yZWFkKHJlZ3MsIFpQQTIzMjZfUFJFU1NfT1VUX1hMX1JFRywgcHJlc3N1cmUsCisJCQkJICAgICAgIDMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworI2RlZmluZSBaUEEyMzI2X0ZJRk9fREVQVEggKDE2VSkKKwkJLyogSGFyZHdhcmUgRklGTyBtYXkgaG9sZCBubyBtb3JlIHRoYW4gMTYgcHJlc3N1cmUgc2FtcGxlcy4gKi8KKwkJcmV0dXJuIHpwYTIzMjZfY2xlYXJfZmlmbyhpbmRpb19kZXYsIFpQQTIzMjZfRklGT19ERVBUSCAtIDEpOworCX0KKworCS8qCisJICogRmlmbyBoYXMgbm90IG92ZXJmbG93biA6IHJldHJpZXZlIG5ld2VzdCBzYW1wbGUuIFdlIG5lZWQgdG8gcG9wCisJICogdmFsdWVzIG91dCB1bnRpbCBGSUZPIGlzIGVtcHR5IDogbGFzdCBmZXRjaGVkIHByZXNzdXJlIGlzIHRoZSBuZXdlc3QuCisJICogSW4gbm9taW5hbCBjYXNlcywgd2Ugc2hvdWxkIGZpbmQgYSBzaW5nbGUgcXVldWVkIHNhbXBsZSBvbmx5LgorCSAqLworCWRvIHsKKwkJZXJyID0gcmVnbWFwX2J1bGtfcmVhZChyZWdzLCBaUEEyMzI2X1BSRVNTX09VVF9YTF9SRUcsIHByZXNzdXJlLAorCQkJCSAgICAgICAzKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZXJyID0gcmVnbWFwX3JlYWQocmVncywgWlBBMjMyNl9TVEFUVVNfUkVHLCAmdmFsKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCWNsZWFyZWQrKzsKKwl9IHdoaWxlICghKHZhbCAmIFpQQTIzMjZfU1RBVFVTX0ZJRk9fRSkpOworCisJaWYgKGNsZWFyZWQpCisJCS8qCisJCSAqIFNhbXBsZXMgd2VyZSBwdXNoZWQgYnkgaGFyZHdhcmUgZHVyaW5nIHByZXZpb3VzIHJvdW5kcyBidXQgd2UKKwkJICogZGlkbid0IGNvbnN1bWUgdGhlbSBmYXN0IGVub3VnaDogaW5mb3JtIHVzZXIuCisJCSAqLworCQl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJjbGVhcmVkICVkIEZJRk8gZW50cmllcyIsIGNsZWFyZWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenBhMjMyNl9maWxsX3NhbXBsZV9idWZmZXIoKSAtIEVucXVldWUgbmV3IGNoYW5uZWwgc2FtcGxlcyB0byBJSU8gYnVmZmVyLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqIEBwcml2YXRlOiAgIEludGVybmFsIHByaXZhdGUgc3RhdGUgcmVsYXRlZCB0byBAaW5kaW9fZGV2LgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9maWxsX3NhbXBsZV9idWZmZXIoc3RydWN0IGlpb19kZXYgICAgICAgICAgICAgICAqaW5kaW9fZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXZhdGUpCit7CisJc3RydWN0IHsKKwkJdTMyIHByZXNzdXJlOworCQl1MTYgdGVtcGVyYXR1cmU7CisJCXU2NCB0aW1lc3RhbXA7CisJfSAgIHNhbXBsZTsKKwlpbnQgZXJyOworCisJaWYgKHRlc3RfYml0KDAsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykpIHsKKwkJLyogR2V0IGN1cnJlbnQgcHJlc3N1cmUgZnJvbSBoYXJkd2FyZSBGSUZPLiAqLworCQllcnIgPSB6cGEyMzI2X2RlcXVldWVfcHJlc3N1cmUoaW5kaW9fZGV2LCAmc2FtcGxlLnByZXNzdXJlKTsKKwkJaWYgKGVycikgeworCQkJenBhMjMyNl93YXJuKGluZGlvX2RldiwgImZhaWxlZCB0byBmZXRjaCBwcmVzc3VyZSAoJWQpIiwKKwkJCQkgICAgIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJaWYgKHRlc3RfYml0KDEsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykpIHsKKwkJLyogR2V0IGN1cnJlbnQgdGVtcGVyYXR1cmUuICovCisJCWVyciA9IHJlZ21hcF9idWxrX3JlYWQocHJpdmF0ZS0+cmVnbWFwLCBaUEEyMzI2X1RFTVBfT1VUX0xfUkVHLAorCQkJCSAgICAgICAmc2FtcGxlLnRlbXBlcmF0dXJlLCAyKTsKKwkJaWYgKGVycikgeworCQkJenBhMjMyNl93YXJuKGluZGlvX2RldiwKKwkJCQkgICAgICJmYWlsZWQgdG8gZmV0Y2ggdGVtcGVyYXR1cmUgKCVkKSIsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJLyoKKwkgKiBOb3cgcHVzaCBzYW1wbGVzIHVzaW5nIHRpbWVzdGFtcCBzdG9yZWQgZWl0aGVyIDoKKwkgKiAgIC0gYnkgaGFyZHdhcmUgaW50ZXJydXB0IGhhbmRsZXIgaWYgaW50ZXJydXB0IGlzIGF2YWlsYWJsZTogc2VlCisJICogICAgIHpwYTIzMjZfaGFuZGxlX2lycSgpLAorCSAqICAgLSBvciBvbmVzaG90IGNvbXBsZXRpb24gcG9sbGluZyBtYWNoaW5lcnkgOiBzZWUKKwkgKiAgICAgenBhMjMyNl90cmlnZ2VyX2hhbmRsZXIoKS4KKwkgKi8KKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJmaWxsaW5nIHJhdyBzYW1wbGVzIGJ1ZmZlciIpOworCisJaWlvX3B1c2hfdG9fYnVmZmVyc193aXRoX3RpbWVzdGFtcChpbmRpb19kZXYsICZzYW1wbGUsCisJCQkJCSAgIHByaXZhdGUtPnRpbWVzdGFtcCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB6cGEyMzI2X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwYXJlbnQpOworCisJaWYgKHBtX3J1bnRpbWVfYXV0b3N1c3BlbmRfZXhwaXJhdGlvbihwYXJlbnQpKQorCQkvKiBVc2Vyc3BhY2UgY2hhbmdlZCBhdXRvc3VzcGVuZCBkZWxheS4gKi8KKwkJcmV0dXJuIC1FQUdBSU47CisKKwl6cGEyMzI2X3Bvd2VyX29mZihpbmRpb19kZXYsIGlpb19wcml2KGluZGlvX2RldikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJY29uc3Qgc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwYXJlbnQpOworCisJcmV0dXJuIHpwYTIzMjZfcG93ZXJfb24oaW5kaW9fZGV2LCBpaW9fcHJpdihpbmRpb19kZXYpKTsKK30KKworY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgenBhMjMyNl9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMocG1fcnVudGltZV9mb3JjZV9zdXNwZW5kLAorCQkJCXBtX3J1bnRpbWVfZm9yY2VfcmVzdW1lKQorCVNFVF9SVU5USU1FX1BNX09QUyh6cGEyMzI2X3J1bnRpbWVfc3VzcGVuZCwgenBhMjMyNl9ydW50aW1lX3Jlc3VtZSwKKwkJCSAgIE5VTEwpCit9OworRVhQT1JUX1NZTUJPTF9HUEwoenBhMjMyNl9wbV9vcHMpOworCisvKioKKyAqIHpwYTIzMjZfcmVzdW1lKCkgLSBSZXF1ZXN0IHRoZSBQTSBsYXllciB0byBwb3dlciBzdXBwbHkgdGhlIGRldmljZS4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKgorICogUmV0dXJuOgorICogIDwgMCAtIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBtZWFuaW5nIGZhaWx1cmUgOworICogICAgMCAtIHN1Y2Nlc3MsIGRldmljZSBoYXMganVzdCBiZWVuIHBvd2VyZWQgdXAgOworICogICAgMSAtIHN1Y2Nlc3MsIGRldmljZSB3YXMgYWxyZWFkeSBwb3dlcmVkLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfcmVzdW1lKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IGVycjsKKworCWVyciA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoaW5kaW9fZGV2LT5kZXYucGFyZW50KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChlcnIgPiAwKSB7CisJCS8qCisJCSAqIERldmljZSB3YXMgYWxyZWFkeSBwb3dlciBzdXBwbGllZDogZ2V0IGl0IG91dCBvZiBsb3cgcG93ZXIKKwkJICogbW9kZSBhbmQgaW5mb3JtIGNhbGxlci4KKwkJICovCisJCXpwYTIzMjZfZW5hYmxlX2RldmljZShpbmRpb19kZXYpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBJbmZvcm0gY2FsbGVyIGRldmljZSBoYXMganVzdCBiZWVuIGJyb3VnaHQgYmFjayB0byBsaWZlLiAqLworCXJldHVybiAwOworfQorCisvKioKKyAqIHpwYTIzMjZfc3VzcGVuZCgpIC0gU2NoZWR1bGUgYSBwb3dlciBkb3duIHVzaW5nIGF1dG9zdXNwZW5kIGZlYXR1cmUgb2YgUE0KKyAqICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICoKKyAqIERldmljZSBpcyBzd2l0Y2hlZCB0byBsb3cgcG93ZXIgbW9kZSBhdCBmaXJzdCB0byBzYXZlIHBvd2VyIGV2ZW4gd2hlbgorICogYXR0YWNoZWQgcmVndWxhdG9yIGlzIGEgImR1bW15IiBvbmUuCisgKi8KK3N0YXRpYyB2b2lkIHpwYTIzMjZfc3VzcGVuZChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9IGluZGlvX2Rldi0+ZGV2LnBhcmVudDsKKworCXpwYTIzMjZfc2xlZXAoaW5kaW9fZGV2KTsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kocGFyZW50KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwYXJlbnQpOworfQorCitzdGF0aWMgdm9pZCB6cGEyMzI2X2luaXRfcnVudGltZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUocGFyZW50KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUocGFyZW50KTsKKwlwbV9ydW50aW1lX2VuYWJsZShwYXJlbnQpOworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KHBhcmVudCwgMTAwMCk7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQocGFyZW50KTsKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBhcmVudCk7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQocGFyZW50KTsKK30KKworc3RhdGljIHZvaWQgenBhMjMyNl9maW5pX3J1bnRpbWUoc3RydWN0IGRldmljZSAqcGFyZW50KQoreworCXBtX3J1bnRpbWVfZGlzYWJsZShwYXJlbnQpOworCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZChwYXJlbnQpOworfQorI2Vsc2UgLyogIUNPTkZJR19QTSAqLworc3RhdGljIGludCB6cGEyMzI2X3Jlc3VtZShjb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXpwYTIzMjZfZW5hYmxlX2RldmljZShpbmRpb19kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHpwYTIzMjZfc3VzcGVuZChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXpwYTIzMjZfc2xlZXAoaW5kaW9fZGV2KTsKK30KKworI2RlZmluZSB6cGEyMzI2X2luaXRfcnVudGltZShfcGFyZW50KQorI2RlZmluZSB6cGEyMzI2X2ZpbmlfcnVudGltZShfcGFyZW50KQorI2VuZGlmIC8qICFDT05GSUdfUE0gKi8KKworLyoqCisgKiB6cGEyMzI2X2hhbmRsZV9pcnEoKSAtIFByb2Nlc3MgaGFyZHdhcmUgaW50ZXJydXB0cy4KKyAqIEBpcnE6ICBJbnRlcnJ1cHQgbGluZSB0aGUgaGFyZHdhcmUgdXNlcyB0byBub3RpZnkgbmV3IGRhdGEgaGFzIGFycml2ZWQuCisgKiBAZGF0YTogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqCisgKiBUaW1lc3RhbXAgYnVmZmVyZWQgc2FtcGxlcyBhcyBzb29uIGFzIHBvc3NpYmxlIHRoZW4gc2NoZWR1bGUgdGhyZWFkZWQgYm90dG9tCisgKiBoYWxmLgorICoKKyAqIFJldHVybjogQWx3YXlzIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB6cGEyMzI2X2hhbmRsZV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gKHN0cnVjdCBpaW9fZGV2ICopZGF0YTsKKworCWlmIChpaW9fYnVmZmVyX2VuYWJsZWQoaW5kaW9fZGV2KSkgeworCQkvKiBUaW1lc3RhbXBpbmcgbmVlZGVkIGZvciBidWZmZXJlZCBzYW1wbGluZyBvbmx5LiAqLworCQkoKHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKikKKwkJIGlpb19wcml2KGluZGlvX2RldikpLT50aW1lc3RhbXAgPSBpaW9fZ2V0X3RpbWVfbnMoaW5kaW9fZGV2KTsKKwl9CisKKwlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOworfQorCisvKioKKyAqIHpwYTIzMjZfaGFuZGxlX3RocmVhZGVkX2lycSgpIC0gSW50ZXJydXB0IGJvdHRvbS1oYWxmIGhhbmRsZXIuCisgKiBAaXJxOiAgSW50ZXJydXB0IGxpbmUgdGhlIGhhcmR3YXJlIHVzZXMgdG8gbm90aWZ5IG5ldyBkYXRhIGhhcyBhcnJpdmVkLgorICogQGRhdGE6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKgorICogTWFpbmx5IGVuc3VyZXMgaW50ZXJydXB0IGlzIGNhdXNlZCBieSBhIHJlYWwgIm5ldyBzYW1wbGUgYXZhaWxhYmxlIgorICogY29uZGl0aW9uLiBUaGlzIHJlbGllcyB1cG9uIHRoZSBhYmlsaXR5IHRvIHBlcmZvcm0gYmxvY2tpbmcgLyBzbGVlcGluZyBidXMKKyAqIGFjY2Vzc2VzIHRvIHNsYXZlJ3MgcmVnaXN0ZXJzLiBUaGlzIGlzIHdoeSB6cGEyMzI2X2hhbmRsZV90aHJlYWRlZF9pcnEoKSBpcworICogY2FsbGVkIGZyb20gd2l0aGluIGEgdGhyZWFkLCBpLmUuIG5vdCBjYWxsZWQgZnJvbSBoYXJkIGludGVycnVwdCBjb250ZXh0LgorICoKKyAqIFdoZW4gZGV2aWNlIGlzIHVzaW5nIGl0cyBvd24gaW50ZXJuYWwgaGFyZHdhcmUgdHJpZ2dlciBpbiBjb250aW51b3VzIHNhbXBsaW5nCisgKiBtb2RlLCBkYXRhIGFyZSBhdmFpbGFibGUgaW50byBoYXJkd2FyZSBGSUZPIG9uY2UgaW50ZXJydXB0IGhhcyBvY2N1cnJlZC4gQWxsCisgKiB3ZSBoYXZlIHRvIGRvIGlzIHRvIGRpc3BhdGNoIHRoZSB0cmlnZ2VyLCB3aGljaCBpbiB0dXJuIHdpbGwgZmV0Y2ggZGF0YSBhbmQKKyAqIGZpbGwgSUlPIGJ1ZmZlci4KKyAqCisgKiBXaGVuIG5vdCB1c2luZyBpdHMgb3duIGludGVybmFsIGhhcmR3YXJlIHRyaWdnZXIsIHRoZSBkZXZpY2UgaGFzIGJlZW4KKyAqIGNvbmZpZ3VyZWQgaW4gb25lLXNob3QgbW9kZSBlaXRoZXIgYnkgYW4gZXh0ZXJuYWwgdHJpZ2dlciBvciB0aGUgSUlPIHJlYWRfcmF3CisgKiBob29rLiBUaGlzIG1lYW5zIG9uZSBvZiB0aGUgbGF0dGVyIGlzIGN1cnJlbnRseSB3YWl0aW5nIGZvciBzYW1wbGluZworICogY29tcGxldGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBtdXN0IHNpbXBseSB3YWtlIGl0IHVwLgorICoKKyAqIFNlZSB6cGEyMzI2X3RyaWdnZXJfaGFuZGxlcigpLgorICoKKyAqIFJldHVybjoKKyAqICAgJUlSUV9OT05FIC0gbm8gY29uc2lzdGVudCBpbnRlcnJ1cHQgaGFwcGVuZWQgOworICogICAlSVJRX0hBTkRMRUQgLSB0aGVyZSB3YXMgbmV3IHNhbXBsZXMgYXZhaWxhYmxlLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgenBhMjMyNl9oYW5kbGVfdGhyZWFkZWRfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlpb19kZXYgICAgICAgICAqaW5kaW9fZGV2ID0gKHN0cnVjdCBpaW9fZGV2ICopZGF0YTsKKwlzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICB2YWw7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgY29udDsKKwlpcnFyZXR1cm5fdCAgICAgICAgICAgICByZXQgPSBJUlFfTk9ORTsKKworCS8qCisJICogQXJlIHdlIHVzaW5nIG91ciBvd24gaW50ZXJuYWwgdHJpZ2dlciBpbiB0cmlnZ2VyZWQgYnVmZmVyIG1vZGUsIGkuZS4sCisJICogY3VycmVudGx5IHdvcmtpbmcgaW4gY29udGludW91cyBzYW1wbGluZyBtb2RlID8KKwkgKi8KKwljb250ID0gKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpICYmCisJCWlpb190cmlnZ2VyX3VzaW5nX293bihpbmRpb19kZXYpKTsKKworCS8qCisJICogRGV2aWNlIHdvcmtzIGFjY29yZGluZyB0byBhIGxldmVsIGludGVycnVwdCBzY2hlbWU6IHJlYWRpbmcgaW50ZXJydXB0CisJICogc3RhdHVzIGRlLWFzc2VydHMgaW50ZXJydXB0IGxpbmUuCisJICovCisJcHJpdi0+cmVzdWx0ID0gcmVnbWFwX3JlYWQocHJpdi0+cmVnbWFwLCBaUEEyMzI2X0lOVF9TT1VSQ0VfUkVHLCAmdmFsKTsKKwlpZiAocHJpdi0+cmVzdWx0IDwgMCkgeworCQlpZiAoY29udCkKKwkJCXJldHVybiBJUlFfTk9ORTsKKworCQlnb3RvIGNvbXBsZXRlOworCX0KKworCS8qIERhdGEgcmVhZHkgaXMgdGhlIG9ubHkgaW50ZXJydXB0IHNvdXJjZSB3ZSByZXF1ZXN0ZWQuICovCisJaWYgKCEodmFsICYgWlBBMjMyNl9JTlRfU09VUkNFX0RBVEFfUkVBRFkpKSB7CisJCS8qCisJCSAqIEludGVycnVwdCBoYXBwZW5lZCBidXQgbm8gbmV3IHNhbXBsZSBhdmFpbGFibGU6IGxpa2VseSBjYXVzZWQKKwkJICogYnkgc3B1cmlvdXMgaW50ZXJydXB0cywgaW4gd2hpY2ggY2FzZSwgcmV0dXJuaW5nIElSUV9OT05FCisJCSAqIGFsbG93cyB0byBiZW5lZml0IGZyb20gdGhlIGdlbmVyaWMgc3B1cmlvdXMgaW50ZXJydXB0cworCQkgKiBoYW5kbGluZy4KKwkJICovCisJCXpwYTIzMjZfd2FybihpbmRpb19kZXYsICJ1bmV4cGVjdGVkIGludGVycnVwdCBzdGF0dXMgJTAyeCIsCisJCQkgICAgIHZhbCk7CisKKwkJaWYgKGNvbnQpCisJCQlyZXR1cm4gSVJRX05PTkU7CisKKwkJcHJpdi0+cmVzdWx0ID0gLUVOT0RBVEE7CisJCWdvdG8gY29tcGxldGU7CisJfQorCisJLyogTmV3IHNhbXBsZSBhdmFpbGFibGU6IGRpc3BhdGNoIGludGVybmFsIHRyaWdnZXIgY29uc3VtZXJzLiAqLworCWlpb190cmlnZ2VyX3BvbGxfY2hhaW5lZChwcml2LT50cmlnZ2VyKTsKKworCWlmIChjb250KQorCQkvKgorCQkgKiBJbnRlcm5hbCBoYXJkd2FyZSB0cmlnZ2VyIGhhcyBiZWVuIHNjaGVkdWxlZCBhYm92ZSA6IGl0IHdpbGwKKwkJICogZmV0Y2ggZGF0YSBvbiBpdHMgb3duLgorCQkgKi8KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJcmV0ID0gSVJRX0hBTkRMRUQ7CisKK2NvbXBsZXRlOgorCS8qCisJICogV2FrZSB1cCBkaXJlY3Qgb3IgZXh0ZXJuYWx5IHRyaWdnZXJlZCBidWZmZXIgbW9kZSB3YWl0ZXJzOiBzZWUKKwkgKiB6cGEyMzI2X3NhbXBsZV9vbmVzaG90KCkgYW5kIHpwYTIzMjZfdHJpZ2dlcl9oYW5kbGVyKCkuCisJICovCisJY29tcGxldGUoJnByaXYtPmRhdGFfcmVhZHkpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB6cGEyMzI2X3dhaXRfb25lc2hvdF9jb21wbGV0aW9uKCkgLSBXYWl0IGZvciBvbmVzaG90IGRhdGEgcmVhZHkgaW50ZXJydXB0LgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqIEBwcml2YXRlOiAgIEludGVybmFsIHByaXZhdGUgc3RhdGUgcmVsYXRlZCB0byBAaW5kaW9fZGV2LgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl93YWl0X29uZXNob3RfY29tcGxldGlvbihjb25zdCBzdHJ1Y3QgaWlvX2RldiAgICppbmRpb19kZXYsCisJCQkJCSAgIHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXZhdGUpCit7CisJaW50ICAgICAgICAgIHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAid2FpdGluZyBmb3Igb25lIHNob3QgY29tcGxldGlvbiBpbnRlcnJ1cHQiKTsKKworCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkmcHJpdmF0ZS0+ZGF0YV9yZWFkeSwgWlBBMjMyNl9DT05WRVJTSU9OX0pJRkZJRVMpOworCWlmIChyZXQgPiAwKQorCQkvKgorCQkgKiBJbnRlcnJ1cHQgaGFuZGxlciBjb21wbGV0ZWQgYmVmb3JlIHRpbWVvdXQ6IHJldHVybiBvcGVyYXRpb24KKwkJICogc3RhdHVzLgorCQkgKi8KKwkJcmV0dXJuIHByaXZhdGUtPnJlc3VsdDsKKworCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHRzIGp1c3QgdG8gYmUgc3VyZS4gKi8KKwlyZWdtYXBfcmVhZChwcml2YXRlLT5yZWdtYXAsIFpQQTIzMjZfSU5UX1NPVVJDRV9SRUcsICZ2YWwpOworCisJaWYgKCFyZXQpCisJCS8qIFRpbWVkIG91dC4gKi8KKwkJcmV0ID0gLUVUSU1FOworCisJaWYgKHJldCAhPSAtRVJFU1RBUlRTWVMpCisJCXpwYTIzMjZfd2FybihpbmRpb19kZXYsICJubyBvbmUgc2hvdCBpbnRlcnJ1cHQgb2NjdXJyZWQgKCVkKSIsCisJCQkgICAgIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHpwYTIzMjZfaW5pdF9tYW5hZ2VkX2lycShzdHJ1Y3QgZGV2aWNlICAgICAgICAgICpwYXJlbnQsCisJCQkJICAgIHN0cnVjdCBpaW9fZGV2ICAgICAgICAgKmluZGlvX2RldiwKKwkJCQkgICAgc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdmF0ZSwKKwkJCQkgICAgaW50ICAgICAgICAgICAgICAgICAgICAgaXJxKQoreworCWludCBlcnI7CisKKwlwcml2YXRlLT5pcnEgPSBpcnE7CisKKwlpZiAoaXJxIDw9IDApIHsKKwkJLyoKKwkJICogUGxhdGZvcm0gZGVjbGFyZWQgbm8gaW50ZXJydXB0IGxpbmU6IGRldmljZSB3aWxsIGJlIHBvbGxlZAorCQkgKiBmb3IgZGF0YSBhdmFpbGFiaWxpdHkuCisJCSAqLworCQlkZXZfaW5mbyhwYXJlbnQsICJubyBpbnRlcnJ1cHQgZm91bmQsIHJ1bm5pbmcgaW4gcG9sbGluZyBtb2RlIik7CisJCXJldHVybiAwOworCX0KKworCWluaXRfY29tcGxldGlvbigmcHJpdmF0ZS0+ZGF0YV9yZWFkeSk7CisKKwkvKiBSZXF1ZXN0IGhhbmRsZXIgdG8gYmUgc2NoZWR1bGVkIGludG8gdGhyZWFkZWQgaW50ZXJydXB0IGNvbnRleHQuICovCisJZXJyID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShwYXJlbnQsIGlycSwgenBhMjMyNl9oYW5kbGVfaXJxLAorCQkJCQl6cGEyMzI2X2hhbmRsZV90aHJlYWRlZF9pcnEsCisJCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX09ORVNIT1QsCisJCQkJCWRldl9uYW1lKHBhcmVudCksIGluZGlvX2Rldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKHBhcmVudCwgImZhaWxlZCB0byByZXF1ZXN0IGludGVycnVwdCAlZCAoJWQpIiwgaXJxLAorCQkJZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlkZXZfaW5mbyhwYXJlbnQsICJ1c2luZyBpbnRlcnJ1cHQgJWQiLCBpcnEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenBhMjMyNl9wb2xsX29uZXNob3RfY29tcGxldGlvbigpIC0gQWN0aXZlbHkgcG9sbCBmb3Igb25lIHNob3QgZGF0YSByZWFkeS4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKgorICogTG9vcCBvdmVyIHJlZ2lzdGVycyBjb250ZW50IHRvIGRldGVjdCBlbmQgb2Ygc2FtcGxpbmcgY3ljbGUuIFVzZWQgd2hlbiBEVAorICogZGVjbGFyZWQgbm8gdmFsaWQgaW50ZXJydXB0IGxpbmVzLgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9wb2xsX29uZXNob3RfY29tcGxldGlvbihjb25zdCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXVuc2lnbmVkIGxvbmcgIHRtb3V0ID0gamlmZmllcyArIFpQQTIzMjZfQ09OVkVSU0lPTl9KSUZGSUVTOworCXN0cnVjdCByZWdtYXAgKnJlZ3MgPSAoKHN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKikKKwkJCSAgICAgICBpaW9fcHJpdihpbmRpb19kZXYpKS0+cmVnbWFwOworCXVuc2lnbmVkIGludCAgIHZhbDsKKwlpbnQgICAgICAgICAgICBlcnI7CisKKwl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJwb2xsaW5nIGZvciBvbmUgc2hvdCBjb21wbGV0aW9uIik7CisKKwkvKgorCSAqIEF0IGxlYXN0LCAxMDAgbXMgaXMgbmVlZGVkIGZvciB0aGUgZGV2aWNlIHRvIGNvbXBsZXRlIGl0cyBvbmUtc2hvdAorCSAqIGN5Y2xlLgorCSAqLworCWlmIChtc2xlZXBfaW50ZXJydXB0aWJsZSgxMDApKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJLyogUG9sbCBmb3IgY29udmVyc2lvbiBjb21wbGV0aW9uIGluIGhhcmR3YXJlLiAqLworCXdoaWxlICh0cnVlKSB7CisJCWVyciA9IHJlZ21hcF9yZWFkKHJlZ3MsIFpQQTIzMjZfQ1RSTF9SRUcwX1JFRywgJnZhbCk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnI7CisKKwkJaWYgKCEodmFsICYgWlBBMjMyNl9DVFJMX1JFRzBfT05FX1NIT1QpKQorCQkJLyogT25lLXNob3QgYml0IHNlbGYgY2xlYXJzIGF0IGNvbnZlcnNpb24gZW5kLiAqLworCQkJYnJlYWs7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdG1vdXQpKSB7CisJCQkvKiBQcmV2ZW50IGZyb20gd2FpdGluZyBmb3JldmVyIDogbGV0J3MgdGltZSBvdXQuICovCisJCQllcnIgPSAtRVRJTUU7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOworCX0KKworCS8qCisJICogSW4gb25lc2hvdCBtb2RlLCBwcmVzc3VyZSBzYW1wbGUgYXZhaWxhYmlsaXR5IGd1YXJhbnRlZXMgdGhhdAorCSAqIHRlbXBlcmF0dXJlIGNvbnZlcnNpb24gaGFzIGFsc28gY29tcGxldGVkIDoganVzdCBjaGVjayBwcmVzc3VyZQorCSAqIHN0YXR1cyBiaXQgdG8ga2VlcCB0aGluZ3Mgc2ltcGxlLgorCSAqLworCWVyciA9IHJlZ21hcF9yZWFkKHJlZ3MsIFpQQTIzMjZfU1RBVFVTX1JFRywgJnZhbCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyOworCisJaWYgKCEodmFsICYgWlBBMjMyNl9TVEFUVVNfUF9EQSkpIHsKKwkJLyogTm8gc2FtcGxlIGF2YWlsYWJsZS4gKi8KKwkJZXJyID0gLUVOT0RBVEE7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworCitlcnI6CisJenBhMjMyNl93YXJuKGluZGlvX2RldiwgImZhaWxlZCB0byBwb2xsIG9uZSBzaG90IGNvbXBsZXRpb24gKCVkKSIsIGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHpwYTIzMjZfZmV0Y2hfcmF3X3NhbXBsZSgpIC0gUmV0cmlldmUgYSByYXcgc2FtcGxlIGFuZCBjb252ZXJ0IGl0IHRvIENQVQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRpYW5uZXNzLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqIEB0eXBlOiAgICAgIFR5cGUgb2YgbWVhc3VyZW1lbnQgLyBjaGFubmVsIHRvIGZldGNoIGZyb20uCisgKiBAdmFsdWU6ICAgICBTYW1wbGUgb3V0cHV0LgorICoKKyAqIFJldHVybjogWmVybyB3aGVuIHN1Y2Nlc3NmdWwsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgenBhMjMyNl9mZXRjaF9yYXdfc2FtcGxlKGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgIGVudW0gaWlvX2NoYW5fdHlwZSAgICB0eXBlLAorCQkJCSAgICBpbnQgICAgICAgICAgICAgICAgICAqdmFsdWUpCit7CisJc3RydWN0IHJlZ21hcCAqcmVncyA9ICgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCQkJICAgICAgIGlpb19wcml2KGluZGlvX2RldikpLT5yZWdtYXA7CisJaW50ICAgICAgICAgICAgZXJyOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJSU9fUFJFU1NVUkU6CisJCXpwYTIzMjZfZGJnKGluZGlvX2RldiwgImZldGNoaW5nIHJhdyBwcmVzc3VyZSBzYW1wbGUiKTsKKworCQllcnIgPSByZWdtYXBfYnVsa19yZWFkKHJlZ3MsIFpQQTIzMjZfUFJFU1NfT1VUX1hMX1JFRywgdmFsdWUsCisJCQkJICAgICAgIDMpOworCQlpZiAoZXJyKSB7CisJCQl6cGEyMzI2X3dhcm4oaW5kaW9fZGV2LCAiZmFpbGVkIHRvIGZldGNoIHByZXNzdXJlICglZCkiLAorCQkJCSAgICAgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQkvKiBQcmVzc3VyZSBpcyBhIDI0IGJpdHMgd2lkZSBsaXR0bGUtZW5kaWFuIHVuc2lnbmVkIGludC4gKi8KKwkJKnZhbHVlID0gKCgodTggKil2YWx1ZSlbMl0gPDwgMTYpIHwgKCgodTggKil2YWx1ZSlbMV0gPDwgOCkgfAorCQkJICgodTggKil2YWx1ZSlbMF07CisKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCisJY2FzZSBJSU9fVEVNUDoKKwkJenBhMjMyNl9kYmcoaW5kaW9fZGV2LCAiZmV0Y2hpbmcgcmF3IHRlbXBlcmF0dXJlIHNhbXBsZSIpOworCisJCWVyciA9IHJlZ21hcF9idWxrX3JlYWQocmVncywgWlBBMjMyNl9URU1QX09VVF9MX1JFRywgdmFsdWUsIDIpOworCQlpZiAoZXJyKSB7CisJCQl6cGEyMzI2X3dhcm4oaW5kaW9fZGV2LAorCQkJCSAgICAgImZhaWxlZCB0byBmZXRjaCB0ZW1wZXJhdHVyZSAoJWQpIiwgZXJyKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKworCQkvKiBUZW1wZXJhdHVyZSBpcyBhIDE2IGJpdHMgd2lkZSBsaXR0bGUtZW5kaWFuIHNpZ25lZCBpbnQuICovCisJCSp2YWx1ZSA9IChpbnQpbGUxNl90b19jcHVwKChfX2xlMTYgKil2YWx1ZSk7CisKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKioKKyAqIHpwYTIzMjZfc2FtcGxlX29uZXNob3QoKSAtIFBlcmZvcm0gYSBjb21wbGV0ZSBvbmUgc2hvdCBzYW1wbGluZyBjeWNsZS4KKyAqIEBpbmRpb19kZXY6IFRoZSBJSU8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtcGxpbmcgaGFyZHdhcmUuCisgKiBAdHlwZTogICAgICBUeXBlIG9mIG1lYXN1cmVtZW50IC8gY2hhbm5lbCB0byBmZXRjaCBmcm9tLgorICogQHZhbHVlOiAgICAgU2FtcGxlIG91dHB1dC4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfc2FtcGxlX29uZXNob3Qoc3RydWN0IGlpb19kZXYgICAgICppbmRpb19kZXYsCisJCQkJICBlbnVtIGlpb19jaGFuX3R5cGUgIHR5cGUsCisJCQkJICBpbnQgICAgICAgICAgICAgICAgKnZhbHVlKQoreworCWludCAgICAgICAgICAgICAgICAgICAgIHJldDsKKwlzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2OworCisJcmV0ID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB6cGEyMzI2X3Jlc3VtZShpbmRpb19kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHJlbGVhc2U7CisKKwlwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlmIChyZXQgPiAwKSB7CisJCS8qCisJCSAqIFdlIHdlcmUgYWxyZWFkeSBwb3dlciBzdXBwbGllZC4gSnVzdCBjbGVhciBoYXJkd2FyZSBGSUZPIHRvCisJCSAqIGdldCByaWQgb2Ygc2FtcGxlcyBhY3F1aXJlZCBkdXJpbmcgcHJldmlvdXMgcm91bmRzIChpZiBhbnkpLgorCQkgKiBTYW1wbGluZyBvcGVyYXRpb24gYWx3YXlzIGdlbmVyYXRlcyBib3RoIHRlbXBlcmF0dXJlIGFuZAorCQkgKiBwcmVzc3VyZSBzYW1wbGVzLiBUaGUgbGF0dGVyIGFyZSBhbHdheXMgZW5xdWV1ZWQgaW50bworCQkgKiBoYXJkd2FyZSBGSUZPLiBUaGlzIG1heSBsZWFkIHRvIHNpdHVhdGlvbnMgd2VyZSBwcmVzc3VyZQorCQkgKiBzYW1wbGVzIHN0aWxsIHNpdCBpbnRvIEZJRk8gd2hlbiBwcmV2aW91cyBjeWNsZShzKSBmZXRjaGVkCisJCSAqIHRlbXBlcmF0dXJlIGRhdGEgb25seS4KKwkJICogSGVuY2UsIHdlIG5lZWQgdG8gY2xlYXIgaGFyZHdhcmUgRklGTyBjb250ZW50IHRvIHByZXZlbnQgZnJvbQorCQkgKiBnZXR0aW5nIG91dGRhdGVkIHZhbHVlcyBhdCB0aGUgZW5kIG9mIGN1cnJlbnQgY3ljbGUuCisJCSAqLworCQlpZiAodHlwZSA9PSBJSU9fUFJFU1NVUkUpIHsKKwkJCXJldCA9IHpwYTIzMjZfY2xlYXJfZmlmbyhpbmRpb19kZXYsIDApOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIHN1c3BlbmQ7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBoYXZlIGp1c3QgYmVlbiBwb3dlciBzdXBwbGllZCwgaS5lLiBkZXZpY2UgaXMgaW4gZGVmYXVsdAorCQkgKiAib3V0IG9mIHJlc2V0IiBzdGF0ZSwgbWVhbmluZyB3ZSBuZWVkIHRvIHJlY29uZmlndXJlIGl0CisJCSAqIGVudGlyZWx5LgorCQkgKi8KKwkJcmV0ID0genBhMjMyNl9jb25maWdfb25lc2hvdChpbmRpb19kZXYsIHByaXYtPmlycSk7CisJCWlmIChyZXQpCisJCQlnb3RvIHN1c3BlbmQ7CisJfQorCisJLyogU3RhcnQgYSBzYW1wbGluZyBjeWNsZSBpbiBvbmVzaG90IG1vZGUuICovCisJcmV0ID0genBhMjMyNl9zdGFydF9vbmVzaG90KGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBzdXNwZW5kOworCisJLyogV2FpdCBmb3Igc2FtcGxpbmcgY3ljbGUgdG8gY29tcGxldGUuICovCisJaWYgKHByaXYtPmlycSA+IDApCisJCXJldCA9IHpwYTIzMjZfd2FpdF9vbmVzaG90X2NvbXBsZXRpb24oaW5kaW9fZGV2LCBwcml2KTsKKwllbHNlCisJCXJldCA9IHpwYTIzMjZfcG9sbF9vbmVzaG90X2NvbXBsZXRpb24oaW5kaW9fZGV2KTsKKworCWlmIChyZXQpCisJCWdvdG8gc3VzcGVuZDsKKworCS8qIFJldHJpZXZlIHJhdyBzYW1wbGUgdmFsdWUgYW5kIGNvbnZlcnQgaXQgdG8gQ1BVIGVuZGlhbm5lc3MuICovCisJcmV0ID0genBhMjMyNl9mZXRjaF9yYXdfc2FtcGxlKGluZGlvX2RldiwgdHlwZSwgdmFsdWUpOworCitzdXNwZW5kOgorCXpwYTIzMjZfc3VzcGVuZChpbmRpb19kZXYpOworcmVsZWFzZToKKwlpaW9fZGV2aWNlX3JlbGVhc2VfZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogenBhMjMyNl90cmlnZ2VyX2hhbmRsZXIoKSAtIFBlcmZvcm0gYW4gSUlPIGJ1ZmZlcmVkIHNhbXBsaW5nIHJvdW5kIGluIG9uZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3QgbW9kZS4KKyAqIEBpcnE6ICBUaGUgc29mdHdhcmUgaW50ZXJydXB0IGFzc2lnbmVkIHRvIEBkYXRhCisgKiBAZGF0YTogVGhlIElJTyBwb2xsIGZ1bmN0aW9uIGRpc3BhdGNoZWQgYnkgZXh0ZXJuYWwgdHJpZ2dlciBvdXIgZGV2aWNlIGlzCisgKiAgICAgICAgYXR0YWNoZWQgdG8uCisgKgorICogQm90dG9tLWhhbGYgaGFuZGxlciBjYWxsZWQgYnkgdGhlIElJTyB0cmlnZ2VyIHRvIHdoaWNoIG91ciBkZXZpY2UgaXMKKyAqIGN1cnJlbnRseSBhdHRhY2hlZC4gQWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoaXMgZGV2aWNlIGJ1ZmZlcmVkIHNhbXBsaW5nCisgKiBlaXRoZXIgd2l0aCBleHRlcm5hbCBldmVudHMgKHN1Y2ggYXMgdGltZXIgZXhwaXJhdGlvbiwgZXh0ZXJuYWwgZGV2aWNlIHNhbXBsZQorICogcmVhZHksIGV0Yy4uLikgb3Igd2l0aCBpdHMgb3duIGludGVycnVwdCAoaW50ZXJuYWwgaGFyZHdhcmUgdHJpZ2dlcikuCisgKgorICogV2hlbiB1c2luZyBhbiBleHRlcm5hbCB0cmlnZ2VyLCBiYXNpY2FsbHkgcnVuIHRoZSBzYW1lIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMKKyAqIGFzIGZvciB6cGEyMzI2X3NhbXBsZV9vbmVzaG90KCkgd2l0aCB0aGUgZm9sbG93aW5nIGhlcmVhZnRlci4gSGFyZHdhcmUgRklGTworICogaXMgbm90IGNsZWFyZWQgc2luY2UgYWxyZWFkeSBkb25lIGF0IGJ1ZmZlcmluZyBlbmFibGUgdGltZSBhbmQgc2FtcGxlcworICogZGVxdWV1ZWluZyBhbHdheXMgcmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudCB2YWx1ZS4KKyAqCisgKiBPdGhlcndpc2UsIHdoZW4gaW50ZXJuYWwgaGFyZHdhcmUgdHJpZ2dlciBoYXMgZGlzcGF0Y2hlZCB1cywganVzdCBmZXRjaCBkYXRhCisgKiBmcm9tIGhhcmR3YXJlIEZJRk8uCisgKgorICogRmV0Y2hlZCBkYXRhIHdpbGwgcHVzaGVkIHVucHJvY2Vzc2VkIHRvIElJTyBidWZmZXIgc2luY2Ugc2FtcGxlcyBjb252ZXJzaW9uCisgKiBpcyBkZWxlZ2F0ZWQgdG8gdXNlcnNwYWNlIGluIGJ1ZmZlcmVkIG1vZGUgKGVuZGlhbm5lc3MsIGV0Yy4uLikuCisgKgorICogUmV0dXJuOgorICogICAlSVJRX05PTkUgLSBubyBjb25zaXN0ZW50IGludGVycnVwdCBoYXBwZW5lZCA7CisgKiAgICVJUlFfSEFORExFRCAtIHRoZXJlIHdhcyBuZXcgc2FtcGxlcyBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCB6cGEyMzI2X3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpaW9fZGV2ICAgICAgICAgKmluZGlvX2RldiA9ICgoc3RydWN0IGlpb19wb2xsX2Z1bmMgKikKKwkJCQkJICAgICBkYXRhKS0+aW5kaW9fZGV2OworCXN0cnVjdCB6cGEyMzI2X3ByaXZhdGUgKnByaXYgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWJvb2wgICAgICAgICAgICAgICAgICAgIGNvbnQ7CisKKwkvKgorCSAqIFdlIGhhdmUgYmVlbiBkaXNwYXRjaGVkLCBtZWFuaW5nIHdlIGFyZSBpbiB0cmlnZ2VyZWQgYnVmZmVyIG1vZGUuCisJICogVXNpbmcgb3VyIG93biBpbnRlcm5hbCB0cmlnZ2VyIGltcGxpZXMgd2UgYXJlIGN1cnJlbnRseSBpbiBjb250aW51b3VzCisJICogaGFyZHdhcmUgc2FtcGxpbmcgbW9kZS4KKwkgKi8KKwljb250ID0gaWlvX3RyaWdnZXJfdXNpbmdfb3duKGluZGlvX2Rldik7CisKKwlpZiAoIWNvbnQpIHsKKwkJLyogT24gZGVtYW5kIHNhbXBsaW5nIDogc3RhcnQgYSBvbmUgc2hvdCBjeWNsZS4gKi8KKwkJaWYgKHpwYTIzMjZfc3RhcnRfb25lc2hvdChpbmRpb19kZXYpKQorCQkJZ290byBvdXQ7CisKKwkJLyogV2FpdCBmb3Igc2FtcGxpbmcgY3ljbGUgdG8gY29tcGxldGUuICovCisJCWlmIChwcml2LT5pcnEgPD0gMCkgeworCQkJLyogTm8gaW50ZXJydXB0IGF2YWlsYWJsZTogcG9sbCBmb3IgY29tcGxldGlvbi4gKi8KKwkJCWlmICh6cGEyMzI2X3BvbGxfb25lc2hvdF9jb21wbGV0aW9uKGluZGlvX2RldikpCisJCQkJZ290byBvdXQ7CisKKwkJCS8qIE9ubHkgdGltZXN0YW1wIHNhbXBsZSBvbmNlIGl0IGlzIHJlYWR5LiAqLworCQkJcHJpdi0+dGltZXN0YW1wID0gaWlvX2dldF90aW1lX25zKGluZGlvX2Rldik7CisJCX0gZWxzZSB7CisJCQkvKiBJbnRlcnJ1cHQgaGFuZGxlcnMgd2lsbCB0aW1lc3RhbXAgZm9yIHVzLiAqLworCQkJaWYgKHpwYTIzMjZfd2FpdF9vbmVzaG90X2NvbXBsZXRpb24oaW5kaW9fZGV2LCBwcml2KSkKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIEVucXVldWUgdG8gSUlPIGJ1ZmZlciAvIHVzZXJzcGFjZS4gKi8KKwl6cGEyMzI2X2ZpbGxfc2FtcGxlX2J1ZmZlcihpbmRpb19kZXYsIHByaXYpOworCitvdXQ6CisJaWYgKCFjb250KQorCQkvKiBEb24ndCBzd2l0Y2ggdG8gbG93IHBvd2VyIGlmIHNhbXBsaW5nIGNvbnRpbnVvdXNseS4gKi8KKwkJenBhMjMyNl9zbGVlcChpbmRpb19kZXYpOworCisJLyogSW5mb3JtIGF0dGFjaGVkIHRyaWdnZXIgd2UgYXJlIGRvbmUuICovCisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiB6cGEyMzI2X3ByZWVuYWJsZV9idWZmZXIoKSAtIFByZXBhcmUgZGV2aWNlIGZvciBjb25maWd1cmluZyB0cmlnZ2VyZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmcKKyAqIG1vZGVzLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqCisgKiBCYXNpY2FsbHkgcG93ZXIgdXAgZGV2aWNlLgorICogQ2FsbGVkIHdpdGggSUlPIGRldmljZSdzIGxvY2sgaGVsZC4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfcHJlZW5hYmxlX2J1ZmZlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQgPSB6cGEyMzI2X3Jlc3VtZShpbmRpb19kZXYpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBUZWxsIHpwYTIzMjZfcG9zdGVuYWJsZV9idWZmZXIoKSBpZiB3ZSBoYXZlIGp1c3QgYmVlbiBwb3dlcmVkIG9uLiAqLworCSgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKQorCSBpaW9fcHJpdihpbmRpb19kZXYpKS0+d2FrZW4gPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenBhMjMyNl9wb3N0ZW5hYmxlX2J1ZmZlcigpIC0gQ29uZmlndXJlIGRldmljZSBmb3IgdHJpZ2dlcmVkIHNhbXBsaW5nLgorICogQGluZGlvX2RldjogVGhlIElJTyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1wbGluZyBoYXJkd2FyZS4KKyAqCisgKiBCYXNpY2FsbHkgc2V0dXAgb25lLXNob3QgbW9kZSBpZiBwbHVnZ2luZyBleHRlcm5hbCB0cmlnZ2VyLgorICogT3RoZXJ3aXNlLCBsZXQgaW50ZXJuYWwgdHJpZ2dlciBjb25maWd1cmUgY29udGludW91cyBzYW1wbGluZyA6CisgKiBzZWUgenBhMjMyNl9zZXRfdHJpZ2dlcl9zdGF0ZSgpLgorICoKKyAqIElmIGFuIGVycm9yIGlzIHJldHVybmVkLCBJSU8gbGF5ZXIgd2lsbCBjYWxsIG91ciBwb3N0ZGlzYWJsZSBob29rIGZvciB1cywKKyAqIGkuZS4gbm8gbmVlZCB0byBleHBsaWNpdGx5IHBvd2VyIGRldmljZSBvZmYgaGVyZS4KKyAqIENhbGxlZCB3aXRoIElJTyBkZXZpY2UncyBsb2NrIGhlbGQuCisgKgorICogQ2FsbGVkIHdpdGggSUlPIGRldmljZSdzIGxvY2sgaGVsZC4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfcG9zdGVuYWJsZV9idWZmZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwljb25zdCBzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI7CisKKwlpZiAoIXByaXYtPndha2VuKSB7CisJCS8qCisJCSAqIFdlIHdlcmUgYWxyZWFkeSBwb3dlciBzdXBwbGllZC4gSnVzdCBjbGVhciBoYXJkd2FyZSBGSUZPIHRvCisJCSAqIGdldCByaWQgb2Ygc2FtcGxlcyBhY3F1aXJlZCBkdXJpbmcgcHJldmlvdXMgcm91bmRzIChpZiBhbnkpLgorCQkgKi8KKwkJZXJyID0genBhMjMyNl9jbGVhcl9maWZvKGluZGlvX2RldiwgMCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIWlpb190cmlnZ2VyX3VzaW5nX293bihpbmRpb19kZXYpICYmIHByaXYtPndha2VuKSB7CisJCS8qCisJCSAqIFdlIGFyZSB1c2luZyBhbiBleHRlcm5hbCB0cmlnZ2VyIGFuZCB3ZSBoYXZlIGp1c3QgYmVlbgorCQkgKiBwb3dlcmVkIHVwOiByZWNvbmZpZ3VyZSBvbmUtc2hvdCBtb2RlLgorCQkgKi8KKwkJZXJyID0genBhMjMyNl9jb25maWdfb25lc2hvdChpbmRpb19kZXYsIHByaXYtPmlycSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycjsKKwl9CisKKwkvKiBQbHVnIG91ciBvd24gdHJpZ2dlciBldmVudCBoYW5kbGVyLiAqLworCWVyciA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUoaW5kaW9fZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjsKKworCXJldHVybiAwOworCitlcnI6CisJenBhMjMyNl9lcnIoaW5kaW9fZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBidWZmZXJpbmcgKCVkKSIsIGVycik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHpwYTIzMjZfcG9zdGRpc2FibGVfYnVmZmVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJenBhMjMyNl9zdXNwZW5kKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyB6cGEyMzI2X2J1ZmZlcl9zZXR1cF9vcHMgPSB7CisJLnByZWVuYWJsZSAgID0genBhMjMyNl9wcmVlbmFibGVfYnVmZmVyLAorCS5wb3N0ZW5hYmxlICA9IHpwYTIzMjZfcG9zdGVuYWJsZV9idWZmZXIsCisJLnByZWRpc2FibGUgID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZSwKKwkucG9zdGRpc2FibGUgPSB6cGEyMzI2X3Bvc3RkaXNhYmxlX2J1ZmZlcgorfTsKKworLyoqCisgKiB6cGEyMzI2X3NldF90cmlnZ2VyX3N0YXRlKCkgLSBTdGFydCAvIHN0b3AgY29udGludW91cyBzYW1wbGluZy4KKyAqIEB0cmlnOiAgVGhlIHRyaWdnZXIgYmVpbmcgYXR0YWNoZWQgdG8gSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nCisgKiAgICAgICAgIGhhcmR3YXJlLgorICogQHN0YXRlOiBUZWxsIHdoZXRoZXIgdG8gc3RhcnQgKHRydWUpIG9yIHN0b3AgKGZhbHNlKQorICoKKyAqIEJhc2ljYWxseSBlbmFibGUgLyBkaXNhYmxlIGhhcmR3YXJlIGNvbnRpbnVvdXMgc2FtcGxpbmcgbW9kZS4KKyAqCisgKiBDYWxsZWQgd2l0aCBJSU8gZGV2aWNlJ3MgbG9jayBoZWxkIGF0IHBvc3RlbmFibGUoKSBvciBwcmVkaXNhYmxlKCkgdGltZS4KKyAqCisgKiBSZXR1cm46IFplcm8gd2hlbiBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IHpwYTIzMjZfc2V0X3RyaWdnZXJfc3RhdGUoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLCBib29sIHN0YXRlKQoreworCWNvbnN0IHN0cnVjdCBpaW9fZGV2ICAgICAgICAgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgKKwkJCQkJCQl0cmlnLT5kZXYucGFyZW50KTsKKwljb25zdCBzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnI7CisKKwlpZiAoIXN0YXRlKSB7CisJCS8qCisJCSAqIFN3aXRjaCB0cmlnZ2VyIG9mZiA6IGluIGNhc2Ugb2YgZmFpbHVyZSwgaW50ZXJydXB0IGlzIGxlZnQKKwkJICogZGlzYWJsZWQgaW4gb3JkZXIgdG8gcHJldmVudCBoYW5kbGVyIGZyb20gYWNjZXNzaW5nIHJlbGVhc2VkCisJCSAqIHJlc291cmNlcy4KKwkJICovCisJCXVuc2lnbmVkIGludCB2YWw7CisKKwkJLyoKKwkJICogQXMgZGV2aWNlIGlzIHdvcmtpbmcgaW4gY29udGludW91cyBtb2RlLCBoYW5kbGVycyBtYXkgYmUKKwkJICogYWNjZXNzaW5nIHJlc291cmNlcyB3ZSBhcmUgY3VycmVudGx5IGZyZWVpbmcuLi4KKwkJICogUHJldmVudCB0aGlzIGJ5IGRpc2FibGluZyBpbnRlcnJ1cHQgaGFuZGxlcnMgYW5kIGVuc3VyZQorCQkgKiB0aGUgZGV2aWNlIHdpbGwgZ2VuZXJhdGUgbm8gbW9yZSBpbnRlcnJ1cHRzIHVubGVzcyBleHBsaWNpdGx5CisJCSAqIHJlcXVpcmVkIHRvLCBpLmUuIGJ5IHJlc3RvcmluZyBiYWNrIHRvIGRlZmF1bHQgb25lIHNob3QgbW9kZS4KKwkJICovCisJCWRpc2FibGVfaXJxKHByaXYtPmlycSk7CisKKwkJLyoKKwkJICogRGlzYWJsZSBjb250aW51b3VzIHNhbXBsaW5nIG1vZGUgdG8gcmVzdG9yZSBzZXR0aW5ncyBmb3IKKwkJICogb25lIHNob3QgLyBkaXJlY3Qgc2FtcGxpbmcgb3BlcmF0aW9ucy4KKwkJICovCisJCWVyciA9IHJlZ21hcF93cml0ZShwcml2LT5yZWdtYXAsIFpQQTIzMjZfQ1RSTF9SRUczX1JFRywKKwkJCQkgICB6cGEyMzI2X2hpZ2hlc3RfZnJlcXVlbmN5KCktPm9kcik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCS8qCisJCSAqIE5vdyB0aGF0IGRldmljZSB3b24ndCBnZW5lcmF0ZSBpbnRlcnJ1cHRzIG9uIGl0cyBvd24sCisJCSAqIGFja25vd2xlZGdlIGFueSBjdXJyZW50bHkgYWN0aXZlIGludGVycnVwdHMgKG1heSBoYXBwZW4gb24KKwkJICogcmFyZSBvY2Nhc2lvbnMgd2hpbGUgc3RvcHBpbmcgY29udGludW91cyBtb2RlKS4KKwkJICovCisJCWVyciA9IHJlZ21hcF9yZWFkKHByaXYtPnJlZ21hcCwgWlBBMjMyNl9JTlRfU09VUkNFX1JFRywgJnZhbCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKworCQkvKgorCQkgKiBSZS1lbmFibGUgaW50ZXJydXB0cyBvbmx5IGlmIHdlIGNhbiBndWFyYW50ZWUgdGhlIGRldmljZSB3aWxsCisJCSAqIGdlbmVyYXRlIG5vIG1vcmUgaW50ZXJydXB0cyB0byBwcmV2ZW50IGhhbmRsZXJzIGZyb20KKwkJICogYWNjZXNzaW5nIHJlbGVhc2VkIHJlc291cmNlcy4KKwkJICovCisJCWVuYWJsZV9pcnEocHJpdi0+aXJxKTsKKworCQl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJjb250aW51b3VzIG1vZGUgc3RvcHBlZCIpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFN3aXRjaCB0cmlnZ2VyIG9uIDogc3RhcnQgY29udGludW91cyBzYW1wbGluZyBhdCByZXF1aXJlZAorCQkgKiBmcmVxdWVuY3kuCisJCSAqLworCisJCWlmIChwcml2LT53YWtlbikgeworCQkJLyogRW5hYmxlIGludGVycnVwdCBpZiBnZXR0aW5nIG91dCBvZiByZXNldC4gKi8KKwkJCWVyciA9IHJlZ21hcF93cml0ZShwcml2LT5yZWdtYXAsIFpQQTIzMjZfQ1RSTF9SRUcxX1JFRywKKwkJCQkJICAgKHU4KQorCQkJCQkgICB+WlBBMjMyNl9DVFJMX1JFRzFfTUFTS19EQVRBX1JFQURZKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCS8qIEVuYWJsZSBjb250aW51b3VzIHNhbXBsaW5nIGF0IHNwZWNpZmllZCBmcmVxdWVuY3kuICovCisJCWVyciA9IHJlZ21hcF93cml0ZShwcml2LT5yZWdtYXAsIFpQQTIzMjZfQ1RSTF9SRUczX1JFRywKKwkJCQkgICBaUEEyMzI2X0NUUkxfUkVHM19FTkFCTEVfTUVBUyB8CisJCQkJICAgcHJpdi0+ZnJlcXVlbmN5LT5vZHIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQl6cGEyMzI2X2RiZyhpbmRpb19kZXYsICJjb250aW51b3VzIG1vZGUgc2V0dXAgQCVkSHoiLAorCQkJICAgIHByaXYtPmZyZXF1ZW5jeS0+aHopOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb190cmlnZ2VyX29wcyB6cGEyMzI2X3RyaWdnZXJfb3BzID0geworCS5vd25lciAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5zZXRfdHJpZ2dlcl9zdGF0ZSA9IHpwYTIzMjZfc2V0X3RyaWdnZXJfc3RhdGUsCit9OworCisvKioKKyAqIHpwYTIzMjZfaW5pdF90cmlnZ2VyKCkgLSBDcmVhdGUgYW4gaW50ZXJydXB0IGRyaXZlbiAvIGhhcmR3YXJlIHRyaWdnZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2luZyB0byBub3RpZnkgZXh0ZXJuYWwgZGV2aWNlcyBhIG5ldyBzYW1wbGUgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkeS4KKyAqIEBwYXJlbnQ6ICAgIEhhcmR3YXJlIHNhbXBsaW5nIGRldmljZSBAaW5kaW9fZGV2IGlzIGEgY2hpbGQgb2YuCisgKiBAaW5kaW9fZGV2OiBUaGUgSUlPIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbXBsaW5nIGhhcmR3YXJlLgorICogQHByaXZhdGU6ICAgSW50ZXJuYWwgcHJpdmF0ZSBzdGF0ZSByZWxhdGVkIHRvIEBpbmRpb19kZXYuCisgKiBAaXJxOiAgICAgICBPcHRpb25hbCBpbnRlcnJ1cHQgbGluZSB0aGUgaGFyZHdhcmUgdXNlcyB0byBub3RpZnkgbmV3IGRhdGEKKyAqICAgICAgICAgICAgIHNhbXBsZXMgYXJlIHJlYWR5LiBOZWdhdGl2ZSBvciB6ZXJvIHZhbHVlcyBpbmRpY2F0ZSBubyBpbnRlcnJ1cHRzCisgKiAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlLCBtZWFuaW5nIHBvbGxpbmcgaXMgcmVxdWlyZWQuCisgKgorICogT25seSByZWxldmFudCB3aGVuIERUIGRlY2xhcmVzIGEgdmFsaWQgaW50ZXJydXB0IGxpbmUuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCB6cGEyMzI2X2luaXRfbWFuYWdlZF90cmlnZ2VyKHN0cnVjdCBkZXZpY2UgICAgICAgICAgKnBhcmVudCwKKwkJCQkJc3RydWN0IGlpb19kZXYgICAgICAgICAqaW5kaW9fZGV2LAorCQkJCQlzdHJ1Y3QgenBhMjMyNl9wcml2YXRlICpwcml2YXRlLAorCQkJCQlpbnQgICAgICAgICAgICAgICAgICAgICBpcnEpCit7CisJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnZ2VyOworCWludCAgICAgICAgICAgICAgICAgcmV0OworCisJaWYgKGlycSA8PSAwKQorCQlyZXR1cm4gMDsKKworCXRyaWdnZXIgPSBkZXZtX2lpb190cmlnZ2VyX2FsbG9jKHBhcmVudCwgIiVzLWRldiVkIiwKKwkJCQkJIGluZGlvX2Rldi0+bmFtZSwgaW5kaW9fZGV2LT5pZCk7CisJaWYgKCF0cmlnZ2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEJhc2ljIHNldHVwLiAqLworCXRyaWdnZXItPmRldi5wYXJlbnQgPSBwYXJlbnQ7CisJdHJpZ2dlci0+b3BzID0gJnpwYTIzMjZfdHJpZ2dlcl9vcHM7CisKKwlwcml2YXRlLT50cmlnZ2VyID0gdHJpZ2dlcjsKKworCS8qIFJlZ2lzdGVyIHRvIHRyaWdnZXJzIHNwYWNlLiAqLworCXJldCA9IGRldm1faWlvX3RyaWdnZXJfcmVnaXN0ZXIocGFyZW50LCB0cmlnZ2VyKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKHBhcmVudCwgImZhaWxlZCB0byByZWdpc3RlciBoYXJkd2FyZSB0cmlnZ2VyICglZCkiLAorCQkJcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9nZXRfZnJlcXVlbmN5KGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuICgoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqKWlpb19wcml2KGluZGlvX2RldikpLT5mcmVxdWVuY3ktPmh6OworfQorCitzdGF0aWMgaW50IHpwYTIzMjZfc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBpbnQgaHopCit7CisJc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdiA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50ICAgICAgICAgICAgICAgICAgICAgZnJlcTsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBlcnI7CisKKwkvKiBDaGVjayBpZiByZXF1ZXN0ZWQgZnJlcXVlbmN5IGlzIHN1cHBvcnRlZC4gKi8KKwlmb3IgKGZyZXEgPSAwOyBmcmVxIDwgQVJSQVlfU0laRSh6cGEyMzI2X3NhbXBsaW5nX2ZyZXF1ZW5jaWVzKTsgZnJlcSsrKQorCQlpZiAoenBhMjMyNl9zYW1wbGluZ19mcmVxdWVuY2llc1tmcmVxXS5oeiA9PSBoeikKKwkJCWJyZWFrOworCWlmIChmcmVxID09IEFSUkFZX1NJWkUoenBhMjMyNl9zYW1wbGluZ19mcmVxdWVuY2llcykpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRG9uJ3QgYWxsb3cgY2hhbmdpbmcgZnJlcXVlbmN5IGlmIGJ1ZmZlcmVkIHNhbXBsaW5nIGlzIG9uZ29pbmcuICovCisJZXJyID0gaWlvX2RldmljZV9jbGFpbV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwcml2LT5mcmVxdWVuY3kgPSAmenBhMjMyNl9zYW1wbGluZ19mcmVxdWVuY2llc1tmcmVxXTsKKworCWlpb19kZXZpY2VfcmVsZWFzZV9kaXJlY3RfbW9kZShpbmRpb19kZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEV4cG9zZSBzdXBwb3J0ZWQgaGFyZHdhcmUgc2FtcGxpbmcgZnJlcXVlbmNpZXMgKEh6KSB0aHJvdWdoIHN5c2ZzLiAqLworc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiMSA1IDExIDIzIik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp6cGEyMzI2X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHpwYTIzMjZfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IHpwYTIzMjZfYXR0cmlidXRlcywKK307CisKK3N0YXRpYyBpbnQgenBhMjMyNl9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAgICAgICAgICAgICAqaW5kaW9fZGV2LAorCQkJICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICp2YWwsCisJCQkgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgKnZhbDIsCisJCQkgICAgbG9uZyAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spCit7CisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzoKKwkJcmV0dXJuIHpwYTIzMjZfc2FtcGxlX29uZXNob3QoaW5kaW9fZGV2LCBjaGFuLT50eXBlLCB2YWwpOworCisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fUFJFU1NVUkU6CisJCQkvKgorCQkJICogUHJlc3N1cmUgcmVzb2x1dGlvbiBpcyAxLzY0IFBhc2NhbC4gU2NhbGUgdG8ga1Bhc2NhbAorCQkJICogYXMgcmVxdWlyZWQgYnkgSUlPIEFCSS4KKwkJCSAqLworCQkJKnZhbCA9IDE7CisJCQkqdmFsMiA9IDY0MDAwOworCQkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTDsKKworCQljYXNlIElJT19URU1QOgorCQkJLyoKKwkJCSAqIFRlbXBlcmF0dXJlIGZvbGxvd3MgdGhlIGVxdWF0aW9uOgorCQkJICogICAgIFRlbXBbZGVnQ10gPSBUZW1wY29kZSAqIDAuMDA2NDkgLSAxNzYuODMKKwkJCSAqIHdoZXJlOgorCQkJICogICAgIFRlbXBjb2RlIGlzIGNvbXBvc2VkIHRoZSByYXcgc2FtcGxlZCAxNiBiaXRzLgorCQkJICoKKwkJCSAqIEhlbmNlLCB0byBwcm9kdWNlIGEgdGVtcGVyYXR1cmUgaW4gbWlsbGktZGVncmVlcworCQkJICogQ2Vsc2l1cyBhY2NvcmRpbmcgdG8gSUlPIEFCSSwgd2UgbmVlZCB0byBhcHBseSB0aGUKKwkJCSAqIGZvbGxvd2luZyBlcXVhdGlvbiB0byByYXcgc2FtcGxlczoKKwkJCSAqICAgICBUZW1wW21pbGxpIGRlZ0NdID0gKFRlbXBjb2RlICsgT2Zmc2V0KSAqIFNjYWxlCisJCQkgKiB3aGVyZToKKwkJCSAqICAgICBPZmZzZXQgPSAtMTc2LjgzIC8gMC4wMDY0OQorCQkJICogICAgIFNjYWxlID0gMC4wMDY0OSAqIDEwMDAKKwkJCSAqLworCQkJKnZhbCA9IDY7CisJCQkqdmFsMiA9IDQ5MDAwMDsKKwkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX1RFTVA6CisJCQkqdmFsID0gLTE3NjgzMDAwOworCQkJKnZhbDIgPSA2NDk7CisJCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUToKKwkJKnZhbCA9IHpwYTIzMjZfZ2V0X2ZyZXF1ZW5jeShpbmRpb19kZXYpOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgICAgICAgICAgICAgKmluZGlvX2RldiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW4sCisJCQkgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB2YWwsCisJCQkgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICB2YWwyLAorCQkJICAgICBsb25nICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykKK3sKKwlpZiAoKG1hc2sgIT0gSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVEpIHx8IHZhbDIpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHpwYTIzMjZfc2V0X2ZyZXF1ZW5jeShpbmRpb19kZXYsIHZhbCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyB6cGEyMzI2X2NoYW5uZWxzW10gPSB7CisJWzBdID0geworCQkudHlwZSAgICAgICAgICAgICAgICAgICAgPSBJSU9fUFJFU1NVUkUsCisJCS5zY2FuX2luZGV4ICAgICAgICAgICAgICA9IDAsCisJCS5zY2FuX3R5cGUgICAgICAgICAgICAgICA9IHsKKwkJCS5zaWduICAgICAgICAgICAgICAgICAgID0gJ3UnLAorCQkJLnJlYWxiaXRzICAgICAgICAgICAgICAgPSAyNCwKKwkJCS5zdG9yYWdlYml0cyAgICAgICAgICAgID0gMzIsCisJCQkuZW5kaWFubmVzcyAgICAgICAgICAgICA9IElJT19MRSwKKwkJfSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSAgICAgID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8CisJCQkJCSAgIEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwKKwkJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fU0FNUF9GUkVRKSwKKwl9LAorCVsxXSA9IHsKKwkJLnR5cGUgICAgICAgICAgICAgICAgICAgID0gSUlPX1RFTVAsCisJCS5zY2FuX2luZGV4ICAgICAgICAgICAgICA9IDEsCisJCS5zY2FuX3R5cGUgICAgICAgICAgICAgICA9IHsKKwkJCS5zaWduICAgICAgICAgICAgICAgICAgID0gJ3MnLAorCQkJLnJlYWxiaXRzICAgICAgICAgICAgICAgPSAxNiwKKwkJCS5zdG9yYWdlYml0cyAgICAgICAgICAgID0gMTYsCisJCQkuZW5kaWFubmVzcyAgICAgICAgICAgICA9IElJT19MRSwKKwkJfSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSAgICAgID0gQklUKElJT19DSEFOX0lORk9fUkFXKSB8CisJCQkJCSAgIEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8CisJCQkJCSAgIEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCksCisJCS5pbmZvX21hc2tfc2hhcmVkX2J5X2FsbCA9IEJJVChJSU9fQ0hBTl9JTkZPX1NBTVBfRlJFUSksCisJfSwKKwlbMl0gPSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgyKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8genBhMjMyNl9pbmZvID0geworCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLmF0dHJzICAgICAgICAgPSAmenBhMjMyNl9hdHRyaWJ1dGVfZ3JvdXAsCisJLnJlYWRfcmF3ICAgICAgPSB6cGEyMzI2X3JlYWRfcmF3LAorCS53cml0ZV9yYXcgICAgID0genBhMjMyNl93cml0ZV9yYXcsCit9OworCitzdGF0aWMgc3RydWN0IGlpb19kZXYgKnpwYTIzMjZfY3JlYXRlX21hbmFnZWRfaWlvZGV2KHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCQkJCSAgICAgY29uc3QgY2hhciAgICAqbmFtZSwKKwkJCQkJCSAgICAgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSB0byBob2xkIElJTyBkZXZpY2UgaW50ZXJuYWwgc3RhdGUuICovCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKGRldmljZSwKKwkJCQkJICBzaXplb2Yoc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFNldHVwIGZvciB1c2Vyc3BhY2Ugc3luY2hyb25vdXMgb24gZGVtYW5kIHNhbXBsaW5nLiAqLworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSBkZXZpY2U7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IHpwYTIzMjZfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKHpwYTIzMjZfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+bmFtZSA9IG5hbWU7CisJaW5kaW9fZGV2LT5pbmZvID0gJnpwYTIzMjZfaW5mbzsKKworCXJldHVybiBpbmRpb19kZXY7Cit9CisKK2ludCB6cGEyMzI2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJICBjb25zdCBjaGFyICAgICpuYW1lLAorCQkgIGludCAgICAgICAgICAgIGlycSwKKwkJICB1bnNpZ25lZCBpbnQgICBod2lkLAorCQkgIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAgICAgICAgICppbmRpb19kZXY7CisJc3RydWN0IHpwYTIzMjZfcHJpdmF0ZSAqcHJpdjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBlcnI7CisJdW5zaWduZWQgaW50ICAgICAgICAgICAgaWQ7CisKKwlpbmRpb19kZXYgPSB6cGEyMzI2X2NyZWF0ZV9tYW5hZ2VkX2lpb2RldihwYXJlbnQsIG5hbWUsIHJlZ21hcCk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdiA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlwcml2LT52cmVmID0gZGV2bV9yZWd1bGF0b3JfZ2V0KHBhcmVudCwgInZyZWYiKTsKKwlpZiAoSVNfRVJSKHByaXYtPnZyZWYpKQorCQlyZXR1cm4gUFRSX0VSUihwcml2LT52cmVmKTsKKworCXByaXYtPnZkZCA9IGRldm1fcmVndWxhdG9yX2dldChwYXJlbnQsICJ2ZGQiKTsKKwlpZiAoSVNfRVJSKHByaXYtPnZkZCkpCisJCXJldHVybiBQVFJfRVJSKHByaXYtPnZkZCk7CisKKwkvKiBTZXQgZGVmYXVsdCBoYXJkd2FyZSBzYW1wbGluZyBmcmVxdWVuY3kgdG8gaGlnaGVzdCByYXRlIHN1cHBvcnRlZC4gKi8KKwlwcml2LT5mcmVxdWVuY3kgPSB6cGEyMzI2X2hpZ2hlc3RfZnJlcXVlbmN5KCk7CisKKwkvKgorCSAqIFBsdWcgZGV2aWNlJ3MgdW5kZXJseWluZyBidXMgYWJzdHJhY3Rpb24gOiB0aGlzIE1VU1QgYmUgc2V0IGJlZm9yZQorCSAqIHJlZ2lzdGVyaW5nIGludGVycnVwdCBoYW5kbGVycyBzaW5jZSBhbiBpbnRlcnJ1cHQgbWlnaHQgaGFwcGVuIGlmCisJICogcG93ZXIgdXAgc2VxdWVuY2UgaXMgbm90IHByb3Blcmx5IGFwcGxpZWQuCisJICovCisJcHJpdi0+cmVnbWFwID0gcmVnbWFwOworCisJZXJyID0gZGV2bV9paW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChwYXJlbnQsIGluZGlvX2RldiwgTlVMTCwKKwkJCQkJICAgICAgenBhMjMyNl90cmlnZ2VyX2hhbmRsZXIsCisJCQkJCSAgICAgICZ6cGEyMzI2X2J1ZmZlcl9zZXR1cF9vcHMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSB6cGEyMzI2X2luaXRfbWFuYWdlZF90cmlnZ2VyKHBhcmVudCwgaW5kaW9fZGV2LCBwcml2LCBpcnEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSB6cGEyMzI2X2luaXRfbWFuYWdlZF9pcnEocGFyZW50LCBpbmRpb19kZXYsIHByaXYsIGlycSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFBvd2VyIHVwIHRvIGNoZWNrIGRldmljZSBJRCBhbmQgcGVyZm9ybSBpbml0aWFsIGhhcmR3YXJlIHNldHVwLiAqLworCWVyciA9IHpwYTIzMjZfcG93ZXJfb24oaW5kaW9fZGV2LCBwcml2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogUmVhZCBpZCByZWdpc3RlciB0byBjaGVjayB3ZSBhcmUgdGFsa2luZyB0byB0aGUgcmlnaHQgc2xhdmUuICovCisJZXJyID0gcmVnbWFwX3JlYWQocmVnbWFwLCBaUEEyMzI2X0RFVklDRV9JRF9SRUcsICZpZCk7CisJaWYgKGVycikKKwkJZ290byBzbGVlcDsKKworCWlmIChpZCAhPSBod2lkKSB7CisJCWRldl9lcnIocGFyZW50LCAiZm91bmQgZGV2aWNlIHdpdGggdW5leHBlY3RlZCBpZCAlMDJ4IiwgaWQpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIHNsZWVwOworCX0KKworCWVyciA9IHpwYTIzMjZfY29uZmlnX29uZXNob3QoaW5kaW9fZGV2LCBpcnEpOworCWlmIChlcnIpCisJCWdvdG8gc2xlZXA7CisKKwkvKiBTZXR1cCBkb25lIDogZ28gc2xlZXBpbmcuIERldmljZSB3aWxsIGJlIGF3YWtlbiB1cG9uIHVzZXIgcmVxdWVzdC4gKi8KKwllcnIgPSB6cGEyMzI2X3NsZWVwKGluZGlvX2Rldik7CisJaWYgKGVycikKKwkJZ290byBwb3dlcm9mZjsKKworCWRldl9zZXRfZHJ2ZGF0YShwYXJlbnQsIGluZGlvX2Rldik7CisKKwl6cGEyMzI2X2luaXRfcnVudGltZShwYXJlbnQpOworCisJZXJyID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChlcnIpIHsKKwkJenBhMjMyNl9maW5pX3J1bnRpbWUocGFyZW50KTsKKwkJZ290byBwb3dlcm9mZjsKKwl9CisKKwlyZXR1cm4gMDsKKworc2xlZXA6CisJLyogUHV0IHRvIHNsZWVwIGp1c3QgaW4gY2FzZSBwb3dlciByZWd1bGF0b3JzIGFyZSAiZHVtbXkiIG9uZXMuICovCisJenBhMjMyNl9zbGVlcChpbmRpb19kZXYpOworcG93ZXJvZmY6CisJenBhMjMyNl9wb3dlcl9vZmYoaW5kaW9fZGV2LCBwcml2KTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh6cGEyMzI2X3Byb2JlKTsKKwordm9pZCB6cGEyMzI2X3JlbW92ZShjb25zdCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwYXJlbnQpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJenBhMjMyNl9maW5pX3J1bnRpbWUoaW5kaW9fZGV2LT5kZXYucGFyZW50KTsKKwl6cGEyMzI2X3NsZWVwKGluZGlvX2Rldik7CisJenBhMjMyNl9wb3dlcl9vZmYoaW5kaW9fZGV2LCBpaW9fcHJpdihpbmRpb19kZXYpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHpwYTIzMjZfcmVtb3ZlKTsKKworTU9EVUxFX0FVVEhPUigiR3JlZ29yIEJvaXJpZSA8Z3JlZ29yLmJvaXJpZUBwYXJyb3QuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb3JlIGRyaXZlciBmb3IgTXVyYXRhIFpQQTIzMjYgcHJlc3N1cmUgc2Vuc29yIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS96cGEyMzI2LmggYi9kcml2ZXJzL2lpby9wcmVzc3VyZS96cGEyMzI2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkM2UxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjYuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogTXVyYXRhIFpQQTIzMjYgcHJlc3N1cmUgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciBJSU8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFBhcnJvdCBTLkEuCisgKgorICogQXV0aG9yOiBHcmVnb3IgQm9pcmllIDxncmVnb3IuYm9pcmllQHBhcnJvdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX1pQQTIzMjZfSAorI2RlZmluZSBfWlBBMjMyNl9ICisKKy8qIFJlZ2lzdGVyIG1hcC4gKi8KKyNkZWZpbmUgWlBBMjMyNl9SRUZfUF9YTF9SRUcgICAgICAgICAgICAgICgweDgpCisjZGVmaW5lIFpQQTIzMjZfUkVGX1BfTF9SRUcgICAgICAgICAgICAgICAoMHg5KQorI2RlZmluZSBaUEEyMzI2X1JFRl9QX0hfUkVHICAgICAgICAgICAgICAgKDB4YSkKKyNkZWZpbmUgWlBBMjMyNl9ERVZJQ0VfSURfUkVHICAgICAgICAgICAgICgweGYpCisjZGVmaW5lIFpQQTIzMjZfREVWSUNFX0lEICAgICAgICAgICAgICAgICAoMHhiOSkKKyNkZWZpbmUgWlBBMjMyNl9SRVNfQ09ORl9SRUcgICAgICAgICAgICAgICgweDEwKQorI2RlZmluZSBaUEEyMzI2X0NUUkxfUkVHMF9SRUcgICAgICAgICAgICAgKDB4MjApCisjZGVmaW5lIFpQQTIzMjZfQ1RSTF9SRUcwX09ORV9TSE9UICAgICAgICBCSVQoMCkKKyNkZWZpbmUgWlBBMjMyNl9DVFJMX1JFRzBfRU5BQkxFICAgICAgICAgIEJJVCgxKQorI2RlZmluZSBaUEEyMzI2X0NUUkxfUkVHMV9SRUcgICAgICAgICAgICAgKDB4MjEpCisjZGVmaW5lIFpQQTIzMjZfQ1RSTF9SRUcxX01BU0tfREFUQV9SRUFEWSBCSVQoMikKKyNkZWZpbmUgWlBBMjMyNl9DVFJMX1JFRzJfUkVHICAgICAgICAgICAgICgweDIyKQorI2RlZmluZSBaUEEyMzI2X0NUUkxfUkVHMl9TV1JFU0VUICAgICAgICAgQklUKDIpCisjZGVmaW5lIFpQQTIzMjZfQ1RSTF9SRUczX1JFRyAgICAgICAgICAgICAoMHgyMykKKyNkZWZpbmUgWlBBMjMyNl9DVFJMX1JFRzNfT0RSX1NISUZUICAgICAgICg0KQorI2RlZmluZSBaUEEyMzI2X0NUUkxfUkVHM19FTkFCTEVfTUVBUyAgICAgQklUKDcpCisjZGVmaW5lIFpQQTIzMjZfSU5UX1NPVVJDRV9SRUcgICAgICAgICAgICAoMHgyNCkKKyNkZWZpbmUgWlBBMjMyNl9JTlRfU09VUkNFX0RBVEFfUkVBRFkgICAgIEJJVCgyKQorI2RlZmluZSBaUEEyMzI2X1RIU19QX0xPV19SRUcgICAgICAgICAgICAgKDB4MjUpCisjZGVmaW5lIFpQQTIzMjZfVEhTX1BfSElHSF9SRUcgICAgICAgICAgICAoMHgyNikKKyNkZWZpbmUgWlBBMjMyNl9TVEFUVVNfUkVHICAgICAgICAgICAgICAgICgweDI3KQorI2RlZmluZSBaUEEyMzI2X1NUQVRVU19QX0RBICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIFpQQTIzMjZfU1RBVFVTX0ZJRk9fRSAgICAgICAgICAgICBCSVQoMikKKyNkZWZpbmUgWlBBMjMyNl9TVEFUVVNfUF9PUiAgICAgICAgICAgICAgIEJJVCg1KQorI2RlZmluZSBaUEEyMzI2X1BSRVNTX09VVF9YTF9SRUcgICAgICAgICAgKDB4MjgpCisjZGVmaW5lIFpQQTIzMjZfUFJFU1NfT1VUX0xfUkVHICAgICAgICAgICAoMHgyOSkKKyNkZWZpbmUgWlBBMjMyNl9QUkVTU19PVVRfSF9SRUcgICAgICAgICAgICgweDJhKQorI2RlZmluZSBaUEEyMzI2X1RFTVBfT1VUX0xfUkVHICAgICAgICAgICAgKDB4MmIpCisjZGVmaW5lIFpQQTIzMjZfVEVNUF9PVVRfSF9SRUcgICAgICAgICAgICAoMHgyYykKKworc3RydWN0IGRldmljZTsKK3N0cnVjdCByZWdtYXA7CisKK2Jvb2wgenBhMjMyNl9pc3JlZ193cml0ZWFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKTsKK2Jvb2wgenBhMjMyNl9pc3JlZ19yZWFkYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpOworYm9vbCB6cGEyMzI2X2lzcmVnX3ByZWNpb3VzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZyk7CisKKy8qKgorICogenBhMjMyNl9wcm9iZSgpIC0gSW5zdGFudGlhdGUgYW5kIHJlZ2lzdGVyIGNvcmUgWlBBMjMyNiBJSU8gZGV2aWNlCisgKiBAcGFyZW50OiBIYXJkd2FyZSBzYW1wbGluZyBkZXZpY2UgdGhlIGNyZWF0ZWQgSUlPIGRldmljZSB3aWxsIGJlIGEgY2hpbGQgb2YuCisgKiBAbmFtZTogICBBcmJpdHJhcnkgbmFtZSB0byBpZGVudGlmeSB0aGUgZGV2aWNlLgorICogQGlycTogICAgSW50ZXJydXB0IGxpbmUsIG5lZ2F0aXZlIGlmIG5vbmUuCisgKiBAaHdpZDogICBFeHBlY3RlZCBkZXZpY2UgaGFyZHdhcmUgaWQuCisgKiBAcmVnbWFwOiBSZWdpc3RlcnMgbWFwIHVzZWQgdG8gYWJzdHJhY3QgdW5kZXJseWluZyBidXMgYWNjZXNzZXMuCisgKgorICogUmV0dXJuOiBaZXJvIHdoZW4gc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IHpwYTIzMjZfcHJvYmUoc3RydWN0IGRldmljZSAgICAgICAgKnBhcmVudCwKKwkJICBjb25zdCBjaGFyICAgICAgICAgICAqbmFtZSwKKwkJICBpbnQgICAgICAgICAgICAgICAgICAgaXJxLAorCQkgIHVuc2lnbmVkIGludCAgICAgICAgICBod2lkLAorCQkgIHN0cnVjdCByZWdtYXAgICAgICAgICpyZWdtYXApOworCisvKioKKyAqIHpwYTIzMjZfcmVtb3ZlKCkgLSBVbnJlZ2lzdGVyIGFuZCBkZXN0cm95IGNvcmUgWlBBMjMyNiBJSU8gZGV2aWNlLgorICogQHBhcmVudDogSGFyZHdhcmUgc2FtcGxpbmcgZGV2aWNlIHRoZSBJSU8gZGV2aWNlIHRvIHJlbW92ZSBpcyBhIGNoaWxkIG9mLgorICovCit2b2lkIHpwYTIzMjZfcmVtb3ZlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKnBhcmVudCk7CisKKyNpZmRlZiBDT05GSUdfUE0KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHpwYTIzMjZfcG1fb3BzOworI2RlZmluZSBaUEEyMzI2X1BNX09QUyAoJnpwYTIzMjZfcG1fb3BzKQorI2Vsc2UKKyNkZWZpbmUgWlBBMjMyNl9QTV9PUFMgKE5VTEwpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS96cGEyMzI2X2kyYy5jIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvenBhMjMyNl9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQyN2RkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvenBhMjMyNl9pMmMuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogTXVyYXRhIFpQQTIzMjYgSTJDIHByZXNzdXJlIGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFBhcnJvdCBTLkEuCisgKgorICogQXV0aG9yOiBHcmVnb3IgQm9pcmllIDxncmVnb3IuYm9pcmllQHBhcnJvdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlICJ6cGEyMzI2LmgiCisKKy8qCisgKiByZWFkX2ZsYWdfbWFzazoKKyAqICAgLSBhZGRyZXNzIGJpdCA3IG11c3QgYmUgc2V0IHRvIHJlcXVlc3QgYSByZWdpc3RlciByZWFkIG9wZXJhdGlvbgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgenBhMjMyNl9yZWdtYXBfaTJjX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgICAgICAgPSA4LAorCS52YWxfYml0cyAgICAgICA9IDgsCisJLndyaXRlYWJsZV9yZWcgID0genBhMjMyNl9pc3JlZ193cml0ZWFibGUsCisJLnJlYWRhYmxlX3JlZyAgID0genBhMjMyNl9pc3JlZ19yZWFkYWJsZSwKKwkucHJlY2lvdXNfcmVnICAgPSB6cGEyMzI2X2lzcmVnX3ByZWNpb3VzLAorCS5tYXhfcmVnaXN0ZXIgICA9IFpQQTIzMjZfVEVNUF9PVVRfSF9SRUcsCisJLnJlYWRfZmxhZ19tYXNrID0gQklUKDcpLAorCS5jYWNoZV90eXBlICAgICA9IFJFR0NBQ0hFX05PTkUsCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IHpwYTIzMjZfaTJjX2h3aWQoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKyNkZWZpbmUgWlBBMjMyNl9TQTAoX2FkZHIpICAgICAgICAgIChfYWRkciAmIEJJVCgwKSkKKyNkZWZpbmUgWlBBMjMyNl9ERVZJQ0VfSURfU0EwX1NISUZUICgxKQorCisJLyogSWRlbnRpZmljYXRpb24gcmVnaXN0ZXIgYml0IDEgbWlycm9ycyBkZXZpY2UgYWRkcmVzcyBiaXQgMC4gKi8KKwlyZXR1cm4gKFpQQTIzMjZfREVWSUNFX0lEIHwKKwkJKFpQQTIzMjZfU0EwKGNsaWVudC0+YWRkcikgPDwgWlBBMjMyNl9ERVZJQ0VfSURfU0EwX1NISUZUKSk7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9wcm9iZV9pMmMoc3RydWN0IGkyY19jbGllbnQgICAgICAgICAgKmNsaWVudCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmkyY19pZCkKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZ6cGEyMzI2X3JlZ21hcF9pMmNfY29uZmlnKTsKKwlpZiAoSVNfRVJSKHJlZ21hcCkpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gaW5pdCByZWdpc3RlcnMgbWFwIik7CisJCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisJfQorCisJcmV0dXJuIHpwYTIzMjZfcHJvYmUoJmNsaWVudC0+ZGV2LCBpMmNfaWQtPm5hbWUsIGNsaWVudC0+aXJxLAorCQkJICAgICB6cGEyMzI2X2kyY19od2lkKGNsaWVudCksIHJlZ21hcCk7Cit9CisKK3N0YXRpYyBpbnQgenBhMjMyNl9yZW1vdmVfaTJjKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJenBhMjMyNl9yZW1vdmUoJmNsaWVudC0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgenBhMjMyNl9pMmNfaWRzW10gPSB7CisJeyAienBhMjMyNiIsIDAgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHpwYTIzMjZfaTJjX2lkcyk7CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRikKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHpwYTIzMjZfaTJjX21hdGNoZXNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm11cmF0YSx6cGEyMzI2IiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHpwYTIzMjZfaTJjX21hdGNoZXMpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB6cGEyMzI2X2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gInpwYTIzMjYtaTJjIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHpwYTIzMjZfaTJjX21hdGNoZXMpLAorCQkucG0gICAgICAgICAgICAgPSBaUEEyMzI2X1BNX09QUywKKwl9LAorCS5wcm9iZSAgICA9IHpwYTIzMjZfcHJvYmVfaTJjLAorCS5yZW1vdmUgICA9IHpwYTIzMjZfcmVtb3ZlX2kyYywKKwkuaWRfdGFibGUgPSB6cGEyMzI2X2kyY19pZHMsCit9OworbW9kdWxlX2kyY19kcml2ZXIoenBhMjMyNl9pMmNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiR3JlZ29yIEJvaXJpZSA8Z3JlZ29yLmJvaXJpZUBwYXJyb3QuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJMkMgZHJpdmVyIGZvciBNdXJhdGEgWlBBMjMyNiBwcmVzc3VyZSBzZW5zb3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL3pwYTIzMjZfc3BpLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS96cGEyMzI2X3NwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmMxYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS96cGEyMzI2X3NwaS5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTXVyYXRhIFpQQTIzMjYgU1BJIHByZXNzdXJlIGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFBhcnJvdCBTLkEuCisgKgorICogQXV0aG9yOiBHcmVnb3IgQm9pcmllIDxncmVnb3IuYm9pcmllQHBhcnJvdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSAienBhMjMyNi5oIgorCisvKgorICogcmVhZF9mbGFnX21hc2s6CisgKiAgIC0gYWRkcmVzcyBiaXQgNyBtdXN0IGJlIHNldCB0byByZXF1ZXN0IGEgcmVnaXN0ZXIgcmVhZCBvcGVyYXRpb24KKyAqICAgLSBhZGRyZXNzIGJpdCA2IG11c3QgYmUgc2V0IHRvIHJlcXVlc3QgcmVnaXN0ZXIgYWRkcmVzcyBhdXRvIGluY3JlbWVudAorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgenBhMjMyNl9yZWdtYXBfc3BpX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgICAgICAgPSA4LAorCS52YWxfYml0cyAgICAgICA9IDgsCisJLndyaXRlYWJsZV9yZWcgID0genBhMjMyNl9pc3JlZ193cml0ZWFibGUsCisJLnJlYWRhYmxlX3JlZyAgID0genBhMjMyNl9pc3JlZ19yZWFkYWJsZSwKKwkucHJlY2lvdXNfcmVnICAgPSB6cGEyMzI2X2lzcmVnX3ByZWNpb3VzLAorCS5tYXhfcmVnaXN0ZXIgICA9IFpQQTIzMjZfVEVNUF9PVVRfSF9SRUcsCisJLnJlYWRfZmxhZ19tYXNrID0gQklUKDcpIHwgQklUKDYpLAorCS5jYWNoZV90eXBlICAgICA9IFJFR0NBQ0hFX05PTkUsCit9OworCitzdGF0aWMgaW50IHpwYTIzMjZfcHJvYmVfc3BpKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCWludCAgICAgICAgICAgIGVycjsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJnpwYTIzMjZfcmVnbWFwX3NwaV9jb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImZhaWxlZCB0byBpbml0IHJlZ2lzdGVycyBtYXAiKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKwl9CisKKwkvKgorCSAqIEVuZm9yY2UgU1BJIHNsYXZlIHNldHRpbmdzIHRvIHByZXZlbnQgZnJvbSBEVCBtaXNjb25maWd1cmF0aW9uLgorCSAqCisJICogQ2xvY2sgaXMgaWRsZSBoaWdoLiBTYW1wbGluZyBoYXBwZW5zIG9uIHRyYWlsaW5nIGVkZ2UsIGkuZS4sIHJpc2luZworCSAqIGVkZ2UuIE1heGltdW0gYnVzIGZyZXF1ZW5jeSBpcyAxIE1Iei4gUmVnaXN0ZXJzIGFyZSA4IGJpdHMgd2lkZS4KKwkgKi8KKwlzcGktPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaS0+bWF4X3NwZWVkX2h6ID0gbWluKHNwaS0+bWF4X3NwZWVkX2h6LCAxMDAwMDAwVSk7CisJc3BpLT5iaXRzX3Blcl93b3JkID0gODsKKwllcnIgPSBzcGlfc2V0dXAoc3BpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiB6cGEyMzI2X3Byb2JlKCZzcGktPmRldiwgc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+bmFtZSwKKwkJCSAgICAgc3BpLT5pcnEsIFpQQTIzMjZfREVWSUNFX0lELCByZWdtYXApOworfQorCitzdGF0aWMgaW50IHpwYTIzMjZfcmVtb3ZlX3NwaShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXpwYTIzMjZfcmVtb3ZlKCZzcGktPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIHpwYTIzMjZfc3BpX2lkc1tdID0geworCXsgInpwYTIzMjYiLCAwIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoc3BpLCB6cGEyMzI2X3NwaV9pZHMpOworCisjaWYgZGVmaW5lZChDT05GSUdfT0YpCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB6cGEyMzI2X3NwaV9tYXRjaGVzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtdXJhdGEsenBhMjMyNiIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB6cGEyMzI2X3NwaV9tYXRjaGVzKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgenBhMjMyNl9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJ6cGEyMzI2LXNwaSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cih6cGEyMzI2X3NwaV9tYXRjaGVzKSwKKwkJLnBtICAgICAgICAgICAgID0gWlBBMjMyNl9QTV9PUFMsCisJfSwKKwkucHJvYmUgICAgPSB6cGEyMzI2X3Byb2JlX3NwaSwKKwkucmVtb3ZlICAgPSB6cGEyMzI2X3JlbW92ZV9zcGksCisJLmlkX3RhYmxlID0genBhMjMyNl9zcGlfaWRzLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKHpwYTIzMjZfc3BpX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkdyZWdvciBCb2lyaWUgPGdyZWdvci5ib2lyaWVAcGFycm90LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1BJIGRyaXZlciBmb3IgTXVyYXRhIFpQQTIzMjYgcHJlc3N1cmUgc2Vuc29yIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcm94aW1pdHkvYXMzOTM1LmMgYi9kcml2ZXJzL2lpby9wcm94aW1pdHkvYXMzOTM1LmMKaW5kZXggMmUzYTcwZS4uNTY1NmRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJveGltaXR5L2FzMzkzNS5jCisrKyBiL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9hczM5MzUuYwpAQCAtMzk3LDcgKzM5Nyw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAorCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUsCiAJCSZhczM5MzVfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKIAogCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9zeDk1MDAuYyBiL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9zeDk1MDAuYwppbmRleCAxZDc0YjNhLi4xZjA2MjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9wcm94aW1pdHkvc3g5NTAwLmMKKysrIGIvZHJpdmVycy9paW8vcHJveGltaXR5L3N4OTUwMC5jCkBAIC01MTYsNyArNTE2LDcgQEAKIAkJc3g5NTAwX3B1c2hfZXZlbnRzKGluZGlvX2Rldik7CiAKIAlpZiAodmFsICYgU1g5NTAwX0NPTlZET05FX0lSUSkKLQkJY29tcGxldGVfYWxsKCZkYXRhLT5jb21wbGV0aW9uKTsKKwkJY29tcGxldGUoJmRhdGEtPmNvbXBsZXRpb24pOwogCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CkBAIC0xMDI1LDYgKzEwMjUsMTIgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHN4OTUwMF9hY3BpX21hdGNoKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3g5NTAwX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzZW10ZWNoLHN4OTUwMCIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3g5NTAwX29mX21hdGNoKTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHN4OTUwMF9pZFtdID0gewogCXsic3g5NTAwIiwgMH0sCiAJeyB9LApAQCAtMTAzNSw2ICsxMDQxLDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9IFNYOTUwMF9EUklWRVJfTkFNRSwKIAkJLmFjcGlfbWF0Y2hfdGFibGUgPSBBQ1BJX1BUUihzeDk1MDBfYWNwaV9tYXRjaCksCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihzeDk1MDBfb2ZfbWF0Y2gpLAogCQkucG0gPSAmc3g5NTAwX3BtX29wcywKIAl9LAogCS5wcm9iZQkJPSBzeDk1MDBfcHJvYmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9LY29uZmlnIGIvZHJpdmVycy9paW8vdGVtcGVyYXR1cmUvS2NvbmZpZwppbmRleCBjNDY2NGU1Li41ZWE3N2E3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL0tjb25maWcKQEAgLTMsNiArMywyMiBAQAogIwogbWVudSAiVGVtcGVyYXR1cmUgc2Vuc29ycyIKIAorY29uZmlnIE1BWElNX1RIRVJNT0NPVVBMRQorCXRyaXN0YXRlICJNYXhpbSB0aGVybW9jb3VwbGUgc2Vuc29ycyIKKwlkZXBlbmRzIG9uIFNQSQorCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSRURfQlVGRkVSCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBNYXhpbSBzZXJpZXMgb2YKKwkgIHRoZXJtb2NvdXBsZSBzZW5zb3JzIGNvbm5lY3RlZCB2aWEgU1BJLgorCisJICBTdXBwb3J0ZWQgc2Vuc29yczoKKwkgICAqIE1BWDY2NzUKKwkgICAqIE1BWDMxODU1CisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWF4aW1fdGhlcm1vY291cGxlLgorCiBjb25maWcgTUxYOTA2MTQKIAl0cmlzdGF0ZSAiTUxYOTA2MTQgY29udGFjdC1sZXNzIGluZnJhcmVkIHNlbnNvciIKIAlkZXBlbmRzIG9uIEkyQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vdGVtcGVyYXR1cmUvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9NYWtlZmlsZQppbmRleCAwMmJjNzlkLi43OGMzZGUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9NYWtlZmlsZQpAQCAtMiw2ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIGluZHVzdHJpYWwgSS9PIHRlbXBlcmF0dXJlIGRyaXZlcnMKICMKIAorb2JqLSQoQ09ORklHX01BWElNX1RIRVJNT0NPVVBMRSkgKz0gbWF4aW1fdGhlcm1vY291cGxlLm8KIG9iai0kKENPTkZJR19NTFg5MDYxNCkgKz0gbWx4OTA2MTQubwogb2JqLSQoQ09ORklHX1RNUDAwNikgKz0gdG1wMDA2Lm8KIG9iai0kKENPTkZJR19UU1lTMDEpICs9IHRzeXMwMS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9tYXhpbV90aGVybW9jb3VwbGUuYyBiL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL21heGltX3RoZXJtb2NvdXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZGQyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9tYXhpbV90aGVybW9jb3VwbGUuYwpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIG1heGltX3RoZXJtb2NvdXBsZS5jICAtIFN1cHBvcnQgZm9yIE1heGltIHRoZXJtb2NvdXBsZSBjaGlwcworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBNYXR0IFJhbm9zdGF5IDxtcmFub3N0YXlAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3RyaWdnZXJfY29uc3VtZXIuaD4KKworI2RlZmluZSBNQVhJTV9USEVSTU9DT1VQTEVfRFJWX05BTUUJIm1heGltX3RoZXJtb2NvdXBsZSIKKworZW51bSB7CisJTUFYNjY3NSwKKwlNQVgzMTg1NSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBtYXg2Njc1X2NoYW5uZWxzW10gPSB7CisJewkvKiB0aGVybW9jb3VwbGUgdGVtcGVyYXR1cmUgKi8KKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9CisJCQlCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAorCQkuc2Nhbl9pbmRleCA9IDAsCisJCS5zY2FuX3R5cGUgPSB7CisJCQkuc2lnbiA9ICdzJywKKwkJCS5yZWFsYml0cyA9IDEzLAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCQkuc2hpZnQgPSAzLAorCQkJLmVuZGlhbm5lc3MgPSBJSU9fQkUsCisJCX0sCisJfSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBtYXgzMTg1NV9jaGFubmVsc1tdID0geworCXsJLyogdGhlcm1vY291cGxlIHRlbXBlcmF0dXJlICovCisJCS50eXBlID0gSUlPX1RFTVAsCisJCS5hZGRyZXNzID0gMiwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9CisJCQlCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAorCQkuc2Nhbl9pbmRleCA9IDAsCisJCS5zY2FuX3R5cGUgPSB7CisJCQkuc2lnbiA9ICdzJywKKwkJCS5yZWFsYml0cyA9IDE0LAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCQkuc2hpZnQgPSAyLAorCQkJLmVuZGlhbm5lc3MgPSBJSU9fQkUsCisJCX0sCisJfSwKKwl7CS8qIGNvbGQganVuY3Rpb24gdGVtcGVyYXR1cmUgKi8KKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmFkZHJlc3MgPSAwLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1RFTVBfQU1CSUVOVCwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9CisJCQlCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAorCQkuc2Nhbl9pbmRleCA9IDEsCisJCS5zY2FuX3R5cGUgPSB7CisJCQkuc2lnbiA9ICdzJywKKwkJCS5yZWFsYml0cyA9IDEyLAorCQkJLnN0b3JhZ2ViaXRzID0gMTYsCisJCQkuc2hpZnQgPSA0LAorCQkJLmVuZGlhbm5lc3MgPSBJSU9fQkUsCisJCX0sCisJfSwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgyKSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIG1heDMxODU1X3NjYW5fbWFza3NbXSA9IHsweDMsIDB9OworCitzdHJ1Y3QgbWF4aW1fdGhlcm1vY291cGxlX2NoaXAgeworCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFubmVsczsKKwljb25zdCB1bnNpZ25lZCBsb25nICpzY2FuX21hc2tzOworCXU4IG51bV9jaGFubmVsczsKKwl1OCByZWFkX3NpemU7CisKKwkvKiBiaXQtY2hlY2sgZm9yIHZhbGlkIGlucHV0ICovCisJdTMyIHN0YXR1c19iaXQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1heGltX3RoZXJtb2NvdXBsZV9jaGlwIG1heGltX3RoZXJtb2NvdXBsZV9jaGlwc1tdID0geworCVtNQVg2Njc1XSA9IHsKKwkJCS5jaGFubmVscyA9IG1heDY2NzVfY2hhbm5lbHMsCisJCQkubnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShtYXg2Njc1X2NoYW5uZWxzKSwKKwkJCS5yZWFkX3NpemUgPSAyLAorCQkJLnN0YXR1c19iaXQgPSBCSVQoMiksCisJCX0sCisJW01BWDMxODU1XSA9IHsKKwkJCS5jaGFubmVscyA9IG1heDMxODU1X2NoYW5uZWxzLAorCQkJLm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUobWF4MzE4NTVfY2hhbm5lbHMpLAorCQkJLnJlYWRfc2l6ZSA9IDQsCisJCQkuc2Nhbl9tYXNrcyA9IG1heDMxODU1X3NjYW5fbWFza3MsCisJCQkuc3RhdHVzX2JpdCA9IEJJVCgxNiksCisJCX0sCit9OworCitzdHJ1Y3QgbWF4aW1fdGhlcm1vY291cGxlX2RhdGEgeworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CisJY29uc3Qgc3RydWN0IG1heGltX3RoZXJtb2NvdXBsZV9jaGlwICpjaGlwOworCisJdTggYnVmZmVyWzE2XSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7Cit9OworCitzdGF0aWMgaW50IG1heGltX3RoZXJtb2NvdXBsZV9yZWFkKHN0cnVjdCBtYXhpbV90aGVybW9jb3VwbGVfZGF0YSAqZGF0YSwKKwkJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50ICp2YWwpCit7CisJdW5zaWduZWQgaW50IHN0b3JhZ2VfYnl0ZXMgPSBkYXRhLT5jaGlwLT5yZWFkX3NpemU7CisJdW5zaWduZWQgaW50IHNoaWZ0ID0gY2hhbi0+c2Nhbl90eXBlLnNoaWZ0ICsgKGNoYW4tPmFkZHJlc3MgKiA4KTsKKwl1bnNpZ25lZCBpbnQgYnVmOworCWludCByZXQ7CisKKwlyZXQgPSBzcGlfcmVhZChkYXRhLT5zcGksICh2b2lkICopICZidWYsIHN0b3JhZ2VfYnl0ZXMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHN0b3JhZ2VfYnl0ZXMpIHsKKwljYXNlIDI6CisJCSp2YWwgPSBiZTE2X3RvX2NwdShidWYpOworCQlicmVhazsKKwljYXNlIDQ6CisJCSp2YWwgPSBiZTMyX3RvX2NwdShidWYpOworCQlicmVhazsKKwl9CisKKwkvKiBjaGVjayB0byBiZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCByZWFkaW5nICovCisJaWYgKCp2YWwgJiBkYXRhLT5jaGlwLT5zdGF0dXNfYml0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSp2YWwgPSBzaWduX2V4dGVuZDMyKCp2YWwgPj4gc2hpZnQsIGNoYW4tPnNjYW5fdHlwZS5yZWFsYml0cyAtIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtYXhpbV90aGVybW9jb3VwbGVfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcHJpdmF0ZTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKKwlzdHJ1Y3QgbWF4aW1fdGhlcm1vY291cGxlX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBzcGlfcmVhZChkYXRhLT5zcGksIGRhdGEtPmJ1ZmZlciwgZGF0YS0+Y2hpcC0+cmVhZF9zaXplKTsKKwlpZiAoIXJldCkgeworCQlpaW9fcHVzaF90b19idWZmZXJzX3dpdGhfdGltZXN0YW1wKGluZGlvX2RldiwgZGF0YS0+YnVmZmVyLAorCQkJCQkJICAgaWlvX2dldF90aW1lX25zKGluZGlvX2RldikpOworCX0KKworCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4aW1fdGhlcm1vY291cGxlX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJCSAgICAgICBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IG1heGltX3RoZXJtb2NvdXBsZV9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCXJldCA9IGlpb19kZXZpY2VfY2xhaW1fZGlyZWN0X21vZGUoaW5kaW9fZGV2KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gbWF4aW1fdGhlcm1vY291cGxlX3JlYWQoZGF0YSwgY2hhbiwgdmFsKTsKKwkJaWlvX2RldmljZV9yZWxlYXNlX2RpcmVjdF9tb2RlKGluZGlvX2Rldik7CisKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisKKwkJYnJlYWs7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX1NDQUxFOgorCQlzd2l0Y2ggKGNoYW4tPmNoYW5uZWwyKSB7CisJCWNhc2UgSUlPX01PRF9URU1QX0FNQklFTlQ6CisJCQkqdmFsID0gNjI7CisJCQkqdmFsMiA9IDUwMDAwMDsgLyogMTAwMCAqIDAuMDYyNSAqLworCQkJcmV0ID0gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJKnZhbCA9IDI1MDsgLyogMTAwMCAqIDAuMjUgKi8KKwkJCXJldCA9IElJT19WQUxfSU5UOworCQl9OworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIG1heGltX3RoZXJtb2NvdXBsZV9pbmZvID0geworCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gbWF4aW1fdGhlcm1vY291cGxlX3JlYWRfcmF3LAorfTsKKworc3RhdGljIGludCBtYXhpbV90aGVybW9jb3VwbGVfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwljb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCAqaWQgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IG1heGltX3RoZXJtb2NvdXBsZV9kYXRhICpkYXRhOworCWNvbnN0IHN0cnVjdCBtYXhpbV90aGVybW9jb3VwbGVfY2hpcCAqY2hpcCA9CisJCQkmbWF4aW1fdGhlcm1vY291cGxlX2NoaXBzW2lkLT5kcml2ZXJfZGF0YV07CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmc3BpLT5kZXYsIHNpemVvZigqZGF0YSkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluZGlvX2Rldi0+aW5mbyA9ICZtYXhpbV90aGVybW9jb3VwbGVfaW5mbzsKKwlpbmRpb19kZXYtPm5hbWUgPSBNQVhJTV9USEVSTU9DT1VQTEVfRFJWX05BTUU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGNoaXAtPmNoYW5uZWxzOworCWluZGlvX2Rldi0+YXZhaWxhYmxlX3NjYW5fbWFza3MgPSBjaGlwLT5zY2FuX21hc2tzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gY2hpcC0+bnVtX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCWRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWRhdGEtPnNwaSA9IHNwaTsKKwlkYXRhLT5jaGlwID0gY2hpcDsKKworCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwgTlVMTCwKKwkJCQltYXhpbV90aGVybW9jb3VwbGVfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdfYnVmZmVyOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3VucmVnX2J1ZmZlcjoKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heGltX3RoZXJtb2NvdXBsZV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIG1heGltX3RoZXJtb2NvdXBsZV9pZFtdID0geworCXsibWF4NjY3NSIsIE1BWDY2NzV9LAorCXsibWF4MzE4NTUiLCBNQVgzMTg1NX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIG1heGltX3RoZXJtb2NvdXBsZV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBtYXhpbV90aGVybW9jb3VwbGVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gTUFYSU1fVEhFUk1PQ09VUExFX0RSVl9OQU1FLAorCX0sCisJLnByb2JlCQk9IG1heGltX3RoZXJtb2NvdXBsZV9wcm9iZSwKKwkucmVtb3ZlCQk9IG1heGltX3RoZXJtb2NvdXBsZV9yZW1vdmUsCisJLmlkX3RhYmxlCT0gbWF4aW1fdGhlcm1vY291cGxlX2lkLAorfTsKK21vZHVsZV9zcGlfZHJpdmVyKG1heGltX3RoZXJtb2NvdXBsZV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJNYXR0IFJhbm9zdGF5IDxtcmFub3N0YXlAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbSB0aGVybW9jb3VwbGUgc2Vuc29ycyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbXVsdGljYXN0LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYwppbmRleCAzYTNjNWQ3Li41MWM3OWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tdWx0aWNhc3QuYwpAQCAtMTA2LDcgKzEwNiw2IEBACiAJYXRvbWljX3QJCXJlZmNvdW50OwogCWVudW0gbWNhc3RfZ3JvdXBfc3RhdGUJc3RhdGU7CiAJc3RydWN0IGliX3NhX3F1ZXJ5CSpxdWVyeTsKLQlpbnQJCQlxdWVyeV9pZDsKIAl1MTYJCQlwa2V5X2luZGV4OwogCXU4CQkJbGVhdmVfc3RhdGU7CiAJaW50CQkJcmV0cmllczsKQEAgLTM0MCwxMSArMzM5LDcgQEAKIAkJCQkgICAgICAgbWVtYmVyLT5tdWx0aWNhc3QuY29tcF9tYXNrLAogCQkJCSAgICAgICAzMDAwLCBHRlBfS0VSTkVMLCBqb2luX2hhbmRsZXIsIGdyb3VwLAogCQkJCSAgICAgICAmZ3JvdXAtPnF1ZXJ5KTsKLQlpZiAocmV0ID49IDApIHsKLQkJZ3JvdXAtPnF1ZXJ5X2lkID0gcmV0OwotCQlyZXQgPSAwOwotCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiAocmV0ID4gMCkgPyAwIDogcmV0OwogfQogCiBzdGF0aWMgaW50IHNlbmRfbGVhdmUoc3RydWN0IG1jYXN0X2dyb3VwICpncm91cCwgdTggbGVhdmVfc3RhdGUpCkBAIC0zNjQsMTEgKzM1OSw3IEBACiAJCQkJICAgICAgIElCX1NBX01DTUVNQkVSX1JFQ19KT0lOX1NUQVRFLAogCQkJCSAgICAgICAzMDAwLCBHRlBfS0VSTkVMLCBsZWF2ZV9oYW5kbGVyLAogCQkJCSAgICAgICBncm91cCwgJmdyb3VwLT5xdWVyeSk7Ci0JaWYgKHJldCA+PSAwKSB7Ci0JCWdyb3VwLT5xdWVyeV9pZCA9IHJldDsKLQkJcmV0ID0gMDsKLQl9Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gKHJldCA+IDApID8gMCA6IHJldDsKIH0KIAogc3RhdGljIHZvaWQgam9pbl9ncm91cChzdHJ1Y3QgbWNhc3RfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgbWNhc3RfbWVtYmVyICptZW1iZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvS2NvbmZpZyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9LY29uZmlnCmluZGV4IDIzZjM4Y2YuLmFmZThiMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIElORklOSUJBTkRfQ1hHQjQKIAl0cmlzdGF0ZSAiQ2hlbHNpbyBUNC9UNSBSRE1BIERyaXZlciIKIAlkZXBlbmRzIG9uIENIRUxTSU9fVDQgJiYgSU5FVCAmJiAoSVBWNiB8fCBJUFY2PW4pCisJc2VsZWN0IENIRUxTSU9fTElCCiAJc2VsZWN0IEdFTkVSSUNfQUxMT0NBVE9SCiAJLS0taGVscC0tLQogCSAgVGhpcyBpcyBhbiBpV0FSUC9SRE1BIGRyaXZlciBmb3IgdGhlIENoZWxzaW8gVDQgYW5kIFQ1CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvTWFrZWZpbGUgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvTWFrZWZpbGUKaW5kZXggZTExY2Y3Mi4uZmE0MGI2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKIGNjZmxhZ3MteSA6PSAtSWRyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQKK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYgogCiBvYmotJChDT05GSUdfSU5GSU5JQkFORF9DWEdCNCkgKz0gaXdfY3hnYjQubwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCmluZGV4IGI2YTk1M2EuLjcxYzg4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jCkBAIC00OSw2ICs0OSw3IEBACiAKICNpbmNsdWRlIDxyZG1hL2liX2FkZHIuaD4KIAorI2luY2x1ZGUgPGxpYmN4Z2JfY20uaD4KICNpbmNsdWRlICJpd19jeGdiNC5oIgogI2luY2x1ZGUgImNsaXBfdGJsLmgiCiAKQEAgLTIzOSwxNSArMjQwLDEzIEBACiAKIHN0YXRpYyB2b2lkIHJlbGVhc2VfdGlkKHN0cnVjdCBjNGl3X3JkZXYgKnJkZXYsIHUzMiBod3RpZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgY3BsX3RpZF9yZWxlYXNlICpyZXE7CisJdTMyIGxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfdGlkX3JlbGVhc2UpLCAxNik7CiAKLQlza2IgPSBnZXRfc2tiKHNrYiwgc2l6ZW9mICpyZXEsIEdGUF9LRVJORUwpOworCXNrYiA9IGdldF9za2Ioc2tiLCBsZW4sIEdGUF9LRVJORUwpOwogCWlmICghc2tiKQogCQlyZXR1cm47Ci0JcmVxID0gKHN0cnVjdCBjcGxfdGlkX3JlbGVhc2UgKikgc2tiX3B1dChza2IsIHNpemVvZigqcmVxKSk7Ci0JSU5JVF9UUF9XUihyZXEsIGh3dGlkKTsKLQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9USURfUkVMRUFTRSwgaHd0aWQpKTsKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX1NFVFVQLCAwKTsKKworCWN4Z2JfbWtfdGlkX3JlbGVhc2Uoc2tiLCBsZW4sIGh3dGlkLCAwKTsKIAljNGl3X29mbGRfc2VuZChyZGV2LCBza2IpOwogCXJldHVybjsKIH0KQEAgLTMzMyw2ICszMzIsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVwLT5jb20uZGV2LT5sb2NrLCBmbGFncyk7CiAJX3JlbW92ZV9oYW5kbGUoZXAtPmNvbS5kZXYsICZlcC0+Y29tLmRldi0+aHd0aWRfaWRyLCBlcC0+aHd0aWQsIDApOworCWlmIChpZHJfaXNfZW1wdHkoJmVwLT5jb20uZGV2LT5od3RpZF9pZHIpKQorCQl3YWtlX3VwKCZlcC0+Y29tLmRldi0+d2FpdCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmNvbS5kZXYtPmxvY2ssIGZsYWdzKTsKIH0KIApAQCAtNDY0LDcyICs0NjUsNiBAQAogCXJldHVybiByZG1hX3ZsYW5fZGV2X3JlYWxfZGV2KGVncmVzc19kZXYpID8gOiBlZ3Jlc3NfZGV2OwogfQogCi1zdGF0aWMgaW50IG91cl9pbnRlcmZhY2Uoc3RydWN0IGM0aXdfZGV2ICpkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICplZ3Jlc3NfZGV2KQotewotCWludCBpOwotCi0JZWdyZXNzX2RldiA9IGdldF9yZWFsX2RldihlZ3Jlc3NfZGV2KTsKLQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5yZGV2LmxsZGkubnBvcnRzOyBpKyspCi0JCWlmIChkZXYtPnJkZXYubGxkaS5wb3J0c1tpXSA9PSBlZ3Jlc3NfZGV2KQotCQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICpmaW5kX3JvdXRlNihzdHJ1Y3QgYzRpd19kZXYgKmRldiwgX191OCAqbG9jYWxfaXAsCi0JCQkJICAgICBfX3U4ICpwZWVyX2lwLCBfX2JlMTYgbG9jYWxfcG9ydCwKLQkJCQkgICAgIF9fYmUxNiBwZWVyX3BvcnQsIHU4IHRvcywKLQkJCQkgICAgIF9fdTMyIHNpbjZfc2NvcGVfaWQpCi17Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKLQotCWlmIChJU19FTkFCTEVEKENPTkZJR19JUFY2KSkgewotCQlzdHJ1Y3QgZmxvd2k2IGZsNjsKLQotCQltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwotCQltZW1jcHkoJmZsNi5kYWRkciwgcGVlcl9pcCwgMTYpOwotCQltZW1jcHkoJmZsNi5zYWRkciwgbG9jYWxfaXAsIDE2KTsKLQkJaWYgKGlwdjZfYWRkcl90eXBlKCZmbDYuZGFkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKLQkJCWZsNi5mbG93aTZfb2lmID0gc2luNl9zY29wZV9pZDsKLQkJZHN0ID0gaXA2X3JvdXRlX291dHB1dCgmaW5pdF9uZXQsIE5VTEwsICZmbDYpOwotCQlpZiAoIWRzdCkKLQkJCWdvdG8gb3V0OwotCQlpZiAoIW91cl9pbnRlcmZhY2UoZGV2LCBpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2KSAmJgotCQkgICAgIShpcDZfZHN0X2lkZXYoZHN0KS0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykpIHsKLQkJCWRzdF9yZWxlYXNlKGRzdCk7Ci0JCQlkc3QgPSBOVUxMOwotCQl9Ci0JfQotCi1vdXQ6Ci0JcmV0dXJuIGRzdDsKLX0KLQotc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKmZpbmRfcm91dGUoc3RydWN0IGM0aXdfZGV2ICpkZXYsIF9fYmUzMiBsb2NhbF9pcCwKLQkJCQkgX19iZTMyIHBlZXJfaXAsIF9fYmUxNiBsb2NhbF9wb3J0LAotCQkJCSBfX2JlMTYgcGVlcl9wb3J0LCB1OCB0b3MpCi17Ci0Jc3RydWN0IHJ0YWJsZSAqcnQ7Ci0Jc3RydWN0IGZsb3dpNCBmbDQ7Ci0Jc3RydWN0IG5laWdoYm91ciAqbjsKLQotCXJ0ID0gaXBfcm91dGVfb3V0cHV0X3BvcnRzKCZpbml0X25ldCwgJmZsNCwgTlVMTCwgcGVlcl9pcCwgbG9jYWxfaXAsCi0JCQkJICAgcGVlcl9wb3J0LCBsb2NhbF9wb3J0LCBJUFBST1RPX1RDUCwKLQkJCQkgICB0b3MsIDApOwotCWlmIChJU19FUlIocnQpKQotCQlyZXR1cm4gTlVMTDsKLQluID0gZHN0X25laWdoX2xvb2t1cCgmcnQtPmRzdCwgJnBlZXJfaXApOwotCWlmICghbikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFvdXJfaW50ZXJmYWNlKGRldiwgbi0+ZGV2KSAmJgotCSAgICAhKG4tPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7Ci0JCW5laWdoX3JlbGVhc2Uobik7Ci0JCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5laWdoX3JlbGVhc2Uobik7Ci0JcmV0dXJuICZydC0+ZHN0OwotfQotCiBzdGF0aWMgdm9pZCBhcnBfZmFpbHVyZV9kaXNjYXJkKHZvaWQgKmhhbmRsZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlwcl9lcnIoTU9EICJBUlAgZmFpbHVyZVxuIik7CkBAIC03MDQsNTggKzYzOSwzNCBAQAogCiBzdGF0aWMgaW50IHNlbmRfaGFsZmNsb3NlKHN0cnVjdCBjNGl3X2VwICplcCkKIHsKLQlzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEgKnJlcTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2tiX2RlcXVldWUoJmVwLT5jb20uZXBfc2tiX2xpc3QpOwotCWludCB3cmxlbiA9IHJvdW5kdXAoc2l6ZW9mICpyZXEsIDE2KTsKKwl1MzIgd3JsZW4gPSByb3VuZHVwKHNpemVvZihzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEpLCAxNik7CiAKIAlQREJHKCIlcyBlcCAlcCB0aWQgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkKTsKIAlpZiAoV0FSTl9PTighc2tiKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGVwLT50eHFfaWR4KTsKLQl0NF9zZXRfYXJwX2Vycl9oYW5kbGVyKHNrYiwgTlVMTCwgYXJwX2ZhaWx1cmVfZGlzY2FyZCk7Ci0JcmVxID0gKHN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSAqKSBza2JfcHV0KHNrYiwgd3JsZW4pOwotCW1lbXNldChyZXEsIDAsIHdybGVuKTsKLQlJTklUX1RQX1dSKHJlcSwgZXAtPmh3dGlkKTsKLQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9DTE9TRV9DT05fUkVRLAotCQkJCQkJICAgIGVwLT5od3RpZCkpOworCWN4Z2JfbWtfY2xvc2VfY29uX3JlcShza2IsIHdybGVuLCBlcC0+aHd0aWQsIGVwLT50eHFfaWR4LAorCQkJICAgICAgTlVMTCwgYXJwX2ZhaWx1cmVfZGlzY2FyZCk7CisKIAlyZXR1cm4gYzRpd19sMnRfc2VuZCgmZXAtPmNvbS5kZXYtPnJkZXYsIHNrYiwgZXAtPmwydCk7CiB9CiAKIHN0YXRpYyBpbnQgc2VuZF9hYm9ydChzdHJ1Y3QgYzRpd19lcCAqZXApCiB7Ci0Jc3RydWN0IGNwbF9hYm9ydF9yZXEgKnJlcTsKLQlpbnQgd3JsZW4gPSByb3VuZHVwKHNpemVvZiAqcmVxLCAxNik7CisJdTMyIHdybGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF9hYm9ydF9yZXEpLCAxNik7CiAJc3RydWN0IHNrX2J1ZmYgKnJlcV9za2IgPSBza2JfZGVxdWV1ZSgmZXAtPmNvbS5lcF9za2JfbGlzdCk7CiAKIAlQREJHKCIlcyBlcCAlcCB0aWQgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkKTsKIAlpZiAoV0FSTl9PTighcmVxX3NrYikpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc2V0X3dyX3R4cShyZXFfc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgZXAtPnR4cV9pZHgpOwotCXQ0X3NldF9hcnBfZXJyX2hhbmRsZXIocmVxX3NrYiwgZXAsIGFib3J0X2FycF9mYWlsdXJlKTsKLQlyZXEgPSAoc3RydWN0IGNwbF9hYm9ydF9yZXEgKilza2JfcHV0KHJlcV9za2IsIHdybGVuKTsKLQltZW1zZXQocmVxLCAwLCB3cmxlbik7Ci0JSU5JVF9UUF9XUihyZXEsIGVwLT5od3RpZCk7Ci0JT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQUJPUlRfUkVRLCBlcC0+aHd0aWQpKTsKLQlyZXEtPmNtZCA9IENQTF9BQk9SVF9TRU5EX1JTVDsKKwljeGdiX21rX2Fib3J0X3JlcShyZXFfc2tiLCB3cmxlbiwgZXAtPmh3dGlkLCBlcC0+dHhxX2lkeCwKKwkJCSAgZXAsIGFib3J0X2FycF9mYWlsdXJlKTsKKwogCXJldHVybiBjNGl3X2wydF9zZW5kKCZlcC0+Y29tLmRldi0+cmRldiwgcmVxX3NrYiwgZXAtPmwydCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJlc3RfbXR1KGNvbnN0IHVuc2lnbmVkIHNob3J0ICptdHVzLCB1bnNpZ25lZCBzaG9ydCBtdHUsCi0JCSAgICAgdW5zaWduZWQgaW50ICppZHgsIGludCB1c2VfdHMsIGludCBpcHY2KQotewotCXVuc2lnbmVkIHNob3J0IGhkcl9zaXplID0gKGlwdjYgPwotCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgOgotCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSArCi0JCQkJICBzaXplb2Yoc3RydWN0IHRjcGhkcikgKwotCQkJCSAgKHVzZV90cyA/Ci0JCQkJICAgcm91bmRfdXAoVENQT0xFTl9USU1FU1RBTVAsIDQpIDogMCk7Ci0JdW5zaWduZWQgc2hvcnQgZGF0YV9zaXplID0gbXR1IC0gaGRyX3NpemU7Ci0KLQljeGdiNF9iZXN0X2FsaWduZWRfbXR1KG10dXMsIGhkcl9zaXplLCBkYXRhX3NpemUsIDgsIGlkeCk7Ci19Ci0KIHN0YXRpYyBpbnQgc2VuZF9jb25uZWN0KHN0cnVjdCBjNGl3X2VwICplcCkKIHsKIAlzdHJ1Y3QgY3BsX2FjdF9vcGVuX3JlcSAqcmVxID0gTlVMTDsKQEAgLTc2OCw3ICs2NzksNyBAQAogCXU2NCBvcHQwOwogCXUzMiBvcHQyOwogCXVuc2lnbmVkIGludCBtdHVfaWR4OwotCWludCB3c2NhbGU7CisJdTMyIHdzY2FsZTsKIAlpbnQgd2luLCBzaXpldjQsIHNpemV2Niwgd3JsZW47CiAJc3RydWN0IHNvY2thZGRyX2luICpsYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikKIAkJCQkgJmVwLT5jb20ubG9jYWxfYWRkcjsKQEAgLTgxNSwxMCArNzI2LDEwIEBACiAJfQogCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfU0VUVVAsIGVwLT5jdHJscV9pZHgpOwogCi0JYmVzdF9tdHUoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5tdHVzLCBlcC0+bXR1LCAmbXR1X2lkeCwKLQkJIGVuYWJsZV90Y3BfdGltZXN0YW1wcywKLQkJIChBRl9JTkVUID09IGVwLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5KSA/IDAgOiAxKTsKLQl3c2NhbGUgPSBjb21wdXRlX3dzY2FsZShyY3Zfd2luKTsKKwljeGdiX2Jlc3RfbXR1KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubXR1cywgZXAtPm10dSwgJm10dV9pZHgsCisJCSAgICAgIGVuYWJsZV90Y3BfdGltZXN0YW1wcywKKwkJICAgICAgKGVwLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpID8gMCA6IDEpOworCXdzY2FsZSA9IGN4Z2JfY29tcHV0ZV93c2NhbGUocmN2X3dpbik7CiAKIAkvKgogCSAqIFNwZWNpZnkgdGhlIGxhcmdlc3Qgd2luZG93IHRoYXQgd2lsbCBmaXQgaW4gb3B0MC4gVGhlCkBAIC0xNDQ1LDkgKzEzNTYsOSBAQAogCiBzdGF0aWMgaW50IHVwZGF0ZV9yeF9jcmVkaXRzKHN0cnVjdCBjNGl3X2VwICplcCwgdTMyIGNyZWRpdHMpCiB7Ci0Jc3RydWN0IGNwbF9yeF9kYXRhX2FjayAqcmVxOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHdybGVuID0gcm91bmR1cChzaXplb2YgKnJlcSwgMTYpOworCXUzMiB3cmxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfcnhfZGF0YV9hY2spLCAxNik7CisJdTMyIGNyZWRpdF9kYWNrOwogCiAJUERCRygiJXMgZXAgJXAgdGlkICV1IGNyZWRpdHMgJXVcbiIsIF9fZnVuY19fLCBlcCwgZXAtPmh3dGlkLCBjcmVkaXRzKTsKIAlza2IgPSBnZXRfc2tiKE5VTEwsIHdybGVuLCBHRlBfS0VSTkVMKTsKQEAgLTE0NjQsMTUgKzEzNzUsMTIgQEAKIAlpZiAoZXAtPnJjdl93aW4gPiBSQ1ZfQlVGU0laX00gKiAxMDI0KQogCQljcmVkaXRzICs9IGVwLT5yY3Zfd2luIC0gUkNWX0JVRlNJWl9NICogMTAyNDsKIAotCXJlcSA9IChzdHJ1Y3QgY3BsX3J4X2RhdGFfYWNrICopIHNrYl9wdXQoc2tiLCB3cmxlbik7Ci0JbWVtc2V0KHJlcSwgMCwgd3JsZW4pOwotCUlOSVRfVFBfV1IocmVxLCBlcC0+aHd0aWQpOwotCU9QQ09ERV9USUQocmVxKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX1JYX0RBVEFfQUNLLAotCQkJCQkJICAgIGVwLT5od3RpZCkpOwotCXJlcS0+Y3JlZGl0X2RhY2sgPSBjcHVfdG9fYmUzMihjcmVkaXRzIHwgUlhfRk9SQ0VfQUNLX0YgfAotCQkJCSAgICAgICBSWF9EQUNLX0NIQU5HRV9GIHwKLQkJCQkgICAgICAgUlhfREFDS19NT0RFX1YoZGFja19tb2RlKSk7Ci0Jc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9BQ0ssIGVwLT5jdHJscV9pZHgpOworCWNyZWRpdF9kYWNrID0gY3JlZGl0cyB8IFJYX0ZPUkNFX0FDS19GIHwgUlhfREFDS19DSEFOR0VfRiB8CisJCSAgICAgIFJYX0RBQ0tfTU9ERV9WKGRhY2tfbW9kZSk7CisKKwljeGdiX21rX3J4X2RhdGFfYWNrKHNrYiwgd3JsZW4sIGVwLT5od3RpZCwgZXAtPmN0cmxxX2lkeCwKKwkJCSAgICBjcmVkaXRfZGFjayk7CisKIAljNGl3X29mbGRfc2VuZCgmZXAtPmNvbS5kZXYtPnJkZXYsIHNrYik7CiAJcmV0dXJuIGNyZWRpdHM7CiB9CkBAIC0xOTcwLDcgKzE4NzgsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGZ3X29mbGRfY29ubmVjdGlvbl93ciAqcmVxOwogCXVuc2lnbmVkIGludCBtdHVfaWR4OwotCWludCB3c2NhbGU7CisJdTMyIHdzY2FsZTsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKIAlpbnQgd2luOwogCkBAIC0xOTk1LDEwICsxOTAzLDEwIEBACiAJCQlodG9ucyhGV19PRkxEX0NPTk5FQ1RJT05fV1JfQ1BMUlhEQVRBQUNLX0YpOwogCXJlcS0+dGNiLnR4X21heCA9IChfX2ZvcmNlIF9fYmUzMikgamlmZmllczsKIAlyZXEtPnRjYi5yY3ZfYWR2ID0gaHRvbnMoMSk7Ci0JYmVzdF9tdHUoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5tdHVzLCBlcC0+bXR1LCAmbXR1X2lkeCwKLQkJIGVuYWJsZV90Y3BfdGltZXN0YW1wcywKLQkJIChBRl9JTkVUID09IGVwLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5KSA/IDAgOiAxKTsKLQl3c2NhbGUgPSBjb21wdXRlX3dzY2FsZShyY3Zfd2luKTsKKwljeGdiX2Jlc3RfbXR1KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubXR1cywgZXAtPm10dSwgJm10dV9pZHgsCisJCSAgICAgIGVuYWJsZV90Y3BfdGltZXN0YW1wcywKKwkJICAgICAgKGVwLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpID8gMCA6IDEpOworCXdzY2FsZSA9IGN4Z2JfY29tcHV0ZV93c2NhbGUocmN2X3dpbik7CiAKIAkvKgogCSAqIFNwZWNpZnkgdGhlIGxhcmdlc3Qgd2luZG93IHRoYXQgd2lsbCBmaXQgaW4gb3B0MC4gVGhlCkBAIC0yMDUyLDE1ICsxOTYwLDYgQEAKIAkJc3RhdHVzICE9IENQTF9FUlJfQ09OTl9FWElTVCk7CiB9CiAKLS8qIFJldHVybnMgd2hldGhlciBhIENQTCBzdGF0dXMgY29udmV5cyBuZWdhdGl2ZSBhZHZpY2UuCi0gKi8KLXN0YXRpYyBpbnQgaXNfbmVnX2Fkdih1bnNpZ25lZCBpbnQgc3RhdHVzKQotewotCXJldHVybiBzdGF0dXMgPT0gQ1BMX0VSUl9SVFhfTkVHX0FEVklDRSB8fAotCSAgICAgICBzdGF0dXMgPT0gQ1BMX0VSUl9QRVJTSVNUX05FR19BRFZJQ0UgfHwKLQkgICAgICAgc3RhdHVzID09IENQTF9FUlJfS0VFUEFMVl9ORUdfQURWSUNFOwotfQotCiBzdGF0aWMgY2hhciAqbmVnX2Fkdl9zdHIodW5zaWduZWQgaW50IHN0YXR1cykKIHsKIAlzd2l0Y2ggKHN0YXR1cykgewpAQCAtMjExNyw4ICsyMDE2LDEwIEBACiAJCX0KIAkJZXAtPmwydCA9IGN4Z2I0X2wydF9nZXQoY2Rldi0+cmRldi5sbGRpLmwydCwKIAkJCQkJbiwgcGRldiwgcnRfdG9zMnByaW9yaXR5KHRvcykpOwotCQlpZiAoIWVwLT5sMnQpCisJCWlmICghZXAtPmwydCkgeworCQkJZGV2X3B1dChwZGV2KTsKIAkJCWdvdG8gb3V0OworCQl9CiAJCWVwLT5tdHUgPSBwZGV2LT5tdHU7CiAJCWVwLT50eF9jaGFuID0gY3hnYjRfcG9ydF9jaGFuKHBkZXYpOwogCQllcC0+c21hY19pZHggPSBjeGdiNF90cF9zbXRfaWR4KGFkYXB0ZXJfdHlwZSwKQEAgLTIyMTQsMTYgKzIxMTUsMjEgQEAKIAogCS8qIGZpbmQgYSByb3V0ZSAqLwogCWlmIChlcC0+Y29tLmNtX2lkLT5tX2xvY2FsX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpIHsKLQkJZXAtPmRzdCA9IGZpbmRfcm91dGUoZXAtPmNvbS5kZXYsIGxhZGRyLT5zaW5fYWRkci5zX2FkZHIsCi0JCQkJICAgICByYWRkci0+c2luX2FkZHIuc19hZGRyLCBsYWRkci0+c2luX3BvcnQsCi0JCQkJICAgICByYWRkci0+c2luX3BvcnQsIGVwLT5jb20uY21faWQtPnRvcyk7CisJCWVwLT5kc3QgPSBjeGdiX2ZpbmRfcm91dGUoJmVwLT5jb20uZGV2LT5yZGV2LmxsZGksIGdldF9yZWFsX2RldiwKKwkJCQkJICBsYWRkci0+c2luX2FkZHIuc19hZGRyLAorCQkJCQkgIHJhZGRyLT5zaW5fYWRkci5zX2FkZHIsCisJCQkJCSAgbGFkZHItPnNpbl9wb3J0LAorCQkJCQkgIHJhZGRyLT5zaW5fcG9ydCwgZXAtPmNvbS5jbV9pZC0+dG9zKTsKIAkJaXB0eXBlID0gNDsKIAkJcmEgPSAoX191OCAqKSZyYWRkci0+c2luX2FkZHI7CiAJfSBlbHNlIHsKLQkJZXAtPmRzdCA9IGZpbmRfcm91dGU2KGVwLT5jb20uZGV2LCBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAotCQkJCSAgICAgIHJhZGRyNi0+c2luNl9hZGRyLnM2X2FkZHIsCi0JCQkJICAgICAgbGFkZHI2LT5zaW42X3BvcnQsIHJhZGRyNi0+c2luNl9wb3J0LCAwLAotCQkJCSAgICAgIHJhZGRyNi0+c2luNl9zY29wZV9pZCk7CisJCWVwLT5kc3QgPSBjeGdiX2ZpbmRfcm91dGU2KCZlcC0+Y29tLmRldi0+cmRldi5sbGRpLAorCQkJCQkgICBnZXRfcmVhbF9kZXYsCisJCQkJCSAgIGxhZGRyNi0+c2luNl9hZGRyLnM2X2FkZHIsCisJCQkJCSAgIHJhZGRyNi0+c2luNl9hZGRyLnM2X2FkZHIsCisJCQkJCSAgIGxhZGRyNi0+c2luNl9wb3J0LAorCQkJCQkgICByYWRkcjYtPnNpbjZfcG9ydCwgMCwKKwkJCQkJICAgcmFkZHI2LT5zaW42X3Njb3BlX2lkKTsKIAkJaXB0eXBlID0gNjsKIAkJcmEgPSAoX191OCAqKSZyYWRkcjYtPnNpbjZfYWRkcjsKIAl9CkBAIC0yMjk1LDcgKzIyMDEsNyBAQAogCVBEQkcoIiVzIGVwICVwIGF0aWQgJXUgc3RhdHVzICV1IGVycm5vICVkXG4iLCBfX2Z1bmNfXywgZXAsIGF0aWQsCiAJICAgICBzdGF0dXMsIHN0YXR1czJlcnJubyhzdGF0dXMpKTsKIAotCWlmIChpc19uZWdfYWR2KHN0YXR1cykpIHsKKwlpZiAoY3hnYl9pc19uZWdfYWR2KHN0YXR1cykpIHsKIAkJUERCRygiJXMgQ29ubmVjdGlvbiBwcm9ibGVtcyBmb3IgYXRpZCAldSBzdGF0dXMgJXUgKCVzKVxuIiwKIAkJICAgICBfX2Z1bmNfXywgYXRpZCwgc3RhdHVzLCBuZWdfYWR2X3N0cihzdGF0dXMpKTsKIAkJZXAtPnN0YXRzLmNvbm5lY3RfbmVnX2FkdisrOwpAQCAtMjQyMiw3ICsyMzI4LDcgQEAKIAl1bnNpZ25lZCBpbnQgbXR1X2lkeDsKIAl1NjQgb3B0MDsKIAl1MzIgb3B0MjsKLQlpbnQgd3NjYWxlOworCXUzMiB3c2NhbGU7CiAJc3RydWN0IGNwbF90NV9wYXNzX2FjY2VwdF9ycGwgKnJwbDUgPSBOVUxMOwogCWludCB3aW47CiAJZW51bSBjaGlwX3R5cGUgYWRhcHRlcl90eXBlID0gZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5hZGFwdGVyX3R5cGU7CkBAIC0yNDQzLDEwICsyMzQ5LDEwIEBACiAJT1BDT0RFX1RJRChycGwpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfUEFTU19BQ0NFUFRfUlBMLAogCQkJCQkJICAgIGVwLT5od3RpZCkpOwogCi0JYmVzdF9tdHUoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5tdHVzLCBlcC0+bXR1LCAmbXR1X2lkeCwKLQkJIGVuYWJsZV90Y3BfdGltZXN0YW1wcyAmJiByZXEtPnRjcG9wdC50c3RhbXAsCi0JCSAoQUZfSU5FVCA9PSBlcC0+Y29tLnJlbW90ZV9hZGRyLnNzX2ZhbWlseSkgPyAwIDogMSk7Ci0Jd3NjYWxlID0gY29tcHV0ZV93c2NhbGUocmN2X3dpbik7CisJY3hnYl9iZXN0X210dShlcC0+Y29tLmRldi0+cmRldi5sbGRpLm10dXMsIGVwLT5tdHUsICZtdHVfaWR4LAorCQkgICAgICBlbmFibGVfdGNwX3RpbWVzdGFtcHMgJiYgcmVxLT50Y3BvcHQudHN0YW1wLAorCQkgICAgICAoZXAtPmNvbS5yZW1vdGVfYWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVCkgPyAwIDogMSk7CisJd3NjYWxlID0gY3hnYl9jb21wdXRlX3dzY2FsZShyY3Zfd2luKTsKIAogCS8qCiAJICogU3BlY2lmeSB0aGUgbGFyZ2VzdCB3aW5kb3cgdGhhdCB3aWxsIGZpdCBpbiBvcHQwLiBUaGUKQEAgLTI1MTgsNDIgKzI0MjQsNiBAQAogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgZ2V0XzR0dXBsZShzdHJ1Y3QgY3BsX3Bhc3NfYWNjZXB0X3JlcSAqcmVxLCBlbnVtIGNoaXBfdHlwZSB0eXBlLAotCQkgICAgICAgaW50ICppcHR5cGUsIF9fdTggKmxvY2FsX2lwLCBfX3U4ICpwZWVyX2lwLAotCQkgICAgICAgX19iZTE2ICpsb2NhbF9wb3J0LCBfX2JlMTYgKnBlZXJfcG9ydCkKLXsKLQlpbnQgZXRoX2xlbiA9IChDSEVMU0lPX0NISVBfVkVSU0lPTih0eXBlKSA8PSBDSEVMU0lPX1Q1KSA/Ci0JCSAgICAgIEVUSF9IRFJfTEVOX0coYmUzMl90b19jcHUocmVxLT5oZHJfbGVuKSkgOgotCQkgICAgICBUNl9FVEhfSERSX0xFTl9HKGJlMzJfdG9fY3B1KHJlcS0+aGRyX2xlbikpOwotCWludCBpcF9sZW4gPSAoQ0hFTFNJT19DSElQX1ZFUlNJT04odHlwZSkgPD0gQ0hFTFNJT19UNSkgPwotCQkgICAgIElQX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKSA6Ci0JCSAgICAgVDZfSVBfSERSX0xFTl9HKGJlMzJfdG9fY3B1KHJlcS0+aGRyX2xlbikpOwotCXN0cnVjdCBpcGhkciAqaXAgPSAoc3RydWN0IGlwaGRyICopKCh1OCAqKShyZXEgKyAxKSArIGV0aF9sZW4pOwotCXN0cnVjdCBpcHY2aGRyICppcDYgPSAoc3RydWN0IGlwdjZoZHIgKikoKHU4ICopKHJlcSArIDEpICsgZXRoX2xlbik7Ci0Jc3RydWN0IHRjcGhkciAqdGNwID0gKHN0cnVjdCB0Y3BoZHIgKikKLQkJCSAgICAgKCh1OCAqKShyZXEgKyAxKSArIGV0aF9sZW4gKyBpcF9sZW4pOwotCi0JaWYgKGlwLT52ZXJzaW9uID09IDQpIHsKLQkJUERCRygiJXMgc2FkZHIgMHgleCBkYWRkciAweCV4IHNwb3J0ICV1IGRwb3J0ICV1XG4iLCBfX2Z1bmNfXywKLQkJICAgICBudG9obChpcC0+c2FkZHIpLCBudG9obChpcC0+ZGFkZHIpLCBudG9ocyh0Y3AtPnNvdXJjZSksCi0JCSAgICAgbnRvaHModGNwLT5kZXN0KSk7Ci0JCSppcHR5cGUgPSA0OwotCQltZW1jcHkocGVlcl9pcCwgJmlwLT5zYWRkciwgNCk7Ci0JCW1lbWNweShsb2NhbF9pcCwgJmlwLT5kYWRkciwgNCk7Ci0JfSBlbHNlIHsKLQkJUERCRygiJXMgc2FkZHIgJXBJNiBkYWRkciAlcEk2IHNwb3J0ICV1IGRwb3J0ICV1XG4iLCBfX2Z1bmNfXywKLQkJICAgICBpcDYtPnNhZGRyLnM2X2FkZHIsIGlwNi0+ZGFkZHIuczZfYWRkciwgbnRvaHModGNwLT5zb3VyY2UpLAotCQkgICAgIG50b2hzKHRjcC0+ZGVzdCkpOwotCQkqaXB0eXBlID0gNjsKLQkJbWVtY3B5KHBlZXJfaXAsIGlwNi0+c2FkZHIuczZfYWRkciwgMTYpOwotCQltZW1jcHkobG9jYWxfaXAsIGlwNi0+ZGFkZHIuczZfYWRkciwgMTYpOwotCX0KLQkqcGVlcl9wb3J0ID0gdGNwLT5zb3VyY2U7Ci0JKmxvY2FsX3BvcnQgPSB0Y3AtPmRlc3Q7Ci0KLQlyZXR1cm47Ci19Ci0KIHN0YXRpYyBpbnQgcGFzc19hY2NlcHRfcmVxKHN0cnVjdCBjNGl3X2RldiAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBjNGl3X2VwICpjaGlsZF9lcCA9IE5VTEwsICpwYXJlbnRfZXA7CkBAIC0yNTgyLDggKzI0NTIsOCBAQAogCQlnb3RvIHJlamVjdDsKIAl9CiAKLQlnZXRfNHR1cGxlKHJlcSwgcGFyZW50X2VwLT5jb20uZGV2LT5yZGV2LmxsZGkuYWRhcHRlcl90eXBlLCAmaXB0eXBlLAotCQkgICBsb2NhbF9pcCwgcGVlcl9pcCwgJmxvY2FsX3BvcnQsICZwZWVyX3BvcnQpOworCWN4Z2JfZ2V0XzR0dXBsZShyZXEsIHBhcmVudF9lcC0+Y29tLmRldi0+cmRldi5sbGRpLmFkYXB0ZXJfdHlwZSwKKwkJCSZpcHR5cGUsIGxvY2FsX2lwLCBwZWVyX2lwLCAmbG9jYWxfcG9ydCwgJnBlZXJfcG9ydCk7CiAKIAkvKiBGaW5kIG91dHB1dCByb3V0ZSAqLwogCWlmIChpcHR5cGUgPT0gNCkgIHsKQEAgLTI1OTEsMTggKzI0NjEsMTkgQEAKIAkJICAgICAsIF9fZnVuY19fLCBwYXJlbnRfZXAsIGh3dGlkLAogCQkgICAgIGxvY2FsX2lwLCBwZWVyX2lwLCBudG9ocyhsb2NhbF9wb3J0KSwKIAkJICAgICBudG9ocyhwZWVyX3BvcnQpLCBwZWVyX21zcyk7Ci0JCWRzdCA9IGZpbmRfcm91dGUoZGV2LCAqKF9fYmUzMiAqKWxvY2FsX2lwLCAqKF9fYmUzMiAqKXBlZXJfaXAsCi0JCQkJIGxvY2FsX3BvcnQsIHBlZXJfcG9ydCwKLQkJCQkgdG9zKTsKKwkJZHN0ID0gY3hnYl9maW5kX3JvdXRlKCZkZXYtPnJkZXYubGxkaSwgZ2V0X3JlYWxfZGV2LAorCQkJCSAgICAgICooX19iZTMyICopbG9jYWxfaXAsICooX19iZTMyICopcGVlcl9pcCwKKwkJCQkgICAgICBsb2NhbF9wb3J0LCBwZWVyX3BvcnQsIHRvcyk7CiAJfSBlbHNlIHsKIAkJUERCRygiJXMgcGFyZW50IGVwICVwIGh3dGlkICV1IGxhZGRyICVwSTYgcmFkZHIgJXBJNiBscG9ydCAlZCBycG9ydCAlZCBwZWVyX21zcyAlZFxuIgogCQkgICAgICwgX19mdW5jX18sIHBhcmVudF9lcCwgaHd0aWQsCiAJCSAgICAgbG9jYWxfaXAsIHBlZXJfaXAsIG50b2hzKGxvY2FsX3BvcnQpLAogCQkgICAgIG50b2hzKHBlZXJfcG9ydCksIHBlZXJfbXNzKTsKLQkJZHN0ID0gZmluZF9yb3V0ZTYoZGV2LCBsb2NhbF9pcCwgcGVlcl9pcCwgbG9jYWxfcG9ydCwgcGVlcl9wb3J0LAotCQkJCSAgUEFTU19PUEVOX1RPU19HKG50b2hsKHJlcS0+dG9zX3N0aWQpKSwKLQkJCQkgICgoc3RydWN0IHNvY2thZGRyX2luNiAqKQotCQkJCSAgJnBhcmVudF9lcC0+Y29tLmxvY2FsX2FkZHIpLT5zaW42X3Njb3BlX2lkKTsKKwkJZHN0ID0gY3hnYl9maW5kX3JvdXRlNigmZGV2LT5yZGV2LmxsZGksIGdldF9yZWFsX2RldiwKKwkJCQlsb2NhbF9pcCwgcGVlcl9pcCwgbG9jYWxfcG9ydCwgcGVlcl9wb3J0LAorCQkJCVBBU1NfT1BFTl9UT1NfRyhudG9obChyZXEtPnRvc19zdGlkKSksCisJCQkJKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopCisJCQkJICZwYXJlbnRfZXAtPmNvbS5sb2NhbF9hZGRyKS0+c2luNl9zY29wZV9pZCk7CiAJfQogCWlmICghZHN0KSB7CiAJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIC0gZmFpbGVkIHRvIGZpbmQgZHN0IGVudHJ5IVxuIiwKQEAgLTI4MzUsMTggKzI3MDYsMTggQEAKIHsKIAlzdHJ1Y3QgY3BsX2Fib3J0X3JlcV9yc3MgKnJlcSA9IGNwbGhkcihza2IpOwogCXN0cnVjdCBjNGl3X2VwICplcDsKLQlzdHJ1Y3QgY3BsX2Fib3J0X3JwbCAqcnBsOwogCXN0cnVjdCBza19idWZmICpycGxfc2tiOwogCXN0cnVjdCBjNGl3X3FwX2F0dHJpYnV0ZXMgYXR0cnM7CiAJaW50IHJldDsKIAlpbnQgcmVsZWFzZSA9IDA7CiAJdW5zaWduZWQgaW50IHRpZCA9IEdFVF9USUQocmVxKTsKKwl1MzIgbGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF9hYm9ydF9ycGwpLCAxNik7CiAKIAllcCA9IGdldF9lcF9mcm9tX3RpZChkZXYsIHRpZCk7CiAJaWYgKCFlcCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoaXNfbmVnX2FkdihyZXEtPnN0YXR1cykpIHsKKwlpZiAoY3hnYl9pc19uZWdfYWR2KHJlcS0+c3RhdHVzKSkgewogCQlQREJHKCIlcyBOZWdhdGl2ZSBhZHZpY2Ugb24gYWJvcnQtIHRpZCAldSBzdGF0dXMgJWQgKCVzKVxuIiwKIAkJICAgICBfX2Z1bmNfXywgZXAtPmh3dGlkLCByZXEtPnN0YXR1cywKIAkJICAgICBuZWdfYWR2X3N0cihyZXEtPnN0YXR1cykpOwpAQCAtMjkzOSwxMSArMjgxMCw5IEBACiAJCXJlbGVhc2UgPSAxOwogCQlnb3RvIG91dDsKIAl9Ci0Jc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBlcC0+dHhxX2lkeCk7Ci0JcnBsID0gKHN0cnVjdCBjcGxfYWJvcnRfcnBsICopIHNrYl9wdXQocnBsX3NrYiwgc2l6ZW9mKCpycGwpKTsKLQlJTklUX1RQX1dSKHJwbCwgZXAtPmh3dGlkKTsKLQlPUENPREVfVElEKHJwbCkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9BQk9SVF9SUEwsIGVwLT5od3RpZCkpOwotCXJwbC0+Y21kID0gQ1BMX0FCT1JUX05PX1JTVDsKKworCWN4Z2JfbWtfYWJvcnRfcnBsKHJwbF9za2IsIGxlbiwgZXAtPmh3dGlkLCBlcC0+dHhxX2lkeCk7CisKIAljNGl3X29mbGRfc2VuZCgmZXAtPmNvbS5kZXYtPnJkZXYsIHJwbF9za2IpOwogb3V0OgogCWlmIChyZWxlYXNlKQpAQCAtMzM3NSw5ICszMjQ0LDExIEBACiAJCVBEQkcoIiVzIHNhZGRyICVwSTQgc3BvcnQgMHgleCByYWRkciAlcEk0IHJwb3J0IDB4JXhcbiIsCiAJCSAgICAgX19mdW5jX18sICZsYWRkci0+c2luX2FkZHIsIG50b2hzKGxhZGRyLT5zaW5fcG9ydCksCiAJCSAgICAgcmEsIG50b2hzKHJhZGRyLT5zaW5fcG9ydCkpOwotCQllcC0+ZHN0ID0gZmluZF9yb3V0ZShkZXYsIGxhZGRyLT5zaW5fYWRkci5zX2FkZHIsCi0JCQkJICAgICByYWRkci0+c2luX2FkZHIuc19hZGRyLCBsYWRkci0+c2luX3BvcnQsCi0JCQkJICAgICByYWRkci0+c2luX3BvcnQsIGNtX2lkLT50b3MpOworCQllcC0+ZHN0ID0gY3hnYl9maW5kX3JvdXRlKCZkZXYtPnJkZXYubGxkaSwgZ2V0X3JlYWxfZGV2LAorCQkJCQkgIGxhZGRyLT5zaW5fYWRkci5zX2FkZHIsCisJCQkJCSAgcmFkZHItPnNpbl9hZGRyLnNfYWRkciwKKwkJCQkJICBsYWRkci0+c2luX3BvcnQsCisJCQkJCSAgcmFkZHItPnNpbl9wb3J0LCBjbV9pZC0+dG9zKTsKIAl9IGVsc2UgewogCQlpcHR5cGUgPSA2OwogCQlyYSA9IChfX3U4ICopJnJhZGRyNi0+c2luNl9hZGRyOwpAQCAtMzM5NiwxMCArMzI2NywxMiBAQAogCQkgICAgIF9fZnVuY19fLCBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAogCQkgICAgIG50b2hzKGxhZGRyNi0+c2luNl9wb3J0KSwKIAkJICAgICByYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLCBudG9ocyhyYWRkcjYtPnNpbjZfcG9ydCkpOwotCQllcC0+ZHN0ID0gZmluZF9yb3V0ZTYoZGV2LCBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAotCQkJCSAgICAgIHJhZGRyNi0+c2luNl9hZGRyLnM2X2FkZHIsCi0JCQkJICAgICAgbGFkZHI2LT5zaW42X3BvcnQsIHJhZGRyNi0+c2luNl9wb3J0LCAwLAotCQkJCSAgICAgIHJhZGRyNi0+c2luNl9zY29wZV9pZCk7CisJCWVwLT5kc3QgPSBjeGdiX2ZpbmRfcm91dGU2KCZkZXYtPnJkZXYubGxkaSwgZ2V0X3JlYWxfZGV2LAorCQkJCQkgICBsYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAorCQkJCQkgICByYWRkcjYtPnNpbjZfYWRkci5zNl9hZGRyLAorCQkJCQkgICBsYWRkcjYtPnNpbjZfcG9ydCwKKwkJCQkJICAgcmFkZHI2LT5zaW42X3BvcnQsIDAsCisJCQkJCSAgIHJhZGRyNi0+c2luNl9zY29wZV9pZCk7CiAJfQogCWlmICghZXAtPmRzdCkgewogCQlwcmludGsoS0VSTl9FUlIgTU9EICIlcyAtIGNhbm5vdCBmaW5kIHJvdXRlLlxuIiwgX19mdW5jX18pOwpAQCAtNDA0MSw4ICszOTE0LDkgQEAKIAkgICAgIG50b2hsKGlwaC0+ZGFkZHIpLCBudG9ocyh0Y3BoLT5kZXN0KSwgbnRvaGwoaXBoLT5zYWRkciksCiAJICAgICBudG9ocyh0Y3BoLT5zb3VyY2UpLCBpcGgtPnRvcyk7CiAKLQlkc3QgPSBmaW5kX3JvdXRlKGRldiwgaXBoLT5kYWRkciwgaXBoLT5zYWRkciwgdGNwaC0+ZGVzdCwgdGNwaC0+c291cmNlLAotCQkJIGlwaC0+dG9zKTsKKwlkc3QgPSBjeGdiX2ZpbmRfcm91dGUoJmRldi0+cmRldi5sbGRpLCBnZXRfcmVhbF9kZXYsCisJCQkgICAgICBpcGgtPmRhZGRyLCBpcGgtPnNhZGRyLCB0Y3BoLT5kZXN0LAorCQkJICAgICAgdGNwaC0+c291cmNlLCBpcGgtPnRvcyk7CiAJaWYgKCFkc3QpIHsKIAkJcHJfZXJyKCIlcyAtIGZhaWxlZCB0byBmaW5kIGRzdCBlbnRyeSFcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7CkBAIC00MzE3LDcgKzQxOTEsNyBAQAogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChpc19uZWdfYWR2KHJlcS0+c3RhdHVzKSkgeworCWlmIChjeGdiX2lzX25lZ19hZHYocmVxLT5zdGF0dXMpKSB7CiAJCVBEQkcoIiVzIE5lZ2F0aXZlIGFkdmljZSBvbiBhYm9ydC0gdGlkICV1IHN0YXR1cyAlZCAoJXMpXG4iLAogCQkgICAgIF9fZnVuY19fLCBlcC0+aHd0aWQsIHJlcS0+c3RhdHVzLAogCQkgICAgIG5lZ19hZHZfc3RyKHJlcS0+c3RhdHVzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvZGV2aWNlLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvZGV2aWNlLmMKaW5kZXggMDcxZDczMy4uOTNlM2QyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2RldmljZS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9kZXZpY2UuYwpAQCAtODcyLDkgKzg3MiwxMyBAQAogc3RhdGljIHZvaWQgYzRpd19kZWFsbG9jKHN0cnVjdCB1bGRfY3R4ICpjdHgpCiB7CiAJYzRpd19yZGV2X2Nsb3NlKCZjdHgtPmRldi0+cmRldik7CisJV0FSTl9PTl9PTkNFKCFpZHJfaXNfZW1wdHkoJmN0eC0+ZGV2LT5jcWlkcikpOwogCWlkcl9kZXN0cm95KCZjdHgtPmRldi0+Y3FpZHIpOworCVdBUk5fT05fT05DRSghaWRyX2lzX2VtcHR5KCZjdHgtPmRldi0+cXBpZHIpKTsKIAlpZHJfZGVzdHJveSgmY3R4LT5kZXYtPnFwaWRyKTsKKwlXQVJOX09OX09OQ0UoIWlkcl9pc19lbXB0eSgmY3R4LT5kZXYtPm1taWRyKSk7CiAJaWRyX2Rlc3Ryb3koJmN0eC0+ZGV2LT5tbWlkcik7CisJd2FpdF9ldmVudChjdHgtPmRldi0+d2FpdCwgaWRyX2lzX2VtcHR5KCZjdHgtPmRldi0+aHd0aWRfaWRyKSk7CiAJaWRyX2Rlc3Ryb3koJmN0eC0+ZGV2LT5od3RpZF9pZHIpOwogCWlkcl9kZXN0cm95KCZjdHgtPmRldi0+c3RpZF9pZHIpOwogCWlkcl9kZXN0cm95KCZjdHgtPmRldi0+YXRpZF9pZHIpOwpAQCAtOTkyLDYgKzk5Niw3IEBACiAJbXV0ZXhfaW5pdCgmZGV2cC0+cmRldi5zdGF0cy5sb2NrKTsKIAltdXRleF9pbml0KCZkZXZwLT5kYl9tdXRleCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldnAtPmRiX2ZjX2xpc3QpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldnAtPndhaXQpOwogCWRldnAtPmF2YWlsX2lyZCA9IGRldnAtPnJkZXYubGxkaS5tYXhfaXJkX2FkYXB0ZXI7CiAKIAlpZiAoYzRpd19kZWJ1Z2ZzX3Jvb3QpIHsKQEAgLTE0NzUsNiArMTQ4MCwxMCBAQAogCiBzdGF0aWMgc3RydWN0IGN4Z2I0X3VsZF9pbmZvIGM0aXdfdWxkX2luZm8gPSB7CiAJLm5hbWUgPSBEUlZfTkFNRSwKKwkubnJ4cSA9IE1BWF9VTERfUVNFVFMsCisJLnJ4cV9zaXplID0gNTExLAorCS5jaXEgPSB0cnVlLAorCS5scm8gPSBmYWxzZSwKIAkuYWRkID0gYzRpd191bGRfYWRkLAogCS5yeF9oYW5kbGVyID0gYzRpd191bGRfcnhfaGFuZGxlciwKIAkuc3RhdGVfY2hhbmdlID0gYzRpd191bGRfc3RhdGVfY2hhbmdlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2l3X2N4Z2I0LmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvaXdfY3hnYjQuaAppbmRleCBhYTQ3ZTBhLi5jZGNmM2VlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvaXdfY3hnYjQuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjQvaXdfY3hnYjQuaApAQCAtMjYzLDYgKzI2Myw3IEBACiAJc3RydWN0IGlkciBzdGlkX2lkcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRiX2ZjX2xpc3Q7CiAJdTMyIGF2YWlsX2lyZDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgYzRpd19kZXYgKnRvX2M0aXdfZGV2KHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2KQpAQCAtODgxLDE1ICs4ODIsNiBAQAogCXJldHVybiBjbV9pZC0+cHJvdmlkZXJfZGF0YTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY29tcHV0ZV93c2NhbGUoaW50IHdpbikKLXsKLQlpbnQgd3NjYWxlID0gMDsKLQotCXdoaWxlICh3c2NhbGUgPCAxNCAmJiAoNjU1MzU8PHdzY2FsZSkgPCB3aW4pCi0JCXdzY2FsZSsrOwotCXJldHVybiB3c2NhbGU7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG9jcXBfc3VwcG9ydGVkKGNvbnN0IHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqaW5mb3ApCiB7CiAjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKENPTkZJR19QUEM2NCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKaW5kZXggZWRiMTE3Mi4uNjkwNDM1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L3FwLmMKQEAgLTY4Myw3ICs2ODMsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIF9mcmVlX3FwKHN0cnVjdCBrcmVmICprcmVmKQorc3RhdGljIHZvaWQgX2ZyZWVfcXAoc3RydWN0IGtyZWYgKmtyZWYpCiB7CiAJc3RydWN0IGM0aXdfcXAgKnFocDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2FmZmluaXR5LmMKaW5kZXggMDU2NjM5My4uYTI2YTlhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9hZmZpbml0eS5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNpbmNsdWRlICJoZmkuaCIKICNpbmNsdWRlICJhZmZpbml0eS5oIgpAQCAtNTUsNyArNTYsNyBAQAogCiBzdHJ1Y3QgaGZpMV9hZmZpbml0eV9ub2RlX2xpc3Qgbm9kZV9hZmZpbml0eSA9IHsKIAkubGlzdCA9IExJU1RfSEVBRF9JTklUKG5vZGVfYWZmaW5pdHkubGlzdCksCi0JLmxvY2sgPSBfX1NQSU5fTE9DS19VTkxPQ0tFRCgmbm9kZV9hZmZpbml0eS5sb2NrKSwKKwkubG9jayA9IF9fTVVURVhfSU5JVElBTElaRVIobm9kZV9hZmZpbml0eS5sb2NrKQogfTsKIAogLyogTmFtZSBvZiBJUlEgdHlwZXMsIGluZGV4ZWQgYnkgZW51bSBpcnFfdHlwZSAqLwpAQCAtMTU5LDE0ICsxNjAsMTQgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpxOwogCXN0cnVjdCBoZmkxX2FmZmluaXR5X25vZGUgKmVudHJ5OwogCi0Jc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCW11dGV4X2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgcSwgJm5vZGVfYWZmaW5pdHkubGlzdCkgewogCQllbnRyeSA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgaGZpMV9hZmZpbml0eV9ub2RlLAogCQkJCSAgIGxpc3QpOwogCQlsaXN0X2RlbChwb3MpOwogCQlrZnJlZShlbnRyeSk7CiAJfQotCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCW11dGV4X3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIAlrZnJlZShoZmkxX3Blcl9ub2RlX2NudHIpOwogfQogCkBAIC0yMzMsOSArMjM0LDggQEAKIAlpZiAoY3B1bWFza19maXJzdChsb2NhbF9tYXNrKSA+PSBucl9jcHVfaWRzKQogCQlsb2NhbF9tYXNrID0gdG9wb2xvZ3lfY29yZV9jcHVtYXNrKDApOwogCi0Jc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCW11dGV4X2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJZW50cnkgPSBub2RlX2FmZmluaXR5X2xvb2t1cChkZC0+bm9kZSk7Ci0Jc3Bpbl91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAKIAkvKgogCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhpcyBOVU1BIG5vZGUncyBhZmZpbml0eSBpcyB1c2VkLApAQCAtMjQ2LDYgKzI0Niw3IEBACiAJCWlmICghZW50cnkpIHsKIAkJCWRkX2Rldl9lcnIoZGQsCiAJCQkJICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBnbG9iYWwgYWZmaW5pdHkgbm9kZVxuIik7CisJCQltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCQlpbml0X2NwdV9tYXNrX3NldCgmZW50cnktPmRlZl9pbnRyKTsKQEAgLTMwMiwxNSArMzAzLDExMyBAQAogCQkJCQkgICAgICZlbnRyeS0+Z2VuZXJhbF9pbnRyX21hc2spOwogCQl9CiAKLQkJc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCQlub2RlX2FmZmluaXR5X2FkZF90YWlsKGVudHJ5KTsKLQkJc3Bpbl91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJfQotCisJbXV0ZXhfdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCXJldHVybiAwOwogfQogCi1pbnQgaGZpMV9nZXRfaXJxX2FmZmluaXR5KHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5ICptc2l4KQorLyoKKyAqIEZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGlycSBhZmZpbml0eSBoaW50IGZvciBtc2l4IGFmdGVyIGl0IGhhcyBiZWVuIGNoYW5nZWQKKyAqIGJ5IHRoZSB1c2VyIHVzaW5nIHRoZSAvcHJvYy9pcnEgaW50ZXJmYWNlLiBUaGlzIGZ1bmN0aW9uIG9ubHkgYWNjZXB0cworICogb25lIGNwdSBpbiB0aGUgbWFzay4KKyAqLworc3RhdGljIHZvaWQgaGZpMV91cGRhdGVfc2RtYV9hZmZpbml0eShzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5ICptc2l4LCBpbnQgY3B1KQoreworCXN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlID0gbXNpeC0+YXJnOworCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkID0gc2RlLT5kZDsKKwlzdHJ1Y3QgaGZpMV9hZmZpbml0eV9ub2RlICplbnRyeTsKKwlzdHJ1Y3QgY3B1X21hc2tfc2V0ICpzZXQ7CisJaW50IGksIG9sZF9jcHU7CisKKwlpZiAoY3B1ID4gbnVtX29ubGluZV9jcHVzKCkgfHwgY3B1ID09IHNkZS0+Y3B1KQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCWVudHJ5ID0gbm9kZV9hZmZpbml0eV9sb29rdXAoZGQtPm5vZGUpOworCWlmICghZW50cnkpCisJCWdvdG8gdW5sb2NrOworCisJb2xkX2NwdSA9IHNkZS0+Y3B1OworCXNkZS0+Y3B1ID0gY3B1OworCWNwdW1hc2tfY2xlYXIoJm1zaXgtPm1hc2spOworCWNwdW1hc2tfc2V0X2NwdShjcHUsICZtc2l4LT5tYXNrKTsKKwlkZF9kZXZfZGJnKGRkLCAiSVJRIHZlY3RvcjogJXUsIHR5cGUgJXMgZW5naW5lICV1IC0+IGNwdTogJWRcbiIsCisJCSAgIG1zaXgtPm1zaXgudmVjdG9yLCBpcnFfdHlwZV9uYW1lc1ttc2l4LT50eXBlXSwKKwkJICAgc2RlLT50aGlzX2lkeCwgY3B1KTsKKwlpcnFfc2V0X2FmZmluaXR5X2hpbnQobXNpeC0+bXNpeC52ZWN0b3IsICZtc2l4LT5tYXNrKTsKKworCS8qCisJICogU2V0IHRoZSBuZXcgY3B1IGluIHRoZSBoZmkxX2FmZmluaXR5X25vZGUgYW5kIGNsZWFuCisJICogdGhlIG9sZCBjcHUgaWYgaXQgaXMgbm90IHVzZWQgYnkgYW55IG90aGVyIElSUQorCSAqLworCXNldCA9ICZlbnRyeS0+ZGVmX2ludHI7CisJY3B1bWFza19zZXRfY3B1KGNwdSwgJnNldC0+bWFzayk7CisJY3B1bWFza19zZXRfY3B1KGNwdSwgJnNldC0+dXNlZCk7CisJZm9yIChpID0gMDsgaSA8IGRkLT5udW1fbXNpeF9lbnRyaWVzOyBpKyspIHsKKwkJc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqb3RoZXJfbXNpeDsKKworCQlvdGhlcl9tc2l4ID0gJmRkLT5tc2l4X2VudHJpZXNbaV07CisJCWlmIChvdGhlcl9tc2l4LT50eXBlICE9IElSUV9TRE1BIHx8IG90aGVyX21zaXggPT0gbXNpeCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KG9sZF9jcHUsICZvdGhlcl9tc2l4LT5tYXNrKSkKKwkJCWdvdG8gdW5sb2NrOworCX0KKwljcHVtYXNrX2NsZWFyX2NwdShvbGRfY3B1LCAmc2V0LT5tYXNrKTsKKwljcHVtYXNrX2NsZWFyX2NwdShvbGRfY3B1LCAmc2V0LT51c2VkKTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGhmaTFfaXJxX25vdGlmaWVyX25vdGlmeShzdHJ1Y3QgaXJxX2FmZmluaXR5X25vdGlmeSAqbm90aWZ5LAorCQkJCSAgICAgY29uc3QgY3B1bWFza190ICptYXNrKQoreworCWludCBjcHUgPSBjcHVtYXNrX2ZpcnN0KG1hc2spOworCXN0cnVjdCBoZmkxX21zaXhfZW50cnkgKm1zaXggPSBjb250YWluZXJfb2Yobm90aWZ5LAorCQkJCQkJICAgIHN0cnVjdCBoZmkxX21zaXhfZW50cnksCisJCQkJCQkgICAgbm90aWZ5KTsKKworCS8qIE9ubHkgb25lIENQVSBjb25maWd1cmF0aW9uIHN1cHBvcnRlZCBjdXJyZW50bHkgKi8KKwloZmkxX3VwZGF0ZV9zZG1hX2FmZmluaXR5KG1zaXgsIGNwdSk7Cit9CisKK3N0YXRpYyB2b2lkIGhmaTFfaXJxX25vdGlmaWVyX3JlbGVhc2Uoc3RydWN0IGtyZWYgKnJlZikKK3sKKwkvKgorCSAqIFRoaXMgaXMgcmVxdWlyZWQgYnkgYWZmaW5pdHkgbm90aWZpZXIuIFdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8KKwkgKiBmcmVlIGhlcmUuCisJICovCit9CisKK3N0YXRpYyB2b2lkIGhmaTFfc2V0dXBfc2RtYV9ub3RpZmllcihzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5ICptc2l4KQoreworCXN0cnVjdCBpcnFfYWZmaW5pdHlfbm90aWZ5ICpub3RpZnkgPSAmbXNpeC0+bm90aWZ5OworCisJbm90aWZ5LT5pcnEgPSBtc2l4LT5tc2l4LnZlY3RvcjsKKwlub3RpZnktPm5vdGlmeSA9IGhmaTFfaXJxX25vdGlmaWVyX25vdGlmeTsKKwlub3RpZnktPnJlbGVhc2UgPSBoZmkxX2lycV9ub3RpZmllcl9yZWxlYXNlOworCisJaWYgKGlycV9zZXRfYWZmaW5pdHlfbm90aWZpZXIobm90aWZ5LT5pcnEsIG5vdGlmeSkpCisJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIHNkbWEgaXJxIGFmZmluaXR5IG5vdGlmaWVyIGZvciBpcnEgJWRcbiIsCisJCSAgICAgICBub3RpZnktPmlycSk7Cit9CisKK3N0YXRpYyB2b2lkIGhmaTFfY2xlYW51cF9zZG1hX25vdGlmaWVyKHN0cnVjdCBoZmkxX21zaXhfZW50cnkgKm1zaXgpCit7CisJc3RydWN0IGlycV9hZmZpbml0eV9ub3RpZnkgKm5vdGlmeSA9ICZtc2l4LT5ub3RpZnk7CisKKwlpZiAoaXJxX3NldF9hZmZpbml0eV9ub3RpZmllcihub3RpZnktPmlycSwgTlVMTCkpCisJCXByX2VycigiRmFpbGVkIHRvIGNsZWFudXAgc2RtYSBpcnEgYWZmaW5pdHkgbm90aWZpZXIgZm9yIGlycSAlZFxuIiwKKwkJICAgICAgIG5vdGlmeS0+aXJxKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNldHMgdGhlIGlycSBhZmZpbml0eSBmb3IgbXNpeC4KKyAqIEl0ICptdXN0KiBiZSBjYWxsZWQgd2l0aCBub2RlX2FmZmluaXR5LmxvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBnZXRfaXJxX2FmZmluaXR5KHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLAorCQkJICAgIHN0cnVjdCBoZmkxX21zaXhfZW50cnkgKm1zaXgpCiB7CiAJaW50IHJldDsKIAljcHVtYXNrX3Zhcl90IGRpZmY7CkBAIC0zMjgsOSArNDI3LDcgQEAKIAlpZiAoIXJldCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGluX2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJZW50cnkgPSBub2RlX2FmZmluaXR5X2xvb2t1cChkZC0+bm9kZSk7Ci0Jc3Bpbl91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAKIAlzd2l0Y2ggKG1zaXgtPnR5cGUpIHsKIAljYXNlIElSUV9TRE1BOgpAQCAtMzYwLDcgKzQ1Nyw2IEBACiAJICogZmluZHMgaXRzIENQVSBoZXJlLgogCSAqLwogCWlmIChjcHUgPT0gLTEgJiYgc2V0KSB7Ci0JCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIAkJaWYgKGNwdW1hc2tfZXF1YWwoJnNldC0+bWFzaywgJnNldC0+dXNlZCkpIHsKIAkJCS8qCiAJCQkgKiBXZSd2ZSB1c2VkIHVwIGFsbCB0aGUgQ1BVcywgYnVtcCB1cCB0aGUgZ2VuZXJhdGlvbgpAQCAtMzcyLDE3ICs0NjgsNiBAQAogCQljcHVtYXNrX2FuZG5vdChkaWZmLCAmc2V0LT5tYXNrLCAmc2V0LT51c2VkKTsKIAkJY3B1ID0gY3B1bWFza19maXJzdChkaWZmKTsKIAkJY3B1bWFza19zZXRfY3B1KGNwdSwgJnNldC0+dXNlZCk7Ci0JCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwotCX0KLQotCXN3aXRjaCAobXNpeC0+dHlwZSkgewotCWNhc2UgSVJRX1NETUE6Ci0JCXNkZS0+Y3B1ID0gY3B1OwotCQlicmVhazsKLQljYXNlIElSUV9HRU5FUkFMOgotCWNhc2UgSVJRX1JDVkNUWFQ6Ci0JY2FzZSBJUlFfT1RIRVI6Ci0JCWJyZWFrOwogCX0KIAogCWNwdW1hc2tfc2V0X2NwdShjcHUsICZtc2l4LT5tYXNrKTsKQEAgLTM5MSwxMCArNDc2LDI1IEBACiAJCSAgICBleHRyYSwgY3B1KTsKIAlpcnFfc2V0X2FmZmluaXR5X2hpbnQobXNpeC0+bXNpeC52ZWN0b3IsICZtc2l4LT5tYXNrKTsKIAorCWlmIChtc2l4LT50eXBlID09IElSUV9TRE1BKSB7CisJCXNkZS0+Y3B1ID0gY3B1OworCQloZmkxX3NldHVwX3NkbWFfbm90aWZpZXIobXNpeCk7CisJfQorCiAJZnJlZV9jcHVtYXNrX3ZhcihkaWZmKTsKIAlyZXR1cm4gMDsKIH0KIAoraW50IGhmaTFfZ2V0X2lycV9hZmZpbml0eShzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwlyZXQgPSBnZXRfaXJxX2FmZmluaXR5KGRkLCBtc2l4KTsKKwltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CisJcmV0dXJuIHJldDsKK30KKwogdm9pZCBoZmkxX3B1dF9pcnFfYWZmaW5pdHkoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsCiAJCQkgICBzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5ICptc2l4KQogewpAQCAtNDAyLDEzICs1MDIsMTMgQEAKIAlzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqcmNkOwogCXN0cnVjdCBoZmkxX2FmZmluaXR5X25vZGUgKmVudHJ5OwogCi0Jc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCW11dGV4X2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJZW50cnkgPSBub2RlX2FmZmluaXR5X2xvb2t1cChkZC0+bm9kZSk7Ci0Jc3Bpbl91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAKIAlzd2l0Y2ggKG1zaXgtPnR5cGUpIHsKIAljYXNlIElSUV9TRE1BOgogCQlzZXQgPSAmZW50cnktPmRlZl9pbnRyOworCQloZmkxX2NsZWFudXBfc2RtYV9ub3RpZmllcihtc2l4KTsKIAkJYnJlYWs7CiAJY2FzZSBJUlFfR0VORVJBTDoKIAkJLyogRG9uJ3QgZG8gYWNjb3VudGluZyBmb3IgZ2VuZXJhbCBjb250ZXh0cyAqLwpAQCAtNDIwLDIxICs1MjAsMjEgQEAKIAkJCXNldCA9ICZlbnRyeS0+cmN2X2ludHI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CisJCW11dGV4X3VubG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChzZXQpIHsKLQkJc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCQljcHVtYXNrX2FuZG5vdCgmc2V0LT51c2VkLCAmc2V0LT51c2VkLCAmbXNpeC0+bWFzayk7CiAJCWlmIChjcHVtYXNrX2VtcHR5KCZzZXQtPnVzZWQpICYmIHNldC0+Z2VuKSB7CiAJCQlzZXQtPmdlbi0tOwogCQkJY3B1bWFza19jb3B5KCZzZXQtPnVzZWQsICZzZXQtPm1hc2spOwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCX0KIAogCWlycV9zZXRfYWZmaW5pdHlfaGludChtc2l4LT5tc2l4LnZlY3RvciwgTlVMTCk7CiAJY3B1bWFza19jbGVhcigmbXNpeC0+bWFzayk7CisJbXV0ZXhfdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogfQogCiAvKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBub2RlX2FmZmluaXR5LmxvY2sgaGVsZCAqLwpAQCAtNTM1LDcgKzYzNSw3IEBACiAJaWYgKCFyZXQpCiAJCWdvdG8gZnJlZV9hdmFpbGFibGVfbWFzazsKIAotCXNwaW5fbG9jaygmYWZmaW5pdHktPmxvY2spOworCW11dGV4X2xvY2soJmFmZmluaXR5LT5sb2NrKTsKIAkvKgogCSAqIElmIHdlJ3ZlIHVzZWQgYWxsIGF2YWlsYWJsZSBIVyB0aHJlYWRzLCBjbGVhciB0aGUgbWFzayBhbmQgc3RhcnQKIAkgKiBvdmVybG9hZGluZy4KQEAgLTY0Myw3ICs3NDMsOCBAQAogCQljcHUgPSAtMTsKIAllbHNlCiAJCWNwdW1hc2tfc2V0X2NwdShjcHUsICZzZXQtPnVzZWQpOwotCXNwaW5fdW5sb2NrKCZhZmZpbml0eS0+bG9jayk7CisKKwltdXRleF91bmxvY2soJmFmZmluaXR5LT5sb2NrKTsKIAloZmkxX2NkYmcoUFJPQywgIlByb2Nlc3MgYXNzaWduZWQgdG8gQ1BVICVkIiwgY3B1KTsKIAogCWZyZWVfY3B1bWFza192YXIoaW50cnNfbWFzayk7CkBAIC02NjQsMTkgKzc2NSwxNyBAQAogCiAJaWYgKGNwdSA8IDApCiAJCXJldHVybjsKLQlzcGluX2xvY2soJmFmZmluaXR5LT5sb2NrKTsKKworCW11dGV4X2xvY2soJmFmZmluaXR5LT5sb2NrKTsKIAljcHVtYXNrX2NsZWFyX2NwdShjcHUsICZzZXQtPnVzZWQpOwogCWhmaTFfY2RiZyhQUk9DLCAiUmV0dXJuaW5nIENQVSAlZCBmb3IgZnV0dXJlIHByb2Nlc3MgYXNzaWdubWVudCIsIGNwdSk7CiAJaWYgKGNwdW1hc2tfZW1wdHkoJnNldC0+dXNlZCkgJiYgc2V0LT5nZW4pIHsKIAkJc2V0LT5nZW4tLTsKIAkJY3B1bWFza19jb3B5KCZzZXQtPnVzZWQsICZzZXQtPm1hc2spOwogCX0KLQlzcGluX3VubG9jaygmYWZmaW5pdHktPmxvY2spOworCW11dGV4X3VubG9jaygmYWZmaW5pdHktPmxvY2spOwogfQogCi0vKiBQcmV2ZW50cyBjb25jdXJyZW50IHJlYWRzIGFuZCB3cml0ZXMgb2YgdGhlIHNkbWFfYWZmaW5pdHkgYXR0cmliICovCi1zdGF0aWMgREVGSU5FX01VVEVYKHNkbWFfYWZmaW5pdHlfbXV0ZXgpOwotCiBpbnQgaGZpMV9zZXRfc2RtYV9hZmZpbml0eShzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgY29uc3QgY2hhciAqYnVmLAogCQkJICAgc2l6ZV90IGNvdW50KQogewpAQCAtNjg0LDE2ICs3ODMsMTkgQEAKIAljcHVtYXNrX3Zhcl90IG1hc2s7CiAJaW50IHJldCwgaTsKIAotCXNwaW5fbG9jaygmbm9kZV9hZmZpbml0eS5sb2NrKTsKKwltdXRleF9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCWVudHJ5ID0gbm9kZV9hZmZpbml0eV9sb29rdXAoZGQtPm5vZGUpOwotCXNwaW5fdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCi0JaWYgKCFlbnRyeSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFlbnRyeSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CiAKIAlyZXQgPSB6YWxsb2NfY3B1bWFza192YXIoJm1hc2ssIEdGUF9LRVJORUwpOwotCWlmICghcmV0KQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIXJldCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHVubG9jazsKKwl9CiAKIAlyZXQgPSBjcHVsaXN0X3BhcnNlKGJ1ZiwgbWFzayk7CiAJaWYgKHJldCkKQEAgLTcwNSwxMyArODA3LDExIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW11dGV4X2xvY2soJnNkbWFfYWZmaW5pdHlfbXV0ZXgpOwogCS8qIHJlc2V0IHRoZSBTRE1BIGludGVycnVwdCBhZmZpbml0eSBkZXRhaWxzICovCiAJaW5pdF9jcHVfbWFza19zZXQoJmVudHJ5LT5kZWZfaW50cik7CiAJY3B1bWFza19jb3B5KCZlbnRyeS0+ZGVmX2ludHIubWFzaywgbWFzayk7Ci0JLyoKLQkgKiBSZWFzc2lnbiB0aGUgYWZmaW5pdHkgZm9yIGVhY2ggU0RNQSBpbnRlcnJ1cHQuCi0JICovCisKKwkvKiBSZWFzc2lnbiB0aGUgYWZmaW5pdHkgZm9yIGVhY2ggU0RNQSBpbnRlcnJ1cHQuICovCiAJZm9yIChpID0gMDsgaSA8IGRkLT5udW1fbXNpeF9lbnRyaWVzOyBpKyspIHsKIAkJc3RydWN0IGhmaTFfbXNpeF9lbnRyeSAqbXNpeDsKIApAQCAtNzE5LDE0ICs4MTksMTUgQEAKIAkJaWYgKG1zaXgtPnR5cGUgIT0gSVJRX1NETUEpCiAJCQljb250aW51ZTsKIAotCQlyZXQgPSBoZmkxX2dldF9pcnFfYWZmaW5pdHkoZGQsIG1zaXgpOworCQlyZXQgPSBnZXRfaXJxX2FmZmluaXR5KGRkLCBtc2l4KTsKIAogCQlpZiAocmV0KQogCQkJYnJlYWs7CiAJfQotCW11dGV4X3VubG9jaygmc2RtYV9hZmZpbml0eV9tdXRleCk7CiBvdXQ6CiAJZnJlZV9jcHVtYXNrX3ZhcihtYXNrKTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJcmV0dXJuIHJldCA/IHJldCA6IHN0cm5sZW4oYnVmLCBQQUdFX1NJWkUpOwogfQogCkBAIC03MzQsMTUgKzgzNSwxNSBAQAogewogCXN0cnVjdCBoZmkxX2FmZmluaXR5X25vZGUgKmVudHJ5OwogCi0Jc3Bpbl9sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOworCW11dGV4X2xvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJZW50cnkgPSBub2RlX2FmZmluaXR5X2xvb2t1cChkZC0+bm9kZSk7Ci0Jc3Bpbl91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAKLQlpZiAoIWVudHJ5KQorCWlmICghZW50cnkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZub2RlX2FmZmluaXR5LmxvY2spOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLQltdXRleF9sb2NrKCZzZG1hX2FmZmluaXR5X211dGV4KTsKIAljcHVtYXBfcHJpbnRfdG9fcGFnZWJ1Zih0cnVlLCBidWYsICZlbnRyeS0+ZGVmX2ludHIubWFzayk7Ci0JbXV0ZXhfdW5sb2NrKCZzZG1hX2FmZmluaXR5X211dGV4KTsKKwltdXRleF91bmxvY2soJm5vZGVfYWZmaW5pdHkubG9jayk7CiAJcmV0dXJuIHN0cm5sZW4oYnVmLCBQQUdFX1NJWkUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2FmZmluaXR5LmgKaW5kZXggODg3OWNmNy4uYjg5ZWEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvYWZmaW5pdHkuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9hZmZpbml0eS5oCkBAIC0xMjEsOCArMTIxLDcgQEAKIAlpbnQgbnVtX2NvcmVfc2libGluZ3M7CiAJaW50IG51bV9vbmxpbmVfbm9kZXM7CiAJaW50IG51bV9vbmxpbmVfY3B1czsKLQkvKiBwcm90ZWN0IGFmZmluaXR5IG5vZGUgbGlzdCAqLwotCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsgLyogcHJvdGVjdHMgYWZmaW5pdHkgbm9kZXMgKi8KIH07CiAKIGludCBub2RlX2FmZmluaXR5X2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmMKaW5kZXggYjMyNjM4ZC4uOWJmNWYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY2hpcC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2NoaXAuYwpAQCAtOTcxLDcgKzk3MSw5IEBACiAJRkxBR19FTlRSWTAoIkZhaWxlZCBMTkkoVmVyaWZ5Q2FwXzEpIiwgRkFJTEVEX0xOSV9WRVJJRllfQ0FQMSksCiAJRkxBR19FTlRSWTAoIkZhaWxlZCBMTkkoVmVyaWZ5Q2FwXzIpIiwgRkFJTEVEX0xOSV9WRVJJRllfQ0FQMiksCiAJRkxBR19FTlRSWTAoIkZhaWxlZCBMTkkoQ29uZmlnTFQpIiwgICAgRkFJTEVEX0xOSV9DT05GSUdMVCksCi0JRkxBR19FTlRSWTAoIkhvc3QgSGFuZHNoYWtlIFRpbWVvdXQiLCAgSE9TVF9IQU5EU0hBS0VfVElNRU9VVCkKKwlGTEFHX0VOVFJZMCgiSG9zdCBIYW5kc2hha2UgVGltZW91dCIsICBIT1NUX0hBTkRTSEFLRV9USU1FT1VUKSwKKwlGTEFHX0VOVFJZMCgiRXh0ZXJuYWwgRGV2aWNlIFJlcXVlc3QgVGltZW91dCIsCisJCSAgICBFWFRFUk5BTF9ERVZJQ0VfUkVRX1RJTUVPVVQpLAogfTsKIAogLyoKQEAgLTY4MjUsNyArNjgyNyw2IEBACiAJCXNldF9saW5rX2Rvd25fcmVhc29uKHBwZCwgT1BBX0xJTktET1dOX1JFQVNPTl9TUEVFRF9QT0xJQ1ksIDAsCiAJCQkJICAgICBPUEFfTElOS0RPV05fUkVBU09OX1NQRUVEX1BPTElDWSk7CiAJCXNldF9saW5rX3N0YXRlKHBwZCwgSExTX0ROX09GRkxJTkUpOwotCQl0dW5lX3NlcmRlcyhwcGQpOwogCQlzdGFydF9saW5rKHBwZCk7CiAJfQogfQpAQCAtNjk5OCwxMiArNjk5OSwxMCBAQAogCSAqIElmIHRoZXJlIGlzIG5vIGNhYmxlIGF0dGFjaGVkLCB0dXJuIHRoZSBEQyBvZmYuIE90aGVyd2lzZSwKIAkgKiBzdGFydCB0aGUgbGluayBicmluZyB1cC4KIAkgKi8KLQlpZiAocHBkLT5wb3J0X3R5cGUgPT0gUE9SVF9UWVBFX1FTRlAgJiYgIXFzZnBfbW9kX3ByZXNlbnQocHBkKSkgeworCWlmIChwcGQtPnBvcnRfdHlwZSA9PSBQT1JUX1RZUEVfUVNGUCAmJiAhcXNmcF9tb2RfcHJlc2VudChwcGQpKQogCQlkY19zaHV0ZG93bihwcGQtPmRkKTsKLQl9IGVsc2UgewotCQl0dW5lX3NlcmRlcyhwcGQpOworCWVsc2UKIAkJc3RhcnRfbGluayhwcGQpOwotCX0KIH0KIAogdm9pZCBoYW5kbGVfbGlua19ib3VuY2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNzAxNiw3ICs3MDE1LDYgQEAKIAkgKi8KIAlpZiAocHBkLT5ob3N0X2xpbmtfc3RhdGUgJiBITFNfVVApIHsKIAkJc2V0X2xpbmtfc3RhdGUocHBkLCBITFNfRE5fT0ZGTElORSk7Ci0JCXR1bmVfc2VyZGVzKHBwZCk7CiAJCXN0YXJ0X2xpbmsocHBkKTsKIAl9IGVsc2UgewogCQlkZF9kZXZfaW5mbyhwcGQtPmRkLCAiJXM6IGxpbmsgbm90IHVwICglcyksIG5vdGhpbmcgdG8gZG9cbiIsCkBAIC03NTMxLDcgKzc1MjksNiBAQAogCQlzZXRfbGlua19kb3duX3JlYXNvbihwcGQsIE9QQV9MSU5LRE9XTl9SRUFTT05fV0lEVEhfUE9MSUNZLCAwLAogCQkJCSAgICAgT1BBX0xJTktET1dOX1JFQVNPTl9XSURUSF9QT0xJQ1kpOwogCQlzZXRfbGlua19zdGF0ZShwcGQsIEhMU19ETl9PRkZMSU5FKTsKLQkJdHVuZV9zZXJkZXMocHBkKTsKIAkJc3RhcnRfbGluayhwcGQpOwogCX0KIH0KQEAgLTkxNjEsNiArOTE1OCwxMiBAQAogICovCiBpbnQgc3RhcnRfbGluayhzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCkKIHsKKwkvKgorCSAqIFR1bmUgdGhlIFNlckRlcyB0byBhIGJhbGxwYXJrIHNldHRpbmcgZm9yIG9wdGltYWwgc2lnbmFsIGFuZCBiaXQKKwkgKiBlcnJvciByYXRlLiAgTmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgc3RhcnRpbmcgdGhlIGxpbmsuCisJICovCisJdHVuZV9zZXJkZXMocHBkKTsKKwogCWlmICghcHBkLT5saW5rX2VuYWJsZWQpIHsKIAkJZGRfZGV2X2luZm8ocHBkLT5kZCwKIAkJCSAgICAiJXM6IHN0b3BwaW5nIGxpbmsgc3RhcnQgYmVjYXVzZSBsaW5rIGlzIGRpc2FibGVkXG4iLApAQCAtOTQwMSw4ICs5NDA0LDYgQEAKIAkJICovCiAJCXNldF9xc2ZwX2ludF9uKHBwZCwgMSk7CiAKLQkJdHVuZV9zZXJkZXMocHBkKTsKLQogCQlzdGFydF9saW5rKHBwZCk7CiAJfQogCkBAIC05NDkwLDYgKzk0OTEsNzMgQEAKIAl3cml0ZV9jc3IoZGQsIERDX0xDQl9DRkdfVFhfRklGT1NfUkVTRVQsIDB4MDApOwogfQogCisvKgorICogUGVyZm9ybSBhIHRlc3QgcmVhZCBvbiB0aGUgUVNGUC4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC1FUlJOTworICogb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgdGVzdF9xc2ZwX3JlYWQoc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQpCit7CisJaW50IHJldDsKKwl1OCBzdGF0dXM7CisKKwkvKiByZXBvcnQgc3VjY2VzcyBpZiBub3QgYSBRU0ZQICovCisJaWYgKHBwZC0+cG9ydF90eXBlICE9IFBPUlRfVFlQRV9RU0ZQKQorCQlyZXR1cm4gMDsKKworCS8qIHJlYWQgYnl0ZSAyLCB0aGUgc3RhdHVzIGJ5dGUgKi8KKwlyZXQgPSBvbmVfcXNmcF9yZWFkKHBwZCwgcHBkLT5kZC0+aGZpMV9pZCwgMiwgJnN0YXR1cywgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOyAvKiBzdWNjZXNzICovCit9CisKKy8qCisgKiBWYWx1ZXMgZm9yIFFTRlAgcmV0cnkuCisgKgorICogR2l2ZSB1cCBhZnRlciAxMHMgKDIwIHggNTAwbXMpLiAgVGhlIG92ZXJhbGwgdGltZW91dCB3YXMgZW1waXJpY2FsbHkKKyAqIGFycml2ZWQgYXQgZnJvbSBleHBlcmllbmNlIG9uIGEgbGFyZ2UgY2x1c3Rlci4KKyAqLworI2RlZmluZSBNQVhfUVNGUF9SRVRSSUVTIDIwCisjZGVmaW5lIFFTRlBfUkVUUllfV0FJVCA1MDAgLyogbXNlYyAqLworCisvKgorICogVHJ5IGEgUVNGUCByZWFkLiAgSWYgaXQgZmFpbHMsIHNjaGVkdWxlIGEgcmV0cnkgZm9yIGxhdGVyLgorICogQ2FsbGVkIG9uIGZpcnN0IGxpbmsgYWN0aXZhdGlvbiBhZnRlciBkcml2ZXIgbG9hZC4KKyAqLworc3RhdGljIHZvaWQgdHJ5X3N0YXJ0X2xpbmsoc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQpCit7CisJaWYgKHRlc3RfcXNmcF9yZWFkKHBwZCkpIHsKKwkJLyogcmVhZCBmYWlsZWQgKi8KKwkJaWYgKHBwZC0+cXNmcF9yZXRyeV9jb3VudCA+PSBNQVhfUVNGUF9SRVRSSUVTKSB7CisJCQlkZF9kZXZfZXJyKHBwZC0+ZGQsICJRU0ZQIG5vdCByZXNwb25kaW5nLCBnaXZpbmcgdXBcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWRkX2Rldl9pbmZvKHBwZC0+ZGQsCisJCQkgICAgIlFTRlAgbm90IHJlc3BvbmRpbmcsIHdhaXRpbmcgYW5kIHJldHJ5aW5nICVkXG4iLAorCQkJICAgIChpbnQpcHBkLT5xc2ZwX3JldHJ5X2NvdW50KTsKKwkJcHBkLT5xc2ZwX3JldHJ5X2NvdW50Kys7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwcGQtPmhmaTFfd3EsICZwcGQtPnN0YXJ0X2xpbmtfd29yaywKKwkJCQkgICBtc2Vjc190b19qaWZmaWVzKFFTRlBfUkVUUllfV0FJVCkpOworCQlyZXR1cm47CisJfQorCXBwZC0+cXNmcF9yZXRyeV9jb3VudCA9IDA7CisKKwlzdGFydF9saW5rKHBwZCk7Cit9CisKKy8qCisgKiBXb3JrcXVldWUgZnVuY3Rpb24gdG8gc3RhcnQgdGhlIGxpbmsgYWZ0ZXIgYSBkZWxheS4KKyAqLwordm9pZCBoYW5kbGVfc3RhcnRfbGluayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGhmaTFfcHBvcnRkYXRhLAorCQkJCQkJICBzdGFydF9saW5rX3dvcmsud29yayk7CisJdHJ5X3N0YXJ0X2xpbmsocHBkKTsKK30KKwogaW50IGJyaW5ndXBfc2VyZGVzKHN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkKQogewogCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkID0gcHBkLT5kZDsKQEAgLTk1MjUsMTQgKzk1OTMsOCBAQAogCQlzZXRfcXNmcF9pbnRfbihwcGQsIDEpOwogCX0KIAotCS8qCi0JICogVHVuZSB0aGUgU2VyRGVzIHRvIGEgYmFsbHBhcmsgc2V0dGluZyBmb3IKLQkgKiBvcHRpbWFsIHNpZ25hbCBhbmQgYml0IGVycm9yIHJhdGUKLQkgKiBOZWVkcyB0byBiZSBkb25lIGJlZm9yZSBzdGFydGluZyB0aGUgbGluawotCSAqLwotCXR1bmVfc2VyZGVzKHBwZCk7Ci0KLQlyZXR1cm4gc3RhcnRfbGluayhwcGQpOworCXRyeV9zdGFydF9saW5rKHBwZCk7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgaGZpMV9xdWlldF9zZXJkZXMoc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQpCkBAIC05NTQ5LDYgKzk2MTEsMTAgQEAKIAlwcGQtPmRyaXZlcl9saW5rX3JlYWR5ID0gMDsKIAlwcGQtPmxpbmtfZW5hYmxlZCA9IDA7CiAKKwlwcGQtPnFzZnBfcmV0cnlfY291bnQgPSBNQVhfUVNGUF9SRVRSSUVTOyAvKiBwcmV2ZW50IG1vcmUgcmV0cmllcyAqLworCWZsdXNoX2RlbGF5ZWRfd29yaygmcHBkLT5zdGFydF9saW5rX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHBkLT5zdGFydF9saW5rX3dvcmspOworCiAJcHBkLT5vZmZsaW5lX2Rpc2FibGVkX3JlYXNvbiA9CiAJCQlIRkkxX09EUl9NQVNLKE9QQV9MSU5LRE9XTl9SRUFTT05fU01BX0RJU0FCTEVEKTsKIAlzZXRfbGlua19kb3duX3JlYXNvbihwcGQsIE9QQV9MSU5LRE9XTl9SRUFTT05fU01BX0RJU0FCTEVELCAwLApAQCAtOTY0OCwxMiArOTcxNCwxMiBAQAogCQloZmkxX3B1dF90aWQoZGQsIGksIFBUX0lOVkFMSUQsIDAsIDApOwogfQogCi1zdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqaGZpMV9nZXRfbXNnaGVhZGVyKAotCQkJCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBfX2xlMzIgKnJoZl9hZGRyKQorc3RydWN0IGliX2hlYWRlciAqaGZpMV9nZXRfbXNnaGVhZGVyKAorCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBfX2xlMzIgKnJoZl9hZGRyKQogewogCXUzMiBvZmZzZXQgPSByaGZfaGRycV9vZmZzZXQocmhmX3RvX2NwdShyaGZfYWRkcikpOwogCi0JcmV0dXJuIChzdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqKQorCXJldHVybiAoc3RydWN0IGliX2hlYWRlciAqKQogCQkocmhmX2FkZHIgLSBkZC0+cmhmX29mZnNldCArIG9mZnNldCk7CiB9CiAKQEAgLTExNDg5LDEwICsxMTU1NSwxMCBAQAogCSAgICAhKHJjdmN0cmwgJiBSQ1ZfQ1RYVF9DVFJMX0VOQUJMRV9TTUFTSykpIHsKIAkJLyogcmVzZXQgdGhlIHRhaWwgYW5kIGhkciBhZGRyZXNzZXMsIGFuZCBzZXF1ZW5jZSBjb3VudCAqLwogCQl3cml0ZV9rY3R4dF9jc3IoZGQsIGN0eHQsIFJDVl9IRFJfQUREUiwKLQkJCQlyY2QtPnJjdmhkcnFfcGh5cyk7CisJCQkJcmNkLT5yY3ZoZHJxX2RtYSk7CiAJCWlmIChIRkkxX0NBUF9LR0VUX01BU0socmNkLT5mbGFncywgRE1BX1JUQUlMKSkKIAkJCXdyaXRlX2tjdHh0X2NzcihkZCwgY3R4dCwgUkNWX0hEUl9UQUlMX0FERFIsCi0JCQkJCXJjZC0+cmN2aGRycXRhaWxhZGRyX3BoeXMpOworCQkJCQlyY2QtPnJjdmhkcnF0YWlsYWRkcl9kbWEpOwogCQlyY2QtPnNlcV9jbnQgPSAxOwogCiAJCS8qIHJlc2V0IHRoZSBjYWNoZWQgcmVjZWl2ZSBoZWFkZXIgcXVldWUgaGVhZCB2YWx1ZSAqLwpAQCAtMTE1NTcsOSArMTE2MjMsOSBAQAogCQkgKiB1cGRhdGUgd2l0aCBhIGR1bW15IHRhaWwgYWRkcmVzcyBhbmQgdGhlbiBkaXNhYmxlCiAJCSAqIHJlY2VpdmUgY29udGV4dC4KIAkJICovCi0JCWlmIChkZC0+cmN2aGRydGFpbF9kdW1teV9waHlzYWRkcikgeworCQlpZiAoZGQtPnJjdmhkcnRhaWxfZHVtbXlfZG1hKSB7CiAJCQl3cml0ZV9rY3R4dF9jc3IoZGQsIGN0eHQsIFJDVl9IRFJfVEFJTF9BRERSLAotCQkJCQlkZC0+cmN2aGRydGFpbF9kdW1teV9waHlzYWRkcik7CisJCQkJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSk7CiAJCQkvKiBFbmFibGluZyBSY3ZDdHh0Q3RybC5UYWlsVXBkIGlzIGludGVudGlvbmFsLiAqLwogCQkJcmN2Y3RybCB8PSBSQ1ZfQ1RYVF9DVFJMX1RBSUxfVVBEX1NNQVNLOwogCQl9CkBAIC0xMTU3MCw3ICsxMTYzNiw3IEBACiAJCXJjdmN0cmwgfD0gUkNWX0NUWFRfQ1RSTF9JTlRSX0FWQUlMX1NNQVNLOwogCWlmIChvcCAmIEhGSTFfUkNWQ1RSTF9JTlRSQVZBSUxfRElTKQogCQlyY3ZjdHJsICY9IH5SQ1ZfQ1RYVF9DVFJMX0lOVFJfQVZBSUxfU01BU0s7Ci0JaWYgKG9wICYgSEZJMV9SQ1ZDVFJMX1RBSUxVUERfRU5CICYmIHJjZC0+cmN2aGRycXRhaWxhZGRyX3BoeXMpCisJaWYgKG9wICYgSEZJMV9SQ1ZDVFJMX1RBSUxVUERfRU5CICYmIHJjZC0+cmN2aGRycXRhaWxhZGRyX2RtYSkKIAkJcmN2Y3RybCB8PSBSQ1ZfQ1RYVF9DVFJMX1RBSUxfVVBEX1NNQVNLOwogCWlmIChvcCAmIEhGSTFfUkNWQ1RSTF9UQUlMVVBEX0RJUykgewogCQkvKiBTZWUgY29tbWVudCBvbiBSY3ZDdHh0Q3RybC5UYWlsVXBkIGFib3ZlICovCkBAIC0xMTY0Miw3ICsxMTcwOCw3IEBACiAJCSAqIHNvIGl0IGRvZXNuJ3QgY29udGFpbiBhbiBhZGRyZXNzIHRoYXQgaXMgaW52YWxpZC4KIAkJICovCiAJCXdyaXRlX2tjdHh0X2NzcihkZCwgY3R4dCwgUkNWX0hEUl9UQUlMX0FERFIsCi0JCQkJZGQtPnJjdmhkcnRhaWxfZHVtbXlfcGh5c2FkZHIpOworCQkJCWRkLT5yY3ZoZHJ0YWlsX2R1bW15X2RtYSk7CiB9CiAKIHUzMiBoZmkxX3JlYWRfY250cnMoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIGNoYXIgKipuYW1lcCwgdTY0ICoqY250cnApCkBAIC0xMjg2NSw3ICsxMjkzMSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc2V0X3VwX2NvbnRleHRfdmFyaWFibGVzKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQogewotCWludCBudW1fa2VybmVsX2NvbnRleHRzOworCXVuc2lnbmVkIGxvbmcgbnVtX2tlcm5lbF9jb250ZXh0czsKIAlpbnQgdG90YWxfY29udGV4dHM7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBuZ3JvdXBzOwpAQCAtMTI4OTQsOSArMTI5NjAsOSBAQAogCSAqLwogCWlmIChudW1fa2VybmVsX2NvbnRleHRzID4gKGRkLT5jaGlwX3NlbmRfY29udGV4dHMgLSBudW1fdmxzIC0gMSkpIHsKIAkJZGRfZGV2X2VycihkZCwKLQkJCSAgICJSZWR1Y2luZyAjIGtlcm5lbCByY3YgY29udGV4dHMgdG86ICVkLCBmcm9tICVkXG4iLAorCQkJICAgIlJlZHVjaW5nICMga2VybmVsIHJjdiBjb250ZXh0cyB0bzogJWQsIGZyb20gJWx1XG4iLAogCQkJICAgKGludCkoZGQtPmNoaXBfc2VuZF9jb250ZXh0cyAtIG51bV92bHMgLSAxKSwKLQkJCSAgIChpbnQpbnVtX2tlcm5lbF9jb250ZXh0cyk7CisJCQkgICBudW1fa2VybmVsX2NvbnRleHRzKTsKIAkJbnVtX2tlcm5lbF9jb250ZXh0cyA9IGRkLT5jaGlwX3NlbmRfY29udGV4dHMgLSBudW1fdmxzIC0gMTsKIAl9CiAJLyoKQEAgLTEzMzE5LDkgKzEzMzg1LDkgQEAKIAkJLyoKIAkJICogR2l2ZSB1cCBhZnRlciAxbXMgLSBtYXhpbXVtIHdhaXQgdGltZS4KIAkJICoKLQkJICogUkJ1ZiBzaXplIGlzIDE0OEtpQi4gIFNsb3dlc3QgcG9zc2libGUgaXMgUENJZSBHZW4xIHgxIGF0CisJCSAqIFJCdWYgc2l6ZSBpcyAxMzZLaUIuICBTbG93ZXN0IHBvc3NpYmxlIGlzIFBDSWUgR2VuMSB4MSBhdAogCQkgKiAyNTBNQi9zIGJhbmR3aWR0aC4gIExvd2VyIHJhdGUgdG8gNjYlIGZvciBvdmVyaGVhZCB0byBnZXQ6Ci0JCSAqCTE0OCBLQiAvICg2NiUgKiAyNTBNQi9zKSA9IDkyMHVzCisJCSAqCTEzNiBLQiAvICg2NiUgKiAyNTBNQi9zKSA9IDg0NHVzCiAJCSAqLwogCQlpZiAoY291bnQrKyA+IDUwMCkgewogCQkJZGRfZGV2X2VycihkZCwKQEAgLTE0NTAwLDYgKzE0NTY2LDExIEBACiAJaWYgKHJldCkKIAkJZ290byBiYWlsX2NsZWFudXA7CiAKKwkvKiBjYWxsIGJlZm9yZSBnZXRfcGxhdGZvcm1fY29uZmlnKCksIGFmdGVyIGluaXRfY2hpcF9yZXNvdXJjZXMoKSAqLworCXJldCA9IGVwcm9tX2luaXQoZGQpOworCWlmIChyZXQpCisJCWdvdG8gYmFpbF9mcmVlX3JjdmVycjsKKwogCS8qIE5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgaGZpMV9maXJtd2FyZV9pbml0ICovCiAJZ2V0X3BsYXRmb3JtX2NvbmZpZyhkZCk7CiAKQEAgLTE0NjIwLDEwICsxNDY5MSw2IEBACiAJaWYgKHJldCkKIAkJZ290byBiYWlsX2ZyZWVfY250cnM7CiAKLQlyZXQgPSBlcHJvbV9pbml0KGRkKTsKLQlpZiAocmV0KQotCQlnb3RvIGJhaWxfZnJlZV9yY3ZlcnI7Ci0KIAlnb3RvIGJhaWw7CiAKIGJhaWxfZnJlZV9yY3ZlcnI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9jaGlwLmgKaW5kZXggZWQxMTEwNy4uOTIzNDUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY2hpcC5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2NoaXAuaApAQCAtODIsNyArODIsNyBAQAogICovCiAjZGVmaW5lIENNX1ZBVSAzCiAvKiBIRkkgbGluayBjcmVkaXQgY291bnQsIEFLQSByZWNlaXZlIGJ1ZmZlciBkZXB0aCAoUkJVRl9ERVBUSCkgKi8KLSNkZWZpbmUgQ01fR0xPQkFMX0NSRURJVFMgMHg5NDAKKyNkZWZpbmUgQ01fR0xPQkFMX0NSRURJVFMgMHg4ODAKIC8qIE51bWJlciBvZiBQS2V5IGVudHJpZXMgaW4gdGhlIEhXICovCiAjZGVmaW5lIE1BWF9QS0VZX1ZBTFVFUyAxNgogCkBAIC0yNTQsMTIgKzI1NCwxNCBAQAogI2RlZmluZSBGQUlMRURfTE5JX1ZFUklGWV9DQVAyCQlCSVQoMTApCiAjZGVmaW5lIEZBSUxFRF9MTklfQ09ORklHTFQJCUJJVCgxMSkKICNkZWZpbmUgSE9TVF9IQU5EU0hBS0VfVElNRU9VVAkJQklUKDEyKQorI2RlZmluZSBFWFRFUk5BTF9ERVZJQ0VfUkVRX1RJTUVPVVQJQklUKDEzKQogCiAjZGVmaW5lIEZBSUxFRF9MTkkgKEZBSUxFRF9MTklfUE9MTElORyB8IEZBSUxFRF9MTklfREVCT1VOQ0UgXAogCQkJfCBGQUlMRURfTE5JX0VTVEJDT01NIHwgRkFJTEVEX0xOSV9PUFRFUSBcCiAJCQl8IEZBSUxFRF9MTklfVkVSSUZZX0NBUDEgXAogCQkJfCBGQUlMRURfTE5JX1ZFUklGWV9DQVAyIFwKLQkJCXwgRkFJTEVEX0xOSV9DT05GSUdMVCB8IEhPU1RfSEFORFNIQUtFX1RJTUVPVVQpCisJCQl8IEZBSUxFRF9MTklfQ09ORklHTFQgfCBIT1NUX0hBTkRTSEFLRV9USU1FT1VUIFwKKwkJCXwgRVhURVJOQUxfREVWSUNFX1JFUV9USU1FT1VUKQogCiAvKiBEQ19EQzgwNTFfREJHX0VSUl9JTkZPX1NFVF9CWV84MDUxLkhPU1RfTVNHIC0gaG9zdCBtZXNzYWdlIGZsYWdzICovCiAjZGVmaW5lIEhPU1RfUkVRX0RPTkUJCUJJVCgwKQpAQCAtNzA2LDYgKzcwOCw3IEBACiB2b2lkIGhhbmRsZV9saW5rX2Rvd24oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgaGFuZGxlX2xpbmtfZG93bmdyYWRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIGhhbmRsZV9saW5rX2JvdW5jZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBoYW5kbGVfc3RhcnRfbGluayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCBoYW5kbGVfc21hX21lc3NhZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgcmVzZXRfcXNmcChzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCk7CiB2b2lkIHFzZnBfZXZlbnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKQEAgLTEzMzUsNyArMTMzOCw3IEBACiB1NjQgZ2V0X2FsbF9jcHVfdG90YWwodTY0IF9fcGVyY3B1ICpjbnRyKTsKIHZvaWQgaGZpMV9zdGFydF9jbGVhbnVwKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKTsKIHZvaWQgaGZpMV9jbGVhcl90aWRzKHN0cnVjdCBoZmkxX2N0eHRkYXRhICpyY2QpOwotc3RydWN0IGhmaTFfbWVzc2FnZV9oZWFkZXIgKmhmaTFfZ2V0X21zZ2hlYWRlcigKK3N0cnVjdCBpYl9oZWFkZXIgKmhmaTFfZ2V0X21zZ2hlYWRlcigKIAkJCQlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgX19sZTMyICpyaGZfYWRkcik7CiBpbnQgaGZpMV9pbml0X2N0eHQoc3RydWN0IHNlbmRfY29udGV4dCAqc2MpOwogdm9pZCBoZmkxX3B1dF90aWQoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHUzMiBpbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2NvbW1vbi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY29tbW9uLmgKaW5kZXggZmNjOWMyMS4uZGE3YmUyMWJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY29tbW9uLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvY29tbW9uLmgKQEAgLTMyMCwxNCArMzIwLDYgQEAKIC8qIFJIRiByZWNlaXZlIHR5cGUgZXJyb3IgLSBieXBhc3MgcGFja2V0IGVycm9ycyAqLwogI2RlZmluZSBSSEZfUlRFX0JZUEFTU19OT19FUlIJCTB4MAogCi0vKgotICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGZpcnN0IGZpZWxkIGNvbW1vbiB0byBhbGwgcHJvdG9jb2xzCi0gKiB0aGF0IGVtcGxveSB0aGlzIGNoaXAuCi0gKi8KLXN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyIHsKLQlfX2JlMTYgbHJoWzRdOwotfTsKLQogLyogSUIgLSBMUkggaGVhZGVyIGNvbnN0YW50cyAqLwogI2RlZmluZSBIRkkxX0xSSF9HUkggMHgwMDAzICAgICAgLyogMS4gd29yZCBvZiBJQiBMUkggLSBuZXh0IGhlYWRlcjogR1JIICovCiAjZGVmaW5lIEhGSTFfTFJIX0JUSCAweDAwMDIgICAgICAvKiAxLiB3b3JkIG9mIElCIExSSCAtIG5leHQgaGVhZGVyOiBCVEggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2RlYnVnZnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2RlYnVnZnMuYwppbmRleCBhNDljYzg4Li42MzJiYTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZGVidWdmcy5jCkBAIC01OSw2ICs1OSw0MCBAQAogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqaGZpMV9kYmdfcm9vdDsKIAorLyogd3JhcHBlcnMgdG8gZW5mb3JjZSBzcmN1IGluIHNlcSBmaWxlICovCitzdGF0aWMgc3NpemVfdCBoZmkxX3NlcV9yZWFkKAorCXN0cnVjdCBmaWxlICpmaWxlLAorCWNoYXIgX191c2VyICpidWYsCisJc2l6ZV90IHNpemUsCisJbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkZW50cnkgKmQgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCWludCBzcmN1X2lkeDsKKwlzc2l6ZV90IHI7CisKKwlyID0gZGVidWdmc191c2VfZmlsZV9zdGFydChkLCAmc3JjdV9pZHgpOworCWlmIChsaWtlbHkoIXIpKQorCQlyID0gc2VxX3JlYWQoZmlsZSwgYnVmLCBzaXplLCBwcG9zKTsKKwlkZWJ1Z2ZzX3VzZV9maWxlX2ZpbmlzaChzcmN1X2lkeCk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBsb2ZmX3QgaGZpMV9zZXFfbHNlZWsoCisJc3RydWN0IGZpbGUgKmZpbGUsCisJbG9mZl90IG9mZnNldCwKKwlpbnQgd2hlbmNlKQoreworCXN0cnVjdCBkZW50cnkgKmQgPSBmaWxlLT5mX3BhdGguZGVudHJ5OworCWludCBzcmN1X2lkeDsKKwlsb2ZmX3QgcjsKKworCXIgPSBkZWJ1Z2ZzX3VzZV9maWxlX3N0YXJ0KGQsICZzcmN1X2lkeCk7CisJaWYgKGxpa2VseSghcikpCisJCXIgPSBzZXFfbHNlZWsoZmlsZSwgb2Zmc2V0LCB3aGVuY2UpOworCWRlYnVnZnNfdXNlX2ZpbGVfZmluaXNoKHNyY3VfaWR4KTsKKwlyZXR1cm4gcjsKK30KKwogI2RlZmluZSBwcml2YXRlMmRkKGZpbGUpIChmaWxlX2lub2RlKGZpbGUpLT5pX3ByaXZhdGUpCiAjZGVmaW5lIHByaXZhdGUycHBkKGZpbGUpIChmaWxlX2lub2RlKGZpbGUpLT5pX3ByaXZhdGUpCiAKQEAgLTg3LDggKzEyMSw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBfIyNuYW1lIyNfZmlsZV9vcHMgPSB7IFwKIAkub3duZXIgICA9IFRISVNfTU9EVUxFLCBcCiAJLm9wZW4gICAgPSBfIyNuYW1lIyNfb3BlbiwgXAotCS5yZWFkICAgID0gc2VxX3JlYWQsIFwKLQkubGxzZWVrICA9IHNlcV9sc2VlaywgXAorCS5yZWFkICAgID0gaGZpMV9zZXFfcmVhZCwgXAorCS5sbHNlZWsgID0gaGZpMV9zZXFfbHNlZWssIFwKIAkucmVsZWFzZSA9IHNlcV9yZWxlYXNlIFwKIH0KIApAQCAtMTA1LDExICsxMzksOSBAQAogCURFQlVHRlNfRklMRV9DUkVBVEUoI25hbWUsIHBhcmVudCwgZGF0YSwgJl8jI25hbWUjI19maWxlX29wcywgU19JUlVHTykKIAogc3RhdGljIHZvaWQgKl9vcGNvZGVfc3RhdHNfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCi1fX2FjcXVpcmVzKFJDVSkKIHsKIAlzdHJ1Y3QgaGZpMV9vcGNvZGVfc3RhdHNfcGVyY3R4ICpvcHN0YXRzOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCWlmICgqcG9zID49IEFSUkFZX1NJWkUob3BzdGF0cy0+c3RhdHMpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gcG9zOwpAQCAtMTI2LDkgKzE1OCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIF9vcGNvZGVfc3RhdHNfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQotX19yZWxlYXNlcyhSQ1UpCiB7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyBpbnQgX29wY29kZV9zdGF0c19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCkBAIC0yODUsMTIgKzMxNSwxMCBAQAogREVCVUdGU19GSUxFX09QUyhxcF9zdGF0cyk7CiAKIHN0YXRpYyB2b2lkICpfc2Rlc19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKLV9fYWNxdWlyZXMoUkNVKQogewogCXN0cnVjdCBoZmkxX2liZGV2ICppYmQ7CiAJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQ7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJaWJkID0gKHN0cnVjdCBoZmkxX2liZGV2ICopcy0+cHJpdmF0ZTsKIAlkZCA9IGRkX2Zyb21fZGV2KGliZCk7CiAJaWYgKCFkZC0+cGVyX3NkbWEgfHwgKnBvcyA+PSBkZC0+bnVtX3NkbWEpCkBAIC0zMTAsOSArMzM4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgX3NkZXNfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQotX19yZWxlYXNlcyhSQ1UpCiB7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyBpbnQgX3NkZXNfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQpAQCAtMzM5LDExICszNjUsOSBAQAogCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkOwogCXNzaXplX3QgcnZhbDsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlkZCA9IHByaXZhdGUyZGQoZmlsZSk7CiAJYXZhaWwgPSBoZmkxX3JlYWRfY250cnMoZGQsIE5VTEwsICZjb3VudGVycyk7CiAJcnZhbCA9ICBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCBjb3VudGVycywgYXZhaWwpOwotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiBydmFsOwogfQogCkBAIC0zNTYsMTEgKzM4MCw5IEBACiAJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQ7CiAJc3NpemVfdCBydmFsOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCWRkID0gcHJpdmF0ZTJkZChmaWxlKTsKIAlhdmFpbCA9IGhmaTFfcmVhZF9jbnRycyhkZCwgJm5hbWVzLCBOVUxMKTsKIAlydmFsID0gIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIG5hbWVzLCBhdmFpbCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJ2YWw7CiB9CiAKQEAgLTM4MywxMSArNDA1LDkgQEAKIAlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZDsKIAlzc2l6ZV90IHJ2YWw7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJZGQgPSBwcml2YXRlMmRkKGZpbGUpOwogCWF2YWlsID0gaGZpMV9yZWFkX3BvcnRjbnRycyhkZC0+cHBvcnQsICZuYW1lcywgTlVMTCk7CiAJcnZhbCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIG5hbWVzLCBhdmFpbCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJ2YWw7CiB9CiAKQEAgLTQwMCwxMSArNDIwLDkgQEAKIAlzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZDsKIAlzc2l6ZV90IHJ2YWw7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJcHBkID0gcHJpdmF0ZTJwcGQoZmlsZSk7CiAJYXZhaWwgPSBoZmkxX3JlYWRfcG9ydGNudHJzKHBwZCwgTlVMTCwgJmNvdW50ZXJzKTsKIAlydmFsID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgY291bnRlcnMsIGF2YWlsKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcnZhbDsKIH0KIApAQCAtNDM0LDE2ICs0NTIsMTMgQEAKIAlpbnQgdXNlZDsKIAlpbnQgaTsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlwcGQgPSBwcml2YXRlMnBwZChmaWxlKTsKIAlkZCA9IHBwZC0+ZGQ7CiAJc2l6ZSA9IFBBR0VfU0laRTsKIAl1c2VkID0gMDsKIAl0bXAgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghdG1wKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOworCWlmICghdG1wKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlzY3JhdGNoMCA9IHJlYWRfY3NyKGRkLCBBU0lDX0NGR19TQ1JBVENIKTsKIAl1c2VkICs9IHNjbnByaW50Zih0bXAgKyB1c2VkLCBzaXplIC0gdXNlZCwKQEAgLTQ3MCw3ICs0ODUsNiBAQAogCXVzZWQgKz0gc2NucHJpbnRmKHRtcCArIHVzZWQsIHNpemUgLSB1c2VkLCAiV3JpdGUgYml0cyB0byBjbGVhclxuIik7CiAKIAlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCB0bXAsIHVzZWQpOwotCXJjdV9yZWFkX3VubG9jaygpOwogCWtmcmVlKHRtcCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTQ4NiwxNSArNTAwLDEyIEBACiAJdTY0IHNjcmF0Y2gwOwogCXU2NCBjbGVhcjsKIAotCXJjdV9yZWFkX2xvY2soKTsKIAlwcGQgPSBwcml2YXRlMnBwZChmaWxlKTsKIAlkZCA9IHBwZC0+ZGQ7CiAKIAlidWZmID0ga21hbGxvYyhjb3VudCArIDEsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGRvX3JldHVybjsKLQl9CisJaWYgKCFidWZmKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXJldCA9IGNvcHlfZnJvbV91c2VyKGJ1ZmYsIGJ1ZiwgY291bnQpOwogCWlmIChyZXQgPiAwKSB7CkBAIC01MjcsOCArNTM4LDYgQEAKIAogIGRvX2ZyZWU6CiAJa2ZyZWUoYnVmZik7Ci0gZG9fcmV0dXJuOgotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU0MiwxOCArNTUxLDE0IEBACiAJY2hhciAqdG1wOwogCWludCByZXQ7CiAKLQlyY3VfcmVhZF9sb2NrKCk7CiAJcHBkID0gcHJpdmF0ZTJwcGQoZmlsZSk7CiAJdG1wID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwotCWlmICghdG1wKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOworCWlmICghdG1wKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlyZXQgPSBxc2ZwX2R1bXAocHBkLCB0bXAsIFBBR0VfU0laRSk7CiAJaWYgKHJldCA+IDApCiAJCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsIHBwb3MsIHRtcCwgcmV0KTsKLQlyY3VfcmVhZF91bmxvY2soKTsKIAlrZnJlZSh0bXApOwogCXJldHVybiByZXQ7CiB9CkBAIC01NjksNyArNTc0LDYgQEAKIAlpbnQgb2Zmc2V0OwogCWludCB0b3RhbF93cml0dGVuOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCXBwZCA9IHByaXZhdGUycHBkKGZpbGUpOwogCiAJLyogYnl0ZSBvZmZzZXQgZm9ybWF0OiBbb2Zmc2V0U2l6ZV1baTJjQWRkcl1bb2Zmc2V0SGlnaF1bb2Zmc2V0TG93XSAqLwpAQCAtNTc3LDE2ICs1ODEsMTIgQEAKIAlvZmZzZXQgPSAqcHBvcyAmIDB4ZmZmZjsKIAogCS8qIGV4cGxpY2l0bHkgcmVqZWN0IGludmFsaWQgYWRkcmVzcyAwIHRvIGNhdGNoIGNwIGFuZCBjYXQgKi8KLQlpZiAoaTJjX2FkZHIgPT0gMCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIF9yZXR1cm47Ci0JfQorCWlmIChpMmNfYWRkciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWJ1ZmYgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBfcmV0dXJuOwotCX0KKwlpZiAoIWJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0ID0gY29weV9mcm9tX3VzZXIoYnVmZiwgYnVmLCBjb3VudCk7CiAJaWYgKHJldCA+IDApIHsKQEAgLTYwNiw4ICs2MDYsNiBAQAogCiAgX2ZyZWU6CiAJa2ZyZWUoYnVmZik7Ci0gX3JldHVybjoKLQlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02MzYsNyArNjM0LDYgQEAKIAlpbnQgb2Zmc2V0OwogCWludCB0b3RhbF9yZWFkOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCXBwZCA9IHByaXZhdGUycHBkKGZpbGUpOwogCiAJLyogYnl0ZSBvZmZzZXQgZm9ybWF0OiBbb2Zmc2V0U2l6ZV1baTJjQWRkcl1bb2Zmc2V0SGlnaF1bb2Zmc2V0TG93XSAqLwpAQCAtNjQ0LDE2ICs2NDEsMTIgQEAKIAlvZmZzZXQgPSAqcHBvcyAmIDB4ZmZmZjsKIAogCS8qIGV4cGxpY2l0bHkgcmVqZWN0IGludmFsaWQgYWRkcmVzcyAwIHRvIGNhdGNoIGNwIGFuZCBjYXQgKi8KLQlpZiAoaTJjX2FkZHIgPT0gMCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIF9yZXR1cm47Ci0JfQorCWlmIChpMmNfYWRkciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWJ1ZmYgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBfcmV0dXJuOwotCX0KKwlpZiAoIWJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOwogCiAJdG90YWxfcmVhZCA9IGkyY19yZWFkKHBwZCwgdGFyZ2V0LCBpMmNfYWRkciwgb2Zmc2V0LCBidWZmLCBjb3VudCk7CiAJaWYgKHRvdGFsX3JlYWQgPCAwKSB7CkBAIC02NzMsOCArNjY2LDYgQEAKIAogIF9mcmVlOgogCWtmcmVlKGJ1ZmYpOwotIF9yZXR1cm46Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzAxLDI2ICs2OTIsMjAgQEAKIAlpbnQgcmV0OwogCWludCB0b3RhbF93cml0dGVuOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCWlmICgqcHBvcyArIGNvdW50ID4gUVNGUF9QQUdFU0laRSAqIDQpIHsgLyogYmFzZSBwYWdlICsgcGFnZTAwLXBhZ2UwMyAqLwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIF9yZXR1cm47Ci0JfQorCWlmICgqcHBvcyArIGNvdW50ID4gUVNGUF9QQUdFU0laRSAqIDQpIC8qIGJhc2UgcGFnZSArIHBhZ2UwMC1wYWdlMDMgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwcGQgPSBwcml2YXRlMnBwZChmaWxlKTsKIAogCWJ1ZmYgPSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBfcmV0dXJuOwotCX0KKwlpZiAoIWJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0ID0gY29weV9mcm9tX3VzZXIoYnVmZiwgYnVmLCBjb3VudCk7CiAJaWYgKHJldCA+IDApIHsKIAkJcmV0ID0gLUVGQVVMVDsKIAkJZ290byBfZnJlZTsKIAl9Ci0KIAl0b3RhbF93cml0dGVuID0gcXNmcF93cml0ZShwcGQsIHRhcmdldCwgKnBwb3MsIGJ1ZmYsIGNvdW50KTsKIAlpZiAodG90YWxfd3JpdHRlbiA8IDApIHsKIAkJcmV0ID0gdG90YWxfd3JpdHRlbjsKQEAgLTczMyw4ICs3MTgsNiBAQAogCiAgX2ZyZWU6CiAJa2ZyZWUoYnVmZik7Ci0gX3JldHVybjoKLQlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03NjEsNyArNzQ0LDYgQEAKIAlpbnQgcmV0OwogCWludCB0b3RhbF9yZWFkOwogCi0JcmN1X3JlYWRfbG9jaygpOwogCWlmICgqcHBvcyArIGNvdW50ID4gUVNGUF9QQUdFU0laRSAqIDQpIHsgLyogYmFzZSBwYWdlICsgcGFnZTAwLXBhZ2UwMyAqLwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIF9yZXR1cm47CkBAIC03OTQsNyArNzc2LDYgQEAKICBfZnJlZToKIAlrZnJlZShidWZmKTsKICBfcmV0dXJuOgotCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk1Miw2ICs5MzMsNDMgQEAKIAlERUJVR0ZTX09QUygiYXNpY19mbGFncyIsIGFzaWNfZmxhZ3NfcmVhZCwgYXNpY19mbGFnc193cml0ZSksCiB9OwogCitzdGF0aWMgdm9pZCAqX3NkbWFfY3B1X2xpc3Rfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCit7CisJaWYgKCpwb3MgPj0gbnVtX29ubGluZV9jcHVzKCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHBvczsKK30KKworc3RhdGljIHZvaWQgKl9zZG1hX2NwdV9saXN0X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCWlmICgqcG9zID49IG51bV9vbmxpbmVfY3B1cygpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyB2b2lkIF9zZG1hX2NwdV9saXN0X3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwkvKiBub3RoaW5nIGFsbG9jYXRlZCAqLworfQorCitzdGF0aWMgaW50IF9zZG1hX2NwdV9saXN0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaGZpMV9pYmRldiAqaWJkID0gKHN0cnVjdCBoZmkxX2liZGV2ICopcy0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCA9IGRkX2Zyb21fZGV2KGliZCk7CisJbG9mZl90ICpzcG9zID0gdjsKKwlsb2ZmX3QgaSA9ICpzcG9zOworCisJc2RtYV9zZXFmaWxlX2R1bXBfY3B1X2xpc3QocywgZGQsICh1bnNpZ25lZCBsb25nKWkpOworCXJldHVybiAwOworfQorCitERUJVR0ZTX1NFUV9GSUxFX09QUyhzZG1hX2NwdV9saXN0KTsKK0RFQlVHRlNfU0VRX0ZJTEVfT1BFTihzZG1hX2NwdV9saXN0KQorREVCVUdGU19GSUxFX09QUyhzZG1hX2NwdV9saXN0KTsKKwogdm9pZCBoZmkxX2RiZ19pYmRldl9pbml0KHN0cnVjdCBoZmkxX2liZGV2ICppYmQpCiB7CiAJY2hhciBuYW1lW3NpemVvZigicG9ydDBjb3VudGVycyIpICsgMV07CkBAIC05ODAsNiArOTk4LDcgQEAKIAlERUJVR0ZTX1NFUV9GSUxFX0NSRUFURShjdHhfc3RhdHMsIGliZC0+aGZpMV9pYmRldl9kYmcsIGliZCk7CiAJREVCVUdGU19TRVFfRklMRV9DUkVBVEUocXBfc3RhdHMsIGliZC0+aGZpMV9pYmRldl9kYmcsIGliZCk7CiAJREVCVUdGU19TRVFfRklMRV9DUkVBVEUoc2RlcywgaWJkLT5oZmkxX2liZGV2X2RiZywgaWJkKTsKKwlERUJVR0ZTX1NFUV9GSUxFX0NSRUFURShzZG1hX2NwdV9saXN0LCBpYmQtPmhmaTFfaWJkZXZfZGJnLCBpYmQpOwogCS8qIGRldiBjb3VudGVyIGZpbGVzICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY250cl9vcHMpOyBpKyspCiAJCURFQlVHRlNfRklMRV9DUkVBVEUoY250cl9vcHNbaV0ubmFtZSwKQEAgLTEwMTAsNyArMTAyOSw2IEBACiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGliZC0+aGZpMV9pYmRldl9kYmcpOwogb3V0OgogCWliZC0+aGZpMV9pYmRldl9kYmcgPSBOVUxMOwotCXN5bmNocm9uaXplX3JjdSgpOwogfQogCiAvKgpAQCAtMTAzNSw5ICsxMDUzLDcgQEAKIH07CiAKIHN0YXRpYyB2b2lkICpfZHJpdmVyX3N0YXRzX25hbWVzX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQotX19hY3F1aXJlcyhSQ1UpCiB7Ci0JcmN1X3JlYWRfbG9jaygpOwogCWlmICgqcG9zID49IEFSUkFZX1NJWkUoaGZpMV9zdGF0bmFtZXMpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gcG9zOwpAQCAtMTA1NSw5ICsxMDcxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgX2RyaXZlcl9zdGF0c19uYW1lc19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi1fX3JlbGVhc2VzKFJDVSkKIHsKLQlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogc3RhdGljIGludCBfZHJpdmVyX3N0YXRzX25hbWVzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKQEAgLTEwNzMsOSArMTA4Nyw3IEBACiBERUJVR0ZTX0ZJTEVfT1BTKGRyaXZlcl9zdGF0c19uYW1lcyk7CiAKIHN0YXRpYyB2b2lkICpfZHJpdmVyX3N0YXRzX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGxvZmZfdCAqcG9zKQotX19hY3F1aXJlcyhSQ1UpCiB7Ci0JcmN1X3JlYWRfbG9jaygpOwogCWlmICgqcG9zID49IEFSUkFZX1NJWkUoaGZpMV9zdGF0bmFtZXMpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gcG9zOwpAQCAtMTA5MCw5ICsxMTAyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgX2RyaXZlcl9zdGF0c19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi1fX3JlbGVhc2VzKFJDVSkKIHsKLQlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogc3RhdGljIHU2NCBoZmkxX3Nwc19pbnRzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9kcml2ZXIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2RyaXZlci5jCmluZGV4IDMwM2YxMDUuLjY1NjNlNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2RyaXZlci5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIHN0YXRpYyB2b2lkIHJjdl9oZHJlcnIoc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZCwgc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQsCiAJCSAgICAgICBzdHJ1Y3QgaGZpMV9wYWNrZXQgKnBhY2tldCkKIHsKLQlzdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqcmhkciA9IHBhY2tldC0+aGRyOworCXN0cnVjdCBpYl9oZWFkZXIgKnJoZHIgPSBwYWNrZXQtPmhkcjsKIAl1MzIgcnRlID0gcmhmX3Jjdl90eXBlX2VycihwYWNrZXQtPnJoZik7CiAJaW50IGxuaCA9IGJlMTZfdG9fY3B1KHJoZHItPmxyaFswXSkgJiAzOwogCXN0cnVjdCBoZmkxX2licG9ydCAqaWJwID0gJnBwZC0+aWJwb3J0X2RhdGE7CkBAIC0yODgsMTAgKzI4OCw5IEBACiAKIAlpZiAocGFja2V0LT5yaGYgJiBSSEZfVElEX0VSUikgewogCQkvKiBGb3IgVElERVJSIGFuZCBSQyBRUHMgcHJlZW1wdGl2ZWx5IHNjaGVkdWxlIGEgTkFLICovCi0JCXN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyID0gKHN0cnVjdCBoZmkxX2liX2hlYWRlciAqKXJoZHI7Ci0JCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHIgPSBOVUxMOworCQlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IE5VTEw7CiAJCXUzMiB0bGVuID0gcmhmX3BrdF9sZW4ocGFja2V0LT5yaGYpOyAvKiBpbiBieXRlcyAqLwotCQl1MTYgbGlkICA9IGJlMTZfdG9fY3B1KGhkci0+bHJoWzFdKTsKKwkJdTE2IGxpZCAgPSBiZTE2X3RvX2NwdShyaGRyLT5scmhbMV0pOwogCQl1MzIgcXBfbnVtOwogCQl1MzIgcmN2X2ZsYWdzID0gMDsKIApAQCAtMzAxLDE0ICszMDAsMTQgQEAKIAogCQkvKiBDaGVjayBmb3IgR1JIICovCiAJCWlmIChsbmggPT0gSEZJMV9MUkhfQlRIKSB7Ci0JCQlvaGRyID0gJmhkci0+dS5vdGg7CisJCQlvaGRyID0gJnJoZHItPnUub3RoOwogCQl9IGVsc2UgaWYgKGxuaCA9PSBIRkkxX0xSSF9HUkgpIHsKIAkJCXUzMiB2dGY7CiAKLQkJCW9oZHIgPSAmaGRyLT51Lmwub3RoOwotCQkJaWYgKGhkci0+dS5sLmdyaC5uZXh0X2hkciAhPSBJQl9HUkhfTkVYVF9IRFIpCisJCQlvaGRyID0gJnJoZHItPnUubC5vdGg7CisJCQlpZiAocmhkci0+dS5sLmdyaC5uZXh0X2hkciAhPSBJQl9HUkhfTkVYVF9IRFIpCiAJCQkJZ290byBkcm9wOwotCQkJdnRmID0gYmUzMl90b19jcHUoaGRyLT51LmwuZ3JoLnZlcnNpb25fdGNsYXNzX2Zsb3cpOworCQkJdnRmID0gYmUzMl90b19jcHUocmhkci0+dS5sLmdyaC52ZXJzaW9uX3RjbGFzc19mbG93KTsKIAkJCWlmICgodnRmID4+IElCX0dSSF9WRVJTSU9OX1NISUZUKSAhPSBJQl9HUkhfVkVSU0lPTikKIAkJCQlnb3RvIGRyb3A7CiAJCQlyY3ZfZmxhZ3MgfD0gSEZJMV9IQVNfR1JIOwpAQCAtMzQ0LDcgKzM0Myw3IEBACiAJCQljYXNlIElCX1FQVF9SQzoKIAkJCQloZmkxX3JjX2hkcmVycigKIAkJCQkJcmNkLAotCQkJCQloZHIsCisJCQkJCXJoZHIsCiAJCQkJCXJjdl9mbGFncywKIAkJCQkJcXApOwogCQkJCWJyZWFrOwpAQCAtNDUyLDggKzQ1MSw4IEBACiAJCQkgICAgICAgYm9vbCBkb19jbnApCiB7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnAgPSB0b19pcG9ydChxcC0+aWJxcC5kZXZpY2UsIHFwLT5wb3J0X251bSk7Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIgPSBwa3QtPmhkcjsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyID0gcGt0LT5vaGRyOworCXN0cnVjdCBpYl9oZWFkZXIgKmhkciA9IHBrdC0+aGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyID0gcGt0LT5vaGRyOwogCXN0cnVjdCBpYl9ncmggKmdyaCA9IE5VTEw7CiAJdTMyIHJxcG4gPSAwLCBidGgxOwogCXUxNiBybGlkLCBkbGlkID0gYmUxNl90b19jcHUoaGRyLT5scmhbMV0pOwpAQCAtNDg3LDcgKzQ4Niw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlzYyA9IGhkcjJzYygoc3RydWN0IGhmaTFfbWVzc2FnZV9oZWFkZXIgKiloZHIsIHBrdC0+cmhmKTsKKwlzYyA9IGhkcjJzYyhoZHIsIHBrdC0+cmhmKTsKIAogCWJ0aDEgPSBiZTMyX3RvX2NwdShvaGRyLT5idGhbMV0pOwogCWlmIChkb19jbnAgJiYgKGJ0aDEgJiBIRkkxX0ZFQ05fU01BU0spKSB7CkBAIC01OTksOCArNTk4LDggQEAKIAkJX19sZTMyICpyaGZfYWRkciA9IChfX2xlMzIgKilyY2QtPnJjdmhkcnEgKyBtZGF0YS5wc19oZWFkICsKIAkJCQkJIGRkLT5yaGZfb2Zmc2V0OwogCQlzdHJ1Y3QgcnZ0X3FwICpxcDsKLQkJc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHI7Ci0JCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJCXN0cnVjdCBpYl9oZWFkZXIgKmhkcjsKKwkJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJCXN0cnVjdCBydnRfZGV2X2luZm8gKnJkaSA9ICZkZC0+dmVyYnNfZGV2LnJkaTsKIAkJdTY0IHJoZiA9IHJoZl90b19jcHUocmhmX2FkZHIpOwogCQl1MzIgZXR5cGUgPSByaGZfcmN2X3R5cGUocmhmKSwgcXBuLCBidGgxOwpAQCAtNjE2LDggKzYxNSw4IEBACiAJCWlmIChldHlwZSAhPSBSSEZfUkNWX1RZUEVfSUIpCiAJCQlnb3RvIG5leHQ7CiAKLQkJaGRyID0gKHN0cnVjdCBoZmkxX2liX2hlYWRlciAqKQotCQkJaGZpMV9nZXRfbXNnaGVhZGVyKGRkLCByaGZfYWRkcik7CisJCWhkciA9IGhmaTFfZ2V0X21zZ2hlYWRlcihkZCwgcmhmX2FkZHIpOworCiAJCWxuaCA9IGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSAmIDM7CiAKIAkJaWYgKGxuaCA9PSBIRkkxX0xSSF9CVEgpCkBAIC04OTIsOCArODkxLDggQEAKIAkJCQkgICAgICBzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCkKIHsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmxzYXcgPSAmcmNkLT5wcGQtPmxpbmtzdGF0ZV9hY3RpdmVfd29yazsKLQlzdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqaGRyID0gaGZpMV9nZXRfbXNnaGVhZGVyKHBhY2tldC0+cmNkLT5kZCwKLQkJCQkJCQkgICAgIHBhY2tldC0+cmhmX2FkZHIpOworCXN0cnVjdCBpYl9oZWFkZXIgKmhkciA9IGhmaTFfZ2V0X21zZ2hlYWRlcihwYWNrZXQtPnJjZC0+ZGQsCisJCQkJCQkgICBwYWNrZXQtPnJoZl9hZGRyKTsKIAl1OCBldHlwZSA9IHJoZl9yY3ZfdHlwZShwYWNrZXQtPnJoZik7CiAKIAlpZiAoZXR5cGUgPT0gUkhGX1JDVl9UWVBFX0lCICYmIGhkcjJzYyhoZHIsIHBhY2tldC0+cmhmKSAhPSAweGYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9lcHJvbS5jCmluZGV4IDM2Yjc3OTQuLmU3MGMyMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZXByb20uYwpAQCAtNDksNyArNDksMjYgQEAKICNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJlcHJvbS5oIgogCisvKgorICogVGhlIEVQUk9NIGlzIGxvZ2ljYWxseSBkaXZpZGVkIGludG8gdGhyZWUgcGFydGl0aW9uczoKKyAqCXBhcnRpdGlvbiAwOiB0aGUgZmlyc3QgMTI4SywgdmlzaWJsZSBmcm9tIFBDSSBST00gQkFSCisgKglwYXJ0aXRpb24gMTogNEsgY29uZmlnIGZpbGUgKHNlY3RvciBzaXplKQorICoJcGFydGl0aW9uIDI6IHRoZSByZXN0CisgKi8KKyNkZWZpbmUgUDBfU0laRSAoMTI4ICogMTAyNCkKKyNkZWZpbmUgUDFfU0laRSAgICg0ICogMTAyNCkKKyNkZWZpbmUgUDFfU1RBUlQgUDBfU0laRQorI2RlZmluZSBQMl9TVEFSVCAoUDBfU0laRSArIFAxX1NJWkUpCisKKy8qIGNvbnRyb2xsZXIgcGFnZSBzaXplLCBpbiBieXRlcyAqLworI2RlZmluZSBFUF9QQUdFX1NJWkUgMjU2CisjZGVmaW5lIEVQX1BBR0VfTUFTSyAoRVBfUEFHRV9TSVpFIC0gMSkKKyNkZWZpbmUgRVBfUEFHRV9EV09SRFMgKEVQX1BBR0VfU0laRSAvIHNpemVvZih1MzIpKQorCisvKiBjb250cm9sbGVyIGNvbW1hbmRzICovCiAjZGVmaW5lIENNRF9TSElGVCAyNAorI2RlZmluZSBDTURfTk9QCQkJICAgICgwKQorI2RlZmluZSBDTURfUkVBRF9EQVRBKGFkZHIpCSAgICAoKDB4MDMgPDwgQ01EX1NISUZUKSB8IGFkZHIpCiAjZGVmaW5lIENNRF9SRUxFQVNFX1BPV0VSRE9XTl9OT0lEICAoKDB4YWIgPDwgQ01EX1NISUZUKSkKIAogLyogY29udHJvbGxlciBpbnRlcmZhY2Ugc3BlZWRzICovCkBAIC02MSw2ICs4MCw5MCBAQAogICogRG91YmxlIGl0IGZvciBzYWZldHkuCiAgKi8KICNkZWZpbmUgRVBST01fVElNRU9VVCA4MDAwMCAvKiBtcyAqLworCisvKgorICogUmVhZCBhIDI1NiBieXRlICg2NCBkd29yZCkgRVBST00gcGFnZS4KKyAqIEFsbCBjYWxsZXJzIGhhdmUgdmVyaWZpZWQgdGhlIG9mZnNldCBpcyBhdCBhIHBhZ2UgYm91bmRhcnkuCisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfcGFnZShzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgdTMyIG9mZnNldCwgdTMyICpyZXN1bHQpCit7CisJaW50IGk7CisKKwl3cml0ZV9jc3IoZGQsIEFTSUNfRUVQX0FERFJfQ01ELCBDTURfUkVBRF9EQVRBKG9mZnNldCkpOworCWZvciAoaSA9IDA7IGkgPCBFUF9QQUdFX0RXT1JEUzsgaSsrKQorCQlyZXN1bHRbaV0gPSAodTMyKXJlYWRfY3NyKGRkLCBBU0lDX0VFUF9EQVRBKTsKKwl3cml0ZV9jc3IoZGQsIEFTSUNfRUVQX0FERFJfQ01ELCBDTURfTk9QKTsgLyogY2xvc2Ugb3BlbiBwYWdlICovCit9CisKKy8qCisgKiBSZWFkIGxlbmd0aCBieXRlcyBzdGFydGluZyBhdCBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIEVQUk9NLgorICovCitzdGF0aWMgaW50IHJlYWRfbGVuZ3RoKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCB1MzIgc3RhcnQsIHUzMiBsZW4sIHZvaWQgKmRlc3QpCit7CisJdTMyIGJ1ZmZlcltFUF9QQUdFX0RXT1JEU107CisJdTMyIGVuZDsKKwl1MzIgc3RhcnRfb2Zmc2V0OworCXUzMiByZWFkX3N0YXJ0OworCXUzMiBieXRlczsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwllbmQgPSBzdGFydCArIGxlbjsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSByZWFkIHJhbmdlIGlzIG5vdCBvdXRzaWRlIG9mIHRoZSBjb250cm9sbGVyIHJlYWQKKwkgKiBjb21tYW5kIGFkZHJlc3MgcmFuZ2UuICBOb3RlIHRoYXQgJz4nIGlzIGNvcnJlY3QgYmVsb3cgLSB0aGUgZW5kCisJICogb2YgdGhlIHJhbmdlIGlzIE9LIGlmIGl0IHN0b3BzIGF0IHRoZSBsaW1pdCwgYnV0IG5vIGhpZ2hlci4KKwkgKi8KKwlpZiAoZW5kID4gKDEgPDwgQ01EX1NISUZUKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiByZWFkIHRoZSBmaXJzdCBwYXJ0aWFsIHBhZ2UgKi8KKwlzdGFydF9vZmZzZXQgPSBzdGFydCAmIEVQX1BBR0VfTUFTSzsKKwlpZiAoc3RhcnRfb2Zmc2V0KSB7CisJCS8qIHBhcnRpYWwgc3RhcnRpbmcgcGFnZSAqLworCisJCS8qIGFsaWduIGFuZCByZWFkIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIHN0YXJ0ICovCisJCXJlYWRfc3RhcnQgPSBzdGFydCAmIH5FUF9QQUdFX01BU0s7CisJCXJlYWRfcGFnZShkZCwgcmVhZF9zdGFydCwgYnVmZmVyKTsKKworCQkvKiB0aGUgcmVzdCBvZiB0aGUgcGFnZSBpcyBhdmFpbGFibGUgZGF0YSAqLworCQlieXRlcyA9IEVQX1BBR0VfU0laRSAtIHN0YXJ0X29mZnNldDsKKworCQlpZiAobGVuIDw9IGJ5dGVzKSB7CisJCQkvKiBlbmQgaXMgd2l0aGluIHRoaXMgcGFnZSAqLworCQkJbWVtY3B5KGRlc3QsICh1OCAqKWJ1ZmZlciArIHN0YXJ0X29mZnNldCwgbGVuKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJbWVtY3B5KGRlc3QsICh1OCAqKWJ1ZmZlciArIHN0YXJ0X29mZnNldCwgYnl0ZXMpOworCisJCXN0YXJ0ICs9IGJ5dGVzOworCQlsZW4gLT0gYnl0ZXM7CisJCWRlc3QgKz0gYnl0ZXM7CisJfQorCS8qIHN0YXJ0IGlzIG5vdyBwYWdlIGFsaWduZWQgKi8KKworCS8qIHJlYWQgd2hvbGUgcGFnZXMgKi8KKwl3aGlsZSAobGVuID49IEVQX1BBR0VfU0laRSkgeworCQlyZWFkX3BhZ2UoZGQsIHN0YXJ0LCBidWZmZXIpOworCQltZW1jcHkoZGVzdCwgYnVmZmVyLCBFUF9QQUdFX1NJWkUpOworCisJCXN0YXJ0ICs9IEVQX1BBR0VfU0laRTsKKwkJbGVuIC09IEVQX1BBR0VfU0laRTsKKwkJZGVzdCArPSBFUF9QQUdFX1NJWkU7CisJfQorCisJLyogcmVhZCB0aGUgbGFzdCBwYXJ0aWFsIHBhZ2UgKi8KKwlpZiAobGVuKSB7CisJCXJlYWRfcGFnZShkZCwgc3RhcnQsIGJ1ZmZlcik7CisJCW1lbWNweShkZXN0LCBidWZmZXIsIGxlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBJbml0aWFsaXplIHRoZSBFUFJPTSBoYW5kbGVyLgogICovCkBAIC0xMDAsMyArMjAzLDg1IEBACiBkb25lX2FzaWM6CiAJcmV0dXJuIHJldDsKIH0KKworLyogbWFnaWMgY2hhcmFjdGVyIHNlcXVlbmNlIHRoYXQgdHJhaWxzIGFuIGltYWdlICovCisjZGVmaW5lIElNQUdFX1RSQUlMX01BR0lDICJlZ2FtaUFQTyIKKworLyoKKyAqIFJlYWQgYWxsIG9mIHBhcnRpdGlvbiAxLiAgVGhlIGFjdHVhbCBmaWxlIGlzIGF0IHRoZSBmcm9udC4gIEFkanVzdAorICogdGhlIHJldHVybmVkIHNpemUgaWYgYSB0cmFpbGluZyBpbWFnZSBtYWdpYyBpcyBmb3VuZC4KKyAqLworc3RhdGljIGludCByZWFkX3BhcnRpdGlvbl9wbGF0Zm9ybV9jb25maWcoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHZvaWQgKipkYXRhLAorCQkJCQkgIHUzMiAqc2l6ZSkKK3sKKwl2b2lkICpidWZmZXI7CisJdm9pZCAqcDsKKwl1MzIgbGVuZ3RoOworCWludCByZXQ7CisKKwlidWZmZXIgPSBrbWFsbG9jKFAxX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHJlYWRfbGVuZ3RoKGRkLCBQMV9TVEFSVCwgUDFfU0laRSwgYnVmZmVyKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKGJ1ZmZlcik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2NhbiBmb3IgaW1hZ2UgbWFnaWMgdGhhdCBtYXkgdHJhaWwgdGhlIGFjdHVhbCBkYXRhICovCisJcCA9IHN0cm5zdHIoYnVmZmVyLCBJTUFHRV9UUkFJTF9NQUdJQywgUDFfU0laRSk7CisJaWYgKHApCisJCWxlbmd0aCA9IHAgLSBidWZmZXI7CisJZWxzZQorCQlsZW5ndGggPSBQMV9TSVpFOworCisJKmRhdGEgPSBidWZmZXI7CisJKnNpemUgPSBsZW5ndGg7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGZpbGUgZnJvbSB0aGUgRVBST00uCisgKgorICogT24gc3VjY2VzcywgYW4gYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIGFuZCBpdHMgc2l6ZSBhcmUKKyAqIHJldHVybmVkLiAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBmcmVlIHRoaXMgYnVmZmVyLgorICoKKyAqIFJldHVybiB2YWx1ZToKKyAqICAgMAkgICAgICAtIHN1Y2Nlc3MKKyAqICAgLUVOWElPICAgLSBubyBFUFJPTSBpcyBhdmFpbGFibGUKKyAqICAgLUVCVVNZICAgLSBub3QgYWJsZSB0byBhY3F1aXJlIGFjY2VzcyB0byB0aGUgRVBST00KKyAqICAgLUVOT0VOVCAgLSBubyByZWNvZ25pemFibGUgZmlsZSB3cml0dGVuCisgKiAgIC1FTk9NRU0gIC0gYnVmZmVyIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQKKyAqLworaW50IGVwcm9tX3JlYWRfcGxhdGZvcm1fY29uZmlnKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCB2b2lkICoqZGF0YSwgdTMyICpzaXplKQoreworCXUzMiBkaXJlY3RvcnlbRVBfUEFHRV9EV09SRFNdOyAvKiBhbGlnbmVkIGJ1ZmZlciAqLworCWludCByZXQ7CisKKwlpZiAoIWRkLT5lcHJvbV9hdmFpbGFibGUpCisJCXJldHVybiAtRU5YSU87CisKKwlyZXQgPSBhY3F1aXJlX2NoaXBfcmVzb3VyY2UoZGQsIENSX0VQUk9NLCBFUFJPTV9USU1FT1VUKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogcmVhZCB0aGUgbGFzdCBwYWdlIG9mIFAwIGZvciB0aGUgRVBST00gZm9ybWF0IG1hZ2ljICovCisJcmV0ID0gcmVhZF9sZW5ndGgoZGQsIFAxX1NUQVJUIC0gRVBfUEFHRV9TSVpFLCBFUF9QQUdFX1NJWkUsIGRpcmVjdG9yeSk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCisJLyogbGFzdCBkd29yZCBvZiBQMCBjb250YWlucyBhIG1hZ2ljIGluZGljYXRvciAqLworCWlmIChkaXJlY3RvcnlbRVBfUEFHRV9EV09SRFMgLSAxXSA9PSAwKSB7CisJCS8qIHBhcnRpdGlvbiBmb3JtYXQgKi8KKwkJcmV0ID0gcmVhZF9wYXJ0aXRpb25fcGxhdGZvcm1fY29uZmlnKGRkLCBkYXRhLCBzaXplKTsKKwkJZ290byBkb25lOworCX0KKworCS8qIG5vdGhpbmcgcmVjb2duaXplZCAqLworCXJldCA9IC1FTk9FTlQ7CisKK2RvbmU6CisJcmVsZWFzZV9jaGlwX3Jlc291cmNlKGRkLCBDUl9FUFJPTSk7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9lcHJvbS5oCmluZGV4IGQ0MWYwYjEuLmU3NzQxODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2Vwcm9tLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZXByb20uaApAQCAtNDUsOCArNDUsOCBAQAogICoKICAqLwogCi1zdHJ1Y3QgaGZpMV9jbWQ7CiBzdHJ1Y3QgaGZpMV9kZXZkYXRhOwogCiBpbnQgZXByb21faW5pdChzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCk7Ci1pbnQgaGFuZGxlX2Vwcm9tX2NvbW1hbmQoc3RydWN0IGZpbGUgKmZwLCBjb25zdCBzdHJ1Y3QgaGZpMV9jbWQgKmNtZCk7CitpbnQgZXByb21fcmVhZF9wbGF0Zm9ybV9jb25maWcoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHZvaWQgKipidWZfcmV0LAorCQkJICAgICAgIHUzMiAqc2l6ZV9yZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2ZpbGVfb3BzLmMKaW5kZXggN2UwM2NjZC4uNjc3ZWZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvZmlsZV9vcHMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9maWxlX29wcy5jCkBAIC01OCw3ICs1OCw2IEBACiAjaW5jbHVkZSAidHJhY2UuaCIKICNpbmNsdWRlICJ1c2VyX3NkbWEuaCIKICNpbmNsdWRlICJ1c2VyX2V4cF9yY3YuaCIKLSNpbmNsdWRlICJlcHJvbS5oIgogI2luY2x1ZGUgImFzcG0uaCIKICNpbmNsdWRlICJtbXVfcmIuaCIKIApAQCAtNDQwLDkgKzQzOSwxMCBAQAogCXN0cnVjdCBoZmkxX2ZpbGVkYXRhICpmZCA9IGZwLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGhmaTFfY3R4dGRhdGEgKnVjdHh0ID0gZmQtPnVjdHh0OwogCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHBmbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU2NCB0b2tlbiA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCwKIAkJbWVtYWRkciA9IDA7CisJdm9pZCAqbWVtdmlydCA9IE5VTEw7CiAJdTggc3ViY3R4dCwgbWFwaW8gPSAwLCB2bWYgPSAwLCB0eXBlOwogCXNzaXplX3QgbWVtbGVuID0gMDsKIAlpbnQgcmV0ID0gMDsKQEAgLTQ5Myw3ICs0OTMsOCBAQAogCQkgKiBzZWNvbmQgb3IgdGhpcmQgcGFnZSBhbGxvY2F0ZWQgZm9yIGNyZWRpdCByZXR1cm5zIChpZiBudW1iZXIKIAkJICogb2YgZW5hYmxlZCBjb250ZXh0cyA+IDY0IGFuZCAxMjggcmVzcGVjdGl2ZWx5KS4KIAkJICovCi0JCW1lbWFkZHIgPSBkZC0+Y3JfYmFzZVt1Y3R4dC0+bnVtYV9pZF0ucGEgKworCQltZW12aXJ0ID0gZGQtPmNyX2Jhc2VbdWN0eHQtPm51bWFfaWRdLnZhOworCQltZW1hZGRyID0gdmlydF90b19waHlzKG1lbXZpcnQpICsKIAkJCSgoKHU2NCl1Y3R4dC0+c2MtPmh3X2ZyZWUgLQogCQkJICAodTY0KWRkLT5jcl9iYXNlW3VjdHh0LT5udW1hX2lkXS52YSkgJiBQQUdFX01BU0spOwogCQltZW1sZW4gPSBQQUdFX1NJWkU7CkBAIC01MDgsOCArNTA5LDggQEAKIAkJbWFwaW8gPSAxOwogCQlicmVhazsKIAljYXNlIFJDVl9IRFJROgotCQltZW1hZGRyID0gdWN0eHQtPnJjdmhkcnFfcGh5czsKIAkJbWVtbGVuID0gdWN0eHQtPnJjdmhkcnFfc2l6ZTsKKwkJbWVtdmlydCA9IHVjdHh0LT5yY3ZoZHJxOwogCQlicmVhazsKIAljYXNlIFJDVl9FR1JCVUY6IHsKIAkJdW5zaWduZWQgbG9uZyBhZGRyOwpAQCAtNTMzLDE0ICs1MzQsMjEgQEAKIAkJdm1hLT52bV9mbGFncyAmPSB+Vk1fTUFZV1JJVEU7CiAJCWFkZHIgPSB2bWEtPnZtX3N0YXJ0OwogCQlmb3IgKGkgPSAwIDsgaSA8IHVjdHh0LT5lZ3JidWZzLm51bWJ1ZnM7IGkrKykgeworCQkJbWVtbGVuID0gdWN0eHQtPmVncmJ1ZnMuYnVmZmVyc1tpXS5sZW47CisJCQltZW12aXJ0ID0gdWN0eHQtPmVncmJ1ZnMuYnVmZmVyc1tpXS5hZGRyOwogCQkJcmV0ID0gcmVtYXBfcGZuX3JhbmdlKAogCQkJCXZtYSwgYWRkciwKLQkJCQl1Y3R4dC0+ZWdyYnVmcy5idWZmZXJzW2ldLnBoeXMgPj4gUEFHRV9TSElGVCwKLQkJCQl1Y3R4dC0+ZWdyYnVmcy5idWZmZXJzW2ldLmxlbiwKKwkJCQkvKgorCQkJCSAqIHZpcnRfdG9fcGZuKCkgZG9lcyB0aGUgc2FtZSwgYnV0CisJCQkJICogaXQncyBub3QgYXZhaWxhYmxlIG9uIHg4Nl82NAorCQkJCSAqIHdoZW4gQ09ORklHX01NVSBpcyBlbmFibGVkLgorCQkJCSAqLworCQkJCVBGTl9ET1dOKF9fcGEobWVtdmlydCkpLAorCQkJCW1lbWxlbiwKIAkJCQl2bWEtPnZtX3BhZ2VfcHJvdCk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIGRvbmU7Ci0JCQlhZGRyICs9IHVjdHh0LT5lZ3JidWZzLmJ1ZmZlcnNbaV0ubGVuOworCQkJYWRkciArPSBtZW1sZW47CiAJCX0KIAkJcmV0ID0gMDsKIAkJZ290byBkb25lOwpAQCAtNTk2LDggKzYwNCw4IEBACiAJCQlyZXQgPSAtRVBFUk07CiAJCQlnb3RvIGRvbmU7CiAJCX0KLQkJbWVtYWRkciA9IHVjdHh0LT5yY3ZoZHJxdGFpbGFkZHJfcGh5czsKIAkJbWVtbGVuID0gUEFHRV9TSVpFOworCQltZW12aXJ0ID0gKHZvaWQgKil1Y3R4dC0+cmN2aGRydGFpbF9rdmFkZHI7CiAJCWZsYWdzICY9IH5WTV9NQVlXUklURTsKIAkJYnJlYWs7CiAJY2FzZSBTVUJDVFhUX1VSRUdTOgpAQCAtNjUwLDE2ICs2NTgsMjQgQEAKIAkJICAiJXU6JXUgdHlwZToldSBpby92ZjolZC8lZCwgYWRkcjoweCVsbHgsIGxlbjolbHUoJWx1KSwgZmxhZ3M6MHglbHhcbiIsCiAJCSAgICBjdHh0LCBzdWJjdHh0LCB0eXBlLCBtYXBpbywgdm1mLCBtZW1hZGRyLCBtZW1sZW4sCiAJCSAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fZmxhZ3MpOwotCXBmbiA9ICh1bnNpZ25lZCBsb25nKShtZW1hZGRyID4+IFBBR0VfU0hJRlQpOwogCWlmICh2bWYpIHsKLQkJdm1hLT52bV9wZ29mZiA9IHBmbjsKKwkJdm1hLT52bV9wZ29mZiA9IFBGTl9ET1dOKG1lbWFkZHIpOwogCQl2bWEtPnZtX29wcyA9ICZ2bV9vcHM7CiAJCXJldCA9IDA7CiAJfSBlbHNlIGlmIChtYXBpbykgewotCQlyZXQgPSBpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBwZm4sIG1lbWxlbiwKKwkJcmV0ID0gaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQkJIFBGTl9ET1dOKG1lbWFkZHIpLAorCQkJCQkgbWVtbGVuLAogCQkJCQkgdm1hLT52bV9wYWdlX3Byb3QpOworCX0gZWxzZSBpZiAobWVtdmlydCkgeworCQlyZXQgPSByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCSAgICAgIFBGTl9ET1dOKF9fcGEobWVtdmlydCkpLAorCQkJCSAgICAgIG1lbWxlbiwKKwkJCQkgICAgICB2bWEtPnZtX3BhZ2VfcHJvdCk7CiAJfSBlbHNlIHsKLQkJcmV0ID0gcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgcGZuLCBtZW1sZW4sCisJCXJldCA9IHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJICAgICAgUEZOX0RPV04obWVtYWRkciksCisJCQkJICAgICAgbWVtbGVuLAogCQkJCSAgICAgIHZtYS0+dm1fcGFnZV9wcm90KTsKIAl9CiBkb25lOgpAQCAtOTYxLDE0ICs5NzcsMTYgQEAKIAkgKi8KIAl1Y3R4dC0+c2MgPSBzY19hbGxvYyhkZCwgU0NfVVNFUiwgdWN0eHQtPnJjdmhkcnFlbnRzaXplLAogCQkJICAgICB1Y3R4dC0+ZGQtPm5vZGUpOwotCWlmICghdWN0eHQtPnNjKQotCQlyZXR1cm4gLUVOT01FTTsKLQorCWlmICghdWN0eHQtPnNjKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gY3R4ZGF0YV9mcmVlOworCX0KIAloZmkxX2NkYmcoUFJPQywgImFsbG9jYXRlZCBzZW5kIGNvbnRleHQgJXUoJXUpXG4iLCB1Y3R4dC0+c2MtPnN3X2luZGV4LAogCQkgIHVjdHh0LT5zYy0+aHdfY29udGV4dCk7CiAJcmV0ID0gc2NfZW5hYmxlKHVjdHh0LT5zYyk7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBjdHhkYXRhX2ZyZWU7CisKIAkvKgogCSAqIFNldHVwIHNoYXJlZCBjb250ZXh0IHJlc291cmNlcyBpZiB0aGUgdXNlci1sZXZlbCBoYXMgcmVxdWVzdGVkCiAJICogc2hhcmVkIGNvbnRleHRzIGFuZCB0aGlzIGlzIHRoZSAnbWFzdGVyJyBwcm9jZXNzLgpAQCAtOTgyLDcgKzEwMDAsNyBAQAogCQkgKiBzZW5kIGNvbnRleHQgYmVjYXVzZSBpdCB3aWxsIGJlIGRvbmUgZHVyaW5nIGZpbGUgY2xvc2UKIAkJICovCiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBjdHhkYXRhX2ZyZWU7CiAJfQogCXVjdHh0LT51c2VydmVyc2lvbiA9IHVpbmZvLT51c2VydmVyc2lvbjsKIAl1Y3R4dC0+ZmxhZ3MgPSBoZmkxX2NhcF9tYXNrOyAvKiBzYXZlIGN1cnJlbnQgZmxhZyBzdGF0ZSAqLwpAQCAtMTAwMiw2ICsxMDIwLDExIEBACiAJZmQtPnVjdHh0ID0gdWN0eHQ7CiAKIAlyZXR1cm4gMDsKKworY3R4ZGF0YV9mcmVlOgorCWRkLT5yY2RbY3R4dF0gPSBOVUxMOworCWhmaTFfZnJlZV9jdHh0ZGF0YShkZCwgdWN0eHQpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaW5pdF9zdWJjdHh0cyhzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqdWN0eHQsCkBAIC0xMjYwLDcgKzEyODMsNyBAQAogCQkJCQkgICAgICAgdWN0eHQtPnJjdmhkcnEpOwogCWJpbmZvLnJjdmVncl9idWZiYXNlID0gSEZJMV9NTUFQX1RPS0VOKFJDVl9FR1JCVUYsIHVjdHh0LT5jdHh0LAogCQkJCQkgICAgICAgZmQtPnN1YmN0eHQsCi0JCQkJCSAgICAgICB1Y3R4dC0+ZWdyYnVmcy5yY3Z0aWRzWzBdLnBoeXMpOworCQkJCQkgICAgICAgdWN0eHQtPmVncmJ1ZnMucmN2dGlkc1swXS5kbWEpOwogCWJpbmZvLnNkbWFfY29tcF9idWZiYXNlID0gSEZJMV9NTUFQX1RPS0VOKFNETUFfQ09NUCwgdWN0eHQtPmN0eHQsCiAJCQkJCQkgZmQtPnN1YmN0eHQsIDApOwogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9oZmkuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2hmaS5oCmluZGV4IGEwMjFlNjYuLjdlZWYxMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2hmaS5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2hmaS5oCkBAIC02NCw2ICs2NCw4IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLWJpdC5oPgorI2luY2x1ZGUgPHJkbWEvaWJfaGRycy5oPgorI2luY2x1ZGUgPGxpbnV4L3JoYXNodGFibGUuaD4KICNpbmNsdWRlIDxyZG1hL3JkbWFfdnQuaD4KIAogI2luY2x1ZGUgImNoaXBfcmVnaXN0ZXJzLmgiCkBAIC0xNzEsMTIgKzE3MywxMiBAQAogCXUzMiB0aHJlc2hvbGQ7ICAgICAgICAgICAvKiBoZWFkIHVwZGF0ZSB0aHJlc2hvbGQgKi8KIAlzdHJ1Y3QgZWFnZXJfYnVmZmVyIHsKIAkJdm9pZCAqYWRkcjsKLQkJZG1hX2FkZHJfdCBwaHlzOworCQlkbWFfYWRkcl90IGRtYTsKIAkJc3NpemVfdCBsZW47CiAJfSAqYnVmZmVyczsKIAlzdHJ1Y3QgewogCQl2b2lkICphZGRyOwotCQlkbWFfYWRkcl90IHBoeXM7CisJCWRtYV9hZGRyX3QgZG1hOwogCX0gKnJjdnRpZHM7CiB9OwogCkBAIC0yMDcsOCArMjA5LDggQEAKIAkvKiBzaXplIG9mIGVhY2ggb2YgdGhlIHJjdmhkcnEgZW50cmllcyAqLwogCXUxNiByY3ZoZHJxZW50c2l6ZTsKIAkvKiBtbWFwIG9mIGhkcnEsIG11c3QgZml0IGluIDQ0IGJpdHMgKi8KLQlkbWFfYWRkcl90IHJjdmhkcnFfcGh5czsKLQlkbWFfYWRkcl90IHJjdmhkcnF0YWlsYWRkcl9waHlzOworCWRtYV9hZGRyX3QgcmN2aGRycV9kbWE7CisJZG1hX2FkZHJfdCByY3ZoZHJxdGFpbGFkZHJfZG1hOwogCXN0cnVjdCBjdHh0X2VhZ2VyX2J1ZnMgZWdyYnVmczsKIAkvKiB0aGlzIHJlY2VpdmUgY29udGV4dCdzIGFzc2lnbmVkIFBJTyBBQ0sgc2VuZCBjb250ZXh0ICovCiAJc3RydWN0IHNlbmRfY29udGV4dCAqc2M7CkBAIC0zNTAsNyArMzUyLDcgQEAKIAlzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqcmNkOwogCV9fbGUzMiAqcmhmX2FkZHI7CiAJc3RydWN0IHJ2dF9xcCAqcXA7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAl1NjQgcmhmOwogCXUzMiBtYXhjbnQ7CiAJdTMyIHJocW9mZjsKQEAgLTUyOSw2ICs1MzEsNyBAQAogCXZvaWQgKmFyZzsKIAljaGFyIG5hbWVbTUFYX05BTUVfU0laRV07CiAJY3B1bWFza190IG1hc2s7CisJc3RydWN0IGlycV9hZmZpbml0eV9ub3RpZnkgbm90aWZ5OwogfTsKIAogLyogcGVyLVNMIENDQSBpbmZvcm1hdGlvbiAqLwpAQCAtNjA1LDYgKzYwOCw3IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IGZyZWV6ZV93b3JrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX2Rvd25ncmFkZV93b3JrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBsaW5rX2JvdW5jZV93b3JrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgc3RhcnRfbGlua193b3JrOwogCS8qIGhvc3QgbGluayBzdGF0ZSB2YXJpYWJsZXMgKi8KIAlzdHJ1Y3QgbXV0ZXggaGxzX2xvY2s7CiAJdTMyIGhvc3RfbGlua19zdGF0ZTsKQEAgLTY1OSw2ICs2NjMsNyBAQAogCXU4IGxpbmtpbml0X3JlYXNvbjsKIAl1OCBsb2NhbF90eF9yYXRlOwkvKiByYXRlIGdpdmVuIHRvIDgwNTEgZmlybXdhcmUgKi8KIAl1OCBsYXN0X3BzdGF0ZTsJCS8qIGluZm8gb25seSAqLworCXU4IHFzZnBfcmV0cnlfY291bnQ7CiAKIAkvKiBwbGFjZWhvbGRlcnMgZm9yIElCIE1BRCBwYWNrZXQgc2V0dGluZ3MgKi8KIAl1OCBvdmVycnVuX3RocmVzaG9sZDsKQEAgLTEwNTgsOCArMTA2Myw2IEBACiAJdTggcHN4bWl0d2FpdF9zdXBwb3J0ZWQ7CiAJLyogY3ljbGUgbGVuZ3RoIG9mIFBTKiBjb3VudGVycyBpbiBIVyAoaW4gcGljb3NlY29uZHMpICovCiAJdTE2IHBzeG1pdHdhaXRfY2hlY2tfcmF0ZTsKLQkvKiBoaWdoIHZvbHVtZSBvdmVyZmxvdyBlcnJvcnMgZGVmZXJyZWQgdG8gdGFza2xldCAqLwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBlcnJvcl90YXNrbGV0OwogCiAJLyogTVNJLVggaW5mb3JtYXRpb24gKi8KIAlzdHJ1Y3QgaGZpMV9tc2l4X2VudHJ5ICptc2l4X2VudHJpZXM7CkBAIC0xMTYyLDcgKzExNjUsNyBAQAogCiAJLyogcmVjZWl2ZSBjb250ZXh0IHRhaWwgZHVtbXkgYWRkcmVzcyAqLwogCV9fbGU2NCAqcmN2aGRydGFpbF9kdW1teV9rdmFkZHI7Ci0JZG1hX2FkZHJfdCByY3ZoZHJ0YWlsX2R1bW15X3BoeXNhZGRyOworCWRtYV9hZGRyX3QgcmN2aGRydGFpbF9kdW1teV9kbWE7CiAKIAlib29sIGVwcm9tX2F2YWlsYWJsZTsJLyogdHJ1ZSBpZiBFUFJPTSBpcyBhdmFpbGFibGUgZm9yIHRoaXMgZGV2aWNlICovCiAJYm9vbCBhc3BtX3N1cHBvcnRlZDsJLyogRG9lcyBIVyBzdXBwb3J0IEFTUE0gKi8KQEAgLTExNzMsNiArMTE3Niw3IEBACiAJYXRvbWljX3QgYXNwbV9kaXNhYmxlZF9jbnQ7CiAKIAlzdHJ1Y3QgaGZpMV9hZmZpbml0eSAqYWZmaW5pdHk7CisJc3RydWN0IHJoYXNodGFibGUgc2RtYV9yaHQ7CiAJc3RydWN0IGtvYmplY3Qga29iajsKIH07CiAKQEAgLTEyNjYsNyArMTI3MCw3IEBACiB2b2lkIHJlY2VpdmVfaW50ZXJydXB0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogLyogZXh0cmFjdCBzZXJ2aWNlIGNoYW5uZWwgZnJvbSBoZWFkZXIgYW5kIHJoZiAqLwotc3RhdGljIGlubGluZSBpbnQgaGRyMnNjKHN0cnVjdCBoZmkxX21lc3NhZ2VfaGVhZGVyICpoZHIsIHU2NCByaGYpCitzdGF0aWMgaW5saW5lIGludCBoZHIyc2Moc3RydWN0IGliX2hlYWRlciAqaGRyLCB1NjQgcmhmKQogewogCXJldHVybiAoKGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSA+PiAxMikgJiAweGYpIHwKIAkgICAgICAgKCghIShyaGZfZGNfaW5mbyhyaGYpKSkgPDwgNCk7CkBAIC0xNjAxLDcgKzE2MDUsNyBAQAogc3RhdGljIGlubGluZSBib29sIHByb2Nlc3NfZWNuKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaGZpMV9wYWNrZXQgKnBrdCwKIAkJCSAgICAgICBib29sIGRvX2NucCkKIHsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyID0gcGt0LT5vaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyID0gcGt0LT5vaGRyOwogCXUzMiBidGgxOwogCiAJYnRoMSA9IGJlMzJfdG9fY3B1KG9oZHItPmJ0aFsxXSk7CkBAIC0xODA0LDcgKzE4MDgsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBoZmkxX2N1OwogZXh0ZXJuIHVuc2lnbmVkIGludCB1c2VyX2NyZWRpdF9yZXR1cm5fdGhyZXNob2xkOwogZXh0ZXJuIGludCBudW1fdXNlcl9jb250ZXh0czsKLWV4dGVybiB1bnNpZ25lZCBuX2tyY3ZxczsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG5fa3JjdnFzOwogZXh0ZXJuIHVpbnQga3JjdnFzW107CiBleHRlcm4gaW50IGtyY3Zxc3NldDsKIGV4dGVybiB1aW50IGtkZXRoX3FwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvaW5pdC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvaW5pdC5jCmluZGV4IGI3OTM1NDUuLjYwZGI2MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL2luaXQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9pbml0LmMKQEAgLTk0LDcgKzk0LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0Moa3JjdnFzLCAiQXJyYXkgb2YgdGhlIG51bWJlciBvZiBub24tY29udHJvbCBrZXJuZWwgcmVjZWl2ZSBxdWV1ZXMgYnkgVkwiKTsKIAogLyogY29tcHV0ZWQgYmFzZWQgb24gYWJvdmUgYXJyYXkgKi8KLXVuc2lnbmVkIG5fa3JjdnFzOwordW5zaWduZWQgbG9uZyBuX2tyY3ZxczsKIAogc3RhdGljIHVuc2lnbmVkIGhmaTFfcmN2YXJyX3NwbGl0ID0gMjU7CiBtb2R1bGVfcGFyYW1fbmFtZWQocmN2YXJyX3NwbGl0LCBoZmkxX3JjdmFycl9zcGxpdCwgdWludCwgU19JUlVHTyk7CkBAIC0zMzYsNiArMzM2LDcgQEAKIAl9CiAJcmV0dXJuIHJjZDsKIGJhaWw6CisJZGQtPnJjZFtjdHh0XSA9IE5VTEw7CiAJa2ZyZWUocmNkLT5lZ3JidWZzLnJjdnRpZHMpOwogCWtmcmVlKHJjZC0+ZWdyYnVmcy5idWZmZXJzKTsKIAlrZnJlZShyY2QpOwpAQCAtNTAwLDYgKzUwMSw3IEBACiAJSU5JVF9XT1JLKCZwcGQtPmxpbmtfZG93bmdyYWRlX3dvcmssIGhhbmRsZV9saW5rX2Rvd25ncmFkZSk7CiAJSU5JVF9XT1JLKCZwcGQtPnNtYV9tZXNzYWdlX3dvcmssIGhhbmRsZV9zbWFfbWVzc2FnZSk7CiAJSU5JVF9XT1JLKCZwcGQtPmxpbmtfYm91bmNlX3dvcmssIGhhbmRsZV9saW5rX2JvdW5jZSk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnBwZC0+c3RhcnRfbGlua193b3JrLCBoYW5kbGVfc3RhcnRfbGluayk7CiAJSU5JVF9XT1JLKCZwcGQtPmxpbmtzdGF0ZV9hY3RpdmVfd29yaywgcmVjZWl2ZV9pbnRlcnJ1cHRfd29yayk7CiAJSU5JVF9XT1JLKCZwcGQtPnFzZnBfaW5mby5xc2ZwX3dvcmssIHFzZnBfZXZlbnQpOwogCkBAIC03MDgsNyArNzEwLDcgQEAKIAkvKiBhbGxvY2F0ZSBkdW1teSB0YWlsIG1lbW9yeSBmb3IgYWxsIHJlY2VpdmUgY29udGV4dHMgKi8KIAlkZC0+cmN2aGRydGFpbF9kdW1teV9rdmFkZHIgPSBkbWFfemFsbG9jX2NvaGVyZW50KAogCQkmZGQtPnBjaWRldi0+ZGV2LCBzaXplb2YodTY0KSwKLQkJJmRkLT5yY3ZoZHJ0YWlsX2R1bW15X3BoeXNhZGRyLAorCQkmZGQtPnJjdmhkcnRhaWxfZHVtbXlfZG1hLAogCQlHRlBfS0VSTkVMKTsKIAogCWlmICghZGQtPnJjdmhkcnRhaWxfZHVtbXlfa3ZhZGRyKSB7CkBAIC05NDEsMTIgKzk0MywxMiBAQAogCiAJaWYgKHJjZC0+cmN2aGRycSkgewogCQlkbWFfZnJlZV9jb2hlcmVudCgmZGQtPnBjaWRldi0+ZGV2LCByY2QtPnJjdmhkcnFfc2l6ZSwKLQkJCQkgIHJjZC0+cmN2aGRycSwgcmNkLT5yY3ZoZHJxX3BoeXMpOworCQkJCSAgcmNkLT5yY3ZoZHJxLCByY2QtPnJjdmhkcnFfZG1hKTsKIAkJcmNkLT5yY3ZoZHJxID0gTlVMTDsKIAkJaWYgKHJjZC0+cmN2aGRydGFpbF9rdmFkZHIpIHsKIAkJCWRtYV9mcmVlX2NvaGVyZW50KCZkZC0+cGNpZGV2LT5kZXYsIFBBR0VfU0laRSwKIAkJCQkJICAodm9pZCAqKXJjZC0+cmN2aGRydGFpbF9rdmFkZHIsCi0JCQkJCSAgcmNkLT5yY3ZoZHJxdGFpbGFkZHJfcGh5cyk7CisJCQkJCSAgcmNkLT5yY3ZoZHJxdGFpbGFkZHJfZG1hKTsKIAkJCXJjZC0+cmN2aGRydGFpbF9rdmFkZHIgPSBOVUxMOwogCQl9CiAJfQpAQCAtOTU1LDExICs5NTcsMTEgQEAKIAlrZnJlZShyY2QtPmVncmJ1ZnMucmN2dGlkcyk7CiAKIAlmb3IgKGUgPSAwOyBlIDwgcmNkLT5lZ3JidWZzLmFsbG9jZWQ7IGUrKykgewotCQlpZiAocmNkLT5lZ3JidWZzLmJ1ZmZlcnNbZV0ucGh5cykKKwkJaWYgKHJjZC0+ZWdyYnVmcy5idWZmZXJzW2VdLmRtYSkKIAkJCWRtYV9mcmVlX2NvaGVyZW50KCZkZC0+cGNpZGV2LT5kZXYsCiAJCQkJCSAgcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbZV0ubGVuLAogCQkJCQkgIHJjZC0+ZWdyYnVmcy5idWZmZXJzW2VdLmFkZHIsCi0JCQkJCSAgcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbZV0ucGh5cyk7CisJCQkJCSAgcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbZV0uZG1hKTsKIAl9CiAJa2ZyZWUocmNkLT5lZ3JidWZzLmJ1ZmZlcnMpOwogCkBAIC0xMzUzLDcgKzEzNTUsNyBAQAogCWlmIChkZC0+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+ZWdyYnVmcy5idWZmZXJzW2lkeF0uZG1hID0gMDsKIAkJcmNkLT5lZ3JidWZzLmJ1ZmZlcnNbaWR4XS5sZW4gPSAwOwogCX0KIGJhaWw6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL21hZC5jCmluZGV4IDM5ZTQyYzMuLjk0ODdjOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL21hZC5jCkBAIC0xMDEzLDcgKzEwMTMsNiBAQAogCQkJICogb2ZmbGluZS4KIAkJCSAqLwogCQkJc2V0X2xpbmtfc3RhdGUocHBkLCBITFNfRE5fT0ZGTElORSk7Ci0JCQl0dW5lX3NlcmRlcyhwcGQpOwogCQkJc3RhcnRfbGluayhwcGQpOwogCQl9IGVsc2UgewogCQkJc2V0X2xpbmtfc3RhdGUocHBkLCBsaW5rX3N0YXRlKTsKQEAgLTE0MDcsMTIgKzE0MDYsNiBAQAogCQlpZiAoa2V5ID09IG9rZXkpCiAJCQljb250aW51ZTsKIAkJLyoKLQkJICogRG9uJ3QgdXBkYXRlIHBrZXlzWzJdLCBpZiBhbiBIRkkgcG9ydCB3aXRob3V0IE1nbXRBbGxvd2VkCi0JCSAqIGJ5IG5laWdoYm9yIGlzIGEgc3dpdGNoLgotCQkgKi8KLQkJaWYgKGkgPT0gMiAmJiAhcHBkLT5tZ210X2FsbG93ZWQgJiYgcHBkLT5uZWlnaGJvcl90eXBlID09IDEpCi0JCQljb250aW51ZTsKLQkJLyoKIAkJICogVGhlIFNNIGdpdmVzIHVzIHRoZSBjb21wbGV0ZSBQS2V5IHRhYmxlLiBXZSBoYXZlCiAJCSAqIHRvIGVuc3VyZSB0aGF0IHdlIHB1dCB0aGUgUEtleXMgaW4gdGhlIG1hdGNoaW5nCiAJCSAqIHNsb3RzLgpAQCAtMjYwNCw3ICsyNTk3LDcgQEAKIAl1OCBscSwgbnVtX3ZsczsKIAl1OCByZXNfbGxpLCByZXNfbGVyOwogCXU2NCBwb3J0X21hc2s7Ci0JdW5zaWduZWQgbG9uZyBwb3J0X251bTsKKwl1OCBwb3J0X251bTsKIAl1bnNpZ25lZCBsb25nIHZsOwogCXUzMiB2bF9zZWxlY3RfbWFzazsKIAlpbnQgdmZpOwpAQCAtMjYzOCw5ICsyNjMxLDkgQEAKIAkgKi8KIAlwb3J0X21hc2sgPSBiZTY0X3RvX2NwdShyZXEtPnBvcnRfc2VsZWN0X21hc2tbM10pOwogCXBvcnRfbnVtID0gZmluZF9maXJzdF9iaXQoKHVuc2lnbmVkIGxvbmcgKikmcG9ydF9tYXNrLAotCQkJCSAgc2l6ZW9mKHBvcnRfbWFzaykpOworCQkJCSAgc2l6ZW9mKHBvcnRfbWFzaykgKiA4KTsKIAotCWlmICgodTgpcG9ydF9udW0gIT0gcG9ydCkgeworCWlmIChwb3J0X251bSAhPSBwb3J0KSB7CiAJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CiAJCXJldHVybiByZXBseSgoc3RydWN0IGliX21hZF9oZHIgKilwbXApOwogCX0KQEAgLTI4NDIsNyArMjgzNSw3IEBACiAJICovCiAJcG9ydF9tYXNrID0gYmU2NF90b19jcHUocmVxLT5wb3J0X3NlbGVjdF9tYXNrWzNdKTsKIAlwb3J0X251bSA9IGZpbmRfZmlyc3RfYml0KCh1bnNpZ25lZCBsb25nICopJnBvcnRfbWFzaywKLQkJCQkgIHNpemVvZihwb3J0X21hc2spKTsKKwkJCQkgIHNpemVvZihwb3J0X21hc2spICogOCk7CiAKIAlpZiAocG9ydF9udW0gIT0gcG9ydCkgewogCQlwbXAtPm1hZF9oZHIuc3RhdHVzIHw9IElCX1NNUF9JTlZBTElEX0ZJRUxEOwpAQCAtMzAxNSw3ICszMDA4LDcgQEAKIAkgKi8KIAlwb3J0X21hc2sgPSBiZTY0X3RvX2NwdShyZXEtPnBvcnRfc2VsZWN0X21hc2tbM10pOwogCXBvcnRfbnVtID0gZmluZF9maXJzdF9iaXQoKHVuc2lnbmVkIGxvbmcgKikmcG9ydF9tYXNrLAotCQkJCSAgc2l6ZW9mKHBvcnRfbWFzaykpOworCQkJCSAgc2l6ZW9mKHBvcnRfbWFzaykgKiA4KTsKIAogCWlmIChwb3J0X251bSAhPSBwb3J0KSB7CiAJCXBtcC0+bWFkX2hkci5zdGF0dXMgfD0gSUJfU01QX0lOVkFMSURfRklFTEQ7CkBAIC0zMjUyLDcgKzMyNDUsNyBAQAogCSAqLwogCXBvcnRfbWFzayA9IGJlNjRfdG9fY3B1KHJlcS0+cG9ydF9zZWxlY3RfbWFza1szXSk7CiAJcG9ydF9udW0gPSBmaW5kX2ZpcnN0X2JpdCgodW5zaWduZWQgbG9uZyAqKSZwb3J0X21hc2ssCi0JCQkJICBzaXplb2YocG9ydF9tYXNrKSk7CisJCQkJICBzaXplb2YocG9ydF9tYXNrKSAqIDgpOwogCiAJaWYgKHBvcnRfbnVtICE9IHBvcnQpIHsKIAkJcG1wLT5tYWRfaGRyLnN0YXR1cyB8PSBJQl9TTVBfSU5WQUxJRF9GSUVMRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3Bpby5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvLmMKaW5kZXggYWMxYmY0YS4uNTBhM2EzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGlvLmMKQEAgLTU1MSwxMSArNTUxLDExIEBACiB9CiAKIC8qCi0gKiBPYnRhaW4gdGhlIGNyZWRpdCByZXR1cm4gYWRkcmVzc2VzLCBrZXJuZWwgdmlydHVhbCBhbmQgcGh5c2ljYWwsIGZvciB0aGUKKyAqIE9idGFpbiB0aGUgY3JlZGl0IHJldHVybiBhZGRyZXNzZXMsIGtlcm5lbCB2aXJ0dWFsIGFuZCBidXMsIGZvciB0aGUKICAqIGdpdmVuIHNjLgogICoKICAqIFRvIHVuZGVyc3RhbmQgdGhpcyByb3V0aW5lOgotICogbyB2YSBhbmQgcGEgYXJlIGFycmF5cyBvZiBzdHJ1Y3QgY3JlZGl0X3JldHVybi4gIE9uZSBmb3IgZWFjaCBwaHlzaWNhbAorICogbyB2YSBhbmQgZG1hIGFyZSBhcnJheXMgb2Ygc3RydWN0IGNyZWRpdF9yZXR1cm4uICBPbmUgZm9yIGVhY2ggcGh5c2ljYWwKICAqICAgc2VuZCBjb250ZXh0LCBwZXIgTlVNQS4KICAqIG8gRWFjaCBzZW5kIGNvbnRleHQgYWx3YXlzIGxvb2tzIGluIGl0cyByZWxhdGl2ZSBsb2NhdGlvbiBpbiBhIHN0cnVjdAogICogICBjcmVkaXRfcmV0dXJuIGZvciBpdHMgY3JlZGl0IHJldHVybi4KQEAgLTU2MywxNCArNTYzLDE0IEBACiAgKiAgIHdpdGggdGhlIHNhbWUgdmFsdWUuICBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHNlbmQgY29udGV4dCBpbiB0aGUKICAqICAgZ3JvdXAuCiAgKi8KLXN0YXRpYyB2b2lkIGNyX2dyb3VwX2FkZHJlc3NlcyhzdHJ1Y3Qgc2VuZF9jb250ZXh0ICpzYywgZG1hX2FkZHJfdCAqcGEpCitzdGF0aWMgdm9pZCBjcl9ncm91cF9hZGRyZXNzZXMoc3RydWN0IHNlbmRfY29udGV4dCAqc2MsIGRtYV9hZGRyX3QgKmRtYSkKIHsKIAl1MzIgZ2MgPSBncm91cF9jb250ZXh0KHNjLT5od19jb250ZXh0LCBzYy0+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+cXdfd3JpdHRlbiAqIHNpemVvZih1NjQpKTsKQEAgLTc5OCw2ICs2NzksMTUgQEAKIAkJCXJlYWRfbG93X2J5dGVzKHBidWYsIGZyb20sIGV4dHJhKTsKIAkJCWZyb20gKz0gZXh0cmE7CiAJCQluYnl0ZXMgLT0gZXh0cmE7CisJCQkvKgorCQkJICogSWYgbm8gYnl0ZXMgYXJlIGxlZnQsIHJldHVybiBlYXJseSAtIHdlIGFyZSBkb25lLgorCQkJICogTk9URTogVGhpcyBzaG9ydC1jaXJjdWl0IGlzICpyZXF1aXJlZCogYmVjYXVzZQorCQkJICogImV4dHJhIiBtYXkgaGF2ZSBiZWVuIHJlZHVjZWQgaW4gc2l6ZSBhbmQgImZyb20iCisJCQkgKiBpcyBub3QgYWxpZ25lZCwgYXMgcmVxdWlyZWQgd2hlbiBsZWF2aW5nIHRoaXMKKwkJCSAqIGlmIGJsb2NrLgorCQkJICovCisJCQlpZiAobmJ5dGVzID09IDApCisJCQkJcmV0dXJuOwogCQl9CiAKIAkJLyogYXQgdGhpcyBwb2ludCwgZnJvbSBpcyBRVyBhbGlnbmVkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcGxhdGZvcm0uYwppbmRleCA5NjVjOGFlLi4yMDI0MzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3BsYXRmb3JtLmMKQEAgLTQ3LDI5ICs0NywzOSBAQAogCiAjaW5jbHVkZSAiaGZpLmgiCiAjaW5jbHVkZSAiZWZpdmFyLmgiCisjaW5jbHVkZSAiZXByb20uaCIKIAogdm9pZCBnZXRfcGxhdGZvcm1fY29uZmlnKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQogewogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IDA7CiAJdTggKnRlbXBfcGxhdGZvcm1fY29uZmlnID0gTlVMTDsKKwl1MzIgZXNpemU7CisKKwlyZXQgPSBlcHJvbV9yZWFkX3BsYXRmb3JtX2NvbmZpZyhkZCwgKHZvaWQgKiopJnRlbXBfcGxhdGZvcm1fY29uZmlnLAorCQkJCQkgJmVzaXplKTsKKwlpZiAoIXJldCkgeworCQkvKiBzdWNjZXNzICovCisJCXNpemUgPSBlc2l6ZTsKKwkJZ290byBzdWNjZXNzOworCX0KKwkvKiBmYWlsLCB0cnkgRUZJIHZhcmlhYmxlICovCiAKIAlyZXQgPSByZWFkX2hmaTFfZWZpX3ZhcihkZCwgImNvbmZpZ3VyYXRpb24iLCAmc2l6ZSwKIAkJCQkodm9pZCAqKikmdGVtcF9wbGF0Zm9ybV9jb25maWcpOwotCWlmIChyZXQpIHsKLQkJZGRfZGV2X2luZm8oZGQsCi0JCQkgICAgIiVzOiBGYWlsZWQgdG8gZ2V0IHBsYXRmb3JtIGNvbmZpZyBmcm9tIFVFRkksIGZhbGxpbmcgYmFjayB0byByZXF1ZXN0IGZpcm13YXJlXG4iLAotCQkJICAgIF9fZnVuY19fKTsKLQkJLyogZmFsbCBiYWNrIHRvIHJlcXVlc3QgZmlybXdhcmUgKi8KLQkJcGxhdGZvcm1fY29uZmlnX2xvYWQgPSAxOwotCQlnb3RvIGJhaWw7Ci0JfQorCWlmICghcmV0KQorCQlnb3RvIHN1Y2Nlc3M7CiAKKwlkZF9kZXZfaW5mbyhkZCwKKwkJICAgICIlczogRmFpbGVkIHRvIGdldCBwbGF0Zm9ybSBjb25maWcgZnJvbSBVRUZJLCBmYWxsaW5nIGJhY2sgdG8gcmVxdWVzdCBmaXJtd2FyZVxuIiwKKwkJICAgIF9fZnVuY19fKTsKKwkvKiBmYWxsIGJhY2sgdG8gcmVxdWVzdCBmaXJtd2FyZSAqLworCXBsYXRmb3JtX2NvbmZpZ19sb2FkID0gMTsKKwlyZXR1cm47CisKK3N1Y2Nlc3M6CiAJZGQtPnBsYXRmb3JtX2NvbmZpZy5kYXRhID0gdGVtcF9wbGF0Zm9ybV9jb25maWc7CiAJZGQtPnBsYXRmb3JtX2NvbmZpZy5zaXplID0gc2l6ZTsKLQotYmFpbDoKLQkvKiBleGl0ICovOwogfQogCiB2b2lkIGZyZWVfcGxhdGZvcm1fY29uZmlnKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3FwLmMKaW5kZXggNGU0ZDgzMS4uOWZjNzVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9xcC5jCkBAIC0yMDIsOCArMjAyLDcgQEAKIAl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJmRldi0+aW93YWl0X2xvY2ssIGZsYWdzKTsKIAlpZiAoIWxpc3RfZW1wdHkoJnByaXYtPnNfaW93YWl0Lmxpc3QpKSB7CiAJCWxpc3RfZGVsX2luaXQoJnByaXYtPnNfaW93YWl0Lmxpc3QpOwotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKLQkJCXdha2VfdXAoJnFwLT53YWl0KTsKKwkJcnZ0X3B1dF9xcChxcCk7CiAJfQogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlvd2FpdF9sb2NrLCBmbGFncyk7CiB9CkBAIC00NTAsMTMgKzQ0OSwxNCBAQAogICovCiB2b2lkIGhmaTFfc2NoZWR1bGVfc2VuZChzdHJ1Y3QgcnZ0X3FwICpxcCkKIHsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlpZiAoaGZpMV9zZW5kX29rKHFwKSkKIAkJX2hmaTFfc2NoZWR1bGVfc2VuZChxcCk7CiB9CiAKIC8qKgotICogaGZpMV9nZXRfY3JlZGl0IC0gZmx1c2ggdGhlIHNlbmQgd29yayBxdWV1ZSBvZiBhIFFQCi0gKiBAcXA6IHRoZSBxcCB3aG8ncyBzZW5kIHdvcmsgcXVldWUgdG8gZmx1c2gKKyAqIGhmaTFfZ2V0X2NyZWRpdCAtIGhhbmRsZSBjcmVkaXQgaW4gYWV0aAorICogQHFwOiB0aGUgcXAKICAqIEBhZXRoOiB0aGUgQWNrbm93bGVkZ2UgRXh0ZW5kZWQgVHJhbnNwb3J0IEhlYWRlcgogICoKICAqIFRoZSBRUCBzX2xvY2sgc2hvdWxkIGJlIGhlbGQuCkBAIC00NjUsNiArNDY1LDcgQEAKIHsKIAl1MzIgY3JlZGl0ID0gKGFldGggPj4gSEZJMV9BRVRIX0NSRURJVF9TSElGVCkgJiBIRkkxX0FFVEhfQ1JFRElUX01BU0s7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAkvKgogCSAqIElmIHRoZSBjcmVkaXQgaXMgaW52YWxpZCwgd2UgY2FuIHNlbmQKIAkgKiBhcyBtYW55IHBhY2tldHMgYXMgd2UgbGlrZS4gIE90aGVyd2lzZSwgd2UgaGF2ZSB0bwpAQCAtNTAzLDggKzUwNCw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAkvKiBOb3RpZnkgaGZpMV9kZXN0cm95X3FwKCkgaWYgaXQgaXMgd2FpdGluZy4gKi8KLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKLQkJd2FrZV91cCgmcXAtPndhaXQpOworCXJ2dF9wdXRfcXAocXApOwogfQogCiBzdGF0aWMgaW50IGlvd2FpdF9zbGVlcCgKQEAgLTU0NCw3ICs1NDQsNyBAQAogCQkJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfV0FJVF9ETUFfREVTQzsKIAkJCWxpc3RfYWRkX3RhaWwoJnByaXYtPnNfaW93YWl0Lmxpc3QsICZzZGUtPmRtYXdhaXQpOwogCQkJdHJhY2VfaGZpMV9xcHNsZWVwKHFwLCBSVlRfU19XQUlUX0RNQV9ERVNDKTsKLQkJCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCQlydnRfZ2V0X3FwKHFwKTsKIAkJfQogCQl3cml0ZV9zZXF1bmxvY2soJmRldi0+aW93YWl0X2xvY2spOwogCQlxcC0+c19mbGFncyAmPSB+UlZUX1NfQlVTWTsKQEAgLTgwOCw2ICs4MDgsMTMgQEAKIAkJa2ZyZWUocHJpdik7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KKwlpb3dhaXRfaW5pdCgKKwkJJnByaXYtPnNfaW93YWl0LAorCQkxLAorCQlfaGZpMV9kb19zZW5kLAorCQlpb3dhaXRfc2xlZXAsCisJCWlvd2FpdF93YWtldXAsCisJCWlvd2FpdF9zZG1hX2RyYWluZWQpOwogCXNldHVwX3RpbWVyKCZwcml2LT5zX3Jucl90aW1lciwgaGZpMV9yY19ybnJfcmV0cnksICh1bnNpZ25lZCBsb25nKXFwKTsKIAlxcC0+c190aW1lci5mdW5jdGlvbiA9IGhmaTFfcmNfdGltZW91dDsKIAlyZXR1cm4gcHJpdjsKQEAgLTg0OCw2ICs4NTUsNyBAQAogCiB2b2lkIGZsdXNoX3FwX3dhaXRlcnMoc3RydWN0IHJ2dF9xcCAqcXApCiB7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJZmx1c2hfaW93YWl0KHFwKTsKIAloZmkxX3N0b3BfcmNfdGltZXJzKHFwKTsKIH0KQEAgLTg3MywxMyArODgxLDYgQEAKIHsKIAlzdHJ1Y3QgaGZpMV9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7CiAKLQlpb3dhaXRfaW5pdCgKLQkJJnByaXYtPnNfaW93YWl0LAotCQkxLAotCQlfaGZpMV9kb19zZW5kLAotCQlpb3dhaXRfc2xlZXAsCi0JCWlvd2FpdF93YWtldXAsCi0JCWlvd2FpdF9zZG1hX2RyYWluZWQpOwogCXByaXYtPnJfYWRlZmVyZWQgPSAwOwogCWNsZWFyX2FoZyhxcCk7CiB9CkBAIC05NjMsOCArOTY0LDcgQEAKIAlpZiAoIWxpc3RfZW1wdHkoJnByaXYtPnNfaW93YWl0Lmxpc3QpICYmICEocXAtPnNfZmxhZ3MgJiBSVlRfU19CVVNZKSkgewogCQlxcC0+c19mbGFncyAmPSB+UlZUX1NfQU5ZX1dBSVRfSU87CiAJCWxpc3RfZGVsX2luaXQoJnByaXYtPnNfaW93YWl0Lmxpc3QpOwotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKLQkJCXdha2VfdXAoJnFwLT53YWl0KTsKKwkJcnZ0X3B1dF9xcChxcCk7CiAJfQogCXdyaXRlX3NlcXVubG9jaygmZGV2LT5pb3dhaXRfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3FzZnAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3FzZnAuYwppbmRleCA0ZTk1YWQ4Li4xODY5ZjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9xc2ZwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcXNmcC5jCkBAIC0xNjEsNyArMTYxLDcgQEAKIAlidXMtPmFsZ28uZ2V0c2RhID0gaGZpMV9nZXRzZGE7CiAJYnVzLT5hbGdvLmdldHNjbCA9IGhmaTFfZ2V0c2NsOwogCWJ1cy0+YWxnby51ZGVsYXkgPSA1OwotCWJ1cy0+YWxnby50aW1lb3V0ID0gdXNlY3NfdG9famlmZmllcyg1MCk7CisJYnVzLT5hbGdvLnRpbWVvdXQgPSB1c2Vjc190b19qaWZmaWVzKDEwMDAwMCk7CiAJYnVzLT5hbGdvLmRhdGEgPSBidXM7CiAKIAlidXMtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3JjLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9yYy5jCmluZGV4IDVkYTE5MGUuLjhiYzUwMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3JjLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcmMuYwpAQCAtNTUsNyArNTUsNyBAQAogI2luY2x1ZGUgInRyYWNlLmgiCiAKIC8qIGN1dCBkb3duIHJpZGljdWxvdXNseSBsb25nIElCIG1hY3JvIG5hbWVzICovCi0jZGVmaW5lIE9QKHgpIElCX09QQ09ERV9SQ18jI3gKKyNkZWZpbmUgT1AoeCkgUkNfT1AoeCkKIAogLyoqCiAgKiBoZmkxX2FkZF9yZXRyeV90aW1lciAtIGFkZC9zdGFydCBhIHJldHJ5IHRpbWVyCkBAIC02OCw2ICs2OCw3IEBACiAJc3RydWN0IGliX3FwICppYnFwID0gJnFwLT5pYnFwOwogCXN0cnVjdCBydnRfZGV2X2luZm8gKnJkaSA9IGliX3RvX3J2dChpYnFwLT5kZXZpY2UpOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfVElNRVI7CiAJLyogNC4wOTYgdXNlYy4gKiAoMSA8PCBxcC0+dGltZW91dCkgKi8KIAlxcC0+c190aW1lci5leHBpcmVzID0gamlmZmllcyArIHFwLT50aW1lb3V0X2ppZmZpZXMgKwpAQCAtODYsNiArODcsNyBAQAogewogCXN0cnVjdCBoZmkxX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOwogCXFwLT5zX2ZsYWdzIHw9IFJWVF9TX1dBSVRfUk5SOwogCXFwLT5zX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgdXNlY3NfdG9famlmZmllcyh0byk7CiAJYWRkX3RpbWVyKCZwcml2LT5zX3Jucl90aW1lcik7CkBAIC0xMDMsNiArMTA1LDcgQEAKIAlzdHJ1Y3QgaWJfcXAgKmlicXAgPSAmcXAtPmlicXA7CiAJc3RydWN0IHJ2dF9kZXZfaW5mbyAqcmRpID0gaWJfdG9fcnZ0KGlicXAtPmRldmljZSk7CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlxcC0+c19mbGFncyB8PSBSVlRfU19USU1FUjsKIAkvKiA0LjA5NiB1c2VjLiAqICgxIDw8IHFwLT50aW1lb3V0KSAqLwogCW1vZF90aW1lcigmcXAtPnNfdGltZXIsIGppZmZpZXMgKyBxcC0+dGltZW91dF9qaWZmaWVzICsKQEAgLTEyMCw2ICsxMjMsNyBAQAogewogCWludCBydmFsID0gMDsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOwogCS8qIFJlbW92ZSBRUCBmcm9tIHJldHJ5ICovCiAJaWYgKHFwLT5zX2ZsYWdzICYgUlZUX1NfVElNRVIpIHsKIAkJcXAtPnNfZmxhZ3MgJj0gflJWVF9TX1RJTUVSOwpAQCAtMTM4LDYgKzE0Miw3IEBACiB7CiAJc3RydWN0IGhmaTFfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyogUmVtb3ZlIFFQIGZyb20gYWxsIHRpbWVycyAqLwogCWlmIChxcC0+c19mbGFncyAmIChSVlRfU19USU1FUiB8IFJWVF9TX1dBSVRfUk5SKSkgewogCQlxcC0+c19mbGFncyAmPSB+KFJWVF9TX1RJTUVSIHwgUlZUX1NfV0FJVF9STlIpOwpAQCAtMTU4LDYgKzE2Myw3IEBACiAJaW50IHJ2YWwgPSAwOwogCXN0cnVjdCBoZmkxX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOwogCS8qIFJlbW92ZSBRUCBmcm9tIHJuciB0aW1lciAqLwogCWlmIChxcC0+c19mbGFncyAmIFJWVF9TX1dBSVRfUk5SKSB7CiAJCXFwLT5zX2ZsYWdzICY9IH5SVlRfU19XQUlUX1JOUjsKQEAgLTE3OCwxOCArMTg0LDYgQEAKIAlkZWxfdGltZXJfc3luYygmcHJpdi0+c19ybnJfdGltZXIpOwogfQogCi0vKiBvbmx5IG9wY29kZSBtYXNrIGZvciBhZGFwdGl2ZSBwaW8gKi8KLWNvbnN0IHUzMiByY19vbmx5X29wY29kZSA9Ci0JQklUKE9QKFNFTkRfT05MWSkgJiAweDFmKSB8Ci0JQklUKE9QKFNFTkRfT05MWV9XSVRIX0lNTUVESUFURSAmIDB4MWYpKSB8Ci0JQklUKE9QKFJETUFfV1JJVEVfT05MWSAmIDB4MWYpKSB8Ci0JQklUKE9QKFJETUFfV1JJVEVfT05MWV9XSVRIX0lNTUVESUFURSAmIDB4MWYpKSB8Ci0JQklUKE9QKFJETUFfUkVBRF9SRVFVRVNUICYgMHgxZikpIHwKLQlCSVQoT1AoQUNLTk9XTEVER0UgJiAweDFmKSkgfAotCUJJVChPUChBVE9NSUNfQUNLTk9XTEVER0UgJiAweDFmKSkgfAotCUJJVChPUChDT01QQVJFX1NXQVAgJiAweDFmKSkgfAotCUJJVChPUChGRVRDSF9BREQgJiAweDFmKSk7Ci0KIHN0YXRpYyB1MzIgcmVzdGFydF9zZ2Uoc3RydWN0IHJ2dF9zZ2Vfc3RhdGUgKnNzLCBzdHJ1Y3QgcnZ0X3N3cWUgKndxZSwKIAkJICAgICAgIHUzMiBwc24sIHUzMiBwbXR1KQogewpAQCAtMjE2LDcgKzIxMCw3IEBACiAgKiBOb3RlIHRoZSBRUCBzX2xvY2sgbXVzdCBiZSBoZWxkLgogICovCiBzdGF0aWMgaW50IG1ha2VfcmNfYWNrKHN0cnVjdCBoZmkxX2liZGV2ICpkZXYsIHN0cnVjdCBydnRfcXAgKnFwLAotCQkgICAgICAgc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciwKKwkJICAgICAgIHN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAogCQkgICAgICAgc3RydWN0IGhmaTFfcGt0X3N0YXRlICpwcykKIHsKIAlzdHJ1Y3QgcnZ0X2Fja19lbnRyeSAqZTsKQEAgLTIyOCw2ICsyMjIsNyBAQAogCXUzMiBwbXR1ID0gcXAtPnBtdHU7CiAJc3RydWN0IGhmaTFfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyogRG9uJ3Qgc2VuZCBhbiBBQ0sgaWYgd2UgYXJlbid0IHN1cHBvc2VkIHRvLiAqLwogCWlmICghKGliX3J2dF9zdGF0ZV9vcHNbcXAtPnN0YXRlXSAmIFJWVF9QUk9DRVNTX1JFQ1ZfT0spKQogCQlnb3RvIGJhaWw7CkBAIC0yOTksMTAgKzI5NCw3IEBACiAJCQlsZW4gPSAwOwogCQkJcXAtPnNfYWNrX3N0YXRlID0gT1AoQVRPTUlDX0FDS05PV0xFREdFKTsKIAkJCW9oZHItPnUuYXQuYWV0aCA9IGhmaTFfY29tcHV0ZV9hZXRoKHFwKTsKLQkJCW9oZHItPnUuYXQuYXRvbWljX2Fja19ldGhbMF0gPQotCQkJCWNwdV90b19iZTMyKGUtPmF0b21pY19kYXRhID4+IDMyKTsKLQkJCW9oZHItPnUuYXQuYXRvbWljX2Fja19ldGhbMV0gPQotCQkJCWNwdV90b19iZTMyKGUtPmF0b21pY19kYXRhKTsKKwkJCWliX3U2NF9wdXQoZS0+YXRvbWljX2RhdGEsICZvaGRyLT51LmF0LmF0b21pY19hY2tfZXRoKTsKIAkJCWh3b3JkcyArPSBzaXplb2Yob2hkci0+dS5hdCkgLyBzaXplb2YodTMyKTsKIAkJCWJ0aDIgPSBtYXNrX3BzbihlLT5wc24pOwogCQkJZS0+c2VudCA9IDE7CkBAIC0zOTAsNyArMzgyLDcgQEAKIHsKIAlzdHJ1Y3QgaGZpMV9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7CiAJc3RydWN0IGhmaTFfaWJkZXYgKmRldiA9IHRvX2lkZXYocXAtPmlicXAuZGV2aWNlKTsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBydnRfc2dlX3N0YXRlICpzczsKIAlzdHJ1Y3QgcnZ0X3N3cWUgKndxZTsKIAkvKiBoZWFkZXIgc2l6ZSBpbiAzMi1iaXQgd29yZHMgTFJIK0JUSCA9ICg4KzEyKS80LiAqLwpAQCAtNDAzLDYgKzM5NSw3IEBACiAJaW50IG1pZGRsZSA9IDA7CiAJaW50IGRlbHRhOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJcHMtPnNfdHhyZXEgPSBnZXRfdHhyZXEocHMtPmRldiwgcXApOwogCWlmIChJU19FUlIocHMtPnNfdHhyZXEpKQogCQlnb3RvIGJhaWxfbm9fdHg7CkBAIC01NjYsOCArNTU5LDkgQEAKIAkJCQlxcC0+c19mbGFncyB8PSBSVlRfU19XQUlUX1NTTl9DUkVESVQ7CiAJCQkJZ290byBiYWlsOwogCQkJfQotCQkJb2hkci0+dS5yYy5yZXRoLnZhZGRyID0KLQkJCQljcHVfdG9fYmU2NCh3cWUtPnJkbWFfd3IucmVtb3RlX2FkZHIpOworCQkJcHV0X2liX3JldGhfdmFkZHIoCisJCQkJd3FlLT5yZG1hX3dyLnJlbW90ZV9hZGRyLAorCQkJCSZvaGRyLT51LnJjLnJldGgpOwogCQkJb2hkci0+dS5yYy5yZXRoLnJrZXkgPQogCQkJCWNwdV90b19iZTMyKHdxZS0+cmRtYV93ci5ya2V5KTsKIAkJCW9oZHItPnUucmMucmV0aC5sZW5ndGggPSBjcHVfdG9fYmUzMihsZW4pOwpAQCAtNjA4LDggKzYwMiw5IEBACiAJCQkJaWYgKCEocXAtPnNfZmxhZ3MgJiBSVlRfU19VTkxJTUlURURfQ1JFRElUKSkKIAkJCQkJcXAtPnNfbHNuKys7CiAJCQl9Ci0JCQlvaGRyLT51LnJjLnJldGgudmFkZHIgPQotCQkJCWNwdV90b19iZTY0KHdxZS0+cmRtYV93ci5yZW1vdGVfYWRkcik7CisJCQlwdXRfaWJfcmV0aF92YWRkcigKKwkJCQl3cWUtPnJkbWFfd3IucmVtb3RlX2FkZHIsCisJCQkJJm9oZHItPnUucmMucmV0aCk7CiAJCQlvaGRyLT51LnJjLnJldGgucmtleSA9CiAJCQkJY3B1X3RvX2JlMzIod3FlLT5yZG1hX3dyLnJrZXkpOwogCQkJb2hkci0+dS5yYy5yZXRoLmxlbmd0aCA9IGNwdV90b19iZTMyKGxlbik7CkBAIC02NDAsMjAgKzYzNSwxOCBAQAogCQkJfQogCQkJaWYgKHdxZS0+d3Iub3Bjb2RlID09IElCX1dSX0FUT01JQ19DTVBfQU5EX1NXUCkgewogCQkJCXFwLT5zX3N0YXRlID0gT1AoQ09NUEFSRV9TV0FQKTsKLQkJCQlvaGRyLT51LmF0b21pY19ldGguc3dhcF9kYXRhID0gY3B1X3RvX2JlNjQoCi0JCQkJCXdxZS0+YXRvbWljX3dyLnN3YXApOwotCQkJCW9oZHItPnUuYXRvbWljX2V0aC5jb21wYXJlX2RhdGEgPSBjcHVfdG9fYmU2NCgKLQkJCQkJd3FlLT5hdG9taWNfd3IuY29tcGFyZV9hZGQpOworCQkJCXB1dF9pYl9hdGV0aF9zd2FwKHdxZS0+YXRvbWljX3dyLnN3YXAsCisJCQkJCQkgICZvaGRyLT51LmF0b21pY19ldGgpOworCQkJCXB1dF9pYl9hdGV0aF9jb21wYXJlKHdxZS0+YXRvbWljX3dyLmNvbXBhcmVfYWRkLAorCQkJCQkJICAgICAmb2hkci0+dS5hdG9taWNfZXRoKTsKIAkJCX0gZWxzZSB7CiAJCQkJcXAtPnNfc3RhdGUgPSBPUChGRVRDSF9BREQpOwotCQkJCW9oZHItPnUuYXRvbWljX2V0aC5zd2FwX2RhdGEgPSBjcHVfdG9fYmU2NCgKLQkJCQkJd3FlLT5hdG9taWNfd3IuY29tcGFyZV9hZGQpOwotCQkJCW9oZHItPnUuYXRvbWljX2V0aC5jb21wYXJlX2RhdGEgPSAwOworCQkJCXB1dF9pYl9hdGV0aF9zd2FwKHdxZS0+YXRvbWljX3dyLmNvbXBhcmVfYWRkLAorCQkJCQkJICAmb2hkci0+dS5hdG9taWNfZXRoKTsKKwkJCQlwdXRfaWJfYXRldGhfY29tcGFyZSgwLCAmb2hkci0+dS5hdG9taWNfZXRoKTsKIAkJCX0KLQkJCW9oZHItPnUuYXRvbWljX2V0aC52YWRkclswXSA9IGNwdV90b19iZTMyKAotCQkJCXdxZS0+YXRvbWljX3dyLnJlbW90ZV9hZGRyID4+IDMyKTsKLQkJCW9oZHItPnUuYXRvbWljX2V0aC52YWRkclsxXSA9IGNwdV90b19iZTMyKAotCQkJCXdxZS0+YXRvbWljX3dyLnJlbW90ZV9hZGRyKTsKKwkJCXB1dF9pYl9hdGV0aF92YWRkcih3cWUtPmF0b21pY193ci5yZW1vdGVfYWRkciwKKwkJCQkJICAgJm9oZHItPnUuYXRvbWljX2V0aCk7CiAJCQlvaGRyLT51LmF0b21pY19ldGgucmtleSA9IGNwdV90b19iZTMyKAogCQkJCXdxZS0+YXRvbWljX3dyLnJrZXkpOwogCQkJaHdvcmRzICs9IHNpemVvZihzdHJ1Y3QgaWJfYXRvbWljX2V0aCkgLyBzaXplb2YodTMyKTsKQEAgLTc3OSw4ICs3NzIsOSBAQAogCQkgKiBTZWUgcmVzdGFydF9yYygpLgogCQkgKi8KIAkJbGVuID0gKGRlbHRhX3BzbihxcC0+c19wc24sIHdxZS0+cHNuKSkgKiBwbXR1OwotCQlvaGRyLT51LnJjLnJldGgudmFkZHIgPQotCQkJY3B1X3RvX2JlNjQod3FlLT5yZG1hX3dyLnJlbW90ZV9hZGRyICsgbGVuKTsKKwkJcHV0X2liX3JldGhfdmFkZHIoCisJCQl3cWUtPnJkbWFfd3IucmVtb3RlX2FkZHIgKyBsZW4sCisJCQkmb2hkci0+dS5yYy5yZXRoKTsKIAkJb2hkci0+dS5yYy5yZXRoLnJrZXkgPQogCQkJY3B1X3RvX2JlMzIod3FlLT5yZG1hX3dyLnJrZXkpOwogCQlvaGRyLT51LnJjLnJldGgubGVuZ3RoID0gY3B1X3RvX2JlMzIod3FlLT5sZW5ndGggLSBsZW4pOwpAQCAtODQxLDcgKzgzNSw3IEBACiAgKgogICogVGhpcyBpcyBjYWxsZWQgZnJvbSBoZmkxX3JjX3JjdigpIGFuZCBoYW5kbGVfcmVjZWl2ZV9pbnRlcnJ1cHQoKS4KICAqIE5vdGUgdGhhdCBSRE1BIHJlYWRzIGFuZCBhdG9taWNzIGFyZSBoYW5kbGVkIGluIHRoZQotICogc2VuZCBzaWRlIFFQIHN0YXRlIGFuZCB0YXNrbGV0LgorICogc2VuZCBzaWRlIFFQIHN0YXRlIGFuZCBzZW5kIGVuZ2luZS4KICAqLwogdm9pZCBoZmkxX3NlbmRfcmNfYWNrKHN0cnVjdCBoZmkxX2N0eHRkYXRhICpyY2QsIHN0cnVjdCBydnRfcXAgKnFwLAogCQkgICAgICBpbnQgaXNfZmVjbikKQEAgLTg1Niw4ICs4NTAsOCBAQAogCXUzMiB2bCwgcGxlbjsKIAlzdHJ1Y3Qgc2VuZF9jb250ZXh0ICpzYzsKIAlzdHJ1Y3QgcGlvX2J1ZiAqcGJ1ZjsKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgaGRyOwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX2hlYWRlciBoZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIERvbid0IHNlbmQgQUNLIG9yIE5BSyBpZiBhIFJETUEgcmVhZCBvciBhdG9taWMgaXMgcGVuZGluZy4gKi8KQEAgLTkxNyw3ICs5MTEsNyBAQAogCWlmICghcGJ1ZikgewogCQkvKgogCQkgKiBXZSBoYXZlIG5vIHJvb20gdG8gc2VuZCBhdCB0aGUgbW9tZW50LiAgUGFzcwotCQkgKiByZXNwb25zaWJpbGl0eSBmb3Igc2VuZGluZyB0aGUgQUNLIHRvIHRoZSBzZW5kIHRhc2tsZXQKKwkJICogcmVzcG9uc2liaWxpdHkgZm9yIHNlbmRpbmcgdGhlIEFDSyB0byB0aGUgc2VuZCBlbmdpbmUKIAkJICogc28gdGhhdCB3aGVuIGVub3VnaCBidWZmZXIgc3BhY2UgYmVjb21lcyBhdmFpbGFibGUsCiAJCSAqIHRoZSBBQ0sgaXMgc2VudCBhaGVhZCBvZiBvdGhlciBvdXRnb2luZyBwYWNrZXRzLgogCQkgKi8KQEAgLTkzMiwxNiArOTI2LDE5IEBACiAJcmV0dXJuOwogCiBxdWV1ZV9hY2s6Ci0JdGhpc19jcHVfaW5jKCppYnAtPnJ2cC5yY19xYWNrcyk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKKwlpZiAoIShpYl9ydnRfc3RhdGVfb3BzW3FwLT5zdGF0ZV0gJiBSVlRfUFJPQ0VTU19SRUNWX09LKSkKKwkJZ290byB1bmxvY2s7CisJdGhpc19jcHVfaW5jKCppYnAtPnJ2cC5yY19xYWNrcyk7CiAJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfQUNLX1BFTkRJTkcgfCBSVlRfU19SRVNQX1BFTkRJTkc7CiAJcXAtPnNfbmFrX3N0YXRlID0gcXAtPnJfbmFrX3N0YXRlOwogCXFwLT5zX2Fja19wc24gPSBxcC0+cl9hY2tfcHNuOwogCWlmIChpc19mZWNuKQogCQlxcC0+c19mbGFncyB8PSBSVlRfU19FQ047CiAKLQkvKiBTY2hlZHVsZSB0aGUgc2VuZCB0YXNrbGV0LiAqLworCS8qIFNjaGVkdWxlIHRoZSBzZW5kIGVuZ2luZS4gKi8KIAloZmkxX3NjaGVkdWxlX3NlbmQocXApOwordW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtOTYwLDYgKzk1Nyw3IEBACiAJc3RydWN0IHJ2dF9zd3FlICp3cWUgPSBydnRfZ2V0X3N3cWVfcHRyKHFwLCBuKTsKIAl1MzIgb3Bjb2RlOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJcXAtPnNfY3VyID0gbjsKIAogCS8qCkBAIC0xMDI3LDcgKzEwMjUsNyBAQAogCXFwLT5zX3BzbiA9IHBzbjsKIAkvKgogCSAqIFNldCBSVlRfU19XQUlUX1BTTiBhcyByY19jb21wbGV0ZSgpIG1heSBzdGFydCB0aGUgdGltZXIKLQkgKiBhc3luY2hyb25vdXNseSBiZWZvcmUgdGhlIHNlbmQgdGFza2xldCBjYW4gZ2V0IHNjaGVkdWxlZC4KKwkgKiBhc3luY2hyb25vdXNseSBiZWZvcmUgdGhlIHNlbmQgZW5naW5lIGNhbiBnZXQgc2NoZWR1bGVkLgogCSAqIERvaW5nIGl0IGluIGhmaTFfbWFrZV9yY19yZXEoKSBpcyB0b28gbGF0ZS4KIAkgKi8KIAlpZiAoKGNtcF9wc24ocXAtPnNfcHNuLCBxcC0+c19zZW5kaW5nX2hwc24pIDw9IDApICYmCkBAIC0xMDQ1LDYgKzEwNDMsOCBAQAogCXN0cnVjdCBydnRfc3dxZSAqd3FlID0gcnZ0X2dldF9zd3FlX3B0cihxcCwgcXAtPnNfYWNrZWQpOwogCXN0cnVjdCBoZmkxX2licG9ydCAqaWJwOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnJfbG9jayk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJaWYgKHFwLT5zX3JldHJ5ID09IDApIHsKIAkJaWYgKHFwLT5zX21pZ19zdGF0ZSA9PSBJQl9NSUdfQVJNRUQpIHsKIAkJCWhmaTFfbWlncmF0ZV9xcChxcCk7CkBAIC0xMTIxLDYgKzExMjEsNyBAQAogCXN0cnVjdCBydnRfc3dxZSAqd3FlOwogCXUzMiBuID0gcXAtPnNfbGFzdDsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOwogCS8qIEZpbmQgdGhlIHdvcmsgcmVxdWVzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBQU04uICovCiAJZm9yICg7OykgewogCQl3cWUgPSBydnRfZ2V0X3N3cWVfcHRyKHFwLCBuKTsKQEAgLTExNDEsMTUgKzExNDIsMTYgQEAKIC8qCiAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgUVAgc19sb2NrIGhlbGQgYW5kIGludGVycnVwdHMgZGlzYWJsZWQuCiAgKi8KLXZvaWQgaGZpMV9yY19zZW5kX2NvbXBsZXRlKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkcikKK3ZvaWQgaGZpMV9yY19zZW5kX2NvbXBsZXRlKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpCiB7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAlzdHJ1Y3QgcnZ0X3N3cWUgKndxZTsKIAlzdHJ1Y3QgaWJfd2Mgd2M7CiAJdW5zaWduZWQgaTsKIAl1MzIgb3Bjb2RlOwogCXUzMiBwc247CiAKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKIAlpZiAoIShpYl9ydnRfc3RhdGVfb3BzW3FwLT5zdGF0ZV0gJiBSVlRfUFJPQ0VTU19PUl9GTFVTSF9TRU5EKSkKIAkJcmV0dXJuOwogCkBAIC0xMjQxLDYgKzEyNDMsNyBAQAogCXN0cnVjdCBpYl93YyB3YzsKIAl1bnNpZ25lZCBpOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyoKIAkgKiBEb24ndCBkZWNyZW1lbnQgcmVmY291bnQgYW5kIGRvbid0IGdlbmVyYXRlIGEKIAkgKiBjb21wbGV0aW9uIGlmIHRoZSBTV1FFIGlzIGJlaW5nIHJlc2VudCB1bnRpbCB0aGUgc2VuZApAQCAtMTM0MCw2ICsxMzQzLDcgQEAKIAlpbnQgZGlmZjsKIAl1bnNpZ25lZCBsb25nIHRvOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CiAJLyoKIAkgKiBOb3RlIHRoYXQgTkFLcyBpbXBsaWNpdGx5IEFDSyBvdXRzdGFuZGluZyBTRU5EIGFuZCBSRE1BIHdyaXRlCiAJICogcmVxdWVzdHMgYW5kIGltcGxpY2l0bHkgTkFLIFJETUEgcmVhZCBhbmQgYXRvbWljIHJlcXVlc3RzIGlzc3VlZApAQCAtMTM4OSw3ICsxMzkzLDcgQEAKIAkJCQlyZXN0YXJ0X3JjKHFwLCBxcC0+c19sYXN0X3BzbiArIDEsIDApOwogCQkJCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJCQkJcXAtPnJfZmxhZ3MgfD0gUlZUX1JfUlNQX1NFTkQ7Ci0JCQkJCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCQkJCXJ2dF9nZXRfcXAocXApOwogCQkJCQlsaXN0X2FkZF90YWlsKCZxcC0+cnNwd2FpdCwKIAkJCQkJCSAgICAgICZyY2QtPnFwX3dhaXRfbGlzdCk7CiAJCQkJfQpAQCAtMTU1NSw2ICsxNTU5LDcgQEAKIHsKIAlzdHJ1Y3QgcnZ0X3N3cWUgKndxZTsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOwogCS8qIFJlbW92ZSBRUCBmcm9tIHJldHJ5IHRpbWVyICovCiAJaGZpMV9zdG9wX3JjX3RpbWVycyhxcCk7CiAKQEAgLTE1NzMsNyArMTU3OCw3IEBACiAJcmVzdGFydF9yYyhxcCwgcXAtPnNfbGFzdF9wc24gKyAxLCAwKTsKIAlpZiAobGlzdF9lbXB0eSgmcXAtPnJzcHdhaXQpKSB7CiAJCXFwLT5yX2ZsYWdzIHw9IFJWVF9SX1JTUF9TRU5EOwotCQlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworCQlydnRfZ2V0X3FwKHFwKTsKIAkJbGlzdF9hZGRfdGFpbCgmcXAtPnJzcHdhaXQsICZyY2QtPnFwX3dhaXRfbGlzdCk7CiAJfQogfQpAQCAtMTU5NSw3ICsxNjAwLDcgQEAKICAqIENhbGxlZCBhdCBpbnRlcnJ1cHQgbGV2ZWwuCiAgKi8KIHN0YXRpYyB2b2lkIHJjX3Jjdl9yZXNwKHN0cnVjdCBoZmkxX2licG9ydCAqaWJwLAotCQkJc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciwKKwkJCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAogCQkJdm9pZCAqZGF0YSwgdTMyIHRsZW4sIHN0cnVjdCBydnRfcXAgKnFwLAogCQkJdTMyIG9wY29kZSwgdTMyIHBzbiwgdTMyIGhkcnNpemUsIHUzMiBwbXR1LAogCQkJc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZCkKQEAgLTE2NDksMTQgKzE2NTQsMTAgQEAKIAljYXNlIE9QKEFUT01JQ19BQ0tOT1dMRURHRSk6CiAJY2FzZSBPUChSRE1BX1JFQURfUkVTUE9OU0VfRklSU1QpOgogCQlhZXRoID0gYmUzMl90b19jcHUob2hkci0+dS5hZXRoKTsKLQkJaWYgKG9wY29kZSA9PSBPUChBVE9NSUNfQUNLTk9XTEVER0UpKSB7Ci0JCQlfX2JlMzIgKnAgPSBvaGRyLT51LmF0LmF0b21pY19hY2tfZXRoOwotCi0JCQl2YWwgPSAoKHU2NCliZTMyX3RvX2NwdShwWzBdKSA8PCAzMikgfAotCQkJCWJlMzJfdG9fY3B1KHBbMV0pOwotCQl9IGVsc2UgeworCQlpZiAob3Bjb2RlID09IE9QKEFUT01JQ19BQ0tOT1dMRURHRSkpCisJCQl2YWwgPSBpYl91NjRfZ2V0KCZvaGRyLT51LmF0LmF0b21pY19hY2tfZXRoKTsKKwkJZWxzZQogCQkJdmFsID0gMDsKLQkJfQogCQlpZiAoIWRvX3JjX2FjayhxcCwgYWV0aCwgcHNuLCBvcGNvZGUsIHZhbCwgcmNkKSB8fAogCQkgICAgb3Bjb2RlICE9IE9QKFJETUFfUkVBRF9SRVNQT05TRV9GSVJTVCkpCiAJCQlnb3RvIGFja19kb25lOwpAQCAtMTc4Miw3ICsxNzgzLDcgQEAKIHsKIAlpZiAobGlzdF9lbXB0eSgmcXAtPnJzcHdhaXQpKSB7CiAJCXFwLT5yX2ZsYWdzIHw9IFJWVF9SX1JTUF9OQUs7Ci0JCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCXJ2dF9nZXRfcXAocXApOwogCQlsaXN0X2FkZF90YWlsKCZxcC0+cnNwd2FpdCwgJnJjZC0+cXBfd2FpdF9saXN0KTsKIAl9CiB9CkBAIC0xNzk2LDggKzE3OTcsNyBAQAogCQlyZXR1cm47CiAJbGlzdF9kZWxfaW5pdCgmcXAtPnJzcHdhaXQpOwogCXFwLT5yX2ZsYWdzICY9IH5SVlRfUl9SU1BfTkFLOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZxcC0+cmVmY291bnQpKQotCQl3YWtlX3VwKCZxcC0+d2FpdCk7CisJcnZ0X3B1dF9xcChxcCk7CiB9CiAKIC8qKgpAQCAtMTgxNSw3ICsxODE1LDcgQEAKICAqIFJldHVybiAxIGlmIG5vIG1vcmUgcHJvY2Vzc2luZyBpcyBuZWVkZWQ7IG90aGVyd2lzZSByZXR1cm4gMCB0bwogICogc2NoZWR1bGUgYSByZXNwb25zZSB0byBiZSBzZW50LgogICovCi1zdGF0aWMgbm9pbmxpbmUgaW50IHJjX3Jjdl9lcnJvcihzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyLCB2b2lkICpkYXRhLAorc3RhdGljIG5vaW5saW5lIGludCByY19yY3ZfZXJyb3Ioc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIsIHZvaWQgKmRhdGEsCiAJCQkJIHN0cnVjdCBydnRfcXAgKnFwLCB1MzIgb3Bjb2RlLCB1MzIgcHNuLAogCQkJCSBpbnQgZGlmZiwgc3RydWN0IGhmaTFfY3R4dGRhdGEgKnJjZCkKIHsKQEAgLTE5MjMsNyArMTkyMyw3IEBACiAJCX0KIAkJaWYgKGxlbiAhPSAwKSB7CiAJCQl1MzIgcmtleSA9IGJlMzJfdG9fY3B1KHJldGgtPnJrZXkpOwotCQkJdTY0IHZhZGRyID0gYmU2NF90b19jcHUocmV0aC0+dmFkZHIpOworCQkJdTY0IHZhZGRyID0gZ2V0X2liX3JldGhfdmFkZHIocmV0aCk7CiAJCQlpbnQgb2s7CiAKIAkJCW9rID0gcnZ0X3JrZXlfb2socXAsICZlLT5yZG1hX3NnZSwgbGVuLCB2YWRkciwgcmtleSwKQEAgLTE5NDYsNyArMTk0Niw3IEBACiAJY2FzZSBPUChGRVRDSF9BREQpOiB7CiAJCS8qCiAJCSAqIElmIHdlIGRpZG4ndCBmaW5kIHRoZSBhdG9taWMgcmVxdWVzdCBpbiB0aGUgYWNrIHF1ZXVlCi0JCSAqIG9yIHRoZSBzZW5kIHRhc2tsZXQgaXMgYWxyZWFkeSBiYWNrZWQgdXAgdG8gc2VuZCBhbgorCQkgKiBvciB0aGUgc2VuZCBlbmdpbmUgaXMgYWxyZWFkeSBiYWNrZWQgdXAgdG8gc2VuZCBhbgogCQkgKiBlYXJsaWVyIGVudHJ5LCB3ZSBjYW4gaWdub3JlIHRoaXMgcmVxdWVzdC4KIAkJICovCiAJCWlmICghZSB8fCBlLT5vcGNvZGUgIT0gKHU4KW9wY29kZSB8fCBvbGRfcmVxKQpAQCAtMjEyMywxMyArMjEyMywxMyBAQAogdm9pZCBoZmkxX3JjX3JjdihzdHJ1Y3QgaGZpMV9wYWNrZXQgKnBhY2tldCkKIHsKIAlzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqcmNkID0gcGFja2V0LT5yY2Q7Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKIAl1MzIgcmN2X2ZsYWdzID0gcGFja2V0LT5yY3ZfZmxhZ3M7CiAJdm9pZCAqZGF0YSA9IHBhY2tldC0+ZWJ1ZjsKIAl1MzIgdGxlbiA9IHBhY2tldC0+dGxlbjsKIAlzdHJ1Y3QgcnZ0X3FwICpxcCA9IHBhY2tldC0+cXA7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnAgPSB0b19pcG9ydChxcC0+aWJxcC5kZXZpY2UsIHFwLT5wb3J0X251bSk7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBhY2tldC0+b2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IHBhY2tldC0+b2hkcjsKIAl1MzIgYnRoMCwgb3Bjb2RlOwogCXUzMiBoZHJzaXplID0gcGFja2V0LT5obGVuOwogCXUzMiBwc247CkBAIC0yMTQzLDYgKzIxNDMsNyBAQAogCWludCBjb3B5X2xhc3QgPSAwOwogCXUzMiBya2V5OwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnJfbG9jayk7CiAJYnRoMCA9IGJlMzJfdG9fY3B1KG9oZHItPmJ0aFswXSk7CiAJaWYgKGhmaTFfcnVjX2NoZWNrX2hkcihpYnAsIGhkciwgcmN2X2ZsYWdzICYgSEZJMV9IQVNfR1JILCBxcCwgYnRoMCkpCiAJCXJldHVybjsKQEAgLTIzNDIsNyArMjM0Myw3IEBACiAJCXFwLT5yX3NnZS5zZ19saXN0ID0gTlVMTDsKIAkJaWYgKHFwLT5yX2xlbiAhPSAwKSB7CiAJCQl1MzIgcmtleSA9IGJlMzJfdG9fY3B1KHJldGgtPnJrZXkpOwotCQkJdTY0IHZhZGRyID0gYmU2NF90b19jcHUocmV0aC0+dmFkZHIpOworCQkJdTY0IHZhZGRyID0gZ2V0X2liX3JldGhfdmFkZHIocmV0aCk7CiAJCQlpbnQgb2s7CiAKIAkJCS8qIENoZWNrIHJrZXkgJiBOQUsgKi8KQEAgLTIzOTcsNyArMjM5OCw3IEBACiAJCWxlbiA9IGJlMzJfdG9fY3B1KHJldGgtPmxlbmd0aCk7CiAJCWlmIChsZW4pIHsKIAkJCXUzMiBya2V5ID0gYmUzMl90b19jcHUocmV0aC0+cmtleSk7Ci0JCQl1NjQgdmFkZHIgPSBiZTY0X3RvX2NwdShyZXRoLT52YWRkcik7CisJCQl1NjQgdmFkZHIgPSBnZXRfaWJfcmV0aF92YWRkcihyZXRoKTsKIAkJCWludCBvazsKIAogCQkJLyogQ2hlY2sgcmtleSAmIE5BSyAqLwpAQCAtMjQzMiw3ICsyNDMzLDcgQEAKIAkJcXAtPnJfbmFrX3N0YXRlID0gMDsKIAkJcXAtPnJfaGVhZF9hY2tfcXVldWUgPSBuZXh0OwogCi0JCS8qIFNjaGVkdWxlIHRoZSBzZW5kIHRhc2tsZXQuICovCisJCS8qIFNjaGVkdWxlIHRoZSBzZW5kIGVuZ2luZS4gKi8KIAkJcXAtPnNfZmxhZ3MgfD0gUlZUX1NfUkVTUF9QRU5ESU5HOwogCQloZmkxX3NjaGVkdWxlX3NlbmQocXApOwogCkBAIC0yNDY5LDggKzI0NzAsNyBAQAogCQkJZS0+cmRtYV9zZ2UubXIgPSBOVUxMOwogCQl9CiAJCWF0ZXRoID0gJm9oZHItPnUuYXRvbWljX2V0aDsKLQkJdmFkZHIgPSAoKHU2NCliZTMyX3RvX2NwdShhdGV0aC0+dmFkZHJbMF0pIDw8IDMyKSB8Ci0JCQliZTMyX3RvX2NwdShhdGV0aC0+dmFkZHJbMV0pOworCQl2YWRkciA9IGdldF9pYl9hdGV0aF92YWRkcihhdGV0aCk7CiAJCWlmICh1bmxpa2VseSh2YWRkciAmIChzaXplb2YodTY0KSAtIDEpKSkKIAkJCWdvdG8gbmFja19pbnZfdW5sY2s7CiAJCXJrZXkgPSBiZTMyX3RvX2NwdShhdGV0aC0+cmtleSk7CkBAIC0yNDgxLDExICsyNDgxLDExIEBACiAJCQlnb3RvIG5hY2tfYWNjX3VubGNrOwogCQkvKiBQZXJmb3JtIGF0b21pYyBPUCBhbmQgc2F2ZSByZXN1bHQuICovCiAJCW1hZGRyID0gKGF0b21pYzY0X3QgKilxcC0+cl9zZ2Uuc2dlLnZhZGRyOwotCQlzZGF0YSA9IGJlNjRfdG9fY3B1KGF0ZXRoLT5zd2FwX2RhdGEpOworCQlzZGF0YSA9IGdldF9pYl9hdGV0aF9zd2FwKGF0ZXRoKTsKIAkJZS0+YXRvbWljX2RhdGEgPSAob3Bjb2RlID09IE9QKEZFVENIX0FERCkpID8KIAkJCSh1NjQpYXRvbWljNjRfYWRkX3JldHVybihzZGF0YSwgbWFkZHIpIC0gc2RhdGEgOgogCQkJKHU2NCljbXB4Y2hnKCh1NjQgKilxcC0+cl9zZ2Uuc2dlLnZhZGRyLAotCQkJCSAgICAgIGJlNjRfdG9fY3B1KGF0ZXRoLT5jb21wYXJlX2RhdGEpLAorCQkJCSAgICAgIGdldF9pYl9hdGV0aF9jb21wYXJlKGF0ZXRoKSwKIAkJCQkgICAgICBzZGF0YSk7CiAJCXJ2dF9wdXRfbXIocXAtPnJfc2dlLnNnZS5tcik7CiAJCXFwLT5yX3NnZS5udW1fc2dlID0gMDsKQEAgLTI0OTksNyArMjQ5OSw3IEBACiAJCXFwLT5yX25ha19zdGF0ZSA9IDA7CiAJCXFwLT5yX2hlYWRfYWNrX3F1ZXVlID0gbmV4dDsKIAotCQkvKiBTY2hlZHVsZSB0aGUgc2VuZCB0YXNrbGV0LiAqLworCQkvKiBTY2hlZHVsZSB0aGUgc2VuZCBlbmdpbmUuICovCiAJCXFwLT5zX2ZsYWdzIHw9IFJWVF9TX1JFU1BfUEVORElORzsKIAkJaGZpMV9zY2hlZHVsZV9zZW5kKHFwKTsKIApAQCAtMjU3NSwxMiArMjU3NSwxMiBAQAogCiB2b2lkIGhmaTFfcmNfaGRyZXJyKAogCXN0cnVjdCBoZmkxX2N0eHRkYXRhICpyY2QsCi0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIsCisJc3RydWN0IGliX2hlYWRlciAqaGRyLAogCXUzMiByY3ZfZmxhZ3MsCiAJc3RydWN0IHJ2dF9xcCAqcXApCiB7CiAJaW50IGhhc19ncmggPSByY3ZfZmxhZ3MgJiBIRkkxX0hBU19HUkg7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAlzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCA9IHRvX2lwb3J0KHFwLT5pYnFwLmRldmljZSwgcXAtPnBvcnRfbnVtKTsKIAlpbnQgZGlmZjsKIAl1MzIgb3Bjb2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvcnVjLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9ydWMuYwppbmRleCA0OGQ1MDk0Li5hMTU3NmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9ydWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9ydWMuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAgKgogICogVGhlIHNfbG9jayB3aWxsIGJlIGFjcXVpcmVkIGFyb3VuZCB0aGUgaGZpMV9taWdyYXRlX3FwKCkgY2FsbC4KICAqLwotaW50IGhmaTFfcnVjX2NoZWNrX2hkcihzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCwgc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIsCitpbnQgaGZpMV9ydWNfY2hlY2tfaGRyKHN0cnVjdCBoZmkxX2licG9ydCAqaWJwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCSAgICAgICBpbnQgaGFzX2dyaCwgc3RydWN0IHJ2dF9xcCAqcXAsIHUzMiBidGgwKQogewogCV9fYmU2NCBndWlkOwpAQCAtMzUyLDcgKzM1Miw3IEBACiAgKgogICogVGhpcyBpcyBjYWxsZWQgZnJvbSBoZmkxX2RvX3NlbmQoKSB0bwogICogZm9yd2FyZCBhIFdRRSBhZGRyZXNzZWQgdG8gdGhlIHNhbWUgSEZJLgotICogTm90ZSB0aGF0IGFsdGhvdWdoIHdlIGFyZSBzaW5nbGUgdGhyZWFkZWQgZHVlIHRvIHRoZSB0YXNrbGV0LCB3ZSBzdGlsbAorICogTm90ZSB0aGF0IGFsdGhvdWdoIHdlIGFyZSBzaW5nbGUgdGhyZWFkZWQgZHVlIHRvIHRoZSBzZW5kIGVuZ2luZSwgd2Ugc3RpbGwKICAqIGhhdmUgdG8gcHJvdGVjdCBhZ2FpbnN0IHBvc3Rfc2VuZCgpLiAgV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dAogICogcmVjZWl2ZSBpbnRlcnJ1cHRzIHNpbmNlIHRoaXMgaXMgYSBjb25uZWN0ZWQgcHJvdG9jb2wgYW5kIGFsbCBwYWNrZXRzCiAgKiB3aWxsIHBhc3MgdGhyb3VnaCBoZXJlLgpAQCAtNzY1LDcgKzc2NSw3IEBACiAJfQogfQogCi12b2lkIGhmaTFfbWFrZV9ydWNfaGVhZGVyKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyLAordm9pZCBoZmkxX21ha2VfcnVjX2hlYWRlcihzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIsCiAJCQkgIHUzMiBidGgwLCB1MzIgYnRoMiwgaW50IG1pZGRsZSwKIAkJCSAgc3RydWN0IGhmaTFfcGt0X3N0YXRlICpwcykKIHsKQEAgLTg0Niw3ICs4NDYsNyBAQAogICogQHdvcms6IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgUVAKICAqCiAgKiBQcm9jZXNzIGVudHJpZXMgaW4gdGhlIHNlbmQgd29yayBxdWV1ZSB1bnRpbCBjcmVkaXQgb3IgcXVldWUgaXMKLSAqIGV4aGF1c3RlZC4gIE9ubHkgYWxsb3cgb25lIENQVSB0byBzZW5kIGEgcGFja2V0IHBlciBRUCAodGFza2xldCkuCisgKiBleGhhdXN0ZWQuICBPbmx5IGFsbG93IG9uZSBDUFUgdG8gc2VuZCBhIHBhY2tldCBwZXIgUVAuCiAgKiBPdGhlcndpc2UsIHR3byB0aHJlYWRzIGNvdWxkIHNlbmQgcGFja2V0cyBvdXQgb2Ygb3JkZXIuCiAgKi8KIHZvaWQgaGZpMV9kb19zZW5kKHN0cnVjdCBydnRfcXAgKnFwKQpAQCAtOTA5LDcgKzkwOSw3IEBACiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxcC0+c19sb2NrLCBwcy5mbGFncyk7CiAJCQkvKgogCQkJICogSWYgdGhlIHBhY2tldCBjYW5ub3QgYmUgc2VudCBub3csIHJldHVybiBhbmQKLQkJCSAqIHRoZSBzZW5kIHRhc2tsZXQgd2lsbCBiZSB3b2tlbiB1cCBsYXRlci4KKwkJCSAqIHRoZSBzZW5kIGVuZ2luZSB3aWxsIGJlIHdva2VuIHVwIGxhdGVyLgogCQkJICovCiAJCQlpZiAoaGZpMV92ZXJic19zZW5kKHFwLCAmcHMpKQogCQkJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3NkbWEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3NkbWEuYwppbmRleCBmOWJlZmMwLi5mZDM5YmNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9zZG1hLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc2RtYS5jCkBAIC03MjYsNiArNzI2LDM0IEBACiB9CiAKIC8qKgorICogc2RtYV9lbmdpbmVfZ2V0X3ZsKCkgLSByZXR1cm4gdmwgZm9yIGEgZ2l2ZW4gc2RtYSBlbmdpbmUKKyAqIEBzZGU6IHNkbWEgZW5naW5lCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2bCBtYXBwZWQgdG8gYSBnaXZlbiBlbmdpbmUsIG9yIGFuIGVycm9yIGlmCisgKiB0aGUgbWFwcGluZyBjYW4ndCBiZSBmb3VuZC4gVGhlIG1hcHBpbmcgZmllbGRzIGFyZSBwcm90ZWN0ZWQgYnkgUkNVLgorICovCitpbnQgc2RtYV9lbmdpbmVfZ2V0X3ZsKHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlKQoreworCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkID0gc2RlLT5kZDsKKwlzdHJ1Y3Qgc2RtYV92bF9tYXAgKm07CisJdTggdmw7CisKKwlpZiAoc2RlLT50aGlzX2lkeCA+PSBUWEVfTlVNX1NETUFfRU5HSU5FUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbSA9IHJjdV9kZXJlZmVyZW5jZShkZC0+c2RtYV9tYXApOworCWlmICh1bmxpa2VseSghbSkpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl2bCA9IG0tPmVuZ2luZV90b192bFtzZGUtPnRoaXNfaWR4XTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiB2bDsKK30KKworLyoqCiAgKiBzZG1hX3NlbGVjdF9lbmdpbmVfdmwoKSAtIHNlbGVjdCBzZG1hIGVuZ2luZQogICogQGRkOiBkZXZkYXRhCiAgKiBAc2VsZWN0b3I6IGEgc3ByZWFkaW5nIGZhY3RvcgpAQCAtNzg4LDYgKzgxNiwzMjYgQEAKIAlyZXR1cm4gc2RtYV9zZWxlY3RfZW5naW5lX3ZsKGRkLCBzZWxlY3RvciwgdmwpOwogfQogCitzdHJ1Y3Qgc2RtYV9yaHRfbWFwX2VsZW0geworCXUzMiBtYXNrOworCXU4IGN0cjsKKwlzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZVswXTsKK307CisKK3N0cnVjdCBzZG1hX3JodF9ub2RlIHsKKwl1bnNpZ25lZCBsb25nIGNwdV9pZDsKKwlzdHJ1Y3Qgc2RtYV9yaHRfbWFwX2VsZW0gKm1hcFtIRkkxX01BWF9WTFNfU1VQUE9SVEVEXTsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCBub2RlOworfTsKKworI2RlZmluZSBOUl9DUFVTX0hJTlQgMTkyCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgc2RtYV9yaHRfcGFyYW1zID0geworCS5uZWxlbV9oaW50ID0gTlJfQ1BVU19ISU5ULAorCS5oZWFkX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzZG1hX3JodF9ub2RlLCBub2RlKSwKKwkua2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzZG1hX3JodF9ub2RlLCBjcHVfaWQpLAorCS5rZXlfbGVuID0gRklFTERfU0laRU9GKHN0cnVjdCBzZG1hX3JodF9ub2RlLCBjcHVfaWQpLAorCS5tYXhfc2l6ZSA9IE5SX0NQVVMsCisJLm1pbl9zaXplID0gOCwKKwkuYXV0b21hdGljX3Nocmlua2luZyA9IHRydWUsCit9OworCisvKgorICogc2RtYV9zZWxlY3RfdXNlcl9lbmdpbmUoKSAtIHNlbGVjdCBzZG1hIGVuZ2luZSBiYXNlZCBvbiB1c2VyIHNldHVwCisgKiBAZGQ6IGRldmRhdGEKKyAqIEBzZWxlY3RvcjogYSBzcHJlYWRpbmcgZmFjdG9yCisgKiBAdmw6IHRoaXMgdmwKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gc2RtYSBlbmdpbmUgZm9yIGEgdXNlciBzZG1hIHJlcXVlc3QuCisgKiBVc2VyIGRlZmluZWQgc2RtYSBlbmdpbmUgYWZmaW5pdHkgc2V0dGluZyBpcyBob25vcmVkIHdoZW4gYXBwbGljYWJsZSwKKyAqIG90aGVyd2lzZSBzeXN0ZW0gZGVmYXVsdCBzZG1hIGVuZ2luZSBtYXBwaW5nIGlzIHVzZWQuIFRvIGVuc3VyZSBjb3JyZWN0CisgKiBvcmRlcmluZywgdGhlIG1hcHBpbmcgZnJvbSA8c2VsZWN0b3IsIHZsPiB0byBzZGUgbXVzdCByZW1haW4gdW5jaGFuZ2VkLgorICovCitzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkbWFfc2VsZWN0X3VzZXJfZW5naW5lKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLAorCQkJCQkgICAgdTMyIHNlbGVjdG9yLCB1OCB2bCkKK3sKKwlzdHJ1Y3Qgc2RtYV9yaHRfbm9kZSAqcmh0X25vZGU7CisJc3RydWN0IHNkbWFfZW5naW5lICpzZGUgPSBOVUxMOworCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpjdXJyZW50X21hc2sgPSB0c2tfY3B1c19hbGxvd2VkKGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgY3B1X2lkOworCisJLyoKKwkgKiBUbyBlbnN1cmUgdGhhdCBhbHdheXMgdGhlIHNhbWUgc2RtYSBlbmdpbmUocykgd2lsbCBiZQorCSAqIHNlbGVjdGVkIG1ha2Ugc3VyZSB0aGUgcHJvY2VzcyBpcyBwaW5uZWQgdG8gdGhpcyBDUFUgb25seS4KKwkgKi8KKwlpZiAoY3B1bWFza193ZWlnaHQoY3VycmVudF9tYXNrKSAhPSAxKQorCQlnb3RvIG91dDsKKworCWNwdV9pZCA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmh0X25vZGUgPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZkZC0+c2RtYV9yaHQsICZjcHVfaWQsCisJCQkJCSAgc2RtYV9yaHRfcGFyYW1zKTsKKworCWlmIChyaHRfbm9kZSAmJiByaHRfbm9kZS0+bWFwW3ZsXSkgeworCQlzdHJ1Y3Qgc2RtYV9yaHRfbWFwX2VsZW0gKm1hcCA9IHJodF9ub2RlLT5tYXBbdmxdOworCisJCXNkZSA9IG1hcC0+c2RlW3NlbGVjdG9yICYgbWFwLT5tYXNrXTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoc2RlKQorCQlyZXR1cm4gc2RlOworCitvdXQ6CisJcmV0dXJuIHNkbWFfc2VsZWN0X2VuZ2luZV92bChkZCwgc2VsZWN0b3IsIHZsKTsKK30KKworc3RhdGljIHZvaWQgc2RtYV9wb3B1bGF0ZV9zZGVfbWFwKHN0cnVjdCBzZG1hX3JodF9tYXBfZWxlbSAqbWFwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHJvdW5kdXBfcG93X29mX3R3byhtYXAtPmN0ciA/IDogMSkgLSBtYXAtPmN0cjsgaSsrKQorCQltYXAtPnNkZVttYXAtPmN0ciArIGldID0gbWFwLT5zZGVbaV07Cit9CisKK3N0YXRpYyB2b2lkIHNkbWFfY2xlYW51cF9zZGVfbWFwKHN0cnVjdCBzZG1hX3JodF9tYXBfZWxlbSAqbWFwLAorCQkJCSBzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgcG93OworCisJLyogb25seSBuZWVkIHRvIGNoZWNrIHRoZSBmaXJzdCBjdHIgZW50cmllcyBmb3IgYSBtYXRjaCAqLworCWZvciAoaSA9IDA7IGkgPCBtYXAtPmN0cjsgaSsrKSB7CisJCWlmIChtYXAtPnNkZVtpXSA9PSBzZGUpIHsKKwkJCW1lbW1vdmUoJm1hcC0+c2RlW2ldLCAmbWFwLT5zZGVbaSArIDFdLAorCQkJCShtYXAtPmN0ciAtIGkgLSAxKSAqIHNpemVvZihtYXAtPnNkZVswXSkpOworCQkJbWFwLT5jdHItLTsKKwkJCXBvdyA9IHJvdW5kdXBfcG93X29mX3R3byhtYXAtPmN0ciA/IDogMSk7CisJCQltYXAtPm1hc2sgPSBwb3cgLSAxOworCQkJc2RtYV9wb3B1bGF0ZV9zZGVfbWFwKG1hcCk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIFByZXZlbnRzIGNvbmN1cnJlbnQgcmVhZHMgYW5kIHdyaXRlcyBvZiB0aGUgc2RtYSBlbmdpbmUgY3B1X21hc2sKKyAqLworc3RhdGljIERFRklORV9NVVRFWChwcm9jZXNzX3RvX3NkZV9tdXRleCk7CisKK3NzaXplX3Qgc2RtYV9zZXRfY3B1X3RvX3NkZV9tYXAoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQgPSBzZGUtPmRkOworCWNwdW1hc2tfdmFyX3QgbWFzaywgbmV3X21hc2s7CisJdW5zaWduZWQgbG9uZyBjcHU7CisJaW50IHJldCwgdmwsIHN6OworCisJdmwgPSBzZG1hX2VuZ2luZV9nZXRfdmwoc2RlKTsKKwlpZiAodW5saWtlbHkodmwgPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB6YWxsb2NfY3B1bWFza192YXIoJm1hc2ssIEdGUF9LRVJORUwpOworCWlmICghcmV0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHphbGxvY19jcHVtYXNrX3ZhcigmbmV3X21hc2ssIEdGUF9LRVJORUwpOworCWlmICghcmV0KSB7CisJCWZyZWVfY3B1bWFza192YXIobWFzayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXQgPSBjcHVsaXN0X3BhcnNlKGJ1ZiwgbWFzayk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmICghY3B1bWFza19zdWJzZXQobWFzaywgY3B1X29ubGluZV9tYXNrKSkgeworCQlkZF9kZXZfd2FybihzZGUtPmRkLCAiSW52YWxpZCBDUFUgbWFza1xuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJc3ogPSBzaXplb2Yoc3RydWN0IHNkbWFfcmh0X21hcF9lbGVtKSArCisJCQkoVFhFX05VTV9TRE1BX0VOR0lORVMgKiBzaXplb2Yoc3RydWN0IHNkbWFfZW5naW5lICopKTsKKworCW11dGV4X2xvY2soJnByb2Nlc3NfdG9fc2RlX211dGV4KTsKKworCWZvcl9lYWNoX2NwdShjcHUsIG1hc2spIHsKKwkJc3RydWN0IHNkbWFfcmh0X25vZGUgKnJodF9ub2RlOworCisJCS8qIENoZWNrIGlmIHdlIGhhdmUgdGhpcyBhbHJlYWR5IG1hcHBlZCAqLworCQlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsICZzZGUtPmNwdV9tYXNrKSkgeworCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgbmV3X21hc2spOworCQkJY29udGludWU7CisJCX0KKworCQlyaHRfbm9kZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJmRkLT5zZG1hX3JodCwgJmNwdSwKKwkJCQkJCSAgc2RtYV9yaHRfcGFyYW1zKTsKKwkJaWYgKCFyaHRfbm9kZSkgeworCQkJcmh0X25vZGUgPSBremFsbG9jKHNpemVvZigqcmh0X25vZGUpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghcmh0X25vZGUpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlyaHRfbm9kZS0+bWFwW3ZsXSA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCQkJaWYgKCFyaHRfbm9kZS0+bWFwW3ZsXSkgeworCQkJCWtmcmVlKHJodF9ub2RlKTsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcmh0X25vZGUtPmNwdV9pZCA9IGNwdTsKKwkJCXJodF9ub2RlLT5tYXBbdmxdLT5tYXNrID0gMDsKKwkJCXJodF9ub2RlLT5tYXBbdmxdLT5jdHIgPSAxOworCQkJcmh0X25vZGUtPm1hcFt2bF0tPnNkZVswXSA9IHNkZTsKKworCQkJcmV0ID0gcmhhc2h0YWJsZV9pbnNlcnRfZmFzdCgmZGQtPnNkbWFfcmh0LAorCQkJCQkJICAgICAmcmh0X25vZGUtPm5vZGUsCisJCQkJCQkgICAgIHNkbWFfcmh0X3BhcmFtcyk7CisJCQlpZiAocmV0KSB7CisJCQkJa2ZyZWUocmh0X25vZGUtPm1hcFt2bF0pOworCQkJCWtmcmVlKHJodF9ub2RlKTsKKwkJCQlkZF9kZXZfZXJyKHNkZS0+ZGQsICJGYWlsZWQgdG8gc2V0IHByb2Nlc3MgdG8gc2RlIGFmZmluaXR5IGZvciBjcHUgJWx1XG4iLAorCQkJCQkgICBjcHUpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCX0gZWxzZSB7CisJCQlpbnQgY3RyLCBwb3c7CisKKwkJCS8qIEFkZCBuZXcgdXNlciBtYXBwaW5ncyAqLworCQkJaWYgKCFyaHRfbm9kZS0+bWFwW3ZsXSkKKwkJCQlyaHRfbm9kZS0+bWFwW3ZsXSA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCisJCQlpZiAoIXJodF9ub2RlLT5tYXBbdmxdKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJcmh0X25vZGUtPm1hcFt2bF0tPmN0cisrOworCQkJY3RyID0gcmh0X25vZGUtPm1hcFt2bF0tPmN0cjsKKwkJCXJodF9ub2RlLT5tYXBbdmxdLT5zZGVbY3RyIC0gMV0gPSBzZGU7CisJCQlwb3cgPSByb3VuZHVwX3Bvd19vZl90d28oY3RyKTsKKwkJCXJodF9ub2RlLT5tYXBbdmxdLT5tYXNrID0gcG93IC0gMTsKKworCQkJLyogUG9wdWxhdGUgdGhlIHNkZSBtYXAgdGFibGUgKi8KKwkJCXNkbWFfcG9wdWxhdGVfc2RlX21hcChyaHRfbm9kZS0+bWFwW3ZsXSk7CisJCX0KKwkJY3B1bWFza19zZXRfY3B1KGNwdSwgbmV3X21hc2spOworCX0KKworCS8qIENsZWFuIHVwIG9sZCBtYXBwaW5ncyAqLworCWZvcl9lYWNoX2NwdShjcHUsIGNwdV9vbmxpbmVfbWFzaykgeworCQlzdHJ1Y3Qgc2RtYV9yaHRfbm9kZSAqcmh0X25vZGU7CisKKwkJLyogRG9uJ3QgY2xlYW51cCBzZGVzIHRoYXQgYXJlIHNldCBpbiB0aGUgbmV3IG1hc2sgKi8KKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBtYXNrKSkKKwkJCWNvbnRpbnVlOworCisJCXJodF9ub2RlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmZGQtPnNkbWFfcmh0LCAmY3B1LAorCQkJCQkJICBzZG1hX3JodF9wYXJhbXMpOworCQlpZiAocmh0X25vZGUpIHsKKwkJCWJvb2wgZW1wdHkgPSB0cnVlOworCQkJaW50IGk7CisKKwkJCS8qIFJlbW92ZSBtYXBwaW5ncyBmb3Igb2xkIHNkZSAqLworCQkJZm9yIChpID0gMDsgaSA8IEhGSTFfTUFYX1ZMU19TVVBQT1JURUQ7IGkrKykKKwkJCQlpZiAocmh0X25vZGUtPm1hcFtpXSkKKwkJCQkJc2RtYV9jbGVhbnVwX3NkZV9tYXAocmh0X25vZGUtPm1hcFtpXSwKKwkJCQkJCQkgICAgIHNkZSk7CisKKwkJCS8qIEZyZWUgZW1wdHkgaGFzaCB0YWJsZSBlbnRyaWVzICovCisJCQlmb3IgKGkgPSAwOyBpIDwgSEZJMV9NQVhfVkxTX1NVUFBPUlRFRDsgaSsrKSB7CisJCQkJaWYgKCFyaHRfbm9kZS0+bWFwW2ldKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChyaHRfbm9kZS0+bWFwW2ldLT5jdHIpIHsKKwkJCQkJZW1wdHkgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoZW1wdHkpIHsKKwkJCQlyZXQgPSByaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCZkZC0+c2RtYV9yaHQsCisJCQkJCQkJICAgICAmcmh0X25vZGUtPm5vZGUsCisJCQkJCQkJICAgICBzZG1hX3JodF9wYXJhbXMpOworCQkJCVdBUk5fT04ocmV0KTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBIRkkxX01BWF9WTFNfU1VQUE9SVEVEOyBpKyspCisJCQkJCWtmcmVlKHJodF9ub2RlLT5tYXBbaV0pOworCisJCQkJa2ZyZWUocmh0X25vZGUpOworCQkJfQorCQl9CisJfQorCisJY3B1bWFza19jb3B5KCZzZGUtPmNwdV9tYXNrLCBuZXdfbWFzayk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcm9jZXNzX3RvX3NkZV9tdXRleCk7CitvdXRfZnJlZToKKwlmcmVlX2NwdW1hc2tfdmFyKG1hc2spOworCWZyZWVfY3B1bWFza192YXIobmV3X21hc2spOworCXJldHVybiByZXQgPyA6IHN0cm5sZW4oYnVmLCBQQUdFX1NJWkUpOworfQorCitzc2l6ZV90IHNkbWFfZ2V0X2NwdV90b19zZGVfbWFwKHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlLCBjaGFyICpidWYpCit7CisJbXV0ZXhfbG9jaygmcHJvY2Vzc190b19zZGVfbXV0ZXgpOworCWlmIChjcHVtYXNrX2VtcHR5KCZzZGUtPmNwdV9tYXNrKSkKKwkJc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgImVtcHR5Iik7CisJZWxzZQorCQljcHVtYXBfcHJpbnRfdG9fcGFnZWJ1Zih0cnVlLCBidWYsICZzZGUtPmNwdV9tYXNrKTsKKwltdXRleF91bmxvY2soJnByb2Nlc3NfdG9fc2RlX211dGV4KTsKKwlyZXR1cm4gc3RybmxlbihidWYsIFBBR0VfU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkIHNkbWFfcmh0X2ZyZWUodm9pZCAqcHRyLCB2b2lkICphcmcpCit7CisJc3RydWN0IHNkbWFfcmh0X25vZGUgKnJodF9ub2RlID0gcHRyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEhGSTFfTUFYX1ZMU19TVVBQT1JURUQ7IGkrKykKKwkJa2ZyZWUocmh0X25vZGUtPm1hcFtpXSk7CisKKwlrZnJlZShyaHRfbm9kZSk7Cit9CisKKy8qKgorICogc2RtYV9zZXFmaWxlX2R1bXBfY3B1X2xpc3QoKSAtIGRlYnVnZnMgZHVtcCB0aGUgY3B1IHRvIHNkbWEgbWFwcGluZ3MKKyAqIEBzOiBzZXEgZmlsZQorICogQGRkOiBoZmkxX2RldmRhdGEKKyAqIEBjcHVpZDogY3B1IGlkCisgKgorICogVGhpcyByb3V0aW5lIGR1bXBzIHRoZSBwcm9jZXNzIHRvIHNkZSBtYXBwaW5ncyBwZXIgY3B1CisgKi8KK3ZvaWQgc2RtYV9zZXFmaWxlX2R1bXBfY3B1X2xpc3Qoc3RydWN0IHNlcV9maWxlICpzLAorCQkJCXN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLAorCQkJCXVuc2lnbmVkIGxvbmcgY3B1aWQpCit7CisJc3RydWN0IHNkbWFfcmh0X25vZGUgKnJodF9ub2RlOworCWludCBpLCBqOworCisJcmh0X25vZGUgPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZkZC0+c2RtYV9yaHQsICZjcHVpZCwKKwkJCQkJICBzZG1hX3JodF9wYXJhbXMpOworCWlmICghcmh0X25vZGUpCisJCXJldHVybjsKKworCXNlcV9wcmludGYocywgImNwdSUzbHU6ICIsIGNwdWlkKTsKKwlmb3IgKGkgPSAwOyBpIDwgSEZJMV9NQVhfVkxTX1NVUFBPUlRFRDsgaSsrKSB7CisJCWlmICghcmh0X25vZGUtPm1hcFtpXSB8fCAhcmh0X25vZGUtPm1hcFtpXS0+Y3RyKQorCQkJY29udGludWU7CisKKwkJc2VxX3ByaW50ZihzLCAiIHZsJWQ6IFsiLCBpKTsKKworCQlmb3IgKGogPSAwOyBqIDwgcmh0X25vZGUtPm1hcFtpXS0+Y3RyOyBqKyspIHsKKwkJCWlmICghcmh0X25vZGUtPm1hcFtpXS0+c2RlW2pdKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoaiA+IDApCisJCQkJc2VxX3B1dHMocywgIiwiKTsKKworCQkJc2VxX3ByaW50ZihzLCAiIHNkbWElMmQiLAorCQkJCSAgIHJodF9ub2RlLT5tYXBbaV0tPnNkZVtqXS0+dGhpc19pZHgpOworCQl9CisJCXNlcV9wdXRzKHMsICIgXSIpOworCX0KKworCXNlcV9wdXRzKHMsICJcbiIpOworfQorCiAvKgogICogRnJlZSB0aGUgaW5kaWNhdGVkIG1hcCBzdHJ1Y3QKICAqLwpAQCAtMTE2MSw2ICsxNTA5LDEwIEBACiAJZGQtPm51bV9zZG1hID0gbnVtX2VuZ2luZXM7CiAJaWYgKHNkbWFfbWFwX2luaXQoZGQsIHBvcnQsIHBwZC0+dmxzX29wZXJhdGlvbmFsLCBOVUxMKSkKIAkJZ290byBiYWlsOworCisJaWYgKHJoYXNodGFibGVfaW5pdCgmZGQtPnNkbWFfcmh0LCAmc2RtYV9yaHRfcGFyYW1zKSkKKwkJZ290byBiYWlsOworCiAJZGRfZGV2X2luZm8oZGQsICJTRE1BIG51bV9zZG1hOiAldVxuIiwgZGQtPm51bV9zZG1hKTsKIAlyZXR1cm4gMDsKIApAQCAtMTI1Miw2ICsxNjA0LDcgQEAKIAkJc2RtYV9maW5hbHB1dCgmc2RlLT5zdGF0ZSk7CiAJfQogCXNkbWFfY2xlYW4oZGQsIGRkLT5udW1fc2RtYSk7CisJcmhhc2h0YWJsZV9mcmVlX2FuZF9kZXN0cm95KCZkZC0+c2RtYV9yaHQsIHNkbWFfcmh0X2ZyZWUsIE5VTEwpOwogfQogCiAvKgpAQCAtMjA4Niw2ICsyNDM5LDExIEBACiAgKiBAc2RlOiBzZG1hIGVuZ2luZSB0byB1c2UKICAqIEB3YWl0OiB3YWl0IHN0cnVjdHVyZSB0byB1c2Ugd2hlbiBmdWxsIChtYXkgYmUgTlVMTCkKICAqIEB0eF9saXN0OiBsaXN0IG9mIHNkbWFfdHhyZXFzIHRvIHN1Ym1pdAorICogQGNvdW50OiBwb2ludGVyIHRvIGEgdTMyIHdoaWNoLCBhZnRlciByZXR1cm4gd2lsbCBjb250YWluIHRoZSB0b3RhbCBudW1iZXIgb2YKKyAqICAgICAgICAgc2RtYV90eHJlcXMgcmVtb3ZlZCBmcm9tIHRoZSB0eF9saXN0LiBUaGlzIHdpbGwgaW5jbHVkZSBzZG1hX3R4cmVxcworICogICAgICAgICB3aG9zZSBTRE1BIGRlc2NyaXB0b3JzIGFyZSBzdWJtaXR0ZWQgdG8gdGhlIHJpbmcgYW5kIHRoZSBzZG1hX3R4cmVxcworICogICAgICAgICB3aGljaCBhcmUgYWRkZWQgdG8gU0RNQSBlbmdpbmUgZmx1c2ggbGlzdCBpZiB0aGUgU0RNQSBlbmdpbmUgc3RhdGUgaXMKKyAqICAgICAgICAgbm90IHJ1bm5pbmcuCiAgKgogICogVGhlIGNhbGwgc3VibWl0cyB0aGUgbGlzdCBpbnRvIHRoZSByaW5nLgogICoKQEAgLTIxMDAsMTggKzI0NTgsMTggQEAKICAqIHNpZGUgbG9ja2luZy4KICAqCiAgKiBSZXR1cm46Ci0gKiA+IDAgLSBTdWNjZXNzICh2YWx1ZSBpcyBudW1iZXIgb2Ygc2RtYV90eHJlcSdzIHN1Ym1pdHRlZCksCisgKiAwIC0gU3VjY2VzcywKICAqIC1FSU5WQUwgLSBzZG1hX3R4cmVxIGluY29tcGxldGUsIC1FQlVTWSAtIG5vIHNwYWNlIGluIHJpbmcgKHdhaXQgPT0gTlVMTCkKICAqIC1FSU9DQlFVRVVFRCAtIHR4IHF1ZXVlZCB0byBpb3dhaXQsIC1FQ09NTSBiYWQgc2RtYSBzdGF0ZQogICovCiBpbnQgc2RtYV9zZW5kX3R4bGlzdChzdHJ1Y3Qgc2RtYV9lbmdpbmUgKnNkZSwgc3RydWN0IGlvd2FpdCAqd2FpdCwKLQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICp0eF9saXN0KQorCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnR4X2xpc3QsIHUzMiAqY291bnRfb3V0KQogewogCXN0cnVjdCBzZG1hX3R4cmVxICp0eCwgKnR4X25leHQ7CiAJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MTYgdGFpbCA9IElOVkFMSURfVEFJTDsKLQlpbnQgY291bnQgPSAwOworCXUzMiBzdWJtaXRfY291bnQgPSAwLCBmbHVzaF9jb3VudCA9IDAsIHRvdGFsX2NvdW50OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNkZS0+dGFpbF9sb2NrLCBmbGFncyk7CiByZXRyeToKQEAgLTIxMjcsMzMgKzI0ODUsMzQgQEAKIAkJfQogCQlsaXN0X2RlbF9pbml0KCZ0eC0+bGlzdCk7CiAJCXRhaWwgPSBzdWJtaXRfdHgoc2RlLCB0eCk7Ci0JCWNvdW50Kys7CisJCXN1Ym1pdF9jb3VudCsrOwogCQlpZiAodGFpbCAhPSBJTlZBTElEX1RBSUwgJiYKLQkJICAgIChjb3VudCAmIFNETUFfVEFJTF9VUERBVEVfVEhSRVNIKSA9PSAwKSB7CisJCSAgICAoc3VibWl0X2NvdW50ICYgU0RNQV9UQUlMX1VQREFURV9USFJFU0gpID09IDApIHsKIAkJCXNkbWFfdXBkYXRlX3RhaWwoc2RlLCB0YWlsKTsKIAkJCXRhaWwgPSBJTlZBTElEX1RBSUw7CiAJCX0KIAl9CiB1cGRhdGVfdGFpbDoKKwl0b3RhbF9jb3VudCA9IHN1Ym1pdF9jb3VudCArIGZsdXNoX2NvdW50OwogCWlmICh3YWl0KQotCQlpb3dhaXRfc2RtYV9hZGQod2FpdCwgY291bnQpOworCQlpb3dhaXRfc2RtYV9hZGQod2FpdCwgdG90YWxfY291bnQpOwogCWlmICh0YWlsICE9IElOVkFMSURfVEFJTCkKIAkJc2RtYV91cGRhdGVfdGFpbChzZGUsIHRhaWwpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkZS0+dGFpbF9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldCA9PSAwID8gY291bnQgOiByZXQ7CisJKmNvdW50X291dCA9IHRvdGFsX2NvdW50OworCXJldHVybiByZXQ7CiB1bmxvY2tfbm9jb25uOgogCXNwaW5fbG9jaygmc2RlLT5mbHVzaGxpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHR4LCB0eF9uZXh0LCB0eF9saXN0LCBsaXN0KSB7CiAJCXR4LT53YWl0ID0gd2FpdDsKIAkJbGlzdF9kZWxfaW5pdCgmdHgtPmxpc3QpOwotCQlpZiAod2FpdCkKLQkJCWlvd2FpdF9zZG1hX2luYyh3YWl0KTsKIAkJdHgtPm5leHRfZGVzY3FfaWR4ID0gMDsKICNpZmRlZiBDT05GSUdfSEZJMV9ERUJVR19TRE1BX09SREVSCiAJCXR4LT5zbiA9IHNkZS0+dGFpbF9zbisrOwogCQl0cmFjZV9oZmkxX3NkbWFfaW5fc24oc2RlLCB0eC0+c24pOwogI2VuZGlmCiAJCWxpc3RfYWRkX3RhaWwoJnR4LT5saXN0LCAmc2RlLT5mbHVzaGxpc3QpOworCQlmbHVzaF9jb3VudCsrOwogCQlpZiAod2FpdCkgewogCQkJd2FpdC0+dHhfY291bnQrKzsKIAkJCXdhaXQtPmNvdW50ICs9IHR4LT5udW1fZGVzYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3NkbWEuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3NkbWEuaAppbmRleCA4ZjUwYzk5Li41NjI1N2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9zZG1hLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc2RtYS5oCkBAIC00MTMsNiArNDEzLDggQEAKIAlzcGlubG9ja190IGZsdXNobGlzdF9sb2NrOwogCS8qIHByaXZhdGU6ICovCiAJc3RydWN0IGxpc3RfaGVhZCBmbHVzaGxpc3Q7CisJc3RydWN0IGNwdW1hc2sgY3B1X21hc2s7CisJc3RydWN0IGtvYmplY3Qga29iajsKIH07CiAKIGludCBzZG1hX2luaXQoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHU4IHBvcnQpOwpAQCAtODQ3LDcgKzg0OSw4IEBACiAJCSAgICBzdHJ1Y3Qgc2RtYV90eHJlcSAqdHgpOwogaW50IHNkbWFfc2VuZF90eGxpc3Qoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsCiAJCSAgICAgc3RydWN0IGlvd2FpdCAqd2FpdCwKLQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICp0eF9saXN0KTsKKwkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICp0eF9saXN0LAorCQkgICAgIHUzMiAqY291bnQpOwogCiBpbnQgc2RtYV9haGdfYWxsb2Moc3RydWN0IHNkbWFfZW5naW5lICpzZGUpOwogdm9pZCBzZG1hX2FoZ19mcmVlKHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlLCBpbnQgYWhnX2luZGV4KTsKQEAgLTEwNTgsNyArMTA2MSwxNSBAQAogCXUzMiBzZWxlY3RvciwKIAl1OCB2bCk7CiAKK3N0cnVjdCBzZG1hX2VuZ2luZSAqc2RtYV9zZWxlY3RfdXNlcl9lbmdpbmUoc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsCisJCQkJCSAgICB1MzIgc2VsZWN0b3IsIHU4IHZsKTsKK3NzaXplX3Qgc2RtYV9nZXRfY3B1X3RvX3NkZV9tYXAoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNoYXIgKmJ1Zik7Citzc2l6ZV90IHNkbWFfc2V0X2NwdV90b19zZGVfbWFwKHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGNvdW50KTsKK2ludCBzZG1hX2VuZ2luZV9nZXRfdmwoc3RydWN0IHNkbWFfZW5naW5lICpzZGUpOwogdm9pZCBzZG1hX3NlcWZpbGVfZHVtcF9zZGUoc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3Qgc2RtYV9lbmdpbmUgKik7Cit2b2lkIHNkbWFfc2VxZmlsZV9kdW1wX2NwdV9saXN0KHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsCisJCQkJdW5zaWduZWQgbG9uZyBjcHVpZCk7CiAKICNpZmRlZiBDT05GSUdfU0RNQV9WRVJCT1NJVFkKIHZvaWQgc2RtYV9kdW1wc3RhdGUoc3RydWN0IHNkbWFfZW5naW5lICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc3lzZnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3N5c2ZzLmMKaW5kZXggNzRjODRjNi4uZWRiYTIyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvc3lzZnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS9zeXNmcy5jCkBAIC03NjYsMTMgKzc2Niw5NSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0cnVjdCBzZGVfYXR0cmlidXRlIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlLCBjaGFyICpidWYpOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNudCk7Cit9OworCitzdGF0aWMgc3NpemVfdCBzZGVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZGVfYXR0cmlidXRlICpzZGVfYXR0ciA9CisJCWNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgc2RlX2F0dHJpYnV0ZSwgYXR0cik7CisJc3RydWN0IHNkbWFfZW5naW5lICpzZGUgPQorCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IHNkbWFfZW5naW5lLCBrb2JqKTsKKworCWlmICghc2RlX2F0dHItPnNob3cpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNkZV9hdHRyLT5zaG93KHNkZSwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2RlX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZGVfYXR0cmlidXRlICpzZGVfYXR0ciA9CisJCWNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgc2RlX2F0dHJpYnV0ZSwgYXR0cik7CisJc3RydWN0IHNkbWFfZW5naW5lICpzZGUgPQorCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IHNkbWFfZW5naW5lLCBrb2JqKTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICghc2RlX2F0dHItPnN0b3JlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzZGVfYXR0ci0+c3RvcmUoc2RlLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgc2RlX3N5c2ZzX29wcyA9IHsKKwkuc2hvdyA9IHNkZV9zaG93LAorCS5zdG9yZSA9IHNkZV9zdG9yZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIHNkZV9rdHlwZSA9IHsKKwkuc3lzZnNfb3BzID0gJnNkZV9zeXNmc19vcHMsCit9OworCisjZGVmaW5lIFNERV9BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSkgXAorCXN0cnVjdCBzZGVfYXR0cmlidXRlIHNkZV9hdHRyXyMjX25hbWUgPSBcCisJCV9fQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCisKK3N0YXRpYyBzc2l6ZV90IHNkZV9zaG93X2NwdV90b19zZGVfbWFwKHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNkbWFfZ2V0X2NwdV90b19zZGVfbWFwKHNkZSwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2RlX3N0b3JlX2NwdV90b19zZGVfbWFwKHN0cnVjdCBzZG1hX2VuZ2luZSAqc2RlLAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gc2RtYV9zZXRfY3B1X3RvX3NkZV9tYXAoc2RlLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2RlX3Nob3dfdmwoc3RydWN0IHNkbWFfZW5naW5lICpzZGUsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgdmw7CisKKwl2bCA9IHNkbWFfZW5naW5lX2dldF92bChzZGUpOworCWlmICh2bCA8IDApCisJCXJldHVybiB2bDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2bCk7Cit9CisKK3N0YXRpYyBTREVfQVRUUihjcHVfbGlzdCwgU19JV1VTUiB8IFNfSVJVR08sCisJCXNkZV9zaG93X2NwdV90b19zZGVfbWFwLAorCQlzZGVfc3RvcmVfY3B1X3RvX3NkZV9tYXApOworc3RhdGljIFNERV9BVFRSKHZsLCBTX0lSVUdPLCBzZGVfc2hvd192bCwgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2RlX2F0dHJpYnV0ZSAqc2RlX2F0dHJpYnNbXSA9IHsKKwkmc2RlX2F0dHJfY3B1X2xpc3QsCisJJnNkZV9hdHRyX3ZsCit9OworCiAvKgogICogUmVnaXN0ZXIgYW5kIGNyZWF0ZSBvdXIgZmlsZXMgaW4gL3N5cy9jbGFzcy9pbmZpbmliYW5kLgogICovCiBpbnQgaGZpMV92ZXJic19yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCkKIHsKIAlzdHJ1Y3QgaWJfZGV2aWNlICpkZXYgPSAmZGQtPnZlcmJzX2Rldi5yZGkuaWJkZXY7Ci0JaW50IGksIHJldDsKKwlzdHJ1Y3QgZGV2aWNlICpjbGFzc19kZXYgPSAmZGV2LT5kZXY7CisJaW50IGksIGosIHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhmaTFfYXR0cmlidXRlcyk7ICsraSkgewogCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmRldi0+ZGV2LCBoZmkxX2F0dHJpYnV0ZXNbaV0pOwpAQCAtNzgwLDEwICs4NjIsMjkgQEAKIAkJCWdvdG8gYmFpbDsKIAl9CiAKKwlmb3IgKGkgPSAwOyBpIDwgZGQtPm51bV9zZG1hOyBpKyspIHsKKwkJcmV0ID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmRkLT5wZXJfc2RtYVtpXS5rb2JqLAorCQkJCQkgICAmc2RlX2t0eXBlLCAmY2xhc3NfZGV2LT5rb2JqLAorCQkJCQkgICAic2RtYSVkIiwgaSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGJhaWw7CisKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoc2RlX2F0dHJpYnMpOyBqKyspIHsKKwkJCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZkZC0+cGVyX3NkbWFbaV0ua29iaiwKKwkJCQkJCSZzZGVfYXR0cmlic1tqXS0+YXR0cik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gYmFpbDsKKwkJfQorCX0KKwogCXJldHVybiAwOwogYmFpbDoKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoZmkxX2F0dHJpYnV0ZXMpOyArK2kpCiAJCWRldmljZV9yZW1vdmVfZmlsZSgmZGV2LT5kZXYsIGhmaTFfYXR0cmlidXRlc1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGQtPm51bV9zZG1hOyBpKyspCisJCWtvYmplY3RfZGVsKCZkZC0+cGVyX3NkbWFbaV0ua29iaik7CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdHJhY2UuYwppbmRleCA0Y2ZiMTM3Li4wMWY1MjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlLmMKQEAgLTQ3LDkgKzQ3LDkgQEAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgInRyYWNlLmgiCiAKLXU4IGliaGRyX2V4aGRyX2xlbihzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkcikKK3U4IGliaGRyX2V4aGRyX2xlbihzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpCiB7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAl1OCBvcGNvZGU7CiAJdTggbG5oID0gKHU4KShiZTE2X3RvX2NwdShoZHItPmxyaFswXSkgJiAzKTsKIApAQCAtNjcsMTYgKzY3LDExIEBACiAjZGVmaW5lIEFFVEhfUFJOICJhZXRoIHN5biAweCUuMnggJXMgbXNuIDB4JS44eCIKICNkZWZpbmUgREVUSF9QUk4gImRldGggcWtleSAweCUuOHggc3FwbiAweCUuNngiCiAjZGVmaW5lIElFVEhfUFJOICJpZXRoIHJrZXkgMHglLjh4IgotI2RlZmluZSBBVE9NSUNBQ0tFVEhfUFJOICJvcmlnZGF0YSAlbGxkIgotI2RlZmluZSBBVE9NSUNFVEhfUFJOICJ2YWRkciAweCVsbHggcmtleSAweCUuOHggc2RhdGEgJWxsZCBjZGF0YSAlbGxkIgorI2RlZmluZSBBVE9NSUNBQ0tFVEhfUFJOICJvcmlnZGF0YSAlbGx4IgorI2RlZmluZSBBVE9NSUNFVEhfUFJOICJ2YWRkciAweCVsbHggcmtleSAweCUuOHggc2RhdGEgJWxseCBjZGF0YSAlbGx4IgogCiAjZGVmaW5lIE9QKHRyYW5zcG9ydCwgb3ApIElCX09QQ09ERV8jIyB0cmFuc3BvcnQgIyMgXyAjIyBvcAogCi1zdGF0aWMgdTY0IGliX3U2NF9nZXQoX19iZTMyICpwKQotewotCXJldHVybiAoKHU2NCliZTMyX3RvX2NwdShwWzBdKSA8PCAzMikgfCBiZTMyX3RvX2NwdShwWzFdKTsKLX0KLQogc3RhdGljIGNvbnN0IGNoYXIgKnBhcnNlX3N5bmRyb21lKHU4IHN5bmRyb21lKQogewogCXN3aXRjaCAoc3luZHJvbWUgPj4gNSkgewpAQCAtMTEzLDggKzEwOCw3IEBACiAJY2FzZSBPUChSQywgUkRNQV9XUklURV9PTkxZX1dJVEhfSU1NRURJQVRFKToKIAljYXNlIE9QKFVDLCBSRE1BX1dSSVRFX09OTFlfV0lUSF9JTU1FRElBVEUpOgogCQl0cmFjZV9zZXFfcHJpbnRmKHAsIFJFVEhfUFJOICIgIiBJTU1fUFJOLAotCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWliX3U2NF9nZXQoCi0JCQkJIChfX2JlMzIgKikmZWgtPnJjLnJldGgudmFkZHIpLAorCQkJCSBnZXRfaWJfcmV0aF92YWRkcigmZWgtPnJjLnJldGgpLAogCQkJCSBiZTMyX3RvX2NwdShlaC0+cmMucmV0aC5ya2V5KSwKIAkJCQkgYmUzMl90b19jcHUoZWgtPnJjLnJldGgubGVuZ3RoKSwKIAkJCQkgYmUzMl90b19jcHUoZWgtPnJjLmltbV9kYXRhKSk7CkBAIC0xMjYsOCArMTIwLDcgQEAKIAljYXNlIE9QKFJDLCBSRE1BX1dSSVRFX09OTFkpOgogCWNhc2UgT1AoVUMsIFJETUFfV1JJVEVfT05MWSk6CiAJCXRyYWNlX3NlcV9wcmludGYocCwgUkVUSF9QUk4sCi0JCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpaWJfdTY0X2dldCgKLQkJCQkgKF9fYmUzMiAqKSZlaC0+cmMucmV0aC52YWRkciksCisJCQkJIGdldF9pYl9yZXRoX3ZhZGRyKCZlaC0+cmMucmV0aCksCiAJCQkJIGJlMzJfdG9fY3B1KGVoLT5yYy5yZXRoLnJrZXkpLAogCQkJCSBiZTMyX3RvX2NwdShlaC0+cmMucmV0aC5sZW5ndGgpKTsKIAkJYnJlYWs7CkBAIC0xNDUsMjAgKzEzOCwxNiBAQAogCQkJCSBiZTMyX3RvX2NwdShlaC0+YXQuYWV0aCkgPj4gMjQsCiAJCQkJIHBhcnNlX3N5bmRyb21lKGJlMzJfdG9fY3B1KGVoLT5hdC5hZXRoKSA+PiAyNCksCiAJCQkJIGJlMzJfdG9fY3B1KGVoLT5hdC5hZXRoKSAmIEhGSTFfTVNOX01BU0ssCi0JCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpCi0JCQkJIGliX3U2NF9nZXQoZWgtPmF0LmF0b21pY19hY2tfZXRoKSk7CisJCQkJIGliX3U2NF9nZXQoJmVoLT5hdC5hdG9taWNfYWNrX2V0aCkpOwogCQlicmVhazsKIAkvKiBhdG9taWNldGggKi8KIAljYXNlIE9QKFJDLCBDT01QQVJFX1NXQVApOgogCWNhc2UgT1AoUkMsIEZFVENIX0FERCk6CiAJCXRyYWNlX3NlcV9wcmludGYocCwgQVRPTUlDRVRIX1BSTiwKLQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylpYl91NjRfZ2V0KAotCQkJCSBlaC0+YXRvbWljX2V0aC52YWRkciksCisJCQkJIGdldF9pYl9hdGV0aF92YWRkcigmZWgtPmF0b21pY19ldGgpLAogCQkJCSBlaC0+YXRvbWljX2V0aC5ya2V5LAotCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKWliX3U2NF9nZXQoCi0JCQkJIChfX2JlMzIgKikmZWgtPmF0b21pY19ldGguc3dhcF9kYXRhKSwKLQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylpYl91NjRfZ2V0KAotCQkJCSAoX19iZTMyICopJmVoLT5hdG9taWNfZXRoLmNvbXBhcmVfZGF0YSkpOworCQkJCSBnZXRfaWJfYXRldGhfc3dhcCgmZWgtPmF0b21pY19ldGgpLAorCQkJCSBnZXRfaWJfYXRldGhfY29tcGFyZSgmZWgtPmF0b21pY19ldGgpKTsKIAkJYnJlYWs7CiAJLyogZGV0aCAqLwogCWNhc2UgT1AoVUQsIFNFTkRfT05MWSk6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9jdHh0cy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdHJhY2VfY3R4dHMuaAppbmRleCAzMTY1NGJiLi4yNmFlNzg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9jdHh0cy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX2N0eHRzLmgKQEAgLTY3LDkgKzY3LDkgQEAKIAkJCSAgICAgX19maWVsZCh1NjQsIGh3X2ZyZWUpCiAJCQkgICAgIF9fZmllbGQodm9pZCBfX2lvbWVtICosIHBpb2Jhc2UpCiAJCQkgICAgIF9fZmllbGQodTE2LCByY3ZoZHJxX2NudCkKLQkJCSAgICAgX19maWVsZCh1NjQsIHJjdmhkcnFfcGh5cykKKwkJCSAgICAgX19maWVsZCh1NjQsIHJjdmhkcnFfZG1hKQogCQkJICAgICBfX2ZpZWxkKHUzMiwgZWFnZXJfY250KQotCQkJICAgICBfX2ZpZWxkKHU2NCwgcmN2ZWdyX3BoeXMpCisJCQkgICAgIF9fZmllbGQodTY0LCByY3ZlZ3JfZG1hKQogCQkJICAgICApLAogCSAgICBUUF9mYXN0X2Fzc2lnbihERF9ERVZfQVNTSUdOKGRkKTsKIAkJCSAgIF9fZW50cnktPmN0eHQgPSB1Y3R4dC0+Y3R4dDsKQEAgLTc3LDEwICs3Nyw5IEBACiAJCQkgICBfX2VudHJ5LT5od19mcmVlID0gbGU2NF90b19jcHUoKnVjdHh0LT5zYy0+aHdfZnJlZSk7CiAJCQkgICBfX2VudHJ5LT5waW9iYXNlID0gdWN0eHQtPnNjLT5iYXNlX2FkZHI7CiAJCQkgICBfX2VudHJ5LT5yY3ZoZHJxX2NudCA9IHVjdHh0LT5yY3ZoZHJxX2NudDsKLQkJCSAgIF9fZW50cnktPnJjdmhkcnFfcGh5cyA9IHVjdHh0LT5yY3ZoZHJxX3BoeXM7CisJCQkgICBfX2VudHJ5LT5yY3ZoZHJxX2RtYSA9IHVjdHh0LT5yY3ZoZHJxX2RtYTsKIAkJCSAgIF9fZW50cnktPmVhZ2VyX2NudCA9IHVjdHh0LT5lZ3JidWZzLmFsbG9jZWQ7Ci0JCQkgICBfX2VudHJ5LT5yY3ZlZ3JfcGh5cyA9Ci0JCQkgICB1Y3R4dC0+ZWdyYnVmcy5yY3Z0aWRzWzBdLnBoeXM7CisJCQkgICBfX2VudHJ5LT5yY3ZlZ3JfZG1hID0gdWN0eHQtPmVncmJ1ZnMucmN2dGlkc1swXS5kbWE7CiAJCQkgICApLAogCSAgICBUUF9wcmludGsoIlslc10gY3R4dCAldSAiIFVDVFhUX0ZNVCwKIAkJICAgICAgX19nZXRfc3RyKGRldiksCkBAIC04OSw5ICs4OCw5IEBACiAJCSAgICAgIF9fZW50cnktPmh3X2ZyZWUsCiAJCSAgICAgIF9fZW50cnktPnBpb2Jhc2UsCiAJCSAgICAgIF9fZW50cnktPnJjdmhkcnFfY250LAotCQkgICAgICBfX2VudHJ5LT5yY3ZoZHJxX3BoeXMsCisJCSAgICAgIF9fZW50cnktPnJjdmhkcnFfZG1hLAogCQkgICAgICBfX2VudHJ5LT5lYWdlcl9jbnQsCi0JCSAgICAgIF9fZW50cnktPnJjdmVncl9waHlzCisJCSAgICAgIF9fZW50cnktPnJjdmVncl9kbWEKIAkJICAgICAgKQogKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdHJhY2VfaWJoZHJzLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9pYmhkcnMuaAppbmRleCBjM2U0MWFlLi4zODJmY2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9pYmhkcnMuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9pYmhkcnMuaApAQCAtNTUsNyArNTUsNyBAQAogI3VuZGVmIFRSQUNFX1NZU1RFTQogI2RlZmluZSBUUkFDRV9TWVNURU0gaGZpMV9pYmhkcnMKIAotdTggaWJoZHJfZXhoZHJfbGVuKHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKTsKK3U4IGliaGRyX2V4aGRyX2xlbihzdHJ1Y3QgaWJfaGVhZGVyICpoZHIpOwogY29uc3QgY2hhciAqcGFyc2VfZXZlcmJzX2hkcnMoc3RydWN0IHRyYWNlX3NlcSAqcCwgdTggb3Bjb2RlLCB2b2lkICplaGRycyk7CiAKICNkZWZpbmUgX19wYXJzZV9pYl9laGRycyhvcCwgZWhkcnMpIHBhcnNlX2V2ZXJic19oZHJzKHAsIG9wLCBlaGRycykKQEAgLTc0LDcgKzc0LDcgQEAKIAogREVDTEFSRV9FVkVOVF9DTEFTUyhoZmkxX2liaGRyX3RlbXBsYXRlLAogCQkgICAgVFBfUFJPVE8oc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsCi0JCQkgICAgIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyKSwKKwkJCSAgICAgc3RydWN0IGliX2hlYWRlciAqaGRyKSwKIAkJICAgIFRQX0FSR1MoZGQsIGhkciksCiAJCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAogCQkJRERfREVWX0VOVFJZKGRkKQpAQCAtMTAyLDcgKzEwMiw3IEBACiAJCQlfX2R5bmFtaWNfYXJyYXkodTgsIGVoZHJzLCBpYmhkcl9leGhkcl9sZW4oaGRyKSkKIAkJCSksCiAJCSAgICAgIFRQX2Zhc3RfYXNzaWduKAotCQkJc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwkJCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCiAJCQlERF9ERVZfQVNTSUdOKGRkKTsKIAkJCS8qIExSSCAqLwpAQCAtMTg1LDE5ICsxODUsMTkgQEAKICk7CiAKIERFRklORV9FVkVOVChoZmkxX2liaGRyX3RlbXBsYXRlLCBpbnB1dF9pYmhkciwKLQkgICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciksCisJICAgICBUUF9QUk9UTyhzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgc3RydWN0IGliX2hlYWRlciAqaGRyKSwKIAkgICAgIFRQX0FSR1MoZGQsIGhkcikpOwogCiBERUZJTkVfRVZFTlQoaGZpMV9pYmhkcl90ZW1wbGF0ZSwgcGlvX291dHB1dF9pYmhkciwKLQkgICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciksCisJICAgICBUUF9QUk9UTyhzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgc3RydWN0IGliX2hlYWRlciAqaGRyKSwKIAkgICAgIFRQX0FSR1MoZGQsIGhkcikpOwogCiBERUZJTkVfRVZFTlQoaGZpMV9pYmhkcl90ZW1wbGF0ZSwgYWNrX291dHB1dF9pYmhkciwKLQkgICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLCBzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciksCisJICAgICBUUF9QUk9UTyhzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgc3RydWN0IGliX2hlYWRlciAqaGRyKSwKIAkgICAgIFRQX0FSR1MoZGQsIGhkcikpOwogCiBERUZJTkVfRVZFTlQoaGZpMV9pYmhkcl90ZW1wbGF0ZSwgc2RtYV9vdXRwdXRfaWJoZHIsCi0JICAgICBUUF9QUk9UTyhzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCwgc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIpLAorCSAgICAgVFBfUFJPVE8oc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQsIHN0cnVjdCBpYl9oZWFkZXIgKmhkciksCiAJICAgICBUUF9BUkdTKGRkLCBoZHIpKTsKIAogI2VuZGlmIC8qIF9fSEZJMV9UUkFDRV9JQkhEUlNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdHJhY2VfcnguaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3RyYWNlX3J4LmgKaW5kZXggOWJhMWY2MS4uMTFlMDJiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdHJhY2VfcnguaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS90cmFjZV9yeC5oCkBAIC0yNjAsNyArMjYwLDcgQEAKIFRSQUNFX0VWRU5UKHNub29wX2NhcHR1cmUsCiAJICAgIFRQX1BST1RPKHN0cnVjdCBoZmkxX2RldmRhdGEgKmRkLAogCQkgICAgIGludCBoZHJfbGVuLAotCQkgICAgIHN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyLAorCQkgICAgIHN0cnVjdCBpYl9oZWFkZXIgKmhkciwKIAkJICAgICBpbnQgZGF0YV9sZW4sCiAJCSAgICAgdm9pZCAqZGF0YSksCiAJICAgIFRQX0FSR1MoZGQsIGhkcl9sZW4sIGhkciwgZGF0YV9sZW4sIGRhdGEpLApAQCAtMjc5LDcgKzI3OSw3IEBACiAJCQkgICAgIF9fZHluYW1pY19hcnJheSh1OCwgcmF3X3BrdCwgZGF0YV9sZW4pCiAJCQkgICAgICksCiAJICAgIFRQX2Zhc3RfYXNzaWduKAotCQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCQlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAogCQlfX2VudHJ5LT5sbmggPSAodTgpKGJlMTZfdG9fY3B1KGhkci0+bHJoWzBdKSAmIDMpOwogCQlpZiAoX19lbnRyeS0+bG5oID09IEhGSTFfTFJIX0JUSCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3VjLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91Yy5jCmluZGV4IGE3MjZkOTYuLjVlNmQxYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3VjLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdWMuYwpAQCAtNTAsMTQgKzUwLDcgQEAKICNpbmNsdWRlICJxcC5oIgogCiAvKiBjdXQgZG93biByaWRpY3Vsb3VzbHkgbG9uZyBJQiBtYWNybyBuYW1lcyAqLwotI2RlZmluZSBPUCh4KSBJQl9PUENPREVfVUNfIyN4Ci0KLS8qIG9ubHkgb3Bjb2RlIG1hc2sgZm9yIGFkYXB0aXZlIHBpbyAqLwotY29uc3QgdTMyIHVjX29ubHlfb3Bjb2RlID0KLQlCSVQoT1AoU0VORF9PTkxZKSAmIDB4MWYpIHwKLQlCSVQoT1AoU0VORF9PTkxZX1dJVEhfSU1NRURJQVRFICYgMHgxZikpIHwKLQlCSVQoT1AoUkRNQV9XUklURV9PTkxZICYgMHgxZikpIHwKLQlCSVQoT1AoUkRNQV9XUklURV9PTkxZX1dJVEhfSU1NRURJQVRFICYgMHgxZikpOworI2RlZmluZSBPUCh4KSBVQ19PUCh4KQogCiAvKioKICAqIGhmaTFfbWFrZV91Y19yZXEgLSBjb25zdHJ1Y3QgYSByZXF1ZXN0IHBhY2tldCAoU0VORCwgUkRNQSB3cml0ZSkKQEAgLTcwLDcgKzYzLDcgQEAKIGludCBoZmkxX21ha2VfdWNfcmVxKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaGZpMV9wa3Rfc3RhdGUgKnBzKQogewogCXN0cnVjdCBoZmkxX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBydnRfc3dxZSAqd3FlOwogCXUzMiBod29yZHMgPSA1OwogCXUzMiBidGgwID0gMDsKQEAgLTMwNCwxMiArMjk3LDEyIEBACiB2b2lkIGhmaTFfdWNfcmN2KHN0cnVjdCBoZmkxX3BhY2tldCAqcGFja2V0KQogewogCXN0cnVjdCBoZmkxX2licG9ydCAqaWJwID0gJnBhY2tldC0+cmNkLT5wcGQtPmlicG9ydF9kYXRhOwotCXN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyID0gcGFja2V0LT5oZHI7CisJc3RydWN0IGliX2hlYWRlciAqaGRyID0gcGFja2V0LT5oZHI7CiAJdTMyIHJjdl9mbGFncyA9IHBhY2tldC0+cmN2X2ZsYWdzOwogCXZvaWQgKmRhdGEgPSBwYWNrZXQtPmVidWY7CiAJdTMyIHRsZW4gPSBwYWNrZXQtPnRsZW47CiAJc3RydWN0IHJ2dF9xcCAqcXAgPSBwYWNrZXQtPnFwOwotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHIgPSBwYWNrZXQtPm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIgPSBwYWNrZXQtPm9oZHI7CiAJdTMyIGJ0aDAsIG9wY29kZTsKIAl1MzIgaGRyc2l6ZSA9IHBhY2tldC0+aGxlbjsKIAl1MzIgcHNuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3VkLmMKaW5kZXggZjAxZThlMS4uOTdhZTI0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS91ZC5jCkBAIC0yNzEsNyArMjcxLDcgQEAKIGludCBoZmkxX21ha2VfdWRfcmVxKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaGZpMV9wa3Rfc3RhdGUgKnBzKQogewogCXN0cnVjdCBoZmkxX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKLQlzdHJ1Y3QgaGZpMV9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXN0cnVjdCBpYl9haF9hdHRyICphaF9hdHRyOwogCXN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkOwogCXN0cnVjdCBoZmkxX2licG9ydCAqaWJwOwpAQCAtNTEwLDggKzUxMCw4IEBACiAJdTMyIGJ0aDAsIHBsZW4sIHZsLCBod29yZHMgPSA1OwogCXUxNiBscmgwOwogCXU4IHNsID0gaWJwLT5zY190b19zbFtzYzVdOwotCXN0cnVjdCBoZmkxX2liX2hlYWRlciBoZHI7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyIGhkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAlzdHJ1Y3QgcGlvX2J1ZiAqcGJ1ZjsKIAlzdHJ1Y3Qgc2VuZF9jb250ZXh0ICpjdHh0ID0gcXBfdG9fc2VuZF9jb250ZXh0KHFwLCBzYzUpOwogCXN0cnVjdCBoZmkxX3Bwb3J0ZGF0YSAqcHBkID0gcHBkX2Zyb21faWJwKGlicCk7CkBAIC01NTksOCArNTU5LDggQEAKIAogLyoKICAqIG9wYV9zbXBfY2hlY2soKSAtIERvIHRoZSByZWd1bGFyIHBrZXkgY2hlY2tpbmcsIGFuZCB0aGUgYWRkaXRpb25hbAotICogY2hlY2tzIGZvciBTTVBzIHNwZWNpZmllZCBpbiBPUEF2MSByZXYgMC45MCwgc2VjdGlvbiA5LjEwLjI2Ci0gKiAoIlNNQSBQYWNrZXQgQ2hlY2tzIikuCisgKiBjaGVja3MgZm9yIFNNUHMgc3BlY2lmaWVkIGluIE9QQXYxIHJldiAxLjAsIDkvMTkvMjAxNiB1cGRhdGUsIHNlY3Rpb24KKyAqIDkuMTAuMjUgKCJTTUEgUGFja2V0IENoZWNrcyIpLgogICoKICAqIE5vdGUgdGhhdDoKICAqICAgLSBDaGVja3MgYXJlIGRvbmUgdXNpbmcgdGhlIHBrZXkgZGlyZWN0bHkgZnJvbSB0aGUgcGFja2V0J3MgQlRILApAQCAtNjAzLDIzICs2MDMsMjggQEAKIAogCS8qCiAJICogU01QcyBmYWxsIGludG8gb25lIG9mIGZvdXIgKGRpc2pvaW50KSBjYXRlZ29yaWVzOgotCSAqIFNNQSByZXF1ZXN0LCBTTUEgcmVzcG9uc2UsIHRyYXAsIG9yIHRyYXAgcmVwcmVzcy4KLQkgKiBPdXIgcmVzcG9uc2UgZGVwZW5kcywgaW4gcGFydCwgb24gd2hpY2ggdHlwZSBvZgotCSAqIFNNUCB3ZSdyZSBwcm9jZXNzaW5nLgorCSAqIFNNQSByZXF1ZXN0LCBTTUEgcmVzcG9uc2UsIFNNQSB0cmFwLCBvciBTTUEgdHJhcCByZXByZXNzLgorCSAqIE91ciByZXNwb25zZSBkZXBlbmRzLCBpbiBwYXJ0LCBvbiB3aGljaCB0eXBlIG9mIFNNUCB3ZSdyZQorCSAqIHByb2Nlc3NpbmcuCiAJICoKLQkgKiBJZiB0aGlzIGlzIG5vdCBhbiBTTUEgcmVxdWVzdCwgb3IgdHJhcCByZXByZXNzOgotCSAqICAgLSBhY2NlcHQgTUFEIGlmIHRoZSBwb3J0IGlzIHJ1bm5pbmcgYW4gU00KLQkgKiAgIC0gcGtleSA9PSBGVUxMX01HTVRfUF9LRVkgPT4KLQkgKiAgICAgICByZXBseSB3aXRoIHVuc3VwcG9ydGVkIG1ldGhvZCAoaS5lLiwganVzdCBtYXJrCi0JICogICAgICAgdGhlIHNtcCdzIHN0YXR1cyBmaWVsZCBoZXJlLCBhbmQgbGV0IGl0IGJlCi0JICogICAgICAgcHJvY2Vzc2VkIG5vcm1hbGx5KQotCSAqICAgLSBwa2V5ICE9IExJTV9NR01UX1BfS0VZID0+Ci0JICogICAgICAgaW5jcmVtZW50IHBvcnQgcmVjdiBjb25zdHJhaW50IGVycm9ycywgZHJvcCBNQUQKLQkgKiBJZiB0aGlzIGlzIGFuIFNNQSByZXF1ZXN0IG9yIHRyYXAgcmVwcmVzczoKKwkgKiBJZiB0aGlzIGlzIGFuIFNNQSByZXNwb25zZSwgc2tpcCB0aGUgY2hlY2sgaGVyZS4KKwkgKgorCSAqIElmIHRoaXMgaXMgYW4gU01BIHJlcXVlc3Qgb3IgU01BIHRyYXAgcmVwcmVzczoKIAkgKiAgIC0gcGtleSAhPSBGVUxMX01HTVRfUF9LRVkgPT4KIAkgKiAgICAgICBpbmNyZW1lbnQgcG9ydCByZWN2IGNvbnN0cmFpbnQgZXJyb3JzLCBkcm9wIE1BRAorCSAqCisJICogT3RoZXJ3aXNlOgorCSAqICAgIC0gYWNjZXB0IGlmIHRoZSBwb3J0IGlzIHJ1bm5pbmcgYW4gU00KKwkgKiAgICAtIGRyb3AgTUFEIGlmIGl0J3MgYW4gU01BIHRyYXAKKwkgKiAgICAtIHBrZXkgPT0gRlVMTF9NR01UX1BfS0VZID0+CisJICogICAgICAgIHJlcGx5IHdpdGggdW5zdXBwb3J0ZWQgbWV0aG9kCisJICogICAgLSBwa2V5ICE9IEZVTExfTUdNVF9QX0tFWSA9PgorCSAqCSAgaW5jcmVtZW50IHBvcnQgcmVjdiBjb25zdHJhaW50IGVycm9ycywgZHJvcCBNQUQKIAkgKi8KIAlzd2l0Y2ggKHNtcC0+bWV0aG9kKSB7CisJY2FzZSBJQl9NR01UX01FVEhPRF9HRVRfUkVTUDoKKwljYXNlIElCX01HTVRfTUVUSE9EX1JFUE9SVF9SRVNQOgorCQlicmVhazsKIAljYXNlIElCX01HTVRfTUVUSE9EX0dFVDoKIAljYXNlIElCX01HTVRfTUVUSE9EX1NFVDoKIAljYXNlIElCX01HTVRfTUVUSE9EX1JFUE9SVDoKQEAgLTYyOSwyMyArNjM0LDE3IEBACiAJCQlyZXR1cm4gMTsKIAkJfQogCQlicmVhazsKLQljYXNlIElCX01HTVRfTUVUSE9EX1NFTkQ6Ci0JY2FzZSBJQl9NR01UX01FVEhPRF9UUkFQOgotCWNhc2UgSUJfTUdNVF9NRVRIT0RfR0VUX1JFU1A6Ci0JY2FzZSBJQl9NR01UX01FVEhPRF9SRVBPUlRfUkVTUDoKKwlkZWZhdWx0OgogCQlpZiAoaWJwLT5ydnAucG9ydF9jYXBfZmxhZ3MgJiBJQl9QT1JUX1NNKQogCQkJcmV0dXJuIDA7CisJCWlmIChzbXAtPm1ldGhvZCA9PSBJQl9NR01UX01FVEhPRF9UUkFQKQorCQkJcmV0dXJuIDE7CiAJCWlmIChwa2V5ID09IEZVTExfTUdNVF9QX0tFWSkgewogCQkJc21wLT5zdGF0dXMgfD0gSUJfU01QX1VOU1VQX01FVEhPRDsKIAkJCXJldHVybiAwOwogCQl9Ci0JCWlmIChwa2V5ICE9IExJTV9NR01UX1BfS0VZKSB7Ci0JCQlpbmdyZXNzX3BrZXlfdGFibGVfZmFpbChwcGQsIHBrZXksIHNsaWQpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CisJCWluZ3Jlc3NfcGtleV90YWJsZV9mYWlsKHBwZCwgcGtleSwgc2xpZCk7CisJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTY2NSw3ICs2NjQsNyBAQAogICovCiB2b2lkIGhmaTFfdWRfcmN2KHN0cnVjdCBoZmkxX3BhY2tldCAqcGFja2V0KQogewotCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHIgPSBwYWNrZXQtPm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIgPSBwYWNrZXQtPm9oZHI7CiAJaW50IG9wY29kZTsKIAl1MzIgaGRyc2l6ZSA9IHBhY2tldC0+aGxlbjsKIAlzdHJ1Y3QgaWJfd2Mgd2M7CkBAIC02NzUsMTMgKzY3NCwxMyBAQAogCWludCBtZ210X3BrZXlfaWR4ID0gLTE7CiAJc3RydWN0IGhmaTFfaWJwb3J0ICppYnAgPSAmcGFja2V0LT5yY2QtPnBwZC0+aWJwb3J0X2RhdGE7CiAJc3RydWN0IGhmaTFfcHBvcnRkYXRhICpwcGQgPSBwcGRfZnJvbV9pYnAoaWJwKTsKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciA9IHBhY2tldC0+aGRyOworCXN0cnVjdCBpYl9oZWFkZXIgKmhkciA9IHBhY2tldC0+aGRyOwogCXUzMiByY3ZfZmxhZ3MgPSBwYWNrZXQtPnJjdl9mbGFnczsKIAl2b2lkICpkYXRhID0gcGFja2V0LT5lYnVmOwogCXUzMiB0bGVuID0gcGFja2V0LT50bGVuOwogCXN0cnVjdCBydnRfcXAgKnFwID0gcGFja2V0LT5xcDsKIAlib29sIGhhc19ncmggPSByY3ZfZmxhZ3MgJiBIRkkxX0hBU19HUkg7Ci0JdTggc2M1ID0gaGRyMnNjKChzdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqKWhkciwgcGFja2V0LT5yaGYpOworCXU4IHNjNSA9IGhkcjJzYyhoZHIsIHBhY2tldC0+cmhmKTsKIAl1MzIgYnRoMTsKIAl1OCBzbF9mcm9tX3NjLCBzbDsKIAl1MTYgc2xpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3VzZXJfc2RtYS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdXNlcl9zZG1hLmMKaW5kZXggMGVjZjI3OS4uYTc2MWY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdXNlcl9zZG1hLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdXNlcl9zZG1hLmMKQEAgLTExNCw2ICsxMTQsOCBAQAogI2RlZmluZSBLREVUSF9IQ1JDX0xPV0VSX1NISUZUICAgIDI0CiAjZGVmaW5lIEtERVRIX0hDUkNfTE9XRVJfTUFTSyAgICAgMHhmZgogCisjZGVmaW5lIEFIR19LREVUSF9JTlRSX1NISUZUIDEyCisKICNkZWZpbmUgUEJDMkxSSCh4KSAoKCgoeCkgJiAweGZmZikgPDwgMikgLSA0KQogI2RlZmluZSBMUkgyUEJDKHgpICgoKCh4KSA+PiAyKSArIDEpICYgMHhmZmYpCiAKQEAgLTU0Niw3ICs1NDgsNyBAQAogCXU4IG9wY29kZSwgc2MsIHZsOwogCWludCByZXFfcXVldWVkID0gMDsKIAl1MTYgZGxpZDsKLQl1OCBzZWxlY3RvcjsKKwl1MzIgc2VsZWN0b3I7CiAKIAlpZiAoaW92ZWNbaWR4XS5pb3ZfbGVuIDwgc2l6ZW9mKGluZm8pICsgc2l6ZW9mKHJlcS0+aGRyKSkgewogCQloZmkxX2NkYmcoCkBAIC03NTEsMTIgKzc1Myw5IEBACiAKIAlkbGlkID0gYmUxNl90b19jcHUocmVxLT5oZHIubHJoWzFdKTsKIAlzZWxlY3RvciA9IGRsaWRfdG9fc2VsZWN0b3IoZGxpZCk7CisJc2VsZWN0b3IgKz0gdWN0eHQtPmN0eHQgKyBmZC0+c3ViY3R4dDsKKwlyZXEtPnNkZSA9IHNkbWFfc2VsZWN0X3VzZXJfZW5naW5lKGRkLCBzZWxlY3RvciwgdmwpOwogCi0JLyogSGF2ZSB0byBzZWxlY3QgdGhlIGVuZ2luZSAqLwotCXJlcS0+c2RlID0gc2RtYV9zZWxlY3RfZW5naW5lX3ZsKGRkLAotCQkJCQkgKHUzMikodWN0eHQtPmN0eHQgKyBmZC0+c3ViY3R4dCArCi0JCQkJCSAgICAgICBzZWxlY3RvciksCi0JCQkJCSB2bCk7CiAJaWYgKCFyZXEtPnNkZSB8fCAhc2RtYV9ydW5uaW5nKHJlcS0+c2RlKSkgewogCQlyZXQgPSAtRUNPTU07CiAJCWdvdG8gZnJlZV9yZXE7CkBAIC04OTIsNyArODkxLDcgQEAKIAogc3RhdGljIGludCB1c2VyX3NkbWFfc2VuZF9wa3RzKHN0cnVjdCB1c2VyX3NkbWFfcmVxdWVzdCAqcmVxLCB1bnNpZ25lZCBtYXhwa3RzKQogewotCWludCByZXQgPSAwOworCWludCByZXQgPSAwLCBjb3VudDsKIAl1bnNpZ25lZCBucGt0cyA9IDA7CiAJc3RydWN0IHVzZXJfc2RtYV90eHJlcSAqdHggPSBOVUxMOwogCXN0cnVjdCBoZmkxX3VzZXJfc2RtYV9wa3RfcSAqcHEgPSBOVUxMOwpAQCAtMTA4OCwyMyArMTA4NywxOCBAQAogCQlucGt0cysrOwogCX0KIGRvc2VuZDoKLQlyZXQgPSBzZG1hX3NlbmRfdHhsaXN0KHJlcS0+c2RlLCAmcHEtPmJ1c3ksICZyZXEtPnR4cHMpOwotCWlmIChsaXN0X2VtcHR5KCZyZXEtPnR4cHMpKSB7Ci0JCXJlcS0+c2Vxc3VibWl0dGVkID0gcmVxLT5zZXFudW07Ci0JCWlmIChyZXEtPnNlcW51bSA9PSByZXEtPmluZm8ubnBrdHMpIHsKLQkJCXNldF9iaXQoU0RNQV9SRVFfU0VORF9ET05FLCAmcmVxLT5mbGFncyk7Ci0JCQkvKgotCQkJICogVGhlIHR4cmVxIGhhcyBhbHJlYWR5IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBIVyBxdWV1ZQotCQkJICogc28gd2UgY2FuIGZyZWUgdGhlIEFIRyBlbnRyeSBub3cuIENvcnJ1cHRpb24gd2lsbCBub3QKLQkJCSAqIGhhcHBlbiBkdWUgdG8gdGhlIHNlcXVlbnRpYWwgbWFubmVyIGluIHdoaWNoCi0JCQkgKiBkZXNjcmlwdG9ycyBhcmUgcHJvY2Vzc2VkLgotCQkJICovCi0JCQlpZiAodGVzdF9iaXQoU0RNQV9SRVFfSEFWRV9BSEcsICZyZXEtPmZsYWdzKSkKLQkJCQlzZG1hX2FoZ19mcmVlKHJlcS0+c2RlLCByZXEtPmFoZ19pZHgpOwotCQl9Ci0JfSBlbHNlIGlmIChyZXQgPiAwKSB7Ci0JCXJlcS0+c2Vxc3VibWl0dGVkICs9IHJldDsKLQkJcmV0ID0gMDsKKwlyZXQgPSBzZG1hX3NlbmRfdHhsaXN0KHJlcS0+c2RlLCAmcHEtPmJ1c3ksICZyZXEtPnR4cHMsICZjb3VudCk7CisJcmVxLT5zZXFzdWJtaXR0ZWQgKz0gY291bnQ7CisJaWYgKHJlcS0+c2Vxc3VibWl0dGVkID09IHJlcS0+aW5mby5ucGt0cykgeworCQlzZXRfYml0KFNETUFfUkVRX1NFTkRfRE9ORSwgJnJlcS0+ZmxhZ3MpOworCQkvKgorCQkgKiBUaGUgdHhyZXEgaGFzIGFscmVhZHkgYmVlbiBzdWJtaXR0ZWQgdG8gdGhlIEhXIHF1ZXVlCisJCSAqIHNvIHdlIGNhbiBmcmVlIHRoZSBBSEcgZW50cnkgbm93LiBDb3JydXB0aW9uIHdpbGwgbm90CisJCSAqIGhhcHBlbiBkdWUgdG8gdGhlIHNlcXVlbnRpYWwgbWFubmVyIGluIHdoaWNoCisJCSAqIGRlc2NyaXB0b3JzIGFyZSBwcm9jZXNzZWQuCisJCSAqLworCQlpZiAodGVzdF9iaXQoU0RNQV9SRVFfSEFWRV9BSEcsICZyZXEtPmZsYWdzKSkKKwkJCXNkbWFfYWhnX2ZyZWUocmVxLT5zZGUsIHJlcS0+YWhnX2lkeCk7CiAJfQogCXJldHVybiByZXQ7CiAKQEAgLTE0ODAsNyArMTQ3NCw4IEBACiAJCS8qIENsZWFyIEtERVRILlNIIG9uIGxhc3QgcGFja2V0ICovCiAJCWlmICh1bmxpa2VseSh0eC0+ZmxhZ3MgJiBUWFJFUV9GTEFHU19SRVFfTEFTVF9QS1QpKSB7CiAJCQl2YWwgfD0gY3B1X3RvX2xlMTYoS0RFVEhfR0VUKGhkci0+a2RldGgudmVyX3RpZF9vZmZzZXQsCi0JCQkJCQkJCUlOVFIpID4+IDE2KTsKKwkJCQkJCSAgICAgSU5UUikgPDwKKwkJCQkJICAgQUhHX0tERVRIX0lOVFJfU0hJRlQpOwogCQkJdmFsICY9IGNwdV90b19sZTE2KH4oMVUgPDwgMTMpKTsKIAkJCUFIR19IRUFERVJfU0VUKHJlcS0+YWhnLCBkaWZmLCA3LCAxNiwgMTQsIHZhbCk7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJicy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdmVyYnMuYwppbmRleCAyYjM1OTU0Li5mMmY2YjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJicy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzLmMKQEAgLTc2LDcgKzc2LDcgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChtYXhfYWhzLCBoZmkxX21heF9haHMsIHVpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhtYXhfYWhzLCAiTWF4aW11bSBudW1iZXIgb2YgYWRkcmVzcyBoYW5kbGVzIHRvIHN1cHBvcnQiKTsKIAotdW5zaWduZWQgaW50IGhmaTFfbWF4X2NxZXMgPSAweDJGRkZGOwordW5zaWduZWQgaW50IGhmaTFfbWF4X2NxZXMgPSAweDJGRkZGRjsKIG1vZHVsZV9wYXJhbV9uYW1lZChtYXhfY3FlcywgaGZpMV9tYXhfY3FlcywgdWludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG1heF9jcWVzLAogCQkgIk1heGltdW0gbnVtYmVyIG9mIGNvbXBsZXRpb24gcXVldWUgZW50cmllcyB0byBzdXBwb3J0Iik7CkBAIC04OSw3ICs4OSw3IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQobWF4X3FwX3dycywgaGZpMV9tYXhfcXBfd3JzLCB1aW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MobWF4X3FwX3dycywgIk1heGltdW0gbnVtYmVyIG9mIFFQIFdScyB0byBzdXBwb3J0Iik7CiAKLXVuc2lnbmVkIGludCBoZmkxX21heF9xcHMgPSAxNjM4NDsKK3Vuc2lnbmVkIGludCBoZmkxX21heF9xcHMgPSAzMjc2ODsKIG1vZHVsZV9wYXJhbV9uYW1lZChtYXhfcXBzLCBoZmkxX21heF9xcHMsIHVpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhtYXhfcXBzLCAiTWF4aW11bSBudW1iZXIgb2YgUVBzIHRvIHN1cHBvcnQiKTsKIApAQCAtMzM1LDcgKzMzNSw3IEBACiAJW0lCX09QQ09ERV9SQ19SRE1BX1JFQURfUkVTUE9OU0VfTEFTVF0gICAgICAgID0gMTIgKyA4ICsgNCwKIAlbSUJfT1BDT0RFX1JDX1JETUFfUkVBRF9SRVNQT05TRV9PTkxZXSAgICAgICAgPSAxMiArIDggKyA0LAogCVtJQl9PUENPREVfUkNfQUNLTk9XTEVER0VdICAgICAgICAgICAgICAgICAgICA9IDEyICsgOCArIDQsCi0JW0lCX09QQ09ERV9SQ19BVE9NSUNfQUNLTk9XTEVER0VdICAgICAgICAgICAgID0gMTIgKyA4ICsgNCwKKwlbSUJfT1BDT0RFX1JDX0FUT01JQ19BQ0tOT1dMRURHRV0gICAgICAgICAgICAgPSAxMiArIDggKyA0ICsgOCwKIAlbSUJfT1BDT0RFX1JDX0NPTVBBUkVfU1dBUF0gICAgICAgICAgICAgICAgICAgPSAxMiArIDggKyAyOCwKIAlbSUJfT1BDT0RFX1JDX0ZFVENIX0FERF0gICAgICAgICAgICAgICAgICAgICAgPSAxMiArIDggKyAyOCwKIAlbSUJfT1BDT0RFX1JDX1NFTkRfTEFTVF9XSVRIX0lOVkFMSURBVEVdICAgICAgPSAxMiArIDggKyA0LApAQCAtNDAzLDYgKzQwMywyOCBAQAogCVtJQl9PUENPREVfQ05QXQkJCQkgICAgICA9ICZoZmkxX2NucF9yY3YKIH07CiAKKyNkZWZpbmUgT1BNQVNLIDB4MWYKKworc3RhdGljIGNvbnN0IHUzMiBwaW9fb3BtYXNrW0JJVCgzKV0gPSB7CisJLyogUkMgKi8KKwlbSUJfT1BDT0RFX1JDID4+IDVdID0KKwkJQklUKFJDX09QKFNFTkRfT05MWSkgJiBPUE1BU0spIHwKKwkJQklUKFJDX09QKFNFTkRfT05MWV9XSVRIX0lNTUVESUFURSkgJiBPUE1BU0spIHwKKwkJQklUKFJDX09QKFJETUFfV1JJVEVfT05MWSkgJiBPUE1BU0spIHwKKwkJQklUKFJDX09QKFJETUFfV1JJVEVfT05MWV9XSVRIX0lNTUVESUFURSkgJiBPUE1BU0spIHwKKwkJQklUKFJDX09QKFJETUFfUkVBRF9SRVFVRVNUKSAmIE9QTUFTSykgfAorCQlCSVQoUkNfT1AoQUNLTk9XTEVER0UpICYgT1BNQVNLKSB8CisJCUJJVChSQ19PUChBVE9NSUNfQUNLTk9XTEVER0UpICYgT1BNQVNLKSB8CisJCUJJVChSQ19PUChDT01QQVJFX1NXQVApICYgT1BNQVNLKSB8CisJCUJJVChSQ19PUChGRVRDSF9BREQpICYgT1BNQVNLKSwKKwkvKiBVQyAqLworCVtJQl9PUENPREVfVUMgPj4gNV0gPQorCQlCSVQoVUNfT1AoU0VORF9PTkxZKSAmIE9QTUFTSykgfAorCQlCSVQoVUNfT1AoU0VORF9PTkxZX1dJVEhfSU1NRURJQVRFKSAmIE9QTUFTSykgfAorCQlCSVQoVUNfT1AoUkRNQV9XUklURV9PTkxZKSAmIE9QTUFTSykgfAorCQlCSVQoVUNfT1AoUkRNQV9XUklURV9PTkxZX1dJVEhfSU1NRURJQVRFKSAmIE9QTUFTSyksCit9OworCiAvKgogICogU3lzdGVtIGltYWdlIEdVSUQuCiAgKi8KQEAgLTU2Nyw3ICs1ODksNyBAQAogdm9pZCBoZmkxX2liX3JjdihzdHJ1Y3QgaGZpMV9wYWNrZXQgKnBhY2tldCkKIHsKIAlzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqcmNkID0gcGFja2V0LT5yY2Q7Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoZHIgPSBwYWNrZXQtPmhkcjsKIAl1MzIgdGxlbiA9IHBhY2tldC0+dGxlbjsKIAlzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCA9IHJjZC0+cHBkOwogCXN0cnVjdCBoZmkxX2licG9ydCAqaWJwID0gJnBwZC0+aWJwb3J0X2RhdGE7CkBAIC03MTksNyArNzQxLDcgQEAKIAlpZiAodHgtPndxZSkgewogCQloZmkxX3NlbmRfY29tcGxldGUocXAsIHR4LT53cWUsIElCX1dDX1NVQ0NFU1MpOwogCX0gZWxzZSBpZiAocXAtPmlicXAucXBfdHlwZSA9PSBJQl9RUFRfUkMpIHsKLQkJc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoZHI7CisJCXN0cnVjdCBpYl9oZWFkZXIgKmhkcjsKIAogCQloZHIgPSAmdHgtPnBoZHIuaGRyOwogCQloZmkxX3JjX3NlbmRfY29tcGxldGUocXAsIGhkcik7CkBAIC03NDgsNyArNzcwLDcgQEAKIAkJCXFwLT5zX2ZsYWdzIHw9IFJWVF9TX1dBSVRfS01FTTsKIAkJCWxpc3RfYWRkX3RhaWwoJnByaXYtPnNfaW93YWl0Lmxpc3QsICZkZXYtPm1lbXdhaXQpOwogCQkJdHJhY2VfaGZpMV9xcHNsZWVwKHFwLCBSVlRfU19XQUlUX0tNRU0pOwotCQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJCXJ2dF9nZXRfcXAocXApOwogCQl9CiAJCXdyaXRlX3NlcXVubG9jaygmZGV2LT5pb3dhaXRfbG9jayk7CiAJCXFwLT5zX2ZsYWdzICY9IH5SVlRfU19CVVNZOwpAQCAtOTU5LDcgKzk4MSw3IEBACiAJCQl3YXNfZW1wdHkgPSBsaXN0X2VtcHR5KCZzYy0+cGlvd2FpdCk7CiAJCQlsaXN0X2FkZF90YWlsKCZwcml2LT5zX2lvd2FpdC5saXN0LCAmc2MtPnBpb3dhaXQpOwogCQkJdHJhY2VfaGZpMV9xcHNsZWVwKHFwLCBSVlRfU19XQUlUX1BJTyk7Ci0JCQlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworCQkJcnZ0X2dldF9xcChxcCk7CiAJCQkvKiBjb3VudGluZzogb25seSBjYWxsIHdhbnRwaW9idWZfaW50ciBpZiBmaXJzdCB1c2VyICovCiAJCQlpZiAod2FzX2VtcHR5KQogCQkJCWhmaTFfc2Nfd2FudHBpb2J1Zl9pbnRyKHNjLCAxKTsKQEAgLTEyMDAsNyArMTIyMiw3IEBACiB7CiAJc3RydWN0IGhmaTFfZGV2ZGF0YSAqZGQgPSBkZF9mcm9tX2liZGV2KHFwLT5pYnFwLmRldmljZSk7CiAJc3RydWN0IGhmaTFfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwotCXN0cnVjdCBoZmkxX2liX2hlYWRlciAqaCA9ICZ0eC0+cGhkci5oZHI7CisJc3RydWN0IGliX2hlYWRlciAqaCA9ICZ0eC0+cGhkci5oZHI7CiAKIAlpZiAodW5saWtlbHkoIShkZC0+ZmxhZ3MgJiBIRkkxX0hBU19TRU5EX0RNQSkpKQogCQlyZXR1cm4gZGQtPnByb2Nlc3NfcGlvX3NlbmQ7CkBAIC0xMjEwLDIyICsxMjMyLDE4IEBACiAJY2FzZSBJQl9RUFRfR1NJOgogCWNhc2UgSUJfUVBUX1VEOgogCQlicmVhazsKLQljYXNlIElCX1FQVF9SQzoKLQkJaWYgKHBpb3RocmVzaG9sZCAmJgotCQkgICAgcXAtPnNfY3VyX3NpemUgPD0gbWluKHBpb3RocmVzaG9sZCwgcXAtPnBtdHUpICYmCi0JCSAgICAoQklUKGdldF9vcGNvZGUoaCkgJiAweDFmKSAmIHJjX29ubHlfb3Bjb2RlKSAmJgotCQkgICAgaW93YWl0X3NkbWFfcGVuZGluZygmcHJpdi0+c19pb3dhaXQpID09IDAgJiYKLQkJICAgICFzZG1hX3R4cmVxX2J1aWx0KCZ0eC0+dHhyZXEpKQotCQkJcmV0dXJuIGRkLT5wcm9jZXNzX3Bpb19zZW5kOwotCQlicmVhazsKIAljYXNlIElCX1FQVF9VQzoKKwljYXNlIElCX1FQVF9SQzogeworCQl1OCBvcCA9IGdldF9vcGNvZGUoaCk7CisKIAkJaWYgKHBpb3RocmVzaG9sZCAmJgogCQkgICAgcXAtPnNfY3VyX3NpemUgPD0gbWluKHBpb3RocmVzaG9sZCwgcXAtPnBtdHUpICYmCi0JCSAgICAoQklUKGdldF9vcGNvZGUoaCkgJiAweDFmKSAmIHVjX29ubHlfb3Bjb2RlKSAmJgorCQkgICAgKEJJVChvcCAmIE9QTUFTSykgJiBwaW9fb3BtYXNrW29wID4+IDVdKSAmJgogCQkgICAgaW93YWl0X3NkbWFfcGVuZGluZygmcHJpdi0+c19pb3dhaXQpID09IDAgJiYKIAkJICAgICFzZG1hX3R4cmVxX2J1aWx0KCZ0eC0+dHhyZXEpKQogCQkJcmV0dXJuIGRkLT5wcm9jZXNzX3Bpb19zZW5kOwogCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMTI0NCw4ICsxMjYyLDggQEAKIHsKIAlzdHJ1Y3QgaGZpMV9kZXZkYXRhICpkZCA9IGRkX2Zyb21faWJkZXYocXAtPmlicXAuZGV2aWNlKTsKIAlzdHJ1Y3QgaGZpMV9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7Ci0Jc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyAqb2hkcjsKLQlzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoZHI7CiAJc2VuZF9yb3V0aW5lIHNyOwogCWludCByZXQ7CiAJdTggbG5oOwpAQCAtMTc1NCw3ICsxNzcyLDcgQEAKIHsKIAlzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCA9ICZwYWNrZXQtPnJjZC0+cHBkLT5pYnBvcnRfZGF0YTsKIAlzdHJ1Y3QgaGZpMV9wcG9ydGRhdGEgKnBwZCA9IHBwZF9mcm9tX2licChpYnApOwotCXN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyID0gcGFja2V0LT5oZHI7CisJc3RydWN0IGliX2hlYWRlciAqaGRyID0gcGFja2V0LT5oZHI7CiAJc3RydWN0IHJ2dF9xcCAqcXAgPSBwYWNrZXQtPnFwOwogCXUzMiBscXBuLCBycXBuID0gMDsKIAl1MTYgcmxpZCA9IDA7CkBAIC0xNzgxLDcgKzE3OTksNyBAQAogCQlyZXR1cm47CiAJfQogCi0Jc2M1ID0gaGRyMnNjKChzdHJ1Y3QgaGZpMV9tZXNzYWdlX2hlYWRlciAqKWhkciwgcGFja2V0LT5yaGYpOworCXNjNSA9IGhkcjJzYyhoZHIsIHBhY2tldC0+cmhmKTsKIAlzbCA9IGlicC0+c2NfdG9fc2xbc2M1XTsKIAlscXBuID0gcXAtPmlicXAucXBfbnVtOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJicy5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdmVyYnMuaAppbmRleCBkMWIxMDFjLi4xYzM4MTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJicy5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzLmgKQEAgLTYwLDYgKzYwLDcgQEAKICNpbmNsdWRlIDxyZG1hL2liX3BhY2suaD4KICNpbmNsdWRlIDxyZG1hL2liX3VzZXJfdmVyYnMuaD4KICNpbmNsdWRlIDxyZG1hL2liX21hZC5oPgorI2luY2x1ZGUgPHJkbWEvaWJfaGRycy5oPgogI2luY2x1ZGUgPHJkbWEvcmRtYV92dC5oPgogI2luY2x1ZGUgPHJkbWEvcmRtYXZ0X3FwLmg+CiAjaW5jbHVkZSA8cmRtYS9yZG1hdnRfY3EuaD4KQEAgLTgwLDE2ICs4MSw2IEBACiAgKi8KICNkZWZpbmUgSEZJMV9VVkVSQlNfQUJJX1ZFUlNJT04gICAgICAgMgogCi0jZGVmaW5lIElCX1NFUV9OQUsJKDMgPDwgMjkpCi0KLS8qIEFFVEggTkFLIG9wY29kZSB2YWx1ZXMgKi8KLSNkZWZpbmUgSUJfUk5SX05BSyAgICAgICAgICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIElCX05BS19QU05fRVJST1IgICAgICAgICAgICAgICAgMHg2MAotI2RlZmluZSBJQl9OQUtfSU5WQUxJRF9SRVFVRVNUICAgICAgICAgIDB4NjEKLSNkZWZpbmUgSUJfTkFLX1JFTU9URV9BQ0NFU1NfRVJST1IgICAgICAweDYyCi0jZGVmaW5lIElCX05BS19SRU1PVEVfT1BFUkFUSU9OQUxfRVJST1IgMHg2MwotI2RlZmluZSBJQl9OQUtfSU5WQUxJRF9SRF9SRVFVRVNUICAgICAgIDB4NjQKLQogLyogSUIgUGVyZm9ybWFuY2UgTWFuYWdlciBzdGF0dXMgdmFsdWVzICovCiAjZGVmaW5lIElCX1BNQV9TQU1QTEVfU1RBVFVTX0RPTkUgICAgICAgMHgwMAogI2RlZmluZSBJQl9QTUFfU0FNUExFX1NUQVRVU19TVEFSVEVEICAgIDB4MDEKQEAgLTEwNCw4MCArOTUsMTYgQEAKIAogI2RlZmluZSBIRkkxX1ZFTkRPUl9JUEcJCWNwdV90b19iZTE2KDB4RkZBMCkKIAotI2RlZmluZSBJQl9CVEhfUkVRX0FDSwkJQklUKDMxKQotI2RlZmluZSBJQl9CVEhfU09MSUNJVEVECUJJVCgyMykKLSNkZWZpbmUgSUJfQlRIX01JR19SRVEJCUJJVCgyMikKLQotI2RlZmluZSBJQl9HUkhfVkVSU0lPTgkJNgotI2RlZmluZSBJQl9HUkhfVkVSU0lPTl9NQVNLCTB4RgotI2RlZmluZSBJQl9HUkhfVkVSU0lPTl9TSElGVAkyOAotI2RlZmluZSBJQl9HUkhfVENMQVNTX01BU0sJMHhGRgotI2RlZmluZSBJQl9HUkhfVENMQVNTX1NISUZUCTIwCi0jZGVmaW5lIElCX0dSSF9GTE9XX01BU0sJMHhGRkZGRgotI2RlZmluZSBJQl9HUkhfRkxPV19TSElGVAkwCi0jZGVmaW5lIElCX0dSSF9ORVhUX0hEUgkJMHgxQgotCiAjZGVmaW5lIElCX0RFRkFVTFRfR0lEX1BSRUZJWAljcHVfdG9fYmU2NCgweGZlODAwMDAwMDAwMDAwMDBVTEwpCiAKKyNkZWZpbmUgUkNfT1AoeCkgSUJfT1BDT0RFX1JDXyMjeAorI2RlZmluZSBVQ19PUCh4KSBJQl9PUENPREVfVUNfIyN4CisKIC8qIGZsYWdzIHBhc3NlZCBieSBoZmkxX2liX3JjdigpICovCiBlbnVtIHsKIAlIRkkxX0hBU19HUkggPSAoMSA8PCAwKSwKIH07CiAKLXN0cnVjdCBpYl9yZXRoIHsKLQlfX2JlNjQgdmFkZHI7Ci0JX19iZTMyIHJrZXk7Ci0JX19iZTMyIGxlbmd0aDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpYl9hdG9taWNfZXRoIHsKLQlfX2JlMzIgdmFkZHJbMl07ICAgICAgICAvKiB1bmFsaWduZWQgc28gYWNjZXNzIGFzIDIgMzItYml0IHdvcmRzICovCi0JX19iZTMyIHJrZXk7Ci0JX19iZTY0IHN3YXBfZGF0YTsKLQlfX2JlNjQgY29tcGFyZV9kYXRhOwotfSBfX3BhY2tlZDsKLQotdW5pb24gaWJfZWhkcnMgewotCXN0cnVjdCB7Ci0JCV9fYmUzMiBkZXRoWzJdOwotCQlfX2JlMzIgaW1tX2RhdGE7Ci0JfSB1ZDsKLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgaWJfcmV0aCByZXRoOwotCQlfX2JlMzIgaW1tX2RhdGE7Ci0JfSByYzsKLQlzdHJ1Y3QgewotCQlfX2JlMzIgYWV0aDsKLQkJX19iZTMyIGF0b21pY19hY2tfZXRoWzJdOwotCX0gYXQ7Ci0JX19iZTMyIGltbV9kYXRhOwotCV9fYmUzMiBhZXRoOwotCV9fYmUzMiBpZXRoOwotCXN0cnVjdCBpYl9hdG9taWNfZXRoIGF0b21pY19ldGg7Ci19ICBfX3BhY2tlZDsKLQotc3RydWN0IGhmaTFfb3RoZXJfaGVhZGVycyB7Ci0JX19iZTMyIGJ0aFszXTsKLQl1bmlvbiBpYl9laGRycyB1OwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIE5vdGUgdGhhdCBVRCBwYWNrZXRzIHdpdGggYSBHUkggaGVhZGVyIGFyZSA4KzQwKzEyKzggPSA2OCBieXRlcwotICogbG9uZyAoNzIgdy8gaW1tX2RhdGEpLiAgT25seSB0aGUgZmlyc3QgNTYgYnl0ZXMgb2YgdGhlIElCIGhlYWRlcgotICogd2lsbCBiZSBpbiB0aGUgZWFnZXIgaGVhZGVyIGJ1ZmZlci4gIFRoZSByZW1haW5pbmcgMTIgb3IgMTYgYnl0ZXMKLSAqIGFyZSBpbiB0aGUgZGF0YSBidWZmZXIuCi0gKi8KLXN0cnVjdCBoZmkxX2liX2hlYWRlciB7Ci0JX19iZTE2IGxyaFs0XTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlzdHJ1Y3QgaWJfZ3JoIGdyaDsKLQkJCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgb3RoOwotCQl9IGw7Ci0JCXN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgb3RoOwotCX0gdTsKLX0gX19wYWNrZWQ7Ci0KIHN0cnVjdCBoZmkxX2FoZ19pbmZvIHsKIAl1MzIgYWhnZGVzY1syXTsKIAl1MTYgdHhfZmxhZ3M7CkBAIC0xODcsNyArMTE0LDcgQEAKIAogc3RydWN0IGhmaTFfc2RtYV9oZWFkZXIgewogCV9fbGU2NCBwYmM7Ci0Jc3RydWN0IGhmaTFfaWJfaGVhZGVyIGhkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyIGhkcjsKIH0gX19wYWNrZWQ7CiAKIC8qCkBAIC0zODYsNyArMzEzLDcgQEAKIAogdm9pZCBoZmkxX3JjX2hkcmVycigKIAlzdHJ1Y3QgaGZpMV9jdHh0ZGF0YSAqcmNkLAotCXN0cnVjdCBoZmkxX2liX2hlYWRlciAqaGRyLAorCXN0cnVjdCBpYl9oZWFkZXIgKmhkciwKIAl1MzIgcmN2X2ZsYWdzLAogCXN0cnVjdCBydnRfcXAgKnFwKTsKIApAQCAtNDAwLDcgKzMyNyw3IEBACiB2b2lkIGhmaTFfZGVsX3RpbWVyc19zeW5jKHN0cnVjdCBydnRfcXAgKnFwKTsKIHZvaWQgaGZpMV9zdG9wX3JjX3RpbWVycyhzdHJ1Y3QgcnZ0X3FwICpxcCk7CiAKLXZvaWQgaGZpMV9yY19zZW5kX2NvbXBsZXRlKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkcik7Cit2b2lkIGhmaTFfcmNfc2VuZF9jb21wbGV0ZShzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX2hlYWRlciAqaGRyKTsKIAogdm9pZCBoZmkxX3JjX2Vycm9yKHN0cnVjdCBydnRfcXAgKnFwLCBlbnVtIGliX3djX3N0YXR1cyBlcnIpOwogCkBAIC00MjMsNyArMzUwLDcgQEAKIGV4dGVybiBjb25zdCB1MzIgcmNfb25seV9vcGNvZGU7CiBleHRlcm4gY29uc3QgdTMyIHVjX29ubHlfb3Bjb2RlOwogCi1zdGF0aWMgaW5saW5lIHU4IGdldF9vcGNvZGUoc3RydWN0IGhmaTFfaWJfaGVhZGVyICpoKQorc3RhdGljIGlubGluZSB1OCBnZXRfb3Bjb2RlKHN0cnVjdCBpYl9oZWFkZXIgKmgpCiB7CiAJdTE2IGxuaCA9IGJlMTZfdG9fY3B1KGgtPmxyaFswXSkgJiAzOwogCkBAIC00MzMsMTMgKzM2MCwxMyBAQAogCQlyZXR1cm4gYmUzMl90b19jcHUoaC0+dS5sLm90aC5idGhbMF0pID4+IDI0OwogfQogCi1pbnQgaGZpMV9ydWNfY2hlY2tfaGRyKHN0cnVjdCBoZmkxX2licG9ydCAqaWJwLCBzdHJ1Y3QgaGZpMV9pYl9oZWFkZXIgKmhkciwKK2ludCBoZmkxX3J1Y19jaGVja19oZHIoc3RydWN0IGhmaTFfaWJwb3J0ICppYnAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkciwKIAkJICAgICAgIGludCBoYXNfZ3JoLCBzdHJ1Y3QgcnZ0X3FwICpxcCwgdTMyIGJ0aDApOwogCiB1MzIgaGZpMV9tYWtlX2dyaChzdHJ1Y3QgaGZpMV9pYnBvcnQgKmlicCwgc3RydWN0IGliX2dyaCAqaGRyLAogCQkgIHN0cnVjdCBpYl9nbG9iYWxfcm91dGUgKmdyaCwgdTMyIGh3b3JkcywgdTMyIG53b3Jkcyk7CiAKLXZvaWQgaGZpMV9tYWtlX3J1Y19oZWFkZXIoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBoZmkxX290aGVyX2hlYWRlcnMgKm9oZHIsCit2b2lkIGhmaTFfbWFrZV9ydWNfaGVhZGVyKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKIAkJCSAgdTMyIGJ0aDAsIHUzMiBidGgyLCBpbnQgbWlkZGxlLAogCQkJICBzdHJ1Y3QgaGZpMV9wa3Rfc3RhdGUgKnBzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdmVyYnNfdHhyZXEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9oZmkxL3ZlcmJzX3R4cmVxLmMKaW5kZXggZDhmYjA1Ni4uMDk0YWI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2hmaTEvdmVyYnNfdHhyZXEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaGZpMS92ZXJic190eHJlcS5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJCXFwLT5zX2ZsYWdzIHw9IFJWVF9TX1dBSVRfVFg7CiAJCQlsaXN0X2FkZF90YWlsKCZwcml2LT5zX2lvd2FpdC5saXN0LCAmZGV2LT50eHdhaXQpOwogCQkJdHJhY2VfaGZpMV9xcHNsZWVwKHFwLCBSVlRfU19XQUlUX1RYKTsKLQkJCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCQlydnRfZ2V0X3FwKHFwKTsKIAkJfQogCQlxcC0+c19mbGFncyAmPSB+UlZUX1NfQlVTWTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfaHcuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd19ody5jCmluZGV4IDNlZTBjYWQuLjBjOTJhNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd19ody5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd19ody5jCkBAIC0yNjUsNiArMjY1LDcgQEAKIAkJaW5mby5kb250X3NlbmRfZmluID0gZmFsc2U7CiAJaWYgKGl3cXAtPnNjX3FwLnRlcm1fZmxhZ3MgJiYgKHN0YXRlID09IEk0MElXX1FQX1NUQVRFX0VSUk9SKSkKIAkJaW5mby5yZXNldF90Y3BfY29ubiA9IHRydWU7CisJaXdxcC0+aHdfaXdhcnBfc3RhdGUgPSBzdGF0ZTsKIAlpNDBpd19od19tb2RpZnlfcXAoaXdxcC0+aXdkZXYsIGl3cXAsICZpbmZvLCAwKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pNDBpdy9pNDBpd19tYWluLmMKaW5kZXggMGNiYmU0MC4uNDQ1ZTIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2k0MGl3L2k0MGl3X21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaTQwaXcvaTQwaXdfbWFpbi5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkubm90aWZpZXJfY2FsbCA9IGk0MGl3X25ldF9ldmVudAogfTsKIAotc3RhdGljIGludCBpNDBpd19ub3RpZmllcnNfcmVnaXN0ZXJlZDsKK3N0YXRpYyBhdG9taWNfdCBpNDBpd19ub3RpZmllcnNfcmVnaXN0ZXJlZDsKIAogLyoqCiAgKiBpNDBpd19maW5kX2k0MGVfaGFuZGxlciAtIGZpbmQgYSBoYW5kbGVyIGdpdmVuIGEgY2xpZW50IGluZm8KQEAgLTEzNDIsMTIgKzEzNDIsMTEgQEAKICAqLwogc3RhdGljIHZvaWQgaTQwaXdfcmVnaXN0ZXJfbm90aWZpZXJzKHZvaWQpCiB7Ci0JaWYgKCFpNDBpd19ub3RpZmllcnNfcmVnaXN0ZXJlZCkgeworCWlmIChhdG9taWNfaW5jX3JldHVybigmaTQwaXdfbm90aWZpZXJzX3JlZ2lzdGVyZWQpID09IDEpIHsKIAkJcmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJmk0MGl3X2luZXRhZGRyX25vdGlmaWVyKTsKIAkJcmVnaXN0ZXJfaW5ldDZhZGRyX25vdGlmaWVyKCZpNDBpd19pbmV0YWRkcjZfbm90aWZpZXIpOwogCQlyZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcigmaTQwaXdfbmV0X25vdGlmaWVyKTsKIAl9Ci0JaTQwaXdfbm90aWZpZXJzX3JlZ2lzdGVyZWQrKzsKIH0KIAogLyoqCkBAIC0xNDI5LDggKzE0MjgsNyBAQAogCQkJaTQwaXdfZGVsX21hY2lwX2VudHJ5KGl3ZGV2LCAodTgpaXdkZXYtPm1hY19pcF90YWJsZV9pZHgpOwogCQkvKiBmYWxsdGhyb3VnaCAqLwogCWNhc2UgSU5FVF9OT1RJRklFUjoKLQkJaWYgKGk0MGl3X25vdGlmaWVyc19yZWdpc3RlcmVkID4gMCkgewotCQkJaTQwaXdfbm90aWZpZXJzX3JlZ2lzdGVyZWQtLTsKKwkJaWYgKCFhdG9taWNfZGVjX3JldHVybigmaTQwaXdfbm90aWZpZXJzX3JlZ2lzdGVyZWQpKSB7CiAJCQl1bnJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZpNDBpd19uZXRfbm90aWZpZXIpOwogCQkJdW5yZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmaTQwaXdfaW5ldGFkZHJfbm90aWZpZXIpOwogCQkJdW5yZWdpc3Rlcl9pbmV0NmFkZHJfbm90aWZpZXIoJmk0MGl3X2luZXRhZGRyNl9ub3RpZmllcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvY3EuYwppbmRleCAwMDZkYjY0Li41ZGY2M2RhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L2NxLmMKQEAgLTY4NywxMiArNjg3LDYgQEAKIAlpc19lcnJvciA9IChjcWUtPm93bmVyX3NyX29wY29kZSAmIE1MWDRfQ1FFX09QQ09ERV9NQVNLKSA9PQogCQlNTFg0X0NRRV9PUENPREVfRVJST1I7CiAKLQlpZiAodW5saWtlbHkoKGNxZS0+b3duZXJfc3Jfb3Bjb2RlICYgTUxYNF9DUUVfT1BDT0RFX01BU0spID09IE1MWDRfT1BDT0RFX05PUCAmJgotCQkgICAgIGlzX3NlbmQpKSB7Ci0JCXByX3dhcm4oIkNvbXBsZXRpb24gZm9yIE5PUCBvcGNvZGUgZGV0ZWN0ZWQhXG4iKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCiAJLyogUmVzaXplIENRIGluIHByb2dyZXNzICovCiAJaWYgKHVubGlrZWx5KChjcWUtPm93bmVyX3NyX29wY29kZSAmIE1MWDRfQ1FFX09QQ09ERV9NQVNLKSA9PSBNTFg0X0NRRV9PUENPREVfUkVTSVpFKSkgewogCQlpZiAoY3EtPnJlc2l6ZV9idWYpIHsKQEAgLTcxOCwxMiArNzEyLDYgQEAKIAkJICovCiAJCW1xcCA9IF9fbWx4NF9xcF9sb29rdXAodG9fbWRldihjcS0+aWJjcS5kZXZpY2UpLT5kZXYsCiAJCQkJICAgICAgIGJlMzJfdG9fY3B1KGNxZS0+dmxhbl9teV9xcG4pKTsKLQkJaWYgKHVubGlrZWx5KCFtcXApKSB7Ci0JCQlwcl93YXJuKCJDUSAlMDZ4IHdpdGggZW50cnkgZm9yIHVua25vd24gUVBOICUwNnhcbiIsCi0JCQkgICAgICAgY3EtPm1jcS5jcW4sIGJlMzJfdG9fY3B1KGNxZS0+dmxhbl9teV9xcG4pICYgTUxYNF9DUUVfUVBOX01BU0spOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQogCQkqY3VyX3FwID0gdG9fbWlicXAobXFwKTsKIAl9CiAKQEAgLTczNiwxMSArNzI0LDYgQEAKIAkJLyogU1JRIGlzIGFsc28gaW4gdGhlIHJhZGl4IHRyZWUgKi8KIAkJbXNycSA9IG1seDRfc3JxX2xvb2t1cCh0b19tZGV2KGNxLT5pYmNxLmRldmljZSktPmRldiwKIAkJCQkgICAgICAgc3JxX251bSk7Ci0JCWlmICh1bmxpa2VseSghbXNycSkpIHsKLQkJCXByX3dhcm4oIkNRICUwNnggd2l0aCBlbnRyeSBmb3IgdW5rbm93biBTUlFOICUwNnhcbiIsCi0JCQkJY3EtPm1jcS5jcW4sIHNycV9udW0pOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KIAl9CiAKIAlpZiAoaXNfc2VuZCkgewpAQCAtODkxLDcgKzg3NCw2IEBACiAJc3RydWN0IG1seDRfaWJfcXAgKmN1cl9xcCA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbnBvbGxlZDsKLQlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgbWx4NF9pYl9kZXYgKm1kZXYgPSB0b19tZGV2KGNxLT5pYmNxLmRldmljZSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3EtPmxvY2ssIGZsYWdzKTsKQEAgLTkwMSw4ICs4ODMsNyBAQAogCX0KIAogCWZvciAobnBvbGxlZCA9IDA7IG5wb2xsZWQgPCBudW1fZW50cmllczsgKytucG9sbGVkKSB7Ci0JCWVyciA9IG1seDRfaWJfcG9sbF9vbmUoY3EsICZjdXJfcXAsIHdjICsgbnBvbGxlZCk7Ci0JCWlmIChlcnIpCisJCWlmIChtbHg0X2liX3BvbGxfb25lKGNxLCAmY3VyX3FwLCB3YyArIG5wb2xsZWQpKQogCQkJYnJlYWs7CiAJfQogCkBAIC05MTEsMTAgKzg5Miw3IEBACiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3EtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLUVBR0FJTikKLQkJcmV0dXJuIG5wb2xsZWQ7Ci0JZWxzZQotCQlyZXR1cm4gZXJyOworCXJldHVybiBucG9sbGVkOwogfQogCiBpbnQgbWx4NF9pYl9hcm1fY3Eoc3RydWN0IGliX2NxICppYmNxLCBlbnVtIGliX2NxX25vdGlmeV9mbGFncyBmbGFncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFkLmMKaW5kZXggOWMyZTUzZC4uMGYyMWMzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFkLmMKQEAgLTExMjgsNiArMTEyOCwyNyBAQAogCiAJCS8qIEdlbmVyYXRlIEdVSUQgY2hhbmdlZCBldmVudCAqLwogCQlpZiAoY2hhbmdlZF9hdHRyICYgTUxYNF9FUV9QT1JUX0lORk9fR0lEX1BGWF9DSEFOR0VfTUFTSykgeworCQkJaWYgKG1seDRfaXNfbWFzdGVyKGRldi0+ZGV2KSkgeworCQkJCXVuaW9uIGliX2dpZCBnaWQ7CisJCQkJaW50IGVyciA9IDA7CisKKwkJCQlpZiAoIWVxZS0+ZXZlbnQucG9ydF9tZ210X2NoYW5nZS5wYXJhbXMucG9ydF9pbmZvLmdpZF9wcmVmaXgpCisJCQkJCWVyciA9IF9fbWx4NF9pYl9xdWVyeV9naWQoJmRldi0+aWJfZGV2LCBwb3J0LCAwLCAmZ2lkLCAxKTsKKwkJCQllbHNlCisJCQkJCWdpZC5nbG9iYWwuc3VibmV0X3ByZWZpeCA9CisJCQkJCQllcWUtPmV2ZW50LnBvcnRfbWdtdF9jaGFuZ2UucGFyYW1zLnBvcnRfaW5mby5naWRfcHJlZml4OworCQkJCWlmIChlcnIpIHsKKwkJCQkJcHJfd2FybigiQ291bGQgbm90IGNoYW5nZSBRUDEgc3VibmV0IHByZWZpeCBmb3IgcG9ydCAlZDogcXVlcnlfZ2lkIGVycm9yICglZClcbiIsCisJCQkJCQlwb3J0LCBlcnIpOworCQkJCX0gZWxzZSB7CisJCQkJCXByX2RlYnVnKCJDaGFuZ2luZyBRUDEgc3VibmV0IHByZWZpeCBmb3IgcG9ydCAlZC4gb2xkPTB4JWxseC4gbmV3PTB4JWxseFxuIiwKKwkJCQkJCSBwb3J0LAorCQkJCQkJICh1NjQpYXRvbWljNjRfcmVhZCgmZGV2LT5zcmlvdi5kZW11eFtwb3J0IC0gMV0uc3VibmV0X3ByZWZpeCksCisJCQkJCQkgYmU2NF90b19jcHUoZ2lkLmdsb2JhbC5zdWJuZXRfcHJlZml4KSk7CisJCQkJCWF0b21pYzY0X3NldCgmZGV2LT5zcmlvdi5kZW11eFtwb3J0IC0gMV0uc3VibmV0X3ByZWZpeCwKKwkJCQkJCSAgICAgYmU2NF90b19jcHUoZ2lkLmdsb2JhbC5zdWJuZXRfcHJlZml4KSk7CisJCQkJfQorCQkJfQogCQkJbWx4NF9pYl9kaXNwYXRjaF9ldmVudChkZXYsIHBvcnQsIElCX0VWRU5UX0dJRF9DSEFOR0UpOwogCQkJLyppZiBtYXN0ZXIsIG5vdGlmeSBhbGwgc2xhdmVzKi8KIAkJCWlmIChtbHg0X2lzX21hc3RlcihkZXYtPmRldikpCkBAIC0yMjAyLDYgKzIyMjMsOCBAQAogCQlpZiAoZXJyKQogCQkJZ290byBkZW11eF9lcnI7CiAJCWRldi0+c3Jpb3YuZGVtdXhbaV0uZ3VpZF9jYWNoZVswXSA9IGdpZC5nbG9iYWwuaW50ZXJmYWNlX2lkOworCQlhdG9taWM2NF9zZXQoJmRldi0+c3Jpb3YuZGVtdXhbaV0uc3VibmV0X3ByZWZpeCwKKwkJCSAgICAgYmU2NF90b19jcHUoZ2lkLmdsb2JhbC5zdWJuZXRfcHJlZml4KSk7CiAJCWVyciA9IGFsbG9jX3B2X29iamVjdChkZXYsIG1seDRfbWFzdGVyX2Z1bmNfbnVtKGRldi0+ZGV2KSwgaSArIDEsCiAJCQkJICAgICAgJmRldi0+c3Jpb3Yuc3Fwc1tpXSk7CiAJCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMKaW5kZXggMmFmNDRjMi4uODdiYTliYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21haW4uYwpAQCAtMjIwMiw2ICsyMjAyLDkgQEAKIAlib29sIHBlcl9wb3J0ID0gISEoaWJkZXYtPmRldi0+Y2Fwcy5mbGFnczIgJgogCQlNTFg0X0RFVl9DQVBfRkxBRzJfRElBR19QRVJfUE9SVCk7CiAKKwlpZiAobWx4NF9pc19zbGF2ZShpYmRldi0+ZGV2KSkKKwkJcmV0dXJuIDA7CisKIAlmb3IgKGkgPSAwOyBpIDwgTUxYNF9ESUFHX0NPVU5URVJTX1RZUEVTOyBpKyspIHsKIAkJLyogaSA9PSAxIG1lYW5zIHdlIGFyZSBidWlsZGluZyBwb3J0IGNvdW50ZXJzICovCiAJCWlmIChpICYmICFwZXJfcG9ydCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21jZy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWNnLmMKaW5kZXggOGY3YWQwNy4uMDk3YmZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWNnLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWNnLmMKQEAgLTQ4OSw3ICs0ODksNyBAQAogCQlpZiAoIWdyb3VwLT5tZW1iZXJzW2ldKQogCQkJbGVhdmVfc3RhdGUgfD0gKDEgPDwgaSk7CiAKLQlyZXR1cm4gbGVhdmVfc3RhdGUgJiAoZ3JvdXAtPnJlYy5zY29wZV9qb2luX3N0YXRlICYgNyk7CisJcmV0dXJuIGxlYXZlX3N0YXRlICYgKGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDB4Zik7CiB9CiAKIHN0YXRpYyBpbnQgam9pbl9ncm91cChzdHJ1Y3QgbWNhc3RfZ3JvdXAgKmdyb3VwLCBpbnQgc2xhdmUsIHU4IGpvaW5fbWFzaykKQEAgLTU2NCw4ICs1NjQsOCBAQAogCQl9IGVsc2UKIAkJCW1jZ193YXJuX2dyb3VwKGdyb3VwLCAiRFJJVkVSIEJVR1xuIik7CiAJfSBlbHNlIGlmIChncm91cC0+c3RhdGUgPT0gTUNBU1RfTEVBVkVfU0VOVCkgewotCQlpZiAoZ3JvdXAtPnJlYy5zY29wZV9qb2luX3N0YXRlICYgNykKLQkJCWdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmPSAweGY4OworCQlpZiAoZ3JvdXAtPnJlYy5zY29wZV9qb2luX3N0YXRlICYgMHhmKQorCQkJZ3JvdXAtPnJlYy5zY29wZV9qb2luX3N0YXRlICY9IDB4ZjA7CiAJCWdyb3VwLT5zdGF0ZSA9IE1DQVNUX0lETEU7CiAJCW11dGV4X3VubG9jaygmZ3JvdXAtPmxvY2spOwogCQlpZiAocmVsZWFzZV9ncm91cChncm91cCwgMSkpCkBAIC02MDUsNyArNjA1LDcgQEAKIHN0YXRpYyBpbnQgaGFuZGxlX2pvaW5fcmVxKHN0cnVjdCBtY2FzdF9ncm91cCAqZ3JvdXAsIHU4IGpvaW5fbWFzaywKIAkJCSAgIHN0cnVjdCBtY2FzdF9yZXEgKnJlcSkKIHsKLQl1OCBncm91cF9qb2luX3N0YXRlID0gZ3JvdXAtPnJlYy5zY29wZV9qb2luX3N0YXRlICYgNzsKKwl1OCBncm91cF9qb2luX3N0YXRlID0gZ3JvdXAtPnJlYy5zY29wZV9qb2luX3N0YXRlICYgMHhmOwogCWludCByZWYgPSAwOwogCXUxNiBzdGF0dXM7CiAJc3RydWN0IGliX3NhX21jbWVtYmVyX2RhdGEgKnNhX2RhdGEgPSAoc3RydWN0IGliX3NhX21jbWVtYmVyX2RhdGEgKilyZXEtPnNhX21hZC5kYXRhOwpAQCAtNjkwLDggKzY5MCw4IEBACiAJCQl1OCBjdXJfam9pbl9zdGF0ZTsKIAogCQkJcmVzcF9qb2luX3N0YXRlID0gKChzdHJ1Y3QgaWJfc2FfbWNtZW1iZXJfZGF0YSAqKQotCQkJCQkJZ3JvdXAtPnJlc3BvbnNlX3NhX21hZC5kYXRhKS0+c2NvcGVfam9pbl9zdGF0ZSAmIDc7Ci0JCQljdXJfam9pbl9zdGF0ZSA9IGdyb3VwLT5yZWMuc2NvcGVfam9pbl9zdGF0ZSAmIDc7CisJCQkJCQlncm91cC0+cmVzcG9uc2Vfc2FfbWFkLmRhdGEpLT5zY29wZV9qb2luX3N0YXRlICYgMHhmOworCQkJY3VyX2pvaW5fc3RhdGUgPSBncm91cC0+cmVjLnNjb3BlX2pvaW5fc3RhdGUgJiAweGY7CiAKIAkJCWlmIChtZXRob2QgPT0gSUJfTUdNVF9NRVRIT0RfR0VUX1JFU1ApIHsKIAkJCQkvKiBzdWNjZXNzZnVsbCBqb2luICovCkBAIC03MTAsNyArNzEwLDcgQEAKIAkJcmVxID0gbGlzdF9maXJzdF9lbnRyeSgmZ3JvdXAtPnBlbmRpbmdfbGlzdCwgc3RydWN0IG1jYXN0X3JlcSwKIAkJCQkgICAgICAgZ3JvdXBfbGlzdCk7CiAJCXNhX2RhdGEgPSAoc3RydWN0IGliX3NhX21jbWVtYmVyX2RhdGEgKilyZXEtPnNhX21hZC5kYXRhOwotCQlyZXFfam9pbl9zdGF0ZSA9IHNhX2RhdGEtPnNjb3BlX2pvaW5fc3RhdGUgJiAweDc7CisJCXJlcV9qb2luX3N0YXRlID0gc2FfZGF0YS0+c2NvcGVfam9pbl9zdGF0ZSAmIDB4ZjsKIAogCQkvKiBGb3IgYSBsZWF2ZSByZXF1ZXN0LCB3ZSB3aWxsIGltbWVkaWF0ZWx5IGFuc3dlciB0aGUgVkYsIGFuZAogCQkgKiB1cGRhdGUgb3VyIGludGVybmFsIGNvdW50ZXJzLiBUaGUgYWN0dWFsIGxlYXZlIHdpbGwgYmUgc2VudApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWx4NF9pYi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWx4NF9pYi5oCmluZGV4IDdjNTgzMmUuLjY4NmFiNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21seDRfaWIuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tbHg0X2liLmgKQEAgLTQ0OCw3ICs0NDgsNyBAQAogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdWRfd3E7CiAJc3BpbmxvY2tfdCB1ZF9sb2NrOwotCV9fYmU2NCBzdWJuZXRfcHJlZml4OworCWF0b21pYzY0X3Qgc3VibmV0X3ByZWZpeDsKIAlfX2JlNjQgZ3VpZF9jYWNoZVsxMjhdOwogCXN0cnVjdCBtbHg0X2liX2RldiAqZGV2OwogCS8qIHRoZSBmb2xsb3dpbmcgbG9jayBwcm90ZWN0cyBib3RoIG1jZ190YWJsZSBhbmQgbWNnX21naWQwX2xpc3QgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9xcC5jCmluZGV4IDc2ODA4NWYuLjdmYjk2MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvcXAuYwpAQCAtMjQ5MywyNCArMjQ5MywyNyBAQAogCQlzcXAtPnVkX2hlYWRlci5ncmguZmxvd19sYWJlbCAgICA9CiAJCQlhaC0+YXYuaWIuc2xfdGNsYXNzX2Zsb3dsYWJlbCAmIGNwdV90b19iZTMyKDB4ZmZmZmYpOwogCQlzcXAtPnVkX2hlYWRlci5ncmguaG9wX2xpbWl0ICAgICA9IGFoLT5hdi5pYi5ob3BfbGltaXQ7Ci0JCWlmIChpc19ldGgpCisJCWlmIChpc19ldGgpIHsKIAkJCW1lbWNweShzcXAtPnVkX2hlYWRlci5ncmguc291cmNlX2dpZC5yYXcsIHNnaWQucmF3LCAxNik7Ci0JCWVsc2UgewotCQlpZiAobWx4NF9pc19tZnVuYyh0b19tZGV2KGliX2RldiktPmRldikpIHsKLQkJCS8qIFdoZW4gbXVsdGktZnVuY3Rpb24gaXMgZW5hYmxlZCwgdGhlIGliX2NvcmUgZ2lkCi0JCQkgKiBpbmRleGVzIGRvbid0IG5lY2Vzc2FyaWx5IG1hdGNoIHRoZSBodyBvbmVzLCBzbwotCQkJICogd2UgbXVzdCB1c2Ugb3VyIG93biBjYWNoZSAqLwotCQkJc3FwLT51ZF9oZWFkZXIuZ3JoLnNvdXJjZV9naWQuZ2xvYmFsLnN1Ym5ldF9wcmVmaXggPQotCQkJCXRvX21kZXYoaWJfZGV2KS0+c3Jpb3YuZGVtdXhbc3FwLT5xcC5wb3J0IC0gMV0uCi0JCQkJCQkgICAgICAgc3VibmV0X3ByZWZpeDsKLQkJCXNxcC0+dWRfaGVhZGVyLmdyaC5zb3VyY2VfZ2lkLmdsb2JhbC5pbnRlcmZhY2VfaWQgPQotCQkJCXRvX21kZXYoaWJfZGV2KS0+c3Jpb3YuZGVtdXhbc3FwLT5xcC5wb3J0IC0gMV0uCi0JCQkJCSAgICAgICBndWlkX2NhY2hlW2FoLT5hdi5pYi5naWRfaW5kZXhdOwotCQl9IGVsc2UKLQkJCWliX2dldF9jYWNoZWRfZ2lkKGliX2RldiwKLQkJCQkJICBiZTMyX3RvX2NwdShhaC0+YXYuaWIucG9ydF9wZCkgPj4gMjQsCi0JCQkJCSAgYWgtPmF2LmliLmdpZF9pbmRleCwKLQkJCQkJICAmc3FwLT51ZF9oZWFkZXIuZ3JoLnNvdXJjZV9naWQsIE5VTEwpOworCQl9IGVsc2UgeworCQkJaWYgKG1seDRfaXNfbWZ1bmModG9fbWRldihpYl9kZXYpLT5kZXYpKSB7CisJCQkJLyogV2hlbiBtdWx0aS1mdW5jdGlvbiBpcyBlbmFibGVkLCB0aGUgaWJfY29yZSBnaWQKKwkJCQkgKiBpbmRleGVzIGRvbid0IG5lY2Vzc2FyaWx5IG1hdGNoIHRoZSBodyBvbmVzLCBzbworCQkJCSAqIHdlIG11c3QgdXNlIG91ciBvd24gY2FjaGUKKwkJCQkgKi8KKwkJCQlzcXAtPnVkX2hlYWRlci5ncmguc291cmNlX2dpZC5nbG9iYWwuc3VibmV0X3ByZWZpeCA9CisJCQkJCWNwdV90b19iZTY0KGF0b21pYzY0X3JlYWQoJih0b19tZGV2KGliX2RldiktPnNyaW92LgorCQkJCQkJCQkgICAgZGVtdXhbc3FwLT5xcC5wb3J0IC0gMV0uCisJCQkJCQkJCSAgICBzdWJuZXRfcHJlZml4KSkpOworCQkJCXNxcC0+dWRfaGVhZGVyLmdyaC5zb3VyY2VfZ2lkLmdsb2JhbC5pbnRlcmZhY2VfaWQgPQorCQkJCQl0b19tZGV2KGliX2RldiktPnNyaW92LmRlbXV4W3NxcC0+cXAucG9ydCAtIDFdLgorCQkJCQkJICAgICAgIGd1aWRfY2FjaGVbYWgtPmF2LmliLmdpZF9pbmRleF07CisJCQl9IGVsc2UgeworCQkJCWliX2dldF9jYWNoZWRfZ2lkKGliX2RldiwKKwkJCQkJCSAgYmUzMl90b19jcHUoYWgtPmF2LmliLnBvcnRfcGQpID4+IDI0LAorCQkJCQkJICBhaC0+YXYuaWIuZ2lkX2luZGV4LAorCQkJCQkJICAmc3FwLT51ZF9oZWFkZXIuZ3JoLnNvdXJjZV9naWQsIE5VTEwpOworCQkJfQogCQl9CiAJCW1lbWNweShzcXAtPnVkX2hlYWRlci5ncmguZGVzdGluYXRpb25fZ2lkLnJhdywKIAkJICAgICAgIGFoLT5hdi5pYi5kZ2lkLCAxNik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9jcS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvY3EuYwppbmRleCAzMDhhMzU4Li41ZGU5YTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9jcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L2NxLmMKQEAgLTU1MywxMiArNTUzLDYgQEAKIAkJICogZnJvbSB0aGUgdGFibGUuCiAJCSAqLwogCQltcXAgPSBfX21seDVfcXBfbG9va3VwKGRldi0+bWRldiwgcXBuKTsKLQkJaWYgKHVubGlrZWx5KCFtcXApKSB7Ci0JCQltbHg1X2liX3dhcm4oZGV2LCAiQ1FFQENRICUwNnggZm9yIHVua25vd24gUVBOICU2eFxuIiwKLQkJCQkgICAgIGNxLT5tY3EuY3FuLCBxcG4pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQogCQkqY3VyX3FwID0gdG9fbWlicXAobXFwKTsKIAl9CiAKQEAgLTYxOSwxMyArNjEzLDYgQEAKIAkJcmVhZF9sb2NrKCZkZXYtPm1kZXYtPnByaXYubWtleV90YWJsZS5sb2NrKTsKIAkJbW1rZXkgPSBfX21seDVfbXJfbG9va3VwKGRldi0+bWRldiwKIAkJCQkJIG1seDVfYmFzZV9ta2V5KGJlMzJfdG9fY3B1KHNpZ19lcnJfY3FlLT5ta2V5KSkpOwotCQlpZiAodW5saWtlbHkoIW1ta2V5KSkgewotCQkJcmVhZF91bmxvY2soJmRldi0+bWRldi0+cHJpdi5ta2V5X3RhYmxlLmxvY2spOwotCQkJbWx4NV9pYl93YXJuKGRldiwgIkNRRUBDUSAlMDZ4IGZvciB1bmtub3duIE1SICU2eFxuIiwKLQkJCQkgICAgIGNxLT5tY3EuY3FuLCBiZTMyX3RvX2NwdShzaWdfZXJyX2NxZS0+bWtleSkpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQogCQltciA9IHRvX21pYm1yKG1ta2V5KTsKIAkJZ2V0X3NpZ19lcnJfaXRlbShzaWdfZXJyX2NxZSwgJm1yLT5zaWctPmVycl9pdGVtKTsKIAkJbXItPnNpZy0+c2lnX2Vycl9leGlzdHMgPSB0cnVlOwpAQCAtNjc2LDcgKzY2Myw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgc29mdF9wb2xsZWQgPSAwOwogCWludCBucG9sbGVkOwotCWludCBlcnIgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNxLT5sb2NrLCBmbGFncyk7CiAJaWYgKG1kZXYtPnN0YXRlID09IE1MWDVfREVWSUNFX1NUQVRFX0lOVEVSTkFMX0VSUk9SKSB7CkBAIC02ODgsOCArNjc0LDcgQEAKIAkJc29mdF9wb2xsZWQgPSBwb2xsX3NvZnRfd2MoY3EsIG51bV9lbnRyaWVzLCB3Yyk7CiAKIAlmb3IgKG5wb2xsZWQgPSAwOyBucG9sbGVkIDwgbnVtX2VudHJpZXMgLSBzb2Z0X3BvbGxlZDsgbnBvbGxlZCsrKSB7Ci0JCWVyciA9IG1seDVfcG9sbF9vbmUoY3EsICZjdXJfcXAsIHdjICsgc29mdF9wb2xsZWQgKyBucG9sbGVkKTsKLQkJaWYgKGVycikKKwkJaWYgKG1seDVfcG9sbF9vbmUoY3EsICZjdXJfcXAsIHdjICsgc29mdF9wb2xsZWQgKyBucG9sbGVkKSkKIAkJCWJyZWFrOwogCX0KIApAQCAtNjk4LDEwICs2ODMsNyBAQAogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNxLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoZXJyID09IDAgfHwgZXJyID09IC1FQUdBSU4pCi0JCXJldHVybiBzb2Z0X3BvbGxlZCArIG5wb2xsZWQ7Ci0JZWxzZQotCQlyZXR1cm4gZXJyOworCXJldHVybiBzb2Z0X3BvbGxlZCArIG5wb2xsZWQ7CiB9CiAKIGludCBtbHg1X2liX2FybV9jcShzdHJ1Y3QgaWJfY3EgKmliY3EsIGVudW0gaWJfY3Ffbm90aWZ5X2ZsYWdzIGZsYWdzKQpAQCAtNzQ3LDE0ICs3MjksMTYgQEAKIAogc3RhdGljIGludCBjcmVhdGVfY3FfdXNlcihzdHJ1Y3QgbWx4NV9pYl9kZXYgKmRldiwgc3RydWN0IGliX3VkYXRhICp1ZGF0YSwKIAkJCSAgc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0LCBzdHJ1Y3QgbWx4NV9pYl9jcSAqY3EsCi0JCQkgIGludCBlbnRyaWVzLCBzdHJ1Y3QgbWx4NV9jcmVhdGVfY3FfbWJveF9pbiAqKmNxYiwKKwkJCSAgaW50IGVudHJpZXMsIHUzMiAqKmNxYiwKIAkJCSAgaW50ICpjcWVfc2l6ZSwgaW50ICppbmRleCwgaW50ICppbmxlbikKIHsKIAlzdHJ1Y3QgbWx4NV9pYl9jcmVhdGVfY3EgdWNtZDsKIAlzaXplX3QgdWNtZGxlbjsKIAlpbnQgcGFnZV9zaGlmdDsKKwlfX2JlNjQgKnBhczsKIAlpbnQgbnBhZ2VzOwogCWludCBuY29udDsKKwl2b2lkICpjcWM7CiAJaW50IGVycjsKIAogCXVjbWRsZW4gPQpAQCAtNzkyLDE0ICs3NzYsMjAgQEAKIAltbHg1X2liX2RiZyhkZXYsICJhZGRyIDB4JWxseCwgc2l6ZSAldSwgbnBhZ2VzICVkLCBwYWdlX3NoaWZ0ICVkLCBuY29udCAlZFxuIiwKIAkJICAgIHVjbWQuYnVmX2FkZHIsIGVudHJpZXMgKiB1Y21kLmNxZV9zaXplLCBucGFnZXMsIHBhZ2Vfc2hpZnQsIG5jb250KTsKIAotCSppbmxlbiA9IHNpemVvZigqKmNxYikgKyBzaXplb2YoKigqY3FiKS0+cGFzKSAqIG5jb250OworCSppbmxlbiA9IE1MWDVfU1RfU1pfQllURVMoY3JlYXRlX2NxX2luKSArCisJCSBNTFg1X0ZMRF9TWl9CWVRFUyhjcmVhdGVfY3FfaW4sIHBhc1swXSkgKiBuY29udDsKIAkqY3FiID0gbWx4NV92emFsbG9jKCppbmxlbik7CiAJaWYgKCEqY3FiKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2RiOwogCX0KLQltbHg1X2liX3BvcHVsYXRlX3BhcyhkZXYsIGNxLT5idWYudW1lbSwgcGFnZV9zaGlmdCwgKCpjcWIpLT5wYXMsIDApOwotCSgqY3FiKS0+Y3R4LmxvZ19wZ19zeiA9IHBhZ2Vfc2hpZnQgLSBNTFg1X0FEQVBURVJfUEFHRV9TSElGVDsKKworCXBhcyA9IChfX2JlNjQgKilNTFg1X0FERFJfT0YoY3JlYXRlX2NxX2luLCAqY3FiLCBwYXMpOworCW1seDVfaWJfcG9wdWxhdGVfcGFzKGRldiwgY3EtPmJ1Zi51bWVtLCBwYWdlX3NoaWZ0LCBwYXMsIDApOworCisJY3FjID0gTUxYNV9BRERSX09GKGNyZWF0ZV9jcV9pbiwgKmNxYiwgY3FfY29udGV4dCk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIGxvZ19wYWdlX3NpemUsCisJCSBwYWdlX3NoaWZ0IC0gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQpOwogCiAJKmluZGV4ID0gdG9fbXVjb250ZXh0KGNvbnRleHQpLT51dWFyaS51YXJzWzBdLmluZGV4OwogCkBAIC04MzQsOSArODI0LDEwIEBACiAKIHN0YXRpYyBpbnQgY3JlYXRlX2NxX2tlcm5lbChzdHJ1Y3QgbWx4NV9pYl9kZXYgKmRldiwgc3RydWN0IG1seDVfaWJfY3EgKmNxLAogCQkJICAgIGludCBlbnRyaWVzLCBpbnQgY3FlX3NpemUsCi0JCQkgICAgc3RydWN0IG1seDVfY3JlYXRlX2NxX21ib3hfaW4gKipjcWIsCi0JCQkgICAgaW50ICppbmRleCwgaW50ICppbmxlbikKKwkJCSAgICB1MzIgKipjcWIsIGludCAqaW5kZXgsIGludCAqaW5sZW4pCiB7CisJX19iZTY0ICpwYXM7CisJdm9pZCAqY3FjOwogCWludCBlcnI7CiAKIAllcnIgPSBtbHg1X2RiX2FsbG9jKGRldi0+bWRldiwgJmNxLT5kYik7CkBAIC04NTMsMTUgKzg0NCwyMSBAQAogCiAJaW5pdF9jcV9idWYoY3EsICZjcS0+YnVmKTsKIAotCSppbmxlbiA9IHNpemVvZigqKmNxYikgKyBzaXplb2YoKigqY3FiKS0+cGFzKSAqIGNxLT5idWYuYnVmLm5wYWdlczsKKwkqaW5sZW4gPSBNTFg1X1NUX1NaX0JZVEVTKGNyZWF0ZV9jcV9pbikgKworCQkgTUxYNV9GTERfU1pfQllURVMoY3JlYXRlX2NxX2luLCBwYXNbMF0pICogY3EtPmJ1Zi5idWYubnBhZ2VzOwogCSpjcWIgPSBtbHg1X3Z6YWxsb2MoKmlubGVuKTsKIAlpZiAoISpjcWIpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfYnVmOwogCX0KLQltbHg1X2ZpbGxfcGFnZV9hcnJheSgmY3EtPmJ1Zi5idWYsICgqY3FiKS0+cGFzKTsKIAotCSgqY3FiKS0+Y3R4LmxvZ19wZ19zeiA9IGNxLT5idWYuYnVmLnBhZ2Vfc2hpZnQgLSBNTFg1X0FEQVBURVJfUEFHRV9TSElGVDsKKwlwYXMgPSAoX19iZTY0ICopTUxYNV9BRERSX09GKGNyZWF0ZV9jcV9pbiwgKmNxYiwgcGFzKTsKKwltbHg1X2ZpbGxfcGFnZV9hcnJheSgmY3EtPmJ1Zi5idWYsIHBhcyk7CisKKwljcWMgPSBNTFg1X0FERFJfT0YoY3JlYXRlX2NxX2luLCAqY3FiLCBjcV9jb250ZXh0KTsKKwlNTFg1X1NFVChjcWMsIGNxYywgbG9nX3BhZ2Vfc2l6ZSwKKwkJIGNxLT5idWYuYnVmLnBhZ2Vfc2hpZnQgLSBNTFg1X0FEQVBURVJfUEFHRV9TSElGVCk7CisKIAkqaW5kZXggPSBkZXYtPm1kZXYtPnByaXYudXVhcmkudWFyc1swXS5pbmRleDsKIAogCXJldHVybiAwOwpAQCAtODk1LDExICs4OTIsMTIgQEAKIHsKIAlpbnQgZW50cmllcyA9IGF0dHItPmNxZTsKIAlpbnQgdmVjdG9yID0gYXR0ci0+Y29tcF92ZWN0b3I7Ci0Jc3RydWN0IG1seDVfY3JlYXRlX2NxX21ib3hfaW4gKmNxYiA9IE5VTEw7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KGliZGV2KTsKIAlzdHJ1Y3QgbWx4NV9pYl9jcSAqY3E7CiAJaW50IHVuaW5pdGlhbGl6ZWRfdmFyKGluZGV4KTsKIAlpbnQgdW5pbml0aWFsaXplZF92YXIoaW5sZW4pOworCXUzMiAqY3FiID0gTlVMTDsKKwl2b2lkICpjcWM7CiAJaW50IGNxZV9zaXplOwogCXVuc2lnbmVkIGludCBpcnFuOwogCWludCBlcW47CkBAIC05NDUsMTkgKzk0MywyMCBAQAogCQlJTklUX1dPUksoJmNxLT5ub3RpZnlfd29yaywgbm90aWZ5X3NvZnRfd2NfaGFuZGxlcik7CiAJfQogCi0JY3EtPmNxZV9zaXplID0gY3FlX3NpemU7Ci0JY3FiLT5jdHguY3FlX3N6X2ZsYWdzID0gY3FlX3N6X3RvX21seF9zeihjcWVfc2l6ZSkgPDwgNTsKLQotCWlmIChjcS0+Y3JlYXRlX2ZsYWdzICYgSUJfQ1FfRkxBR1NfSUdOT1JFX09WRVJSVU4pCi0JCWNxYi0+Y3R4LmNxZV9zel9mbGFncyB8PSAoMSA8PCAxKTsKLQotCWNxYi0+Y3R4LmxvZ19zel91c3JfcGFnZSA9IGNwdV90b19iZTMyKChpbG9nMihlbnRyaWVzKSA8PCAyNCkgfCBpbmRleCk7CiAJZXJyID0gbWx4NV92ZWN0b3IyZXFuKGRldi0+bWRldiwgdmVjdG9yLCAmZXFuLCAmaXJxbik7CiAJaWYgKGVycikKIAkJZ290byBlcnJfY3FiOwogCi0JY3FiLT5jdHguY19lcW4gPSBjcHVfdG9fYmUxNihlcW4pOwotCWNxYi0+Y3R4LmRiX3JlY29yZF9hZGRyID0gY3B1X3RvX2JlNjQoY3EtPmRiLmRtYSk7CisJY3EtPmNxZV9zaXplID0gY3FlX3NpemU7CisKKwljcWMgPSBNTFg1X0FERFJfT0YoY3JlYXRlX2NxX2luLCBjcWIsIGNxX2NvbnRleHQpOworCU1MWDVfU0VUKGNxYywgY3FjLCBjcWVfc3osIGNxZV9zel90b19tbHhfc3ooY3FlX3NpemUpKTsKKwlNTFg1X1NFVChjcWMsIGNxYywgbG9nX2NxX3NpemUsIGlsb2cyKGVudHJpZXMpKTsKKwlNTFg1X1NFVChjcWMsIGNxYywgdWFyX3BhZ2UsIGluZGV4KTsKKwlNTFg1X1NFVChjcWMsIGNxYywgY19lcW4sIGVxbik7CisJTUxYNV9TRVQ2NChjcWMsIGNxYywgZGJyX2FkZHIsIGNxLT5kYi5kbWEpOworCWlmIChjcS0+Y3JlYXRlX2ZsYWdzICYgSUJfQ1FfRkxBR1NfSUdOT1JFX09WRVJSVU4pCisJCU1MWDVfU0VUKGNxYywgY3FjLCBvaSwgMSk7CiAKIAllcnIgPSBtbHg1X2NvcmVfY3JlYXRlX2NxKGRldi0+bWRldiwgJmNxLT5tY3EsIGNxYiwgaW5sZW4pOwogCWlmIChlcnIpCkBAIC0xMDg4LDI3ICsxMDg3LDE1IEBACiAKIGludCBtbHg1X2liX21vZGlmeV9jcShzdHJ1Y3QgaWJfY3EgKmNxLCB1MTYgY3FfY291bnQsIHUxNiBjcV9wZXJpb2QpCiB7Ci0Jc3RydWN0IG1seDVfbW9kaWZ5X2NxX21ib3hfaW4gKmluOwogCXN0cnVjdCBtbHg1X2liX2RldiAqZGV2ID0gdG9fbWRldihjcS0+ZGV2aWNlKTsKIAlzdHJ1Y3QgbWx4NV9pYl9jcSAqbWNxID0gdG9fbWNxKGNxKTsKIAlpbnQgZXJyOwotCXUzMiBmc2VsOwogCiAJaWYgKCFNTFg1X0NBUF9HRU4oZGV2LT5tZGV2LCBjcV9tb2RlcmF0aW9uKSkKIAkJcmV0dXJuIC1FTk9TWVM7CiAKLQlpbiA9IGt6YWxsb2Moc2l6ZW9mKCppbiksIEdGUF9LRVJORUwpOwotCWlmICghaW4pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaW4tPmNxbiA9IGNwdV90b19iZTMyKG1jcS0+bWNxLmNxbik7Ci0JZnNlbCA9IChNTFg1X0NRX01PRElGWV9QRVJJT0QgfCBNTFg1X0NRX01PRElGWV9DT1VOVCk7Ci0JaW4tPmN0eC5jcV9wZXJpb2QgPSBjcHVfdG9fYmUxNihjcV9wZXJpb2QpOwotCWluLT5jdHguY3FfbWF4X2NvdW50ID0gY3B1X3RvX2JlMTYoY3FfY291bnQpOwotCWluLT5maWVsZF9zZWxlY3QgPSBjcHVfdG9fYmUzMihmc2VsKTsKLQllcnIgPSBtbHg1X2NvcmVfbW9kaWZ5X2NxKGRldi0+bWRldiwgJm1jcS0+bWNxLCBpbiwgc2l6ZW9mKCppbikpOwotCWtmcmVlKGluKTsKLQorCWVyciA9IG1seDVfY29yZV9tb2RpZnlfY3FfbW9kZXJhdGlvbihkZXYtPm1kZXYsICZtY3EtPm1jcSwKKwkJCQkJICAgICBjcV9wZXJpb2QsIGNxX2NvdW50KTsKIAlpZiAoZXJyKQogCQltbHg1X2liX3dhcm4oZGV2LCAibW9kaWZ5IGNxIDB4JXggZmFpbGVkXG4iLCBtY3EtPm1jcS5jcW4pOwogCkBAIC0xMjQxLDkgKzEyMjgsMTEgQEAKIHsKIAlzdHJ1Y3QgbWx4NV9pYl9kZXYgKmRldiA9IHRvX21kZXYoaWJjcS0+ZGV2aWNlKTsKIAlzdHJ1Y3QgbWx4NV9pYl9jcSAqY3EgPSB0b19tY3EoaWJjcSk7Ci0Jc3RydWN0IG1seDVfbW9kaWZ5X2NxX21ib3hfaW4gKmluOworCXZvaWQgKmNxYzsKKwl1MzIgKmluOwogCWludCBlcnI7CiAJaW50IG5wYXM7CisJX19iZTY0ICpwYXM7CiAJaW50IHBhZ2Vfc2hpZnQ7CiAJaW50IGlubGVuOwogCWludCB1bmluaXRpYWxpemVkX3ZhcihjcWVfc2l6ZSk7CkBAIC0xMjg1LDI4ICsxMjc0LDM3IEBACiAJaWYgKGVycikKIAkJZ290byBleDsKIAotCWlubGVuID0gc2l6ZW9mKCppbikgKyBucGFzICogc2l6ZW9mKGluLT5wYXNbMF0pOworCWlubGVuID0gTUxYNV9TVF9TWl9CWVRFUyhtb2RpZnlfY3FfaW4pICsKKwkJTUxYNV9GTERfU1pfQllURVMobW9kaWZ5X2NxX2luLCBwYXNbMF0pICogbnBhczsKKwogCWluID0gbWx4NV92emFsbG9jKGlubGVuKTsKIAlpZiAoIWluKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXhfcmVzaXplOwogCX0KIAorCXBhcyA9IChfX2JlNjQgKilNTFg1X0FERFJfT0YobW9kaWZ5X2NxX2luLCBpbiwgcGFzKTsKIAlpZiAodWRhdGEpCiAJCW1seDVfaWJfcG9wdWxhdGVfcGFzKGRldiwgY3EtPnJlc2l6ZV91bWVtLCBwYWdlX3NoaWZ0LAotCQkJCSAgICAgaW4tPnBhcywgMCk7CisJCQkJICAgICBwYXMsIDApOwogCWVsc2UKLQkJbWx4NV9maWxsX3BhZ2VfYXJyYXkoJmNxLT5yZXNpemVfYnVmLT5idWYsIGluLT5wYXMpOworCQltbHg1X2ZpbGxfcGFnZV9hcnJheSgmY3EtPnJlc2l6ZV9idWYtPmJ1ZiwgcGFzKTsKIAotCWluLT5maWVsZF9zZWxlY3QgPSBjcHVfdG9fYmUzMihNTFg1X01PRElGWV9DUV9NQVNLX0xPR19TSVpFICB8Ci0JCQkJICAgICAgIE1MWDVfTU9ESUZZX0NRX01BU0tfUEdfT0ZGU0VUIHwKLQkJCQkgICAgICAgTUxYNV9NT0RJRllfQ1FfTUFTS19QR19TSVpFKTsKLQlpbi0+Y3R4LmxvZ19wZ19zeiA9IHBhZ2Vfc2hpZnQgLSBNTFg1X0FEQVBURVJfUEFHRV9TSElGVDsKLQlpbi0+Y3R4LmNxZV9zel9mbGFncyA9IGNxZV9zel90b19tbHhfc3ooY3FlX3NpemUpIDw8IDU7Ci0JaW4tPmN0eC5wYWdlX29mZnNldCA9IDA7Ci0JaW4tPmN0eC5sb2dfc3pfdXNyX3BhZ2UgPSBjcHVfdG9fYmUzMihpbG9nMihlbnRyaWVzKSA8PCAyNCk7Ci0JaW4tPmhkci5vcG1vZCA9IGNwdV90b19iZTE2KE1MWDVfQ1FfT1BNT0RfUkVTSVpFKTsKLQlpbi0+Y3FuID0gY3B1X3RvX2JlMzIoY3EtPm1jcS5jcW4pOworCU1MWDVfU0VUKG1vZGlmeV9jcV9pbiwgaW4sCisJCSBtb2RpZnlfZmllbGRfc2VsZWN0X3Jlc2l6ZV9maWVsZF9zZWxlY3QucmVzaXplX2ZpZWxkX3NlbGVjdC5yZXNpemVfZmllbGRfc2VsZWN0LAorCQkgTUxYNV9NT0RJRllfQ1FfTUFTS19MT0dfU0laRSAgfAorCQkgTUxYNV9NT0RJRllfQ1FfTUFTS19QR19PRkZTRVQgfAorCQkgTUxYNV9NT0RJRllfQ1FfTUFTS19QR19TSVpFKTsKKworCWNxYyA9IE1MWDVfQUREUl9PRihtb2RpZnlfY3FfaW4sIGluLCBjcV9jb250ZXh0KTsKKworCU1MWDVfU0VUKGNxYywgY3FjLCBsb2dfcGFnZV9zaXplLAorCQkgcGFnZV9zaGlmdCAtIE1MWDVfQURBUFRFUl9QQUdFX1NISUZUKTsKKwlNTFg1X1NFVChjcWMsIGNxYywgY3FlX3N6LCBjcWVfc3pfdG9fbWx4X3N6KGNxZV9zaXplKSk7CisJTUxYNV9TRVQoY3FjLCBjcWMsIGxvZ19jcV9zaXplLCBpbG9nMihlbnRyaWVzKSk7CisKKwlNTFg1X1NFVChtb2RpZnlfY3FfaW4sIGluLCBvcF9tb2QsIE1MWDVfQ1FfT1BNT0RfUkVTSVpFKTsKKwlNTFg1X1NFVChtb2RpZnlfY3FfaW4sIGluLCBjcW4sIGNxLT5tY3EuY3FuKTsKIAogCWVyciA9IG1seDVfY29yZV9tb2RpZnlfY3EoZGV2LT5tZGV2LCAmY3EtPm1jcSwgaW4sIGlubGVuKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbWFpbi5jCmluZGV4IDFiNDA5NGIuLjU1MWFhMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tYWluLmMKQEAgLTIzMiwyMyArMjMyLDE5IEBACiAJCQkgY29uc3QgdW5pb24gaWJfZ2lkICpnaWQsCiAJCQkgY29uc3Qgc3RydWN0IGliX2dpZF9hdHRyICphdHRyKQogewotCXN0cnVjdCBtbHg1X2liX2RldiAqZGV2CT0gdG9fbWRldihkZXZpY2UpOwotCXUzMiAgaW5bTUxYNV9TVF9TWl9EVyhzZXRfcm9jZV9hZGRyZXNzX2luKV07Ci0JdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9yb2NlX2FkZHJlc3Nfb3V0KV07CisJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KGRldmljZSk7CisJdTMyICBpbltNTFg1X1NUX1NaX0RXKHNldF9yb2NlX2FkZHJlc3NfaW4pXSAgPSB7MH07CisJdTMyIG91dFtNTFg1X1NUX1NaX0RXKHNldF9yb2NlX2FkZHJlc3Nfb3V0KV0gPSB7MH07CiAJdm9pZCAqaW5fYWRkciA9IE1MWDVfQUREUl9PRihzZXRfcm9jZV9hZGRyZXNzX2luLCBpbiwgcm9jZV9hZGRyZXNzKTsKIAllbnVtIHJkbWFfbGlua19sYXllciBsbCA9IG1seDVfaWJfcG9ydF9saW5rX2xheWVyKGRldmljZSwgcG9ydF9udW0pOwogCiAJaWYgKGxsICE9IElCX0xJTktfTEFZRVJfRVRIRVJORVQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtc2V0KGluLCAwLCBzaXplb2YoaW4pKTsKLQogCWliX2dpZF90b19tbHg1X3JvY2VfYWRkcihnaWQsIGF0dHIsIGluX2FkZHIpOwogCiAJTUxYNV9TRVQoc2V0X3JvY2VfYWRkcmVzc19pbiwgaW4sIHJvY2VfYWRkcmVzc19pbmRleCwgaW5kZXgpOwogCU1MWDVfU0VUKHNldF9yb2NlX2FkZHJlc3NfaW4sIGluLCBvcGNvZGUsIE1MWDVfQ01EX09QX1NFVF9ST0NFX0FERFJFU1MpOwotCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKG91dCkpOwogCXJldHVybiBtbHg1X2NtZF9leGVjKGRldi0+bWRldiwgaW4sIHNpemVvZihpbiksIG91dCwgc2l6ZW9mKG91dCkpOwogfQogCkBAIC0yODgsNyArMjg0LDkgQEAKIAogc3RhdGljIGludCBtbHg1X3VzZV9tYWRfaWZjKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2KQogewotCXJldHVybiAhTUxYNV9DQVBfR0VOKGRldi0+bWRldiwgaWJfdmlydCk7CisJaWYgKE1MWDVfQ0FQX0dFTihkZXYtPm1kZXYsIHBvcnRfdHlwZSkgPT0gTUxYNV9DQVBfUE9SVF9UWVBFX0lCKQorCQlyZXR1cm4gIU1MWDVfQ0FQX0dFTihkZXYtPm1kZXYsIGliX3ZpcnQpOworCXJldHVybiAwOwogfQogCiBlbnVtIHsKQEAgLTc1MSw4ICs3NDksNyBAQAogCQkJCSAgICAgJnByb3BzLT5hY3RpdmVfd2lkdGgpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwotCWVyciA9IG1seDVfcXVlcnlfcG9ydF9wcm90b19vcGVyKG1kZXYsICZwcm9wcy0+YWN0aXZlX3NwZWVkLCBNTFg1X1BUWVNfSUIsCi0JCQkJCSBwb3J0KTsKKwllcnIgPSBtbHg1X3F1ZXJ5X3BvcnRfaWJfcHJvdG9fb3BlcihtZGV2LCAmcHJvcHMtPmFjdGl2ZV9zcGVlZCwgcG9ydCk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTE0MjgsNiArMTQyNSwxMyBAQAogCQkJCQkgICAgIGRtYWNfNDdfMTYpLAogCQkJCWliX3NwZWMtPmV0aC52YWwuZHN0X21hYyk7CiAKKwkJZXRoZXJfYWRkcl9jb3B5KE1MWDVfQUREUl9PRihmdGVfbWF0Y2hfc2V0X2x5cl8yXzQsIG91dGVyX2hlYWRlcnNfYywKKwkJCQkJICAgICBzbWFjXzQ3XzE2KSwKKwkJCQlpYl9zcGVjLT5ldGgubWFzay5zcmNfbWFjKTsKKwkJZXRoZXJfYWRkcl9jb3B5KE1MWDVfQUREUl9PRihmdGVfbWF0Y2hfc2V0X2x5cl8yXzQsIG91dGVyX2hlYWRlcnNfdiwKKwkJCQkJICAgICBzbWFjXzQ3XzE2KSwKKwkJCQlpYl9zcGVjLT5ldGgudmFsLnNyY19tYWMpOworCiAJCWlmIChpYl9zcGVjLT5ldGgubWFzay52bGFuX3RhZykgewogCQkJTUxYNV9TRVQoZnRlX21hdGNoX3NldF9seXJfMl80LCBvdXRlcl9oZWFkZXJzX2MsCiAJCQkJIHZsYW5fdGFnLCAxKTsKQEAgLTE4NDksNiArMTg1Myw3IEBACiAJCQkJCSAgIGludCBkb21haW4pCiB7CiAJc3RydWN0IG1seDVfaWJfZGV2ICpkZXYgPSB0b19tZGV2KHFwLT5kZXZpY2UpOworCXN0cnVjdCBtbHg1X2liX3FwICptcXAgPSB0b19tcXAocXApOwogCXN0cnVjdCBtbHg1X2liX2Zsb3dfaGFuZGxlciAqaGFuZGxlciA9IE5VTEw7CiAJc3RydWN0IG1seDVfZmxvd19kZXN0aW5hdGlvbiAqZHN0ID0gTlVMTDsKIAlzdHJ1Y3QgbWx4NV9pYl9mbG93X3ByaW8gKmZ0X3ByaW87CkBAIC0xODc1LDcgKzE4ODAsMTAgQEAKIAl9CiAKIAlkc3QtPnR5cGUgPSBNTFg1X0ZMT1dfREVTVElOQVRJT05fVFlQRV9USVI7Ci0JZHN0LT50aXJfbnVtID0gdG9fbXFwKHFwKS0+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+IDI4OwogCiAJcXAtPnN0YXRlCQkgICAgID0gdG9faWJfcXBfc3RhdGUobWx4NV9zdGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYi5oIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWIuaAppbmRleCBiYmYwYTE2Li5hM2UyMWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliLmgKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8cmRtYS9pYl9oZHJzLmg+CiAjaW5jbHVkZSA8cmRtYS9yZG1hX3Z0Lmg+CiAKICNpbmNsdWRlICJxaWJfY29tbW9uLmgiCkBAIC0xMTMxLDcgKzExMzIsNiBAQAogZXh0ZXJuIHN0cnVjdCBxaWJfZGV2ZGF0YSAqcWliX2xvb2t1cChpbnQgdW5pdCk7CiBleHRlcm4gdTMyIHFpYl9jcHVsaXN0X2NvdW50OwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKnFpYl9jcHVsaXN0OwotZXh0ZXJuIHUxNiBxcHRfbWFzazsKIGV4dGVybiB1bnNpZ25lZCBxaWJfY2NfdGFibGVfc2l6ZTsKIAogaW50IHFpYl9pbml0KHN0cnVjdCBxaWJfZGV2ZGF0YSAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZHJpdmVyLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYwppbmRleCA2N2VlNjQzLi43MjhlMGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9kcml2ZXIuYwpAQCAtMzE5LDggKzMxOSw4IEBACiAJCXJldCA9IDE7CiAJZWxzZSBpZiAoZWZsYWdzID09IFFMT0dJQ19JQl9SSEZfSF9USURFUlIpIHsKIAkJLyogRm9yIFRJREVSUiBhbmQgUkMgUVBzIHByZW1wdGl2ZWx5IHNjaGVkdWxlIGEgTkFLICovCi0JCXN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIgPSAoc3RydWN0IHFpYl9pYl9oZWFkZXIgKikgcmhkcjsKLQkJc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyID0gTlVMTDsKKwkJc3RydWN0IGliX2hlYWRlciAqaGRyID0gKHN0cnVjdCBpYl9oZWFkZXIgKilyaGRyOworCQlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciA9IE5VTEw7CiAJCXN0cnVjdCBxaWJfaWJwb3J0ICppYnAgPSAmcHBkLT5pYnBvcnRfZGF0YTsKIAkJc3RydWN0IHFpYl9kZXZkYXRhICpkZCA9IHBwZC0+ZGQ7CiAJCXN0cnVjdCBydnRfZGV2X2luZm8gKnJkaSA9ICZkZC0+dmVyYnNfZGV2LnJkaTsKQEAgLTU4OCw4ICs1ODgsNyBAQAogCQkJCXFpYl9zY2hlZHVsZV9zZW5kKHFwKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFwLT5zX2xvY2ssIGZsYWdzKTsKIAkJfQotCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcXAtPnJlZmNvdW50KSkKLQkJCXdha2VfdXAoJnFwLT53YWl0KTsKKwkJcnZ0X3B1dF9xcChxcCk7CiAJfQogCiBiYWlsOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfaWJhNzMyMi5jCmluZGV4IGNlNDAzNDAuLmRlZDI3MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2liYTczMjIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9pYmE3MzIyLmMKQEAgLTE0MTUsNyArMTQxNSw3IEBACiAJdTMyICpoZHI7CiAJdTY0IHBiYzsKIAljb25zdCB1bnNpZ25lZCBoZHJ3b3JkcyA9IDc7Ci0Jc3RhdGljIHN0cnVjdCBxaWJfaWJfaGVhZGVyIGliaGRyID0geworCXN0YXRpYyBzdHJ1Y3QgaWJfaGVhZGVyIGliaGRyID0gewogCQkubHJoWzBdID0gY3B1X3RvX2JlMTYoMHhGMDAwIHwgUUlCX0xSSF9CVEgpLAogCQkubHJoWzFdID0gSUJfTElEX1BFUk1JU1NJVkUsCiAJCS5scmhbMl0gPSBjcHVfdG9fYmUxNihoZHJ3b3JkcyArIFNJWkVfT0ZfQ1JDKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9xcC5jCmluZGV4IGY5YjhjZDIuLjk5ZDMxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcXAuYwpAQCAtNDEsMTQgKzQxLDYgQEAKIAogI2luY2x1ZGUgInFpYi5oIgogCi0vKgotICogbWFzayBmaWVsZCB3aGljaCB3YXMgcHJlc2VudCBpbiBub3cgZGVsZXRlZCBxaWJfcXBuX3RhYmxlCi0gKiBpcyBub3QgcHJlc2VudCBpbiBydnRfcXBuX3RhYmxlLiBEZWZpbmluZyB0aGUgc2FtZSBmaWVsZAotICogYXMgcXB0X21hc2sgaGVyZSBpbnN0ZWFkIG9mIGFkZGluZyB0aGUgbWFzayBmaWVsZCB0bwotICogcnZ0X3Fwbl90YWJsZS4KLSAqLwotdTE2IHFwdF9tYXNrOwotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIG1rX3FwbihzdHJ1Y3QgcnZ0X3Fwbl90YWJsZSAqcXB0LAogCQkJICAgICAgc3RydWN0IHJ2dF9xcG5fbWFwICptYXAsIHVuc2lnbmVkIG9mZikKIHsKQEAgLTU3LDcgKzQ5LDcgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBmaW5kX25leHRfb2Zmc2V0KHN0cnVjdCBydnRfcXBuX3RhYmxlICpxcHQsCiAJCQkJCXN0cnVjdCBydnRfcXBuX21hcCAqbWFwLCB1bnNpZ25lZCBvZmYsCi0JCQkJCXVuc2lnbmVkIG4pCisJCQkJCXVuc2lnbmVkIG4sIHUxNiBxcHRfbWFzaykKIHsKIAlpZiAocXB0X21hc2spIHsKIAkJb2ZmKys7CkBAIC0xNzksNiArMTcxLDcgQEAKIAlzdHJ1Y3QgcWliX2liZGV2ICp2ZXJic19kZXYgPSBjb250YWluZXJfb2YocmRpLCBzdHJ1Y3QgcWliX2liZGV2LCByZGkpOwogCXN0cnVjdCBxaWJfZGV2ZGF0YSAqZGQgPSBjb250YWluZXJfb2YodmVyYnNfZGV2LCBzdHJ1Y3QgcWliX2RldmRhdGEsCiAJCQkJCSAgICAgIHZlcmJzX2Rldik7CisJdTE2IHFwdF9tYXNrID0gZGQtPnFwbl9tYXNrOwogCiAJaWYgKHR5cGUgPT0gSUJfUVBUX1NNSSB8fCB0eXBlID09IElCX1FQVF9HU0kpIHsKIAkJdW5zaWduZWQgbjsKQEAgLTIxNSw3ICsyMDgsNyBAQAogCQkJCWdvdG8gYmFpbDsKIAkJCX0KIAkJCW9mZnNldCA9IGZpbmRfbmV4dF9vZmZzZXQocXB0LCBtYXAsIG9mZnNldCwKLQkJCQlkZC0+bl9rcmN2X3F1ZXVlcyk7CisJCQkJZGQtPm5fa3Jjdl9xdWV1ZXMsIHFwdF9tYXNrKTsKIAkJCXFwbiA9IG1rX3FwbihxcHQsIG1hcCwgb2Zmc2V0KTsKIAkJCS8qCiAJCQkgKiBUaGlzIHRlc3QgZGlmZmVycyBmcm9tIGFsbG9jX3BpZG1hcCgpLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcmMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3JjLmMKaW5kZXggNDQ0MDI4YS4uMjA5NzUxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcmMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9yYy5jCkBAIC03NSw3ICs3NSw3IEBACiAgKiBOb3RlIHRoZSBRUCBzX2xvY2sgbXVzdCBiZSBoZWxkLgogICovCiBzdGF0aWMgaW50IHFpYl9tYWtlX3JjX2FjayhzdHJ1Y3QgcWliX2liZGV2ICpkZXYsIHN0cnVjdCBydnRfcXAgKnFwLAotCQkJICAgc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyLCB1MzIgcG10dSkKKwkJCSAgIHN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyLCB1MzIgcG10dSkKIHsKIAlzdHJ1Y3QgcnZ0X2Fja19lbnRyeSAqZTsKIAl1MzIgaHdvcmRzOwpAQCAtMTU0LDEwICsxNTQsNyBAQAogCQkJbGVuID0gMDsKIAkJCXFwLT5zX2Fja19zdGF0ZSA9IE9QKEFUT01JQ19BQ0tOT1dMRURHRSk7CiAJCQlvaGRyLT51LmF0LmFldGggPSBxaWJfY29tcHV0ZV9hZXRoKHFwKTsKLQkJCW9oZHItPnUuYXQuYXRvbWljX2Fja19ldGhbMF0gPQotCQkJCWNwdV90b19iZTMyKGUtPmF0b21pY19kYXRhID4+IDMyKTsKLQkJCW9oZHItPnUuYXQuYXRvbWljX2Fja19ldGhbMV0gPQotCQkJCWNwdV90b19iZTMyKGUtPmF0b21pY19kYXRhKTsKKwkJCWliX3U2NF9wdXQoZS0+YXRvbWljX2RhdGEsICZvaGRyLT51LmF0LmF0b21pY19hY2tfZXRoKTsKIAkJCWh3b3JkcyArPSBzaXplb2Yob2hkci0+dS5hdCkgLyBzaXplb2YodTMyKTsKIAkJCWJ0aDIgPSBlLT5wc24gJiBRSUJfUFNOX01BU0s7CiAJCQllLT5zZW50ID0gMTsKQEAgLTIzNCw3ICsyMzEsNyBAQAogewogCXN0cnVjdCBxaWJfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwogCXN0cnVjdCBxaWJfaWJkZXYgKmRldiA9IHRvX2lkZXYocXAtPmlicXAuZGV2aWNlKTsKLQlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IHJ2dF9zZ2Vfc3RhdGUgKnNzOwogCXN0cnVjdCBydnRfc3dxZSAqd3FlOwogCXUzMiBod29yZHM7CkBAIC00NDQsMjAgKzQ0MSwxOCBAQAogCQkJfQogCQkJaWYgKHdxZS0+YXRvbWljX3dyLndyLm9wY29kZSA9PSBJQl9XUl9BVE9NSUNfQ01QX0FORF9TV1ApIHsKIAkJCQlxcC0+c19zdGF0ZSA9IE9QKENPTVBBUkVfU1dBUCk7Ci0JCQkJb2hkci0+dS5hdG9taWNfZXRoLnN3YXBfZGF0YSA9IGNwdV90b19iZTY0KAotCQkJCQl3cWUtPmF0b21pY193ci5zd2FwKTsKLQkJCQlvaGRyLT51LmF0b21pY19ldGguY29tcGFyZV9kYXRhID0gY3B1X3RvX2JlNjQoCi0JCQkJCXdxZS0+YXRvbWljX3dyLmNvbXBhcmVfYWRkKTsKKwkJCQlwdXRfaWJfYXRldGhfc3dhcCh3cWUtPmF0b21pY193ci5zd2FwLAorCQkJCQkJICAmb2hkci0+dS5hdG9taWNfZXRoKTsKKwkJCQlwdXRfaWJfYXRldGhfc3dhcCh3cWUtPmF0b21pY193ci5jb21wYXJlX2FkZCwKKwkJCQkJCSAgJm9oZHItPnUuYXRvbWljX2V0aCk7CiAJCQl9IGVsc2UgewogCQkJCXFwLT5zX3N0YXRlID0gT1AoRkVUQ0hfQUREKTsKLQkJCQlvaGRyLT51LmF0b21pY19ldGguc3dhcF9kYXRhID0gY3B1X3RvX2JlNjQoCi0JCQkJCXdxZS0+YXRvbWljX3dyLmNvbXBhcmVfYWRkKTsKLQkJCQlvaGRyLT51LmF0b21pY19ldGguY29tcGFyZV9kYXRhID0gMDsKKwkJCQlwdXRfaWJfYXRldGhfc3dhcCh3cWUtPmF0b21pY193ci5jb21wYXJlX2FkZCwKKwkJCQkJCSAgJm9oZHItPnUuYXRvbWljX2V0aCk7CisJCQkJcHV0X2liX2F0ZXRoX3N3YXAoMCwgJm9oZHItPnUuYXRvbWljX2V0aCk7CiAJCQl9Ci0JCQlvaGRyLT51LmF0b21pY19ldGgudmFkZHJbMF0gPSBjcHVfdG9fYmUzMigKLQkJCQl3cWUtPmF0b21pY193ci5yZW1vdGVfYWRkciA+PiAzMik7Ci0JCQlvaGRyLT51LmF0b21pY19ldGgudmFkZHJbMV0gPSBjcHVfdG9fYmUzMigKLQkJCQl3cWUtPmF0b21pY193ci5yZW1vdGVfYWRkcik7CisJCQlwdXRfaWJfYXRldGhfdmFkZHIod3FlLT5hdG9taWNfd3IucmVtb3RlX2FkZHIsCisJCQkJCSAgICZvaGRyLT51LmF0b21pY19ldGgpOwogCQkJb2hkci0+dS5hdG9taWNfZXRoLnJrZXkgPSBjcHVfdG9fYmUzMigKIAkJCQl3cWUtPmF0b21pY193ci5ya2V5KTsKIAkJCWh3b3JkcyArPSBzaXplb2Yoc3RydWN0IGliX2F0b21pY19ldGgpIC8gc2l6ZW9mKHUzMik7CkBAIC02MzIsOCArNjI3LDggQEAKIAl1MzIgaHdvcmRzOwogCXUzMiBwYnVmbjsKIAl1MzIgX19pb21lbSAqcGlvYnVmOwotCXN0cnVjdCBxaWJfaWJfaGVhZGVyIGhkcjsKLQlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX2hlYWRlciBoZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJdTMyIGNvbnRyb2w7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtOTQyLDkgKzkzNyw5IEBACiAvKgogICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIFFQIHNfbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgogICovCi12b2lkIHFpYl9yY19zZW5kX2NvbXBsZXRlKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyKQordm9pZCBxaWJfcmNfc2VuZF9jb21wbGV0ZShzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX2hlYWRlciAqaGRyKQogewotCXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAlzdHJ1Y3QgcnZ0X3N3cWUgKndxZTsKIAlzdHJ1Y3QgaWJfd2Mgd2M7CiAJdW5zaWduZWQgaTsKQEAgLTExNzcsNyArMTE3Miw3IEBACiAJCQkJcWliX3Jlc3RhcnRfcmMocXAsIHFwLT5zX2xhc3RfcHNuICsgMSwgMCk7CiAJCQkJaWYgKGxpc3RfZW1wdHkoJnFwLT5yc3B3YWl0KSkgewogCQkJCQlxcC0+cl9mbGFncyB8PSBSVlRfUl9SU1BfU0VORDsKLQkJCQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJCQkJcnZ0X2dldF9xcChxcCk7CiAJCQkJCWxpc3RfYWRkX3RhaWwoJnFwLT5yc3B3YWl0LAogCQkJCQkJICAgICAgJnJjZC0+cXBfd2FpdF9saXN0KTsKIAkJCQl9CkBAIC0xMzYxLDcgKzEzNTYsNyBAQAogCXFpYl9yZXN0YXJ0X3JjKHFwLCBxcC0+c19sYXN0X3BzbiArIDEsIDApOwogCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJcXAtPnJfZmxhZ3MgfD0gUlZUX1JfUlNQX1NFTkQ7Ci0JCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCXJ2dF9nZXRfcXAocXApOwogCQlsaXN0X2FkZF90YWlsKCZxcC0+cnNwd2FpdCwgJnJjZC0+cXBfd2FpdF9saXN0KTsKIAl9CiB9CkBAIC0xMzgzLDcgKzEzNzgsNyBAQAogICogQ2FsbGVkIGF0IGludGVycnVwdCBsZXZlbC4KICAqLwogc3RhdGljIHZvaWQgcWliX3JjX3Jjdl9yZXNwKHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsCi0JCQkgICAgc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAorCQkJICAgIHN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAogCQkJICAgIHZvaWQgKmRhdGEsIHUzMiB0bGVuLAogCQkJICAgIHN0cnVjdCBydnRfcXAgKnFwLAogCQkJICAgIHUzMiBvcGNvZGUsCkBAIC0xNDYzLDEyICsxNDU4LDkgQEAKIAljYXNlIE9QKEFUT01JQ19BQ0tOT1dMRURHRSk6CiAJY2FzZSBPUChSRE1BX1JFQURfUkVTUE9OU0VfRklSU1QpOgogCQlhZXRoID0gYmUzMl90b19jcHUob2hkci0+dS5hZXRoKTsKLQkJaWYgKG9wY29kZSA9PSBPUChBVE9NSUNfQUNLTk9XTEVER0UpKSB7Ci0JCQlfX2JlMzIgKnAgPSBvaGRyLT51LmF0LmF0b21pY19hY2tfZXRoOwotCi0JCQl2YWwgPSAoKHU2NCkgYmUzMl90b19jcHUocFswXSkgPDwgMzIpIHwKLQkJCQliZTMyX3RvX2NwdShwWzFdKTsKLQkJfSBlbHNlCisJCWlmIChvcGNvZGUgPT0gT1AoQVRPTUlDX0FDS05PV0xFREdFKSkKKwkJCXZhbCA9IGliX3U2NF9nZXQoJm9oZHItPnUuYXQuYXRvbWljX2Fja19ldGgpOworCQllbHNlCiAJCQl2YWwgPSAwOwogCQlpZiAoIWRvX3JjX2FjayhxcCwgYWV0aCwgcHNuLCBvcGNvZGUsIHZhbCwgcmNkKSB8fAogCQkgICAgb3Bjb2RlICE9IE9QKFJETUFfUkVBRF9SRVNQT05TRV9GSVJTVCkpCkBAIC0xNjA4LDcgKzE2MDAsNyBAQAogICogUmV0dXJuIDEgaWYgbm8gbW9yZSBwcm9jZXNzaW5nIGlzIG5lZWRlZDsgb3RoZXJ3aXNlIHJldHVybiAwIHRvCiAgKiBzY2hlZHVsZSBhIHJlc3BvbnNlIHRvIGJlIHNlbnQuCiAgKi8KLXN0YXRpYyBpbnQgcWliX3JjX3Jjdl9lcnJvcihzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgKm9oZHIsCitzdGF0aWMgaW50IHFpYl9yY19yY3ZfZXJyb3Ioc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHIsCiAJCQkgICAgdm9pZCAqZGF0YSwKIAkJCSAgICBzdHJ1Y3QgcnZ0X3FwICpxcCwKIAkJCSAgICB1MzIgb3Bjb2RlLApAQCAtMTY0MCw3ICsxNjMyLDcgQEAKIAkJCSAqLwogCQkJaWYgKGxpc3RfZW1wdHkoJnFwLT5yc3B3YWl0KSkgewogCQkJCXFwLT5yX2ZsYWdzIHw9IFJWVF9SX1JTUF9OQUs7Ci0JCQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJCQlydnRfZ2V0X3FwKHFwKTsKIAkJCQlsaXN0X2FkZF90YWlsKCZxcC0+cnNwd2FpdCwgJnJjZC0+cXBfd2FpdF9saXN0KTsKIAkJCX0KIAkJfQpAQCAtMTg0OCwxMSArMTg0MCwxMSBAQAogICogZm9yIHRoZSBnaXZlbiBRUC4KICAqIENhbGxlZCBhdCBpbnRlcnJ1cHQgbGV2ZWwuCiAgKi8KLXZvaWQgcWliX3JjX3JjdihzdHJ1Y3QgcWliX2N0eHRkYXRhICpyY2QsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCit2b2lkIHFpYl9yY19yY3Yoc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCWludCBoYXNfZ3JoLCB2b2lkICpkYXRhLCB1MzIgdGxlbiwgc3RydWN0IHJ2dF9xcCAqcXApCiB7CiAJc3RydWN0IHFpYl9pYnBvcnQgKmlicCA9ICZyY2QtPnBwZC0+aWJwb3J0X2RhdGE7Ci0Jc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXUzMiBvcGNvZGU7CiAJdTMyIGhkcnNpemU7CiAJdTMyIHBzbjsKQEAgLTIxNzcsOCArMjE2OSw3IEBACiAJCQllLT5yZG1hX3NnZS5tciA9IE5VTEw7CiAJCX0KIAkJYXRldGggPSAmb2hkci0+dS5hdG9taWNfZXRoOwotCQl2YWRkciA9ICgodTY0KSBiZTMyX3RvX2NwdShhdGV0aC0+dmFkZHJbMF0pIDw8IDMyKSB8Ci0JCQliZTMyX3RvX2NwdShhdGV0aC0+dmFkZHJbMV0pOworCQl2YWRkciA9IGdldF9pYl9hdGV0aF92YWRkcihhdGV0aCk7CiAJCWlmICh1bmxpa2VseSh2YWRkciAmIChzaXplb2YodTY0KSAtIDEpKSkKIAkJCWdvdG8gbmFja19pbnZfdW5sY2s7CiAJCXJrZXkgPSBiZTMyX3RvX2NwdShhdGV0aC0+cmtleSk7CkBAIC0yMTg5LDExICsyMTgwLDExIEBACiAJCQlnb3RvIG5hY2tfYWNjX3VubGNrOwogCQkvKiBQZXJmb3JtIGF0b21pYyBPUCBhbmQgc2F2ZSByZXN1bHQuICovCiAJCW1hZGRyID0gKGF0b21pYzY0X3QgKikgcXAtPnJfc2dlLnNnZS52YWRkcjsKLQkJc2RhdGEgPSBiZTY0X3RvX2NwdShhdGV0aC0+c3dhcF9kYXRhKTsKKwkJc2RhdGEgPSBnZXRfaWJfYXRldGhfc3dhcChhdGV0aCk7CiAJCWUtPmF0b21pY19kYXRhID0gKG9wY29kZSA9PSBPUChGRVRDSF9BREQpKSA/CiAJCQkodTY0KSBhdG9taWM2NF9hZGRfcmV0dXJuKHNkYXRhLCBtYWRkcikgLSBzZGF0YSA6CiAJCQkodTY0KSBjbXB4Y2hnKCh1NjQgKikgcXAtPnJfc2dlLnNnZS52YWRkciwKLQkJCQkgICAgICBiZTY0X3RvX2NwdShhdGV0aC0+Y29tcGFyZV9kYXRhKSwKKwkJCQkgICAgICBnZXRfaWJfYXRldGhfY29tcGFyZShhdGV0aCksCiAJCQkJICAgICAgc2RhdGEpOwogCQlydnRfcHV0X21yKHFwLT5yX3NnZS5zZ2UubXIpOwogCQlxcC0+cl9zZ2UubnVtX3NnZSA9IDA7CkBAIC0yMjMzLDcgKzIyMjQsNyBAQAogCS8qIFF1ZXVlIFJOUiBOQUsgZm9yIGxhdGVyICovCiAJaWYgKGxpc3RfZW1wdHkoJnFwLT5yc3B3YWl0KSkgewogCQlxcC0+cl9mbGFncyB8PSBSVlRfUl9SU1BfTkFLOwotCQlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworCQlydnRfZ2V0X3FwKHFwKTsKIAkJbGlzdF9hZGRfdGFpbCgmcXAtPnJzcHdhaXQsICZyY2QtPnFwX3dhaXRfbGlzdCk7CiAJfQogCXJldHVybjsKQEAgLTIyNDUsNyArMjIzNiw3IEBACiAJLyogUXVldWUgTkFLIGZvciBsYXRlciAqLwogCWlmIChsaXN0X2VtcHR5KCZxcC0+cnNwd2FpdCkpIHsKIAkJcXAtPnJfZmxhZ3MgfD0gUlZUX1JfUlNQX05BSzsKLQkJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKKwkJcnZ0X2dldF9xcChxcCk7CiAJCWxpc3RfYWRkX3RhaWwoJnFwLT5yc3B3YWl0LCAmcmNkLT5xcF93YWl0X2xpc3QpOwogCX0KIAlyZXR1cm47CkBAIC0yMjU5LDcgKzIyNTAsNyBAQAogCS8qIFF1ZXVlIE5BSyBmb3IgbGF0ZXIgKi8KIAlpZiAobGlzdF9lbXB0eSgmcXAtPnJzcHdhaXQpKSB7CiAJCXFwLT5yX2ZsYWdzIHw9IFJWVF9SX1JTUF9OQUs7Ci0JCWF0b21pY19pbmMoJnFwLT5yZWZjb3VudCk7CisJCXJ2dF9nZXRfcXAocXApOwogCQlsaXN0X2FkZF90YWlsKCZxcC0+cnNwd2FpdCwgJnJjZC0+cXBfd2FpdF9saXN0KTsKIAl9CiAJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfcnVjLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9ydWMuYwppbmRleCBiNjc3NzkyLi5kZTFiZGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9ydWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9ydWMuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiAgKgogICogVGhlIHNfbG9jayB3aWxsIGJlIGFjcXVpcmVkIGFyb3VuZCB0aGUgcWliX21pZ3JhdGVfcXAoKSBjYWxsLgogICovCi1pbnQgcWliX3J1Y19jaGVja19oZHIoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciwKK2ludCBxaWJfcnVjX2NoZWNrX2hkcihzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCSAgICAgIGludCBoYXNfZ3JoLCBzdHJ1Y3QgcnZ0X3FwICpxcCwgdTMyIGJ0aDApCiB7CiAJX19iZTY0IGd1aWQ7CkBAIC02ODAsNyArNjgwLDcgQEAKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpYl9ncmgpIC8gc2l6ZW9mKHUzMik7CiB9CiAKLXZvaWQgcWliX21ha2VfcnVjX2hlYWRlcihzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAordm9pZCBxaWJfbWFrZV9ydWNfaGVhZGVyKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKIAkJCSB1MzIgYnRoMCwgdTMyIGJ0aDIpCiB7CiAJc3RydWN0IHFpYl9xcF9wcml2ICpwcml2ID0gcXAtPnByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91Yy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWMuYwppbmRleCAxZDYxYmQwLi41YjJkNDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91Yy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VjLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIGludCBxaWJfbWFrZV91Y19yZXEoc3RydWN0IHJ2dF9xcCAqcXAsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewogCXN0cnVjdCBxaWJfcXBfcHJpdiAqcHJpdiA9IHFwLT5wcml2OwotCXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKKwlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkcjsKIAlzdHJ1Y3QgcnZ0X3N3cWUgKndxZTsKIAl1MzIgaHdvcmRzOwogCXUzMiBidGgwOwpAQCAtMjM2LDEwICsyMzYsMTAgQEAKICAqIGZvciB0aGUgZ2l2ZW4gUVAuCiAgKiBDYWxsZWQgYXQgaW50ZXJydXB0IGxldmVsLgogICovCi12b2lkIHFpYl91Y19yY3Yoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciwKK3ZvaWQgcWliX3VjX3JjdihzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCWludCBoYXNfZ3JoLCB2b2lkICpkYXRhLCB1MzIgdGxlbiwgc3RydWN0IHJ2dF9xcCAqcXApCiB7Ci0Jc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCXUzMiBvcGNvZGU7CiAJdTMyIGhkcnNpemU7CiAJdTMyIHBzbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl91ZC5jCmluZGV4IDEwZDA2MjUuLmY0NWNhZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3VkLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdWQuYwpAQCAtMjQ1LDcgKzI0NSw3IEBACiBpbnQgcWliX21ha2VfdWRfcmVxKHN0cnVjdCBydnRfcXAgKnFwLCB1bnNpZ25lZCBsb25nICpmbGFncykKIHsKIAlzdHJ1Y3QgcWliX3FwX3ByaXYgKnByaXYgPSBxcC0+cHJpdjsKLQlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IGliX2FoX2F0dHIgKmFoX2F0dHI7CiAJc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZDsKIAlzdHJ1Y3QgcWliX2licG9ydCAqaWJwOwpAQCAtNDM1LDEwICs0MzUsMTAgQEAKICAqIGZvciB0aGUgZ2l2ZW4gUVAuCiAgKiBDYWxsZWQgYXQgaW50ZXJydXB0IGxldmVsLgogICovCi12b2lkIHFpYl91ZF9yY3Yoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciwKK3ZvaWQgcWliX3VkX3JjdihzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCWludCBoYXNfZ3JoLCB2b2lkICpkYXRhLCB1MzIgdGxlbiwgc3RydWN0IHJ2dF9xcCAqcXApCiB7Ci0Jc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyOworCXN0cnVjdCBpYl9vdGhlcl9oZWFkZXJzICpvaGRyOwogCWludCBvcGNvZGU7CiAJdTMyIGhkcnNpemU7CiAJdTMyIHBhZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5jCmluZGV4IGZkMWRmYmMuLjg3NmViYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAgKiBmb3IgdGhlIGdpdmVuIFFQLgogICogQ2FsbGVkIGF0IGludGVycnVwdCBsZXZlbC4KICAqLwotc3RhdGljIHZvaWQgcWliX3FwX3JjdihzdHJ1Y3QgcWliX2N0eHRkYXRhICpyY2QsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCitzdGF0aWMgdm9pZCBxaWJfcXBfcmN2KHN0cnVjdCBxaWJfY3R4dGRhdGEgKnJjZCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQkgICAgICAgaW50IGhhc19ncmgsIHZvaWQgKmRhdGEsIHUzMiB0bGVuLCBzdHJ1Y3QgcnZ0X3FwICpxcCkKIHsKIAlzdHJ1Y3QgcWliX2licG9ydCAqaWJwID0gJnJjZC0+cHBkLT5pYnBvcnRfZGF0YTsKQEAgLTM2NiwxMCArMzY2LDEwIEBACiB7CiAJc3RydWN0IHFpYl9wcG9ydGRhdGEgKnBwZCA9IHJjZC0+cHBkOwogCXN0cnVjdCBxaWJfaWJwb3J0ICppYnAgPSAmcHBkLT5pYnBvcnRfZGF0YTsKLQlzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyID0gcmhkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyICpoZHIgPSByaGRyOwogCXN0cnVjdCBxaWJfZGV2ZGF0YSAqZGQgPSBwcGQtPmRkOwogCXN0cnVjdCBydnRfZGV2X2luZm8gKnJkaSA9ICZkZC0+dmVyYnNfZGV2LnJkaTsKLQlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgKm9oZHI7CisJc3RydWN0IGliX290aGVyX2hlYWRlcnMgKm9oZHI7CiAJc3RydWN0IHJ2dF9xcCAqcXA7CiAJdTMyIHFwX251bTsKIAlpbnQgbG5oOwpAQCAtODQxLDcgKzg0MSw3IEBACiAJaWYgKHR4LT53cWUpCiAJCXFpYl9zZW5kX2NvbXBsZXRlKHFwLCB0eC0+d3FlLCBJQl9XQ19TVUNDRVNTKTsKIAllbHNlIGlmIChxcC0+aWJxcC5xcF90eXBlID09IElCX1FQVF9SQykgewotCQlzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyOworCQlzdHJ1Y3QgaWJfaGVhZGVyICpoZHI7CiAKIAkJaWYgKHR4LT50eHJlcS5mbGFncyAmIFFJQl9TRE1BX1RYUkVRX0ZfRlJFRUJVRikKIAkJCWhkciA9ICZ0eC0+YWxpZ25fYnVmLT5oZHI7CkBAIC04ODksNyArODg5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHFpYl92ZXJic19zZW5kX2RtYShzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciwKK3N0YXRpYyBpbnQgcWliX3ZlcmJzX3NlbmRfZG1hKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCQkgICAgICB1MzIgaGRyd29yZHMsIHN0cnVjdCBydnRfc2dlX3N0YXRlICpzcywgdTMyIGxlbiwKIAkJCSAgICAgIHUzMiBwbGVuLCB1MzIgZHdvcmRzKQogewpAQCAtMTAyNSw3ICsxMDI1LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHFpYl92ZXJic19zZW5kX3BpbyhzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmliaGRyLAorc3RhdGljIGludCBxaWJfdmVyYnNfc2VuZF9waW8oc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBpYl9oZWFkZXIgKmliaGRyLAogCQkJICAgICAgdTMyIGhkcndvcmRzLCBzdHJ1Y3QgcnZ0X3NnZV9zdGF0ZSAqc3MsIHUzMiBsZW4sCiAJCQkgICAgICB1MzIgcGxlbiwgdTMyIGR3b3JkcykKIHsKQEAgLTExMzMsNyArMTEzMyw3IEBACiAgKiBSZXR1cm4gemVybyBpZiBwYWNrZXQgaXMgc2VudCBvciBxdWV1ZWQgT0suCiAgKiBSZXR1cm4gbm9uLXplcm8gYW5kIGNsZWFyIHFwLT5zX2ZsYWdzIFJWVF9TX0JVU1kgb3RoZXJ3aXNlLgogICovCi1pbnQgcWliX3ZlcmJzX3NlbmQoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCitpbnQgcWliX3ZlcmJzX3NlbmQoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkciwKIAkJICAgdTMyIGhkcndvcmRzLCBzdHJ1Y3QgcnZ0X3NnZV9zdGF0ZSAqc3MsIHUzMiBsZW4pCiB7CiAJc3RydWN0IHFpYl9kZXZkYXRhICpkZCA9IGRkX2Zyb21faWJkZXYocXAtPmlicXAuZGV2aWNlKTsKQEAgLTE2MDYsOCArMTYwNiw2IEBACiAJLyogT25seSBuZWVkIHRvIGluaXRpYWxpemUgbm9uLXplcm8gZmllbGRzLiAqLwogCXNldHVwX3RpbWVyKCZkZXYtPm1lbV90aW1lciwgbWVtX3RpbWVyLCAodW5zaWduZWQgbG9uZylkZXYpOwogCi0JcXB0X21hc2sgPSBkZC0+cXBuX21hc2s7Ci0KIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5waW93YWl0KTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5kbWF3YWl0KTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT50eHdhaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX3ZlcmJzLmgKaW5kZXggNzM2Y2VkNi4uOTRmZDMwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfdmVyYnMuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl92ZXJicy5oCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPHJkbWEvaWJfcGFjay5oPgogI2luY2x1ZGUgPHJkbWEvaWJfdXNlcl92ZXJicy5oPgorI2luY2x1ZGUgPHJkbWEvaWJfaGRycy5oPgogI2luY2x1ZGUgPHJkbWEvcmRtYV92dC5oPgogI2luY2x1ZGUgPHJkbWEvcmRtYXZ0X2NxLmg+CiAKQEAgLTYzLDE2ICs2NCw2IEBACiAgKi8KICNkZWZpbmUgUUlCX1VWRVJCU19BQklfVkVSU0lPTiAgICAgICAyCiAKLSNkZWZpbmUgSUJfU0VRX05BSwkoMyA8PCAyOSkKLQotLyogQUVUSCBOQUsgb3Bjb2RlIHZhbHVlcyAqLwotI2RlZmluZSBJQl9STlJfTkFLICAgICAgICAgICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgSUJfTkFLX1BTTl9FUlJPUiAgICAgICAgICAgICAgICAweDYwCi0jZGVmaW5lIElCX05BS19JTlZBTElEX1JFUVVFU1QgICAgICAgICAgMHg2MQotI2RlZmluZSBJQl9OQUtfUkVNT1RFX0FDQ0VTU19FUlJPUiAgICAgIDB4NjIKLSNkZWZpbmUgSUJfTkFLX1JFTU9URV9PUEVSQVRJT05BTF9FUlJPUiAweDYzCi0jZGVmaW5lIElCX05BS19JTlZBTElEX1JEX1JFUVVFU1QgICAgICAgMHg2NAotCiAvKiBJQiBQZXJmb3JtYW5jZSBNYW5hZ2VyIHN0YXR1cyB2YWx1ZXMgKi8KICNkZWZpbmUgSUJfUE1BX1NBTVBMRV9TVEFUVVNfRE9ORSAgICAgICAweDAwCiAjZGVmaW5lIElCX1BNQV9TQU1QTEVfU1RBVFVTX1NUQVJURUQgICAgMHgwMQpAQCAtODcsMjIgKzc4LDkgQEAKIAogI2RlZmluZSBRSUJfVkVORE9SX0lQRwkJY3B1X3RvX2JlMTYoMHhGRkEwKQogCi0jZGVmaW5lIElCX0JUSF9SRVFfQUNLCQkoMSA8PCAzMSkKLSNkZWZpbmUgSUJfQlRIX1NPTElDSVRFRAkoMSA8PCAyMykKLSNkZWZpbmUgSUJfQlRIX01JR19SRVEJCSgxIDw8IDIyKQotCiAvKiBYWFggU2hvdWxkIGJlIGRlZmluZWQgaW4gaWJfdmVyYnMuaCBlbnVtIGliX3BvcnRfY2FwX2ZsYWdzICovCiAjZGVmaW5lIElCX1BPUlRfT1RIRVJfTE9DQUxfQ0hBTkdFU19TVVAgKDEgPDwgMjYpCiAKLSNkZWZpbmUgSUJfR1JIX1ZFUlNJT04JCTYKLSNkZWZpbmUgSUJfR1JIX1ZFUlNJT05fTUFTSwkweEYKLSNkZWZpbmUgSUJfR1JIX1ZFUlNJT05fU0hJRlQJMjgKLSNkZWZpbmUgSUJfR1JIX1RDTEFTU19NQVNLCTB4RkYKLSNkZWZpbmUgSUJfR1JIX1RDTEFTU19TSElGVAkyMAotI2RlZmluZSBJQl9HUkhfRkxPV19NQVNLCTB4RkZGRkYKLSNkZWZpbmUgSUJfR1JIX0ZMT1dfU0hJRlQJMAotI2RlZmluZSBJQl9HUkhfTkVYVF9IRFIJCTB4MUIKLQogI2RlZmluZSBJQl9ERUZBVUxUX0dJRF9QUkVGSVgJY3B1X3RvX2JlNjQoMHhmZTgwMDAwMDAwMDAwMDAwVUxMKQogCiAvKiBWYWx1ZXMgZm9yIHNldC9nZXQgcG9ydGluZm8gVkxDYXAgT3BlcmF0aW9uYWxWTHMgKi8KQEAgLTEyOSw2MSArMTA3LDkgQEAKIAl9CiB9CiAKLXN0cnVjdCBpYl9yZXRoIHsKLQlfX2JlNjQgdmFkZHI7Ci0JX19iZTMyIHJrZXk7Ci0JX19iZTMyIGxlbmd0aDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpYl9hdG9taWNfZXRoIHsKLQlfX2JlMzIgdmFkZHJbMl07ICAgICAgICAvKiB1bmFsaWduZWQgc28gYWNjZXNzIGFzIDIgMzItYml0IHdvcmRzICovCi0JX19iZTMyIHJrZXk7Ci0JX19iZTY0IHN3YXBfZGF0YTsKLQlfX2JlNjQgY29tcGFyZV9kYXRhOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzIHsKLQlfX2JlMzIgYnRoWzNdOwotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCV9fYmUzMiBkZXRoWzJdOwotCQkJX19iZTMyIGltbV9kYXRhOwotCQl9IHVkOwotCQlzdHJ1Y3QgewotCQkJc3RydWN0IGliX3JldGggcmV0aDsKLQkJCV9fYmUzMiBpbW1fZGF0YTsKLQkJfSByYzsKLQkJc3RydWN0IHsKLQkJCV9fYmUzMiBhZXRoOwotCQkJX19iZTMyIGF0b21pY19hY2tfZXRoWzJdOwotCQl9IGF0OwotCQlfX2JlMzIgaW1tX2RhdGE7Ci0JCV9fYmUzMiBhZXRoOwotCQlfX2JlMzIgaWV0aDsKLQkJc3RydWN0IGliX2F0b21pY19ldGggYXRvbWljX2V0aDsKLQl9IHU7Ci19IF9fcGFja2VkOwotCi0vKgotICogTm90ZSB0aGF0IFVEIHBhY2tldHMgd2l0aCBhIEdSSCBoZWFkZXIgYXJlIDgrNDArMTIrOCA9IDY4IGJ5dGVzCi0gKiBsb25nICg3MiB3LyBpbW1fZGF0YSkuICBPbmx5IHRoZSBmaXJzdCA1NiBieXRlcyBvZiB0aGUgSUIgaGVhZGVyCi0gKiB3aWxsIGJlIGluIHRoZSBlYWdlciBoZWFkZXIgYnVmZmVyLiAgVGhlIHJlbWFpbmluZyAxMiBvciAxNiBieXRlcwotICogYXJlIGluIHRoZSBkYXRhIGJ1ZmZlci4KLSAqLwotc3RydWN0IHFpYl9pYl9oZWFkZXIgewotCV9fYmUxNiBscmhbNF07Ci0JdW5pb24gewotCQlzdHJ1Y3QgewotCQkJc3RydWN0IGliX2dyaCBncmg7Ci0JCQlzdHJ1Y3QgcWliX290aGVyX2hlYWRlcnMgb3RoOwotCQl9IGw7Ci0JCXN0cnVjdCBxaWJfb3RoZXJfaGVhZGVycyBvdGg7Ci0JfSB1OwotfSBfX3BhY2tlZDsKLQogc3RydWN0IHFpYl9waW9faGVhZGVyIHsKIAlfX2xlMzIgcGJjWzJdOwotCXN0cnVjdCBxaWJfaWJfaGVhZGVyIGhkcjsKKwlzdHJ1Y3QgaWJfaGVhZGVyIGhkcjsKIH0gX19wYWNrZWQ7CiAKIC8qCkBAIC0xOTEsNyArMTE3LDcgQEAKICAqIGlzIG1hZGUgY29tbW9uLgogICovCiBzdHJ1Y3QgcWliX3FwX3ByaXYgewotCXN0cnVjdCBxaWJfaWJfaGVhZGVyICpzX2hkcjsgICAgLyogbmV4dCBwYWNrZXQgaGVhZGVyIHRvIHNlbmQgKi8KKwlzdHJ1Y3QgaWJfaGVhZGVyICpzX2hkcjsgICAgICAgIC8qIG5leHQgcGFja2V0IGhlYWRlciB0byBzZW5kICovCiAJc3RydWN0IGxpc3RfaGVhZCBpb3dhaXQ7ICAgICAgICAvKiBsaW5rIGZvciB3YWl0IFBJTyBidWYgKi8KIAlhdG9taWNfdCBzX2RtYV9idXN5OwogCXN0cnVjdCBxaWJfdmVyYnNfdHhyZXEgKnNfdHg7CkBAIC0zNzYsNyArMzAyLDcgQEAKIAogdm9pZCBxaWJfcHV0X3R4cmVxKHN0cnVjdCBxaWJfdmVyYnNfdHhyZXEgKnR4KTsKIAotaW50IHFpYl92ZXJic19zZW5kKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAoraW50IHFpYl92ZXJic19zZW5kKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCSAgIHUzMiBoZHJ3b3Jkcywgc3RydWN0IHJ2dF9zZ2Vfc3RhdGUgKnNzLCB1MzIgbGVuKTsKIAogdm9pZCBxaWJfY29weV9zZ2Uoc3RydWN0IHJ2dF9zZ2Vfc3RhdGUgKnNzLCB2b2lkICpkYXRhLCB1MzIgbGVuZ3RoLApAQCAtMzg0LDEwICszMTAsMTAgQEAKIAogdm9pZCBxaWJfc2tpcF9zZ2Uoc3RydWN0IHJ2dF9zZ2Vfc3RhdGUgKnNzLCB1MzIgbGVuZ3RoLCBpbnQgcmVsZWFzZSk7CiAKLXZvaWQgcWliX3VjX3JjdihzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyLAordm9pZCBxaWJfdWNfcmN2KHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkciwKIAkJaW50IGhhc19ncmgsIHZvaWQgKmRhdGEsIHUzMiB0bGVuLCBzdHJ1Y3QgcnZ0X3FwICpxcCk7CiAKLXZvaWQgcWliX3JjX3JjdihzdHJ1Y3QgcWliX2N0eHRkYXRhICpyY2QsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCit2b2lkIHFpYl9yY19yY3Yoc3RydWN0IHFpYl9jdHh0ZGF0YSAqcmNkLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCWludCBoYXNfZ3JoLCB2b2lkICpkYXRhLCB1MzIgdGxlbiwgc3RydWN0IHJ2dF9xcCAqcXApOwogCiBpbnQgcWliX2NoZWNrX2FoKHN0cnVjdCBpYl9kZXZpY2UgKmliZGV2LCBzdHJ1Y3QgaWJfYWhfYXR0ciAqYWhfYXR0cik7CkBAIC0zOTgsMTMgKzMyNCwxMyBAQAogCiB2b2lkIHFpYl9yY19ybnJfcmV0cnkodW5zaWduZWQgbG9uZyBhcmcpOwogCi12b2lkIHFpYl9yY19zZW5kX2NvbXBsZXRlKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgcWliX2liX2hlYWRlciAqaGRyKTsKK3ZvaWQgcWliX3JjX3NlbmRfY29tcGxldGUoc3RydWN0IHJ2dF9xcCAqcXAsIHN0cnVjdCBpYl9oZWFkZXIgKmhkcik7CiAKIHZvaWQgcWliX3JjX2Vycm9yKHN0cnVjdCBydnRfcXAgKnFwLCBlbnVtIGliX3djX3N0YXR1cyBlcnIpOwogCiBpbnQgcWliX3Bvc3RfdWRfc2VuZChzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IGliX3NlbmRfd3IgKndyKTsKIAotdm9pZCBxaWJfdWRfcmN2KHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBxaWJfaWJfaGVhZGVyICpoZHIsCit2b2lkIHFpYl91ZF9yY3Yoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IGliX2hlYWRlciAqaGRyLAogCQlpbnQgaGFzX2dyaCwgdm9pZCAqZGF0YSwgdTMyIHRsZW4sIHN0cnVjdCBydnRfcXAgKnFwKTsKIAogdm9pZCBtcl9yY3VfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpsaXN0KTsKQEAgLTQxMywxMyArMzM5LDEzIEBACiAKIHZvaWQgcWliX21pZ3JhdGVfcXAoc3RydWN0IHJ2dF9xcCAqcXApOwogCi1pbnQgcWliX3J1Y19jaGVja19oZHIoc3RydWN0IHFpYl9pYnBvcnQgKmlicCwgc3RydWN0IHFpYl9pYl9oZWFkZXIgKmhkciwKK2ludCBxaWJfcnVjX2NoZWNrX2hkcihzdHJ1Y3QgcWliX2licG9ydCAqaWJwLCBzdHJ1Y3QgaWJfaGVhZGVyICpoZHIsCiAJCSAgICAgIGludCBoYXNfZ3JoLCBzdHJ1Y3QgcnZ0X3FwICpxcCwgdTMyIGJ0aDApOwogCiB1MzIgcWliX21ha2VfZ3JoKHN0cnVjdCBxaWJfaWJwb3J0ICppYnAsIHN0cnVjdCBpYl9ncmggKmhkciwKIAkJIHN0cnVjdCBpYl9nbG9iYWxfcm91dGUgKmdyaCwgdTMyIGh3b3JkcywgdTMyIG53b3Jkcyk7CiAKLXZvaWQgcWliX21ha2VfcnVjX2hlYWRlcihzdHJ1Y3QgcnZ0X3FwICpxcCwgc3RydWN0IHFpYl9vdGhlcl9oZWFkZXJzICpvaGRyLAordm9pZCBxaWJfbWFrZV9ydWNfaGVhZGVyKHN0cnVjdCBydnRfcXAgKnFwLCBzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyAqb2hkciwKIAkJCSB1MzIgYnRoMCwgdTMyIGJ0aDIpOwogCiB2b2lkIF9xaWJfZG9fc2VuZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3JkbWF2dC9tci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3JkbWF2dC9tci5jCmluZGV4IDgwYzRiNmIuLjQ2YjY0OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yZG1hdnQvbXIuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcmRtYXZ0L21yLmMKQEAgLTI5NCw3ICsyOTQsNyBAQAogewogCXJ2dF9kZWluaXRfbXJlZ2lvbigmbXItPm1yKTsKIAlydnRfZnJlZV9sa2V5KCZtci0+bXIpOwotCXZmcmVlKG1yKTsKKwlrZnJlZShtcik7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3JkbWF2dC9xcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3JkbWF2dC9xcC5jCmluZGV4IDg3MGI0ZjIuLjY1MDBjM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yZG1hdnQvcXAuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcmRtYXZ0L3FwLmMKQEAgLTQ4OCw2MCArNDg4LDIzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmRpLT5xcF9kZXYtPnFwdF9sb2NrLCBmbGFncyk7CiAJaWYgKHJlbW92ZWQpIHsKIAkJc3luY2hyb25pemVfcmN1KCk7Ci0JCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZxcC0+cmVmY291bnQpKQotCQkJd2FrZV91cCgmcXAtPndhaXQpOworCQlydnRfcHV0X3FwKHFwKTsKIAl9CiB9CiAKIC8qKgotICogcmVzZXRfcXAgLSBpbml0aWFsaXplIHRoZSBRUCBzdGF0ZSB0byB0aGUgcmVzZXQgc3RhdGUKLSAqIEBxcDogdGhlIFFQIHRvIHJlc2V0CisgKiBydnRfaW5pdF9xcCAtIGluaXRpYWxpemUgdGhlIFFQIHN0YXRlIHRvIHRoZSByZXNldCBzdGF0ZQorICogQHFwOiB0aGUgUVAgdG8gaW5pdCBvciByZWluaXQKICAqIEB0eXBlOiB0aGUgUVAgdHlwZQotICogciBhbmQgcyBsb2NrIGFyZSByZXF1aXJlZCB0byBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGJvdGggcnZ0X2NyZWF0ZV9xcCgpIGFuZAorICogcnZ0X3Jlc2V0X3FwKCkuICAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgcmVzZXQKKyAqIHBhdGNoIHRoZSBuZWNlc3NhcnkgbG9ja3MgdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cmVudAorICogYWNjZXNzLgogICovCi1zdGF0aWMgdm9pZCBydnRfcmVzZXRfcXAoc3RydWN0IHJ2dF9kZXZfaW5mbyAqcmRpLCBzdHJ1Y3QgcnZ0X3FwICpxcCwKLQkJICBlbnVtIGliX3FwX3R5cGUgdHlwZSkKLQlfX3JlbGVhc2VzKCZxcC0+c19sb2NrKQotCV9fcmVsZWFzZXMoJnFwLT5zX2hsb2NrKQotCV9fcmVsZWFzZXMoJnFwLT5yX2xvY2spCi0JX19hY3F1aXJlcygmcXAtPnJfbG9jaykKLQlfX2FjcXVpcmVzKCZxcC0+c19obG9jaykKLQlfX2FjcXVpcmVzKCZxcC0+c19sb2NrKQorc3RhdGljIHZvaWQgcnZ0X2luaXRfcXAoc3RydWN0IHJ2dF9kZXZfaW5mbyAqcmRpLCBzdHJ1Y3QgcnZ0X3FwICpxcCwKKwkJCWVudW0gaWJfcXBfdHlwZSB0eXBlKQogewotCWlmIChxcC0+c3RhdGUgIT0gSUJfUVBTX1JFU0VUKSB7Ci0JCXFwLT5zdGF0ZSA9IElCX1FQU19SRVNFVDsKLQotCQkvKiBMZXQgZHJpdmVycyBmbHVzaCB0aGVpciB3YWl0bGlzdCAqLwotCQlyZGktPmRyaXZlcl9mLmZsdXNoX3FwX3dhaXRlcnMocXApOwotCQlxcC0+c19mbGFncyAmPSB+KFJWVF9TX1RJTUVSIHwgUlZUX1NfQU5ZX1dBSVQpOwotCQlzcGluX3VubG9jaygmcXAtPnNfbG9jayk7Ci0JCXNwaW5fdW5sb2NrKCZxcC0+c19obG9jayk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmcXAtPnJfbG9jayk7Ci0KLQkJLyogU3RvcCB0aGUgc2VuZCBxdWV1ZSBhbmQgdGhlIHJldHJ5IHRpbWVyICovCi0JCXJkaS0+ZHJpdmVyX2Yuc3RvcF9zZW5kX3F1ZXVlKHFwKTsKLQotCQkvKiBXYWl0IGZvciB0aGluZ3MgdG8gc3RvcCAqLwotCQlyZGktPmRyaXZlcl9mLnF1aWVzY2VfcXAocXApOwotCi0JCS8qIHRha2UgcXAgb3V0IHRoZSBoYXNoIGFuZCB3YWl0IGZvciBpdCB0byBiZSB1bnVzZWQgKi8KLQkJcnZ0X3JlbW92ZV9xcChyZGksIHFwKTsKLQkJd2FpdF9ldmVudChxcC0+d2FpdCwgIWF0b21pY19yZWFkKCZxcC0+cmVmY291bnQpKTsKLQotCQkvKiBncmFiIHRoZSBsb2NrIGIvYyBpdCB3YXMgbG9ja2VkIGF0IGNhbGwgdGltZSAqLwotCQlzcGluX2xvY2tfaXJxKCZxcC0+cl9sb2NrKTsKLQkJc3Bpbl9sb2NrKCZxcC0+c19obG9jayk7Ci0JCXNwaW5fbG9jaygmcXAtPnNfbG9jayk7Ci0KLQkJcnZ0X2NsZWFyX21yX3JlZnMocXAsIDEpOwotCX0KLQotCS8qCi0JICogTGV0IHRoZSBkcml2ZXIgZG8gYW55IHRlYXIgZG93biBpdCBuZWVkcyB0byBmb3IgYSBxcAotCSAqIHRoYXQgaGFzIGJlZW4gcmVzZXQKLQkgKi8KLQlyZGktPmRyaXZlcl9mLm5vdGlmeV9xcF9yZXNldChxcCk7Ci0KIAlxcC0+cmVtb3RlX3FwbiA9IDA7CiAJcXAtPnFrZXkgPSAwOwogCXFwLT5xcF9hY2Nlc3NfZmxhZ3MgPSAwOwpAQCAtNTg3LDYgKzU1MCw2MCBAQAogfQogCiAvKioKKyAqIHJ2dF9yZXNldF9xcCAtIGluaXRpYWxpemUgdGhlIFFQIHN0YXRlIHRvIHRoZSByZXNldCBzdGF0ZQorICogQHFwOiB0aGUgUVAgdG8gcmVzZXQKKyAqIEB0eXBlOiB0aGUgUVAgdHlwZQorICoKKyAqIHJfbG9jaywgc19obG9jaywgYW5kIHNfbG9jayBhcmUgcmVxdWlyZWQgdG8gYmUgaGVsZCBieSB0aGUgY2FsbGVyCisgKi8KK3N0YXRpYyB2b2lkIHJ2dF9yZXNldF9xcChzdHJ1Y3QgcnZ0X2Rldl9pbmZvICpyZGksIHN0cnVjdCBydnRfcXAgKnFwLAorCQkJIGVudW0gaWJfcXBfdHlwZSB0eXBlKQorCV9fbXVzdF9ob2xkKCZxcC0+c19sb2NrKQorCV9fbXVzdF9ob2xkKCZxcC0+c19obG9jaykKKwlfX211c3RfaG9sZCgmcXAtPnJfbG9jaykKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+cl9sb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19obG9jayk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcXAtPnNfbG9jayk7CisJaWYgKHFwLT5zdGF0ZSAhPSBJQl9RUFNfUkVTRVQpIHsKKwkJcXAtPnN0YXRlID0gSUJfUVBTX1JFU0VUOworCisJCS8qIExldCBkcml2ZXJzIGZsdXNoIHRoZWlyIHdhaXRsaXN0ICovCisJCXJkaS0+ZHJpdmVyX2YuZmx1c2hfcXBfd2FpdGVycyhxcCk7CisJCXFwLT5zX2ZsYWdzICY9IH4oUlZUX1NfVElNRVIgfCBSVlRfU19BTllfV0FJVCk7CisJCXNwaW5fdW5sb2NrKCZxcC0+c19sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnFwLT5zX2hsb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZxcC0+cl9sb2NrKTsKKworCQkvKiBTdG9wIHRoZSBzZW5kIHF1ZXVlIGFuZCB0aGUgcmV0cnkgdGltZXIgKi8KKwkJcmRpLT5kcml2ZXJfZi5zdG9wX3NlbmRfcXVldWUocXApOworCisJCS8qIFdhaXQgZm9yIHRoaW5ncyB0byBzdG9wICovCisJCXJkaS0+ZHJpdmVyX2YucXVpZXNjZV9xcChxcCk7CisKKwkJLyogdGFrZSBxcCBvdXQgdGhlIGhhc2ggYW5kIHdhaXQgZm9yIGl0IHRvIGJlIHVudXNlZCAqLworCQlydnRfcmVtb3ZlX3FwKHJkaSwgcXApOworCQl3YWl0X2V2ZW50KHFwLT53YWl0LCAhYXRvbWljX3JlYWQoJnFwLT5yZWZjb3VudCkpOworCisJCS8qIGdyYWIgdGhlIGxvY2sgYi9jIGl0IHdhcyBsb2NrZWQgYXQgY2FsbCB0aW1lICovCisJCXNwaW5fbG9ja19pcnEoJnFwLT5yX2xvY2spOworCQlzcGluX2xvY2soJnFwLT5zX2hsb2NrKTsKKwkJc3Bpbl9sb2NrKCZxcC0+c19sb2NrKTsKKworCQlydnRfY2xlYXJfbXJfcmVmcyhxcCwgMSk7CisJCS8qCisJCSAqIExldCB0aGUgZHJpdmVyIGRvIGFueSB0ZWFyIGRvd24gb3IgcmUtaW5pdCBpdCBuZWVkcyB0byBmb3IKKwkJICogYSBxcCB0aGF0IGhhcyBiZWVuIHJlc2V0CisJCSAqLworCQlyZGktPmRyaXZlcl9mLm5vdGlmeV9xcF9yZXNldChxcCk7CisJfQorCXJ2dF9pbml0X3FwKHJkaSwgcXAsIHR5cGUpOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5yX2xvY2spOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2hsb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZxcC0+c19sb2NrKTsKK30KKworLyoqCiAgKiBydnRfY3JlYXRlX3FwIC0gY3JlYXRlIGEgcXVldWUgcGFpciBmb3IgYSBkZXZpY2UKICAqIEBpYnBkOiB0aGUgcHJvdGVjdGlvbiBkb21haW4gd2hvJ3MgZGV2aWNlIHdlIGNyZWF0ZSB0aGUgcXVldWUgcGFpciBmb3IKICAqIEBpbml0X2F0dHI6IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBxdWV1ZSBwYWlyCkBAIC03NjYsNyArNzgzLDcgQEAKIAkJfQogCQlxcC0+aWJxcC5xcF9udW0gPSBlcnI7CiAJCXFwLT5wb3J0X251bSA9IGluaXRfYXR0ci0+cG9ydF9udW07Ci0JCXJ2dF9yZXNldF9xcChyZGksIHFwLCBpbml0X2F0dHItPnFwX3R5cGUpOworCQlydnRfaW5pdF9xcChyZGksIHFwLCBpbml0X2F0dHItPnFwX3R5cGUpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC05MDYsNiArOTIzLDggQEAKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgcnZ0X2Rldl9pbmZvICpyZGkgPSBpYl90b19ydnQocXAtPmlicXAuZGV2aWNlKTsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5yX2xvY2spOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnFwLT5zX2xvY2spOwogCWlmIChxcC0+c3RhdGUgPT0gSUJfUVBTX0VSUiB8fCBxcC0+c3RhdGUgPT0gSUJfUVBTX1JFU0VUKQogCQlnb3RvIGJhaWw7CiAKQEAgLTk4MCw3ICs5OTksNyBAQAogCXN0cnVjdCBydnRfaWJwb3J0ICpydnAgPSByZGktPnBvcnRzW3FwLT5wb3J0X251bSAtIDFdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlhdG9taWNfaW5jKCZxcC0+cmVmY291bnQpOworCXJ2dF9nZXRfcXAocXApOwogCXNwaW5fbG9ja19pcnFzYXZlKCZyZGktPnFwX2Rldi0+cXB0X2xvY2ssIGZsYWdzKTsKIAogCWlmIChxcC0+aWJxcC5xcF9udW0gPD0gMSkgewpAQCAtOTk3LDcgKzEwMTYsNyBAQAogfQogCiAvKioKLSAqIHFpYl9tb2RpZnlfcXAgLSBtb2RpZnkgdGhlIGF0dHJpYnV0ZXMgb2YgYSBxdWV1ZSBwYWlyCisgKiBydnRfbW9kaWZ5X3FwIC0gbW9kaWZ5IHRoZSBhdHRyaWJ1dGVzIG9mIGEgcXVldWUgcGFpcgogICogQGlicXA6IHRoZSBxdWV1ZSBwYWlyIHdobydzIGF0dHJpYnV0ZXMgd2UncmUgbW9kaWZ5aW5nCiAgKiBAYXR0cjogdGhlIG5ldyBhdHRyaWJ1dGVzCiAgKiBAYXR0cl9tYXNrOiB0aGUgbWFzayBvZiBhdHRyaWJ1dGVzIHRvIG1vZGlmeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGUuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlLmMKaW5kZXggNTVmMGU4Zi4uZGRkNTkyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGUuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZS5jCkBAIC0zNjIsMTUgKzM2MiwzNCBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCWVyciA9IHJ4ZV9uZXRfaW5pdCgpOworCWVyciA9IHJ4ZV9uZXRfaXB2NF9pbml0KCk7CiAJaWYgKGVycikgewotCQlwcl9lcnIoInJ4ZTogdW5hYmxlIHRvIGluaXRcbiIpOworCQlwcl9lcnIoInJ4ZTogdW5hYmxlIHRvIGluaXQgaXB2NCB0dW5uZWxcbiIpOwogCQlyeGVfY2FjaGVfZXhpdCgpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIGV4aXQ7CiAJfQorCisJZXJyID0gcnhlX25ldF9pcHY2X2luaXQoKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigicnhlOiB1bmFibGUgdG8gaW5pdCBpcHY2IHR1bm5lbFxuIik7CisJCXJ4ZV9jYWNoZV9leGl0KCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnJ4ZV9uZXRfbm90aWZpZXIpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJyeGU6IEZhaWxlZCB0byByaWdpc3RlciBuZXRkZXYgbm90aWZpZXJcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCiAJcHJfaW5mbygicnhlOiBsb2FkZWRcbiIpOwogCiAJcmV0dXJuIDA7CisKK2V4aXQ6CisJcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChyZWN2X3NvY2tldHMuc2s0KTsKKwlyeGVfcmVsZWFzZV91ZHBfdHVubmVsKHJlY3Zfc29ja2V0cy5zazYpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCByeGVfbW9kdWxlX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX2NvbXAuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX2NvbXAuYwppbmRleCAzNmY2N2RlLi4xYzU5ZWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9jb21wLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfY29tcC5jCkBAIC02ODksNyArNjg5LDE0IEBACiAJCQkJCXFwLT5yZXEubmVlZF9yZXRyeSA9IDE7CiAJCQkJCXJ4ZV9ydW5fdGFzaygmcXAtPnJlcS50YXNrLCAxKTsKIAkJCQl9CisKKwkJCQlpZiAocGt0KSB7CisJCQkJCXJ4ZV9kcm9wX3JlZihwa3QtPnFwKTsKKwkJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJfQorCiAJCQkJZ290byBleGl0OworCiAJCQl9IGVsc2UgewogCQkJCXdxZS0+c3RhdHVzID0gSUJfV0NfUkVUUllfRVhDX0VSUjsKIAkJCQlzdGF0ZSA9IENPTVBTVF9FUlJPUjsKQEAgLTcxNiw2ICs3MjMsMTIgQEAKIAkJY2FzZSBDT01QU1RfRVJST1I6CiAJCQlkb19jb21wbGV0ZShxcCwgd3FlKTsKIAkJCXJ4ZV9xcF9lcnJvcihxcCk7CisKKwkJCWlmIChwa3QpIHsKKwkJCQlyeGVfZHJvcF9yZWYocGt0LT5xcCk7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQl9CisKIAkJCWdvdG8gZXhpdDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX25ldC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfbmV0LmMKaW5kZXggMGI4ZDJlYS4uZWVkZjJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfbmV0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfbmV0LmMKQEAgLTI3NSw5ICsyNzUsMTAgQEAKIAlyZXR1cm4gc29jazsKIH0KIAotc3RhdGljIHZvaWQgcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChzdHJ1Y3Qgc29ja2V0ICpzaykKK3ZvaWQgcnhlX3JlbGVhc2VfdWRwX3R1bm5lbChzdHJ1Y3Qgc29ja2V0ICpzaykKIHsKLQl1ZHBfdHVubmVsX3NvY2tfcmVsZWFzZShzayk7CisJaWYgKHNrKQorCQl1ZHBfdHVubmVsX3NvY2tfcmVsZWFzZShzayk7CiB9CiAKIHN0YXRpYyB2b2lkIHByZXBhcmVfdWRwX2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX2JlMTYgc3JjX3BvcnQsCkBAIC02NTgsNTEgKzY1OSw0NSBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcnhlX25ldF9ub3RpZmllciA9IHsKK3N0cnVjdCBub3RpZmllcl9ibG9jayByeGVfbmV0X25vdGlmaWVyID0gewogCS5ub3RpZmllcl9jYWxsID0gcnhlX25vdGlmeSwKIH07CiAKLWludCByeGVfbmV0X2luaXQodm9pZCkKK2ludCByeGVfbmV0X2lwdjRfaW5pdCh2b2lkKQogewotCWludCBlcnI7CisJc3Bpbl9sb2NrX2luaXQoJmRldl9saXN0X2xvY2spOworCisJcmVjdl9zb2NrZXRzLnNrNCA9IHJ4ZV9zZXR1cF91ZHBfdHVubmVsKCZpbml0X25ldCwKKwkJCQlodG9ucyhST0NFX1YyX1VEUF9EUE9SVCksIGZhbHNlKTsKKwlpZiAoSVNfRVJSKHJlY3Zfc29ja2V0cy5zazQpKSB7CisJCXJlY3Zfc29ja2V0cy5zazQgPSBOVUxMOworCQlwcl9lcnIoInJ4ZTogRmFpbGVkIHRvIGNyZWF0ZSBJUHY0IFVEUCB0dW5uZWxcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCByeGVfbmV0X2lwdjZfaW5pdCh2b2lkKQoreworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAKIAlzcGluX2xvY2tfaW5pdCgmZGV2X2xpc3RfbG9jayk7CiAKIAlyZWN2X3NvY2tldHMuc2s2ID0gcnhlX3NldHVwX3VkcF90dW5uZWwoJmluaXRfbmV0LAotCQkJaHRvbnMoUk9DRV9WMl9VRFBfRFBPUlQpLCB0cnVlKTsKKwkJCQkJCWh0b25zKFJPQ0VfVjJfVURQX0RQT1JUKSwgdHJ1ZSk7CiAJaWYgKElTX0VSUihyZWN2X3NvY2tldHMuc2s2KSkgewogCQlyZWN2X3NvY2tldHMuc2s2ID0gTlVMTDsKIAkJcHJfZXJyKCJyeGU6IEZhaWxlZCB0byBjcmVhdGUgSVB2NiBVRFAgdHVubmVsXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KLQotCXJlY3Zfc29ja2V0cy5zazQgPSByeGVfc2V0dXBfdWRwX3R1bm5lbCgmaW5pdF9uZXQsCi0JCQlodG9ucyhST0NFX1YyX1VEUF9EUE9SVCksIGZhbHNlKTsKLQlpZiAoSVNfRVJSKHJlY3Zfc29ja2V0cy5zazQpKSB7Ci0JCXJ4ZV9yZWxlYXNlX3VkcF90dW5uZWwocmVjdl9zb2NrZXRzLnNrNik7Ci0JCXJlY3Zfc29ja2V0cy5zazQgPSBOVUxMOwotCQlyZWN2X3NvY2tldHMuc2s2ID0gTlVMTDsKLQkJcHJfZXJyKCJyeGU6IEZhaWxlZCB0byBjcmVhdGUgSVB2NCBVRFAgdHVubmVsXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWVyciA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcnhlX25ldF9ub3RpZmllcik7Ci0JaWYgKGVycikgewotCQlyeGVfcmVsZWFzZV91ZHBfdHVubmVsKHJlY3Zfc29ja2V0cy5zazYpOwotCQlyeGVfcmVsZWFzZV91ZHBfdHVubmVsKHJlY3Zfc29ja2V0cy5zazQpOwotCQlwcl9lcnIoInJ4ZTogRmFpbGVkIHRvIHJpZ2lzdGVyIG5ldGRldiBub3RpZmllclxuIik7Ci0JfQotCi0JcmV0dXJuIGVycjsKKyNlbmRpZgorCXJldHVybiAwOwogfQogCiB2b2lkIHJ4ZV9uZXRfZXhpdCh2b2lkKQogewotCWlmIChyZWN2X3NvY2tldHMuc2s2KQotCQlyeGVfcmVsZWFzZV91ZHBfdHVubmVsKHJlY3Zfc29ja2V0cy5zazYpOwotCi0JaWYgKHJlY3Zfc29ja2V0cy5zazQpCi0JCXJ4ZV9yZWxlYXNlX3VkcF90dW5uZWwocmVjdl9zb2NrZXRzLnNrNCk7Ci0KKwlyeGVfcmVsZWFzZV91ZHBfdHVubmVsKHJlY3Zfc29ja2V0cy5zazYpOworCXJ4ZV9yZWxlYXNlX3VkcF90dW5uZWwocmVjdl9zb2NrZXRzLnNrNCk7CiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnJ4ZV9uZXRfbm90aWZpZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfbmV0LmggYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9uZXQuaAppbmRleCA3YjA2Zjc2Li4wZGFmN2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9uZXQuaAorKysgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9uZXQuaApAQCAtNDQsMTAgKzQ0LDEzIEBACiB9OwogCiBleHRlcm4gc3RydWN0IHJ4ZV9yZWN2X3NvY2tldHMgcmVjdl9zb2NrZXRzOworZXh0ZXJuIHN0cnVjdCBub3RpZmllcl9ibG9jayByeGVfbmV0X25vdGlmaWVyOwordm9pZCByeGVfcmVsZWFzZV91ZHBfdHVubmVsKHN0cnVjdCBzb2NrZXQgKnNrKTsKIAogc3RydWN0IHJ4ZV9kZXYgKnJ4ZV9uZXRfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKIAotaW50IHJ4ZV9uZXRfaW5pdCh2b2lkKTsKK2ludCByeGVfbmV0X2lwdjRfaW5pdCh2b2lkKTsKK2ludCByeGVfbmV0X2lwdjZfaW5pdCh2b2lkKTsKIHZvaWQgcnhlX25ldF9leGl0KHZvaWQpOwogCiAjZW5kaWYgLyogUlhFX05FVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZWN2LmMgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZWN2LmMKaW5kZXggM2Q0NjRjMi4uMTQ0ZDJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfcmVjdi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3JlY3YuYwpAQCAtMzEyLDcgKzMxMiw3IEBACiAJCSAqIG1ha2UgYSBjb3B5IG9mIHRoZSBza2IgdG8gcG9zdCB0byB0aGUgbmV4dCBxcAogCQkgKi8KIAkJc2tiX2NvcHkgPSAobWNlLT5xcF9saXN0Lm5leHQgIT0gJm1jZy0+cXBfbGlzdCkgPwotCQkJCXNrYl9jbG9uZShza2IsIEdGUF9LRVJORUwpIDogTlVMTDsKKwkJCQlza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSA6IE5VTEw7CiAKIAkJcGt0LT5xcCA9IHFwOwogCQlyeGVfYWRkX3JlZihxcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZXEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3JlcS5jCmluZGV4IDMzYjJkOWQuLjEzYTg0OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3JlcS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3JlcS5jCkBAIC01MTEsMjQgKzUxMSwyMSBAQAogfQogCiBzdGF0aWMgdm9pZCB1cGRhdGVfd3FlX3N0YXRlKHN0cnVjdCByeGVfcXAgKnFwLAotCQkJICAgICBzdHJ1Y3QgcnhlX3NlbmRfd3FlICp3cWUsCi0JCQkgICAgIHN0cnVjdCByeGVfcGt0X2luZm8gKnBrdCwKLQkJCSAgICAgZW51bSB3cWVfc3RhdGUgKnByZXZfc3RhdGUpCisJCXN0cnVjdCByeGVfc2VuZF93cWUgKndxZSwKKwkJc3RydWN0IHJ4ZV9wa3RfaW5mbyAqcGt0KQogewotCWVudW0gd3FlX3N0YXRlIHByZXZfc3RhdGVfID0gd3FlLT5zdGF0ZTsKLQogCWlmIChwa3QtPm1hc2sgJiBSWEVfRU5EX01BU0spIHsKIAkJaWYgKHFwX3R5cGUocXApID09IElCX1FQVF9SQykKIAkJCXdxZS0+c3RhdGUgPSB3cWVfc3RhdGVfcGVuZGluZzsKIAl9IGVsc2UgewogCQl3cWUtPnN0YXRlID0gd3FlX3N0YXRlX3Byb2Nlc3Npbmc7CiAJfQotCi0JKnByZXZfc3RhdGUgPSBwcmV2X3N0YXRlXzsKIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRlKHN0cnVjdCByeGVfcXAgKnFwLCBzdHJ1Y3QgcnhlX3NlbmRfd3FlICp3cWUsCi0JCQkgc3RydWN0IHJ4ZV9wa3RfaW5mbyAqcGt0LCBpbnQgcGF5bG9hZCkKK3N0YXRpYyB2b2lkIHVwZGF0ZV93cWVfcHNuKHN0cnVjdCByeGVfcXAgKnFwLAorCQkJICAgc3RydWN0IHJ4ZV9zZW5kX3dxZSAqd3FlLAorCQkJICAgc3RydWN0IHJ4ZV9wa3RfaW5mbyAqcGt0LAorCQkJICAgaW50IHBheWxvYWQpCiB7CiAJLyogbnVtYmVyIG9mIHBhY2tldHMgbGVmdCB0byBzZW5kIGluY2x1ZGluZyBjdXJyZW50IG9uZSAqLwogCWludCBudW1fcGt0ID0gKHdxZS0+ZG1hLnJlc2lkICsgcGF5bG9hZCArIHFwLT5tdHUgLSAxKSAvIHFwLT5tdHU7CkBAIC01NDYsMTAgKzU0MywzNSBAQAogCQlxcC0+cmVxLnBzbiA9ICh3cWUtPmZpcnN0X3BzbiArIG51bV9wa3QpICYgQlRIX1BTTl9NQVNLOwogCWVsc2UKIAkJcXAtPnJlcS5wc24gPSAocXAtPnJlcS5wc24gKyAxKSAmIEJUSF9QU05fTUFTSzsKK30KIAorc3RhdGljIHZvaWQgc2F2ZV9zdGF0ZShzdHJ1Y3QgcnhlX3NlbmRfd3FlICp3cWUsCisJCSAgICAgICBzdHJ1Y3QgcnhlX3FwICpxcCwKKwkJICAgICAgIHN0cnVjdCByeGVfc2VuZF93cWUgKnJvbGxiYWNrX3dxZSwKKwkJICAgICAgIHN0cnVjdCByeGVfcXAgKnJvbGxiYWNrX3FwKQoreworCXJvbGxiYWNrX3dxZS0+c3RhdGUgICAgID0gd3FlLT5zdGF0ZTsKKwlyb2xsYmFja193cWUtPmZpcnN0X3BzbiA9IHdxZS0+Zmlyc3RfcHNuOworCXJvbGxiYWNrX3dxZS0+bGFzdF9wc24gID0gd3FlLT5sYXN0X3BzbjsKKwlyb2xsYmFja19xcC0+cmVxLnBzbiAgICA9IHFwLT5yZXEucHNuOworfQorCitzdGF0aWMgdm9pZCByb2xsYmFja19zdGF0ZShzdHJ1Y3QgcnhlX3NlbmRfd3FlICp3cWUsCisJCQkgICBzdHJ1Y3QgcnhlX3FwICpxcCwKKwkJCSAgIHN0cnVjdCByeGVfc2VuZF93cWUgKnJvbGxiYWNrX3dxZSwKKwkJCSAgIHN0cnVjdCByeGVfcXAgKnJvbGxiYWNrX3FwKQoreworCXdxZS0+c3RhdGUgICAgID0gcm9sbGJhY2tfd3FlLT5zdGF0ZTsKKwl3cWUtPmZpcnN0X3BzbiA9IHJvbGxiYWNrX3dxZS0+Zmlyc3RfcHNuOworCXdxZS0+bGFzdF9wc24gID0gcm9sbGJhY2tfd3FlLT5sYXN0X3BzbjsKKwlxcC0+cmVxLnBzbiAgICA9IHJvbGxiYWNrX3FwLT5yZXEucHNuOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdGUoc3RydWN0IHJ4ZV9xcCAqcXAsIHN0cnVjdCByeGVfc2VuZF93cWUgKndxZSwKKwkJCSBzdHJ1Y3QgcnhlX3BrdF9pbmZvICpwa3QsIGludCBwYXlsb2FkKQorewogCXFwLT5yZXEub3Bjb2RlID0gcGt0LT5vcGNvZGU7CiAKLQogCWlmIChwa3QtPm1hc2sgJiBSWEVfRU5EX01BU0spCiAJCXFwLT5yZXEud3FlX2luZGV4ID0gbmV4dF9pbmRleChxcC0+c3EucXVldWUsIHFwLT5yZXEud3FlX2luZGV4KTsKIApAQCAtNTcxLDcgKzU5Myw4IEBACiAJaW50IG10dTsKIAlpbnQgb3Bjb2RlOwogCWludCByZXQ7Ci0JZW51bSB3cWVfc3RhdGUgcHJldl9zdGF0ZTsKKwlzdHJ1Y3QgcnhlX3FwIHJvbGxiYWNrX3FwOworCXN0cnVjdCByeGVfc2VuZF93cWUgcm9sbGJhY2tfd3FlOwogCiBuZXh0X3dxZToKIAlpZiAodW5saWtlbHkoIXFwLT52YWxpZCB8fCBxcC0+cmVxLnN0YXRlID09IFFQX1NUQVRFX0VSUk9SKSkKQEAgLTY4OCwxMyArNzExLDIxIEBACiAJCWdvdG8gZXJyOwogCX0KIAotCXVwZGF0ZV93cWVfc3RhdGUocXAsIHdxZSwgJnBrdCwgJnByZXZfc3RhdGUpOworCS8qCisJICogVG8gcHJldmVudCBhIHJhY2Ugb24gd3FlIGFjY2VzcyBiZXR3ZWVuIHJlcXVlc3RlciBhbmQgY29tcGxldGVyLAorCSAqIHdxZSBtZW1iZXJzIHN0YXRlIGFuZCBwc24gbmVlZCB0byBiZSBzZXQgYmVmb3JlIGNhbGxpbmcKKwkgKiByeGVfeG1pdF9wYWNrZXQoKS4KKwkgKiBPdGhlcndpc2UsIGNvbXBsZXRlciBtaWdodCBpbml0aWF0ZSBhbiB1bmp1c3RpZmllZCByZXRyeSBmbG93LgorCSAqLworCXNhdmVfc3RhdGUod3FlLCBxcCwgJnJvbGxiYWNrX3dxZSwgJnJvbGxiYWNrX3FwKTsKKwl1cGRhdGVfd3FlX3N0YXRlKHFwLCB3cWUsICZwa3QpOworCXVwZGF0ZV93cWVfcHNuKHFwLCB3cWUsICZwa3QsIHBheWxvYWQpOwogCXJldCA9IHJ4ZV94bWl0X3BhY2tldCh0b19yZGV2KHFwLT5pYnFwLmRldmljZSksIHFwLCAmcGt0LCBza2IpOwogCWlmIChyZXQpIHsKIAkJcXAtPm5lZWRfcmVxX3NrYiA9IDE7CiAJCWtmcmVlX3NrYihza2IpOwogCi0JCXdxZS0+c3RhdGUgPSBwcmV2X3N0YXRlOworCQlyb2xsYmFja19zdGF0ZSh3cWUsIHFwLCAmcm9sbGJhY2tfd3FlLCAmcm9sbGJhY2tfcXApOwogCiAJCWlmIChyZXQgPT0gLUVBR0FJTikgewogCQkJcnhlX3J1bl90YXNrKCZxcC0+cmVxLnRhc2ssIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfcmVzcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3N3L3J4ZS9yeGVfcmVzcC5jCmluZGV4IGViYjAzYjQuLjNlMGYwZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9zdy9yeGUvcnhlX3Jlc3AuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvc3cvcnhlL3J4ZV9yZXNwLmMKQEAgLTk3MiwxMSArOTcyLDEzIEBACiAJZnJlZV9yZF9hdG9taWNfcmVzb3VyY2UocXAsIHJlcyk7CiAJcnhlX2FkdmFuY2VfcmVzcF9yZXNvdXJjZShxcCk7CiAKKwltZW1jcHkoU0tCX1RPX1BLVChza2IpLCAmYWNrX3BrdCwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwogCXJlcy0+dHlwZSA9IFJYRV9BVE9NSUNfTUFTSzsKIAlyZXMtPmF0b21pYy5za2IgPSBza2I7Ci0JcmVzLT5maXJzdF9wc24gPSBxcC0+cmVzcC5wc247Ci0JcmVzLT5sYXN0X3BzbiA9IHFwLT5yZXNwLnBzbjsKLQlyZXMtPmN1cl9wc24gPSBxcC0+cmVzcC5wc247CisJcmVzLT5maXJzdF9wc24gPSBhY2tfcGt0LnBzbjsKKwlyZXMtPmxhc3RfcHNuICA9IGFja19wa3QucHNuOworCXJlcy0+Y3VyX3BzbiAgID0gYWNrX3BrdC5wc247CiAKIAlyYyA9IHJ4ZV94bWl0X3BhY2tldChyeGUsIHFwLCAmYWNrX3BrdCwgc2tiX2NvcHkpOwogCWlmIChyYykgewpAQCAtMTExNiw4ICsxMTE4LDcgQEAKIAkJCQlyYyA9IFJFU1BTVF9DTEVBTlVQOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJYnRoX3NldF9wc24oU0tCX1RPX1BLVChza2JfY29weSksCi0JCQkJICAgIHFwLT5yZXNwLnBzbiAtIDEpOworCiAJCQkvKiBSZXNlbmQgdGhlIHJlc3VsdC4gKi8KIAkJCXJjID0gcnhlX3htaXRfcGFja2V0KHRvX3JkZXYocXAtPmlicXAuZGV2aWNlKSwgcXAsCiAJCQkJCSAgICAgcGt0LCBza2JfY29weSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmggYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liLmgKaW5kZXggNGY3ZDliNC4uOWRiZmNjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWIuaApAQCAtNDc4LDYgKzQ3OCw3IEBACiAJCXN0cnVjdCBpcG9pYl9haCAqYWRkcmVzcywgdTMyIHFwbik7CiB2b2lkIGlwb2liX3JlYXBfYWgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAorc3RydWN0IGlwb2liX3BhdGggKl9fcGF0aF9maW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmdpZCk7CiB2b2lkIGlwb2liX21hcmtfcGF0aHNfaW52YWxpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgaXBvaWJfZmx1c2hfcGF0aHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBpbnQgaXBvaWJfY2hlY2tfc21fc2VuZG9ubHlfZnVsbG1lbWJlcl9zdXBwb3J0KHN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2NtLmMKaW5kZXggOTUxZDlhYi4uNGFkMjk3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfY20uYwpAQCAtMTMxOCw2ICsxMzE4LDggQEAKIAl9CiB9CiAKKyNkZWZpbmUgUVBOX0FORF9PUFRJT05TX09GRlNFVAk0CisKIHN0YXRpYyB2b2lkIGlwb2liX2NtX3R4X3N0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGlwb2liX2Rldl9wcml2LApAQCAtMTMyNiw2ICsxMzI4LDcgQEAKIAlzdHJ1Y3QgaXBvaWJfbmVpZ2ggKm5laWdoOwogCXN0cnVjdCBpcG9pYl9jbV90eCAqcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpcG9pYl9wYXRoICpwYXRoOwogCWludCByZXQ7CiAKIAlzdHJ1Y3QgaWJfc2FfcGF0aF9yZWMgcGF0aHJlYzsKQEAgLTEzMzgsNyArMTM0MSwxOSBAQAogCQlwID0gbGlzdF9lbnRyeShwcml2LT5jbS5zdGFydF9saXN0Lm5leHQsIHR5cGVvZigqcCksIGxpc3QpOwogCQlsaXN0X2RlbF9pbml0KCZwLT5saXN0KTsKIAkJbmVpZ2ggPSBwLT5uZWlnaDsKKwogCQlxcG4gPSBJUE9JQl9RUE4obmVpZ2gtPmRhZGRyKTsKKwkJLyoKKwkJICogQXMgbG9uZyBhcyB0aGUgc2VhcmNoIGlzIHdpdGggdGhlc2UgMiBsb2NrcywKKwkJICogcGF0aCBleGlzdGVuY2UgaW5kaWNhdGVzIGl0cyB2YWxpZGl0eS4KKwkJICovCisJCXBhdGggPSBfX3BhdGhfZmluZChkZXYsIG5laWdoLT5kYWRkciArIFFQTl9BTkRfT1BUSU9OU19PRkZTRVQpOworCQlpZiAoIXBhdGgpIHsKKwkJCXByX2luZm8oIiVzIGlnbm9yZSBub3QgdmFsaWQgcGF0aCAlcEk2XG4iLAorCQkJCV9fZnVuY19fLAorCQkJCW5laWdoLT5kYWRkciArIFFQTl9BTkRfT1BUSU9OU19PRkZTRVQpOworCQkJZ290byBmcmVlX25laWdoOworCQl9CiAJCW1lbWNweSgmcGF0aHJlYywgJnAtPnBhdGgtPnBhdGhyZWMsIHNpemVvZiBwYXRocmVjKTsKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0xMzUwLDYgKzEzNjUsNyBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJCWlmIChyZXQpIHsKK2ZyZWVfbmVpZ2g6CiAJCQluZWlnaCA9IHAtPm5laWdoOwogCQkJaWYgKG5laWdoKSB7CiAJCQkJbmVpZ2gtPmNtID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfaWIuYwppbmRleCBkYzZkMjQxLi5iZTExZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2liLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9pYi5jCkBAIC0xMTYxLDggKzExNjEsMTcgQEAKIAl9CiAKIAlpZiAobGV2ZWwgPT0gSVBPSUJfRkxVU0hfTElHSFQpIHsKKwkJaW50IG9wZXJfdXA7CiAJCWlwb2liX21hcmtfcGF0aHNfaW52YWxpZChkZXYpOworCQkvKiBTZXQgSVBvSUIgb3BlcmF0aW9uIGFzIGRvd24gdG8gcHJldmVudCByYWNlcyBiZXR3ZWVuOgorCQkgKiB0aGUgZmx1c2ggZmxvdyB3aGljaCBsZWF2ZXMgTUNHIGFuZCBvbiB0aGUgZmx5IGpvaW5zCisJCSAqIHdoaWNoIGNhbiBoYXBwZW4gZHVyaW5nIHRoYXQgdGltZS4gbWNhc3QgcmVzdGFydCB0YXNrCisJCSAqIHNob3VsZCBkZWFsIHdpdGggam9pbiByZXF1ZXN0cyB3ZSBtaXNzZWQuCisJCSAqLworCQlvcGVyX3VwID0gdGVzdF9hbmRfY2xlYXJfYml0KElQT0lCX0ZMQUdfT1BFUl9VUCwgJnByaXYtPmZsYWdzKTsKIAkJaXBvaWJfbWNhc3RfZGV2X2ZsdXNoKGRldik7CisJCWlmIChvcGVyX3VwKQorCQkJc2V0X2JpdChJUE9JQl9GTEFHX09QRVJfVVAsICZwcml2LT5mbGFncyk7CiAJCWlwb2liX2ZsdXNoX2FoKGRldik7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCmluZGV4IDc0YmNhYTAuLmNjMWMxYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jCkBAIC00ODUsNyArNDg1LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCBpcG9pYl9wYXRoICpfX3BhdGhfZmluZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpnaWQpCitzdHJ1Y3QgaXBvaWJfcGF0aCAqX19wYXRoX2ZpbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqZ2lkKQogewogCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHJiX25vZGUgKm4gPSBwcml2LT5wYXRoX3RyZWUucmJfbm9kZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuYwppbmRleCA3OTE0YzE0Li5jYWU5YmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5jCkBAIC00MDMsNiArNDAzLDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmaXNlcnRfY29ubi0+bm9kZSk7CiAJaW5pdF9jb21wbGV0aW9uKCZpc2VydF9jb25uLT5sb2dpbl9jb21wKTsKIAlpbml0X2NvbXBsZXRpb24oJmlzZXJ0X2Nvbm4tPmxvZ2luX3JlcV9jb21wKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpc2VydF9jb25uLT5yZW1fd2FpdCk7CiAJa3JlZl9pbml0KCZpc2VydF9jb25uLT5rcmVmKTsKIAltdXRleF9pbml0KCZpc2VydF9jb25uLT5tdXRleCk7CiAJSU5JVF9XT1JLKCZpc2VydF9jb25uLT5yZWxlYXNlX3dvcmssIGlzZXJ0X3JlbGVhc2Vfd29yayk7CkBAIC01NzgsNyArNTc5LDggQEAKIAlCVUdfT04oIWRldmljZSk7CiAKIAlpc2VydF9mcmVlX3J4X2Rlc2NyaXB0b3JzKGlzZXJ0X2Nvbm4pOwotCWlmIChpc2VydF9jb25uLT5jbV9pZCkKKwlpZiAoaXNlcnRfY29ubi0+Y21faWQgJiYKKwkgICAgIWlzZXJ0X2Nvbm4tPmRldl9yZW1vdmVkKQogCQlyZG1hX2Rlc3Ryb3lfaWQoaXNlcnRfY29ubi0+Y21faWQpOwogCiAJaWYgKGlzZXJ0X2Nvbm4tPnFwKSB7CkBAIC01OTMsNyArNTk1LDEwIEBACiAKIAlpc2VydF9kZXZpY2VfcHV0KGRldmljZSk7CiAKLQlrZnJlZShpc2VydF9jb25uKTsKKwlpZiAoaXNlcnRfY29ubi0+ZGV2X3JlbW92ZWQpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaXNlcnRfY29ubi0+cmVtX3dhaXQpOworCWVsc2UKKwkJa2ZyZWUoaXNlcnRfY29ubik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC03NTMsNiArNzU4LDcgQEAKIGlzZXJ0X2NtYV9oYW5kbGVyKHN0cnVjdCByZG1hX2NtX2lkICpjbWFfaWQsIHN0cnVjdCByZG1hX2NtX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgaXNlcnRfbnAgKmlzZXJ0X25wID0gY21hX2lkLT5jb250ZXh0OworCXN0cnVjdCBpc2VydF9jb25uICppc2VydF9jb25uOwogCWludCByZXQgPSAwOwogCiAJaXNlcnRfaW5mbygiJXMgKCVkKTogc3RhdHVzICVkIGlkICVwIG5wICVwXG4iLApAQCAtNzczLDEwICs3NzksMjEgQEAKIAkJYnJlYWs7CiAJY2FzZSBSRE1BX0NNX0VWRU5UX0FERFJfQ0hBTkdFOiAgICAvKiBGQUxMVEhSVSAqLwogCWNhc2UgUkRNQV9DTV9FVkVOVF9ESVNDT05ORUNURUQ6ICAgLyogRkFMTFRIUlUgKi8KLQljYXNlIFJETUFfQ01fRVZFTlRfREVWSUNFX1JFTU9WQUw6IC8qIEZBTExUSFJVICovCiAJY2FzZSBSRE1BX0NNX0VWRU5UX1RJTUVXQUlUX0VYSVQ6ICAvKiBGQUxMVEhSVSAqLwogCQlyZXQgPSBpc2VydF9kaXNjb25uZWN0ZWRfaGFuZGxlcihjbWFfaWQsIGV2ZW50LT5ldmVudCk7CiAJCWJyZWFrOworCWNhc2UgUkRNQV9DTV9FVkVOVF9ERVZJQ0VfUkVNT1ZBTDoKKwkJaXNlcnRfY29ubiA9IGNtYV9pZC0+cXAtPnFwX2NvbnRleHQ7CisJCWlzZXJ0X2Nvbm4tPmRldl9yZW1vdmVkID0gdHJ1ZTsKKwkJaXNlcnRfZGlzY29ubmVjdGVkX2hhbmRsZXIoY21hX2lkLCBldmVudC0+ZXZlbnQpOworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoaXNlcnRfY29ubi0+cmVtX3dhaXQsCisJCQkJCSBpc2VydF9jb25uLT5zdGF0ZSA9PSBJU0VSX0NPTk5fRE9XTik7CisJCWtmcmVlKGlzZXJ0X2Nvbm4pOworCQkvKgorCQkgKiByZXR1cm4gbm9uLXplcm8gZnJvbSB0aGUgY2FsbGJhY2sgdG8gZGVzdHJveQorCQkgKiB0aGUgcmRtYSBjbSBpZAorCQkgKi8KKwkJcmV0dXJuIDE7CiAJY2FzZSBSRE1BX0NNX0VWRU5UX1JFSkVDVEVEOiAgICAgICAvKiBGQUxMVEhSVSAqLwogCWNhc2UgUkRNQV9DTV9FVkVOVF9VTlJFQUNIQUJMRTogICAgLyogRkFMTFRIUlUgKi8KIAljYXNlIFJETUFfQ01fRVZFTlRfQ09OTkVDVF9FUlJPUjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXNlcnQvaWJfaXNlcnQuaAppbmRleCBmYzc5MWVmLi5jMDJhZGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lzZXJ0L2liX2lzZXJ0LmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pc2VydC9pYl9pc2VydC5oCkBAIC0xNTgsNiArMTU4LDggQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcmVsZWFzZV93b3JrOwogCWJvb2wgICAgICAgICAgICAgICAgICAgIGxvZ291dF9wb3N0ZWQ7CiAJYm9vbCAgICAgICAgICAgICAgICAgICAgc25kX3dfaW52OworCXdhaXRfcXVldWVfaGVhZF90CXJlbV93YWl0OworCWJvb2wJCQlkZXZfcmVtb3ZlZDsKIH07CiAKICNkZWZpbmUgSVNFUlRfTUFYX0NRIDY0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2pveWRldi5jIGIvZHJpdmVycy9pbnB1dC9qb3lkZXYuYwppbmRleCA1ZDExZmVhLi5mMzEzNWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2pveWRldi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvam95ZGV2LmMKQEAgLTk1MCw2ICs5NTAsMTIgQEAKIAkJLmZsYWdzID0gSU5QVVRfREVWSUNFX0lEX01BVENIX0VWQklUIHwKIAkJCQlJTlBVVF9ERVZJQ0VfSURfTUFUQ0hfQUJTQklULAogCQkuZXZiaXQgPSB7IEJJVF9NQVNLKEVWX0FCUykgfSwKKwkJLmFic2JpdCA9IHsgQklUX01BU0soQUJTX1opIH0sCisJfSwKKwl7CisJCS5mbGFncyA9IElOUFVUX0RFVklDRV9JRF9NQVRDSF9FVkJJVCB8CisJCQkJSU5QVVRfREVWSUNFX0lEX01BVENIX0FCU0JJVCwKKwkJLmV2Yml0ID0geyBCSVRfTUFTSyhFVl9BQlMpIH0sCiAJCS5hYnNiaXQgPSB7IEJJVF9NQVNLKEFCU19XSEVFTCkgfSwKIAl9LAogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwppbmRleCA1MDk2MDhjLi5jYmQ3NWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCkBAIC0xMiw2ICsxMiwyMSBAQAogCiBpZiBJTlBVVF9LRVlCT0FSRAogCitjb25maWcgS0VZQk9BUkRfQURDCisJdHJpc3RhdGUgIkFEQyBMYWRkZXIgQnV0dG9ucyIKKwlkZXBlbmRzIG9uIElJTworCXNlbGVjdCBJTlBVVF9QT0xMREVWCisJaGVscAorCSAgVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBzdXBwb3J0IGZvciBidXR0b25zIGNvbm5lY3RlZAorCSAgdG8gYW4gQURDIHVzaW5nIGEgcmVzaXN0b3IgbGFkZGVyLgorCisJICBTYXkgWSBoZXJlIGlmIHlvdXIgZGV2aWNlIGhhcyBzdWNoIGJ1dHRvbnMgY29ubmVjdGVkIHRvIGFuIEFEQy4gIFlvdXIKKwkgIGJvYXJkLXNwZWNpZmljIHNldHVwIGxvZ2ljIG11c3QgYWxzbyBwcm92aWRlIGEgY29uZmlndXJhdGlvbiBkYXRhCisJICBmb3IgbWFwcGluZyB2b2x0YWdlcyB0byBidXR0b25zLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZGNfa2V5cy4KKwogY29uZmlnIEtFWUJPQVJEX0FEUDU1MjAKIAl0cmlzdGF0ZSAiS2V5cGFkIFN1cHBvcnQgZm9yIEFEUDU1MjAgUE1JQyIKIAlkZXBlbmRzIG9uIFBNSUNfQURQNTUyMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKaW5kZXggMWQ0MTZkZC4uZDlmNGNmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCiAjIEVhY2ggY29uZmlndXJhdGlvbiBvcHRpb24gZW5hYmxlcyBhIGxpc3Qgb2YgZmlsZXMuCiAKK29iai0kKENPTkZJR19LRVlCT0FSRF9BREMpCQkrPSBhZGMta2V5cy5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfQURQNTUyMCkJCSs9IGFkcDU1MjAta2V5cy5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfQURQNTU4OCkJCSs9IGFkcDU1ODgta2V5cy5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfQURQNTU4OSkJCSs9IGFkcDU1ODkta2V5cy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkYy1rZXlzLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FkYy1rZXlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhjZjJjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYWRjLWtleXMuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIElucHV0IGRyaXZlciBmb3IgcmVzaXN0b3IgbGFkZGVyIGNvbm5lY3RlZCBvbiBBREMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZHJlIEJlbGxvbmkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0LXBvbGxkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb3BlcnR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCitzdHJ1Y3QgYWRjX2tleXNfYnV0dG9uIHsKKwl1MzIgdm9sdGFnZTsKKwl1MzIga2V5Y29kZTsKK307CisKK3N0cnVjdCBhZGNfa2V5c19zdGF0ZSB7CisJc3RydWN0IGlpb19jaGFubmVsICpjaGFubmVsOworCXUzMiBudW1fa2V5czsKKwl1MzIgbGFzdF9rZXk7CisJdTMyIGtleXVwX3ZvbHRhZ2U7CisJY29uc3Qgc3RydWN0IGFkY19rZXlzX2J1dHRvbiAqbWFwOworfTsKKworc3RhdGljIHZvaWQgYWRjX2tleXNfcG9sbChzdHJ1Y3QgaW5wdXRfcG9sbGVkX2RldiAqZGV2KQoreworCXN0cnVjdCBhZGNfa2V5c19zdGF0ZSAqc3QgPSBkZXYtPnByaXZhdGU7CisJaW50IGksIHZhbHVlLCByZXQ7CisJdTMyIGRpZmYsIGNsb3Nlc3QgPSAweGZmZmZmZmZmOworCWludCBrZXljb2RlID0gMDsKKworCXJldCA9IGlpb19yZWFkX2NoYW5uZWxfcHJvY2Vzc2VkKHN0LT5jaGFubmVsLCAmdmFsdWUpOworCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCQkvKiBGb3JjaWJseSByZWxlYXNlIGtleSBpZiBhbnkgd2FzIHByZXNzZWQgKi8KKwkJdmFsdWUgPSBzdC0+a2V5dXBfdm9sdGFnZTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgc3QtPm51bV9rZXlzOyBpKyspIHsKKwkJCWRpZmYgPSBhYnMoc3QtPm1hcFtpXS52b2x0YWdlIC0gdmFsdWUpOworCQkJaWYgKGRpZmYgPCBjbG9zZXN0KSB7CisJCQkJY2xvc2VzdCA9IGRpZmY7CisJCQkJa2V5Y29kZSA9IHN0LT5tYXBbaV0ua2V5Y29kZTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChhYnMoc3QtPmtleXVwX3ZvbHRhZ2UgLSB2YWx1ZSkgPCBjbG9zZXN0KQorCQlrZXljb2RlID0gMDsKKworCWlmIChzdC0+bGFzdF9rZXkgJiYgc3QtPmxhc3Rfa2V5ICE9IGtleWNvZGUpCisJCWlucHV0X3JlcG9ydF9rZXkoZGV2LT5pbnB1dCwgc3QtPmxhc3Rfa2V5LCAwKTsKKworCWlmIChrZXljb2RlKQorCQlpbnB1dF9yZXBvcnRfa2V5KGRldi0+aW5wdXQsIGtleWNvZGUsIDEpOworCisJaW5wdXRfc3luYyhkZXYtPmlucHV0KTsKKwlzdC0+bGFzdF9rZXkgPSBrZXljb2RlOworfQorCitzdGF0aWMgaW50IGFkY19rZXlzX2xvYWRfa2V5bWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGFkY19rZXlzX3N0YXRlICpzdCkKK3sKKwlzdHJ1Y3QgYWRjX2tleXNfYnV0dG9uICptYXA7CisJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmNoaWxkOworCWludCBpOworCisJc3QtPm51bV9rZXlzID0gZGV2aWNlX2dldF9jaGlsZF9ub2RlX2NvdW50KGRldik7CisJaWYgKHN0LT5udW1fa2V5cyA9PSAwKSB7CisJCWRldl9lcnIoZGV2LCAia2V5bWFwIGlzIG1pc3NpbmdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXAgPSBkZXZtX2ttYWxsb2NfYXJyYXkoZGV2LCBzdC0+bnVtX2tleXMsIHNpemVvZigqbWFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYXApCisJCXJldHVybiAtRU5PTUVNOworCisJaSA9IDA7CisJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkX25vZGUoZGV2LCBjaGlsZCkgeworCQlpZiAoZndub2RlX3Byb3BlcnR5X3JlYWRfdTMyKGNoaWxkLCAicHJlc3MtdGhyZXNob2xkLW1pY3Jvdm9sdCIsCisJCQkJCSAgICAgJm1hcFtpXS52b2x0YWdlKSkgeworCQkJZGV2X2VycihkZXYsICJLZXkgd2l0aCBpbnZhbGlkIG9yIG1pc3Npbmcgdm9sdGFnZVxuIik7CisJCQlmd25vZGVfaGFuZGxlX3B1dChjaGlsZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltYXBbaV0udm9sdGFnZSAvPSAxMDAwOworCisJCWlmIChmd25vZGVfcHJvcGVydHlfcmVhZF91MzIoY2hpbGQsICJsaW51eCxjb2RlIiwKKwkJCQkJICAgICAmbWFwW2ldLmtleWNvZGUpKSB7CisJCQlkZXZfZXJyKGRldiwgIktleSB3aXRoIGludmFsaWQgb3IgbWlzc2luZyBsaW51eCxjb2RlXG4iKTsKKwkJCWZ3bm9kZV9oYW5kbGVfcHV0KGNoaWxkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaSsrOworCX0KKworCXN0LT5tYXAgPSBtYXA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRjX2tleXNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBhZGNfa2V5c19zdGF0ZSAqc3Q7CisJc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKnBvbGxfZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCWVudW0gaWlvX2NoYW5fdHlwZSB0eXBlOworCWludCBpLCB2YWx1ZTsKKwlpbnQgZXJyb3I7CisKKwlzdCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0LT5jaGFubmVsID0gZGV2bV9paW9fY2hhbm5lbF9nZXQoZGV2LCAiYnV0dG9ucyIpOworCWlmIChJU19FUlIoc3QtPmNoYW5uZWwpKQorCQlyZXR1cm4gUFRSX0VSUihzdC0+Y2hhbm5lbCk7CisKKwlpZiAoIXN0LT5jaGFubmVsLT5pbmRpb19kZXYpCisJCXJldHVybiAtRU5YSU87CisKKwllcnJvciA9IGlpb19nZXRfY2hhbm5lbF90eXBlKHN0LT5jaGFubmVsLCAmdHlwZSk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKHR5cGUgIT0gSUlPX1ZPTFRBR0UpIHsKKwkJZGV2X2VycihkZXYsICJJbmNvbXBhdGlibGUgY2hhbm5lbCB0eXBlICVkXG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJrZXl1cC10aHJlc2hvbGQtbWljcm92b2x0IiwKKwkJCQkgICAgICZzdC0+a2V5dXBfdm9sdGFnZSkpIHsKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIG9yIG1pc3Npbmcga2V5dXAgdm9sdGFnZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzdC0+a2V5dXBfdm9sdGFnZSAvPSAxMDAwOworCisJZXJyb3IgPSBhZGNfa2V5c19sb2FkX2tleW1hcChkZXYsIHN0KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHN0KTsKKworCXBvbGxfZGV2ID0gZGV2bV9pbnB1dF9hbGxvY2F0ZV9wb2xsZWRfZGV2aWNlKGRldik7CisJaWYgKCFwb2xsX2RldikgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoIWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJwb2xsLWludGVydmFsIiwgJnZhbHVlKSkKKwkJcG9sbF9kZXYtPnBvbGxfaW50ZXJ2YWwgPSB2YWx1ZTsKKworCXBvbGxfZGV2LT5wb2xsID0gYWRjX2tleXNfcG9sbDsKKwlwb2xsX2Rldi0+cHJpdmF0ZSA9IHN0OworCisJaW5wdXQgPSBwb2xsX2Rldi0+aW5wdXQ7CisKKwlpbnB1dC0+bmFtZSA9IHBkZXYtPm5hbWU7CisJaW5wdXQtPnBoeXMgPSAiYWRjLWtleXMvaW5wdXQwIjsKKworCWlucHV0LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJaW5wdXQtPmlkLnZlbmRvciA9IDB4MDAwMTsKKwlpbnB1dC0+aWQucHJvZHVjdCA9IDB4MDAwMTsKKwlpbnB1dC0+aWQudmVyc2lvbiA9IDB4MDEwMDsKKworCV9fc2V0X2JpdChFVl9LRVksIGlucHV0LT5ldmJpdCk7CisJZm9yIChpID0gMDsgaSA8IHN0LT5udW1fa2V5czsgaSsrKQorCQlfX3NldF9iaXQoc3QtPm1hcFtpXS5rZXljb2RlLCBpbnB1dC0+a2V5Yml0KTsKKworCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgImF1dG9yZXBlYXQiKSkKKwkJX19zZXRfYml0KEVWX1JFUCwgaW5wdXQtPmV2Yml0KTsKKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfcG9sbGVkX2RldmljZShwb2xsX2Rldik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGlucHV0IGRldmljZTogJWRcbiIsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhZGNfa2V5c19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWRjLWtleXMiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFkY19rZXlzX29mX21hdGNoKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBfX3JlZmRhdGEgYWRjX2tleXNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkY19rZXlzIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGFkY19rZXlzX29mX21hdGNoKSwKKwl9LAorCS5wcm9iZSA9IGFkY19rZXlzX3Byb2JlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYWRjX2tleXNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQWxleGFuZHJlIEJlbGxvbmkgPGFsZXhhbmRyZS5iZWxsb25pQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW5wdXQgZHJpdmVyIGZvciByZXNpc3RvciBsYWRkZXIgY29ubmVjdGVkIG9uIEFEQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jcm9zX2VjX2tleWIuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY3Jvc19lY19rZXliLmMKaW5kZXggNGIwODc4Zi4uMjU5NDNlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jcm9zX2VjX2tleWIuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nyb3NfZWNfa2V5Yi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9tYXRyaXhfa2V5cGFkLmg+CkBAIC00NCw2ICs0NSw3IEBACiAgKiBAZGV2OiBEZXZpY2UgcG9pbnRlcgogICogQGlkZXY6IElucHV0IGRldmljZQogICogQGVjOiBUb3AgbGV2ZWwgQ2hyb21lT1MgZGV2aWNlIHRvIHVzZSB0byB0YWxrIHRvIEVDCisgKiBAbm90aWZpZXI6IGludGVycnVwdCBldmVudCBub3RpZmllciBmb3IgdHJhbnNwb3J0IGRldmljZXMKICAqLwogc3RydWN0IGNyb3NfZWNfa2V5YiB7CiAJdW5zaWduZWQgaW50IHJvd3M7CkBAIC01Nyw2ICs1OSw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CiAJc3RydWN0IGNyb3NfZWNfZGV2aWNlICplYzsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbm90aWZpZXI7CiB9OwogCiAKQEAgLTE0Niw2NyArMTQ5LDQ0IEBACiAJaW5wdXRfc3luYyhja2Rldi0+aWRldik7CiB9CiAKLXN0YXRpYyBpbnQgY3Jvc19lY19rZXliX2dldF9zdGF0ZShzdHJ1Y3QgY3Jvc19lY19rZXliICpja2RldiwgdWludDhfdCAqa2Jfc3RhdGUpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGNyb3NfZWNfY29tbWFuZCAqbXNnOwotCi0JbXNnID0ga21hbGxvYyhzaXplb2YoKm1zZykgKyBja2Rldi0+Y29scywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtc2cpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbXNnLT52ZXJzaW9uID0gMDsKLQltc2ctPmNvbW1hbmQgPSBFQ19DTURfTUtCUF9TVEFURTsKLQltc2ctPmluc2l6ZSA9IGNrZGV2LT5jb2xzOwotCW1zZy0+b3V0c2l6ZSA9IDA7Ci0KLQlyZXQgPSBjcm9zX2VjX2NtZF94ZmVyKGNrZGV2LT5lYywgbXNnKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNrZGV2LT5kZXYsICJFcnJvciB0cmFuc2ZlcnJpbmcgRUMgbWVzc2FnZSAlZFxuIiwgcmV0KTsKLQkJZ290byBleGl0OwotCX0KLQotCW1lbWNweShrYl9zdGF0ZSwgbXNnLT5kYXRhLCBja2Rldi0+Y29scyk7Ci1leGl0OgotCWtmcmVlKG1zZyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGNyb3NfZWNfa2V5Yl9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgY3Jvc19lY19rZXliICpja2RldiA9IGRhdGE7Ci0Jc3RydWN0IGNyb3NfZWNfZGV2aWNlICplYyA9IGNrZGV2LT5lYzsKLQlpbnQgcmV0OwotCXVpbnQ4X3Qga2Jfc3RhdGVbY2tkZXYtPmNvbHNdOwotCi0JaWYgKGRldmljZV9tYXlfd2FrZXVwKGVjLT5kZXYpKQotCQlwbV93YWtldXBfZXZlbnQoZWMtPmRldiwgMCk7Ci0KLQlyZXQgPSBjcm9zX2VjX2tleWJfZ2V0X3N0YXRlKGNrZGV2LCBrYl9zdGF0ZSk7Ci0JaWYgKHJldCA+PSAwKQotCQljcm9zX2VjX2tleWJfcHJvY2Vzcyhja2Rldiwga2Jfc3RhdGUsIHJldCk7Ci0JZWxzZQotCQlkZXZfZXJyKGNrZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGtleWJvYXJkIHN0YXRlOiAlZFxuIiwgcmV0KTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQogc3RhdGljIGludCBjcm9zX2VjX2tleWJfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGNyb3NfZWNfa2V5YiAqY2tkZXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBjcm9zX2VjX2RldmljZSAqZWMgPSBja2Rldi0+ZWM7CiAKLQlyZXR1cm4gcmVxdWVzdF90aHJlYWRlZF9pcnEoZWMtPmlycSwgTlVMTCwgY3Jvc19lY19rZXliX2lycSwKLQkJCQkJSVJRRl9UUklHR0VSX0xPVyB8IElSUUZfT05FU0hPVCwKLQkJCQkJImNyb3NfZWNfa2V5YiIsIGNrZGV2KTsKKwlyZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmNrZGV2LT5lYy0+ZXZlbnRfbm90aWZpZXIsCisJCQkJCQkmY2tkZXYtPm5vdGlmaWVyKTsKIH0KIAogc3RhdGljIHZvaWQgY3Jvc19lY19rZXliX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgY3Jvc19lY19rZXliICpja2RldiA9IGlucHV0X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGNyb3NfZWNfZGV2aWNlICplYyA9IGNrZGV2LT5lYzsKIAotCWZyZWVfaXJxKGVjLT5pcnEsIGNrZGV2KTsKKwlibG9ja2luZ19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZja2Rldi0+ZWMtPmV2ZW50X25vdGlmaWVyLAorCQkJCQkgICAmY2tkZXYtPm5vdGlmaWVyKTsKK30KKworc3RhdGljIGludCBjcm9zX2VjX2tleWJfd29yayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHF1ZXVlZF9kdXJpbmdfc3VzcGVuZCwgdm9pZCAqX25vdGlmeSkKK3sKKwlzdHJ1Y3QgY3Jvc19lY19rZXliICpja2RldiA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGNyb3NfZWNfa2V5YiwKKwkJCQkJCSAgbm90aWZpZXIpOworCisJaWYgKGNrZGV2LT5lYy0+ZXZlbnRfZGF0YS5ldmVudF90eXBlICE9IEVDX01LQlBfRVZFTlRfS0VZX01BVFJJWCkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCS8qCisJICogSWYgRUMgaXMgbm90IHRoZSB3YWtlIHNvdXJjZSwgZGlzY2FyZCBrZXkgc3RhdGUgY2hhbmdlcyBkdXJpbmcKKwkgKiBzdXNwZW5kLgorCSAqLworCWlmIChxdWV1ZWRfZHVyaW5nX3N1c3BlbmQpCisJCXJldHVybiBOT1RJRllfT0s7CisJaWYgKGNrZGV2LT5lYy0+ZXZlbnRfc2l6ZSAhPSBja2Rldi0+Y29scykgeworCQlkZXZfZXJyKGNrZGV2LT5kZXYsCisJCQkiRGlzY2FyZGVkIGluY29tcGxldGUga2V5IG1hdHJpeCBldmVudC5cbiIpOworCQlyZXR1cm4gTk9USUZZX09LOworCX0KKwljcm9zX2VjX2tleWJfcHJvY2Vzcyhja2RldiwgY2tkZXYtPmVjLT5ldmVudF9kYXRhLmRhdGEua2V5X21hdHJpeCwKKwkJCSAgICAgY2tkZXYtPmVjLT5ldmVudF9zaXplKTsKKwlyZXR1cm4gTk9USUZZX09LOwogfQogCiAvKgpAQCAtMjY1LDEyICsyNDUsOCBAQAogCWlmICghaWRldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoIWVjLT5pcnEpIHsKLQkJZGV2X2VycihkZXYsICJubyBFQyBJUlEgc3BlY2lmaWVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJY2tkZXYtPmVjID0gZWM7CisJY2tkZXYtPm5vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBjcm9zX2VjX2tleWJfd29yazsKIAlja2Rldi0+ZGV2ID0gZGV2OwogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNrZGV2KTsKIApAQCAtMzExLDU0ICsyODcsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi0vKiBDbGVhciBhbnkga2V5cyBpbiB0aGUgYnVmZmVyICovCi1zdGF0aWMgdm9pZCBjcm9zX2VjX2tleWJfY2xlYXJfa2V5Ym9hcmQoc3RydWN0IGNyb3NfZWNfa2V5YiAqY2tkZXYpCi17Ci0JdWludDhfdCBvbGRfc3RhdGVbY2tkZXYtPmNvbHNdOwotCXVpbnQ4X3QgbmV3X3N0YXRlW2NrZGV2LT5jb2xzXTsKLQl1bnNpZ25lZCBsb25nIGR1cmF0aW9uOwotCWludCBpLCByZXQ7Ci0KLQkvKgotCSAqIEtlZXAgcmVhZGluZyB1bnRpbCB3ZSBzZWUgdGhhdCB0aGUgc2NhbiBzdGF0ZSBkb2VzIG5vdCBjaGFuZ2UuCi0JICogVGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZSBhcmUgZG9uZS4KLQkgKgotCSAqIEFzc3VtZSB0aGF0IHRoZSBFQyBrZXlzY2FuIGJ1ZmZlciBpcyBhdCBtb3N0IDMyIGRlZXAuCi0JICovCi0JZHVyYXRpb24gPSBqaWZmaWVzOwotCXJldCA9IGNyb3NfZWNfa2V5Yl9nZXRfc3RhdGUoY2tkZXYsIG5ld19zdGF0ZSk7Ci0JZm9yIChpID0gMTsgIXJldCAmJiBpIDwgMzI7IGkrKykgewotCQltZW1jcHkob2xkX3N0YXRlLCBuZXdfc3RhdGUsIHNpemVvZihvbGRfc3RhdGUpKTsKLQkJcmV0ID0gY3Jvc19lY19rZXliX2dldF9zdGF0ZShja2RldiwgbmV3X3N0YXRlKTsKLQkJaWYgKDAgPT0gbWVtY21wKG9sZF9zdGF0ZSwgbmV3X3N0YXRlLCBzaXplb2Yob2xkX3N0YXRlKSkpCi0JCQlicmVhazsKLQl9Ci0JZHVyYXRpb24gPSBqaWZmaWVzIC0gZHVyYXRpb247Ci0JZGV2X2luZm8oY2tkZXYtPmRldiwgIkRpc2NhcmRlZCAlZCBrZXlzY2FuKHMpIGluICVkdXNcbiIsIGksCi0JCWppZmZpZXNfdG9fdXNlY3MoZHVyYXRpb24pKTsKLX0KLQotc3RhdGljIGludCBjcm9zX2VjX2tleWJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgY3Jvc19lY19rZXliICpja2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JLyoKLQkgKiBXaGVuIHRoZSBFQyBpcyBub3QgYSB3YWtlIHNvdXJjZSwgdGhlbiBpdCBjb3VsZCBub3QgaGF2ZSBjYXVzZWQgdGhlCi0JICogcmVzdW1lLCBzbyB3ZSBjbGVhciB0aGUgRUMncyBrZXkgc2NhbiBidWZmZXIuIElmIHRoZSBFQyB3YXMgYQotCSAqIHdha2Ugc291cmNlIChlLmcuIHRoZSBsaWQgaXMgb3BlbiBhbmQgdGhlIHVzZXIgbWlnaHQgcHJlc3MgYSBrZXkgdG8KLQkgKiB3YWtlKSB0aGVuIHRoZSBrZXkgc2NhbiBidWZmZXIgc2hvdWxkIGJlIHByZXNlcnZlZC4KLQkgKi8KLQlpZiAoIWNrZGV2LT5lYy0+d2FzX3dha2VfZGV2aWNlKQotCQljcm9zX2VjX2tleWJfY2xlYXJfa2V5Ym9hcmQoY2tkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgotCi1zdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoY3Jvc19lY19rZXliX3BtX29wcywgTlVMTCwgY3Jvc19lY19rZXliX3Jlc3VtZSk7Ci0KICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNyb3NfZWNfa2V5Yl9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiZ29vZ2xlLGNyb3MtZWMta2V5YiIgfSwKQEAgLTM3Miw3ICszMDAsNiBAQAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gImNyb3MtZWMta2V5YiIsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihjcm9zX2VjX2tleWJfb2ZfbWF0Y2gpLAotCQkucG0JPSAmY3Jvc19lY19rZXliX3BtX29wcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9qb3JuYWRhNzIwX2tiZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9qb3JuYWRhNzIwX2tiZC5jCmluZGV4IDQyMWQ5YzUuLjEyNzdjMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvam9ybmFkYTcyMF9rYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2pvcm5hZGE3MjBfa2JkLmMKQEAgLTI1LDggKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxtYWNoL2pvcm5hZGE3MjAuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAKIE1PRFVMRV9BVVRIT1IoIktyaXN0b2ZmZXIgRXJpY3NvbiA8S3Jpc3RvZmZlci5Fcmljc29uQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSFAgSm9ybmFkYSA3MTAvNzIwLzcyOCBrZXlib2FyZCBkcml2ZXIiKTsKQEAgLTY2LDEwICs2NCw4IEBACiAJam9ybmFkYV9zc3Bfc3RhcnQoKTsKIAogCWlmIChqb3JuYWRhX3NzcF9pbm91dChHRVRTQ0FOS0VZQ09ERSkgIT0gVFhEVU1NWSkgewotCQlwcmludGsoS0VSTl9ERUJVRwotCQkJImpvcm5hZGE3MjBfa2JkOiAiCi0JCQkiR2V0S2V5Y29kZSBjb21tYW5kIGZhaWxlZCB3aXRoIEVUSU1FRE9VVCwgIgotCQkJImZsdXNoZWQgYnVzXG4iKTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LAorCQkJIkdldEtleWNvZGUgY29tbWFuZCBmYWlsZWQgd2l0aCBFVElNRURPVVQsIGZsdXNoZWQgYnVzXG4iKTsKIAl9IGVsc2UgewogCQkvKiBIb3cgbWFueSBrZXljb2RlcyBhcmUgd2FpdGluZyBmb3IgdXM/ICovCiAJCWNvdW50ID0gam9ybmFkYV9zc3BfYnl0ZShUWERVTU1ZKTsKQEAgLTk3LDE0ICs5MywxNiBAQAogewogCXN0cnVjdCBqb3JuYWRha2JkICpqb3JuYWRha2JkOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKLQlpbnQgaSwgZXJyOworCWludCBpLCBlcnIsIGlycTsKIAotCWpvcm5hZGFrYmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgam9ybmFkYWtiZCksIEdGUF9LRVJORUwpOwotCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICgham9ybmFkYWtiZCB8fCAhaW5wdXRfZGV2KSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDE7Ci0JfQorCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8PSAwKQorCQlyZXR1cm4gaXJxIDwgMCA/IGlycSA6IC1FSU5WQUw7CisKKwlqb3JuYWRha2JkID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqam9ybmFkYWtiZCksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGRldm1faW5wdXRfYWxsb2NhdGVfZGV2aWNlKCZwZGV2LT5kZXYpOworCWlmICgham9ybmFkYWtiZCB8fCAhaW5wdXRfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGpvcm5hZGFrYmQpOwogCkBAIC0xMjcsNDAgKzEyNSwxNiBAQAogCiAJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaW5wdXRfZGV2LCBFVl9NU0MsIE1TQ19TQ0FOKTsKIAotCWVyciA9IHJlcXVlc3RfaXJxKElSUV9HUElPMCwKLQkJCSAgam9ybmFkYTcyMF9rYmRfaW50ZXJydXB0LAotCQkJICBJUlFGX1RSSUdHRVJfRkFMTElORywKLQkJCSAgImpvcm5hZGFrYmQiLCBwZGV2KTsKKwllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgam9ybmFkYTcyMF9rYmRfaW50ZXJydXB0LAorCQkJICAgICAgIElSUUZfVFJJR0dFUl9GQUxMSU5HLCAiam9ybmFkYWtiZCIsIHBkZXYpOwogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiam9ybmFkYWtiZDcyMF9rYmQ6IFVuYWJsZSB0byBncmFiIElSUVxuIik7Ci0JCWdvdG8gZmFpbDE7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBncmFiIElSUSVkOiAlZFxuIiwgaXJxLCBlcnIpOworCQlyZXR1cm4gZXJyOwogCX0KIAotCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShqb3JuYWRha2JkLT5pbnB1dCk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsMjsKLQotCXJldHVybiAwOwotCi0gZmFpbDI6CS8qIElSUSwgREVWSUNFLCBNRU1PUlkgKi8KLQlmcmVlX2lycShJUlFfR1BJTzAsIHBkZXYpOwotIGZhaWwxOgkvKiBERVZJQ0UsIE1FTU9SWSAqLwotCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0Ja2ZyZWUoam9ybmFkYWtiZCk7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGpvcm5hZGFrYmQtPmlucHV0KTsKIH07CiAKLXN0YXRpYyBpbnQgam9ybmFkYTcyMF9rYmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGpvcm5hZGFrYmQgKmpvcm5hZGFrYmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWZyZWVfaXJxKElSUV9HUElPMCwgcGRldik7Ci0JaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoam9ybmFkYWtiZC0+aW5wdXQpOwotCWtmcmVlKGpvcm5hZGFrYmQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpqb3JuYWRhNzIwX2tiZCIpOwogCkBAIC0xNjksNiArMTQzLDUgQEAKIAkJLm5hbWUgICAgPSAiam9ybmFkYTcyMF9rYmQiLAogCSB9LAogCS5wcm9iZSAgID0gam9ybmFkYTcyMF9rYmRfcHJvYmUsCi0JLnJlbW92ZSAgPSBqb3JuYWRhNzIwX2tiZF9yZW1vdmUsCiB9OwogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihqb3JuYWRhNzIwX2tiZF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zbnZzX3B3cmtleS5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9zbnZzX3B3cmtleS5jCmluZGV4IDI0YTlmNTkuLjc1NDQ4ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvc252c19wd3JrZXkuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3NudnNfcHdya2V5LmMKQEAgLTE2OCw3ICsxNjgsNiBAQAogCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0KTsKIAlpZiAoZXJyb3IgPCAwKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOwotCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dCk7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKaW5kZXggZWZiMGNhOC4uN2ZmYjYxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcKQEAgLTI5Miw2ICsyOTIsMTggQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGdwaW9fdGlsdF9wb2xsZWQuCiAKK2NvbmZpZyBJTlBVVF9HUElPX0RFQ09ERVIKKwl0cmlzdGF0ZSAiUG9sbGVkIEdQSU8gRGVjb2RlciBJbnB1dCBkcml2ZXIiCisJZGVwZW5kcyBvbiBHUElPTElCIHx8IENPTVBJTEVfVEVTVAorCXNlbGVjdCBJTlBVVF9QT0xMREVWCisJaGVscAorCSBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGRyaXZlciB0byByZWFkIHN0YXR1cyBvZiBtdWx0aXBsZSBHUElPCisJIGxpbmVzIGFuZCByZXBvcnQgdGhlIGVuY29kZWQgdmFsdWUgYXMgYW4gYWJzb2x1dGUgaW50ZWdlciB0bworCSBpbnB1dCBzdWJzeXN0ZW0uCisKKwkgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSB3aWxsIGJlIGNhbGxlZCBncGlvX2RlY29kZXIuCisKIGNvbmZpZyBJTlBVVF9JWFA0WFhfQkVFUEVSCiAJdHJpc3RhdGUgIklYUDRYWCBCZWVwZXIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEFSQ0hfSVhQNFhYCkBAIC00NTQsMTAgKzQ2NiwxMCBAQAogCiBjb25maWcgSU5QVVRfVFBTNjUyMThfUFdSQlVUVE9OCiAJdHJpc3RhdGUgIlRQUzY1MjE4IFBvd2VyIGJ1dHRvbiBkcml2ZXIiCi0JZGVwZW5kcyBvbiBNRkRfVFBTNjUyMTgKKwlkZXBlbmRzIG9uIChNRkRfVFBTNjUyMTcgfHwgTUZEX1RQUzY1MjE4KQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHBvd2VyIGJ1dHRvbmcgcmVwb3J0aW5nIGZvcgotCSAgdGhlIFRQUzY1MjE4IFBvd2VyIE1hbmFnZW1lbnQgSUMgZGV2aWNlLgorCSAgVFBTNjUyMTcgYW5kIFRQUzY1MjE4IFBvd2VyIE1hbmFnZW1lbnQgSUMgZGV2aWNlcy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gVGhlIG1vZHVsZSB3aWxsCiAJICBiZSBjYWxsZWQgdHBzNjUyMTgtcHdyYnV0dG9uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlCmluZGV4IDZhMWU1ZTIuLjBiNmQwMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUKQEAgLTM1LDYgKzM1LDcgQEAKIG9iai0kKENPTkZJR19JTlBVVF9HUDJBKQkJKz0gZ3AyYXAwMDJhMDBmLm8KIG9iai0kKENPTkZJR19JTlBVVF9HUElPX0JFRVBFUikJCSs9IGdwaW8tYmVlcGVyLm8KIG9iai0kKENPTkZJR19JTlBVVF9HUElPX1RJTFRfUE9MTEVEKQkrPSBncGlvX3RpbHRfcG9sbGVkLm8KK29iai0kKENPTkZJR19JTlBVVF9HUElPX0RFQ09ERVIpCSs9IGdwaW9fZGVjb2Rlci5vCiBvYmotJChDT05GSUdfSU5QVVRfSElTSV9QT1dFUktFWSkJKz0gaGlzaV9wb3dlcmtleS5vCiBvYmotJChDT05GSUdfSFBfU0RDX1JUQykJCSs9IGhwX3NkY19ydGMubwogb2JqLSQoQ09ORklHX0lOUFVUX0lNU19QQ1UpCQkrPSBpbXMtcGN1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9ncGlvX2RlY29kZXIuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9ncGlvX2RlY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTdlMGJhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL2dwaW9fZGVjb2Rlci5jCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEEgZ2VuZXJpYyBkcml2ZXIgdG8gcmVhZCBtdWx0aXBsZSBncGlvIGxpbmVzIGFuZCB0cmFuc2xhdGUgdGhlCisgKiBlbmNvZGVkIG51bWVyaWMgdmFsdWUgaW50byBhbiBpbnB1dCBldmVudC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQtcG9sbGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKK3N0cnVjdCBncGlvX2RlY29kZXIgeworCXN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpwb2xsX2RldjsKKwlzdHJ1Y3QgZ3Bpb19kZXNjcyAqaW5wdXRfZ3Bpb3M7CisJc3RydWN0IGRldmljZSAqZGV2OworCXUzMiBheGlzOworCXUzMiBsYXN0X3N0YWJsZTsKK307CisKK3N0YXRpYyBpbnQgZ3Bpb19kZWNvZGVyX2dldF9ncGlvc19zdGF0ZShzdHJ1Y3QgZ3Bpb19kZWNvZGVyICpkZWNvZGVyKQoreworCXN0cnVjdCBncGlvX2Rlc2NzICpncGlvcyA9IGRlY29kZXItPmlucHV0X2dwaW9zOworCXVuc2lnbmVkIGludCByZXQgPSAwOworCWludCBpLCB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ3Bpb3MtPm5kZXNjczsgaSsrKSB7CisJCXZhbCA9IGdwaW9kX2dldF92YWx1ZV9jYW5zbGVlcChncGlvcy0+ZGVzY1tpXSk7CisJCWlmICh2YWwgPCAwKSB7CisJCQlkZXZfZXJyKGRlY29kZXItPmRldiwKKwkJCQkiRXJyb3IgcmVhZGluZyBncGlvICVkOiAlZFxuIiwKKwkJCQlkZXNjX3RvX2dwaW8oZ3Bpb3MtPmRlc2NbaV0pLCB2YWwpOworCQkJcmV0dXJuIHZhbDsKKwkJfQorCisJCXZhbCA9ICEhdmFsOworCQlyZXQgPSAocmV0IDw8IDEpIHwgdmFsOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9fZGVjb2Rlcl9wb2xsX2dwaW9zKHN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpwb2xsX2RldikKK3sKKwlzdHJ1Y3QgZ3Bpb19kZWNvZGVyICpkZWNvZGVyID0gcG9sbF9kZXYtPnByaXZhdGU7CisJaW50IHN0YXRlOworCisJc3RhdGUgPSBncGlvX2RlY29kZXJfZ2V0X2dwaW9zX3N0YXRlKGRlY29kZXIpOworCWlmIChzdGF0ZSA+PSAwICYmIHN0YXRlICE9IGRlY29kZXItPmxhc3Rfc3RhYmxlKSB7CisJCWlucHV0X3JlcG9ydF9hYnMocG9sbF9kZXYtPmlucHV0LCBkZWNvZGVyLT5heGlzLCBzdGF0ZSk7CisJCWlucHV0X3N5bmMocG9sbF9kZXYtPmlucHV0KTsKKwkJZGVjb2Rlci0+bGFzdF9zdGFibGUgPSBzdGF0ZTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19kZWNvZGVyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZ3Bpb19kZWNvZGVyICpkZWNvZGVyOworCXN0cnVjdCBpbnB1dF9wb2xsZWRfZGV2ICpwb2xsX2RldjsKKwl1MzIgIG1heDsKKwlpbnQgZXJyOworCisJZGVjb2RlciA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgZ3Bpb19kZWNvZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZWNvZGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJsaW51eCxheGlzIiwgJmRlY29kZXItPmF4aXMpOworCWRlY29kZXItPmlucHV0X2dwaW9zID0gZGV2bV9ncGlvZF9nZXRfYXJyYXkoZGV2LCBOVUxMLCBHUElPRF9JTik7CisJaWYgKElTX0VSUihkZWNvZGVyLT5pbnB1dF9ncGlvcykpIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gYWNxdWlyZSBpbnB1dCBncGlvc1xuIik7CisJCXJldHVybiBQVFJfRVJSKGRlY29kZXItPmlucHV0X2dwaW9zKTsKKwl9CisJaWYgKGRlY29kZXItPmlucHV0X2dwaW9zLT5uZGVzY3MgPCAyKSB7CisJCWRldl9lcnIoZGV2LCAibm90IGVub3VnaCBncGlvcyBmb3VuZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAiZGVjb2Rlci1tYXgtdmFsdWUiLCAmbWF4KSkKKwkJbWF4ID0gKDFVIDw8IGRlY29kZXItPmlucHV0X2dwaW9zLT5uZGVzY3MpIC0gMTsKKworCWRlY29kZXItPmRldiA9IGRldjsKKwlwb2xsX2RldiA9IGRldm1faW5wdXRfYWxsb2NhdGVfcG9sbGVkX2RldmljZShkZWNvZGVyLT5kZXYpOworCWlmICghcG9sbF9kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcG9sbF9kZXYtPnByaXZhdGUgPSBkZWNvZGVyOworCXBvbGxfZGV2LT5wb2xsID0gZ3Bpb19kZWNvZGVyX3BvbGxfZ3Bpb3M7CisJZGVjb2Rlci0+cG9sbF9kZXYgPSBwb2xsX2RldjsKKworCXBvbGxfZGV2LT5pbnB1dC0+bmFtZSA9IHBkZXYtPm5hbWU7CisJcG9sbF9kZXYtPmlucHV0LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMocG9sbF9kZXYtPmlucHV0LCBkZWNvZGVyLT5heGlzLCAwLCBtYXgsIDAsIDApOworCisJZXJyID0gaW5wdXRfcmVnaXN0ZXJfcG9sbGVkX2RldmljZShwb2xsX2Rldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciBwb2xsZWQgIGRldmljZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRlY29kZXIpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGdwaW9fZGVjb2Rlcl9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiZ3Bpby1kZWNvZGVyIiwgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZ3Bpb19kZWNvZGVyX29mX21hdGNoKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBncGlvX2RlY29kZXJfZHJpdmVyID0geworCS5wcm9iZQkJPSBncGlvX2RlY29kZXJfcHJvYmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImdwaW8tZGVjb2RlciIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihncGlvX2RlY29kZXJfb2ZfbWF0Y2gpLAorCX0KK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGdwaW9fZGVjb2Rlcl9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkdQSU8gZGVjb2RlciBpbnB1dCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlZpZ25lc2ggUiA8dmlnbmVzaHJAdGkuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL21heDc3NjkzLWhhcHRpYy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL21heDc3NjkzLWhhcHRpYy5jCmluZGV4IDI5ZGRlYjcuLjQ2YjBmNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9tYXg3NzY5My1oYXB0aWMuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvbWF4Nzc2OTMtaGFwdGljLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDE0LDIwMTUgU2Ftc3VuZyBFbGVjdHJvbmljcwogICogSmFld29uIEtpbSA8amFld29uMDIua2ltQHNhbXN1bmcuY29tPgotICogS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CisgKiBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIG5vdCBwcm92aWRlZCAvIG93bmVkIGJ5IE1heGltIEludGVncmF0ZWQgUHJvZHVjdHMuCiAgKgpAQCAtNDI2LDcgKzQyNiw3IEBACiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1heDc3NjkzX2hhcHRpY19kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJKYWV3b24gS2ltIDxqYWV3b24wMi5raW1Ac2Ftc3VuZy5jb20+Iik7Ci1NT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIktyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTUFYSU0gNzc2OTMvNzc4NDMgSGFwdGljIGRyaXZlciIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTptYXg3NzY5My1oYXB0aWMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy90cHM2NTIxOC1wd3JidXR0b24uYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy90cHM2NTIxOC1wd3JidXR0b24uYwppbmRleCBhMzliNjI2Li4zMjczMjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvdHBzNjUyMTgtcHdyYnV0dG9uLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3RwczY1MjE4LXB3cmJ1dHRvbi5jCkBAIC0xLDggKzEsOSBAQAogLyoKLSAqIFRleGFzIEluc3RydW1lbnRzJyBUUFM2NTIxOCBQb3dlciBCdXR0b24gSW5wdXQgRHJpdmVyCisgKiBUZXhhcyBJbnN0cnVtZW50cycgVFBTNjUyMTcgYW5kIFRQUzY1MjE4IFBvd2VyIEJ1dHRvbiBJbnB1dCBEcml2ZXIKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGV4YXMgSW5zdHJ1bWVudHMgSW5jb3Jwb3JhdGVkIC0gaHR0cDovL3d3dy50aS5jb20vCiAgKiBBdXRob3I6IEZlbGlwZSBCYWxiaSA8YmFsYmlAdGkuY29tPgorICogQXV0aG9yOiBNYXJjaW4gTmllc3Ryb2ogPG0ubmllc3Ryb2pAZ3Jpbm4tZ2xvYmFsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTE4LDMxICsxOSw2MSBAQAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3RwczY1MjE3Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL3RwczY1MjE4Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLXN0cnVjdCB0cHM2NTIxOF9wd3JidXR0b24gewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgdHBzNjUyMTggKnRwczsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2Oworc3RydWN0IHRwczY1MjF4X2RhdGEgeworCXVuc2lnbmVkIGludCByZWdfc3RhdHVzOworCXVuc2lnbmVkIGludCBwYl9tYXNrOworCWNvbnN0IGNoYXIgKm5hbWU7CiB9OwogCi1zdGF0aWMgaXJxcmV0dXJuX3QgdHBzNjUyMThfcHdyX2lycShpbnQgaXJxLCB2b2lkICpfcHdyKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0cHM2NTIxeF9kYXRhIHRwczY1MjE3X2RhdGEgPSB7CisJLnJlZ19zdGF0dXMgPSBUUFM2NTIxN19SRUdfU1RBVFVTLAorCS5wYl9tYXNrID0gVFBTNjUyMTdfU1RBVFVTX1BCLAorCS5uYW1lID0gInRwczY1MjE3X3B3cmJ1dHRvbiIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRwczY1MjF4X2RhdGEgdHBzNjUyMThfZGF0YSA9IHsKKwkucmVnX3N0YXR1cyA9IFRQUzY1MjE4X1JFR19TVEFUVVMsCisJLnBiX21hc2sgPSBUUFM2NTIxOF9TVEFUVVNfUEJfU1RBVEUsCisJLm5hbWUgPSAidHBzNjUyMThfcHdyYnV0dG9uIiwKK307CisKK3N0cnVjdCB0cHM2NTIxeF9wd3JidXR0b24geworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGlucHV0X2RldiAqaWRldjsKKwljb25zdCBzdHJ1Y3QgdHBzNjUyMXhfZGF0YSAqZGF0YTsKKwljaGFyIHBoeXNbMzJdOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfdHBzNjUyMXhfcGJfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInRpLHRwczY1MjE3LXB3cmJ1dHRvbiIsIC5kYXRhID0gJnRwczY1MjE3X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHRwczY1MjE4LXB3cmJ1dHRvbiIsIC5kYXRhID0gJnRwczY1MjE4X2RhdGEgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2ZfdHBzNjUyMXhfcGJfbWF0Y2gpOworCitzdGF0aWMgaXJxcmV0dXJuX3QgdHBzNjUyMXhfcGJfaXJxKGludCBpcnEsIHZvaWQgKl9wd3IpCiB7Ci0Jc3RydWN0IHRwczY1MjE4X3B3cmJ1dHRvbiAqcHdyID0gX3B3cjsKKwlzdHJ1Y3QgdHBzNjUyMXhfcHdyYnV0dG9uICpwd3IgPSBfcHdyOworCWNvbnN0IHN0cnVjdCB0cHM2NTIxeF9kYXRhICp0cHNfZGF0YSA9IHB3ci0+ZGF0YTsKIAl1bnNpZ25lZCBpbnQgcmVnOwogCWludCBlcnJvcjsKIAotCWVycm9yID0gdHBzNjUyMThfcmVnX3JlYWQocHdyLT50cHMsIFRQUzY1MjE4X1JFR19TVEFUVVMsICZyZWcpOworCWVycm9yID0gcmVnbWFwX3JlYWQocHdyLT5yZWdtYXAsIHRwc19kYXRhLT5yZWdfc3RhdHVzLCAmcmVnKTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2Vycihwd3ItPmRldiwgImNhbid0IHJlYWQgcmVnaXN0ZXI6ICVkXG4iLCBlcnJvcik7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChyZWcgJiBUUFM2NTIxOF9TVEFUVVNfUEJfU1RBVEUpIHsKKwlpZiAocmVnICYgdHBzX2RhdGEtPnBiX21hc2spIHsKIAkJaW5wdXRfcmVwb3J0X2tleShwd3ItPmlkZXYsIEtFWV9QT1dFUiwgMSk7CiAJCXBtX3dha2V1cF9ldmVudChwd3ItPmRldiwgMCk7CiAJfSBlbHNlIHsKQEAgLTU1LDQyICs4Niw1NSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCB0cHM2NTIxOF9wd3Jvbl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCB0cHM2NTIxeF9wYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCB0cHM2NTIxOCAqdHBzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IHRwczY1MjE4X3B3cmJ1dHRvbiAqcHdyOworCXN0cnVjdCB0cHM2NTIxeF9wd3JidXR0b24gKnB3cjsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCWludCBlcnJvcjsKIAlpbnQgaXJxOwogCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKG9mX3RwczY1MjF4X3BiX21hdGNoLCBwZGV2LT5kZXYub2Zfbm9kZSk7CisJaWYgKCFtYXRjaCkKKwkJcmV0dXJuIC1FTlhJTzsKKwogCXB3ciA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHdyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwd3IpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcHdyLT5kYXRhID0gbWF0Y2gtPmRhdGE7CisKIAlpZGV2ID0gZGV2bV9pbnB1dF9hbGxvY2F0ZV9kZXZpY2UoZGV2KTsKIAlpZiAoIWlkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWRldi0+bmFtZSA9ICJ0cHM2NTIxOF9wd3JidXR0b24iOwotCWlkZXYtPnBoeXMgPSAidHBzNjUyMThfcHdyYnV0dG9uL2lucHV0MCI7CisJaWRldi0+bmFtZSA9IHB3ci0+ZGF0YS0+bmFtZTsKKwlzbnByaW50Zihwd3ItPnBoeXMsIHNpemVvZihwd3ItPnBoeXMpLCAiJXMvaW5wdXQwIiwKKwkJcHdyLT5kYXRhLT5uYW1lKTsKKwlpZGV2LT5waHlzID0gcHdyLT5waHlzOwogCWlkZXYtPmRldi5wYXJlbnQgPSBkZXY7CiAJaWRldi0+aWQuYnVzdHlwZSA9IEJVU19JMkM7CiAKIAlpbnB1dF9zZXRfY2FwYWJpbGl0eShpZGV2LCBFVl9LRVksIEtFWV9QT1dFUik7CiAKLQlwd3ItPnRwcyA9IHRwczsKKwlwd3ItPnJlZ21hcCA9IGRldl9nZXRfcmVnbWFwKHBkZXYtPmRldi5wYXJlbnQsIE5VTEwpOwogCXB3ci0+ZGV2ID0gZGV2OwogCXB3ci0+aWRldiA9IGlkZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHdyKTsKIAlkZXZpY2VfaW5pdF93YWtldXAoZGV2LCB0cnVlKTsKIAogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JZXJyb3IgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGRldiwgaXJxLCBOVUxMLCB0cHM2NTIxOF9wd3JfaXJxLAorCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiTm8gSVJRIHJlc291cmNlIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVycm9yID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIGlycSwgTlVMTCwgdHBzNjUyMXhfcGJfaXJxLAogCQkJCQkgIElSUUZfVFJJR0dFUl9SSVNJTkcgfAogCQkJCQkJSVJRRl9UUklHR0VSX0ZBTExJTkcgfAogCQkJCQkJSVJRRl9PTkVTSE9ULAotCQkJCQkgICJ0cHM2NTIxOC1wd3JidXR0b24iLCBwd3IpOworCQkJCQkgIHB3ci0+ZGF0YS0+bmFtZSwgcHdyKTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBJUlEgIyVkOiAlZFxuIiwKIAkJCWlycSwgZXJyb3IpOwpAQCAtMTA2LDIxICsxNTAsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfdHBzNjUyMThfcHdyX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJ0aSx0cHM2NTIxOC1wd3JidXR0b24iIH0sCi0JeyB9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX3RwczY1MjE4X3B3cl9tYXRjaCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRwczY1MjE4X3B3cm9uX2RyaXZlciA9IHsKLQkucHJvYmUJPSB0cHM2NTIxOF9wd3Jvbl9wcm9iZSwKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRwczY1MjF4X3BiX2RyaXZlciA9IHsKKwkucHJvYmUJPSB0cHM2NTIxeF9wYl9wcm9iZSwKIAkuZHJpdmVyCT0gewotCQkubmFtZQk9ICJ0cHM2NTIxOF9wd3JidXR0b24iLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl90cHM2NTIxOF9wd3JfbWF0Y2gsCisJCS5uYW1lCT0gInRwczY1MjF4X3B3cmJ1dHRvbiIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX3RwczY1MjF4X3BiX21hdGNoLAogCX0sCiB9OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0cHM2NTIxOF9wd3Jvbl9kcml2ZXIpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0cHM2NTIxeF9wYl9kcml2ZXIpOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIlRQUzY1MjE4IFBvd2VyIEJ1dHRvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUUFM2NTIxWCBQb3dlciBCdXR0b24iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKIE1PRFVMRV9BVVRIT1IoIkZlbGlwZSBCYWxiaSA8YmFsYmlAdGkuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3VpbnB1dC5jCmluZGV4IDY1ZWJiZDEuLjkyNTk1YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy91aW5wdXQuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvdWlucHV0LmMKQEAgLTEwMTMsMjMgKzEwMTMsMTIgQEAKIAkubWlub3IJCT0gVUlOUFVUX01JTk9SLAogCS5uYW1lCQk9IFVJTlBVVF9OQU1FLAogfTsKK21vZHVsZV9taXNjX2RldmljZSh1aW5wdXRfbWlzYyk7CisKIE1PRFVMRV9BTElBU19NSVNDREVWKFVJTlBVVF9NSU5PUik7CiBNT0RVTEVfQUxJQVMoImRldm5hbWU6IiBVSU5QVVRfTkFNRSk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHVpbnB1dF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIG1pc2NfcmVnaXN0ZXIoJnVpbnB1dF9taXNjKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHVpbnB1dF9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZ1aW5wdXRfbWlzYyk7Ci19Ci0KIE1PRFVMRV9BVVRIT1IoIkFyaXN0ZXUgU2VyZ2lvIFJvemFuc2tpIEZpbGhvIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlVzZXIgbGV2ZWwgZHJpdmVyIHN1cHBvcnQgZm9yIGlucHV0IHN1YnN5c3RlbSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oIjAuMyIpOwotCi1tb2R1bGVfaW5pdCh1aW5wdXRfaW5pdCk7Ci1tb2R1bGVfZXhpdCh1aW5wdXRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW5faTJjX3NtYnVzLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW5faTJjX3NtYnVzLmMKaW5kZXggY2I2YWVjYi4uZTIzYjI0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFuX2kyY19zbWJ1cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbl9pMmNfc21idXMuYwpAQCAtMjIyLDExICsyMjIsMTMgQEAKIHN0YXRpYyBpbnQgZWxhbl9zbWJ1c19nZXRfbWF4KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgKm1heF94LCB1bnNpZ25lZCBpbnQgKm1heF95KQogeworCWludCByZXQ7CiAJaW50IGVycm9yOwogCXU4IHZhbFszXTsKIAotCWVycm9yID0gaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YShjbGllbnQsIEVUUF9TTUJVU19SQU5HRV9DTUQsIHZhbCk7Ci0JaWYgKGVycm9yKSB7CisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YShjbGllbnQsIEVUUF9TTUJVU19SQU5HRV9DTUQsIHZhbCk7CisJaWYgKHJldCAhPSAzKSB7CisJCWVycm9yID0gcmV0IDwgMCA/IHJldCA6IC1FSU87CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGdldCBkaW1lbnNpb25zOiAlZFxuIiwgZXJyb3IpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQpAQCAtMjQwLDEyICsyNDIsMTMgQEAKIHN0YXRpYyBpbnQgZWxhbl9zbWJ1c19nZXRfcmVzb2x1dGlvbihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJCSAgICAgdTggKmh3X3Jlc194LCB1OCAqaHdfcmVzX3kpCiB7CisJaW50IHJldDsKIAlpbnQgZXJyb3I7CiAJdTggdmFsWzNdOwogCi0JZXJyb3IgPSBpMmNfc21idXNfcmVhZF9ibG9ja19kYXRhKGNsaWVudCwKLQkJCQkJICBFVFBfU01CVVNfUkVTT0xVVElPTl9DTUQsIHZhbCk7Ci0JaWYgKGVycm9yKSB7CisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYmxvY2tfZGF0YShjbGllbnQsIEVUUF9TTUJVU19SRVNPTFVUSU9OX0NNRCwgdmFsKTsKKwlpZiAocmV0ICE9IDMpIHsKKwkJZXJyb3IgPSByZXQgPCAwID8gcmV0IDogLUVJTzsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHJlc29sdXRpb246ICVkXG4iLCBlcnJvcik7CiAJCXJldHVybiBlcnJvcjsKIAl9CkBAIC0yNjAsMTIgKzI2MywxMyBAQAogCQkJCSAgICAgdW5zaWduZWQgaW50ICp4X3RyYWNlcywKIAkJCQkgICAgIHVuc2lnbmVkIGludCAqeV90cmFjZXMpCiB7CisJaW50IHJldDsKIAlpbnQgZXJyb3I7CiAJdTggdmFsWzNdOwogCi0JZXJyb3IgPSBpMmNfc21idXNfcmVhZF9ibG9ja19kYXRhKGNsaWVudCwKLQkJCQkJICBFVFBfU01CVVNfWFlfVFJBQ0VOVU1fQ01ELCB2YWwpOwotCWlmIChlcnJvcikgeworCXJldCA9IGkyY19zbWJ1c19yZWFkX2Jsb2NrX2RhdGEoY2xpZW50LCBFVFBfU01CVVNfWFlfVFJBQ0VOVU1fQ01ELCB2YWwpOworCWlmIChyZXQgIT0gMykgeworCQllcnJvciA9IHJldCA8IDAgPyByZXQgOiAtRUlPOwogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byBnZXQgdHJhY2UgaW5mbzogJWRcbiIsIGVycm9yKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZm9jYWx0ZWNoLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2ZvY2FsdGVjaC5jCmluZGV4IGM4YzZhOGMuLjU0ZWNlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZm9jYWx0ZWNoLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9mb2NhbHRlY2guYwpAQCAtMzkwLDcgKzM5MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZm9jYWx0ZWNoX3NldF9yZXNvbHV0aW9uKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLCB1bnNpZ25lZCBpbnQgcmVzb2x1dGlvbikKK3N0YXRpYyB2b2lkIGZvY2FsdGVjaF9zZXRfcmVzb2x1dGlvbihzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCByZXNvbHV0aW9uKQogewogCS8qIG5vdCBzdXBwb3J0ZWQgeWV0ICovCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYwppbmRleCA1Nzg0ZTIwLi5mYjRiMTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKQEAgLTE5MTYsNyArMTkxNiw3IEBACiAJc3luYXB0aWNzX21vZHVsZV9pbml0KCk7CiAJaGdwa19tb2R1bGVfaW5pdCgpOwogCi0Ja3BzbW91c2VkX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImtwc21vdXNlZCIpOworCWtwc21vdXNlZF93cSA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKCJrcHNtb3VzZWQiLCAwKTsKIAlpZiAoIWtwc21vdXNlZF93cSkgewogCQlwcl9lcnIoImZhaWxlZCB0byBjcmVhdGUga3BzbW91c2VkIHdvcmtxdWV1ZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9zZXJwb3J0LmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcnBvcnQuYwppbmRleCA5YzkyN2QzLi5kMTg5ODQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcnBvcnQuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3NlcnBvcnQuYwpAQCAtNzEsMTAgKzcxLDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzZXJwb3J0LT5sb2NrLCBmbGFncyk7CiAJY2xlYXJfYml0KFNFUlBPUlRfQUNUSVZFLCAmc2VycG9ydC0+ZmxhZ3MpOwotCXNldF9iaXQoU0VSUE9SVF9ERUFELCAmc2VycG9ydC0+ZmxhZ3MpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcnBvcnQtPmxvY2ssIGZsYWdzKTsKLQotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VycG9ydC0+d2FpdCk7CiB9CiAKIC8qCkBAIC0yNDgsNiArMjQ1LDE5IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGludCBzZXJwb3J0X2xkaXNjX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCBzZXJwb3J0ICpzZXJwb3J0ID0gKHN0cnVjdCBzZXJwb3J0ICopIHR0eS0+ZGlzY19kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2VycG9ydC0+bG9jaywgZmxhZ3MpOworCXNldF9iaXQoU0VSUE9SVF9ERUFELCAmc2VycG9ydC0+ZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlcnBvcnQtPmxvY2ssIGZsYWdzKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VycG9ydC0+d2FpdCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHNlcnBvcnRfbGRpc2Nfd3JpdGVfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KQogewogCXN0cnVjdCBzZXJwb3J0ICpzZXJwb3J0ID0gKHN0cnVjdCBzZXJwb3J0ICopIHR0eS0+ZGlzY19kYXRhOwpAQCAtMjc0LDYgKzI4NCw3IEBACiAJLmNvbXBhdF9pb2N0bCA9CXNlcnBvcnRfbGRpc2NfY29tcGF0X2lvY3RsLAogI2VuZGlmCiAJLnJlY2VpdmVfYnVmID0Jc2VycG9ydF9sZGlzY19yZWNlaXZlLAorCS5oYW5ndXAgPQlzZXJwb3J0X2xkaXNjX2hhbmd1cCwKIAkud3JpdGVfd2FrZXVwID0Jc2VycG9ydF9sZGlzY193cml0ZV93YWtldXAKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3BlZ2FzdXNfbm90ZXRha2VyLmMgYi9kcml2ZXJzL2lucHV0L3RhYmxldC9wZWdhc3VzX25vdGV0YWtlci5jCmluZGV4IDk0OWRhY2MuLjQ3ZGU1YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3BlZ2FzdXNfbm90ZXRha2VyLmMKKysrIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvcGVnYXN1c19ub3RldGFrZXIuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAvKiBVU0IgSElEIGRlZmluZXMgKi8KICNkZWZpbmUgVVNCX1JFUV9HRVRfUkVQT1JUCQkweDAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKaW5kZXggMmZiMWY0My4uNTA3OTgxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwpAQCAtMzA1LDE5ICszMDUsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZWdhbGF4X3RzX3NlcmlhbC4KIAotY29uZmlnIFRPVUNIU0NSRUVOX0ZUNjIzNgotCXRyaXN0YXRlICJGVDYyMzYgSTJDIHRvdWNoc2NyZWVuIgotCWRlcGVuZHMgb24gSTJDCi0JZGVwZW5kcyBvbiBHUElPTElCIHx8IENPTVBJTEVfVEVTVAotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBJMkMgY29ubmVjdGVkIEZUNngwNiBhbmQKLQkgIEZUNngzNiBmYW1pbHkgb2YgY2FwYWNpdGl2ZSB0b3VjaHNjcmVlbiBkcml2ZXJzLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBmdDYyMzYuCi0KIGNvbmZpZyBUT1VDSFNDUkVFTl9GVUpJVFNVCiAJdHJpc3RhdGUgIkZ1aml0c3Ugc2VyaWFsIHRvdWNoc2NyZWVuIgogCXNlbGVjdCBTRVJJTwpAQCAtMzk3LDYgKzM4NCwxOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZ3VuemUuCiAKK2NvbmZpZyBUT1VDSFNDUkVFTl9FS1RGMjEyNworCXRyaXN0YXRlICJFbGFuIGVLVEYyMTI3IEkyQyB0b3VjaHNjcmVlbiIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYW4gRWxhbiBlS1RGMjEyNyB0b3VjaHNjcmVlbgorCSAgY29ubmVjdGVkIHRvIHlvdXIgc3lzdGVtLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBla3RmMjEyNy4KKwogY29uZmlnIFRPVUNIU0NSRUVOX0VMQU4KIAl0cmlzdGF0ZSAiRWxhbiBlS1RIIEkyQyB0b3VjaHNjcmVlbiIKIAlkZXBlbmRzIG9uIEkyQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKaW5kZXggYjQzNzNkNi4uODFiODY0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCkBAIC0zMiwxMSArMzIsMTEgQEAKIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9IQU1QU0hJUkUpCSs9IGhhbXBzaGlyZS5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fR1VOWkUpCQkrPSBndW56ZS5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fRUVUSSkJCSs9IGVldGlfdHMubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0VLVEYyMTI3KQkrPSBla3RmMjEyNy5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fRUxBTikJCSs9IGVsYW50c19pMmMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0VMTykJCSs9IGVsby5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fRUdBTEFYKQkrPSBlZ2FsYXhfdHMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0VHQUxBWF9TRVJJQUwpCSs9IGVnYWxheF90c19zZXJpYWwubwotb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0ZUNjIzNikJKz0gZnQ2MjM2Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9GVUpJVFNVKQkrPSBmdWppdHN1X3RzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9HT09ESVgpCSs9IGdvb2RpeC5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fSUxJMjEwWCkJKz0gaWxpMjEweC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2VkdC1mdDV4MDYuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZWR0LWZ0NXgwNi5jCmluZGV4IDcwM2UyOTUuLjI4NDY2ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZWR0LWZ0NXgwNi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZWR0LWZ0NXgwNi5jCkBAIC0xMDYzLDkgKzEwNjMsMTUgQEAKIAkubWF4X3N1cHBvcnRfcG9pbnRzID0gMTAsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGVkdF9pMmNfY2hpcF9kYXRhIGVkdF9mdDYyMzZfZGF0YSA9IHsKKwkubWF4X3N1cHBvcnRfcG9pbnRzID0gMiwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBlZHRfZnQ1eDA2X3RzX2lkW10gPSB7CiAJeyAubmFtZSA9ICJlZHQtZnQ1eDA2IiwgLmRyaXZlcl9kYXRhID0gKGxvbmcpJmVkdF9mdDV4MDZfZGF0YSB9LAogCXsgLm5hbWUgPSAiZWR0LWZ0NTUwNiIsIC5kcml2ZXJfZGF0YSA9IChsb25nKSZlZHRfZnQ1NTA2X2RhdGEgfSwKKwkvKiBOb3RlIG5vIGVkdC0gcHJlZml4IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGZ0NjIzNi5jIGRyaXZlciAqLworCXsgLm5hbWUgPSAiZnQ2MjM2IiwgLmRyaXZlcl9kYXRhID0gKGxvbmcpJmVkdF9mdDYyMzZfZGF0YSB9LAogCXsgLyogc2VudGluZWwgKi8gfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBlZHRfZnQ1eDA2X3RzX2lkKTsKQEAgLTEwNzYsNiArMTA4Miw4IEBACiAJeyAuY29tcGF0aWJsZSA9ICJlZHQsZWR0LWZ0NTMwNiIsIC5kYXRhID0gJmVkdF9mdDV4MDZfZGF0YSB9LAogCXsgLmNvbXBhdGlibGUgPSAiZWR0LGVkdC1mdDU0MDYiLCAuZGF0YSA9ICZlZHRfZnQ1eDA2X2RhdGEgfSwKIAl7IC5jb21wYXRpYmxlID0gImVkdCxlZHQtZnQ1NTA2IiwgLmRhdGEgPSAmZWR0X2Z0NTUwNl9kYXRhIH0sCisJLyogTm90ZSBmb2NhbHRlY2ggdmVuZG9yIHByZWZpeCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGZ0NjIzNi5jICovCisJeyAuY29tcGF0aWJsZSA9ICJmb2NhbHRlY2gsZnQ2MjM2IiwgLmRhdGEgPSAmZWR0X2Z0NjIzNl9kYXRhIH0sCiAJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZWR0X2Z0NXgwNl9vZl9tYXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2VrdGYyMTI3LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2VrdGYyMTI3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkMzRmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZWt0ZjIxMjcuYwpAQCAtMCwwICsxLDMzNiBAQAorLyoKKyAqIERyaXZlciBmb3IgRUxBTiBlS1RGMjEyNyBpMmMgdG91Y2hzY3JlZW4gY29udHJvbGxlcgorICoKKyAqIEZvciB0aGlzIGRyaXZlciB0aGUgbGF5b3V0IG9mIHRoZSBDaGlwb25lIGljbjgzMTggaTJjCisgKiB0b3VjaHNjcmVlbmNvbnRyb2xsZXIgaXMgdXNlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcjoKKyAqIE1pY2hlbCBWZXJsYWFuIDxtaWNoZWwudmVybEBnbWFpbC5jb20+CisgKiBTaWVicmVuIFZyb2VnaW5kZXdlaWogPHNpZWJyZW4udnJvZWdpbmRld2VpakBob3RtYWlsLmNvbT4KKyAqCisgKiBPcmlnaW5hbCBjaGlwb25lX2ljbjgzMTggZHJpdmVyOgorICogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQvbXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC90b3VjaHNjcmVlbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworLyogUGFja2V0IGhlYWRlciBkZWZpbmVzIChmaXJzdCBieXRlIG9mIGRhdGEgc2VuZCAvIHJlY2VpdmVkKSAqLworI2RlZmluZSBFS1RGMjEyN19OT0lTRQkJCTB4NDAKKyNkZWZpbmUgRUtURjIxMjdfUkVTUE9OU0UJCTB4NTIKKyNkZWZpbmUgRUtURjIxMjdfUkVRVUVTVAkJMHg1MworI2RlZmluZSBFS1RGMjEyN19IRUxMTwkJCTB4NTUKKyNkZWZpbmUgRUtURjIxMjdfUkVQT1JUCQkJMHg1ZAorI2RlZmluZSBFS1RGMjEyN19DQUxJQl9ET05FCQkweDY2CisKKy8qIFJlZ2lzdGVyIGRlZmluZXMgKHNlY29uZCBieXRlIG9mIGRhdGEgc2VuZCAvIHJlY2VpdmVkKSAqLworI2RlZmluZSBFS1RGMjEyN19FTlZfTk9JU1kJCTB4NDEKKyNkZWZpbmUgRUtURjIxMjdfSEVJR0hUCQkJMHg2MAorI2RlZmluZSBFS1RGMjEyN19XSURUSAkJCTB4NjMKKworLyogMiBieXRlcyBoZWFkZXIgKyA1ICogMyBieXRlcyBjb29yZGluYXRlcyArIDMgYnl0ZXMgcHJlc3N1cmUgaW5mbyArIGZvb3RlciAqLworI2RlZmluZSBFS1RGMjEyN19UT1VDSF9SRVBPUlRfU0laRQkyMQorI2RlZmluZSBFS1RGMjEyN19NQVhfVE9VQ0hFUwkJNQorCitzdHJ1Y3QgZWt0ZjIxMjdfdHMgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJc3RydWN0IGdwaW9fZGVzYyAqcG93ZXJfZ3Bpb3M7CisJc3RydWN0IHRvdWNoc2NyZWVuX3Byb3BlcnRpZXMgcHJvcDsKK307CisKK3N0YXRpYyB2b2lkIGVrdGYyMTI3X3BhcnNlX2Nvb3JkaW5hdGVzKGNvbnN0IHU4KiBidWYsIHVuc2lnbmVkIGludCB0b3VjaF9jb3VudCwKKwkJCQkgICAgICAgc3RydWN0IGlucHV0X210X3BvcyAqdG91Y2hlcykKK3sKKwlpbnQgaW5kZXggPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHRvdWNoX2NvdW50OyBpKyspIHsKKwkJaW5kZXggPSAyICsgaSAqIDM7CisKKwkJdG91Y2hlc1tpXS54ID0gKGJ1ZltpbmRleF0gJiAweDBmKTsKKwkJdG91Y2hlc1tpXS54IDw8PSA4OworCQl0b3VjaGVzW2ldLnggfD0gYnVmW2luZGV4ICsgMl07CisKKwkJdG91Y2hlc1tpXS55ID0gKGJ1ZltpbmRleF0gJiAweGYwKTsKKwkJdG91Y2hlc1tpXS55IDw8PSA0OworCQl0b3VjaGVzW2ldLnkgfD0gYnVmW2luZGV4ICsgMV07CisJfQorfQorCitzdGF0aWMgdm9pZCBla3RmMjEyN19yZXBvcnRfZXZlbnQoc3RydWN0IGVrdGYyMTI3X3RzICp0cywgY29uc3QgdTggKmJ1ZikKK3sKKwlzdHJ1Y3QgaW5wdXRfbXRfcG9zIHRvdWNoZXNbRUtURjIxMjdfTUFYX1RPVUNIRVNdOworCWludCBzbG90c1tFS1RGMjEyN19NQVhfVE9VQ0hFU107CisJdW5zaWduZWQgaW50IHRvdWNoX2NvdW50LCBpOworCisJdG91Y2hfY291bnQgPSBidWZbMV0gJiAweDA3OworCWlmICh0b3VjaF9jb3VudCA+IEVLVEYyMTI3X01BWF9UT1VDSEVTKSB7CisJCWRldl9lcnIoJnRzLT5jbGllbnQtPmRldiwKKwkJCSJUb28gbWFueSB0b3VjaGVzICVkID4gJWRcbiIsCisJCQl0b3VjaF9jb3VudCwgRUtURjIxMjdfTUFYX1RPVUNIRVMpOworCQl0b3VjaF9jb3VudCA9IEVLVEYyMTI3X01BWF9UT1VDSEVTOworCX0KKworCWVrdGYyMTI3X3BhcnNlX2Nvb3JkaW5hdGVzKGJ1ZiwgdG91Y2hfY291bnQsIHRvdWNoZXMpOworCWlucHV0X210X2Fzc2lnbl9zbG90cyh0cy0+aW5wdXQsIHNsb3RzLCB0b3VjaGVzLAorCQkJICAgICAgdG91Y2hfY291bnQsIDApOworCisJZm9yIChpID0gMDsgaSA8IHRvdWNoX2NvdW50OyBpKyspIHsKKwkJaW5wdXRfbXRfc2xvdCh0cy0+aW5wdXQsIHNsb3RzW2ldKTsKKwkJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUodHMtPmlucHV0LCBNVF9UT09MX0ZJTkdFUiwgdHJ1ZSk7CisJCXRvdWNoc2NyZWVuX3JlcG9ydF9wb3ModHMtPmlucHV0LCAmdHMtPnByb3AsCisJCQkJICAgICAgIHRvdWNoZXNbaV0ueCwgdG91Y2hlc1tpXS55LCB0cnVlKTsKKwl9CisKKwlpbnB1dF9tdF9zeW5jX2ZyYW1lKHRzLT5pbnB1dCk7CisJaW5wdXRfc3luYyh0cy0+aW5wdXQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZWt0ZjIxMjdfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZWt0ZjIxMjdfdHMgKnRzID0gZGV2X2lkOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ0cy0+Y2xpZW50LT5kZXY7CisJY2hhciBidWZbRUtURjIxMjdfVE9VQ0hfUkVQT1JUX1NJWkVdOworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YodHMtPmNsaWVudCwgYnVmLCBFS1RGMjEyN19UT1VDSF9SRVBPUlRfU0laRSk7CisJaWYgKHJldCAhPSBFS1RGMjEyN19UT1VDSF9SRVBPUlRfU0laRSkgeworCQlkZXZfZXJyKGRldiwgIkVycm9yIHJlYWRpbmcgdG91Y2ggZGF0YTogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoYnVmWzBdKSB7CisJY2FzZSBFS1RGMjEyN19SRVBPUlQ6CisJCWVrdGYyMTI3X3JlcG9ydF9ldmVudCh0cywgYnVmKTsKKwkJYnJlYWs7CisKKwljYXNlIEVLVEYyMTI3X05PSVNFOgorCQlpZiAoYnVmWzFdID09IEVLVEYyMTI3X0VOVl9OT0lTWSkKKwkJCWRldl9kYmcoZGV2LCAiRW52aXJvbm1lbnQgaXMgZWxlY3RyaWNhbGx5IG5vaXN5XG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIEVLVEYyMTI3X0hFTExPOgorCWNhc2UgRUtURjIxMjdfQ0FMSUJfRE9ORToKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIlVuZXhwZWN0ZWQgcGFja2V0IGhlYWRlciBieXRlICUjMDJ4XG4iLCBidWZbMF0pOworCQlicmVhazsKKwl9CisKK291dDoKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZWt0ZjIxMjdfc3RhcnQoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCBla3RmMjEyN190cyAqdHMgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJZW5hYmxlX2lycSh0cy0+Y2xpZW50LT5pcnEpOworCWdwaW9kX3NldF92YWx1ZV9jYW5zbGVlcCh0cy0+cG93ZXJfZ3Bpb3MsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVrdGYyMTI3X3N0b3Aoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCBla3RmMjEyN190cyAqdHMgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJZGlzYWJsZV9pcnEodHMtPmNsaWVudC0+aXJxKTsKKwlncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAodHMtPnBvd2VyX2dwaW9zLCAwKTsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBla3RmMjEyN19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZWt0ZjIxMjdfdHMgKnRzID0gaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSk7CisKKwltdXRleF9sb2NrKCZ0cy0+aW5wdXQtPm11dGV4KTsKKwlpZiAodHMtPmlucHV0LT51c2VycykKKwkJZWt0ZjIxMjdfc3RvcCh0cy0+aW5wdXQpOworCW11dGV4X3VubG9jaygmdHMtPmlucHV0LT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBla3RmMjEyN19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBla3RmMjEyN190cyAqdHMgPSBpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKTsKKworCW11dGV4X2xvY2soJnRzLT5pbnB1dC0+bXV0ZXgpOworCWlmICh0cy0+aW5wdXQtPnVzZXJzKQorCQlla3RmMjEyN19zdGFydCh0cy0+aW5wdXQpOworCW11dGV4X3VubG9jaygmdHMtPmlucHV0LT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGVrdGYyMTI3X3BtX29wcywgZWt0ZjIxMjdfc3VzcGVuZCwKKwkJCSBla3RmMjEyN19yZXN1bWUpOworCitzdGF0aWMgaW50IGVrdGYyMTI3X3F1ZXJ5X2RpbWVuc2lvbihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBib29sIHdpZHRoKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwljb25zdCBjaGFyICp3aGF0ID0gd2lkdGggPyAid2lkdGgiIDogImhlaWdodCI7CisJdTggd2hhdF9jb2RlID0gd2lkdGggPyBFS1RGMjEyN19XSURUSCA6IEVLVEYyMTI3X0hFSUdIVDsKKwl1OCBidWZbNF07CisJaW50IHJldDsKKwlpbnQgZXJyb3I7CisKKwkvKiBSZXF1ZXN0IGRpbWVuc2lvbiAqLworCWJ1ZlswXSA9IEVLVEYyMTI3X1JFUVVFU1Q7CisJYnVmWzFdID0gd2lkdGggPyBFS1RGMjEyN19XSURUSCA6IEVLVEYyMTI3X0hFSUdIVDsKKwlidWZbMl0gPSAweDAwOworCWJ1ZlszXSA9IDB4MDA7CisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCBzaXplb2YoYnVmKSk7CisJaWYgKHJldCAhPSBzaXplb2YoYnVmKSkgeworCQllcnJvciA9IHJldCA8IDAgPyByZXQgOiAtRUlPOworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXF1ZXN0ICVzOiAlZFxuIiwgd2hhdCwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJbXNsZWVwKDIwKTsKKworCS8qIFJlYWQgcmVzcG9uc2UgKi8KKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAocmV0ICE9IHNpemVvZihidWYpKSB7CisJCWVycm9yID0gcmV0IDwgMCA/IHJldCA6IC1FSU87CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlY2VpdmUgJXMgZGF0YTogJWRcbiIsIHdoYXQsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWlmIChidWZbMF0gIT0gRUtURjIxMjdfUkVTUE9OU0UgfHwgYnVmWzFdICE9IHdoYXRfY29kZSkgeworCQlkZXZfZXJyKGRldiwgIlVuZXhwZWN0ZWQgJXMgZGF0YTogJSMwMnggJSMwMnhcbiIsCisJCQl3aGF0LCBidWZbMF0sIGJ1ZlsxXSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAoKChidWZbM10gJiAweGYwKSA8PCA0KSB8IGJ1ZlsyXSkgLSAxOworfQorCitzdGF0aWMgaW50IGVrdGYyMTI3X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJc3RydWN0IGVrdGYyMTI3X3RzICp0czsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKwl1OCBidWZbNF07CisJaW50IG1heF94LCBtYXhfeTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIWNsaWVudC0+aXJxKSB7CisJCWRldl9lcnIoZGV2LCAiRXJyb3Igbm8gaXJxIHNwZWNpZmllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCp0cyksIEdGUF9LRVJORUwpOworCWlmICghdHMpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogVGhpcyByZXF1ZXN0cyB0aGUgZ3BpbyAqYW5kKiB0dXJucyBvbiB0aGUgdG91Y2hzY3JlZW4gY29udHJvbGxlciAqLworCXRzLT5wb3dlcl9ncGlvcyA9IGRldm1fZ3Bpb2RfZ2V0KGRldiwgInBvd2VyIiwgR1BJT0RfT1VUX0hJR0gpOworCWlmIChJU19FUlIodHMtPnBvd2VyX2dwaW9zKSkgeworCQllcnJvciA9IFBUUl9FUlIodHMtPnBvd2VyX2dwaW9zKTsKKwkJaWYgKGVycm9yICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKGRldiwgIkVycm9yIGdldHRpbmcgcG93ZXIgZ3BpbzogJWRcbiIsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWlucHV0ID0gZGV2bV9pbnB1dF9hbGxvY2F0ZV9kZXZpY2UoZGV2KTsKKwlpZiAoIWlucHV0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlucHV0LT5uYW1lID0gY2xpZW50LT5uYW1lOworCWlucHV0LT5pZC5idXN0eXBlID0gQlVTX0kyQzsKKwlpbnB1dC0+b3BlbiA9IGVrdGYyMTI3X3N0YXJ0OworCWlucHV0LT5jbG9zZSA9IGVrdGYyMTI3X3N0b3A7CisKKwl0cy0+Y2xpZW50ID0gY2xpZW50OworCisJLyogUmVhZCBoZWxsbyAoaWdub3JlIHJlc3VsdCwgZGVwZW5kcyBvbiBpbml0aWFsIHBvd2VyIHN0YXRlKSAqLworCW1zbGVlcCgyMCk7CisJaTJjX21hc3Rlcl9yZWN2KHRzLT5jbGllbnQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisJLyogUmVhZCByZXNvbHV0aW9uIGZyb20gY2hpcCAqLworCW1heF94ID0gZWt0ZjIxMjdfcXVlcnlfZGltZW5zaW9uKGNsaWVudCwgdHJ1ZSk7CisJaWYgKG1heF94IDwgMCkKKwkJcmV0dXJuIG1heF94OworCisJbWF4X3kgPSBla3RmMjEyN19xdWVyeV9kaW1lbnNpb24oY2xpZW50LCBmYWxzZSk7CisJaWYgKG1heF95IDwgMCkKKwkJcmV0dXJuIG1heF95OworCisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19NVF9QT1NJVElPTl9YLCAwLCBtYXhfeCwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19NVF9QT1NJVElPTl9ZLCAwLCBtYXhfeSwgMCwgMCk7CisJdG91Y2hzY3JlZW5fcGFyc2VfcHJvcGVydGllcyhpbnB1dCwgdHJ1ZSwgJnRzLT5wcm9wKTsKKworCWVycm9yID0gaW5wdXRfbXRfaW5pdF9zbG90cyhpbnB1dCwgRUtURjIxMjdfTUFYX1RPVUNIRVMsCisJCQkJICAgIElOUFVUX01UX0RJUkVDVCB8CisJCQkJCUlOUFVUX01UX0RST1BfVU5VU0VEIHwKKwkJCQkJSU5QVVRfTVRfVFJBQ0spOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJdHMtPmlucHV0ID0gaW5wdXQ7CisJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXQsIHRzKTsKKworCWVycm9yID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIGNsaWVudC0+aXJxLAorCQkJCQkgIE5VTEwsIGVrdGYyMTI3X2lycSwKKwkJCQkJICBJUlFGX09ORVNIT1QsIGNsaWVudC0+bmFtZSwgdHMpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKGRldiwgIkVycm9yIHJlcXVlc3RpbmcgaXJxOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogU3RvcCBkZXZpY2UgdGlsbCBvcGVuZWQgKi8KKwlla3RmMjEyN19zdG9wKHRzLT5pbnB1dCk7CisKKwllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCB0cyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZWt0ZjIxMjdfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImVsYW4sZWt0ZjIxMjciIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBla3RmMjEyN19vZl9tYXRjaCk7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGVrdGYyMTI3X2kyY19pZFtdID0geworCXsgImVrdGYyMTI3IiwgMCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGVrdGYyMTI3X2kyY19pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBla3RmMjEyN19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiZWxhbl9la3RmMjEyNyIsCisJCS5wbQk9ICZla3RmMjEyN19wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihla3RmMjEyN19vZl9tYXRjaCksCisJfSwKKwkucHJvYmUgPSBla3RmMjEyN19wcm9iZSwKKwkuaWRfdGFibGUgPSBla3RmMjEyN19pMmNfaWQsCit9OworbW9kdWxlX2kyY19kcml2ZXIoZWt0ZjIxMjdfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJFTEFOIGVLVEYyMTI3IEkyQyBUb3VjaHNjcmVlbiBEcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk1pY2hlbCBWZXJsYWFuLCBTaWVicmVuIFZyb2VnaW5kZXdlaWoiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZWxhbnRzX2kyYy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lbGFudHNfaTJjLmMKaW5kZXggYWMwOTg1NS4uMDJhZWMyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lbGFudHNfaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lbGFudHNfaTJjLmMKQEAgLTI5OCw3ICsyOTgsNyBAQAogCXJldHVybiBnZXRfdW5hbGlnbmVkX2JlMzIoYnVmKSA+PiA0OwogfQogCi1zdGF0aWMgaW50IGVsYW50c19pMmNfcXVlcnlfZndfaWQoc3RydWN0IGVsYW50c19kYXRhICp0cykKK3N0YXRpYyBpbnQgZWxhbnRzX2kyY19xdWVyeV9od192ZXJzaW9uKHN0cnVjdCBlbGFudHNfZGF0YSAqdHMpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRzLT5jbGllbnQ7CiAJaW50IGVycm9yLCByZXRyeV9jbnQ7CkBAIC0zMTgsOCArMzE4LDEzIEBACiAJCQllcnJvciwgKGludClzaXplb2YocmVzcCksIHJlc3ApOwogCX0KIAotCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkiRmFpbGVkIHRvIHJlYWQgZncgaWQgb3IgZncgaWQgaXMgaW52YWxpZFxuIik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIkZhaWxlZCB0byByZWFkIGZ3IGlkOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZGV2X2VycigmY2xpZW50LT5kZXYsICJJbnZhbGlkIGZ3IGlkOiAlIzA0eFxuIiwgdHMtPmh3X3ZlcnNpb24pOwogCiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC01MDgsNyArNTEzLDcgQEAKIHN0YXRpYyBpbnQgZWxhbnRzX2kyY19pbml0aWFsaXplKHN0cnVjdCBlbGFudHNfZGF0YSAqdHMpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRzLT5jbGllbnQ7Ci0JaW50IGVycm9yLCByZXRyeV9jbnQ7CisJaW50IGVycm9yLCBlcnJvcjIsIHJldHJ5X2NudDsKIAljb25zdCB1OCBoZWxsb19wYWNrZXRbXSA9IHsgMHg1NSwgMHg1NSwgMHg1NSwgMHg1NSB9OwogCWNvbnN0IHU4IHJlY292X3BhY2tldFtdID0geyAweDU1LCAweDU1LCAweDgwLCAweDgwIH07CiAJdTggYnVmW0hFQURFUl9TSVpFXTsKQEAgLTU1MywxOCArNTU4LDIyIEBACiAJCX0KIAl9CiAKKwkvKiBodyB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBldmVuIGlmIGRldmljZSBpbiByZWNvdmVyeSBzdGF0ZSAqLworCWVycm9yMiA9IGVsYW50c19pMmNfcXVlcnlfaHdfdmVyc2lvbih0cyk7CiAJaWYgKCFlcnJvcikKLQkJZXJyb3IgPSBlbGFudHNfaTJjX3F1ZXJ5X2Z3X2lkKHRzKTsKKwkJZXJyb3IgPSBlcnJvcjI7CisKIAlpZiAoIWVycm9yKQogCQllcnJvciA9IGVsYW50c19pMmNfcXVlcnlfZndfdmVyc2lvbih0cyk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBlbGFudHNfaTJjX3F1ZXJ5X3Rlc3RfdmVyc2lvbih0cyk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBlbGFudHNfaTJjX3F1ZXJ5X2JjX3ZlcnNpb24odHMpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gZWxhbnRzX2kyY19xdWVyeV90c19pbmZvKHRzKTsKIAotCWlmIChlcnJvcikgeworCWlmIChlcnJvcikKIAkJdHMtPmlhcF9tb2RlID0gRUxBTl9JQVBfUkVDT1ZFUlk7Ci0JfSBlbHNlIHsKLQkJZWxhbnRzX2kyY19xdWVyeV90ZXN0X3ZlcnNpb24odHMpOwotCQllbGFudHNfaTJjX3F1ZXJ5X2JjX3ZlcnNpb24odHMpOwotCQllbGFudHNfaTJjX3F1ZXJ5X3RzX2luZm8odHMpOwotCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9mdDYyMzYuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZnQ2MjM2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNDBkMmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9mdDYyMzYuYworKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKgotICogRm9jYWxUZWNoIEZUNjIzNiBUb3VjaFNjcmVlbiBkcml2ZXIuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEwICBGb2NhbCB0ZWNoIEx0ZC4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAotICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0L210Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvcGVydHkuaD4KLQotI2RlZmluZSBGVDYyMzZfTUFYX1RPVUNIX1BPSU5UUwkJMgotCi0jZGVmaW5lIEZUNjIzNl9SRUdfVEhfR1JPVVAJCTB4ODAKLSNkZWZpbmUgRlQ2MjM2X1JFR19QRVJJT0RBQ1RJVkUJCTB4ODgKLSNkZWZpbmUgRlQ2MjM2X1JFR19MSUJfVkVSX0gJCTB4YTEKLSNkZWZpbmUgRlQ2MjM2X1JFR19MSUJfVkVSX0wJCTB4YTIKLSNkZWZpbmUgRlQ2MjM2X1JFR19DSVBIRVIJCTB4YTMKLSNkZWZpbmUgRlQ2MjM2X1JFR19GSVJNSUQJCTB4YTYKLSNkZWZpbmUgRlQ2MjM2X1JFR19GT0NBTFRFQ0hfSUQJCTB4YTgKLSNkZWZpbmUgRlQ2MjM2X1JFR19SRUxFQVNFX0NPREVfSUQJMHhhZgotCi0jZGVmaW5lIEZUNjIzNl9FVkVOVF9QUkVTU19ET1dOCQkwCi0jZGVmaW5lIEZUNjIzNl9FVkVOVF9MSUZUX1VQCQkxCi0jZGVmaW5lIEZUNjIzNl9FVkVOVF9DT05UQUNUCQkyCi0jZGVmaW5lIEZUNjIzNl9FVkVOVF9OT19FVkVOVAkJMwotCi1zdHJ1Y3QgZnQ2MjM2X2RhdGEgewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7Ci0Jc3RydWN0IGdwaW9fZGVzYyAqcmVzZXRfZ3BpbzsKLQl1MzIgbWF4X3g7Ci0JdTMyIG1heF95OwotCWJvb2wgaW52ZXJ0X3g7Ci0JYm9vbCBpbnZlcnRfeTsKLQlib29sIHN3YXBfeHk7Ci19OwotCi0vKgotICogVGhpcyBzdHJ1Y3QgaXMgYSB0b3VjaHBvaW50IGFzIHN0b3JlZCBpbiBoYXJkd2FyZS4gIE5vdGUgdGhhdCB0aGUgaWQsCi0gKiBhcyB3ZWxsIGFzIHRoZSBldmVudCwgYXJlIHN0b3JlZCBpbiB0aGUgdXBwZXIgbnliYmxlIG9mIHRoZSBoaSBieXRlLgotICovCi1zdHJ1Y3QgZnQ2MjM2X3RvdWNocG9pbnQgewotCXVuaW9uIHsKLQkJdTggeGhpOwotCQl1OCBldmVudDsKLQl9OwotCXU4IHhsbzsKLQl1bmlvbiB7Ci0JCXU4IHloaTsKLQkJdTggaWQ7Ci0JfTsKLQl1OCB5bG87Ci0JdTggd2VpZ2h0OwotCXU4IG1pc2M7Ci19IF9fcGFja2VkOwotCi0vKiBUaGlzIHBhY2tldCByZXByZXNlbnRzIHRoZSByZWdpc3RlciBtYXAgYXMgcmVhZCBmcm9tIG9mZnNldCAwICovCi1zdHJ1Y3QgZnQ2MjM2X3BhY2tldCB7Ci0JdTggZGV2X21vZGU7Ci0JdTggZ2VzdF9pZDsKLQl1OCB0b3VjaGVzOwotCXN0cnVjdCBmdDYyMzZfdG91Y2hwb2ludCBwb2ludHNbRlQ2MjM2X01BWF9UT1VDSF9QT0lOVFNdOwotfSBfX3BhY2tlZDsKLQotc3RhdGljIGludCBmdDYyMzZfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4IGxlbiwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgZXJyb3I7Ci0KLQllcnJvciA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNsaWVudCwgcmVnLCBsZW4sIGRhdGEpOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQotCWlmIChlcnJvciAhPSBsZW4pCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBmdDYyMzZfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgZnQ2MjM2X2RhdGEgKmZ0NjIzNiA9IGRldl9pZDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnQ2MjM2LT5jbGllbnQtPmRldjsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IGZ0NjIzNi0+aW5wdXQ7Ci0Jc3RydWN0IGZ0NjIzNl9wYWNrZXQgYnVmOwotCXU4IHRvdWNoZXM7Ci0JaW50IGksIGVycm9yOwotCi0JZXJyb3IgPSBmdDYyMzZfcmVhZChmdDYyMzYtPmNsaWVudCwgMCwgc2l6ZW9mKGJ1ZiksICZidWYpOwotCWlmIChlcnJvcikgewotCQlkZXZfZXJyKGRldiwgInJlYWQgdG91Y2hkYXRhIGZhaWxlZCAlZFxuIiwgZXJyb3IpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JdG91Y2hlcyA9IGJ1Zi50b3VjaGVzICYgMHhmOwotCWlmICh0b3VjaGVzID4gRlQ2MjM2X01BWF9UT1VDSF9QT0lOVFMpIHsKLQkJZGV2X2RiZyhkZXYsCi0JCQkiJWQgdG91Y2ggcG9pbnRzIHJlcG9ydGVkLCBvbmx5ICVkIGFyZSBzdXBwb3J0ZWRcbiIsCi0JCQl0b3VjaGVzLCBGVDYyMzZfTUFYX1RPVUNIX1BPSU5UUyk7Ci0JCXRvdWNoZXMgPSBGVDYyMzZfTUFYX1RPVUNIX1BPSU5UUzsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdG91Y2hlczsgaSsrKSB7Ci0JCXN0cnVjdCBmdDYyMzZfdG91Y2hwb2ludCAqcG9pbnQgPSAmYnVmLnBvaW50c1tpXTsKLQkJdTE2IHggPSAoKHBvaW50LT54aGkgJiAweGYpIDw8IDgpIHwgYnVmLnBvaW50c1tpXS54bG87Ci0JCXUxNiB5ID0gKChwb2ludC0+eWhpICYgMHhmKSA8PCA4KSB8IGJ1Zi5wb2ludHNbaV0ueWxvOwotCQl1OCBldmVudCA9IHBvaW50LT5ldmVudCA+PiA2OwotCQl1OCBpZCA9IHBvaW50LT5pZCA+PiA0OwotCQlib29sIGFjdCA9IChldmVudCA9PSBGVDYyMzZfRVZFTlRfUFJFU1NfRE9XTiB8fAotCQkJICAgIGV2ZW50ID09IEZUNjIzNl9FVkVOVF9DT05UQUNUKTsKLQotCQlpbnB1dF9tdF9zbG90KGlucHV0LCBpZCk7Ci0JCWlucHV0X210X3JlcG9ydF9zbG90X3N0YXRlKGlucHV0LCBNVF9UT09MX0ZJTkdFUiwgYWN0KTsKLQkJaWYgKCFhY3QpCi0JCQljb250aW51ZTsKLQotCQlpZiAoZnQ2MjM2LT5pbnZlcnRfeCkKLQkJCXggPSBmdDYyMzYtPm1heF94IC0geDsKLQotCQlpZiAoZnQ2MjM2LT5pbnZlcnRfeSkKLQkJCXkgPSBmdDYyMzYtPm1heF95IC0geTsKLQotCQlpZiAoZnQ2MjM2LT5zd2FwX3h5KSB7Ci0JCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfTVRfUE9TSVRJT05fWCwgeSk7Ci0JCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfTVRfUE9TSVRJT05fWSwgeCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfTVRfUE9TSVRJT05fWCwgeCk7Ci0JCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfTVRfUE9TSVRJT05fWSwgeSk7Ci0JCX0KLQl9Ci0KLQlpbnB1dF9tdF9zeW5jX2ZyYW1lKGlucHV0KTsKLQlpbnB1dF9zeW5jKGlucHV0KTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHU4IGZ0NjIzNl9kZWJ1Z19yZWFkX2J5dGUoc3RydWN0IGZ0NjIzNl9kYXRhICpmdDYyMzYsIHU4IHJlZykKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZnQ2MjM2LT5jbGllbnQ7Ci0JdTggdmFsID0gMDsKLQlpbnQgZXJyb3I7Ci0KLQllcnJvciA9IGZ0NjIzNl9yZWFkKGNsaWVudCwgcmVnLCAxLCAmdmFsKTsKLQlpZiAoZXJyb3IpCi0JCWRldl9kYmcoJmNsaWVudC0+ZGV2LAotCQkJImVycm9yIHJlYWRpbmcgcmVnaXN0ZXIgMHglMDJ4OiAlZFxuIiwgcmVnLCBlcnJvcik7Ci0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdm9pZCBmdDYyMzZfZGVidWdfaW5mbyhzdHJ1Y3QgZnQ2MjM2X2RhdGEgKmZ0NjIzNikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZnQ2MjM2LT5jbGllbnQtPmRldjsKLQotCWRldl9kYmcoZGV2LCAiVG91Y2ggdGhyZXNob2xkIGlzICVkXG4iLAotCQlmdDYyMzZfZGVidWdfcmVhZF9ieXRlKGZ0NjIzNiwgRlQ2MjM2X1JFR19USF9HUk9VUCkgKiA0KTsKLQlkZXZfZGJnKGRldiwgIlJlcG9ydCByYXRlIGlzICVkSHpcbiIsCi0JCWZ0NjIzNl9kZWJ1Z19yZWFkX2J5dGUoZnQ2MjM2LCBGVDYyMzZfUkVHX1BFUklPREFDVElWRSkgKiAxMCk7Ci0JZGV2X2RiZyhkZXYsICJGaXJtd2FyZSBsaWJyYXJ5IHZlcnNpb24gMHglMDJ4JTAyeFxuIiwKLQkJZnQ2MjM2X2RlYnVnX3JlYWRfYnl0ZShmdDYyMzYsIEZUNjIzNl9SRUdfTElCX1ZFUl9IKSwKLQkJZnQ2MjM2X2RlYnVnX3JlYWRfYnl0ZShmdDYyMzYsIEZUNjIzNl9SRUdfTElCX1ZFUl9MKSk7Ci0JZGV2X2RiZyhkZXYsICJGaXJtd2FyZSB2ZXJzaW9uIDB4JTAyeFxuIiwKLQkJZnQ2MjM2X2RlYnVnX3JlYWRfYnl0ZShmdDYyMzYsIEZUNjIzNl9SRUdfRklSTUlEKSk7Ci0JZGV2X2RiZyhkZXYsICJDaGlwIHZlbmRvciBJRCAweCUwMnhcbiIsCi0JCWZ0NjIzNl9kZWJ1Z19yZWFkX2J5dGUoZnQ2MjM2LCBGVDYyMzZfUkVHX0NJUEhFUikpOwotCWRldl9kYmcoZGV2LCAiQ1RQTSB2ZW5kb3IgSUQgMHglMDJ4XG4iLAotCQlmdDYyMzZfZGVidWdfcmVhZF9ieXRlKGZ0NjIzNiwgRlQ2MjM2X1JFR19GT0NBTFRFQ0hfSUQpKTsKLQlkZXZfZGJnKGRldiwgIlJlbGVhc2UgY29kZSB2ZXJzaW9uIDB4JTAyeFxuIiwKLQkJZnQ2MjM2X2RlYnVnX3JlYWRfYnl0ZShmdDYyMzYsIEZUNjIzNl9SRUdfUkVMRUFTRV9DT0RFX0lEKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZ0NjIzNl9yZXNldChzdHJ1Y3QgZnQ2MjM2X2RhdGEgKmZ0NjIzNikKLXsKLQlpZiAoIWZ0NjIzNi0+cmVzZXRfZ3BpbykKLQkJcmV0dXJuOwotCi0JZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKGZ0NjIzNi0+cmVzZXRfZ3BpbywgMSk7Ci0JdXNsZWVwX3JhbmdlKDUwMDAsIDIwMDAwKTsKLQlncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAoZnQ2MjM2LT5yZXNldF9ncGlvLCAwKTsKLQltc2xlZXAoMzAwKTsKLX0KLQotc3RhdGljIGludCBmdDYyMzZfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7Ci0Jc3RydWN0IGZ0NjIzNl9kYXRhICpmdDYyMzY7Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7Ci0JdTMyIGZ1enpfeCA9IDAsIGZ1enpfeSA9IDA7Ci0JdTggdmFsOwotCWludCBlcnJvcjsKLQotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQotCQlyZXR1cm4gLUVOWElPOwotCi0JaWYgKCFjbGllbnQtPmlycSkgewotCQlkZXZfZXJyKGRldiwgImlycSBpcyBtaXNzaW5nXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZnQ2MjM2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpmdDYyMzYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWZ0NjIzNikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmdDYyMzYtPmNsaWVudCA9IGNsaWVudDsKLQlmdDYyMzYtPnJlc2V0X2dwaW8gPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChkZXYsICJyZXNldCIsCi0JCQkJCQkgICAgIEdQSU9EX09VVF9MT1cpOwotCWlmIChJU19FUlIoZnQ2MjM2LT5yZXNldF9ncGlvKSkgewotCQllcnJvciA9IFBUUl9FUlIoZnQ2MjM2LT5yZXNldF9ncGlvKTsKLQkJaWYgKGVycm9yICE9IC1FUFJPQkVfREVGRVIpCi0JCQlkZXZfZXJyKGRldiwgImVycm9yIGdldHRpbmcgcmVzZXQgZ3BpbzogJWRcbiIsIGVycm9yKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCWZ0NjIzNl9yZXNldChmdDYyMzYpOwotCi0JLyogdmVyaWZ5IHRoYXQgdGhlIGNvbnRyb2xsZXIgaXMgcHJlc2VudCAqLwotCWVycm9yID0gZnQ2MjM2X3JlYWQoY2xpZW50LCAweDAwLCAxLCAmdmFsKTsKLQlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVhZCBmcm9tIGNvbnRyb2xsZXI6ICVkXG4iLCBlcnJvcik7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlmdDYyMzZfZGVidWdfaW5mbyhmdDYyMzYpOwotCi0JaW5wdXQgPSBkZXZtX2lucHV0X2FsbG9jYXRlX2RldmljZShkZXYpOwotCWlmICghaW5wdXQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZnQ2MjM2LT5pbnB1dCA9IGlucHV0OwotCWlucHV0LT5uYW1lID0gY2xpZW50LT5uYW1lOwotCWlucHV0LT5pZC5idXN0eXBlID0gQlVTX0kyQzsKLQotCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAidG91Y2hzY3JlZW4tc2l6ZS14IiwKLQkJCQkgICAgICZmdDYyMzYtPm1heF94KSB8fAotCSAgICBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAidG91Y2hzY3JlZW4tc2l6ZS15IiwKLQkJCQkgICAgICZmdDYyMzYtPm1heF95KSkgewotCQlkZXZfZXJyKGRldiwgInRvdWNoc2NyZWVuLXNpemUteCBhbmQvb3IgLXkgbWlzc2luZ1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJ0b3VjaHNjcmVlbi1mdXp6LXgiLCAmZnV6el94KTsKLQlkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAidG91Y2hzY3JlZW4tZnV6ei15IiwgJmZ1enpfeSk7Ci0JZnQ2MjM2LT5pbnZlcnRfeCA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LAotCQkJCQkJICAgICAidG91Y2hzY3JlZW4taW52ZXJ0ZWQteCIpOwotCWZ0NjIzNi0+aW52ZXJ0X3kgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwKLQkJCQkJCSAgICAgInRvdWNoc2NyZWVuLWludmVydGVkLXkiKTsKLQlmdDYyMzYtPnN3YXBfeHkgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwKLQkJCQkJCSAgICAidG91Y2hzY3JlZW4tc3dhcHBlZC14LXkiKTsKLQotCWlmIChmdDYyMzYtPnN3YXBfeHkpIHsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19NVF9QT1NJVElPTl9YLCAwLAotCQkJCSAgICAgZnQ2MjM2LT5tYXhfeSwgZnV6el95LCAwKTsKLQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19NVF9QT1NJVElPTl9ZLCAwLAotCQkJCSAgICAgZnQ2MjM2LT5tYXhfeCwgZnV6el94LCAwKTsKLQl9IGVsc2UgewotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX01UX1BPU0lUSU9OX1gsIDAsCi0JCQkJICAgICBmdDYyMzYtPm1heF94LCBmdXp6X3gsIDApOwotCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX01UX1BPU0lUSU9OX1ksIDAsCi0JCQkJICAgICBmdDYyMzYtPm1heF95LCBmdXp6X3ksIDApOwotCX0KLQotCWVycm9yID0gaW5wdXRfbXRfaW5pdF9zbG90cyhpbnB1dCwgRlQ2MjM2X01BWF9UT1VDSF9QT0lOVFMsCi0JCQkJICAgIElOUFVUX01UX0RJUkVDVCB8IElOUFVUX01UX0RST1BfVU5VU0VEKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQotCWVycm9yID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIGNsaWVudC0+aXJxLCBOVUxMLAotCQkJCQkgIGZ0NjIzNl9pbnRlcnJ1cHQsIElSUUZfT05FU0hPVCwKLQkJCQkJICBjbGllbnQtPm5hbWUsIGZ0NjIzNik7Ci0JaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoZGV2LCAicmVxdWVzdCBpcnEgJWQgZmFpbGVkOiAlZFxuIiwgY2xpZW50LT5pcnEsIGVycm9yKTsKLQkJcmV0dXJuIGVycm9yOwotCX0KLQotCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0KTsKLQlpZiAoZXJyb3IpIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlOiAlZFxuIiwgZXJyb3IpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZ0NjIzNl9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiZm9jYWx0ZWNoLGZ0NjIzNiIsIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZnQ2MjM2X29mX21hdGNoKTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgZnQ2MjM2X2lkW10gPSB7Ci0JeyAiZnQ2MjM2IiwgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgZnQ2MjM2X2lkKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGZ0NjIzNl9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiZnQ2MjM2IiwKLQkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGZ0NjIzNl9vZl9tYXRjaCksCi0JfSwKLQkucHJvYmUgPSBmdDYyMzZfcHJvYmUsCi0JLmlkX3RhYmxlID0gZnQ2MjM2X2lkLAotfTsKLW1vZHVsZV9pMmNfZHJpdmVyKGZ0NjIzNl9kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJTZWFuIENyb3NzIDx4b2JzQGtvc2FnaS5jb20+Iik7Ci1NT0RVTEVfQVVUSE9SKCJOb3JhbGYgVHLDuG5uZXMgPG5vcmFsZkB0cm9ubmVzLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRm9jYWxUZWNoIEZUNjIzNiBUb3VjaFNjcmVlbiBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vam9ybmFkYTcyMF90cy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9qb3JuYWRhNzIwX3RzLmMKaW5kZXggZWEzYjZhNS4uNzI5YjNjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9qb3JuYWRhNzIwX3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9qb3JuYWRhNzIwX3RzLmMKQEAgLTEzLDYgKzEzLDcgQEAKICAqIEhQIEpvcm5hZGEgNzEwLzcyMC83MjkgVG91Y2hzY3JlZW4gRHJpdmVyCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMjAsOSArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvam9ybmFkYTcyMC5oPgotI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgogCiBNT0RVTEVfQVVUSE9SKCJLcmlzdG9mZmVyIEVyaWNzb24gPGtyaXN0b2ZmZXIuZXJpY3NvbkBnbWFpbC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkhQIEpvcm5hZGEgNzEwLzcyMC83MjggdG91Y2hzY3JlZW4gZHJpdmVyIik7CkBAIC0zMCw2ICsyOSw3IEBACiAKIHN0cnVjdCBqb3JuYWRhX3RzIHsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXY7CisJc3RydWN0IGdwaW9fZGVzYyAqZ3BpbzsKIAlpbnQgeF9kYXRhWzRdOwkJLyogWCBzYW1wbGUgdmFsdWVzICovCiAJaW50IHlfZGF0YVs0XTsJCS8qIFkgc2FtcGxlIHZhbHVlcyAqLwogfTsKQEAgLTcxLDggKzcxLDggQEAKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IGpvcm5hZGFfdHMtPmRldjsKIAlpbnQgeCwgeTsKIAotCS8qIElmIEdQSU9fR1BJTzkgaXMgc2V0IHRvIGhpZ2ggdGhlbiByZXBvcnQgcGVuIHVwICovCi0JaWYgKEdQTFIgJiBHUElPX0dQSU8oOSkpIHsKKwkvKiBJZiBncGlvIGlzIGhpZ2ggdGhlbiByZXBvcnQgcGVuIHVwICovCisJaWYgKGdwaW9kX2dldF92YWx1ZShqb3JuYWRhX3RzLT5ncGlvKSkgewogCQlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIDApOwogCQlpbnB1dF9zeW5jKGlucHV0KTsKIAl9IGVsc2UgewpAQCAtMTAxLDcgKzEwMSw3IEBACiB7CiAJc3RydWN0IGpvcm5hZGFfdHMgKmpvcm5hZGFfdHM7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwotCWludCBlcnJvcjsKKwlpbnQgZXJyb3IsIGlycTsKIAogCWpvcm5hZGFfdHMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpqb3JuYWRhX3RzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFqb3JuYWRhX3RzKQpAQCAtMTEzLDYgKzExMywxNCBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgam9ybmFkYV90cyk7CiAKKwlqb3JuYWRhX3RzLT5ncGlvID0gZGV2bV9ncGlvZF9nZXQoJnBkZXYtPmRldiwgInBlbnVwIiwgR1BJT0RfSU4pOworCWlmIChJU19FUlIoam9ybmFkYV90cy0+Z3BpbykpCisJCXJldHVybiBQVFJfRVJSKGpvcm5hZGFfdHMtPmdwaW8pOworCisJaXJxID0gZ3Bpb2RfdG9faXJxKGpvcm5hZGFfdHMtPmdwaW8pOworCWlmIChpcnEgPD0gMCkKKwkJcmV0dXJuIGlycSA8IDAgPyBpcnEgOiAtRUlOVkFMOworCiAJam9ybmFkYV90cy0+ZGV2ID0gaW5wdXRfZGV2OwogCiAJaW5wdXRfZGV2LT5uYW1lID0gIkhQIEpvcm5hZGEgN3h4IFRvdWNoc2NyZWVuIjsKQEAgLTEyNSw4ICsxMzMsNyBAQAogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsIDI3MCwgMzkwMCwgMCwgMCk7CiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMTgwLCAzNzAwLCAwLCAwKTsKIAotCWVycm9yID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBJUlFfR1BJTzksCi0JCQkJIGpvcm5hZGE3MjBfdHNfaW50ZXJydXB0LAorCWVycm9yID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsIGpvcm5hZGE3MjBfdHNfaW50ZXJydXB0LAogCQkJCSBJUlFGX1RSSUdHRVJfUklTSU5HLAogCQkJCSAiSFA3WFggVG91Y2hzY3JlZW4gZHJpdmVyIiwgcGRldik7CiAJaWYgKGVycm9yKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL21jMTM3ODNfdHMuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWMxMzc4M190cy5jCmluZGV4IDkxM2UyNWEuLmVmNjRmMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWMxMzc4M190cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vbWMxMzc4M190cy5jCkBAIC0zNyw3ICszNyw2IEBACiAJc3RydWN0IGlucHV0X2RldiAqaWRldjsKIAlzdHJ1Y3QgbWMxM3h4eCAqbWMxM3h4eDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxOwogCXVuc2lnbmVkIGludCBzYW1wbGVbNF07CiAJc3RydWN0IG1jMTN4eHhfdHNfcGxhdGZvcm1fZGF0YSAqdG91Y2g7CiB9OwpAQCAtNTQsNyArNTMsNyBAQAogCSAqIGJlIHJlc2NoZWR1bGVkIGZvciBpbW1lZGlhdGUgZXhlY3V0aW9uIGhlcmUuIEhvd2V2ZXIgdGhlIHJlYXJtCiAJICogZGVsYXkgaXMgSFogLyA1MCB3aGljaCBpcyBhY2NlcHRhYmxlLgogCSAqLwotCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcSwgJnByaXYtPndvcmssIDApOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcHJpdi0+d29yaywgMCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0xMDYsMTYgKzEwNSwxOCBAQAogCiAJCQlkZXZfZGJnKCZpZGV2LT5kZXYsICJyZXBvcnQgKCVkLCAlZCwgJWQpXG4iLAogCQkJCQl4MSwgeTEsIDB4MTAwMCAtIGNyMCk7Ci0JCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3EsICZwcml2LT53b3JrLCBIWiAvIDUwKTsKLQkJfSBlbHNlCisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnByaXYtPndvcmssIEhaIC8gNTApOworCQl9IGVsc2UgewogCQkJZGV2X2RiZygmaWRldi0+ZGV2LCAicmVwb3J0IHJlbGVhc2VcbiIpOworCQl9CiAKIAkJaW5wdXRfcmVwb3J0X2FicyhpZGV2LCBBQlNfUFJFU1NVUkUsCiAJCQkJY3IwID8gMHgxMDAwIC0gY3IwIDogY3IwKTsKIAkJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBCVE5fVE9VQ0gsIGNyMCk7CiAJCWlucHV0X3N5bmMoaWRldik7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJZGV2X2RiZygmaWRldi0+ZGV2LCAiZGlzY2FyZCBldmVudFxuIik7CisJfQogfQogCiBzdGF0aWMgdm9pZCBtYzEzNzgzX3RzX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMTg5LDE0ICsxOTAsNiBAQAogCQlnb3RvIGVycl9mcmVlX21lbTsKIAl9CiAKLQkvKgotCSAqIFdlIG5lZWQgc2VwYXJhdGUgd29ya3F1ZXVlIGJlY2F1c2UgbWMxMzc4M19hZGNfZG9fY29udmVyc2lvbgotCSAqIHVzZXMga2V2ZW50ZCBhbmQgdGh1cyB3b3VsZCBkZWFkbG9jay4KLQkgKi8KLQlwcml2LT53b3JrcSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJtYzEzNzgzX3RzIik7Ci0JaWYgKCFwcml2LT53b3JrcSkKLQkJZ290byBlcnJfZnJlZV9tZW07Ci0KIAlpZGV2LT5uYW1lID0gTUMxMzc4M19UU19OQU1FOwogCWlkZXYtPmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCkBAIC0yMTUsMTQgKzIwOCwxMiBAQAogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJInJlZ2lzdGVyIGlucHV0IGRldmljZSBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfZGVzdHJveV93cTsKKwkJZ290byBlcnJfZnJlZV9tZW07CiAJfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CiAJcmV0dXJuIDA7CiAKLWVycl9kZXN0cm95X3dxOgotCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPndvcmtxKTsKIGVycl9mcmVlX21lbToKIAlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKIAlrZnJlZShwcml2KTsKQEAgLTIzMyw3ICsyMjQsNiBAQAogewogCXN0cnVjdCBtYzEzNzgzX3RzX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPndvcmtxKTsKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShwcml2LT5pZGV2KTsKIAlrZnJlZShwcml2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9waXhjaXJfaTJjX3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3BpeGNpcl9pMmNfdHMuYwppbmRleCBkMTU5ZTE0Li4zYmIwNjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3BpeGNpcl9pMmNfdHMuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3BpeGNpcl9pMmNfdHMuYwpAQCAtMTEsMTAgKzExLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC00MDQsNyArNDAwLDYgQEAKIAltdXRleF9sb2NrKCZpbnB1dC0+bXV0ZXgpOwogCiAJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZjbGllbnQtPmRldikpIHsKLQogCQlpZiAoIWlucHV0LT51c2VycykgewogCQkJcmV0ID0gcGl4Y2lyX3N0b3AodHMpOwogCQkJaWYgKHJldCkgewpAQCAtNDMxLDEzICs0MjYsNyBAQAogc3RhdGljIGludCBwaXhjaXJfcGFyc2VfZHQoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgc3RydWN0IHBpeGNpcl9pMmNfdHNfZGF0YSAqdHNkYXRhKQogewotCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCi0JbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKHBpeGNpcl9vZl9tYXRjaCksIGRldik7Ci0JaWYgKCFtYXRjaCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0c2RhdGEtPmNoaXAgPSAoY29uc3Qgc3RydWN0IHBpeGNpcl9pMmNfY2hpcF9kYXRhICopbWF0Y2gtPmRhdGE7CisJdHNkYXRhLT5jaGlwID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKGRldik7CiAJaWYgKCF0c2RhdGEtPmNoaXApCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3NpbGVhZC5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9zaWxlYWQuYwppbmRleCBiMjc0NGE2Li5mNTAyYzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3NpbGVhZC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vc2lsZWFkLmMKQEAgLTM5MCw5ICszOTAsMTAgQEAKIAkJZGF0YS0+bWF4X2ZpbmdlcnMgPSA1OyAvKiBNb3N0IGRldmljZXMgaGFuZGxlIHVwLXRvIDUgZmluZ2VycyAqLwogCX0KIAotCWVycm9yID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfc3RyaW5nKGRldiwgInRvdWNoc2NyZWVuLWZ3LW5hbWUiLCAmc3RyKTsKKwllcnJvciA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3N0cmluZyhkZXYsICJmaXJtd2FyZS1uYW1lIiwgJnN0cik7CiAJaWYgKCFlcnJvcikKLQkJc25wcmludGYoZGF0YS0+ZndfbmFtZSwgc2l6ZW9mKGRhdGEtPmZ3X25hbWUpLCAiJXMiLCBzdHIpOworCQlzbnByaW50ZihkYXRhLT5md19uYW1lLCBzaXplb2YoZGF0YS0+ZndfbmFtZSksCisJCQkgInNpbGVhZC8lcyIsIHN0cik7CiAJZWxzZQogCQlkZXZfZGJnKGRldiwgIkZpcm13YXJlIGZpbGUgbmFtZSByZWFkIGVycm9yLiBVc2luZyBkZWZhdWx0LiIpOwogfQpAQCAtNDEwLDE0ICs0MTEsMTQgQEAKIAkJaWYgKCFhY3BpX2lkKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJc25wcmludGYoZGF0YS0+ZndfbmFtZSwgc2l6ZW9mKGRhdGEtPmZ3X25hbWUpLCAiJXMuZnciLAotCQkJYWNwaV9pZC0+aWQpOworCQlzbnByaW50ZihkYXRhLT5md19uYW1lLCBzaXplb2YoZGF0YS0+ZndfbmFtZSksCisJCQkgInNpbGVhZC8lcy5mdyIsIGFjcGlfaWQtPmlkKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgc3RybGVuKGRhdGEtPmZ3X25hbWUpOyBpKyspCiAJCQlkYXRhLT5md19uYW1lW2ldID0gdG9sb3dlcihkYXRhLT5md19uYW1lW2ldKTsKIAl9IGVsc2UgewotCQlzbnByaW50ZihkYXRhLT5md19uYW1lLCBzaXplb2YoZGF0YS0+ZndfbmFtZSksICIlcy5mdyIsCi0JCQlpZC0+bmFtZSk7CisJCXNucHJpbnRmKGRhdGEtPmZ3X25hbWUsIHNpemVvZihkYXRhLT5md19uYW1lKSwKKwkJCSAic2lsZWFkLyVzLmZ3IiwgaWQtPm5hbWUpOwogCX0KIAogCXJldHVybiAwOwpAQCAtNDI2LDcgKzQyNyw4IEBACiBzdGF0aWMgaW50IHNpbGVhZF90c19zZXRfZGVmYXVsdF9md19uYW1lKHN0cnVjdCBzaWxlYWRfdHNfZGF0YSAqZGF0YSwKIAkJCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKLQlzbnByaW50ZihkYXRhLT5md19uYW1lLCBzaXplb2YoZGF0YS0+ZndfbmFtZSksICIlcy5mdyIsIGlkLT5uYW1lKTsKKwlzbnByaW50ZihkYXRhLT5md19uYW1lLCBzaXplb2YoZGF0YS0+ZndfbmFtZSksCisJCSAic2lsZWFkLyVzLmZ3IiwgaWQtPm5hbWUpOwogCXJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dkdDg3eHhfaTJjLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dkdDg3eHhfaTJjLmMKaW5kZXggNzM4NjFhZC4uYTkxMzI2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93ZHQ4N3h4X2kyYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd2R0ODd4eF9pMmMuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2RlZmluZSBXRFQ4N1hYX05BTUUJCSJ3ZHQ4N3h4X2kyYyIKLSNkZWZpbmUgV0RUODdYWF9EUlZfVkVSCQkiMC45LjciCisjZGVmaW5lIFdEVDg3WFhfRFJWX1ZFUgkJIjAuOS44IgogI2RlZmluZSBXRFQ4N1hYX0ZXX05BTUUJCSJ3ZHQ4N3h4X2Z3LmJpbiIKICNkZWZpbmUgV0RUODdYWF9DRkdfTkFNRQkid2R0ODd4eF9jZmcuYmluIgogCkBAIC0xNTcsNiArMTU3LDcgQEAKIC8qIENvbnRyb2xsZXIgcmVxdWlyZXMgbWluaW11bSAzMDB1cyBiZXR3ZWVuIGNvbW1hbmRzICovCiAjZGVmaW5lIFdEVF9DT01NQU5EX0RFTEFZX01TCQkyCiAjZGVmaW5lIFdEVF9GTEFTSF9XUklURV9ERUxBWV9NUwk0CisjZGVmaW5lIFdEVF9GTEFTSF9FUkFTRV9ERUxBWV9NUwkyMDAKICNkZWZpbmUgV0RUX0ZXX1JFU0VUX1RJTUUJCTI1MDAKIAogc3RydWN0IHdkdDg3eHhfc3lzX3BhcmFtIHsKQEAgLTcyNiw3ICs3MjcsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQltc2xlZXAoNTApOworCQkJbXNsZWVwKFdEVF9GTEFTSF9FUkFTRV9ERUxBWV9NUyk7CiAKIAkJCWVycm9yID0gd2R0ODd4eF93cml0ZV9kYXRhKGNsaWVudCwgZGF0YSwgc3RhcnRfYWRkciwKIAkJCQkJCSAgIHBhZ2Vfc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dtOTd4eC1jb3JlLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3dtOTd4eC1jb3JlLmMKaW5kZXggMTUzNGU5Yi4uOTBkNmJlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi93bTk3eHgtY29yZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vd205N3h4LWNvcmUuYwpAQCAtNTAwLDcgKzUwMCw3IEBACiB7CiAJc3RydWN0IHdtOTd4eCAqd20gPSBpbnB1dF9nZXRfZHJ2ZGF0YShpZGV2KTsKIAotCXdtLT50c193b3JrcSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrd205N3h4Iik7CisJd20tPnRzX3dvcmtxID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoImt3bTk3eHgiLCAwKTsKIAlpZiAod20tPnRzX3dvcmtxID09IE5VTEwpIHsKIAkJZGV2X2Vycih3bS0+ZGV2LAogCQkJIkZhaWxlZCB0byBjcmVhdGUgd29ya3F1ZXVlXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11LmMgYi9kcml2ZXJzL2lvbW11L2FtZF9pb21tdS5jCmluZGV4IDk2ZGU5N2EuLjU4ZmE4Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11LmMKKysrIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXUuYwpAQCAtMTM3LDYgKzEzNyw3IEBACiAJYm9vbCBwcmlfdGxwOwkJCSAgLyogUEFTSUQgVExCIHJlcXVpcmVkIGZvcgogCQkJCQkgICAgIFBQUiBjb21wbGV0aW9ucyAqLwogCXUzMiBlcnJhdGE7CQkJICAvKiBCaXRtYXAgZm9yIGVycmF0YSB0byBhcHBseSAqLworCWJvb2wgdXNlX3ZhcGljOwkJCSAgLyogRW5hYmxlIGRldmljZSB0byB1c2UgdmFwaWMgbW9kZSAqLwogfTsKIAogLyoKQEAgLTcwNywxNCArNzA4LDc0IEBACiAJfQogfQogCisjaWZkZWYgQ09ORklHX0lSUV9SRU1BUAorc3RhdGljIGludCAoKmlvbW11X2dhX2xvZ19ub3RpZmllcikodTMyKTsKKworaW50IGFtZF9pb21tdV9yZWdpc3Rlcl9nYV9sb2dfbm90aWZpZXIoaW50ICgqbm90aWZpZXIpKHUzMikpCit7CisJaW9tbXVfZ2FfbG9nX25vdGlmaWVyID0gbm90aWZpZXI7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woYW1kX2lvbW11X3JlZ2lzdGVyX2dhX2xvZ19ub3RpZmllcik7CisKK3N0YXRpYyB2b2lkIGlvbW11X3BvbGxfZ2FfbG9nKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCXUzMiBoZWFkLCB0YWlsLCBjbnQgPSAwOworCisJaWYgKGlvbW11LT5nYV9sb2cgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaGVhZCA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0dBX0hFQURfT0ZGU0VUKTsKKwl0YWlsID0gcmVhZGwoaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fR0FfVEFJTF9PRkZTRVQpOworCisJd2hpbGUgKGhlYWQgIT0gdGFpbCkgeworCQl2b2xhdGlsZSB1NjQgKnJhdzsKKwkJdTY0IGxvZ19lbnRyeTsKKworCQlyYXcgPSAodTY0ICopKGlvbW11LT5nYV9sb2cgKyBoZWFkKTsKKwkJY250Kys7CisKKwkJLyogQXZvaWQgbWVtY3B5IGZ1bmN0aW9uLWNhbGwgb3ZlcmhlYWQgKi8KKwkJbG9nX2VudHJ5ID0gKnJhdzsKKworCQkvKiBVcGRhdGUgaGVhZCBwb2ludGVyIG9mIGhhcmR3YXJlIHJpbmctYnVmZmVyICovCisJCWhlYWQgPSAoaGVhZCArIEdBX0VOVFJZX1NJWkUpICUgR0FfTE9HX1NJWkU7CisJCXdyaXRlbChoZWFkLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19HQV9IRUFEX09GRlNFVCk7CisKKwkJLyogSGFuZGxlIEdBIGVudHJ5ICovCisJCXN3aXRjaCAoR0FfUkVRX1RZUEUobG9nX2VudHJ5KSkgeworCQljYXNlIEdBX0dVRVNUX05SOgorCQkJaWYgKCFpb21tdV9nYV9sb2dfbm90aWZpZXIpCisJCQkJYnJlYWs7CisKKwkJCXByX2RlYnVnKCJBTUQtVmk6ICVzOiBkZXZpZD0lI3gsIGdhX3RhZz0lI3hcbiIsCisJCQkJIF9fZnVuY19fLCBHQV9ERVZJRChsb2dfZW50cnkpLAorCQkJCSBHQV9UQUcobG9nX2VudHJ5KSk7CisKKwkJCWlmIChpb21tdV9nYV9sb2dfbm90aWZpZXIoR0FfVEFHKGxvZ19lbnRyeSkpICE9IDApCisJCQkJcHJfZXJyKCJBTUQtVmk6IEdBIGxvZyBub3RpZmllciBmYWlsZWQuXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX0lSUV9SRU1BUCAqLworCisjZGVmaW5lIEFNRF9JT01NVV9JTlRfTUFTSwlcCisJKE1NSU9fU1RBVFVTX0VWVF9JTlRfTUFTSyB8IFwKKwkgTU1JT19TVEFUVVNfUFBSX0lOVF9NQVNLIHwgXAorCSBNTUlPX1NUQVRVU19HQUxPR19JTlRfTUFTSykKKwogaXJxcmV0dXJuX3QgYW1kX2lvbW11X2ludF90aHJlYWQoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSA9IChzdHJ1Y3QgYW1kX2lvbW11ICopIGRhdGE7CiAJdTMyIHN0YXR1cyA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX1NUQVRVU19PRkZTRVQpOwogCi0Jd2hpbGUgKHN0YXR1cyAmIChNTUlPX1NUQVRVU19FVlRfSU5UX01BU0sgfCBNTUlPX1NUQVRVU19QUFJfSU5UX01BU0spKSB7Ci0JCS8qIEVuYWJsZSBFVlQgYW5kIFBQUiBpbnRlcnJ1cHRzIGFnYWluICovCi0JCXdyaXRlbCgoTU1JT19TVEFUVVNfRVZUX0lOVF9NQVNLIHwgTU1JT19TVEFUVVNfUFBSX0lOVF9NQVNLKSwKKwl3aGlsZSAoc3RhdHVzICYgQU1EX0lPTU1VX0lOVF9NQVNLKSB7CisJCS8qIEVuYWJsZSBFVlQgYW5kIFBQUiBhbmQgR0EgaW50ZXJydXB0cyBhZ2FpbiAqLworCQl3cml0ZWwoQU1EX0lPTU1VX0lOVF9NQVNLLAogCQkJaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fU1RBVFVTX09GRlNFVCk7CiAKIAkJaWYgKHN0YXR1cyAmIE1NSU9fU1RBVFVTX0VWVF9JTlRfTUFTSykgewpAQCAtNzI3LDYgKzc4OCwxMyBAQAogCQkJaW9tbXVfcG9sbF9wcHJfbG9nKGlvbW11KTsKIAkJfQogCisjaWZkZWYgQ09ORklHX0lSUV9SRU1BUAorCQlpZiAoc3RhdHVzICYgTU1JT19TVEFUVVNfR0FMT0dfSU5UX01BU0spIHsKKwkJCXByX2RldmVsKCJBTUQtVmk6IFByb2Nlc3NpbmcgSU9NTVUgR0EgTG9nXG4iKTsKKwkJCWlvbW11X3BvbGxfZ2FfbG9nKGlvbW11KTsKKwkJfQorI2VuZGlmCisKIAkJLyoKIAkJICogSGFyZHdhcmUgYnVnOiBFUkJUMTMxMgogCQkgKiBXaGVuIHJlLWVuYWJsaW5nIGludGVycnVwdCAoYnkgd3JpdGluZyAxCkBAIC05NDAsMTUgKzEwMDgsMTMgQEAKICAqIFdyaXRlcyB0aGUgY29tbWFuZCB0byB0aGUgSU9NTVVzIGNvbW1hbmQgYnVmZmVyIGFuZCBpbmZvcm1zIHRoZQogICogaGFyZHdhcmUgYWJvdXQgdGhlIG5ldyBjb21tYW5kLgogICovCi1zdGF0aWMgaW50IGlvbW11X3F1ZXVlX2NvbW1hbmRfc3luYyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwKLQkJCQkgICAgc3RydWN0IGlvbW11X2NtZCAqY21kLAotCQkJCSAgICBib29sIHN5bmMpCitzdGF0aWMgaW50IF9faW9tbXVfcXVldWVfY29tbWFuZF9zeW5jKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LAorCQkJCSAgICAgIHN0cnVjdCBpb21tdV9jbWQgKmNtZCwKKwkJCQkgICAgICBib29sIHN5bmMpCiB7CiAJdTMyIGxlZnQsIHRhaWwsIGhlYWQsIG5leHRfdGFpbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiBhZ2FpbjoKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIAogCWhlYWQgICAgICA9IHJlYWRsKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9IRUFEX09GRlNFVCk7CiAJdGFpbCAgICAgID0gcmVhZGwoaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fQ01EX1RBSUxfT0ZGU0VUKTsKQEAgLTk1NywxNSArMTAyMywxNCBAQAogCiAJaWYgKGxlZnQgPD0gMikgewogCQlzdHJ1Y3QgaW9tbXVfY21kIHN5bmNfY21kOwotCQl2b2xhdGlsZSB1NjQgc2VtID0gMDsKIAkJaW50IHJldDsKIAotCQlidWlsZF9jb21wbGV0aW9uX3dhaXQoJnN5bmNfY21kLCAodTY0KSZzZW0pOworCQlpb21tdS0+Y21kX3NlbSA9IDA7CisKKwkJYnVpbGRfY29tcGxldGlvbl93YWl0KCZzeW5jX2NtZCwgKHU2NCkmaW9tbXUtPmNtZF9zZW0pOwogCQljb3B5X2NtZF90b19idWZmZXIoaW9tbXUsICZzeW5jX2NtZCwgdGFpbCk7CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoKHJldCA9IHdhaXRfb25fc2VtKCZzZW0pKSAhPSAwKQorCQlpZiAoKHJldCA9IHdhaXRfb25fc2VtKCZpb21tdS0+Y21kX3NlbSkpICE9IDApCiAJCQlyZXR1cm4gcmV0OwogCiAJCWdvdG8gYWdhaW47CkBAIC05NzYsOSArMTA0MSwyMSBAQAogCS8qIFdlIG5lZWQgdG8gc3luYyBub3cgdG8gbWFrZSBzdXJlIGFsbCBjb21tYW5kcyBhcmUgcHJvY2Vzc2VkICovCiAJaW9tbXUtPm5lZWRfc3luYyA9IHN5bmM7CiAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpb21tdV9xdWV1ZV9jb21tYW5kX3N5bmMoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsCisJCQkJICAgIHN0cnVjdCBpb21tdV9jbWQgKmNtZCwKKwkJCQkgICAgYm9vbCBzeW5jKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCXJldCA9IF9faW9tbXVfcXVldWVfY29tbWFuZF9zeW5jKGlvbW11LCBjbWQsIHN5bmMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGlvbW11X3F1ZXVlX2NvbW1hbmQoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHN0cnVjdCBpb21tdV9jbWQgKmNtZCkKQEAgLTk5MywxOSArMTA3MCwyOSBAQAogc3RhdGljIGludCBpb21tdV9jb21wbGV0aW9uX3dhaXQoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7CiAJc3RydWN0IGlvbW11X2NtZCBjbWQ7Ci0Jdm9sYXRpbGUgdTY0IHNlbSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJaWYgKCFpb21tdS0+bmVlZF9zeW5jKQogCQlyZXR1cm4gMDsKIAotCWJ1aWxkX2NvbXBsZXRpb25fd2FpdCgmY21kLCAodTY0KSZzZW0pOwogCi0JcmV0ID0gaW9tbXVfcXVldWVfY29tbWFuZF9zeW5jKGlvbW11LCAmY21kLCBmYWxzZSk7CisJYnVpbGRfY29tcGxldGlvbl93YWl0KCZjbWQsICh1NjQpJmlvbW11LT5jbWRfc2VtKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCisJaW9tbXUtPmNtZF9zZW0gPSAwOworCisJcmV0ID0gX19pb21tdV9xdWV1ZV9jb21tYW5kX3N5bmMoaW9tbXUsICZjbWQsIGZhbHNlKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIG91dF91bmxvY2s7CiAKLQlyZXR1cm4gd2FpdF9vbl9zZW0oJnNlbSk7CisJcmV0ID0gd2FpdF9vbl9zZW0oJmlvbW11LT5jbWRfc2VtKTsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb21tdS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBpb21tdV9mbHVzaF9kdGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHUxNiBkZXZpZCkKQEAgLTI5NDgsNiArMzAzNSwxMiBAQAogCWlmICghaW9tbXUpCiAJCXJldHVybjsKIAorI2lmZGVmIENPTkZJR19JUlFfUkVNQVAKKwlpZiAoQU1EX0lPTU1VX0dVRVNUX0lSX1ZBUElDKGFtZF9pb21tdV9ndWVzdF9pcikgJiYKKwkgICAgKGRvbS0+dHlwZSA9PSBJT01NVV9ET01BSU5fVU5NQU5BR0VEKSkKKwkJZGV2X2RhdGEtPnVzZV92YXBpYyA9IDA7CisjZW5kaWYKKwogCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7CiB9CiAKQEAgLTI5NzMsNiArMzA2NiwxNSBAQAogCiAJcmV0ID0gYXR0YWNoX2RldmljZShkZXYsIGRvbWFpbik7CiAKKyNpZmRlZiBDT05GSUdfSVJRX1JFTUFQCisJaWYgKEFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQyhhbWRfaW9tbXVfZ3Vlc3RfaXIpKSB7CisJCWlmIChkb20tPnR5cGUgPT0gSU9NTVVfRE9NQUlOX1VOTUFOQUdFRCkKKwkJCWRldl9kYXRhLT51c2VfdmFwaWMgPSAxOworCQllbHNlCisJCQlkZXZfZGF0YS0+dXNlX3ZhcGljID0gMDsKKwl9CisjZW5kaWYKKwogCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMzUxMSwzNCArMzYxMyw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi11bmlvbiBpcnRlIHsKLQl1MzIgdmFsOwotCXN0cnVjdCB7Ci0JCXUzMiB2YWxpZAk6IDEsCi0JCSAgICBub19mYXVsdAk6IDEsCi0JCSAgICBpbnRfdHlwZQk6IDMsCi0JCSAgICBycV9lb2kJOiAxLAotCQkgICAgZG0JCTogMSwKLQkJICAgIHJzdmRfMQk6IDEsCi0JCSAgICBkZXN0aW5hdGlvbgk6IDgsCi0JCSAgICB2ZWN0b3IJOiA4LAotCQkgICAgcnN2ZF8yCTogODsKLQl9IGZpZWxkczsKLX07Ci0KLXN0cnVjdCBpcnFfMl9pcnRlIHsKLQl1MTYgZGV2aWQ7IC8qIERldmljZSBJRCBmb3IgSVJURSB0YWJsZSAqLwotCXUxNiBpbmRleDsgLyogSW5kZXggaW50byBJUlRFIHRhYmxlKi8KLX07Ci0KLXN0cnVjdCBhbWRfaXJfZGF0YSB7Ci0Jc3RydWN0IGlycV8yX2lydGUJCQlpcnFfMl9pcnRlOwotCXVuaW9uIGlydGUJCQkJaXJ0ZV9lbnRyeTsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBtc2lfbXNnCQkJbXNpX2VudHJ5OwotCX07Ci19OwotCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGFtZF9pcl9jaGlwOwogCiAjZGVmaW5lIERURV9JUlFfUEhZU19BRERSX01BU0sJKCgoMVVMTCA8PCA0NSktMSkgPDwgNikKQEAgLTM1NjAsOCArMzYzNCw2IEBACiAJYW1kX2lvbW11X2Rldl90YWJsZVtkZXZpZF0uZGF0YVsyXSA9IGR0ZTsKIH0KIAotI2RlZmluZSBJUlRFX0FMTE9DQVRFRCAofjFVKQotCiBzdGF0aWMgc3RydWN0IGlycV9yZW1hcF90YWJsZSAqZ2V0X2lycV90YWJsZSh1MTYgZGV2aWQsIGJvb2wgaW9hcGljKQogewogCXN0cnVjdCBpcnFfcmVtYXBfdGFibGUgKnRhYmxlID0gTlVMTDsKQEAgLTM2MDcsMTMgKzM2NzksMTggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JbWVtc2V0KHRhYmxlLT50YWJsZSwgMCwgTUFYX0lSUVNfUEVSX1RBQkxFICogc2l6ZW9mKHUzMikpOworCWlmICghQU1EX0lPTU1VX0dVRVNUX0lSX0dBKGFtZF9pb21tdV9ndWVzdF9pcikpCisJCW1lbXNldCh0YWJsZS0+dGFibGUsIDAsCisJCSAgICAgICBNQVhfSVJRU19QRVJfVEFCTEUgKiBzaXplb2YodTMyKSk7CisJZWxzZQorCQltZW1zZXQodGFibGUtPnRhYmxlLCAwLAorCQkgICAgICAgKE1BWF9JUlFTX1BFUl9UQUJMRSAqIChzaXplb2YodTY0KSAqIDIpKSk7CiAKIAlpZiAoaW9hcGljKSB7CiAJCWludCBpOwogCiAJCWZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQotCQkJdGFibGUtPnRhYmxlW2ldID0gSVJURV9BTExPQ0FURUQ7CisJCQlpb21tdS0+aXJ0ZV9vcHMtPnNldF9hbGxvY2F0ZWQodGFibGUsIGkpOwogCX0KIAogCWlycV9sb29rdXBfdGFibGVbZGV2aWRdID0gdGFibGU7CkBAIC0zNjM5LDYgKzM3MTYsMTAgQEAKIAlzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICp0YWJsZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpbmRleCwgYzsKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2RldmlkXTsKKworCWlmICghaW9tbXUpCisJCXJldHVybiAtRU5PREVWOwogCiAJdGFibGUgPSBnZXRfaXJxX3RhYmxlKGRldmlkLCBmYWxzZSk7CiAJaWYgKCF0YWJsZSkKQEAgLTM2NTAsMTQgKzM3MzEsMTQgQEAKIAlmb3IgKGMgPSAwLCBpbmRleCA9IHRhYmxlLT5taW5faW5kZXg7CiAJICAgICBpbmRleCA8IE1BWF9JUlFTX1BFUl9UQUJMRTsKIAkgICAgICsraW5kZXgpIHsKLQkJaWYgKHRhYmxlLT50YWJsZVtpbmRleF0gPT0gMCkKKwkJaWYgKCFpb21tdS0+aXJ0ZV9vcHMtPmlzX2FsbG9jYXRlZCh0YWJsZSwgaW5kZXgpKQogCQkJYyArPSAxOwogCQllbHNlCiAJCQljID0gMDsKIAogCQlpZiAoYyA9PSBjb3VudCkJewogCQkJZm9yICg7IGMgIT0gMDsgLS1jKQotCQkJCXRhYmxlLT50YWJsZVtpbmRleCAtIGMgKyAxXSA9IElSVEVfQUxMT0NBVEVEOworCQkJCWlvbW11LT5pcnRlX29wcy0+c2V0X2FsbG9jYXRlZCh0YWJsZSwgaW5kZXggLSBjICsgMSk7CiAKIAkJCWluZGV4IC09IGNvdW50IC0gMTsKIAkJCWdvdG8gb3V0OwpAQCAtMzY3Miw3ICszNzUzLDQyIEBACiAJcmV0dXJuIGluZGV4OwogfQogCi1zdGF0aWMgaW50IG1vZGlmeV9pcnRlKHUxNiBkZXZpZCwgaW50IGluZGV4LCB1bmlvbiBpcnRlIGlydGUpCitzdGF0aWMgaW50IG1vZGlmeV9pcnRlX2dhKHUxNiBkZXZpZCwgaW50IGluZGV4LCBzdHJ1Y3QgaXJ0ZV9nYSAqaXJ0ZSwKKwkJCSAgc3RydWN0IGFtZF9pcl9kYXRhICpkYXRhKQoreworCXN0cnVjdCBpcnFfcmVtYXBfdGFibGUgKnRhYmxlOworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlydGVfZ2EgKmVudHJ5OworCisJaW9tbXUgPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtkZXZpZF07CisJaWYgKGlvbW11ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJdGFibGUgPSBnZXRfaXJxX3RhYmxlKGRldmlkLCBmYWxzZSk7CisJaWYgKCF0YWJsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGFibGUtPmxvY2ssIGZsYWdzKTsKKworCWVudHJ5ID0gKHN0cnVjdCBpcnRlX2dhICopdGFibGUtPnRhYmxlOworCWVudHJ5ID0gJmVudHJ5W2luZGV4XTsKKwllbnRyeS0+bG8uZmllbGRzX3JlbWFwLnZhbGlkID0gMDsKKwllbnRyeS0+aGkudmFsID0gaXJ0ZS0+aGkudmFsOworCWVudHJ5LT5sby52YWwgPSBpcnRlLT5sby52YWw7CisJZW50cnktPmxvLmZpZWxkc19yZW1hcC52YWxpZCA9IDE7CisJaWYgKGRhdGEpCisJCWRhdGEtPnJlZiA9IGVudHJ5OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFibGUtPmxvY2ssIGZsYWdzKTsKKworCWlvbW11X2ZsdXNoX2lydChpb21tdSwgZGV2aWQpOworCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb2RpZnlfaXJ0ZSh1MTYgZGV2aWQsIGludCBpbmRleCwgdW5pb24gaXJ0ZSAqaXJ0ZSkKIHsKIAlzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICp0YWJsZTsKIAlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKQEAgLTM2ODcsNyArMzgwMyw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRhYmxlLT5sb2NrLCBmbGFncyk7Ci0JdGFibGUtPnRhYmxlW2luZGV4XSA9IGlydGUudmFsOworCXRhYmxlLT50YWJsZVtpbmRleF0gPSBpcnRlLT52YWw7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFibGUtPmxvY2ssIGZsYWdzKTsKIAogCWlvbW11X2ZsdXNoX2lydChpb21tdSwgZGV2aWQpOwpAQCAtMzcxMSwxMyArMzgyNywxNDYgQEAKIAkJcmV0dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRhYmxlLT5sb2NrLCBmbGFncyk7Ci0JdGFibGUtPnRhYmxlW2luZGV4XSA9IDA7CisJaW9tbXUtPmlydGVfb3BzLT5jbGVhcl9hbGxvY2F0ZWQodGFibGUsIGluZGV4KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YWJsZS0+bG9jaywgZmxhZ3MpOwogCiAJaW9tbXVfZmx1c2hfaXJ0KGlvbW11LCBkZXZpZCk7CiAJaW9tbXVfY29tcGxldGlvbl93YWl0KGlvbW11KTsKIH0KIAorc3RhdGljIHZvaWQgaXJ0ZV9wcmVwYXJlKHZvaWQgKmVudHJ5LAorCQkJIHUzMiBkZWxpdmVyeV9tb2RlLCB1MzIgZGVzdF9tb2RlLAorCQkJIHU4IHZlY3RvciwgdTMyIGRlc3RfYXBpY2lkLCBpbnQgZGV2aWQpCit7CisJdW5pb24gaXJ0ZSAqaXJ0ZSA9ICh1bmlvbiBpcnRlICopIGVudHJ5OworCisJaXJ0ZS0+dmFsICAgICAgICAgICAgICAgID0gMDsKKwlpcnRlLT5maWVsZHMudmVjdG9yICAgICAgPSB2ZWN0b3I7CisJaXJ0ZS0+ZmllbGRzLmludF90eXBlICAgID0gZGVsaXZlcnlfbW9kZTsKKwlpcnRlLT5maWVsZHMuZGVzdGluYXRpb24gPSBkZXN0X2FwaWNpZDsKKwlpcnRlLT5maWVsZHMuZG0gICAgICAgICAgPSBkZXN0X21vZGU7CisJaXJ0ZS0+ZmllbGRzLnZhbGlkICAgICAgID0gMTsKK30KKworc3RhdGljIHZvaWQgaXJ0ZV9nYV9wcmVwYXJlKHZvaWQgKmVudHJ5LAorCQkJICAgIHUzMiBkZWxpdmVyeV9tb2RlLCB1MzIgZGVzdF9tb2RlLAorCQkJICAgIHU4IHZlY3RvciwgdTMyIGRlc3RfYXBpY2lkLCBpbnQgZGV2aWQpCit7CisJc3RydWN0IGlydGVfZ2EgKmlydGUgPSAoc3RydWN0IGlydGVfZ2EgKikgZW50cnk7CisJc3RydWN0IGlvbW11X2Rldl9kYXRhICpkZXZfZGF0YSA9IHNlYXJjaF9kZXZfZGF0YShkZXZpZCk7CisKKwlpcnRlLT5sby52YWwgICAgICAgICAgICAgICAgICAgICAgPSAwOworCWlydGUtPmhpLnZhbCAgICAgICAgICAgICAgICAgICAgICA9IDA7CisJaXJ0ZS0+bG8uZmllbGRzX3JlbWFwLmd1ZXN0X21vZGUgID0gZGV2X2RhdGEgPyBkZXZfZGF0YS0+dXNlX3ZhcGljIDogMDsKKwlpcnRlLT5sby5maWVsZHNfcmVtYXAuaW50X3R5cGUgICAgPSBkZWxpdmVyeV9tb2RlOworCWlydGUtPmxvLmZpZWxkc19yZW1hcC5kbSAgICAgICAgICA9IGRlc3RfbW9kZTsKKwlpcnRlLT5oaS5maWVsZHMudmVjdG9yICAgICAgICAgICAgPSB2ZWN0b3I7CisJaXJ0ZS0+bG8uZmllbGRzX3JlbWFwLmRlc3RpbmF0aW9uID0gZGVzdF9hcGljaWQ7CisJaXJ0ZS0+bG8uZmllbGRzX3JlbWFwLnZhbGlkICAgICAgID0gMTsKK30KKworc3RhdGljIHZvaWQgaXJ0ZV9hY3RpdmF0ZSh2b2lkICplbnRyeSwgdTE2IGRldmlkLCB1MTYgaW5kZXgpCit7CisJdW5pb24gaXJ0ZSAqaXJ0ZSA9ICh1bmlvbiBpcnRlICopIGVudHJ5OworCisJaXJ0ZS0+ZmllbGRzLnZhbGlkID0gMTsKKwltb2RpZnlfaXJ0ZShkZXZpZCwgaW5kZXgsIGlydGUpOworfQorCitzdGF0aWMgdm9pZCBpcnRlX2dhX2FjdGl2YXRlKHZvaWQgKmVudHJ5LCB1MTYgZGV2aWQsIHUxNiBpbmRleCkKK3sKKwlzdHJ1Y3QgaXJ0ZV9nYSAqaXJ0ZSA9IChzdHJ1Y3QgaXJ0ZV9nYSAqKSBlbnRyeTsKKworCWlydGUtPmxvLmZpZWxkc19yZW1hcC52YWxpZCA9IDE7CisJbW9kaWZ5X2lydGVfZ2EoZGV2aWQsIGluZGV4LCBpcnRlLCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgaXJ0ZV9kZWFjdGl2YXRlKHZvaWQgKmVudHJ5LCB1MTYgZGV2aWQsIHUxNiBpbmRleCkKK3sKKwl1bmlvbiBpcnRlICppcnRlID0gKHVuaW9uIGlydGUgKikgZW50cnk7CisKKwlpcnRlLT5maWVsZHMudmFsaWQgPSAwOworCW1vZGlmeV9pcnRlKGRldmlkLCBpbmRleCwgaXJ0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGlydGVfZ2FfZGVhY3RpdmF0ZSh2b2lkICplbnRyeSwgdTE2IGRldmlkLCB1MTYgaW5kZXgpCit7CisJc3RydWN0IGlydGVfZ2EgKmlydGUgPSAoc3RydWN0IGlydGVfZ2EgKikgZW50cnk7CisKKwlpcnRlLT5sby5maWVsZHNfcmVtYXAudmFsaWQgPSAwOworCW1vZGlmeV9pcnRlX2dhKGRldmlkLCBpbmRleCwgaXJ0ZSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGlydGVfc2V0X2FmZmluaXR5KHZvaWQgKmVudHJ5LCB1MTYgZGV2aWQsIHUxNiBpbmRleCwKKwkJCSAgICAgIHU4IHZlY3RvciwgdTMyIGRlc3RfYXBpY2lkKQoreworCXVuaW9uIGlydGUgKmlydGUgPSAodW5pb24gaXJ0ZSAqKSBlbnRyeTsKKworCWlydGUtPmZpZWxkcy52ZWN0b3IgPSB2ZWN0b3I7CisJaXJ0ZS0+ZmllbGRzLmRlc3RpbmF0aW9uID0gZGVzdF9hcGljaWQ7CisJbW9kaWZ5X2lydGUoZGV2aWQsIGluZGV4LCBpcnRlKTsKK30KKworc3RhdGljIHZvaWQgaXJ0ZV9nYV9zZXRfYWZmaW5pdHkodm9pZCAqZW50cnksIHUxNiBkZXZpZCwgdTE2IGluZGV4LAorCQkJCSB1OCB2ZWN0b3IsIHUzMiBkZXN0X2FwaWNpZCkKK3sKKwlzdHJ1Y3QgaXJ0ZV9nYSAqaXJ0ZSA9IChzdHJ1Y3QgaXJ0ZV9nYSAqKSBlbnRyeTsKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhID0gc2VhcmNoX2Rldl9kYXRhKGRldmlkKTsKKworCWlmICghZGV2X2RhdGEgfHwgIWRldl9kYXRhLT51c2VfdmFwaWMpIHsKKwkJaXJ0ZS0+aGkuZmllbGRzLnZlY3RvciA9IHZlY3RvcjsKKwkJaXJ0ZS0+bG8uZmllbGRzX3JlbWFwLmRlc3RpbmF0aW9uID0gZGVzdF9hcGljaWQ7CisJCWlydGUtPmxvLmZpZWxkc19yZW1hcC5ndWVzdF9tb2RlID0gMDsKKwkJbW9kaWZ5X2lydGVfZ2EoZGV2aWQsIGluZGV4LCBpcnRlLCBOVUxMKTsKKwl9Cit9CisKKyNkZWZpbmUgSVJURV9BTExPQ0FURUQgKH4xVSkKK3N0YXRpYyB2b2lkIGlydGVfc2V0X2FsbG9jYXRlZChzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICp0YWJsZSwgaW50IGluZGV4KQoreworCXRhYmxlLT50YWJsZVtpbmRleF0gPSBJUlRFX0FMTE9DQVRFRDsKK30KKworc3RhdGljIHZvaWQgaXJ0ZV9nYV9zZXRfYWxsb2NhdGVkKHN0cnVjdCBpcnFfcmVtYXBfdGFibGUgKnRhYmxlLCBpbnQgaW5kZXgpCit7CisJc3RydWN0IGlydGVfZ2EgKnB0ciA9IChzdHJ1Y3QgaXJ0ZV9nYSAqKXRhYmxlLT50YWJsZTsKKwlzdHJ1Y3QgaXJ0ZV9nYSAqaXJ0ZSA9ICZwdHJbaW5kZXhdOworCisJbWVtc2V0KCZpcnRlLT5sby52YWwsIDAsIHNpemVvZih1NjQpKTsKKwltZW1zZXQoJmlydGUtPmhpLnZhbCwgMCwgc2l6ZW9mKHU2NCkpOworCWlydGUtPmhpLmZpZWxkcy52ZWN0b3IgPSAweGZmOworfQorCitzdGF0aWMgYm9vbCBpcnRlX2lzX2FsbG9jYXRlZChzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICp0YWJsZSwgaW50IGluZGV4KQoreworCXVuaW9uIGlydGUgKnB0ciA9ICh1bmlvbiBpcnRlICopdGFibGUtPnRhYmxlOworCXVuaW9uIGlydGUgKmlydGUgPSAmcHRyW2luZGV4XTsKKworCXJldHVybiBpcnRlLT52YWwgIT0gMDsKK30KKworc3RhdGljIGJvb2wgaXJ0ZV9nYV9pc19hbGxvY2F0ZWQoc3RydWN0IGlycV9yZW1hcF90YWJsZSAqdGFibGUsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgaXJ0ZV9nYSAqcHRyID0gKHN0cnVjdCBpcnRlX2dhICopdGFibGUtPnRhYmxlOworCXN0cnVjdCBpcnRlX2dhICppcnRlID0gJnB0cltpbmRleF07CisKKwlyZXR1cm4gaXJ0ZS0+aGkuZmllbGRzLnZlY3RvciAhPSAwOworfQorCitzdGF0aWMgdm9pZCBpcnRlX2NsZWFyX2FsbG9jYXRlZChzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICp0YWJsZSwgaW50IGluZGV4KQoreworCXRhYmxlLT50YWJsZVtpbmRleF0gPSAwOworfQorCitzdGF0aWMgdm9pZCBpcnRlX2dhX2NsZWFyX2FsbG9jYXRlZChzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICp0YWJsZSwgaW50IGluZGV4KQoreworCXN0cnVjdCBpcnRlX2dhICpwdHIgPSAoc3RydWN0IGlydGVfZ2EgKil0YWJsZS0+dGFibGU7CisJc3RydWN0IGlydGVfZ2EgKmlydGUgPSAmcHRyW2luZGV4XTsKKworCW1lbXNldCgmaXJ0ZS0+bG8udmFsLCAwLCBzaXplb2YodTY0KSk7CisJbWVtc2V0KCZpcnRlLT5oaS52YWwsIDAsIHNpemVvZih1NjQpKTsKK30KKwogc3RhdGljIGludCBnZXRfZGV2aWQoc3RydWN0IGlycV9hbGxvY19pbmZvICppbmZvKQogewogCWludCBkZXZpZCA9IC0xOwpAQCAtMzgwMiwxOSArNDA1MSwxNyBAQAogewogCXN0cnVjdCBpcnFfMl9pcnRlICppcnRlX2luZm8gPSAmZGF0YS0+aXJxXzJfaXJ0ZTsKIAlzdHJ1Y3QgbXNpX21zZyAqbXNnID0gJmRhdGEtPm1zaV9lbnRyeTsKLQl1bmlvbiBpcnRlICppcnRlID0gJmRhdGEtPmlydGVfZW50cnk7CiAJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgKmVudHJ5OworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOworCisJaWYgKCFpb21tdSkKKwkJcmV0dXJuOwogCiAJZGF0YS0+aXJxXzJfaXJ0ZS5kZXZpZCA9IGRldmlkOwogCWRhdGEtPmlycV8yX2lydGUuaW5kZXggPSBpbmRleCArIHN1Yl9oYW5kbGU7Ci0KLQkvKiBTZXR1cCBJUlRFIGZvciBJT01NVSAqLwotCWlydGUtPnZhbCA9IDA7Ci0JaXJ0ZS0+ZmllbGRzLnZlY3RvciAgICAgID0gaXJxX2NmZy0+dmVjdG9yOwotCWlydGUtPmZpZWxkcy5pbnRfdHlwZSAgICA9IGFwaWMtPmlycV9kZWxpdmVyeV9tb2RlOwotCWlydGUtPmZpZWxkcy5kZXN0aW5hdGlvbiA9IGlycV9jZmctPmRlc3RfYXBpY2lkOwotCWlydGUtPmZpZWxkcy5kbSAgICAgICAgICA9IGFwaWMtPmlycV9kZXN0X21vZGU7Ci0JaXJ0ZS0+ZmllbGRzLnZhbGlkICAgICAgID0gMTsKKwlpb21tdS0+aXJ0ZV9vcHMtPnByZXBhcmUoZGF0YS0+ZW50cnksIGFwaWMtPmlycV9kZWxpdmVyeV9tb2RlLAorCQkJCSBhcGljLT5pcnFfZGVzdF9tb2RlLCBpcnFfY2ZnLT52ZWN0b3IsCisJCQkJIGlycV9jZmctPmRlc3RfYXBpY2lkLCBkZXZpZCk7CiAKIAlzd2l0Y2ggKGluZm8tPnR5cGUpIHsKIAljYXNlIFg4Nl9JUlFfQUxMT0NfVFlQRV9JT0FQSUM6CkBAIC0zODQ1LDEyICs0MDkyLDMyIEBACiAJfQogfQogCitzdHJ1Y3QgYW1kX2lydGVfb3BzIGlydGVfMzJfb3BzID0geworCS5wcmVwYXJlID0gaXJ0ZV9wcmVwYXJlLAorCS5hY3RpdmF0ZSA9IGlydGVfYWN0aXZhdGUsCisJLmRlYWN0aXZhdGUgPSBpcnRlX2RlYWN0aXZhdGUsCisJLnNldF9hZmZpbml0eSA9IGlydGVfc2V0X2FmZmluaXR5LAorCS5zZXRfYWxsb2NhdGVkID0gaXJ0ZV9zZXRfYWxsb2NhdGVkLAorCS5pc19hbGxvY2F0ZWQgPSBpcnRlX2lzX2FsbG9jYXRlZCwKKwkuY2xlYXJfYWxsb2NhdGVkID0gaXJ0ZV9jbGVhcl9hbGxvY2F0ZWQsCit9OworCitzdHJ1Y3QgYW1kX2lydGVfb3BzIGlydGVfMTI4X29wcyA9IHsKKwkucHJlcGFyZSA9IGlydGVfZ2FfcHJlcGFyZSwKKwkuYWN0aXZhdGUgPSBpcnRlX2dhX2FjdGl2YXRlLAorCS5kZWFjdGl2YXRlID0gaXJ0ZV9nYV9kZWFjdGl2YXRlLAorCS5zZXRfYWZmaW5pdHkgPSBpcnRlX2dhX3NldF9hZmZpbml0eSwKKwkuc2V0X2FsbG9jYXRlZCA9IGlydGVfZ2Ffc2V0X2FsbG9jYXRlZCwKKwkuaXNfYWxsb2NhdGVkID0gaXJ0ZV9nYV9pc19hbGxvY2F0ZWQsCisJLmNsZWFyX2FsbG9jYXRlZCA9IGlydGVfZ2FfY2xlYXJfYWxsb2NhdGVkLAorfTsKKwogc3RhdGljIGludCBpcnFfcmVtYXBwaW5nX2FsbG9jKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGludCB2aXJxLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBucl9pcnFzLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGlycV9hbGxvY19pbmZvICppbmZvID0gYXJnOwogCXN0cnVjdCBpcnFfZGF0YSAqaXJxX2RhdGE7Ci0Jc3RydWN0IGFtZF9pcl9kYXRhICpkYXRhOworCXN0cnVjdCBhbWRfaXJfZGF0YSAqZGF0YSA9IE5VTEw7CiAJc3RydWN0IGlycV9jZmcgKmNmZzsKIAlpbnQgaSwgcmV0LCBkZXZpZDsKIAlpbnQgaW5kZXggPSAtMTsKQEAgLTM5MDIsNiArNDE2OSwxNiBAQAogCQlpZiAoIWRhdGEpCiAJCQlnb3RvIG91dF9mcmVlX2RhdGE7CiAKKwkJaWYgKCFBTURfSU9NTVVfR1VFU1RfSVJfR0EoYW1kX2lvbW11X2d1ZXN0X2lyKSkKKwkJCWRhdGEtPmVudHJ5ID0ga3phbGxvYyhzaXplb2YodW5pb24gaXJ0ZSksIEdGUF9LRVJORUwpOworCQllbHNlCisJCQlkYXRhLT5lbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcnRlX2dhKSwKKwkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghZGF0YS0+ZW50cnkpIHsKKwkJCWtmcmVlKGRhdGEpOworCQkJZ290byBvdXRfZnJlZV9kYXRhOworCQl9CisKIAkJaXJxX2RhdGEtPmh3aXJxID0gKGRldmlkIDw8IDE2KSArIGk7CiAJCWlycV9kYXRhLT5jaGlwX2RhdGEgPSBkYXRhOwogCQlpcnFfZGF0YS0+Y2hpcCA9ICZhbWRfaXJfY2hpcDsKQEAgLTM5MzgsNiArNDIxNSw3IEBACiAJCQlkYXRhID0gaXJxX2RhdGEtPmNoaXBfZGF0YTsKIAkJCWlydGVfaW5mbyA9ICZkYXRhLT5pcnFfMl9pcnRlOwogCQkJZnJlZV9pcnRlKGlydGVfaW5mby0+ZGV2aWQsIGlydGVfaW5mby0+aW5kZXgpOworCQkJa2ZyZWUoZGF0YS0+ZW50cnkpOwogCQkJa2ZyZWUoZGF0YSk7CiAJCX0KIAl9CkBAIC0zOTQ5LDggKzQyMjcsMTEgQEAKIHsKIAlzdHJ1Y3QgYW1kX2lyX2RhdGEgKmRhdGEgPSBpcnFfZGF0YS0+Y2hpcF9kYXRhOwogCXN0cnVjdCBpcnFfMl9pcnRlICppcnRlX2luZm8gPSAmZGF0YS0+aXJxXzJfaXJ0ZTsKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2lydGVfaW5mby0+ZGV2aWRdOwogCi0JbW9kaWZ5X2lydGUoaXJ0ZV9pbmZvLT5kZXZpZCwgaXJ0ZV9pbmZvLT5pbmRleCwgZGF0YS0+aXJ0ZV9lbnRyeSk7CisJaWYgKGlvbW11KQorCQlpb21tdS0+aXJ0ZV9vcHMtPmFjdGl2YXRlKGRhdGEtPmVudHJ5LCBpcnRlX2luZm8tPmRldmlkLAorCQkJCQkgIGlydGVfaW5mby0+aW5kZXgpOwogfQogCiBzdGF0aWMgdm9pZCBpcnFfcmVtYXBwaW5nX2RlYWN0aXZhdGUoc3RydWN0IGlycV9kb21haW4gKmRvbWFpbiwKQEAgLTM5NTgsMTAgKzQyMzksMTEgQEAKIHsKIAlzdHJ1Y3QgYW1kX2lyX2RhdGEgKmRhdGEgPSBpcnFfZGF0YS0+Y2hpcF9kYXRhOwogCXN0cnVjdCBpcnFfMl9pcnRlICppcnRlX2luZm8gPSAmZGF0YS0+aXJxXzJfaXJ0ZTsKLQl1bmlvbiBpcnRlIGVudHJ5OworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbaXJ0ZV9pbmZvLT5kZXZpZF07CiAKLQllbnRyeS52YWwgPSAwOwotCW1vZGlmeV9pcnRlKGlydGVfaW5mby0+ZGV2aWQsIGlydGVfaW5mby0+aW5kZXgsIGRhdGEtPmlydGVfZW50cnkpOworCWlmIChpb21tdSkKKwkJaW9tbXUtPmlydGVfb3BzLT5kZWFjdGl2YXRlKGRhdGEtPmVudHJ5LCBpcnRlX2luZm8tPmRldmlkLAorCQkJCQkgICAgaXJ0ZV9pbmZvLT5pbmRleCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgYW1kX2lyX2RvbWFpbl9vcHMgPSB7CkBAIC0zOTcxLDYgKzQyNTMsNzAgQEAKIAkuZGVhY3RpdmF0ZSA9IGlycV9yZW1hcHBpbmdfZGVhY3RpdmF0ZSwKIH07CiAKK3N0YXRpYyBpbnQgYW1kX2lyX3NldF92Y3B1X2FmZmluaXR5KHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdm9pZCAqdmNwdV9pbmZvKQoreworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OworCXN0cnVjdCBhbWRfaW9tbXVfcGlfZGF0YSAqcGlfZGF0YSA9IHZjcHVfaW5mbzsKKwlzdHJ1Y3QgdmNwdV9kYXRhICp2Y3B1X3BpX2luZm8gPSBwaV9kYXRhLT52Y3B1X2RhdGE7CisJc3RydWN0IGFtZF9pcl9kYXRhICppcl9kYXRhID0gZGF0YS0+Y2hpcF9kYXRhOworCXN0cnVjdCBpcnRlX2dhICppcnRlID0gKHN0cnVjdCBpcnRlX2dhICopIGlyX2RhdGEtPmVudHJ5OworCXN0cnVjdCBpcnFfMl9pcnRlICppcnRlX2luZm8gPSAmaXJfZGF0YS0+aXJxXzJfaXJ0ZTsKKwlzdHJ1Y3QgaW9tbXVfZGV2X2RhdGEgKmRldl9kYXRhID0gc2VhcmNoX2Rldl9kYXRhKGlydGVfaW5mby0+ZGV2aWQpOworCisJLyogTm90ZToKKwkgKiBUaGlzIGRldmljZSBoYXMgbmV2ZXIgYmVlbiBzZXQgdXAgZm9yIGd1ZXN0IG1vZGUuCisJICogd2Ugc2hvdWxkIG5vdCBtb2RpZnkgdGhlIElSVEUKKwkgKi8KKwlpZiAoIWRldl9kYXRhIHx8ICFkZXZfZGF0YS0+dXNlX3ZhcGljKQorCQlyZXR1cm4gMDsKKworCXBpX2RhdGEtPmlyX2RhdGEgPSBpcl9kYXRhOworCisJLyogTm90ZToKKwkgKiBTVk0gdHJpZXMgdG8gc2V0IHVwIGZvciBWQVBJQyBtb2RlLCBidXQgd2UgYXJlIGluCisJICogbGVnYWN5IG1vZGUuIFNvLCB3ZSBmb3JjZSBsZWdhY3kgbW9kZSBpbnN0ZWFkLgorCSAqLworCWlmICghQU1EX0lPTU1VX0dVRVNUX0lSX1ZBUElDKGFtZF9pb21tdV9ndWVzdF9pcikpIHsKKwkJcHJfZGVidWcoIkFNRC1WaTogJXM6IEZhbGwgYmFjayB0byB1c2luZyBpbnRyIGxlZ2FjeSByZW1hcFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXBpX2RhdGEtPmlzX2d1ZXN0X21vZGUgPSBmYWxzZTsKKwl9CisKKwlpb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2lydGVfaW5mby0+ZGV2aWRdOworCWlmIChpb21tdSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBpX2RhdGEtPnByZXZfZ2FfdGFnID0gaXJfZGF0YS0+Y2FjaGVkX2dhX3RhZzsKKwlpZiAocGlfZGF0YS0+aXNfZ3Vlc3RfbW9kZSkgeworCQkvKiBTZXR0aW5nICovCisJCWlydGUtPmhpLmZpZWxkcy5nYV9yb290X3B0ciA9IChwaV9kYXRhLT5iYXNlID4+IDEyKTsKKwkJaXJ0ZS0+aGkuZmllbGRzLnZlY3RvciA9IHZjcHVfcGlfaW5mby0+dmVjdG9yOworCQlpcnRlLT5sby5maWVsZHNfdmFwaWMuZ3Vlc3RfbW9kZSA9IDE7CisJCWlydGUtPmxvLmZpZWxkc192YXBpYy5nYV90YWcgPSBwaV9kYXRhLT5nYV90YWc7CisKKwkJaXJfZGF0YS0+Y2FjaGVkX2dhX3RhZyA9IHBpX2RhdGEtPmdhX3RhZzsKKwl9IGVsc2UgeworCQkvKiBVbi1TZXR0aW5nICovCisJCXN0cnVjdCBpcnFfY2ZnICpjZmcgPSBpcnFkX2NmZyhkYXRhKTsKKworCQlpcnRlLT5oaS52YWwgPSAwOworCQlpcnRlLT5sby52YWwgPSAwOworCQlpcnRlLT5oaS5maWVsZHMudmVjdG9yID0gY2ZnLT52ZWN0b3I7CisJCWlydGUtPmxvLmZpZWxkc19yZW1hcC5ndWVzdF9tb2RlID0gMDsKKwkJaXJ0ZS0+bG8uZmllbGRzX3JlbWFwLmRlc3RpbmF0aW9uID0gY2ZnLT5kZXN0X2FwaWNpZDsKKwkJaXJ0ZS0+bG8uZmllbGRzX3JlbWFwLmludF90eXBlID0gYXBpYy0+aXJxX2RlbGl2ZXJ5X21vZGU7CisJCWlydGUtPmxvLmZpZWxkc19yZW1hcC5kbSA9IGFwaWMtPmlycV9kZXN0X21vZGU7CisKKwkJLyoKKwkJICogVGhpcyBjb21tdW5pY2F0ZXMgdGhlIGdhX3RhZyBiYWNrIHRvIHRoZSBjYWxsZXIKKwkJICogc28gdGhhdCBpdCBjYW4gZG8gYWxsIHRoZSBuZWNlc3NhcnkgY2xlYW4gdXAuCisJCSAqLworCQlpcl9kYXRhLT5jYWNoZWRfZ2FfdGFnID0gMDsKKwl9CisKKwlyZXR1cm4gbW9kaWZ5X2lydGVfZ2EoaXJ0ZV9pbmZvLT5kZXZpZCwgaXJ0ZV9pbmZvLT5pbmRleCwgaXJ0ZSwgaXJfZGF0YSk7Cit9CisKIHN0YXRpYyBpbnQgYW1kX2lyX3NldF9hZmZpbml0eShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGJvb2wgZm9yY2UpCiB7CkBAIC0zOTc4LDggKzQzMjQsMTIgQEAKIAlzdHJ1Y3QgaXJxXzJfaXJ0ZSAqaXJ0ZV9pbmZvID0gJmlyX2RhdGEtPmlycV8yX2lydGU7CiAJc3RydWN0IGlycV9jZmcgKmNmZyA9IGlycWRfY2ZnKGRhdGEpOwogCXN0cnVjdCBpcnFfZGF0YSAqcGFyZW50ID0gZGF0YS0+cGFyZW50X2RhdGE7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXUgPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtpcnRlX2luZm8tPmRldmlkXTsKIAlpbnQgcmV0OwogCisJaWYgKCFpb21tdSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlyZXQgPSBwYXJlbnQtPmNoaXAtPmlycV9zZXRfYWZmaW5pdHkocGFyZW50LCBtYXNrLCBmb3JjZSk7CiAJaWYgKHJldCA8IDAgfHwgcmV0ID09IElSUV9TRVRfTUFTS19PS19ET05FKQogCQlyZXR1cm4gcmV0OwpAQCAtMzk4OCw5ICs0MzM4LDggQEAKIAkgKiBBdG9taWNhbGx5IHVwZGF0ZXMgdGhlIElSVEUgd2l0aCB0aGUgbmV3IGRlc3RpbmF0aW9uLCB2ZWN0b3IKIAkgKiBhbmQgZmx1c2hlcyB0aGUgaW50ZXJydXB0IGVudHJ5IGNhY2hlLgogCSAqLwotCWlyX2RhdGEtPmlydGVfZW50cnkuZmllbGRzLnZlY3RvciA9IGNmZy0+dmVjdG9yOwotCWlyX2RhdGEtPmlydGVfZW50cnkuZmllbGRzLmRlc3RpbmF0aW9uID0gY2ZnLT5kZXN0X2FwaWNpZDsKLQltb2RpZnlfaXJ0ZShpcnRlX2luZm8tPmRldmlkLCBpcnRlX2luZm8tPmluZGV4LCBpcl9kYXRhLT5pcnRlX2VudHJ5KTsKKwlpb21tdS0+aXJ0ZV9vcHMtPnNldF9hZmZpbml0eShpcl9kYXRhLT5lbnRyeSwgaXJ0ZV9pbmZvLT5kZXZpZCwKKwkJCSAgICBpcnRlX2luZm8tPmluZGV4LCBjZmctPnZlY3RvciwgY2ZnLT5kZXN0X2FwaWNpZCk7CiAKIAkvKgogCSAqIEFmdGVyIHRoaXMgcG9pbnQsIGFsbCB0aGUgaW50ZXJydXB0cyB3aWxsIHN0YXJ0IGFycml2aW5nCkBAIC00MDEyLDYgKzQzNjEsNyBAQAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBhbWRfaXJfY2hpcCA9IHsKIAkuaXJxX2FjayA9IGlyX2Fja19hcGljX2VkZ2UsCiAJLmlycV9zZXRfYWZmaW5pdHkgPSBhbWRfaXJfc2V0X2FmZmluaXR5LAorCS5pcnFfc2V0X3ZjcHVfYWZmaW5pdHkgPSBhbWRfaXJfc2V0X3ZjcHVfYWZmaW5pdHksCiAJLmlycV9jb21wb3NlX21zaV9tc2cgPSBpcl9jb21wb3NlX21zaV9tc2csCiB9OwogCkBAIC00MDI2LDQgKzQzNzYsNDMgQEAKIAogCXJldHVybiAwOwogfQorCitpbnQgYW1kX2lvbW11X3VwZGF0ZV9nYShpbnQgY3B1LCBib29sIGlzX3J1biwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OworCXN0cnVjdCBpcnFfcmVtYXBfdGFibGUgKmlydDsKKwlzdHJ1Y3QgYW1kX2lyX2RhdGEgKmlyX2RhdGEgPSAoc3RydWN0IGFtZF9pcl9kYXRhICopZGF0YTsKKwlpbnQgZGV2aWQgPSBpcl9kYXRhLT5pcnFfMl9pcnRlLmRldmlkOworCXN0cnVjdCBpcnRlX2dhICplbnRyeSA9IChzdHJ1Y3QgaXJ0ZV9nYSAqKSBpcl9kYXRhLT5lbnRyeTsKKwlzdHJ1Y3QgaXJ0ZV9nYSAqcmVmID0gKHN0cnVjdCBpcnRlX2dhICopIGlyX2RhdGEtPnJlZjsKKworCWlmICghQU1EX0lPTU1VX0dVRVNUX0lSX1ZBUElDKGFtZF9pb21tdV9ndWVzdF9pcikgfHwKKwkgICAgIXJlZiB8fCAhZW50cnkgfHwgIWVudHJ5LT5sby5maWVsZHNfdmFwaWMuZ3Vlc3RfbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlpb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2RldmlkXTsKKwlpZiAoIWlvbW11KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlydCA9IGdldF9pcnFfdGFibGUoZGV2aWQsIGZhbHNlKTsKKwlpZiAoIWlydCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJ0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAocmVmLT5sby5maWVsZHNfdmFwaWMuZ3Vlc3RfbW9kZSkgeworCQlpZiAoY3B1ID49IDApCisJCQlyZWYtPmxvLmZpZWxkc192YXBpYy5kZXN0aW5hdGlvbiA9IGNwdTsKKwkJcmVmLT5sby5maWVsZHNfdmFwaWMuaXNfcnVuID0gaXNfcnVuOworCQliYXJyaWVyKCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJ0LT5sb2NrLCBmbGFncyk7CisKKwlpb21tdV9mbHVzaF9pcnQoaW9tbXUsIGRldmlkKTsKKwlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChhbWRfaW9tbXVfdXBkYXRlX2dhKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfaW5pdC5jIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfaW5pdC5jCmluZGV4IDU5NzQxZWEuLmNkMTcxMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X2luaXQuYworKysgYi9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV9pbml0LmMKQEAgLTg0LDYgKzg0LDcgQEAKICNkZWZpbmUgQUNQSV9ERVZGTEFHX0xJTlQxICAgICAgICAgICAgICAweDgwCiAjZGVmaW5lIEFDUElfREVWRkxBR19BVFNESVMgICAgICAgICAgICAgMHgxMDAwMDAwMAogCisjZGVmaW5lIExPT1BfVElNRU9VVAkxMDAwMDAKIC8qCiAgKiBBQ1BJIHRhYmxlIGRlZmluaXRpb25zCiAgKgpAQCAtMTQ1LDYgKzE0Niw4IEBACiBib29sIGFtZF9pb21tdV9kdW1wOwogYm9vbCBhbWRfaW9tbXVfaXJxX3JlbWFwIF9fcmVhZF9tb3N0bHk7CiAKK2ludCBhbWRfaW9tbXVfZ3Vlc3RfaXIgPSBBTURfSU9NTVVfR1VFU1RfSVJfVkFQSUM7CisKIHN0YXRpYyBib29sIGFtZF9pb21tdV9kZXRlY3RlZDsKIHN0YXRpYyBib29sIF9faW5pdGRhdGEgYW1kX2lvbW11X2Rpc2FibGVkOwogc3RhdGljIGludCBhbWRfaW9tbXVfdGFyZ2V0X2l2aGRfdHlwZTsKQEAgLTM4Niw2ICszODksMTAgQEAKIAlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfRVZUX0lOVF9FTik7CiAJaW9tbXVfZmVhdHVyZV9kaXNhYmxlKGlvbW11LCBDT05UUk9MX0VWVF9MT0dfRU4pOwogCisJLyogRGlzYWJsZSBJT01NVSBHQV9MT0cgKi8KKwlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfR0FMT0dfRU4pOworCWlvbW11X2ZlYXR1cmVfZGlzYWJsZShpb21tdSwgQ09OVFJPTF9HQUlOVF9FTik7CisKIAkvKiBEaXNhYmxlIElPTU1VIGhhcmR3YXJlIGl0c2VsZiAqLwogCWlvbW11X2ZlYXR1cmVfZGlzYWJsZShpb21tdSwgQ09OVFJPTF9JT01NVV9FTik7CiB9CkBAIC02NzEsNiArNjc4LDk5IEBACiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylpb21tdS0+cHByX2xvZywgZ2V0X29yZGVyKFBQUl9MT0dfU0laRSkpOwogfQogCitzdGF0aWMgdm9pZCBmcmVlX2dhX2xvZyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKyNpZmRlZiBDT05GSUdfSVJRX1JFTUFQCisJaWYgKGlvbW11LT5nYV9sb2cpCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW9tbXUtPmdhX2xvZywKKwkJCSAgICBnZXRfb3JkZXIoR0FfTE9HX1NJWkUpKTsKKwlpZiAoaW9tbXUtPmdhX2xvZ190YWlsKQorCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWlvbW11LT5nYV9sb2dfdGFpbCwKKwkJCSAgICBnZXRfb3JkZXIoOCkpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgaW9tbXVfZ2FfbG9nX2VuYWJsZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKyNpZmRlZiBDT05GSUdfSVJRX1JFTUFQCisJdTMyIHN0YXR1cywgaTsKKworCWlmICghaW9tbXUtPmdhX2xvZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzdGF0dXMgPSByZWFkbChpb21tdS0+bW1pb19iYXNlICsgTU1JT19TVEFUVVNfT0ZGU0VUKTsKKworCS8qIENoZWNrIGlmIGFscmVhZHkgcnVubmluZyAqLworCWlmIChzdGF0dXMgJiAoTU1JT19TVEFUVVNfR0FMT0dfUlVOX01BU0spKQorCQlyZXR1cm4gMDsKKworCWlvbW11X2ZlYXR1cmVfZW5hYmxlKGlvbW11LCBDT05UUk9MX0dBSU5UX0VOKTsKKwlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9HQUxPR19FTik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUF9USU1FT1VUOyArK2kpIHsKKwkJc3RhdHVzID0gcmVhZGwoaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fU1RBVFVTX09GRlNFVCk7CisJCWlmIChzdGF0dXMgJiAoTU1JT19TVEFUVVNfR0FMT0dfUlVOX01BU0spKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPj0gTE9PUF9USU1FT1VUKQorCQlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZiAvKiBDT05GSUdfSVJRX1JFTUFQICovCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfSVJRX1JFTUFQCitzdGF0aWMgaW50IGlvbW11X2luaXRfZ2FfbG9nKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCXU2NCBlbnRyeTsKKworCWlmICghQU1EX0lPTU1VX0dVRVNUX0lSX1ZBUElDKGFtZF9pb21tdV9ndWVzdF9pcikpCisJCXJldHVybiAwOworCisJaW9tbXUtPmdhX2xvZyA9ICh1OCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCisJCQkJCWdldF9vcmRlcihHQV9MT0dfU0laRSkpOworCWlmICghaW9tbXUtPmdhX2xvZykKKwkJZ290byBlcnJfb3V0OworCisJaW9tbXUtPmdhX2xvZ190YWlsID0gKHU4ICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywKKwkJCQkJZ2V0X29yZGVyKDgpKTsKKwlpZiAoIWlvbW11LT5nYV9sb2dfdGFpbCkKKwkJZ290byBlcnJfb3V0OworCisJZW50cnkgPSAodTY0KXZpcnRfdG9fcGh5cyhpb21tdS0+Z2FfbG9nKSB8IEdBX0xPR19TSVpFXzUxMjsKKwltZW1jcHlfdG9pbyhpb21tdS0+bW1pb19iYXNlICsgTU1JT19HQV9MT0dfQkFTRV9PRkZTRVQsCisJCSAgICAmZW50cnksIHNpemVvZihlbnRyeSkpOworCWVudHJ5ID0gKCh1NjQpdmlydF90b19waHlzKGlvbW11LT5nYV9sb2cpICYgMHhGRkZGRkZGRkZGRkZGVUxMKSAmIH43VUxMOworCW1lbWNweV90b2lvKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0dBX0xPR19UQUlMX09GRlNFVCwKKwkJICAgICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7CisJd3JpdGVsKDB4MDAsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0dBX0hFQURfT0ZGU0VUKTsKKwl3cml0ZWwoMHgwMCwgaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fR0FfVEFJTF9PRkZTRVQpOworCisJcmV0dXJuIDA7CitlcnJfb3V0OgorCWZyZWVfZ2FfbG9nKGlvbW11KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfSVJRX1JFTUFQICovCisKK3N0YXRpYyBpbnQgaW9tbXVfaW5pdF9nYShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwlpbnQgcmV0ID0gMDsKKworI2lmZGVmIENPTkZJR19JUlFfUkVNQVAKKwkvKiBOb3RlOiBXZSBoYXZlIGFscmVhZHkgY2hlY2tlZCBHQVN1cCBmcm9tIElWUlMgdGFibGUuCisJICogICAgICAgTm93LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IEdBTVN1cCBpcyBzZXQuCisJICovCisJaWYgKEFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQyhhbWRfaW9tbXVfZ3Vlc3RfaXIpICYmCisJICAgICFpb21tdV9mZWF0dXJlKGlvbW11LCBGRUFUVVJFX0dBTV9WQVBJQykpCisJCWFtZF9pb21tdV9ndWVzdF9pciA9IEFNRF9JT01NVV9HVUVTVF9JUl9MRUdBQ1lfR0E7CisKKwlyZXQgPSBpb21tdV9pbml0X2dhX2xvZyhpb21tdSk7CisjZW5kaWYgLyogQ09ORklHX0lSUV9SRU1BUCAqLworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgaW9tbXVfZW5hYmxlX2d0KHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQogewogCWlmICghaW9tbXVfZmVhdHVyZShpb21tdSwgRkVBVFVSRV9HVCkpCkBAIC0xMTQ0LDYgKzEyNDQsNyBAQAogCWZyZWVfY29tbWFuZF9idWZmZXIoaW9tbXUpOwogCWZyZWVfZXZlbnRfYnVmZmVyKGlvbW11KTsKIAlmcmVlX3Bwcl9sb2coaW9tbXUpOworCWZyZWVfZ2FfbG9nKGlvbW11KTsKIAlpb21tdV91bm1hcF9tbWlvX3NwYWNlKGlvbW11KTsKIH0KIApAQCAtMTI1OCw2ICsxMzU5LDggQEAKIAkJCWlvbW11LT5tbWlvX3BoeXNfZW5kID0gTU1JT19SRUdfRU5EX09GRlNFVDsKIAkJZWxzZQogCQkJaW9tbXUtPm1taW9fcGh5c19lbmQgPSBNTUlPX0NOVFJfQ09ORl9PRkZTRVQ7CisJCWlmICgoKGgtPmVmcl9hdHRyICYgKDB4MSA8PCBJT01NVV9GRUFUX0dBU1VQX1NISUZUKSkgPT0gMCkpCisJCQlhbWRfaW9tbXVfZ3Vlc3RfaXIgPSBBTURfSU9NTVVfR1VFU1RfSVJfTEVHQUNZOwogCQlicmVhazsKIAljYXNlIDB4MTE6CiAJY2FzZSAweDQwOgpAQCAtMTI2NSw2ICsxMzY4LDggQEAKIAkJCWlvbW11LT5tbWlvX3BoeXNfZW5kID0gTU1JT19SRUdfRU5EX09GRlNFVDsKIAkJZWxzZQogCQkJaW9tbXUtPm1taW9fcGh5c19lbmQgPSBNTUlPX0NOVFJfQ09ORl9PRkZTRVQ7CisJCWlmICgoKGgtPmVmcl9yZWcgJiAoMHgxIDw8IElPTU1VX0VGUl9HQVNVUF9TSElGVCkpID09IDApKQorCQkJYW1kX2lvbW11X2d1ZXN0X2lyID0gQU1EX0lPTU1VX0dVRVNUX0lSX0xFR0FDWTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNDMyLDYgKzE1MzcsNyBAQAogewogCWludCBjYXBfcHRyID0gaW9tbXUtPmNhcF9wdHI7CiAJdTMyIHJhbmdlLCBtaXNjLCBsb3csIGhpZ2g7CisJaW50IHJldDsKIAogCWlvbW11LT5kZXYgPSBwY2lfZ2V0X2J1c19hbmRfc2xvdChQQ0lfQlVTX05VTShpb21tdS0+ZGV2aWQpLAogCQkJCQkgIGlvbW11LT5kZXZpZCAmIDB4ZmYpOwpAQCAtMTQ4OCw2ICsxNTk0LDEwIEBACiAJaWYgKGlvbW11X2ZlYXR1cmUoaW9tbXUsIEZFQVRVUkVfUFBSKSAmJiBhbGxvY19wcHJfbG9nKGlvbW11KSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlyZXQgPSBpb21tdV9pbml0X2dhKGlvbW11KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJaWYgKGlvbW11LT5jYXAgJiAoMVVMIDw8IElPTU1VX0NBUF9OUENBQ0hFKSkKIAkJYW1kX2lvbW11X25wX2NhY2hlID0gdHJ1ZTsKIApAQCAtMTU0NSwxNiArMTY1NSwyNCBAQAogCQkJZGV2X25hbWUoJmlvbW11LT5kZXYtPmRldiksIGlvbW11LT5jYXBfcHRyKTsKIAogCQlpZiAoaW9tbXUtPmNhcCAmICgxIDw8IElPTU1VX0NBUF9FRlIpKSB7Ci0JCQlwcl9pbmZvKCJBTUQtVmk6ICBFeHRlbmRlZCBmZWF0dXJlczogIik7CisJCQlwcl9pbmZvKCJBTUQtVmk6IEV4dGVuZGVkIGZlYXR1cmVzICglI2xseCk6XG4iLAorCQkJCWlvbW11LT5mZWF0dXJlcyk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmZWF0X3N0cik7ICsraSkgewogCQkJCWlmIChpb21tdV9mZWF0dXJlKGlvbW11LCAoMVVMTCA8PCBpKSkpCiAJCQkJCXByX2NvbnQoIiAlcyIsIGZlYXRfc3RyW2ldKTsKIAkJCX0KKworCQkJaWYgKGlvbW11LT5mZWF0dXJlcyAmIEZFQVRVUkVfR0FNX1ZBUElDKQorCQkJCXByX2NvbnQoIiBHQV92QVBJQyIpOworCiAJCQlwcl9jb250KCJcbiIpOwogCQl9CiAJfQotCWlmIChpcnFfcmVtYXBwaW5nX2VuYWJsZWQpCisJaWYgKGlycV9yZW1hcHBpbmdfZW5hYmxlZCkgewogCQlwcl9pbmZvKCJBTUQtVmk6IEludGVycnVwdCByZW1hcHBpbmcgZW5hYmxlZFxuIik7CisJCWlmIChBTURfSU9NTVVfR1VFU1RfSVJfVkFQSUMoYW1kX2lvbW11X2d1ZXN0X2lyKSkKKwkJCXByX2luZm8oIkFNRC1WaTogdmlydHVhbCBBUElDIGVuYWJsZWRcbiIpOworCX0KIH0KIAogc3RhdGljIGludCBfX2luaXQgYW1kX2lvbW11X2luaXRfcGNpKHZvaWQpCkBAIC0xNjQ1LDYgKzE3NjMsOCBAQAogCWlmIChpb21tdS0+cHByX2xvZyAhPSBOVUxMKQogCQlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9QUEZJTlRfRU4pOwogCisJaW9tbXVfZ2FfbG9nX2VuYWJsZShpb21tdSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTg2Miw2ICsxOTgyLDI0IEBACiAJCQkgICAgICAgaW9tbXUtPnN0b3JlZF9hZGRyX2xvIHwgMSk7CiB9CiAKK3N0YXRpYyB2b2lkIGlvbW11X2VuYWJsZV9nYShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKyNpZmRlZiBDT05GSUdfSVJRX1JFTUFQCisJc3dpdGNoIChhbWRfaW9tbXVfZ3Vlc3RfaXIpIHsKKwljYXNlIEFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQzoKKwkJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfR0FNX0VOKTsKKwkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBBTURfSU9NTVVfR1VFU1RfSVJfTEVHQUNZX0dBOgorCQlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9HQV9FTik7CisJCWlvbW11LT5pcnRlX29wcyA9ICZpcnRlXzEyOF9vcHM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlvbW11LT5pcnRlX29wcyA9ICZpcnRlXzMyX29wczsKKwkJYnJlYWs7CisJfQorI2VuZGlmCit9CisKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGZpbmFsbHkgZW5hYmxlcyBhbGwgSU9NTVVzIGZvdW5kIGluIHRoZSBzeXN0ZW0gYWZ0ZXIKICAqIHRoZXkgaGF2ZSBiZWVuIGluaXRpYWxpemVkCkBAIC0xODc3LDkgKzIwMTUsMTUgQEAKIAkJaW9tbXVfZW5hYmxlX2NvbW1hbmRfYnVmZmVyKGlvbW11KTsKIAkJaW9tbXVfZW5hYmxlX2V2ZW50X2J1ZmZlcihpb21tdSk7CiAJCWlvbW11X3NldF9leGNsdXNpb25fcmFuZ2UoaW9tbXUpOworCQlpb21tdV9lbmFibGVfZ2EoaW9tbXUpOwogCQlpb21tdV9lbmFibGUoaW9tbXUpOwogCQlpb21tdV9mbHVzaF9hbGxfY2FjaGVzKGlvbW11KTsKIAl9CisKKyNpZmRlZiBDT05GSUdfSVJRX1JFTUFQCisJaWYgKEFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQyhhbWRfaW9tbXVfZ3Vlc3RfaXIpKQorCQlhbWRfaW9tbXVfaXJxX29wcy5jYXBhYmlsaXR5IHw9ICgxIDw8IElSUV9QT1NUSU5HX0NBUCk7CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX2lvbW11c192Mih2b2lkKQpAQCAtMTkwNSw2ICsyMDQ5LDExIEBACiAKIAlmb3JfZWFjaF9pb21tdShpb21tdSkKIAkJaW9tbXVfZGlzYWJsZShpb21tdSk7CisKKyNpZmRlZiBDT05GSUdfSVJRX1JFTUFQCisJaWYgKEFNRF9JT01NVV9HVUVTVF9JUl9WQVBJQyhhbWRfaW9tbXVfZ3Vlc3RfaXIpKQorCQlhbWRfaW9tbXVfaXJxX29wcy5jYXBhYmlsaXR5ICY9IH4oMSA8PCBJUlFfUE9TVElOR19DQVApOworI2VuZGlmCiB9CiAKIC8qCkBAIC0yMDU5LDcgKzIyMDgsNyBAQAogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaXZyc19iYXNlOwogCWFjcGlfc2l6ZSBpdnJzX3NpemU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCWludCBpLCByZXQgPSAwOworCWludCBpLCByZW1hcF9jYWNoZV9zeiwgcmV0ID0gMDsKIAogCWlmICghYW1kX2lvbW11X2RldGVjdGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTIxNTcsMTAgKzIzMDYsMTQgQEAKIAkJICogcmVtYXBwaW5nIHRhYmxlcy4KIAkJICovCiAJCXJldCA9IC1FTk9NRU07CisJCWlmICghQU1EX0lPTU1VX0dVRVNUX0lSX0dBKGFtZF9pb21tdV9ndWVzdF9pcikpCisJCQlyZW1hcF9jYWNoZV9zeiA9IE1BWF9JUlFTX1BFUl9UQUJMRSAqIHNpemVvZih1MzIpOworCQllbHNlCisJCQlyZW1hcF9jYWNoZV9zeiA9IE1BWF9JUlFTX1BFUl9UQUJMRSAqIChzaXplb2YodTY0KSAqIDIpOwogCQlhbWRfaW9tbXVfaXJxX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImlycV9yZW1hcF9jYWNoZSIsCi0JCQkJTUFYX0lSUVNfUEVSX1RBQkxFICogc2l6ZW9mKHUzMiksCi0JCQkJSVJRX1RBQkxFX0FMSUdOTUVOVCwKLQkJCQkwLCBOVUxMKTsKKwkJCQkJCQlyZW1hcF9jYWNoZV9zeiwKKwkJCQkJCQlJUlFfVEFCTEVfQUxJR05NRU5ULAorCQkJCQkJCTAsIE5VTEwpOwogCQlpZiAoIWFtZF9pb21tdV9pcnFfY2FjaGUpCiAJCQlnb3RvIG91dDsKIApAQCAtMjQxMyw2ICsyNTY2LDIxIEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2FtZF9pb21tdV9pbnRyKGNoYXIgKnN0cikKK3sKKwlmb3IgKDsgKnN0cjsgKytzdHIpIHsKKwkJaWYgKHN0cm5jbXAoc3RyLCAibGVnYWN5IiwgNikgPT0gMCkgeworCQkJYW1kX2lvbW11X2d1ZXN0X2lyID0gQU1EX0lPTU1VX0dVRVNUX0lSX0xFR0FDWTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJuY21wKHN0ciwgInZhcGljIiwgNSkgPT0gMCkgeworCQkJYW1kX2lvbW11X2d1ZXN0X2lyID0gQU1EX0lPTU1VX0dVRVNUX0lSX1ZBUElDOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2FtZF9pb21tdV9vcHRpb25zKGNoYXIgKnN0cikKIHsKIAlmb3IgKDsgKnN0cjsgKytzdHIpIHsKQEAgLTI1MjEsNiArMjY4OSw3IEBACiAKIF9fc2V0dXAoImFtZF9pb21tdV9kdW1wIiwJcGFyc2VfYW1kX2lvbW11X2R1bXApOwogX19zZXR1cCgiYW1kX2lvbW11PSIsCQlwYXJzZV9hbWRfaW9tbXVfb3B0aW9ucyk7CitfX3NldHVwKCJhbWRfaW9tbXVfaW50cj0iLAlwYXJzZV9hbWRfaW9tbXVfaW50cik7CiBfX3NldHVwKCJpdnJzX2lvYXBpYyIsCQlwYXJzZV9pdnJzX2lvYXBpYyk7CiBfX3NldHVwKCJpdnJzX2hwZXQiLAkJcGFyc2VfaXZyc19ocGV0KTsKIF9fc2V0dXAoIml2cnNfYWNwaWhpZCIsCQlwYXJzZV9pdnJzX2FjcGloaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfcHJvdG8uaCBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X3Byb3RvLmgKaW5kZXggMGJkOWViMy4uZmFhM2I0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfcHJvdG8uaAorKysgYi9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV9wcm90by5oCkBAIC0zOCw2ICszOCw3IEBACiBleHRlcm4gdm9pZCBhbWRfaW9tbXVfZGlzYWJsZSh2b2lkKTsKIGV4dGVybiBpbnQgYW1kX2lvbW11X3JlZW5hYmxlKGludCk7CiBleHRlcm4gaW50IGFtZF9pb21tdV9lbmFibGVfZmF1bHRpbmcodm9pZCk7CitleHRlcm4gaW50IGFtZF9pb21tdV9ndWVzdF9pcjsKIAogLyogSU9NTVV2MiBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KIHN0cnVjdCBpb21tdV9kb21haW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV90eXBlcy5oIGIvZHJpdmVycy9pb21tdS9hbWRfaW9tbXVfdHlwZXMuaAppbmRleCBjYWY1ZTM4Li4wZDkxNzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2FtZF9pb21tdV90eXBlcy5oCisrKyBiL2RyaXZlcnMvaW9tbXUvYW1kX2lvbW11X3R5cGVzLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tc2kuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTY5LDYgKzcwLDggQEAKICNkZWZpbmUgTU1JT19FWENMX0xJTUlUX09GRlNFVCAgMHgwMDI4CiAjZGVmaW5lIE1NSU9fRVhUX0ZFQVRVUkVTCTB4MDAzMAogI2RlZmluZSBNTUlPX1BQUl9MT0dfT0ZGU0VUCTB4MDAzOAorI2RlZmluZSBNTUlPX0dBX0xPR19CQVNFX09GRlNFVAkweDAwZTAKKyNkZWZpbmUgTU1JT19HQV9MT0dfVEFJTF9PRkZTRVQJMHgwMGU4CiAjZGVmaW5lIE1NSU9fQ01EX0hFQURfT0ZGU0VUCTB4MjAwMAogI2RlZmluZSBNTUlPX0NNRF9UQUlMX09GRlNFVAkweDIwMDgKICNkZWZpbmUgTU1JT19FVlRfSEVBRF9PRkZTRVQJMHgyMDEwCkBAIC03Niw2ICs3OSw4IEBACiAjZGVmaW5lIE1NSU9fU1RBVFVTX09GRlNFVAkweDIwMjAKICNkZWZpbmUgTU1JT19QUFJfSEVBRF9PRkZTRVQJMHgyMDMwCiAjZGVmaW5lIE1NSU9fUFBSX1RBSUxfT0ZGU0VUCTB4MjAzOAorI2RlZmluZSBNTUlPX0dBX0hFQURfT0ZGU0VUCTB4MjA0MAorI2RlZmluZSBNTUlPX0dBX1RBSUxfT0ZGU0VUCTB4MjA0OAogI2RlZmluZSBNTUlPX0NOVFJfQ09ORl9PRkZTRVQJMHg0MDAwCiAjZGVmaW5lIE1NSU9fQ05UUl9SRUdfT0ZGU0VUCTB4NDAwMDAKICNkZWZpbmUgTU1JT19SRUdfRU5EX09GRlNFVAkweDgwMDAwCkBAIC05Miw2ICs5Nyw3IEBACiAjZGVmaW5lIEZFQVRVUkVfR0EJCSgxVUxMPDw3KQogI2RlZmluZSBGRUFUVVJFX0hFCQkoMVVMTDw8OCkKICNkZWZpbmUgRkVBVFVSRV9QQwkJKDFVTEw8PDkpCisjZGVmaW5lIEZFQVRVUkVfR0FNX1ZBUElDCSgxVUxMPDwyMSkKIAogI2RlZmluZSBGRUFUVVJFX1BBU0lEX1NISUZUCTMyCiAjZGVmaW5lIEZFQVRVUkVfUEFTSURfTUFTSwkoMHgxZlVMTCA8PCBGRUFUVVJFX1BBU0lEX1NISUZUKQpAQCAtMTEwLDYgKzExNiw5IEBACiAjZGVmaW5lIE1NSU9fU1RBVFVTX0VWVF9JTlRfTUFTSwkoMSA8PCAxKQogI2RlZmluZSBNTUlPX1NUQVRVU19DT01fV0FJVF9JTlRfTUFTSwkoMSA8PCAyKQogI2RlZmluZSBNTUlPX1NUQVRVU19QUFJfSU5UX01BU0sJKDEgPDwgNikKKyNkZWZpbmUgTU1JT19TVEFUVVNfR0FMT0dfUlVOX01BU0sJKDEgPDwgOCkKKyNkZWZpbmUgTU1JT19TVEFUVVNfR0FMT0dfT1ZFUkZMT1dfTUFTSwkoMSA8PCA5KQorI2RlZmluZSBNTUlPX1NUQVRVU19HQUxPR19JTlRfTUFTSwkoMSA8PCAxMCkKIAogLyogZXZlbnQgbG9nZ2luZyBjb25zdGFudHMgKi8KICNkZWZpbmUgRVZFTlRfRU5UUllfU0laRQkweDEwCkBAIC0xNDYsNiArMTU1LDEwIEBACiAjZGVmaW5lIENPTlRST0xfUFBGSU5UX0VOICAgICAgIDB4MGVVTEwKICNkZWZpbmUgQ09OVFJPTF9QUFJfRU4gICAgICAgICAgMHgwZlVMTAogI2RlZmluZSBDT05UUk9MX0dUX0VOICAgICAgICAgICAweDEwVUxMCisjZGVmaW5lIENPTlRST0xfR0FfRU4gICAgICAgICAgIDB4MTFVTEwKKyNkZWZpbmUgQ09OVFJPTF9HQU1fRU4gICAgICAgICAgMHgxOVVMTAorI2RlZmluZSBDT05UUk9MX0dBTE9HX0VOICAgICAgICAweDFDVUxMCisjZGVmaW5lIENPTlRST0xfR0FJTlRfRU4gICAgICAgIDB4MURVTEwKIAogI2RlZmluZSBDVFJMX0lOVl9UT19NQVNLCSg3IDw8IENPTlRST0xfSU5WX1RJTUVPVVQpCiAjZGVmaW5lIENUUkxfSU5WX1RPX05PTkUJMApAQCAtMjI0LDYgKzIzNywxOSBAQAogCiAjZGVmaW5lIFBQUl9SRVFfRkFVTFQJCTB4MDEKIAorLyogQ29uc3RhbnRzIGZvciBHQSBMb2cgaGFuZGxpbmcgKi8KKyNkZWZpbmUgR0FfTE9HX0VOVFJJRVMJCTUxMgorI2RlZmluZSBHQV9MT0dfU0laRV9TSElGVAk1NgorI2RlZmluZSBHQV9MT0dfU0laRV81MTIJCSgweDhVTEwgPDwgR0FfTE9HX1NJWkVfU0hJRlQpCisjZGVmaW5lIEdBX0VOVFJZX1NJWkUJCTgKKyNkZWZpbmUgR0FfTE9HX1NJWkUJCShHQV9FTlRSWV9TSVpFICogR0FfTE9HX0VOVFJJRVMpCisKKyNkZWZpbmUgR0FfVEFHKHgpCQkodTMyKSh4ICYgMHhmZmZmZmZmZlVMTCkKKyNkZWZpbmUgR0FfREVWSUQoeCkJCSh1MTYpKCgoeCkgPj4gMzIpICYgMHhmZmZmVUxMKQorI2RlZmluZSBHQV9SRVFfVFlQRSh4KQkJKCgoeCkgPj4gNjApICYgMHhmVUxMKQorCisjZGVmaW5lIEdBX0dVRVNUX05SCQkweDEKKwogI2RlZmluZSBQQUdFX01PREVfTk9ORSAgICAweDAwCiAjZGVmaW5lIFBBR0VfTU9ERV8xX0xFVkVMIDB4MDEKICNkZWZpbmUgUEFHRV9NT0RFXzJfTEVWRUwgMHgwMgpAQCAtMzI5LDYgKzM1NSwxMiBAQAogI2RlZmluZSBJT01NVV9DQVBfTlBDQUNIRSAyNgogI2RlZmluZSBJT01NVV9DQVBfRUZSICAgICAyNwogCisvKiBJT01NVSBGZWF0dXJlIFJlcG9ydGluZyBGaWVsZCAoZm9yIElWSEQgdHlwZSAxMGggKi8KKyNkZWZpbmUgSU9NTVVfRkVBVF9HQVNVUF9TSElGVAk2CisKKy8qIElPTU1VIEV4dGVuZGVkIEZlYXR1cmUgUmVnaXN0ZXIgKEVGUikgKi8KKyNkZWZpbmUgSU9NTVVfRUZSX0dBU1VQX1NISUZUCTcKKwogI2RlZmluZSBNQVhfRE9NQUlOX0lEIDY1NTM2CiAKIC8qIFByb3RlY3Rpb24gZG9tYWluIGZsYWdzICovCkBAIC00MDAsNiArNDMyLDcgQEAKIAogc3RydWN0IGlvbW11X2RvbWFpbjsKIHN0cnVjdCBpcnFfZG9tYWluOworc3RydWN0IGFtZF9pcnRlX29wczsKIAogLyoKICAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGdlbmVyaWMgZGF0YSBmb3IgIElPTU1VIHByb3RlY3Rpb24gZG9tYWlucwpAQCAtNDkwLDYgKzUyMywxMiBAQAogCS8qIEJhc2Ugb2YgdGhlIFBQUiBsb2csIGlmIHByZXNlbnQgKi8KIAl1OCAqcHByX2xvZzsKIAorCS8qIEJhc2Ugb2YgdGhlIEdBIGxvZywgaWYgcHJlc2VudCAqLworCXU4ICpnYV9sb2c7CisKKwkvKiBUYWlsIG9mIHRoZSBHQSBsb2csIGlmIHByZXNlbnQgKi8KKwl1OCAqZ2FfbG9nX3RhaWw7CisKIAkvKiB0cnVlIGlmIGludGVycnVwdHMgZm9yIHRoaXMgSU9NTVUgYXJlIGFscmVhZHkgZW5hYmxlZCAqLwogCWJvb2wgaW50X2VuYWJsZWQ7CiAKQEAgLTUyMyw3ICs1NjIsMTEgQEAKICNpZmRlZiBDT05GSUdfSVJRX1JFTUFQCiAJc3RydWN0IGlycV9kb21haW4gKmlyX2RvbWFpbjsKIAlzdHJ1Y3QgaXJxX2RvbWFpbiAqbXNpX2RvbWFpbjsKKworCXN0cnVjdCBhbWRfaXJ0ZV9vcHMgKmlydGVfb3BzOwogI2VuZGlmCisKKwl2b2xhdGlsZSB1NjQgX19hbGlnbmVkKDgpIGNtZF9zZW07CiB9OwogCiAjZGVmaW5lIEFDUElISURfVUlEX0xFTiAyNTYKQEAgLTY4MSw0ICs3MjQsMTEyIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK2VudW0gYW1kX2lvbW11X2ludHJfbW9kZV90eXBlIHsKKwlBTURfSU9NTVVfR1VFU1RfSVJfTEVHQUNZLAorCisJLyogVGhpcyBtb2RlIGlzIG5vdCB2aXNpYmxlIHRvIHVzZXJzLiBJdCBpcyB1c2VkIHdoZW4KKwkgKiB3ZSBjYW5ub3QgZnVsbHkgZW5hYmxlIHZBUElDIGFuZCBmYWxsYmFjayB0byBvbmx5IHN1cHBvcnQKKwkgKiBsZWdhY3kgaW50ZXJydXB0IHJlbWFwcGluZyB2aWEgMTI4LWJpdCBJUlRFLgorCSAqLworCUFNRF9JT01NVV9HVUVTVF9JUl9MRUdBQ1lfR0EsCisJQU1EX0lPTU1VX0dVRVNUX0lSX1ZBUElDLAorfTsKKworI2RlZmluZSBBTURfSU9NTVVfR1VFU1RfSVJfR0EoeCkJKHggPT0gQU1EX0lPTU1VX0dVRVNUX0lSX1ZBUElDIHx8IFwKKwkJCQkJIHggPT0gQU1EX0lPTU1VX0dVRVNUX0lSX0xFR0FDWV9HQSkKKworI2RlZmluZSBBTURfSU9NTVVfR1VFU1RfSVJfVkFQSUMoeCkJKHggPT0gQU1EX0lPTU1VX0dVRVNUX0lSX1ZBUElDKQorCit1bmlvbiBpcnRlIHsKKwl1MzIgdmFsOworCXN0cnVjdCB7CisJCXUzMiB2YWxpZAk6IDEsCisJCSAgICBub19mYXVsdAk6IDEsCisJCSAgICBpbnRfdHlwZQk6IDMsCisJCSAgICBycV9lb2kJOiAxLAorCQkgICAgZG0JCTogMSwKKwkJICAgIHJzdmRfMQk6IDEsCisJCSAgICBkZXN0aW5hdGlvbgk6IDgsCisJCSAgICB2ZWN0b3IJOiA4LAorCQkgICAgcnN2ZF8yCTogODsKKwl9IGZpZWxkczsKK307CisKK3VuaW9uIGlydGVfZ2FfbG8geworCXU2NCB2YWw7CisKKwkvKiBGb3IgaW50IHJlbWFwcGluZyAqLworCXN0cnVjdCB7CisJCXU2NCB2YWxpZAk6IDEsCisJCSAgICBub19mYXVsdAk6IDEsCisJCSAgICAvKiAtLS0tLS0gKi8KKwkJICAgIGludF90eXBlCTogMywKKwkJICAgIHJxX2VvaQk6IDEsCisJCSAgICBkbQkJOiAxLAorCQkgICAgLyogLS0tLS0tICovCisJCSAgICBndWVzdF9tb2RlCTogMSwKKwkJICAgIGRlc3RpbmF0aW9uCTogOCwKKwkJICAgIHJzdmQJOiA0ODsKKwl9IGZpZWxkc19yZW1hcDsKKworCS8qIEZvciBndWVzdCB2QVBJQyAqLworCXN0cnVjdCB7CisJCXU2NCB2YWxpZAk6IDEsCisJCSAgICBub19mYXVsdAk6IDEsCisJCSAgICAvKiAtLS0tLS0gKi8KKwkJICAgIGdhX2xvZ19pbnRyCTogMSwKKwkJICAgIHJzdmQxCTogMywKKwkJICAgIGlzX3J1bgk6IDEsCisJCSAgICAvKiAtLS0tLS0gKi8KKwkJICAgIGd1ZXN0X21vZGUJOiAxLAorCQkgICAgZGVzdGluYXRpb24JOiA4LAorCQkgICAgcnN2ZDIJOiAxNiwKKwkJICAgIGdhX3RhZwk6IDMyOworCX0gZmllbGRzX3ZhcGljOworfTsKKwordW5pb24gaXJ0ZV9nYV9oaSB7CisJdTY0IHZhbDsKKwlzdHJ1Y3QgeworCQl1NjQgdmVjdG9yCTogOCwKKwkJICAgIHJzdmRfMQk6IDQsCisJCSAgICBnYV9yb290X3B0cgk6IDQwLAorCQkgICAgcnN2ZF8yCTogMTI7CisJfSBmaWVsZHM7Cit9OworCitzdHJ1Y3QgaXJ0ZV9nYSB7CisJdW5pb24gaXJ0ZV9nYV9sbyBsbzsKKwl1bmlvbiBpcnRlX2dhX2hpIGhpOworfTsKKworc3RydWN0IGlycV8yX2lydGUgeworCXUxNiBkZXZpZDsgLyogRGV2aWNlIElEIGZvciBJUlRFIHRhYmxlICovCisJdTE2IGluZGV4OyAvKiBJbmRleCBpbnRvIElSVEUgdGFibGUqLworfTsKKworc3RydWN0IGFtZF9pcl9kYXRhIHsKKwl1MzIgY2FjaGVkX2dhX3RhZzsKKwlzdHJ1Y3QgaXJxXzJfaXJ0ZSBpcnFfMl9pcnRlOworCXN0cnVjdCBtc2lfbXNnIG1zaV9lbnRyeTsKKwl2b2lkICplbnRyeTsgICAgLyogUG9pbnRlciB0byB1bmlvbiBpcnRlIG9yIHN0cnVjdCBpcnRlX2dhICovCisJdm9pZCAqcmVmOyAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGFjdHVhbCBpcnRlICovCit9OworCitzdHJ1Y3QgYW1kX2lydGVfb3BzIHsKKwl2b2lkICgqcHJlcGFyZSkodm9pZCAqLCB1MzIsIHUzMiwgdTgsIHUzMiwgaW50KTsKKwl2b2lkICgqYWN0aXZhdGUpKHZvaWQgKiwgdTE2LCB1MTYpOworCXZvaWQgKCpkZWFjdGl2YXRlKSh2b2lkICosIHUxNiwgdTE2KTsKKwl2b2lkICgqc2V0X2FmZmluaXR5KSh2b2lkICosIHUxNiwgdTE2LCB1OCwgdTMyKTsKKwl2b2lkICooKmdldCkoc3RydWN0IGlycV9yZW1hcF90YWJsZSAqLCBpbnQpOworCXZvaWQgKCpzZXRfYWxsb2NhdGVkKShzdHJ1Y3QgaXJxX3JlbWFwX3RhYmxlICosIGludCk7CisJYm9vbCAoKmlzX2FsbG9jYXRlZCkoc3RydWN0IGlycV9yZW1hcF90YWJsZSAqLCBpbnQpOworCXZvaWQgKCpjbGVhcl9hbGxvY2F0ZWQpKHN0cnVjdCBpcnFfcmVtYXBfdGFibGUgKiwgaW50KTsKK307CisKKyNpZmRlZiBDT05GSUdfSVJRX1JFTUFQCitleHRlcm4gc3RydWN0IGFtZF9pcnRlX29wcyBpcnRlXzMyX29wczsKK2V4dGVybiBzdHJ1Y3QgYW1kX2lydGVfb3BzIGlydGVfMTI4X29wczsKKyNlbmRpZgorCiAjZW5kaWYgLyogX0FTTV9YODZfQU1EX0lPTU1VX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvczM5MC1pb21tdS5jIGIvZHJpdmVycy9pb21tdS9zMzkwLWlvbW11LmMKaW5kZXggYTA0ZDQ5MS4uM2I0NGIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9zMzkwLWlvbW11LmMKKysrIGIvZHJpdmVycy9pb21tdS9zMzkwLWlvbW11LmMKQEAgLTEwMSw4ICsxMDEsNyBAQAogCQl6cGNpX2RtYV9leGl0X2RldmljZSh6ZGV2KTsKIAogCXpkZXYtPmRtYV90YWJsZSA9IHMzOTBfZG9tYWluLT5kbWFfdGFibGU7Ci0JcmMgPSB6cGNpX3JlZ2lzdGVyX2lvYXQoemRldiwgMCwgemRldi0+c3RhcnRfZG1hICsgUEFHRV9PRkZTRVQsCi0JCQkJemRldi0+c3RhcnRfZG1hICsgemRldi0+aW9tbXVfc2l6ZSAtIDEsCisJcmMgPSB6cGNpX3JlZ2lzdGVyX2lvYXQoemRldiwgMCwgemRldi0+c3RhcnRfZG1hLCB6ZGV2LT5lbmRfZG1hLAogCQkJCSh1NjQpIHpkZXYtPmRtYV90YWJsZSk7CiAJaWYgKHJjKQogCQlnb3RvIG91dF9yZXN0b3JlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL0tjb25maWcgYi9kcml2ZXJzL2lycWNoaXAvS2NvbmZpZwppbmRleCA3Zjg3Mjg5Li44MmIwYjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvS2NvbmZpZworKysgYi9kcml2ZXJzL2lycWNoaXAvS2NvbmZpZwpAQCAtMzksNiArMzksNyBAQAogCWJvb2wKIAlkZXBlbmRzIG9uIFBDSQogCWRlcGVuZHMgb24gUENJX01TSQorCXNlbGVjdCBBQ1BJX0lPUlQgaWYgQUNQSQogCiBjb25maWcgQVJNX05WSUMKIAlib29sCkBAIC0xNTYsNiArMTU3LDEzIEBACiAJc2VsZWN0IEdFTkVSSUNfSVJRX0NISVAKIAlzZWxlY3QgSVJRX0RPTUFJTgogCitjb25maWcgSkNPUkVfQUlDCisJYm9vbCAiSi1Db3JlIGludGVncmF0ZWQgQUlDIgorCWRlcGVuZHMgb24gT0YgJiYgKFNVUEVSSCB8fCBDT01QSUxFX1RFU1QpCisJc2VsZWN0IElSUV9ET01BSU4KKwloZWxwCisJICBTdXBwb3J0IGZvciB0aGUgSi1Db3JlIGludGVncmF0ZWQgQUlDLgorCiBjb25maWcgUkVORVNBU19JTlRDX0lSUVBJTgogCWJvb2wKIAlzZWxlY3QgSVJRX0RPTUFJTgpAQCAtMjUxLDYgKzI1OSw5IEBACiBjb25maWcgTVZFQlVfT0RNSQogCWJvb2wKIAorY29uZmlnIE1WRUJVX1BJQworCWJvb2wKKwogY29uZmlnIExTX1NDRkdfTVNJCiAJZGVmX2Jvb2wgeSBpZiBTT0NfTFMxMDIxQSB8fCBBUkNIX0xBWUVSU0NBUEUKIAlkZXBlbmRzIG9uIFBDSSAmJiBQQ0lfTVNJCkBAIC0yNjQsMyArMjc1LDcgQEAKIAlzZWxlY3QgSVJRX0RPTUFJTgogCWhlbHAKIAkgIFN1cHBvcnQgdGhlIEVaY2hpcCBOUFM0MDAgZ2xvYmFsIGludGVycnVwdCBjb250cm9sbGVyCisKK2NvbmZpZyBTVE0zMl9FWFRJCisJYm9vbAorCXNlbGVjdCBJUlFfRE9NQUlOCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUgYi9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUKaW5kZXggNGMyMDNiNi4uZTRkYmZjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9NYWtlZmlsZQpAQCAtMjUsNyArMjUsNyBAQAogb2JqLSQoQ09ORklHX0FSQ0hfU1BFQVIzWFgpCQkrPSBzcGVhci1zaGlycS5vCiBvYmotJChDT05GSUdfQVJNX0dJQykJCQkrPSBpcnEtZ2ljLm8gaXJxLWdpYy1jb21tb24ubwogb2JqLSQoQ09ORklHX0FSTV9HSUNfUE0pCQkrPSBpcnEtZ2ljLXBtLm8KLW9iai0kKENPTkZJR19SRUFMVklFV19EVCkJCSs9IGlycS1naWMtcmVhbHZpZXcubworb2JqLSQoQ09ORklHX0FSQ0hfUkVBTFZJRVcpCQkrPSBpcnEtZ2ljLXJlYWx2aWV3Lm8KIG9iai0kKENPTkZJR19BUk1fR0lDX1YyTSkJCSs9IGlycS1naWMtdjJtLm8KIG9iai0kKENPTkZJR19BUk1fR0lDX1YzKQkJKz0gaXJxLWdpYy12My5vIGlycS1naWMtY29tbW9uLm8KIG9iai0kKENPTkZJR19BUk1fR0lDX1YzX0lUUykJCSs9IGlycS1naWMtdjMtaXRzLm8gaXJxLWdpYy12My1pdHMtcGNpLW1zaS5vIGlycS1naWMtdjMtaXRzLXBsYXRmb3JtLW1zaS5vCkBAIC00MCw2ICs0MCw3IEBACiBvYmotJChDT05GSUdfSU1HUERDX0lSUSkJCSs9IGlycS1pbWdwZGMubwogb2JqLSQoQ09ORklHX0lSUV9NSVBTX0NQVSkJCSs9IGlycS1taXBzLWNwdS5vCiBvYmotJChDT05GSUdfU0lSRl9JUlEpCQkJKz0gaXJxLXNpcmZzb2Mubworb2JqLSQoQ09ORklHX0pDT1JFX0FJQykJCQkrPSBpcnEtamNvcmUtYWljLm8KIG9iai0kKENPTkZJR19SRU5FU0FTX0lOVENfSVJRUElOKQkrPSBpcnEtcmVuZXNhcy1pbnRjLWlycXBpbi5vCiBvYmotJChDT05GSUdfUkVORVNBU19JUlFDKQkJKz0gaXJxLXJlbmVzYXMtaXJxYy5vCiBvYmotJChDT05GSUdfVkVSU0FUSUxFX0ZQR0FfSVJRKQkrPSBpcnEtdmVyc2F0aWxlLWZwZ2EubwpAQCAtNjgsNiArNjksOCBAQAogb2JqLSQoQ09ORklHX0lNWF9HUENWMikJCQkrPSBpcnEtaW14LWdwY3YyLm8KIG9iai0kKENPTkZJR19QSUMzMl9FVklDKQkJKz0gaXJxLXBpYzMyLWV2aWMubwogb2JqLSQoQ09ORklHX01WRUJVX09ETUkpCQkrPSBpcnEtbXZlYnUtb2RtaS5vCitvYmotJChDT05GSUdfTVZFQlVfUElDKQkJCSs9IGlycS1tdmVidS1waWMubwogb2JqLSQoQ09ORklHX0xTX1NDRkdfTVNJKQkJKz0gaXJxLWxzLXNjZmctbXNpLm8KIG9iai0kKENPTkZJR19FWk5QU19HSUMpCQkJKz0gaXJxLWV6bnBzLm8KIG9iai0kKENPTkZJR19BUkNIX0FTUEVFRCkJCSs9IGlycS1hc3BlZWQtdmljLm8KK29iai0kKENPTkZJR19TVE0zMl9FWFRJKSAJCSs9IGlycS1zdG0zMi1leHRpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXRtZWwtYWljLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYy5jCmluZGV4IDExMmUxN2MuLjM3Zjk1MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXRtZWwtYWljLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1hdG1lbC1haWMuYwpAQCAtMTc2LDYgKzE3Niw3IEBACiB7CiAJc3RydWN0IGlycV9kb21haW5fY2hpcF9nZW5lcmljICpkZ2MgPSBkLT5nYzsKIAlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBzbXI7CiAJaW50IGlkeDsKIAlpbnQgcmV0OwpAQCAtMTk0LDExICsxOTUsMTEgQEAKIAogCWdjID0gZGdjLT5nY1tpZHhdOwogCi0JaXJxX2djX2xvY2soZ2MpOworCWlycV9nY19sb2NrX2lycXNhdmUoZ2MsIGZsYWdzKTsKIAlzbXIgPSBpcnFfcmVnX3JlYWRsKGdjLCBBVDkxX0FJQ19TTVIoKm91dF9od2lycSkpOwogCWFpY19jb21tb25fc2V0X3ByaW9yaXR5KGludHNwZWNbMl0sICZzbXIpOwogCWlycV9yZWdfd3JpdGVsKGdjLCBzbXIsIEFUOTFfQUlDX1NNUigqb3V0X2h3aXJxKSk7Ci0JaXJxX2djX3VubG9jayhnYyk7CisJaXJxX2djX3VubG9ja19pcnFyZXN0b3JlKGdjLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1hdG1lbC1haWM1LmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYzUuYwppbmRleCA0ZjBkMDY4Li4yYTYyNGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYzUuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWF0bWVsLWFpYzUuYwpAQCAtMjU4LDYgKzI1OCw3IEBACiAJCQkJIHVuc2lnbmVkIGludCAqb3V0X3R5cGUpCiB7CiAJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmJnYyA9IGlycV9nZXRfZG9tYWluX2dlbmVyaWNfY2hpcChkLCAwKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIHNtcjsKIAlpbnQgcmV0OwogCkBAIC0yNjksMTIgKzI3MCwxMiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpcnFfZ2NfbG9jayhiZ2MpOworCWlycV9nY19sb2NrX2lycXNhdmUoYmdjLCBmbGFncyk7CiAJaXJxX3JlZ193cml0ZWwoYmdjLCAqb3V0X2h3aXJxLCBBVDkxX0FJQzVfU1NSKTsKIAlzbXIgPSBpcnFfcmVnX3JlYWRsKGJnYywgQVQ5MV9BSUM1X1NNUik7CiAJYWljX2NvbW1vbl9zZXRfcHJpb3JpdHkoaW50c3BlY1syXSwgJnNtcik7CiAJaXJxX3JlZ193cml0ZWwoYmdjLCBzbXIsIEFUOTFfQUlDNV9TTVIpOwotCWlycV9nY191bmxvY2soYmdjKTsKKwlpcnFfZ2NfdW5sb2NrX2lycXJlc3RvcmUoYmdjLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtcG0uYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXBtLmMKaW5kZXggNGNiZmZiYS4uZWNhZmQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtcG0uYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy1wbS5jCkBAIC02NCw3ICs2NCw2IEBACiAKIHN0YXRpYyBpbnQgZ2ljX2dldF9jbG9ja3Moc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgZ2ljX2Nsa19kYXRhICpkYXRhKQogewotCXN0cnVjdCBjbGsgKmNsazsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcmV0OwogCkBAIC03NiwyOCArNzUsMTYgQEAKIAkJcmV0dXJuIHJldDsKIAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5udW1fY2xvY2tzOyBpKyspIHsKLQkJY2xrID0gb2ZfY2xrX2dldF9ieV9uYW1lKGRldi0+b2Zfbm9kZSwgZGF0YS0+Y2xvY2tzW2ldKTsKLQkJaWYgKElTX0VSUihjbGspKSB7Ci0JCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgJXNcbiIsCi0JCQkJZGF0YS0+Y2xvY2tzW2ldKTsKLQkJCXJldCA9IFBUUl9FUlIoY2xrKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQlyZXQgPSBwbV9jbGtfYWRkX2NsayhkZXYsIGNsayk7CisJCXJldCA9IG9mX3BtX2Nsa19hZGRfY2xrKGRldiwgZGF0YS0+Y2xvY2tzW2ldKTsKIAkJaWYgKHJldCkgewotCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYWRkIGNsb2NrIGF0IGluZGV4ICVkXG4iLCBpKTsKLQkJCWNsa19wdXQoY2xrKTsKLQkJCWdvdG8gZXJyb3I7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBhZGQgY2xvY2sgJXNcbiIsCisJCQkJZGF0YS0+Y2xvY2tzW2ldKTsKKwkJCXBtX2Nsa19kZXN0cm95KGRldik7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCiAJcmV0dXJuIDA7Ci0KLWVycm9yOgotCXBtX2Nsa19kZXN0cm95KGRldik7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGdpY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLXBjaS1tc2kuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLWl0cy1wY2ktbXNpLmMKaW5kZXggYWVlNjBlZC4uYWVlMWM2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLXBjaS1tc2kuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My1pdHMtcGNpLW1zaS5jCkBAIC0xNSw2ICsxNSw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvYWNwaV9pb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KQEAgLTEwNiwzNCArMTA3LDkxIEBACiAJe30sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBpdHNfcGNpX21zaV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBpdHNfcGNpX21zaV9pbml0X29uZShzdHJ1Y3QgZndub2RlX2hhbmRsZSAqaGFuZGxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBpcnFfZG9tYWluICpwYXJlbnQ7CisKKwlwYXJlbnQgPSBpcnFfZmluZF9tYXRjaGluZ19md25vZGUoaGFuZGxlLCBET01BSU5fQlVTX05FWFVTKTsKKwlpZiAoIXBhcmVudCB8fCAhbXNpX2dldF9kb21haW5faW5mbyhwYXJlbnQpKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBsb2NhdGUgSVRTIGRvbWFpblxuIiwgbmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKCFwY2lfbXNpX2NyZWF0ZV9pcnFfZG9tYWluKGhhbmRsZSwgJml0c19wY2lfbXNpX2RvbWFpbl9pbmZvLAorCQkJCSAgICAgICBwYXJlbnQpKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBjcmVhdGUgUENJIGRvbWFpblxuIiwgbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpdHNfcGNpX29mX21zaV9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKLQlzdHJ1Y3QgaXJxX2RvbWFpbiAqcGFyZW50OwogCiAJZm9yIChucCA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCBpdHNfZGV2aWNlX2lkKTsgbnA7CiAJICAgICBucCA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShucCwgaXRzX2RldmljZV9pZCkpIHsKIAkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJtc2ktY29udHJvbGxlciIpKQogCQkJY29udGludWU7CiAKLQkJcGFyZW50ID0gaXJxX2ZpbmRfbWF0Y2hpbmdfaG9zdChucCwgRE9NQUlOX0JVU19ORVhVUyk7Ci0JCWlmICghcGFyZW50IHx8ICFtc2lfZ2V0X2RvbWFpbl9pbmZvKHBhcmVudCkpIHsKLQkJCXByX2VycigiJXM6IHVuYWJsZSB0byBsb2NhdGUgSVRTIGRvbWFpblxuIiwKLQkJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKKwkJaWYgKGl0c19wY2lfbXNpX2luaXRfb25lKG9mX25vZGVfdG9fZndub2RlKG5wKSwgbnAtPmZ1bGxfbmFtZSkpCiAJCQljb250aW51ZTsKLQkJfQotCi0JCWlmICghcGNpX21zaV9jcmVhdGVfaXJxX2RvbWFpbihvZl9ub2RlX3RvX2Z3bm9kZShucCksCi0JCQkJCSAgICAgICAmaXRzX3BjaV9tc2lfZG9tYWluX2luZm8sCi0JCQkJCSAgICAgICBwYXJlbnQpKSB7Ci0JCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gY3JlYXRlIFBDSSBkb21haW5cbiIsCi0JCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQogCiAJCXByX2luZm8oIlBDSS9NU0k6ICVzIGRvbWFpbiBjcmVhdGVkXG4iLCBucC0+ZnVsbF9uYW1lKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KKworI2lmZGVmIENPTkZJR19BQ1BJCisKK3N0YXRpYyBpbnQgX19pbml0CitpdHNfcGNpX21zaV9wYXJzZV9tYWR0KHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLAorCQkgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IGFjcGlfbWFkdF9nZW5lcmljX3RyYW5zbGF0b3IgKml0c19lbnRyeTsKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZG9tX2hhbmRsZTsKKwljb25zdCBjaGFyICpub2RlX25hbWU7CisJaW50IGVyciA9IC1FTlhJTzsKKworCWl0c19lbnRyeSA9IChzdHJ1Y3QgYWNwaV9tYWR0X2dlbmVyaWNfdHJhbnNsYXRvciAqKWhlYWRlcjsKKwlub2RlX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIklUU0AweCVseCIsCisJCQkgICAgICAobG9uZylpdHNfZW50cnktPmJhc2VfYWRkcmVzcyk7CisJZG9tX2hhbmRsZSA9IGlvcnRfZmluZF9kb21haW5fdG9rZW4oaXRzX2VudHJ5LT50cmFuc2xhdGlvbl9pZCk7CisJaWYgKCFkb21faGFuZGxlKSB7CisJCXByX2VycigiJXM6IFVuYWJsZSB0byBsb2NhdGUgSVRTIGRvbWFpbiBoYW5kbGVcbiIsIG5vZGVfbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWVyciA9IGl0c19wY2lfbXNpX2luaXRfb25lKGRvbV9oYW5kbGUsIG5vZGVfbmFtZSk7CisJaWYgKCFlcnIpCisJCXByX2luZm8oIlBDSS9NU0k6ICVzIGRvbWFpbiBjcmVhdGVkXG4iLCBub2RlX25hbWUpOworCitvdXQ6CisJa2ZyZWUobm9kZV9uYW1lKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpdHNfcGNpX2FjcGlfbXNpX2luaXQodm9pZCkKK3sKKwlhY3BpX3RhYmxlX3BhcnNlX21hZHQoQUNQSV9NQURUX1RZUEVfR0VORVJJQ19UUkFOU0xBVE9SLAorCQkJICAgICAgaXRzX3BjaV9tc2lfcGFyc2VfbWFkdCwgMCk7CisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCBfX2luaXQgaXRzX3BjaV9hY3BpX21zaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgaXRzX3BjaV9tc2lfaW5pdCh2b2lkKQoreworCWl0c19wY2lfb2ZfbXNpX2luaXQoKTsKKwlpdHNfcGNpX2FjcGlfbXNpX2luaXQoKTsKKworCXJldHVybiAwOworfQogZWFybHlfaW5pdGNhbGwoaXRzX3BjaV9tc2lfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My1pdHMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLWl0cy5jCmluZGV4IDM2YjljMjguLjM1Yzg1MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLWl0cy5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLWl0cy5jCkBAIC0xNSwxMCArMTUsMTMgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpX2lvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KQEAgLTc1LDcgKzc4LDcgQEAKIAlyYXdfc3BpbmxvY2tfdAkJbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJ5OwogCXZvaWQgX19pb21lbQkJKmJhc2U7Ci0JdW5zaWduZWQgbG9uZwkJcGh5c19iYXNlOworCXBoeXNfYWRkcl90CQlwaHlzX2Jhc2U7CiAJc3RydWN0IGl0c19jbWRfYmxvY2sJKmNtZF9iYXNlOwogCXN0cnVjdCBpdHNfY21kX2Jsb2NrCSpjbWRfd3JpdGU7CiAJc3RydWN0IGl0c19iYXNlcgl0YWJsZXNbR0lUU19CQVNFUl9OUl9SRUdTXTsKQEAgLTExNSw2ICsxMTgsNyBAQAogc3RhdGljIExJU1RfSEVBRChpdHNfbm9kZXMpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhpdHNfbG9jayk7CiBzdGF0aWMgc3RydWN0IHJkaXN0cyAqZ2ljX3JkaXN0czsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2RvbWFpbiAqaXRzX3BhcmVudDsKIAogI2RlZmluZSBnaWNfZGF0YV9yZGlzdCgpCQkocmF3X2NwdV9wdHIoZ2ljX3JkaXN0cy0+cmRpc3QpKQogI2RlZmluZSBnaWNfZGF0YV9yZGlzdF9yZF9iYXNlKCkJKGdpY19kYXRhX3JkaXN0KCktPnJkX2Jhc2UpCkBAIC0xNDM3LDYgKzE0NDEsMTEgQEAKIAkJZndzcGVjLnBhcmFtWzBdID0gR0lDX0lSUV9UWVBFX0xQSTsKIAkJZndzcGVjLnBhcmFtWzFdID0gaHdpcnE7CiAJCWZ3c3BlYy5wYXJhbVsyXSA9IElSUV9UWVBFX0VER0VfUklTSU5HOworCX0gZWxzZSBpZiAoaXNfZndub2RlX2lycWNoaXAoZG9tYWluLT5wYXJlbnQtPmZ3bm9kZSkpIHsKKwkJZndzcGVjLmZ3bm9kZSA9IGRvbWFpbi0+cGFyZW50LT5md25vZGU7CisJCWZ3c3BlYy5wYXJhbV9jb3VudCA9IDI7CisJCWZ3c3BlYy5wYXJhbVswXSA9IGh3aXJxOworCQlmd3NwZWMucGFyYW1bMV0gPSBJUlFfVFlQRV9FREdFX1JJU0lORzsKIAl9IGVsc2UgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNjE0LDQ0ICsxNjIzLDU5IEBACiAJZ2ljX2VuYWJsZV9xdWlya3MoaWlkciwgaXRzX3F1aXJrcywgaXRzKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaXRzX3Byb2JlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqcGFyZW50KQorc3RhdGljIGludCBpdHNfaW5pdF9kb21haW4oc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmhhbmRsZSwgc3RydWN0IGl0c19ub2RlICppdHMpCiB7Ci0Jc3RydWN0IHJlc291cmNlIHJlczsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqaW5uZXJfZG9tYWluOworCXN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm87CisKKwlpbmZvID0ga3phbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOworCisJaW5uZXJfZG9tYWluID0gaXJxX2RvbWFpbl9jcmVhdGVfdHJlZShoYW5kbGUsICZpdHNfZG9tYWluX29wcywgaXRzKTsKKwlpZiAoIWlubmVyX2RvbWFpbikgeworCQlrZnJlZShpbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW5uZXJfZG9tYWluLT5wYXJlbnQgPSBpdHNfcGFyZW50OworCWlubmVyX2RvbWFpbi0+YnVzX3Rva2VuID0gRE9NQUlOX0JVU19ORVhVUzsKKwlpbmZvLT5vcHMgPSAmaXRzX21zaV9kb21haW5fb3BzOworCWluZm8tPmRhdGEgPSBpdHM7CisJaW5uZXJfZG9tYWluLT5ob3N0X2RhdGEgPSBpbmZvOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGl0c19wcm9iZV9vbmUoc3RydWN0IHJlc291cmNlICpyZXMsCisJCQkJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmhhbmRsZSwgaW50IG51bWFfbm9kZSkKK3sKIAlzdHJ1Y3QgaXRzX25vZGUgKml0czsKIAl2b2lkIF9faW9tZW0gKml0c19iYXNlOwotCXN0cnVjdCBpcnFfZG9tYWluICppbm5lcl9kb21haW47CiAJdTMyIHZhbDsKIAl1NjQgYmFzZXIsIHRtcDsKIAlpbnQgZXJyOwogCi0JZXJyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmcmVzKTsKLQlpZiAoZXJyKSB7Ci0JCXByX3dhcm4oIiVzOiBubyByZWdzP1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlpdHNfYmFzZSA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZXMpKTsKKwlpdHNfYmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIAlpZiAoIWl0c19iYXNlKSB7Ci0JCXByX3dhcm4oIiVzOiB1bmFibGUgdG8gbWFwIHJlZ2lzdGVyc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcHJfd2FybigiSVRTQCVwYTogVW5hYmxlIHRvIG1hcCBJVFMgcmVnaXN0ZXJzXG4iLCAmcmVzLT5zdGFydCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXZhbCA9IHJlYWRsX3JlbGF4ZWQoaXRzX2Jhc2UgKyBHSVRTX1BJRFIyKSAmIEdJQ19QSURSMl9BUkNIX01BU0s7CiAJaWYgKHZhbCAhPSAweDMwICYmIHZhbCAhPSAweDQwKSB7Ci0JCXByX3dhcm4oIiVzOiBubyBJVFMgZGV0ZWN0ZWQsIGdpdmluZyB1cFxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcHJfd2FybigiSVRTQCVwYTogTm8gSVRTIGRldGVjdGVkLCBnaXZpbmcgdXBcbiIsICZyZXMtPnN0YXJ0KTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBvdXRfdW5tYXA7CiAJfQogCiAJZXJyID0gaXRzX2ZvcmNlX3F1aWVzY2VudChpdHNfYmFzZSk7CiAJaWYgKGVycikgewotCQlwcl93YXJuKCIlczogZmFpbGVkIHRvIHF1aWVzY2UsIGdpdmluZyB1cFxuIiwKLQkJCW5vZGUtPmZ1bGxfbmFtZSk7CisJCXByX3dhcm4oIklUU0AlcGE6IEZhaWxlZCB0byBxdWllc2NlLCBnaXZpbmcgdXBcbiIsICZyZXMtPnN0YXJ0KTsKIAkJZ290byBvdXRfdW5tYXA7CiAJfQogCi0JcHJfaW5mbygiSVRTOiAlc1xuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwlwcl9pbmZvKCJJVFMgJXBSXG4iLCByZXMpOwogCiAJaXRzID0ga3phbGxvYyhzaXplb2YoKml0cyksIEdGUF9LRVJORUwpOwogCWlmICghaXRzKSB7CkBAIC0xNjYzLDkgKzE2ODcsOSBAQAogCUlOSVRfTElTVF9IRUFEKCZpdHMtPmVudHJ5KTsKIAlJTklUX0xJU1RfSEVBRCgmaXRzLT5pdHNfZGV2aWNlX2xpc3QpOwogCWl0cy0+YmFzZSA9IGl0c19iYXNlOwotCWl0cy0+cGh5c19iYXNlID0gcmVzLnN0YXJ0OworCWl0cy0+cGh5c19iYXNlID0gcmVzLT5zdGFydDsKIAlpdHMtPml0ZV9zaXplID0gKChyZWFkbF9yZWxheGVkKGl0c19iYXNlICsgR0lUU19UWVBFUikgPj4gNCkgJiAweGYpICsgMTsKLQlpdHMtPm51bWFfbm9kZSA9IG9mX25vZGVfdG9fbmlkKG5vZGUpOworCWl0cy0+bnVtYV9ub2RlID0gbnVtYV9ub2RlOwogCiAJaXRzLT5jbWRfYmFzZSA9IGt6YWxsb2MoSVRTX0NNRF9RVUVVRV9TWiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpdHMtPmNtZF9iYXNlKSB7CkBAIC0xNzEyLDI4ICsxNzM2LDkgQEAKIAl3cml0ZXFfcmVsYXhlZCgwLCBpdHMtPmJhc2UgKyBHSVRTX0NXUklURVIpOwogCXdyaXRlbF9yZWxheGVkKEdJVFNfQ1RMUl9FTkFCTEUsIGl0cy0+YmFzZSArIEdJVFNfQ1RMUik7CiAKLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsICJtc2ktY29udHJvbGxlciIpKSB7Ci0JCXN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm87Ci0KLQkJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghaW5mbykgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0X2ZyZWVfdGFibGVzOwotCQl9Ci0KLQkJaW5uZXJfZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfdHJlZShub2RlLCAmaXRzX2RvbWFpbl9vcHMsIGl0cyk7Ci0JCWlmICghaW5uZXJfZG9tYWluKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJa2ZyZWUoaW5mbyk7Ci0JCQlnb3RvIG91dF9mcmVlX3RhYmxlczsKLQkJfQotCi0JCWlubmVyX2RvbWFpbi0+cGFyZW50ID0gcGFyZW50OwotCQlpbm5lcl9kb21haW4tPmJ1c190b2tlbiA9IERPTUFJTl9CVVNfTkVYVVM7Ci0JCWluZm8tPm9wcyA9ICZpdHNfbXNpX2RvbWFpbl9vcHM7Ci0JCWluZm8tPmRhdGEgPSBpdHM7Ci0JCWlubmVyX2RvbWFpbi0+aG9zdF9kYXRhID0gaW5mbzsKLQl9CisJZXJyID0gaXRzX2luaXRfZG9tYWluKGhhbmRsZSwgaXRzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX3RhYmxlczsKIAogCXNwaW5fbG9jaygmaXRzX2xvY2spOwogCWxpc3RfYWRkKCZpdHMtPmVudHJ5LCAmaXRzX25vZGVzKTsKQEAgLTE3NDksNyArMTc1NCw3IEBACiAJa2ZyZWUoaXRzKTsKIG91dF91bm1hcDoKIAlpb3VubWFwKGl0c19iYXNlKTsKLQlwcl9lcnIoIklUUzogZmFpbGVkIHByb2JpbmcgJXMgKCVkKVxuIiwgbm9kZS0+ZnVsbF9uYW1lLCBlcnIpOworCXByX2VycigiSVRTQCVwYTogZmFpbGVkIHByb2JpbmcgKCVkKVxuIiwgJnJlcy0+c3RhcnQsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTc3NywxNSArMTc4Miw5MSBAQAogCXt9LAogfTsKIAotaW50IF9faW5pdCBpdHNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCByZGlzdHMgKnJkaXN0cywKLQkgICAgIHN0cnVjdCBpcnFfZG9tYWluICpwYXJlbnRfZG9tYWluKQorc3RhdGljIGludCBfX2luaXQgaXRzX29mX3Byb2JlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXN0cnVjdCByZXNvdXJjZSByZXM7CiAKIAlmb3IgKG5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKG5vZGUsIGl0c19kZXZpY2VfaWQpOyBucDsKIAkgICAgIG5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKG5wLCBpdHNfZGV2aWNlX2lkKSkgewotCQlpdHNfcHJvYmUobnAsIHBhcmVudF9kb21haW4pOworCQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgIm1zaS1jb250cm9sbGVyIikpIHsKKwkJCXByX3dhcm4oIiVzOiBubyBtc2ktY29udHJvbGxlciBwcm9wZXJ0eSwgSVRTIGlnbm9yZWRcbiIsCisJCQkJbnAtPmZ1bGxfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKSkgeworCQkJcHJfd2FybigiJXM6IG5vIHJlZ3M/XG4iLCBucC0+ZnVsbF9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaXRzX3Byb2JlX29uZSgmcmVzLCAmbnAtPmZ3bm9kZSwgb2Zfbm9kZV90b19uaWQobnApKTsKIAl9CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfQUNQSQorCisjZGVmaW5lIEFDUElfR0lDVjNfSVRTX01FTV9TSVpFIChTWl8xMjhLKQorCitzdGF0aWMgaW50IF9faW5pdCBnaWNfYWNwaV9wYXJzZV9tYWR0X2l0cyhzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciwKKwkJCQkJICBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlzdHJ1Y3QgYWNwaV9tYWR0X2dlbmVyaWNfdHJhbnNsYXRvciAqaXRzX2VudHJ5OworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpkb21faGFuZGxlOworCXN0cnVjdCByZXNvdXJjZSByZXM7CisJaW50IGVycjsKKworCWl0c19lbnRyeSA9IChzdHJ1Y3QgYWNwaV9tYWR0X2dlbmVyaWNfdHJhbnNsYXRvciAqKWhlYWRlcjsKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCXJlcy5zdGFydCA9IGl0c19lbnRyeS0+YmFzZV9hZGRyZXNzOworCXJlcy5lbmQgPSBpdHNfZW50cnktPmJhc2VfYWRkcmVzcyArIEFDUElfR0lDVjNfSVRTX01FTV9TSVpFIC0gMTsKKwlyZXMuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKworCWRvbV9oYW5kbGUgPSBpcnFfZG9tYWluX2FsbG9jX2Z3bm9kZSgodm9pZCAqKWl0c19lbnRyeS0+YmFzZV9hZGRyZXNzKTsKKwlpZiAoIWRvbV9oYW5kbGUpIHsKKwkJcHJfZXJyKCJJVFNAJXBhOiBVbmFibGUgdG8gYWxsb2NhdGUgR0lDdjMgSVRTIGRvbWFpbiB0b2tlblxuIiwKKwkJICAgICAgICZyZXMuc3RhcnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllcnIgPSBpb3J0X3JlZ2lzdGVyX2RvbWFpbl90b2tlbihpdHNfZW50cnktPnRyYW5zbGF0aW9uX2lkLCBkb21faGFuZGxlKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiSVRTQCVwYTogVW5hYmxlIHRvIHJlZ2lzdGVyIEdJQ3YzIElUUyBkb21haW4gdG9rZW4gKElUUyBJRCAlZCkgdG8gSU9SVFxuIiwKKwkJICAgICAgICZyZXMuc3RhcnQsIGl0c19lbnRyeS0+dHJhbnNsYXRpb25faWQpOworCQlnb3RvIGRvbV9lcnI7CisJfQorCisJZXJyID0gaXRzX3Byb2JlX29uZSgmcmVzLCBkb21faGFuZGxlLCBOVU1BX05PX05PREUpOworCWlmICghZXJyKQorCQlyZXR1cm4gMDsKKworCWlvcnRfZGVyZWdpc3Rlcl9kb21haW5fdG9rZW4oaXRzX2VudHJ5LT50cmFuc2xhdGlvbl9pZCk7Citkb21fZXJyOgorCWlycV9kb21haW5fZnJlZV9md25vZGUoZG9tX2hhbmRsZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGl0c19hY3BpX3Byb2JlKHZvaWQpCit7CisJYWNwaV90YWJsZV9wYXJzZV9tYWR0KEFDUElfTUFEVF9UWVBFX0dFTkVSSUNfVFJBTlNMQVRPUiwKKwkJCSAgICAgIGdpY19hY3BpX3BhcnNlX21hZHRfaXRzLCAwKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBfX2luaXQgaXRzX2FjcGlfcHJvYmUodm9pZCkgeyB9CisjZW5kaWYKKworaW50IF9faW5pdCBpdHNfaW5pdChzdHJ1Y3QgZndub2RlX2hhbmRsZSAqaGFuZGxlLCBzdHJ1Y3QgcmRpc3RzICpyZGlzdHMsCisJCSAgICBzdHJ1Y3QgaXJxX2RvbWFpbiAqcGFyZW50X2RvbWFpbikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisKKwlpdHNfcGFyZW50ID0gcGFyZW50X2RvbWFpbjsKKwlvZl9ub2RlID0gdG9fb2Zfbm9kZShoYW5kbGUpOworCWlmIChvZl9ub2RlKQorCQlpdHNfb2ZfcHJvYmUob2Zfbm9kZSk7CisJZWxzZQorCQlpdHNfYWNwaV9wcm9iZSgpOwogCiAJaWYgKGxpc3RfZW1wdHkoJml0c19ub2RlcykpIHsKIAkJcHJfd2FybigiSVRTOiBObyBJVFMgYXZhaWxhYmxlLCBub3QgZW5hYmxpbmcgTFBJc1xuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMuYwppbmRleCBlZGU1NjcyLi45YjgxYmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLmMKQEAgLTQ5NSw2ICs0OTUsMTQgQEAKIAkvKiBTZXQgcHJpb3JpdHkgbWFzayByZWdpc3RlciAqLwogCWdpY193cml0ZV9wbXIoREVGQVVMVF9QTVJfVkFMVUUpOwogCisJLyoKKwkgKiBTb21lIGZpcm13YXJlcyBoYW5kIG92ZXIgdG8gdGhlIGtlcm5lbCB3aXRoIHRoZSBCUFIgY2hhbmdlZCBmcm9tCisJICogaXRzIHJlc2V0IHZhbHVlIChhbmQgd2l0aCBhIHZhbHVlIGxhcmdlIGVub3VnaCB0byBwcmV2ZW50CisJICogYW55IHByZS1lbXB0aXZlIGludGVycnVwdHMgZnJvbSB3b3JraW5nIGF0IGFsbCkuIFdyaXRpbmcgYSB6ZXJvCisJICogdG8gQlBSIHJlc3RvcmVzIGlzIHJlc2V0IHZhbHVlLgorCSAqLworCWdpY193cml0ZV9icHIxKDApOworCiAJaWYgKHN0YXRpY19rZXlfdHJ1ZSgmc3VwcG9ydHNfZGVhY3RpdmF0ZSkpIHsKIAkJLyogRU9JIGRyb3BzIHByaW9yaXR5IG9ubHkgKG1vZGUgMSkgKi8KIAkJZ2ljX3dyaXRlX2N0bHIoSUNDX0NUTFJfRUwxX0VPSW1vZGVfZHJvcCk7CkBAIC01NDgsNyArNTU2LDcgQEAKIHN0YXRpYyB1MTYgZ2ljX2NvbXB1dGVfdGFyZ2V0X2xpc3QoaW50ICpiYXNlX2NwdSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssCiAJCQkJICAgdW5zaWduZWQgbG9uZyBjbHVzdGVyX2lkKQogewotCWludCBjcHUgPSAqYmFzZV9jcHU7CisJaW50IG5leHRfY3B1LCBjcHUgPSAqYmFzZV9jcHU7CiAJdW5zaWduZWQgbG9uZyBtcGlkciA9IGNwdV9sb2dpY2FsX21hcChjcHUpOwogCXUxNiB0bGlzdCA9IDA7CiAKQEAgLTU2Miw5ICs1NzAsMTAgQEAKIAogCQl0bGlzdCB8PSAxIDw8IChtcGlkciAmIDB4Zik7CiAKLQkJY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgbWFzayk7Ci0JCWlmIChjcHUgPj0gbnJfY3B1X2lkcykKKwkJbmV4dF9jcHUgPSBjcHVtYXNrX25leHQoY3B1LCBtYXNrKTsKKwkJaWYgKG5leHRfY3B1ID49IG5yX2NwdV9pZHMpCiAJCQlnb3RvIG91dDsKKwkJY3B1ID0gbmV4dF9jcHU7CiAKIAkJbXBpZHIgPSBjcHVfbG9naWNhbF9tYXAoY3B1KTsKIApAQCAtOTEwLDcgKzkxOSw2IEBACiAJCQkJIHU2NCByZWRpc3Rfc3RyaWRlLAogCQkJCSBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqaGFuZGxlKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAl1MzIgdHlwZXI7CiAJaW50IGdpY19pcnFzOwogCWludCBlcnI7CkBAIC05NTEsMTAgKzk1OSw4IEBACiAKIAlzZXRfaGFuZGxlX2lycShnaWNfaGFuZGxlX2lycSk7CiAKLQlub2RlID0gdG9fb2Zfbm9kZShoYW5kbGUpOwotCWlmIChJU19FTkFCTEVEKENPTkZJR19BUk1fR0lDX1YzX0lUUykgJiYgZ2ljX2Rpc3Rfc3VwcG9ydHNfbHBpcygpICYmCi0JICAgIG5vZGUpIC8qIFRlbXAgaGFjayB0byBwcmV2ZW50IElUUyBpbml0IGZvciBBQ1BJICovCi0JCWl0c19pbml0KG5vZGUsICZnaWNfZGF0YS5yZGlzdHMsIGdpY19kYXRhLmRvbWFpbik7CisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0FSTV9HSUNfVjNfSVRTKSAmJiBnaWNfZGlzdF9zdXBwb3J0c19scGlzKCkpCisJCWl0c19pbml0KGhhbmRsZSwgJmdpY19kYXRhLnJkaXN0cywgZ2ljX2RhdGEuZG9tYWluKTsKIAogCWdpY19zbXBfaW5pdCgpOwogCWdpY19kaXN0X2luaXQoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy5jCmluZGV4IDM5MGZhYzUuLjU4ZTViNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYwpAQCAtOTEsNyArOTEsMjcgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0soaXJxX2NvbnRyb2xsZXJfbG9jayk7CisjaWZkZWYgQ09ORklHX0JMX1NXSVRDSEVSCisKK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGNwdV9tYXBfbG9jayk7CisKKyNkZWZpbmUgZ2ljX2xvY2tfaXJxc2F2ZShmKQkJXAorCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmY3B1X21hcF9sb2NrLCAoZikpCisjZGVmaW5lIGdpY191bmxvY2tfaXJxcmVzdG9yZShmKQlcCisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwdV9tYXBfbG9jaywgKGYpKQorCisjZGVmaW5lIGdpY19sb2NrKCkJCQlyYXdfc3Bpbl9sb2NrKCZjcHVfbWFwX2xvY2spCisjZGVmaW5lIGdpY191bmxvY2soKQkJCXJhd19zcGluX3VubG9jaygmY3B1X21hcF9sb2NrKQorCisjZWxzZQorCisjZGVmaW5lIGdpY19sb2NrX2lycXNhdmUoZikJCWRvIHsgKHZvaWQpKGYpOyB9IHdoaWxlKDApCisjZGVmaW5lIGdpY191bmxvY2tfaXJxcmVzdG9yZShmKQlkbyB7ICh2b2lkKShmKTsgfSB3aGlsZSgwKQorCisjZGVmaW5lIGdpY19sb2NrKCkJCQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgZ2ljX3VubG9jaygpCQkJZG8geyB9IHdoaWxlKDApCisKKyNlbmRpZgogCiAvKgogICogVGhlIEdJQyBtYXBwaW5nIG9mIENQVSBpbnRlcmZhY2VzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1hdGNoCkBAIC0zMTcsMTIgKzMzNywxMiBAQAogCWlmIChjcHUgPj0gTlJfR0lDX0NQVV9JRiB8fCBjcHUgPj0gbnJfY3B1X2lkcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKKwlnaWNfbG9ja19pcnFzYXZlKGZsYWdzKTsKIAltYXNrID0gMHhmZiA8PCBzaGlmdDsKIAliaXQgPSBnaWNfY3B1X21hcFtjcHVdIDw8IHNoaWZ0OwogCXZhbCA9IHJlYWRsX3JlbGF4ZWQocmVnKSAmIH5tYXNrOwogCXdyaXRlbF9yZWxheGVkKHZhbCB8IGJpdCwgcmVnKTsKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOworCWdpY191bmxvY2tfaXJxcmVzdG9yZShmbGFncyk7CiAKIAlyZXR1cm4gSVJRX1NFVF9NQVNLX09LX0RPTkU7CiB9CkBAIC0zNzQsOSArMzk0LDcgQEAKIAogCWNoYWluZWRfaXJxX2VudGVyKGNoaXAsIGRlc2MpOwogCi0JcmF3X3NwaW5fbG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7CiAJc3RhdHVzID0gcmVhZGxfcmVsYXhlZChnaWNfZGF0YV9jcHVfYmFzZShjaGlwX2RhdGEpICsgR0lDX0NQVV9JTlRBQ0spOwotCXJhd19zcGluX3VubG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7CiAKIAlnaWNfaXJxID0gKHN0YXR1cyAmIEdJQ0NfSUFSX0lOVF9JRF9NQVNLKTsKIAlpZiAoZ2ljX2lycSA9PSBHSUNDX0lOVF9TUFVSSU9VUykKQEAgLTc3Niw3ICs3OTQsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CisJZ2ljX2xvY2tfaXJxc2F2ZShmbGFncyk7CiAKIAkvKiBDb252ZXJ0IG91ciBsb2dpY2FsIENQVSBtYXNrIGludG8gYSBwaHlzaWNhbCBvbmUuICovCiAJZm9yX2VhY2hfY3B1KGNwdSwgbWFzaykKQEAgLTc5MSw3ICs4MDksNyBAQAogCS8qIHRoaXMgYWx3YXlzIGhhcHBlbnMgb24gR0lDMCAqLwogCXdyaXRlbF9yZWxheGVkKG1hcCA8PCAxNiB8IGlycSwgZ2ljX2RhdGFfZGlzdF9iYXNlKCZnaWNfZGF0YVswXSkgKyBHSUNfRElTVF9TT0ZUSU5UKTsKIAotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CisJZ2ljX3VubG9ja19pcnFyZXN0b3JlKGZsYWdzKTsKIH0KICNlbmRpZgogCkBAIC04NTksNyArODc3LDcgQEAKIAljdXJfdGFyZ2V0X21hc2sgPSAweDAxMDEwMTAxIDw8IGN1cl9jcHVfaWQ7CiAJcm9yX3ZhbCA9IChjdXJfY3B1X2lkIC0gbmV3X2NwdV9pZCkgJiAzMTsKIAotCXJhd19zcGluX2xvY2soJmlycV9jb250cm9sbGVyX2xvY2spOworCWdpY19sb2NrKCk7CiAKIAkvKiBVcGRhdGUgdGhlIHRhcmdldCBpbnRlcmZhY2UgZm9yIHRoaXMgbG9naWNhbCBDUFUgKi8KIAlnaWNfY3B1X21hcFtjcHVdID0gMSA8PCBuZXdfY3B1X2lkOwpAQCAtODc5LDcgKzg5Nyw3IEBACiAJCX0KIAl9CiAKLQlyYXdfc3Bpbl91bmxvY2soJmlycV9jb250cm9sbGVyX2xvY2spOworCWdpY191bmxvY2soKTsKIAogCS8qCiAJICogTm93IGxldCdzIG1pZ3JhdGUgYW5kIGNsZWFyIGFueSBwb3RlbnRpYWwgU0dJcyB0aGF0IG1pZ2h0IGJlCkBAIC05MjEsNyArOTM5LDcgQEAKIAlyZXR1cm4gZ2ljX2Rpc3RfcGh5c2FkZHIgKyBHSUNfRElTVF9TT0ZUSU5UOwogfQogCi12b2lkIF9faW5pdCBnaWNfaW5pdF9waHlzYWRkcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCitzdGF0aWMgdm9pZCBfX2luaXQgZ2ljX2luaXRfcGh5c2FkZHIoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogewogCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uobm9kZSwgMCwgJnJlcykgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1qY29yZS1haWMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtamNvcmUtYWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiMDFkZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtamNvcmUtYWljLmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIEotQ29yZSBTb0MgQUlDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IFNtYXJ0IEVuZXJneSBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKworI2RlZmluZSBKQ09SRV9BSUNfTUFYX0hXSVJRCTEyNworI2RlZmluZSBKQ09SRV9BSUMxX01JTl9IV0lSUQkxNgorI2RlZmluZSBKQ09SRV9BSUMyX01JTl9IV0lSUQk2NAorCisjZGVmaW5lIEpDT1JFX0FJQzFfSU5UUFJJX1JFRwk4CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgamNvcmVfYWljOworCitzdGF0aWMgaW50IGpjb3JlX2FpY19pcnFkb21haW5fbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgaXJxLAorCQkJCSAgIGlycV9od19udW1iZXJfdCBod2lycSkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmFpYyA9IGQtPmhvc3RfZGF0YTsKKworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsIGFpYywgaGFuZGxlX3NpbXBsZV9pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgamNvcmVfYWljX2lycWRvbWFpbl9vcHMgPSB7CisJLm1hcCA9IGpjb3JlX2FpY19pcnFkb21haW5fbWFwLAorCS54bGF0ZSA9IGlycV9kb21haW5feGxhdGVfb25lY2VsbCwKK307CisKK3N0YXRpYyB2b2lkIG5vb3Aoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworfQorCitzdGF0aWMgaW50IF9faW5pdCBhaWNfaXJxX29mX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSAgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCit7CisJdW5zaWduZWQgbWluX2lycSA9IEpDT1JFX0FJQzJfTUlOX0hXSVJROworCXVuc2lnbmVkIGRvbV9zeiA9IEpDT1JFX0FJQ19NQVhfSFdJUlErMTsKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluOworCisJcHJfaW5mbygiSW5pdGlhbGl6aW5nIEotQ29yZSBBSUNcbiIpOworCisJLyogQUlDMSBuZWVkcyBwcmlvcml0eSBpbml0aWFsaXphdGlvbiB0byByZWNlaXZlIGludGVycnVwdHMuICovCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJqY29yZSxhaWMxIikpIHsKKwkJdW5zaWduZWQgY3B1OworCisJCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgeworCQkJdm9pZCBfX2lvbWVtICpiYXNlID0gb2ZfaW9tYXAobm9kZSwgY3B1KTsKKworCQkJaWYgKCFiYXNlKSB7CisJCQkJcHJfZXJyKCJVbmFibGUgdG8gbWFwIEFJQyBmb3IgY3B1ICV1XG4iLCBjcHUpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJX19yYXdfd3JpdGVsKDB4ZmZmZmZmZmYsIGJhc2UgKyBKQ09SRV9BSUMxX0lOVFBSSV9SRUcpOworCQkJaW91bm1hcChiYXNlKTsKKwkJfQorCQltaW5faXJxID0gSkNPUkVfQUlDMV9NSU5fSFdJUlE7CisJfQorCisJLyoKKwkgKiBUaGUgaXJxIGNoaXAgZnJhbWV3b3JrIHJlcXVpcmVzIGVpdGhlciBtYXNrL3VubWFzayBvciBlbmFibGUvZGlzYWJsZQorCSAqIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGJlIHByb3ZpZGVkLCBidXQgdGhlIGhhcmR3YXJlIGRvZXMgbm90IGhhdmUgYW55CisJICogc3VjaCBtZWNoYW5pc207IHRoZSBvbmx5IGludGVycnVwdCBtYXNraW5nIGlzIGF0IHRoZSBjcHUgbGV2ZWwgYW5kCisJICogaXQgYWZmZWN0cyBhbGwgaW50ZXJydXB0cy4gV2UgcHJvdmlkZSBkdW1teSBtYXNrL3VubWFzay4gVGhlIGhhcmR3YXJlCisJICogaGFuZGxlcyBhbGwgaW50ZXJydXB0IGNvbnRyb2wgYW5kIGNsZWFycyBwZW5kaW5nIHN0YXR1cyB3aGVuIHRoZSBjcHUKKwkgKiBhY2NlcHRzIHRoZSBpbnRlcnJ1cHQuCisJICovCisJamNvcmVfYWljLmlycV9tYXNrID0gbm9vcDsKKwlqY29yZV9haWMuaXJxX3VubWFzayA9IG5vb3A7CisJamNvcmVfYWljLm5hbWUgPSAiQUlDIjsKKworCWRvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihub2RlLCBkb21fc3osICZqY29yZV9haWNfaXJxZG9tYWluX29wcywKKwkJCQkgICAgICAgJmpjb3JlX2FpYyk7CisJaWYgKCFkb21haW4pCisJCXJldHVybiAtRU5PTUVNOworCWlycV9jcmVhdGVfc3RyaWN0X21hcHBpbmdzKGRvbWFpbiwgbWluX2lycSwgbWluX2lycSwgZG9tX3N6IC0gbWluX2lycSk7CisKKwlyZXR1cm4gMDsKK30KKworSVJRQ0hJUF9ERUNMQVJFKGpjb3JlX2FpYzIsICJqY29yZSxhaWMyIiwgYWljX2lycV9vZl9pbml0KTsKK0lSUUNISVBfREVDTEFSRShqY29yZV9haWMxLCAiamNvcmUsYWljMSIsIGFpY19pcnFfb2ZfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWtleXN0b25lLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWtleXN0b25lLmMKaW5kZXggZGViODlkNi4uNTRhNWU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1rZXlzdG9uZS5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEta2V5c3RvbmUuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJCQlkZXZfZGJnKGtpcnEtPmRldiwgImRpc3BhdGNoIGJpdCAlZCwgdmlycSAlZFxuIiwKIAkJCQlzcmMsIHZpcnEpOwogCQkJaWYgKCF2aXJxKQotCQkJCWRldl93YXJuKGtpcnEtPmRldiwgInNwb3Jpb3VzIGlycSBkZXRlY3RlZCBod2lycSAlZCwgdmlycSAlZFxuIiwKKwkJCQlkZXZfd2FybihraXJxLT5kZXYsICJzcHVyaW91cyBpcnEgZGV0ZWN0ZWQgaHdpcnEgJWQsIHZpcnEgJWRcbiIsCiAJCQkJCSBzcmMsIHZpcnEpOwogCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHZpcnEpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLW1pcHMtZ2ljLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1pcHMtZ2ljLmMKaW5kZXggODNmNDk4My4uYzAxNzhhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1taXBzLWdpYy5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtbWlwcy1naWMuYwpAQCAtMzcxLDE4ICszNzEsMTMgQEAKIAliaXRtYXBfYW5kKHBlbmRpbmcsIHBlbmRpbmcsIGludHJtYXNrLCBnaWNfc2hhcmVkX2ludHJzKTsKIAliaXRtYXBfYW5kKHBlbmRpbmcsIHBlbmRpbmcsIHBjcHVfbWFzaywgZ2ljX3NoYXJlZF9pbnRycyk7CiAKLQlpbnRyID0gZmluZF9maXJzdF9iaXQocGVuZGluZywgZ2ljX3NoYXJlZF9pbnRycyk7Ci0Jd2hpbGUgKGludHIgIT0gZ2ljX3NoYXJlZF9pbnRycykgeworCWZvcl9lYWNoX3NldF9iaXQoaW50ciwgcGVuZGluZywgZ2ljX3NoYXJlZF9pbnRycykgewogCQl2aXJxID0gaXJxX2xpbmVhcl9yZXZtYXAoZ2ljX2lycV9kb21haW4sCiAJCQkJCSBHSUNfU0hBUkVEX1RPX0hXSVJRKGludHIpKTsKIAkJaWYgKGNoYWluZWQpCiAJCQlnZW5lcmljX2hhbmRsZV9pcnEodmlycSk7CiAJCWVsc2UKIAkJCWRvX0lSUSh2aXJxKTsKLQotCQkvKiBnbyB0byBuZXh0IHBlbmRpbmcgYml0ICovCi0JCWJpdG1hcF9jbGVhcihwZW5kaW5nLCBpbnRyLCAxKTsKLQkJaW50ciA9IGZpbmRfZmlyc3RfYml0KHBlbmRpbmcsIGdpY19zaGFyZWRfaW50cnMpOwogCX0KIH0KIApAQCAtNTE4LDE4ICs1MTMsMTMgQEAKIAogCWJpdG1hcF9hbmQoJnBlbmRpbmcsICZwZW5kaW5nLCAmbWFza2VkLCBHSUNfTlVNX0xPQ0FMX0lOVFJTKTsKIAotCWludHIgPSBmaW5kX2ZpcnN0X2JpdCgmcGVuZGluZywgR0lDX05VTV9MT0NBTF9JTlRSUyk7Ci0Jd2hpbGUgKGludHIgIT0gR0lDX05VTV9MT0NBTF9JTlRSUykgeworCWZvcl9lYWNoX3NldF9iaXQoaW50ciwgJnBlbmRpbmcsIEdJQ19OVU1fTE9DQUxfSU5UUlMpIHsKIAkJdmlycSA9IGlycV9saW5lYXJfcmV2bWFwKGdpY19pcnFfZG9tYWluLAogCQkJCQkgR0lDX0xPQ0FMX1RPX0hXSVJRKGludHIpKTsKIAkJaWYgKGNoYWluZWQpCiAJCQlnZW5lcmljX2hhbmRsZV9pcnEodmlycSk7CiAJCWVsc2UKIAkJCWRvX0lSUSh2aXJxKTsKLQotCQkvKiBnbyB0byBuZXh0IHBlbmRpbmcgYml0ICovCi0JCWJpdG1hcF9jbGVhcigmcGVuZGluZywgaW50ciwgMSk7Ci0JCWludHIgPSBmaW5kX2ZpcnN0X2JpdCgmcGVuZGluZywgR0lDX05VTV9MT0NBTF9JTlRSUyk7CiAJfQogfQogCkBAIC02MzgsMjcgKzYyOCw2IEBACiAJaWYgKCFnaWNfbG9jYWxfaXJxX2lzX3JvdXRhYmxlKGludHIpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JLyoKLQkgKiBIQUNLOiBUaGVzZSBhcmUgYWxsIHJlYWxseSBwZXJjcHUgaW50ZXJydXB0cywgYnV0IHRoZSByZXN0Ci0JICogb2YgdGhlIE1JUFMga2VybmVsIGNvZGUgZG9lcyBub3QgdXNlIHRoZSBwZXJjcHUgSVJRIEFQSSBmb3IKLQkgKiB0aGUgQ1AwIHRpbWVyIGFuZCBwZXJmb3JtYW5jZSBjb3VudGVyIGludGVycnVwdHMuCi0JICovCi0Jc3dpdGNoIChpbnRyKSB7Ci0JY2FzZSBHSUNfTE9DQUxfSU5UX1RJTUVSOgotCWNhc2UgR0lDX0xPQ0FMX0lOVF9QRVJGQ1RSOgotCWNhc2UgR0lDX0xPQ0FMX0lOVF9GREM6Ci0JCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLAotCQkJCQkgJmdpY19hbGxfdnBlc19sb2NhbF9pcnFfY29udHJvbGxlciwKLQkJCQkJIGhhbmRsZV9wZXJjcHVfaXJxKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsCi0JCQkJCSAmZ2ljX2xvY2FsX2lycV9jb250cm9sbGVyLAotCQkJCQkgaGFuZGxlX3BlcmNwdV9kZXZpZF9pcnEpOwotCQlpcnFfc2V0X3BlcmNwdV9kZXZpZCh2aXJxKTsKLQkJYnJlYWs7Ci0JfQotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdpY19sb2NrLCBmbGFncyk7CiAJZm9yIChpID0gMDsgaSA8IGdpY192cGVzOyBpKyspIHsKIAkJdTMyIHZhbCA9IEdJQ19NQVBfVE9fUElOX01TSyB8IGdpY19jcHVfcGluOwpAQCAtNzI0LDE2ICs2OTMsNDIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnaWNfaXJxX2RvbWFpbl9tYXAoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCB2aXJxLAotCQkJICAgICAgaXJxX2h3X251bWJlcl90IGh3KQorc3RhdGljIGludCBnaWNfc2V0dXBfZGV2X2NoaXAoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJICAgICAgdW5zaWduZWQgaW50IGh3aXJxKQogewotCWlmIChHSUNfSFdJUlFfVE9fTE9DQUwoaHcpIDwgR0lDX05VTV9MT0NBTF9JTlRSUykKLQkJcmV0dXJuIGdpY19sb2NhbF9pcnFfZG9tYWluX21hcChkLCB2aXJxLCBodyk7CisJc3RydWN0IGlycV9jaGlwICpjaGlwOworCWludCBlcnI7CiAKLQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJmdpY19sZXZlbF9pcnFfY29udHJvbGxlciwKLQkJCQkgaGFuZGxlX2xldmVsX2lycSk7CisJaWYgKGh3aXJxID49IEdJQ19TSEFSRURfSFdJUlFfQkFTRSkgeworCQllcnIgPSBpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkLCB2aXJxLCBod2lycSwKKwkJCQkJCSAgICAmZ2ljX2xldmVsX2lycV9jb250cm9sbGVyLAorCQkJCQkJICAgIE5VTEwpOworCX0gZWxzZSB7CisJCXN3aXRjaCAoR0lDX0hXSVJRX1RPX0xPQ0FMKGh3aXJxKSkgeworCQljYXNlIEdJQ19MT0NBTF9JTlRfVElNRVI6CisJCWNhc2UgR0lDX0xPQ0FMX0lOVF9QRVJGQ1RSOgorCQljYXNlIEdJQ19MT0NBTF9JTlRfRkRDOgorCQkJLyoKKwkJCSAqIEhBQ0s6IFRoZXNlIGFyZSBhbGwgcmVhbGx5IHBlcmNwdSBpbnRlcnJ1cHRzLCBidXQKKwkJCSAqIHRoZSByZXN0IG9mIHRoZSBNSVBTIGtlcm5lbCBjb2RlIGRvZXMgbm90IHVzZSB0aGUKKwkJCSAqIHBlcmNwdSBJUlEgQVBJIGZvciB0aGVtLgorCQkJICovCisJCQljaGlwID0gJmdpY19hbGxfdnBlc19sb2NhbF9pcnFfY29udHJvbGxlcjsKKwkJCWlycV9zZXRfaGFuZGxlcih2aXJxLCBoYW5kbGVfcGVyY3B1X2lycSk7CisJCQlicmVhazsKIAotCXJldHVybiBnaWNfc2hhcmVkX2lycV9kb21haW5fbWFwKGQsIHZpcnEsIGh3LCAwKTsKKwkJZGVmYXVsdDoKKwkJCWNoaXAgPSAmZ2ljX2xvY2FsX2lycV9jb250cm9sbGVyOworCQkJaXJxX3NldF9oYW5kbGVyKHZpcnEsIGhhbmRsZV9wZXJjcHVfZGV2aWRfaXJxKTsKKwkJCWlycV9zZXRfcGVyY3B1X2RldmlkKHZpcnEpOworCQkJYnJlYWs7CisJCX0KKworCQllcnIgPSBpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkLCB2aXJxLCBod2lycSwKKwkJCQkJCSAgICBjaGlwLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGdpY19pcnFfZG9tYWluX2FsbG9jKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgdmlycSwKQEAgLTc0NCwxNSArNzM5LDEyIEBACiAJaW50IGNwdSwgcmV0LCBpOwogCiAJaWYgKHNwZWMtPnR5cGUgPT0gR0lDX0RFVklDRSkgewotCQkvKiB2ZXJpZnkgdGhhdCBpdCBkb2Vzbid0IGNvbmZsaWN0IHdpdGggYW4gSVBJIGlycSAqLwotCQlpZiAodGVzdF9iaXQoc3BlYy0+aHdpcnEsIGlwaV9yZXNydikpCisJCS8qIHZlcmlmeSB0aGF0IHNoYXJlZCBpcnFzIGRvbid0IGNvbmZsaWN0IHdpdGggYW4gSVBJIGlycSAqLworCQlpZiAoKHNwZWMtPmh3aXJxID49IEdJQ19TSEFSRURfSFdJUlFfQkFTRSkgJiYKKwkJICAgIHRlc3RfYml0KEdJQ19IV0lSUV9UT19TSEFSRUQoc3BlYy0+aHdpcnEpLCBpcGlfcmVzcnYpKQogCQkJcmV0dXJuIC1FQlVTWTsKIAotCQlod2lycSA9IEdJQ19TSEFSRURfVE9fSFdJUlEoc3BlYy0+aHdpcnEpOwotCi0JCXJldHVybiBpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkLCB2aXJxLCBod2lycSwKLQkJCQkJCSAgICAgJmdpY19sZXZlbF9pcnFfY29udHJvbGxlciwKLQkJCQkJCSAgICAgTlVMTCk7CisJCXJldHVybiBnaWNfc2V0dXBfZGV2X2NoaXAoZCwgdmlycSwgc3BlYy0+aHdpcnEpOwogCX0gZWxzZSB7CiAJCWJhc2VfaHdpcnEgPSBmaW5kX2ZpcnN0X2JpdChpcGlfcmVzcnYsIGdpY19zaGFyZWRfaW50cnMpOwogCQlpZiAoYmFzZV9od2lycSA9PSBnaWNfc2hhcmVkX2ludHJzKSB7CkBAIC04MjEsNyArODEzLDYgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyBnaWNfaXJxX2RvbWFpbl9vcHMgPSB7Ci0JLm1hcCA9IGdpY19pcnFfZG9tYWluX21hcCwKIAkuYWxsb2MgPSBnaWNfaXJxX2RvbWFpbl9hbGxvYywKIAkuZnJlZSA9IGdpY19pcnFfZG9tYWluX2ZyZWUsCiAJLm1hdGNoID0gZ2ljX2lycV9kb21haW5fbWF0Y2gsCkBAIC04NTIsMjkgKzg0MywyMCBAQAogCXN0cnVjdCBpcnFfZndzcGVjICpmd3NwZWMgPSBhcmc7CiAJc3RydWN0IGdpY19pcnFfc3BlYyBzcGVjID0gewogCQkudHlwZSA9IEdJQ19ERVZJQ0UsCi0JCS5od2lycSA9IGZ3c3BlYy0+cGFyYW1bMV0sCiAJfTsKIAlpbnQgaSwgcmV0OwotCWJvb2wgaXNfc2hhcmVkID0gZndzcGVjLT5wYXJhbVswXSA9PSBHSUNfU0hBUkVEOwogCi0JaWYgKGlzX3NoYXJlZCkgewotCQlyZXQgPSBpcnFfZG9tYWluX2FsbG9jX2lycXNfcGFyZW50KGQsIHZpcnEsIG5yX2lycXMsICZzcGVjKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQorCWlmIChmd3NwZWMtPnBhcmFtWzBdID09IEdJQ19TSEFSRUQpCisJCXNwZWMuaHdpcnEgPSBHSUNfU0hBUkVEX1RPX0hXSVJRKGZ3c3BlYy0+cGFyYW1bMV0pOworCWVsc2UKKwkJc3BlYy5od2lycSA9IEdJQ19MT0NBTF9UT19IV0lSUShmd3NwZWMtPnBhcmFtWzFdKTsKKworCXJldCA9IGlycV9kb21haW5fYWxsb2NfaXJxc19wYXJlbnQoZCwgdmlycSwgbnJfaXJxcywgJnNwZWMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKSB7Ci0JCWlycV9od19udW1iZXJfdCBod2lycTsKLQotCQlpZiAoaXNfc2hhcmVkKQotCQkJaHdpcnEgPSBHSUNfU0hBUkVEX1RPX0hXSVJRKHNwZWMuaHdpcnEgKyBpKTsKLQkJZWxzZQotCQkJaHdpcnEgPSBHSUNfTE9DQUxfVE9fSFdJUlEoc3BlYy5od2lycSArIGkpOwotCi0JCXJldCA9IGlycV9kb21haW5fc2V0X2h3aXJxX2FuZF9jaGlwKGQsIHZpcnEgKyBpLAotCQkJCQkJICAgIGh3aXJxLAotCQkJCQkJICAgICZnaWNfbGV2ZWxfaXJxX2NvbnRyb2xsZXIsCi0JCQkJCQkgICAgTlVMTCk7CisJCXJldCA9IGdpY19zZXR1cF9kZXZfY2hpcChkLCB2aXJxICsgaSwgc3BlYy5od2lycSArIGkpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJvcjsKIAl9CkBAIC04OTYsNyArODc4LDEwIEBACiBzdGF0aWMgdm9pZCBnaWNfZGV2X2RvbWFpbl9hY3RpdmF0ZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLAogCQkJCSAgICBzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0JZ2ljX3NoYXJlZF9pcnFfZG9tYWluX21hcChkb21haW4sIGQtPmlycSwgZC0+aHdpcnEsIDApOworCWlmIChHSUNfSFdJUlFfVE9fTE9DQUwoZC0+aHdpcnEpIDwgR0lDX05VTV9MT0NBTF9JTlRSUykKKwkJZ2ljX2xvY2FsX2lycV9kb21haW5fbWFwKGRvbWFpbiwgZC0+aXJxLCBkLT5od2lycSk7CisJZWxzZQorCQlnaWNfc2hhcmVkX2lycV9kb21haW5fbWFwKGRvbWFpbiwgZC0+aXJxLCBkLT5od2lycSwgMCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgZ2ljX2Rldl9kb21haW5fb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1tdmVidS1waWMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtbXZlYnUtcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjNjM5NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtbXZlYnUtcGljLmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTWFydmVsbAorICoKKyAqIFllaHVkYSBZaXRzY2hhayA8eWVodWRheUBtYXJ2ZWxsLmNvbT4KKyAqIFRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuICBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2NoYWluZWRfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNkZWZpbmUgUElDX0NBVVNFCSAgICAgICAweDAKKyNkZWZpbmUgUElDX01BU0sJICAgICAgIDB4NAorCisjZGVmaW5lIFBJQ19NQVhfSVJRUwkJMzIKKyNkZWZpbmUgUElDX01BWF9JUlFfTUFTSwkoKDFVTCA8PCBQSUNfTUFYX0lSUVMpIC0gMSkKKworc3RydWN0IG12ZWJ1X3BpYyB7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXUzMiBwYXJlbnRfaXJxOworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47CisJc3RydWN0IGlycV9jaGlwIGlycV9jaGlwOworfTsKKworc3RhdGljIHZvaWQgbXZlYnVfcGljX3Jlc2V0KHN0cnVjdCBtdmVidV9waWMgKnBpYykKK3sKKwkvKiBBQ0sgYW5kIG1hc2sgYWxsIGludGVycnVwdHMgKi8KKwl3cml0ZWwoMCwgcGljLT5iYXNlICsgUElDX01BU0spOworCXdyaXRlbChQSUNfTUFYX0lSUV9NQVNLLCBwaWMtPmJhc2UgKyBQSUNfQ0FVU0UpOworfQorCitzdGF0aWMgdm9pZCBtdmVidV9waWNfZW9pX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IG12ZWJ1X3BpYyAqcGljID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisKKwl3cml0ZWwoMSA8PCBkLT5od2lycSwgcGljLT5iYXNlICsgUElDX0NBVVNFKTsKK30KKworc3RhdGljIHZvaWQgbXZlYnVfcGljX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgbXZlYnVfcGljICpwaWMgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwl1MzIgcmVnOworCisJcmVnID0gIHJlYWRsKHBpYy0+YmFzZSArIFBJQ19NQVNLKTsKKwlyZWcgfD0gKDEgPDwgZC0+aHdpcnEpOworCXdyaXRlbChyZWcsIHBpYy0+YmFzZSArIFBJQ19NQVNLKTsKK30KKworc3RhdGljIHZvaWQgbXZlYnVfcGljX3VubWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBtdmVidV9waWMgKnBpYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXUzMiByZWc7CisKKwlyZWcgPSByZWFkbChwaWMtPmJhc2UgKyBQSUNfTUFTSyk7CisJcmVnICY9IH4oMSA8PCBkLT5od2lycSk7CisJd3JpdGVsKHJlZywgcGljLT5iYXNlICsgUElDX01BU0spOworfQorCitzdGF0aWMgaW50IG12ZWJ1X3BpY19pcnFfbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGludCB2aXJxLAorCQkJICAgICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCit7CisJc3RydWN0IG12ZWJ1X3BpYyAqcGljID0gZG9tYWluLT5ob3N0X2RhdGE7CisKKwlpcnFfc2V0X3BlcmNwdV9kZXZpZCh2aXJxKTsKKwlpcnFfc2V0X2NoaXBfZGF0YSh2aXJxLCBwaWMpOworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmcGljLT5pcnFfY2hpcCwKKwkJCQkgaGFuZGxlX3BlcmNwdV9kZXZpZF9pcnEpOworCWlycV9zZXRfc3RhdHVzX2ZsYWdzKHZpcnEsIElSUV9MRVZFTCk7CisJaXJxX3NldF9wcm9iZSh2aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIG12ZWJ1X3BpY19kb21haW5fb3BzID0geworCS5tYXAgPSBtdmVidV9waWNfaXJxX21hcCwKKwkueGxhdGUgPSBpcnFfZG9tYWluX3hsYXRlX29uZWNlbGwsCit9OworCitzdGF0aWMgdm9pZCBtdmVidV9waWNfaGFuZGxlX2Nhc2NhZGVfaXJxKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgbXZlYnVfcGljICpwaWMgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOworCXVuc2lnbmVkIGxvbmcgaXJxbWFwLCBpcnFuOworCXVuc2lnbmVkIGludCBjYXNjYWRlX2lycTsKKworCWlycW1hcCA9IHJlYWRsX3JlbGF4ZWQocGljLT5iYXNlICsgUElDX0NBVVNFKTsKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKworCWZvcl9lYWNoX3NldF9iaXQoaXJxbiwgJmlycW1hcCwgQklUU19QRVJfTE9ORykgeworCQljYXNjYWRlX2lycSA9IGlycV9maW5kX21hcHBpbmcocGljLT5kb21haW4sIGlycW4pOworCQlnZW5lcmljX2hhbmRsZV9pcnEoY2FzY2FkZV9pcnEpOworCX0KKworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkIG12ZWJ1X3BpY19lbmFibGVfcGVyY3B1X2lycSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBtdmVidV9waWMgKnBpYyA9IGRhdGE7CisKKwltdmVidV9waWNfcmVzZXQocGljKTsKKwllbmFibGVfcGVyY3B1X2lycShwaWMtPnBhcmVudF9pcnEsIElSUV9UWVBFX05PTkUpOworfQorCitzdGF0aWMgdm9pZCBtdmVidV9waWNfZGlzYWJsZV9wZXJjcHVfaXJxKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG12ZWJ1X3BpYyAqcGljID0gZGF0YTsKKworCWRpc2FibGVfcGVyY3B1X2lycShwaWMtPnBhcmVudF9pcnEpOworfQorCitzdGF0aWMgaW50IG12ZWJ1X3BpY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBtdmVidV9waWMgKnBpYzsKKwlzdHJ1Y3QgaXJxX2NoaXAgKmlycV9jaGlwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJcGljID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbXZlYnVfcGljKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaWMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlwaWMtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBpYy0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHBpYy0+YmFzZSk7CisKKwlpcnFfY2hpcCA9ICZwaWMtPmlycV9jaGlwOworCWlycV9jaGlwLT5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CisJaXJxX2NoaXAtPmlycV9tYXNrID0gbXZlYnVfcGljX21hc2tfaXJxOworCWlycV9jaGlwLT5pcnFfdW5tYXNrID0gbXZlYnVfcGljX3VubWFza19pcnE7CisJaXJxX2NoaXAtPmlycV9lb2kgPSBtdmVidV9waWNfZW9pX2lycTsKKworCXBpYy0+cGFyZW50X2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDApOworCWlmIChwaWMtPnBhcmVudF9pcnEgPD0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcGFyc2UgcGFyZW50IGludGVycnVwdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBpYy0+ZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKG5vZGUsIFBJQ19NQVhfSVJRUywKKwkJCQkJICAgICZtdmVidV9waWNfZG9tYWluX29wcywgcGljKTsKKwlpZiAoIXBpYy0+ZG9tYWluKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpcnEgZG9tYWluXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIocGljLT5wYXJlbnRfaXJxLCBtdmVidV9waWNfaGFuZGxlX2Nhc2NhZGVfaXJxKTsKKwlpcnFfc2V0X2hhbmRsZXJfZGF0YShwaWMtPnBhcmVudF9pcnEsIHBpYyk7CisKKwlvbl9lYWNoX2NwdShtdmVidV9waWNfZW5hYmxlX3BlcmNwdV9pcnEsIHBpYywgMSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwaWMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZlYnVfcGljX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdmVidV9waWMgKnBpYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJb25fZWFjaF9jcHUobXZlYnVfcGljX2Rpc2FibGVfcGVyY3B1X2lycSwgcGljLCAxKTsKKwlpcnFfZG9tYWluX3JlbW92ZShwaWMtPmRvbWFpbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXZlYnVfcGljX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLGFybWFkYS04ay1waWMiLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG12ZWJ1X3BpY19vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG12ZWJ1X3BpY19kcml2ZXIgPSB7CisJLnByb2JlICA9IG12ZWJ1X3BpY19wcm9iZSwKKwkucmVtb3ZlID0gbXZlYnVfcGljX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtdmVidS1waWMiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtdmVidV9waWNfb2ZfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG12ZWJ1X3BpY19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJZZWh1ZGEgWWl0c2NoYWsgPHllaHVkYXlAbWFydmVsbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bXZlYnVfcGljIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3RtMzItZXh0aS5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1zdG0zMi1leHRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxNTY4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3RtMzItZXh0aS5jCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSBNYXhpbWUgQ29xdWVsaW4gMjAxNQorICogQXV0aG9yOiAgTWF4aW1lIENvcXVlbGluIDxtY29xdWVsaW4uc3RtMzJAZ21haWwuY29tPgorICogTGljZW5zZSB0ZXJtczogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCB2ZXJzaW9uIDIKKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwLmg+CisjaW5jbHVkZSA8bGludXgvaXJxY2hpcC9jaGFpbmVkX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKworI2RlZmluZSBFWFRJX0lNUgkweDAKKyNkZWZpbmUgRVhUSV9FTVIJMHg0CisjZGVmaW5lIEVYVElfUlRTUgkweDgKKyNkZWZpbmUgRVhUSV9GVFNSCTB4YworI2RlZmluZSBFWFRJX1NXSUVSCTB4MTAKKyNkZWZpbmUgRVhUSV9QUgkJMHgxNAorCitzdGF0aWMgdm9pZCBzdG0zMl9pcnFfaGFuZGxlcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbiA9IGlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gZG9tYWluLT5nYy0+Z2NbMF07CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7CisJdW5zaWduZWQgbG9uZyBwZW5kaW5nOworCWludCBuOworCisJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CisKKwl3aGlsZSAoKHBlbmRpbmcgPSBpcnFfcmVnX3JlYWRsKGdjLCBFWFRJX1BSKSkpIHsKKwkJZm9yX2VhY2hfc2V0X2JpdChuLCAmcGVuZGluZywgQklUU19QRVJfTE9ORykgeworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycV9maW5kX21hcHBpbmcoZG9tYWluLCBuKSk7CisJCQlpcnFfcmVnX3dyaXRlbChnYywgQklUKG4pLCBFWFRJX1BSKTsKKwkJfQorCX0KKworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKK3N0YXRpYyBpbnQgc3RtMzJfaXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJaW50IHBpbiA9IGRhdGEtPmh3aXJxOworCXUzMiBydHNyLCBmdHNyOworCisJaXJxX2djX2xvY2soZ2MpOworCisJcnRzciA9IGlycV9yZWdfcmVhZGwoZ2MsIEVYVElfUlRTUik7CisJZnRzciA9IGlycV9yZWdfcmVhZGwoZ2MsIEVYVElfRlRTUik7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgorCQlydHNyIHw9IEJJVChwaW4pOworCQlmdHNyICY9IH5CSVQocGluKTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCXJ0c3IgJj0gfkJJVChwaW4pOworCQlmdHNyIHw9IEJJVChwaW4pOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJcnRzciB8PSBCSVQocGluKTsKKwkJZnRzciB8PSBCSVQocGluKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaXJxX2djX3VubG9jayhnYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlycV9yZWdfd3JpdGVsKGdjLCBydHNyLCBFWFRJX1JUU1IpOworCWlycV9yZWdfd3JpdGVsKGdjLCBmdHNyLCBFWFRJX0ZUU1IpOworCisJaXJxX2djX3VubG9jayhnYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdG0zMl9pcnFfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgb24pCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJaW50IHBpbiA9IGRhdGEtPmh3aXJxOworCXUzMiBlbXI7CisKKwlpcnFfZ2NfbG9jayhnYyk7CisKKwllbXIgPSBpcnFfcmVnX3JlYWRsKGdjLCBFWFRJX0VNUik7CisJaWYgKG9uKQorCQllbXIgfD0gQklUKHBpbik7CisJZWxzZQorCQllbXIgJj0gfkJJVChwaW4pOworCWlycV9yZWdfd3JpdGVsKGdjLCBlbXIsIEVYVElfRU1SKTsKKworCWlycV9nY191bmxvY2soZ2MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RtMzJfZXh0aV9hbGxvYyhzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgdW5zaWduZWQgaW50IHZpcnEsCisJCQkgICAgdW5zaWduZWQgaW50IG5yX2lycXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjID0gZC0+Z2MtPmdjWzBdOworCXN0cnVjdCBpcnFfZndzcGVjICpmd3NwZWMgPSBkYXRhOworCWlycV9od19udW1iZXJfdCBod2lycTsKKworCWh3aXJxID0gZndzcGVjLT5wYXJhbVswXTsKKworCWlycV9tYXBfZ2VuZXJpY19jaGlwKGQsIHZpcnEsIGh3aXJxKTsKKwlpcnFfZG9tYWluX3NldF9pbmZvKGQsIHZpcnEsIGh3aXJxLCAmZ2MtPmNoaXBfdHlwZXMtPmNoaXAsIGdjLAorCQkJICAgIGhhbmRsZV9zaW1wbGVfaXJxLCBOVUxMLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdG0zMl9leHRpX2ZyZWUoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJICAgIHVuc2lnbmVkIGludCBucl9pcnFzKQoreworCXN0cnVjdCBpcnFfZGF0YSAqZGF0YSA9IGlycV9kb21haW5fZ2V0X2lycV9kYXRhKGQsIHZpcnEpOworCisJaXJxX2RvbWFpbl9yZXNldF9pcnFfZGF0YShkYXRhKTsKK30KKworc3RydWN0IGlycV9kb21haW5fb3BzIGlycV9leHRpX2RvbWFpbl9vcHMgPSB7CisJLm1hcAk9IGlycV9tYXBfZ2VuZXJpY19jaGlwLAorCS54bGF0ZQk9IGlycV9kb21haW5feGxhdGVfb25ldHdvY2VsbCwKKwkuYWxsb2MgID0gc3RtMzJfZXh0aV9hbGxvYywKKwkuZnJlZQk9IHN0bTMyX2V4dGlfZnJlZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHN0bTMyX2V4dGlfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKK3sKKwl1bnNpZ25lZCBpbnQgY2xyID0gSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFIHwgSVJRX05PQVVUT0VOOworCWludCBucl9pcnFzLCBucl9leHRpLCByZXQsIGk7CisJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW47CisJdm9pZCAqYmFzZTsKKworCWJhc2UgPSBvZl9pb21hcChub2RlLCAwKTsKKwlpZiAoIWJhc2UpIHsKKwkJcHJfZXJyKCIlczogVW5hYmxlIHRvIG1hcCByZWdpc3RlcnNcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIERldGVybWluZSBudW1iZXIgb2YgaXJxcyBzdXBwb3J0ZWQgKi8KKwl3cml0ZWxfcmVsYXhlZCh+MFVMLCBiYXNlICsgRVhUSV9SVFNSKTsKKwlucl9leHRpID0gZmxzKHJlYWRsX3JlbGF4ZWQoYmFzZSArIEVYVElfUlRTUikpOworCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBFWFRJX1JUU1IpOworCisJcHJfaW5mbygiJXM6ICVkIEV4dGVybmFsIElSUXMgZGV0ZWN0ZWRcbiIsIG5vZGUtPmZ1bGxfbmFtZSwgbnJfZXh0aSk7CisKKwlkb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIobm9kZSwgbnJfZXh0aSwKKwkJCQkgICAgICAgJmlycV9leHRpX2RvbWFpbl9vcHMsIE5VTEwpOworCWlmICghZG9tYWluKSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCByZWdpc3RlciBpbnRlcnJ1cHQgZG9tYWluLlxuIiwKKwkJCQlub2RlLT5uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5tYXA7CisJfQorCisJcmV0ID0gaXJxX2FsbG9jX2RvbWFpbl9nZW5lcmljX2NoaXBzKGRvbWFpbiwgbnJfZXh0aSwgMSwgImV4dGkiLAorCQkJCQkgICAgIGhhbmRsZV9lZGdlX2lycSwgY2xyLCAwLCAwKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBnZW5lcmljIGludGVycnVwdCBjaGlwLlxuIiwKKwkJCW5vZGUtPmZ1bGxfbmFtZSk7CisJCWdvdG8gb3V0X2ZyZWVfZG9tYWluOworCX0KKworCWdjID0gZG9tYWluLT5nYy0+Z2NbMF07CisJZ2MtPnJlZ19iYXNlICAgICAgICAgICAgICAgICAgICAgICAgID0gYmFzZTsKKwlnYy0+Y2hpcF90eXBlcy0+dHlwZSAgICAgICAgICAgICAgID0gSVJRX1RZUEVfRURHRV9CT1RIOworCWdjLT5jaGlwX3R5cGVzLT5jaGlwLm5hbWUgICAgICAgICAgPSBnYy0+Y2hpcF90eXBlc1swXS5jaGlwLm5hbWU7CisJZ2MtPmNoaXBfdHlwZXMtPmNoaXAuaXJxX2FjayAgICAgICA9IGlycV9nY19hY2tfc2V0X2JpdDsKKwlnYy0+Y2hpcF90eXBlcy0+Y2hpcC5pcnFfbWFzayAgICAgID0gaXJxX2djX21hc2tfY2xyX2JpdDsKKwlnYy0+Y2hpcF90eXBlcy0+Y2hpcC5pcnFfdW5tYXNrICAgID0gaXJxX2djX21hc2tfc2V0X2JpdDsKKwlnYy0+Y2hpcF90eXBlcy0+Y2hpcC5pcnFfc2V0X3R5cGUgID0gc3RtMzJfaXJxX3NldF90eXBlOworCWdjLT5jaGlwX3R5cGVzLT5jaGlwLmlycV9zZXRfd2FrZSAgPSBzdG0zMl9pcnFfc2V0X3dha2U7CisJZ2MtPmNoaXBfdHlwZXMtPnJlZ3MuYWNrICAgICAgICAgICA9IEVYVElfUFI7CisJZ2MtPmNoaXBfdHlwZXMtPnJlZ3MubWFzayAgICAgICAgICA9IEVYVElfSU1SOworCWdjLT5jaGlwX3R5cGVzLT5oYW5kbGVyICAgICAgICAgICAgPSBoYW5kbGVfZWRnZV9pcnE7CisKKwlucl9pcnFzID0gb2ZfaXJxX2NvdW50KG5vZGUpOworCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIGkpOworCisJCWlycV9zZXRfaGFuZGxlcl9kYXRhKGlycSwgZG9tYWluKTsKKwkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoaXJxLCBzdG0zMl9pcnFfaGFuZGxlcik7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9mcmVlX2RvbWFpbjoKKwlpcnFfZG9tYWluX3JlbW92ZShkb21haW4pOworb3V0X3VubWFwOgorCWlvdW5tYXAoYmFzZSk7CisJcmV0dXJuIHJldDsKK30KKworSVJRQ0hJUF9ERUNMQVJFKHN0bTMyX2V4dGksICJzdCxzdG0zMi1leHRpIiwgc3RtMzJfZXh0aV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9hdm1mcml0ei5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKaW5kZXggMjkyOTkxYy4uZTNmYTFjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2F2bWZyaXR6LmMKQEAgLTI4NCw3ICsyODQsNyBAQAogCQkJCQkgIEFWTV9IRExDX1NUQVRVU18xKSk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiB3cml0ZV9jdHJsKHN0cnVjdCBiY2hhbm5lbCAqYmNoLCBpbnQgd2hpY2gpIHsKIAlzdHJ1Y3QgZnJpdHpjYXJkICpmYyA9IGJjaC0+aHc7CiAJc3RydWN0IGhkbGNfaHcgKmhkbGM7CkBAIC03NDEsNyArNzQxLDcgQEAKIAltb2RlaGRsYygmZmMtPmJjaFsxXSwgLTEpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogY2xlYXJfcGVuZGluZ19oZGxjX2ludHMoc3RydWN0IGZyaXR6Y2FyZCAqZmMpCiB7CiAJdTMyIHZhbDsKQEAgLTk2Miw3ICs5NjIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludAorc3RhdGljIGludAogc2V0dXBfZnJpdHooc3RydWN0IGZyaXR6Y2FyZCAqZmMpCiB7CiAJdTMyIHZhbCwgdmVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYwppbmRleCAyODU0M2Q3Li40ODBjMmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYwpAQCAtNTY0LDE5ICs1NjQsMTkgQEAKICNkZWZpbmUJTUFYX1RETV9DSEFOIDMyCiAKIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogZW5hYmxlcGNpYnJpZGdlKHN0cnVjdCBoZmNfbXVsdGkgKmMpCiB7CiAJSEZDX291dGIoYywgUl9CUkdfUENNX0NGRywgKDB4MCA8PCA2KSB8IDB4Myk7IC8qIHdhcyBfaW8gYmVmb3JlICovCiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIGRpc2FibGVwY2licmlkZ2Uoc3RydWN0IGhmY19tdWx0aSAqYykKIHsKIAlIRkNfb3V0YihjLCBSX0JSR19QQ01fQ0ZHLCAoMHgwIDw8IDYpIHwgMHgyKTsgLyogd2FzIF9pbyBiZWZvcmUgKi8KIH0KIAotaW5saW5lIHVuc2lnbmVkIGNoYXIKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhcgogcmVhZHBjaWJyaWRnZShzdHJ1Y3QgaGZjX211bHRpICpoYywgdW5zaWduZWQgY2hhciBhZGRyZXNzKQogewogCXVuc2lnbmVkIHNob3J0IGNpcHY7CkBAIC02MDQsNyArNjA0LDcgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogd3JpdGVwY2licmlkZ2Uoc3RydWN0IGhmY19tdWx0aSAqaGMsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywgdW5zaWduZWQgY2hhciBkYXRhKQogewogCXVuc2lnbmVkIHNob3J0IGNpcHY7CkBAIC02MzQsMTQgKzYzNCwxNCBAQAogCW91dGwoZGF0YXYsIGhjLT5wY2lfaW9iYXNlKTsKIH0KIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogY3BsZF9zZXRfcmVnKHN0cnVjdCBoZmNfbXVsdGkgKmhjLCB1bnNpZ25lZCBjaGFyIHJlZykKIHsKIAkvKiBEbyBkYXRhIHBpbiByZWFkIGxvdyBieXRlICovCiAJSEZDX291dGIoaGMsIFJfR1BJT19PVVQxLCByZWcpOwogfQogCi1pbmxpbmUgdm9pZAorc3RhdGljIGlubGluZSB2b2lkCiBjcGxkX3dyaXRlX3JlZyhzdHJ1Y3QgaGZjX211bHRpICpoYywgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgdmFsKQogewogCWNwbGRfc2V0X3JlZyhoYywgcmVnKTsKQEAgLTY1Myw3ICs2NTMsNyBAQAogCXJldHVybjsKIH0KIAotaW5saW5lIHVuc2lnbmVkIGNoYXIKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhcgogY3BsZF9yZWFkX3JlZyhzdHJ1Y3QgaGZjX211bHRpICpoYywgdW5zaWduZWQgY2hhciByZWcpCiB7CiAJdW5zaWduZWQgY2hhciBieXRlaW47CkBAIC02NzAsMTQgKzY3MCwxNCBAQAogCXJldHVybiBieXRlaW47CiB9CiAKLWlubGluZSB2b2lkCitzdGF0aWMgaW5saW5lIHZvaWQKIHZwbV93cml0ZV9hZGRyZXNzKHN0cnVjdCBoZmNfbXVsdGkgKmhjLCB1bnNpZ25lZCBzaG9ydCBhZGRyKQogewogCWNwbGRfd3JpdGVfcmVnKGhjLCAwLCAweGZmICYgYWRkcik7CiAJY3BsZF93cml0ZV9yZWcoaGMsIDEsIDB4MDEgJiAoYWRkciA+PiA4KSk7CiB9CiAKLWlubGluZSB1bnNpZ25lZCBzaG9ydAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAogdnBtX3JlYWRfYWRkcmVzcyhzdHJ1Y3QgaGZjX211bHRpICpjKQogewogCXVuc2lnbmVkIHNob3J0IGFkZHI7CkBAIC02OTEsNyArNjkxLDcgQEAKIAlyZXR1cm4gYWRkciAmIDB4MWZmOwogfQogCi1pbmxpbmUgdW5zaWduZWQgY2hhcgorc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyCiB2cG1faW4oc3RydWN0IGhmY19tdWx0aSAqYywgaW50IHdoaWNoLCB1bnNpZ25lZCBzaG9ydCBhZGRyKQogewogCXVuc2lnbmVkIGNoYXIgcmVzOwpAQCAtNzEyLDcgKzcxMiw3IEBACiAJcmV0dXJuIHJlczsKIH0KIAotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogdnBtX291dChzdHJ1Y3QgaGZjX211bHRpICpjLCBpbnQgd2hpY2gsIHVuc2lnbmVkIHNob3J0IGFkZHIsCiAJdW5zaWduZWQgY2hhciBkYXRhKQogewpAQCAtMTAyNCw3ICsxMDI0LDcgQEAKIH0KIAogLyogVGhpcyBtdXN0IGJlIGNhbGxlZCBBTkQgaGMgbXVzdCBiZSBsb2NrZWQgaXJxc2F2ZSEhISAqLwotaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgdm9pZAogcGx4c2RfY2hlY2tzeW5jKHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBpbnQgcm0pCiB7CiAJaWYgKGhjLT5zeW5jcm9uaXplZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaXBhYy5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaXBhYy5jCmluZGV4IGFhOWI2YzMuLjhkMzM4YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmlwYWMuYworKysgYi9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pcGFjLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXByX2RlYnVnKCIlczogVEUgbmV3c3RhdGUgJXhcbiIsIGlzYWMtPm5hbWUsIGRjaC0+c3RhdGUpOwogfQogCi12b2lkCitzdGF0aWMgdm9pZAogaXNhY19lbXB0eV9maWZvKHN0cnVjdCBpc2FjX2h3ICppc2FjLCBpbnQgY291bnQpCiB7CiAJdTggKnB0cjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi93NjY5Mi5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL3c2NjkyLmMKaW5kZXggNzQxNjc1NS4uM2IwNjdlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL3c2NjkyLmMKKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL3c2NjkyLmMKQEAgLTg0OCw3ICs4NDgsNyBAQAogCX0KIH0KIAotdm9pZCBpbml0VzY2OTIoc3RydWN0IHc2NjkyX2h3ICpjYXJkKQorc3RhdGljIHZvaWQgaW5pdFc2NjkyKHN0cnVjdCB3NjY5Ml9odyAqY2FyZCkKIHsKIAl1OAl2YWw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9LY29uZmlnIGIvZHJpdmVycy9sZWRzL0tjb25maWcKaW5kZXggOWRjYzliMS4uN2E2MjhjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL0tjb25maWcKKysrIGIvZHJpdmVycy9sZWRzL0tjb25maWcKQEAgLTU4NCw2ICs1ODQsMTggQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbyB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBsZWRzLXNlYWQzLgogCitjb25maWcgTEVEU19JUzMxRkwzMTlYCisJdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciBJU1NJIElTMzFGTDMxOXggSTJDIExFRCBjb250cm9sbGVyIGZhbWlseSIKKwlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgSTJDICYmIE9GCisJc2VsZWN0IFJFR01BUF9JMkMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIExFRHMgY29ubmVjdGVkIHRvIElTU0kgSVMzMUZMMzE5eAorCSAgZmFuY3kgTEVEIGRyaXZlciBjaGlwcyBhY2Nlc3NlZCB2aWEgdGhlIEkyQyBidXMuCisJICBEcml2ZXIgc3VwcG9ydHMgaW5kaXZpZHVhbCBQV00gYnJpZ2h0bmVzcyBjb250cm9sIGZvciBlYWNoIGNoYW5uZWwuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbyB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBsZWRzLWlzMzFmbDMxOXguCisKIGNvbmZpZyBMRURTX0lTMzFGTDMyWFgKIAl0cmlzdGF0ZSAiTEVEIHN1cHBvcnQgZm9yIElTU0kgSVMzMUZMMzJYWCBJMkMgTEVEIGNvbnRyb2xsZXIgZmFtaWx5IgogCWRlcGVuZHMgb24gTEVEU19DTEFTUyAmJiBJMkMgJiYgT0YKQEAgLTYzMSw2ICs2NDMsMjIgQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZWQgc3VwcG9ydCBmb3IgdGhlIExFRHMgb24gdGhlIEFSTSBWZXJzYXRpbGUKIAkgIGFuZCBSZWFsVmlldyBib2FyZHMuIFNheSBZIHRvIGVuYWJsZWQgdGhlc2UuCiAKK2NvbmZpZyBMRURTX1BNODA1OAorCXRyaXN0YXRlICJMRUQgU3VwcG9ydCBmb3IgdGhlIFF1YWxjb21tIFBNODA1OCBQTUlDIgorCWRlcGVuZHMgb24gTUZEX1BNODkyMV9DT1JFCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTCisJaGVscAorCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUgTEVEIGRyaXZlcnMgaW4KKwkgIHRoZSBRdWFsY29tbSBQTTgwNTggUE1JQy4KKworY29uZmlnIExFRFNfTUxYQ1BMRAorCXRyaXN0YXRlICJMRUQgc3VwcG9ydCBmb3IgdGhlIE1lbGxhbm94IGJvYXJkcyIKKwlkZXBlbmRzIG9uIFg4Nl82NCAmJiBETUkKKwlkZXBlbmRzIG9uIExFRFNfQ0xBU1MKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVkIHN1cHBvcnQgZm9yIHRoZSBMRURzIG9uIHRoZSBNZWxsYW5veAorCSAgYm9hcmRzLiBTYXkgWSB0byBlbmFibGVkIHRoZXNlLgorCiBjb21tZW50ICJMRUQgVHJpZ2dlcnMiCiBzb3VyY2UgImRyaXZlcnMvbGVkcy90cmlnZ2VyL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9NYWtlZmlsZSBiL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQppbmRleCAwNjg0Yzg2Li4zOTY1MDcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9sZWRzL01ha2VmaWxlCkBAIC02Nyw3ICs2NywxMCBAQAogb2JqLSQoQ09ORklHX0xFRFNfS1REMjY5MikJCSs9IGxlZHMta3RkMjY5Mi5vCiBvYmotJChDT05GSUdfTEVEU19QT1dFUk5WKQkJKz0gbGVkcy1wb3dlcm52Lm8KIG9iai0kKENPTkZJR19MRURTX1NFQUQzKQkJKz0gbGVkcy1zZWFkMy5vCitvYmotJChDT05GSUdfTEVEU19JUzMxRkwzMTlYKQkJKz0gbGVkcy1pczMxZmwzMTl4Lm8KIG9iai0kKENPTkZJR19MRURTX0lTMzFGTDMyWFgpCQkrPSBsZWRzLWlzMzFmbDMyeHgubworb2JqLSQoQ09ORklHX0xFRFNfUE04MDU4KQkJKz0gbGVkcy1wbTgwNTgubworb2JqLSQoQ09ORklHX0xFRFNfTUxYQ1BMRCkJCSs9IGxlZHMtbWx4Y3BsZC5vCiAKICMgTEVEIFNQSSBEcml2ZXJzCiBvYmotJChDT05GSUdfTEVEU19EQUMxMjRTMDg1KQkJKz0gbGVkcy1kYWMxMjRzMDg1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWQtdHJpZ2dlcnMuYyBiL2RyaXZlcnMvbGVkcy9sZWQtdHJpZ2dlcnMuYwppbmRleCBjOTI3MDJhLi40MzExMjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkLXRyaWdnZXJzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZC10cmlnZ2Vycy5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTgxLDIxICs4MSwyMyBAQAogCWRvd25fcmVhZCgmbGVkX2NkZXYtPnRyaWdnZXJfbG9jayk7CiAKIAlpZiAoIWxlZF9jZGV2LT50cmlnZ2VyKQotCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiW25vbmVdICIpOworCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZitsZW4sIFBBR0VfU0laRSAtIGxlbiwgIltub25lXSAiKTsKIAllbHNlCi0JCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJub25lICIpOworCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZitsZW4sIFBBR0VfU0laRSAtIGxlbiwgIm5vbmUgIik7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyaWcsICZ0cmlnZ2VyX2xpc3QsIG5leHRfdHJpZykgewogCQlpZiAobGVkX2NkZXYtPnRyaWdnZXIgJiYgIXN0cmNtcChsZWRfY2Rldi0+dHJpZ2dlci0+bmFtZSwKIAkJCQkJCQl0cmlnLT5uYW1lKSkKLQkJCWxlbiArPSBzcHJpbnRmKGJ1ZitsZW4sICJbJXNdICIsIHRyaWctPm5hbWUpOworCQkJbGVuICs9IHNjbnByaW50ZihidWYrbGVuLCBQQUdFX1NJWkUgLSBsZW4sICJbJXNdICIsCisJCQkJCSB0cmlnLT5uYW1lKTsKIAkJZWxzZQotCQkJbGVuICs9IHNwcmludGYoYnVmK2xlbiwgIiVzICIsIHRyaWctPm5hbWUpOworCQkJbGVuICs9IHNjbnByaW50ZihidWYrbGVuLCBQQUdFX1NJWkUgLSBsZW4sICIlcyAiLAorCQkJCQkgdHJpZy0+bmFtZSk7CiAJfQogCXVwX3JlYWQoJmxlZF9jZGV2LT50cmlnZ2VyX2xvY2spOwogCXVwX3JlYWQoJnRyaWdnZXJzX2xpc3RfbG9jayk7CiAKLQlsZW4gKz0gc3ByaW50ZihsZW4rYnVmLCAiXG4iKTsKKwlsZW4gKz0gc2NucHJpbnRmKGxlbitidWYsIFBBR0VfU0laRSAtIGxlbiwgIlxuIik7CiAJcmV0dXJuIGxlbjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxlZF90cmlnZ2VyX3Nob3cpOwpAQCAtMTA4LDYgKzExMCw5IEBACiAJY2hhciAqZW52cFsyXTsKIAljb25zdCBjaGFyICpuYW1lOwogCisJaWYgKCFsZWRfY2Rldi0+dHJpZ2dlciAmJiAhdHJpZykKKwkJcmV0dXJuOworCiAJbmFtZSA9IHRyaWcgPyB0cmlnLT5uYW1lIDogIm5vbmUiOwogCWV2ZW50ID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJUUklHR0VSPSVzIiwgbmFtZSk7CiAKQEAgLTEzNiw3ICsxNDEsOSBAQAogCWlmIChldmVudCkgewogCQllbnZwWzBdID0gZXZlbnQ7CiAJCWVudnBbMV0gPSBOVUxMOwotCQlrb2JqZWN0X3VldmVudF9lbnYoJmxlZF9jZGV2LT5kZXYtPmtvYmosIEtPQkpfQ0hBTkdFLCBlbnZwKTsKKwkJaWYgKGtvYmplY3RfdWV2ZW50X2VudigmbGVkX2NkZXYtPmRldi0+a29iaiwgS09CSl9DSEFOR0UsIGVudnApKQorCQkJZGV2X2VycihsZWRfY2Rldi0+ZGV2LAorCQkJCSIlczogRXJyb3Igc2VuZGluZyB1ZXZlbnRcbiIsIF9fZnVuY19fKTsKIAkJa2ZyZWUoZXZlbnQpOwogCX0KIH0KQEAgLTM1Nyw3ICszNjQsMyBAQAogCWtmcmVlKHRyaWcpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUpOwotCi1NT0RVTEVfQVVUSE9SKCJSaWNoYXJkIFB1cmRpZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJMRUQgVHJpZ2dlcnMgQ29yZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jIGIvZHJpdmVycy9sZWRzL2xlZHMtZ3Bpby5jCmluZGV4IDliOTkxZDQuLmQ0MDBkY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLWdwaW8uYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1ncGlvLmMKQEAgLTI2LDE1ICsyNiwxOSBAQAogCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9kOwogCXU4IGNhbl9zbGVlcDsKIAl1OCBibGlua2luZzsKLQlpbnQgKCpwbGF0Zm9ybV9ncGlvX2JsaW5rX3NldCkoc3RydWN0IGdwaW9fZGVzYyAqZGVzYywgaW50IHN0YXRlLAotCQkJdW5zaWduZWQgbG9uZyAqZGVsYXlfb24sIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29mZik7CisJZ3Bpb19ibGlua19zZXRfdCBwbGF0Zm9ybV9ncGlvX2JsaW5rX3NldDsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGdwaW9fbGVkX2RhdGEgKgorCQkJY2Rldl90b19ncGlvX2xlZF9kYXRhKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBncGlvX2xlZF9kYXRhLCBjZGV2KTsKK30KKwogc3RhdGljIHZvaWQgZ3Bpb19sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAogCWVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCiB7Ci0Jc3RydWN0IGdwaW9fbGVkX2RhdGEgKmxlZF9kYXQgPQotCQljb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBncGlvX2xlZF9kYXRhLCBjZGV2KTsKKwlzdHJ1Y3QgZ3Bpb19sZWRfZGF0YSAqbGVkX2RhdCA9IGNkZXZfdG9fZ3Bpb19sZWRfZGF0YShsZWRfY2Rldik7CiAJaW50IGxldmVsOwogCiAJaWYgKHZhbHVlID09IExFRF9PRkYpCkBAIC02NCw4ICs2OCw3IEBACiBzdGF0aWMgaW50IGdwaW9fYmxpbmtfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAogCXVuc2lnbmVkIGxvbmcgKmRlbGF5X29uLCB1bnNpZ25lZCBsb25nICpkZWxheV9vZmYpCiB7Ci0Jc3RydWN0IGdwaW9fbGVkX2RhdGEgKmxlZF9kYXQgPQotCQljb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBncGlvX2xlZF9kYXRhLCBjZGV2KTsKKwlzdHJ1Y3QgZ3Bpb19sZWRfZGF0YSAqbGVkX2RhdCA9IGNkZXZfdG9fZ3Bpb19sZWRfZGF0YShsZWRfY2Rldik7CiAKIAlsZWRfZGF0LT5ibGlua2luZyA9IDE7CiAJcmV0dXJuIGxlZF9kYXQtPnBsYXRmb3JtX2dwaW9fYmxpbmtfc2V0KGxlZF9kYXQtPmdwaW9kLCBHUElPX0xFRF9CTElOSywKQEAgLTc0LDggKzc3LDcgQEAKIAogc3RhdGljIGludCBjcmVhdGVfZ3Bpb19sZWQoY29uc3Qgc3RydWN0IGdwaW9fbGVkICp0ZW1wbGF0ZSwKIAlzdHJ1Y3QgZ3Bpb19sZWRfZGF0YSAqbGVkX2RhdCwgc3RydWN0IGRldmljZSAqcGFyZW50LAotCWludCAoKmJsaW5rX3NldCkoc3RydWN0IGdwaW9fZGVzYyAqLCBpbnQsIHVuc2lnbmVkIGxvbmcgKiwKLQkJCSB1bnNpZ25lZCBsb25nICopKQorCWdwaW9fYmxpbmtfc2V0X3QgYmxpbmtfc2V0KQogewogCWludCByZXQsIHN0YXRlOwogCkBAIC0xMjAsMTAgKzEyMiwxMyBAQAogCQlsZWRfZGF0LT5wbGF0Zm9ybV9ncGlvX2JsaW5rX3NldCA9IGJsaW5rX3NldDsKIAkJbGVkX2RhdC0+Y2Rldi5ibGlua19zZXQgPSBncGlvX2JsaW5rX3NldDsKIAl9Ci0JaWYgKHRlbXBsYXRlLT5kZWZhdWx0X3N0YXRlID09IExFRFNfR1BJT19ERUZTVEFURV9LRUVQKQotCQlzdGF0ZSA9ICEhZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGxlZF9kYXQtPmdwaW9kKTsKLQllbHNlCisJaWYgKHRlbXBsYXRlLT5kZWZhdWx0X3N0YXRlID09IExFRFNfR1BJT19ERUZTVEFURV9LRUVQKSB7CisJCXN0YXRlID0gZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGxlZF9kYXQtPmdwaW9kKTsKKwkJaWYgKHN0YXRlIDwgMCkKKwkJCXJldHVybiBzdGF0ZTsKKwl9IGVsc2UgewogCQlzdGF0ZSA9ICh0ZW1wbGF0ZS0+ZGVmYXVsdF9zdGF0ZSA9PSBMRURTX0dQSU9fREVGU1RBVEVfT04pOworCX0KIAlsZWRfZGF0LT5jZGV2LmJyaWdodG5lc3MgPSBzdGF0ZSA/IExFRF9GVUxMIDogTEVEX09GRjsKIAlpZiAoIXRlbXBsYXRlLT5yZXRhaW5fc3RhdGVfc3VzcGVuZGVkKQogCQlsZWRfZGF0LT5jZGV2LmZsYWdzIHw9IExFRF9DT1JFX1NVU1BFTkRSRVNVTUU7CkBAIC0xMzQsNyArMTM5LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldHVybiBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIocGFyZW50LCAmbGVkX2RhdC0+Y2Rldik7CisJcmV0dXJuIGRldm1fbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKHBhcmVudCwgJmxlZF9kYXQtPmNkZXYpOwogfQogCiBzdHJ1Y3QgZ3Bpb19sZWRzX3ByaXYgewpAQCAtMTU0LDcgKzE1OSw2IEBACiAJc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmNoaWxkOwogCXN0cnVjdCBncGlvX2xlZHNfcHJpdiAqcHJpdjsKIAlpbnQgY291bnQsIHJldDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCiAJY291bnQgPSBkZXZpY2VfZ2V0X2NoaWxkX25vZGVfY291bnQoZGV2KTsKIAlpZiAoIWNvdW50KQpAQCAtMTY4LDI2ICsxNzIsMjIgQEAKIAkJc3RydWN0IGdwaW9fbGVkX2RhdGEgKmxlZF9kYXQgPSAmcHJpdi0+bGVkc1twcml2LT5udW1fbGVkc107CiAJCXN0cnVjdCBncGlvX2xlZCBsZWQgPSB7fTsKIAkJY29uc3QgY2hhciAqc3RhdGUgPSBOVUxMOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gdG9fb2Zfbm9kZShjaGlsZCk7CiAKIAkJbGVkLmdwaW9kID0gZGV2bV9nZXRfZ3Bpb2RfZnJvbV9jaGlsZChkZXYsIE5VTEwsIGNoaWxkKTsKIAkJaWYgKElTX0VSUihsZWQuZ3Bpb2QpKSB7CiAJCQlmd25vZGVfaGFuZGxlX3B1dChjaGlsZCk7Ci0JCQlyZXQgPSBQVFJfRVJSKGxlZC5ncGlvZCk7Ci0JCQlnb3RvIGVycjsKKwkJCXJldHVybiBFUlJfQ0FTVChsZWQuZ3Bpb2QpOwogCQl9CiAKLQkJbnAgPSB0b19vZl9ub2RlKGNoaWxkKTsKLQotCQlpZiAoZndub2RlX3Byb3BlcnR5X3ByZXNlbnQoY2hpbGQsICJsYWJlbCIpKSB7Ci0JCQlmd25vZGVfcHJvcGVydHlfcmVhZF9zdHJpbmcoY2hpbGQsICJsYWJlbCIsICZsZWQubmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoSVNfRU5BQkxFRChDT05GSUdfT0YpICYmICFsZWQubmFtZSAmJiBucCkKLQkJCQlsZWQubmFtZSA9IG5wLT5uYW1lOwotCQkJaWYgKCFsZWQubmFtZSkgewotCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJZ290byBlcnI7Ci0JCQl9CisJCXJldCA9IGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3N0cmluZyhjaGlsZCwgImxhYmVsIiwgJmxlZC5uYW1lKTsKKwkJaWYgKHJldCAmJiBJU19FTkFCTEVEKENPTkZJR19PRikgJiYgbnApCisJCQlsZWQubmFtZSA9IG5wLT5uYW1lOworCQlpZiAoIWxlZC5uYW1lKSB7CisJCQlmd25vZGVfaGFuZGxlX3B1dChjaGlsZCk7CisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkJfQorCiAJCWZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3N0cmluZyhjaGlsZCwgImxpbnV4LGRlZmF1bHQtdHJpZ2dlciIsCiAJCQkJCSAgICAmbGVkLmRlZmF1bHRfdHJpZ2dlcik7CiAKQEAgLTIwOSwxOCArMjA5LDEzIEBACiAJCXJldCA9IGNyZWF0ZV9ncGlvX2xlZCgmbGVkLCBsZWRfZGF0LCBkZXYsIE5VTEwpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZndub2RlX2hhbmRsZV9wdXQoY2hpbGQpOwotCQkJZ290byBlcnI7CisJCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCQl9CiAJCWxlZF9kYXQtPmNkZXYuZGV2LT5vZl9ub2RlID0gbnA7CiAJCXByaXYtPm51bV9sZWRzKys7CiAJfQogCiAJcmV0dXJuIHByaXY7Ci0KLWVycjoKLQlmb3IgKGNvdW50ID0gcHJpdi0+bnVtX2xlZHMgLSAxOyBjb3VudCA+PSAwOyBjb3VudC0tKQotCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmcHJpdi0+bGVkc1tjb3VudF0uY2Rldik7Ci0JcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfZ3Bpb19sZWRzX21hdGNoW10gPSB7CkBAIC0yNDgsMTMgKzI0Myw4IEBACiAJCQlyZXQgPSBjcmVhdGVfZ3Bpb19sZWQoJnBkYXRhLT5sZWRzW2ldLAogCQkJCQkgICAgICAmcHJpdi0+bGVkc1tpXSwKIAkJCQkJICAgICAgJnBkZXYtPmRldiwgcGRhdGEtPmdwaW9fYmxpbmtfc2V0KTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJLyogT24gZmFpbHVyZTogdW53aW5kIHRoZSBsZWQgY3JlYXRpb25zICovCi0JCQkJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKQotCQkJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigKLQkJCQkJCQkmcHJpdi0+bGVkc1tpXS5jZGV2KTsKKwkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7Ci0JCQl9CiAJCX0KIAl9IGVsc2UgewogCQlwcml2ID0gZ3Bpb19sZWRzX2NyZWF0ZShwZGV2KTsKQEAgLTI2NywxNyArMjU3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBncGlvX2xlZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZ3Bpb19sZWRzX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1fbGVkczsgaSsrKQotCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmcHJpdi0+bGVkc1tpXS5jZGV2KTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBncGlvX2xlZF9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBncGlvX2xlZHNfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtMjkyLDcgKzI3MSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGdwaW9fbGVkX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gZ3Bpb19sZWRfcHJvYmUsCi0JLnJlbW92ZQkJPSBncGlvX2xlZF9yZW1vdmUsCiAJLnNodXRkb3duCT0gZ3Bpb19sZWRfc2h1dGRvd24sCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gImxlZHMtZ3BpbyIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1pczMxZmwzMTl4LmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1pczMxZmwzMTl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEyMzMwOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWlzMzFmbDMxOXguYwpAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1LTE2IEdvbGRlbiBEZWxpY2lvdXMgQ29tcHV0ZXJzCisgKgorICogQXV0aG9yOiBOaWtvbGF1cyBTY2hhbGxlciA8aG5zQGdvbGRlbGljby5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHZlcnNpb24gMiBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4KKyAqIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBMRUQgZHJpdmVyIGZvciB0aGUgSVMzMUZMMzE5ezAsMSwzLDYsOX0gdG8gZHJpdmUgMSwgMywgNiBvciA5IGxpZ2h0CisgKiBlZmZlY3QgTEVEcy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworLyogcmVnaXN0ZXIgbnVtYmVycyAqLworI2RlZmluZSBJUzMxRkwzMTlYX1NIVVRET1dOCQkweDAwCisjZGVmaW5lIElTMzFGTDMxOVhfQ1RSTDEJCTB4MDEKKyNkZWZpbmUgSVMzMUZMMzE5WF9DVFJMMgkJMHgwMgorI2RlZmluZSBJUzMxRkwzMTlYX0NPTkZJRzEJCTB4MDMKKyNkZWZpbmUgSVMzMUZMMzE5WF9DT05GSUcyCQkweDA0CisjZGVmaW5lIElTMzFGTDMxOVhfUkFNUF9NT0RFCQkweDA1CisjZGVmaW5lIElTMzFGTDMxOVhfQlJFQVRIX01BU0sJCTB4MDYKKyNkZWZpbmUgSVMzMUZMMzE5WF9QV00oY2hhbm5lbCkJCSgweDA3ICsgY2hhbm5lbCkKKyNkZWZpbmUgSVMzMUZMMzE5WF9EQVRBX1VQREFURQkJMHgxMAorI2RlZmluZSBJUzMxRkwzMTlYX1QwKGNoYW5uZWwpCQkoMHgxMSArIGNoYW5uZWwpCisjZGVmaW5lIElTMzFGTDMxOVhfVDEyM18xCQkweDFhCisjZGVmaW5lIElTMzFGTDMxOVhfVDEyM18yCQkweDFiCisjZGVmaW5lIElTMzFGTDMxOVhfVDEyM18zCQkweDFjCisjZGVmaW5lIElTMzFGTDMxOVhfVDQoY2hhbm5lbCkJCSgweDFkICsgY2hhbm5lbCkKKyNkZWZpbmUgSVMzMUZMMzE5WF9USU1FX1VQREFURQkJMHgyNgorI2RlZmluZSBJUzMxRkwzMTlYX1JFU0VUCQkweGZmCisKKyNkZWZpbmUgSVMzMUZMMzE5WF9SRUdfQ05UCQkoSVMzMUZMMzE5WF9SRVNFVCArIDEpCisKKyNkZWZpbmUgSVMzMUZMMzE5WF9NQVhfTEVEUwkJOQorCisvKiBDUyAoQ3VycmVudCBTZXR0aW5nKSBpbiBDT05GSUcyIHJlZ2lzdGVyICovCisjZGVmaW5lIElTMzFGTDMxOVhfQ09ORklHMl9DU19TSElGVAk0CisjZGVmaW5lIElTMzFGTDMxOVhfQ09ORklHMl9DU19NQVNLCTB4NworI2RlZmluZSBJUzMxRkwzMTlYX0NPTkZJRzJfQ1NfU1RFUF9SRUYJMTIKKworI2RlZmluZSBJUzMxRkwzMTlYX0NVUlJFTlRfTUlOCQkoKHUzMik1MDAwKQorI2RlZmluZSBJUzMxRkwzMTlYX0NVUlJFTlRfTUFYCQkoKHUzMik0MDAwMCkKKyNkZWZpbmUgSVMzMUZMMzE5WF9DVVJSRU5UX1NURVAJCSgodTMyKTUwMDApCisjZGVmaW5lIElTMzFGTDMxOVhfQ1VSUkVOVF9ERUZBVUxUCSgodTMyKTIwMDAwKQorCisvKiBBdWRpbyBnYWluIGluIENPTkZJRzIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVMzMUZMMzE5WF9BVURJT19HQUlOX0RCX01BWAkoKHUzMikyMSkKKyNkZWZpbmUgSVMzMUZMMzE5WF9BVURJT19HQUlOX0RCX1NURVAJKCh1MzIpMykKKworLyoKKyAqIHJlZ21hcCBpcyB1c2VkIGFzIGEgY2FjaGUgb2YgY2hpcCdzIHJlZ2lzdGVyIHNwYWNlLAorICogdG8gYXZvaWQgcmVhZGluZyBiYWNrIGJyaWdodG5lc3MgdmFsdWVzIGZyb20gY2hpcCwKKyAqIHdoaWNoIGlzIGtub3duIHRvIGhhbmcuCisgKi8KK3N0cnVjdCBpczMxZmwzMTl4X2NoaXAgeworCWNvbnN0IHN0cnVjdCBpczMxZmwzMTl4X2NoaXBkZWYgKmNkZWY7CisJc3RydWN0IGkyY19jbGllbnQgICAgICAgICAgICAgICAqY2xpZW50OworCXN0cnVjdCByZWdtYXAgICAgICAgICAgICAgICAgICAgKnJlZ21hcDsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICAgICAgICAgICAgIGxvY2s7CisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19nYWluX2RiOworCisJc3RydWN0IGlzMzFmbDMxOXhfbGVkIHsKKwkJc3RydWN0IGlzMzFmbDMxOXhfY2hpcCAgKmNoaXA7CisJCXN0cnVjdCBsZWRfY2xhc3NkZXYgICAgIGNkZXY7CisJCXUzMiAgICAgICAgICAgICAgICAgICAgIG1heF9taWNyb2FtcDsKKwkJYm9vbCAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZDsKKwl9IGxlZHNbSVMzMUZMMzE5WF9NQVhfTEVEU107Cit9OworCitzdHJ1Y3QgaXMzMWZsMzE5eF9jaGlwZGVmIHsKKwlpbnQgbnVtX2xlZHM7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlzMzFmbDMxOXhfY2hpcGRlZiBpczMxZmwzMTkwX2NkZWYgPSB7CisJLm51bV9sZWRzID0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXMzMWZsMzE5eF9jaGlwZGVmIGlzMzFmbDMxOTNfY2RlZiA9IHsKKwkubnVtX2xlZHMgPSAzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpczMxZmwzMTl4X2NoaXBkZWYgaXMzMWZsMzE5Nl9jZGVmID0geworCS5udW1fbGVkcyA9IDYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlzMzFmbDMxOXhfY2hpcGRlZiBpczMxZmwzMTk5X2NkZWYgPSB7CisJLm51bV9sZWRzID0gOSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2lzMzFmbDMxOXhfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImlzc2ksaXMzMWZsMzE5MCIsIC5kYXRhID0gJmlzMzFmbDMxOTBfY2RlZiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImlzc2ksaXMzMWZsMzE5MSIsIC5kYXRhID0gJmlzMzFmbDMxOTBfY2RlZiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImlzc2ksaXMzMWZsMzE5MyIsIC5kYXRhID0gJmlzMzFmbDMxOTNfY2RlZiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImlzc2ksaXMzMWZsMzE5NiIsIC5kYXRhID0gJmlzMzFmbDMxOTZfY2RlZiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImlzc2ksaXMzMWZsMzE5OSIsIC5kYXRhID0gJmlzMzFmbDMxOTlfY2RlZiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNpLWVuLHNuMzE5OSIsICAgIC5kYXRhID0gJmlzMzFmbDMxOTlfY2RlZiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9pczMxZmwzMTl4X21hdGNoKTsKKworc3RhdGljIGludCBpczMxZmwzMTl4X2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNkZXYsCisJCQkJICAgICBlbnVtIGxlZF9icmlnaHRuZXNzIGJyaWdodG5lc3MpCit7CisJc3RydWN0IGlzMzFmbDMxOXhfbGVkICpsZWQgPSBjb250YWluZXJfb2YoY2Rldiwgc3RydWN0IGlzMzFmbDMxOXhfbGVkLAorCQkJCQkJICBjZGV2KTsKKwlzdHJ1Y3QgaXMzMWZsMzE5eF9jaGlwICppczMxID0gbGVkLT5jaGlwOworCWludCBjaGFuID0gbGVkIC0gaXMzMS0+bGVkczsKKwlpbnQgcmV0OworCWludCBpOworCXU4IGN0cmwxID0gMCwgY3RybDIgPSAwOworCisJZGV2X2RiZygmaXMzMS0+Y2xpZW50LT5kZXYsICIlcyAlZDogJWRcbiIsIF9fZnVuY19fLCBjaGFuLCBicmlnaHRuZXNzKTsKKworCW11dGV4X2xvY2soJmlzMzEtPmxvY2spOworCisJLyogdXBkYXRlIFBXTSByZWdpc3RlciAqLworCXJldCA9IHJlZ21hcF93cml0ZShpczMxLT5yZWdtYXAsIElTMzFGTDMxOVhfUFdNKGNoYW4pLCBicmlnaHRuZXNzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiByZWFkIGN1cnJlbnQgYnJpZ2h0bmVzcyBvZiBhbGwgUFdNIGNoYW5uZWxzICovCisJZm9yIChpID0gMDsgaSA8IGlzMzEtPmNkZWYtPm51bV9sZWRzOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IHB3bV92YWx1ZTsKKwkJYm9vbCBvbjsKKworCQkvKgorCQkgKiBzaW5jZSBuZWl0aGVyIGNkZXYgbm9yIHRoZSBjaGlwIGNhbiBwcm92aWRlCisJCSAqIHRoZSBjdXJyZW50IHNldHRpbmcsIHdlIHJlYWQgZnJvbSB0aGUgcmVnbWFwIGNhY2hlCisJCSAqLworCisJCXJldCA9IHJlZ21hcF9yZWFkKGlzMzEtPnJlZ21hcCwgSVMzMUZMMzE5WF9QV00oaSksICZwd21fdmFsdWUpOworCQlkZXZfZGJnKCZpczMxLT5jbGllbnQtPmRldiwgIiVzIHJlYWQgJWQ6IHJldD0lZDogJWRcbiIsCisJCQlfX2Z1bmNfXywgaSwgcmV0LCBwd21fdmFsdWUpOworCQlvbiA9IHJldCA+PSAwICYmIHB3bV92YWx1ZSA+IExFRF9PRkY7CisKKwkJaWYgKGkgPCAzKQorCQkJY3RybDEgfD0gb24gPDwgaTsgICAgICAgLyogMC4uMiA9PiBiaXQgMC4uMiAqLworCQllbHNlIGlmIChpIDwgNikKKwkJCWN0cmwxIHw9IG9uIDw8IChpICsgMSk7IC8qIDMuLjUgPT4gYml0IDQuLjYgKi8KKwkJZWxzZQorCQkJY3RybDIgfD0gb24gPDwgKGkgLSA2KTsgLyogNi4uOCA9PiBiaXQgMC4uMiAqLworCX0KKworCWlmIChjdHJsMSA+IDAgfHwgY3RybDIgPiAwKSB7CisJCWRldl9kYmcoJmlzMzEtPmNsaWVudC0+ZGV2LCAicG93ZXIgdXAgJTAyeCAlMDJ4XG4iLAorCQkJY3RybDEsIGN0cmwyKTsKKwkJcmVnbWFwX3dyaXRlKGlzMzEtPnJlZ21hcCwgSVMzMUZMMzE5WF9DVFJMMSwgY3RybDEpOworCQlyZWdtYXBfd3JpdGUoaXMzMS0+cmVnbWFwLCBJUzMxRkwzMTlYX0NUUkwyLCBjdHJsMik7CisJCS8qIHVwZGF0ZSBQV01zICovCisJCXJlZ21hcF93cml0ZShpczMxLT5yZWdtYXAsIElTMzFGTDMxOVhfREFUQV9VUERBVEUsIDB4MDApOworCQkvKiBlbmFibGUgY2hpcCBmcm9tIHNodXQgZG93biAqLworCQlyZXQgPSByZWdtYXBfd3JpdGUoaXMzMS0+cmVnbWFwLCBJUzMxRkwzMTlYX1NIVVRET1dOLCAweDAxKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZpczMxLT5jbGllbnQtPmRldiwgInBvd2VyIGRvd25cbiIpOworCQkvKiBzaHV0IGRvd24gKG5vIG5lZWQgdG8gY2xlYXIgQ1RSTDEvMikgKi8KKwkJcmV0ID0gcmVnbWFwX3dyaXRlKGlzMzEtPnJlZ21hcCwgSVMzMUZMMzE5WF9TSFVURE9XTiwgMHgwMCk7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpczMxLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXMzMWZsMzE5eF9wYXJzZV9jaGlsZF9kdChjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkLAorCQkJCSAgICAgc3RydWN0IGlzMzFmbDMxOXhfbGVkICpsZWQpCit7CisJc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiA9ICZsZWQtPmNkZXY7CisJaW50IHJldDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhjaGlsZCwgImxhYmVsIiwgJmNkZXYtPm5hbWUpKQorCQljZGV2LT5uYW1lID0gY2hpbGQtPm5hbWU7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhjaGlsZCwgImxpbnV4LGRlZmF1bHQtdHJpZ2dlciIsCisJCQkJICAgICAgJmNkZXYtPmRlZmF1bHRfdHJpZ2dlcik7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FSU5WQUwpIC8qIGlzIG9wdGlvbmFsICovCisJCXJldHVybiByZXQ7CisKKwlsZWQtPm1heF9taWNyb2FtcCA9IElTMzFGTDMxOVhfQ1VSUkVOVF9ERUZBVUxUOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNoaWxkLCAibGVkLW1heC1taWNyb2FtcCIsCisJCQkJICAgJmxlZC0+bWF4X21pY3JvYW1wKTsKKwlpZiAoIXJldCkgeworCQlpZiAobGVkLT5tYXhfbWljcm9hbXAgPCBJUzMxRkwzMTlYX0NVUlJFTlRfTUlOKQorCQkJcmV0dXJuIC1FSU5WQUw7CS8qIG5vdCBzdXBwb3J0ZWQgKi8KKwkJbGVkLT5tYXhfbWljcm9hbXAgPSBtaW4obGVkLT5tYXhfbWljcm9hbXAsCisJCQkJCSAgSVMzMUZMMzE5WF9DVVJSRU5UX01BWCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXMzMWZsMzE5eF9wYXJzZV9kdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGlzMzFmbDMxOXhfY2hpcCAqaXMzMSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlLCAqY2hpbGQ7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfZGV2X2lkOworCWludCBjb3VudDsKKwlpbnQgcmV0OworCisJaWYgKCFucCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvZl9kZXZfaWQgPSBvZl9tYXRjaF9kZXZpY2Uob2ZfaXMzMWZsMzE5eF9tYXRjaCwgZGV2KTsKKwlpZiAoIW9mX2Rldl9pZCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBtYXRjaCBkZXZpY2Ugd2l0aCBzdXBwb3J0ZWQgY2hpcHNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpczMxLT5jZGVmID0gb2ZfZGV2X2lkLT5kYXRhOworCisJY291bnQgPSBvZl9nZXRfY2hpbGRfY291bnQobnApOworCisJZGV2X2RiZyhkZXYsICJwcm9iZSAlcyB3aXRoICVkIGxlZHMgZGVmaW5lZCBpbiBEVFxuIiwKKwkJb2ZfZGV2X2lkLT5jb21wYXRpYmxlLCBjb3VudCk7CisKKwlpZiAoIWNvdW50IHx8IGNvdW50ID4gaXMzMS0+Y2RlZi0+bnVtX2xlZHMpIHsKKwkJZGV2X2VycihkZXYsICJOdW1iZXIgb2YgbGVkcyBkZWZpbmVkIG11c3QgYmUgYmV0d2VlbiAxIGFuZCAldVxuIiwKKwkJCWlzMzEtPmNkZWYtPm51bV9sZWRzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGQpIHsKKwkJc3RydWN0IGlzMzFmbDMxOXhfbGVkICpsZWQ7CisJCXUzMiByZWc7CisKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoY2hpbGQsICJyZWciLCAmcmVnKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBsZWQgJ3JlZycgcHJvcGVydHlcbiIpOworCQkJZ290byBwdXRfY2hpbGRfbm9kZTsKKwkJfQorCisJCWlmIChyZWcgPCAxIHx8IHJlZyA+IGlzMzEtPmNkZWYtPm51bV9sZWRzKSB7CisJCQlkZXZfZXJyKGRldiwgImludmFsaWQgbGVkIHJlZyAldVxuIiwgcmVnKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIHB1dF9jaGlsZF9ub2RlOworCQl9CisKKwkJbGVkID0gJmlzMzEtPmxlZHNbcmVnIC0gMV07CisKKwkJaWYgKGxlZC0+Y29uZmlndXJlZCkgeworCQkJZGV2X2VycihkZXYsICJsZWQgJXUgaXMgYWxyZWFkeSBjb25maWd1cmVkXG4iLCByZWcpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gcHV0X2NoaWxkX25vZGU7CisJCX0KKworCQlyZXQgPSBpczMxZmwzMTl4X3BhcnNlX2NoaWxkX2R0KGRldiwgY2hpbGQsIGxlZCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAibGVkICV1IERUIHBhcnNpbmcgZmFpbGVkXG4iLCByZWcpOworCQkJZ290byBwdXRfY2hpbGRfbm9kZTsKKwkJfQorCisJCWxlZC0+Y29uZmlndXJlZCA9IHRydWU7CisJfQorCisJaXMzMS0+YXVkaW9fZ2Fpbl9kYiA9IDA7CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJhdWRpby1nYWluLWRiIiwgJmlzMzEtPmF1ZGlvX2dhaW5fZGIpOworCWlmICghcmV0KQorCQlpczMxLT5hdWRpb19nYWluX2RiID0gbWluKGlzMzEtPmF1ZGlvX2dhaW5fZGIsCisJCQkJCSAgSVMzMUZMMzE5WF9BVURJT19HQUlOX0RCX01BWCk7CisKKwlyZXR1cm4gMDsKKworcHV0X2NoaWxkX25vZGU6CisJb2Zfbm9kZV9wdXQoY2hpbGQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIGlzMzFmbDMxOXhfcmVhZGFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sgLyogd2UgaGF2ZSBubyByZWFkYWJsZSByZWdpc3RlcnMgKi8KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGlzMzFmbDMxOXhfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sgLyogdm9sYXRpbGUgcmVnaXN0ZXJzIGFyZSBub3QgY2FjaGVkICovCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIElTMzFGTDMxOVhfREFUQV9VUERBVEU6CisJY2FzZSBJUzMxRkwzMTlYX1RJTUVfVVBEQVRFOgorCWNhc2UgSVMzMUZMMzE5WF9SRVNFVDoKKwkJcmV0dXJuIHRydWU7IC8qIGFsd2F5cyB3cml0ZS10aHJvdWdoICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBpczMxZmwzMTl4X3JlZ19kZWZhdWx0c1tdID0geworCXsgSVMzMUZMMzE5WF9DT05GSUcxLCAweDAwfSwKKwl7IElTMzFGTDMxOVhfQ09ORklHMiwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSgwKSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSgxKSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSgyKSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSgzKSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSg0KSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSg1KSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSg2KSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSg3KSwgMHgwMH0sCisJeyBJUzMxRkwzMTlYX1BXTSg4KSwgMHgwMH0sCit9OworCitzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLm1heF9yZWdpc3RlciA9IElTMzFGTDMxOVhfUkVHX0NOVCwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX0ZMQVQsCisJLnJlYWRhYmxlX3JlZyA9IGlzMzFmbDMxOXhfcmVhZGFibGVfcmVnLAorCS52b2xhdGlsZV9yZWcgPSBpczMxZmwzMTl4X3ZvbGF0aWxlX3JlZywKKwkucmVnX2RlZmF1bHRzID0gaXMzMWZsMzE5eF9yZWdfZGVmYXVsdHMsCisJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKGlzMzFmbDMxOXhfcmVnX2RlZmF1bHRzKSwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzMzFmbDMxOXhfbWljcm9hbXBfdG9fY3Moc3RydWN0IGRldmljZSAqZGV2LCB1MzIgbWljcm9hbXApCit7IC8qIHJvdW5kIGRvd24gdG8gbmVhcmVzdCBzdXBwb3J0ZWQgdmFsdWUgKHJhbmdlIGNoZWNrIGRvbmUgYnkgY2FsbGVyKSAqLworCXUzMiBzdGVwID0gbWljcm9hbXAgLyBJUzMxRkwzMTlYX0NVUlJFTlRfU1RFUDsKKworCXJldHVybiAoKElTMzFGTDMxOVhfQ09ORklHMl9DU19TVEVQX1JFRiAtIHN0ZXApICYKKwkJSVMzMUZMMzE5WF9DT05GSUcyX0NTX01BU0spIDw8CisJCUlTMzFGTDMxOVhfQ09ORklHMl9DU19TSElGVDsgLyogQ1MgZW5jb2RpbmcgKi8KK30KKworc3RhdGljIGlubGluZSBpbnQgaXMzMWZsMzE5eF9kYl90b19nYWluKHUzMiBkZXppYmVsKQoreyAvKiByb3VuZCBkb3duIHRvIG5lYXJlc3Qgc3VwcG9ydGVkIHZhbHVlIChyYW5nZSBjaGVjayBkb25lIGJ5IGNhbGxlcikgKi8KKwlyZXR1cm4gZGV6aWJlbCAvIElTMzFGTDMxOVhfQVVESU9fR0FJTl9EQl9TVEVQOworfQorCitzdGF0aWMgaW50IGlzMzFmbDMxOXhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGlzMzFmbDMxOXhfY2hpcCAqaXMzMTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CisJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoZGV2LT5wYXJlbnQpOworCWludCBlcnI7CisJaW50IGkgPSAwOworCXUzMiBhZ2dyZWdhdGVkX2xlZF9taWNyb2FtcCA9IElTMzFGTDMxOVhfQ1VSUkVOVF9NQVg7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCisJCXJldHVybiAtRUlPOworCisJaXMzMSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqaXMzMSksIEdGUF9LRVJORUwpOworCWlmICghaXMzMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZpczMxLT5sb2NrKTsKKworCWVyciA9IGlzMzFmbDMxOXhfcGFyc2VfZHQoJmNsaWVudC0+ZGV2LCBpczMxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfbXV0ZXg7CisKKwlpczMxLT5jbGllbnQgPSBjbGllbnQ7CisJaXMzMS0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihpczMxLT5yZWdtYXApKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHJlZ2lzdGVyIG1hcFxuIik7CisJCWVyciA9IFBUUl9FUlIoaXMzMS0+cmVnbWFwKTsKKwkJZ290byBmcmVlX211dGV4OworCX0KKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGlzMzEpOworCisJLyogY2hlY2sgZm9yIHdyaXRlLXJlcGx5IGZyb20gY2hpcCAod2UgY2FuJ3QgcmVhZCBhbnkgcmVnaXN0ZXJzKSAqLworCWVyciA9IHJlZ21hcF93cml0ZShpczMxLT5yZWdtYXAsIElTMzFGTDMxOVhfUkVTRVQsIDB4MDApOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibm8gcmVzcG9uc2UgZnJvbSBjaGlwIHdyaXRlOiBlcnIgPSAlZFxuIiwKKwkJCWVycik7CisJCWVyciA9IC1FSU87IC8qIGRvZXMgbm90IGFuc3dlciAqLworCQlnb3RvIGZyZWVfbXV0ZXg7CisJfQorCisJLyoKKwkgKiBLZXJuZWwgY29udmVudGlvbnMgcmVxdWlyZSBwZXItTEVEIGxlZC1tYXgtbWljcm9hbXAgcHJvcGVydHkuCisJICogQnV0IHRoZSBjaGlwIGRvZXMgbm90IGFsbG93IHRvIGxpbWl0IGluZGl2aWR1YWwgTEVEcy4KKwkgKiBTbyB3ZSB0YWtlIG1pbmltdW0gZnJvbSBhbGwgc3Vibm9kZXMgZm9yIHNhZmV0eSBvZiBoYXJkd2FyZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXMzMS0+Y2RlZi0+bnVtX2xlZHM7IGkrKykKKwkJaWYgKGlzMzEtPmxlZHNbaV0uY29uZmlndXJlZCAmJgorCQkgICAgaXMzMS0+bGVkc1tpXS5tYXhfbWljcm9hbXAgPCBhZ2dyZWdhdGVkX2xlZF9taWNyb2FtcCkKKwkJCWFnZ3JlZ2F0ZWRfbGVkX21pY3JvYW1wID0gaXMzMS0+bGVkc1tpXS5tYXhfbWljcm9hbXA7CisKKwlyZWdtYXBfd3JpdGUoaXMzMS0+cmVnbWFwLCBJUzMxRkwzMTlYX0NPTkZJRzIsCisJCSAgICAgaXMzMWZsMzE5eF9taWNyb2FtcF90b19jcyhkZXYsIGFnZ3JlZ2F0ZWRfbGVkX21pY3JvYW1wKSB8CisJCSAgICAgaXMzMWZsMzE5eF9kYl90b19nYWluKGlzMzEtPmF1ZGlvX2dhaW5fZGIpKTsKKworCWZvciAoaSA9IDA7IGkgPCBpczMxLT5jZGVmLT5udW1fbGVkczsgaSsrKSB7CisJCXN0cnVjdCBpczMxZmwzMTl4X2xlZCAqbGVkID0gJmlzMzEtPmxlZHNbaV07CisKKwkJaWYgKCFsZWQtPmNvbmZpZ3VyZWQpCisJCQljb250aW51ZTsKKworCQlsZWQtPmNoaXAgPSBpczMxOworCQlsZWQtPmNkZXYuYnJpZ2h0bmVzc19zZXRfYmxvY2tpbmcgPSBpczMxZmwzMTl4X2JyaWdodG5lc3Nfc2V0OworCisJCWVyciA9IGRldm1fbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmxlZC0+Y2Rldik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBmcmVlX211dGV4OworCX0KKworCXJldHVybiAwOworCitmcmVlX211dGV4OgorCW11dGV4X2Rlc3Ryb3koJmlzMzEtPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXMzMWZsMzE5eF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgaXMzMWZsMzE5eF9jaGlwICppczMxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwltdXRleF9kZXN0cm95KCZpczMxLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGkyYy1jb3JlIChhbmQgbW9kYWxpYXMpIHJlcXVpcmVzIHRoYXQgaWRfdGFibGUgYmUgcHJvcGVybHkgZmlsbGVkLAorICogZXZlbiB0aG91Z2ggaXQgaXMgbm90IHVzZWQgZm9yIERldmljZVRyZWUgYmFzZWQgaW5zdGFudGlhdGlvbi4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGlzMzFmbDMxOXhfaWRbXSA9IHsKKwl7ICJpczMxZmwzMTkwIiB9LAorCXsgImlzMzFmbDMxOTEiIH0sCisJeyAiaXMzMWZsMzE5MyIgfSwKKwl7ICJpczMxZmwzMTk2IiB9LAorCXsgImlzMzFmbDMxOTkiIH0sCisJeyAic24zMTk5IiB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBpczMxZmwzMTl4X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGlzMzFmbDMxOXhfZHJpdmVyID0geworCS5kcml2ZXIgICA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gImxlZHMtaXMzMWZsMzE5eCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvZl9pczMxZmwzMTl4X21hdGNoKSwKKwl9LAorCS5wcm9iZSAgICA9IGlzMzFmbDMxOXhfcHJvYmUsCisJLnJlbW92ZSAgID0gaXMzMWZsMzE5eF9yZW1vdmUsCisJLmlkX3RhYmxlID0gaXMzMWZsMzE5eF9pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKGlzMzFmbDMxOXhfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSC4gTmlrb2xhdXMgU2NoYWxsZXIgPGhuc0Bnb2xkZWxpY28uY29tPiIpOworTU9EVUxFX0FVVEhPUigiQW5kcmV5IFV0a2luIDxhbmRyZXlfdXRraW5AZmFzdG1haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUzMxRkwzMTlYIExFRCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLW1seGNwbGQuYyBiL2RyaXZlcnMvbGVkcy9sZWRzLW1seGNwbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTdhYjliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbWx4Y3BsZC5jCkBAIC0wLDAgKzEsNDMwIEBACisvKgorICogZHJpdmVycy9sZWRzL2xlZHMtbWx4Y3BsZC5jCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE2IFZhZGltIFBhc3Rlcm5hayA8dmFkaW1wQG1lbGxhbm94LmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiAgICAgMHgyNTAwIC8qIExQQyBidXMgYWNjZXNzICovCisKKy8qIENvbG9yIGNvZGVzIGZvciBMRURzICovCisjZGVmaW5lIE1MWENQTERfTEVEX09GRlNFVF9IQUxGCQkweDAxIC8qIE9mZnNldCBmcm9tIHNvbGlkOiAzSHogYmxpbmsgKi8KKyNkZWZpbmUgTUxYQ1BMRF9MRURfT0ZGU0VUX0ZVTEwJCTB4MDIgLyogT2Zmc2V0IGZyb20gc29saWQ6IDZIeiBibGluayAqLworI2RlZmluZSBNTFhDUExEX0xFRF9JU19PRkYJCTB4MDAgLyogT2ZmICovCisjZGVmaW5lIE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04JMHgwNSAvKiBTb2xpZCByZWQgKi8KKyNkZWZpbmUgTUxYQ1BMRF9MRURfUkVEX0JMSU5LX0hBTEYJKE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04gKyBcCisJCQkJCSBNTFhDUExEX0xFRF9PRkZTRVRfSEFMRikKKyNkZWZpbmUgTUxYQ1BMRF9MRURfUkVEX0JMSU5LX0ZVTEwJKE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04gKyBcCisJCQkJCSBNTFhDUExEX0xFRF9PRkZTRVRfRlVMTCkKKyNkZWZpbmUgTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OCTB4MEQgLyogU29saWQgZ3JlZW4gKi8KKyNkZWZpbmUgTUxYQ1BMRF9MRURfR1JFRU5fQkxJTktfSEFMRgkoTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OICsgXAorCQkJCQkgTUxYQ1BMRF9MRURfT0ZGU0VUX0hBTEYpCisjZGVmaW5lIE1MWENQTERfTEVEX0dSRUVOX0JMSU5LX0ZVTEwJKE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiArIFwKKwkJCQkJIE1MWENQTERfTEVEX09GRlNFVF9GVUxMKQorI2RlZmluZSBNTFhDUExEX0xFRF9CTElOS18zSFoJCTE2NyAvKiB+MTY3IG1zZWMgb2ZmL29uICovCisjZGVmaW5lIE1MWENQTERfTEVEX0JMSU5LXzZIWgkJODMgLyogfjgzIG1zZWMgb2ZmL29uICovCisKKy8qKgorICogbWx4Y3BsZF9wYXJhbSAtIExFRCBhY2Nlc3MgcGFyYW1ldGVyczoKKyAqIEBvZmZzZXQgLSBvZmZzZXQgZm9yIExFRCBhY2Nlc3MgaW4gQ1BMRCBkZXZpY2UKKyAqIEBtYXNrIC0gbWFzayBmb3IgTEVEIGFjY2VzcyBpbiBDUExEIGRldmljZQorICogQGJhc2VfY29sb3IgLSBiYXNlIGNvbG9yIGNvZGUgZm9yIExFRAorKiovCitzdHJ1Y3QgbWx4Y3BsZF9wYXJhbSB7CisJdTggb2Zmc2V0OworCXU4IG1hc2s7CisJdTggYmFzZV9jb2xvcjsKK307CisKKy8qKgorICogbWx4Y3BsZF9sZWRfcHJpdiAtIExFRCBwcml2YXRlIGRhdGE6CisgKiBAY2xlZCAtIExFRCBjbGFzcyBkZXZpY2UgaW5zdGFuY2UKKyAqIEBwYXJhbSAtIExFRCBDUExEIGFjY2VzcyBwYXJhbWV0ZXJzCisqKi8KK3N0cnVjdCBtbHhjcGxkX2xlZF9wcml2IHsKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGNkZXY7CisJc3RydWN0IG1seGNwbGRfcGFyYW0gcGFyYW07Cit9OworCisjZGVmaW5lIGNkZXZfdG9fcHJpdihjKQkJY29udGFpbmVyX29mKGMsIHN0cnVjdCBtbHhjcGxkX2xlZF9wcml2LCBjZGV2KQorCisvKioKKyAqIG1seGNwbGRfbGVkX3Byb2ZpbGUgLSBzeXN0ZW0gTEVEIHByb2ZpbGUgKGRlZmluZWQgcGVyIHN5c3RlbSBjbGFzcyk6CisgKiBAb2Zmc2V0IC0gb2Zmc2V0IGZvciBMRUQgYWNjZXNzIGluIENQTEQgZGV2aWNlCisgKiBAbWFzayAtIG1hc2sgZm9yIExFRCBhY2Nlc3MgaW4gQ1BMRCBkZXZpY2UKKyAqIEBiYXNlX2NvbG9yIC0gYmFzZSBjb2xvciBjb2RlCisgKiBAYnJpZ2h0bmVzcyAtIGRlZmF1bHQgYnJpZ2h0bmVzcyBzZXR0aW5nIChvbi9vZmYpCisgKiBAbmFtZSAtIExFRCBuYW1lCisqKi8KK3N0cnVjdCBtbHhjcGxkX2xlZF9wcm9maWxlIHsKKwl1OCBvZmZzZXQ7CisJdTggbWFzazsKKwl1OCBiYXNlX2NvbG9yOworCWVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzczsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworLyoqCisgKiBtbHhjcGxkX2xlZF9wZGF0YSAtIHN5c3RlbSBMRUQgcHJpdmF0ZSBkYXRhCisgKiBAcGRldiAtIHBsYXRmb3JtIGRldmljZSBwb2ludGVyCisgKiBAcGxlZCAtIExFRCBjbGFzcyBkZXZpY2UgaW5zdGFuY2UKKyAqIEBwcm9maWxlIC0gc3lzdGVtIGNvbmZpZ3VyYXRpb24gcHJvZmlsZQorICogQG51bV9sZWRfaW5zdGFuY2VzIC0gbnVtYmVyIG9mIExFRCBpbnN0YW5jZXMKKyAqIEBsb2NrIC0gZGV2aWNlIGFjY2VzcyBsb2NrCisqKi8KK3N0cnVjdCBtbHhjcGxkX2xlZF9wZGF0YSB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgbWx4Y3BsZF9sZWRfcHJpdiAqcGxlZDsKKwlzdHJ1Y3QgbWx4Y3BsZF9sZWRfcHJvZmlsZSAqcHJvZmlsZTsKKwlpbnQgbnVtX2xlZF9pbnN0YW5jZXM7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RhdGljIHN0cnVjdCBtbHhjcGxkX2xlZF9wZGF0YSAqbWx4Y3BsZF9sZWQ7CisKKy8qIERlZmF1bHQgcHJvZmlsZSBmaXQgdGhlIG5leHQgTWVsbGFub3ggc3lzdGVtczoKKyAqICJtc3g2NzEwIiwgIm1zeDY3MjAiLCAibXNiNzcwMCIsICJtc24yNzAwIiwgIm1zeDE0MTAiLAorICogIm1zbjI0MTAiLCAibXNiNzgwMCIsICJtc24yNzQwIgorICovCitzdGF0aWMgc3RydWN0IG1seGNwbGRfbGVkX3Byb2ZpbGUgbWx4Y3BsZF9sZWRfZGVmYXVsdF9wcm9maWxlW10gPSB7CisJeworCQkweDIxLCAweGYwLCBNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04sIDEsCisJCSJtbHhjcGxkOmZhbjE6Z3JlZW4iLAorCX0sCisJeworCQkweDIxLCAweGYwLCBNTFhDUExEX0xFRF9SRURfU1RBVElDX09OLCBMRURfT0ZGLAorCQkibWx4Y3BsZDpmYW4xOnJlZCIsCisJfSwKKwl7CisJCTB4MjEsIDB4MGYsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgMSwKKwkJIm1seGNwbGQ6ZmFuMjpncmVlbiIsCisJfSwKKwl7CisJCTB4MjEsIDB4MGYsIE1MWENQTERfTEVEX1JFRF9TVEFUSUNfT04sIExFRF9PRkYsCisJCSJtbHhjcGxkOmZhbjI6cmVkIiwKKwl9LAorCXsKKwkJMHgyMiwgMHhmMCwgTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OLCAxLAorCQkibWx4Y3BsZDpmYW4zOmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMiwgMHhmMCwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6ZmFuMzpyZWQiLAorCX0sCisJeworCQkweDIyLCAweDBmLCBNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04sIDEsCisJCSJtbHhjcGxkOmZhbjQ6Z3JlZW4iLAorCX0sCisJeworCQkweDIyLCAweDBmLCBNTFhDUExEX0xFRF9SRURfU1RBVElDX09OLCBMRURfT0ZGLAorCQkibWx4Y3BsZDpmYW40OnJlZCIsCisJfSwKKwl7CisJCTB4MjAsIDB4MGYsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgMSwKKwkJIm1seGNwbGQ6cHN1OmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMCwgMHgwZiwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6cHN1OnJlZCIsCisJfSwKKwl7CisJCTB4MjAsIDB4ZjAsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgMSwKKwkJIm1seGNwbGQ6c3RhdHVzOmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMCwgMHhmMCwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6c3RhdHVzOnJlZCIsCisJfSwKK307CisKKy8qIFByb2ZpbGUgZml0IHRoZSBNZWxsYW5veCBzeXN0ZW1zIGJhc2VkIG9uICJtc24yMTAwIiAqLworc3RhdGljIHN0cnVjdCBtbHhjcGxkX2xlZF9wcm9maWxlIG1seGNwbGRfbGVkX21zbjIxMDBfcHJvZmlsZVtdID0geworCXsKKwkJMHgyMSwgMHhmMCwgTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OLCAxLAorCQkibWx4Y3BsZDpmYW46Z3JlZW4iLAorCX0sCisJeworCQkweDIxLCAweGYwLCBNTFhDUExEX0xFRF9SRURfU1RBVElDX09OLCBMRURfT0ZGLAorCQkibWx4Y3BsZDpmYW46cmVkIiwKKwl9LAorCXsKKwkJMHgyMywgMHhmMCwgTUxYQ1BMRF9MRURfR1JFRU5fU1RBVElDX09OLCAxLAorCQkibWx4Y3BsZDpwc3UxOmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMywgMHhmMCwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6cHN1MTpyZWQiLAorCX0sCisJeworCQkweDIzLCAweDBmLCBNTFhDUExEX0xFRF9HUkVFTl9TVEFUSUNfT04sIDEsCisJCSJtbHhjcGxkOnBzdTI6Z3JlZW4iLAorCX0sCisJeworCQkweDIzLCAweDBmLCBNTFhDUExEX0xFRF9SRURfU1RBVElDX09OLCBMRURfT0ZGLAorCQkibWx4Y3BsZDpwc3UyOnJlZCIsCisJfSwKKwl7CisJCTB4MjAsIDB4ZjAsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgMSwKKwkJIm1seGNwbGQ6c3RhdHVzOmdyZWVuIiwKKwl9LAorCXsKKwkJMHgyMCwgMHhmMCwgTUxYQ1BMRF9MRURfUkVEX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6c3RhdHVzOnJlZCIsCisJfSwKKwl7CisJCTB4MjQsIDB4ZjAsIE1MWENQTERfTEVEX0dSRUVOX1NUQVRJQ19PTiwgTEVEX09GRiwKKwkJIm1seGNwbGQ6dWlkOmJsdWUiLAorCX0sCit9OworCitlbnVtIG1seGNwbGRfbGVkX3BsYXRmb3JtX3R5cGVzIHsKKwlNTFhDUExEX0xFRF9QTEFURk9STV9ERUZBVUxULAorCU1MWENQTERfTEVEX1BMQVRGT1JNX01TTjIxMDAsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbWx4X3Byb2R1Y3RfbmFtZXNbXSA9IHsKKwkiREVGQVVMVCIsCisJIk1TTjIxMDAiLAorfTsKKworc3RhdGljIGVudW0KK21seGNwbGRfbGVkX3BsYXRmb3JtX3R5cGVzIG1seGNwbGRfbGVkX3BsYXRmb3JtX2NoZWNrX3N5c190eXBlKHZvaWQpCit7CisJY29uc3QgY2hhciAqbWx4X3Byb2R1Y3RfbmFtZTsKKwlpbnQgaTsKKworCW1seF9wcm9kdWN0X25hbWUgPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9QUk9EVUNUX05BTUUpOworCWlmICghbWx4X3Byb2R1Y3RfbmFtZSkKKwkJcmV0dXJuIE1MWENQTERfTEVEX1BMQVRGT1JNX0RFRkFVTFQ7CisKKwlmb3IgKGkgPSAxOyAgaSA8IEFSUkFZX1NJWkUobWx4X3Byb2R1Y3RfbmFtZXMpOyBpKyspIHsKKwkJaWYgKHN0cnN0cihtbHhfcHJvZHVjdF9uYW1lLCBtbHhfcHJvZHVjdF9uYW1lc1tpXSkpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gTUxYQ1BMRF9MRURfUExBVEZPUk1fREVGQVVMVDsKK30KKworc3RhdGljIHZvaWQgbWx4Y3BsZF9sZWRfYnVzX2FjY2Vzc19mdW5jKHUxNiBiYXNlLCB1OCBvZmZzZXQsIHU4IHJ3X2ZsYWcsCisJCQkJCXU4ICpkYXRhKQoreworCXUzMiBhZGRyID0gYmFzZSArIG9mZnNldDsKKworCWlmIChyd19mbGFnID09IDApCisJCW91dGIoKmRhdGEsIGFkZHIpOworCWVsc2UKKwkJKmRhdGEgPSBpbmIoYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIG1seGNwbGRfbGVkX3N0b3JlX2h3KHU4IG1hc2ssIHU4IG9mZiwgdTggdnNldCkKK3sKKwl1OCBuaWIsIHZhbDsKKworCS8qCisJICogRWFjaCBMRUQgaXMgY29udHJvbGxlZCB0aHJvdWdoIGxvdyBvciBoaWdoIG5pYmJsZSBvZiB0aGUgcmVsZXZhbnQKKwkgKiBDUExEIHJlZ2lzdGVyLiBSZWdpc3RlciBvZmZzZXQgaXMgc3BlY2lmaWVkIGJ5IG9mZiBwYXJhbWV0ZXIuCisJICogUGFyYW1ldGVyIHZzZXQgcHJvdmlkZXMgY29sb3IgY29kZTogMHgwIGZvciBvZmYsIDB4NSBmb3Igc29saWQgcmVkLAorCSAqIDB4NiBmb3IgM0h6IGJsaW5rIHJlZCwgMHhkIGZvciBzb2xpZCBncmVlbiwgMHhlIGZvciAzSHogYmxpbmsKKwkgKiBncmVlbi4KKwkgKiBQYXJhbWV0ZXIgbWFzayBzcGVjaWZpZXMgd2hpY2ggbmliYmxlIGlzIHVzZWQgZm9yIHNwZWNpZmljIExFRDogbWFzaworCSAqIDB4ZjAgLSBsb3dlciBuaWJibGUgaXMgdG8gYmUgdXNlZCAoYml0cyBmcm9tIDAgdG8gMyksIG1hc2sgMHgwZiAtCisJICogaGlnaGVyIG5pYmJsZSAoYml0cyBmcm9tIDQgdG8gNykuCisJICovCisJc3Bpbl9sb2NrKCZtbHhjcGxkX2xlZC0+bG9jayk7CisJbWx4Y3BsZF9sZWRfYnVzX2FjY2Vzc19mdW5jKE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiwgb2ZmLCAxLAorCQkJCSAgICAmdmFsKTsKKwluaWIgPSAobWFzayA9PSAweGYwKSA/IHZzZXQgOiAodnNldCA8PCA0KTsKKwl2YWwgPSAodmFsICYgbWFzaykgfCBuaWI7CisJbWx4Y3BsZF9sZWRfYnVzX2FjY2Vzc19mdW5jKE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiwgb2ZmLCAwLAorCQkJCSAgICAmdmFsKTsKKwlzcGluX3VubG9jaygmbWx4Y3BsZF9sZWQtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBtbHhjcGxkX2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWQsCisJCQkJICAgICAgIGVudW0gbGVkX2JyaWdodG5lc3MgdmFsdWUpCit7CisJc3RydWN0IG1seGNwbGRfbGVkX3ByaXYgKnBsZWQgPSBjZGV2X3RvX3ByaXYobGVkKTsKKworCWlmICh2YWx1ZSkgeworCQltbHhjcGxkX2xlZF9zdG9yZV9odyhwbGVkLT5wYXJhbS5tYXNrLCBwbGVkLT5wYXJhbS5vZmZzZXQsCisJCQkJICAgICBwbGVkLT5wYXJhbS5iYXNlX2NvbG9yKTsKKwkJcmV0dXJuOworCX0KKworCW1seGNwbGRfbGVkX3N0b3JlX2h3KHBsZWQtPnBhcmFtLm1hc2ssIHBsZWQtPnBhcmFtLm9mZnNldCwKKwkJCSAgICAgTUxYQ1BMRF9MRURfSVNfT0ZGKTsKK30KKworc3RhdGljIGludCBtbHhjcGxkX2xlZF9ibGlua19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkLAorCQkJCSB1bnNpZ25lZCBsb25nICpkZWxheV9vbiwKKwkJCQkgdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKQoreworCXN0cnVjdCBtbHhjcGxkX2xlZF9wcml2ICpwbGVkID0gY2Rldl90b19wcml2KGxlZCk7CisKKwkvKgorCSAqIEhXIHN1cHBvcnRzIHR3byB0eXBlcyBvZiBibGlua2luZzogZnVsbCAoNkh6KSBhbmQgaGFsZiAoM0h6KS4KKwkgKiBGb3IgZGVsYXkgb24vb2ZmIHplcm8gZGVmYXVsdCBzZXR0aW5nIDNIeiBpcyB1c2VkLgorCSAqLworCWlmICghKCpkZWxheV9vbiA9PSAwICYmICpkZWxheV9vZmYgPT0gMCkgJiYKKwkgICAgISgqZGVsYXlfb24gPT0gTUxYQ1BMRF9MRURfQkxJTktfM0haICYmCisJICAgICAgKmRlbGF5X29mZiA9PSBNTFhDUExEX0xFRF9CTElOS18zSFopICYmCisJICAgICEoKmRlbGF5X29uID09IE1MWENQTERfTEVEX0JMSU5LXzZIWiAmJgorCSAgICAgICpkZWxheV9vZmYgPT0gTUxYQ1BMRF9MRURfQkxJTktfNkhaKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKmRlbGF5X29uID09IE1MWENQTERfTEVEX0JMSU5LXzZIWikKKwkJbWx4Y3BsZF9sZWRfc3RvcmVfaHcocGxlZC0+cGFyYW0ubWFzaywgcGxlZC0+cGFyYW0ub2Zmc2V0LAorCQkJCSAgICAgcGxlZC0+cGFyYW0uYmFzZV9jb2xvciArCisJCQkJICAgICBNTFhDUExEX0xFRF9PRkZTRVRfRlVMTCk7CisJZWxzZQorCQltbHhjcGxkX2xlZF9zdG9yZV9odyhwbGVkLT5wYXJhbS5tYXNrLCBwbGVkLT5wYXJhbS5vZmZzZXQsCisJCQkJICAgICBwbGVkLT5wYXJhbS5iYXNlX2NvbG9yICsKKwkJCQkgICAgIE1MWENQTERfTEVEX09GRlNFVF9IQUxGKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1seGNwbGRfbGVkX2NvbmZpZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgbWx4Y3BsZF9sZWRfcGRhdGEgKmNwbGQpCit7CisJaW50IGk7CisJaW50IGVycjsKKworCWNwbGQtPnBsZWQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2Yoc3RydWN0IG1seGNwbGRfbGVkX3ByaXYpICoKKwkJCQkgIGNwbGQtPm51bV9sZWRfaW5zdGFuY2VzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNwbGQtPnBsZWQpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IGNwbGQtPm51bV9sZWRfaW5zdGFuY2VzOyBpKyspIHsKKwkJY3BsZC0+cGxlZFtpXS5jZGV2Lm5hbWUgPSBjcGxkLT5wcm9maWxlW2ldLm5hbWU7CisJCWNwbGQtPnBsZWRbaV0uY2Rldi5icmlnaHRuZXNzID0gY3BsZC0+cHJvZmlsZVtpXS5icmlnaHRuZXNzOworCQljcGxkLT5wbGVkW2ldLmNkZXYubWF4X2JyaWdodG5lc3MgPSAxOworCQljcGxkLT5wbGVkW2ldLmNkZXYuYnJpZ2h0bmVzc19zZXQgPSBtbHhjcGxkX2xlZF9icmlnaHRuZXNzX3NldDsKKwkJY3BsZC0+cGxlZFtpXS5jZGV2LmJsaW5rX3NldCA9IG1seGNwbGRfbGVkX2JsaW5rX3NldDsKKwkJY3BsZC0+cGxlZFtpXS5jZGV2LmZsYWdzID0gTEVEX0NPUkVfU1VTUEVORFJFU1VNRTsKKwkJZXJyID0gZGV2bV9sZWRfY2xhc3NkZXZfcmVnaXN0ZXIoZGV2LCAmY3BsZC0+cGxlZFtpXS5jZGV2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJY3BsZC0+cGxlZFtpXS5wYXJhbS5vZmZzZXQgPSBtbHhjcGxkX2xlZC0+cHJvZmlsZVtpXS5vZmZzZXQ7CisJCWNwbGQtPnBsZWRbaV0ucGFyYW0ubWFzayA9IG1seGNwbGRfbGVkLT5wcm9maWxlW2ldLm1hc2s7CisJCWNwbGQtPnBsZWRbaV0ucGFyYW0uYmFzZV9jb2xvciA9CisJCQkJCW1seGNwbGRfbGVkLT5wcm9maWxlW2ldLmJhc2VfY29sb3I7CisKKwkJaWYgKG1seGNwbGRfbGVkLT5wcm9maWxlW2ldLmJyaWdodG5lc3MpCisJCQltbHhjcGxkX2xlZF9icmlnaHRuZXNzX3NldCgmY3BsZC0+cGxlZFtpXS5jZGV2LAorCQkJCQltbHhjcGxkX2xlZC0+cHJvZmlsZVtpXS5icmlnaHRuZXNzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbWx4Y3BsZF9sZWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwllbnVtIG1seGNwbGRfbGVkX3BsYXRmb3JtX3R5cGVzIG1seGNwbGRfbGVkX3BsYXQgPQorCQkJCQltbHhjcGxkX2xlZF9wbGF0Zm9ybV9jaGVja19zeXNfdHlwZSgpOworCisJbWx4Y3BsZF9sZWQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptbHhjcGxkX2xlZCksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFtbHhjcGxkX2xlZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltbHhjcGxkX2xlZC0+cGRldiA9IHBkZXY7CisKKwlzd2l0Y2ggKG1seGNwbGRfbGVkX3BsYXQpIHsKKwljYXNlIE1MWENQTERfTEVEX1BMQVRGT1JNX01TTjIxMDA6CisJCW1seGNwbGRfbGVkLT5wcm9maWxlID0gbWx4Y3BsZF9sZWRfbXNuMjEwMF9wcm9maWxlOworCQltbHhjcGxkX2xlZC0+bnVtX2xlZF9pbnN0YW5jZXMgPQorCQkJCUFSUkFZX1NJWkUobWx4Y3BsZF9sZWRfbXNuMjEwMF9wcm9maWxlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQltbHhjcGxkX2xlZC0+cHJvZmlsZSA9IG1seGNwbGRfbGVkX2RlZmF1bHRfcHJvZmlsZTsKKwkJbWx4Y3BsZF9sZWQtPm51bV9sZWRfaW5zdGFuY2VzID0KKwkJCQlBUlJBWV9TSVpFKG1seGNwbGRfbGVkX2RlZmF1bHRfcHJvZmlsZSk7CisJCWJyZWFrOworCX0KKworCXNwaW5fbG9ja19pbml0KCZtbHhjcGxkX2xlZC0+bG9jayk7CisKKwlyZXR1cm4gbWx4Y3BsZF9sZWRfY29uZmlnKCZwZGV2LT5kZXYsIG1seGNwbGRfbGVkKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWx4Y3BsZF9sZWRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gS0JVSUxEX01PRE5BTUUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1seGNwbGRfbGVkX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCWludCBlcnI7CisKKwlwZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZShLQlVJTERfTU9ETkFNRSwgLTEsIE5VTEwsIDApOworCWlmIChJU19FUlIocGRldikpIHsKKwkJcHJfZXJyKCJEZXZpY2UgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwZGV2KTsKKwl9CisKKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJm1seGNwbGRfbGVkX2RyaXZlciwgbWx4Y3BsZF9sZWRfcHJvYmUpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJQcm9iZSBwbGF0Zm9ybSBkcml2ZXIgZmFpbGVkXG4iKTsKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1seGNwbGRfbGVkX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtbHhjcGxkX2xlZC0+cGRldik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1seGNwbGRfbGVkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG1seGNwbGRfbGVkX2luaXQpOworbW9kdWxlX2V4aXQobWx4Y3BsZF9sZWRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlZhZGltIFBhc3Rlcm5hayA8dmFkaW1wQG1lbGxhbm94LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWVsbGFub3ggYm9hcmQgTEVEIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpsZWRzX21seGNwbGQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXBtODA1OC5jIGIvZHJpdmVycy9sZWRzL2xlZHMtcG04MDU4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyNjc0MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLXBtODA1OC5jCkBAIC0wLDAgKzEsMTkxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEsIDIwMTYgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNkZWZpbmUgUE04MDU4X0xFRF9UWVBFX0NPTU1PTgkweDAwCisjZGVmaW5lIFBNODA1OF9MRURfVFlQRV9LRVlQQUQJMHgwMQorI2RlZmluZSBQTTgwNThfTEVEX1RZUEVfRkxBU0gJMHgwMgorCisjZGVmaW5lIFBNODA1OF9MRURfVFlQRV9DT01NT05fTUFTSwkweGY4CisjZGVmaW5lIFBNODA1OF9MRURfVFlQRV9LRVlQQURfTUFTSwkweGYwCisjZGVmaW5lIFBNODA1OF9MRURfVFlQRV9DT01NT05fU0hJRlQJMworI2RlZmluZSBQTTgwNThfTEVEX1RZUEVfS0VZUEFEX1NISUZUCTQKKworc3RydWN0IHBtODA1OF9sZWQgeworCXN0cnVjdCByZWdtYXAgKm1hcDsKKwl1MzIgcmVnOworCXUzMiBsZWR0eXBlOworCXN0cnVjdCBsZWRfY2xhc3NkZXYgY2RldjsKK307CisKK3N0YXRpYyB2b2lkIHBtODA1OF9sZWRfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmNsZWQsCisJZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcG04MDU4X2xlZCAqbGVkOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKworCWxlZCA9IGNvbnRhaW5lcl9vZihjbGVkLCBzdHJ1Y3QgcG04MDU4X2xlZCwgY2Rldik7CisJc3dpdGNoIChsZWQtPmxlZHR5cGUpIHsKKwljYXNlIFBNODA1OF9MRURfVFlQRV9DT01NT046CisJCW1hc2sgPSBQTTgwNThfTEVEX1RZUEVfQ09NTU9OX01BU0s7CisJCXZhbCA9IHZhbHVlIDw8IFBNODA1OF9MRURfVFlQRV9DT01NT05fU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgUE04MDU4X0xFRF9UWVBFX0tFWVBBRDoKKwljYXNlIFBNODA1OF9MRURfVFlQRV9GTEFTSDoKKwkJbWFzayA9IFBNODA1OF9MRURfVFlQRV9LRVlQQURfTUFTSzsKKwkJdmFsID0gdmFsdWUgPDwgUE04MDU4X0xFRF9UWVBFX0tFWVBBRF9TSElGVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGxlZC0+bWFwLCBsZWQtPnJlZywgbWFzaywgdmFsKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQgTEVEIGJyaWdodG5lc3NcbiIpOworfQorCitzdGF0aWMgZW51bSBsZWRfYnJpZ2h0bmVzcyBwbTgwNThfbGVkX2dldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjbGVkKQoreworCXN0cnVjdCBwbTgwNThfbGVkICpsZWQ7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJbGVkID0gY29udGFpbmVyX29mKGNsZWQsIHN0cnVjdCBwbTgwNThfbGVkLCBjZGV2KTsKKworCXJldCA9IHJlZ21hcF9yZWFkKGxlZC0+bWFwLCBsZWQtPnJlZywgJnZhbCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBnZXQgTEVEIGJyaWdodG5lc3NcbiIpOworCQlyZXR1cm4gTEVEX09GRjsKKwl9CisKKwlzd2l0Y2ggKGxlZC0+bGVkdHlwZSkgeworCWNhc2UgUE04MDU4X0xFRF9UWVBFX0NPTU1PTjoKKwkJdmFsICY9IFBNODA1OF9MRURfVFlQRV9DT01NT05fTUFTSzsKKwkJdmFsID4+PSBQTTgwNThfTEVEX1RZUEVfQ09NTU9OX1NISUZUOworCQlicmVhazsKKwljYXNlIFBNODA1OF9MRURfVFlQRV9LRVlQQUQ6CisJY2FzZSBQTTgwNThfTEVEX1RZUEVfRkxBU0g6CisJCXZhbCAmPSBQTTgwNThfTEVEX1RZUEVfS0VZUEFEX01BU0s7CisJCXZhbCA+Pj0gUE04MDU4X0xFRF9UWVBFX0tFWVBBRF9TSElGVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsID0gTEVEX09GRjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBwbTgwNThfbGVkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHBtODA1OF9sZWQgKmxlZDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJaW50IHJldDsKKwlzdHJ1Y3QgcmVnbWFwICptYXA7CisJY29uc3QgY2hhciAqc3RhdGU7CisJZW51bSBsZWRfYnJpZ2h0bmVzcyBtYXhicmlnaHQ7CisKKwlsZWQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpsZWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxlZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsZWQtPmxlZHR5cGUgPSAodTMyKW9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKKworCW1hcCA9IGRldl9nZXRfcmVnbWFwKHBkZXYtPmRldi5wYXJlbnQsIE5VTEwpOworCWlmICghbWFwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlBhcmVudCByZWdtYXAgdW5hdmFpbGFibGUuXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJbGVkLT5tYXAgPSBtYXA7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJlZyIsICZsZWQtPnJlZyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyByZWdpc3RlciBvZmZzZXQgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVXNlIGxhYmVsIGVsc2Ugbm9kZSBuYW1lICovCisJbGVkLT5jZGV2Lm5hbWUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJsYWJlbCIsIE5VTEwpID8gOiBucC0+bmFtZTsKKwlsZWQtPmNkZXYuZGVmYXVsdF90cmlnZ2VyID0KKwkJb2ZfZ2V0X3Byb3BlcnR5KG5wLCAibGludXgsZGVmYXVsdC10cmlnZ2VyIiwgTlVMTCk7CisJbGVkLT5jZGV2LmJyaWdodG5lc3Nfc2V0ID0gcG04MDU4X2xlZF9zZXQ7CisJbGVkLT5jZGV2LmJyaWdodG5lc3NfZ2V0ID0gcG04MDU4X2xlZF9nZXQ7CisJaWYgKGxlZC0+bGVkdHlwZSA9PSBQTTgwNThfTEVEX1RZUEVfQ09NTU9OKQorCQltYXhicmlnaHQgPSAzMTsgLyogNSBiaXRzICovCisJZWxzZQorCQltYXhicmlnaHQgPSAxNTsgLyogNCBiaXRzICovCisJbGVkLT5jZGV2Lm1heF9icmlnaHRuZXNzID0gbWF4YnJpZ2h0OworCisJc3RhdGUgPSBvZl9nZXRfcHJvcGVydHkobnAsICJkZWZhdWx0LXN0YXRlIiwgTlVMTCk7CisJaWYgKHN0YXRlKSB7CisJCWlmICghc3RyY21wKHN0YXRlLCAia2VlcCIpKSB7CisJCQlsZWQtPmNkZXYuYnJpZ2h0bmVzcyA9IHBtODA1OF9sZWRfZ2V0KCZsZWQtPmNkZXYpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoc3RhdGUsICJvbiIpKSB7CisJCQlsZWQtPmNkZXYuYnJpZ2h0bmVzcyA9IG1heGJyaWdodDsKKwkJCXBtODA1OF9sZWRfc2V0KCZsZWQtPmNkZXYsIG1heGJyaWdodCk7CisJCX0gZWxzZSB7CisJCQlsZWQtPmNkZXYuYnJpZ2h0bmVzcyA9IExFRF9PRkY7CisJCQlwbTgwNThfbGVkX3NldCgmbGVkLT5jZGV2LCBMRURfT0ZGKTsKKwkJfQorCX0KKworCWlmIChsZWQtPmxlZHR5cGUgPT0gUE04MDU4X0xFRF9UWVBFX0tFWVBBRCB8fAorCSAgICBsZWQtPmxlZHR5cGUgPT0gUE04MDU4X0xFRF9UWVBFX0ZMQVNIKQorCQlsZWQtPmNkZXYuZmxhZ3MJPSBMRURfQ09SRV9TVVNQRU5EUkVTVU1FOworCisJcmV0ID0gZGV2bV9sZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmxlZC0+Y2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgbGVkIFwiJXNcIlxuIiwKKwkJCWxlZC0+Y2Rldi5uYW1lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcG04MDU4X2xlZHNfaWRfdGFibGVbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInFjb20scG04MDU4LWxlZCIsCisJCS5kYXRhID0gKHZvaWQgKilQTTgwNThfTEVEX1RZUEVfQ09NTU9OCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInFjb20scG04MDU4LWtleXBhZC1sZWQiLAorCQkuZGF0YSA9ICh2b2lkICopUE04MDU4X0xFRF9UWVBFX0tFWVBBRAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJxY29tLHBtODA1OC1mbGFzaC1sZWQiLAorCQkuZGF0YSA9ICh2b2lkICopUE04MDU4X0xFRF9UWVBFX0ZMQVNICisJfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcG04MDU4X2xlZHNfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbTgwNThfbGVkX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcG04MDU4X2xlZF9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicG04MDU4LWxlZHMiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBwbTgwNThfbGVkc19pZF90YWJsZSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocG04MDU4X2xlZF9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBNODA1OCBMRURzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpwbTgwNTgtbGVkcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9saWdodG52bS9LY29uZmlnIGIvZHJpdmVycy9saWdodG52bS9LY29uZmlnCmluZGV4IDYxYzY4YTEuLjJmNWQ1ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGlnaHRudm0vS2NvbmZpZworKysgYi9kcml2ZXJzL2xpZ2h0bnZtL0tjb25maWcKQEAgLTQsNyArNCw3IEBACiAKIG1lbnVjb25maWcgTlZNCiAJYm9vbCAiT3Blbi1DaGFubmVsIFNTRCB0YXJnZXQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEJMT0NLCisJZGVwZW5kcyBvbiBCTE9DSyAmJiBIQVNfRE1BCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBnZXQgdG8gZW5hYmxlIE9wZW4tY2hhbm5lbCBTU0RzLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xpZ2h0bnZtL01ha2VmaWxlIGIvZHJpdmVycy9saWdodG52bS9NYWtlZmlsZQppbmRleCBhN2EwYTIyLi4xZjZiNjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xpZ2h0bnZtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbGlnaHRudm0vTWFrZWZpbGUKQEAgLTIsNiArMiw2IEBACiAjIE1ha2VmaWxlIGZvciBPcGVuLUNoYW5uZWwgU1NEcy4KICMKIAotb2JqLSQoQ09ORklHX05WTSkJCTo9IGNvcmUubyBzeXNibGsubworb2JqLSQoQ09ORklHX05WTSkJCTo9IGNvcmUubyBzeXNibGsubyBzeXNmcy5vCiBvYmotJChDT05GSUdfTlZNX0dFTk5WTSkgCSs9IGdlbm52bS5vCiBvYmotJChDT05GSUdfTlZNX1JSUEMpCQkrPSBycnBjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGlnaHRudm0vY29yZS5jIGIvZHJpdmVycy9saWdodG52bS9jb3JlLmMKaW5kZXggOWViZDJjZi4uMWNhYzBmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9saWdodG52bS9jb3JlLmMKKysrIGIvZHJpdmVycy9saWdodG52bS9jb3JlLmMKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlIDxsaW51eC9saWdodG52bS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3N5c2N0bC5oPgogCisjaW5jbHVkZSAibGlnaHRudm0uaCIKKwogc3RhdGljIExJU1RfSEVBRChudm1fdGd0X3R5cGVzKTsKIHN0YXRpYyBERUNMQVJFX1JXU0VNKG52bV90Z3R0X2xvY2spOwogc3RhdGljIExJU1RfSEVBRChudm1fbWdycyk7CkBAIC01ODEsNiArNTgzLDggQEAKIAltdXRleF9pbml0KCZkZXYtPm1sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrKTsKIAorCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoZGV2LT5xLCBkZXYtPnNlY19zaXplKTsKKwogCXJldHVybiAwOwogZXJyX2ZtdHlwZToKIAlrZnJlZShkZXYtPmx1bl9tYXApOwpAQCAtNTk2LDE1ICs2MDAsMTkgQEAKIAlkZXYtPm10ID0gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgbnZtX2ZyZWUoc3RydWN0IG52bV9kZXYgKmRldikKK3ZvaWQgbnZtX2ZyZWUoc3RydWN0IG52bV9kZXYgKmRldikKIHsKIAlpZiAoIWRldikKIAkJcmV0dXJuOwogCiAJbnZtX2ZyZWVfbWdyKGRldik7CiAKKwlpZiAoZGV2LT5kbWFfcG9vbCkKKwkJZGV2LT5vcHMtPmRlc3Ryb3lfZG1hX3Bvb2woZGV2LT5kbWFfcG9vbCk7CisKIAlrZnJlZShkZXYtPmxwdGJsKTsKIAlrZnJlZShkZXYtPmx1bl9tYXApOworCWtmcmVlKGRldik7CiB9CiAKIHN0YXRpYyBpbnQgbnZtX2luaXQoc3RydWN0IG52bV9kZXYgKmRldikKQEAgLTY1MSwzMCArNjU5LDE5IEBACiAKIHN0YXRpYyB2b2lkIG52bV9leGl0KHN0cnVjdCBudm1fZGV2ICpkZXYpCiB7Ci0JaWYgKGRldi0+ZG1hX3Bvb2wpCi0JCWRldi0+b3BzLT5kZXN0cm95X2RtYV9wb29sKGRldi0+ZG1hX3Bvb2wpOwotCW52bV9mcmVlKGRldik7Ci0KLQlwcl9pbmZvKCJudm06IHN1Y2Nlc3NmdWxseSB1bmxvYWRlZFxuIik7CisJbnZtX3N5c2ZzX3VucmVnaXN0ZXJfZGV2KGRldik7CiB9CiAKLWludCBudm1fcmVnaXN0ZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKmRpc2tfbmFtZSwKLQkJCQkJCQlzdHJ1Y3QgbnZtX2Rldl9vcHMgKm9wcykKK3N0cnVjdCBudm1fZGV2ICpudm1fYWxsb2NfZGV2KGludCBub2RlKQogewotCXN0cnVjdCBudm1fZGV2ICpkZXY7CisJcmV0dXJuIGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IG52bV9kZXYpLCBHRlBfS0VSTkVMLCBub2RlKTsKK30KK0VYUE9SVF9TWU1CT0wobnZtX2FsbG9jX2Rldik7CisKK2ludCBudm1fcmVnaXN0ZXIoc3RydWN0IG52bV9kZXYgKmRldikKK3sKIAlpbnQgcmV0OwogCi0JaWYgKCFvcHMtPmlkZW50aXR5KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBudm1fZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZGV2LT5xID0gcTsKLQlkZXYtPm9wcyA9IG9wczsKLQlzdHJuY3B5KGRldi0+bmFtZSwgZGlza19uYW1lLCBESVNLX05BTUVfTEVOKTsKLQogCXJldCA9IG52bV9pbml0KGRldik7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfaW5pdDsKQEAgLTY5NCw2ICs2OTEsMTAgQEAKIAkJfQogCX0KIAorCXJldCA9IG52bV9zeXNmc19yZWdpc3Rlcl9kZXYoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9wcGFsaXN0OworCiAJaWYgKGRldi0+aWRlbnRpdHkuY2FwICYgTlZNX0lEX0RDQVBfQkJMS01HTVQpIHsKIAkJcmV0ID0gbnZtX2dldF9zeXNibG9jayhkZXYsICZkZXYtPnNiKTsKIAkJaWYgKCFyZXQpCkBAIC03MTAsMzEgKzcxMSwyMSBAQAogCXVwX3dyaXRlKCZudm1fbG9jayk7CiAKIAlyZXR1cm4gMDsKK2Vycl9wcGFsaXN0OgorCWRldi0+b3BzLT5kZXN0cm95X2RtYV9wb29sKGRldi0+ZG1hX3Bvb2wpOwogZXJyX2luaXQ6CiAJa2ZyZWUoZGV2LT5sdW5fbWFwKTsKLQlrZnJlZShkZXYpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKG52bV9yZWdpc3Rlcik7CiAKLXZvaWQgbnZtX3VucmVnaXN0ZXIoY2hhciAqZGlza19uYW1lKQordm9pZCBudm1fdW5yZWdpc3RlcihzdHJ1Y3QgbnZtX2RldiAqZGV2KQogewotCXN0cnVjdCBudm1fZGV2ICpkZXY7Ci0KIAlkb3duX3dyaXRlKCZudm1fbG9jayk7Ci0JZGV2ID0gbnZtX2ZpbmRfbnZtX2RldihkaXNrX25hbWUpOwotCWlmICghZGV2KSB7Ci0JCXByX2VycigibnZtOiBjb3VsZCBub3QgZmluZCBkZXZpY2UgJXMgdG8gdW5yZWdpc3RlclxuIiwKLQkJCQkJCQkJZGlza19uYW1lKTsKLQkJdXBfd3JpdGUoJm52bV9sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQogCWxpc3RfZGVsKCZkZXYtPmRldmljZXMpOwogCXVwX3dyaXRlKCZudm1fbG9jayk7CiAKIAludm1fZXhpdChkZXYpOwotCWtmcmVlKGRldik7CiB9CiBFWFBPUlRfU1lNQk9MKG52bV91bnJlZ2lzdGVyKTsKIApAQCAtMTE3MSwyNyArMTE2MiwxMCBAQAogCS5ub2RlbmFtZQk9ICJsaWdodG52bS9jb250cm9sIiwKIAkuZm9wcwkJPSAmX2N0bF9mb3BzLAogfTsKK21vZHVsZV9taXNjX2RldmljZShfbnZtX21pc2MpOwogCiBNT0RVTEVfQUxJQVNfTUlTQ0RFVihNSVNDX0RZTkFNSUNfTUlOT1IpOwogCi1zdGF0aWMgaW50IF9faW5pdCBudm1fbW9kX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbWlzY19yZWdpc3RlcigmX252bV9taXNjKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoIm52bTogbWlzY19yZWdpc3RlciBmYWlsZWQgZm9yIGNvbnRyb2wgZGV2aWNlIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbnZtX21vZF9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZfbnZtX21pc2MpOwotfQotCiBNT0RVTEVfQVVUSE9SKCJNYXRpYXMgQmpvcmxpbmcgPG1AYmpvcmxpbmcubWU+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CiBNT0RVTEVfVkVSU0lPTigiMC4xIik7Ci1tb2R1bGVfaW5pdChudm1fbW9kX2luaXQpOwotbW9kdWxlX2V4aXQobnZtX21vZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGlnaHRudm0vbGlnaHRudm0uaCBiL2RyaXZlcnMvbGlnaHRudm0vbGlnaHRudm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDVjMTgxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9saWdodG52bS9saWdodG52bS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQ05FWCBMYWJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogSW5pdGlhbCByZWxlYXNlOiBNYXRpYXMgQmpvcmxpbmcgPG1hdGlhc0BjbmV4bGFicy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiBVU0EuCisgKgorICovCisKKyNpZm5kZWYgTElHSFROVk1fSAorI2RlZmluZSBMSUdIVE5WTV9ICisKKyNpbmNsdWRlIDxsaW51eC9saWdodG52bS5oPgorCisvKiBjb3JlIC0+IHN5c2ZzLmMgKi8KK2ludCBfX211c3RfY2hlY2sgbnZtX3N5c2ZzX3JlZ2lzdGVyX2RldihzdHJ1Y3QgbnZtX2RldiAqKTsKK3ZvaWQgbnZtX3N5c2ZzX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBudm1fZGV2ICopOworaW50IG52bV9zeXNmc19yZWdpc3Rlcih2b2lkKTsKK3ZvaWQgbnZtX3N5c2ZzX3VucmVnaXN0ZXIodm9pZCk7CisKKy8qIHN5c2ZzID4gY29yZSAqLwordm9pZCBudm1fZnJlZShzdHJ1Y3QgbnZtX2RldiAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xpZ2h0bnZtL3N5c2ZzLmMgYi9kcml2ZXJzL2xpZ2h0bnZtL3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzOGMyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGlnaHRudm0vc3lzZnMuYwpAQCAtMCwwICsxLDE5OCBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpZ2h0bnZtLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGstbXEuaD4KKworI2luY2x1ZGUgImxpZ2h0bnZtLmgiCisKK3N0YXRpYyBzc2l6ZV90IG52bV9kZXZfYXR0cl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRhdHRyLCBjaGFyICpwYWdlKQoreworCXN0cnVjdCBudm1fZGV2ICpuZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG52bV9kZXYsIGRldik7CisJc3RydWN0IG52bV9pZCAqaWQgPSAmbmRldi0+aWRlbnRpdHk7CisJc3RydWN0IG52bV9pZF9ncm91cCAqZ3JwID0gJmlkLT5ncm91cHNbMF07CisJc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciA9ICZkYXR0ci0+YXR0cjsKKworCWlmIChzdHJjbXAoYXR0ci0+bmFtZSwgInZlcnNpb24iKSA9PSAwKSB7CisJCXJldHVybiBzY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXVcbiIsIGlkLT52ZXJfaWQpOworCX0gZWxzZSBpZiAoc3RyY21wKGF0dHItPm5hbWUsICJ2ZW5kb3Jfb3Bjb2RlIikgPT0gMCkgeworCQlyZXR1cm4gc2NucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLCBpZC0+dm1udCk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgImNhcGFiaWxpdGllcyIpID09IDApIHsKKwkJcmV0dXJuIHNjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIldVxuIiwgaWQtPmNhcCk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgImRldmljZV9tb2RlIikgPT0gMCkgeworCQlyZXR1cm4gc2NucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLCBpZC0+ZG9tKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAibWVkaWFfbWFuYWdlciIpID09IDApIHsKKwkJaWYgKCFuZGV2LT5tdCkKKwkJCXJldHVybiBzY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXNcbiIsICJub25lIik7CisJCXJldHVybiBzY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXNcbiIsIG5kZXYtPm10LT5uYW1lKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAicHBhX2Zvcm1hdCIpID09IDApIHsKKwkJcmV0dXJuIHNjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsCisJCQkiMHglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnhcbiIsCisJCQlpZC0+cHBhZi5jaF9vZmZzZXQsIGlkLT5wcGFmLmNoX2xlbiwKKwkJCWlkLT5wcGFmLmx1bl9vZmZzZXQsIGlkLT5wcGFmLmx1bl9sZW4sCisJCQlpZC0+cHBhZi5wbG5fb2Zmc2V0LCBpZC0+cHBhZi5wbG5fbGVuLAorCQkJaWQtPnBwYWYuYmxrX29mZnNldCwgaWQtPnBwYWYuYmxrX2xlbiwKKwkJCWlkLT5wcGFmLnBnX29mZnNldCwgaWQtPnBwYWYucGdfbGVuLAorCQkJaWQtPnBwYWYuc2VjdF9vZmZzZXQsIGlkLT5wcGFmLnNlY3RfbGVuKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAibWVkaWFfdHlwZSIpID09IDApIHsJLyogdTggKi8KKwkJcmV0dXJuIHNjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIldVxuIiwgZ3JwLT5tdHlwZSk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgImZsYXNoX21lZGlhX3R5cGUiKSA9PSAwKSB7CisJCXJldHVybiBzY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXVcbiIsIGdycC0+Zm10eXBlKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAibnVtX2NoYW5uZWxzIikgPT0gMCkgeworCQlyZXR1cm4gc2NucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLCBncnAtPm51bV9jaCk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgIm51bV9sdW5zIikgPT0gMCkgeworCQlyZXR1cm4gc2NucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLCBncnAtPm51bV9sdW4pOworCX0gZWxzZSBpZiAoc3RyY21wKGF0dHItPm5hbWUsICJudW1fcGxhbmVzIikgPT0gMCkgeworCQlyZXR1cm4gc2NucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLCBncnAtPm51bV9wbG4pOworCX0gZWxzZSBpZiAoc3RyY21wKGF0dHItPm5hbWUsICJudW1fYmxvY2tzIikgPT0gMCkgewkvKiB1MTYgKi8KKwkJcmV0dXJuIHNjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIldVxuIiwgZ3JwLT5udW1fYmxrKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAibnVtX3BhZ2VzIikgPT0gMCkgeworCQlyZXR1cm4gc2NucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLCBncnAtPm51bV9wZyk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgInBhZ2Vfc2l6ZSIpID09IDApIHsKKwkJcmV0dXJuIHNjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIldVxuIiwgZ3JwLT5mcGdfc3opOworCX0gZWxzZSBpZiAoc3RyY21wKGF0dHItPm5hbWUsICJod19zZWN0b3Jfc2l6ZSIpID09IDApIHsKKwkJcmV0dXJuIHNjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIldVxuIiwgZ3JwLT5jc2Vjcyk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgIm9vYl9zZWN0b3Jfc2l6ZSIpID09IDApIHsvKiB1MzIgKi8KKwkJcmV0dXJuIHNjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIldVxuIiwgZ3JwLT5zb3MpOworCX0gZWxzZSBpZiAoc3RyY21wKGF0dHItPm5hbWUsICJyZWFkX3R5cCIpID09IDApIHsKKwkJcmV0dXJuIHNjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIldVxuIiwgZ3JwLT50cmR0KTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAicmVhZF9tYXgiKSA9PSAwKSB7CisJCXJldHVybiBzY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXVcbiIsIGdycC0+dHJkbSk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgInByb2dfdHlwIikgPT0gMCkgeworCQlyZXR1cm4gc2NucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLCBncnAtPnRwcnQpOworCX0gZWxzZSBpZiAoc3RyY21wKGF0dHItPm5hbWUsICJwcm9nX21heCIpID09IDApIHsKKwkJcmV0dXJuIHNjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIldVxuIiwgZ3JwLT50cHJtKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAiZXJhc2VfdHlwIikgPT0gMCkgeworCQlyZXR1cm4gc2NucHJpbnRmKHBhZ2UsIFBBR0VfU0laRSwgIiV1XG4iLCBncnAtPnRiZXQpOworCX0gZWxzZSBpZiAoc3RyY21wKGF0dHItPm5hbWUsICJlcmFzZV9tYXgiKSA9PSAwKSB7CisJCXJldHVybiBzY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiJXVcbiIsIGdycC0+dGJlbSk7CisJfSBlbHNlIGlmIChzdHJjbXAoYXR0ci0+bmFtZSwgIm11bHRpcGxhbmVfbW9kZXMiKSA9PSAwKSB7CisJCXJldHVybiBzY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiMHglMDh4XG4iLCBncnAtPm1wb3MpOworCX0gZWxzZSBpZiAoc3RyY21wKGF0dHItPm5hbWUsICJtZWRpYV9jYXBhYmlsaXRpZXMiKSA9PSAwKSB7CisJCXJldHVybiBzY25wcmludGYocGFnZSwgUEFHRV9TSVpFLCAiMHglMDh4XG4iLCBncnAtPm1jY2FwKTsKKwl9IGVsc2UgaWYgKHN0cmNtcChhdHRyLT5uYW1lLCAibWF4X3BoeXNfc2VjcyIpID09IDApIHsKKwkJcmV0dXJuIHNjbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsICIldVxuIiwKKwkJCQluZGV2LT5vcHMtPm1heF9waHlzX3NlY3QpOworCX0gZWxzZSB7CisJCXJldHVybiBzY25wcmludGYocGFnZSwKKwkJCQkgUEFHRV9TSVpFLAorCQkJCSAiVW5oYW5kbGVkIGF0dHIoJXMpIGluIGBudm1fZGV2X2F0dHJfc2hvd2BcbiIsCisJCQkJIGF0dHItPm5hbWUpOworCX0KK30KKworI2RlZmluZSBOVk1fREVWX0FUVFJfUk8oX25hbWUpCQkJCQkJXAorCURFVklDRV9BVFRSKF9uYW1lLCBTX0lSVUdPLCBudm1fZGV2X2F0dHJfc2hvdywgTlVMTCkKKworc3RhdGljIE5WTV9ERVZfQVRUUl9STyh2ZXJzaW9uKTsKK3N0YXRpYyBOVk1fREVWX0FUVFJfUk8odmVuZG9yX29wY29kZSk7CitzdGF0aWMgTlZNX0RFVl9BVFRSX1JPKGNhcGFiaWxpdGllcyk7CitzdGF0aWMgTlZNX0RFVl9BVFRSX1JPKGRldmljZV9tb2RlKTsKK3N0YXRpYyBOVk1fREVWX0FUVFJfUk8ocHBhX2Zvcm1hdCk7CitzdGF0aWMgTlZNX0RFVl9BVFRSX1JPKG1lZGlhX21hbmFnZXIpOworCitzdGF0aWMgTlZNX0RFVl9BVFRSX1JPKG1lZGlhX3R5cGUpOworc3RhdGljIE5WTV9ERVZfQVRUUl9STyhmbGFzaF9tZWRpYV90eXBlKTsKK3N0YXRpYyBOVk1fREVWX0FUVFJfUk8obnVtX2NoYW5uZWxzKTsKK3N0YXRpYyBOVk1fREVWX0FUVFJfUk8obnVtX2x1bnMpOworc3RhdGljIE5WTV9ERVZfQVRUUl9STyhudW1fcGxhbmVzKTsKK3N0YXRpYyBOVk1fREVWX0FUVFJfUk8obnVtX2Jsb2Nrcyk7CitzdGF0aWMgTlZNX0RFVl9BVFRSX1JPKG51bV9wYWdlcyk7CitzdGF0aWMgTlZNX0RFVl9BVFRSX1JPKHBhZ2Vfc2l6ZSk7CitzdGF0aWMgTlZNX0RFVl9BVFRSX1JPKGh3X3NlY3Rvcl9zaXplKTsKK3N0YXRpYyBOVk1fREVWX0FUVFJfUk8ob29iX3NlY3Rvcl9zaXplKTsKK3N0YXRpYyBOVk1fREVWX0FUVFJfUk8ocmVhZF90eXApOworc3RhdGljIE5WTV9ERVZfQVRUUl9STyhyZWFkX21heCk7CitzdGF0aWMgTlZNX0RFVl9BVFRSX1JPKHByb2dfdHlwKTsKK3N0YXRpYyBOVk1fREVWX0FUVFJfUk8ocHJvZ19tYXgpOworc3RhdGljIE5WTV9ERVZfQVRUUl9STyhlcmFzZV90eXApOworc3RhdGljIE5WTV9ERVZfQVRUUl9STyhlcmFzZV9tYXgpOworc3RhdGljIE5WTV9ERVZfQVRUUl9STyhtdWx0aXBsYW5lX21vZGVzKTsKK3N0YXRpYyBOVk1fREVWX0FUVFJfUk8obWVkaWFfY2FwYWJpbGl0aWVzKTsKK3N0YXRpYyBOVk1fREVWX0FUVFJfUk8obWF4X3BoeXNfc2Vjcyk7CisKKyNkZWZpbmUgTlZNX0RFVl9BVFRSKF9uYW1lKSAoZGV2X2F0dHJfIyNfbmFtZSMjKQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbnZtX2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl92ZXJzaW9uLmF0dHIsCisJJmRldl9hdHRyX3ZlbmRvcl9vcGNvZGUuYXR0ciwKKwkmZGV2X2F0dHJfY2FwYWJpbGl0aWVzLmF0dHIsCisJJmRldl9hdHRyX2RldmljZV9tb2RlLmF0dHIsCisJJmRldl9hdHRyX21lZGlhX21hbmFnZXIuYXR0ciwKKworCSZkZXZfYXR0cl9wcGFfZm9ybWF0LmF0dHIsCisJJmRldl9hdHRyX21lZGlhX3R5cGUuYXR0ciwKKwkmZGV2X2F0dHJfZmxhc2hfbWVkaWFfdHlwZS5hdHRyLAorCSZkZXZfYXR0cl9udW1fY2hhbm5lbHMuYXR0ciwKKwkmZGV2X2F0dHJfbnVtX2x1bnMuYXR0ciwKKwkmZGV2X2F0dHJfbnVtX3BsYW5lcy5hdHRyLAorCSZkZXZfYXR0cl9udW1fYmxvY2tzLmF0dHIsCisJJmRldl9hdHRyX251bV9wYWdlcy5hdHRyLAorCSZkZXZfYXR0cl9wYWdlX3NpemUuYXR0ciwKKwkmZGV2X2F0dHJfaHdfc2VjdG9yX3NpemUuYXR0ciwKKwkmZGV2X2F0dHJfb29iX3NlY3Rvcl9zaXplLmF0dHIsCisJJmRldl9hdHRyX3JlYWRfdHlwLmF0dHIsCisJJmRldl9hdHRyX3JlYWRfbWF4LmF0dHIsCisJJmRldl9hdHRyX3Byb2dfdHlwLmF0dHIsCisJJmRldl9hdHRyX3Byb2dfbWF4LmF0dHIsCisJJmRldl9hdHRyX2VyYXNlX3R5cC5hdHRyLAorCSZkZXZfYXR0cl9lcmFzZV9tYXguYXR0ciwKKwkmZGV2X2F0dHJfbXVsdGlwbGFuZV9tb2Rlcy5hdHRyLAorCSZkZXZfYXR0cl9tZWRpYV9jYXBhYmlsaXRpZXMuYXR0ciwKKwkmZGV2X2F0dHJfbWF4X3BoeXNfc2Vjcy5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBudm1fZGV2X2F0dHJfZ3JvdXAgPSB7CisJLm5hbWUgPSAibGlnaHRudm0iLAorCS5hdHRycyA9IG52bV9kZXZfYXR0cnMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqbnZtX2Rldl9hdHRyX2dyb3Vwc1tdID0geworCSZudm1fZGV2X2F0dHJfZ3JvdXAsCisJTlVMTCwKK307CisKK3N0YXRpYyB2b2lkIG52bV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IG52bV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihkZXZpY2UsIHN0cnVjdCBudm1fZGV2LCBkZXYpOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gZGV2LT5xOworCisJcHJfZGVidWcoIm52bS9zeXNmczogYG52bV9kZXZfcmVsZWFzZWBcbiIpOworCisJYmxrX21xX3VucmVnaXN0ZXJfZGV2KGRldmljZSwgcSk7CisKKwludm1fZnJlZShkZXYpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV90eXBlIG52bV90eXBlID0geworCS5uYW1lCQk9ICJsaWdodG52bSIsCisJLmdyb3VwcwkJPSBudm1fZGV2X2F0dHJfZ3JvdXBzLAorCS5yZWxlYXNlCT0gbnZtX2Rldl9yZWxlYXNlLAorfTsKKworaW50IG52bV9zeXNmc19yZWdpc3Rlcl9kZXYoc3RydWN0IG52bV9kZXYgKmRldikKK3sKKwlpbnQgcmV0OworCisJaWYgKCFkZXYtPnBhcmVudF9kZXYpCisJCXJldHVybiAwOworCisJZGV2LT5kZXYucGFyZW50ID0gZGV2LT5wYXJlbnRfZGV2OworCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICIlcyIsIGRldi0+bmFtZSk7CisJZGV2LT5kZXYudHlwZSA9ICZudm1fdHlwZTsKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmZGV2LT5kZXYpOworCXJldCA9IGRldmljZV9hZGQoJmRldi0+ZGV2KTsKKworCWlmICghcmV0KQorCQlibGtfbXFfcmVnaXN0ZXJfZGV2KCZkZXYtPmRldiwgZGV2LT5xKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbnZtX3N5c2ZzX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBudm1fZGV2ICpkZXYpCit7CisJaWYgKGRldiAmJiBkZXYtPnBhcmVudF9kZXYpCisJCWtvYmplY3RfcHV0KCZkZXYtPmRldi5rb2JqKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL2Ftcy9hbXMtaTJjLmMgYi9kcml2ZXJzL21hY2ludG9zaC9hbXMvYW1zLWkyYy5jCmluZGV4IDk3OGVkYTguLjhhM2JhNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL2Ftcy9hbXMtaTJjLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvYW1zL2Ftcy1pMmMuYwpAQCAtNzMsNyArNzMsNiBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFtc19pMmNfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lICAgPSAiYW1zIiwKLQkJLm93bmVyICA9IFRISVNfTU9EVUxFLAogCX0sCiAJLnByb2JlICAgICAgICAgID0gYW1zX2kyY19wcm9iZSwKIAkucmVtb3ZlICAgICAgICAgPSBhbXNfaTJjX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYyBiL2RyaXZlcnMvbWFjaW50b3NoL21hY2lvX2FzaWMuYwppbmRleCBiNjgxOWYwLi4zZjA0MWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9tYWNpb19hc2ljLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvbWFjaW9fYXNpYy5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAl1bnNpZ25lZCBpbnQgaXJxOwogCiAJaXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKE5VTEwsIGxpbmUpOwotCWlmIChpcnEgIT0gTk9fSVJRKSB7CisJaWYgKCFpcnEpIHsKIAkJZGV2LT5pbnRlcnJ1cHRbaW5kZXhdLnN0YXJ0ID0gaXJxOwogCQlkZXYtPmludGVycnVwdFtpbmRleF0uZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKIAkJZGV2LT5pbnRlcnJ1cHRbaW5kZXhdLm5hbWUgPSBkZXZfbmFtZSgmZGV2LT5vZmRldi5kZXYpOwpAQCAtMjk5LDcgKzI5OSw3IEBACiAJCQlicmVhazsKIAkJcmVzID0gJmRldi0+aW50ZXJydXB0W2pdOwogCQlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgaSsrKTsKLQkJaWYgKGlycSA9PSBOT19JUlEpCisJCWlmICghaXJxKQogCQkJYnJlYWs7CiAJCXJlcy0+c3RhcnQgPSBpcnE7CiAJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3JhY2stbWV0ZXIuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3JhY2stbWV0ZXIuYwppbmRleCA0NjVjNTIyLi43NzU1MjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9yYWNrLW1ldGVyLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvcmFjay1tZXRlci5jCkBAIC00MjcsNyArNDI3LDcgQEAKIAlybS0+aXJxID0gbWFjaW9faXJxKG1kZXYsIDEpOwogI2Vsc2UKIAlybS0+aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoaTJzLCAxKTsKLQlpZiAocm0tPmlycSA9PSBOT19JUlEgfHwKKwlpZiAoIXJtLT5pcnEgfHwKIAkgICAgb2ZfYWRkcmVzc190b19yZXNvdXJjZShpMnMsIDAsICZyaTJzKSB8fAogCSAgICBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGkycywgMSwgJnJkbWEpKSB7CiAJCXByaW50ayhLRVJOX0VSUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvc211LmMgYi9kcml2ZXJzL21hY2ludG9zaC9zbXUuYwppbmRleCBkNmY3MmM4Li4wOGVkYjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9zbXUuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC9zbXUuYwpAQCAtMjc5LDcgKzI3OSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc211LT5sb2NrLCBmbGFncyk7CiAKIAkvKiBXb3JrYXJvdW5kIGZvciBlYXJseSBjYWxscyB3aGVuIGlycSBpc24ndCBhdmFpbGFibGUgKi8KLQlpZiAoIXNtdV9pcnFfaW5pdGVkIHx8IHNtdS0+ZGJfaXJxID09IE5PX0lSUSkKKwlpZiAoIXNtdV9pcnFfaW5pdGVkIHx8ICFzbXUtPmRiX2lycSkKIAkJc211X3NwaW53YWl0X2NtZChjbWQpOwogCiAJcmV0dXJuIDA7CkBAIC00OTgsOCArNDk4LDggQEAKIAlJTklUX0xJU1RfSEVBRCgmc211LT5jbWRfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJnNtdS0+Y21kX2kyY19saXN0KTsKIAlzbXUtPm9mX25vZGUgPSBucDsKLQlzbXUtPmRiX2lycSA9IE5PX0lSUTsKLQlzbXUtPm1zZ19pcnEgPSBOT19JUlE7CisJc211LT5kYl9pcnEgPSAwOworCXNtdS0+bXNnX2lycSA9IDA7CiAKIAkvKiBzbXVfY21kYnVmX2FicyBpcyBpbiB0aGUgbG93IDJHIG9mIFJBTSwgY2FuIGJlIGNvbnZlcnRlZCB0byBhCiAJICogMzIgYml0cyB2YWx1ZSBzYWZlbHkKQEAgLTU4NywxMyArNTg3LDEzIEBACiAKIAlpZiAoc211LT5kYl9ub2RlKSB7CiAJCXNtdS0+ZGJfaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoc211LT5kYl9ub2RlLCAwKTsKLQkJaWYgKHNtdS0+ZGJfaXJxID09IE5PX0lSUSkKKwkJaWYgKCFzbXUtPmRiX2lycSkKIAkJCXByaW50ayhLRVJOX0VSUiAic211OiBmYWlsZWQgdG8gbWFwIGlycSBmb3Igbm9kZSAlc1xuIiwKIAkJCSAgICAgICBzbXUtPmRiX25vZGUtPmZ1bGxfbmFtZSk7CiAJfQogCWlmIChzbXUtPm1zZ19ub2RlKSB7CiAJCXNtdS0+bXNnX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHNtdS0+bXNnX25vZGUsIDApOwotCQlpZiAoc211LT5tc2dfaXJxID09IE5PX0lSUSkKKwkJaWYgKCFzbXUtPm1zZ19pcnEpCiAJCQlwcmludGsoS0VSTl9FUlIgInNtdTogZmFpbGVkIHRvIG1hcCBpcnEgZm9yIG5vZGUgJXNcbiIsCiAJCQkgICAgICAgc211LT5tc2dfbm9kZS0+ZnVsbF9uYW1lKTsKIAl9CkBAIC02MDIsMjMgKzYwMiwyMyBAQAogCSAqIFRyeSB0byByZXF1ZXN0IHRoZSBpbnRlcnJ1cHRzCiAJICovCiAKLQlpZiAoc211LT5kYl9pcnEgIT0gTk9fSVJRKSB7CisJaWYgKHNtdS0+ZGJfaXJxKSB7CiAJCWlmIChyZXF1ZXN0X2lycShzbXUtPmRiX2lycSwgc211X2RiX2ludHIsCiAJCQkJSVJRRl9TSEFSRUQsICJTTVUgZG9vcmJlbGwiLCBzbXUpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU01VOiBjYW4ndCAiCiAJCQkgICAgICAgInJlcXVlc3QgaW50ZXJydXB0ICVkXG4iLAogCQkJICAgICAgIHNtdS0+ZGJfaXJxKTsKLQkJCXNtdS0+ZGJfaXJxID0gTk9fSVJROworCQkJc211LT5kYl9pcnEgPSAwOwogCQl9CiAJfQogCi0JaWYgKHNtdS0+bXNnX2lycSAhPSBOT19JUlEpIHsKKwlpZiAoc211LT5tc2dfaXJxKSB7CiAJCWlmIChyZXF1ZXN0X2lycShzbXUtPm1zZ19pcnEsIHNtdV9tc2dfaW50ciwKIAkJCQlJUlFGX1NIQVJFRCwgIlNNVSBtZXNzYWdlIiwgc211KSA8IDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNNVTogY2FuJ3QgIgogCQkJICAgICAgICJyZXF1ZXN0IGludGVycnVwdCAlZFxuIiwKIAkJCSAgICAgICBzbXUtPm1zZ19pcnEpOwotCQkJc211LT5tc2dfaXJxID0gTk9fSVJROworCQkJc211LT5tc2dfaXJxID0gMDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLWN1ZGEuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1jdWRhLmMKaW5kZXggYmFkMTgxMy4uMjA4OGUyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLWN1ZGEuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtY3VkYS5jCkBAIC0yMDksNyArMjA5LDcgQEAKICAgICBjdWRhX2lycSA9IElSUV9NQUNfQURCOwogI2Vsc2UKICAgICBjdWRhX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHZpYXMsIDApOwotICAgIGlmIChjdWRhX2lycSA9PSBOT19JUlEpIHsKKyAgICBpZiAoIWN1ZGFfaXJxKSB7CiAJcHJpbnRrKEtFUk5fRVJSICJ2aWEtY3VkYTogY2FuJ3QgbWFwIGludGVycnVwdHMgZm9yICVzXG4iLAogCSAgICAgICB2aWFzLT5mdWxsX25hbWUpOwogCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCmluZGV4IGY4YjZkMTQuLjkxMDgxZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC92aWEtcG11LmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogc3RhdGljIGludCBwbXVfaGFzX2FkYjsKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmdwaW9fbm9kZTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIF9faW9tZW0gKmdwaW9fcmVnOwotc3RhdGljIGludCBncGlvX2lycSA9IE5PX0lSUTsKK3N0YXRpYyBpbnQgZ3Bpb19pcnEgPSAwOwogc3RhdGljIGludCBncGlvX2lycV9lbmFibGVkID0gLTE7CiBzdGF0aWMgdm9sYXRpbGUgaW50IHBtdV9zdXNwZW5kZWQ7CiBzdGF0aWMgc3BpbmxvY2tfdCBwbXVfbG9jazsKQEAgLTQwMiw3ICs0MDIsNyBAQAogCWJhdHRfcmVxLmNvbXBsZXRlID0gMTsKIAogCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHZpYXMsIDApOwotCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFpcnEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ2aWEtcG11OiBjYW4ndCBtYXAgaW50ZXJydXB0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtNDI0LDcgKzQyNCw3IEBACiAJCWlmIChncGlvX25vZGUpCiAJCQlncGlvX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGdwaW9fbm9kZSwgMCk7CiAKLQkJaWYgKGdwaW9faXJxICE9IE5PX0lSUSkgeworCQlpZiAoZ3Bpb19pcnEpIHsKIAkJCWlmIChyZXF1ZXN0X2lycShncGlvX2lycSwgZ3BpbzFfaW50ZXJydXB0LAogCQkJCQlJUlFGX05PX1NVU1BFTkQsICJHUElPMSBBREIiLAogCQkJCQkodm9pZCAqKTApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG0xMTIuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtMTEyLmMKaW5kZXggMzAyNDY4NS4uOTZkMTZmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG0xMTIuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTExMi5jCkBAIC02NjgsNyArNjY4LDYgQEAKIAkucmVtb3ZlID0gd2ZfcG0xMTJfcmVtb3ZlLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gIndpbmRmYXJtIiwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtNzIuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3BtNzIuYwppbmRleCAyZjUwNmI5Li5lODhjZmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9wbTcyLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcG03Mi5jCkBAIC03ODksNyArNzg5LDYgQEAKIAkucmVtb3ZlCT0gd2ZfcG03Ml9yZW1vdmUsCiAJLmRyaXZlcgk9IHsKIAkJLm5hbWUgPSAid2luZGZhcm0iLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcm0zMS5jIGIvZHJpdmVycy9tYWNpbnRvc2gvd2luZGZhcm1fcm0zMS5jCmluZGV4IDgyZmM4NmEuLmJkZmNiOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL3dpbmRmYXJtX3JtMzEuYworKysgYi9kcml2ZXJzL21hY2ludG9zaC93aW5kZmFybV9ybTMxLmMKQEAgLTY4Miw3ICs2ODIsNiBAQAogCS5yZW1vdmUJPSB3Zl9ybTMxX3JlbW92ZSwKIAkuZHJpdmVyCT0gewogCQkubmFtZSA9ICJ3aW5kZmFybSIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21haWxib3gvS2NvbmZpZyBiL2RyaXZlcnMvbWFpbGJveC9LY29uZmlnCmluZGV4IDk3YzM3MjkuLjExZWViZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFpbGJveC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWFpbGJveC9LY29uZmlnCkBAIC0xNSw2ICsxNSwxNiBAQAogCSAgVGhlIGNvbnRyb2xsZXIgaGFzIDMgbWFpbGJveCBjaGFubmVscywgdGhlIGxhc3Qgb2Ygd2hpY2ggY2FuIGJlCiAJICB1c2VkIGluIFNlY3VyZSBtb2RlIG9ubHkuCiAKK2NvbmZpZyBQTEFURk9STV9NSFUKKwl0cmlzdGF0ZSAiUGxhdGZvcm0gTUhVIE1haWxib3giCisJZGVwZW5kcyBvbiBPRgorCWRlcGVuZHMgb24gSEFTX0lPTUVNCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBhIHBsYXRmb3JtIHNwZWNpZmljIHZhcmlhbnQgTUhVCisJICBjb250cm9sbGVyIGRyaXZlci4KKwkgIFRoZSBjb250cm9sbGVyIGhhcyBhIG1heGltdW0gb2YgMyBtYWlsYm94IGNoYW5uZWxzLCB0aGUgbGFzdCBvZgorCSAgd2hpY2ggY2FuIGJlIHVzZWQgaW4gU2VjdXJlIG1vZGUgb25seS4KKwogY29uZmlnIFBMMzIwX01CT1gKIAlib29sICJBUk0gUEwzMjAgTWFpbGJveCIKIAlkZXBlbmRzIG9uIEFSTV9BTUJBCkBAIC0xMjcsNiArMTM3LDcgQEAKIGNvbmZpZyBCQ01fUERDX01CT1gKIAl0cmlzdGF0ZSAiQnJvYWRjb20gUERDIE1haWxib3giCiAJZGVwZW5kcyBvbiBBUk02NCB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEhBU19ETUEKIAlkZWZhdWx0IEFSQ0hfQkNNX0lQUk9DCiAJaGVscAogCSAgTWFpbGJveCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEJyb2FkY29tIFBEQyByaW5nIG1hbmFnZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21haWxib3gvTWFrZWZpbGUgYi9kcml2ZXJzL21haWxib3gvTWFrZWZpbGUKaW5kZXggNjZjMzhlMy4uYWNlNmZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWlsYm94L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWFpbGJveC9NYWtlZmlsZQpAQCAtNiw2ICs2LDggQEAKIAogb2JqLSQoQ09ORklHX0FSTV9NSFUpCSs9IGFybV9taHUubwogCitvYmotJChDT05GSUdfUExBVEZPUk1fTUhVKQkrPSBwbGF0Zm9ybV9taHUubworCiBvYmotJChDT05GSUdfUEwzMjBfTUJPWCkJKz0gcGwzMjAtaXBjLm8KIAogb2JqLSQoQ09ORklHX09NQVAyUExVU19NQk9YKQkrPSBvbWFwLW1haWxib3gubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWlsYm94L2JjbS1wZGMtbWFpbGJveC5jIGIvZHJpdmVycy9tYWlsYm94L2JjbS1wZGMtbWFpbGJveC5jCmluZGV4IGNiZTBjMWUuLmMxOWRkODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFpbGJveC9iY20tcGRjLW1haWxib3guYworKysgYi9kcml2ZXJzL21haWxib3gvYmNtLXBkYy1tYWlsYm94LmMKQEAgLTQ2OSw3ICs0NjksNyBAQAogICogdGhpcyBkaXJlY3RvcnkgZm9yIGEgU1BVLgogICogQHBkY3M6IFBEQyBzdGF0ZSBzdHJ1Y3R1cmUKICAqLwotdm9pZCBwZGNfc2V0dXBfZGVidWdmcyhzdHJ1Y3QgcGRjX3N0YXRlICpwZGNzKQorc3RhdGljIHZvaWQgcGRjX3NldHVwX2RlYnVnZnMoc3RydWN0IHBkY19zdGF0ZSAqcGRjcykKIHsKIAljaGFyIHNwdV9zdGF0c19uYW1lWzE2XTsKIApAQCAtNDg1LDcgKzQ4NSw3IEBACiAJCQkJCQkgICZwZGNfZGVidWdmc19zdGF0cyk7CiB9CiAKLXZvaWQgcGRjX2ZyZWVfZGVidWdmcyh2b2lkKQorc3RhdGljIHZvaWQgcGRjX2ZyZWVfZGVidWdmcyh2b2lkKQogewogCWlmIChkZWJ1Z2ZzX2RpciAmJiBzaW1wbGVfZW1wdHkoZGVidWdmc19kaXIpKSB7CiAJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkZWJ1Z2ZzX2Rpcik7CkBAIC0xMTkxLDEwICsxMTkxLDExIEBACiB7CiAJc3RydWN0IHBkY19zdGF0ZSAqcGRjcyA9IGNoYW4tPmNvbl9wcml2OwogCi0JaWYgKHBkY3MpCi0JCWRldl9kYmcoJnBkY3MtPnBkZXYtPmRldiwKLQkJCSJTaHV0ZG93biBtYWlsYm94IGNoYW5uZWwgZm9yIFBEQyAldSIsIHBkY3MtPnBkY19pZHgpOworCWlmICghcGRjcykKKwkJcmV0dXJuOwogCisJZGV2X2RiZygmcGRjcy0+cGRldi0+ZGV2LAorCQkiU2h1dGRvd24gbWFpbGJveCBjaGFubmVsIGZvciBQREMgJXUiLCBwZGNzLT5wZGNfaWR4KTsKIAlwZGNfcmluZ19mcmVlKHBkY3MpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21haWxib3gvcGNjLmMgYi9kcml2ZXJzL21haWxib3gvcGNjLmMKaW5kZXggMDQzODI4ZC4uMDhjODdmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWlsYm94L3BjYy5jCisrKyBiL2RyaXZlcnMvbWFpbGJveC9wY2MuYwpAQCAtNTksNiArNTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21haWxib3hfY29udHJvbGxlci5oPgpAQCAtNjgsMTEgKzY5LDE2IEBACiAjaW5jbHVkZSAibWFpbGJveC5oIgogCiAjZGVmaW5lIE1BWF9QQ0NfU1VCU1BBQ0VTCTI1NgorI2RlZmluZSBNQk9YX0lSUV9OQU1FCQkicGNjLW1ib3giCiAKIHN0YXRpYyBzdHJ1Y3QgbWJveF9jaGFuICpwY2NfbWJveF9jaGFubmVsczsKIAogLyogQXJyYXkgb2YgY2FjaGVkIHZpcnR1YWwgYWRkcmVzcyBmb3IgZG9vcmJlbGwgcmVnaXN0ZXJzICovCiBzdGF0aWMgdm9pZCBfX2lvbWVtICoqcGNjX2Rvb3JiZWxsX3ZhZGRyOworLyogQXJyYXkgb2YgY2FjaGVkIHZpcnR1YWwgYWRkcmVzcyBmb3IgZG9vcmJlbGwgYWNrIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgX19pb21lbSAqKnBjY19kb29yYmVsbF9hY2tfdmFkZHI7CisvKiBBcnJheSBvZiBkb29yYmVsbCBpbnRlcnJ1cHRzICovCitzdGF0aWMgaW50ICpwY2NfZG9vcmJlbGxfaXJxOwogCiBzdGF0aWMgc3RydWN0IG1ib3hfY29udHJvbGxlciBwY2NfbWJveF9jdHJsID0ge307CiAvKioKQEAgLTkxLDc5ICs5Nyw2IEBACiAJcmV0dXJuICZwY2NfbWJveF9jaGFubmVsc1tpZF07CiB9CiAKLS8qKgotICogcGNjX21ib3hfcmVxdWVzdF9jaGFubmVsIC0gUENDIGNsaWVudHMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCi0gKgkJcmVxdWVzdCBhIHBvaW50ZXIgdG8gdGhlaXIgUENDIHN1YnNwYWNlLCBmcm9tIHdoaWNoIHRoZXkKLSAqCQljYW4gZ2V0IHRoZSBkZXRhaWxzIG9mIGNvbW11bmljYXRpbmcgd2l0aCB0aGUgcmVtb3RlLgotICogQGNsOiBQb2ludGVyIHRvIE1haWxib3ggY2xpZW50LCBzbyB3ZSBrbm93IHdoZXJlIHRvIGJpbmQgdGhlCi0gKgkJQ2hhbm5lbC4KLSAqIEBzdWJzcGFjZV9pZDogVGhlIFBDQyBTdWJzcGFjZSBpbmRleCBhcyBwYXJzZWQgaW4gdGhlIFBDQyBjbGllbnQKLSAqCQlBQ1BJIHBhY2thZ2UuIFRoaXMgaXMgdXNlZCB0byBsb29rdXAgdGhlIGFycmF5IG9mIFBDQwotICoJCXN1YnNwYWNlcyBhcyBwYXJzZWQgYnkgdGhlIFBDQyBNYWlsYm94IGNvbnRyb2xsZXIuCi0gKgotICogUmV0dXJuOiBQb2ludGVyIHRvIHRoZSBNYWlsYm94IENoYW5uZWwgaWYgc3VjY2Vzc2Z1bCBvcgotICoJCUVSUl9QVFIuCi0gKi8KLXN0cnVjdCBtYm94X2NoYW4gKnBjY19tYm94X3JlcXVlc3RfY2hhbm5lbChzdHJ1Y3QgbWJveF9jbGllbnQgKmNsLAotCQlpbnQgc3Vic3BhY2VfaWQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcGNjX21ib3hfY3RybC5kZXY7Ci0Jc3RydWN0IG1ib3hfY2hhbiAqY2hhbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyoKLQkgKiBFYWNoIFBDQyBTdWJzcGFjZSBpcyBhIE1haWxib3ggQ2hhbm5lbC4KLQkgKiBUaGUgUENDIENsaWVudHMgZ2V0IHRoZWlyIFBDQyBTdWJzcGFjZSBJRAotCSAqIGZyb20gdGhlaXIgb3duIHRhYmxlcyBhbmQgcGFzcyBpdCBoZXJlLgotCSAqIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIFBDQyBzdWJzcGFjZQotCSAqIGZvciB0aGUgQ2xpZW50IHRvIG9wZXJhdGUgb24uCi0JICovCi0JY2hhbiA9IGdldF9wY2NfY2hhbm5lbChzdWJzcGFjZV9pZCk7Ci0KLQlpZiAoSVNfRVJSKGNoYW4pIHx8IGNoYW4tPmNsKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ2hhbm5lbCBub3QgZm91bmQgZm9yIGlkeDogJWRcbiIsIHN1YnNwYWNlX2lkKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwotCWNoYW4tPm1zZ19mcmVlID0gMDsKLQljaGFuLT5tc2dfY291bnQgPSAwOwotCWNoYW4tPmFjdGl2ZV9yZXEgPSBOVUxMOwotCWNoYW4tPmNsID0gY2w7Ci0JaW5pdF9jb21wbGV0aW9uKCZjaGFuLT50eF9jb21wbGV0ZSk7Ci0KLQlpZiAoY2hhbi0+dHhkb25lX21ldGhvZCA9PSBUWERPTkVfQllfUE9MTCAmJiBjbC0+a25vd3NfdHhkb25lKQotCQljaGFuLT50eGRvbmVfbWV0aG9kIHw9IFRYRE9ORV9CWV9BQ0s7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gY2hhbjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHBjY19tYm94X3JlcXVlc3RfY2hhbm5lbCk7Ci0KLS8qKgotICogcGNjX21ib3hfZnJlZV9jaGFubmVsIC0gQ2xpZW50cyBjYWxsIHRoaXMgdG8gZnJlZSB0aGVpciBDaGFubmVsLgotICoKLSAqIEBjaGFuOiBQb2ludGVyIHRvIHRoZSBtYWlsYm94IGNoYW5uZWwgYXMgcmV0dXJuZWQgYnkKLSAqCQlwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoKQotICovCi12b2lkIHBjY19tYm94X2ZyZWVfY2hhbm5lbChzdHJ1Y3QgbWJveF9jaGFuICpjaGFuKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWNoYW4gfHwgIWNoYW4tPmNsKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwotCWNoYW4tPmNsID0gTlVMTDsKLQljaGFuLT5hY3RpdmVfcmVxID0gTlVMTDsKLQlpZiAoY2hhbi0+dHhkb25lX21ldGhvZCA9PSAoVFhET05FX0JZX1BPTEwgfCBUWERPTkVfQllfQUNLKSkKLQkJY2hhbi0+dHhkb25lX21ldGhvZCA9IFRYRE9ORV9CWV9QT0xMOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocGNjX21ib3hfZnJlZV9jaGFubmVsKTsKLQogLyoKICAqIFBDQyBjYW4gYmUgdXNlZCB3aXRoIHBlcmYgY3JpdGljYWwgZHJpdmVycyBzdWNoIGFzIENQUEMKICAqIFNvIGl0IG1ha2VzIHNlbnNlIHRvIGxvY2FsbHkgY2FjaGUgdGhlIHZpcnR1YWwgYWRkcmVzcyBhbmQKQEAgLTIyNSw2ICsxNTgsMTY3IEBACiB9CiAKIC8qKgorICogcGNjX21hcF9pbnRlcnJ1cHQgLSBNYXAgYSBQQ0Mgc3Vic3BhY2UgR1NJIHRvIGEgbGludXggSVJRIG51bWJlcgorICogQGludGVycnVwdDogR1NJIG51bWJlci4KKyAqIEBmbGFnczogaW50ZXJydXB0IGZsYWdzCisgKgorICogUmV0dXJuczogYSB2YWxpZCBsaW51eCBJUlEgbnVtYmVyIG9uIHN1Y2Nlc3MKKyAqCQkwIG9yIC1FSU5WQUwgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IHBjY19tYXBfaW50ZXJydXB0KHUzMiBpbnRlcnJ1cHQsIHUzMiBmbGFncykKK3sKKwlpbnQgdHJpZ2dlciwgcG9sYXJpdHk7CisKKwlpZiAoIWludGVycnVwdCkKKwkJcmV0dXJuIDA7CisKKwl0cmlnZ2VyID0gKGZsYWdzICYgQUNQSV9QQ0NUX0lOVEVSUlVQVF9NT0RFKSA/IEFDUElfRURHRV9TRU5TSVRJVkUKKwkJCTogQUNQSV9MRVZFTF9TRU5TSVRJVkU7CisKKwlwb2xhcml0eSA9IChmbGFncyAmIEFDUElfUENDVF9JTlRFUlJVUFRfUE9MQVJJVFkpID8gQUNQSV9BQ1RJVkVfTE9XCisJCQk6IEFDUElfQUNUSVZFX0hJR0g7CisKKwlyZXR1cm4gYWNwaV9yZWdpc3Rlcl9nc2koTlVMTCwgaW50ZXJydXB0LCB0cmlnZ2VyLCBwb2xhcml0eSk7Cit9CisKKy8qKgorICogcGNjX21ib3hfaXJxIC0gUENDIG1haWxib3ggaW50ZXJydXB0IGhhbmRsZXIKKyAqLworc3RhdGljIGlycXJldHVybl90IHBjY19tYm94X2lycShpbnQgaXJxLCB2b2lkICpwKQoreworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZG9vcmJlbGxfYWNrOworCXN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZCAqcGNjdF9zczsKKwlzdHJ1Y3QgbWJveF9jaGFuICpjaGFuID0gcDsKKwl1NjQgZG9vcmJlbGxfYWNrX3ByZXNlcnZlOworCXU2NCBkb29yYmVsbF9hY2tfd3JpdGU7CisJdTY0IGRvb3JiZWxsX2Fja192YWw7CisJaW50IHJldDsKKworCXBjY3Rfc3MgPSBjaGFuLT5jb25fcHJpdjsKKworCW1ib3hfY2hhbl9yZWNlaXZlZF9kYXRhKGNoYW4sIE5VTEwpOworCisJaWYgKHBjY3Rfc3MtPmhlYWRlci50eXBlID09IEFDUElfUENDVF9UWVBFX0hXX1JFRFVDRURfU1VCU1BBQ0VfVFlQRTIpIHsKKwkJc3RydWN0IGFjcGlfcGNjdF9od19yZWR1Y2VkX3R5cGUyICpwY2N0Ml9zcyA9IGNoYW4tPmNvbl9wcml2OworCQl1MzIgaWQgPSBjaGFuIC0gcGNjX21ib3hfY2hhbm5lbHM7CisKKwkJZG9vcmJlbGxfYWNrID0gJnBjY3QyX3NzLT5kb29yYmVsbF9hY2tfcmVnaXN0ZXI7CisJCWRvb3JiZWxsX2Fja19wcmVzZXJ2ZSA9IHBjY3QyX3NzLT5hY2tfcHJlc2VydmVfbWFzazsKKwkJZG9vcmJlbGxfYWNrX3dyaXRlID0gcGNjdDJfc3MtPmFja193cml0ZV9tYXNrOworCisJCXJldCA9IHJlYWRfcmVnaXN0ZXIocGNjX2Rvb3JiZWxsX2Fja192YWRkcltpZF0sCisJCQkJICAgICZkb29yYmVsbF9hY2tfdmFsLAorCQkJCSAgICBkb29yYmVsbF9hY2stPmJpdF93aWR0aCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gSVJRX05PTkU7CisKKwkJcmV0ID0gd3JpdGVfcmVnaXN0ZXIocGNjX2Rvb3JiZWxsX2Fja192YWRkcltpZF0sCisJCQkJICAgICAoZG9vcmJlbGxfYWNrX3ZhbCAmIGRvb3JiZWxsX2Fja19wcmVzZXJ2ZSkKKwkJCQkJfCBkb29yYmVsbF9hY2tfd3JpdGUsCisJCQkJICAgICBkb29yYmVsbF9hY2stPmJpdF93aWR0aCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIHBjY19tYm94X3JlcXVlc3RfY2hhbm5lbCAtIFBDQyBjbGllbnRzIGNhbGwgdGhpcyBmdW5jdGlvbiB0bworICoJCXJlcXVlc3QgYSBwb2ludGVyIHRvIHRoZWlyIFBDQyBzdWJzcGFjZSwgZnJvbSB3aGljaCB0aGV5CisgKgkJY2FuIGdldCB0aGUgZGV0YWlscyBvZiBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHJlbW90ZS4KKyAqIEBjbDogUG9pbnRlciB0byBNYWlsYm94IGNsaWVudCwgc28gd2Uga25vdyB3aGVyZSB0byBiaW5kIHRoZQorICoJCUNoYW5uZWwuCisgKiBAc3Vic3BhY2VfaWQ6IFRoZSBQQ0MgU3Vic3BhY2UgaW5kZXggYXMgcGFyc2VkIGluIHRoZSBQQ0MgY2xpZW50CisgKgkJQUNQSSBwYWNrYWdlLiBUaGlzIGlzIHVzZWQgdG8gbG9va3VwIHRoZSBhcnJheSBvZiBQQ0MKKyAqCQlzdWJzcGFjZXMgYXMgcGFyc2VkIGJ5IHRoZSBQQ0MgTWFpbGJveCBjb250cm9sbGVyLgorICoKKyAqIFJldHVybjogUG9pbnRlciB0byB0aGUgTWFpbGJveCBDaGFubmVsIGlmIHN1Y2Nlc3NmdWwgb3IKKyAqCQlFUlJfUFRSLgorICovCitzdHJ1Y3QgbWJveF9jaGFuICpwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoc3RydWN0IG1ib3hfY2xpZW50ICpjbCwKKwkJaW50IHN1YnNwYWNlX2lkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjY19tYm94X2N0cmwuZGV2OworCXN0cnVjdCBtYm94X2NoYW4gKmNoYW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogRWFjaCBQQ0MgU3Vic3BhY2UgaXMgYSBNYWlsYm94IENoYW5uZWwuCisJICogVGhlIFBDQyBDbGllbnRzIGdldCB0aGVpciBQQ0MgU3Vic3BhY2UgSUQKKwkgKiBmcm9tIHRoZWlyIG93biB0YWJsZXMgYW5kIHBhc3MgaXQgaGVyZS4KKwkgKiBUaGlzIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBQQ0Mgc3Vic3BhY2UKKwkgKiBmb3IgdGhlIENsaWVudCB0byBvcGVyYXRlIG9uLgorCSAqLworCWNoYW4gPSBnZXRfcGNjX2NoYW5uZWwoc3Vic3BhY2VfaWQpOworCisJaWYgKElTX0VSUihjaGFuKSB8fCBjaGFuLT5jbCkgeworCQlkZXZfZXJyKGRldiwgIkNoYW5uZWwgbm90IGZvdW5kIGZvciBpZHg6ICVkXG4iLCBzdWJzcGFjZV9pZCk7CisJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKKwljaGFuLT5tc2dfZnJlZSA9IDA7CisJY2hhbi0+bXNnX2NvdW50ID0gMDsKKwljaGFuLT5hY3RpdmVfcmVxID0gTlVMTDsKKwljaGFuLT5jbCA9IGNsOworCWluaXRfY29tcGxldGlvbigmY2hhbi0+dHhfY29tcGxldGUpOworCisJaWYgKGNoYW4tPnR4ZG9uZV9tZXRob2QgPT0gVFhET05FX0JZX1BPTEwgJiYgY2wtPmtub3dzX3R4ZG9uZSkKKwkJY2hhbi0+dHhkb25lX21ldGhvZCB8PSBUWERPTkVfQllfQUNLOworCisJaWYgKHBjY19kb29yYmVsbF9pcnFbc3Vic3BhY2VfaWRdID4gMCkgeworCQlpbnQgcmM7CisKKwkJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgcGNjX2Rvb3JiZWxsX2lycVtzdWJzcGFjZV9pZF0sCisJCQkJICAgICAgcGNjX21ib3hfaXJxLCAwLCBNQk9YX0lSUV9OQU1FLCBjaGFuKTsKKwkJaWYgKHVubGlrZWx5KHJjKSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgUENDIGludGVycnVwdCAlZFxuIiwKKwkJCQlwY2NfZG9vcmJlbGxfaXJxW3N1YnNwYWNlX2lkXSk7CisJCQljaGFuID0gRVJSX1BUUihyYyk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFuLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY2hhbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjY19tYm94X3JlcXVlc3RfY2hhbm5lbCk7CisKKy8qKgorICogcGNjX21ib3hfZnJlZV9jaGFubmVsIC0gQ2xpZW50cyBjYWxsIHRoaXMgdG8gZnJlZSB0aGVpciBDaGFubmVsLgorICoKKyAqIEBjaGFuOiBQb2ludGVyIHRvIHRoZSBtYWlsYm94IGNoYW5uZWwgYXMgcmV0dXJuZWQgYnkKKyAqCQlwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoKQorICovCit2b2lkIHBjY19tYm94X2ZyZWVfY2hhbm5lbChzdHJ1Y3QgbWJveF9jaGFuICpjaGFuKQoreworCXUzMiBpZCA9IGNoYW4gLSBwY2NfbWJveF9jaGFubmVsczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFjaGFuIHx8ICFjaGFuLT5jbCkKKwkJcmV0dXJuOworCisJaWYgKGlkID49IHBjY19tYm94X2N0cmwubnVtX2NoYW5zKSB7CisJCXByX2RlYnVnKCJwY2NfbWJveF9mcmVlX2NoYW5uZWw6IEludmFsaWQgbWJveF9jaGFuIHBhc3NlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOworCWNoYW4tPmNsID0gTlVMTDsKKwljaGFuLT5hY3RpdmVfcmVxID0gTlVMTDsKKwlpZiAoY2hhbi0+dHhkb25lX21ldGhvZCA9PSAoVFhET05FX0JZX1BPTEwgfCBUWERPTkVfQllfQUNLKSkKKwkJY2hhbi0+dHhkb25lX21ldGhvZCA9IFRYRE9ORV9CWV9QT0xMOworCisJaWYgKHBjY19kb29yYmVsbF9pcnFbaWRdID4gMCkKKwkJZGV2bV9mcmVlX2lycShjaGFuLT5tYm94LT5kZXYsIHBjY19kb29yYmVsbF9pcnFbaWRdLCBjaGFuKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBjY19tYm94X2ZyZWVfY2hhbm5lbCk7CisKKworLyoqCiAgKiBwY2Nfc2VuZF9kYXRhIC0gQ2FsbGVkIGZyb20gTWFpbGJveCBDb250cm9sbGVyIGNvZGUuIFVzZWQKICAqCQloZXJlIG9ubHkgdG8gcmluZyB0aGUgY2hhbm5lbCBkb29yYmVsbC4gVGhlIFBDQyBjbGllbnQKICAqCQlzcGVjaWZpYyByZWFkL3dyaXRlIGlzIGRvbmUgaW4gdGhlIGNsaWVudCBkcml2ZXIgaW4KQEAgLTI5Niw4ICszOTAsMTAgQEAKIAlpZiAocGNjX21ib3hfY3RybC5udW1fY2hhbnMgPD0gTUFYX1BDQ19TVUJTUEFDRVMpIHsKIAkJcGNjdF9zcyA9IChzdHJ1Y3QgYWNwaV9wY2N0X2h3X3JlZHVjZWQgKikgaGVhZGVyOwogCi0JCWlmIChwY2N0X3NzLT5oZWFkZXIudHlwZSAhPQotCQkJCUFDUElfUENDVF9UWVBFX0hXX1JFRFVDRURfU1VCU1BBQ0UpIHsKKwkJaWYgKChwY2N0X3NzLT5oZWFkZXIudHlwZSAhPQorCQkJCUFDUElfUENDVF9UWVBFX0hXX1JFRFVDRURfU1VCU1BBQ0UpCisJCSAgICAmJiAocGNjdF9zcy0+aGVhZGVyLnR5cGUgIT0KKwkJCQlBQ1BJX1BDQ1RfVFlQRV9IV19SRURVQ0VEX1NVQlNQQUNFX1RZUEUyKSkgewogCQkJcHJfZXJyKCJJbmNvcnJlY3QgUENDIFN1YnNwYWNlIHR5cGUgZGV0ZWN0ZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTMwNyw2ICs0MDMsNDMgQEAKIH0KIAogLyoqCisgKiBwY2NfcGFyc2Vfc3Vic3BhY2VfaXJxIC0gUGFyc2UgdGhlIFBDQyBJUlEgYW5kIFBDQyBBQ0sgcmVnaXN0ZXIKKyAqCQlUaGVyZSBzaG91bGQgYmUgb25lIGVudHJ5IHBlciBQQ0MgY2xpZW50LgorICogQGlkOiBQQ0Mgc3Vic3BhY2UgaW5kZXguCisgKiBAcGNjdF9zczogUG9pbnRlciB0byB0aGUgQUNQSSBzdWJ0YWJsZSBoZWFkZXIgdW5kZXIgdGhlIFBDQ1QuCisgKgorICogUmV0dXJuOiAwIGZvciBTdWNjZXNzLCBlbHNlIGVycm5vLgorICoKKyAqIFRoaXMgZ2V0cyBjYWxsZWQgZm9yIGVhY2ggZW50cnkgaW4gdGhlIFBDQyB0YWJsZS4KKyAqLworc3RhdGljIGludCBwY2NfcGFyc2Vfc3Vic3BhY2VfaXJxKGludCBpZCwKKwkJCQkgIHN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZCAqcGNjdF9zcykKK3sKKwlwY2NfZG9vcmJlbGxfaXJxW2lkXSA9IHBjY19tYXBfaW50ZXJydXB0KHBjY3Rfc3MtPmRvb3JiZWxsX2ludGVycnVwdCwKKwkJCQkJCSAodTMyKXBjY3Rfc3MtPmZsYWdzKTsKKwlpZiAocGNjX2Rvb3JiZWxsX2lycVtpZF0gPD0gMCkgeworCQlwcl9lcnIoIlBDQyBHU0kgJWQgbm90IHJlZ2lzdGVyZWRcbiIsCisJCSAgICAgICBwY2N0X3NzLT5kb29yYmVsbF9pbnRlcnJ1cHQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocGNjdF9zcy0+aGVhZGVyLnR5cGUKKwkJPT0gQUNQSV9QQ0NUX1RZUEVfSFdfUkVEVUNFRF9TVUJTUEFDRV9UWVBFMikgeworCQlzdHJ1Y3QgYWNwaV9wY2N0X2h3X3JlZHVjZWRfdHlwZTIgKnBjY3QyX3NzID0gKHZvaWQgKilwY2N0X3NzOworCisJCXBjY19kb29yYmVsbF9hY2tfdmFkZHJbaWRdID0gYWNwaV9vc19pb3JlbWFwKAorCQkJCXBjY3QyX3NzLT5kb29yYmVsbF9hY2tfcmVnaXN0ZXIuYWRkcmVzcywKKwkJCQlwY2N0Ml9zcy0+ZG9vcmJlbGxfYWNrX3JlZ2lzdGVyLmJpdF93aWR0aCAvIDgpOworCQlpZiAoIXBjY19kb29yYmVsbF9hY2tfdmFkZHJbaWRdKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBpb3JlbWFwIFBDQyBBQ0sgcmVnaXN0ZXJcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKiBhY3BpX3BjY19wcm9iZSAtIFBhcnNlIHRoZSBBQ1BJIHRyZWUgZm9yIHRoZSBQQ0NULgogICoKICAqIFJldHVybjogMCBmb3IgU3VjY2VzcywgZWxzZSBlcnJuby4KQEAgLTMxNiw3ICs0NDksOSBAQAogCWFjcGlfc2l6ZSBwY2N0X3RibF9oZWFkZXJfc2l6ZTsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnBjY3RfdGJsOwogCXN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqcGNjdF9lbnRyeTsKLQlpbnQgY291bnQsIGk7CisJc3RydWN0IGFjcGlfdGFibGVfcGNjdCAqYWNwaV9wY2N0X3RibDsKKwlpbnQgY291bnQsIGksIHJjOworCWludCBzdW0gPSAwOwogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCiAJLyogU2VhcmNoIGZvciBQQ0NUICovCkBAIC0zMzMsMzcgKzQ2OCw2NiBAQAogCQkJc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX3BjY3QpLAogCQkJQUNQSV9QQ0NUX1RZUEVfSFdfUkVEVUNFRF9TVUJTUEFDRSwKIAkJCXBhcnNlX3BjY19zdWJzcGFjZSwgTUFYX1BDQ19TVUJTUEFDRVMpOworCXN1bSArPSAoY291bnQgPiAwKSA/IGNvdW50IDogMDsKIAotCWlmIChjb3VudCA8PSAwKSB7CisJY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlX2VudHJpZXMoQUNQSV9TSUdfUENDVCwKKwkJCXNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9wY2N0KSwKKwkJCUFDUElfUENDVF9UWVBFX0hXX1JFRFVDRURfU1VCU1BBQ0VfVFlQRTIsCisJCQlwYXJzZV9wY2Nfc3Vic3BhY2UsIE1BWF9QQ0NfU1VCU1BBQ0VTKTsKKwlzdW0gKz0gKGNvdW50ID4gMCkgPyBjb3VudCA6IDA7CisKKwlpZiAoc3VtID09IDAgfHwgc3VtID49IE1BWF9QQ0NfU1VCU1BBQ0VTKSB7CiAJCXByX2VycigiRXJyb3IgcGFyc2luZyBQQ0Mgc3Vic3BhY2VzIGZyb20gUENDVFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXBjY19tYm94X2NoYW5uZWxzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1ib3hfY2hhbikgKgotCQkJY291bnQsIEdGUF9LRVJORUwpOwotCisJCQlzdW0sIEdGUF9LRVJORUwpOwogCWlmICghcGNjX21ib3hfY2hhbm5lbHMpIHsKIAkJcHJfZXJyKCJDb3VsZCBub3QgYWxsb2NhdGUgc3BhY2UgZm9yIFBDQyBtYm94IGNoYW5uZWxzXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcGNjX2Rvb3JiZWxsX3ZhZGRyID0ga2NhbGxvYyhjb3VudCwgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpOworCXBjY19kb29yYmVsbF92YWRkciA9IGtjYWxsb2Moc3VtLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwY2NfZG9vcmJlbGxfdmFkZHIpIHsKLQkJa2ZyZWUocGNjX21ib3hfY2hhbm5lbHMpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX21ib3g7CisJfQorCisJcGNjX2Rvb3JiZWxsX2Fja192YWRkciA9IGtjYWxsb2Moc3VtLCBzaXplb2Yodm9pZCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY2NfZG9vcmJlbGxfYWNrX3ZhZGRyKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9kYl92YWRkcjsKKwl9CisKKwlwY2NfZG9vcmJlbGxfaXJxID0ga2NhbGxvYyhzdW0sIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjY19kb29yYmVsbF9pcnEpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX2RiX2Fja192YWRkcjsKIAl9CiAKIAkvKiBQb2ludCB0byB0aGUgZmlyc3QgUENDIHN1YnNwYWNlIGVudHJ5ICovCiAJcGNjdF9lbnRyeSA9IChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKikgKAogCQkodW5zaWduZWQgbG9uZykgcGNjdF90YmwgKyBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfcGNjdCkpOwogCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwlhY3BpX3BjY3RfdGJsID0gKHN0cnVjdCBhY3BpX3RhYmxlX3BjY3QgKikgcGNjdF90Ymw7CisJaWYgKGFjcGlfcGNjdF90YmwtPmZsYWdzICYgQUNQSV9QQ0NUX0RPT1JCRUxMKQorCQlwY2NfbWJveF9jdHJsLnR4ZG9uZV9pcnEgPSB0cnVlOworCisJZm9yIChpID0gMDsgaSA8IHN1bTsgaSsrKSB7CiAJCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyAqZGJfcmVnOwogCQlzdHJ1Y3QgYWNwaV9wY2N0X2h3X3JlZHVjZWQgKnBjY3Rfc3M7CiAJCXBjY19tYm94X2NoYW5uZWxzW2ldLmNvbl9wcml2ID0gcGNjdF9lbnRyeTsKIAorCQlwY2N0X3NzID0gKHN0cnVjdCBhY3BpX3BjY3RfaHdfcmVkdWNlZCAqKSBwY2N0X2VudHJ5OworCisJCWlmIChwY2NfbWJveF9jdHJsLnR4ZG9uZV9pcnEpIHsKKwkJCXJjID0gcGNjX3BhcnNlX3N1YnNwYWNlX2lycShpLCBwY2N0X3NzKTsKKwkJCWlmIChyYyA8IDApCisJCQkJZ290byBlcnI7CisJCX0KKwogCQkvKiBJZiBkb29yYmVsbCBpcyBpbiBzeXN0ZW0gbWVtb3J5IGNhY2hlIHRoZSB2aXJ0IGFkZHJlc3MgKi8KLQkJcGNjdF9zcyA9IChzdHJ1Y3QgYWNwaV9wY2N0X2h3X3JlZHVjZWQgKilwY2N0X2VudHJ5OwogCQlkYl9yZWcgPSAmcGNjdF9zcy0+ZG9vcmJlbGxfcmVnaXN0ZXI7CiAJCWlmIChkYl9yZWctPnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpCiAJCQlwY2NfZG9vcmJlbGxfdmFkZHJbaV0gPSBhY3BpX29zX2lvcmVtYXAoZGJfcmVnLT5hZGRyZXNzLApAQCAtMzcyLDExICs1MzYsMjEgQEAKIAkJCSgodW5zaWduZWQgbG9uZykgcGNjdF9lbnRyeSArIHBjY3RfZW50cnktPmxlbmd0aCk7CiAJfQogCi0JcGNjX21ib3hfY3RybC5udW1fY2hhbnMgPSBjb3VudDsKKwlwY2NfbWJveF9jdHJsLm51bV9jaGFucyA9IHN1bTsKIAogCXByX2luZm8oIkRldGVjdGVkICVkIFBDQyBTdWJzcGFjZXNcbiIsIHBjY19tYm94X2N0cmwubnVtX2NoYW5zKTsKIAogCXJldHVybiAwOworCitlcnI6CisJa2ZyZWUocGNjX2Rvb3JiZWxsX2lycSk7CitlcnJfZnJlZV9kYl9hY2tfdmFkZHI6CisJa2ZyZWUocGNjX2Rvb3JiZWxsX2Fja192YWRkcik7CitlcnJfZnJlZV9kYl92YWRkcjoKKwlrZnJlZShwY2NfZG9vcmJlbGxfdmFkZHIpOworZXJyX2ZyZWVfbWJveDoKKwlrZnJlZShwY2NfbWJveF9jaGFubmVscyk7CisJcmV0dXJuIHJjOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFpbGJveC9wbGF0Zm9ybV9taHUuYyBiL2RyaXZlcnMvbWFpbGJveC9wbGF0Zm9ybV9taHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTMyMDFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tYWlsYm94L3BsYXRmb3JtX21odS5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEJheUxpYnJlIFNBUy4KKyAqIEF1dGhvcjogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICogU3luY2hyb25pc2VkIHdpdGggYXJtX21odS5jIGZyb20gOgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTUgRnVqaXRzdSBTZW1pY29uZHVjdG9yIEx0ZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBMaW5hcm8gTHRkLgorICogQXV0aG9yOiBKYXNzaSBCcmFyIDxqYXN3aW5kZXIuc2luZ2hAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWlsYm94X2NvbnRyb2xsZXIuaD4KKworI2RlZmluZSBJTlRSX1NFVF9PRlMJMHgwCisjZGVmaW5lIElOVFJfU1RBVF9PRlMJMHg0CisjZGVmaW5lIElOVFJfQ0xSX09GUwkweDgKKworI2RlZmluZSBNSFVfU0VDX09GRlNFVAkweDAKKyNkZWZpbmUgTUhVX0xQX09GRlNFVAkweGMKKyNkZWZpbmUgTUhVX0hQX09GRlNFVAkweDE4CisjZGVmaW5lIFRYX1JFR19PRkZTRVQJMHgyNAorCisjZGVmaW5lIE1IVV9DSEFOUwkzCisKK3N0cnVjdCBwbGF0Zm9ybV9taHVfbGluayB7CisJaW50IGlycTsKKwl2b2lkIF9faW9tZW0gKnR4X3JlZzsKKwl2b2lkIF9faW9tZW0gKnJ4X3JlZzsKK307CisKK3N0cnVjdCBwbGF0Zm9ybV9taHUgeworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fbWh1X2xpbmsgbWxpbmtbTUhVX0NIQU5TXTsKKwlzdHJ1Y3QgbWJveF9jaGFuIGNoYW5bTUhVX0NIQU5TXTsKKwlzdHJ1Y3QgbWJveF9jb250cm9sbGVyIG1ib3g7Cit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgcGxhdGZvcm1fbWh1X3J4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpwKQoreworCXN0cnVjdCBtYm94X2NoYW4gKmNoYW4gPSBwOworCXN0cnVjdCBwbGF0Zm9ybV9taHVfbGluayAqbWxpbmsgPSBjaGFuLT5jb25fcHJpdjsKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGxfcmVsYXhlZChtbGluay0+cnhfcmVnICsgSU5UUl9TVEFUX09GUyk7CisJaWYgKCF2YWwpCisJCXJldHVybiBJUlFfTk9ORTsKKworCW1ib3hfY2hhbl9yZWNlaXZlZF9kYXRhKGNoYW4sICh2b2lkICopJnZhbCk7CisKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIG1saW5rLT5yeF9yZWcgKyBJTlRSX0NMUl9PRlMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgYm9vbCBwbGF0Zm9ybV9taHVfbGFzdF90eF9kb25lKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4pCit7CisJc3RydWN0IHBsYXRmb3JtX21odV9saW5rICptbGluayA9IGNoYW4tPmNvbl9wcml2OworCXUzMiB2YWwgPSByZWFkbF9yZWxheGVkKG1saW5rLT50eF9yZWcgKyBJTlRSX1NUQVRfT0ZTKTsKKworCXJldHVybiAodmFsID09IDApOworfQorCitzdGF0aWMgaW50IHBsYXRmb3JtX21odV9zZW5kX2RhdGEoc3RydWN0IG1ib3hfY2hhbiAqY2hhbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fbWh1X2xpbmsgKm1saW5rID0gY2hhbi0+Y29uX3ByaXY7CisJdTMyICphcmcgPSBkYXRhOworCisJd3JpdGVsX3JlbGF4ZWQoKmFyZywgbWxpbmstPnR4X3JlZyArIElOVFJfU0VUX09GUyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbGF0Zm9ybV9taHVfc3RhcnR1cChzdHJ1Y3QgbWJveF9jaGFuICpjaGFuKQoreworCXN0cnVjdCBwbGF0Zm9ybV9taHVfbGluayAqbWxpbmsgPSBjaGFuLT5jb25fcHJpdjsKKwl1MzIgdmFsOworCWludCByZXQ7CisKKwl2YWwgPSByZWFkbF9yZWxheGVkKG1saW5rLT50eF9yZWcgKyBJTlRSX1NUQVRfT0ZTKTsKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIG1saW5rLT50eF9yZWcgKyBJTlRSX0NMUl9PRlMpOworCisJcmV0ID0gcmVxdWVzdF9pcnEobWxpbmstPmlycSwgcGxhdGZvcm1fbWh1X3J4X2ludGVycnVwdCwKKwkJCSAgSVJRRl9TSEFSRUQsICJwbGF0Zm9ybV9taHVfbGluayIsIGNoYW4pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjaGFuLT5tYm94LT5kZXYsCisJCQkiVW5hYmxlIHRvIGFjcXVpcmUgSVJRICVkXG4iLCBtbGluay0+aXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGxhdGZvcm1fbWh1X3NodXRkb3duKHN0cnVjdCBtYm94X2NoYW4gKmNoYW4pCit7CisJc3RydWN0IHBsYXRmb3JtX21odV9saW5rICptbGluayA9IGNoYW4tPmNvbl9wcml2OworCisJZnJlZV9pcnEobWxpbmstPmlycSwgY2hhbik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWJveF9jaGFuX29wcyBwbGF0Zm9ybV9taHVfb3BzID0geworCS5zZW5kX2RhdGEgPSBwbGF0Zm9ybV9taHVfc2VuZF9kYXRhLAorCS5zdGFydHVwID0gcGxhdGZvcm1fbWh1X3N0YXJ0dXAsCisJLnNodXRkb3duID0gcGxhdGZvcm1fbWh1X3NodXRkb3duLAorCS5sYXN0X3R4X2RvbmUgPSBwbGF0Zm9ybV9taHVfbGFzdF90eF9kb25lLAorfTsKKworc3RhdGljIGludCBwbGF0Zm9ybV9taHVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaSwgZXJyOworCXN0cnVjdCBwbGF0Zm9ybV9taHUgKm1odTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBwbGF0Zm9ybV9taHVfcmVnW01IVV9DSEFOU10gPSB7CisJCU1IVV9TRUNfT0ZGU0VULCBNSFVfTFBfT0ZGU0VULCBNSFVfSFBfT0ZGU0VUCisJfTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlICovCisJbWh1ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCptaHUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1odSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCW1odS0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CisJaWYgKElTX0VSUihtaHUtPmJhc2UpKSB7CisJCWRldl9lcnIoZGV2LCAiaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihtaHUtPmJhc2UpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNSFVfQ0hBTlM7IGkrKykgeworCQltaHUtPmNoYW5baV0uY29uX3ByaXYgPSAmbWh1LT5tbGlua1tpXTsKKwkJbWh1LT5tbGlua1tpXS5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOworCQlpZiAobWh1LT5tbGlua1tpXS5pcnEgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgaXJxJWRcbiIsIGkpOworCQkJcmV0dXJuIG1odS0+bWxpbmtbaV0uaXJxOworCQl9CisJCW1odS0+bWxpbmtbaV0ucnhfcmVnID0gbWh1LT5iYXNlICsgcGxhdGZvcm1fbWh1X3JlZ1tpXTsKKwkJbWh1LT5tbGlua1tpXS50eF9yZWcgPSBtaHUtPm1saW5rW2ldLnJ4X3JlZyArIFRYX1JFR19PRkZTRVQ7CisJfQorCisJbWh1LT5tYm94LmRldiA9IGRldjsKKwltaHUtPm1ib3guY2hhbnMgPSAmbWh1LT5jaGFuWzBdOworCW1odS0+bWJveC5udW1fY2hhbnMgPSBNSFVfQ0hBTlM7CisJbWh1LT5tYm94Lm9wcyA9ICZwbGF0Zm9ybV9taHVfb3BzOworCW1odS0+bWJveC50eGRvbmVfaXJxID0gZmFsc2U7CisJbWh1LT5tYm94LnR4ZG9uZV9wb2xsID0gdHJ1ZTsKKwltaHUtPm1ib3gudHhwb2xsX3BlcmlvZCA9IDE7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtaHUpOworCisJZXJyID0gbWJveF9jb250cm9sbGVyX3JlZ2lzdGVyKCZtaHUtPm1ib3gpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgbWFpbGJveGVzICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWRldl9pbmZvKGRldiwgIlBsYXRmb3JtIE1IVSBNYWlsYm94IHJlZ2lzdGVyZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBsYXRmb3JtX21odV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fbWh1ICptaHUgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW1ib3hfY29udHJvbGxlcl91bnJlZ2lzdGVyKCZtaHUtPm1ib3gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBsYXRmb3JtX21odV9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFtbG9naWMsbWVzb24tZ3hiYi1taHUiLCB9LAorCXsgLyogc2VudGluZWwgKi8gfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBwbGF0Zm9ybV9taHVfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcGxhdGZvcm1fbWh1X2RyaXZlciA9IHsKKwkucHJvYmUJPSBwbGF0Zm9ybV9taHVfcHJvYmUsCisJLnJlbW92ZQk9IHBsYXRmb3JtX21odV9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicGxhdGZvcm0tbWh1IiwKKwkJLm9mX21hdGNoX3RhYmxlCT0gcGxhdGZvcm1fbWh1X2R0X2lkcywKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihwbGF0Zm9ybV9taHVfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpwbGF0Zm9ybS1taHUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUGxhdGZvcm0gTUhVIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvS2NvbmZpZyBiL2RyaXZlcnMvbWNiL0tjb25maWcKaW5kZXggZTlhNjk3Ni4uNzZkOWM1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tY2IvS2NvbmZpZworKysgYi9kcml2ZXJzL21jYi9LY29uZmlnCkBAIC0yOCw0ICsyOCwxMyBAQAogCiAJICAgSWYgYnVpbGQgYXMgYSBtb2R1bGUsIHRoZSBtb2R1bGUgaXMgY2FsbGVkIG1jYi1wY2kua28KIAorY29uZmlnIE1DQl9MUEMKKwkgICB0cmlzdGF0ZSAiTFBDIChub24gUENJKSBiYXNlZCBNQ0IgY2FycmllciIKKwkgICBkZWZhdWx0IG4KKwkgICBoZWxwCisKKwkgICBUaGlzIGlzIGEgTUNCIGNhcnJpZXIgb24gYSBMUEMgb3Igbm9uIFBDSSBkZXZpY2UuCisKKwkgICBJZiBidWlsZCBhcyBhIG1vZHVsZSwgdGhlIG1vZHVsZSBpcyBjYWxsZWQgbWNiLWxwYy5rbworCiBlbmRpZiAjIE1DQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvTWFrZWZpbGUgYi9kcml2ZXJzL21jYi9NYWtlZmlsZQppbmRleCAxYWUxNDEzLi5iY2M3NzQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21jYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21jYi9NYWtlZmlsZQpAQCAtNSwzICs1LDQgQEAKIG1jYi15ICs9IG1jYi1wYXJzZS5vCiAKIG9iai0kKENPTkZJR19NQ0JfUENJKSArPSBtY2ItcGNpLm8KK29iai0kKENPTkZJR19NQ0JfTFBDKSArPSBtY2ItbHBjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL21jYi1jb3JlLmMgYi9kcml2ZXJzL21jYi9tY2ItY29yZS5jCmluZGV4IDZmMmM4NTIuLjkyMWE1ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWNiL21jYi1jb3JlLmMKKysrIGIvZHJpdmVycy9tY2IvbWNiLWNvcmUuYwpAQCAtMjMzLDYgKzIzMyw3IEBACiAJZGV2LT5kZXYuYnVzID0gJm1jYl9idXNfdHlwZTsKIAlkZXYtPmRldi5wYXJlbnQgPSBidXMtPmRldi5wYXJlbnQ7CiAJZGV2LT5kZXYucmVsZWFzZSA9IG1jYl9yZWxlYXNlX2RldjsKKwlkZXYtPmRtYV9kZXYgPSBidXMtPmNhcnJpZXI7CiAKIAlkZXZpY2VfaWQgPSBkZXYtPmlkOwogCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICJtY2IlZC0xNnolMDNkLSVkOiVkOiVkIiwKQEAgLTM2OSw3ICszNzAsNiBAQAogCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKIAotCUlOSVRfTElTVF9IRUFEKCZkZXYtPmJ1c19saXN0KTsKIAlkZXYtPmJ1cyA9IGJ1czsKIAogCXJldHVybiBkZXY7CkBAIC00MDUsMjAgKzQwNSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19tY2JfYnVzX2FkZF9jaGlsZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG1jYl9kZXZpY2UgKm1kZXYgPSB0b19tY2JfZGV2aWNlKGRldik7Ci0Jc3RydWN0IG1jYl9idXMgKmNoaWxkOwotCi0JQlVHX09OKCFtZGV2LT5pc19hZGRlZCk7Ci0JY2hpbGQgPSBtZGV2LT5zdWJvcmRpbmF0ZTsKLQotCWlmIChjaGlsZCkKLQkJbWNiX2J1c19hZGRfZGV2aWNlcyhjaGlsZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyoqCiAgKiBtY2JfYnVzX2FkZF9kZXZpY2VzKCkgLSBBZGQgZGV2aWNlcyBpbiB0aGUgYnVzJyBpbnRlcm5hbCBkZXZpY2UgbGlzdAogICogQGJ1czogVGhlIEBtY2JfYnVzIHdlIGFkZCB0aGUgZGV2aWNlcwpAQCAtNDI4LDggKzQxNCw2IEBACiB2b2lkIG1jYl9idXNfYWRkX2RldmljZXMoY29uc3Qgc3RydWN0IG1jYl9idXMgKmJ1cykKIHsKIAlidXNfZm9yX2VhY2hfZGV2KCZtY2JfYnVzX3R5cGUsIE5VTEwsIE5VTEwsIF9fbWNiX2J1c19hZGRfZGV2aWNlcyk7Ci0JYnVzX2Zvcl9lYWNoX2RldigmbWNiX2J1c190eXBlLCBOVUxMLCBOVUxMLCBfX21jYl9idXNfYWRkX2NoaWxkKTsKLQogfQogRVhQT1JUX1NZTUJPTF9HUEwobWNiX2J1c19hZGRfZGV2aWNlcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL21jYi1pbnRlcm5hbC5oIGIvZHJpdmVycy9tY2IvbWNiLWludGVybmFsLmgKaW5kZXggNTI1NGUwMi4uZDZlNjkzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tY2IvbWNiLWludGVybmFsLmgKKysrIGIvZHJpdmVycy9tY2IvbWNiLWludGVybmFsLmgKQEAgLTExMiw2ICsxMTIsMTUgQEAKIAl1MzIgc2l6ZTsKIH0gX19wYWNrZWQ7CiAKK3N0cnVjdCBjaGFtZWxlb25fYmFyIHsKKwl1MzIgYWRkcjsKKwl1MzIgc2l6ZTsKK307CisKKyNkZWZpbmUgQkFSX0NOVCh4KSAoKHgpICYgMHgwNykKKyNkZWZpbmUgQ0hBTUVMRU9OX0JBUl9NQVgJNgorI2RlZmluZSBCQVJfREVTQ19TSVpFKHgpCSgoeCkgKiBzaXplb2Yoc3RydWN0IGNoYW1lbGVvbl9iYXIpICsgc2l6ZW9mKF9fbGUzMikpCisKIGludCBjaGFtZWxlb25fcGFyc2VfY2VsbHMoc3RydWN0IG1jYl9idXMgKmJ1cywgcGh5c19hZGRyX3QgbWFwYmFzZSwKIAkJCSAgdm9pZCBfX2lvbWVtICpiYXNlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvbWNiLWxwYy5jIGIvZHJpdmVycy9tY2IvbWNiLWxwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzJjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21jYi9tY2ItbHBjLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBNRU4gQ2hhbWVsZW9uIEJ1cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgTUVOIE1pa3JvZWxla3Ryb25payBHbWJIICh3d3cubWVuLmRlKQorICogQXV0aG9yOiBBbmRyZWFzIFdlcm5lciA8YW5kcmVhcy53ZXJuZXJAbWVuLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tY2IuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgIm1jYi1pbnRlcm5hbC5oIgorCitzdHJ1Y3QgcHJpdiB7CisJc3RydWN0IG1jYl9idXMgKmJ1czsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKwl2b2lkIF9faW9tZW0gKmJhc2U7Cit9OworCitzdGF0aWMgaW50IG1jYl9scGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcHJpdiAqcHJpdjsKKwlpbnQgcmV0ID0gMDsKKworCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPm1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFwcml2LT5tZW0pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gTWVtb3J5IHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVzID0gZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgcHJpdi0+bWVtLT5zdGFydCwKKwkJCQkgICAgICByZXNvdXJjZV9zaXplKHByaXYtPm1lbSksCisJCQkJICAgICAgS0JVSUxEX01PRE5BTUUpOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElPIG1lbW9yeVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcHJpdi0+YmFzZSA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCBwcml2LT5tZW0tPnN0YXJ0LAorCQkJCSAgcmVzb3VyY2Vfc2l6ZShwcml2LT5tZW0pKTsKKwlpZiAoIXByaXYtPmJhc2UpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGlvcmVtYXBcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKKworCXByaXYtPmJ1cyA9IG1jYl9hbGxvY19idXMoJnBkZXYtPmRldik7CisJaWYgKElTX0VSUihwcml2LT5idXMpKQorCQlyZXR1cm4gUFRSX0VSUihwcml2LT5idXMpOworCisJcmV0ID0gY2hhbWVsZW9uX3BhcnNlX2NlbGxzKHByaXYtPmJ1cywgcHJpdi0+bWVtLT5zdGFydCwgcHJpdi0+YmFzZSk7CisJaWYgKHJldCA8IDApIHsKKwkJbWNiX3JlbGVhc2VfYnVzKHByaXYtPmJ1cyk7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiRm91bmQgJWQgY2VsbHNcbiIsIHJldCk7CisKKwltY2JfYnVzX2FkZF9kZXZpY2VzKHByaXYtPmJ1cyk7CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IG1jYl9scGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW1jYl9yZWxlYXNlX2J1cyhwcml2LT5idXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptY2JfbHBjX3BkZXY7CisKK3N0YXRpYyBpbnQgbWNiX2xwY19jcmVhdGVfcGxhdGZvcm1fZGV2aWNlKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICppZCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGlkLT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OworCisJbWNiX2xwY19wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJtY2ItbHBjIiwgLTEpOworCWlmICghbWNiX2xwY19wZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKG1jYl9scGNfcGRldiwgcmVzLCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9wdXQ7CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKG1jYl9scGNfcGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcHV0OworCisJcmV0dXJuIDA7CisKK291dF9wdXQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChtY2JfbHBjX3BkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2MyNF9mcGdhX3Jlc291cmNlID0geworCS5zdGFydCA9IDB4ZTAwMGUwMDAsCisJLmVuZCA9IDB4ZTAwMGUwMDAgKyBDSEFNX0hFQURFUl9TSVpFLAorCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWNiX2xwY19kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lID0gIm1jYi1scGMiLAorCX0sCisJLnByb2JlCQk9IG1jYl9scGNfcHJvYmUsCisJLnJlbW92ZQkJPSBtY2JfbHBjX3JlbW92ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBtY2JfbHBjX2RtaV90YWJsZVtdID0geworCXsKKwkJLmlkZW50ID0gIlNDMjQiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIk1FTiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX1ZFUlNJT04sICIxNFNDMjQiKSwKKwkJfSwKKwkJLmRyaXZlcl9kYXRhID0gKHZvaWQgKikmc2MyNF9mcGdhX3Jlc291cmNlLAorCQkuY2FsbGJhY2sgPSBtY2JfbHBjX2NyZWF0ZV9wbGF0Zm9ybV9kZXZpY2UsCisJfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZG1pLCBtY2JfbHBjX2RtaV90YWJsZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IG1jYl9scGNfaW5pdCh2b2lkKQoreworCWlmICghZG1pX2NoZWNrX3N5c3RlbShtY2JfbHBjX2RtaV90YWJsZSkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbWNiX2xwY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbWNiX2xwY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobWNiX2xwY19wZGV2KTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbWNiX2xwY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChtY2JfbHBjX2luaXQpOworbW9kdWxlX2V4aXQobWNiX2xwY19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kcmVhcyBXZXJuZXIgPGFuZHJlYXMud2VybmVyQG1lbi5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUNCIG92ZXIgTFBDIHN1cHBvcnQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWNiL21jYi1wYXJzZS5jIGIvZHJpdmVycy9tY2IvbWNiLXBhcnNlLmMKaW5kZXggZGJlY2JlZC4uNGNhMjczOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tY2IvbWNiLXBhcnNlLmMKKysrIGIvZHJpdmVycy9tY2IvbWNiLXBhcnNlLmMKQEAgLTI2LDE5ICsyNiwyMCBAQAogfQogCiBzdGF0aWMgaW50IGNoYW1lbGVvbl9wYXJzZV9iZGQoc3RydWN0IG1jYl9idXMgKmJ1cywKLQkJCXBoeXNfYWRkcl90IG1hcGJhc2UsCisJCQlzdHJ1Y3QgY2hhbWVsZW9uX2JhciAqY2IsCiAJCQl2b2lkIF9faW9tZW0gKmJhc2UpCiB7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY2hhbWVsZW9uX3BhcnNlX2dkZChzdHJ1Y3QgbWNiX2J1cyAqYnVzLAotCQkJcGh5c19hZGRyX3QgbWFwYmFzZSwKLQkJCXZvaWQgX19pb21lbSAqYmFzZSkKKwkJCXN0cnVjdCBjaGFtZWxlb25fYmFyICpjYiwKKwkJCXZvaWQgX19pb21lbSAqYmFzZSwgaW50IGJhcl9jb3VudCkKIHsKIAlzdHJ1Y3QgY2hhbWVsZW9uX2dkZCBfX2lvbWVtICpnZGQgPQogCQkoc3RydWN0IGNoYW1lbGVvbl9nZGQgX19pb21lbSAqKSBiYXNlOwogCXN0cnVjdCBtY2JfZGV2aWNlICptZGV2OworCXUzMiBkZXZfbWFwYmFzZTsKIAl1MzIgb2Zmc2V0OwogCXUzMiBzaXplOwogCWludCByZXQ7CkBAIC02MSwxMyArNjIsMzkgQEAKIAltZGV2LT5ncm91cCA9IEdERF9HUlAocmVnMik7CiAJbWRldi0+aW5zdCA9IEdERF9JTlMocmVnMik7CiAKKwkvKgorCSAqIElmIHRoZSBCQVIgaXMgbWlzc2luZywgZGV2X21hcGJhc2UgaXMgemVybywgb3IgaWYgdGhlCisJICogZGV2aWNlIGlzIElPIG1hcHBlZCB3ZSBqdXN0IHByaW50IGEgd2FybmluZyBhbmQgZ28gb24gd2l0aCB0aGUKKwkgKiBuZXh0IGRldmljZSwgaW5zdGVhZCBvZiBjb21wbGV0ZWx5IHN0b3AgdGhlIGdkZCBwYXJzZXIKKwkgKi8KKwlpZiAobWRldi0+YmFyID4gYmFyX2NvdW50IC0gMSkgeworCQlwcl9pbmZvKCJObyBCQVIgZm9yIDE2eiUwM2RcbiIsIG1kZXYtPmlkKTsKKwkJcmV0ID0gMDsKKwkJZ290byBlcnI7CisJfQorCisJZGV2X21hcGJhc2UgPSBjYlttZGV2LT5iYXJdLmFkZHI7CisJaWYgKCFkZXZfbWFwYmFzZSkgeworCQlwcl9pbmZvKCJCQVIgbm90IGFzc2lnbmVkIGZvciAxNnolMDNkXG4iLCBtZGV2LT5pZCk7CisJCXJldCA9IDA7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChkZXZfbWFwYmFzZSAmIDB4MDEpIHsKKwkJcHJfaW5mbygiSU8gbWFwcGVkIERldmljZSAoMTZ6JTAzZCkgbm90IHlldCBzdXBwb3J0ZWRcbiIsCisJCQltZGV2LT5pZCk7CisJCXJldCA9IDA7CisJCWdvdG8gZXJyOworCX0KKwogCXByX2RlYnVnKCJGb3VuZCBhIDE2eiUwM2RcbiIsIG1kZXYtPmlkKTsKIAogCW1kZXYtPmlycS5zdGFydCA9IEdERF9JUlEocmVnMSk7CiAJbWRldi0+aXJxLmVuZCA9IEdERF9JUlEocmVnMSk7CiAJbWRldi0+aXJxLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CiAKLQltZGV2LT5tZW0uc3RhcnQgPSBtYXBiYXNlICsgb2Zmc2V0OworCW1kZXYtPm1lbS5zdGFydCA9IGRldl9tYXBiYXNlICsgb2Zmc2V0OworCiAJbWRldi0+bWVtLmVuZCA9IG1kZXYtPm1lbS5zdGFydCArIHNpemUgLSAxOwogCW1kZXYtPm1lbS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOwogCkBAIC04NSwxMyArMTEyLDc2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgY2hhbWVsZW9uX3BhcnNlX2Jhcih2b2lkIF9faW9tZW0gKmJhc2UsCisJCQkJc3RydWN0IGNoYW1lbGVvbl9iYXIgKmNiLCBpbnQgYmFyX2NvdW50KQoreworCWNoYXIgX19pb21lbSAqcCA9IGJhc2U7CisJaW50IGk7CisKKwkvKiBza2lwIHJlZzEgKi8KKwlwICs9IHNpemVvZihfX2xlMzIpOworCisJZm9yIChpID0gMDsgaSA8IGJhcl9jb3VudDsgaSsrKSB7CisJCWNiW2ldLmFkZHIgPSByZWFkbChwKTsKKwkJY2JbaV0uc2l6ZSA9IHJlYWRsKHAgKyA0KTsKKworCQlwICs9IHNpemVvZihzdHJ1Y3QgY2hhbWVsZW9uX2Jhcik7CisJfQorfQorCitzdGF0aWMgaW50IGNoYW1lbGVvbl9nZXRfYmFyKGNoYXIgX19pb21lbSAqKmJhc2UsIHBoeXNfYWRkcl90IG1hcGJhc2UsCisJCQkgICAgIHN0cnVjdCBjaGFtZWxlb25fYmFyICoqY2IpCit7CisJc3RydWN0IGNoYW1lbGVvbl9iYXIgKmM7CisJaW50IGJhcl9jb3VudDsKKwlfX2xlMzIgcmVnOworCXUzMiBkdHlwZTsKKworCS8qCisJICogRm9yIHRob3NlIGRldmljZXMgd2hpY2ggYXJlIG5vdCBjb25uZWN0ZWQKKwkgKiB0byB0aGUgUENJIEJ1cyAoZS5nLiBMUEMpIHRoZXJlIGlzIGEgYmFyCisJICogZGVzY3JpcHRvciBsb2NhdGVkIGRpcmVjdGx5IGFmdGVyIHRoZQorCSAqIGNoYW1lbGVvbiBoZWFkZXIuIFRoaXMgaGVhZGVyIGlzIGNvbXBhcmFibGUKKwkgKiB0byBhIFBDSSBoZWFkZXIuCisJICovCisJZHR5cGUgPSBnZXRfbmV4dF9kdHlwZSgqYmFzZSk7CisJaWYgKGR0eXBlID09IENIQU1FTEVPTl9EVFlQRV9CQVIpIHsKKwkJcmVnID0gcmVhZGwoKmJhc2UpOworCisJCWJhcl9jb3VudCA9IEJBUl9DTlQocmVnKTsKKwkJaWYgKGJhcl9jb3VudCA8PSAwICYmIGJhcl9jb3VudCA+IENIQU1FTEVPTl9CQVJfTUFYKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJYyA9IGtjYWxsb2MoYmFyX2NvdW50LCBzaXplb2Yoc3RydWN0IGNoYW1lbGVvbl9iYXIpLAorCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWMpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQljaGFtZWxlb25fcGFyc2VfYmFyKCpiYXNlLCBjLCBiYXJfY291bnQpOworCQkqYmFzZSArPSBCQVJfREVTQ19TSVpFKGJhcl9jb3VudCk7CisJfSBlbHNlIHsKKwkJYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFtZWxlb25fYmFyKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWJhcl9jb3VudCA9IDE7CisJCWMtPmFkZHIgPSBtYXBiYXNlOworCX0KKworCSpjYiA9IGM7CisKKwlyZXR1cm4gYmFyX2NvdW50OworfQorCiBpbnQgY2hhbWVsZW9uX3BhcnNlX2NlbGxzKHN0cnVjdCBtY2JfYnVzICpidXMsIHBoeXNfYWRkcl90IG1hcGJhc2UsCiAJCQl2b2lkIF9faW9tZW0gKmJhc2UpCiB7Ci0JY2hhciBfX2lvbWVtICpwID0gYmFzZTsKIAlzdHJ1Y3QgY2hhbWVsZW9uX2ZwZ2FfaGVhZGVyICpoZWFkZXI7Ci0JdWludDMyX3QgZHR5cGU7CisJc3RydWN0IGNoYW1lbGVvbl9iYXIgKmNiOworCWNoYXIgX19pb21lbSAqcCA9IGJhc2U7CiAJaW50IG51bV9jZWxscyA9IDA7CisJdWludDMyX3QgZHR5cGU7CisJaW50IGJhcl9jb3VudDsKIAlpbnQgcmV0ID0gMDsKIAl1MzIgaHNpemU7CiAKQEAgLTEwOCw4ICsxOTgsOCBAQAogCWlmIChoZWFkZXItPm1hZ2ljICE9IENIQU1FTEVPTlYyX01BR0lDKSB7CiAJCXByX2VycigiVW5zdXBwb3J0ZWQgY2hhbWVsZW9uIHZlcnNpb24gMHgleFxuIiwKIAkJCQloZWFkZXItPm1hZ2ljKTsKLQkJa2ZyZWUoaGVhZGVyKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9oZWFkZXI7CiAJfQogCXAgKz0gaHNpemU7CiAKQEAgLTExOSwxNiArMjA5LDIwIEBACiAJc25wcmludGYoYnVzLT5uYW1lLCBDSEFNRUxFT05fRklMRU5BTUVfTEVOICsgMSwgIiVzIiwKIAkJIGhlYWRlci0+ZmlsZW5hbWUpOwogCisJYmFyX2NvdW50ID0gY2hhbWVsZW9uX2dldF9iYXIoJnAsIG1hcGJhc2UsICZjYik7CisJaWYgKGJhcl9jb3VudCA8IDApCisJCWdvdG8gZnJlZV9oZWFkZXI7CisKIAlmb3JfZWFjaF9jaGFtZWxlb25fY2VsbChkdHlwZSwgcCkgewogCQlzd2l0Y2ggKGR0eXBlKSB7CiAJCWNhc2UgQ0hBTUVMRU9OX0RUWVBFX0dFTkVSQUw6Ci0JCQlyZXQgPSBjaGFtZWxlb25fcGFyc2VfZ2RkKGJ1cywgbWFwYmFzZSwgcCk7CisJCQlyZXQgPSBjaGFtZWxlb25fcGFyc2VfZ2RkKGJ1cywgY2IsIHAsIGJhcl9jb3VudCk7CiAJCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIG91dDsKKwkJCQlnb3RvIGZyZWVfYmFyOwogCQkJcCArPSBzaXplb2Yoc3RydWN0IGNoYW1lbGVvbl9nZGQpOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0hBTUVMRU9OX0RUWVBFX0JSSURHRToKLQkJCWNoYW1lbGVvbl9wYXJzZV9iZGQoYnVzLCBtYXBiYXNlLCBwKTsKKwkJCWNoYW1lbGVvbl9wYXJzZV9iZGQoYnVzLCBjYiwgcCk7CiAJCQlwICs9IHNpemVvZihzdHJ1Y3QgY2hhbWVsZW9uX2JkZCk7CiAJCQlicmVhazsKIAkJY2FzZSBDSEFNRUxFT05fRFRZUEVfRU5EOgpAQCAtMTM2LDggKzIzMCw4IEBACiAJCWRlZmF1bHQ6CiAJCQlwcl9lcnIoIkludmFsaWQgY2hhbWVsZW9uIGRlc2NyaXB0b3IgdHlwZSAweCV4XG4iLAogCQkJCWR0eXBlKTsKLQkJCWtmcmVlKGhlYWRlcik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGZyZWVfYmFyOwogCQl9CiAJCW51bV9jZWxscysrOwogCX0KQEAgLTE0NSwxMSArMjM5LDE1IEBACiAJaWYgKG51bV9jZWxscyA9PSAwKQogCQludW1fY2VsbHMgPSAtRUlOVkFMOwogCisJa2ZyZWUoY2IpOwogCWtmcmVlKGhlYWRlcik7CiAJcmV0dXJuIG51bV9jZWxsczsKIAotb3V0OgorZnJlZV9iYXI6CisJa2ZyZWUoY2IpOworZnJlZV9oZWFkZXI6CiAJa2ZyZWUoaGVhZGVyKTsKKwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjaGFtZWxlb25fcGFyc2VfY2VsbHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tY2IvbWNiLXBjaS5jIGIvZHJpdmVycy9tY2IvbWNiLXBjaS5jCmluZGV4IGIxNWEwMzQuLmFmNGQyZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWNiL21jYi1wY2kuYworKysgYi9kcml2ZXJzL21jYi9tY2ItcGNpLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCiAJcHJpdi0+bWFwYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAlpZiAoIXByaXYtPm1hcGJhc2UpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9idHJlZS5jCmluZGV4IDc2Zjc1MzQuLjgxZDNkYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2J0cmVlLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvYnRyZWUuYwpAQCAtMzYxLDEyICszNjEsOCBAQAogc3RhdGljIHZvaWQgYnRyZWVfbm9kZV93cml0ZV9kb25lKHN0cnVjdCBjbG9zdXJlICpjbCkKIHsKIAlzdHJ1Y3QgYnRyZWUgKmIgPSBjb250YWluZXJfb2YoY2wsIHN0cnVjdCBidHJlZSwgaW8pOwotCXN0cnVjdCBiaW9fdmVjICpidjsKLQlpbnQgbjsKIAotCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidiwgYi0+YmlvLCBuKQotCQlfX2ZyZWVfcGFnZShidi0+YnZfcGFnZSk7Ci0KKwliaW9fZnJlZV9wYWdlcyhiLT5iaW8pOwogCV9fYnRyZWVfbm9kZV93cml0ZV9kb25lKGNsKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvZGVidWcuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2RlYnVnLmMKaW5kZXggYzI4ZGYxNjQuLjMzM2ExZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL2RlYnVnLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvZGVidWcuYwpAQCAtMTA3LDkgKzEwNyw4IEBACiB7CiAJY2hhciBuYW1lW0JERVZOQU1FX1NJWkVdOwogCXN0cnVjdCBiaW8gKmNoZWNrOwotCXN0cnVjdCBiaW9fdmVjIGJ2LCAqYnYyOworCXN0cnVjdCBiaW9fdmVjIGJ2OwogCXN0cnVjdCBidmVjX2l0ZXIgaXRlcjsKLQlpbnQgaTsKIAogCWNoZWNrID0gYmlvX2Nsb25lKGJpbywgR0ZQX05PSU8pOwogCWlmICghY2hlY2spCkBAIC0xMzYsOCArMTM1LDcgQEAKIAkJa3VubWFwX2F0b21pYyhwMSk7CiAJfQogCi0JYmlvX2Zvcl9lYWNoX3NlZ21lbnRfYWxsKGJ2MiwgY2hlY2ssIGkpCi0JCV9fZnJlZV9wYWdlKGJ2Mi0+YnZfcGFnZSk7CisJYmlvX2ZyZWVfcGFnZXMoY2hlY2spOwogb3V0X3B1dDoKIAliaW9fcHV0KGNoZWNrKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvYmNhY2hlL21vdmluZ2djLmMgYi9kcml2ZXJzL21kL2JjYWNoZS9tb3ZpbmdnYy5jCmluZGV4IDE4ODEzMTkuLjVjNGJkZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL21vdmluZ2djLmMKKysrIGIvZHJpdmVycy9tZC9iY2FjaGUvbW92aW5nZ2MuYwpAQCAtNDQsMTEgKzQ0LDggQEAKIHsKIAlzdHJ1Y3QgbW92aW5nX2lvICppbyA9IGNvbnRhaW5lcl9vZihjbCwgc3RydWN0IG1vdmluZ19pbywgY2wpOwogCXN0cnVjdCBiaW8gKmJpbyA9ICZpby0+YmlvLmJpbzsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7Ci0JaW50IGk7CiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudF9hbGwoYnYsIGJpbywgaSkKLQkJX19mcmVlX3BhZ2UoYnYtPmJ2X3BhZ2UpOworCWJpb19mcmVlX3BhZ2VzKGJpbyk7CiAKIAlpZiAoaW8tPm9wLnJlcGxhY2VfY29sbGlzaW9uKQogCQl0cmFjZV9iY2FjaGVfZ2NfY29weV9jb2xsaXNpb24oJmlvLT53LT5rZXkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5jIGIvZHJpdmVycy9tZC9iY2FjaGUvcmVxdWVzdC5jCmluZGV4IDRiMTc3ZmUuLjQwZmZlNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvYmNhY2hlL3JlcXVlc3QuYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS9yZXF1ZXN0LmMKQEAgLTY5NCwxMyArNjk0LDggQEAKIAlpZiAocy0+aW9wLnJlcGxhY2VfY29sbGlzaW9uKQogCQliY2hfbWFya19jYWNoZV9taXNzX2NvbGxpc2lvbihzLT5pb3AuYywgcy0+ZCk7CiAKLQlpZiAocy0+aW9wLmJpbykgewotCQlpbnQgaTsKLQkJc3RydWN0IGJpb192ZWMgKmJ2OwotCi0JCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidiwgcy0+aW9wLmJpbywgaSkKLQkJCV9fZnJlZV9wYWdlKGJ2LT5idl9wYWdlKTsKLQl9CisJaWYgKHMtPmlvcC5iaW8pCisJCWJpb19mcmVlX3BhZ2VzKHMtPmlvcC5iaW8pOwogCiAJY2FjaGVkX2Rldl9iaW9fY29tcGxldGUoY2wpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUvd3JpdGViYWNrLmMgYi9kcml2ZXJzL21kL2JjYWNoZS93cml0ZWJhY2suYwppbmRleCBkOWZkMmE2Li5lNTE2NDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2JjYWNoZS93cml0ZWJhY2suYworKysgYi9kcml2ZXJzL21kL2JjYWNoZS93cml0ZWJhY2suYwpAQCAtMTI4LDExICsxMjgsOCBAQAogCXN0cnVjdCBkaXJ0eV9pbyAqaW8gPSBjb250YWluZXJfb2YoY2wsIHN0cnVjdCBkaXJ0eV9pbywgY2wpOwogCXN0cnVjdCBrZXlidWZfa2V5ICp3ID0gaW8tPmJpby5iaV9wcml2YXRlOwogCXN0cnVjdCBjYWNoZWRfZGV2ICpkYyA9IGlvLT5kYzsKLQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7Ci0JaW50IGk7CiAKLQliaW9fZm9yX2VhY2hfc2VnbWVudF9hbGwoYnYsICZpby0+YmlvLCBpKQotCQlfX2ZyZWVfcGFnZShidi0+YnZfcGFnZSk7CisJYmlvX2ZyZWVfcGFnZXMoJmlvLT5iaW8pOwogCiAJLyogVGhpcyBpcyBraW5kIG9mIGEgZHVtYiB3YXkgb2Ygc2lnbmFsbGluZyBlcnJvcnMuICovCiAJaWYgKEtFWV9ESVJUWSgmdy0+a2V5KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggNmZmZjc5NC4uMmQ4MjY5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC0xOTAzLDEwICsxOTAzLDggQEAKIAlzdHJ1Y3QgYml0bWFwX2NvdW50cyAqY291bnRzOwogCXN0cnVjdCBiaXRtYXAgKmJpdG1hcCA9IGJpdG1hcF9jcmVhdGUobWRkZXYsIHNsb3QpOwogCi0JaWYgKElTX0VSUihiaXRtYXApKSB7Ci0JCWJpdG1hcF9mcmVlKGJpdG1hcCk7CisJaWYgKElTX0VSUihiaXRtYXApKQogCQlyZXR1cm4gUFRSX0VSUihiaXRtYXApOwotCX0KIAogCXJ2ID0gYml0bWFwX2luaXRfZnJvbV9kaXNrKGJpdG1hcCwgMCk7CiAJaWYgKHJ2KQpAQCAtMjE4MywxOSArMjE4MSwyOSBAQAogc3RhdGljIHNzaXplX3QKIGxvY2F0aW9uX3N0b3JlKHN0cnVjdCBtZGRldiAqbWRkZXYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKKwlpbnQgcnY7CiAKKwlydiA9IG1kZGV2X2xvY2sobWRkZXYpOworCWlmIChydikKKwkJcmV0dXJuIHJ2OwogCWlmIChtZGRldi0+cGVycykgewotCQlpZiAoIW1kZGV2LT5wZXJzLT5xdWllc2NlKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJaWYgKG1kZGV2LT5yZWNvdmVyeSB8fCBtZGRldi0+c3luY190aHJlYWQpCi0JCQlyZXR1cm4gLUVCVVNZOworCQlpZiAoIW1kZGV2LT5wZXJzLT5xdWllc2NlKSB7CisJCQlydiA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChtZGRldi0+cmVjb3ZlcnkgfHwgbWRkZXYtPnN5bmNfdGhyZWFkKSB7CisJCQlydiA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCiAJaWYgKG1kZGV2LT5iaXRtYXAgfHwgbWRkZXYtPmJpdG1hcF9pbmZvLmZpbGUgfHwKIAkgICAgbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCkgewogCQkvKiBiaXRtYXAgYWxyZWFkeSBjb25maWd1cmVkLiAgT25seSBvcHRpb24gaXMgdG8gY2xlYXIgaXQgKi8KLQkJaWYgKHN0cm5jbXAoYnVmLCAibm9uZSIsIDQpICE9IDApCi0JCQlyZXR1cm4gLUVCVVNZOworCQlpZiAoc3RybmNtcChidWYsICJub25lIiwgNCkgIT0gMCkgeworCQkJcnYgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQogCQlpZiAobWRkZXYtPnBlcnMpIHsKIAkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAxKTsKIAkJCWJpdG1hcF9kZXN0cm95KG1kZGV2KTsKQEAgLTIyMTQsMjEgKzIyMjIsMjUgQEAKIAkJCS8qIG5vdGhpbmcgdG8gYmUgZG9uZSAqLzsKIAkJZWxzZSBpZiAoc3RybmNtcChidWYsICJmaWxlOiIsIDUpID09IDApIHsKIAkJCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJ2ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OwogCQl9IGVsc2UgewotCQkJaW50IHJ2OwogCQkJaWYgKGJ1ZlswXSA9PSAnKycpCiAJCQkJcnYgPSBrc3RydG9sbChidWYrMSwgMTAsICZvZmZzZXQpOwogCQkJZWxzZQogCQkJCXJ2ID0ga3N0cnRvbGwoYnVmLCAxMCwgJm9mZnNldCk7CiAJCQlpZiAocnYpCi0JCQkJcmV0dXJuIHJ2OwotCQkJaWYgKG9mZnNldCA9PSAwKQotCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJaWYgKG9mZnNldCA9PSAwKSB7CisJCQkJcnYgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQogCQkJaWYgKG1kZGV2LT5iaXRtYXBfaW5mby5leHRlcm5hbCA9PSAwICYmCiAJCQkgICAgbWRkZXYtPm1ham9yX3ZlcnNpb24gPT0gMCAmJgotCQkJICAgIG9mZnNldCAhPSBtZGRldi0+Yml0bWFwX2luZm8uZGVmYXVsdF9vZmZzZXQpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkgICAgb2Zmc2V0ICE9IG1kZGV2LT5iaXRtYXBfaW5mby5kZWZhdWx0X29mZnNldCkgeworCQkJCXJ2ID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KIAkJCW1kZGV2LT5iaXRtYXBfaW5mby5vZmZzZXQgPSBvZmZzZXQ7CiAJCQlpZiAobWRkZXYtPnBlcnMpIHsKIAkJCQlzdHJ1Y3QgYml0bWFwICpiaXRtYXA7CkBAIC0yMjQ1LDcgKzIyNTcsNyBAQAogCQkJCW1kZGV2LT5wZXJzLT5xdWllc2NlKG1kZGV2LCAwKTsKIAkJCQlpZiAocnYpIHsKIAkJCQkJYml0bWFwX2Rlc3Ryb3kobWRkZXYpOwotCQkJCQlyZXR1cm4gcnY7CisJCQkJCWdvdG8gb3V0OwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjI1Nyw2ICsyMjY5LDExIEBACiAJCXNldF9iaXQoTURfQ0hBTkdFX0RFVlMsICZtZGRldi0+ZmxhZ3MpOwogCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwogCX0KKwlydiA9IDA7CitvdXQ6CisJbWRkZXZfdW5sb2NrKG1kZGV2KTsKKwlpZiAocnYpCisJCXJldHVybiBydjsKIAlyZXR1cm4gbGVuOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWJ1ZmlvLmMgYi9kcml2ZXJzL21kL2RtLWJ1ZmlvLmMKaW5kZXggNjU3MWM4MS4uODYyNTA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1idWZpby5jCisrKyBiL2RyaXZlcnMvbWQvZG0tYnVmaW8uYwpAQCAtMTg3OSw3ICsxODc5LDcgQEAKIAlfX2NhY2hlX3NpemVfcmVmcmVzaCgpOwogCW11dGV4X3VubG9jaygmZG1fYnVmaW9fY2xpZW50c19sb2NrKTsKIAotCWRtX2J1ZmlvX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImRtX2J1ZmlvX2NhY2hlIik7CisJZG1fYnVmaW9fd3EgPSBhbGxvY193b3JrcXVldWUoImRtX2J1ZmlvX2NhY2hlIiwgV1FfTUVNX1JFQ0xBSU0sIDApOwogCWlmICghZG1fYnVmaW9fd3EpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWNyeXB0LmMgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKaW5kZXggZWVkYmE2Ny4uMDQ0OGU3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tY3J5cHQuYwpAQCAtMTEzNiw3ICsxMTM2LDcgQEAKIAljbG9uZS0+YmlfcHJpdmF0ZSA9IGlvOwogCWNsb25lLT5iaV9lbmRfaW8gID0gY3J5cHRfZW5kaW87CiAJY2xvbmUtPmJpX2JkZXYgICAgPSBjYy0+ZGV2LT5iZGV2OwotCWJpb19zZXRfb3BfYXR0cnMoY2xvbmUsIGJpb19vcChpby0+YmFzZV9iaW8pLCBpby0+YmFzZV9iaW8tPmJpX29wZik7CisJYmlvX3NldF9vcF9hdHRycyhjbG9uZSwgYmlvX29wKGlvLT5iYXNlX2JpbyksIGJpb19mbGFncyhpby0+YmFzZV9iaW8pKTsKIH0KIAogc3RhdGljIGludCBrY3J5cHRkX2lvX3JlYWQoc3RydWN0IGRtX2NyeXB0X2lvICppbywgZ2ZwX3QgZ2ZwKQpAQCAtMTQ1Myw3ICsxNDUzLDcgQEAKIAl1bnNpZ25lZCBpOwogCWludCBlcnI7CiAKLQljYy0+dGZtcyA9IGttYWxsb2MoY2MtPnRmbXNfY291bnQgKiBzaXplb2Yoc3RydWN0IGNyeXB0b19za2NpcGhlciAqKSwKKwljYy0+dGZtcyA9IGt6YWxsb2MoY2MtPnRmbXNfY291bnQgKiBzaXplb2Yoc3RydWN0IGNyeXB0b19za2NpcGhlciAqKSwKIAkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghY2MtPnRmbXMpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTkyNCw2ICsxOTI0LDEzIEBACiAJCXJldHVybiBETV9NQVBJT19SRU1BUFBFRDsKIAl9CiAKKwkvKgorCSAqIENoZWNrIGlmIGJpbyBpcyB0b28gbGFyZ2UsIHNwbGl0IGFzIG5lZWRlZC4KKwkgKi8KKwlpZiAodW5saWtlbHkoYmlvLT5iaV9pdGVyLmJpX3NpemUgPiAoQklPX01BWF9QQUdFUyA8PCBQQUdFX1NISUZUKSkgJiYKKwkgICAgYmlvX2RhdGFfZGlyKGJpbykgPT0gV1JJVEUpCisJCWRtX2FjY2VwdF9wYXJ0aWFsX2JpbyhiaW8sICgoQklPX01BWF9QQUdFUyA8PCBQQUdFX1NISUZUKSA+PiBTRUNUT1JfU0hJRlQpKTsKKwogCWlvID0gZG1fcGVyX2Jpb19kYXRhKGJpbywgY2MtPnBlcl9iaW9fZGF0YV9zaXplKTsKIAljcnlwdF9pb19pbml0KGlvLCBjYywgYmlvLCBkbV90YXJnZXRfb2Zmc2V0KHRpLCBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKSk7CiAJaW8tPmN0eC5yZXEgPSAoc3RydWN0IHNrY2lwaGVyX3JlcXVlc3QgKikoaW8gKyAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbG9nLXdyaXRlcy5jIGIvZHJpdmVycy9tZC9kbS1sb2ctd3JpdGVzLmMKaW5kZXggNGFiNjgwMy4uNGRmZTM4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1sb2ctd3JpdGVzLmMKKysrIGIvZHJpdmVycy9tZC9kbS1sb2ctd3JpdGVzLmMKQEAgLTE0OSw4ICsxNDksNiBAQAogc3RhdGljIHZvaWQgbG9nX2VuZF9pbyhzdHJ1Y3QgYmlvICpiaW8pCiB7CiAJc3RydWN0IGxvZ193cml0ZXNfYyAqbGMgPSBiaW8tPmJpX3ByaXZhdGU7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWM7Ci0JaW50IGk7CiAKIAlpZiAoYmlvLT5iaV9lcnJvcikgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTYxLDkgKzE1OSw3IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxjLT5ibG9ja3NfbG9jaywgZmxhZ3MpOwogCX0KIAotCWJpb19mb3JfZWFjaF9zZWdtZW50X2FsbChidmVjLCBiaW8sIGkpCi0JCV9fZnJlZV9wYWdlKGJ2ZWMtPmJ2X3BhZ2UpOwotCisJYmlvX2ZyZWVfcGFnZXMoYmlvKTsKIAlwdXRfaW9fYmxvY2sobGMpOwogCWJpb19wdXQoYmlvKTsKIH0KQEAgLTI1OSwxMiArMjU1LDEyIEBACiAJCWdvdG8gb3V0OwogCXNlY3RvcisrOwogCi0JYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIGJsb2NrLT52ZWNfY250KTsKKwlhdG9taWNfaW5jKCZsYy0+aW9fYmxvY2tzKTsKKwliaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgbWluKGJsb2NrLT52ZWNfY250LCBCSU9fTUFYX1BBR0VTKSk7CiAJaWYgKCFiaW8pIHsKIAkJRE1FUlIoIkNvdWxkbid0IGFsbG9jIGxvZyBiaW8iKTsKIAkJZ290byBlcnJvcjsKIAl9Ci0JYXRvbWljX2luYygmbGMtPmlvX2Jsb2Nrcyk7CiAJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSAwOwogCWJpby0+YmlfaXRlci5iaV9zZWN0b3IgPSBzZWN0b3I7CiAJYmlvLT5iaV9iZGV2ID0gbGMtPmxvZ2Rldi0+YmRldjsKQEAgLTI4Miw3ICsyNzgsNyBAQAogCQlpZiAocmV0ICE9IGJsb2NrLT52ZWNzW2ldLmJ2X2xlbikgewogCQkJYXRvbWljX2luYygmbGMtPmlvX2Jsb2Nrcyk7CiAJCQlzdWJtaXRfYmlvKGJpbyk7Ci0JCQliaW8gPSBiaW9fYWxsb2MoR0ZQX0tFUk5FTCwgYmxvY2stPnZlY19jbnQgLSBpKTsKKwkJCWJpbyA9IGJpb19hbGxvYyhHRlBfS0VSTkVMLCBtaW4oYmxvY2stPnZlY19jbnQgLSBpLCBCSU9fTUFYX1BBR0VTKSk7CiAJCQlpZiAoIWJpbykgewogCQkJCURNRVJSKCJDb3VsZG4ndCBhbGxvYyBsb2cgYmlvIik7CiAJCQkJZ290byBlcnJvcjsKQEAgLTQ1OSw5ICs0NTUsOSBAQAogCQlnb3RvIGJhZDsKIAl9CiAKLQlyZXQgPSAtRUlOVkFMOwogCWxjLT5sb2dfa3RocmVhZCA9IGt0aHJlYWRfcnVuKGxvZ193cml0ZXNfa3RocmVhZCwgbGMsICJsb2ctd3JpdGUiKTsKLQlpZiAoIWxjLT5sb2dfa3RocmVhZCkgeworCWlmIChJU19FUlIobGMtPmxvZ19rdGhyZWFkKSkgeworCQlyZXQgPSBQVFJfRVJSKGxjLT5sb2dfa3RocmVhZCk7CiAJCXRpLT5lcnJvciA9ICJDb3VsZG4ndCBhbGxvYyBrdGhyZWFkIjsKIAkJZG1fcHV0X2RldmljZSh0aSwgbGMtPmRldik7CiAJCWRtX3B1dF9kZXZpY2UodGksIGxjLT5sb2dkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1ycS5jIGIvZHJpdmVycy9tZC9kbS1ycS5jCmluZGV4IDFjYTc0NjMuLmVlNDgyMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tcnEuYworKysgYi9kcml2ZXJzL21kL2RtLXJxLmMKQEAgLTk1NSw3ICs5NTUsNyBAQAogCWRtX2luaXRfbWRfcXVldWUobWQpOwogCiAJLyogYmFja2ZpbGwgJ21xJyBzeXNmcyByZWdpc3RyYXRpb24gbm9ybWFsbHkgZG9uZSBpbiBibGtfcmVnaXN0ZXJfcXVldWUgKi8KLQlibGtfbXFfcmVnaXN0ZXJfZGlzayhtZC0+ZGlzayk7CisJYmxrX21xX3JlZ2lzdGVyX2RldihkaXNrX3RvX2RldihtZC0+ZGlzayksIHEpOwogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQtY2x1c3Rlci5jIGIvZHJpdmVycy9tZC9tZC1jbHVzdGVyLmMKaW5kZXggNDE1NzNmMS4uMmIxMzExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9tZC1jbHVzdGVyLmMKKysrIGIvZHJpdmVycy9tZC9tZC1jbHVzdGVyLmMKQEAgLTEwLDYgKzEwLDcgQEAKIAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RsbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvcmFpZC9tZF9wLmg+CkBAIC0yNSw3ICsyNiw4IEBACiAJc3RydWN0IGRsbV9sa3NiIGxrc2I7CiAJY2hhciAqbmFtZTsgLyogbG9jayBuYW1lLiAqLwogCXVpbnQzMl90IGZsYWdzOyAvKiBmbGFncyB0byBwYXNzIHRvIGRsbV9sb2NrKCkgKi8KLQlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOyAvKiBjb21wbGV0aW9uIGZvciBzeW5jaHJvbml6ZWQgbG9ja2luZyAqLworCXdhaXRfcXVldWVfaGVhZF90IHN5bmNfbG9ja2luZzsgLyogd2FpdCBxdWV1ZSBmb3Igc3luY2hyb25pemVkIGxvY2tpbmcgKi8KKwlib29sIHN5bmNfbG9ja2luZ19kb25lOwogCXZvaWQgKCpiYXN0KSh2b2lkICphcmcsIGludCBtb2RlKTsgLyogYmxvY2tpbmcgQVNUIGZ1bmN0aW9uIHBvaW50ZXIqLwogCXN0cnVjdCBtZGRldiAqbWRkZXY7IC8qIHBvaW50aW5nIGJhY2sgdG8gbWRkZXYuICovCiAJaW50IG1vZGU7CkBAIC0xMTgsNyArMTIwLDggQEAKIAlzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlczsKIAogCXJlcyA9IGFyZzsKLQljb21wbGV0ZSgmcmVzLT5jb21wbGV0aW9uKTsKKwlyZXMtPnN5bmNfbG9ja2luZ19kb25lID0gdHJ1ZTsKKwl3YWtlX3VwKCZyZXMtPnN5bmNfbG9ja2luZyk7CiB9CiAKIHN0YXRpYyBpbnQgZGxtX2xvY2tfc3luYyhzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcywgaW50IG1vZGUpCkBAIC0xMzAsNyArMTMzLDggQEAKIAkJCTAsIHN5bmNfYXN0LCByZXMsIHJlcy0+YmFzdCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZyZXMtPmNvbXBsZXRpb24pOworCXdhaXRfZXZlbnQocmVzLT5zeW5jX2xvY2tpbmcsIHJlcy0+c3luY19sb2NraW5nX2RvbmUpOworCXJlcy0+c3luY19sb2NraW5nX2RvbmUgPSBmYWxzZTsKIAlpZiAocmVzLT5sa3NiLnNiX3N0YXR1cyA9PSAwKQogCQlyZXMtPm1vZGUgPSBtb2RlOwogCXJldHVybiByZXMtPmxrc2Iuc2Jfc3RhdHVzOwpAQCAtMTQxLDYgKzE0NSw0NCBAQAogCXJldHVybiBkbG1fbG9ja19zeW5jKHJlcywgRExNX0xPQ0tfTkwpOwogfQogCisvKgorICogQW4gdmFyaWF0aW9uIG9mIGRsbV9sb2NrX3N5bmMsIHdoaWNoIG1ha2UgbG9jayByZXF1ZXN0IGNvdWxkCisgKiBiZSBpbnRlcnJ1cHRlZAorICovCitzdGF0aWMgaW50IGRsbV9sb2NrX3N5bmNfaW50ZXJydXB0aWJsZShzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcywgaW50IG1vZGUsCisJCQkJICAgICAgIHN0cnVjdCBtZGRldiAqbWRkZXYpCit7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBkbG1fbG9jayhyZXMtPmxzLCBtb2RlLCAmcmVzLT5sa3NiLAorCQkJcmVzLT5mbGFncywgcmVzLT5uYW1lLCBzdHJsZW4ocmVzLT5uYW1lKSwKKwkJCTAsIHN5bmNfYXN0LCByZXMsIHJlcy0+YmFzdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXdhaXRfZXZlbnQocmVzLT5zeW5jX2xvY2tpbmcsIHJlcy0+c3luY19sb2NraW5nX2RvbmUKKwkJCQkgICAgICB8fCBrdGhyZWFkX3Nob3VsZF9zdG9wKCkKKwkJCQkgICAgICB8fCB0ZXN0X2JpdChNRF9DTE9TSU5HLCAmbWRkZXYtPmZsYWdzKSk7CisJaWYgKCFyZXMtPnN5bmNfbG9ja2luZ19kb25lKSB7CisJCS8qCisJCSAqIHRoZSBjb252ZXJ0IHF1ZXVlIGNvbnRhaW5zIHRoZSBsb2NrIHJlcXVlc3Qgd2hlbiByZXF1ZXN0IGlzCisJCSAqIGludGVycnVwdGVkLCBhbmQgc3luY19hc3QgY291bGQgc3RpbGwgYmUgcnVuLCBzbyBuZWVkIHRvCisJCSAqIGNhbmNlbCB0aGUgcmVxdWVzdCBhbmQgcmVzZXQgY29tcGxldGlvbgorCQkgKi8KKwkJcmV0ID0gZGxtX3VubG9jayhyZXMtPmxzLCByZXMtPmxrc2Iuc2JfbGtpZCwgRExNX0xLRl9DQU5DRUwsCisJCQkmcmVzLT5sa3NiLCByZXMpOworCQlyZXMtPnN5bmNfbG9ja2luZ19kb25lID0gZmFsc2U7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCQlwcl9pbmZvKCJmYWlsZWQgdG8gY2FuY2VsIHByZXZpb3VzIGxvY2sgcmVxdWVzdCAiCisJCQkJICIlcyByZXR1cm4gJWRcbiIsIHJlcy0+bmFtZSwgcmV0KTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9IGVsc2UKKwkJcmVzLT5zeW5jX2xvY2tpbmdfZG9uZSA9IGZhbHNlOworCWlmIChyZXMtPmxrc2Iuc2Jfc3RhdHVzID09IDApCisJCXJlcy0+bW9kZSA9IG1vZGU7CisJcmV0dXJuIHJlcy0+bGtzYi5zYl9zdGF0dXM7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKmxvY2tyZXNfaW5pdChzdHJ1Y3QgbWRkZXYgKm1kZGV2LAogCQljaGFyICpuYW1lLCB2b2lkICgqYmFzdGZuKSh2b2lkICphcmcsIGludCBtb2RlKSwgaW50IHdpdGhfbHZiKQogewpAQCAtMTUxLDcgKzE5Myw4IEBACiAJcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRsbV9sb2NrX3Jlc291cmNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZXMpCiAJCXJldHVybiBOVUxMOwotCWluaXRfY29tcGxldGlvbigmcmVzLT5jb21wbGV0aW9uKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyZXMtPnN5bmNfbG9ja2luZyk7CisJcmVzLT5zeW5jX2xvY2tpbmdfZG9uZSA9IGZhbHNlOwogCXJlcy0+bHMgPSBjaW5mby0+bG9ja3NwYWNlOwogCXJlcy0+bWRkZXYgPSBtZGRldjsKIAlyZXMtPm1vZGUgPSBETE1fTE9DS19JVjsKQEAgLTE5NCwyNSArMjM3LDIxIEBACiAKIHN0YXRpYyB2b2lkIGxvY2tyZXNfZnJlZShzdHJ1Y3QgZGxtX2xvY2tfcmVzb3VyY2UgKnJlcykKIHsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJaWYgKCFyZXMpCiAJCXJldHVybjsKIAotCS8qIGNhbmNlbCBhIGxvY2sgcmVxdWVzdCBvciBhIGNvbnZlcnNpb24gcmVxdWVzdCB0aGF0IGlzIGJsb2NrZWQgKi8KLQlyZXMtPmZsYWdzIHw9IERMTV9MS0ZfQ0FOQ0VMOwotcmV0cnk6Ci0JcmV0ID0gZGxtX3VubG9jayhyZXMtPmxzLCByZXMtPmxrc2Iuc2JfbGtpZCwgMCwgJnJlcy0+bGtzYiwgcmVzKTsKLQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7Ci0JCXByX2luZm8oIiVzOiBmYWlsZWQgdG8gdW5sb2NrICVzIHJldHVybiAlZFxuIiwgX19mdW5jX18sIHJlcy0+bmFtZSwgcmV0KTsKLQotCQkvKiBpZiBhIGxvY2sgY29udmVyc2lvbiBpcyBjYW5jZWxsZWQsIHRoZW4gdGhlIGxvY2sgaXMgcHV0Ci0JCSAqIGJhY2sgdG8gZ3JhbnQgcXVldWUsIG5lZWQgdG8gZW5zdXJlIGl0IGlzIHVubG9ja2VkICovCi0JCWlmIChyZXQgPT0gLURMTV9FQ0FOQ0VMKQotCQkJZ290byByZXRyeTsKLQl9Ci0JcmVzLT5mbGFncyAmPSB+RExNX0xLRl9DQU5DRUw7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmcmVzLT5jb21wbGV0aW9uKTsKKwkvKgorCSAqIHVzZSBGT1JDRVVOTE9DSyBmbGFnLCBzbyB3ZSBjYW4gdW5sb2NrIGV2ZW4gdGhlIGxvY2sgaXMgb24gdGhlCisJICogd2FpdGluZyBvciBjb252ZXJ0IHF1ZXVlCisJICovCisJcmV0ID0gZGxtX3VubG9jayhyZXMtPmxzLCByZXMtPmxrc2Iuc2JfbGtpZCwgRExNX0xLRl9GT1JDRVVOTE9DSywKKwkJJnJlcy0+bGtzYiwgcmVzKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlwcl9lcnIoImZhaWxlZCB0byB1bmxvY2sgJXMgcmV0dXJuICVkXG4iLCByZXMtPm5hbWUsIHJldCk7CisJZWxzZQorCQl3YWl0X2V2ZW50KHJlcy0+c3luY19sb2NraW5nLCByZXMtPnN5bmNfbG9ja2luZ19kb25lKTsKIAogCWtmcmVlKHJlcy0+bmFtZSk7CiAJa2ZyZWUocmVzLT5sa3NiLnNiX2x2YnB0cik7CkBAIC0yNzksNyArMzE4LDcgQEAKIAkJCWdvdG8gY2xlYXJfYml0OwogCQl9CiAKLQkJcmV0ID0gZGxtX2xvY2tfc3luYyhibV9sb2NrcmVzLCBETE1fTE9DS19QVyk7CisJCXJldCA9IGRsbV9sb2NrX3N5bmNfaW50ZXJydXB0aWJsZShibV9sb2NrcmVzLCBETE1fTE9DS19QVywgbWRkZXYpOwogCQlpZiAocmV0KSB7CiAJCQlwcl9lcnIoIm1kLWNsdXN0ZXI6IENvdWxkIG5vdCBETE0gbG9jayAlczogJWRcbiIsCiAJCQkJCXN0ciwgcmV0KTsKQEAgLTI4OCw3ICszMjcsNyBAQAogCQlyZXQgPSBiaXRtYXBfY29weV9mcm9tX3Nsb3QobWRkZXYsIHNsb3QsICZsbywgJmhpLCB0cnVlKTsKIAkJaWYgKHJldCkgewogCQkJcHJfZXJyKCJtZC1jbHVzdGVyOiBDb3VsZCBub3QgY29weSBkYXRhIGZyb20gYml0bWFwICVkXG4iLCBzbG90KTsKLQkJCWdvdG8gZGxtX3VubG9jazsKKwkJCWdvdG8gY2xlYXJfYml0OwogCQl9CiAJCWlmIChoaSA+IDApIHsKIAkJCWlmIChsbyA8IG1kZGV2LT5yZWNvdmVyeV9jcCkKQEAgLTMwMCw4ICszMzksNiBAQAogCQkJICAgIG1kX3dha2V1cF90aHJlYWQobWRkZXYtPnRocmVhZCk7CiAJCQl9CiAJCX0KLWRsbV91bmxvY2s6Ci0JCWRsbV91bmxvY2tfc3luYyhibV9sb2NrcmVzKTsKIGNsZWFyX2JpdDoKIAkJbG9ja3Jlc19mcmVlKGJtX2xvY2tyZXMpOwogCQljbGVhcl9iaXQoc2xvdCwgJmNpbmZvLT5yZWNvdmVyeV9tYXApOwpAQCAtNDk1LDkgKzUzMiwxMCBAQAogCiBzdGF0aWMgdm9pZCBwcm9jZXNzX3JlbW92ZV9kaXNrKHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBjbHVzdGVyX21zZyAqbXNnKQogewotCXN0cnVjdCBtZF9yZGV2ICpyZGV2ID0gbWRfZmluZF9yZGV2X25yX3JjdShtZGRldiwKLQkJCQkJCSAgIGxlMzJfdG9fY3B1KG1zZy0+cmFpZF9zbG90KSk7CisJc3RydWN0IG1kX3JkZXYgKnJkZXY7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmRldiA9IG1kX2ZpbmRfcmRldl9ucl9yY3UobWRkZXYsIGxlMzJfdG9fY3B1KG1zZy0+cmFpZF9zbG90KSk7CiAJaWYgKHJkZXYpIHsKIAkJc2V0X2JpdChDbHVzdGVyUmVtb3ZlLCAmcmRldi0+ZmxhZ3MpOwogCQlzZXRfYml0KE1EX1JFQ09WRVJZX05FRURFRCwgJm1kZGV2LT5yZWNvdmVyeSk7CkBAIC01MDYsMTggKzU0NCwyMSBAQAogCWVsc2UKIAkJcHJfd2FybigiJXM6ICVkIENvdWxkIG5vdCBmaW5kIGRpc2soJWQpIHRvIFJFTU9WRVxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgbGUzMl90b19jcHUobXNnLT5yYWlkX3Nsb3QpKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogc3RhdGljIHZvaWQgcHJvY2Vzc19yZWFkZF9kaXNrKHN0cnVjdCBtZGRldiAqbWRkZXYsIHN0cnVjdCBjbHVzdGVyX21zZyAqbXNnKQogewotCXN0cnVjdCBtZF9yZGV2ICpyZGV2ID0gbWRfZmluZF9yZGV2X25yX3JjdShtZGRldiwKLQkJCQkJCSAgIGxlMzJfdG9fY3B1KG1zZy0+cmFpZF9zbG90KSk7CisJc3RydWN0IG1kX3JkZXYgKnJkZXY7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmRldiA9IG1kX2ZpbmRfcmRldl9ucl9yY3UobWRkZXYsIGxlMzJfdG9fY3B1KG1zZy0+cmFpZF9zbG90KSk7CiAJaWYgKHJkZXYgJiYgdGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKQogCQljbGVhcl9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpOwogCWVsc2UKIAkJcHJfd2FybigiJXM6ICVkIENvdWxkIG5vdCBmaW5kIGRpc2soJWQpIHdoaWNoIGlzIGZhdWx0eSIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIGxlMzJfdG9fY3B1KG1zZy0+cmFpZF9zbG90KSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyBpbnQgcHJvY2Vzc19yZWN2ZF9tc2coc3RydWN0IG1kZGV2ICptZGRldiwgc3RydWN0IGNsdXN0ZXJfbXNnICptc2cpCkBAIC03NzAsNyArODExLDYgQEAKIAkJCW1kX2NoZWNrX3JlY292ZXJ5KG1kZGV2KTsKIAkJfQogCi0JCWRsbV91bmxvY2tfc3luYyhibV9sb2NrcmVzKTsKIAkJbG9ja3Jlc19mcmVlKGJtX2xvY2tyZXMpOwogCX0KIG91dDoKQEAgLTgzNCw4ICs4NzQsMTAgQEAKIAkJZ290byBlcnI7CiAJfQogCWNpbmZvLT5hY2tfbG9ja3JlcyA9IGxvY2tyZXNfaW5pdChtZGRldiwgImFjayIsIGFja19iYXN0LCAwKTsKLQlpZiAoIWNpbmZvLT5hY2tfbG9ja3JlcykKKwlpZiAoIWNpbmZvLT5hY2tfbG9ja3JlcykgeworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKKwl9CiAJLyogZ2V0IHN5bmMgQ1IgbG9jayBvbiBBQ0suICovCiAJaWYgKGRsbV9sb2NrX3N5bmMoY2luZm8tPmFja19sb2NrcmVzLCBETE1fTE9DS19DUikpCiAJCXByX2VycigibWQtY2x1c3RlcjogZmFpbGVkIHRvIGdldCBhIHN5bmMgQ1IgbG9jayBvbiBBQ0shKCVkKVxuIiwKQEAgLTg0OSw4ICs4OTEsMTAgQEAKIAlwcl9pbmZvKCJtZC1jbHVzdGVyOiBKb2luZWQgY2x1c3RlciAlcyBzbG90ICVkXG4iLCBzdHIsIGNpbmZvLT5zbG90X251bWJlcik7CiAJc25wcmludGYoc3RyLCA2NCwgImJpdG1hcCUwNGQiLCBjaW5mby0+c2xvdF9udW1iZXIgLSAxKTsKIAljaW5mby0+Yml0bWFwX2xvY2tyZXMgPSBsb2NrcmVzX2luaXQobWRkZXYsIHN0ciwgTlVMTCwgMSk7Ci0JaWYgKCFjaW5mby0+Yml0bWFwX2xvY2tyZXMpCisJaWYgKCFjaW5mby0+Yml0bWFwX2xvY2tyZXMpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnI7CisJfQogCWlmIChkbG1fbG9ja19zeW5jKGNpbmZvLT5iaXRtYXBfbG9ja3JlcywgRExNX0xPQ0tfUFcpKSB7CiAJCXByX2VycigiRmFpbGVkIHRvIGdldCBiaXRtYXAgbG9ja1xuIik7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC04NTgsOCArOTAyLDEwIEBACiAJfQogCiAJY2luZm8tPnJlc3luY19sb2NrcmVzID0gbG9ja3Jlc19pbml0KG1kZGV2LCAicmVzeW5jIiwgTlVMTCwgMCk7Ci0JaWYgKCFjaW5mby0+cmVzeW5jX2xvY2tyZXMpCisJaWYgKCFjaW5mby0+cmVzeW5jX2xvY2tyZXMpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnI7CisJfQogCiAJcmV0dXJuIDA7CiBlcnI6CkBAIC0xMDAwLDcgKzEwNDYsNyBAQAogc3RhdGljIGludCByZXN5bmNfc3RhcnQoc3RydWN0IG1kZGV2ICptZGRldikKIHsKIAlzdHJ1Y3QgbWRfY2x1c3Rlcl9pbmZvICpjaW5mbyA9IG1kZGV2LT5jbHVzdGVyX2luZm87Ci0JcmV0dXJuIGRsbV9sb2NrX3N5bmMoY2luZm8tPnJlc3luY19sb2NrcmVzLCBETE1fTE9DS19FWCk7CisJcmV0dXJuIGRsbV9sb2NrX3N5bmNfaW50ZXJydXB0aWJsZShjaW5mby0+cmVzeW5jX2xvY2tyZXMsIERMTV9MT0NLX0VYLCBtZGRldik7CiB9CiAKIHN0YXRpYyBpbnQgcmVzeW5jX2luZm9fdXBkYXRlKHN0cnVjdCBtZGRldiAqbWRkZXYsIHNlY3Rvcl90IGxvLCBzZWN0b3JfdCBoaSkKQEAgLTExODAsNyArMTIyNiw2IEBACiAJaWYgKGNpbmZvLT5vdGhlcl9iaXRtYXBfbG9ja3JlcykgewogCQlmb3IgKGkgPSAwOyBpIDwgbWRkZXYtPmJpdG1hcF9pbmZvLm5vZGVzIC0gMTsgaSsrKSB7CiAJCQlpZiAoY2luZm8tPm90aGVyX2JpdG1hcF9sb2NrcmVzW2ldKSB7Ci0JCQkJZGxtX3VubG9ja19zeW5jKGNpbmZvLT5vdGhlcl9iaXRtYXBfbG9ja3Jlc1tpXSk7CiAJCQkJbG9ja3Jlc19mcmVlKGNpbmZvLT5vdGhlcl9iaXRtYXBfbG9ja3Jlc1tpXSk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCBkNjQ2ZjZlLi5lYWM4NGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC0xNjA0LDExICsxNjA0LDggQEAKIAkJCW1kZGV2LT5uZXdfY2h1bmtfc2VjdG9ycyA9IG1kZGV2LT5jaHVua19zZWN0b3JzOwogCQl9CiAKLQkJaWYgKGxlMzJfdG9fY3B1KHNiLT5mZWF0dXJlX21hcCkgJiBNRF9GRUFUVVJFX0pPVVJOQUwpIHsKKwkJaWYgKGxlMzJfdG9fY3B1KHNiLT5mZWF0dXJlX21hcCkgJiBNRF9GRUFUVVJFX0pPVVJOQUwpCiAJCQlzZXRfYml0KE1EX0hBU19KT1VSTkFMLCAmbWRkZXYtPmZsYWdzKTsKLQkJCWlmIChtZGRldi0+cmVjb3ZlcnlfY3AgPT0gTWF4U2VjdG9yKQotCQkJCXNldF9iaXQoTURfSk9VUk5BTF9DTEVBTiwgJm1kZGV2LT5mbGFncyk7Ci0JCX0KIAl9IGVsc2UgaWYgKG1kZGV2LT5wZXJzID09IE5VTEwpIHsKIAkJLyogSW5zaXN0IG9mIGdvb2QgZXZlbnQgY291bnRlciB3aGlsZSBhc3NlbWJsaW5nLCBleGNlcHQgZm9yCiAJCSAqIHNwYXJlcyAod2hpY2ggZG9uJ3QgbmVlZCBhbiBldmVudCBjb3VudCkgKi8KQEAgLTUzMDAsNiArNTI5NywyMSBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAlpZiAobWRkZXYtPnF1ZXVlKSB7CisJCWJvb2wgbm9ucm90ID0gdHJ1ZTsKKworCQlyZGV2X2Zvcl9lYWNoKHJkZXYsIG1kZGV2KSB7CisJCQlpZiAocmRldi0+cmFpZF9kaXNrID49IDAgJiYKKwkJCSAgICAhYmxrX3F1ZXVlX25vbnJvdChiZGV2X2dldF9xdWV1ZShyZGV2LT5iZGV2KSkpIHsKKwkJCQlub25yb3QgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAobWRkZXYtPmRlZ3JhZGVkKQorCQkJbm9ucm90ID0gZmFsc2U7CisJCWlmIChub25yb3QpCisJCQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX05PTlJPVCwgbWRkZXYtPnF1ZXVlKTsKKwkJZWxzZQorCQkJcXVldWVfZmxhZ19jbGVhcl91bmxvY2tlZChRVUVVRV9GTEFHX05PTlJPVCwgbWRkZXYtPnF1ZXVlKTsKIAkJbWRkZXYtPnF1ZXVlLT5iYWNraW5nX2Rldl9pbmZvLmNvbmdlc3RlZF9kYXRhID0gbWRkZXY7CiAJCW1kZGV2LT5xdWV1ZS0+YmFja2luZ19kZXZfaW5mby5jb25nZXN0ZWRfZm4gPSBtZF9jb25nZXN0ZWQ7CiAJfQpAQCAtNTQ1NywxMiArNTQ2OSwxNCBAQAogCW1kZGV2LT5kZWdyYWRlZCA9IDA7CiAJbWRkZXYtPnNhZmVtb2RlID0gMDsKIAltZGRldi0+cHJpdmF0ZSA9IE5VTEw7CisJbWRkZXYtPmNsdXN0ZXJfaW5mbyA9IE5VTEw7CiAJbWRkZXYtPmJpdG1hcF9pbmZvLm9mZnNldCA9IDA7CiAJbWRkZXYtPmJpdG1hcF9pbmZvLmRlZmF1bHRfb2Zmc2V0ID0gMDsKIAltZGRldi0+Yml0bWFwX2luZm8uZGVmYXVsdF9zcGFjZSA9IDA7CiAJbWRkZXYtPmJpdG1hcF9pbmZvLmNodW5rc2l6ZSA9IDA7CiAJbWRkZXYtPmJpdG1hcF9pbmZvLmRhZW1vbl9zbGVlcCA9IDA7CiAJbWRkZXYtPmJpdG1hcF9pbmZvLm1heF93cml0ZV9iZWhpbmQgPSAwOworCW1kZGV2LT5iaXRtYXBfaW5mby5ub2RlcyA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fbWRfc3RvcF93cml0ZXMoc3RydWN0IG1kZGV2ICptZGRldikKQEAgLTU1NzYsOCArNTU5MCw3IEBACiAJbXV0ZXhfbG9jaygmbWRkZXYtPm9wZW5fbXV0ZXgpOwogCWlmICgobWRkZXYtPnBlcnMgJiYgYXRvbWljX3JlYWQoJm1kZGV2LT5vcGVuZXJzKSA+ICEhYmRldikgfHwKIAkgICAgbWRkZXYtPnN5bmNfdGhyZWFkIHx8Ci0JICAgIHRlc3RfYml0KE1EX1JFQ09WRVJZX1JVTk5JTkcsICZtZGRldi0+cmVjb3ZlcnkpIHx8Ci0JICAgIChiZGV2ICYmICF0ZXN0X2JpdChNRF9TVElMTF9DTE9TRUQsICZtZGRldi0+ZmxhZ3MpKSkgeworCSAgICB0ZXN0X2JpdChNRF9SRUNPVkVSWV9SVU5OSU5HLCAmbWRkZXYtPnJlY292ZXJ5KSkgewogCQlwcmludGsoIm1kOiAlcyBzdGlsbCBpbiB1c2UuXG4iLG1kbmFtZShtZGRldikpOwogCQlpZiAoZGlkX2ZyZWV6ZSkgewogCQkJY2xlYXJfYml0KE1EX1JFQ09WRVJZX0ZST1pFTiwgJm1kZGV2LT5yZWNvdmVyeSk7CkBAIC01NjM5LDggKzU2NTIsNyBAQAogCWlmICgobWRkZXYtPnBlcnMgJiYgYXRvbWljX3JlYWQoJm1kZGV2LT5vcGVuZXJzKSA+ICEhYmRldikgfHwKIAkgICAgbWRkZXYtPnN5c2ZzX2FjdGl2ZSB8fAogCSAgICBtZGRldi0+c3luY190aHJlYWQgfHwKLQkgICAgdGVzdF9iaXQoTURfUkVDT1ZFUllfUlVOTklORywgJm1kZGV2LT5yZWNvdmVyeSkgfHwKLQkgICAgKGJkZXYgJiYgIXRlc3RfYml0KE1EX1NUSUxMX0NMT1NFRCwgJm1kZGV2LT5mbGFncykpKSB7CisJICAgIHRlc3RfYml0KE1EX1JFQ09WRVJZX1JVTk5JTkcsICZtZGRldi0+cmVjb3ZlcnkpKSB7CiAJCXByaW50aygibWQ6ICVzIHN0aWxsIGluIHVzZS5cbiIsbWRuYW1lKG1kZGV2KSk7CiAJCW11dGV4X3VubG9jaygmbWRkZXYtPm9wZW5fbXV0ZXgpOwogCQlpZiAoZGlkX2ZyZWV6ZSkgewpAQCAtNTg1MSw2ICs1ODYzLDkgQEAKIAkJCXdvcmtpbmcrKzsKIAkJCWlmICh0ZXN0X2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpKQogCQkJCWluc3luYysrOworCQkJZWxzZSBpZiAodGVzdF9iaXQoSm91cm5hbCwgJnJkZXYtPmZsYWdzKSkKKwkJCQkvKiBUT0RPOiBhZGQgam91cm5hbCBjb3VudCB0byBtZF91LmggKi8KKwkJCQk7CiAJCQllbHNlCiAJCQkJc3BhcmUrKzsKIAkJfQpAQCAtNjEwMSw5ICs2MTE2LDE0IEBACiAJCQlleHBvcnRfcmRldihyZGV2KTsKIAogCQlpZiAobWRkZXZfaXNfY2x1c3RlcmVkKG1kZGV2KSkgewotCQkJaWYgKGluZm8tPnN0YXRlICYgKDEgPDwgTURfRElTS19DQU5ESURBVEUpKQotCQkJCW1kX2NsdXN0ZXJfb3BzLT5uZXdfZGlza19hY2sobWRkZXYsIChlcnIgPT0gMCkpOwotCQkJZWxzZSB7CisJCQlpZiAoaW5mby0+c3RhdGUgJiAoMSA8PCBNRF9ESVNLX0NBTkRJREFURSkpIHsKKwkJCQlpZiAoIWVycikgeworCQkJCQllcnIgPSBtZF9jbHVzdGVyX29wcy0+bmV3X2Rpc2tfYWNrKG1kZGV2LAorCQkJCQkJZXJyID09IDApOworCQkJCQlpZiAoZXJyKQorCQkJCQkJbWRfa2lja19yZGV2X2Zyb21fYXJyYXkocmRldik7CisJCQkJfQorCQkJfSBlbHNlIHsKIAkJCQlpZiAoZXJyKQogCQkJCQltZF9jbHVzdGVyX29wcy0+YWRkX25ld19kaXNrX2NhbmNlbChtZGRldik7CiAJCQkJZWxzZQpAQCAtNjgyMSw3ICs2ODQxLDcgQEAKIAkJCWVyciA9IC1FQlVTWTsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCXNldF9iaXQoTURfU1RJTExfQ0xPU0VELCAmbWRkZXYtPmZsYWdzKTsKKwkJc2V0X2JpdChNRF9DTE9TSU5HLCAmbWRkZXYtPmZsYWdzKTsKIAkJbXV0ZXhfdW5sb2NrKCZtZGRldi0+b3Blbl9tdXRleCk7CiAJCXN5bmNfYmxvY2tkZXYoYmRldik7CiAJfQpAQCAtNzA3MCw5ICs3MDkwLDEzIEBACiAJaWYgKChlcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm1kZGV2LT5vcGVuX211dGV4KSkpCiAJCWdvdG8gb3V0OwogCisJaWYgKHRlc3RfYml0KE1EX0NMT1NJTkcsICZtZGRldi0+ZmxhZ3MpKSB7CisJCW11dGV4X3VubG9jaygmbWRkZXYtPm9wZW5fbXV0ZXgpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAllcnIgPSAwOwogCWF0b21pY19pbmMoJm1kZGV2LT5vcGVuZXJzKTsKLQljbGVhcl9iaXQoTURfU1RJTExfQ0xPU0VELCAmbWRkZXYtPmZsYWdzKTsKIAltdXRleF91bmxvY2soJm1kZGV2LT5vcGVuX211dGV4KTsKIAogCWNoZWNrX2Rpc2tfY2hhbmdlKGJkZXYpOwpAQCAtNzYxMCwxNiArNzYzNCwxMiBAQAogCiBpbnQgbWRfc2V0dXBfY2x1c3RlcihzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBpbnQgbm9kZXMpCiB7Ci0JaW50IGVycjsKLQotCWVyciA9IHJlcXVlc3RfbW9kdWxlKCJtZC1jbHVzdGVyIik7Ci0JaWYgKGVycikgewotCQlwcl9lcnIoIm1kLWNsdXN0ZXIgbW9kdWxlIG5vdCBmb3VuZC5cbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KKwlpZiAoIW1kX2NsdXN0ZXJfb3BzKQorCQlyZXF1ZXN0X21vZHVsZSgibWQtY2x1c3RlciIpOwogCXNwaW5fbG9jaygmcGVyc19sb2NrKTsKKwkvKiBlbnN1cmUgbW9kdWxlIHdvbid0IGJlIHVubG9hZGVkICovCiAJaWYgKCFtZF9jbHVzdGVyX29wcyB8fCAhdHJ5X21vZHVsZV9nZXQobWRfY2x1c3Rlcl9tb2QpKSB7CisJCXByX2VycigiY2FuJ3QgZmluZCBtZC1jbHVzdGVyIG1vZHVsZSBvciBnZXQgaXQncyByZWZlcmVuY2UuXG4iKTsKIAkJc3Bpbl91bmxvY2soJnBlcnNfbG9jayk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KQEAgLTc4NjIsNiArNzg4Miw3IEBACiAJICovCiAKIAlkbyB7CisJCWludCBtZGRldjJfbWlub3IgPSAtMTsKIAkJbWRkZXYtPmN1cnJfcmVzeW5jID0gMjsKIAogCXRyeV9hZ2FpbjoKQEAgLTc4OTEsMTAgKzc5MTIsMTQgQEAKIAkJCQlwcmVwYXJlX3RvX3dhaXQoJnJlc3luY193YWl0LCAmd3EsIFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQkJaWYgKCF0ZXN0X2JpdChNRF9SRUNPVkVSWV9JTlRSLCAmbWRkZXYtPnJlY292ZXJ5KSAmJgogCQkJCSAgICBtZGRldjItPmN1cnJfcmVzeW5jID49IG1kZGV2LT5jdXJyX3Jlc3luYykgewotCQkJCQlwcmludGsoS0VSTl9JTkZPICJtZDogZGVsYXlpbmcgJXMgb2YgJXMiCi0JCQkJCSAgICAgICAiIHVudGlsICVzIGhhcyBmaW5pc2hlZCAodGhleSIKLQkJCQkJICAgICAgICIgc2hhcmUgb25lIG9yIG1vcmUgcGh5c2ljYWwgdW5pdHMpXG4iLAotCQkJCQkgICAgICAgZGVzYywgbWRuYW1lKG1kZGV2KSwgbWRuYW1lKG1kZGV2MikpOworCQkJCQlpZiAobWRkZXYyX21pbm9yICE9IG1kZGV2Mi0+bWRfbWlub3IpIHsKKwkJCQkJCW1kZGV2Ml9taW5vciA9IG1kZGV2Mi0+bWRfbWlub3I7CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICJtZDogZGVsYXlpbmcgJXMgb2YgJXMiCisJCQkJCQkgICAgICAgIiB1bnRpbCAlcyBoYXMgZmluaXNoZWQgKHRoZXkiCisJCQkJCQkgICAgICAgIiBzaGFyZSBvbmUgb3IgbW9yZSBwaHlzaWNhbCB1bml0cylcbiIsCisJCQkJCQkgICAgICAgZGVzYywgbWRuYW1lKG1kZGV2KSwKKwkJCQkJCSAgICAgICBtZG5hbWUobWRkZXYyKSk7CisJCQkJCX0KIAkJCQkJbWRkZXZfcHV0KG1kZGV2Mik7CiAJCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CkBAIC04Mjc1LDE2ICs4MzAwLDEzIEBACiBzdGF0aWMgdm9pZCBtZF9zdGFydF9zeW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpCiB7CiAJc3RydWN0IG1kZGV2ICptZGRldiA9IGNvbnRhaW5lcl9vZih3cywgc3RydWN0IG1kZGV2LCBkZWxfd29yayk7Ci0JaW50IHJldCA9IDA7CiAKIAltZGRldi0+c3luY190aHJlYWQgPSBtZF9yZWdpc3Rlcl90aHJlYWQobWRfZG9fc3luYywKIAkJCQkJCW1kZGV2LAogCQkJCQkJInJlc3luYyIpOwogCWlmICghbWRkZXYtPnN5bmNfdGhyZWFkKSB7Ci0JCWlmICghKG1kZGV2X2lzX2NsdXN0ZXJlZChtZGRldikgJiYgcmV0ID09IC1FQUdBSU4pKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IHN0YXJ0IHJlc3luYyIKLQkJCSAgICAgICAiIHRocmVhZC4uLlxuIiwKLQkJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IHN0YXJ0IHJlc3luYyB0aHJlYWQuLi5cbiIsCisJCSAgICAgICBtZG5hbWUobWRkZXYpKTsKIAkJLyogbGVhdmUgdGhlIHNwYXJlcyB3aGVyZSB0aGV5IGFyZSwgaXQgc2hvdWxkbid0IGh1cnQgKi8KIAkJY2xlYXJfYml0KE1EX1JFQ09WRVJZX1NZTkMsICZtZGRldi0+cmVjb3ZlcnkpOwogCQljbGVhcl9iaXQoTURfUkVDT1ZFUllfUkVTSEFQRSwgJm1kZGV2LT5yZWNvdmVyeSk7CkBAIC04ODc1LDcgKzg4OTcsOSBAQAogCQlsaXN0X2RlbCgmbm9kZV9kZXRlY3RlZF9kZXYtPmxpc3QpOwogCQlkZXYgPSBub2RlX2RldGVjdGVkX2Rldi0+ZGV2OwogCQlrZnJlZShub2RlX2RldGVjdGVkX2Rldik7CisJCW11dGV4X3VubG9jaygmZGV0ZWN0ZWRfZGV2aWNlc19tdXRleCk7CiAJCXJkZXYgPSBtZF9pbXBvcnRfZGV2aWNlKGRldiwwLCA5MCk7CisJCW11dGV4X2xvY2soJmRldGVjdGVkX2RldmljZXNfbXV0ZXgpOwogCQlpZiAoSVNfRVJSKHJkZXYpKQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuaCBiL2RyaXZlcnMvbWQvbWQuaAppbmRleCAyMGM2Njc1Li4yYjIwNDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmgKKysrIGIvZHJpdmVycy9tZC9tZC5oCkBAIC0yMDEsOSArMjAxLDggQEAKICNkZWZpbmUgTURfQ0hBTkdFX1BFTkRJTkcgMgkvKiBzd2l0Y2ggZnJvbSAnY2xlYW4nIHRvICdhY3RpdmUnIGluIHByb2dyZXNzICovCiAjZGVmaW5lIE1EX1VQREFURV9TQl9GTEFHUyAoMSB8IDIgfCA0KQkvKiBJZiB0aGVzZSBhcmUgc2V0LCBtZF91cGRhdGVfc2IgbmVlZGVkICovCiAjZGVmaW5lIE1EX0FSUkFZX0ZJUlNUX1VTRSAzICAgIC8qIEZpcnN0IHVzZSBvZiBhcnJheSwgbmVlZHMgaW5pdGlhbGl6YXRpb24gKi8KLSNkZWZpbmUgTURfU1RJTExfQ0xPU0VECTQJLyogSWYgc2V0LCB0aGVuIGFycmF5IGhhcyBub3QgYmVlbiBvcGVuZWQgc2luY2UKLQkJCQkgKiBtZF9pb2N0bCBjaGVja2VkIG9uIGl0LgotCQkJCSAqLworI2RlZmluZSBNRF9DTE9TSU5HCTQJLyogSWYgc2V0LCB3ZSBhcmUgY2xvc2luZyB0aGUgYXJyYXksIGRvIG5vdCBvcGVuCisJCQkJICogaXQgdGhlbiAqLwogI2RlZmluZSBNRF9KT1VSTkFMX0NMRUFOIDUJLyogQSByYWlkIHdpdGggam91cm5hbCBpcyBhbHJlYWR5IGNsZWFuICovCiAjZGVmaW5lIE1EX0hBU19KT1VSTkFMCTYJLyogVGhlIHJhaWQgYXJyYXkgaGFzIGpvdXJuYWwgZmVhdHVyZSBzZXQgKi8KICNkZWZpbmUgTURfUkVMT0FEX1NCCTcJLyogUmVsb2FkIHRoZSBzdXBlcmJsb2NrIGJlY2F1c2UgYW5vdGhlciBub2RlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggMjFkYzAwZS4uMTk2MWQ4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtMTQ1LDEyICsxNDUsOCBAQAogCXJldHVybiByMV9iaW87CiAKIG91dF9mcmVlX3BhZ2VzOgotCXdoaWxlICgtLWogPj0gMCkgewotCQlzdHJ1Y3QgYmlvX3ZlYyAqYnY7Ci0KLQkJYmlvX2Zvcl9lYWNoX3NlZ21lbnRfYWxsKGJ2LCByMV9iaW8tPmJpb3Nbal0sIGkpCi0JCQlfX2ZyZWVfcGFnZShidi0+YnZfcGFnZSk7Ci0JfQorCXdoaWxlICgtLWogPj0gMCkKKwkJYmlvX2ZyZWVfcGFnZXMocjFfYmlvLT5iaW9zW2pdKTsKIAogb3V0X2ZyZWVfYmlvOgogCXdoaWxlICgrK2ogPCBwaS0+cmFpZF9kaXNrcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDEwLmMgYi9kcml2ZXJzL21kL3JhaWQxMC5jCmluZGV4IDBlNGVmY2QuLmJlMWE5ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDEwLmMKKysrIGIvZHJpdmVycy9tZC9yYWlkMTAuYwpAQCAtMTA2NCw2ICsxMDY0LDggQEAKIAlpbnQgbWF4X3NlY3RvcnM7CiAJaW50IHNlY3RvcnM7CiAKKwltZF93cml0ZV9zdGFydChtZGRldiwgYmlvKTsKKwogCS8qCiAJICogUmVnaXN0ZXIgdGhlIG5ldyByZXF1ZXN0IGFuZCB3YWl0IGlmIHRoZSByZWNvbnN0cnVjdGlvbgogCSAqIHRocmVhZCBoYXMgcHV0IHVwIGEgYmFyIGZvciBuZXcgcmVxdWVzdHMuCkBAIC0xNDQ1LDggKzE0NDcsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JbWRfd3JpdGVfc3RhcnQobWRkZXYsIGJpbyk7Ci0KIAlkbyB7CiAKIAkJLyoKQEAgLTI0NjUsMjAgKzI0NjUsMjEgQEAKIAogCXdoaWxlIChzZWN0X3RvX3dyaXRlKSB7CiAJCXN0cnVjdCBiaW8gKndiaW87CisJCXNlY3Rvcl90IHdzZWN0b3I7CiAJCWlmIChzZWN0b3JzID4gc2VjdF90b193cml0ZSkKIAkJCXNlY3RvcnMgPSBzZWN0X3RvX3dyaXRlOwogCQkvKiBXcml0ZSBhdCAnc2VjdG9yJyBmb3IgJ3NlY3RvcnMnICovCiAJCXdiaW8gPSBiaW9fY2xvbmVfbWRkZXYoYmlvLCBHRlBfTk9JTywgbWRkZXYpOwogCQliaW9fdHJpbSh3YmlvLCBzZWN0b3IgLSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yLCBzZWN0b3JzKTsKLQkJd2Jpby0+YmlfaXRlci5iaV9zZWN0b3IgPSAocjEwX2Jpby0+ZGV2c1tpXS5hZGRyKwotCQkJCSAgIGNob29zZV9kYXRhX29mZnNldChyMTBfYmlvLCByZGV2KSArCi0JCQkJICAgKHNlY3RvciAtIHIxMF9iaW8tPnNlY3RvcikpOworCQl3c2VjdG9yID0gcjEwX2Jpby0+ZGV2c1tpXS5hZGRyICsgKHNlY3RvciAtIHIxMF9iaW8tPnNlY3Rvcik7CisJCXdiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yID0gd3NlY3RvciArCisJCQkJICAgY2hvb3NlX2RhdGFfb2Zmc2V0KHIxMF9iaW8sIHJkZXYpOwogCQl3YmlvLT5iaV9iZGV2ID0gcmRldi0+YmRldjsKIAkJYmlvX3NldF9vcF9hdHRycyh3YmlvLCBSRVFfT1BfV1JJVEUsIDApOwogCiAJCWlmIChzdWJtaXRfYmlvX3dhaXQod2JpbykgPCAwKQogCQkJLyogRmFpbHVyZSEgKi8KLQkJCW9rID0gcmRldl9zZXRfYmFkYmxvY2tzKHJkZXYsIHNlY3RvciwKKwkJCW9rID0gcmRldl9zZXRfYmFkYmxvY2tzKHJkZXYsIHdzZWN0b3IsCiAJCQkJCQlzZWN0b3JzLCAwKQogCQkJCSYmIG9rOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmMgYi9kcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmMKaW5kZXggNTFmNzZkZC4uMWIxYWI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUtY2FjaGUuYwpAQCAtOTYsNyArOTYsNiBAQAogCXNwaW5sb2NrX3Qgbm9fc3BhY2Vfc3RyaXBlc19sb2NrOwogCiAJYm9vbCBuZWVkX2NhY2hlX2ZsdXNoOwotCWJvb2wgaW5fdGVhcmRvd247CiB9OwogCiAvKgpAQCAtNzA0LDMxICs3MDMsMjIgQEAKIAogCW1kZGV2ID0gbG9nLT5yZGV2LT5tZGRldjsKIAkvKgotCSAqIFRoaXMgaXMgdG8gYXZvaWQgYSBkZWFkbG9jay4gcjVsX3F1aWVzY2UgaG9sZHMgcmVjb25maWdfbXV0ZXggYW5kCi0JICogd2FpdCBmb3IgdGhpcyB0aHJlYWQgdG8gZmluaXNoLiBUaGlzIHRocmVhZCB3YWl0cyBmb3IKLQkgKiBNRF9DSEFOR0VfUEVORElORyBjbGVhciwgd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgZG9uZSBpbgotCSAqIG1kX2NoZWNrX3JlY292ZXJ5KCkuIG1kX2NoZWNrX3JlY292ZXJ5KCkgdHJpZXMgdG8gZ2V0Ci0JICogcmVjb25maWdfbXV0ZXguIFNpbmNlIHI1bF9xdWllc2NlIGFscmVhZHkgaG9sZHMgdGhlIG11dGV4LAotCSAqIG1kX2NoZWNrX3JlY292ZXJ5KCkgZmFpbHMsIHNvIHRoZSBQRU5ESU5HIG5ldmVyIGdldCBjbGVhcmVkLiBUaGUKLQkgKiBpbl90ZWFyZG93biBjaGVjayB3b3JrYXJvdW5kIHRoaXMgaXNzdWUuCisJICogRGlzY2FyZCBjb3VsZCB6ZXJvIGRhdGEsIHNvIGJlZm9yZSBkaXNjYXJkIHdlIG11c3QgbWFrZSBzdXJlCisJICogc3VwZXJibG9jayBpcyB1cGRhdGVkIHRvIG5ldyBsb2cgdGFpbC4gVXBkYXRpbmcgc3VwZXJibG9jayAoZWl0aGVyCisJICogZGlyZWN0bHkgY2FsbCBtZF91cGRhdGVfc2IoKSBvciBkZXBlbmQgb24gbWQgdGhyZWFkKSBtdXN0IGhvbGQKKwkgKiByZWNvbmZpZyBtdXRleC4gT24gdGhlIG90aGVyIGhhbmQsIHJhaWQ1X3F1aWVzY2UgaXMgY2FsbGVkIHdpdGgKKwkgKiByZWNvbmZpZ19tdXRleCBob2xkLiBUaGUgZmlyc3Qgc3RlcCBvZiByYWlkNV9xdWllc2NlKCkgaXMgd2FpdHRpbmcKKwkgKiBmb3IgYWxsIElPIGZpbmlzaCwgaGVuY2Ugd2FpdHRpbmcgZm9yIHJlY2xhaW0gdGhyZWFkLCB3aGlsZSByZWNsYWltCisJICogdGhyZWFkIGlzIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhbmQgd2FpdHRpbmcgZm9yIHJlY29uZmlnIG11dGV4LiBTbworCSAqIHRoZXJlIGlzIGEgZGVhZGxvY2suIFdlIHdvcmthcm91bmQgdGhpcyBpc3N1ZSB3aXRoIGEgdHJ5bG9jay4KKwkgKiBGSVhNRTogd2UgY291bGQgbWlzcyBkaXNjYXJkIGlmIHdlIGNhbid0IHRha2UgcmVjb25maWcgbXV0ZXgKIAkgKi8KLQlpZiAoIWxvZy0+aW5fdGVhcmRvd24pIHsKLQkJc2V0X21hc2tfYml0cygmbWRkZXYtPmZsYWdzLCAwLAotCQkJICAgICAgQklUKE1EX0NIQU5HRV9ERVZTKSB8IEJJVChNRF9DSEFOR0VfUEVORElORykpOwotCQltZF93YWtldXBfdGhyZWFkKG1kZGV2LT50aHJlYWQpOwotCQl3YWl0X2V2ZW50KG1kZGV2LT5zYl93YWl0LAotCQkJIXRlc3RfYml0KE1EX0NIQU5HRV9QRU5ESU5HLCAmbWRkZXYtPmZsYWdzKSB8fAotCQkJbG9nLT5pbl90ZWFyZG93bik7Ci0JCS8qCi0JCSAqIHI1bF9xdWllc2NlIGNvdWxkIHJ1biBhZnRlciBpbl90ZWFyZG93biBjaGVjayBhbmQgaG9sZAotCQkgKiBtdXRleCBmaXJzdC4gU3VwZXJibG9jayBtaWdodCBnZXQgdXBkYXRlZCB0d2ljZS4KLQkJICovCi0JCWlmIChsb2ctPmluX3RlYXJkb3duKQotCQkJbWRfdXBkYXRlX3NiKG1kZGV2LCAxKTsKLQl9IGVsc2UgewotCQlXQVJOX09OKCFtZGRldl9pc19sb2NrZWQobWRkZXYpKTsKLQkJbWRfdXBkYXRlX3NiKG1kZGV2LCAxKTsKLQl9CisJc2V0X21hc2tfYml0cygmbWRkZXYtPmZsYWdzLCAwLAorCQlCSVQoTURfQ0hBTkdFX0RFVlMpIHwgQklUKE1EX0NIQU5HRV9QRU5ESU5HKSk7CisJaWYgKCFtZGRldl90cnlsb2NrKG1kZGV2KSkKKwkJcmV0dXJuOworCW1kX3VwZGF0ZV9zYihtZGRldiwgMSk7CisJbWRkZXZfdW5sb2NrKG1kZGV2KTsKIAogCS8qIGRpc2NhcmQgSU8gZXJyb3IgcmVhbGx5IGRvZXNuJ3QgbWF0dGVyLCBpZ25vcmUgaXQgKi8KIAlpZiAobG9nLT5sYXN0X2NoZWNrcG9pbnQgPCBlbmQpIHsKQEAgLTgyNyw3ICs4MTcsNiBAQAogCWlmICghbG9nIHx8IHN0YXRlID09IDIpCiAJCXJldHVybjsKIAlpZiAoc3RhdGUgPT0gMCkgewotCQlsb2ctPmluX3RlYXJkb3duID0gMDsKIAkJLyoKIAkJICogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgaG90YWRkLiBJbiBzdXNwZW5kLCB0aGUgYXJyYXkgaGFzCiAJCSAqIG5vIGpvdXJuYWwuIEluIHJlc3VtZSwgam91cm5hbCBpcyBpbml0aWFsaXplZCBhcyB3ZWxsIGFzIHRoZQpAQCAtODM4LDExICs4MjcsNiBAQAogCQlsb2ctPnJlY2xhaW1fdGhyZWFkID0gbWRfcmVnaXN0ZXJfdGhyZWFkKHI1bF9yZWNsYWltX3RocmVhZCwKIAkJCQkJbG9nLT5yZGV2LT5tZGRldiwgInJlY2xhaW0iKTsKIAl9IGVsc2UgaWYgKHN0YXRlID09IDEpIHsKLQkJLyoKLQkJICogYXQgdGhpcyBwb2ludCBhbGwgc3RyaXBlcyBhcmUgZmluaXNoZWQsIHNvIGlvX3VuaXQgaXMgYXQKLQkJICogbGVhc3QgaW4gU1RSSVBFX0VORCBzdGF0ZQotCQkgKi8KLQkJbG9nLT5pbl90ZWFyZG93biA9IDE7CiAJCS8qIG1ha2Ugc3VyZSByNWxfd3JpdGVfc3VwZXJfYW5kX2Rpc2NhcmRfc3BhY2UgZXhpdHMgKi8KIAkJbWRkZXYgPSBsb2ctPnJkZXYtPm1kZGV2OwogCQl3YWtlX3VwKCZtZGRldi0+c2Jfd2FpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmMgYi9kcml2ZXJzL21kL3JhaWQ1LmMKaW5kZXggODkxMjQwNy4uOTJhYzI1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuYwpAQCAtNjU5LDYgKzY1OSw3IEBACiB7CiAJc3RydWN0IHN0cmlwZV9oZWFkICpzaDsKIAlpbnQgaGFzaCA9IHN0cmlwZV9oYXNoX2xvY2tzX2hhc2goc2VjdG9yKTsKKwlpbnQgaW5jX2VtcHR5X2luYWN0aXZlX2xpc3RfZmxhZzsKIAogCXByX2RlYnVnKCJnZXRfc3RyaXBlLCBzZWN0b3IgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IpOwogCkBAIC03MDMsNyArNzA0LDEyIEBACiAJCQkJCWF0b21pY19pbmMoJmNvbmYtPmFjdGl2ZV9zdHJpcGVzKTsKIAkJCQlCVUdfT04obGlzdF9lbXB0eSgmc2gtPmxydSkgJiYKIAkJCQkgICAgICAgIXRlc3RfYml0KFNUUklQRV9FWFBBTkRJTkcsICZzaC0+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+ZXh0ZXJuYWwgPT0gMCkpIHsKIAkJCXNwaW5fbG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKIAkJCWJpb19saXN0X21lcmdlKCZjb25mLT5yZXR1cm5fYmksICZzLnJldHVybl9iaSk7CiAJCQlzcGluX3VubG9ja19pcnEoJmNvbmYtPmRldmljZV9sb2NrKTsKQEAgLTYzMzAsMjIgKzYzNDksMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCByYWlkNDU2X2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXN0cnVjdCByNWNvbmYgKmNvbmYgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCByNWNvbmYsIG5vZGUpOworCisJZnJlZV9zY3JhdGNoX2J1ZmZlcihjb25mLCBwZXJfY3B1X3B0cihjb25mLT5wZXJjcHUsIGNwdSkpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCByYWlkNV9mcmVlX3BlcmNwdShzdHJ1Y3QgcjVjb25mICpjb25mKQogewotCXVuc2lnbmVkIGxvbmcgY3B1OwotCiAJaWYgKCFjb25mLT5wZXJjcHUpCiAJCXJldHVybjsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCXVucmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZjb25mLT5jcHVfbm90aWZ5KTsKLSNlbmRpZgotCi0JZ2V0X29ubGluZV9jcHVzKCk7Ci0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJZnJlZV9zY3JhdGNoX2J1ZmZlcihjb25mLCBwZXJfY3B1X3B0cihjb25mLT5wZXJjcHUsIGNwdSkpOwotCXB1dF9vbmxpbmVfY3B1cygpOwotCisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlKENQVUhQX01EX1JBSUQ1X1BSRVBBUkUsICZjb25mLT5ub2RlKTsKIAlmcmVlX3BlcmNwdShjb25mLT5wZXJjcHUpOwogfQogCkBAIC02MzUzLDcgKzYzNzAsNyBAQAogewogCWlmIChjb25mLT5sb2cpCiAJCXI1bF9leGl0X2xvZyhjb25mLT5sb2cpOwotCWlmIChjb25mLT5zaHJpbmtlci5zZWVrcykKKwlpZiAoY29uZi0+c2hyaW5rZXIubnJfZGVmZXJyZWQpCiAJCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmNvbmYtPnNocmlua2VyKTsKIAogCWZyZWVfdGhyZWFkX2dyb3Vwcyhjb25mKTsKQEAgLTYzNjQsNjQgKzYzODEsMjggQEAKIAlrZnJlZShjb25mKTsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotc3RhdGljIGludCByYWlkNDU2X2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJICAgICAgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgcmFpZDQ1Nl9jcHVfdXBfcHJlcGFyZSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgcjVjb25mICpjb25mID0gY29udGFpbmVyX29mKG5mYiwgc3RydWN0IHI1Y29uZiwgY3B1X25vdGlmeSk7Ci0JbG9uZyBjcHUgPSAobG9uZyloY3B1OworCXN0cnVjdCByNWNvbmYgKmNvbmYgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCByNWNvbmYsIG5vZGUpOwogCXN0cnVjdCByYWlkNV9wZXJjcHUgKnBlcmNwdSA9IHBlcl9jcHVfcHRyKGNvbmYtPnBlcmNwdSwgY3B1KTsKIAotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKLQkJaWYgKGFsbG9jX3NjcmF0Y2hfYnVmZmVyKGNvbmYsIHBlcmNwdSkpIHsKLQkJCXByX2VycigiJXM6IGZhaWxlZCBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgY3B1JWxkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBjcHUpOwotCQkJcmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oLUVOT01FTSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQljYXNlIENQVV9VUF9DQU5DRUxFRDoKLQljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46Ci0JCWZyZWVfc2NyYXRjaF9idWZmZXIoY29uZiwgcGVyX2NwdV9wdHIoY29uZi0+cGVyY3B1LCBjcHUpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CisJaWYgKGFsbG9jX3NjcmF0Y2hfYnVmZmVyKGNvbmYsIHBlcmNwdSkpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBjcHUldVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBjcHUpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCiBzdGF0aWMgaW50IHJhaWQ1X2FsbG9jX3BlcmNwdShzdHJ1Y3QgcjVjb25mICpjb25mKQogewotCXVuc2lnbmVkIGxvbmcgY3B1OwogCWludCBlcnIgPSAwOwogCiAJY29uZi0+cGVyY3B1ID0gYWxsb2NfcGVyY3B1KHN0cnVjdCByYWlkNV9wZXJjcHUpOwogCWlmICghY29uZi0+cGVyY3B1KQogCQlyZXR1cm4gLUVOT01FTTsKIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCWNvbmYtPmNwdV9ub3RpZnkubm90aWZpZXJfY2FsbCA9IHJhaWQ0NTZfY3B1X25vdGlmeTsKLQljb25mLT5jcHVfbm90aWZ5LnByaW9yaXR5ID0gMDsKLQllcnIgPSByZWdpc3Rlcl9jcHVfbm90aWZpZXIoJmNvbmYtPmNwdV9ub3RpZnkpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0jZW5kaWYKLQotCWdldF9vbmxpbmVfY3B1cygpOwotCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGNwdSkgewotCQllcnIgPSBhbGxvY19zY3JhdGNoX2J1ZmZlcihjb25mLCBwZXJfY3B1X3B0cihjb25mLT5wZXJjcHUsIGNwdSkpOwotCQlpZiAoZXJyKSB7Ci0JCQlwcl9lcnIoIiVzOiBmYWlsZWQgbWVtb3J5IGFsbG9jYXRpb24gZm9yIGNwdSVsZFxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXywgY3B1KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXB1dF9vbmxpbmVfY3B1cygpOwotCisJZXJyID0gY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlKENQVUhQX01EX1JBSUQ1X1BSRVBBUkUsICZjb25mLT5ub2RlKTsKIAlpZiAoIWVycikgewogCQljb25mLT5zY3JpYmJsZV9kaXNrcyA9IG1heChjb25mLT5yYWlkX2Rpc2tzLAogCQkJY29uZi0+cHJldmlvdXNfcmFpZF9kaXNrcyk7CkBAIC02NjIwLDYgKzY2MDEsMTYgQEAKIAl9CiAKIAljb25mLT5taW5fbnJfc3RyaXBlcyA9IE5SX1NUUklQRVM7CisJaWYgKG1kZGV2LT5yZXNoYXBlX3Bvc2l0aW9uICE9IE1heFNlY3RvcikgeworCQlpbnQgc3RyaXBlcyA9IG1heF90KGludCwKKwkJCSgobWRkZXYtPmNodW5rX3NlY3RvcnMgPDwgOSkgLyBTVFJJUEVfU0laRSkgKiA0LAorCQkJKChtZGRldi0+bmV3X2NodW5rX3NlY3RvcnMgPDwgOSkgLyBTVFJJUEVfU0laRSkgKiA0KTsKKwkJY29uZi0+bWluX25yX3N0cmlwZXMgPSBtYXgoTlJfU1RSSVBFUywgc3RyaXBlcyk7CisJCWlmIChjb25mLT5taW5fbnJfc3RyaXBlcyAhPSBOUl9TVFJJUEVTKQorCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSJtZC9yYWlkOiVzOiBmb3JjZSBzdHJpcGUgc2l6ZSAlZCBmb3IgcmVzaGFwZVxuIiwKKwkJCQltZG5hbWUobWRkZXYpLCBjb25mLT5taW5fbnJfc3RyaXBlcyk7CisJfQogCW1lbW9yeSA9IGNvbmYtPm1pbl9ucl9zdHJpcGVzICogKHNpemVvZihzdHJ1Y3Qgc3RyaXBlX2hlYWQpICsKIAkJIG1heF9kaXNrcyAqICgoc2l6ZW9mKHN0cnVjdCBiaW8pICsgUEFHRV9TSVpFKSkpIC8gMTAyNDsKIAlhdG9taWNfc2V0KCZjb25mLT5lbXB0eV9pbmFjdGl2ZV9saXN0X25yLCBOUl9TVFJJUEVfSEFTSF9MT0NLUyk7CkBAIC02NjQxLDcgKzY2MzIsMTIgQEAKIAljb25mLT5zaHJpbmtlci5jb3VudF9vYmplY3RzID0gcmFpZDVfY2FjaGVfY291bnQ7CiAJY29uZi0+c2hyaW5rZXIuYmF0Y2ggPSAxMjg7CiAJY29uZi0+c2hyaW5rZXIuZmxhZ3MgPSAwOwotCXJlZ2lzdGVyX3Nocmlua2VyKCZjb25mLT5zaHJpbmtlcik7CisJaWYgKHJlZ2lzdGVyX3Nocmlua2VyKCZjb25mLT5zaHJpbmtlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAibWQvcmFpZDolczogY291bGRuJ3QgcmVnaXN0ZXIgc2hyaW5rZXIuXG4iLAorCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7CisJCWdvdG8gYWJvcnQ7CisJfQogCiAJc3ByaW50ZihwZXJzX25hbWUsICJyYWlkJWQiLCBtZGRldi0+bmV3X2xldmVsKTsKIAljb25mLT50aHJlYWQgPSBtZF9yZWdpc3Rlcl90aHJlYWQocmFpZDVkLCBtZGRldiwgcGVyc19uYW1lKTsKQEAgLTY4MjYsMTEgKzY4MjIsMTQgQEAKIAlpZiAoSVNfRVJSKGNvbmYpKQogCQlyZXR1cm4gUFRSX0VSUihjb25mKTsKIAotCWlmICh0ZXN0X2JpdChNRF9IQVNfSk9VUk5BTCwgJm1kZGV2LT5mbGFncykgJiYgIWpvdXJuYWxfZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibWQvcmFpZDolczogam91cm5hbCBkaXNrIGlzIG1pc3NpbmcsIGZvcmNlIGFycmF5IHJlYWRvbmx5XG4iLAotCQkgICAgICAgbWRuYW1lKG1kZGV2KSk7Ci0JCW1kZGV2LT5ybyA9IDE7Ci0JCXNldF9kaXNrX3JvKG1kZGV2LT5nZW5kaXNrLCAxKTsKKwlpZiAodGVzdF9iaXQoTURfSEFTX0pPVVJOQUwsICZtZGRldi0+ZmxhZ3MpKSB7CisJCWlmICgham91cm5hbF9kZXYpIHsKKwkJCXByX2VycigibWQvcmFpZDolczogam91cm5hbCBkaXNrIGlzIG1pc3NpbmcsIGZvcmNlIGFycmF5IHJlYWRvbmx5XG4iLAorCQkJICAgICAgIG1kbmFtZShtZGRldikpOworCQkJbWRkZXYtPnJvID0gMTsKKwkJCXNldF9kaXNrX3JvKG1kZGV2LT5nZW5kaXNrLCAxKTsKKwkJfSBlbHNlIGlmIChtZGRldi0+cmVjb3ZlcnlfY3AgPT0gTWF4U2VjdG9yKQorCQkJc2V0X2JpdChNRF9KT1VSTkFMX0NMRUFOLCAmbWRkZXYtPmZsYWdzKTsKIAl9CiAKIAljb25mLT5taW5fb2Zmc2V0X2RpZmYgPSBtaW5fb2Zmc2V0X2RpZmY7CkBAIC03MDM0LDYgKzcwMzMsOCBAQAogCQllbHNlCiAJCQlxdWV1ZV9mbGFnX2NsZWFyX3VubG9ja2VkKFFVRVVFX0ZMQUdfRElTQ0FSRCwKIAkJCQkJCW1kZGV2LT5xdWV1ZSk7CisKKwkJYmxrX3F1ZXVlX21heF9od19zZWN0b3JzKG1kZGV2LT5xdWV1ZSwgVUlOVF9NQVgpOwogCX0KIAogCWlmIChqb3VybmFsX2RldikgewpAQCAtNzk1MywxMCArNzk1NCwyMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCByYWlkNV9pbml0KHZvaWQpCiB7CisJaW50IHJldDsKKwogCXJhaWQ1X3dxID0gYWxsb2Nfd29ya3F1ZXVlKCJyYWlkNXdxIiwKIAkJV1FfVU5CT1VORHxXUV9NRU1fUkVDTEFJTXxXUV9DUFVfSU5URU5TSVZFfFdRX1NZU0ZTLCAwKTsKIAlpZiAoIXJhaWQ1X3dxKQogCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX01EX1JBSUQ1X1BSRVBBUkUsCisJCQkJICAgICAgIm1kL3JhaWQ1OnByZXBhcmUiLAorCQkJCSAgICAgIHJhaWQ0NTZfY3B1X3VwX3ByZXBhcmUsCisJCQkJICAgICAgcmFpZDQ1Nl9jcHVfZGVhZCk7CisJaWYgKHJldCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShyYWlkNV93cSk7CisJCXJldHVybiByZXQ7CisJfQogCXJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KCZyYWlkNl9wZXJzb25hbGl0eSk7CiAJcmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkoJnJhaWQ1X3BlcnNvbmFsaXR5KTsKIAlyZWdpc3Rlcl9tZF9wZXJzb25hbGl0eSgmcmFpZDRfcGVyc29uYWxpdHkpOwpAQCAtNzk2OCw2ICs3OTgwLDcgQEAKIAl1bnJlZ2lzdGVyX21kX3BlcnNvbmFsaXR5KCZyYWlkNl9wZXJzb25hbGl0eSk7CiAJdW5yZWdpc3Rlcl9tZF9wZXJzb25hbGl0eSgmcmFpZDVfcGVyc29uYWxpdHkpOwogCXVucmVnaXN0ZXJfbWRfcGVyc29uYWxpdHkoJnJhaWQ0X3BlcnNvbmFsaXR5KTsKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoQ1BVSFBfTURfUkFJRDVfUFJFUEFSRSk7CiAJZGVzdHJveV93b3JrcXVldWUocmFpZDVfd3EpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ1LmggYi9kcml2ZXJzL21kL3JhaWQ1LmgKaW5kZXggNTE3ZDRiNi4uNTdlYzQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkNS5oCisrKyBiL2RyaXZlcnMvbWQvcmFpZDUuaApAQCAtNTEyLDkgKzUxMiw3IEBACiAJfSBfX3BlcmNwdSAqcGVyY3B1OwogCWludCBzY3JpYmJsZV9kaXNrczsKIAlpbnQgc2NyaWJibGVfc2VjdG9yczsKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJY3B1X25vdGlmeTsKLSNlbmRpZgorCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CiAKIAkvKgogCSAqIEZyZWUgc3RyaXBlcyBwb29sCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NlYy1lZGlkLmMgYi9kcml2ZXJzL21lZGlhL2NlYy1lZGlkLmMKaW5kZXggNzAwMTgyNC4uNTcxOWI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jZWMtZWRpZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY2VjLWVkaWQuYwpAQCAtNzAsNyArNzAsMTAgQEAKIAkJCQl1OCB0YWcgPSBlZGlkW2ldID4+IDU7CiAJCQkJdTggbGVuID0gZWRpZFtpXSAmIDB4MWY7CiAKLQkJCQlpZiAodGFnID09IDMgJiYgbGVuID49IDUgJiYgaSArIGxlbiA8PSBlbmQpCisJCQkJaWYgKHRhZyA9PSAzICYmIGxlbiA+PSA1ICYmIGkgKyBsZW4gPD0gZW5kICYmCisJCQkJICAgIGVkaWRbaSArIDFdID09IDB4MDMgJiYKKwkJCQkgICAgZWRpZFtpICsgMl0gPT0gMHgwYyAmJgorCQkJCSAgICBlZGlkW2kgKyAzXSA9PSAweDAwKQogCQkJCQlyZXR1cm4gaSArIDQ7CiAJCQkJaSArPSBsZW4gKyAxOwogCQkJfSB3aGlsZSAoaSA8IGVuZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvcnRsMjgzMl9zZHIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9ydGwyODMyX3Nkci5jCmluZGV4IDZlMjJhZjMuLmUwMzhlODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9ydGwyODMyX3Nkci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9ydGwyODMyX3Nkci5jCkBAIC0zOTIsNyArMzkyLDYgQEAKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiYWxsb2MgdXJiPSVkXG4iLCBpKTsKIAkJZGV2LT51cmJfbGlzdFtpXSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CiAJCWlmICghZGV2LT51cmJfbGlzdFtpXSkgewotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiZmFpbGVkXG4iKTsKIAkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCiAJCQkJdXNiX2ZyZWVfdXJiKGRldi0+dXJiX2xpc3Rbal0pOwogCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BjaS9jeDIzODg1L2N4MjM4ODUtNDE3LmMgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDIzODg1L2N4MjM4ODUtNDE3LmMKaW5kZXggZWZlYzJkMS4uNGQwODBkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvY3gyMzg4NS9jeDIzODg1LTQxNy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjM4ODUvY3gyMzg4NS00MTcuYwpAQCAtMTU1Miw2ICsxNTUyLDcgQEAKIAlxLT5tZW1fb3BzID0gJnZiMl9kbWFfc2dfbWVtb3BzOwogCXEtPnRpbWVzdGFtcF9mbGFncyA9IFY0TDJfQlVGX0ZMQUdfVElNRVNUQU1QX01PTk9UT05JQzsKIAlxLT5sb2NrID0gJmRldi0+bG9jazsKKwlxLT5kZXYgPSAmZGV2LT5wY2ktPmRldjsKIAogCWVyciA9IHZiMl9xdWV1ZV9pbml0KHEpOwogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWR2Yi5jCmluZGV4IGRiOTg3ZTUuLjU5YTRiNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKQEAgLTEyMzgsNiArMTIzOCw3IEBACiAJcS0+YnVmX3N0cnVjdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBzYWE3MTM0X2J1Zik7CiAJcS0+dGltZXN0YW1wX2ZsYWdzID0gVjRMMl9CVUZfRkxBR19USU1FU1RBTVBfTU9OT1RPTklDOwogCXEtPmxvY2sgPSAmZGV2LT5sb2NrOworCXEtPmRldiA9ICZkZXYtPnBjaS0+ZGV2OwogCXJldCA9IHZiMl9xdWV1ZV9pbml0KHEpOwogCWlmIChyZXQpIHsKIAkJdmIyX2R2Yl9kZWFsbG9jX2Zyb250ZW5kcygmZGV2LT5mcm9udGVuZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYyBiL2RyaXZlcnMvbWVkaWEvcGNpL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKaW5kZXggY2E0MTdhNC4uNzkxYTUxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wY2kvc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCkBAIC0yOTUsNiArMjk1LDcgQEAKIAlxLT5idWZfc3RydWN0X3NpemUgPSBzaXplb2Yoc3RydWN0IHNhYTcxMzRfYnVmKTsKIAlxLT50aW1lc3RhbXBfZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX1RJTUVTVEFNUF9NT05PVE9OSUM7CiAJcS0+bG9jayA9ICZkZXYtPmxvY2s7CisJcS0+ZGV2ID0gJmRldi0+cGNpLT5kZXY7CiAJZXJyID0gdmIyX3F1ZXVlX2luaXQocSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vS2NvbmZpZwppbmRleCBmMjUzNDRiLi41NTJiNjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9LY29uZmlnCkBAIC0xNjksNyArMTY5LDcgQEAKIGNvbmZpZyBWSURFT19NRURJQVRFS19WQ09ERUMKIAl0cmlzdGF0ZSAiTWVkaWF0ZWsgVmlkZW8gQ29kZWMgZHJpdmVyIgogCWRlcGVuZHMgb24gTVRLX0lPTU1VIHx8IENPTVBJTEVfVEVTVAotCWRlcGVuZHMgb24gVklERU9fREVWICYmIFZJREVPX1Y0TDIKKwlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBWSURFT19WNEwyICYmIEhBU19ETUEKIAlkZXBlbmRzIG9uIEFSQ0hfTUVESUFURUsgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IFZJREVPQlVGMl9ETUFfQ09OVElHCiAJc2VsZWN0IFY0TDJfTUVNMk1FTV9ERVYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2Rydi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZHJ2LmgKaW5kZXggOTRmMGE0Mi4uM2E4ZTY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZHJ2LmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZHJ2LmgKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KIAotI2luY2x1ZGUgIm10a192Y29kZWNfdXRpbC5oIgogCiAjZGVmaW5lIE1US19WQ09ERUNfRFJWX05BTUUJIm10a192Y29kZWNfZHJ2IgogI2RlZmluZSBNVEtfVkNPREVDX0VOQ19OQU1FCSJtdGstdmNvZGVjLWVuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuYy5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jLmMKaW5kZXggM2VkM2YyZC4uMmM1NzE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jLmMKQEAgLTQ4Nyw3ICs0ODcsNiBAQAogCXN0cnVjdCBtdGtfcV9kYXRhICpxX2RhdGE7CiAJaW50IHJldCwgaTsKIAlzdHJ1Y3QgbXRrX3ZpZGVvX2ZtdCAqZm10OwotCXVuc2lnbmVkIGludCBwaXRjaF93X2RpdjE2OwogCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXhfZm10X21wID0gJmYtPmZtdC5waXhfbXA7CiAKIAl2cSA9IHY0bDJfbTJtX2dldF92cShjdHgtPm0ybV9jdHgsIGYtPnR5cGUpOwpAQCAtNTMwLDE1ICs1MjksNiBAQAogCXFfZGF0YS0+Y29kZWRfd2lkdGggPSBmLT5mbXQucGl4X21wLndpZHRoOwogCXFfZGF0YS0+Y29kZWRfaGVpZ2h0ID0gZi0+Zm10LnBpeF9tcC5oZWlnaHQ7CiAKLQlwaXRjaF93X2RpdjE2ID0gRElWX1JPVU5EX1VQKHFfZGF0YS0+dmlzaWJsZV93aWR0aCwgMTYpOwotCWlmIChwaXRjaF93X2RpdjE2ICUgOCAhPSAwKSB7Ci0JCS8qIEFkanVzdCByZXR1cm5lZCB3aWR0aC9oZWlnaHQsIHNvIGFwcGxpY2F0aW9uIGNvdWxkIGNvcnJlY3RseQotCQkgKiBhbGxvY2F0ZSBodyByZXF1aXJlZCBtZW1vcnkKLQkJICovCi0JCXFfZGF0YS0+dmlzaWJsZV9oZWlnaHQgKz0gMzI7Ci0JCXZpZGlvY190cnlfZm10KGYsIHFfZGF0YS0+Zm10KTsKLQl9Ci0KIAlxX2RhdGEtPmZpZWxkID0gZi0+Zm10LnBpeF9tcC5maWVsZDsKIAljdHgtPmNvbG9yc3BhY2UgPSBmLT5mbXQucGl4X21wLmNvbG9yc3BhY2U7CiAJY3R4LT55Y2Jjcl9lbmMgPSBmLT5mbXQucGl4X21wLnljYmNyX2VuYzsKQEAgLTg3OCw3ICs4NjgsOCBAQAogewogCXN0cnVjdCBtdGtfdmNvZGVjX2N0eCAqY3R4ID0gcHJpdjsKIAlpbnQgcmV0OwotCXN0cnVjdCB2YjJfYnVmZmVyICpkc3RfYnVmOworCXN0cnVjdCB2YjJfYnVmZmVyICpzcmNfYnVmLCAqZHN0X2J1ZjsKKwlzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyICpkc3RfdmIyX3Y0bDIsICpzcmNfdmIyX3Y0bDI7CiAJc3RydWN0IG10a192Y29kZWNfbWVtIGJzX2J1ZjsKIAlzdHJ1Y3QgdmVuY19kb25lX3Jlc3VsdCBlbmNfcmVzdWx0OwogCkBAIC05MTEsNiArOTAyLDE1IEBACiAJCW10a192NGwyX2VycigidmVuY19pZl9lbmNvZGUgZmFpbGVkPSVkIiwgcmV0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCXNyY19idWYgPSB2NGwyX20ybV9uZXh0X3NyY19idWYoY3R4LT5tMm1fY3R4KTsKKwlpZiAoc3JjX2J1ZikgeworCQlzcmNfdmIyX3Y0bDIgPSB0b192YjJfdjRsMl9idWZmZXIoc3JjX2J1Zik7CisJCWRzdF92YjJfdjRsMiA9IHRvX3ZiMl92NGwyX2J1ZmZlcihkc3RfYnVmKTsKKwkJZHN0X2J1Zi0+dGltZXN0YW1wID0gc3JjX2J1Zi0+dGltZXN0YW1wOworCQlkc3RfdmIyX3Y0bDItPnRpbWVjb2RlID0gc3JjX3ZiMl92NGwyLT50aW1lY29kZTsKKwl9IGVsc2UgeworCQltdGtfdjRsMl9lcnIoIk5vIHRpbWVzdGFtcCBmb3IgdGhlIGhlYWRlciBidWZmZXIuIik7CisJfQogCiAJY3R4LT5zdGF0ZSA9IE1US19TVEFURV9IRUFERVI7CiAJZHN0X2J1Zi0+cGxhbmVzWzBdLmJ5dGVzdXNlZCA9IGVuY19yZXN1bHQuYnNfc2l6ZTsKQEAgLTEwMDMsNyArMTAwMyw3IEBACiAJc3RydWN0IG10a192Y29kZWNfbWVtIGJzX2J1ZjsKIAlzdHJ1Y3QgdmVuY19kb25lX3Jlc3VsdCBlbmNfcmVzdWx0OwogCWludCByZXQsIGk7Ci0Jc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqdmIyX3Y0bDI7CisJc3RydWN0IHZiMl92NGwyX2J1ZmZlciAqZHN0X3ZiMl92NGwyLCAqc3JjX3ZiMl92NGwyOwogCiAJLyogY2hlY2sgZHN0X2J1ZiwgZHN0X2J1ZiBtYXkgYmUgcmVtb3ZlZCBpbiBkZXZpY2VfcnVuCiAJICogdG8gc3RvcmVkIGVuY2RvZSBoZWFkZXIgc28gd2UgbmVlZCBjaGVjayBkc3RfYnVmIGFuZApAQCAtMTA0Myw5ICsxMDQzLDE0IEBACiAJcmV0ID0gdmVuY19pZl9lbmNvZGUoY3R4LCBWRU5DX1NUQVJUX09QVF9FTkNPREVfRlJBTUUsCiAJCQkgICAgICZmcm1fYnVmLCAmYnNfYnVmLCAmZW5jX3Jlc3VsdCk7CiAKLQl2YjJfdjRsMiA9IGNvbnRhaW5lcl9vZihkc3RfYnVmLCBzdHJ1Y3QgdmIyX3Y0bDJfYnVmZmVyLCB2YjJfYnVmKTsKKwlzcmNfdmIyX3Y0bDIgPSB0b192YjJfdjRsMl9idWZmZXIoc3JjX2J1Zik7CisJZHN0X3ZiMl92NGwyID0gdG9fdmIyX3Y0bDJfYnVmZmVyKGRzdF9idWYpOworCisJZHN0X2J1Zi0+dGltZXN0YW1wID0gc3JjX2J1Zi0+dGltZXN0YW1wOworCWRzdF92YjJfdjRsMi0+dGltZWNvZGUgPSBzcmNfdmIyX3Y0bDItPnRpbWVjb2RlOworCiAJaWYgKGVuY19yZXN1bHQuaXNfa2V5X2ZybSkKLQkJdmIyX3Y0bDItPmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUU7CisJCWRzdF92YjJfdjRsMi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19LRVlGUkFNRTsKIAogCWlmIChyZXQpIHsKIAkJdjRsMl9tMm1fYnVmX2RvbmUodG9fdmIyX3Y0bDJfYnVmZmVyKHNyY19idWYpLApAQCAtMTIxNyw3ICsxMjIyLDcgQEAKIAkJCTAsIFY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9TRVBBUkFURSk7CiAJdjRsMl9jdHJsX25ld19zdGRfbWVudShoYW5kbGVyLCBvcHMsIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFLAogCQkJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdILAotCQkJMCwgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NQUlOKTsKKwkJCTAsIFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSCk7CiAJdjRsMl9jdHJsX25ld19zdGRfbWVudShoYW5kbGVyLCBvcHMsIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTCwKIAkJCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMiwKIAkJCTAsIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMCk7CkBAIC0xMjg4LDUgKzEyOTMsMTAgQEAKIAogdm9pZCBtdGtfdmNvZGVjX2VuY19yZWxlYXNlKHN0cnVjdCBtdGtfdmNvZGVjX2N0eCAqY3R4KQogewotCXZlbmNfaWZfZGVpbml0KGN0eCk7CisJaW50IHJldCA9IHZlbmNfaWZfZGVpbml0KGN0eCk7CisKKwlpZiAocmV0KQorCQltdGtfdjRsMl9lcnIoInZlbmNfaWZfZGVpbml0IGZhaWxlZD0lZCIsIHJldCk7CisKKwljdHgtPnN0YXRlID0gTVRLX1NUQVRFX0ZSRUU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmNfZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19lbmNfZHJ2LmMKaW5kZXggYzc4MDZlYy4uNWNkMjE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfZW5jX2Rydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2VuY19kcnYuYwpAQCAtMjE4LDExICsyMTgsMTUgQEAKIAltdGtfdjRsMl9kZWJ1ZygxLCAiWyVkXSBlbmNvZGVyIiwgY3R4LT5pZCk7CiAJbXV0ZXhfbG9jaygmZGV2LT5kZXZfbXV0ZXgpOwogCisJLyoKKwkgKiBDYWxsIHY0bDJfbTJtX2N0eF9yZWxlYXNlIHRvIG1ha2Ugc3VyZSB0aGUgd29ya2VyIHRocmVhZCBpcyBub3QKKwkgKiBydW5uaW5nIGFmdGVyIHZlbmNfaWZfZGVpbml0LgorCSAqLworCXY0bDJfbTJtX2N0eF9yZWxlYXNlKGN0eC0+bTJtX2N0eCk7CiAJbXRrX3Zjb2RlY19lbmNfcmVsZWFzZShjdHgpOwogCXY0bDJfZmhfZGVsKCZjdHgtPmZoKTsKIAl2NGwyX2ZoX2V4aXQoJmN0eC0+ZmgpOwogCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJmN0eC0+Y3RybF9oZGwpOwotCXY0bDJfbTJtX2N0eF9yZWxlYXNlKGN0eC0+bTJtX2N0eCk7CiAKIAlsaXN0X2RlbF9pbml0KCZjdHgtPmxpc3QpOwogCWRldi0+bnVtX2luc3RhbmNlcy0tOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfaW50ci5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL210a192Y29kZWNfaW50ci5oCmluZGV4IDMzZTg5MGYuLjEyMTMxODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy9tdGtfdmNvZGVjX2ludHIuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvbXRrX3Zjb2RlY19pbnRyLmgKQEAgLTE2LDcgKzE2LDYgQEAKICNkZWZpbmUgX01US19WQ09ERUNfSU5UUl9IXwogCiAjZGVmaW5lIE1US19JTlNUX0lSUV9SRUNFSVZFRAkJMHgxCi0jZGVmaW5lIE1US19JTlNUX1dPUktfVEhSRUFEX0FCT1JUX0RPTkUJMHgyCiAKIHN0cnVjdCBtdGtfdmNvZGVjX2N0eDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmMvdmVuY19oMjY0X2lmLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5jX2gyNjRfaWYuYwppbmRleCA5YTYwMDUyLi42M2Q0YmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5jX2gyNjRfaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5jX2gyNjRfaWYuYwpAQCAtNjEsNiArNjEsOCBAQAogCiAvKgogICogc3RydWN0IHZlbmNfaDI2NF92cHVfY29uZmlnIC0gU3RydWN0dXJlIGZvciBoMjY0IGVuY29kZXIgY29uZmlndXJhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVAtVy9SIDogQVAgaXMgd3JpdGVyL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQVS1XL1I6IFZQVSBpcyB3cml0ZS9yZWFkZXIgb24gdGhpcyBpdGVtCiAgKiBAaW5wdXRfZm91cmNjOiBpbnB1dCBmb3VyY2MKICAqIEBiaXRyYXRlOiB0YXJnZXQgYml0cmF0ZSAoaW4gYnBzKQogICogQHBpY193OiBwaWN0dXJlIHdpZHRoLiBQaWN0dXJlIHNpemUgaXMgdmlzaWJsZSBzdHJlYW0gcmVzb2x1dGlvbiwgaW4gcGl4ZWxzLApAQCAtOTQsMTMgKzk2LDEzIEBACiAKIC8qCiAgKiBzdHJ1Y3QgdmVuY19oMjY0X3ZwdV9idWYgLSBTdHJ1Y3R1cmUgZm9yIGJ1ZmZlciBpbmZvcm1hdGlvbgotICogQGFsaWduOiBidWZmZXIgYWxpZ25tZW50IChpbiBieXRlcykKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQLVcvUiA6IEFQIGlzIHdyaXRlci9yZWFkZXIgb24gdGhpcyBpdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUFUtVy9SOiBWUFUgaXMgd3JpdGUvcmVhZGVyIG9uIHRoaXMgaXRlbQogICogQGlvdmE6IElPIHZpcnR1YWwgYWRkcmVzcwogICogQHZwdWE6IFZQVSBzaWRlIG1lbW9yeSBhZGRyIHdoaWNoIGlzIHVzZWQgYnkgUkNfQ09ERQogICogQHNpemU6IGJ1ZmZlciBzaXplIChpbiBieXRlcykKICAqLwogc3RydWN0IHZlbmNfaDI2NF92cHVfYnVmIHsKLQl1MzIgYWxpZ247CiAJdTMyIGlvdmE7CiAJdTMyIHZwdWE7CiAJdTMyIHNpemU7CkBAIC0xMDgsNiArMTEwLDggQEAKIAogLyoKICAqIHN0cnVjdCB2ZW5jX2gyNjRfdnNpIC0gU3RydWN0dXJlIGZvciBWUFUgZHJpdmVyIGNvbnRyb2wgYW5kIGluZm8gc2hhcmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgQVAtVy9SIDogQVAgaXMgd3JpdGVyL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgVlBVLVcvUjogVlBVIGlzIHdyaXRlL3JlYWRlciBvbiB0aGlzIGl0ZW0KICAqIFRoaXMgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBpbiBWUFUgc2lkZSBhbmQgc2hhcmVkIHRvIEFQIHNpZGUuCiAgKiBAY29uZmlnOiBoMjY0IGVuY29kZXIgY29uZmlndXJhdGlvbgogICogQHdvcmtfYnVmczogd29ya2luZyBidWZmZXIgaW5mb3JtYXRpb24gaW4gVlBVIHNpZGUKQEAgLTE1MCwxMiArMTU0LDYgQEAKIAlzdHJ1Y3QgbXRrX3Zjb2RlY19jdHggKmN0eDsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoMjY0X3dyaXRlX3JlZyhzdHJ1Y3QgdmVuY19oMjY0X2luc3QgKmluc3QsIHUzMiBhZGRyLAotCQkJCSAgdTMyIHZhbCkKLXsKLQl3cml0ZWwodmFsLCBpbnN0LT5od19iYXNlICsgYWRkcik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdTMyIGgyNjRfcmVhZF9yZWcoc3RydWN0IHZlbmNfaDI2NF9pbnN0ICppbnN0LCB1MzIgYWRkcikKIHsKIAlyZXR1cm4gcmVhZGwoaW5zdC0+aHdfYmFzZSArIGFkZHIpOwpAQCAtMjE0LDYgKzIxMiw4IEBACiAJCXJldHVybiA0MDsKIAljYXNlIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMToKIAkJcmV0dXJuIDQxOworCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8yOgorCQlyZXR1cm4gNDI7CiAJZGVmYXVsdDoKIAkJbXRrX3Zjb2RlY19kZWJ1ZyhpbnN0LCAidW5zdXBwb3J0ZWQgbGV2ZWwgJWQiLCBsZXZlbCk7CiAJCXJldHVybiAzMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZW5jL3ZlbmNfdnA4X2lmLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL210ay12Y29kZWMvdmVuYy92ZW5jX3ZwOF9pZi5jCmluZGV4IDYwYmJjZDIuLjZkOTc1ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vbXRrLXZjb2RlYy92ZW5jL3ZlbmNfdnA4X2lmLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9tdGstdmNvZGVjL3ZlbmMvdmVuY192cDhfaWYuYwpAQCAtNTYsNiArNTYsOCBAQAogCiAvKgogICogc3RydWN0IHZlbmNfdnA4X3ZwdV9jb25maWcgLSBTdHJ1Y3R1cmUgZm9yIHZwOCBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVAtVy9SIDogQVAgaXMgd3JpdGVyL3JlYWRlciBvbiB0aGlzIGl0ZW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBVLVcvUjogVlBVIGlzIHdyaXRlL3JlYWRlciBvbiB0aGlzIGl0ZW0KICAqIEBpbnB1dF9mb3VyY2M6IGlucHV0IGZvdXJjYwogICogQGJpdHJhdGU6IHRhcmdldCBiaXRyYXRlIChpbiBicHMpCiAgKiBAcGljX3c6IHBpY3R1cmUgd2lkdGguIFBpY3R1cmUgc2l6ZSBpcyB2aXNpYmxlIHN0cmVhbSByZXNvbHV0aW9uLCBpbiBwaXhlbHMsCkBAIC04MywxNCArODUsMTQgQEAKIH07CiAKIC8qCi0gKiBzdHJ1Y3QgdmVuY192cDhfdnB1X2J1ZiAtU3RydWN0dXJlIGZvciBidWZmZXIgaW5mb3JtYXRpb24KLSAqIEBhbGlnbjogYnVmZmVyIGFsaWdubWVudCAoaW4gYnl0ZXMpCisgKiBzdHJ1Y3QgdmVuY192cDhfdnB1X2J1ZiAtIFN0cnVjdHVyZSBmb3IgYnVmZmVyIGluZm9ybWF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQLVcvUiA6IEFQIGlzIHdyaXRlci9yZWFkZXIgb24gdGhpcyBpdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQVS1XL1I6IFZQVSBpcyB3cml0ZS9yZWFkZXIgb24gdGhpcyBpdGVtCiAgKiBAaW92YTogSU8gdmlydHVhbCBhZGRyZXNzCiAgKiBAdnB1YTogVlBVIHNpZGUgbWVtb3J5IGFkZHIgd2hpY2ggaXMgdXNlZCBieSBSQ19DT0RFCiAgKiBAc2l6ZTogYnVmZmVyIHNpemUgKGluIGJ5dGVzKQogICovCiBzdHJ1Y3QgdmVuY192cDhfdnB1X2J1ZiB7Ci0JdTMyIGFsaWduOwogCXUzMiBpb3ZhOwogCXUzMiB2cHVhOwogCXUzMiBzaXplOwpAQCAtOTgsNiArMTAwLDggQEAKIAogLyoKICAqIHN0cnVjdCB2ZW5jX3ZwOF92c2kgLSBTdHJ1Y3R1cmUgZm9yIFZQVSBkcml2ZXIgY29udHJvbCBhbmQgaW5mbyBzaGFyZQorICogICAgICAgICAgICAgICAgICAgICAgIEFQLVcvUiA6IEFQIGlzIHdyaXRlci9yZWFkZXIgb24gdGhpcyBpdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgVlBVLVcvUjogVlBVIGlzIHdyaXRlL3JlYWRlciBvbiB0aGlzIGl0ZW0KICAqIFRoaXMgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBpbiBWUFUgc2lkZSBhbmQgc2hhcmVkIHRvIEFQIHNpZGUuCiAgKiBAY29uZmlnOiB2cDggZW5jb2RlciBjb25maWd1cmF0aW9uCiAgKiBAd29ya19idWZzOiB3b3JraW5nIGJ1ZmZlciBpbmZvcm1hdGlvbiBpbiBWUFUgc2lkZQpAQCAtMTM4LDEyICsxNDIsNiBAQAogCXN0cnVjdCBtdGtfdmNvZGVjX2N0eCAqY3R4OwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIHZwOF9lbmNfd3JpdGVfcmVnKHN0cnVjdCB2ZW5jX3ZwOF9pbnN0ICppbnN0LCB1MzIgYWRkciwKLQkJCQkgICAgIHUzMiB2YWwpCi17Ci0Jd3JpdGVsKHZhbCwgaW5zdC0+aHdfYmFzZSArIGFkZHIpOwotfQotCiBzdGF0aWMgaW5saW5lIHUzMiB2cDhfZW5jX3JlYWRfcmVnKHN0cnVjdCB2ZW5jX3ZwOF9pbnN0ICppbnN0LCB1MzIgYWRkcikKIHsKIAlyZXR1cm4gcmVhZGwoaW5zdC0+aHdfYmFzZSArIGFkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9yY2FyLWZjcC5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9yY2FyLWZjcC5jCmluZGV4IDZhN2JjYzMuLmJjNTBjNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vcmNhci1mY3AuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3JjYXItZmNwLmMKQEAgLTk5LDEwICs5OSwxNiBAQAogICovCiBpbnQgcmNhcl9mY3BfZW5hYmxlKHN0cnVjdCByY2FyX2ZjcF9kZXZpY2UgKmZjcCkKIHsKKwlpbnQgZXJyb3I7CisKIAlpZiAoIWZjcCkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gcG1fcnVudGltZV9nZXRfc3luYyhmY3AtPmRldik7CisJZXJyb3IgPSBwbV9ydW50aW1lX2dldF9zeW5jKGZjcC0+ZGV2KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJjYXJfZmNwX2VuYWJsZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC11c2IuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC11c2IuYwppbmRleCAwOTFkNzkzLi40YjEzMmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LXVzYi5jCkBAIC02MjcsNyArNjI3LDYgQEAKIAogCXJhZGlvLT5pbnRfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJhZGlvLT5pbnRfaW5fdXJiKSB7Ci0JCWRldl9pbmZvKCZpbnRmLT5kZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgaW50X2luX3VyYiIpOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9pbnRidWZmZXI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pbW9uLmMgYi9kcml2ZXJzL21lZGlhL3JjL2ltb24uYwppbmRleCA2NWY4MGI4Li44NmNjNzBmZTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2ltb24uYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2ltb24uYwpAQCAtMjIxMSwxNiArMjIxMSwxMSBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCXJ4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyeF91cmIpIHsKLQkJZGV2X2VycihkZXYsICIlczogdXNiX2FsbG9jX3VyYiBmYWlsZWQgZm9yIElSIHVyYiIsIF9fZnVuY19fKTsKKwlpZiAoIXJ4X3VyYikKIAkJZ290byByeF91cmJfYWxsb2NfZmFpbGVkOwotCX0KIAl0eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghdHhfdXJiKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBkaXNwbGF5IHVyYiIsCi0JCQlfX2Z1bmNfXyk7CisJaWYgKCF0eF91cmIpCiAJCWdvdG8gdHhfdXJiX2FsbG9jX2ZhaWxlZDsKLQl9CiAKIAltdXRleF9pbml0KCZpY3R4LT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaWN0eC0+a2NfbG9jayk7CkBAIC0yMzA1LDEwICsyMzAwLDggQEAKIAlpbnQgcmV0ID0gLUVOT01FTTsKIAogCXJ4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyeF91cmIpIHsKLQkJcHJfZXJyKCJ1c2JfYWxsb2NfdXJiIGZhaWxlZCBmb3IgSVIgdXJiXG4iKTsKKwlpZiAoIXJ4X3VyYikKIAkJZ290byByeF91cmJfYWxsb2NfZmFpbGVkOwotCX0KIAogCW11dGV4X2xvY2soJmljdHgtPmxvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JlZHJhdDMuYyBiL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCmluZGV4IDM5OWY0NGQuLmVjODAxNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmVkcmF0My5jCkBAIC05NzAsMTAgKzk3MCw4IEBACiAKIAkvKiBzZXQgdXAgYnVsay1pbiBlbmRwb2ludCAqLwogCXJyMy0+cmVhZF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghcnIzLT5yZWFkX3VyYikgewotCQlkZXZfZXJyKGRldiwgIlJlYWQgdXJiIGFsbG9jYXRpb24gZmFpbHVyZVxuIik7CisJaWYgKCFycjMtPnJlYWRfdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAogCXJyMy0+ZXBfaW4gPSBlcF9pbjsKIAlycjMtPmJ1bGtfaW5fYnVmID0gdXNiX2FsbG9jX2NvaGVyZW50KHVkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9haXJzcHkvYWlyc3B5LmMgYi9kcml2ZXJzL21lZGlhL3VzYi9haXJzcHkvYWlyc3B5LmMKaW5kZXggZmUwMzFiMC4uM2M1NTZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvYWlyc3B5L2FpcnNweS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2FpcnNweS9haXJzcHkuYwpAQCAtNDI2LDcgKzQyNiw2IEBACiAJCWRldl9kYmcocy0+ZGV2LCAiYWxsb2MgdXJiPSVkXG4iLCBpKTsKIAkJcy0+dXJiX2xpc3RbaV0gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXMtPnVyYl9saXN0W2ldKSB7Ci0JCQlkZXZfZGJnKHMtPmRldiwgImZhaWxlZFxuIik7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQkJCXVzYl9mcmVlX3VyYihzLT51cmJfbGlzdFtqXSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2FzMTAyL2FzMTAyX3VzYl9kcnYuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2FzMTAyL2FzMTAyX3VzYl9kcnYuYwppbmRleCAwZTgwMzBjLi42OGMzYTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9hczEwMi9hczEwMl91c2JfZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvYXMxMDIvYXMxMDJfdXNiX2Rydi5jCkBAIC0yNzAsOCArMjcwLDYgQEAKIAogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCWRldl9kYmcoJmRldi0+YnVzX2FkYXAudXNiX2Rldi0+ZGV2LAotCQkJCSIlczogdXNiX2FsbG9jX3VyYiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJCWFzMTAyX2ZyZWVfdXNiX3N0cmVhbV9idWZmZXIoZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9hdTA4MjgvYXUwODI4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9hdTA4MjgvYXUwODI4LXZpZGVvLmMKaW5kZXggODJiMDI2OS4uMTNiODM4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvYXUwODI4L2F1MDgyOC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2F1MDgyOC9hdTA4MjgtdmlkZW8uYwpAQCAtMjQ1LDcgKzI0NSw2IEBACiAJZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG1heF9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWF1MDgyOF9pc29jZGJnKCJjYW5ub3QgYWxsb2MgaXNvY19jdGwudXJiICVpXG4iLCBpKTsKIAkJCWF1MDgyOF91bmluaXRfaXNvYyhkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL2NwaWEyL2NwaWEyX3VzYi5jIGIvZHJpdmVycy9tZWRpYS91c2IvY3BpYTIvY3BpYTJfdXNiLmMKaW5kZXggYzFhYTFhYi4uMTM2MjBjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvY3BpYTIvY3BpYTJfdXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvY3BpYTIvY3BpYTJfdXNiLmMKQEAgLTY2Miw3ICs2NjIsNiBAQAogCQl9CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoRlJBTUVTX1BFUl9ERVNDLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCUVSUigiJXM6IHVzYl9hbGxvY191cmIgZXJyb3IhXG4iLCBfX2Z1bmNfXyk7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQkJCXVzYl9mcmVlX3VyYihjYW0tPnNidWZbal0udXJiKTsKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtYXVkaW8uYwppbmRleCBhNmE5NTA4Li40Y2Q1ZmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtYXVkaW8uYwpAQCAtMjkzLDcgKzI5Myw2IEBACiAJCW1lbXNldChkZXYtPmFkZXYudHJhbnNmZXJfYnVmZmVyW2ldLCAweDgwLCBzYl9zaXplKTsKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihDWDIzMVhYX0lTT19OVU1fQVVESU9fUEFDS0VUUywgR0ZQX0FUT01JQyk7CiAJCWlmICghdXJiKSB7Ci0JCQlkZXZfZXJyKGRldi0+ZGV2LCAidXNiX2FsbG9jX3VyYiBmYWlsZWQhXG4iKTsKIAkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKIAkJCQl1c2JfZnJlZV91cmIoZGV2LT5hZGV2LnVyYltqXSk7CiAJCQkJa2ZyZWUoZGV2LT5hZGV2LnRyYW5zZmVyX2J1ZmZlcltqXSk7CkBAIC0zNTUsNyArMzU0LDYgQEAKIAkJbWVtc2V0KGRldi0+YWRldi50cmFuc2Zlcl9idWZmZXJbaV0sIDB4ODAsIHNiX3NpemUpOwogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKENYMjMxWFhfTlVNX0FVRElPX1BBQ0tFVFMsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXVyYikgewotCQkJZGV2X2VycihkZXYtPmRldiwgInVzYl9hbGxvY191cmIgZmFpbGVkIVxuIik7CiAJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CiAJCQkJdXNiX2ZyZWVfdXJiKGRldi0+YWRldi51cmJbal0pOwogCQkJCWtmcmVlKGRldi0+YWRldi50cmFuc2Zlcl9idWZmZXJbal0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC1jb3JlLmMKaW5kZXggNjMwZjRmYy4uOGVjMDVjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtY29yZS5jCkBAIC0xMDM1LDggKzEwMzUsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPnZpZGVvX21vZGUuaXNvY19jdGwubnVtX2J1ZnM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG1heF9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWRldl9lcnIoZGV2LT5kZXYsCi0JCQkJImNhbm5vdCBhbGxvYyBpc29jX2N0bC51cmIgJWlcbiIsIGkpOwogCQkJY3gyMzF4eF91bmluaXRfaXNvYyhkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KQEAgLTExNzIsOCArMTE3MCw2IEBACiAJZm9yIChpID0gMDsgaSA8IGRldi0+dmlkZW9fbW9kZS5idWxrX2N0bC5udW1fYnVmczsgaSsrKSB7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdXJiKSB7Ci0JCQlkZXZfZXJyKGRldi0+ZGV2LAotCQkJCSJjYW5ub3QgYWxsb2MgYnVsa19jdGwudXJiICVpXG4iLCBpKTsKIAkJCWN4MjMxeHhfdW5pbml0X2J1bGsoZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9jeDIzMXh4L2N4MjMxeHgtdmJpLmMKaW5kZXggMTViYjU3My4uNzZlOTAxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvY3gyMzF4eC9jeDIzMXh4LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2N4MjMxeHgvY3gyMzF4eC12YmkuYwpAQCAtNDQyLDggKzQ0Miw2IEBACiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWRldl9lcnIoZGV2LT5kZXYsCi0JCQkJImNhbm5vdCBhbGxvYyBidWxrX2N0bC51cmIgJWlcbiIsIGkpOwogCQkJY3gyMzF4eF91bmluaXRfdmJpX2lzb2MoZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiL2RpYjA3MDBfY29yZS5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi9kaWIwNzAwX2NvcmUuYwppbmRleCBiZjg5MGMzLi4yNjc5Nzk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiL2RpYjA3MDBfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2IvZGliMDcwMF9jb3JlLmMKQEAgLTc4MywxMCArNzgzLDggQEAKIAkvKiBTdGFydGluZyBpbiBmaXJtd2FyZSAxLjIwLCB0aGUgUkMgaW5mbyBpcyBwcm92aWRlZCBvbiBhIGJ1bGsgcGlwZSAqLwogCiAJcHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHB1cmIgPT0gTlVMTCkgewotCQllcnIoInJjIHVzYiBhbGxvYyB1cmIgZmFpbGVkIik7CisJaWYgKHB1cmIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcHVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga3phbGxvYyhSQ19NU0dfU0laRV9WMV8yMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHB1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMKaW5kZXggNDlhNWY5NS4uNzhmMzY4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1hdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwpAQCAtODUwLDcgKzg1MCw2IEBACiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYihucGFja2V0cywgR0ZQX0FUT01JQyk7CiAJCWlmICghdXJiKSB7Ci0JCQllbTI4eHhfZXJyZGV2KCJ1c2JfYWxsb2NfdXJiIGZhaWxlZCFcbiIpOwogCQkJZW0yOHh4X2F1ZGlvX2ZyZWVfdXJiKGRldik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZW0yOHh4L2VtMjh4eC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWNvcmUuYwppbmRleCAzNzQ1NjA3Li5lZWJkNWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9lbTI4eHgvZW0yOHh4LWNvcmUuYwpAQCAtOTM0LDcgKzkzNCw2IEBACiAJZm9yIChpID0gMDsgaSA8IHVzYl9idWZzLT5udW1fYnVmczsgaSsrKSB7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIodXNiX2J1ZnMtPm51bV9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWVtMjh4eF9lcnIoImNhbm5vdCBhbGxvYyB1c2JfY3RsLnVyYiAlaVxuIiwgaSk7CiAJCQllbTI4eHhfdW5pbml0X3VzYl94ZmVyKGRldiwgbW9kZSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvYmVucS5jIGIvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvYmVucS5jCmluZGV4IDc5MGJhZWQuLjVmYTY3YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2JlbnEuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9iZW5xLmMKQEAgLTk1LDEwICs5NSw4IEBACiAjZGVmaW5lIFNEX05QS1QgMzIKIAlmb3IgKG4gPSAwOyBuIDwgNDsgbisrKSB7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoU0RfTlBLVCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXJiKSB7Ci0JCQlwcl9lcnIoInVzYl9hbGxvY191cmIgZmFpbGVkXG4iKTsKKwkJaWYgKCF1cmIpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCQlnc3BjYV9kZXYtPnVyYltuXSA9IHVyYjsKIAkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQoZ3NwY2FfZGV2LT5kZXYsCiAJCQkJCQlTRF9QS1RfU1ogKiBTRF9OUEtULApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvZ3NwY2EuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2dzcGNhLmMKaW5kZXggYjE3YmQ3ZS4uYWYyMzk1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvZ3NwY2EuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9nc3BjYS5jCkBAIC03OTUsMTAgKzc5NSw4IEBACiAKIAlmb3IgKG4gPSAwOyBuIDwgbnVyYnM7IG4rKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG5wa3QsIEdGUF9LRVJORUwpOwotCQlpZiAoIXVyYikgewotCQkJcHJfZXJyKCJ1c2JfYWxsb2NfdXJiIGZhaWxlZFxuIik7CisJCWlmICghdXJiKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KIAkJZ3NwY2FfZGV2LT51cmJbbl0gPSB1cmI7CiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdXNiX2FsbG9jX2NvaGVyZW50KGdzcGNhX2Rldi0+ZGV2LAogCQkJCQkJYnNpemUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9rb25pY2EuYyBiL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2tvbmljYS5jCmluZGV4IDA3MTJiMWIuLjQwYWFhYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2tvbmljYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL2tvbmljYS5jCkBAIC0yMDgsMTAgKzIwOCw4IEBACiAJCXBhY2tldF9zaXplID0KIAkJCWxlMTZfdG9fY3B1KGFsdC0+ZW5kcG9pbnRbaV0uZGVzYy53TWF4UGFja2V0U2l6ZSk7CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoU0RfTlBLVCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXJiKSB7Ci0JCQlwcl9lcnIoInVzYl9hbGxvY191cmIgZmFpbGVkXG4iKTsKKwkJaWYgKCF1cmIpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCQlnc3BjYV9kZXYtPnVyYltuXSA9IHVyYjsKIAkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQoZ3NwY2FfZGV2LT5kZXYsCiAJCQkJCQlwYWNrZXRfc2l6ZSAqIFNEX05QS1QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9oYWNrcmYvaGFja3JmLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9oYWNrcmYvaGFja3JmLmMKaW5kZXggYjFlMjI5YS4uYzJjOGQxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvaGFja3JmL2hhY2tyZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2hhY2tyZi9oYWNrcmYuYwpAQCAtNjkxLDcgKzY5MSw2IEBACiAJCWRldl9kYmcoZGV2LT5kZXYsICJhbGxvYyB1cmI9JWRcbiIsIGkpOwogCQlkZXYtPnVyYl9saXN0W2ldID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFkZXYtPnVyYl9saXN0W2ldKSB7Ci0JCQlkZXZfZGJnKGRldi0+ZGV2LCAiZmFpbGVkXG4iKTsKIAkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCiAJCQkJdXNiX2ZyZWVfdXJiKGRldi0+dXJiX2xpc3Rbal0pOwogCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi9oZHB2ci9oZHB2ci12aWRlby5jIGIvZHJpdmVycy9tZWRpYS91c2IvaGRwdnIvaGRwdnItdmlkZW8uYwppbmRleCAyYTNhOGI0Li42ZDQzZDc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi9oZHB2ci9oZHB2ci12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL2hkcHZyL2hkcHZyLXZpZGVvLmMKQEAgLTE1NSwxMCArMTU1LDggQEAKIAkJYnVmLT5kZXYgPSBkZXY7CiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCF1cmIpIHsKLQkJCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LCAiY2Fubm90IGFsbG9jYXRlIHVyYlxuIik7CisJCWlmICghdXJiKQogCQkJZ290byBleGl0X3VyYjsKLQkJfQogCQlidWYtPnVyYiA9IHVyYjsKIAogCQltZW0gPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LCBkZXYtPmJ1bGtfaW5fc2l6ZSwgR0ZQX0tFUk5FTCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL21zaTI1MDAvbXNpMjUwMC5jIGIvZHJpdmVycy9tZWRpYS91c2IvbXNpMjUwMC9tc2kyNTAwLmMKaW5kZXggZTdmMTY3ZC4uMzY3ZWI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvbXNpMjUwMC9tc2kyNTAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvbXNpMjUwMC9tc2kyNTAwLmMKQEAgLTUwOSw3ICs1MDksNiBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKElTT19GUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOwogCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCWRldl9lcnIoZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgdXJiICVkXG4iLCBpKTsKIAkJCW1zaTI1MDBfaXNvY19jbGVhbnVwKGRldik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvcHdjL3B3Yy1pZi5jIGIvZHJpdmVycy9tZWRpYS91c2IvcHdjL3B3Yy1pZi5jCmluZGV4IGI1MWIyN2EuLmM0NDU0YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3B3Yy9wd2MtaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9wd2MvcHdjLWlmLmMKQEAgLTQxMCw3ICs0MTAsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKElTT19GUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOwogCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHVyYiAlZFxuIiwgaSk7CiAJCQlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3MyMjU1L3MyMjU1ZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3VzYi9zMjI1NS9zMjI1NWRydi5jCmluZGV4IDQzYmE3MWEuLjk0NThlYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3MyMjU1L3MyMjU1ZHJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2IvczIyNTUvczIyNTVkcnYuYwpAQCAtMjExMywxMSArMjExMyw4IEBACiAJcGlwZV9pbmZvLT5zdGF0ZSA9IDE7CiAJcGlwZV9pbmZvLT5lcnJfY291bnQgPSAwOwogCXBpcGVfaW5mby0+c3RyZWFtX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaXBlX2luZm8tPnN0cmVhbV91cmIpIHsKLQkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsCi0JCQkiUmVhZFN0cmVhbTogVW5hYmxlIHRvIGFsbG9jIFVSQlxuIik7CisJaWYgKCFwaXBlX2luZm8tPnN0cmVhbV91cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAkvKiB0cmFuc2ZlciBidWZmZXIgYWxsb2NhdGVkIGluIGJvYXJkX2luaXQgKi8KIAl1c2JfZmlsbF9idWxrX3VyYihwaXBlX2luZm8tPnN0cmVhbV91cmIsIGRldi0+dWRldiwKIAkJCSAgcGlwZSwKQEAgLTIyOTAsMTAgKzIyODcsOCBAQAogCX0KIAogCWRldi0+ZndfZGF0YS0+ZndfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+ZndfZGF0YS0+ZndfdXJiKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAib3V0IG9mIG1lbW9yeSFcbiIpOworCWlmICghZGV2LT5md19kYXRhLT5md191cmIpCiAJCWdvdG8gZXJyb3JGV1VSQjsKLQl9CiAKIAlkZXYtPmZ3X2RhdGEtPnBmd19kYXRhID0ga3phbGxvYyhDSFVOS19TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldi0+ZndfZGF0YS0+cGZ3X2RhdGEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3N0azExNjAvc3RrMTE2MC12aWRlby5jIGIvZHJpdmVycy9tZWRpYS91c2Ivc3RrMTE2MC9zdGsxMTYwLXZpZGVvLmMKaW5kZXggNmVjYjBiNC4uY2U4ZWJiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2Ivc3RrMTE2MC9zdGsxMTYwLXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2Ivc3RrMTE2MC9zdGsxMTYwLXZpZGVvLmMKQEAgLTQ1NywxMCArNDU3LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2J1ZnM7IGkrKykgewogCiAJCXVyYiA9IHVzYl9hbGxvY191cmIobWF4X3BhY2tldHMsIEdGUF9LRVJORUwpOwotCQlpZiAoIXVyYikgewotCQkJc3RrMTE2MF9lcnIoImNhbm5vdCBhbGxvYyB1cmJbJWRdXG4iLCBpKTsKKwkJaWYgKCF1cmIpCiAJCQlnb3RvIGZyZWVfaV9idWZzOwotCQl9CiAJCWRldi0+aXNvY19jdGwudXJiW2ldID0gdXJiOwogCiAjaWZuZGVmIENPTkZJR19ETUFfTk9OQ09IRVJFTlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdXNiL3N0a3dlYmNhbS9zdGstd2ViY2FtLmMgYi9kcml2ZXJzL21lZGlhL3VzYi9zdGt3ZWJjYW0vc3RrLXdlYmNhbS5jCmluZGV4IGMyMWM0YzAuLmRiMjAwYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3N0a3dlYmNhbS9zdGstd2ViY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS91c2Ivc3Rrd2ViY2FtL3N0ay13ZWJjYW0uYwpAQCAtNDUyLDEwICs0NTIsOCBAQAogCQkJU1RLX0VSUk9SKCJpc29idWYgZGF0YSBhbHJlYWR5IGFsbG9jYXRlZFxuIik7CiAJCWlmIChkZXYtPmlzb2J1ZnNbaV0udXJiID09IE5VTEwpIHsKIAkJCXVyYiA9IHVzYl9hbGxvY191cmIoSVNPX0ZSQU1FU19QRVJfREVTQywgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCQlTVEtfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBVUkIgJWRcbiIsIGkpOworCQkJaWYgKHVyYiA9PSBOVUxMKQogCQkJCWdvdG8gaXNvYnVmc19vdXQ7Ci0JCQl9CiAJCQlkZXYtPmlzb2J1ZnNbaV0udXJiID0gdXJiOwogCQl9IGVsc2UgewogCQkJU1RLX0VSUk9SKCJLaWxsaW5nIFVSQlxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC1kdmIuYwppbmRleCAwOTVmNWRiLi4wNDI2YjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3RtNjAwMC90bTYwMDAtZHZiLmMKQEAgLTEyOSwxMCArMTI5LDggQEAKIAl9CiAKIAlkdmItPmJ1bGtfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoZHZiLT5idWxrX3VyYiA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidG02MDAwOiBjb3VsZG4ndCBhbGxvY2F0ZSB1cmJcbiIpOworCWlmIChkdmItPmJ1bGtfdXJiID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXBpcGUgPSB1c2JfcmN2YnVsa3BpcGUoZGV2LT51ZGV2LCBkZXYtPmJ1bGtfaW4uZW5kcC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzCiAJCQkJCQkJICAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3VzYi90bTYwMDAvdG02MDAwLXZpZGVvLmMKaW5kZXggZmE1ZThiZC4uZGVlN2U3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvdG02MDAwL3RtNjAwMC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3RtNjAwMC90bTYwMDAtdmlkZW8uYwpAQCAtNjM1LDcgKzYzNSw2IEBACiAJZm9yIChpID0gMDsgaSA8IGRldi0+aXNvY19jdGwubnVtX2J1ZnM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKG1heF9wYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCXRtNjAwMF9lcnIoImNhbm5vdCBhbGxvYyBpc29jX2N0bC51cmIgJWlcbiIsIGkpOwogCQkJdG02MDAwX3VuaW5pdF9pc29jKGRldik7CiAJCQl1c2JfZnJlZV91cmIodXJiKTsKIAkJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvdXNidmlzaW9uL3VzYnZpc2lvbi1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3VzYi91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYwppbmRleCA1MmFjNDM5Li5jMjNiZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3VzYi91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi91c2J2aXNpb24vdXNidmlzaW9uLWNvcmUuYwpAQCAtMjMwMywxMSArMjMwMyw4IEBACiAJCXN0cnVjdCB1cmIgKnVyYjsKIAogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKFVTQlZJU0lPTl9VUkJfRlJBTUVTLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHVyYiA9PSBOVUxMKSB7Ci0JCQlkZXZfZXJyKCZ1c2J2aXNpb24tPmRldi0+ZGV2LAotCQkJCSIlczogdXNiX2FsbG9jX3VyYigpIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlpZiAodXJiID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCQl1c2J2aXNpb24tPnNidWZbYnVmX2lkeF0udXJiID0gdXJiOwogCQl1c2J2aXNpb24tPnNidWZbYnVmX2lkeF0uZGF0YSA9CiAJCQl1c2JfYWxsb2NfY29oZXJlbnQodXNidmlzaW9uLT5kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3VzYi96cjM2NHh4L3pyMzY0eHguYyBiL2RyaXZlcnMvbWVkaWEvdXNiL3pyMzY0eHgvenIzNjR4eC5jCmluZGV4IDc0MzNiYTUuLmNjMTI4ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL3pyMzY0eHgvenIzNjR4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdXNiL3pyMzY0eHgvenIzNjR4eC5jCkBAIC0xMDQ1LDEwICsxMDQ1LDggQEAKIAlwaXBlX2luZm8tPnN0YXRlID0gMTsKIAlwaXBlX2luZm8tPmVycl9jb3VudCA9IDA7CiAJcGlwZV9pbmZvLT5zdHJlYW1fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBpcGVfaW5mby0+c3RyZWFtX3VyYikgewotCQlkZXZfZXJyKCZjYW0tPnVkZXYtPmRldiwgIlJlYWRTdHJlYW06IFVuYWJsZSB0byBhbGxvYyBVUkJcbiIpOworCWlmICghcGlwZV9pbmZvLT5zdHJlYW1fdXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJLyogdHJhbnNmZXIgYnVmZmVyIGFsbG9jYXRlZCBpbiBib2FyZF9pbml0ICovCiAJdXNiX2ZpbGxfYnVsa191cmIocGlwZV9pbmZvLT5zdHJlYW1fdXJiLCBjYW0tPnVkZXYsCiAJCQkgIHBpcGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lbW9yeS9vZl9tZW1vcnkuYyBiL2RyaXZlcnMvbWVtb3J5L29mX21lbW9yeS5jCmluZGV4IDlkYWY5NGIuLjU2OGYwNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVtb3J5L29mX21lbW9yeS5jCisrKyBiL2RyaXZlcnMvbWVtb3J5L29mX21lbW9yeS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bWVtb3J5L2plZGVjX2Rkci5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgIm9mX21lbW9yeS5oIgogCiAvKioKICAqIG9mX2dldF9taW5fdGNrKCkgLSBleHRyYWN0IG1pbiB0aW1pbmcgdmFsdWVzIGZvciBkZHIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtb3J5L29tYXAtZ3BtYy5jIGIvZHJpdmVycy9tZW1vcnkvb21hcC1ncG1jLmMKaW5kZXggODY5YzgzZi4uZjAwZjNlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZW1vcnkvb21hcC1ncG1jLmMKKysrIGIvZHJpdmVycy9tZW1vcnkvb21hcC1ncG1jLmMKQEAgLTIxODUsNyArMjE4NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ3BtY19wcm9iZV9kdF9jaGlsZHJlbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgZ3BtY19wcm9iZV9kdF9jaGlsZHJlbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCByZXQ7CiAJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKQEAgLTIyMDAsMTEgKzIyMDAsMTEgQEAKIAkJZWxzZQogCQkJcmV0ID0gZ3BtY19wcm9iZV9nZW5lcmljX2NoaWxkKHBkZXYsIGNoaWxkKTsKIAotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHByb2JlIERUIGNoaWxkICclcyc6ICVkXG4iLAorCQkJCWNoaWxkLT5uYW1lLCByZXQpOworCQl9CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAjZWxzZQogc3RhdGljIGludCBncG1jX3Byb2JlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0yMjEyLDkgKzIyMTIsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdwbWNfcHJvYmVfZHRfY2hpbGRyZW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIGdwbWNfcHJvYmVfZHRfY2hpbGRyZW4oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIApAQCAtMjM2OSwxNiArMjM2OCwxMCBAQAogCQlnb3RvIHNldHVwX2lycV9mYWlsZWQ7CiAJfQogCi0JcmMgPSBncG1jX3Byb2JlX2R0X2NoaWxkcmVuKHBkZXYpOwotCWlmIChyYyA8IDApIHsKLQkJZGV2X2VycihncG1jLT5kZXYsICJmYWlsZWQgdG8gcHJvYmUgRFQgY2hpbGRyZW5cbiIpOwotCQlnb3RvIGR0X2NoaWxkcmVuX2ZhaWxlZDsKLQl9CisJZ3BtY19wcm9iZV9kdF9jaGlsZHJlbihwZGV2KTsKIAogCXJldHVybiAwOwogCi1kdF9jaGlsZHJlbl9mYWlsZWQ6Ci0JZ3BtY19mcmVlX2lycShncG1jKTsKIHNldHVwX2lycV9mYWlsZWQ6CiAJZ3BtY19ncGlvX2V4aXQoZ3BtYyk7CiBncGlvX2luaXRfZmFpbGVkOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRiYXNlLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwppbmRleCA1NTM3ZjhkLi44OWM3ZWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYworKysgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGJhc2UuYwpAQCAtMTg2NSw4ICsxODY1LDggQEAKIAogCXNucHJpbnRmKGlvYy0+cmVzZXRfd29ya19xX25hbWUsIE1QVF9LT0JKX05BTUVfTEVOLAogCQkgIm1wdF9wb2xsXyVkIiwgaW9jLT5pZCk7Ci0JaW9jLT5yZXNldF93b3JrX3EgPQotCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShpb2MtPnJlc2V0X3dvcmtfcV9uYW1lKTsKKwlpb2MtPnJlc2V0X3dvcmtfcSA9IGFsbG9jX3dvcmtxdWV1ZShpb2MtPnJlc2V0X3dvcmtfcV9uYW1lLAorCQkJCQkgICAgV1FfTUVNX1JFQ0xBSU0sIDApOwogCWlmICghaW9jLT5yZXNldF93b3JrX3EpIHsKIAkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBhZGQgYWRhcHRlciFcbiIsCiAJCSAgICBpb2MtPm5hbWUpOwpAQCAtMTk5Miw3ICsxOTkyLDggQEAKIAlJTklUX0xJU1RfSEVBRCgmaW9jLT5md19ldmVudF9saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmaW9jLT5md19ldmVudF9sb2NrKTsKIAlzbnByaW50Zihpb2MtPmZ3X2V2ZW50X3FfbmFtZSwgTVBUX0tPQkpfTkFNRV9MRU4sICJtcHQvJWQiLCBpb2MtPmlkKTsKLQlpb2MtPmZ3X2V2ZW50X3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShpb2MtPmZ3X2V2ZW50X3FfbmFtZSk7CisJaW9jLT5md19ldmVudF9xID0gYWxsb2Nfd29ya3F1ZXVlKGlvYy0+ZndfZXZlbnRfcV9uYW1lLAorCQkJCQkgIFdRX01FTV9SRUNMQUlNLCAwKTsKIAlpZiAoIWlvYy0+ZndfZXZlbnRfcSkgewogCQlwcmludGsoTVlJT0Nfc19FUlJfRk1UICJJbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFkZCBhZGFwdGVyIVxuIiwKIAkJICAgIGlvYy0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMgYi9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdGZjLmMKaW5kZXggZDhiZjg0YS4uYWRkNmEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRmYy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0ZmMuYwpAQCAtMTMyNCw5ICsxMzI0LDEyIEBACiAJc25wcmludGYoaW9jLT5mY19yZXNjYW5fd29ya19xX25hbWUsIHNpemVvZihpb2MtPmZjX3Jlc2Nhbl93b3JrX3FfbmFtZSksCiAJCSAibXB0ZmNfd3FfJWQiLCBzaC0+aG9zdF9ubyk7CiAJaW9jLT5mY19yZXNjYW5fd29ya19xID0KLQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoaW9jLT5mY19yZXNjYW5fd29ya19xX25hbWUpOwotCWlmICghaW9jLT5mY19yZXNjYW5fd29ya19xKQorCQlhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZShpb2MtPmZjX3Jlc2Nhbl93b3JrX3FfbmFtZSwKKwkJCQkJV1FfTUVNX1JFQ0xBSU0pOworCWlmICghaW9jLT5mY19yZXNjYW5fd29ya19xKSB7CisJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBvdXRfbXB0ZmNfcHJvYmU7CisJfQogCiAJLyoKIAkgKiAgUHJlLWZldGNoIEZDIHBvcnQgV1dOIGFuZCBzdHVmZi4uLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvS2NvbmZpZyBiL2RyaXZlcnMvbWZkL0tjb25maWcKaW5kZXggMmQxZmI2NC4uYzZkZjY0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZworKysgYi9kcml2ZXJzL21mZC9LY29uZmlnCkBAIC01MCw3ICs1MCw3IEBACiAJICBTdXBwb3J0IGZvciB0aGUgQVMzNzExIFBNSUMgZnJvbSBBTVMKIAogY29uZmlnIE1GRF9BUzM3MjIKLQlib29sICJhbXMgQVMzNzIyIFBvd2VyIE1hbmFnZW1lbnQgSUMiCisJdHJpc3RhdGUgImFtcyBBUzM3MjIgUG93ZXIgTWFuYWdlbWVudCBJQyIKIAlzZWxlY3QgTUZEX0NPUkUKIAlzZWxlY3QgUkVHTUFQX0kyQwogCXNlbGVjdCBSRUdNQVBfSVJRCkBAIC0xMTIsNiArMTEyLDE2IEBACiAJaGVscAogCSAgU3VwcG9ydCBmb3IgdGhlIEJDTTU5MHh4IFBNVXMgZnJvbSBCcm9hZGNvbQogCitjb25maWcgTUZEX0FDMTAwCisJdHJpc3RhdGUgIlgtUG93ZXJzIEFDMTAwIgorCXNlbGVjdCBNRkRfQ09SRQorCWRlcGVuZHMgb24gU1VOWElfUlNCCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgWC1Qb3dlcnMgQUMxMDAgYXVkaW8gY29kZWMKKwkgIElDLgorCSAgVGhpcyBkcml2ZXIgaW5jbHVkZSBvbmx5IHRoZSBjb3JlIEFQSXMuIFlvdSBoYXZlIHRvIHNlbGVjdCBpbmRpdmlkdWFsCisJICBjb21wb25lbnRzIGxpa2UgY29kZWNzIG9yIFJUQyB1bmRlciB0aGUgY29ycmVzcG9uZGluZyBtZW51cy4KKwogY29uZmlnIE1GRF9BWFAyMFgKIAl0cmlzdGF0ZQogCXNlbGVjdCBNRkRfQ09SRQpAQCAtMjgxLDYgKzI5MSwxNCBAQAogCSAgZXRjLiBtdXN0IGJlIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIHRoZSBmdW5jdGlvbmFsaXR5IG9mCiAJICB0aGUgZGV2aWNlLgogCitjb25maWcgTUZEX0VYWU5PU19MUEFTUworCXRyaXN0YXRlICJTYW1zdW5nIEV4eW5vcyBTb0MgTG93IFBvd2VyIEF1ZGlvIFN1YnN5c3RlbSIKKwlzZWxlY3QgTUZEX0NPUkUKKwlzZWxlY3QgUkVHTUFQX01NSU8KKwloZWxwCisJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIHN1cHBvcnQgZm9yIFNhbXN1bmcgRXh5bm9zIExvdyBQb3dlcgorCSAgQXVkaW8gU3Vic3lzdGVtLgorCiBjb25maWcgTUZEX01DMTNYWFgKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gKFNQSV9NQVNURVIgfHwgSTJDKQpAQCAtMzQwLDE0ICszNTgsNiBAQAogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgSGlzaWxpY29uIGhpNjU1eCBzZXJpZXMgcG1pYyBkcml2ZXIuCiAKLWNvbmZpZyBIVENfRUdQSU8KLQlib29sICJIVEMgRUdQSU8gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEdQSU9MSUIgJiYgQVJNCi0JaGVscAotCSAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgQ1BMRCBlZ3BpbyBjaGlwIHByZXNlbnQgb24KLQkgICAgc2V2ZXJhbCBIVEMgcGhvbmVzLiAgSXQgcHJvdmlkZXMgYmFzaWMgc3VwcG9ydCBmb3IgaW5wdXQKLQkgICAgcGlucywgb3V0cHV0IHBpbnMsIGFuZCBpcnFzLgotCiBjb25maWcgSFRDX1BBU0lDMwogCXRyaXN0YXRlICJIVEMgUEFTSUMzIExFRC9EUzFXTSBjaGlwIHN1cHBvcnQiCiAJc2VsZWN0IE1GRF9DT1JFCkBAIC04NTIsMTMgKzg2MiwxMyBAQAogCSAgZGlmZmVyZW50IGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRldmljZS4KIAogY29uZmlnIE1GRF9SSzgwOAotCXRyaXN0YXRlICJSb2NrY2hpcCBSSzgwOCBQb3dlciBNYW5hZ2VtZW50IGNoaXAiCisJdHJpc3RhdGUgIlJvY2tjaGlwIFJLODA4L1JLODE4IFBvd2VyIE1hbmFnZW1lbnQgQ2hpcCIKIAlkZXBlbmRzIG9uIEkyQyAmJiBPRgogCXNlbGVjdCBNRkRfQ09SRQogCXNlbGVjdCBSRUdNQVBfSTJDCiAJc2VsZWN0IFJFR01BUF9JUlEKIAloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFJLODA4CisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFJLODA4IGFuZCBSSzgxOAogCSAgUG93ZXIgTWFuYWdlbWVudCBjaGlwcy4KIAkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGNvbW1vbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIGRldmljZQogCSAgdGhyb3VnaCBJMkMgaW50ZXJmYWNlLiBUaGUgZGV2aWNlIHN1cHBvcnRzIG11bHRpcGxlIHN1Yi1kZXZpY2VzCkBAIC0xMjE0LDYgKzEyMjQsNyBAQAogCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IE1GRF9DT1JFCiAJc2VsZWN0IFJFR01BUF9JMkMKKwlzZWxlY3QgSVJRX0RPTUFJTgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgVFBTNjUyMTcgc2VyaWVzIG9mCiAJICBQb3dlciBNYW5hZ2VtZW50IC8gV2hpdGUgTEVEIGNoaXBzLgpAQCAtMTIyNCw2ICsxMjM1LDIwIEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCB0cHM2NTIxNy4KIAorY29uZmlnIE1GRF9USV9MUDg3M1gKKwl0cmlzdGF0ZSAiVEkgTFA4NzNYIFBvd2VyIE1hbmFnZW1lbnQgSUMiCisJZGVwZW5kcyBvbiBJMkMKKwlzZWxlY3QgTUZEX0NPUkUKKwlzZWxlY3QgUkVHTUFQX0kyQworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgdGhlbiB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBMUDg3M1ggc2VyaWVzIG9mCisJICBQb3dlciBNYW5hZ2VtZW50IEludGVncmF0ZWQgQ2lyY3VpdHMgKFBNSUMpLgorCSAgVGhlc2UgaW5jbHVkZSB2b2x0YWdlIHJlZ3VsYXRvcnMsIHRoZXJtYWwgcHJvdGVjdGlvbiwgY29uZmlndXJhYmxlCisJICBHZW5lcmFsIFB1cnBvc2UgT3V0cHV0cyAoR1BPKSB0aGF0IGFyZSB1c2VkIGluIHBvcnRhYmxlIGRldmljZXMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbHA4NzN4LgorCiBjb25maWcgTUZEX1RQUzY1MjE4CiAJdHJpc3RhdGUgIlRJIFRQUzY1MjE4IFBvd2VyIE1hbmFnZW1lbnQgY2hpcHMiCiAJZGVwZW5kcyBvbiBJMkMKQEAgLTE1NDksNiArMTU3NCw3IEBACiBjb25maWcgTUZEX1dNODM1MF9JMkMKIAlib29sICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004MzUwIHdpdGggSTJDIgogCXNlbGVjdCBNRkRfV004MzUwCisJc2VsZWN0IFJFR01BUF9JMkMKIAlkZXBlbmRzIG9uIEkyQz15CiAJaGVscAogCSAgVGhlIFdNODM1MCBpcyBhbiBpbnRlZ3JhdGVkIGF1ZGlvIGFuZCBwb3dlciBtYW5hZ2VtZW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9NYWtlZmlsZSBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCmluZGV4IDJiYTNiYTMuLjk4MzRlNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWZkL01ha2VmaWxlCkBAIC0xMywxNSArMTMsMTcgQEAKIG9iai0kKENPTkZJR19NRkRfQ1JPU19FQykJKz0gY3Jvc19lYy5vCiBvYmotJChDT05GSUdfTUZEX0NST1NfRUNfSTJDKQkrPSBjcm9zX2VjX2kyYy5vCiBvYmotJChDT05GSUdfTUZEX0NST1NfRUNfU1BJKQkrPSBjcm9zX2VjX3NwaS5vCitvYmotJChDT05GSUdfTUZEX0VYWU5PU19MUEFTUykJKz0gZXh5bm9zLWxwYXNzLm8KIAogcnRzeF9wY2ktb2JqcwkJCTo9IHJ0c3hfcGNyLm8gcnRzNTIwOS5vIHJ0czUyMjkubyBydGw4NDExLm8gcnRzNTIyNy5vIHJ0czUyNDkubwogb2JqLSQoQ09ORklHX01GRF9SVFNYX1BDSSkJKz0gcnRzeF9wY2kubwogb2JqLSQoQ09ORklHX01GRF9SVFNYX1VTQikJKz0gcnRzeF91c2IubwogCi1vYmotJChDT05GSUdfSFRDX0VHUElPKQkJKz0gaHRjLWVncGlvLm8KIG9iai0kKENPTkZJR19IVENfUEFTSUMzKQkrPSBodGMtcGFzaWMzLm8KIG9iai0kKENPTkZJR19IVENfSTJDUExEKQkrPSBodGMtaTJjcGxkLm8KIAorb2JqLSQoQ09ORklHX01GRF9USV9MUDg3M1gpCSs9IGxwODczeC5vCisKIG9iai0kKENPTkZJR19NRkRfREFWSU5DSV9WT0lDRUNPREVDKQkrPSBkYXZpbmNpX3ZvaWNlY29kZWMubwogb2JqLSQoQ09ORklHX01GRF9ETTM1NUVWTV9NU1ApCSs9IGRtMzU1ZXZtX21zcC5vCiBvYmotJChDT05GSUdfTUZEX1RJX0FNMzM1WF9UU0NBREMpCSs9IHRpX2FtMzM1eF90c2NhZGMubwpAQCAtMTEzLDYgKzExNSw4IEBACiBvYmotJChDT05GSUdfUE1JQ19EQTkwNTIpCSs9IGRhOTA1Mi1jb3JlLm8KIG9iai0kKENPTkZJR19NRkRfREE5MDUyX1NQSSkJKz0gZGE5MDUyLXNwaS5vCiBvYmotJChDT05GSUdfTUZEX0RBOTA1Ml9JMkMpCSs9IGRhOTA1Mi1pMmMubworCitvYmotJChDT05GSUdfTUZEX0FDMTAwKQkJKz0gYWMxMDAubwogb2JqLSQoQ09ORklHX01GRF9BWFAyMFgpCSs9IGF4cDIweC5vCiBvYmotJChDT05GSUdfTUZEX0FYUDIwWF9JMkMpCSs9IGF4cDIweC1pMmMubwogb2JqLSQoQ09ORklHX01GRF9BWFAyMFhfUlNCKQkrPSBheHAyMHgtcnNiLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FiODUwMC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL21mZC9hYjg1MDAtZGVidWdmcy5jCmluZGV4IDBhZWNkN2IuLmFjZjZjMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FiODUwMC1kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9tZmQvYWI4NTAwLWRlYnVnZnMuYwpAQCAtMTUzLDE0ICsxNTMsMTQgQEAKIAogI2RlZmluZSBBQjg1MDBfTkFNRV9TVFJJTkcgImFiODUwMCIKICNkZWZpbmUgQUI4NTAwX0FEQ19OQU1FX1NUUklORyAiZ3BhZGMiCi0jZGVmaW5lIEFCODUwMF9OVU1fQkFOS1MgMjQKKyNkZWZpbmUgQUI4NTAwX05VTV9CQU5LUyBBQjg1MDBfREVCVUdfRklFTERfTEFTVAogCiAjZGVmaW5lIEFCODUwMF9SRVZfUkVHIDB4ODAKIAogc3RhdGljIHN0cnVjdCBhYjg1MDBfcHJjbXVfcmFuZ2VzICpkZWJ1Z19yYW5nZXM7CiAKIHN0YXRpYyBzdHJ1Y3QgYWI4NTAwX3ByY211X3JhbmdlcyBhYjg1MDBfZGVidWdfcmFuZ2VzW0FCODUwMF9OVU1fQkFOS1NdID0gewotCVsweDBdID0geworCVtBQjg1MDBfTV9GU01fUkFOS10gPSB7CiAJCS5udW1fcmFuZ2VzID0gMCwKIAkJLnJhbmdlID0gTlVMTCwKIAl9LApAQCAtMzE1LDcgKzMxNSw3IEBACiAJCQl9LAogCQl9LAogCX0sCi0JWzB4OV0gPSB7CisJW0FCODUwMF9SRVNFUlZFRF0gPSB7CiAJCS5udW1fcmFuZ2VzID0gMCwKIAkJLnJhbmdlID0gTlVMTCwKIAl9LApAQCAtMzg2LDI0ICszODYsNiBAQAogCQkJfSwKIAkJfSwKIAl9LAotCVtBQjg1MDBfREVWRUxPUE1FTlRdID0gewotCQkubnVtX3JhbmdlcyA9IDEsCi0JCS5yYW5nZSA9IChzdHJ1Y3QgYWI4NTAwX3JlZ19yYW5nZVtdKSB7Ci0JCQl7Ci0JCQkJLmZpcnN0ID0gMHgwMCwKLQkJCQkubGFzdCA9IDB4MDAsCi0JCQl9LAotCQl9LAotCX0sCi0JW0FCODUwMF9ERUJVR10gPSB7Ci0JCS5udW1fcmFuZ2VzID0gMSwKLQkJLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKLQkJCXsKLQkJCQkuZmlyc3QgPSAweDA1LAotCQkJCS5sYXN0ID0gMHgwNywKLQkJCX0sCi0JCX0sCi0JfSwKIAlbQUI4NTAwX0FVRElPXSA9IHsKIAkJLm51bV9yYW5nZXMgPSAxLAogCQkucmFuZ2UgPSAoc3RydWN0IGFiODUwMF9yZWdfcmFuZ2VbXSkgewpAQCAtNDYzLDE5ICs0NDUsMjkgQEAKIAkJCX0sCiAJCX0sCiAJfSwKLQlbMHgxMV0gPSB7CisJW0FCODUwMF9ERVZFTE9QTUVOVF0gPSB7CisJCS5udW1fcmFuZ2VzID0gMSwKKwkJLnJhbmdlID0gKHN0cnVjdCBhYjg1MDBfcmVnX3JhbmdlW10pIHsKKwkJCXsKKwkJCQkuZmlyc3QgPSAweDAwLAorCQkJCS5sYXN0ID0gMHgwMCwKKwkJCX0sCisJCX0sCisJfSwKKwlbQUI4NTAwX0RFQlVHXSA9IHsKKwkJLm51bV9yYW5nZXMgPSAxLAorCQkucmFuZ2UgPSAoc3RydWN0IGFiODUwMF9yZWdfcmFuZ2VbXSkgeworCQkJeworCQkJCS5maXJzdCA9IDB4MDUsCisJCQkJLmxhc3QgPSAweDA3LAorCQkJfSwKKwkJfSwKKwl9LAorCVtBQjg1MDBfUFJPRF9URVNUXSA9IHsKIAkJLm51bV9yYW5nZXMgPSAwLAogCQkucmFuZ2UgPSBOVUxMLAogCX0sCi0JWzB4MTJdID0gewotCQkubnVtX3JhbmdlcyA9IDAsCi0JCS5yYW5nZSA9IE5VTEwsCi0JfSwKLQlbMHgxM10gPSB7Ci0JCS5udW1fcmFuZ2VzID0gMCwKLQkJLnJhbmdlID0gTlVMTCwKLQl9LAotCVsweDE0XSA9IHsKKwlbQUI4NTAwX1NURV9URVNUXSA9IHsKIAkJLm51bV9yYW5nZXMgPSAwLAogCQkucmFuZ2UgPSBOVUxMLAogCX0sCkBAIC0xMzgyLDYwICsxMzc0LDYgQEAKIAl9CiB9CiAKLS8qIFNwYWNlIGZvciA1MDAgcmVnaXN0ZXJzLiAqLwotI2RlZmluZSBEVU1QX01BWF9SRUdTIDcwMAotc3RhdGljIHN0cnVjdCBhYjg1MDBfcmVnaXN0ZXJfZHVtcAotewotCXU4IGJhbms7Ci0JdTggcmVnOwotCXU4IHZhbHVlOwotfSBhYjg1MDBfY29tcGxldGVfcmVnaXN0ZXJfZHVtcFtEVU1QX01BWF9SRUdTXTsKLQotLyogVGhpcyBzaGFsbCBvbmx5IGJlIGNhbGxlZCB1cG9uIGtlcm5lbCBwYW5pYyEgKi8KLXZvaWQgYWI4NTAwX2R1bXBfYWxsX2JhbmtzX3RvX21lbSh2b2lkKQotewotCWludCBpLCByID0gMDsKLQl1OCBiYW5rOwotCWludCBlcnIgPSAwOwotCi0JcHJfaW5mbygiU2F2aW5nIGFsbCBBQkIgcmVnaXN0ZXJzIGZvciBjcmFzaCBhbmFseXNpcy5cbiIpOwotCi0JZm9yIChiYW5rID0gMDsgYmFuayA8IEFCODUwMF9OVU1fQkFOS1M7IGJhbmsrKykgewotCQlmb3IgKGkgPSAwOyBpIDwgZGVidWdfcmFuZ2VzW2JhbmtdLm51bV9yYW5nZXM7IGkrKykgewotCQkJdTggcmVnOwotCi0JCQlmb3IgKHJlZyA9IGRlYnVnX3Jhbmdlc1tiYW5rXS5yYW5nZVtpXS5maXJzdDsKLQkJCSAgICAgcmVnIDw9IGRlYnVnX3Jhbmdlc1tiYW5rXS5yYW5nZVtpXS5sYXN0OwotCQkJICAgICByZWcrKykgewotCQkJCXU4IHZhbHVlOwotCi0JCQkJZXJyID0gcHJjbXVfYWJiX3JlYWQoYmFuaywgcmVnLCAmdmFsdWUsIDEpOwotCi0JCQkJaWYgKGVyciA8IDApCi0JCQkJCWdvdG8gb3V0OwotCi0JCQkJYWI4NTAwX2NvbXBsZXRlX3JlZ2lzdGVyX2R1bXBbcl0uYmFuayA9IGJhbms7Ci0JCQkJYWI4NTAwX2NvbXBsZXRlX3JlZ2lzdGVyX2R1bXBbcl0ucmVnID0gcmVnOwotCQkJCWFiODUwMF9jb21wbGV0ZV9yZWdpc3Rlcl9kdW1wW3JdLnZhbHVlID0gdmFsdWU7Ci0KLQkJCQlyKys7Ci0KLQkJCQlpZiAociA+PSBEVU1QX01BWF9SRUdTKSB7Ci0JCQkJCXByX2VycigiJXM6IHRvbyBtYW55IHJlZ2lzdGVyIHRvIGR1bXAhXG4iLAotCQkJCQkJX19mdW5jX18pOwotCQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCQlnb3RvIG91dDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci1vdXQ6Ci0JaWYgKGVyciA+PSAwKQotCQlwcl9pbmZvKCJTYXZlZCBhbGwgQUJCIHJlZ2lzdGVycy5cbiIpOwotCWVsc2UKLQkJcHJfaW5mbygiRmFpbGVkIHRvIHNhdmUgYWxsIEFCQiByZWdpc3RlcnMuXG4iKTsKLX0KLQogc3RhdGljIGludCBhYjg1MDBfYWxsX2JhbmtzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHNlcV9maWxlICpzOwpAQCAtMTU4NCwxOCArMTUyMiwxMCBAQAogc3RhdGljIHUzMiBudW1fd2FrZV9pbnRlcnJ1cHRzW0FCODUwMF9NQVhfTlJfSVJRU107CiBzdGF0aWMgaW50IG51bV9pbnRlcnJ1cHRfbGluZXM7CiAKLWJvb2wgX19hdHRyaWJ1dGVfXygod2VhaykpIHN1c3BlbmRfdGVzdF93YWtlX2NhdXNlX2ludGVycnVwdF9pc19taW5lKHUzMiBteV9pbnQpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIGFiODUwMF9kZWJ1Z19yZWdpc3Rlcl9pbnRlcnJ1cHQoaW50IGxpbmUpCiB7Ci0JaWYgKGxpbmUgPCBudW1faW50ZXJydXB0X2xpbmVzKSB7CisJaWYgKGxpbmUgPCBudW1faW50ZXJydXB0X2xpbmVzKQogCQludW1faW50ZXJydXB0c1tsaW5lXSsrOwotCQlpZiAoc3VzcGVuZF90ZXN0X3dha2VfY2F1c2VfaW50ZXJydXB0X2lzX21pbmUoaXJxX2FiODUwMCkpCi0JCQludW1fd2FrZV9pbnRlcnJ1cHRzW2xpbmVdKys7Ci0JfQogfQogCiBzdGF0aWMgaW50IGFiODUwMF9pbnRlcnJ1cHRzX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FjMTAwLmMgYi9kcml2ZXJzL21mZC9hYzEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzY5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9hYzEwMC5jCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogTUZEIGNvcmUgZHJpdmVyIGZvciBYLVBvd2VycycgQUMxMDAgQXVkaW8gQ29kZWMgSUMKKyAqCisgKiBUaGUgQUMxMDAgaXMgYSBoaWdobHkgaW50ZWdyYXRlZCBhdWRpbyBjb2RlYyBhbmQgUlRDIHN1YnN5c3RlbSBkZXNpZ25lZAorICogZm9yIG1vYmlsZSBhcHBsaWNhdGlvbnMuIEl0IGhhcyAzIEkyUy9QQ00gaW50ZXJmYWNlcywgYSAyIGNoYW5uZWwgREFDLAorICogYSAyIGNoYW5uZWwgQURDIHdpdGggNSBpbnB1dHMgYW5kIGEgYnVpbHRpbiBtaXhlci4gVGhlIFJUQyBzdWJzeXN0ZW0gaGFzCisgKiAzIGNsb2NrIG91dHB1dHMuCisgKgorICogVGhlIGF1ZGlvIGNvZGVjIGFuZCBSVEMgcGFydHMgYXJlIGNvbXBsZXRlbHkgc2VwYXJhdGUsIHNoYXJpbmcgb25seSB0aGUKKyAqIGhvc3QgaW50ZXJmYWNlIGZvciBhY2Nlc3MgdG8gaXRzIHJlZ2lzdGVycy4KKyAqCisgKiBDb3B5cmlnaHQgKDIwMTYpIENoZW4tWXUgVHNhaQorICoKKyAqIEF1dGhvcjogQ2hlbi1ZdSBUc2FpIDx3ZW5zQGNzaWUub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FjMTAwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW54aS1yc2IuaD4KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfcmFuZ2UgYWMxMDBfd3JpdGVhYmxlX3Jhbmdlc1tdID0geworCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfQ0hJUF9BVURJT19SU1QsIEFDMTAwX0kyU19TUl9DVFJMKSwKKwlyZWdtYXBfcmVnX3JhbmdlKEFDMTAwX0kyUzFfQ0xLX0NUUkwsIEFDMTAwX0kyUzFfTVhSX0dBSU4pLAorCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfSTJTMl9DTEtfQ1RSTCwgQUMxMDBfSTJTMl9NWFJfR0FJTiksCisJcmVnbWFwX3JlZ19yYW5nZShBQzEwMF9JMlMzX0NMS19DVFJMLCBBQzEwMF9JMlMzX1NJR19QQVRIX0NUUkwpLAorCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfQURDX0RJR19DVFJMLCBBQzEwMF9BRENfVk9MX0NUUkwpLAorCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfSE1JQ19DVFJMMSwgQUMxMDBfSE1JQ19TVEFUVVMpLAorCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfREFDX0RJR19DVFJMLCBBQzEwMF9EQUNfTVhSX0dBSU4pLAorCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfQURDX0FQQ19DVFJMLCBBQzEwMF9MSU5FT1VUX0NUUkwpLAorCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfQURDX0RBUF9MX0NUUkwsIEFDMTAwX0FEQ19EQVBfT1BUKSwKKwlyZWdtYXBfcmVnX3JhbmdlKEFDMTAwX0RBQ19EQVBfQ1RSTCwgQUMxMDBfREFDX0RBUF9PUFQpLAorCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfQURDX0RBUF9FTkEsIEFDMTAwX0RBQ19EQVBfRU5BKSwKKwlyZWdtYXBfcmVnX3JhbmdlKEFDMTAwX1NSQzFfQ1RSTDEsIEFDMTAwX1NSQzFfQ1RSTDIpLAorCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfU1JDMl9DVFJMMSwgQUMxMDBfU1JDMl9DVFJMMiksCisJcmVnbWFwX3JlZ19yYW5nZShBQzEwMF9DTEszMktfQU5BTE9HX0NUUkwsIEFDMTAwX0NMS09VVF9DVFJMMyksCisJcmVnbWFwX3JlZ19yYW5nZShBQzEwMF9SVENfUlNULCBBQzEwMF9SVENfVVBEKSwKKwlyZWdtYXBfcmVnX3JhbmdlKEFDMTAwX0FMTV9JTlRfRU5BLCBBQzEwMF9BTE1fSU5UX1NUQSksCisJcmVnbWFwX3JlZ19yYW5nZShBQzEwMF9BTE1fU0VDLCBBQzEwMF9SVENfR1AoMTUpKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlIGFjMTAwX3ZvbGF0aWxlX3Jhbmdlc1tdID0geworCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfQ0hJUF9BVURJT19SU1QsIEFDMTAwX1BMTF9DVFJMMiksCisJcmVnbWFwX3JlZ19yYW5nZShBQzEwMF9ITUlDX1NUQVRVUywgQUMxMDBfSE1JQ19TVEFUVVMpLAorCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfQURDX0RBUF9MX1NUQSwgQUMxMDBfQURDX0RBUF9MX1NUQSksCisJcmVnbWFwX3JlZ19yYW5nZShBQzEwMF9TUkMxX0NUUkwxLCBBQzEwMF9TUkMxX0NUUkwxKSwKKwlyZWdtYXBfcmVnX3JhbmdlKEFDMTAwX1NSQzFfQ1RSTDMsIEFDMTAwX1NSQzJfQ1RSTDEpLAorCXJlZ21hcF9yZWdfcmFuZ2UoQUMxMDBfU1JDMl9DVFJMMywgQUMxMDBfU1JDMl9DVFJMNCksCisJcmVnbWFwX3JlZ19yYW5nZShBQzEwMF9SVENfUlNULCBBQzEwMF9SVENfUlNUKSwKKwlyZWdtYXBfcmVnX3JhbmdlKEFDMTAwX1JUQ19TRUMsIEFDMTAwX0FMTV9JTlRfU1RBKSwKKwlyZWdtYXBfcmVnX3JhbmdlKEFDMTAwX0FMTV9TRUMsIEFDMTAwX0FMTV9VUEQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfYWNjZXNzX3RhYmxlIGFjMTAwX3dyaXRlYWJsZV90YWJsZSA9IHsKKwkueWVzX3Jhbmdlcwk9IGFjMTAwX3dyaXRlYWJsZV9yYW5nZXMsCisJLm5feWVzX3Jhbmdlcwk9IEFSUkFZX1NJWkUoYWMxMDBfd3JpdGVhYmxlX3JhbmdlcyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgYWMxMDBfdm9sYXRpbGVfdGFibGUgPSB7CisJLnllc19yYW5nZXMJPSBhYzEwMF92b2xhdGlsZV9yYW5nZXMsCisJLm5feWVzX3Jhbmdlcwk9IEFSUkFZX1NJWkUoYWMxMDBfdm9sYXRpbGVfcmFuZ2VzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhYzEwMF9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cwk9IDgsCisJLnZhbF9iaXRzCT0gMTYsCisJLndyX3RhYmxlCT0gJmFjMTAwX3dyaXRlYWJsZV90YWJsZSwKKwkudm9sYXRpbGVfdGFibGUJPSAmYWMxMDBfdm9sYXRpbGVfdGFibGUsCisJLm1heF9yZWdpc3Rlcgk9IEFDMTAwX1JUQ19HUCgxNSksCisJLmNhY2hlX3R5cGUJPSBSRUdDQUNIRV9SQlRSRUUsCit9OworCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIGFjMTAwX2NlbGxzW10gPSB7CisJeworCQkubmFtZQkJPSAiYWMxMDAtY29kZWMiLAorCQkub2ZfY29tcGF0aWJsZQk9ICJ4LXBvd2VycyxhYzEwMC1jb2RlYyIsCisJfSwgeworCQkubmFtZQkJPSAiYWMxMDAtcnRjIiwKKwkJLm9mX2NvbXBhdGlibGUJPSAieC1wb3dlcnMsYWMxMDAtcnRjIiwKKwl9LAorfTsKKworc3RhdGljIGludCBhYzEwMF9yc2JfcHJvYmUoc3RydWN0IHN1bnhpX3JzYl9kZXZpY2UgKnJkZXYpCit7CisJc3RydWN0IGFjMTAwX2RldiAqYWMxMDA7CisJaW50IHJldDsKKworCWFjMTAwID0gZGV2bV9remFsbG9jKCZyZGV2LT5kZXYsIHNpemVvZigqYWMxMDApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjMTAwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFjMTAwLT5kZXYgPSAmcmRldi0+ZGV2OworCXN1bnhpX3JzYl9kZXZpY2Vfc2V0X2RydmRhdGEocmRldiwgYWMxMDApOworCisJYWMxMDAtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3VueGlfcnNiKHJkZXYsICZhYzEwMF9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKGFjMTAwLT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIoYWMxMDAtPnJlZ21hcCk7CisJCWRldl9lcnIoYWMxMDAtPmRldiwgInJlZ21hcCBpbml0IGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZGV2bV9tZmRfYWRkX2RldmljZXMoYWMxMDAtPmRldiwgUExBVEZPUk1fREVWSURfTk9ORSwgYWMxMDBfY2VsbHMsCisJCQkJICAgQVJSQVlfU0laRShhYzEwMF9jZWxscyksIE5VTEwsIDAsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihhYzEwMC0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBNRkQgZGV2aWNlczogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFjMTAwX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ4LXBvd2VycyxhYzEwMCIgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYWMxMDBfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHN1bnhpX3JzYl9kcml2ZXIgYWMxMDBfcnNiX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhYzEwMCIsCisJCS5vZl9tYXRjaF90YWJsZQk9IG9mX21hdGNoX3B0cihhYzEwMF9vZl9tYXRjaCksCisJfSwKKwkucHJvYmUJPSBhYzEwMF9yc2JfcHJvYmUsCit9OworbW9kdWxlX3N1bnhpX3JzYl9kcml2ZXIoYWMxMDBfcnNiX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQXVkaW8gY29kZWMgTUZEIGNvcmUgZHJpdmVyIGZvciBBQzEwMCIpOworTU9EVUxFX0FVVEhPUigiQ2hlbi1ZdSBUc2FpIDx3ZW5zQGNzaWUub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWN0ODk0NWEuYyBiL2RyaXZlcnMvbWZkL2FjdDg5NDVhLmMKaW5kZXggMTBjNmQyZC4uYTQwMjRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYWN0ODk0NWEuYworKysgYi9kcml2ZXJzL21mZC9hY3Q4OTQ1YS5jCkBAIC0yMyw2ICsyMyw3IEBACiAJfSwKIAl7CiAJCS5uYW1lID0gImFjdDg5NDVhLWNoYXJnZXIiLAorCQkub2ZfY29tcGF0aWJsZSA9ICJhY3RpdmUtc2VtaSxhY3Q4OTQ1YS1jaGFyZ2VyIiwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWx0ZXJhLWExMHNyLmMgYi9kcml2ZXJzL21mZC9hbHRlcmEtYTEwc3IuYwppbmRleCBjMDVhYTRmLi4wNmUxZjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hbHRlcmEtYTEwc3IuYworKysgYi9kcml2ZXJzL21mZC9hbHRlcmEtYTEwc3IuYwpAQCAtMSw0ICsxLDggQEAKIC8qCisgKiBBbHRlcmEgQXJyaWExMCBEZXZLaXQgU3lzdGVtIFJlc291cmNlIE1GRCBEcml2ZXIKKyAqCisgKiBBdXRob3I6IFRob3IgVGhheWVyIDx0dGhheWVyQG9wZW5zb3VyY2UuYWx0ZXJhLmNvbT4KKyAqCiAgKiBDb3B5cmlnaHQgSW50ZWwgQ29ycG9yYXRpb24gKEMpIDIwMTQtMjAxNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZAogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CkBAIC0yMCw3ICsyNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tZmQvYWx0ZXJhLWExMHNyLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKQEAgLTk0LDcgKzk4LDcgQEAKIAl9CiB9CiAKLWNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGFsdHJfYTEwc3JfcmVnbWFwX2NvbmZpZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhbHRyX2ExMHNyX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gOCwKIAkudmFsX2JpdHMgPSA4LAogCkBAIC0xNTIsNyArMTU2LDYgQEAKIAl7IC5jb21wYXRpYmxlID0gImFsdHIsYTEwc3IiIH0sCiAJeyB9LAogfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFsdHJfYTEwc3Jfc3BpX29mX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFsdHJfYTEwc3Jfc3BpX2RyaXZlciA9IHsKIAkucHJvYmUgPSBhbHRyX2ExMHNyX3NwaV9wcm9iZSwKQEAgLTE2MSw5ICsxNjQsNCBAQAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoYWx0cl9hMTBzcl9zcGlfb2ZfbWF0Y2gpLAogCX0sCiB9OwotCi1tb2R1bGVfc3BpX2RyaXZlcihhbHRyX2ExMHNyX3NwaV9kcml2ZXIpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQVVUSE9SKCJUaG9yIFRoYXllciA8dHRoYXllckBvcGVuc291cmNlLmFsdGVyYS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFsdGVyYSBBcnJpYTEwIERldktpdCBTeXN0ZW0gUmVzb3VyY2UgTUZEIERyaXZlciIpOworYnVpbHRpbl9kcml2ZXIoYWx0cl9hMTBzcl9zcGlfZHJpdmVyLCBzcGlfcmVnaXN0ZXJfZHJpdmVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYXJpem9uYS1jb3JlLmMgYi9kcml2ZXJzL21mZC9hcml6b25hLWNvcmUuYwppbmRleCBlNGY5N2IzLi40MTc2N2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hcml6b25hLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9hcml6b25hLWNvcmUuYwpAQCAtMTAsNiArMTAsNyBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpAQCAtNDksNyArNTAsMTUgQEAKIAkJY2FzZSBBUklaT05BXzMyS1pfTUNMSzE6CiAJCQlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGFyaXpvbmEtPmRldik7CiAJCQlpZiAocmV0ICE9IDApCi0JCQkJZ290byBvdXQ7CisJCQkJZ290byBlcnJfcmVmOworCQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGFyaXpvbmEtPm1jbGtbQVJJWk9OQV9NQ0xLMV0pOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWdvdG8gZXJyX3BtOworCQkJYnJlYWs7CisJCWNhc2UgQVJJWk9OQV8zMktaX01DTEsyOgorCQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGFyaXpvbmEtPm1jbGtbQVJJWk9OQV9NQ0xLMl0pOworCQkJaWYgKHJldCAhPSAwKQorCQkJCWdvdG8gZXJyX3JlZjsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTU4LDcgKzY3LDkgQEAKIAkJCQkJIEFSSVpPTkFfQ0xLXzMyS19FTkEpOwogCX0KIAotb3V0OgorZXJyX3BtOgorCXBtX3J1bnRpbWVfcHV0X3N5bmMoYXJpem9uYS0+ZGV2KTsKK2Vycl9yZWY6CiAJaWYgKHJldCAhPSAwKQogCQlhcml6b25hLT5jbGszMmtfcmVmLS07CiAKQEAgLTgzLDYgKzk0LDEwIEBACiAJCXN3aXRjaCAoYXJpem9uYS0+cGRhdGEuY2xrMzJrX3NyYykgewogCQljYXNlIEFSSVpPTkFfMzJLWl9NQ0xLMToKIAkJCXBtX3J1bnRpbWVfcHV0X3N5bmMoYXJpem9uYS0+ZGV2KTsKKwkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShhcml6b25hLT5tY2xrW0FSSVpPTkFfTUNMSzFdKTsKKwkJCWJyZWFrOworCQljYXNlIEFSSVpPTkFfMzJLWl9NQ0xLMjoKKwkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShhcml6b25hLT5tY2xrW0FSSVpPTkFfTUNMSzJdKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNzM1LDcgKzc1MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXJpem9uYV9zdXNwZW5kX2xhdGUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBhcml6b25hX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBhcml6b25hICphcml6b25hID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKQEAgLTc1OSw3ICs3NzQsNyBAQAogewogCXN0cnVjdCBhcml6b25hICphcml6b25hID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlkZXZfZGJnKGFyaXpvbmEtPmRldiwgIkxhdGUgcmVzdW1lLCByZWVuYWJsaW5nIElSUVxuIik7CisJZGV2X2RiZyhhcml6b25hLT5kZXYsICJSZXN1bWUsIHJlZW5hYmxpbmcgSVJRXG4iKTsKIAllbmFibGVfaXJxKGFyaXpvbmEtPmlycSk7CiAKIAlyZXR1cm4gMDsKQEAgLTc3MSwxMCArNzg2LDggQEAKIAkJCSAgIGFyaXpvbmFfcnVudGltZV9yZXN1bWUsCiAJCQkgICBOVUxMKQogCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGFyaXpvbmFfc3VzcGVuZCwgYXJpem9uYV9yZXN1bWUpCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi0JLnN1c3BlbmRfbGF0ZSA9IGFyaXpvbmFfc3VzcGVuZF9sYXRlLAotCS5yZXN1bWVfbm9pcnEgPSBhcml6b25hX3Jlc3VtZV9ub2lycSwKLSNlbmRpZgorCVNFVF9OT0lSUV9TWVNURU1fU0xFRVBfUE1fT1BTKGFyaXpvbmFfc3VzcGVuZF9ub2lycSwKKwkJCQkgICAgICBhcml6b25hX3Jlc3VtZV9ub2lycSkKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChhcml6b25hX3BtX29wcyk7CiAKQEAgLTc5MCwzNSArODAzLDI1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhcml6b25hX29mX2dldF90eXBlKTsKIAotaW50IGFyaXpvbmFfb2ZfZ2V0X25hbWVkX2dwaW8oc3RydWN0IGFyaXpvbmEgKmFyaXpvbmEsIGNvbnN0IGNoYXIgKnByb3AsCi0JCQkgICAgICBib29sIG1hbmRhdG9yeSkKLXsKLQlpbnQgZ3BpbzsKLQotCWdwaW8gPSBvZl9nZXRfbmFtZWRfZ3Bpbyhhcml6b25hLT5kZXYtPm9mX25vZGUsIHByb3AsIDApOwotCWlmIChncGlvIDwgMCkgewotCQlpZiAobWFuZGF0b3J5KQotCQkJZGV2X2Vycihhcml6b25hLT5kZXYsCi0JCQkJIk1hbmRhdG9yeSBEVCBncGlvICVzIG1pc3NpbmcvbWFsZm9ybWVkOiAlZFxuIiwKLQkJCQlwcm9wLCBncGlvKTsKLQotCQlncGlvID0gMDsKLQl9Ci0KLQlyZXR1cm4gZ3BpbzsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGFyaXpvbmFfb2ZfZ2V0X25hbWVkX2dwaW8pOwotCiBzdGF0aWMgaW50IGFyaXpvbmFfb2ZfZ2V0X2NvcmVfcGRhdGEoc3RydWN0IGFyaXpvbmEgKmFyaXpvbmEpCiB7CiAJc3RydWN0IGFyaXpvbmFfcGRhdGEgKnBkYXRhID0gJmFyaXpvbmEtPnBkYXRhOwogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAljb25zdCBfX2JlMzIgKmN1cjsKIAl1MzIgdmFsOworCXUzMiBwZG1fdmFsW0FSSVpPTkFfTUFYX1BETV9TUEtdOwogCWludCByZXQsIGk7CiAJaW50IGNvdW50ID0gMDsKIAotCXBkYXRhLT5yZXNldCA9IGFyaXpvbmFfb2ZfZ2V0X25hbWVkX2dwaW8oYXJpem9uYSwgIndsZixyZXNldCIsIHRydWUpOworCXBkYXRhLT5yZXNldCA9IG9mX2dldF9uYW1lZF9ncGlvKGFyaXpvbmEtPmRldi0+b2Zfbm9kZSwgIndsZixyZXNldCIsIDApOworCWlmIChwZGF0YS0+cmVzZXQgPT0gLUVQUk9CRV9ERUZFUikgeworCQlyZXR1cm4gcGRhdGEtPnJlc2V0OworCX0gZWxzZSBpZiAocGRhdGEtPnJlc2V0IDwgMCkgeworCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIlJlc2V0IEdQSU8gbWlzc2luZy9tYWxmb3JtZWQ6ICVkXG4iLAorCQkJcGRhdGEtPnJlc2V0KTsKKworCQlwZGF0YS0+cmVzZXQgPSAwOworCX0KIAogCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGFyaXpvbmEtPmRldi0+b2Zfbm9kZSwKIAkJCQkJICJ3bGYsZ3Bpby1kZWZhdWx0cyIsCkBAIC04NzEsNiArODc0LDM1IEBACiAJCWNvdW50Kys7CiAJfQogCisJY291bnQgPSAwOworCW9mX3Byb3BlcnR5X2Zvcl9lYWNoX3UzMihhcml6b25hLT5kZXYtPm9mX25vZGUsCisJCQkJICJ3bGYsbWF4LWNoYW5uZWxzLWNsb2NrZWQiLAorCQkJCSBwcm9wLCBjdXIsIHZhbCkgeworCQlpZiAoY291bnQgPT0gQVJSQVlfU0laRShwZGF0YS0+bWF4X2NoYW5uZWxzX2Nsb2NrZWQpKQorCQkJYnJlYWs7CisKKwkJcGRhdGEtPm1heF9jaGFubmVsc19jbG9ja2VkW2NvdW50XSA9IHZhbDsKKwkJY291bnQrKzsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShhcml6b25hLT5kZXYtPm9mX25vZGUsCisJCQkJCSAid2xmLHNway1mbXQiLAorCQkJCQkgcGRtX3ZhbCwKKwkJCQkJIEFSUkFZX1NJWkUocGRtX3ZhbCkpOworCisJaWYgKHJldCA+PSAwKQorCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBBUlJBWV9TSVpFKHBkYXRhLT5zcGtfZm10KTsgKytjb3VudCkKKwkJCXBkYXRhLT5zcGtfZm10W2NvdW50XSA9IHBkbV92YWxbY291bnRdOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoYXJpem9uYS0+ZGV2LT5vZl9ub2RlLAorCQkJCQkgIndsZixzcGstbXV0ZSIsCisJCQkJCSBwZG1fdmFsLAorCQkJCQkgQVJSQVlfU0laRShwZG1fdmFsKSk7CisKKwlpZiAocmV0ID49IDApCisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEFSUkFZX1NJWkUocGRhdGEtPnNwa19tdXRlKTsgKytjb3VudCkKKwkJCXBkYXRhLT5zcGtfbXV0ZVtjb3VudF0gPSBwZG1fdmFsW2NvdW50XTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMDAwLDYgKzEwMzIsNyBAQAogCiBpbnQgYXJpem9uYV9kZXZfaW5pdChzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSkKIHsKKwljb25zdCBjaGFyICogY29uc3QgbWNsa19uYW1lW10gPSB7ICJtY2xrMSIsICJtY2xrMiIgfTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhcml6b25hLT5kZXY7CiAJY29uc3QgY2hhciAqdHlwZV9uYW1lID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgcmVnLCB2YWwsIG1hc2s7CkBAIC0xMDEwLDExICsxMDQzLDI0IEBACiAJZGV2X3NldF9kcnZkYXRhKGFyaXpvbmEtPmRldiwgYXJpem9uYSk7CiAJbXV0ZXhfaW5pdCgmYXJpem9uYS0+Y2xrX2xvY2spOwogCi0JaWYgKGRldl9nZXRfcGxhdGRhdGEoYXJpem9uYS0+ZGV2KSkKKwlpZiAoZGV2X2dldF9wbGF0ZGF0YShhcml6b25hLT5kZXYpKSB7CiAJCW1lbWNweSgmYXJpem9uYS0+cGRhdGEsIGRldl9nZXRfcGxhdGRhdGEoYXJpem9uYS0+ZGV2KSwKIAkJICAgICAgIHNpemVvZihhcml6b25hLT5wZGF0YSkpOwotCWVsc2UKLQkJYXJpem9uYV9vZl9nZXRfY29yZV9wZGF0YShhcml6b25hKTsKKwl9IGVsc2UgeworCQlyZXQgPSBhcml6b25hX29mX2dldF9jb3JlX3BkYXRhKGFyaXpvbmEpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoYXJpem9uYS0+bWNsaykgIT0gQVJSQVlfU0laRShtY2xrX25hbWUpKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhcml6b25hLT5tY2xrKTsgaSsrKSB7CisJCWFyaXpvbmEtPm1jbGtbaV0gPSBkZXZtX2Nsa19nZXQoYXJpem9uYS0+ZGV2LCBtY2xrX25hbWVbaV0pOworCQlpZiAoSVNfRVJSKGFyaXpvbmEtPm1jbGtbaV0pKSB7CisJCQlkZXZfaW5mbyhhcml6b25hLT5kZXYsICJGYWlsZWQgdG8gZ2V0ICVzOiAlbGRcbiIsCisJCQkJIG1jbGtfbmFtZVtpXSwgUFRSX0VSUihhcml6b25hLT5tY2xrW2ldKSk7CisJCQlhcml6b25hLT5tY2xrW2ldID0gTlVMTDsKKwkJfQorCX0KIAogCXJlZ2NhY2hlX2NhY2hlX29ubHkoYXJpem9uYS0+cmVnbWFwLCB0cnVlKTsKIApAQCAtMTAzNSw3ICsxMDgxLDcgQEAKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIlVua25vd24gZGV2aWNlIHR5cGUgJWRcbiIsCiAJCQlhcml6b25hLT50eXBlKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCS8qIE1hcmsgRENWREQgYXMgZXh0ZXJuYWwsIExETzEgZHJpdmVyIHdpbGwgY2xlYXIgaWYgaW50ZXJuYWwgKi8KQEAgLTExMjEsNiArMTE2Nyw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoYXJpem9uYS0+ZGV2LCAiVW5rbm93biBkZXZpY2UgSUQ6ICV4XG4iLCByZWcpOworCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycl9yZXNldDsKIAl9CiAKQEAgLTEyODAsMTIgKzEzMjcsMTQgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2Vycihhcml6b25hLT5kZXYsICJVbmtub3duIGRldmljZSBJRCAleFxuIiwgcmVnKTsKKwkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJfcmVzZXQ7CiAJfQogCiAJaWYgKCFzdWJkZXZzKSB7CiAJCWRldl9lcnIoYXJpem9uYS0+ZGV2LAogCQkJIk5vIGtlcm5lbCBzdXBwb3J0IGZvciBkZXZpY2UgSUQgJXhcbiIsIHJlZyk7CisJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX3Jlc2V0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYXRtZWwtaGxjZGMuYyBiL2RyaXZlcnMvbWZkL2F0bWVsLWhsY2RjLmMKaW5kZXggZWNhN2VhNi4uNGIxNWIwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYXRtZWwtaGxjZGMuYworKysgYi9kcml2ZXJzL21mZC9hdG1lbC1obGNkYy5jCkBAIC01MCw4ICs1MCw5IEBACiAJaWYgKHJlZyA8PSBBVE1FTF9ITENEQ19ESVMpIHsKIAkJdTMyIHN0YXR1czsKIAotCQlyZWFkbF9wb2xsX3RpbWVvdXQoaHJlZ21hcC0+cmVncyArIEFUTUVMX0hMQ0RDX1NSLCBzdGF0dXMsCi0JCQkJICAgIShzdGF0dXMgJiBBVE1FTF9ITENEQ19TSVApLCAxLCAxMDApOworCQlyZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljKGhyZWdtYXAtPnJlZ3MgKyBBVE1FTF9ITENEQ19TUiwKKwkJCQkJICBzdGF0dXMsICEoc3RhdHVzICYgQVRNRUxfSExDRENfU0lQKSwKKwkJCQkJICAxLCAxMDApOwogCX0KIAogCXdyaXRlbCh2YWwsIGhyZWdtYXAtPnJlZ3MgKyByZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYXhwMjB4LXJzYi5jIGIvZHJpdmVycy9tZmQvYXhwMjB4LXJzYi5jCmluZGV4IGE0MDc1MjcuLmE3MzJjYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2F4cDIweC1yc2IuYworKysgYi9kcml2ZXJzL21mZC9heHAyMHgtcnNiLmMKQEAgLTYxLDYgKzYxLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXhwMjB4X3JzYl9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAieC1wb3dlcnMsYXhwMjIzIiwgLmRhdGEgPSAodm9pZCAqKUFYUDIyM19JRCB9LAorCXsgLmNvbXBhdGlibGUgPSAieC1wb3dlcnMsYXhwODA2IiwgLmRhdGEgPSAodm9pZCAqKUFYUDgwNl9JRCB9LAogCXsgLmNvbXBhdGlibGUgPSAieC1wb3dlcnMsYXhwODA5IiwgLmRhdGEgPSAodm9pZCAqKUFYUDgwOV9JRCB9LAogCXsgfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9heHAyMHguYyBiL2RyaXZlcnMvbWZkL2F4cDIweC5jCmluZGV4IGZkODBiMDkuLmJhMTMwYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2F4cDIweC5jCisrKyBiL2RyaXZlcnMvbWZkL2F4cDIweC5jCkBAIC0zOCw2ICszOCw3IEBACiAJIkFYUDIyMSIsCiAJIkFYUDIyMyIsCiAJIkFYUDI4OCIsCisJIkFYUDgwNiIsCiAJIkFYUDgwOSIsCiB9OwogCkBAIC0xMjksNiArMTMwLDI3IEBACiAJLm5feWVzX3Jhbmdlcwk9IEFSUkFZX1NJWkUoYXhwMjg4X3ZvbGF0aWxlX3JhbmdlcyksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9yYW5nZSBheHA4MDZfd3JpdGVhYmxlX3Jhbmdlc1tdID0geworCXJlZ21hcF9yZWdfcmFuZ2UoQVhQMjBYX0RBVEFDQUNIRSgwKSwgQVhQMjBYX0RBVEFDQUNIRSgzKSksCisJcmVnbWFwX3JlZ19yYW5nZShBWFA4MDZfUFdSX09VVF9DVFJMMSwgQVhQODA2X0NMRE8zX1ZfQ1RSTCksCisJcmVnbWFwX3JlZ19yYW5nZShBWFAyMFhfSVJRMV9FTiwgQVhQMjBYX0lSUTJfRU4pLAorCXJlZ21hcF9yZWdfcmFuZ2UoQVhQMjBYX0lSUTFfU1RBVEUsIEFYUDIwWF9JUlEyX1NUQVRFKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlIGF4cDgwNl92b2xhdGlsZV9yYW5nZXNbXSA9IHsKKwlyZWdtYXBfcmVnX3JhbmdlKEFYUDIwWF9JUlExX1NUQVRFLCBBWFAyMFhfSVJRMl9TVEFURSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgYXhwODA2X3dyaXRlYWJsZV90YWJsZSA9IHsKKwkueWVzX3Jhbmdlcwk9IGF4cDgwNl93cml0ZWFibGVfcmFuZ2VzLAorCS5uX3llc19yYW5nZXMJPSBBUlJBWV9TSVpFKGF4cDgwNl93cml0ZWFibGVfcmFuZ2VzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2FjY2Vzc190YWJsZSBheHA4MDZfdm9sYXRpbGVfdGFibGUgPSB7CisJLnllc19yYW5nZXMJPSBheHA4MDZfdm9sYXRpbGVfcmFuZ2VzLAorCS5uX3llc19yYW5nZXMJPSBBUlJBWV9TSVpFKGF4cDgwNl92b2xhdGlsZV9yYW5nZXMpLAorfTsKKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBheHAxNTJfcGVrX3Jlc291cmNlc1tdID0gewogCURFRklORV9SRVNfSVJRX05BTUVEKEFYUDE1Ml9JUlFfUEVLX1JJU19FREdFLCAiUEVLX0RCUiIpLAogCURFRklORV9SRVNfSVJRX05BTUVEKEFYUDE1Ml9JUlFfUEVLX0ZBTF9FREdFLCAiUEVLX0RCRiIpLApAQCAtMjc4LDYgKzMwMCwxNSBAQAogCS5jYWNoZV90eXBlCT0gUkVHQ0FDSEVfUkJUUkVFLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGF4cDgwNl9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cwk9IDgsCisJLnZhbF9iaXRzCT0gOCwKKwkud3JfdGFibGUJPSAmYXhwODA2X3dyaXRlYWJsZV90YWJsZSwKKwkudm9sYXRpbGVfdGFibGUJPSAmYXhwODA2X3ZvbGF0aWxlX3RhYmxlLAorCS5tYXhfcmVnaXN0ZXIJPSBBWFA4MDZfVlJFRl9URU1QX1dBUk5fTCwKKwkuY2FjaGVfdHlwZQk9IFJFR0NBQ0hFX1JCVFJFRSwKK307CisKICNkZWZpbmUgSU5JVF9SRUdNQVBfSVJRKF92YXJpYW50LCBfaXJxLCBfb2ZmLCBfbWFzaykJCQlcCiAJW192YXJpYW50IyNfSVJRXyMjX2lycV0gPSB7IC5yZWdfb2Zmc2V0ID0gKF9vZmYpLCAubWFzayA9IEJJVChfbWFzaykgfQogCkBAIC00MDksNiArNDQwLDIxIEBACiAJSU5JVF9SRUdNQVBfSVJRKEFYUDI4OCwgQkNfVVNCX0NITkcsICAgICAgICAgICAgNSwgMSksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnEgYXhwODA2X3JlZ21hcF9pcnFzW10gPSB7CisJSU5JVF9SRUdNQVBfSVJRKEFYUDgwNiwgRElFX1RFTVBfSElHSF9MVjEsCTAsIDApLAorCUlOSVRfUkVHTUFQX0lSUShBWFA4MDYsIERJRV9URU1QX0hJR0hfTFYyLAkwLCAxKSwKKwlJTklUX1JFR01BUF9JUlEoQVhQODA2LCBEQ0RDQV9WX0xPVywJCTAsIDMpLAorCUlOSVRfUkVHTUFQX0lSUShBWFA4MDYsIERDRENCX1ZfTE9XLAkJMCwgNCksCisJSU5JVF9SRUdNQVBfSVJRKEFYUDgwNiwgRENEQ0NfVl9MT1csCQkwLCA1KSwKKwlJTklUX1JFR01BUF9JUlEoQVhQODA2LCBEQ0RDRF9WX0xPVywJCTAsIDYpLAorCUlOSVRfUkVHTUFQX0lSUShBWFA4MDYsIERDRENFX1ZfTE9XLAkJMCwgNyksCisJSU5JVF9SRUdNQVBfSVJRKEFYUDgwNiwgUFdST0tfTE9ORywJCTEsIDApLAorCUlOSVRfUkVHTUFQX0lSUShBWFA4MDYsIFBXUk9LX1NIT1JULAkJMSwgMSksCisJSU5JVF9SRUdNQVBfSVJRKEFYUDgwNiwgV0FLRVVQLAkJCTEsIDQpLAorCUlOSVRfUkVHTUFQX0lSUShBWFA4MDYsIFBXUk9LX0ZBTEwsCQkxLCA1KSwKKwlJTklUX1JFR01BUF9JUlEoQVhQODA2LCBQV1JPS19SSVNFLAkJMSwgNiksCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnEgYXhwODA5X3JlZ21hcF9pcnFzW10gPSB7CiAJSU5JVF9SRUdNQVBfSVJRKEFYUDgwOSwgQUNJTl9PVkVSX1YsCQkwLCA3KSwKIAlJTklUX1JFR01BUF9JUlEoQVhQODA5LCBBQ0lOX1BMVUdJTiwJCTAsIDYpLApAQCAtNDk0LDYgKzU0MCwxOCBAQAogCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnFfY2hpcCBheHA4MDZfcmVnbWFwX2lycV9jaGlwID0geworCS5uYW1lCQkJPSAiYXhwODA2IiwKKwkuc3RhdHVzX2Jhc2UJCT0gQVhQMjBYX0lSUTFfU1RBVEUsCisJLmFja19iYXNlCQk9IEFYUDIwWF9JUlExX1NUQVRFLAorCS5tYXNrX2Jhc2UJCT0gQVhQMjBYX0lSUTFfRU4sCisJLm1hc2tfaW52ZXJ0CQk9IHRydWUsCisJLmluaXRfYWNrX21hc2tlZAk9IHRydWUsCisJLmlycXMJCQk9IGF4cDgwNl9yZWdtYXBfaXJxcywKKwkubnVtX2lycXMJCT0gQVJSQVlfU0laRShheHA4MDZfcmVnbWFwX2lycXMpLAorCS5udW1fcmVncwkJPSAyLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfaXJxX2NoaXAgYXhwODA5X3JlZ21hcF9pcnFfY2hpcCA9IHsKIAkubmFtZQkJCT0gImF4cDgwOSIsCiAJLnN0YXR1c19iYXNlCQk9IEFYUDIwWF9JUlExX1NUQVRFLApAQCAtNTA4LDYgKzU2Niw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgYXhwMjB4X2NlbGxzW10gPSB7CiAJeworCQkubmFtZQkJPSAiYXhwMjB4LWdwaW8iLAorCQkub2ZfY29tcGF0aWJsZQk9ICJ4LXBvd2VycyxheHAyMDktZ3BpbyIsCisJfSwgewogCQkubmFtZQkJPSAiYXhwMjB4LXBlayIsCiAJCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShheHAyMHhfcGVrX3Jlc291cmNlcyksCiAJCS5yZXNvdXJjZXMJPSBheHAyMHhfcGVrX3Jlc291cmNlcywKQEAgLTY2MCwxMiArNzIxLDIwIEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgYXhwODA2X2NlbGxzW10gPSB7CisJeworCQkuaWQJCQk9IDIsCisJCS5uYW1lCQkJPSAiYXhwMjB4LXJlZ3VsYXRvciIsCisJfSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgYXhwODA5X2NlbGxzW10gPSB7CiAJewogCQkubmFtZQkJCT0gImF4cDIweC1wZWsiLAogCQkubnVtX3Jlc291cmNlcwkJPSBBUlJBWV9TSVpFKGF4cDgwOV9wZWtfcmVzb3VyY2VzKSwKIAkJLnJlc291cmNlcwkJPSBheHA4MDlfcGVrX3Jlc291cmNlcywKIAl9LCB7CisJCS5pZAkJCT0gMSwKIAkJLm5hbWUJCQk9ICJheHAyMHgtcmVndWxhdG9yIiwKIAl9LAogfTsKQEAgLTczMiw2ICs4MDEsMTIgQEAKIAkJYXhwMjB4LT5yZWdtYXBfY2ZnID0gJmF4cDI4OF9yZWdtYXBfY29uZmlnOwogCQlheHAyMHgtPnJlZ21hcF9pcnFfY2hpcCA9ICZheHAyODhfcmVnbWFwX2lycV9jaGlwOwogCQlicmVhazsKKwljYXNlIEFYUDgwNl9JRDoKKwkJYXhwMjB4LT5ucl9jZWxscyA9IEFSUkFZX1NJWkUoYXhwODA2X2NlbGxzKTsKKwkJYXhwMjB4LT5jZWxscyA9IGF4cDgwNl9jZWxsczsKKwkJYXhwMjB4LT5yZWdtYXBfY2ZnID0gJmF4cDgwNl9yZWdtYXBfY29uZmlnOworCQlheHAyMHgtPnJlZ21hcF9pcnFfY2hpcCA9ICZheHA4MDZfcmVnbWFwX2lycV9jaGlwOworCQlicmVhazsKIAljYXNlIEFYUDgwOV9JRDoKIAkJYXhwMjB4LT5ucl9jZWxscyA9IEFSUkFZX1NJWkUoYXhwODA5X2NlbGxzKTsKIAkJYXhwMjB4LT5jZWxscyA9IGF4cDgwOV9jZWxsczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2Nyb3NfZWMuYyBiL2RyaXZlcnMvbWZkL2Nyb3NfZWMuYwppbmRleCAwZWVlNjM1Li5hYmQ4MzQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9jcm9zX2VjLmMKKysrIGIvZHJpdmVycy9tZmQvY3Jvc19lYy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvY3Jvc19lYy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2RlZmluZSBDUk9TX0VDX0RFVl9FQ19JTkRFWCAwCiAjZGVmaW5lIENST1NfRUNfREVWX1BEX0lOREVYIDEKQEAgLTQ5LDExICs1MCwyOCBAQAogCS5wZGF0YV9zaXplID0gc2l6ZW9mKHBkX3ApLAogfTsKIAorc3RhdGljIGlycXJldHVybl90IGVjX2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY3Jvc19lY19kZXZpY2UgKmVjX2RldiA9IGRhdGE7CisJaW50IHJldDsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChlY19kZXYtPmRldikpCisJCXBtX3dha2V1cF9ldmVudChlY19kZXYtPmRldiwgMCk7CisKKwlyZXQgPSBjcm9zX2VjX2dldF9uZXh0X2V2ZW50KGVjX2Rldik7CisJaWYgKHJldCA+IDApCisJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmVjX2Rldi0+ZXZlbnRfbm90aWZpZXIsCisJCQkJCSAgICAgMCwgZWNfZGV2KTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIGludCBjcm9zX2VjX3JlZ2lzdGVyKHN0cnVjdCBjcm9zX2VjX2RldmljZSAqZWNfZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGVjX2Rldi0+ZGV2OwogCWludCBlcnIgPSAwOwogCisJQkxPQ0tJTkdfSU5JVF9OT1RJRklFUl9IRUFEKCZlY19kZXYtPmV2ZW50X25vdGlmaWVyKTsKKwogCWVjX2Rldi0+bWF4X3JlcXVlc3QgPSBzaXplb2Yoc3RydWN0IGVjX3BhcmFtc19oZWxsbyk7CiAJZWNfZGV2LT5tYXhfcmVzcG9uc2UgPSBzaXplb2Yoc3RydWN0IGVjX3Jlc3BvbnNlX2dldF9wcm90b2NvbF9pbmZvKTsKIAllY19kZXYtPm1heF9wYXNzdGhydSA9IDA7CkBAIC03MCwxMyArODgsMjQgQEAKIAogCWNyb3NfZWNfcXVlcnlfYWxsKGVjX2Rldik7CiAKKwlpZiAoZWNfZGV2LT5pcnEpIHsKKwkJZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoZWNfZGV2LT5pcnEsIE5VTEwsIGVjX2lycV90aHJlYWQsCisJCQkJCSAgIElSUUZfVFJJR0dFUl9MT1cgfCBJUlFGX09ORVNIT1QsCisJCQkJCSAgICJjaHJvbWVvcy1lYyIsIGVjX2Rldik7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJRICVkOiAlZCIsCisJCQkJZWNfZGV2LT5pcnEsIGVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCiAJZXJyID0gbWZkX2FkZF9kZXZpY2VzKGVjX2Rldi0+ZGV2LCBQTEFURk9STV9ERVZJRF9BVVRPLCAmZWNfY2VsbCwgMSwKIAkJCSAgICAgIE5VTEwsIGVjX2Rldi0+aXJxLCBOVUxMKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoZGV2LAogCQkJIkZhaWxlZCB0byByZWdpc3RlciBFbWJlZGRlZCBDb250cm9sbGVyIHN1YmRldmljZSAlZFxuIiwKIAkJCWVycik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZmFpbF9tZmQ7CiAJfQogCiAJaWYgKGVjX2Rldi0+bWF4X3Bhc3N0aHJ1KSB7CkBAIC05NCw3ICsxMjMsNyBAQAogCQkJZGV2X2VycihkZXYsCiAJCQkJIkZhaWxlZCB0byByZWdpc3RlciBQb3dlciBEZWxpdmVyeSBzdWJkZXZpY2UgJWRcbiIsCiAJCQkJZXJyKTsKLQkJCXJldHVybiBlcnI7CisJCQlnb3RvIGZhaWxfbWZkOwogCQl9CiAJfQogCkBAIC0xMDMsMTMgKzEzMiwxOCBAQAogCQlpZiAoZXJyKSB7CiAJCQltZmRfcmVtb3ZlX2RldmljZXMoZGV2KTsKIAkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHN1Yi1kZXZpY2VzXG4iKTsKLQkJCXJldHVybiBlcnI7CisJCQlnb3RvIGZhaWxfbWZkOwogCQl9CiAJfQogCiAJZGV2X2luZm8oZGV2LCAiQ2hyb21lIEVDIGRldmljZSByZWdpc3RlcmVkXG4iKTsKIAogCXJldHVybiAwOworCitmYWlsX21mZDoKKwlpZiAoZWNfZGV2LT5pcnEpCisJCWZyZWVfaXJxKGVjX2Rldi0+aXJxLCBlY19kZXYpOworCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKGNyb3NfZWNfcmVnaXN0ZXIpOwogCkBAIC0xMzYsMTMgKzE3MCwzMSBAQAogfQogRVhQT1JUX1NZTUJPTChjcm9zX2VjX3N1c3BlbmQpOwogCitzdGF0aWMgdm9pZCBjcm9zX2VjX2RyYWluX2V2ZW50cyhzdHJ1Y3QgY3Jvc19lY19kZXZpY2UgKmVjX2RldikKK3sKKwl3aGlsZSAoY3Jvc19lY19nZXRfbmV4dF9ldmVudChlY19kZXYpID4gMCkKKwkJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmZWNfZGV2LT5ldmVudF9ub3RpZmllciwKKwkJCQkJICAgICAxLCBlY19kZXYpOworfQorCiBpbnQgY3Jvc19lY19yZXN1bWUoc3RydWN0IGNyb3NfZWNfZGV2aWNlICplY19kZXYpCiB7CiAJZW5hYmxlX2lycShlY19kZXYtPmlycSk7CiAKKwkvKgorCSAqIEluIHNvbWUgY2FzZXMsIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBldmVudHMgdGhhdCBvY2N1cgorCSAqIGR1cmluZyBzdXNwZW5kIGlmIHRoZSBFQyBpcyBub3QgYSB3YWtlIHNvdXJjZS4gRm9yIGV4YW1wbGUsCisJICoga2V5cHJlc3NlcyBkdXJpbmcgc3VzcGVuZCBzaG91bGQgYmUgZGlzY2FyZGVkIGlmIGl0IGRvZXMgbm90IHdha2UKKwkgKiB0aGUgc3lzdGVtLgorCSAqCisJICogSWYgdGhlIEVDIGlzIG5vdCBhIHdha2Ugc291cmNlLCBkcmFpbiB0aGUgZXZlbnQgcXVldWUgYW5kIG1hcmsgdGhlbQorCSAqIGFzICJxdWV1ZWQgZHVyaW5nIHN1c3BlbmQiLgorCSAqLwogCWlmIChlY19kZXYtPndha2VfZW5hYmxlZCkgewogCQlkaXNhYmxlX2lycV93YWtlKGVjX2Rldi0+aXJxKTsKIAkJZWNfZGV2LT53YWtlX2VuYWJsZWQgPSAwOworCX0gZWxzZSB7CisJCWNyb3NfZWNfZHJhaW5fZXZlbnRzKGVjX2Rldik7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9jcm9zX2VjX3NwaS5jIGIvZHJpdmVycy9tZmQvY3Jvc19lY19zcGkuYwppbmRleCBlYmU5Yjk0Li5hNTE4ODMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9jcm9zX2VjX3NwaS5jCisrKyBiL2RyaXZlcnMvbWZkL2Nyb3NfZWNfc3BpLmMKQEAgLTM2Niw3ICszNjYsNiBAQAogc3RhdGljIGludCBjcm9zX2VjX3BrdF94ZmVyX3NwaShzdHJ1Y3QgY3Jvc19lY19kZXZpY2UgKmVjX2RldiwKIAkJCQlzdHJ1Y3QgY3Jvc19lY19jb21tYW5kICplY19tc2cpCiB7Ci0Jc3RydWN0IGVjX2hvc3RfcmVxdWVzdCAqcmVxdWVzdDsKIAlzdHJ1Y3QgZWNfaG9zdF9yZXNwb25zZSAqcmVzcG9uc2U7CiAJc3RydWN0IGNyb3NfZWNfc3BpICplY19zcGkgPSBlY19kZXYtPnByaXY7CiAJc3RydWN0IHNwaV90cmFuc2ZlciB0cmFucywgdHJhbnNfZGVsYXk7CkBAIC0zNzgsNyArMzc3LDYgQEAKIAlpbnQgcmV0ID0gMCwgZmluYWxfcmV0OwogCiAJbGVuID0gY3Jvc19lY19wcmVwYXJlX3R4KGVjX2RldiwgZWNfbXNnKTsKLQlyZXF1ZXN0ID0gKHN0cnVjdCBlY19ob3N0X3JlcXVlc3QgKillY19kZXYtPmRvdXQ7CiAJZGV2X2RiZyhlY19kZXYtPmRldiwgInByZXBhcmVkLCBsZW49JWRcbiIsIGxlbik7CiAKIAkvKiBJZiBpdCdzIHRvbyBzb29uIHRvIGRvIGFub3RoZXIgdHJhbnNhY3Rpb24sIHdhaXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RhOTA1Mi1jb3JlLmMgYi9kcml2ZXJzL21mZC9kYTkwNTItY29yZS5jCmluZGV4IGMwYmY2OGEuLmE4OGMyMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2RhOTA1Mi1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvZGE5MDUyLWNvcmUuYwpAQCAtMTY3LDYgKzE2Nyw3IEBACiAJY2FzZSBEQTkwNTJfRVZFTlRfQl9SRUc6CiAJY2FzZSBEQTkwNTJfRVZFTlRfQ19SRUc6CiAJY2FzZSBEQTkwNTJfRVZFTlRfRF9SRUc6CisJY2FzZSBEQTkwNTJfRkFVTFRMT0dfUkVHOgogCWNhc2UgREE5MDUyX0lSUV9NQVNLX0FfUkVHOgogCWNhc2UgREE5MDUyX0lSUV9NQVNLX0JfUkVHOgogCWNhc2UgREE5MDUyX0lSUV9NQVNLX0NfUkVHOgpAQCAtNTQxLDYgKzU0Miw1MiBAQAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKGRhOTA1Ml9yZWdtYXBfY29uZmlnKTsKIAorc3RhdGljIGludCBkYTkwNTJfY2xlYXJfZmF1bHRfbG9nKHN0cnVjdCBkYTkwNTIgKmRhOTA1MikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZmF1bHRfbG9nID0gMDsKKworCWZhdWx0X2xvZyA9IGRhOTA1Ml9yZWdfcmVhZChkYTkwNTIsIERBOTA1Ml9GQVVMVExPR19SRUcpOworCWlmIChmYXVsdF9sb2cgPCAwKSB7CisJCWRldl9lcnIoZGE5MDUyLT5kZXYsCisJCQkiQ2Fubm90IHJlYWQgRkFVTFRfTE9HICVkXG4iLCBmYXVsdF9sb2cpOworCQlyZXR1cm4gZmF1bHRfbG9nOworCX0KKworCWlmIChmYXVsdF9sb2cpIHsKKwkJaWYgKGZhdWx0X2xvZyAmIERBOTA1Ml9GQVVMVExPR19UV0RFUlJPUikKKwkJCWRldl9kYmcoZGE5MDUyLT5kZXYsCisJCQkJIkZhdWx0IGxvZyBlbnRyeSBkZXRlY3RlZDogVFdEX0VSUk9SXG4iKTsKKwkJaWYgKGZhdWx0X2xvZyAmIERBOTA1Ml9GQVVMVExPR19WRERGQVVMVCkKKwkJCWRldl9kYmcoZGE5MDUyLT5kZXYsCisJCQkJIkZhdWx0IGxvZyBlbnRyeSBkZXRlY3RlZDogVkREX0ZBVUxUXG4iKTsKKwkJaWYgKGZhdWx0X2xvZyAmIERBOTA1Ml9GQVVMVExPR19WRERTVEFSVCkKKwkJCWRldl9kYmcoZGE5MDUyLT5kZXYsCisJCQkJIkZhdWx0IGxvZyBlbnRyeSBkZXRlY3RlZDogVkREX1NUQVJUXG4iKTsKKwkJaWYgKGZhdWx0X2xvZyAmIERBOTA1Ml9GQVVMVExPR19URU1QT1ZFUikKKwkJCWRldl9kYmcoZGE5MDUyLT5kZXYsCisJCQkJIkZhdWx0IGxvZyBlbnRyeSBkZXRlY3RlZDogVEVNUF9PVkVSXG4iKTsKKwkJaWYgKGZhdWx0X2xvZyAmIERBOTA1Ml9GQVVMVExPR19LRVlTSFVUKQorCQkJZGV2X2RiZyhkYTkwNTItPmRldiwKKwkJCQkiRmF1bHQgbG9nIGVudHJ5IGRldGVjdGVkOiBLRVlfU0hVVFxuIik7CisJCWlmIChmYXVsdF9sb2cgJiBEQTkwNTJfRkFVTFRMT0dfTlNEU0VUKQorCQkJZGV2X2RiZyhkYTkwNTItPmRldiwKKwkJCQkiRmF1bHQgbG9nIGVudHJ5IGRldGVjdGVkOiBuU0RfU0hVVFxuIik7CisJCWlmIChmYXVsdF9sb2cgJiBEQTkwNTJfRkFVTFRMT0dfV0FJVFNFVCkKKwkJCWRldl9kYmcoZGE5MDUyLT5kZXYsCisJCQkJIkZhdWx0IGxvZyBlbnRyeSBkZXRlY3RlZDogV0FJVF9TSFVUXG4iKTsKKworCQlyZXQgPSBkYTkwNTJfcmVnX3dyaXRlKGRhOTA1MiwKKwkJCQkJREE5MDUyX0ZBVUxUTE9HX1JFRywKKwkJCQkJMHhGRik7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X2VycihkYTkwNTItPmRldiwKKwkJCQkiQ2Fubm90IHJlc2V0IEZBVUxUX0xPRyB2YWx1ZXMgJWRcbiIsIHJldCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKwogaW50IGRhOTA1Ml9kZXZpY2VfaW5pdChzdHJ1Y3QgZGE5MDUyICpkYTkwNTIsIHU4IGNoaXBfaWQpCiB7CiAJc3RydWN0IGRhOTA1Ml9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRhOTA1Mi0+ZGV2KTsKQEAgLTU0OSw2ICs1OTYsMTAgQEAKIAltdXRleF9pbml0KCZkYTkwNTItPmF1eGFkY19sb2NrKTsKIAlpbml0X2NvbXBsZXRpb24oJmRhOTA1Mi0+ZG9uZSk7CiAKKwlyZXQgPSBkYTkwNTJfY2xlYXJfZmF1bHRfbG9nKGRhOTA1Mik7CisJaWYgKHJldCA8IDApCisJCWRldl93YXJuKGRhOTA1Mi0+ZGV2LCAiQ2Fubm90IGNsZWFyIEZBVUxUX0xPR1xuIik7CisKIAlpZiAocGRhdGEgJiYgcGRhdGEtPmluaXQgIT0gTlVMTCkKIAkJcGRhdGEtPmluaXQoZGE5MDUyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvZGE5MDYzLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2RhOTA2My1jb3JlLmMKaW5kZXggYWY4NDFjMTYuLjZjMjg3MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2RhOTA2My1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvZGE5MDYzLWNvcmUuYwpAQCAtNCw4ICs0LDggQEAKICAqIENvcHlyaWdodCAyMDEyIERpYWxvZyBTZW1pY29uZHVjdG9ycyBMdGQuCiAgKiBDb3B5cmlnaHQgMjAxMyBQaGlsaXBwIFphYmVsLCBQZW5ndXRyb25peAogICoKLSAqIEF1dGhvcjogS3J5c3RpYW4gR2FyYmFjaWFrIDxrcnlzdGlhbi5nYXJiYWNpYWtAZGlhc2VtaS5jb20+LAotICogICAgICAgICBNaWNoYWwgSGFqZHVrIDxtaWNoYWwuaGFqZHVrQGRpYXNlbWkuY29tPgorICogQXV0aG9yOiBLcnlzdGlhbiBHYXJiYWNpYWssIERpYWxvZyBTZW1pY29uZHVjdG9yCisgKiBBdXRob3I6IE1pY2hhbCBIYWpkdWssIERpYWxvZyBTZW1pY29uZHVjdG9yCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAogICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQpAQCAtMjQyLDUgKzI0Miw2IEBACiB9CiAKIE1PRFVMRV9ERVNDUklQVElPTigiUE1JQyBkcml2ZXIgZm9yIERpYWxvZyBEQTkwNjMiKTsKLU1PRFVMRV9BVVRIT1IoIktyeXN0aWFuIEdhcmJhY2lhayA8a3J5c3RpYW4uZ2FyYmFjaWFrQGRpYXNlbWkuY29tPiwgTWljaGFsIEhhamR1ayA8bWljaGFsLmhhamR1a0BkaWFzZW1pLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIktyeXN0aWFuIEdhcmJhY2lhayIpOworTU9EVUxFX0FVVEhPUigiTWljaGFsIEhhamR1ayIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvZGE5MDYzLWkyYy5jIGIvZHJpdmVycy9tZmQvZGE5MDYzLWkyYy5jCmluZGV4IDczOTAxMDguLjk4MTgwNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2RhOTA2My1pMmMuYworKysgYi9kcml2ZXJzL21mZC9kYTkwNjMtaTJjLmMKQEAgLTMsNyArMyw3IEBACiAgKiBDb3B5cmlnaHQgMjAxMiBEaWFsb2cgU2VtaWNvbmR1Y3RvciBMdGQuCiAgKiBDb3B5cmlnaHQgMjAxMyBQaGlsaXBwIFphYmVsLCBQZW5ndXRyb25peAogICoKLSAqIEF1dGhvcjogS3J5c3RpYW4gR2FyYmFjaWFrIDxrcnlzdGlhbi5nYXJiYWNpYWtAZGlhc2VtaS5jb20+CisgKiBBdXRob3I6IEtyeXN0aWFuIEdhcmJhY2lhaywgRGlhbG9nIFNlbWljb25kdWN0b3IKICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9kYTkwNjMtaXJxLmMgYi9kcml2ZXJzL21mZC9kYTkwNjMtaXJxLmMKaW5kZXggN2U5MDNmYy4uMjA3YmJmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvZGE5MDYzLWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL2RhOTA2My1pcnEuYwpAQCAtMyw3ICszLDcgQEAKICAqIENvcHlyaWdodCAyMDEyIERpYWxvZyBTZW1pY29uZHVjdG9yIEx0ZC4KICAqIENvcHlyaWdodCAyMDEzIFBoaWxpcHAgWmFiZWwsIFBlbmd1dHJvbml4CiAgKgotICogQXV0aG9yOiBNaWNoYWwgSGFqZHVrIDxtaWNoYWwuaGFqZHVrQGRpYXNlbWkuY29tPgorICogQXV0aG9yOiBNaWNoYWwgSGFqZHVrLCBEaWFsb2cgU2VtaWNvbmR1Y3RvcgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RiODUwMC1wcmNtdS5jIGIvZHJpdmVycy9tZmQvZGI4NTAwLXByY211LmMKaW5kZXggMzg4ZTI2OC4uY2EzOGE2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvZGI4NTAwLXByY211LmMKKysrIGIvZHJpdmVycy9tZmQvZGI4NTAwLXByY211LmMKQEAgLTkzOCwyNSArOTM4LDYgQEAKIAlyZXR1cm4gcmVhZGIoUFJDTV9ERFJfU1VCU1lTX0FQRV9NSU5CVyk7CiB9CiAKLS8qKgotICogZGI4NTAwX3NldF9kZHJfb3BwIC0gc2V0IHRoZSBhcHByb3ByaWF0ZSBERFIgT1BQCi0gKiBAb3BwOiBUaGUgbmV3IEREUiBvcGVyYXRpbmcgcG9pbnQgdG8gd2hpY2ggdHJhbnNpdGlvbiBpcyB0byBiZSBtYWRlCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIG9wZXJhdGluZyBwb2ludCBvZiB0aGUgRERSLgotICovCi1zdGF0aWMgYm9vbCBlbmFibGVfc2V0X2Rkcl9vcHA7Ci1pbnQgZGI4NTAwX3ByY211X3NldF9kZHJfb3BwKHU4IG9wcCkKLXsKLQlpZiAob3BwIDwgRERSXzEwMF9PUFAgfHwgb3BwID4gRERSXzI1X09QUCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JLyogQ2hhbmdpbmcgdGhlIEREUiBPUFAgY2FuIGhhbmcgdGhlIGhhcmR3YXJlIHByZS12MjEgKi8KLQlpZiAoZW5hYmxlX3NldF9kZHJfb3BwKQotCQl3cml0ZWIob3BwLCBQUkNNX0REUl9TVUJTWVNfQVBFX01JTkJXKTsKLQotCXJldHVybiAwOwotfQotCiAvKiBEaXZpZGUgdGhlIGZyZXF1ZW5jeSBvZiBjZXJ0YWluIGNsb2NrcyBieSAyIGZvciBBUEVfNTBfUEFSVExZXzI1X09QUC4gKi8KIHN0YXRpYyB2b2lkIHJlcXVlc3RfZXZlbl9zbG93ZXJfY2xvY2tzKGJvb2wgZW5hYmxlKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvZG0zNTVldm1fbXNwLmMgYi9kcml2ZXJzL21mZC9kbTM1NWV2bV9tc3AuYwppbmRleCAyNzBlMTljLi44NmVjYTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9kbTM1NWV2bV9tc3AuYworKysgYi9kcml2ZXJzL21mZC9kbTM1NWV2bV9tc3AuYwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJCXN0YXR1cyA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShwZGV2LCBwZGF0YSwgcGRhdGFfbGVuKTsKIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCWRldl9kYmcoJnBkZXYtPmRldiwgImNhbid0IGFkZCBwbGF0Zm9ybV9kYXRhXG4iKTsKLQkJCWdvdG8gZXJyOworCQkJZ290byBwdXRfZGV2aWNlOwogCQl9CiAJfQogCkBAIC0yMjIsMTkgKzIyMiwyMCBAQAogCQlzdGF0dXMgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX3Jlc291cmNlcyhwZGV2LCAmciwgMSk7CiAJCWlmIChzdGF0dXMgPCAwKSB7CiAJCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJjYW4ndCBhZGQgaXJxXG4iKTsKLQkJCWdvdG8gZXJyOworCQkJZ290byBwdXRfZGV2aWNlOwogCQl9CiAJfQogCiAJc3RhdHVzID0gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIHB1dF9kZXZpY2U7CiAKLWVycjoKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOwotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImNhbid0IGFkZCAlcyBkZXZcbiIsIG5hbWUpOwotCQlyZXR1cm4gRVJSX1BUUihzdGF0dXMpOwotCX0KIAlyZXR1cm4gJnBkZXYtPmRldjsKKworcHV0X2RldmljZToKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBkZXYpOworCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBkZXZpY2UgJXNcbiIsIG5hbWUpOworCXJldHVybiBFUlJfUFRSKHN0YXR1cyk7CiB9CiAKIHN0YXRpYyBpbnQgYWRkX2NoaWxkcmVuKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9leHlub3MtbHBhc3MuYyBiL2RyaXZlcnMvbWZkL2V4eW5vcy1scGFzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMDY0ZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvZXh5bm9zLWxwYXNzLmMKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgLSAyMDE2IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogQXV0aG9yczogSW5oYSBTb25nIDxpZGVhbC5zb25nQHNhbXN1bmcuY29tPgorICogICAgICAgICAgU3lsd2VzdGVyIE5hd3JvY2tpIDxzLm5hd3JvY2tpQHNhbXN1bmcuY29tPgorICoKKyAqIFNhbXN1bmcgRXh5bm9zIFNvQyBzZXJpZXMgTG93IFBvd2VyIEF1ZGlvIFN1YnN5c3RlbSBkcml2ZXIuCisgKgorICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgcmVnbWFwIGZvciB0aGUgVG9wIFNGUiByZWdpb24gYW5kIGluc3RhbnRpYXRlcworICogZGV2aWNlcyBmb3IgSVAgYmxvY2tzIGxpa2UgRE1BQywgSTJTLCBVQVJULgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24vZXh5bm9zNS1wbXUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogTFBBU1MgVG9wIHJlZ2lzdGVyIGRlZmluaXRpb25zICovCisjZGVmaW5lIFNGUl9MUEFTU19DT1JFX1NXX1JFU0VUCQkweDA4CisjZGVmaW5lICBMUEFTU19TQl9TV19SRVNFVAkJQklUKDExKQorI2RlZmluZSAgTFBBU1NfVUFSVF9TV19SRVNFVAkJQklUKDEwKQorI2RlZmluZSAgTFBBU1NfUENNX1NXX1JFU0VUCQlCSVQoOSkKKyNkZWZpbmUgIExQQVNTX0kyU19TV19SRVNFVAkJQklUKDgpCisjZGVmaW5lICBMUEFTU19XRFQxX1NXX1JFU0VUCQlCSVQoNCkKKyNkZWZpbmUgIExQQVNTX1dEVDBfU1dfUkVTRVQJCUJJVCgzKQorI2RlZmluZSAgTFBBU1NfVElNRVJfU1dfUkVTRVQJCUJJVCgyKQorI2RlZmluZSAgTFBBU1NfTUVNX1NXX1JFU0VUCQlCSVQoMSkKKyNkZWZpbmUgIExQQVNTX0RNQV9TV19SRVNFVAkJQklUKDApCisKKyNkZWZpbmUgU0ZSX0xQQVNTX0lOVFJfQ0E1X01BU0sJCTB4NDgKKyNkZWZpbmUgU0ZSX0xQQVNTX0lOVFJfQ1BVX01BU0sJCTB4NTgKKyNkZWZpbmUgIExQQVNTX0lOVFJfQVBNCQkJQklUKDkpCisjZGVmaW5lICBMUEFTU19JTlRSX01JRgkJCUJJVCg4KQorI2RlZmluZSAgTFBBU1NfSU5UUl9USU1FUgkJQklUKDcpCisjZGVmaW5lICBMUEFTU19JTlRSX0RNQQkJCUJJVCg2KQorI2RlZmluZSAgTFBBU1NfSU5UUl9HUElPCQlCSVQoNSkKKyNkZWZpbmUgIExQQVNTX0lOVFJfSTJTCQkJQklUKDQpCisjZGVmaW5lICBMUEFTU19JTlRSX1BDTQkJCUJJVCgzKQorI2RlZmluZSAgTFBBU1NfSU5UUl9TTElNQlVTCQlCSVQoMikKKyNkZWZpbmUgIExQQVNTX0lOVFJfVUFSVAkJQklUKDEpCisjZGVmaW5lICBMUEFTU19JTlRSX1NGUgkJCUJJVCgwKQorCitzdHJ1Y3QgZXh5bm9zX2xwYXNzIHsKKwkvKiBwb2ludGVyIHRvIHRoZSBQb3dlciBNYW5hZ2VtZW50IFVuaXQgcmVnbWFwICovCisJc3RydWN0IHJlZ21hcCAqcG11OworCS8qIHBvaW50ZXIgdG8gdGhlIExQQVNTIFRPUCByZWdtYXAgKi8KKwlzdHJ1Y3QgcmVnbWFwICp0b3A7Cit9OworCitzdGF0aWMgdm9pZCBleHlub3NfbHBhc3NfY29yZV9zd19yZXNldChzdHJ1Y3QgZXh5bm9zX2xwYXNzICpscGFzcywgaW50IG1hc2spCit7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisKKwlyZWdtYXBfcmVhZChscGFzcy0+dG9wLCBTRlJfTFBBU1NfQ09SRV9TV19SRVNFVCwgJnZhbCk7CisKKwl2YWwgJj0gfm1hc2s7CisJcmVnbWFwX3dyaXRlKGxwYXNzLT50b3AsIFNGUl9MUEFTU19DT1JFX1NXX1JFU0VULCB2YWwpOworCisJdXNsZWVwX3JhbmdlKDEwMCwgMTUwKTsKKworCXZhbCB8PSBtYXNrOworCXJlZ21hcF93cml0ZShscGFzcy0+dG9wLCBTRlJfTFBBU1NfQ09SRV9TV19SRVNFVCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2xwYXNzX2VuYWJsZShzdHJ1Y3QgZXh5bm9zX2xwYXNzICpscGFzcykKK3sKKwkvKiBVbm1hc2sgU0ZSLCBETUEgYW5kIEkyUyBpbnRlcnJ1cHQgKi8KKwlyZWdtYXBfd3JpdGUobHBhc3MtPnRvcCwgU0ZSX0xQQVNTX0lOVFJfQ0E1X01BU0ssCisJCSAgICAgTFBBU1NfSU5UUl9TRlIgfCBMUEFTU19JTlRSX0RNQSB8IExQQVNTX0lOVFJfSTJTKTsKKworCXJlZ21hcF93cml0ZShscGFzcy0+dG9wLCBTRlJfTFBBU1NfSU5UUl9DUFVfTUFTSywKKwkJICAgICBMUEFTU19JTlRSX1NGUiB8IExQQVNTX0lOVFJfRE1BIHwgTFBBU1NfSU5UUl9JMlMpOworCisJLyogQWN0aXZhdGUgcmVsYXRlZCBQQURzIGZyb20gcmV0ZW50aW9uIHN0YXRlICovCisJcmVnbWFwX3dyaXRlKGxwYXNzLT5wbXUsIEVYWU5PUzU0MzNfUEFEX1JFVEVOVElPTl9BVURfT1BUSU9OLAorCQkgICAgIEVYWU5PUzU0MzNfUEFEX0lOSVRJQVRFX1dBS0VVUF9GUk9NX0xPV1BXUik7CisKKwlleHlub3NfbHBhc3NfY29yZV9zd19yZXNldChscGFzcywgTFBBU1NfSTJTX1NXX1JFU0VUKTsKKwlleHlub3NfbHBhc3NfY29yZV9zd19yZXNldChscGFzcywgTFBBU1NfRE1BX1NXX1JFU0VUKTsKKwlleHlub3NfbHBhc3NfY29yZV9zd19yZXNldChscGFzcywgTFBBU1NfTUVNX1NXX1JFU0VUKTsKK30KKworc3RhdGljIHZvaWQgZXh5bm9zX2xwYXNzX2Rpc2FibGUoc3RydWN0IGV4eW5vc19scGFzcyAqbHBhc3MpCit7CisJLyogTWFzayBhbnkgdW5tYXNrZWQgSVAgaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlyZWdtYXBfd3JpdGUobHBhc3MtPnRvcCwgU0ZSX0xQQVNTX0lOVFJfQ1BVX01BU0ssIDApOworCXJlZ21hcF93cml0ZShscGFzcy0+dG9wLCBTRlJfTFBBU1NfSU5UUl9DQTVfTUFTSywgMCk7CisKKwkvKiBEZWFjdGl2YXRlIHJlbGF0ZWQgUEFEcyBmcm9tIHJldGVudGlvbiBzdGF0ZSAqLworCXJlZ21hcF93cml0ZShscGFzcy0+cG11LCBFWFlOT1M1NDMzX1BBRF9SRVRFTlRJT05fQVVEX09QVElPTiwgMCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBleHlub3NfbHBhc3NfcmVnX2NvbmYgPSB7CisJLnJlZ19iaXRzCT0gMzIsCisJLnJlZ19zdHJpZGUJPSA0LAorCS52YWxfYml0cwk9IDMyLAorCS5tYXhfcmVnaXN0ZXIJPSAweGZjLAorCS5mYXN0X2lvCT0gdHJ1ZSwKK307CisKK3N0YXRpYyBpbnQgZXh5bm9zX2xwYXNzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZXh5bm9zX2xwYXNzICpscGFzczsKKwl2b2lkIF9faW9tZW0gKmJhc2VfdG9wOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJbHBhc3MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmxwYXNzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFscGFzcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWJhc2VfdG9wID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGJhc2VfdG9wKSkKKwkJcmV0dXJuIFBUUl9FUlIoYmFzZV90b3ApOworCisJbHBhc3MtPnRvcCA9IHJlZ21hcF9pbml0X21taW8oZGV2LCBiYXNlX3RvcCwKKwkJCQkJJmV4eW5vc19scGFzc19yZWdfY29uZik7CisJaWYgKElTX0VSUihscGFzcy0+dG9wKSkgeworCQlkZXZfZXJyKGRldiwgIkxQQVNTIHRvcCByZWdtYXAgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIobHBhc3MtPnRvcCk7CisJfQorCisJbHBhc3MtPnBtdSA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUoZGV2LT5vZl9ub2RlLAorCQkJCQkJInNhbXN1bmcscG11LXN5c2NvbiIpOworCWlmIChJU19FUlIobHBhc3MtPnBtdSkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbG9va3VwIFBNVSByZWdtYXBcbiIpOworCQlyZXR1cm4gUFRSX0VSUihscGFzcy0+cG11KTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBscGFzcyk7CisJZXh5bm9zX2xwYXNzX2VuYWJsZShscGFzcyk7CisKKwlyZXR1cm4gb2ZfcGxhdGZvcm1fcG9wdWxhdGUoZGV2LT5vZl9ub2RlLCBOVUxMLCBOVUxMLCBkZXYpOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIGV4eW5vc19scGFzc19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZXh5bm9zX2xwYXNzICpscGFzcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJZXh5bm9zX2xwYXNzX2Rpc2FibGUobHBhc3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgZXh5bm9zX2xwYXNzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGV4eW5vc19scGFzcyAqbHBhc3MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWV4eW5vc19scGFzc19lbmFibGUobHBhc3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhscGFzc19wbV9vcHMsIGV4eW5vc19scGFzc19zdXNwZW5kLAorCQkJCQlleHlub3NfbHBhc3NfcmVzdW1lKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZXh5bm9zX2xwYXNzX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczU0MzMtbHBhc3MiIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGV4eW5vc19scGFzc19vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV4eW5vc19scGFzc19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gImV4eW5vcy1scGFzcyIsCisJCS5wbQkJPSAmbHBhc3NfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBleHlub3NfbHBhc3Nfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUJPSBleHlub3NfbHBhc3NfcHJvYmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihleHlub3NfbHBhc3NfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIExvdyBQb3dlciBBdWRpbyBTdWJzeXN0ZW0gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9odGMtZWdwaW8uYyBiL2RyaXZlcnMvbWZkL2h0Yy1lZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTNjZmM1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWZkL2h0Yy1lZ3Bpby5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qCi0gKiBTdXBwb3J0IGZvciB0aGUgR1BJTy9JUlEgZXhwYW5kZXIgY2hpcHMgcHJlc2VudCBvbiBzZXZlcmFsIEhUQyBwaG9uZXMuCi0gKiBUaGVzZSBhcmUgaW1wbGVtZW50ZWQgaW4gQ1BMRCBjaGlwcyBwcmVzZW50IG9uIHRoZSBib2FyZC4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgS2V2aW4gTydDb25ub3IgPGtldmluQGtvY29ubm9yLm5ldD4KLSAqIENvcHlyaWdodCAoYykgMjAwNyBQaGlsaXBwIFphYmVsIDxwaGlsaXBwLnphYmVsQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBsaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+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+Y2hhaW5lZF9pcnEpOwotCi0JLyogVXBkYXRlIHJlZ2lzdGVycyBmcm9tIHRoZSBjYWNoZSwgaW4gY2FzZQotCSAgIHRoZSBDUExEIHdhcyBwb3dlcmVkIG9mZiBkdXJpbmcgc3VzcGVuZCAqLwotCWVncGlvX3dyaXRlX2NhY2hlKGVpKTsKLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi0jZGVmaW5lIGVncGlvX3N1c3BlbmQgTlVMTAotI2RlZmluZSBlZ3Bpb19yZXN1bWUgTlVMTAotI2VuZGlmCi0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWdwaW9fZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImh0Yy1lZ3BpbyIsCi0JfSwKLQkucmVtb3ZlICAgICAgID0gX19leGl0X3AoZWdwaW9fcmVtb3ZlKSwKLQkuc3VzcGVuZCAgICAgID0gZWdwaW9fc3VzcGVuZCwKLQkucmVzdW1lICAgICAgID0gZWdwaW9fcmVzdW1lLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZWdwaW9faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcHJvYmUoJmVncGlvX2RyaXZlciwgZWdwaW9fcHJvYmUpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZWdwaW9fZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZlZ3Bpb19kcml2ZXIpOwotfQotCi0vKiBzdGFydCBlYXJseSBmb3IgZGVwZW5kZW5jaWVzICovCi1zdWJzeXNfaW5pdGNhbGwoZWdwaW9faW5pdCk7Ci1tb2R1bGVfZXhpdChlZ3Bpb19leGl0KQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJLZXZpbiBPJ0Nvbm5vciA8a2V2aW5Aa29jb25ub3IubmV0PiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvaW50ZWwtbHBzcy1hY3BpLmMgYi9kcml2ZXJzL21mZC9pbnRlbC1scHNzLWFjcGkuYwppbmRleCA3ZGRjNGE5Li42YmY4ZDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9pbnRlbC1scHNzLWFjcGkuYworKysgYi9kcml2ZXJzL21mZC9pbnRlbC1scHNzLWFjcGkuYwpAQCAtNTIsNiArNTIsMTggQEAKIAkucHJvcGVydGllcyA9IGJ4dF9pMmNfcHJvcGVydGllcywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcHJvcGVydHlfZW50cnkgYXBsX2kyY19wcm9wZXJ0aWVzW10gPSB7CisJUFJPUEVSVFlfRU5UUllfVTMyKCJpMmMtc2RhLWhvbGQtdGltZS1ucyIsIDIwNyksCisJUFJPUEVSVFlfRU5UUllfVTMyKCJpMmMtc2RhLWZhbGxpbmctdGltZS1ucyIsIDE3MSksCisJUFJPUEVSVFlfRU5UUllfVTMyKCJpMmMtc2NsLWZhbGxpbmctdGltZS1ucyIsIDIwOCksCisJeyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9scHNzX3BsYXRmb3JtX2luZm8gYXBsX2kyY19pbmZvID0geworCS5jbGtfcmF0ZSA9IDEzMzAwMDAwMCwKKwkucHJvcGVydGllcyA9IGFwbF9pMmNfcHJvcGVydGllcywKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgaW50ZWxfbHBzc19hY3BpX2lkc1tdID0gewogCS8qIFNQVCAqLwogCXsgIklOVDM0NDYiLCAoa2VybmVsX3Vsb25nX3QpJnNwdF9pMmNfaW5mbyB9LApAQCAtNjEsNyArNzMsNyBAQAogCXsgIjgwODYwQUJDIiwgKGtlcm5lbF91bG9uZ190KSZieHRfaW5mbyB9LAogCXsgIjgwODYwQUMyIiwgKGtlcm5lbF91bG9uZ190KSZieHRfaW5mbyB9LAogCS8qIEFQTCAqLwotCXsgIjgwODY1QUFDIiwgKGtlcm5lbF91bG9uZ190KSZieHRfaTJjX2luZm8gfSwKKwl7ICI4MDg2NUFBQyIsIChrZXJuZWxfdWxvbmdfdCkmYXBsX2kyY19pbmZvIH0sCiAJeyAiODA4NjVBQkMiLCAoa2VybmVsX3Vsb25nX3QpJmJ4dF9pbmZvIH0sCiAJeyAiODA4NjVBQzIiLCAoa2VybmVsX3Vsb25nX3QpJmJ4dF9pbmZvIH0sCiAJeyB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9pbnRlbC1scHNzLXBjaS5jIGIvZHJpdmVycy9tZmQvaW50ZWwtbHBzcy1wY2kuYwppbmRleCAxZDc5YTNjLi4zMjI4ZmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9pbnRlbC1scHNzLXBjaS5jCisrKyBiL2RyaXZlcnMvbWZkL2ludGVsLWxwc3MtcGNpLmMKQEAgLTExMSw2ICsxMTEsMzEgQEAKIAkucHJvcGVydGllcyA9IGJ4dF9pMmNfcHJvcGVydGllcywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcHJvcGVydHlfZW50cnkgYXBsX2kyY19wcm9wZXJ0aWVzW10gPSB7CisJUFJPUEVSVFlfRU5UUllfVTMyKCJpMmMtc2RhLWhvbGQtdGltZS1ucyIsIDIwNyksCisJUFJPUEVSVFlfRU5UUllfVTMyKCJpMmMtc2RhLWZhbGxpbmctdGltZS1ucyIsIDE3MSksCisJUFJPUEVSVFlfRU5UUllfVTMyKCJpMmMtc2NsLWZhbGxpbmctdGltZS1ucyIsIDIwOCksCisJeyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9scHNzX3BsYXRmb3JtX2luZm8gYXBsX2kyY19pbmZvID0geworCS5jbGtfcmF0ZSA9IDEzMzAwMDAwMCwKKwkucHJvcGVydGllcyA9IGFwbF9pMmNfcHJvcGVydGllcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfbHBzc19wbGF0Zm9ybV9pbmZvIGtibF9pbmZvID0geworCS5jbGtfcmF0ZSA9IDEyMDAwMDAwMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfbHBzc19wbGF0Zm9ybV9pbmZvIGtibF91YXJ0X2luZm8gPSB7CisJLmNsa19yYXRlID0gMTIwMDAwMDAwLAorCS5jbGtfY29uX2lkID0gImJhdWRjbGsiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9scHNzX3BsYXRmb3JtX2luZm8ga2JsX2kyY19pbmZvID0geworCS5jbGtfcmF0ZSA9IDEzMzAwMDAwMCwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpbnRlbF9scHNzX3BjaV9pZHNbXSA9IHsKIAkvKiBCWFQgQS1TdGVwICovCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwYWFjKSwgKGtlcm5lbF91bG9uZ190KSZieHRfaTJjX2luZm8gfSwKQEAgLTE0NiwxNCArMTcxLDE0IEBACiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYWVlKSwgKGtlcm5lbF91bG9uZ190KSZieHRfdWFydF9pbmZvIH0sCiAKIAkvKiBBUEwgKi8KLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDVhYWMpLCAoa2VybmVsX3Vsb25nX3QpJmJ4dF9pMmNfaW5mbyB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4NWFhZSksIChrZXJuZWxfdWxvbmdfdCkmYnh0X2kyY19pbmZvIH0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg1YWIwKSwgKGtlcm5lbF91bG9uZ190KSZieHRfaTJjX2luZm8gfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDVhYjIpLCAoa2VybmVsX3Vsb25nX3QpJmJ4dF9pMmNfaW5mbyB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4NWFiNCksIChrZXJuZWxfdWxvbmdfdCkmYnh0X2kyY19pbmZvIH0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg1YWI2KSwgKGtlcm5lbF91bG9uZ190KSZieHRfaTJjX2luZm8gfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDVhYjgpLCAoa2VybmVsX3Vsb25nX3QpJmJ4dF9pMmNfaW5mbyB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4NWFiYSksIChrZXJuZWxfdWxvbmdfdCkmYnh0X2kyY19pbmZvIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg1YWFjKSwgKGtlcm5lbF91bG9uZ190KSZhcGxfaTJjX2luZm8gfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDVhYWUpLCAoa2VybmVsX3Vsb25nX3QpJmFwbF9pMmNfaW5mbyB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4NWFiMCksIChrZXJuZWxfdWxvbmdfdCkmYXBsX2kyY19pbmZvIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg1YWIyKSwgKGtlcm5lbF91bG9uZ190KSZhcGxfaTJjX2luZm8gfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDVhYjQpLCAoa2VybmVsX3Vsb25nX3QpJmFwbF9pMmNfaW5mbyB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4NWFiNiksIChrZXJuZWxfdWxvbmdfdCkmYXBsX2kyY19pbmZvIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg1YWI4KSwgKGtlcm5lbF91bG9uZ190KSZhcGxfaTJjX2luZm8gfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDVhYmEpLCAoa2VybmVsX3Vsb25nX3QpJmFwbF9pMmNfaW5mbyB9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4NWFiYyksIChrZXJuZWxfdWxvbmdfdCkmYnh0X3VhcnRfaW5mbyB9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4NWFiZSksIChrZXJuZWxfdWxvbmdfdCkmYnh0X3VhcnRfaW5mbyB9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4NWFjMCksIChrZXJuZWxfdWxvbmdfdCkmYnh0X3VhcnRfaW5mbyB9LApAQCAtMTgxLDYgKzIwNiwxNiBAQAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4YTE2MCksIChrZXJuZWxfdWxvbmdfdCkmc3B0X2kyY19pbmZvIH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHhhMTYxKSwgKGtlcm5lbF91bG9uZ190KSZzcHRfaTJjX2luZm8gfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweGExNjYpLCAoa2VybmVsX3Vsb25nX3QpJnNwdF91YXJ0X2luZm8gfSwKKwkvKiBLQkwtSCAqLworCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4YTJhNyksIChrZXJuZWxfdWxvbmdfdCkma2JsX3VhcnRfaW5mbyB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4YTJhOCksIChrZXJuZWxfdWxvbmdfdCkma2JsX3VhcnRfaW5mbyB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4YTJhOSksIChrZXJuZWxfdWxvbmdfdCkma2JsX2luZm8gfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweGEyYWEpLCAoa2VybmVsX3Vsb25nX3QpJmtibF9pbmZvIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHhhMmUwKSwgKGtlcm5lbF91bG9uZ190KSZrYmxfaTJjX2luZm8gfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweGEyZTEpLCAoa2VybmVsX3Vsb25nX3QpJmtibF9pMmNfaW5mbyB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4YTJlMiksIChrZXJuZWxfdWxvbmdfdCkma2JsX2kyY19pbmZvIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHhhMmUzKSwgKGtlcm5lbF91bG9uZ190KSZrYmxfaTJjX2luZm8gfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweGEyZTYpLCAoa2VybmVsX3Vsb25nX3QpJmtibF91YXJ0X2luZm8gfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaW50ZWxfbHBzc19wY2lfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2ludGVsX21zaWMuYyBiL2RyaXZlcnMvbWZkL2ludGVsX21zaWMuYwppbmRleCAyNWQ0ODZjLi4yMDE3NDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9pbnRlbF9tc2ljLmMKKysrIGIvZHJpdmVycy9tZmQvaW50ZWxfbXNpYy5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2ludGVsX21zaWMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTQ0OSw5ICs0NDksNCBAQAogCQkubmFtZQk9ICJpbnRlbF9tc2ljIiwKIAl9LAogfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihpbnRlbF9tc2ljX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBJbnRlbCBNU0lDIik7Ci1NT0RVTEVfQVVUSE9SKCJNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0BsaW51eC5pbnRlbC5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihpbnRlbF9tc2ljX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9pbnRlbF9zb2NfcG1pY19ieHR3Yy5jIGIvZHJpdmVycy9tZmQvaW50ZWxfc29jX3BtaWNfYnh0d2MuYwppbmRleCBiOTQyODc2Li40M2U1NGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9pbnRlbF9zb2NfcG1pY19ieHR3Yy5jCisrKyBiL2RyaXZlcnMvbWZkL2ludGVsX3NvY19wbWljX2J4dHdjLmMKQEAgLTQ3LDYgKzQ3LDggQEAKICNkZWZpbmUgQlhUV0NfTUlSUUxWTDEJCTB4NEUwRQogI2RlZmluZSBCWFRXQ19NUFdSVE5JUlEJCTB4NEUwRgogCisjZGVmaW5lIEJYVFdDX01JUlFMVkwxX01DSEdSCUJJVCg1KQorCiAjZGVmaW5lIEJYVFdDX01USFJNMElSUQkJMHg0RTEyCiAjZGVmaW5lIEJYVFdDX01USFJNMUlSUQkJMHg0RTEzCiAjZGVmaW5lIEJYVFdDX01USFJNMklSUQkJMHg0RTE0CkBAIC0xMDksNyArMTExLDcgQEAKIAlSRUdNQVBfSVJRX1JFRyhCWFRXQ19USFJNMl9JUlEsIDIsIDB4ZmYpLAogCVJFR01BUF9JUlFfUkVHKEJYVFdDX0JDVV9JUlEsIDMsIDB4MWYpLAogCVJFR01BUF9JUlFfUkVHKEJYVFdDX0FEQ19JUlEsIDQsIDB4ZmYpLAotCVJFR01BUF9JUlFfUkVHKEJYVFdDX0NIR1IwX0lSUSwgNSwgMHgxZiksCisJUkVHTUFQX0lSUV9SRUcoQlhUV0NfQ0hHUjBfSVJRLCA1LCAweDNmKSwKIAlSRUdNQVBfSVJRX1JFRyhCWFRXQ19DSEdSMV9JUlEsIDYsIDB4MWYpLAogCVJFR01BUF9JUlFfUkVHKEJYVFdDX0dQSU8wX0lSUSwgNywgMHhmZiksCiAJUkVHTUFQX0lSUV9SRUcoQlhUV0NfR1BJTzFfSVJRLCA4LCAweDNmKSwKQEAgLTE0Myw2ICsxNDUsMTAgQEAKIAlERUZJTkVfUkVTX0lSUV9OQU1FRChCWFRXQ19BRENfSVJRLCAiQURDIiksCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHVzYmNfcmVzb3VyY2VzW10gPSB7CisJREVGSU5FX1JFU19JUlFfTkFNRUQoQlhUV0NfQ0hHUjBfSVJRLCAiVVNCQyIpLAorfTsKKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjaGFyZ2VyX3Jlc291cmNlc1tdID0gewogCURFRklORV9SRVNfSVJRX05BTUVEKEJYVFdDX0NIR1IwX0lSUSwgIkNIQVJHRVIiKSwKIAlERUZJTkVfUkVTX0lSUV9OQU1FRChCWFRXQ19DSEdSMV9JUlEsICJDSEFSR0VSMSIpLApAQCAtMTcwLDYgKzE3NiwxMSBAQAogCQkucmVzb3VyY2VzID0gdGhlcm1hbF9yZXNvdXJjZXMsCiAJfSwKIAl7CisJCS5uYW1lID0gImJ4dF93Y292ZV91c2JjIiwKKwkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHVzYmNfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHVzYmNfcmVzb3VyY2VzLAorCX0sCisJewogCQkubmFtZSA9ICJieHRfd2NvdmVfZXh0X2NoYXJnZXIiLAogCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoY2hhcmdlcl9yZXNvdXJjZXMpLAogCQkucmVzb3VyY2VzID0gY2hhcmdlcl9yZXNvdXJjZXMsCkBAIC00MDMsNiArNDE0LDE2IEBACiAJCWdvdG8gZXJyX3N5c2ZzOwogCX0KIAorCS8qCisJICogVGhlcmUgaXMga25vd24gaHcgYnVnLiBVcG9uIHJlc2V0IEJJVCA1IG9mIHJlZ2lzdGVyCisJICogQlhUV0NfQ0hHUl9MVkwxX0lSUSBpcyAwIHdoaWNoIGlzIHRoZSBleHBlY3RlZCB2YWx1ZS4gSG93ZXZlciwKKwkgKiBsYXRlciBpdCdzIHNldCB0byAxKG1hc2tlZCkgYXV0b21hdGljYWxseSBieSBoYXJkd2FyZS4gU28gd2UKKwkgKiBoYXZlIHRoZSBzb2Z0d2FyZSB3b3JrYXJvdW5kIGhlcmUgdG8gdW5tYWtzZWQgaXQgaW4gb3JkZXIgdG8gbGV0CisJICogY2hhcmdlciBpbnRlcnJ1dHAgd29yay4KKwkgKi8KKwlyZWdtYXBfdXBkYXRlX2JpdHMocG1pYy0+cmVnbWFwLCBCWFRXQ19NSVJRTFZMMSwKKwkJCQlCWFRXQ19NSVJRTFZMMV9NQ0hHUiwgMCk7CisKIAlyZXR1cm4gMDsKIAogZXJyX3N5c2ZzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbHA4NzN4LmMgYi9kcml2ZXJzL21mZC9scDg3M3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzNjNjA4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvbHA4NzN4LmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBBdXRob3I6IEtlZXJ0aHkgPGota2VlcnRoeUB0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvbHA4NzN4Lmg+CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBscDg3M3hfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLm1heF9yZWdpc3RlciA9IExQODczWF9SRUdfTUFYLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZmRfY2VsbCBscDg3M3hfY2VsbHNbXSA9IHsKKwl7IC5uYW1lID0gImxwODczeC1yZWd1bGF0b3IiLCB9LAorCXsgLm5hbWUgPSAibHA4NzN4LWdwaW8iLCB9LAorfTsKKworc3RhdGljIGludCBscDg3M3hfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZHMpCit7CisJc3RydWN0IGxwODczeCAqbHA4NzM7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgb3RwaWQ7CisKKwlscDg3MyA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqbHA4NzMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxwODczKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxwODczLT5kZXYgPSAmY2xpZW50LT5kZXY7CisKKwlscDg3My0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmbHA4NzN4X3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIobHA4NzMtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihscDg3My0+cmVnbWFwKTsKKwkJZGV2X2VycihscDg3My0+ZGV2LAorCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIHJlZ2lzdGVyIG1hcDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcmVnbWFwX3JlYWQobHA4NzMtPnJlZ21hcCwgTFA4NzNYX1JFR19PVFBfUkVWLCAmb3RwaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihscDg3My0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgT1RQIElEXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlscDg3My0+cmV2ID0gb3RwaWQgJiBMUDg3M1hfT1RQX1JFVl9PVFBfSUQ7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBscDg3Myk7CisKKwlyZXQgPSBtZmRfYWRkX2RldmljZXMobHA4NzMtPmRldiwgUExBVEZPUk1fREVWSURfQVVUTywgbHA4NzN4X2NlbGxzLAorCQkJICAgICAgQVJSQVlfU0laRShscDg3M3hfY2VsbHMpLCBOVUxMLCAwLCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2xwODczeF9tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAidGksbHA4NzMzIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLGxwODczMiIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9scDg3M3hfbWF0Y2hfdGFibGUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbHA4NzN4X2lkX3RhYmxlW10gPSB7CisJeyAibHA4NzN4IiwgMCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbHA4NzN4X2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxwODczeF9kcml2ZXIgPSB7CisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAibHA4NzN4IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbHA4NzN4X21hdGNoX3RhYmxlLAorCX0sCisJLnByb2JlCQk9IGxwODczeF9wcm9iZSwKKwkuaWRfdGFibGUJPSBscDg3M3hfaWRfdGFibGUsCit9OworbW9kdWxlX2kyY19kcml2ZXIobHA4NzN4X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkogS2VlcnRoeSA8ai1rZWVydGh5QHRpLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTFA4NzNYIGNoaXAgZmFtaWx5IE11bHRpLUZ1bmN0aW9uIERldmljZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2xwY19pY2guYyBiL2RyaXZlcnMvbWZkL2xwY19pY2guYwppbmRleCBiZDNhYTQ1Li5jOGRlZTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9scGNfaWNoLmMKKysrIGIvZHJpdmVycy9tZmQvbHBjX2ljaC5jCkBAIC05ODQsNiArOTg0LDEwIEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAorCS8qIElmIHdlIGhhdmUgQUNQSSBiYXNlZCB3YXRjaGRvZyB1c2UgdGhhdCBpbnN0ZWFkICovCisJaWYgKGFjcGlfaGFzX3dhdGNoZG9nKCkpCisJCXJldHVybiAtRU5PREVWOworCiAJLyogU2V0dXAgcG93ZXIgbWFuYWdlbWVudCBiYXNlIHJlZ2lzdGVyICovCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcHJpdi0+YWJhc2UsICZiYXNlX2FkZHJfY2ZnKTsKIAliYXNlX2FkZHIgPSBiYXNlX2FkZHJfY2ZnICYgMHgwMDAwZmY4MDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL21heDE0NTc3LmMgYi9kcml2ZXJzL21mZC9tYXgxNDU3Ny5jCmluZGV4IDZjMjQ1MTIuLjZjYmU5NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL21heDE0NTc3LmMKKysrIGIvZHJpdmVycy9tZmQvbWF4MTQ1NzcuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcwogICogQ2hhbndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+Ci0gKiBLcnp5c3p0b2YgS296bG93c2tpIDxrLmtvemxvd3NraUBzYW1zdW5nLmNvbT4KKyAqIEtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTU2OSw2ICs1NjksNiBAQAogfQogbW9kdWxlX2V4aXQobWF4MTQ1NzdfaTJjX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJDaGFud29vIENob2kgPGN3MDAuY2hvaUBzYW1zdW5nLmNvbT4sIEtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiQ2hhbndvbyBDaG9pIDxjdzAwLmNob2lAc2Ftc3VuZy5jb20+LCBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk1heGltIDE0NTc3Lzc3ODM2IG11bHRpLWZ1bmN0aW9uIGNvcmUgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tYXg4OTk3LWlycS5jIGIvZHJpdmVycy9tZmQvbWF4ODk5Ny1pcnEuYwppbmRleCBiOTVhNDZkLi4zMjZmMTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9tYXg4OTk3LWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL21heDg5OTctaXJxLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCW11dGV4X3VubG9jaygmbWF4ODk5Ny0+aXJxbG9jayk7CiB9CiAKLXN0YXRpYyBjb25zdCBpbmxpbmUgc3RydWN0IG1heDg5OTdfaXJxX2RhdGEgKgoraW5saW5lIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWF4ODk5N19pcnFfZGF0YSAqCiBpcnFfdG9fbWF4ODk5N19pcnEoc3RydWN0IG1heDg5OTdfZGV2ICptYXg4OTk3LCBzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCiB7CiAJcmV0dXJuICZtYXg4OTk3X2lycXNbZGF0YS0+aHdpcnFdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvb21hcC11c2ItaG9zdC5jIGIvZHJpdmVycy9tZmQvb21hcC11c2ItaG9zdC5jCmluZGV4IDFkOTI0ZDEuLjdhYWIzNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL29tYXAtdXNiLWhvc3QuYworKysgYi9kcml2ZXJzL21mZC9vbWFwLXVzYi1ob3N0LmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogICogcHJvdmlkZWQgcG9ydCBtb2RlIHN0cmluZyBhcyBwZXIgdGhlIHBvcnRfbW9kZXMgdGFibGUuCiAgKiBJZiBubyBtYXRjaCBpcyBmb3VuZCBpdCByZXR1cm5zIC1FTk9ERVYKICAqLwotc3RhdGljIGNvbnN0IGludCBvbWFwX3VzYmhzX2dldF9kdF9wb3J0X21vZGUoY29uc3QgY2hhciAqbW9kZSkKK3N0YXRpYyBpbnQgb21hcF91c2Joc19nZXRfZHRfcG9ydF9tb2RlKGNvbnN0IGNoYXIgKm1vZGUpCiB7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3BtODkyMS1jb3JlLmMgYi9kcml2ZXJzL21mZC9wbTg5MjEtY29yZS5jCmluZGV4IDFiN2VjMDguLjBlM2EyZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3BtODkyMS1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvcG04OTIxLWNvcmUuYwpAQCAtMzA5LDYgKzMwOSw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwbTg5MjFfaWRfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20scG04MDE4IiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInFjb20scG04MDU4IiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInFjb20scG04OTIxIiwgfSwKIAl7IH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3Fjb21fcnBtLmMgYi9kcml2ZXJzL21mZC9xY29tX3JwbS5jCmluZGV4IDJlNDQzMjMuLjUyZmFmZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3Fjb21fcnBtLmMKKysrIGIvZHJpdmVycy9tZmQvcWNvbV9ycG0uYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC9xY29tX3JwbS5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KIAogI2luY2x1ZGUgPGR0LWJpbmRpbmdzL21mZC9xY29tLXJwbS5oPgogCkBAIC00OCw2ICs0OSw3IEBACiAJc3RydWN0IHJlZ21hcCAqaXBjX3JlZ21hcDsKIAl1bnNpZ25lZCBpcGNfb2Zmc2V0OwogCXVuc2lnbmVkIGlwY19iaXQ7CisJc3RydWN0IGNsayAqcmFtY2xrOwogCiAJc3RydWN0IGNvbXBsZXRpb24gYWNrOwogCXN0cnVjdCBtdXRleCBsb2NrOwpAQCAtMzg4LDExICszOTAsNjIgQEAKIAkuYWNrX3NlbF9zaXplID0gNywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcWNvbV9ycG1fcmVzb3VyY2UgbWRtOTYxNV9ycG1fcmVzb3VyY2VfdGFibGVbXSA9IHsKKwlbUUNPTV9SUE1fQ1hPX0NMS10gPQkJCXsgMjUsIDksIDUsIDEgfSwKKwlbUUNPTV9SUE1fU1lTX0ZBQlJJQ19DTEtdID0JCXsgMjYsIDEwLCA5LCAxIH0sCisJW1FDT01fUlBNX0RBWVRPTkFfRkFCUklDX0NMS10gPQkJeyAyNywgMTEsIDExLCAxIH0sCisJW1FDT01fUlBNX1NGUEJfQ0xLXSA9CQkJeyAyOCwgMTIsIDEyLCAxIH0sCisJW1FDT01fUlBNX0NGUEJfQ0xLXSA9CQkJeyAyOSwgMTMsIDEzLCAxIH0sCisJW1FDT01fUlBNX0VCSTFfQ0xLXSA9CQkJeyAzMCwgMTQsIDE2LCAxIH0sCisJW1FDT01fUlBNX0FQUFNfRkFCUklDX0hBTFRdID0JCXsgMzEsIDE1LCAyMiwgMiB9LAorCVtRQ09NX1JQTV9BUFBTX0ZBQlJJQ19NT0RFXSA9CQl7IDMzLCAxNiwgMjMsIDMgfSwKKwlbUUNPTV9SUE1fQVBQU19GQUJSSUNfSU9DVExdID0JCXsgMzYsIDE3LCAyNCwgMSB9LAorCVtRQ09NX1JQTV9BUFBTX0ZBQlJJQ19BUkJdID0JCXsgMzcsIDE4LCAyNSwgMjcgfSwKKwlbUUNPTV9SUE1fUE04MDE4X1NNUFMxXSA9CQl7IDY0LCAxOSwgMzAsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X1NNUFMyXSA9CQl7IDY2LCAyMSwgMzEsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X1NNUFMzXSA9CQl7IDY4LCAyMywgMzIsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X1NNUFM0XSA9CQl7IDcwLCAyNSwgMzMsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X1NNUFM1XSA9CQl7IDcyLCAyNywgMzQsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X0xETzFdID0JCXsgNzQsIDI5LCAzNSwgMiB9LAorCVtRQ09NX1JQTV9QTTgwMThfTERPMl0gPQkJeyA3NiwgMzEsIDM2LCAyIH0sCisJW1FDT01fUlBNX1BNODAxOF9MRE8zXSA9CQl7IDc4LCAzMywgMzcsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X0xETzRdID0JCXsgODAsIDM1LCAzOCwgMiB9LAorCVtRQ09NX1JQTV9QTTgwMThfTERPNV0gPQkJeyA4MiwgMzcsIDM5LCAyIH0sCisJW1FDT01fUlBNX1BNODAxOF9MRE82XSA9CQl7IDg0LCAzOSwgNDAsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X0xETzddID0JCXsgODYsIDQxLCA0MSwgMiB9LAorCVtRQ09NX1JQTV9QTTgwMThfTERPOF0gPQkJeyA4OCwgNDMsIDQyLCAyIH0sCisJW1FDT01fUlBNX1BNODAxOF9MRE85XSA9CQl7IDkwLCA0NSwgNDMsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X0xETzEwXSA9CQl7IDkyLCA0NywgNDQsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X0xETzExXSA9CQl7IDk0LCA0OSwgNDUsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X0xETzEyXSA9CQl7IDk2LCA1MSwgNDYsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X0xETzEzXSA9CQl7IDk4LCA1MywgNDcsIDIgfSwKKwlbUUNPTV9SUE1fUE04MDE4X0xETzE0XSA9CQl7IDEwMCwgNTUsIDQ4LCAyIH0sCisJW1FDT01fUlBNX1BNODAxOF9MVlMxXSA9CQl7IDEwMiwgNTcsIDQ5LCAxIH0sCisJW1FDT01fUlBNX1BNODAxOF9OQ1BdID0JCQl7IDEwMywgNTgsIDgwLCAyIH0sCisJW1FDT01fUlBNX0NYT19CVUZGRVJTXSA9CQl7IDEwNSwgNjAsIDgxLCAxIH0sCisJW1FDT01fUlBNX1VTQl9PVEdfU1dJVENIXSA9CQl7IDEwNiwgNjEsIDgyLCAxIH0sCisJW1FDT01fUlBNX0hETUlfU1dJVENIXSA9CQl7IDEwNywgNjIsIDgzLCAxIH0sCisJW1FDT01fUlBNX1ZPTFRBR0VfQ09STkVSXSA9CQl7IDEwOSwgNjQsIDg3LCAxIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHFjb21fcnBtX2RhdGEgbWRtOTYxNV90ZW1wbGF0ZSA9IHsKKwkudmVyc2lvbiA9IDMsCisJLnJlc291cmNlX3RhYmxlID0gbWRtOTYxNV9ycG1fcmVzb3VyY2VfdGFibGUsCisJLm5fcmVzb3VyY2VzID0gQVJSQVlfU0laRShtZG05NjE1X3JwbV9yZXNvdXJjZV90YWJsZSksCisJLnJlcV9jdHhfb2ZmID0gMywKKwkucmVxX3NlbF9vZmYgPSAxMSwKKwkuYWNrX2N0eF9vZmYgPSAxNSwKKwkuYWNrX3NlbF9vZmYgPSAyMywKKwkucmVxX3NlbF9zaXplID0gNCwKKwkuYWNrX3NlbF9zaXplID0gNywKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHFjb21fcnBtX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHJwbS1hcHE4MDY0IiwgLmRhdGEgPSAmYXBxODA2NF90ZW1wbGF0ZSB9LAogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxycG0tbXNtODY2MCIsIC5kYXRhID0gJm1zbTg2NjBfdGVtcGxhdGUgfSwKIAl7IC5jb21wYXRpYmxlID0gInFjb20scnBtLW1zbTg5NjAiLCAuZGF0YSA9ICZtc204OTYwX3RlbXBsYXRlIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHJwbS1pcHE4MDY0IiwgLmRhdGEgPSAmaXBxODA2eF90ZW1wbGF0ZSB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxycG0tbWRtOTYxNSIsIC5kYXRhID0gJm1kbTk2MTVfdGVtcGxhdGUgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBxY29tX3JwbV9vZl9tYXRjaCk7CkBAIC01MDEsNiArNTU0LDIwIEBACiAJbXV0ZXhfaW5pdCgmcnBtLT5sb2NrKTsKIAlpbml0X2NvbXBsZXRpb24oJnJwbS0+YWNrKTsKIAorCS8qIEVuYWJsZSBtZXNzYWdlIFJBTSBjbG9jayAqLworCXJwbS0+cmFtY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJyYW0iKTsKKwlpZiAoSVNfRVJSKHJwbS0+cmFtY2xrKSkgeworCQlyZXQgPSBQVFJfRVJSKHJwbS0+cmFtY2xrKTsKKwkJaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIHJldDsKKwkJLyoKKwkJICogRmFsbCB0aHJvdWdoIGluIGFsbCBvdGhlciBjYXNlcywgYXMgdGhlIGNsb2NrIGlzCisJCSAqIG9wdGlvbmFsLiAoRG9lcyBub3QgZXhpc3Qgb24gYWxsIHBsYXRmb3Jtcy4pCisJCSAqLworCQlycG0tPnJhbWNsayA9IE5VTEw7CisJfQorCWNsa19wcmVwYXJlX2VuYWJsZShycG0tPnJhbWNsayk7IC8qIEFjY2VwdHMgTlVMTCAqLworCiAJaXJxX2FjayA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJhY2siKTsKIAlpZiAoaXJxX2FjayA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWlyZWQgYWNrIGludGVycnVwdCBtaXNzaW5nXG4iKTsKQEAgLTUzOCw2ICs2MDUsNyBAQAogCX0KIAogCXJwbS0+aXBjX3JlZ21hcCA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChzeXNjb25fbnApOworCW9mX25vZGVfcHV0KHN5c2Nvbl9ucCk7CiAJaWYgKElTX0VSUihycG0tPmlwY19yZWdtYXApKQogCQlyZXR1cm4gUFRSX0VSUihycG0tPmlwY19yZWdtYXApOwogCkBAIC02MjAsNyArNjg4LDExIEBACiAKIHN0YXRpYyBpbnQgcWNvbV9ycG1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHFjb21fcnBtICpycG0gPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisKIAlvZl9wbGF0Zm9ybV9kZXBvcHVsYXRlKCZwZGV2LT5kZXYpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShycG0tPnJhbWNsayk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcms4MDguYyBiL2RyaXZlcnMvbWZkL3JrODA4LmMKaW5kZXggNDlkN2Y2Mi4uMGY4YWNjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvcms4MDguYworKysgYi9kcml2ZXJzL21mZC9yazgwOC5jCkBAIC0xLDExICsxLDE1IEBACiAvKgotICogTUZEIGNvcmUgZHJpdmVyIGZvciBSb2NrY2hpcCBSSzgwOAorICogTUZEIGNvcmUgZHJpdmVyIGZvciBSb2NrY2hpcCBSSzgwOC9SSzgxOAogICoKICAqIENvcHlyaWdodCAoYykgMjAxNCwgRnV6aG91IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkCiAgKgogICogQXV0aG9yOiBDaHJpcyBaaG9uZyA8enl3QHJvY2stY2hpcHMuY29tPgogICogQXV0aG9yOiBaaGFuZyBRaW5nIDx6aGFuZ3FpbmdAcm9jay1jaGlwcy5jb20+CiAgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFBIWVRFQyBNZXNzdGVjaG5payBHbWJICisgKgorICogQXV0aG9yOiBXYWRpbSBFZ29yb3YgPHcuZWdvcm92QHBoeXRlYy5kZT4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKICAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCkBAIC0yMSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3JrODA4Lmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KIAogc3RydWN0IHJrODA4X3JlZ19kYXRhIHsKQEAgLTU3LDYgKzYyLDE0IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcms4MThfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLm1heF9yZWdpc3RlciA9IFJLODE4X1VTQl9DVFJMX1JFRywKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkudm9sYXRpbGVfcmVnID0gcms4MDhfaXNfdm9sYXRpbGVfcmVnLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJrODA4X3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gOCwKIAkudmFsX2JpdHMgPSA4LApAQCAtNzksMTEgKzkyLDIxIEBACiAJewogCQkubmFtZSA9ICJyazgwOC1ydGMiLAogCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUocnRjX3Jlc291cmNlcyksCi0JCS5yZXNvdXJjZXMgPSAmcnRjX3Jlc291cmNlc1swXSwKKwkJLnJlc291cmNlcyA9IHJ0Y19yZXNvdXJjZXMsCiAJfSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgcms4MDhfcmVnX2RhdGEgcHJlX2luaXRfcmVnW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG1mZF9jZWxsIHJrODE4c1tdID0geworCXsgLm5hbWUgPSAicms4MDgtY2xrb3V0IiwgfSwKKwl7IC5uYW1lID0gInJrODA4LXJlZ3VsYXRvciIsIH0sCisJeworCQkubmFtZSA9ICJyazgwOC1ydGMiLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUocnRjX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBydGNfcmVzb3VyY2VzLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJrODA4X3JlZ19kYXRhIHJrODA4X3ByZV9pbml0X3JlZ1tdID0gewogCXsgUks4MDhfQlVDSzNfQ09ORklHX1JFRywgQlVDS19JTE1JTl9NQVNLLCAgQlVDS19JTE1JTl8xNTBNQSB9LAogCXsgUks4MDhfQlVDSzRfQ09ORklHX1JFRywgQlVDS19JTE1JTl9NQVNLLCAgQlVDS19JTE1JTl8yMDBNQSB9LAogCXsgUks4MDhfQk9PU1RfQ09ORklHX1JFRywgQk9PU1RfSUxNSU5fTUFTSywgQk9PU1RfSUxNSU5fMTAwTUEgfSwKQEAgLTk0LDYgKzExNywyNCBAQAogCQkJCQkJICAgIFZCX0xPX1NFTF8zNTAwTVYgfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgcms4MDhfcmVnX2RhdGEgcms4MThfcHJlX2luaXRfcmVnW10gPSB7CisJLyogaW1wcm92ZSBlZmZpY2llbmN5ICovCisJeyBSSzgxOF9CVUNLMl9DT05GSUdfUkVHLCBCVUNLMl9SQVRFX01BU0ssICBCVUNLX0lMTUlOXzI1ME1BIH0sCisJeyBSSzgxOF9CVUNLNF9DT05GSUdfUkVHLCBCVUNLX0lMTUlOX01BU0ssICBCVUNLX0lMTUlOXzI1ME1BIH0sCisJeyBSSzgxOF9CT09TVF9DT05GSUdfUkVHLCBCT09TVF9JTE1JTl9NQVNLLCBCT09TVF9JTE1JTl8xMDBNQSB9LAorCXsgUks4MThfVVNCX0NUUkxfUkVHLAkgIFJLODE4X1VTQl9JTElNX1NFTF9NQVNLLAorCQkJCQkJICAgIFJLODE4X1VTQl9JTE1JTl8yMDAwTUEgfSwKKwkvKiBjbG9zZSBjaGFyZ2VyIHdoZW4gdXNiIGxvd2VyIHRoZW4gMy40ViAqLworCXsgUks4MThfVVNCX0NUUkxfUkVHLAkgIFJLODE4X1VTQl9DSEdfU0RfVlNFTF9NQVNLLAorCQkJCQkJICAgICgweDcgPDwgNCkgfSwKKwkvKiBubyBhY3Rpb24gd2hlbiB2cmVmICovCisJeyBSSzgxOF9INVZfRU5fUkVHLAkgIEJJVCgxKSwJICAgIFJLODE4X1JFRl9SRFlfQ1RSTCB9LAorCS8qIGVuYWJsZSBIRE1JIDVWICovCisJeyBSSzgxOF9INVZfRU5fUkVHLAkgIEJJVCgwKSwJICAgIFJLODE4X0g1Vl9FTiB9LAorCXsgUks4MDhfVkJfTU9OX1JFRywJICBNQVNLX0FMTCwJICAgIFZCX0xPX0FDVCB8CisJCQkJCQkgICAgVkJfTE9fU0VMXzM1MDBNViB9LAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfaXJxIHJrODA4X2lycXNbXSA9IHsKIAkvKiBJTlRfU1RTICovCiAJW1JLODA4X0lSUV9WT1VUX0xPXSA9IHsKQEAgLTEzNiw2ICsxNzcsNzYgQEAKIAl9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfaXJxIHJrODE4X2lycXNbXSA9IHsKKwkvKiBJTlRfU1RTICovCisJW1JLODE4X0lSUV9WT1VUX0xPXSA9IHsKKwkJLm1hc2sgPSBSSzgxOF9JUlFfVk9VVF9MT19NU0ssCisJCS5yZWdfb2Zmc2V0ID0gMCwKKwl9LAorCVtSSzgxOF9JUlFfVkJfTE9dID0geworCQkubWFzayA9IFJLODE4X0lSUV9WQl9MT19NU0ssCisJCS5yZWdfb2Zmc2V0ID0gMCwKKwl9LAorCVtSSzgxOF9JUlFfUFdST05dID0geworCQkubWFzayA9IFJLODE4X0lSUV9QV1JPTl9NU0ssCisJCS5yZWdfb2Zmc2V0ID0gMCwKKwl9LAorCVtSSzgxOF9JUlFfUFdST05fTFBdID0geworCQkubWFzayA9IFJLODE4X0lSUV9QV1JPTl9MUF9NU0ssCisJCS5yZWdfb2Zmc2V0ID0gMCwKKwl9LAorCVtSSzgxOF9JUlFfSE9URElFXSA9IHsKKwkJLm1hc2sgPSBSSzgxOF9JUlFfSE9URElFX01TSywKKwkJLnJlZ19vZmZzZXQgPSAwLAorCX0sCisJW1JLODE4X0lSUV9SVENfQUxBUk1dID0geworCQkubWFzayA9IFJLODE4X0lSUV9SVENfQUxBUk1fTVNLLAorCQkucmVnX29mZnNldCA9IDAsCisJfSwKKwlbUks4MThfSVJRX1JUQ19QRVJJT0RdID0geworCQkubWFzayA9IFJLODE4X0lSUV9SVENfUEVSSU9EX01TSywKKwkJLnJlZ19vZmZzZXQgPSAwLAorCX0sCisJW1JLODE4X0lSUV9VU0JfT1ZdID0geworCQkubWFzayA9IFJLODE4X0lSUV9VU0JfT1ZfTVNLLAorCQkucmVnX29mZnNldCA9IDAsCisJfSwKKworCS8qIElOVF9TVFMyICovCisJW1JLODE4X0lSUV9QTFVHX0lOXSA9IHsKKwkJLm1hc2sgPSBSSzgxOF9JUlFfUExVR19JTl9NU0ssCisJCS5yZWdfb2Zmc2V0ID0gMSwKKwl9LAorCVtSSzgxOF9JUlFfUExVR19PVVRdID0geworCQkubWFzayA9IFJLODE4X0lSUV9QTFVHX09VVF9NU0ssCisJCS5yZWdfb2Zmc2V0ID0gMSwKKwl9LAorCVtSSzgxOF9JUlFfQ0hHX09LXSA9IHsKKwkJLm1hc2sgPSBSSzgxOF9JUlFfQ0hHX09LX01TSywKKwkJLnJlZ19vZmZzZXQgPSAxLAorCX0sCisJW1JLODE4X0lSUV9DSEdfVEVdID0geworCQkubWFzayA9IFJLODE4X0lSUV9DSEdfVEVfTVNLLAorCQkucmVnX29mZnNldCA9IDEsCisJfSwKKwlbUks4MThfSVJRX0NIR19UUzFdID0geworCQkubWFzayA9IFJLODE4X0lSUV9DSEdfVFMxX01TSywKKwkJLnJlZ19vZmZzZXQgPSAxLAorCX0sCisJW1JLODE4X0lSUV9UUzJdID0geworCQkubWFzayA9IFJLODE4X0lSUV9UUzJfTVNLLAorCQkucmVnX29mZnNldCA9IDEsCisJfSwKKwlbUks4MThfSVJRX0NIR19DVlRMSU1dID0geworCQkubWFzayA9IFJLODE4X0lSUV9DSEdfQ1ZUTElNX01TSywKKwkJLnJlZ19vZmZzZXQgPSAxLAorCX0sCisJW1JLODE4X0lSUV9ESVNDSEdfSUxJTV0gPSB7CisJCS5tYXNrID0gUks4MThfSVJRX0RJU0NIR19JTElNX01TSywKKwkJLnJlZ19vZmZzZXQgPSAxLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHJlZ21hcF9pcnFfY2hpcCByazgwOF9pcnFfY2hpcCA9IHsKIAkubmFtZSA9ICJyazgwOCIsCiAJLmlycXMgPSByazgwOF9pcnFzLApAQCAtMTQ4LDYgKzI1OSwxOCBAQAogCS5pbml0X2Fja19tYXNrZWQgPSB0cnVlLAogfTsKIAorc3RhdGljIHN0cnVjdCByZWdtYXBfaXJxX2NoaXAgcms4MThfaXJxX2NoaXAgPSB7CisJLm5hbWUgPSAicms4MTgiLAorCS5pcnFzID0gcms4MThfaXJxcywKKwkubnVtX2lycXMgPSBBUlJBWV9TSVpFKHJrODE4X2lycXMpLAorCS5udW1fcmVncyA9IDIsCisJLmlycV9yZWdfc3RyaWRlID0gMiwKKwkuc3RhdHVzX2Jhc2UgPSBSSzgxOF9JTlRfU1RTX1JFRzEsCisJLm1hc2tfYmFzZSA9IFJLODE4X0lOVF9TVFNfTVNLX1JFRzEsCisJLmFja19iYXNlID0gUks4MThfSU5UX1NUU19SRUcxLAorCS5pbml0X2Fja19tYXNrZWQgPSB0cnVlLAorfTsKKwogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50ICpyazgwOF9pMmNfY2xpZW50Owogc3RhdGljIHZvaWQgcms4MDhfZGV2aWNlX3NodXRkb3duKHZvaWQpCiB7CkBAIC0xNjcsNTUgKzI5MCwxMDAgQEAKIAkJZGV2X2Vycigmcms4MDhfaTJjX2NsaWVudC0+ZGV2LCAicG93ZXIgb2ZmIGVycm9yIVxuIik7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJrODA4X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazgwOCIgfSwKKwl7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrODE4IiB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByazgwOF9vZl9tYXRjaCk7CisKIHN0YXRpYyBpbnQgcms4MDhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJICAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gY2xpZW50LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3Qgcms4MDggKnJrODA4OworCWNvbnN0IHN0cnVjdCByazgwOF9yZWdfZGF0YSAqcHJlX2luaXRfcmVnOworCWNvbnN0IHN0cnVjdCBtZmRfY2VsbCAqY2VsbHM7CisJaW50IG5yX3ByZV9pbml0X3JlZ3M7CisJaW50IG5yX2NlbGxzOwogCWludCBwbV9vZmYgPSAwOwogCWludCByZXQ7CiAJaW50IGk7CiAKKwlyazgwOCA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqcms4MDgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJrODA4KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJrODA4LT52YXJpYW50ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgUks4MDhfSURfTVNCKTsKKwlpZiAocms4MDgtPnZhcmlhbnQgPCAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgdGhlIGNoaXAgaWQgYXQgMHglMDJ4XG4iLAorCQkJUks4MDhfSURfTVNCKTsKKwkJcmV0dXJuIHJrODA4LT52YXJpYW50OworCX0KKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiQ2hpcCBpZDogMHgleFxuIiwgKHVuc2lnbmVkIGludClyazgwOC0+dmFyaWFudCk7CisKKwlzd2l0Y2ggKHJrODA4LT52YXJpYW50KSB7CisJY2FzZSBSSzgwOF9JRDoKKwkJcms4MDgtPnJlZ21hcF9jZmcgPSAmcms4MDhfcmVnbWFwX2NvbmZpZzsKKwkJcms4MDgtPnJlZ21hcF9pcnFfY2hpcCA9ICZyazgwOF9pcnFfY2hpcDsKKwkJcHJlX2luaXRfcmVnID0gcms4MDhfcHJlX2luaXRfcmVnOworCQlucl9wcmVfaW5pdF9yZWdzID0gQVJSQVlfU0laRShyazgwOF9wcmVfaW5pdF9yZWcpOworCQljZWxscyA9IHJrODA4czsKKwkJbnJfY2VsbHMgPSBBUlJBWV9TSVpFKHJrODA4cyk7CisJCWJyZWFrOworCWNhc2UgUks4MThfSUQ6CisJCXJrODA4LT5yZWdtYXBfY2ZnID0gJnJrODE4X3JlZ21hcF9jb25maWc7CisJCXJrODA4LT5yZWdtYXBfaXJxX2NoaXAgPSAmcms4MThfaXJxX2NoaXA7CisJCXByZV9pbml0X3JlZyA9IHJrODE4X3ByZV9pbml0X3JlZzsKKwkJbnJfcHJlX2luaXRfcmVncyA9IEFSUkFZX1NJWkUocms4MThfcHJlX2luaXRfcmVnKTsKKwkJY2VsbHMgPSByazgxOHM7CisJCW5yX2NlbGxzID0gQVJSQVlfU0laRShyazgxOHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuc3VwcG9ydGVkIFJLOFhYIElEICVsdVxuIiwKKwkJCXJrODA4LT52YXJpYW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcms4MDgtPmkyYyA9IGNsaWVudDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCByazgwOCk7CisKKwlyazgwOC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCByazgwOC0+cmVnbWFwX2NmZyk7CisJaWYgKElTX0VSUihyazgwOC0+cmVnbWFwKSkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlZ21hcCBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyazgwOC0+cmVnbWFwKTsKKwl9CisKIAlpZiAoIWNsaWVudC0+aXJxKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTm8gaW50ZXJydXB0IHN1cHBvcnQsIG5vIGNvcmUgSVJRXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0Jcms4MDggPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKnJrODA4KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyazgwOCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyazgwOC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpZW50LCAmcms4MDhfcmVnbWFwX2NvbmZpZyk7Ci0JaWYgKElTX0VSUihyazgwOC0+cmVnbWFwKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInJlZ21hcCBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihyazgwOC0+cmVnbWFwKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcmVfaW5pdF9yZWcpOyBpKyspIHsKLQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHJrODA4LT5yZWdtYXAsIHByZV9pbml0X3JlZ1tpXS5hZGRyLAotCQkJCQkgcHJlX2luaXRfcmVnW2ldLm1hc2ssCi0JCQkJCSBwcmVfaW5pdF9yZWdbaV0udmFsdWUpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKLQkJCQkiMHgleCB3cml0ZSBlcnJcbiIsIHByZV9pbml0X3JlZ1tpXS5hZGRyKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KIAlyZXQgPSByZWdtYXBfYWRkX2lycV9jaGlwKHJrODA4LT5yZWdtYXAsIGNsaWVudC0+aXJxLAogCQkJCSAgSVJRRl9PTkVTSE9ULCAtMSwKLQkJCQkgICZyazgwOF9pcnFfY2hpcCwgJnJrODA4LT5pcnFfZGF0YSk7CisJCQkJICByazgwOC0+cmVnbWFwX2lycV9jaGlwLCAmcms4MDgtPmlycV9kYXRhKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBpcnFfY2hpcCAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyazgwOC0+aTJjID0gY2xpZW50OwotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHJrODA4KTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcHJlX2luaXRfcmVnczsgaSsrKSB7CisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhyazgwOC0+cmVnbWFwLAorCQkJCQlwcmVfaW5pdF9yZWdbaV0uYWRkciwKKwkJCQkJcHJlX2luaXRfcmVnW2ldLm1hc2ssCisJCQkJCXByZV9pbml0X3JlZ1tpXS52YWx1ZSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSIweCV4IHdyaXRlIGVyclxuIiwKKwkJCQlwcmVfaW5pdF9yZWdbaV0uYWRkcik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQogCi0JcmV0ID0gZGV2bV9tZmRfYWRkX2RldmljZXMoJmNsaWVudC0+ZGV2LCAtMSwKLQkJCQkgICByazgwOHMsIEFSUkFZX1NJWkUocms4MDhzKSwgTlVMTCwgMCwKLQkJCQkgICByZWdtYXBfaXJxX2dldF9kb21haW4ocms4MDgtPmlycV9kYXRhKSk7CisJcmV0ID0gZGV2bV9tZmRfYWRkX2RldmljZXMoJmNsaWVudC0+ZGV2LCBQTEFURk9STV9ERVZJRF9OT05FLAorCQkJICAgICAgY2VsbHMsIG5yX2NlbGxzLCBOVUxMLCAwLAorCQkJICAgICAgcmVnbWFwX2lycV9nZXRfZG9tYWluKHJrODA4LT5pcnFfZGF0YSkpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gYWRkIE1GRCBkZXZpY2VzICVkXG4iLCByZXQpOwogCQlnb3RvIGVycl9pcnE7CkBAIC0yNDUsMTQgKzQxMyw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJrODA4X29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazgwOCIgfSwKLQl7IH0sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcms4MDhfb2ZfbWF0Y2gpOwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcms4MDhfaWRzW10gPSB7CiAJeyAicms4MDgiIH0sCisJeyAicms4MTgiIH0sCiAJeyB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCByazgwOF9pZHMpOwpAQCAtMjcyLDQgKzQzNSw1IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJDaHJpcyBaaG9uZyA8enl3QHJvY2stY2hpcHMuY29tPiIpOwogTU9EVUxFX0FVVEhPUigiWmhhbmcgUWluZyA8emhhbmdxaW5nQHJvY2stY2hpcHMuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSSzgwOCBQTUlDIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiV2FkaW0gRWdvcm92IDx3LmVnb3JvdkBwaHl0ZWMuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJLODA4L1JLODE4IFBNSUMgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9ydHN4X3VzYi5jIGIvZHJpdmVycy9tZmQvcnRzeF91c2IuYwppbmRleCBkYmQ5MDdkLi42OTFkYWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9ydHN4X3VzYi5jCisrKyBiL2RyaXZlcnMvbWZkL3J0c3hfdXNiLmMKQEAgLTQ2LDkgKzQ2LDYgQEAKIAogCWRldl9kYmcoJnVjci0+cHVzYl9pbnRmLT5kZXYsICIlczogc2cgdHJhbnNmZXIgdGltZWQgb3V0IiwgX19mdW5jX18pOwogCXVzYl9zZ19jYW5jZWwoJnVjci0+Y3VycmVudF9zZyk7Ci0KLQkvKiB3ZSBrbm93IHRoZSBjYW5jZWxsYXRpb24gaXMgY2F1c2VkIGJ5IHRpbWUtb3V0ICovCi0JdWNyLT5jdXJyZW50X3NnLnN0YXR1cyA9IC1FVElNRURPVVQ7CiB9CiAKIHN0YXRpYyBpbnQgcnRzeF91c2JfYnVsa190cmFuc2Zlcl9zZ2xpc3Qoc3RydWN0IHJ0c3hfdWNyICp1Y3IsCkBAIC02NywxMiArNjQsMTUgQEAKIAl1Y3ItPnNnX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KTsKIAlhZGRfdGltZXIoJnVjci0+c2dfdGltZXIpOwogCXVzYl9zZ193YWl0KCZ1Y3ItPmN1cnJlbnRfc2cpOwotCWRlbF90aW1lcl9zeW5jKCZ1Y3ItPnNnX3RpbWVyKTsKKwlpZiAoIWRlbF90aW1lcl9zeW5jKCZ1Y3ItPnNnX3RpbWVyKSkKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwllbHNlCisJCXJldCA9IHVjci0+Y3VycmVudF9zZy5zdGF0dXM7CiAKIAlpZiAoYWN0X2xlbikKIAkJKmFjdF9sZW4gPSB1Y3ItPmN1cnJlbnRfc2cuYnl0ZXM7CiAKLQlyZXR1cm4gdWNyLT5jdXJyZW50X3NnLnN0YXR1czsKKwlyZXR1cm4gcmV0OwogfQogCiBpbnQgcnRzeF91c2JfdHJhbnNmZXJfZGF0YShzdHJ1Y3QgcnRzeF91Y3IgKnVjciwgdW5zaWduZWQgaW50IHBpcGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9zbTUwMS5jIGIvZHJpdmVycy9tZmQvc201MDEuYwppbmRleCA2NWNkMGQyLi40MDUzNDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9zbTUwMS5jCisrKyBiL2RyaXZlcnMvbWZkL3NtNTAxLmMKQEAgLTEwMDEsNyArMTAwMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcF90ZW1wbGF0ZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIGdwaW9fY2hpcF90ZW1wbGF0ZSA9IHsKIAkubmdwaW8JCQk9IDMyLAogCS5kaXJlY3Rpb25faW5wdXQJPSBzbTUwMV9ncGlvX2lucHV0LAogCS5kaXJlY3Rpb25fb3V0cHV0CT0gc201MDFfZ3Bpb19vdXRwdXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9zbXNjLWVjZTEwOTkuYyBiL2RyaXZlcnMvbWZkL3Ntc2MtZWNlMTA5OS5jCmluZGV4IGNkMThjMDkuLjFmNDBiYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3Ntc2MtZWNlMTA5OS5jCisrKyBiL2RyaXZlcnMvbWZkL3Ntc2MtZWNlMTA5OS5jCkBAIC0xMSw4ICsxMSw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpAQCAtODEsNyArODAsNiBAQAogCXsgInNtc2NlY2UxMDk5IiwgMH0sCiAJe30sCiB9OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHNtc2NfaTJjX2lkKTsKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHNtc2NfaTJjX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewpAQCAtOTAsOSArODgsNCBAQAogCS5wcm9iZSA9IHNtc2NfaTJjX3Byb2JlLAogCS5pZF90YWJsZSA9IHNtc2NfaTJjX2lkLAogfTsKLQotbW9kdWxlX2kyY19kcml2ZXIoc21zY19pMmNfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiU291cmF2IFBvZGRhciA8c291cmF2LnBvZGRhckB0aS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlNNU0MgY2hpcCBtdWx0aS1mdW5jdGlvbiBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK2J1aWx0aW5faTJjX2RyaXZlcihzbXNjX2kyY19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvc3RtcGUtaTJjLmMgYi9kcml2ZXJzL21mZC9zdG1wZS1pMmMuYwppbmRleCBjM2Y0YWFiLi44NjNjMzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9zdG1wZS1pMmMuYworKysgYi9kcml2ZXJzL21mZC9zdG1wZS1pMmMuYwpAQCAtNTcsNiArNTcsNyBAQAogCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtcGU2MTAiLCAuZGF0YSA9ICh2b2lkICopU1RNUEU2MTAsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJzdCxzdG1wZTgwMSIsIC5kYXRhID0gKHZvaWQgKilTVE1QRTgwMSwgfSwKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0bXBlODExIiwgLmRhdGEgPSAodm9pZCAqKVNUTVBFODExLCB9LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtcGUxNjAwIiwgLmRhdGEgPSAodm9pZCAqKVNUTVBFMTYwMCwgfSwKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0bXBlMTYwMSIsIC5kYXRhID0gKHZvaWQgKilTVE1QRTE2MDEsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJzdCxzdG1wZTE4MDEiLCAuZGF0YSA9ICh2b2lkICopU1RNUEUxODAxLCB9LAogCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtcGUyNDAxIiwgLmRhdGEgPSAodm9pZCAqKVNUTVBFMjQwMSwgfSwKQEAgLTEwMSw2ICsxMDIsNyBAQAogCXsgInN0bXBlNjEwIiwgU1RNUEU2MTAgfSwKIAl7ICJzdG1wZTgwMSIsIFNUTVBFODAxIH0sCiAJeyAic3RtcGU4MTEiLCBTVE1QRTgxMSB9LAorCXsgInN0bXBlMTYwMCIsIFNUTVBFMTYwMCB9LAogCXsgInN0bXBlMTYwMSIsIFNUTVBFMTYwMSB9LAogCXsgInN0bXBlMTgwMSIsIFNUTVBFMTgwMSB9LAogCXsgInN0bXBlMjQwMSIsIFNUTVBFMjQwMSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvc3RtcGUuYyBiL2RyaXZlcnMvbWZkL3N0bXBlLmMKaW5kZXggOTRjN2NjMC4uY2ZkYWU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvc3RtcGUuYworKysgYi9kcml2ZXJzL21mZC9zdG1wZS5jCkBAIC00NjksNiArNDY5LDggQEAKIAogc3RhdGljIGNvbnN0IHU4IHN0bXBlODExX3JlZ3NbXSA9IHsKIAlbU1RNUEVfSURYX0NISVBfSURdCT0gU1RNUEU4MTFfUkVHX0NISVBfSUQsCisJW1NUTVBFX0lEWF9TWVNfQ1RSTF0JPSBTVE1QRTgxMV9SRUdfU1lTX0NUUkwsCisJW1NUTVBFX0lEWF9TWVNfQ1RSTDJdCT0gU1RNUEU4MTFfUkVHX1NZU19DVFJMMiwKIAlbU1RNUEVfSURYX0lDUl9MU0JdCT0gU1RNUEU4MTFfUkVHX0lOVF9DVFJMLAogCVtTVE1QRV9JRFhfSUVSX0xTQl0JPSBTVE1QRTgxMV9SRUdfSU5UX0VOLAogCVtTVE1QRV9JRFhfSVNSX01TQl0JPSBTVE1QRTgxMV9SRUdfSU5UX1NUQSwKQEAgLTQ4MSw3ICs0ODMsNyBAQAogCVtTVE1QRV9JRFhfR1BBRlJfVV9NU0JdCT0gU1RNUEU4MTFfUkVHX0dQSU9fQUYsCiAJW1NUTVBFX0lEWF9JRUdQSU9SX0xTQl0JPSBTVE1QRTgxMV9SRUdfR1BJT19JTlRfRU4sCiAJW1NUTVBFX0lEWF9JU0dQSU9SX01TQl0JPSBTVE1QRTgxMV9SRUdfR1BJT19JTlRfU1RBLAotCVtTVE1QRV9JRFhfR1BFRFJfTVNCXQk9IFNUTVBFODExX1JFR19HUElPX0VELAorCVtTVE1QRV9JRFhfR1BFRFJfTFNCXQk9IFNUTVBFODExX1JFR19HUElPX0VELAogfTsKIAogc3RhdGljIHN0cnVjdCBzdG1wZV92YXJpYW50X2Jsb2NrIHN0bXBlODExX2Jsb2Nrc1tdID0gewpAQCAtNTExLDcgKzUxMyw3IEBACiAJaWYgKGJsb2NrcyAmIFNUTVBFX0JMT0NLX1RPVUNIU0NSRUVOKQogCQltYXNrIHw9IFNUTVBFODExX1NZU19DVFJMMl9UU0NfT0ZGOwogCi0JcmV0dXJuIF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIFNUTVBFODExX1JFR19TWVNfQ1RSTDIsIG1hc2ssCisJcmV0dXJuIF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9TWVNfQ1RSTDJdLCBtYXNrLAogCQkJCWVuYWJsZSA/IDAgOiBtYXNrKTsKIH0KIApAQCAtNTUxLDI1ICs1NTMsODkgQEAKIH07CiAKIC8qCisgKiBTVE1QRTE2MDAKKyAqIENvbXBhcmVkIHRvIGFsbCBvdGhlcnMgU1RNUEUgdmFyaWFudCwgTFNCIGFuZCBNU0IgcmVncyBhcmUgbG9jYXRlZCBpbiB0aGlzCisgKiBvcmRlciA6CUxTQiAgIGFkZHIKKyAqCQlNU0IgICBhZGRyICsgMQorICogQXMgdGhlcmUgaXMgb25seSAyICogOGJpdHMgcmVnaXN0ZXJzIGZvciBHUE1SL0dQU1IvSUVHUElPUFIsIENTQiBpbmRleCBpcyBNU0IgcmVnaXN0ZXJzCisgKi8KKworc3RhdGljIGNvbnN0IHU4IHN0bXBlMTYwMF9yZWdzW10gPSB7CisJW1NUTVBFX0lEWF9DSElQX0lEXQk9IFNUTVBFMTYwMF9SRUdfQ0hJUF9JRCwKKwlbU1RNUEVfSURYX1NZU19DVFJMXQk9IFNUTVBFMTYwMF9SRUdfU1lTX0NUUkwsCisJW1NUTVBFX0lEWF9JQ1JfTFNCXQk9IFNUTVBFMTYwMF9SRUdfU1lTX0NUUkwsCisJW1NUTVBFX0lEWF9HUE1SX0xTQl0JPSBTVE1QRTE2MDBfUkVHX0dQTVJfTFNCLAorCVtTVE1QRV9JRFhfR1BNUl9DU0JdCT0gU1RNUEUxNjAwX1JFR19HUE1SX01TQiwKKwlbU1RNUEVfSURYX0dQU1JfTFNCXQk9IFNUTVBFMTYwMF9SRUdfR1BTUl9MU0IsCisJW1NUTVBFX0lEWF9HUFNSX0NTQl0JPSBTVE1QRTE2MDBfUkVHX0dQU1JfTVNCLAorCVtTVE1QRV9JRFhfR1BEUl9MU0JdCT0gU1RNUEUxNjAwX1JFR19HUERSX0xTQiwKKwlbU1RNUEVfSURYX0dQRFJfQ1NCXQk9IFNUTVBFMTYwMF9SRUdfR1BEUl9NU0IsCisJW1NUTVBFX0lEWF9JRUdQSU9SX0xTQl0JPSBTVE1QRTE2MDBfUkVHX0lFR1BJT1JfTFNCLAorCVtTVE1QRV9JRFhfSUVHUElPUl9DU0JdCT0gU1RNUEUxNjAwX1JFR19JRUdQSU9SX01TQiwKKwlbU1RNUEVfSURYX0lTR1BJT1JfTFNCXQk9IFNUTVBFMTYwMF9SRUdfSVNHUElPUl9MU0IsCit9OworCitzdGF0aWMgc3RydWN0IHN0bXBlX3ZhcmlhbnRfYmxvY2sgc3RtcGUxNjAwX2Jsb2Nrc1tdID0geworCXsKKwkJLmNlbGwJPSAmc3RtcGVfZ3Bpb19jZWxsLAorCQkuaXJxCT0gMCwKKwkJLmJsb2NrCT0gU1RNUEVfQkxPQ0tfR1BJTywKKwl9LAorfTsKKworc3RhdGljIGludCBzdG1wZTE2MDBfZW5hYmxlKHN0cnVjdCBzdG1wZSAqc3RtcGUsIHVuc2lnbmVkIGludCBibG9ja3MsCisJCQkgICBib29sIGVuYWJsZSkKK3sKKwlpZiAoYmxvY2tzICYgU1RNUEVfQkxPQ0tfR1BJTykKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBzdG1wZV92YXJpYW50X2luZm8gc3RtcGUxNjAwID0geworCS5uYW1lCQk9ICJzdG1wZTE2MDAiLAorCS5pZF92YWwJCT0gU1RNUEUxNjAwX0lELAorCS5pZF9tYXNrCT0gMHhmZmZmLAorCS5udW1fZ3Bpb3MJPSAxNiwKKwkuYWZfYml0cwk9IDAsCisJLnJlZ3MJCT0gc3RtcGUxNjAwX3JlZ3MsCisJLmJsb2NrcwkJPSBzdG1wZTE2MDBfYmxvY2tzLAorCS5udW1fYmxvY2tzCT0gQVJSQVlfU0laRShzdG1wZTE2MDBfYmxvY2tzKSwKKwkubnVtX2lycXMJPSBTVE1QRTE2MDBfTlJfSU5URVJOQUxfSVJRUywKKwkuZW5hYmxlCQk9IHN0bXBlMTYwMF9lbmFibGUsCit9OworCisvKgogICogU1RNUEUxNjAxCiAgKi8KIAogc3RhdGljIGNvbnN0IHU4IHN0bXBlMTYwMV9yZWdzW10gPSB7CiAJW1NUTVBFX0lEWF9DSElQX0lEXQk9IFNUTVBFMTYwMV9SRUdfQ0hJUF9JRCwKKwlbU1RNUEVfSURYX1NZU19DVFJMXQk9IFNUTVBFMTYwMV9SRUdfU1lTX0NUUkwsCisJW1NUTVBFX0lEWF9TWVNfQ1RSTDJdCT0gU1RNUEUxNjAxX1JFR19TWVNfQ1RSTDIsCiAJW1NUTVBFX0lEWF9JQ1JfTFNCXQk9IFNUTVBFMTYwMV9SRUdfSUNSX0xTQiwKKwlbU1RNUEVfSURYX0lFUl9NU0JdCT0gU1RNUEUxNjAxX1JFR19JRVJfTVNCLAogCVtTVE1QRV9JRFhfSUVSX0xTQl0JPSBTVE1QRTE2MDFfUkVHX0lFUl9MU0IsCiAJW1NUTVBFX0lEWF9JU1JfTVNCXQk9IFNUTVBFMTYwMV9SRUdfSVNSX01TQiwKIAlbU1RNUEVfSURYX0dQTVJfTFNCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19NUF9MU0IsCisJW1NUTVBFX0lEWF9HUE1SX0NTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fTVBfTVNCLAogCVtTVE1QRV9JRFhfR1BTUl9MU0JdCT0gU1RNUEUxNjAxX1JFR19HUElPX1NFVF9MU0IsCisJW1NUTVBFX0lEWF9HUFNSX0NTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fU0VUX01TQiwKIAlbU1RNUEVfSURYX0dQQ1JfTFNCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19DTFJfTFNCLAorCVtTVE1QRV9JRFhfR1BDUl9DU0JdCT0gU1RNUEUxNjAxX1JFR19HUElPX0NMUl9NU0IsCiAJW1NUTVBFX0lEWF9HUERSX0xTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fU0VUX0RJUl9MU0IsCisJW1NUTVBFX0lEWF9HUERSX0NTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fU0VUX0RJUl9NU0IsCisJW1NUTVBFX0lEWF9HUEVEUl9MU0JdCT0gU1RNUEUxNjAxX1JFR19HUElPX0VEX0xTQiwKKwlbU1RNUEVfSURYX0dQRURSX0NTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fRURfTVNCLAogCVtTVE1QRV9JRFhfR1BSRVJfTFNCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19SRV9MU0IsCisJW1NUTVBFX0lEWF9HUFJFUl9DU0JdCT0gU1RNUEUxNjAxX1JFR19HUElPX1JFX01TQiwKIAlbU1RNUEVfSURYX0dQRkVSX0xTQl0JPSBTVE1QRTE2MDFfUkVHX0dQSU9fRkVfTFNCLAorCVtTVE1QRV9JRFhfR1BGRVJfQ1NCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19GRV9NU0IsCiAJW1NUTVBFX0lEWF9HUFBVUl9MU0JdCT0gU1RNUEUxNjAxX1JFR19HUElPX1BVX0xTQiwKIAlbU1RNUEVfSURYX0dQQUZSX1VfTVNCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19BRl9VX01TQiwKIAlbU1RNUEVfSURYX0lFR1BJT1JfTFNCXQk9IFNUTVBFMTYwMV9SRUdfSU5UX0VOX0dQSU9fTUFTS19MU0IsCisJW1NUTVBFX0lEWF9JRUdQSU9SX0NTQl0JPSBTVE1QRTE2MDFfUkVHX0lOVF9FTl9HUElPX01BU0tfTVNCLAogCVtTVE1QRV9JRFhfSVNHUElPUl9NU0JdCT0gU1RNUEUxNjAxX1JFR19JTlRfU1RBX0dQSU9fTVNCLAotCVtTVE1QRV9JRFhfR1BFRFJfTVNCXQk9IFNUTVBFMTYwMV9SRUdfR1BJT19FRF9NU0IsCiB9OwogCiBzdGF0aWMgc3RydWN0IHN0bXBlX3ZhcmlhbnRfYmxvY2sgc3RtcGUxNjAxX2Jsb2Nrc1tdID0gewpAQCAtNjQwLDEzICs3MDYsMTMgQEAKIAkJcmV0dXJuIHRpbWVvdXQ7CiAJfQogCi0JcmV0ID0gX19zdG1wZV9zZXRfYml0cyhzdG1wZSwgU1RNUEUxNjAxX1JFR19TWVNfQ1RSTDIsCisJcmV0ID0gX19zdG1wZV9zZXRfYml0cyhzdG1wZSwgc3RtcGUtPnJlZ3NbU1RNUEVfSURYX1NZU19DVFJMMl0sCiAJCQlTVE1QRTE2MDFfQVVUT1NMRUVQX1RJTUVPVVRfTUFTSywKIAkJCXRpbWVvdXQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIFNUTVBFMTYwMV9SRUdfU1lTX0NUUkwyLAorCXJldHVybiBfX3N0bXBlX3NldF9iaXRzKHN0bXBlLCBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfU1lTX0NUUkwyXSwKIAkJCVNUUE1FMTYwMV9BVVRPU0xFRVBfRU5BQkxFLAogCQkJU1RQTUUxNjAxX0FVVE9TTEVFUF9FTkFCTEUpOwogfQpAQCAtNjcxLDcgKzczNyw3IEBACiAJZWxzZQogCQltYXNrICY9IH5TVE1QRTE2MDFfU1lTX0NUUkxfRU5BQkxFX1NQV007CiAKLQlyZXR1cm4gX19zdG1wZV9zZXRfYml0cyhzdG1wZSwgU1RNUEUxNjAxX1JFR19TWVNfQ1RSTCwgbWFzaywKKwlyZXR1cm4gX19zdG1wZV9zZXRfYml0cyhzdG1wZSwgc3RtcGUtPnJlZ3NbU1RNUEVfSURYX1NZU19DVFJMXSwgbWFzaywKIAkJCQllbmFibGUgPyBtYXNrIDogMCk7CiB9CiAKQEAgLTcxMCwxOCArNzc2LDMzIEBACiAgKi8KIHN0YXRpYyBjb25zdCB1OCBzdG1wZTE4MDFfcmVnc1tdID0gewogCVtTVE1QRV9JRFhfQ0hJUF9JRF0JPSBTVE1QRTE4MDFfUkVHX0NISVBfSUQsCisJW1NUTVBFX0lEWF9TWVNfQ1RSTF0JPSBTVE1QRTE4MDFfUkVHX1NZU19DVFJMLAogCVtTVE1QRV9JRFhfSUNSX0xTQl0JPSBTVE1QRTE4MDFfUkVHX0lOVF9DVFJMX0xPVywKIAlbU1RNUEVfSURYX0lFUl9MU0JdCT0gU1RNUEUxODAxX1JFR19JTlRfRU5fTUFTS19MT1csCiAJW1NUTVBFX0lEWF9JU1JfTFNCXQk9IFNUTVBFMTgwMV9SRUdfSU5UX1NUQV9MT1csCiAJW1NUTVBFX0lEWF9HUE1SX0xTQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fTVBfTE9XLAorCVtTVE1QRV9JRFhfR1BNUl9DU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX01QX01JRCwKKwlbU1RNUEVfSURYX0dQTVJfTVNCXQk9IFNUTVBFMTgwMV9SRUdfR1BJT19NUF9ISUdILAogCVtTVE1QRV9JRFhfR1BTUl9MU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX1NFVF9MT1csCisJW1NUTVBFX0lEWF9HUFNSX0NTQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fU0VUX01JRCwKKwlbU1RNUEVfSURYX0dQU1JfTVNCXQk9IFNUTVBFMTgwMV9SRUdfR1BJT19TRVRfSElHSCwKIAlbU1RNUEVfSURYX0dQQ1JfTFNCXQk9IFNUTVBFMTgwMV9SRUdfR1BJT19DTFJfTE9XLAorCVtTVE1QRV9JRFhfR1BDUl9DU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX0NMUl9NSUQsCisJW1NUTVBFX0lEWF9HUENSX01TQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fQ0xSX0hJR0gsCiAJW1NUTVBFX0lEWF9HUERSX0xTQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fU0VUX0RJUl9MT1csCisJW1NUTVBFX0lEWF9HUERSX0NTQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fU0VUX0RJUl9NSUQsCisJW1NUTVBFX0lEWF9HUERSX01TQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fU0VUX0RJUl9ISUdILAogCVtTVE1QRV9JRFhfR1BSRVJfTFNCXQk9IFNUTVBFMTgwMV9SRUdfR1BJT19SRV9MT1csCisJW1NUTVBFX0lEWF9HUFJFUl9DU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX1JFX01JRCwKKwlbU1RNUEVfSURYX0dQUkVSX01TQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fUkVfSElHSCwKIAlbU1RNUEVfSURYX0dQRkVSX0xTQl0JPSBTVE1QRTE4MDFfUkVHX0dQSU9fRkVfTE9XLAorCVtTVE1QRV9JRFhfR1BGRVJfQ1NCXQk9IFNUTVBFMTgwMV9SRUdfR1BJT19GRV9NSUQsCisJW1NUTVBFX0lEWF9HUEZFUl9NU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX0ZFX0hJR0gsCiAJW1NUTVBFX0lEWF9HUFBVUl9MU0JdCT0gU1RNUEUxODAxX1JFR19HUElPX1BVTExfVVBfTE9XLAogCVtTVE1QRV9JRFhfSUVHUElPUl9MU0JdCT0gU1RNUEUxODAxX1JFR19JTlRfRU5fR1BJT19NQVNLX0xPVywKLQlbU1RNUEVfSURYX0lTR1BJT1JfTFNCXQk9IFNUTVBFMTgwMV9SRUdfSU5UX1NUQV9HUElPX0xPVywKKwlbU1RNUEVfSURYX0lFR1BJT1JfQ1NCXQk9IFNUTVBFMTgwMV9SRUdfSU5UX0VOX0dQSU9fTUFTS19NSUQsCisJW1NUTVBFX0lEWF9JRUdQSU9SX01TQl0JPSBTVE1QRTE4MDFfUkVHX0lOVF9FTl9HUElPX01BU0tfSElHSCwKKwlbU1RNUEVfSURYX0lTR1BJT1JfTVNCXQk9IFNUTVBFMTgwMV9SRUdfSU5UX1NUQV9HUElPX0hJR0gsCiB9OwogCiBzdGF0aWMgc3RydWN0IHN0bXBlX3ZhcmlhbnRfYmxvY2sgc3RtcGUxODAxX2Jsb2Nrc1tdID0gewpAQCAtNzUxLDIyICs4MzIsMzEgQEAKIAkJCQllbmFibGUgPyBtYXNrIDogMCk7CiB9CiAKLXN0YXRpYyBpbnQgc3RtcGUxODAxX3Jlc2V0KHN0cnVjdCBzdG1wZSAqc3RtcGUpCitzdGF0aWMgaW50IHN0bXBlX3Jlc2V0KHN0cnVjdCBzdG1wZSAqc3RtcGUpCiB7CisJdTE2IGlkX3ZhbCA9IHN0bXBlLT52YXJpYW50LT5pZF92YWw7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCWludCByZXQgPSAwOworCXU4IHJlc2V0X2JpdDsKIAotCXJldCA9IF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIFNUTVBFMTgwMV9SRUdfU1lTX0NUUkwsCi0JCVNUTVBFMTgwMV9NU0tfU1lTX0NUUkxfUkVTRVQsIFNUTVBFMTgwMV9NU0tfU1lTX0NUUkxfUkVTRVQpOworCWlmIChpZF92YWwgPT0gU1RNUEU4MTFfSUQpCisJCS8qIFNUTVBFODAxIGFuZCBTVE1QRTYxMCB1c2UgYml0IDEgb2YgU1lTX0NUUkwgcmVnaXN0ZXIgKi8KKwkJcmVzZXRfYml0ID0gU1RNUEU4MTFfU1lTX0NUUkxfUkVTRVQ7CisJZWxzZQorCQkvKiBhbGwgb3RoZXIgU1RNUEUgdmFyaWFudCB1c2UgYml0IDcgb2YgU1lTX0NUUkwgcmVnaXN0ZXIgKi8KKwkJcmVzZXRfYml0ID0gU1RNUEVfU1lTX0NUUkxfUkVTRVQ7CisKKwlyZXQgPSBfX3N0bXBlX3NldF9iaXRzKHN0bXBlLCBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfU1lTX0NUUkxdLAorCQkJICAgICAgIHJlc2V0X2JpdCwgcmVzZXRfYml0KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlyZXQgPSBfX3N0bXBlX3JlZ19yZWFkKHN0bXBlLCBTVE1QRTE4MDFfUkVHX1NZU19DVFJMKTsKKwkJcmV0ID0gX19zdG1wZV9yZWdfcmVhZChzdG1wZSwgc3RtcGUtPnJlZ3NbU1RNUEVfSURYX1NZU19DVFJMXSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKLQkJaWYgKCEocmV0ICYgU1RNUEUxODAxX01TS19TWVNfQ1RSTF9SRVNFVCkpCisJCWlmICghKHJldCAmIHJlc2V0X2JpdCkpCiAJCQlyZXR1cm4gMDsKIAkJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKIAl9CkBAIC03OTQsMjAgKzg4NCwzOSBAQAogCiBzdGF0aWMgY29uc3QgdTggc3RtcGUyNHh4X3JlZ3NbXSA9IHsKIAlbU1RNUEVfSURYX0NISVBfSURdCT0gU1RNUEUyNFhYX1JFR19DSElQX0lELAorCVtTVE1QRV9JRFhfU1lTX0NUUkxdCT0gU1RNUEUyNFhYX1JFR19TWVNfQ1RSTCwKKwlbU1RNUEVfSURYX1NZU19DVFJMMl0JPSBTVE1QRTI0WFhfUkVHX1NZU19DVFJMMiwKIAlbU1RNUEVfSURYX0lDUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19JQ1JfTFNCLAorCVtTVE1QRV9JRFhfSUVSX01TQl0JPSBTVE1QRTI0WFhfUkVHX0lFUl9NU0IsCiAJW1NUTVBFX0lEWF9JRVJfTFNCXQk9IFNUTVBFMjRYWF9SRUdfSUVSX0xTQiwKIAlbU1RNUEVfSURYX0lTUl9NU0JdCT0gU1RNUEUyNFhYX1JFR19JU1JfTVNCLAogCVtTVE1QRV9JRFhfR1BNUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19HUE1SX0xTQiwKKwlbU1RNUEVfSURYX0dQTVJfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BNUl9DU0IsCisJW1NUTVBFX0lEWF9HUE1SX01TQl0JPSBTVE1QRTI0WFhfUkVHX0dQTVJfTVNCLAogCVtTVE1QRV9JRFhfR1BTUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19HUFNSX0xTQiwKKwlbU1RNUEVfSURYX0dQU1JfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BTUl9DU0IsCisJW1NUTVBFX0lEWF9HUFNSX01TQl0JPSBTVE1QRTI0WFhfUkVHX0dQU1JfTVNCLAogCVtTVE1QRV9JRFhfR1BDUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19HUENSX0xTQiwKKwlbU1RNUEVfSURYX0dQQ1JfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BDUl9DU0IsCisJW1NUTVBFX0lEWF9HUENSX01TQl0JPSBTVE1QRTI0WFhfUkVHX0dQQ1JfTVNCLAogCVtTVE1QRV9JRFhfR1BEUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19HUERSX0xTQiwKKwlbU1RNUEVfSURYX0dQRFJfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BEUl9DU0IsCisJW1NUTVBFX0lEWF9HUERSX01TQl0JPSBTVE1QRTI0WFhfUkVHX0dQRFJfTVNCLAogCVtTVE1QRV9JRFhfR1BSRVJfTFNCXQk9IFNUTVBFMjRYWF9SRUdfR1BSRVJfTFNCLAorCVtTVE1QRV9JRFhfR1BSRVJfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BSRVJfQ1NCLAorCVtTVE1QRV9JRFhfR1BSRVJfTVNCXQk9IFNUTVBFMjRYWF9SRUdfR1BSRVJfTVNCLAogCVtTVE1QRV9JRFhfR1BGRVJfTFNCXQk9IFNUTVBFMjRYWF9SRUdfR1BGRVJfTFNCLAorCVtTVE1QRV9JRFhfR1BGRVJfQ1NCXQk9IFNUTVBFMjRYWF9SRUdfR1BGRVJfQ1NCLAorCVtTVE1QRV9JRFhfR1BGRVJfTVNCXQk9IFNUTVBFMjRYWF9SRUdfR1BGRVJfTVNCLAogCVtTVE1QRV9JRFhfR1BQVVJfTFNCXQk9IFNUTVBFMjRYWF9SRUdfR1BQVVJfTFNCLAogCVtTVE1QRV9JRFhfR1BQRFJfTFNCXQk9IFNUTVBFMjRYWF9SRUdfR1BQRFJfTFNCLAogCVtTVE1QRV9JRFhfR1BBRlJfVV9NU0JdCT0gU1RNUEUyNFhYX1JFR19HUEFGUl9VX01TQiwKIAlbU1RNUEVfSURYX0lFR1BJT1JfTFNCXQk9IFNUTVBFMjRYWF9SRUdfSUVHUElPUl9MU0IsCisJW1NUTVBFX0lEWF9JRUdQSU9SX0NTQl0JPSBTVE1QRTI0WFhfUkVHX0lFR1BJT1JfQ1NCLAorCVtTVE1QRV9JRFhfSUVHUElPUl9NU0JdCT0gU1RNUEUyNFhYX1JFR19JRUdQSU9SX01TQiwKIAlbU1RNUEVfSURYX0lTR1BJT1JfTVNCXQk9IFNUTVBFMjRYWF9SRUdfSVNHUElPUl9NU0IsCisJW1NUTVBFX0lEWF9HUEVEUl9MU0JdCT0gU1RNUEUyNFhYX1JFR19HUEVEUl9MU0IsCisJW1NUTVBFX0lEWF9HUEVEUl9DU0JdCT0gU1RNUEUyNFhYX1JFR19HUEVEUl9DU0IsCiAJW1NUTVBFX0lEWF9HUEVEUl9NU0JdCT0gU1RNUEUyNFhYX1JFR19HUEVEUl9NU0IsCiB9OwogCkBAIC04NDAsNyArOTQ5LDcgQEAKIAlpZiAoYmxvY2tzICYgU1RNUEVfQkxPQ0tfS0VZUEFEKQogCQltYXNrIHw9IFNUTVBFMjRYWF9TWVNfQ1RSTF9FTkFCTEVfS1BDOwogCi0JcmV0dXJuIF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIFNUTVBFMjRYWF9SRUdfU1lTX0NUUkwsIG1hc2ssCisJcmV0dXJuIF9fc3RtcGVfc2V0X2JpdHMoc3RtcGUsIHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9TWVNfQ1RSTF0sIG1hc2ssCiAJCQkJZW5hYmxlID8gbWFzayA6IDApOwogfQogCkBAIC04OTMsNiArMTAwMiw3IEBACiAJW1NUTVBFNjEwXQk9ICZzdG1wZTYxMCwKIAlbU1RNUEU4MDFdCT0gJnN0bXBlODAxLAogCVtTVE1QRTgxMV0JPSAmc3RtcGU4MTEsCisJW1NUTVBFMTYwMF0JPSAmc3RtcGUxNjAwLAogCVtTVE1QRTE2MDFdCT0gJnN0bXBlMTYwMSwKIAlbU1RNUEUxODAxXQk9ICZzdG1wZTE4MDEsCiAJW1NUTVBFMjQwMV0JPSAmc3RtcGUyNDAxLApAQCAtOTE5LDcgKzEwMjksOCBAQAogCWludCByZXQ7CiAJaW50IGk7CiAKLQlpZiAodmFyaWFudC0+aWRfdmFsID09IFNUTVBFODAxX0lEKSB7CisJaWYgKHZhcmlhbnQtPmlkX3ZhbCA9PSBTVE1QRTgwMV9JRCB8fAorCSAgICB2YXJpYW50LT5pZF92YWwgPT0gU1RNUEUxNjAwX0lEKSB7CiAJCWludCBiYXNlID0gaXJxX2NyZWF0ZV9tYXBwaW5nKHN0bXBlLT5kb21haW4sIDApOwogCiAJCWhhbmRsZV9uZXN0ZWRfaXJxKGJhc2UpOwpAQCAtOTgyLDcgKzEwOTMsNyBAQAogCQkJY29udGludWU7CiAKIAkJc3RtcGUtPm9sZGllcltpXSA9IG5ldzsKLQkJc3RtcGVfcmVnX3dyaXRlKHN0bXBlLCBzdG1wZS0+cmVnc1tTVE1QRV9JRFhfSUVSX0xTQl0gLSBpLCBuZXcpOworCQlzdG1wZV9yZWdfd3JpdGUoc3RtcGUsIHN0bXBlLT5yZWdzW1NUTVBFX0lEWF9JRVJfTFNCICsgaV0sIG5ldyk7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZzdG1wZS0+aXJxX2xvY2spOwpAQCAtMTA4OCwyMCArMTE5OSwxOCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoaWQgPT0gU1RNUEUxODAxX0lEKQl7Ci0JCXJldCA9ICBzdG1wZTE4MDFfcmVzZXQoc3RtcGUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JfQorCXJldCA9ICBzdG1wZV9yZXNldChzdG1wZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlpZiAoc3RtcGUtPmlycSA+PSAwKSB7Ci0JCWlmIChpZCA9PSBTVE1QRTgwMV9JRCkKLQkJCWljciA9IFNUTVBFODAxX1JFR19TWVNfQ1RSTF9JTlRfRU47CisJCWlmIChpZCA9PSBTVE1QRTgwMV9JRCB8fCBpZCA9PSBTVE1QRTE2MDBfSUQpCisJCQlpY3IgPSBTVE1QRV9TWVNfQ1RSTF9JTlRfRU47CiAJCWVsc2UKIAkJCWljciA9IFNUTVBFX0lDUl9MU0JfR0lNOwogCi0JCS8qIFNUTVBFODAxIGRvZXNuJ3Qgc3VwcG9ydCBFZGdlIGludGVycnVwdHMgKi8KLQkJaWYgKGlkICE9IFNUTVBFODAxX0lEKSB7CisJCS8qIFNUTVBFODAxIGFuZCBTVE1QRTE2MDAgZG9uJ3Qgc3VwcG9ydCBFZGdlIGludGVycnVwdHMgKi8KKwkJaWYgKGlkICE9IFNUTVBFODAxX0lEICYmIGlkICE9IFNUTVBFMTYwMF9JRCkgewogCQkJaWYgKGlycV90cmlnZ2VyID09IElSUUZfVFJJR0dFUl9GQUxMSU5HIHx8CiAJCQkJCWlycV90cmlnZ2VyID09IElSUUZfVFJJR0dFUl9SSVNJTkcpCiAJCQkJaWNyIHw9IFNUTVBFX0lDUl9MU0JfRURHRTsKQEAgLTExMDksOCArMTIxOCw4IEBACiAKIAkJaWYgKGlycV90cmlnZ2VyID09IElSUUZfVFJJR0dFUl9SSVNJTkcgfHwKIAkJCQlpcnFfdHJpZ2dlciA9PSBJUlFGX1RSSUdHRVJfSElHSCkgewotCQkJaWYgKGlkID09IFNUTVBFODAxX0lEKQotCQkJCWljciB8PSBTVE1QRTgwMV9SRUdfU1lTX0NUUkxfSU5UX0hJOworCQkJaWYgKGlkID09IFNUTVBFODAxX0lEIHx8IGlkID09IFNUTVBFMTYwMF9JRCkKKwkJCQlpY3IgfD0gU1RNUEVfU1lTX0NUUkxfSU5UX0hJOwogCQkJZWxzZQogCQkJCWljciB8PSBTVE1QRV9JQ1JfTFNCX0hJR0g7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3N0bXBlLmggYi9kcml2ZXJzL21mZC9zdG1wZS5oCmluZGV4IDg0YWRiNDYuLmY3ZWZkZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3N0bXBlLmgKKysrIGIvZHJpdmVycy9tZmQvc3RtcGUuaApAQCAtMTA0LDYgKzEwNCwxMCBAQAogI2RlZmluZSBTVE1QRV9JQ1JfTFNCX0VER0UJKDEgPDwgMSkKICNkZWZpbmUgU1RNUEVfSUNSX0xTQl9HSU0JKDEgPDwgMCkKIAorI2RlZmluZSBTVE1QRV9TWVNfQ1RSTF9SRVNFVAkoMSA8PCA3KQorI2RlZmluZSBTVE1QRV9TWVNfQ1RSTF9JTlRfRU4JKDEgPDwgMikKKyNkZWZpbmUgU1RNUEVfU1lTX0NUUkxfSU5UX0hJCSgxIDw8IDApCisKIC8qCiAgKiBTVE1QRTgwMQogICovCkBAIC0xMTksMTMgKzEyMywxMCBAQAogI2RlZmluZSBTVE1QRTgwMV9SRUdfR1BJT19TRVRfUElOCTB4MTEKICNkZWZpbmUgU1RNUEU4MDFfUkVHX0dQSU9fRElSCQkweDEyCiAKLSNkZWZpbmUgU1RNUEU4MDFfUkVHX1NZU19DVFJMX1JFU0VUCSgxIDw8IDcpCi0jZGVmaW5lIFNUTVBFODAxX1JFR19TWVNfQ1RSTF9JTlRfRU4JKDEgPDwgMikKLSNkZWZpbmUgU1RNUEU4MDFfUkVHX1NZU19DVFJMX0lOVF9ISQkoMSA8PCAwKQotCiAvKgogICogU1RNUEU4MTEKICAqLworI2RlZmluZSBTVE1QRTgxMV9JRAkJCTB4MDgxMQogCiAjZGVmaW5lIFNUTVBFODExX0lSUV9UT1VDSF9ERVQJCTAKICNkZWZpbmUgU1RNUEU4MTFfSVJRX0ZJRk9fVEgJCTEKQEAgLTEzOCw2ICsxMzksNyBAQAogI2RlZmluZSBTVE1QRTgxMV9OUl9JTlRFUk5BTF9JUlFTCTgKIAogI2RlZmluZSBTVE1QRTgxMV9SRUdfQ0hJUF9JRAkJMHgwMAorI2RlZmluZSBTVE1QRTgxMV9SRUdfU1lTX0NUUkwJCTB4MDMKICNkZWZpbmUgU1RNUEU4MTFfUkVHX1NZU19DVFJMMgkJMHgwNAogI2RlZmluZSBTVE1QRTgxMV9SRUdfU1BJX0NGRwkJMHgwOAogI2RlZmluZSBTVE1QRTgxMV9SRUdfSU5UX0NUUkwJCTB4MDkKQEAgLTE1NCwxMiArMTU2LDM1IEBACiAjZGVmaW5lIFNUTVBFODExX1JFR19HUElPX0ZFCQkweDE2CiAjZGVmaW5lIFNUTVBFODExX1JFR19HUElPX0FGCQkweDE3CiAKKyNkZWZpbmUgU1RNUEU4MTFfU1lTX0NUUkxfUkVTRVQJCSgxIDw8IDEpCisKICNkZWZpbmUgU1RNUEU4MTFfU1lTX0NUUkwyX0FEQ19PRkYJKDEgPDwgMCkKICNkZWZpbmUgU1RNUEU4MTFfU1lTX0NUUkwyX1RTQ19PRkYJKDEgPDwgMSkKICNkZWZpbmUgU1RNUEU4MTFfU1lTX0NUUkwyX0dQSU9fT0ZGCSgxIDw8IDIpCiAjZGVmaW5lIFNUTVBFODExX1NZU19DVFJMMl9UU19PRkYJKDEgPDwgMykKIAogLyoKKyAqIFNUTVBFMTYwMAorICovCisjZGVmaW5lIFNUTVBFMTYwMF9JRAkJCTB4MDAxNgorI2RlZmluZSBTVE1QRTE2MDBfTlJfSU5URVJOQUxfSVJRUwkxNgorCisjZGVmaW5lIFNUTVBFMTYwMF9SRUdfQ0hJUF9JRAkJMHgwMAorI2RlZmluZSBTVE1QRTE2MDBfUkVHX1NZU19DVFJMCQkweDAzCisjZGVmaW5lIFNUTVBFMTYwMF9SRUdfSUVHUElPUl9MU0IJMHgwOAorI2RlZmluZSBTVE1QRTE2MDBfUkVHX0lFR1BJT1JfTVNCCTB4MDkKKyNkZWZpbmUgU1RNUEUxNjAwX1JFR19JU0dQSU9SX0xTQgkweDBBCisjZGVmaW5lIFNUTVBFMTYwMF9SRUdfSVNHUElPUl9NU0IJMHgwQgorI2RlZmluZSBTVE1QRTE2MDBfUkVHX0dQTVJfTFNCCQkweDEwCisjZGVmaW5lIFNUTVBFMTYwMF9SRUdfR1BNUl9NU0IJCTB4MTEKKyNkZWZpbmUgU1RNUEUxNjAwX1JFR19HUFNSX0xTQgkJMHgxMgorI2RlZmluZSBTVE1QRTE2MDBfUkVHX0dQU1JfTVNCCQkweDEzCisjZGVmaW5lIFNUTVBFMTYwMF9SRUdfR1BEUl9MU0IJCTB4MTQKKyNkZWZpbmUgU1RNUEUxNjAwX1JFR19HUERSX01TQgkJMHgxNQorI2RlZmluZSBTVE1QRTE2MDBfUkVHX0dQUElSX0xTQgkJMHgxNgorI2RlZmluZSBTVE1QRTE2MDBfUkVHX0dQUElSX01TQgkJMHgxNworCisvKgogICogU1RNUEUxNjAxCiAgKi8KIApAQCAtMTc1LDE5ICsyMDAsMzIgQEAKIAogI2RlZmluZSBTVE1QRTE2MDFfUkVHX1NZU19DVFJMCQkJMHgwMgogI2RlZmluZSBTVE1QRTE2MDFfUkVHX1NZU19DVFJMMgkJCTB4MDMKKyNkZWZpbmUgU1RNUEUxNjAxX1JFR19JQ1JfTVNCCQkJMHgxMAogI2RlZmluZSBTVE1QRTE2MDFfUkVHX0lDUl9MU0IJCQkweDExCisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfSUVSX01TQgkJCTB4MTIKICNkZWZpbmUgU1RNUEUxNjAxX1JFR19JRVJfTFNCCQkJMHgxMwogI2RlZmluZSBTVE1QRTE2MDFfUkVHX0lTUl9NU0IJCQkweDE0Ci0jZGVmaW5lIFNUTVBFMTYwMV9SRUdfQ0hJUF9JRAkJCTB4ODAKKyNkZWZpbmUgU1RNUEUxNjAxX1JFR19JU1JfTFNCCQkJMHgxNQorI2RlZmluZSBTVE1QRTE2MDFfUkVHX0lOVF9FTl9HUElPX01BU0tfTVNCCTB4MTYKICNkZWZpbmUgU1RNUEUxNjAxX1JFR19JTlRfRU5fR1BJT19NQVNLX0xTQgkweDE3CiAjZGVmaW5lIFNUTVBFMTYwMV9SRUdfSU5UX1NUQV9HUElPX01TQgkJMHgxOAotI2RlZmluZSBTVE1QRTE2MDFfUkVHX0dQSU9fTVBfTFNCCQkweDg3CisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfSU5UX1NUQV9HUElPX0xTQgkJMHgxOQorI2RlZmluZSBTVE1QRTE2MDFfUkVHX0NISVBfSUQJCQkweDgwCisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19TRVRfTVNCCQkweDgyCiAjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19TRVRfTFNCCQkweDgzCisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19DTFJfTVNCCQkweDg0CiAjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19DTFJfTFNCCQkweDg1CisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19NUF9NU0IJCTB4ODYKKyNkZWZpbmUgU1RNUEUxNjAxX1JFR19HUElPX01QX0xTQgkJMHg4NworI2RlZmluZSBTVE1QRTE2MDFfUkVHX0dQSU9fU0VUX0RJUl9NU0IJCTB4ODgKICNkZWZpbmUgU1RNUEUxNjAxX1JFR19HUElPX1NFVF9ESVJfTFNCCQkweDg5CiAjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19FRF9NU0IJCTB4OEEKKyNkZWZpbmUgU1RNUEUxNjAxX1JFR19HUElPX0VEX0xTQgkJMHg4QgorI2RlZmluZSBTVE1QRTE2MDFfUkVHX0dQSU9fUkVfTVNCCQkweDhDCiAjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19SRV9MU0IJCTB4OEQKKyNkZWZpbmUgU1RNUEUxNjAxX1JFR19HUElPX0ZFX01TQgkJMHg4RQogI2RlZmluZSBTVE1QRTE2MDFfUkVHX0dQSU9fRkVfTFNCCQkweDhGCisjZGVmaW5lIFNUTVBFMTYwMV9SRUdfR1BJT19QVV9NU0IJCTB4OTAKICNkZWZpbmUgU1RNUEUxNjAxX1JFR19HUElPX1BVX0xTQgkJMHg5MQogI2RlZmluZSBTVE1QRTE2MDFfUkVHX0dQSU9fQUZfVV9NU0IJCTB4OTIKIApAQCAtMjQzLDggKzI4MSw2IEBACiAjZGVmaW5lIFNUTVBFMTgwMV9SRUdfR1BJT19QVUxMX1VQX01JRAkJMHgyMwogI2RlZmluZSBTVE1QRTE4MDFfUkVHX0dQSU9fUFVMTF9VUF9ISUdICQkweDI0CiAKLSNkZWZpbmUgU1RNUEUxODAxX01TS19TWVNfQ1RSTF9SRVNFVAkJKDEgPDwgNykKLQogI2RlZmluZSBTVE1QRTE4MDFfTVNLX0lOVF9FTl9LUEMJCSgxIDw8IDEpCiAjZGVmaW5lIFNUTVBFMTgwMV9NU0tfSU5UX0VOX0dQSU8JCSgxIDw8IDMpCiAKQEAgLTI2NCwyMyArMzAwLDQ4IEBACiAjZGVmaW5lIFNUTVBFMjRYWF9OUl9JTlRFUk5BTF9JUlFTCTkKIAogI2RlZmluZSBTVE1QRTI0WFhfUkVHX1NZU19DVFJMCQkweDAyCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfU1lTX0NUUkwyCQkweDAzCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfSUNSX01TQgkJMHgxMAogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0lDUl9MU0IJCTB4MTEKKyNkZWZpbmUgU1RNUEUyNFhYX1JFR19JRVJfTVNCCQkweDEyCiAjZGVmaW5lIFNUTVBFMjRYWF9SRUdfSUVSX0xTQgkJMHgxMwogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0lTUl9NU0IJCTB4MTQKLSNkZWZpbmUgU1RNUEUyNFhYX1JFR19DSElQX0lECQkweDgwCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfSVNSX0xTQgkJMHgxNQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0lFR1BJT1JfTVNCCTB4MTYKKyNkZWZpbmUgU1RNUEUyNFhYX1JFR19JRUdQSU9SX0NTQgkweDE3CiAjZGVmaW5lIFNUTVBFMjRYWF9SRUdfSUVHUElPUl9MU0IJMHgxOAogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0lTR1BJT1JfTVNCCTB4MTkKLSNkZWZpbmUgU1RNUEUyNFhYX1JFR19HUE1SX0xTQgkJMHhBNAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0lTR1BJT1JfQ1NCCTB4MUEKKyNkZWZpbmUgU1RNUEUyNFhYX1JFR19JU0dQSU9SX0xTQgkweDFCCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfQ0hJUF9JRAkJMHg4MAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQU1JfTVNCCQkweDgzCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfR1BTUl9DU0IJCTB4ODQKICNkZWZpbmUgU1RNUEUyNFhYX1JFR19HUFNSX0xTQgkJMHg4NQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQQ1JfTVNCCQkweDg2CisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfR1BDUl9DU0IJCTB4ODcKICNkZWZpbmUgU1RNUEUyNFhYX1JFR19HUENSX0xTQgkJMHg4OAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRFJfTVNCCQkweDg5CisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfR1BEUl9DU0IJCTB4OEEKICNkZWZpbmUgU1RNUEUyNFhYX1JFR19HUERSX0xTQgkJMHg4QgogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRURSX01TQgkJMHg4QworI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRURSX0NTQgkJMHg4RAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRURSX0xTQgkJMHg4RQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUkVSX01TQgkJMHg4RgorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUkVSX0NTQgkJMHg5MAogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUkVSX0xTQgkJMHg5MQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRkVSX01TQgkJMHg5MgorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRkVSX0NTQgkJMHg5MwogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQRkVSX0xTQgkJMHg5NAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUFVSX01TQgkJMHg5NQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUFVSX0NTQgkJMHg5NgogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUFVSX0xTQgkJMHg5NwotI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUERSX0xTQgkJMHg5YQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUERSX01TQgkJMHg5OAorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUERSX0NTQgkJMHg5OQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQUERSX0xTQgkJMHg5QQogI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQQUZSX1VfTVNCCTB4OUIKLQorI2RlZmluZSBTVE1QRTI0WFhfUkVHX0dQTVJfTVNCCQkweEEyCisjZGVmaW5lIFNUTVBFMjRYWF9SRUdfR1BNUl9DU0IJCTB4QTMKKyNkZWZpbmUgU1RNUEUyNFhYX1JFR19HUE1SX0xTQgkJMHhBNAogI2RlZmluZSBTVE1QRTI0WFhfU1lTX0NUUkxfRU5BQkxFX0dQSU8JCSgxIDw8IDMpCiAjZGVmaW5lIFNUTVBFMjRYWF9TWVNDT05fRU5BQkxFX1BXTQkJKDEgPDwgMikKICNkZWZpbmUgU1RNUEUyNFhYX1NZU19DVFJMX0VOQUJMRV9LUEMJCSgxIDw8IDEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9zdW42aS1wcmNtLmMgYi9kcml2ZXJzL21mZC9zdW42aS1wcmNtLmMKaW5kZXggMTkxMTczMS4uMDExZmNjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvc3VuNmktcHJjbS5jCisrKyBiL2RyaXZlcnMvbWZkL3N1bjZpLXByY20uYwpAQCAtOSw3ICs5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogc3RydWN0IHByY21fZGF0YSB7CkBAIC0xNzAsOCArMTcwLDQgQEAKIAl9LAogCS5wcm9iZSA9IHN1bjZpX3ByY21fcHJvYmUsCiB9OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdW42aV9wcmNtX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIkJvcmlzIEJSRVpJTExPTiA8Ym9yaXMuYnJlemlsbG9uQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQWxsd2lubmVyIHN1bjZpIFBSQ00gZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihzdW42aV9wcmNtX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTIxNy5jIGIvZHJpdmVycy9tZmQvdHBzNjUyMTcuYwppbmRleCAwNDlhNmZjLi45YTRkODY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90cHM2NTIxNy5jCisrKyBiL2RyaXZlcnMvbWZkL3RwczY1MjE3LmMKQEAgLTE1LDIyICsxNSwxMDMgQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjUyMTcuaD4KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBtZmRfY2VsbCB0cHM2NTIxN3NbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2hhcmdlcl9yZXNvdXJjZXNbXSA9IHsKKwlERUZJTkVfUkVTX0lSUV9OQU1FRChUUFM2NTIxN19JUlFfQUMsICJBQyIpLAorCURFRklORV9SRVNfSVJRX05BTUVEKFRQUzY1MjE3X0lSUV9VU0IsICJVU0IiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcGJfcmVzb3VyY2VzW10gPSB7CisJREVGSU5FX1JFU19JUlFfTkFNRUQoVFBTNjUyMTdfSVJRX1BCLCAiUEIiKSwKK307CisKK3N0cnVjdCB0cHM2NTIxN19pcnEgeworCWludCBtYXNrOworCWludCBpbnRlcnJ1cHQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRwczY1MjE3X2lycSB0cHM2NTIxN19pcnFzW10gPSB7CisJW1RQUzY1MjE3X0lSUV9QQl0gPSB7CisJCS5tYXNrID0gVFBTNjUyMTdfSU5UX1BCTSwKKwkJLmludGVycnVwdCA9IFRQUzY1MjE3X0lOVF9QQkksCisJfSwKKwlbVFBTNjUyMTdfSVJRX0FDXSA9IHsKKwkJLm1hc2sgPSBUUFM2NTIxN19JTlRfQUNNLAorCQkuaW50ZXJydXB0ID0gVFBTNjUyMTdfSU5UX0FDSSwKKwl9LAorCVtUUFM2NTIxN19JUlFfVVNCXSA9IHsKKwkJLm1hc2sgPSBUUFM2NTIxN19JTlRfVVNCTSwKKwkJLmludGVycnVwdCA9IFRQUzY1MjE3X0lOVF9VU0JJLAorCX0sCit9OworCitzdGF0aWMgdm9pZCB0cHM2NTIxN19pcnFfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHRwczY1MjE3ICp0cHMgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKworCW11dGV4X2xvY2soJnRwcy0+aXJxX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB0cHM2NTIxN19pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCB0cHM2NTIxNyAqdHBzID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJaW50IHJldDsKKworCXJldCA9IHRwczY1MjE3X3JlZ193cml0ZSh0cHMsIFRQUzY1MjE3X1JFR19JTlQsIHRwcy0+aXJxX21hc2ssCisJCQkJVFBTNjUyMTdfUFJPVEVDVF9OT05FKTsKKwlpZiAocmV0ICE9IDApCisJCWRldl9lcnIodHBzLT5kZXYsICJGYWlsZWQgdG8gc3luYyBJUlEgbWFza3NcbiIpOworCisJbXV0ZXhfdW5sb2NrKCZ0cHMtPmlycV9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgdHBzNjUyMTdfaXJxICoKK2lycV90b190cHM2NTIxN19pcnEoc3RydWN0IHRwczY1MjE3ICp0cHMsIHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gJnRwczY1MjE3X2lycXNbZGF0YS0+aHdpcnFdOworfQorCitzdGF0aWMgdm9pZCB0cHM2NTIxN19pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgdHBzNjUyMTcgKnRwcyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCWNvbnN0IHN0cnVjdCB0cHM2NTIxN19pcnEgKmlycV9kYXRhID0gaXJxX3RvX3RwczY1MjE3X2lycSh0cHMsIGRhdGEpOworCisJdHBzLT5pcnFfbWFzayAmPSB+aXJxX2RhdGEtPm1hc2s7Cit9CisKK3N0YXRpYyB2b2lkIHRwczY1MjE3X2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgdHBzNjUyMTcgKnRwcyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCWNvbnN0IHN0cnVjdCB0cHM2NTIxN19pcnEgKmlycV9kYXRhID0gaXJxX3RvX3RwczY1MjE3X2lycSh0cHMsIGRhdGEpOworCisJdHBzLT5pcnFfbWFzayB8PSBpcnFfZGF0YS0+bWFzazsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB0cHM2NTIxN19pcnFfY2hpcCA9IHsKKwkuaXJxX2J1c19sb2NrCQk9IHRwczY1MjE3X2lycV9sb2NrLAorCS5pcnFfYnVzX3N5bmNfdW5sb2NrCT0gdHBzNjUyMTdfaXJxX3N5bmNfdW5sb2NrLAorCS5pcnFfZW5hYmxlCQk9IHRwczY1MjE3X2lycV9lbmFibGUsCisJLmlycV9kaXNhYmxlCQk9IHRwczY1MjE3X2lycV9kaXNhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCBtZmRfY2VsbCB0cHM2NTIxN3NbXSA9IHsKIAl7CiAJCS5uYW1lID0gInRwczY1MjE3LXBtaWMiLAogCQkub2ZfY29tcGF0aWJsZSA9ICJ0aSx0cHM2NTIxNy1wbWljIiwKQEAgLTQxLDEwICsxMjIsOTYgQEAKIAl9LAogCXsKIAkJLm5hbWUgPSAidHBzNjUyMTctY2hhcmdlciIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShjaGFyZ2VyX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBjaGFyZ2VyX3Jlc291cmNlcywKIAkJLm9mX2NvbXBhdGlibGUgPSAidGksdHBzNjUyMTctY2hhcmdlciIsCiAJfSwKKwl7CisJCS5uYW1lID0gInRwczY1MjE3LXB3cmJ1dHRvbiIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShwYl9yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gcGJfcmVzb3VyY2VzLAorCQkub2ZfY29tcGF0aWJsZSA9ICJ0aSx0cHM2NTIxNy1wd3JidXR0b24iLAorCX0sCiB9OwogCitzdGF0aWMgaXJxcmV0dXJuX3QgdHBzNjUyMTdfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB0cHM2NTIxNyAqdHBzID0gZGF0YTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCWJvb2wgaGFuZGxlZCA9IGZhbHNlOworCWludCBpOworCWludCByZXQ7CisKKwlyZXQgPSB0cHM2NTIxN19yZWdfcmVhZCh0cHMsIFRQUzY1MjE3X1JFR19JTlQsICZzdGF0dXMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIodHBzLT5kZXYsICJGYWlsZWQgdG8gcmVhZCBJUlEgc3RhdHVzOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0cHM2NTIxN19pcnFzKTsgaSsrKSB7CisJCWlmIChzdGF0dXMgJiB0cHM2NTIxN19pcnFzW2ldLmludGVycnVwdCkgeworCQkJaGFuZGxlX25lc3RlZF9pcnEoaXJxX2ZpbmRfbWFwcGluZyh0cHMtPmlycV9kb21haW4sIGkpKTsKKwkJCWhhbmRsZWQgPSB0cnVlOworCQl9CisJfQorCisJaWYgKGhhbmRsZWQpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIGludCB0cHM2NTIxN19pcnFfbWFwKHN0cnVjdCBpcnFfZG9tYWluICpoLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCWlycV9od19udW1iZXJfdCBodykKK3sKKwlzdHJ1Y3QgdHBzNjUyMTcgKnRwcyA9IGgtPmhvc3RfZGF0YTsKKworCWlycV9zZXRfY2hpcF9kYXRhKHZpcnEsIHRwcyk7CisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZ0cHM2NTIxN19pcnFfY2hpcCwgaGFuZGxlX2VkZ2VfaXJxKTsKKwlpcnFfc2V0X25lc3RlZF90aHJlYWQodmlycSwgMSk7CisJaXJxX3NldF9wYXJlbnQodmlycSwgdHBzLT5pcnEpOworCWlycV9zZXRfbm9wcm9iZSh2aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIHRwczY1MjE3X2lycV9kb21haW5fb3BzID0geworCS5tYXAgPSB0cHM2NTIxN19pcnFfbWFwLAorfTsKKworc3RhdGljIGludCB0cHM2NTIxN19pcnFfaW5pdChzdHJ1Y3QgdHBzNjUyMTcgKnRwcywgaW50IGlycSkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfaW5pdCgmdHBzLT5pcnFfbG9jayk7CisJdHBzLT5pcnEgPSBpcnE7CisKKwkvKiBNYXNrIGFsbCBpbnRlcnJ1cHQgc291cmNlcyAqLworCXRwcy0+aXJxX21hc2sgPSAoVFBTNjUyMTdfSU5UX1JFU0VSVkVETSB8IFRQUzY1MjE3X0lOVF9QQk0KKwkJCXwgVFBTNjUyMTdfSU5UX0FDTSB8IFRQUzY1MjE3X0lOVF9VU0JNKTsKKwl0cHM2NTIxN19yZWdfd3JpdGUodHBzLCBUUFM2NTIxN19SRUdfSU5ULCB0cHMtPmlycV9tYXNrLAorCQkJVFBTNjUyMTdfUFJPVEVDVF9OT05FKTsKKworCXRwcy0+aXJxX2RvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcih0cHMtPmRldi0+b2Zfbm9kZSwKKwkJVFBTNjUyMTdfTlVNX0lSUSwgJnRwczY1MjE3X2lycV9kb21haW5fb3BzLCB0cHMpOworCWlmICghdHBzLT5pcnFfZG9tYWluKSB7CisJCWRldl9lcnIodHBzLT5kZXYsICJDb3VsZCBub3QgY3JlYXRlIElSUSBkb21haW5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKHRwcy0+ZGV2LCBpcnEsIE5VTEwsCisJCQkJCXRwczY1MjE3X2lycV90aHJlYWQsIElSUUZfT05FU0hPVCwKKwkJCQkJInRwczY1MjE3LWlycSIsIHRwcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHRwcy0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJRICVkOiAlZFxuIiwKKwkJCWlycSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiB0cHM2NTIxN19yZWdfcmVhZDogUmVhZCBhIHNpbmdsZSB0cHM2NTIxNyByZWdpc3Rlci4KICAqCkBAIC0xNDksMTEgKzMxNiwyMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodHBzNjUyMTdfY2xlYXJfYml0cyk7CiAKK3N0YXRpYyBib29sIHRwczY1MjE3X3ZvbGF0aWxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFRQUzY1MjE3X1JFR19JTlQ6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB0cHM2NTIxN19yZWdtYXBfY29uZmlnID0gewogCS5yZWdfYml0cyA9IDgsCiAJLnZhbF9iaXRzID0gOCwKIAogCS5tYXhfcmVnaXN0ZXIgPSBUUFM2NTIxN19SRUdfTUFYLAorCS52b2xhdGlsZV9yZWcgPSB0cHM2NTIxN192b2xhdGlsZV9yZWcsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0cHM2NTIxN19vZl9tYXRjaFtdID0gewpAQCAtMjA1LDggKzM4MywxOSBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCWlmIChjbGllbnQtPmlycSkgeworCQl0cHM2NTIxN19pcnFfaW5pdCh0cHMsIGNsaWVudC0+aXJxKTsKKwl9IGVsc2UgeworCQlpbnQgaTsKKworCQkvKiBEb24ndCB0ZWxsIGNoaWxkcmVuIGFib3V0IElSUSByZXNvdXJjZXMgd2hpY2ggd29uJ3QgZmlyZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0cHM2NTIxN3MpOyBpKyspCisJCQl0cHM2NTIxN3NbaV0ubnVtX3Jlc291cmNlcyA9IDA7CisJfQorCiAJcmV0ID0gZGV2bV9tZmRfYWRkX2RldmljZXModHBzLT5kZXYsIC0xLCB0cHM2NTIxN3MsCi0JCQkJICAgQVJSQVlfU0laRSh0cHM2NTIxN3MpLCBOVUxMLCAwLCBOVUxMKTsKKwkJCQkgICBBUlJBWV9TSVpFKHRwczY1MjE3cyksIE5VTEwsIDAsCisJCQkJICAgdHBzLT5pcnFfZG9tYWluKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHRwcy0+ZGV2LCAibWZkX2FkZF9kZXZpY2VzIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTIxOC5jIGIvZHJpdmVycy9tZmQvdHBzNjUyMTguYwppbmRleCA4MGI5ZGMzLi5iYTYxMGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90cHM2NTIxOC5jCisrKyBiL2RyaXZlcnMvbWZkL3RwczY1MjE4LmMKQEAgLTIxOSw2ICsyMTksNyBAQAogCXN0cnVjdCB0cHM2NTIxOCAqdHBzOwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCWludCByZXQ7CisJdW5zaWduZWQgaW50IGNoaXBpZDsKIAogCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX3RwczY1MjE4X21hdGNoX3RhYmxlLCAmY2xpZW50LT5kZXYpOwogCWlmICghbWF0Y2gpIHsKQEAgLTI1MCw2ICsyNTEsMTQgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAorCXJldCA9IHRwczY1MjE4X3JlZ19yZWFkKHRwcywgVFBTNjUyMThfUkVHX0NISVBJRCwgJmNoaXBpZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHRwcy0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgY2hpcGlkOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0cHMtPnJldiA9IGNoaXBpZCAmIFRQUzY1MjE4X0NISVBJRF9SRVZfTUFTSzsKKwogCXJldCA9IG9mX3BsYXRmb3JtX3BvcHVsYXRlKGNsaWVudC0+ZGV2Lm9mX25vZGUsIE5VTEwsIE5VTEwsCiAJCQkJICAgJmNsaWVudC0+ZGV2KTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMgYi9kcml2ZXJzL21mZC90d2wtY29yZS5jCmluZGV4IGE0OWQzZGIuLmM2NDYxNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsLWNvcmUuYwpAQCAtMzAsNyArMzAsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CkBAIC0xMjU4LDcgKzEyNTcsNiBAQAogCXsgInR3bDYwMzIiLCBUV0w2MDMwX0NMQVNTIHwgVFdMNjAzMl9TVUJDTEFTUyB9LCAvKiAiUGhvZW5peCBsaXRlIiAqLwogCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdHdsX2lkcyk7CiAKIC8qIE9uZSBDbGllbnQgRHJpdmVyICwgNCBDbGllbnRzICovCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdHdsX2RyaXZlciA9IHsKQEAgLTEyNjcsOSArMTI2NSw0IEBACiAJLnByb2JlCQk9IHR3bF9wcm9iZSwKIAkucmVtb3ZlCQk9IHR3bF9yZW1vdmUsCiB9OwotCi1tb2R1bGVfaTJjX2RyaXZlcih0d2xfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSTJDIENvcmUgaW50ZXJmYWNlIGZvciBUV0wiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK2J1aWx0aW5faTJjX2RyaXZlcih0d2xfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDYwNDAuYyBiL2RyaXZlcnMvbWZkL3R3bDYwNDAuYwppbmRleCBhYjMyOGVjLi5kNjY1MDJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90d2w2MDQwLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNjA0MC5jCkBAIC02MDksNiArNjA5LDcgQEAKIAkud3JpdGVhYmxlX3JlZyA9IHR3bDYwNDBfd3JpdGVhYmxlX3JlZywKIAogCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS51c2Vfc2luZ2xlX3J3ID0gdHJ1ZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2lycSB0d2w2MDQwX2lycXNbXSA9IHsKQEAgLTc4Miw2ICs3ODMsMTEgQEAKIAljZWxsLT5uYW1lID0gInR3bDYwNDAtZ3BvIjsKIAljaGlsZHJlbisrOwogCisJLyogUERNIGNsb2NrIHN1cHBvcnQgICovCisJY2VsbCA9ICZ0d2w2MDQwLT5jZWxsc1tjaGlsZHJlbl07CisJY2VsbC0+bmFtZSA9ICJ0d2w2MDQwLXBkbWNsayI7CisJY2hpbGRyZW4rKzsKKwogCS8qIFRoZSBjaGlwIGlzIHBvd2VyZWQgZG93biBzbyBtYXJrIHJlZ21hcCB0byBjYWNoZSBvbmx5IGFuZCBkaXJ0eSAqLwogCXJlZ2NhY2hlX2NhY2hlX29ubHkodHdsNjA0MC0+cmVnbWFwLCB0cnVlKTsKIAlyZWdjYWNoZV9tYXJrX2RpcnR5KHR3bDYwNDAtPnJlZ21hcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC91Y2IxeDAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCmluZGV4IDlhYjllYzQuLmQ2ZmIyZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL3VjYjF4MDAtY29yZS5jCkBAIC00NDYsMTAgKzQ0Niw2IEBACiAJdW5zaWduZWQgbG9uZyBtYXNrOwogCiAJbWFzayA9IHByb2JlX2lycV9vbigpOwotCWlmICghbWFzaykgewotCQlwcm9iZV9pcnFfb2ZmKG1hc2spOwotCQlyZXR1cm4gTk9fSVJROwotCX0KIAogCS8qCiAJICogRW5hYmxlIHRoZSBBREMgaW50ZXJydXB0LgpAQCAtNTQxLDcgKzUzNyw3IEBACiAJdWNiMXgwMF9lbmFibGUodWNiKTsKIAl1Y2ItPmlycSA9IHVjYjF4MDBfZGV0ZWN0X2lycSh1Y2IpOwogCXVjYjF4MDBfZGlzYWJsZSh1Y2IpOwotCWlmICh1Y2ItPmlycSA9PSBOT19JUlEpIHsKKwlpZiAoIXVjYi0+aXJxKSB7CiAJCWRldl9lcnIoJnVjYi0+ZGV2LCAiSVJRIHByb2JlIGZhaWxlZFxuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX25vX2lycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggYTIxNmI0Ni4uNjQ5NzFiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTM0NSwxNiArMzQ1LDYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHRzbDI1NTAuCiAKLWNvbmZpZyBTRU5TT1JTX0JIMTc4MAotCXRyaXN0YXRlICJST0hNIEJIMTc4MEdMSSBhbWJpZW50IGxpZ2h0IHNlbnNvciIKLQlkZXBlbmRzIG9uIEkyQyAmJiBTWVNGUwotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgUk9ITSBCSDE3ODBHTEkKLQkgIGFtYmllbnQgbGlnaHQgc2Vuc29yLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCi0JICB3aWxsIGJlIGNhbGxlZCBiaDE3ODBnbGkuCi0KIGNvbmZpZyBTRU5TT1JTX0JIMTc3MAogICAgICAgICAgdHJpc3RhdGUgIkJIMTc3MEdMQyAvIFNGSDc3NzAgY29tYmluZWQgQUxTIC0gUHJveGltaXR5IHNlbnNvciIKICAgICAgICAgIGRlcGVuZHMgb24gSTJDCkBAIC00MzksMzQgKzQyOSw2IEBACiAJICBsaW5lIGFuZCB0aGUgTGludXggdmVyc2lvbiBvbiB0aGUgc2Vjb25kIGxpbmUsIGJ1dCB0aGF0J3MKIAkgIHN0aWxsIHVzZWZ1bC4KIAotY29uZmlnIEJNUDA4NQotCXRyaXN0YXRlCi0JZGVwZW5kcyBvbiBTWVNGUwotCi1jb25maWcgQk1QMDg1X0kyQwotCXRyaXN0YXRlICJCTVAwODUgZGlnaXRhbCBwcmVzc3VyZSBzZW5zb3Igb24gSTJDIgotCXNlbGVjdCBCTVAwODUKLQlzZWxlY3QgUkVHTUFQX0kyQwotCWRlcGVuZHMgb24gSTJDICYmIFNZU0ZTCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IEJvc2NoIFNlbnNvcnRlYydzIGRpZ2l0YWwgcHJlc3N1cmUKLQkgIHNlbnNvciBob29rZWQgdG8gYW4gSTJDIGJ1cy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYm1wMDg1LWkyYy4KLQotY29uZmlnIEJNUDA4NV9TUEkKLQl0cmlzdGF0ZSAiQk1QMDg1IGRpZ2l0YWwgcHJlc3N1cmUgc2Vuc29yIG9uIFNQSSIKLQlzZWxlY3QgQk1QMDg1Ci0Jc2VsZWN0IFJFR01BUF9TUEkKLQlkZXBlbmRzIG9uIFNQSV9NQVNURVIgJiYgU1lTRlMKLQloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgQm9zY2ggU2Vuc29ydGVjJ3MgZGlnaXRhbCBwcmVzc3VyZQotCSAgc2Vuc29yIGhvb2tlZCB0byBhbiBTUEkgYnVzLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBibXAwODUtc3BpLgotCiBjb25maWcgUENIX1BIVUIKIAl0cmlzdGF0ZSAiSW50ZWwgRUcyMFQgUENIL0xBUElTIFNlbWljb24gSU9IKE1MNzIxMy9NTDcyMjMvTUw3ODMxKSBQSFVCIgogCXNlbGVjdCBHRU5FUklDX05FVF9VVElMUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL01ha2VmaWxlIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCmluZGV4IDc0MTBjNmQuLjMxOTgzMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21pc2MvTWFrZWZpbGUKQEAgLTksOSArOSw2IEBACiBvYmotJChDT05GSUdfSU5URUxfTUlEX1BUSSkJKz0gcHRpLm8KIG9iai0kKENPTkZJR19BVE1FTF9TU0MpCQkrPSBhdG1lbC1zc2Mubwogb2JqLSQoQ09ORklHX0FUTUVMX1RDTElCKQkrPSBhdG1lbF90Y2xpYi5vCi1vYmotJChDT05GSUdfQk1QMDg1KQkJKz0gYm1wMDg1Lm8KLW9iai0kKENPTkZJR19CTVAwODVfSTJDKQkrPSBibXAwODUtaTJjLm8KLW9iai0kKENPTkZJR19CTVAwODVfU1BJKQkrPSBibXAwODUtc3BpLm8KIG9iai0kKENPTkZJR19EVU1NWV9JUlEpCQkrPSBkdW1teS1pcnEubwogb2JqLSQoQ09ORklHX0lDUzkzMlM0MDEpCSs9IGljczkzMnM0MDEubwogb2JqLSQoQ09ORklHX0xLRFRNKQkJKz0gbGtkdG0ubwpAQCAtMTksNyArMTYsNiBAQAogb2JqLSQoQ09ORklHX1RJRk1fN1hYMSkgICAgICAgCSs9IHRpZm1fN3h4MS5vCiBvYmotJChDT05GSUdfUEhBTlRPTSkJCSs9IHBoYW50b20ubwogb2JqLSQoQ09ORklHX1FDT01fQ09JTkNFTEwpCSs9IHFjb20tY29pbmNlbGwubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfQkgxNzgwKQkrPSBiaDE3ODBnbGkubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQkgxNzcwKQkrPSBiaDE3NzBnbGMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQVBEUzk5MFgpCSs9IGFwZHM5OTB4Lm8KIG9iai0kKENPTkZJR19TR0lfSU9DNCkJCSs9IGlvYzQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2JoMTc4MGdsaS5jIGIvZHJpdmVycy9taXNjL2JoMTc4MGdsaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkwY2U1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9iaDE3ODBnbGkuYworKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKgotICogYmgxNzgwZ2xpLmMKLSAqIFJPSE0gQW1iaWVudCBMaWdodCBTZW5zb3IgRHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzCi0gKiBBdXRob3I6IEhlbWFudGggViA8aGVtYW50aHZAdGkuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0KLSNkZWZpbmUgQkgxNzgwX1JFR19DT05UUk9MCTB4ODAKLSNkZWZpbmUgQkgxNzgwX1JFR19QQVJUSUQJMHg4QQotI2RlZmluZSBCSDE3ODBfUkVHX01BTkZJRAkweDhCCi0jZGVmaW5lIEJIMTc4MF9SRUdfRExPVwkweDhDCi0jZGVmaW5lIEJIMTc4MF9SRUdfREhJR0gJMHg4RAotCi0jZGVmaW5lIEJIMTc4MF9SRVZNQVNLCQkoMHhmKQotI2RlZmluZSBCSDE3ODBfUE9XTUFTSwkJKDB4MykKLSNkZWZpbmUgQkgxNzgwX1BPRkYJCSgweDApCi0jZGVmaW5lIEJIMTc4MF9QT04JCSgweDMpCi0KLS8qIHBvd2VyIG9uIHNldHRsaW5nIHRpbWUgaW4gbXMgKi8KLSNkZWZpbmUgQkgxNzgwX1BPTl9ERUxBWQkyCi0KLXN0cnVjdCBiaDE3ODBfZGF0YSB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQlpbnQgcG93ZXJfc3RhdGU7Ci0JLyogbG9jayBmb3Igc3lzZnMgb3BlcmF0aW9ucyAqLwotCXN0cnVjdCBtdXRleCBsb2NrOwotfTsKLQotc3RhdGljIGludCBiaDE3ODBfd3JpdGUoc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YSwgdTggcmVnLCB1OCB2YWwsIGNoYXIgKm1zZykKLXsKLQlpbnQgcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkZGF0YS0+Y2xpZW50LCByZWcsIHZhbCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJmRkYXRhLT5jbGllbnQtPmRldiwKLQkJCSJpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhIGZhaWxlZCBlcnJvciAlZCBSZWdpc3RlciAoJXMpXG4iLAotCQkJcmV0LCBtc2cpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmgxNzgwX3JlYWQoc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YSwgdTggcmVnLCBjaGFyICptc2cpCi17Ci0JaW50IHJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkZGF0YS0+Y2xpZW50LCByZWcpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZkZGF0YS0+Y2xpZW50LT5kZXYsCi0JCQkiaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhIGZhaWxlZCBlcnJvciAlZCBSZWdpc3RlciAoJXMpXG4iLAotCQkJcmV0LCBtc2cpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJoMTc4MF9zaG93X2x1eChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBsc2IsIG1zYjsKLQotCWxzYiA9IGJoMTc4MF9yZWFkKGRkYXRhLCBCSDE3ODBfUkVHX0RMT1csICJETE9XIik7Ci0JaWYgKGxzYiA8IDApCi0JCXJldHVybiBsc2I7Ci0KLQltc2IgPSBiaDE3ODBfcmVhZChkZGF0YSwgQkgxNzgwX1JFR19ESElHSCwgIkRISUdIIik7Ci0JaWYgKG1zYiA8IDApCi0JCXJldHVybiBtc2I7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKG1zYiA8PCA4KSB8IGxzYik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJoMTc4MF9zaG93X3Bvd2VyX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBzdGF0ZTsKLQotCXN0YXRlID0gYmgxNzgwX3JlYWQoZGRhdGEsIEJIMTc4MF9SRUdfQ09OVFJPTCwgIkNPTlRST0wiKTsKLQlpZiAoc3RhdGUgPCAwKQotCQlyZXR1cm4gc3RhdGU7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3RhdGUgJiBCSDE3ODBfUE9XTUFTSyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJoMTc4MF9zdG9yZV9wb3dlcl9zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCBlcnJvcjsKLQotCWVycm9yID0ga3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQotCWlmICh2YWwgPCBCSDE3ODBfUE9GRiB8fCB2YWwgPiBCSDE3ODBfUE9OKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW11dGV4X2xvY2soJmRkYXRhLT5sb2NrKTsKLQotCWVycm9yID0gYmgxNzgwX3dyaXRlKGRkYXRhLCBCSDE3ODBfUkVHX0NPTlRST0wsIHZhbCwgIkNPTlRST0wiKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCW11dGV4X3VubG9jaygmZGRhdGEtPmxvY2spOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JbXNsZWVwKEJIMTc4MF9QT05fREVMQVkpOwotCWRkYXRhLT5wb3dlcl9zdGF0ZSA9IHZhbDsKLQltdXRleF91bmxvY2soJmRkYXRhLT5sb2NrKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGx1eCwgU19JUlVHTywgYmgxNzgwX3Nob3dfbHV4LCBOVUxMKTsKLQotc3RhdGljIERFVklDRV9BVFRSKHBvd2VyX3N0YXRlLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJYmgxNzgwX3Nob3dfcG93ZXJfc3RhdGUsIGJoMTc4MF9zdG9yZV9wb3dlcl9zdGF0ZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpiaDE3ODBfYXR0cmlidXRlc1tdID0gewotCSZkZXZfYXR0cl9wb3dlcl9zdGF0ZS5hdHRyLAotCSZkZXZfYXR0cl9sdXguYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBiaDE3ODBfYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSBiaDE3ODBfYXR0cmlidXRlcywKLX07Ci0KLXN0YXRpYyBpbnQgYmgxNzgwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYmgxNzgwX2RhdGEgKmRkYXRhOwotCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7Ci0KLQlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEUpKQotCQlyZXR1cm4gLUVJTzsKLQotCWRkYXRhID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBiaDE3ODBfZGF0YSksCi0JCQkgICAgIEdGUF9LRVJORUwpOwotCWlmIChkZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRkYXRhLT5jbGllbnQgPSBjbGllbnQ7Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGRhdGEpOwotCi0JcmV0ID0gYmgxNzgwX3JlYWQoZGRhdGEsIEJIMTc4MF9SRUdfUEFSVElELCAiUEFSVCBJRCIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiQW1iaWVudCBMaWdodCBTZW5zb3IsIFJldiA6ICVkXG4iLAotCQkJKHJldCAmIEJIMTc4MF9SRVZNQVNLKSk7Ci0KLQltdXRleF9pbml0KCZkZGF0YS0+bG9jayk7Ci0KLQlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmYmgxNzgwX2F0dHJfZ3JvdXApOwotfQotCi1zdGF0aWMgaW50IGJoMTc4MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZiaDE3ODBfYXR0cl9ncm91cCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBiaDE3ODBfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJoMTc4MF9kYXRhICpkZGF0YTsKLQlpbnQgc3RhdGUsIHJldDsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCi0JZGRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzdGF0ZSA9IGJoMTc4MF9yZWFkKGRkYXRhLCBCSDE3ODBfUkVHX0NPTlRST0wsICJDT05UUk9MIik7Ci0JaWYgKHN0YXRlIDwgMCkKLQkJcmV0dXJuIHN0YXRlOwotCi0JZGRhdGEtPnBvd2VyX3N0YXRlID0gc3RhdGUgJiBCSDE3ODBfUE9XTUFTSzsKLQotCXJldCA9IGJoMTc4MF93cml0ZShkZGF0YSwgQkgxNzgwX1JFR19DT05UUk9MLCBCSDE3ODBfUE9GRiwKLQkJCQkiQ09OVFJPTCIpOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiaDE3ODBfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYmgxNzgwX2RhdGEgKmRkYXRhOwotCWludCBzdGF0ZSwgcmV0OwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0KLQlkZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXN0YXRlID0gZGRhdGEtPnBvd2VyX3N0YXRlOwotCXJldCA9IGJoMTc4MF93cml0ZShkZGF0YSwgQkgxNzgwX1JFR19DT05UUk9MLCBzdGF0ZSwKLQkJCQkiQ09OVFJPTCIpOwotCi0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KLQotc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGJoMTc4MF9wbSwgYmgxNzgwX3N1c3BlbmQsIGJoMTc4MF9yZXN1bWUpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYmgxNzgwX2lkW10gPSB7Ci0JeyAiYmgxNzgwIiwgMCB9LAotCXsgfSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBiaDE3ODBfaWQpOwotCi0jaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9iaDE3ODBfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInJvaG0sYmgxNzgwZ2xpIiwgfSwKLQl7fSwKLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX2JoMTc4MF9tYXRjaCk7Ci0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGJoMTc4MF9kcml2ZXIgPSB7Ci0JLnByb2JlCQk9IGJoMTc4MF9wcm9iZSwKLQkucmVtb3ZlCQk9IGJoMTc4MF9yZW1vdmUsCi0JLmlkX3RhYmxlCT0gYmgxNzgwX2lkLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImJoMTc4MCIsCi0JCS5wbQk9ICZiaDE3ODBfcG0sCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvZl9iaDE3ODBfbWF0Y2gpLAotCX0sCi19OwotCi1tb2R1bGVfaTJjX2RyaXZlcihiaDE3ODBfZHJpdmVyKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJCSDE3ODBHTEkgQW1iaWVudCBMaWdodCBTZW5zb3IgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJIZW1hbnRoIFYgPGhlbWFudGh2QHRpLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ibXAwODUtaTJjLmMgYi9kcml2ZXJzL21pc2MvYm1wMDg1LWkyYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzVjMjE4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbWlzYy9ibXAwODUtaTJjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEyICBCb3NjaCBTZW5zb3J0ZWMgR21iSAotICogQ29weXJpZ2h0IChjKSAyMDEyICBVbml4cGhlcmUgQUIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaTJjLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSAiYm1wMDg1LmgiCi0KLSNkZWZpbmUgQk1QMDg1X0kyQ19BRERSRVNTCTB4NzcKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsgQk1QMDg1X0kyQ19BRERSRVNTLAotCQkJCQkJCUkyQ19DTElFTlRfRU5EIH07Ci0KLXN0YXRpYyBpbnQgYm1wMDg1X2kyY19kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJCSAgICAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQotewotCWlmIChjbGllbnQtPmFkZHIgIT0gQk1QMDg1X0kyQ19BRERSRVNTKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldHVybiBibXAwODVfZGV0ZWN0KCZjbGllbnQtPmRldik7Ci19Ci0KLXN0YXRpYyBpbnQgYm1wMDg1X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwKLQkJCQkJCSAgICAgJmJtcDA4NV9yZWdtYXBfY29uZmlnKTsKLQotCWlmIChJU19FUlIocmVnbWFwKSkgewotCQllcnIgPSBQVFJfRVJSKHJlZ21hcCk7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGluaXQgcmVnbWFwOiAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gYm1wMDg1X3Byb2JlKCZjbGllbnQtPmRldiwgcmVnbWFwLCBjbGllbnQtPmlycSk7Ci19Ci0KLXN0YXRpYyBpbnQgYm1wMDg1X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlyZXR1cm4gYm1wMDg1X3JlbW92ZSgmY2xpZW50LT5kZXYpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYm1wMDg1X2lkW10gPSB7Ci0JeyBCTVAwODVfTkFNRSwgMCB9LAotCXsgImJtcDE4MCIsIDAgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYm1wMDg1X2lkKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGJtcDA4NV9pMmNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gQk1QMDg1X05BTUUsCi0JfSwKLQkuaWRfdGFibGUJPSBibXAwODVfaWQsCi0JLnByb2JlCQk9IGJtcDA4NV9pMmNfcHJvYmUsCi0JLnJlbW92ZQkJPSBibXAwODVfaTJjX3JlbW92ZSwKLQotCS5kZXRlY3QJCT0gYm1wMDg1X2kyY19kZXRlY3QsCi0JLmFkZHJlc3NfbGlzdAk9IG5vcm1hbF9pMmMKLX07Ci0KLW1vZHVsZV9pMmNfZHJpdmVyKGJtcDA4NV9pMmNfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiRXJpYyBBbmRlcnNzb24gPGVyaWMuYW5kZXJzc29uQHVuaXhwaGVyZS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkJNUDA4NSBJMkMgYnVzIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2JtcDA4NS1zcGkuYyBiL2RyaXZlcnMvbWlzYy9ibXAwODUtc3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZWNiZjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9taXNjL2JtcDA4NS1zcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgIEJvc2NoIFNlbnNvcnRlYyBHbWJICi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgIFVuaXhwaGVyZSBBQgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSAiYm1wMDg1LmgiCi0KLXN0YXRpYyBpbnQgYm1wMDg1X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqY2xpZW50KQotewotCWludCBlcnI7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCi0JY2xpZW50LT5iaXRzX3Blcl93b3JkID0gODsKLQllcnIgPSBzcGlfc2V0dXAoY2xpZW50KTsKLQlpZiAoZXJyIDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInNwaV9zZXR1cCBmYWlsZWQhXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShjbGllbnQsICZibXAwODVfcmVnbWFwX2NvbmZpZyk7Ci0JaWYgKElTX0VSUihyZWdtYXApKSB7Ci0JCWVyciA9IFBUUl9FUlIocmVnbWFwKTsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gaW5pdCByZWdtYXA6ICVkXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiBibXAwODVfcHJvYmUoJmNsaWVudC0+ZGV2LCByZWdtYXAsIGNsaWVudC0+aXJxKTsKLX0KLQotc3RhdGljIGludCBibXAwODVfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqY2xpZW50KQotewotCXJldHVybiBibXAwODVfcmVtb3ZlKCZjbGllbnQtPmRldik7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJtcDA4NV9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYm9zY2gsYm1wMDg1IiwgfSwKLQl7IH0sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYm1wMDg1X29mX21hdGNoKTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGJtcDA4NV9pZFtdID0gewotCXsgImJtcDE4MCIsIDAgfSwKLQl7ICJibXAxODEiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGJtcDA4NV9pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBibXAwODVfc3BpX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9IEJNUDA4NV9OQU1FLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBibXAwODVfb2ZfbWF0Y2gKLQl9LAotCS5pZF90YWJsZQk9IGJtcDA4NV9pZCwKLQkucHJvYmUJCT0gYm1wMDg1X3NwaV9wcm9iZSwKLQkucmVtb3ZlCQk9IGJtcDA4NV9zcGlfcmVtb3ZlCi19OwotCi1tb2R1bGVfc3BpX2RyaXZlcihibXAwODVfc3BpX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIkVyaWMgQW5kZXJzc29uIDxlcmljLmFuZGVyc3NvbkB1bml4cGhlcmUuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCTVAwODUgU1BJIGJ1cyBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ibXAwODUuYyBiL2RyaXZlcnMvbWlzYy9ibXAwODUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzMTNmNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvYm1wMDg1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyogIENvcHlyaWdodCAoYykgMjAxMCAgQ2hyaXN0b3BoIE1haXIgPGNocmlzdG9waC5tYWlyQGdtYWlsLmNvbT4KLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIEJvc2NoIFNlbnNvcnRlYyBHbWJICi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBVbml4cGhlcmUgQUIKLSAqCi0gKiAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIGJtcDA4NSBhbmQgYm1wMTh4IGRpZ2l0YWwgYmFyb21ldHJpYyBwcmVzc3VyZQotICogIGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3JzIGZyb20gQm9zY2ggU2Vuc29ydGVjLiBUaGUgZGF0YXNoZWV0cwotICogIGFyZSBhdmFpbGFibGUgZnJvbSB0aGVpciB3ZWJzaXRlOgotICogIGh0dHA6Ly93d3cuYm9zY2gtc2Vuc29ydGVjLmNvbS9jb250ZW50L2xhbmd1YWdlMS9kb3dubG9hZHMvQlNULUJNUDA4NS1EUzAwMC0wNS5wZGYKLSAqICBodHRwOi8vd3d3LmJvc2NoLXNlbnNvcnRlYy5jb20vY29udGVudC9sYW5ndWFnZTEvZG93bmxvYWRzL0JTVC1CTVAxODAtRFMwMDAtMDcucGRmCi0gKgotICogIEEgcHJlc3N1cmUgbWVhc3VyZW1lbnQgaXMgaXNzdWVkIGJ5IHJlYWRpbmcgZnJvbSBwcmVzc3VyZTBfaW5wdXQuCi0gKiAgVGhlIHJldHVybiB2YWx1ZSByYW5nZXMgZnJvbSAzMDAwMCB0byAxMTAwMDAgcGFzY2FsIHdpdGggYSByZXN1bHV0aW9uCi0gKiAgb2YgMSBwYXNjYWwgKDAuMDEgbWlsbGliYXIpIHdoaWNoIGVuYWJsZXMgbWVhc3VyZW1lbnRzIGZyb20gOTAwMG0gYWJvdmUKLSAqICB0byA1MDBtIGJlbG93IHNlYSBsZXZlbC4KLSAqCi0gKiAgVGhlIHRlbXBlcmF0dXJlIGNhbiBiZSByZWFkIGZyb20gdGVtcDBfaW5wdXQuIFZhbHVlcyByYW5nZSBmcm9tCi0gKiAgLTQwMCB0byA4NTAgcmVwcmVzZW50aW5nIHRoZSBhbWJpZW50IHRlbXBlcmF0dXJlIGluIGRlZ3JlZSBjZWxzaXVzCi0gKiAgbXVsdGlwbGllZCBieSAxMC5UaGUgcmVzb2x1dGlvbiBpcyAwLjEgY2Vsc2l1cy4KLSAqCi0gKiAgQmVjYXVzZSBhbWJpZW50IHByZXNzdXJlIGlzIHRlbXBlcmF0dXJlIGRlcGVuZGVudCwgYSB0ZW1wZXJhdHVyZQotICogIG1lYXN1cmVtZW50IHdpbGwgYmUgZXhlY3V0ZWQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSB1c2VyIGlzIHJlYWRpbmcKLSAqICBmcm9tIHByZXNzdXJlMF9pbnB1dC4gVGhpcyBoYXBwZW5zIGlmIHRoZSBsYXN0IHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50Ci0gKiAgaGFzIGJlZW4gZXhlY3V0ZWQgbW9yZSB0aGVuIG9uZSBzZWNvbmQgYWdvLgotICoKLSAqICBUbyBkZWNyZWFzZSBSTVMgbm9pc2UgZnJvbSBwcmVzc3VyZSBtZWFzdXJlbWVudHMsIHRoZSBibXAwODUgY2FuCi0gKiAgYXV0b25vbW91c2x5IGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiB1cCB0byBlaWdodCBzYW1wbGVzLiBUaGlzIGlzCi0gKiAgc2V0IHVwIGJ5IHdyaXRpbmcgdG8gdGhlIG92ZXJzYW1wbGluZyBzeXNmcyBmaWxlLiBBY2NlcHRlZCB2YWx1ZXMKLSAqICBhcmUgMCwgMSwgMiBhbmQgMy4gMl54IHdoZW4geCBpcyB0aGUgdmFsdWUgd3JpdHRlbiB0byB0aGlzIGZpbGUKLSAqICBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBhbWJpZW50IHByZXNzdXJlLgotICogIFJNUyBub2lzZSBpcyBzcGVjaWZpZWQgd2l0aCBzaXggcGFzY2FsICh3aXRob3V0IGF2ZXJhZ2luZykgYW5kIGRlY3JlYXNlcwotICogIGRvd24gdG8gMyBwYXNjYWwgd2hlbiB1c2luZyBhbiBvdmVyc2FtcGxpbmcgc2V0dGluZyBvZiAzLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgImJtcDA4NS5oIgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNkZWZpbmUgQk1QMDg1X0NISVBfSUQJCQkweDU1Ci0jZGVmaW5lIEJNUDA4NV9DQUxJQlJBVElPTl9EQVRBX1NUQVJUCTB4QUEKLSNkZWZpbmUgQk1QMDg1X0NBTElCUkFUSU9OX0RBVEFfTEVOR1RICTExCS8qIDE2IGJpdCB2YWx1ZXMgKi8KLSNkZWZpbmUgQk1QMDg1X0NISVBfSURfUkVHCQkweEQwCi0jZGVmaW5lIEJNUDA4NV9DVFJMX1JFRwkJCTB4RjQKLSNkZWZpbmUgQk1QMDg1X1RFTVBfTUVBU1VSRU1FTlQJCTB4MkUKLSNkZWZpbmUgQk1QMDg1X1BSRVNTVVJFX01FQVNVUkVNRU5UCTB4MzQKLSNkZWZpbmUgQk1QMDg1X0NPTlZFUlNJT05fUkVHSVNURVJfTVNCCTB4RjYKLSNkZWZpbmUgQk1QMDg1X0NPTlZFUlNJT05fUkVHSVNURVJfTFNCCTB4RjcKLSNkZWZpbmUgQk1QMDg1X0NPTlZFUlNJT05fUkVHSVNURVJfWExTQgkweEY4Ci0jZGVmaW5lIEJNUDA4NV9URU1QX0NPTlZFUlNJT05fVElNRQk1Ci0KLXN0cnVjdCBibXAwODVfY2FsaWJyYXRpb25fZGF0YSB7Ci0JczE2IEFDMSwgQUMyLCBBQzM7Ci0JdTE2IEFDNCwgQUM1LCBBQzY7Ci0JczE2IEIxLCBCMjsKLQlzMTYgTUIsIE1DLCBNRDsKLX07Ci0KLXN0cnVjdCBibXAwODVfZGF0YSB7Ci0Jc3RydWN0CWRldmljZSAqZGV2OwotCXN0cnVjdCAgcmVnbWFwICpyZWdtYXA7Ci0Jc3RydWN0CW11dGV4IGxvY2s7Ci0Jc3RydWN0CWJtcDA4NV9jYWxpYnJhdGlvbl9kYXRhIGNhbGlicmF0aW9uOwotCXU4CW92ZXJzYW1wbGluZ19zZXR0aW5nOwotCXUzMglyYXdfdGVtcGVyYXR1cmU7Ci0JdTMyCXJhd19wcmVzc3VyZTsKLQl1MzIJdGVtcF9tZWFzdXJlbWVudF9wZXJpb2Q7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3RlbXBfbWVhc3VyZW1lbnQ7Ci0JdTgJY2hpcF9pZDsKLQlzMzIJYjY7IC8qIGNhbGN1bGF0ZWQgdGVtcGVyYXR1cmUgY29ycmVjdGlvbiBjb2VmZmljaWVudCAqLwotCWludAlpcnE7Ci0Jc3RydWN0CWNvbXBsZXRpb24gZG9uZTsKLX07Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBibXAwODVfZW9jX2lzcihpbnQgaXJxLCB2b2lkICpkZXZpZCkKLXsKLQlzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEgPSBkZXZpZDsKLQotCWNvbXBsZXRlKCZkYXRhLT5kb25lKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHMzMiBibXAwODVfcmVhZF9jYWxpYnJhdGlvbl9kYXRhKHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSkKLXsKLQl1MTYgdG1wW0JNUDA4NV9DQUxJQlJBVElPTl9EQVRBX0xFTkdUSF07Ci0Jc3RydWN0IGJtcDA4NV9jYWxpYnJhdGlvbl9kYXRhICpjYWxpID0gJihkYXRhLT5jYWxpYnJhdGlvbik7Ci0JczMyIHN0YXR1cyA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLAotCQkJCUJNUDA4NV9DQUxJQlJBVElPTl9EQVRBX1NUQVJULCAodTggKil0bXAsCi0JCQkJKEJNUDA4NV9DQUxJQlJBVElPTl9EQVRBX0xFTkdUSCA8PCAxKSk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXJldHVybiBzdGF0dXM7Ci0KLQljYWxpLT5BQzEgPSAgYmUxNl90b19jcHUodG1wWzBdKTsKLQljYWxpLT5BQzIgPSAgYmUxNl90b19jcHUodG1wWzFdKTsKLQljYWxpLT5BQzMgPSAgYmUxNl90b19jcHUodG1wWzJdKTsKLQljYWxpLT5BQzQgPSAgYmUxNl90b19jcHUodG1wWzNdKTsKLQljYWxpLT5BQzUgPSAgYmUxNl90b19jcHUodG1wWzRdKTsKLQljYWxpLT5BQzYgPSBiZTE2X3RvX2NwdSh0bXBbNV0pOwotCWNhbGktPkIxID0gYmUxNl90b19jcHUodG1wWzZdKTsKLQljYWxpLT5CMiA9IGJlMTZfdG9fY3B1KHRtcFs3XSk7Ci0JY2FsaS0+TUIgPSBiZTE2X3RvX2NwdSh0bXBbOF0pOwotCWNhbGktPk1DID0gYmUxNl90b19jcHUodG1wWzldKTsKLQljYWxpLT5NRCA9IGJlMTZfdG9fY3B1KHRtcFsxMF0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgczMyIGJtcDA4NV91cGRhdGVfcmF3X3RlbXBlcmF0dXJlKHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSkKLXsKLQl1MTYgdG1wOwotCXMzMiBzdGF0dXM7Ci0KLQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKLQotCWluaXRfY29tcGxldGlvbigmZGF0YS0+ZG9uZSk7Ci0KLQlzdGF0dXMgPSByZWdtYXBfd3JpdGUoZGF0YS0+cmVnbWFwLCBCTVAwODVfQ1RSTF9SRUcsCi0JCQkgICAgICBCTVAwODVfVEVNUF9NRUFTVVJFTUVOVCk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2VycihkYXRhLT5kZXYsCi0JCQkiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudC5cbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGF0YS0+ZG9uZSwgMSArIG1zZWNzX3RvX2ppZmZpZXMoCi0JCQkJCSAgICBCTVAwODVfVEVNUF9DT05WRVJTSU9OX1RJTUUpKTsKLQotCXN0YXR1cyA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLCBCTVAwODVfQ09OVkVSU0lPTl9SRUdJU1RFUl9NU0IsCi0JCQkJICZ0bXAsIHNpemVvZih0bXApKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlkZXZfZXJyKGRhdGEtPmRldiwKLQkJCSJFcnJvciB3aGlsZSByZWFkaW5nIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50IHJlc3VsdFxuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JZGF0YS0+cmF3X3RlbXBlcmF0dXJlID0gYmUxNl90b19jcHUodG1wKTsKLQlkYXRhLT5sYXN0X3RlbXBfbWVhc3VyZW1lbnQgPSBqaWZmaWVzOwotCXN0YXR1cyA9IDA7CS8qIGV2ZXJ5dGhpbmcgb2ssIHJldHVybiAwICovCi0KLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgczMyIGJtcDA4NV91cGRhdGVfcmF3X3ByZXNzdXJlKHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSkKLXsKLQl1MzIgdG1wID0gMDsKLQlzMzIgc3RhdHVzOwotCi0JbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7Ci0KLQlpbml0X2NvbXBsZXRpb24oJmRhdGEtPmRvbmUpOwotCi0Jc3RhdHVzID0gcmVnbWFwX3dyaXRlKGRhdGEtPnJlZ21hcCwgQk1QMDg1X0NUUkxfUkVHLAotCQkJQk1QMDg1X1BSRVNTVVJFX01FQVNVUkVNRU5UICsKLQkJCShkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZyA8PCA2KSk7Ci0JaWYgKHN0YXR1cyA8IDApIHsKLQkJZGV2X2VycihkYXRhLT5kZXYsCi0JCQkiRXJyb3Igd2hpbGUgcmVxdWVzdGluZyBwcmVzc3VyZSBtZWFzdXJlbWVudC5cbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogd2FpdCBmb3IgdGhlIGVuZCBvZiBjb252ZXJzaW9uICovCi0Jd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkYXRhLT5kb25lLCAxICsgbXNlY3NfdG9famlmZmllcygKLQkJCQkJMisoMyA8PCBkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZykpKTsKLQkvKiBjb3B5IGRhdGEgaW50byBhIHUzMiAoNCBieXRlcyksIGJ1dCBza2lwIHRoZSBmaXJzdCBieXRlLiAqLwotCXN0YXR1cyA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLCBCTVAwODVfQ09OVkVSU0lPTl9SRUdJU1RFUl9NU0IsCi0JCQkJICgodTggKikmdG1wKSsxLCAzKTsKLQlpZiAoc3RhdHVzIDwgMCkgewotCQlkZXZfZXJyKGRhdGEtPmRldiwKLQkJCSJFcnJvciB3aGlsZSByZWFkaW5nIHByZXNzdXJlIG1lYXN1cmVtZW50IHJlc3VsdHNcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCWRhdGEtPnJhd19wcmVzc3VyZSA9IGJlMzJfdG9fY3B1KCh0bXApKTsKLQlkYXRhLT5yYXdfcHJlc3N1cmUgPj49ICg4LWRhdGEtPm92ZXJzYW1wbGluZ19zZXR0aW5nKTsKLQlzdGF0dXMgPSAwOwkvKiBldmVyeXRoaW5nIG9rLCByZXR1cm4gMCAqLwotCi1leGl0OgotCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gc3RhcnRzIHRoZSB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCBhbmQgcmV0dXJucyB0aGUgdmFsdWUKLSAqIGluIHRlbnRoIG9mIGEgZGVncmVlIGNlbHNpdXMuCi0gKi8KLXN0YXRpYyBzMzIgYm1wMDg1X2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEsIGludCAqdGVtcGVyYXR1cmUpCi17Ci0Jc3RydWN0IGJtcDA4NV9jYWxpYnJhdGlvbl9kYXRhICpjYWxpID0gJmRhdGEtPmNhbGlicmF0aW9uOwotCWxvbmcgeDEsIHgyOwotCWludCBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBibXAwODVfdXBkYXRlX3Jhd190ZW1wZXJhdHVyZShkYXRhKTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJZ290byBleGl0OwotCi0JeDEgPSAoKGRhdGEtPnJhd190ZW1wZXJhdHVyZSAtIGNhbGktPkFDNikgKiBjYWxpLT5BQzUpID4+IDE1OwotCXgyID0gKGNhbGktPk1DIDw8IDExKSAvICh4MSArIGNhbGktPk1EKTsKLQlkYXRhLT5iNiA9IHgxICsgeDIgLSA0MDAwOwotCS8qIGlmIE5VTEwganVzdCB1cGRhdGUgYjYuIFVzZWQgZm9yIHByZXNzdXJlIG9ubHkgbWVhc3VyZW1lbnRzICovCi0JaWYgKHRlbXBlcmF0dXJlICE9IE5VTEwpCi0JCSp0ZW1wZXJhdHVyZSA9ICh4MSt4Mis4KSA+PiA0OwotCi1leGl0OgotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyB0aGUgcHJlc3N1cmUgbWVhc3VyZW1lbnQgYW5kIHJldHVybnMgdGhlIHZhbHVlCi0gKiBpbiBtaWxsaWJhci4gU2luY2UgdGhlIHByZXNzdXJlIGRlcGVuZHMgb24gdGhlIGFtYmllbnQgdGVtcGVyYXR1cmUsCi0gKiBhIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50IGlzIGV4ZWN1dGVkIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gdGVtcGVyYXR1cmUKLSAqIG1lYXN1cmVtZW50IHBlcmlvZCAoZGVmYXVsdCBpcyAxIHNlYyBib3VuZGFyeSkuIFRoaXMgcGVyaW9kIGNvdWxkIHZhcnkKLSAqIGFuZCBuZWVkcyB0byBiZSBhZGp1c3RlZCBhY2NvcmRpbmcgdG8gdGhlIHNlbnNvciBlbnZpcm9ubWVudCwgaS5lLiBpZiBiaWcKLSAqIHRlbXBlcmF0dXJlIHZhcmlhdGlvbnMgdGhlbiB0aGUgdGVtcGVyYXR1cmUgbmVlZHMgdG8gYmUgcmVhZCBvdXQgb2Z0ZW4uCi0gKi8KLXN0YXRpYyBzMzIgYm1wMDg1X2dldF9wcmVzc3VyZShzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEsIGludCAqcHJlc3N1cmUpCi17Ci0Jc3RydWN0IGJtcDA4NV9jYWxpYnJhdGlvbl9kYXRhICpjYWxpID0gJmRhdGEtPmNhbGlicmF0aW9uOwotCXMzMiB4MSwgeDIsIHgzLCBiMzsKLQl1MzIgYjQsIGI3OwotCXMzMiBwOwotCWludCBzdGF0dXM7Ci0KLQkvKiBhbHQgbGVhc3QgZXZlcnkgc2Vjb25kIGZvcmNlIGFuIHVwZGF0ZSBvZiB0aGUgYW1iaWVudCB0ZW1wZXJhdHVyZSAqLwotCWlmICgoZGF0YS0+bGFzdF90ZW1wX21lYXN1cmVtZW50ID09IDApIHx8Ci0JICAgIHRpbWVfaXNfYmVmb3JlX2ppZmZpZXMoZGF0YS0+bGFzdF90ZW1wX21lYXN1cmVtZW50ICsgMSpIWikpIHsKLQkJc3RhdHVzID0gYm1wMDg1X2dldF90ZW1wZXJhdHVyZShkYXRhLCBOVUxMKTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXN0YXR1cyA9IGJtcDA4NV91cGRhdGVfcmF3X3ByZXNzdXJlKGRhdGEpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JeDEgPSAoZGF0YS0+YjYgKiBkYXRhLT5iNikgPj4gMTI7Ci0JeDEgKj0gY2FsaS0+QjI7Ci0JeDEgPj49IDExOwotCi0JeDIgPSBjYWxpLT5BQzIgKiBkYXRhLT5iNjsKLQl4MiA+Pj0gMTE7Ci0KLQl4MyA9IHgxICsgeDI7Ci0KLQliMyA9ICgoKCgoczMyKWNhbGktPkFDMSkgKiA0ICsgeDMpIDw8IGRhdGEtPm92ZXJzYW1wbGluZ19zZXR0aW5nKSArIDIpOwotCWIzID4+PSAyOwotCi0JeDEgPSAoY2FsaS0+QUMzICogZGF0YS0+YjYpID4+IDEzOwotCXgyID0gKGNhbGktPkIxICogKChkYXRhLT5iNiAqIGRhdGEtPmI2KSA+PiAxMikpID4+IDE2OwotCXgzID0gKHgxICsgeDIgKyAyKSA+PiAyOwotCWI0ID0gKGNhbGktPkFDNCAqICh1MzIpKHgzICsgMzI3NjgpKSA+PiAxNTsKLQotCWI3ID0gKCh1MzIpZGF0YS0+cmF3X3ByZXNzdXJlIC0gYjMpICoKLQkJCQkJKDUwMDAwID4+IGRhdGEtPm92ZXJzYW1wbGluZ19zZXR0aW5nKTsKLQlwID0gKChiNyA8IDB4ODAwMDAwMDApID8gKChiNyA8PCAxKSAvIGI0KSA6ICgoYjcgLyBiNCkgKiAyKSk7Ci0KLQl4MSA9IHAgPj4gODsKLQl4MSAqPSB4MTsKLQl4MSA9ICh4MSAqIDMwMzgpID4+IDE2OwotCXgyID0gKC03MzU3ICogcCkgPj4gMTY7Ci0JcCArPSAoeDEgKyB4MiArIDM3OTEpID4+IDQ7Ci0KLQkqcHJlc3N1cmUgPSBwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGNoaXAtaW50ZXJuYWwgb3ZlcnNhbXBsaW5nLiBWYWxpZCB2YWx1ZXMgYXJlIDAuLjMuCi0gKiBUaGUgY2hpcCB3aWxsIHVzZSAyXm92ZXJzYW1wbGluZyBzYW1wbGVzIGZvciBpbnRlcm5hbCBhdmVyYWdpbmcuCi0gKiBUaGlzIGluZmx1ZW5jZXMgdGhlIG1lYXN1cmVtZW50IHRpbWUgYW5kIHRoZSBhY2N1cmFjeTsgbGFyZ2VyIHZhbHVlcwotICogaW5jcmVhc2UgYm90aC4gVGhlIGRhdGFzaGVldCBnaXZlcyBhbiBvdmVydmlldyBvbiBob3cgbWVhc3VyZW1lbnQgdGltZSwKLSAqIGFjY3VyYWN5IGFuZCBub2lzZSBjb3JyZWxhdGUuCi0gKi8KLXN0YXRpYyB2b2lkIGJtcDA4NV9zZXRfb3ZlcnNhbXBsaW5nKHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSwKLQkJCQkJCXVuc2lnbmVkIGNoYXIgb3ZlcnNhbXBsaW5nKQotewotCWlmIChvdmVyc2FtcGxpbmcgPiAzKQotCQlvdmVyc2FtcGxpbmcgPSAzOwotCWRhdGEtPm92ZXJzYW1wbGluZ19zZXR0aW5nID0gb3ZlcnNhbXBsaW5nOwotfQotCi0vKgotICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG92ZXJzYW1wbGluZy4gUmFuZ2U6IDAuLjMKLSAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgYm1wMDg1X2dldF9vdmVyc2FtcGxpbmcoc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhKQotewotCXJldHVybiBkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZzsKLX0KLQotLyogc3lzZnMgY2FsbGJhY2tzICovCi1zdGF0aWMgc3NpemVfdCBzZXRfb3ZlcnNhbXBsaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBsb25nIG92ZXJzYW1wbGluZzsKLQlpbnQgZXJyID0ga3N0cnRvdWwoYnVmLCAxMCwgJm92ZXJzYW1wbGluZyk7Ci0KLQlpZiAoZXJyID09IDApIHsKLQkJbXV0ZXhfbG9jaygmZGF0YS0+bG9jayk7Ci0JCWJtcDA4NV9zZXRfb3ZlcnNhbXBsaW5nKGRhdGEsIG92ZXJzYW1wbGluZyk7Ci0JCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgc3NpemVfdCBzaG93X292ZXJzYW1wbGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgYm1wMDg1X2dldF9vdmVyc2FtcGxpbmcoZGF0YSkpOwotfQotc3RhdGljIERFVklDRV9BVFRSKG92ZXJzYW1wbGluZywgU19JV1VTUiB8IFNfSVJVR08sCi0JCQkJCXNob3dfb3ZlcnNhbXBsaW5nLCBzZXRfb3ZlcnNhbXBsaW5nKTsKLQotCi1zdGF0aWMgc3NpemVfdCBzaG93X3RlbXBlcmF0dXJlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCWludCB0ZW1wZXJhdHVyZTsKLQlpbnQgc3RhdHVzOwotCXN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0Jc3RhdHVzID0gYm1wMDg1X2dldF90ZW1wZXJhdHVyZShkYXRhLCAmdGVtcGVyYXR1cmUpOwotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCWVsc2UKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXBlcmF0dXJlKTsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUih0ZW1wMF9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wZXJhdHVyZSwgTlVMTCk7Ci0KLQotc3RhdGljIHNzaXplX3Qgc2hvd19wcmVzc3VyZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0JaW50IHByZXNzdXJlOwotCWludCBzdGF0dXM7Ci0Jc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlzdGF0dXMgPSBibXAwODVfZ2V0X3ByZXNzdXJlKGRhdGEsICZwcmVzc3VyZSk7Ci0JaWYgKHN0YXR1cyA8IDApCi0JCXJldHVybiBzdGF0dXM7Ci0JZWxzZQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcHJlc3N1cmUpOwotfQotc3RhdGljIERFVklDRV9BVFRSKHByZXNzdXJlMF9pbnB1dCwgU19JUlVHTywgc2hvd19wcmVzc3VyZSwgTlVMTCk7Ci0KLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmJtcDA4NV9hdHRyaWJ1dGVzW10gPSB7Ci0JJmRldl9hdHRyX3RlbXAwX2lucHV0LmF0dHIsCi0JJmRldl9hdHRyX3ByZXNzdXJlMF9pbnB1dC5hdHRyLAotCSZkZXZfYXR0cl9vdmVyc2FtcGxpbmcuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBibXAwODVfYXR0cl9ncm91cCA9IHsKLQkuYXR0cnMgPSBibXAwODVfYXR0cmlidXRlcywKLX07Ci0KLWludCBibXAwODVfZGV0ZWN0KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYm1wMDg1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgQk1QMDg1X0NISVBfSURfUkVHLCAmaWQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKGlkICE9IGRhdGEtPmNoaXBfaWQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChibXAwODVfZGV0ZWN0KTsKLQotc3RhdGljIHZvaWQgYm1wMDg1X2dldF9vZl9wcm9wZXJ0aWVzKHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSkKLXsKLSNpZmRlZiBDT05GSUdfT0YKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGF0YS0+ZGV2LT5vZl9ub2RlOwotCXUzMiBwcm9wOwotCi0JaWYgKCFucCkKLQkJcmV0dXJuOwotCi0JaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNoaXAtaWQiLCAmcHJvcCkpCi0JCWRhdGEtPmNoaXBfaWQgPSBwcm9wICYgMHhmZjsKLQotCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0ZW1wLW1lYXN1cmVtZW50LXBlcmlvZCIsICZwcm9wKSkKLQkJZGF0YS0+dGVtcF9tZWFzdXJlbWVudF9wZXJpb2QgPSAocHJvcC8xMDApKkhaOwotCi0JaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImRlZmF1bHQtb3ZlcnNhbXBsaW5nIiwgJnByb3ApKQotCQlkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZyA9IHByb3AgJiAweGZmOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQgYm1wMDg1X2luaXRfY2xpZW50KHN0cnVjdCBibXAwODVfZGF0YSAqZGF0YSkKLXsKLQlpbnQgc3RhdHVzID0gYm1wMDg1X3JlYWRfY2FsaWJyYXRpb25fZGF0YShkYXRhKTsKLQotCWlmIChzdGF0dXMgPCAwKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JLyogZGVmYXVsdCBzZXR0aW5ncyAqLwotCWRhdGEtPmNoaXBfaWQgPSBCTVAwODVfQ0hJUF9JRDsKLQlkYXRhLT5sYXN0X3RlbXBfbWVhc3VyZW1lbnQgPSAwOwotCWRhdGEtPnRlbXBfbWVhc3VyZW1lbnRfcGVyaW9kID0gMSpIWjsKLQlkYXRhLT5vdmVyc2FtcGxpbmdfc2V0dGluZyA9IDM7Ci0KLQlibXAwODVfZ2V0X29mX3Byb3BlcnRpZXMoZGF0YSk7Ci0KLQltdXRleF9pbml0KCZkYXRhLT5sb2NrKTsKLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgcmVnbWFwX2NvbmZpZyBibXAwODVfcmVnbWFwX2NvbmZpZyA9IHsKLQkucmVnX2JpdHMgPSA4LAotCS52YWxfYml0cyA9IDgKLX07Ci1FWFBPUlRfU1lNQk9MX0dQTChibXAwODVfcmVnbWFwX2NvbmZpZyk7Ci0KLWludCBibXAwODVfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCBpcnEpCi17Ci0Jc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhOwotCWludCBlcnIgPSAwOwotCi0JZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibXAwODVfZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghZGF0YSkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgZGF0YSk7Ci0JZGF0YS0+ZGV2ID0gZGV2OwotCWRhdGEtPnJlZ21hcCA9IHJlZ21hcDsKLQlkYXRhLT5pcnEgPSBpcnE7Ci0KLQlpZiAoZGF0YS0+aXJxID4gMCkgewotCQllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgZGF0YS0+aXJxLCBibXAwODVfZW9jX2lzciwKLQkJCQkJICAgICAgSVJRRl9UUklHR0VSX1JJU0lORywgImJtcDA4NSIsCi0JCQkJCSAgICAgIGRhdGEpOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXhpdF9mcmVlOwotCX0KLQotCS8qIEluaXRpYWxpemUgdGhlIEJNUDA4NSBjaGlwICovCi0JZXJyID0gYm1wMDg1X2luaXRfY2xpZW50KGRhdGEpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGV4aXRfZnJlZTsKLQotCWVyciA9IGJtcDA4NV9kZXRlY3QoZGV2KTsKLQlpZiAoZXJyIDwgMCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiBjaGlwX2lkIGZhaWxlZCFcbiIsIEJNUDA4NV9OQU1FKTsKLQkJZ290byBleGl0X2ZyZWU7Ci0JfQotCi0JLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KLQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmJtcDA4NV9hdHRyX2dyb3VwKTsKLQlpZiAoZXJyKQotCQlnb3RvIGV4aXRfZnJlZTsKLQotCWRldl9pbmZvKGRldiwgIlN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCAlcyFcbiIsIEJNUDA4NV9OQU1FKTsKLQotCXJldHVybiAwOwotCi1leGl0X2ZyZWU6Ci0Ja2ZyZWUoZGF0YSk7Ci1leGl0OgotCXJldHVybiBlcnI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChibXAwODVfcHJvYmUpOwotCi1pbnQgYm1wMDg1X3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJtcDA4NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRhdGEtPmRldi0+a29iaiwgJmJtcDA4NV9hdHRyX2dyb3VwKTsKLQlrZnJlZShkYXRhKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYm1wMDg1X3JlbW92ZSk7Ci0KLU1PRFVMRV9BVVRIT1IoIkNocmlzdG9waCBNYWlyIDxjaHJpc3RvcGgubWFpckBnbWFpbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkJNUDA4NSBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9ibXAwODUuaCBiL2RyaXZlcnMvbWlzYy9ibXAwODUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4ZTNiMS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21pc2MvYm1wMDg1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEyICBCb3NjaCBTZW5zb3J0ZWMgR21iSAotICogQ29weXJpZ2h0IChjKSAyMDEyICBVbml4cGhlcmUgQUIKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9CTVAwODVfSAotI2RlZmluZSBfQk1QMDg1X0gKLQotI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgotCi0jZGVmaW5lIEJNUDA4NV9OQU1FCQkiYm1wMDg1IgotCi1leHRlcm4gc3RydWN0IHJlZ21hcF9jb25maWcgYm1wMDg1X3JlZ21hcF9jb25maWc7Ci0KLWludCBibXAwODVfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCBpcnEpOwotaW50IGJtcDA4NV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKLWludCBibXAwODVfZGV0ZWN0KHN0cnVjdCBkZXZpY2UgKmRldik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2N4bC9jeGwuaCBiL2RyaXZlcnMvbWlzYy9jeGwvY3hsLmgKaW5kZXggMzQ0YTBmZi4uMDFkMzcyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2N4bC9jeGwuaAorKysgYi9kcml2ZXJzL21pc2MvY3hsL2N4bC5oCkBAIC0xNjIsNyArMTYyLDEwIEBACiAjZGVmaW5lIENYTF9QU0xfU1BBUF9WICAgIDB4MDAwMDAwMDAwMDAwMDAwMVVMTAogCiAvKioqKioqIENYTF9QU0xfQ29udHJvbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDWExfUFNMX0NvbnRyb2xfdGIgMHgwMDAwMDAwMDAwMDAwMDAxVUxMCisjZGVmaW5lIENYTF9QU0xfQ29udHJvbF90YiAgICAgICAgICAgICAgKDB4MXVsbCA8PCAoNjMtNjMpKQorI2RlZmluZSBDWExfUFNMX0NvbnRyb2xfRnIgICAgICAgICAgICAgICgweDF1bGwgPDwgKDYzLTMxKSkKKyNkZWZpbmUgQ1hMX1BTTF9Db250cm9sX0ZzX01BU0sgICAgICAgICAoMHgzdWxsIDw8ICg2My0yOSkpCisjZGVmaW5lIENYTF9QU0xfQ29udHJvbF9Gc19Db21wbGV0ZSAgICAgKDB4M3VsbCA8PCAoNjMtMjkpKQogCiAvKioqKioqIENYTF9QU0xfRExDTlRMICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBDWExfUFNMX0RMQ05UTF9EICgweDF1bGwgPDwgKDYzLTI4KSkKQEAgLTg1NCw2ICs4NTcsNyBAQAogaW50IGN4bF9jaGVja19lcnJvcihzdHJ1Y3QgY3hsX2FmdSAqYWZ1KTsKIGludCBjeGxfYWZ1X3NsYmlhKHN0cnVjdCBjeGxfYWZ1ICphZnUpOwogaW50IGN4bF90bGJfc2xiX2ludmFsaWRhdGUoc3RydWN0IGN4bCAqYWRhcHRlcik7CitpbnQgY3hsX2RhdGFfY2FjaGVfZmx1c2goc3RydWN0IGN4bCAqYWRhcHRlcik7CiBpbnQgY3hsX2FmdV9kaXNhYmxlKHN0cnVjdCBjeGxfYWZ1ICphZnUpOwogaW50IGN4bF9wc2xfcHVyZ2Uoc3RydWN0IGN4bF9hZnUgKmFmdSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9jeGwvbmF0aXZlLmMgYi9kcml2ZXJzL21pc2MvY3hsL25hdGl2ZS5jCmluZGV4IGU2MDZmZGMuLmEyMTdhNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9jeGwvbmF0aXZlLmMKKysrIGIvZHJpdmVycy9taXNjL2N4bC9uYXRpdmUuYwpAQCAtMjkwLDYgKzI5MCwzNyBAQAogCXJldHVybiAwOwogfQogCitpbnQgY3hsX2RhdGFfY2FjaGVfZmx1c2goc3RydWN0IGN4bCAqYWRhcHRlcikKK3sKKwl1NjQgcmVnOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyAoSFogKiBDWExfVElNRU9VVCk7CisKKwlwcl9kZXZlbCgiRmx1c2hpbmcgZGF0YSBjYWNoZVxuIik7CisKKwlyZWcgPSBjeGxfcDFfcmVhZChhZGFwdGVyLCBDWExfUFNMX0NvbnRyb2wpOworCXJlZyB8PSBDWExfUFNMX0NvbnRyb2xfRnI7CisJY3hsX3AxX3dyaXRlKGFkYXB0ZXIsIENYTF9QU0xfQ29udHJvbCwgcmVnKTsKKworCXJlZyA9IGN4bF9wMV9yZWFkKGFkYXB0ZXIsIENYTF9QU0xfQ29udHJvbCk7CisJd2hpbGUgKChyZWcgJiBDWExfUFNMX0NvbnRyb2xfRnNfTUFTSykgIT0gQ1hMX1BTTF9Db250cm9sX0ZzX0NvbXBsZXRlKSB7CisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCAiV0FSTklORzogY2FjaGUgZmx1c2ggdGltZWQgb3V0IVxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJaWYgKCFjeGxfb3BzLT5saW5rX29rKGFkYXB0ZXIsIE5VTEwpKSB7CisJCQlkZXZfd2FybigmYWRhcHRlci0+ZGV2LCAiV0FSTklORzogbGluayBkb3duIHdoZW4gZmx1c2hpbmcgY2FjaGVcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJY3B1X3JlbGF4KCk7CisJCXJlZyA9IGN4bF9wMV9yZWFkKGFkYXB0ZXIsIENYTF9QU0xfQ29udHJvbCk7CisJfQorCisJcmVnICY9IH5DWExfUFNMX0NvbnRyb2xfRnI7CisJY3hsX3AxX3dyaXRlKGFkYXB0ZXIsIENYTF9QU0xfQ29udHJvbCwgcmVnKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBjeGxfd3JpdGVfc3N0cChzdHJ1Y3QgY3hsX2FmdSAqYWZ1LCB1NjQgc3N0cDAsIHU2NCBzc3RwMSkKIHsKIAlpbnQgcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvY3hsL29mLmMgYi9kcml2ZXJzL21pc2MvY3hsL29mLmMKaW5kZXggZWRjNDU4My4uZWMxNzVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2N4bC9vZi5jCisrKyBiL2RyaXZlcnMvbWlzYy9jeGwvb2YuYwpAQCAtNDYwLDcgKzQ2MCw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICphZnVfbnAgPSBOVUxMOwogCXN0cnVjdCBjeGwgKmFkYXB0ZXIgPSBOVUxMOwogCWludCByZXQ7Ci0JaW50IHNsaWNlLCBzbGljZV9vazsKKwlpbnQgc2xpY2UgPSAwLCBzbGljZV9vayA9IDA7CiAKIAlwcl9kZXZlbCgiaW4gJXNcbiIsIF9fZnVuY19fKTsKIApAQCAtNDc2LDEzICs0NzYsMTMgQEAKIAl9CiAKIAkvKiBpbml0IGFmdSAqLwotCXNsaWNlX29rID0gMDsKLQlmb3IgKGFmdV9ucCA9IE5VTEwsIHNsaWNlID0gMDsgKGFmdV9ucCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBhZnVfbnApKTsgc2xpY2UrKykgeworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnAsIGFmdV9ucCkgewogCQlpZiAoKHJldCA9IGN4bF9ndWVzdF9pbml0X2FmdShhZGFwdGVyLCBzbGljZSwgYWZ1X25wKSkpCiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJBRlUgJWkgZmFpbGVkIHRvIGluaXRpYWxpc2U6ICVpXG4iLAogCQkJCXNsaWNlLCByZXQpOwogCQllbHNlCiAJCQlzbGljZV9vaysrOworCQlzbGljZSsrOwogCX0KIAogCWlmIChzbGljZV9vayA9PSAwKSB7CkBAIC00OTAsOCArNDkwLDYgQEAKIAkJYWRhcHRlci0+c2xpY2VzID0gMDsKIAl9CiAKLQlpZiAoYWZ1X25wKQotCQlvZl9ub2RlX3B1dChhZnVfbnApOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvY3hsL3BjaS5jIGIvZHJpdmVycy9taXNjL2N4bC9wY2kuYwppbmRleCA2ZjBjNGFjLi43YWZhZDg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvY3hsL3BjaS5jCisrKyBiL2RyaXZlcnMvbWlzYy9jeGwvcGNpLmMKQEAgLTEyMzksNiArMTIzOSw5IEBACiAKIAlkZXZfaW5mbygmZGV2LT5kZXYsICJDWEwgcmVzZXRcbiIpOwogCisJLyogdGhlIGFkYXB0ZXIgaXMgYWJvdXQgdG8gYmUgcmVzZXQsIHNvIGlnbm9yZSBlcnJvcnMgKi8KKwljeGxfZGF0YV9jYWNoZV9mbHVzaChhZGFwdGVyKTsKKwogCS8qIHBjaWVfd2FybV9yZXNldCByZXF1ZXN0cyBhIGZ1bmRhbWVudGFsIHBjaSByZXNldCB3aGljaCBpbmNsdWRlcyBhCiAJICogUEVSU1QgYXNzZXJ0L2RlYXNzZXJ0LiAgUEVSU1QgdHJpZ2dlcnMgYSBsb2FkaW5nIG9mIHRoZSBpbWFnZQogCSAqIGlmICJ1c2VyIiBvciAiZmFjdG9yeSIgaXMgc2VsZWN0ZWQgaW4gc3lzZnMgKi8KQEAgLTE1MzAsMTEgKzE1MzMsMTEgQEAKIHsKIAlpZiAoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9NRUxMQU5PWCAmJiBkZXYtPmRldmljZSA9PSAweDEwMTMpIHsKIAkJLyogTWVsbGFub3ggQ1gtNCAqLwotCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LCAiRGV2aWNlIHVzZXMgYW4gWFNMXG4iKTsKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiRGV2aWNlIHVzZXMgYW4gWFNMXG4iKTsKIAkJYWRhcHRlci0+bmF0aXZlLT5zbF9vcHMgPSAmeHNsX29wczsKIAkJYWRhcHRlci0+bWluX3BlID0gMTsgLyogV29ya2Fyb3VuZCBmb3IgQ1gtNCBoYXJkd2FyZSBidWcgKi8KIAl9IGVsc2UgewotCQlkZXZfaW5mbygmYWRhcHRlci0+ZGV2LCAiRGV2aWNlIHVzZXMgYSBQU0xcbiIpOworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJEZXZpY2UgdXNlcyBhIFBTTFxuIik7CiAJCWFkYXB0ZXItPm5hdGl2ZS0+c2xfb3BzID0gJnBzbF9vcHM7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2N4bC92cGhiLmMgYi9kcml2ZXJzL21pc2MvY3hsL3ZwaGIuYwppbmRleCA3YWRhNWYxLi4zNTE5YWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvY3hsL3ZwaGIuYworKysgYi9kcml2ZXJzL21pc2MvY3hsL3ZwaGIuYwpAQCAtMjMwLDYgKzIzMCwxMSBAQAogCWlmIChwaGItPmJ1cyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwogCisJLyogU2V0IHJlbGVhc2UgaG9vayBvbiByb290IGJ1cyAqLworCXBjaV9zZXRfaG9zdF9icmlkZ2VfcmVsZWFzZSh0b19wY2lfaG9zdF9icmlkZ2UocGhiLT5idXMtPmJyaWRnZSksCisJCQkJICAgIHBjaWJpb3NfZnJlZV9jb250cm9sbGVyX2RlZmVycmVkLAorCQkJCSAgICAodm9pZCAqKSBwaGIpOworCiAJLyogQ2xhaW0gcmVzb3VyY2VzLiBUaGlzIG1pZ2h0IG5lZWQgc29tZSByZXdvcmsgYXMgd2VsbCBkZXBlbmRpbmcKIAkgKiB3aGV0aGVyIHdlIGFyZSBkb2luZyBwcm9iZS1vbmx5IG9yIG5vdCwgbGlrZSBhc3NpZ25pbmcgdW5hc3NpZ25lZAogCSAqIHJlc291cmNlcyBldGMuLi4KQEAgLTI1Niw3ICsyNjEsMTAgQEAKIAlhZnUtPnBoYiA9IE5VTEw7CiAKIAlwY2lfcmVtb3ZlX3Jvb3RfYnVzKHBoYi0+YnVzKTsKLQlwY2liaW9zX2ZyZWVfY29udHJvbGxlcihwaGIpOworCS8qCisJICogV2UgZG9uJ3QgZnJlZSBwaGIgaGVyZSAtIHRoYXQncyBoYW5kbGVkIGJ5CisJICogcGNpYmlvc19mcmVlX2NvbnRyb2xsZXJfZGVmZXJyZWQoKQorCSAqLwogfQogCiBzdGF0aWMgYm9vbCBfY3hsX3BjaV9pc192cGhiX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNC5jIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI0LmMKaW5kZXggM2NkZjhlMS4uMDUxYjE0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI0LmMKKysrIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI0LmMKQEAgLTU5Myw2ICs1OTMsNyBAQAogCXN0cnVjdCBhdDI0X2RhdGEgKmF0MjQ7CiAJaW50IGVycjsKIAl1bnNpZ25lZCBpLCBudW1fYWRkcmVzc2VzOworCXU4IHRlc3RfYnl0ZTsKIAogCWlmIChjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhKSB7CiAJCWNoaXAgPSAqKHN0cnVjdCBhdDI0X3BsYXRmb3JtX2RhdGEgKiljbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwpAQCAtNzQzLDYgKzc0NCwxOCBAQAogCQl9CiAJfQogCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgYXQyNCk7CisKKwkvKgorCSAqIFBlcmZvcm0gYSBvbmUtYnl0ZSB0ZXN0IHJlYWQgdG8gdmVyaWZ5IHRoYXQgdGhlCisJICogY2hpcCBpcyBmdW5jdGlvbmFsLgorCSAqLworCWVyciA9IGF0MjRfcmVhZChhdDI0LCAwLCAmdGVzdF9ieXRlLCAxKTsKKwlpZiAoZXJyKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2NsaWVudHM7CisJfQorCiAJYXQyNC0+bnZtZW1fY29uZmlnLm5hbWUgPSBkZXZfbmFtZSgmY2xpZW50LT5kZXYpOwogCWF0MjQtPm52bWVtX2NvbmZpZy5kZXYgPSAmY2xpZW50LT5kZXY7CiAJYXQyNC0+bnZtZW1fY29uZmlnLnJlYWRfb25seSA9ICF3cml0YWJsZTsKQEAgLTc2NCw4ICs3NzcsNiBAQAogCQlnb3RvIGVycl9jbGllbnRzOwogCX0KIAotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGF0MjQpOwotCiAJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXUgYnl0ZSAlcyBFRVBST00sICVzLCAldSBieXRlcy93cml0ZVxuIiwKIAkJY2hpcC5ieXRlX2xlbiwgY2xpZW50LT5uYW1lLAogCQl3cml0YWJsZSA/ICJ3cml0YWJsZSIgOiAicmVhZC1vbmx5IiwgYXQyNC0+d3JpdGVfbWF4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lZXByb20vYXQyNS5jIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKaW5kZXggMmM2YzdjOC4uNWFmZTRjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKKysrIGIvZHJpdmVycy9taXNjL2VlcHJvbS9hdDI1LmMKQEAgLTEyMSw5ICsxMjEsOCBAQAogCSAqIHRoaXMgY2hpcCBpcyBjbG9ja2VkIHZlcnkgc2xvd2x5CiAJICovCiAJc3RhdHVzID0gc3BpX3N5bmMoYXQyNS0+c3BpLCAmbSk7Ci0JZGV2X2RiZygmYXQyNS0+c3BpLT5kZXYsCi0JCSJyZWFkICVaZCBieXRlcyBhdCAlZCAtLT4gJWRcbiIsCi0JCWNvdW50LCBvZmZzZXQsIChpbnQpIHN0YXR1cyk7CisJZGV2X2RiZygmYXQyNS0+c3BpLT5kZXYsICJyZWFkICV6dSBieXRlcyBhdCAlZCAtLT4gJXpkXG4iLAorCQljb3VudCwgb2Zmc2V0LCBzdGF0dXMpOwogCiAJbXV0ZXhfdW5sb2NrKCZhdDI1LT5sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTY3LDggKzE2Niw3IEBACiAJCSpjcCA9IEFUMjVfV1JFTjsKIAkJc3RhdHVzID0gc3BpX3dyaXRlKGF0MjUtPnNwaSwgY3AsIDEpOwogCQlpZiAoc3RhdHVzIDwgMCkgewotCQkJZGV2X2RiZygmYXQyNS0+c3BpLT5kZXYsICJXUkVOIC0tPiAlZFxuIiwKLQkJCQkJKGludCkgc3RhdHVzKTsKKwkJCWRldl9kYmcoJmF0MjUtPnNwaS0+ZGV2LCAiV1JFTiAtLT4gJWRcbiIsIHN0YXR1cyk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xOTYsOSArMTk0LDggQEAKIAkJbWVtY3B5KGNwLCBidWYsIHNlZ21lbnQpOwogCQlzdGF0dXMgPSBzcGlfd3JpdGUoYXQyNS0+c3BpLCBib3VuY2UsCiAJCQkJc2VnbWVudCArIGF0MjUtPmFkZHJsZW4gKyAxKTsKLQkJZGV2X2RiZygmYXQyNS0+c3BpLT5kZXYsCi0JCQkJIndyaXRlICV1IGJ5dGVzIGF0ICV1IC0tPiAlZFxuIiwKLQkJCQlzZWdtZW50LCBvZmZzZXQsIChpbnQpIHN0YXR1cyk7CisJCWRldl9kYmcoJmF0MjUtPnNwaS0+ZGV2LCAid3JpdGUgJXUgYnl0ZXMgYXQgJXUgLS0+ICVkXG4iLAorCQkJc2VnbWVudCwgb2Zmc2V0LCBzdGF0dXMpOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWJyZWFrOwogCkBAIC0yMjUsOCArMjIyLDcgQEAKIAogCQlpZiAoKHNyIDwgMCkgfHwgKHNyICYgQVQyNV9TUl9uUkRZKSkgewogCQkJZGV2X2VycigmYXQyNS0+c3BpLT5kZXYsCi0JCQkJIndyaXRlICVkIGJ5dGVzIG9mZnNldCAlZCwgIgotCQkJCSJ0aW1lb3V0IGFmdGVyICV1IG1zZWNzXG4iLAorCQkJCSJ3cml0ZSAldSBieXRlcyBvZmZzZXQgJXUsIHRpbWVvdXQgYWZ0ZXIgJXUgbXNlY3NcbiIsCiAJCQkJc2VnbWVudCwgb2Zmc2V0LAogCQkJCWppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtCiAJCQkJCSh0aW1lb3V0IC0gRUVfVElNRU9VVCkpKTsKQEAgLTM2OCw5ICszNjQsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihhdDI1LT5udm1lbSk7CiAKIAlkZXZfaW5mbygmc3BpLT5kZXYsICIlZCAlcyAlcyBlZXByb20lcywgcGFnZXNpemUgJXVcbiIsCi0JCShjaGlwLmJ5dGVfbGVuIDwgMTAyNCkKLQkJCT8gY2hpcC5ieXRlX2xlbgotCQkJOiAoY2hpcC5ieXRlX2xlbiAvIDEwMjQpLAorCQkoY2hpcC5ieXRlX2xlbiA8IDEwMjQpID8gY2hpcC5ieXRlX2xlbiA6IChjaGlwLmJ5dGVfbGVuIC8gMTAyNCksCiAJCShjaGlwLmJ5dGVfbGVuIDwgMTAyNCkgPyAiQnl0ZSIgOiAiS0J5dGUiLAogCQlhdDI1LT5jaGlwLm5hbWUsCiAJCShjaGlwLmZsYWdzICYgRUVfUkVBRE9OTFkpID8gIiAocmVhZG9ubHkpIiA6ICIiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2Jhc2UuYyBiL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF9iYXNlLmMKaW5kZXggYTcwYjg1My4uNmMxZjQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2Jhc2UuYworKysgYi9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfYmFzZS5jCkBAIC0xMzUxLDYgKzEzNTEsMTkgQEAKIH07CiAKIC8qKgorICogZ2Vud3FlX2Rldm5vZGUoKSAtIFNldCBkZWZhdWx0IGFjY2VzcyBtb2RlIGZvciBnZW53cWUgZGV2aWNlcy4KKyAqCisgKiBEZWZhdWx0IG1vZGUgc2hvdWxkIGJlIHJ3IGZvciBldmVyeWJvZHkuIERvIG5vdCBjaGFuZ2UgZGVmYXVsdAorICogZGV2aWNlIG5hbWUuCisgKi8KK3N0YXRpYyBjaGFyICpnZW53cWVfZGV2bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVtb2RlX3QgKm1vZGUpCit7CisJaWYgKG1vZGUpCisJCSptb2RlID0gMDY2NjsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCiAgKiBnZW53cWVfaW5pdF9tb2R1bGUoKSAtIERyaXZlciByZWdpc3RyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGdlbndxZV9pbml0X21vZHVsZSh2b2lkKQpAQCAtMTM2Myw2ICsxMzc2LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJY2xhc3NfZ2Vud3FlLT5kZXZub2RlID0gZ2Vud3FlX2Rldm5vZGU7CisKIAlkZWJ1Z2ZzX2dlbndxZSA9IGRlYnVnZnNfY3JlYXRlX2RpcihHRU5XUUVfREVWTkFNRSwgTlVMTCk7CiAJaWYgKCFkZWJ1Z2ZzX2dlbndxZSkgewogCQlyYyA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfZGRjYi5jIGIvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX2RkY2IuYwppbmRleCAzNTNlZTBjLi5kZGZlZWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZ2Vud3FlL2NhcmRfZGRjYi5jCisrKyBiL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF9kZGNiLmMKQEAgLTEwNDgsOCArMTA0OCw2IEBACiAJCQkiWyVzXSAqKmVycjogY291bGQgbm90IGFsbG9jYXRlIEREQ0IgKipcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldChxdWV1ZS0+ZGRjYl92YWRkciwgMCwgcXVldWVfc2l6ZSk7Ci0KIAlxdWV1ZS0+ZGRjYl9yZXEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGRjYl9yZXF1ICopICoKIAkJCQkgIHF1ZXVlLT5kZGNiX21heCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFxdWV1ZS0+ZGRjYl9yZXEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9nZW53cWUvY2FyZF91dGlscy5jIGIvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX3V0aWxzLmMKaW5kZXggMjIyMzY3Yy4uOGE2NzllYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX3V0aWxzLmMKKysrIGIvZHJpdmVycy9taXNjL2dlbndxZS9jYXJkX3V0aWxzLmMKQEAgLTIyMCw4ICsyMjAsOCBAQAogCWlmIChnZXRfb3JkZXIoc2l6ZSkgPiBNQVhfT1JERVIpCiAJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIGRtYV9hbGxvY19jb2hlcmVudCgmY2QtPnBjaV9kZXYtPmRldiwgc2l6ZSwgZG1hX2hhbmRsZSwKLQkJCQkgIEdGUF9LRVJORUwpOworCXJldHVybiBkbWFfemFsbG9jX2NvaGVyZW50KCZjZC0+cGNpX2Rldi0+ZGV2LCBzaXplLCBkbWFfaGFuZGxlLAorCQkJCSAgIEdGUF9LRVJORUwpOwogfQogCiB2b2lkIF9fZ2Vud3FlX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgZ2Vud3FlX2RldiAqY2QsIHNpemVfdCBzaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2hwaWxvLmMgYi9kcml2ZXJzL21pc2MvaHBpbG8uYwppbmRleCBkNmE5MDFjLi5mZWE4ZmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaHBpbG8uYworKysgYi9kcml2ZXJzL21pc2MvaHBpbG8uYwpAQCAtNjg4LDcgKzY4OCw4IEBACiAKIHN0YXRpYyBpbnQgaWxvX21hcF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBpbG9faHdpbmZvICpodykKIHsKLQlpbnQgZXJyb3IgPSAtRU5PTUVNOworCWludCBiYXI7CisJdW5zaWduZWQgbG9uZyBvZmY7CiAKIAkvKiBtYXAgdGhlIG1lbW9yeSBtYXBwZWQgaS9vIHJlZ2lzdGVycyAqLwogCWh3LT5tbWlvX3ZhZGRyID0gcGNpX2lvbWFwKHBkZXYsIDEsIDApOwpAQCAtNjk4LDcgKzY5OSwxNSBAQAogCX0KIAogCS8qIG1hcCB0aGUgYWRhcHRlciBzaGFyZWQgbWVtb3J5IHJlZ2lvbiAqLwotCWh3LT5yYW1fdmFkZHIgPSBwY2lfaW9tYXAocGRldiwgMiwgbWF4X2NjYiAqIElMT0hXX0NDQl9TWik7CisJaWYgKHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgwMEU0KSB7CisJCWJhciA9IDU7CisJCS8qIExhc3QgOGsgaXMgcmVzZXJ2ZWQgZm9yIENDQnMgKi8KKwkJb2ZmID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBiYXIpIC0gMHgyMDAwOworCX0gZWxzZSB7CisJCWJhciA9IDI7CisJCW9mZiA9IDA7CisJfQorCWh3LT5yYW1fdmFkZHIgPSBwY2lfaW9tYXBfcmFuZ2UocGRldiwgYmFyLCBvZmYsIG1heF9jY2IgKiBJTE9IV19DQ0JfU1opOwogCWlmIChody0+cmFtX3ZhZGRyID09IE5VTEwpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgbWFwcGluZyBzaGFyZWQgbWVtXG4iKTsKIAkJZ290byBtbWlvX2ZyZWU7CkBAIC03MTcsNyArNzI2LDcgQEAKIG1taW9fZnJlZToKIAlwY2lfaW91bm1hcChwZGV2LCBody0+bW1pb192YWRkcik7CiBvdXQ6Ci0JcmV0dXJuIGVycm9yOworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgdm9pZCBpbG9fcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQpAQCAtODk5LDcgKzkwOCw3IEBACiAJY2xhc3NfZGVzdHJveShpbG9fY2xhc3MpOwogfQogCi1NT0RVTEVfVkVSU0lPTigiMS40LjEiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjUuMCIpOwogTU9EVUxFX0FMSUFTKElMT19OQU1FKTsKIE1PRFVMRV9ERVNDUklQVElPTihJTE9fTkFNRSk7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBBbHRvYmVsbGkgPGRhdmlkLmFsdG9iZWxsaUBocGUuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2xrZHRtX3JvZGF0YS5jIGIvZHJpdmVycy9taXNjL2xrZHRtX3JvZGF0YS5jCmluZGV4IDE2NmIxZGIuLjM1NjQ0NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9sa2R0bV9yb2RhdGEuYworKysgYi9kcml2ZXJzL21pc2MvbGtkdG1fcm9kYXRhLmMKQEAgLTQsNyArNCw3IEBACiAgKi8KICNpbmNsdWRlICJsa2R0bS5oIgogCi12b2lkIGxrZHRtX3JvZGF0YV9kb19ub3RoaW5nKHZvaWQpCit2b2lkIG5vdHJhY2UgbGtkdG1fcm9kYXRhX2RvX25vdGhpbmcodm9pZCkKIHsKIAkvKiBEb2VzIG5vdGhpbmcuIFdlIGp1c3Qgd2FudCBhbiBhcmNoaXRlY3R1cmUgYWdub3N0aWMgInJldHVybiIuICovCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbGtkdG1fdXNlcmNvcHkuYyBiL2RyaXZlcnMvbWlzYy9sa2R0bV91c2VyY29weS5jCmluZGV4IDU1MjVhMjAuLjFkZDYxMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9sa2R0bV91c2VyY29weS5jCisrKyBiL2RyaXZlcnMvbWlzYy9sa2R0bV91c2VyY29weS5jCkBAIC05LDcgKzksMTUgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotc3RhdGljIHNpemVfdCBjYWNoZV9zaXplID0gMTAyNDsKKy8qCisgKiBNYW55IG9mIHRoZSB0ZXN0cyBoZXJlIGVuZCB1cCB1c2luZyBjb25zdCBzaXplcywgYnV0IHRob3NlIHdvdWxkCisgKiBub3JtYWxseSBiZSBpZ25vcmVkIGJ5IGhhcmRlbmVkIHVzZXJjb3B5LCBzbyBmb3JjZSB0aGUgY29tcGlsZXIKKyAqIGludG8gY2hvb3NpbmcgdGhlIG5vbi1jb25zdCBwYXRoIHRvIG1ha2Ugc3VyZSB3ZSB0cmlnZ2VyIHRoZQorICogaGFyZGVuZWQgdXNlcmNvcHkgY2hlY2tzIGJ5IGFkZGVkICJ1bmNvbnN0IiB0byBhbGwgdGhlIGNvbnN0IGNvcGllcywKKyAqIGFuZCBtYWtpbmcgc3VyZSAiY2FjaGVfc2l6ZSIgaXNuJ3Qgb3B0aW1pemVkIGludG8gYSBjb25zdC4KKyAqLworc3RhdGljIHZvbGF0aWxlIHNpemVfdCB1bmNvbnN0ID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBzaXplX3QgY2FjaGVfc2l6ZSA9IDEwMjQ7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJhZF9jYWNoZTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGVzdF90ZXh0W10gPSAiVGhpcyBpcyBhIHRlc3QuXG4iOwpAQCAtNjcsMTQgKzc1LDE0IEBACiAJaWYgKHRvX3VzZXIpIHsKIAkJcHJfaW5mbygiYXR0ZW1wdGluZyBnb29kIGNvcHlfdG9fdXNlciBvZiBsb2NhbCBzdGFja1xuIik7CiAJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopdXNlcl9hZGRyLCBnb29kX3N0YWNrLAotCQkJCSBzaXplb2YoZ29vZF9zdGFjaykpKSB7CisJCQkJIHVuY29uc3QgKyBzaXplb2YoZ29vZF9zdGFjaykpKSB7CiAJCQlwcl93YXJuKCJjb3B5X3RvX3VzZXIgZmFpbGVkIHVuZXhwZWN0ZWRseT8hXG4iKTsKIAkJCWdvdG8gZnJlZV91c2VyOwogCQl9CiAKIAkJcHJfaW5mbygiYXR0ZW1wdGluZyBiYWQgY29weV90b191c2VyIG9mIGRpc3RhbnQgc3RhY2tcbiIpOwogCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKXVzZXJfYWRkciwgYmFkX3N0YWNrLAotCQkJCSBzaXplb2YoZ29vZF9zdGFjaykpKSB7CisJCQkJIHVuY29uc3QgKyBzaXplb2YoZ29vZF9zdGFjaykpKSB7CiAJCQlwcl93YXJuKCJjb3B5X3RvX3VzZXIgZmFpbGVkLCBidXQgbGFja2VkIE9vcHNcbiIpOwogCQkJZ290byBmcmVlX3VzZXI7CiAJCX0KQEAgLTg4LDE0ICs5NiwxNCBAQAogCiAJCXByX2luZm8oImF0dGVtcHRpbmcgZ29vZCBjb3B5X2Zyb21fdXNlciBvZiBsb2NhbCBzdGFja1xuIik7CiAJCWlmIChjb3B5X2Zyb21fdXNlcihnb29kX3N0YWNrLCAodm9pZCBfX3VzZXIgKil1c2VyX2FkZHIsCi0JCQkJICAgc2l6ZW9mKGdvb2Rfc3RhY2spKSkgeworCQkJCSAgIHVuY29uc3QgKyBzaXplb2YoZ29vZF9zdGFjaykpKSB7CiAJCQlwcl93YXJuKCJjb3B5X2Zyb21fdXNlciBmYWlsZWQgdW5leHBlY3RlZGx5PyFcbiIpOwogCQkJZ290byBmcmVlX3VzZXI7CiAJCX0KIAogCQlwcl9pbmZvKCJhdHRlbXB0aW5nIGJhZCBjb3B5X2Zyb21fdXNlciBvZiBkaXN0YW50IHN0YWNrXG4iKTsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGJhZF9zdGFjaywgKHZvaWQgX191c2VyICopdXNlcl9hZGRyLAotCQkJCSAgIHNpemVvZihnb29kX3N0YWNrKSkpIHsKKwkJCQkgICB1bmNvbnN0ICsgc2l6ZW9mKGdvb2Rfc3RhY2spKSkgewogCQkJcHJfd2FybigiY29weV9mcm9tX3VzZXIgZmFpbGVkLCBidXQgbGFja2VkIE9vcHNcbiIpOwogCQkJZ290byBmcmVlX3VzZXI7CiAJCX0KQEAgLTEwOSw3ICsxMTcsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyOwogCXVuc2lnbmVkIGNoYXIgKm9uZSwgKnR3bzsKLQljb25zdCBzaXplX3Qgc2l6ZSA9IDEwMjQ7CisJc2l6ZV90IHNpemUgPSB1bmNvbnN0ICsgMTAyNDsKIAogCW9uZSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJdHdvID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKQEAgLTI4NSwxMyArMjkzLDE0IEBACiAKIAlwcl9pbmZvKCJhdHRlbXB0aW5nIGdvb2QgY29weV90b191c2VyIGZyb20ga2VybmVsIHJvZGF0YVxuIik7CiAJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKil1c2VyX2FkZHIsIHRlc3RfdGV4dCwKLQkJCSBzaXplb2YodGVzdF90ZXh0KSkpIHsKKwkJCSB1bmNvbnN0ICsgc2l6ZW9mKHRlc3RfdGV4dCkpKSB7CiAJCXByX3dhcm4oImNvcHlfdG9fdXNlciBmYWlsZWQgdW5leHBlY3RlZGx5PyFcbiIpOwogCQlnb3RvIGZyZWVfdXNlcjsKIAl9CiAKIAlwcl9pbmZvKCJhdHRlbXB0aW5nIGJhZCBjb3B5X3RvX3VzZXIgZnJvbSBrZXJuZWwgdGV4dFxuIik7Ci0JaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKil1c2VyX2FkZHIsIHZtX21tYXAsIFBBR0VfU0laRSkpIHsKKwlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKXVzZXJfYWRkciwgdm1fbW1hcCwKKwkJCSB1bmNvbnN0ICsgUEFHRV9TSVpFKSkgewogCQlwcl93YXJuKCJjb3B5X3RvX3VzZXIgZmFpbGVkLCBidXQgbGFja2VkIE9vcHNcbiIpOwogCQlnb3RvIGZyZWVfdXNlcjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jIGIvZHJpdmVycy9taXNjL21laS9hbXRoaWYuYwppbmRleCBhMDM5YTVkLi43YWU4OWI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvYW10aGlmLmMKQEAgLTQ3LDcgKzQ3LDYgQEAKIHZvaWQgbWVpX2FtdGhpZl9yZXNldF9wYXJhbXMoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKIAkvKiByZXNldCBpYW10aGlmIHBhcmFtZXRlcnMuICovCi0JZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IgPSBOVUxMOwogCWRldi0+aWFtdGhpZl9jYW5jZWxlZCA9IGZhbHNlOwogCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX0lETEU7CiAJZGV2LT5pYW10aGlmX3N0YWxsX3RpbWVyID0gMDsKQEAgLTY3LDggKzY2LDEyIEBACiAJc3RydWN0IG1laV9jbCAqY2wgPSAmZGV2LT5pYW10aGlmX2NsOwogCWludCByZXQ7CiAKLQlpZiAobWVpX2NsX2lzX2Nvbm5lY3RlZChjbCkpCi0JCXJldHVybiAwOworCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCisJaWYgKG1laV9jbF9pc19jb25uZWN0ZWQoY2wpKSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KIAogCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX0lETEU7CiAKQEAgLTc3LDE3OSArODAsMzcgQEAKIAlyZXQgPSBtZWlfY2xfbGluayhjbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihkZXYtPmRldiwgImFtdGhpZjogZmFpbGVkIGNsX2xpbmsgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCXJldCA9IG1laV9jbF9jb25uZWN0KGNsLCBtZV9jbCwgTlVMTCk7CiAKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIG1laV9hbXRoaWZfcmVhZCAtIHJlYWQgZGF0YSBmcm9tIEFNVEhJRiBjbGllbnQKLSAqCi0gKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQotICogQGZpbGU6IHBvaW50ZXIgdG8gZmlsZSBvYmplY3QKLSAqIEB1YnVmOiBwb2ludGVyIHRvIHVzZXIgZGF0YSBpbiB1c2VyIHNwYWNlCi0gKiBAbGVuZ3RoOiBkYXRhIGxlbmd0aCB0byByZWFkCi0gKiBAb2Zmc2V0OiBkYXRhIHJlYWQgb2Zmc2V0Ci0gKgotICogTG9ja2luZzogY2FsbGVkIHVuZGVyICJkZXYtPmRldmljZV9sb2NrIiBsb2NrCi0gKgotICogUmV0dXJuOgotICogIHJldHVybmVkIGRhdGEgbGVuZ3RoIG9uIHN1Y2Nlc3MsCi0gKiAgemVybyBpZiBubyBkYXRhIHRvIHJlYWQsCi0gKiAgbmVnYXRpdmUgb24gZmFpbHVyZS4KLSAqLwotaW50IG1laV9hbXRoaWZfcmVhZChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkgICAgICAgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBsZW5ndGgsIGxvZmZfdCAqb2Zmc2V0KQotewotCXN0cnVjdCBtZWlfY2wgKmNsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwotCWludCByZXRzOwotCWludCB3YWl0X3JldDsKLQotCWRldl9kYmcoZGV2LT5kZXYsICJjaGVja2luZyBhbXRoaWYgZGF0YVxuIik7Ci0JY2IgPSBtZWlfY2xfcmVhZF9jYihjbCwgZmlsZSk7Ci0KLQkvKiBDaGVjayBmb3IgaWYgd2UgY2FuIGJsb2NrIG9yIG5vdCovCi0JaWYgKGNiID09IE5VTEwgJiYgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCi0JCXJldHVybiAtRUFHQUlOOwotCi0KLQlkZXZfZGJnKGRldi0+ZGV2LCAid2FpdGluZyBmb3IgYW10aGlmIGRhdGFcbiIpOwotCXdoaWxlIChjYiA9PSBOVUxMKSB7Ci0JCS8qIHVubG9jayB0aGUgTXV0ZXggKi8KLQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKLQotCQl3YWl0X3JldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjbC0+cnhfd2FpdCwKLQkJCQkJIWxpc3RfZW1wdHkoJmNsLT5yZF9jb21wbGV0ZWQpIHx8Ci0JCQkJCSFtZWlfY2xfaXNfY29ubmVjdGVkKGNsKSk7Ci0KLQkJLyogTG9ja2luZyBhZ2FpbiB0aGUgTXV0ZXggKi8KLQkJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7Ci0KLQkJaWYgKHdhaXRfcmV0KQotCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQotCQlpZiAoIW1laV9jbF9pc19jb25uZWN0ZWQoY2wpKSB7Ci0JCQlyZXRzID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQljYiA9IG1laV9jbF9yZWFkX2NiKGNsLCBmaWxlKTsKLQl9Ci0KLQlpZiAoY2ItPnN0YXR1cykgewotCQlyZXRzID0gY2ItPnN0YXR1czsKLQkJZGV2X2RiZyhkZXYtPmRldiwgInJlYWQgb3BlcmF0aW9uIGZhaWxlZCAlZFxuIiwgcmV0cyk7Ci0JCWdvdG8gZnJlZTsKLQl9Ci0KLQlkZXZfZGJnKGRldi0+ZGV2LCAiR290IGFtdGhpZiBkYXRhXG4iKTsKLQkvKiBpZiB0aGUgd2hvbGUgbWVzc2FnZSB3aWxsIGZpdCByZW1vdmUgaXQgZnJvbSB0aGUgbGlzdCAqLwotCWlmIChjYi0+YnVmX2lkeCA+PSAqb2Zmc2V0ICYmIGxlbmd0aCA+PSAoY2ItPmJ1Zl9pZHggLSAqb2Zmc2V0KSkKLQkJbGlzdF9kZWxfaW5pdCgmY2ItPmxpc3QpOwotCWVsc2UgaWYgKGNiLT5idWZfaWR4IDw9ICpvZmZzZXQpIHsKLQkJLyogZW5kIG9mIHRoZSBtZXNzYWdlIGhhcyBiZWVuIHJlYWNoZWQgKi8KLQkJbGlzdF9kZWxfaW5pdCgmY2ItPmxpc3QpOwotCQlyZXRzID0gMDsKLQkJZ290byBmcmVlOwotCX0KLQkJLyogZWxzZSBtZWFucyB0aGF0IG5vdCBmdWxsIGJ1ZmZlciB3aWxsIGJlIHJlYWQgYW5kIGRvIG5vdAotCQkgKiByZW1vdmUgbWVzc2FnZSBmcm9tIGRlbGV0aW9uIGxpc3QKLQkJICovCi0KLQlkZXZfZGJnKGRldi0+ZGV2LCAiYW10aGlmIGNiLT5idWYuc2l6ZSAtICV6dSBjYi0+YnVmX2lkeCAtICV6dVxuIiwKLQkJY2ItPmJ1Zi5zaXplLCBjYi0+YnVmX2lkeCk7Ci0KLQkvKiBsZW5ndGggaXMgYmVpbmcgdHJ1bmNhdGVkIHRvIFBBR0VfU0laRSwgaG93ZXZlciwKLQkgKiB0aGUgYnVmX2lkeCBtYXkgcG9pbnQgYmV5b25kICovCi0JbGVuZ3RoID0gbWluX3Qoc2l6ZV90LCBsZW5ndGgsIChjYi0+YnVmX2lkeCAtICpvZmZzZXQpKTsKLQotCWlmIChjb3B5X3RvX3VzZXIodWJ1ZiwgY2ItPmJ1Zi5kYXRhICsgKm9mZnNldCwgbGVuZ3RoKSkgewotCQlkZXZfZGJnKGRldi0+ZGV2LCAiZmFpbGVkIHRvIGNvcHkgZGF0YSB0byB1c2VybGFuZFxuIik7Ci0JCXJldHMgPSAtRUZBVUxUOwotCX0gZWxzZSB7Ci0JCXJldHMgPSBsZW5ndGg7Ci0JCWlmICgoKm9mZnNldCArIGxlbmd0aCkgPCBjYi0+YnVmX2lkeCkgewotCQkJKm9mZnNldCArPSBsZW5ndGg7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLWZyZWU6Ci0JZGV2X2RiZyhkZXYtPmRldiwgImZyZWUgYW10aGlmIGNiIG1lbW9yeS5cbiIpOwotCSpvZmZzZXQgPSAwOwotCW1laV9pb19jYl9mcmVlKGNiKTsKIG91dDoKLQlyZXR1cm4gcmV0czsKKwltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCXJldHVybiByZXQ7CiB9CiAKIC8qKgogICogbWVpX2FtdGhpZl9yZWFkX3N0YXJ0IC0gcXVldWUgbWVzc2FnZSBmb3Igc2VuZGluZyByZWFkIGNyZWRlbnRpYWwKICAqCiAgKiBAY2w6IGhvc3QgY2xpZW50Ci0gKiBAZmlsZTogZmlsZSBwb2ludGVyIG9mIG1lc3NhZ2UgcmVjaXBpZW50CisgKiBAZnA6IGZpbGUgcG9pbnRlciBvZiBtZXNzYWdlIHJlY2lwaWVudAogICoKICAqIFJldHVybjogMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgaW50IG1laV9hbXRoaWZfcmVhZF9zdGFydChzdHJ1Y3QgbWVpX2NsICpjbCwgY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IG1laV9hbXRoaWZfcmVhZF9zdGFydChzdHJ1Y3QgbWVpX2NsICpjbCwgY29uc3Qgc3RydWN0IGZpbGUgKmZwKQogewogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjbC0+ZGV2OwogCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwotCWludCByZXRzOwogCi0JY2IgPSBtZWlfaW9fY2JfaW5pdChjbCwgTUVJX0ZPUF9SRUFELCBmaWxlKTsKLQlpZiAoIWNiKSB7Ci0JCXJldHMgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9CisJY2IgPSBtZWlfY2xfZW5xdWV1ZV9jdHJsX3dyX2NiKGNsLCBtZWlfY2xfbXR1KGNsKSwgTUVJX0ZPUF9SRUFELCBmcCk7CisJaWYgKCFjYikKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXRzID0gbWVpX2lvX2NiX2FsbG9jX2J1ZihjYiwgbWVpX2NsX210dShjbCkpOwotCWlmIChyZXRzKQotCQlnb3RvIGVycjsKLQotCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmZGV2LT5jdHJsX3dyX2xpc3QubGlzdCk7CisJY2wtPnJ4X2Zsb3dfY3RybF9jcmVkcysrOwogCiAJZGV2LT5pYW10aGlmX3N0YXRlID0gTUVJX0lBTVRISUZfUkVBRElORzsKLQlkZXYtPmlhbXRoaWZfZnAgPSBjYi0+ZnA7Ci0JZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IgPSBjYjsKLQotCXJldHVybiAwOwotZXJyOgotCW1laV9pb19jYl9mcmVlKGNiKTsKLQlyZXR1cm4gcmV0czsKLX0KLQotLyoqCi0gKiBtZWlfYW10aGlmX3NlbmRfY21kIC0gc2VuZCBhbXRoaWYgY29tbWFuZCB0byB0aGUgTUUKLSAqCi0gKiBAY2w6IHRoZSBob3N0IGNsaWVudAotICogQGNiOiBtZWkgY2FsbCBiYWNrIHN0cnVjdAotICoKLSAqIFJldHVybjogMCBvbiBzdWNjZXNzLCA8MCBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50IG1laV9hbXRoaWZfc2VuZF9jbWQoc3RydWN0IG1laV9jbCAqY2wsIHN0cnVjdCBtZWlfY2xfY2IgKmNiKQotewotCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7Ci0JaW50IHJldDsKLQotCWlmICghY2wtPmRldiB8fCAhY2IpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZGV2ID0gY2wtPmRldjsKLQotCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX1dSSVRJTkc7Ci0JZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IgPSBjYjsKLQlkZXYtPmlhbXRoaWZfZnAgPSBjYi0+ZnA7Ci0JZGV2LT5pYW10aGlmX2NhbmNlbGVkID0gZmFsc2U7Ci0KLQlyZXQgPSBtZWlfY2xfd3JpdGUoY2wsIGNiLCBmYWxzZSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoY2ItPmNvbXBsZXRlZCkKLQkJY2ItPnN0YXR1cyA9IG1laV9hbXRoaWZfcmVhZF9zdGFydChjbCwgY2ItPmZwKTsKKwljbC0+ZnAgPSBjYi0+ZnA7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI2NSwyMCArMTI2LDMyIEBACiB7CiAJc3RydWN0IG1laV9jbCAqY2wgPSAmZGV2LT5pYW10aGlmX2NsOwogCXN0cnVjdCBtZWlfY2xfY2IgKmNiOworCWludCByZXQ7CiAKIAlkZXYtPmlhbXRoaWZfY2FuY2VsZWQgPSBmYWxzZTsKLQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOwotCWRldi0+aWFtdGhpZl9mcCA9IE5VTEw7CiAKIAlkZXZfZGJnKGRldi0+ZGV2LCAiY29tcGxldGUgYW10aGlmIGNtZF9saXN0IGNiLlxuIik7CiAKIAljYiA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZGV2LT5hbXRoaWZfY21kX2xpc3QubGlzdCwKIAkJCQkJdHlwZW9mKCpjYiksIGxpc3QpOwotCWlmICghY2IpCisJaWYgKCFjYikgeworCQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOworCQljbC0+ZnAgPSBOVUxMOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlsaXN0X2RlbF9pbml0KCZjYi0+bGlzdCk7Ci0JcmV0dXJuIG1laV9hbXRoaWZfc2VuZF9jbWQoY2wsIGNiKTsKKwlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9XUklUSU5HOworCWNsLT5mcCA9IGNiLT5mcDsKKworCXJldCA9IG1laV9jbF93cml0ZShjbCwgY2IsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChjYi0+Y29tcGxldGVkKQorCQljYi0+c3RhdHVzID0gbWVpX2FtdGhpZl9yZWFkX3N0YXJ0KGNsLCBjYi0+ZnApOworCisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMjk5LDggKzE3Miw3IEBACiAJLyoKIAkgKiBUaGUgcHJldmlvdXMgcmVxdWVzdCBpcyBzdGlsbCBpbiBwcm9jZXNzaW5nLCBxdWV1ZSB0aGlzIG9uZS4KIAkgKi8KLQlpZiAoZGV2LT5pYW10aGlmX3N0YXRlID4gTUVJX0lBTVRISUZfSURMRSAmJgotCSAgICBkZXYtPmlhbXRoaWZfc3RhdGUgPCBNRUlfSUFNVEhJRl9SRUFEX0NPTVBMRVRFKQorCWlmIChkZXYtPmlhbXRoaWZfc3RhdGUgIT0gTUVJX0lBTVRISUZfSURMRSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gbWVpX2FtdGhpZl9ydW5fbmV4dF9jbWQoZGV2KTsKQEAgLTMwOSw3ICsxODEsNiBAQAogLyoqCiAgKiBtZWlfYW10aGlmX3BvbGwgLSB0aGUgYW10aGlmIHBvbGwgZnVuY3Rpb24KICAqCi0gKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQogICogQGZpbGU6IHBvaW50ZXIgdG8gZmlsZSBzdHJ1Y3R1cmUKICAqIEB3YWl0OiBwb2ludGVyIHRvIHBvbGxfdGFibGUgc3RydWN0dXJlCiAgKgpAQCAtMzE3LDI2ICsxODgsMTkgQEAKICAqCiAgKiBMb2NraW5nOiBjYWxsZWQgdW5kZXIgImRldi0+ZGV2aWNlX2xvY2siIGxvY2sKICAqLwotCi11bnNpZ25lZCBpbnQgbWVpX2FtdGhpZl9wb2xsKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQordW5zaWduZWQgaW50IG1laV9hbXRoaWZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKKwlzdHJ1Y3QgbWVpX2NsICpjbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbWVpX2NsX2NiICpjYiA9IG1laV9jbF9yZWFkX2NiKGNsLCBmaWxlKTsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKLQlwb2xsX3dhaXQoZmlsZSwgJmRldi0+aWFtdGhpZl9jbC5yeF93YWl0LCB3YWl0KTsKLQotCWlmIChkZXYtPmlhbXRoaWZfc3RhdGUgPT0gTUVJX0lBTVRISUZfUkVBRF9DT01QTEVURSAmJgotCSAgICBkZXYtPmlhbXRoaWZfZnAgPT0gZmlsZSkgewotCisJcG9sbF93YWl0KGZpbGUsICZjbC0+cnhfd2FpdCwgd2FpdCk7CisJaWYgKGNiKQogCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0JCW1laV9hbXRoaWZfcnVuX25leHRfY21kKGRldik7Ci0JfQogCiAJcmV0dXJuIG1hc2s7CiB9CiAKLQotCiAvKioKICAqIG1laV9hbXRoaWZfaXJxX3dyaXRlIC0gd3JpdGUgaWFtdGhpZiBjb21tYW5kIGluIGlycSB0aHJlYWQgY29udGV4dC4KICAqCkBAIC0zOTMsNyArMjU3LDYgQEAKIAkJcmV0dXJuIDA7CiAKIAlkZXZfZGJnKGRldi0+ZGV2LCAiY29tcGxldGVkIGFtdGhpZiByZWFkLlxuICIpOwotCWRldi0+aWFtdGhpZl9jdXJyZW50X2NiID0gTlVMTDsKIAlkZXYtPmlhbXRoaWZfc3RhbGxfdGltZXIgPSAwOwogCiAJcmV0dXJuIDA7CkBAIC00MDksMTE1ICsyNzIsNjMgQEAKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gY2wtPmRldjsKIAotCWlmIChjYi0+Zm9wX3R5cGUgPT0gTUVJX0ZPUF9XUklURSkgeworCWRldl9kYmcoZGV2LT5kZXYsICJjb21wbGV0aW5nIGFtdGhpZiBjYWxsIGJhY2suXG4iKTsKKwlzd2l0Y2ggKGNiLT5mb3BfdHlwZSkgeworCWNhc2UgTUVJX0ZPUF9XUklURToKIAkJaWYgKCFjYi0+c3RhdHVzKSB7CiAJCQlkZXYtPmlhbXRoaWZfc3RhbGxfdGltZXIgPSBNRUlfSUFNVEhJRl9TVEFMTF9USU1FUjsKKwkJCW1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihkZXYpOwogCQkJbWVpX2lvX2NiX2ZyZWUoY2IpOwogCQkJcmV0dXJuOwogCQl9Ci0JCS8qCi0JCSAqIGluIGNhc2Ugb2YgZXJyb3IgZW5xdWV1ZSB0aGUgd3JpdGUgY2IgdG8gY29tcGxldGUgcmVhZCBsaXN0Ci0JCSAqIHNvIGl0IGNhbiBiZSBwcm9wYWdhdGVkIHRvIHRoZSByZWFkZXIKLQkJICovCi0JCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX2NvbXBsZXRlZCk7Ci0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2wtPnJ4X3dhaXQpOwotCQlyZXR1cm47Ci0JfQorCQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOworCQljbC0+ZnAgPSBOVUxMOworCQlpZiAoIWRldi0+aWFtdGhpZl9jYW5jZWxlZCkgeworCQkJLyoKKwkJCSAqIGluIGNhc2Ugb2YgZXJyb3IgZW5xdWV1ZSB0aGUgd3JpdGUgY2IgdG8gY29tcGxldGUKKwkJCSAqIHJlYWQgbGlzdCBzbyBpdCBjYW4gYmUgcHJvcGFnYXRlZCB0byB0aGUgcmVhZGVyCisJCQkgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX2NvbXBsZXRlZCk7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNsLT5yeF93YWl0KTsKKwkJfSBlbHNlIHsKKwkJCW1laV9pb19jYl9mcmVlKGNiKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE1FSV9GT1BfUkVBRDoKKwkJaWYgKCFkZXYtPmlhbXRoaWZfY2FuY2VsZWQpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX2NvbXBsZXRlZCk7CisJCQlkZXZfZGJnKGRldi0+ZGV2LCAiYW10aGlmIHJlYWQgY29tcGxldGVkXG4iKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2wtPnJ4X3dhaXQpOworCQl9IGVsc2UgeworCQkJbWVpX2lvX2NiX2ZyZWUoY2IpOworCQl9CiAKLQlpZiAoIWRldi0+aWFtdGhpZl9jYW5jZWxlZCkgewotCQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9SRUFEX0NPTVBMRVRFOwogCQlkZXYtPmlhbXRoaWZfc3RhbGxfdGltZXIgPSAwOwotCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmNsLT5yZF9jb21wbGV0ZWQpOwotCQlkZXZfZGJnKGRldi0+ZGV2LCAiYW10aGlmIHJlYWQgY29tcGxldGVkXG4iKTsKLQl9IGVsc2UgewogCQltZWlfYW10aGlmX3J1bl9uZXh0X2NtZChkZXYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOwogCX0KLQotCWRldl9kYmcoZGV2LT5kZXYsICJjb21wbGV0aW5nIGFtdGhpZiBjYWxsIGJhY2suXG4iKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNsLT5yeF93YWl0KTsKIH0KIAogLyoqCiAgKiBtZWlfY2xlYXJfbGlzdCAtIHJlbW92ZXMgYWxsIGNhbGxiYWNrcyBhc3NvY2lhdGVkIHdpdGggZmlsZQogICoJCWZyb20gbWVpX2NiX2xpc3QKICAqCi0gKiBAZGV2OiBkZXZpY2Ugc3RydWN0dXJlLgogICogQGZpbGU6IGZpbGUgc3RydWN0dXJlCiAgKiBAbWVpX2NiX2xpc3Q6IGNhbGxiYWNrcyBsaXN0CiAgKgogICogbWVpX2NsZWFyX2xpc3QgaXMgY2FsbGVkIHRvIGNsZWFyIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggZmlsZQogICogd2hlbiBhcHBsaWNhdGlvbiBjYWxscyBjbG9zZSBmdW5jdGlvbiBvciBDdHJsLUMgd2FzIHByZXNzZWQKLSAqCi0gKiBSZXR1cm46IHRydWUgaWYgY2FsbGJhY2sgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LCBmYWxzZSBvdGhlcndpc2UKICAqLwotc3RhdGljIGJvb2wgbWVpX2NsZWFyX2xpc3Qoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKLQkJY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBsaXN0X2hlYWQgKm1laV9jYl9saXN0KQorc3RhdGljIHZvaWQgbWVpX2NsZWFyX2xpc3QoY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICptZWlfY2JfbGlzdCkKIHsKLQlzdHJ1Y3QgbWVpX2NsICpjbCA9ICZkZXYtPmlhbXRoaWZfY2w7CiAJc3RydWN0IG1laV9jbF9jYiAqY2IsICpuZXh0OwotCWJvb2wgcmVtb3ZlZCA9IGZhbHNlOwogCi0JLyogbGlzdCBhbGwgbGlzdCBtZW1iZXIgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2IsIG5leHQsIG1laV9jYl9saXN0LCBsaXN0KSB7Ci0JCS8qIGNoZWNrIGlmIGxpc3QgbWVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUgKi8KLQkJaWYgKGZpbGUgPT0gY2ItPmZwKSB7Ci0JCQkvKiBjaGVjayBpZiBjYiBlcXVhbCB0byBjdXJyZW50IGlhbXRoaWYgY2IgKi8KLQkJCWlmIChkZXYtPmlhbXRoaWZfY3VycmVudF9jYiA9PSBjYikgewotCQkJCWRldi0+aWFtdGhpZl9jdXJyZW50X2NiID0gTlVMTDsKLQkJCQkvKiBzZW5kIGZsb3cgY29udHJvbCB0byBpYW10aGlmIGNsaWVudCAqLwotCQkJCW1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcShkZXYsIGNsKTsKLQkJCX0KLQkJCS8qIGZyZWUgYWxsIGFsbG9jYXRlZCBidWZmZXJzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNiLCBuZXh0LCBtZWlfY2JfbGlzdCwgbGlzdCkKKwkJaWYgKGZpbGUgPT0gY2ItPmZwKQogCQkJbWVpX2lvX2NiX2ZyZWUoY2IpOwotCQkJcmVtb3ZlZCA9IHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlbW92ZWQ7Ci19Ci0KLS8qKgotICogbWVpX2NsZWFyX2xpc3RzIC0gcmVtb3ZlcyBhbGwgY2FsbGJhY2tzIGFzc29jaWF0ZWQgd2l0aCBmaWxlCi0gKgotICogQGRldjogZGV2aWNlIHN0cnVjdHVyZQotICogQGZpbGU6IGZpbGUgc3RydWN0dXJlCi0gKgotICogbWVpX2NsZWFyX2xpc3RzIGlzIGNhbGxlZCB0byBjbGVhciByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIGZpbGUKLSAqIHdoZW4gYXBwbGljYXRpb24gY2FsbHMgY2xvc2UgZnVuY3Rpb24gb3IgQ3RybC1DIHdhcyBwcmVzc2VkCi0gKgotICogUmV0dXJuOiB0cnVlIGlmIGNhbGxiYWNrIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCwgZmFsc2Ugb3RoZXJ3aXNlCi0gKi8KLXN0YXRpYyBib29sIG1laV9jbGVhcl9saXN0cyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlib29sIHJlbW92ZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgbWVpX2NsICpjbCA9ICZkZXYtPmlhbXRoaWZfY2w7Ci0KLQkvKiByZW1vdmUgY2FsbGJhY2tzIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUgKi8KLQltZWlfY2xlYXJfbGlzdChkZXYsIGZpbGUsICZkZXYtPmFtdGhpZl9jbWRfbGlzdC5saXN0KTsKLQlpZiAobWVpX2NsZWFyX2xpc3QoZGV2LCBmaWxlLCAmY2wtPnJkX2NvbXBsZXRlZCkpCi0JCXJlbW92ZWQgPSB0cnVlOwotCi0JbWVpX2NsZWFyX2xpc3QoZGV2LCBmaWxlLCAmZGV2LT5jdHJsX3JkX2xpc3QubGlzdCk7Ci0KLQlpZiAobWVpX2NsZWFyX2xpc3QoZGV2LCBmaWxlLCAmZGV2LT5jdHJsX3dyX2xpc3QubGlzdCkpCi0JCXJlbW92ZWQgPSB0cnVlOwotCi0JaWYgKG1laV9jbGVhcl9saXN0KGRldiwgZmlsZSwgJmRldi0+d3JpdGVfd2FpdGluZ19saXN0Lmxpc3QpKQotCQlyZW1vdmVkID0gdHJ1ZTsKLQotCWlmIChtZWlfY2xlYXJfbGlzdChkZXYsIGZpbGUsICZkZXYtPndyaXRlX2xpc3QubGlzdCkpCi0JCXJlbW92ZWQgPSB0cnVlOwotCi0JLyogY2hlY2sgaWYgaWFtdGhpZl9jdXJyZW50X2NiIG5vdCBOVUxMICovCi0JaWYgKGRldi0+aWFtdGhpZl9jdXJyZW50X2NiICYmICFyZW1vdmVkKSB7Ci0JCS8qIGNoZWNrIGZpbGUgYW5kIGlhbXRoaWYgY3VycmVudCBjYiBhc3NvY2lhdGlvbiAqLwotCQlpZiAoZGV2LT5pYW10aGlmX2N1cnJlbnRfY2ItPmZwID09IGZpbGUpIHsKLQkJCS8qIHJlbW92ZSBjYiAqLwotCQkJbWVpX2lvX2NiX2ZyZWUoZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IpOwotCQkJZGV2LT5pYW10aGlmX2N1cnJlbnRfY2IgPSBOVUxMOwotCQkJcmVtb3ZlZCA9IHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlbW92ZWQ7CiB9CiAKIC8qKgpAQCAtNTMwLDIzICszNDEsMjEgQEAKICovCiBpbnQgbWVpX2FtdGhpZl9yZWxlYXNlKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQogeworCXN0cnVjdCBtZWlfY2wgKmNsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCiAJaWYgKGRldi0+aWFtdGhpZl9vcGVuX2NvdW50ID4gMCkKIAkJZGV2LT5pYW10aGlmX29wZW5fY291bnQtLTsKIAotCWlmIChkZXYtPmlhbXRoaWZfZnAgPT0gZmlsZSAmJgotCSAgICBkZXYtPmlhbXRoaWZfc3RhdGUgIT0gTUVJX0lBTVRISUZfSURMRSkgeworCWlmIChjbC0+ZnAgPT0gZmlsZSAmJiBkZXYtPmlhbXRoaWZfc3RhdGUgIT0gTUVJX0lBTVRISUZfSURMRSkgewogCiAJCWRldl9kYmcoZGV2LT5kZXYsICJhbXRoaWYgY2FuY2VsZWQgaWFtdGhpZiBzdGF0ZSAlZFxuIiwKIAkJICAgIGRldi0+aWFtdGhpZl9zdGF0ZSk7CiAJCWRldi0+aWFtdGhpZl9jYW5jZWxlZCA9IHRydWU7Ci0JCWlmIChkZXYtPmlhbXRoaWZfc3RhdGUgPT0gTUVJX0lBTVRISUZfUkVBRF9DT01QTEVURSkgewotCQkJZGV2X2RiZyhkZXYtPmRldiwgInJ1biBuZXh0IGFtdGhpZiBpYW10aGlmIGNiXG4iKTsKLQkJCW1laV9hbXRoaWZfcnVuX25leHRfY21kKGRldik7Ci0JCX0KIAl9CiAKLQlpZiAobWVpX2NsZWFyX2xpc3RzKGRldiwgZmlsZSkpCi0JCWRldi0+aWFtdGhpZl9zdGF0ZSA9IE1FSV9JQU1USElGX0lETEU7CisJbWVpX2NsZWFyX2xpc3QoZmlsZSwgJmRldi0+YW10aGlmX2NtZF9saXN0Lmxpc3QpOworCW1laV9jbGVhcl9saXN0KGZpbGUsICZjbC0+cmRfY29tcGxldGVkKTsKKwltZWlfY2xlYXJfbGlzdChmaWxlLCAmZGV2LT5jdHJsX3JkX2xpc3QubGlzdCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvYnVzLmMgYi9kcml2ZXJzL21pc2MvbWVpL2J1cy5jCmluZGV4IDFmMzNmZWEuLjhjYWM3ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvYnVzLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9idXMuYwpAQCAtMTI2LDcgKzEyNiw4IEBACiAJCWdvdG8gb3V0OwogCiAJLyogd2FpdCBvbiBldmVudCBvbmx5IGlmIHRoZXJlIGlzIG5vIG90aGVyIHdhaXRlciAqLwotCWlmIChsaXN0X2VtcHR5KCZjbC0+cmRfY29tcGxldGVkKSAmJiAhd2FpdHF1ZXVlX2FjdGl2ZSgmY2wtPnJ4X3dhaXQpKSB7CisJLyogc3luY2hyb25pemVkIHVuZGVyIGRldmljZSBtdXRleCAqLworCWlmICghd2FpdHF1ZXVlX2FjdGl2ZSgmY2wtPnJ4X3dhaXQpKSB7CiAKIAkJbXV0ZXhfdW5sb2NrKCZidXMtPmRldmljZV9sb2NrKTsKIApAQCAtMTQyLDcgKzE0Myw3IEBACiAJCW11dGV4X2xvY2soJmJ1cy0+ZGV2aWNlX2xvY2spOwogCiAJCWlmICghbWVpX2NsX2lzX2Nvbm5lY3RlZChjbCkpIHsKLQkJCXJldHMgPSAtRUJVU1k7CisJCQlyZXRzID0gLUVOT0RFVjsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtMjM0LDcgKzIzNSw3IEBACiAJLyogUHJlcGFyZSBmb3IgdGhlIG5leHQgcmVhZCAqLwogCWlmIChjbGRldi0+ZXZlbnRzX21hc2sgJiBCSVQoTUVJX0NMX0VWRU5UX1JYKSkgewogCQltdXRleF9sb2NrKCZidXMtPmRldmljZV9sb2NrKTsKLQkJbWVpX2NsX3JlYWRfc3RhcnQoY2xkZXYtPmNsLCAwLCBOVUxMKTsKKwkJbWVpX2NsX3JlYWRfc3RhcnQoY2xkZXYtPmNsLCBtZWlfY2xfbXR1KGNsZGV2LT5jbCksIE5VTEwpOwogCQltdXRleF91bmxvY2soJmJ1cy0+ZGV2aWNlX2xvY2spOwogCX0KIH0KQEAgLTMyNCw3ICszMjUsNyBAQAogCiAJaWYgKGNsZGV2LT5ldmVudHNfbWFzayAmIEJJVChNRUlfQ0xfRVZFTlRfUlgpKSB7CiAJCW11dGV4X2xvY2soJmJ1cy0+ZGV2aWNlX2xvY2spOwotCQlyZXQgPSBtZWlfY2xfcmVhZF9zdGFydChjbGRldi0+Y2wsIDAsIE5VTEwpOworCQlyZXQgPSBtZWlfY2xfcmVhZF9zdGFydChjbGRldi0+Y2wsIG1laV9jbF9tdHUoY2xkZXYtPmNsKSwgTlVMTCk7CiAJCW11dGV4X3VubG9jaygmYnVzLT5kZXZpY2VfbG9jayk7CiAJCWlmIChyZXQgJiYgcmV0ICE9IC1FQlVTWSkKIAkJCXJldHVybiByZXQ7CkBAIC05ODMsMTIgKzk4NCwxMCBAQAogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1laV9kZXZpY2UsIGJ1c19yZXNjYW5fd29yayk7CiAJc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsOwogCi0JbXV0ZXhfbG9jaygmYnVzLT5kZXZpY2VfbG9jayk7CiAJbWVfY2wgPSBtZWlfbWVfY2xfYnlfdXVpZChidXMsICZtZWlfYW10aGlmX2d1aWQpOwogCWlmIChtZV9jbCkKIAkJbWVpX2FtdGhpZl9ob3N0X2luaXQoYnVzLCBtZV9jbCk7CiAJbWVpX21lX2NsX3B1dChtZV9jbCk7Ci0JbXV0ZXhfdW5sb2NrKCZidXMtPmRldmljZV9sb2NrKTsKIAogCW1laV9jbF9idXNfcmVzY2FuKGJ1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5jIGIvZHJpdmVycy9taXNjL21laS9jbGllbnQuYwppbmRleCA2NDFjMWE1Li42ZmUwMjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmMKQEAgLTM1OCw4ICszNTgsOSBAQAogICoKICAqIFJldHVybjogbWVpX2NsX2NiIHBvaW50ZXIgb3IgTlVMTDsKICAqLwotc3RydWN0IG1laV9jbF9jYiAqbWVpX2lvX2NiX2luaXQoc3RydWN0IG1laV9jbCAqY2wsIGVudW0gbWVpX2NiX2ZpbGVfb3BzIHR5cGUsCi0JCQkJIGNvbnN0IHN0cnVjdCBmaWxlICpmcCkKK3N0YXRpYyBzdHJ1Y3QgbWVpX2NsX2NiICptZWlfaW9fY2JfaW5pdChzdHJ1Y3QgbWVpX2NsICpjbCwKKwkJCQkJZW51bSBtZWlfY2JfZmlsZV9vcHMgdHlwZSwKKwkJCQkJY29uc3Qgc3RydWN0IGZpbGUgKmZwKQogewogCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwogCkBAIC00MjAsMzEgKzQyMSw2IEBACiB9CiAKIC8qKgotICogbWVpX2lvX2NiX2FsbG9jX2J1ZiAtIGFsbG9jYXRlIGNhbGxiYWNrIGJ1ZmZlcgotICoKLSAqIEBjYjogaW8gY2FsbGJhY2sgc3RydWN0dXJlCi0gKiBAbGVuZ3RoOiBzaXplIG9mIHRoZSBidWZmZXIKLSAqCi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcwotICogICAgICAgICAtRUlOVkFMIGlmIGNiIGlzIE5VTEwKLSAqICAgICAgICAgLUVOT01FTSBpZiBhbGxvY2F0aW9uIGZhaWxlZAotICovCi1pbnQgbWVpX2lvX2NiX2FsbG9jX2J1ZihzdHJ1Y3QgbWVpX2NsX2NiICpjYiwgc2l6ZV90IGxlbmd0aCkKLXsKLQlpZiAoIWNiKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChsZW5ndGggPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQljYi0+YnVmLmRhdGEgPSBrbWFsbG9jKGxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjYi0+YnVmLmRhdGEpCi0JCXJldHVybiAtRU5PTUVNOwotCWNiLT5idWYuc2l6ZSA9IGxlbmd0aDsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCiAgKiBtZWlfY2xfYWxsb2NfY2IgLSBhIGNvbnZlbmllbnQgd3JhcHBlciBmb3IgYWxsb2NhdGluZyByZWFkIGNiCiAgKgogICogQGNsOiBob3N0IGNsaWVudApAQCAtNDU1LDI0ICs0MzEsNTkgQEAKICAqIFJldHVybjogY2Igb24gc3VjY2VzcyBhbmQgTlVMTCBvbiBmYWlsdXJlCiAgKi8KIHN0cnVjdCBtZWlfY2xfY2IgKm1laV9jbF9hbGxvY19jYihzdHJ1Y3QgbWVpX2NsICpjbCwgc2l6ZV90IGxlbmd0aCwKLQkJCQkgIGVudW0gbWVpX2NiX2ZpbGVfb3BzIHR5cGUsCisJCQkJICBlbnVtIG1laV9jYl9maWxlX29wcyBmb3BfdHlwZSwKIAkJCQkgIGNvbnN0IHN0cnVjdCBmaWxlICpmcCkKIHsKIAlzdHJ1Y3QgbWVpX2NsX2NiICpjYjsKIAotCWNiID0gbWVpX2lvX2NiX2luaXQoY2wsIHR5cGUsIGZwKTsKKwljYiA9IG1laV9pb19jYl9pbml0KGNsLCBmb3BfdHlwZSwgZnApOwogCWlmICghY2IpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKG1laV9pb19jYl9hbGxvY19idWYoY2IsIGxlbmd0aCkpIHsKKwlpZiAobGVuZ3RoID09IDApCisJCXJldHVybiBjYjsKKworCWNiLT5idWYuZGF0YSA9IGttYWxsb2MobGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNiLT5idWYuZGF0YSkgewogCQltZWlfaW9fY2JfZnJlZShjYik7CiAJCXJldHVybiBOVUxMOwogCX0KKwljYi0+YnVmLnNpemUgPSBsZW5ndGg7CiAKIAlyZXR1cm4gY2I7CiB9CiAKIC8qKgorICogbWVpX2NsX2VucXVldWVfY3RybF93cl9jYiAtIGEgY29udmVuaWVudCB3cmFwcGVyIGZvciBhbGxvY2F0aW5nCisgKiAgICAgYW5kIGVucXVldWluZyBvZiB0aGUgY29udHJvbCBjb21tYW5kcyBjYgorICoKKyAqIEBjbDogaG9zdCBjbGllbnQKKyAqIEBsZW5ndGg6IHNpemUgb2YgdGhlIGJ1ZmZlcgorICogQHR5cGU6IG9wZXJhdGlvbiB0eXBlCisgKiBAZnA6IGFzc29jaWF0ZWQgZmlsZSBwb2ludGVyIChtaWdodCBiZSBOVUxMKQorICoKKyAqIFJldHVybjogY2Igb24gc3VjY2VzcyBhbmQgTlVMTCBvbiBmYWlsdXJlCisgKiBMb2NraW5nOiBjYWxsZWQgdW5kZXIgImRldi0+ZGV2aWNlX2xvY2siIGxvY2sKKyAqLworc3RydWN0IG1laV9jbF9jYiAqbWVpX2NsX2VucXVldWVfY3RybF93cl9jYihzdHJ1Y3QgbWVpX2NsICpjbCwgc2l6ZV90IGxlbmd0aCwKKwkJCQkJICAgIGVudW0gbWVpX2NiX2ZpbGVfb3BzIGZvcF90eXBlLAorCQkJCQkgICAgY29uc3Qgc3RydWN0IGZpbGUgKmZwKQoreworCXN0cnVjdCBtZWlfY2xfY2IgKmNiOworCisJLyogZm9yIFJYIGFsd2F5cyBhbGxvY2F0ZSBhdCBsZWFzdCBjbGllbnQncyBtdHUgKi8KKwlpZiAobGVuZ3RoKQorCQlsZW5ndGggPSBtYXhfdChzaXplX3QsIGxlbmd0aCwgbWVpX2NsX210dShjbCkpOworCisJY2IgPSBtZWlfY2xfYWxsb2NfY2IoY2wsIGxlbmd0aCwgZm9wX3R5cGUsIGZwKTsKKwlpZiAoIWNiKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCXJldHVybiBjYjsKK30KKworLyoqCiAgKiBtZWlfY2xfcmVhZF9jYiAtIGZpbmQgdGhpcyBjbCdzIGNhbGxiYWNrIGluIHRoZSByZWFkIGxpc3QKICAqICAgICBmb3IgYSBzcGVjaWZpYyBmaWxlCiAgKgpAQCAtNzU0LDcgKzc2NSw4IEBACiAJbWVpX2lvX2xpc3RfZmx1c2goJmRldi0+Y3RybF9yZF9saXN0LCBjbCk7CiAJbWVpX2lvX2xpc3RfZmx1c2goJmRldi0+Y3RybF93cl9saXN0LCBjbCk7CiAJbWVpX2NsX3dha2VfYWxsKGNsKTsKLQljbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA9IDA7CisJY2wtPnJ4X2Zsb3dfY3RybF9jcmVkcyA9IDA7CisJY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyA9IDA7CiAJY2wtPnRpbWVyX2NvdW50ID0gMDsKIAogCWlmICghY2wtPm1lX2NsKQpAQCAtNzY0LDcgKzc3Niw3IEBACiAJCWNsLT5tZV9jbC0+Y29ubmVjdF9jb3VudC0tOwogCiAJaWYgKGNsLT5tZV9jbC0+Y29ubmVjdF9jb3VudCA9PSAwKQotCQljbC0+bWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPSAwOworCQljbC0+bWVfY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyA9IDA7CiAKIAltZWlfbWVfY2xfcHV0KGNsLT5tZV9jbCk7CiAJY2wtPm1lX2NsID0gTlVMTDsKQEAgLTgxNCw2ICs4MjYsNyBAQAogCiAJbGlzdF9tb3ZlX3RhaWwoJmNiLT5saXN0LCAmZGV2LT5jdHJsX3JkX2xpc3QubGlzdCk7CiAJY2wtPnRpbWVyX2NvdW50ID0gTUVJX0NPTk5FQ1RfVElNRU9VVDsKKwltZWlfc2NoZWR1bGVfc3RhbGxfdGltZXIoZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtODY3LDEzICs4ODAsMTEgQEAKIAogCWNsLT5zdGF0ZSA9IE1FSV9GSUxFX0RJU0NPTk5FQ1RJTkc7CiAKLQljYiA9IG1laV9pb19jYl9pbml0KGNsLCBNRUlfRk9QX0RJU0NPTk5FQ1QsIE5VTEwpOwotCXJldHMgPSBjYiA/IDAgOiAtRU5PTUVNOwotCWlmIChyZXRzKQorCWNiID0gbWVpX2NsX2VucXVldWVfY3RybF93cl9jYihjbCwgMCwgTUVJX0ZPUF9ESVNDT05ORUNULCBOVUxMKTsKKwlpZiAoIWNiKSB7CisJCXJldHMgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKLQotCWNsX2RiZyhkZXYsIGNsLCAiYWRkIGRpc2Nvbm5lY3QgY2IgdG8gY29udHJvbCB3cml0ZSBsaXN0XG4iKTsKLQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCX0KIAogCWlmIChtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKIAkJcmV0cyA9IG1laV9jbF9zZW5kX2Rpc2Nvbm5lY3QoY2wsIGNiKTsKQEAgLTEwMDEsNiArMTAxMiw3IEBACiAKIAlsaXN0X21vdmVfdGFpbCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfcmRfbGlzdC5saXN0KTsKIAljbC0+dGltZXJfY291bnQgPSBNRUlfQ09OTkVDVF9USU1FT1VUOworCW1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihkZXYpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDQyLDE0ICsxMDU0LDE0IEBACiAgKgogICogQGNsOiBob3N0IGNsaWVudAogICogQG1lX2NsOiBtZSBjbGllbnQKLSAqIEBmaWxlOiBwb2ludGVyIHRvIGZpbGUgc3RydWN0dXJlCisgKiBAZnA6IHBvaW50ZXIgdG8gZmlsZSBzdHJ1Y3R1cmUKICAqCiAgKiBMb2NraW5nOiBjYWxsZWQgdW5kZXIgImRldi0+ZGV2aWNlX2xvY2siIGxvY2sKICAqCiAgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgPDAgb24gZmFpbHVyZS4KICAqLwogaW50IG1laV9jbF9jb25uZWN0KHN0cnVjdCBtZWlfY2wgKmNsLCBzdHJ1Y3QgbWVpX21lX2NsaWVudCAqbWVfY2wsCi0JCSAgY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUpCisJCSAgIGNvbnN0IHN0cnVjdCBmaWxlICpmcCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OwogCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwpAQCAtMTA3NiwxMiArMTA4OCwxMSBAQAogCQlnb3RvIG5vcnRwbTsKIAl9CiAKLQljYiA9IG1laV9pb19jYl9pbml0KGNsLCBNRUlfRk9QX0NPTk5FQ1QsIGZpbGUpOwotCXJldHMgPSBjYiA/IDAgOiAtRU5PTUVNOwotCWlmIChyZXRzKQorCWNiID0gbWVpX2NsX2VucXVldWVfY3RybF93cl9jYihjbCwgMCwgTUVJX0ZPUF9DT05ORUNULCBmcCk7CisJaWYgKCFjYikgeworCQlyZXRzID0gLUVOT01FTTsKIAkJZ290byBvdXQ7Ci0KLQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCX0KIAogCS8qIHJ1biBoYnVmIGFjcXVpcmUgbGFzdCBzbyB3ZSBkb24ndCBoYXZlIHRvIHVuZG8gKi8KIAlpZiAoIW1laV9jbF9pc19vdGhlcl9jb25uZWN0aW5nKGNsKSAmJiBtZWlfaGJ1Zl9hY3F1aXJlKGRldikpIHsKQEAgLTExNTksNTAgKzExNzAsNDIgQEAKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCi0KLQogLyoqCi0gKiBtZWlfY2xfZmxvd19jdHJsX2NyZWRzIC0gY2hlY2tzIGZsb3dfY29udHJvbCBjcmVkaXRzIGZvciBjbC4KKyAqIG1laV9jbF90eF9mbG93X2N0cmxfY3JlZHMgLSBjaGVja3MgZmxvd19jb250cm9sIGNyZWRpdHMgZm9yIGNsLgogICoKICAqIEBjbDogaG9zdCBjbGllbnQKLSAqIEBmcDogdGhlIGZpbGUgcG9pbnRlciBhc3NvY2lhdGVkIHdpdGggdGhlIHBvaW50ZXIKICAqCi0gKiBSZXR1cm46IDEgaWYgbWVpX2Zsb3dfY3RybF9jcmVkcyA+MCwgMCAtIG90aGVyd2lzZS4KKyAqIFJldHVybjogMSBpZiB0eF9mbG93X2N0cmxfY3JlZHMgPjAsIDAgLSBvdGhlcndpc2UuCiAgKi8KLXN0YXRpYyBpbnQgbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhzdHJ1Y3QgbWVpX2NsICpjbCwgY29uc3Qgc3RydWN0IGZpbGUgKmZwKQorc3RhdGljIGludCBtZWlfY2xfdHhfZmxvd19jdHJsX2NyZWRzKHN0cnVjdCBtZWlfY2wgKmNsKQogewotCWludCByZXRzOwotCiAJaWYgKFdBUk5fT04oIWNsIHx8ICFjbC0+bWVfY2wpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyA+IDApCisJaWYgKGNsLT50eF9mbG93X2N0cmxfY3JlZHMgPiAwKQogCQlyZXR1cm4gMTsKIAotCWlmIChtZWlfY2xfaXNfZml4ZWRfYWRkcmVzcyhjbCkpIHsKLQkJcmV0cyA9IG1laV9jbF9yZWFkX3N0YXJ0KGNsLCBtZWlfY2xfbXR1KGNsKSwgZnApOwotCQlpZiAocmV0cyAmJiByZXRzICE9IC1FQlVTWSkKLQkJCXJldHVybiByZXRzOworCWlmIChtZWlfY2xfaXNfZml4ZWRfYWRkcmVzcyhjbCkpCiAJCXJldHVybiAxOwotCX0KIAogCWlmIChtZWlfY2xfaXNfc2luZ2xlX3JlY3ZfYnVmKGNsKSkgewotCQlpZiAoY2wtPm1lX2NsLT5tZWlfZmxvd19jdHJsX2NyZWRzID4gMCkKKwkJaWYgKGNsLT5tZV9jbC0+dHhfZmxvd19jdHJsX2NyZWRzID4gMCkKIAkJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBtZWlfY2xfZmxvd19jdHJsX3JlZHVjZSAtIHJlZHVjZXMgZmxvd19jb250cm9sLgorICogbWVpX2NsX3R4X2Zsb3dfY3RybF9jcmVkc19yZWR1Y2UgLSByZWR1Y2VzIHRyYW5zbWl0IGZsb3cgY29udHJvbCBjcmVkaXRzCisgKiAgIGZvciBhIGNsaWVudAogICoKLSAqIEBjbDogcHJpdmF0ZSBkYXRhIG9mIHRoZSBmaWxlIG9iamVjdAorICogQGNsOiBob3N0IGNsaWVudAogICoKICAqIFJldHVybjoKICAqCTAgb24gc3VjY2VzcwogICoJLUVJTlZBTCB3aGVuIGN0cmwgY3JlZGl0cyBhcmUgPD0gMAogICovCi1zdGF0aWMgaW50IG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKHN0cnVjdCBtZWlfY2wgKmNsKQorc3RhdGljIGludCBtZWlfY2xfdHhfZmxvd19jdHJsX2NyZWRzX3JlZHVjZShzdHJ1Y3QgbWVpX2NsICpjbCkKIHsKIAlpZiAoV0FSTl9PTighY2wgfHwgIWNsLT5tZV9jbCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTIxMSwxMyArMTIxNCwxMyBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChtZWlfY2xfaXNfc2luZ2xlX3JlY3ZfYnVmKGNsKSkgewotCQlpZiAoV0FSTl9PTihjbC0+bWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMgPD0gMCkpCisJCWlmIChXQVJOX09OKGNsLT5tZV9jbC0+dHhfZmxvd19jdHJsX2NyZWRzIDw9IDApKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNsLT5tZV9jbC0+bWVpX2Zsb3dfY3RybF9jcmVkcy0tOworCQljbC0+bWVfY2wtPnR4X2Zsb3dfY3RybF9jcmVkcy0tOwogCX0gZWxzZSB7Ci0JCWlmIChXQVJOX09OKGNsLT5tZWlfZmxvd19jdHJsX2NyZWRzIDw9IDApKQorCQlpZiAoV0FSTl9PTihjbC0+dHhfZmxvd19jdHJsX2NyZWRzIDw9IDApKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNsLT5tZWlfZmxvd19jdHJsX2NyZWRzLS07CisJCWNsLT50eF9mbG93X2N0cmxfY3JlZHMtLTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjkyLDcgKzEyOTUsNyBAQAogICogbWVpX2NsX25vdGlmeV9yZXF1ZXN0IC0gc2VuZCBub3RpZmljYXRpb24gc3RvcC9zdGFydCByZXF1ZXN0CiAgKgogICogQGNsOiBob3N0IGNsaWVudAotICogQGZpbGU6IGFzc29jaWF0ZSByZXF1ZXN0IHdpdGggZmlsZQorICogQGZwOiBhc3NvY2lhdGUgcmVxdWVzdCB3aXRoIGZpbGUKICAqIEByZXF1ZXN0OiAxIGZvciBzdGFydCBvciAwIGZvciBzdG9wCiAgKgogICogTG9ja2luZzogY2FsbGVkIHVuZGVyICJkZXYtPmRldmljZV9sb2NrIiBsb2NrCkBAIC0xMzAwLDcgKzEzMDMsNyBAQAogICogUmV0dXJuOiAwIG9uIHN1Y2ggYW5kIGVycm9yIG90aGVyd2lzZS4KICAqLwogaW50IG1laV9jbF9ub3RpZnlfcmVxdWVzdChzdHJ1Y3QgbWVpX2NsICpjbCwKLQkJCSAgY29uc3Qgc3RydWN0IGZpbGUgKmZpbGUsIHU4IHJlcXVlc3QpCisJCQkgIGNvbnN0IHN0cnVjdCBmaWxlICpmcCwgdTggcmVxdWVzdCkKIHsKIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OwogCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwpAQCAtMTMyNSw3ICsxMzI4LDcgQEAKIAl9CiAKIAlmb3BfdHlwZSA9IG1laV9jbF9ub3RpZnlfcmVxMmZvcChyZXF1ZXN0KTsKLQljYiA9IG1laV9pb19jYl9pbml0KGNsLCBmb3BfdHlwZSwgZmlsZSk7CisJY2IgPSBtZWlfY2xfZW5xdWV1ZV9jdHJsX3dyX2NiKGNsLCAwLCBmb3BfdHlwZSwgZnApOwogCWlmICghY2IpIHsKIAkJcmV0cyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpAQCAtMTMzNiw5ICsxMzM5LDcgQEAKIAkJCXJldHMgPSAtRU5PREVWOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfcmRfbGlzdC5saXN0KTsKLQl9IGVsc2UgewotCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmY2ItPmxpc3QsICZkZXYtPmN0cmxfcmRfbGlzdC5saXN0KTsKIAl9CiAKIAltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwpAQCAtMTQzNiwyNSArMTQzNyw2IEBACiB9CiAKIC8qKgotICogbWVpX2NsX2lzX3JlYWRfZmNfY2IgLSBjaGVjayBpZiByZWFkIGNiIGlzIHdhaXRpbmcgZm9yIGZsb3cgY29udHJvbAotICogICAgICAgICAgICAgICAgICAgICAgICBmb3IgZ2l2ZW4gaG9zdCBjbGllbnQKLSAqCi0gKiBAY2w6IGhvc3QgY2xpZW50Ci0gKgotICogUmV0dXJuOiB0cnVlLCBpZiBmb3VuZCBhdCBsZWFzdCBvbmUgY2IuCi0gKi8KLXN0YXRpYyBib29sIG1laV9jbF9pc19yZWFkX2ZjX2NiKHN0cnVjdCBtZWlfY2wgKmNsKQotewotCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjbC0+ZGV2OwotCXN0cnVjdCBtZWlfY2xfY2IgKmNiOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QsIGxpc3QpCi0JCWlmIChjYi0+Zm9wX3R5cGUgPT0gTUVJX0ZPUF9SRUFEICYmIGNiLT5jbCA9PSBjbCkKLQkJCXJldHVybiB0cnVlOwotCXJldHVybiBmYWxzZTsKLX0KLQotLyoqCiAgKiBtZWlfY2xfcmVhZF9zdGFydCAtIHRoZSBzdGFydCByZWFkIGNsaWVudCBtZXNzYWdlIGZ1bmN0aW9uLgogICoKICAqIEBjbDogaG9zdCBjbGllbnQKQEAgLTE0NzcsMjYgKzE0NTksMjIgQEAKIAlpZiAoIW1laV9jbF9pc19jb25uZWN0ZWQoY2wpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qIEhXIGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IG9uZSBwZW5kaW5nIHJlYWQgKi8KLQlpZiAoIWxpc3RfZW1wdHkoJmNsLT5yZF9wZW5kaW5nKSB8fCBtZWlfY2xfaXNfcmVhZF9mY19jYihjbCkpCi0JCXJldHVybiAtRUJVU1k7Ci0KIAlpZiAoIW1laV9tZV9jbF9pc19hY3RpdmUoY2wtPm1lX2NsKSkgewogCQljbF9lcnIoZGV2LCBjbCwgIm5vIHN1Y2ggbWUgY2xpZW50XG4iKTsKIAkJcmV0dXJuICAtRU5PVFRZOwogCX0KIAotCS8qIGFsd2F5cyBhbGxvY2F0ZSBhdCBsZWFzdCBjbGllbnQgbWF4IG1lc3NhZ2UgKi8KLQlsZW5ndGggPSBtYXhfdChzaXplX3QsIGxlbmd0aCwgbWVpX2NsX210dShjbCkpOwotCWNiID0gbWVpX2NsX2FsbG9jX2NiKGNsLCBsZW5ndGgsIE1FSV9GT1BfUkVBRCwgZnApOworCWlmIChtZWlfY2xfaXNfZml4ZWRfYWRkcmVzcyhjbCkgfHwgY2wgPT0gJmRldi0+aWFtdGhpZl9jbCkKKwkJcmV0dXJuIDA7CisKKwkvKiBIVyBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBvbmUgcGVuZGluZyByZWFkICovCisJaWYgKGNsLT5yeF9mbG93X2N0cmxfY3JlZHMpCisJCXJldHVybiAtRUJVU1k7CisKKwljYiA9IG1laV9jbF9lbnF1ZXVlX2N0cmxfd3JfY2IoY2wsIGxlbmd0aCwgTUVJX0ZPUF9SRUFELCBmcCk7CiAJaWYgKCFjYikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAobWVpX2NsX2lzX2ZpeGVkX2FkZHJlc3MoY2wpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX3BlbmRpbmcpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlyZXRzID0gcG1fcnVudGltZV9nZXQoZGV2LT5kZXYpOwogCWlmIChyZXRzIDwgMCAmJiByZXRzICE9IC1FSU5QUk9HUkVTUykgewogCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2LT5kZXYpOwpAQCAtMTUwNCwxNiArMTQ4MiwxNSBAQAogCQlnb3RvIG5vcnRwbTsKIAl9CiAKKwlyZXRzID0gMDsKIAlpZiAobWVpX2hidWZfYWNxdWlyZShkZXYpKSB7CiAJCXJldHMgPSBtZWlfaGJtX2NsX2Zsb3dfY29udHJvbF9yZXEoZGV2LCBjbCk7CiAJCWlmIChyZXRzIDwgMCkKIAkJCWdvdG8gb3V0OwogCi0JCWxpc3RfYWRkX3RhaWwoJmNiLT5saXN0LCAmY2wtPnJkX3BlbmRpbmcpOwotCX0gZWxzZSB7Ci0JCXJldHMgPSAwOwotCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmY2ItPmxpc3QsICZjbC0+cmRfcGVuZGluZyk7CiAJfQorCWNsLT5yeF9mbG93X2N0cmxfY3JlZHMrKzsKIAogb3V0OgogCWNsX2RiZyhkZXYsIGNsLCAicnBtOiBhdXRvc3VzcGVuZFxuIik7CkBAIC0xNTU3LDcgKzE1MzQsNyBAQAogCiAJZmlyc3RfY2h1bmsgPSBjYi0+YnVmX2lkeCA9PSAwOwogCi0JcmV0cyA9IGZpcnN0X2NodW5rID8gbWVpX2NsX2Zsb3dfY3RybF9jcmVkcyhjbCwgY2ItPmZwKSA6IDE7CisJcmV0cyA9IGZpcnN0X2NodW5rID8gbWVpX2NsX3R4X2Zsb3dfY3RybF9jcmVkcyhjbCkgOiAxOwogCWlmIChyZXRzIDwgMCkKIAkJcmV0dXJuIHJldHM7CiAKQEAgLTE2MDUsNyArMTU4Miw3IEBACiAJY2ItPmNvbXBsZXRlZCA9IG1laV9oZHIubXNnX2NvbXBsZXRlID09IDE7CiAKIAlpZiAoZmlyc3RfY2h1bmspIHsKLQkJaWYgKG1laV9jbF9mbG93X2N0cmxfcmVkdWNlKGNsKSkKKwkJaWYgKG1laV9jbF90eF9mbG93X2N0cmxfY3JlZHNfcmVkdWNlKGNsKSkKIAkJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTY2Myw3ICsxNjQwLDcgQEAKIAltZWlfaGRyLm1zZ19jb21wbGV0ZSA9IDA7CiAJbWVpX2hkci5pbnRlcm5hbCA9IGNiLT5pbnRlcm5hbDsKIAotCXJldHMgPSBtZWlfY2xfZmxvd19jdHJsX2NyZWRzKGNsLCBjYi0+ZnApOworCXJldHMgPSBtZWlfY2xfdHhfZmxvd19jdHJsX2NyZWRzKGNsKTsKIAlpZiAocmV0cyA8IDApCiAJCWdvdG8gZXJyOwogCkBAIC0xNjkxLDcgKzE2NjgsNyBAQAogCWlmIChyZXRzKQogCQlnb3RvIGVycjsKIAotCXJldHMgPSBtZWlfY2xfZmxvd19jdHJsX3JlZHVjZShjbCk7CisJcmV0cyA9IG1laV9jbF90eF9mbG93X2N0cmxfY3JlZHNfcmVkdWNlKGNsKTsKIAlpZiAocmV0cykKIAkJZ290byBlcnI7CiAKQEAgLTE3NjEsNiArMTczOCw5IEBACiAKIAljYXNlIE1FSV9GT1BfUkVBRDoKIAkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZjbC0+cmRfY29tcGxldGVkKTsKKwkJaWYgKCFtZWlfY2xfaXNfZml4ZWRfYWRkcmVzcyhjbCkgJiYKKwkJICAgICFXQVJOX09OKCFjbC0+cnhfZmxvd19jdHJsX2NyZWRzKSkKKwkJCWNsLT5yeF9mbG93X2N0cmxfY3JlZHMtLTsKIAkJaWYgKCFtZWlfY2xfYnVzX3J4X2V2ZW50KGNsKSkKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2wtPnJ4X3dhaXQpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmggYi9kcml2ZXJzL21pc2MvbWVpL2NsaWVudC5oCmluZGV4IDBkN2EzYTEuLmQyYmZhYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvY2xpZW50LmgKKysrIGIvZHJpdmVycy9taXNjL21laS9jbGllbnQuaApAQCAtODIsMTEgKzgyLDcgQEAKIC8qCiAgKiBNRUkgSU8gRnVuY3Rpb25zCiAgKi8KLXN0cnVjdCBtZWlfY2xfY2IgKm1laV9pb19jYl9pbml0KHN0cnVjdCBtZWlfY2wgKmNsLCBlbnVtIG1laV9jYl9maWxlX29wcyB0eXBlLAotCQkJCSBjb25zdCBzdHJ1Y3QgZmlsZSAqZnApOwogdm9pZCBtZWlfaW9fY2JfZnJlZShzdHJ1Y3QgbWVpX2NsX2NiICpwcml2X2NiKTsKLWludCBtZWlfaW9fY2JfYWxsb2NfYnVmKHN0cnVjdCBtZWlfY2xfY2IgKmNiLCBzaXplX3QgbGVuZ3RoKTsKLQogCiAvKioKICAqIG1laV9pb19saXN0X2luaXQgLSBTZXRzIHVwIGEgcXVldWUgbGlzdC4KQEAgLTExOCw2ICsxMTQsOSBAQAogc3RydWN0IG1laV9jbF9jYiAqbWVpX2NsX2FsbG9jX2NiKHN0cnVjdCBtZWlfY2wgKmNsLCBzaXplX3QgbGVuZ3RoLAogCQkJCSAgZW51bSBtZWlfY2JfZmlsZV9vcHMgdHlwZSwKIAkJCQkgIGNvbnN0IHN0cnVjdCBmaWxlICpmcCk7CitzdHJ1Y3QgbWVpX2NsX2NiICptZWlfY2xfZW5xdWV1ZV9jdHJsX3dyX2NiKHN0cnVjdCBtZWlfY2wgKmNsLCBzaXplX3QgbGVuZ3RoLAorCQkJCQkgICAgZW51bSBtZWlfY2JfZmlsZV9vcHMgdHlwZSwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBmaWxlICpmcCk7CiBpbnQgbWVpX2NsX2ZsdXNoX3F1ZXVlcyhzdHJ1Y3QgbWVpX2NsICpjbCwgY29uc3Qgc3RydWN0IGZpbGUgKmZwKTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmMgYi9kcml2ZXJzL21pc2MvbWVpL2hibS5jCmluZGV4IDA4NWYzYWEuLmRkN2YxNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaGJtLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9oYm0uYwpAQCAtMTYxLDYgKzE2MSw3IEBACiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQogICogQGNsOiBjbGllbnQKICAqIEBoYm1fY21kOiBob3N0IGJ1cyBtZXNzYWdlIGNvbW1hbmQKKyAqIEBidWY6IG1lc3NhZ2UgYnVmZmVyCiAgKiBAbGVuOiBidWZmZXIgbGVuZ3RoCiAgKgogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIDwwIG9uIGZhaWx1cmUuCkBAIC0yNzYsNiArMjc3LDcgQEAKIAogCWRldi0+aGJtX3N0YXRlID0gTUVJX0hCTV9TVEFSVElORzsKIAlkZXYtPmluaXRfY2xpZW50c190aW1lciA9IE1FSV9DTElFTlRTX0lOSVRfVElNRU9VVDsKKwltZWlfc2NoZWR1bGVfc3RhbGxfdGltZXIoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzExLDYgKzMxMyw3IEBACiAJfQogCWRldi0+aGJtX3N0YXRlID0gTUVJX0hCTV9FTlVNX0NMSUVOVFM7CiAJZGV2LT5pbml0X2NsaWVudHNfdGltZXIgPSBNRUlfQ0xJRU5UU19JTklUX1RJTUVPVVQ7CisJbWVpX3NjaGVkdWxlX3N0YWxsX3RpbWVyKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMzOSw3ICszNDIsNyBAQAogCiAJbWVfY2wtPnByb3BzID0gcmVzLT5jbGllbnRfcHJvcGVydGllczsKIAltZV9jbC0+Y2xpZW50X2lkID0gcmVzLT5tZV9hZGRyOwotCW1lX2NsLT5tZWlfZmxvd19jdHJsX2NyZWRzID0gMDsKKwltZV9jbC0+dHhfZmxvd19jdHJsX2NyZWRzID0gMDsKIAogCW1laV9tZV9jbF9hZGQoZGV2LCBtZV9jbCk7CiAKQEAgLTU2MSw2ICs1NjQsNyBAQAogCX0KIAogCWRldi0+aW5pdF9jbGllbnRzX3RpbWVyID0gTUVJX0NMSUVOVFNfSU5JVF9USU1FT1VUOworCW1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MzYsMjMgKzY0MCwyMiBAQAogfQogCiAvKioKLSAqIG1laV9oYm1fYWRkX3NpbmdsZV9mbG93X2NyZWRzIC0gYWRkcyBzaW5nbGUgYnVmZmVyIGNyZWRlbnRpYWxzLgorICogbWVpX2hibV9hZGRfc2luZ2xlX3R4X2Zsb3dfY3RybF9jcmVkcyAtIGFkZHMgc2luZ2xlIGJ1ZmZlciBjcmVkZW50aWFscy4KICAqCiAgKiBAZGV2OiB0aGUgZGV2aWNlIHN0cnVjdHVyZQotICogQGZsb3c6IGZsb3cgY29udHJvbC4KKyAqIEBmY3RybDogZmxvdyBjb250cm9sIHJlc3BvbnNlIGJ1cyBtZXNzYWdlCiAgKgogICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIDwgMCBvdGhlcndpc2UKICAqLwotc3RhdGljIGludCBtZWlfaGJtX2FkZF9zaW5nbGVfZmxvd19jcmVkcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKmZsb3cpCitzdGF0aWMgaW50IG1laV9oYm1fYWRkX3NpbmdsZV90eF9mbG93X2N0cmxfY3JlZHMoc3RydWN0IG1laV9kZXZpY2UgKmRldiwKKwkJCQkJCSBzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqZmN0cmwpCiB7CiAJc3RydWN0IG1laV9tZV9jbGllbnQgKm1lX2NsOwogCWludCByZXRzOwogCi0JbWVfY2wgPSBtZWlfbWVfY2xfYnlfaWQoZGV2LCBmbG93LT5tZV9hZGRyKTsKKwltZV9jbCA9IG1laV9tZV9jbF9ieV9pZChkZXYsIGZjdHJsLT5tZV9hZGRyKTsKIAlpZiAoIW1lX2NsKSB7Ci0JCWRldl9lcnIoZGV2LT5kZXYsICJubyBzdWNoIG1lIGNsaWVudCAlZFxuIiwKLQkJCWZsb3ctPm1lX2FkZHIpOworCQlkZXZfZXJyKGRldi0+ZGV2LCAibm8gc3VjaCBtZSBjbGllbnQgJWRcbiIsIGZjdHJsLT5tZV9hZGRyKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCkBAIC02NjEsOSArNjY0LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JbWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMrKzsKKwltZV9jbC0+dHhfZmxvd19jdHJsX2NyZWRzKys7CiAJZGV2X2RiZyhkZXYtPmRldiwgInJlY3YgZmxvdyBjdHJsIG1zZyBNRSAlZCAoc2luZ2xlKSBjcmVkcyA9ICVkLlxuIiwKLQkgICAgZmxvdy0+bWVfYWRkciwgbWVfY2wtPm1laV9mbG93X2N0cmxfY3JlZHMpOworCQlmY3RybC0+bWVfYWRkciwgbWVfY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyk7CiAKIAlyZXRzID0gMDsKIG91dDoKQEAgLTY3NSwyNCArNjc4LDI0IEBACiAgKiBtZWlfaGJtX2NsX2Zsb3dfY29udHJvbF9yZXMgLSBmbG93IGNvbnRyb2wgcmVzcG9uc2UgZnJvbSBtZQogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAZmxvd19jb250cm9sOiBmbG93IGNvbnRyb2wgcmVzcG9uc2UgYnVzIG1lc3NhZ2UKKyAqIEBmY3RybDogZmxvdyBjb250cm9sIHJlc3BvbnNlIGJ1cyBtZXNzYWdlCiAgKi8KLXN0YXRpYyB2b2lkIG1laV9oYm1fY2xfZmxvd19jb250cm9sX3JlcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqZmxvd19jb250cm9sKQorc3RhdGljIHZvaWQgbWVpX2hibV9jbF90eF9mbG93X2N0cmxfY3JlZHNfcmVzKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqZmN0cmwpCiB7CiAJc3RydWN0IG1laV9jbCAqY2w7CiAKLQlpZiAoIWZsb3dfY29udHJvbC0+aG9zdF9hZGRyKSB7CisJaWYgKCFmY3RybC0+aG9zdF9hZGRyKSB7CiAJCS8qIHNpbmdsZSByZWNlaXZlIGJ1ZmZlciAqLwotCQltZWlfaGJtX2FkZF9zaW5nbGVfZmxvd19jcmVkcyhkZXYsIGZsb3dfY29udHJvbCk7CisJCW1laV9oYm1fYWRkX3NpbmdsZV90eF9mbG93X2N0cmxfY3JlZHMoZGV2LCBmY3RybCk7CiAJCXJldHVybjsKIAl9CiAKLQljbCA9IG1laV9oYm1fY2xfZmluZF9ieV9jbWQoZGV2LCBmbG93X2NvbnRyb2wpOworCWNsID0gbWVpX2hibV9jbF9maW5kX2J5X2NtZChkZXYsIGZjdHJsKTsKIAlpZiAoY2wpIHsKLQkJY2wtPm1laV9mbG93X2N0cmxfY3JlZHMrKzsKKwkJY2wtPnR4X2Zsb3dfY3RybF9jcmVkcysrOwogCQljbF9kYmcoZGV2LCBjbCwgImZsb3cgY29udHJvbCBjcmVkcyA9ICVkLlxuIiwKLQkJCQljbC0+bWVpX2Zsb3dfY3RybF9jcmVkcyk7CisJCQkJY2wtPnR4X2Zsb3dfY3RybF9jcmVkcyk7CiAJfQogfQogCkBAIC04NzEsMTAgKzg3NCwxMCBAQAogCQljbC0+c3RhdGUgPSBNRUlfRklMRV9ESVNDT05ORUNUSU5HOwogCQljbC0+dGltZXJfY291bnQgPSAwOwogCi0JCWNiID0gbWVpX2lvX2NiX2luaXQoY2wsIE1FSV9GT1BfRElTQ09OTkVDVF9SU1AsIE5VTEwpOworCQljYiA9IG1laV9jbF9lbnF1ZXVlX2N0cmxfd3JfY2IoY2wsIDAsIE1FSV9GT1BfRElTQ09OTkVDVF9SU1AsCisJCQkJCSAgICAgICBOVUxMKTsKIAkJaWYgKCFjYikKIAkJCXJldHVybiAtRU5PTUVNOwotCQlsaXN0X2FkZF90YWlsKCZjYi0+bGlzdCwgJmRldi0+Y3RybF93cl9saXN0Lmxpc3QpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTEwMjIsNyArMTAyNSw3IEBACiAKIAlzdHJ1Y3QgbWVpX2hibV9jbF9jbWQgKmNsX2NtZDsKIAlzdHJ1Y3QgaGJtX2NsaWVudF9jb25uZWN0X3JlcXVlc3QgKmRpc2Nvbm5lY3RfcmVxOwotCXN0cnVjdCBoYm1fZmxvd19jb250cm9sICpmbG93X2NvbnRyb2w7CisJc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKmZjdHJsOwogCiAJLyogcmVhZCB0aGUgbWVzc2FnZSB0byBvdXIgYnVmZmVyICovCiAJQlVHX09OKGhkci0+bGVuZ3RoID49IHNpemVvZihkZXYtPnJkX21zZ19idWYpKTsKQEAgLTExMDIsOCArMTEwNSw4IEBACiAJY2FzZSBNRUlfRkxPV19DT05UUk9MX0NNRDoKIAkJZGV2X2RiZyhkZXYtPmRldiwgImhibTogY2xpZW50IGZsb3cgY29udHJvbCByZXNwb25zZTogbWVzc2FnZSByZWNlaXZlZC5cbiIpOwogCi0JCWZsb3dfY29udHJvbCA9IChzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqKSBtZWlfbXNnOwotCQltZWlfaGJtX2NsX2Zsb3dfY29udHJvbF9yZXMoZGV2LCBmbG93X2NvbnRyb2wpOworCQlmY3RybCA9IChzdHJ1Y3QgaGJtX2Zsb3dfY29udHJvbCAqKW1laV9tc2c7CisJCW1laV9oYm1fY2xfdHhfZmxvd19jdHJsX2NyZWRzX3JlcyhkZXYsIGZjdHJsKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1FSV9QR19JU09MQVRJT05fRU5UUllfUkVTX0NNRDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUtcmVncy5oIGIvZHJpdmVycy9taXNjL21laS9ody1tZS1yZWdzLmgKaW5kZXggMGRjYjg1NC4uN2FkMTVkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9ody1tZS1yZWdzLmgKKysrIGIvZHJpdmVycy9taXNjL21laS9ody1tZS1yZWdzLmgKQEAgLTEyNSw2ICsxMjUsOSBAQAogI2RlZmluZSBNRUlfREVWX0lEX0JYVF9NICAgICAgMHgxQTlBICAvKiBCcm94dG9uIE0gKi8KICNkZWZpbmUgTUVJX0RFVl9JRF9BUExfSSAgICAgIDB4NUE5QSAgLyogQXBvbGxvIExha2UgSSAqLwogCisjZGVmaW5lIE1FSV9ERVZfSURfS0JQICAgICAgICAweEEyQkEgIC8qIEthYnkgUG9pbnQgKi8KKyNkZWZpbmUgTUVJX0RFVl9JRF9LQlBfMiAgICAgIDB4QTJCQiAgLyogS2FieSBQb2ludCAyICovCisKIC8qCiAgKiBNRUkgSFcgU2VjdGlvbgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmMgYi9kcml2ZXJzL21pc2MvbWVpL2h3LW1lLmMKaW5kZXggZTJmYjQ0Yy4uNTZjMjEwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9ody1tZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaHctbWUuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgIm1laV9kZXYuaCIKICNpbmNsdWRlICJoYm0uaCIKQEAgLTEwNjMsNiArMTA2NCw4IEBACiAJCX0KIAl9CiAKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2LT5kZXYpOworCiAJaGNzciA9IG1laV9oY3NyX3JlYWQoZGV2KTsKIAkvKiBIX1JTVCBtYXkgYmUgZm91bmQgbGl0IGJlZm9yZSByZXNldCBpcyBzdGFydGVkLAogCSAqIGZvciBleGFtcGxlIGlmIHByZWNlZGluZyByZXNldCBmbG93IGhhc24ndCBjb21wbGV0ZWQuCkBAIC0xMjYzLDggKzEyNjYsMTQgQEAKIHN0YXRpYyBib29sIG1laV9tZV9md190eXBlX3NwcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAl1MzIgcmVnOwotCS8qIFJlYWQgTUUgRlcgU3RhdHVzIGNoZWNrIGZvciBTUFMgRmlybXdhcmUgKi8KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUENJX0NGR19IRlNfMSwgJnJlZyk7CisJdW5zaWduZWQgaW50IGRldmZuOworCisJLyoKKwkgKiBSZWFkIE1FIEZXIFN0YXR1cyByZWdpc3RlciB0byBjaGVjayBmb3IgU1BTIEZpcm13YXJlCisJICogVGhlIFNQUyBGVyBpcyBvbmx5IHNpZ25hbGVkIGluIHBjaSBmdW5jdGlvbiAwCisJICovCisJZGV2Zm4gPSBQQ0lfREVWRk4oUENJX1NMT1QocGRldi0+ZGV2Zm4pLCAwKTsKKwlwY2lfYnVzX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYtPmJ1cywgZGV2Zm4sIFBDSV9DRkdfSEZTXzEsICZyZWcpOwogCXRyYWNlX21laV9wY2lfY2ZnX3JlYWQoJnBkZXYtPmRldiwgIlBDSV9DRkdfSEZTXzEiLCBQQ0lfQ0ZHX0hGU18xLCByZWcpOwogCS8qIGlmIGJpdHMgWzE5OjE2XSA9IDE1LCBydW5uaW5nIFNQUyBGaXJtd2FyZSAqLwogCXJldHVybiAocmVnICYgMHhmMDAwMCkgPT0gMHhmMDAwMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmMgYi9kcml2ZXJzL21pc2MvbWVpL2h3LXR4ZS5jCmluZGV4IDRhNmMxYjguLmU2ZTVlNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvaHctdHhlLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9ody10eGUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21laS5oPgogCkBAIC05MzUsNiArOTM2LDggQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2LT5kZXYpOworCiAJLyogZW5hYmxlIGlucHV0IHJlYWR5IGludGVycnVwdHM6CiAJICogU0VDX0lQQ19IT1NUX0lOVF9NQVNLLklQQ19JTlBVVF9SRUFEWV9JTlRfTUFTSwogCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9pbml0LmMgYi9kcml2ZXJzL21pc2MvbWVpL2luaXQuYwppbmRleCBmN2M4ZGZkLi45YTljMjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2luaXQuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL2luaXQuYwpAQCAtOTQsNyArOTQsNyBAQAogCWNhbmNlbF93b3JrX3N5bmMoJmRldi0+cmVzZXRfd29yayk7CiAJY2FuY2VsX3dvcmtfc3luYygmZGV2LT5idXNfcmVzY2FuX3dvcmspOwogCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmZGV2LT50aW1lcl93b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRldi0+dGltZXJfd29yayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtZWlfY2FuY2VsX3dvcmspOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2ludGVycnVwdC5jIGIvZHJpdmVycy9taXNjL21laS9pbnRlcnJ1cHQuYwppbmRleCAzODMxYTdiLi41YTQ4OTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2ludGVycnVwdC5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvaW50ZXJydXB0LmMKQEAgLTEwMiwyNiArMTAyLDI1IEBACiB7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldiA9IGNsLT5kZXY7CiAJc3RydWN0IG1laV9jbF9jYiAqY2I7Ci0JdW5zaWduZWQgY2hhciAqYnVmZmVyID0gTlVMTDsKIAlzaXplX3QgYnVmX3N6OwogCiAJY2IgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmNsLT5yZF9wZW5kaW5nLCBzdHJ1Y3QgbWVpX2NsX2NiLCBsaXN0KTsKIAlpZiAoIWNiKSB7Ci0JCWNsX2VycihkZXYsIGNsLCAicGVuZGluZyByZWFkIGNiIG5vdCBmb3VuZFxuIik7Ci0JCWdvdG8gb3V0OworCQlpZiAoIW1laV9jbF9pc19maXhlZF9hZGRyZXNzKGNsKSkgeworCQkJY2xfZXJyKGRldiwgY2wsICJwZW5kaW5nIHJlYWQgY2Igbm90IGZvdW5kXG4iKTsKKwkJCWdvdG8gZGlzY2FyZDsKKwkJfQorCQljYiA9IG1laV9jbF9hbGxvY19jYihjbCwgbWVpX2NsX210dShjbCksIE1FSV9GT1BfUkVBRCwgY2wtPmZwKTsKKwkJaWYgKCFjYikKKwkJCWdvdG8gZGlzY2FyZDsKKwkJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZjbC0+cmRfcGVuZGluZyk7CiAJfQogCiAJaWYgKCFtZWlfY2xfaXNfY29ubmVjdGVkKGNsKSkgewogCQljbF9kYmcoZGV2LCBjbCwgIm5vdCBjb25uZWN0ZWRcbiIpOwotCQljYi0+c3RhdHVzID0gLUVOT0RFVjsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGNiLT5idWYuc2l6ZSA9PSAwIHx8IGNiLT5idWYuZGF0YSA9PSBOVUxMKSB7Ci0JCWNsX2VycihkZXYsIGNsLCAicmVzcG9uc2UgYnVmZmVyIGlzIG5vdCBhbGxvY2F0ZWQuXG4iKTsKIAkJbGlzdF9tb3ZlX3RhaWwoJmNiLT5saXN0LCAmY29tcGxldGVfbGlzdC0+bGlzdCk7Ci0JCWNiLT5zdGF0dXMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKKwkJY2ItPnN0YXR1cyA9IC1FTk9ERVY7CisJCWdvdG8gZGlzY2FyZDsKIAl9CiAKIAlidWZfc3ogPSBtZWlfaGRyLT5sZW5ndGggKyBjYi0+YnVmX2lkeDsKQEAgLTEzMiwyNSArMTMxLDE5IEBACiAKIAkJbGlzdF9tb3ZlX3RhaWwoJmNiLT5saXN0LCAmY29tcGxldGVfbGlzdC0+bGlzdCk7CiAJCWNiLT5zdGF0dXMgPSAtRU1TR1NJWkU7Ci0JCWdvdG8gb3V0OworCQlnb3RvIGRpc2NhcmQ7CiAJfQogCiAJaWYgKGNiLT5idWYuc2l6ZSA8IGJ1Zl9zeikgewogCQljbF9kYmcoZGV2LCBjbCwgIm1lc3NhZ2Ugb3ZlcmZsb3cuIHNpemUgJXp1IGxlbiAlZCBpZHggJXp1XG4iLAogCQkJY2ItPmJ1Zi5zaXplLCBtZWlfaGRyLT5sZW5ndGgsIGNiLT5idWZfaWR4KTsKLQkJYnVmZmVyID0ga3JlYWxsb2MoY2ItPmJ1Zi5kYXRhLCBidWZfc3osIEdGUF9LRVJORUwpOwogCi0JCWlmICghYnVmZmVyKSB7Ci0JCQljYi0+c3RhdHVzID0gLUVOT01FTTsKLQkJCWxpc3RfbW92ZV90YWlsKCZjYi0+bGlzdCwgJmNvbXBsZXRlX2xpc3QtPmxpc3QpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJY2ItPmJ1Zi5kYXRhID0gYnVmZmVyOwotCQljYi0+YnVmLnNpemUgPSBidWZfc3o7CisJCWxpc3RfbW92ZV90YWlsKCZjYi0+bGlzdCwgJmNvbXBsZXRlX2xpc3QtPmxpc3QpOworCQljYi0+c3RhdHVzID0gLUVNU0dTSVpFOworCQlnb3RvIGRpc2NhcmQ7CiAJfQogCi0JYnVmZmVyID0gY2ItPmJ1Zi5kYXRhICsgY2ItPmJ1Zl9pZHg7Ci0JbWVpX3JlYWRfc2xvdHMoZGV2LCBidWZmZXIsIG1laV9oZHItPmxlbmd0aCk7CisJbWVpX3JlYWRfc2xvdHMoZGV2LCBjYi0+YnVmLmRhdGEgKyBjYi0+YnVmX2lkeCwgbWVpX2hkci0+bGVuZ3RoKTsKIAogCWNiLT5idWZfaWR4ICs9IG1laV9oZHItPmxlbmd0aDsKIApAQCAtMTYyLDEwICsxNTUsMTAgQEAKIAkJcG1fcmVxdWVzdF9hdXRvc3VzcGVuZChkZXYtPmRldik7CiAJfQogCi1vdXQ6Ci0JaWYgKCFidWZmZXIpCi0JCW1laV9pcnFfZGlzY2FyZF9tc2coZGV2LCBtZWlfaGRyKTsKKwlyZXR1cm4gMDsKIAorZGlzY2FyZDoKKwltZWlfaXJxX2Rpc2NhcmRfbXNnKGRldiwgbWVpX2hkcik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxNiw2ICsyMDksOSBAQAogCWludCBzbG90czsKIAlpbnQgcmV0OwogCisJaWYgKCFsaXN0X2VtcHR5KCZjbC0+cmRfcGVuZGluZykpCisJCXJldHVybiAwOworCiAJbXNnX3Nsb3RzID0gbWVpX2RhdGEyc2xvdHMoc2l6ZW9mKHN0cnVjdCBoYm1fZmxvd19jb250cm9sKSk7CiAJc2xvdHMgPSBtZWlfaGJ1Zl9lbXB0eV9zbG90cyhkZXYpOwogCkBAIC00NjMsNiArNDU5LDE5IEBACiAJbWVpX3Jlc2V0KGRldik7CiB9CiAKKyNkZWZpbmUgTUVJX1NUQUxMX1RJTUVSX0ZSRVEgKDIgKiBIWikKKy8qKgorICogbWVpX3NjaGVkdWxlX3N0YWxsX3RpbWVyIC0gcmUtYXJtIHN0YWxsX3RpbWVyIHdvcmsKKyAqCisgKiBTY2hlZHVsZSBzdGFsbCB0aW1lcgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3ZvaWQgbWVpX3NjaGVkdWxlX3N0YWxsX3RpbWVyKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCit7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXYtPnRpbWVyX3dvcmssIE1FSV9TVEFMTF9USU1FUl9GUkVRKTsKK30KKwogLyoqCiAgKiBtZWlfdGltZXIgLSB0aW1lciBmdW5jdGlvbi4KICAqCkBAIC00NzIsMTAgKzQ4MSw5IEBACiB2b2lkIG1laV90aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IG1laV9jbCAqY2w7Ci0KIAlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKHdvcmssCiAJCQkJCXN0cnVjdCBtZWlfZGV2aWNlLCB0aW1lcl93b3JrLndvcmspOwotCisJYm9vbCByZXNjaGVkdWxlX3RpbWVyID0gZmFsc2U7CiAKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIApAQCAtNDkwLDYgKzQ5OCw3IEBACiAJCQkJbWVpX3Jlc2V0KGRldik7CiAJCQkJZ290byBvdXQ7CiAJCQl9CisJCQlyZXNjaGVkdWxlX3RpbWVyID0gdHJ1ZTsKIAkJfQogCX0KIApAQCAtNTA0LDYgKzUxMyw3IEBACiAJCQkJbWVpX2Nvbm5lY3RfdGltZW91dChjbCk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CisJCQlyZXNjaGVkdWxlX3RpbWVyID0gdHJ1ZTsKIAkJfQogCX0KIApAQCAtNTE0LDE5ICs1MjQsMTYgQEAKIAkJaWYgKC0tZGV2LT5pYW10aGlmX3N0YWxsX3RpbWVyID09IDApIHsKIAkJCWRldl9lcnIoZGV2LT5kZXYsICJ0aW1lcjogYW10aGlmICBoYW5nZWQuXG4iKTsKIAkJCW1laV9yZXNldChkZXYpOwotCQkJZGV2LT5pYW10aGlmX2NhbmNlbGVkID0gZmFsc2U7Ci0JCQlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOwogCi0JCQltZWlfaW9fY2JfZnJlZShkZXYtPmlhbXRoaWZfY3VycmVudF9jYik7Ci0JCQlkZXYtPmlhbXRoaWZfY3VycmVudF9jYiA9IE5VTEw7Ci0KLQkJCWRldi0+aWFtdGhpZl9mcCA9IE5VTEw7CiAJCQltZWlfYW10aGlmX3J1bl9uZXh0X2NtZChkZXYpOworCQkJZ290byBvdXQ7CiAJCX0KKwkJcmVzY2hlZHVsZV90aW1lciA9IHRydWU7CiAJfQogCiBvdXQ6Ci0JaWYgKGRldi0+ZGV2X3N0YXRlICE9IE1FSV9ERVZfRElTQUJMRUQpCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT50aW1lcl93b3JrLCAyICogSFopOworCWlmIChkZXYtPmRldl9zdGF0ZSAhPSBNRUlfREVWX0RJU0FCTEVEICYmIHJlc2NoZWR1bGVfdGltZXIpCisJCW1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihkZXYpOworCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jIGIvZHJpdmVycy9taXNjL21laS9tYWluLmMKaW5kZXggNTI2MzViMC4uZmE1MDYzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9tYWluLmMKKysrIGIvZHJpdmVycy9taXNjL21laS9tYWluLmMKQEAgLTcxLDYgKzcxLDcgQEAKIAkJZ290byBlcnJfdW5sb2NrOwogCX0KIAorCWNsLT5mcCA9IGZpbGU7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2w7CiAKIAltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwpAQCAtMTM4LDkgKzEzOSw4IEBACiAJc3RydWN0IG1laV9jbCAqY2wgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbWVpX2NsX2NiICpjYiA9IE5VTEw7CisJYm9vbCBub25ibG9jayA9ICEhKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIAlpbnQgcmV0czsKLQlpbnQgZXJyOwotCiAKIAlpZiAoV0FSTl9PTighY2wgfHwgIWNsLT5kZXYpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTE2NCwxMSArMTY0LDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGNsID09ICZkZXYtPmlhbXRoaWZfY2wpIHsKLQkJcmV0cyA9IG1laV9hbXRoaWZfcmVhZChkZXYsIGZpbGUsIHVidWYsIGxlbmd0aCwgb2Zmc2V0KTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJY2IgPSBtZWlfY2xfcmVhZF9jYihjbCwgZmlsZSk7CiAJaWYgKGNiKQogCQlnb3RvIGNvcHlfYnVmZmVyOwpAQCAtMTc2LDI0ICsxNzEsMjkgQEAKIAlpZiAoKm9mZnNldCA+IDApCiAJCSpvZmZzZXQgPSAwOwogCi0JZXJyID0gbWVpX2NsX3JlYWRfc3RhcnQoY2wsIGxlbmd0aCwgZmlsZSk7Ci0JaWYgKGVyciAmJiBlcnIgIT0gLUVCVVNZKSB7Ci0JCWNsX2RiZyhkZXYsIGNsLCAibWVpIHN0YXJ0IHJlYWQgZmFpbHVyZSBzdGF0dXMgPSAlZFxuIiwgZXJyKTsKLQkJcmV0cyA9IGVycjsKKwlyZXRzID0gbWVpX2NsX3JlYWRfc3RhcnQoY2wsIGxlbmd0aCwgZmlsZSk7CisJaWYgKHJldHMgJiYgcmV0cyAhPSAtRUJVU1kpIHsKKwkJY2xfZGJnKGRldiwgY2wsICJtZWkgc3RhcnQgcmVhZCBmYWlsdXJlIHN0YXR1cyA9ICVkXG4iLCByZXRzKTsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGxpc3RfZW1wdHkoJmNsLT5yZF9jb21wbGV0ZWQpICYmICF3YWl0cXVldWVfYWN0aXZlKCZjbC0+cnhfd2FpdCkpIHsKLQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQlyZXRzID0gLUVBR0FJTjsKLQkJCWdvdG8gb3V0OwotCQl9CisJaWYgKG5vbmJsb2NrKSB7CisJCXJldHMgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CiAKKwlpZiAocmV0cyA9PSAtRUJVU1kgJiYKKwkgICAgIW1laV9jbF9lbnF1ZXVlX2N0cmxfd3JfY2IoY2wsIGxlbmd0aCwgTUVJX0ZPUF9SRUFELCBmaWxlKSkgeworCQlyZXRzID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZG8gewogCQltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCiAJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY2wtPnJ4X3dhaXQsCi0JCQkJKCFsaXN0X2VtcHR5KCZjbC0+cmRfY29tcGxldGVkKSkgfHwKLQkJCQkoIW1laV9jbF9pc19jb25uZWN0ZWQoY2wpKSkpIHsKKwkJCQkJICAgICAoIWxpc3RfZW1wdHkoJmNsLT5yZF9jb21wbGV0ZWQpKSB8fAorCQkJCQkgICAgICghbWVpX2NsX2lzX2Nvbm5lY3RlZChjbCkpKSkgewogCiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQkJcmV0dXJuIC1FSU5UUjsKQEAgLTIwMiwxNiArMjAyLDEyIEBACiAKIAkJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiAJCWlmICghbWVpX2NsX2lzX2Nvbm5lY3RlZChjbCkpIHsKLQkJCXJldHMgPSAtRUJVU1k7CisJCQlyZXRzID0gLUVOT0RFVjsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JfQogCi0JY2IgPSBtZWlfY2xfcmVhZF9jYihjbCwgZmlsZSk7Ci0JaWYgKCFjYikgewotCQlyZXRzID0gMDsKLQkJZ290byBvdXQ7Ci0JfQorCQljYiA9IG1laV9jbF9yZWFkX2NiKGNsLCBmaWxlKTsKKwl9IHdoaWxlICghY2IpOwogCiBjb3B5X2J1ZmZlcjoKIAkvKiBub3cgY29weSB0aGUgZGF0YSB0byB1c2VyIHNwYWNlICovCkBAIC02MDksMjQgKzYwNSwyNCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoY2wgPT0gJmRldi0+aWFtdGhpZl9jbCkgewotCQltYXNrID0gbWVpX2FtdGhpZl9wb2xsKGRldiwgZmlsZSwgd2FpdCk7Ci0JCWdvdG8gb3V0OwotCX0KLQogCWlmIChub3RpZnlfZW4pIHsKIAkJcG9sbF93YWl0KGZpbGUsICZjbC0+ZXZfd2FpdCwgd2FpdCk7CiAJCWlmIChjbC0+bm90aWZ5X2V2KQogCQkJbWFzayB8PSBQT0xMUFJJOwogCX0KIAorCWlmIChjbCA9PSAmZGV2LT5pYW10aGlmX2NsKSB7CisJCW1hc2sgfD0gbWVpX2FtdGhpZl9wb2xsKGZpbGUsIHdhaXQpOworCQlnb3RvIG91dDsKKwl9CisKIAlpZiAocmVxX2V2ZW50cyAmIChQT0xMSU4gfCBQT0xMUkROT1JNKSkgewogCQlwb2xsX3dhaXQoZmlsZSwgJmNsLT5yeF93YWl0LCB3YWl0KTsKIAogCQlpZiAoIWxpc3RfZW1wdHkoJmNsLT5yZF9jb21wbGV0ZWQpKQogCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwogCQllbHNlCi0JCQltZWlfY2xfcmVhZF9zdGFydChjbCwgMCwgZmlsZSk7CisJCQltZWlfY2xfcmVhZF9zdGFydChjbCwgbWVpX2NsX210dShjbCksIGZpbGUpOwogCX0KIAogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9tZWlfZGV2LmggYi9kcml2ZXJzL21pc2MvbWVpL21laV9kZXYuaAppbmRleCBlNWUzMjUwLi4xMTY5ZmQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL21laV9kZXYuaAorKysgYi9kcml2ZXJzL21pc2MvbWVpL21laV9kZXYuaApAQCAtODAsMTggKzgwLDEzIEBACiBlbnVtIGlhbXRoaWZfc3RhdGVzIHsKIAlNRUlfSUFNVEhJRl9JRExFLAogCU1FSV9JQU1USElGX1dSSVRJTkcsCi0JTUVJX0lBTVRISUZfRkxPV19DT05UUk9MLAogCU1FSV9JQU1USElGX1JFQURJTkcsCi0JTUVJX0lBTVRISUZfUkVBRF9DT01QTEVURQogfTsKIAogZW51bSBtZWlfZmlsZV90cmFuc2FjdGlvbl9zdGF0ZXMgewogCU1FSV9JRExFLAogCU1FSV9XUklUSU5HLAogCU1FSV9XUklURV9DT01QTEVURSwKLQlNRUlfRkxPV19DT05UUk9MLAotCU1FSV9SRUFESU5HLAotCU1FSV9SRUFEX0NPTVBMRVRFCiB9OwogCiAvKioKQEAgLTE0Niw3ICsxNDEsNyBAQAogICogQHJlZmNudDogc3RydWN0IHJlZmVyZW5jZSBjb3VudAogICogQHByb3BzOiBjbGllbnQgcHJvcGVydGllcwogICogQGNsaWVudF9pZDogbWUgY2xpZW50IGlkCi0gKiBAbWVpX2Zsb3dfY3RybF9jcmVkczogZmxvdyBjb250cm9sIGNyZWRpdHMKKyAqIEB0eF9mbG93X2N0cmxfY3JlZHM6IGZsb3cgY29udHJvbCBjcmVkaXRzCiAgKiBAY29ubmVjdF9jb3VudDogbnVtYmVyIGNvbm5lY3Rpb25zIHRvIHRoaXMgY2xpZW50CiAgKiBAYnVzX2FkZGVkOiBhZGRlZCB0byBidXMKICAqLwpAQCAtMTU1LDcgKzE1MCw3IEBACiAJc3RydWN0IGtyZWYgcmVmY250OwogCXN0cnVjdCBtZWlfY2xpZW50X3Byb3BlcnRpZXMgcHJvcHM7CiAJdTggY2xpZW50X2lkOwotCXU4IG1laV9mbG93X2N0cmxfY3JlZHM7CisJdTggdHhfZmxvd19jdHJsX2NyZWRzOwogCXU4IGNvbm5lY3RfY291bnQ7CiAJdTggYnVzX2FkZGVkOwogfTsKQEAgLTIwMiwxMCArMTk3LDExIEBACiAgKiBAZXZfYXN5bmM6IGV2ZW50IGFzeW5jIG5vdGlmaWNhdGlvbgogICogQHN0YXR1czogY29ubmVjdGlvbiBzdGF0dXMKICAqIEBtZV9jbDogZncgY2xpZW50IGNvbm5lY3RlZAorICogQGZwOiBmaWxlIGFzc29jaWF0ZWQgd2l0aCBjbGllbnQKICAqIEBob3N0X2NsaWVudF9pZDogaG9zdCBpZAotICogQG1laV9mbG93X2N0cmxfY3JlZHM6IHRyYW5zbWl0IGZsb3cgY3JlZGVudGlhbHMKKyAqIEB0eF9mbG93X2N0cmxfY3JlZHM6IHRyYW5zbWl0IGZsb3cgY3JlZGVudGlhbHMKKyAqIEByeF9mbG93X2N0cmxfY3JlZHM6IHJlY2VpdmUgZmxvdyBjcmVkZW50aWFscwogICogQHRpbWVyX2NvdW50OiAgd2F0Y2hkb2cgdGltZXIgZm9yIG9wZXJhdGlvbiBjb21wbGV0aW9uCi0gKiBAcmVzZXJ2ZWQ6IHJlc2VydmVkIGZvciBhbGlnbm1lbnQKICAqIEBub3RpZnlfZW46IG5vdGlmaWNhdGlvbiAtIGVuYWJsZWQvZGlzYWJsZWQKICAqIEBub3RpZnlfZXY6IHBlbmRpbmcgbm90aWZpY2F0aW9uIGV2ZW50CiAgKiBAd3JpdGluZ19zdGF0ZTogc3RhdGUgb2YgdGhlIHR4CkBAIC0yMjUsMTAgKzIyMSwxMSBAQAogCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpldl9hc3luYzsKIAlpbnQgc3RhdHVzOwogCXN0cnVjdCBtZWlfbWVfY2xpZW50ICptZV9jbDsKKwljb25zdCBzdHJ1Y3QgZmlsZSAqZnA7CiAJdTggaG9zdF9jbGllbnRfaWQ7Ci0JdTggbWVpX2Zsb3dfY3RybF9jcmVkczsKKwl1OCB0eF9mbG93X2N0cmxfY3JlZHM7CisJdTggcnhfZmxvd19jdHJsX2NyZWRzOwogCXU4IHRpbWVyX2NvdW50OwotCXU4IHJlc2VydmVkOwogCXU4IG5vdGlmeV9lbjsKIAl1OCBub3RpZnlfZXY7CiAJZW51bSBtZWlfZmlsZV90cmFuc2FjdGlvbl9zdGF0ZXMgd3JpdGluZ19zdGF0ZTsKQEAgLTQwMCw5ICszOTcsNyBAQAogICogQG92ZXJyaWRlX2ZpeGVkX2FkZHJlc3M6IGZvcmNlIGFsbG93IGZpeGVkIGFkZHJlc3MgYmVoYXZpb3IKICAqCiAgKiBAYW10aGlmX2NtZF9saXN0IDogYW10aGlmIGxpc3QgZm9yIGNtZCB3YWl0aW5nCi0gKiBAaWFtdGhpZl9mcCA6IGZpbGUgZm9yIGN1cnJlbnQgYW10aGlmIG9wZXJhdGlvbgogICogQGlhbXRoaWZfY2wgIDogYW10aGlmIGhvc3QgY2xpZW50Ci0gKiBAaWFtdGhpZl9jdXJyZW50X2NiIDogYW10aGlmIGN1cnJlbnQgb3BlcmF0aW9uIGNhbGxiYWNrCiAgKiBAaWFtdGhpZl9vcGVuX2NvdW50IDogbnVtYmVyIG9mIG9wZW5lZCBhbXRoaWYgY29ubmVjdGlvbnMKICAqIEBpYW10aGlmX3N0YWxsX3RpbWVyIDogdGltZXIgdG8gZGV0ZWN0IGFtdGhpZiBoYW5nCiAgKiBAaWFtdGhpZl9zdGF0ZSA6IGFtdGhpZiBwcm9jZXNzb3Igc3RhdGUKQEAgLTQ4NCwxMCArNDc5LDcgQEAKIAogCS8qIGFtdGhpZiBsaXN0IGZvciBjbWQgd2FpdGluZyAqLwogCXN0cnVjdCBtZWlfY2xfY2IgYW10aGlmX2NtZF9saXN0OwotCS8qIGRyaXZlciBtYW5hZ2VkIGFtdGhpZiBsaXN0IGZvciByZWFkaW5nIGNvbXBsZXRlZCBhbXRoaWYgY21kIGRhdGEgKi8KLQljb25zdCBzdHJ1Y3QgZmlsZSAqaWFtdGhpZl9mcDsKIAlzdHJ1Y3QgbWVpX2NsIGlhbXRoaWZfY2w7Ci0Jc3RydWN0IG1laV9jbF9jYiAqaWFtdGhpZl9jdXJyZW50X2NiOwogCWxvbmcgaWFtdGhpZl9vcGVuX2NvdW50OwogCXUzMiBpYW10aGlmX3N0YWxsX3RpbWVyOwogCWVudW0gaWFtdGhpZl9zdGF0ZXMgaWFtdGhpZl9zdGF0ZTsKQEAgLTU1Niw2ICs1NDgsNyBAQAogICovCiAKIHZvaWQgbWVpX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIG1laV9zY2hlZHVsZV9zdGFsbF90aW1lcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKIGludCBtZWlfaXJxX3JlYWRfaGFuZGxlcihzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgbWVpX2NsX2NiICpjbXBsX2xpc3QsIHMzMiAqc2xvdHMpOwogCkBAIC01NjksMTEgKzU2Miw3IEBACiAKIGludCBtZWlfYW10aGlmX2hvc3RfaW5pdChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX21lX2NsaWVudCAqbWVfY2wpOwogCi1pbnQgbWVpX2FtdGhpZl9yZWFkKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxlLAotCQljaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGxlbmd0aCwgbG9mZl90ICpvZmZzZXQpOwotCi11bnNpZ25lZCBpbnQgbWVpX2FtdGhpZl9wb2xsKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKK3Vuc2lnbmVkIGludCBtZWlfYW10aGlmX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOwogCiBpbnQgbWVpX2FtdGhpZl9yZWxlYXNlKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHN0cnVjdCBmaWxlICpmaWxlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9wY2ktbWUuYyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLW1lLmMKaW5kZXggNjRlNjRkYS4uZjNmZmQ4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9wY2ktbWUuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL3BjaS1tZS5jCkBAIC04NSwxMiArODUsMTUgQEAKIAogCXtNRUlfUENJX0RFVklDRShNRUlfREVWX0lEX1NQVCwgbWVpX21lX3BjaDhfY2ZnKX0sCiAJe01FSV9QQ0lfREVWSUNFKE1FSV9ERVZfSURfU1BUXzIsIG1laV9tZV9wY2g4X2NmZyl9LAotCXtNRUlfUENJX0RFVklDRShNRUlfREVWX0lEX1NQVF9ILCBtZWlfbWVfcGNoOF9jZmcpfSwKLQl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9TUFRfSF8yLCBtZWlfbWVfcGNoOF9jZmcpfSwKKwl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9TUFRfSCwgbWVpX21lX3BjaDhfc3BzX2NmZyl9LAorCXtNRUlfUENJX0RFVklDRShNRUlfREVWX0lEX1NQVF9IXzIsIG1laV9tZV9wY2g4X3Nwc19jZmcpfSwKIAogCXtNRUlfUENJX0RFVklDRShNRUlfREVWX0lEX0JYVF9NLCBtZWlfbWVfcGNoOF9jZmcpfSwKIAl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9BUExfSSwgbWVpX21lX3BjaDhfY2ZnKX0sCiAKKwl7TUVJX1BDSV9ERVZJQ0UoTUVJX0RFVl9JRF9LQlAsIG1laV9tZV9wY2g4X2NmZyl9LAorCXtNRUlfUENJX0RFVklDRShNRUlfREVWX0lEX0tCUF8yLCBtZWlfbWVfcGNoOF9jZmcpfSwKKwogCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KIAl7MCwgfQogfTsKQEAgLTIxNyw4ICsyMjAsNiBAQAogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+dGltZXJfd29yaywgSFopOwotCiAJLyoKIAkqIEZvciBub3Qgd2FrZS1hYmxlIEhXIHJ1bnRpbWUgcG0gZnJhbWV3b3JrCiAJKiBjYW4ndCBiZSB1c2VkIG9uIHBjaSBkZXZpY2UgbGV2ZWwuCkBAIC00MDAsNiArNDAxLDkgQEAKIAogCWRldl9kYmcoJnBkZXYtPmRldiwgInJwbTogbWU6IHJ1bnRpbWUgc3VzcGVuZCByZXQ9JWRcbiIsIHJldCk7CiAKKwlpZiAocmV0ICYmIHJldCAhPSAtRUFHQUlOKQorCQlzY2hlZHVsZV93b3JrKCZkZXYtPnJlc2V0X3dvcmspOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDIzLDYgKzQyNyw5IEBACiAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJycG06IG1lOiBydW50aW1lIHJlc3VtZSByZXQgPSAlZFxuIiwgcmV0KTsKIAorCWlmIChyZXQpCisJCXNjaGVkdWxlX3dvcmsoJmRldi0+cmVzZXRfd29yayk7CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL3BjaS10eGUuYyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLXR4ZS5jCmluZGV4IDMwY2MzMDYuLjU4ZmZkMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvcGNpLXR4ZS5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLXR4ZS5jCkBAIC0zNDcsNiArMzQ3LDEwIEBACiAJZGV2X2RiZygmcGRldi0+ZGV2LCAicnBtOiB0eGU6IHJ1bnRpbWUgc3VzcGVuZCByZXQ9JWRcbiIsIHJldCk7CiAKIAltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCisJaWYgKHJldCAmJiByZXQgIT0gLUVBR0FJTikKKwkJc2NoZWR1bGVfd29yaygmZGV2LT5yZXNldF93b3JrKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM3Miw2ICszNzYsOSBAQAogCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAicnBtOiB0eGU6IHJ1bnRpbWUgcmVzdW1lIHJldCA9ICVkXG4iLCByZXQpOwogCisJaWYgKHJldCkKKwkJc2NoZWR1bGVfd29yaygmZGV2LT5yZXNldF93b3JrKTsKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9taWMvc2NpZi9zY2lmX2RtYS5jIGIvZHJpdmVycy9taXNjL21pYy9zY2lmL3NjaWZfZG1hLmMKaW5kZXggY2QwMWEwZS4uNjRkNTc2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21pYy9zY2lmL3NjaWZfZG1hLmMKKysrIGIvZHJpdmVycy9taXNjL21pYy9zY2lmL3NjaWZfZG1hLmMKQEAgLTExNSw3ICsxMTUsNiBAQAogICovCiBzdGF0aWMKIHZvaWQgX19zY2lmX3JtYV9kZXN0cm95X3RjdyhzdHJ1Y3Qgc2NpZl9tbXVfbm90aWYgKm1tbiwKLQkJCSAgICBzdHJ1Y3Qgc2NpZl9lbmRwdCAqZXAsCiAJCQkgICAgdTY0IHN0YXJ0LCB1NjQgbGVuKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW0sICp0bXA7CkBAIC0xMjgsNyArMTI3LDYgQEAKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShpdGVtLCB0bXAsICZtbW4tPnRjX3JlZ19saXN0KSB7CiAJCXdpbmRvdyA9IGxpc3RfZW50cnkoaXRlbSwgc3RydWN0IHNjaWZfd2luZG93LCBsaXN0KTsKLQkJZXAgPSAoc3RydWN0IHNjaWZfZW5kcHQgKil3aW5kb3ctPmVwOwogCQlpZiAoIWxlbikKIAkJCWJyZWFrOwogCQlzdGFydF92YSA9IHdpbmRvdy0+dmFfZm9yX3RlbXA7CkBAIC0xNDYsNyArMTQ0LDcgQEAKIAlzdHJ1Y3Qgc2NpZl9lbmRwdCAqZXAgPSBtbW4tPmVwOwogCiAJc3Bpbl9sb2NrKCZlcC0+cm1hX2luZm8udGNfbG9jayk7Ci0JX19zY2lmX3JtYV9kZXN0cm95X3RjdyhtbW4sIGVwLCBzdGFydCwgbGVuKTsKKwlfX3NjaWZfcm1hX2Rlc3Ryb3lfdGN3KG1tbiwgc3RhcnQsIGxlbik7CiAJc3Bpbl91bmxvY2soJmVwLT5ybWFfaW5mby50Y19sb2NrKTsKIH0KIApAQCAtMTY5LDcgKzE2Nyw3IEBACiAJc3Bpbl9sb2NrKCZlcC0+cm1hX2luZm8udGNfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKGl0ZW0sIHRtcCwgJmVwLT5ybWFfaW5mby5tbW5fbGlzdCkgewogCQltbW4gPSBsaXN0X2VudHJ5KGl0ZW0sIHN0cnVjdCBzY2lmX21tdV9ub3RpZiwgbGlzdCk7Ci0JCV9fc2NpZl9ybWFfZGVzdHJveV90Y3cobW1uLCBlcCwgMCwgVUxPTkdfTUFYKTsKKwkJX19zY2lmX3JtYV9kZXN0cm95X3RjdyhtbW4sIDAsIFVMT05HX01BWCk7CiAJfQogCXNwaW5fdW5sb2NrKCZlcC0+cm1hX2luZm8udGNfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWljL3NjaWYvc2NpZl9tbWFwLmMgYi9kcml2ZXJzL21pc2MvbWljL3NjaWYvc2NpZl9tbWFwLmMKaW5kZXggNDljYjhmNy4uOTI4MjExNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21pYy9zY2lmL3NjaWZfbW1hcC5jCisrKyBiL2RyaXZlcnMvbWlzYy9taWMvc2NpZi9zY2lmX21tYXAuYwpAQCAtNTUyLDcgKzU1Miw3IEBACiB7CiAJc3RydWN0IHNjaWZfZW5kcHQgKmVwOwogCXN0cnVjdCB2bWFfcHZ0ICp2bWFwdnQgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQlpbnQgbnJfcGFnZXMgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUOworCWludCBucl9wYWdlcyA9IHZtYV9wYWdlcyh2bWEpOwogCXM2NCBvZmZzZXQ7CiAJc3RydWN0IHNjaWZfcm1hX3JlcSByZXE7CiAJc3RydWN0IHNjaWZfd2luZG93ICp3aW5kb3cgPSBOVUxMOwpAQCAtNjE0LDcgKzYxNCw3IEBACiAJc3RydWN0IHNjaWZfd2luZG93ICp3aW5kb3cgPSBOVUxMOwogCXN0cnVjdCBzY2lmX2VuZHB0ICplcCA9IChzdHJ1Y3Qgc2NpZl9lbmRwdCAqKWVwZDsKIAlzNjQgc3RhcnRfb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwotCWludCBucl9wYWdlcyA9ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7CisJaW50IG5yX3BhZ2VzID0gdm1hX3BhZ2VzKHZtYSk7CiAJaW50IGVycjsKIAlzdHJ1Y3Qgdm1hX3B2dCAqdm1hcHZ0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvcGNoX3BodWIuYyBiL2RyaXZlcnMvbWlzYy9wY2hfcGh1Yi5jCmluZGV4IDQ4MTBlMDMuLmU0MmJkYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9wY2hfcGh1Yi5jCisrKyBiL2RyaXZlcnMvbWlzYy9wY2hfcGh1Yi5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNkZWZpbmUgUEhVQl9TVEFUVVMgMHgwMAkJLyogU3RhdHVzIFJlZ2lzdGVyIG9mZnNldCAqLwogI2RlZmluZSBQSFVCX0NPTlRST0wgMHgwNAkJLyogQ29udHJvbCBSZWdpc3RlciBvZmZzZXQgKi8KQEAgLTU3LDYgKzU4LDcgQEAKIAogLyogQ00taVRDICovCiAjZGVmaW5lIENMS0NGR19VQVJUXzQ4TUhaCQkJKDEgPDwgMTYpCisjZGVmaW5lIENMS0NGR19VQVJUXzI1TUhaCQkJKDIgPDwgMTYpCiAjZGVmaW5lIENMS0NGR19CQVVERElWCQkJCSgyIDw8IDIwKQogI2RlZmluZSBDTEtDRkdfUExMMlZDTwkJCQkoOCA8PCA5KQogI2RlZmluZSBDTEtDRkdfVUFSVENMS1NFTAkJCSgxIDw8IDE4KQpAQCAtNzExLDYgKzcxMywxMiBAQAogCiAJaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSAxKSB7IC8qIEVHMjBUIFBDSCAqLwogCQljb25zdCBjaGFyICpib2FyZF9uYW1lOworCQl1bnNpZ25lZCBpbnQgcHJlZmV0Y2ggPSAweDAwMGFmZmFhOworCisJCWlmIChwZGV2LT5kZXYub2Zfbm9kZSkKKwkJCW9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkJICAiaW50ZWwsZWcyMHQtcHJlZmV0Y2giLAorCQkJCQkJICAmcHJlZmV0Y2gpOwogCiAJCXJldCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYua29iaiwKIAkJCQkJJmRldl9hdHRyX3BjaF9tYWMuYXR0cik7CkBAIC03MzYsMTEgKzc0NCwyMSBAQAogCQkJCQkJQ0xLQ0ZHX1VBUlRfTUFTSyk7CiAKIAkJLyogc2V0IHRoZSBwcmVmZWNoIHZhbHVlICovCi0JCWlvd3JpdGUzMigweDAwMGFmZmFhLCBjaGlwLT5wY2hfcGh1Yl9iYXNlX2FkZHJlc3MgKyAweDE0KTsKKwkJaW93cml0ZTMyKHByZWZldGNoLCBjaGlwLT5wY2hfcGh1Yl9iYXNlX2FkZHJlc3MgKyAweDE0KTsKIAkJLyogc2V0IHRoZSBpbnRlcnJ1cHQgZGVsYXkgdmFsdWUgKi8KIAkJaW93cml0ZTMyKDB4MjUsIGNoaXAtPnBjaF9waHViX2Jhc2VfYWRkcmVzcyArIDB4NDQpOwogCQljaGlwLT5wY2hfb3B0X3JvbV9zdGFydF9hZGRyZXNzID0gUENIX1BIVUJfUk9NX1NUQVJUX0FERFJfRUcyMFQ7CiAJCWNoaXAtPnBjaF9tYWNfc3RhcnRfYWRkcmVzcyA9IFBDSF9QSFVCX01BQ19TVEFSVF9BRERSX0VHMjBUOworCisJCS8qIHF1aXJrIGZvciBNSVBTIEJvc3RvbiBwbGF0Zm9ybSAqLworCQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJCWlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImltZyxib3N0b24iKSkgeworCQkJCXBjaF9waHViX3JlYWRfbW9kaWZ5X3dyaXRlX3JlZyhjaGlwLAorCQkJCQkodW5zaWduZWQgaW50KUNMS0NGR19SRUdfT0ZGU0VULAorCQkJCQlDTEtDRkdfVUFSVF8yNU1IWiwKKwkJCQkJQ0xLQ0ZHX1VBUlRfTUFTSyk7CisJCQl9CisJCX0KIAl9IGVsc2UgaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSAyKSB7IC8qIE1MNzIxMyBJT0ggKi8KIAkJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJnBjaF9iaW5fYXR0cik7CiAJCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvdm13X3ZtY2kvdm1jaV9ob3N0LmMgYi9kcml2ZXJzL21pc2Mvdm13X3ZtY2kvdm1jaV9ob3N0LmMKaW5kZXggOWVjMjYyYS4uZWMwOTAxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3Ztd192bWNpL3ZtY2lfaG9zdC5jCisrKyBiL2RyaXZlcnMvbWlzYy92bXdfdm1jaS92bWNpX2hvc3QuYwpAQCAtMzgxLDE4ICszODEsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGcgPSBrbWFsbG9jKHNlbmRfaW5mby5sZW4sIEdGUF9LRVJORUwpOwotCWlmICghZGcpIHsKKwlkZyA9IG1lbWR1cF91c2VyKCh2b2lkIF9fdXNlciAqKSh1aW50cHRyX3Qpc2VuZF9pbmZvLmFkZHIsCisJCQkgc2VuZF9pbmZvLmxlbik7CisJaWYgKElTX0VSUihkZykpIHsKIAkJdm1jaV9pb2N0bF9lcnIoCiAJCQkiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSB0byBkaXNwYXRjaCBkYXRhZ3JhbVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmIChjb3B5X2Zyb21fdXNlcihkZywgKHZvaWQgX191c2VyICopKHVpbnRwdHJfdClzZW5kX2luZm8uYWRkciwKLQkJCSAgIHNlbmRfaW5mby5sZW4pKSB7Ci0JCXZtY2lfaW9jdGxfZXJyKCJlcnJvciBnZXR0aW5nIGRhdGFncmFtXG4iKTsKLQkJa2ZyZWUoZGcpOwotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIFBUUl9FUlIoZGcpOwogCX0KIAogCWlmIChWTUNJX0RHX1NJWkUoZGcpICE9IHNlbmRfaW5mby5sZW4pIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYwppbmRleCAyMjA2ZDQ0Li5jMzMzNTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCkBAIC0xNDIsOCArMTQyLDYgQEAKIHsKIAlzdHJ1Y3QgbW1jX3BhY2tlZCAqcGFja2VkID0gbXFycS0+cGFja2VkOwogCi0JQlVHX09OKCFwYWNrZWQpOwotCiAJbXFycS0+Y21kX3R5cGUgPSBNTUNfUEFDS0VEX05PTkU7CiAJcGFja2VkLT5ucl9lbnRyaWVzID0gTU1DX1BBQ0tFRF9OUl9aRVJPOwogCXBhY2tlZC0+aWR4X2ZhaWx1cmUgPSBNTUNfUEFDS0VEX05SX0lEWDsKQEAgLTE0NDMsOCArMTQ0MSw2IEBACiAJaW50IGVyciwgY2hlY2ssIHN0YXR1czsKIAl1OCAqZXh0X2NzZDsKIAotCUJVR19PTighcGFja2VkKTsKLQogCXBhY2tlZC0+cmV0cmllcy0tOwogCWNoZWNrID0gbW1jX2Jsa19lcnJfY2hlY2soY2FyZCwgYXJlcSk7CiAJZXJyID0gZ2V0X2NhcmRfc3RhdHVzKGNhcmQsICZzdGF0dXMsIDApOwpAQCAtMTY3Myw2ICsxNjY5LDE4IEBACiAJdTggbWF4X3BhY2tlZF9ydyA9IDA7CiAJdTggcmVxcyA9IDA7CiAKKwkvKgorCSAqIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgcGFja2VkIGZvciBhbnkgZnVydGhlcgorCSAqIG9wZXJhdGlvbiBvZiBwYWNrZWQgc3R1ZmYgYXMgd2Ugc2V0IE1NQ19QQUNLRURfTk9ORQorCSAqIGFuZCByZXR1cm4gemVybyBmb3IgcmVxcyBpZiBnZXRpbmcgbnVsbCBwYWNrZWQuIEFsc28KKwkgKiB3ZSBjbGVhbiB0aGUgZmxhZyBvZiBNTUNfQkxLX1BBQ0tFRF9DTUQgdG8gYXZvaWQgZG9pbmcKKwkgKiBpdCBhZ2FpbiB3aGVuIHJlbW92aW5nIGJsayByZXEuCisJICovCisJaWYgKCFtcXJxLT5wYWNrZWQpIHsKKwkJbWQtPmZsYWdzICY9ICh+TU1DX0JMS19QQUNLRURfQ01EKTsKKwkJZ290byBub19wYWNrZWQ7CisJfQorCiAJaWYgKCEobWQtPmZsYWdzICYgTU1DX0JMS19QQUNLRURfQ01EKSkKIAkJZ290byBub19wYWNrZWQ7CiAKQEAgLTE3ODIsOCArMTc5MCw2IEBACiAJdTggaGRyX2Jsb2NrczsKIAl1OCBpID0gMTsKIAotCUJVR19PTighcGFja2VkKTsKLQogCW1xcnEtPmNtZF90eXBlID0gTU1DX1BBQ0tFRF9XUklURTsKIAlwYWNrZWQtPmJsb2NrcyA9IDA7CiAJcGFja2VkLT5pZHhfZmFpbHVyZSA9IE1NQ19QQUNLRURfTlJfSURYOwpAQCAtMTg4Nyw4ICsxODkzLDYgQEAKIAlpbnQgaWR4ID0gcGFja2VkLT5pZHhfZmFpbHVyZSwgaSA9IDA7CiAJaW50IHJldCA9IDA7CiAKLQlCVUdfT04oIXBhY2tlZCk7Ci0KIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnBhY2tlZC0+bGlzdCkpIHsKIAkJcHJxID0gbGlzdF9lbnRyeV9ycShwYWNrZWQtPmxpc3QubmV4dCk7CiAJCWlmIChpZHggPT0gaSkgewpAQCAtMTkxNyw4ICsxOTIxLDYgQEAKIAlzdHJ1Y3QgcmVxdWVzdCAqcHJxOwogCXN0cnVjdCBtbWNfcGFja2VkICpwYWNrZWQgPSBtcV9ycS0+cGFja2VkOwogCi0JQlVHX09OKCFwYWNrZWQpOwotCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZwYWNrZWQtPmxpc3QpKSB7CiAJCXBycSA9IGxpc3RfZW50cnlfcnEocGFja2VkLT5saXN0Lm5leHQpOwogCQlsaXN0X2RlbF9pbml0KCZwcnEtPnF1ZXVlbGlzdCk7CkBAIC0xOTM1LDggKzE5MzcsNiBAQAogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gbXEtPnF1ZXVlOwogCXN0cnVjdCBtbWNfcGFja2VkICpwYWNrZWQgPSBtcV9ycS0+cGFja2VkOwogCi0JQlVHX09OKCFwYWNrZWQpOwotCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZwYWNrZWQtPmxpc3QpKSB7CiAJCXBycSA9IGxpc3RfZW50cnlfcnEocGFja2VkLT5saXN0LnByZXYpOwogCQlpZiAocHJxLT5xdWV1ZWxpc3QucHJldiAhPSAmcGFja2VkLT5saXN0KSB7CkBAIC0yMTQ0LDcgKzIxNDQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1tY19ibGtfaXNzdWVfcnEoc3RydWN0IG1tY19xdWV1ZSAqbXEsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCitpbnQgbW1jX2Jsa19pc3N1ZV9ycShzdHJ1Y3QgbW1jX3F1ZXVlICptcSwgc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBtbWNfYmxrX2RhdGEgKm1kID0gbXEtPmRhdGE7CkBAIC0yMjY1LDcgKzIyNjUsNiBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3B1dGRpc2s7CiAKLQltZC0+cXVldWUuaXNzdWVfZm4gPSBtbWNfYmxrX2lzc3VlX3JxOwogCW1kLT5xdWV1ZS5kYXRhID0gbWQ7CiAKIAltZC0+ZGlzay0+bWFqb3IJPSBNTUNfQkxPQ0tfTUFKT1I7CkBAIC0yMzAzLDcgKzIzMDIsOCBAQAogCXNldF9jYXBhY2l0eShtZC0+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+ZGV2X2FkZHIsIHVzZV9zYmMsIDAsIHdyaXRlLAorCQkJCQl1c2VfYXJlcSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBtbWNfdGVzdF9vbmdvaW5nX3RyYW5zZmVyKHRlc3QsIHQtPmRldl9hZGRyLCB1c2Vfc2JjLCAxLCB3cml0ZSwKKwkJCQkJIHVzZV9hcmVxKTsKK30KKworc3RhdGljIGludCBtbWNfdGVzdF9jbWRzX2R1cmluZ190ZnIoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QsIGludCB1c2Vfc2JjLAorCQkJCSAgICBpbnQgd3JpdGUsIGludCB1c2VfYXJlcSkKK3sKKwlzdHJ1Y3QgbW1jX3Rlc3RfYXJlYSAqdCA9ICZ0ZXN0LT5hcmVhOworCXVuc2lnbmVkIGxvbmcgc3o7CisJaW50IHJldDsKKworCWZvciAoc3ogPSA1MTI7IHN6IDw9IHQtPm1heF90ZnI7IHN6ICs9IDUxMikgeworCQlyZXQgPSBfX21tY190ZXN0X2NtZHNfZHVyaW5nX3Rmcih0ZXN0LCBzeiwgdXNlX3NiYywgd3JpdGUsCisJCQkJCQkgdXNlX2FyZXEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb21tYW5kcyBkdXJpbmcgcmVhZCAtIG5vIFNldCBCbG9jayBDb3VudCAoQ01EMjMpLgorICovCitzdGF0aWMgaW50IG1tY190ZXN0X2NtZHNfZHVyaW5nX3JlYWQoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCit7CisJcmV0dXJuIG1tY190ZXN0X2NtZHNfZHVyaW5nX3Rmcih0ZXN0LCAwLCAwLCAwKTsKK30KKworLyoKKyAqIENvbW1hbmRzIGR1cmluZyB3cml0ZSAtIG5vIFNldCBCbG9jayBDb3VudCAoQ01EMjMpLgorICovCitzdGF0aWMgaW50IG1tY190ZXN0X2NtZHNfZHVyaW5nX3dyaXRlKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXJldHVybiBtbWNfdGVzdF9jbWRzX2R1cmluZ190ZnIodGVzdCwgMCwgMSwgMCk7Cit9CisKKy8qCisgKiBDb21tYW5kcyBkdXJpbmcgcmVhZCAtIHVzZSBTZXQgQmxvY2sgQ291bnQgKENNRDIzKS4KKyAqLworc3RhdGljIGludCBtbWNfdGVzdF9jbWRzX2R1cmluZ19yZWFkX2NtZDIzKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXJldHVybiBtbWNfdGVzdF9jbWRzX2R1cmluZ190ZnIodGVzdCwgMSwgMCwgMCk7Cit9CisKKy8qCisgKiBDb21tYW5kcyBkdXJpbmcgd3JpdGUgLSB1c2UgU2V0IEJsb2NrIENvdW50IChDTUQyMykuCisgKi8KK3N0YXRpYyBpbnQgbW1jX3Rlc3RfY21kc19kdXJpbmdfd3JpdGVfY21kMjMoc3RydWN0IG1tY190ZXN0X2NhcmQgKnRlc3QpCit7CisJcmV0dXJuIG1tY190ZXN0X2NtZHNfZHVyaW5nX3Rmcih0ZXN0LCAxLCAxLCAwKTsKK30KKworLyoKKyAqIENvbW1hbmRzIGR1cmluZyBub24tYmxvY2tpbmcgcmVhZCAtIHVzZSBTZXQgQmxvY2sgQ291bnQgKENNRDIzKS4KKyAqLworc3RhdGljIGludCBtbWNfdGVzdF9jbWRzX2R1cmluZ19yZWFkX2NtZDIzX25vbmJsb2NrKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXJldHVybiBtbWNfdGVzdF9jbWRzX2R1cmluZ190ZnIodGVzdCwgMSwgMCwgMSk7Cit9CisKKy8qCisgKiBDb21tYW5kcyBkdXJpbmcgbm9uLWJsb2NraW5nIHdyaXRlIC0gdXNlIFNldCBCbG9jayBDb3VudCAoQ01EMjMpLgorICovCitzdGF0aWMgaW50IG1tY190ZXN0X2NtZHNfZHVyaW5nX3dyaXRlX2NtZDIzX25vbmJsb2NrKHN0cnVjdCBtbWNfdGVzdF9jYXJkICp0ZXN0KQoreworCXJldHVybiBtbWNfdGVzdF9jbWRzX2R1cmluZ190ZnIodGVzdCwgMSwgMSwgMSk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbW1jX3Rlc3RfY2FzZSBtbWNfdGVzdF9jYXNlc1tdID0gewogCXsKIAkJLm5hbWUgPSAiQmFzaWMgd3JpdGUgKG5vIGRhdGEgdmVyaWZpY2F0aW9uKSIsCkBAIC0yNjA1LDYgKzI4NzEsNDggQEAKIAkJLm5hbWUgPSAiUmVzZXQgdGVzdCIsCiAJCS5ydW4gPSBtbWNfdGVzdF9yZXNldCwKIAl9LAorCisJeworCQkubmFtZSA9ICJDb21tYW5kcyBkdXJpbmcgcmVhZCAtIG5vIFNldCBCbG9jayBDb3VudCAoQ01EMjMpIiwKKwkJLnByZXBhcmUgPSBtbWNfdGVzdF9hcmVhX3ByZXBhcmUsCisJCS5ydW4gPSBtbWNfdGVzdF9jbWRzX2R1cmluZ19yZWFkLAorCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKKwl9LAorCisJeworCQkubmFtZSA9ICJDb21tYW5kcyBkdXJpbmcgd3JpdGUgLSBubyBTZXQgQmxvY2sgQ291bnQgKENNRDIzKSIsCisJCS5wcmVwYXJlID0gbW1jX3Rlc3RfYXJlYV9wcmVwYXJlLAorCQkucnVuID0gbW1jX3Rlc3RfY21kc19kdXJpbmdfd3JpdGUsCisJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAorCX0sCisKKwl7CisJCS5uYW1lID0gIkNvbW1hbmRzIGR1cmluZyByZWFkIC0gdXNlIFNldCBCbG9jayBDb3VudCAoQ01EMjMpIiwKKwkJLnByZXBhcmUgPSBtbWNfdGVzdF9hcmVhX3ByZXBhcmUsCisJCS5ydW4gPSBtbWNfdGVzdF9jbWRzX2R1cmluZ19yZWFkX2NtZDIzLAorCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKKwl9LAorCisJeworCQkubmFtZSA9ICJDb21tYW5kcyBkdXJpbmcgd3JpdGUgLSB1c2UgU2V0IEJsb2NrIENvdW50IChDTUQyMykiLAorCQkucHJlcGFyZSA9IG1tY190ZXN0X2FyZWFfcHJlcGFyZSwKKwkJLnJ1biA9IG1tY190ZXN0X2NtZHNfZHVyaW5nX3dyaXRlX2NtZDIzLAorCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKKwl9LAorCisJeworCQkubmFtZSA9ICJDb21tYW5kcyBkdXJpbmcgbm9uLWJsb2NraW5nIHJlYWQgLSB1c2UgU2V0IEJsb2NrIENvdW50IChDTUQyMykiLAorCQkucHJlcGFyZSA9IG1tY190ZXN0X2FyZWFfcHJlcGFyZSwKKwkJLnJ1biA9IG1tY190ZXN0X2NtZHNfZHVyaW5nX3JlYWRfY21kMjNfbm9uYmxvY2ssCisJCS5jbGVhbnVwID0gbW1jX3Rlc3RfYXJlYV9jbGVhbnVwLAorCX0sCisKKwl7CisJCS5uYW1lID0gIkNvbW1hbmRzIGR1cmluZyBub24tYmxvY2tpbmcgd3JpdGUgLSB1c2UgU2V0IEJsb2NrIENvdW50IChDTUQyMykiLAorCQkucHJlcGFyZSA9IG1tY190ZXN0X2FyZWFfcHJlcGFyZSwKKwkJLnJ1biA9IG1tY190ZXN0X2NtZHNfZHVyaW5nX3dyaXRlX2NtZDIzX25vbmJsb2NrLAorCQkuY2xlYW51cCA9IG1tY190ZXN0X2FyZWFfY2xlYW51cCwKKwl9LAogfTsKIAogc3RhdGljIERFRklORV9NVVRFWChtbWNfdGVzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYyBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYwppbmRleCA3MDgwNTcyLi44MDM3ZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCkBAIC0xOSw3ICsxOSw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisKICNpbmNsdWRlICJxdWV1ZS5oIgorI2luY2x1ZGUgImJsb2NrLmgiCiAKICNkZWZpbmUgTU1DX1FVRVVFX0JPVU5DRVNaCTY1NTM2CiAKQEAgLTY4LDcgKzcwLDcgQEAKIAkJCWJvb2wgcmVxX2lzX3NwZWNpYWwgPSBtbWNfcmVxX2lzX3NwZWNpYWwocmVxKTsKIAogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJCW1xLT5pc3N1ZV9mbihtcSwgcmVxKTsKKwkJCW1tY19ibGtfaXNzdWVfcnEobXEsIHJlcSk7CiAJCQljb25kX3Jlc2NoZWQoKTsKIAkJCWlmIChtcS0+ZmxhZ3MgJiBNTUNfUVVFVUVfTkVXX1JFUVVFU1QpIHsKIAkJCQltcS0+ZmxhZ3MgJj0gfk1NQ19RVUVVRV9ORVdfUkVRVUVTVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuaCBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuaAppbmRleCBmZWU1ZTEyLi4zYzE1YTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmgKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5oCkBAIC01Nyw4ICs1Nyw2IEBACiAJdW5zaWduZWQgaW50CQlmbGFnczsKICNkZWZpbmUgTU1DX1FVRVVFX1NVU1BFTkRFRAkoMSA8PCAwKQogI2RlZmluZSBNTUNfUVVFVUVfTkVXX1JFUVVFU1QJKDEgPDwgMSkKLQotCWludAkJCSgqaXNzdWVfZm4pKHN0cnVjdCBtbWNfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CiAJdm9pZAkJCSpkYXRhOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlCSpxdWV1ZTsKIAlzdHJ1Y3QgbW1jX3F1ZXVlX3JlcQltcXJxWzJdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMgYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYwppbmRleCBlNTVjZGU2Li4yNTUzZDkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYwpAQCAtNTgsNiArNTgsOSBAQAogICovCiAjZGVmaW5lIE1NQ19CS09QU19NQVhfVElNRU9VVAkoNCAqIDYwICogMTAwMCkgLyogbWF4IHRpbWUgdG8gd2FpdCBpbiBtcyAqLwogCisvKiBUaGUgbWF4IGVyYXNlIHRpbWVvdXQsIHVzZWQgd2hlbiBob3N0LT5tYXhfYnVzeV90aW1lb3V0IGlzbid0IHNwZWNpZmllZCAqLworI2RlZmluZSBNTUNfRVJBU0VfVElNRU9VVF9NUwkoNjAgKiAxMDAwKSAvKiA2MCBzICovCisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBmcmVxc1tdID0geyA0MDAwMDAsIDMwMDAwMCwgMjAwMDAwLCAxMDAwMDAgfTsKIAogLyoKQEAgLTExNyw2ICsxMjAsMjQgQEAKIAogI2VuZGlmIC8qIENPTkZJR19GQUlMX01NQ19SRVFVRVNUICovCiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfY29tcGxldGVfY21kKHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQoreworCWlmIChtcnEtPmNhcF9jbWRfZHVyaW5nX3RmciAmJiAhY29tcGxldGlvbl9kb25lKCZtcnEtPmNtZF9jb21wbGV0aW9uKSkKKwkJY29tcGxldGVfYWxsKCZtcnEtPmNtZF9jb21wbGV0aW9uKTsKK30KKwordm9pZCBtbWNfY29tbWFuZF9kb25lKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCit7CisJaWYgKCFtcnEtPmNhcF9jbWRfZHVyaW5nX3RmcikKKwkJcmV0dXJuOworCisJbW1jX2NvbXBsZXRlX2NtZChtcnEpOworCisJcHJfZGVidWcoIiVzOiBjbWQgZG9uZSwgdGZyIG9uZ29pbmcgKENNRCV1KVxuIiwKKwkJIG1tY19ob3N0bmFtZShob3N0KSwgbXJxLT5jbWQtPm9wY29kZSk7Cit9CitFWFBPUlRfU1lNQk9MKG1tY19jb21tYW5kX2RvbmUpOworCiAvKioKICAqCW1tY19yZXF1ZXN0X2RvbmUgLSBmaW5pc2ggcHJvY2Vzc2luZyBhbiBNTUMgcmVxdWVzdAogICoJQGhvc3Q6IE1NQyBob3N0IHdoaWNoIGNvbXBsZXRlZCByZXF1ZXN0CkBAIC0xNDMsNiArMTY0LDExIEBACiAJCQljbWQtPnJldHJpZXMgPSAwOwogCX0KIAorCWlmIChob3N0LT5vbmdvaW5nX21ycSA9PSBtcnEpCisJCWhvc3QtPm9uZ29pbmdfbXJxID0gTlVMTDsKKworCW1tY19jb21wbGV0ZV9jbWQobXJxKTsKKwogCXRyYWNlX21tY19yZXF1ZXN0X2RvbmUoaG9zdCwgbXJxKTsKIAogCWlmIChlcnIgJiYgY21kLT5yZXRyaWVzICYmICFtbWNfY2FyZF9yZW1vdmVkKGhvc3QtPmNhcmQpKSB7CkBAIC0xNTUsNyArMTgxLDggQEAKIAl9IGVsc2UgewogCQltbWNfc2hvdWxkX2ZhaWxfcmVxdWVzdChob3N0LCBtcnEpOwogCi0JCWxlZF90cmlnZ2VyX2V2ZW50KGhvc3QtPmxlZCwgTEVEX09GRik7CisJCWlmICghaG9zdC0+b25nb2luZ19tcnEpCisJCQlsZWRfdHJpZ2dlcl9ldmVudChob3N0LT5sZWQsIExFRF9PRkYpOwogCiAJCWlmIChtcnEtPnNiYykgewogCQkJcHJfZGVidWcoIiVzOiByZXEgZG9uZSA8Q01EJXU+OiAlZDogJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKQEAgLTIyMCw2ICsyNDcsMTUgQEAKIAkJfQogCX0KIAorCWlmIChtcnEtPmNhcF9jbWRfZHVyaW5nX3RmcikgeworCQlob3N0LT5vbmdvaW5nX21ycSA9IG1ycTsKKwkJLyoKKwkJICogUmV0cnkgcGF0aCBjb3VsZCBjb21lIHRocm91Z2ggaGVyZSB3aXRob3V0IGhhdmluZyB3YWl0aW5nIG9uCisJCSAqIGNtZF9jb21wbGV0aW9uLCBzbyBlbnN1cmUgaXQgaXMgcmVpbml0aWFsaXNlZC4KKwkJICovCisJCXJlaW5pdF9jb21wbGV0aW9uKCZtcnEtPmNtZF9jb21wbGV0aW9uKTsKKwl9CisKIAl0cmFjZV9tbWNfcmVxdWVzdF9zdGFydChob3N0LCBtcnEpOwogCiAJaG9zdC0+b3BzLT5yZXF1ZXN0KGhvc3QsIG1ycSk7CkBAIC0zODYsNiArNDIyLDE4IEBACiAJY29tcGxldGUoJm1ycS0+Y29tcGxldGlvbik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWNfd2FpdF9vbmdvaW5nX3Rmcl9jbWQoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCXN0cnVjdCBtbWNfcmVxdWVzdCAqb25nb2luZ19tcnEgPSBSRUFEX09OQ0UoaG9zdC0+b25nb2luZ19tcnEpOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhbiBvbmdvaW5nIHRyYW5zZmVyLCB3YWl0IGZvciB0aGUgY29tbWFuZCBsaW5lIHRvIGJlY29tZQorCSAqIGF2YWlsYWJsZS4KKwkgKi8KKwlpZiAob25nb2luZ19tcnEgJiYgIWNvbXBsZXRpb25fZG9uZSgmb25nb2luZ19tcnEtPmNtZF9jb21wbGV0aW9uKSkKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmb25nb2luZ19tcnEtPmNtZF9jb21wbGV0aW9uKTsKK30KKwogLyoKICAqX19tbWNfc3RhcnRfZGF0YV9yZXEoKSAtIHN0YXJ0cyBkYXRhIHJlcXVlc3QKICAqIEBob3N0OiBNTUMgaG9zdCB0byBzdGFydCB0aGUgcmVxdWVzdApAQCAtMzkzLDE3ICs0NDEsMjQgQEAKICAqCiAgKiBTZXRzIHRoZSBkb25lIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHJlcXVlc3QgaXMgY29tcGxldGVkIGJ5IHRoZSBjYXJkLgogICogU3RhcnRzIGRhdGEgbW1jIHJlcXVlc3QgZXhlY3V0aW9uCisgKiBJZiBhbiBvbmdvaW5nIHRyYW5zZmVyIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIHdhaXQgZm9yIHRoZSBjb21tYW5kIGxpbmUKKyAqIHRvIGJlY29tZSBhdmFpbGFibGUgYmVmb3JlIHNlbmRpbmcgYW5vdGhlciBjb21tYW5kLgogICovCiBzdGF0aWMgaW50IF9fbW1jX3N0YXJ0X2RhdGFfcmVxKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpCiB7CiAJaW50IGVycjsKIAorCW1tY193YWl0X29uZ29pbmdfdGZyX2NtZChob3N0KTsKKwogCW1ycS0+ZG9uZSA9IG1tY193YWl0X2RhdGFfZG9uZTsKIAltcnEtPmhvc3QgPSBob3N0OwogCisJaW5pdF9jb21wbGV0aW9uKCZtcnEtPmNtZF9jb21wbGV0aW9uKTsKKwogCWVyciA9IG1tY19zdGFydF9yZXF1ZXN0KGhvc3QsIG1ycSk7CiAJaWYgKGVycikgewogCQltcnEtPmNtZC0+ZXJyb3IgPSBlcnI7CisJCW1tY19jb21wbGV0ZV9jbWQobXJxKTsKIAkJbW1jX3dhaXRfZGF0YV9kb25lKG1ycSk7CiAJfQogCkBAIC00MTQsMTIgKzQ2OSwxNyBAQAogewogCWludCBlcnI7CiAKKwltbWNfd2FpdF9vbmdvaW5nX3Rmcl9jbWQoaG9zdCk7CisKIAlpbml0X2NvbXBsZXRpb24oJm1ycS0+Y29tcGxldGlvbik7CiAJbXJxLT5kb25lID0gbW1jX3dhaXRfZG9uZTsKIAorCWluaXRfY29tcGxldGlvbigmbXJxLT5jbWRfY29tcGxldGlvbik7CisKIAllcnIgPSBtbWNfc3RhcnRfcmVxdWVzdChob3N0LCBtcnEpOwogCWlmIChlcnIpIHsKIAkJbXJxLT5jbWQtPmVycm9yID0gZXJyOworCQltbWNfY29tcGxldGVfY21kKG1ycSk7CiAJCWNvbXBsZXRlKCZtcnEtPmNvbXBsZXRpb24pOwogCX0KIApAQCAtNDgzLDggKzU0Myw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgbW1jX3dhaXRfZm9yX3JlcV9kb25lKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwKLQkJCQkgIHN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxKQordm9pZCBtbWNfd2FpdF9mb3JfcmVxX2RvbmUoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKIHsKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZDsKIApAQCAtNTI1LDYgKzU4NCwyOCBAQAogCiAJbW1jX3JldHVuZV9yZWxlYXNlKGhvc3QpOwogfQorRVhQT1JUX1NZTUJPTChtbWNfd2FpdF9mb3JfcmVxX2RvbmUpOworCisvKioKKyAqCW1tY19pc19yZXFfZG9uZSAtIERldGVybWluZSBpZiBhICdjYXBfY21kX2R1cmluZ190ZnInIHJlcXVlc3QgaXMgZG9uZQorICoJQGhvc3Q6IE1NQyBob3N0CisgKglAbXJxOiBNTUMgcmVxdWVzdAorICoKKyAqCW1tY19pc19yZXFfZG9uZSgpIGlzIHVzZWQgd2l0aCByZXF1ZXN0cyB0aGF0IGhhdmUKKyAqCW1ycS0+Y2FwX2NtZF9kdXJpbmdfdGZyID0gdHJ1ZS4gbW1jX2lzX3JlcV9kb25lKCkgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKKyAqCXN0YXJ0aW5nIGEgcmVxdWVzdCBhbmQgYmVmb3JlIHdhaXRpbmcgZm9yIGl0IHRvIGNvbXBsZXRlLiBUaGF0IGlzLAorICoJZWl0aGVyIGluIGJldHdlZW4gY2FsbHMgdG8gbW1jX3N0YXJ0X3JlcSgpLCBvciBhZnRlciBtbWNfd2FpdF9mb3JfcmVxKCkKKyAqCWFuZCBiZWZvcmUgbW1jX3dhaXRfZm9yX3JlcV9kb25lKCkuIElmIGl0IGlzIGNhbGxlZCBhdCBvdGhlciB0aW1lcyB0aGUKKyAqCXJlc3VsdCBpcyBub3QgbWVhbmluZ2Z1bC4KKyAqLworYm9vbCBtbWNfaXNfcmVxX2RvbmUoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKK3sKKwlpZiAoaG9zdC0+YXJlcSkKKwkJcmV0dXJuIGhvc3QtPmNvbnRleHRfaW5mby5pc19kb25lX3JjdjsKKwllbHNlCisJCXJldHVybiBjb21wbGV0aW9uX2RvbmUoJm1ycS0+Y29tcGxldGlvbik7Cit9CitFWFBPUlRfU1lNQk9MKG1tY19pc19yZXFfZG9uZSk7CiAKIC8qKgogICoJbW1jX3ByZV9yZXEgLSBQcmVwYXJlIGZvciBhIG5ldyByZXF1ZXN0CkBAIC02NDUsMTMgKzcyNiwxOCBAQAogICoJQG1ycTogTU1DIHJlcXVlc3QgdG8gc3RhcnQKICAqCiAgKglTdGFydCBhIG5ldyBNTUMgY3VzdG9tIGNvbW1hbmQgcmVxdWVzdCBmb3IgYSBob3N0LCBhbmQgd2FpdAotICoJZm9yIHRoZSBjb21tYW5kIHRvIGNvbXBsZXRlLiBEb2VzIG5vdCBhdHRlbXB0IHRvIHBhcnNlIHRoZQotICoJcmVzcG9uc2UuCisgKglmb3IgdGhlIGNvbW1hbmQgdG8gY29tcGxldGUuIEluIHRoZSBjYXNlIG9mICdjYXBfY21kX2R1cmluZ190ZnInCisgKglyZXF1ZXN0cywgdGhlIHRyYW5zZmVyIGlzIG9uZ29pbmcgYW5kIHRoZSBjYWxsZXIgY2FuIGlzc3VlIGZ1cnRoZXIKKyAqCWNvbW1hbmRzIHRoYXQgZG8gbm90IHVzZSB0aGUgZGF0YSBsaW5lcywgYW5kIHRoZW4gd2FpdCBieSBjYWxsaW5nCisgKgltbWNfd2FpdF9mb3JfcmVxX2RvbmUoKS4KKyAqCURvZXMgbm90IGF0dGVtcHQgdG8gcGFyc2UgdGhlIHJlc3BvbnNlLgogICovCiB2b2lkIG1tY193YWl0X2Zvcl9yZXEoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKIHsKIAlfX21tY19zdGFydF9yZXEoaG9zdCwgbXJxKTsKLQltbWNfd2FpdF9mb3JfcmVxX2RvbmUoaG9zdCwgbXJxKTsKKworCWlmICghbXJxLT5jYXBfY21kX2R1cmluZ190ZnIpCisJCW1tY193YWl0X2Zvcl9yZXFfZG9uZShob3N0LCBtcnEpOwogfQogRVhQT1JUX1NZTUJPTChtbWNfd2FpdF9mb3JfcmVxKTsKIApAQCAtMjIwMiw2ICsyMjg4LDU0IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBtbWNfYWxpZ25fZXJhc2Vfc2l6ZShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsCisJCQkJCSB1bnNpZ25lZCBpbnQgKmZyb20sCisJCQkJCSB1bnNpZ25lZCBpbnQgKnRvLAorCQkJCQkgdW5zaWduZWQgaW50IG5yKQoreworCXVuc2lnbmVkIGludCBmcm9tX25ldyA9ICpmcm9tLCBucl9uZXcgPSBuciwgcmVtOworCisJLyoKKwkgKiBXaGVuIHRoZSAnY2FyZC0+ZXJhc2Vfc2l6ZScgaXMgcG93ZXIgb2YgMiwgd2UgY2FuIHVzZSByb3VuZF91cC9kb3duKCkKKwkgKiB0byBhbGlnbiB0aGUgZXJhc2Ugc2l6ZSBlZmZpY2llbnRseS4KKwkgKi8KKwlpZiAoaXNfcG93ZXJfb2ZfMihjYXJkLT5lcmFzZV9zaXplKSkgeworCQl1bnNpZ25lZCBpbnQgdGVtcCA9IGZyb21fbmV3OworCisJCWZyb21fbmV3ID0gcm91bmRfdXAodGVtcCwgY2FyZC0+ZXJhc2Vfc2l6ZSk7CisJCXJlbSA9IGZyb21fbmV3IC0gdGVtcDsKKworCQlpZiAobnJfbmV3ID4gcmVtKQorCQkJbnJfbmV3IC09IHJlbTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisKKwkJbnJfbmV3ID0gcm91bmRfZG93bihucl9uZXcsIGNhcmQtPmVyYXNlX3NpemUpOworCX0gZWxzZSB7CisJCXJlbSA9IGZyb21fbmV3ICUgY2FyZC0+ZXJhc2Vfc2l6ZTsKKwkJaWYgKHJlbSkgeworCQkJcmVtID0gY2FyZC0+ZXJhc2Vfc2l6ZSAtIHJlbTsKKwkJCWZyb21fbmV3ICs9IHJlbTsKKwkJCWlmIChucl9uZXcgPiByZW0pCisJCQkJbnJfbmV3IC09IHJlbTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMDsKKwkJfQorCisJCXJlbSA9IG5yX25ldyAlIGNhcmQtPmVyYXNlX3NpemU7CisJCWlmIChyZW0pCisJCQlucl9uZXcgLT0gcmVtOworCX0KKworCWlmIChucl9uZXcgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkqdG8gPSBmcm9tX25ldyArIG5yX25ldzsKKwkqZnJvbSA9IGZyb21fbmV3OworCisJcmV0dXJuIG5yX25ldzsKK30KKwogLyoqCiAgKiBtbWNfZXJhc2UgLSBlcmFzZSBzZWN0b3JzLgogICogQGNhcmQ6IGNhcmQgdG8gZXJhc2UKQEAgLTIyNDAsMjYgKzIzNzQsMTIgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChhcmcgPT0gTU1DX0VSQVNFX0FSRykgewotCQlyZW0gPSBmcm9tICUgY2FyZC0+ZXJhc2Vfc2l6ZTsKLQkJaWYgKHJlbSkgewotCQkJcmVtID0gY2FyZC0+ZXJhc2Vfc2l6ZSAtIHJlbTsKLQkJCWZyb20gKz0gcmVtOwotCQkJaWYgKG5yID4gcmVtKQotCQkJCW5yIC09IHJlbTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gMDsKLQkJfQotCQlyZW0gPSBuciAlIGNhcmQtPmVyYXNlX3NpemU7Ci0JCWlmIChyZW0pCi0JCQluciAtPSByZW07Ci0JfQorCWlmIChhcmcgPT0gTU1DX0VSQVNFX0FSRykKKwkJbnIgPSBtbWNfYWxpZ25fZXJhc2Vfc2l6ZShjYXJkLCAmZnJvbSwgJnRvLCBucik7CiAKIAlpZiAobnIgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQl0byA9IGZyb20gKyBucjsKLQogCWlmICh0byA8PSBmcm9tKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMjM1Miw2ICsyNDcyLDggQEAKIAlzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QgPSBjYXJkLT5ob3N0OwogCXVuc2lnbmVkIGludCBtYXhfZGlzY2FyZCwgeCwgeSwgcXR5ID0gMCwgbWF4X3F0eSwgbWluX3F0eSwgdGltZW91dDsKIAl1bnNpZ25lZCBpbnQgbGFzdF90aW1lb3V0ID0gMDsKKwl1bnNpZ25lZCBpbnQgbWF4X2J1c3lfdGltZW91dCA9IGhvc3QtPm1heF9idXN5X3RpbWVvdXQgPworCQkJaG9zdC0+bWF4X2J1c3lfdGltZW91dCA6IE1NQ19FUkFTRV9USU1FT1VUX01TOwogCiAJaWYgKGNhcmQtPmVyYXNlX3NoaWZ0KSB7CiAJCW1heF9xdHkgPSBVSU5UX01BWCA+PiBjYXJkLT5lcmFzZV9zaGlmdDsKQEAgLTIzNzQsMTUgKzI0OTYsMTUgQEAKIAkgKiBtYXR0ZXIgd2hhdCBzaXplIG9mICdob3N0LT5tYXhfYnVzeV90aW1lb3V0JywgYnV0IGlmIHRoZQogCSAqICdob3N0LT5tYXhfYnVzeV90aW1lb3V0JyBpcyBsYXJnZSBlbm91Z2ggZm9yIG1vcmUgZGlzY2FyZCBzZWN0b3JzLAogCSAqIHRoZW4gd2UgY2FuIGNvbnRpbnVlIHRvIGluY3JlYXNlIHRoZSBtYXggZGlzY2FyZCBzZWN0b3JzIHVudGlsIHdlCi0JICogZ2V0IGEgYmFsYW5jZSB2YWx1ZS4KKwkgKiBnZXQgYSBiYWxhbmNlIHZhbHVlLiBJbiBjYXNlcyB3aGVuIHRoZSAnaG9zdC0+bWF4X2J1c3lfdGltZW91dCcKKwkgKiBpc24ndCBzcGVjaWZpZWQsIHVzZSB0aGUgZGVmYXVsdCBtYXggZXJhc2UgdGltZW91dC4KIAkgKi8KIAlkbyB7CiAJCXkgPSAwOwogCQlmb3IgKHggPSAxOyB4ICYmIHggPD0gbWF4X3F0eSAmJiBtYXhfcXR5IC0geCA+PSBxdHk7IHggPDw9IDEpIHsKIAkJCXRpbWVvdXQgPSBtbWNfZXJhc2VfdGltZW91dChjYXJkLCBhcmcsIHF0eSArIHgpOwogCi0JCQlpZiAocXR5ICsgeCA+IG1pbl9xdHkgJiYKLQkJCSAgICB0aW1lb3V0ID4gaG9zdC0+bWF4X2J1c3lfdGltZW91dCkKKwkJCWlmIChxdHkgKyB4ID4gbWluX3F0eSAmJiB0aW1lb3V0ID4gbWF4X2J1c3lfdGltZW91dCkKIAkJCQlicmVhazsKIAogCQkJaWYgKHRpbWVvdXQgPCBsYXN0X3RpbWVvdXQpCkBAIC0yNDI3LDkgKzI1NDksNiBAQAogCXN0cnVjdCBtbWNfaG9zdCAqaG9zdCA9IGNhcmQtPmhvc3Q7CiAJdW5zaWduZWQgaW50IG1heF9kaXNjYXJkLCBtYXhfdHJpbTsKIAotCWlmICghaG9zdC0+bWF4X2J1c3lfdGltZW91dCkKLQkJcmV0dXJuIFVJTlRfTUFYOwotCiAJLyoKIAkgKiBXaXRob3V0IGVyYXNlX2dyb3VwX2RlZiBzZXQsIE1NQyBlcmFzZSB0aW1lb3V0IGRlcGVuZHMgb24gY2xvY2sKIAkgKiBmcmVxdWVuY2Ugd2hpY2ggY2FuIGNoYW5nZS4gIEluIHRoYXQgY2FzZSwgdGhlIGJlc3QgY2hvaWNlIGlzCkBAIC0yNDQ3LDcgKzI1NjYsOCBAQAogCQltYXhfZGlzY2FyZCA9IDA7CiAJfQogCXByX2RlYnVnKCIlczogY2FsY3VsYXRlZCBtYXguIGRpc2NhcmQgc2VjdG9ycyAldSBmb3IgdGltZW91dCAldSBtc1xuIiwKLQkJIG1tY19ob3N0bmFtZShob3N0KSwgbWF4X2Rpc2NhcmQsIGhvc3QtPm1heF9idXN5X3RpbWVvdXQpOworCQltbWNfaG9zdG5hbWUoaG9zdCksIG1heF9kaXNjYXJkLCBob3N0LT5tYXhfYnVzeV90aW1lb3V0ID8KKwkJaG9zdC0+bWF4X2J1c3lfdGltZW91dCA6IE1NQ19FUkFTRV9USU1FT1VUX01TKTsKIAlyZXR1cm4gbWF4X2Rpc2NhcmQ7CiB9CiBFWFBPUlRfU1lNQk9MKG1tY19jYWxjX21heF9kaXNjYXJkKTsKQEAgLTI0NTYsNyArMjU3Niw4IEBACiB7CiAJc3RydWN0IG1tY19jb21tYW5kIGNtZCA9IHswfTsKIAotCWlmIChtbWNfY2FyZF9ibG9ja2FkZHIoY2FyZCkgfHwgbW1jX2NhcmRfZGRyNTIoY2FyZCkpCisJaWYgKG1tY19jYXJkX2Jsb2NrYWRkcihjYXJkKSB8fCBtbWNfY2FyZF9kZHI1MihjYXJkKSB8fAorCSAgICBtbWNfY2FyZF9oczQwMChjYXJkKSB8fCBtbWNfY2FyZF9oczQwMGVzKGNhcmQpKQogCQlyZXR1cm4gMDsKIAogCWNtZC5vcGNvZGUgPSBNTUNfU0VUX0JMT0NLTEVOOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKaW5kZXggZjJkMTg1Yy4uMzQ4NmJjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL21tYy5jCkBAIC0xMDI5LDYgKzEwMjksMTAgQEAKIAkJZXJyID0gbW1jX3N3aXRjaF9zdGF0dXMoY2FyZCk7CiAJfQogCisJaWYgKGVycikKKwkJcHJfd2FybigiJXM6IHN3aXRjaCB0byBoaWdoLXNwZWVkIGZhaWxlZCwgZXJyOiVkXG4iLAorCQkJbW1jX2hvc3RuYW1lKGNhcmQtPmhvc3QpLCBlcnIpOworCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTI2NSwxMSArMTI2OSw4IEBACiAKIAkvKiBTd2l0Y2ggY2FyZCB0byBIUyBtb2RlICovCiAJZXJyID0gbW1jX3NlbGVjdF9ocyhjYXJkKTsKLQlpZiAoZXJyKSB7Ci0JCXByX2VycigiJXM6IHN3aXRjaCB0byBoaWdoLXNwZWVkIGZhaWxlZCwgZXJyOiVkXG4iLAotCQkJbW1jX2hvc3RuYW1lKGhvc3QpLCBlcnIpOworCWlmIChlcnIpCiAJCWdvdG8gb3V0X2VycjsKLQl9CiAKIAllcnIgPSBtbWNfc3dpdGNoX3N0YXR1cyhjYXJkKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9wd3JzZXFfc2ltcGxlLmMgYi9kcml2ZXJzL21tYy9jb3JlL3B3cnNlcV9zaW1wbGUuYwppbmRleCA0NTBkOTA3Li4xMzA0MTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3B3cnNlcV9zaW1wbGUuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL3B3cnNlcV9zaW1wbGUuYwpAQCAtMTYsNiArMTYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb3BlcnR5Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogCkBAIC0yNCw2ICsyNiw3IEBACiBzdHJ1Y3QgbW1jX3B3cnNlcV9zaW1wbGUgewogCXN0cnVjdCBtbWNfcHdyc2VxIHB3cnNlcTsKIAlib29sIGNsa19lbmFibGVkOworCXUzMiBwb3N0X3Bvd2VyX29uX2RlbGF5X21zOwogCXN0cnVjdCBjbGsgKmV4dF9jbGs7CiAJc3RydWN0IGdwaW9fZGVzY3MgKnJlc2V0X2dwaW9zOwogfTsKQEAgLTY0LDYgKzY3LDkgQEAKIAlzdHJ1Y3QgbW1jX3B3cnNlcV9zaW1wbGUgKnB3cnNlcSA9IHRvX3B3cnNlcV9zaW1wbGUoaG9zdC0+cHdyc2VxKTsKIAogCW1tY19wd3JzZXFfc2ltcGxlX3NldF9ncGlvc192YWx1ZShwd3JzZXEsIDApOworCisJaWYgKHB3cnNlcS0+cG9zdF9wb3dlcl9vbl9kZWxheV9tcykKKwkJbXNsZWVwKHB3cnNlcS0+cG9zdF9wb3dlcl9vbl9kZWxheV9tcyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1tY19wd3JzZXFfc2ltcGxlX3Bvd2VyX29mZihzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCkBAIC0xMTEsNiArMTE3LDkgQEAKIAkJcmV0dXJuIFBUUl9FUlIocHdyc2VxLT5yZXNldF9ncGlvcyk7CiAJfQogCisJZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgInBvc3QtcG93ZXItb24tZGVsYXktbXMiLAorCQkJCSAmcHdyc2VxLT5wb3N0X3Bvd2VyX29uX2RlbGF5X21zKTsKKwogCXB3cnNlcS0+cHdyc2VxLmRldiA9IGRldjsKIAlwd3JzZXEtPnB3cnNlcS5vcHMgPSAmbW1jX3B3cnNlcV9zaW1wbGVfb3BzOwogCXB3cnNlcS0+cHdyc2VxLm93bmVyID0gVEhJU19NT0RVTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkLmMgYi9kcml2ZXJzL21tYy9jb3JlL3NkLmMKaW5kZXggMDEyMzkzNi4uNzNjNzYyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9zZC5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2QuYwpAQCAtMjIzLDggKzIyMyw3IEBACiBzdGF0aWMgaW50IG1tY19yZWFkX3NzcihzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQpCiB7CiAJdW5zaWduZWQgaW50IGF1LCBlcywgZXQsIGVvOwotCWludCBlcnIsIGk7Ci0JdTMyICpzc3I7CisJaW50IGk7CiAKIAlpZiAoIShjYXJkLT5jc2QuY21kY2xhc3MgJiBDQ0NfQVBQX1NQRUMpKSB7CiAJCXByX3dhcm4oIiVzOiBjYXJkIGxhY2tzIG1hbmRhdG9yeSBTRCBTdGF0dXMgZnVuY3Rpb25cbiIsCkBAIC0yMzIsMzMgKzIzMSwyNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlzc3IgPSBrbWFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNzcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnIgPSBtbWNfYXBwX3NkX3N0YXR1cyhjYXJkLCBzc3IpOwotCWlmIChlcnIpIHsKKwlpZiAobW1jX2FwcF9zZF9zdGF0dXMoY2FyZCwgY2FyZC0+cmF3X3NzcikpIHsKIAkJcHJfd2FybigiJXM6IHByb2JsZW0gcmVhZGluZyBTRCBTdGF0dXMgcmVnaXN0ZXJcbiIsCiAJCQltbWNfaG9zdG5hbWUoY2FyZC0+aG9zdCkpOwotCQllcnIgPSAwOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIDA7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCXNzcltpXSA9IGJlMzJfdG9fY3B1KHNzcltpXSk7CisJCWNhcmQtPnJhd19zc3JbaV0gPSBiZTMyX3RvX2NwdShjYXJkLT5yYXdfc3NyW2ldKTsKIAogCS8qCiAJICogVU5TVFVGRl9CSVRTIG9ubHkgd29ya3Mgd2l0aCBmb3VyIHUzMnMgc28gd2UgaGF2ZSB0byBvZmZzZXQgdGhlCiAJICogYml0ZmllbGQgcG9zaXRpb25zIGFjY29yZGluZ2x5LgogCSAqLwotCWF1ID0gVU5TVFVGRl9CSVRTKHNzciwgNDI4IC0gMzg0LCA0KTsKKwlhdSA9IFVOU1RVRkZfQklUUyhjYXJkLT5yYXdfc3NyLCA0MjggLSAzODQsIDQpOwogCWlmIChhdSkgewogCQlpZiAoYXUgPD0gOSB8fCBjYXJkLT5zY3Iuc2RhX3NwZWMzKSB7CiAJCQljYXJkLT5zc3IuYXUgPSBzZF9hdV9zaXplW2F1XTsKLQkJCWVzID0gVU5TVFVGRl9CSVRTKHNzciwgNDA4IC0gMzg0LCAxNik7Ci0JCQlldCA9IFVOU1RVRkZfQklUUyhzc3IsIDQwMiAtIDM4NCwgNik7CisJCQllcyA9IFVOU1RVRkZfQklUUyhjYXJkLT5yYXdfc3NyLCA0MDggLSAzODQsIDE2KTsKKwkJCWV0ID0gVU5TVFVGRl9CSVRTKGNhcmQtPnJhd19zc3IsIDQwMiAtIDM4NCwgNik7CiAJCQlpZiAoZXMgJiYgZXQpIHsKLQkJCQllbyA9IFVOU1RVRkZfQklUUyhzc3IsIDQwMCAtIDM4NCwgMik7CisJCQkJZW8gPSBVTlNUVUZGX0JJVFMoY2FyZC0+cmF3X3NzciwgNDAwIC0gMzg0LCAyKTsKIAkJCQljYXJkLT5zc3IuZXJhc2VfdGltZW91dCA9IChldCAqIDEwMDApIC8gZXM7CiAJCQkJY2FyZC0+c3NyLmVyYXNlX29mZnNldCA9IGVvICogMTAwMDsKIAkJCX0KQEAgLTI2Nyw5ICsyNjAsOCBAQAogCQkJCW1tY19ob3N0bmFtZShjYXJkLT5ob3N0KSk7CiAJCX0KIAl9Ci1vdXQ6Ci0Ja2ZyZWUoc3NyKTsKLQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC02NjYsNiArNjU4LDE0IEBACiBNTUNfREVWX0FUVFIoY3NkLCAiJTA4eCUwOHglMDh4JTA4eFxuIiwgY2FyZC0+cmF3X2NzZFswXSwgY2FyZC0+cmF3X2NzZFsxXSwKIAljYXJkLT5yYXdfY3NkWzJdLCBjYXJkLT5yYXdfY3NkWzNdKTsKIE1NQ19ERVZfQVRUUihzY3IsICIlMDh4JTA4eFxuIiwgY2FyZC0+cmF3X3NjclswXSwgY2FyZC0+cmF3X3NjclsxXSk7CitNTUNfREVWX0FUVFIoc3NyLAorCSIlMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4JTA4eCUwOHglMDh4XG4iLAorCQljYXJkLT5yYXdfc3NyWzBdLCBjYXJkLT5yYXdfc3NyWzFdLCBjYXJkLT5yYXdfc3NyWzJdLAorCQljYXJkLT5yYXdfc3NyWzNdLCBjYXJkLT5yYXdfc3NyWzRdLCBjYXJkLT5yYXdfc3NyWzVdLAorCQljYXJkLT5yYXdfc3NyWzZdLCBjYXJkLT5yYXdfc3NyWzddLCBjYXJkLT5yYXdfc3NyWzhdLAorCQljYXJkLT5yYXdfc3NyWzldLCBjYXJkLT5yYXdfc3NyWzEwXSwgY2FyZC0+cmF3X3NzclsxMV0sCisJCWNhcmQtPnJhd19zc3JbMTJdLCBjYXJkLT5yYXdfc3NyWzEzXSwgY2FyZC0+cmF3X3NzclsxNF0sCisJCWNhcmQtPnJhd19zc3JbMTVdKTsKIE1NQ19ERVZfQVRUUihkYXRlLCAiJTAyZC8lMDRkXG4iLCBjYXJkLT5jaWQubW9udGgsIGNhcmQtPmNpZC55ZWFyKTsKIE1NQ19ERVZfQVRUUihlcmFzZV9zaXplLCAiJXVcbiIsIGNhcmQtPmVyYXNlX3NpemUgPDwgOSk7CiBNTUNfREVWX0FUVFIocHJlZmVycmVkX2VyYXNlX3NpemUsICIldVxuIiwgY2FyZC0+cHJlZl9lcmFzZSA8PCA5KTsKQEAgLTY5OCw2ICs2OTgsNyBAQAogCSZkZXZfYXR0cl9jaWQuYXR0ciwKIAkmZGV2X2F0dHJfY3NkLmF0dHIsCiAJJmRldl9hdHRyX3Njci5hdHRyLAorCSZkZXZfYXR0cl9zc3IuYXR0ciwKIAkmZGV2X2F0dHJfZGF0ZS5hdHRyLAogCSZkZXZfYXR0cl9lcmFzZV9zaXplLmF0dHIsCiAJJmRldl9hdHRyX3ByZWZlcnJlZF9lcmFzZV9zaXplLmF0dHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9faW8uYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pby5jCmluZGV4IDc4Y2I0ZDUuLjQwNmU1ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pby5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19pby5jCkBAIC0yNiw4ICsyNiw4IEBACiAgKi8KIHZvaWQgc2Rpb19jbGFpbV9ob3N0KHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCiB7Ci0JQlVHX09OKCFmdW5jKTsKLQlCVUdfT04oIWZ1bmMtPmNhcmQpOworCWlmIChXQVJOX09OKCFmdW5jKSkKKwkJcmV0dXJuOwogCiAJbW1jX2NsYWltX2hvc3QoZnVuYy0+Y2FyZC0+aG9zdCk7CiB9CkBAIC00Miw4ICs0Miw4IEBACiAgKi8KIHZvaWQgc2Rpb19yZWxlYXNlX2hvc3Qoc3RydWN0IHNkaW9fZnVuYyAqZnVuYykKIHsKLQlCVUdfT04oIWZ1bmMpOwotCUJVR19PTighZnVuYy0+Y2FyZCk7CisJaWYgKFdBUk5fT04oIWZ1bmMpKQorCQlyZXR1cm47CiAKIAltbWNfcmVsZWFzZV9ob3N0KGZ1bmMtPmNhcmQtPmhvc3QpOwogfQpAQCAtNjIsOCArNjIsOCBAQAogCXVuc2lnbmVkIGNoYXIgcmVnOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAotCUJVR19PTighZnVuYyk7Ci0JQlVHX09OKCFmdW5jLT5jYXJkKTsKKwlpZiAoIWZ1bmMpCisJCXJldHVybiAtRUlOVkFMOwogCiAJcHJfZGVidWcoIlNESU86IEVuYWJsaW5nIGRldmljZSAlcy4uLlxuIiwgc2Rpb19mdW5jX2lkKGZ1bmMpKTsKIApAQCAtMTEyLDggKzExMiw4IEBACiAJaW50IHJldDsKIAl1bnNpZ25lZCBjaGFyIHJlZzsKIAotCUJVR19PTighZnVuYyk7Ci0JQlVHX09OKCFmdW5jLT5jYXJkKTsKKwlpZiAoIWZ1bmMpCisJCXJldHVybiAtRUlOVkFMOwogCiAJcHJfZGVidWcoIlNESU86IERpc2FibGluZyBkZXZpY2UgJXMuLi5cbiIsIHNkaW9fZnVuY19pZChmdW5jKSk7CiAKQEAgLTMwNyw2ICszMDcsOSBAQAogCXVuc2lnbmVkIG1heF9ibG9ja3M7CiAJaW50IHJldDsKIAorCWlmICghZnVuYyB8fCAoZnVuYy0+bnVtID4gNykpCisJCXJldHVybiAtRUlOVkFMOworCiAJLyogRG8gdGhlIGJ1bGsgb2YgdGhlIHRyYW5zZmVyIHVzaW5nIGJsb2NrIG1vZGUgKGlmIHN1cHBvcnRlZCkuICovCiAJaWYgKGZ1bmMtPmNhcmQtPmNjY3IubXVsdGlfYmxvY2sgJiYgKHNpemUgPiBzZGlvX21heF9ieXRlX3NpemUoZnVuYykpKSB7CiAJCS8qIEJsb2NrcyBwZXIgY29tbWFuZCBpcyBsaW1pdGVkIGJ5IGhvc3QgY291bnQsIGhvc3QgdHJhbnNmZXIKQEAgLTM2Nyw3ICszNzAsMTAgQEAKIAlpbnQgcmV0OwogCXU4IHZhbDsKIAotCUJVR19PTighZnVuYyk7CisJaWYgKCFmdW5jKSB7CisJCSplcnJfcmV0ID0gLUVJTlZBTDsKKwkJcmV0dXJuIDB4RkY7CisJfQogCiAJaWYgKGVycl9yZXQpCiAJCSplcnJfcmV0ID0gMDsKQEAgLTM5OCw3ICs0MDQsMTAgQEAKIHsKIAlpbnQgcmV0OwogCi0JQlVHX09OKCFmdW5jKTsKKwlpZiAoIWZ1bmMpIHsKKwkJKmVycl9yZXQgPSAtRUlOVkFMOworCQlyZXR1cm47CisJfQogCiAJcmV0ID0gbW1jX2lvX3J3X2RpcmVjdChmdW5jLT5jYXJkLCAxLCBmdW5jLT5udW0sIGFkZHIsIGIsIE5VTEwpOwogCWlmIChlcnJfcmV0KQpAQCAtNjIzLDcgKzYzMiwxMCBAQAogCWludCByZXQ7CiAJdW5zaWduZWQgY2hhciB2YWw7CiAKLQlCVUdfT04oIWZ1bmMpOworCWlmICghZnVuYykgeworCQkqZXJyX3JldCA9IC1FSU5WQUw7CisJCXJldHVybiAweEZGOworCX0KIAogCWlmIChlcnJfcmV0KQogCQkqZXJyX3JldCA9IDA7CkBAIC02NTgsNyArNjcwLDEwIEBACiB7CiAJaW50IHJldDsKIAotCUJVR19PTighZnVuYyk7CisJaWYgKCFmdW5jKSB7CisJCSplcnJfcmV0ID0gLUVJTlZBTDsKKwkJcmV0dXJuOworCX0KIAogCWlmICgoYWRkciA8IDB4RjAgfHwgYWRkciA+IDB4RkYpICYmICghbW1jX2NhcmRfbGVuaWVudF9mbjAoZnVuYy0+Y2FyZCkpKSB7CiAJCWlmIChlcnJfcmV0KQpAQCAtNjg0LDggKzY5OSw4IEBACiAgKi8KIG1tY19wbV9mbGFnX3Qgc2Rpb19nZXRfaG9zdF9wbV9jYXBzKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCiB7Ci0JQlVHX09OKCFmdW5jKTsKLQlCVUdfT04oIWZ1bmMtPmNhcmQpOworCWlmICghZnVuYykKKwkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gZnVuYy0+Y2FyZC0+aG9zdC0+cG1fY2FwczsKIH0KQEAgLTcwNyw4ICs3MjIsOCBAQAogewogCXN0cnVjdCBtbWNfaG9zdCAqaG9zdDsKIAotCUJVR19PTighZnVuYyk7Ci0JQlVHX09OKCFmdW5jLT5jYXJkKTsKKwlpZiAoIWZ1bmMpCisJCXJldHVybiAtRUlOVkFMOwogCiAJaG9zdCA9IGZ1bmMtPmNhcmQtPmhvc3Q7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19vcHMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpb19vcHMuYwppbmRleCAzNGY2ZTgwLi45MGZlNTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkaW9fb3BzLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZGlvX29wcy5jCkBAIC0yNCw4ICsyNCw2IEBACiAJc3RydWN0IG1tY19jb21tYW5kIGNtZCA9IHswfTsKIAlpbnQgaSwgZXJyID0gMDsKIAotCUJVR19PTighaG9zdCk7Ci0KIAljbWQub3Bjb2RlID0gU0RfSU9fU0VORF9PUF9DT05EOwogCWNtZC5hcmcgPSBvY3I7CiAJY21kLmZsYWdzID0gTU1DX1JTUF9TUElfUjQgfCBNTUNfUlNQX1I0IHwgTU1DX0NNRF9CQ1I7CkBAIC03MSw4ICs2OSw4IEBACiAJc3RydWN0IG1tY19jb21tYW5kIGNtZCA9IHswfTsKIAlpbnQgZXJyOwogCi0JQlVHX09OKCFob3N0KTsKLQlCVUdfT04oZm4gPiA3KTsKKwlpZiAoZm4gPiA3KQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmIChhZGRyICYgfjB4MUZGRkYpCkBAIC0xMTQsNyArMTEyLDYgQEAKIGludCBtbWNfaW9fcndfZGlyZWN0KHN0cnVjdCBtbWNfY2FyZCAqY2FyZCwgaW50IHdyaXRlLCB1bnNpZ25lZCBmbiwKIAl1bnNpZ25lZCBhZGRyLCB1OCBpbiwgdTggKm91dCkKIHsKLQlCVUdfT04oIWNhcmQpOwogCXJldHVybiBtbWNfaW9fcndfZGlyZWN0X2hvc3QoY2FyZC0+aG9zdCwgd3JpdGUsIGZuLCBhZGRyLCBpbiwgb3V0KTsKIH0KIApAQCAtMTI5LDggKzEyNiw2IEBACiAJdW5zaWduZWQgaW50IG5lbnRzLCBsZWZ0X3NpemUsIGk7CiAJdW5zaWduZWQgaW50IHNlZ19zaXplID0gY2FyZC0+aG9zdC0+bWF4X3NlZ19zaXplOwogCi0JQlVHX09OKCFjYXJkKTsKLQlCVUdfT04oZm4gPiA3KTsKIAlXQVJOX09OKGJsa3N6ID09IDApOwogCiAJLyogc2FuaXR5IGNoZWNrICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2RhdmluY2lfbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L2RhdmluY2lfbW1jLmMKaW5kZXggYTU2MzczYy4uOGZhNDc4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kYXZpbmNpX21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZGF2aW5jaV9tbWMuYwpAQCAtMTIxNiw5ICsxMjE2LDExIEBACiAJfQogCiAJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAoIXIgfHwgaXJxID09IE5PX0lSUSkKKwlpZiAoIXIpCiAJCXJldHVybiAtRU5PREVWOworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApCisJCXJldHVybiBpcnE7CiAKIAltZW1fc2l6ZSA9IHJlc291cmNlX3NpemUocik7CiAJbWVtID0gZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oJnBkZXYtPmRldiwgci0+c3RhcnQsIG1lbV9zaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtZXh5bm9zLmMgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy1leHlub3MuYwppbmRleCBkYTBlZjE3Li43YWIzZDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy1leHlub3MuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy1leHlub3MuYwpAQCAtMjI1LDggKzIyNSwxMiBAQAogCSAqIE5vdCBzdXBwb3J0ZWQgdG8gY29uZmlndXJlIHJlZ2lzdGVyCiAJICogcmVsYXRlZCB0byBIUzQwMAogCSAqLwotCWlmIChwcml2LT5jdHJsX3R5cGUgPCBEV19NQ0lfVFlQRV9FWFlOT1M1NDIwKQorCWlmIChwcml2LT5jdHJsX3R5cGUgPCBEV19NQ0lfVFlQRV9FWFlOT1M1NDIwKSB7CisJCWlmICh0aW1pbmcgPT0gTU1DX1RJTUlOR19NTUNfSFM0MDApCisJCQlkZXZfd2Fybihob3N0LT5kZXYsCisJCQkJICJjYW5ub3QgY29uZmlndXJlIEhTNDAwLCB1bnN1cHBvcnRlZCBjaGlwc2V0XG4iKTsKIAkJcmV0dXJuOworCX0KIAogCWRxcyA9IHByaXYtPnNhdmVkX2Rxc19lbjsKIAlzdHJvYmUgPSBwcml2LT5zYXZlZF9zdHJvYmVfY3RybDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWszLmMgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy1rMy5jCmluZGV4IDhlOWQ4ODYuLjYyNDc4OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWszLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtazMuYwpAQCAtMTMxLDExICsxMzEsMTcgQEAKIAlob3N0LT5idXNfaHogPSBjbGtfZ2V0X3JhdGUoaG9zdC0+Yml1X2Nsayk7CiB9CiAKK3N0YXRpYyBpbnQgZHdfbWNpX2hpNjIyMF9leGVjdXRlX3R1bmluZyhzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QsIHUzMiBvcGNvZGUpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHdfbWNpX2Rydl9kYXRhIGhpNjIyMF9kYXRhID0gewogCS5jYXBzCQkJPSBkd19tY2lfaGk2MjIwX2NhcHMsCiAJLnN3aXRjaF92b2x0YWdlCQk9IGR3X21jaV9oaTYyMjBfc3dpdGNoX3ZvbHRhZ2UsCiAJLnNldF9pb3MJCT0gZHdfbWNpX2hpNjIyMF9zZXRfaW9zLAogCS5wYXJzZV9kdAkJPSBkd19tY2lfaGk2MjIwX3BhcnNlX2R0LAorCS5leGVjdXRlX3R1bmluZwkJPSBkd19tY2lfaGk2MjIwX2V4ZWN1dGVfdHVuaW5nLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZHdfbWNpX2szX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYwppbmRleCAzMjM4MGQ1Li40ZmNiYzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMKQEAgLTYxLDYgKzYxLDggQEAKIAkJCQkgU0RNTUNfSURNQUNfSU5UX0ZCRSB8IFNETU1DX0lETUFDX0lOVF9SSSB8IFwKIAkJCQkgU0RNTUNfSURNQUNfSU5UX1RJKQogCisjZGVmaW5lIERFU0NfUklOR19CVUZfU1oJUEFHRV9TSVpFCisKIHN0cnVjdCBpZG1hY19kZXNjXzY0YWRkciB7CiAJdTMyCQlkZXMwOwkvKiBDb250cm9sIERlc2NyaXB0b3IgKi8KIApAQCAtNDY3LDEzNiArNDY5LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGR3X21jaV90cmFuc2xhdGVfc2dsaXN0KHN0cnVjdCBkd19tY2kgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSwKLQkJCQkgICAgdW5zaWduZWQgaW50IHNnX2xlbikKLXsKLQl1bnNpZ25lZCBpbnQgZGVzY19sZW47Ci0JaW50IGk7Ci0KLQlpZiAoaG9zdC0+ZG1hXzY0Yml0X2FkZHJlc3MgPT0gMSkgewotCQlzdHJ1Y3QgaWRtYWNfZGVzY182NGFkZHIgKmRlc2NfZmlyc3QsICpkZXNjX2xhc3QsICpkZXNjOwotCi0JCWRlc2NfZmlyc3QgPSBkZXNjX2xhc3QgPSBkZXNjID0gaG9zdC0+c2dfY3B1OwotCi0JCWZvciAoaSA9IDA7IGkgPCBzZ19sZW47IGkrKykgewotCQkJdW5zaWduZWQgaW50IGxlbmd0aCA9IHNnX2RtYV9sZW4oJmRhdGEtPnNnW2ldKTsKLQotCQkJdTY0IG1lbV9hZGRyID0gc2dfZG1hX2FkZHJlc3MoJmRhdGEtPnNnW2ldKTsKLQotCQkJZm9yICggOyBsZW5ndGggOyBkZXNjKyspIHsKLQkJCQlkZXNjX2xlbiA9IChsZW5ndGggPD0gRFdfTUNJX0RFU0NfREFUQV9MRU5HVEgpID8KLQkJCQkJICAgbGVuZ3RoIDogRFdfTUNJX0RFU0NfREFUQV9MRU5HVEg7Ci0KLQkJCQlsZW5ndGggLT0gZGVzY19sZW47Ci0KLQkJCQkvKgotCQkJCSAqIFNldCB0aGUgT1dOIGJpdCBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzCi0JCQkJICogZm9yIHRoaXMgZGVzY3JpcHRvcgotCQkJCSAqLwotCQkJCWRlc2MtPmRlczAgPSBJRE1BQ19ERVMwX09XTiB8IElETUFDX0RFUzBfRElDIHwKLQkJCQkJCQlJRE1BQ19ERVMwX0NIOwotCi0JCQkJLyogQnVmZmVyIGxlbmd0aCAqLwotCQkJCUlETUFDXzY0QUREUl9TRVRfQlVGRkVSMV9TSVpFKGRlc2MsIGRlc2NfbGVuKTsKLQotCQkJCS8qIFBoeXNpY2FsIGFkZHJlc3MgdG8gRE1BIHRvL2Zyb20gKi8KLQkJCQlkZXNjLT5kZXM0ID0gbWVtX2FkZHIgJiAweGZmZmZmZmZmOwotCQkJCWRlc2MtPmRlczUgPSBtZW1fYWRkciA+PiAzMjsKLQotCQkJCS8qIFVwZGF0ZSBwaHlzaWNhbCBhZGRyZXNzIGZvciB0aGUgbmV4dCBkZXNjICovCi0JCQkJbWVtX2FkZHIgKz0gZGVzY19sZW47Ci0KLQkJCQkvKiBTYXZlIHBvaW50ZXIgdG8gdGhlIGxhc3QgZGVzY3JpcHRvciAqLwotCQkJCWRlc2NfbGFzdCA9IGRlc2M7Ci0JCQl9Ci0JCX0KLQotCQkvKiBTZXQgZmlyc3QgZGVzY3JpcHRvciAqLwotCQlkZXNjX2ZpcnN0LT5kZXMwIHw9IElETUFDX0RFUzBfRkQ7Ci0KLQkJLyogU2V0IGxhc3QgZGVzY3JpcHRvciAqLwotCQlkZXNjX2xhc3QtPmRlczAgJj0gfihJRE1BQ19ERVMwX0NIIHwgSURNQUNfREVTMF9ESUMpOwotCQlkZXNjX2xhc3QtPmRlczAgfD0gSURNQUNfREVTMF9MRDsKLQotCX0gZWxzZSB7Ci0JCXN0cnVjdCBpZG1hY19kZXNjICpkZXNjX2ZpcnN0LCAqZGVzY19sYXN0LCAqZGVzYzsKLQotCQlkZXNjX2ZpcnN0ID0gZGVzY19sYXN0ID0gZGVzYyA9IGhvc3QtPnNnX2NwdTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgc2dfbGVuOyBpKyspIHsKLQkJCXVuc2lnbmVkIGludCBsZW5ndGggPSBzZ19kbWFfbGVuKCZkYXRhLT5zZ1tpXSk7Ci0KLQkJCXUzMiBtZW1fYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZkYXRhLT5zZ1tpXSk7Ci0KLQkJCWZvciAoIDsgbGVuZ3RoIDsgZGVzYysrKSB7Ci0JCQkJZGVzY19sZW4gPSAobGVuZ3RoIDw9IERXX01DSV9ERVNDX0RBVEFfTEVOR1RIKSA/Ci0JCQkJCSAgIGxlbmd0aCA6IERXX01DSV9ERVNDX0RBVEFfTEVOR1RIOwotCi0JCQkJbGVuZ3RoIC09IGRlc2NfbGVuOwotCi0JCQkJLyoKLQkJCQkgKiBTZXQgdGhlIE9XTiBiaXQgYW5kIGRpc2FibGUgaW50ZXJydXB0cwotCQkJCSAqIGZvciB0aGlzIGRlc2NyaXB0b3IKLQkJCQkgKi8KLQkJCQlkZXNjLT5kZXMwID0gY3B1X3RvX2xlMzIoSURNQUNfREVTMF9PV04gfAotCQkJCQkJCSBJRE1BQ19ERVMwX0RJQyB8Ci0JCQkJCQkJIElETUFDX0RFUzBfQ0gpOwotCi0JCQkJLyogQnVmZmVyIGxlbmd0aCAqLwotCQkJCUlETUFDX1NFVF9CVUZGRVIxX1NJWkUoZGVzYywgZGVzY19sZW4pOwotCi0JCQkJLyogUGh5c2ljYWwgYWRkcmVzcyB0byBETUEgdG8vZnJvbSAqLwotCQkJCWRlc2MtPmRlczIgPSBjcHVfdG9fbGUzMihtZW1fYWRkcik7Ci0KLQkJCQkvKiBVcGRhdGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIG5leHQgZGVzYyAqLwotCQkJCW1lbV9hZGRyICs9IGRlc2NfbGVuOwotCi0JCQkJLyogU2F2ZSBwb2ludGVyIHRvIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KLQkJCQlkZXNjX2xhc3QgPSBkZXNjOwotCQkJfQotCQl9Ci0KLQkJLyogU2V0IGZpcnN0IGRlc2NyaXB0b3IgKi8KLQkJZGVzY19maXJzdC0+ZGVzMCB8PSBjcHVfdG9fbGUzMihJRE1BQ19ERVMwX0ZEKTsKLQotCQkvKiBTZXQgbGFzdCBkZXNjcmlwdG9yICovCi0JCWRlc2NfbGFzdC0+ZGVzMCAmPSBjcHVfdG9fbGUzMih+KElETUFDX0RFUzBfQ0ggfAotCQkJCQkgICAgICAgSURNQUNfREVTMF9ESUMpKTsKLQkJZGVzY19sYXN0LT5kZXMwIHw9IGNwdV90b19sZTMyKElETUFDX0RFUzBfTEQpOwotCX0KLQotCXdtYigpOyAvKiBkcmFpbiB3cml0ZWJ1ZmZlciAqLwotfQotCi1zdGF0aWMgaW50IGR3X21jaV9pZG1hY19zdGFydF9kbWEoc3RydWN0IGR3X21jaSAqaG9zdCwgdW5zaWduZWQgaW50IHNnX2xlbikKLXsKLQl1MzIgdGVtcDsKLQotCWR3X21jaV90cmFuc2xhdGVfc2dsaXN0KGhvc3QsIGhvc3QtPmRhdGEsIHNnX2xlbik7Ci0KLQkvKiBNYWtlIHN1cmUgdG8gcmVzZXQgRE1BIGluIGNhc2Ugd2UgZGlkIFBJTyBiZWZvcmUgdGhpcyAqLwotCWR3X21jaV9jdHJsX3Jlc2V0KGhvc3QsIFNETU1DX0NUUkxfRE1BX1JFU0VUKTsKLQlkd19tY2lfaWRtYWNfcmVzZXQoaG9zdCk7Ci0KLQkvKiBTZWxlY3QgSURNQUMgaW50ZXJmYWNlICovCi0JdGVtcCA9IG1jaV9yZWFkbChob3N0LCBDVFJMKTsKLQl0ZW1wIHw9IFNETU1DX0NUUkxfVVNFX0lETUFDOwotCW1jaV93cml0ZWwoaG9zdCwgQ1RSTCwgdGVtcCk7Ci0KLQkvKiBkcmFpbiB3cml0ZWJ1ZmZlciAqLwotCXdtYigpOwotCi0JLyogRW5hYmxlIHRoZSBJRE1BQyAqLwotCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQk1PRCk7Ci0JdGVtcCB8PSBTRE1NQ19JRE1BQ19FTkFCTEUgfCBTRE1NQ19JRE1BQ19GQjsKLQltY2lfd3JpdGVsKGhvc3QsIEJNT0QsIHRlbXApOwotCi0JLyogU3RhcnQgaXQgcnVubmluZyAqLwotCW1jaV93cml0ZWwoaG9zdCwgUExETU5ELCAxKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGR3X21jaV9pZG1hY19pbml0KHN0cnVjdCBkd19tY2kgKmhvc3QpCiB7CiAJaW50IGk7CkBAIC02MDQsNyArNDc2LDggQEAKIAlpZiAoaG9zdC0+ZG1hXzY0Yml0X2FkZHJlc3MgPT0gMSkgewogCQlzdHJ1Y3QgaWRtYWNfZGVzY182NGFkZHIgKnA7CiAJCS8qIE51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiB0aGUgcmluZyBidWZmZXIgKi8KLQkJaG9zdC0+cmluZ19zaXplID0gUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBpZG1hY19kZXNjXzY0YWRkcik7CisJCWhvc3QtPnJpbmdfc2l6ZSA9CisJCQlERVNDX1JJTkdfQlVGX1NaIC8gc2l6ZW9mKHN0cnVjdCBpZG1hY19kZXNjXzY0YWRkcik7CiAKIAkJLyogRm9yd2FyZCBsaW5rIHRoZSBkZXNjcmlwdG9yIGxpc3QgKi8KIAkJZm9yIChpID0gMCwgcCA9IGhvc3QtPnNnX2NwdTsgaSA8IGhvc3QtPnJpbmdfc2l6ZSAtIDE7CkBAIC02MzAsNyArNTAzLDggQEAKIAl9IGVsc2UgewogCQlzdHJ1Y3QgaWRtYWNfZGVzYyAqcDsKIAkJLyogTnVtYmVyIG9mIGRlc2NyaXB0b3JzIGluIHRoZSByaW5nIGJ1ZmZlciAqLwotCQlob3N0LT5yaW5nX3NpemUgPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGlkbWFjX2Rlc2MpOworCQlob3N0LT5yaW5nX3NpemUgPQorCQkJREVTQ19SSU5HX0JVRl9TWiAvIHNpemVvZihzdHJ1Y3QgaWRtYWNfZGVzYyk7CiAKIAkJLyogRm9yd2FyZCBsaW5rIHRoZSBkZXNjcmlwdG9yIGxpc3QgKi8KIAkJZm9yIChpID0gMCwgcCA9IGhvc3QtPnNnX2NwdTsKQEAgLTY3MSw2ICs1NDUsMTk1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGR3X21jaV9wcmVwYXJlX2Rlc2M2NChzdHJ1Y3QgZHdfbWNpICpob3N0LAorCQkJCQkgc3RydWN0IG1tY19kYXRhICpkYXRhLAorCQkJCQkgdW5zaWduZWQgaW50IHNnX2xlbikKK3sKKwl1bnNpZ25lZCBpbnQgZGVzY19sZW47CisJc3RydWN0IGlkbWFjX2Rlc2NfNjRhZGRyICpkZXNjX2ZpcnN0LCAqZGVzY19sYXN0LCAqZGVzYzsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJaW50IGk7CisKKwlkZXNjX2ZpcnN0ID0gZGVzY19sYXN0ID0gZGVzYyA9IGhvc3QtPnNnX2NwdTsKKworCWZvciAoaSA9IDA7IGkgPCBzZ19sZW47IGkrKykgeworCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gc2dfZG1hX2xlbigmZGF0YS0+c2dbaV0pOworCisJCXU2NCBtZW1fYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZkYXRhLT5zZ1tpXSk7CisKKwkJZm9yICggOyBsZW5ndGggOyBkZXNjKyspIHsKKwkJCWRlc2NfbGVuID0gKGxlbmd0aCA8PSBEV19NQ0lfREVTQ19EQVRBX0xFTkdUSCkgPworCQkJCSAgIGxlbmd0aCA6IERXX01DSV9ERVNDX0RBVEFfTEVOR1RIOworCisJCQlsZW5ndGggLT0gZGVzY19sZW47CisKKwkJCS8qCisJCQkgKiBXYWl0IGZvciB0aGUgZm9ybWVyIGNsZWFyIE9XTiBiaXQgb3BlcmF0aW9uCisJCQkgKiBvZiBJRE1BQyB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGRlc2NyaXB0b3IKKwkJCSAqIGlzbid0IHN0aWxsIG93bmVkIGJ5IElETUFDIGFzIElETUFDJ3Mgd3JpdGUKKwkJCSAqIG9wcyBhbmQgQ1BVJ3MgcmVhZCBvcHMgYXJlIGFzeW5jaHJvbm91cy4KKwkJCSAqLworCQkJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisJCQl3aGlsZSAocmVhZGwoJmRlc2MtPmRlczApICYgSURNQUNfREVTMF9PV04pIHsKKwkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCQkJZ290byBlcnJfb3duX2JpdDsKKwkJCQl1ZGVsYXkoMTApOworCQkJfQorCisJCQkvKgorCQkJICogU2V0IHRoZSBPV04gYml0IGFuZCBkaXNhYmxlIGludGVycnVwdHMKKwkJCSAqIGZvciB0aGlzIGRlc2NyaXB0b3IKKwkJCSAqLworCQkJZGVzYy0+ZGVzMCA9IElETUFDX0RFUzBfT1dOIHwgSURNQUNfREVTMF9ESUMgfAorCQkJCQkJSURNQUNfREVTMF9DSDsKKworCQkJLyogQnVmZmVyIGxlbmd0aCAqLworCQkJSURNQUNfNjRBRERSX1NFVF9CVUZGRVIxX1NJWkUoZGVzYywgZGVzY19sZW4pOworCisJCQkvKiBQaHlzaWNhbCBhZGRyZXNzIHRvIERNQSB0by9mcm9tICovCisJCQlkZXNjLT5kZXM0ID0gbWVtX2FkZHIgJiAweGZmZmZmZmZmOworCQkJZGVzYy0+ZGVzNSA9IG1lbV9hZGRyID4+IDMyOworCisJCQkvKiBVcGRhdGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIG5leHQgZGVzYyAqLworCQkJbWVtX2FkZHIgKz0gZGVzY19sZW47CisKKwkJCS8qIFNhdmUgcG9pbnRlciB0byB0aGUgbGFzdCBkZXNjcmlwdG9yICovCisJCQlkZXNjX2xhc3QgPSBkZXNjOworCQl9CisJfQorCisJLyogU2V0IGZpcnN0IGRlc2NyaXB0b3IgKi8KKwlkZXNjX2ZpcnN0LT5kZXMwIHw9IElETUFDX0RFUzBfRkQ7CisKKwkvKiBTZXQgbGFzdCBkZXNjcmlwdG9yICovCisJZGVzY19sYXN0LT5kZXMwICY9IH4oSURNQUNfREVTMF9DSCB8IElETUFDX0RFUzBfRElDKTsKKwlkZXNjX2xhc3QtPmRlczAgfD0gSURNQUNfREVTMF9MRDsKKworCXJldHVybiAwOworZXJyX293bl9iaXQ6CisJLyogcmVzdG9yZSB0aGUgZGVzY3JpcHRvciBjaGFpbiBhcyBpdCdzIHBvbGx1dGVkICovCisJZGV2X2RiZyhob3N0LT5kZXYsICJkZXNjaXB0b3IgaXMgc3RpbGwgb3duZWQgYnkgSURNQUMuXG4iKTsKKwltZW1zZXQoaG9zdC0+c2dfY3B1LCAwLCBERVNDX1JJTkdfQlVGX1NaKTsKKwlkd19tY2lfaWRtYWNfaW5pdChob3N0KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCitzdGF0aWMgaW5saW5lIGludCBkd19tY2lfcHJlcGFyZV9kZXNjMzIoc3RydWN0IGR3X21jaSAqaG9zdCwKKwkJCQkJIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSwKKwkJCQkJIHVuc2lnbmVkIGludCBzZ19sZW4pCit7CisJdW5zaWduZWQgaW50IGRlc2NfbGVuOworCXN0cnVjdCBpZG1hY19kZXNjICpkZXNjX2ZpcnN0LCAqZGVzY19sYXN0LCAqZGVzYzsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJaW50IGk7CisKKwlkZXNjX2ZpcnN0ID0gZGVzY19sYXN0ID0gZGVzYyA9IGhvc3QtPnNnX2NwdTsKKworCWZvciAoaSA9IDA7IGkgPCBzZ19sZW47IGkrKykgeworCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gc2dfZG1hX2xlbigmZGF0YS0+c2dbaV0pOworCisJCXUzMiBtZW1fYWRkciA9IHNnX2RtYV9hZGRyZXNzKCZkYXRhLT5zZ1tpXSk7CisKKwkJZm9yICggOyBsZW5ndGggOyBkZXNjKyspIHsKKwkJCWRlc2NfbGVuID0gKGxlbmd0aCA8PSBEV19NQ0lfREVTQ19EQVRBX0xFTkdUSCkgPworCQkJCSAgIGxlbmd0aCA6IERXX01DSV9ERVNDX0RBVEFfTEVOR1RIOworCisJCQlsZW5ndGggLT0gZGVzY19sZW47CisKKwkJCS8qCisJCQkgKiBXYWl0IGZvciB0aGUgZm9ybWVyIGNsZWFyIE9XTiBiaXQgb3BlcmF0aW9uCisJCQkgKiBvZiBJRE1BQyB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGRlc2NyaXB0b3IKKwkJCSAqIGlzbid0IHN0aWxsIG93bmVkIGJ5IElETUFDIGFzIElETUFDJ3Mgd3JpdGUKKwkJCSAqIG9wcyBhbmQgQ1BVJ3MgcmVhZCBvcHMgYXJlIGFzeW5jaHJvbm91cy4KKwkJCSAqLworCQkJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMCk7CisJCQl3aGlsZSAocmVhZGwoJmRlc2MtPmRlczApICYKKwkJCSAgICAgICBjcHVfdG9fbGUzMihJRE1BQ19ERVMwX09XTikpIHsKKwkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCQkJZ290byBlcnJfb3duX2JpdDsKKwkJCQl1ZGVsYXkoMTApOworCQkJfQorCisJCQkvKgorCQkJICogU2V0IHRoZSBPV04gYml0IGFuZCBkaXNhYmxlIGludGVycnVwdHMKKwkJCSAqIGZvciB0aGlzIGRlc2NyaXB0b3IKKwkJCSAqLworCQkJZGVzYy0+ZGVzMCA9IGNwdV90b19sZTMyKElETUFDX0RFUzBfT1dOIHwKKwkJCQkJCSBJRE1BQ19ERVMwX0RJQyB8CisJCQkJCQkgSURNQUNfREVTMF9DSCk7CisKKwkJCS8qIEJ1ZmZlciBsZW5ndGggKi8KKwkJCUlETUFDX1NFVF9CVUZGRVIxX1NJWkUoZGVzYywgZGVzY19sZW4pOworCisJCQkvKiBQaHlzaWNhbCBhZGRyZXNzIHRvIERNQSB0by9mcm9tICovCisJCQlkZXNjLT5kZXMyID0gY3B1X3RvX2xlMzIobWVtX2FkZHIpOworCisJCQkvKiBVcGRhdGUgcGh5c2ljYWwgYWRkcmVzcyBmb3IgdGhlIG5leHQgZGVzYyAqLworCQkJbWVtX2FkZHIgKz0gZGVzY19sZW47CisKKwkJCS8qIFNhdmUgcG9pbnRlciB0byB0aGUgbGFzdCBkZXNjcmlwdG9yICovCisJCQlkZXNjX2xhc3QgPSBkZXNjOworCQl9CisJfQorCisJLyogU2V0IGZpcnN0IGRlc2NyaXB0b3IgKi8KKwlkZXNjX2ZpcnN0LT5kZXMwIHw9IGNwdV90b19sZTMyKElETUFDX0RFUzBfRkQpOworCisJLyogU2V0IGxhc3QgZGVzY3JpcHRvciAqLworCWRlc2NfbGFzdC0+ZGVzMCAmPSBjcHVfdG9fbGUzMih+KElETUFDX0RFUzBfQ0ggfAorCQkJCSAgICAgICBJRE1BQ19ERVMwX0RJQykpOworCWRlc2NfbGFzdC0+ZGVzMCB8PSBjcHVfdG9fbGUzMihJRE1BQ19ERVMwX0xEKTsKKworCXJldHVybiAwOworZXJyX293bl9iaXQ6CisJLyogcmVzdG9yZSB0aGUgZGVzY3JpcHRvciBjaGFpbiBhcyBpdCdzIHBvbGx1dGVkICovCisJZGV2X2RiZyhob3N0LT5kZXYsICJkZXNjaXB0b3IgaXMgc3RpbGwgb3duZWQgYnkgSURNQUMuXG4iKTsKKwltZW1zZXQoaG9zdC0+c2dfY3B1LCAwLCBERVNDX1JJTkdfQlVGX1NaKTsKKwlkd19tY2lfaWRtYWNfaW5pdChob3N0KTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBkd19tY2lfaWRtYWNfc3RhcnRfZG1hKHN0cnVjdCBkd19tY2kgKmhvc3QsIHVuc2lnbmVkIGludCBzZ19sZW4pCit7CisJdTMyIHRlbXA7CisJaW50IHJldDsKKworCWlmIChob3N0LT5kbWFfNjRiaXRfYWRkcmVzcyA9PSAxKQorCQlyZXQgPSBkd19tY2lfcHJlcGFyZV9kZXNjNjQoaG9zdCwgaG9zdC0+ZGF0YSwgc2dfbGVuKTsKKwllbHNlCisJCXJldCA9IGR3X21jaV9wcmVwYXJlX2Rlc2MzMihob3N0LCBob3N0LT5kYXRhLCBzZ19sZW4pOworCisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBkcmFpbiB3cml0ZWJ1ZmZlciAqLworCXdtYigpOworCisJLyogTWFrZSBzdXJlIHRvIHJlc2V0IERNQSBpbiBjYXNlIHdlIGRpZCBQSU8gYmVmb3JlIHRoaXMgKi8KKwlkd19tY2lfY3RybF9yZXNldChob3N0LCBTRE1NQ19DVFJMX0RNQV9SRVNFVCk7CisJZHdfbWNpX2lkbWFjX3Jlc2V0KGhvc3QpOworCisJLyogU2VsZWN0IElETUFDIGludGVyZmFjZSAqLworCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgQ1RSTCk7CisJdGVtcCB8PSBTRE1NQ19DVFJMX1VTRV9JRE1BQzsKKwltY2lfd3JpdGVsKGhvc3QsIENUUkwsIHRlbXApOworCisJLyogZHJhaW4gd3JpdGVidWZmZXIgKi8KKwl3bWIoKTsKKworCS8qIEVuYWJsZSB0aGUgSURNQUMgKi8KKwl0ZW1wID0gbWNpX3JlYWRsKGhvc3QsIEJNT0QpOworCXRlbXAgfD0gU0RNTUNfSURNQUNfRU5BQkxFIHwgU0RNTUNfSURNQUNfRkI7CisJbWNpX3dyaXRlbChob3N0LCBCTU9ELCB0ZW1wKTsKKworCS8qIFN0YXJ0IGl0IHJ1bm5pbmcgKi8KKwltY2lfd3JpdGVsKGhvc3QsIFBMRE1ORCwgMSk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGR3X21jaV9kbWFfb3BzIGR3X21jaV9pZG1hY19vcHMgPSB7CiAJLmluaXQgPSBkd19tY2lfaWRtYWNfaW5pdCwKIAkuc3RhcnQgPSBkd19tY2lfaWRtYWNfc3RhcnRfZG1hLApAQCAtODc2LDExICs5MzksOCBAQAogCSAqIE1TSVpFIGlzICcxJywKIAkgKiBpZiBibGtzeiBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgRklGTyB3aWR0aAogCSAqLwotCWlmIChibGtzeiAlIGZpZm9fd2lkdGgpIHsKLQkJbXNpemUgPSAwOwotCQlyeF93bWFyayA9IDE7CisJaWYgKGJsa3N6ICUgZmlmb193aWR0aCkKIAkJZ290byBkb25lOwotCX0KIAogCWRvIHsKIAkJaWYgKCEoKGJsa3N6X2RlcHRoICUgbXN6c1tpZHhdKSB8fApAQCAtOTk4LDggKzEwNTgsMTAgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5pcnFfbG9jaywgaXJxZmxhZ3MpOwogCiAJaWYgKGhvc3QtPmRtYV9vcHMtPnN0YXJ0KGhvc3QsIHNnX2xlbikpIHsKLQkJLyogV2UgY2FuJ3QgZG8gRE1BICovCi0JCWRldl9lcnIoaG9zdC0+ZGV2LCAiJXM6IGZhaWxlZCB0byBzdGFydCBETUEuXG4iLCBfX2Z1bmNfXyk7CisJCS8qIFdlIGNhbid0IGRvIERNQSwgdHJ5IFBJTyBmb3IgdGhpcyBvbmUgKi8KKwkJZGV2X2RiZyhob3N0LT5kZXYsCisJCQkiJXM6IGZhbGwgYmFjayB0byBQSU8gbW9kZSBmb3IgY3VycmVudCB0cmFuc2ZlclxuIiwKKwkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMTEyLDExICsxMTc0LDEyIEBACiAKIAkJZGl2ID0gKGhvc3QtPmJ1c19oeiAhPSBjbG9jaykgPyBESVZfUk9VTkRfVVAoZGl2LCAyKSA6IDA7CiAKLQkJZGV2X2luZm8oJnNsb3QtPm1tYy0+Y2xhc3NfZGV2LAotCQkJICJCdXMgc3BlZWQgKHNsb3QgJWQpID0gJWRIeiAoc2xvdCByZXEgJWRIeiwgYWN0dWFsICVkSFogZGl2ID0gJWQpXG4iLAotCQkJIHNsb3QtPmlkLCBob3N0LT5idXNfaHosIGNsb2NrLAotCQkJIGRpdiA/ICgoaG9zdC0+YnVzX2h6IC8gZGl2KSA+PiAxKSA6Ci0JCQkgaG9zdC0+YnVzX2h6LCBkaXYpOworCQlpZiAoY2xvY2sgIT0gc2xvdC0+X19jbGtfb2xkIHx8IGZvcmNlX2Nsa2luaXQpCisJCQlkZXZfaW5mbygmc2xvdC0+bW1jLT5jbGFzc19kZXYsCisJCQkJICJCdXMgc3BlZWQgKHNsb3QgJWQpID0gJWRIeiAoc2xvdCByZXEgJWRIeiwgYWN0dWFsICVkSFogZGl2ID0gJWQpXG4iLAorCQkJCSBzbG90LT5pZCwgaG9zdC0+YnVzX2h6LCBjbG9jaywKKwkJCQkgZGl2ID8gKChob3N0LT5idXNfaHogLyBkaXYpID4+IDEpIDoKKwkJCQkgaG9zdC0+YnVzX2h6LCBkaXYpOwogCiAJCS8qIGRpc2FibGUgY2xvY2sgKi8KIAkJbWNpX3dyaXRlbChob3N0LCBDTEtFTkEsIDApOwpAQCAtMTEzOSw2ICsxMjAyLDkgQEAKIAogCQkvKiBpbmZvcm0gQ0lVICovCiAJCW1jaV9zZW5kX2NtZChzbG90LCBzZG1tY19jbWRfYml0cywgMCk7CisKKwkJLyoga2VlcCB0aGUgbGFzdCBjbG9jayB2YWx1ZSB0aGF0IHdhcyByZXF1ZXN0ZWQgZnJvbSBjb3JlICovCisJCXNsb3QtPl9fY2xrX29sZCA9IGNsb2NrOwogCX0KIAogCWhvc3QtPmN1cnJlbnRfc3BlZWQgPSBjbG9jazsKQEAgLTE2OTEsMTEgKzE3NTcsMTEgQEAKIAkJCQlkYXRhLT5lcnJvciA9IC1FVElNRURPVVQ7CiAJCQl9IGVsc2UgaWYgKGhvc3QtPmRpcl9zdGF0dXMgPT0KIAkJCQkJRFdfTUNJX1JFQ1ZfU1RBVFVTKSB7Ci0JCQkJZGF0YS0+ZXJyb3IgPSAtRUlPOworCQkJCWRhdGEtPmVycm9yID0gLUVJTFNFUTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8qIFNETU1DX0lOVF9TQkUgaXMgaW5jbHVkZWQgKi8KLQkJCWRhdGEtPmVycm9yID0gLUVJTzsKKwkJCWRhdGEtPmVycm9yID0gLUVJTFNFUTsKIAkJfQogCiAJCWRldl9kYmcoaG9zdC0+ZGV2LCAiZGF0YSBlcnJvciwgc3RhdHVzIDB4JTA4eFxuIiwgc3RhdHVzKTsKQEAgLTI1MjMsNDcgKzI1ODksNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotI2lmZGVmIENPTkZJR19PRgotLyogZ2l2ZW4gYSBzbG90LCBmaW5kIG91dCB0aGUgZGV2aWNlIG5vZGUgcmVwcmVzZW50aW5nIHRoYXQgc2xvdCAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHdfbWNpX29mX2ZpbmRfc2xvdF9ub2RlKHN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzbG90LT5tbWMtPnBhcmVudDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCWNvbnN0IF9fYmUzMiAqYWRkcjsKLQlpbnQgbGVuOwotCi0JaWYgKCFkZXYgfHwgIWRldi0+b2Zfbm9kZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKGRldi0+b2Zfbm9kZSwgbnApIHsKLQkJYWRkciA9IG9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsICZsZW4pOwotCQlpZiAoIWFkZHIgfHwgKGxlbiA8IHNpemVvZihpbnQpKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoYmUzMl90b19jcHVwKGFkZHIpID09IHNsb3QtPmlkKQotCQkJcmV0dXJuIG5wOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgZHdfbWNpX3Nsb3Rfb2ZfcGFyc2Uoc3RydWN0IGR3X21jaV9zbG90ICpzbG90KQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkd19tY2lfb2ZfZmluZF9zbG90X25vZGUoc2xvdCk7Ci0KLQlpZiAoIW5wKQotCQlyZXR1cm47Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiZGlzYWJsZS13cCIpKSB7Ci0JCXNsb3QtPm1tYy0+Y2FwczIgfD0gTU1DX0NBUDJfTk9fV1JJVEVfUFJPVEVDVDsKLQkJZGV2X3dhcm4oc2xvdC0+bW1jLT5wYXJlbnQsCi0JCQkiU2xvdCBxdWlyayAnZGlzYWJsZS13cCcgaXMgZGVwcmVjYXRlZFxuIik7Ci0JfQotfQotI2Vsc2UgLyogQ09ORklHX09GICovCi1zdGF0aWMgdm9pZCBkd19tY2lfc2xvdF9vZl9wYXJzZShzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QpCi17Ci19Ci0jZW5kaWYgLyogQ09ORklHX09GICovCi0KIHN0YXRpYyBpbnQgZHdfbWNpX2luaXRfc2xvdChzdHJ1Y3QgZHdfbWNpICpob3N0LCB1bnNpZ25lZCBpbnQgaWQpCiB7CiAJc3RydWN0IG1tY19ob3N0ICptbWM7CkBAIC0yNjI2LDggKzI2NTEsNiBAQAogCWlmIChob3N0LT5wZGF0YS0+Y2FwczIpCiAJCW1tYy0+Y2FwczIgPSBob3N0LT5wZGF0YS0+Y2FwczI7CiAKLQlkd19tY2lfc2xvdF9vZl9wYXJzZShzbG90KTsKLQogCXJldCA9IG1tY19vZl9wYXJzZShtbWMpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2hvc3RfYWxsb2NhdGVkOwpAQCAtMjczMiw3ICsyNzU1LDggQEAKIAkJfQogCiAJCS8qIEFsbG9jIG1lbW9yeSBmb3Igc2cgdHJhbnNsYXRpb24gKi8KLQkJaG9zdC0+c2dfY3B1ID0gZG1hbV9hbGxvY19jb2hlcmVudChob3N0LT5kZXYsIFBBR0VfU0laRSwKKwkJaG9zdC0+c2dfY3B1ID0gZG1hbV9hbGxvY19jb2hlcmVudChob3N0LT5kZXYsCisJCQkJCQkgICBERVNDX1JJTkdfQlVGX1NaLAogCQkJCQkJICAgJmhvc3QtPnNnX2RtYSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghaG9zdC0+c2dfY3B1KSB7CiAJCQlkZXZfZXJyKGhvc3QtPmRldiwKQEAgLTI5MTUsNiArMjkzOSwxMyBAQAogCWlmICghcGRhdGEpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCisJLyogZmluZCByZXNldCBjb250cm9sbGVyIHdoZW4gZXhpc3QgKi8KKwlwZGF0YS0+cnN0YyA9IGRldm1fcmVzZXRfY29udHJvbF9nZXRfb3B0aW9uYWwoZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBkYXRhLT5yc3RjKSkgeworCQlpZiAoUFRSX0VSUihwZGF0YS0+cnN0YykgPT0gLUVQUk9CRV9ERUZFUikKKwkJCXJldHVybiBFUlJfUFRSKC1FUFJPQkVfREVGRVIpOworCX0KKwogCS8qIGZpbmQgb3V0IG51bWJlciBvZiBzbG90cyBzdXBwb3J0ZWQgKi8KIAlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm51bS1zbG90cyIsICZwZGF0YS0+bnVtX3Nsb3RzKTsKIApAQCAtMjkzMywxMSArMjk2NCw2IEBACiAJCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIAotCWlmIChvZl9maW5kX3Byb3BlcnR5KG5wLCAic3VwcG9ydHMtaGlnaHNwZWVkIiwgTlVMTCkpIHsKLQkJZGV2X2luZm8oZGV2LCAic3VwcG9ydHMtaGlnaHNwZWVkIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuXG4iKTsKLQkJcGRhdGEtPmNhcHMgfD0gTU1DX0NBUF9TRF9ISUdIU1BFRUQgfCBNTUNfQ0FQX01NQ19ISUdIU1BFRUQ7Ci0JfQotCiAJcmV0dXJuIHBkYXRhOwogfQogCkBAIC0yOTg2LDcgKzMwMTIsOSBAQAogCiAJaWYgKCFob3N0LT5wZGF0YSkgewogCQlob3N0LT5wZGF0YSA9IGR3X21jaV9wYXJzZV9kdChob3N0KTsKLQkJaWYgKElTX0VSUihob3N0LT5wZGF0YSkpIHsKKwkJaWYgKFBUUl9FUlIoaG9zdC0+cGRhdGEpID09IC1FUFJPQkVfREVGRVIpIHsKKwkJCXJldHVybiAtRVBST0JFX0RFRkVSOworCQl9IGVsc2UgaWYgKElTX0VSUihob3N0LT5wZGF0YSkpIHsKIAkJCWRldl9lcnIoaG9zdC0+ZGV2LCAicGxhdGZvcm0gZGF0YSBub3QgYXZhaWxhYmxlXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0zMDQwLDYgKzMwNjgsMTIgQEAKIAkJfQogCX0KIAorCWlmICghSVNfRVJSKGhvc3QtPnBkYXRhLT5yc3RjKSkgeworCQlyZXNldF9jb250cm9sX2Fzc2VydChob3N0LT5wZGF0YS0+cnN0Yyk7CisJCXVzbGVlcF9yYW5nZSgxMCwgNTApOworCQlyZXNldF9jb250cm9sX2RlYXNzZXJ0KGhvc3QtPnBkYXRhLT5yc3RjKTsKKwl9CisKIAlzZXR1cF90aW1lcigmaG9zdC0+Y21kMTFfdGltZXIsCiAJCSAgICBkd19tY2lfY21kMTFfdGltZXIsICh1bnNpZ25lZCBsb25nKWhvc3QpOwogCkBAIC0zMTg5LDEzICszMjIzLDE0IEBACiAJaWYgKGhvc3QtPnVzZV9kbWEgJiYgaG9zdC0+ZG1hX29wcy0+ZXhpdCkKIAkJaG9zdC0+ZG1hX29wcy0+ZXhpdChob3N0KTsKIAorCWlmICghSVNfRVJSKGhvc3QtPnBkYXRhLT5yc3RjKSkKKwkJcmVzZXRfY29udHJvbF9hc3NlcnQoaG9zdC0+cGRhdGEtPnJzdGMpOworCiBlcnJfY2xrX2NpdToKLQlpZiAoIUlTX0VSUihob3N0LT5jaXVfY2xrKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmNpdV9jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5jaXVfY2xrKTsKIAogZXJyX2Nsa19iaXU6Ci0JaWYgKCFJU19FUlIoaG9zdC0+Yml1X2NsaykpCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5iaXVfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Yml1X2Nsayk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzIyMSwxMSArMzI1NiwxMSBAQAogCWlmIChob3N0LT51c2VfZG1hICYmIGhvc3QtPmRtYV9vcHMtPmV4aXQpCiAJCWhvc3QtPmRtYV9vcHMtPmV4aXQoaG9zdCk7CiAKLQlpZiAoIUlTX0VSUihob3N0LT5jaXVfY2xrKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmNpdV9jbGspOworCWlmICghSVNfRVJSKGhvc3QtPnBkYXRhLT5yc3RjKSkKKwkJcmVzZXRfY29udHJvbF9hc3NlcnQoaG9zdC0+cGRhdGEtPnJzdGMpOwogCi0JaWYgKCFJU19FUlIoaG9zdC0+Yml1X2NsaykpCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5iaXVfY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Y2l1X2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmJpdV9jbGspOwogfQogRVhQT1JUX1NZTUJPTChkd19tY2lfcmVtb3ZlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuaCBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmgKaW5kZXggOWU3NDBiYy4uZThjZDJkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oCkBAIC0yNDksNiArMjQ5LDggQEAKICAqIEBxdWV1ZV9ub2RlOiBMaXN0IG5vZGUgZm9yIHBsYWNpbmcgdGhpcyBub2RlIGluIHRoZSBAcXVldWUgbGlzdCBvZgogICoJJnN0cnVjdCBkd19tY2kuCiAgKiBAY2xvY2s6IENsb2NrIHJhdGUgY29uZmlndXJlZCBieSBzZXRfaW9zKCkuIFByb3RlY3RlZCBieSBob3N0LT5sb2NrLgorICogQF9fY2xrX29sZDogVGhlIGxhc3QgY2xvY2sgdmFsdWUgdGhhdCB3YXMgcmVxdWVzdGVkIGZyb20gY29yZS4KKyAqCUtlZXBpbmcgdHJhY2sgb2YgdGhpcyBoZWxwcyB1cyB0byBhdm9pZCBzcGFtbWluZyB0aGUgY29uc29sZS4KICAqIEBmbGFnczogUmFuZG9tIHN0YXRlIGJpdHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzbG90LgogICogQGlkOiBOdW1iZXIgb2YgdGhpcyBzbG90LgogICogQHNkaW9faWQ6IE51bWJlciBvZiB0aGlzIHNsb3QgaW4gdGhlIFNESU8gaW50ZXJydXB0IHJlZ2lzdGVycy4KQEAgLTI2Myw2ICsyNjUsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJcXVldWVfbm9kZTsKIAogCXVuc2lnbmVkIGludAkJY2xvY2s7CisJdW5zaWduZWQgaW50CQlfX2Nsa19vbGQ7CiAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKICNkZWZpbmUgRFdfTU1DX0NBUkRfUFJFU0VOVAkwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L21veGFydC1tbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvbW94YXJ0LW1tYy5jCmluZGV4IDc5OTA1Y2UuLmJiYWQzMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbW94YXJ0LW1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvbW94YXJ0LW1tYy5jCkBAIC0yNTcsNyArMjU3LDcgQEAKIHN0YXRpYyB2b2lkIG1veGFydF90cmFuc2Zlcl9kbWEoc3RydWN0IG1tY19kYXRhICpkYXRhLCBzdHJ1Y3QgbW94YXJ0X2hvc3QgKmhvc3QpCiB7CiAJdTMyIGxlbiwgZGlyX2RhdGEsIGRpcl9zbGF2ZTsKLQl1bnNpZ25lZCBsb25nIGRtYV90aW1lOworCWxvbmcgZG1hX3RpbWU7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjID0gTlVMTDsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmRtYV9jaGFuOwogCkBAIC0zOTcsNyArMzk3LDggQEAKIHN0YXRpYyB2b2lkIG1veGFydF9yZXF1ZXN0KHN0cnVjdCBtbWNfaG9zdCAqbW1jLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKIHsKIAlzdHJ1Y3QgbW94YXJ0X2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwotCXVuc2lnbmVkIGxvbmcgcGlvX3RpbWUsIGZsYWdzOworCWxvbmcgcGlvX3RpbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgc3RhdHVzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcC5jIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMKaW5kZXggZjIzZDY1ZS4uYmUzYzQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwLmMKQEAgLTEwMTYsMTQgKzEwMTYsMTYgQEAKIAogCQkvKiBPbmx5IHJlY29uZmlndXJlIGlmIHdlIGhhdmUgYSBkaWZmZXJlbnQgYnVyc3Qgc2l6ZSAqLwogCQlpZiAoKmJwICE9IGJ1cnN0KSB7Ci0JCQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBjZmc7Ci0KLQkJCWNmZy5zcmNfYWRkciA9IGhvc3QtPnBoeXNfYmFzZSArIE9NQVBfTU1DX1JFRyhob3N0LCBEQVRBKTsKLQkJCWNmZy5kc3RfYWRkciA9IGhvc3QtPnBoeXNfYmFzZSArIE9NQVBfTU1DX1JFRyhob3N0LCBEQVRBKTsKLQkJCWNmZy5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOwotCQkJY2ZnLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM7Ci0JCQljZmcuc3JjX21heGJ1cnN0ID0gYnVyc3Q7Ci0JCQljZmcuZHN0X21heGJ1cnN0ID0gYnVyc3Q7CisJCQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBjZmcgPSB7CisJCQkJLnNyY19hZGRyID0gaG9zdC0+cGh5c19iYXNlICsKKwkJCQkJICAgIE9NQVBfTU1DX1JFRyhob3N0LCBEQVRBKSwKKwkJCQkuZHN0X2FkZHIgPSBob3N0LT5waHlzX2Jhc2UgKworCQkJCQkgICAgT01BUF9NTUNfUkVHKGhvc3QsIERBVEEpLAorCQkJCS5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTLAorCQkJCS5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTLAorCQkJCS5zcmNfbWF4YnVyc3QgPSBidXJzdCwKKwkJCQkuZHN0X21heGJ1cnN0ID0gYnVyc3QsCisJCQl9OwogCiAJCQlpZiAoZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhjLCAmY2ZnKSkKIAkJCQlnb3RvIHVzZV9waW87CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCmluZGV4IDI0ZWJjOWEuLjVmMmYyNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCkBAIC0xNDA5LDExICsxNDA5LDE4IEBACiBzdGF0aWMgaW50IG9tYXBfaHNtbWNfc2V0dXBfZG1hX3RyYW5zZmVyKHN0cnVjdCBvbWFwX2hzbW1jX2hvc3QgKmhvc3QsCiAJCQkJCXN0cnVjdCBtbWNfcmVxdWVzdCAqcmVxKQogewotCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGNmZzsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4OwogCWludCByZXQgPSAwLCBpOwogCXN0cnVjdCBtbWNfZGF0YSAqZGF0YSA9IHJlcS0+ZGF0YTsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgY2ZnID0geworCQkuc3JjX2FkZHIgPSBob3N0LT5tYXBiYXNlICsgT01BUF9IU01NQ19EQVRBLAorCQkuZHN0X2FkZHIgPSBob3N0LT5tYXBiYXNlICsgT01BUF9IU01NQ19EQVRBLAorCQkuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUywKKwkJLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVMsCisJCS5zcmNfbWF4YnVyc3QgPSBkYXRhLT5ibGtzeiAvIDQsCisJCS5kc3RfbWF4YnVyc3QgPSBkYXRhLT5ibGtzeiAvIDQsCisJfTsKIAogCS8qIFNhbml0eSBjaGVjazogYWxsIHRoZSBTRyBlbnRyaWVzIG11c3QgYmUgYWxpZ25lZCBieSBibG9jayBzaXplLiAqLwogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5zZ19sZW47IGkrKykgewpAQCAtMTQzMywxMyArMTQ0MCw2IEBACiAKIAljaGFuID0gb21hcF9oc21tY19nZXRfZG1hX2NoYW4oaG9zdCwgZGF0YSk7CiAKLQljZmcuc3JjX2FkZHIgPSBob3N0LT5tYXBiYXNlICsgT01BUF9IU01NQ19EQVRBOwotCWNmZy5kc3RfYWRkciA9IGhvc3QtPm1hcGJhc2UgKyBPTUFQX0hTTU1DX0RBVEE7Ci0JY2ZnLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7Ci0JY2ZnLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7Ci0JY2ZnLnNyY19tYXhidXJzdCA9IGRhdGEtPmJsa3N6IC8gNDsKLQljZmcuZHN0X21heGJ1cnN0ID0gZGF0YS0+Ymxrc3ogLyA0OwotCiAJcmV0ID0gZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhjaGFuLCAmY2ZnKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9ydHN4X3BjaV9zZG1tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9ydHN4X3BjaV9zZG1tYy5jCmluZGV4IDM5NmM5YjcuLjNjY2FhMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvcnRzeF9wY2lfc2RtbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3J0c3hfcGNpX3NkbW1jLmMKQEAgLTEyNiw3ICsxMjYsNyBAQAogCQlyZXR1cm4gU0RfUlNQX1RZUEVfUjA7CiAJY2FzZSBNTUNfUlNQX1IxOgogCQlyZXR1cm4gU0RfUlNQX1RZUEVfUjE7Ci0JY2FzZSBNTUNfUlNQX1IxICYgfk1NQ19SU1BfQ1JDOgorCWNhc2UgTU1DX1JTUF9SMV9OT19DUkM6CiAJCXJldHVybiBTRF9SU1BfVFlQRV9SMSB8IFNEX05PX0NIRUNLX0NSQzc7CiAJY2FzZSBNTUNfUlNQX1IxQjoKIAkJcmV0dXJuIFNEX1JTUF9UWVBFX1IxYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvcnRzeF91c2Jfc2RtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3QvcnRzeF91c2Jfc2RtbWMuYwppbmRleCA2YzcxZmM5Li40MTA2Mjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3J0c3hfdXNiX3NkbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9ydHN4X3VzYl9zZG1tYy5jCkBAIC0zMjQsNyArMzI0LDcgQEAKIAljYXNlIE1NQ19SU1BfUjE6CiAJCXJzcF90eXBlID0gU0RfUlNQX1RZUEVfUjE7CiAJCWJyZWFrOwotCWNhc2UgTU1DX1JTUF9SMSAmIH5NTUNfUlNQX0NSQzoKKwljYXNlIE1NQ19SU1BfUjFfTk9fQ1JDOgogCQlyc3BfdHlwZSA9IFNEX1JTUF9UWVBFX1IxIHwgU0RfTk9fQ0hFQ0tfQ1JDNzsKIAkJYnJlYWs7CiAJY2FzZSBNTUNfUlNQX1IxQjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYWNwaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1hY3BpLmMKaW5kZXggOGZlMDc1Ni4uODFkNGRjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1hY3BpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1hY3BpLmMKQEAgLTI3NSw3ICsyNzUsNyBAQAogCS5jaGlwICAgID0gJnNkaGNpX2FjcGlfY2hpcF9pbnQsCiAJLmNhcHMgICAgPSBNTUNfQ0FQXzhfQklUX0RBVEEgfCBNTUNfQ0FQX05PTlJFTU9WQUJMRSB8CiAJCSAgIE1NQ19DQVBfSFdfUkVTRVQgfCBNTUNfQ0FQXzFfOFZfRERSIHwKLQkJICAgTU1DX0NBUF9XQUlUX1dISUxFX0JVU1ksCisJCSAgIE1NQ19DQVBfQ01EX0RVUklOR19URlIgfCBNTUNfQ0FQX1dBSVRfV0hJTEVfQlVTWSwKIAkuY2FwczIgICA9IE1NQ19DQVAyX0hDX0VSQVNFX1NaLAogCS5mbGFncyAgID0gU0RIQ0lfQUNQSV9SVU5USU1FX1BNLAogCS5xdWlya3MgID0gU0RIQ0lfUVVJUktfTk9fRU5EQVRUUl9JTl9OT1BERVNDLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1iY20ta29uYS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1iY20ta29uYS5jCmluZGV4IGU1YzYzNGIuLjUxZGQyZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYmNtLWtvbmEuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWJjbS1rb25hLmMKQEAgLTI1MywxMiArMjUzLDE0IEBACiAJCWdvdG8gZXJyX3BsdGZtX2ZyZWU7CiAJfQogCi0JaWYgKGNsa19zZXRfcmF0ZShwbHRmbV9wcml2LT5jbGssIGhvc3QtPm1tYy0+Zl9tYXgpICE9IDApIHsKKwlyZXQgPSBjbGtfc2V0X3JhdGUocGx0Zm1fcHJpdi0+Y2xrLCBob3N0LT5tbWMtPmZfbWF4KTsKKwlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCByYXRlIGNvcmUgY2xvY2tcbiIpOwogCQlnb3RvIGVycl9wbHRmbV9mcmVlOwogCX0KIAotCWlmIChjbGtfcHJlcGFyZV9lbmFibGUocGx0Zm1fcHJpdi0+Y2xrKSAhPSAwKSB7CisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHBsdGZtX3ByaXYtPmNsayk7CisJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgY29yZSBjbG9ja1xuIik7CiAJCWdvdG8gZXJyX3BsdGZtX2ZyZWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1icmNtc3RiLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWJyY21zdGIuYwppbmRleCBjY2UxMGZlLi4xNTlmNmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWJyY21zdGIuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWJyY21zdGIuYwpAQCAtOTgsNiArOTgsOCBAQAogCSAqIHByb3BlcnRpZXMgdGhyb3VnaCBtbWNfb2ZfcGFyc2UoKS4KIAkgKi8KIAlob3N0LT5jYXBzID0gc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfQ0FQQUJJTElUSUVTKTsKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsICJicmNtLGJjbTc0MjUtc2RoY2kiKSkKKwkJaG9zdC0+Y2FwcyAmPSB+U0RIQ0lfQ0FOXzY0QklUOwogCWhvc3QtPmNhcHMxID0gc2RoY2lfcmVhZGwoaG9zdCwgU0RIQ0lfQ0FQQUJJTElUSUVTXzEpOwogCWhvc3QtPmNhcHMxICY9IH4oU0RIQ0lfU1VQUE9SVF9TRFI1MCB8IFNESENJX1NVUFBPUlRfU0RSMTA0IHwKIAkJCVNESENJX1NVUFBPUlRfRERSNTApOwpAQCAtMTIxLDYgKzEyMyw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNkaGNpX2JyY21fb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtNzQyNS1zZGhjaSIgfSwKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtNzQ0NS1zZGhjaSIgfSwKIAl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzZGhjaV9icmNtX29mX21hdGNoKTsKQEAgLTEyOCw3ICsxMzEsNiBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RoY2lfYnJjbXN0Yl9kcml2ZXIgPSB7CiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInNkaGNpLWJyY21zdGIiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLnBtCT0gJnNkaGNpX2JyY21zdGJfcG1vcHMsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihzZGhjaV9icmNtX29mX21hdGNoKSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKaW5kZXggOTllMGIzMy4uMWY1NGZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKICNpbmNsdWRlICJzZGhjaS1lc2RoYy5oIgogCisjZGVmaW5lIEVTREhDX1NZU19DVFJMX0RUT0NWX01BU0sJMHgwZgogI2RlZmluZQlFU0RIQ19DVFJMX0QzQ0QJCQkweDA4CiAjZGVmaW5lIEVTREhDX0JVUlNUX0xFTl9FTl9JTkNSCQkoMSA8PCAyNykKIC8qIFZFTkRPUiBTUEVDIHJlZ2lzdGVyICovCkBAIC05MjgsNyArOTI5LDggQEAKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CiAJc3RydWN0IHBsdGZtX2lteF9kYXRhICppbXhfZGF0YSA9IHNkaGNpX3BsdGZtX3ByaXYocGx0Zm1faG9zdCk7CiAKLQlyZXR1cm4gZXNkaGNfaXNfdXNkaGMoaW14X2RhdGEpID8gMSA8PCAyOCA6IDEgPDwgMjc7CisJLyogRG9jIEVycmF0YTogdGhlIHVTREhDIGFjdHVhbCBtYXhpbXVtIHRpbWVvdXQgY291bnQgaXMgMSA8PCAyOSAqLworCXJldHVybiBlc2RoY19pc191c2RoYyhpbXhfZGF0YSkgPyAxIDw8IDI5IDogMSA8PCAyNzsKIH0KIAogc3RhdGljIHZvaWQgZXNkaGNfc2V0X3RpbWVvdXQoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfY29tbWFuZCAqY21kKQpAQCAtOTM3LDcgKzkzOSw4IEBACiAJc3RydWN0IHBsdGZtX2lteF9kYXRhICppbXhfZGF0YSA9IHNkaGNpX3BsdGZtX3ByaXYocGx0Zm1faG9zdCk7CiAKIAkvKiB1c2UgbWF4aW11bSB0aW1lb3V0IGNvdW50ZXIgKi8KLQlzZGhjaV93cml0ZWIoaG9zdCwgZXNkaGNfaXNfdXNkaGMoaW14X2RhdGEpID8gMHhGIDogMHhFLAorCWVzZGhjX2NscnNldF9sZShob3N0LCBFU0RIQ19TWVNfQ1RSTF9EVE9DVl9NQVNLLAorCQkJZXNkaGNfaXNfdXNkaGMoaW14X2RhdGEpID8gMHhGIDogMHhFLAogCQkJU0RIQ0lfVElNRU9VVF9DT05UUk9MKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1hcmFzYW4uYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtYXJhc2FuLmMKaW5kZXggZTBmMTkzZi4uZGE4ZTQwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1hcmFzYW4uYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWFyYXNhbi5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgInNkaGNpLXBsdGZtLmgiCisjaW5jbHVkZSA8bGludXgvb2YuaD4KIAogI2RlZmluZSBTREhDSV9BUkFTQU5fQ0xLX0NUUkxfT0ZGU0VUCTB4MmMKICNkZWZpbmUgU0RIQ0lfQVJBU0FOX1ZFTkRPUl9SRUdJU1RFUgkweDc4CkBAIC0zNSw2ICszNiw4IEBACiAjZGVmaW5lIENMS19DVFJMX1RJTUVPVVRfTUFTSwkJKDB4ZiA8PCBDTEtfQ1RSTF9USU1FT1VUX1NISUZUKQogI2RlZmluZSBDTEtfQ1RSTF9USU1FT1VUX01JTl9FWFAJMTMKIAorI2RlZmluZSBQSFlfQ0xLX1RPT19TTE9XX0haCQk0MDAwMDAKKwogLyoKICAqIE9uIHNvbWUgU29DcyB0aGUgc3lzY29uIGFyZWEgaGFzIGEgZmVhdHVyZSB3aGVyZSB0aGUgdXBwZXIgMTYtYml0cyBvZgogICogZWFjaCAzMi1iaXQgcmVnaXN0ZXIgYWN0IGFzIGEgd3JpdGUgbWFzayBmb3IgdGhlIGxvd2VyIDE2LWJpdHMuICBUaGlzIGFsbG93cwpAQCAtNjUsMTAgKzY4LDEyIEBACiAgKiBhY2Nlc3NpYmxlIHZpYSB0aGUgc3lzY29uIEFQSS4KICAqCiAgKiBAYmFzZWNsa2ZyZXE6CVdoZXJlIHRvIGZpbmQgY29yZWNmZ19iYXNlY2xrZnJlcQorICogQGNsb2NrbXVsdGlwbGllcjoJV2hlcmUgdG8gZmluZCBjb3JlY2ZnX2Nsb2NrbXVsdGlwbGllcgogICogQGhpd29yZF91cGRhdGU6CUlmIHRydWUsIHVzZSBISVdPUkRfVVBEQVRFIHRvIGFjY2VzcyB0aGUgc3lzY29uCiAgKi8KIHN0cnVjdCBzZGhjaV9hcmFzYW5fc29jX2N0bF9tYXAgewogCXN0cnVjdCBzZGhjaV9hcmFzYW5fc29jX2N0bF9maWVsZAliYXNlY2xrZnJlcTsKKwlzdHJ1Y3Qgc2RoY2lfYXJhc2FuX3NvY19jdGxfZmllbGQJY2xvY2ttdWx0aXBsaWVyOwogCWJvb2wJCQkJCWhpd29yZF91cGRhdGU7CiB9OwogCkBAIC03Nyw2ICs4Miw3IEBACiAgKiBAaG9zdDoJCVBvaW50ZXIgdG8gdGhlIG1haW4gU0RIQ0kgaG9zdCBzdHJ1Y3R1cmUuCiAgKiBAY2xrX2FoYjoJCVBvaW50ZXIgdG8gdGhlIEFIQiBjbG9jawogICogQHBoeToJCVBvaW50ZXIgdG8gdGhlIGdlbmVyaWMgcGh5CisgKiBAaXNfcGh5X29uOgkJVHJ1ZSBpZiB0aGUgUEhZIGlzIG9uOyBmYWxzZSBpZiBub3QuCiAgKiBAc2RjYXJkY2xrX2h3OglTdHJ1Y3QgZm9yIHRoZSBjbG9jayB3ZSBtaWdodCBwcm92aWRlIHRvIGEgUEhZLgogICogQHNkY2FyZGNsazoJCVBvaW50ZXIgdG8gbm9ybWFsICdzdHJ1Y3QgY2xvY2snIGZvciBzZGNhcmRjbGtfaHcuCiAgKiBAc29jX2N0bF9iYXNlOglQb2ludGVyIHRvIHJlZ21hcCBmb3Igc3lzY29uIGZvciBzb2NfY3RsIHJlZ2lzdGVycy4KQEAgLTg2LDE2ICs5MiwyMiBAQAogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwogCXN0cnVjdCBjbGsJKmNsa19haGI7CiAJc3RydWN0IHBoeQkqcGh5OworCWJvb2wJCWlzX3BoeV9vbjsKIAogCXN0cnVjdCBjbGtfaHcJc2RjYXJkY2xrX2h3OwogCXN0cnVjdCBjbGsgICAgICAqc2RjYXJkY2xrOwogCiAJc3RydWN0IHJlZ21hcAkqc29jX2N0bF9iYXNlOwogCWNvbnN0IHN0cnVjdCBzZGhjaV9hcmFzYW5fc29jX2N0bF9tYXAgKnNvY19jdGxfbWFwOworCXVuc2lnbmVkIGludAlxdWlya3M7IC8qIEFyYXNhbiBkZXZpYXRpb25zIGZyb20gc3BlYyAqLworCisvKiBDb250cm9sbGVyIGRvZXMgbm90IGhhdmUgQ0Qgd2lyZWQgYW5kIHdpbGwgbm90IGZ1bmN0aW9uIG5vcm1hbGx5IHdpdGhvdXQgKi8KKyNkZWZpbmUgU0RIQ0lfQVJBU0FOX1FVSVJLX0ZPUkNFX0NEVEVTVAlCSVQoMCkKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RoY2lfYXJhc2FuX3NvY19jdGxfbWFwIHJrMzM5OV9zb2NfY3RsX21hcCA9IHsKIAkuYmFzZWNsa2ZyZXEgPSB7IC5yZWcgPSAweGYwMDAsIC53aWR0aCA9IDgsIC5zaGlmdCA9IDggfSwKKwkuY2xvY2ttdWx0aXBsaWVyID0geyAucmVnID0gMHhmMDJjLCAud2lkdGggPSA4LCAuc2hpZnQgPSAwfSwKIAkuaGl3b3JkX3VwZGF0ZSA9IHRydWUsCiB9OwogCkBAIC0xNzAsMTMgKzE4Miw0NyBAQAogCXN0cnVjdCBzZGhjaV9hcmFzYW5fZGF0YSAqc2RoY2lfYXJhc2FuID0gc2RoY2lfcGx0Zm1fcHJpdihwbHRmbV9ob3N0KTsKIAlib29sIGN0cmxfcGh5ID0gZmFsc2U7CiAKLQlpZiAoY2xvY2sgPiBNTUNfSElHSF81Ml9NQVhfRFRSICYmICghSVNfRVJSKHNkaGNpX2FyYXNhbi0+cGh5KSkpCi0JCWN0cmxfcGh5ID0gdHJ1ZTsKKwlpZiAoIUlTX0VSUihzZGhjaV9hcmFzYW4tPnBoeSkpIHsKKwkJaWYgKCFzZGhjaV9hcmFzYW4tPmlzX3BoeV9vbiAmJiBjbG9jayA8PSBQSFlfQ0xLX1RPT19TTE9XX0haKSB7CisJCQkvKgorCQkJICogSWYgUEhZIG9mZiwgc2V0IGNsb2NrIHRvIG1heCBzcGVlZCBhbmQgcG93ZXIgUEhZIG9uLgorCQkJICoKKwkJCSAqIEFsdGhvdWdoIFBIWSBkb2NzIGFwcGFyZW50bHkgc3VnZ2VzdCBwb3dlciBjeWNsaW5nCisJCQkgKiB3aGVuIGNoYW5naW5nIHRoZSBjbG9jayB0aGUgUEhZIGRvZXNuJ3QgbGlrZSB0byBiZQorCQkJICogcG93ZXJlZCBvbiB3aGlsZSBhdCBsb3cgc3BlZWRzIGxpa2UgdGhvc2UgdXNlZCBpbiBJRAorCQkJICogbW9kZS4gIEV2ZW4gd29yc2UgaXMgcG93ZXJpbmcgdGhlIFBIWSBvbiB3aGlsZSB0aGUKKwkJCSAqIGNsb2NrIGlzIG9mZi4KKwkJCSAqCisJCQkgKiBUbyB3b3JrYXJvdW5kIHRoZSBQSFkgbGltaXRhdGlvbnMsIHRoZSBiZXN0IHdlIGNhbgorCQkJICogZG8gaXMgdG8gcG93ZXIgaXQgb24gYXQgYSBmYXN0ZXIgc3BlZWQgYW5kIHRoZW4gc2xhbQorCQkJICogdGhyb3VnaCBsb3cgc3BlZWRzIHdpdGhvdXQgcG93ZXIgY3ljbGluZy4KKwkJCSAqLworCQkJc2RoY2lfc2V0X2Nsb2NrKGhvc3QsIGhvc3QtPm1heF9jbGspOworCQkJc3Bpbl91bmxvY2tfaXJxKCZob3N0LT5sb2NrKTsKKwkJCXBoeV9wb3dlcl9vbihzZGhjaV9hcmFzYW4tPnBoeSk7CisJCQlzcGluX2xvY2tfaXJxKCZob3N0LT5sb2NrKTsKKwkJCXNkaGNpX2FyYXNhbi0+aXNfcGh5X29uID0gdHJ1ZTsKIAotCWlmIChjdHJsX3BoeSkgeworCQkJLyoKKwkJCSAqIFdlJ2xsIG5vdyBmYWxsIHRocm91Z2ggdG8gdGhlIGJlbG93IGNhc2Ugd2l0aAorCQkJICogY3RybF9waHkgPSBmYWxzZSAoc28gd2Ugd29uJ3QgdHVybiBvZmYvb24pLiAgVGhlCisJCQkgKiBzZGhjaV9zZXRfY2xvY2soKSB3aWxsIHNldCB0aGUgcmVhbCBjbG9jay4KKwkJCSAqLworCQl9IGVsc2UgaWYgKGNsb2NrID4gUEhZX0NMS19UT09fU0xPV19IWikgeworCQkJLyoKKwkJCSAqIEF0IGhpZ2hlciBjbG9jayBzcGVlZHMgdGhlIFBIWSBpcyBmaW5lIGJlaW5nIHBvd2VyCisJCQkgKiBjeWNsZWQgYW5kIGRvY3Mgc2F5IHlvdSBfc2hvdWxkXyBwb3dlciBjeWNsZSB3aGVuCisJCQkgKiBjaGFuZ2luZyBjbG9jayBzcGVlZHMuCisJCQkgKi8KKwkJCWN0cmxfcGh5ID0gdHJ1ZTsKKwkJfQorCX0KKworCWlmIChjdHJsX3BoeSAmJiBzZGhjaV9hcmFzYW4tPmlzX3BoeV9vbikgewogCQlzcGluX3VubG9ja19pcnEoJmhvc3QtPmxvY2spOwogCQlwaHlfcG93ZXJfb2ZmKHNkaGNpX2FyYXNhbi0+cGh5KTsKIAkJc3Bpbl9sb2NrX2lycSgmaG9zdC0+bG9jayk7CisJCXNkaGNpX2FyYXNhbi0+aXNfcGh5X29uID0gZmFsc2U7CiAJfQogCiAJc2RoY2lfc2V0X2Nsb2NrKGhvc3QsIGNsb2NrKTsKQEAgLTE4NSw2ICsyMzEsNyBAQAogCQlzcGluX3VubG9ja19pcnEoJmhvc3QtPmxvY2spOwogCQlwaHlfcG93ZXJfb24oc2RoY2lfYXJhc2FuLT5waHkpOwogCQlzcGluX2xvY2tfaXJxKCZob3N0LT5sb2NrKTsKKwkJc2RoY2lfYXJhc2FuLT5pc19waHlfb24gPSB0cnVlOwogCX0KIH0KIApAQCAtMjAzLDEyICsyNTAsMjcgQEAKIAl3cml0ZWwodmVuZG9yLCBob3N0LT5pb2FkZHIgKyBTREhDSV9BUkFTQU5fVkVORE9SX1JFR0lTVEVSKTsKIH0KIAordm9pZCBzZGhjaV9hcmFzYW5fcmVzZXQoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHU4IG1hc2spCit7CisJdTggY3RybDsKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJc3RydWN0IHNkaGNpX2FyYXNhbl9kYXRhICpzZGhjaV9hcmFzYW4gPSBzZGhjaV9wbHRmbV9wcml2KHBsdGZtX2hvc3QpOworCisJc2RoY2lfcmVzZXQoaG9zdCwgbWFzayk7CisKKwlpZiAoc2RoY2lfYXJhc2FuLT5xdWlya3MgJiBTREhDSV9BUkFTQU5fUVVJUktfRk9SQ0VfQ0RURVNUKSB7CisJCWN0cmwgPSBzZGhjaV9yZWFkYihob3N0LCBTREhDSV9IT1NUX0NPTlRST0wpOworCQljdHJsIHw9IFNESENJX0NUUkxfQ0RURVNUX0lOUyB8IFNESENJX0NUUkxfQ0RURVNUX0VOOworCQlzZGhjaV93cml0ZWIoaG9zdCwgY3RybCwgU0RIQ0lfSE9TVF9DT05UUk9MKTsKKwl9Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2RoY2lfb3BzIHNkaGNpX2FyYXNhbl9vcHMgPSB7CiAJLnNldF9jbG9jayA9IHNkaGNpX2FyYXNhbl9zZXRfY2xvY2ssCiAJLmdldF9tYXhfY2xvY2sgPSBzZGhjaV9wbHRmbV9jbGtfZ2V0X21heF9jbG9jaywKIAkuZ2V0X3RpbWVvdXRfY2xvY2sgPSBzZGhjaV9hcmFzYW5fZ2V0X3RpbWVvdXRfY2xvY2ssCiAJLnNldF9idXNfd2lkdGggPSBzZGhjaV9zZXRfYnVzX3dpZHRoLAotCS5yZXNldCA9IHNkaGNpX3Jlc2V0LAorCS5yZXNldCA9IHNkaGNpX2FyYXNhbl9yZXNldCwKIAkuc2V0X3Voc19zaWduYWxpbmcgPSBzZGhjaV9zZXRfdWhzX3NpZ25hbGluZywKIH07CiAKQEAgLTIzOSwxMyArMzAxLDE0IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICghSVNfRVJSKHNkaGNpX2FyYXNhbi0+cGh5KSkgeworCWlmICghSVNfRVJSKHNkaGNpX2FyYXNhbi0+cGh5KSAmJiBzZGhjaV9hcmFzYW4tPmlzX3BoeV9vbikgewogCQlyZXQgPSBwaHlfcG93ZXJfb2ZmKHNkaGNpX2FyYXNhbi0+cGh5KTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycihkZXYsICJDYW5ub3QgcG93ZXIgb2ZmIHBoeS5cbiIpOwogCQkJc2RoY2lfcmVzdW1lX2hvc3QoaG9zdCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CisJCXNkaGNpX2FyYXNhbi0+aXNfcGh5X29uID0gZmFsc2U7CiAJfQogCiAJY2xrX2Rpc2FibGUocGx0Zm1faG9zdC0+Y2xrKTsKQEAgLTI4MSwxMiArMzQ0LDEzIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKCFJU19FUlIoc2RoY2lfYXJhc2FuLT5waHkpKSB7CisJaWYgKCFJU19FUlIoc2RoY2lfYXJhc2FuLT5waHkpICYmIGhvc3QtPm1tYy0+YWN0dWFsX2Nsb2NrKSB7CiAJCXJldCA9IHBoeV9wb3dlcl9vbihzZGhjaV9hcmFzYW4tPnBoeSk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHBvd2VyIG9uIHBoeS5cbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQorCQlzZGhjaV9hcmFzYW4tPmlzX3BoeV9vbiA9IHRydWU7CiAJfQogCiAJcmV0dXJuIHNkaGNpX3Jlc3VtZV9ob3N0KGhvc3QpOwpAQCAtMzM4LDYgKzQwMiw0NSBAQAogfTsKIAogLyoqCisgKiBzZGhjaV9hcmFzYW5fdXBkYXRlX2Nsb2NrbXVsdGlwbGllciAtIFNldCBjb3JlY2ZnX2Nsb2NrbXVsdGlwbGllcgorICoKKyAqIFRoZSBjb3JlY2ZnX2Nsb2NrbXVsdGlwbGllciBpcyBzdXBwb3NlZCB0byBjb250YWluIGNsb2NrIG11bHRpcGxpZXIKKyAqIHZhbHVlIG9mIHByb2dyYW1tYWJsZSBjbG9jayBnZW5lcmF0b3IuCisgKgorICogTk9URVM6CisgKiAtIE1hbnkgZXhpc3RpbmcgZGV2aWNlcyBkb24ndCBzZWVtIHRvIGRvIHRoaXMgYW5kIHdvcmsgZmluZS4gIFRvIGtlZXAKKyAqICAgY29tcGF0aWJpbGl0eSBmb3Igb2xkIGhhcmR3YXJlIHdoZXJlIHRoZSBkZXZpY2UgdHJlZSBkb2Vzbid0IHByb3ZpZGUgYQorICogICByZWdpc3RlciBtYXAsIHRoaXMgZnVuY3Rpb24gaXMgYSBub29wIGlmIGEgc29jX2N0bF9tYXAgaGFzbid0IGJlZW4gcHJvdmlkZWQKKyAqICAgZm9yIHRoaXMgcGxhdGZvcm0uCisgKiAtIFRoZSB2YWx1ZSBvZiBjb3JlY2ZnX2Nsb2NrbXVsdGlwbGllciBzaG91bGQgc3luYyB3aXRoIHRoYXQgb2YgY29ycmVzcG9uZGluZworICogICB2YWx1ZSByZWFkaW5nIGZyb20gc2RoY2lfY2FwYWJpbGl0eV9yZWdpc3Rlci4gU28gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqICAgb25jZSBhdCBwcm9iZSB0aW1lIGFuZCBuZXZlciBjYWxsZWQgYWdhaW4uCisgKgorICogQGhvc3Q6CQlUaGUgc2RoY2lfaG9zdAorICovCitzdGF0aWMgdm9pZCBzZGhjaV9hcmFzYW5fdXBkYXRlX2Nsb2NrbXVsdGlwbGllcihzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKKwkJCQkJCXUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJc3RydWN0IHNkaGNpX2FyYXNhbl9kYXRhICpzZGhjaV9hcmFzYW4gPSBzZGhjaV9wbHRmbV9wcml2KHBsdGZtX2hvc3QpOworCWNvbnN0IHN0cnVjdCBzZGhjaV9hcmFzYW5fc29jX2N0bF9tYXAgKnNvY19jdGxfbWFwID0KKwkJc2RoY2lfYXJhc2FuLT5zb2NfY3RsX21hcDsKKworCS8qIEhhdmluZyBhIG1hcCBpcyBvcHRpb25hbCAqLworCWlmICghc29jX2N0bF9tYXApCisJCXJldHVybjsKKworCS8qIElmIHdlIGhhdmUgYSBtYXAsIHdlIGV4cGVjdCB0byBoYXZlIGEgc3lzY29uICovCisJaWYgKCFzZGhjaV9hcmFzYW4tPnNvY19jdGxfYmFzZSkgeworCQlwcl93YXJuKCIlczogSGF2ZSByZWdtYXAsIGJ1dCBubyBzb2MtY3RsLXN5c2NvblxuIiwKKwkJCW1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKKwkJcmV0dXJuOworCX0KKworCXNkaGNpX2FyYXNhbl9zeXNjb25fd3JpdGUoaG9zdCwgJnNvY19jdGxfbWFwLT5jbG9ja211bHRpcGxpZXIsIHZhbHVlKTsKK30KKworLyoqCiAgKiBzZGhjaV9hcmFzYW5fdXBkYXRlX2Jhc2VjbGtmcmVxIC0gU2V0IGNvcmVjZmdfYmFzZWNsa2ZyZXEKICAqCiAgKiBUaGUgY29yZWNmZ19iYXNlY2xrZnJlcSBpcyBzdXBwb3NlZCB0byBjb250YWluIHRoZSBNSHogb2YgY2xrX3hpbi4gIFRoaXMKQEAgLTQ2Miw2ICs1NjUsNyBAQAogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0OwogCXN0cnVjdCBzZGhjaV9hcmFzYW5fZGF0YSAqc2RoY2lfYXJhc2FuOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAogCWhvc3QgPSBzZGhjaV9wbHRmbV9pbml0KHBkZXYsICZzZGhjaV9hcmFzYW5fcGRhdGEsCiAJCQkJc2l6ZW9mKCpzZGhjaV9hcmFzYW4pKTsKQEAgLTUxNiw4ICs2MjAsMTYgQEAKIAl9CiAKIAlzZGhjaV9nZXRfb2ZfcHJvcGVydHkocGRldik7CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAieGxueCxmYWlscy13aXRob3V0LXRlc3QtY2QiKSkKKwkJc2RoY2lfYXJhc2FuLT5xdWlya3MgfD0gU0RIQ0lfQVJBU0FOX1FVSVJLX0ZPUkNFX0NEVEVTVDsKKwogCXBsdGZtX2hvc3QtPmNsayA9IGNsa194aW47CiAKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJICAgICJyb2NrY2hpcCxyazMzOTktc2RoY2ktNS4xIikpCisJCXNkaGNpX2FyYXNhbl91cGRhdGVfY2xvY2ttdWx0aXBsaWVyKGhvc3QsIDB4MCk7CisKIAlzZGhjaV9hcmFzYW5fdXBkYXRlX2Jhc2VjbGtmcmVxKGhvc3QpOwogCiAJcmV0ID0gc2RoY2lfYXJhc2FuX3JlZ2lzdGVyX3NkY2xrKHNkaGNpX2FyYXNhbiwgY2xrX3hpbiwgJnBkZXYtPmRldik7CkBAIC01NDcsMTIgKzY1OSw2IEBACiAJCQlnb3RvIHVucmVnX2NsazsKIAkJfQogCi0JCXJldCA9IHBoeV9wb3dlcl9vbihzZGhjaV9hcmFzYW4tPnBoeSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwaHlfcG93ZXJfb24gZXJyLlxuIik7Ci0JCQlnb3RvIGVycl9waHlfcG93ZXI7Ci0JCX0KLQogCQlob3N0LT5tbWNfaG9zdF9vcHMuaHM0MDBfZW5oYW5jZWRfc3Ryb2JlID0KIAkJCQkJc2RoY2lfYXJhc2FuX2hzNDAwX2VuaGFuY2VkX3N0cm9iZTsKIAl9CkBAIC01NjUsOSArNjcxLDYgQEAKIAogZXJyX2FkZF9ob3N0OgogCWlmICghSVNfRVJSKHNkaGNpX2FyYXNhbi0+cGh5KSkKLQkJcGh5X3Bvd2VyX29mZihzZGhjaV9hcmFzYW4tPnBoeSk7Ci1lcnJfcGh5X3Bvd2VyOgotCWlmICghSVNfRVJSKHNkaGNpX2FyYXNhbi0+cGh5KSkKIAkJcGh5X2V4aXQoc2RoY2lfYXJhc2FuLT5waHkpOwogdW5yZWdfY2xrOgogCXNkaGNpX2FyYXNhbl91bnJlZ2lzdGVyX3NkY2xrKCZwZGV2LT5kZXYpOwpAQCAtNTg5LDcgKzY5Miw4IEBACiAJc3RydWN0IGNsayAqY2xrX2FoYiA9IHNkaGNpX2FyYXNhbi0+Y2xrX2FoYjsKIAogCWlmICghSVNfRVJSKHNkaGNpX2FyYXNhbi0+cGh5KSkgewotCQlwaHlfcG93ZXJfb2ZmKHNkaGNpX2FyYXNhbi0+cGh5KTsKKwkJaWYgKHNkaGNpX2FyYXNhbi0+aXNfcGh5X29uKQorCQkJcGh5X3Bvd2VyX29mZihzZGhjaV9hcmFzYW4tPnBoeSk7CiAJCXBoeV9leGl0KHNkaGNpX2FyYXNhbi0+cGh5KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYwppbmRleCAyMzliZTJmLi5mYjcxYzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWVzZGhjLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1lc2RoYy5jCkBAIC01ODMsNyArNTgzLDcgQEAKIAogCW5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAibGl0dGxlLWVuZGlhbiIsIE5VTEwpKQorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJsaXR0bGUtZW5kaWFuIikpCiAJCWhvc3QgPSBzZGhjaV9wbHRmbV9pbml0KHBkZXYsICZzZGhjaV9lc2RoY19sZV9wZGF0YSwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBzZGhjaV9lc2RoYykpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLWNvcmUuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLWNvcmUuYwppbmRleCA4OTdjZmQyLi43MmExZjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS1jb3JlLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2ktY29yZS5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIAlpZiAoIWdwaW9faXNfdmFsaWQoZ3BpbykpCiAJCXJldHVybjsKIAotCWVyciA9IGdwaW9fcmVxdWVzdChncGlvLCAic2RfY2QiKTsKKwllcnIgPSBkZXZtX2dwaW9fcmVxdWVzdCgmc2xvdC0+Y2hpcC0+cGRldi0+ZGV2LCBncGlvLCAic2RfY2QiKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXQ7CiAKQEAgLTE3OSw3ICsxNzksNyBAQAogCXJldHVybjsKIAogb3V0X2ZyZWU6Ci0JZ3Bpb19mcmVlKGdwaW8pOworCWRldm1fZ3Bpb19mcmVlKCZzbG90LT5jaGlwLT5wZGV2LT5kZXYsIGdwaW8pOwogb3V0OgogCWRldl93YXJuKCZzbG90LT5jaGlwLT5wZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0dXAgY2FyZCBkZXRlY3Qgd2FrZSB1cFxuIik7CiB9CkBAIC0xODgsOCArMTg4LDYgQEAKIHsKIAlpZiAoc2xvdC0+Y2RfaXJxID49IDApCiAJCWZyZWVfaXJxKHNsb3QtPmNkX2lycSwgc2xvdCk7Ci0JaWYgKGdwaW9faXNfdmFsaWQoc2xvdC0+Y2RfZ3BpbykpCi0JCWdwaW9fZnJlZShzbG90LT5jZF9ncGlvKTsKIH0KIAogI2Vsc2UKQEAgLTM1Niw2ICszNTQsNyBAQAogewogCXNsb3QtPmhvc3QtPm1tYy0+Y2FwcyB8PSBNTUNfQ0FQXzhfQklUX0RBVEEgfCBNTUNfQ0FQX05PTlJFTU9WQUJMRSB8CiAJCQkJIE1NQ19DQVBfSFdfUkVTRVQgfCBNTUNfQ0FQXzFfOFZfRERSIHwKKwkJCQkgTU1DX0NBUF9DTURfRFVSSU5HX1RGUiB8CiAJCQkJIE1NQ19DQVBfV0FJVF9XSElMRV9CVVNZOwogCXNsb3QtPmhvc3QtPm1tYy0+Y2FwczIgfD0gTU1DX0NBUDJfSENfRVJBU0VfU1o7CiAJc2xvdC0+aHdfcmVzZXQgPSBzZGhjaV9wY2lfaW50X2h3X3Jlc2V0OwpAQCAtNDIxLDE3ICs0MjAsMzAgQEAKIC8qIERlZmluZSBIb3N0IGNvbnRyb2xsZXJzIGZvciBJbnRlbCBNZXJyaWZpZWxkIHBsYXRmb3JtICovCiAjZGVmaW5lIElOVEVMX01SRkxEX0VNTUNfMAkwCiAjZGVmaW5lIElOVEVMX01SRkxEX0VNTUNfMQkxCisjZGVmaW5lIElOVEVMX01SRkxEX1NECQkyCisjZGVmaW5lIElOVEVMX01SRkxEX1NESU8JMwogCiBzdGF0aWMgaW50IGludGVsX21yZmxkX21tY19wcm9iZV9zbG90KHN0cnVjdCBzZGhjaV9wY2lfc2xvdCAqc2xvdCkKIHsKLQlpZiAoKFBDSV9GVU5DKHNsb3QtPmNoaXAtPnBkZXYtPmRldmZuKSAhPSBJTlRFTF9NUkZMRF9FTU1DXzApICYmCi0JICAgIChQQ0lfRlVOQyhzbG90LT5jaGlwLT5wZGV2LT5kZXZmbikgIT0gSU5URUxfTVJGTERfRU1NQ18xKSkKLQkJLyogU0Qgc3VwcG9ydCBpcyBub3QgcmVhZHkgeWV0ICovCisJdW5zaWduZWQgaW50IGZ1bmMgPSBQQ0lfRlVOQyhzbG90LT5jaGlwLT5wZGV2LT5kZXZmbik7CisKKwlzd2l0Y2ggKGZ1bmMpIHsKKwljYXNlIElOVEVMX01SRkxEX0VNTUNfMDoKKwljYXNlIElOVEVMX01SRkxEX0VNTUNfMToKKwkJc2xvdC0+aG9zdC0+bW1jLT5jYXBzIHw9IE1NQ19DQVBfTk9OUkVNT1ZBQkxFIHwKKwkJCQkJIE1NQ19DQVBfOF9CSVRfREFUQSB8CisJCQkJCSBNTUNfQ0FQXzFfOFZfRERSOworCQlicmVhazsKKwljYXNlIElOVEVMX01SRkxEX1NEOgorCQlzbG90LT5ob3N0LT5xdWlya3MyIHw9IFNESENJX1FVSVJLMl9OT18xXzhfVjsKKwkJYnJlYWs7CisJY2FzZSBJTlRFTF9NUkZMRF9TRElPOgorCQlzbG90LT5ob3N0LT5tbWMtPmNhcHMgfD0gTU1DX0NBUF9OT05SRU1PVkFCTEUgfAorCQkJCQkgTU1DX0NBUF9QT1dFUl9PRkZfQ0FSRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlzbG90LT5ob3N0LT5tbWMtPmNhcHMgfD0gTU1DX0NBUF84X0JJVF9EQVRBIHwgTU1DX0NBUF9OT05SRU1PVkFCTEUgfAotCQkJCSBNTUNfQ0FQXzFfOFZfRERSOwotCisJfQogCXJldHVybiAwOwogfQogCkBAIC0xNjE1LDcgKzE2MjcsNiBAQAogCiAJc2xvdC0+Y2hpcCA9IGNoaXA7CiAJc2xvdC0+aG9zdCA9IGhvc3Q7Ci0Jc2xvdC0+cGNpX2JhciA9IGJhcjsKIAlzbG90LT5yc3Rfbl9ncGlvID0gLUVJTlZBTDsKIAlzbG90LT5jZF9ncGlvID0gLUVJTlZBTDsKIAlzbG90LT5jZF9pZHggPSAtMTsKQEAgLTE2NDMsMjcgKzE2NTQsMjIgQEAKIAogCWhvc3QtPmlycSA9IHBkZXYtPmlycTsKIAotCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCBiYXIsIG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKKwlyZXQgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgQklUKGJhciksIG1tY19ob3N0bmFtZShob3N0LT5tbWMpKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCByZXF1ZXN0IHJlZ2lvblxuIik7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQlob3N0LT5pb2FkZHIgPSBwY2lfaW9yZW1hcF9iYXIocGRldiwgYmFyKTsKLQlpZiAoIWhvc3QtPmlvYWRkcikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVtYXAgcmVnaXN0ZXJzXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byByZWxlYXNlOwotCX0KKwlob3N0LT5pb2FkZHIgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpW2Jhcl07CiAKIAlpZiAoY2hpcC0+Zml4ZXMgJiYgY2hpcC0+Zml4ZXMtPnByb2JlX3Nsb3QpIHsKIAkJcmV0ID0gY2hpcC0+Zml4ZXMtPnByb2JlX3Nsb3Qoc2xvdCk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIHVubWFwOworCQkJZ290byBjbGVhbnVwOwogCX0KIAogCWlmIChncGlvX2lzX3ZhbGlkKHNsb3QtPnJzdF9uX2dwaW8pKSB7Ci0JCWlmICghZ3Bpb19yZXF1ZXN0KHNsb3QtPnJzdF9uX2dwaW8sICJlTU1DX3Jlc2V0IikpIHsKKwkJaWYgKCFkZXZtX2dwaW9fcmVxdWVzdCgmcGRldi0+ZGV2LCBzbG90LT5yc3Rfbl9ncGlvLCAiZU1NQ19yZXNldCIpKSB7CiAJCQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoc2xvdC0+cnN0X25fZ3BpbywgMSk7CiAJCQlzbG90LT5ob3N0LT5tbWMtPmNhcHMgfD0gTU1DX0NBUF9IV19SRVNFVDsKIAkJCXNsb3QtPmh3X3Jlc2V0ID0gc2RoY2lfcGNpX2dwaW9faHdfcmVzZXQ7CkBAIC0xNzAyLDE4ICsxNzA4LDkgQEAKIAlyZXR1cm4gc2xvdDsKIAogcmVtb3ZlOgotCWlmIChncGlvX2lzX3ZhbGlkKHNsb3QtPnJzdF9uX2dwaW8pKQotCQlncGlvX2ZyZWUoc2xvdC0+cnN0X25fZ3Bpbyk7Ci0KIAlpZiAoY2hpcC0+Zml4ZXMgJiYgY2hpcC0+Zml4ZXMtPnJlbW92ZV9zbG90KQogCQljaGlwLT5maXhlcy0+cmVtb3ZlX3Nsb3Qoc2xvdCwgMCk7CiAKLXVubWFwOgotCWlvdW5tYXAoaG9zdC0+aW9hZGRyKTsKLQotcmVsZWFzZToKLQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgYmFyKTsKLQogY2xlYW51cDoKIAlpZiAoc2xvdC0+ZGF0YSAmJiBzbG90LT5kYXRhLT5jbGVhbnVwKQogCQlzbG90LT5kYXRhLT5jbGVhbnVwKHNsb3QtPmRhdGEpOwpAQCAtMTczOCwxNyArMTczNSwxMiBAQAogCiAJc2RoY2lfcmVtb3ZlX2hvc3Qoc2xvdC0+aG9zdCwgZGVhZCk7CiAKLQlpZiAoZ3Bpb19pc192YWxpZChzbG90LT5yc3Rfbl9ncGlvKSkKLQkJZ3Bpb19mcmVlKHNsb3QtPnJzdF9uX2dwaW8pOwotCiAJaWYgKHNsb3QtPmNoaXAtPmZpeGVzICYmIHNsb3QtPmNoaXAtPmZpeGVzLT5yZW1vdmVfc2xvdCkKIAkJc2xvdC0+Y2hpcC0+Zml4ZXMtPnJlbW92ZV9zbG90KHNsb3QsIGRlYWQpOwogCiAJaWYgKHNsb3QtPmRhdGEgJiYgc2xvdC0+ZGF0YS0+Y2xlYW51cCkKIAkJc2xvdC0+ZGF0YS0+Y2xlYW51cChzbG90LT5kYXRhKTsKIAotCXBjaV9yZWxlYXNlX3JlZ2lvbihzbG90LT5jaGlwLT5wZGV2LCBzbG90LT5wY2lfYmFyKTsKLQogCXNkaGNpX2ZyZWVfaG9zdChzbG90LT5ob3N0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuaCBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmgKaW5kZXggN2UwNzg4Ny4uOWM3YzA4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5oCkBAIC03Miw3ICs3Miw2IEBACiAJc3RydWN0IHNkaGNpX2hvc3QJKmhvc3Q7CiAJc3RydWN0IHNkaGNpX3BjaV9kYXRhCSpkYXRhOwogCi0JaW50CQkJcGNpX2JhcjsKIAlpbnQJCQlyc3Rfbl9ncGlvOwogCWludAkJCWNkX2dwaW87CiAJaW50CQkJY2RfaXJxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCmluZGV4IDFkMTdkY2YuLmFkNDliZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKQEAgLTE1NiwxMyArMTU2LDYgQEAKIAkJaG9zdC0+cXVpcmtzMiA9IHBkYXRhLT5xdWlya3MyOwogCX0KIAotCS8qCi0JICogU29tZSBwbGF0Zm9ybXMgbmVlZCB0byBwcm9iZSB0aGUgY29udHJvbGxlciB0byBiZSBhYmxlIHRvCi0JICogZGV0ZXJtaW5lIHdoaWNoIGNhcHMgc2hvdWxkIGJlIHVzZWQuCi0JICovCi0JaWYgKGhvc3QtPm9wcyAmJiBob3N0LT5vcHMtPnBsYXRmb3JtX2luaXQpCi0JCWhvc3QtPm9wcy0+cGxhdGZvcm1faW5pdChob3N0KTsKLQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhvc3QpOwogCiAJcmV0dXJuIGhvc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXN0LmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXN0LmMKaW5kZXggYzk1YmE4My4uZWQ5MmNlNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktc3QuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXN0LmMKQEAgLTI4LDYgKzI4LDcgQEAKIAogc3RydWN0IHN0X21tY19wbGF0Zm9ybV9kYXRhIHsKIAlzdHJ1Y3QgIHJlc2V0X2NvbnRyb2wgKnJzdGM7CisJc3RydWN0ICBjbGsgKmljbmNsazsKIAl2b2lkIF9faW9tZW0gKnRvcF9pb2FkZHI7CiB9OwogCkBAIC0zNTMsNyArMzU0LDcgQEAKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAlzdHJ1Y3Qgc3RfbW1jX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0OwotCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrICpjbGssICppY25jbGs7CiAJaW50IHJldCA9IDA7CiAJdTE2IGhvc3RfdmVyc2lvbjsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTM2NSw2ICszNjYsMTEgQEAKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAl9CiAKKwkvKiBJQ04gY2xvY2sgaXNuJ3QgY29tcHVsc29yeSwgYnV0IHVzZSBpdCBpZiBpdCdzIHByb3ZpZGVkLiAqLworCWljbmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiaWNuIik7CisJaWYgKElTX0VSUihpY25jbGspKQorCQlpY25jbGsgPSBOVUxMOworCiAJcnN0YyA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihyc3RjKSkKIAkJcnN0YyA9IE5VTEw7CkBAIC0zODksNiArMzk1LDcgQEAKIAl9CiAKIAljbGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKKwljbGtfcHJlcGFyZV9lbmFibGUoaWNuY2xrKTsKIAogCS8qIENvbmZpZ3VyZSB0aGUgRmxhc2hTUyBUb3AgcmVnaXN0ZXJzIGZvciBzZXR0aW5nIGVNTUMgVFgvUlggZGVsYXkgKi8KIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLApAQCAtNDAwLDYgKzQwNyw3IEBACiAJfQogCiAJcGx0Zm1faG9zdC0+Y2xrID0gY2xrOworCXBkYXRhLT5pY25jbGsgPSBpY25jbGs7CiAKIAkvKiBDb25maWd1cmUgdGhlIEFyYXNhbiBIQyBpbnNpZGUgdGhlIGZsYXNoU1MgKi8KIAlzdF9tbWNzc19jY29uZmlnKG5wLCBob3N0KTsKQEAgLTQyMiw2ICs0MzAsNyBAQAogCXJldHVybiAwOwogCiBlcnJfb3V0OgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShpY25jbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShjbGspOwogZXJyX29mOgogCXNkaGNpX3BsdGZtX2ZyZWUocGRldik7CkBAIC00NDIsNiArNDUxLDggQEAKIAogCXJldCA9IHNkaGNpX3BsdGZtX3VucmVnaXN0ZXIocGRldik7CiAKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocGRhdGEtPmljbmNsayk7CisKIAlpZiAocnN0YykKIAkJcmVzZXRfY29udHJvbF9hc3NlcnQocnN0Yyk7CiAKQEAgLTQ2Miw2ICs0NzMsNyBAQAogCWlmIChwZGF0YS0+cnN0YykKIAkJcmVzZXRfY29udHJvbF9hc3NlcnQocGRhdGEtPnJzdGMpOwogCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBkYXRhLT5pY25jbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShwbHRmbV9ob3N0LT5jbGspOwogb3V0OgogCXJldHVybiByZXQ7CkBAIC00NzUsNiArNDg3LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwogCiAJY2xrX3ByZXBhcmVfZW5hYmxlKHBsdGZtX2hvc3QtPmNsayk7CisJY2xrX3ByZXBhcmVfZW5hYmxlKHBkYXRhLT5pY25jbGspOwogCiAJaWYgKHBkYXRhLT5yc3RjKQogCQlyZXNldF9jb250cm9sX2RlYXNzZXJ0KHBkYXRhLT5yc3RjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYwppbmRleCAxZTkzZGM0Li4yMGI2ZmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jCkBAIC0zOTEsNiArMzkxLDMxIEBACiAJLnBkYXRhID0gJnNkaGNpX3RlZ3JhMTE0X3BkYXRhLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX3RlZ3JhMTI0X3BkYXRhID0geworCS5xdWlya3MgPSBTREhDSV9RVUlSS19CUk9LRU5fVElNRU9VVF9WQUwgfAorCQkgIFNESENJX1FVSVJLX0RBVEFfVElNRU9VVF9VU0VTX1NEQ0xLIHwKKwkJICBTREhDSV9RVUlSS19TSU5HTEVfUE9XRVJfV1JJVEUgfAorCQkgIFNESENJX1FVSVJLX05PX0hJU1BEX0JJVCB8CisJCSAgU0RIQ0lfUVVJUktfQlJPS0VOX0FETUFfWkVST0xFTl9ERVNDIHwKKwkJICBTREhDSV9RVUlSS19DQVBfQ0xPQ0tfQkFTRV9CUk9LRU4sCisJLnF1aXJrczIgPSBTREhDSV9RVUlSSzJfUFJFU0VUX1ZBTFVFX0JST0tFTiB8CisJCSAgIC8qCisJCSAgICAqIFRoZSBUUk0gc3RhdGVzIHRoYXQgdGhlIFNEL01NQyBjb250cm9sbGVyIGZvdW5kIG9uCisJCSAgICAqIFRlZ3JhMTI0IGNhbiBhZGRyZXNzIDM0IGJpdHMgKHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBieQorCQkgICAgKiB0aGUgVGVncmEgbWVtb3J5IGNvbnRyb2xsZXIpLCBidXQgdGVzdHMgc2hvdyB0aGF0IERNQQorCQkgICAgKiB0byBvciBmcm9tIGFib3ZlIDQgR2lCIGRvZXNuJ3Qgd29yay4gVGhpcyBpcyBwb3NzaWJseQorCQkgICAgKiBjYXVzZWQgYnkgbWlzc2luZyBwcm9ncmFtbWluZywgdGhvdWdoIGl0J3Mgbm90IG9idmlvdXMKKwkJICAgICogd2hhdCBzZXF1ZW5jZSBpcyByZXF1aXJlZC4gTWFyayA2NC1iaXQgRE1BIGJyb2tlbiBmb3IKKwkJICAgICogbm93IHRvIGZpeCB0aGlzIGZvciBleGlzdGluZyB1c2VycyAoZS5nLiBOeWFuIGJvYXJkcykuCisJCSAgICAqLworCQkgICBTREhDSV9RVUlSSzJfQlJPS0VOXzY0X0JJVF9ETUEsCisJLm9wcyAgPSAmdGVncmExMTRfc2RoY2lfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV90ZWdyYV9zb2NfZGF0YSBzb2NfZGF0YV90ZWdyYTEyNCA9IHsKKwkucGRhdGEgPSAmc2RoY2lfdGVncmExMjRfcGRhdGEsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgc2RoY2lfdGVncmEyMTBfcGRhdGEgPSB7CiAJLnF1aXJrcyA9IFNESENJX1FVSVJLX0JST0tFTl9USU1FT1VUX1ZBTCB8CiAJCSAgU0RIQ0lfUVVJUktfREFUQV9USU1FT1VUX1VTRVNfU0RDTEsgfApAQCAtNDA4LDcgKzQzMyw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNkaGNpX3RlZ3JhX2R0X21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMTAtc2RoY2kiLCAuZGF0YSA9ICZzb2NfZGF0YV90ZWdyYTIxMCB9LAotCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTI0LXNkaGNpIiwgLmRhdGEgPSAmc29jX2RhdGFfdGVncmExMTQgfSwKKwl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTEyNC1zZGhjaSIsIC5kYXRhID0gJnNvY19kYXRhX3RlZ3JhMTI0IH0sCiAJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMTQtc2RoY2kiLCAuZGF0YSA9ICZzb2NfZGF0YV90ZWdyYTExNCB9LAogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtc2RoY2kiLCAuZGF0YSA9ICZzb2NfZGF0YV90ZWdyYTMwIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1zZGhjaSIsIC5kYXRhID0gJnNvY19kYXRhX3RlZ3JhMjAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYwppbmRleCBjZDY1ZDQ3Li40ODA1NTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCkBAIC04ODgsNyArODg4LDggQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBzZGhjaV9hdXRvX2NtZDEyKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LAogCQkJCSAgICBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKIHsKLQlyZXR1cm4gIW1ycS0+c2JjICYmIChob3N0LT5mbGFncyAmIFNESENJX0FVVE9fQ01EMTIpOworCXJldHVybiAhbXJxLT5zYmMgJiYgKGhvc3QtPmZsYWdzICYgU0RIQ0lfQVVUT19DTUQxMikgJiYKKwkgICAgICAgIW1ycS0+Y2FwX2NtZF9kdXJpbmdfdGZyOwogfQogCiBzdGF0aWMgdm9pZCBzZGhjaV9zZXRfdHJhbnNmZXJfbW9kZShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKQEAgLTEwMzEsOSArMTAzMiwxOCBAQAogCQkJc2RoY2lfZG9fcmVzZXQoaG9zdCwgU0RIQ0lfUkVTRVRfREFUQSk7CiAJCX0KIAotCQkvKiBBdm9pZCB0cmlnZ2VyaW5nIHdhcm5pbmcgaW4gc2RoY2lfc2VuZF9jb21tYW5kKCkgKi8KLQkJaG9zdC0+Y21kID0gTlVMTDsKLQkJc2RoY2lfc2VuZF9jb21tYW5kKGhvc3QsIGRhdGEtPnN0b3ApOworCQkvKgorCQkgKiAnY2FwX2NtZF9kdXJpbmdfdGZyJyByZXF1ZXN0IG11c3Qgbm90IHVzZSB0aGUgY29tbWFuZCBsaW5lCisJCSAqIGFmdGVyIG1tY19jb21tYW5kX2RvbmUoKSBoYXMgYmVlbiBjYWxsZWQuIEl0IGlzIHVwcGVyIGxheWVyJ3MKKwkJICogcmVzcG9uc2liaWxpdHkgdG8gc2VuZCB0aGUgc3RvcCBjb21tYW5kIGlmIHJlcXVpcmVkLgorCQkgKi8KKwkJaWYgKGRhdGEtPm1ycS0+Y2FwX2NtZF9kdXJpbmdfdGZyKSB7CisJCQlzZGhjaV9maW5pc2hfbXJxKGhvc3QsIGRhdGEtPm1ycSk7CisJCX0gZWxzZSB7CisJCQkvKiBBdm9pZCB0cmlnZ2VyaW5nIHdhcm5pbmcgaW4gc2RoY2lfc2VuZF9jb21tYW5kKCkgKi8KKwkJCWhvc3QtPmNtZCA9IE5VTEw7CisJCQlzZGhjaV9zZW5kX2NvbW1hbmQoaG9zdCwgZGF0YS0+c3RvcCk7CisJCX0KIAl9IGVsc2UgewogCQlzZGhjaV9maW5pc2hfbXJxKGhvc3QsIGRhdGEtPm1ycSk7CiAJfQpAQCAtMTE2NSw2ICsxMTc1LDkgQEAKIAkJfQogCX0KIAorCWlmIChjbWQtPm1ycS0+Y2FwX2NtZF9kdXJpbmdfdGZyICYmIGNtZCA9PSBjbWQtPm1ycS0+Y21kKQorCQltbWNfY29tbWFuZF9kb25lKGhvc3QtPm1tYywgY21kLT5tcnEpOworCiAJLyoKIAkgKiBUaGUgaG9zdCBjYW4gc2VuZCBhbmQgaW50ZXJydXB0IHdoZW4gdGhlIGJ1c3kgc3RhdGUgaGFzCiAJICogZW5kZWQsIGFsbG93aW5nIHVzIHRvIHdhaXQgd2l0aG91dCB3YXN0aW5nIENQVSBjeWNsZXMuCkBAIC0yMDYyLDcgKzIwNzUsNyBAQAogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAkJLyogV2FpdCBmb3IgQnVmZmVyIFJlYWQgUmVhZHkgaW50ZXJydXB0ICovCi0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGhvc3QtPmJ1Zl9yZWFkeV9pbnQsCisJCXdhaXRfZXZlbnRfdGltZW91dChob3N0LT5idWZfcmVhZHlfaW50LAogCQkJCQkoaG9zdC0+dHVuaW5nX2RvbmUgPT0gMSksCiAJCQkJCW1zZWNzX3RvX2ppZmZpZXMoNTApKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaCBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaAppbmRleCAwNDExYzlmLi5jNzIyY2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCkBAIC04NCw2ICs4NCw4IEBACiAjZGVmaW5lICAgU0RIQ0lfQ1RSTF9BRE1BMzIJMHgxMAogI2RlZmluZSAgIFNESENJX0NUUkxfQURNQTY0CTB4MTgKICNkZWZpbmUgICBTREhDSV9DVFJMXzhCSVRCVVMJMHgyMAorI2RlZmluZSAgU0RIQ0lfQ1RSTF9DRFRFU1RfSU5TCTB4NDAKKyNkZWZpbmUgIFNESENJX0NUUkxfQ0RURVNUX0VOCTB4ODAKIAogI2RlZmluZSBTREhDSV9QT1dFUl9DT05UUk9MCTB4MjkKICNkZWZpbmUgIFNESENJX1BPV0VSX09OCQkweDAxCkBAIC01NTUsNyArNTU3LDYgQEAKIAl2b2lkCSgqc2V0X3Voc19zaWduYWxpbmcpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1bnNpZ25lZCBpbnQgdWhzKTsKIAl2b2lkCSgqaHdfcmVzZXQpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KTsKIAl2b2lkICAgICgqYWRtYV93b3JrYXJvdW5kKShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdTMyIGludG1hc2spOwotCXZvaWQJKCpwbGF0Zm9ybV9pbml0KShzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CiAJdm9pZCAgICAoKmNhcmRfZXZlbnQpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KTsKIAl2b2lkCSgqdm9sdGFnZV9zd2l0Y2gpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KTsKIAlpbnQJKCpzZWxlY3RfZHJpdmVfc3RyZW5ndGgpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zaF9tb2JpbGVfc2RoaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zaF9tb2JpbGVfc2RoaS5jCmluZGV4IGMzYjY1MWIuLjQ5ZWRmZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW9iaWxlX3NkaGkuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NoX21vYmlsZV9zZGhpLmMKQEAgLTk0LDYgKzk0LDcgQEAKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsc2RoaS1yOGE3NzkzIiwgLmRhdGEgPSAmb2ZfcmNhcl9nZW4yX2NvbXBhdGlibGUsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHNkaGktcjhhNzc5NCIsIC5kYXRhID0gJm9mX3JjYXJfZ2VuMl9jb21wYXRpYmxlLCB9LAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzZGhpLXI4YTc3OTUiLCAuZGF0YSA9ICZvZl9yY2FyX2dlbjNfY29tcGF0aWJsZSwgfSwKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsc2RoaS1yOGE3Nzk2IiwgLmRhdGEgPSAmb2ZfcmNhcl9nZW4zX2NvbXBhdGlibGUsIH0sCiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2hfbW9iaWxlX3NkaGlfb2ZfbWF0Y2gpOwpAQCAtMjEzLDYgKzIxNCwxMyBAQAogCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGspOwogfQogCitzdGF0aWMgaW50IHNoX21vYmlsZV9zZGhpX2NhcmRfYnVzeShzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKK3sKKwlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7CisKKwlyZXR1cm4gIShzZF9jdHJsX3JlYWQxNl9hbmRfMTZfYXNfMzIoaG9zdCwgQ1RMX1NUQVRVUykgJiBUTUlPX1NUQVRfREFUMCk7Cit9CisKIHN0YXRpYyBpbnQgc2hfbW9iaWxlX3NkaGlfc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoKHN0cnVjdCBtbWNfaG9zdCAqbW1jLAogCQkJCQkJICAgICAgc3RydWN0IG1tY19pb3MgKmlvcykKIHsKQEAgLTM2OSw3ICszNzcsMTQgQEAKIAlob3N0LT5jbGtfdXBkYXRlCT0gc2hfbW9iaWxlX3NkaGlfY2xrX3VwZGF0ZTsKIAlob3N0LT5jbGtfZGlzYWJsZQk9IHNoX21vYmlsZV9zZGhpX2Nsa19kaXNhYmxlOwogCWhvc3QtPm11bHRpX2lvX3F1aXJrCT0gc2hfbW9iaWxlX3NkaGlfbXVsdGlfaW9fcXVpcms7Ci0JaG9zdC0+c3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoID0gc2hfbW9iaWxlX3NkaGlfc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoOworCisJLyogU0RSIHNwZWVkcyBhcmUgb25seSBhdmFpbGFibGUgb24gR2VuMisgKi8KKwlpZiAobW1jX2RhdGEtPmZsYWdzICYgVE1JT19NTUNfTUlOX1JDQVIyKSB7CisJCS8qIGNhcmRfYnVzeSBjYXVzZWQgaXNzdWVzIG9uIHI4YTczYTQgKHByZS1HZW4yKSBDRC1sZXNzIFNESEkgKi8KKwkJaG9zdC0+Y2FyZF9idXN5CT0gc2hfbW9iaWxlX3NkaGlfY2FyZF9idXN5OworCQlob3N0LT5zdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2ggPQorCQkJc2hfbW9iaWxlX3NkaGlfc3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoOworCX0KIAogCS8qIE9yZ2luYWxseSByZWdpc3RlcnMgd2VyZSAxNiBiaXQgYXBhcnQsIGNvdWxkIGJlIDMyIG9yIDY0IG5vd2FkYXlzICovCiAJaWYgKCFob3N0LT5idXNfc2hpZnQgJiYgcmVzb3VyY2Vfc2l6ZShyZXMpID4gMHgxMDApIC8qIG9sZCB3YXkgdG8gZGV0ZXJtaW5lIHRoZSBzaGlmdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zdW54aS1tbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc3VueGktbW1jLmMKaW5kZXggMmVlNGMyMS4uYzBhNWM2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zdW54aS1tbWMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3N1bnhpLW1tYy5jCkBAIC03Miw2ICs3MiwxMyBAQAogI2RlZmluZSBTRFhDX1JFR19DSERBCSgweDkwKQogI2RlZmluZSBTRFhDX1JFR19DQkRBCSgweDk0KQogCisvKiBOZXcgcmVnaXN0ZXJzIGludHJvZHVjZWQgaW4gQTY0ICovCisjZGVmaW5lIFNEWENfUkVHX0ExMkEJCTB4MDU4IC8qIFNNQyBBdXRvIENvbW1hbmQgMTIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0RYQ19SRUdfU0RfTlRTUgkweDA1QyAvKiBTTUMgTmV3IFRpbWluZyBTZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0RYQ19SRUdfRFJWX0RMCQkweDE0MCAvKiBEcml2ZSBEZWxheSBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNEWENfUkVHX1NBTVBfRExfUkVHCTB4MTQ0IC8qIFNNQyBzYW1wbGUgZGVsYXkgY29udHJvbCAqLworI2RlZmluZSBTRFhDX1JFR19EU19ETF9SRUcJMHgxNDggLyogU01DIGRhdGEgc3Ryb2JlIGRlbGF5IGNvbnRyb2wgKi8KKwogI2RlZmluZSBtbWNfcmVhZGwoaG9zdCwgcmVnKSBcCiAJcmVhZGwoKGhvc3QpLT5yZWdfYmFzZSArIFNEWENfIyNyZWcpCiAjZGVmaW5lIG1tY193cml0ZWwoaG9zdCwgcmVnLCB2YWx1ZSkgXApAQCAtMjE3LDIxICsyMjQsNDEgQEAKICNkZWZpbmUgU0RYQ19DTEtfNTBNX0REUgkzCiAjZGVmaW5lIFNEWENfQ0xLXzUwTV9ERFJfOEJJVAk0CiAKKyNkZWZpbmUgU0RYQ18yWF9USU1JTkdfTU9ERQlCSVQoMzEpCisKKyNkZWZpbmUgU0RYQ19DQUxfU1RBUlQJCUJJVCgxNSkKKyNkZWZpbmUgU0RYQ19DQUxfRE9ORQkJQklUKDE0KQorI2RlZmluZSBTRFhDX0NBTF9ETF9TSElGVAk4CisjZGVmaW5lIFNEWENfQ0FMX0RMX1NXX0VOCUJJVCg3KQorI2RlZmluZSBTRFhDX0NBTF9ETF9TV19TSElGVAkwCisjZGVmaW5lIFNEWENfQ0FMX0RMX01BU0sJMHgzZgorCisjZGVmaW5lIFNEWENfQ0FMX1RJTUVPVVQJMwkvKiBpbiBzZWNvbmRzLCAzcyBpcyBlbm91Z2gqLworCiBzdHJ1Y3Qgc3VueGlfbW1jX2Nsa19kZWxheSB7CiAJdTMyIG91dHB1dDsKIAl1MzIgc2FtcGxlOwogfTsKIAogc3RydWN0IHN1bnhpX2lkbWFfZGVzIHsKLQl1MzIJY29uZmlnOwotCXUzMglidWZfc2l6ZTsKLQl1MzIJYnVmX2FkZHJfcHRyMTsKLQl1MzIJYnVmX2FkZHJfcHRyMjsKKwlfX2xlMzIgY29uZmlnOworCV9fbGUzMiBidWZfc2l6ZTsKKwlfX2xlMzIgYnVmX2FkZHJfcHRyMTsKKwlfX2xlMzIgYnVmX2FkZHJfcHRyMjsKK307CisKK3N0cnVjdCBzdW54aV9tbWNfY2ZnIHsKKwl1MzIgaWRtYV9kZXNfc2l6ZV9iaXRzOworCWNvbnN0IHN0cnVjdCBzdW54aV9tbWNfY2xrX2RlbGF5ICpjbGtfZGVsYXlzOworCisJLyogZG9lcyB0aGUgSVAgYmxvY2sgc3VwcG9ydCBhdXRvY2FsaWJyYXRpb24/ICovCisJYm9vbCBjYW5fY2FsaWJyYXRlOwogfTsKIAogc3RydWN0IHN1bnhpX21tY19ob3N0IHsKIAlzdHJ1Y3QgbW1jX2hvc3QJKm1tYzsKIAlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcmVzZXQ7CisJY29uc3Qgc3RydWN0IHN1bnhpX21tY19jZmcgKmNmZzsKIAogCS8qIElPIG1hcHBpbmcgYmFzZSAqLwogCXZvaWQgX19pb21lbQkqcmVnX2Jhc2U7CkBAIC0yNDEsNyArMjY4LDYgQEAKIAlzdHJ1Y3QgY2xrCSpjbGtfbW1jOwogCXN0cnVjdCBjbGsJKmNsa19zYW1wbGU7CiAJc3RydWN0IGNsawkqY2xrX291dHB1dDsKLQljb25zdCBzdHJ1Y3Qgc3VueGlfbW1jX2Nsa19kZWxheSAqY2xrX2RlbGF5czsKIAogCS8qIGlycSAqLwogCXNwaW5sb2NrX3QJbG9jazsKQEAgLTI1MCw3ICsyNzYsNiBAQAogCXUzMgkJc2Rpb19pbWFzazsKIAogCS8qIGRtYSAqLwotCXUzMgkJaWRtYV9kZXNfc2l6ZV9iaXRzOwogCWRtYV9hZGRyX3QJc2dfZG1hOwogCXZvaWQJCSpzZ19jcHU7CiAJYm9vbAkJd2FpdF9kbWE7CkBAIC0zMjIsMjUgKzM0NywyOCBAQAogewogCXN0cnVjdCBzdW54aV9pZG1hX2RlcyAqcGRlcyA9IChzdHJ1Y3Qgc3VueGlfaWRtYV9kZXMgKilob3N0LT5zZ19jcHU7CiAJZG1hX2FkZHJfdCBuZXh0X2Rlc2MgPSBob3N0LT5zZ19kbWE7Ci0JaW50IGksIG1heF9sZW4gPSAoMSA8PCBob3N0LT5pZG1hX2Rlc19zaXplX2JpdHMpOworCWludCBpLCBtYXhfbGVuID0gKDEgPDwgaG9zdC0+Y2ZnLT5pZG1hX2Rlc19zaXplX2JpdHMpOwogCiAJZm9yIChpID0gMDsgaSA8IGRhdGEtPnNnX2xlbjsgaSsrKSB7Ci0JCXBkZXNbaV0uY29uZmlnID0gU0RYQ19JRE1BQ19ERVMwX0NIIHwgU0RYQ19JRE1BQ19ERVMwX09XTiB8Ci0JCQkJIFNEWENfSURNQUNfREVTMF9ESUM7CisJCXBkZXNbaV0uY29uZmlnID0gY3B1X3RvX2xlMzIoU0RYQ19JRE1BQ19ERVMwX0NIIHwKKwkJCQkJICAgICBTRFhDX0lETUFDX0RFUzBfT1dOIHwKKwkJCQkJICAgICBTRFhDX0lETUFDX0RFUzBfRElDKTsKIAogCQlpZiAoZGF0YS0+c2dbaV0ubGVuZ3RoID09IG1heF9sZW4pCiAJCQlwZGVzW2ldLmJ1Zl9zaXplID0gMDsgLyogMCA9PSBtYXhfbGVuICovCiAJCWVsc2UKLQkJCXBkZXNbaV0uYnVmX3NpemUgPSBkYXRhLT5zZ1tpXS5sZW5ndGg7CisJCQlwZGVzW2ldLmJ1Zl9zaXplID0gY3B1X3RvX2xlMzIoZGF0YS0+c2dbaV0ubGVuZ3RoKTsKIAogCQluZXh0X2Rlc2MgKz0gc2l6ZW9mKHN0cnVjdCBzdW54aV9pZG1hX2Rlcyk7Ci0JCXBkZXNbaV0uYnVmX2FkZHJfcHRyMSA9IHNnX2RtYV9hZGRyZXNzKCZkYXRhLT5zZ1tpXSk7Ci0JCXBkZXNbaV0uYnVmX2FkZHJfcHRyMiA9ICh1MzIpbmV4dF9kZXNjOworCQlwZGVzW2ldLmJ1Zl9hZGRyX3B0cjEgPQorCQkJY3B1X3RvX2xlMzIoc2dfZG1hX2FkZHJlc3MoJmRhdGEtPnNnW2ldKSk7CisJCXBkZXNbaV0uYnVmX2FkZHJfcHRyMiA9IGNwdV90b19sZTMyKCh1MzIpbmV4dF9kZXNjKTsKIAl9CiAKLQlwZGVzWzBdLmNvbmZpZyB8PSBTRFhDX0lETUFDX0RFUzBfRkQ7Ci0JcGRlc1tpIC0gMV0uY29uZmlnIHw9IFNEWENfSURNQUNfREVTMF9MRCB8IFNEWENfSURNQUNfREVTMF9FUjsKLQlwZGVzW2kgLSAxXS5jb25maWcgJj0gflNEWENfSURNQUNfREVTMF9ESUM7CisJcGRlc1swXS5jb25maWcgfD0gY3B1X3RvX2xlMzIoU0RYQ19JRE1BQ19ERVMwX0ZEKTsKKwlwZGVzW2kgLSAxXS5jb25maWcgfD0gY3B1X3RvX2xlMzIoU0RYQ19JRE1BQ19ERVMwX0xEIHwKKwkJCQkJICBTRFhDX0lETUFDX0RFUzBfRVIpOworCXBkZXNbaSAtIDFdLmNvbmZpZyAmPSBjcHVfdG9fbGUzMih+U0RYQ19JRE1BQ19ERVMwX0RJQyk7CiAJcGRlc1tpIC0gMV0uYnVmX2FkZHJfcHRyMiA9IDA7CiAKIAkvKgpAQCAtNjUzLDExICs2ODEsODQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzdW54aV9tbWNfY2FsaWJyYXRlKHN0cnVjdCBzdW54aV9tbWNfaG9zdCAqaG9zdCwgaW50IHJlZ19vZmYpCit7CisJdTMyIHJlZyA9IHJlYWRsKGhvc3QtPnJlZ19iYXNlICsgcmVnX29mZik7CisJdTMyIGRlbGF5OworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWlmICghaG9zdC0+Y2ZnLT5jYW5fY2FsaWJyYXRlKQorCQlyZXR1cm4gMDsKKworCXJlZyAmPSB+KFNEWENfQ0FMX0RMX01BU0sgPDwgU0RYQ19DQUxfRExfU1dfU0hJRlQpOworCXJlZyAmPSB+U0RYQ19DQUxfRExfU1dfRU47CisKKwl3cml0ZWwocmVnIHwgU0RYQ19DQUxfU1RBUlQsIGhvc3QtPnJlZ19iYXNlICsgcmVnX29mZik7CisKKwlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgImNhbGlicmF0aW9uIHN0YXJ0ZWRcbiIpOworCisJdGltZW91dCA9IGppZmZpZXMgKyBIWiAqIFNEWENfQ0FMX1RJTUVPVVQ7CisKKwl3aGlsZSAoISgocmVnID0gcmVhZGwoaG9zdC0+cmVnX2Jhc2UgKyByZWdfb2ZmKSkgJiBTRFhDX0NBTF9ET05FKSkgeworCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCQljcHVfcmVsYXgoKTsKKwkJZWxzZSB7CisJCQlyZWcgJj0gflNEWENfQ0FMX1NUQVJUOworCQkJd3JpdGVsKHJlZywgaG9zdC0+cmVnX2Jhc2UgKyByZWdfb2ZmKTsKKworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwl9CisKKwlkZWxheSA9IChyZWcgPj4gU0RYQ19DQUxfRExfU0hJRlQpICYgU0RYQ19DQUxfRExfTUFTSzsKKworCXJlZyAmPSB+U0RYQ19DQUxfU1RBUlQ7CisJcmVnIHw9IChkZWxheSA8PCBTRFhDX0NBTF9ETF9TV19TSElGVCkgfCBTRFhDX0NBTF9ETF9TV19FTjsKKworCXdyaXRlbChyZWcsIGhvc3QtPnJlZ19iYXNlICsgcmVnX29mZik7CisKKwlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgImNhbGlicmF0aW9uIGVuZGVkLCByZWcgaXMgMHgleFxuIiwgcmVnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN1bnhpX21tY19jbGtfc2V0X3BoYXNlKHN0cnVjdCBzdW54aV9tbWNfaG9zdCAqaG9zdCwKKwkJCQkgICBzdHJ1Y3QgbW1jX2lvcyAqaW9zLCB1MzIgcmF0ZSkKK3sKKwlpbnQgaW5kZXg7CisKKwlpZiAoIWhvc3QtPmNmZy0+Y2xrX2RlbGF5cykKKwkJcmV0dXJuIDA7CisKKwkvKiBkZXRlcm1pbmUgZGVsYXlzICovCisJaWYgKHJhdGUgPD0gNDAwMDAwKSB7CisJCWluZGV4ID0gU0RYQ19DTEtfNDAwSzsKKwl9IGVsc2UgaWYgKHJhdGUgPD0gMjUwMDAwMDApIHsKKwkJaW5kZXggPSBTRFhDX0NMS18yNU07CisJfSBlbHNlIGlmIChyYXRlIDw9IDUyMDAwMDAwKSB7CisJCWlmIChpb3MtPnRpbWluZyAhPSBNTUNfVElNSU5HX1VIU19ERFI1MCAmJgorCQkgICAgaW9zLT50aW1pbmcgIT0gTU1DX1RJTUlOR19NTUNfRERSNTIpIHsKKwkJCWluZGV4ID0gU0RYQ19DTEtfNTBNOworCQl9IGVsc2UgaWYgKGlvcy0+YnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfOCkgeworCQkJaW5kZXggPSBTRFhDX0NMS181ME1fRERSXzhCSVQ7CisJCX0gZWxzZSB7CisJCQlpbmRleCA9IFNEWENfQ0xLXzUwTV9ERFI7CisJCX0KKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljbGtfc2V0X3BoYXNlKGhvc3QtPmNsa19zYW1wbGUsIGhvc3QtPmNmZy0+Y2xrX2RlbGF5c1tpbmRleF0uc2FtcGxlKTsKKwljbGtfc2V0X3BoYXNlKGhvc3QtPmNsa19vdXRwdXQsIGhvc3QtPmNmZy0+Y2xrX2RlbGF5c1tpbmRleF0ub3V0cHV0KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHN1bnhpX21tY19jbGtfc2V0X3JhdGUoc3RydWN0IHN1bnhpX21tY19ob3N0ICpob3N0LAogCQkJCSAgc3RydWN0IG1tY19pb3MgKmlvcykKIHsKLQl1MzIgcmF0ZSwgb2Nsa19kbHksIHJ2YWwsIHNjbGtfZGx5OwotCXUzMiBjbG9jayA9IGlvcy0+Y2xvY2s7CisJbG9uZyByYXRlOworCXUzMiBydmFsLCBjbG9jayA9IGlvcy0+Y2xvY2s7CiAJaW50IHJldDsKIAogCS8qIDggYml0IEREUiByZXF1aXJlcyBhIGhpZ2hlciBtb2R1bGUgY2xvY2sgKi8KQEAgLTY2NiwxMyArNzY3LDE4IEBACiAJCWNsb2NrIDw8PSAxOwogCiAJcmF0ZSA9IGNsa19yb3VuZF9yYXRlKGhvc3QtPmNsa19tbWMsIGNsb2NrKTsKLQlkZXZfZGJnKG1tY19kZXYoaG9zdC0+bW1jKSwgInNldHRpbmcgY2xrIHRvICVkLCByb3VuZGVkICVkXG4iLAorCWlmIChyYXRlIDwgMCkgeworCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgImVycm9yIHJvdW5kaW5nIGNsayB0byAlZDogJWxkXG4iLAorCQkJY2xvY2ssIHJhdGUpOworCQlyZXR1cm4gcmF0ZTsKKwl9CisJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJzZXR0aW5nIGNsayB0byAlZCwgcm91bmRlZCAlbGRcbiIsCiAJCWNsb2NrLCByYXRlKTsKIAogCS8qIHNldHRpbmcgY2xvY2sgcmF0ZSAqLwogCXJldCA9IGNsa19zZXRfcmF0ZShob3N0LT5jbGtfbW1jLCByYXRlKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiZXJyb3Igc2V0dGluZyBjbGsgdG8gJWQ6ICVkXG4iLAorCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgImVycm9yIHNldHRpbmcgY2xrIHRvICVsZDogJWRcbiIsCiAJCQlyYXRlLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTY5MiwzMSArNzk4LDE1IEBACiAJfQogCW1tY193cml0ZWwoaG9zdCwgUkVHX0NMS0NSLCBydmFsKTsKIAotCS8qIGRldGVybWluZSBkZWxheXMgKi8KLQlpZiAocmF0ZSA8PSA0MDAwMDApIHsKLQkJb2Nsa19kbHkgPSBob3N0LT5jbGtfZGVsYXlzW1NEWENfQ0xLXzQwMEtdLm91dHB1dDsKLQkJc2Nsa19kbHkgPSBob3N0LT5jbGtfZGVsYXlzW1NEWENfQ0xLXzQwMEtdLnNhbXBsZTsKLQl9IGVsc2UgaWYgKHJhdGUgPD0gMjUwMDAwMDApIHsKLQkJb2Nsa19kbHkgPSBob3N0LT5jbGtfZGVsYXlzW1NEWENfQ0xLXzI1TV0ub3V0cHV0OwotCQlzY2xrX2RseSA9IGhvc3QtPmNsa19kZWxheXNbU0RYQ19DTEtfMjVNXS5zYW1wbGU7Ci0JfSBlbHNlIGlmIChyYXRlIDw9IDUyMDAwMDAwKSB7Ci0JCWlmIChpb3MtPnRpbWluZyAhPSBNTUNfVElNSU5HX1VIU19ERFI1MCAmJgotCQkgICAgaW9zLT50aW1pbmcgIT0gTU1DX1RJTUlOR19NTUNfRERSNTIpIHsKLQkJCW9jbGtfZGx5ID0gaG9zdC0+Y2xrX2RlbGF5c1tTRFhDX0NMS181ME1dLm91dHB1dDsKLQkJCXNjbGtfZGx5ID0gaG9zdC0+Y2xrX2RlbGF5c1tTRFhDX0NMS181ME1dLnNhbXBsZTsKLQkJfSBlbHNlIGlmIChpb3MtPmJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzgpIHsKLQkJCW9jbGtfZGx5ID0gaG9zdC0+Y2xrX2RlbGF5c1tTRFhDX0NMS181ME1fRERSXzhCSVRdLm91dHB1dDsKLQkJCXNjbGtfZGx5ID0gaG9zdC0+Y2xrX2RlbGF5c1tTRFhDX0NMS181ME1fRERSXzhCSVRdLnNhbXBsZTsKLQkJfSBlbHNlIHsKLQkJCW9jbGtfZGx5ID0gaG9zdC0+Y2xrX2RlbGF5c1tTRFhDX0NMS181ME1fRERSXS5vdXRwdXQ7Ci0JCQlzY2xrX2RseSA9IGhvc3QtPmNsa19kZWxheXNbU0RYQ19DTEtfNTBNX0REUl0uc2FtcGxlOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCXJldCA9IHN1bnhpX21tY19jbGtfc2V0X3BoYXNlKGhvc3QsIGlvcywgcmF0ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAotCWNsa19zZXRfcGhhc2UoaG9zdC0+Y2xrX3NhbXBsZSwgc2Nsa19kbHkpOwotCWNsa19zZXRfcGhhc2UoaG9zdC0+Y2xrX291dHB1dCwgb2Nsa19kbHkpOworCXJldCA9IHN1bnhpX21tY19jYWxpYnJhdGUoaG9zdCwgU0RYQ19SRUdfU0FNUF9ETF9SRUcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBUT0RPOiBlbmFibGUgY2FsaWJyYXRlIG9uIHNkYzIgU0RYQ19SRUdfRFNfRExfUkVHIG9mIEE2NCAqLwogCiAJcmV0dXJuIHN1bnhpX21tY19vY2xrX29ub2ZmKGhvc3QsIDEpOwogfQpAQCAtOTM4LDE0ICsxMDI4LDYgQEAKIAlyZXR1cm4gISEobW1jX3JlYWRsKGhvc3QsIFJFR19TVEFTKSAmIFNEWENfQ0FSRF9EQVRBX0JVU1kpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW54aV9tbWNfb2ZfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtbW1jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW41aS1hMTMtbW1jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW45aS1hODAtbW1jIiwgfSwKLQl7IC8qIHNlbnRpbmVsICovIH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW54aV9tbWNfb2ZfbWF0Y2gpOwotCiBzdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyBzdW54aV9tbWNfb3BzID0gewogCS5yZXF1ZXN0CSA9IHN1bnhpX21tY19yZXF1ZXN0LAogCS5zZXRfaW9zCSA9IHN1bnhpX21tY19zZXRfaW9zLApAQCAtOTc0LDIxICsxMDU2LDU0IEBACiAJW1NEWENfQ0xLXzUwTV9ERFJfOEJJVF0JPSB7IC5vdXRwdXQgPSAgNzIsIC5zYW1wbGUgPSAgNzIgfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfbW1jX2NmZyBzdW40aV9hMTBfY2ZnID0geworCS5pZG1hX2Rlc19zaXplX2JpdHMgPSAxMywKKwkuY2xrX2RlbGF5cyA9IE5VTEwsCisJLmNhbl9jYWxpYnJhdGUgPSBmYWxzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfbW1jX2NmZyBzdW41aV9hMTNfY2ZnID0geworCS5pZG1hX2Rlc19zaXplX2JpdHMgPSAxNiwKKwkuY2xrX2RlbGF5cyA9IE5VTEwsCisJLmNhbl9jYWxpYnJhdGUgPSBmYWxzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfbW1jX2NmZyBzdW43aV9hMjBfY2ZnID0geworCS5pZG1hX2Rlc19zaXplX2JpdHMgPSAxNiwKKwkuY2xrX2RlbGF5cyA9IHN1bnhpX21tY19jbGtfZGVsYXlzLAorCS5jYW5fY2FsaWJyYXRlID0gZmFsc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX21tY19jZmcgc3VuOWlfYTgwX2NmZyA9IHsKKwkuaWRtYV9kZXNfc2l6ZV9iaXRzID0gMTYsCisJLmNsa19kZWxheXMgPSBzdW45aV9tbWNfY2xrX2RlbGF5cywKKwkuY2FuX2NhbGlicmF0ZSA9IGZhbHNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdW54aV9tbWNfY2ZnIHN1bjUwaV9hNjRfY2ZnID0geworCS5pZG1hX2Rlc19zaXplX2JpdHMgPSAxNiwKKwkuY2xrX2RlbGF5cyA9IE5VTEwsCisJLmNhbl9jYWxpYnJhdGUgPSB0cnVlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VueGlfbW1jX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLW1tYyIsIC5kYXRhID0gJnN1bjRpX2ExMF9jZmcgfSwKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW41aS1hMTMtbW1jIiwgLmRhdGEgPSAmc3VuNWlfYTEzX2NmZyB9LAorCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjdpLWEyMC1tbWMiLCAuZGF0YSA9ICZzdW43aV9hMjBfY2ZnIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOWktYTgwLW1tYyIsIC5kYXRhID0gJnN1bjlpX2E4MF9jZmcgfSwKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW41MGktYTY0LW1tYyIsIC5kYXRhID0gJnN1bjUwaV9hNjRfY2ZnIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VueGlfbW1jX29mX21hdGNoKTsKKwogc3RhdGljIGludCBzdW54aV9tbWNfcmVzb3VyY2VfcmVxdWVzdChzdHJ1Y3Qgc3VueGlfbW1jX2hvc3QgKmhvc3QsCiAJCQkJICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJaW50IHJldDsKIAotCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImFsbHdpbm5lcixzdW40aS1hMTAtbW1jIikpCi0JCWhvc3QtPmlkbWFfZGVzX3NpemVfYml0cyA9IDEzOwotCWVsc2UKLQkJaG9zdC0+aWRtYV9kZXNfc2l6ZV9iaXRzID0gMTY7Ci0KLQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJhbGx3aW5uZXIsc3VuOWktYTgwLW1tYyIpKQotCQlob3N0LT5jbGtfZGVsYXlzID0gc3VuOWlfbW1jX2Nsa19kZWxheXM7Ci0JZWxzZQotCQlob3N0LT5jbGtfZGVsYXlzID0gc3VueGlfbW1jX2Nsa19kZWxheXM7CisJaG9zdC0+Y2ZnID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOworCWlmICghaG9zdC0+Y2ZnKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldCA9IG1tY19yZWd1bGF0b3JfZ2V0X3N1cHBseShob3N0LT5tbWMpOwogCWlmIChyZXQpIHsKQEAgLTEwMTQsMTYgKzExMjksMTggQEAKIAkJcmV0dXJuIFBUUl9FUlIoaG9zdC0+Y2xrX21tYyk7CiAJfQogCi0JaG9zdC0+Y2xrX291dHB1dCA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAib3V0cHV0Iik7Ci0JaWYgKElTX0VSUihob3N0LT5jbGtfb3V0cHV0KSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgZ2V0IG91dHB1dCBjbG9ja1xuIik7Ci0JCXJldHVybiBQVFJfRVJSKGhvc3QtPmNsa19vdXRwdXQpOwotCX0KKwlpZiAoaG9zdC0+Y2ZnLT5jbGtfZGVsYXlzKSB7CisJCWhvc3QtPmNsa19vdXRwdXQgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgIm91dHB1dCIpOworCQlpZiAoSVNfRVJSKGhvc3QtPmNsa19vdXRwdXQpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgZ2V0IG91dHB1dCBjbG9ja1xuIik7CisJCQlyZXR1cm4gUFRSX0VSUihob3N0LT5jbGtfb3V0cHV0KTsKKwkJfQogCi0JaG9zdC0+Y2xrX3NhbXBsZSA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAic2FtcGxlIik7Ci0JaWYgKElTX0VSUihob3N0LT5jbGtfc2FtcGxlKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgZ2V0IHNhbXBsZSBjbG9ja1xuIik7Ci0JCXJldHVybiBQVFJfRVJSKGhvc3QtPmNsa19zYW1wbGUpOworCQlob3N0LT5jbGtfc2FtcGxlID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJzYW1wbGUiKTsKKwkJaWYgKElTX0VSUihob3N0LT5jbGtfc2FtcGxlKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IGdldCBzYW1wbGUgY2xvY2tcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIoaG9zdC0+Y2xrX3NhbXBsZSk7CisJCX0KIAl9CiAKIAlob3N0LT5yZXNldCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXRfb3B0aW9uYWwoJnBkZXYtPmRldiwgImFoYiIpOwpAQCAtMTEyMCwxNSArMTIzNywxNyBAQAogCW1tYy0+bWF4X2Jsa19jb3VudAk9IDgxOTI7CiAJbW1jLT5tYXhfYmxrX3NpemUJPSA0MDk2OwogCW1tYy0+bWF4X3NlZ3MJCT0gUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBzdW54aV9pZG1hX2Rlcyk7Ci0JbW1jLT5tYXhfc2VnX3NpemUJPSAoMSA8PCBob3N0LT5pZG1hX2Rlc19zaXplX2JpdHMpOworCW1tYy0+bWF4X3NlZ19zaXplCT0gKDEgPDwgaG9zdC0+Y2ZnLT5pZG1hX2Rlc19zaXplX2JpdHMpOwogCW1tYy0+bWF4X3JlcV9zaXplCT0gbW1jLT5tYXhfc2VnX3NpemUgKiBtbWMtPm1heF9zZWdzOwogCS8qIDQwMGtIeiB+IDUyTUh6ICovCiAJbW1jLT5mX21pbgkJPSAgIDQwMDAwMDsKIAltbWMtPmZfbWF4CQk9IDUyMDAwMDAwOwogCW1tYy0+Y2FwcwkgICAgICAgfD0gTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQgfAotCQkJCSAgTU1DX0NBUF8xXzhWX0REUiB8CiAJCQkJICBNTUNfQ0FQX0VSQVNFIHwgTU1DX0NBUF9TRElPX0lSUTsKIAorCWlmIChob3N0LT5jZmctPmNsa19kZWxheXMpCisJCW1tYy0+Y2FwcyAgICAgIHw9IE1NQ19DQVBfMV84Vl9ERFI7CisKIAlyZXQgPSBtbWNfb2ZfcGFyc2UobW1jKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfZG1hOwpAQCAtMTE2MCw2ICsxMjc5LDggQEAKIAlpZiAoIUlTX0VSUihob3N0LT5yZXNldCkpCiAJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KGhvc3QtPnJlc2V0KTsKIAorCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5jbGtfc2FtcGxlKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaG9zdC0+Y2xrX291dHB1dCk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGhvc3QtPmNsa19tbWMpOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShob3N0LT5jbGtfYWhiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tYy5oCmluZGV4IDdmNjNlYzAuLjhlMTI2YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWMuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jLmgKQEAgLTc5LDYgKzc5LDkgQEAKICNkZWZpbmUJQ0xLX0NUTF9ESVZfTUFTSwkweGZmCiAjZGVmaW5lCUNMS19DVExfU0NMS0VOCQlCSVQoOCkKIAorI2RlZmluZSBDQVJEX09QVF9XSURUSDgJCUJJVCgxMykKKyNkZWZpbmUgQ0FSRF9PUFRfV0lEVEgJCUJJVCgxNSkKKwogI2RlZmluZSBUTUlPX0JCUwkJNTEyCQkvKiBCb290IGJsb2NrIHNpemUgKi8KIAogLyogRGVmaW5pdGlvbnMgZm9yIHZhbHVlcyB0aGUgQ1RSTF9TRElPX1NUQVRVUyByZWdpc3RlciBjYW4gdGFrZS4gKi8KQEAgLTE1OCw2ICsxNjEsNyBAQAogCXZvaWQgKCpjbGtfZGlzYWJsZSkoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QpOwogCWludCAoKm11bHRpX2lvX3F1aXJrKShzdHJ1Y3QgbW1jX2NhcmQgKmNhcmQsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgZGlyZWN0aW9uLCBpbnQgYmxrX3NpemUpOworCWludCAoKmNhcmRfYnVzeSkoc3RydWN0IG1tY19ob3N0ICptbWMpOwogCWludCAoKnN0YXJ0X3NpZ25hbF92b2x0YWdlX3N3aXRjaCkoc3RydWN0IG1tY19ob3N0ICptbWMsCiAJCQkJCSAgIHN0cnVjdCBtbWNfaW9zICppb3MpOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jCmluZGV4IDkyNDY3ZWYuLjcwMDU2NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYwpAQCAtMzM2LDcgKzMzNiw5IEBACiAKIAlzd2l0Y2ggKG1tY19yZXNwX3R5cGUoY21kKSkgewogCWNhc2UgTU1DX1JTUF9OT05FOiBjIHw9IFJFU1BfTk9ORTsgYnJlYWs7Ci0JY2FzZSBNTUNfUlNQX1IxOiAgIGMgfD0gUkVTUF9SMTsgICBicmVhazsKKwljYXNlIE1NQ19SU1BfUjE6CisJY2FzZSBNTUNfUlNQX1IxX05PX0NSQzoKKwkJCSAgIGMgfD0gUkVTUF9SMTsgICBicmVhazsKIAljYXNlIE1NQ19SU1BfUjFCOiAgYyB8PSBSRVNQX1IxQjsgIGJyZWFrOwogCWNhc2UgTU1DX1JTUF9SMjogICBjIHw9IFJFU1BfUjI7ICAgYnJlYWs7CiAJY2FzZSBNTUNfUlNQX1IzOiAgIGMgfD0gUkVTUF9SMzsgICBicmVhazsKQEAgLTczMCwxMiArNzMyLDEzIEBACiAJcHJfZGVidWcoInNldHVwIGRhdGEgdHJhbnNmZXI6IGJsb2Nrc2l6ZSAlMDh4ICBucl9ibG9ja3MgJWRcbiIsCiAJCSBkYXRhLT5ibGtzeiwgZGF0YS0+YmxvY2tzKTsKIAotCS8qIFNvbWUgaGFyZHdhcmUgY2Fubm90IHBlcmZvcm0gMiBieXRlIHJlcXVlc3RzIGluIDQgYml0IG1vZGUgKi8KLQlpZiAoaG9zdC0+bW1jLT5pb3MuYnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfNCkgeworCS8qIFNvbWUgaGFyZHdhcmUgY2Fubm90IHBlcmZvcm0gMiBieXRlIHJlcXVlc3RzIGluIDQvOCBiaXQgbW9kZSAqLworCWlmIChob3N0LT5tbWMtPmlvcy5idXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF80IHx8CisJICAgIGhvc3QtPm1tYy0+aW9zLmJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzgpIHsKIAkJaW50IGJsa3N6XzJieXRlcyA9IHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX0JMS1NaXzJCWVRFUzsKIAogCQlpZiAoZGF0YS0+Ymxrc3ogPCAyIHx8IChkYXRhLT5ibGtzeiA8IDQgJiYgIWJsa3N6XzJieXRlcykpIHsKLQkJCXByX2VycigiJXM6ICVkIGJ5dGUgYmxvY2sgdW5zdXBwb3J0ZWQgaW4gNCBiaXQgbW9kZVxuIiwKKwkJCXByX2VycigiJXM6ICVkIGJ5dGUgYmxvY2sgdW5zdXBwb3J0ZWQgaW4gNC84IGJpdCBtb2RlXG4iLAogCQkJICAgICAgIG1tY19ob3N0bmFtZShob3N0LT5tbWMpLCBkYXRhLT5ibGtzeik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtODU3LDE0ICs4NjAsMTYgQEAKIHN0YXRpYyB2b2lkIHRtaW9fbW1jX3NldF9idXNfd2lkdGgoc3RydWN0IHRtaW9fbW1jX2hvc3QgKmhvc3QsCiAJCQkJdW5zaWduZWQgY2hhciBidXNfd2lkdGgpCiB7Ci0Jc3dpdGNoIChidXNfd2lkdGgpIHsKLQljYXNlIE1NQ19CVVNfV0lEVEhfMToKLQkJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRF9NRU1fQ0FSRF9PUFQsIDB4ODBlMCk7Ci0JCWJyZWFrOwotCWNhc2UgTU1DX0JVU19XSURUSF80OgotCQlzZF9jdHJsX3dyaXRlMTYoaG9zdCwgQ1RMX1NEX01FTV9DQVJEX09QVCwgMHgwMGUwKTsKLQkJYnJlYWs7Ci0JfQorCXUxNiByZWcgPSBzZF9jdHJsX3JlYWQxNihob3N0LCBDVExfU0RfTUVNX0NBUkRfT1BUKQorCQkJCSYgfihDQVJEX09QVF9XSURUSCB8IENBUkRfT1BUX1dJRFRIOCk7CisKKwkvKiByZWcgbm93IGFwcGxpZXMgdG8gTU1DX0JVU19XSURUSF80ICovCisJaWYgKGJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzEpCisJCXJlZyB8PSBDQVJEX09QVF9XSURUSDsKKwllbHNlIGlmIChidXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF84KQorCQlyZWcgfD0gQ0FSRF9PUFRfV0lEVEg4OworCisJc2RfY3RybF93cml0ZTE2KGhvc3QsIENUTF9TRF9NRU1fQ0FSRF9PUFQsIHJlZyk7CiB9CiAKIC8qIFNldCBNTUMgY2xvY2sgLyBwb3dlci4KQEAgLTk2MCwyMCArOTY1LDEyIEBACiAJcmV0dXJuIGJsa19zaXplOwogfQogCi1zdGF0aWMgaW50IHRtaW9fbW1jX2NhcmRfYnVzeShzdHJ1Y3QgbW1jX2hvc3QgKm1tYykKLXsKLQlzdHJ1Y3QgdG1pb19tbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7Ci0KLQlyZXR1cm4gIShzZF9jdHJsX3JlYWQxNl9hbmRfMTZfYXNfMzIoaG9zdCwgQ1RMX1NUQVRVUykgJiBUTUlPX1NUQVRfREFUMCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIHRtaW9fbW1jX29wcyA9IHsKIAkucmVxdWVzdAk9IHRtaW9fbW1jX3JlcXVlc3QsCiAJLnNldF9pb3MJPSB0bWlvX21tY19zZXRfaW9zLAogCS5nZXRfcm8gICAgICAgICA9IHRtaW9fbW1jX2dldF9ybywKIAkuZ2V0X2NkCQk9IG1tY19ncGlvX2dldF9jZCwKIAkuZW5hYmxlX3NkaW9faXJxID0gdG1pb19tbWNfZW5hYmxlX3NkaW9faXJxLAotCS5jYXJkX2J1c3kJPSB0bWlvX21tY19jYXJkX2J1c3ksCiAJLm11bHRpX2lvX3F1aXJrCT0gdG1pb19tdWx0aV9pb19xdWlyaywKIH07CiAKQEAgLTEwNzIsNiArMTA2OSw3IEBACiAJCWdvdG8gaG9zdF9mcmVlOwogCX0KIAorCXRtaW9fbW1jX29wcy5jYXJkX2J1c3kgPSBfaG9zdC0+Y2FyZF9idXN5OwogCXRtaW9fbW1jX29wcy5zdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2ggPSBfaG9zdC0+c3RhcnRfc2lnbmFsX3ZvbHRhZ2Vfc3dpdGNoOwogCW1tYy0+b3BzID0gJnRtaW9fbW1jX29wczsKIApAQCAtMTA4OSw2ICsxMDg3LDE1IEBACiAJCQkJICAhbW1jX2NhcmRfaXNfcmVtb3ZhYmxlKG1tYykgfHwKIAkJCQkgIG1tYy0+c2xvdC5jZF9pcnEgPj0gMCk7CiAKKwkvKgorCSAqIE9uIEdlbjIrLCBlTU1DIHdpdGggTk9OUkVNT1ZBQkxFIGN1cnJlbnRseSBmYWlscyBiZWNhdXNlIG5hdGl2ZQorCSAqIGhvdHBsdWcgZ2V0cyBkaXNhYmxlZC4gSXQgc2VlbXMgUnVudGltZVBNIHJlbGF0ZWQgeWV0IHdlIG5lZWQgZnVydGhlcgorCSAqIHJlc2VhcmNoLiBTaW5jZSB3ZSBhcmUgcGxhbm5pbmcgYSBQTSBvdmVyaGF1bCBhbnl3YXksIGxldCdzIGVuZm9yY2UKKwkgKiBmb3Igbm93IHRoZSBkZXZpY2UgYmVpbmcgYWN0aXZlIGJ5IGVuYWJsaW5nIG5hdGl2ZSBob3RwbHVnIGFsd2F5cy4KKwkgKi8KKwlpZiAocGRhdGEtPmZsYWdzICYgVE1JT19NTUNfTUlOX1JDQVIyKQorCQlfaG9zdC0+bmF0aXZlX2hvdHBsdWcgPSB0cnVlOworCiAJaWYgKHRtaW9fbW1jX2Nsa19lbmFibGUoX2hvc3QpIDwgMCkgewogCQltbWMtPmZfbWF4ID0gcGRhdGEtPmhjbGs7CiAJCW1tYy0+Zl9taW4gPSBtbWMtPmZfbWF4IC8gNTEyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC92dWIzMDAuYyBiL2RyaXZlcnMvbW1jL2hvc3QvdnViMzAwLmMKaW5kZXggMWU4MTlmOS4uYmIzZTBkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC92dWIzMDAuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3Z1YjMwMC5jCkBAIC0yMTE2LDEzICsyMTE2LDExIEBACiAJY29tbWFuZF9vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbW1hbmRfb3V0X3VyYikgewogCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgY29tbWFuZF9vdXRfdXJiXG4iKTsKIAkJZ290byBlcnJvcjA7CiAJfQogCWNvbW1hbmRfcmVzX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb21tYW5kX3Jlc191cmIpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZGV2X2VycigmdWRldi0+ZGV2LCAibm90IGVub3VnaCBtZW1vcnkgZm9yIGNvbW1hbmRfcmVzX3VyYlxuIik7CiAJCWdvdG8gZXJyb3IxOwogCX0KIAkvKiB0aGlzIGFsc28gYWxsb2NhdGVzIG1lbW9yeSBmb3Igb3VyIFZVQjMwMCBtbWMgaG9zdCBkZXZpY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZyBiL2RyaXZlcnMvbXRkL21hcHMvS2NvbmZpZwppbmRleCAzOTJmOWVmLi41YmNjODk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9tYXBzL0tjb25maWcKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9LY29uZmlnCkBAIC03OCw3ICs3OCw3IEBACiAJYm9vbCAiU3VwcG9ydCBBUk0gVmVyc2F0aWxlIHBoeXNtYXAgT0YiCiAJZGVwZW5kcyBvbiBNVERfUEhZU01BUF9PRgogCWRlcGVuZHMgb24gTUZEX1NZU0NPTgotCWRlZmF1bHQgeSBpZiAoQVJDSF9JTlRFR1JBVE9SIHx8IEFSQ0hfVkVSU0FUSUxFIHx8IFJFQUxWSUVXX0RUKQorCWRlZmF1bHQgeSBpZiAoQVJDSF9JTlRFR1JBVE9SIHx8IEFSQ0hfVkVSU0FUSUxFIHx8IEFSQ0hfUkVBTFZJRVcpCiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyBzb21lIGV4dHJhIERUIHBoeXNtYXAgcGFyc2luZyBmb3IgdGhlIEFSTSBWZXJzYXRpbGUKIAkgIHBsYXRmb3JtcywgYmFzaWNhbGx5IHRvIGFkZCBhIFZQUCAod3JpdGUgcHJvdGVjdGlvbikgY2FsbGJhY2sgc28KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZGF2aW5jaV9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2RhdmluY2lfbmFuZC5jCmluZGV4IGNjMDdiYTAuLjI3ZmE4YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvZGF2aW5jaV9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9kYXZpbmNpX25hbmQuYwpAQCAtMjQwLDYgKzI0MCw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgdmFsOwogCisJLyogUmVzZXQgRUNDIGhhcmR3YXJlICovCisJZGF2aW5jaV9uYW5kX3JlYWRsKGluZm8sIE5BTkRfNEJJVF9FQ0MxX09GRlNFVCk7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGF2aW5jaV9uYW5kX2xvY2ssIGZsYWdzKTsKIAogCS8qIFN0YXJ0IDQtYml0IEVDQyBjYWxjdWxhdGlvbiBmb3IgcmVhZC93cml0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9tdGtfZWNjLmMgYi9kcml2ZXJzL210ZC9uYW5kL210a19lY2MuYwppbmRleCAyNWE0ZmJkLi5kNTRmNjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL210a19lY2MuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL210a19lY2MuYwpAQCAtMzY2LDcgKzM2Niw4IEBACiAJCSAgIHU4ICpkYXRhLCB1MzIgYnl0ZXMpCiB7CiAJZG1hX2FkZHJfdCBhZGRyOwotCXUzMiAqcCwgbGVuLCBpOworCXU4ICpwOworCXUzMiBsZW4sIGksIHZhbDsKIAlpbnQgcmV0ID0gMDsKIAogCWFkZHIgPSBkbWFfbWFwX3NpbmdsZShlY2MtPmRldiwgZGF0YSwgYnl0ZXMsIERNQV9UT19ERVZJQ0UpOwpAQCAtMzkyLDExICszOTMsMTQgQEAKIAogCS8qIFByb2dyYW0gRUNDIGJ5dGVzIHRvIE9PQjogcGVyIHNlY3RvciBvb2IgPSBGRE0gKyBFQ0MgKyBTUEFSRSAqLwogCWxlbiA9IChjb25maWctPnN0cmVuZ3RoICogRUNDX1BBUklUWV9CSVRTICsgNykgPj4gMzsKLQlwID0gKHUzMiAqKShkYXRhICsgYnl0ZXMpOworCXAgPSBkYXRhICsgYnl0ZXM7CiAKIAkvKiB3cml0ZSB0aGUgcGFyaXR5IGJ5dGVzIGdlbmVyYXRlZCBieSB0aGUgRUNDIGJhY2sgdG8gdGhlIE9PQiByZWdpb24gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCXBbaV0gPSByZWFkbChlY2MtPnJlZ3MgKyBFQ0NfRU5DUEFSKGkpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKChpICUgNCkgPT0gMCkKKwkJCXZhbCA9IHJlYWRsKGVjYy0+cmVncyArIEVDQ19FTkNQQVIoaSAvIDQpKTsKKwkJcFtpXSA9ICh2YWwgPj4gKChpICUgNCkgKiA4KSkgJiAweGZmOworCX0KIHRpbWVvdXQ6CiAKIAlkbWFfdW5tYXBfc2luZ2xlKGVjYy0+ZGV2LCBhZGRyLCBieXRlcywgRE1BX1RPX0RFVklDRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL210a19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL210a19uYW5kLmMKaW5kZXggZGRhYTJhYy4uNTIyM2EyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9tdGtfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbXRrX25hbmQuYwpAQCAtOTMsNiArOTMsOSBAQAogI2RlZmluZQkJTkZJX0ZTTV9NQVNLCQkoMHhmIDw8IDE2KQogI2RlZmluZSBORklfQUREUkNOVFIJCSgweDcwKQogI2RlZmluZQkJQ05UUl9NQVNLCQlHRU5NQVNLKDE2LCAxMikKKyNkZWZpbmUJCUFERFJDTlRSX1NFQ19TSElGVAkoMTIpCisjZGVmaW5lCQlBRERSQ05UUl9TRUModmFsKSBcCisJCSgoKHZhbCkgJiBDTlRSX01BU0spID4+IEFERFJDTlRSX1NFQ19TSElGVCkKICNkZWZpbmUgTkZJX1NUUkFERFIJCSgweDgwKQogI2RlZmluZSBORklfQllURUxFTgkJKDB4ODQpCiAjZGVmaW5lIE5GSV9DU0VMCQkoMHg5MCkKQEAgLTY5OSw3ICs3MDIsNyBAQAogCX0KIAogCXJldCA9IHJlYWRsX3BvbGxfdGltZW91dF9hdG9taWMobmZjLT5yZWdzICsgTkZJX0FERFJDTlRSLCByZWcsCi0JCQkJCShyZWcgJiBDTlRSX01BU0spID49IGNoaXAtPmVjYy5zdGVwcywKKwkJCQkJQUREUkNOVFJfU0VDKHJlZykgPj0gY2hpcC0+ZWNjLnN0ZXBzLAogCQkJCQkxMCwgTVRLX1RJTUVPVVQpOwogCWlmIChyZXQpCiAJCWRldl9lcnIoZGV2LCAiaHdlY2Mgd3JpdGUgdGltZW91dFxuIik7CkBAIC05MDIsNyArOTA1LDcgQEAKIAkJZGV2X3dhcm4obmZjLT5kZXYsICJyZWFkIGFoYi9kbWEgZG9uZSB0aW1lb3V0XG4iKTsKIAogCXJjID0gcmVhZGxfcG9sbF90aW1lb3V0X2F0b21pYyhuZmMtPnJlZ3MgKyBORklfQllURUxFTiwgcmVnLAotCQkJCSAgICAgICAocmVnICYgQ05UUl9NQVNLKSA+PSBzZWN0b3JzLCAxMCwKKwkJCQkgICAgICAgQUREUkNOVFJfU0VDKHJlZykgPj0gc2VjdG9ycywgMTAsCiAJCQkJICAgICAgIE1US19USU1FT1VUKTsKIAlpZiAocmMgPCAwKSB7CiAJCWRldl9lcnIobmZjLT5kZXYsICJzdWJwYWdlIGRvbmUgdGltZW91dFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL214Y19uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL214Y19uYW5kLmMKaW5kZXggNTE3M2ZhZC4uNTdjYmUyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9teGNfbmFuZC5jCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvbXhjX25hbmQuYwpAQCAtOTQzLDcgKzk0Myw3IEBACiAJc3RydWN0IG5hbmRfY2hpcCAqbmFuZF9jaGlwID0gbXRkX3RvX25hbmQobXRkKTsKIAlpbnQgc3RlcHNpemUgPSBuYW5kX2NoaXAtPmVjYy5ieXRlcyA9PSA5ID8gMTYgOiAyNjsKIAotCWlmIChzZWN0aW9uID4gbmFuZF9jaGlwLT5lY2Muc3RlcHMpCisJaWYgKHNlY3Rpb24gPj0gbmFuZF9jaGlwLT5lY2Muc3RlcHMpCiAJCXJldHVybiAtRVJBTkdFOwogCiAJaWYgKCFzZWN0aW9uKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL29tYXAyLmMgYi9kcml2ZXJzL210ZC9uYW5kL29tYXAyLmMKaW5kZXggYTU5MzYxYy4uNTUxM2JmZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvb21hcDIuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL29tYXAyLmMKQEAgLTIxNjksNyArMjE2OSw3IEBACiAJcmV0dXJuIDA7CiAKIHJldHVybl9lcnJvcjoKLQlpZiAoaW5mby0+ZG1hKQorCWlmICghSVNfRVJSX09SX05VTEwoaW5mby0+ZG1hKSkKIAkJZG1hX3JlbGVhc2VfY2hhbm5lbChpbmZvLT5kbWEpOwogCWlmIChuYW5kX2NoaXAtPmVjYy5wcml2KSB7CiAJCW5hbmRfYmNoX2ZyZWUobmFuZF9jaGlwLT5lY2MucHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCAwYzU0MTViLi45NWMzMmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTE0OSw2ICsxNDksOCBAQAogICAgIHRyaXN0YXRlICJJUC1WTEFOIHN1cHBvcnQiCiAgICAgZGVwZW5kcyBvbiBJTkVUCiAgICAgZGVwZW5kcyBvbiBJUFY2CisgICAgZGVwZW5kcyBvbiBORVRGSUxURVIKKyAgICBkZXBlbmRzIG9uIE5FVF9MM19NQVNURVJfREVWCiAgICAgLS0taGVscC0tLQogICAgICAgVGhpcyBhbGxvd3Mgb25lIHRvIGNyZWF0ZSB2aXJ0dWFsIGRldmljZXMgb2ZmIG9mIGEgbWFpbiBpbnRlcmZhY2UKICAgICAgIGFuZCBwYWNrZXRzIHdpbGwgYmUgZGVsaXZlcmVkIGJhc2VkIG9uIHRoZSBkZXN0IEwzIChJUHY2L0lQdjQgYWRkcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCmluZGV4IDIxN2U4ZGEuLjNmMzFjYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwpAQCAtMTM0MSw5ICsxMzQxLDEwIEBACiAJCQkgICAgc2xhdmVfZGV2LT5uYW1lKTsKIAl9CiAKLQkvKiBhbHJlYWR5IGVuc2xhdmVkICovCi0JaWYgKHNsYXZlX2Rldi0+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+CiBzdGF0aWMgaW5saW5lIGludCBiNTNfc3dpdGNoX2dldF9yZXNldF9ncGlvKHN0cnVjdCBiNTNfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19yZWdzLmggYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19yZWdzLmgKaW5kZXggYTBiNDUzZS4uZGFjMGFmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3JlZ3MuaApAQCAtMzA5LDYgKzMwOSw5IEBACiAvKiBQb3J0IFZMQU4gbWFzayAoMTYgYml0KSBJTVAgcG9ydCBpcyBhbHdheXMgOCwgYWxzbyBvbiA1MzI1ICYgY28gKi8KICNkZWZpbmUgQjUzX1BWTEFOX1BPUlRfTUFTSyhpKQkJKChpKSAqIDIpCiAKKy8qIEpvaW4gYWxsIFZMQU5zIHJlZ2lzdGVyICgxNiBiaXQpICovCisjZGVmaW5lIEI1M19KT0lOX0FMTF9WTEFOX0VOCQkweDUwCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiA4MDIuMVEgUGFnZSBSZWdpc3RlcnMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfc3BpLmMgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19zcGkuYwppbmRleCAyYmRhMGI1Li5mODlmNTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19zcGkuYworKysgYi9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19zcGkuYwpAQCAtMjcwLDcgKzI3MCw3IEBACiAJcmV0dXJuIHNwaV93cml0ZShzcGksIHR4YnVmLCBzaXplb2YodHhidWYpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBiNTNfaW9fb3BzIGI1M19zcGlfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiNTNfaW9fb3BzIGI1M19zcGlfb3BzID0gewogCS5yZWFkOCA9IGI1M19zcGlfcmVhZDgsCiAJLnJlYWQxNiA9IGI1M19zcGlfcmVhZDE2LAogCS5yZWFkMzIgPSBiNTNfc3BpX3JlYWQzMiwKQEAgLTMxNyw4ICszMTcsNiBAQAogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGI1M19zcGlfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gImI1My1zd2l0Y2giLAotCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKIAkucHJvYmUJPSBiNTNfc3BpX3Byb2JlLAogCS5yZW1vdmUJPSBiNTNfc3BpX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3NyYWIuYyBiL2RyaXZlcnMvbmV0L2RzYS9iNTMvYjUzX3NyYWIuYwppbmRleCAzZTJkNGE1Li44YTYyYjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYjUzL2I1M19zcmFiLmMKKysrIGIvZHJpdmVycy9uZXQvZHNhL2I1My9iNTNfc3JhYi5jCkBAIC0zNDQsNyArMzQ0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGI1M19pb19vcHMgYjUzX3NyYWJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBiNTNfaW9fb3BzIGI1M19zcmFiX29wcyA9IHsKIAkucmVhZDggPSBiNTNfc3JhYl9yZWFkOCwKIAkucmVhZDE2ID0gYjUzX3NyYWJfcmVhZDE2LAogCS5yZWFkMzIgPSBiNTNfc3JhYl9yZWFkMzIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMi5jIGIvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjIuYwppbmRleCBiMmI4Mzg3Li5lMjE4ODg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMi5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyLmMKQEAgLTI5LDEzMCArMjksMjEgQEAKICNpbmNsdWRlIDxsaW51eC9icmNtcGh5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9iNTMuaD4KIAogI2luY2x1ZGUgImJjbV9zZjIuaCIKICNpbmNsdWRlICJiY21fc2YyX3JlZ3MuaCIKKyNpbmNsdWRlICJiNTMvYjUzX3ByaXYuaCIKKyNpbmNsdWRlICJiNTMvYjUzX3JlZ3MuaCIKIAotLyogU3RyaW5nLCBvZmZzZXQsIGFuZCByZWdpc3RlciBzaXplIGluIGJ5dGVzIGlmIGRpZmZlcmVudCBmcm9tIDQgYnl0ZXMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYmNtX3NmMl9od19zdGF0cyBiY21fc2YyX21pYltdID0gewotCXsgIlR4T2N0ZXRzIiwJCTB4MDAwLCA4CX0sCi0JeyAiVHhEcm9wUGt0cyIsCQkweDAyMAkJfSwKLQl7ICJUeFFQS1RRMCIsCQkweDAzMAkJfSwKLQl7ICJUeEJyb2FkY2FzdFBrdHMiLAkweDA0MAkJfSwKLQl7ICJUeE11bHRpY2FzdFBrdHMiLAkweDA1MAkJfSwKLQl7ICJUeFVuaWNhc3RQS3RzIiwJMHgwNjAJCX0sCi0JeyAiVHhDb2xsaXNpb25zIiwJMHgwNzAJCX0sCi0JeyAiVHhTaW5nbGVDb2xsaXNpb24iLAkweDA4MAkJfSwKLQl7ICJUeE11bHRpcGxlQ29sbGlzaW9uIiwgMHgwOTAJCX0sCi0JeyAiVHhEZWZlcnJlZENvbGxpc2lvbiIsIDB4MGEwCQl9LAotCXsgIlR4TGF0ZUNvbGxpc2lvbiIsCTB4MGIwCQl9LAotCXsgIlR4RXhjZXNzaXZlQ29sbGlzaW9uIiwgMHgwYzAJCX0sCi0JeyAiVHhGcmFtZUluRGlzYyIsCTB4MGQwCQl9LAotCXsgIlR4UGF1c2VQa3RzIiwJMHgwZTAJCX0sCi0JeyAiVHhRUEtUUTEiLAkJMHgwZjAJCX0sCi0JeyAiVHhRUEtUUTIiLAkJMHgxMDAJCX0sCi0JeyAiVHhRUEtUUTMiLAkJMHgxMTAJCX0sCi0JeyAiVHhRUEtUUTQiLAkJMHgxMjAJCX0sCi0JeyAiVHhRUEtUUTUiLAkJMHgxMzAJCX0sCi0JeyAiUnhPY3RldHMiLAkJMHgxNDAsIDgJfSwKLQl7ICJSeFVuZGVyc2l6ZVBrdHMiLAkweDE2MAkJfSwKLQl7ICJSeFBhdXNlUGt0cyIsCTB4MTcwCQl9LAotCXsgIlJ4UGt0czY0T2N0ZXRzIiwJMHgxODAJCX0sCi0JeyAiUnhQa3RzNjV0bzEyN09jdGV0cyIsIDB4MTkwCQl9LAotCXsgIlJ4UGt0czEyOHRvMjU1T2N0ZXRzIiwgMHgxYTAJCX0sCi0JeyAiUnhQa3RzMjU2dG81MTFPY3RldHMiLCAweDFiMAkJfSwKLQl7ICJSeFBrdHM1MTJ0bzEwMjNPY3RldHMiLCAweDFjMAl9LAotCXsgIlJ4UGt0czEwMjR0b01heFBrdHNPY3RldHMiLCAweDFkMAl9LAotCXsgIlJ4T3ZlcnNpemVQa3RzIiwJMHgxZTAJCX0sCi0JeyAiUnhKYWJiZXJzIiwJCTB4MWYwCQl9LAotCXsgIlJ4QWxpZ25tZW50RXJyb3JzIiwJMHgyMDAJCX0sCi0JeyAiUnhGQ1NFcnJvcnMiLAkweDIxMAkJfSwKLQl7ICJSeEdvb2RPY3RldHMiLAkweDIyMCwgOAl9LAotCXsgIlJ4RHJvcFBrdHMiLAkJMHgyNDAJCX0sCi0JeyAiUnhVbmljYXN0UGt0cyIsCTB4MjUwCQl9LAotCXsgIlJ4TXVsdGljYXN0UGt0cyIsCTB4MjYwCQl9LAotCXsgIlJ4QnJvYWRjYXN0UGt0cyIsCTB4MjcwCQl9LAotCXsgIlJ4U0FDaGFuZ2VzIiwJMHgyODAJCX0sCi0JeyAiUnhGcmFnbWVudHMiLAkweDI5MAkJfSwKLQl7ICJSeEp1bWJvUGt0IiwJCTB4MmEwCQl9LAotCXsgIlJ4U3ltYmxFcnIiLAkJMHgyYjAJCX0sCi0JeyAiSW5SYW5nZUVyckNvdW50IiwJMHgyYzAJCX0sCi0JeyAiT3V0UmFuZ2VFcnJDb3VudCIsCTB4MmQwCQl9LAotCXsgIkVFRUxwaUV2ZW50IiwJMHgyZTAJCX0sCi0JeyAiRUVFTHBpRHVyYXRpb24iLAkweDJmMAkJfSwKLQl7ICJSeERpc2NhcmQiLAkJMHgzMDAsIDgJfSwKLQl7ICJUeFFQS1RRNiIsCQkweDMyMAkJfSwKLQl7ICJUeFFQS1RRNyIsCQkweDMzMAkJfSwKLQl7ICJUeFBrdHM2NE9jdGV0cyIsCTB4MzQwCQl9LAotCXsgIlR4UGt0czY1dG8xMjdPY3RldHMiLCAweDM1MAkJfSwKLQl7ICJUeFBrdHMxMjh0bzI1NU9jdGV0cyIsIDB4MzYwCQl9LAotCXsgIlR4UGt0czI1NnRvNTExT2NldHMiLCAweDM3MAkJfSwKLQl7ICJUeFBrdHM1MTJ0bzEwMjNPY2V0cyIsIDB4MzgwCQl9LAotCXsgIlR4UGt0czEwMjR0b01heFBrdE9jZXRzIiwgMHgzOTAJfSwKLX07Ci0KLSNkZWZpbmUgQkNNX1NGMl9TVEFUU19TSVpFCUFSUkFZX1NJWkUoYmNtX3NmMl9taWIpCi0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfZ2V0X3N0cmluZ3Moc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAotCQkJCSAgIGludCBwb3J0LCB1aW50OF90ICpkYXRhKQorc3RhdGljIGVudW0gZHNhX3RhZ19wcm90b2NvbCBiY21fc2YyX3N3X2dldF90YWdfcHJvdG9jb2woc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXVuc2lnbmVkIGludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEJDTV9TRjJfU1RBVFNfU0laRTsgaSsrKQotCQltZW1jcHkoZGF0YSArIGkgKiBFVEhfR1NUUklOR19MRU4sCi0JCSAgICAgICBiY21fc2YyX21pYltpXS5zdHJpbmcsIEVUSF9HU1RSSU5HX0xFTik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAotCQkJCQkgaW50IHBvcnQsIHVpbnQ2NF90ICpkYXRhKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQljb25zdCBzdHJ1Y3QgYmNtX3NmMl9od19zdGF0cyAqczsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1NjQgdmFsID0gMDsKLQl1MzIgb2Zmc2V0OwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+c3RhdHNfbXV0ZXgpOwotCi0JLyogTm93IGZldGNoIHRoZSBwZXItcG9ydCBjb3VudGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBCQ01fU0YyX1NUQVRTX1NJWkU7IGkrKykgewotCQlzID0gJmJjbV9zZjJfbWliW2ldOwotCi0JCS8qIERvIGEgbGF0Y2hlZCA2NC1iaXQgcmVhZCBpZiBuZWVkZWQgKi8KLQkJb2Zmc2V0ID0gcy0+cmVnICsgQ09SRV9QX01JQl9PRkZTRVQocG9ydCk7Ci0JCWlmIChzLT5zaXplb2Zfc3RhdCA9PSA4KQotCQkJdmFsID0gY29yZV9yZWFkcShwcml2LCBvZmZzZXQpOwotCQllbHNlCi0JCQl2YWwgPSBjb3JlX3JlYWRsKHByaXYsIG9mZnNldCk7Ci0KLQkJZGF0YVtpXSA9ICh1NjQpdmFsOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+c3RhdHNfbXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfZ2V0X3NzZXRfY291bnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQotewotCXJldHVybiBCQ01fU0YyX1NUQVRTX1NJWkU7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpiY21fc2YyX3N3X2Rydl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkc2FfZGV2LAotCQkJCQlzdHJ1Y3QgZGV2aWNlICpob3N0X2RldiwgaW50IHN3X2FkZHIsCi0JCQkJCXZvaWQgKipfcHJpdikKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2OwotCi0JcHJpdiA9IGRldm1fa3phbGxvYyhkc2FfZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYpCi0JCXJldHVybiBOVUxMOwotCSpfcHJpdiA9IHByaXY7Ci0KLQlyZXR1cm4gIkJyb2FkY29tIFN0YXJmaWdodGVyIDIiOworCXJldHVybiBEU0FfVEFHX1BST1RPX0JSQ007CiB9CiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfaW1wX3ZsYW5fc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgY3B1X3BvcnQpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXVuc2lnbmVkIGludCBpOwogCXUzMiByZWc7CiAKQEAgLTE3Miw3ICs2Myw3IEBACiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfaW1wX3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXUzMiByZWcsIHZhbDsKIAogCS8qIEVuYWJsZSB0aGUgcG9ydCBtZW1vcmllcyAqLwpAQCAtMjM3LDcgKzEyOCw3IEBACiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfZWVlX2VuYWJsZV9zZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgYm9vbCBlbmFibGUpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXUzMiByZWc7CiAKIAlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfRUVFX0VOX0NUUkwpOwpAQCAtMjUwLDcgKzE0MSw3IEBACiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfZ3BoeV9lbmFibGVfc2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgYm9vbCBlbmFibGUpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXUzMiByZWc7CiAKIAlyZWcgPSByZWdfcmVhZGwocHJpdiwgUkVHX1NQSFlfQ05UUkwpOwpAQCAtMzI0LDcgKzIxNSw3IEBACiBzdGF0aWMgaW50IGJjbV9zZjJfcG9ydF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJICAgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeSkKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJczggY3B1X3BvcnQgPSBkcy0+ZHN0W2RzLT5pbmRleF0uY3B1X3BvcnQ7CiAJdTMyIHJlZzsKIApAQCAtMzY1LDcgKzI1Niw3IEBACiAJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX1BPUlRfVkxBTl9DVExfUE9SVChwb3J0KSk7CiAJcmVnICY9IH5QT1JUX1ZMQU5fQ1RSTF9NQVNLOwogCXJlZyB8PSAoMSA8PCBwb3J0KTsKLQlyZWcgfD0gcHJpdi0+cG9ydF9zdHNbcG9ydF0udmxhbl9jdGxfbWFzazsKKwlyZWcgfD0gcHJpdi0+ZGV2LT5wb3J0c1twb3J0XS52bGFuX2N0bF9tYXNrOwogCWNvcmVfd3JpdGVsKHByaXYsIHJlZywgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQocG9ydCkpOwogCiAJYmNtX3NmMl9pbXBfdmxhbl9zZXR1cChkcywgY3B1X3BvcnQpOwpAQCAtMzgwLDcgKzI3MSw3IEBACiBzdGF0aWMgdm9pZCBiY21fc2YyX3BvcnRfZGlzYWJsZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5KQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1MzIgb2ZmLCByZWc7CiAKIAlpZiAocHJpdi0+d29sX3BvcnRzX21hc2sgJiAoMSA8PCBwb3J0KSkKQEAgLTQxMiw3ICszMDMsNyBAQAogc3RhdGljIGludCBiY21fc2YyX2VlZV9pbml0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeSkKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJc3RydWN0IGV0aHRvb2xfZWVlICpwID0gJnByaXYtPnBvcnRfc3RzW3BvcnRdLmVlZTsKIAlpbnQgcmV0OwogCkBAIC00MzAsNyArMzIxLDcgQEAKIHN0YXRpYyBpbnQgYmNtX3NmMl9zd19nZXRfZWVlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9lZWUgKmUpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXN0cnVjdCBldGh0b29sX2VlZSAqcCA9ICZwcml2LT5wb3J0X3N0c1twb3J0XS5lZWU7CiAJdTMyIHJlZzsKIApAQCAtNDQ1LDcgKzMzNiw3IEBACiAJCQkgICAgICBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LAogCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZWVlICplKQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAlzdHJ1Y3QgZXRodG9vbF9lZWUgKnAgPSAmcHJpdi0+cG9ydF9zdHNbcG9ydF0uZWVlOwogCiAJcC0+ZWVlX2VuYWJsZWQgPSBlLT5lZWVfZW5hYmxlZDsKQEAgLTQ2MSw0NjkgKzM1Miw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmNtX3NmMl9mYXN0X2FnZV9vcChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTAwMDsKLQl1MzIgcmVnOwotCi0JcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0ZBU1RfQUdFX0NUUkwpOwotCXJlZyB8PSBFTl9BR0VfUE9SVCB8IEVOX0FHRV9WTEFOIHwgRU5fQUdFX0RZTkFNSUMgfCBGQVNUX0FHRV9TVFJfRE9ORTsKLQljb3JlX3dyaXRlbChwcml2LCByZWcsIENPUkVfRkFTVF9BR0VfQ1RSTCk7Ci0KLQlkbyB7Ci0JCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9GQVNUX0FHRV9DVFJMKTsKLQkJaWYgKCEocmVnICYgRkFTVF9BR0VfU1RSX0RPTkUpKQotCQkJYnJlYWs7Ci0KLQkJY3B1X3JlbGF4KCk7Ci0JfSB3aGlsZSAodGltZW91dC0tKTsKLQotCWlmICghdGltZW91dCkKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0KLQljb3JlX3dyaXRlbChwcml2LCAwLCBDT1JFX0ZBU1RfQUdFX0NUUkwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEZhc3QtYWdlaW5nIG9mIEFSTCBlbnRyaWVzIGZvciBhIGdpdmVuIHBvcnQsIGVxdWl2YWxlbnQgdG8gYW4gQVJMCi0gKiBmbHVzaCBmb3IgdGhhdCBwb3J0LgotICovCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfZmFzdF9hZ2VfcG9ydChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQotCWNvcmVfd3JpdGVsKHByaXYsIHBvcnQsIENPUkVfRkFTVF9BR0VfUE9SVCk7Ci0KLQlyZXR1cm4gYmNtX3NmMl9mYXN0X2FnZV9vcChwcml2KTsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX3N3X2Zhc3RfYWdlX3ZsYW4oc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdTE2IHZpZCkKLXsKLQljb3JlX3dyaXRlbChwcml2LCB2aWQsIENPUkVfRkFTVF9BR0VfVklEKTsKLQotCXJldHVybiBiY21fc2YyX2Zhc3RfYWdlX29wKHByaXYpOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfdmxhbl9vcF93YWl0KHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDsKLQl1MzIgcmVnOwotCi0JZG8gewotCQlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfQVJMQV9WVEJMX1JXQ1RSTCk7Ci0JCWlmICghKHJlZyAmIEFSTEFfVlRCTF9TVEROKSkKLQkJCXJldHVybiAwOwotCi0JCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQl9IHdoaWxlICh0aW1lb3V0LS0pOwotCi0JcmV0dXJuIC1FVElNRURPVVQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl92bGFuX29wKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIHU4IG9wKQotewotCWNvcmVfd3JpdGVsKHByaXYsIEFSTEFfVlRCTF9TVEROIHwgb3AsIENPUkVfQVJMQV9WVEJMX1JXQ1RSTCk7Ci0KLQlyZXR1cm4gYmNtX3NmMl92bGFuX29wX3dhaXQocHJpdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfc2V0X3ZsYW5fZW50cnkoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdTE2IHZpZCwKLQkJCQkgICBzdHJ1Y3QgYmNtX3NmMl92bGFuICp2bGFuKQotewotCWludCByZXQ7Ci0KLQljb3JlX3dyaXRlbChwcml2LCB2aWQgJiBWVEJMX0FERFJfSU5ERVhfTUFTSywgQ09SRV9BUkxBX1ZUQkxfQUREUik7Ci0JY29yZV93cml0ZWwocHJpdiwgdmxhbi0+dW50YWcgPDwgVU5UQUdfTUFQX1NISUZUIHwgdmxhbi0+bWVtYmVycywKLQkJICAgIENPUkVfQVJMQV9WVEJMX0VOVFJZKTsKLQotCXJldCA9IGJjbV9zZjJfdmxhbl9vcChwcml2LCBBUkxBX1ZUQkxfQ01EX1dSSVRFKTsKLQlpZiAocmV0KQotCQlwcl9lcnIoImZhaWxlZCB0byB3cml0ZSBWTEFOIGVudHJ5XG4iKTsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX2dldF92bGFuX2VudHJ5KHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIHUxNiB2aWQsCi0JCQkJICBzdHJ1Y3QgYmNtX3NmMl92bGFuICp2bGFuKQotewotCXUzMiBlbnRyeTsKLQlpbnQgcmV0OwotCi0JY29yZV93cml0ZWwocHJpdiwgdmlkICYgVlRCTF9BRERSX0lOREVYX01BU0ssIENPUkVfQVJMQV9WVEJMX0FERFIpOwotCi0JcmV0ID0gYmNtX3NmMl92bGFuX29wKHByaXYsIEFSTEFfVlRCTF9DTURfUkVBRCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWVudHJ5ID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0FSTEFfVlRCTF9FTlRSWSk7Ci0Jdmxhbi0+bWVtYmVycyA9IGVudHJ5ICYgRldEX01BUF9NQVNLOwotCXZsYW4tPnVudGFnID0gKGVudHJ5ID4+IFVOVEFHX01BUF9TSElGVCkgJiBVTlRBR19NQVBfTUFTSzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfYnJfam9pbihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmJyaWRnZSkKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7Ci0JczggY3B1X3BvcnQgPSBkcy0+ZHN0LT5jcHVfcG9ydDsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1MzIgcmVnLCBwX2N0bDsKLQotCS8qIE1ha2UgdGhpcyBwb3J0IGxlYXZlIHRoZSBhbGwgVkxBTnMgam9pbiBzaW5jZSB3ZSB3aWxsIGhhdmUgcHJvcGVyCi0JICogVkxBTiBlbnRyaWVzIGZyb20gbm93IG9uCi0JICovCi0JcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0pPSU5fQUxMX1ZMQU5fRU4pOwotCXJlZyAmPSB+QklUKHBvcnQpOwotCWlmICgocmVnICYgQklUKGNwdV9wb3J0KSkgPT0gQklUKGNwdV9wb3J0KSkKLQkJcmVnICY9IH5CSVQoY3B1X3BvcnQpOwotCWNvcmVfd3JpdGVsKHByaXYsIHJlZywgQ09SRV9KT0lOX0FMTF9WTEFOX0VOKTsKLQotCXByaXYtPnBvcnRfc3RzW3BvcnRdLmJyaWRnZV9kZXYgPSBicmlkZ2U7Ci0JcF9jdGwgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKHBvcnQpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMubnVtX3BvcnRzOyBpKyspIHsKLQkJaWYgKHByaXYtPnBvcnRfc3RzW2ldLmJyaWRnZV9kZXYgIT0gYnJpZGdlKQotCQkJY29udGludWU7Ci0KLQkJLyogQWRkIHRoaXMgbG9jYWwgcG9ydCB0byB0aGUgcmVtb3RlIHBvcnQgVkxBTiBjb250cm9sCi0JCSAqIG1lbWJlcnNoaXAgYW5kIHVwZGF0ZSB0aGUgcmVtb3RlIHBvcnQgYml0bWFzawotCQkgKi8KLQkJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX1BPUlRfVkxBTl9DVExfUE9SVChpKSk7Ci0JCXJlZyB8PSAxIDw8IHBvcnQ7Ci0JCWNvcmVfd3JpdGVsKHByaXYsIHJlZywgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQoaSkpOwotCQlwcml2LT5wb3J0X3N0c1tpXS52bGFuX2N0bF9tYXNrID0gcmVnOwotCi0JCXBfY3RsIHw9IDEgPDwgaTsKLQl9Ci0KLQkvKiBDb25maWd1cmUgdGhlIGxvY2FsIHBvcnQgVkxBTiBjb250cm9sIG1lbWJlcnNoaXAgdG8gaW5jbHVkZQotCSAqIHJlbW90ZSBwb3J0cyBhbmQgdXBkYXRlIHRoZSBsb2NhbCBwb3J0IGJpdG1hc2sKLQkgKi8KLQljb3JlX3dyaXRlbChwcml2LCBwX2N0bCwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQocG9ydCkpOwotCXByaXYtPnBvcnRfc3RzW3BvcnRdLnZsYW5fY3RsX21hc2sgPSBwX2N0bDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBiY21fc2YyX3N3X2JyX2xlYXZlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCi17Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2UgPSBwcml2LT5wb3J0X3N0c1twb3J0XS5icmlkZ2VfZGV2OwotCXM4IGNwdV9wb3J0ID0gZHMtPmRzdC0+Y3B1X3BvcnQ7Ci0JdW5zaWduZWQgaW50IGk7Ci0JdTMyIHJlZywgcF9jdGw7Ci0KLQlwX2N0bCA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQocG9ydCkpOwotCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPmh3X3BhcmFtcy5udW1fcG9ydHM7IGkrKykgewotCQkvKiBEb24ndCB0b3VjaCB0aGUgcmVtYWluaW5nIHBvcnRzICovCi0JCWlmIChwcml2LT5wb3J0X3N0c1tpXS5icmlkZ2VfZGV2ICE9IGJyaWRnZSkKLQkJCWNvbnRpbnVlOwotCi0JCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQoaSkpOwotCQlyZWcgJj0gfigxIDw8IHBvcnQpOwotCQljb3JlX3dyaXRlbChwcml2LCByZWcsIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKGkpKTsKLQkJcHJpdi0+cG9ydF9zdHNbcG9ydF0udmxhbl9jdGxfbWFzayA9IHJlZzsKLQotCQkvKiBQcmV2ZW50IHNlbGYgcmVtb3ZhbCB0byBwcmVzZXJ2ZSBpc29sYXRpb24gKi8KLQkJaWYgKHBvcnQgIT0gaSkKLQkJCXBfY3RsICY9IH4oMSA8PCBpKTsKLQl9Ci0KLQljb3JlX3dyaXRlbChwcml2LCBwX2N0bCwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQocG9ydCkpOwotCXByaXYtPnBvcnRfc3RzW3BvcnRdLnZsYW5fY3RsX21hc2sgPSBwX2N0bDsKLQlwcml2LT5wb3J0X3N0c1twb3J0XS5icmlkZ2VfZGV2ID0gTlVMTDsKLQotCS8qIE1ha2UgdGhpcyBwb3J0IGpvaW4gYWxsIFZMQU5zIHdpdGhvdXQgVkxBTiBlbnRyaWVzICovCi0JcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0pPSU5fQUxMX1ZMQU5fRU4pOwotCXJlZyB8PSBCSVQocG9ydCk7Ci0JaWYgKCEocmVnICYgQklUKGNwdV9wb3J0KSkpCi0JCXJlZyB8PSBCSVQoY3B1X3BvcnQpOwotCWNvcmVfd3JpdGVsKHByaXYsIHJlZywgQ09SRV9KT0lOX0FMTF9WTEFOX0VOKTsKLX0KLQotc3RhdGljIHZvaWQgYmNtX3NmMl9zd19icl9zZXRfc3RwX3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkJCXU4IHN0YXRlKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQl1OCBod19zdGF0ZSwgY3VyX2h3X3N0YXRlOwotCXUzMiByZWc7Ci0KLQlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfR19QQ1RMX1BPUlQocG9ydCkpOwotCWN1cl9od19zdGF0ZSA9IHJlZyAmIChHX01JU1RQX1NUQVRFX01BU0sgPDwgR19NSVNUUF9TVEFURV9TSElGVCk7Ci0KLQlzd2l0Y2ggKHN0YXRlKSB7Ci0JY2FzZSBCUl9TVEFURV9ESVNBQkxFRDoKLQkJaHdfc3RhdGUgPSBHX01JU1RQX0RJU19TVEFURTsKLQkJYnJlYWs7Ci0JY2FzZSBCUl9TVEFURV9MSVNURU5JTkc6Ci0JCWh3X3N0YXRlID0gR19NSVNUUF9MSVNURU5fU1RBVEU7Ci0JCWJyZWFrOwotCWNhc2UgQlJfU1RBVEVfTEVBUk5JTkc6Ci0JCWh3X3N0YXRlID0gR19NSVNUUF9MRUFSTl9TVEFURTsKLQkJYnJlYWs7Ci0JY2FzZSBCUl9TVEFURV9GT1JXQVJESU5HOgotCQlod19zdGF0ZSA9IEdfTUlTVFBfRldEX1NUQVRFOwotCQlicmVhazsKLQljYXNlIEJSX1NUQVRFX0JMT0NLSU5HOgotCQlod19zdGF0ZSA9IEdfTUlTVFBfQkxPQ0tfU1RBVEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXByX2VycigiJXM6IGludmFsaWQgU1RQIHN0YXRlOiAlZFxuIiwgX19mdW5jX18sIHN0YXRlKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEZhc3QtYWdlIEFSTCBlbnRyaWVzIGlmIHdlIGFyZSBtb3ZpbmcgYSBwb3J0IGZyb20gTGVhcm5pbmcgb3IKLQkgKiBGb3J3YXJkaW5nIChjdXJfaHdfc3RhdGUpIHN0YXRlIHRvIERpc2FibGVkLCBCbG9ja2luZyBvciBMaXN0ZW5pbmcKLQkgKiBzdGF0ZSAoaHdfc3RhdGUpCi0JICovCi0JaWYgKGN1cl9od19zdGF0ZSAhPSBod19zdGF0ZSkgewotCQlpZiAoY3VyX2h3X3N0YXRlID49IEdfTUlTVFBfTEVBUk5fU1RBVEUgJiYKLQkJICAgIGh3X3N0YXRlIDw9IEdfTUlTVFBfTElTVEVOX1NUQVRFKSB7Ci0JCQlpZiAoYmNtX3NmMl9zd19mYXN0X2FnZV9wb3J0KGRzLCBwb3J0KSkgewotCQkJCXByX2VycigiJXM6IGZhc3QtYWdlaW5nIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9HX1BDVExfUE9SVChwb3J0KSk7Ci0JcmVnICY9IH4oR19NSVNUUF9TVEFURV9NQVNLIDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpOwotCXJlZyB8PSBod19zdGF0ZTsKLQljb3JlX3dyaXRlbChwcml2LCByZWcsIENPUkVfR19QQ1RMX1BPUlQocG9ydCkpOwotfQotCi0vKiBBZGRyZXNzIFJlc29sdXRpb24gTG9naWMgcm91dGluZXMgKi8KLXN0YXRpYyBpbnQgYmNtX3NmMl9hcmxfb3Bfd2FpdChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTA7Ci0JdTMyIHJlZzsKLQotCWRvIHsKLQkJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0FSTEFfUldDVEwpOwotCQlpZiAoIShyZWcgJiBBUkxfU1RSVEROKSkKLQkJCXJldHVybiAwOwotCi0JCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQl9IHdoaWxlICh0aW1lb3V0LS0pOwotCi0JcmV0dXJuIC1FVElNRURPVVQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9hcmxfcndfb3Aoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdW5zaWduZWQgaW50IG9wKQotewotCXUzMiBjbWQ7Ci0KLQlpZiAob3AgPiBBUkxfUlcpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JY21kID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0FSTEFfUldDVEwpOwotCWNtZCAmPSB+SVZMX1NWTF9TRUxFQ1Q7Ci0JY21kIHw9IEFSTF9TVFJURE47Ci0JaWYgKG9wKQotCQljbWQgfD0gQVJMX1JXOwotCWVsc2UKLQkJY21kICY9IH5BUkxfUlc7Ci0JY29yZV93cml0ZWwocHJpdiwgY21kLCBDT1JFX0FSTEFfUldDVEwpOwotCi0JcmV0dXJuIGJjbV9zZjJfYXJsX29wX3dhaXQocHJpdik7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9hcmxfcmVhZChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCB1NjQgbWFjLAotCQkJICAgIHUxNiB2aWQsIHN0cnVjdCBiY21fc2YyX2FybF9lbnRyeSAqZW50LCB1OCAqaWR4LAotCQkJICAgIGJvb2wgaXNfdmFsaWQpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JaW50IHJldDsKLQotCXJldCA9IGJjbV9zZjJfYXJsX29wX3dhaXQocHJpdik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFJlYWQgdGhlIDQgYmlucyAqLwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJdTY0IG1hY192aWQ7Ci0JCXUzMiBmd2RfZW50cnk7Ci0KLQkJbWFjX3ZpZCA9IGNvcmVfcmVhZHEocHJpdiwgQ09SRV9BUkxBX01BQ1ZJRF9FTlRSWShpKSk7Ci0JCWZ3ZF9lbnRyeSA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9BUkxBX0ZXRF9FTlRSWShpKSk7Ci0JCWJjbV9zZjJfYXJsX3RvX2VudHJ5KGVudCwgbWFjX3ZpZCwgZndkX2VudHJ5KTsKLQotCQlpZiAoZW50LT5pc192YWxpZCAmJiBpc192YWxpZCkgewotCQkJKmlkeCA9IGk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qIFRoaXMgaXMgdGhlIE1BQyB3ZSBqdXN0IGRlbGV0ZWQgKi8KLQkJaWYgKCFpc192YWxpZCAmJiAobWFjX3ZpZCAmIG1hYykpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gLUVOT0VOVDsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX2FybF9vcChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCBpbnQgb3AsIGludCBwb3J0LAotCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkLCBib29sIGlzX3ZhbGlkKQotewotCXN0cnVjdCBiY21fc2YyX2FybF9lbnRyeSBlbnQ7Ci0JdTMyIGZ3ZF9lbnRyeTsKLQl1NjQgbWFjLCBtYWNfdmlkID0gMDsKLQl1OCBpZHggPSAwOwotCWludCByZXQ7Ci0KLQkvKiBDb252ZXJ0IHRoZSBhcnJheSBpbnRvIGEgNjQtYml0IE1BQyAqLwotCW1hYyA9IGJjbV9zZjJfbWFjX3RvX3U2NChhZGRyKTsKLQotCS8qIFBlcmZvcm0gYSByZWFkIGZvciB0aGUgZ2l2ZW4gTUFDIGFuZCBWSUQgKi8KLQljb3JlX3dyaXRlcShwcml2LCBtYWMsIENPUkVfQVJMQV9NQUMpOwotCWNvcmVfd3JpdGVsKHByaXYsIHZpZCwgQ09SRV9BUkxBX1ZJRCk7Ci0KLQkvKiBJc3N1ZSBhIHJlYWQgb3BlcmF0aW9uIGZvciB0aGlzIE1BQyAqLwotCXJldCA9IGJjbV9zZjJfYXJsX3J3X29wKHByaXYsIDEpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBiY21fc2YyX2FybF9yZWFkKHByaXYsIG1hYywgdmlkLCAmZW50LCAmaWR4LCBpc192YWxpZCk7Ci0JLyogSWYgdGhpcyBpcyBhIHJlYWQsIGp1c3QgZmluaXNoIG5vdyAqLwotCWlmIChvcCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFdlIGNvdWxkIG5vdCBmaW5kIGEgbWF0Y2hpbmcgTUFDLCBzbyByZXNldCB0byBhIG5ldyBlbnRyeSAqLwotCWlmIChyZXQpIHsKLQkJZndkX2VudHJ5ID0gMDsKLQkJaWR4ID0gMDsKLQl9Ci0KLQltZW1zZXQoJmVudCwgMCwgc2l6ZW9mKGVudCkpOwotCWVudC5wb3J0ID0gcG9ydDsKLQllbnQuaXNfdmFsaWQgPSBpc192YWxpZDsKLQllbnQudmlkID0gdmlkOwotCWVudC5pc19zdGF0aWMgPSB0cnVlOwotCW1lbWNweShlbnQubWFjLCBhZGRyLCBFVEhfQUxFTik7Ci0JYmNtX3NmMl9hcmxfZnJvbV9lbnRyeSgmbWFjX3ZpZCwgJmZ3ZF9lbnRyeSwgJmVudCk7Ci0KLQljb3JlX3dyaXRlcShwcml2LCBtYWNfdmlkLCBDT1JFX0FSTEFfTUFDVklEX0VOVFJZKGlkeCkpOwotCWNvcmVfd3JpdGVsKHByaXYsIGZ3ZF9lbnRyeSwgQ09SRV9BUkxBX0ZXRF9FTlRSWShpZHgpKTsKLQotCXJldCA9IGJjbV9zZjJfYXJsX3J3X29wKHByaXYsIDApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBSZS1yZWFkIHRoZSBlbnRyeSB0byBjaGVjayAqLwotCXJldHVybiBiY21fc2YyX2FybF9yZWFkKHByaXYsIG1hYywgdmlkLCAmZW50LCAmaWR4LCBpc192YWxpZCk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9zd19mZGJfcHJlcGFyZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJCSAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKLQkJCQkgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQotewotCS8qIFdlIGRvIG5vdCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpZmljIGhlcmUgeWV0ICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfZmRiX2FkZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCi0JCQkgICAgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCi17Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCi0JaWYgKGJjbV9zZjJfYXJsX29wKHByaXYsIDAsIHBvcnQsIGZkYi0+YWRkciwgZmRiLT52aWQsIHRydWUpKQotCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gYWRkIE1BQyBhZGRyZXNzXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9zd19mZGJfZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQotCXJldHVybiBiY21fc2YyX2FybF9vcChwcml2LCAwLCBwb3J0LCBmZGItPmFkZHIsIGZkYi0+dmlkLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9hcmxfc2VhcmNoX3dhaXQoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCB0aW1lb3V0ID0gMTAwMDsKLQl1MzIgcmVnOwotCi0JZG8gewotCQlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfQVJMQV9TUkNIX0NUTCk7Ci0JCWlmICghKHJlZyAmIEFSTEFfU1JDSF9TVEROKSkKLQkJCXJldHVybiAwOwotCi0JCWlmIChyZWcgJiBBUkxBX1NSQ0hfVkxJRCkKLQkJCXJldHVybiAwOwotCi0JCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQl9IHdoaWxlICh0aW1lb3V0LS0pOwotCi0JcmV0dXJuIC1FVElNRURPVVQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbV9zZjJfYXJsX3NlYXJjaF9yZChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCB1OCBpZHgsCi0JCQkJICBzdHJ1Y3QgYmNtX3NmMl9hcmxfZW50cnkgKmVudCkKLXsKLQl1NjQgbWFjX3ZpZDsKLQl1MzIgZndkX2VudHJ5OwotCi0JbWFjX3ZpZCA9IGNvcmVfcmVhZHEocHJpdiwgQ09SRV9BUkxBX1NSQ0hfUlNMVF9NQUNWSUQoaWR4KSk7Ci0JZndkX2VudHJ5ID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0FSTEFfU1JDSF9SU0xUKGlkeCkpOwotCWJjbV9zZjJfYXJsX3RvX2VudHJ5KGVudCwgbWFjX3ZpZCwgZndkX2VudHJ5KTsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX3N3X2ZkYl9jb3B5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBwb3J0LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBiY21fc2YyX2FybF9lbnRyeSAqZW50LAotCQkJICAgICAgIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCi0JCQkgICAgICAgaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQotewotCWlmICghZW50LT5pc192YWxpZCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAocG9ydCAhPSBlbnQtPnBvcnQpCi0JCXJldHVybiAwOwotCi0JZXRoZXJfYWRkcl9jb3B5KGZkYi0+YWRkciwgZW50LT5tYWMpOwotCWZkYi0+dmlkID0gZW50LT52aWQ7Ci0JZmRiLT5uZG1fc3RhdGUgPSBlbnQtPmlzX3N0YXRpYyA/IE5VRF9OT0FSUCA6IE5VRF9SRUFDSEFCTEU7Ci0KLQlyZXR1cm4gY2IoJmZkYi0+b2JqKTsKLX0KLQotc3RhdGljIGludCBiY21fc2YyX3N3X2ZkYl9kdW1wKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkgICAgICAgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKLQkJCSAgICAgICBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCi17Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2OwotCXN0cnVjdCBiY21fc2YyX2FybF9lbnRyeSByZXN1bHRzWzJdOwotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0JaW50IHJldDsKLQotCS8qIFN0YXJ0IHNlYXJjaCBvcGVyYXRpb24gKi8KLQljb3JlX3dyaXRlbChwcml2LCBBUkxBX1NSQ0hfU1RETiwgQ09SRV9BUkxBX1NSQ0hfQ1RMKTsKLQotCWRvIHsKLQkJcmV0ID0gYmNtX3NmMl9hcmxfc2VhcmNoX3dhaXQocHJpdik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCS8qIFJlYWQgYm90aCBlbnRyaWVzLCB0aGVuIHJldHVybiB0aGVpciB2YWx1ZXMgYmFjayAqLwotCQliY21fc2YyX2FybF9zZWFyY2hfcmQocHJpdiwgMCwgJnJlc3VsdHNbMF0pOwotCQlyZXQgPSBiY21fc2YyX3N3X2ZkYl9jb3B5KGRldiwgcG9ydCwgJnJlc3VsdHNbMF0sIGZkYiwgY2IpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQliY21fc2YyX2FybF9zZWFyY2hfcmQocHJpdiwgMSwgJnJlc3VsdHNbMV0pOwotCQlyZXQgPSBiY21fc2YyX3N3X2ZkYl9jb3B5KGRldiwgcG9ydCwgJnJlc3VsdHNbMV0sIGZkYiwgY2IpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlpZiAoIXJlc3VsdHNbMF0uaXNfdmFsaWQgJiYgIXJlc3VsdHNbMV0uaXNfdmFsaWQpCi0JCQlicmVhazsKLQotCX0gd2hpbGUgKGNvdW50KysgPCBDT1JFX0FSTEFfTlVNX0VOVFJJRVMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgYmNtX3NmMl9zd19pbmRpcl9ydyhzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCBpbnQgb3AsIGludCBhZGRyLAogCQkJICAgICAgIGludCByZWdudW0sIHUxNiB2YWwpCiB7CkBAIC0xMDM2LDEyICs0NjQsMTAgQEAKIAogc3RhdGljIHZvaWQgYmNtX3NmMl9pbnRyX2Rpc2FibGUoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdikKIHsKLQlpbnRybDJfMF93cml0ZWwocHJpdiwgMHhmZmZmZmZmZiwgSU5UUkwyX0NQVV9NQVNLX1NFVCk7CisJaW50cmwyXzBfbWFza19zZXQocHJpdiwgMHhmZmZmZmZmZik7CiAJaW50cmwyXzBfd3JpdGVsKHByaXYsIDB4ZmZmZmZmZmYsIElOVFJMMl9DUFVfQ0xFQVIpOwotCWludHJsMl8wX3dyaXRlbChwcml2LCAwLCBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOwotCWludHJsMl8xX3dyaXRlbChwcml2LCAweGZmZmZmZmZmLCBJTlRSTDJfQ1BVX01BU0tfU0VUKTsKKwlpbnRybDJfMV9tYXNrX3NldChwcml2LCAweGZmZmZmZmZmKTsKIAlpbnRybDJfMV93cml0ZWwocHJpdiwgMHhmZmZmZmZmZiwgSU5UUkwyX0NQVV9DTEVBUik7Ci0JaW50cmwyXzFfd3JpdGVsKHByaXYsIDAsIElOVFJMMl9DUFVfTUFTS19DTEVBUik7CiB9CiAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfaWRlbnRpZnlfcG9ydHMoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwKQEAgLTEwODIsNyArNTA4LDcgQEAKIAogc3RhdGljIGludCBiY21fc2YyX21kaW9fcmVnaXN0ZXIoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCXN0YXRpYyBpbnQgaW5kZXg7CiAJaW50IGVycjsKQEAgLTExNDYsMTQgKzU3Miw5IEBACiAJCW9mX25vZGVfcHV0KHByaXYtPm1hc3Rlcl9taWlfZG4pOwogfQogCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfc2V0X2FkZHIoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCB1OCAqYWRkcikKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHUzMiBiY21fc2YyX3N3X2dldF9waHlfZmxhZ3Moc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAKIAkvKiBUaGUgQkNNN3h4eCBQSFkgZHJpdmVyIGV4cGVjdHMgdG8gZmluZCB0aGUgaW50ZWdyYXRlZCBQSFkgcmV2aXNpb24KIAkgKiBpbiBiaXRzIDE1OjggYW5kIHRoZSBwYXRjaCBsZXZlbCBpbiBiaXRzIDc6MCB3aGljaCBpcyBleGFjdGx5IHdoYXQKQEAgLTExNjYsNyArNTg3LDcgQEAKIHN0YXRpYyB2b2lkIGJjbV9zZjJfc3dfYWRqdXN0X2xpbmsoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkgICBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1MzIgaWRfbW9kZV9kaXMgPSAwLCBwb3J0X21vZGU7CiAJY29uc3QgY2hhciAqc3RyID0gTlVMTDsKIAl1MzIgcmVnOwpAQCAtMTI0Niw3ICs2NjcsNyBAQAogc3RhdGljIHZvaWQgYmNtX3NmMl9zd19maXhlZF9saW5rX3VwZGF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCQkgc3RydWN0IGZpeGVkX3BoeV9zdGF0dXMgKnN0YXR1cykKIHsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGJjbV9zZjJfdG9fcHJpdihkcyk7CiAJdTMyIGR1cGxleCwgcGF1c2U7CiAJdTMyIHJlZzsKIApAQCAtMTI5OCw3ICs3MTksNyBAQAogCiBzdGF0aWMgaW50IGJjbV9zZjJfc3dfc3VzcGVuZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXVuc2lnbmVkIGludCBwb3J0OwogCiAJYmNtX3NmMl9pbnRyX2Rpc2FibGUocHJpdik7CkBAIC0xMzE4LDcgKzczOSw3IEBACiAKIHN0YXRpYyBpbnQgYmNtX3NmMl9zd19yZXN1bWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1bnNpZ25lZCBpbnQgcG9ydDsKIAlpbnQgcmV0OwogCkBAIC0xMzQ1LDcgKzc2Niw3IEBACiAJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpwID0gZHMtPmRzdFtkcy0+aW5kZXhdLm1hc3Rlcl9uZXRkZXY7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXN0cnVjdCBldGh0b29sX3dvbGluZm8gcHdvbDsKIAogCS8qIEdldCB0aGUgcGFyZW50IGRldmljZSBXb0wgc2V0dGluZ3MgKi8KQEAgLTEzNjgsNyArNzg5LDcgQEAKIAkJCSAgICAgIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcCA9IGRzLT5kc3RbZHMtPmluZGV4XS5tYXN0ZXJfbmV0ZGV2OwotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAlzOCBjcHVfcG9ydCA9IGRzLT5kc3RbZHMtPmluZGV4XS5jcHVfcG9ydDsKIAlzdHJ1Y3QgZXRodG9vbF93b2xpbmZvIHB3b2w7CiAKQEAgLTEzOTMsNDMgKzgxNCwzMiBAQAogCXJldHVybiBwLT5ldGh0b29sX29wcy0+c2V0X3dvbChwLCB3b2wpOwogfQogCi1zdGF0aWMgdm9pZCBiY21fc2YyX2VuYWJsZV92bGFuKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIGJvb2wgZW5hYmxlKQorc3RhdGljIGludCBiY21fc2YyX3ZsYW5fb3Bfd2FpdChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2KQogewotCXUzMiBtZ210LCB2YzAsIHZjMSwgdmM0LCB2YzU7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDsKKwl1MzIgcmVnOwogCi0JbWdtdCA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9TV01PREUpOwotCXZjMCA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9WTEFOX0NUUkwwKTsKLQl2YzEgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfVkxBTl9DVFJMMSk7Ci0JdmM0ID0gY29yZV9yZWFkbChwcml2LCBDT1JFX1ZMQU5fQ1RSTDQpOwotCXZjNSA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9WTEFOX0NUUkw1KTsKKwlkbyB7CisJCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9BUkxBX1ZUQkxfUldDVFJMKTsKKwkJaWYgKCEocmVnICYgQVJMQV9WVEJMX1NURE4pKQorCQkJcmV0dXJuIDA7CiAKLQltZ210ICY9IH5TV19GV0RHX01PREU7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9IHdoaWxlICh0aW1lb3V0LS0pOwogCi0JaWYgKGVuYWJsZSkgewotCQl2YzAgfD0gVkxBTl9FTiB8IFZMQU5fTEVBUk5fTU9ERV9JVkw7Ci0JCXZjMSB8PSBFTl9SU1ZfTUNBU1RfVU5UQUcgfCBFTl9SU1ZfTUNBU1RfRldETUFQOwotCQl2YzQgJj0gfihJTkdSX1ZJRF9DSEtfTUFTSyA8PCBJTkdSX1ZJRF9DSEtfU0hJRlQpOwotCQl2YzQgfD0gSU5HUl9WSURfQ0hLX0RST1A7Ci0JCXZjNSB8PSBEUk9QX1ZUQUJMRV9NSVNTIHwgRU5fVklEX0ZGRl9GV0Q7Ci0JfSBlbHNlIHsKLQkJdmMwICY9IH4oVkxBTl9FTiB8IFZMQU5fTEVBUk5fTU9ERV9JVkwpOwotCQl2YzEgJj0gfihFTl9SU1ZfTUNBU1RfVU5UQUcgfCBFTl9SU1ZfTUNBU1RfRldETUFQKTsKLQkJdmM0ICY9IH4oSU5HUl9WSURfQ0hLX01BU0sgPDwgSU5HUl9WSURfQ0hLX1NISUZUKTsKLQkJdmM1ICY9IH4oRFJPUF9WVEFCTEVfTUlTUyB8IEVOX1ZJRF9GRkZfRldEKTsKLQkJdmM0IHw9IElOR1JfVklEX0NIS19WSURfVklPTF9JTVA7Ci0JfQorCXJldHVybiAtRVRJTUVET1VUOworfQogCi0JY29yZV93cml0ZWwocHJpdiwgdmMwLCBDT1JFX1ZMQU5fQ1RSTDApOwotCWNvcmVfd3JpdGVsKHByaXYsIHZjMSwgQ09SRV9WTEFOX0NUUkwxKTsKLQljb3JlX3dyaXRlbChwcml2LCAwLCBDT1JFX1ZMQU5fQ1RSTDMpOwotCWNvcmVfd3JpdGVsKHByaXYsIHZjNCwgQ09SRV9WTEFOX0NUUkw0KTsKLQljb3JlX3dyaXRlbChwcml2LCB2YzUsIENPUkVfVkxBTl9DVFJMNSk7Ci0JY29yZV93cml0ZWwocHJpdiwgbWdtdCwgQ09SRV9TV01PREUpOworc3RhdGljIGludCBiY21fc2YyX3ZsYW5fb3Aoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdTggb3ApCit7CisJY29yZV93cml0ZWwocHJpdiwgQVJMQV9WVEJMX1NURE4gfCBvcCwgQ09SRV9BUkxBX1ZUQkxfUldDVFJMKTsKKworCXJldHVybiBiY21fc2YyX3ZsYW5fb3Bfd2FpdChwcml2KTsKIH0KIAogc3RhdGljIHZvaWQgYmNtX3NmMl9zd19jb25maWd1cmVfdmxhbihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBiY21fc2YyX3RvX3ByaXYoZHMpOwogCXVuc2lnbmVkIGludCBwb3J0OwogCiAJLyogQ2xlYXIgYWxsIFZMQU5zICovCkBAIC0xNDQzLDE2MiArODUzLDE5OSBAQAogCX0KIH0KIAotc3RhdGljIGludCBiY21fc2YyX3N3X3ZsYW5fZmlsdGVyaW5nKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkJICAgICBib29sIHZsYW5fZmlsdGVyaW5nKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfdmxhbl9wcmVwYXJlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkJICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuLAotCQkJCSAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQotCWJjbV9zZjJfZW5hYmxlX3ZsYW4ocHJpdiwgdHJ1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmNtX3NmMl9zd192bGFuX2FkZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAotCQkJCWNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiAqdmxhbiwKLQkJCQlzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKLXsKLQlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7Ci0JYm9vbCB1bnRhZ2dlZCA9IHZsYW4tPmZsYWdzICYgQlJJREdFX1ZMQU5fSU5GT19VTlRBR0dFRDsKLQlib29sIHB2aWQgPSB2bGFuLT5mbGFncyAmIEJSSURHRV9WTEFOX0lORk9fUFZJRDsKLQlzOCBjcHVfcG9ydCA9IGRzLT5kc3QtPmNwdV9wb3J0OwotCXN0cnVjdCBiY21fc2YyX3ZsYW4gKnZsOwotCXUxNiB2aWQ7Ci0KLQlmb3IgKHZpZCA9IHZsYW4tPnZpZF9iZWdpbjsgdmlkIDw9IHZsYW4tPnZpZF9lbmQ7ICsrdmlkKSB7Ci0JCXZsID0gJnByaXYtPnZsYW5zW3ZpZF07Ci0KLQkJYmNtX3NmMl9nZXRfdmxhbl9lbnRyeShwcml2LCB2aWQsIHZsKTsKLQotCQl2bC0+bWVtYmVycyB8PSBCSVQocG9ydCkgfCBCSVQoY3B1X3BvcnQpOwotCQlpZiAodW50YWdnZWQpCi0JCQl2bC0+dW50YWcgfD0gQklUKHBvcnQpIHwgQklUKGNwdV9wb3J0KTsKLQkJZWxzZQotCQkJdmwtPnVudGFnICY9IH4oQklUKHBvcnQpIHwgQklUKGNwdV9wb3J0KSk7Ci0KLQkJYmNtX3NmMl9zZXRfdmxhbl9lbnRyeShwcml2LCB2aWQsIHZsKTsKLQkJYmNtX3NmMl9zd19mYXN0X2FnZV92bGFuKHByaXYsIHZpZCk7Ci0JfQotCi0JaWYgKHB2aWQpIHsKLQkJY29yZV93cml0ZWwocHJpdiwgdmxhbi0+dmlkX2VuZCwgQ09SRV9ERUZBVUxUXzFRX1RBR19QKHBvcnQpKTsKLQkJY29yZV93cml0ZWwocHJpdiwgdmxhbi0+dmlkX2VuZCwKLQkJCSAgICBDT1JFX0RFRkFVTFRfMVFfVEFHX1AoY3B1X3BvcnQpKTsKLQkJYmNtX3NmMl9zd19mYXN0X2FnZV92bGFuKHByaXYsIHZpZCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGJjbV9zZjJfc3dfdmxhbl9kZWwoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4pCi17Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCWJvb2wgdW50YWdnZWQgPSB2bGFuLT5mbGFncyAmIEJSSURHRV9WTEFOX0lORk9fVU5UQUdHRUQ7Ci0JczggY3B1X3BvcnQgPSBkcy0+ZHN0LT5jcHVfcG9ydDsKLQlzdHJ1Y3QgYmNtX3NmMl92bGFuICp2bDsKLQl1MTYgdmlkLCBwdmlkOwotCWludCByZXQ7Ci0KLQlwdmlkID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0RFRkFVTFRfMVFfVEFHX1AocG9ydCkpOwotCi0JZm9yICh2aWQgPSB2bGFuLT52aWRfYmVnaW47IHZpZCA8PSB2bGFuLT52aWRfZW5kOyArK3ZpZCkgewotCQl2bCA9ICZwcml2LT52bGFuc1t2aWRdOwotCi0JCXJldCA9IGJjbV9zZjJfZ2V0X3ZsYW5fZW50cnkocHJpdiwgdmlkLCB2bCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCXZsLT5tZW1iZXJzICY9IH5CSVQocG9ydCk7Ci0JCWlmICgodmwtPm1lbWJlcnMgJiBCSVQoY3B1X3BvcnQpKSA9PSBCSVQoY3B1X3BvcnQpKQotCQkJdmwtPm1lbWJlcnMgPSAwOwotCQlpZiAocHZpZCA9PSB2aWQpCi0JCQlwdmlkID0gMDsKLQkJaWYgKHVudGFnZ2VkKSB7Ci0JCQl2bC0+dW50YWcgJj0gfkJJVChwb3J0KTsKLQkJCWlmICgodmwtPnVudGFnICYgQklUKHBvcnQpKSA9PSBCSVQoY3B1X3BvcnQpKQotCQkJCXZsLT51bnRhZyA9IDA7Ci0JCX0KLQotCQliY21fc2YyX3NldF92bGFuX2VudHJ5KHByaXYsIHZpZCwgdmwpOwotCQliY21fc2YyX3N3X2Zhc3RfYWdlX3ZsYW4ocHJpdiwgdmlkKTsKLQl9Ci0KLQljb3JlX3dyaXRlbChwcml2LCBwdmlkLCBDT1JFX0RFRkFVTFRfMVFfVEFHX1AocG9ydCkpOwotCWNvcmVfd3JpdGVsKHByaXYsIHB2aWQsIENPUkVfREVGQVVMVF8xUV9UQUdfUChjcHVfcG9ydCkpOwotCWJjbV9zZjJfc3dfZmFzdF9hZ2Vfdmxhbihwcml2LCB2aWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtX3NmMl9zd192bGFuX2R1bXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKLQkJCQlzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4sCi0JCQkJaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQotewotCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKLQlzdHJ1Y3QgYmNtX3NmMl9wb3J0X3N0YXR1cyAqcCA9ICZwcml2LT5wb3J0X3N0c1twb3J0XTsKLQlzdHJ1Y3QgYmNtX3NmMl92bGFuICp2bDsKLQl1MTYgdmlkLCBwdmlkOwotCWludCBlcnIgPSAwOwotCi0JcHZpZCA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9ERUZBVUxUXzFRX1RBR19QKHBvcnQpKTsKLQotCWZvciAodmlkID0gMDsgdmlkIDwgVkxBTl9OX1ZJRDsgdmlkKyspIHsKLQkJdmwgPSAmcHJpdi0+dmxhbnNbdmlkXTsKLQotCQlpZiAoISh2bC0+bWVtYmVycyAmIEJJVChwb3J0KSkpCi0JCQljb250aW51ZTsKLQotCQl2bGFuLT52aWRfYmVnaW4gPSB2bGFuLT52aWRfZW5kID0gdmlkOwotCQl2bGFuLT5mbGFncyA9IDA7Ci0KLQkJaWYgKHZsLT51bnRhZyAmIEJJVChwb3J0KSkKLQkJCXZsYW4tPmZsYWdzIHw9IEJSSURHRV9WTEFOX0lORk9fVU5UQUdHRUQ7Ci0JCWlmIChwLT5wdmlkID09IHZpZCkKLQkJCXZsYW4tPmZsYWdzIHw9IEJSSURHRV9WTEFOX0lORk9fUFZJRDsKLQotCQllcnIgPSBjYigmdmxhbi0+b2JqKTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KIHN0YXRpYyBpbnQgYmNtX3NmMl9zd19zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7Ci0JY29uc3QgY2hhciAqcmVnX25hbWVzW0JDTV9TRjJfUkVHU19OVU1dID0gQkNNX1NGMl9SRUdTX05BTUU7Ci0Jc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47Ci0Jdm9pZCBfX2lvbWVtICoqYmFzZTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gYmNtX3NmMl90b19wcml2KGRzKTsKIAl1bnNpZ25lZCBpbnQgcG9ydDsKKworCS8qIEVuYWJsZSBhbGwgdmFsaWQgcG9ydHMgYW5kIGRpc2FibGUgdGhvc2UgdW51c2VkICovCisJZm9yIChwb3J0ID0gMDsgcG9ydCA8IHByaXYtPmh3X3BhcmFtcy5udW1fcG9ydHM7IHBvcnQrKykgeworCQkvKiBJTVAgcG9ydCByZWNlaXZlcyBzcGVjaWFsIHRyZWF0bWVudCAqLworCQlpZiAoKDEgPDwgcG9ydCkgJiBkcy0+ZW5hYmxlZF9wb3J0X21hc2spCisJCQliY21fc2YyX3BvcnRfc2V0dXAoZHMsIHBvcnQsIE5VTEwpOworCQllbHNlIGlmIChkc2FfaXNfY3B1X3BvcnQoZHMsIHBvcnQpKQorCQkJYmNtX3NmMl9pbXBfc2V0dXAoZHMsIHBvcnQpOworCQllbHNlCisJCQliY21fc2YyX3BvcnRfZGlzYWJsZShkcywgcG9ydCwgTlVMTCk7CisJfQorCisJYmNtX3NmMl9zd19jb25maWd1cmVfdmxhbihkcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIFNXSVRDSF9DT1JFIHJlZ2lzdGVyIHNwYWNlIGlzIG1hbmFnZWQgYnkgYjUzIGJ1dCBvcGVyYXRlcyBvbiBhIHBhZ2UgKworICogcmVnaXN0ZXIgYmFzaXMgc28gd2UgbmVlZCB0byB0cmFuc2xhdGUgdGhhdCBpbnRvIGFuIGFkZHJlc3MgdGhhdCB0aGUKKyAqIGJ1cy1nbHVlIHVuZGVyc3RhbmRzLgorICovCisjZGVmaW5lIFNGMl9QQUdFX1JFR19NS0FERFIocGFnZSwgcmVnKQkoKHBhZ2UpIDw8IDEwIHwgKHJlZykgPDwgMikKKworc3RhdGljIGludCBiY21fc2YyX2NvcmVfcmVhZDgoc3RydWN0IGI1M19kZXZpY2UgKmRldiwgdTggcGFnZSwgdTggcmVnLAorCQkJICAgICAgdTggKnZhbCkKK3sKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJKnZhbCA9IGNvcmVfcmVhZGwocHJpdiwgU0YyX1BBR0VfUkVHX01LQUREUihwYWdlLCByZWcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9zZjJfY29yZV9yZWFkMTYoc3RydWN0IGI1M19kZXZpY2UgKmRldiwgdTggcGFnZSwgdTggcmVnLAorCQkJICAgICAgIHUxNiAqdmFsKQoreworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwkqdmFsID0gY29yZV9yZWFkbChwcml2LCBTRjJfUEFHRV9SRUdfTUtBRERSKHBhZ2UsIHJlZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3NmMl9jb3JlX3JlYWQzMihzdHJ1Y3QgYjUzX2RldmljZSAqZGV2LCB1OCBwYWdlLCB1OCByZWcsCisJCQkgICAgICAgdTMyICp2YWwpCit7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCSp2YWwgPSBjb3JlX3JlYWRsKHByaXYsIFNGMl9QQUdFX1JFR19NS0FERFIocGFnZSwgcmVnKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fc2YyX2NvcmVfcmVhZDY0KHN0cnVjdCBiNTNfZGV2aWNlICpkZXYsIHU4IHBhZ2UsIHU4IHJlZywKKwkJCSAgICAgICB1NjQgKnZhbCkKK3sKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJKnZhbCA9IGNvcmVfcmVhZHEocHJpdiwgU0YyX1BBR0VfUkVHX01LQUREUihwYWdlLCByZWcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9zZjJfY29yZV93cml0ZTgoc3RydWN0IGI1M19kZXZpY2UgKmRldiwgdTggcGFnZSwgdTggcmVnLAorCQkJICAgICAgIHU4IHZhbHVlKQoreworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwljb3JlX3dyaXRlbChwcml2LCB2YWx1ZSwgU0YyX1BBR0VfUkVHX01LQUREUihwYWdlLCByZWcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9zZjJfY29yZV93cml0ZTE2KHN0cnVjdCBiNTNfZGV2aWNlICpkZXYsIHU4IHBhZ2UsIHU4IHJlZywKKwkJCQl1MTYgdmFsdWUpCit7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRldi0+cHJpdjsKKworCWNvcmVfd3JpdGVsKHByaXYsIHZhbHVlLCBTRjJfUEFHRV9SRUdfTUtBRERSKHBhZ2UsIHJlZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3NmMl9jb3JlX3dyaXRlMzIoc3RydWN0IGI1M19kZXZpY2UgKmRldiwgdTggcGFnZSwgdTggcmVnLAorCQkJCXUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZGV2LT5wcml2OworCisJY29yZV93cml0ZWwocHJpdiwgdmFsdWUsIFNGMl9QQUdFX1JFR19NS0FERFIocGFnZSwgcmVnKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fc2YyX2NvcmVfd3JpdGU2NChzdHJ1Y3QgYjUzX2RldmljZSAqZGV2LCB1OCBwYWdlLCB1OCByZWcsCisJCQkJdTY0IHZhbHVlKQoreworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkZXYtPnByaXY7CisKKwljb3JlX3dyaXRlcShwcml2LCB2YWx1ZSwgU0YyX1BBR0VfUkVHX01LQUREUihwYWdlLCByZWcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGI1M19pb19vcHMgYmNtX3NmMl9pb19vcHMgPSB7CisJLnJlYWQ4CT0gYmNtX3NmMl9jb3JlX3JlYWQ4LAorCS5yZWFkMTYJPSBiY21fc2YyX2NvcmVfcmVhZDE2LAorCS5yZWFkMzIJPSBiY21fc2YyX2NvcmVfcmVhZDMyLAorCS5yZWFkNDgJPSBiY21fc2YyX2NvcmVfcmVhZDY0LAorCS5yZWFkNjQJPSBiY21fc2YyX2NvcmVfcmVhZDY0LAorCS53cml0ZTgJPSBiY21fc2YyX2NvcmVfd3JpdGU4LAorCS53cml0ZTE2ID0gYmNtX3NmMl9jb3JlX3dyaXRlMTYsCisJLndyaXRlMzIgPSBiY21fc2YyX2NvcmVfd3JpdGUzMiwKKwkud3JpdGU0OCA9IGJjbV9zZjJfY29yZV93cml0ZTY0LAorCS53cml0ZTY0ID0gYmNtX3NmMl9jb3JlX3dyaXRlNjQsCit9OworCitzdGF0aWMgaW50IGJjbV9zZjJfc3dfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBjaGFyICpyZWdfbmFtZXNbQkNNX1NGMl9SRUdTX05VTV0gPSBCQ01fU0YyX1JFR1NfTkFNRTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGI1M19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2OworCXN0cnVjdCBiNTNfZGV2aWNlICpkZXY7CisJc3RydWN0IGRzYV9zd2l0Y2ggKmRzOworCXZvaWQgX19pb21lbSAqKmJhc2U7CisJc3RydWN0IHJlc291cmNlICpyOwogCXVuc2lnbmVkIGludCBpOwogCXUzMiByZWcsIHJldjsKIAlpbnQgcmV0OwogCisJcHJpdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2ID0gYjUzX3N3aXRjaF9hbGxvYygmcGRldi0+ZGV2LCAmYmNtX3NmMl9pb19vcHMsIHByaXYpOworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEF1dG8tZGV0ZWN0aW9uIHVzaW5nIHN0YW5kYXJkIHJlZ2lzdGVycyB3aWxsIG5vdCB3b3JrLCBzbworCSAqIHByb3ZpZGUgYW4gaW5kaWNhdGlvbiBvZiB3aGF0IGtpbmQgb2YgZGV2aWNlIHdlIGFyZSBmb3IKKwkgKiBiNTNfY29tbW9uIHRvIHdvcmsgd2l0aAorCSAqLworCXBkYXRhLT5jaGlwX2lkID0gQkNNNzQ0NV9ERVZJQ0VfSUQ7CisJZGV2LT5wZGF0YSA9IHBkYXRhOworCisJcHJpdi0+ZGV2ID0gZGV2OworCWRzID0gZGV2LT5kczsKKworCS8qIE92ZXJyaWRlIHRoZSBwYXJ0cyB0aGF0IGFyZSBub24tc3RhbmRhcmQgd3J0LiBub3JtYWwgYjUzIGRldmljZXMgKi8KKwlkcy0+b3BzLT5nZXRfdGFnX3Byb3RvY29sID0gYmNtX3NmMl9zd19nZXRfdGFnX3Byb3RvY29sOworCWRzLT5vcHMtPnNldHVwID0gYmNtX3NmMl9zd19zZXR1cDsKKwlkcy0+b3BzLT5nZXRfcGh5X2ZsYWdzID0gYmNtX3NmMl9zd19nZXRfcGh5X2ZsYWdzOworCWRzLT5vcHMtPmFkanVzdF9saW5rID0gYmNtX3NmMl9zd19hZGp1c3RfbGluazsKKwlkcy0+b3BzLT5maXhlZF9saW5rX3VwZGF0ZSA9IGJjbV9zZjJfc3dfZml4ZWRfbGlua191cGRhdGU7CisJZHMtPm9wcy0+c3VzcGVuZCA9IGJjbV9zZjJfc3dfc3VzcGVuZDsKKwlkcy0+b3BzLT5yZXN1bWUgPSBiY21fc2YyX3N3X3Jlc3VtZTsKKwlkcy0+b3BzLT5nZXRfd29sID0gYmNtX3NmMl9zd19nZXRfd29sOworCWRzLT5vcHMtPnNldF93b2wgPSBiY21fc2YyX3N3X3NldF93b2w7CisJZHMtPm9wcy0+cG9ydF9lbmFibGUgPSBiY21fc2YyX3BvcnRfc2V0dXA7CisJZHMtPm9wcy0+cG9ydF9kaXNhYmxlID0gYmNtX3NmMl9wb3J0X2Rpc2FibGU7CisJZHMtPm9wcy0+Z2V0X2VlZSA9IGJjbV9zZjJfc3dfZ2V0X2VlZTsKKwlkcy0+b3BzLT5zZXRfZWVlID0gYmNtX3NmMl9zd19zZXRfZWVlOworCisJLyogQXZvaWQgaGF2aW5nIERTQSBmcmVlIG91ciBzbGF2ZSBNRElPIGJ1cyAoY2hlY2tpbmcgZm9yCisJICogZHMtPnNsYXZlX21paV9idXMgYW5kIGRzLT5vcHMtPnBoeV9yZWFkIGJlaW5nIG5vbi1OVUxMKQorCSAqLworCWRzLT5vcHMtPnBoeV9yZWFkID0gTlVMTDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBwcml2KTsKKwogCXNwaW5fbG9ja19pbml0KCZwcml2LT5pbmRpcl9sb2NrKTsKIAltdXRleF9pbml0KCZwcml2LT5zdGF0c19tdXRleCk7CiAKLQkvKiBBbGwgdGhlIGludGVyZXN0aW5nIHByb3BlcnRpZXMgYXJlIGF0IHRoZSBwYXJlbnQgZGV2aWNlX25vZGUKLQkgKiBsZXZlbAotCSAqLwotCWRuID0gZHMtPmNkLT5vZl9ub2RlLT5wYXJlbnQ7Ci0JYmNtX3NmMl9pZGVudGlmeV9wb3J0cyhwcml2LCBkcy0+Y2QtPm9mX25vZGUpOworCWJjbV9zZjJfaWRlbnRpZnlfcG9ydHMocHJpdiwgZG4tPmNoaWxkKTsKIAogCXByaXYtPmlycTAgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChkbiwgMCk7CiAJcHJpdi0+aXJxMSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRuLCAxKTsKIAogCWJhc2UgPSAmcHJpdi0+Y29yZTsKIAlmb3IgKGkgPSAwOyBpIDwgQkNNX1NGMl9SRUdTX05VTTsgaSsrKSB7Ci0JCSpiYXNlID0gb2ZfaW9tYXAoZG4sIGkpOwotCQlpZiAoKmJhc2UgPT0gTlVMTCkgeworCQlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBpKTsKKwkJKmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcik7CisJCWlmIChJU19FUlIoKmJhc2UpKSB7CiAJCQlwcl9lcnIoInVuYWJsZSB0byBmaW5kIHJlZ2lzdGVyOiAlc1xuIiwgcmVnX25hbWVzW2ldKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dF91bm1hcDsKKwkJCXJldHVybiBQVFJfRVJSKCpiYXNlKTsKIAkJfQogCQliYXNlKys7CiAJfQpAQCAtMTYwNiwzMCArMTA1MywzMCBAQAogCXJldCA9IGJjbV9zZjJfc3dfcnN0KHByaXYpOwogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCJ1bmFibGUgdG8gc29mdHdhcmUgcmVzZXQgc3dpdGNoOiAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXRfdW5tYXA7CisJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0ID0gYmNtX3NmMl9tZGlvX3JlZ2lzdGVyKGRzKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIE1ESU8gYnVzXG4iKTsKLQkJZ290byBvdXRfdW5tYXA7CisJCXJldHVybiByZXQ7CiAJfQogCiAJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhbmQgcmVxdWVzdCB0aGVtICovCiAJYmNtX3NmMl9pbnRyX2Rpc2FibGUocHJpdik7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShwcml2LT5pcnEwLCBiY21fc2YyX3N3aXRjaF8wX2lzciwgMCwKLQkJCSAgInN3aXRjaF8wIiwgcHJpdik7CisJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBwcml2LT5pcnEwLCBiY21fc2YyX3N3aXRjaF8wX2lzciwgMCwKKwkJCSAgICAgICAic3dpdGNoXzAiLCBwcml2KTsKIAlpZiAocmV0IDwgMCkgewogCQlwcl9lcnIoImZhaWxlZCB0byByZXF1ZXN0IHN3aXRjaF8wIElSUVxuIik7CiAJCWdvdG8gb3V0X21kaW87CiAJfQogCi0JcmV0ID0gcmVxdWVzdF9pcnEocHJpdi0+aXJxMSwgYmNtX3NmMl9zd2l0Y2hfMV9pc3IsIDAsCi0JCQkgICJzd2l0Y2hfMSIsIHByaXYpOworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcHJpdi0+aXJxMSwgYmNtX3NmMl9zd2l0Y2hfMV9pc3IsIDAsCisJCQkgICAgICAgInN3aXRjaF8xIiwgcHJpdik7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gcmVxdWVzdCBzd2l0Y2hfMSBJUlFcbiIpOwotCQlnb3RvIG91dF9mcmVlX2lycTA7CisJCWdvdG8gb3V0X21kaW87CiAJfQogCiAJLyogUmVzZXQgdGhlIE1JQiBjb3VudGVycyAqLwpAQCAtMTY0OSwxOSArMTA5Niw2IEBACiAJCQkJICZwcml2LT5od19wYXJhbXMubnVtX2dwaHkpKQogCQlwcml2LT5od19wYXJhbXMubnVtX2dwaHkgPSAxOwogCi0JLyogRW5hYmxlIGFsbCB2YWxpZCBwb3J0cyBhbmQgZGlzYWJsZSB0aG9zZSB1bnVzZWQgKi8KLQlmb3IgKHBvcnQgPSAwOyBwb3J0IDwgcHJpdi0+aHdfcGFyYW1zLm51bV9wb3J0czsgcG9ydCsrKSB7Ci0JCS8qIElNUCBwb3J0IHJlY2VpdmVzIHNwZWNpYWwgdHJlYXRtZW50ICovCi0JCWlmICgoMSA8PCBwb3J0KSAmIGRzLT5lbmFibGVkX3BvcnRfbWFzaykKLQkJCWJjbV9zZjJfcG9ydF9zZXR1cChkcywgcG9ydCwgTlVMTCk7Ci0JCWVsc2UgaWYgKGRzYV9pc19jcHVfcG9ydChkcywgcG9ydCkpCi0JCQliY21fc2YyX2ltcF9zZXR1cChkcywgcG9ydCk7Ci0JCWVsc2UKLQkJCWJjbV9zZjJfcG9ydF9kaXNhYmxlKGRzLCBwb3J0LCBOVUxMKTsKLQl9Ci0KLQliY21fc2YyX3N3X2NvbmZpZ3VyZV92bGFuKGRzKTsKLQogCXJldiA9IHJlZ19yZWFkbChwcml2LCBSRUdfU1dJVENIX1JFVklTSU9OKTsKIAlwcml2LT5od19wYXJhbXMudG9wX3JldiA9IChyZXYgPj4gU1dJVENIX1RPUF9SRVZfU0hJRlQpICYKIAkJCQkJU1dJVENIX1RPUF9SRVZfTUFTSzsKQEAgLTE2NzAsNiArMTEwNCwxMCBAQAogCXJldiA9IHJlZ19yZWFkbChwcml2LCBSRUdfUEhZX1JFVklTSU9OKTsKIAlwcml2LT5od19wYXJhbXMuZ3BoeV9yZXYgPSByZXYgJiBQSFlfUkVWSVNJT05fTUFTSzsKIAorCXJldCA9IGI1M19zd2l0Y2hfcmVnaXN0ZXIoZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9tZGlvOworCiAJcHJfaW5mbygiU3RhcmZpZ2h0ZXIgMiB0b3A6ICV4LiUwMngsIGNvcmU6ICV4LiUwMnggYmFzZTogMHglcCwgSVJRczogJWQsICVkXG4iLAogCQlwcml2LT5od19wYXJhbXMudG9wX3JldiA+PiA4LCBwcml2LT5od19wYXJhbXMudG9wX3JldiAmIDB4ZmYsCiAJCXByaXYtPmh3X3BhcmFtcy5jb3JlX3JldiA+PiA4LCBwcml2LT5od19wYXJhbXMuY29yZV9yZXYgJiAweGZmLApAQCAtMTY3Nyw2NiArMTExNSw2MCBAQAogCiAJcmV0dXJuIDA7CiAKLW91dF9mcmVlX2lycTA6Ci0JZnJlZV9pcnEocHJpdi0+aXJxMCwgcHJpdik7CiBvdXRfbWRpbzoKIAliY21fc2YyX21kaW9fdW5yZWdpc3Rlcihwcml2KTsKLW91dF91bm1hcDoKLQliYXNlID0gJnByaXYtPmNvcmU7Ci0JZm9yIChpID0gMDsgaSA8IEJDTV9TRjJfUkVHU19OVU07IGkrKykgewotCQlpZiAoKmJhc2UpCi0JCQlpb3VubWFwKCpiYXNlKTsKLQkJYmFzZSsrOwotCX0KIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIGJjbV9zZjJfc3dpdGNoX2RyaXZlciA9IHsKLQkudGFnX3Byb3RvY29sCQk9IERTQV9UQUdfUFJPVE9fQlJDTSwKLQkucHJvYmUJCQk9IGJjbV9zZjJfc3dfZHJ2X3Byb2JlLAotCS5zZXR1cAkJCT0gYmNtX3NmMl9zd19zZXR1cCwKLQkuc2V0X2FkZHIJCT0gYmNtX3NmMl9zd19zZXRfYWRkciwKLQkuZ2V0X3BoeV9mbGFncwkJPSBiY21fc2YyX3N3X2dldF9waHlfZmxhZ3MsCi0JLmdldF9zdHJpbmdzCQk9IGJjbV9zZjJfc3dfZ2V0X3N0cmluZ3MsCi0JLmdldF9ldGh0b29sX3N0YXRzCT0gYmNtX3NmMl9zd19nZXRfZXRodG9vbF9zdGF0cywKLQkuZ2V0X3NzZXRfY291bnQJCT0gYmNtX3NmMl9zd19nZXRfc3NldF9jb3VudCwKLQkuYWRqdXN0X2xpbmsJCT0gYmNtX3NmMl9zd19hZGp1c3RfbGluaywKLQkuZml4ZWRfbGlua191cGRhdGUJPSBiY21fc2YyX3N3X2ZpeGVkX2xpbmtfdXBkYXRlLAotCS5zdXNwZW5kCQk9IGJjbV9zZjJfc3dfc3VzcGVuZCwKLQkucmVzdW1lCQkJPSBiY21fc2YyX3N3X3Jlc3VtZSwKLQkuZ2V0X3dvbAkJPSBiY21fc2YyX3N3X2dldF93b2wsCi0JLnNldF93b2wJCT0gYmNtX3NmMl9zd19zZXRfd29sLAotCS5wb3J0X2VuYWJsZQkJPSBiY21fc2YyX3BvcnRfc2V0dXAsCi0JLnBvcnRfZGlzYWJsZQkJPSBiY21fc2YyX3BvcnRfZGlzYWJsZSwKLQkuZ2V0X2VlZQkJPSBiY21fc2YyX3N3X2dldF9lZWUsCi0JLnNldF9lZWUJCT0gYmNtX3NmMl9zd19zZXRfZWVlLAotCS5wb3J0X2JyaWRnZV9qb2luCT0gYmNtX3NmMl9zd19icl9qb2luLAotCS5wb3J0X2JyaWRnZV9sZWF2ZQk9IGJjbV9zZjJfc3dfYnJfbGVhdmUsCi0JLnBvcnRfc3RwX3N0YXRlX3NldAk9IGJjbV9zZjJfc3dfYnJfc2V0X3N0cF9zdGF0ZSwKLQkucG9ydF9mZGJfcHJlcGFyZQk9IGJjbV9zZjJfc3dfZmRiX3ByZXBhcmUsCi0JLnBvcnRfZmRiX2FkZAkJPSBiY21fc2YyX3N3X2ZkYl9hZGQsCi0JLnBvcnRfZmRiX2RlbAkJPSBiY21fc2YyX3N3X2ZkYl9kZWwsCi0JLnBvcnRfZmRiX2R1bXAJCT0gYmNtX3NmMl9zd19mZGJfZHVtcCwKLQkucG9ydF92bGFuX2ZpbHRlcmluZwk9IGJjbV9zZjJfc3dfdmxhbl9maWx0ZXJpbmcsCi0JLnBvcnRfdmxhbl9wcmVwYXJlCT0gYmNtX3NmMl9zd192bGFuX3ByZXBhcmUsCi0JLnBvcnRfdmxhbl9hZGQJCT0gYmNtX3NmMl9zd192bGFuX2FkZCwKLQkucG9ydF92bGFuX2RlbAkJPSBiY21fc2YyX3N3X3ZsYW5fZGVsLAotCS5wb3J0X3ZsYW5fZHVtcAkJPSBiY21fc2YyX3N3X3ZsYW5fZHVtcCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJjbV9zZjJfaW5pdCh2b2lkKQorc3RhdGljIGludCBiY21fc2YyX3N3X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJmJjbV9zZjJfc3dpdGNoX2RyaXZlcik7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyogRGlzYWJsZSBhbGwgcG9ydHMgYW5kIGludGVycnVwdHMgKi8KKwlwcml2LT53b2xfcG9ydHNfbWFzayA9IDA7CisJYmNtX3NmMl9zd19zdXNwZW5kKHByaXYtPmRldi0+ZHMpOworCWRzYV91bnJlZ2lzdGVyX3N3aXRjaChwcml2LT5kZXYtPmRzKTsKKwliY21fc2YyX21kaW9fdW5yZWdpc3Rlcihwcml2KTsKIAogCXJldHVybiAwOwogfQotbW9kdWxlX2luaXQoYmNtX3NmMl9pbml0KTsKIAotc3RhdGljIHZvaWQgX19leGl0IGJjbV9zZjJfZXhpdCh2b2lkKQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBiY21fc2YyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmYmNtX3NmMl9zd2l0Y2hfZHJpdmVyKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIGRzYV9zd2l0Y2hfc3VzcGVuZChwcml2LT5kZXYtPmRzKTsKIH0KLW1vZHVsZV9leGl0KGJjbV9zZjJfZXhpdCk7CisKK3N0YXRpYyBpbnQgYmNtX3NmMl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gZHNhX3N3aXRjaF9yZXN1bWUocHJpdi0+ZGV2LT5kcyk7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhiY21fc2YyX3BtX29wcywKKwkJCSBiY21fc2YyX3N1c3BlbmQsIGJjbV9zZjJfcmVzdW1lKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYmNtX3NmMl9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY203NDQ1LXN3aXRjaC12NC4wIiB9LAorCXsgLyogc2VudGluZWwgKi8gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJjbV9zZjJfZHJpdmVyID0geworCS5wcm9iZQk9IGJjbV9zZjJfc3dfcHJvYmUsCisJLnJlbW92ZQk9IGJjbV9zZjJfc3dfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImJyY20tc2YyIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYmNtX3NmMl9vZl9tYXRjaCwKKwkJLnBtID0gJmJjbV9zZjJfcG1fb3BzLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiY21fc2YyX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkJyb2FkY29tIENvcnBvcmF0aW9uIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQnJvYWRjb20gU3RhcmZpZ2h0ZXIgMiBldGhlcm5ldCBzd2l0Y2ggY2hpcCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjIuaCBiL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyLmgKaW5kZXggNDYzYmVkOC4uNDQ2OTI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjIuaAorKysgYi9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMi5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bmV0L2RzYS5oPgogCiAjaW5jbHVkZSAiYmNtX3NmMl9yZWdzLmgiCisjaW5jbHVkZSAiYjUzL2I1M19wcml2LmgiCiAKIHN0cnVjdCBiY21fc2YyX2h3X3BhcmFtcyB7CiAJdTE2CXRvcF9yZXY7CkBAIC00OSw3MiArNTAsOCBAQAogCXVuc2lnbmVkIGludCBsaW5rOwogCiAJc3RydWN0IGV0aHRvb2xfZWVlIGVlZTsKLQotCXUzMiB2bGFuX2N0bF9tYXNrOwotCXUxNiBwdmlkOwotCi0Jc3RydWN0IG5ldF9kZXZpY2UgKmJyaWRnZV9kZXY7CiB9OwogCi1zdHJ1Y3QgYmNtX3NmMl9hcmxfZW50cnkgewotCXU4IHBvcnQ7Ci0JdTggbWFjW0VUSF9BTEVOXTsKLQl1MTYgdmlkOwotCXU4IGlzX3ZhbGlkOjE7Ci0JdTggaXNfYWdlOjE7Ci0JdTggaXNfc3RhdGljOjE7Ci19OwotCi1zdHJ1Y3QgYmNtX3NmMl92bGFuIHsKLQl1MTYgbWVtYmVyczsKLQl1MTYgdW50YWc7Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmNtX3NmMl9tYWNfZnJvbV91NjQodTY0IHNyYywgdTggKmRzdCkKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQotCQlkc3RbRVRIX0FMRU4gLSAxIC0gaV0gPSAoc3JjID4+ICg4ICogaSkpICYgMHhmZjsKLX0KLQotc3RhdGljIGlubGluZSB1NjQgYmNtX3NmMl9tYWNfdG9fdTY0KGNvbnN0IHU4ICpzcmMpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdTY0IGRzdCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKLQkJZHN0IHw9ICh1NjQpc3JjW0VUSF9BTEVOIC0gMSAtIGldIDw8ICg4ICogaSk7Ci0KLQlyZXR1cm4gZHN0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmNtX3NmMl9hcmxfdG9fZW50cnkoc3RydWN0IGJjbV9zZjJfYXJsX2VudHJ5ICplbnQsCi0JCQkJCXU2NCBtYWNfdmlkLCB1MzIgZndkX2VudHJ5KQotewotCW1lbXNldChlbnQsIDAsIHNpemVvZigqZW50KSk7Ci0JZW50LT5wb3J0ID0gZndkX2VudHJ5ICYgUE9SVElEX01BU0s7Ci0JZW50LT5pc192YWxpZCA9ICEhKGZ3ZF9lbnRyeSAmIEFSTF9WQUxJRCk7Ci0JZW50LT5pc19hZ2UgPSAhIShmd2RfZW50cnkgJiBBUkxfQUdFKTsKLQllbnQtPmlzX3N0YXRpYyA9ICEhKGZ3ZF9lbnRyeSAmIEFSTF9TVEFUSUMpOwotCWJjbV9zZjJfbWFjX2Zyb21fdTY0KG1hY192aWQsIGVudC0+bWFjKTsKLQllbnQtPnZpZCA9IG1hY192aWQgPj4gVklEX1NISUZUOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYmNtX3NmMl9hcmxfZnJvbV9lbnRyeSh1NjQgKm1hY192aWQsIHUzMiAqZndkX2VudHJ5LAotCQkJCQkgIGNvbnN0IHN0cnVjdCBiY21fc2YyX2FybF9lbnRyeSAqZW50KQotewotCSptYWNfdmlkID0gYmNtX3NmMl9tYWNfdG9fdTY0KGVudC0+bWFjKTsKLQkqbWFjX3ZpZCB8PSAodTY0KShlbnQtPnZpZCAmIFZJRF9NQVNLKSA8PCBWSURfU0hJRlQ7Ci0JKmZ3ZF9lbnRyeSA9IGVudC0+cG9ydCAmIFBPUlRJRF9NQVNLOwotCWlmIChlbnQtPmlzX3ZhbGlkKQotCQkqZndkX2VudHJ5IHw9IEFSTF9WQUxJRDsKLQlpZiAoZW50LT5pc19zdGF0aWMpCi0JCSpmd2RfZW50cnkgfD0gQVJMX1NUQVRJQzsKLQlpZiAoZW50LT5pc19hZ2UpCi0JCSpmd2RfZW50cnkgfD0gQVJMX0FHRTsKLX0KLQogc3RydWN0IGJjbV9zZjJfcHJpdiB7CiAJLyogQmFzZSByZWdpc3RlcnMsIGtlZXAgdGhvc2UgaW4gb3JkZXIgd2l0aCBCQ01fU0YyX1JFR1NfTkFNRSAqLwogCXZvaWQgX19pb21lbQkJCSpjb3JlOwpAQCAtMTM0LDYgKzcxLDkgQEAKIAl1MzIJCQkJaXJxMV9zdGF0OwogCXUzMgkJCQlpcnExX21hc2s7CiAKKwkvKiBCYWNraW5nIGI1M19kZXZpY2UgKi8KKwlzdHJ1Y3QgYjUzX2RldmljZQkJKmRldjsKKwogCS8qIE11dGV4IHByb3RlY3RpbmcgYWNjZXNzIHRvIHRoZSBNSUIgY291bnRlcnMgKi8KIAlzdHJ1Y3QgbXV0ZXgJCQlzdGF0c19tdXRleDsKIApAQCAtMTU1LDE2ICs5NSwxNCBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZQkJKm1hc3Rlcl9taWlfZG47CiAJc3RydWN0IG1paV9idXMJCQkqc2xhdmVfbWlpX2J1czsKIAlzdHJ1Y3QgbWlpX2J1cwkJCSptYXN0ZXJfbWlpX2J1czsKLQotCS8qIENhY2hlIG9mIHByb2dyYW1tZWQgVkxBTnMgKi8KLQlzdHJ1Y3QgYmNtX3NmMl92bGFuCQl2bGFuc1tWTEFOX05fVklEXTsKIH07CiAKLXN0cnVjdCBiY21fc2YyX2h3X3N0YXRzIHsKLQljb25zdCBjaGFyCSpzdHJpbmc7Ci0JdTE2CQlyZWc7Ci0JdTgJCXNpemVvZl9zdGF0OwotfTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJjbV9zZjJfcHJpdiAqYmNtX3NmMl90b19wcml2KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlzdHJ1Y3QgYjUzX2RldmljZSAqZGV2ID0gZHMtPnByaXY7CisKKwlyZXR1cm4gZGV2LT5wcml2OworfQogCiAjZGVmaW5lIFNGMl9JT19NQUNSTyhuYW1lKSBcCiBzdGF0aWMgaW5saW5lIHUzMiBuYW1lIyNfcmVhZGwoc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiwgdTMyIG9mZikJXApAQCAtMjA1LDggKzE0Myw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaW50cmwyXyMjd2hpY2gjI19tYXNrX2NsZWFyKHN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYsIFwKIAkJCQkJCXUzMiBtYXNrKQkJXAogewkJCQkJCQkJCVwKLQlpbnRybDJfIyN3aGljaCMjX3dyaXRlbChwcml2LCBtYXNrLCBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOwlcCiAJcHJpdi0+aXJxIyN3aGljaCMjX21hc2sgJj0gfihtYXNrKTsJCQkJXAorCWludHJsMl8jI3doaWNoIyNfd3JpdGVsKHByaXYsIG1hc2ssIElOVFJMMl9DUFVfTUFTS19DTEVBUik7CVwKIH0JCQkJCQkJCQlcCiBzdGF0aWMgaW5saW5lIHZvaWQgaW50cmwyXyMjd2hpY2gjI19tYXNrX3NldChzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2LCBcCiAJCQkJCQl1MzIgbWFzaykJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyX3JlZ3MuaCBiL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyX3JlZ3MuaAppbmRleCA5ZjJhOWNiLi44MzhmZTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMl9yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjJfcmVncy5oCkBAIC0xMTUsMTQgKzExNSw2IEBACiAjZGVmaW5lICBSWF9CQ1NUX0VOCQkJKDEgPDwgMikKICNkZWZpbmUgIFJYX01DU1RfRU4JCQkoMSA8PCAzKQogI2RlZmluZSAgUlhfVUNTVF9FTgkJCSgxIDw8IDQpCi0jZGVmaW5lICBHX01JU1RQX1NUQVRFX1NISUZUCQk1Ci0jZGVmaW5lICBHX01JU1RQX05PX1NUUAkJCSgwIDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpCi0jZGVmaW5lICBHX01JU1RQX0RJU19TVEFURQkJKDEgPDwgR19NSVNUUF9TVEFURV9TSElGVCkKLSNkZWZpbmUgIEdfTUlTVFBfQkxPQ0tfU1RBVEUJCSgyIDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpCi0jZGVmaW5lICBHX01JU1RQX0xJU1RFTl9TVEFURQkJKDMgPDwgR19NSVNUUF9TVEFURV9TSElGVCkKLSNkZWZpbmUgIEdfTUlTVFBfTEVBUk5fU1RBVEUJCSg0IDw8IEdfTUlTVFBfU1RBVEVfU0hJRlQpCi0jZGVmaW5lICBHX01JU1RQX0ZXRF9TVEFURQkJKDUgPDwgR19NSVNUUF9TVEFURV9TSElGVCkKLSNkZWZpbmUgIEdfTUlTVFBfU1RBVEVfTUFTSwkJMHg3CiAKICNkZWZpbmUgQ09SRV9TV01PREUJCQkweDAwMDJjCiAjZGVmaW5lICBTV19GV0RHX01PREUJCQkoMSA8PCAwKQpAQCAtMjA1LDc1ICsxOTcsMTEgQEAKICNkZWZpbmUgIEJSQ01fSERSX0VOX1A1CQkJKDEgPDwgMSkKICNkZWZpbmUgIEJSQ01fSERSX0VOX1A3CQkJKDEgPDwgMikKIAotI2RlZmluZSBDT1JFX0JSQ01fSERSX0NUUkwyCQkweDA4MjgKLQotI2RlZmluZSBDT1JFX0hMX1BSVENfQ1RSTAkJMHgwOTQwCi0jZGVmaW5lICBBUlBfRU4JCQkJKDEgPDwgMCkKLSNkZWZpbmUgIFJBUlBfRU4JCQkoMSA8PCAxKQotI2RlZmluZSAgREhDUF9FTgkJCSgxIDw8IDIpCi0jZGVmaW5lICBJQ01QVjRfRU4JCQkoMSA8PCAzKQotI2RlZmluZSAgSUNNUFY2X0VOCQkJKDEgPDwgNCkKLSNkZWZpbmUgIElDTVBWNl9GV0RfTU9ERQkJKDEgPDwgNSkKLSNkZWZpbmUgIElHTVBfRElQX0VOCQkJKDEgPDwgOCkKLSNkZWZpbmUgIElHTVBfUlBUTFZFX0VOCQkJKDEgPDwgOSkKLSNkZWZpbmUgIElHTVBfUlRQTFZFX0ZXRF9NT0RFCQkoMSA8PCAxMCkKLSNkZWZpbmUgIElHTVBfUVJZX0VOCQkJKDEgPDwgMTEpCi0jZGVmaW5lICBJR01QX1FSWV9GV0RfTU9ERQkJKDEgPDwgMTIpCi0jZGVmaW5lICBJR01QX1VLTl9FTgkJCSgxIDw8IDEzKQotI2RlZmluZSAgSUdNUF9VS05fRldEX01PREUJCSgxIDw8IDE0KQotI2RlZmluZSAgTUxEX1JQVERPTkVfRU4JCQkoMSA8PCAxNSkKLSNkZWZpbmUgIE1MRF9SUFRET05FX0ZXRF9NT0RFCQkoMSA8PCAxNikKLSNkZWZpbmUgIE1MRF9RUllfRU4JCQkoMSA8PCAxNykKLSNkZWZpbmUgIE1MRF9RUllfRldEX01PREUJCSgxIDw8IDE4KQotCiAjZGVmaW5lIENPUkVfUlNUX01JQl9DTlRfRU4JCTB4MDk1MAogCiAjZGVmaW5lIENPUkVfQlJDTV9IRFJfUlhfRElTCQkweDA5ODAKICNkZWZpbmUgQ09SRV9CUkNNX0hEUl9UWF9ESVMJCTB4MDk4OAogCi0jZGVmaW5lIENPUkVfQVJMQV9OVU1fRU5UUklFUwkJMTAyNAotCi0jZGVmaW5lIENPUkVfQVJMQV9SV0NUTAkJCTB4MTQwMAotI2RlZmluZSAgQVJMX1JXCQkJCSgxIDw8IDApCi0jZGVmaW5lICBJVkxfU1ZMX1NFTEVDVAkJCSgxIDw8IDYpCi0jZGVmaW5lICBBUkxfU1RSVEROCQkJKDEgPDwgNykKLQotI2RlZmluZSBDT1JFX0FSTEFfTUFDCQkJMHgxNDA4Ci0jZGVmaW5lIENPUkVfQVJMQV9WSUQJCQkweDE0MjAKLSNkZWZpbmUgIEFSTEFfVklEVEFCX0lORFhfTUFTSwkJMHgxZmZmCi0KLSNkZWZpbmUgQ09SRV9BUkxBX01BQ1ZJRDAJCTB4MTQ0MAotI2RlZmluZSAgTUFDX01BU0sJCQkweGZmZmZmZmZmZmYKLSNkZWZpbmUgIFZJRF9TSElGVAkJCTQ4Ci0jZGVmaW5lICBWSURfTUFTSwkJCTB4ZmZmCi0KLSNkZWZpbmUgQ09SRV9BUkxBX0ZXRF9FTlRSWTAJCTB4MTQ2MAotI2RlZmluZSAgUE9SVElEX01BU0sJCQkweDFmZgotI2RlZmluZSAgQVJMX0NPTl9TSElGVAkJCTkKLSNkZWZpbmUgIEFSTF9DT05fTUFTSwkJCTB4MwotI2RlZmluZSAgQVJMX1BSSV9TSElGVAkJCTExCi0jZGVmaW5lICBBUkxfUFJJX01BU0sJCQkweDcKLSNkZWZpbmUgIEFSTF9BR0UJCQkoMSA8PCAxNCkKLSNkZWZpbmUgIEFSTF9TVEFUSUMJCQkoMSA8PCAxNSkKLSNkZWZpbmUgIEFSTF9WQUxJRAkJCSgxIDw8IDE2KQotCi0jZGVmaW5lIENPUkVfQVJMQV9NQUNWSURfRU5UUlkoeCkJKENPUkVfQVJMQV9NQUNWSUQwICsgKCh4KSAqIDB4NDApKQotI2RlZmluZSBDT1JFX0FSTEFfRldEX0VOVFJZKHgpCQkoQ09SRV9BUkxBX0ZXRF9FTlRSWTAgKyAoKHgpICogMHg0MCkpCi0KLSNkZWZpbmUgQ09SRV9BUkxBX1NSQ0hfQ1RMCQkweDE1NDAKLSNkZWZpbmUgIEFSTEFfU1JDSF9WTElECQkJKDEgPDwgMCkKLSNkZWZpbmUgIElWTF9TVkxfU0VMRUNUCQkJKDEgPDwgNikKLSNkZWZpbmUgIEFSTEFfU1JDSF9TVEROCQkJKDEgPDwgNykKLQotI2RlZmluZSBDT1JFX0FSTEFfU1JDSF9BRFIJCTB4MTU0NAotI2RlZmluZSAgQVJMQV9TUkNIX0FEUl9WQUxJRAkJKDEgPDwgMTUpCi0KLSNkZWZpbmUgQ09SRV9BUkxBX1NSQ0hfUlNMVF8wX01BQ1ZJRAkweDE1ODAKLSNkZWZpbmUgQ09SRV9BUkxBX1NSQ0hfUlNMVF8wCQkweDE1YTAKLQotI2RlZmluZSBDT1JFX0FSTEFfU1JDSF9SU0xUX01BQ1ZJRCh4KQkoQ09SRV9BUkxBX1NSQ0hfUlNMVF8wX01BQ1ZJRCArICgoeCkgKiAweDQwKSkKLSNkZWZpbmUgQ09SRV9BUkxBX1NSQ0hfUlNMVCh4KQkJKENPUkVfQVJMQV9TUkNIX1JTTFRfMCArICgoeCkgKiAweDQwKSkKLQogI2RlZmluZSBDT1JFX0FSTEFfVlRCTF9SV0NUUkwJCTB4MTYwMAogI2RlZmluZSAgQVJMQV9WVEJMX0NNRF9XUklURQkJMAogI2RlZmluZSAgQVJMQV9WVEJMX0NNRF9SRUFECQkxCkBAIC0yOTcsNTkgKzIyNSw5IEBACiAjZGVmaW5lICBQX1RYUV9QU01fVkREKHgpCQkoUF9UWFFfUFNNX1ZERF9NQVNLIDw8IFwKIAkJCQkJKCh4KSAqIFBfVFhRX1BTTV9WRERfU0hJRlQpKQogCi0jZGVmaW5lCUNPUkVfUDBfTUlCX09GRlNFVAkJMHg4MDAwCi0jZGVmaW5lIFBfTUlCX1NJWkUJCQkweDQwMAotI2RlZmluZSBDT1JFX1BfTUlCX09GRlNFVCh4KQkJKENPUkVfUDBfTUlCX09GRlNFVCArICh4KSAqIFBfTUlCX1NJWkUpCi0KICNkZWZpbmUgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQoeCkJKDB4YzQwMCArICgoeCkgKiAweDgpKQogI2RlZmluZSAgUE9SVF9WTEFOX0NUUkxfTUFTSwkJMHgxZmYKIAotI2RlZmluZSBDT1JFX1ZMQU5fQ1RSTDAJCQkweGQwMDAKLSNkZWZpbmUgIENIQU5HRV8xUF9WSURfSU5ORVIJCSgxIDw8IDApCi0jZGVmaW5lICBDSEFOR0VfMVBfVklEX09VVEVSCQkoMSA8PCAxKQotI2RlZmluZSAgQ0hBTkdFXzFRX1ZJRAkJCSgxIDw8IDMpCi0jZGVmaW5lICBWTEFOX0xFQVJOX01PREVfU1ZMCQkoMCA8PCA1KQotI2RlZmluZSAgVkxBTl9MRUFSTl9NT0RFX0lWTAkJKDMgPDwgNSkKLSNkZWZpbmUgIFZMQU5fRU4JCQkoMSA8PCA3KQotCi0jZGVmaW5lIENPUkVfVkxBTl9DVFJMMQkJCTB4ZDAwNAotI2RlZmluZSAgRU5fUlNWX01DQVNUX0ZXRE1BUAkJKDEgPDwgMikKLSNkZWZpbmUgIEVOX1JTVl9NQ0FTVF9VTlRBRwkJKDEgPDwgMykKLSNkZWZpbmUgIEVOX0lQTUNfQllQQVNTX0ZXRE1BUAkJKDEgPDwgNSkKLSNkZWZpbmUgIEVOX0lQTUNfQllQQVNTX1VOVEFHCQkoMSA8PCA2KQotCi0jZGVmaW5lIENPUkVfVkxBTl9DVFJMMgkJCTB4ZDAwOAotI2RlZmluZSAgRU5fTUlJTV9CWVBBU1NfVl9GV0RNQVAJKDEgPDwgMikKLSNkZWZpbmUgIEVOX0dNUlBfR1ZSUF9WX0ZXRE1BUAkJKDEgPDwgNSkKLSNkZWZpbmUgIEVOX0dNUlBfR1ZSUF9VTlRBR19NQVAJCSgxIDw8IDYpCi0KLSNkZWZpbmUgQ09SRV9WTEFOX0NUUkwzCQkJMHhkMDBjCi0jZGVmaW5lICBFTl9EUk9QX05PTjFRX01BU0sJCTB4MWZmCi0KLSNkZWZpbmUgQ09SRV9WTEFOX0NUUkw0CQkJMHhkMDE0Ci0jZGVmaW5lICBSRVNWX01DQVNUX0ZMT09ECQkoMSA8PCAxKQotI2RlZmluZSAgRU5fRE9VQkxFX1RBR19NQVNLCQkweDMKLSNkZWZpbmUgIEVOX0RPVUJMRV9UQUdfU0hJRlQJCTIKLSNkZWZpbmUgIEVOX01HRV9SRVZfR01SUAkJKDEgPDwgNCkKLSNkZWZpbmUgIEVOX01HRV9SRVZfR1ZSUAkJKDEgPDwgNSkKLSNkZWZpbmUgIElOR1JfVklEX0NIS19TSElGVAkJNgotI2RlZmluZSAgSU5HUl9WSURfQ0hLX01BU0sJCTB4MwotI2RlZmluZSAgSU5HUl9WSURfQ0hLX0ZXRAkJKDAgPDwgSU5HUl9WSURfQ0hLX1NISUZUKQotI2RlZmluZSAgSU5HUl9WSURfQ0hLX0RST1AJCSgxIDw8IElOR1JfVklEX0NIS19TSElGVCkKLSNkZWZpbmUgIElOR1JfVklEX0NIS19OT19DSEsJCSgyIDw8IElOR1JfVklEX0NIS19TSElGVCkKLSNkZWZpbmUgIElOR1JfVklEX0NIS19WSURfVklPTF9JTVAJKDMgPDwgSU5HUl9WSURfQ0hLX1NISUZUKQotCi0jZGVmaW5lIENPUkVfVkxBTl9DVFJMNQkJCTB4ZDAxOAotI2RlZmluZSAgRU5fQ1BVX1JYX0JZUF9JTk5FUl9DUkNDSENLCSgxIDw8IDApCi0jZGVmaW5lICBFTl9WSURfRkZGX0ZXRAkJCSgxIDw8IDIpCi0jZGVmaW5lICBEUk9QX1ZUQUJMRV9NSVNTCQkoMSA8PCAzKQotI2RlZmluZSAgRUdSRVNTX0RJUl9GUk1fQllQX1RSVU5LX0VOCSgxIDw8IDQpCi0jZGVmaW5lICBQUkVTVl9OT04xUQkJCSgxIDw8IDYpCi0KLSNkZWZpbmUgQ09SRV9WTEFOX0NUUkw2CQkJMHhkMDFjCi0jZGVmaW5lICBTVFJJQ1RfU0ZEX0RFVEVDVAkJKDEgPDwgMCkKLSNkZWZpbmUgIERJU19BUkxfQlVTVF9MTUlUCQkoMSA8PCA0KQotCiAjZGVmaW5lIENPUkVfREVGQVVMVF8xUV9UQUdfUCh4KQkoMHhkMDQwICsgKCh4KSAqIDgpKQogI2RlZmluZSAgQ0ZJX1NISUZUCQkJMTIKICNkZWZpbmUgIFBSSV9TSElGVAkJCTEzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MDYwLmMgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MDYwLmMKaW5kZXggZTM2YjQwOC4uN2NlMzZkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL212ODhlNjA2MC5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYwNjAuYwpAQCAtMTksNyArMTksNyBAQAogCiBzdGF0aWMgaW50IHJlZ19yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IGFkZHIsIGludCByZWcpCiB7Ci0Jc3RydWN0IG12ODhlNjA2MF9wcml2ICpwcml2ID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNjA2MF9wcml2ICpwcml2ID0gZHMtPnByaXY7CiAKIAlyZXR1cm4gbWRpb2J1c19yZWFkX25lc3RlZChwcml2LT5idXMsIHByaXYtPnN3X2FkZHIgKyBhZGRyLCByZWcpOwogfQpAQCAtMzcsNyArMzcsNyBAQAogCiBzdGF0aWMgaW50IHJlZ193cml0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgdmFsKQogewotCXN0cnVjdCBtdjg4ZTYwNjBfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTYwNjBfcHJpdiAqcHJpdiA9IGRzLT5wcml2OwogCiAJcmV0dXJuIG1kaW9idXNfd3JpdGVfbmVzdGVkKHByaXYtPmJ1cywgcHJpdi0+c3dfYWRkciArIGFkZHIsIHJlZywgdmFsKTsKIH0KQEAgLTY5LDYgKzY5LDExIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBlbnVtIGRzYV90YWdfcHJvdG9jb2wgbXY4OGU2MDYwX2dldF90YWdfcHJvdG9jb2woc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXJldHVybiBEU0FfVEFHX1BST1RPX1RSQUlMRVI7Cit9CisKIHN0YXRpYyBjb25zdCBjaGFyICptdjg4ZTYwNjBfZHJ2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRzYV9kZXYsCiAJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmhvc3RfZGV2LCBpbnQgc3dfYWRkciwKIAkJCQkgICAgICAgdm9pZCAqKl9wcml2KQpAQCAtMjQ3LDggKzI1Miw4IEBACiAJcmV0dXJuIHJlZ193cml0ZShkcywgYWRkciwgcmVnbnVtLCB2YWwpOwogfQogCi1zdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIG12ODhlNjA2MF9zd2l0Y2hfZHJpdmVyID0gewotCS50YWdfcHJvdG9jb2wJPSBEU0FfVEFHX1BST1RPX1RSQUlMRVIsCitzdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfb3BzIG12ODhlNjA2MF9zd2l0Y2hfb3BzID0geworCS5nZXRfdGFnX3Byb3RvY29sID0gbXY4OGU2MDYwX2dldF90YWdfcHJvdG9jb2wsCiAJLnByb2JlCQk9IG12ODhlNjA2MF9kcnZfcHJvYmUsCiAJLnNldHVwCQk9IG12ODhlNjA2MF9zZXR1cCwKIAkuc2V0X2FkZHIJPSBtdjg4ZTYwNjBfc2V0X2FkZHIsCkBAIC0yNTgsMTQgKzI2MywxNCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtdjg4ZTYwNjBfaW5pdCh2b2lkKQogewotCXJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNjA2MF9zd2l0Y2hfZHJpdmVyKTsKKwlyZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTYwNjBfc3dpdGNoX29wcyk7CiAJcmV0dXJuIDA7CiB9CiBtb2R1bGVfaW5pdChtdjg4ZTYwNjBfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtdjg4ZTYwNjBfY2xlYW51cCh2b2lkKQogewotCXVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2MDYwX3N3aXRjaF9kcml2ZXIpOworCXVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2MDYwX3N3aXRjaF9vcHMpOwogfQogbW9kdWxlX2V4aXQobXY4OGU2MDYwX2NsZWFudXApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L0tjb25maWcgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L0tjb25maWcKaW5kZXggNDkwYmMwNi4uNDg2NjY4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvS2NvbmZpZwpAQCAtMiw2ICsyLDE4IEBACiAJdHJpc3RhdGUgIk1hcnZlbGwgODhFNnh4eCBFdGhlcm5ldCBzd2l0Y2ggZmFicmljIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVRfRFNBCiAJc2VsZWN0IE5FVF9EU0FfVEFHX0VEU0EKKwlzZWxlY3QgTkVUX0RTQV9UQUdfRFNBCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgYWRkcyBzdXBwb3J0IGZvciBtb3N0IG9mIHRoZSBNYXJ2ZWxsIDg4RTZ4eHggbW9kZWxzIG9mCiAJICBFdGhlcm5ldCBzd2l0Y2ggY2hpcHMsIGV4Y2VwdCA4OEU2MDYwLgorCitjb25maWcgTkVUX0RTQV9NVjg4RTZYWFhfR0xPQkFMMgorCWJvb2wgIlN3aXRjaCBHbG9iYWwgMiBSZWdpc3RlcnMgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE5FVF9EU0FfTVY4OEU2WFhYCisJaGVscAorCSAgVGhpcyByZWdpc3RlcnMgc2V0IGF0IGludGVybmFsIFNNSSBhZGRyZXNzIDB4MUMgcHJvdmlkZXMgZXh0ZW5kZWQKKwkgIGZlYXR1cmVzIGxpa2UgRUVQUk9NIGludGVyZmFjZSwgdHJ1bmtpbmcsIGNyb3NzLWNoaXAgc2V0dXAsIGV0Yy4KKworCSAgSXQgaXMgcmVxdWlyZWQgb24gbW9zdCBjaGlwcy4gSWYgdGhlIGNoaXAgeW91IGNvbXBpbGUgdGhlIHN1cHBvcnQgZm9yCisJICBkb2Vzbid0IGhhdmUgc3VjaCByZWdpc3RlcnMgc2V0LCBzYXkgTiBoZXJlLiBJbiBkb3VidCwgc2F5IFkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9NYWtlZmlsZQppbmRleCA2ZTI5YTc1Li4xMGNlODIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvTWFrZWZpbGUKQEAgLTEgKzEsNCBAQAotb2JqLSQoQ09ORklHX05FVF9EU0FfTVY4OEU2WFhYKSArPSBjaGlwLm8KK29iai0kKENPTkZJR19ORVRfRFNBX01WODhFNlhYWCkgKz0gbXY4OGU2eHh4Lm8KK212ODhlNnh4eC1vYmpzIDo9IGNoaXAubworbXY4OGU2eHh4LW9ianMgKz0gZ2xvYmFsMS5vCittdjg4ZTZ4eHgtJChDT05GSUdfTkVUX0RTQV9NVjg4RTZYWFhfR0xPQkFMMikgKz0gZ2xvYmFsMi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2NoaXAuYyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvY2hpcC5jCmluZGV4IGQxZDlkM2MuLjg4M2ZkOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvY2hpcC5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvY2hpcC5jCkBAIC0yOSw3ICsyOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPG5ldC9kc2EuaD4KICNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+CisKICNpbmNsdWRlICJtdjg4ZTZ4eHguaCIKKyNpbmNsdWRlICJnbG9iYWwxLmgiCisjaW5jbHVkZSAiZ2xvYmFsMi5oIgogCiBzdGF0aWMgdm9pZCBhc3NlcnRfcmVnX2xvY2soc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewpAQCAtOTUsNyArOTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2eHh4X3NtaV9zaW5nbGVfY2hpcF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9idXNfb3BzIG12ODhlNnh4eF9zbWlfc2luZ2xlX2NoaXBfb3BzID0gewogCS5yZWFkID0gbXY4OGU2eHh4X3NtaV9zaW5nbGVfY2hpcF9yZWFkLAogCS53cml0ZSA9IG12ODhlNnh4eF9zbWlfc2luZ2xlX2NoaXBfd3JpdGUsCiB9OwpAQCAtMTc3LDEzICsxODAsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNnh4eF9zbWlfbXVsdGlfY2hpcF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9idXNfb3BzIG12ODhlNnh4eF9zbWlfbXVsdGlfY2hpcF9vcHMgPSB7CiAJLnJlYWQgPSBtdjg4ZTZ4eHhfc21pX211bHRpX2NoaXBfcmVhZCwKIAkud3JpdGUgPSBtdjg4ZTZ4eHhfc21pX211bHRpX2NoaXBfd3JpdGUsCiB9OwogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCSAgaW50IGFkZHIsIGludCByZWcsIHUxNiAqdmFsKQoraW50IG12ODhlNnh4eF9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsIHUxNiAqdmFsKQogewogCWludCBlcnI7CiAKQEAgLTE5OSw4ICsyMDEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkgICBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCkKK2ludCBtdjg4ZTZ4eHhfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCkKIHsKIAlpbnQgZXJyOwogCkBAIC0yMTYsMjUgKzIxNywxNDQgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogSW5kaXJlY3Qgd3JpdGUgdG8gc2luZ2xlIHBvaW50ZXItZGF0YSByZWdpc3RlciB3aXRoIGFuIFVwZGF0ZSBiaXQgKi8KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X3VwZGF0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLAotCQkJICAgIHUxNiB1cGRhdGUpCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9ydCwgaW50IHJlZywKKwkJCSAgICAgICB1MTYgKnZhbCkKIHsKLQl1MTYgdmFsOwotCWludCBpLCBlcnI7CisJaW50IGFkZHIgPSBjaGlwLT5pbmZvLT5wb3J0X2Jhc2VfYWRkciArIHBvcnQ7CiAKLQkvKiBXYWl0IHVudGlsIHRoZSBwcmV2aW91cyBvcGVyYXRpb24gaXMgY29tcGxldGVkICovCi0JZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKwlyZXR1cm4gbXY4OGU2eHh4X3JlYWQoY2hpcCwgYWRkciwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQsIGludCByZWcsCisJCQkJdTE2IHZhbCkKK3sKKwlpbnQgYWRkciA9IGNoaXAtPmluZm8tPnBvcnRfYmFzZV9hZGRyICsgcG9ydDsKKworCXJldHVybiBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgYWRkciwgcmVnLCB2YWwpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9waHlfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwaHksCisJCQkgICAgICBpbnQgcmVnLCB1MTYgKnZhbCkKK3sKKwlpbnQgYWRkciA9IHBoeTsgLyogUEhZIGRldmljZXMgYWRkcmVzc2VzIHN0YXJ0IGF0IDB4MCAqLworCisJaWYgKCFjaGlwLT5pbmZvLT5vcHMtPnBoeV9yZWFkKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gY2hpcC0+aW5mby0+b3BzLT5waHlfcmVhZChjaGlwLCBhZGRyLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BoeV93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwaHksCisJCQkgICAgICAgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlpbnQgYWRkciA9IHBoeTsgLyogUEhZIGRldmljZXMgYWRkcmVzc2VzIHN0YXJ0IGF0IDB4MCAqLworCisJaWYgKCFjaGlwLT5pbmZvLT5vcHMtPnBoeV93cml0ZSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIGNoaXAtPmluZm8tPm9wcy0+cGh5X3dyaXRlKGNoaXAsIGFkZHIsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfcGh5X3BhZ2VfZ2V0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBoeSwgdTggcGFnZSkKK3sKKwlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfUEhZX1BBR0UpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gbXY4OGU2eHh4X3BoeV93cml0ZShjaGlwLCBwaHksIFBIWV9QQUdFLCBwYWdlKTsKK30KKworc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BoeV9wYWdlX3B1dChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwaHkpCit7CisJaW50IGVycjsKKworCS8qIFJlc3RvcmUgUEhZIHBhZ2UgQ29wcGVyIDB4MCBmb3IgYWNjZXNzIHZpYSB0aGUgcmVnaXN0ZXJlZCBNRElPIGJ1cyAqLworCWVyciA9IG12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgcGh5LCBQSFlfUEFHRSwgUEhZX1BBR0VfQ09QUEVSKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlkZXZfZXJyKGNoaXAtPmRldiwgImZhaWxlZCB0byByZXN0b3JlIFBIWSAlZCBwYWdlIENvcHBlciAoJWQpXG4iLAorCQkJcGh5LCBlcnIpOworCX0KK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfcGh5X3BhZ2VfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwaHksCisJCQkJICAgdTggcGFnZSwgaW50IHJlZywgdTE2ICp2YWwpCit7CisJaW50IGVycjsKKworCS8qIFRoZXJlIGlzIG5vIHBhZ2luZyBmb3IgcmVnaXN0ZXJzIDIyICovCisJaWYgKHJlZyA9PSBQSFlfUEFHRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBtdjg4ZTZ4eHhfcGh5X3BhZ2VfZ2V0KGNoaXAsIHBoeSwgcGFnZSk7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gbXY4OGU2eHh4X3BoeV9yZWFkKGNoaXAsIHBoeSwgcmVnLCB2YWwpOworCQltdjg4ZTZ4eHhfcGh5X3BhZ2VfcHV0KGNoaXAsIHBoeSk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfcGh5X3BhZ2Vfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcGh5LAorCQkJCSAgICB1OCBwYWdlLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCWludCBlcnI7CisKKwkvKiBUaGVyZSBpcyBubyBwYWdpbmcgZm9yIHJlZ2lzdGVycyAyMiAqLworCWlmIChyZWcgPT0gUEhZX1BBR0UpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gbXY4OGU2eHh4X3BoeV9wYWdlX2dldChjaGlwLCBwaHksIHBhZ2UpOworCWlmICghZXJyKSB7CisJCWVyciA9IG12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgcGh5LCBQSFlfUEFHRSwgcGFnZSk7CisJCW12ODhlNnh4eF9waHlfcGFnZV9wdXQoY2hpcCwgcGh5KTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9zZXJkZXNfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiAqdmFsKQoreworCXJldHVybiBtdjg4ZTZ4eHhfcGh5X3BhZ2VfcmVhZChjaGlwLCBBRERSX1NFUkRFUywgU0VSREVTX1BBR0VfRklCRVIsCisJCQkJICAgICAgIHJlZywgdmFsKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfc2VyZGVzX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlyZXR1cm4gbXY4OGU2eHh4X3BoeV9wYWdlX3dyaXRlKGNoaXAsIEFERFJfU0VSREVTLCBTRVJERVNfUEFHRV9GSUJFUiwKKwkJCQkJcmVnLCB2YWwpOworfQorCitpbnQgbXY4OGU2eHh4X3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IG1hc2spCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl1MTYgdmFsOworCQlpbnQgZXJyOworCiAJCWVyciA9IG12ODhlNnh4eF9yZWFkKGNoaXAsIGFkZHIsIHJlZywgJnZhbCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCi0JCWlmICghKHZhbCAmIEJJVCgxNSkpKQotCQkJYnJlYWs7CisJCWlmICghKHZhbCAmIG1hc2spKQorCQkJcmV0dXJuIDA7CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCX0KIAotCWlmIChpID09IDE2KQotCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwlkZXZfZXJyKGNoaXAtPmRldiwgIlRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3Igc3dpdGNoXG4iKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworLyogSW5kaXJlY3Qgd3JpdGUgdG8gc2luZ2xlIHBvaW50ZXItZGF0YSByZWdpc3RlciB3aXRoIGFuIFVwZGF0ZSBiaXQgKi8KK2ludCBtdjg4ZTZ4eHhfdXBkYXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsIHUxNiB1cGRhdGUpCit7CisJdTE2IHZhbDsKKwlpbnQgZXJyOworCisJLyogV2FpdCB1bnRpbCB0aGUgcHJldmlvdXMgb3BlcmF0aW9uIGlzIGNvbXBsZXRlZCAqLworCWVyciA9IG12ODhlNnh4eF93YWl0KGNoaXAsIGFkZHIsIHJlZywgQklUKDE1KSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qIFNldCB0aGUgVXBkYXRlIGJpdCB0byB0cmlnZ2VyIGEgd3JpdGUgb3BlcmF0aW9uICovCiAJdmFsID0gQklUKDE1KSB8IHVwZGF0ZTsKQEAgLTI0Miw2MyArMzYyLDI3IEBACiAJcmV0dXJuIG12ODhlNnh4eF93cml0ZShjaGlwLCBhZGRyLCByZWcsIHZhbCk7CiB9CiAKLXN0YXRpYyBpbnQgX212ODhlNnh4eF9yZWdfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnKQorc3RhdGljIGludCBtdjg4ZTZ4eHhfcHB1X2Rpc2FibGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewogCXUxNiB2YWw7Ci0JaW50IGVycjsKKwlpbnQgaSwgZXJyOwogCi0JZXJyID0gbXY4OGU2eHh4X3JlYWQoY2hpcCwgYWRkciwgcmVnLCAmdmFsKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfQ09OVFJPTCwgJnZhbCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXJldHVybiB2YWw7Ci19CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9DT05UUk9MLAorCQkJCSB2YWwgJiB+R0xPQkFMX0NPTlRST0xfUFBVX0VOQUJMRSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotc3RhdGljIGludCBfbXY4OGU2eHh4X3JlZ193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLAotCQkJCWludCByZWcsIHUxNiB2YWwpCi17Ci0JcmV0dXJuIG12ODhlNnh4eF93cml0ZShjaGlwLCBhZGRyLCByZWcsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fcmVhZF9kaXJlY3Qoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgICAgIGludCBhZGRyLCBpbnQgcmVnbnVtKQotewotCWlmIChhZGRyID49IDApCi0JCXJldHVybiBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIGFkZHIsIHJlZ251bSk7Ci0JcmV0dXJuIDB4ZmZmZjsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb193cml0ZV9kaXJlY3Qoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgICAgICBpbnQgYWRkciwgaW50IHJlZ251bSwgdTE2IHZhbCkKLXsKLQlpZiAoYWRkciA+PSAwKQotCQlyZXR1cm4gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgYWRkciwgcmVnbnVtLCB2YWwpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9wcHVfZGlzYWJsZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9DT05UUk9MKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9DT05UUk9MLAotCQkJCSAgIHJldCAmIH5HTE9CQUxfQ09OVFJPTF9QUFVfRU5BQkxFKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JdGltZW91dCA9IGppZmZpZXMgKyAxICogSFo7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1NUQVRVUyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfU1RBVFVTLCAmdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwotCQlpZiAoKHJldCAmIEdMT0JBTF9TVEFUVVNfUFBVX01BU0spICE9Ci0JCSAgICBHTE9CQUxfU1RBVFVTX1BQVV9QT0xMSU5HKQorCQlpZiAoKHZhbCAmIEdMT0JBTF9TVEFUVVNfUFBVX01BU0spICE9IEdMT0JBTF9TVEFUVVNfUFBVX1BPTExJTkcpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMwNywyNyArMzkxLDI1IEBACiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3BwdV9lbmFibGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewotCWludCByZXQsIGVycjsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdTE2IHZhbDsKKwlpbnQgaSwgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQ09OVFJPTCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQ09OVFJPTCwKLQkJCQkgICByZXQgfCBHTE9CQUxfQ09OVFJPTF9QUFVfRU5BQkxFKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfQ09OVFJPTCwgJnZhbCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXRpbWVvdXQgPSBqaWZmaWVzICsgMSAqIEhaOwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9TVEFUVVMpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9DT05UUk9MLAorCQkJCSB2YWwgfCBHTE9CQUxfQ09OVFJPTF9QUFVfRU5BQkxFKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1NUQVRVUywgJnZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQkJaWYgKChyZXQgJiBHTE9CQUxfU1RBVFVTX1BQVV9NQVNLKSA9PQotCQkgICAgR0xPQkFMX1NUQVRVU19QUFVfUE9MTElORykKKwkJaWYgKCh2YWwgJiBHTE9CQUxfU1RBVFVTX1BQVV9NQVNLKSA9PSBHTE9CQUxfU1RBVFVTX1BQVV9QT0xMSU5HKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC00MDAsMzIgKzQ4MiwzNyBAQAogCWNoaXAtPnBwdV90aW1lci5mdW5jdGlvbiA9IG12ODhlNnh4eF9wcHVfcmVlbmFibGVfdGltZXI7CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fcmVhZF9wcHUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwKLQkJCQkgICBpbnQgcmVnbnVtKQorc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BwdV9zdGF0ZV9kZXN0cm95KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKIHsKLQlpbnQgcmV0OwotCi0JcmV0ID0gbXY4OGU2eHh4X3BwdV9hY2Nlc3NfZ2V0KGNoaXApOwotCWlmIChyZXQgPj0gMCkgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIGFkZHIsIHJlZ251bSk7Ci0JCW12ODhlNnh4eF9wcHVfYWNjZXNzX3B1dChjaGlwKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCWRlbF90aW1lcl9zeW5jKCZjaGlwLT5wcHVfdGltZXIpOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3dyaXRlX3BwdShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLAotCQkJCSAgICBpbnQgcmVnbnVtLCB1MTYgdmFsKQorc3RhdGljIGludCBtdjg4ZTZ4eHhfcGh5X3BwdV9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsCisJCQkJICBpbnQgcmVnLCB1MTYgKnZhbCkKIHsKLQlpbnQgcmV0OworCWludCBlcnI7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfcHB1X2FjY2Vzc19nZXQoY2hpcCk7Ci0JaWYgKHJldCA+PSAwKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIGFkZHIsIHJlZ251bSwgdmFsKTsKKwllcnIgPSBtdjg4ZTZ4eHhfcHB1X2FjY2Vzc19nZXQoY2hpcCk7CisJaWYgKCFlcnIpIHsKKwkJZXJyID0gbXY4OGU2eHh4X3JlYWQoY2hpcCwgYWRkciwgcmVnLCB2YWwpOwogCQltdjg4ZTZ4eHhfcHB1X2FjY2Vzc19wdXQoY2hpcCk7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9waHlfcHB1X3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsCisJCQkJICAgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbXY4OGU2eHh4X3BwdV9hY2Nlc3NfZ2V0KGNoaXApOworCWlmICghZXJyKSB7CisJCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBhZGRyLCByZWcsIHZhbCk7CisJCW12ODhlNnh4eF9wcHVfYWNjZXNzX3B1dChjaGlwKTsKKwl9CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgYm9vbCBtdjg4ZTZ4eHhfNjA2NV9mYW1pbHkoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQpAQCAtNDY4LDIxICs1NTUsNiBAQAogCXJldHVybiBjaGlwLT5pbmZvLT5mYW1pbHkgPT0gTVY4OEU2WFhYX0ZBTUlMWV82MzUyOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IG12ODhlNnh4eF9udW1fZGF0YWJhc2VzKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKLXsKLQlyZXR1cm4gY2hpcC0+aW5mby0+bnVtX2RhdGFiYXNlczsKLX0KLQotc3RhdGljIGJvb2wgbXY4OGU2eHh4X2hhc19maWRfcmVnKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKLXsKLQkvKiBEb2VzIHRoZSBkZXZpY2UgaGF2ZSBkZWRpY2F0ZWQgRklEIHJlZ2lzdGVycyBmb3IgQVRVIGFuZCBWVFUgb3BzPyAqLwotCWlmIChtdjg4ZTZ4eHhfNjA5N19mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYxNjVfZmFtaWx5KGNoaXApIHx8Ci0JICAgIG12ODhlNnh4eF82MzUxX2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZhbHNlOwotfQotCiAvKiBXZSBleHBlY3QgdGhlIHN3aXRjaCB0byBwZXJmb3JtIGF1dG8gbmVnb3RpYXRpb24gaWYgdGhlcmUgaXMgYSByZWFsCiAgKiBwaHkuIEhvd2V2ZXIsIGluIHRoZSBjYXNlIG9mIGEgZml4ZWQgbGluayBwaHksIHdlIGZvcmNlIHRoZSBwb3J0CiAgKiBzZXR0aW5ncyBmcm9tIHRoZSBmaXhlZCBsaW5rIHNldHRpbmdzLgpAQCAtNDkwLDI0ICs1NjIsMjQgQEAKIHN0YXRpYyB2b2lkIG12ODhlNnh4eF9hZGp1c3RfbGluayhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKLQl1MzIgcmVnOwotCWludCByZXQ7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJdTE2IHJlZzsKKwlpbnQgZXJyOwogCiAJaWYgKCFwaHlfaXNfcHNldWRvX2ZpeGVkX2xpbmsocGh5ZGV2KSkKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9QQ1NfQ1RSTCk7Ci0JaWYgKHJldCA8IDApCisJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBQT1JUX1BDU19DVFJMLCAmcmVnKTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCXJlZyA9IHJldCAmIH4oUE9SVF9QQ1NfQ1RSTF9MSU5LX1VQIHwKLQkJICAgICAgUE9SVF9QQ1NfQ1RSTF9GT1JDRV9MSU5LIHwKLQkJICAgICAgUE9SVF9QQ1NfQ1RSTF9EVVBMRVhfRlVMTCB8Ci0JCSAgICAgIFBPUlRfUENTX0NUUkxfRk9SQ0VfRFVQTEVYIHwKLQkJICAgICAgUE9SVF9QQ1NfQ1RSTF9VTkZPUkNFRCk7CisJcmVnICY9IH4oUE9SVF9QQ1NfQ1RSTF9MSU5LX1VQIHwKKwkJIFBPUlRfUENTX0NUUkxfRk9SQ0VfTElOSyB8CisJCSBQT1JUX1BDU19DVFJMX0RVUExFWF9GVUxMIHwKKwkJIFBPUlRfUENTX0NUUkxfRk9SQ0VfRFVQTEVYIHwKKwkJIFBPUlRfUENTX0NUUkxfVU5GT1JDRUQpOwogCiAJcmVnIHw9IFBPUlRfUENTX0NUUkxfRk9SQ0VfTElOSzsKIAlpZiAocGh5ZGV2LT5saW5rKQpAQCAtNTM2LDcgKzYwOCw3IEBACiAJCXJlZyB8PSBQT1JUX1BDU19DVFJMX0RVUExFWF9GVUxMOwogCiAJaWYgKChtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYzNTFfZmFtaWx5KGNoaXApKSAmJgotCSAgICAocG9ydCA+PSBjaGlwLT5pbmZvLT5udW1fcG9ydHMgLSAyKSkgeworCSAgICAocG9ydCA+PSBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApIC0gMikpIHsKIAkJaWYgKHBoeWRldi0+aW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9SWElEKQogCQkJcmVnIHw9IFBPUlRfUENTX0NUUkxfUkdNSUlfREVMQVlfUlhDTEs7CiAJCWlmIChwaHlkZXYtPmludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfVFhJRCkKQEAgLTU0NSw3ICs2MTcsNyBAQAogCQkJcmVnIHw9IChQT1JUX1BDU19DVFJMX1JHTUlJX0RFTEFZX1JYQ0xLIHwKIAkJCQlQT1JUX1BDU19DVFJMX1JHTUlJX0RFTEFZX1RYQ0xLKTsKIAl9Ci0JX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfUENTX0NUUkwsIHJlZyk7CisJbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9QQ1NfQ1RSTCwgcmVnKTsKIAogb3V0OgogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwpAQCAtNTUzLDEyICs2MjUsMTIgQEAKIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3N0YXRzX3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewotCWludCByZXQ7Ci0JaW50IGk7CisJdTE2IHZhbDsKKwlpbnQgaSwgZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfU1RBVFNfT1ApOwotCQlpZiAoKHJldCAmIEdMT0JBTF9TVEFUU19PUF9CVVNZKSA9PSAwKQorCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfU1RBVFNfT1AsICZ2YWwpOworCQlpZiAoKHZhbCAmIEdMT0JBTF9TVEFUU19PUF9CVVNZKSA9PSAwKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC01NjcsNTUgKzYzOSw1MiBAQAogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfc3RhdHNfc25hcHNob3Qoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9ydCkKIHsKLQlpbnQgcmV0OworCWludCBlcnI7CiAKIAlpZiAobXY4OGU2eHh4XzYzMjBfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MzUyX2ZhbWlseShjaGlwKSkKIAkJcG9ydCA9IChwb3J0ICsgMSkgPDwgNTsKIAogCS8qIFNuYXBzaG90IHRoZSBoYXJkd2FyZSBzdGF0aXN0aWNzIGNvdW50ZXJzIGZvciB0aGlzIHBvcnQuICovCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1NUQVRTX09QLAotCQkJCSAgIEdMT0JBTF9TVEFUU19PUF9DQVBUVVJFX1BPUlQgfAotCQkJCSAgIEdMT0JBTF9TVEFUU19PUF9ISVNUX1JYX1RYIHwgcG9ydCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9TVEFUU19PUCwKKwkJCQkgR0xPQkFMX1NUQVRTX09QX0NBUFRVUkVfUE9SVCB8CisJCQkJIEdMT0JBTF9TVEFUU19PUF9ISVNUX1JYX1RYIHwgcG9ydCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qIFdhaXQgZm9yIHRoZSBzbmFwc2hvdHRpbmcgdG8gY29tcGxldGUuICovCi0JcmV0ID0gX212ODhlNnh4eF9zdGF0c193YWl0KGNoaXApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIF9tdjg4ZTZ4eHhfc3RhdHNfd2FpdChjaGlwKTsKIH0KIAogc3RhdGljIHZvaWQgX212ODhlNnh4eF9zdGF0c19yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKIAkJCQkgIGludCBzdGF0LCB1MzIgKnZhbCkKIHsKLQl1MzIgX3ZhbDsKLQlpbnQgcmV0OworCXUzMiB2YWx1ZTsKKwl1MTYgcmVnOworCWludCBlcnI7CiAKIAkqdmFsID0gMDsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9TVEFUU19PUCwKLQkJCQkgICBHTE9CQUxfU1RBVFNfT1BfUkVBRF9DQVBUVVJFRCB8Ci0JCQkJICAgR0xPQkFMX1NUQVRTX09QX0hJU1RfUlhfVFggfCBzdGF0KTsKLQlpZiAocmV0IDwgMCkKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1NUQVRTX09QLAorCQkJCSBHTE9CQUxfU1RBVFNfT1BfUkVBRF9DQVBUVVJFRCB8CisJCQkJIEdMT0JBTF9TVEFUU19PUF9ISVNUX1JYX1RYIHwgc3RhdCk7CisJaWYgKGVycikKIAkJcmV0dXJuOwogCi0JcmV0ID0gX212ODhlNnh4eF9zdGF0c193YWl0KGNoaXApOwotCWlmIChyZXQgPCAwKQorCWVyciA9IF9tdjg4ZTZ4eHhfc3RhdHNfd2FpdChjaGlwKTsKKwlpZiAoZXJyKQogCQlyZXR1cm47CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9TVEFUU19DT1VOVEVSXzMyKTsKLQlpZiAocmV0IDwgMCkKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfU1RBVFNfQ09VTlRFUl8zMiwgJnJlZyk7CisJaWYgKGVycikKIAkJcmV0dXJuOwogCi0JX3ZhbCA9IHJldCA8PCAxNjsKKwl2YWx1ZSA9IHJlZyA8PCAxNjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1NUQVRTX0NPVU5URVJfMDEpOwotCWlmIChyZXQgPCAwKQorCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9TVEFUU19DT1VOVEVSXzAxLCAmcmVnKTsKKwlpZiAoZXJyKQogCQlyZXR1cm47CiAKLQkqdmFsID0gX3ZhbCB8IHJldDsKKwkqdmFsID0gdmFsdWUgfCByZWc7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgbXY4OGU2eHh4X2h3X3N0YXRzW10gPSB7CkBAIC03MDUsMjIgKzc3NCwyMiBAQAogewogCXUzMiBsb3c7CiAJdTMyIGhpZ2ggPSAwOwotCWludCByZXQ7CisJaW50IGVycjsKKwl1MTYgcmVnOwogCXU2NCB2YWx1ZTsKIAogCXN3aXRjaCAocy0+dHlwZSkgewogCWNhc2UgUE9SVDoKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgcy0+cmVnKTsKLQkJaWYgKHJldCA8IDApCisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgcy0+cmVnLCAmcmVnKTsKKwkJaWYgKGVycikKIAkJCXJldHVybiBVSU5UNjRfTUFYOwogCi0JCWxvdyA9IHJldDsKKwkJbG93ID0gcmVnOwogCQlpZiAocy0+c2l6ZW9mX3N0YXQgPT0gNCkgewotCQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJCSAgcy0+cmVnICsgMSk7Ci0JCQlpZiAocmV0IDwgMCkKKwkJCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgcy0+cmVnICsgMSwgJnJlZyk7CisJCQlpZiAoZXJyKQogCQkJCXJldHVybiBVSU5UNjRfTUFYOwotCQkJaGlnaCA9IHJldDsKKwkJCWhpZ2ggPSByZWc7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBCQU5LMDoKQEAgLTczNiw3ICs4MDUsNyBAQAogc3RhdGljIHZvaWQgbXY4OGU2eHh4X2dldF9zdHJpbmdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJICB1aW50OF90ICpkYXRhKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCXN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCAqc3RhdDsKIAlpbnQgaSwgajsKIApAQCAtNzUyLDcgKzgyMSw3IEBACiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X2dldF9zc2V0X2NvdW50KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgKnN0YXQ7CiAJaW50IGksIGo7CiAKQEAgLTc2Nyw3ICs4MzYsNyBAQAogc3RhdGljIHZvaWQgbXY4OGU2eHh4X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJCXVpbnQ2NF90ICpkYXRhKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCXN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCAqc3RhdDsKIAlpbnQgcmV0OwogCWludCBpLCBqOwpAQCAtNzk4LDcgKzg2Nyw5IEBACiBzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfZ2V0X3JlZ3Moc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpfcCkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKwlpbnQgZXJyOworCXUxNiByZWc7CiAJdTE2ICpwID0gX3A7CiAJaW50IGk7CiAKQEAgLTgwOSwxNzAgKzg4MCwxMDYgQEAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQlpbnQgcmV0OwogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQocG9ydCksIGkpOwotCQlpZiAocmV0ID49IDApCi0JCQlwW2ldID0gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9yZWFkKGNoaXAsIHBvcnQsIGksICZyZWcpOworCQlpZiAoIWVycikKKwkJCXBbaV0gPSByZWc7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgX212ODhlNnh4eF93YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgaW50IG9mZnNldCwKLQkJCSAgIHUxNiBtYXNrKQotewotCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBIWiAvIDEwOwotCi0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCWludCByZXQ7Ci0KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCByZWcsIG9mZnNldCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJaWYgKCEocmV0ICYgbWFzaykpCi0JCQlyZXR1cm4gMDsKLQotCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0JfQotCXJldHVybiAtRVRJTUVET1VUOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQotewotCXJldHVybiBfbXY4OGU2eHh4X3dhaXQoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfU01JX09QLAotCQkJICAgICAgIEdMT0JBTDJfU01JX09QX0JVU1kpOwotfQotCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfYXR1X3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewotCXJldHVybiBfbXY4OGU2eHh4X3dhaXQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9PUCwKLQkJCSAgICAgICBHTE9CQUxfQVRVX09QX0JVU1kpOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3JlYWRfaW5kaXJlY3Qoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCQlpbnQgYWRkciwgaW50IHJlZ251bSkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfU01JX09QLAotCQkJCSAgIEdMT0JBTDJfU01JX09QXzIyX1JFQUQgfCAoYWRkciA8PCA1KSB8Ci0JCQkJICAgcmVnbnVtKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dhaXQoY2hpcCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1NNSV9EQVRBKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fd3JpdGVfaW5kaXJlY3Qoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCQkgaW50IGFkZHIsIGludCByZWdudW0sIHUxNiB2YWwpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1NNSV9EQVRBLCB2YWwpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfU01JX09QLAotCQkJCSAgIEdMT0JBTDJfU01JX09QXzIyX1dSSVRFIHwgKGFkZHIgPDwgNSkgfAotCQkJCSAgIHJlZ251bSk7Ci0KLQlyZXR1cm4gbXY4OGU2eHh4X21kaW9fd2FpdChjaGlwKTsKKwlyZXR1cm4gbXY4OGU2eHh4X2cxX3dhaXQoY2hpcCwgR0xPQkFMX0FUVV9PUCwgR0xPQkFMX0FUVV9PUF9CVVNZKTsKIH0KIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfZ2V0X2VlZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9lZWUgKmUpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7Ci0JaW50IHJlZzsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKwl1MTYgcmVnOworCWludCBlcnI7CiAKIAlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRUVFKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCi0JcmVnID0gbXY4OGU2eHh4X21kaW9fcmVhZF9pbmRpcmVjdChjaGlwLCBwb3J0LCAxNik7Ci0JaWYgKHJlZyA8IDApCisJZXJyID0gbXY4OGU2eHh4X3BoeV9yZWFkKGNoaXAsIHBvcnQsIDE2LCAmcmVnKTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAogCWUtPmVlZV9lbmFibGVkID0gISEocmVnICYgMHgwMjAwKTsKIAllLT50eF9scGlfZW5hYmxlZCA9ICEhKHJlZyAmIDB4MDEwMCk7CiAKLQlyZWcgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX1NUQVRVUyk7Ci0JaWYgKHJlZyA8IDApCisJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBQT1JUX1NUQVRVUywgJnJlZyk7CisJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKIAllLT5lZWVfYWN0aXZlID0gISEocmVnICYgUE9SVF9TVEFUVVNfRUVFKTsKLQlyZWcgPSAwOwotCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JcmV0dXJuIHJlZzsKKworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3NldF9lZWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCSAgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgc3RydWN0IGV0aHRvb2xfZWVlICplKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOwotCWludCByZWc7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKwl1MTYgcmVnOworCWludCBlcnI7CiAKIAlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRUVFKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fcmVhZF9pbmRpcmVjdChjaGlwLCBwb3J0LCAxNik7Ci0JaWYgKHJldCA8IDApCisJZXJyID0gbXY4OGU2eHh4X3BoeV9yZWFkKGNoaXAsIHBvcnQsIDE2LCAmcmVnKTsKKwlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAotCXJlZyA9IHJldCAmIH4weDAzMDA7CisJcmVnICY9IH4weDAzMDA7CiAJaWYgKGUtPmVlZV9lbmFibGVkKQogCQlyZWcgfD0gMHgwMjAwOwogCWlmIChlLT50eF9scGlfZW5hYmxlZCkKIAkJcmVnIHw9IDB4MDEwMDsKIAotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2luZGlyZWN0KGNoaXAsIHBvcnQsIDE2LCByZWcpOworCWVyciA9IG12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgcG9ydCwgMTYsIHJlZyk7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9hdHVfY21kKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTE2IGZpZCwgdTE2IGNtZCkKIHsKLQlpbnQgcmV0OworCXUxNiB2YWw7CisJaW50IGVycjsKIAotCWlmIChtdjg4ZTZ4eHhfaGFzX2ZpZF9yZWcoY2hpcCkpIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9GSUQsCi0JCQkJCSAgIGZpZCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMV9BVFVfRklEKSkgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0FUVV9GSUQsIGZpZCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0gZWxzZSBpZiAobXY4OGU2eHh4X251bV9kYXRhYmFzZXMoY2hpcCkgPT0gMjU2KSB7CiAJCS8qIEFUVSBEQk51bVs3OjRdIGFyZSBsb2NhdGVkIGluIEFUVSBDb250cm9sIDE1OjEyICovCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9DT05UUk9MKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfQVRVX0NPTlRST0wsICZ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQVRVX0NPTlRST0wsCi0JCQkJCSAgIChyZXQgJiAweGZmZikgfAotCQkJCQkgICAoKGZpZCA8PCA4KSAmIDB4ZjAwMCkpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfQVRVX0NPTlRST0wsCisJCQkJCSAodmFsICYgMHhmZmYpIHwgKChmaWQgPDwgOCkgJiAweGYwMDApKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJLyogQVRVIERCTnVtWzM6MF0gYXJlIGxvY2F0ZWQgaW4gQVRVIE9wZXJhdGlvbiAzOjAgKi8KIAkJY21kIHw9IGZpZCAmIDB4ZjsKIAl9CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQVRVX09QLCBjbWQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfQVRVX09QLCBjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlyZXR1cm4gX212ODhlNnh4eF9hdHVfd2FpdChjaGlwKTsKIH0KQEAgLTk5Nyw3ICsxMDA0LDcgQEAKIAkJZGF0YSB8PSAoZW50cnktPnBvcnR2X3RydW5raWQgPDwgc2hpZnQpICYgbWFzazsKIAl9CiAKLQlyZXR1cm4gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9EQVRBLCBkYXRhKTsKKwlyZXR1cm4gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9BVFVfREFUQSwgZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9hdHVfZmx1c2hfbW92ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCkBAIC0xMDczLDU3ICsxMDgwLDQ1IEBACiAJCQkJIHU4IHN0YXRlKQogewogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGNoaXAtPmRzOwotCWludCByZWcsIHJldCA9IDA7CisJdTE2IHJlZzsKKwlpbnQgZXJyOwogCXU4IG9sZHN0YXRlOwogCi0JcmVnID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9DT05UUk9MKTsKLQlpZiAocmVnIDwgMCkKLQkJcmV0dXJuIHJlZzsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9yZWFkKGNoaXAsIHBvcnQsIFBPUlRfQ09OVFJPTCwgJnJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCW9sZHN0YXRlID0gcmVnICYgUE9SVF9DT05UUk9MX1NUQVRFX01BU0s7CiAKLQlpZiAob2xkc3RhdGUgIT0gc3RhdGUpIHsKLQkJLyogRmx1c2ggZm9yd2FyZGluZyBkYXRhYmFzZSBpZiB3ZSdyZSBtb3ZpbmcgYSBwb3J0Ci0JCSAqIGZyb20gTGVhcm5pbmcgb3IgRm9yd2FyZGluZyBzdGF0ZSB0byBEaXNhYmxlZCBvcgotCQkgKiBCbG9ja2luZyBvciBMaXN0ZW5pbmcgc3RhdGUuCi0JCSAqLwotCQlpZiAoKG9sZHN0YXRlID09IFBPUlRfQ09OVFJPTF9TVEFURV9MRUFSTklORyB8fAotCQkgICAgIG9sZHN0YXRlID09IFBPUlRfQ09OVFJPTF9TVEFURV9GT1JXQVJESU5HKSAmJgotCQkgICAgKHN0YXRlID09IFBPUlRfQ09OVFJPTF9TVEFURV9ESVNBQkxFRCB8fAotCQkgICAgIHN0YXRlID09IFBPUlRfQ09OVFJPTF9TVEFURV9CTE9DS0lORykpIHsKLQkJCXJldCA9IF9tdjg4ZTZ4eHhfYXR1X3JlbW92ZShjaGlwLCAwLCBwb3J0LCBmYWxzZSk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCX0KKwlyZWcgJj0gflBPUlRfQ09OVFJPTF9TVEFURV9NQVNLOworCXJlZyB8PSBzdGF0ZTsKIAotCQlyZWcgPSAocmVnICYgflBPUlRfQ09OVFJPTF9TVEFURV9NQVNLKSB8IHN0YXRlOwotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9DT05UUk9MLAotCQkJCQkgICByZWcpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0wsIHJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCQluZXRkZXZfZGJnKGRzLT5wb3J0c1twb3J0XS5uZXRkZXYsICJQb3J0U3RhdGUgJXMgKHdhcyAlcylcbiIsCi0JCQkgICBtdjg4ZTZ4eHhfcG9ydF9zdGF0ZV9uYW1lc1tzdGF0ZV0sCi0JCQkgICBtdjg4ZTZ4eHhfcG9ydF9zdGF0ZV9uYW1lc1tvbGRzdGF0ZV0pOwotCX0KKwluZXRkZXZfZGJnKGRzLT5wb3J0c1twb3J0XS5uZXRkZXYsICJQb3J0U3RhdGUgJXMgKHdhcyAlcylcbiIsCisJCSAgIG12ODhlNnh4eF9wb3J0X3N0YXRlX25hbWVzW3N0YXRlXSwKKwkJICAgbXY4OGU2eHh4X3BvcnRfc3RhdGVfbmFtZXNbb2xkc3RhdGVdKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9wb3J0X2Jhc2VkX3ZsYW5fbWFwKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmJyaWRnZSA9IGNoaXAtPnBvcnRzW3BvcnRdLmJyaWRnZV9kZXY7Ci0JY29uc3QgdTE2IG1hc2sgPSAoMSA8PCBjaGlwLT5pbmZvLT5udW1fcG9ydHMpIC0gMTsKKwljb25zdCB1MTYgbWFzayA9ICgxIDw8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCkpIC0gMTsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBjaGlwLT5kczsKIAl1MTYgb3V0cHV0X3BvcnRzID0gMDsKLQlpbnQgcmVnOworCXUxNiByZWc7CisJaW50IGVycjsKIAlpbnQgaTsKIAogCS8qIGFsbG93IENQVSBwb3J0IG9yIERTQSBsaW5rKHMpIHRvIHNlbmQgZnJhbWVzIHRvIGV2ZXJ5IHBvcnQgKi8KIAlpZiAoZHNhX2lzX2NwdV9wb3J0KGRzLCBwb3J0KSB8fCBkc2FfaXNfZHNhX3BvcnQoZHMsIHBvcnQpKSB7CiAJCW91dHB1dF9wb3J0cyA9IG1hc2s7CiAJfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyArK2kpIHsKIAkJCS8qIGFsbG93IHNlbmRpbmcgZnJhbWVzIHRvIGV2ZXJ5IGdyb3VwIG1lbWJlciAqLwogCQkJaWYgKGJyaWRnZSAmJiBjaGlwLT5wb3J0c1tpXS5icmlkZ2VfZGV2ID09IGJyaWRnZSkKIAkJCQlvdXRwdXRfcG9ydHMgfD0gQklUKGkpOwpAQCAtMTEzNywyMCArMTEzMiwyMCBAQAogCS8qIHByZXZlbnQgZnJhbWVzIGZyb20gZ29pbmcgYmFjayBvdXQgb2YgdGhlIHBvcnQgdGhleSBjYW1lIGluIG9uICovCiAJb3V0cHV0X3BvcnRzICY9IH5CSVQocG9ydCk7CiAKLQlyZWcgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0JBU0VfVkxBTik7Ci0JaWYgKHJlZyA8IDApCi0JCXJldHVybiByZWc7CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBQT1JUX0JBU0VfVkxBTiwgJnJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXJlZyAmPSB+bWFzazsKIAlyZWcgfD0gb3V0cHV0X3BvcnRzICYgbWFzazsKIAotCXJldHVybiBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9CQVNFX1ZMQU4sIHJlZyk7CisJcmV0dXJuIG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfQkFTRV9WTEFOLCByZWcpOwogfQogCiBzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfcG9ydF9zdHBfc3RhdGVfc2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJCSB1OCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlpbnQgc3RwX3N0YXRlOwogCWludCBlcnI7CiAKQEAgLTExODEsMjcgKzExNzYsMzkgQEAKIAkJCSAgIG12ODhlNnh4eF9wb3J0X3N0YXRlX25hbWVzW3N0cF9zdGF0ZV0pOwogfQogCitzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfcG9ydF9mYXN0X2FnZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJZXJyID0gX212ODhlNnh4eF9hdHVfcmVtb3ZlKGNoaXAsIDAsIHBvcnQsIGZhbHNlKTsKKwltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKKworCWlmIChlcnIpCisJCW5ldGRldl9lcnIoZHMtPnBvcnRzW3BvcnRdLm5ldGRldiwgImZhaWxlZCB0byBmbHVzaCBBVFVcbiIpOworfQorCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfcG9ydF9wdmlkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQsCiAJCQkJdTE2ICpuZXcsIHUxNiAqb2xkKQogewogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGNoaXAtPmRzOwotCXUxNiBwdmlkOwotCWludCByZXQ7CisJdTE2IHB2aWQsIHJlZzsKKwlpbnQgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9ERUZBVUxUX1ZMQU4pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9ERUZBVUxUX1ZMQU4sICZyZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlwdmlkID0gcmV0ICYgUE9SVF9ERUZBVUxUX1ZMQU5fTUFTSzsKKwlwdmlkID0gcmVnICYgUE9SVF9ERUZBVUxUX1ZMQU5fTUFTSzsKIAogCWlmIChuZXcpIHsKLQkJcmV0ICY9IH5QT1JUX0RFRkFVTFRfVkxBTl9NQVNLOwotCQlyZXQgfD0gKm5ldyAmIFBPUlRfREVGQVVMVF9WTEFOX01BU0s7CisJCXJlZyAmPSB+UE9SVF9ERUZBVUxUX1ZMQU5fTUFTSzsKKwkJcmVnIHw9ICpuZXcgJiBQT1JUX0RFRkFVTFRfVkxBTl9NQVNLOwogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLAotCQkJCQkgICBQT1JUX0RFRkFVTFRfVkxBTiwgcmV0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0RFRkFVTFRfVkxBTiwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJbmV0ZGV2X2RiZyhkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LAogCQkJICAgIkRlZmF1bHRWSUQgJWQgKHdhcyAlZClcbiIsICpuZXcsIHB2aWQpOwpAQCAtMTIyNywxNyArMTIzNCwxNiBAQAogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQogewotCXJldHVybiBfbXY4OGU2eHh4X3dhaXQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9PUCwKLQkJCSAgICAgICBHTE9CQUxfVlRVX09QX0JVU1kpOworCXJldHVybiBtdjg4ZTZ4eHhfZzFfd2FpdChjaGlwLCBHTE9CQUxfVlRVX09QLCBHTE9CQUxfVlRVX09QX0JVU1kpOwogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X2NtZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiBvcCkKIHsKLQlpbnQgcmV0OworCWludCBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX09QLCBvcCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9WVFVfT1AsIG9wKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJcmV0dXJuIF9tdjg4ZTZ4eHhfdnR1X3dhaXQoY2hpcCk7CiB9CkBAIC0xMjU0LDIzICsxMjYwLDIxIEBACiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF92dHVfc3R1X2RhdGFfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSAqZW50cnksCisJCQkJCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSwKIAkJCQkJdW5zaWduZWQgaW50IG5pYmJsZV9vZmZzZXQpCiB7CiAJdTE2IHJlZ3NbM107Ci0JaW50IGk7Ci0JaW50IHJldDsKKwlpbnQgaSwgZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IDM7ICsraSkgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsCi0JCQkJCSAgR0xPQkFMX1ZUVV9EQVRBXzBfMyArIGkpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCXUxNiAqcmVnID0gJnJlZ3NbaV07CiAKLQkJcmVnc1tpXSA9IHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1ZUVV9EQVRBXzBfMyArIGksIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5pbmZvLT5udW1fcG9ydHM7ICsraSkgeworCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyArK2kpIHsKIAkJdW5zaWduZWQgaW50IHNoaWZ0ID0gKGkgJSA0KSAqIDQgKyBuaWJibGVfb2Zmc2V0OwogCQl1MTYgcmVnID0gcmVnc1tpIC8gNF07CiAKQEAgLTEyODEsMjYgKzEyODUsMjUgQEAKIH0KIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfdnR1X2RhdGFfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCQkgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSAqZW50cnkpCiB7CiAJcmV0dXJuIF9tdjg4ZTZ4eHhfdnR1X3N0dV9kYXRhX3JlYWQoY2hpcCwgZW50cnksIDApOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zdHVfZGF0YV9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5KQorCQkJCSAgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSkKIHsKIAlyZXR1cm4gX212ODhlNnh4eF92dHVfc3R1X2RhdGFfcmVhZChjaGlwLCBlbnRyeSwgMik7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF92dHVfc3R1X2RhdGFfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCQkgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSwKKwkJCQkJIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5ICplbnRyeSwKIAkJCQkJIHVuc2lnbmVkIGludCBuaWJibGVfb2Zmc2V0KQogewogCXUxNiByZWdzWzNdID0geyAwIH07Ci0JaW50IGk7Ci0JaW50IHJldDsKKwlpbnQgaSwgZXJyOwogCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7ICsraSkgewogCQl1bnNpZ25lZCBpbnQgc2hpZnQgPSAoaSAlIDQpICogNCArIG5pYmJsZV9vZmZzZXQ7CiAJCXU4IGRhdGEgPSBlbnRyeS0+ZGF0YVtpXTsKIApAQCAtMTMwOCw4NiArMTMxMSw4NSBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwKLQkJCQkJICAgR0xPQkFMX1ZUVV9EQVRBXzBfMyArIGksIHJlZ3NbaV0pOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCXUxNiByZWcgPSByZWdzW2ldOworCisJCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfVlRVX0RBVEFfMF8zICsgaSwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3Z0dV9kYXRhX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewogCXJldHVybiBfbXY4OGU2eHh4X3Z0dV9zdHVfZGF0YV93cml0ZShjaGlwLCBlbnRyeSwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3N0dV9kYXRhX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewogCXJldHVybiBfbXY4OGU2eHh4X3Z0dV9zdHVfZGF0YV93cml0ZShjaGlwLCBlbnRyeSwgMik7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF92dHVfdmlkX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTE2IHZpZCkKIHsKLQlyZXR1cm4gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9WSUQsCi0JCQkJICAgIHZpZCAmIEdMT0JBTF9WVFVfVklEX01BU0spOworCXJldHVybiBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1ZUVV9WSUQsCisJCQkJICB2aWQgJiBHTE9CQUxfVlRVX1ZJRF9NQVNLKTsKIH0KIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3Z0dV9nZXRuZXh0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgIHN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSAqZW50cnkpCisJCQkJICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSAqZW50cnkpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IG5leHQgPSB7IDAgfTsKLQlpbnQgcmV0OworCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5IG5leHQgPSB7IDAgfTsKKwl1MTYgdmFsOworCWludCBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3Z0dV93YWl0KGNoaXApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfdnR1X3dhaXQoY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfdnR1X2NtZChjaGlwLCBHTE9CQUxfVlRVX09QX1ZUVV9HRVRfTkVYVCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gX212ODhlNnh4eF92dHVfY21kKGNoaXAsIEdMT0JBTF9WVFVfT1BfVlRVX0dFVF9ORVhUKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX1ZJRCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1ZUVV9WSUQsICZ2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQluZXh0LnZpZCA9IHJldCAmIEdMT0JBTF9WVFVfVklEX01BU0s7Ci0JbmV4dC52YWxpZCA9ICEhKHJldCAmIEdMT0JBTF9WVFVfVklEX1ZBTElEKTsKKwluZXh0LnZpZCA9IHZhbCAmIEdMT0JBTF9WVFVfVklEX01BU0s7CisJbmV4dC52YWxpZCA9ICEhKHZhbCAmIEdMT0JBTF9WVFVfVklEX1ZBTElEKTsKIAogCWlmIChuZXh0LnZhbGlkKSB7Ci0JCXJldCA9IG12ODhlNnh4eF92dHVfZGF0YV9yZWFkKGNoaXAsICZuZXh0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfdnR1X2RhdGFfcmVhZChjaGlwLCAmbmV4dCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCi0JCWlmIChtdjg4ZTZ4eHhfaGFzX2ZpZF9yZWcoY2hpcCkpIHsKLQkJCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwKLQkJCQkJCSAgR0xPQkFMX1ZUVV9GSUQpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKKwkJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzFfVlRVX0ZJRCkpIHsKKwkJCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9WVFVfRklELCAmdmFsKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKIAotCQkJbmV4dC5maWQgPSByZXQgJiBHTE9CQUxfVlRVX0ZJRF9NQVNLOworCQkJbmV4dC5maWQgPSB2YWwgJiBHTE9CQUxfVlRVX0ZJRF9NQVNLOwogCQl9IGVsc2UgaWYgKG12ODhlNnh4eF9udW1fZGF0YWJhc2VzKGNoaXApID09IDI1NikgewogCQkJLyogVlRVIERCTnVtWzc6NF0gYXJlIGxvY2F0ZWQgaW4gVlRVIE9wZXJhdGlvbiAxMTo4LCBhbmQKIAkJCSAqIFZUVSBEQk51bVszOjBdIGFyZSBsb2NhdGVkIGluIFZUVSBPcGVyYXRpb24gMzowCiAJCQkgKi8KLQkJCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwKLQkJCQkJCSAgR0xPQkFMX1ZUVV9PUCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OworCQkJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX1ZUVV9PUCwgJnZhbCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CiAKLQkJCW5leHQuZmlkID0gKHJldCAmIDB4ZjAwKSA+PiA0OwotCQkJbmV4dC5maWQgfD0gcmV0ICYgMHhmOworCQkJbmV4dC5maWQgPSAodmFsICYgMHhmMDApID4+IDQ7CisJCQluZXh0LmZpZCB8PSB2YWwgJiAweGY7CiAJCX0KIAogCQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19TVFUpKSB7Ci0JCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsCi0JCQkJCQkgIEdMT0JBTF9WVFVfU0lEKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCXJldHVybiByZXQ7CisJCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfVlRVX1NJRCwgJnZhbCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CiAKLQkJCW5leHQuc2lkID0gcmV0ICYgR0xPQkFMX1ZUVV9TSURfTUFTSzsKKwkJCW5leHQuc2lkID0gdmFsICYgR0xPQkFMX1ZUVV9TSURfTUFTSzsKIAkJfQogCX0KIApAQCAtMTM5OSw4ICsxNDAxLDggQEAKIAkJCQkgICAgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuLAogCQkJCSAgICBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IG5leHQ7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgbmV4dDsKIAl1MTYgcHZpZDsKIAlpbnQgZXJyOwogCkBAIC0xNDUxLDM4ICsxNDUzLDM2IEBACiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF92dHVfbG9hZHB1cmdlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5ICplbnRyeSkKKwkJCQkgICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewogCXUxNiBvcCA9IEdMT0JBTF9WVFVfT1BfVlRVX0xPQURfUFVSR0U7CiAJdTE2IHJlZyA9IDA7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF92dHVfd2FpdChjaGlwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X3Z0dV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAoIWVudHJ5LT52YWxpZCkKIAkJZ290byBsb2FkcHVyZ2U7CiAKIAkvKiBXcml0ZSBwb3J0IG1lbWJlciB0YWdzICovCi0JcmV0ID0gbXY4OGU2eHh4X3Z0dV9kYXRhX3dyaXRlKGNoaXAsIGVudHJ5KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfdnR1X2RhdGFfd3JpdGUoY2hpcCwgZW50cnkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19TVFUpKSB7CiAJCXJlZyA9IGVudHJ5LT5zaWQgJiBHTE9CQUxfVlRVX1NJRF9NQVNLOwotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX1NJRCwKLQkJCQkJICAgcmVnKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1ZUVV9TSUQsIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmIChtdjg4ZTZ4eHhfaGFzX2ZpZF9yZWcoY2hpcCkpIHsKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMV9WVFVfRklEKSkgewogCQlyZWcgPSBlbnRyeS0+ZmlkICYgR0xPQkFMX1ZUVV9GSURfTUFTSzsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9GSUQsCi0JCQkJCSAgIHJlZyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9WVFVfRklELCByZWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9IGVsc2UgaWYgKG12ODhlNnh4eF9udW1fZGF0YWJhc2VzKGNoaXApID09IDI1NikgewogCQkvKiBWVFUgREJOdW1bNzo0XSBhcmUgbG9jYXRlZCBpbiBWVFUgT3BlcmF0aW9uIDExOjgsIGFuZAogCQkgKiBWVFUgREJOdW1bMzowXSBhcmUgbG9jYXRlZCBpbiBWVFUgT3BlcmF0aW9uIDM6MApAQCAtMTQ5NCw0OCArMTQ5NCw0OSBAQAogCXJlZyA9IEdMT0JBTF9WVFVfVklEX1ZBTElEOwogbG9hZHB1cmdlOgogCXJlZyB8PSBlbnRyeS0+dmlkICYgR0xPQkFMX1ZUVV9WSURfTUFTSzsKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX1ZJRCwgcmVnKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1ZUVV9WSUQsIHJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXJldHVybiBfbXY4OGU2eHh4X3Z0dV9jbWQoY2hpcCwgb3ApOwogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfc3R1X2dldG5leHQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1OCBzaWQsCi0JCQkJICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5KQorCQkJCSAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSBuZXh0ID0geyAwIH07Ci0JaW50IHJldDsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSBuZXh0ID0geyAwIH07CisJdTE2IHZhbDsKKwlpbnQgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF92dHVfd2FpdChjaGlwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X3Z0dV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX1NJRCwKLQkJCQkgICBzaWQgJiBHTE9CQUxfVlRVX1NJRF9NQVNLKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1ZUVV9TSUQsCisJCQkJIHNpZCAmIEdMT0JBTF9WVFVfU0lEX01BU0spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3Z0dV9jbWQoY2hpcCwgR0xPQkFMX1ZUVV9PUF9TVFVfR0VUX05FWFQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfdnR1X2NtZChjaGlwLCBHTE9CQUxfVlRVX09QX1NUVV9HRVRfTkVYVCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9TSUQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9WVFVfU0lELCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JbmV4dC5zaWQgPSByZXQgJiBHTE9CQUxfVlRVX1NJRF9NQVNLOworCW5leHQuc2lkID0gdmFsICYgR0xPQkFMX1ZUVV9TSURfTUFTSzsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9WSUQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9nMV9yZWFkKGNoaXAsIEdMT0JBTF9WVFVfVklELCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JbmV4dC52YWxpZCA9ICEhKHJldCAmIEdMT0JBTF9WVFVfVklEX1ZBTElEKTsKKwluZXh0LnZhbGlkID0gISEodmFsICYgR0xPQkFMX1ZUVV9WSURfVkFMSUQpOwogCiAJaWYgKG5leHQudmFsaWQpIHsKLQkJcmV0ID0gbXY4OGU2eHh4X3N0dV9kYXRhX3JlYWQoY2hpcCwgJm5leHQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCWVyciA9IG12ODhlNnh4eF9zdHVfZGF0YV9yZWFkKGNoaXAsICZuZXh0KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJKmVudHJ5ID0gbmV4dDsKQEAgLTE1NDMsMzMgKzE1NDQsMzMgQEAKIH0KIAogc3RhdGljIGludCBfbXY4OGU2eHh4X3N0dV9sb2FkcHVyZ2Uoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5KQorCQkJCSAgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSAqZW50cnkpCiB7CiAJdTE2IHJlZyA9IDA7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCi0JcmV0ID0gX212ODhlNnh4eF92dHVfd2FpdChjaGlwKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X3Z0dV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlpZiAoIWVudHJ5LT52YWxpZCkKIAkJZ290byBsb2FkcHVyZ2U7CiAKIAkvKiBXcml0ZSBwb3J0IHN0YXRlcyAqLwotCXJldCA9IG12ODhlNnh4eF9zdHVfZGF0YV93cml0ZShjaGlwLCBlbnRyeSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X3N0dV9kYXRhX3dyaXRlKGNoaXAsIGVudHJ5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJcmVnID0gR0xPQkFMX1ZUVV9WSURfVkFMSUQ7CiBsb2FkcHVyZ2U6Ci0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX1ZUVV9WSUQsIHJlZyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9WVFVfVklELCByZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAlyZWcgPSBlbnRyeS0+c2lkICYgR0xPQkFMX1ZUVV9TSURfTUFTSzsKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfVlRVX1NJRCwgcmVnKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX1ZUVV9TSUQsIHJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCXJldHVybiBfbXY4OGU2eHh4X3Z0dV9jbWQoY2hpcCwgR0xPQkFMX1ZUVV9PUF9TVFVfTE9BRF9QVVJHRSk7CiB9CkBAIC0xNTgwLDcgKzE1ODEsOCBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGNoaXAtPmRzOwogCXUxNiB1cHBlcl9tYXNrOwogCXUxNiBmaWQ7Ci0JaW50IHJldDsKKwl1MTYgcmVnOworCWludCBlcnI7CiAKIAlpZiAobXY4OGU2eHh4X251bV9kYXRhYmFzZXMoY2hpcCkgPT0gNDA5NikKIAkJdXBwZXJfbWFzayA9IDB4ZmY7CkBAIC0xNTkwLDM3ICsxNTkyLDM1IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCS8qIFBvcnQncyBkZWZhdWx0IEZJRCBiaXRzIDM6MCBhcmUgbG9jYXRlZCBpbiByZWcgMHgwNiwgb2Zmc2V0IDEyICovCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9CQVNFX1ZMQU4pOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9CQVNFX1ZMQU4sICZyZWcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlmaWQgPSAocmV0ICYgUE9SVF9CQVNFX1ZMQU5fRklEXzNfMF9NQVNLKSA+PiAxMjsKKwlmaWQgPSAocmVnICYgUE9SVF9CQVNFX1ZMQU5fRklEXzNfMF9NQVNLKSA+PiAxMjsKIAogCWlmIChuZXcpIHsKLQkJcmV0ICY9IH5QT1JUX0JBU0VfVkxBTl9GSURfM18wX01BU0s7Ci0JCXJldCB8PSAoKm5ldyA8PCAxMikgJiBQT1JUX0JBU0VfVkxBTl9GSURfM18wX01BU0s7CisJCXJlZyAmPSB+UE9SVF9CQVNFX1ZMQU5fRklEXzNfMF9NQVNLOworCQlyZWcgfD0gKCpuZXcgPDwgMTIpICYgUE9SVF9CQVNFX1ZMQU5fRklEXzNfMF9NQVNLOwogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0JBU0VfVkxBTiwKLQkJCQkJICAgcmV0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0JBU0VfVkxBTiwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJLyogUG9ydCdzIGRlZmF1bHQgRklEIGJpdHMgMTE6NCBhcmUgbG9jYXRlZCBpbiByZWcgMHgwNSwgb2Zmc2V0IDAgKi8KLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0NPTlRST0xfMSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0xfMSwgJnJlZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCWZpZCB8PSAocmV0ICYgdXBwZXJfbWFzaykgPDwgNDsKKwlmaWQgfD0gKHJlZyAmIHVwcGVyX21hc2spIDw8IDQ7CiAKIAlpZiAobmV3KSB7Ci0JCXJldCAmPSB+dXBwZXJfbWFzazsKLQkJcmV0IHw9ICgqbmV3ID4+IDQpICYgdXBwZXJfbWFzazsKKwkJcmVnICY9IH51cHBlcl9tYXNrOworCQlyZWcgfD0gKCpuZXcgPj4gNCkgJiB1cHBlcl9tYXNrOwogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0NPTlRST0xfMSwKLQkJCQkJICAgcmV0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0xfMSwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJbmV0ZGV2X2RiZyhkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LAogCQkJICAgIkZJRCAlZCAod2FzICVkKVxuIiwgKm5ldywgZmlkKTsKQEAgLTE2NDcsMTMgKzE2NDcsMTMgQEAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9maWRfbmV3KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTE2ICpmaWQpCiB7CiAJREVDTEFSRV9CSVRNQVAoZmlkX2JpdG1hcCwgTVY4OEU2WFhYX05fRklEKTsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgdmxhbjsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSB2bGFuOwogCWludCBpLCBlcnI7CiAKIAliaXRtYXBfemVybyhmaWRfYml0bWFwLCBNVjg4RTZYWFhfTl9GSUQpOwogCiAJLyogU2V0IGV2ZXJ5IEZJRCBiaXQgdXNlZCBieSB0aGUgKHVuKWJyaWRnZWQgcG9ydHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKTsgKytpKSB7CiAJCWVyciA9IF9tdjg4ZTZ4eHhfcG9ydF9maWRfZ2V0KGNoaXAsIGksIGZpZCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtMTY4OSwxMCArMTY4OSwxMCBAQAogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X25ldyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiB2aWQsCi0JCQkgICAgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5KQorCQkJICAgICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5KQogewogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGNoaXAtPmRzOwotCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X3N0dV9lbnRyeSB2bGFuID0geworCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5IHZsYW4gPSB7CiAJCS52YWxpZCA9IHRydWUsCiAJCS52aWQgPSB2aWQsCiAJfTsKQEAgLTE3MDMsMTQgKzE3MDMsMTQgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIGV4Y2x1ZGUgYWxsIHBvcnRzIGV4Y2VwdCB0aGUgQ1BVIGFuZCBEU0EgcG9ydHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzOyArK2kpCisJZm9yIChpID0gMDsgaSA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7ICsraSkKIAkJdmxhbi5kYXRhW2ldID0gZHNhX2lzX2NwdV9wb3J0KGRzLCBpKSB8fCBkc2FfaXNfZHNhX3BvcnQoZHMsIGkpCiAJCQk/IEdMT0JBTF9WVFVfREFUQV9NRU1CRVJfVEFHX1VOTU9ESUZJRUQKIAkJCTogR0xPQkFMX1ZUVV9EQVRBX01FTUJFUl9UQUdfTk9OX01FTUJFUjsKIAogCWlmIChtdjg4ZTZ4eHhfNjA5N19mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYxNjVfZmFtaWx5KGNoaXApIHx8CiAJICAgIG12ODhlNnh4eF82MzUxX2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkpIHsKLQkJc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHZzdHA7CisJCXN0cnVjdCBtdjg4ZTZ4eHhfdnR1X2VudHJ5IHZzdHA7CiAKIAkJLyogQWRkaW5nIGEgVlRVIGVudHJ5IHJlcXVpcmVzIGEgdmFsaWQgU1RVIGVudHJ5LiBBcyBWU1RQIGlzIG5vdAogCQkgKiBpbXBsZW1lbnRlZCwgb25seSBvbmUgU1RVIGVudHJ5IGlzIG5lZWRlZCB0byBjb3ZlciBhbGwgVlRVCkBAIC0xNzM3LDcgKzE3MzcsNyBAQAogfQogCiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdnR1X2dldChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiB2aWQsCi0JCQkgICAgICBzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgKmVudHJ5LCBib29sIGNyZWF0KQorCQkJICAgICAgc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgKmVudHJ5LCBib29sIGNyZWF0KQogewogCWludCBlcnI7CiAKQEAgLTE3NjgsOCArMTc2OCw4IEBACiBzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X2NoZWNrX2h3X3ZsYW4oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkJdTE2IHZpZF9iZWdpbiwgdTE2IHZpZF9lbmQpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHZsYW47CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgdmxhbjsKIAlpbnQgaSwgZXJyOwogCiAJaWYgKCF2aWRfYmVnaW4pCkBAIC0xNzkyLDcgKzE3OTIsNyBAQAogCQlpZiAodmxhbi52aWQgPiB2aWRfZW5kKQogCQkJYnJlYWs7CiAKLQkJZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyArK2kpIHsKIAkJCWlmIChkc2FfaXNfZHNhX3BvcnQoZHMsIGkpIHx8IGRzYV9pc19jcHVfcG9ydChkcywgaSkpCiAJCQkJY29udGludWU7CiAKQEAgLTE4MjksMjkgKzE4MjksMjkgQEAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfdmxhbl9maWx0ZXJpbmcoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKIAkJCQkJIGJvb2wgdmxhbl9maWx0ZXJpbmcpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJdTE2IG9sZCwgbmV3ID0gdmxhbl9maWx0ZXJpbmcgPyBQT1JUX0NPTlRST0xfMl84MDIxUV9TRUNVUkUgOgogCQlQT1JUX0NPTlRST0xfMl84MDIxUV9ESVNBQkxFRDsKLQlpbnQgcmV0OworCXUxNiByZWc7CisJaW50IGVycjsKIAogCWlmICghbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19WVFUpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0NPTlRST0xfMik7Ci0JaWYgKHJldCA8IDApCisJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0xfMiwgJnJlZyk7CisJaWYgKGVycikKIAkJZ290byB1bmxvY2s7CiAKLQlvbGQgPSByZXQgJiBQT1JUX0NPTlRST0xfMl84MDIxUV9NQVNLOworCW9sZCA9IHJlZyAmIFBPUlRfQ09OVFJPTF8yXzgwMjFRX01BU0s7CiAKIAlpZiAobmV3ICE9IG9sZCkgewotCQlyZXQgJj0gflBPUlRfQ09OVFJPTF8yXzgwMjFRX01BU0s7Ci0JCXJldCB8PSBuZXcgJiBQT1JUX0NPTlRST0xfMl84MDIxUV9NQVNLOworCQlyZWcgJj0gflBPUlRfQ09OVFJPTF8yXzgwMjFRX01BU0s7CisJCXJlZyB8PSBuZXcgJiBQT1JUX0NPTlRST0xfMl84MDIxUV9NQVNLOwogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0NPTlRST0xfMiwKLQkJCQkJICAgcmV0KTsKLQkJaWYgKHJldCA8IDApCisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfQ09OVFJPTF8yLCByZWcpOworCQlpZiAoZXJyKQogCQkJZ290byB1bmxvY2s7CiAKIAkJbmV0ZGV2X2RiZyhkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LCAiODAyLjFRIE1vZGUgJXMgKHdhcyAlcylcbiIsCkBAIC0xODU5LDExICsxODU5LDExIEBACiAJCQkgICBtdjg4ZTZ4eHhfcG9ydF84MDIxcV9tb2RlX25hbWVzW29sZF0pOwogCX0KIAotCXJldCA9IDA7CisJZXJyID0gMDsKIHVubG9jazoKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludApAQCAtMTg3MSw3ICsxODcxLDcgQEAKIAkJCSAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4sCiAJCQkgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IGVycjsKIAogCWlmICghbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19WVFUpKQpAQCAtMTg5NCw3ICsxODk0LDcgQEAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9wb3J0X3ZsYW5fYWRkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQsCiAJCQkJICAgIHUxNiB2aWQsIGJvb2wgdW50YWdnZWQpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHZsYW47CisJc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgdmxhbjsKIAlpbnQgZXJyOwogCiAJZXJyID0gX212ODhlNnh4eF92dHVfZ2V0KGNoaXAsIHZpZCwgJnZsYW4sIHRydWUpOwpAQCAtMTkxMiw3ICsxOTEyLDcgQEAKIAkJCQkgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuLAogCQkJCSAgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlib29sIHVudGFnZ2VkID0gdmxhbi0+ZmxhZ3MgJiBCUklER0VfVkxBTl9JTkZPX1VOVEFHR0VEOwogCWJvb2wgcHZpZCA9IHZsYW4tPmZsYWdzICYgQlJJREdFX1ZMQU5fSU5GT19QVklEOwogCXUxNiB2aWQ7CkBAIC0xOTM5LDcgKzE5MzksNyBAQAogCQkJCSAgICBpbnQgcG9ydCwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBjaGlwLT5kczsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgdmxhbjsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSB2bGFuOwogCWludCBpLCBlcnI7CiAKIAllcnIgPSBfbXY4OGU2eHh4X3Z0dV9nZXQoY2hpcCwgdmlkLCAmdmxhbiwgZmFsc2UpOwpAQCAtMTk1NCw3ICsxOTU0LDcgQEAKIAogCS8qIGtlZXAgdGhlIFZMQU4gdW5sZXNzIGFsbCBwb3J0cyBhcmUgZXhjbHVkZWQgKi8KIAl2bGFuLnZhbGlkID0gZmFsc2U7Ci0JZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7ICsraSkgewogCQlpZiAoZHNhX2lzX2NwdV9wb3J0KGRzLCBpKSB8fCBkc2FfaXNfZHNhX3BvcnQoZHMsIGkpKQogCQkJY29udGludWU7CiAKQEAgLTE5NzQsNyArMTk3NCw3IEBACiBzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X3ZsYW5fZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuICp2bGFuKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCXUxNiBwdmlkLCB2aWQ7CiAJaW50IGVyciA9IDA7CiAKQEAgLTIwMDgsMTQgKzIwMDgsMTMgQEAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9hdHVfbWFjX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKIAkJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKIHsKLQlpbnQgaSwgcmV0OworCWludCBpLCBlcnI7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKAotCQkJY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9NQUNfMDEgKyBpLAotCQkJKGFkZHJbaSAqIDJdIDw8IDgpIHwgYWRkcltpICogMiArIDFdKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0FUVV9NQUNfMDEgKyBpLAorCQkJCQkgKGFkZHJbaSAqIDJdIDw8IDgpIHwgYWRkcltpICogMiArIDFdKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yMDI0LDE1ICsyMDIzLDE2IEBACiBzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfYXR1X21hY19yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKIAkJCQkgICB1bnNpZ25lZCBjaGFyICphZGRyKQogewotCWludCBpLCByZXQ7CisJdTE2IHZhbDsKKwlpbnQgaSwgZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsCi0JCQkJCSAgR0xPQkFMX0FUVV9NQUNfMDEgKyBpKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlhZGRyW2kgKiAyXSA9IHJldCA+PiA4OwotCQlhZGRyW2kgKiAyICsgMV0gPSByZXQgJiAweGZmOworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCBHTE9CQUxfQVRVX01BQ18wMSArIGksICZ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlhZGRyW2kgKiAyXSA9IHZhbCA+PiA4OworCQlhZGRyW2kgKiAyICsgMV0gPSB2YWwgJiAweGZmOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjA1OCwxMiArMjA1OCw0OCBAQAogCXJldHVybiBfbXY4OGU2eHh4X2F0dV9jbWQoY2hpcCwgZW50cnktPmZpZCwgR0xPQkFMX0FUVV9PUF9MT0FEX0RCKTsKIH0KIAotc3RhdGljIGludCBfbXY4OGU2eHh4X3BvcnRfZmRiX2xvYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9ydCwKLQkJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCwKLQkJCQkgICAgdTggc3RhdGUpCitzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfYXR1X2dldG5leHQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1MTYgZmlkLAorCQkJCSAgc3RydWN0IG12ODhlNnh4eF9hdHVfZW50cnkgKmVudHJ5KTsKKworc3RhdGljIGludCBtdjg4ZTZ4eHhfYXR1X2dldChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBmaWQsCisJCQkgICAgIGNvbnN0IHU4ICphZGRyLCBzdHJ1Y3QgbXY4OGU2eHh4X2F0dV9lbnRyeSAqZW50cnkpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9hdHVfZW50cnkgZW50cnkgPSB7IDAgfTsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9zdHVfZW50cnkgdmxhbjsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2F0dV9lbnRyeSBuZXh0OworCWludCBlcnI7CisKKwlldGhfYnJvYWRjYXN0X2FkZHIobmV4dC5tYWMpOworCisJZXJyID0gX212ODhlNnh4eF9hdHVfbWFjX3dyaXRlKGNoaXAsIG5leHQubWFjKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZG8geworCQllcnIgPSBfbXY4OGU2eHh4X2F0dV9nZXRuZXh0KGNoaXAsIGZpZCwgJm5leHQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAobmV4dC5zdGF0ZSA9PSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVU5VU0VEKQorCQkJYnJlYWs7CisKKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobmV4dC5tYWMsIGFkZHIpKSB7CisJCQkqZW50cnkgPSBuZXh0OworCQkJcmV0dXJuIDA7CisJCX0KKwl9IHdoaWxlICghaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIobmV4dC5tYWMpKTsKKworCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKCplbnRyeSkpOworCWVudHJ5LT5maWQgPSBmaWQ7CisJZXRoZXJfYWRkcl9jb3B5KGVudHJ5LT5tYWMsIGFkZHIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfZGJfbG9hZF9wdXJnZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb3J0LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkLAorCQkJCQl1OCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSB2bGFuOworCXN0cnVjdCBtdjg4ZTZ4eHhfYXR1X2VudHJ5IGVudHJ5OwogCWludCBlcnI7CiAKIAkvKiBOdWxsIFZMQU4gSUQgY29ycmVzcG9uZHMgdG8gdGhlIHBvcnQgcHJpdmF0ZSBkYXRhYmFzZSAqLwpAQCAtMjA3NCwxMiArMjExMCwxOCBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQllbnRyeS5maWQgPSB2bGFuLmZpZDsKLQllbnRyeS5zdGF0ZSA9IHN0YXRlOwotCWV0aGVyX2FkZHJfY29weShlbnRyeS5tYWMsIGFkZHIpOwotCWlmIChzdGF0ZSAhPSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVU5VU0VEKSB7Ci0JCWVudHJ5LnRydW5rID0gZmFsc2U7Ci0JCWVudHJ5LnBvcnR2X3RydW5raWQgPSBCSVQocG9ydCk7CisJZXJyID0gbXY4OGU2eHh4X2F0dV9nZXQoY2hpcCwgdmxhbi5maWQsIGFkZHIsICZlbnRyeSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFB1cmdlIHRoZSBBVFUgZW50cnkgb25seSBpZiBubyBwb3J0IGlzIHVzaW5nIGl0IGFueW1vcmUgKi8KKwlpZiAoc3RhdGUgPT0gR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VOVVNFRCkgeworCQllbnRyeS5wb3J0dl90cnVua2lkICY9IH5CSVQocG9ydCk7CisJCWlmICghZW50cnkucG9ydHZfdHJ1bmtpZCkKKwkJCWVudHJ5LnN0YXRlID0gR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VOVVNFRDsKKwl9IGVsc2UgeworCQllbnRyeS5wb3J0dl90cnVua2lkIHw9IEJJVChwb3J0KTsKKwkJZW50cnkuc3RhdGUgPSBzdGF0ZTsKIAl9CiAKIAlyZXR1cm4gX212ODhlNnh4eF9hdHVfbG9hZChjaGlwLCAmZW50cnkpOwpAQCAtMjA5OSw2MSArMjE0MSw1OSBAQAogCQkJCSAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCiAJCQkJICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCiB7Ci0JaW50IHN0YXRlID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZmRiLT5hZGRyKSA/Ci0JCUdMT0JBTF9BVFVfREFUQV9TVEFURV9NQ19TVEFUSUMgOgotCQlHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVUNfU1RBVElDOwotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCWlmIChfbXY4OGU2eHh4X3BvcnRfZmRiX2xvYWQoY2hpcCwgcG9ydCwgZmRiLT5hZGRyLCBmZGItPnZpZCwgc3RhdGUpKQotCQluZXRkZXZfZXJyKGRzLT5wb3J0c1twb3J0XS5uZXRkZXYsCi0JCQkgICAiZmFpbGVkIHRvIGxvYWQgTUFDIGFkZHJlc3NcbiIpOworCWlmIChtdjg4ZTZ4eHhfcG9ydF9kYl9sb2FkX3B1cmdlKGNoaXAsIHBvcnQsIGZkYi0+YWRkciwgZmRiLT52aWQsCisJCQkJCSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVUNfU1RBVElDKSkKKwkJbmV0ZGV2X2Vycihkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2LCAiZmFpbGVkIHRvIGxvYWQgdW5pY2FzdCBNQUMgYWRkcmVzc1xuIik7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfZmRiX2RlbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYikKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKLQlpbnQgcmV0OworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCWludCBlcnI7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JcmV0ID0gX212ODhlNnh4eF9wb3J0X2ZkYl9sb2FkKGNoaXAsIHBvcnQsIGZkYi0+YWRkciwgZmRiLT52aWQsCi0JCQkJICAgICAgIEdMT0JBTF9BVFVfREFUQV9TVEFURV9VTlVTRUQpOworCWVyciA9IG12ODhlNnh4eF9wb3J0X2RiX2xvYWRfcHVyZ2UoY2hpcCwgcG9ydCwgZmRiLT5hZGRyLCBmZGItPnZpZCwKKwkJCQkJICAgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VOVVNFRCk7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgX212ODhlNnh4eF9hdHVfZ2V0bmV4dChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiBmaWQsCiAJCQkJICBzdHJ1Y3QgbXY4OGU2eHh4X2F0dV9lbnRyeSAqZW50cnkpCiB7CiAJc3RydWN0IG12ODhlNnh4eF9hdHVfZW50cnkgbmV4dCA9IHsgMCB9OwotCWludCByZXQ7CisJdTE2IHZhbDsKKwlpbnQgZXJyOwogCiAJbmV4dC5maWQgPSBmaWQ7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X2F0dV93YWl0KGNoaXApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfYXR1X3dhaXQoY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfYXR1X2NtZChjaGlwLCBmaWQsIEdMT0JBTF9BVFVfT1BfR0VUX05FWFRfREIpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfYXR1X2NtZChjaGlwLCBmaWQsIEdMT0JBTF9BVFVfT1BfR0VUX05FWFRfREIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X2F0dV9tYWNfcmVhZChjaGlwLCBuZXh0Lm1hYyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gX212ODhlNnh4eF9hdHVfbWFjX3JlYWQoY2hpcCwgbmV4dC5tYWMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfREFUQSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX0FUVV9EQVRBLCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JbmV4dC5zdGF0ZSA9IHJldCAmIEdMT0JBTF9BVFVfREFUQV9TVEFURV9NQVNLOworCW5leHQuc3RhdGUgPSB2YWwgJiBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfTUFTSzsKIAlpZiAobmV4dC5zdGF0ZSAhPSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVU5VU0VEKSB7CiAJCXVuc2lnbmVkIGludCBtYXNrLCBzaGlmdDsKIAotCQlpZiAocmV0ICYgR0xPQkFMX0FUVV9EQVRBX1RSVU5LKSB7CisJCWlmICh2YWwgJiBHTE9CQUxfQVRVX0RBVEFfVFJVTkspIHsKIAkJCW5leHQudHJ1bmsgPSB0cnVlOwogCQkJbWFzayA9IEdMT0JBTF9BVFVfREFUQV9UUlVOS19JRF9NQVNLOwogCQkJc2hpZnQgPSBHTE9CQUxfQVRVX0RBVEFfVFJVTktfSURfU0hJRlQ7CkBAIC0yMTYzLDE3ICsyMjAzLDE3IEBACiAJCQlzaGlmdCA9IEdMT0JBTF9BVFVfREFUQV9QT1JUX1ZFQ1RPUl9TSElGVDsKIAkJfQogCi0JCW5leHQucG9ydHZfdHJ1bmtpZCA9IChyZXQgJiBtYXNrKSA+PiBzaGlmdDsKKwkJbmV4dC5wb3J0dl90cnVua2lkID0gKHZhbCAmIG1hc2spID4+IHNoaWZ0OwogCX0KIAogCSplbnRyeSA9IG5leHQ7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX212ODhlNnh4eF9wb3J0X2ZkYl9kdW1wX29uZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJCXUxNiBmaWQsIHUxNiB2aWQsIGludCBwb3J0LAotCQkJCQlzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAotCQkJCQlpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X2RiX2R1bXBfZmlkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCQkgICAgICB1MTYgZmlkLCB1MTYgdmlkLCBpbnQgcG9ydCwKKwkJCQkgICAgICBzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqLAorCQkJCSAgICAgIGludCAoKmNiKShzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqKSkKIHsKIAlzdHJ1Y3QgbXY4OGU2eHh4X2F0dV9lbnRyeSBhZGRyID0gewogCQkubWFjID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH0sCkBAIC0yMTg3LDcyICsyMjI3LDk4IEBACiAJZG8gewogCQllcnIgPSBfbXY4OGU2eHh4X2F0dV9nZXRuZXh0KGNoaXAsIGZpZCwgJmFkZHIpOwogCQlpZiAoZXJyKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gZXJyOwogCiAJCWlmIChhZGRyLnN0YXRlID09IEdMT0JBTF9BVFVfREFUQV9TVEFURV9VTlVTRUQpCiAJCQlicmVhazsKIAotCQlpZiAoIWFkZHIudHJ1bmsgJiYgYWRkci5wb3J0dl90cnVua2lkICYgQklUKHBvcnQpKSB7Ci0JCQlib29sIGlzX3N0YXRpYyA9IGFkZHIuc3RhdGUgPT0KLQkJCQkoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoYWRkci5tYWMpID8KLQkJCQkgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX01DX1NUQVRJQyA6Ci0JCQkJIEdMT0JBTF9BVFVfREFUQV9TVEFURV9VQ19TVEFUSUMpOworCQlpZiAoYWRkci50cnVuayB8fCAoYWRkci5wb3J0dl90cnVua2lkICYgQklUKHBvcnQpKSA9PSAwKQorCQkJY29udGludWU7CiAKKwkJaWYgKG9iai0+aWQgPT0gU1dJVENIREVWX09CSl9JRF9QT1JUX0ZEQikgeworCQkJc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYjsKKworCQkJaWYgKCFpc191bmljYXN0X2V0aGVyX2FkZHIoYWRkci5tYWMpKQorCQkJCWNvbnRpbnVlOworCisJCQlmZGIgPSBTV0lUQ0hERVZfT0JKX1BPUlRfRkRCKG9iaik7CiAJCQlmZGItPnZpZCA9IHZpZDsKIAkJCWV0aGVyX2FkZHJfY29weShmZGItPmFkZHIsIGFkZHIubWFjKTsKLQkJCWZkYi0+bmRtX3N0YXRlID0gaXNfc3RhdGljID8gTlVEX05PQVJQIDogTlVEX1JFQUNIQUJMRTsKKwkJCWlmIChhZGRyLnN0YXRlID09IEdMT0JBTF9BVFVfREFUQV9TVEFURV9VQ19TVEFUSUMpCisJCQkJZmRiLT5uZG1fc3RhdGUgPSBOVURfTk9BUlA7CisJCQllbHNlCisJCQkJZmRiLT5uZG1fc3RhdGUgPSBOVURfUkVBQ0hBQkxFOworCQl9IGVsc2UgaWYgKG9iai0+aWQgPT0gU1dJVENIREVWX09CSl9JRF9QT1JUX01EQikgeworCQkJc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYjsKIAotCQkJZXJyID0gY2IoJmZkYi0+b2JqKTsKLQkJCWlmIChlcnIpCi0JCQkJYnJlYWs7CisJCQlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGFkZHIubWFjKSkKKwkJCQljb250aW51ZTsKKworCQkJbWRiID0gU1dJVENIREVWX09CSl9QT1JUX01EQihvYmopOworCQkJbWRiLT52aWQgPSB2aWQ7CisJCQlldGhlcl9hZGRyX2NvcHkobWRiLT5hZGRyLCBhZGRyLm1hYyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCX0KKworCQllcnIgPSBjYihvYmopOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9IHdoaWxlICghaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoYWRkci5tYWMpKTsKIAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfZGJfZHVtcChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBwb3J0LAorCQkJCSAgc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaiwKKwkJCQkgIGludCAoKmNiKShzdHJ1Y3Qgc3dpdGNoZGV2X29iaiAqb2JqKSkKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3Z0dV9lbnRyeSB2bGFuID0geworCQkudmlkID0gR0xPQkFMX1ZUVV9WSURfTUFTSywgLyogYWxsIG9uZXMgKi8KKwl9OworCXUxNiBmaWQ7CisJaW50IGVycjsKKworCS8qIER1bXAgcG9ydCdzIGRlZmF1bHQgRmlsdGVyaW5nIEluZm9ybWF0aW9uIERhdGFiYXNlIChWTEFOIElEIDApICovCisJZXJyID0gX212ODhlNnh4eF9wb3J0X2ZpZF9nZXQoY2hpcCwgcG9ydCwgJmZpZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG12ODhlNnh4eF9wb3J0X2RiX2R1bXBfZmlkKGNoaXAsIGZpZCwgMCwgcG9ydCwgb2JqLCBjYik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIER1bXAgVkxBTnMnIEZpbHRlcmluZyBJbmZvcm1hdGlvbiBEYXRhYmFzZXMgKi8KKwllcnIgPSBfbXY4OGU2eHh4X3Z0dV92aWRfd3JpdGUoY2hpcCwgdmxhbi52aWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkbyB7CisJCWVyciA9IF9tdjg4ZTZ4eHhfdnR1X2dldG5leHQoY2hpcCwgJnZsYW4pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoIXZsYW4udmFsaWQpCisJCQlicmVhazsKKworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9kYl9kdW1wX2ZpZChjaGlwLCB2bGFuLmZpZCwgdmxhbi52aWQsIHBvcnQsCisJCQkJCQkgb2JqLCBjYik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0gd2hpbGUgKHZsYW4udmlkIDwgR0xPQkFMX1ZUVV9WSURfTUFTSyk7CisKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X2ZkYl9kdW1wKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCiAJCQkJICAgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKIAkJCQkgICBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7Ci0Jc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHZsYW4gPSB7Ci0JCS52aWQgPSBHTE9CQUxfVlRVX1ZJRF9NQVNLLCAvKiBhbGwgb25lcyAqLwotCX07Ci0JdTE2IGZpZDsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlpbnQgZXJyOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCi0JLyogRHVtcCBwb3J0J3MgZGVmYXVsdCBGaWx0ZXJpbmcgSW5mb3JtYXRpb24gRGF0YWJhc2UgKFZMQU4gSUQgMCkgKi8KLQllcnIgPSBfbXY4OGU2eHh4X3BvcnRfZmlkX2dldChjaGlwLCBwb3J0LCAmZmlkKTsKLQlpZiAoZXJyKQotCQlnb3RvIHVubG9jazsKLQotCWVyciA9IF9tdjg4ZTZ4eHhfcG9ydF9mZGJfZHVtcF9vbmUoY2hpcCwgZmlkLCAwLCBwb3J0LCBmZGIsIGNiKTsKLQlpZiAoZXJyKQotCQlnb3RvIHVubG9jazsKLQotCS8qIER1bXAgVkxBTnMnIEZpbHRlcmluZyBJbmZvcm1hdGlvbiBEYXRhYmFzZXMgKi8KLQllcnIgPSBfbXY4OGU2eHh4X3Z0dV92aWRfd3JpdGUoY2hpcCwgdmxhbi52aWQpOwotCWlmIChlcnIpCi0JCWdvdG8gdW5sb2NrOwotCi0JZG8gewotCQllcnIgPSBfbXY4OGU2eHh4X3Z0dV9nZXRuZXh0KGNoaXAsICZ2bGFuKTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCi0JCWlmICghdmxhbi52YWxpZCkKLQkJCWJyZWFrOwotCi0JCWVyciA9IF9tdjg4ZTZ4eHhfcG9ydF9mZGJfZHVtcF9vbmUoY2hpcCwgdmxhbi5maWQsIHZsYW4udmlkLAotCQkJCQkJICAgcG9ydCwgZmRiLCBjYik7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9IHdoaWxlICh2bGFuLnZpZCA8IEdMT0JBTF9WVFVfVklEX01BU0spOwotCi11bmxvY2s6CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfZGJfZHVtcChjaGlwLCBwb3J0LCAmZmRiLT5vYmosIGNiKTsKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAogCXJldHVybiBlcnI7CkBAIC0yMjYxLDcgKzIzMjcsNyBAQAogc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF9icmlkZ2Vfam9pbihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2UpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IGksIGVyciA9IDA7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CkBAIC0yMjY5LDcgKzIzMzUsNyBAQAogCS8qIEFzc2lnbiB0aGUgYnJpZGdlIGFuZCByZW1hcCBlYWNoIHBvcnQncyBWTEFOVGFibGUgKi8KIAljaGlwLT5wb3J0c1twb3J0XS5icmlkZ2VfZGV2ID0gYnJpZGdlOwogCi0JZm9yIChpID0gMDsgaSA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7ICsraSkgewogCQlpZiAoY2hpcC0+cG9ydHNbaV0uYnJpZGdlX2RldiA9PSBicmlkZ2UpIHsKIAkJCWVyciA9IF9tdjg4ZTZ4eHhfcG9ydF9iYXNlZF92bGFuX21hcChjaGlwLCBpKTsKIAkJCWlmIChlcnIpCkBAIC0yMjg0LDcgKzIzNTAsNyBAQAogCiBzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfcG9ydF9icmlkZ2VfbGVhdmUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqYnJpZGdlID0gY2hpcC0+cG9ydHNbcG9ydF0uYnJpZGdlX2RldjsKIAlpbnQgaTsKIApAQCAtMjI5Myw3ICsyMzU5LDcgQEAKIAkvKiBVbmFzc2lnbiB0aGUgYnJpZGdlIGFuZCByZW1hcCBlYWNoIHBvcnQncyBWTEFOVGFibGUgKi8KIAljaGlwLT5wb3J0c1twb3J0XS5icmlkZ2VfZGV2ID0gTlVMTDsKIAotCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5pbmZvLT5udW1fcG9ydHM7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKTsgKytpKQogCQlpZiAoaSA9PSBwb3J0IHx8IGNoaXAtPnBvcnRzW2ldLmJyaWRnZV9kZXYgPT0gYnJpZGdlKQogCQkJaWYgKF9tdjg4ZTZ4eHhfcG9ydF9iYXNlZF92bGFuX21hcChjaGlwLCBpKSkKIAkJCQluZXRkZXZfd2Fybihkcy0+cG9ydHNbaV0ubmV0ZGV2LApAQCAtMjMwMiw1NyArMjM2OCwyNiBAQAogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogfQogCi1zdGF0aWMgaW50IF9tdjg4ZTZ4eHhfbWRpb19wYWdlX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKLQkJCQkgICAgICBpbnQgcG9ydCwgaW50IHBhZ2UsIGludCByZWcsIGludCB2YWwpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2luZGlyZWN0KGNoaXAsIHBvcnQsIDB4MTYsIHBhZ2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHJlc3RvcmVfcGFnZV8wOwotCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fd3JpdGVfaW5kaXJlY3QoY2hpcCwgcG9ydCwgcmVnLCB2YWwpOwotcmVzdG9yZV9wYWdlXzA6Ci0JbXY4OGU2eHh4X21kaW9fd3JpdGVfaW5kaXJlY3QoY2hpcCwgcG9ydCwgMHgxNiwgMHgwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX212ODhlNnh4eF9tZGlvX3BhZ2VfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICAgICBpbnQgcG9ydCwgaW50IHBhZ2UsIGludCByZWcpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IG12ODhlNnh4eF9tZGlvX3dyaXRlX2luZGlyZWN0KGNoaXAsIHBvcnQsIDB4MTYsIHBhZ2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIHJlc3RvcmVfcGFnZV8wOwotCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fcmVhZF9pbmRpcmVjdChjaGlwLCBwb3J0LCByZWcpOwotcmVzdG9yZV9wYWdlXzA6Ci0JbXY4OGU2eHh4X21kaW9fd3JpdGVfaW5kaXJlY3QoY2hpcCwgcG9ydCwgMHgxNiwgMHgwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3N3aXRjaF9yZXNldChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCiB7CiAJYm9vbCBwcHVfYWN0aXZlID0gbXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19QUFVfQUNUSVZFKTsKIAl1MTYgaXNfcmVzZXQgPSAocHB1X2FjdGl2ZSA/IDB4ODgwMCA6IDB4YzgwMCk7CiAJc3RydWN0IGdwaW9fZGVzYyAqZ3Bpb2QgPSBjaGlwLT5yZXNldDsKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JaW50IHJldDsKKwl1MTYgcmVnOworCWludCBlcnI7CiAJaW50IGk7CiAKIAkvKiBTZXQgYWxsIHBvcnRzIHRvIHRoZSBkaXNhYmxlZCBzdGF0ZS4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzOyBpKyspIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChpKSwgUE9SVF9DT05UUk9MKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCWZvciAoaSA9IDA7IGkgPCBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApOyBpKyspIHsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfcmVhZChjaGlwLCBpLCBQT1JUX0NPTlRST0wsICZyZWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChpKSwgUE9SVF9DT05UUk9MLAotCQkJCQkgICByZXQgJiAweGZmZmMpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgaSwgUE9SVF9DT05UUk9MLAorCQkJCQkgICByZWcgJiAweGZmZmMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKIAkvKiBXYWl0IGZvciB0cmFuc21pdCBxdWV1ZXMgdG8gZHJhaW4uICovCkBAIC0yMzcxLDY1ICsyNDA2LDUzIEBACiAJICogdGhyb3VnaCBnbG9iYWwgcmVnaXN0ZXJzIDB4MTggYW5kIDB4MTkuCiAJICovCiAJaWYgKHBwdV9hY3RpdmUpCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIDB4MDQsIDB4YzAwMCk7CisJCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCAweDA0LCAweGMwMDApOwogCWVsc2UKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgMHgwNCwgMHhjNDAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgMHgwNCwgMHhjNDAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJLyogV2FpdCB1cCB0byBvbmUgc2Vjb25kIGZvciByZXNldCB0byBjb21wbGV0ZS4gKi8KIAl0aW1lb3V0ID0gamlmZmllcyArIDEgKiBIWjsKIAl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfR0xPQkFMLCAweDAwKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfZzFfcmVhZChjaGlwLCAweDAwLCAmcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKLQkJaWYgKChyZXQgJiBpc19yZXNldCkgPT0gaXNfcmVzZXQpCisJCWlmICgocmVnICYgaXNfcmVzZXQpID09IGlzX3Jlc2V0KQogCQkJYnJlYWs7CiAJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKIAl9CiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpCi0JCXJldCA9IC1FVElNRURPVVQ7CisJCWVyciA9IC1FVElNRURPVVQ7CiAJZWxzZQotCQlyZXQgPSAwOworCQllcnIgPSAwOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9wb3dlcl9vbl9zZXJkZXMoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQorc3RhdGljIGludCBtdjg4ZTZ4eHhfc2VyZGVzX3Bvd2VyX29uKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKIHsKLQlpbnQgcmV0OworCXUxNiB2YWw7CisJaW50IGVycjsKIAotCXJldCA9IF9tdjg4ZTZ4eHhfbWRpb19wYWdlX3JlYWQoY2hpcCwgUkVHX0ZJQkVSX1NFUkRFUywKLQkJCQkJUEFHRV9GSUJFUl9TRVJERVMsIE1JSV9CTUNSKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkvKiBDbGVhciBQb3dlciBEb3duIGJpdCAqLworCWVyciA9IG12ODhlNnh4eF9zZXJkZXNfcmVhZChjaGlwLCBNSUlfQk1DUiwgJnZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCWlmIChyZXQgJiBCTUNSX1BET1dOKSB7Ci0JCXJldCAmPSB+Qk1DUl9QRE9XTjsKLQkJcmV0ID0gX212ODhlNnh4eF9tZGlvX3BhZ2Vfd3JpdGUoY2hpcCwgUkVHX0ZJQkVSX1NFUkRFUywKLQkJCQkJCSBQQUdFX0ZJQkVSX1NFUkRFUywgTUlJX0JNQ1IsCi0JCQkJCQkgcmV0KTsKKwlpZiAodmFsICYgQk1DUl9QRE9XTikgeworCQl2YWwgJj0gfkJNQ1JfUERPV047CisJCWVyciA9IG12ODhlNnh4eF9zZXJkZXNfd3JpdGUoY2hpcCwgTUlJX0JNQ1IsIHZhbCk7CiAJfQogCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQsCi0JCQkgICAgICAgaW50IHJlZywgdTE2ICp2YWwpCi17Ci0JaW50IGFkZHIgPSBjaGlwLT5pbmZvLT5wb3J0X2Jhc2VfYWRkciArIHBvcnQ7Ci0KLQlpZiAocG9ydCA+PSBjaGlwLT5pbmZvLT5udW1fcG9ydHMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIG12ODhlNnh4eF9yZWFkKGNoaXAsIGFkZHIsIHJlZywgdmFsKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zZXR1cF9wb3J0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvcnQpCiB7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gY2hpcC0+ZHM7Ci0JaW50IHJldDsKKwlpbnQgZXJyOwogCXUxNiByZWc7CiAKIAlpZiAobXY4OGU2eHh4XzYzNTJfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MzUxX2ZhbWlseShjaGlwKSB8fApAQCAtMjQ0Miw3ICsyNDY1LDcgQEAKIAkJICogYW5kIGFsbCBEU0EgcG9ydHMgdG8gdGhlaXIgbWF4aW11bSBiYW5kd2lkdGggYW5kCiAJCSAqIGZ1bGwgZHVwbGV4LgogCQkgKi8KLQkJcmVnID0gX212ODhlNnh4eF9yZWdfcmVhZChjaGlwLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9QQ1NfQ1RSTCk7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9QQ1NfQ1RSTCwgJnJlZyk7CiAJCWlmIChkc2FfaXNfY3B1X3BvcnQoZHMsIHBvcnQpIHx8IGRzYV9pc19kc2FfcG9ydChkcywgcG9ydCkpIHsKIAkJCXJlZyAmPSB+UE9SVF9QQ1NfQ1RSTF9VTkZPUkNFRDsKIAkJCXJlZyB8PSBQT1JUX1BDU19DVFJMX0ZPUkNFX0xJTksgfApAQCAtMjQ1NywxMCArMjQ4MCw5IEBACiAJCQlyZWcgfD0gUE9SVF9QQ1NfQ1RSTF9VTkZPUkNFRDsKIAkJfQogCi0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLAotCQkJCQkgICBQT1JUX1BDU19DVFJMLCByZWcpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9QQ1NfQ1RSTCwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJLyogUG9ydCBDb250cm9sOiBkaXNhYmxlIERyb3Atb24tVW5sb2NrLCBkaXNhYmxlIERyb3Atb24tTG9jaywKQEAgLTI0ODYsMjggKzI1MDgsMTMgQEAKIAkJUE9SVF9DT05UUk9MX1VTRV9UQUcgfCBQT1JUX0NPTlRST0xfVVNFX0lQIHwKIAkJUE9SVF9DT05UUk9MX1NUQVRFX0ZPUldBUkRJTkc7CiAJaWYgKGRzYV9pc19jcHVfcG9ydChkcywgcG9ydCkpIHsKLQkJaWYgKG12ODhlNnh4eF82MDk1X2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjE4NV9mYW1pbHkoY2hpcCkpCi0JCQlyZWcgfD0gUE9SVF9DT05UUk9MX0RTQV9UQUc7Ci0JCWlmIChtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkgfHwKLQkJICAgIG12ODhlNnh4eF82MzUxX2ZhbWlseShjaGlwKSB8fAotCQkgICAgbXY4OGU2eHh4XzYxNjVfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjA5N19mYW1pbHkoY2hpcCkgfHwKLQkJICAgIG12ODhlNnh4eF82MzIwX2ZhbWlseShjaGlwKSkgeworCQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19FRFNBKSkKIAkJCXJlZyB8PSBQT1JUX0NPTlRST0xfRlJBTUVfRVRIRVJfVFlQRV9EU0EgfAotCQkJCVBPUlRfQ09OVFJPTF9GT1JXQVJEX1VOS05PV04gfAogCQkJCVBPUlRfQ09OVFJPTF9GT1JXQVJEX1VOS05PV05fTUM7Ci0JCX0KLQotCQlpZiAobXY4OGU2eHh4XzYzNTJfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjM1MV9mYW1pbHkoY2hpcCkgfHwKLQkJICAgIG12ODhlNnh4eF82MTY1X2ZhbWlseShjaGlwKSB8fAotCQkgICAgbXY4OGU2eHh4XzYwOTdfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjA5NV9mYW1pbHkoY2hpcCkgfHwKLQkJICAgIG12ODhlNnh4eF82MDY1X2ZhbWlseShjaGlwKSB8fAotCQkgICAgbXY4OGU2eHh4XzYxODVfZmFtaWx5KGNoaXApIHx8Ci0JCSAgICBtdjg4ZTZ4eHhfNjMyMF9mYW1pbHkoY2hpcCkpIHsKLQkJCXJlZyB8PSBQT1JUX0NPTlRST0xfRUdSRVNTX0FERF9UQUc7Ci0JCX0KKwkJZWxzZQorCQkJcmVnIHw9IFBPUlRfQ09OVFJPTF9EU0FfVEFHOworCQlyZWcgfD0gUE9SVF9DT05UUk9MX0VHUkVTU19BRERfVEFHIHwKKwkJCVBPUlRfQ09OVFJPTF9GT1JXQVJEX1VOS05PV047CiAJfQogCWlmIChkc2FfaXNfZHNhX3BvcnQoZHMsIHBvcnQpKSB7CiAJCWlmIChtdjg4ZTZ4eHhfNjA5NV9mYW1pbHkoY2hpcCkgfHwKQEAgLTI1MjYsMjYgKzI1MzMsMjUgQEAKIAkJCQlQT1JUX0NPTlRST0xfRk9SV0FSRF9VTktOT1dOX01DOwogCX0KIAlpZiAocmVnKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLAotCQkJCQkgICBQT1JUX0NPTlRST0wsIHJlZyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0wsIHJlZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCS8qIElmIHRoaXMgcG9ydCBpcyBjb25uZWN0ZWQgdG8gYSBTZXJEZXMsIG1ha2Ugc3VyZSB0aGUgU2VyRGVzIGlzIG5vdAogCSAqIHBvd2VyZWQgZG93bi4KIAkgKi8KLQlpZiAobXY4OGU2eHh4XzYzNTJfZmFtaWx5KGNoaXApKSB7Ci0JCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfU1RBVFVTKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlyZXQgJj0gUE9SVF9TVEFUVVNfQ01PREVfTUFTSzsKLQkJaWYgKChyZXQgPT0gUE9SVF9TVEFUVVNfQ01PREVfMTAwQkFTRV9YKSB8fAotCQkgICAgKHJldCA9PSBQT1JUX1NUQVRVU19DTU9ERV8xMDAwQkFTRV9YKSB8fAotCQkgICAgKHJldCA9PSBQT1JUX1NUQVRVU19DTU9ERV9TR01JSSkpIHsKLQkJCXJldCA9IG12ODhlNnh4eF9wb3dlcl9vbl9zZXJkZXMoY2hpcCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHU19TRVJERVMpKSB7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3JlYWQoY2hpcCwgcG9ydCwgUE9SVF9TVEFUVVMsICZyZWcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJcmVnICY9IFBPUlRfU1RBVFVTX0NNT0RFX01BU0s7CisJCWlmICgocmVnID09IFBPUlRfU1RBVFVTX0NNT0RFXzEwMEJBU0VfWCkgfHwKKwkJICAgIChyZWcgPT0gUE9SVF9TVEFUVVNfQ01PREVfMTAwMEJBU0VfWCkgfHwKKwkJICAgIChyZWcgPT0gUE9SVF9TVEFUVVNfQ01PREVfU0dNSUkpKSB7CisJCQllcnIgPSBtdjg4ZTZ4eHhfc2VyZGVzX3Bvd2VyX29uKGNoaXApOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KIApAQCAtMjU3OSwxMCArMjU4NSw5IEBACiAJcmVnIHw9IFBPUlRfQ09OVFJPTF8yXzgwMjFRX0RJU0FCTEVEOwogCiAJaWYgKHJlZykgewotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJICAgUE9SVF9DT05UUk9MXzIsIHJlZyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0NPTlRST0xfMiwgcmVnKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJLyogUG9ydCBBc3NvY2lhdGlvbiBWZWN0b3I6IHdoZW4gbGVhcm5pbmcgc291cmNlIGFkZHJlc3NlcwpAQCAtMjU5NSwxNiArMjYwMCwxNCBAQAogCWlmIChkc2FfaXNfY3B1X3BvcnQoZHMsIHBvcnQpKQogCQlyZWcgPSAwOwogCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfQVNTT0NfVkVDVE9SLAotCQkJCSAgIHJlZyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX0FTU09DX1ZFQ1RPUiwgcmVnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJLyogRWdyZXNzIHJhdGUgY29udHJvbCAyOiBkaXNhYmxlIGVncmVzcyByYXRlIGNvbnRyb2wuICovCi0JcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksIFBPUlRfUkFURV9DT05UUk9MXzIsCi0JCQkJICAgMHgwMDAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfUkFURV9DT05UUk9MXzIsIDB4MDAwMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWlmIChtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYzNTFfZmFtaWx5KGNoaXApIHx8CiAJICAgIG12ODhlNnh4eF82MTY1X2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjA5N19mYW1pbHkoY2hpcCkgfHwKQEAgLTI2MTMsMTA3ICsyNjE2LDEwOCBAQAogCQkgKiBiZSBwYXVzZWQgZm9yIGJ5IHRoZSByZW1vdGUgZW5kIG9yIHRoZSBwZXJpb2Qgb2YKIAkJICogdGltZSB0aGF0IHRoaXMgcG9ydCBjYW4gcGF1c2UgdGhlIHJlbW90ZSBlbmQuCiAJCSAqLwotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJICAgUE9SVF9QQVVTRV9DVFJMLCAweDAwMDApOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9QQVVTRV9DVFJMLCAweDAwMDApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAogCQkvKiBQb3J0IEFUVSBjb250cm9sOiBkaXNhYmxlIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YKIAkJICogYWRkcmVzcyBkYXRhYmFzZSBlbnRyaWVzIHRoYXQgdGhpcyBwb3J0IGlzIGFsbG93ZWQKIAkJICogdG8gdXNlLgogCQkgKi8KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfQVRVX0NPTlRST0wsIDB4MDAwMCk7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfQVRVX0NPTlRST0wsCisJCQkJCSAgIDB4MDAwMCk7CiAJCS8qIFByaW9yaXR5IE92ZXJyaWRlOiBkaXNhYmxlIERBLCBTQSBhbmQgVlRVIHByaW9yaXR5CiAJCSAqIG92ZXJyaWRlLgogCQkgKi8KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfUFJJX09WRVJSSURFLCAweDAwMDApOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9QUklfT1ZFUlJJREUsCisJCQkJCSAgIDB4MDAwMCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCS8qIFBvcnQgRXRoZXJ0eXBlOiB1c2UgdGhlIEV0aGVydHlwZSBEU0EgRXRoZXJ0eXBlCiAJCSAqIHZhbHVlLgogCQkgKi8KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfRVRIX1RZUEUsIEVUSF9QX0VEU0EpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRURTQSkpIHsKKwkJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfRVRIX1RZUEUsCisJCQkJCQkgICBFVEhfUF9FRFNBKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCiAJCS8qIFRhZyBSZW1hcDogdXNlIGFuIGlkZW50aXR5IDgwMi4xcCBwcmlvIC0+IHN3aXRjaAogCQkgKiBwcmlvIG1hcHBpbmcuCiAJCSAqLwotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJICAgUE9SVF9UQUdfUkVHTUFQXzAxMjMsIDB4MzIxMCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX1RBR19SRUdNQVBfMDEyMywKKwkJCQkJICAgMHgzMjEwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAKIAkJLyogVGFnIFJlbWFwIDI6IHVzZSBhbiBpZGVudGl0eSA4MDIuMXAgcHJpbyAtPiBzd2l0Y2gKIAkJICogcHJpbyBtYXBwaW5nLgogCQkgKi8KLQkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX1BPUlQocG9ydCksCi0JCQkJCSAgIFBPUlRfVEFHX1JFR01BUF80NTY3LCAweDc2NTQpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9UQUdfUkVHTUFQXzQ1NjcsCisJCQkJCSAgIDB4NzY1NCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCX0KIAorCS8qIFJhdGUgQ29udHJvbDogZGlzYWJsZSBpbmdyZXNzIHJhdGUgbGltaXRpbmcuICovCiAJaWYgKG12ODhlNnh4eF82MzUyX2ZhbWlseShjaGlwKSB8fCBtdjg4ZTZ4eHhfNjM1MV9mYW1pbHkoY2hpcCkgfHwKIAkgICAgbXY4OGU2eHh4XzYxNjVfZmFtaWx5KGNoaXApIHx8IG12ODhlNnh4eF82MDk3X2ZhbWlseShjaGlwKSB8fAotCSAgICBtdjg4ZTZ4eHhfNjE4NV9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYwOTVfZmFtaWx5KGNoaXApIHx8CiAJICAgIG12ODhlNnh4eF82MzIwX2ZhbWlseShjaGlwKSkgewotCQkvKiBSYXRlIENvbnRyb2w6IGRpc2FibGUgaW5ncmVzcyByYXRlIGxpbWl0aW5nLiAqLwotCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfUE9SVChwb3J0KSwKLQkJCQkJICAgUE9SVF9SQVRFX0NPTlRST0wsIDB4MDAwMSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQllcnIgPSBtdjg4ZTZ4eHhfcG9ydF93cml0ZShjaGlwLCBwb3J0LCBQT1JUX1JBVEVfQ09OVFJPTCwKKwkJCQkJICAgMHgwMDAxKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfSBlbHNlIGlmIChtdjg4ZTZ4eHhfNjE4NV9mYW1pbHkoY2hpcCkgfHwgbXY4OGU2eHh4XzYwOTVfZmFtaWx5KGNoaXApKSB7CisJCWVyciA9IG12ODhlNnh4eF9wb3J0X3dyaXRlKGNoaXAsIHBvcnQsIFBPUlRfUkFURV9DT05UUk9MLAorCQkJCQkgICAweDAwMDApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAKIAkvKiBQb3J0IENvbnRyb2wgMTogZGlzYWJsZSB0cnVua2luZywgZGlzYWJsZSBzZW5kaW5nCiAJICogbGVhcm5pbmcgbWVzc2FnZXMgdG8gdGhpcyBwb3J0LgogCSAqLwotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0NPTlRST0xfMSwKLQkJCQkgICAweDAwMDApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJZXJyID0gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9DT05UUk9MXzEsIDB4MDAwMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qIFBvcnQgYmFzZWQgVkxBTiBtYXA6IGdpdmUgZWFjaCBwb3J0IHRoZSBzYW1lIGRlZmF1bHQgYWRkcmVzcwogCSAqIGRhdGFiYXNlLCBhbmQgYWxsb3cgYmlkaXJlY3Rpb25hbCBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlCiAJICogQ1BVIGFuZCBEU0EgcG9ydChzKSwgYW5kIHRoZSBvdGhlciBwb3J0cy4KIAkgKi8KLQlyZXQgPSBfbXY4OGU2eHh4X3BvcnRfZmlkX3NldChjaGlwLCBwb3J0LCAwKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCWVyciA9IF9tdjg4ZTZ4eHhfcG9ydF9maWRfc2V0KGNoaXAsIHBvcnQsIDApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlyZXQgPSBfbXY4OGU2eHh4X3BvcnRfYmFzZWRfdmxhbl9tYXAoY2hpcCwgcG9ydCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwllcnIgPSBfbXY4OGU2eHh4X3BvcnRfYmFzZWRfdmxhbl9tYXAoY2hpcCwgcG9ydCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCS8qIERlZmF1bHQgVkxBTiBJRCBhbmQgcHJpb3JpdHk6IGRvbid0IHNldCBhIGRlZmF1bHQgVkxBTgogCSAqIElELCBhbmQgc2V0IHRoZSBkZWZhdWx0IHBhY2tldCBwcmlvcml0eSB0byB6ZXJvLgogCSAqLwotCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0RFRkFVTFRfVkxBTiwKLQkJCQkgICAweDAwMDApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gbXY4OGU2eHh4X3BvcnRfd3JpdGUoY2hpcCwgcG9ydCwgUE9SVF9ERUZBVUxUX1ZMQU4sIDB4MDAwMCk7CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cxX3NldF9zd2l0Y2hfbWFjKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTggKmFkZHIpCitpbnQgbXY4OGU2eHh4X2cxX3NldF9zd2l0Y2hfbWFjKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTggKmFkZHIpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfTUFDXzAxLAotCQkJICAgICAgKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX01BQ18wMSwgKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9NQUNfMjMsCi0JCQkgICAgICAoYWRkclsyXSA8PCA4KSB8IGFkZHJbM10pOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfTUFDXzIzLCAoYWRkclsyXSA8PCA4KSB8IGFkZHJbM10pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlyZXR1cm4gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9NQUNfNDUsCi0JCQkgICAgICAgKGFkZHJbNF0gPDwgOCkgfCBhZGRyWzVdKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX01BQ180NSwgKGFkZHJbNF0gPDwgOCkgfCBhZGRyWzVdKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X2cxX3NldF9hZ2VfdGltZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCkBAIC0yNzMyLDcgKzI3MzYsNyBAQAogCS8qIFJvdW5kIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgY29lZmYgKi8KIAlhZ2VfdGltZSA9IChtc2VjcyArIGNvZWZmIC8gMikgLyBjb2VmZjsKIAotCWVyciA9IG12ODhlNnh4eF9yZWFkKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfQ09OVFJPTCwgJnZhbCk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3JlYWQoY2hpcCwgR0xPQkFMX0FUVV9DT05UUk9MLCAmdmFsKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yNzQwLDEzICsyNzQ0LDEzIEBACiAJdmFsICY9IH4weGZmMDsKIAl2YWwgfD0gYWdlX3RpbWUgPDwgNDsKIAotCXJldHVybiBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9DT05UUk9MLCB2YWwpOworCXJldHVybiBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0FUVV9DT05UUk9MLCB2YWwpOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zZXRfYWdlaW5nX3RpbWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAogCQkJCSAgICAgdW5zaWduZWQgaW50IGFnZWluZ190aW1lKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBlcnI7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CkBAIC0yNzcxLDcgKzI3NzUsNyBAQAogCSAgICBtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1BQVV9BQ1RJVkUpKQogCQlyZWcgfD0gR0xPQkFMX0NPTlRST0xfUFBVX0VOQUJMRTsKIAotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9DT05UUk9MLCByZWcpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfQ09OVFJPTCwgcmVnKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yNzgxLDE1ICsyNzg1LDE0IEBACiAJcmVnID0gdXBzdHJlYW1fcG9ydCA8PCBHTE9CQUxfTU9OSVRPUl9DT05UUk9MX0lOR1JFU1NfU0hJRlQgfAogCQl1cHN0cmVhbV9wb3J0IDw8IEdMT0JBTF9NT05JVE9SX0NPTlRST0xfRUdSRVNTX1NISUZUIHwKIAkJdXBzdHJlYW1fcG9ydCA8PCBHTE9CQUxfTU9OSVRPUl9DT05UUk9MX0FSUF9TSElGVDsKLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfTU9OSVRPUl9DT05UUk9MLAotCQkJCSAgIHJlZyk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9NT05JVE9SX0NPTlRST0wsIHJlZyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCS8qIERpc2FibGUgcmVtb3RlIG1hbmFnZW1lbnQsIGFuZCBzZXQgdGhlIHN3aXRjaCdzIERTQSBkZXZpY2UgbnVtYmVyLiAqLwotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9DT05UUk9MXzIsCi0JCQkJICAgR0xPQkFMX0NPTlRST0xfMl9NVUxUSVBMRV9DQVNDQURFIHwKLQkJCQkgICAoZHMtPmluZGV4ICYgMHgxZikpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfQ09OVFJPTF8yLAorCQkJCSBHTE9CQUxfQ09OVFJPTF8yX01VTFRJUExFX0NBU0NBREUgfAorCQkJCSAoZHMtPmluZGV4ICYgMHgxZikpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTI4MDIsOCArMjgwNSw4IEBACiAJICogZW5hYmxlIGFkZHJlc3MgbGVhcm4gbWVzc2FnZXMgdG8gYmUgc2VudCB0byBhbGwgbWVzc2FnZQogCSAqIHBvcnRzLgogCSAqLwotCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfQVRVX0NPTlRST0wsCi0JCQkgICAgICBHTE9CQUxfQVRVX0NPTlRST0xfTEVBUk4yQUxMKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0FUVV9DT05UUk9MLAorCQkJCSBHTE9CQUxfQVRVX0NPTlRST0xfTEVBUk4yQUxMKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yODE3LDM5ICsyODIwLDM5IEBACiAJCXJldHVybiBlcnI7CiAKIAkvKiBDb25maWd1cmUgdGhlIElQIFRvUyBtYXBwaW5nIHJlZ2lzdGVycy4gKi8KLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfSVBfUFJJXzAsIDB4MDAwMCk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9JUF9QUklfMCwgMHgwMDAwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9JUF9QUklfMSwgMHgwMDAwKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0lQX1BSSV8xLCAweDAwMDApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0lQX1BSSV8yLCAweDU1NTUpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfSVBfUFJJXzIsIDB4NTU1NSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfSVBfUFJJXzMsIDB4NTU1NSk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9JUF9QUklfMywgMHg1NTU1KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9JUF9QUklfNCwgMHhhYWFhKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0lQX1BSSV80LCAweGFhYWEpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0lQX1BSSV81LCAweGFhYWEpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfSVBfUFJJXzUsIDB4YWFhYSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfSVBfUFJJXzYsIDB4ZmZmZik7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9JUF9QUklfNiwgMHhmZmZmKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGNoaXAsIFJFR19HTE9CQUwsIEdMT0JBTF9JUF9QUklfNywgMHhmZmZmKTsKKwllcnIgPSBtdjg4ZTZ4eHhfZzFfd3JpdGUoY2hpcCwgR0xPQkFMX0lQX1BSSV83LCAweGZmZmYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAkvKiBDb25maWd1cmUgdGhlIElFRUUgODAyLjFwIHByaW9yaXR5IG1hcHBpbmcgcmVnaXN0ZXIuICovCi0JZXJyID0gX212ODhlNnh4eF9yZWdfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTCwgR0xPQkFMX0lFRUVfUFJJLCAweGZhNDEpOworCWVyciA9IG12ODhlNnh4eF9nMV93cml0ZShjaGlwLCBHTE9CQUxfSUVFRV9QUkksIDB4ZmE0MSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCS8qIENsZWFyIHRoZSBzdGF0aXN0aWNzIGNvdW50ZXJzIGZvciBhbGwgcG9ydHMgKi8KLQllcnIgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShjaGlwLCBSRUdfR0xPQkFMLCBHTE9CQUxfU1RBVFNfT1AsCi0JCQkJICAgR0xPQkFMX1NUQVRTX09QX0ZMVVNIX0FMTCk7CisJZXJyID0gbXY4OGU2eHh4X2cxX3dyaXRlKGNoaXAsIEdMT0JBTF9TVEFUU19PUCwKKwkJCQkgR0xPQkFMX1NUQVRTX09QX0ZMVVNIX0FMTCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjg2MSwyNzcgKzI4NjQsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl9kZXZpY2VfbWFwcGluZ193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJCSAgICAgaW50IHRhcmdldCwgaW50IHBvcnQpCi17Ci0JdTE2IHZhbCA9ICh0YXJnZXQgPDwgOCkgfCAocG9ydCAmIDB4Zik7Ci0KLQlyZXR1cm4gbXY4OGU2eHh4X3VwZGF0ZShjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9ERVZJQ0VfTUFQUElORywgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfc2V0X2RldmljZV9tYXBwaW5nKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKLXsKLQlpbnQgdGFyZ2V0LCBwb3J0OwotCWludCBlcnI7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSByb3V0aW5nIHBvcnQgdG8gdGhlIDMyIHBvc3NpYmxlIHRhcmdldCBkZXZpY2VzICovCi0JZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCAzMjsgKyt0YXJnZXQpIHsKLQkJcG9ydCA9IDB4ZjsKLQotCQlpZiAodGFyZ2V0IDwgRFNBX01BWF9TV0lUQ0hFUykgewotCQkJcG9ydCA9IGNoaXAtPmRzLT5ydGFibGVbdGFyZ2V0XTsKLQkJCWlmIChwb3J0ID09IERTQV9SVEFCTEVfTk9ORSkKLQkJCQlwb3J0ID0gMHhmOwotCQl9Ci0KLQkJZXJyID0gbXY4OGU2eHh4X2cyX2RldmljZV9tYXBwaW5nX3dyaXRlKGNoaXAsIHRhcmdldCwgcG9ydCk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl90cnVua19tYXNrX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IG51bSwKLQkJCQkJIGJvb2wgaGFzaywgdTE2IG1hc2spCi17Ci0JY29uc3QgdTE2IHBvcnRfbWFzayA9IEJJVChjaGlwLT5pbmZvLT5udW1fcG9ydHMpIC0gMTsKLQl1MTYgdmFsID0gKG51bSA8PCAxMikgfCAobWFzayAmIHBvcnRfbWFzayk7Ci0KLQlpZiAoaGFzaykKLQkJdmFsIHw9IEdMT0JBTDJfVFJVTktfTUFTS19IQVNLOwotCi0JcmV0dXJuIG12ODhlNnh4eF91cGRhdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfVFJVTktfTUFTSywgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfdHJ1bmtfbWFwcGluZ193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBpZCwKLQkJCQkJICAgIHUxNiBtYXApCi17Ci0JY29uc3QgdTE2IHBvcnRfbWFzayA9IEJJVChjaGlwLT5pbmZvLT5udW1fcG9ydHMpIC0gMTsKLQl1MTYgdmFsID0gKGlkIDw8IDExKSB8IChtYXAgJiBwb3J0X21hc2spOwotCi0JcmV0dXJuIG12ODhlNnh4eF91cGRhdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfVFJVTktfTUFQUElORywgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfY2xlYXJfdHJ1bmsoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQotewotCWNvbnN0IHUxNiBwb3J0X21hc2sgPSBCSVQoY2hpcC0+aW5mby0+bnVtX3BvcnRzKSAtIDE7Ci0JaW50IGksIGVycjsKLQotCS8qIENsZWFyIGFsbCBlaWdodCBwb3NzaWJsZSBUcnVuayBNYXNrIHZlY3RvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7Ci0JCWVyciA9IG12ODhlNnh4eF9nMl90cnVua19tYXNrX3dyaXRlKGNoaXAsIGksIGZhbHNlLCBwb3J0X21hc2spOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQkvKiBDbGVhciBhbGwgc2l4dGVlbiBwb3NzaWJsZSBUcnVuayBJRCByb3V0aW5nIHZlY3RvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfdHJ1bmtfbWFwcGluZ193cml0ZShjaGlwLCBpLCAwKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2NsZWFyX2lybChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCi17Ci0JaW50IHBvcnQsIGVycjsKLQotCS8qIEluaXQgYWxsIEluZ3Jlc3MgUmF0ZSBMaW1pdCByZXNvdXJjZXMgb2YgYWxsIHBvcnRzICovCi0JZm9yIChwb3J0ID0gMDsgcG9ydCA8IGNoaXAtPmluZm8tPm51bV9wb3J0czsgKytwb3J0KSB7Ci0JCS8qIFhYWCBuZXdlciBjaGlwcyAobGlrZSA4OEU2MzkwKSBoYXZlIGRpZmZlcmVudCAyLWJpdCBvcHMgKi8KLQkJZXJyID0gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX0lSTF9DTUQsCi0JCQkJICAgICAgR0xPQkFMMl9JUkxfQ01EX09QX0lOSVRfQUxMIHwKLQkJCQkgICAgICAocG9ydCA8PCA4KSk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQotCQkvKiBXYWl0IGZvciB0aGUgb3BlcmF0aW9uIHRvIGNvbXBsZXRlICovCi0JCWVyciA9IF9tdjg4ZTZ4eHhfd2FpdChjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9JUkxfQ01ELAotCQkJCSAgICAgIEdMT0JBTDJfSVJMX0NNRF9CVVNZKTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qIEluZGlyZWN0IHdyaXRlIHRvIHRoZSBTd2l0Y2ggTUFDL1dvTC9Xb0YgcmVnaXN0ZXIgKi8KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3N3aXRjaF9tYWNfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCQkgdW5zaWduZWQgaW50IHBvaW50ZXIsIHU4IGRhdGEpCi17Ci0JdTE2IHZhbCA9IChwb2ludGVyIDw8IDgpIHwgZGF0YTsKLQotCXJldHVybiBtdjg4ZTZ4eHhfdXBkYXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1NXSVRDSF9NQUMsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTggKmFkZHIpCi17Ci0JaW50IGksIGVycjsKLQotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJZXJyID0gbXY4OGU2eHh4X2cyX3N3aXRjaF9tYWNfd3JpdGUoY2hpcCwgaSwgYWRkcltpXSk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl9wb3Rfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9pbnRlciwKLQkJCQkgIHU4IGRhdGEpCi17Ci0JdTE2IHZhbCA9IChwb2ludGVyIDw8IDgpIHwgKGRhdGEgJiAweDcpOwotCi0JcmV0dXJuIG12ODhlNnh4eF91cGRhdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfUFJJT19PVkVSUklERSwgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfY2xlYXJfcG90KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKLXsKLQlpbnQgaSwgZXJyOwotCi0JLyogQ2xlYXIgYWxsIHNpeHRlZW4gcG9zc2libGUgUHJpb3JpdHkgT3ZlcnJpZGUgZW50cmllcyAqLwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCWVyciA9IG12ODhlNnh4eF9nMl9wb3Rfd3JpdGUoY2hpcCwgaSwgMCk7Ci0JCWlmIChlcnIpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9nMl9lZXByb21fd2FpdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCi17Ci0JcmV0dXJuIF9tdjg4ZTZ4eHhfd2FpdChjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9FRVBST01fQ01ELAotCQkJICAgICAgIEdMT0JBTDJfRUVQUk9NX0NNRF9CVVNZIHwKLQkJCSAgICAgICBHTE9CQUwyX0VFUFJPTV9DTURfUlVOTklORyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2VlcHJvbV9jbWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1MTYgY21kKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfRUVQUk9NX0NNRCwgY21kKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIG12ODhlNnh4eF9nMl9lZXByb21fd2FpdChjaGlwKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICAgICAgdTggYWRkciwgdTE2ICpkYXRhKQotewotCXUxNiBjbWQgPSBHTE9CQUwyX0VFUFJPTV9DTURfT1BfUkVBRCB8IGFkZHI7Ci0JaW50IGVycjsKLQotCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fd2FpdChjaGlwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9jbWQoY2hpcCwgY21kKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIG12ODhlNnh4eF9yZWFkKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX0VFUFJPTV9EQVRBLCBkYXRhKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dyaXRlMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgICAgICB1OCBhZGRyLCB1MTYgZGF0YSkKLXsKLQl1MTYgY21kID0gR0xPQkFMMl9FRVBST01fQ01EX09QX1dSSVRFIHwgYWRkcjsKLQlpbnQgZXJyOwotCi0JZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV93YWl0KGNoaXApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfRUVQUk9NX0RBVEEsIGRhdGEpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gbXY4OGU2eHh4X2cyX2VlcHJvbV9jbWQoY2hpcCwgY21kKTsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfc2V0dXAoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQotewotCXUxNiByZWc7Ci0JaW50IGVycjsKLQotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlgpKSB7Ci0JCS8qIENvbnNpZGVyIHRoZSBmcmFtZXMgd2l0aCByZXNlcnZlZCBtdWx0aWNhc3QgZGVzdGluYXRpb24KLQkJICogYWRkcmVzc2VzIG1hdGNoaW5nIDAxOjgwOmMyOjAwOjAwOjJ4IGFzIE1HTVQuCi0JCSAqLwotCQllcnIgPSBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgUkVHX0dMT0JBTDIsIEdMT0JBTDJfTUdNVF9FTl8yWCwKLQkJCQkgICAgICAweGZmZmYpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYKSkgewotCQkvKiBDb25zaWRlciB0aGUgZnJhbWVzIHdpdGggcmVzZXJ2ZWQgbXVsdGljYXN0IGRlc3RpbmF0aW9uCi0JCSAqIGFkZHJlc3NlcyBtYXRjaGluZyAwMTo4MDpjMjowMDowMDoweCBhcyBNR01ULgotCQkgKi8KLQkJZXJyID0gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX01HTVRfRU5fMFgsCi0JCQkJICAgICAgMHhmZmZmKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JLyogSWdub3JlIHJlbW92ZWQgdGFnIGRhdGEgb24gZG91Ymx5IHRhZ2dlZCBwYWNrZXRzLCBkaXNhYmxlCi0JICogZmxvdyBjb250cm9sIG1lc3NhZ2VzLCBmb3JjZSBmbG93IGNvbnRyb2wgcHJpb3JpdHkgdG8gdGhlCi0JICogaGlnaGVzdCwgYW5kIHNlbmQgYWxsIHNwZWNpYWwgbXVsdGljYXN0IGZyYW1lcyB0byB0aGUgQ1BVCi0JICogcG9ydCBhdCB0aGUgaGlnaGVzdCBwcmlvcml0eS4KLQkgKi8KLQlyZWcgPSBHTE9CQUwyX1NXSVRDSF9NR01UX0ZPUkNFX0ZMT1dfQ1RSTF9QUkkgfCAoMHg3IDw8IDQpOwotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFgpIHx8Ci0JICAgIG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8yWCkpCi0JCXJlZyB8PSBHTE9CQUwyX1NXSVRDSF9NR01UX1JTVkQyQ1BVIHwgMHg3OwotCWVyciA9IG12ODhlNnh4eF93cml0ZShjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9TV0lUQ0hfTUdNVCwgcmVnKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JLyogUHJvZ3JhbSB0aGUgRFNBIHJvdXRpbmcgdGFibGUuICovCi0JZXJyID0gbXY4OGU2eHh4X2cyX3NldF9kZXZpY2VfbWFwcGluZyhjaGlwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JLyogQ2xlYXIgYWxsIHRydW5rIG1hc2tzIGFuZCBtYXBwaW5nLiAqLwotCWVyciA9IG12ODhlNnh4eF9nMl9jbGVhcl90cnVuayhjaGlwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdTX0lSTCkpIHsKLQkJLyogRGlzYWJsZSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgYnkgcmVzZXR0aW5nIGFsbCBwZXIgcG9ydAotCQkgKiBpbmdyZXNzIHJhdGUgbGltaXQgcmVzb3VyY2VzIHRvIHRoZWlyIGluaXRpYWwgc3RhdGUuCi0JCSAqLwotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfY2xlYXJfaXJsKGNoaXApOwotCQkJaWYgKGVycikKLQkJCQlyZXR1cm4gZXJyOwotCX0KLQotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHU19QVlQpKSB7Ci0JCS8qIEluaXRpYWxpemUgQ3Jvc3MtY2hpcCBQb3J0IFZMQU4gVGFibGUgdG8gcmVzZXQgZGVmYXVsdHMgKi8KLQkJZXJyID0gbXY4OGU2eHh4X3dyaXRlKGNoaXAsIFJFR19HTE9CQUwyLCBHTE9CQUwyX1BWVF9BRERSLAotCQkJCSAgICAgIEdMT0JBTDJfUFZUX0FERFJfT1BfSU5JVF9PTkVTKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfUE9UKSkgewotCQkvKiBDbGVhciB0aGUgcHJpb3JpdHkgb3ZlcnJpZGUgdGFibGUuICovCi0JCWVyciA9IG12ODhlNnh4eF9nMl9jbGVhcl9wb3QoY2hpcCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IGVycjsKIAlpbnQgaTsKIApAQCAtMzE0NSw3ICsyODgwLDcgQEAKIAkJZ290byB1bmxvY2s7CiAKIAkvKiBTZXR1cCBTd2l0Y2ggUG9ydCBSZWdpc3RlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+aW5mby0+bnVtX3BvcnRzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKTsgaSsrKSB7CiAJCWVyciA9IG12ODhlNnh4eF9zZXR1cF9wb3J0KGNoaXAsIGkpOwogCQlpZiAoZXJyKQogCQkJZ290byB1bmxvY2s7CkBAIC0zMTcxLDEwMCArMjkwNiw0OCBAQAogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zZXRfYWRkcihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHU4ICphZGRyKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBlcnI7CiAKKwlpZiAoIWNoaXAtPmluZm8tPm9wcy0+c2V0X3N3aXRjaF9tYWMpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCS8qIEhhcyBhbiBpbmRpcmVjdCBTd2l0Y2ggTUFDL1dvTC9Xb0YgcmVnaXN0ZXIgaW4gR2xvYmFsIDI/ICovCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfU1dJVENIX01BQykpCi0JCWVyciA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYyhjaGlwLCBhZGRyKTsKLQllbHNlCi0JCWVyciA9IG12ODhlNnh4eF9nMV9zZXRfc3dpdGNoX21hYyhjaGlwLCBhZGRyKTsKLQorCWVyciA9IGNoaXAtPmluZm8tPm9wcy0+c2V0X3N3aXRjaF9tYWMoY2hpcCwgYWRkcik7CiAJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi0jaWZkZWYgQ09ORklHX05FVF9EU0FfSFdNT04KLXN0YXRpYyBpbnQgbXY4OGU2eHh4X21kaW9fcGFnZV9yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGludCBwYWdlLAotCQkJCSAgICBpbnQgcmVnKQotewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0JcmV0ID0gX212ODhlNnh4eF9tZGlvX3BhZ2VfcmVhZChjaGlwLCBwb3J0LCBwYWdlLCByZWcpOwotCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb19wYWdlX3dyaXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGludCBwYWdlLAotCQkJCSAgICAgaW50IHJlZywgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCXJldCA9IF9tdjg4ZTZ4eHhfbWRpb19wYWdlX3dyaXRlKGNoaXAsIHBvcnQsIHBhZ2UsIHJlZywgdmFsKTsKLQltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF90b19tZGlvX2FkZHIoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcG9ydCkKLXsKLQlpZiAocG9ydCA+PSAwICYmIHBvcnQgPCBjaGlwLT5pbmZvLT5udW1fcG9ydHMpCi0JCXJldHVybiBwb3J0OwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBvcnQsIGludCByZWdudW0pCitzdGF0aWMgaW50IG12ODhlNnh4eF9tZGlvX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeSwgaW50IHJlZykKIHsKIAlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBidXMtPnByaXY7Ci0JaW50IGFkZHIgPSBtdjg4ZTZ4eHhfcG9ydF90b19tZGlvX2FkZHIoY2hpcCwgcG9ydCk7Ci0JaW50IHJldDsKKwl1MTYgdmFsOworCWludCBlcnI7CiAKLQlpZiAoYWRkciA8IDApCisJaWYgKHBoeSA+PSBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApKQogCQlyZXR1cm4gMHhmZmZmOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfUFBVKSkKLQkJcmV0ID0gbXY4OGU2eHh4X21kaW9fcmVhZF9wcHUoY2hpcCwgYWRkciwgcmVnbnVtKTsKLQllbHNlIGlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1NNSV9QSFkpKQotCQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb19yZWFkX2luZGlyZWN0KGNoaXAsIGFkZHIsIHJlZ251bSk7Ci0JZWxzZQotCQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb19yZWFkX2RpcmVjdChjaGlwLCBhZGRyLCByZWdudW0pOwotCisJZXJyID0gbXY4OGU2eHh4X3BoeV9yZWFkKGNoaXAsIHBoeSwgcmVnLCAmdmFsKTsKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGVyciA/IGVyciA6IHZhbDsKIH0KIAotc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcG9ydCwgaW50IHJlZ251bSwKLQkJCQl1MTYgdmFsKQorc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5LCBpbnQgcmVnLCB1MTYgdmFsKQogewogCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGJ1cy0+cHJpdjsKLQlpbnQgYWRkciA9IG12ODhlNnh4eF9wb3J0X3RvX21kaW9fYWRkcihjaGlwLCBwb3J0KTsKLQlpbnQgcmV0OworCWludCBlcnI7CiAKLQlpZiAoYWRkciA8IDApCisJaWYgKHBoeSA+PSBtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApKQogCQlyZXR1cm4gMHhmZmZmOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfUFBVKSkKLQkJcmV0ID0gbXY4OGU2eHh4X21kaW9fd3JpdGVfcHB1KGNoaXAsIGFkZHIsIHJlZ251bSwgdmFsKTsKLQllbHNlIGlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1NNSV9QSFkpKQotCQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb193cml0ZV9pbmRpcmVjdChjaGlwLCBhZGRyLCByZWdudW0sIHZhbCk7Ci0JZWxzZQotCQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb193cml0ZV9kaXJlY3QoY2hpcCwgYWRkciwgcmVnbnVtLCB2YWwpOwotCisJZXJyID0gbXY4OGU2eHh4X3BoeV93cml0ZShjaGlwLCBwaHksIHJlZywgdmFsKTsKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfbWRpb19yZWdpc3RlcihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCkBAIC0zMjc0LDkgKzI5NTcsNiBAQAogCXN0cnVjdCBtaWlfYnVzICpidXM7CiAJaW50IGVycjsKIAotCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1BQVSkpCi0JCW12ODhlNnh4eF9wcHVfc3RhdGVfaW5pdChjaGlwKTsKLQogCWlmIChucCkKIAkJY2hpcC0+bWRpb19ucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCAibWRpbyIpOwogCkBAIC0zMzMxLDY5ICszMDExLDcwIEBACiAKIHN0YXRpYyBpbnQgbXY4OGU2MXh4X2dldF90ZW1wKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50ICp0ZW1wKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCXUxNiB2YWw7CiAJaW50IHJldDsKLQlpbnQgdmFsOwogCiAJKnRlbXAgPSAwOwogCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwogCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fd3JpdGVfZGlyZWN0KGNoaXAsIDB4MCwgMHgxNiwgMHg2KTsKKwlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3dyaXRlKGNoaXAsIDB4MCwgMHgxNiwgMHg2KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAogCS8qIEVuYWJsZSB0ZW1wZXJhdHVyZSBzZW5zb3IgKi8KLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb19yZWFkX2RpcmVjdChjaGlwLCAweDAsIDB4MWEpOworCXJldCA9IG12ODhlNnh4eF9waHlfcmVhZChjaGlwLCAweDAsIDB4MWEsICZ2YWwpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yOwogCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fd3JpdGVfZGlyZWN0KGNoaXAsIDB4MCwgMHgxYSwgcmV0IHwgKDEgPDwgNSkpOworCXJldCA9IG12ODhlNnh4eF9waHlfd3JpdGUoY2hpcCwgMHgwLCAweDFhLCB2YWwgfCAoMSA8PCA1KSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKIAkvKiBXYWl0IGZvciB0ZW1wZXJhdHVyZSB0byBzdGFiaWxpemUgKi8KIAl1c2xlZXBfcmFuZ2UoMTAwMDAsIDEyMDAwKTsKIAotCXZhbCA9IG12ODhlNnh4eF9tZGlvX3JlYWRfZGlyZWN0KGNoaXAsIDB4MCwgMHgxYSk7Ci0JaWYgKHZhbCA8IDApIHsKLQkJcmV0ID0gdmFsOworCXJldCA9IG12ODhlNnh4eF9waHlfcmVhZChjaGlwLCAweDAsIDB4MWEsICZ2YWwpOworCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yOwotCX0KIAogCS8qIERpc2FibGUgdGVtcGVyYXR1cmUgc2Vuc29yICovCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fd3JpdGVfZGlyZWN0KGNoaXAsIDB4MCwgMHgxYSwgcmV0ICYgfigxIDw8IDUpKTsKKwlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3dyaXRlKGNoaXAsIDB4MCwgMHgxYSwgdmFsICYgfigxIDw8IDUpKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAogCSp0ZW1wID0gKCh2YWwgJiAweDFmKSAtIDUpICogNTsKIAogZXJyb3I6Ci0JbXY4OGU2eHh4X21kaW9fd3JpdGVfZGlyZWN0KGNoaXAsIDB4MCwgMHgxNiwgMHgwKTsKKwltdjg4ZTZ4eHhfcGh5X3dyaXRlKGNoaXAsIDB4MCwgMHgxNiwgMHgwKTsKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG12ODhlNjN4eF9nZXRfdGVtcChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCAqdGVtcCkKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAlpbnQgcGh5ID0gbXY4OGU2eHh4XzYzMjBfZmFtaWx5KGNoaXApID8gMyA6IDA7CisJdTE2IHZhbDsKIAlpbnQgcmV0OwogCiAJKnRlbXAgPSAwOwogCi0JcmV0ID0gbXY4OGU2eHh4X21kaW9fcGFnZV9yZWFkKGRzLCBwaHksIDYsIDI3KTsKKwltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisJcmV0ID0gbXY4OGU2eHh4X3BoeV9wYWdlX3JlYWQoY2hpcCwgcGh5LCA2LCAyNywgJnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQkqdGVtcCA9IChyZXQgJiAweGZmKSAtIDI1OworCSp0ZW1wID0gKHZhbCAmIDB4ZmYpIC0gMjU7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfZ2V0X3RlbXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgKnRlbXApCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAKIAlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfVEVNUCkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTM0MDYsOCArMzA4Nyw5IEBACiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X2dldF90ZW1wX2xpbWl0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50ICp0ZW1wKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBwaHkgPSBtdjg4ZTZ4eHhfNjMyMF9mYW1pbHkoY2hpcCkgPyAzIDogMDsKKwl1MTYgdmFsOwogCWludCByZXQ7CiAKIAlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfVEVNUF9MSU1JVCkpCkBAIC0zNDE1LDM2ICszMDk3LDQ1IEBACiAKIAkqdGVtcCA9IDA7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb19wYWdlX3JlYWQoZHMsIHBoeSwgNiwgMjYpOworCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3BhZ2VfcmVhZChjaGlwLCBwaHksIDYsIDI2LCAmdmFsKTsKKwltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCSp0ZW1wID0gKCgocmV0ID4+IDgpICYgMHgxZikgKiA1KSAtIDI1OworCSp0ZW1wID0gKCgodmFsID4+IDgpICYgMHgxZikgKiA1KSAtIDI1OwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3NldF90ZW1wX2xpbWl0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHRlbXApCiB7Ci0Jc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHNfdG9fcHJpdihkcyk7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CiAJaW50IHBoeSA9IG12ODhlNnh4eF82MzIwX2ZhbWlseShjaGlwKSA/IDMgOiAwOwotCWludCByZXQ7CisJdTE2IHZhbDsKKwlpbnQgZXJyOwogCiAJaWYgKCFtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX1RFTVBfTElNSVQpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfbWRpb19wYWdlX3JlYWQoZHMsIHBoeSwgNiwgMjYpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwllcnIgPSBtdjg4ZTZ4eHhfcGh5X3BhZ2VfcmVhZChjaGlwLCBwaHksIDYsIDI2LCAmdmFsKTsKKwlpZiAoZXJyKQorCQlnb3RvIHVubG9jazsKIAl0ZW1wID0gY2xhbXBfdmFsKERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDUpICsgNSwgMCwgMHgxZik7Ci0JcmV0dXJuIG12ODhlNnh4eF9tZGlvX3BhZ2Vfd3JpdGUoZHMsIHBoeSwgNiwgMjYsCi0JCQkJCSAocmV0ICYgMHhlMGZmKSB8ICh0ZW1wIDw8IDgpKTsKKwllcnIgPSBtdjg4ZTZ4eHhfcGh5X3BhZ2Vfd3JpdGUoY2hpcCwgcGh5LCA2LCAyNiwKKwkJCQkgICAgICAgKHZhbCAmIDB4ZTBmZikgfCAodGVtcCA8PCA4KSk7Cit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IG12ODhlNnh4eF9nZXRfdGVtcF9hbGFybShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGJvb2wgKmFsYXJtKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBwaHkgPSBtdjg4ZTZ4eHhfNjMyMF9mYW1pbHkoY2hpcCkgPyAzIDogMDsKKwl1MTYgdmFsOwogCWludCByZXQ7CiAKIAlpZiAoIW12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfVEVNUF9MSU1JVCkpCkBAIC0zNDUyLDExICszMTQzLDEzIEBACiAKIAkqYWxhcm0gPSBmYWxzZTsKIAotCXJldCA9IG12ODhlNnh4eF9tZGlvX3BhZ2VfcmVhZChkcywgcGh5LCA2LCAyNik7CisJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOworCXJldCA9IG12ODhlNnh4eF9waHlfcGFnZV9yZWFkKGNoaXAsIHBoeSwgNiwgMjYsICZ2YWwpOworCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JKmFsYXJtID0gISEocmV0ICYgMHg0MCk7CisJKmFsYXJtID0gISEodmFsICYgMHg0MCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM0NjQsNzQgKzMxNTcsMjIgQEAKIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCiAJcmV0dXJuIGNoaXAtPmVlcHJvbV9sZW47CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2eHh4X2dldF9lZXByb20xNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCi0JCQkJICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCi17Ci0JdW5zaWduZWQgaW50IG9mZnNldCA9IGVlcHJvbS0+b2Zmc2V0OwotCXVuc2lnbmVkIGludCBsZW4gPSBlZXByb20tPmxlbjsKLQl1MTYgdmFsOwotCWludCBlcnI7Ci0KLQllZXByb20tPmxlbiA9IDA7Ci0KLQlpZiAob2Zmc2V0ICYgMSkgewotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihjaGlwLCBvZmZzZXQgPj4gMSwgJnZhbCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCSpkYXRhKysgPSAodmFsID4+IDgpICYgMHhmZjsKLQotCQlvZmZzZXQrKzsKLQkJbGVuLS07Ci0JCWVlcHJvbS0+bGVuKys7Ci0JfQotCi0Jd2hpbGUgKGxlbiA+PSAyKSB7Ci0JCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fcmVhZDE2KGNoaXAsIG9mZnNldCA+PiAxLCAmdmFsKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJKmRhdGErKyA9IHZhbCAmIDB4ZmY7Ci0JCSpkYXRhKysgPSAodmFsID4+IDgpICYgMHhmZjsKLQotCQlvZmZzZXQgKz0gMjsKLQkJbGVuIC09IDI7Ci0JCWVlcHJvbS0+bGVuICs9IDI7Ci0JfQotCi0JaWYgKGxlbikgewotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihjaGlwLCBvZmZzZXQgPj4gMSwgJnZhbCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCSpkYXRhKysgPSB2YWwgJiAweGZmOwotCi0JCW9mZnNldCsrOwotCQlsZW4tLTsKLQkJZWVwcm9tLT5sZW4rKzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBtdjg4ZTZ4eHhfZ2V0X2VlcHJvbShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiAJCQkJc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBlcnI7CiAKKwlpZiAoIWNoaXAtPmluZm8tPm9wcy0+Z2V0X2VlcHJvbSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOwotCi0JaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdTX0VFUFJPTTE2KSkKLQkJZXJyID0gbXY4OGU2eHh4X2dldF9lZXByb20xNihjaGlwLCBlZXByb20sIGRhdGEpOwotCWVsc2UKLQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0KKwllcnIgPSBjaGlwLT5pbmZvLT5vcHMtPmdldF9lZXByb20oY2hpcCwgZWVwcm9tLCBkYXRhKTsKIAltdXRleF91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAogCWlmIChlcnIpCkBAIC0zNTQyLDkzICszMTgzLDEzOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG12ODhlNnh4eF9zZXRfZWVwcm9tMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAotCQkJCSAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQotewotCXVuc2lnbmVkIGludCBvZmZzZXQgPSBlZXByb20tPm9mZnNldDsKLQl1bnNpZ25lZCBpbnQgbGVuID0gZWVwcm9tLT5sZW47Ci0JdTE2IHZhbDsKLQlpbnQgZXJyOwotCi0JLyogRW5zdXJlIHRoZSBSTyBXcml0ZUVuIGJpdCBpcyBzZXQgKi8KLQllcnIgPSBtdjg4ZTZ4eHhfcmVhZChjaGlwLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9FRVBST01fQ01ELCAmdmFsKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKCEodmFsICYgR0xPQkFMMl9FRVBST01fQ01EX1dSSVRFX0VOKSkKLQkJcmV0dXJuIC1FUk9GUzsKLQotCWVlcHJvbS0+bGVuID0gMDsKLQotCWlmIChvZmZzZXQgJiAxKSB7Ci0JCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fcmVhZDE2KGNoaXAsIG9mZnNldCA+PiAxLCAmdmFsKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJdmFsID0gKCpkYXRhKysgPDwgOCkgfCAodmFsICYgMHhmZik7Ci0KLQkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV93cml0ZTE2KGNoaXAsIG9mZnNldCA+PiAxLCB2YWwpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQlvZmZzZXQrKzsKLQkJbGVuLS07Ci0JCWVlcHJvbS0+bGVuKys7Ci0JfQotCi0Jd2hpbGUgKGxlbiA+PSAyKSB7Ci0JCXZhbCA9ICpkYXRhKys7Ci0JCXZhbCB8PSAqZGF0YSsrIDw8IDg7Ci0KLQkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV93cml0ZTE2KGNoaXAsIG9mZnNldCA+PiAxLCB2YWwpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQlvZmZzZXQgKz0gMjsKLQkJbGVuIC09IDI7Ci0JCWVlcHJvbS0+bGVuICs9IDI7Ci0JfQotCi0JaWYgKGxlbikgewotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihjaGlwLCBvZmZzZXQgPj4gMSwgJnZhbCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCXZhbCA9ICh2YWwgJiAweGZmMDApIHwgKmRhdGErKzsKLQotCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dyaXRlMTYoY2hpcCwgb2Zmc2V0ID4+IDEsIHZhbCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCW9mZnNldCsrOwotCQlsZW4tLTsKLQkJZWVwcm9tLT5sZW4rKzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBtdjg4ZTZ4eHhfc2V0X2VlcHJvbShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCiAJCQkJc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzX3RvX3ByaXYoZHMpOworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OwogCWludCBlcnI7CiAKKwlpZiAoIWNoaXAtPmluZm8tPm9wcy0+c2V0X2VlcHJvbSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJaWYgKGVlcHJvbS0+bWFnaWMgIT0gMHhjM2VjNDk1MSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZjaGlwLT5yZWdfbG9jayk7Ci0KLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR1NfRUVQUk9NMTYpKQotCQllcnIgPSBtdjg4ZTZ4eHhfc2V0X2VlcHJvbTE2KGNoaXAsIGVlcHJvbSwgZGF0YSk7Ci0JZWxzZQotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQorCWVyciA9IGNoaXAtPmluZm8tPm9wcy0+c2V0X2VlcHJvbShjaGlwLCBlZXByb20sIGRhdGEpOwogCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOwogCiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjA4NV9vcHMgPSB7CisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cxX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9waHlfcHB1X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9waHlfcHB1X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjA5NV9vcHMgPSB7CisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cxX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9waHlfcHB1X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9waHlfcHB1X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjEyM19vcHMgPSB7CisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MTMxX29wcyA9IHsKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzFfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X3BoeV9wcHVfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X3BoeV9wcHVfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MTYxX29wcyA9IHsKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYxNjVfb3BzID0geworCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjE3MV9vcHMgPSB7CisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjE3Ml9vcHMgPSB7CisJLmdldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfZ2V0X2VlcHJvbTE2LAorCS5zZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX3NldF9lZXByb20xNiwKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MTc1X29wcyA9IHsKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MTc2X29wcyA9IHsKKwkuZ2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9nZXRfZWVwcm9tMTYsCisJLnNldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfc2V0X2VlcHJvbTE2LAorCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYxODVfb3BzID0geworCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMV9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfcGh5X3BwdV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfcGh5X3BwdV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYyNDBfb3BzID0geworCS5nZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX2dldF9lZXByb20xNiwKKwkuc2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9zZXRfZWVwcm9tMTYsCisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfb3BzIG12ODhlNjMyMF9vcHMgPSB7CisJLmdldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfZ2V0X2VlcHJvbTE2LAorCS5zZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX3NldF9lZXByb20xNiwKKwkuc2V0X3N3aXRjaF9tYWMgPSBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMsCisJLnBoeV9yZWFkID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfcmVhZCwKKwkucGh5X3dyaXRlID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgbXY4OGU2MzIxX29wcyA9IHsKKwkuZ2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9nZXRfZWVwcm9tMTYsCisJLnNldF9lZXByb20gPSBtdjg4ZTZ4eHhfZzJfc2V0X2VlcHJvbTE2LAorCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYzNTBfb3BzID0geworCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYzNTFfb3BzID0geworCS5zZXRfc3dpdGNoX21hYyA9IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYywKKwkucGh5X3JlYWQgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkLAorCS5waHlfd3JpdGUgPSBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyBtdjg4ZTYzNTJfb3BzID0geworCS5nZXRfZWVwcm9tID0gbXY4OGU2eHh4X2cyX2dldF9lZXByb20xNiwKKwkuc2V0X2VlcHJvbSA9IG12ODhlNnh4eF9nMl9zZXRfZWVwcm9tMTYsCisJLnNldF9zd2l0Y2hfbWFjID0gbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjLAorCS5waHlfcmVhZCA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3JlYWQsCisJLnBoeV93cml0ZSA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBtdjg4ZTZ4eHhfaW5mbyBtdjg4ZTZ4eHhfdGFibGVbXSA9IHsKIAlbTVY4OEU2MDg1XSA9IHsKIAkJLnByb2RfbnVtID0gUE9SVF9TV0lUQ0hfSURfUFJPRF9OVU1fNjA4NSwKQEAgLTM2MzcsOCArMzMyNCwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSAxMCwKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYwOTcsCisJCS5vcHMgPSAmbXY4OGU2MDg1X29wcywKIAl9LAogCiAJW01WODhFNjA5NV0gPSB7CkBAIC0zNjQ4LDggKzMzMzcsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSAyNTYsCiAJCS5udW1fcG9ydHMgPSAxMSwKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYwOTUsCisJCS5vcHMgPSAmbXY4OGU2MDk1X29wcywKIAl9LAogCiAJW01WODhFNjEyM10gPSB7CkBAIC0zNjU5LDggKzMzNTAsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSA0MDk2LAogCQkubnVtX3BvcnRzID0gMywKIAkJLnBvcnRfYmFzZV9hZGRyID0gMHgxMCwKKwkJLmdsb2JhbDFfYWRkciA9IDB4MWIsCiAJCS5hZ2VfdGltZV9jb2VmZiA9IDE1MDAwLAogCQkuZmxhZ3MgPSBNVjg4RTZYWFhfRkxBR1NfRkFNSUxZXzYxNjUsCisJCS5vcHMgPSAmbXY4OGU2MTIzX29wcywKIAl9LAogCiAJW01WODhFNjEzMV0gPSB7CkBAIC0zNjcwLDggKzMzNjMsMTAgQEAKIAkJLm51bV9kYXRhYmFzZXMgPSAyNTYsCiAJCS5udW1fcG9ydHMgPSA4LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjE4NSwKKwkJLm9wcyA9ICZtdjg4ZTYxMzFfb3BzLAogCX0sCiAKIAlbTVY4OEU2MTYxXSA9IHsKQEAgLTM2ODEsOCArMzM3NiwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA2LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjE2NSwKKwkJLm9wcyA9ICZtdjg4ZTYxNjFfb3BzLAogCX0sCiAKIAlbTVY4OEU2MTY1XSA9IHsKQEAgLTM2OTIsOCArMzM4OSwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA2LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjE2NSwKKwkJLm9wcyA9ICZtdjg4ZTYxNjVfb3BzLAogCX0sCiAKIAlbTVY4OEU2MTcxXSA9IHsKQEAgLTM3MDMsOCArMzQwMiwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA3LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjM1MSwKKwkJLm9wcyA9ICZtdjg4ZTYxNzFfb3BzLAogCX0sCiAKIAlbTVY4OEU2MTcyXSA9IHsKQEAgLTM3MTQsOCArMzQxNSwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA3LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjM1MiwKKwkJLm9wcyA9ICZtdjg4ZTYxNzJfb3BzLAogCX0sCiAKIAlbTVY4OEU2MTc1XSA9IHsKQEAgLTM3MjUsOCArMzQyOCwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA3LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjM1MSwKKwkJLm9wcyA9ICZtdjg4ZTYxNzVfb3BzLAogCX0sCiAKIAlbTVY4OEU2MTc2XSA9IHsKQEAgLTM3MzYsOCArMzQ0MSwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA3LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjM1MiwKKwkJLm9wcyA9ICZtdjg4ZTYxNzZfb3BzLAogCX0sCiAKIAlbTVY4OEU2MTg1XSA9IHsKQEAgLTM3NDcsOCArMzQ1NCwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDI1NiwKIAkJLm51bV9wb3J0cyA9IDEwLAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjE4NSwKKwkJLm9wcyA9ICZtdjg4ZTYxODVfb3BzLAogCX0sCiAKIAlbTVY4OEU2MjQwXSA9IHsKQEAgLTM3NTgsOCArMzQ2NywxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA3LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjM1MiwKKwkJLm9wcyA9ICZtdjg4ZTYyNDBfb3BzLAogCX0sCiAKIAlbTVY4OEU2MzIwXSA9IHsKQEAgLTM3NjksOCArMzQ4MCwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA3LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjMyMCwKKwkJLm9wcyA9ICZtdjg4ZTYzMjBfb3BzLAogCX0sCiAKIAlbTVY4OEU2MzIxXSA9IHsKQEAgLTM3ODAsOCArMzQ5MywxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA3LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjMyMCwKKwkJLm9wcyA9ICZtdjg4ZTYzMjFfb3BzLAogCX0sCiAKIAlbTVY4OEU2MzUwXSA9IHsKQEAgLTM3OTEsOCArMzUwNiwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA3LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjM1MSwKKwkJLm9wcyA9ICZtdjg4ZTYzNTBfb3BzLAogCX0sCiAKIAlbTVY4OEU2MzUxXSA9IHsKQEAgLTM4MDIsOCArMzUxOSwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA3LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjM1MSwKKwkJLm9wcyA9ICZtdjg4ZTYzNTFfb3BzLAogCX0sCiAKIAlbTVY4OEU2MzUyXSA9IHsKQEAgLTM4MTMsOCArMzUzMiwxMCBAQAogCQkubnVtX2RhdGFiYXNlcyA9IDQwOTYsCiAJCS5udW1fcG9ydHMgPSA3LAogCQkucG9ydF9iYXNlX2FkZHIgPSAweDEwLAorCQkuZ2xvYmFsMV9hZGRyID0gMHgxYiwKIAkJLmFnZV90aW1lX2NvZWZmID0gMTUwMDAsCiAJCS5mbGFncyA9IE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjM1MiwKKwkJLm9wcyA9ICZtdjg4ZTYzNTJfb3BzLAogCX0sCiB9OwogCkBAIC0zODUyLDYgKzM1NzMsMTAgQEAKIAkvKiBVcGRhdGUgdGhlIGNvbXBhdGlibGUgaW5mbyB3aXRoIHRoZSBwcm9iZWQgb25lICovCiAJY2hpcC0+aW5mbyA9IGluZm87CiAKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfcmVxdWlyZShjaGlwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJZGV2X2luZm8oY2hpcC0+ZGV2LCAic3dpdGNoIDB4JXggZGV0ZWN0ZWQ6ICVzLCByZXZpc2lvbiAldVxuIiwKIAkJIGNoaXAtPmluZm8tPnByb2RfbnVtLCBjaGlwLT5pbmZvLT5uYW1lLCByZXYpOwogCkBAIC0zODczLDYgKzM1OTgsMTggQEAKIAlyZXR1cm4gY2hpcDsKIH0KIAorc3RhdGljIHZvaWQgbXY4OGU2eHh4X3BoeV9pbml0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19QUFUpKQorCQltdjg4ZTZ4eHhfcHB1X3N0YXRlX2luaXQoY2hpcCk7Cit9CisKK3N0YXRpYyB2b2lkIG12ODhlNnh4eF9waHlfZGVzdHJveShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfUFBVKSkKKwkJbXY4OGU2eHh4X3BwdV9zdGF0ZV9kZXN0cm95KGNoaXApOworfQorCiBzdGF0aWMgaW50IG12ODhlNnh4eF9zbWlfaW5pdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCiAJCQkgICAgICBzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgc3dfYWRkcikKIHsKQEAgLTM4ODIsNyArMzYxOSw3IEBACiAKIAlpZiAoc3dfYWRkciA9PSAwKQogCQljaGlwLT5zbWlfb3BzID0gJm12ODhlNnh4eF9zbWlfc2luZ2xlX2NoaXBfb3BzOwotCWVsc2UgaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfTVVMVElfQ0hJUCkpCisJZWxzZSBpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR1NfTVVMVElfQ0hJUCkpCiAJCWNoaXAtPnNtaV9vcHMgPSAmbXY4OGU2eHh4X3NtaV9tdWx0aV9jaGlwX29wczsKIAllbHNlCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzg5Myw2ICszNjMwLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBlbnVtIGRzYV90YWdfcHJvdG9jb2wgbXY4OGU2eHh4X2dldF90YWdfcHJvdG9jb2woc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCA9IGRzLT5wcml2OworCisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRURTQSkpCisJCXJldHVybiBEU0FfVEFHX1BST1RPX0VEU0E7CisKKwlyZXR1cm4gRFNBX1RBR19QUk9UT19EU0E7Cit9CisKIHN0YXRpYyBjb25zdCBjaGFyICptdjg4ZTZ4eHhfZHJ2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRzYV9kZXYsCiAJCQkJICAgICAgIHN0cnVjdCBkZXZpY2UgKmhvc3RfZGV2LCBpbnQgc3dfYWRkciwKIAkJCQkgICAgICAgdm9pZCAqKnByaXYpCkBAIC0zOTIwLDYgKzM2NjcsOCBAQAogCWlmIChlcnIpCiAJCWdvdG8gZnJlZTsKIAorCW12ODhlNnh4eF9waHlfaW5pdChjaGlwKTsKKwogCWVyciA9IG12ODhlNnh4eF9tZGlvX3JlZ2lzdGVyKGNoaXAsIE5VTEwpOwogCWlmIChlcnIpCiAJCWdvdG8gZnJlZTsKQEAgLTM5MzMsOSArMzY4Miw2MSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIG12ODhlNnh4eF9zd2l0Y2hfZHJpdmVyID0gewotCS50YWdfcHJvdG9jb2wJCT0gRFNBX1RBR19QUk9UT19FRFNBLAorc3RhdGljIGludCBtdjg4ZTZ4eHhfcG9ydF9tZGJfcHJlcGFyZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfbWRiICptZGIsCisJCQkJICAgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCit7CisJLyogV2UgZG9uJ3QgbmVlZCBhbnkgZHluYW1pYyByZXNvdXJjZSBmcm9tIHRoZSBrZXJuZWwgKHlldCksCisJICogc28gc2tpcCB0aGUgcHJlcGFyZSBwaGFzZS4KKwkgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtdjg4ZTZ4eHhfcG9ydF9tZGJfYWRkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkJICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYiwKKwkJCQkgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKworCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwlpZiAobXY4OGU2eHh4X3BvcnRfZGJfbG9hZF9wdXJnZShjaGlwLCBwb3J0LCBtZGItPmFkZHIsIG1kYi0+dmlkLAorCQkJCQkgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX01DX1NUQVRJQykpCisJCW5ldGRldl9lcnIoZHMtPnBvcnRzW3BvcnRdLm5ldGRldiwgImZhaWxlZCB0byBsb2FkIG11bHRpY2FzdCBNQUMgYWRkcmVzc1xuIik7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X3BvcnRfbWRiX2RlbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJCSAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYikKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmY2hpcC0+cmVnX2xvY2spOworCWVyciA9IG12ODhlNnh4eF9wb3J0X2RiX2xvYWRfcHVyZ2UoY2hpcCwgcG9ydCwgbWRiLT5hZGRyLCBtZGItPnZpZCwKKwkJCQkJICAgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VOVVNFRCk7CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X21kYl9kdW1wKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkJICAgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYiwKKwkJCQkgICBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpCit7CisJc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwID0gZHMtPnByaXY7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKKwllcnIgPSBtdjg4ZTZ4eHhfcG9ydF9kYl9kdW1wKGNoaXAsIHBvcnQsICZtZGItPm9iaiwgY2IpOworCW11dGV4X3VubG9jaygmY2hpcC0+cmVnX2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoX29wcyBtdjg4ZTZ4eHhfc3dpdGNoX29wcyA9IHsKIAkucHJvYmUJCQk9IG12ODhlNnh4eF9kcnZfcHJvYmUsCisJLmdldF90YWdfcHJvdG9jb2wJPSBtdjg4ZTZ4eHhfZ2V0X3RhZ19wcm90b2NvbCwKIAkuc2V0dXAJCQk9IG12ODhlNnh4eF9zZXR1cCwKIAkuc2V0X2FkZHIJCT0gbXY4OGU2eHh4X3NldF9hZGRyLAogCS5hZGp1c3RfbGluawkJPSBtdjg4ZTZ4eHhfYWRqdXN0X2xpbmssCkBAIC0zOTU5LDYgKzM3NjAsNyBAQAogCS5wb3J0X2JyaWRnZV9qb2luCT0gbXY4OGU2eHh4X3BvcnRfYnJpZGdlX2pvaW4sCiAJLnBvcnRfYnJpZGdlX2xlYXZlCT0gbXY4OGU2eHh4X3BvcnRfYnJpZGdlX2xlYXZlLAogCS5wb3J0X3N0cF9zdGF0ZV9zZXQJPSBtdjg4ZTZ4eHhfcG9ydF9zdHBfc3RhdGVfc2V0LAorCS5wb3J0X2Zhc3RfYWdlCQk9IG12ODhlNnh4eF9wb3J0X2Zhc3RfYWdlLAogCS5wb3J0X3ZsYW5fZmlsdGVyaW5nCT0gbXY4OGU2eHh4X3BvcnRfdmxhbl9maWx0ZXJpbmcsCiAJLnBvcnRfdmxhbl9wcmVwYXJlCT0gbXY4OGU2eHh4X3BvcnRfdmxhbl9wcmVwYXJlLAogCS5wb3J0X3ZsYW5fYWRkCQk9IG12ODhlNnh4eF9wb3J0X3ZsYW5fYWRkLApAQCAtMzk2OCw2ICszNzcwLDEwIEBACiAJLnBvcnRfZmRiX2FkZCAgICAgICAgICAgPSBtdjg4ZTZ4eHhfcG9ydF9mZGJfYWRkLAogCS5wb3J0X2ZkYl9kZWwgICAgICAgICAgID0gbXY4OGU2eHh4X3BvcnRfZmRiX2RlbCwKIAkucG9ydF9mZGJfZHVtcCAgICAgICAgICA9IG12ODhlNnh4eF9wb3J0X2ZkYl9kdW1wLAorCS5wb3J0X21kYl9wcmVwYXJlICAgICAgID0gbXY4OGU2eHh4X3BvcnRfbWRiX3ByZXBhcmUsCisJLnBvcnRfbWRiX2FkZCAgICAgICAgICAgPSBtdjg4ZTZ4eHhfcG9ydF9tZGJfYWRkLAorCS5wb3J0X21kYl9kZWwgICAgICAgICAgID0gbXY4OGU2eHh4X3BvcnRfbWRiX2RlbCwKKwkucG9ydF9tZGJfZHVtcCAgICAgICAgICA9IG12ODhlNnh4eF9wb3J0X21kYl9kdW1wLAogfTsKIAogc3RhdGljIGludCBtdjg4ZTZ4eHhfcmVnaXN0ZXJfc3dpdGNoKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKQEAgLTM5ODIsNyArMzc4OCw3IEBACiAKIAlkcy0+ZGV2ID0gZGV2OwogCWRzLT5wcml2ID0gY2hpcDsKLQlkcy0+ZHJ2ID0gJm12ODhlNnh4eF9zd2l0Y2hfZHJpdmVyOworCWRzLT5vcHMgPSAmbXY4OGU2eHh4X3N3aXRjaF9vcHM7CiAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBkcyk7CiAKQEAgLTQwMjEsMTEgKzM4MjcsMTMgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCisJbXY4OGU2eHh4X3BoeV9pbml0KGNoaXApOworCiAJY2hpcC0+cmVzZXQgPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChkZXYsICJyZXNldCIsIEdQSU9EX0FTSVMpOwogCWlmIChJU19FUlIoY2hpcC0+cmVzZXQpKQogCQlyZXR1cm4gUFRSX0VSUihjaGlwLT5yZXNldCk7CiAKLQlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR1NfRUVQUk9NMTYpICYmCisJaWYgKGNoaXAtPmluZm8tPm9wcy0+Z2V0X2VlcHJvbSAmJgogCSAgICAhb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJlZXByb20tbGVuZ3RoIiwgJmVlcHJvbV9sZW4pKQogCQljaGlwLT5lZXByb21fbGVuID0gZWVwcm9tX2xlbjsKIApAQCAtNDA0NSw4ICszODUzLDkgQEAKIHN0YXRpYyB2b2lkIG12ODhlNnh4eF9yZW1vdmUoc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2KQogewogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGRldl9nZXRfZHJ2ZGF0YSgmbWRpb2Rldi0+ZGV2KTsKLQlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkc190b19wcml2KGRzKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAgPSBkcy0+cHJpdjsKIAorCW12ODhlNnh4eF9waHlfZGVzdHJveShjaGlwKTsKIAltdjg4ZTZ4eHhfdW5yZWdpc3Rlcl9zd2l0Y2goY2hpcCk7CiAJbXY4OGU2eHh4X21kaW9fdW5yZWdpc3RlcihjaGlwKTsKIH0KQEAgLTQwNzIsNyArMzg4MSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG12ODhlNnh4eF9pbml0KHZvaWQpCiB7Ci0JcmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2eHh4X3N3aXRjaF9kcml2ZXIpOworCXJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNnh4eF9zd2l0Y2hfb3BzKTsKIAlyZXR1cm4gbWRpb19kcml2ZXJfcmVnaXN0ZXIoJm12ODhlNnh4eF9kcml2ZXIpOwogfQogbW9kdWxlX2luaXQobXY4OGU2eHh4X2luaXQpOwpAQCAtNDA4MCw3ICszODg5LDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtdjg4ZTZ4eHhfY2xlYW51cCh2b2lkKQogewogCW1kaW9fZHJpdmVyX3VucmVnaXN0ZXIoJm12ODhlNnh4eF9kcml2ZXIpOwotCXVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2eHh4X3N3aXRjaF9kcml2ZXIpOworCXVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2eHh4X3N3aXRjaF9vcHMpOwogfQogbW9kdWxlX2V4aXQobXY4OGU2eHh4X2NsZWFudXApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDEuYyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTg3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDEuYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogTWFydmVsbCA4OEU2eHh4IFN3aXRjaCBHbG9iYWwgKDEpIFJlZ2lzdGVycyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hcnZlbGwgU2VtaWNvbmR1Y3RvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBWaXZpZW4gRGlkZWxvdCA8dml2aWVuLmRpZGVsb3RAc2F2b2lyZmFpcmVsaW51eC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSAibXY4OGU2eHh4LmgiCisjaW5jbHVkZSAiZ2xvYmFsMS5oIgorCitpbnQgbXY4OGU2eHh4X2cxX3JlYWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MTYgKnZhbCkKK3sKKwlpbnQgYWRkciA9IGNoaXAtPmluZm8tPmdsb2JhbDFfYWRkcjsKKworCXJldHVybiBtdjg4ZTZ4eHhfcmVhZChjaGlwLCBhZGRyLCByZWcsIHZhbCk7Cit9CisKK2ludCBtdjg4ZTZ4eHhfZzFfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCWludCBhZGRyID0gY2hpcC0+aW5mby0+Z2xvYmFsMV9hZGRyOworCisJcmV0dXJuIG12ODhlNnh4eF93cml0ZShjaGlwLCBhZGRyLCByZWcsIHZhbCk7Cit9CisKK2ludCBtdjg4ZTZ4eHhfZzFfd2FpdChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiBtYXNrKQoreworCXJldHVybiBtdjg4ZTZ4eHhfd2FpdChjaGlwLCBjaGlwLT5pbmZvLT5nbG9iYWwxX2FkZHIsIHJlZywgbWFzayk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDEuaCBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMjkxZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L2dsb2JhbDEuaApAQCAtMCwwICsxLDIzIEBACisvKgorICogTWFydmVsbCA4OEU2eHh4IFN3aXRjaCBHbG9iYWwgKDEpIFJlZ2lzdGVycyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hcnZlbGwgU2VtaWNvbmR1Y3RvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBWaXZpZW4gRGlkZWxvdCA8dml2aWVuLmRpZGVsb3RAc2F2b2lyZmFpcmVsaW51eC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9NVjg4RTZYWFhfR0xPQkFMMV9ICisjZGVmaW5lIF9NVjg4RTZYWFhfR0xPQkFMMV9ICisKKyNpbmNsdWRlICJtdjg4ZTZ4eHguaCIKKworaW50IG12ODhlNnh4eF9nMV9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2ICp2YWwpOworaW50IG12ODhlNnh4eF9nMV93cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiB2YWwpOworaW50IG12ODhlNnh4eF9nMV93YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHJlZywgdTE2IG1hc2spOworCisjZW5kaWYgLyogX01WODhFNlhYWF9HTE9CQUwxX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMi5jIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2ODZlNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMi5jCkBAIC0wLDAgKzEsNDkxIEBACisvKgorICogTWFydmVsbCA4OEU2eHh4IFN3aXRjaCBHbG9iYWwgMiBSZWdpc3RlcnMgc3VwcG9ydCAoZGV2aWNlIGFkZHJlc3MgMHgxQykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggTWFydmVsbCBTZW1pY29uZHVjdG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFZpdmllbiBEaWRlbG90IDx2aXZpZW4uZGlkZWxvdEBzYXZvaXJmYWlyZWxpbnV4LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJtdjg4ZTZ4eHguaCIKKyNpbmNsdWRlICJnbG9iYWwyLmgiCisKKyNkZWZpbmUgQUREUl9HTE9CQUwyCTB4MWMKKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfcmVhZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiAqdmFsKQoreworCXJldHVybiBtdjg4ZTZ4eHhfcmVhZChjaGlwLCBBRERSX0dMT0JBTDIsIHJlZywgdmFsKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MTYgdmFsKQoreworCXJldHVybiBtdjg4ZTZ4eHhfd3JpdGUoY2hpcCwgQUREUl9HTE9CQUwyLCByZWcsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3VwZGF0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCByZWcsIHUxNiB1cGRhdGUpCit7CisJcmV0dXJuIG12ODhlNnh4eF91cGRhdGUoY2hpcCwgQUREUl9HTE9CQUwyLCByZWcsIHVwZGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX3dhaXQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgcmVnLCB1MTYgbWFzaykKK3sKKwlyZXR1cm4gbXY4OGU2eHh4X3dhaXQoY2hpcCwgQUREUl9HTE9CQUwyLCByZWcsIG1hc2spOworfQorCisvKiBPZmZzZXQgMHgwNjogRGV2aWNlIE1hcHBpbmcgVGFibGUgcmVnaXN0ZXIgKi8KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfZGV2aWNlX21hcHBpbmdfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJCQkgICAgIGludCB0YXJnZXQsIGludCBwb3J0KQoreworCXUxNiB2YWwgPSAodGFyZ2V0IDw8IDgpIHwgKHBvcnQgJiAweGYpOworCisJcmV0dXJuIG12ODhlNnh4eF9nMl91cGRhdGUoY2hpcCwgR0xPQkFMMl9ERVZJQ0VfTUFQUElORywgdmFsKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfc2V0X2RldmljZV9tYXBwaW5nKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlpbnQgdGFyZ2V0LCBwb3J0OworCWludCBlcnI7CisKKwkvKiBJbml0aWFsaXplIHRoZSByb3V0aW5nIHBvcnQgdG8gdGhlIDMyIHBvc3NpYmxlIHRhcmdldCBkZXZpY2VzICovCisJZm9yICh0YXJnZXQgPSAwOyB0YXJnZXQgPCAzMjsgKyt0YXJnZXQpIHsKKwkJcG9ydCA9IDB4ZjsKKworCQlpZiAodGFyZ2V0IDwgRFNBX01BWF9TV0lUQ0hFUykgeworCQkJcG9ydCA9IGNoaXAtPmRzLT5ydGFibGVbdGFyZ2V0XTsKKwkJCWlmIChwb3J0ID09IERTQV9SVEFCTEVfTk9ORSkKKwkJCQlwb3J0ID0gMHhmOworCQl9CisKKwkJZXJyID0gbXY4OGU2eHh4X2cyX2RldmljZV9tYXBwaW5nX3dyaXRlKGNoaXAsIHRhcmdldCwgcG9ydCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBPZmZzZXQgMHgwNzogVHJ1bmsgTWFzayBUYWJsZSByZWdpc3RlciAqLworCitzdGF0aWMgaW50IG12ODhlNnh4eF9nMl90cnVua19tYXNrX3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IG51bSwKKwkJCQkJIGJvb2wgaGFzaywgdTE2IG1hc2spCit7CisJY29uc3QgdTE2IHBvcnRfbWFzayA9IEJJVChtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApKSAtIDE7CisJdTE2IHZhbCA9IChudW0gPDwgMTIpIHwgKG1hc2sgJiBwb3J0X21hc2spOworCisJaWYgKGhhc2spCisJCXZhbCB8PSBHTE9CQUwyX1RSVU5LX01BU0tfSEFTSzsKKworCXJldHVybiBtdjg4ZTZ4eHhfZzJfdXBkYXRlKGNoaXAsIEdMT0JBTDJfVFJVTktfTUFTSywgdmFsKTsKK30KKworLyogT2Zmc2V0IDB4MDg6IFRydW5rIE1hcHBpbmcgVGFibGUgcmVnaXN0ZXIgKi8KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfdHJ1bmtfbWFwcGluZ193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBpZCwKKwkJCQkJICAgIHUxNiBtYXApCit7CisJY29uc3QgdTE2IHBvcnRfbWFzayA9IEJJVChtdjg4ZTZ4eHhfbnVtX3BvcnRzKGNoaXApKSAtIDE7CisJdTE2IHZhbCA9IChpZCA8PCAxMSkgfCAobWFwICYgcG9ydF9tYXNrKTsKKworCXJldHVybiBtdjg4ZTZ4eHhfZzJfdXBkYXRlKGNoaXAsIEdMT0JBTDJfVFJVTktfTUFQUElORywgdmFsKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfY2xlYXJfdHJ1bmsoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKQoreworCWNvbnN0IHUxNiBwb3J0X21hc2sgPSBCSVQobXY4OGU2eHh4X251bV9wb3J0cyhjaGlwKSkgLSAxOworCWludCBpLCBlcnI7CisKKwkvKiBDbGVhciBhbGwgZWlnaHQgcG9zc2libGUgVHJ1bmsgTWFzayB2ZWN0b3JzICovCisJZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfdHJ1bmtfbWFza193cml0ZShjaGlwLCBpLCBmYWxzZSwgcG9ydF9tYXNrKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogQ2xlYXIgYWxsIHNpeHRlZW4gcG9zc2libGUgVHJ1bmsgSUQgcm91dGluZyB2ZWN0b3JzICovCisJZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cyX3RydW5rX21hcHBpbmdfd3JpdGUoY2hpcCwgaSwgMCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCisvKiBPZmZzZXQgMHgwOTogSW5ncmVzcyBSYXRlIENvbW1hbmQgcmVnaXN0ZXIKKyAqIE9mZnNldCAweDBBOiBJbmdyZXNzIFJhdGUgRGF0YSByZWdpc3RlcgorICovCisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2NsZWFyX2lybChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJaW50IHBvcnQsIGVycjsKKworCS8qIEluaXQgYWxsIEluZ3Jlc3MgUmF0ZSBMaW1pdCByZXNvdXJjZXMgb2YgYWxsIHBvcnRzICovCisJZm9yIChwb3J0ID0gMDsgcG9ydCA8IG12ODhlNnh4eF9udW1fcG9ydHMoY2hpcCk7ICsrcG9ydCkgeworCQkvKiBYWFggbmV3ZXIgY2hpcHMgKGxpa2UgODhFNjM5MCkgaGF2ZSBkaWZmZXJlbnQgMi1iaXQgb3BzICovCisJCWVyciA9IG12ODhlNnh4eF9nMl93cml0ZShjaGlwLCBHTE9CQUwyX0lSTF9DTUQsCisJCQkJCSBHTE9CQUwyX0lSTF9DTURfT1BfSU5JVF9BTEwgfAorCQkJCQkgKHBvcnQgPDwgOCkpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisKKwkJLyogV2FpdCBmb3IgdGhlIG9wZXJhdGlvbiB0byBjb21wbGV0ZSAqLworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfd2FpdChjaGlwLCBHTE9CQUwyX0lSTF9DTUQsCisJCQkJCUdMT0JBTDJfSVJMX0NNRF9CVVNZKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIE9mZnNldCAweDBEOiBTd2l0Y2ggTUFDL1dvTC9Xb0YgcmVnaXN0ZXIgKi8KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfc3dpdGNoX21hY193cml0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkJCSB1bnNpZ25lZCBpbnQgcG9pbnRlciwgdTggZGF0YSkKK3sKKwl1MTYgdmFsID0gKHBvaW50ZXIgPDwgOCkgfCBkYXRhOworCisJcmV0dXJuIG12ODhlNnh4eF9nMl91cGRhdGUoY2hpcCwgR0xPQkFMMl9TV0lUQ0hfTUFDLCB2YWwpOworfQorCitpbnQgbXY4OGU2eHh4X2cyX3NldF9zd2l0Y2hfbWFjKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTggKmFkZHIpCit7CisJaW50IGksIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cyX3N3aXRjaF9tYWNfd3JpdGUoY2hpcCwgaSwgYWRkcltpXSk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBPZmZzZXQgMHgwRjogUHJpb3JpdHkgT3ZlcnJpZGUgVGFibGUgKi8KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfcG90X3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IHBvaW50ZXIsCisJCQkJICB1OCBkYXRhKQoreworCXUxNiB2YWwgPSAocG9pbnRlciA8PCA4KSB8IChkYXRhICYgMHg3KTsKKworCXJldHVybiBtdjg4ZTZ4eHhfZzJfdXBkYXRlKGNoaXAsIEdMT0JBTDJfUFJJT19PVkVSUklERSwgdmFsKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfY2xlYXJfcG90KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlpbnQgaSwgZXJyOworCisJLyogQ2xlYXIgYWxsIHNpeHRlZW4gcG9zc2libGUgUHJpb3JpdHkgT3ZlcnJpZGUgZW50cmllcyAqLworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWVyciA9IG12ODhlNnh4eF9nMl9wb3Rfd3JpdGUoY2hpcCwgaSwgMCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBPZmZzZXQgMHgxNDogRUVQUk9NIENvbW1hbmQKKyAqIE9mZnNldCAweDE1OiBFRVBST00gRGF0YQorICovCisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2VlcHJvbV93YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX3dhaXQoY2hpcCwgR0xPQkFMMl9FRVBST01fQ01ELAorCQkJCSBHTE9CQUwyX0VFUFJPTV9DTURfQlVTWSB8CisJCQkJIEdMT0JBTDJfRUVQUk9NX0NNRF9SVU5OSU5HKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfZWVwcm9tX2NtZChzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIHUxNiBjbWQpCit7CisJaW50IGVycjsKKworCWVyciA9IG12ODhlNnh4eF9nMl93cml0ZShjaGlwLCBHTE9CQUwyX0VFUFJPTV9DTUQsIGNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dhaXQoY2hpcCk7Cit9CisKK3N0YXRpYyBpbnQgbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJCSAgICAgIHU4IGFkZHIsIHUxNiAqZGF0YSkKK3sKKwl1MTYgY21kID0gR0xPQkFMMl9FRVBST01fQ01EX09QX1JFQUQgfCBhZGRyOworCWludCBlcnI7CisKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dhaXQoY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fY21kKGNoaXAsIGNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBtdjg4ZTZ4eHhfZzJfcmVhZChjaGlwLCBHTE9CQUwyX0VFUFJPTV9EQVRBLCBkYXRhKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dyaXRlMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJCSAgICAgICB1OCBhZGRyLCB1MTYgZGF0YSkKK3sKKwl1MTYgY21kID0gR0xPQkFMMl9FRVBST01fQ01EX09QX1dSSVRFIHwgYWRkcjsKKwlpbnQgZXJyOworCisJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV93YWl0KGNoaXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfd3JpdGUoY2hpcCwgR0xPQkFMMl9FRVBST01fREFUQSwgZGF0YSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBtdjg4ZTZ4eHhfZzJfZWVwcm9tX2NtZChjaGlwLCBjbWQpOworfQorCitpbnQgbXY4OGU2eHh4X2cyX2dldF9lZXByb20xNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpCit7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGVlcHJvbS0+b2Zmc2V0OworCXVuc2lnbmVkIGludCBsZW4gPSBlZXByb20tPmxlbjsKKwl1MTYgdmFsOworCWludCBlcnI7CisKKwllZXByb20tPmxlbiA9IDA7CisKKwlpZiAob2Zmc2V0ICYgMSkgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihjaGlwLCBvZmZzZXQgPj4gMSwgJnZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCSpkYXRhKysgPSAodmFsID4+IDgpICYgMHhmZjsKKworCQlvZmZzZXQrKzsKKwkJbGVuLS07CisJCWVlcHJvbS0+bGVuKys7CisJfQorCisJd2hpbGUgKGxlbiA+PSAyKSB7CisJCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fcmVhZDE2KGNoaXAsIG9mZnNldCA+PiAxLCAmdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJKmRhdGErKyA9IHZhbCAmIDB4ZmY7CisJCSpkYXRhKysgPSAodmFsID4+IDgpICYgMHhmZjsKKworCQlvZmZzZXQgKz0gMjsKKwkJbGVuIC09IDI7CisJCWVlcHJvbS0+bGVuICs9IDI7CisJfQorCisJaWYgKGxlbikgeworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3JlYWQxNihjaGlwLCBvZmZzZXQgPj4gMSwgJnZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCSpkYXRhKysgPSB2YWwgJiAweGZmOworCisJCW9mZnNldCsrOworCQlsZW4tLTsKKwkJZWVwcm9tLT5sZW4rKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG12ODhlNnh4eF9nMl9zZXRfZWVwcm9tMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBlZXByb20tPm9mZnNldDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gZWVwcm9tLT5sZW47CisJdTE2IHZhbDsKKwlpbnQgZXJyOworCisJLyogRW5zdXJlIHRoZSBSTyBXcml0ZUVuIGJpdCBpcyBzZXQgKi8KKwllcnIgPSBtdjg4ZTZ4eHhfZzJfcmVhZChjaGlwLCBHTE9CQUwyX0VFUFJPTV9DTUQsICZ2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoISh2YWwgJiBHTE9CQUwyX0VFUFJPTV9DTURfV1JJVEVfRU4pKQorCQlyZXR1cm4gLUVST0ZTOworCisJZWVwcm9tLT5sZW4gPSAwOworCisJaWYgKG9mZnNldCAmIDEpIHsKKwkJZXJyID0gbXY4OGU2eHh4X2cyX2VlcHJvbV9yZWFkMTYoY2hpcCwgb2Zmc2V0ID4+IDEsICZ2YWwpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQl2YWwgPSAoKmRhdGErKyA8PCA4KSB8ICh2YWwgJiAweGZmKTsKKworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dyaXRlMTYoY2hpcCwgb2Zmc2V0ID4+IDEsIHZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCW9mZnNldCsrOworCQlsZW4tLTsKKwkJZWVwcm9tLT5sZW4rKzsKKwl9CisKKwl3aGlsZSAobGVuID49IDIpIHsKKwkJdmFsID0gKmRhdGErKzsKKwkJdmFsIHw9ICpkYXRhKysgPDwgODsKKworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfZWVwcm9tX3dyaXRlMTYoY2hpcCwgb2Zmc2V0ID4+IDEsIHZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCW9mZnNldCArPSAyOworCQlsZW4gLT0gMjsKKwkJZWVwcm9tLT5sZW4gKz0gMjsKKwl9CisKKwlpZiAobGVuKSB7CisJCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fcmVhZDE2KGNoaXAsIG9mZnNldCA+PiAxLCAmdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJdmFsID0gKHZhbCAmIDB4ZmYwMCkgfCAqZGF0YSsrOworCisJCWVyciA9IG12ODhlNnh4eF9nMl9lZXByb21fd3JpdGUxNihjaGlwLCBvZmZzZXQgPj4gMSwgdmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJb2Zmc2V0Kys7CisJCWxlbi0tOworCQllZXByb20tPmxlbisrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBPZmZzZXQgMHgxODogU01JIFBIWSBDb21tYW5kIFJlZ2lzdGVyCisgKiBPZmZzZXQgMHgxOTogU01JIFBIWSBEYXRhIFJlZ2lzdGVyCisgKi8KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfc21pX3BoeV93YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gbXY4OGU2eHh4X2cyX3dhaXQoY2hpcCwgR0xPQkFMMl9TTUlfUEhZX0NNRCwKKwkJCQkgR0xPQkFMMl9TTUlfUEhZX0NNRF9CVVNZKTsKK30KKworc3RhdGljIGludCBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9jbWQoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1MTYgY21kKQoreworCWludCBlcnI7CisKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfd3JpdGUoY2hpcCwgR0xPQkFMMl9TTUlfUEhZX0NNRCwgY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIG12ODhlNnh4eF9nMl9zbWlfcGh5X3dhaXQoY2hpcCk7Cit9CisKK2ludCBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsCisJCQkgICAgICB1MTYgKnZhbCkKK3sKKwl1MTYgY21kID0gR0xPQkFMMl9TTUlfUEhZX0NNRF9PUF8yMl9SRUFEX0RBVEEgfCAoYWRkciA8PCA1KSB8IHJlZzsKKwlpbnQgZXJyOworCisJZXJyID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfd2FpdChjaGlwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbXY4OGU2eHh4X2cyX3NtaV9waHlfY21kKGNoaXAsIGNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBtdjg4ZTZ4eHhfZzJfcmVhZChjaGlwLCBHTE9CQUwyX1NNSV9QSFlfREFUQSwgdmFsKTsKK30KKworaW50IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsCisJCQkgICAgICAgdTE2IHZhbCkKK3sKKwl1MTYgY21kID0gR0xPQkFMMl9TTUlfUEhZX0NNRF9PUF8yMl9XUklURV9EQVRBIHwgKGFkZHIgPDwgNSkgfCByZWc7CisJaW50IGVycjsKKworCWVyciA9IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dhaXQoY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG12ODhlNnh4eF9nMl93cml0ZShjaGlwLCBHTE9CQUwyX1NNSV9QSFlfREFUQSwgdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIG12ODhlNnh4eF9nMl9zbWlfcGh5X2NtZChjaGlwLCBjbWQpOworfQorCitpbnQgbXY4OGU2eHh4X2cyX3NldHVwKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwl1MTYgcmVnOworCWludCBlcnI7CisKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzJYKSkgeworCQkvKiBDb25zaWRlciB0aGUgZnJhbWVzIHdpdGggcmVzZXJ2ZWQgbXVsdGljYXN0IGRlc3RpbmF0aW9uCisJCSAqIGFkZHJlc3NlcyBtYXRjaGluZyAwMTo4MDpjMjowMDowMDoyeCBhcyBNR01ULgorCQkgKi8KKwkJZXJyID0gbXY4OGU2eHh4X2cyX3dyaXRlKGNoaXAsIEdMT0JBTDJfTUdNVF9FTl8yWCwgMHhmZmZmKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWCkpIHsKKwkJLyogQ29uc2lkZXIgdGhlIGZyYW1lcyB3aXRoIHJlc2VydmVkIG11bHRpY2FzdCBkZXN0aW5hdGlvbgorCQkgKiBhZGRyZXNzZXMgbWF0Y2hpbmcgMDE6ODA6YzI6MDA6MDA6MHggYXMgTUdNVC4KKwkJICovCisJCWVyciA9IG12ODhlNnh4eF9nMl93cml0ZShjaGlwLCBHTE9CQUwyX01HTVRfRU5fMFgsIDB4ZmZmZik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCS8qIElnbm9yZSByZW1vdmVkIHRhZyBkYXRhIG9uIGRvdWJseSB0YWdnZWQgcGFja2V0cywgZGlzYWJsZQorCSAqIGZsb3cgY29udHJvbCBtZXNzYWdlcywgZm9yY2UgZmxvdyBjb250cm9sIHByaW9yaXR5IHRvIHRoZQorCSAqIGhpZ2hlc3QsIGFuZCBzZW5kIGFsbCBzcGVjaWFsIG11bHRpY2FzdCBmcmFtZXMgdG8gdGhlIENQVQorCSAqIHBvcnQgYXQgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCisJICovCisJcmVnID0gR0xPQkFMMl9TV0lUQ0hfTUdNVF9GT1JDRV9GTE9XX0NUUkxfUFJJIHwgKDB4NyA8PCA0KTsKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYKSB8fAorCSAgICBtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlgpKQorCQlyZWcgfD0gR0xPQkFMMl9TV0lUQ0hfTUdNVF9SU1ZEMkNQVSB8IDB4NzsKKwllcnIgPSBtdjg4ZTZ4eHhfZzJfd3JpdGUoY2hpcCwgR0xPQkFMMl9TV0lUQ0hfTUdNVCwgcmVnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogUHJvZ3JhbSB0aGUgRFNBIHJvdXRpbmcgdGFibGUuICovCisJZXJyID0gbXY4OGU2eHh4X2cyX3NldF9kZXZpY2VfbWFwcGluZyhjaGlwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogQ2xlYXIgYWxsIHRydW5rIG1hc2tzIGFuZCBtYXBwaW5nLiAqLworCWVyciA9IG12ODhlNnh4eF9nMl9jbGVhcl90cnVuayhjaGlwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKG12ODhlNnh4eF9oYXMoY2hpcCwgTVY4OEU2WFhYX0ZMQUdTX0lSTCkpIHsKKwkJLyogRGlzYWJsZSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgYnkgcmVzZXR0aW5nIGFsbCBwZXIgcG9ydAorCQkgKiBpbmdyZXNzIHJhdGUgbGltaXQgcmVzb3VyY2VzIHRvIHRoZWlyIGluaXRpYWwgc3RhdGUuCisJCSAqLworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfY2xlYXJfaXJsKGNoaXApOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHU19QVlQpKSB7CisJCS8qIEluaXRpYWxpemUgQ3Jvc3MtY2hpcCBQb3J0IFZMQU4gVGFibGUgdG8gcmVzZXQgZGVmYXVsdHMgKi8KKwkJZXJyID0gbXY4OGU2eHh4X2cyX3dyaXRlKGNoaXAsIEdMT0JBTDJfUFZUX0FERFIsCisJCQkJCSBHTE9CQUwyX1BWVF9BRERSX09QX0lOSVRfT05FUyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChtdjg4ZTZ4eHhfaGFzKGNoaXAsIE1WODhFNlhYWF9GTEFHX0cyX1BPVCkpIHsKKwkJLyogQ2xlYXIgdGhlIHByaW9yaXR5IG92ZXJyaWRlIHRhYmxlLiAqLworCQllcnIgPSBtdjg4ZTZ4eHhfZzJfY2xlYXJfcG90KGNoaXApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMi5oIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9nbG9iYWwyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiYjkwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvZ2xvYmFsMi5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBNYXJ2ZWxsIDg4RTZ4eHggU3dpdGNoIEdsb2JhbCAyIFJlZ2lzdGVycyBzdXBwb3J0IChkZXZpY2UgYWRkcmVzcyAweDFDKQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYXJ2ZWxsIFNlbWljb25kdWN0b3IKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVml2aWVuIERpZGVsb3QgPHZpdmllbi5kaWRlbG90QHNhdm9pcmZhaXJlbGludXguY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTVY4OEU2WFhYX0dMT0JBTDJfSAorI2RlZmluZSBfTVY4OEU2WFhYX0dMT0JBTDJfSAorCisjaW5jbHVkZSAibXY4OGU2eHh4LmgiCisKKyNpZmRlZiBDT05GSUdfTkVUX0RTQV9NVjg4RTZYWFhfR0xPQkFMMgorCitzdGF0aWMgaW5saW5lIGludCBtdjg4ZTZ4eHhfZzJfcmVxdWlyZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsCisJCQkgICAgICB1MTYgKnZhbCk7CitpbnQgbXY4OGU2eHh4X2cyX3NtaV9waHlfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywKKwkJCSAgICAgICB1MTYgdmFsKTsKK2ludCBtdjg4ZTZ4eHhfZzJfc2V0X3N3aXRjaF9tYWMoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCB1OCAqYWRkcik7CitpbnQgbXY4OGU2eHh4X2cyX2dldF9lZXByb20xNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpOworaW50IG12ODhlNnh4eF9nMl9zZXRfZWVwcm9tMTYoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKTsKK2ludCBtdjg4ZTZ4eHhfZzJfc2V0dXAoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwKTsKKworI2Vsc2UgLyogIUNPTkZJR19ORVRfRFNBX01WODhFNlhYWF9HTE9CQUwyICovCisKK3N0YXRpYyBpbmxpbmUgaW50IG12ODhlNnh4eF9nMl9yZXF1aXJlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlpZiAobXY4OGU2eHh4X2hhcyhjaGlwLCBNVjg4RTZYWFhfRkxBR19HTE9CQUwyKSkgeworCQlkZXZfZXJyKGNoaXAtPmRldiwgInRoaXMgY2hpcCByZXF1aXJlcyBDT05GSUdfTkVUX0RTQV9NVjg4RTZYWFhfR0xPQkFMMiBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBtdjg4ZTZ4eHhfZzJfc21pX3BoeV9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCQkJICAgIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgKnZhbCkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12ODhlNnh4eF9nMl9zbWlfcGh5X3dyaXRlKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwKKwkJCQkJICAgICBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG12ODhlNnh4eF9nMl9zZXRfc3dpdGNoX21hYyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkJCSAgICAgIHU4ICphZGRyKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXY4OGU2eHh4X2cyX2dldF9lZXByb20xNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwKKwkJCQkJICAgIHU4ICpkYXRhKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXY4OGU2eHh4X2cyX3NldF9lZXByb20xNihzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwKKwkJCQkJICAgIHU4ICpkYXRhKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXY4OGU2eHh4X2cyX3NldHVwKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTkVUX0RTQV9NVjg4RTZYWFhfR0xPQkFMMiAqLworCisjZW5kaWYgLyogX01WODhFNlhYWF9HTE9CQUwyX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvbXY4OGU2eHh4LmggYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4L212ODhlNnh4eC5oCmluZGV4IDQ4ZDZlYTcuLmU1NzIxMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHgvbXY4OGU2eHh4LmgKKysrIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC9tdjg4ZTZ4eHguaApAQCAtMzAsMTEgKzMwLDEzIEBACiAjZGVmaW5lIFNNSV9DTURfT1BfNDVfUkVBRF9EQVRBX0lOQwkoKDMgPDwgMTApIHwgU01JX0NNRF9CVVNZKQogI2RlZmluZSBTTUlfREFUQQkJMHgwMQogCi0vKiBGaWJlci9TRVJERVMgUmVnaXN0ZXJzIGFyZSBsb2NhdGVkIGF0IFNNSSBhZGRyZXNzIEYsIHBhZ2UgMSAqLwotI2RlZmluZSBSRUdfRklCRVJfU0VSREVTCTB4MGYKLSNkZWZpbmUgUEFHRV9GSUJFUl9TRVJERVMJMHgwMQorLyogUEhZIFJlZ2lzdGVycyAqLworI2RlZmluZSBQSFlfUEFHRQkJMHgxNgorI2RlZmluZSBQSFlfUEFHRV9DT1BQRVIJCTB4MDAKIAotI2RlZmluZSBSRUdfUE9SVChwKQkJKDB4MTAgKyAocCkpCisjZGVmaW5lIEFERFJfU0VSREVTCQkweDBmCisjZGVmaW5lIFNFUkRFU19QQUdFX0ZJQkVSCTB4MDEKKwogI2RlZmluZSBQT1JUX1NUQVRVUwkJMHgwMAogI2RlZmluZSBQT1JUX1NUQVRVU19QQVVTRV9FTglCSVQoMTUpCiAjZGVmaW5lIFBPUlRfU1RBVFVTX01ZX1BBVVNFCUJJVCgxNCkKQEAgLTE1Nyw3ICsxNTksNiBAQAogI2RlZmluZSBQT1JUX1RBR19SRUdNQVBfMDEyMwkweDE4CiAjZGVmaW5lIFBPUlRfVEFHX1JFR01BUF80NTY3CTB4MTkKIAotI2RlZmluZSBSRUdfR0xPQkFMCQkweDFiCiAjZGVmaW5lIEdMT0JBTF9TVEFUVVMJCTB4MDAKICNkZWZpbmUgR0xPQkFMX1NUQVRVU19QUFVfU1RBVEUgQklUKDE1KSAvKiA2MzUxIGFuZCA2MTcxICovCiAvKiBUd28gYml0cyBmb3IgNjE2NSwgNjE4NSBldGMgKi8KQEAgLTE2OSw4ICsxNzAsOCBAQAogI2RlZmluZSBHTE9CQUxfTUFDXzAxCQkweDAxCiAjZGVmaW5lIEdMT0JBTF9NQUNfMjMJCTB4MDIKICNkZWZpbmUgR0xPQkFMX01BQ180NQkJMHgwMwotI2RlZmluZSBHTE9CQUxfQVRVX0ZJRAkJMHgwMQkvKiA2MDk3IDYxNjUgNjM1MSA2MzUyICovCi0jZGVmaW5lIEdMT0JBTF9WVFVfRklECQkweDAyCS8qIDYwOTcgNjE2NSA2MzUxIDYzNTIgKi8KKyNkZWZpbmUgR0xPQkFMX0FUVV9GSUQJCTB4MDEKKyNkZWZpbmUgR0xPQkFMX1ZUVV9GSUQJCTB4MDIKICNkZWZpbmUgR0xPQkFMX1ZUVV9GSURfTUFTSwkweGZmZgogI2RlZmluZSBHTE9CQUxfVlRVX1NJRAkJMHgwMwkvKiA2MDk3IDYxNjUgNjM1MSA2MzUyICovCiAjZGVmaW5lIEdMT0JBTF9WVFVfU0lEX01BU0sJMHgzZgpAQCAtMjc1LDcgKzI3Niw2IEBACiAjZGVmaW5lIEdMT0JBTF9TVEFUU19DT1VOVEVSXzMyCTB4MWUKICNkZWZpbmUgR0xPQkFMX1NUQVRTX0NPVU5URVJfMDEJMHgxZgogCi0jZGVmaW5lIFJFR19HTE9CQUwyCQkweDFjCiAjZGVmaW5lIEdMT0JBTDJfSU5UX1NPVVJDRQkweDAwCiAjZGVmaW5lIEdMT0JBTDJfSU5UX01BU0sJMHgwMQogI2RlZmluZSBHTE9CQUwyX01HTVRfRU5fMlgJMHgwMgpAQCAtMzI5LDE3ICszMjksMTYgQEAKICNkZWZpbmUgR0xPQkFMMl9FRVBST01fREFUQQkweDE1CiAjZGVmaW5lIEdMT0JBTDJfUFRQX0FWQl9PUAkweDE2CiAjZGVmaW5lIEdMT0JBTDJfUFRQX0FWQl9EQVRBCTB4MTcKLSNkZWZpbmUgR0xPQkFMMl9TTUlfT1AJCTB4MTgKLSNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfQlVTWQkJQklUKDE1KQotI2RlZmluZSBHTE9CQUwyX1NNSV9PUF9DTEFVU0VfMjIJQklUKDEyKQotI2RlZmluZSBHTE9CQUwyX1NNSV9PUF8yMl9XUklURQkJKCgxIDw8IDEwKSB8IEdMT0JBTDJfU01JX09QX0JVU1kgfCBcCi0JCQkJCSBHTE9CQUwyX1NNSV9PUF9DTEFVU0VfMjIpCi0jZGVmaW5lIEdMT0JBTDJfU01JX09QXzIyX1JFQUQJCSgoMiA8PCAxMCkgfCBHTE9CQUwyX1NNSV9PUF9CVVNZIHwgXAotCQkJCQkgR0xPQkFMMl9TTUlfT1BfQ0xBVVNFXzIyKQotI2RlZmluZSBHTE9CQUwyX1NNSV9PUF80NV9XUklURV9BRERSCSgoMCA8PCAxMCkgfCBHTE9CQUwyX1NNSV9PUF9CVVNZKQotI2RlZmluZSBHTE9CQUwyX1NNSV9PUF80NV9XUklURV9EQVRBCSgoMSA8PCAxMCkgfCBHTE9CQUwyX1NNSV9PUF9CVVNZKQotI2RlZmluZSBHTE9CQUwyX1NNSV9PUF80NV9SRUFEX0RBVEEJKCgyIDw8IDEwKSB8IEdMT0JBTDJfU01JX09QX0JVU1kpCi0jZGVmaW5lIEdMT0JBTDJfU01JX0RBVEEJMHgxOQorI2RlZmluZSBHTE9CQUwyX1NNSV9QSFlfQ01ECQkJMHgxOAorI2RlZmluZSBHTE9CQUwyX1NNSV9QSFlfQ01EX0JVU1kJCUJJVCgxNSkKKyNkZWZpbmUgR0xPQkFMMl9TTUlfUEhZX0NNRF9NT0RFXzIyCQlCSVQoMTIpCisjZGVmaW5lIEdMT0JBTDJfU01JX1BIWV9DTURfT1BfMjJfV1JJVEVfREFUQQkoKDB4MSA8PCAxMCkgfCBcCisJCQkJCQkgR0xPQkFMMl9TTUlfUEhZX0NNRF9NT0RFXzIyIHwgXAorCQkJCQkJIEdMT0JBTDJfU01JX1BIWV9DTURfQlVTWSkKKyNkZWZpbmUgR0xPQkFMMl9TTUlfUEhZX0NNRF9PUF8yMl9SRUFEX0RBVEEJKCgweDIgPDwgMTApIHwgXAorCQkJCQkJIEdMT0JBTDJfU01JX1BIWV9DTURfTU9ERV8yMiB8IFwKKwkJCQkJCSBHTE9CQUwyX1NNSV9QSFlfQ01EX0JVU1kpCisjZGVmaW5lIEdMT0JBTDJfU01JX1BIWV9EQVRBCQkJMHgxOQogI2RlZmluZSBHTE9CQUwyX1NDUkFUQ0hfTUlTQwkweDFhCiAjZGVmaW5lIEdMT0JBTDJfU0NSQVRDSF9CVVNZCQlCSVQoMTUpCiAjZGVmaW5lIEdMT0JBTDJfU0NSQVRDSF9SRUdJU1RFUl9TSElGVAk4CkBAIC0zODQsMTAgKzM4MywzNiBAQAogfTsKIAogZW51bSBtdjg4ZTZ4eHhfY2FwIHsKKwkvKiBUd28gZGlmZmVyZW50IHRhZyBwcm90b2NvbHMgY2FuIGJlIHVzZWQgYnkgdGhlIGRyaXZlci4gQWxsCisJICogc3dpdGNoZXMgc3VwcG9ydCBEU0EsIGJ1dCBvbmx5IGxhdGVyIGdlbmVyYXRpb25zIHN1cHBvcnQKKwkgKiBFRFNBLgorCSAqLworCU1WODhFNlhYWF9DQVBfRURTQSwKKwogCS8qIEVuZXJneSBFZmZpY2llbnQgRXRoZXJuZXQuCiAJICovCiAJTVY4OEU2WFhYX0NBUF9FRUUsCiAKKwkvKiBNdWx0aS1jaGlwIEFkZHJlc3NpbmcgTW9kZS4KKwkgKiBTb21lIGNoaXBzIHJlc3BvbmQgdG8gb25seSAyIHJlZ2lzdGVycyBvZiBpdHMgb3duIFNNSSBkZXZpY2UgYWRkcmVzcworCSAqIHdoZW4gaXQgaXMgbm9uLXplcm8sIGFuZCB1c2UgaW5kaXJlY3QgYWNjZXNzIHRvIGludGVybmFsIHJlZ2lzdGVycy4KKwkgKi8KKwlNVjg4RTZYWFhfQ0FQX1NNSV9DTUQsCQkvKiAoMHgwMCkgU01JIENvbW1hbmQgKi8KKwlNVjg4RTZYWFhfQ0FQX1NNSV9EQVRBLAkJLyogKDB4MDEpIFNNSSBEYXRhICovCisKKwkvKiBQSFkgUmVnaXN0ZXJzLgorCSAqLworCU1WODhFNlhYWF9DQVBfUEhZX1BBR0UsCQkvKiAoMHgxNikgUGFnZSBSZWdpc3RlciAqLworCisJLyogRmliZXIvU0VSREVTIFJlZ2lzdGVycyAoU01JIGFkZHJlc3MgRikuCisJICovCisJTVY4OEU2WFhYX0NBUF9TRVJERVMsCisKKwkvKiBTd2l0Y2ggR2xvYmFsICgxKSBSZWdpc3RlcnMuCisJICovCisJTVY4OEU2WFhYX0NBUF9HMV9BVFVfRklELAkvKiAoMHgwMSkgQVRVIEZJRCBSZWdpc3RlciAqLworCU1WODhFNlhYWF9DQVBfRzFfVlRVX0ZJRCwJLyogKDB4MDIpIFZUVSBGSUQgUmVnaXN0ZXIgKi8KKwogCS8qIFN3aXRjaCBHbG9iYWwgMiBSZWdpc3RlcnMuCiAJICogVGhlIGRldmljZSBjb250YWlucyBhIHNlY29uZCBzZXQgb2YgZ2xvYmFsIDE2LWJpdCByZWdpc3RlcnMuCiAJICovCkBAIC0zOTgsMTYgKzQyMyw3IEBACiAJTVY4OEU2WFhYX0NBUF9HMl9JUkxfREFUQSwJLyogKDB4MGEpIEluZ3Jlc3MgUmF0ZSBEYXRhICovCiAJTVY4OEU2WFhYX0NBUF9HMl9QVlRfQUREUiwJLyogKDB4MGIpIENyb3NzIENoaXAgUG9ydCBWTEFOIEFkZHIgKi8KIAlNVjg4RTZYWFhfQ0FQX0cyX1BWVF9EQVRBLAkvKiAoMHgwYykgQ3Jvc3MgQ2hpcCBQb3J0IFZMQU4gRGF0YSAqLwotCU1WODhFNlhYWF9DQVBfRzJfU1dJVENIX01BQywJLyogKDB4MGQpIFN3aXRjaCBNQUMvV29ML1dvRiAqLwogCU1WODhFNlhYWF9DQVBfRzJfUE9ULAkJLyogKDB4MGYpIFByaW9yaXR5IE92ZXJyaWRlIFRhYmxlICovCi0JTVY4OEU2WFhYX0NBUF9HMl9FRVBST01fQ01ELAkvKiAoMHgxNCkgRUVQUk9NIENvbW1hbmQgKi8KLQlNVjg4RTZYWFhfQ0FQX0cyX0VFUFJPTV9EQVRBLAkvKiAoMHgxNSkgRUVQUk9NIERhdGEgKi8KLQotCS8qIE11bHRpLWNoaXAgQWRkcmVzc2luZyBNb2RlLgotCSAqIFNvbWUgY2hpcHMgcmVxdWlyZSBhbiBpbmRpcmVjdCBTTUkgYWNjZXNzIHdoZW4gdGhlaXIgU01JIGRldmljZQotCSAqIGFkZHJlc3MgaXMgbm90IHplcm8uIFNlZSBTTUlfQ01EIGFuZCBTTUlfREFUQS4KLQkgKi8KLQlNVjg4RTZYWFhfQ0FQX01VTFRJX0NISVAsCiAKIAkvKiBQSFkgUG9sbGluZyBVbml0LgogCSAqIFNlZSBHTE9CQUxfQ09OVFJPTF9QUFVfRU5BQkxFIGFuZCBHTE9CQUxfU1RBVFVTX1BQVV9QT0xMSU5HLgpAQCAtNDE1LDEyICs0MzEsNiBAQAogCU1WODhFNlhYWF9DQVBfUFBVLAogCU1WODhFNlhYWF9DQVBfUFBVX0FDVElWRSwKIAotCS8qIFNNSSBQSFkgQ29tbWFuZCBhbmQgRGF0YSByZWdpc3RlcnMuCi0JICogVGhpcyByZXF1aXJlcyBhbiBpbmRpcmVjdCBhY2Nlc3MgdG8gUEhZIHJlZ2lzdGVycyB0aHJvdWdoCi0JICogR0xPQkFMMl9TTUlfT1AsIG90aGVyd2lzZSBkaXJlY3QgYWNjZXNzIHRvIFBIWSByZWdpc3RlcnMgaXMgZG9uZS4KLQkgKi8KLQlNVjg4RTZYWFhfQ0FQX1NNSV9QSFksCi0KIAkvKiBQZXIgVkxBTiBTcGFubmluZyBUcmVlIFVuaXQgKFNUVSkuCiAJICogVGhlIFBvcnQgU3RhdGUgZGF0YWJhc2UsIGlmIHByZXNlbnQsIGlzIGFjY2Vzc2VkIHRocm91Z2ggVlRVCiAJICogb3BlcmF0aW9ucyBhbmQgZGVkaWNhdGVkIFNJRCByZWdpc3RlcnMuIFNlZSBHTE9CQUxfVlRVX1NJRC4KQEAgLTQ0MCwxMzAgKzQ1MCwxNDggQEAKIH07CiAKIC8qIEJpdG1hc2sgb2YgY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0VFRQkJQklUKE1WODhFNlhYWF9DQVBfRUVFKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HTE9CQUwyCQlCSVQoTVY4OEU2WFhYX0NBUF9HTE9CQUwyKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzJYCUJJVChNVjg4RTZYWFhfQ0FQX0cyX01HTVRfRU5fMlgpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFgJQklUKE1WODhFNlhYWF9DQVBfRzJfTUdNVF9FTl8wWCkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfSVJMX0NNRAlCSVQoTVY4OEU2WFhYX0NBUF9HMl9JUkxfQ01EKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9JUkxfREFUQQlCSVQoTVY4OEU2WFhYX0NBUF9HMl9JUkxfREFUQSkKLSNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfUFZUX0FERFIJQklUKE1WODhFNlhYWF9DQVBfRzJfUFZUX0FERFIpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX1BWVF9EQVRBCUJJVChNVjg4RTZYWFhfQ0FQX0cyX1BWVF9EQVRBKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9TV0lUQ0hfTUFDCUJJVChNVjg4RTZYWFhfQ0FQX0cyX1NXSVRDSF9NQUMpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX1BPVAkJQklUKE1WODhFNlhYWF9DQVBfRzJfUE9UKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9FRVBST01fQ01ECUJJVChNVjg4RTZYWFhfQ0FQX0cyX0VFUFJPTV9DTUQpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX0VFUFJPTV9EQVRBCUJJVChNVjg4RTZYWFhfQ0FQX0cyX0VFUFJPTV9EQVRBKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19NVUxUSV9DSElQCUJJVChNVjg4RTZYWFhfQ0FQX01VTFRJX0NISVApCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX1BQVQkJQklUKE1WODhFNlhYWF9DQVBfUFBVKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19QUFVfQUNUSVZFCUJJVChNVjg4RTZYWFhfQ0FQX1BQVV9BQ1RJVkUpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX1NNSV9QSFkJCUJJVChNVjg4RTZYWFhfQ0FQX1NNSV9QSFkpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX1NUVQkJQklUKE1WODhFNlhYWF9DQVBfU1RVKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19URU1QCQlCSVQoTVY4OEU2WFhYX0NBUF9URU1QKQotI2RlZmluZSBNVjg4RTZYWFhfRkxBR19URU1QX0xJTUlUCUJJVChNVjg4RTZYWFhfQ0FQX1RFTVBfTElNSVQpCi0jZGVmaW5lIE1WODhFNlhYWF9GTEFHX1ZUVQkJQklUKE1WODhFNlhYWF9DQVBfVlRVKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19FRFNBCQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfRURTQSkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRUVFCQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfRUVFKQogCi0vKiBFRVBST00gUHJvZ3JhbW1pbmcgdmlhIEdsb2JhbDIgd2l0aCAxNi1iaXQgZGF0YSAqLwotI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfRUVQUk9NMTYJXAotCShNVjg4RTZYWFhfRkxBR19HMl9FRVBST01fQ01EIHwJXAotCSBNVjg4RTZYWFhfRkxBR19HMl9FRVBST01fREFUQSkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfU01JX0NNRAkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX1NNSV9DTUQpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX1NNSV9EQVRBCQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfU01JX0RBVEEpCisKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfUEhZX1BBR0UJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9QSFlfUEFHRSkKKworI2RlZmluZSBNVjg4RTZYWFhfRkxBR19TRVJERVMJCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9TRVJERVMpCisKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzFfQVRVX0ZJRAlCSVRfVUxMKE1WODhFNlhYWF9DQVBfRzFfQVRVX0ZJRCkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzFfVlRVX0ZJRAlCSVRfVUxMKE1WODhFNlhYWF9DQVBfRzFfVlRVX0ZJRCkKKworI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HTE9CQUwyCQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfR0xPQkFMMikKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8yWAlCSVRfVUxMKE1WODhFNlhYWF9DQVBfRzJfTUdNVF9FTl8yWCkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWAlCSVRfVUxMKE1WODhFNlhYWF9DQVBfRzJfTUdNVF9FTl8wWCkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfSVJMX0NNRAlCSVRfVUxMKE1WODhFNlhYWF9DQVBfRzJfSVJMX0NNRCkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfSVJMX0RBVEEJQklUX1VMTChNVjg4RTZYWFhfQ0FQX0cyX0lSTF9EQVRBKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19HMl9QVlRfQUREUglCSVRfVUxMKE1WODhFNlhYWF9DQVBfRzJfUFZUX0FERFIpCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX0cyX1BWVF9EQVRBCUJJVF9VTEwoTVY4OEU2WFhYX0NBUF9HMl9QVlRfREFUQSkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfRzJfUE9UCQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfRzJfUE9UKQorCisjZGVmaW5lIE1WODhFNlhYWF9GTEFHX1BQVQkJQklUX1VMTChNVjg4RTZYWFhfQ0FQX1BQVSkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfUFBVX0FDVElWRQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfUFBVX0FDVElWRSkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfU1RVCQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfU1RVKQorI2RlZmluZSBNVjg4RTZYWFhfRkxBR19URU1QCQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfVEVNUCkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfVEVNUF9MSU1JVAlCSVRfVUxMKE1WODhFNlhYWF9DQVBfVEVNUF9MSU1JVCkKKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdfVlRVCQlCSVRfVUxMKE1WODhFNlhYWF9DQVBfVlRVKQogCiAvKiBJbmdyZXNzIFJhdGUgTGltaXQgdW5pdCAqLwogI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfSVJMCQlcCiAJKE1WODhFNlhYWF9GTEFHX0cyX0lSTF9DTUQgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX0lSTF9EQVRBKQogCisvKiBNdWx0aS1jaGlwIEFkZHJlc3NpbmcgTW9kZSAqLworI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfTVVMVElfQ0hJUAlcCisJKE1WODhFNlhYWF9GTEFHX1NNSV9DTUQgfAlcCisJIE1WODhFNlhYWF9GTEFHX1NNSV9EQVRBKQorCiAvKiBDcm9zcy1jaGlwIFBvcnQgVkxBTiBUYWJsZSAqLwogI2RlZmluZSBNVjg4RTZYWFhfRkxBR1NfUFZUCQlcCiAJKE1WODhFNlhYWF9GTEFHX0cyX1BWVF9BRERSIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9QVlRfREFUQSkKIAorLyogRmliZXIvU0VSREVTIFJlZ2lzdGVycyBhdCBTTUkgYWRkcmVzcyBGLCBwYWdlIDEgKi8KKyNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX1NFUkRFUwkJXAorCShNVjg4RTZYWFhfRkxBR19QSFlfUEFHRSB8CVwKKwkgTVY4OEU2WFhYX0ZMQUdfU0VSREVTKQorCiAjZGVmaW5lIE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjA5NQlcCiAJKE1WODhFNlhYWF9GTEFHX0dMT0JBTDIgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFggfAlcCi0JIE1WODhFNlhYWF9GTEFHX01VTFRJX0NISVAgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1BQVSB8CQlcCi0JIE1WODhFNlhYWF9GTEFHX1ZUVSkKKwkgTVY4OEU2WFhYX0ZMQUdfVlRVIHwJCVwKKwkgTVY4OEU2WFhYX0ZMQUdTX01VTFRJX0NISVApCiAKICNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MDk3CVwKLQkoTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMiB8CVwKKwkoTVY4OEU2WFhYX0ZMQUdfRzFfQVRVX0ZJRCB8CVwKKwkgTVY4OEU2WFhYX0ZMQUdfRzFfVlRVX0ZJRCB8CVwKKwkgTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMiB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8yWCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfUE9UIHwJXAotCSBNVjg4RTZYWFhfRkxBR19NVUxUSV9DSElQIHwJXAogCSBNVjg4RTZYWFhfRkxBR19QUFUgfAkJXAogCSBNVjg4RTZYWFhfRkxBR19TVFUgfAkJXAogCSBNVjg4RTZYWFhfRkxBR19WVFUgfAkJXAogCSBNVjg4RTZYWFhfRkxBR1NfSVJMIHwJCVwKKwkgTVY4OEU2WFhYX0ZMQUdTX01VTFRJX0NISVAgfAlcCiAJIE1WODhFNlhYWF9GTEFHU19QVlQpCiAKICNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MTY1CVwKLQkoTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMiB8CVwKKwkoTVY4OEU2WFhYX0ZMQUdfRzFfQVRVX0ZJRCB8CVwKKwkgTVY4OEU2WFhYX0ZMQUdfRzFfVlRVX0ZJRCB8CVwKKwkgTVY4OEU2WFhYX0ZMQUdfR0xPQkFMMiB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8yWCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfTUdNVF9FTl8wWCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfRzJfU1dJVENIX01BQyB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfRzJfUE9UIHwJXAotCSBNVjg4RTZYWFhfRkxBR19NVUxUSV9DSElQIHwJXAogCSBNVjg4RTZYWFhfRkxBR19TVFUgfAkJXAogCSBNVjg4RTZYWFhfRkxBR19URU1QIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdfVlRVIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdTX0lSTCB8CQlcCisJIE1WODhFNlhYWF9GTEFHU19NVUxUSV9DSElQIHwJXAogCSBNVjg4RTZYWFhfRkxBR1NfUFZUKQogCiAjZGVmaW5lIE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjE4NQlcCiAJKE1WODhFNlhYWF9GTEFHX0dMT0JBTDIgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFggfAlcCi0JIE1WODhFNlhYWF9GTEFHX01VTFRJX0NISVAgfAlcCisJIE1WODhFNlhYWF9GTEFHU19NVUxUSV9DSElQIHwJXAogCSBNVjg4RTZYWFhfRkxBR19QUFUgfAkJXAogCSBNVjg4RTZYWFhfRkxBR19WVFUpCiAKICNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzIwCVwKLQkoTVY4OEU2WFhYX0ZMQUdfRUVFIHwJCVwKKwkoTVY4OEU2WFhYX0ZMQUdfRURTQSB8CQlcCisJIE1WODhFNlhYWF9GTEFHX0VFRSB8CQlcCiAJIE1WODhFNlhYWF9GTEFHX0dMT0JBTDIgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlggfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFggfAlcCi0JIE1WODhFNlhYWF9GTEFHX0cyX1NXSVRDSF9NQUMgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX1BPVCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfTVVMVElfQ0hJUCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfUFBVX0FDVElWRSB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfU01JX1BIWSB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfVEVNUCB8CQlcCiAJIE1WODhFNlhYWF9GTEFHX1RFTVBfTElNSVQgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1ZUVSB8CQlcCi0JIE1WODhFNlhYWF9GTEFHU19FRVBST00xNiB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdTX0lSTCB8CQlcCisJIE1WODhFNlhYWF9GTEFHU19NVUxUSV9DSElQIHwJXAogCSBNVjg4RTZYWFhfRkxBR1NfUFZUKQogCiAjZGVmaW5lIE1WODhFNlhYWF9GTEFHU19GQU1JTFlfNjM1MQlcCi0JKE1WODhFNlhYWF9GTEFHX0dMT0JBTDIgfAlcCisJKE1WODhFNlhYWF9GTEFHX0VEU0EgfAkJXAorCSBNVjg4RTZYWFhfRkxBR19HMV9BVFVfRklEIHwJXAorCSBNVjg4RTZYWFhfRkxBR19HMV9WVFVfRklEIHwJXAorCSBNVjg4RTZYWFhfRkxBR19HTE9CQUwyIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzJYIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9NR01UX0VOXzBYIHwJXAotCSBNVjg4RTZYWFhfRkxBR19HMl9TV0lUQ0hfTUFDIHwJXAogCSBNVjg4RTZYWFhfRkxBR19HMl9QT1QgfAlcCi0JIE1WODhFNlhYWF9GTEFHX01VTFRJX0NISVAgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1BQVV9BQ1RJVkUgfAlcCi0JIE1WODhFNlhYWF9GTEFHX1NNSV9QSFkgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1NUVSB8CQlcCiAJIE1WODhFNlhYWF9GTEFHX1RFTVAgfAkJXAogCSBNVjg4RTZYWFhfRkxBR19WVFUgfAkJXAogCSBNVjg4RTZYWFhfRkxBR1NfSVJMIHwJCVwKKwkgTVY4OEU2WFhYX0ZMQUdTX01VTFRJX0NISVAgfAlcCiAJIE1WODhFNlhYWF9GTEFHU19QVlQpCiAKICNkZWZpbmUgTVY4OEU2WFhYX0ZMQUdTX0ZBTUlMWV82MzUyCVwKLQkoTVY4OEU2WFhYX0ZMQUdfRUVFIHwJCVwKKwkoTVY4OEU2WFhYX0ZMQUdfRURTQSB8CQlcCisJIE1WODhFNlhYWF9GTEFHX0VFRSB8CQlcCisJIE1WODhFNlhYWF9GTEFHX0cxX0FUVV9GSUQgfAlcCisJIE1WODhFNlhYWF9GTEFHX0cxX1ZUVV9GSUQgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0dMT0JBTDIgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMlggfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX01HTVRfRU5fMFggfAlcCi0JIE1WODhFNlhYWF9GTEFHX0cyX1NXSVRDSF9NQUMgfAlcCiAJIE1WODhFNlhYWF9GTEFHX0cyX1BPVCB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfTVVMVElfQ0hJUCB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfUFBVX0FDVElWRSB8CVwKLQkgTVY4OEU2WFhYX0ZMQUdfU01JX1BIWSB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdfU1RVIHwJCVwKIAkgTVY4OEU2WFhYX0ZMQUdfVEVNUCB8CQlcCiAJIE1WODhFNlhYWF9GTEFHX1RFTVBfTElNSVQgfAlcCiAJIE1WODhFNlhYWF9GTEFHX1ZUVSB8CQlcCi0JIE1WODhFNlhYWF9GTEFHU19FRVBST00xNiB8CVwKIAkgTVY4OEU2WFhYX0ZMQUdTX0lSTCB8CQlcCi0JIE1WODhFNlhYWF9GTEFHU19QVlQpCisJIE1WODhFNlhYWF9GTEFHU19NVUxUSV9DSElQIHwJXAorCSBNVjg4RTZYWFhfRkxBR1NfUFZUIHwJCVwKKwkgTVY4OEU2WFhYX0ZMQUdTX1NFUkRFUykKKworc3RydWN0IG12ODhlNnh4eF9vcHM7CiAKIHN0cnVjdCBtdjg4ZTZ4eHhfaW5mbyB7CiAJZW51bSBtdjg4ZTZ4eHhfZmFtaWx5IGZhbWlseTsKQEAgLTU3Miw4ICs2MDAsMTAgQEAKIAl1bnNpZ25lZCBpbnQgbnVtX2RhdGFiYXNlczsKIAl1bnNpZ25lZCBpbnQgbnVtX3BvcnRzOwogCXVuc2lnbmVkIGludCBwb3J0X2Jhc2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgZ2xvYmFsMV9hZGRyOwogCXVuc2lnbmVkIGludCBhZ2VfdGltZV9jb2VmZjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbG9uZyBmbGFnczsKKwljb25zdCBzdHJ1Y3QgbXY4OGU2eHh4X29wcyAqb3BzOwogfTsKIAogc3RydWN0IG12ODhlNnh4eF9hdHVfZW50cnkgewpAQCAtNTg0LDE4ICs2MTQsMTUgQEAKIAl1OAltYWNbRVRIX0FMRU5dOwogfTsKIAotc3RydWN0IG12ODhlNnh4eF92dHVfc3R1X2VudHJ5IHsKLQkvKiBWVFUgb25seSAqLworc3RydWN0IG12ODhlNnh4eF92dHVfZW50cnkgewogCXUxNgl2aWQ7CiAJdTE2CWZpZDsKLQotCS8qIFZUVSBhbmQgU1RVICovCiAJdTgJc2lkOwogCWJvb2wJdmFsaWQ7CiAJdTgJZGF0YVtEU0FfTUFYX1BPUlRTXTsKIH07CiAKLXN0cnVjdCBtdjg4ZTZ4eHhfb3BzOworc3RydWN0IG12ODhlNnh4eF9idXNfb3BzOwogCiBzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfcG9ydCB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmJyaWRnZV9kZXY7CkBAIC02MTYsMTMgKzY0MywxNCBAQAogCS8qIFRoZSBNSUkgYnVzIGFuZCB0aGUgYWRkcmVzcyBvbiB0aGUgYnVzIHRoYXQgaXMgdXNlZCB0bwogCSAqIGNvbW11bmljYXRpb24gd2l0aCB0aGUgc3dpdGNoCiAJICovCi0JY29uc3Qgc3RydWN0IG12ODhlNnh4eF9vcHMgKnNtaV9vcHM7CisJY29uc3Qgc3RydWN0IG12ODhlNnh4eF9idXNfb3BzICpzbWlfb3BzOwogCXN0cnVjdCBtaWlfYnVzICpidXM7CiAJaW50IHN3X2FkZHI7CiAKIAkvKiBIYW5kbGVzIGF1dG9tYXRpYyBkaXNhYmxpbmcgYW5kIHJlLWVuYWJsaW5nIG9mIHRoZSBQSFkKIAkgKiBwb2xsaW5nIHVuaXQuCiAJICovCisJY29uc3Qgc3RydWN0IG12ODhlNnh4eF9idXNfb3BzICpwaHlfb3BzOwogCXN0cnVjdCBtdXRleAkJcHB1X211dGV4OwogCWludAkJCXBwdV9kaXNhYmxlZDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcHB1X3dvcms7CkBAIC02NTEsMTEgKzY3OSwyNSBAQAogCXN0cnVjdCBtaWlfYnVzICptZGlvX2J1czsKIH07CiAKLXN0cnVjdCBtdjg4ZTZ4eHhfb3BzIHsKK3N0cnVjdCBtdjg4ZTZ4eHhfYnVzX29wcyB7CiAJaW50ICgqcmVhZCkoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywgdTE2ICp2YWwpOwogCWludCAoKndyaXRlKShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLCB1MTYgdmFsKTsKIH07CiAKK3N0cnVjdCBtdjg4ZTZ4eHhfb3BzIHsKKwlpbnQgKCpnZXRfZWVwcm9tKShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsCisJCQkgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSk7CisJaW50ICgqc2V0X2VlcHJvbSkoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLAorCQkJICBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwgdTggKmRhdGEpOworCisJaW50ICgqc2V0X3N3aXRjaF9tYWMpKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgdTggKmFkZHIpOworCisJaW50ICgqcGh5X3JlYWQpKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsCisJCQl1MTYgKnZhbCk7CisJaW50ICgqcGh5X3dyaXRlKShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLAorCQkJIHUxNiB2YWwpOworfTsKKwogZW51bSBzdGF0X3R5cGUgewogCUJBTkswLAogCUJBTksxLApAQCAtNjc1LDQgKzcxNywyMCBAQAogCXJldHVybiAoY2hpcC0+aW5mby0+ZmxhZ3MgJiBmbGFncykgPT0gZmxhZ3M7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG12ODhlNnh4eF9udW1fZGF0YWJhc2VzKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gY2hpcC0+aW5mby0+bnVtX2RhdGFiYXNlczsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbXY4OGU2eHh4X251bV9wb3J0cyhzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXApCit7CisJcmV0dXJuIGNoaXAtPmluZm8tPm51bV9wb3J0czsKK30KKworaW50IG12ODhlNnh4eF9yZWFkKHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsIHUxNiAqdmFsKTsKK2ludCBtdjg4ZTZ4eHhfd3JpdGUoc3RydWN0IG12ODhlNnh4eF9jaGlwICpjaGlwLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCk7CitpbnQgbXY4OGU2eHh4X3VwZGF0ZShzdHJ1Y3QgbXY4OGU2eHh4X2NoaXAgKmNoaXAsIGludCBhZGRyLCBpbnQgcmVnLAorCQkgICAgIHUxNiB1cGRhdGUpOworaW50IG12ODhlNnh4eF93YWl0KHN0cnVjdCBtdjg4ZTZ4eHhfY2hpcCAqY2hpcCwgaW50IGFkZHIsIGludCByZWcsIHUxNiBtYXNrKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvcWNhOGsuYyBiL2RyaXZlcnMvbmV0L2RzYS9xY2E4ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZGY3MGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kc2EvcWNhOGsuYwpAQCAtMCwwICsxLDEwNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRmVsaXggRmlldGthdSA8bmJkQG5iZC5uYW1lPgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgR2Fib3IgSnVob3MgPGp1aG9zZ0BvcGVud3J0Lm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgSm9obiBDcmlzcGluIDxqb2huQHBocm96ZW4ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPG5ldC9kc2EuaD4KKyNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tZGlvLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKworI2luY2x1ZGUgInFjYThrLmgiCisKKyNkZWZpbmUgTUlCX0RFU0MoX3MsIF9vLCBfbikJXAorCXsJCQlcCisJCS5zaXplID0gKF9zKSwJXAorCQkub2Zmc2V0ID0gKF9vKSwJXAorCQkubmFtZSA9IChfbiksCVwKKwl9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcWNhOGtfbWliX2Rlc2MgYXI4MzI3X21pYltdID0geworCU1JQl9ERVNDKDEsIDB4MDAsICJSeEJyb2FkIiksCisJTUlCX0RFU0MoMSwgMHgwNCwgIlJ4UGF1c2UiKSwKKwlNSUJfREVTQygxLCAweDA4LCAiUnhNdWx0aSIpLAorCU1JQl9ERVNDKDEsIDB4MGMsICJSeEZjc0VyciIpLAorCU1JQl9ERVNDKDEsIDB4MTAsICJSeEFsaWduRXJyIiksCisJTUlCX0RFU0MoMSwgMHgxNCwgIlJ4UnVudCIpLAorCU1JQl9ERVNDKDEsIDB4MTgsICJSeEZyYWdtZW50IiksCisJTUlCX0RFU0MoMSwgMHgxYywgIlJ4NjRCeXRlIiksCisJTUlCX0RFU0MoMSwgMHgyMCwgIlJ4MTI4Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4MjQsICJSeDI1NkJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDI4LCAiUng1MTJCeXRlIiksCisJTUlCX0RFU0MoMSwgMHgyYywgIlJ4MTAyNEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDMwLCAiUngxNTE4Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4MzQsICJSeE1heEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDM4LCAiUnhUb29Mb25nIiksCisJTUlCX0RFU0MoMiwgMHgzYywgIlJ4R29vZEJ5dGUiKSwKKwlNSUJfREVTQygyLCAweDQ0LCAiUnhCYWRCeXRlIiksCisJTUlCX0RFU0MoMSwgMHg0YywgIlJ4T3ZlckZsb3ciKSwKKwlNSUJfREVTQygxLCAweDUwLCAiRmlsdGVyZWQiKSwKKwlNSUJfREVTQygxLCAweDU0LCAiVHhCcm9hZCIpLAorCU1JQl9ERVNDKDEsIDB4NTgsICJUeFBhdXNlIiksCisJTUlCX0RFU0MoMSwgMHg1YywgIlR4TXVsdGkiKSwKKwlNSUJfREVTQygxLCAweDYwLCAiVHhVbmRlclJ1biIpLAorCU1JQl9ERVNDKDEsIDB4NjQsICJUeDY0Qnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4NjgsICJUeDEyOEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDZjLCAiVHgyNTZCeXRlIiksCisJTUlCX0RFU0MoMSwgMHg3MCwgIlR4NTEyQnl0ZSIpLAorCU1JQl9ERVNDKDEsIDB4NzQsICJUeDEwMjRCeXRlIiksCisJTUlCX0RFU0MoMSwgMHg3OCwgIlR4MTUxOEJ5dGUiKSwKKwlNSUJfREVTQygxLCAweDdjLCAiVHhNYXhCeXRlIiksCisJTUlCX0RFU0MoMSwgMHg4MCwgIlR4T3ZlclNpemUiKSwKKwlNSUJfREVTQygyLCAweDg0LCAiVHhCeXRlIiksCisJTUlCX0RFU0MoMSwgMHg4YywgIlR4Q29sbGlzaW9uIiksCisJTUlCX0RFU0MoMSwgMHg5MCwgIlR4QWJvcnRDb2wiKSwKKwlNSUJfREVTQygxLCAweDk0LCAiVHhNdWx0aUNvbCIpLAorCU1JQl9ERVNDKDEsIDB4OTgsICJUeFNpbmdsZUNvbCIpLAorCU1JQl9ERVNDKDEsIDB4OWMsICJUeEV4Y0RlZmVyIiksCisJTUlCX0RFU0MoMSwgMHhhMCwgIlR4RGVmZXIiKSwKKwlNSUJfREVTQygxLCAweGE0LCAiVHhMYXRlQ29sIiksCit9OworCisvKiBUaGUgMzJiaXQgc3dpdGNoIHJlZ2lzdGVycyBhcmUgYWNjZXNzZWQgaW5kaXJlY3RseS4gVG8gYWNoaWV2ZSB0aGlzIHdlIG5lZWQKKyAqIHRvIHNldCB0aGUgcGFnZSBvZiB0aGUgcmVnaXN0ZXIuIFRyYWNrIHRoZSBsYXN0IHBhZ2UgdGhhdCB3YXMgc2V0IHRvIHJlZHVjZQorICogbWRpbyB3cml0ZXMKKyAqLworc3RhdGljIHUxNiBxY2E4a19jdXJyZW50X3BhZ2UgPSAweGZmZmY7CisKK3N0YXRpYyB2b2lkCitxY2E4a19zcGxpdF9hZGRyKHUzMiByZWdhZGRyLCB1MTYgKnIxLCB1MTYgKnIyLCB1MTYgKnBhZ2UpCit7CisJcmVnYWRkciA+Pj0gMTsKKwkqcjEgPSByZWdhZGRyICYgMHgxZTsKKworCXJlZ2FkZHIgPj49IDU7CisJKnIyID0gcmVnYWRkciAmIDB4NzsKKworCXJlZ2FkZHIgPj49IDM7CisJKnBhZ2UgPSByZWdhZGRyICYgMHgzZmY7Cit9CisKK3N0YXRpYyB1MzIKK3FjYThrX21paV9yZWFkMzIoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeV9pZCwgdTMyIHJlZ251bSkKK3sKKwl1MzIgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBidXMtPnJlYWQoYnVzLCBwaHlfaWQsIHJlZ251bSk7CisJaWYgKHJldCA+PSAwKSB7CisJCXZhbCA9IHJldDsKKwkJcmV0ID0gYnVzLT5yZWFkKGJ1cywgcGh5X2lkLCByZWdudW0gKyAxKTsKKwkJdmFsIHw9IHJldCA8PCAxNjsKKwl9CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKCZidXMtPmRldiwKKwkJCQkgICAgImZhaWxlZCB0byByZWFkIHFjYThrIDMyYml0IHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfbWlpX3dyaXRlMzIoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeV9pZCwgdTMyIHJlZ251bSwgdTMyIHZhbCkKK3sKKwl1MTYgbG8sIGhpOworCWludCByZXQ7CisKKwlsbyA9IHZhbCAmIDB4ZmZmZjsKKwloaSA9ICh1MTYpKHZhbCA+PiAxNik7CisKKwlyZXQgPSBidXMtPndyaXRlKGJ1cywgcGh5X2lkLCByZWdudW0sIGxvKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IGJ1cy0+d3JpdGUoYnVzLCBwaHlfaWQsIHJlZ251bSArIDEsIGhpKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmYnVzLT5kZXYsCisJCQkJICAgICJmYWlsZWQgdG8gd3JpdGUgcWNhOGsgMzJiaXQgcmVnaXN0ZXJcbiIpOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfc2V0X3BhZ2Uoc3RydWN0IG1paV9idXMgKmJ1cywgdTE2IHBhZ2UpCit7CisJaWYgKHBhZ2UgPT0gcWNhOGtfY3VycmVudF9wYWdlKQorCQlyZXR1cm47CisKKwlpZiAoYnVzLT53cml0ZShidXMsIDB4MTgsIDAsIHBhZ2UpIDwgMCkKKwkJZGV2X2Vycl9yYXRlbGltaXRlZCgmYnVzLT5kZXYsCisJCQkJICAgICJmYWlsZWQgdG8gc2V0IHFjYThrIHBhZ2VcbiIpOworCXFjYThrX2N1cnJlbnRfcGFnZSA9IHBhZ2U7Cit9CisKK3N0YXRpYyB1MzIKK3FjYThrX3JlYWQoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIHUzMiByZWcpCit7CisJdTE2IHIxLCByMiwgcGFnZTsKKwl1MzIgdmFsOworCisJcWNhOGtfc3BsaXRfYWRkcihyZWcsICZyMSwgJnIyLCAmcGFnZSk7CisKKwltdXRleF9sb2NrX25lc3RlZCgmcHJpdi0+YnVzLT5tZGlvX2xvY2ssIE1ESU9fTVVURVhfTkVTVEVEKTsKKworCXFjYThrX3NldF9wYWdlKHByaXYtPmJ1cywgcGFnZSk7CisJdmFsID0gcWNhOGtfbWlpX3JlYWQzMihwcml2LT5idXMsIDB4MTAgfCByMiwgcjEpOworCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5idXMtPm1kaW9fbG9jayk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfd3JpdGUoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJdTE2IHIxLCByMiwgcGFnZTsKKworCXFjYThrX3NwbGl0X2FkZHIocmVnLCAmcjEsICZyMiwgJnBhZ2UpOworCisJbXV0ZXhfbG9ja19uZXN0ZWQoJnByaXYtPmJ1cy0+bWRpb19sb2NrLCBNRElPX01VVEVYX05FU1RFRCk7CisKKwlxY2E4a19zZXRfcGFnZShwcml2LT5idXMsIHBhZ2UpOworCXFjYThrX21paV93cml0ZTMyKHByaXYtPmJ1cywgMHgxMCB8IHIyLCByMSwgdmFsKTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+YnVzLT5tZGlvX2xvY2spOworfQorCitzdGF0aWMgdTMyCitxY2E4a19ybXcoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIHUzMiByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKQoreworCXUxNiByMSwgcjIsIHBhZ2U7CisJdTMyIHJldDsKKworCXFjYThrX3NwbGl0X2FkZHIocmVnLCAmcjEsICZyMiwgJnBhZ2UpOworCisJbXV0ZXhfbG9ja19uZXN0ZWQoJnByaXYtPmJ1cy0+bWRpb19sb2NrLCBNRElPX01VVEVYX05FU1RFRCk7CisKKwlxY2E4a19zZXRfcGFnZShwcml2LT5idXMsIHBhZ2UpOworCXJldCA9IHFjYThrX21paV9yZWFkMzIocHJpdi0+YnVzLCAweDEwIHwgcjIsIHIxKTsKKwlyZXQgJj0gfm1hc2s7CisJcmV0IHw9IHZhbDsKKwlxY2E4a19taWlfd3JpdGUzMihwcml2LT5idXMsIDB4MTAgfCByMiwgcjEsIHJldCk7CisKKwltdXRleF91bmxvY2soJnByaXYtPmJ1cy0+bWRpb19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19yZWdfc2V0KHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgdmFsKQoreworCXFjYThrX3Jtdyhwcml2LCByZWcsIDAsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19yZWdfY2xlYXIoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJcWNhOGtfcm13KHByaXYsIHJlZywgdmFsLCAwKTsKK30KKworc3RhdGljIGludAorcWNhOGtfcmVnbWFwX3JlYWQodm9pZCAqY3R4LCB1aW50MzJfdCByZWcsIHVpbnQzMl90ICp2YWwpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKiljdHg7CisKKwkqdmFsID0gcWNhOGtfcmVhZChwcml2LCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3JlZ21hcF93cml0ZSh2b2lkICpjdHgsIHVpbnQzMl90IHJlZywgdWludDMyX3QgdmFsKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopY3R4OworCisJcWNhOGtfd3JpdGUocHJpdiwgcmVnLCB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlIHFjYThrX3JlYWRhYmxlX3Jhbmdlc1tdID0geworCXJlZ21hcF9yZWdfcmFuZ2UoMHgwMDAwLCAweDAwZTQpLCAvKiBHbG9iYWwgY29udHJvbCAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgwMTAwLCAweDAxNjgpLCAvKiBFRUUgY29udHJvbCAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgwMjAwLCAweDAyNzApLCAvKiBQYXJzZXIgY29udHJvbCAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgwNDAwLCAweDA0NTQpLCAvKiBBQ0wgKi8KKwlyZWdtYXBfcmVnX3JhbmdlKDB4MDYwMCwgMHgwNzE4KSwgLyogTG9va3VwICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDA4MDAsIDB4MGI3MCksIC8qIFFNICovCisJcmVnbWFwX3JlZ19yYW5nZSgweDBjMDAsIDB4MGM4MCksIC8qIFBLVCAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgwZTAwLCAweDBlOTgpLCAvKiBMMyAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgxMDAwLCAweDEwYWMpLCAvKiBNSUIgLSBQb3J0MCAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgxMTAwLCAweDExYWMpLCAvKiBNSUIgLSBQb3J0MSAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgxMjAwLCAweDEyYWMpLCAvKiBNSUIgLSBQb3J0MiAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgxMzAwLCAweDEzYWMpLCAvKiBNSUIgLSBQb3J0MyAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgxNDAwLCAweDE0YWMpLCAvKiBNSUIgLSBQb3J0NCAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgxNTAwLCAweDE1YWMpLCAvKiBNSUIgLSBQb3J0NSAqLworCXJlZ21hcF9yZWdfcmFuZ2UoMHgxNjAwLCAweDE2YWMpLCAvKiBNSUIgLSBQb3J0NiAqLworCit9OworCitzdGF0aWMgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgcWNhOGtfcmVhZGFibGVfdGFibGUgPSB7CisJLnllc19yYW5nZXMgPSBxY2E4a19yZWFkYWJsZV9yYW5nZXMsCisJLm5feWVzX3JhbmdlcyA9IEFSUkFZX1NJWkUocWNhOGtfcmVhZGFibGVfcmFuZ2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBxY2E4a19yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDE2LAorCS52YWxfYml0cyA9IDMyLAorCS5yZWdfc3RyaWRlID0gNCwKKwkubWF4X3JlZ2lzdGVyID0gMHgxNmFjLCAvKiBlbmQgTUlCIC0gUG9ydDYgcmFuZ2UgKi8KKwkucmVnX3JlYWQgPSBxY2E4a19yZWdtYXBfcmVhZCwKKwkucmVnX3dyaXRlID0gcWNhOGtfcmVnbWFwX3dyaXRlLAorCS5yZF90YWJsZSA9ICZxY2E4a19yZWFkYWJsZV90YWJsZSwKK307CisKK3N0YXRpYyBpbnQKK3FjYThrX2J1c3lfd2FpdChzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIG1hc2spCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwKTsKKworCS8qIGxvb3AgdW50aWwgdGhlIGJ1c3kgZmxhZyBoYXMgY2xlYXJlZCAqLworCWRvIHsKKwkJdTMyIHZhbCA9IHFjYThrX3JlYWQocHJpdiwgcmVnKTsKKwkJaW50IGJ1c3kgPSB2YWwgJiBtYXNrOworCisJCWlmICghYnVzeSkKKwkJCWJyZWFrOworCQljb25kX3Jlc2NoZWQoKTsKKwl9IHdoaWxlICghdGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KSk7CisKKwlyZXR1cm4gdGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aW1lb3V0KTsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX2ZkYl9yZWFkKHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCBzdHJ1Y3QgcWNhOGtfZmRiICpmZGIpCit7CisJdTMyIHJlZ1s0XTsKKwlpbnQgaTsKKworCS8qIGxvYWQgdGhlIEFSTCB0YWJsZSBpbnRvIGFuIGFycmF5ICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwkJcmVnW2ldID0gcWNhOGtfcmVhZChwcml2LCBRQ0E4S19SRUdfQVRVX0RBVEEwICsgKGkgKiA0KSk7CisKKwkvKiB2aWQgLSA4Mzo3MiAqLworCWZkYi0+dmlkID0gKHJlZ1syXSA+PiBRQ0E4S19BVFVfVklEX1MpICYgUUNBOEtfQVRVX1ZJRF9NOworCS8qIGFnaW5nIC0gNjc6NjQgKi8KKwlmZGItPmFnaW5nID0gcmVnWzJdICYgUUNBOEtfQVRVX1NUQVRVU19NOworCS8qIHBvcnRtYXNrIC0gNTQ6NDggKi8KKwlmZGItPnBvcnRfbWFzayA9IChyZWdbMV0gPj4gUUNBOEtfQVRVX1BPUlRfUykgJiBRQ0E4S19BVFVfUE9SVF9NOworCS8qIG1hYyAtIDQ3OjAgKi8KKwlmZGItPm1hY1swXSA9IChyZWdbMV0gPj4gUUNBOEtfQVRVX0FERFIwX1MpICYgMHhmZjsKKwlmZGItPm1hY1sxXSA9IHJlZ1sxXSAmIDB4ZmY7CisJZmRiLT5tYWNbMl0gPSAocmVnWzBdID4+IFFDQThLX0FUVV9BRERSMl9TKSAmIDB4ZmY7CisJZmRiLT5tYWNbM10gPSAocmVnWzBdID4+IFFDQThLX0FUVV9BRERSM19TKSAmIDB4ZmY7CisJZmRiLT5tYWNbNF0gPSAocmVnWzBdID4+IFFDQThLX0FUVV9BRERSNF9TKSAmIDB4ZmY7CisJZmRiLT5tYWNbNV0gPSByZWdbMF0gJiAweGZmOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfZmRiX3dyaXRlKHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCB1MTYgdmlkLCB1OCBwb3J0X21hc2ssIGNvbnN0IHU4ICptYWMsCisJCXU4IGFnaW5nKQoreworCXUzMiByZWdbM10gPSB7IDAgfTsKKwlpbnQgaTsKKworCS8qIHZpZCAtIDgzOjcyICovCisJcmVnWzJdID0gKHZpZCAmIFFDQThLX0FUVV9WSURfTSkgPDwgUUNBOEtfQVRVX1ZJRF9TOworCS8qIGFnaW5nIC0gNjc6NjQgKi8KKwlyZWdbMl0gfD0gYWdpbmcgJiBRQ0E4S19BVFVfU1RBVFVTX007CisJLyogcG9ydG1hc2sgLSA1NDo0OCAqLworCXJlZ1sxXSA9IChwb3J0X21hc2sgJiBRQ0E4S19BVFVfUE9SVF9NKSA8PCBRQ0E4S19BVFVfUE9SVF9TOworCS8qIG1hYyAtIDQ3OjAgKi8KKwlyZWdbMV0gfD0gbWFjWzBdIDw8IFFDQThLX0FUVV9BRERSMF9TOworCXJlZ1sxXSB8PSBtYWNbMV07CisJcmVnWzBdIHw9IG1hY1syXSA8PCBRQ0E4S19BVFVfQUREUjJfUzsKKwlyZWdbMF0gfD0gbWFjWzNdIDw8IFFDQThLX0FUVV9BRERSM19TOworCXJlZ1swXSB8PSBtYWNbNF0gPDwgUUNBOEtfQVRVX0FERFI0X1M7CisJcmVnWzBdIHw9IG1hY1s1XTsKKworCS8qIGxvYWQgdGhlIGFycmF5IGludG8gdGhlIEFSTCB0YWJsZSAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCXFjYThrX3dyaXRlKHByaXYsIFFDQThLX1JFR19BVFVfREFUQTAgKyAoaSAqIDQpLCByZWdbaV0pOworfQorCitzdGF0aWMgaW50CitxY2E4a19mZGJfYWNjZXNzKHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCBlbnVtIHFjYThrX2ZkYl9jbWQgY21kLCBpbnQgcG9ydCkKK3sKKwl1MzIgcmVnOworCisJLyogU2V0IHRoZSBjb21tYW5kIGFuZCBGREIgaW5kZXggKi8KKwlyZWcgPSBRQ0E4S19BVFVfRlVOQ19CVVNZOworCXJlZyB8PSBjbWQ7CisJaWYgKHBvcnQgPj0gMCkgeworCQlyZWcgfD0gUUNBOEtfQVRVX0ZVTkNfUE9SVF9FTjsKKwkJcmVnIHw9IChwb3J0ICYgUUNBOEtfQVRVX0ZVTkNfUE9SVF9NKSA8PCBRQ0E4S19BVFVfRlVOQ19QT1JUX1M7CisJfQorCisJLyogV3JpdGUgdGhlIGZ1bmN0aW9uIHJlZ2lzdGVyIHRyaWdnZXJpbmcgdGhlIHRhYmxlIGFjY2VzcyAqLworCXFjYThrX3dyaXRlKHByaXYsIFFDQThLX1JFR19BVFVfRlVOQywgcmVnKTsKKworCS8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwlpZiAocWNhOGtfYnVzeV93YWl0KHByaXYsIFFDQThLX1JFR19BVFVfRlVOQywgUUNBOEtfQVRVX0ZVTkNfQlVTWSkpCisJCXJldHVybiAtMTsKKworCS8qIENoZWNrIGZvciB0YWJsZSBmdWxsIHZpb2xhdGlvbiB3aGVuIGFkZGluZyBhbiBlbnRyeSAqLworCWlmIChjbWQgPT0gUUNBOEtfRkRCX0xPQUQpIHsKKwkJcmVnID0gcWNhOGtfcmVhZChwcml2LCBRQ0E4S19SRUdfQVRVX0ZVTkMpOworCQlpZiAocmVnICYgUUNBOEtfQVRVX0ZVTkNfRlVMTCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcWNhOGtfZmRiX25leHQoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIHN0cnVjdCBxY2E4a19mZGIgKmZkYiwgaW50IHBvcnQpCit7CisJaW50IHJldDsKKworCXFjYThrX2ZkYl93cml0ZShwcml2LCBmZGItPnZpZCwgZmRiLT5wb3J0X21hc2ssIGZkYi0+bWFjLCBmZGItPmFnaW5nKTsKKwlyZXQgPSBxY2E4a19mZGJfYWNjZXNzKHByaXYsIFFDQThLX0ZEQl9ORVhULCBwb3J0KTsKKwlpZiAocmV0ID49IDApCisJCXFjYThrX2ZkYl9yZWFkKHByaXYsIGZkYik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitxY2E4a19mZGJfYWRkKHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCBjb25zdCB1OCAqbWFjLCB1MTYgcG9ydF9tYXNrLAorCSAgICAgIHUxNiB2aWQsIHU4IGFnaW5nKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworCXFjYThrX2ZkYl93cml0ZShwcml2LCB2aWQsIHBvcnRfbWFzaywgbWFjLCBhZ2luZyk7CisJcmV0ID0gcWNhOGtfZmRiX2FjY2Vzcyhwcml2LCBRQ0E4S19GREJfTE9BRCwgLTEpOworCW11dGV4X3VubG9jaygmcHJpdi0+cmVnX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX2ZkYl9kZWwoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIGNvbnN0IHU4ICptYWMsIHUxNiBwb3J0X21hc2ssIHUxNiB2aWQpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnByaXYtPnJlZ19tdXRleCk7CisJcWNhOGtfZmRiX3dyaXRlKHByaXYsIHZpZCwgcG9ydF9tYXNrLCBtYWMsIDApOworCXJldCA9IHFjYThrX2ZkYl9hY2Nlc3MocHJpdiwgUUNBOEtfRkRCX1BVUkdFLCAtMSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX2ZkYl9mbHVzaChzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdikKK3sKKwltdXRleF9sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworCXFjYThrX2ZkYl9hY2Nlc3MocHJpdiwgUUNBOEtfRkRCX0ZMVVNILCAtMSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfbWliX2luaXQoc3RydWN0IHFjYThrX3ByaXYgKnByaXYpCit7CisJbXV0ZXhfbG9jaygmcHJpdi0+cmVnX211dGV4KTsKKwlxY2E4a19yZWdfc2V0KHByaXYsIFFDQThLX1JFR19NSUIsIFFDQThLX01JQl9GTFVTSCB8IFFDQThLX01JQl9CVVNZKTsKKwlxY2E4a19idXN5X3dhaXQocHJpdiwgUUNBOEtfUkVHX01JQiwgUUNBOEtfTUlCX0JVU1kpOworCXFjYThrX3JlZ19zZXQocHJpdiwgUUNBOEtfUkVHX01JQiwgUUNBOEtfTUlCX0NQVV9LRUVQKTsKKwlxY2E4a193cml0ZShwcml2LCBRQ0E4S19SRUdfTU9EVUxFX0VOLCBRQ0E4S19NT0RVTEVfRU5fTUlCKTsKKwltdXRleF91bmxvY2soJnByaXYtPnJlZ19tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3NldF9wYWRfY3RybChzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgaW50IHBvcnQsIGludCBtb2RlKQoreworCXUzMiByZWc7CisKKwlzd2l0Y2ggKHBvcnQpIHsKKwljYXNlIDA6CisJCXJlZyA9IFFDQThLX1JFR19QT1JUMF9QQURfQ1RSTDsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlyZWcgPSBRQ0E4S19SRUdfUE9SVDZfUEFEX0NUUkw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiQ2FuJ3Qgc2V0IFBBRF9DVFJMIG9uIHBvcnQgJWRcbiIsIHBvcnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBDb25maWd1cmUgYSBwb3J0IHRvIGJlIGRpcmVjdGx5IGNvbm5lY3RlZCB0byBhbiBleHRlcm5hbAorCSAqIFBIWSBvciBNQUMuCisJICovCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUk6CisJCXFjYThrX3dyaXRlKHByaXYsIHJlZywKKwkJCSAgICBRQ0E4S19QT1JUX1BBRF9SR01JSV9FTiB8CisJCQkgICAgUUNBOEtfUE9SVF9QQURfUkdNSUlfVFhfREVMQVkoMykgfAorCQkJICAgIFFDQThLX1BPUlRfUEFEX1JHTUlJX1JYX0RFTEFZKDMpKTsKKworCQkvKiBBY2NvcmRpbmcgdG8gdGhlIGRhdGFzaGVldCwgUkdNSUkgZGVsYXkgaXMgZW5hYmxlZCB0aHJvdWdoCisJCSAqIFBPUlQ1X1BBRF9DVFJMIGZvciBhbGwgcG9ydHMsIHJhdGhlciB0aGFuIGluZGl2aWR1YWwgcG9ydAorCQkgKiByZWdpc3RlcnMKKwkJICovCisJCXFjYThrX3dyaXRlKHByaXYsIFFDQThLX1JFR19QT1JUNV9QQURfQ1RSTCwKKwkJCSAgICBRQ0E4S19QT1JUX1BBRF9SR01JSV9SWF9ERUxBWV9FTik7CisJCWJyZWFrOworCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJOgorCQlxY2E4a193cml0ZShwcml2LCByZWcsIFFDQThLX1BPUlRfUEFEX1NHTUlJX0VOKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfZXJyKCJ4TUlJIG1vZGUgJWQgbm90IHN1cHBvcnRlZFxuIiwgbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfcG9ydF9zZXRfc3RhdHVzKHN0cnVjdCBxY2E4a19wcml2ICpwcml2LCBpbnQgcG9ydCwgaW50IGVuYWJsZSkKK3sKKwl1MzIgbWFzayA9IFFDQThLX1BPUlRfU1RBVFVTX1RYTUFDOworCisJLyogUG9ydCAwIGFuZCA2IGhhdmUgbm8gaW50ZXJuYWwgUEhZICovCisJaWYgKChwb3J0ID4gMCkgJiYgKHBvcnQgPCA2KSkKKwkJbWFzayB8PSBRQ0E4S19QT1JUX1NUQVRVU19MSU5LX0FVVE87CisKKwlpZiAoZW5hYmxlKQorCQlxY2E4a19yZWdfc2V0KHByaXYsIFFDQThLX1JFR19QT1JUX1NUQVRVUyhwb3J0KSwgbWFzayk7CisJZWxzZQorCQlxY2E4a19yZWdfY2xlYXIocHJpdiwgUUNBOEtfUkVHX1BPUlRfU1RBVFVTKHBvcnQpLCBtYXNrKTsKK30KKworc3RhdGljIGludAorcWNhOGtfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJaW50IHJldCwgaSwgcGh5X21vZGUgPSAtMTsKKworCS8qIE1ha2Ugc3VyZSB0aGF0IHBvcnQgMCBpcyB0aGUgY3B1IHBvcnQgKi8KKwlpZiAoIWRzYV9pc19jcHVfcG9ydChkcywgMCkpIHsKKwkJcHJfZXJyKCJwb3J0IDAgaXMgbm90IHRoZSBDUFUgcG9ydFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2luaXQoJnByaXYtPnJlZ19tdXRleCk7CisKKwkvKiBTdGFydCBieSBzZXR0aW5nIHVwIHRoZSByZWdpc3RlciBtYXBwaW5nICovCisJcHJpdi0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdChkcy0+ZGV2LCBOVUxMLCBwcml2LAorCQkJCQkmcWNhOGtfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihwcml2LT5yZWdtYXApKQorCQlwcl93YXJuKCJyZWdtYXAgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisKKwkvKiBJbml0aWFsaXplIENQVSBwb3J0IHBhZCBtb2RlICh4TUlJIHR5cGUsIGRlbGF5cy4uLikgKi8KKwlwaHlfbW9kZSA9IG9mX2dldF9waHlfbW9kZShkcy0+cG9ydHNbZHMtPmRzdC0+Y3B1X3BvcnRdLmRuKTsKKwlpZiAocGh5X21vZGUgPCAwKSB7CisJCXByX2VycigiQ2FuJ3QgZmluZCBwaHktbW9kZSBmb3IgbWFzdGVyIGRldmljZVxuIik7CisJCXJldHVybiBwaHlfbW9kZTsKKwl9CisJcmV0ID0gcWNhOGtfc2V0X3BhZF9jdHJsKHByaXYsIFFDQThLX0NQVV9QT1JULCBwaHlfbW9kZSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBFbmFibGUgQ1BVIFBvcnQgKi8KKwlxY2E4a19yZWdfc2V0KHByaXYsIFFDQThLX1JFR19HTE9CQUxfRldfQ1RSTDAsCisJCSAgICAgIFFDQThLX0dMT0JBTF9GV19DVFJMMF9DUFVfUE9SVF9FTik7CisJcWNhOGtfcG9ydF9zZXRfc3RhdHVzKHByaXYsIFFDQThLX0NQVV9QT1JULCAxKTsKKwlwcml2LT5wb3J0X3N0c1tRQ0E4S19DUFVfUE9SVF0uZW5hYmxlZCA9IDE7CisKKwkvKiBFbmFibGUgTUlCIGNvdW50ZXJzICovCisJcWNhOGtfbWliX2luaXQocHJpdik7CisKKwkvKiBFbmFibGUgUUNBIGhlYWRlciBtb2RlIG9uIHRoZSBjcHUgcG9ydCAqLworCXFjYThrX3dyaXRlKHByaXYsIFFDQThLX1JFR19QT1JUX0hEUl9DVFJMKFFDQThLX0NQVV9QT1JUKSwKKwkJICAgIFFDQThLX1BPUlRfSERSX0NUUkxfQUxMIDw8IFFDQThLX1BPUlRfSERSX0NUUkxfVFhfUyB8CisJCSAgICBRQ0E4S19QT1JUX0hEUl9DVFJMX0FMTCA8PCBRQ0E4S19QT1JUX0hEUl9DVFJMX1JYX1MpOworCisJLyogRGlzYWJsZSBmb3J3YXJkaW5nIGJ5IGRlZmF1bHQgb24gYWxsIHBvcnRzICovCisJZm9yIChpID0gMDsgaSA8IFFDQThLX05VTV9QT1JUUzsgaSsrKQorCQlxY2E4a19ybXcocHJpdiwgUUNBOEtfUE9SVF9MT09LVVBfQ1RSTChpKSwKKwkJCSAgUUNBOEtfUE9SVF9MT09LVVBfTUVNQkVSLCAwKTsKKworCS8qIERpc2FibGUgTUFDIGJ5IGRlZmF1bHQgb24gYWxsIHVzZXIgcG9ydHMgKi8KKwlmb3IgKGkgPSAxOyBpIDwgUUNBOEtfTlVNX1BPUlRTOyBpKyspCisJCWlmIChkcy0+ZW5hYmxlZF9wb3J0X21hc2sgJiBCSVQoaSkpCisJCQlxY2E4a19wb3J0X3NldF9zdGF0dXMocHJpdiwgaSwgMCk7CisKKwkvKiBGb3J3YXJkIGFsbCB1bmtub3duIGZyYW1lcyB0byBDUFUgcG9ydCBmb3IgTGludXggcHJvY2Vzc2luZyAqLworCXFjYThrX3dyaXRlKHByaXYsIFFDQThLX1JFR19HTE9CQUxfRldfQ1RSTDEsCisJCSAgICBCSVQoMCkgPDwgUUNBOEtfR0xPQkFMX0ZXX0NUUkwxX0lHTVBfRFBfUyB8CisJCSAgICBCSVQoMCkgPDwgUUNBOEtfR0xPQkFMX0ZXX0NUUkwxX0JDX0RQX1MgfAorCQkgICAgQklUKDApIDw8IFFDQThLX0dMT0JBTF9GV19DVFJMMV9NQ19EUF9TIHwKKwkJICAgIEJJVCgwKSA8PCBRQ0E4S19HTE9CQUxfRldfQ1RSTDFfVUNfRFBfUyk7CisKKwkvKiBTZXR1cCBjb25uZWN0aW9uIGJldHdlZW4gQ1BVIHBvcnQgJiB1c2VyIHBvcnRzICovCisJZm9yIChpID0gMDsgaSA8IERTQV9NQVhfUE9SVFM7IGkrKykgeworCQkvKiBDUFUgcG9ydCBnZXRzIGNvbm5lY3RlZCB0byBhbGwgdXNlciBwb3J0cyBvZiB0aGUgc3dpdGNoICovCisJCWlmIChkc2FfaXNfY3B1X3BvcnQoZHMsIGkpKSB7CisJCQlxY2E4a19ybXcocHJpdiwgUUNBOEtfUE9SVF9MT09LVVBfQ1RSTChRQ0E4S19DUFVfUE9SVCksCisJCQkJICBRQ0E4S19QT1JUX0xPT0tVUF9NRU1CRVIsCisJCQkJICBkcy0+ZW5hYmxlZF9wb3J0X21hc2spOworCQl9CisKKwkJLyogSW52aXZpZHVhbCB1c2VyIHBvcnRzIGdldCBjb25uZWN0ZWQgdG8gQ1BVIHBvcnQgb25seSAqLworCQlpZiAoZHMtPmVuYWJsZWRfcG9ydF9tYXNrICYgQklUKGkpKSB7CisJCQlpbnQgc2hpZnQgPSAxNiAqIChpICUgMik7CisKKwkJCXFjYThrX3Jtdyhwcml2LCBRQ0E4S19QT1JUX0xPT0tVUF9DVFJMKGkpLAorCQkJCSAgUUNBOEtfUE9SVF9MT09LVVBfTUVNQkVSLAorCQkJCSAgQklUKFFDQThLX0NQVV9QT1JUKSk7CisKKwkJCS8qIEVuYWJsZSBBUlAgQXV0by1sZWFybmluZyBieSBkZWZhdWx0ICovCisJCQlxY2E4a19yZWdfc2V0KHByaXYsIFFDQThLX1BPUlRfTE9PS1VQX0NUUkwoaSksCisJCQkJICAgICAgUUNBOEtfUE9SVF9MT09LVVBfTEVBUk4pOworCisJCQkvKiBGb3IgcG9ydCBiYXNlZCB2bGFucyB0byB3b3JrIHdlIG5lZWQgdG8gc2V0IHRoZQorCQkJICogZGVmYXVsdCBlZ3Jlc3MgdmlkCisJCQkgKi8KKwkJCXFjYThrX3Jtdyhwcml2LCBRQ0E4S19FR1JFU1NfVkxBTihpKSwKKwkJCQkgIDB4ZmZmZiA8PCBzaGlmdCwgMSA8PCBzaGlmdCk7CisJCQlxY2E4a193cml0ZShwcml2LCBRQ0E4S19SRUdfUE9SVF9WTEFOX0NUUkwwKGkpLAorCQkJCSAgICBRQ0E4S19QT1JUX1ZMQU5fQ1ZJRCgxKSB8CisJCQkJICAgIFFDQThLX1BPUlRfVkxBTl9TVklEKDEpKTsKKwkJfQorCX0KKworCS8qIEZsdXNoIHRoZSBGREIgdGFibGUgKi8KKwlxY2E4a19mZGJfZmx1c2gocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcWNhOGtfcGh5X3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcGh5LCBpbnQgcmVnbnVtKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisKKwlyZXR1cm4gbWRpb2J1c19yZWFkKHByaXYtPmJ1cywgcGh5LCByZWdudW0pOworfQorCitzdGF0aWMgaW50CitxY2E4a19waHlfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcGh5LCBpbnQgcmVnbnVtLCB1MTYgdmFsKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisKKwlyZXR1cm4gbWRpb2J1c193cml0ZShwcml2LT5idXMsIHBoeSwgcmVnbnVtLCB2YWwpOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfZ2V0X3N0cmluZ3Moc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgdWludDhfdCAqZGF0YSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFyODMyN19taWIpOyBpKyspCisJCXN0cm5jcHkoZGF0YSArIGkgKiBFVEhfR1NUUklOR19MRU4sIGFyODMyN19taWJbaV0ubmFtZSwKKwkJCUVUSF9HU1RSSU5HX0xFTik7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJdWludDY0X3QgKmRhdGEpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwljb25zdCBzdHJ1Y3QgcWNhOGtfbWliX2Rlc2MgKm1pYjsKKwl1MzIgcmVnLCBpOworCXU2NCBoaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFyODMyN19taWIpOyBpKyspIHsKKwkJbWliID0gJmFyODMyN19taWJbaV07CisJCXJlZyA9IFFDQThLX1BPUlRfTUlCX0NPVU5URVIocG9ydCkgKyBtaWItPm9mZnNldDsKKworCQlkYXRhW2ldID0gcWNhOGtfcmVhZChwcml2LCByZWcpOworCQlpZiAobWliLT5zaXplID09IDIpIHsKKwkJCWhpID0gcWNhOGtfcmVhZChwcml2LCByZWcgKyA0KTsKKwkJCWRhdGFbaV0gfD0gaGkgPDwgMzI7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX2dldF9zc2V0X2NvdW50KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlyZXR1cm4gQVJSQVlfU0laRShhcjgzMjdfbWliKTsKK30KKworc3RhdGljIHZvaWQKK3FjYThrX2VlZV9lbmFibGVfc2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJdTMyIGxwaV9lbiA9IFFDQThLX1JFR19FRUVfQ1RSTF9MUElfRU4ocG9ydCk7CisJdTMyIHJlZzsKKworCW11dGV4X2xvY2soJnByaXYtPnJlZ19tdXRleCk7CisJcmVnID0gcWNhOGtfcmVhZChwcml2LCBRQ0E4S19SRUdfRUVFX0NUUkwpOworCWlmIChlbmFibGUpCisJCXJlZyB8PSBscGlfZW47CisJZWxzZQorCQlyZWcgJj0gfmxwaV9lbjsKKwlxY2E4a193cml0ZShwcml2LCBRQ0E4S19SRUdfRUVFX0NUUkwsIHJlZyk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5yZWdfbXV0ZXgpOworfQorCitzdGF0aWMgaW50CitxY2E4a19lZWVfaW5pdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCSAgICAgICBzdHJ1Y3QgcGh5X2RldmljZSAqcGh5KQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJc3RydWN0IGV0aHRvb2xfZWVlICpwID0gJnByaXYtPnBvcnRfc3RzW3BvcnRdLmVlZTsKKwlpbnQgcmV0OworCisJcC0+c3VwcG9ydGVkID0gKFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsKTsKKworCXJldCA9IHBoeV9pbml0X2VlZShwaHksIDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlxY2E4a19lZWVfZW5hYmxlX3NldChkcywgcG9ydCwgdHJ1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcWNhOGtfc2V0X2VlZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCSAgICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsCisJICAgICAgc3RydWN0IGV0aHRvb2xfZWVlICplKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJc3RydWN0IGV0aHRvb2xfZWVlICpwID0gJnByaXYtPnBvcnRfc3RzW3BvcnRdLmVlZTsKKwlpbnQgcmV0ID0gMDsKKworCXAtPmVlZV9lbmFibGVkID0gZS0+ZWVlX2VuYWJsZWQ7CisKKwlpZiAoZS0+ZWVlX2VuYWJsZWQpIHsKKwkJcC0+ZWVlX2VuYWJsZWQgPSBxY2E4a19lZWVfaW5pdChkcywgcG9ydCwgcGh5ZGV2KTsKKwkJaWYgKCFwLT5lZWVfZW5hYmxlZCkKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCX0KKwlxY2E4a19lZWVfZW5hYmxlX3NldChkcywgcG9ydCwgcC0+ZWVlX2VuYWJsZWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcWNhOGtfZ2V0X2VlZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCSAgICAgIHN0cnVjdCBldGh0b29sX2VlZSAqZSkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCXN0cnVjdCBldGh0b29sX2VlZSAqcCA9ICZwcml2LT5wb3J0X3N0c1twb3J0XS5lZWU7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGRzLT5wb3J0c1twb3J0XS5uZXRkZXY7CisJaW50IHJldDsKKworCXJldCA9IHBoeV9ldGh0b29sX2dldF9lZWUobmV0ZGV2LT5waHlkZXYsIHApOworCWlmICghcmV0KQorCQllLT5lZWVfYWN0aXZlID0KKwkJCSEhKHAtPnN1cHBvcnRlZCAmIHAtPmFkdmVydGlzZWQgJiBwLT5scF9hZHZlcnRpc2VkKTsKKwllbHNlCisJCWUtPmVlZV9hY3RpdmUgPSAwOworCisJZS0+ZWVlX2VuYWJsZWQgPSBwLT5lZWVfZW5hYmxlZDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19wb3J0X3N0cF9zdGF0ZV9zZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgdTggc3RhdGUpCit7CisJc3RydWN0IHFjYThrX3ByaXYgKnByaXYgPSAoc3RydWN0IHFjYThrX3ByaXYgKilkcy0+cHJpdjsKKwl1MzIgc3RwX3N0YXRlOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgQlJfU1RBVEVfRElTQUJMRUQ6CisJCXN0cF9zdGF0ZSA9IFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX0RJU0FCTEVEOworCQlicmVhazsKKwljYXNlIEJSX1NUQVRFX0JMT0NLSU5HOgorCQlzdHBfc3RhdGUgPSBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9CTE9DS0lORzsKKwkJYnJlYWs7CisJY2FzZSBCUl9TVEFURV9MSVNURU5JTkc6CisJCXN0cF9zdGF0ZSA9IFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX0xJU1RFTklORzsKKwkJYnJlYWs7CisJY2FzZSBCUl9TVEFURV9MRUFSTklORzoKKwkJc3RwX3N0YXRlID0gUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfTEVBUk5JTkc7CisJCWJyZWFrOworCWNhc2UgQlJfU1RBVEVfRk9SV0FSRElORzoKKwlkZWZhdWx0OgorCQlzdHBfc3RhdGUgPSBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9GT1JXQVJEOworCQlicmVhazsKKwl9CisKKwlxY2E4a19ybXcocHJpdiwgUUNBOEtfUE9SVF9MT09LVVBfQ1RSTChwb3J0KSwKKwkJICBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9NQVNLLCBzdHBfc3RhdGUpOworfQorCitzdGF0aWMgaW50CitxY2E4a19wb3J0X2JyaWRnZV9qb2luKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqYnJpZGdlKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJaW50IHBvcnRfbWFzayA9IEJJVChRQ0E4S19DUFVfUE9SVCk7CisJaW50IGk7CisKKwlwcml2LT5wb3J0X3N0c1twb3J0XS5icmlkZ2VfZGV2ID0gYnJpZGdlOworCisJZm9yIChpID0gMTsgaSA8IFFDQThLX05VTV9QT1JUUzsgaSsrKSB7CisJCWlmIChwcml2LT5wb3J0X3N0c1tpXS5icmlkZ2VfZGV2ICE9IGJyaWRnZSkKKwkJCWNvbnRpbnVlOworCQkvKiBBZGQgdGhpcyBwb3J0IHRvIHRoZSBwb3J0dmxhbiBtYXNrIG9mIHRoZSBvdGhlciBwb3J0cworCQkgKiBpbiB0aGUgYnJpZGdlCisJCSAqLworCQlxY2E4a19yZWdfc2V0KHByaXYsCisJCQkgICAgICBRQ0E4S19QT1JUX0xPT0tVUF9DVFJMKGkpLAorCQkJICAgICAgQklUKHBvcnQpKTsKKwkJaWYgKGkgIT0gcG9ydCkKKwkJCXBvcnRfbWFzayB8PSBCSVQoaSk7CisJfQorCS8qIEFkZCBhbGwgb3RoZXIgcG9ydHMgdG8gdGhpcyBwb3J0cyBwb3J0dmxhbiBtYXNrICovCisJcWNhOGtfcm13KHByaXYsIFFDQThLX1BPUlRfTE9PS1VQX0NUUkwocG9ydCksCisJCSAgUUNBOEtfUE9SVF9MT09LVVBfTUVNQkVSLCBwb3J0X21hc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19wb3J0X2JyaWRnZV9sZWF2ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgUUNBOEtfTlVNX1BPUlRTOyBpKyspIHsKKwkJaWYgKHByaXYtPnBvcnRfc3RzW2ldLmJyaWRnZV9kZXYgIT0KKwkJICAgIHByaXYtPnBvcnRfc3RzW3BvcnRdLmJyaWRnZV9kZXYpCisJCQljb250aW51ZTsKKwkJLyogUmVtb3ZlIHRoaXMgcG9ydCB0byB0aGUgcG9ydHZsYW4gbWFzayBvZiB0aGUgb3RoZXIgcG9ydHMKKwkJICogaW4gdGhlIGJyaWRnZQorCQkgKi8KKwkJcWNhOGtfcmVnX2NsZWFyKHByaXYsCisJCQkJUUNBOEtfUE9SVF9MT09LVVBfQ1RSTChpKSwKKwkJCQlCSVQocG9ydCkpOworCX0KKwlwcml2LT5wb3J0X3N0c1twb3J0XS5icmlkZ2VfZGV2ID0gTlVMTDsKKwkvKiBTZXQgdGhlIGNwdSBwb3J0IHRvIGJlIHRoZSBvbmx5IG9uZSBpbiB0aGUgcG9ydHZsYW4gbWFzayBvZgorCSAqIHRoaXMgcG9ydAorCSAqLworCXFjYThrX3Jtdyhwcml2LCBRQ0E4S19QT1JUX0xPT0tVUF9DVFJMKHBvcnQpLAorCQkgIFFDQThLX1BPUlRfTE9PS1VQX01FTUJFUiwgQklUKFFDQThLX0NQVV9QT1JUKSk7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3BvcnRfZW5hYmxlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCSAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeSkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCisJcWNhOGtfcG9ydF9zZXRfc3RhdHVzKHByaXYsIHBvcnQsIDEpOworCXByaXYtPnBvcnRfc3RzW3BvcnRdLmVuYWJsZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitxY2E4a19wb3J0X2Rpc2FibGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeSkKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcWNhOGtfcHJpdiAqKWRzLT5wcml2OworCisJcWNhOGtfcG9ydF9zZXRfc3RhdHVzKHByaXYsIHBvcnQsIDApOworCXByaXYtPnBvcnRfc3RzW3BvcnRdLmVuYWJsZWQgPSAwOworfQorCitzdGF0aWMgaW50CitxY2E4a19wb3J0X2ZkYl9pbnNlcnQoc3RydWN0IHFjYThrX3ByaXYgKnByaXYsIGNvbnN0IHU4ICphZGRyLAorCQkgICAgICB1MTYgcG9ydF9tYXNrLCB1MTYgdmlkKQoreworCS8qIFNldCB0aGUgdmlkIHRvIHRoZSBwb3J0IHZsYW4gaWQgaWYgbm8gdmlkIGlzIHNldCAqLworCWlmICghdmlkKQorCQl2aWQgPSAxOworCisJcmV0dXJuIHFjYThrX2ZkYl9hZGQocHJpdiwgYWRkciwgcG9ydF9tYXNrLCB2aWQsCisJCQkgICAgIFFDQThLX0FUVV9TVEFUVVNfU1RBVElDKTsKK30KKworc3RhdGljIGludAorcWNhOGtfcG9ydF9mZGJfcHJlcGFyZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkgICAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKKwkJICAgICAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisKKwkvKiBUaGUgRkRCIHRhYmxlIGZvciBzdGF0aWMgYW5kIGF1dG8gbGVhcm5lZCBlbnRyaWVzIGlzIHRoZSBzYW1lLiBXZQorCSAqIG5lZWQgdG8gcmVzZXJ2ZSBhbiBlbnRyeSB3aXRoIG5vIHBvcnRfbWFzayBzZXQgdG8gbWFrZSBzdXJlIHRoYXQKKwkgKiB3aGVuIHBvcnRfZmRiX2FkZCBpcyBjYWxsZWQgYW4gZW50cnkgaXMgc3RpbGwgYXZhaWxhYmxlLiBPdGhlcndpc2UKKwkgKiB0aGUgbGFzdCBmcmVlIGVudHJ5IG1pZ2h0IGhhdmUgYmVlbiB1c2VkIHVwIGJ5IGF1dG8gbGVhcm5pbmcKKwkgKi8KKwlyZXR1cm4gcWNhOGtfcG9ydF9mZGJfaW5zZXJ0KHByaXYsIGZkYi0+YWRkciwgMCwgZmRiLT52aWQpOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfcG9ydF9mZGJfYWRkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCSAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiICpmZGIsCisJCSAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJdTE2IHBvcnRfbWFzayA9IEJJVChwb3J0KTsKKworCS8qIFVwZGF0ZSB0aGUgRkRCIGVudHJ5IGFkZGluZyB0aGUgcG9ydF9tYXNrICovCisJcWNhOGtfcG9ydF9mZGJfaW5zZXJ0KHByaXYsIGZkYi0+YWRkciwgcG9ydF9tYXNrLCBmZGItPnZpZCk7Cit9CisKK3N0YXRpYyBpbnQKK3FjYThrX3BvcnRfZmRiX2RlbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJdTE2IHBvcnRfbWFzayA9IEJJVChwb3J0KTsKKwl1MTYgdmlkID0gZmRiLT52aWQ7CisKKwlpZiAoIXZpZCkKKwkJdmlkID0gMTsKKworCXJldHVybiBxY2E4a19mZGJfZGVsKHByaXYsIGZkYi0+YWRkciwgcG9ydF9tYXNrLCB2aWQpOworfQorCitzdGF0aWMgaW50CitxY2E4a19wb3J0X2ZkYl9kdW1wKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCSAgICBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAorCQkgICAgaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKQoreworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gKHN0cnVjdCBxY2E4a19wcml2ICopZHMtPnByaXY7CisJc3RydWN0IHFjYThrX2ZkYiBfZmRiID0geyAwIH07CisJaW50IGNudCA9IFFDQThLX05VTV9GREJfUkVDT1JEUzsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJnByaXYtPnJlZ19tdXRleCk7CisJd2hpbGUgKGNudC0tICYmICFxY2E4a19mZGJfbmV4dChwcml2LCAmX2ZkYiwgcG9ydCkpIHsKKwkJaWYgKCFfZmRiLmFnaW5nKQorCQkJYnJlYWs7CisKKwkJZXRoZXJfYWRkcl9jb3B5KGZkYi0+YWRkciwgX2ZkYi5tYWMpOworCQlmZGItPnZpZCA9IF9mZGIudmlkOworCQlpZiAoX2ZkYi5hZ2luZyA9PSBRQ0E4S19BVFVfU1RBVFVTX1NUQVRJQykKKwkJCWZkYi0+bmRtX3N0YXRlID0gTlVEX05PQVJQOworCQllbHNlCisJCQlmZGItPm5kbV9zdGF0ZSA9IE5VRF9SRUFDSEFCTEU7CisKKwkJcmV0ID0gY2IoJmZkYi0+b2JqKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJnByaXYtPnJlZ19tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gZHNhX3RhZ19wcm90b2NvbAorcWNhOGtfZ2V0X3RhZ19wcm90b2NvbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJcmV0dXJuIERTQV9UQUdfUFJPVE9fUUNBOworfQorCitzdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfb3BzIHFjYThrX3N3aXRjaF9vcHMgPSB7CisJLmdldF90YWdfcHJvdG9jb2wJPSBxY2E4a19nZXRfdGFnX3Byb3RvY29sLAorCS5zZXR1cAkJCT0gcWNhOGtfc2V0dXAsCisJLmdldF9zdHJpbmdzCQk9IHFjYThrX2dldF9zdHJpbmdzLAorCS5waHlfcmVhZAkJPSBxY2E4a19waHlfcmVhZCwKKwkucGh5X3dyaXRlCQk9IHFjYThrX3BoeV93cml0ZSwKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBxY2E4a19nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3NzZXRfY291bnQJCT0gcWNhOGtfZ2V0X3NzZXRfY291bnQsCisJLmdldF9lZWUJCT0gcWNhOGtfZ2V0X2VlZSwKKwkuc2V0X2VlZQkJPSBxY2E4a19zZXRfZWVlLAorCS5wb3J0X2VuYWJsZQkJPSBxY2E4a19wb3J0X2VuYWJsZSwKKwkucG9ydF9kaXNhYmxlCQk9IHFjYThrX3BvcnRfZGlzYWJsZSwKKwkucG9ydF9zdHBfc3RhdGVfc2V0CT0gcWNhOGtfcG9ydF9zdHBfc3RhdGVfc2V0LAorCS5wb3J0X2JyaWRnZV9qb2luCT0gcWNhOGtfcG9ydF9icmlkZ2Vfam9pbiwKKwkucG9ydF9icmlkZ2VfbGVhdmUJPSBxY2E4a19wb3J0X2JyaWRnZV9sZWF2ZSwKKwkucG9ydF9mZGJfcHJlcGFyZQk9IHFjYThrX3BvcnRfZmRiX3ByZXBhcmUsCisJLnBvcnRfZmRiX2FkZAkJPSBxY2E4a19wb3J0X2ZkYl9hZGQsCisJLnBvcnRfZmRiX2RlbAkJPSBxY2E4a19wb3J0X2ZkYl9kZWwsCisJLnBvcnRfZmRiX2R1bXAJCT0gcWNhOGtfcG9ydF9mZGJfZHVtcCwKK307CisKK3N0YXRpYyBpbnQKK3FjYThrX3N3X3Byb2JlKHN0cnVjdCBtZGlvX2RldmljZSAqbWRpb2RldikKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdjsKKwl1MzIgaWQ7CisKKwkvKiBhbGxvY2F0ZSB0aGUgcHJpdmF0ZSBkYXRhIHN0cnVjdCBzbyB0aGF0IHdlIGNhbiBwcm9iZSB0aGUgc3dpdGNoZXMKKwkgKiBJRCByZWdpc3RlcgorCSAqLworCXByaXYgPSBkZXZtX2t6YWxsb2MoJm1kaW9kZXYtPmRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPmJ1cyA9IG1kaW9kZXYtPmJ1czsKKworCS8qIHJlYWQgdGhlIHN3aXRjaGVzIElEIHJlZ2lzdGVyICovCisJaWQgPSBxY2E4a19yZWFkKHByaXYsIFFDQThLX1JFR19NQVNLX0NUUkwpOworCWlkID4+PSBRQ0E4S19NQVNLX0NUUkxfSURfUzsKKwlpZCAmPSBRQ0E4S19NQVNLX0NUUkxfSURfTTsKKwlpZiAoaWQgIT0gUUNBOEtfSURfUUNBODMzNykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcml2LT5kcyA9IGRldm1fa3phbGxvYygmbWRpb2Rldi0+ZGV2LCBzaXplb2YoKnByaXYtPmRzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT5kcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5kcy0+cHJpdiA9IHByaXY7CisJcHJpdi0+ZHMtPmRldiA9ICZtZGlvZGV2LT5kZXY7CisJcHJpdi0+ZHMtPm9wcyA9ICZxY2E4a19zd2l0Y2hfb3BzOworCW11dGV4X2luaXQoJnByaXYtPnJlZ19tdXRleCk7CisJZGV2X3NldF9kcnZkYXRhKCZtZGlvZGV2LT5kZXYsIHByaXYpOworCisJcmV0dXJuIGRzYV9yZWdpc3Rlcl9zd2l0Y2gocHJpdi0+ZHMsIHByaXYtPmRzLT5kZXYtPm9mX25vZGUpOworfQorCitzdGF0aWMgdm9pZAorcWNhOGtfc3dfcmVtb3ZlKHN0cnVjdCBtZGlvX2RldmljZSAqbWRpb2RldikKK3sKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YSgmbWRpb2Rldi0+ZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBRQ0E4S19OVU1fUE9SVFM7IGkrKykKKwkJcWNhOGtfcG9ydF9zZXRfc3RhdHVzKHByaXYsIGksIDApOworCisJZHNhX3VucmVnaXN0ZXJfc3dpdGNoKHByaXYtPmRzKTsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIHZvaWQKK3FjYThrX3NldF9wbShzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiwgaW50IGVuYWJsZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBRQ0E4S19OVU1fUE9SVFM7IGkrKykgeworCQlpZiAoIXByaXYtPnBvcnRfc3RzW2ldLmVuYWJsZWQpCisJCQljb250aW51ZTsKKworCQlxY2E4a19wb3J0X3NldF9zdGF0dXMocHJpdiwgaSwgZW5hYmxlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcWNhOGtfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBxY2E4a19wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlxY2E4a19zZXRfcG0ocHJpdiwgMCk7CisKKwlyZXR1cm4gZHNhX3N3aXRjaF9zdXNwZW5kKHByaXYtPmRzKTsKK30KKworc3RhdGljIGludCBxY2E4a19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcWNhOGtfcHJpdiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcWNhOGtfc2V0X3BtKHByaXYsIDEpOworCisJcmV0dXJuIGRzYV9zd2l0Y2hfcmVzdW1lKHByaXYtPmRzKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHFjYThrX3BtX29wcywKKwkJCSBxY2E4a19zdXNwZW5kLCBxY2E4a19yZXN1bWUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBxY2E4a19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNhLHFjYTgzMzciIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBtZGlvX2RyaXZlciBxY2E4a21kaW9fZHJpdmVyID0geworCS5wcm9iZSAgPSBxY2E4a19zd19wcm9iZSwKKwkucmVtb3ZlID0gcWNhOGtfc3dfcmVtb3ZlLAorCS5tZGlvZHJ2LmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicWNhOGsiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBxY2E4a19vZl9tYXRjaCwKKwkJLnBtID0gJnFjYThrX3BtX29wcywKKwl9LAorfTsKKworbWRpb19tb2R1bGVfZHJpdmVyKHFjYThrbWRpb19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJNYXRoaWV1IE9saXZhcmksIEpvaG4gQ3Jpc3BpbiA8am9obkBwaHJvemVuLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBRQ0E4SyBldGhlcm5ldCBzd2l0Y2ggZmFtaWx5Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnFjYThrIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvcWNhOGsuaCBiL2RyaXZlcnMvbmV0L2RzYS9xY2E4ay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTQ2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kc2EvcWNhOGsuaApAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBGZWxpeCBGaWV0a2F1IDxuYmRAbmJkLm5hbWU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBHYWJvciBKdWhvcyA8anVob3NnQG9wZW53cnQub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19RQ0E4S19ICisjZGVmaW5lIF9fUUNBOEtfSAorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2RlZmluZSBRQ0E4S19OVU1fUE9SVFMJCQkJCTcKKworI2RlZmluZSBQSFlfSURfUUNBODMzNwkJCQkJMHgwMDRkZDAzNgorI2RlZmluZSBRQ0E4S19JRF9RQ0E4MzM3CQkJCTB4MTMKKworI2RlZmluZSBRQ0E4S19OVU1fRkRCX1JFQ09SRFMJCQkJMjA0OAorCisjZGVmaW5lIFFDQThLX0NQVV9QT1JUCQkJCQkwCisKKy8qIEdsb2JhbCBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBRQ0E4S19SRUdfTUFTS19DVFJMCQkJCTB4MDAwCisjZGVmaW5lICAgUUNBOEtfTUFTS19DVFJMX0lEX00JCQkJMHhmZgorI2RlZmluZSAgIFFDQThLX01BU0tfQ1RSTF9JRF9TCQkJCTgKKyNkZWZpbmUgUUNBOEtfUkVHX1BPUlQwX1BBRF9DVFJMCQkJMHgwMDQKKyNkZWZpbmUgUUNBOEtfUkVHX1BPUlQ1X1BBRF9DVFJMCQkJMHgwMDgKKyNkZWZpbmUgUUNBOEtfUkVHX1BPUlQ2X1BBRF9DVFJMCQkJMHgwMGMKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1BBRF9SR01JSV9FTgkJCUJJVCgyNikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1BBRF9SR01JSV9UWF9ERUxBWSh4KQkJXAorCQkJCQkJKCgweDggKyAoeCAmIDB4MykpIDw8IDIyKQorI2RlZmluZSAgIFFDQThLX1BPUlRfUEFEX1JHTUlJX1JYX0RFTEFZKHgpCQlcCisJCQkJCQkoKDB4MTAgKyAoeCAmIDB4MykpIDw8IDIwKQorI2RlZmluZSAgIFFDQThLX1BPUlRfUEFEX1JHTUlJX1JYX0RFTEFZX0VOCQlCSVQoMjQpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9QQURfU0dNSUlfRU4JCQlCSVQoNykKKyNkZWZpbmUgUUNBOEtfUkVHX01PRFVMRV9FTgkJCQkweDAzMAorI2RlZmluZSAgIFFDQThLX01PRFVMRV9FTl9NSUIJCQkJQklUKDApCisjZGVmaW5lIFFDQThLX1JFR19NSUIJCQkJCTB4MDM0CisjZGVmaW5lICAgUUNBOEtfTUlCX0ZMVVNICQkJCUJJVCgyNCkKKyNkZWZpbmUgICBRQ0E4S19NSUJfQ1BVX0tFRVAJCQkJQklUKDIwKQorI2RlZmluZSAgIFFDQThLX01JQl9CVVNZCQkJCUJJVCgxNykKKyNkZWZpbmUgUUNBOEtfR09MX01BQ19BRERSMAkJCQkweDYwCisjZGVmaW5lIFFDQThLX0dPTF9NQUNfQUREUjEJCQkJMHg2NAorI2RlZmluZSBRQ0E4S19SRUdfUE9SVF9TVEFUVVMoX2kpCQkJKDB4MDdjICsgKF9pKSAqIDQpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9TVEFUVVNfU1BFRUQJCQlHRU5NQVNLKDIsIDApCisjZGVmaW5lICAgUUNBOEtfUE9SVF9TVEFUVVNfU1BFRURfUwkJCTAKKyNkZWZpbmUgICBRQ0E4S19QT1JUX1NUQVRVU19UWE1BQwkJCUJJVCgyKQorI2RlZmluZSAgIFFDQThLX1BPUlRfU1RBVFVTX1JYTUFDCQkJQklUKDMpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9TVEFUVVNfVFhGTE9XCQkJQklUKDQpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9TVEFUVVNfUlhGTE9XCQkJQklUKDUpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9TVEFUVVNfRFVQTEVYCQkJQklUKDYpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9TVEFUVVNfTElOS19VUAkJCUJJVCg4KQorI2RlZmluZSAgIFFDQThLX1BPUlRfU1RBVFVTX0xJTktfQVVUTwkJCUJJVCg5KQorI2RlZmluZSAgIFFDQThLX1BPUlRfU1RBVFVTX0xJTktfUEFVU0UJCQlCSVQoMTApCisjZGVmaW5lIFFDQThLX1JFR19QT1JUX0hEUl9DVFJMKF9pKQkJCSgweDljICsgKF9pICogNCkpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9IRFJfQ1RSTF9SWF9NQVNLCQkJR0VOTUFTSygzLCAyKQorI2RlZmluZSAgIFFDQThLX1BPUlRfSERSX0NUUkxfUlhfUwkJCTIKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0hEUl9DVFJMX1RYX01BU0sJCQlHRU5NQVNLKDEsIDApCisjZGVmaW5lICAgUUNBOEtfUE9SVF9IRFJfQ1RSTF9UWF9TCQkJMAorI2RlZmluZSAgIFFDQThLX1BPUlRfSERSX0NUUkxfQUxMCQkJMgorI2RlZmluZSAgIFFDQThLX1BPUlRfSERSX0NUUkxfTUdNVAkJCTEKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0hEUl9DVFJMX05PTkUJCQkwCisKKy8qIEVFRSBjb250cm9sIHJlZ2lzdGVycyAqLworI2RlZmluZSBRQ0E4S19SRUdfRUVFX0NUUkwJCQkJMHgxMDAKKyNkZWZpbmUgIFFDQThLX1JFR19FRUVfQ1RSTF9MUElfRU4oX2kpCQkJKChfaSArIDEpICogMikKKworLyogQUNMIHJlZ2lzdGVycyAqLworI2RlZmluZSBRQ0E4S19SRUdfUE9SVF9WTEFOX0NUUkwwKF9pKQkJCSgweDQyMCArIChfaSAqIDgpKQorI2RlZmluZSAgIFFDQThLX1BPUlRfVkxBTl9DVklEKHgpCQkJKHggPDwgMTYpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9WTEFOX1NWSUQoeCkJCQl4CisjZGVmaW5lIFFDQThLX1JFR19QT1JUX1ZMQU5fQ1RSTDEoX2kpCQkJKDB4NDI0ICsgKF9pICogOCkpCisjZGVmaW5lIFFDQThLX1JFR19JUFY0X1BSSV9CQVNFX0FERFIJCQkweDQ3MAorI2RlZmluZSBRQ0E4S19SRUdfSVBWNF9QUklfQUREUl9NQVNLCQkJMHg0NzQKKworLyogTG9va3VwIHJlZ2lzdGVycyAqLworI2RlZmluZSBRQ0E4S19SRUdfQVRVX0RBVEEwCQkJCTB4NjAwCisjZGVmaW5lICAgUUNBOEtfQVRVX0FERFIyX1MJCQkJMjQKKyNkZWZpbmUgICBRQ0E4S19BVFVfQUREUjNfUwkJCQkxNgorI2RlZmluZSAgIFFDQThLX0FUVV9BRERSNF9TCQkJCTgKKyNkZWZpbmUgUUNBOEtfUkVHX0FUVV9EQVRBMQkJCQkweDYwNAorI2RlZmluZSAgIFFDQThLX0FUVV9QT1JUX00JCQkJMHg3ZgorI2RlZmluZSAgIFFDQThLX0FUVV9QT1JUX1MJCQkJMTYKKyNkZWZpbmUgICBRQ0E4S19BVFVfQUREUjBfUwkJCQk4CisjZGVmaW5lIFFDQThLX1JFR19BVFVfREFUQTIJCQkJMHg2MDgKKyNkZWZpbmUgICBRQ0E4S19BVFVfVklEX00JCQkJMHhmZmYKKyNkZWZpbmUgICBRQ0E4S19BVFVfVklEX1MJCQkJOAorI2RlZmluZSAgIFFDQThLX0FUVV9TVEFUVVNfTQkJCQkweGYKKyNkZWZpbmUgICBRQ0E4S19BVFVfU1RBVFVTX1NUQVRJQwkJCTB4ZgorI2RlZmluZSBRQ0E4S19SRUdfQVRVX0ZVTkMJCQkJMHg2MGMKKyNkZWZpbmUgICBRQ0E4S19BVFVfRlVOQ19CVVNZCQkJCUJJVCgzMSkKKyNkZWZpbmUgICBRQ0E4S19BVFVfRlVOQ19QT1JUX0VOCQkJQklUKDE0KQorI2RlZmluZSAgIFFDQThLX0FUVV9GVU5DX01VTFRJX0VOCQkJQklUKDEzKQorI2RlZmluZSAgIFFDQThLX0FUVV9GVU5DX0ZVTEwJCQkJQklUKDEyKQorI2RlZmluZSAgIFFDQThLX0FUVV9GVU5DX1BPUlRfTQkJCQkweGYKKyNkZWZpbmUgICBRQ0E4S19BVFVfRlVOQ19QT1JUX1MJCQkJOAorI2RlZmluZSBRQ0E4S19SRUdfR0xPQkFMX0ZXX0NUUkwwCQkJMHg2MjAKKyNkZWZpbmUgICBRQ0E4S19HTE9CQUxfRldfQ1RSTDBfQ1BVX1BPUlRfRU4JCUJJVCgxMCkKKyNkZWZpbmUgUUNBOEtfUkVHX0dMT0JBTF9GV19DVFJMMQkJCTB4NjI0CisjZGVmaW5lICAgUUNBOEtfR0xPQkFMX0ZXX0NUUkwxX0lHTVBfRFBfUwkJMjQKKyNkZWZpbmUgICBRQ0E4S19HTE9CQUxfRldfQ1RSTDFfQkNfRFBfUwkJCTE2CisjZGVmaW5lICAgUUNBOEtfR0xPQkFMX0ZXX0NUUkwxX01DX0RQX1MJCQk4CisjZGVmaW5lICAgUUNBOEtfR0xPQkFMX0ZXX0NUUkwxX1VDX0RQX1MJCQkwCisjZGVmaW5lIFFDQThLX1BPUlRfTE9PS1VQX0NUUkwoX2kpCQkJKDB4NjYwICsgKF9pKSAqIDB4YykKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0xPT0tVUF9NRU1CRVIJCQlHRU5NQVNLKDYsIDApCisjZGVmaW5lICAgUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfTUFTSwkJCUdFTk1BU0soMTgsIDE2KQorI2RlZmluZSAgIFFDQThLX1BPUlRfTE9PS1VQX1NUQVRFX0RJU0FCTEVECQkoMCA8PCAxNikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9CTE9DS0lORwkJKDEgPDwgMTYpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfTElTVEVOSU5HCQkoMiA8PCAxNikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0xPT0tVUF9TVEFURV9MRUFSTklORwkJKDMgPDwgMTYpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9MT09LVVBfU1RBVEVfRk9SV0FSRAkJKDQgPDwgMTYpCisjZGVmaW5lICAgUUNBOEtfUE9SVF9MT09LVVBfU1RBVEUJCQlHRU5NQVNLKDE4LCAxNikKKyNkZWZpbmUgICBRQ0E4S19QT1JUX0xPT0tVUF9MRUFSTgkJCUJJVCgyMCkKKworLyogUGt0IGVkaXQgcmVnaXN0ZXJzICovCisjZGVmaW5lIFFDQThLX0VHUkVTU19WTEFOKHgpCQkJCSgweDBjNzAgKyAoNCAqICh4IC8gMikpKQorCisvKiBMMyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUUNBOEtfSFJPVVRFUl9DT05UUk9MCQkJCTB4ZTAwCisjZGVmaW5lICAgUUNBOEtfSFJPVVRFUl9DT05UUk9MX0dMQl9MT0NLVElNRV9NCQlHRU5NQVNLKDE3LCAxNikKKyNkZWZpbmUgICBRQ0E4S19IUk9VVEVSX0NPTlRST0xfR0xCX0xPQ0tUSU1FX1MJCTE2CisjZGVmaW5lICAgUUNBOEtfSFJPVVRFUl9DT05UUk9MX0FSUF9BR0VfTU9ERQkJMQorI2RlZmluZSBRQ0E4S19IUk9VVEVSX1BCQVNFRF9DT05UUk9MMQkJCTB4ZTA4CisjZGVmaW5lIFFDQThLX0hST1VURVJfUEJBU0VEX0NPTlRST0wyCQkJMHhlMGMKKyNkZWZpbmUgUUNBOEtfSE5BVF9DT05UUk9MCQkJCTB4ZTM4CisKKy8qIE1JQiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUUNBOEtfUE9SVF9NSUJfQ09VTlRFUihfaSkJCQkoMHgxMDAwICsgKF9pKSAqIDB4MTAwKQorCisvKiBRQ0Egc3BlY2lmaWMgTUlJIHJlZ2lzdGVycyAqLworI2RlZmluZSBNSUlfQVRIX01NRF9BRERSCQkJCTB4MGQKKyNkZWZpbmUgTUlJX0FUSF9NTURfREFUQQkJCQkweDBlCisKK2VudW0geworCVFDQThLX1BPUlRfU1BFRURfMTBNID0gMCwKKwlRQ0E4S19QT1JUX1NQRUVEXzEwME0gPSAxLAorCVFDQThLX1BPUlRfU1BFRURfMTAwME0gPSAyLAorCVFDQThLX1BPUlRfU1BFRURfRVJSID0gMywKK307CisKK2VudW0gcWNhOGtfZmRiX2NtZCB7CisJUUNBOEtfRkRCX0ZMVVNICT0gMSwKKwlRQ0E4S19GREJfTE9BRCA9IDIsCisJUUNBOEtfRkRCX1BVUkdFID0gMywKKwlRQ0E4S19GREJfTkVYVCA9IDYsCisJUUNBOEtfRkRCX1NFQVJDSCA9IDcsCit9OworCitzdHJ1Y3QgYXI4eHh4X3BvcnRfc3RhdHVzIHsKKwlzdHJ1Y3QgZXRodG9vbF9lZWUgZWVlOworCXN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2VfZGV2OworCWludCBlbmFibGVkOworfTsKKworc3RydWN0IHFjYThrX3ByaXYgeworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgbWlpX2J1cyAqYnVzOworCXN0cnVjdCBhcjh4eHhfcG9ydF9zdGF0dXMgcG9ydF9zdHNbUUNBOEtfTlVNX1BPUlRTXTsKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHM7CisJc3RydWN0IG11dGV4IHJlZ19tdXRleDsKK307CisKK3N0cnVjdCBxY2E4a19taWJfZGVzYyB7CisJdW5zaWduZWQgaW50IHNpemU7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RydWN0IHFjYThrX2ZkYiB7CisJdTE2IHZpZDsKKwl1OCBwb3J0X21hc2s7CisJdTggYWdpbmc7CisJdTggbWFjWzZdOworfTsKKworI2VuZGlmIC8qIF9fUUNBOEtfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvM2NvbS8zYzU5eC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvM2NvbS8zYzU5eC5jCmluZGV4IDI1YzU1YWIuLjkxMzNlNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1OXguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tLzNjNTl4LmMKQEAgLTMwODksNyArMzA4OSw3IEBACiAJaW93cml0ZTE2KG5ld19tb2RlLCBpb2FkZHIgKyBFTDNfQ01EKTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1ZMQU5fODAyMVEpCiAvKiBTZXR1cCB0aGUgY2FyZCBzbyB0aGF0IGl0IGNhbiByZWNlaXZlIGZyYW1lcyB3aXRoIGFuIDgwMi4xcSBWTEFOIHRhZy4KICAgIE5vdGUgdGhhdCB0aGlzIG11c3QgYmUgZG9uZSBhZnRlciBlYWNoIFJ4UmVzZXQgZHVlIHRvIHNvbWUgYmFja3dhcmRzCiAgICBjb21wYXRpYmlsaXR5IGxvZ2ljIGluIHRoZSBDeWNsb25lIGFuZCBUb3JuYWRvIEFTSUNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvS2NvbmZpZwppbmRleCAyZmZkNjM0Li44Y2M3NDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L0tjb25maWcKQEAgLTI0LDYgKzI0LDcgQEAKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvYWxsd2lubmVyL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L2FsdGVvbi9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9hbHRlcmEvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvTWFrZWZpbGUKaW5kZXggMWQzNDllOS4uYTA5NDIzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvTWFrZWZpbGUKQEAgLTEwLDYgKzEwLDcgQEAKIG9iai0kKENPTkZJR19ORVRfVkVORE9SX0FMTFdJTk5FUikgKz0gYWxsd2lubmVyLwogb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfQUxURU9OKSArPSBhbHRlb24vCiBvYmotJChDT05GSUdfQUxURVJBX1RTRSkgKz0gYWx0ZXJhLworb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfQU1BWk9OKSArPSBhbWF6b24vCiBvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9BTUQpICs9IGFtZC8KIG9iai0kKENPTkZJR19ORVRfWEdFTkUpICs9IGFwbS8KIG9iai0kKENPTkZJR19ORVRfVkVORE9SX0FQUExFKSArPSBhcHBsZS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkYXB0ZWMvc3RhcmZpcmUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkYXB0ZWMvc3RhcmZpcmUuYwppbmRleCAxZDEwNjk2Li44YWYyYzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZGFwdGVjL3N0YXJmaXJlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRhcHRlYy9zdGFyZmlyZS5jCkBAIC02Niw3ICs2Niw3IEBACiAgKi8KICNkZWZpbmUgWkVST0NPUFkKIAotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1ZMQU5fODAyMVEpCiAjZGVmaW5lIFZMQU5fU1VQUE9SVAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkaS9iZmluX21hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRpL2JmaW5fbWFjLmMKaW5kZXggMzhlYWVhMS4uMDBmOWVlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRpL2JmaW5fbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRpL2JmaW5fbWFjLmMKQEAgLTE5Miw4ICsxOTIsOCBAQAogCQkJZ290byBpbml0X2Vycm9yOwogCiAJCXNrYl9yZXNlcnZlKG5ld19za2IsIE5FVF9JUF9BTElHTik7Ci0JCS8qIEludmlkYXRlIHRoZSBkYXRhIGNhY2hlIG9mIHNrYi0+ZGF0YSByYW5nZSB3aGVuIGl0IGlzIHdyaXRlIGJhY2sKLQkJICogY2FjaGUuIEl0IHdpbGwgcHJldmVudCBvdmVyd3JpdHRpbmcgdGhlIG5ldyBkYXRhIGZyb20gRE1BCisJCS8qIEludmFsaWRhdGUgdGhlIGRhdGEgY2FjaGUgb2Ygc2tiLT5kYXRhIHJhbmdlIHdoZW4gaXQgaXMgd3JpdGUgYmFjaworCQkgKiBjYWNoZS4gSXQgd2lsbCBwcmV2ZW50IG92ZXJ3cml0aW5nIHRoZSBuZXcgZGF0YSBmcm9tIERNQQogCQkgKi8KIAkJYmxhY2tmaW5fZGNhY2hlX2ludmFsaWRhdGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpbmV3X3NrYi0+aGVhZCwKIAkJCQkJICh1bnNpZ25lZCBsb25nKW5ld19za2ItPmVuZCk7CkBAIC0xMjA1LDcgKzEyMDUsNyBAQAogCX0KIAkvKiByZXNlcnZlIDIgYnl0ZXMgZm9yIFJYRFdBIHBhZGRpbmcgKi8KIAlza2JfcmVzZXJ2ZShuZXdfc2tiLCBORVRfSVBfQUxJR04pOwotCS8qIEludmlkYXRlIHRoZSBkYXRhIGNhY2hlIG9mIHNrYi0+ZGF0YSByYW5nZSB3aGVuIGl0IGlzIHdyaXRlIGJhY2sKKwkvKiBJbnZhbGlkYXRlIHRoZSBkYXRhIGNhY2hlIG9mIHNrYi0+ZGF0YSByYW5nZSB3aGVuIGl0IGlzIHdyaXRlIGJhY2sKIAkgKiBjYWNoZS4gSXQgd2lsbCBwcmV2ZW50IG92ZXJ3cml0dGluZyB0aGUgbmV3IGRhdGEgZnJvbSBETUEKIAkgKi8KIAlibGFja2Zpbl9kY2FjaGVfaW52YWxpZGF0ZV9yYW5nZSgodW5zaWduZWQgbG9uZyluZXdfc2tiLT5oZWFkLApAQCAtMTU5OSw3ICsxNTk5LDcgQEAKIAkqKF9fbGUxNiAqKSAoJihuZGV2LT5kZXZfYWRkcls0XSkpID0gY3B1X3RvX2xlMTYoKHUxNikgYmZpbl9yZWFkX0VNQUNfQUREUkhJKCkpOwogCiAJLyogcHJvYmUgbWFjICovCi0JLyp0b2RvOiBob3cgdG8gcHJvYmxlPyB3aGljaCBpcyByZXZpc2lvbl9yZWdpc3RlciAqLworCS8qdG9kbzogaG93IHRvIHByb2JlPyB3aGljaCBpcyByZXZpc2lvbl9yZWdpc3RlciAqLwogCWJmaW5fd3JpdGVfRU1BQ19BRERSTE8oMHgxMjM0NTY3OCk7CiAJaWYgKGJmaW5fcmVhZF9FTUFDX0FERFJMTygpICE9IDB4MTIzNDU2NzgpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGRldGVjdCBCbGFja2ZpbiBvbi1jaGlwIGV0aGVybmV0IE1BQyBjb250cm9sbGVyIVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC9ncmV0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWVyb2ZsZXgvZ3JldGguYwppbmRleCBiY2EwN2M1Li5mOGRmODI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC9ncmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4L2dyZXRoLmMKQEAgLTExMDUsMjcgKzExMDUsNiBAQAogCXN0cnVjdCBncmV0aF9wcml2YXRlICpncmV0aCA9IG5ldGRldl9wcml2KGRldik7CiAJZ3JldGgtPm1zZ19lbmFibGUgPSB2YWx1ZTsKIH0KLXN0YXRpYyBpbnQgZ3JldGhfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQotewotCXN0cnVjdCBncmV0aF9wcml2YXRlICpncmV0aCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeSA9IGdyZXRoLT5waHk7Ci0KLQlpZiAoIXBoeSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwaHksIGNtZCk7Ci19Ci0KLXN0YXRpYyBpbnQgZ3JldGhfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQotewotCXN0cnVjdCBncmV0aF9wcml2YXRlICpncmV0aCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeSA9IGdyZXRoLT5waHk7Ci0KLQlpZiAoIXBoeSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwaHksIGNtZCk7Ci19CiAKIHN0YXRpYyBpbnQgZ3JldGhfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0xMTU3LDEyICsxMTM2LDEyIEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGdyZXRoX2V0aHRvb2xfb3BzID0gewogCS5nZXRfbXNnbGV2ZWwJCT0gZ3JldGhfZ2V0X21zZ2xldmVsLAogCS5zZXRfbXNnbGV2ZWwJCT0gZ3JldGhfc2V0X21zZ2xldmVsLAotCS5nZXRfc2V0dGluZ3MJCT0gZ3JldGhfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJCT0gZ3JldGhfc2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbwkJPSBncmV0aF9nZXRfZHJ2aW5mbywKIAkuZ2V0X3JlZ3NfbGVuICAgICAgICAgICA9IGdyZXRoX2dldF9yZWdzX2xlbiwKIAkuZ2V0X3JlZ3MgICAgICAgICAgICAgICA9IGdyZXRoX2dldF9yZWdzLAogCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfbGlua19rc2V0dGluZ3MJPSBwaHlfZXRodG9vbF9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncwk9IHBoeV9ldGh0b29sX3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZ3JldGhfbmV0ZGV2X29wcyA9IHsKQEAgLTEyMjQsNyArMTIwMyw3IEBACiBzdGF0aWMgdm9pZCBncmV0aF9saW5rX2NoYW5nZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBncmV0aF9wcml2YXRlICpncmV0aCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGdyZXRoLT5waHk7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGRldi0+cGh5ZGV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN0YXR1c19jaGFuZ2UgPSAwOwogCXUzMiBjdHJsOwpAQCAtMTMwNyw3ICsxMjg2LDYgQEAKIAlncmV0aC0+bGluayA9IDA7CiAJZ3JldGgtPnNwZWVkID0gMDsKIAlncmV0aC0+ZHVwbGV4ID0gLTE7Ci0JZ3JldGgtPnBoeSA9IHBoeTsKIAogCXJldHVybiAwOwogfQpAQCAtMTMyNSw2ICsxMzAzLDcgQEAKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGdyZXRoLT5uZXRkZXY7CiAKIAlncmV0aC0+bWRpbyA9IG1kaW9idXNfYWxsb2MoKTsKIAlpZiAoIWdyZXRoLT5tZGlvKSB7CkBAIC0xMzQ5LDE1ICsxMzI4LDE2IEBACiAJCWdvdG8gdW5yZWdfbWRpbzsKIAl9CiAKLQlwaHlfc3RhcnQoZ3JldGgtPnBoeSk7CisJcGh5X3N0YXJ0KG5kZXYtPnBoeWRldik7CiAKIAkvKiBJZiBFdGhlcm5ldCBkZWJ1ZyBsaW5rIGlzIHVzZWQgbWFrZSBhdXRvbmVnIGhhcHBlbiByaWdodCBhd2F5ICovCiAJaWYgKGdyZXRoLT5lZGNsICYmIGdyZXRoX2VkY2wgPT0gMSkgewotCQlwaHlfc3RhcnRfYW5lZyhncmV0aC0+cGh5KTsKKwkJcGh5X3N0YXJ0X2FuZWcobmRldi0+cGh5ZGV2KTsKIAkJdGltZW91dCA9IGppZmZpZXMgKyA2KkhaOwotCQl3aGlsZSAoIXBoeV9hbmVnX2RvbmUoZ3JldGgtPnBoeSkgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJd2hpbGUgKCFwaHlfYW5lZ19kb25lKG5kZXYtPnBoeWRldikgJiYKKwkJICAgICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCX0KLQkJcGh5X3JlYWRfc3RhdHVzKGdyZXRoLT5waHkpOworCQlwaHlfcmVhZF9zdGF0dXMobmRldi0+cGh5ZGV2KTsKIAkJZ3JldGhfbGlua19jaGFuZ2UoZ3JldGgtPm5ldGRldik7CiAJfQogCkBAIC0xNTY5LDggKzE1NDksOCBAQAogCiAJZG1hX2ZyZWVfY29oZXJlbnQoJm9mX2Rldi0+ZGV2LCAxMDI0LCBncmV0aC0+dHhfYmRfYmFzZSwgZ3JldGgtPnR4X2JkX2Jhc2VfcGh5cyk7CiAKLQlpZiAoZ3JldGgtPnBoeSkKLQkJcGh5X3N0b3AoZ3JldGgtPnBoeSk7CisJaWYgKG5kZXYtPnBoeWRldikKKwkJcGh5X3N0b3AobmRldi0+cGh5ZGV2KTsKIAltZGlvYnVzX3VucmVnaXN0ZXIoZ3JldGgtPm1kaW8pOwogCiAJdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC9ncmV0aC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWVyb2ZsZXgvZ3JldGguaAppbmRleCA5MmRkOTE4Li45YzA3MTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC9ncmV0aC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4L2dyZXRoLmgKQEAgLTEyMyw3ICsxMjMsNiBAQAogCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOwogCXNwaW5sb2NrX3QgZGV2bG9jazsKIAotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHk7CiAJc3RydWN0IG1paV9idXMgKm1kaW87CiAJdW5zaWduZWQgaW50IGxpbms7CiAJdW5zaWduZWQgaW50IHNwZWVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWdlcmUvZXQxMzF4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZ2VyZS9ldDEzMXguYwppbmRleCBjODNlYmFlLi45MDY2ODM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZ2VyZS9ldDEzMXguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZ2VyZS9ldDEzMXguYwpAQCAtMjk2MSw3ICsyOTYxLDcgQEAKIAkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXQxMzF4X2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBldDEzMXhfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCT0gZXQxMzF4X2dldF9kcnZpbmZvLAogCS5nZXRfcmVnc19sZW4JPSBldDEzMXhfZ2V0X3JlZ3NfbGVuLAogCS5nZXRfcmVncwk9IGV0MTMxeF9nZXRfcmVncywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliMzAzNTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vS2NvbmZpZwpAQCAtMCwwICsxLDI3IEBACisjCisjIEFtYXpvbiBuZXR3b3JrIGRldmljZSBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBORVRfVkVORE9SX0FNQVpPTgorCWJvb2wgIkFtYXpvbiBEZXZpY2VzIgorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIElmIHlvdSBoYXZlIGEgbmV0d29yayAoRXRoZXJuZXQpIGRldmljZSBiZWxvbmdpbmcgdG8gdGhpcyBjbGFzcywgc2F5IFkuCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gZG9lc24ndCBkaXJlY3RseSBhZmZlY3QgdGhlCisJICBrZXJuZWw6IHNheWluZyBOIHdpbGwganVzdCBjYXVzZSB0aGUgY29uZmlndXJhdG9yIHRvIHNraXAgYWxsCisJICB0aGUgcXVlc3Rpb25zIGFib3V0IEFtYXpvbiBkZXZpY2VzLiBJZiB5b3Ugc2F5IFksIHlvdSB3aWxsIGJlIGFza2VkCisJICBmb3IgeW91ciBzcGVjaWZpYyBkZXZpY2UgaW4gdGhlIGZvbGxvd2luZyBxdWVzdGlvbnMuCisKK2lmIE5FVF9WRU5ET1JfQU1BWk9OCisKK2NvbmZpZyBFTkFfRVRIRVJORVQKKwl0cmlzdGF0ZSAiRWxhc3RpYyBOZXR3b3JrIEFkYXB0ZXIgKEVOQSkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIChQQ0lfTVNJICYmIFg4NikKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBFbGFzdGljIE5ldHdvcmsgQWRhcHRlciAoRU5BKSIKKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4KKwkgIFRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZW5hLgorCitlbmRpZiAjTkVUX1ZFTkRPUl9BTUFaT04KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTBiNzNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIEFtYXpvbiBuZXR3b3JrIGRldmljZSBkcml2ZXJzLgorIworCitvYmotJChDT05GSUdfRU5BX0VUSEVSTkVUKSArPSBlbmEvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWVlYWUwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgRWxhc3RpYyBOZXR3b3JrIEFkYXB0ZXIgKEVOQSkgZGV2aWNlIGRyaXZlcnMuCisjCisKK29iai0kKENPTkZJR19FTkFfRVRIRVJORVQpICs9IGVuYS5vCisKK2VuYS15IDo9IGVuYV9uZXRkZXYubyBlbmFfY29tLm8gZW5hX2V0aF9jb20ubyBlbmFfZXRodG9vbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9hZG1pbl9kZWZzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9hZG1pbl9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2ZTc0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2FkbWluX2RlZnMuaApAQCAtMCwwICsxLDk3MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IC0gMjAxNiBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9FTkFfQURNSU5fSF8KKyNkZWZpbmUgX0VOQV9BRE1JTl9IXworCitlbnVtIGVuYV9hZG1pbl9hcV9vcGNvZGUgeworCUVOQV9BRE1JTl9DUkVBVEVfU1EJPSAxLAorCisJRU5BX0FETUlOX0RFU1RST1lfU1EJPSAyLAorCisJRU5BX0FETUlOX0NSRUFURV9DUQk9IDMsCisKKwlFTkFfQURNSU5fREVTVFJPWV9DUQk9IDQsCisKKwlFTkFfQURNSU5fR0VUX0ZFQVRVUkUJPSA4LAorCisJRU5BX0FETUlOX1NFVF9GRUFUVVJFCT0gOSwKKworCUVOQV9BRE1JTl9HRVRfU1RBVFMJPSAxMSwKK307CisKK2VudW0gZW5hX2FkbWluX2FxX2NvbXBsZXRpb25fc3RhdHVzIHsKKwlFTkFfQURNSU5fU1VDQ0VTUwkJCT0gMCwKKworCUVOQV9BRE1JTl9SRVNPVVJDRV9BTExPQ0FUSU9OX0ZBSUxVUkUJPSAxLAorCisJRU5BX0FETUlOX0JBRF9PUENPREUJCQk9IDIsCisKKwlFTkFfQURNSU5fVU5TVVBQT1JURURfT1BDT0RFCQk9IDMsCisKKwlFTkFfQURNSU5fTUFMRk9STUVEX1JFUVVFU1QJCT0gNCwKKworCS8qIEFkZGl0aW9uYWwgc3RhdHVzIGlzIHByb3ZpZGVkIGluIEFDUSBlbnRyeSBleHRlbmRlZF9zdGF0dXMgKi8KKwlFTkFfQURNSU5fSUxMRUdBTF9QQVJBTUVURVIJCT0gNSwKKworCUVOQV9BRE1JTl9VTktOT1dOX0VSUk9SCQkJPSA2LAorfTsKKworZW51bSBlbmFfYWRtaW5fYXFfZmVhdHVyZV9pZCB7CisJRU5BX0FETUlOX0RFVklDRV9BVFRSSUJVVEVTCQk9IDEsCisKKwlFTkFfQURNSU5fTUFYX1FVRVVFU19OVU0JCT0gMiwKKworCUVOQV9BRE1JTl9SU1NfSEFTSF9GVU5DVElPTgkJPSAxMCwKKworCUVOQV9BRE1JTl9TVEFURUxFU1NfT0ZGTE9BRF9DT05GSUcJPSAxMSwKKworCUVOQV9BRE1JTl9SU1NfUkVESVJFQ1RJT05fVEFCTEVfQ09ORklHCT0gMTIsCisKKwlFTkFfQURNSU5fTVRVCQkJCT0gMTQsCisKKwlFTkFfQURNSU5fUlNTX0hBU0hfSU5QVVQJCT0gMTgsCisKKwlFTkFfQURNSU5fSU5URVJSVVBUX01PREVSQVRJT04JCT0gMjAsCisKKwlFTkFfQURNSU5fQUVOUV9DT05GSUcJCQk9IDI2LAorCisJRU5BX0FETUlOX0xJTktfQ09ORklHCQkJPSAyNywKKworCUVOQV9BRE1JTl9IT1NUX0FUVFJfQ09ORklHCQk9IDI4LAorCisJRU5BX0FETUlOX0ZFQVRVUkVTX09QQ09ERV9OVU0JCT0gMzIsCit9OworCitlbnVtIGVuYV9hZG1pbl9wbGFjZW1lbnRfcG9saWN5X3R5cGUgeworCS8qIGRlc2NyaXB0b3JzIGFuZCBoZWFkZXJzIGFyZSBpbiBob3N0IG1lbW9yeSAqLworCUVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0hPU1QJPSAxLAorCisJLyogZGVzY3JpcHRvcnMgYW5kIGhlYWRlcnMgYXJlIGluIGRldmljZSBtZW1vcnkgKGEuay5hIExvdyBMYXRlbmN5CisJICogUXVldWUpCisJICovCisJRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfREVWCT0gMywKK307CisKK2VudW0gZW5hX2FkbWluX2xpbmtfdHlwZXMgeworCUVOQV9BRE1JTl9MSU5LX1NQRUVEXzFHCQk9IDB4MSwKKworCUVOQV9BRE1JTl9MSU5LX1NQRUVEXzJfSEFMRl9HCT0gMHgyLAorCisJRU5BX0FETUlOX0xJTktfU1BFRURfNUcJCT0gMHg0LAorCisJRU5BX0FETUlOX0xJTktfU1BFRURfMTBHCT0gMHg4LAorCisJRU5BX0FETUlOX0xJTktfU1BFRURfMjVHCT0gMHgxMCwKKworCUVOQV9BRE1JTl9MSU5LX1NQRUVEXzQwRwk9IDB4MjAsCisKKwlFTkFfQURNSU5fTElOS19TUEVFRF81MEcJPSAweDQwLAorCisJRU5BX0FETUlOX0xJTktfU1BFRURfMTAwRwk9IDB4ODAsCisKKwlFTkFfQURNSU5fTElOS19TUEVFRF8yMDBHCT0gMHgxMDAsCisKKwlFTkFfQURNSU5fTElOS19TUEVFRF80MDBHCT0gMHgyMDAsCit9OworCitlbnVtIGVuYV9hZG1pbl9jb21wbGV0aW9uX3BvbGljeV90eXBlIHsKKwkvKiBjb21wbGV0aW9uIHF1ZXVlIGVudHJ5IGZvciBlYWNoIHNxIGRlc2NyaXB0b3IgKi8KKwlFTkFfQURNSU5fQ09NUExFVElPTl9QT0xJQ1lfREVTQwkJPSAwLAorCisJLyogY29tcGxldGlvbiBxdWV1ZSBlbnRyeSB1cG9uIHJlcXVlc3QgaW4gc3EgZGVzY3JpcHRvciAqLworCUVOQV9BRE1JTl9DT01QTEVUSU9OX1BPTElDWV9ERVNDX09OX0RFTUFORAk9IDEsCisKKwkvKiBjdXJyZW50IHF1ZXVlIGhlYWQgcG9pbnRlciBpcyB1cGRhdGVkIGluIE9TIG1lbW9yeSB1cG9uIHNxCisJICogZGVzY3JpcHRvciByZXF1ZXN0CisJICovCisJRU5BX0FETUlOX0NPTVBMRVRJT05fUE9MSUNZX0hFQURfT05fREVNQU5ECT0gMiwKKworCS8qIGN1cnJlbnQgcXVldWUgaGVhZCBwb2ludGVyIGlzIHVwZGF0ZWQgaW4gT1MgbWVtb3J5IGZvciBlYWNoIHNxCisJICogZGVzY3JpcHRvcgorCSAqLworCUVOQV9BRE1JTl9DT01QTEVUSU9OX1BPTElDWV9IRUFECQk9IDMsCit9OworCisvKiBiYXNpYyBzdGF0cyByZXR1cm4gZW5hX2FkbWluX2Jhc2ljX3N0YXRzIHdoaWxlIGV4dGFuZGVkIHN0YXRzIHJldHVybiBhCisgKiBidWZmZXIgKHN0cmluZyBmb3JtYXQpIHdpdGggYWRkaXRpb25hbCBzdGF0aXN0aWNzIHBlciBxdWV1ZSBhbmQgcGVyCisgKiBkZXZpY2UgaWQKKyAqLworZW51bSBlbmFfYWRtaW5fZ2V0X3N0YXRzX3R5cGUgeworCUVOQV9BRE1JTl9HRVRfU1RBVFNfVFlQRV9CQVNJQwkJPSAwLAorCisJRU5BX0FETUlOX0dFVF9TVEFUU19UWVBFX0VYVEVOREVECT0gMSwKK307CisKK2VudW0gZW5hX2FkbWluX2dldF9zdGF0c19zY29wZSB7CisJRU5BX0FETUlOX1NQRUNJRklDX1FVRVVFCT0gMCwKKworCUVOQV9BRE1JTl9FVEhfVFJBRkZJQwkJPSAxLAorfTsKKworc3RydWN0IGVuYV9hZG1pbl9hcV9jb21tb25fZGVzYyB7CisJLyogMTE6MCA6IGNvbW1hbmRfaWQKKwkgKiAxNToxMiA6IHJlc2VydmVkMTIKKwkgKi8KKwl1MTYgY29tbWFuZF9pZDsKKworCS8qIGFzIGFwcGVhcnMgaW4gZW5hX2FkbWluX2FxX29wY29kZSAqLworCXU4IG9wY29kZTsKKworCS8qIDAgOiBwaGFzZQorCSAqIDEgOiBjdHJsX2RhdGEgLSBjb250cm9sIGJ1ZmZlciBhZGRyZXNzIHZhbGlkCisJICogMiA6IGN0cmxfZGF0YV9pbmRpcmVjdCAtIGNvbnRyb2wgYnVmZmVyIGFkZHJlc3MKKwkgKiAgICBwb2ludHMgdG8gbGlzdCBvZiBwYWdlcyB3aXRoIGFkZHJlc3NlcyBvZiBjb250cm9sCisJICogICAgYnVmZmVycworCSAqIDc6MyA6IHJlc2VydmVkMworCSAqLworCXU4IGZsYWdzOworfTsKKworLyogdXNlZCBpbiBlbmFfYWRtaW5fYXFfZW50cnkuIENhbiBwb2ludCBkaXJlY3RseSB0byBjb250cm9sIGRhdGEsIG9yIHRvIGEKKyAqIHBhZ2UgbGlzdCBjaHVuay4gVXNlZCBhbHNvIGF0IHRoZSBlbmQgb2YgaW5kaXJlY3QgbW9kZSBwYWdlIGxpc3QgY2h1bmtzLAorICogZm9yIGNoYWluaW5nLgorICovCitzdHJ1Y3QgZW5hX2FkbWluX2N0cmxfYnVmZl9pbmZvIHsKKwl1MzIgbGVuZ3RoOworCisJc3RydWN0IGVuYV9jb21tb25fbWVtX2FkZHIgYWRkcmVzczsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fc3EgeworCXUxNiBzcV9pZHg7CisKKwkvKiA0OjAgOiByZXNlcnZlZAorCSAqIDc6NSA6IHNxX2RpcmVjdGlvbiAtIDB4MSAtIFR4OyAweDIgLSBSeAorCSAqLworCXU4IHNxX2lkZW50aXR5OworCisJdTggcmVzZXJ2ZWQxOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSB7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9jb21tb25fZGVzYyBhcV9jb21tb25fZGVzY3JpcHRvcjsKKworCXVuaW9uIHsKKwkJdTMyIGlubGluZV9kYXRhX3cxWzNdOworCisJCXN0cnVjdCBlbmFfYWRtaW5fY3RybF9idWZmX2luZm8gY29udHJvbF9idWZmZXI7CisJfSB1OworCisJdTMyIGlubGluZV9kYXRhX3c0WzEyXTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYWNxX2NvbW1vbl9kZXNjIHsKKwkvKiBjb21tYW5kIGlkZW50aWZpZXIgdG8gYXNzb2NpYXRlIGl0IHdpdGggdGhlIGFxIGRlc2NyaXB0b3IKKwkgKiAxMTowIDogY29tbWFuZF9pZAorCSAqIDE1OjEyIDogcmVzZXJ2ZWQxMgorCSAqLworCXUxNiBjb21tYW5kOworCisJdTggc3RhdHVzOworCisJLyogMCA6IHBoYXNlCisJICogNzoxIDogcmVzZXJ2ZWQxCisJICovCisJdTggZmxhZ3M7CisKKwl1MTYgZXh0ZW5kZWRfc3RhdHVzOworCisJLyogc2VydmVzIGFzIGEgaGludCB3aGF0IEFRIGVudHJpZXMgY2FuIGJlIHJldm9rZWQgKi8KKwl1MTYgc3FfaGVhZF9pbmR4OworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgeworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2NvbW1vbl9kZXNjIGFjcV9jb21tb25fZGVzY3JpcHRvcjsKKworCXUzMiByZXNwb25zZV9zcGVjaWZpY19kYXRhWzE0XTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYXFfY3JlYXRlX3NxX2NtZCB7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9jb21tb25fZGVzYyBhcV9jb21tb25fZGVzY3JpcHRvcjsKKworCS8qIDQ6MCA6IHJlc2VydmVkMF93MQorCSAqIDc6NSA6IHNxX2RpcmVjdGlvbiAtIDB4MSAtIFR4LCAweDIgLSBSeAorCSAqLworCXU4IHNxX2lkZW50aXR5OworCisJdTggcmVzZXJ2ZWQ4X3cxOworCisJLyogMzowIDogcGxhY2VtZW50X3BvbGljeSAtIERlc2NyaWJpbmcgd2hlcmUgdGhlIFNRCisJICogICAgZGVzY3JpcHRvciByaW5nIGFuZCB0aGUgU1EgcGFja2V0IGhlYWRlcnMgcmVzaWRlOgorCSAqICAgIDB4MSAtIGRlc2NyaXB0b3JzIGFuZCBoZWFkZXJzIGFyZSBpbiBPUyBtZW1vcnksCisJICogICAgMHgzIC0gZGVzY3JpcHRvcnMgYW5kIGhlYWRlcnMgaW4gZGV2aWNlIG1lbW9yeQorCSAqICAgIChhLmsuYSBMb3cgTGF0ZW5jeSBRdWV1ZSkKKwkgKiA2OjQgOiBjb21wbGV0aW9uX3BvbGljeSAtIERlc2NyaWJpbmcgd2hhdCBwb2xpY3kKKwkgKiAgICB0byB1c2UgZm9yIGdlbmVyYXRpb24gY29tcGxldGlvbiBlbnRyeSAoY3FlKSBpbgorCSAqICAgIHRoZSBDUSBhc3NvY2lhdGVkIHdpdGggdGhpcyBTUTogMHgwIC0gY3FlIGZvciBlYWNoCisJICogICAgc3EgZGVzY3JpcHRvciwgMHgxIC0gY3FlIHVwb24gcmVxdWVzdCBpbiBzcQorCSAqICAgIGRlc2NyaXB0b3IsIDB4MiAtIGN1cnJlbnQgcXVldWUgaGVhZCBwb2ludGVyIGlzCisJICogICAgdXBkYXRlZCBpbiBPUyBtZW1vcnkgdXBvbiBzcSBkZXNjcmlwdG9yIHJlcXVlc3QKKwkgKiAgICAweDMgLSBjdXJyZW50IHF1ZXVlIGhlYWQgcG9pbnRlciBpcyB1cGRhdGVkIGluIE9TCisJICogICAgbWVtb3J5IGZvciBlYWNoIHNxIGRlc2NyaXB0b3IKKwkgKiA3IDogcmVzZXJ2ZWQxNV93MQorCSAqLworCXU4IHNxX2NhcHNfMjsKKworCS8qIDAgOiBpc19waHlzaWNhbGx5X2NvbnRpZ3VvdXMgLSBEZXNjcmliZWQgaWYgdGhlCisJICogICAgcXVldWUgcmluZyBtZW1vcnkgaXMgYWxsb2NhdGVkIGluIHBoeXNpY2FsCisJICogICAgY29udGlndW91cyBwYWdlcyBvciBzcGxpdC4KKwkgKiA3OjEgOiByZXNlcnZlZDE3X3cxCisJICovCisJdTggc3FfY2Fwc18zOworCisJLyogYXNzb2NpYXRlZCBjb21wbGV0aW9uIHF1ZXVlIGlkLiBUaGlzIENRIG11c3QgYmUgY3JlYXRlZCBwcmlvciB0bworCSAqICAgIFNRIGNyZWF0aW9uCisJICovCisJdTE2IGNxX2lkeDsKKworCS8qIHN1Ym1pc3Npb24gcXVldWUgZGVwdGggaW4gZW50cmllcyAqLworCXUxNiBzcV9kZXB0aDsKKworCS8qIFNRIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBpbiBPUyBtZW1vcnkuIFRoaXMgZmllbGQgc2hvdWxkIG5vdCBiZQorCSAqIHVzZWQgZm9yIExvdyBMYXRlbmN5IHF1ZXVlcy4gSGFzIHRvIGJlIHBhZ2UgYWxpZ25lZC4KKwkgKi8KKwlzdHJ1Y3QgZW5hX2NvbW1vbl9tZW1fYWRkciBzcV9iYTsKKworCS8qIHNwZWNpZmllcyBxdWV1ZSBoZWFkIHdyaXRlYmFjayBsb2NhdGlvbiBpbiBPUyBtZW1vcnkuIFZhbGlkIGlmCisJICogY29tcGxldGlvbl9wb2xpY3kgaXMgc2V0IHRvIGNvbXBsZXRpb25fcG9saWN5X2hlYWRfb25fZGVtYW5kIG9yCisJICogY29tcGxldGlvbl9wb2xpY3lfaGVhZC4gSGFzIHRvIGJlIGNhY2hlIGFsaWduZWQKKwkgKi8KKwlzdHJ1Y3QgZW5hX2NvbW1vbl9tZW1fYWRkciBzcV9oZWFkX3dyaXRlYmFjazsKKworCXUzMiByZXNlcnZlZDBfdzc7CisKKwl1MzIgcmVzZXJ2ZWQwX3c4OworfTsKKworZW51bSBlbmFfYWRtaW5fc3FfZGlyZWN0aW9uIHsKKwlFTkFfQURNSU5fU1FfRElSRUNUSU9OX1RYCT0gMSwKKworCUVOQV9BRE1JTl9TUV9ESVJFQ1RJT05fUlgJPSAyLAorfTsKKworc3RydWN0IGVuYV9hZG1pbl9hY3FfY3JlYXRlX3NxX3Jlc3BfZGVzYyB7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfY29tbW9uX2Rlc2MgYWNxX2NvbW1vbl9kZXNjOworCisJdTE2IHNxX2lkeDsKKworCXUxNiByZXNlcnZlZDsKKworCS8qIHF1ZXVlIGRvb3JiZWxsIGFkZHJlc3MgYXMgYW4gb2Zmc2V0IHRvIFBDSWUgTU1JTyBSRUcgQkFSICovCisJdTMyIHNxX2Rvb3JiZWxsX29mZnNldDsKKworCS8qIGxvdyBsYXRlbmN5IHF1ZXVlIHJpbmcgYmFzZSBhZGRyZXNzIGFzIGFuIG9mZnNldCB0byBQQ0llIE1NSU8KKwkgKiBMTFFfTUVNIEJBUgorCSAqLworCXUzMiBsbHFfZGVzY3JpcHRvcnNfb2Zmc2V0OworCisJLyogbG93IGxhdGVuY3kgcXVldWUgaGVhZGVycycgbWVtb3J5IGFzIGFuIG9mZnNldCB0byBQQ0llIE1NSU8KKwkgKiBMTFFfTUVNIEJBUgorCSAqLworCXUzMiBsbHFfaGVhZGVyc19vZmZzZXQ7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FxX2Rlc3Ryb3lfc3FfY21kIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2NvbW1vbl9kZXNjIGFxX2NvbW1vbl9kZXNjcmlwdG9yOworCisJc3RydWN0IGVuYV9hZG1pbl9zcSBzcTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fYWNxX2Rlc3Ryb3lfc3FfcmVzcF9kZXNjIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jb21tb25fZGVzYyBhY3FfY29tbW9uX2Rlc2M7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FxX2NyZWF0ZV9jcV9jbWQgeworCXN0cnVjdCBlbmFfYWRtaW5fYXFfY29tbW9uX2Rlc2MgYXFfY29tbW9uX2Rlc2NyaXB0b3I7CisKKwkvKiA0OjAgOiByZXNlcnZlZDUKKwkgKiA1IDogaW50ZXJydXB0X21vZGVfZW5hYmxlZCAtIGlmIHNldCwgY3Egb3BlcmF0ZXMKKwkgKiAgICBpbiBpbnRlcnJ1cHQgbW9kZSwgb3RoZXJ3aXNlIC0gcG9sbGluZworCSAqIDc6NiA6IHJlc2VydmVkNgorCSAqLworCXU4IGNxX2NhcHNfMTsKKworCS8qIDQ6MCA6IGNxX2VudHJ5X3NpemVfd29yZHMgLSBzaXplIG9mIENRIGVudHJ5IGluCisJICogICAgMzItYml0IHdvcmRzLCB2YWxpZCB2YWx1ZXM6IDQsIDguCisJICogNzo1IDogcmVzZXJ2ZWQ3CisJICovCisJdTggY3FfY2Fwc18yOworCisJLyogY29tcGxldGlvbiBxdWV1ZSBkZXB0aCBpbiAjIG9mIGVudHJpZXMuIG11c3QgYmUgcG93ZXIgb2YgMiAqLworCXUxNiBjcV9kZXB0aDsKKworCS8qIG1zaXggdmVjdG9yIGFzc2lnbmVkIHRvIHRoaXMgY3EgKi8KKwl1MzIgbXNpeF92ZWN0b3I7CisKKwkvKiBjcSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgaW4gT1MgbWVtb3J5LiBDUSBtdXN0IGJlIHBoeXNpY2FsbHkKKwkgKiBjb250aWd1b3VzCisJICovCisJc3RydWN0IGVuYV9jb21tb25fbWVtX2FkZHIgY3FfYmE7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jcmVhdGVfY3FfcmVzcF9kZXNjIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jb21tb25fZGVzYyBhY3FfY29tbW9uX2Rlc2M7CisKKwl1MTYgY3FfaWR4OworCisJLyogYWN0dWFsIGNxIGRlcHRoIGluIG51bWJlciBvZiBlbnRyaWVzICovCisJdTE2IGNxX2FjdHVhbF9kZXB0aDsKKworCXUzMiBudW1hX25vZGVfcmVnaXN0ZXJfb2Zmc2V0OworCisJdTMyIGNxX2hlYWRfZGJfcmVnaXN0ZXJfb2Zmc2V0OworCisJdTMyIGNxX2ludGVycnVwdF91bm1hc2tfcmVnaXN0ZXJfb2Zmc2V0OworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hcV9kZXN0cm95X2NxX2NtZCB7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9jb21tb25fZGVzYyBhcV9jb21tb25fZGVzY3JpcHRvcjsKKworCXUxNiBjcV9pZHg7CisKKwl1MTYgcmVzZXJ2ZWQxOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hY3FfZGVzdHJveV9jcV9yZXNwX2Rlc2MgeworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2NvbW1vbl9kZXNjIGFjcV9jb21tb25fZGVzYzsKK307CisKKy8qIEVOQSBBUSBHZXQgU3RhdGlzdGljcyBjb21tYW5kLiBFeHRlbmRlZCBzdGF0aXN0aWNzIGFyZSBwbGFjZWQgaW4gY29udHJvbAorICogYnVmZmVyIHBvaW50ZWQgYnkgQVEgZW50cnkKKyAqLworc3RydWN0IGVuYV9hZG1pbl9hcV9nZXRfc3RhdHNfY21kIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FxX2NvbW1vbl9kZXNjIGFxX2NvbW1vbl9kZXNjcmlwdG9yOworCisJdW5pb24geworCQkvKiBjb21tYW5kIHNwZWNpZmljIGlubGluZSBkYXRhICovCisJCXUzMiBpbmxpbmVfZGF0YV93MVszXTsKKworCQlzdHJ1Y3QgZW5hX2FkbWluX2N0cmxfYnVmZl9pbmZvIGNvbnRyb2xfYnVmZmVyOworCX0gdTsKKworCS8qIHN0YXRzIHR5cGUgYXMgZGVmaW5lZCBpbiBlbnVtIGVuYV9hZG1pbl9nZXRfc3RhdHNfdHlwZSAqLworCXU4IHR5cGU7CisKKwkvKiBzdGF0cyBzY29wZSBkZWZpbmVkIGluIGVudW0gZW5hX2FkbWluX2dldF9zdGF0c19zY29wZSAqLworCXU4IHNjb3BlOworCisJdTE2IHJlc2VydmVkMzsKKworCS8qIHF1ZXVlIGlkLiB1c2VkIHdoZW4gc2NvcGUgaXMgc3BlY2lmaWNfcXVldWUgKi8KKwl1MTYgcXVldWVfaWR4OworCisJLyogZGV2aWNlIGlkLCB2YWx1ZSAweEZGRkYgbWVhbnMgbWluZS4gb25seSBwcml2aWxlZ2VkIGRldmljZSBjYW4gZ2V0CisJICogICAgc3RhdHMgb2Ygb3RoZXIgZGV2aWNlCisJICovCisJdTE2IGRldmljZV9pZDsKK307CisKKy8qIEJhc2ljIFN0YXRpc3RpY3MgQ29tbWFuZC4gKi8KK3N0cnVjdCBlbmFfYWRtaW5fYmFzaWNfc3RhdHMgeworCXUzMiB0eF9ieXRlc19sb3c7CisKKwl1MzIgdHhfYnl0ZXNfaGlnaDsKKworCXUzMiB0eF9wa3RzX2xvdzsKKworCXUzMiB0eF9wa3RzX2hpZ2g7CisKKwl1MzIgcnhfYnl0ZXNfbG93OworCisJdTMyIHJ4X2J5dGVzX2hpZ2g7CisKKwl1MzIgcnhfcGt0c19sb3c7CisKKwl1MzIgcnhfcGt0c19oaWdoOworCisJdTMyIHJ4X2Ryb3BzX2xvdzsKKworCXUzMiByeF9kcm9wc19oaWdoOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hY3FfZ2V0X3N0YXRzX3Jlc3AgeworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2NvbW1vbl9kZXNjIGFjcV9jb21tb25fZGVzYzsKKworCXN0cnVjdCBlbmFfYWRtaW5fYmFzaWNfc3RhdHMgYmFzaWNfc3RhdHM7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2dldF9zZXRfZmVhdHVyZV9jb21tb25fZGVzYyB7CisJLyogMTowIDogc2VsZWN0IC0gMHgxIC0gY3VycmVudCB2YWx1ZTsgMHgzIC0gZGVmYXVsdAorCSAqICAgIHZhbHVlCisJICogNzozIDogcmVzZXJ2ZWQzCisJICovCisJdTggZmxhZ3M7CisKKwkvKiBhcyBhcHBlYXJzIGluIGVuYV9hZG1pbl9hcV9mZWF0dXJlX2lkICovCisJdTggZmVhdHVyZV9pZDsKKworCXUxNiByZXNlcnZlZDE2OworfTsKKworc3RydWN0IGVuYV9hZG1pbl9kZXZpY2VfYXR0cl9mZWF0dXJlX2Rlc2MgeworCXUzMiBpbXBsX2lkOworCisJdTMyIGRldmljZV92ZXJzaW9uOworCisJLyogYml0bWFwIG9mIGVuYV9hZG1pbl9hcV9mZWF0dXJlX2lkICovCisJdTMyIHN1cHBvcnRlZF9mZWF0dXJlczsKKworCXUzMiByZXNlcnZlZDM7CisKKwkvKiBJbmRpY2F0ZXMgaG93IG1hbnkgYml0cyBhcmUgdXNlZCBwaHlzaWNhbCBhZGRyZXNzIGFjY2Vzcy4gKi8KKwl1MzIgcGh5c19hZGRyX3dpZHRoOworCisJLyogSW5kaWNhdGVzIGhvdyBtYW55IGJpdHMgYXJlIHVzZWQgdmlydHVhbCBhZGRyZXNzIGFjY2Vzcy4gKi8KKwl1MzIgdmlydF9hZGRyX3dpZHRoOworCisJLyogdW5pY2FzdCBNQUMgYWRkcmVzcyAoaW4gTmV0d29yayBieXRlIG9yZGVyKSAqLworCXU4IG1hY19hZGRyWzZdOworCisJdTggcmVzZXJ2ZWQ3WzJdOworCisJdTMyIG1heF9tdHU7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX3F1ZXVlX2ZlYXR1cmVfZGVzYyB7CisJLyogaW5jbHVkaW5nIExMUXMgKi8KKwl1MzIgbWF4X3NxX251bTsKKworCXUzMiBtYXhfc3FfZGVwdGg7CisKKwl1MzIgbWF4X2NxX251bTsKKworCXUzMiBtYXhfY3FfZGVwdGg7CisKKwl1MzIgbWF4X2xscV9udW07CisKKwl1MzIgbWF4X2xscV9kZXB0aDsKKworCXUzMiBtYXhfaGVhZGVyX3NpemU7CisKKwkvKiBNYXhpbXVtIERlc2NyaXB0b3JzIG51bWJlciwgaW5jbHVkaW5nIG1ldGEgZGVzY3JpcHRvciwgYWxsb3dlZCBmb3IKKwkgKiAgICBhIHNpbmdsZSBUeCBwYWNrZXQKKwkgKi8KKwl1MTYgbWF4X3BhY2tldF90eF9kZXNjczsKKworCS8qIE1heGltdW0gRGVzY3JpcHRvcnMgbnVtYmVyIGFsbG93ZWQgZm9yIGEgc2luZ2xlIFJ4IHBhY2tldCAqLworCXUxNiBtYXhfcGFja2V0X3J4X2Rlc2NzOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdHVyZV9tdHVfZGVzYyB7CisJLyogZXhjbHVkZSBMMiAqLworCXUzMiBtdHU7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0dXJlX2hvc3RfYXR0cl9kZXNjIHsKKwkvKiBob3N0IE9TIGluZm8gYmFzZSBhZGRyZXNzIGluIE9TIG1lbW9yeS4gaG9zdCBpbmZvIGlzIDRLQiBvZgorCSAqIHBoeXNpY2FsbHkgY29udGlndW91cworCSAqLworCXN0cnVjdCBlbmFfY29tbW9uX21lbV9hZGRyIG9zX2luZm9fYmE7CisKKwkvKiBob3N0IGRlYnVnIGFyZWEgYmFzZSBhZGRyZXNzIGluIE9TIG1lbW9yeS4gZGVidWcgYXJlYSBtdXN0IGJlCisJICogcGh5c2ljYWxseSBjb250aWd1b3VzCisJICovCisJc3RydWN0IGVuYV9jb21tb25fbWVtX2FkZHIgZGVidWdfYmE7CisKKwkvKiBkZWJ1ZyBhcmVhIHNpemUgKi8KKwl1MzIgZGVidWdfYXJlYV9zaXplOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX2ludHJfbW9kZXJfZGVzYyB7CisJLyogaW50ZXJydXB0IGRlbGF5IGdyYW51bGFyaXR5IGluIHVzZWMgKi8KKwl1MTYgaW50cl9kZWxheV9yZXNvbHV0aW9uOworCisJdTE2IHJlc2VydmVkOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdHVyZV9saW5rX2Rlc2MgeworCS8qIExpbmsgc3BlZWQgaW4gTWIgKi8KKwl1MzIgc3BlZWQ7CisKKwkvKiBiaXQgZmllbGQgb2YgZW51bSBlbmFfYWRtaW5fbGluayB0eXBlcyAqLworCXUzMiBzdXBwb3J0ZWQ7CisKKwkvKiAwIDogYXV0b25lZworCSAqIDEgOiBkdXBsZXggLSBGdWxsIER1cGxleAorCSAqIDMxOjIgOiByZXNlcnZlZDIKKwkgKi8KKwl1MzIgZmxhZ3M7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfYWVucV9kZXNjIHsKKwkvKiBiaXRtYXNrIGZvciBBRU5RIGdyb3VwcyB0aGUgZGV2aWNlIGNhbiByZXBvcnQgKi8KKwl1MzIgc3VwcG9ydGVkX2dyb3VwczsKKworCS8qIGJpdG1hc2sgZm9yIEFFTlEgZ3JvdXBzIHRvIHJlcG9ydCAqLworCXUzMiBlbmFibGVkX2dyb3VwczsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9vZmZsb2FkX2Rlc2MgeworCS8qIDAgOiBUWF9MM19jc3VtX2lwdjQKKwkgKiAxIDogVFhfTDRfaXB2NF9jc3VtX3BhcnQgLSBUaGUgY2hlY2tzdW0gZmllbGQKKwkgKiAgICBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtCisJICogMiA6IFRYX0w0X2lwdjRfY3N1bV9mdWxsCisJICogMyA6IFRYX0w0X2lwdjZfY3N1bV9wYXJ0IC0gVGhlIGNoZWNrc3VtIGZpZWxkCisJICogICAgc2hvdWxkIGJlIGluaXRpYWxpemVkIHdpdGggcHNldWRvIGhlYWRlciBjaGVja3N1bQorCSAqIDQgOiBUWF9MNF9pcHY2X2NzdW1fZnVsbAorCSAqIDUgOiB0c29faXB2NAorCSAqIDYgOiB0c29faXB2NgorCSAqIDcgOiB0c29fZWNuCisJICovCisJdTMyIHR4OworCisJLyogUmVjZWl2ZSBzaWRlIHN1cHBvcnRlZCBzdGF0ZWxlc3Mgb2ZmbG9hZAorCSAqIDAgOiBSWF9MM19jc3VtX2lwdjQgLSBJUHY0IGNoZWNrc3VtCisJICogMSA6IFJYX0w0X2lwdjRfY3N1bSAtIFRDUC9VRFAvSVB2NCBjaGVja3N1bQorCSAqIDIgOiBSWF9MNF9pcHY2X2NzdW0gLSBUQ1AvVURQL0lQdjYgY2hlY2tzdW0KKwkgKiAzIDogUlhfaGFzaCAtIEhhc2ggY2FsY3VsYXRpb24KKwkgKi8KKwl1MzIgcnhfc3VwcG9ydGVkOworCisJdTMyIHJ4X2VuYWJsZWQ7Cit9OworCitlbnVtIGVuYV9hZG1pbl9oYXNoX2Z1bmN0aW9ucyB7CisJRU5BX0FETUlOX1RPRVBMSVRaCT0gMSwKKworCUVOQV9BRE1JTl9DUkMzMgkJPSAyLAorfTsKKworc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19mbG93X2hhc2hfY29udHJvbCB7CisJdTMyIGtleXNfbnVtOworCisJdTMyIHJlc2VydmVkOworCisJdTMyIGtleVsxMF07Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9mdW5jdGlvbiB7CisJLyogNzowIDogZnVuY3MgLSBiaXRtYXNrIG9mIGVuYV9hZG1pbl9oYXNoX2Z1bmN0aW9ucyAqLworCXUzMiBzdXBwb3J0ZWRfZnVuYzsKKworCS8qIDc6MCA6IHNlbGVjdGVkX2Z1bmMgLSBiaXRtYXNrIG9mCisJICogICAgZW5hX2FkbWluX2hhc2hfZnVuY3Rpb25zCisJICovCisJdTMyIHNlbGVjdGVkX2Z1bmM7CisKKwkvKiBpbml0aWFsIHZhbHVlICovCisJdTMyIGluaXRfdmFsOworfTsKKworLyogUlNTIGZsb3cgaGFzaCBwcm90b2NvbHMgKi8KK2VudW0gZW5hX2FkbWluX2Zsb3dfaGFzaF9wcm90byB7CisJRU5BX0FETUlOX1JTU19UQ1A0CT0gMCwKKworCUVOQV9BRE1JTl9SU1NfVURQNAk9IDEsCisKKwlFTkFfQURNSU5fUlNTX1RDUDYJPSAyLAorCisJRU5BX0FETUlOX1JTU19VRFA2CT0gMywKKworCUVOQV9BRE1JTl9SU1NfSVA0CT0gNCwKKworCUVOQV9BRE1JTl9SU1NfSVA2CT0gNSwKKworCUVOQV9BRE1JTl9SU1NfSVA0X0ZSQUcJPSA2LAorCisJRU5BX0FETUlOX1JTU19OT1RfSVAJPSA3LAorCisJRU5BX0FETUlOX1JTU19QUk9UT19OVU0JPSAxNiwKK307CisKKy8qIFJTUyBmbG93IGhhc2ggZmllbGRzICovCitlbnVtIGVuYV9hZG1pbl9mbG93X2hhc2hfZmllbGRzIHsKKwkvKiBFdGhlcm5ldCBEZXN0IEFkZHIgKi8KKwlFTkFfQURNSU5fUlNTX0wyX0RBCT0gMCwKKworCS8qIEV0aGVybmV0IFNyYyBBZGRyICovCisJRU5BX0FETUlOX1JTU19MMl9TQQk9IDEsCisKKwkvKiBpcHY0LzYgRGVzdCBBZGRyICovCisJRU5BX0FETUlOX1JTU19MM19EQQk9IDIsCisKKwkvKiBpcHY0LzYgU3JjIEFkZHIgKi8KKwlFTkFfQURNSU5fUlNTX0wzX1NBCT0gNSwKKworCS8qIHRjcC91ZHAgRGVzdCBQb3J0ICovCisJRU5BX0FETUlOX1JTU19MNF9EUAk9IDYsCisKKwkvKiB0Y3AvdWRwIFNyYyBQb3J0ICovCisJRU5BX0FETUlOX1JTU19MNF9TUAk9IDcsCit9OworCitzdHJ1Y3QgZW5hX2FkbWluX3Byb3RvX2lucHV0IHsKKwkvKiBmbG93IGhhc2ggZmllbGRzIChiaXR3aXNlIGFjY29yZGluZyB0byBlbmFfYWRtaW5fZmxvd19oYXNoX2ZpZWxkcykgKi8KKwl1MTYgZmllbGRzOworCisJdTE2IHJlc2VydmVkMjsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfaGFzaF9jb250cm9sIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX3Byb3RvX2lucHV0IHN1cHBvcnRlZF9maWVsZHNbRU5BX0FETUlOX1JTU19QUk9UT19OVU1dOworCisJc3RydWN0IGVuYV9hZG1pbl9wcm90b19pbnB1dCBzZWxlY3RlZF9maWVsZHNbRU5BX0FETUlOX1JTU19QUk9UT19OVU1dOworCisJc3RydWN0IGVuYV9hZG1pbl9wcm90b19pbnB1dCByZXNlcnZlZDJbRU5BX0FETUlOX1JTU19QUk9UT19OVU1dOworCisJc3RydWN0IGVuYV9hZG1pbl9wcm90b19pbnB1dCByZXNlcnZlZDNbRU5BX0FETUlOX1JTU19QUk9UT19OVU1dOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19mbG93X2hhc2hfaW5wdXQgeworCS8qIHN1cHBvcnRlZCBoYXNoIGlucHV0IHNvcnRpbmcKKwkgKiAxIDogTDNfc29ydCAtIHN1cHBvcnQgc3dhcCBMMyBhZGRyZXNzZXMgaWYgREEgaXMKKwkgKiAgICBzbWFsbGVyIHRoYW4gU0EKKwkgKiAyIDogTDRfc29ydCAtIHN1cHBvcnQgc3dhcCBMNCBwb3J0cyBpZiBEUCBzbWFsbGVyCisJICogICAgU1AKKwkgKi8KKwl1MTYgc3VwcG9ydGVkX2lucHV0X3NvcnQ7CisKKwkvKiBlbmFibGVkIGhhc2ggaW5wdXQgc29ydGluZworCSAqIDEgOiBlbmFibGVfTDNfc29ydCAtIGVuYWJsZSBzd2FwIEwzIGFkZHJlc3NlcyBpZgorCSAqICAgIERBIHNtYWxsZXIgdGhhbiBTQQorCSAqIDIgOiBlbmFibGVfTDRfc29ydCAtIGVuYWJsZSBzd2FwIEw0IHBvcnRzIGlmIERQCisJICogICAgc21hbGxlciB0aGFuIFNQCisJICovCisJdTE2IGVuYWJsZWRfaW5wdXRfc29ydDsKK307CisKK2VudW0gZW5hX2FkbWluX29zX3R5cGUgeworCUVOQV9BRE1JTl9PU19MSU5VWAk9IDEsCisKKwlFTkFfQURNSU5fT1NfV0lOCT0gMiwKKworCUVOQV9BRE1JTl9PU19EUERLCT0gMywKKworCUVOQV9BRE1JTl9PU19GUkVFQlNECT0gNCwKKworCUVOQV9BRE1JTl9PU19JUFhFCT0gNSwKK307CisKK3N0cnVjdCBlbmFfYWRtaW5faG9zdF9pbmZvIHsKKwkvKiBkZWZpbmVkIGluIGVudW0gZW5hX2FkbWluX29zX3R5cGUgKi8KKwl1MzIgb3NfdHlwZTsKKworCS8qIG9zIGRpc3RyaWJ1dGlvbiBzdHJpbmcgZm9ybWF0ICovCisJdTggb3NfZGlzdF9zdHJbMTI4XTsKKworCS8qIE9TIGRpc3RyaWJ1dGlvbiBudW1lcmljIGZvcm1hdCAqLworCXUzMiBvc19kaXN0OworCisJLyoga2VybmVsIHZlcnNpb24gc3RyaW5nIGZvcm1hdCAqLworCXU4IGtlcm5lbF92ZXJfc3RyWzMyXTsKKworCS8qIEtlcm5lbCB2ZXJzaW9uIG51bWVyaWMgZm9ybWF0ICovCisJdTMyIGtlcm5lbF92ZXI7CisKKwkvKiA3OjAgOiBtYWpvcgorCSAqIDE1OjggOiBtaW5vcgorCSAqIDIzOjE2IDogc3ViX21pbm9yCisJICovCisJdTMyIGRyaXZlcl92ZXJzaW9uOworCisJLyogZmVhdHVyZXMgYml0bWFwICovCisJdTMyIHN1cHBvcnRlZF9uZXR3b3JrX2ZlYXR1cmVzWzRdOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9yc3NfaW5kX3RhYmxlX2VudHJ5IHsKKwl1MTYgY3FfaWR4OworCisJdTE2IHJlc2VydmVkOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19pbmRfdGFibGUgeworCS8qIG1pbiBzdXBwb3J0ZWQgdGFibGUgc2l6ZSAoMl5taW5fc2l6ZSkgKi8KKwl1MTYgbWluX3NpemU7CisKKwkvKiBtYXggc3VwcG9ydGVkIHRhYmxlIHNpemUgKDJebWF4X3NpemUpICovCisJdTE2IG1heF9zaXplOworCisJLyogdGFibGUgc2l6ZSAoMl5zaXplKSAqLworCXUxNiBzaXplOworCisJdTE2IHJlc2VydmVkOworCisJLyogaW5kZXggb2YgdGhlIGlubGluZSBlbnRyeS4gMHhGRkZGRkZGRiBtZWFucyBpbnZhbGlkICovCisJdTMyIGlubGluZV9pbmRleDsKKworCS8qIHVzZWQgZm9yIHVwZGF0aW5nIHNpbmdsZSBlbnRyeSwgaWdub3JlZCB3aGVuIHNldHRpbmcgdGhlIGVudGlyZQorCSAqIHRhYmxlIHRocm91Z2ggdGhlIGNvbnRyb2wgYnVmZmVyLgorCSAqLworCXN0cnVjdCBlbmFfYWRtaW5fcnNzX2luZF90YWJsZV9lbnRyeSBpbmxpbmVfZW50cnk7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X2NtZCB7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9jb21tb25fZGVzYyBhcV9jb21tb25fZGVzY3JpcHRvcjsKKworCXN0cnVjdCBlbmFfYWRtaW5fY3RybF9idWZmX2luZm8gY29udHJvbF9idWZmZXI7CisKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9zZXRfZmVhdHVyZV9jb21tb25fZGVzYyBmZWF0X2NvbW1vbjsKKworCXUzMiByYXdbMTFdOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9jb21tb25fZGVzYyBhY3FfY29tbW9uX2Rlc2M7CisKKwl1bmlvbiB7CisJCXUzMiByYXdbMTRdOworCisJCXN0cnVjdCBlbmFfYWRtaW5fZGV2aWNlX2F0dHJfZmVhdHVyZV9kZXNjIGRldl9hdHRyOworCisJCXN0cnVjdCBlbmFfYWRtaW5fcXVldWVfZmVhdHVyZV9kZXNjIG1heF9xdWV1ZTsKKworCQlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfYWVucV9kZXNjIGFlbnE7CisKKwkJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdHVyZV9saW5rX2Rlc2MgbGluazsKKworCQlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfb2ZmbG9hZF9kZXNjIG9mZmxvYWQ7CisKKwkJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19mbG93X2hhc2hfZnVuY3Rpb24gZmxvd19oYXNoX2Z1bmM7CisKKwkJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19mbG93X2hhc2hfaW5wdXQgZmxvd19oYXNoX2lucHV0OworCisJCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfaW5kX3RhYmxlIGluZF90YWJsZTsKKworCQlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfaW50cl9tb2Rlcl9kZXNjIGludHJfbW9kZXJhdGlvbjsKKwl9IHU7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X2NtZCB7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9jb21tb25fZGVzYyBhcV9jb21tb25fZGVzY3JpcHRvcjsKKworCXN0cnVjdCBlbmFfYWRtaW5fY3RybF9idWZmX2luZm8gY29udHJvbF9idWZmZXI7CisKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9zZXRfZmVhdHVyZV9jb21tb25fZGVzYyBmZWF0X2NvbW1vbjsKKworCXVuaW9uIHsKKwkJdTMyIHJhd1sxMV07CisKKwkJLyogbXR1IHNpemUgKi8KKwkJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdHVyZV9tdHVfZGVzYyBtdHU7CisKKwkJLyogaG9zdCBhdHRyaWJ1dGVzICovCisJCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXR1cmVfaG9zdF9hdHRyX2Rlc2MgaG9zdF9hdHRyOworCisJCS8qIEFFTlEgY29uZmlndXJhdGlvbiAqLworCQlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfYWVucV9kZXNjIGFlbnE7CisKKwkJLyogcnNzIGZsb3cgaGFzaCBmdW5jdGlvbiAqLworCQlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9mdW5jdGlvbiBmbG93X2hhc2hfZnVuYzsKKworCQkvKiByc3MgZmxvdyBoYXNoIGlucHV0ICovCisJCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfZmxvd19oYXNoX2lucHV0IGZsb3dfaGFzaF9pbnB1dDsKKworCQkvKiByc3MgaW5kaXJlY3Rpb24gdGFibGUgKi8KKwkJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19pbmRfdGFibGUgaW5kX3RhYmxlOworCX0gdTsKK307CisKK3N0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfcmVzcCB7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfY29tbW9uX2Rlc2MgYWNxX2NvbW1vbl9kZXNjOworCisJdW5pb24geworCQl1MzIgcmF3WzE0XTsKKwl9IHU7Cit9OworCitzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfY29tbW9uX2Rlc2MgeworCXUxNiBncm91cDsKKworCXUxNiBzeW5kcm9tOworCisJLyogMCA6IHBoYXNlICovCisJdTggZmxhZ3M7CisKKwl1OCByZXNlcnZlZDFbM107CisKKwl1MzIgdGltZXN0YW1wX2xvdzsKKworCXUzMiB0aW1lc3RhbXBfaGlnaDsKK307CisKKy8qIGFzeW5jaHJvbm91cyBldmVudCBub3RpZmljYXRpb24gZ3JvdXBzICovCitlbnVtIGVuYV9hZG1pbl9hZW5xX2dyb3VwIHsKKwlFTkFfQURNSU5fTElOS19DSEFOR0UJCT0gMCwKKworCUVOQV9BRE1JTl9GQVRBTF9FUlJPUgkJPSAxLAorCisJRU5BX0FETUlOX1dBUk5JTkcJCT0gMiwKKworCUVOQV9BRE1JTl9OT1RJRklDQVRJT04JCT0gMywKKworCUVOQV9BRE1JTl9LRUVQX0FMSVZFCQk9IDQsCisKKwlFTkFfQURNSU5fQUVOUV9HUk9VUFNfTlVNCT0gNSwKK307CisKK2VudW0gZW5hX2FkbWluX2FlbnFfbm90aWZpY2F0aW9uX3N5bmRyb20geworCUVOQV9BRE1JTl9TVVNQRU5ECT0gMCwKKworCUVOQV9BRE1JTl9SRVNVTUUJPSAxLAorfTsKKworc3RydWN0IGVuYV9hZG1pbl9hZW5xX2VudHJ5IHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfY29tbW9uX2Rlc2MgYWVucV9jb21tb25fZGVzYzsKKworCS8qIGNvbW1hbmQgc3BlY2lmaWMgaW5saW5lIGRhdGEgKi8KKwl1MzIgaW5saW5lX2RhdGFfdzRbMTJdOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9hZW5xX2xpbmtfY2hhbmdlX2Rlc2MgeworCXN0cnVjdCBlbmFfYWRtaW5fYWVucV9jb21tb25fZGVzYyBhZW5xX2NvbW1vbl9kZXNjOworCisJLyogMCA6IGxpbmtfc3RhdHVzICovCisJdTMyIGZsYWdzOworfTsKKworc3RydWN0IGVuYV9hZG1pbl9lbmFfbW1pb19yZXFfcmVhZF9sZXNzX3Jlc3AgeworCXUxNiByZXFfaWQ7CisKKwl1MTYgcmVnX29mZjsKKworCS8qIHZhbHVlIGlzIHZhbGlkIHdoZW4gcG9sbCBpcyBjbGVhcmVkICovCisJdTMyIHJlZ192YWw7Cit9OworCisvKiBhcV9jb21tb25fZGVzYyAqLworI2RlZmluZSBFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfQ09NTUFORF9JRF9NQVNLIEdFTk1BU0soMTEsIDApCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19QSEFTRV9NQVNLIEJJVCgwKQorI2RlZmluZSBFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfQ1RSTF9EQVRBX1NISUZUIDEKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX0NUUkxfREFUQV9NQVNLIEJJVCgxKQorI2RlZmluZSBFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfQ1RSTF9EQVRBX0lORElSRUNUX1NISUZUIDIKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX0NUUkxfREFUQV9JTkRJUkVDVF9NQVNLIEJJVCgyKQorCisvKiBzcSAqLworI2RlZmluZSBFTkFfQURNSU5fU1FfU1FfRElSRUNUSU9OX1NISUZUIDUKKyNkZWZpbmUgRU5BX0FETUlOX1NRX1NRX0RJUkVDVElPTl9NQVNLIEdFTk1BU0soNywgNSkKKworLyogYWNxX2NvbW1vbl9kZXNjICovCisjZGVmaW5lIEVOQV9BRE1JTl9BQ1FfQ09NTU9OX0RFU0NfQ09NTUFORF9JRF9NQVNLIEdFTk1BU0soMTEsIDApCisjZGVmaW5lIEVOQV9BRE1JTl9BQ1FfQ09NTU9OX0RFU0NfUEhBU0VfTUFTSyBCSVQoMCkKKworLyogYXFfY3JlYXRlX3NxX2NtZCAqLworI2RlZmluZSBFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9TUV9ESVJFQ1RJT05fU0hJRlQgNQorI2RlZmluZSBFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9TUV9ESVJFQ1RJT05fTUFTSyBHRU5NQVNLKDcsIDUpCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX1BMQUNFTUVOVF9QT0xJQ1lfTUFTSyBHRU5NQVNLKDMsIDApCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX0NPTVBMRVRJT05fUE9MSUNZX1NISUZUIDQKKyNkZWZpbmUgRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfQ09NUExFVElPTl9QT0xJQ1lfTUFTSyBHRU5NQVNLKDYsIDQpCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX0lTX1BIWVNJQ0FMTFlfQ09OVElHVU9VU19NQVNLIEJJVCgwKQorCisvKiBhcV9jcmVhdGVfY3FfY21kICovCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DUkVBVEVfQ1FfQ01EX0lOVEVSUlVQVF9NT0RFX0VOQUJMRURfU0hJRlQgNQorI2RlZmluZSBFTkFfQURNSU5fQVFfQ1JFQVRFX0NRX0NNRF9JTlRFUlJVUFRfTU9ERV9FTkFCTEVEX01BU0sgQklUKDUpCisjZGVmaW5lIEVOQV9BRE1JTl9BUV9DUkVBVEVfQ1FfQ01EX0NRX0VOVFJZX1NJWkVfV09SRFNfTUFTSyBHRU5NQVNLKDQsIDApCisKKy8qIGdldF9zZXRfZmVhdHVyZV9jb21tb25fZGVzYyAqLworI2RlZmluZSBFTkFfQURNSU5fR0VUX1NFVF9GRUFUVVJFX0NPTU1PTl9ERVNDX1NFTEVDVF9NQVNLIEdFTk1BU0soMSwgMCkKKworLyogZ2V0X2ZlYXR1cmVfbGlua19kZXNjICovCisjZGVmaW5lIEVOQV9BRE1JTl9HRVRfRkVBVFVSRV9MSU5LX0RFU0NfQVVUT05FR19NQVNLIEJJVCgwKQorI2RlZmluZSBFTkFfQURNSU5fR0VUX0ZFQVRVUkVfTElOS19ERVNDX0RVUExFWF9TSElGVCAxCisjZGVmaW5lIEVOQV9BRE1JTl9HRVRfRkVBVFVSRV9MSU5LX0RFU0NfRFVQTEVYX01BU0sgQklUKDEpCisKKy8qIGZlYXR1cmVfb2ZmbG9hZF9kZXNjICovCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UWF9MM19DU1VNX0lQVjRfTUFTSyBCSVQoMCkKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RYX0w0X0lQVjRfQ1NVTV9QQVJUX1NISUZUIDEKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RYX0w0X0lQVjRfQ1NVTV9QQVJUX01BU0sgQklUKDEpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UWF9MNF9JUFY0X0NTVU1fRlVMTF9TSElGVCAyCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UWF9MNF9JUFY0X0NTVU1fRlVMTF9NQVNLIEJJVCgyKQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFhfTDRfSVBWNl9DU1VNX1BBUlRfU0hJRlQgMworI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFhfTDRfSVBWNl9DU1VNX1BBUlRfTUFTSyBCSVQoMykKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RYX0w0X0lQVjZfQ1NVTV9GVUxMX1NISUZUIDQKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RYX0w0X0lQVjZfQ1NVTV9GVUxMX01BU0sgQklUKDQpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UU09fSVBWNF9TSElGVCA1CisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UU09fSVBWNF9NQVNLIEJJVCg1KQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFNPX0lQVjZfU0hJRlQgNgorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFNPX0lQVjZfTUFTSyBCSVQoNikKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RTT19FQ05fU0hJRlQgNworI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFNPX0VDTl9NQVNLIEJJVCg3KQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfUlhfTDNfQ1NVTV9JUFY0X01BU0sgQklUKDApCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19SWF9MNF9JUFY0X0NTVU1fU0hJRlQgMQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfUlhfTDRfSVBWNF9DU1VNX01BU0sgQklUKDEpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19SWF9MNF9JUFY2X0NTVU1fU0hJRlQgMgorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfUlhfTDRfSVBWNl9DU1VNX01BU0sgQklUKDIpCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19SWF9IQVNIX1NISUZUIDMKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1JYX0hBU0hfTUFTSyBCSVQoMykKKworLyogZmVhdHVyZV9yc3NfZmxvd19oYXNoX2Z1bmN0aW9uICovCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfRlVOQ1RJT05fRlVOQ1NfTUFTSyBHRU5NQVNLKDcsIDApCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfRlVOQ1RJT05fU0VMRUNURURfRlVOQ19NQVNLIEdFTk1BU0soNywgMCkKKworLyogZmVhdHVyZV9yc3NfZmxvd19oYXNoX2lucHV0ICovCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfSU5QVVRfTDNfU09SVF9TSElGVCAxCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfSU5QVVRfTDNfU09SVF9NQVNLIEJJVCgxKQorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0lOUFVUX0w0X1NPUlRfU0hJRlQgMgorI2RlZmluZSBFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0lOUFVUX0w0X1NPUlRfTUFTSyBCSVQoMikKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9JTlBVVF9FTkFCTEVfTDNfU09SVF9TSElGVCAxCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfSU5QVVRfRU5BQkxFX0wzX1NPUlRfTUFTSyBCSVQoMSkKKyNkZWZpbmUgRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9JTlBVVF9FTkFCTEVfTDRfU09SVF9TSElGVCAyCisjZGVmaW5lIEVOQV9BRE1JTl9GRUFUVVJFX1JTU19GTE9XX0hBU0hfSU5QVVRfRU5BQkxFX0w0X1NPUlRfTUFTSyBCSVQoMikKKworLyogaG9zdF9pbmZvICovCisjZGVmaW5lIEVOQV9BRE1JTl9IT1NUX0lORk9fTUFKT1JfTUFTSyBHRU5NQVNLKDcsIDApCisjZGVmaW5lIEVOQV9BRE1JTl9IT1NUX0lORk9fTUlOT1JfU0hJRlQgOAorI2RlZmluZSBFTkFfQURNSU5fSE9TVF9JTkZPX01JTk9SX01BU0sgR0VOTUFTSygxNSwgOCkKKyNkZWZpbmUgRU5BX0FETUlOX0hPU1RfSU5GT19TVUJfTUlOT1JfU0hJRlQgMTYKKyNkZWZpbmUgRU5BX0FETUlOX0hPU1RfSU5GT19TVUJfTUlOT1JfTUFTSyBHRU5NQVNLKDIzLCAxNikKKworLyogYWVucV9jb21tb25fZGVzYyAqLworI2RlZmluZSBFTkFfQURNSU5fQUVOUV9DT01NT05fREVTQ19QSEFTRV9NQVNLIEJJVCgwKQorCisvKiBhZW5xX2xpbmtfY2hhbmdlX2Rlc2MgKi8KKyNkZWZpbmUgRU5BX0FETUlOX0FFTlFfTElOS19DSEFOR0VfREVTQ19MSU5LX1NUQVRVU19NQVNLIEJJVCgwKQorCisjZW5kaWYgLypfRU5BX0FETUlOX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9jb20uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2NvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNjZkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9jb20uYwpAQCAtMCwwICsxLDI2NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlICJlbmFfY29tLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGltZW91dCBpbiBtaWNyby1zZWMgKi8KKyNkZWZpbmUgQURNSU5fQ01EX1RJTUVPVVRfVVMgKDEwMDAwMDApCisKKyNkZWZpbmUgRU5BX0FTWU5DX1FVRVVFX0RFUFRIIDQKKyNkZWZpbmUgRU5BX0FETUlOX1FVRVVFX0RFUFRIIDMyCisKKyNkZWZpbmUgTUlOX0VOQV9WRVIgKCgoRU5BX0NPTU1PTl9TUEVDX1ZFUlNJT05fTUFKT1IpIDw8IFwKKwkJRU5BX1JFR1NfVkVSU0lPTl9NQUpPUl9WRVJTSU9OX1NISUZUKSBcCisJCXwgKEVOQV9DT01NT05fU1BFQ19WRVJTSU9OX01JTk9SKSkKKworI2RlZmluZSBFTkFfQ1RSTF9NQUpPUgkJMAorI2RlZmluZSBFTkFfQ1RSTF9NSU5PUgkJMAorI2RlZmluZSBFTkFfQ1RSTF9TVUJfTUlOT1IJMQorCisjZGVmaW5lIE1JTl9FTkFfQ1RSTF9WRVIgXAorCSgoKEVOQV9DVFJMX01BSk9SKSA8PCBcCisJKEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NQUpPUl9WRVJTSU9OX1NISUZUKSkgfCBcCisJKChFTkFfQ1RSTF9NSU5PUikgPDwgXAorCShFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUlOT1JfVkVSU0lPTl9TSElGVCkpIHwgXAorCShFTkFfQ1RSTF9TVUJfTUlOT1IpKQorCisjZGVmaW5lIEVOQV9ETUFfQUREUl9UT19VSU5UMzJfTE9XKHgpCSgodTMyKSgodTY0KSh4KSkpCisjZGVmaW5lIEVOQV9ETUFfQUREUl9UT19VSU5UMzJfSElHSCh4KQkoKHUzMikoKCh1NjQpKHgpKSA+PiAzMikpCisKKyNkZWZpbmUgRU5BX01NSU9fUkVBRF9USU1FT1VUIDB4RkZGRkZGRkYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitlbnVtIGVuYV9jbWRfc3RhdHVzIHsKKwlFTkFfQ01EX1NVQk1JVFRFRCwKKwlFTkFfQ01EX0NPTVBMRVRFRCwKKwkvKiBBYm9ydCAtIGNhbmNlbGVkIGJ5IHRoZSBkcml2ZXIgKi8KKwlFTkFfQ01EX0FCT1JURUQsCit9OworCitzdHJ1Y3QgZW5hX2NvbXBfY3R4IHsKKwlzdHJ1Y3QgY29tcGxldGlvbiB3YWl0X2V2ZW50OworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICp1c2VyX2NxZTsKKwl1MzIgY29tcF9zaXplOworCWVudW0gZW5hX2NtZF9zdGF0dXMgc3RhdHVzOworCS8qIHN0YXR1cyBmcm9tIHRoZSBkZXZpY2UgKi8KKwl1OCBjb21wX3N0YXR1czsKKwl1OCBjbWRfb3Bjb2RlOworCWJvb2wgb2NjdXBpZWQ7Cit9OworCitzdHJ1Y3QgZW5hX2NvbV9zdGF0c19jdHggeworCXN0cnVjdCBlbmFfYWRtaW5fYXFfZ2V0X3N0YXRzX2NtZCBnZXRfY21kOworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2dldF9zdGF0c19yZXNwIGdldF9yZXNwOworfTsKKworc3RhdGljIGlubGluZSBpbnQgZW5hX2NvbV9tZW1fYWRkcl9zZXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZW5hX2NvbW1vbl9tZW1fYWRkciAqZW5hX2FkZHIsCisJCQkJICAgICAgIGRtYV9hZGRyX3QgYWRkcikKK3sKKwlpZiAoKGFkZHIgJiBHRU5NQVNLX1VMTChlbmFfZGV2LT5kbWFfYWRkcl9iaXRzIC0gMSwgMCkpICE9IGFkZHIpIHsKKwkJcHJfZXJyKCJkbWEgYWRkcmVzcyBoYXMgbW9yZSBiaXRzIHRoYXQgdGhlIGRldmljZSBzdXBwb3J0c1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVuYV9hZGRyLT5tZW1fYWRkcl9sb3cgPSAodTMyKWFkZHI7CisJZW5hX2FkZHItPm1lbV9hZGRyX2hpZ2ggPSAodTY0KWFkZHIgPj4gMzI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2FkbWluX2luaXRfc3Eoc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKnF1ZXVlKQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3NxICpzcSA9ICZxdWV1ZS0+c3E7CisJdTE2IHNpemUgPSBBRE1JTl9TUV9TSVpFKHF1ZXVlLT5xX2RlcHRoKTsKKworCXNxLT5lbnRyaWVzID0gZG1hX3phbGxvY19jb2hlcmVudChxdWV1ZS0+cV9kbWFkZXYsIHNpemUsICZzcS0+ZG1hX2FkZHIsCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXNxLT5lbnRyaWVzKSB7CisJCXByX2VycigibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNxLT5oZWFkID0gMDsKKwlzcS0+dGFpbCA9IDA7CisJc3EtPnBoYXNlID0gMTsKKworCXNxLT5kYl9hZGRyID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9jb21fYWRtaW5faW5pdF9jcShzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fY3EgKmNxID0gJnF1ZXVlLT5jcTsKKwl1MTYgc2l6ZSA9IEFETUlOX0NRX1NJWkUocXVldWUtPnFfZGVwdGgpOworCisJY3EtPmVudHJpZXMgPSBkbWFfemFsbG9jX2NvaGVyZW50KHF1ZXVlLT5xX2RtYWRldiwgc2l6ZSwgJmNxLT5kbWFfYWRkciwKKwkJCQkJICBHRlBfS0VSTkVMKTsKKworCWlmICghY3EtPmVudHJpZXMpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY3EtPmhlYWQgPSAwOworCWNxLT5waGFzZSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2FkbWluX2luaXRfYWVucShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZW5hX2FlbnFfaGFuZGxlcnMgKmFlbnFfaGFuZGxlcnMpCit7CisJc3RydWN0IGVuYV9jb21fYWVucSAqYWVucSA9ICZkZXYtPmFlbnE7CisJdTMyIGFkZHJfbG93LCBhZGRyX2hpZ2gsIGFlbnFfY2FwczsKKwl1MTYgc2l6ZTsKKworCWRldi0+YWVucS5xX2RlcHRoID0gRU5BX0FTWU5DX1FVRVVFX0RFUFRIOworCXNpemUgPSBBRE1JTl9BRU5RX1NJWkUoRU5BX0FTWU5DX1FVRVVFX0RFUFRIKTsKKwlhZW5xLT5lbnRyaWVzID0gZG1hX3phbGxvY19jb2hlcmVudChkZXYtPmRtYWRldiwgc2l6ZSwgJmFlbnEtPmRtYV9hZGRyLAorCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWFlbnEtPmVudHJpZXMpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYWVucS0+aGVhZCA9IGFlbnEtPnFfZGVwdGg7CisJYWVucS0+cGhhc2UgPSAxOworCisJYWRkcl9sb3cgPSBFTkFfRE1BX0FERFJfVE9fVUlOVDMyX0xPVyhhZW5xLT5kbWFfYWRkcik7CisJYWRkcl9oaWdoID0gRU5BX0RNQV9BRERSX1RPX1VJTlQzMl9ISUdIKGFlbnEtPmRtYV9hZGRyKTsKKworCXdyaXRlbChhZGRyX2xvdywgZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfQUVOUV9CQVNFX0xPX09GRik7CisJd3JpdGVsKGFkZHJfaGlnaCwgZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfQUVOUV9CQVNFX0hJX09GRik7CisKKwlhZW5xX2NhcHMgPSAwOworCWFlbnFfY2FwcyB8PSBkZXYtPmFlbnEucV9kZXB0aCAmIEVOQV9SRUdTX0FFTlFfQ0FQU19BRU5RX0RFUFRIX01BU0s7CisJYWVucV9jYXBzIHw9IChzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9hZW5xX2VudHJ5KQorCQkgICAgICA8PCBFTkFfUkVHU19BRU5RX0NBUFNfQUVOUV9FTlRSWV9TSVpFX1NISUZUKSAmCisJCSAgICAgRU5BX1JFR1NfQUVOUV9DQVBTX0FFTlFfRU5UUllfU0laRV9NQVNLOworCXdyaXRlbChhZW5xX2NhcHMsIGRldi0+cmVnX2JhciArIEVOQV9SRUdTX0FFTlFfQ0FQU19PRkYpOworCisJaWYgKHVubGlrZWx5KCFhZW5xX2hhbmRsZXJzKSkgeworCQlwcl9lcnIoImFlbnEgaGFuZGxlcnMgcG9pbnRlciBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWVucS0+YWVucV9oYW5kbGVycyA9IGFlbnFfaGFuZGxlcnM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbXBfY3R4dF9yZWxlYXNlKHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICpxdWV1ZSwKKwkJCQkgICAgIHN0cnVjdCBlbmFfY29tcF9jdHggKmNvbXBfY3R4KQoreworCWNvbXBfY3R4LT5vY2N1cGllZCA9IGZhbHNlOworCWF0b21pY19kZWMoJnF1ZXVlLT5vdXRzdGFuZGluZ19jbWRzKTsKK30KKworc3RhdGljIHN0cnVjdCBlbmFfY29tcF9jdHggKmdldF9jb21wX2N0eHQoc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKnF1ZXVlLAorCQkJCQkgIHUxNiBjb21tYW5kX2lkLCBib29sIGNhcHR1cmUpCit7CisJaWYgKHVubGlrZWx5KGNvbW1hbmRfaWQgPj0gcXVldWUtPnFfZGVwdGgpKSB7CisJCXByX2VycigiY29tbWFuZCBpZCBpcyBsYXJnZXIgdGhhbiB0aGUgcXVldWUgc2l6ZS4gY21kX2lkOiAldSBxdWV1ZSBzaXplICVkXG4iLAorCQkgICAgICAgY29tbWFuZF9pZCwgcXVldWUtPnFfZGVwdGgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodW5saWtlbHkocXVldWUtPmNvbXBfY3R4W2NvbW1hbmRfaWRdLm9jY3VwaWVkICYmIGNhcHR1cmUpKSB7CisJCXByX2VycigiQ29tcGxldGlvbiBjb250ZXh0IGlzIG9jY3VwaWVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGNhcHR1cmUpIHsKKwkJYXRvbWljX2luYygmcXVldWUtPm91dHN0YW5kaW5nX2NtZHMpOworCQlxdWV1ZS0+Y29tcF9jdHhbY29tbWFuZF9pZF0ub2NjdXBpZWQgPSB0cnVlOworCX0KKworCXJldHVybiAmcXVldWUtPmNvbXBfY3R4W2NvbW1hbmRfaWRdOworfQorCitzdGF0aWMgc3RydWN0IGVuYV9jb21wX2N0eCAqX19lbmFfY29tX3N1Ym1pdF9hZG1pbl9jbWQoc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlLAorCQkJCQkJICAgICAgIHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKmNtZCwKKwkJCQkJCSAgICAgICBzaXplX3QgY21kX3NpemVfaW5fYnl0ZXMsCisJCQkJCQkgICAgICAgc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKmNvbXAsCisJCQkJCQkgICAgICAgc2l6ZV90IGNvbXBfc2l6ZV9pbl9ieXRlcykKK3sKKwlzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpjb21wX2N0eDsKKwl1MTYgdGFpbF9tYXNrZWQsIGNtZF9pZDsKKwl1MTYgcXVldWVfc2l6ZV9tYXNrOworCXUxNiBjbnQ7CisKKwlxdWV1ZV9zaXplX21hc2sgPSBhZG1pbl9xdWV1ZS0+cV9kZXB0aCAtIDE7CisKKwl0YWlsX21hc2tlZCA9IGFkbWluX3F1ZXVlLT5zcS50YWlsICYgcXVldWVfc2l6ZV9tYXNrOworCisJLyogSW4gY2FzZSBvZiBxdWV1ZSBGVUxMICovCisJY250ID0gYWRtaW5fcXVldWUtPnNxLnRhaWwgLSBhZG1pbl9xdWV1ZS0+c3EuaGVhZDsKKwlpZiAoY250ID49IGFkbWluX3F1ZXVlLT5xX2RlcHRoKSB7CisJCXByX2RlYnVnKCJhZG1pbiBxdWV1ZSBpcyBGVUxMICh0YWlsICVkIGhlYWQgJWQgZGVwdGg6ICVkKVxuIiwKKwkJCSBhZG1pbl9xdWV1ZS0+c3EudGFpbCwgYWRtaW5fcXVldWUtPnNxLmhlYWQsCisJCQkgYWRtaW5fcXVldWUtPnFfZGVwdGgpOworCQlhZG1pbl9xdWV1ZS0+c3RhdHMub3V0X29mX3NwYWNlKys7CisJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOworCX0KKworCWNtZF9pZCA9IGFkbWluX3F1ZXVlLT5jdXJyX2NtZF9pZDsKKworCWNtZC0+YXFfY29tbW9uX2Rlc2NyaXB0b3IuZmxhZ3MgfD0gYWRtaW5fcXVldWUtPnNxLnBoYXNlICYKKwkJRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX1BIQVNFX01BU0s7CisKKwljbWQtPmFxX2NvbW1vbl9kZXNjcmlwdG9yLmNvbW1hbmRfaWQgfD0gY21kX2lkICYKKwkJRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX0NPTU1BTkRfSURfTUFTSzsKKworCWNvbXBfY3R4ID0gZ2V0X2NvbXBfY3R4dChhZG1pbl9xdWV1ZSwgY21kX2lkLCB0cnVlKTsKKwlpZiAodW5saWtlbHkoIWNvbXBfY3R4KSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwljb21wX2N0eC0+c3RhdHVzID0gRU5BX0NNRF9TVUJNSVRURUQ7CisJY29tcF9jdHgtPmNvbXBfc2l6ZSA9ICh1MzIpY29tcF9zaXplX2luX2J5dGVzOworCWNvbXBfY3R4LT51c2VyX2NxZSA9IGNvbXA7CisJY29tcF9jdHgtPmNtZF9vcGNvZGUgPSBjbWQtPmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZTsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZjb21wX2N0eC0+d2FpdF9ldmVudCk7CisKKwltZW1jcHkoJmFkbWluX3F1ZXVlLT5zcS5lbnRyaWVzW3RhaWxfbWFza2VkXSwgY21kLCBjbWRfc2l6ZV9pbl9ieXRlcyk7CisKKwlhZG1pbl9xdWV1ZS0+Y3Vycl9jbWRfaWQgPSAoYWRtaW5fcXVldWUtPmN1cnJfY21kX2lkICsgMSkgJgorCQlxdWV1ZV9zaXplX21hc2s7CisKKwlhZG1pbl9xdWV1ZS0+c3EudGFpbCsrOworCWFkbWluX3F1ZXVlLT5zdGF0cy5zdWJtaXR0ZWRfY21kKys7CisKKwlpZiAodW5saWtlbHkoKGFkbWluX3F1ZXVlLT5zcS50YWlsICYgcXVldWVfc2l6ZV9tYXNrKSA9PSAwKSkKKwkJYWRtaW5fcXVldWUtPnNxLnBoYXNlID0gIWFkbWluX3F1ZXVlLT5zcS5waGFzZTsKKworCXdyaXRlbChhZG1pbl9xdWV1ZS0+c3EudGFpbCwgYWRtaW5fcXVldWUtPnNxLmRiX2FkZHIpOworCisJcmV0dXJuIGNvbXBfY3R4OworfQorCitzdGF0aWMgaW5saW5lIGludCBlbmFfY29tX2luaXRfY29tcF9jdHh0KHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICpxdWV1ZSkKK3sKKwlzaXplX3Qgc2l6ZSA9IHF1ZXVlLT5xX2RlcHRoICogc2l6ZW9mKHN0cnVjdCBlbmFfY29tcF9jdHgpOworCXN0cnVjdCBlbmFfY29tcF9jdHggKmNvbXBfY3R4OworCXUxNiBpOworCisJcXVldWUtPmNvbXBfY3R4ID0gZGV2bV9remFsbG9jKHF1ZXVlLT5xX2RtYWRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFxdWV1ZS0+Y29tcF9jdHgpKSB7CisJCXByX2VycigibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBxdWV1ZS0+cV9kZXB0aDsgaSsrKSB7CisJCWNvbXBfY3R4ID0gZ2V0X2NvbXBfY3R4dChxdWV1ZSwgaSwgZmFsc2UpOworCQlpZiAoY29tcF9jdHgpCisJCQlpbml0X2NvbXBsZXRpb24oJmNvbXBfY3R4LT53YWl0X2V2ZW50KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBlbmFfY29tcF9jdHggKmVuYV9jb21fc3VibWl0X2FkbWluX2NtZChzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUsCisJCQkJCQkgICAgIHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKmNtZCwKKwkJCQkJCSAgICAgc2l6ZV90IGNtZF9zaXplX2luX2J5dGVzLAorCQkJCQkJICAgICBzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqY29tcCwKKwkJCQkJCSAgICAgc2l6ZV90IGNvbXBfc2l6ZV9pbl9ieXRlcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBlbmFfY29tcF9jdHggKmNvbXBfY3R4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKwlpZiAodW5saWtlbHkoIWFkbWluX3F1ZXVlLT5ydW5uaW5nX3N0YXRlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCX0KKwljb21wX2N0eCA9IF9fZW5hX2NvbV9zdWJtaXRfYWRtaW5fY21kKGFkbWluX3F1ZXVlLCBjbWQsCisJCQkJCSAgICAgIGNtZF9zaXplX2luX2J5dGVzLAorCQkJCQkgICAgICBjb21wLAorCQkJCQkgICAgICBjb21wX3NpemVfaW5fYnl0ZXMpOworCWlmICh1bmxpa2VseShJU19FUlIoY29tcF9jdHgpKSkKKwkJYWRtaW5fcXVldWUtPnJ1bm5pbmdfc3RhdGUgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY29tcF9jdHg7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9pbml0X2lvX3NxKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgIHN0cnVjdCBlbmFfY29tX2NyZWF0ZV9pb19jdHggKmN0eCwKKwkJCSAgICAgIHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSkKK3sKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgZGV2X25vZGUgPSAwOworCisJbWVtc2V0KCZpb19zcS0+ZGVzY19hZGRyLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2NvbV9pb19kZXNjX2FkZHIpKTsKKworCWlvX3NxLT5kZXNjX2VudHJ5X3NpemUgPQorCQkoaW9fc3EtPmRpcmVjdGlvbiA9PSBFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9UWCkgPworCQlzaXplb2Yoc3RydWN0IGVuYV9ldGhfaW9fdHhfZGVzYykgOgorCQlzaXplb2Yoc3RydWN0IGVuYV9ldGhfaW9fcnhfZGVzYyk7CisKKwlzaXplID0gaW9fc3EtPmRlc2NfZW50cnlfc2l6ZSAqIGlvX3NxLT5xX2RlcHRoOworCisJaWYgKGlvX3NxLT5tZW1fcXVldWVfdHlwZSA9PSBFTkFfQURNSU5fUExBQ0VNRU5UX1BPTElDWV9IT1NUKSB7CisJCWRldl9ub2RlID0gZGV2X3RvX25vZGUoZW5hX2Rldi0+ZG1hZGV2KTsKKwkJc2V0X2Rldl9ub2RlKGVuYV9kZXYtPmRtYWRldiwgY3R4LT5udW1hX25vZGUpOworCQlpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkciA9CisJCQlkbWFfemFsbG9jX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwKKwkJCQkJICAgICZpb19zcS0+ZGVzY19hZGRyLnBoeXNfYWRkciwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCQlzZXRfZGV2X25vZGUoZW5hX2Rldi0+ZG1hZGV2LCBkZXZfbm9kZSk7CisJCWlmICghaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIpIHsKKwkJCWlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyID0KKwkJCQlkbWFfemFsbG9jX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwKKwkJCQkJCSAgICAmaW9fc3EtPmRlc2NfYWRkci5waHlzX2FkZHIsCisJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfbm9kZSA9IGRldl90b19ub2RlKGVuYV9kZXYtPmRtYWRldik7CisJCXNldF9kZXZfbm9kZShlbmFfZGV2LT5kbWFkZXYsIGN0eC0+bnVtYV9ub2RlKTsKKwkJaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIgPQorCQkJZGV2bV9remFsbG9jKGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCXNldF9kZXZfbm9kZShlbmFfZGV2LT5kbWFkZXYsIGRldl9ub2RlKTsKKwkJaWYgKCFpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkcikgeworCQkJaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIgPQorCQkJCWRldm1fa3phbGxvYyhlbmFfZGV2LT5kbWFkZXYsIHNpemUsIEdGUF9LRVJORUwpOworCQl9CisJfQorCisJaWYgKCFpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkcikgeworCQlwcl9lcnIoIm1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpb19zcS0+dGFpbCA9IDA7CisJaW9fc3EtPm5leHRfdG9fY29tcCA9IDA7CisJaW9fc3EtPnBoYXNlID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9jb21faW5pdF9pb19jcShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgICBzdHJ1Y3QgZW5hX2NvbV9jcmVhdGVfaW9fY3R4ICpjdHgsCisJCQkgICAgICBzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EpCit7CisJc2l6ZV90IHNpemU7CisJaW50IHByZXZfbm9kZSA9IDA7CisKKwltZW1zZXQoJmlvX2NxLT5jZGVzY19hZGRyLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2NvbV9pb19kZXNjX2FkZHIpKTsKKworCS8qIFVzZSB0aGUgYmFzaWMgY29tcGxldGlvbiBkZXNjcmlwdG9yIGZvciBSeCAqLworCWlvX2NxLT5jZGVzY19lbnRyeV9zaXplX2luX2J5dGVzID0KKwkJKGlvX2NxLT5kaXJlY3Rpb24gPT0gRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fVFgpID8KKwkJc2l6ZW9mKHN0cnVjdCBlbmFfZXRoX2lvX3R4X2NkZXNjKSA6CisJCXNpemVvZihzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19iYXNlKTsKKworCXNpemUgPSBpb19jcS0+Y2Rlc2NfZW50cnlfc2l6ZV9pbl9ieXRlcyAqIGlvX2NxLT5xX2RlcHRoOworCisJcHJldl9ub2RlID0gZGV2X3RvX25vZGUoZW5hX2Rldi0+ZG1hZGV2KTsKKwlzZXRfZGV2X25vZGUoZW5hX2Rldi0+ZG1hZGV2LCBjdHgtPm51bWFfbm9kZSk7CisJaW9fY3EtPmNkZXNjX2FkZHIudmlydF9hZGRyID0KKwkJZG1hX3phbGxvY19jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemUsCisJCQkJICAgICZpb19jcS0+Y2Rlc2NfYWRkci5waHlzX2FkZHIsIEdGUF9LRVJORUwpOworCXNldF9kZXZfbm9kZShlbmFfZGV2LT5kbWFkZXYsIHByZXZfbm9kZSk7CisJaWYgKCFpb19jcS0+Y2Rlc2NfYWRkci52aXJ0X2FkZHIpIHsKKwkJaW9fY3EtPmNkZXNjX2FkZHIudmlydF9hZGRyID0KKwkJCWRtYV96YWxsb2NfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLAorCQkJCQkgICAgJmlvX2NxLT5jZGVzY19hZGRyLnBoeXNfYWRkciwKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCX0KKworCWlmICghaW9fY3EtPmNkZXNjX2FkZHIudmlydF9hZGRyKSB7CisJCXByX2VycigibWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlvX2NxLT5waGFzZSA9IDE7CisJaW9fY3EtPmhlYWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9jb21faGFuZGxlX3NpbmdsZV9hZG1pbl9jb21wbGV0aW9uKHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSwKKwkJCQkJCSAgIHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICpjcWUpCit7CisJc3RydWN0IGVuYV9jb21wX2N0eCAqY29tcF9jdHg7CisJdTE2IGNtZF9pZDsKKworCWNtZF9pZCA9IGNxZS0+YWNxX2NvbW1vbl9kZXNjcmlwdG9yLmNvbW1hbmQgJgorCQlFTkFfQURNSU5fQUNRX0NPTU1PTl9ERVNDX0NPTU1BTkRfSURfTUFTSzsKKworCWNvbXBfY3R4ID0gZ2V0X2NvbXBfY3R4dChhZG1pbl9xdWV1ZSwgY21kX2lkLCBmYWxzZSk7CisJaWYgKHVubGlrZWx5KCFjb21wX2N0eCkpIHsKKwkJcHJfZXJyKCJjb21wX2N0eCBpcyBOVUxMLiBDaGFuZ2luZyB0aGUgYWRtaW4gcXVldWUgcnVubmluZyBzdGF0ZVxuIik7CisJCWFkbWluX3F1ZXVlLT5ydW5uaW5nX3N0YXRlID0gZmFsc2U7CisJCXJldHVybjsKKwl9CisKKwljb21wX2N0eC0+c3RhdHVzID0gRU5BX0NNRF9DT01QTEVURUQ7CisJY29tcF9jdHgtPmNvbXBfc3RhdHVzID0gY3FlLT5hY3FfY29tbW9uX2Rlc2NyaXB0b3Iuc3RhdHVzOworCisJaWYgKGNvbXBfY3R4LT51c2VyX2NxZSkKKwkJbWVtY3B5KGNvbXBfY3R4LT51c2VyX2NxZSwgKHZvaWQgKiljcWUsIGNvbXBfY3R4LT5jb21wX3NpemUpOworCisJaWYgKCFhZG1pbl9xdWV1ZS0+cG9sbGluZykKKwkJY29tcGxldGUoJmNvbXBfY3R4LT53YWl0X2V2ZW50KTsKK30KKworc3RhdGljIHZvaWQgZW5hX2NvbV9oYW5kbGVfYWRtaW5fY29tcGxldGlvbihzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUpCit7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKmNxZSA9IE5VTEw7CisJdTE2IGNvbXBfbnVtID0gMDsKKwl1MTYgaGVhZF9tYXNrZWQ7CisJdTggcGhhc2U7CisKKwloZWFkX21hc2tlZCA9IGFkbWluX3F1ZXVlLT5jcS5oZWFkICYgKGFkbWluX3F1ZXVlLT5xX2RlcHRoIC0gMSk7CisJcGhhc2UgPSBhZG1pbl9xdWV1ZS0+Y3EucGhhc2U7CisKKwljcWUgPSAmYWRtaW5fcXVldWUtPmNxLmVudHJpZXNbaGVhZF9tYXNrZWRdOworCisJLyogR28gb3ZlciBhbGwgdGhlIGNvbXBsZXRpb25zICovCisJd2hpbGUgKChjcWUtPmFjcV9jb21tb25fZGVzY3JpcHRvci5mbGFncyAmCisJCQlFTkFfQURNSU5fQUNRX0NPTU1PTl9ERVNDX1BIQVNFX01BU0spID09IHBoYXNlKSB7CisJCS8qIERvIG5vdCByZWFkIHRoZSByZXN0IG9mIHRoZSBjb21wbGV0aW9uIGVudHJ5IGJlZm9yZSB0aGUKKwkJICogcGhhc2UgYml0IHdhcyB2YWxpZGF0ZWQKKwkJICovCisJCXJtYigpOworCQllbmFfY29tX2hhbmRsZV9zaW5nbGVfYWRtaW5fY29tcGxldGlvbihhZG1pbl9xdWV1ZSwgY3FlKTsKKworCQloZWFkX21hc2tlZCsrOworCQljb21wX251bSsrOworCQlpZiAodW5saWtlbHkoaGVhZF9tYXNrZWQgPT0gYWRtaW5fcXVldWUtPnFfZGVwdGgpKSB7CisJCQloZWFkX21hc2tlZCA9IDA7CisJCQlwaGFzZSA9ICFwaGFzZTsKKwkJfQorCisJCWNxZSA9ICZhZG1pbl9xdWV1ZS0+Y3EuZW50cmllc1toZWFkX21hc2tlZF07CisJfQorCisJYWRtaW5fcXVldWUtPmNxLmhlYWQgKz0gY29tcF9udW07CisJYWRtaW5fcXVldWUtPmNxLnBoYXNlID0gcGhhc2U7CisJYWRtaW5fcXVldWUtPnNxLmhlYWQgKz0gY29tcF9udW07CisJYWRtaW5fcXVldWUtPnN0YXRzLmNvbXBsZXRlZF9jbWQgKz0gY29tcF9udW07Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9jb21wX3N0YXR1c190b19lcnJubyh1OCBjb21wX3N0YXR1cykKK3sKKwlpZiAodW5saWtlbHkoY29tcF9zdGF0dXMgIT0gMCkpCisJCXByX2VycigiYWRtaW4gY29tbWFuZCBmYWlsZWRbJXVdXG4iLCBjb21wX3N0YXR1cyk7CisKKwlpZiAodW5saWtlbHkoY29tcF9zdGF0dXMgPiBFTkFfQURNSU5fVU5LTk9XTl9FUlJPUikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjb21wX3N0YXR1cykgeworCWNhc2UgRU5BX0FETUlOX1NVQ0NFU1M6CisJCXJldHVybiAwOworCWNhc2UgRU5BX0FETUlOX1JFU09VUkNFX0FMTE9DQVRJT05fRkFJTFVSRToKKwkJcmV0dXJuIC1FTk9NRU07CisJY2FzZSBFTkFfQURNSU5fVU5TVVBQT1JURURfT1BDT0RFOgorCQlyZXR1cm4gLUVQRVJNOworCWNhc2UgRU5BX0FETUlOX0JBRF9PUENPREU6CisJY2FzZSBFTkFfQURNSU5fTUFMRk9STUVEX1JFUVVFU1Q6CisJY2FzZSBFTkFfQURNSU5fSUxMRUdBTF9QQVJBTUVURVI6CisJY2FzZSBFTkFfQURNSU5fVU5LTk9XTl9FUlJPUjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV93YWl0X2FuZF9wcm9jZXNzX2FkbWluX2NxX3BvbGxpbmcoc3RydWN0IGVuYV9jb21wX2N0eCAqY29tcF9jdHgsCisJCQkJCQkgICAgIHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGFydF90aW1lOworCWludCByZXQ7CisKKwlzdGFydF90aW1lID0gKCh1MzIpamlmZmllc190b191c2VjcyhqaWZmaWVzKSk7CisKKwl3aGlsZSAoY29tcF9jdHgtPnN0YXR1cyA9PSBFTkFfQ01EX1NVQk1JVFRFRCkgeworCQlpZiAoKCgodTMyKWppZmZpZXNfdG9fdXNlY3MoamlmZmllcykpIC0gc3RhcnRfdGltZSkgPgorCQkgICAgQURNSU5fQ01EX1RJTUVPVVRfVVMpIHsKKwkJCXByX2VycigiV2FpdCBmb3IgY29tcGxldGlvbiAocG9sbGluZykgdGltZW91dFxuIik7CisJCQkvKiBFTkEgZGlkbid0IGhhdmUgYW55IGNvbXBsZXRpb24gKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisJCQlhZG1pbl9xdWV1ZS0+c3RhdHMubm9fY29tcGxldGlvbisrOworCQkJYWRtaW5fcXVldWUtPnJ1bm5pbmdfc3RhdGUgPSBmYWxzZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKworCQkJcmV0ID0gLUVUSU1FOworCQkJZ290byBlcnI7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCQllbmFfY29tX2hhbmRsZV9hZG1pbl9jb21wbGV0aW9uKGFkbWluX3F1ZXVlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCisJCW1zbGVlcCgxMDApOworCX0KKworCWlmICh1bmxpa2VseShjb21wX2N0eC0+c3RhdHVzID09IEVOQV9DTURfQUJPUlRFRCkpIHsKKwkJcHJfZXJyKCJDb21tYW5kIHdhcyBhYm9ydGVkXG4iKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKwkJYWRtaW5fcXVldWUtPnN0YXRzLmFib3J0ZWRfY21kKys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJV0FSTihjb21wX2N0eC0+c3RhdHVzICE9IEVOQV9DTURfQ09NUExFVEVELCAiSW52YWxpZCBjb21wIHN0YXR1cyAlZFxuIiwKKwkgICAgIGNvbXBfY3R4LT5zdGF0dXMpOworCisJcmV0ID0gZW5hX2NvbV9jb21wX3N0YXR1c190b19lcnJubyhjb21wX2N0eC0+Y29tcF9zdGF0dXMpOworZXJyOgorCWNvbXBfY3R4dF9yZWxlYXNlKGFkbWluX3F1ZXVlLCBjb21wX2N0eCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbmFfY29tX3dhaXRfYW5kX3Byb2Nlc3NfYWRtaW5fY3FfaW50ZXJydXB0cyhzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpjb21wX2N0eCwKKwkJCQkJCQlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjb21wX2N0eC0+d2FpdF9ldmVudCwKKwkJCQkgICAgdXNlY3NfdG9famlmZmllcyhBRE1JTl9DTURfVElNRU9VVF9VUykpOworCisJLyogSW4gY2FzZSB0aGUgY29tbWFuZCB3YXNuJ3QgY29tcGxldGVkIGZpbmQgb3V0IHRoZSByb290IGNhdXNlLgorCSAqIFRoZXJlIG1pZ2h0IGJlIDIga2luZHMgb2YgZXJyb3JzCisJICogMSkgTm8gY29tcGxldGlvbiAodGltZW91dCByZWFjaGVkKQorCSAqIDIpIFRoZXJlIGlzIGNvbXBsZXRpb24gYnV0IHRoZSBkZXZpY2UgZGlkbid0IGdldCBhbnkgbXNpLXggaW50ZXJydXB0LgorCSAqLworCWlmICh1bmxpa2VseShjb21wX2N0eC0+c3RhdHVzID09IEVOQV9DTURfU1VCTUlUVEVEKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCQllbmFfY29tX2hhbmRsZV9hZG1pbl9jb21wbGV0aW9uKGFkbWluX3F1ZXVlKTsKKwkJYWRtaW5fcXVldWUtPnN0YXRzLm5vX2NvbXBsZXRpb24rKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworCisJCWlmIChjb21wX2N0eC0+c3RhdHVzID09IEVOQV9DTURfQ09NUExFVEVEKQorCQkJcHJfZXJyKCJUaGUgZW5hIGRldmljZSBoYXZlIGNvbXBsZXRpb24gYnV0IHRoZSBkcml2ZXIgZGlkbid0IHJlY2VpdmUgYW55IE1TSS1YIGludGVycnVwdCAoY21kICVkKVxuIiwKKwkJCSAgICAgICBjb21wX2N0eC0+Y21kX29wY29kZSk7CisJCWVsc2UKKwkJCXByX2VycigiVGhlIGVuYSBkZXZpY2UgZG9lc24ndCBzZW5kIGFueSBjb21wbGV0aW9uIGZvciB0aGUgYWRtaW4gY21kICVkIHN0YXR1cyAlZFxuIiwKKwkJCSAgICAgICBjb21wX2N0eC0+Y21kX29wY29kZSwgY29tcF9jdHgtPnN0YXR1cyk7CisKKwkJYWRtaW5fcXVldWUtPnJ1bm5pbmdfc3RhdGUgPSBmYWxzZTsKKwkJcmV0ID0gLUVUSU1FOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBlbmFfY29tX2NvbXBfc3RhdHVzX3RvX2Vycm5vKGNvbXBfY3R4LT5jb21wX3N0YXR1cyk7CitlcnI6CisJY29tcF9jdHh0X3JlbGVhc2UoYWRtaW5fcXVldWUsIGNvbXBfY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBUaGlzIG1ldGhvZCByZWFkIHRoZSBoYXJkd2FyZSBkZXZpY2UgcmVnaXN0ZXIgdGhyb3VnaCBwb3N0aW5nIHdyaXRlcworICogYW5kIHdhaXRpbmcgZm9yIHJlc3BvbnNlCisgKiBPbiB0aW1lb3V0IHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBFTkFfTU1JT19SRUFEX1RJTUVPVVQKKyAqLworc3RhdGljIHUzMiBlbmFfY29tX3JlZ19iYXJfcmVhZDMyKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTE2IG9mZnNldCkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9tbWlvX3JlYWQgKm1taW9fcmVhZCA9ICZlbmFfZGV2LT5tbWlvX3JlYWQ7CisJdm9sYXRpbGUgc3RydWN0IGVuYV9hZG1pbl9lbmFfbW1pb19yZXFfcmVhZF9sZXNzX3Jlc3AgKnJlYWRfcmVzcCA9CisJCW1taW9fcmVhZC0+cmVhZF9yZXNwOworCXUzMiBtbWlvX3JlYWRfcmVnLCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwkvKiBJZiByZWFkbGVzcyBpcyBkaXNhYmxlZCwgcGVyZm9ybSByZWd1bGFyIHJlYWQgKi8KKwlpZiAoIW1taW9fcmVhZC0+cmVhZGxlc3Nfc3VwcG9ydGVkKQorCQlyZXR1cm4gcmVhZGwoZW5hX2Rldi0+cmVnX2JhciArIG9mZnNldCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbW1pb19yZWFkLT5sb2NrLCBmbGFncyk7CisJbW1pb19yZWFkLT5zZXFfbnVtKys7CisKKwlyZWFkX3Jlc3AtPnJlcV9pZCA9IG1taW9fcmVhZC0+c2VxX251bSArIDB4REVBRDsKKwltbWlvX3JlYWRfcmVnID0gKG9mZnNldCA8PCBFTkFfUkVHU19NTUlPX1JFR19SRUFEX1JFR19PRkZfU0hJRlQpICYKKwkJCUVOQV9SRUdTX01NSU9fUkVHX1JFQURfUkVHX09GRl9NQVNLOworCW1taW9fcmVhZF9yZWcgfD0gbW1pb19yZWFkLT5zZXFfbnVtICYKKwkJCUVOQV9SRUdTX01NSU9fUkVHX1JFQURfUkVRX0lEX01BU0s7CisKKwkvKiBtYWtlIHN1cmUgcmVhZF9yZXNwLT5yZXFfaWQgZ2V0IHVwZGF0ZWQgYmVmb3JlIHRoZSBodyBjYW4gd3JpdGUKKwkgKiB0aGVyZQorCSAqLworCXdtYigpOworCisJd3JpdGVsKG1taW9fcmVhZF9yZWcsIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19NTUlPX1JFR19SRUFEX09GRik7CisKKwlmb3IgKGkgPSAwOyBpIDwgRU5BX1JFR19SRUFEX1RJTUVPVVQ7IGkrKykgeworCQlpZiAocmVhZF9yZXNwLT5yZXFfaWQgPT0gbW1pb19yZWFkLT5zZXFfbnVtKQorCQkJYnJlYWs7CisKKwkJdWRlbGF5KDEpOworCX0KKworCWlmICh1bmxpa2VseShpID09IEVOQV9SRUdfUkVBRF9USU1FT1VUKSkgeworCQlwcl9lcnIoInJlYWRpbmcgcmVnIGZhaWxlZCBmb3IgdGltZW91dC4gZXhwZWN0ZWQ6IHJlcSBpZFslaHVdIG9mZnNldFslaHVdIGFjdHVhbDogcmVxIGlkWyVodV0gb2Zmc2V0WyVodV1cbiIsCisJCSAgICAgICBtbWlvX3JlYWQtPnNlcV9udW0sIG9mZnNldCwgcmVhZF9yZXNwLT5yZXFfaWQsCisJCSAgICAgICByZWFkX3Jlc3AtPnJlZ19vZmYpOworCQlyZXQgPSBFTkFfTU1JT19SRUFEX1RJTUVPVVQ7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChyZWFkX3Jlc3AtPnJlZ19vZmYgIT0gb2Zmc2V0KSB7CisJCXByX2VycigiUmVhZCBmYWlsdXJlOiB3cm9uZyBvZmZzZXQgcHJvdmlkZWQiKTsKKwkJcmV0ID0gRU5BX01NSU9fUkVBRF9USU1FT1VUOworCX0gZWxzZSB7CisJCXJldCA9IHJlYWRfcmVzcC0+cmVnX3ZhbDsKKwl9CitlcnI6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbW1pb19yZWFkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBUaGVyZSBhcmUgdHdvIHR5cGVzIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uCisgKiBQb2xsaW5nIG1vZGUgLSB3YWl0IHVudGlsIHRoZSBjb21wbGV0aW9uIGlzIGF2YWlsYWJsZS4KKyAqIEFzeW5jIG1vZGUgLSB3YWl0IG9uIHdhaXQgcXVldWUgdW50aWwgdGhlIGNvbXBsZXRpb24gaXMgcmVhZHkKKyAqIChvciB0aGUgdGltZW91dCBleHBpcmVkKS4KKyAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIElSUSBjYWxsZWQgZW5hX2NvbV9oYW5kbGVfYWRtaW5fY29tcGxldGlvbgorICogdG8gbWFyayB0aGUgY29tcGxldGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgZW5hX2NvbV93YWl0X2FuZF9wcm9jZXNzX2FkbWluX2NxKHN0cnVjdCBlbmFfY29tcF9jdHggKmNvbXBfY3R4LAorCQkJCQkgICAgIHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSkKK3sKKwlpZiAoYWRtaW5fcXVldWUtPnBvbGxpbmcpCisJCXJldHVybiBlbmFfY29tX3dhaXRfYW5kX3Byb2Nlc3NfYWRtaW5fY3FfcG9sbGluZyhjb21wX2N0eCwKKwkJCQkJCQkJIGFkbWluX3F1ZXVlKTsKKworCXJldHVybiBlbmFfY29tX3dhaXRfYW5kX3Byb2Nlc3NfYWRtaW5fY3FfaW50ZXJydXB0cyhjb21wX2N0eCwKKwkJCQkJCQkgICAgYWRtaW5fcXVldWUpOworfQorCitzdGF0aWMgaW50IGVuYV9jb21fZGVzdHJveV9pb19zcShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJIHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9kZXN0cm95X3NxX2NtZCBkZXN0cm95X2NtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9kZXN0cm95X3NxX3Jlc3BfZGVzYyBkZXN0cm95X3Jlc3A7CisJdTggZGlyZWN0aW9uOworCWludCByZXQ7CisKKwltZW1zZXQoJmRlc3Ryb3lfY21kLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX2FxX2Rlc3Ryb3lfc3FfY21kKSk7CisKKwlpZiAoaW9fc3EtPmRpcmVjdGlvbiA9PSBFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9UWCkKKwkJZGlyZWN0aW9uID0gRU5BX0FETUlOX1NRX0RJUkVDVElPTl9UWDsKKwllbHNlCisJCWRpcmVjdGlvbiA9IEVOQV9BRE1JTl9TUV9ESVJFQ1RJT05fUlg7CisKKwlkZXN0cm95X2NtZC5zcS5zcV9pZGVudGl0eSB8PSAoZGlyZWN0aW9uIDw8CisJCUVOQV9BRE1JTl9TUV9TUV9ESVJFQ1RJT05fU0hJRlQpICYKKwkJRU5BX0FETUlOX1NRX1NRX0RJUkVDVElPTl9NQVNLOworCisJZGVzdHJveV9jbWQuc3Euc3FfaWR4ID0gaW9fc3EtPmlkeDsKKwlkZXN0cm95X2NtZC5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fREVTVFJPWV9TUTsKKworCXJldCA9IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKikmZGVzdHJveV9jbWQsCisJCQkJCSAgICBzaXplb2YoZGVzdHJveV9jbWQpLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopJmRlc3Ryb3lfcmVzcCwKKwkJCQkJICAgIHNpemVvZihkZXN0cm95X3Jlc3ApKTsKKworCWlmICh1bmxpa2VseShyZXQgJiYgKHJldCAhPSAtRU5PREVWKSkpCisJCXByX2VycigiZmFpbGVkIHRvIGRlc3Ryb3kgaW8gc3EgZXJyb3I6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZW5hX2NvbV9pb19xdWV1ZV9mcmVlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkgIHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwKKwkJCQkgIHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSkKK3sKKwlzaXplX3Qgc2l6ZTsKKworCWlmIChpb19jcS0+Y2Rlc2NfYWRkci52aXJ0X2FkZHIpIHsKKwkJc2l6ZSA9IGlvX2NxLT5jZGVzY19lbnRyeV9zaXplX2luX2J5dGVzICogaW9fY3EtPnFfZGVwdGg7CisKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLAorCQkJCSAgaW9fY3EtPmNkZXNjX2FkZHIudmlydF9hZGRyLAorCQkJCSAgaW9fY3EtPmNkZXNjX2FkZHIucGh5c19hZGRyKTsKKworCQlpb19jcS0+Y2Rlc2NfYWRkci52aXJ0X2FkZHIgPSBOVUxMOworCX0KKworCWlmIChpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkcikgeworCQlzaXplID0gaW9fc3EtPmRlc2NfZW50cnlfc2l6ZSAqIGlvX3NxLT5xX2RlcHRoOworCisJCWlmIChpb19zcS0+bWVtX3F1ZXVlX3R5cGUgPT0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfSE9TVCkKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwKKwkJCQkJICBpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkciwKKwkJCQkJICBpb19zcS0+ZGVzY19hZGRyLnBoeXNfYWRkcik7CisJCWVsc2UKKwkJCWRldm1fa2ZyZWUoZW5hX2Rldi0+ZG1hZGV2LCBpb19zcS0+ZGVzY19hZGRyLnZpcnRfYWRkcik7CisKKwkJaW9fc3EtPmRlc2NfYWRkci52aXJ0X2FkZHIgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCB3YWl0X2Zvcl9yZXNldF9zdGF0ZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUzMiB0aW1lb3V0LAorCQkJCXUxNiBleHBfc3RhdGUpCit7CisJdTMyIHZhbCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0aW1lb3V0OyBpKyspIHsKKwkJdmFsID0gZW5hX2NvbV9yZWdfYmFyX3JlYWQzMihlbmFfZGV2LCBFTkFfUkVHU19ERVZfU1RTX09GRik7CisKKwkJaWYgKHVubGlrZWx5KHZhbCA9PSBFTkFfTU1JT19SRUFEX1RJTUVPVVQpKSB7CisJCQlwcl9lcnIoIlJlZyByZWFkIHRpbWVvdXQgb2NjdXJyZWRcbiIpOworCQkJcmV0dXJuIC1FVElNRTsKKwkJfQorCisJCWlmICgodmFsICYgRU5BX1JFR1NfREVWX1NUU19SRVNFVF9JTl9QUk9HUkVTU19NQVNLKSA9PQorCQkJZXhwX3N0YXRlKQorCQkJcmV0dXJuIDA7CisKKwkJLyogVGhlIHJlc29sdXRpb24gb2YgdGhlIHRpbWVvdXQgaXMgMTAwbXMgKi8KKwkJbXNsZWVwKDEwMCk7CisJfQorCisJcmV0dXJuIC1FVElNRTsKK30KKworc3RhdGljIGJvb2wgZW5hX2NvbV9jaGVja19zdXBwb3J0ZWRfZmVhdHVyZV9pZChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJCSAgICAgICBlbnVtIGVuYV9hZG1pbl9hcV9mZWF0dXJlX2lkIGZlYXR1cmVfaWQpCit7CisJdTMyIGZlYXR1cmVfbWFzayA9IDEgPDwgZmVhdHVyZV9pZDsKKworCS8qIERldmljZSBhdHRyaWJ1dGVzIGlzIGFsd2F5cyBzdXBwb3J0ZWQgKi8KKwlpZiAoKGZlYXR1cmVfaWQgIT0gRU5BX0FETUlOX0RFVklDRV9BVFRSSUJVVEVTKSAmJgorCSAgICAhKGVuYV9kZXYtPnN1cHBvcnRlZF9mZWF0dXJlcyAmIGZlYXR1cmVfbWFzaykpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGVuYV9jb21fZ2V0X2ZlYXR1cmVfZXgoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCSAgc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwICpnZXRfcmVzcCwKKwkJCQkgIGVudW0gZW5hX2FkbWluX2FxX2ZlYXR1cmVfaWQgZmVhdHVyZV9pZCwKKwkJCQkgIGRtYV9hZGRyX3QgY29udHJvbF9idWZfZG1hX2FkZHIsCisJCQkJICB1MzIgY29udHJvbF9idWZmX3NpemUpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfY21kIGdldF9jbWQ7CisJaW50IHJldDsKKworCWlmICghZW5hX2NvbV9jaGVja19zdXBwb3J0ZWRfZmVhdHVyZV9pZChlbmFfZGV2LCBmZWF0dXJlX2lkKSkgeworCQlwcl9pbmZvKCJGZWF0dXJlICVkIGlzbid0IHN1cHBvcnRlZFxuIiwgZmVhdHVyZV9pZCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJbWVtc2V0KCZnZXRfY21kLCAweDAsIHNpemVvZihnZXRfY21kKSk7CisJYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisKKwlnZXRfY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9HRVRfRkVBVFVSRTsKKworCWlmIChjb250cm9sX2J1ZmZfc2l6ZSkKKwkJZ2V0X2NtZC5hcV9jb21tb25fZGVzY3JpcHRvci5mbGFncyA9CisJCQlFTkFfQURNSU5fQVFfQ09NTU9OX0RFU0NfQ1RSTF9EQVRBX0lORElSRUNUX01BU0s7CisJZWxzZQorCQlnZXRfY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLmZsYWdzID0gMDsKKworCXJldCA9IGVuYV9jb21fbWVtX2FkZHJfc2V0KGVuYV9kZXYsCisJCQkJICAgJmdldF9jbWQuY29udHJvbF9idWZmZXIuYWRkcmVzcywKKwkJCQkgICBjb250cm9sX2J1Zl9kbWFfYWRkcik7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWRkcmVzcyBzZXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlnZXRfY21kLmNvbnRyb2xfYnVmZmVyLmxlbmd0aCA9IGNvbnRyb2xfYnVmZl9zaXplOworCisJZ2V0X2NtZC5mZWF0X2NvbW1vbi5mZWF0dXJlX2lkID0gZmVhdHVyZV9pZDsKKworCXJldCA9IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKikKKwkJCQkJICAgICZnZXRfY21kLAorCQkJCQkgICAgc2l6ZW9mKGdldF9jbWQpLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopCisJCQkJCSAgICBnZXRfcmVzcCwKKwkJCQkJICAgIHNpemVvZigqZ2V0X3Jlc3ApKTsKKworCWlmICh1bmxpa2VseShyZXQpKQorCQlwcl9lcnIoIkZhaWxlZCB0byBzdWJtaXQgZ2V0X2ZlYXR1cmUgY29tbWFuZCAlZCBlcnJvcjogJWRcbiIsCisJCSAgICAgICBmZWF0dXJlX2lkLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2dldF9mZWF0dXJlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgICBzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgKmdldF9yZXNwLAorCQkJICAgICAgIGVudW0gZW5hX2FkbWluX2FxX2ZlYXR1cmVfaWQgZmVhdHVyZV9pZCkKK3sKKwlyZXR1cm4gZW5hX2NvbV9nZXRfZmVhdHVyZV9leChlbmFfZGV2LAorCQkJCSAgICAgIGdldF9yZXNwLAorCQkJCSAgICAgIGZlYXR1cmVfaWQsCisJCQkJICAgICAgMCwKKwkJCQkgICAgICAwKTsKK30KKworc3RhdGljIGludCBlbmFfY29tX2hhc2hfa2V5X2FsbG9jYXRlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKworCXJzcy0+aGFzaF9rZXkgPQorCQlkbWFfemFsbG9jX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZW9mKCpyc3MtPmhhc2hfa2V5KSwKKwkJCQkgICAgJnJzcy0+aGFzaF9rZXlfZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCisJaWYgKHVubGlrZWx5KCFyc3MtPmhhc2hfa2V5KSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hX2NvbV9oYXNoX2tleV9kZXN0cm95KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKworCWlmIChyc3MtPmhhc2hfa2V5KQorCQlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemVvZigqcnNzLT5oYXNoX2tleSksCisJCQkJICByc3MtPmhhc2hfa2V5LCByc3MtPmhhc2hfa2V5X2RtYV9hZGRyKTsKKwlyc3MtPmhhc2hfa2V5ID0gTlVMTDsKK30KKworc3RhdGljIGludCBlbmFfY29tX2hhc2hfY3RybF9pbml0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKworCXJzcy0+aGFzaF9jdHJsID0KKwkJZG1hX3phbGxvY19jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemVvZigqcnNzLT5oYXNoX2N0cmwpLAorCQkJCSAgICAmcnNzLT5oYXNoX2N0cmxfZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCisJaWYgKHVubGlrZWx5KCFyc3MtPmhhc2hfY3RybCkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9jb21faGFzaF9jdHJsX2Rlc3Ryb3koc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCisJaWYgKHJzcy0+aGFzaF9jdHJsKQorCQlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHNpemVvZigqcnNzLT5oYXNoX2N0cmwpLAorCQkJCSAgcnNzLT5oYXNoX2N0cmwsIHJzcy0+aGFzaF9jdHJsX2RtYV9hZGRyKTsKKwlyc3MtPmhhc2hfY3RybCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9hbGxvY2F0ZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJCSAgIHUxNiBsb2dfc2l6ZSkKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgZ2V0X3Jlc3A7CisJc2l6ZV90IHRibF9zaXplOworCWludCByZXQ7CisKKwlyZXQgPSBlbmFfY29tX2dldF9mZWF0dXJlKGVuYV9kZXYsICZnZXRfcmVzcCwKKwkJCQkgIEVOQV9BRE1JTl9SU1NfUkVESVJFQ1RJT05fVEFCTEVfQ09ORklHKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcmV0dXJuIHJldDsKKworCWlmICgoZ2V0X3Jlc3AudS5pbmRfdGFibGUubWluX3NpemUgPiBsb2dfc2l6ZSkgfHwKKwkgICAgKGdldF9yZXNwLnUuaW5kX3RhYmxlLm1heF9zaXplIDwgbG9nX3NpemUpKSB7CisJCXByX2VycigiaW5kaXJlY3QgdGFibGUgc2l6ZSBkb2Vzbid0IGZpdC4gcmVxdWVzdGVkIHNpemU6ICVkIHdoaWxlIG1pbiBpczolZCBhbmQgbWF4ICVkXG4iLAorCQkgICAgICAgMSA8PCBsb2dfc2l6ZSwgMSA8PCBnZXRfcmVzcC51LmluZF90YWJsZS5taW5fc2l6ZSwKKwkJICAgICAgIDEgPDwgZ2V0X3Jlc3AudS5pbmRfdGFibGUubWF4X3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl0Ymxfc2l6ZSA9ICgxVUxMIDw8IGxvZ19zaXplKSAqCisJCXNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX3Jzc19pbmRfdGFibGVfZW50cnkpOworCisJcnNzLT5yc3NfaW5kX3RibCA9CisJCWRtYV96YWxsb2NfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCB0Ymxfc2l6ZSwKKwkJCQkgICAgJnJzcy0+cnNzX2luZF90YmxfZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghcnNzLT5yc3NfaW5kX3RibCkpCisJCWdvdG8gbWVtX2VycjE7CisKKwl0Ymxfc2l6ZSA9ICgxVUxMIDw8IGxvZ19zaXplKSAqIHNpemVvZih1MTYpOworCXJzcy0+aG9zdF9yc3NfaW5kX3RibCA9CisJCWRldm1fa3phbGxvYyhlbmFfZGV2LT5kbWFkZXYsIHRibF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXJzcy0+aG9zdF9yc3NfaW5kX3RibCkpCisJCWdvdG8gbWVtX2VycjI7CisKKwlyc3MtPnRibF9sb2dfc2l6ZSA9IGxvZ19zaXplOworCisJcmV0dXJuIDA7CisKK21lbV9lcnIyOgorCXRibF9zaXplID0gKDFVTEwgPDwgbG9nX3NpemUpICoKKwkJc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fcnNzX2luZF90YWJsZV9lbnRyeSk7CisKKwlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHRibF9zaXplLCByc3MtPnJzc19pbmRfdGJsLAorCQkJICByc3MtPnJzc19pbmRfdGJsX2RtYV9hZGRyKTsKKwlyc3MtPnJzc19pbmRfdGJsID0gTlVMTDsKK21lbV9lcnIxOgorCXJzcy0+dGJsX2xvZ19zaXplID0gMDsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9kZXN0cm95KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzaXplX3QgdGJsX3NpemUgPSAoMVVMTCA8PCByc3MtPnRibF9sb2dfc2l6ZSkgKgorCQlzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9yc3NfaW5kX3RhYmxlX2VudHJ5KTsKKworCWlmIChyc3MtPnJzc19pbmRfdGJsKQorCQlkbWFfZnJlZV9jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsIHRibF9zaXplLCByc3MtPnJzc19pbmRfdGJsLAorCQkJCSAgcnNzLT5yc3NfaW5kX3RibF9kbWFfYWRkcik7CisJcnNzLT5yc3NfaW5kX3RibCA9IE5VTEw7CisKKwlpZiAocnNzLT5ob3N0X3Jzc19pbmRfdGJsKQorCQlkZXZtX2tmcmVlKGVuYV9kZXYtPmRtYWRldiwgcnNzLT5ob3N0X3Jzc19pbmRfdGJsKTsKKwlyc3MtPmhvc3RfcnNzX2luZF90YmwgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGVuYV9jb21fY3JlYXRlX2lvX3NxKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQlzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsIHUxNiBjcV9pZHgpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfYWRtaW5fYXFfY3JlYXRlX3NxX2NtZCBjcmVhdGVfY21kOworCXN0cnVjdCBlbmFfYWRtaW5fYWNxX2NyZWF0ZV9zcV9yZXNwX2Rlc2MgY21kX2NvbXBsZXRpb247CisJdTggZGlyZWN0aW9uOworCWludCByZXQ7CisKKwltZW1zZXQoJmNyZWF0ZV9jbWQsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fYXFfY3JlYXRlX3NxX2NtZCkpOworCisJY3JlYXRlX2NtZC5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fQ1JFQVRFX1NROworCisJaWYgKGlvX3NxLT5kaXJlY3Rpb24gPT0gRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fVFgpCisJCWRpcmVjdGlvbiA9IEVOQV9BRE1JTl9TUV9ESVJFQ1RJT05fVFg7CisJZWxzZQorCQlkaXJlY3Rpb24gPSBFTkFfQURNSU5fU1FfRElSRUNUSU9OX1JYOworCisJY3JlYXRlX2NtZC5zcV9pZGVudGl0eSB8PSAoZGlyZWN0aW9uIDw8CisJCUVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX1NRX0RJUkVDVElPTl9TSElGVCkgJgorCQlFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9TUV9ESVJFQ1RJT05fTUFTSzsKKworCWNyZWF0ZV9jbWQuc3FfY2Fwc18yIHw9IGlvX3NxLT5tZW1fcXVldWVfdHlwZSAmCisJCUVOQV9BRE1JTl9BUV9DUkVBVEVfU1FfQ01EX1BMQUNFTUVOVF9QT0xJQ1lfTUFTSzsKKworCWNyZWF0ZV9jbWQuc3FfY2Fwc18yIHw9IChFTkFfQURNSU5fQ09NUExFVElPTl9QT0xJQ1lfREVTQyA8PAorCQlFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9DT01QTEVUSU9OX1BPTElDWV9TSElGVCkgJgorCQlFTkFfQURNSU5fQVFfQ1JFQVRFX1NRX0NNRF9DT01QTEVUSU9OX1BPTElDWV9NQVNLOworCisJY3JlYXRlX2NtZC5zcV9jYXBzXzMgfD0KKwkJRU5BX0FETUlOX0FRX0NSRUFURV9TUV9DTURfSVNfUEhZU0lDQUxMWV9DT05USUdVT1VTX01BU0s7CisKKwljcmVhdGVfY21kLmNxX2lkeCA9IGNxX2lkeDsKKwljcmVhdGVfY21kLnNxX2RlcHRoID0gaW9fc3EtPnFfZGVwdGg7CisKKwlpZiAoaW9fc3EtPm1lbV9xdWV1ZV90eXBlID09IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0hPU1QpIHsKKwkJcmV0ID0gZW5hX2NvbV9tZW1fYWRkcl9zZXQoZW5hX2RldiwKKwkJCQkJICAgJmNyZWF0ZV9jbWQuc3FfYmEsCisJCQkJCSAgIGlvX3NxLT5kZXNjX2FkZHIucGh5c19hZGRyKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCXByX2VycigibWVtb3J5IGFkZHJlc3Mgc2V0IGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0ID0gZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKSZjcmVhdGVfY21kLAorCQkJCQkgICAgc2l6ZW9mKGNyZWF0ZV9jbWQpLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopJmNtZF9jb21wbGV0aW9uLAorCQkJCQkgICAgc2l6ZW9mKGNtZF9jb21wbGV0aW9uKSk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIElPIFNRLiBlcnJvcjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW9fc3EtPmlkeCA9IGNtZF9jb21wbGV0aW9uLnNxX2lkeDsKKworCWlvX3NxLT5kYl9hZGRyID0gKHUzMiBfX2lvbWVtICopKCh1aW50cHRyX3QpZW5hX2Rldi0+cmVnX2JhciArCisJCSh1aW50cHRyX3QpY21kX2NvbXBsZXRpb24uc3FfZG9vcmJlbGxfb2Zmc2V0KTsKKworCWlmIChpb19zcS0+bWVtX3F1ZXVlX3R5cGUgPT0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfREVWKSB7CisJCWlvX3NxLT5oZWFkZXJfYWRkciA9ICh1OCBfX2lvbWVtICopKCh1aW50cHRyX3QpZW5hX2Rldi0+bWVtX2JhcgorCQkJCSsgY21kX2NvbXBsZXRpb24ubGxxX2hlYWRlcnNfb2Zmc2V0KTsKKworCQlpb19zcS0+ZGVzY19hZGRyLnBidWZfZGV2X2FkZHIgPQorCQkJKHU4IF9faW9tZW0gKikoKHVpbnRwdHJfdCllbmFfZGV2LT5tZW1fYmFyICsKKwkJCWNtZF9jb21wbGV0aW9uLmxscV9kZXNjcmlwdG9yc19vZmZzZXQpOworCX0KKworCXByX2RlYnVnKCJjcmVhdGVkIHNxWyV1XSwgZGVwdGhbJXVdXG4iLCBpb19zcS0+aWR4LCBpb19zcS0+cV9kZXB0aCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVuYV9jb21faW5kX3RibF9jb252ZXJ0X3RvX2RldmljZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxOworCXUxNiBxaWQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMSA8PCByc3MtPnRibF9sb2dfc2l6ZTsgaSsrKSB7CisJCXFpZCA9IHJzcy0+aG9zdF9yc3NfaW5kX3RibFtpXTsKKwkJaWYgKHFpZCA+PSBFTkFfVE9UQUxfTlVNX1FVRVVFUykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlvX3NxID0gJmVuYV9kZXYtPmlvX3NxX3F1ZXVlc1txaWRdOworCisJCWlmIChpb19zcS0+ZGlyZWN0aW9uICE9IEVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1JYKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcnNzLT5yc3NfaW5kX3RibFtpXS5jcV9pZHggPSBpb19zcS0+aWR4OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9jb21faW5kX3RibF9jb252ZXJ0X2Zyb21fZGV2aWNlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwl1MTYgZGV2X2lkeF90b19ob3N0X3RibFtFTkFfVE9UQUxfTlVNX1FVRVVFU10gPSB7ICh1MTYpLTEgfTsKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwl1OCBpZHg7CisJdTE2IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRU5BX1RPVEFMX05VTV9RVUVVRVM7IGkrKykKKwkJZGV2X2lkeF90b19ob3N0X3RibFtlbmFfZGV2LT5pb19zcV9xdWV1ZXNbaV0uaWR4XSA9IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMSA8PCByc3MtPnRibF9sb2dfc2l6ZTsgaSsrKSB7CisJCWlmIChyc3MtPnJzc19pbmRfdGJsW2ldLmNxX2lkeCA+IEVOQV9UT1RBTF9OVU1fUVVFVUVTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeCA9ICh1OClyc3MtPnJzc19pbmRfdGJsW2ldLmNxX2lkeDsKKworCQlpZiAoZGV2X2lkeF90b19ob3N0X3RibFtpZHhdID4gRU5BX1RPVEFMX05VTV9RVUVVRVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyc3MtPmhvc3RfcnNzX2luZF90YmxbaV0gPSBkZXZfaWR4X3RvX2hvc3RfdGJsW2lkeF07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NvbV9pbml0X2ludGVycnVwdF9tb2RlcmF0aW9uX3RhYmxlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzaXplX3Qgc2l6ZTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5KSAqIEVOQV9JTlRSX01BWF9OVU1fT0ZfTEVWRUxTOworCisJZW5hX2Rldi0+aW50cl9tb2Rlcl90YmwgPQorCQlkZXZtX2t6YWxsb2MoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVuYV9kZXYtPmludHJfbW9kZXJfdGJsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVuYV9jb21fY29uZmlnX2RlZmF1bHRfaW50ZXJydXB0X21vZGVyYXRpb25fdGFibGUoZW5hX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hX2NvbV91cGRhdGVfaW50cl9kZWxheV9yZXNvbHV0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkJCSB1MTYgaW50cl9kZWxheV9yZXNvbHV0aW9uKQoreworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqaW50cl9tb2Rlcl90YmwgPSBlbmFfZGV2LT5pbnRyX21vZGVyX3RibDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghaW50cl9kZWxheV9yZXNvbHV0aW9uKSB7CisJCXByX2VycigiSWxsZWdhbCBpbnRyX2RlbGF5X3Jlc29sdXRpb24gcHJvdmlkZWQuIEdvaW5nIHRvIHVzZSBkZWZhdWx0IDEgdXNlYyByZXNvbHV0aW9uXG4iKTsKKwkJaW50cl9kZWxheV9yZXNvbHV0aW9uID0gMTsKKwl9CisJZW5hX2Rldi0+aW50cl9kZWxheV9yZXNvbHV0aW9uID0gaW50cl9kZWxheV9yZXNvbHV0aW9uOworCisJLyogdXBkYXRlIFJ4ICovCisJZm9yIChpID0gMDsgaSA8IEVOQV9JTlRSX01BWF9OVU1fT0ZfTEVWRUxTOyBpKyspCisJCWludHJfbW9kZXJfdGJsW2ldLmludHJfbW9kZXJfaW50ZXJ2YWwgLz0gaW50cl9kZWxheV9yZXNvbHV0aW9uOworCisJLyogdXBkYXRlIFR4ICovCisJZW5hX2Rldi0+aW50cl9tb2Rlcl90eF9pbnRlcnZhbCAvPSBpbnRyX2RlbGF5X3Jlc29sdXRpb247Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICAgICAgQVBJICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSwKKwkJCQkgIHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKmNtZCwKKwkJCQkgIHNpemVfdCBjbWRfc2l6ZSwKKwkJCQkgIHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICpjb21wLAorCQkJCSAgc2l6ZV90IGNvbXBfc2l6ZSkKK3sKKwlzdHJ1Y3QgZW5hX2NvbXBfY3R4ICpjb21wX2N0eDsKKwlpbnQgcmV0OworCisJY29tcF9jdHggPSBlbmFfY29tX3N1Ym1pdF9hZG1pbl9jbWQoYWRtaW5fcXVldWUsIGNtZCwgY21kX3NpemUsCisJCQkJCSAgICBjb21wLCBjb21wX3NpemUpOworCWlmICh1bmxpa2VseShJU19FUlIoY29tcF9jdHgpKSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBzdWJtaXQgY29tbWFuZCBbJWxkXVxuIiwgUFRSX0VSUihjb21wX2N0eCkpOworCQlyZXR1cm4gUFRSX0VSUihjb21wX2N0eCk7CisJfQorCisJcmV0ID0gZW5hX2NvbV93YWl0X2FuZF9wcm9jZXNzX2FkbWluX2NxKGNvbXBfY3R4LCBhZG1pbl9xdWV1ZSk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJaWYgKGFkbWluX3F1ZXVlLT5ydW5uaW5nX3N0YXRlKQorCQkJcHJfZXJyKCJGYWlsZWQgdG8gcHJvY2VzcyBjb21tYW5kLiByZXQgPSAlZFxuIiwgcmV0KTsKKwkJZWxzZQorCQkJcHJfZGVidWcoIkZhaWxlZCB0byBwcm9jZXNzIGNvbW1hbmQuIHJldCA9ICVkXG4iLCByZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgZW5hX2NvbV9jcmVhdGVfaW9fY3Eoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJIHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9jcmVhdGVfY3FfY21kIGNyZWF0ZV9jbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfY3JlYXRlX2NxX3Jlc3BfZGVzYyBjbWRfY29tcGxldGlvbjsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZjcmVhdGVfY21kLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX2FxX2NyZWF0ZV9jcV9jbWQpKTsKKworCWNyZWF0ZV9jbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX0NSRUFURV9DUTsKKworCWNyZWF0ZV9jbWQuY3FfY2Fwc18yIHw9IChpb19jcS0+Y2Rlc2NfZW50cnlfc2l6ZV9pbl9ieXRlcyAvIDQpICYKKwkJRU5BX0FETUlOX0FRX0NSRUFURV9DUV9DTURfQ1FfRU5UUllfU0laRV9XT1JEU19NQVNLOworCWNyZWF0ZV9jbWQuY3FfY2Fwc18xIHw9CisJCUVOQV9BRE1JTl9BUV9DUkVBVEVfQ1FfQ01EX0lOVEVSUlVQVF9NT0RFX0VOQUJMRURfTUFTSzsKKworCWNyZWF0ZV9jbWQubXNpeF92ZWN0b3IgPSBpb19jcS0+bXNpeF92ZWN0b3I7CisJY3JlYXRlX2NtZC5jcV9kZXB0aCA9IGlvX2NxLT5xX2RlcHRoOworCisJcmV0ID0gZW5hX2NvbV9tZW1fYWRkcl9zZXQoZW5hX2RldiwKKwkJCQkgICAmY3JlYXRlX2NtZC5jcV9iYSwKKwkJCQkgICBpb19jcS0+Y2Rlc2NfYWRkci5waHlzX2FkZHIpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCXByX2VycigibWVtb3J5IGFkZHJlc3Mgc2V0IGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKSZjcmVhdGVfY21kLAorCQkJCQkgICAgc2l6ZW9mKGNyZWF0ZV9jbWQpLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopJmNtZF9jb21wbGV0aW9uLAorCQkJCQkgICAgc2l6ZW9mKGNtZF9jb21wbGV0aW9uKSk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIElPIENRLiBlcnJvcjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW9fY3EtPmlkeCA9IGNtZF9jb21wbGV0aW9uLmNxX2lkeDsKKworCWlvX2NxLT51bm1hc2tfcmVnID0gKHUzMiBfX2lvbWVtICopKCh1aW50cHRyX3QpZW5hX2Rldi0+cmVnX2JhciArCisJCWNtZF9jb21wbGV0aW9uLmNxX2ludGVycnVwdF91bm1hc2tfcmVnaXN0ZXJfb2Zmc2V0KTsKKworCWlmIChjbWRfY29tcGxldGlvbi5jcV9oZWFkX2RiX3JlZ2lzdGVyX29mZnNldCkKKwkJaW9fY3EtPmNxX2hlYWRfZGJfcmVnID0KKwkJCSh1MzIgX19pb21lbSAqKSgodWludHB0cl90KWVuYV9kZXYtPnJlZ19iYXIgKworCQkJY21kX2NvbXBsZXRpb24uY3FfaGVhZF9kYl9yZWdpc3Rlcl9vZmZzZXQpOworCisJaWYgKGNtZF9jb21wbGV0aW9uLm51bWFfbm9kZV9yZWdpc3Rlcl9vZmZzZXQpCisJCWlvX2NxLT5udW1hX25vZGVfY2ZnX3JlZyA9CisJCQkodTMyIF9faW9tZW0gKikoKHVpbnRwdHJfdCllbmFfZGV2LT5yZWdfYmFyICsKKwkJCWNtZF9jb21wbGV0aW9uLm51bWFfbm9kZV9yZWdpc3Rlcl9vZmZzZXQpOworCisJcHJfZGVidWcoImNyZWF0ZWQgY3FbJXVdLCBkZXB0aFsldV1cbiIsIGlvX2NxLT5pZHgsIGlvX2NxLT5xX2RlcHRoKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBlbmFfY29tX2dldF9pb19oYW5kbGVycyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUxNiBxaWQsCisJCQkgICAgc3RydWN0IGVuYV9jb21faW9fc3EgKippb19zcSwKKwkJCSAgICBzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqKmlvX2NxKQoreworCWlmIChxaWQgPj0gRU5BX1RPVEFMX05VTV9RVUVVRVMpIHsKKwkJcHJfZXJyKCJJbnZhbGlkIHF1ZXVlIG51bWJlciAlZCBidXQgdGhlIG1heCBpcyAlZFxuIiwgcWlkLAorCQkgICAgICAgRU5BX1RPVEFMX05VTV9RVUVVRVMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqaW9fc3EgPSAmZW5hX2Rldi0+aW9fc3FfcXVldWVzW3FpZF07CisJKmlvX2NxID0gJmVuYV9kZXYtPmlvX2NxX3F1ZXVlc1txaWRdOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW5hX2NvbV9hYm9ydF9hZG1pbl9jb21tYW5kcyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfY29tcF9jdHggKmNvbXBfY3R4OworCXUxNiBpOworCisJaWYgKCFhZG1pbl9xdWV1ZS0+Y29tcF9jdHgpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBhZG1pbl9xdWV1ZS0+cV9kZXB0aDsgaSsrKSB7CisJCWNvbXBfY3R4ID0gZ2V0X2NvbXBfY3R4dChhZG1pbl9xdWV1ZSwgaSwgZmFsc2UpOworCQlpZiAodW5saWtlbHkoIWNvbXBfY3R4KSkKKwkJCWJyZWFrOworCisJCWNvbXBfY3R4LT5zdGF0dXMgPSBFTkFfQ01EX0FCT1JURUQ7CisKKwkJY29tcGxldGUoJmNvbXBfY3R4LT53YWl0X2V2ZW50KTsKKwl9Cit9CisKK3ZvaWQgZW5hX2NvbV93YWl0X2Zvcl9hYm9ydF9jb21wbGV0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisJd2hpbGUgKGF0b21pY19yZWFkKCZhZG1pbl9xdWV1ZS0+b3V0c3RhbmRpbmdfY21kcykgIT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisJCW1zbGVlcCgyMCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZG1pbl9xdWV1ZS0+cV9sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKK30KKworaW50IGVuYV9jb21fZGVzdHJveV9pb19jcShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgIHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9kZXN0cm95X2NxX2NtZCBkZXN0cm95X2NtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9kZXN0cm95X2NxX3Jlc3BfZGVzYyBkZXN0cm95X3Jlc3A7CisJaW50IHJldDsKKworCW1lbXNldCgmZGVzdHJveV9jbWQsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fYXFfZGVzdHJveV9zcV9jbWQpKTsKKworCWRlc3Ryb3lfY21kLmNxX2lkeCA9IGlvX2NxLT5pZHg7CisJZGVzdHJveV9jbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX0RFU1RST1lfQ1E7CisKKwlyZXQgPSBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopJmRlc3Ryb3lfY21kLAorCQkJCQkgICAgc2l6ZW9mKGRlc3Ryb3lfY21kKSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKSZkZXN0cm95X3Jlc3AsCisJCQkJCSAgICBzaXplb2YoZGVzdHJveV9yZXNwKSk7CisKKwlpZiAodW5saWtlbHkocmV0ICYmIChyZXQgIT0gLUVOT0RFVikpKQorCQlwcl9lcnIoIkZhaWxlZCB0byBkZXN0cm95IElPIENRLiBlcnJvcjogJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitib29sIGVuYV9jb21fZ2V0X2FkbWluX3J1bm5pbmdfc3RhdGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXJldHVybiBlbmFfZGV2LT5hZG1pbl9xdWV1ZS5ydW5uaW5nX3N0YXRlOworfQorCit2b2lkIGVuYV9jb21fc2V0X2FkbWluX3J1bm5pbmdfc3RhdGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCBib29sIHN0YXRlKQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkbWluX3F1ZXVlLT5xX2xvY2ssIGZsYWdzKTsKKwllbmFfZGV2LT5hZG1pbl9xdWV1ZS5ydW5uaW5nX3N0YXRlID0gc3RhdGU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRtaW5fcXVldWUtPnFfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIGVuYV9jb21fYWRtaW5fYWVucV9lbmFibGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXUxNiBkZXB0aCA9IGVuYV9kZXYtPmFlbnEucV9kZXB0aDsKKworCVdBUk4oZW5hX2Rldi0+YWVucS5oZWFkICE9IGRlcHRoLCAiSW52YWxpZCBBRU5RIHN0YXRlXG4iKTsKKworCS8qIEluaXQgaGVhZF9kYiB0byBtYXJrIHRoYXQgYWxsIGVudHJpZXMgaW4gdGhlIHF1ZXVlCisJICogYXJlIGluaXRpYWxseSBhdmFpbGFibGUKKwkgKi8KKwl3cml0ZWwoZGVwdGgsIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19BRU5RX0hFQURfREJfT0ZGKTsKK30KKworaW50IGVuYV9jb21fc2V0X2FlbnFfY29uZmlnKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTMyIGdyb3Vwc19mbGFnKQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X2NtZCBjbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9yZXNwIHJlc3A7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIGdldF9yZXNwOworCWludCByZXQ7CisKKwlyZXQgPSBlbmFfY29tX2dldF9mZWF0dXJlKGVuYV9kZXYsICZnZXRfcmVzcCwgRU5BX0FETUlOX0FFTlFfQ09ORklHKTsKKwlpZiAocmV0KSB7CisJCXByX2luZm8oIkNhbid0IGdldCBhZW5xIGNvbmZpZ3VyYXRpb25cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICgoZ2V0X3Jlc3AudS5hZW5xLnN1cHBvcnRlZF9ncm91cHMgJiBncm91cHNfZmxhZykgIT0gZ3JvdXBzX2ZsYWcpIHsKKwkJcHJfd2FybigiVHJ5aW5nIHRvIHNldCB1bnN1cHBvcnRlZCBhZW5xIGV2ZW50cy4gc3VwcG9ydGVkIGZsYWc6ICV4IGFza2VkIGZsYWc6ICV4XG4iLAorCQkJZ2V0X3Jlc3AudS5hZW5xLnN1cHBvcnRlZF9ncm91cHMsIGdyb3Vwc19mbGFnKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwltZW1zZXQoJmNtZCwgMHgwLCBzaXplb2YoY21kKSk7CisJYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisKKwljbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX1NFVF9GRUFUVVJFOworCWNtZC5hcV9jb21tb25fZGVzY3JpcHRvci5mbGFncyA9IDA7CisJY21kLmZlYXRfY29tbW9uLmZlYXR1cmVfaWQgPSBFTkFfQURNSU5fQUVOUV9DT05GSUc7CisJY21kLnUuYWVucS5lbmFibGVkX2dyb3VwcyA9IGdyb3Vwc19mbGFnOworCisJcmV0ID0gZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKSZjbWQsCisJCQkJCSAgICBzaXplb2YoY21kKSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKSZyZXNwLAorCQkJCQkgICAgc2l6ZW9mKHJlc3ApKTsKKworCWlmICh1bmxpa2VseShyZXQpKQorCQlwcl9lcnIoIkZhaWxlZCB0byBjb25maWcgQUVOUSByZXQ6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGVuYV9jb21fZ2V0X2RtYV93aWR0aChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJdTMyIGNhcHMgPSBlbmFfY29tX3JlZ19iYXJfcmVhZDMyKGVuYV9kZXYsIEVOQV9SRUdTX0NBUFNfT0ZGKTsKKwlpbnQgd2lkdGg7CisKKwlpZiAodW5saWtlbHkoY2FwcyA9PSBFTkFfTU1JT19SRUFEX1RJTUVPVVQpKSB7CisJCXByX2VycigiUmVnIHJlYWQgdGltZW91dCBvY2N1cnJlZFxuIik7CisJCXJldHVybiAtRVRJTUU7CisJfQorCisJd2lkdGggPSAoY2FwcyAmIEVOQV9SRUdTX0NBUFNfRE1BX0FERFJfV0lEVEhfTUFTSykgPj4KKwkJRU5BX1JFR1NfQ0FQU19ETUFfQUREUl9XSURUSF9TSElGVDsKKworCXByX2RlYnVnKCJFTkEgZG1hIHdpZHRoOiAlZFxuIiwgd2lkdGgpOworCisJaWYgKCh3aWR0aCA8IDMyKSB8fCB3aWR0aCA+IEVOQV9NQVhfUEhZU19BRERSX1NJWkVfQklUUykgeworCQlwcl9lcnIoIkRNQSB3aWR0aCBpbGxlZ2FsIHZhbHVlOiAlZFxuIiwgd2lkdGgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllbmFfZGV2LT5kbWFfYWRkcl9iaXRzID0gd2lkdGg7CisKKwlyZXR1cm4gd2lkdGg7Cit9CisKK2ludCBlbmFfY29tX3ZhbGlkYXRlX3ZlcnNpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXUzMiB2ZXI7CisJdTMyIGN0cmxfdmVyOworCXUzMiBjdHJsX3Zlcl9tYXNrZWQ7CisKKwkvKiBNYWtlIHN1cmUgdGhlIEVOQSB2ZXJzaW9uIGFuZCB0aGUgY29udHJvbGxlciB2ZXJzaW9uIGFyZSBhdCBsZWFzdAorCSAqIGFzIHRoZSBkcml2ZXIgZXhwZWN0cworCSAqLworCXZlciA9IGVuYV9jb21fcmVnX2Jhcl9yZWFkMzIoZW5hX2RldiwgRU5BX1JFR1NfVkVSU0lPTl9PRkYpOworCWN0cmxfdmVyID0gZW5hX2NvbV9yZWdfYmFyX3JlYWQzMihlbmFfZGV2LAorCQkJCQkgIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9PRkYpOworCisJaWYgKHVubGlrZWx5KCh2ZXIgPT0gRU5BX01NSU9fUkVBRF9USU1FT1VUKSB8fAorCQkgICAgIChjdHJsX3ZlciA9PSBFTkFfTU1JT19SRUFEX1RJTUVPVVQpKSkgeworCQlwcl9lcnIoIlJlZyByZWFkIHRpbWVvdXQgb2NjdXJyZWRcbiIpOworCQlyZXR1cm4gLUVUSU1FOworCX0KKworCXByX2luZm8oImVuYSBkZXZpY2UgdmVyc2lvbjogJWQuJWRcbiIsCisJCSh2ZXIgJiBFTkFfUkVHU19WRVJTSU9OX01BSk9SX1ZFUlNJT05fTUFTSykgPj4KKwkJCUVOQV9SRUdTX1ZFUlNJT05fTUFKT1JfVkVSU0lPTl9TSElGVCwKKwkJdmVyICYgRU5BX1JFR1NfVkVSU0lPTl9NSU5PUl9WRVJTSU9OX01BU0spOworCisJaWYgKHZlciA8IE1JTl9FTkFfVkVSKSB7CisJCXByX2VycigiRU5BIHZlcnNpb24gaXMgbG93ZXIgdGhhbiB0aGUgbWluaW1hbCB2ZXJzaW9uIHRoZSBkcml2ZXIgc3VwcG9ydHNcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJfaW5mbygiZW5hIGNvbnRyb2xsZXIgdmVyc2lvbjogJWQuJWQuJWQgaW1wbGVtZW50YXRpb24gdmVyc2lvbiAlZFxuIiwKKwkJKGN0cmxfdmVyICYgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01BSk9SX1ZFUlNJT05fTUFTSykgPj4KKwkJCUVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NQUpPUl9WRVJTSU9OX1NISUZULAorCQkoY3RybF92ZXIgJiBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUlOT1JfVkVSU0lPTl9NQVNLKSA+PgorCQkJRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01JTk9SX1ZFUlNJT05fU0hJRlQsCisJCShjdHJsX3ZlciAmIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9TVUJNSU5PUl9WRVJTSU9OX01BU0spLAorCQkoY3RybF92ZXIgJiBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fSU1QTF9JRF9NQVNLKSA+PgorCQkJRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX0lNUExfSURfU0hJRlQpOworCisJY3RybF92ZXJfbWFza2VkID0KKwkJKGN0cmxfdmVyICYgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01BSk9SX1ZFUlNJT05fTUFTSykgfAorCQkoY3RybF92ZXIgJiBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUlOT1JfVkVSU0lPTl9NQVNLKSB8CisJCShjdHJsX3ZlciAmIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9TVUJNSU5PUl9WRVJTSU9OX01BU0spOworCisJLyogVmFsaWRhdGUgdGhlIGN0cmwgdmVyc2lvbiB3aXRob3V0IHRoZSBpbXBsZW1lbnRhdGlvbiBJRCAqLworCWlmIChjdHJsX3Zlcl9tYXNrZWQgPCBNSU5fRU5BX0NUUkxfVkVSKSB7CisJCXByX2VycigiRU5BIGN0cmwgdmVyc2lvbiBpcyBsb3dlciB0aGFuIHRoZSBtaW5pbWFsIGN0cmwgdmVyc2lvbiB0aGUgZHJpdmVyIHN1cHBvcnRzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGVuYV9jb21fYWRtaW5fZGVzdHJveShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfY29tX2FkbWluX2NxICpjcSA9ICZhZG1pbl9xdWV1ZS0+Y3E7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fc3EgKnNxID0gJmFkbWluX3F1ZXVlLT5zcTsKKwlzdHJ1Y3QgZW5hX2NvbV9hZW5xICphZW5xID0gJmVuYV9kZXYtPmFlbnE7CisJdTE2IHNpemU7CisKKwlpZiAoYWRtaW5fcXVldWUtPmNvbXBfY3R4KQorCQlkZXZtX2tmcmVlKGVuYV9kZXYtPmRtYWRldiwgYWRtaW5fcXVldWUtPmNvbXBfY3R4KTsKKwlhZG1pbl9xdWV1ZS0+Y29tcF9jdHggPSBOVUxMOworCXNpemUgPSBBRE1JTl9TUV9TSVpFKGFkbWluX3F1ZXVlLT5xX2RlcHRoKTsKKwlpZiAoc3EtPmVudHJpZXMpCisJCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwgc3EtPmVudHJpZXMsCisJCQkJICBzcS0+ZG1hX2FkZHIpOworCXNxLT5lbnRyaWVzID0gTlVMTDsKKworCXNpemUgPSBBRE1JTl9DUV9TSVpFKGFkbWluX3F1ZXVlLT5xX2RlcHRoKTsKKwlpZiAoY3EtPmVudHJpZXMpCisJCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgc2l6ZSwgY3EtPmVudHJpZXMsCisJCQkJICBjcS0+ZG1hX2FkZHIpOworCWNxLT5lbnRyaWVzID0gTlVMTDsKKworCXNpemUgPSBBRE1JTl9BRU5RX1NJWkUoYWVucS0+cV9kZXB0aCk7CisJaWYgKGVuYV9kZXYtPmFlbnEuZW50cmllcykKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplLCBhZW5xLT5lbnRyaWVzLAorCQkJCSAgYWVucS0+ZG1hX2FkZHIpOworCWFlbnEtPmVudHJpZXMgPSBOVUxMOworfQorCit2b2lkIGVuYV9jb21fc2V0X2FkbWluX3BvbGxpbmdfbW9kZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIGJvb2wgcG9sbGluZykKK3sKKwllbmFfZGV2LT5hZG1pbl9xdWV1ZS5wb2xsaW5nID0gcG9sbGluZzsKK30KKworaW50IGVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X2luaXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfY29tX21taW9fcmVhZCAqbW1pb19yZWFkID0gJmVuYV9kZXYtPm1taW9fcmVhZDsKKworCXNwaW5fbG9ja19pbml0KCZtbWlvX3JlYWQtPmxvY2spOworCW1taW9fcmVhZC0+cmVhZF9yZXNwID0KKwkJZG1hX3phbGxvY19jb2hlcmVudChlbmFfZGV2LT5kbWFkZXYsCisJCQkJICAgIHNpemVvZigqbW1pb19yZWFkLT5yZWFkX3Jlc3ApLAorCQkJCSAgICAmbW1pb19yZWFkLT5yZWFkX3Jlc3BfZG1hX2FkZHIsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghbW1pb19yZWFkLT5yZWFkX3Jlc3ApKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X3dyaXRlX2Rldl9hZGRyKGVuYV9kZXYpOworCisJbW1pb19yZWFkLT5yZWFkX3Jlc3AtPnJlcV9pZCA9IDB4MDsKKwltbWlvX3JlYWQtPnNlcV9udW0gPSAweDA7CisJbW1pb19yZWFkLT5yZWFkbGVzc19zdXBwb3J0ZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW5hX2NvbV9zZXRfbW1pb19yZWFkX21vZGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCBib29sIHJlYWRsZXNzX3N1cHBvcnRlZCkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9tbWlvX3JlYWQgKm1taW9fcmVhZCA9ICZlbmFfZGV2LT5tbWlvX3JlYWQ7CisKKwltbWlvX3JlYWQtPnJlYWRsZXNzX3N1cHBvcnRlZCA9IHJlYWRsZXNzX3N1cHBvcnRlZDsKK30KKwordm9pZCBlbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF9kZXN0cm95KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9tbWlvX3JlYWQgKm1taW9fcmVhZCA9ICZlbmFfZGV2LT5tbWlvX3JlYWQ7CisKKwl3cml0ZWwoMHgwLCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfTU1JT19SRVNQX0xPX09GRik7CisJd3JpdGVsKDB4MCwgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX01NSU9fUkVTUF9ISV9PRkYpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBzaXplb2YoKm1taW9fcmVhZC0+cmVhZF9yZXNwKSwKKwkJCSAgbW1pb19yZWFkLT5yZWFkX3Jlc3AsIG1taW9fcmVhZC0+cmVhZF9yZXNwX2RtYV9hZGRyKTsKKworCW1taW9fcmVhZC0+cmVhZF9yZXNwID0gTlVMTDsKK30KKwordm9pZCBlbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF93cml0ZV9kZXZfYWRkcihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9jb21fbW1pb19yZWFkICptbWlvX3JlYWQgPSAmZW5hX2Rldi0+bW1pb19yZWFkOworCXUzMiBhZGRyX2xvdywgYWRkcl9oaWdoOworCisJYWRkcl9sb3cgPSBFTkFfRE1BX0FERFJfVE9fVUlOVDMyX0xPVyhtbWlvX3JlYWQtPnJlYWRfcmVzcF9kbWFfYWRkcik7CisJYWRkcl9oaWdoID0gRU5BX0RNQV9BRERSX1RPX1VJTlQzMl9ISUdIKG1taW9fcmVhZC0+cmVhZF9yZXNwX2RtYV9hZGRyKTsKKworCXdyaXRlbChhZGRyX2xvdywgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX01NSU9fUkVTUF9MT19PRkYpOworCXdyaXRlbChhZGRyX2hpZ2gsIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19NTUlPX1JFU1BfSElfT0ZGKTsKK30KKworaW50IGVuYV9jb21fYWRtaW5faW5pdChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCSAgICAgICBzdHJ1Y3QgZW5hX2FlbnFfaGFuZGxlcnMgKmFlbnFfaGFuZGxlcnMsCisJCSAgICAgICBib29sIGluaXRfc3BpbmxvY2spCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXUzMiBhcV9jYXBzLCBhY3FfY2FwcywgZGV2X3N0cywgYWRkcl9sb3csIGFkZHJfaGlnaDsKKwlpbnQgcmV0OworCisJZGV2X3N0cyA9IGVuYV9jb21fcmVnX2Jhcl9yZWFkMzIoZW5hX2RldiwgRU5BX1JFR1NfREVWX1NUU19PRkYpOworCisJaWYgKHVubGlrZWx5KGRldl9zdHMgPT0gRU5BX01NSU9fUkVBRF9USU1FT1VUKSkgeworCQlwcl9lcnIoIlJlZyByZWFkIHRpbWVvdXQgb2NjdXJyZWRcbiIpOworCQlyZXR1cm4gLUVUSU1FOworCX0KKworCWlmICghKGRldl9zdHMgJiBFTkFfUkVHU19ERVZfU1RTX1JFQURZX01BU0spKSB7CisJCXByX2VycigiRGV2aWNlIGlzbid0IHJlYWR5LCBhYm9ydCBjb20gaW5pdFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWFkbWluX3F1ZXVlLT5xX2RlcHRoID0gRU5BX0FETUlOX1FVRVVFX0RFUFRIOworCisJYWRtaW5fcXVldWUtPnFfZG1hZGV2ID0gZW5hX2Rldi0+ZG1hZGV2OworCWFkbWluX3F1ZXVlLT5wb2xsaW5nID0gZmFsc2U7CisJYWRtaW5fcXVldWUtPmN1cnJfY21kX2lkID0gMDsKKworCWF0b21pY19zZXQoJmFkbWluX3F1ZXVlLT5vdXRzdGFuZGluZ19jbWRzLCAwKTsKKworCWlmIChpbml0X3NwaW5sb2NrKQorCQlzcGluX2xvY2tfaW5pdCgmYWRtaW5fcXVldWUtPnFfbG9jayk7CisKKwlyZXQgPSBlbmFfY29tX2luaXRfY29tcF9jdHh0KGFkbWluX3F1ZXVlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gZW5hX2NvbV9hZG1pbl9pbml0X3NxKGFkbWluX3F1ZXVlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gZW5hX2NvbV9hZG1pbl9pbml0X2NxKGFkbWluX3F1ZXVlKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJYWRtaW5fcXVldWUtPnNxLmRiX2FkZHIgPSAodTMyIF9faW9tZW0gKikoKHVpbnRwdHJfdCllbmFfZGV2LT5yZWdfYmFyICsKKwkJRU5BX1JFR1NfQVFfREJfT0ZGKTsKKworCWFkZHJfbG93ID0gRU5BX0RNQV9BRERSX1RPX1VJTlQzMl9MT1coYWRtaW5fcXVldWUtPnNxLmRtYV9hZGRyKTsKKwlhZGRyX2hpZ2ggPSBFTkFfRE1BX0FERFJfVE9fVUlOVDMyX0hJR0goYWRtaW5fcXVldWUtPnNxLmRtYV9hZGRyKTsKKworCXdyaXRlbChhZGRyX2xvdywgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX0FRX0JBU0VfTE9fT0ZGKTsKKwl3cml0ZWwoYWRkcl9oaWdoLCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfQVFfQkFTRV9ISV9PRkYpOworCisJYWRkcl9sb3cgPSBFTkFfRE1BX0FERFJfVE9fVUlOVDMyX0xPVyhhZG1pbl9xdWV1ZS0+Y3EuZG1hX2FkZHIpOworCWFkZHJfaGlnaCA9IEVOQV9ETUFfQUREUl9UT19VSU5UMzJfSElHSChhZG1pbl9xdWV1ZS0+Y3EuZG1hX2FkZHIpOworCisJd3JpdGVsKGFkZHJfbG93LCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfQUNRX0JBU0VfTE9fT0ZGKTsKKwl3cml0ZWwoYWRkcl9oaWdoLCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfQUNRX0JBU0VfSElfT0ZGKTsKKworCWFxX2NhcHMgPSAwOworCWFxX2NhcHMgfD0gYWRtaW5fcXVldWUtPnFfZGVwdGggJiBFTkFfUkVHU19BUV9DQVBTX0FRX0RFUFRIX01BU0s7CisJYXFfY2FwcyB8PSAoc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkpIDw8CisJCQlFTkFfUkVHU19BUV9DQVBTX0FRX0VOVFJZX1NJWkVfU0hJRlQpICYKKwkJCUVOQV9SRUdTX0FRX0NBUFNfQVFfRU5UUllfU0laRV9NQVNLOworCisJYWNxX2NhcHMgPSAwOworCWFjcV9jYXBzIHw9IGFkbWluX3F1ZXVlLT5xX2RlcHRoICYgRU5BX1JFR1NfQUNRX0NBUFNfQUNRX0RFUFRIX01BU0s7CisJYWNxX2NhcHMgfD0gKHNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSkgPDwKKwkJRU5BX1JFR1NfQUNRX0NBUFNfQUNRX0VOVFJZX1NJWkVfU0hJRlQpICYKKwkJRU5BX1JFR1NfQUNRX0NBUFNfQUNRX0VOVFJZX1NJWkVfTUFTSzsKKworCXdyaXRlbChhcV9jYXBzLCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfQVFfQ0FQU19PRkYpOworCXdyaXRlbChhY3FfY2FwcywgZW5hX2Rldi0+cmVnX2JhciArIEVOQV9SRUdTX0FDUV9DQVBTX09GRik7CisJcmV0ID0gZW5hX2NvbV9hZG1pbl9pbml0X2FlbnEoZW5hX2RldiwgYWVucV9oYW5kbGVycyk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWFkbWluX3F1ZXVlLT5ydW5uaW5nX3N0YXRlID0gdHJ1ZTsKKworCXJldHVybiAwOworZXJyb3I6CisJZW5hX2NvbV9hZG1pbl9kZXN0cm95KGVuYV9kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGVuYV9jb21fY3JlYXRlX2lvX3F1ZXVlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICBzdHJ1Y3QgZW5hX2NvbV9jcmVhdGVfaW9fY3R4ICpjdHgpCit7CisJc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxOworCXN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcTsKKwlpbnQgcmV0OworCisJaWYgKGN0eC0+cWlkID49IEVOQV9UT1RBTF9OVU1fUVVFVUVTKSB7CisJCXByX2VycigiUWlkICglZCkgaXMgYmlnZ2VyIHRoYW4gbWF4IG51bSBvZiBxdWV1ZXMgKCVkKVxuIiwKKwkJICAgICAgIGN0eC0+cWlkLCBFTkFfVE9UQUxfTlVNX1FVRVVFUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlvX3NxID0gJmVuYV9kZXYtPmlvX3NxX3F1ZXVlc1tjdHgtPnFpZF07CisJaW9fY3EgPSAmZW5hX2Rldi0+aW9fY3FfcXVldWVzW2N0eC0+cWlkXTsKKworCW1lbXNldChpb19zcSwgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9jb21faW9fc3EpKTsKKwltZW1zZXQoaW9fY3EsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfY29tX2lvX2NxKSk7CisKKwkvKiBJbml0IENRICovCisJaW9fY3EtPnFfZGVwdGggPSBjdHgtPnF1ZXVlX3NpemU7CisJaW9fY3EtPmRpcmVjdGlvbiA9IGN0eC0+ZGlyZWN0aW9uOworCWlvX2NxLT5xaWQgPSBjdHgtPnFpZDsKKworCWlvX2NxLT5tc2l4X3ZlY3RvciA9IGN0eC0+bXNpeF92ZWN0b3I7CisKKwlpb19zcS0+cV9kZXB0aCA9IGN0eC0+cXVldWVfc2l6ZTsKKwlpb19zcS0+ZGlyZWN0aW9uID0gY3R4LT5kaXJlY3Rpb247CisJaW9fc3EtPnFpZCA9IGN0eC0+cWlkOworCisJaW9fc3EtPm1lbV9xdWV1ZV90eXBlID0gY3R4LT5tZW1fcXVldWVfdHlwZTsKKworCWlmIChjdHgtPmRpcmVjdGlvbiA9PSBFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9UWCkKKwkJLyogaGVhZGVyIGxlbmd0aCBpcyBsaW1pdGVkIHRvIDggYml0cyAqLworCQlpb19zcS0+dHhfbWF4X2hlYWRlcl9zaXplID0KKwkJCW1pbl90KHUzMiwgZW5hX2Rldi0+dHhfbWF4X2hlYWRlcl9zaXplLCBTWl8yNTYpOworCisJcmV0ID0gZW5hX2NvbV9pbml0X2lvX3NxKGVuYV9kZXYsIGN0eCwgaW9fc3EpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJcmV0ID0gZW5hX2NvbV9pbml0X2lvX2NxKGVuYV9kZXYsIGN0eCwgaW9fY3EpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBlbmFfY29tX2NyZWF0ZV9pb19jcShlbmFfZGV2LCBpb19jcSk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGVuYV9jb21fY3JlYXRlX2lvX3NxKGVuYV9kZXYsIGlvX3NxLCBpb19jcS0+aWR4KTsKKwlpZiAocmV0KQorCQlnb3RvIGRlc3Ryb3lfaW9fY3E7CisKKwlyZXR1cm4gMDsKKworZGVzdHJveV9pb19jcToKKwllbmFfY29tX2Rlc3Ryb3lfaW9fY3EoZW5hX2RldiwgaW9fY3EpOworZXJyb3I6CisJZW5hX2NvbV9pb19xdWV1ZV9mcmVlKGVuYV9kZXYsIGlvX3NxLCBpb19jcSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBlbmFfY29tX2Rlc3Ryb3lfaW9fcXVldWUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MTYgcWlkKQoreworCXN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcTsKKwlzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3E7CisKKwlpZiAocWlkID49IEVOQV9UT1RBTF9OVU1fUVVFVUVTKSB7CisJCXByX2VycigiUWlkICglZCkgaXMgYmlnZ2VyIHRoYW4gbWF4IG51bSBvZiBxdWV1ZXMgKCVkKVxuIiwgcWlkLAorCQkgICAgICAgRU5BX1RPVEFMX05VTV9RVUVVRVMpOworCQlyZXR1cm47CisJfQorCisJaW9fc3EgPSAmZW5hX2Rldi0+aW9fc3FfcXVldWVzW3FpZF07CisJaW9fY3EgPSAmZW5hX2Rldi0+aW9fY3FfcXVldWVzW3FpZF07CisKKwllbmFfY29tX2Rlc3Ryb3lfaW9fc3EoZW5hX2RldiwgaW9fc3EpOworCWVuYV9jb21fZGVzdHJveV9pb19jcShlbmFfZGV2LCBpb19jcSk7CisKKwllbmFfY29tX2lvX3F1ZXVlX2ZyZWUoZW5hX2RldiwgaW9fc3EsIGlvX2NxKTsKK30KKworaW50IGVuYV9jb21fZ2V0X2xpbmtfcGFyYW1zKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICBzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgKnJlc3ApCit7CisJcmV0dXJuIGVuYV9jb21fZ2V0X2ZlYXR1cmUoZW5hX2RldiwgcmVzcCwgRU5BX0FETUlOX0xJTktfQ09ORklHKTsKK30KKworaW50IGVuYV9jb21fZ2V0X2Rldl9hdHRyX2ZlYXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICAgc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggKmdldF9mZWF0X2N0eCkKK3sKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgZ2V0X3Jlc3A7CisJaW50IHJjOworCisJcmMgPSBlbmFfY29tX2dldF9mZWF0dXJlKGVuYV9kZXYsICZnZXRfcmVzcCwKKwkJCQkgRU5BX0FETUlOX0RFVklDRV9BVFRSSUJVVEVTKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCW1lbWNweSgmZ2V0X2ZlYXRfY3R4LT5kZXZfYXR0ciwgJmdldF9yZXNwLnUuZGV2X2F0dHIsCisJICAgICAgIHNpemVvZihnZXRfcmVzcC51LmRldl9hdHRyKSk7CisJZW5hX2Rldi0+c3VwcG9ydGVkX2ZlYXR1cmVzID0gZ2V0X3Jlc3AudS5kZXZfYXR0ci5zdXBwb3J0ZWRfZmVhdHVyZXM7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2ZlYXR1cmUoZW5hX2RldiwgJmdldF9yZXNwLAorCQkJCSBFTkFfQURNSU5fTUFYX1FVRVVFU19OVU0pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJbWVtY3B5KCZnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMsICZnZXRfcmVzcC51Lm1heF9xdWV1ZSwKKwkgICAgICAgc2l6ZW9mKGdldF9yZXNwLnUubWF4X3F1ZXVlKSk7CisJZW5hX2Rldi0+dHhfbWF4X2hlYWRlcl9zaXplID0gZ2V0X3Jlc3AudS5tYXhfcXVldWUubWF4X2hlYWRlcl9zaXplOworCisJcmMgPSBlbmFfY29tX2dldF9mZWF0dXJlKGVuYV9kZXYsICZnZXRfcmVzcCwKKwkJCQkgRU5BX0FETUlOX0FFTlFfQ09ORklHKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCW1lbWNweSgmZ2V0X2ZlYXRfY3R4LT5hZW5xLCAmZ2V0X3Jlc3AudS5hZW5xLAorCSAgICAgICBzaXplb2YoZ2V0X3Jlc3AudS5hZW5xKSk7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2ZlYXR1cmUoZW5hX2RldiwgJmdldF9yZXNwLAorCQkJCSBFTkFfQURNSU5fU1RBVEVMRVNTX09GRkxPQURfQ09ORklHKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCW1lbWNweSgmZ2V0X2ZlYXRfY3R4LT5vZmZsb2FkLCAmZ2V0X3Jlc3AudS5vZmZsb2FkLAorCSAgICAgICBzaXplb2YoZ2V0X3Jlc3AudS5vZmZsb2FkKSk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbmFfY29tX2FkbWluX3FfY29tcF9pbnRyX2hhbmRsZXIoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCWVuYV9jb21faGFuZGxlX2FkbWluX2NvbXBsZXRpb24oJmVuYV9kZXYtPmFkbWluX3F1ZXVlKTsKK30KKworLyogZW5hX2hhbmRsZV9zcGVjaWZpY19hZW5xX2V2ZW50OgorICogcmV0dXJuIHRoZSBoYW5kbGVyIHRoYXQgaXMgcmVsZXZhbnQgdG8gdGhlIHNwZWNpZmljIGV2ZW50IGdyb3VwCisgKi8KK3N0YXRpYyBlbmFfYWVucV9oYW5kbGVyIGVuYV9jb21fZ2V0X3NwZWNpZmljX2FlbnFfY2Ioc3RydWN0IGVuYV9jb21fZGV2ICpkZXYsCisJCQkJCQkgICAgIHUxNiBncm91cCkKK3sKKwlzdHJ1Y3QgZW5hX2FlbnFfaGFuZGxlcnMgKmFlbnFfaGFuZGxlcnMgPSBkZXYtPmFlbnEuYWVucV9oYW5kbGVyczsKKworCWlmICgoZ3JvdXAgPCBFTkFfTUFYX0hBTkRMRVJTKSAmJiBhZW5xX2hhbmRsZXJzLT5oYW5kbGVyc1tncm91cF0pCisJCXJldHVybiBhZW5xX2hhbmRsZXJzLT5oYW5kbGVyc1tncm91cF07CisKKwlyZXR1cm4gYWVucV9oYW5kbGVycy0+dW5pbXBsZW1lbnRlZF9oYW5kbGVyOworfQorCisvKiBlbmFfYWVucV9pbnRyX2hhbmRsZXI6CisgKiBoYW5kbGVzIHRoZSBhZW5xIGluY29taW5nIGV2ZW50cy4KKyAqIHBvcCBldmVudHMgZnJvbSB0aGUgcXVldWUgYW5kIGFwcGx5IHRoZSBzcGVjaWZpYyBoYW5kbGVyCisgKi8KK3ZvaWQgZW5hX2NvbV9hZW5xX2ludHJfaGFuZGxlcihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfZW50cnkgKmFlbnFfZTsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfY29tbW9uX2Rlc2MgKmFlbnFfY29tbW9uOworCXN0cnVjdCBlbmFfY29tX2FlbnEgKmFlbnEgID0gJmRldi0+YWVucTsKKwllbmFfYWVucV9oYW5kbGVyIGhhbmRsZXJfY2I7CisJdTE2IG1hc2tlZF9oZWFkLCBwcm9jZXNzZWQgPSAwOworCXU4IHBoYXNlOworCisJbWFza2VkX2hlYWQgPSBhZW5xLT5oZWFkICYgKGFlbnEtPnFfZGVwdGggLSAxKTsKKwlwaGFzZSA9IGFlbnEtPnBoYXNlOworCWFlbnFfZSA9ICZhZW5xLT5lbnRyaWVzW21hc2tlZF9oZWFkXTsgLyogR2V0IGZpcnN0IGVudHJ5ICovCisJYWVucV9jb21tb24gPSAmYWVucV9lLT5hZW5xX2NvbW1vbl9kZXNjOworCisJLyogR28gb3ZlciBhbGwgdGhlIGV2ZW50cyAqLworCXdoaWxlICgoYWVucV9jb21tb24tPmZsYWdzICYgRU5BX0FETUlOX0FFTlFfQ09NTU9OX0RFU0NfUEhBU0VfTUFTSykgPT0KKwkgICAgICAgcGhhc2UpIHsKKwkJcHJfZGVidWcoIkFFTlEhIEdyb3VwWyV4XSBTeW5kcm9tWyV4XSB0aW1lc3RhbXA6IFslbGx1c11cbiIsCisJCQkgYWVucV9jb21tb24tPmdyb3VwLCBhZW5xX2NvbW1vbi0+c3luZHJvbSwKKwkJCSAodTY0KWFlbnFfY29tbW9uLT50aW1lc3RhbXBfbG93ICsKKwkJCQkgKCh1NjQpYWVucV9jb21tb24tPnRpbWVzdGFtcF9oaWdoIDw8IDMyKSk7CisKKwkJLyogSGFuZGxlIHNwZWNpZmljIGV2ZW50Ki8KKwkJaGFuZGxlcl9jYiA9IGVuYV9jb21fZ2V0X3NwZWNpZmljX2FlbnFfY2IoZGV2LAorCQkJCQkJCSAgYWVucV9jb21tb24tPmdyb3VwKTsKKwkJaGFuZGxlcl9jYihkYXRhLCBhZW5xX2UpOyAvKiBjYWxsIHRoZSBhY3R1YWwgZXZlbnQgaGFuZGxlciovCisKKwkJLyogR2V0IG5leHQgZXZlbnQgZW50cnkgKi8KKwkJbWFza2VkX2hlYWQrKzsKKwkJcHJvY2Vzc2VkKys7CisKKwkJaWYgKHVubGlrZWx5KG1hc2tlZF9oZWFkID09IGFlbnEtPnFfZGVwdGgpKSB7CisJCQltYXNrZWRfaGVhZCA9IDA7CisJCQlwaGFzZSA9ICFwaGFzZTsKKwkJfQorCQlhZW5xX2UgPSAmYWVucS0+ZW50cmllc1ttYXNrZWRfaGVhZF07CisJCWFlbnFfY29tbW9uID0gJmFlbnFfZS0+YWVucV9jb21tb25fZGVzYzsKKwl9CisKKwlhZW5xLT5oZWFkICs9IHByb2Nlc3NlZDsKKwlhZW5xLT5waGFzZSA9IHBoYXNlOworCisJLyogRG9uJ3QgdXBkYXRlIGFlbnEgZG9vcmJlbGwgaWYgdGhlcmUgd2VyZW4ndCBhbnkgcHJvY2Vzc2VkIGV2ZW50cyAqLworCWlmICghcHJvY2Vzc2VkKQorCQlyZXR1cm47CisKKwkvKiB3cml0ZSB0aGUgYWVucSBkb29yYmVsbCBhZnRlciBhbGwgQUVOUSBkZXNjcmlwdG9ycyB3ZXJlIHJlYWQgKi8KKwltYigpOworCXdyaXRlbCgodTMyKWFlbnEtPmhlYWQsIGRldi0+cmVnX2JhciArIEVOQV9SRUdTX0FFTlFfSEVBRF9EQl9PRkYpOworfQorCitpbnQgZW5hX2NvbV9kZXZfcmVzZXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXUzMiBzdGF0LCB0aW1lb3V0LCBjYXAsIHJlc2V0X3ZhbDsKKwlpbnQgcmM7CisKKwlzdGF0ID0gZW5hX2NvbV9yZWdfYmFyX3JlYWQzMihlbmFfZGV2LCBFTkFfUkVHU19ERVZfU1RTX09GRik7CisJY2FwID0gZW5hX2NvbV9yZWdfYmFyX3JlYWQzMihlbmFfZGV2LCBFTkFfUkVHU19DQVBTX09GRik7CisKKwlpZiAodW5saWtlbHkoKHN0YXQgPT0gRU5BX01NSU9fUkVBRF9USU1FT1VUKSB8fAorCQkgICAgIChjYXAgPT0gRU5BX01NSU9fUkVBRF9USU1FT1VUKSkpIHsKKwkJcHJfZXJyKCJSZWcgcmVhZDMyIHRpbWVvdXQgb2NjdXJyZWRcbiIpOworCQlyZXR1cm4gLUVUSU1FOworCX0KKworCWlmICgoc3RhdCAmIEVOQV9SRUdTX0RFVl9TVFNfUkVBRFlfTUFTSykgPT0gMCkgeworCQlwcl9lcnIoIkRldmljZSBpc24ndCByZWFkeSwgY2FuJ3QgcmVzZXQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGltZW91dCA9IChjYXAgJiBFTkFfUkVHU19DQVBTX1JFU0VUX1RJTUVPVVRfTUFTSykgPj4KKwkJCUVOQV9SRUdTX0NBUFNfUkVTRVRfVElNRU9VVF9TSElGVDsKKwlpZiAodGltZW91dCA9PSAwKSB7CisJCXByX2VycigiSW52YWxpZCB0aW1lb3V0IHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc3RhcnQgcmVzZXQgKi8KKwlyZXNldF92YWwgPSBFTkFfUkVHU19ERVZfQ1RMX0RFVl9SRVNFVF9NQVNLOworCXdyaXRlbChyZXNldF92YWwsIGVuYV9kZXYtPnJlZ19iYXIgKyBFTkFfUkVHU19ERVZfQ1RMX09GRik7CisKKwkvKiBXcml0ZSBhZ2FpbiB0aGUgTU1JTyByZWFkIHJlcXVlc3QgYWRkcmVzcyAqLworCWVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X3dyaXRlX2Rldl9hZGRyKGVuYV9kZXYpOworCisJcmMgPSB3YWl0X2Zvcl9yZXNldF9zdGF0ZShlbmFfZGV2LCB0aW1lb3V0LAorCQkJCSAgRU5BX1JFR1NfREVWX1NUU19SRVNFVF9JTl9QUk9HUkVTU19NQVNLKTsKKwlpZiAocmMgIT0gMCkgeworCQlwcl9lcnIoIlJlc2V0IGluZGljYXRpb24gZGlkbid0IHR1cm4gb25cbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogcmVzZXQgZG9uZSAqLworCXdyaXRlbCgwLCBlbmFfZGV2LT5yZWdfYmFyICsgRU5BX1JFR1NfREVWX0NUTF9PRkYpOworCXJjID0gd2FpdF9mb3JfcmVzZXRfc3RhdGUoZW5hX2RldiwgdGltZW91dCwgMCk7CisJaWYgKHJjICE9IDApIHsKKwkJcHJfZXJyKCJSZXNldCBpbmRpY2F0aW9uIGRpZG4ndCB0dXJuIG9mZlxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFfZ2V0X2Rldl9zdGF0cyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgIHN0cnVjdCBlbmFfY29tX3N0YXRzX2N0eCAqY3R4LAorCQkJICAgICBlbnVtIGVuYV9hZG1pbl9nZXRfc3RhdHNfdHlwZSB0eXBlKQoreworCXN0cnVjdCBlbmFfYWRtaW5fYXFfZ2V0X3N0YXRzX2NtZCAqZ2V0X2NtZCA9ICZjdHgtPmdldF9jbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9hY3FfZ2V0X3N0YXRzX3Jlc3AgKmdldF9yZXNwID0gJmN0eC0+Z2V0X3Jlc3A7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlOworCWludCByZXQ7CisKKwlhZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKworCWdldF9jbWQtPmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9HRVRfU1RBVFM7CisJZ2V0X2NtZC0+YXFfY29tbW9uX2Rlc2NyaXB0b3IuZmxhZ3MgPSAwOworCWdldF9jbWQtPnR5cGUgPSB0eXBlOworCisJcmV0ID0gIGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopZ2V0X2NtZCwKKwkJCQkJICAgICBzaXplb2YoKmdldF9jbWQpLAorCQkJCQkgICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKWdldF9yZXNwLAorCQkJCQkgICAgIHNpemVvZigqZ2V0X3Jlc3ApKTsKKworCWlmICh1bmxpa2VseShyZXQpKQorCQlwcl9lcnIoIkZhaWxlZCB0byBnZXQgc3RhdHMuIGVycm9yOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBlbmFfY29tX2dldF9kZXZfYmFzaWNfc3RhdHMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCXN0cnVjdCBlbmFfYWRtaW5fYmFzaWNfc3RhdHMgKnN0YXRzKQoreworCXN0cnVjdCBlbmFfY29tX3N0YXRzX2N0eCBjdHg7CisJaW50IHJldDsKKworCW1lbXNldCgmY3R4LCAweDAsIHNpemVvZihjdHgpKTsKKwlyZXQgPSBlbmFfZ2V0X2Rldl9zdGF0cyhlbmFfZGV2LCAmY3R4LCBFTkFfQURNSU5fR0VUX1NUQVRTX1RZUEVfQkFTSUMpOworCWlmIChsaWtlbHkocmV0ID09IDApKQorCQltZW1jcHkoc3RhdHMsICZjdHguZ2V0X3Jlc3AuYmFzaWNfc3RhdHMsCisJCSAgICAgICBzaXplb2YoY3R4LmdldF9yZXNwLmJhc2ljX3N0YXRzKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZW5hX2NvbV9zZXRfZGV2X210dShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIGludCBtdHUpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfY21kIGNtZDsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X3Jlc3AgcmVzcDsKKwlpbnQgcmV0OworCisJaWYgKCFlbmFfY29tX2NoZWNrX3N1cHBvcnRlZF9mZWF0dXJlX2lkKGVuYV9kZXYsIEVOQV9BRE1JTl9NVFUpKSB7CisJCXByX2luZm8oIkZlYXR1cmUgJWQgaXNuJ3Qgc3VwcG9ydGVkXG4iLCBFTkFfQURNSU5fTVRVKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwltZW1zZXQoJmNtZCwgMHgwLCBzaXplb2YoY21kKSk7CisJYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisKKwljbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX1NFVF9GRUFUVVJFOworCWNtZC5hcV9jb21tb25fZGVzY3JpcHRvci5mbGFncyA9IDA7CisJY21kLmZlYXRfY29tbW9uLmZlYXR1cmVfaWQgPSBFTkFfQURNSU5fTVRVOworCWNtZC51Lm10dS5tdHUgPSBtdHU7CisKKwlyZXQgPSBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopJmNtZCwKKwkJCQkJICAgIHNpemVvZihjbWQpLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopJnJlc3AsCisJCQkJCSAgICBzaXplb2YocmVzcCkpOworCisJaWYgKHVubGlrZWx5KHJldCkpCisJCXByX2VycigiRmFpbGVkIHRvIHNldCBtdHUgJWQuIGVycm9yOiAlZFxuIiwgbXR1LCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGVuYV9jb21fZ2V0X29mZmxvYWRfc2V0dGluZ3Moc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCSBzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfb2ZmbG9hZF9kZXNjICpvZmZsb2FkKQoreworCWludCByZXQ7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIHJlc3A7CisKKwlyZXQgPSBlbmFfY29tX2dldF9mZWF0dXJlKGVuYV9kZXYsICZyZXNwLAorCQkJCSAgRU5BX0FETUlOX1NUQVRFTEVTU19PRkZMT0FEX0NPTkZJRyk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZ2V0IG9mZmxvYWQgY2FwYWJpbGl0aWVzICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1lbWNweShvZmZsb2FkLCAmcmVzcC51Lm9mZmxvYWQsIHNpemVvZihyZXNwLnUub2ZmbG9hZCkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX3NldF9oYXNoX2Z1bmN0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSAqYWRtaW5fcXVldWUgPSAmZW5hX2Rldi0+YWRtaW5fcXVldWU7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9jbWQgY21kOworCXN0cnVjdCBlbmFfYWRtaW5fc2V0X2ZlYXRfcmVzcCByZXNwOworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCBnZXRfcmVzcDsKKwlpbnQgcmV0OworCisJaWYgKCFlbmFfY29tX2NoZWNrX3N1cHBvcnRlZF9mZWF0dXJlX2lkKGVuYV9kZXYsCisJCQkJCQlFTkFfQURNSU5fUlNTX0hBU0hfRlVOQ1RJT04pKSB7CisJCXByX2luZm8oIkZlYXR1cmUgJWQgaXNuJ3Qgc3VwcG9ydGVkXG4iLAorCQkJRU5BX0FETUlOX1JTU19IQVNIX0ZVTkNUSU9OKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBWYWxpZGF0ZSBoYXNoIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCAqLworCXJldCA9IGVuYV9jb21fZ2V0X2ZlYXR1cmUoZW5hX2RldiwgJmdldF9yZXNwLAorCQkJCSAgRU5BX0FETUlOX1JTU19IQVNIX0ZVTkNUSU9OKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChnZXRfcmVzcC51LmZsb3dfaGFzaF9mdW5jLnN1cHBvcnRlZF9mdW5jICYgKDEgPDwgcnNzLT5oYXNoX2Z1bmMpKSB7CisJCXByX2VycigiRnVuYyBoYXNoICVkIGlzbid0IHN1cHBvcnRlZCBieSBkZXZpY2UsIGFib3J0XG4iLAorCQkgICAgICAgcnNzLT5oYXNoX2Z1bmMpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCW1lbXNldCgmY21kLCAweDAsIHNpemVvZihjbWQpKTsKKworCWNtZC5hcV9jb21tb25fZGVzY3JpcHRvci5vcGNvZGUgPSBFTkFfQURNSU5fU0VUX0ZFQVRVUkU7CisJY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLmZsYWdzID0KKwkJRU5BX0FETUlOX0FRX0NPTU1PTl9ERVNDX0NUUkxfREFUQV9JTkRJUkVDVF9NQVNLOworCWNtZC5mZWF0X2NvbW1vbi5mZWF0dXJlX2lkID0gRU5BX0FETUlOX1JTU19IQVNIX0ZVTkNUSU9OOworCWNtZC51LmZsb3dfaGFzaF9mdW5jLmluaXRfdmFsID0gcnNzLT5oYXNoX2luaXRfdmFsOworCWNtZC51LmZsb3dfaGFzaF9mdW5jLnNlbGVjdGVkX2Z1bmMgPSAxIDw8IHJzcy0+aGFzaF9mdW5jOworCisJcmV0ID0gZW5hX2NvbV9tZW1fYWRkcl9zZXQoZW5hX2RldiwKKwkJCQkgICAmY21kLmNvbnRyb2xfYnVmZmVyLmFkZHJlc3MsCisJCQkJICAgcnNzLT5oYXNoX2tleV9kbWFfYWRkcik7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWRkcmVzcyBzZXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljbWQuY29udHJvbF9idWZmZXIubGVuZ3RoID0gc2l6ZW9mKCpyc3MtPmhhc2hfa2V5KTsKKworCXJldCA9IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKikmY21kLAorCQkJCQkgICAgc2l6ZW9mKGNtZCksCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKikmcmVzcCwKKwkJCQkJICAgIHNpemVvZihyZXNwKSk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IGhhc2ggZnVuY3Rpb24gJWQuIGVycm9yOiAlZFxuIiwKKwkJICAgICAgIHJzcy0+aGFzaF9mdW5jLCByZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21fZmlsbF9oYXNoX2Z1bmN0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgICBlbnVtIGVuYV9hZG1pbl9oYXNoX2Z1bmN0aW9ucyBmdW5jLAorCQkJICAgICAgIGNvbnN0IHU4ICprZXksIHUxNiBrZXlfbGVuLCB1MzIgaW5pdF92YWwpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIGdldF9yZXNwOworCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfZmxvd19oYXNoX2NvbnRyb2wgKmhhc2hfa2V5ID0KKwkJcnNzLT5oYXNoX2tleTsKKwlpbnQgcmM7CisKKwkvKiBNYWtlIHN1cmUgc2l6ZSBpcyBhIG11bHQgb2YgRFdzICovCisJaWYgKHVubGlrZWx5KGtleV9sZW4gJiAweDMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJjID0gZW5hX2NvbV9nZXRfZmVhdHVyZV9leChlbmFfZGV2LCAmZ2V0X3Jlc3AsCisJCQkJICAgIEVOQV9BRE1JTl9SU1NfSEFTSF9GVU5DVElPTiwKKwkJCQkgICAgcnNzLT5oYXNoX2tleV9kbWFfYWRkciwKKwkJCQkgICAgc2l6ZW9mKCpyc3MtPmhhc2hfa2V5KSk7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJcmV0dXJuIHJjOworCisJaWYgKCEoKDEgPDwgZnVuYykgJiBnZXRfcmVzcC51LmZsb3dfaGFzaF9mdW5jLnN1cHBvcnRlZF9mdW5jKSkgeworCQlwcl9lcnIoIkZsb3cgaGFzaCBmdW5jdGlvbiAlZCBpc24ndCBzdXBwb3J0ZWRcbiIsIGZ1bmMpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXN3aXRjaCAoZnVuYykgeworCWNhc2UgRU5BX0FETUlOX1RPRVBMSVRaOgorCQlpZiAoa2V5X2xlbiA+IHNpemVvZihoYXNoX2tleS0+a2V5KSkgeworCQkJcHJfZXJyKCJrZXkgbGVuICglaHUpIGlzIGJpZ2dlciB0aGFuIHRoZSBtYXggc3VwcG9ydGVkICglenUpXG4iLAorCQkJICAgICAgIGtleV9sZW4sIHNpemVvZihoYXNoX2tleS0+a2V5KSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW1lbWNweShoYXNoX2tleS0+a2V5LCBrZXksIGtleV9sZW4pOworCQlyc3MtPmhhc2hfaW5pdF92YWwgPSBpbml0X3ZhbDsKKwkJaGFzaF9rZXktPmtleXNfbnVtID0ga2V5X2xlbiA+PiAyOworCQlicmVhazsKKwljYXNlIEVOQV9BRE1JTl9DUkMzMjoKKwkJcnNzLT5oYXNoX2luaXRfdmFsID0gaW5pdF92YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiSW52YWxpZCBoYXNoIGZ1bmN0aW9uICglZClcbiIsIGZ1bmMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGVuYV9jb21fc2V0X2hhc2hfZnVuY3Rpb24oZW5hX2Rldik7CisKKwkvKiBSZXN0b3JlIHRoZSBvbGQgZnVuY3Rpb24gKi8KKwlpZiAodW5saWtlbHkocmMpKQorCQllbmFfY29tX2dldF9oYXNoX2Z1bmN0aW9uKGVuYV9kZXYsIE5VTEwsIE5VTEwpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgZW5hX2NvbV9nZXRfaGFzaF9mdW5jdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgICBlbnVtIGVuYV9hZG1pbl9oYXNoX2Z1bmN0aW9ucyAqZnVuYywKKwkJCSAgICAgIHU4ICprZXkpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIGdldF9yZXNwOworCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfZmxvd19oYXNoX2NvbnRyb2wgKmhhc2hfa2V5ID0KKwkJcnNzLT5oYXNoX2tleTsKKwlpbnQgcmM7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2ZlYXR1cmVfZXgoZW5hX2RldiwgJmdldF9yZXNwLAorCQkJCSAgICBFTkFfQURNSU5fUlNTX0hBU0hfRlVOQ1RJT04sCisJCQkJICAgIHJzcy0+aGFzaF9rZXlfZG1hX2FkZHIsCisJCQkJICAgIHNpemVvZigqcnNzLT5oYXNoX2tleSkpOworCWlmICh1bmxpa2VseShyYykpCisJCXJldHVybiByYzsKKworCXJzcy0+aGFzaF9mdW5jID0gZ2V0X3Jlc3AudS5mbG93X2hhc2hfZnVuYy5zZWxlY3RlZF9mdW5jOworCWlmIChmdW5jKQorCQkqZnVuYyA9IHJzcy0+aGFzaF9mdW5jOworCisJaWYgKGtleSkKKwkJbWVtY3B5KGtleSwgaGFzaF9rZXktPmtleSwgKHNpemVfdCkoaGFzaF9rZXktPmtleXNfbnVtKSA8PCAyKTsKKworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV9nZXRfaGFzaF9jdHJsKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgZW51bSBlbmFfYWRtaW5fZmxvd19oYXNoX3Byb3RvIHByb3RvLAorCQkJICB1MTYgKmZpZWxkcykKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzdHJ1Y3QgZW5hX2FkbWluX2dldF9mZWF0X3Jlc3AgZ2V0X3Jlc3A7CisJaW50IHJjOworCisJcmMgPSBlbmFfY29tX2dldF9mZWF0dXJlX2V4KGVuYV9kZXYsICZnZXRfcmVzcCwKKwkJCQkgICAgRU5BX0FETUlOX1JTU19IQVNIX0lOUFVULAorCQkJCSAgICByc3MtPmhhc2hfY3RybF9kbWFfYWRkciwKKwkJCQkgICAgc2l6ZW9mKCpyc3MtPmhhc2hfY3RybCkpOworCWlmICh1bmxpa2VseShyYykpCisJCXJldHVybiByYzsKKworCWlmIChmaWVsZHMpCisJCSpmaWVsZHMgPSByc3MtPmhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW3Byb3RvXS5maWVsZHM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21fc2V0X2hhc2hfY3RybChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgKmFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCXN0cnVjdCBlbmFfcnNzICpyc3MgPSAmZW5hX2Rldi0+cnNzOworCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9yc3NfaGFzaF9jb250cm9sICpoYXNoX2N0cmwgPSByc3MtPmhhc2hfY3RybDsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X2NtZCBjbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9yZXNwIHJlc3A7CisJaW50IHJldDsKKworCWlmICghZW5hX2NvbV9jaGVja19zdXBwb3J0ZWRfZmVhdHVyZV9pZChlbmFfZGV2LAorCQkJCQkJRU5BX0FETUlOX1JTU19IQVNIX0lOUFVUKSkgeworCQlwcl9pbmZvKCJGZWF0dXJlICVkIGlzbid0IHN1cHBvcnRlZFxuIiwgRU5BX0FETUlOX1JTU19IQVNIX0lOUFVUKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwltZW1zZXQoJmNtZCwgMHgwLCBzaXplb2YoY21kKSk7CisKKwljbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX1NFVF9GRUFUVVJFOworCWNtZC5hcV9jb21tb25fZGVzY3JpcHRvci5mbGFncyA9CisJCUVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19DVFJMX0RBVEFfSU5ESVJFQ1RfTUFTSzsKKwljbWQuZmVhdF9jb21tb24uZmVhdHVyZV9pZCA9IEVOQV9BRE1JTl9SU1NfSEFTSF9JTlBVVDsKKwljbWQudS5mbG93X2hhc2hfaW5wdXQuZW5hYmxlZF9pbnB1dF9zb3J0ID0KKwkJRU5BX0FETUlOX0ZFQVRVUkVfUlNTX0ZMT1dfSEFTSF9JTlBVVF9MM19TT1JUX01BU0sgfAorCQlFTkFfQURNSU5fRkVBVFVSRV9SU1NfRkxPV19IQVNIX0lOUFVUX0w0X1NPUlRfTUFTSzsKKworCXJldCA9IGVuYV9jb21fbWVtX2FkZHJfc2V0KGVuYV9kZXYsCisJCQkJICAgJmNtZC5jb250cm9sX2J1ZmZlci5hZGRyZXNzLAorCQkJCSAgIHJzcy0+aGFzaF9jdHJsX2RtYV9hZGRyKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIm1lbW9yeSBhZGRyZXNzIHNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwljbWQuY29udHJvbF9idWZmZXIubGVuZ3RoID0gc2l6ZW9mKCpoYXNoX2N0cmwpOworCisJcmV0ID0gZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQoYWRtaW5fcXVldWUsCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqKSZjbWQsCisJCQkJCSAgICBzaXplb2YoY21kKSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqKSZyZXNwLAorCQkJCQkgICAgc2l6ZW9mKHJlc3ApKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IGhhc2ggaW5wdXQuIGVycm9yOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBlbmFfY29tX3NldF9kZWZhdWx0X2hhc2hfY3RybChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19oYXNoX2NvbnRyb2wgKmhhc2hfY3RybCA9CisJCXJzcy0+aGFzaF9jdHJsOworCXUxNiBhdmFpbGFibGVfZmllbGRzID0gMDsKKwlpbnQgcmMsIGk7CisKKwkvKiBHZXQgdGhlIHN1cHBvcnRlZCBoYXNoIGlucHV0ICovCisJcmMgPSBlbmFfY29tX2dldF9oYXNoX2N0cmwoZW5hX2RldiwgMCwgTlVMTCk7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJcmV0dXJuIHJjOworCisJaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbRU5BX0FETUlOX1JTU19UQ1A0XS5maWVsZHMgPQorCQlFTkFfQURNSU5fUlNTX0wzX1NBIHwgRU5BX0FETUlOX1JTU19MM19EQSB8CisJCUVOQV9BRE1JTl9SU1NfTDRfRFAgfCBFTkFfQURNSU5fUlNTX0w0X1NQOworCisJaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbRU5BX0FETUlOX1JTU19VRFA0XS5maWVsZHMgPQorCQlFTkFfQURNSU5fUlNTX0wzX1NBIHwgRU5BX0FETUlOX1JTU19MM19EQSB8CisJCUVOQV9BRE1JTl9SU1NfTDRfRFAgfCBFTkFfQURNSU5fUlNTX0w0X1NQOworCisJaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbRU5BX0FETUlOX1JTU19UQ1A2XS5maWVsZHMgPQorCQlFTkFfQURNSU5fUlNTX0wzX1NBIHwgRU5BX0FETUlOX1JTU19MM19EQSB8CisJCUVOQV9BRE1JTl9SU1NfTDRfRFAgfCBFTkFfQURNSU5fUlNTX0w0X1NQOworCisJaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbRU5BX0FETUlOX1JTU19VRFA2XS5maWVsZHMgPQorCQlFTkFfQURNSU5fUlNTX0wzX1NBIHwgRU5BX0FETUlOX1JTU19MM19EQSB8CisJCUVOQV9BRE1JTl9SU1NfTDRfRFAgfCBFTkFfQURNSU5fUlNTX0w0X1NQOworCisJaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbRU5BX0FETUlOX1JTU19JUDRdLmZpZWxkcyA9CisJCUVOQV9BRE1JTl9SU1NfTDNfU0EgfCBFTkFfQURNSU5fUlNTX0wzX0RBOworCisJaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbRU5BX0FETUlOX1JTU19JUDZdLmZpZWxkcyA9CisJCUVOQV9BRE1JTl9SU1NfTDNfU0EgfCBFTkFfQURNSU5fUlNTX0wzX0RBOworCisJaGFzaF9jdHJsLT5zZWxlY3RlZF9maWVsZHNbRU5BX0FETUlOX1JTU19JUDRfRlJBR10uZmllbGRzID0KKwkJRU5BX0FETUlOX1JTU19MM19TQSB8IEVOQV9BRE1JTl9SU1NfTDNfREE7CisKKwloYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1tFTkFfQURNSU5fUlNTX0lQNF9GUkFHXS5maWVsZHMgPQorCQlFTkFfQURNSU5fUlNTX0wyX0RBIHwgRU5BX0FETUlOX1JTU19MMl9TQTsKKworCWZvciAoaSA9IDA7IGkgPCBFTkFfQURNSU5fUlNTX1BST1RPX05VTTsgaSsrKSB7CisJCWF2YWlsYWJsZV9maWVsZHMgPSBoYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1tpXS5maWVsZHMgJgorCQkJCWhhc2hfY3RybC0+c3VwcG9ydGVkX2ZpZWxkc1tpXS5maWVsZHM7CisJCWlmIChhdmFpbGFibGVfZmllbGRzICE9IGhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW2ldLmZpZWxkcykgeworCQkJcHJfZXJyKCJoYXNoIGNvbnRyb2wgZG9lc24ndCBzdXBwb3J0IGFsbCB0aGUgZGVzaXJlIGNvbmZpZ3VyYXRpb24uIHByb3RvICV4IHN1cHBvcnRlZCAleCBzZWxlY3RlZCAleFxuIiwKKwkJCSAgICAgICBpLCBoYXNoX2N0cmwtPnN1cHBvcnRlZF9maWVsZHNbaV0uZmllbGRzLAorCQkJICAgICAgIGhhc2hfY3RybC0+c2VsZWN0ZWRfZmllbGRzW2ldLmZpZWxkcyk7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJfQorCisJcmMgPSBlbmFfY29tX3NldF9oYXNoX2N0cmwoZW5hX2Rldik7CisKKwkvKiBJbiBjYXNlIG9mIGZhaWx1cmUsIHJlc3RvcmUgdGhlIG9sZCBoYXNoIGN0cmwgKi8KKwlpZiAodW5saWtlbHkocmMpKQorCQllbmFfY29tX2dldF9oYXNoX2N0cmwoZW5hX2RldiwgMCwgTlVMTCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBlbmFfY29tX2ZpbGxfaGFzaF9jdHJsKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgIGVudW0gZW5hX2FkbWluX2Zsb3dfaGFzaF9wcm90byBwcm90bywKKwkJCSAgIHUxNiBoYXNoX2ZpZWxkcykKK3sKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2hhc2hfY29udHJvbCAqaGFzaF9jdHJsID0gcnNzLT5oYXNoX2N0cmw7CisJdTE2IHN1cHBvcnRlZF9maWVsZHM7CisJaW50IHJjOworCisJaWYgKHByb3RvID49IEVOQV9BRE1JTl9SU1NfUFJPVE9fTlVNKSB7CisJCXByX2VycigiSW52YWxpZCBwcm90byBudW0gKCV1KVxuIiwgcHJvdG8pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBHZXQgdGhlIGN0cmwgdGFibGUgKi8KKwlyYyA9IGVuYV9jb21fZ2V0X2hhc2hfY3RybChlbmFfZGV2LCBwcm90bywgTlVMTCk7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJcmV0dXJuIHJjOworCisJLyogTWFrZSBzdXJlIGFsbCB0aGUgZmllbGRzIGFyZSBzdXBwb3J0ZWQgKi8KKwlzdXBwb3J0ZWRfZmllbGRzID0gaGFzaF9jdHJsLT5zdXBwb3J0ZWRfZmllbGRzW3Byb3RvXS5maWVsZHM7CisJaWYgKChoYXNoX2ZpZWxkcyAmIHN1cHBvcnRlZF9maWVsZHMpICE9IGhhc2hfZmllbGRzKSB7CisJCXByX2VycigicHJvdG8gJWQgZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1aXJlZCBmaWVsZHMgJXguIHN1cHBvcnRzIG9ubHk6ICV4XG4iLAorCQkgICAgICAgcHJvdG8sIGhhc2hfZmllbGRzLCBzdXBwb3J0ZWRfZmllbGRzKTsKKwl9CisKKwloYXNoX2N0cmwtPnNlbGVjdGVkX2ZpZWxkc1twcm90b10uZmllbGRzID0gaGFzaF9maWVsZHM7CisKKwlyYyA9IGVuYV9jb21fc2V0X2hhc2hfY3RybChlbmFfZGV2KTsKKworCS8qIEluIGNhc2Ugb2YgZmFpbHVyZSwgcmVzdG9yZSB0aGUgb2xkIGhhc2ggY3RybCAqLworCWlmICh1bmxpa2VseShyYykpCisJCWVuYV9jb21fZ2V0X2hhc2hfY3RybChlbmFfZGV2LCAwLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9maWxsX2VudHJ5KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkgICAgICB1MTYgZW50cnlfaWR4LCB1MTYgZW50cnlfdmFsdWUpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisKKwlpZiAodW5saWtlbHkoZW50cnlfaWR4ID49ICgxIDw8IHJzcy0+dGJsX2xvZ19zaXplKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVubGlrZWx5KChlbnRyeV92YWx1ZSA+IEVOQV9UT1RBTF9OVU1fUVVFVUVTKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcnNzLT5ob3N0X3Jzc19pbmRfdGJsW2VudHJ5X2lkeF0gPSBlbnRyeV92YWx1ZTsKKworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9zZXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSA9ICZlbmFfZGV2LT5hZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX3JzcyAqcnNzID0gJmVuYV9kZXYtPnJzczsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X2NtZCBjbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9yZXNwIHJlc3A7CisJaW50IHJldDsKKworCWlmICghZW5hX2NvbV9jaGVja19zdXBwb3J0ZWRfZmVhdHVyZV9pZCgKKwkJICAgIGVuYV9kZXYsIEVOQV9BRE1JTl9SU1NfUkVESVJFQ1RJT05fVEFCTEVfQ09ORklHKSkgeworCQlwcl9pbmZvKCJGZWF0dXJlICVkIGlzbid0IHN1cHBvcnRlZFxuIiwKKwkJCUVOQV9BRE1JTl9SU1NfUkVESVJFQ1RJT05fVEFCTEVfQ09ORklHKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXQgPSBlbmFfY29tX2luZF90YmxfY29udmVydF90b19kZXZpY2UoZW5hX2Rldik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBjb252ZXJ0IGhvc3QgaW5kaXJlY3Rpb24gdGFibGUgdG8gZGV2aWNlIHRhYmxlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwltZW1zZXQoJmNtZCwgMHgwLCBzaXplb2YoY21kKSk7CisKKwljbWQuYXFfY29tbW9uX2Rlc2NyaXB0b3Iub3Bjb2RlID0gRU5BX0FETUlOX1NFVF9GRUFUVVJFOworCWNtZC5hcV9jb21tb25fZGVzY3JpcHRvci5mbGFncyA9CisJCUVOQV9BRE1JTl9BUV9DT01NT05fREVTQ19DVFJMX0RBVEFfSU5ESVJFQ1RfTUFTSzsKKwljbWQuZmVhdF9jb21tb24uZmVhdHVyZV9pZCA9IEVOQV9BRE1JTl9SU1NfUkVESVJFQ1RJT05fVEFCTEVfQ09ORklHOworCWNtZC51LmluZF90YWJsZS5zaXplID0gcnNzLT50YmxfbG9nX3NpemU7CisJY21kLnUuaW5kX3RhYmxlLmlubGluZV9pbmRleCA9IDB4RkZGRkZGRkY7CisKKwlyZXQgPSBlbmFfY29tX21lbV9hZGRyX3NldChlbmFfZGV2LAorCQkJCSAgICZjbWQuY29udHJvbF9idWZmZXIuYWRkcmVzcywKKwkJCQkgICByc3MtPnJzc19pbmRfdGJsX2RtYV9hZGRyKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIm1lbW9yeSBhZGRyZXNzIHNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNtZC5jb250cm9sX2J1ZmZlci5sZW5ndGggPSAoMVVMTCA8PCByc3MtPnRibF9sb2dfc2l6ZSkgKgorCQlzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9yc3NfaW5kX3RhYmxlX2VudHJ5KTsKKworCXJldCA9IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKGFkbWluX3F1ZXVlLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKikmY21kLAorCQkJCQkgICAgc2l6ZW9mKGNtZCksCisJCQkJCSAgICAoc3RydWN0IGVuYV9hZG1pbl9hY3FfZW50cnkgKikmcmVzcCwKKwkJCQkJICAgIHNpemVvZihyZXNwKSk7CisKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IGluZGlyZWN0IHRhYmxlLiBlcnJvcjogJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9nZXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MzIgKmluZF90YmwpCit7CisJc3RydWN0IGVuYV9yc3MgKnJzcyA9ICZlbmFfZGV2LT5yc3M7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIGdldF9yZXNwOworCXUzMiB0Ymxfc2l6ZTsKKwlpbnQgaSwgcmM7CisKKwl0Ymxfc2l6ZSA9ICgxVUxMIDw8IHJzcy0+dGJsX2xvZ19zaXplKSAqCisJCXNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX3Jzc19pbmRfdGFibGVfZW50cnkpOworCisJcmMgPSBlbmFfY29tX2dldF9mZWF0dXJlX2V4KGVuYV9kZXYsICZnZXRfcmVzcCwKKwkJCQkgICAgRU5BX0FETUlOX1JTU19SRURJUkVDVElPTl9UQUJMRV9DT05GSUcsCisJCQkJICAgIHJzcy0+cnNzX2luZF90YmxfZG1hX2FkZHIsCisJCQkJICAgIHRibF9zaXplKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoIWluZF90YmwpCisJCXJldHVybiAwOworCisJcmMgPSBlbmFfY29tX2luZF90YmxfY29udmVydF9mcm9tX2RldmljZShlbmFfZGV2KTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgcnNzLT50YmxfbG9nX3NpemUpOyBpKyspCisJCWluZF90YmxbaV0gPSByc3MtPmhvc3RfcnNzX2luZF90YmxbaV07CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21fcnNzX2luaXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MTYgaW5kcl90YmxfbG9nX3NpemUpCit7CisJaW50IHJjOworCisJbWVtc2V0KCZlbmFfZGV2LT5yc3MsIDB4MCwgc2l6ZW9mKGVuYV9kZXYtPnJzcykpOworCisJcmMgPSBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2FsbG9jYXRlKGVuYV9kZXYsIGluZHJfdGJsX2xvZ19zaXplKTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlnb3RvIGVycl9pbmRyX3RibDsKKworCXJjID0gZW5hX2NvbV9oYXNoX2tleV9hbGxvY2F0ZShlbmFfZGV2KTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlnb3RvIGVycl9oYXNoX2tleTsKKworCXJjID0gZW5hX2NvbV9oYXNoX2N0cmxfaW5pdChlbmFfZGV2KTsKKwlpZiAodW5saWtlbHkocmMpKQorCQlnb3RvIGVycl9oYXNoX2N0cmw7CisKKwlyZXR1cm4gMDsKKworZXJyX2hhc2hfY3RybDoKKwllbmFfY29tX2hhc2hfa2V5X2Rlc3Ryb3koZW5hX2Rldik7CitlcnJfaGFzaF9rZXk6CisJZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9kZXN0cm95KGVuYV9kZXYpOworZXJyX2luZHJfdGJsOgorCisJcmV0dXJuIHJjOworfQorCit2b2lkIGVuYV9jb21fcnNzX2Rlc3Ryb3koc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCWVuYV9jb21faW5kaXJlY3RfdGFibGVfZGVzdHJveShlbmFfZGV2KTsKKwllbmFfY29tX2hhc2hfa2V5X2Rlc3Ryb3koZW5hX2Rldik7CisJZW5hX2NvbV9oYXNoX2N0cmxfZGVzdHJveShlbmFfZGV2KTsKKworCW1lbXNldCgmZW5hX2Rldi0+cnNzLCAweDAsIHNpemVvZihlbmFfZGV2LT5yc3MpKTsKK30KKworaW50IGVuYV9jb21fYWxsb2NhdGVfaG9zdF9pbmZvKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2hvc3RfYXR0cmlidXRlICpob3N0X2F0dHIgPSAmZW5hX2Rldi0+aG9zdF9hdHRyOworCisJaG9zdF9hdHRyLT5ob3N0X2luZm8gPQorCQlkbWFfemFsbG9jX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgU1pfNEssCisJCQkJICAgICZob3N0X2F0dHItPmhvc3RfaW5mb19kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFob3N0X2F0dHItPmhvc3RfaW5mbykpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX2FsbG9jYXRlX2RlYnVnX2FyZWEoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCXUzMiBkZWJ1Z19hcmVhX3NpemUpCit7CisJc3RydWN0IGVuYV9ob3N0X2F0dHJpYnV0ZSAqaG9zdF9hdHRyID0gJmVuYV9kZXYtPmhvc3RfYXR0cjsKKworCWhvc3RfYXR0ci0+ZGVidWdfYXJlYV92aXJ0X2FkZHIgPQorCQlkbWFfemFsbG9jX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgZGVidWdfYXJlYV9zaXplLAorCQkJCSAgICAmaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX2RtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWhvc3RfYXR0ci0+ZGVidWdfYXJlYV92aXJ0X2FkZHIpKSB7CisJCWhvc3RfYXR0ci0+ZGVidWdfYXJlYV9zaXplID0gMDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX3NpemUgPSBkZWJ1Z19hcmVhX3NpemU7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbmFfY29tX2RlbGV0ZV9ob3N0X2luZm8oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfaG9zdF9hdHRyaWJ1dGUgKmhvc3RfYXR0ciA9ICZlbmFfZGV2LT5ob3N0X2F0dHI7CisKKwlpZiAoaG9zdF9hdHRyLT5ob3N0X2luZm8pIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZW5hX2Rldi0+ZG1hZGV2LCBTWl80SywgaG9zdF9hdHRyLT5ob3N0X2luZm8sCisJCQkJICBob3N0X2F0dHItPmhvc3RfaW5mb19kbWFfYWRkcik7CisJCWhvc3RfYXR0ci0+aG9zdF9pbmZvID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgZW5hX2NvbV9kZWxldGVfZGVidWdfYXJlYShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9ob3N0X2F0dHJpYnV0ZSAqaG9zdF9hdHRyID0gJmVuYV9kZXYtPmhvc3RfYXR0cjsKKworCWlmIChob3N0X2F0dHItPmRlYnVnX2FyZWFfdmlydF9hZGRyKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGVuYV9kZXYtPmRtYWRldiwgaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX3NpemUsCisJCQkJICBob3N0X2F0dHItPmRlYnVnX2FyZWFfdmlydF9hZGRyLAorCQkJCSAgaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX2RtYV9hZGRyKTsKKwkJaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX3ZpcnRfYWRkciA9IE5VTEw7CisJfQorfQorCitpbnQgZW5hX2NvbV9zZXRfaG9zdF9hdHRyaWJ1dGVzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2hvc3RfYXR0cmlidXRlICpob3N0X2F0dHIgPSAmZW5hX2Rldi0+aG9zdF9hdHRyOworCXN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX2FkbWluX3NldF9mZWF0X2NtZCBjbWQ7CisJc3RydWN0IGVuYV9hZG1pbl9zZXRfZmVhdF9yZXNwIHJlc3A7CisKKwlpbnQgcmV0OworCisJaWYgKCFlbmFfY29tX2NoZWNrX3N1cHBvcnRlZF9mZWF0dXJlX2lkKGVuYV9kZXYsCisJCQkJCQlFTkFfQURNSU5fSE9TVF9BVFRSX0NPTkZJRykpIHsKKwkJcHJfd2FybigiU2V0IGhvc3QgYXR0cmlidXRlIGlzbid0IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJbWVtc2V0KCZjbWQsIDB4MCwgc2l6ZW9mKGNtZCkpOworCWFkbWluX3F1ZXVlID0gJmVuYV9kZXYtPmFkbWluX3F1ZXVlOworCisJY21kLmFxX2NvbW1vbl9kZXNjcmlwdG9yLm9wY29kZSA9IEVOQV9BRE1JTl9TRVRfRkVBVFVSRTsKKwljbWQuZmVhdF9jb21tb24uZmVhdHVyZV9pZCA9IEVOQV9BRE1JTl9IT1NUX0FUVFJfQ09ORklHOworCisJcmV0ID0gZW5hX2NvbV9tZW1fYWRkcl9zZXQoZW5hX2RldiwKKwkJCQkgICAmY21kLnUuaG9zdF9hdHRyLmRlYnVnX2JhLAorCQkJCSAgIGhvc3RfYXR0ci0+ZGVidWdfYXJlYV9kbWFfYWRkcik7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWRkcmVzcyBzZXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBlbmFfY29tX21lbV9hZGRyX3NldChlbmFfZGV2LAorCQkJCSAgICZjbWQudS5ob3N0X2F0dHIub3NfaW5mb19iYSwKKwkJCQkgICBob3N0X2F0dHItPmhvc3RfaW5mb19kbWFfYWRkcik7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJcHJfZXJyKCJtZW1vcnkgYWRkcmVzcyBzZXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljbWQudS5ob3N0X2F0dHIuZGVidWdfYXJlYV9zaXplID0gaG9zdF9hdHRyLT5kZWJ1Z19hcmVhX3NpemU7CisKKwlyZXQgPSBlbmFfY29tX2V4ZWN1dGVfYWRtaW5fY29tbWFuZChhZG1pbl9xdWV1ZSwKKwkJCQkJICAgIChzdHJ1Y3QgZW5hX2FkbWluX2FxX2VudHJ5ICopJmNtZCwKKwkJCQkJICAgIHNpemVvZihjbWQpLAorCQkJCQkgICAgKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICopJnJlc3AsCisJCQkJCSAgICBzaXplb2YocmVzcCkpOworCisJaWYgKHVubGlrZWx5KHJldCkpCisJCXByX2VycigiRmFpbGVkIHRvIHNldCBob3N0IGF0dHJpYnV0ZXM6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyogSW50ZXJydXB0IG1vZGVyYXRpb24gKi8KK2Jvb2wgZW5hX2NvbV9pbnRlcnJ1cHRfbW9kZXJhdGlvbl9zdXBwb3J0ZWQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXJldHVybiBlbmFfY29tX2NoZWNrX3N1cHBvcnRlZF9mZWF0dXJlX2lkKGVuYV9kZXYsCisJCQkJCQkgIEVOQV9BRE1JTl9JTlRFUlJVUFRfTU9ERVJBVElPTik7Cit9CisKK2ludCBlbmFfY29tX3VwZGF0ZV9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3R4KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkJCSAgICAgIHUzMiB0eF9jb2FsZXNjZV91c2VjcykKK3sKKwlpZiAoIWVuYV9kZXYtPmludHJfZGVsYXlfcmVzb2x1dGlvbikgeworCQlwcl9lcnIoIklsbGVnYWwgaW50ZXJydXB0IGRlbGF5IGdyYW51bGFyaXR5IHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJZW5hX2Rldi0+aW50cl9tb2Rlcl90eF9pbnRlcnZhbCA9IHR4X2NvYWxlc2NlX3VzZWNzIC8KKwkJZW5hX2Rldi0+aW50cl9kZWxheV9yZXNvbHV0aW9uOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX3VwZGF0ZV9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3J4KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkJCSAgICAgIHUzMiByeF9jb2FsZXNjZV91c2VjcykKK3sKKwlpZiAoIWVuYV9kZXYtPmludHJfZGVsYXlfcmVzb2x1dGlvbikgeworCQlwcl9lcnIoIklsbGVnYWwgaW50ZXJydXB0IGRlbGF5IGdyYW51bGFyaXR5IHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogV2UgdXNlIExPV0VTVCBlbnRyeSBvZiBtb2RlcmF0aW9uIHRhYmxlIGZvciBzdG9yaW5nCisJICogbm9uYWRhcHRpdmUgaW50ZXJydXB0IGNvYWxlc2NpbmcgdmFsdWVzCisJICovCisJZW5hX2Rldi0+aW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfTE9XRVNUXS5pbnRyX21vZGVyX2ludGVydmFsID0KKwkJcnhfY29hbGVzY2VfdXNlY3MgLyBlbmFfZGV2LT5pbnRyX2RlbGF5X3Jlc29sdXRpb247CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbmFfY29tX2Rlc3Ryb3lfaW50ZXJydXB0X21vZGVyYXRpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCWlmIChlbmFfZGV2LT5pbnRyX21vZGVyX3RibCkKKwkJZGV2bV9rZnJlZShlbmFfZGV2LT5kbWFkZXYsIGVuYV9kZXYtPmludHJfbW9kZXJfdGJsKTsKKwllbmFfZGV2LT5pbnRyX21vZGVyX3RibCA9IE5VTEw7Cit9CisKK2ludCBlbmFfY29tX2luaXRfaW50ZXJydXB0X21vZGVyYXRpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCBnZXRfcmVzcDsKKwl1MTYgZGVsYXlfcmVzb2x1dGlvbjsKKwlpbnQgcmM7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2ZlYXR1cmUoZW5hX2RldiwgJmdldF9yZXNwLAorCQkJCSBFTkFfQURNSU5fSU5URVJSVVBUX01PREVSQVRJT04pOworCisJaWYgKHJjKSB7CisJCWlmIChyYyA9PSAtRVBFUk0pIHsKKwkJCXByX2luZm8oIkZlYXR1cmUgJWQgaXNuJ3Qgc3VwcG9ydGVkXG4iLAorCQkJCUVOQV9BRE1JTl9JTlRFUlJVUFRfTU9ERVJBVElPTik7CisJCQlyYyA9IDA7CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBnZXQgaW50ZXJydXB0IG1vZGVyYXRpb24gYWRtaW4gY21kLiByYzogJWRcbiIsCisJCQkgICAgICAgcmMpOworCQl9CisKKwkJLyogbm8gbW9kZXJhdGlvbiBzdXBwb3J0ZWQsIGRpc2FibGUgYWRhcHRpdmUgc3VwcG9ydCAqLworCQllbmFfY29tX2Rpc2FibGVfYWRhcHRpdmVfbW9kZXJhdGlvbihlbmFfZGV2KTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gZW5hX2NvbV9pbml0X2ludGVycnVwdF9tb2RlcmF0aW9uX3RhYmxlKGVuYV9kZXYpOworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwkvKiBpZiBtb2RlcmF0aW9uIGlzIHN1cHBvcnRlZCBieSBkZXZpY2Ugd2Ugc2V0IGFkYXB0aXZlIG1vZGVyYXRpb24gKi8KKwlkZWxheV9yZXNvbHV0aW9uID0gZ2V0X3Jlc3AudS5pbnRyX21vZGVyYXRpb24uaW50cl9kZWxheV9yZXNvbHV0aW9uOworCWVuYV9jb21fdXBkYXRlX2ludHJfZGVsYXlfcmVzb2x1dGlvbihlbmFfZGV2LCBkZWxheV9yZXNvbHV0aW9uKTsKKwllbmFfY29tX2VuYWJsZV9hZGFwdGl2ZV9tb2RlcmF0aW9uKGVuYV9kZXYpOworCisJcmV0dXJuIDA7CitlcnI6CisJZW5hX2NvbV9kZXN0cm95X2ludGVycnVwdF9tb2RlcmF0aW9uKGVuYV9kZXYpOworCXJldHVybiByYzsKK30KKwordm9pZCBlbmFfY29tX2NvbmZpZ19kZWZhdWx0X2ludGVycnVwdF9tb2RlcmF0aW9uX3RhYmxlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmludHJfbW9kZXJfdGJsID0gZW5hX2Rldi0+aW50cl9tb2Rlcl90Ymw7CisKKwlpZiAoIWludHJfbW9kZXJfdGJsKQorCQlyZXR1cm47CisKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9MT1dFU1RdLmludHJfbW9kZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9MT1dFU1RfVVNFQ1M7CisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfTE9XRVNUXS5wa3RzX3Blcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0xPV0VTVF9QS1RTOworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0xPV0VTVF0uYnl0ZXNfcGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfTE9XRVNUX0JZVEVTOworCisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfTE9XXS5pbnRyX21vZGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfTE9XX1VTRUNTOworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX0xPV10ucGt0c19wZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9MT1dfUEtUUzsKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9MT1ddLmJ5dGVzX3Blcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0xPV19CWVRFUzsKKworCWludHJfbW9kZXJfdGJsW0VOQV9JTlRSX01PREVSX01JRF0uaW50cl9tb2Rlcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX01JRF9VU0VDUzsKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9NSURdLnBrdHNfcGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfTUlEX1BLVFM7CisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfTUlEXS5ieXRlc19wZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9NSURfQllURVM7CisKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9ISUdIXS5pbnRyX21vZGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfSElHSF9VU0VDUzsKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9ISUdIXS5wa3RzX3Blcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0hJR0hfUEtUUzsKKwlpbnRyX21vZGVyX3RibFtFTkFfSU5UUl9NT0RFUl9ISUdIXS5ieXRlc19wZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9ISUdIX0JZVEVTOworCisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfSElHSEVTVF0uaW50cl9tb2Rlcl9pbnRlcnZhbCA9CisJCUVOQV9JTlRSX0hJR0hFU1RfVVNFQ1M7CisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfSElHSEVTVF0ucGt0c19wZXJfaW50ZXJ2YWwgPQorCQlFTkFfSU5UUl9ISUdIRVNUX1BLVFM7CisJaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfSElHSEVTVF0uYnl0ZXNfcGVyX2ludGVydmFsID0KKwkJRU5BX0lOVFJfSElHSEVTVF9CWVRFUzsKK30KKwordW5zaWduZWQgaW50IGVuYV9jb21fZ2V0X25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfdHgoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXJldHVybiBlbmFfZGV2LT5pbnRyX21vZGVyX3R4X2ludGVydmFsOworfQorCit1bnNpZ25lZCBpbnQgZW5hX2NvbV9nZXRfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF9yeChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICppbnRyX21vZGVyX3RibCA9IGVuYV9kZXYtPmludHJfbW9kZXJfdGJsOworCisJaWYgKGludHJfbW9kZXJfdGJsKQorCQlyZXR1cm4gaW50cl9tb2Rlcl90YmxbRU5BX0lOVFJfTU9ERVJfTE9XRVNUXS5pbnRyX21vZGVyX2ludGVydmFsOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW5hX2NvbV9pbml0X2ludHJfbW9kZXJhdGlvbl9lbnRyeShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJCWVudW0gZW5hX2ludHJfbW9kZXJfbGV2ZWwgbGV2ZWwsCisJCQkJCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICppbnRyX21vZGVyX3RibCA9IGVuYV9kZXYtPmludHJfbW9kZXJfdGJsOworCisJaWYgKGxldmVsID49IEVOQV9JTlRSX01BWF9OVU1fT0ZfTEVWRUxTKQorCQlyZXR1cm47CisKKwlpbnRyX21vZGVyX3RibFtsZXZlbF0uaW50cl9tb2Rlcl9pbnRlcnZhbCA9IGVudHJ5LT5pbnRyX21vZGVyX2ludGVydmFsOworCWlmIChlbmFfZGV2LT5pbnRyX2RlbGF5X3Jlc29sdXRpb24pCisJCWludHJfbW9kZXJfdGJsW2xldmVsXS5pbnRyX21vZGVyX2ludGVydmFsIC89CisJCQllbmFfZGV2LT5pbnRyX2RlbGF5X3Jlc29sdXRpb247CisJaW50cl9tb2Rlcl90YmxbbGV2ZWxdLnBrdHNfcGVyX2ludGVydmFsID0gZW50cnktPnBrdHNfcGVyX2ludGVydmFsOworCisJLyogdXNlIGhhcmRjb2RlZCB2YWx1ZSB1bnRpbCBldGh0b29sIHN1cHBvcnRzIGJ5dGVjb3VudCBwYXJhbWV0ZXIgKi8KKwlpZiAoZW50cnktPmJ5dGVzX3Blcl9pbnRlcnZhbCAhPSBFTkFfSU5UUl9CWVRFX0NPVU5UX05PVF9TVVBQT1JURUQpCisJCWludHJfbW9kZXJfdGJsW2xldmVsXS5ieXRlc19wZXJfaW50ZXJ2YWwgPSBlbnRyeS0+Ynl0ZXNfcGVyX2ludGVydmFsOworfQorCit2b2lkIGVuYV9jb21fZ2V0X2ludHJfbW9kZXJhdGlvbl9lbnRyeShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJICAgICAgIGVudW0gZW5hX2ludHJfbW9kZXJfbGV2ZWwgbGV2ZWwsCisJCQkJICAgICAgIHN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICppbnRyX21vZGVyX3RibCA9IGVuYV9kZXYtPmludHJfbW9kZXJfdGJsOworCisJaWYgKGxldmVsID49IEVOQV9JTlRSX01BWF9OVU1fT0ZfTEVWRUxTKQorCQlyZXR1cm47CisKKwllbnRyeS0+aW50cl9tb2Rlcl9pbnRlcnZhbCA9IGludHJfbW9kZXJfdGJsW2xldmVsXS5pbnRyX21vZGVyX2ludGVydmFsOworCWlmIChlbmFfZGV2LT5pbnRyX2RlbGF5X3Jlc29sdXRpb24pCisJCWVudHJ5LT5pbnRyX21vZGVyX2ludGVydmFsICo9IGVuYV9kZXYtPmludHJfZGVsYXlfcmVzb2x1dGlvbjsKKwllbnRyeS0+cGt0c19wZXJfaW50ZXJ2YWwgPQorCWludHJfbW9kZXJfdGJsW2xldmVsXS5wa3RzX3Blcl9pbnRlcnZhbDsKKwllbnRyeS0+Ynl0ZXNfcGVyX2ludGVydmFsID0gaW50cl9tb2Rlcl90YmxbbGV2ZWxdLmJ5dGVzX3Blcl9pbnRlcnZhbDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2NvbS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfY29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA5ZDdiOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2NvbS5oCkBAIC0wLDAgKzEsMTAzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBFTkFfQ09NCisjZGVmaW5lIEVOQV9DT00KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgImVuYV9jb21tb25fZGVmcy5oIgorI2luY2x1ZGUgImVuYV9hZG1pbl9kZWZzLmgiCisjaW5jbHVkZSAiZW5hX2V0aF9pb19kZWZzLmgiCisjaW5jbHVkZSAiZW5hX3JlZ3NfZGVmcy5oIgorCisjdW5kZWYgcHJfZm10CisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNkZWZpbmUgRU5BX01BWF9OVU1fSU9fUVVFVUVTCQkxMjhVCisvKiBXZSBuZWVkIHRvIHF1ZXVlcyBmb3IgZWFjaCBJTyAob24gZm9yIFR4IGFuZCBvbmUgZm9yIFJ4KSAqLworI2RlZmluZSBFTkFfVE9UQUxfTlVNX1FVRVVFUwkJKDIgKiAoRU5BX01BWF9OVU1fSU9fUVVFVUVTKSkKKworI2RlZmluZSBFTkFfTUFYX0hBTkRMRVJTIDI1NgorCisjZGVmaW5lIEVOQV9NQVhfUEhZU19BRERSX1NJWkVfQklUUyA0OAorCisvKiBVbml0IGluIHVzZWMgKi8KKyNkZWZpbmUgRU5BX1JFR19SRUFEX1RJTUVPVVQgMjAwMDAwCisKKyNkZWZpbmUgQURNSU5fU1FfU0laRShkZXB0aCkJKChkZXB0aCkgKiBzaXplb2Yoc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSkpCisjZGVmaW5lIEFETUlOX0NRX1NJWkUoZGVwdGgpCSgoZGVwdGgpICogc2l6ZW9mKHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5KSkKKyNkZWZpbmUgQURNSU5fQUVOUV9TSVpFKGRlcHRoKQkoKGRlcHRoKSAqIHNpemVvZihzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfZW50cnkpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFTkEgYWRhcHRpdmUgaW50ZXJydXB0IG1vZGVyYXRpb24gc2V0dGluZ3MgKi8KKworI2RlZmluZSBFTkFfSU5UUl9MT1dFU1RfVVNFQ1MgICAgICAgICAgICgwKQorI2RlZmluZSBFTkFfSU5UUl9MT1dFU1RfUEtUUyAgICAgICAgICAgICgzKQorI2RlZmluZSBFTkFfSU5UUl9MT1dFU1RfQllURVMgICAgICAgICAgICgyICogMTUyNCkKKworI2RlZmluZSBFTkFfSU5UUl9MT1dfVVNFQ1MgICAgICAgICAgICAgICgzMikKKyNkZWZpbmUgRU5BX0lOVFJfTE9XX1BLVFMgICAgICAgICAgICAgICAoMTIpCisjZGVmaW5lIEVOQV9JTlRSX0xPV19CWVRFUyAgICAgICAgICAgICAgKDE2ICogMTAyNCkKKworI2RlZmluZSBFTkFfSU5UUl9NSURfVVNFQ1MgICAgICAgICAgICAgICg4MCkKKyNkZWZpbmUgRU5BX0lOVFJfTUlEX1BLVFMgICAgICAgICAgICAgICAoNDgpCisjZGVmaW5lIEVOQV9JTlRSX01JRF9CWVRFUyAgICAgICAgICAgICAgKDY0ICogMTAyNCkKKworI2RlZmluZSBFTkFfSU5UUl9ISUdIX1VTRUNTICAgICAgICAgICAgICgxMjgpCisjZGVmaW5lIEVOQV9JTlRSX0hJR0hfUEtUUyAgICAgICAgICAgICAgKDk2KQorI2RlZmluZSBFTkFfSU5UUl9ISUdIX0JZVEVTICAgICAgICAgICAgICgxMjggKiAxMDI0KQorCisjZGVmaW5lIEVOQV9JTlRSX0hJR0hFU1RfVVNFQ1MgICAgICAgICAgKDE5MikKKyNkZWZpbmUgRU5BX0lOVFJfSElHSEVTVF9QS1RTICAgICAgICAgICAoMTI4KQorI2RlZmluZSBFTkFfSU5UUl9ISUdIRVNUX0JZVEVTICAgICAgICAgICgxOTIgKiAxMDI0KQorCisjZGVmaW5lIEVOQV9JTlRSX0lOSVRJQUxfVFhfSU5URVJWQUxfVVNFQ1MJCTE5NgorI2RlZmluZSBFTkFfSU5UUl9JTklUSUFMX1JYX0lOVEVSVkFMX1VTRUNTCQk0CisjZGVmaW5lIEVOQV9JTlRSX0RFTEFZX09MRF9WQUxVRV9XRUlHSFQJCQk2CisjZGVmaW5lIEVOQV9JTlRSX0RFTEFZX05FV19WQUxVRV9XRUlHSFQJCQk0CisjZGVmaW5lIEVOQV9JTlRSX01PREVSX0xFVkVMX1NUUklERQkJCTIKKyNkZWZpbmUgRU5BX0lOVFJfQllURV9DT1VOVF9OT1RfU1VQUE9SVEVECQkweEZGRkZGRgorCitlbnVtIGVuYV9pbnRyX21vZGVyX2xldmVsIHsKKwlFTkFfSU5UUl9NT0RFUl9MT1dFU1QgPSAwLAorCUVOQV9JTlRSX01PREVSX0xPVywKKwlFTkFfSU5UUl9NT0RFUl9NSUQsCisJRU5BX0lOVFJfTU9ERVJfSElHSCwKKwlFTkFfSU5UUl9NT0RFUl9ISUdIRVNULAorCUVOQV9JTlRSX01BWF9OVU1fT0ZfTEVWRUxTLAorfTsKKworc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5IHsKKwl1bnNpZ25lZCBpbnQgaW50cl9tb2Rlcl9pbnRlcnZhbDsKKwl1bnNpZ25lZCBpbnQgcGt0c19wZXJfaW50ZXJ2YWw7CisJdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9pbnRlcnZhbDsKK307CisKK2VudW0gcXVldWVfZGlyZWN0aW9uIHsKKwlFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9UWCwKKwlFTkFfQ09NX0lPX1FVRVVFX0RJUkVDVElPTl9SWAorfTsKKworc3RydWN0IGVuYV9jb21fYnVmIHsKKwlkbWFfYWRkcl90IHBhZGRyOyAvKio8IEJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzICovCisJdTE2IGxlbjsgLyoqPCBCdWZmZXIgbGVuZ3RoIGluIGJ5dGVzICovCit9OworCitzdHJ1Y3QgZW5hX2NvbV9yeF9idWZfaW5mbyB7CisJdTE2IGxlbjsKKwl1MTYgcmVxX2lkOworfTsKKworc3RydWN0IGVuYV9jb21faW9fZGVzY19hZGRyIHsKKwl1OCBfX2lvbWVtICpwYnVmX2Rldl9hZGRyOyAvKiBMTFEgYWRkcmVzcyAqLworCXU4ICp2aXJ0X2FkZHI7CisJZG1hX2FkZHJfdCBwaHlzX2FkZHI7Cit9OworCitzdHJ1Y3QgZW5hX2NvbV90eF9tZXRhIHsKKwl1MTYgbXNzOworCXUxNiBsM19oZHJfbGVuOworCXUxNiBsM19oZHJfb2Zmc2V0OworCXUxNiBsNF9oZHJfbGVuOyAvKiBJbiB3b3JkcyAqLworfTsKKworc3RydWN0IGVuYV9jb21faW9fY3EgeworCXN0cnVjdCBlbmFfY29tX2lvX2Rlc2NfYWRkciBjZGVzY19hZGRyOworCisJLyogSW50ZXJydXB0IHVubWFzayByZWdpc3RlciAqLworCXUzMiBfX2lvbWVtICp1bm1hc2tfcmVnOworCisJLyogVGhlIGNvbXBsZXRpb24gcXVldWUgaGVhZCBkb29yYmVsbCByZWdpc3RlciAqLworCXUzMiBfX2lvbWVtICpjcV9oZWFkX2RiX3JlZzsKKworCS8qIG51bWEgY29uZmlndXJhdGlvbiByZWdpc3RlciAoZm9yIFRQSCkgKi8KKwl1MzIgX19pb21lbSAqbnVtYV9ub2RlX2NmZ19yZWc7CisKKwkvKiBUaGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIGFib3ZlIHJlZ2lzdGVyIHRvIHVubWFzaworCSAqIHRoZSBpbnRlcnJ1cHQgb2YgdGhpcyBxdWV1ZQorCSAqLworCXUzMiBtc2l4X3ZlY3RvcjsKKworCWVudW0gcXVldWVfZGlyZWN0aW9uIGRpcmVjdGlvbjsKKworCS8qIGhvbGRzIHRoZSBudW1iZXIgb2YgY2Rlc2Mgb2YgdGhlIGN1cnJlbnQgcGFja2V0ICovCisJdTE2IGN1cl9yeF9wa3RfY2Rlc2NfY291bnQ7CisJLyogc2F2ZSB0aGUgZmlydCBjZGVzYyBpZHggb2YgdGhlIGN1cnJlbnQgcGFja2V0ICovCisJdTE2IGN1cl9yeF9wa3RfY2Rlc2Nfc3RhcnRfaWR4OworCisJdTE2IHFfZGVwdGg7CisJLyogQ2FsbGVyIHFpZCAqLworCXUxNiBxaWQ7CisKKwkvKiBEZXZpY2UgcXVldWUgaW5kZXggKi8KKwl1MTYgaWR4OworCXUxNiBoZWFkOworCXUxNiBsYXN0X2hlYWRfdXBkYXRlOworCXU4IHBoYXNlOworCXU4IGNkZXNjX2VudHJ5X3NpemVfaW5fYnl0ZXM7CisKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkOworCitzdHJ1Y3QgZW5hX2NvbV9pb19zcSB7CisJc3RydWN0IGVuYV9jb21faW9fZGVzY19hZGRyIGRlc2NfYWRkcjsKKworCXUzMiBfX2lvbWVtICpkYl9hZGRyOworCXU4IF9faW9tZW0gKmhlYWRlcl9hZGRyOworCisJZW51bSBxdWV1ZV9kaXJlY3Rpb24gZGlyZWN0aW9uOworCWVudW0gZW5hX2FkbWluX3BsYWNlbWVudF9wb2xpY3lfdHlwZSBtZW1fcXVldWVfdHlwZTsKKworCXUzMiBtc2l4X3ZlY3RvcjsKKwlzdHJ1Y3QgZW5hX2NvbV90eF9tZXRhIGNhY2hlZF90eF9tZXRhOworCisJdTE2IHFfZGVwdGg7CisJdTE2IHFpZDsKKworCXUxNiBpZHg7CisJdTE2IHRhaWw7CisJdTE2IG5leHRfdG9fY29tcDsKKwl1MzIgdHhfbWF4X2hlYWRlcl9zaXplOworCXU4IHBoYXNlOworCXU4IGRlc2NfZW50cnlfc2l6ZTsKKwl1OCBkbWFfYWRkcl9iaXRzOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3N0cnVjdCBlbmFfY29tX2FkbWluX2NxIHsKKwlzdHJ1Y3QgZW5hX2FkbWluX2FjcV9lbnRyeSAqZW50cmllczsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCisJdTE2IGhlYWQ7CisJdTggcGhhc2U7Cit9OworCitzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9zcSB7CisJc3RydWN0IGVuYV9hZG1pbl9hcV9lbnRyeSAqZW50cmllczsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCisJdTMyIF9faW9tZW0gKmRiX2FkZHI7CisKKwl1MTYgaGVhZDsKKwl1MTYgdGFpbDsKKwl1OCBwaGFzZTsKKworfTsKKworc3RydWN0IGVuYV9jb21fc3RhdHNfYWRtaW4geworCXUzMiBhYm9ydGVkX2NtZDsKKwl1MzIgc3VibWl0dGVkX2NtZDsKKwl1MzIgY29tcGxldGVkX2NtZDsKKwl1MzIgb3V0X29mX3NwYWNlOworCXUzMiBub19jb21wbGV0aW9uOworfTsKKworc3RydWN0IGVuYV9jb21fYWRtaW5fcXVldWUgeworCXZvaWQgKnFfZG1hZGV2OworCXNwaW5sb2NrX3QgcV9sb2NrOyAvKiBzcGlubG9jayBmb3IgdGhlIGFkbWluIHF1ZXVlICovCisJc3RydWN0IGVuYV9jb21wX2N0eCAqY29tcF9jdHg7CisJdTE2IHFfZGVwdGg7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fY3EgY3E7CisJc3RydWN0IGVuYV9jb21fYWRtaW5fc3Egc3E7CisKKwkvKiBJbmRpY2F0ZSBpZiB0aGUgYWRtaW4gcXVldWUgc2hvdWxkIHBvbGwgZm9yIGNvbXBsZXRpb24gKi8KKwlib29sIHBvbGxpbmc7CisKKwl1MTYgY3Vycl9jbWRfaWQ7CisKKwkvKiBJbmRpY2F0ZSB0aGF0IHRoZSBlbmEgd2FzIGluaXRpYWxpemVkIGFuZCBjYW4KKwkgKiBwcm9jZXNzIG5ldyBhZG1pbiBjb21tYW5kcworCSAqLworCWJvb2wgcnVubmluZ19zdGF0ZTsKKworCS8qIENvdW50IHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgYWRtaW4gY29tbWFuZHMgKi8KKwlhdG9taWNfdCBvdXRzdGFuZGluZ19jbWRzOworCisJc3RydWN0IGVuYV9jb21fc3RhdHNfYWRtaW4gc3RhdHM7Cit9OworCitzdHJ1Y3QgZW5hX2FlbnFfaGFuZGxlcnM7CisKK3N0cnVjdCBlbmFfY29tX2FlbnEgeworCXUxNiBoZWFkOworCXU4IHBoYXNlOworCXN0cnVjdCBlbmFfYWRtaW5fYWVucV9lbnRyeSAqZW50cmllczsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCXUxNiBxX2RlcHRoOworCXN0cnVjdCBlbmFfYWVucV9oYW5kbGVycyAqYWVucV9oYW5kbGVyczsKK307CisKK3N0cnVjdCBlbmFfY29tX21taW9fcmVhZCB7CisJc3RydWN0IGVuYV9hZG1pbl9lbmFfbW1pb19yZXFfcmVhZF9sZXNzX3Jlc3AgKnJlYWRfcmVzcDsKKwlkbWFfYWRkcl90IHJlYWRfcmVzcF9kbWFfYWRkcjsKKwl1MTYgc2VxX251bTsKKwlib29sIHJlYWRsZXNzX3N1cHBvcnRlZDsKKwkvKiBzcGluIGxvY2sgdG8gZW5zdXJlIGEgc2luZ2xlIG91dHN0YW5kaW5nIHJlYWQgKi8KKwlzcGlubG9ja190IGxvY2s7Cit9OworCitzdHJ1Y3QgZW5hX3JzcyB7CisJLyogSW5kaXJlY3QgdGFibGUgKi8KKwl1MTYgKmhvc3RfcnNzX2luZF90Ymw7CisJc3RydWN0IGVuYV9hZG1pbl9yc3NfaW5kX3RhYmxlX2VudHJ5ICpyc3NfaW5kX3RibDsKKwlkbWFfYWRkcl90IHJzc19pbmRfdGJsX2RtYV9hZGRyOworCXUxNiB0YmxfbG9nX3NpemU7CisKKwkvKiBIYXNoIGtleSAqLworCWVudW0gZW5hX2FkbWluX2hhc2hfZnVuY3Rpb25zIGhhc2hfZnVuYzsKKwlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfcnNzX2Zsb3dfaGFzaF9jb250cm9sICpoYXNoX2tleTsKKwlkbWFfYWRkcl90IGhhc2hfa2V5X2RtYV9hZGRyOworCXUzMiBoYXNoX2luaXRfdmFsOworCisJLyogRmxvdyBDb250cm9sICovCisJc3RydWN0IGVuYV9hZG1pbl9mZWF0dXJlX3Jzc19oYXNoX2NvbnRyb2wgKmhhc2hfY3RybDsKKwlkbWFfYWRkcl90IGhhc2hfY3RybF9kbWFfYWRkcjsKKworfTsKKworc3RydWN0IGVuYV9ob3N0X2F0dHJpYnV0ZSB7CisJLyogRGVidWcgYXJlYSAqLworCXU4ICpkZWJ1Z19hcmVhX3ZpcnRfYWRkcjsKKwlkbWFfYWRkcl90IGRlYnVnX2FyZWFfZG1hX2FkZHI7CisJdTMyIGRlYnVnX2FyZWFfc2l6ZTsKKworCS8qIEhvc3QgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgZW5hX2FkbWluX2hvc3RfaW5mbyAqaG9zdF9pbmZvOworCWRtYV9hZGRyX3QgaG9zdF9pbmZvX2RtYV9hZGRyOworfTsKKworLyogRWFjaCBlbmFfZGV2IGlzIGEgUENJIGZ1bmN0aW9uLiAqLworc3RydWN0IGVuYV9jb21fZGV2IHsKKwlzdHJ1Y3QgZW5hX2NvbV9hZG1pbl9xdWV1ZSBhZG1pbl9xdWV1ZTsKKwlzdHJ1Y3QgZW5hX2NvbV9hZW5xIGFlbnE7CisJc3RydWN0IGVuYV9jb21faW9fY3EgaW9fY3FfcXVldWVzW0VOQV9UT1RBTF9OVU1fUVVFVUVTXTsKKwlzdHJ1Y3QgZW5hX2NvbV9pb19zcSBpb19zcV9xdWV1ZXNbRU5BX1RPVEFMX05VTV9RVUVVRVNdOworCXU4IF9faW9tZW0gKnJlZ19iYXI7CisJdm9pZCBfX2lvbWVtICptZW1fYmFyOworCXZvaWQgKmRtYWRldjsKKworCWVudW0gZW5hX2FkbWluX3BsYWNlbWVudF9wb2xpY3lfdHlwZSB0eF9tZW1fcXVldWVfdHlwZTsKKwl1MzIgdHhfbWF4X2hlYWRlcl9zaXplOworCXUxNiBzdGF0c19mdW5jOyAvKiBTZWxlY3RlZCBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgc3RhdGlzdGljIGR1bXAgKi8KKwl1MTYgc3RhdHNfcXVldWU7IC8qIFNlbGVjdGVkIHF1ZXVlIGZvciBleHRlbmRlZCBzdGF0aXN0aWMgZHVtcCAqLworCisJc3RydWN0IGVuYV9jb21fbW1pb19yZWFkIG1taW9fcmVhZDsKKworCXN0cnVjdCBlbmFfcnNzIHJzczsKKwl1MzIgc3VwcG9ydGVkX2ZlYXR1cmVzOworCXUzMiBkbWFfYWRkcl9iaXRzOworCisJc3RydWN0IGVuYV9ob3N0X2F0dHJpYnV0ZSBob3N0X2F0dHI7CisJYm9vbCBhZGFwdGl2ZV9jb2FsZXNjaW5nOworCXUxNiBpbnRyX2RlbGF5X3Jlc29sdXRpb247CisJdTMyIGludHJfbW9kZXJfdHhfaW50ZXJ2YWw7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICppbnRyX21vZGVyX3RibDsKK307CisKK3N0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4IHsKKwlzdHJ1Y3QgZW5hX2FkbWluX3F1ZXVlX2ZlYXR1cmVfZGVzYyBtYXhfcXVldWVzOworCXN0cnVjdCBlbmFfYWRtaW5fZGV2aWNlX2F0dHJfZmVhdHVyZV9kZXNjIGRldl9hdHRyOworCXN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9hZW5xX2Rlc2MgYWVucTsKKwlzdHJ1Y3QgZW5hX2FkbWluX2ZlYXR1cmVfb2ZmbG9hZF9kZXNjIG9mZmxvYWQ7Cit9OworCitzdHJ1Y3QgZW5hX2NvbV9jcmVhdGVfaW9fY3R4IHsKKwllbnVtIGVuYV9hZG1pbl9wbGFjZW1lbnRfcG9saWN5X3R5cGUgbWVtX3F1ZXVlX3R5cGU7CisJZW51bSBxdWV1ZV9kaXJlY3Rpb24gZGlyZWN0aW9uOworCWludCBudW1hX25vZGU7CisJdTMyIG1zaXhfdmVjdG9yOworCXUxNiBxdWV1ZV9zaXplOworCXUxNiBxaWQ7Cit9OworCit0eXBlZGVmIHZvaWQgKCplbmFfYWVucV9oYW5kbGVyKSh2b2lkICpkYXRhLAorCXN0cnVjdCBlbmFfYWRtaW5fYWVucV9lbnRyeSAqYWVucV9lKTsKKworLyogSG9sZHMgYWVucSBoYW5kbGVycy4gSW5kZXhlZCBieSBBRU5RIGV2ZW50IGdyb3VwICovCitzdHJ1Y3QgZW5hX2FlbnFfaGFuZGxlcnMgeworCWVuYV9hZW5xX2hhbmRsZXIgaGFuZGxlcnNbRU5BX01BWF9IQU5ETEVSU107CisJZW5hX2FlbnFfaGFuZGxlciB1bmltcGxlbWVudGVkX2hhbmRsZXI7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X2luaXQgLSBJbml0IHRoZSBtbWlvIHJlZyByZWFkIG1lY2hhbmlzbQorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEluaXRpYWxpemUgdGhlIHJlZ2lzdGVyIHJlYWQgbWVjaGFuaXNtLgorICoKKyAqIEBub3RlOiBUaGlzIG1ldGhvZCBtdXN0IGJlIHRoZSBmaXJzdCBzdGFnZSBpbiB0aGUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UuCisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IGVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X2luaXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9zZXRfbW1pb19yZWFkX21vZGUgLSBFbmFibGUvZGlzYWJsZSB0aGUgbW1pbyByZWcgcmVhZCBtZWNoYW5pc20KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEByZWFkbGVzc19zdXBwb3J0ZWQ6IHJlYWRsZXNzIG1vZGUgKGVuYWJsZS9kaXNhYmxlKQorICovCit2b2lkIGVuYV9jb21fc2V0X21taW9fcmVhZF9tb2RlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQlib29sIHJlYWRsZXNzX3N1cHBvcnRlZCk7CisKKy8qIGVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X3dyaXRlX2Rldl9hZGRyIC0gV3JpdGUgdGhlIG1taW8gcmVnIHJlYWQgcmV0dXJuCisgKiB2YWx1ZSBwaHlzaWNhbCBhZGRyZXNzLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICovCit2b2lkIGVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X3dyaXRlX2Rldl9hZGRyKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X2Rlc3Ryb3kgLSBEZXN0cm95IHRoZSBtbWlvIHJlZyByZWFkIG1lY2hhbmlzbQorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICovCit2b2lkIGVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X2Rlc3Ryb3koc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9hZG1pbl9pbml0IC0gSW5pdCB0aGUgYWRtaW4gYW5kIHRoZSBhc3luYyBxdWV1ZXMKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBhZW5xX2hhbmRsZXJzOiBUaG9zZSBoYW5kbGVycyB0byBiZSBjYWxsZWQgdXBvbiBldmVudC4KKyAqIEBpbml0X3NwaW5sb2NrOiBJbmRpY2F0ZSBpZiB0aGlzIG1ldGhvZCBzaG91bGQgaW5pdCB0aGUgYWRtaW4gc3BpbmxvY2sgb3IKKyAqIHRoZSBzcGlubG9jayB3YXMgaW5pdCBiZWZvcmUgKGZvciBleGFtcGxlLCBpbiBhIGNhc2Ugb2YgRkxSKS4KKyAqCisgKiBJbml0aWFsaXplIHRoZSBhZG1pbiBzdWJtaXNzaW9uIGFuZCBjb21wbGV0aW9uIHF1ZXVlcy4KKyAqIEluaXRpYWxpemUgdGhlIGFzeW5jaHJvbm91cyBldmVudHMgbm90aWZpY2F0aW9uIHF1ZXVlcy4KKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgZW5hX2NvbV9hZG1pbl9pbml0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJICAgICAgIHN0cnVjdCBlbmFfYWVucV9oYW5kbGVycyAqYWVucV9oYW5kbGVycywKKwkJICAgICAgIGJvb2wgaW5pdF9zcGlubG9jayk7CisKKy8qIGVuYV9jb21fYWRtaW5fZGVzdHJveSAtIERlc3Ryb3kgdGhlIGFkbWluIGFuZCB0aGUgYXN5bmMgZXZlbnRzIHF1ZXVlcy4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBAbm90ZTogQmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSBjYWxsZXIgbXVzdCB2YWxpZGF0ZSB0aGF0IHRoZSBkZXZpY2UKKyAqIHdvbid0IHNlbmQgYW55IGFkZGl0aW9uYWwgYWRtaW4gY29tcGxldGlvbnMvYWVucS4KKyAqIFRvIGFjaGlldmUgdGhhdCwgYSBGTFIgaXMgcmVjb21tZW5kZWQuCisgKi8KK3ZvaWQgZW5hX2NvbV9hZG1pbl9kZXN0cm95KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fZGV2X3Jlc2V0IC0gUGVyZm9ybSBkZXZpY2UgRkxSIHRvIHRoZSBkZXZpY2UuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IGVuYV9jb21fZGV2X3Jlc2V0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fY3JlYXRlX2lvX3F1ZXVlIC0gQ3JlYXRlIGlvIHF1ZXVlLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGN0eCAtIGNyZWF0ZSBjb250ZXh0IHN0cnVjdHVyZQorICoKKyAqIENyZWF0ZSB0aGUgc3VibWlzc2lvbiBhbmQgdGhlIGNvbXBsZXRpb24gcXVldWVzLgorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBlbmFfY29tX2NyZWF0ZV9pb19xdWV1ZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgc3RydWN0IGVuYV9jb21fY3JlYXRlX2lvX2N0eCAqY3R4KTsKKworLyogZW5hX2NvbV9kZXN0cm95X2lvX3F1ZXVlIC0gRGVzdHJveSBJTyBxdWV1ZSB3aXRoIHRoZSBxdWV1ZSBpZCAtIHFpZC4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBxaWQgLSB0aGUgY2FsbGVyIHZpcnR1YWwgcXVldWUgaWQuCisgKi8KK3ZvaWQgZW5hX2NvbV9kZXN0cm95X2lvX3F1ZXVlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTE2IHFpZCk7CisKKy8qIGVuYV9jb21fZ2V0X2lvX2hhbmRsZXJzIC0gUmV0dXJuIHRoZSBpbyBxdWV1ZSBoYW5kbGVycworICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQHFpZCAtIHRoZSBjYWxsZXIgdmlydHVhbCBxdWV1ZSBpZC4KKyAqIEBpb19zcSAtIElPIHN1Ym1pc3Npb24gcXVldWUgaGFuZGxlcgorICogQGlvX2NxIC0gSU8gY29tcGxldGlvbiBxdWV1ZSBoYW5kbGVyLgorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBlbmFfY29tX2dldF9pb19oYW5kbGVycyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUxNiBxaWQsCisJCQkgICAgc3RydWN0IGVuYV9jb21faW9fc3EgKippb19zcSwKKwkJCSAgICBzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqKmlvX2NxKTsKKworLyogZW5hX2NvbV9hZG1pbl9hZW5xX2VuYWJsZSAtIEVOQWJsZSBhc3luY2hyb25vdXMgZXZlbnQgbm90aWZpY2F0aW9ucworICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEFmdGVyIHRoaXMgbWV0aG9kLCBhZW5xIGV2ZW50IGNhbiBiZSByZWNlaXZlZCB2aWEgQUVOUS4KKyAqLwordm9pZCBlbmFfY29tX2FkbWluX2FlbnFfZW5hYmxlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fc2V0X2FkbWluX3J1bm5pbmdfc3RhdGUgLSBTZXQgdGhlIHN0YXRlIG9mIHRoZSBhZG1pbiBxdWV1ZQorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIENoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGFkbWluIHF1ZXVlIChlbmFibGUvZGlzYWJsZSkKKyAqLwordm9pZCBlbmFfY29tX3NldF9hZG1pbl9ydW5uaW5nX3N0YXRlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgYm9vbCBzdGF0ZSk7CisKKy8qIGVuYV9jb21fZ2V0X2FkbWluX3J1bm5pbmdfc3RhdGUgLSBHZXQgdGhlIGFkbWluIHF1ZXVlIHN0YXRlCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogUmV0cmlldmUgdGhlIHN0YXRlIG9mIHRoZSBhZG1pbiBxdWV1ZSAoZW5hYmxlL2Rpc2FibGUpCisgKgorICogQHJldHVybiAtIGN1cnJlbnQgcG9sbGluZyBtb2RlIChlbmFibGUvZGlzYWJsZSkKKyAqLworYm9vbCBlbmFfY29tX2dldF9hZG1pbl9ydW5uaW5nX3N0YXRlKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fc2V0X2FkbWluX3BvbGxpbmdfbW9kZSAtIFNldCB0aGUgYWRtaW4gY29tcGxldGlvbiBxdWV1ZSBwb2xsaW5nIG1vZGUKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBwb2xsaW5nOiBFTkFibGUvRGlzYWJsZSBwb2xsaW5nIG1vZGUKKyAqCisgKiBTZXQgdGhlIGFkbWluIGNvbXBsZXRpb24gbW9kZS4KKyAqLwordm9pZCBlbmFfY29tX3NldF9hZG1pbl9wb2xsaW5nX21vZGUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCBib29sIHBvbGxpbmcpOworCisvKiBlbmFfY29tX3NldF9hZG1pbl9wb2xsaW5nX21vZGUgLSBHZXQgdGhlIGFkbWluIGNvbXBsZXRpb24gcXVldWUgcG9sbGluZyBtb2RlCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogR2V0IHRoZSBhZG1pbiBjb21wbGV0aW9uIG1vZGUuCisgKiBJZiBwb2xsaW5nIG1vZGUgaXMgb24sIGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kIHdpbGwgcGVyZm9ybSBhCisgKiBwb2xsaW5nIG9uIHRoZSBhZG1pbiBjb21wbGV0aW9uIHF1ZXVlIGZvciB0aGUgY29tbWFuZHMgY29tcGxldGlvbiwKKyAqIG90aGVyd2lzZSBpdCB3aWxsIHdhaXQgb24gd2FpdCBldmVudC4KKyAqCisgKiBAcmV0dXJuIHN0YXRlCisgKi8KK2Jvb2wgZW5hX2NvbV9nZXRfZW5hX2FkbWluX3BvbGxpbmdfbW9kZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2FkbWluX3FfY29tcF9pbnRyX2hhbmRsZXIgLSBhZG1pbiBxdWV1ZSBpbnRlcnJ1cHQgaGFuZGxlcgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIFRoaXMgbWV0aG9kIGdvIG92ZXIgdGhlIGFkbWluIGNvbXBsZXRpb24gcXVldWUgYW5kIHdha2UgdXAgYWxsIHRoZSBwZW5kaW5nCisgKiB0aHJlYWRzIHRoYXQgd2FpdCBvbiB0aGUgY29tbWFuZHMgd2FpdCBldmVudC4KKyAqCisgKiBAbm90ZTogU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBNU0ktWCBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgZW5hX2NvbV9hZG1pbl9xX2NvbXBfaW50cl9oYW5kbGVyKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fYWVucV9pbnRyX2hhbmRsZXIgLSBBRU5RIGludGVycnVwdCBoYW5kbGVyCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogVGhpcyBtZXRob2QgZ28gb3ZlciB0aGUgYXN5bmMgZXZlbnQgbm90aWZpY2F0aW9uIHF1ZXVlIGFuZCBjYWxsIHRoZSBwcm9wZXIKKyAqIGFlbnEgaGFuZGxlci4KKyAqLwordm9pZCBlbmFfY29tX2FlbnFfaW50cl9oYW5kbGVyKHN0cnVjdCBlbmFfY29tX2RldiAqZGV2LCB2b2lkICpkYXRhKTsKKworLyogZW5hX2NvbV9hYm9ydF9hZG1pbl9jb21tYW5kcyAtIEFib3J0IGFsbCB0aGUgb3V0c3RhbmRpbmcgYWRtaW4gY29tbWFuZHMuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogVGhpcyBtZXRob2QgYWJvcnRzIGFsbCB0aGUgb3V0c3RhbmRpbmcgYWRtaW4gY29tbWFuZHMuCisgKiBUaGUgY2FsbGVyIHNob3VsZCB0aGVuIGNhbGwgZW5hX2NvbV93YWl0X2Zvcl9hYm9ydF9jb21wbGV0aW9uIHRvIG1ha2Ugc3VyZQorICogYWxsIHRoZSBjb21tYW5kcyB3ZXJlIGNvbXBsZXRlZC4KKyAqLwordm9pZCBlbmFfY29tX2Fib3J0X2FkbWluX2NvbW1hbmRzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fd2FpdF9mb3JfYWJvcnRfY29tcGxldGlvbiAtIFdhaXQgZm9yIGFkbWluIGNvbW1hbmRzIGFib3J0LgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIFRoaXMgbWV0aG9kIHdhaXQgdW50aWwgYWxsIHRoZSBvdXRzdGFuZGluZyBhZG1pbiBjb21tYW5kcyB3aWxsIGJlIGNvbXBsZXRlZC4KKyAqLwordm9pZCBlbmFfY29tX3dhaXRfZm9yX2Fib3J0X2NvbXBsZXRpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV92YWxpZGF0ZV92ZXJzaW9uIC0gVmFsaWRhdGUgdGhlIGRldmljZSBwYXJhbWV0ZXJzCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogVGhpcyBtZXRob2QgdmFsaWRhdGUgdGhlIGRldmljZSBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyB0aGUgc2F2ZWQKKyAqIHBhcmFtZXRlcnMgaW4gZW5hX2Rldi4KKyAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBhZnRlciBkZXZpY2UgcmVzZXQsIHRvIHZhbGlkYXRlIHRoZSBkZXZpY2UgbWFjIGFkZHJlc3MKKyAqIGFuZCB0aGUgZGV2aWNlIG9mZmxvYWRzIGFyZSB0aGUgc2FtZSBhcyBiZWZvcmUgdGhlIHJlc2V0LgorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV92YWxpZGF0ZV92ZXJzaW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fZ2V0X2xpbmtfcGFyYW1zIC0gUmV0cmlldmUgcGh5c2ljYWwgbGluayBwYXJhbWV0ZXJzLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQHJlc3A6IExpbmsgcGFyYW1ldGVycworICoKKyAqIFJldHJpZXZlIHRoZSBwaHlzaWNhbCBsaW5rIHBhcmFtZXRlcnMsCisgKiBsaWtlIHNwZWVkLCBhdXRvLW5lZ290aWF0aW9uIGFuZCBmdWxsIGR1cGxleCBzdXBwb3J0LgorICoKKyAqIEByZXR1cm4gLSAwIG9uIFN1Y2Nlc3MgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9nZXRfbGlua19wYXJhbXMoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgIHN0cnVjdCBlbmFfYWRtaW5fZ2V0X2ZlYXRfcmVzcCAqcmVzcCk7CisKKy8qIGVuYV9jb21fZ2V0X2RtYV93aWR0aCAtIFJldHJpZXZlIHBoeXNpY2FsIGRtYSBhZGRyZXNzIHdpZHRoIHRoZSBkZXZpY2UKKyAqIHN1cHBvcnRzLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIFJldHJpZXZlIHRoZSBtYXhpbXVtIHBoeXNpY2FsIGFkZHJlc3MgYml0cyB0aGUgZGV2aWNlIGNhbiBoYW5kbGUuCisgKgorICogQHJldHVybjogPiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fZ2V0X2RtYV93aWR0aChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX3NldF9hZW5xX2NvbmZpZyAtIFNldCBhZW5xIGdyb3VwcyBjb25maWd1cmF0aW9ucworICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGdyb3VwcyBmbGFnOiBiaXQgZmllbGRzIGZsYWdzIG9mIGVudW0gZW5hX2FkbWluX2FlbnFfZ3JvdXAuCisgKgorICogQ29uZmlndXJlIHdoaWNoIGFlbnEgZXZlbnQgZ3JvdXAgdGhlIGRyaXZlciB3b3VsZCBsaWtlIHRvIHJlY2VpdmUuCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX3NldF9hZW5xX2NvbmZpZyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsIHUzMiBncm91cHNfZmxhZyk7CisKKy8qIGVuYV9jb21fZ2V0X2Rldl9hdHRyX2ZlYXQgLSBHZXQgZGV2aWNlIGZlYXR1cmVzCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAZ2V0X2ZlYXRfY3R4OiByZXR1cm5lZCBjb250ZXh0IHRoYXQgY29udGFpbiB0aGUgZ2V0IGZlYXR1cmVzLgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9nZXRfZGV2X2F0dHJfZmVhdChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgICBzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCAqZ2V0X2ZlYXRfY3R4KTsKKworLyogZW5hX2NvbV9nZXRfZGV2X2Jhc2ljX3N0YXRzIC0gR2V0IGRldmljZSBiYXNpYyBzdGF0aXN0aWNzCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAc3RhdHM6IHN0YXRzIHJldHVybiB2YWx1ZQorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9nZXRfZGV2X2Jhc2ljX3N0YXRzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQlzdHJ1Y3QgZW5hX2FkbWluX2Jhc2ljX3N0YXRzICpzdGF0cyk7CisKKy8qIGVuYV9jb21fc2V0X2Rldl9tdHUgLSBDb25maWd1cmUgdGhlIGRldmljZSBtdHUuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAbXR1OiBtdHUgdmFsdWUKKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fc2V0X2Rldl9tdHUoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCBpbnQgbXR1KTsKKworLyogZW5hX2NvbV9nZXRfb2ZmbG9hZF9zZXR0aW5ncyAtIFJldHJpZXZlIHRoZSBkZXZpY2Ugb2ZmbG9hZHMgY2FwYWJpbGl0aWVzCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKiBAb2ZmbGFkOiBvZmZsb2FkIHJldHVybiB2YWx1ZQorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9nZXRfb2ZmbG9hZF9zZXR0aW5ncyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJIHN0cnVjdCBlbmFfYWRtaW5fZmVhdHVyZV9vZmZsb2FkX2Rlc2MgKm9mZmxvYWQpOworCisvKiBlbmFfY29tX3Jzc19pbml0IC0gSW5pdCBSU1MKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBsb2dfc2l6ZTogaW5kaXJlY3Rpb24gbG9nIHNpemUKKyAqCisgKiBBbGxvY2F0ZSBSU1MvUkZTIHJlc291cmNlcy4KKyAqIFRoZSBjYWxsZXIgdGhlbiBjYW4gY29uZmlndXJlIHJzcyB1c2luZyBlbmFfY29tX3NldF9oYXNoX2Z1bmN0aW9uLAorICogZW5hX2NvbV9zZXRfaGFzaF9jdHJsIGFuZCBlbmFfY29tX2luZGlyZWN0X3RhYmxlX3NldC4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fcnNzX2luaXQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LCB1MTYgbG9nX3NpemUpOworCisvKiBlbmFfY29tX3Jzc19kZXN0cm95IC0gRGVzdHJveSByc3MKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBGcmVlIGFsbCB0aGUgUlNTL1JGUyByZXNvdXJjZXMuCisgKi8KK3ZvaWQgZW5hX2NvbV9yc3NfZGVzdHJveShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2ZpbGxfaGFzaF9mdW5jdGlvbiAtIEZpbGwgUlNTIGhhc2ggZnVuY3Rpb24KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBmdW5jOiBUaGUgaGFzaCBmdW5jdGlvbiAoVG9lcGxpdHogb3IgY3JjKQorICogQGtleTogSGFzaCBrZXkgKGZvciB0b2VwbGl0eiBoYXNoKQorICogQGtleV9sZW46IGtleSBsZW5ndGggKG1heCBsZW5ndGggMTAgRFcpCisgKiBAaW5pdF92YWw6IGluaXRpYWwgdmFsdWUgZm9yIHRoZSBoYXNoIGZ1bmN0aW9uCisgKgorICogRmlsbCB0aGUgZW5hX2RldiByZXNvdXJjZXMgd2l0aCB0aGUgZGVzaXJlIGhhc2ggZnVuY3Rpb24sIGhhc2gga2V5LCBrZXlfbGVuCisgKiBhbmQga2V5IGluaXRpYWwgdmFsdWUgKGlmIG5lZWRlZCBieSB0aGUgaGFzaCBmdW5jdGlvbikuCisgKiBUbyBmbHVzaCB0aGUga2V5IGludG8gdGhlIGRldmljZSB0aGUgY2FsbGVyIHNob3VsZCBjYWxsCisgKiBlbmFfY29tX3NldF9oYXNoX2Z1bmN0aW9uLgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9maWxsX2hhc2hfZnVuY3Rpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICAgIGVudW0gZW5hX2FkbWluX2hhc2hfZnVuY3Rpb25zIGZ1bmMsCisJCQkgICAgICAgY29uc3QgdTggKmtleSwgdTE2IGtleV9sZW4sIHUzMiBpbml0X3ZhbCk7CisKKy8qIGVuYV9jb21fc2V0X2hhc2hfZnVuY3Rpb24gLSBGbHVzaCB0aGUgaGFzaCBmdW5jdGlvbiBhbmQgaXQgZGVwZW5kZW5jaWVzIHRvCisgKiB0aGUgZGV2aWNlLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEZsdXNoIHRoZSBoYXNoIGZ1bmN0aW9uIGFuZCBpdCBkZXBlbmRlbmNpZXMgKGtleSwga2V5IGxlbmd0aCBhbmQKKyAqIGluaXRpYWwgdmFsdWUpIGlmIG5lZWRlZC4KKyAqCisgKiBAbm90ZTogUHJpb3IgdG8gdGhpcyBtZXRob2QgdGhlIGNhbGxlciBzaG91bGQgY2FsbCBlbmFfY29tX2ZpbGxfaGFzaF9mdW5jdGlvbgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9zZXRfaGFzaF9mdW5jdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2dldF9oYXNoX2Z1bmN0aW9uIC0gUmV0cmlldmUgdGhlIGhhc2ggZnVuY3Rpb24gYW5kIHRoZSBoYXNoIGtleQorICogZnJvbSB0aGUgZGV2aWNlLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGZ1bmM6IGhhc2ggZnVuY3Rpb24KKyAqIEBrZXk6IGhhc2gga2V5CisgKgorICogUmV0cmlldmUgdGhlIGhhc2ggZnVuY3Rpb24gYW5kIHRoZSBoYXNoIGtleSBmcm9tIHRoZSBkZXZpY2UuCisgKgorICogQG5vdGU6IElmIHRoZSBjYWxsZXIgY2FsbGVkIGVuYV9jb21fZmlsbF9oYXNoX2Z1bmN0aW9uIGJ1dCBkaWRuJ3QgZmxhc2gKKyAqIGl0IHRvIHRoZSBkZXZpY2UsIHRoZSBuZXcgY29uZmlndXJhdGlvbiB3aWxsIGJlIGxvc3QuCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2dldF9oYXNoX2Z1bmN0aW9uKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgIGVudW0gZW5hX2FkbWluX2hhc2hfZnVuY3Rpb25zICpmdW5jLAorCQkJICAgICAgdTggKmtleSk7CisKKy8qIGVuYV9jb21fZmlsbF9oYXNoX2N0cmwgLSBGaWxsIFJTUyBoYXNoIGNvbnRyb2wKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QuCisgKiBAcHJvdG86IFRoZSBwcm90b2NvbCB0byBjb25maWd1cmUuCisgKiBAaGFzaF9maWVsZHM6IGJpdCBtYXNrIG9mIGVuYV9hZG1pbl9mbG93X2hhc2hfZmllbGRzCisgKgorICogRmlsbCB0aGUgZW5hX2RldiByZXNvdXJjZXMgd2l0aCB0aGUgZGVzaXJlIGhhc2ggY29udHJvbCAodGhlIGV0aGVybmV0CisgKiBmaWVsZHMgdGhhdCB0YWtlIHBhcnQgb2YgdGhlIGhhc2gpIGZvciBhIHNwZWNpZmljIHByb3RvY29sLgorICogVG8gZmx1c2ggdGhlIGhhc2ggY29udHJvbCB0byB0aGUgZGV2aWNlLCB0aGUgY2FsbGVyIHNob3VsZCBjYWxsCisgKiBlbmFfY29tX3NldF9oYXNoX2N0cmwuCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2ZpbGxfaGFzaF9jdHJsKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgIGVudW0gZW5hX2FkbWluX2Zsb3dfaGFzaF9wcm90byBwcm90bywKKwkJCSAgIHUxNiBoYXNoX2ZpZWxkcyk7CisKKy8qIGVuYV9jb21fc2V0X2hhc2hfY3RybCAtIEZsdXNoIHRoZSBoYXNoIGNvbnRyb2wgcmVzb3VyY2VzIHRvIHRoZSBkZXZpY2UuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogRmx1c2ggdGhlIGhhc2ggY29udHJvbCAodGhlIGV0aGVybmV0IGZpZWxkcyB0aGF0IHRha2UgcGFydCBvZiB0aGUgaGFzaCkKKyAqCisgKiBAbm90ZTogUHJpb3IgdG8gdGhpcyBtZXRob2QgdGhlIGNhbGxlciBzaG91bGQgY2FsbCBlbmFfY29tX2ZpbGxfaGFzaF9jdHJsLgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9zZXRfaGFzaF9jdHJsKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fZ2V0X2hhc2hfY3RybCAtIFJldHJpZXZlIHRoZSBoYXNoIGNvbnRyb2wgZnJvbSB0aGUgZGV2aWNlLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQHByb3RvOiBUaGUgcHJvdG9jb2wgdG8gcmV0cmlldmUuCisgKiBAZmllbGRzOiBiaXQgbWFzayBvZiBlbmFfYWRtaW5fZmxvd19oYXNoX2ZpZWxkcy4KKyAqCisgKiBSZXRyaWV2ZSB0aGUgaGFzaCBjb250cm9sIGZyb20gdGhlIGRldmljZS4KKyAqCisgKiBAbm90ZSwgSWYgdGhlIGNhbGxlciBjYWxsZWQgZW5hX2NvbV9maWxsX2hhc2hfY3RybCBidXQgZGlkbid0IGZsYXNoCisgKiBpdCB0byB0aGUgZGV2aWNlLCB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBsb3N0LgorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9nZXRfaGFzaF9jdHJsKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgZW51bSBlbmFfYWRtaW5fZmxvd19oYXNoX3Byb3RvIHByb3RvLAorCQkJICB1MTYgKmZpZWxkcyk7CisKKy8qIGVuYV9jb21fc2V0X2RlZmF1bHRfaGFzaF9jdHJsIC0gU2V0IHRoZSBoYXNoIGNvbnRyb2wgdG8gYSBkZWZhdWx0CisgKiBjb25maWd1cmF0aW9uLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEZpbGwgdGhlIGVuYV9kZXYgcmVzb3VyY2VzIHdpdGggdGhlIGRlZmF1bHQgaGFzaCBjb250cm9sIGNvbmZpZ3VyYXRpb24uCisgKiBUbyBmbHVzaCB0aGUgaGFzaCBjb250cm9sIHRvIHRoZSBkZXZpY2UsIHRoZSBjYWxsZXIgc2hvdWxkIGNhbGwKKyAqIGVuYV9jb21fc2V0X2hhc2hfY3RybC4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fc2V0X2RlZmF1bHRfaGFzaF9jdHJsKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21faW5kaXJlY3RfdGFibGVfZmlsbF9lbnRyeSAtIEZpbGwgYSBzaW5nbGUgZW50cnkgaW4gdGhlIFJTUworICogaW5kaXJlY3Rpb24gdGFibGUKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QuCisgKiBAZW50cnlfaWR4IC0gaW5kaXJlY3Rpb24gdGFibGUgZW50cnkuCisgKiBAZW50cnlfdmFsdWUgLSByZWRpcmVjdGlvbiB2YWx1ZQorICoKKyAqIEZpbGwgYSBzaW5nbGUgZW50cnkgb2YgdGhlIFJTUyBpbmRpcmVjdGlvbiB0YWJsZSBpbiB0aGUgZW5hX2RldiByZXNvdXJjZXMuCisgKiBUbyBmbHVzaCB0aGUgaW5kaXJlY3Rpb24gdGFibGUgdG8gdGhlIGRldmljZSwgdGhlIGNhbGxlZCBzaG91bGQgY2FsbAorICogZW5hX2NvbV9pbmRpcmVjdF90YWJsZV9zZXQuCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2ZpbGxfZW50cnkoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCSAgICAgIHUxNiBlbnRyeV9pZHgsIHUxNiBlbnRyeV92YWx1ZSk7CisKKy8qIGVuYV9jb21faW5kaXJlY3RfdGFibGVfc2V0IC0gRmx1c2ggdGhlIGluZGlyZWN0aW9uIHRhYmxlIHRvIHRoZSBkZXZpY2UuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogRmx1c2ggdGhlIGluZGlyZWN0aW9uIGhhc2ggY29udHJvbCB0byB0aGUgZGV2aWNlLgorICogUHJpb3IgdG8gdGhpcyBtZXRob2QgdGhlIGNhbGxlciBzaG91bGQgY2FsbCBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2ZpbGxfZW50cnkKKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21faW5kaXJlY3RfdGFibGVfc2V0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21faW5kaXJlY3RfdGFibGVfZ2V0IC0gUmV0cmlldmUgdGhlIGluZGlyZWN0aW9uIHRhYmxlIGZyb20gdGhlIGRldmljZS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBpbmRfdGJsOiBpbmRpcmVjdGlvbiB0YWJsZQorICoKKyAqIFJldHJpZXZlIHRoZSBSU1MgaW5kaXJlY3Rpb24gdGFibGUgZnJvbSB0aGUgZGV2aWNlLgorICoKKyAqIEBub3RlOiBJZiB0aGUgY2FsbGVyIGNhbGxlZCBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2ZpbGxfZW50cnkgYnV0IGRpZG4ndCBmbGFzaAorICogaXQgdG8gdGhlIGRldmljZSwgdGhlIG5ldyBjb25maWd1cmF0aW9uIHdpbGwgYmUgbG9zdC4KKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21faW5kaXJlY3RfdGFibGVfZ2V0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwgdTMyICppbmRfdGJsKTsKKworLyogZW5hX2NvbV9hbGxvY2F0ZV9ob3N0X2luZm8gLSBBbGxvY2F0ZSBob3N0IGluZm8gcmVzb3VyY2VzLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEByZXR1cm46IDAgb24gU3VjY2VzcyBhbmQgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNlLgorICovCitpbnQgZW5hX2NvbV9hbGxvY2F0ZV9ob3N0X2luZm8oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9hbGxvY2F0ZV9kZWJ1Z19hcmVhIC0gQWxsb2NhdGUgZGVidWcgYXJlYS4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEBkZWJ1Z19hcmVhX3NpemUgLSBkZWJ1ZyBhcmVhIHNpemUuCisgKgorICogQHJldHVybjogMCBvbiBTdWNjZXNzIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCisgKi8KK2ludCBlbmFfY29tX2FsbG9jYXRlX2RlYnVnX2FyZWEoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJCXUzMiBkZWJ1Z19hcmVhX3NpemUpOworCisvKiBlbmFfY29tX2RlbGV0ZV9kZWJ1Z19hcmVhIC0gRnJlZSB0aGUgZGVidWcgYXJlYSByZXNvdXJjZXMuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogRnJlZSB0aGUgYWxsb2NhdGUgZGVidWcgYXJlYS4KKyAqLwordm9pZCBlbmFfY29tX2RlbGV0ZV9kZWJ1Z19hcmVhKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fZGVsZXRlX2hvc3RfaW5mbyAtIEZyZWUgdGhlIGhvc3QgaW5mbyByZXNvdXJjZXMuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogRnJlZSB0aGUgYWxsb2NhdGUgaG9zdCBpbmZvLgorICovCit2b2lkIGVuYV9jb21fZGVsZXRlX2hvc3RfaW5mbyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX3NldF9ob3N0X2F0dHJpYnV0ZXMgLSBVcGRhdGUgdGhlIGRldmljZSB3aXRoIHRoZSBob3N0CisgKiBhdHRyaWJ1dGVzIChkZWJ1ZyBhcmVhIGFuZCBob3N0IGluZm8pIGJhc2UgYWRkcmVzcy4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqCisgKiBAcmV0dXJuOiAwIG9uIFN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IGVuYV9jb21fc2V0X2hvc3RfYXR0cmlidXRlcyhzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX2NyZWF0ZV9pb19jcSAtIENyZWF0ZSBpbyBjb21wbGV0aW9uIHF1ZXVlLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGlvX2NxIC0gaW8gY29tcGxldGlvbiBxdWV1ZSBoYW5kbGVyCisKKyAqIENyZWF0ZSBJTyBjb21wbGV0aW9uIHF1ZXVlLgorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBlbmFfY29tX2NyZWF0ZV9pb19jcShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxKTsKKworLyogZW5hX2NvbV9kZXN0cm95X2lvX2NxIC0gRGVzdHJveSBpbyBjb21wbGV0aW9uIHF1ZXVlLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGlvX2NxIC0gaW8gY29tcGxldGlvbiBxdWV1ZSBoYW5kbGVyCisKKyAqIERlc3Ryb3kgSU8gY29tcGxldGlvbiBxdWV1ZS4KKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgZW5hX2NvbV9kZXN0cm95X2lvX2NxKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxKTsKKworLyogZW5hX2NvbV9leGVjdXRlX2FkbWluX2NvbW1hbmQgLSBFeGVjdXRlIGFkbWluIGNvbW1hbmQKKyAqIEBhZG1pbl9xdWV1ZTogYWRtaW4gcXVldWUuCisgKiBAY21kOiB0aGUgYWRtaW4gY29tbWFuZCB0byBleGVjdXRlLgorICogQGNtZF9zaXplOiB0aGUgY29tbWFuZCBzaXplLgorICogQGNtZF9jb21wbGV0aW9uOiBjb21tYW5kIGNvbXBsZXRpb24gcmV0dXJuIHZhbHVlLgorICogQGNtZF9jb21wX3NpemU6IGNvbW1hbmQgY29tcGxldGlvbiBzaXplLgorCisgKiBTdWJtaXQgYW4gYWRtaW4gY29tbWFuZCBhbmQgdGhlbiB3YWl0IHVudGlsIHRoZSBkZXZpY2Ugd2lsbCByZXR1cm4gYQorICogY29tcGxldGlvbi4KKyAqIFRoZSBjb21wbGV0aW9uIHdpbGwgYmUgY29weWVkIGludG8gY21kX2NvbXAuCisgKgorICogQHJldHVybiAtIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IGVuYV9jb21fZXhlY3V0ZV9hZG1pbl9jb21tYW5kKHN0cnVjdCBlbmFfY29tX2FkbWluX3F1ZXVlICphZG1pbl9xdWV1ZSwKKwkJCQkgIHN0cnVjdCBlbmFfYWRtaW5fYXFfZW50cnkgKmNtZCwKKwkJCQkgIHNpemVfdCBjbWRfc2l6ZSwKKwkJCQkgIHN0cnVjdCBlbmFfYWRtaW5fYWNxX2VudHJ5ICpjbWRfY29tcCwKKwkJCQkgIHNpemVfdCBjbWRfY29tcF9zaXplKTsKKworLyogZW5hX2NvbV9pbml0X2ludGVycnVwdF9tb2RlcmF0aW9uIC0gSW5pdCBpbnRlcnJ1cHQgbW9kZXJhdGlvbgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEByZXR1cm4gLSAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBlbmFfY29tX2luaXRfaW50ZXJydXB0X21vZGVyYXRpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9kZXN0cm95X2ludGVycnVwdF9tb2RlcmF0aW9uIC0gRGVzdHJveSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiByZXNvdXJjZXMKKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqLwordm9pZCBlbmFfY29tX2Rlc3Ryb3lfaW50ZXJydXB0X21vZGVyYXRpb24oc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9pbnRlcnJ1cHRfbW9kZXJhdGlvbl9zdXBwb3J0ZWQgLSBSZXR1cm4gaWYgaW50ZXJydXB0IG1vZGVyYXRpb24KKyAqIGNhcGFiaWxpdHkgaXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuCisgKgorICogQHJldHVybiAtIHN1cHBvcnRlZCBvciBub3QuCisgKi8KK2Jvb2wgZW5hX2NvbV9pbnRlcnJ1cHRfbW9kZXJhdGlvbl9zdXBwb3J0ZWQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9jb25maWdfZGVmYXVsdF9pbnRlcnJ1cHRfbW9kZXJhdGlvbl90YWJsZSAtIFJlc3RvcmUgdGhlIGludGVycnVwdAorICogbW9kZXJhdGlvbiB0YWJsZSBiYWNrIHRvIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKi8KK3ZvaWQgZW5hX2NvbV9jb25maWdfZGVmYXVsdF9pbnRlcnJ1cHRfbW9kZXJhdGlvbl90YWJsZShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpOworCisvKiBlbmFfY29tX3VwZGF0ZV9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3R4IC0gVXBkYXRlIHRoZQorICogbm9uLWFkYXB0aXZlIGludGVydmFsIGluIFR4IGRpcmVjdGlvbi4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEB0eF9jb2FsZXNjZV91c2VjczogSW50ZXJ2YWwgaW4gdXNlYy4KKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgZW5hX2NvbV91cGRhdGVfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF90eChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJCQkgICAgICB1MzIgdHhfY29hbGVzY2VfdXNlY3MpOworCisvKiBlbmFfY29tX3VwZGF0ZV9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3J4IC0gVXBkYXRlIHRoZQorICogbm9uLWFkYXB0aXZlIGludGVydmFsIGluIFJ4IGRpcmVjdGlvbi4KKyAqIEBlbmFfZGV2OiBFTkEgY29tbXVuaWNhdGlvbiBsYXllciBzdHJ1Y3QKKyAqIEByeF9jb2FsZXNjZV91c2VjczogSW50ZXJ2YWwgaW4gdXNlYy4KKyAqCisgKiBAcmV0dXJuIC0gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgZW5hX2NvbV91cGRhdGVfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF9yeChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJCQkgICAgICB1MzIgcnhfY29hbGVzY2VfdXNlY3MpOworCisvKiBlbmFfY29tX2dldF9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3R4IC0gUmV0cmlldmUgdGhlCisgKiBub24tYWRhcHRpdmUgaW50ZXJ2YWwgaW4gVHggZGlyZWN0aW9uLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICoKKyAqIEByZXR1cm4gLSBpbnRlcnZhbCBpbiB1c2VjCisgKi8KK3Vuc2lnbmVkIGludCBlbmFfY29tX2dldF9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3R4KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldik7CisKKy8qIGVuYV9jb21fZ2V0X25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfcnggLSBSZXRyaWV2ZSB0aGUKKyAqIG5vbi1hZGFwdGl2ZSBpbnRlcnZhbCBpbiBSeCBkaXJlY3Rpb24uCisgKiBAZW5hX2RldjogRU5BIGNvbW11bmljYXRpb24gbGF5ZXIgc3RydWN0CisgKgorICogQHJldHVybiAtIGludGVydmFsIGluIHVzZWMKKyAqLwordW5zaWduZWQgaW50IGVuYV9jb21fZ2V0X25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfcngoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KTsKKworLyogZW5hX2NvbV9pbml0X2ludHJfbW9kZXJhdGlvbl9lbnRyeSAtIFVwZGF0ZSBhIHNpbmdsZSBlbnRyeSBpbiB0aGUgaW50ZXJydXB0CisgKiBtb2RlcmF0aW9uIHRhYmxlLgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGxldmVsOiBJbnRlcnJ1cHQgbW9kZXJhdGlvbiB0YWJsZSBsZXZlbAorICogQGVudHJ5OiBFbnRyeSB2YWx1ZQorICoKKyAqIFVwZGF0ZSBhIHNpbmdsZSBlbnRyeSBpbiB0aGUgaW50ZXJydXB0IG1vZGVyYXRpb24gdGFibGUuCisgKi8KK3ZvaWQgZW5hX2NvbV9pbml0X2ludHJfbW9kZXJhdGlvbl9lbnRyeShzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJCWVudW0gZW5hX2ludHJfbW9kZXJfbGV2ZWwgbGV2ZWwsCisJCQkJCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqZW50cnkpOworCisvKiBlbmFfY29tX2dldF9pbnRyX21vZGVyYXRpb25fZW50cnkgLSBJbml0IGVuYV9pbnRyX21vZGVyX2VudHJ5LgorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQGxldmVsOiBJbnRlcnJ1cHQgbW9kZXJhdGlvbiB0YWJsZSBsZXZlbAorICogQGVudHJ5OiBFbnRyeSB0byBmaWxsLgorICoKKyAqIEluaXRpYWxpemUgdGhlIGVudHJ5IGFjY29yZGluZyB0byB0aGUgYWRhcHRpdmUgaW50ZXJydXB0IG1vZGVyYXRpb24gdGFibGUuCisgKi8KK3ZvaWQgZW5hX2NvbV9nZXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkgICAgICAgZW51bSBlbmFfaW50cl9tb2Rlcl9sZXZlbCBsZXZlbCwKKwkJCQkgICAgICAgc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICplbnRyeSk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBlbmFfY29tX2dldF9hZGFwdGl2ZV9tb2RlcmF0aW9uX2VuYWJsZWQoc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2KQoreworCXJldHVybiBlbmFfZGV2LT5hZGFwdGl2ZV9jb2FsZXNjaW5nOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV9lbmFibGVfYWRhcHRpdmVfbW9kZXJhdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJZW5hX2Rldi0+YWRhcHRpdmVfY29hbGVzY2luZyA9IHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX2Rpc2FibGVfYWRhcHRpdmVfbW9kZXJhdGlvbihzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYpCit7CisJZW5hX2Rldi0+YWRhcHRpdmVfY29hbGVzY2luZyA9IGZhbHNlOworfQorCisvKiBlbmFfY29tX2NhbGN1bGF0ZV9pbnRlcnJ1cHRfZGVsYXkgLSBDYWxjdWxhdGUgbmV3IGludGVycnVwdCBkZWxheQorICogQGVuYV9kZXY6IEVOQSBjb21tdW5pY2F0aW9uIGxheWVyIHN0cnVjdAorICogQHBrdHM6IE51bWJlciBvZiBwYWNrZXRzIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZQorICogQGJ5dGVzOiBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgc2luY2UgdGhlIGxhc3QgdXBkYXRlLgorICogQHNtb290aGVkX2ludGVydmFsOiBSZXR1cm5lZCBpbnRlcnZhbAorICogQG1vZGVyX3RibF9pZHg6IEN1cnJlbnQgdGFibGUgbGV2ZWwgYXMgaW5wdXQgdXBkYXRlIG5ldyBsZXZlbCBhcyByZXR1cm4KKyAqIHZhbHVlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV9jYWxjdWxhdGVfaW50ZXJydXB0X2RlbGF5KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCQkJCSAgICAgdW5zaWduZWQgaW50IHBrdHMsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCBieXRlcywKKwkJCQkJCSAgICAgdW5zaWduZWQgaW50ICpzbW9vdGhlZF9pbnRlcnZhbCwKKwkJCQkJCSAgICAgdW5zaWduZWQgaW50ICptb2Rlcl90YmxfaWR4KQoreworCWVudW0gZW5hX2ludHJfbW9kZXJfbGV2ZWwgY3Vycl9tb2Rlcl9pZHgsIG5ld19tb2Rlcl9pZHg7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5ICpjdXJyX21vZGVyX2VudHJ5OworCXN0cnVjdCBlbmFfaW50cl9tb2Rlcl9lbnRyeSAqcHJlZF9tb2Rlcl9lbnRyeTsKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKm5ld19tb2Rlcl9lbnRyeTsKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgKmludHJfbW9kZXJfdGJsID0gZW5hX2Rldi0+aW50cl9tb2Rlcl90Ymw7CisJdW5zaWduZWQgaW50IGludGVydmFsOworCisJLyogV2UgYXBwbHkgYWRhcHRpdmUgbW9kZXJhdGlvbiBvbiBSeCBwYXRoIG9ubHkuCisJICogVHggdXNlcyBzdGF0aWMgaW50ZXJydXB0IG1vZGVyYXRpb24uCisJICovCisJaWYgKCFwa3RzIHx8ICFieXRlcykKKwkJLyogVHggaW50ZXJydXB0LCBvciBzcHVyaW91cyBpbnRlcnJ1cHQsCisJCSAqIGluIGJvdGggY2FzZXMgd2UganVzdCB1c2Ugc2FtZSBkZWxheSB2YWx1ZXMKKwkJICovCisJCXJldHVybjsKKworCWN1cnJfbW9kZXJfaWR4ID0gKGVudW0gZW5hX2ludHJfbW9kZXJfbGV2ZWwpKCptb2Rlcl90YmxfaWR4KTsKKwlpZiAodW5saWtlbHkoY3Vycl9tb2Rlcl9pZHggPj0gRU5BX0lOVFJfTUFYX05VTV9PRl9MRVZFTFMpKSB7CisJCXByX2VycigiV3JvbmcgbW9kZXJhdGlvbiBpbmRleCAldVxuIiwgY3Vycl9tb2Rlcl9pZHgpOworCQlyZXR1cm47CisJfQorCisJY3Vycl9tb2Rlcl9lbnRyeSA9ICZpbnRyX21vZGVyX3RibFtjdXJyX21vZGVyX2lkeF07CisJbmV3X21vZGVyX2lkeCA9IGN1cnJfbW9kZXJfaWR4OworCisJaWYgKGN1cnJfbW9kZXJfaWR4ID09IEVOQV9JTlRSX01PREVSX0xPV0VTVCkgeworCQlpZiAoKHBrdHMgPiBjdXJyX21vZGVyX2VudHJ5LT5wa3RzX3Blcl9pbnRlcnZhbCkgfHwKKwkJICAgIChieXRlcyA+IGN1cnJfbW9kZXJfZW50cnktPmJ5dGVzX3Blcl9pbnRlcnZhbCkpCisJCQluZXdfbW9kZXJfaWR4ID0KKwkJCQkoZW51bSBlbmFfaW50cl9tb2Rlcl9sZXZlbCkoY3Vycl9tb2Rlcl9pZHggKyBFTkFfSU5UUl9NT0RFUl9MRVZFTF9TVFJJREUpOworCX0gZWxzZSB7CisJCXByZWRfbW9kZXJfZW50cnkgPSAmaW50cl9tb2Rlcl90YmxbY3Vycl9tb2Rlcl9pZHggLSBFTkFfSU5UUl9NT0RFUl9MRVZFTF9TVFJJREVdOworCisJCWlmICgocGt0cyA8PSBwcmVkX21vZGVyX2VudHJ5LT5wa3RzX3Blcl9pbnRlcnZhbCkgfHwKKwkJICAgIChieXRlcyA8PSBwcmVkX21vZGVyX2VudHJ5LT5ieXRlc19wZXJfaW50ZXJ2YWwpKQorCQkJbmV3X21vZGVyX2lkeCA9CisJCQkJKGVudW0gZW5hX2ludHJfbW9kZXJfbGV2ZWwpKGN1cnJfbW9kZXJfaWR4IC0gRU5BX0lOVFJfTU9ERVJfTEVWRUxfU1RSSURFKTsKKwkJZWxzZSBpZiAoKHBrdHMgPiBjdXJyX21vZGVyX2VudHJ5LT5wa3RzX3Blcl9pbnRlcnZhbCkgfHwKKwkJCSAoYnl0ZXMgPiBjdXJyX21vZGVyX2VudHJ5LT5ieXRlc19wZXJfaW50ZXJ2YWwpKSB7CisJCQlpZiAoY3Vycl9tb2Rlcl9pZHggIT0gRU5BX0lOVFJfTU9ERVJfSElHSEVTVCkKKwkJCQluZXdfbW9kZXJfaWR4ID0KKwkJCQkJKGVudW0gZW5hX2ludHJfbW9kZXJfbGV2ZWwpKGN1cnJfbW9kZXJfaWR4ICsgRU5BX0lOVFJfTU9ERVJfTEVWRUxfU1RSSURFKTsKKwkJfQorCX0KKwluZXdfbW9kZXJfZW50cnkgPSAmaW50cl9tb2Rlcl90YmxbbmV3X21vZGVyX2lkeF07CisKKwlpbnRlcnZhbCA9IG5ld19tb2Rlcl9lbnRyeS0+aW50cl9tb2Rlcl9pbnRlcnZhbDsKKwkqc21vb3RoZWRfaW50ZXJ2YWwgPSAoCisJCShpbnRlcnZhbCAqIEVOQV9JTlRSX0RFTEFZX05FV19WQUxVRV9XRUlHSFQgKworCQlFTkFfSU5UUl9ERUxBWV9PTERfVkFMVUVfV0VJR0hUICogKCpzbW9vdGhlZF9pbnRlcnZhbCkpICsgNSkgLworCQkxMDsKKworCSptb2Rlcl90YmxfaWR4ID0gbmV3X21vZGVyX2lkeDsKK30KKworLyogZW5hX2NvbV91cGRhdGVfaW50cl9yZWcgLSBQcmVwYXJlIGludGVycnVwdCByZWdpc3RlcgorICogQGludHJfcmVnOiBpbnRlcnJ1cHQgcmVnaXN0ZXIgdG8gdXBkYXRlLgorICogQHJ4X2RlbGF5X2ludGVydmFsOiBSeCBpbnRlcnZhbCBpbiB1c2VjcworICogQHR4X2RlbGF5X2ludGVydmFsOiBUeCBpbnRlcnZhbCBpbiB1c2VjcworICogQHVubWFzazogdW5hc2sgZW5hYmxlL2Rpc2FibGUKKyAqCisgKiBQcmVwYXJlIGludGVycnVwdCB1cGRhdGUgcmVnaXN0ZXIgd2l0aCB0aGUgc3VwcGxpZWQgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fdXBkYXRlX2ludHJfcmVnKHN0cnVjdCBlbmFfZXRoX2lvX2ludHJfcmVnICppbnRyX3JlZywKKwkJCQkJICAgdTMyIHJ4X2RlbGF5X2ludGVydmFsLAorCQkJCQkgICB1MzIgdHhfZGVsYXlfaW50ZXJ2YWwsCisJCQkJCSAgIGJvb2wgdW5tYXNrKQoreworCWludHJfcmVnLT5pbnRyX2NvbnRyb2wgPSAwOworCWludHJfcmVnLT5pbnRyX2NvbnRyb2wgfD0gcnhfZGVsYXlfaW50ZXJ2YWwgJgorCQlFTkFfRVRIX0lPX0lOVFJfUkVHX1JYX0lOVFJfREVMQVlfTUFTSzsKKworCWludHJfcmVnLT5pbnRyX2NvbnRyb2wgfD0KKwkJKHR4X2RlbGF5X2ludGVydmFsIDw8IEVOQV9FVEhfSU9fSU5UUl9SRUdfVFhfSU5UUl9ERUxBWV9TSElGVCkKKwkJJiBFTkFfRVRIX0lPX0lOVFJfUkVHX1RYX0lOVFJfREVMQVlfTUFTSzsKKworCWlmICh1bm1hc2spCisJCWludHJfcmVnLT5pbnRyX2NvbnRyb2wgfD0gRU5BX0VUSF9JT19JTlRSX1JFR19JTlRSX1VOTUFTS19NQVNLOworfQorCisjZW5kaWYgLyogIShFTkFfQ09NKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfY29tbW9uX2RlZnMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2NvbW1vbl9kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4ZDczNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2NvbW1vbl9kZWZzLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IC0gMjAxNiBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9FTkFfQ09NTU9OX0hfCisjZGVmaW5lIF9FTkFfQ09NTU9OX0hfCisKKyNkZWZpbmUgRU5BX0NPTU1PTl9TUEVDX1ZFUlNJT05fTUFKT1IJMCAvKiAgKi8KKyNkZWZpbmUgRU5BX0NPTU1PTl9TUEVDX1ZFUlNJT05fTUlOT1IJMTAgLyogICovCisKKy8qIEVOQSBvcGVyYXRlcyB3aXRoIDQ4LWJpdCBtZW1vcnkgYWRkcmVzc2VzLiBlbmFfbWVtX2FkZHJfdCAqLworc3RydWN0IGVuYV9jb21tb25fbWVtX2FkZHIgeworCXUzMiBtZW1fYWRkcl9sb3c7CisKKwl1MTYgbWVtX2FkZHJfaGlnaDsKKworCS8qIE1CWiAqLworCXUxNiByZXNlcnZlZDE2OworfTsKKworI2VuZGlmIC8qX0VOQV9DT01NT05fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aF9jb20uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aF9jb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzljNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfZXRoX2NvbS5jCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiZW5hX2V0aF9jb20uaCIKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19iYXNlICplbmFfY29tX2dldF9uZXh0X3J4X2NkZXNjKAorCXN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSkKK3sKKwlzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19iYXNlICpjZGVzYzsKKwl1MTYgZXhwZWN0ZWRfcGhhc2UsIGhlYWRfbWFza2VkOworCXUxNiBkZXNjX3BoYXNlOworCisJaGVhZF9tYXNrZWQgPSBpb19jcS0+aGVhZCAmIChpb19jcS0+cV9kZXB0aCAtIDEpOworCWV4cGVjdGVkX3BoYXNlID0gaW9fY3EtPnBoYXNlOworCisJY2Rlc2MgPSAoc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfYmFzZSAqKShpb19jcS0+Y2Rlc2NfYWRkci52aXJ0X2FkZHIKKwkJCSsgKGhlYWRfbWFza2VkICogaW9fY3EtPmNkZXNjX2VudHJ5X3NpemVfaW5fYnl0ZXMpKTsKKworCWRlc2NfcGhhc2UgPSAoY2Rlc2MtPnN0YXR1cyAmIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9QSEFTRV9NQVNLKSA+PgorCQkJRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX1BIQVNFX1NISUZUOworCisJaWYgKGRlc2NfcGhhc2UgIT0gZXhwZWN0ZWRfcGhhc2UpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGNkZXNjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5hX2NvbV9jcV9pbmNfaGVhZChzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EpCit7CisJaW9fY3EtPmhlYWQrKzsKKworCS8qIFN3aXRjaCBwaGFzZSBiaXQgaW4gY2FzZSBvZiB3cmFwIGFyb3VuZCAqLworCWlmICh1bmxpa2VseSgoaW9fY3EtPmhlYWQgJiAoaW9fY3EtPnFfZGVwdGggLSAxKSkgPT0gMCkpCisJCWlvX2NxLT5waGFzZSBePSAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmdldF9zcV9kZXNjKHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSkKK3sKKwl1MTYgdGFpbF9tYXNrZWQ7CisJdTMyIG9mZnNldDsKKworCXRhaWxfbWFza2VkID0gaW9fc3EtPnRhaWwgJiAoaW9fc3EtPnFfZGVwdGggLSAxKTsKKworCW9mZnNldCA9IHRhaWxfbWFza2VkICogaW9fc3EtPmRlc2NfZW50cnlfc2l6ZTsKKworCXJldHVybiAodm9pZCAqKSgodWludHB0cl90KWlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fY29weV9jdXJyX3NxX2Rlc2NfdG9fZGV2KHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSkKK3sKKwl1MTYgdGFpbF9tYXNrZWQgPSBpb19zcS0+dGFpbCAmIChpb19zcS0+cV9kZXB0aCAtIDEpOworCXUzMiBvZmZzZXQgPSB0YWlsX21hc2tlZCAqIGlvX3NxLT5kZXNjX2VudHJ5X3NpemU7CisKKwkvKiBJbiBjYXNlIHRoaXMgcXVldWUgaXNuJ3QgYSBMTFEgKi8KKwlpZiAoaW9fc3EtPm1lbV9xdWV1ZV90eXBlID09IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0hPU1QpCisJCXJldHVybjsKKworCW1lbWNweV90b2lvKGlvX3NxLT5kZXNjX2FkZHIucGJ1Zl9kZXZfYWRkciArIG9mZnNldCwKKwkJICAgIGlvX3NxLT5kZXNjX2FkZHIudmlydF9hZGRyICsgb2Zmc2V0LAorCQkgICAgaW9fc3EtPmRlc2NfZW50cnlfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX3NxX3VwZGF0ZV90YWlsKHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSkKK3sKKwlpb19zcS0+dGFpbCsrOworCisJLyogU3dpdGNoIHBoYXNlIGJpdCBpbiBjYXNlIG9mIHdyYXAgYXJvdW5kICovCisJaWYgKHVubGlrZWx5KChpb19zcS0+dGFpbCAmIChpb19zcS0+cV9kZXB0aCAtIDEpKSA9PSAwKSkKKwkJaW9fc3EtPnBoYXNlIF49IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVuYV9jb21fd3JpdGVfaGVhZGVyKHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwKKwkJCQkgICAgICAgdTggKmhlYWRfc3JjLCB1MTYgaGVhZGVyX2xlbikKK3sKKwl1MTYgdGFpbF9tYXNrZWQgPSBpb19zcS0+dGFpbCAmIChpb19zcS0+cV9kZXB0aCAtIDEpOworCXU4IF9faW9tZW0gKmRldl9oZWFkX2FkZHIgPQorCQlpb19zcS0+aGVhZGVyX2FkZHIgKyAodGFpbF9tYXNrZWQgKiBpb19zcS0+dHhfbWF4X2hlYWRlcl9zaXplKTsKKworCWlmIChpb19zcS0+bWVtX3F1ZXVlX3R5cGUgPT0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfSE9TVCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodW5saWtlbHkoIWlvX3NxLT5oZWFkZXJfYWRkcikpIHsKKwkJcHJfZXJyKCJQdXNoIGJ1ZmZlciBoZWFkZXIgcHRyIGlzIE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltZW1jcHlfdG9pbyhkZXZfaGVhZF9hZGRyLCBoZWFkX3NyYywgaGVhZGVyX2xlbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19iYXNlICoKKwllbmFfY29tX3J4X2NkZXNjX2lkeF90b19wdHIoc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxLCB1MTYgaWR4KQoreworCWlkeCAmPSAoaW9fY3EtPnFfZGVwdGggLSAxKTsKKwlyZXR1cm4gKHN0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2Jhc2UgKikKKwkJKCh1aW50cHRyX3QpaW9fY3EtPmNkZXNjX2FkZHIudmlydF9hZGRyICsKKwkJaWR4ICogaW9fY3EtPmNkZXNjX2VudHJ5X3NpemVfaW5fYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBlbmFfY29tX2NkZXNjX3J4X3BrdF9nZXQoc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxLAorCQkJCQkgICB1MTYgKmZpcnN0X2NkZXNjX2lkeCkKK3sKKwlzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19iYXNlICpjZGVzYzsKKwl1MTYgY291bnQgPSAwLCBoZWFkX21hc2tlZDsKKwl1MzIgbGFzdCA9IDA7CisKKwlkbyB7CisJCWNkZXNjID0gZW5hX2NvbV9nZXRfbmV4dF9yeF9jZGVzYyhpb19jcSk7CisJCWlmICghY2Rlc2MpCisJCQlicmVhazsKKworCQllbmFfY29tX2NxX2luY19oZWFkKGlvX2NxKTsKKwkJY291bnQrKzsKKwkJbGFzdCA9IChjZGVzYy0+c3RhdHVzICYgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0xBU1RfTUFTSykgPj4KKwkJCUVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MQVNUX1NISUZUOworCX0gd2hpbGUgKCFsYXN0KTsKKworCWlmIChsYXN0KSB7CisJCSpmaXJzdF9jZGVzY19pZHggPSBpb19jcS0+Y3VyX3J4X3BrdF9jZGVzY19zdGFydF9pZHg7CisJCWNvdW50ICs9IGlvX2NxLT5jdXJfcnhfcGt0X2NkZXNjX2NvdW50OworCisJCWhlYWRfbWFza2VkID0gaW9fY3EtPmhlYWQgJiAoaW9fY3EtPnFfZGVwdGggLSAxKTsKKworCQlpb19jcS0+Y3VyX3J4X3BrdF9jZGVzY19jb3VudCA9IDA7CisJCWlvX2NxLT5jdXJfcnhfcGt0X2NkZXNjX3N0YXJ0X2lkeCA9IGhlYWRfbWFza2VkOworCisJCXByX2RlYnVnKCJlbmEgcV9pZDogJWQgcGFja2V0cyB3ZXJlIGNvbXBsZXRlZC4gZmlyc3QgZGVzYyBpZHggJXUgZGVzY3MjICVkXG4iLAorCQkJIGlvX2NxLT5xaWQsICpmaXJzdF9jZGVzY19pZHgsIGNvdW50KTsKKwl9IGVsc2UgeworCQlpb19jcS0+Y3VyX3J4X3BrdF9jZGVzY19jb3VudCArPSBjb3VudDsKKwkJY291bnQgPSAwOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGlubGluZSBib29sIGVuYV9jb21fbWV0YV9kZXNjX2NoYW5nZWQoc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLAorCQkJCQkgICAgIHN0cnVjdCBlbmFfY29tX3R4X2N0eCAqZW5hX3R4X2N0eCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoZW5hX3R4X2N0eC0+bWV0YV92YWxpZCkgeworCQlyYyA9IG1lbWNtcCgmaW9fc3EtPmNhY2hlZF90eF9tZXRhLAorCQkJICAgICZlbmFfdHhfY3R4LT5lbmFfbWV0YSwKKwkJCSAgICBzaXplb2Yoc3RydWN0IGVuYV9jb21fdHhfbWV0YSkpOworCisJCWlmICh1bmxpa2VseShyYyAhPSAwKSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fY3JlYXRlX2FuZF9zdG9yZV90eF9tZXRhX2Rlc2Moc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLAorCQkJCQkJCSBzdHJ1Y3QgZW5hX2NvbV90eF9jdHggKmVuYV90eF9jdHgpCit7CisJc3RydWN0IGVuYV9ldGhfaW9fdHhfbWV0YV9kZXNjICptZXRhX2Rlc2MgPSBOVUxMOworCXN0cnVjdCBlbmFfY29tX3R4X21ldGEgKmVuYV9tZXRhID0gJmVuYV90eF9jdHgtPmVuYV9tZXRhOworCisJbWV0YV9kZXNjID0gZ2V0X3NxX2Rlc2MoaW9fc3EpOworCW1lbXNldChtZXRhX2Rlc2MsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfZXRoX2lvX3R4X21ldGFfZGVzYykpOworCisJbWV0YV9kZXNjLT5sZW5fY3RybCB8PSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NRVRBX0RFU0NfTUFTSzsKKworCW1ldGFfZGVzYy0+bGVuX2N0cmwgfD0gRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfRVhUX1ZBTElEX01BU0s7CisKKwkvKiBiaXRzIDAtOSBvZiB0aGUgbXNzICovCisJbWV0YV9kZXNjLT53b3JkMiB8PSAoZW5hX21ldGEtPm1zcyA8PAorCQlFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NU1NfTE9fU0hJRlQpICYKKwkJRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTVNTX0xPX01BU0s7CisJLyogYml0cyAxMC0xMyBvZiB0aGUgbXNzICovCisJbWV0YV9kZXNjLT5sZW5fY3RybCB8PSAoKGVuYV9tZXRhLT5tc3MgPj4gMTApIDw8CisJCUVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01TU19ISV9TSElGVCkgJgorCQlFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NU1NfSElfTUFTSzsKKworCS8qIEV4dGVuZGVkIG1ldGEgZGVzYyAqLworCW1ldGFfZGVzYy0+bGVuX2N0cmwgfD0gRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfRVRIX01FVEFfVFlQRV9NQVNLOworCW1ldGFfZGVzYy0+bGVuX2N0cmwgfD0gRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTUVUQV9TVE9SRV9NQVNLOworCW1ldGFfZGVzYy0+bGVuX2N0cmwgfD0gKGlvX3NxLT5waGFzZSA8PAorCQlFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19QSEFTRV9TSElGVCkgJgorCQlFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19QSEFTRV9NQVNLOworCisJbWV0YV9kZXNjLT5sZW5fY3RybCB8PSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19GSVJTVF9NQVNLOworCW1ldGFfZGVzYy0+d29yZDIgfD0gZW5hX21ldGEtPmwzX2hkcl9sZW4gJgorCQlFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MM19IRFJfTEVOX01BU0s7CisJbWV0YV9kZXNjLT53b3JkMiB8PSAoZW5hX21ldGEtPmwzX2hkcl9vZmZzZXQgPDwKKwkJRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTDNfSERSX09GRl9TSElGVCkgJgorCQlFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MM19IRFJfT0ZGX01BU0s7CisKKwltZXRhX2Rlc2MtPndvcmQyIHw9IChlbmFfbWV0YS0+bDRfaGRyX2xlbiA8PAorCQlFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MNF9IRFJfTEVOX0lOX1dPUkRTX1NISUZUKSAmCisJCUVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0w0X0hEUl9MRU5fSU5fV09SRFNfTUFTSzsKKworCW1ldGFfZGVzYy0+bGVuX2N0cmwgfD0gRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTUVUQV9TVE9SRV9NQVNLOworCisJLyogQ2FjaGVkIHRoZSBtZXRhIGRlc2MgKi8KKwltZW1jcHkoJmlvX3NxLT5jYWNoZWRfdHhfbWV0YSwgZW5hX21ldGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZW5hX2NvbV90eF9tZXRhKSk7CisKKwllbmFfY29tX2NvcHlfY3Vycl9zcV9kZXNjX3RvX2Rldihpb19zcSk7CisJZW5hX2NvbV9zcV91cGRhdGVfdGFpbChpb19zcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX3J4X3NldF9mbGFncyhzdHJ1Y3QgZW5hX2NvbV9yeF9jdHggKmVuYV9yeF9jdHgsCisJCQkJCXN0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2Jhc2UgKmNkZXNjKQoreworCWVuYV9yeF9jdHgtPmwzX3Byb3RvID0gY2Rlc2MtPnN0YXR1cyAmCisJCUVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MM19QUk9UT19JRFhfTUFTSzsKKwllbmFfcnhfY3R4LT5sNF9wcm90byA9CisJCShjZGVzYy0+c3RhdHVzICYgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0w0X1BST1RPX0lEWF9NQVNLKSA+PgorCQlFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDRfUFJPVE9fSURYX1NISUZUOworCWVuYV9yeF9jdHgtPmwzX2NzdW1fZXJyID0KKwkJKGNkZXNjLT5zdGF0dXMgJiBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDNfQ1NVTV9FUlJfTUFTSykgPj4KKwkJRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0wzX0NTVU1fRVJSX1NISUZUOworCWVuYV9yeF9jdHgtPmw0X2NzdW1fZXJyID0KKwkJKGNkZXNjLT5zdGF0dXMgJiBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDRfQ1NVTV9FUlJfTUFTSykgPj4KKwkJRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0w0X0NTVU1fRVJSX1NISUZUOworCWVuYV9yeF9jdHgtPmhhc2ggPSBjZGVzYy0+aGFzaDsKKwllbmFfcnhfY3R4LT5mcmFnID0KKwkJKGNkZXNjLT5zdGF0dXMgJiBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfSVBWNF9GUkFHX01BU0spID4+CisJCUVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9JUFY0X0ZSQUdfU0hJRlQ7CisKKwlwcl9kZWJ1ZygiZW5hX3J4X2N0eC0+bDNfcHJvdG8gJWQgZW5hX3J4X2N0eC0+bDRfcHJvdG8gJWRcbmVuYV9yeF9jdHgtPmwzX2NzdW1fZXJyICVkIGVuYV9yeF9jdHgtPmw0X2NzdW1fZXJyICVkXG5oYXNoIGZyYWcgJWQgZnJhZzogJWQgY2Rlc2Nfc3RhdHVzOiAleFxuIiwKKwkJIGVuYV9yeF9jdHgtPmwzX3Byb3RvLCBlbmFfcnhfY3R4LT5sNF9wcm90bywKKwkJIGVuYV9yeF9jdHgtPmwzX2NzdW1fZXJyLCBlbmFfcnhfY3R4LT5sNF9jc3VtX2VyciwKKwkJIGVuYV9yeF9jdHgtPmhhc2gsIGVuYV9yeF9jdHgtPmZyYWcsIGNkZXNjLT5zdGF0dXMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogICAgIEFQSSAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBlbmFfY29tX3ByZXBhcmVfdHgoc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxLAorCQkgICAgICAgc3RydWN0IGVuYV9jb21fdHhfY3R4ICplbmFfdHhfY3R4LAorCQkgICAgICAgaW50ICpuYl9od19kZXNjKQoreworCXN0cnVjdCBlbmFfZXRoX2lvX3R4X2Rlc2MgKmRlc2MgPSBOVUxMOworCXN0cnVjdCBlbmFfY29tX2J1ZiAqZW5hX2J1ZnMgPSBlbmFfdHhfY3R4LT5lbmFfYnVmczsKKwl2b2lkICpwdXNoX2hlYWRlciA9IGVuYV90eF9jdHgtPnB1c2hfaGVhZGVyOworCXUxNiBoZWFkZXJfbGVuID0gZW5hX3R4X2N0eC0+aGVhZGVyX2xlbjsKKwl1MTYgbnVtX2J1ZnMgPSBlbmFfdHhfY3R4LT5udW1fYnVmczsKKwlpbnQgdG90YWxfZGVzYywgaSwgcmM7CisJYm9vbCBoYXZlX21ldGE7CisJdTY0IGFkZHJfaGk7CisKKwlXQVJOKGlvX3NxLT5kaXJlY3Rpb24gIT0gRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fVFgsICJ3cm9uZyBRIHR5cGUiKTsKKworCS8qIG51bV9idWZzICsxIGZvciBwb3RlbnRpYWwgbWV0YSBkZXNjICovCisJaWYgKGVuYV9jb21fc3FfZW1wdHlfc3BhY2UoaW9fc3EpIDwgKG51bV9idWZzICsgMSkpIHsKKwkJcHJfZXJyKCJOb3QgZW5vdWdoIHNwYWNlIGluIHRoZSB0eCBxdWV1ZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmICh1bmxpa2VseShoZWFkZXJfbGVuID4gaW9fc3EtPnR4X21heF9oZWFkZXJfc2l6ZSkpIHsKKwkJcHJfZXJyKCJoZWFkZXIgc2l6ZSBpcyB0b28gbGFyZ2UgJWQgbWF4IGhlYWRlcjogJWRcbiIsCisJCSAgICAgICBoZWFkZXJfbGVuLCBpb19zcS0+dHhfbWF4X2hlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc3RhcnQgd2l0aCBwdXNoaW5nIHRoZSBoZWFkZXIgKGlmIG5lZWRlZCkgKi8KKwlyYyA9IGVuYV9jb21fd3JpdGVfaGVhZGVyKGlvX3NxLCBwdXNoX2hlYWRlciwgaGVhZGVyX2xlbik7CisJaWYgKHVubGlrZWx5KHJjKSkKKwkJcmV0dXJuIHJjOworCisJaGF2ZV9tZXRhID0gZW5hX3R4X2N0eC0+bWV0YV92YWxpZCAmJiBlbmFfY29tX21ldGFfZGVzY19jaGFuZ2VkKGlvX3NxLAorCQkJZW5hX3R4X2N0eCk7CisJaWYgKGhhdmVfbWV0YSkKKwkJZW5hX2NvbV9jcmVhdGVfYW5kX3N0b3JlX3R4X21ldGFfZGVzYyhpb19zcSwgZW5hX3R4X2N0eCk7CisKKwkvKiBJZiB0aGUgY2FsbGVyIGRvZXNuJ3Qgd2FudCBzZW5kIHBhY2tldHMgKi8KKwlpZiAodW5saWtlbHkoIW51bV9idWZzICYmICFoZWFkZXJfbGVuKSkgeworCQkqbmJfaHdfZGVzYyA9IGhhdmVfbWV0YSA/IDAgOiAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXNjID0gZ2V0X3NxX2Rlc2MoaW9fc3EpOworCW1lbXNldChkZXNjLCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2V0aF9pb190eF9kZXNjKSk7CisKKwkvKiBTZXQgZmlyc3QgZGVzYyB3aGVuIHdlIGRvbid0IGhhdmUgbWV0YSBkZXNjcmlwdG9yICovCisJaWYgKCFoYXZlX21ldGEpCisJCWRlc2MtPmxlbl9jdHJsIHw9IEVOQV9FVEhfSU9fVFhfREVTQ19GSVJTVF9NQVNLOworCisJZGVzYy0+YnVmZl9hZGRyX2hpX2hkcl9zeiB8PSAoaGVhZGVyX2xlbiA8PAorCQlFTkFfRVRIX0lPX1RYX0RFU0NfSEVBREVSX0xFTkdUSF9TSElGVCkgJgorCQlFTkFfRVRIX0lPX1RYX0RFU0NfSEVBREVSX0xFTkdUSF9NQVNLOworCWRlc2MtPmxlbl9jdHJsIHw9IChpb19zcS0+cGhhc2UgPDwgRU5BX0VUSF9JT19UWF9ERVNDX1BIQVNFX1NISUZUKSAmCisJCUVOQV9FVEhfSU9fVFhfREVTQ19QSEFTRV9NQVNLOworCisJZGVzYy0+bGVuX2N0cmwgfD0gRU5BX0VUSF9JT19UWF9ERVNDX0NPTVBfUkVRX01BU0s7CisKKwkvKiBCaXRzIDAtOSAqLworCWRlc2MtPm1ldGFfY3RybCB8PSAoZW5hX3R4X2N0eC0+cmVxX2lkIDw8CisJCUVOQV9FVEhfSU9fVFhfREVTQ19SRVFfSURfTE9fU0hJRlQpICYKKwkJRU5BX0VUSF9JT19UWF9ERVNDX1JFUV9JRF9MT19NQVNLOworCisJZGVzYy0+bWV0YV9jdHJsIHw9IChlbmFfdHhfY3R4LT5kZiA8PAorCQlFTkFfRVRIX0lPX1RYX0RFU0NfREZfU0hJRlQpICYKKwkJRU5BX0VUSF9JT19UWF9ERVNDX0RGX01BU0s7CisKKwkvKiBCaXRzIDEwLTE1ICovCisJZGVzYy0+bGVuX2N0cmwgfD0gKChlbmFfdHhfY3R4LT5yZXFfaWQgPj4gMTApIDw8CisJCUVOQV9FVEhfSU9fVFhfREVTQ19SRVFfSURfSElfU0hJRlQpICYKKwkJRU5BX0VUSF9JT19UWF9ERVNDX1JFUV9JRF9ISV9NQVNLOworCisJaWYgKGVuYV90eF9jdHgtPm1ldGFfdmFsaWQpIHsKKwkJZGVzYy0+bWV0YV9jdHJsIHw9IChlbmFfdHhfY3R4LT50c29fZW5hYmxlIDw8CisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfVFNPX0VOX1NISUZUKSAmCisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfVFNPX0VOX01BU0s7CisJCWRlc2MtPm1ldGFfY3RybCB8PSBlbmFfdHhfY3R4LT5sM19wcm90byAmCisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfTDNfUFJPVE9fSURYX01BU0s7CisJCWRlc2MtPm1ldGFfY3RybCB8PSAoZW5hX3R4X2N0eC0+bDRfcHJvdG8gPDwKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19MNF9QUk9UT19JRFhfU0hJRlQpICYKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19MNF9QUk9UT19JRFhfTUFTSzsKKwkJZGVzYy0+bWV0YV9jdHJsIHw9IChlbmFfdHhfY3R4LT5sM19jc3VtX2VuYWJsZSA8PAorCQkJRU5BX0VUSF9JT19UWF9ERVNDX0wzX0NTVU1fRU5fU0hJRlQpICYKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19MM19DU1VNX0VOX01BU0s7CisJCWRlc2MtPm1ldGFfY3RybCB8PSAoZW5hX3R4X2N0eC0+bDRfY3N1bV9lbmFibGUgPDwKKwkJCUVOQV9FVEhfSU9fVFhfREVTQ19MNF9DU1VNX0VOX1NISUZUKSAmCisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfTDRfQ1NVTV9FTl9NQVNLOworCQlkZXNjLT5tZXRhX2N0cmwgfD0gKGVuYV90eF9jdHgtPmw0X2NzdW1fcGFydGlhbCA8PAorCQkJRU5BX0VUSF9JT19UWF9ERVNDX0w0X0NTVU1fUEFSVElBTF9TSElGVCkgJgorCQkJRU5BX0VUSF9JT19UWF9ERVNDX0w0X0NTVU1fUEFSVElBTF9NQVNLOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fYnVmczsgaSsrKSB7CisJCS8qIFRoZSBmaXJzdCBkZXNjIHNoYXJlIHRoZSBzYW1lIGRlc2MgYXMgdGhlIGhlYWRlciAqLworCQlpZiAobGlrZWx5KGkgIT0gMCkpIHsKKwkJCWVuYV9jb21fY29weV9jdXJyX3NxX2Rlc2NfdG9fZGV2KGlvX3NxKTsKKwkJCWVuYV9jb21fc3FfdXBkYXRlX3RhaWwoaW9fc3EpOworCisJCQlkZXNjID0gZ2V0X3NxX2Rlc2MoaW9fc3EpOworCQkJbWVtc2V0KGRlc2MsIDB4MCwgc2l6ZW9mKHN0cnVjdCBlbmFfZXRoX2lvX3R4X2Rlc2MpKTsKKworCQkJZGVzYy0+bGVuX2N0cmwgfD0gKGlvX3NxLT5waGFzZSA8PAorCQkJCUVOQV9FVEhfSU9fVFhfREVTQ19QSEFTRV9TSElGVCkgJgorCQkJCUVOQV9FVEhfSU9fVFhfREVTQ19QSEFTRV9NQVNLOworCQl9CisKKwkJZGVzYy0+bGVuX2N0cmwgfD0gZW5hX2J1ZnMtPmxlbiAmCisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfTEVOR1RIX01BU0s7CisKKwkJYWRkcl9oaSA9ICgoZW5hX2J1ZnMtPnBhZGRyICYKKwkJCUdFTk1BU0tfVUxMKGlvX3NxLT5kbWFfYWRkcl9iaXRzIC0gMSwgMzIpKSA+PiAzMik7CisKKwkJZGVzYy0+YnVmZl9hZGRyX2xvID0gKHUzMillbmFfYnVmcy0+cGFkZHI7CisJCWRlc2MtPmJ1ZmZfYWRkcl9oaV9oZHJfc3ogfD0gYWRkcl9oaSAmCisJCQlFTkFfRVRIX0lPX1RYX0RFU0NfQUREUl9ISV9NQVNLOworCQllbmFfYnVmcysrOworCX0KKworCS8qIHNldCB0aGUgbGFzdCBkZXNjIGluZGljYXRvciAqLworCWRlc2MtPmxlbl9jdHJsIHw9IEVOQV9FVEhfSU9fVFhfREVTQ19MQVNUX01BU0s7CisKKwllbmFfY29tX2NvcHlfY3Vycl9zcV9kZXNjX3RvX2Rldihpb19zcSk7CisKKwllbmFfY29tX3NxX3VwZGF0ZV90YWlsKGlvX3NxKTsKKworCXRvdGFsX2Rlc2MgPSBtYXhfdCh1MTYsIG51bV9idWZzLCAxKTsKKwl0b3RhbF9kZXNjICs9IGhhdmVfbWV0YSA/IDEgOiAwOworCisJKm5iX2h3X2Rlc2MgPSB0b3RhbF9kZXNjOworCXJldHVybiAwOworfQorCitpbnQgZW5hX2NvbV9yeF9wa3Qoc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxLAorCQkgICBzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsCisJCSAgIHN0cnVjdCBlbmFfY29tX3J4X2N0eCAqZW5hX3J4X2N0eCkKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9yeF9idWZfaW5mbyAqZW5hX2J1ZiA9ICZlbmFfcnhfY3R4LT5lbmFfYnVmc1swXTsKKwlzdHJ1Y3QgZW5hX2V0aF9pb19yeF9jZGVzY19iYXNlICpjZGVzYyA9IE5VTEw7CisJdTE2IGNkZXNjX2lkeCA9IDA7CisJdTE2IG5iX2h3X2Rlc2M7CisJdTE2IGk7CisKKwlXQVJOKGlvX2NxLT5kaXJlY3Rpb24gIT0gRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fUlgsICJ3cm9uZyBRIHR5cGUiKTsKKworCW5iX2h3X2Rlc2MgPSBlbmFfY29tX2NkZXNjX3J4X3BrdF9nZXQoaW9fY3EsICZjZGVzY19pZHgpOworCWlmIChuYl9od19kZXNjID09IDApIHsKKwkJZW5hX3J4X2N0eC0+ZGVzY3MgPSBuYl9od19kZXNjOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcl9kZWJ1ZygiZmV0Y2ggcnggcGFja2V0OiBxdWV1ZSAlZCBjb21wbGV0ZWQgZGVzYzogJWRcbiIsIGlvX2NxLT5xaWQsCisJCSBuYl9od19kZXNjKTsKKworCWlmICh1bmxpa2VseShuYl9od19kZXNjID4gZW5hX3J4X2N0eC0+bWF4X2J1ZnMpKSB7CisJCXByX2VycigiVG9vIG1hbnkgUlggY2Rlc2NzICglZCkgPiBNQVgoJWQpXG4iLCBuYl9od19kZXNjLAorCQkgICAgICAgZW5hX3J4X2N0eC0+bWF4X2J1ZnMpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJfaHdfZGVzYzsgaSsrKSB7CisJCWNkZXNjID0gZW5hX2NvbV9yeF9jZGVzY19pZHhfdG9fcHRyKGlvX2NxLCBjZGVzY19pZHggKyBpKTsKKworCQllbmFfYnVmLT5sZW4gPSBjZGVzYy0+bGVuZ3RoOworCQllbmFfYnVmLT5yZXFfaWQgPSBjZGVzYy0+cmVxX2lkOworCQllbmFfYnVmKys7CisJfQorCisJLyogVXBkYXRlIFNRIGhlYWQgcHRyICovCisJaW9fc3EtPm5leHRfdG9fY29tcCArPSBuYl9od19kZXNjOworCisJcHJfZGVidWcoIlslc11bUUlEIyVkXSBVcGRhdGluZyBTUSBoZWFkIHRvOiAlZFxuIiwgX19mdW5jX18sIGlvX3NxLT5xaWQsCisJCSBpb19zcS0+bmV4dF90b19jb21wKTsKKworCS8qIEdldCByeCBmbGFncyBmcm9tIHRoZSBsYXN0IHBrdCAqLworCWVuYV9jb21fcnhfc2V0X2ZsYWdzKGVuYV9yeF9jdHgsIGNkZXNjKTsKKworCWVuYV9yeF9jdHgtPmRlc2NzID0gbmJfaHdfZGVzYzsKKwlyZXR1cm4gMDsKK30KKworaW50IGVuYV9jb21fYWRkX3NpbmdsZV9yeF9kZXNjKHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwKKwkJCSAgICAgICBzdHJ1Y3QgZW5hX2NvbV9idWYgKmVuYV9idWYsCisJCQkgICAgICAgdTE2IHJlcV9pZCkKK3sKKwlzdHJ1Y3QgZW5hX2V0aF9pb19yeF9kZXNjICpkZXNjOworCisJV0FSTihpb19zcS0+ZGlyZWN0aW9uICE9IEVOQV9DT01fSU9fUVVFVUVfRElSRUNUSU9OX1JYLCAid3JvbmcgUSB0eXBlIik7CisKKwlpZiAodW5saWtlbHkoZW5hX2NvbV9zcV9lbXB0eV9zcGFjZShpb19zcSkgPT0gMCkpCisJCXJldHVybiAtRU5PU1BDOworCisJZGVzYyA9IGdldF9zcV9kZXNjKGlvX3NxKTsKKwltZW1zZXQoZGVzYywgMHgwLCBzaXplb2Yoc3RydWN0IGVuYV9ldGhfaW9fcnhfZGVzYykpOworCisJZGVzYy0+bGVuZ3RoID0gZW5hX2J1Zi0+bGVuOworCisJZGVzYy0+Y3RybCB8PSBFTkFfRVRIX0lPX1JYX0RFU0NfRklSU1RfTUFTSzsKKwlkZXNjLT5jdHJsIHw9IEVOQV9FVEhfSU9fUlhfREVTQ19MQVNUX01BU0s7CisJZGVzYy0+Y3RybCB8PSBpb19zcS0+cGhhc2UgJiBFTkFfRVRIX0lPX1JYX0RFU0NfUEhBU0VfTUFTSzsKKwlkZXNjLT5jdHJsIHw9IEVOQV9FVEhfSU9fUlhfREVTQ19DT01QX1JFUV9NQVNLOworCisJZGVzYy0+cmVxX2lkID0gcmVxX2lkOworCisJZGVzYy0+YnVmZl9hZGRyX2xvID0gKHUzMillbmFfYnVmLT5wYWRkcjsKKwlkZXNjLT5idWZmX2FkZHJfaGkgPQorCQkoKGVuYV9idWYtPnBhZGRyICYgR0VOTUFTS19VTEwoaW9fc3EtPmRtYV9hZGRyX2JpdHMgLSAxLCAzMikpID4+IDMyKTsKKworCWVuYV9jb21fc3FfdXBkYXRlX3RhaWwoaW9fc3EpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbmFfY29tX3R4X2NvbXBfcmVxX2lkX2dldChzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EsIHUxNiAqcmVxX2lkKQoreworCXU4IGV4cGVjdGVkX3BoYXNlLCBjZGVzY19waGFzZTsKKwlzdHJ1Y3QgZW5hX2V0aF9pb190eF9jZGVzYyAqY2Rlc2M7CisJdTE2IG1hc2tlZF9oZWFkOworCisJbWFza2VkX2hlYWQgPSBpb19jcS0+aGVhZCAmIChpb19jcS0+cV9kZXB0aCAtIDEpOworCWV4cGVjdGVkX3BoYXNlID0gaW9fY3EtPnBoYXNlOworCisJY2Rlc2MgPSAoc3RydWN0IGVuYV9ldGhfaW9fdHhfY2Rlc2MgKikKKwkJKCh1aW50cHRyX3QpaW9fY3EtPmNkZXNjX2FkZHIudmlydF9hZGRyICsKKwkJKG1hc2tlZF9oZWFkICogaW9fY3EtPmNkZXNjX2VudHJ5X3NpemVfaW5fYnl0ZXMpKTsKKworCS8qIFdoZW4gdGhlIGN1cnJlbnQgY29tcGxldGlvbiBkZXNjcmlwdG9yIHBoYXNlIGlzbid0IHRoZSBzYW1lIGFzIHRoZQorCSAqIGV4cGVjdGVkLCBpdCBtZWFuIHRoYXQgdGhlIGRldmljZSBzdGlsbCBkaWRuJ3QgdXBkYXRlCisJICogdGhpcyBjb21wbGV0aW9uLgorCSAqLworCWNkZXNjX3BoYXNlID0gY2Rlc2MtPmZsYWdzICYgRU5BX0VUSF9JT19UWF9DREVTQ19QSEFTRV9NQVNLOworCWlmIChjZGVzY19waGFzZSAhPSBleHBlY3RlZF9waGFzZSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwllbmFfY29tX2NxX2luY19oZWFkKGlvX2NxKTsKKworCSpyZXFfaWQgPSBjZGVzYy0+cmVxX2lkOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGhfY29tLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGhfY29tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1M2MzYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aF9jb20uaApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBFTkFfRVRIX0NPTV9IXworI2RlZmluZSBFTkFfRVRIX0NPTV9IXworCisjaW5jbHVkZSAiZW5hX2NvbS5oIgorCisvKiBoZWFkIHVwZGF0ZSB0aHJlc2hvbGQgaW4gdW5pdHMgb2YgKHF1ZXVlIHNpemUgLyBFTkFfQ09NUF9IRUFEX1RIUkVTSCkgKi8KKyNkZWZpbmUgRU5BX0NPTVBfSEVBRF9USFJFU0ggNAorCitzdHJ1Y3QgZW5hX2NvbV90eF9jdHggeworCXN0cnVjdCBlbmFfY29tX3R4X21ldGEgZW5hX21ldGE7CisJc3RydWN0IGVuYV9jb21fYnVmICplbmFfYnVmczsKKwkvKiBGb3IgTExRLCBoZWFkZXIgYnVmZmVyIC0gcHVzaGVkIHRvIHRoZSBkZXZpY2UgbWVtIHNwYWNlICovCisJdm9pZCAqcHVzaF9oZWFkZXI7CisKKwllbnVtIGVuYV9ldGhfaW9fbDNfcHJvdG9faW5kZXggbDNfcHJvdG87CisJZW51bSBlbmFfZXRoX2lvX2w0X3Byb3RvX2luZGV4IGw0X3Byb3RvOworCXUxNiBudW1fYnVmczsKKwl1MTYgcmVxX2lkOworCS8qIEZvciByZWd1bGFyIHF1ZXVlLCBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgaGVhZGVyCisJICogRm9yIExMUSwgaW5kaWNhdGUgdGhlIHNpemUgb2YgdGhlIHB1c2hlZCBidWZmZXIKKwkgKi8KKwl1MTYgaGVhZGVyX2xlbjsKKworCXU4IG1ldGFfdmFsaWQ7CisJdTggdHNvX2VuYWJsZTsKKwl1OCBsM19jc3VtX2VuYWJsZTsKKwl1OCBsNF9jc3VtX2VuYWJsZTsKKwl1OCBsNF9jc3VtX3BhcnRpYWw7CisJdTggZGY7IC8qIERvbid0IGZyYWdtZW50ICovCit9OworCitzdHJ1Y3QgZW5hX2NvbV9yeF9jdHggeworCXN0cnVjdCBlbmFfY29tX3J4X2J1Zl9pbmZvICplbmFfYnVmczsKKwllbnVtIGVuYV9ldGhfaW9fbDNfcHJvdG9faW5kZXggbDNfcHJvdG87CisJZW51bSBlbmFfZXRoX2lvX2w0X3Byb3RvX2luZGV4IGw0X3Byb3RvOworCWJvb2wgbDNfY3N1bV9lcnI7CisJYm9vbCBsNF9jc3VtX2VycjsKKwkvKiBmcmFnbWVudGVkIHBhY2tldCAqLworCWJvb2wgZnJhZzsKKwl1MzIgaGFzaDsKKwl1MTYgZGVzY3M7CisJaW50IG1heF9idWZzOworfTsKKworaW50IGVuYV9jb21fcHJlcGFyZV90eChzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsCisJCSAgICAgICBzdHJ1Y3QgZW5hX2NvbV90eF9jdHggKmVuYV90eF9jdHgsCisJCSAgICAgICBpbnQgKm5iX2h3X2Rlc2MpOworCitpbnQgZW5hX2NvbV9yeF9wa3Qoc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxLAorCQkgICBzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsCisJCSAgIHN0cnVjdCBlbmFfY29tX3J4X2N0eCAqZW5hX3J4X2N0eCk7CisKK2ludCBlbmFfY29tX2FkZF9zaW5nbGVfcnhfZGVzYyhzdHJ1Y3QgZW5hX2NvbV9pb19zcSAqaW9fc3EsCisJCQkgICAgICAgc3RydWN0IGVuYV9jb21fYnVmICplbmFfYnVmLAorCQkJICAgICAgIHUxNiByZXFfaWQpOworCitpbnQgZW5hX2NvbV90eF9jb21wX3JlcV9pZF9nZXQoc3RydWN0IGVuYV9jb21faW9fY3EgKmlvX2NxLCB1MTYgKnJlcV9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX3VubWFza19pbnRyKHN0cnVjdCBlbmFfY29tX2lvX2NxICppb19jcSwKKwkJCQkgICAgICAgc3RydWN0IGVuYV9ldGhfaW9faW50cl9yZWcgKmludHJfcmVnKQoreworCXdyaXRlbChpbnRyX3JlZy0+aW50cl9jb250cm9sLCBpb19jcS0+dW5tYXNrX3JlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVuYV9jb21fc3FfZW1wdHlfc3BhY2Uoc3RydWN0IGVuYV9jb21faW9fc3EgKmlvX3NxKQoreworCXUxNiB0YWlsLCBuZXh0X3RvX2NvbXAsIGNudDsKKworCW5leHRfdG9fY29tcCA9IGlvX3NxLT5uZXh0X3RvX2NvbXA7CisJdGFpbCA9IGlvX3NxLT50YWlsOworCWNudCA9IHRhaWwgLSBuZXh0X3RvX2NvbXA7CisKKwlyZXR1cm4gaW9fc3EtPnFfZGVwdGggLSAxIC0gY250OworfQorCitzdGF0aWMgaW5saW5lIGludCBlbmFfY29tX3dyaXRlX3NxX2Rvb3JiZWxsKHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSkKK3sKKwl1MTYgdGFpbDsKKworCXRhaWwgPSBpb19zcS0+dGFpbDsKKworCXByX2RlYnVnKCJ3cml0ZSBzdWJtaXNzaW9uIHF1ZXVlIGRvb3JiZWxsIGZvciBxdWV1ZTogJWQgdGFpbDogJWRcbiIsCisJCSBpb19zcS0+cWlkLCB0YWlsKTsKKworCXdyaXRlbCh0YWlsLCBpb19zcS0+ZGJfYWRkcik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZW5hX2NvbV91cGRhdGVfZGV2X2NvbXBfaGVhZChzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EpCit7CisJdTE2IHVucmVwb3J0ZWRfY29tcCwgaGVhZDsKKwlib29sIG5lZWRfdXBkYXRlOworCisJaGVhZCA9IGlvX2NxLT5oZWFkOworCXVucmVwb3J0ZWRfY29tcCA9IGhlYWQgLSBpb19jcS0+bGFzdF9oZWFkX3VwZGF0ZTsKKwluZWVkX3VwZGF0ZSA9IHVucmVwb3J0ZWRfY29tcCA+IChpb19jcS0+cV9kZXB0aCAvIEVOQV9DT01QX0hFQURfVEhSRVNIKTsKKworCWlmIChpb19jcS0+Y3FfaGVhZF9kYl9yZWcgJiYgbmVlZF91cGRhdGUpIHsKKwkJcHJfZGVidWcoIldyaXRlIGNvbXBsZXRpb24gcXVldWUgZG9vcmJlbGwgZm9yIHF1ZXVlICVkOiBoZWFkOiAlZFxuIiwKKwkJCSBpb19jcS0+cWlkLCBoZWFkKTsKKwkJd3JpdGVsKGhlYWQsIGlvX2NxLT5jcV9oZWFkX2RiX3JlZyk7CisJCWlvX2NxLT5sYXN0X2hlYWRfdXBkYXRlID0gaGVhZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYV9jb21fdXBkYXRlX251bWFfbm9kZShzdHJ1Y3QgZW5hX2NvbV9pb19jcSAqaW9fY3EsCisJCQkJCSAgICB1OCBudW1hX25vZGUpCit7CisJc3RydWN0IGVuYV9ldGhfaW9fbnVtYV9ub2RlX2NmZ19yZWcgbnVtYV9jZmc7CisKKwlpZiAoIWlvX2NxLT5udW1hX25vZGVfY2ZnX3JlZykKKwkJcmV0dXJuOworCisJbnVtYV9jZmcubnVtYV9jZmcgPSAobnVtYV9ub2RlICYgRU5BX0VUSF9JT19OVU1BX05PREVfQ0ZHX1JFR19OVU1BX01BU0spCisJCXwgRU5BX0VUSF9JT19OVU1BX05PREVfQ0ZHX1JFR19FTkFCTEVEX01BU0s7CisKKwl3cml0ZWwobnVtYV9jZmcubnVtYV9jZmcsIGlvX2NxLT5udW1hX25vZGVfY2ZnX3JlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFfY29tX2NvbXBfYWNrKHN0cnVjdCBlbmFfY29tX2lvX3NxICppb19zcSwgdTE2IGVsZW0pCit7CisJaW9fc3EtPm5leHRfdG9fY29tcCArPSBlbGVtOworfQorCisjZW5kaWYgLyogRU5BX0VUSF9DT01fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX2V0aF9pb19kZWZzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGhfaW9fZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMjBjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGhfaW9fZGVmcy5oCkBAIC0wLDAgKzEsNDE2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgLSAyMDE2IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKyNpZm5kZWYgX0VOQV9FVEhfSU9fSF8KKyNkZWZpbmUgX0VOQV9FVEhfSU9fSF8KKworZW51bSBlbmFfZXRoX2lvX2wzX3Byb3RvX2luZGV4IHsKKwlFTkFfRVRIX0lPX0wzX1BST1RPX1VOS05PV04JPSAwLAorCisJRU5BX0VUSF9JT19MM19QUk9UT19JUFY0CT0gOCwKKworCUVOQV9FVEhfSU9fTDNfUFJPVE9fSVBWNgk9IDExLAorCisJRU5BX0VUSF9JT19MM19QUk9UT19GQ09FCT0gMjEsCisKKwlFTkFfRVRIX0lPX0wzX1BST1RPX1JPQ0UJPSAyMiwKK307CisKK2VudW0gZW5hX2V0aF9pb19sNF9wcm90b19pbmRleCB7CisJRU5BX0VUSF9JT19MNF9QUk9UT19VTktOT1dOCQk9IDAsCisKKwlFTkFfRVRIX0lPX0w0X1BST1RPX1RDUAkJCT0gMTIsCisKKwlFTkFfRVRIX0lPX0w0X1BST1RPX1VEUAkJCT0gMTMsCisKKwlFTkFfRVRIX0lPX0w0X1BST1RPX1JPVVRFQUJMRV9ST0NFCT0gMjMsCit9OworCitzdHJ1Y3QgZW5hX2V0aF9pb190eF9kZXNjIHsKKwkvKiAxNTowIDogbGVuZ3RoIC0gQnVmZmVyIGxlbmd0aCBpbiBieXRlcywgbXVzdAorCSAqICAgIGluY2x1ZGUgYW55IHBhY2tldCB0cmFpbGVycyB0aGF0IHRoZSBFTkEgc3VwcG9zZWQKKwkgKiAgICB0byB1cGRhdGUgbGlrZSBFbmQtdG8tRW5kIENSQywgQXV0aGVudGljYXRpb24gR01BQworCSAqICAgIGV0Yy4gVGhpcyBsZW5ndGggbXVzdCBub3QgaW5jbHVkZSB0aGUKKwkgKiAgICAnUHVzaF9CdWZmZXInIGxlbmd0aC4gVGhpcyBsZW5ndGggbXVzdCBub3QgaW5jbHVkZQorCSAqICAgIHRoZSA0LWJ5dGUgYWRkZWQgaW4gdGhlIGVuZCBmb3IgODAyLjMgRXRoZXJuZXQgRkNTCisJICogMjE6MTYgOiByZXFfaWRfaGkgLSBSZXF1ZXN0IElEWzE1OjEwXQorCSAqIDIyIDogcmVzZXJ2ZWQyMiAtIE1CWgorCSAqIDIzIDogbWV0YV9kZXNjIC0gTUJaCisJICogMjQgOiBwaGFzZQorCSAqIDI1IDogcmVzZXJ2ZWQxIC0gTUJaCisJICogMjYgOiBmaXJzdCAtIEluZGljYXRlcyBmaXJzdCBkZXNjcmlwdG9yIGluCisJICogICAgdHJhbnNhY3Rpb24KKwkgKiAyNyA6IGxhc3QgLSBJbmRpY2F0ZXMgbGFzdCBkZXNjcmlwdG9yIGluCisJICogICAgdHJhbnNhY3Rpb24KKwkgKiAyOCA6IGNvbXBfcmVxIC0gSW5kaWNhdGVzIHdoZXRoZXIgY29tcGxldGlvbgorCSAqICAgIHNob3VsZCBiZSBwb3N0ZWQsIGFmdGVyIHBhY2tldCBpcyB0cmFuc21pdHRlZC4KKwkgKiAgICBWYWxpZCBvbmx5IGZvciBmaXJzdCBkZXNjcmlwdG9yCisJICogMzA6MjkgOiByZXNlcnZlZDI5IC0gTUJaCisJICogMzEgOiByZXNlcnZlZDMxIC0gTUJaCisJICovCisJdTMyIGxlbl9jdHJsOworCisJLyogMzowIDogbDNfcHJvdG9faWR4IC0gTDMgcHJvdG9jb2wuIFRoaXMgZmllbGQKKwkgKiAgICByZXF1aXJlZCB3aGVuIGwzX2NzdW1fZW4sbDNfY3N1bSBvciB0c29fZW4gYXJlIHNldC4KKwkgKiA0IDogREYgLSBJUHY0IERGLCBtdXN0IGJlIDAgaWYgcGFja2V0IGlzIElQdjQgYW5kCisJICogICAgREYgZmxhZ3Mgb2YgdGhlIElQdjQgaGVhZGVyIGlzIDAuIE90aGVyd2lzZSBtdXN0CisJICogICAgYmUgc2V0IHRvIDEKKwkgKiA2OjUgOiByZXNlcnZlZDUKKwkgKiA3IDogdHNvX2VuIC0gRW5hYmxlIFRTTywgRm9yIFRDUCBvbmx5LgorCSAqIDEyOjggOiBsNF9wcm90b19pZHggLSBMNCBwcm90b2NvbC4gVGhpcyBmaWVsZCBuZWVkCisJICogICAgdG8gYmUgc2V0IHdoZW4gbDRfY3N1bV9lbiBvciB0c29fZW4gYXJlIHNldC4KKwkgKiAxMyA6IGwzX2NzdW1fZW4gLSBlbmFibGUgSVB2NCBoZWFkZXIgY2hlY2tzdW0uCisJICogMTQgOiBsNF9jc3VtX2VuIC0gZW5hYmxlIFRDUC9VRFAgY2hlY2tzdW0uCisJICogMTUgOiBldGhlcm5ldF9mY3NfZGlzIC0gd2hlbiBzZXQsIHRoZSBjb250cm9sbGVyCisJICogICAgd2lsbCBub3QgYXBwZW5kIHRoZSA4MDIuMyBFdGhlcm5ldCBGcmFtZSBDaGVjaworCSAqICAgIFNlcXVlbmNlIHRvIHRoZSBwYWNrZXQKKwkgKiAxNiA6IHJlc2VydmVkMTYKKwkgKiAxNyA6IGw0X2NzdW1fcGFydGlhbCAtIEw0IHBhcnRpYWwgY2hlY2tzdW0uIHdoZW4KKwkgKiAgICBzZXQgdG8gMCwgdGhlIEVOQSBjYWxjdWxhdGVzIHRoZSBMNCBjaGVja3N1bSwKKwkgKiAgICB3aGVyZSB0aGUgRGVzdGluYXRpb24gQWRkcmVzcyByZXF1aXJlZCBmb3IgdGhlCisJICogICAgVENQL1VEUCBwc2V1ZG8taGVhZGVyIGlzIHRha2VuIGZyb20gdGhlIGFjdHVhbAorCSAqICAgIHBhY2tldCBMMyBoZWFkZXIuIHdoZW4gc2V0IHRvIDEsIHRoZSBFTkEgZG9lc24ndAorCSAqICAgIGNhbGN1bGF0ZSB0aGUgc3VtIG9mIHRoZSBwc2V1ZG8taGVhZGVyLCBpbnN0ZWFkLAorCSAqICAgIHRoZSBjaGVja3N1bSBmaWVsZCBvZiB0aGUgTDQgaXMgdXNlZCBpbnN0ZWFkLiBXaGVuCisJICogICAgVFNPIGVuYWJsZWQsIHRoZSBjaGVja3N1bSBvZiB0aGUgcHNldWRvLWhlYWRlcgorCSAqICAgIG11c3Qgbm90IGluY2x1ZGUgdGhlIHRjcCBsZW5ndGggZmllbGQuIEw0IHBhcnRpYWwKKwkgKiAgICBjaGVja3N1bSBzaG91bGQgYmUgdXNlZCBmb3IgSVB2NiBwYWNrZXQgdGhhdAorCSAqICAgIGNvbnRhaW5zIFJvdXRpbmcgSGVhZGVycy4KKwkgKiAyMDoxOCA6IHJlc2VydmVkMTggLSBNQloKKwkgKiAyMSA6IHJlc2VydmVkMjEgLSBNQloKKwkgKiAzMToyMiA6IHJlcV9pZF9sbyAtIFJlcXVlc3QgSURbOTowXQorCSAqLworCXUzMiBtZXRhX2N0cmw7CisKKwl1MzIgYnVmZl9hZGRyX2xvOworCisJLyogYWRkcmVzcyBoaWdoIGFuZCBoZWFkZXIgc2l6ZQorCSAqIDE1OjAgOiBhZGRyX2hpIC0gQnVmZmVyIFBvaW50ZXJbNDc6MzJdCisJICogMjM6MTYgOiByZXNlcnZlZDE2X3cyCisJICogMzE6MjQgOiBoZWFkZXJfbGVuZ3RoIC0gSGVhZGVyIGxlbmd0aC4gRm9yIExvdworCSAqICAgIExhdGVuY3kgUXVldWVzLCB0aGlzIGZpZWxkcyBpbmRpY2F0ZXMgdGhlIG51bWJlcgorCSAqICAgIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIGhlYWRlcnMnIG1lbW9yeS4gRm9yCisJICogICAgbm9ybWFsIHF1ZXVlcywgaWYgcGFja2V0IGlzIFRDUCBvciBVRFAsIGFuZCBsb25nZXIKKwkgKiAgICB0aGFuIG1heF9oZWFkZXJfc2l6ZSwgdGhlbiB0aGlzIGZpZWxkIHNob3VsZCBiZQorCSAqICAgIHNldCB0byB0aGUgc3VtIG9mIEw0IGhlYWRlciBvZmZzZXQgYW5kIEw0IGhlYWRlcgorCSAqICAgIHNpemUod2l0aG91dCBvcHRpb25zKSwgb3RoZXJ3aXNlLCB0aGlzIGZpZWxkCisJICogICAgc2hvdWxkIGJlIHNldCB0byAwLiBGb3IgYm90aCBtb2RlcywgdGhpcyBmaWVsZAorCSAqICAgIG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4X2hlYWRlcl9zaXplLgorCSAqICAgIG1heF9oZWFkZXJfc2l6ZSB2YWx1ZSBpcyByZXBvcnRlZCBieSB0aGUgTWF4CisJICogICAgUXVldWVzIEZlYXR1cmUgZGVzY3JpcHRvcgorCSAqLworCXUzMiBidWZmX2FkZHJfaGlfaGRyX3N6OworfTsKKworc3RydWN0IGVuYV9ldGhfaW9fdHhfbWV0YV9kZXNjIHsKKwkvKiA5OjAgOiByZXFfaWRfbG8gLSBSZXF1ZXN0IElEWzk6MF0KKwkgKiAxMToxMCA6IHJlc2VydmVkMTAgLSBNQloKKwkgKiAxMiA6IHJlc2VydmVkMTIgLSBNQloKKwkgKiAxMyA6IHJlc2VydmVkMTMgLSBNQloKKwkgKiAxNCA6IGV4dF92YWxpZCAtIGlmIHNldCwgb2Zmc2V0IGZpZWxkcyBpbiBXb3JkMgorCSAqICAgIGFyZSB2YWxpZCBBbHNvIE1TUyBIaWdoIGluIFdvcmQgMCBhbmQgYml0cyBbMzE6MjRdCisJICogICAgaW4gV29yZCAzCisJICogMTUgOiByZXNlcnZlZDE1CisJICogMTk6MTYgOiBtc3NfaGkKKwkgKiAyMCA6IGV0aF9tZXRhX3R5cGUgLSAwOiBUeCBNZXRhZGF0YSBEZXNjcmlwdG9yLCAxOgorCSAqICAgIEV4dGVuZGVkIE1ldGFkYXRhIERlc2NyaXB0b3IKKwkgKiAyMSA6IG1ldGFfc3RvcmUgLSBTdG9yZSBleHRlbmRlZCBtZXRhZGF0YSBpbiBxdWV1ZQorCSAqICAgIGNhY2hlCisJICogMjIgOiByZXNlcnZlZDIyIC0gTUJaCisJICogMjMgOiBtZXRhX2Rlc2MgLSBNQk8KKwkgKiAyNCA6IHBoYXNlCisJICogMjUgOiByZXNlcnZlZDI1IC0gTUJaCisJICogMjYgOiBmaXJzdCAtIEluZGljYXRlcyBmaXJzdCBkZXNjcmlwdG9yIGluCisJICogICAgdHJhbnNhY3Rpb24KKwkgKiAyNyA6IGxhc3QgLSBJbmRpY2F0ZXMgbGFzdCBkZXNjcmlwdG9yIGluCisJICogICAgdHJhbnNhY3Rpb24KKwkgKiAyOCA6IGNvbXBfcmVxIC0gSW5kaWNhdGVzIHdoZXRoZXIgY29tcGxldGlvbgorCSAqICAgIHNob3VsZCBiZSBwb3N0ZWQsIGFmdGVyIHBhY2tldCBpcyB0cmFuc21pdHRlZC4KKwkgKiAgICBWYWxpZCBvbmx5IGZvciBmaXJzdCBkZXNjcmlwdG9yCisJICogMzA6MjkgOiByZXNlcnZlZDI5IC0gTUJaCisJICogMzEgOiByZXNlcnZlZDMxIC0gTUJaCisJICovCisJdTMyIGxlbl9jdHJsOworCisJLyogNTowIDogcmVxX2lkX2hpCisJICogMzE6NiA6IHJlc2VydmVkNiAtIE1CWgorCSAqLworCXUzMiB3b3JkMTsKKworCS8qIDc6MCA6IGwzX2hkcl9sZW4KKwkgKiAxNTo4IDogbDNfaGRyX29mZgorCSAqIDIxOjE2IDogbDRfaGRyX2xlbl9pbl93b3JkcyAtIGNvdW50cyB0aGUgTDQgaGVhZGVyCisJICogICAgbGVuZ3RoIGluIHdvcmRzLiB0aGVyZSBpcyBhbiBleHBsaWNpdCBhc3N1bXB0aW9uCisJICogICAgdGhhdCBMNCBoZWFkZXIgYXBwZWFycyByaWdodCBhZnRlciBMMyBoZWFkZXIgYW5kCisJICogICAgTDQgb2Zmc2V0IGlzIGJhc2VkIG9uIGwzX2hkcl9vZmYrbDNfaGRyX2xlbgorCSAqIDMxOjIyIDogbXNzX2xvCisJICovCisJdTMyIHdvcmQyOworCisJdTMyIHJlc2VydmVkOworfTsKKworc3RydWN0IGVuYV9ldGhfaW9fdHhfY2Rlc2MgeworCS8qIFJlcXVlc3QgSURbMTU6MF0gKi8KKwl1MTYgcmVxX2lkOworCisJdTggc3RhdHVzOworCisJLyogZmxhZ3MKKwkgKiAwIDogcGhhc2UKKwkgKiA3OjEgOiByZXNlcnZlZDEKKwkgKi8KKwl1OCBmbGFnczsKKworCXUxNiBzdWJfcWlkOworCisJdTE2IHNxX2hlYWRfaWR4OworfTsKKworc3RydWN0IGVuYV9ldGhfaW9fcnhfZGVzYyB7CisJLyogSW4gYnl0ZXMuIDAgbWVhbnMgNjRLQiAqLworCXUxNiBsZW5ndGg7CisKKwkvKiBNQlogKi8KKwl1OCByZXNlcnZlZDI7CisKKwkvKiAwIDogcGhhc2UKKwkgKiAxIDogcmVzZXJ2ZWQxIC0gTUJaCisJICogMiA6IGZpcnN0IC0gSW5kaWNhdGVzIGZpcnN0IGRlc2NyaXB0b3IgaW4KKwkgKiAgICB0cmFuc2FjdGlvbgorCSAqIDMgOiBsYXN0IC0gSW5kaWNhdGVzIGxhc3QgZGVzY3JpcHRvciBpbiB0cmFuc2FjdGlvbgorCSAqIDQgOiBjb21wX3JlcQorCSAqIDUgOiByZXNlcnZlZDUgLSBNQk8KKwkgKiA3OjYgOiByZXNlcnZlZDYgLSBNQloKKwkgKi8KKwl1OCBjdHJsOworCisJdTE2IHJlcV9pZDsKKworCS8qIE1CWiAqLworCXUxNiByZXNlcnZlZDY7CisKKwl1MzIgYnVmZl9hZGRyX2xvOworCisJdTE2IGJ1ZmZfYWRkcl9oaTsKKworCS8qIE1CWiAqLworCXUxNiByZXNlcnZlZDE2X3czOworfTsKKworLyogNC13b3JkIGZvcm1hdCBOb3RlOiBhbGwgZXRoZXJuZXQgcGFyc2luZyBpbmZvcm1hdGlvbiBhcmUgdmFsaWQgb25seSB3aGVuCisgKiBsYXN0PTEKKyAqLworc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfYmFzZSB7CisJLyogNDowIDogbDNfcHJvdG9faWR4CisJICogNjo1IDogc3JjX3ZsYW5fY250CisJICogNyA6IHJlc2VydmVkNyAtIE1CWgorCSAqIDEyOjggOiBsNF9wcm90b19pZHgKKwkgKiAxMyA6IGwzX2NzdW1fZXJyIC0gd2hlbiBzZXQsIGVpdGhlciB0aGUgTDMKKwkgKiAgICBjaGVja3N1bSBlcnJvciBkZXRlY3RlZCwgb3IsIHRoZSBjb250cm9sbGVyIGRpZG4ndAorCSAqICAgIHZhbGlkYXRlIHRoZSBjaGVja3N1bS4gVGhpcyBiaXQgaXMgdmFsaWQgb25seSB3aGVuCisJICogICAgbDNfcHJvdG9faWR4IGluZGljYXRlcyBJUHY0IHBhY2tldAorCSAqIDE0IDogbDRfY3N1bV9lcnIgLSB3aGVuIHNldCwgZWl0aGVyIHRoZSBMNAorCSAqICAgIGNoZWNrc3VtIGVycm9yIGRldGVjdGVkLCBvciwgdGhlIGNvbnRyb2xsZXIgZGlkbid0CisJICogICAgdmFsaWRhdGUgdGhlIGNoZWNrc3VtLiBUaGlzIGJpdCBpcyB2YWxpZCBvbmx5IHdoZW4KKwkgKiAgICBsNF9wcm90b19pZHggaW5kaWNhdGVzIFRDUC9VRFAgcGFja2V0LCBhbmQsCisJICogICAgaXB2NF9mcmFnIGlzIG5vdCBzZXQKKwkgKiAxNSA6IGlwdjRfZnJhZyAtIEluZGljYXRlcyBJUHY0IGZyYWdtZW50ZWQgcGFja2V0CisJICogMjM6MTYgOiByZXNlcnZlZDE2CisJICogMjQgOiBwaGFzZQorCSAqIDI1IDogbDNfY3N1bTIgLSBzZWNvbmQgY2hlY2tzdW0gZW5naW5lIHJlc3VsdAorCSAqIDI2IDogZmlyc3QgLSBJbmRpY2F0ZXMgZmlyc3QgZGVzY3JpcHRvciBpbgorCSAqICAgIHRyYW5zYWN0aW9uCisJICogMjcgOiBsYXN0IC0gSW5kaWNhdGVzIGxhc3QgZGVzY3JpcHRvciBpbgorCSAqICAgIHRyYW5zYWN0aW9uCisJICogMjk6MjggOiByZXNlcnZlZDI4CisJICogMzAgOiBidWZmZXIgLSAwOiBNZXRhZGF0YSBkZXNjcmlwdG9yLiAxOiBCdWZmZXIKKwkgKiAgICBEZXNjcmlwdG9yIHdhcyB1c2VkCisJICogMzEgOiByZXNlcnZlZDMxCisJICovCisJdTMyIHN0YXR1czsKKworCXUxNiBsZW5ndGg7CisKKwl1MTYgcmVxX2lkOworCisJLyogMzItYml0IGhhc2ggcmVzdWx0ICovCisJdTMyIGhhc2g7CisKKwl1MTYgc3ViX3FpZDsKKworCXUxNiByZXNlcnZlZDsKK307CisKKy8qIDgtd29yZCBmb3JtYXQgKi8KK3N0cnVjdCBlbmFfZXRoX2lvX3J4X2NkZXNjX2V4dCB7CisJc3RydWN0IGVuYV9ldGhfaW9fcnhfY2Rlc2NfYmFzZSBiYXNlOworCisJdTMyIGJ1ZmZfYWRkcl9sbzsKKworCXUxNiBidWZmX2FkZHJfaGk7CisKKwl1MTYgcmVzZXJ2ZWQxNjsKKworCXUzMiByZXNlcnZlZF93NjsKKworCXUzMiByZXNlcnZlZF93NzsKK307CisKK3N0cnVjdCBlbmFfZXRoX2lvX2ludHJfcmVnIHsKKwkvKiAxNDowIDogcnhfaW50cl9kZWxheQorCSAqIDI5OjE1IDogdHhfaW50cl9kZWxheQorCSAqIDMwIDogaW50cl91bm1hc2sKKwkgKiAzMSA6IHJlc2VydmVkCisJICovCisJdTMyIGludHJfY29udHJvbDsKK307CisKK3N0cnVjdCBlbmFfZXRoX2lvX251bWFfbm9kZV9jZmdfcmVnIHsKKwkvKiA3OjAgOiBudW1hCisJICogMzA6OCA6IHJlc2VydmVkCisJICogMzEgOiBlbmFibGVkCisJICovCisJdTMyIG51bWFfY2ZnOworfTsKKworLyogdHhfZGVzYyAqLworI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTEVOR1RIX01BU0sgR0VOTUFTSygxNSwgMCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX1JFUV9JRF9ISV9TSElGVCAxNgorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfUkVRX0lEX0hJX01BU0sgR0VOTUFTSygyMSwgMTYpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19NRVRBX0RFU0NfU0hJRlQgMjMKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX01FVEFfREVTQ19NQVNLIEJJVCgyMykKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX1BIQVNFX1NISUZUIDI0CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19QSEFTRV9NQVNLIEJJVCgyNCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0ZJUlNUX1NISUZUIDI2CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19GSVJTVF9NQVNLIEJJVCgyNikKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0xBU1RfU0hJRlQgMjcKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0xBU1RfTUFTSyBCSVQoMjcpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19DT01QX1JFUV9TSElGVCAyOAorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfQ09NUF9SRVFfTUFTSyBCSVQoMjgpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MM19QUk9UT19JRFhfTUFTSyBHRU5NQVNLKDMsIDApCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19ERl9TSElGVCA0CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19ERl9NQVNLIEJJVCg0KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfVFNPX0VOX1NISUZUIDcKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX1RTT19FTl9NQVNLIEJJVCg3KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTDRfUFJPVE9fSURYX1NISUZUIDgKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0w0X1BST1RPX0lEWF9NQVNLIEdFTk1BU0soMTIsIDgpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MM19DU1VNX0VOX1NISUZUIDEzCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MM19DU1VNX0VOX01BU0sgQklUKDEzKQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTDRfQ1NVTV9FTl9TSElGVCAxNAorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfTDRfQ1NVTV9FTl9NQVNLIEJJVCgxNCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0VUSEVSTkVUX0ZDU19ESVNfU0hJRlQgMTUKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0VUSEVSTkVUX0ZDU19ESVNfTUFTSyBCSVQoMTUpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19MNF9DU1VNX1BBUlRJQUxfU0hJRlQgMTcKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0w0X0NTVU1fUEFSVElBTF9NQVNLIEJJVCgxNykKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX1JFUV9JRF9MT19TSElGVCAyMgorI2RlZmluZSBFTkFfRVRIX0lPX1RYX0RFU0NfUkVRX0lEX0xPX01BU0sgR0VOTUFTSygzMSwgMjIpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfREVTQ19BRERSX0hJX01BU0sgR0VOTUFTSygxNSwgMCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0hFQURFUl9MRU5HVEhfU0hJRlQgMjQKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9ERVNDX0hFQURFUl9MRU5HVEhfTUFTSyBHRU5NQVNLKDMxLCAyNCkKKworLyogdHhfbWV0YV9kZXNjICovCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX1JFUV9JRF9MT19NQVNLIEdFTk1BU0soOSwgMCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfRVhUX1ZBTElEX1NISUZUIDE0CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0VYVF9WQUxJRF9NQVNLIEJJVCgxNCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTVNTX0hJX1NISUZUIDE2CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01TU19ISV9NQVNLIEdFTk1BU0soMTksIDE2KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19FVEhfTUVUQV9UWVBFX1NISUZUIDIwCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0VUSF9NRVRBX1RZUEVfTUFTSyBCSVQoMjApCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01FVEFfU1RPUkVfU0hJRlQgMjEKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTUVUQV9TVE9SRV9NQVNLIEJJVCgyMSkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTUVUQV9ERVNDX1NISUZUIDIzCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01FVEFfREVTQ19NQVNLIEJJVCgyMykKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfUEhBU0VfU0hJRlQgMjQKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfUEhBU0VfTUFTSyBCSVQoMjQpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0ZJUlNUX1NISUZUIDI2CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0ZJUlNUX01BU0sgQklUKDI2KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MQVNUX1NISUZUIDI3CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0xBU1RfTUFTSyBCSVQoMjcpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0NPTVBfUkVRX1NISUZUIDI4CisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0NPTVBfUkVRX01BU0sgQklUKDI4KQorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19SRVFfSURfSElfTUFTSyBHRU5NQVNLKDUsIDApCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0wzX0hEUl9MRU5fTUFTSyBHRU5NQVNLKDcsIDApCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX0wzX0hEUl9PRkZfU0hJRlQgOAorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MM19IRFJfT0ZGX01BU0sgR0VOTUFTSygxNSwgOCkKKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9NRVRBX0RFU0NfTDRfSERSX0xFTl9JTl9XT1JEU19TSElGVCAxNgorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19MNF9IRFJfTEVOX0lOX1dPUkRTX01BU0sgR0VOTUFTSygyMSwgMTYpCisjZGVmaW5lIEVOQV9FVEhfSU9fVFhfTUVUQV9ERVNDX01TU19MT19TSElGVCAyMgorI2RlZmluZSBFTkFfRVRIX0lPX1RYX01FVEFfREVTQ19NU1NfTE9fTUFTSyBHRU5NQVNLKDMxLCAyMikKKworLyogdHhfY2Rlc2MgKi8KKyNkZWZpbmUgRU5BX0VUSF9JT19UWF9DREVTQ19QSEFTRV9NQVNLIEJJVCgwKQorCisvKiByeF9kZXNjICovCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfREVTQ19QSEFTRV9NQVNLIEJJVCgwKQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0RFU0NfRklSU1RfU0hJRlQgMgorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0RFU0NfRklSU1RfTUFTSyBCSVQoMikKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9ERVNDX0xBU1RfU0hJRlQgMworI2RlZmluZSBFTkFfRVRIX0lPX1JYX0RFU0NfTEFTVF9NQVNLIEJJVCgzKQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0RFU0NfQ09NUF9SRVFfU0hJRlQgNAorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0RFU0NfQ09NUF9SRVFfTUFTSyBCSVQoNCkKKworLyogcnhfY2Rlc2NfYmFzZSAqLworI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDNfUFJPVE9fSURYX01BU0sgR0VOTUFTSyg0LCAwKQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfU1JDX1ZMQU5fQ05UX1NISUZUIDUKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX1NSQ19WTEFOX0NOVF9NQVNLIEdFTk1BU0soNiwgNSkKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0w0X1BST1RPX0lEWF9TSElGVCA4CisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MNF9QUk9UT19JRFhfTUFTSyBHRU5NQVNLKDEyLCA4KQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDNfQ1NVTV9FUlJfU0hJRlQgMTMKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0wzX0NTVU1fRVJSX01BU0sgQklUKDEzKQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDRfQ1NVTV9FUlJfU0hJRlQgMTQKKyNkZWZpbmUgRU5BX0VUSF9JT19SWF9DREVTQ19CQVNFX0w0X0NTVU1fRVJSX01BU0sgQklUKDE0KQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfSVBWNF9GUkFHX1NISUZUIDE1CisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9JUFY0X0ZSQUdfTUFTSyBCSVQoMTUpCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9QSEFTRV9TSElGVCAyNAorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfUEhBU0VfTUFTSyBCSVQoMjQpCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MM19DU1VNMl9TSElGVCAyNQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfTDNfQ1NVTTJfTUFTSyBCSVQoMjUpCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9GSVJTVF9TSElGVCAyNgorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfRklSU1RfTUFTSyBCSVQoMjYpCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MQVNUX1NISUZUIDI3CisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9MQVNUX01BU0sgQklUKDI3KQorI2RlZmluZSBFTkFfRVRIX0lPX1JYX0NERVNDX0JBU0VfQlVGRkVSX1NISUZUIDMwCisjZGVmaW5lIEVOQV9FVEhfSU9fUlhfQ0RFU0NfQkFTRV9CVUZGRVJfTUFTSyBCSVQoMzApCisKKy8qIGludHJfcmVnICovCisjZGVmaW5lIEVOQV9FVEhfSU9fSU5UUl9SRUdfUlhfSU5UUl9ERUxBWV9NQVNLIEdFTk1BU0soMTQsIDApCisjZGVmaW5lIEVOQV9FVEhfSU9fSU5UUl9SRUdfVFhfSU5UUl9ERUxBWV9TSElGVCAxNQorI2RlZmluZSBFTkFfRVRIX0lPX0lOVFJfUkVHX1RYX0lOVFJfREVMQVlfTUFTSyBHRU5NQVNLKDI5LCAxNSkKKyNkZWZpbmUgRU5BX0VUSF9JT19JTlRSX1JFR19JTlRSX1VOTUFTS19TSElGVCAzMAorI2RlZmluZSBFTkFfRVRIX0lPX0lOVFJfUkVHX0lOVFJfVU5NQVNLX01BU0sgQklUKDMwKQorCisvKiBudW1hX25vZGVfY2ZnX3JlZyAqLworI2RlZmluZSBFTkFfRVRIX0lPX05VTUFfTk9ERV9DRkdfUkVHX05VTUFfTUFTSyBHRU5NQVNLKDcsIDApCisjZGVmaW5lIEVOQV9FVEhfSU9fTlVNQV9OT0RFX0NGR19SRUdfRU5BQkxFRF9TSElGVCAzMQorI2RlZmluZSBFTkFfRVRIX0lPX05VTUFfTk9ERV9DRkdfUkVHX0VOQUJMRURfTUFTSyBCSVQoMzEpCisKKyNlbmRpZiAvKl9FTkFfRVRIX0lPX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGh0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiMjMzOGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9ldGh0b29sLmMKQEAgLTAsMCArMSw4OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgImVuYV9uZXRkZXYuaCIKKworc3RydWN0IGVuYV9zdGF0cyB7CisJY2hhciBuYW1lW0VUSF9HU1RSSU5HX0xFTl07CisJaW50IHN0YXRfb2Zmc2V0OworfTsKKworI2RlZmluZSBFTkFfU1RBVF9FTkFfQ09NX0VOVFJZKHN0YXQpIHsgXAorCS5uYW1lID0gI3N0YXQsIFwKKwkuc3RhdF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgZW5hX2NvbV9zdGF0c19hZG1pbiwgc3RhdCkgXAorfQorCisjZGVmaW5lIEVOQV9TVEFUX0VOVFJZKHN0YXQsIHN0YXRfdHlwZSkgeyBcCisJLm5hbWUgPSAjc3RhdCwgXAorCS5zdGF0X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBlbmFfc3RhdHNfIyNzdGF0X3R5cGUsIHN0YXQpIFwKK30KKworI2RlZmluZSBFTkFfU1RBVF9SWF9FTlRSWShzdGF0KSBcCisJRU5BX1NUQVRfRU5UUlkoc3RhdCwgcngpCisKKyNkZWZpbmUgRU5BX1NUQVRfVFhfRU5UUlkoc3RhdCkgXAorCUVOQV9TVEFUX0VOVFJZKHN0YXQsIHR4KQorCisjZGVmaW5lIEVOQV9TVEFUX0dMT0JBTF9FTlRSWShzdGF0KSBcCisJRU5BX1NUQVRfRU5UUlkoc3RhdCwgZGV2KQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGVuYV9zdGF0cyBlbmFfc3RhdHNfZ2xvYmFsX3N0cmluZ3NbXSA9IHsKKwlFTkFfU1RBVF9HTE9CQUxfRU5UUlkodHhfdGltZW91dCksCisJRU5BX1NUQVRfR0xPQkFMX0VOVFJZKGlvX3N1c3BlbmQpLAorCUVOQV9TVEFUX0dMT0JBTF9FTlRSWShpb19yZXN1bWUpLAorCUVOQV9TVEFUX0dMT0JBTF9FTlRSWSh3ZF9leHBpcmVkKSwKKwlFTkFfU1RBVF9HTE9CQUxfRU5UUlkoaW50ZXJmYWNlX3VwKSwKKwlFTkFfU1RBVF9HTE9CQUxfRU5UUlkoaW50ZXJmYWNlX2Rvd24pLAorCUVOQV9TVEFUX0dMT0JBTF9FTlRSWShhZG1pbl9xX3BhdXNlKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW5hX3N0YXRzIGVuYV9zdGF0c190eF9zdHJpbmdzW10gPSB7CisJRU5BX1NUQVRfVFhfRU5UUlkoY250KSwKKwlFTkFfU1RBVF9UWF9FTlRSWShieXRlcyksCisJRU5BX1NUQVRfVFhfRU5UUlkocXVldWVfc3RvcCksCisJRU5BX1NUQVRfVFhfRU5UUlkocXVldWVfd2FrZXVwKSwKKwlFTkFfU1RBVF9UWF9FTlRSWShkbWFfbWFwcGluZ19lcnIpLAorCUVOQV9TVEFUX1RYX0VOVFJZKGxpbmVhcml6ZSksCisJRU5BX1NUQVRfVFhfRU5UUlkobGluZWFyaXplX2ZhaWxlZCksCisJRU5BX1NUQVRfVFhfRU5UUlkobmFwaV9jb21wKSwKKwlFTkFfU1RBVF9UWF9FTlRSWSh0eF9wb2xsKSwKKwlFTkFfU1RBVF9UWF9FTlRSWShkb29yYmVsbHMpLAorCUVOQV9TVEFUX1RYX0VOVFJZKHByZXBhcmVfY3R4X2VyciksCisJRU5BX1NUQVRfVFhfRU5UUlkobWlzc2luZ190eF9jb21wKSwKKwlFTkFfU1RBVF9UWF9FTlRSWShiYWRfcmVxX2lkKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW5hX3N0YXRzIGVuYV9zdGF0c19yeF9zdHJpbmdzW10gPSB7CisJRU5BX1NUQVRfUlhfRU5UUlkoY250KSwKKwlFTkFfU1RBVF9SWF9FTlRSWShieXRlcyksCisJRU5BX1NUQVRfUlhfRU5UUlkocmVmaWxfcGFydGlhbCksCisJRU5BX1NUQVRfUlhfRU5UUlkoYmFkX2NzdW0pLAorCUVOQV9TVEFUX1JYX0VOVFJZKHBhZ2VfYWxsb2NfZmFpbCksCisJRU5BX1NUQVRfUlhfRU5UUlkoc2tiX2FsbG9jX2ZhaWwpLAorCUVOQV9TVEFUX1JYX0VOVFJZKGRtYV9tYXBwaW5nX2VyciksCisJRU5BX1NUQVRfUlhfRU5UUlkoYmFkX2Rlc2NfbnVtKSwKKwlFTkFfU1RBVF9SWF9FTlRSWShyeF9jb3B5YnJlYWtfcGt0KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW5hX3N0YXRzIGVuYV9zdGF0c19lbmFfY29tX3N0cmluZ3NbXSA9IHsKKwlFTkFfU1RBVF9FTkFfQ09NX0VOVFJZKGFib3J0ZWRfY21kKSwKKwlFTkFfU1RBVF9FTkFfQ09NX0VOVFJZKHN1Ym1pdHRlZF9jbWQpLAorCUVOQV9TVEFUX0VOQV9DT01fRU5UUlkoY29tcGxldGVkX2NtZCksCisJRU5BX1NUQVRfRU5BX0NPTV9FTlRSWShvdXRfb2Zfc3BhY2UpLAorCUVOQV9TVEFUX0VOQV9DT01fRU5UUlkobm9fY29tcGxldGlvbiksCit9OworCisjZGVmaW5lIEVOQV9TVEFUU19BUlJBWV9HTE9CQUwJQVJSQVlfU0laRShlbmFfc3RhdHNfZ2xvYmFsX3N0cmluZ3MpCisjZGVmaW5lIEVOQV9TVEFUU19BUlJBWV9UWAlBUlJBWV9TSVpFKGVuYV9zdGF0c190eF9zdHJpbmdzKQorI2RlZmluZSBFTkFfU1RBVFNfQVJSQVlfUlgJQVJSQVlfU0laRShlbmFfc3RhdHNfcnhfc3RyaW5ncykKKyNkZWZpbmUgRU5BX1NUQVRTX0FSUkFZX0VOQV9DT00JQVJSQVlfU0laRShlbmFfc3RhdHNfZW5hX2NvbV9zdHJpbmdzKQorCitzdGF0aWMgdm9pZCBlbmFfc2FmZV91cGRhdGVfc3RhdCh1NjQgKnNyYywgdTY0ICpkc3QsCisJCQkJIHN0cnVjdCB1NjRfc3RhdHNfc3luYyAqc3luY3ApCit7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCisJZG8geworCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9pcnEoc3luY3ApOworCQkqKGRzdCkgPSAqc3JjOworCX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeV9pcnEoc3luY3AsIHN0YXJ0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9xdWV1ZV9zdGF0cyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCAqKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGVuYV9zdGF0cyAqZW5hX3N0YXRzOworCXN0cnVjdCBlbmFfcmluZyAqcmluZzsKKworCXU2NCAqcHRyOworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQkvKiBUeCBzdGF0cyAqLworCQlyaW5nID0gJmFkYXB0ZXItPnR4X3JpbmdbaV07CisKKwkJZm9yIChqID0gMDsgaiA8IEVOQV9TVEFUU19BUlJBWV9UWDsgaisrKSB7CisJCQllbmFfc3RhdHMgPSAmZW5hX3N0YXRzX3R4X3N0cmluZ3Nbal07CisKKwkJCXB0ciA9ICh1NjQgKikoKHVpbnRwdHJfdCkmcmluZy0+dHhfc3RhdHMgKworCQkJCSh1aW50cHRyX3QpZW5hX3N0YXRzLT5zdGF0X29mZnNldCk7CisKKwkJCWVuYV9zYWZlX3VwZGF0ZV9zdGF0KHB0ciwgKCpkYXRhKSsrLCAmcmluZy0+c3luY3ApOworCQl9CisKKwkJLyogUnggc3RhdHMgKi8KKwkJcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nW2ldOworCisJCWZvciAoaiA9IDA7IGogPCBFTkFfU1RBVFNfQVJSQVlfUlg7IGorKykgeworCQkJZW5hX3N0YXRzID0gJmVuYV9zdGF0c19yeF9zdHJpbmdzW2pdOworCisJCQlwdHIgPSAodTY0ICopKCh1aW50cHRyX3QpJnJpbmctPnJ4X3N0YXRzICsKKwkJCQkodWludHB0cl90KWVuYV9zdGF0cy0+c3RhdF9vZmZzZXQpOworCisJCQllbmFfc2FmZV91cGRhdGVfc3RhdChwdHIsICgqZGF0YSkrKywgJnJpbmctPnN5bmNwKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZW5hX2Rldl9hZG1pbl9xdWV1ZV9zdGF0cyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIHU2NCAqKmRhdGEpCit7CisJY29uc3Qgc3RydWN0IGVuYV9zdGF0cyAqZW5hX3N0YXRzOworCXUzMiAqcHRyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVOQV9TVEFUU19BUlJBWV9FTkFfQ09NOyBpKyspIHsKKwkJZW5hX3N0YXRzID0gJmVuYV9zdGF0c19lbmFfY29tX3N0cmluZ3NbaV07CisKKwkJcHRyID0gKHUzMiAqKSgodWludHB0cl90KSZhZGFwdGVyLT5lbmFfZGV2LT5hZG1pbl9xdWV1ZS5zdGF0cyArCisJCQkodWludHB0cl90KWVuYV9zdGF0cy0+c3RhdF9vZmZzZXQpOworCisJCSooKmRhdGEpKysgPSAqcHRyOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsCisJCQkJICB1NjQgKmRhdGEpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwljb25zdCBzdHJ1Y3QgZW5hX3N0YXRzICplbmFfc3RhdHM7CisJdTY0ICpwdHI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRU5BX1NUQVRTX0FSUkFZX0dMT0JBTDsgaSsrKSB7CisJCWVuYV9zdGF0cyA9ICZlbmFfc3RhdHNfZ2xvYmFsX3N0cmluZ3NbaV07CisKKwkJcHRyID0gKHU2NCAqKSgodWludHB0cl90KSZhZGFwdGVyLT5kZXZfc3RhdHMgKworCQkJKHVpbnRwdHJfdCllbmFfc3RhdHMtPnN0YXRfb2Zmc2V0KTsKKworCQllbmFfc2FmZV91cGRhdGVfc3RhdChwdHIsIGRhdGErKywgJmFkYXB0ZXItPnN5bmNwKTsKKwl9CisKKwllbmFfcXVldWVfc3RhdHMoYWRhcHRlciwgJmRhdGEpOworCWVuYV9kZXZfYWRtaW5fcXVldWVfc3RhdHMoYWRhcHRlciwgJmRhdGEpOworfQorCitpbnQgZW5hX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBzc2V0KQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAoc3NldCAhPSBFVEhfU1NfU1RBVFMpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJldHVybiAgYWRhcHRlci0+bnVtX3F1ZXVlcyAqIChFTkFfU1RBVFNfQVJSQVlfVFggKyBFTkFfU1RBVFNfQVJSQVlfUlgpCisJCSsgRU5BX1NUQVRTX0FSUkFZX0dMT0JBTCArIEVOQV9TVEFUU19BUlJBWV9FTkFfQ09NOworfQorCitzdGF0aWMgdm9pZCBlbmFfcXVldWVfc3RyaW5ncyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICoqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgZW5hX3N0YXRzICplbmFfc3RhdHM7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCS8qIFR4IHN0YXRzICovCisJCWZvciAoaiA9IDA7IGogPCBFTkFfU1RBVFNfQVJSQVlfVFg7IGorKykgeworCQkJZW5hX3N0YXRzID0gJmVuYV9zdGF0c190eF9zdHJpbmdzW2pdOworCisJCQlzbnByaW50ZigqZGF0YSwgRVRIX0dTVFJJTkdfTEVOLAorCQkJCSAicXVldWVfJXVfdHhfJXMiLCBpLCBlbmFfc3RhdHMtPm5hbWUpOworCQkJICgqZGF0YSkgKz0gRVRIX0dTVFJJTkdfTEVOOworCQl9CisJCS8qIFJ4IHN0YXRzICovCisJCWZvciAoaiA9IDA7IGogPCBFTkFfU1RBVFNfQVJSQVlfUlg7IGorKykgeworCQkJZW5hX3N0YXRzID0gJmVuYV9zdGF0c19yeF9zdHJpbmdzW2pdOworCisJCQlzbnByaW50ZigqZGF0YSwgRVRIX0dTVFJJTkdfTEVOLAorCQkJCSAicXVldWVfJXVfcnhfJXMiLCBpLCBlbmFfc3RhdHMtPm5hbWUpOworCQkJKCpkYXRhKSArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9jb21fZGV2X3N0cmluZ3ModTggKipkYXRhKQoreworCWNvbnN0IHN0cnVjdCBlbmFfc3RhdHMgKmVuYV9zdGF0czsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFTkFfU1RBVFNfQVJSQVlfRU5BX0NPTTsgaSsrKSB7CisJCWVuYV9zdGF0cyA9ICZlbmFfc3RhdHNfZW5hX2NvbV9zdHJpbmdzW2ldOworCisJCXNucHJpbnRmKCpkYXRhLCBFVEhfR1NUUklOR19MRU4sCisJCQkgImVuYV9hZG1pbl9xXyVzIiwgZW5hX3N0YXRzLT5uYW1lKTsKKwkJKCpkYXRhKSArPSBFVEhfR1NUUklOR19MRU47CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfZ2V0X3N0cmluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHNzZXQsIHU4ICpkYXRhKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJY29uc3Qgc3RydWN0IGVuYV9zdGF0cyAqZW5hX3N0YXRzOworCWludCBpOworCisJaWYgKHNzZXQgIT0gRVRIX1NTX1NUQVRTKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgRU5BX1NUQVRTX0FSUkFZX0dMT0JBTDsgaSsrKSB7CisJCWVuYV9zdGF0cyA9ICZlbmFfc3RhdHNfZ2xvYmFsX3N0cmluZ3NbaV07CisKKwkJbWVtY3B5KGRhdGEsIGVuYV9zdGF0cy0+bmFtZSwgRVRIX0dTVFJJTkdfTEVOKTsKKwkJZGF0YSArPSBFVEhfR1NUUklOR19MRU47CisJfQorCisJZW5hX3F1ZXVlX3N0cmluZ3MoYWRhcHRlciwgJmRhdGEpOworCWVuYV9jb21fZGV2X3N0cmluZ3MoJmRhdGEpOworfQorCitzdGF0aWMgaW50IGVuYV9nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpsaW5rX2tzZXR0aW5ncykKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdHVyZV9saW5rX2Rlc2MgKmxpbms7CisJc3RydWN0IGVuYV9hZG1pbl9nZXRfZmVhdF9yZXNwIGZlYXRfcmVzcDsKKwlpbnQgcmM7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2xpbmtfcGFyYW1zKGVuYV9kZXYsICZmZWF0X3Jlc3ApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJbGluayA9ICZmZWF0X3Jlc3AudS5saW5rOworCWxpbmtfa3NldHRpbmdzLT5iYXNlLnNwZWVkID0gbGluay0+c3BlZWQ7CisKKwlpZiAobGluay0+ZmxhZ3MgJiBFTkFfQURNSU5fR0VUX0ZFQVRVUkVfTElOS19ERVNDX0FVVE9ORUdfTUFTSykgeworCQlldGh0b29sX2xpbmtfa3NldHRpbmdzX2FkZF9saW5rX21vZGUobGlua19rc2V0dGluZ3MsCisJCQkJCQkgICAgIHN1cHBvcnRlZCwgQXV0b25lZyk7CisJCWV0aHRvb2xfbGlua19rc2V0dGluZ3NfYWRkX2xpbmtfbW9kZShsaW5rX2tzZXR0aW5ncywKKwkJCQkJCSAgICAgc3VwcG9ydGVkLCBBdXRvbmVnKTsKKwl9CisKKwlsaW5rX2tzZXR0aW5ncy0+YmFzZS5hdXRvbmVnID0KKwkJKGxpbmstPmZsYWdzICYgRU5BX0FETUlOX0dFVF9GRUFUVVJFX0xJTktfREVTQ19BVVRPTkVHX01BU0spID8KKwkJQVVUT05FR19FTkFCTEUgOiBBVVRPTkVHX0RJU0FCTEU7CisKKwlsaW5rX2tzZXR0aW5ncy0+YmFzZS5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmNvYWxlc2NlKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJc3RydWN0IGVuYV9pbnRyX21vZGVyX2VudHJ5IGludHJfbW9kZXJfZW50cnk7CisKKwlpZiAoIWVuYV9jb21faW50ZXJydXB0X21vZGVyYXRpb25fc3VwcG9ydGVkKGVuYV9kZXYpKSB7CisJCS8qIHRoZSBkZXZpZSBkb2Vzbid0IHN1cHBvcnQgaW50ZXJydXB0IG1vZGVyYXRpb24gKi8KKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwljb2FsZXNjZS0+dHhfY29hbGVzY2VfdXNlY3MgPQorCQllbmFfY29tX2dldF9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3R4KGVuYV9kZXYpIC8KKwkJCWVuYV9kZXYtPmludHJfZGVsYXlfcmVzb2x1dGlvbjsKKwlpZiAoIWVuYV9jb21fZ2V0X2FkYXB0aXZlX21vZGVyYXRpb25fZW5hYmxlZChlbmFfZGV2KSkgeworCQljb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3MgPQorCQkJZW5hX2NvbV9nZXRfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF9yeChlbmFfZGV2KQorCQkJLyBlbmFfZGV2LT5pbnRyX2RlbGF5X3Jlc29sdXRpb247CisJfSBlbHNlIHsKKwkJZW5hX2NvbV9nZXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5KGFkYXB0ZXItPmVuYV9kZXYsIEVOQV9JTlRSX01PREVSX0xPV0VTVCwgJmludHJfbW9kZXJfZW50cnkpOworCQljb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3NfbG93ID0gaW50cl9tb2Rlcl9lbnRyeS5pbnRyX21vZGVyX2ludGVydmFsOworCQljb2FsZXNjZS0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfbG93ID0gaW50cl9tb2Rlcl9lbnRyeS5wa3RzX3Blcl9pbnRlcnZhbDsKKworCQllbmFfY29tX2dldF9pbnRyX21vZGVyYXRpb25fZW50cnkoYWRhcHRlci0+ZW5hX2RldiwgRU5BX0lOVFJfTU9ERVJfTUlELCAmaW50cl9tb2Rlcl9lbnRyeSk7CisJCWNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2VjcyA9IGludHJfbW9kZXJfZW50cnkuaW50cl9tb2Rlcl9pbnRlcnZhbDsKKwkJY29hbGVzY2UtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gaW50cl9tb2Rlcl9lbnRyeS5wa3RzX3Blcl9pbnRlcnZhbDsKKworCQllbmFfY29tX2dldF9pbnRyX21vZGVyYXRpb25fZW50cnkoYWRhcHRlci0+ZW5hX2RldiwgRU5BX0lOVFJfTU9ERVJfSElHSEVTVCwgJmludHJfbW9kZXJfZW50cnkpOworCQljb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3NfaGlnaCA9IGludHJfbW9kZXJfZW50cnkuaW50cl9tb2Rlcl9pbnRlcnZhbDsKKwkJY29hbGVzY2UtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2hpZ2ggPSBpbnRyX21vZGVyX2VudHJ5LnBrdHNfcGVyX2ludGVydmFsOworCX0KKwljb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlID0KKwkJZW5hX2NvbV9nZXRfYWRhcHRpdmVfbW9kZXJhdGlvbl9lbmFibGVkKGVuYV9kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV91cGRhdGVfdHhfcmluZ3NfaW50cl9tb2RlcmF0aW9uKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBpOworCisJdmFsID0gZW5hX2NvbV9nZXRfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF90eChhZGFwdGVyLT5lbmFfZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCWFkYXB0ZXItPnR4X3JpbmdbaV0uc21vb3RoZWRfaW50ZXJ2YWwgPSB2YWw7Cit9CisKK3N0YXRpYyBpbnQgZW5hX3NldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqY29hbGVzY2UpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwlzdHJ1Y3QgZW5hX2ludHJfbW9kZXJfZW50cnkgaW50cl9tb2Rlcl9lbnRyeTsKKwlpbnQgcmM7CisKKwlpZiAoIWVuYV9jb21faW50ZXJydXB0X21vZGVyYXRpb25fc3VwcG9ydGVkKGVuYV9kZXYpKSB7CisJCS8qIHRoZSBkZXZpZSBkb2Vzbid0IHN1cHBvcnQgaW50ZXJydXB0IG1vZGVyYXRpb24gKi8KKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWlmIChjb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3NfaXJxIHx8CisJICAgIGNvYWxlc2NlLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEgfHwKKwkgICAgY29hbGVzY2UtPnR4X2NvYWxlc2NlX3VzZWNzX2lycSB8fAorCSAgICBjb2FsZXNjZS0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgfHwKKwkgICAgY29hbGVzY2UtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSB8fAorCSAgICBjb2FsZXNjZS0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MgfHwKKwkgICAgY29hbGVzY2UtPnVzZV9hZGFwdGl2ZV90eF9jb2FsZXNjZSB8fAorCSAgICBjb2FsZXNjZS0+cGt0X3JhdGVfbG93IHx8CisJICAgIGNvYWxlc2NlLT50eF9jb2FsZXNjZV91c2Vjc19sb3cgfHwKKwkgICAgY29hbGVzY2UtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2xvdyB8fAorCSAgICBjb2FsZXNjZS0+cGt0X3JhdGVfaGlnaCB8fAorCSAgICBjb2FsZXNjZS0+dHhfY29hbGVzY2VfdXNlY3NfaGlnaCB8fAorCSAgICBjb2FsZXNjZS0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaGlnaCB8fAorCSAgICBjb2FsZXNjZS0+cmF0ZV9zYW1wbGVfaW50ZXJ2YWwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmMgPSBlbmFfY29tX3VwZGF0ZV9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3R4KGVuYV9kZXYsCisJCQkJCQkJICAgICAgIGNvYWxlc2NlLT50eF9jb2FsZXNjZV91c2Vjcyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwllbmFfdXBkYXRlX3R4X3JpbmdzX2ludHJfbW9kZXJhdGlvbihhZGFwdGVyKTsKKworCWlmIChlbmFfY29tX2dldF9hZGFwdGl2ZV9tb2RlcmF0aW9uX2VuYWJsZWQoZW5hX2RldikpIHsKKwkJaWYgKCFjb2FsZXNjZS0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlKSB7CisJCQllbmFfY29tX2Rpc2FibGVfYWRhcHRpdmVfbW9kZXJhdGlvbihlbmFfZGV2KTsKKwkJCXJjID0gZW5hX2NvbV91cGRhdGVfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF9yeChlbmFfZGV2LAorCQkJCQkJCQkJICAgICAgIGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjcyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9IGVsc2UgeyAvKiB3YXMgaW4gbm9uLWFkYXB0aXZlIG1vZGUgKi8KKwkJaWYgKGNvYWxlc2NlLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UpIHsKKwkJCWVuYV9jb21fZW5hYmxlX2FkYXB0aXZlX21vZGVyYXRpb24oZW5hX2Rldik7CisJCX0gZWxzZSB7CisJCQlyYyA9IGVuYV9jb21fdXBkYXRlX25vbmFkYXB0aXZlX21vZGVyYXRpb25faW50ZXJ2YWxfcngoZW5hX2RldiwKKwkJCQkJCQkJCSAgICAgICBjb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3MpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJaW50cl9tb2Rlcl9lbnRyeS5pbnRyX21vZGVyX2ludGVydmFsID0gY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzX2xvdzsKKwlpbnRyX21vZGVyX2VudHJ5LnBrdHNfcGVyX2ludGVydmFsID0gY29hbGVzY2UtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2xvdzsKKwlpbnRyX21vZGVyX2VudHJ5LmJ5dGVzX3Blcl9pbnRlcnZhbCA9IEVOQV9JTlRSX0JZVEVfQ09VTlRfTk9UX1NVUFBPUlRFRDsKKwllbmFfY29tX2luaXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5KGFkYXB0ZXItPmVuYV9kZXYsIEVOQV9JTlRSX01PREVSX0xPV0VTVCwgJmludHJfbW9kZXJfZW50cnkpOworCisJaW50cl9tb2Rlcl9lbnRyeS5pbnRyX21vZGVyX2ludGVydmFsID0gY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzOworCWludHJfbW9kZXJfZW50cnkucGt0c19wZXJfaW50ZXJ2YWwgPSBjb2FsZXNjZS0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CisJaW50cl9tb2Rlcl9lbnRyeS5ieXRlc19wZXJfaW50ZXJ2YWwgPSBFTkFfSU5UUl9CWVRFX0NPVU5UX05PVF9TVVBQT1JURUQ7CisJZW5hX2NvbV9pbml0X2ludHJfbW9kZXJhdGlvbl9lbnRyeShhZGFwdGVyLT5lbmFfZGV2LCBFTkFfSU5UUl9NT0RFUl9NSUQsICZpbnRyX21vZGVyX2VudHJ5KTsKKworCWludHJfbW9kZXJfZW50cnkuaW50cl9tb2Rlcl9pbnRlcnZhbCA9IGNvYWxlc2NlLT5yeF9jb2FsZXNjZV91c2Vjc19oaWdoOworCWludHJfbW9kZXJfZW50cnkucGt0c19wZXJfaW50ZXJ2YWwgPSBjb2FsZXNjZS0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXNfaGlnaDsKKwlpbnRyX21vZGVyX2VudHJ5LmJ5dGVzX3Blcl9pbnRlcnZhbCA9IEVOQV9JTlRSX0JZVEVfQ09VTlRfTk9UX1NVUFBPUlRFRDsKKwllbmFfY29tX2luaXRfaW50cl9tb2RlcmF0aW9uX2VudHJ5KGFkYXB0ZXItPmVuYV9kZXYsIEVOQV9JTlRSX01PREVSX0hJR0hFU1QsICZpbnRyX21vZGVyX2VudHJ5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGVuYV9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJcmV0dXJuIGFkYXB0ZXItPm1zZ19lbmFibGU7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlhZGFwdGVyLT5tc2dfZW5hYmxlID0gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTU9EVUxFX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9NT0RVTEVfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKKwkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgZW5hX3JpbmcgKnR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZ1swXTsKKwlzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZ1swXTsKKworCXJpbmctPnJ4X21heF9wZW5kaW5nID0gcnhfcmluZy0+cmluZ19zaXplOworCXJpbmctPnR4X21heF9wZW5kaW5nID0gdHhfcmluZy0+cmluZ19zaXplOworCXJpbmctPnJ4X3BlbmRpbmcgPSByeF9yaW5nLT5yaW5nX3NpemU7CisJcmluZy0+dHhfcGVuZGluZyA9IHR4X3JpbmctPnJpbmdfc2l6ZTsKK30KKworc3RhdGljIHUzMiBlbmFfZmxvd19oYXNoX3RvX2Zsb3dfdHlwZSh1MTYgaGFzaF9maWVsZHMpCit7CisJdTMyIGRhdGEgPSAwOworCisJaWYgKGhhc2hfZmllbGRzICYgRU5BX0FETUlOX1JTU19MMl9EQSkKKwkJZGF0YSB8PSBSWEhfTDJEQTsKKworCWlmIChoYXNoX2ZpZWxkcyAmIEVOQV9BRE1JTl9SU1NfTDNfREEpCisJCWRhdGEgfD0gUlhIX0lQX0RTVDsKKworCWlmIChoYXNoX2ZpZWxkcyAmIEVOQV9BRE1JTl9SU1NfTDNfU0EpCisJCWRhdGEgfD0gUlhIX0lQX1NSQzsKKworCWlmIChoYXNoX2ZpZWxkcyAmIEVOQV9BRE1JTl9SU1NfTDRfRFApCisJCWRhdGEgfD0gUlhIX0w0X0JfMl8zOworCisJaWYgKGhhc2hfZmllbGRzICYgRU5BX0FETUlOX1JTU19MNF9TUCkKKwkJZGF0YSB8PSBSWEhfTDRfQl8wXzE7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHUxNiBlbmFfZmxvd19kYXRhX3RvX2Zsb3dfaGFzaCh1MzIgaGFzaF9maWVsZHMpCit7CisJdTE2IGRhdGEgPSAwOworCisJaWYgKGhhc2hfZmllbGRzICYgUlhIX0wyREEpCisJCWRhdGEgfD0gRU5BX0FETUlOX1JTU19MMl9EQTsKKworCWlmIChoYXNoX2ZpZWxkcyAmIFJYSF9JUF9EU1QpCisJCWRhdGEgfD0gRU5BX0FETUlOX1JTU19MM19EQTsKKworCWlmIChoYXNoX2ZpZWxkcyAmIFJYSF9JUF9TUkMpCisJCWRhdGEgfD0gRU5BX0FETUlOX1JTU19MM19TQTsKKworCWlmIChoYXNoX2ZpZWxkcyAmIFJYSF9MNF9CXzJfMykKKwkJZGF0YSB8PSBFTkFfQURNSU5fUlNTX0w0X0RQOworCisJaWYgKGhhc2hfZmllbGRzICYgUlhIX0w0X0JfMF8xKQorCQlkYXRhIHw9IEVOQV9BRE1JTl9SU1NfTDRfU1A7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBlbmFfZ2V0X3Jzc19oYXNoKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kKQoreworCWVudW0gZW5hX2FkbWluX2Zsb3dfaGFzaF9wcm90byBwcm90bzsKKwl1MTYgaGFzaF9maWVsZHM7CisJaW50IHJjOworCisJY21kLT5kYXRhID0gMDsKKworCXN3aXRjaCAoY21kLT5mbG93X3R5cGUpIHsKKwljYXNlIFRDUF9WNF9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfVENQNDsKKwkJYnJlYWs7CisJY2FzZSBVRFBfVjRfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX1VEUDQ7CisJCWJyZWFrOworCWNhc2UgVENQX1Y2X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19UQ1A2OworCQlicmVhazsKKwljYXNlIFVEUF9WNl9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfVURQNjsKKwkJYnJlYWs7CisJY2FzZSBJUFY0X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19JUDQ7CisJCWJyZWFrOworCWNhc2UgSVBWNl9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfSVA2OworCQlicmVhazsKKwljYXNlIEVUSEVSX0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19OT1RfSVA7CisJCWJyZWFrOworCWNhc2UgQUhfVjRfRkxPVzoKKwljYXNlIEVTUF9WNF9GTE9XOgorCWNhc2UgQUhfVjZfRkxPVzoKKwljYXNlIEVTUF9WNl9GTE9XOgorCWNhc2UgU0NUUF9WNF9GTE9XOgorCWNhc2UgQUhfRVNQX1Y0X0ZMT1c6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyYyA9IGVuYV9jb21fZ2V0X2hhc2hfY3RybChlbmFfZGV2LCBwcm90bywgJmhhc2hfZmllbGRzKTsKKwlpZiAocmMpIHsKKwkJLyogSWYgZGV2aWNlIGRvbid0IGhhdmUgcGVybWlzc2lvbiwgcmV0dXJuIHVuc3VwcG9ydGVkICovCisJCWlmIChyYyA9PSAtRVBFUk0pCisJCQlyYyA9IC1FT1BOT1RTVVBQOworCQlyZXR1cm4gcmM7CisJfQorCisJY21kLT5kYXRhID0gZW5hX2Zsb3dfaGFzaF90b19mbG93X3R5cGUoaGFzaF9maWVsZHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX3NldF9yc3NfaGFzaChzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKK3sKKwllbnVtIGVuYV9hZG1pbl9mbG93X2hhc2hfcHJvdG8gcHJvdG87CisJdTE2IGhhc2hfZmllbGRzOworCisJc3dpdGNoIChjbWQtPmZsb3dfdHlwZSkgeworCWNhc2UgVENQX1Y0X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19UQ1A0OworCQlicmVhazsKKwljYXNlIFVEUF9WNF9GTE9XOgorCQlwcm90byA9IEVOQV9BRE1JTl9SU1NfVURQNDsKKwkJYnJlYWs7CisJY2FzZSBUQ1BfVjZfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX1RDUDY7CisJCWJyZWFrOworCWNhc2UgVURQX1Y2X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19VRFA2OworCQlicmVhazsKKwljYXNlIElQVjRfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX0lQNDsKKwkJYnJlYWs7CisJY2FzZSBJUFY2X0ZMT1c6CisJCXByb3RvID0gRU5BX0FETUlOX1JTU19JUDY7CisJCWJyZWFrOworCWNhc2UgRVRIRVJfRkxPVzoKKwkJcHJvdG8gPSBFTkFfQURNSU5fUlNTX05PVF9JUDsKKwkJYnJlYWs7CisJY2FzZSBBSF9WNF9GTE9XOgorCWNhc2UgRVNQX1Y0X0ZMT1c6CisJY2FzZSBBSF9WNl9GTE9XOgorCWNhc2UgRVNQX1Y2X0ZMT1c6CisJY2FzZSBTQ1RQX1Y0X0ZMT1c6CisJY2FzZSBBSF9FU1BfVjRfRkxPVzoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWhhc2hfZmllbGRzID0gZW5hX2Zsb3dfZGF0YV90b19mbG93X2hhc2goY21kLT5kYXRhKTsKKworCXJldHVybiBlbmFfY29tX2ZpbGxfaGFzaF9jdHJsKGVuYV9kZXYsIHByb3RvLCBoYXNoX2ZpZWxkcyk7Cit9CisKK3N0YXRpYyBpbnQgZW5hX3NldF9yeG5mYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqaW5mbykKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGluZm8tPmNtZCkgeworCWNhc2UgRVRIVE9PTF9TUlhGSDoKKwkJcmMgPSBlbmFfc2V0X3Jzc19oYXNoKGFkYXB0ZXItPmVuYV9kZXYsIGluZm8pOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfU1JYQ0xTUkxERUw6CisJY2FzZSBFVEhUT09MX1NSWENMU1JMSU5TOgorCWRlZmF1bHQ6CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwKKwkJCSAgIkNvbW1hbmQgcGFyYW1ldGVyICVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGluZm8tPmNtZCk7CisJCXJjID0gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIChyYyA9PSAtRVBFUk0pID8gLUVPUE5PVFNVUFAgOiByYzsKK30KKworc3RhdGljIGludCBlbmFfZ2V0X3J4bmZjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3J4bmZjICppbmZvLAorCQkJIHUzMiAqcnVsZXMpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChpbmZvLT5jbWQpIHsKKwljYXNlIEVUSFRPT0xfR1JYUklOR1M6CisJCWluZm8tPmRhdGEgPSBhZGFwdGVyLT5udW1fcXVldWVzOworCQlyYyA9IDA7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HUlhGSDoKKwkJcmMgPSBlbmFfZ2V0X3Jzc19oYXNoKGFkYXB0ZXItPmVuYV9kZXYsIGluZm8pOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUkxDTlQ6CisJY2FzZSBFVEhUT09MX0dSWENMU1JVTEU6CisJY2FzZSBFVEhUT09MX0dSWENMU1JMQUxMOgorCWRlZmF1bHQ6CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwKKwkJCSAgIkNvbW1hbmQgcGFyYW1ldGVyICVkIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGluZm8tPmNtZCk7CisJCXJjID0gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIChyYyA9PSAtRVBFUk0pID8gLUVPUE5PVFNVUFAgOiByYzsKK30KKworc3RhdGljIHUzMiBlbmFfZ2V0X3J4ZmhfaW5kaXJfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXJldHVybiBFTkFfUlhfUlNTX1RBQkxFX1NJWkU7Cit9CisKK3N0YXRpYyB1MzIgZW5hX2dldF9yeGZoX2tleV9zaXplKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEVOQV9IQVNIX0tFWV9TSVpFOworfQorCitzdGF0aWMgaW50IGVuYV9nZXRfcnhmaChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgKmluZGlyLCB1OCAqa2V5LAorCQkJdTggKmhmdW5jKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJZW51bSBlbmFfYWRtaW5faGFzaF9mdW5jdGlvbnMgZW5hX2Z1bmM7CisJdTggZnVuYzsKKwlpbnQgcmM7CisKKwlyYyA9IGVuYV9jb21faW5kaXJlY3RfdGFibGVfZ2V0KGFkYXB0ZXItPmVuYV9kZXYsIGluZGlyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gZW5hX2NvbV9nZXRfaGFzaF9mdW5jdGlvbihhZGFwdGVyLT5lbmFfZGV2LCAmZW5hX2Z1bmMsIGtleSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlzd2l0Y2ggKGVuYV9mdW5jKSB7CisJY2FzZSBFTkFfQURNSU5fVE9FUExJVFo6CisJCWZ1bmMgPSBFVEhfUlNTX0hBU0hfVE9QOworCQlicmVhazsKKwljYXNlIEVOQV9BRE1JTl9DUkMzMjoKKwkJZnVuYyA9IEVUSF9SU1NfSEFTSF9YT1I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwKKwkJCSAgIkNvbW1hbmQgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJaWYgKGhmdW5jKQorCQkqaGZ1bmMgPSBmdW5jOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVuYV9zZXRfcnhmaChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBjb25zdCB1MzIgKmluZGlyLAorCQkJY29uc3QgdTggKmtleSwgY29uc3QgdTggaGZ1bmMpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCWVudW0gZW5hX2FkbWluX2hhc2hfZnVuY3Rpb25zIGZ1bmM7CisJaW50IHJjLCBpOworCisJaWYgKGluZGlyKSB7CisJCWZvciAoaSA9IDA7IGkgPCBFTkFfUlhfUlNTX1RBQkxFX1NJWkU7IGkrKykgeworCQkJcmMgPSBlbmFfY29tX2luZGlyZWN0X3RhYmxlX2ZpbGxfZW50cnkoZW5hX2RldiwKKwkJCQkJCQkgICAgICAgRU5BX0lPX1JYUV9JRFgoaW5kaXJbaV0pLAorCQkJCQkJCSAgICAgICBpKTsKKwkJCWlmICh1bmxpa2VseShyYykpIHsKKwkJCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsCisJCQkJCSAgIkNhbm5vdCBmaWxsIGluZGlyZWN0IHRhYmxlIChpbmRleCBpcyB0b28gbGFyZ2UpXG4iKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKworCQlyYyA9IGVuYV9jb21faW5kaXJlY3RfdGFibGVfc2V0KGVuYV9kZXYpOworCQlpZiAocmMpIHsKKwkJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwKKwkJCQkgICJDYW5ub3Qgc2V0IGluZGlyZWN0IHRhYmxlXG4iKTsKKwkJCXJldHVybiByYyA9PSAtRVBFUk0gPyAtRU9QTk9UU1VQUCA6IHJjOworCQl9CisJfQorCisJc3dpdGNoIChoZnVuYykgeworCWNhc2UgRVRIX1JTU19IQVNIX1RPUDoKKwkJZnVuYyA9IEVOQV9BRE1JTl9UT0VQTElUWjsKKwkJYnJlYWs7CisJY2FzZSBFVEhfUlNTX0hBU0hfWE9SOgorCQlmdW5jID0gRU5BX0FETUlOX0NSQzMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsICJVbnN1cHBvcnRlZCBoZnVuYyAlZFxuIiwKKwkJCSAgaGZ1bmMpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJaWYgKGtleSkgeworCQlyYyA9IGVuYV9jb21fZmlsbF9oYXNoX2Z1bmN0aW9uKGVuYV9kZXYsIGZ1bmMsIGtleSwKKwkJCQkJCUVOQV9IQVNIX0tFWV9TSVpFLAorCQkJCQkJMHhGRkZGRkZGRik7CisJCWlmICh1bmxpa2VseShyYykpIHsKKwkJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwgIkNhbm5vdCBmaWxsIGtleVxuIik7CisJCQlyZXR1cm4gcmMgPT0gLUVQRVJNID8gLUVPUE5PVFNVUFAgOiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmFfZ2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX2NoYW5uZWxzICpjaGFubmVscykKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJY2hhbm5lbHMtPm1heF9yeCA9IEVOQV9NQVhfTlVNX0lPX1FVRVVFUzsKKwljaGFubmVscy0+bWF4X3R4ID0gRU5BX01BWF9OVU1fSU9fUVVFVUVTOworCWNoYW5uZWxzLT5tYXhfb3RoZXIgPSAwOworCWNoYW5uZWxzLT5tYXhfY29tYmluZWQgPSAwOworCWNoYW5uZWxzLT5yeF9jb3VudCA9IGFkYXB0ZXItPm51bV9xdWV1ZXM7CisJY2hhbm5lbHMtPnR4X2NvdW50ID0gYWRhcHRlci0+bnVtX3F1ZXVlczsKKwljaGFubmVscy0+b3RoZXJfY291bnQgPSAwOworCWNoYW5uZWxzLT5jb21iaW5lZF9jb3VudCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2dldF90dW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICBjb25zdCBzdHJ1Y3QgZXRodG9vbF90dW5hYmxlICp0dW5hLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKHR1bmEtPmlkKSB7CisJY2FzZSBFVEhUT09MX1JYX0NPUFlCUkVBSzoKKwkJKih1MzIgKilkYXRhID0gYWRhcHRlci0+cnhfY29weWJyZWFrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVuYV9zZXRfdHVuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgY29uc3Qgc3RydWN0IGV0aHRvb2xfdHVuYWJsZSAqdHVuYSwKKwkJCSAgIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgbGVuOworCisJc3dpdGNoICh0dW5hLT5pZCkgeworCWNhc2UgRVRIVE9PTF9SWF9DT1BZQlJFQUs6CisJCWxlbiA9ICoodTMyICopZGF0YTsKKwkJaWYgKGxlbiA+IGFkYXB0ZXItPm5ldGRldi0+bXR1KSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJYWRhcHRlci0+cnhfY29weWJyZWFrID0gbGVuOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGVuYV9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gZW5hX2dldF9saW5rX2tzZXR0aW5ncywKKwkuZ2V0X2RydmluZm8JCT0gZW5hX2dldF9kcnZpbmZvLAorCS5nZXRfbXNnbGV2ZWwJCT0gZW5hX2dldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsCQk9IGVuYV9zZXRfbXNnbGV2ZWwsCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9jb2FsZXNjZQkJPSBlbmFfZ2V0X2NvYWxlc2NlLAorCS5zZXRfY29hbGVzY2UJCT0gZW5hX3NldF9jb2FsZXNjZSwKKwkuZ2V0X3JpbmdwYXJhbQkJPSBlbmFfZ2V0X3JpbmdwYXJhbSwKKwkuZ2V0X3NzZXRfY291bnQgICAgICAgICA9IGVuYV9nZXRfc3NldF9jb3VudCwKKwkuZ2V0X3N0cmluZ3MJCT0gZW5hX2dldF9zdHJpbmdzLAorCS5nZXRfZXRodG9vbF9zdGF0cyAgICAgID0gZW5hX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfcnhuZmMJCT0gZW5hX2dldF9yeG5mYywKKwkuc2V0X3J4bmZjCQk9IGVuYV9zZXRfcnhuZmMsCisJLmdldF9yeGZoX2luZGlyX3NpemUgICAgPSBlbmFfZ2V0X3J4ZmhfaW5kaXJfc2l6ZSwKKwkuZ2V0X3J4Zmhfa2V5X3NpemUJPSBlbmFfZ2V0X3J4Zmhfa2V5X3NpemUsCisJLmdldF9yeGZoCQk9IGVuYV9nZXRfcnhmaCwKKwkuc2V0X3J4ZmgJCT0gZW5hX3NldF9yeGZoLAorCS5nZXRfY2hhbm5lbHMJCT0gZW5hX2dldF9jaGFubmVscywKKwkuZ2V0X3R1bmFibGUJCT0gZW5hX2dldF90dW5hYmxlLAorCS5zZXRfdHVuYWJsZQkJPSBlbmFfc2V0X3R1bmFibGUsCit9OworCit2b2lkIGVuYV9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwluZXRkZXYtPmV0aHRvb2xfb3BzID0gJmVuYV9ldGh0b29sX29wczsKK30KKworc3RhdGljIHZvaWQgZW5hX2R1bXBfc3RhdHNfZXgoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCB1OCAqYnVmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJdTggKnN0cmluZ3NfYnVmOworCXU2NCAqZGF0YV9idWY7CisJaW50IHN0cmluZ3NfbnVtOworCWludCBpLCByYzsKKworCXN0cmluZ3NfbnVtID0gZW5hX2dldF9zc2V0X2NvdW50KG5ldGRldiwgRVRIX1NTX1NUQVRTKTsKKwlpZiAoc3RyaW5nc19udW0gPD0gMCkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsICJDYW4ndCBnZXQgc3RhdHMgbnVtXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXN0cmluZ3NfYnVmID0gZGV2bV9remFsbG9jKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJICAgc3RyaW5nc19udW0gKiBFVEhfR1NUUklOR19MRU4sCisJCQkJICAgR0ZQX0FUT01JQyk7CisJaWYgKCFzdHJpbmdzX2J1ZikgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBuZXRkZXYsCisJCQkgICJmYWlsZWQgdG8gYWxsb2Mgc3RyaW5nc19idWZcbiIpOworCQlyZXR1cm47CisJfQorCisJZGF0YV9idWYgPSBkZXZtX2t6YWxsb2MoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQlzdHJpbmdzX251bSAqIHNpemVvZih1NjQpLAorCQkJCUdGUF9BVE9NSUMpOworCWlmICghZGF0YV9idWYpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LAorCQkJICAiZmFpbGVkIHRvIGFsbG9jYXRlIGRhdGEgYnVmXG4iKTsKKwkJZGV2bV9rZnJlZSgmYWRhcHRlci0+cGRldi0+ZGV2LCBzdHJpbmdzX2J1Zik7CisJCXJldHVybjsKKwl9CisKKwllbmFfZ2V0X3N0cmluZ3MobmV0ZGV2LCBFVEhfU1NfU1RBVFMsIHN0cmluZ3NfYnVmKTsKKwllbmFfZ2V0X2V0aHRvb2xfc3RhdHMobmV0ZGV2LCBOVUxMLCBkYXRhX2J1Zik7CisKKwkvKiBJZiB0aGVyZSBpcyBhIGJ1ZmZlciwgZHVtcCBzdGF0cywgb3RoZXJ3aXNlIHByaW50IHRoZW0gdG8gZG1lc2cgKi8KKwlpZiAoYnVmKQorCQlmb3IgKGkgPSAwOyBpIDwgc3RyaW5nc19udW07IGkrKykgeworCQkJcmMgPSBzbnByaW50ZihidWYsIEVUSF9HU1RSSU5HX0xFTiArIHNpemVvZih1NjQpLAorCQkJCSAgICAgICIlcyAlbGx1XG4iLAorCQkJCSAgICAgIHN0cmluZ3NfYnVmICsgaSAqIEVUSF9HU1RSSU5HX0xFTiwKKwkJCQkgICAgICBkYXRhX2J1ZltpXSk7CisJCQlidWYgKz0gcmM7CisJCX0KKwllbHNlCisJCWZvciAoaSA9IDA7IGkgPCBzdHJpbmdzX251bTsgaSsrKQorCQkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LCAiJXM6ICVsbHVcbiIsCisJCQkJICBzdHJpbmdzX2J1ZiArIGkgKiBFVEhfR1NUUklOR19MRU4sCisJCQkJICBkYXRhX2J1ZltpXSk7CisKKwlkZXZtX2tmcmVlKCZhZGFwdGVyLT5wZGV2LT5kZXYsIHN0cmluZ3NfYnVmKTsKKwlkZXZtX2tmcmVlKCZhZGFwdGVyLT5wZGV2LT5kZXYsIGRhdGFfYnVmKTsKK30KKwordm9pZCBlbmFfZHVtcF9zdGF0c190b19idWYoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCB1OCAqYnVmKQoreworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwllbmFfZHVtcF9zdGF0c19leChhZGFwdGVyLCBidWYpOworfQorCit2b2lkIGVuYV9kdW1wX3N0YXRzX3RvX2RtZXNnKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwllbmFfZHVtcF9zdGF0c19leChhZGFwdGVyLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX25ldGRldi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfbmV0ZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZlYWVjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX25ldGRldi5jCkBAIC0wLDAgKzEsMzI3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaWZkZWYgQ09ORklHX1JGU19BQ0NFTAorI2luY2x1ZGUgPGxpbnV4L2NwdV9ybWFwLmg+CisjZW5kaWYgLyogQ09ORklHX1JGU19BQ0NFTCAqLworI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9udW1hLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisKKyNpbmNsdWRlICJlbmFfbmV0ZGV2LmgiCisjaW5jbHVkZSAiZW5hX3BjaV9pZF90YmwuaCIKKworc3RhdGljIGNoYXIgdmVyc2lvbltdID0gREVWSUNFX05BTUUgIiB2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIlxuIjsKKworTU9EVUxFX0FVVEhPUigiQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKERFVklDRV9OQU1FKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSVl9NT0RVTEVfVkVSU0lPTik7CisKKy8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KKyNkZWZpbmUgVFhfVElNRU9VVCAgKDUgKiBIWikKKworI2RlZmluZSBFTkFfTkFQSV9CVURHRVQgNjQKKworI2RlZmluZSBERUZBVUxUX01TR19FTkFCTEUgKE5FVElGX01TR19EUlYgfCBORVRJRl9NU0dfUFJPQkUgfCBORVRJRl9NU0dfSUZVUCB8IFwKKwkJTkVUSUZfTVNHX1RYX0RPTkUgfCBORVRJRl9NU0dfVFhfRVJSIHwgTkVUSUZfTVNHX1JYX0VSUikKK3N0YXRpYyBpbnQgZGVidWcgPSAtMTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAoMD1ub25lLC4uLiwxNj1hbGwpIik7CisKK3N0YXRpYyBzdHJ1Y3QgZW5hX2FlbnFfaGFuZGxlcnMgYWVucV9oYW5kbGVyczsKKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICplbmFfd3E7CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlbmFfcGNpX3RibCk7CisKK3N0YXRpYyBpbnQgZW5hX3Jzc19pbml0X2RlZmF1bHQoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKTsKKworc3RhdGljIHZvaWQgZW5hX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYWRhcHRlci0+c3luY3ApOworCWFkYXB0ZXItPmRldl9zdGF0cy50eF90aW1lb3V0Kys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmFkYXB0ZXItPnN5bmNwKTsKKworCW5ldGlmX2VycihhZGFwdGVyLCB0eF9lcnIsIGRldiwgIlRyYW5zbWl0IHRpbWUgb3V0XG4iKTsKKworCS8qIENoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGRldmljZSB0byB0cmlnZ2VyIHJlc2V0ICovCisJc2V0X2JpdChFTkFfRkxBR19UUklHR0VSX1JFU0VULCAmYWRhcHRlci0+ZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfcnhfcmluZ19tdHUoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCBpbnQgbXR1KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwkJYWRhcHRlci0+cnhfcmluZ1tpXS5tdHUgPSBtdHU7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKChuZXdfbXR1ID4gYWRhcHRlci0+bWF4X210dSkgfHwgKG5ld19tdHUgPCBFTkFfTUlOX01UVSkpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgZGV2LAorCQkJICAiSW52YWxpZCBNVFUgc2V0dGluZy4gbmV3X210dTogJWRcbiIsIG5ld19tdHUpOworCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGVuYV9jb21fc2V0X2Rldl9tdHUoYWRhcHRlci0+ZW5hX2RldiwgbmV3X210dSk7CisJaWYgKCFyZXQpIHsKKwkJbmV0aWZfZGJnKGFkYXB0ZXIsIGRydiwgZGV2LCAic2V0IE1UVSB0byAlZFxuIiwgbmV3X210dSk7CisJCXVwZGF0ZV9yeF9yaW5nX210dShhZGFwdGVyLCBuZXdfbXR1KTsKKwkJZGV2LT5tdHUgPSBuZXdfbXR1OworCX0gZWxzZSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIGRldiwgIkZhaWxlZCB0byBzZXQgTVRVIHRvICVkXG4iLAorCQkJICBuZXdfbXR1KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVuYV9pbml0X3J4X2NwdV9ybWFwKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKyNpZmRlZiBDT05GSUdfUkZTX0FDQ0VMCisJdTMyIGk7CisJaW50IHJjOworCisJYWRhcHRlci0+bmV0ZGV2LT5yeF9jcHVfcm1hcCA9IGFsbG9jX2lycV9jcHVfcm1hcChhZGFwdGVyLT5udW1fcXVldWVzKTsKKwlpZiAoIWFkYXB0ZXItPm5ldGRldi0+cnhfY3B1X3JtYXApCisJCXJldHVybiAtRU5PTUVNOworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJaW50IGlycV9pZHggPSBFTkFfSU9fSVJRX0lEWChpKTsKKworCQlyYyA9IGlycV9jcHVfcm1hcF9hZGQoYWRhcHRlci0+bmV0ZGV2LT5yeF9jcHVfcm1hcCwKKwkJCQkgICAgICBhZGFwdGVyLT5tc2l4X2VudHJpZXNbaXJxX2lkeF0udmVjdG9yKTsKKwkJaWYgKHJjKSB7CisJCQlmcmVlX2lycV9jcHVfcm1hcChhZGFwdGVyLT5uZXRkZXYtPnJ4X2NwdV9ybWFwKTsKKwkJCWFkYXB0ZXItPm5ldGRldi0+cnhfY3B1X3JtYXAgPSBOVUxMOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19SRlNfQUNDRUwgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hX2luaXRfaW9fcmluZ3NfY29tbW9uKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgIHN0cnVjdCBlbmFfcmluZyAqcmluZywgdTE2IHFpZCkKK3sKKwlyaW5nLT5xaWQgPSBxaWQ7CisJcmluZy0+cGRldiA9IGFkYXB0ZXItPnBkZXY7CisJcmluZy0+ZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKKwlyaW5nLT5uZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJcmluZy0+bmFwaSA9ICZhZGFwdGVyLT5lbmFfbmFwaVtxaWRdLm5hcGk7CisJcmluZy0+YWRhcHRlciA9IGFkYXB0ZXI7CisJcmluZy0+ZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJcmluZy0+cGVyX25hcGlfcGFja2V0cyA9IDA7CisJcmluZy0+cGVyX25hcGlfYnl0ZXMgPSAwOworCXJpbmctPmNwdSA9IDA7CisJdTY0X3N0YXRzX2luaXQoJnJpbmctPnN5bmNwKTsKK30KKworc3RhdGljIHZvaWQgZW5hX2luaXRfaW9fcmluZ3Moc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldjsKKwlzdHJ1Y3QgZW5hX3JpbmcgKnR4ciwgKnJ4cjsKKwlpbnQgaTsKKworCWVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQl0eHIgPSAmYWRhcHRlci0+dHhfcmluZ1tpXTsKKwkJcnhyID0gJmFkYXB0ZXItPnJ4X3JpbmdbaV07CisKKwkJLyogVFgvUlggY29tbW9uIHJpbmcgc3RhdGUgKi8KKwkJZW5hX2luaXRfaW9fcmluZ3NfY29tbW9uKGFkYXB0ZXIsIHR4ciwgaSk7CisJCWVuYV9pbml0X2lvX3JpbmdzX2NvbW1vbihhZGFwdGVyLCByeHIsIGkpOworCisJCS8qIFRYIHNwZWNpZmljIHJpbmcgc3RhdGUgKi8KKwkJdHhyLT5yaW5nX3NpemUgPSBhZGFwdGVyLT50eF9yaW5nX3NpemU7CisJCXR4ci0+dHhfbWF4X2hlYWRlcl9zaXplID0gZW5hX2Rldi0+dHhfbWF4X2hlYWRlcl9zaXplOworCQl0eHItPnR4X21lbV9xdWV1ZV90eXBlID0gZW5hX2Rldi0+dHhfbWVtX3F1ZXVlX3R5cGU7CisJCXR4ci0+c2dsX3NpemUgPSBhZGFwdGVyLT5tYXhfdHhfc2dsX3NpemU7CisJCXR4ci0+c21vb3RoZWRfaW50ZXJ2YWwgPQorCQkJZW5hX2NvbV9nZXRfbm9uYWRhcHRpdmVfbW9kZXJhdGlvbl9pbnRlcnZhbF90eChlbmFfZGV2KTsKKworCQkvKiBSWCBzcGVjaWZpYyByaW5nIHN0YXRlICovCisJCXJ4ci0+cmluZ19zaXplID0gYWRhcHRlci0+cnhfcmluZ19zaXplOworCQlyeHItPnJ4X2NvcHlicmVhayA9IGFkYXB0ZXItPnJ4X2NvcHlicmVhazsKKwkJcnhyLT5zZ2xfc2l6ZSA9IGFkYXB0ZXItPm1heF9yeF9zZ2xfc2l6ZTsKKwkJcnhyLT5zbW9vdGhlZF9pbnRlcnZhbCA9CisJCQllbmFfY29tX2dldF9ub25hZGFwdGl2ZV9tb2RlcmF0aW9uX2ludGVydmFsX3J4KGVuYV9kZXYpOworCX0KK30KKworLyogZW5hX3NldHVwX3R4X3Jlc291cmNlcyAtIGFsbG9jYXRlIEkvTyBUeCByZXNvdXJjZXMgKERlc2NyaXB0b3JzKQorICogQGFkYXB0ZXI6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBxaWQ6IHF1ZXVlIGluZGV4CisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGVuYV9zZXR1cF90eF9yZXNvdXJjZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCBpbnQgcWlkKQoreworCXN0cnVjdCBlbmFfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nW3FpZF07CisJc3RydWN0IGVuYV9pcnEgKmVuYV9pcnEgPSAmYWRhcHRlci0+aXJxX3RibFtFTkFfSU9fSVJRX0lEWChxaWQpXTsKKwlpbnQgc2l6ZSwgaSwgbm9kZTsKKworCWlmICh0eF9yaW5nLT50eF9idWZmZXJfaW5mbykgeworCQluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwKKwkJCSAgYWRhcHRlci0+bmV0ZGV2LCAidHhfYnVmZmVyX2luZm8gaW5mbyBpcyBub3QgTlVMTCIpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlbmFfdHhfYnVmZmVyKSAqIHR4X3JpbmctPnJpbmdfc2l6ZTsKKwlub2RlID0gY3B1X3RvX25vZGUoZW5hX2lycS0+Y3B1KTsKKworCXR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvID0gdnphbGxvY19ub2RlKHNpemUsIG5vZGUpOworCWlmICghdHhfcmluZy0+dHhfYnVmZmVyX2luZm8pIHsKKwkJdHhfcmluZy0+dHhfYnVmZmVyX2luZm8gPSB2emFsbG9jKHNpemUpOworCQlpZiAoIXR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc2l6ZSA9IHNpemVvZih1MTYpICogdHhfcmluZy0+cmluZ19zaXplOworCXR4X3JpbmctPmZyZWVfdHhfaWRzID0gdnphbGxvY19ub2RlKHNpemUsIG5vZGUpOworCWlmICghdHhfcmluZy0+ZnJlZV90eF9pZHMpIHsKKwkJdHhfcmluZy0+ZnJlZV90eF9pZHMgPSB2emFsbG9jKHNpemUpOworCQlpZiAoIXR4X3JpbmctPmZyZWVfdHhfaWRzKSB7CisJCQl2ZnJlZSh0eF9yaW5nLT50eF9idWZmZXJfaW5mbyk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCS8qIFJlcSBpZCByaW5nIGZvciBUWCBvdXQgb2Ygb3JkZXIgY29tcGxldGlvbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdHhfcmluZy0+cmluZ19zaXplOyBpKyspCisJCXR4X3JpbmctPmZyZWVfdHhfaWRzW2ldID0gaTsKKworCS8qIFJlc2V0IHR4IHN0YXRpc3RpY3MgKi8KKwltZW1zZXQoJnR4X3JpbmctPnR4X3N0YXRzLCAweDAsIHNpemVvZih0eF9yaW5nLT50eF9zdGF0cykpOworCisJdHhfcmluZy0+bmV4dF90b191c2UgPSAwOworCXR4X3JpbmctPm5leHRfdG9fY2xlYW4gPSAwOworCXR4X3JpbmctPmNwdSA9IGVuYV9pcnEtPmNwdTsKKwlyZXR1cm4gMDsKK30KKworLyogZW5hX2ZyZWVfdHhfcmVzb3VyY2VzIC0gRnJlZSBJL08gVHggUmVzb3VyY2VzIHBlciBRdWV1ZQorICogQGFkYXB0ZXI6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBxaWQ6IHF1ZXVlIGluZGV4CisgKgorICogRnJlZSBhbGwgdHJhbnNtaXQgc29mdHdhcmUgcmVzb3VyY2VzCisgKi8KK3N0YXRpYyB2b2lkIGVuYV9mcmVlX3R4X3Jlc291cmNlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBxaWQpCit7CisJc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3JpbmdbcWlkXTsKKworCXZmcmVlKHR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvKTsKKwl0eF9yaW5nLT50eF9idWZmZXJfaW5mbyA9IE5VTEw7CisKKwl2ZnJlZSh0eF9yaW5nLT5mcmVlX3R4X2lkcyk7CisJdHhfcmluZy0+ZnJlZV90eF9pZHMgPSBOVUxMOworfQorCisvKiBlbmFfc2V0dXBfYWxsX3R4X3Jlc291cmNlcyAtIGFsbG9jYXRlIEkvTyBUeCBxdWV1ZXMgcmVzb3VyY2VzIGZvciBBbGwgcXVldWVzCisgKiBAYWRhcHRlcjogcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgZW5hX3NldHVwX2FsbF90eF9yZXNvdXJjZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpLCByYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKSB7CisJCXJjID0gZW5hX3NldHVwX3R4X3Jlc291cmNlcyhhZGFwdGVyLCBpKTsKKwkJaWYgKHJjKQorCQkJZ290byBlcnJfc2V0dXBfdHg7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9zZXR1cF90eDoKKworCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBhZGFwdGVyLT5uZXRkZXYsCisJCSAgIlR4IHF1ZXVlICVkOiBhbGxvY2F0aW9uIGZhaWxlZFxuIiwgaSk7CisKKwkvKiByZXdpbmQgdGhlIGluZGV4IGZyZWVpbmcgdGhlIHJpbmdzIGFzIHdlIGdvICovCisJd2hpbGUgKGktLSkKKwkJZW5hX2ZyZWVfdHhfcmVzb3VyY2VzKGFkYXB0ZXIsIGkpOworCXJldHVybiByYzsKK30KKworLyogZW5hX2ZyZWVfYWxsX2lvX3R4X3Jlc291cmNlcyAtIEZyZWUgSS9PIFR4IFJlc291cmNlcyBmb3IgQWxsIFF1ZXVlcworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKgorICogRnJlZSBhbGwgdHJhbnNtaXQgc29mdHdhcmUgcmVzb3VyY2VzCisgKi8KK3N0YXRpYyB2b2lkIGVuYV9mcmVlX2FsbF9pb190eF9yZXNvdXJjZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwkJZW5hX2ZyZWVfdHhfcmVzb3VyY2VzKGFkYXB0ZXIsIGkpOworfQorCisvKiBlbmFfc2V0dXBfcnhfcmVzb3VyY2VzIC0gYWxsb2NhdGUgSS9PIFJ4IHJlc291cmNlcyAoRGVzY3JpcHRvcnMpCisgKiBAYWRhcHRlcjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQHFpZDogcXVldWUgaW5kZXgKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50IGVuYV9zZXR1cF9yeF9yZXNvdXJjZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgdTMyIHFpZCkKK3sKKwlzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZ1txaWRdOworCXN0cnVjdCBlbmFfaXJxICplbmFfaXJxID0gJmFkYXB0ZXItPmlycV90YmxbRU5BX0lPX0lSUV9JRFgocWlkKV07CisJaW50IHNpemUsIG5vZGU7CisKKwlpZiAocnhfcmluZy0+cnhfYnVmZmVyX2luZm8pIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgInJ4X2J1ZmZlcl9pbmZvIGlzIG5vdCBOVUxMIik7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCS8qIGFsbG9jIGV4dHJhIGVsZW1lbnQgc28gaW4gcnggcGF0aAorCSAqIHdlIGNhbiBhbHdheXMgcHJlZmV0Y2ggcnhfaW5mbyArIDEKKwkgKi8KKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlbmFfcnhfYnVmZmVyKSAqIChyeF9yaW5nLT5yaW5nX3NpemUgKyAxKTsKKwlub2RlID0gY3B1X3RvX25vZGUoZW5hX2lycS0+Y3B1KTsKKworCXJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvID0gdnphbGxvY19ub2RlKHNpemUsIG5vZGUpOworCWlmICghcnhfcmluZy0+cnhfYnVmZmVyX2luZm8pIHsKKwkJcnhfcmluZy0+cnhfYnVmZmVyX2luZm8gPSB2emFsbG9jKHNpemUpOworCQlpZiAoIXJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogUmVzZXQgcnggc3RhdGlzdGljcyAqLworCW1lbXNldCgmcnhfcmluZy0+cnhfc3RhdHMsIDB4MCwgc2l6ZW9mKHJ4X3JpbmctPnJ4X3N0YXRzKSk7CisKKwlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gMDsKKwlyeF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CisJcnhfcmluZy0+Y3B1ID0gZW5hX2lycS0+Y3B1OworCisJcmV0dXJuIDA7Cit9CisKKy8qIGVuYV9mcmVlX3J4X3Jlc291cmNlcyAtIEZyZWUgSS9PIFJ4IFJlc291cmNlcworICogQGFkYXB0ZXI6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBxaWQ6IHF1ZXVlIGluZGV4CisgKgorICogRnJlZSBhbGwgcmVjZWl2ZSBzb2Z0d2FyZSByZXNvdXJjZXMKKyAqLworc3RhdGljIHZvaWQgZW5hX2ZyZWVfcnhfcmVzb3VyY2VzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgIHUzMiBxaWQpCit7CisJc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdbcWlkXTsKKworCXZmcmVlKHJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvKTsKKwlyeF9yaW5nLT5yeF9idWZmZXJfaW5mbyA9IE5VTEw7Cit9CisKKy8qIGVuYV9zZXR1cF9hbGxfcnhfcmVzb3VyY2VzIC0gYWxsb2NhdGUgSS9PIFJ4IHF1ZXVlcyByZXNvdXJjZXMgZm9yIGFsbCBxdWV1ZXMKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBlbmFfc2V0dXBfYWxsX3J4X3Jlc291cmNlcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGksIHJjID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJcmMgPSBlbmFfc2V0dXBfcnhfcmVzb3VyY2VzKGFkYXB0ZXIsIGkpOworCQlpZiAocmMpCisJCQlnb3RvIGVycl9zZXR1cF9yeDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3NldHVwX3J4OgorCisJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIGFkYXB0ZXItPm5ldGRldiwKKwkJICAiUnggcXVldWUgJWQ6IGFsbG9jYXRpb24gZmFpbGVkXG4iLCBpKTsKKworCS8qIHJld2luZCB0aGUgaW5kZXggZnJlZWluZyB0aGUgcmluZ3MgYXMgd2UgZ28gKi8KKwl3aGlsZSAoaS0tKQorCQllbmFfZnJlZV9yeF9yZXNvdXJjZXMoYWRhcHRlciwgaSk7CisJcmV0dXJuIHJjOworfQorCisvKiBlbmFfZnJlZV9hbGxfaW9fcnhfcmVzb3VyY2VzIC0gRnJlZSBJL08gUnggUmVzb3VyY2VzIGZvciBBbGwgUXVldWVzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiBGcmVlIGFsbCByZWNlaXZlIHNvZnR3YXJlIHJlc291cmNlcworICovCitzdGF0aWMgdm9pZCBlbmFfZnJlZV9hbGxfaW9fcnhfcmVzb3VyY2VzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCWVuYV9mcmVlX3J4X3Jlc291cmNlcyhhZGFwdGVyLCBpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZW5hX2FsbG9jX3J4X3BhZ2Uoc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nLAorCQkJCSAgICBzdHJ1Y3QgZW5hX3J4X2J1ZmZlciAqcnhfaW5mbywgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBlbmFfY29tX2J1ZiAqZW5hX2J1ZjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlkbWFfYWRkcl90IGRtYTsKKworCS8qIGlmIHByZXZpb3VzIGFsbG9jYXRlZCBwYWdlIGlzIG5vdCB1c2VkICovCisJaWYgKHVubGlrZWx5KHJ4X2luZm8tPnBhZ2UpKQorCQlyZXR1cm4gMDsKKworCXBhZ2UgPSBhbGxvY19wYWdlKGdmcCk7CisJaWYgKHVubGlrZWx5KCFwYWdlKSkgeworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CisJCXJ4X3JpbmctPnJ4X3N0YXRzLnBhZ2VfYWxsb2NfZmFpbCsrOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnhfcmluZy0+c3luY3ApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkbWEgPSBkbWFfbWFwX3BhZ2UocnhfcmluZy0+ZGV2LCBwYWdlLCAwLCBQQUdFX1NJWkUsCisJCQkgICBETUFfRlJPTV9ERVZJQ0UpOworCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihyeF9yaW5nLT5kZXYsIGRtYSkpKSB7CisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJ4X3JpbmctPnN5bmNwKTsKKwkJcnhfcmluZy0+cnhfc3RhdHMuZG1hX21hcHBpbmdfZXJyKys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisKKwkJX19mcmVlX3BhZ2UocGFnZSk7CisJCXJldHVybiAtRUlPOworCX0KKwluZXRpZl9kYmcocnhfcmluZy0+YWRhcHRlciwgcnhfc3RhdHVzLCByeF9yaW5nLT5uZXRkZXYsCisJCSAgImFsbG9jIHBhZ2UgJXAsIHJ4X2luZm8gJXBcbiIsIHBhZ2UsIHJ4X2luZm8pOworCisJcnhfaW5mby0+cGFnZSA9IHBhZ2U7CisJcnhfaW5mby0+cGFnZV9vZmZzZXQgPSAwOworCWVuYV9idWYgPSAmcnhfaW5mby0+ZW5hX2J1ZjsKKwllbmFfYnVmLT5wYWRkciA9IGRtYTsKKwllbmFfYnVmLT5sZW4gPSBQQUdFX1NJWkU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5hX2ZyZWVfcnhfcGFnZShzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcsCisJCQkgICAgIHN0cnVjdCBlbmFfcnhfYnVmZmVyICpyeF9pbmZvKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gcnhfaW5mby0+cGFnZTsKKwlzdHJ1Y3QgZW5hX2NvbV9idWYgKmVuYV9idWYgPSAmcnhfaW5mby0+ZW5hX2J1ZjsKKworCWlmICh1bmxpa2VseSghcGFnZSkpIHsKKwkJbmV0aWZfd2FybihyeF9yaW5nLT5hZGFwdGVyLCByeF9lcnIsIHJ4X3JpbmctPm5ldGRldiwKKwkJCSAgICJUcnlpbmcgdG8gZnJlZSB1bmFsbG9jYXRlZCBidWZmZXJcbiIpOworCQlyZXR1cm47CisJfQorCisJZG1hX3VubWFwX3BhZ2UocnhfcmluZy0+ZGV2LCBlbmFfYnVmLT5wYWRkciwgUEFHRV9TSVpFLAorCQkgICAgICAgRE1BX0ZST01fREVWSUNFKTsKKworCV9fZnJlZV9wYWdlKHBhZ2UpOworCXJ4X2luZm8tPnBhZ2UgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGVuYV9yZWZpbGxfcnhfYnVmcyhzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcsIHUzMiBudW0pCit7CisJdTE2IG5leHRfdG9fdXNlOworCXUzMiBpOworCWludCByYzsKKworCW5leHRfdG9fdXNlID0gcnhfcmluZy0+bmV4dF90b191c2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJc3RydWN0IGVuYV9yeF9idWZmZXIgKnJ4X2luZm8gPQorCQkJJnJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvW25leHRfdG9fdXNlXTsKKworCQlyYyA9IGVuYV9hbGxvY19yeF9wYWdlKHJ4X3JpbmcsIHJ4X2luZm8sCisJCQkJICAgICAgIF9fR0ZQX0NPTEQgfCBHRlBfQVRPTUlDIHwgX19HRlBfQ09NUCk7CisJCWlmICh1bmxpa2VseShyYyA8IDApKSB7CisJCQluZXRpZl93YXJuKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X2VyciwgcnhfcmluZy0+bmV0ZGV2LAorCQkJCSAgICJmYWlsZWQgdG8gYWxsb2MgYnVmZmVyIGZvciByeCBxdWV1ZSAlZFxuIiwKKwkJCQkgICByeF9yaW5nLT5xaWQpOworCQkJYnJlYWs7CisJCX0KKwkJcmMgPSBlbmFfY29tX2FkZF9zaW5nbGVfcnhfZGVzYyhyeF9yaW5nLT5lbmFfY29tX2lvX3NxLAorCQkJCQkJJnJ4X2luZm8tPmVuYV9idWYsCisJCQkJCQluZXh0X3RvX3VzZSk7CisJCWlmICh1bmxpa2VseShyYykpIHsKKwkJCW5ldGlmX3dhcm4ocnhfcmluZy0+YWRhcHRlciwgcnhfc3RhdHVzLCByeF9yaW5nLT5uZXRkZXYsCisJCQkJICAgImZhaWxlZCB0byBhZGQgYnVmZmVyIGZvciByeCBxdWV1ZSAlZFxuIiwKKwkJCQkgICByeF9yaW5nLT5xaWQpOworCQkJYnJlYWs7CisJCX0KKwkJbmV4dF90b191c2UgPSBFTkFfUlhfUklOR19JRFhfTkVYVChuZXh0X3RvX3VzZSwKKwkJCQkJCSAgIHJ4X3JpbmctPnJpbmdfc2l6ZSk7CisJfQorCisJaWYgKHVubGlrZWx5KGkgPCBudW0pKSB7CisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJ4X3JpbmctPnN5bmNwKTsKKwkJcnhfcmluZy0+cnhfc3RhdHMucmVmaWxfcGFydGlhbCsrOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnhfcmluZy0+c3luY3ApOworCQluZXRkZXZfd2FybihyeF9yaW5nLT5uZXRkZXYsCisJCQkgICAgInJlZmlsbGVkIHJ4IHFpZCAlZCB3aXRoIG9ubHkgJWQgYnVmZmVycyAoZnJvbSAlZClcbiIsCisJCQkgICAgcnhfcmluZy0+cWlkLCBpLCBudW0pOworCX0KKworCWlmIChsaWtlbHkoaSkpIHsKKwkJLyogQWRkIG1lbW9yeSBiYXJyaWVyIHRvIG1ha2Ugc3VyZSB0aGUgZGVzYyB3ZXJlIHdyaXR0ZW4gYmVmb3JlCisJCSAqIGlzc3VlIGEgZG9vcmJlbGwKKwkJICovCisJCXdtYigpOworCQllbmFfY29tX3dyaXRlX3NxX2Rvb3JiZWxsKHJ4X3JpbmctPmVuYV9jb21faW9fc3EpOworCX0KKworCXJ4X3JpbmctPm5leHRfdG9fdXNlID0gbmV4dF90b191c2U7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgZW5hX2ZyZWVfcnhfYnVmcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgIHUzMiBxaWQpCit7CisJc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdbcWlkXTsKKwl1MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPCByeF9yaW5nLT5yaW5nX3NpemU7IGkrKykgeworCQlzdHJ1Y3QgZW5hX3J4X2J1ZmZlciAqcnhfaW5mbyA9ICZyeF9yaW5nLT5yeF9idWZmZXJfaW5mb1tpXTsKKworCQlpZiAocnhfaW5mby0+cGFnZSkKKwkJCWVuYV9mcmVlX3J4X3BhZ2UocnhfcmluZywgcnhfaW5mbyk7CisJfQorfQorCisvKiBlbmFfcmVmaWxsX2FsbF9yeF9idWZzIC0gYWxsb2NhdGUgYWxsIHF1ZXVlcyBSeCBidWZmZXJzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGVuYV9yZWZpbGxfYWxsX3J4X2J1ZnMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlbmFfcmluZyAqcnhfcmluZzsKKwlpbnQgaSwgcmMsIGJ1ZnNfbnVtOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQlyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdbaV07CisJCWJ1ZnNfbnVtID0gcnhfcmluZy0+cmluZ19zaXplIC0gMTsKKwkJcmMgPSBlbmFfcmVmaWxsX3J4X2J1ZnMocnhfcmluZywgYnVmc19udW0pOworCisJCWlmICh1bmxpa2VseShyYyAhPSBidWZzX251bSkpCisJCQluZXRpZl93YXJuKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X3N0YXR1cywgcnhfcmluZy0+bmV0ZGV2LAorCQkJCSAgICJyZWZpbGxpbmcgUXVldWUgJWQgZmFpbGVkLiBhbGxvY2F0ZWQgJWQgYnVmZmVycyBmcm9tOiAlZFxuIiwKKwkJCQkgICBpLCByYywgYnVmc19udW0pOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hX2ZyZWVfYWxsX3J4X2J1ZnMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykKKwkJZW5hX2ZyZWVfcnhfYnVmcyhhZGFwdGVyLCBpKTsKK30KKworLyogZW5hX2ZyZWVfdHhfYnVmcyAtIEZyZWUgVHggQnVmZmVycyBwZXIgUXVldWUKKyAqIEB0eF9yaW5nOiBUWCByaW5nIGZvciB3aGljaCBidWZmZXJzIGJlIGZyZWVkCisgKi8KK3N0YXRpYyB2b2lkIGVuYV9mcmVlX3R4X2J1ZnMoc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nKQoreworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IHR4X3JpbmctPnJpbmdfc2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBlbmFfdHhfYnVmZmVyICp0eF9pbmZvID0gJnR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvW2ldOworCQlzdHJ1Y3QgZW5hX2NvbV9idWYgKmVuYV9idWY7CisJCWludCBucl9mcmFnczsKKwkJaW50IGo7CisKKwkJaWYgKCF0eF9pbmZvLT5za2IpCisJCQljb250aW51ZTsKKworCQluZXRkZXZfbm90aWNlKHR4X3JpbmctPm5ldGRldiwKKwkJCSAgICAgICJmcmVlIHVuY29tcGxldGVkIHR4IHNrYiBxaWQgJWQgaWR4IDB4JXhcbiIsCisJCQkgICAgICB0eF9yaW5nLT5xaWQsIGkpOworCisJCWVuYV9idWYgPSB0eF9pbmZvLT5idWZzOworCQlkbWFfdW5tYXBfc2luZ2xlKHR4X3JpbmctPmRldiwKKwkJCQkgZW5hX2J1Zi0+cGFkZHIsCisJCQkJIGVuYV9idWYtPmxlbiwKKwkJCQkgRE1BX1RPX0RFVklDRSk7CisKKwkJLyogdW5tYXAgcmVtYWluaW5nIG1hcHBlZCBwYWdlcyAqLworCQlucl9mcmFncyA9IHR4X2luZm8tPm51bV9vZl9idWZzIC0gMTsKKwkJZm9yIChqID0gMDsgaiA8IG5yX2ZyYWdzOyBqKyspIHsKKwkJCWVuYV9idWYrKzsKKwkJCWRtYV91bm1hcF9wYWdlKHR4X3JpbmctPmRldiwKKwkJCQkgICAgICAgZW5hX2J1Zi0+cGFkZHIsCisJCQkJICAgICAgIGVuYV9idWYtPmxlbiwKKwkJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CisJCX0KKworCQlkZXZfa2ZyZWVfc2tiX2FueSh0eF9pbmZvLT5za2IpOworCX0KKwluZXRkZXZfdHhfcmVzZXRfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZSh0eF9yaW5nLT5uZXRkZXYsCisJCQkJCQkgIHR4X3JpbmctPnFpZCkpOworfQorCitzdGF0aWMgdm9pZCBlbmFfZnJlZV9hbGxfdHhfYnVmcyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQl0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3JpbmdbaV07CisJCWVuYV9mcmVlX3R4X2J1ZnModHhfcmluZyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfZGVzdHJveV9hbGxfdHhfcXVldWVzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MTYgZW5hX3FpZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJZW5hX3FpZCA9IEVOQV9JT19UWFFfSURYKGkpOworCQllbmFfY29tX2Rlc3Ryb3lfaW9fcXVldWUoYWRhcHRlci0+ZW5hX2RldiwgZW5hX3FpZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfZGVzdHJveV9hbGxfcnhfcXVldWVzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MTYgZW5hX3FpZDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJZW5hX3FpZCA9IEVOQV9JT19SWFFfSURYKGkpOworCQllbmFfY29tX2Rlc3Ryb3lfaW9fcXVldWUoYWRhcHRlci0+ZW5hX2RldiwgZW5hX3FpZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfZGVzdHJveV9hbGxfaW9fcXVldWVzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwllbmFfZGVzdHJveV9hbGxfdHhfcXVldWVzKGFkYXB0ZXIpOworCWVuYV9kZXN0cm95X2FsbF9yeF9xdWV1ZXMoYWRhcHRlcik7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfdHhfcmVxX2lkKHN0cnVjdCBlbmFfcmluZyAqdHhfcmluZywgdTE2IHJlcV9pZCkKK3sKKwlzdHJ1Y3QgZW5hX3R4X2J1ZmZlciAqdHhfaW5mbyA9IE5VTEw7CisKKwlpZiAobGlrZWx5KHJlcV9pZCA8IHR4X3JpbmctPnJpbmdfc2l6ZSkpIHsKKwkJdHhfaW5mbyA9ICZ0eF9yaW5nLT50eF9idWZmZXJfaW5mb1tyZXFfaWRdOworCQlpZiAobGlrZWx5KHR4X2luZm8tPnNrYikpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodHhfaW5mbykKKwkJbmV0aWZfZXJyKHR4X3JpbmctPmFkYXB0ZXIsIHR4X2RvbmUsIHR4X3JpbmctPm5ldGRldiwKKwkJCSAgInR4X2luZm8gZG9lc24ndCBoYXZlIHZhbGlkIHNrYlxuIik7CisJZWxzZQorCQluZXRpZl9lcnIodHhfcmluZy0+YWRhcHRlciwgdHhfZG9uZSwgdHhfcmluZy0+bmV0ZGV2LAorCQkJICAiSW52YWxpZCByZXFfaWQ6ICVodVxuIiwgcmVxX2lkKTsKKworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwl0eF9yaW5nLT50eF9zdGF0cy5iYWRfcmVxX2lkKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKworCS8qIFRyaWdnZXIgZGV2aWNlIHJlc2V0ICovCisJc2V0X2JpdChFTkFfRkxBR19UUklHR0VSX1JFU0VULCAmdHhfcmluZy0+YWRhcHRlci0+ZmxhZ3MpOworCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgaW50IGVuYV9jbGVhbl90eF9pcnEoc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nLCB1MzIgYnVkZ2V0KQoreworCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKwlib29sIGFib3ZlX3RocmVzaDsKKwl1MzIgdHhfYnl0ZXMgPSAwOworCXUzMiB0b3RhbF9kb25lID0gMDsKKwl1MTYgbmV4dF90b19jbGVhbjsKKwl1MTYgcmVxX2lkOworCWludCB0eF9wa3RzID0gMDsKKwlpbnQgcmM7CisKKwluZXh0X3RvX2NsZWFuID0gdHhfcmluZy0+bmV4dF90b19jbGVhbjsKKwl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHR4X3JpbmctPm5ldGRldiwgdHhfcmluZy0+cWlkKTsKKworCXdoaWxlICh0eF9wa3RzIDwgYnVkZ2V0KSB7CisJCXN0cnVjdCBlbmFfdHhfYnVmZmVyICp0eF9pbmZvOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQlzdHJ1Y3QgZW5hX2NvbV9idWYgKmVuYV9idWY7CisJCWludCBpLCBucl9mcmFnczsKKworCQlyYyA9IGVuYV9jb21fdHhfY29tcF9yZXFfaWRfZ2V0KHR4X3JpbmctPmVuYV9jb21faW9fY3EsCisJCQkJCQkmcmVxX2lkKTsKKwkJaWYgKHJjKQorCQkJYnJlYWs7CisKKwkJcmMgPSB2YWxpZGF0ZV90eF9yZXFfaWQodHhfcmluZywgcmVxX2lkKTsKKwkJaWYgKHJjKQorCQkJYnJlYWs7CisKKwkJdHhfaW5mbyA9ICZ0eF9yaW5nLT50eF9idWZmZXJfaW5mb1tyZXFfaWRdOworCQlza2IgPSB0eF9pbmZvLT5za2I7CisKKwkJLyogcHJlZmV0Y2ggc2tiX2VuZF9wb2ludGVyKCkgdG8gc3BlZWR1cCBza2Jfc2hpbmZvKHNrYikgKi8KKwkJcHJlZmV0Y2goJnNrYi0+ZW5kKTsKKworCQl0eF9pbmZvLT5za2IgPSBOVUxMOworCQl0eF9pbmZvLT5sYXN0X2ppZmZpZXMgPSAwOworCisJCWlmIChsaWtlbHkodHhfaW5mby0+bnVtX29mX2J1ZnMgIT0gMCkpIHsKKwkJCWVuYV9idWYgPSB0eF9pbmZvLT5idWZzOworCisJCQlkbWFfdW5tYXBfc2luZ2xlKHR4X3JpbmctPmRldiwKKwkJCQkJIGRtYV91bm1hcF9hZGRyKGVuYV9idWYsIHBhZGRyKSwKKwkJCQkJIGRtYV91bm1hcF9sZW4oZW5hX2J1ZiwgbGVuKSwKKwkJCQkJIERNQV9UT19ERVZJQ0UpOworCisJCQkvKiB1bm1hcCByZW1haW5pbmcgbWFwcGVkIHBhZ2VzICovCisJCQlucl9mcmFncyA9IHR4X2luZm8tPm51bV9vZl9idWZzIC0gMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCQkJZW5hX2J1ZisrOworCQkJCWRtYV91bm1hcF9wYWdlKHR4X3JpbmctPmRldiwKKwkJCQkJICAgICAgIGRtYV91bm1hcF9hZGRyKGVuYV9idWYsIHBhZGRyKSwKKwkJCQkJICAgICAgIGRtYV91bm1hcF9sZW4oZW5hX2J1ZiwgbGVuKSwKKwkJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOworCQkJfQorCQl9CisKKwkJbmV0aWZfZGJnKHR4X3JpbmctPmFkYXB0ZXIsIHR4X2RvbmUsIHR4X3JpbmctPm5ldGRldiwKKwkJCSAgInR4X3BvbGw6IHEgJWQgc2tiICVwIGNvbXBsZXRlZFxuIiwgdHhfcmluZy0+cWlkLAorCQkJICBza2IpOworCisJCXR4X2J5dGVzICs9IHNrYi0+bGVuOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXR4X3BrdHMrKzsKKwkJdG90YWxfZG9uZSArPSB0eF9pbmZvLT50eF9kZXNjczsKKworCQl0eF9yaW5nLT5mcmVlX3R4X2lkc1tuZXh0X3RvX2NsZWFuXSA9IHJlcV9pZDsKKwkJbmV4dF90b19jbGVhbiA9IEVOQV9UWF9SSU5HX0lEWF9ORVhUKG5leHRfdG9fY2xlYW4sCisJCQkJCQkgICAgIHR4X3JpbmctPnJpbmdfc2l6ZSk7CisJfQorCisJdHhfcmluZy0+bmV4dF90b19jbGVhbiA9IG5leHRfdG9fY2xlYW47CisJZW5hX2NvbV9jb21wX2Fjayh0eF9yaW5nLT5lbmFfY29tX2lvX3NxLCB0b3RhbF9kb25lKTsKKwllbmFfY29tX3VwZGF0ZV9kZXZfY29tcF9oZWFkKHR4X3JpbmctPmVuYV9jb21faW9fY3EpOworCisJbmV0ZGV2X3R4X2NvbXBsZXRlZF9xdWV1ZSh0eHEsIHR4X3BrdHMsIHR4X2J5dGVzKTsKKworCW5ldGlmX2RiZyh0eF9yaW5nLT5hZGFwdGVyLCB0eF9kb25lLCB0eF9yaW5nLT5uZXRkZXYsCisJCSAgInR4X3BvbGw6IHEgJWQgZG9uZS4gdG90YWwgcGt0czogJWRcbiIsCisJCSAgdHhfcmluZy0+cWlkLCB0eF9wa3RzKTsKKworCS8qIG5lZWQgdG8gbWFrZSB0aGUgcmluZ3MgY2lyY3VsYXIgdXBkYXRlIHZpc2libGUgdG8KKwkgKiBlbmFfc3RhcnRfeG1pdCgpIGJlZm9yZSBjaGVja2luZyBmb3IgbmV0aWZfcXVldWVfc3RvcHBlZCgpLgorCSAqLworCXNtcF9tYigpOworCisJYWJvdmVfdGhyZXNoID0gZW5hX2NvbV9zcV9lbXB0eV9zcGFjZSh0eF9yaW5nLT5lbmFfY29tX2lvX3NxKSA+CisJCUVOQV9UWF9XQUtFVVBfVEhSRVNIOworCWlmICh1bmxpa2VseShuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkgJiYgYWJvdmVfdGhyZXNoKSkgeworCQlfX25ldGlmX3R4X2xvY2sodHhxLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCQlhYm92ZV90aHJlc2ggPSBlbmFfY29tX3NxX2VtcHR5X3NwYWNlKHR4X3JpbmctPmVuYV9jb21faW9fc3EpID4KKwkJCUVOQV9UWF9XQUtFVVBfVEhSRVNIOworCQlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpICYmIGFib3ZlX3RocmVzaCkgeworCQkJbmV0aWZfdHhfd2FrZV9xdWV1ZSh0eHEpOworCQkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCQkJdHhfcmluZy0+dHhfc3RhdHMucXVldWVfd2FrZXVwKys7CisJCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCQl9CisJCV9fbmV0aWZfdHhfdW5sb2NrKHR4cSk7CisJfQorCisJdHhfcmluZy0+cGVyX25hcGlfYnl0ZXMgKz0gdHhfYnl0ZXM7CisJdHhfcmluZy0+cGVyX25hcGlfcGFja2V0cyArPSB0eF9wa3RzOworCisJcmV0dXJuIHR4X3BrdHM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZW5hX3J4X3NrYihzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcsCisJCQkJICBzdHJ1Y3QgZW5hX2NvbV9yeF9idWZfaW5mbyAqZW5hX2J1ZnMsCisJCQkJICB1MzIgZGVzY3MsCisJCQkJICB1MTYgKm5leHRfdG9fY2xlYW4pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgZW5hX3J4X2J1ZmZlciAqcnhfaW5mbyA9CisJCSZyeF9yaW5nLT5yeF9idWZmZXJfaW5mb1sqbmV4dF90b19jbGVhbl07CisJdTMyIGxlbjsKKwl1MzIgYnVmID0gMDsKKwl2b2lkICp2YTsKKworCWxlbiA9IGVuYV9idWZzWzBdLmxlbjsKKwlpZiAodW5saWtlbHkoIXJ4X2luZm8tPnBhZ2UpKSB7CisJCW5ldGlmX2VycihyeF9yaW5nLT5hZGFwdGVyLCByeF9lcnIsIHJ4X3JpbmctPm5ldGRldiwKKwkJCSAgIlBhZ2UgaXMgTlVMTFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCW5ldGlmX2RiZyhyeF9yaW5nLT5hZGFwdGVyLCByeF9zdGF0dXMsIHJ4X3JpbmctPm5ldGRldiwKKwkJICAicnhfaW5mbyAlcCBwYWdlICVwXG4iLAorCQkgIHJ4X2luZm8sIHJ4X2luZm8tPnBhZ2UpOworCisJLyogc2F2ZSB2aXJ0IGFkZHJlc3Mgb2YgZmlyc3QgYnVmZmVyICovCisJdmEgPSBwYWdlX2FkZHJlc3MocnhfaW5mby0+cGFnZSkgKyByeF9pbmZvLT5wYWdlX29mZnNldDsKKwlwcmVmZXRjaCh2YSArIE5FVF9JUF9BTElHTik7CisKKwlpZiAobGVuIDw9IHJ4X3JpbmctPnJ4X2NvcHlicmVhaykgeworCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKHJ4X3JpbmctPm5ldGRldiwKKwkJCQkJCXJ4X3JpbmctPnJ4X2NvcHlicmVhayk7CisJCWlmICh1bmxpa2VseSghc2tiKSkgeworCQkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfcmluZy0+c3luY3ApOworCQkJcnhfcmluZy0+cnhfc3RhdHMuc2tiX2FsbG9jX2ZhaWwrKzsKKwkJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisJCQluZXRpZl9lcnIocnhfcmluZy0+YWRhcHRlciwgcnhfZXJyLCByeF9yaW5nLT5uZXRkZXYsCisJCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIHNrYlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCW5ldGlmX2RiZyhyeF9yaW5nLT5hZGFwdGVyLCByeF9zdGF0dXMsIHJ4X3JpbmctPm5ldGRldiwKKwkJCSAgInJ4IGFsbG9jYXRlZCBzbWFsbCBwYWNrZXQuIGxlbiAlZC4gZGF0YV9sZW4gJWRcbiIsCisJCQkgIHNrYi0+bGVuLCBza2ItPmRhdGFfbGVuKTsKKworCQkvKiBzeW5jIHRoaXMgYnVmZmVyIGZvciBDUFUgdXNlICovCisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHJ4X3JpbmctPmRldiwKKwkJCQkJZG1hX3VubWFwX2FkZHIoJnJ4X2luZm8tPmVuYV9idWYsIHBhZGRyKSwKKwkJCQkJbGVuLAorCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQlza2JfY29weV90b19saW5lYXJfZGF0YShza2IsIHZhLCBsZW4pOworCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShyeF9yaW5nLT5kZXYsCisJCQkJCSAgIGRtYV91bm1hcF9hZGRyKCZyeF9pbmZvLT5lbmFfYnVmLCBwYWRkciksCisJCQkJCSAgIGxlbiwKKwkJCQkJICAgRE1BX0ZST01fREVWSUNFKTsKKworCQlza2JfcHV0KHNrYiwgbGVuKTsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcnhfcmluZy0+bmV0ZGV2KTsKKwkJKm5leHRfdG9fY2xlYW4gPSBFTkFfUlhfUklOR19JRFhfQUREKCpuZXh0X3RvX2NsZWFuLCBkZXNjcywKKwkJCQkJCSAgICAgcnhfcmluZy0+cmluZ19zaXplKTsKKwkJcmV0dXJuIHNrYjsKKwl9CisKKwlza2IgPSBuYXBpX2dldF9mcmFncyhyeF9yaW5nLT5uYXBpKTsKKwlpZiAodW5saWtlbHkoIXNrYikpIHsKKwkJbmV0aWZfZGJnKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X3N0YXR1cywgcnhfcmluZy0+bmV0ZGV2LAorCQkJICAiRmFpbGVkIGFsbG9jYXRpbmcgc2tiXG4iKTsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfcmluZy0+c3luY3ApOworCQlyeF9yaW5nLT5yeF9zdGF0cy5za2JfYWxsb2NfZmFpbCsrOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnhfcmluZy0+c3luY3ApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkbyB7CisJCWRtYV91bm1hcF9wYWdlKHJ4X3JpbmctPmRldiwKKwkJCSAgICAgICBkbWFfdW5tYXBfYWRkcigmcnhfaW5mby0+ZW5hX2J1ZiwgcGFkZHIpLAorCQkJICAgICAgIFBBR0VfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKKworCQlza2JfYWRkX3J4X2ZyYWcoc2tiLCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLCByeF9pbmZvLT5wYWdlLAorCQkJCXJ4X2luZm8tPnBhZ2Vfb2Zmc2V0LCBsZW4sIFBBR0VfU0laRSk7CisKKwkJbmV0aWZfZGJnKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X3N0YXR1cywgcnhfcmluZy0+bmV0ZGV2LAorCQkJICAicnggc2tiIHVwZGF0ZWQuIGxlbiAlZC4gZGF0YV9sZW4gJWRcbiIsCisJCQkgIHNrYi0+bGVuLCBza2ItPmRhdGFfbGVuKTsKKworCQlyeF9pbmZvLT5wYWdlID0gTlVMTDsKKwkJKm5leHRfdG9fY2xlYW4gPQorCQkJRU5BX1JYX1JJTkdfSURYX05FWFQoKm5leHRfdG9fY2xlYW4sCisJCQkJCSAgICAgcnhfcmluZy0+cmluZ19zaXplKTsKKwkJaWYgKGxpa2VseSgtLWRlc2NzID09IDApKQorCQkJYnJlYWs7CisJCXJ4X2luZm8gPSAmcnhfcmluZy0+cnhfYnVmZmVyX2luZm9bKm5leHRfdG9fY2xlYW5dOworCQlsZW4gPSBlbmFfYnVmc1srK2J1Zl0ubGVuOworCX0gd2hpbGUgKDEpOworCisJcmV0dXJuIHNrYjsKK30KKworLyogZW5hX3J4X2NoZWNrc3VtIC0gaW5kaWNhdGUgaW4gc2tiIGlmIGh3IGluZGljYXRlZCBhIGdvb2QgY2tzdW0KKyAqIEBhZGFwdGVyOiBzdHJ1Y3R1cmUgY29udGFpbmluZyBhZGFwdGVyIHNwZWNpZmljIGRhdGEKKyAqIEBlbmFfcnhfY3R4OiByZWNlaXZlZCBwYWNrZXQgY29udGV4dC9tZXRhZGF0YQorICogQHNrYjogc2tiIGN1cnJlbnRseSBiZWluZyByZWNlaXZlZCBhbmQgbW9kaWZpZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGVuYV9yeF9jaGVja3N1bShzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcsCisJCQkJICAgc3RydWN0IGVuYV9jb21fcnhfY3R4ICplbmFfcnhfY3R4LAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogUnggY3N1bSBkaXNhYmxlZCAqLworCWlmICh1bmxpa2VseSghKHJ4X3JpbmctPm5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkpKSB7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwkJcmV0dXJuOworCX0KKworCS8qIEZvciBmcmFnbWVudGVkIHBhY2tldHMgdGhlIGNoZWNrc3VtIGlzbid0IHZhbGlkICovCisJaWYgKGVuYV9yeF9jdHgtPmZyYWcpIHsKKwkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOworCQlyZXR1cm47CisJfQorCisJLyogaWYgSVAgYW5kIGVycm9yICovCisJaWYgKHVubGlrZWx5KChlbmFfcnhfY3R4LT5sM19wcm90byA9PSBFTkFfRVRIX0lPX0wzX1BST1RPX0lQVjQpICYmCisJCSAgICAgKGVuYV9yeF9jdHgtPmwzX2NzdW1fZXJyKSkpIHsKKwkJLyogaXB2NCBjaGVja3N1bSBlcnJvciAqLworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJ4X3JpbmctPnN5bmNwKTsKKwkJcnhfcmluZy0+cnhfc3RhdHMuYmFkX2NzdW0rKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3JpbmctPnN5bmNwKTsKKwkJbmV0aWZfZXJyKHJ4X3JpbmctPmFkYXB0ZXIsIHJ4X2VyciwgcnhfcmluZy0+bmV0ZGV2LAorCQkJICAiUlggSVB2NCBoZWFkZXIgY2hlY2tzdW0gZXJyb3JcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogaWYgVENQL1VEUCAqLworCWlmIChsaWtlbHkoKGVuYV9yeF9jdHgtPmw0X3Byb3RvID09IEVOQV9FVEhfSU9fTDRfUFJPVE9fVENQKSB8fAorCQkgICAoZW5hX3J4X2N0eC0+bDRfcHJvdG8gPT0gRU5BX0VUSF9JT19MNF9QUk9UT19VRFApKSkgeworCQlpZiAodW5saWtlbHkoZW5hX3J4X2N0eC0+bDRfY3N1bV9lcnIpKSB7CisJCQkvKiBUQ1AvVURQIGNoZWNrc3VtIGVycm9yICovCisJCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CisJCQlyeF9yaW5nLT5yeF9zdGF0cy5iYWRfY3N1bSsrOworCQkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3JpbmctPnN5bmNwKTsKKwkJCW5ldGlmX2VycihyeF9yaW5nLT5hZGFwdGVyLCByeF9lcnIsIHJ4X3JpbmctPm5ldGRldiwKKwkJCQkgICJSWCBMNCBjaGVja3N1bSBlcnJvclxuIik7CisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJCQlyZXR1cm47CisJCX0KKworCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCX0KK30KKworc3RhdGljIHZvaWQgZW5hX3NldF9yeF9oYXNoKHN0cnVjdCBlbmFfcmluZyAqcnhfcmluZywKKwkJCSAgICBzdHJ1Y3QgZW5hX2NvbV9yeF9jdHggKmVuYV9yeF9jdHgsCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwllbnVtIHBrdF9oYXNoX3R5cGVzIGhhc2hfdHlwZTsKKworCWlmIChsaWtlbHkocnhfcmluZy0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhIQVNIKSkgeworCQlpZiAobGlrZWx5KChlbmFfcnhfY3R4LT5sNF9wcm90byA9PSBFTkFfRVRIX0lPX0w0X1BST1RPX1RDUCkgfHwKKwkJCSAgIChlbmFfcnhfY3R4LT5sNF9wcm90byA9PSBFTkFfRVRIX0lPX0w0X1BST1RPX1VEUCkpKQorCisJCQloYXNoX3R5cGUgPSBQS1RfSEFTSF9UWVBFX0w0OworCQllbHNlCisJCQloYXNoX3R5cGUgPSBQS1RfSEFTSF9UWVBFX05PTkU7CisKKwkJLyogT3ZlcnJpZGUgaGFzaCB0eXBlIGlmIHRoZSBwYWNrZXQgaXMgZnJhZ21lbnRlZCAqLworCQlpZiAoZW5hX3J4X2N0eC0+ZnJhZykKKwkJCWhhc2hfdHlwZSA9IFBLVF9IQVNIX1RZUEVfTk9ORTsKKworCQlza2Jfc2V0X2hhc2goc2tiLCBlbmFfcnhfY3R4LT5oYXNoLCBoYXNoX3R5cGUpOworCX0KK30KKworLyogZW5hX2NsZWFuX3J4X2lycSAtIENsZWFudXAgUlggaXJxCisgKiBAcnhfcmluZzogUlggcmluZyB0byBjbGVhbgorICogQG5hcGk6IG5hcGkgaGFuZGxlcgorICogQGJ1ZGdldDogaG93IG1hbnkgcGFja2V0cyBkcml2ZXIgaXMgYWxsb3dlZCB0byBjbGVhbgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjbGVhbmVkIGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyBpbnQgZW5hX2NsZWFuX3J4X2lycShzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcsIHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwKKwkJCSAgICB1MzIgYnVkZ2V0KQoreworCXUxNiBuZXh0X3RvX2NsZWFuID0gcnhfcmluZy0+bmV4dF90b19jbGVhbjsKKwl1MzIgcmVzX2J1ZGdldCwgd29ya19kb25lOworCisJc3RydWN0IGVuYV9jb21fcnhfY3R4IGVuYV9yeF9jdHg7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJlZmlsbF9yZXF1aXJlZDsKKwlpbnQgcmVmaWxsX3RocmVzaG9sZDsKKwlpbnQgcmMgPSAwOworCWludCB0b3RhbF9sZW4gPSAwOworCWludCByeF9jb3B5YnJlYWtfcGt0ID0gMDsKKworCW5ldGlmX2RiZyhyeF9yaW5nLT5hZGFwdGVyLCByeF9zdGF0dXMsIHJ4X3JpbmctPm5ldGRldiwKKwkJICAiJXMgcWlkICVkXG4iLCBfX2Z1bmNfXywgcnhfcmluZy0+cWlkKTsKKwlyZXNfYnVkZ2V0ID0gYnVkZ2V0OworCisJZG8geworCQllbmFfcnhfY3R4LmVuYV9idWZzID0gcnhfcmluZy0+ZW5hX2J1ZnM7CisJCWVuYV9yeF9jdHgubWF4X2J1ZnMgPSByeF9yaW5nLT5zZ2xfc2l6ZTsKKwkJZW5hX3J4X2N0eC5kZXNjcyA9IDA7CisJCXJjID0gZW5hX2NvbV9yeF9wa3QocnhfcmluZy0+ZW5hX2NvbV9pb19jcSwKKwkJCQkgICAgcnhfcmluZy0+ZW5hX2NvbV9pb19zcSwKKwkJCQkgICAgJmVuYV9yeF9jdHgpOworCQlpZiAodW5saWtlbHkocmMpKQorCQkJZ290byBlcnJvcjsKKworCQlpZiAodW5saWtlbHkoZW5hX3J4X2N0eC5kZXNjcyA9PSAwKSkKKwkJCWJyZWFrOworCisJCW5ldGlmX2RiZyhyeF9yaW5nLT5hZGFwdGVyLCByeF9zdGF0dXMsIHJ4X3JpbmctPm5ldGRldiwKKwkJCSAgInJ4X3BvbGw6IHEgJWQgZ290IHBhY2tldCBmcm9tIGVuYS4gZGVzY3MgIzogJWQgbDMgcHJvdG8gJWQgbDQgcHJvdG8gJWQgaGFzaDogJXhcbiIsCisJCQkgIHJ4X3JpbmctPnFpZCwgZW5hX3J4X2N0eC5kZXNjcywgZW5hX3J4X2N0eC5sM19wcm90bywKKwkJCSAgZW5hX3J4X2N0eC5sNF9wcm90bywgZW5hX3J4X2N0eC5oYXNoKTsKKworCQkvKiBhbGxvY2F0ZSBza2IgYW5kIGZpbGwgaXQgKi8KKwkJc2tiID0gZW5hX3J4X3NrYihyeF9yaW5nLCByeF9yaW5nLT5lbmFfYnVmcywgZW5hX3J4X2N0eC5kZXNjcywKKwkJCQkgJm5leHRfdG9fY2xlYW4pOworCisJCS8qIGV4aXQgaWYgd2UgZmFpbGVkIHRvIHJldHJpZXZlIGEgYnVmZmVyICovCisJCWlmICh1bmxpa2VseSghc2tiKSkgeworCQkJbmV4dF90b19jbGVhbiA9IEVOQV9SWF9SSU5HX0lEWF9BREQobmV4dF90b19jbGVhbiwKKwkJCQkJCQkgICAgZW5hX3J4X2N0eC5kZXNjcywKKwkJCQkJCQkgICAgcnhfcmluZy0+cmluZ19zaXplKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZW5hX3J4X2NoZWNrc3VtKHJ4X3JpbmcsICZlbmFfcnhfY3R4LCBza2IpOworCisJCWVuYV9zZXRfcnhfaGFzaChyeF9yaW5nLCAmZW5hX3J4X2N0eCwgc2tiKTsKKworCQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcnhfcmluZy0+cWlkKTsKKworCQlpZiAocnhfcmluZy0+ZW5hX2J1ZnNbMF0ubGVuIDw9IHJ4X3JpbmctPnJ4X2NvcHlicmVhaykgeworCQkJdG90YWxfbGVuICs9IHJ4X3JpbmctPmVuYV9idWZzWzBdLmxlbjsKKwkJCXJ4X2NvcHlicmVha19wa3QrKzsKKwkJCW5hcGlfZ3JvX3JlY2VpdmUobmFwaSwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJCXRvdGFsX2xlbiArPSBza2ItPmxlbjsKKwkJCW5hcGlfZ3JvX2ZyYWdzKG5hcGkpOworCQl9CisKKwkJcmVzX2J1ZGdldC0tOworCX0gd2hpbGUgKGxpa2VseShyZXNfYnVkZ2V0KSk7CisKKwl3b3JrX2RvbmUgPSBidWRnZXQgLSByZXNfYnVkZ2V0OworCXJ4X3JpbmctPnBlcl9uYXBpX2J5dGVzICs9IHRvdGFsX2xlbjsKKwlyeF9yaW5nLT5wZXJfbmFwaV9wYWNrZXRzICs9IHdvcmtfZG9uZTsKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CisJcnhfcmluZy0+cnhfc3RhdHMuYnl0ZXMgKz0gdG90YWxfbGVuOworCXJ4X3JpbmctPnJ4X3N0YXRzLmNudCArPSB3b3JrX2RvbmU7CisJcnhfcmluZy0+cnhfc3RhdHMucnhfY29weWJyZWFrX3BrdCArPSByeF9jb3B5YnJlYWtfcGt0OworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisKKwlyeF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gbmV4dF90b19jbGVhbjsKKworCXJlZmlsbF9yZXF1aXJlZCA9IGVuYV9jb21fc3FfZW1wdHlfc3BhY2UocnhfcmluZy0+ZW5hX2NvbV9pb19zcSk7CisJcmVmaWxsX3RocmVzaG9sZCA9IHJ4X3JpbmctPnJpbmdfc2l6ZSAvIEVOQV9SWF9SRUZJTExfVEhSRVNIX0RJVklERVI7CisKKwkvKiBPcHRpbWl6YXRpb24sIHRyeSB0byBiYXRjaCBuZXcgcnggYnVmZmVycyAqLworCWlmIChyZWZpbGxfcmVxdWlyZWQgPiByZWZpbGxfdGhyZXNob2xkKSB7CisJCWVuYV9jb21fdXBkYXRlX2Rldl9jb21wX2hlYWQocnhfcmluZy0+ZW5hX2NvbV9pb19jcSk7CisJCWVuYV9yZWZpbGxfcnhfYnVmcyhyeF9yaW5nLCByZWZpbGxfcmVxdWlyZWQpOworCX0KKworCXJldHVybiB3b3JrX2RvbmU7CisKK2Vycm9yOgorCWFkYXB0ZXIgPSBuZXRkZXZfcHJpdihyeF9yaW5nLT5uZXRkZXYpOworCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfcmluZy0+c3luY3ApOworCXJ4X3JpbmctPnJ4X3N0YXRzLmJhZF9kZXNjX251bSsrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisKKwkvKiBUb28gbWFueSBkZXNjIGZyb20gdGhlIGRldmljZS4gVHJpZ2dlciByZXNldCAqLworCXNldF9iaXQoRU5BX0ZMQUdfVFJJR0dFUl9SRVNFVCwgJmFkYXB0ZXItPmZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbmxpbmUgdm9pZCBlbmFfYWRqdXN0X2ludHJfbW9kZXJhdGlvbihzdHJ1Y3QgZW5hX3JpbmcgKnJ4X3JpbmcsCisJCQkJICAgICAgIHN0cnVjdCBlbmFfcmluZyAqdHhfcmluZykKK3sKKwkvKiBXZSBhcHBseSBhZGFwdGl2ZSBtb2RlcmF0aW9uIG9uIFJ4IHBhdGggb25seS4KKwkgKiBUeCB1c2VzIHN0YXRpYyBpbnRlcnJ1cHQgbW9kZXJhdGlvbi4KKwkgKi8KKwllbmFfY29tX2NhbGN1bGF0ZV9pbnRlcnJ1cHRfZGVsYXkocnhfcmluZy0+ZW5hX2RldiwKKwkJCQkJICByeF9yaW5nLT5wZXJfbmFwaV9wYWNrZXRzLAorCQkJCQkgIHJ4X3JpbmctPnBlcl9uYXBpX2J5dGVzLAorCQkJCQkgICZyeF9yaW5nLT5zbW9vdGhlZF9pbnRlcnZhbCwKKwkJCQkJICAmcnhfcmluZy0+bW9kZXJfdGJsX2lkeCk7CisKKwkvKiBSZXNldCBwZXIgbmFwaSBwYWNrZXRzL2J5dGVzICovCisJdHhfcmluZy0+cGVyX25hcGlfcGFja2V0cyA9IDA7CisJdHhfcmluZy0+cGVyX25hcGlfYnl0ZXMgPSAwOworCXJ4X3JpbmctPnBlcl9uYXBpX3BhY2tldHMgPSAwOworCXJ4X3JpbmctPnBlcl9uYXBpX2J5dGVzID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYV91cGRhdGVfcmluZ19udW1hX25vZGUoc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nLAorCQkJCQkgICAgIHN0cnVjdCBlbmFfcmluZyAqcnhfcmluZykKK3sKKwlpbnQgY3B1ID0gZ2V0X2NwdSgpOworCWludCBudW1hX25vZGU7CisKKwkvKiBDaGVjayBvbmx5IG9uZSByaW5nIHNpbmNlIHRoZSAyIHJpbmdzIGFyZSBydW5uaW5nIG9uIHRoZSBzYW1lIGNwdSAqLworCWlmIChsaWtlbHkodHhfcmluZy0+Y3B1ID09IGNwdSkpCisJCWdvdG8gb3V0OworCisJbnVtYV9ub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKKwlwdXRfY3B1KCk7CisKKwlpZiAobnVtYV9ub2RlICE9IE5VTUFfTk9fTk9ERSkgeworCQllbmFfY29tX3VwZGF0ZV9udW1hX25vZGUodHhfcmluZy0+ZW5hX2NvbV9pb19jcSwgbnVtYV9ub2RlKTsKKwkJZW5hX2NvbV91cGRhdGVfbnVtYV9ub2RlKHJ4X3JpbmctPmVuYV9jb21faW9fY3EsIG51bWFfbm9kZSk7CisJfQorCisJdHhfcmluZy0+Y3B1ID0gY3B1OworCXJ4X3JpbmctPmNwdSA9IGNwdTsKKworCXJldHVybjsKK291dDoKKwlwdXRfY3B1KCk7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2lvX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQoreworCXN0cnVjdCBlbmFfbmFwaSAqZW5hX25hcGkgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IGVuYV9uYXBpLCBuYXBpKTsKKwlzdHJ1Y3QgZW5hX3JpbmcgKnR4X3JpbmcsICpyeF9yaW5nOworCXN0cnVjdCBlbmFfZXRoX2lvX2ludHJfcmVnIGludHJfcmVnOworCisJdTMyIHR4X3dvcmtfZG9uZTsKKwl1MzIgcnhfd29ya19kb25lOworCWludCB0eF9idWRnZXQ7CisJaW50IG5hcGlfY29tcF9jYWxsID0gMDsKKwlpbnQgcmV0OworCisJdHhfcmluZyA9IGVuYV9uYXBpLT50eF9yaW5nOworCXJ4X3JpbmcgPSBlbmFfbmFwaS0+cnhfcmluZzsKKworCXR4X2J1ZGdldCA9IHR4X3JpbmctPnJpbmdfc2l6ZSAvIEVOQV9UWF9QT0xMX0JVREdFVF9ESVZJREVSOworCisJaWYgKCF0ZXN0X2JpdChFTkFfRkxBR19ERVZfVVAsICZ0eF9yaW5nLT5hZGFwdGVyLT5mbGFncykpIHsKKwkJbmFwaV9jb21wbGV0ZV9kb25lKG5hcGksIDApOworCQlyZXR1cm4gMDsKKwl9CisKKwl0eF93b3JrX2RvbmUgPSBlbmFfY2xlYW5fdHhfaXJxKHR4X3JpbmcsIHR4X2J1ZGdldCk7CisJcnhfd29ya19kb25lID0gZW5hX2NsZWFuX3J4X2lycShyeF9yaW5nLCBuYXBpLCBidWRnZXQpOworCisJaWYgKChidWRnZXQgPiByeF93b3JrX2RvbmUpICYmICh0eF9idWRnZXQgPiB0eF93b3JrX2RvbmUpKSB7CisJCW5hcGlfY29tcGxldGVfZG9uZShuYXBpLCByeF93b3JrX2RvbmUpOworCisJCW5hcGlfY29tcF9jYWxsID0gMTsKKwkJLyogVHggYW5kIFJ4IHNoYXJlIHRoZSBzYW1lIGludGVycnVwdCB2ZWN0b3IgKi8KKwkJaWYgKGVuYV9jb21fZ2V0X2FkYXB0aXZlX21vZGVyYXRpb25fZW5hYmxlZChyeF9yaW5nLT5lbmFfZGV2KSkKKwkJCWVuYV9hZGp1c3RfaW50cl9tb2RlcmF0aW9uKHJ4X3JpbmcsIHR4X3JpbmcpOworCisJCS8qIFVwZGF0ZSBpbnRyIHJlZ2lzdGVyOiByeCBpbnRyIGRlbGF5LCB0eCBpbnRyIGRlbGF5IGFuZAorCQkgKiBpbnRlcnJ1cHQgdW5tYXNrCisJCSAqLworCQllbmFfY29tX3VwZGF0ZV9pbnRyX3JlZygmaW50cl9yZWcsCisJCQkJCXJ4X3JpbmctPnNtb290aGVkX2ludGVydmFsLAorCQkJCQl0eF9yaW5nLT5zbW9vdGhlZF9pbnRlcnZhbCwKKwkJCQkJdHJ1ZSk7CisKKwkJLyogSXQgaXMgYSBzaGFyZWQgTVNJLVguIFR4IGFuZCBSeCBDUSBoYXZlIHBvaW50ZXIgdG8gaXQuCisJCSAqIFNvIHdlIHVzZSBvbmUgb2YgdGhlbSB0byByZWFjaCB0aGUgaW50ciByZWcKKwkJICovCisJCWVuYV9jb21fdW5tYXNrX2ludHIocnhfcmluZy0+ZW5hX2NvbV9pb19jcSwgJmludHJfcmVnKTsKKworCQllbmFfdXBkYXRlX3JpbmdfbnVtYV9ub2RlKHR4X3JpbmcsIHJ4X3JpbmcpOworCisJCXJldCA9IHJ4X3dvcmtfZG9uZTsKKwl9IGVsc2UgeworCQlyZXQgPSBidWRnZXQ7CisJfQorCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCXR4X3JpbmctPnR4X3N0YXRzLm5hcGlfY29tcCArPSBuYXBpX2NvbXBfY2FsbDsKKwl0eF9yaW5nLT50eF9zdGF0cy50eF9wb2xsKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlbmFfaW50cl9tc2l4X21nbW50KGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBlbmFfYWRhcHRlciAqKWRhdGE7CisKKwllbmFfY29tX2FkbWluX3FfY29tcF9pbnRyX2hhbmRsZXIoYWRhcHRlci0+ZW5hX2Rldik7CisKKwkvKiBEb24ndCBjYWxsIHRoZSBhZW5xIGhhbmRsZXIgYmVmb3JlIHByb2JlIGlzIGRvbmUgKi8KKwlpZiAobGlrZWx5KHRlc3RfYml0KEVOQV9GTEFHX0RFVklDRV9SVU5OSU5HLCAmYWRhcHRlci0+ZmxhZ3MpKSkKKwkJZW5hX2NvbV9hZW5xX2ludHJfaGFuZGxlcihhZGFwdGVyLT5lbmFfZGV2LCBkYXRhKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogZW5hX2ludHJfbXNpeF9pbyAtIE1TSS1YIEludGVycnVwdCBIYW5kbGVyIGZvciBUeC9SeAorICogQGlycTogaW50ZXJydXB0IG51bWJlcgorICogQGRhdGE6IHBvaW50ZXIgdG8gYSBuZXR3b3JrIGludGVyZmFjZSBwcml2YXRlIG5hcGkgZGV2aWNlIHN0cnVjdHVyZQorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZW5hX2ludHJfbXNpeF9pbyhpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBlbmFfbmFwaSAqZW5hX25hcGkgPSBkYXRhOworCisJbmFwaV9zY2hlZHVsZSgmZW5hX25hcGktPm5hcGkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGVuYV9lbmFibGVfbXNpeChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBudW1fcXVldWVzKQoreworCWludCBpLCBtc2l4X3ZlY3MsIHJjOworCisJaWYgKHRlc3RfYml0KEVOQV9GTEFHX01TSVhfRU5BQkxFRCwgJmFkYXB0ZXItPmZsYWdzKSkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgcHJvYmUsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIkVycm9yLCBNU0ktWCBpcyBhbHJlYWR5IGVuYWJsZWRcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCS8qIFJlc2VydmVkIHRoZSBtYXggbXNpeCB2ZWN0b3JzIHdlIG1pZ2h0IG5lZWQgKi8KKwltc2l4X3ZlY3MgPSBFTkFfTUFYX01TSVhfVkVDKG51bV9xdWV1ZXMpOworCisJbmV0aWZfZGJnKGFkYXB0ZXIsIHByb2JlLCBhZGFwdGVyLT5uZXRkZXYsCisJCSAgInRyeWluZyB0byBlbmFibGUgTVNJLVgsIHZlY3RvcnMgJWRcbiIsIG1zaXhfdmVjcyk7CisKKwlhZGFwdGVyLT5tc2l4X2VudHJpZXMgPSB2emFsbG9jKG1zaXhfdmVjcyAqIHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSkpOworCisJaWYgKCFhZGFwdGVyLT5tc2l4X2VudHJpZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IG1zaXhfdmVjczsgaSsrKQorCQlhZGFwdGVyLT5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOworCisJcmMgPSBwY2lfZW5hYmxlX21zaXgoYWRhcHRlci0+cGRldiwgYWRhcHRlci0+bXNpeF9lbnRyaWVzLCBtc2l4X3ZlY3MpOworCWlmIChyYyAhPSAwKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBwcm9iZSwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiRmFpbGVkIHRvIGVuYWJsZSBNU0ktWCwgdmVjdG9ycyAlZCByYyAlZFxuIiwKKwkJCSAgbXNpeF92ZWNzLCByYyk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCW5ldGlmX2RiZyhhZGFwdGVyLCBwcm9iZSwgYWRhcHRlci0+bmV0ZGV2LCAiZW5hYmxlIE1TSS1YLCB2ZWN0b3JzICVkXG4iLAorCQkgIG1zaXhfdmVjcyk7CisKKwlpZiAobXNpeF92ZWNzID49IDEpIHsKKwkJaWYgKGVuYV9pbml0X3J4X2NwdV9ybWFwKGFkYXB0ZXIpKQorCQkJbmV0aWZfd2FybihhZGFwdGVyLCBwcm9iZSwgYWRhcHRlci0+bmV0ZGV2LAorCQkJCSAgICJGYWlsZWQgdG8gbWFwIElSUXMgdG8gQ1BVc1xuIik7CisJfQorCisJYWRhcHRlci0+bXNpeF92ZWNzID0gbXNpeF92ZWNzOworCXNldF9iaXQoRU5BX0ZMQUdfTVNJWF9FTkFCTEVELCAmYWRhcHRlci0+ZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9zZXR1cF9tZ21udF9pbnRyKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgY3B1OworCisJc25wcmludGYoYWRhcHRlci0+aXJxX3RibFtFTkFfTUdNTlRfSVJRX0lEWF0ubmFtZSwKKwkJIEVOQV9JUlFOQU1FX1NJWkUsICJlbmEtbWdtbnRAcGNpOiVzIiwKKwkJIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpKTsKKwlhZGFwdGVyLT5pcnFfdGJsW0VOQV9NR01OVF9JUlFfSURYXS5oYW5kbGVyID0KKwkJZW5hX2ludHJfbXNpeF9tZ21udDsKKwlhZGFwdGVyLT5pcnFfdGJsW0VOQV9NR01OVF9JUlFfSURYXS5kYXRhID0gYWRhcHRlcjsKKwlhZGFwdGVyLT5pcnFfdGJsW0VOQV9NR01OVF9JUlFfSURYXS52ZWN0b3IgPQorCQlhZGFwdGVyLT5tc2l4X2VudHJpZXNbRU5BX01HTU5UX0lSUV9JRFhdLnZlY3RvcjsKKwljcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9vbmxpbmVfbWFzayk7CisJYWRhcHRlci0+aXJxX3RibFtFTkFfTUdNTlRfSVJRX0lEWF0uY3B1ID0gY3B1OworCWNwdW1hc2tfc2V0X2NwdShjcHUsCisJCQkmYWRhcHRlci0+aXJxX3RibFtFTkFfTUdNTlRfSVJRX0lEWF0uYWZmaW5pdHlfaGludF9tYXNrKTsKK30KKworc3RhdGljIHZvaWQgZW5hX3NldHVwX2lvX2ludHIoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJaW50IGlycV9pZHgsIGksIGNwdTsKKworCW5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJaXJxX2lkeCA9IEVOQV9JT19JUlFfSURYKGkpOworCQljcHUgPSBpICUgbnVtX29ubGluZV9jcHVzKCk7CisKKwkJc25wcmludGYoYWRhcHRlci0+aXJxX3RibFtpcnFfaWR4XS5uYW1lLCBFTkFfSVJRTkFNRV9TSVpFLAorCQkJICIlcy1UeC1SeC0lZCIsIG5ldGRldi0+bmFtZSwgaSk7CisJCWFkYXB0ZXItPmlycV90YmxbaXJxX2lkeF0uaGFuZGxlciA9IGVuYV9pbnRyX21zaXhfaW87CisJCWFkYXB0ZXItPmlycV90YmxbaXJxX2lkeF0uZGF0YSA9ICZhZGFwdGVyLT5lbmFfbmFwaVtpXTsKKwkJYWRhcHRlci0+aXJxX3RibFtpcnFfaWR4XS52ZWN0b3IgPQorCQkJYWRhcHRlci0+bXNpeF9lbnRyaWVzW2lycV9pZHhdLnZlY3RvcjsKKwkJYWRhcHRlci0+aXJxX3RibFtpcnFfaWR4XS5jcHUgPSBjcHU7CisKKwkJY3B1bWFza19zZXRfY3B1KGNwdSwKKwkJCQkmYWRhcHRlci0+aXJxX3RibFtpcnFfaWR4XS5hZmZpbml0eV9oaW50X21hc2spOworCX0KK30KKworc3RhdGljIGludCBlbmFfcmVxdWVzdF9tZ21udF9pcnEoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXN0cnVjdCBlbmFfaXJxICppcnE7CisJaW50IHJjOworCisJaXJxID0gJmFkYXB0ZXItPmlycV90YmxbRU5BX01HTU5UX0lSUV9JRFhdOworCXJjID0gcmVxdWVzdF9pcnEoaXJxLT52ZWN0b3IsIGlycS0+aGFuZGxlciwgZmxhZ3MsIGlycS0+bmFtZSwKKwkJCSBpcnEtPmRhdGEpOworCWlmIChyYykgeworCQluZXRpZl9lcnIoYWRhcHRlciwgcHJvYmUsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgImZhaWxlZCB0byByZXF1ZXN0IGFkbWluIGlycVxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwluZXRpZl9kYmcoYWRhcHRlciwgcHJvYmUsIGFkYXB0ZXItPm5ldGRldiwKKwkJICAic2V0IGFmZmluaXR5IGhpbnQgb2YgbWdtbnQgaXJxLnRvIDB4JWx4IChpcnEgdmVjdG9yOiAlZClcbiIsCisJCSAgaXJxLT5hZmZpbml0eV9oaW50X21hc2suYml0c1swXSwgaXJxLT52ZWN0b3IpOworCisJaXJxX3NldF9hZmZpbml0eV9oaW50KGlycS0+dmVjdG9yLCAmaXJxLT5hZmZpbml0eV9oaW50X21hc2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVuYV9yZXF1ZXN0X2lvX2lycShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RydWN0IGVuYV9pcnEgKmlycTsKKwlpbnQgcmMgPSAwLCBpLCBrOworCisJaWYgKCF0ZXN0X2JpdChFTkFfRkxBR19NU0lYX0VOQUJMRUQsICZhZGFwdGVyLT5mbGFncykpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIkZhaWxlZCB0byByZXF1ZXN0IEkvTyBJUlE6IE1TSS1YIGlzIG5vdCBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gRU5BX0lPX0lSUV9GSVJTVF9JRFg7IGkgPCBhZGFwdGVyLT5tc2l4X3ZlY3M7IGkrKykgeworCQlpcnEgPSAmYWRhcHRlci0+aXJxX3RibFtpXTsKKwkJcmMgPSByZXF1ZXN0X2lycShpcnEtPnZlY3RvciwgaXJxLT5oYW5kbGVyLCBmbGFncywgaXJxLT5uYW1lLAorCQkJCSBpcnEtPmRhdGEpOworCQlpZiAocmMpIHsKKwkJCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkJICAiRmFpbGVkIHRvIHJlcXVlc3QgSS9PIElSUS4gaW5kZXggJWQgcmMgJWRcbiIsCisJCQkJICAgaSwgcmMpOworCQkJZ290byBlcnI7CisJCX0KKworCQluZXRpZl9kYmcoYWRhcHRlciwgaWZ1cCwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAic2V0IGFmZmluaXR5IGhpbnQgb2YgaXJxLiBpbmRleCAlZCB0byAweCVseCAoaXJxIHZlY3RvcjogJWQpXG4iLAorCQkJICBpLCBpcnEtPmFmZmluaXR5X2hpbnRfbWFzay5iaXRzWzBdLCBpcnEtPnZlY3Rvcik7CisKKwkJaXJxX3NldF9hZmZpbml0eV9oaW50KGlycS0+dmVjdG9yLCAmaXJxLT5hZmZpbml0eV9oaW50X21hc2spOworCX0KKworCXJldHVybiByYzsKKworZXJyOgorCWZvciAoayA9IEVOQV9JT19JUlFfRklSU1RfSURYOyBrIDwgaTsgaysrKSB7CisJCWlycSA9ICZhZGFwdGVyLT5pcnFfdGJsW2tdOworCQlmcmVlX2lycShpcnEtPnZlY3RvciwgaXJxLT5kYXRhKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9mcmVlX21nbW50X2lycShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGVuYV9pcnEgKmlycTsKKworCWlycSA9ICZhZGFwdGVyLT5pcnFfdGJsW0VOQV9NR01OVF9JUlFfSURYXTsKKwlzeW5jaHJvbml6ZV9pcnEoaXJxLT52ZWN0b3IpOworCWlycV9zZXRfYWZmaW5pdHlfaGludChpcnEtPnZlY3RvciwgTlVMTCk7CisJZnJlZV9pcnEoaXJxLT52ZWN0b3IsIGlycS0+ZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9mcmVlX2lvX2lycShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGVuYV9pcnEgKmlycTsKKwlpbnQgaTsKKworI2lmZGVmIENPTkZJR19SRlNfQUNDRUwKKwlpZiAoYWRhcHRlci0+bXNpeF92ZWNzID49IDEpIHsKKwkJZnJlZV9pcnFfY3B1X3JtYXAoYWRhcHRlci0+bmV0ZGV2LT5yeF9jcHVfcm1hcCk7CisJCWFkYXB0ZXItPm5ldGRldi0+cnhfY3B1X3JtYXAgPSBOVUxMOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUkZTX0FDQ0VMICovCisKKwlmb3IgKGkgPSBFTkFfSU9fSVJRX0ZJUlNUX0lEWDsgaSA8IGFkYXB0ZXItPm1zaXhfdmVjczsgaSsrKSB7CisJCWlycSA9ICZhZGFwdGVyLT5pcnFfdGJsW2ldOworCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoaXJxLT52ZWN0b3IsIE5VTEwpOworCQlmcmVlX2lycShpcnEtPnZlY3RvciwgaXJxLT5kYXRhKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9kaXNhYmxlX21zaXgoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRU5BX0ZMQUdfTVNJWF9FTkFCTEVELCAmYWRhcHRlci0+ZmxhZ3MpKQorCQlwY2lfZGlzYWJsZV9tc2l4KGFkYXB0ZXItPnBkZXYpOworCisJaWYgKGFkYXB0ZXItPm1zaXhfZW50cmllcykKKwkJdmZyZWUoYWRhcHRlci0+bXNpeF9lbnRyaWVzKTsKKwlhZGFwdGVyLT5tc2l4X2VudHJpZXMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBlbmFfZGlzYWJsZV9pb19pbnRyX3N5bmMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpCisJCXJldHVybjsKKworCWZvciAoaSA9IEVOQV9JT19JUlFfRklSU1RfSURYOyBpIDwgYWRhcHRlci0+bXNpeF92ZWNzOyBpKyspCisJCXN5bmNocm9uaXplX2lycShhZGFwdGVyLT5pcnFfdGJsW2ldLnZlY3Rvcik7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9kZWxfbmFwaShzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKQorCQluZXRpZl9uYXBpX2RlbCgmYWRhcHRlci0+ZW5hX25hcGlbaV0ubmFwaSk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9pbml0X25hcGkoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlbmFfbmFwaSAqbmFwaTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJbmFwaSA9ICZhZGFwdGVyLT5lbmFfbmFwaVtpXTsKKworCQluZXRpZl9uYXBpX2FkZChhZGFwdGVyLT5uZXRkZXYsCisJCQkgICAgICAgJmFkYXB0ZXItPmVuYV9uYXBpW2ldLm5hcGksCisJCQkgICAgICAgZW5hX2lvX3BvbGwsCisJCQkgICAgICAgRU5BX05BUElfQlVER0VUKTsKKwkJbmFwaS0+cnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nW2ldOworCQluYXBpLT50eF9yaW5nID0gJmFkYXB0ZXItPnR4X3JpbmdbaV07CisJCW5hcGktPnFpZCA9IGk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFfbmFwaV9kaXNhYmxlX2FsbChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKQorCQluYXBpX2Rpc2FibGUoJmFkYXB0ZXItPmVuYV9uYXBpW2ldLm5hcGkpOworfQorCitzdGF0aWMgdm9pZCBlbmFfbmFwaV9lbmFibGVfYWxsKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCW5hcGlfZW5hYmxlKCZhZGFwdGVyLT5lbmFfbmFwaVtpXS5uYXBpKTsKK30KKworc3RhdGljIHZvaWQgZW5hX3Jlc3RvcmVfZXRodG9vbF9wYXJhbXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWFkYXB0ZXItPnR4X3VzZWNzID0gMDsKKwlhZGFwdGVyLT5yeF91c2VjcyA9IDA7CisJYWRhcHRlci0+dHhfZnJhbWVzID0gMTsKKwlhZGFwdGVyLT5yeF9mcmFtZXMgPSAxOworfQorCisvKiBDb25maWd1cmUgdGhlIFJ4IGZvcndhcmRpbmcgKi8KK3N0YXRpYyBpbnQgZW5hX3Jzc19jb25maWd1cmUoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJaW50IHJjOworCisJLyogSW4gY2FzZSB0aGUgUlNTIHRhYmxlIHdhc24ndCBpbml0aWFsaXplZCBieSBwcm9iZSAqLworCWlmICghZW5hX2Rldi0+cnNzLnRibF9sb2dfc2l6ZSkgeworCQlyYyA9IGVuYV9yc3NfaW5pdF9kZWZhdWx0KGFkYXB0ZXIpOworCQlpZiAocmMgJiYgKHJjICE9IC1FUEVSTSkpIHsKKwkJCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkJICAiRmFpbGVkIHRvIGluaXQgUlNTIHJjOiAlZFxuIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJLyogU2V0IGluZGlyZWN0IHRhYmxlICovCisJcmMgPSBlbmFfY29tX2luZGlyZWN0X3RhYmxlX3NldChlbmFfZGV2KTsKKwlpZiAodW5saWtlbHkocmMgJiYgcmMgIT0gLUVQRVJNKSkKKwkJcmV0dXJuIHJjOworCisJLyogQ29uZmlndXJlIGhhc2ggZnVuY3Rpb24gKGlmIHN1cHBvcnRlZCkgKi8KKwlyYyA9IGVuYV9jb21fc2V0X2hhc2hfZnVuY3Rpb24oZW5hX2Rldik7CisJaWYgKHVubGlrZWx5KHJjICYmIChyYyAhPSAtRVBFUk0pKSkKKwkJcmV0dXJuIHJjOworCisJLyogQ29uZmlndXJlIGhhc2ggaW5wdXRzIChpZiBzdXBwb3J0ZWQpICovCisJcmMgPSBlbmFfY29tX3NldF9oYXNoX2N0cmwoZW5hX2Rldik7CisJaWYgKHVubGlrZWx5KHJjICYmIChyYyAhPSAtRVBFUk0pKSkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX3VwX2NvbXBsZXRlKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgcmMsIGk7CisKKwlyYyA9IGVuYV9yc3NfY29uZmlndXJlKGFkYXB0ZXIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZW5hX2luaXRfbmFwaShhZGFwdGVyKTsKKworCWVuYV9jaGFuZ2VfbXR1KGFkYXB0ZXItPm5ldGRldiwgYWRhcHRlci0+bmV0ZGV2LT5tdHUpOworCisJZW5hX3JlZmlsbF9hbGxfcnhfYnVmcyhhZGFwdGVyKTsKKworCS8qIGVuYWJsZSB0cmFuc21pdHMgKi8KKwluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKGFkYXB0ZXItPm5ldGRldik7CisKKwllbmFfcmVzdG9yZV9ldGh0b29sX3BhcmFtcyhhZGFwdGVyKTsKKworCWVuYV9uYXBpX2VuYWJsZV9hbGwoYWRhcHRlcik7CisKKwkvKiBzY2hlZHVsZSBuYXBpIGluIGNhc2Ugd2UgaGFkIHBlbmRpbmcgcGFja2V0cworCSAqIGZyb20gdGhlIGxhc3QgdGltZSB3ZSBkaXNhYmxlIG5hcGkKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3F1ZXVlczsgaSsrKQorCQluYXBpX3NjaGVkdWxlKCZhZGFwdGVyLT5lbmFfbmFwaVtpXS5uYXBpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuYV9jcmVhdGVfaW9fdHhfcXVldWUoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCBpbnQgcWlkKQoreworCXN0cnVjdCBlbmFfY29tX2NyZWF0ZV9pb19jdHggY3R4ID0geyAwIH07CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2OworCXN0cnVjdCBlbmFfcmluZyAqdHhfcmluZzsKKwl1MzIgbXNpeF92ZWN0b3I7CisJdTE2IGVuYV9xaWQ7CisJaW50IHJjOworCisJZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisKKwl0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3JpbmdbcWlkXTsKKwltc2l4X3ZlY3RvciA9IEVOQV9JT19JUlFfSURYKHFpZCk7CisJZW5hX3FpZCA9IEVOQV9JT19UWFFfSURYKHFpZCk7CisKKwljdHguZGlyZWN0aW9uID0gRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fVFg7CisJY3R4LnFpZCA9IGVuYV9xaWQ7CisJY3R4Lm1lbV9xdWV1ZV90eXBlID0gZW5hX2Rldi0+dHhfbWVtX3F1ZXVlX3R5cGU7CisJY3R4Lm1zaXhfdmVjdG9yID0gbXNpeF92ZWN0b3I7CisJY3R4LnF1ZXVlX3NpemUgPSBhZGFwdGVyLT50eF9yaW5nX3NpemU7CisJY3R4Lm51bWFfbm9kZSA9IGNwdV90b19ub2RlKHR4X3JpbmctPmNwdSk7CisKKwlyYyA9IGVuYV9jb21fY3JlYXRlX2lvX3F1ZXVlKGVuYV9kZXYsICZjdHgpOworCWlmIChyYykgeworCQluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiRmFpbGVkIHRvIGNyZWF0ZSBJL08gVFggcXVldWUgbnVtICVkIHJjOiAlZFxuIiwKKwkJCSAgcWlkLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IGVuYV9jb21fZ2V0X2lvX2hhbmRsZXJzKGVuYV9kZXYsIGVuYV9xaWQsCisJCQkJICAgICAmdHhfcmluZy0+ZW5hX2NvbV9pb19zcSwKKwkJCQkgICAgICZ0eF9yaW5nLT5lbmFfY29tX2lvX2NxKTsKKwlpZiAocmMpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIkZhaWxlZCB0byBnZXQgVFggcXVldWUgaGFuZGxlcnMuIFRYIHF1ZXVlIG51bSAlZCByYzogJWRcbiIsCisJCQkgIHFpZCwgcmMpOworCQllbmFfY29tX2Rlc3Ryb3lfaW9fcXVldWUoZW5hX2RldiwgZW5hX3FpZCk7CisJfQorCisJZW5hX2NvbV91cGRhdGVfbnVtYV9ub2RlKHR4X3JpbmctPmVuYV9jb21faW9fY3EsIGN0eC5udW1hX25vZGUpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbmFfY3JlYXRlX2FsbF9pb190eF9xdWV1ZXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisJaW50IHJjLCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQlyYyA9IGVuYV9jcmVhdGVfaW9fdHhfcXVldWUoYWRhcHRlciwgaSk7CisJCWlmIChyYykKKwkJCWdvdG8gY3JlYXRlX2VycjsKKwl9CisKKwlyZXR1cm4gMDsKKworY3JlYXRlX2VycjoKKwl3aGlsZSAoaS0tKQorCQllbmFfY29tX2Rlc3Ryb3lfaW9fcXVldWUoZW5hX2RldiwgRU5BX0lPX1RYUV9JRFgoaSkpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVuYV9jcmVhdGVfaW9fcnhfcXVldWUoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLCBpbnQgcWlkKQoreworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldjsKKwlzdHJ1Y3QgZW5hX2NvbV9jcmVhdGVfaW9fY3R4IGN0eCA9IHsgMCB9OworCXN0cnVjdCBlbmFfcmluZyAqcnhfcmluZzsKKwl1MzIgbXNpeF92ZWN0b3I7CisJdTE2IGVuYV9xaWQ7CisJaW50IHJjOworCisJZW5hX2RldiA9IGFkYXB0ZXItPmVuYV9kZXY7CisKKwlyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3JpbmdbcWlkXTsKKwltc2l4X3ZlY3RvciA9IEVOQV9JT19JUlFfSURYKHFpZCk7CisJZW5hX3FpZCA9IEVOQV9JT19SWFFfSURYKHFpZCk7CisKKwljdHgucWlkID0gZW5hX3FpZDsKKwljdHguZGlyZWN0aW9uID0gRU5BX0NPTV9JT19RVUVVRV9ESVJFQ1RJT05fUlg7CisJY3R4Lm1lbV9xdWV1ZV90eXBlID0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfSE9TVDsKKwljdHgubXNpeF92ZWN0b3IgPSBtc2l4X3ZlY3RvcjsKKwljdHgucXVldWVfc2l6ZSA9IGFkYXB0ZXItPnJ4X3Jpbmdfc2l6ZTsKKwljdHgubnVtYV9ub2RlID0gY3B1X3RvX25vZGUocnhfcmluZy0+Y3B1KTsKKworCXJjID0gZW5hX2NvbV9jcmVhdGVfaW9fcXVldWUoZW5hX2RldiwgJmN0eCk7CisJaWYgKHJjKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBpZnVwLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJGYWlsZWQgdG8gY3JlYXRlIEkvTyBSWCBxdWV1ZSBudW0gJWQgcmM6ICVkXG4iLAorCQkJICBxaWQsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gZW5hX2NvbV9nZXRfaW9faGFuZGxlcnMoZW5hX2RldiwgZW5hX3FpZCwKKwkJCQkgICAgICZyeF9yaW5nLT5lbmFfY29tX2lvX3NxLAorCQkJCSAgICAgJnJ4X3JpbmctPmVuYV9jb21faW9fY3EpOworCWlmIChyYykgeworCQluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiRmFpbGVkIHRvIGdldCBSWCBxdWV1ZSBoYW5kbGVycy4gUlggcXVldWUgbnVtICVkIHJjOiAlZFxuIiwKKwkJCSAgcWlkLCByYyk7CisJCWVuYV9jb21fZGVzdHJveV9pb19xdWV1ZShlbmFfZGV2LCBlbmFfcWlkKTsKKwl9CisKKwllbmFfY29tX3VwZGF0ZV9udW1hX25vZGUocnhfcmluZy0+ZW5hX2NvbV9pb19jcSwgY3R4Lm51bWFfbm9kZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NyZWF0ZV9hbGxfaW9fcnhfcXVldWVzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCWludCByYywgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspIHsKKwkJcmMgPSBlbmFfY3JlYXRlX2lvX3J4X3F1ZXVlKGFkYXB0ZXIsIGkpOworCQlpZiAocmMpCisJCQlnb3RvIGNyZWF0ZV9lcnI7CisJfQorCisJcmV0dXJuIDA7CisKK2NyZWF0ZV9lcnI6CisJd2hpbGUgKGktLSkKKwkJZW5hX2NvbV9kZXN0cm95X2lvX3F1ZXVlKGVuYV9kZXYsIEVOQV9JT19SWFFfSURYKGkpKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbmFfdXAoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCByYzsKKworCW5ldGRldl9kYmcoYWRhcHRlci0+bmV0ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWVuYV9zZXR1cF9pb19pbnRyKGFkYXB0ZXIpOworCisJcmMgPSBlbmFfcmVxdWVzdF9pb19pcnEoYWRhcHRlcik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9yZXFfaXJxOworCisJLyogYWxsb2NhdGUgdHJhbnNtaXQgZGVzY3JpcHRvcnMgKi8KKwlyYyA9IGVuYV9zZXR1cF9hbGxfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfc2V0dXBfdHg7CisKKwkvKiBhbGxvY2F0ZSByZWNlaXZlIGRlc2NyaXB0b3JzICovCisJcmMgPSBlbmFfc2V0dXBfYWxsX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX3NldHVwX3J4OworCisJLyogQ3JlYXRlIFRYIHF1ZXVlcyAqLworCXJjID0gZW5hX2NyZWF0ZV9hbGxfaW9fdHhfcXVldWVzKGFkYXB0ZXIpOworCWlmIChyYykKKwkJZ290byBlcnJfY3JlYXRlX3R4X3F1ZXVlczsKKworCS8qIENyZWF0ZSBSWCBxdWV1ZXMgKi8KKwlyYyA9IGVuYV9jcmVhdGVfYWxsX2lvX3J4X3F1ZXVlcyhhZGFwdGVyKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX2NyZWF0ZV9yeF9xdWV1ZXM7CisKKwlyYyA9IGVuYV91cF9jb21wbGV0ZShhZGFwdGVyKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX3VwOworCisJaWYgKHRlc3RfYml0KEVOQV9GTEFHX0xJTktfVVAsICZhZGFwdGVyLT5mbGFncykpCisJCW5ldGlmX2NhcnJpZXJfb24oYWRhcHRlci0+bmV0ZGV2KTsKKworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmFkYXB0ZXItPnN5bmNwKTsKKwlhZGFwdGVyLT5kZXZfc3RhdHMuaW50ZXJmYWNlX3VwKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmFkYXB0ZXItPnN5bmNwKTsKKworCXNldF9iaXQoRU5BX0ZMQUdfREVWX1VQLCAmYWRhcHRlci0+ZmxhZ3MpOworCisJcmV0dXJuIHJjOworCitlcnJfdXA6CisJZW5hX2Rlc3Ryb3lfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyKTsKK2Vycl9jcmVhdGVfcnhfcXVldWVzOgorCWVuYV9kZXN0cm95X2FsbF90eF9xdWV1ZXMoYWRhcHRlcik7CitlcnJfY3JlYXRlX3R4X3F1ZXVlczoKKwllbmFfZnJlZV9hbGxfaW9fcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOworZXJyX3NldHVwX3J4OgorCWVuYV9mcmVlX2FsbF9pb190eF9yZXNvdXJjZXMoYWRhcHRlcik7CitlcnJfc2V0dXBfdHg6CisJZW5hX2ZyZWVfaW9faXJxKGFkYXB0ZXIpOworZXJyX3JlcV9pcnE6CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9kb3duKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwluZXRpZl9pbmZvKGFkYXB0ZXIsIGlmZG93biwgYWRhcHRlci0+bmV0ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWNsZWFyX2JpdChFTkFfRkxBR19ERVZfVVAsICZhZGFwdGVyLT5mbGFncyk7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZhZGFwdGVyLT5zeW5jcCk7CisJYWRhcHRlci0+ZGV2X3N0YXRzLmludGVyZmFjZV9kb3duKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJmFkYXB0ZXItPnN5bmNwKTsKKworCS8qIEFmdGVyIHRoaXMgcG9pbnQgdGhlIG5hcGkgaGFuZGxlciB3b24ndCBlbmFibGUgdGhlIHR4IHF1ZXVlICovCisJZW5hX25hcGlfZGlzYWJsZV9hbGwoYWRhcHRlcik7CisJbmV0aWZfY2Fycmllcl9vZmYoYWRhcHRlci0+bmV0ZGV2KTsKKwluZXRpZl90eF9kaXNhYmxlKGFkYXB0ZXItPm5ldGRldik7CisKKwkvKiBBZnRlciBkZXN0cm95IHRoZSBxdWV1ZSB0aGVyZSB3b24ndCBiZSBhbnkgbmV3IGludGVycnVwdHMgKi8KKwllbmFfZGVzdHJveV9hbGxfaW9fcXVldWVzKGFkYXB0ZXIpOworCisJZW5hX2Rpc2FibGVfaW9faW50cl9zeW5jKGFkYXB0ZXIpOworCWVuYV9mcmVlX2lvX2lycShhZGFwdGVyKTsKKwllbmFfZGVsX25hcGkoYWRhcHRlcik7CisKKwllbmFfZnJlZV9hbGxfdHhfYnVmcyhhZGFwdGVyKTsKKwllbmFfZnJlZV9hbGxfcnhfYnVmcyhhZGFwdGVyKTsKKwllbmFfZnJlZV9hbGxfaW9fdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOworCWVuYV9mcmVlX2FsbF9pb19yeF9yZXNvdXJjZXMoYWRhcHRlcik7Cit9CisKKy8qIGVuYV9vcGVuIC0gQ2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlIGFjdGl2ZQorICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlCisgKgorICogVGhlIG9wZW4gZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW4gYSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlCisgKiBhY3RpdmUgYnkgdGhlIHN5c3RlbSAoSUZGX1VQKS4gIEF0IHRoaXMgcG9pbnQgYWxsIHJlc291cmNlcyBuZWVkZWQKKyAqIGZvciB0cmFuc21pdCBhbmQgcmVjZWl2ZSBvcGVyYXRpb25zIGFyZSBhbGxvY2F0ZWQsIHRoZSBpbnRlcnJ1cHQKKyAqIGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBPUywgdGhlIHdhdGNoZG9nIHRpbWVyIGlzIHN0YXJ0ZWQsCisgKiBhbmQgdGhlIHN0YWNrIGlzIG5vdGlmaWVkIHRoYXQgdGhlIGludGVyZmFjZSBpcyByZWFkeS4KKyAqLworc3RhdGljIGludCBlbmFfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IHJjOworCisJLyogTm90aWZ5IHRoZSBzdGFjayBvZiB0aGUgYWN0dWFsIHF1ZXVlIGNvdW50cy4gKi8KKwlyYyA9IG5ldGlmX3NldF9yZWFsX251bV90eF9xdWV1ZXMobmV0ZGV2LCBhZGFwdGVyLT5udW1fcXVldWVzKTsKKwlpZiAocmMpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGlmdXAsIG5ldGRldiwgIkNhbid0IHNldCBudW0gdHggcXVldWVzXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjID0gbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhuZXRkZXYsIGFkYXB0ZXItPm51bV9xdWV1ZXMpOworCWlmIChyYykgeworCQluZXRpZl9lcnIoYWRhcHRlciwgaWZ1cCwgbmV0ZGV2LCAiQ2FuJ3Qgc2V0IG51bSByeCBxdWV1ZXNcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBlbmFfdXAoYWRhcHRlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGVuYV9jbG9zZSAtIERpc2FibGVzIGEgbmV0d29yayBpbnRlcmZhY2UKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAsIHRoaXMgaXMgbm90IGFsbG93ZWQgdG8gZmFpbAorICoKKyAqIFRoZSBjbG9zZSBlbnRyeSBwb2ludCBpcyBjYWxsZWQgd2hlbiBhbiBpbnRlcmZhY2UgaXMgZGUtYWN0aXZhdGVkCisgKiBieSB0aGUgT1MuICBUaGUgaGFyZHdhcmUgaXMgc3RpbGwgdW5kZXIgdGhlIGRyaXZlcnMgY29udHJvbCwgYnV0CisgKiBuZWVkcyB0byBiZSBkaXNhYmxlZC4gIEEgZ2xvYmFsIE1BQyByZXNldCBpcyBpc3N1ZWQgdG8gc3RvcCB0aGUKKyAqIGhhcmR3YXJlLCBhbmQgYWxsIHRyYW5zbWl0IGFuZCByZWNlaXZlIHJlc291cmNlcyBhcmUgZnJlZWQuCisgKi8KK3N0YXRpYyBpbnQgZW5hX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCW5ldGlmX2RiZyhhZGFwdGVyLCBpZmRvd24sIG5ldGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAodGVzdF9iaXQoRU5BX0ZMQUdfREVWX1VQLCAmYWRhcHRlci0+ZmxhZ3MpKQorCQllbmFfZG93bihhZGFwdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbmFfdHhfY3N1bShzdHJ1Y3QgZW5hX2NvbV90eF9jdHggKmVuYV90eF9jdHgsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTMyIG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CisJc3RydWN0IGVuYV9jb21fdHhfbWV0YSAqZW5hX21ldGEgPSAmZW5hX3R4X2N0eC0+ZW5hX21ldGE7CisJdTggbDRfcHJvdG9jb2wgPSAwOworCisJaWYgKChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB8fCBtc3MpIHsKKwkJZW5hX3R4X2N0eC0+bDRfY3N1bV9lbmFibGUgPSAxOworCQlpZiAobXNzKSB7CisJCQllbmFfdHhfY3R4LT50c29fZW5hYmxlID0gMTsKKwkJCWVuYV9tZXRhLT5sNF9oZHJfbGVuID0gdGNwX2hkcihza2IpLT5kb2ZmOworCQkJZW5hX3R4X2N0eC0+bDRfY3N1bV9wYXJ0aWFsID0gMDsKKwkJfSBlbHNlIHsKKwkJCWVuYV90eF9jdHgtPnRzb19lbmFibGUgPSAwOworCQkJZW5hX21ldGEtPmw0X2hkcl9sZW4gPSAwOworCQkJZW5hX3R4X2N0eC0+bDRfY3N1bV9wYXJ0aWFsID0gMTsKKwkJfQorCisJCXN3aXRjaCAoaXBfaGRyKHNrYiktPnZlcnNpb24pIHsKKwkJY2FzZSBJUFZFUlNJT046CisJCQllbmFfdHhfY3R4LT5sM19wcm90byA9IEVOQV9FVEhfSU9fTDNfUFJPVE9fSVBWNDsKKwkJCWlmIChpcF9oZHIoc2tiKS0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpCisJCQkJZW5hX3R4X2N0eC0+ZGYgPSAxOworCQkJaWYgKG1zcykKKwkJCQllbmFfdHhfY3R4LT5sM19jc3VtX2VuYWJsZSA9IDE7CisJCQlsNF9wcm90b2NvbCA9IGlwX2hkcihza2IpLT5wcm90b2NvbDsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQllbmFfdHhfY3R4LT5sM19wcm90byA9IEVOQV9FVEhfSU9fTDNfUFJPVE9fSVBWNjsKKwkJCWw0X3Byb3RvY29sID0gaXB2Nl9oZHIoc2tiKS0+bmV4dGhkcjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAobDRfcHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCisJCQllbmFfdHhfY3R4LT5sNF9wcm90byA9IEVOQV9FVEhfSU9fTDRfUFJPVE9fVENQOworCQllbHNlCisJCQllbmFfdHhfY3R4LT5sNF9wcm90byA9IEVOQV9FVEhfSU9fTDRfUFJPVE9fVURQOworCisJCWVuYV9tZXRhLT5tc3MgPSBtc3M7CisJCWVuYV9tZXRhLT5sM19oZHJfbGVuID0gc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpOworCQllbmFfbWV0YS0+bDNfaGRyX29mZnNldCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOworCQllbmFfdHhfY3R4LT5tZXRhX3ZhbGlkID0gMTsKKworCX0gZWxzZSB7CisJCWVuYV90eF9jdHgtPm1ldGFfdmFsaWQgPSAwOworCX0KK30KKworc3RhdGljIGludCBlbmFfY2hlY2tfYW5kX2xpbmVhcml6ZV9za2Ioc3RydWN0IGVuYV9yaW5nICp0eF9yaW5nLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBudW1fZnJhZ3MsIGhlYWRlcl9sZW4sIHJjOworCisJbnVtX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwloZWFkZXJfbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKworCWlmIChudW1fZnJhZ3MgPCB0eF9yaW5nLT5zZ2xfc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKG51bV9mcmFncyA9PSB0eF9yaW5nLT5zZ2xfc2l6ZSkgJiYKKwkgICAgKGhlYWRlcl9sZW4gPCB0eF9yaW5nLT50eF9tYXhfaGVhZGVyX3NpemUpKQorCQlyZXR1cm4gMDsKKworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwl0eF9yaW5nLT50eF9zdGF0cy5saW5lYXJpemUrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCisJcmMgPSBza2JfbGluZWFyaXplKHNrYik7CisJaWYgKHVubGlrZWx5KHJjKSkgeworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJCXR4X3JpbmctPnR4X3N0YXRzLmxpbmVhcml6ZV9mYWlsZWQrKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIENhbGxlZCB3aXRoIG5ldGlmX3R4X2xvY2suICovCitzdGF0aWMgbmV0ZGV2X3R4X3QgZW5hX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBlbmFfdHhfYnVmZmVyICp0eF9pbmZvOworCXN0cnVjdCBlbmFfY29tX3R4X2N0eCBlbmFfdHhfY3R4OworCXN0cnVjdCBlbmFfcmluZyAqdHhfcmluZzsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CisJc3RydWN0IGVuYV9jb21fYnVmICplbmFfYnVmOworCXZvaWQgKnB1c2hfaGRyOworCXUzMiBsZW4sIGxhc3RfZnJhZzsKKwl1MTYgbmV4dF90b191c2U7CisJdTE2IHJlcV9pZDsKKwl1MTYgcHVzaF9sZW47CisJdTE2IGhlYWRlcl9sZW47CisJZG1hX2FkZHJfdCBkbWE7CisJaW50IHFpZCwgcmMsIG5iX2h3X2Rlc2M7CisJaW50IGkgPSAtMTsKKworCW5ldGlmX2RiZyhhZGFwdGVyLCB0eF9xdWV1ZWQsIGRldiwgIiVzIHNrYiAlcFxuIiwgX19mdW5jX18sIHNrYik7CisJLyogIERldGVybWluZSB3aGljaCB0eCByaW5nIHdlIHdpbGwgYmUgcGxhY2VkIG9uICovCisJcWlkID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CisJdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nW3FpZF07CisJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIHFpZCk7CisKKwlyYyA9IGVuYV9jaGVja19hbmRfbGluZWFyaXplX3NrYih0eF9yaW5nLCBza2IpOworCWlmICh1bmxpa2VseShyYykpCisJCWdvdG8gZXJyb3JfZHJvcF9wYWNrZXQ7CisKKwlza2JfdHhfdGltZXN0YW1wKHNrYik7CisJbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKworCW5leHRfdG9fdXNlID0gdHhfcmluZy0+bmV4dF90b191c2U7CisJcmVxX2lkID0gdHhfcmluZy0+ZnJlZV90eF9pZHNbbmV4dF90b191c2VdOworCXR4X2luZm8gPSAmdHhfcmluZy0+dHhfYnVmZmVyX2luZm9bcmVxX2lkXTsKKwl0eF9pbmZvLT5udW1fb2ZfYnVmcyA9IDA7CisKKwlXQVJOKHR4X2luZm8tPnNrYiwgIlNLQiBpc24ndCBOVUxMIHJlcV9pZCAlZFxuIiwgcmVxX2lkKTsKKwllbmFfYnVmID0gdHhfaW5mby0+YnVmczsKKwl0eF9pbmZvLT5za2IgPSBza2I7CisKKwlpZiAodHhfcmluZy0+dHhfbWVtX3F1ZXVlX3R5cGUgPT0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfREVWKSB7CisJCS8qIHByZXBhcmVkIHRoZSBwdXNoIGJ1ZmZlciAqLworCQlwdXNoX2xlbiA9IG1pbl90KHUzMiwgbGVuLCB0eF9yaW5nLT50eF9tYXhfaGVhZGVyX3NpemUpOworCQloZWFkZXJfbGVuID0gcHVzaF9sZW47CisJCXB1c2hfaGRyID0gc2tiLT5kYXRhOworCX0gZWxzZSB7CisJCXB1c2hfbGVuID0gMDsKKwkJaGVhZGVyX2xlbiA9IG1pbl90KHUzMiwgbGVuLCB0eF9yaW5nLT50eF9tYXhfaGVhZGVyX3NpemUpOworCQlwdXNoX2hkciA9IE5VTEw7CisJfQorCisJbmV0aWZfZGJnKGFkYXB0ZXIsIHR4X3F1ZXVlZCwgZGV2LAorCQkgICJza2I6ICVwIGhlYWRlcl9idWYtPnZhZGRyOiAlcCBwdXNoX2xlbjogJWRcbiIsIHNrYiwKKwkJICBwdXNoX2hkciwgcHVzaF9sZW4pOworCisJaWYgKGxlbiA+IHB1c2hfbGVuKSB7CisJCWRtYSA9IGRtYV9tYXBfc2luZ2xlKHR4X3JpbmctPmRldiwgc2tiLT5kYXRhICsgcHVzaF9sZW4sCisJCQkJICAgICBsZW4gLSBwdXNoX2xlbiwgRE1BX1RPX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcih0eF9yaW5nLT5kZXYsIGRtYSkpCisJCQlnb3RvIGVycm9yX3JlcG9ydF9kbWFfZXJyb3I7CisKKwkJZW5hX2J1Zi0+cGFkZHIgPSBkbWE7CisJCWVuYV9idWYtPmxlbiA9IGxlbiAtIHB1c2hfbGVuOworCisJCWVuYV9idWYrKzsKKwkJdHhfaW5mby0+bnVtX29mX2J1ZnMrKzsKKwl9CisKKwlsYXN0X2ZyYWcgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOworCisJZm9yIChpID0gMDsgaSA8IGxhc3RfZnJhZzsgaSsrKSB7CisJCWNvbnN0IHNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKworCQlsZW4gPSBza2JfZnJhZ19zaXplKGZyYWcpOworCQlkbWEgPSBza2JfZnJhZ19kbWFfbWFwKHR4X3JpbmctPmRldiwgZnJhZywgMCwgbGVuLAorCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHR4X3JpbmctPmRldiwgZG1hKSkKKwkJCWdvdG8gZXJyb3JfcmVwb3J0X2RtYV9lcnJvcjsKKworCQllbmFfYnVmLT5wYWRkciA9IGRtYTsKKwkJZW5hX2J1Zi0+bGVuID0gbGVuOworCQllbmFfYnVmKys7CisJfQorCisJdHhfaW5mby0+bnVtX29mX2J1ZnMgKz0gbGFzdF9mcmFnOworCisJbWVtc2V0KCZlbmFfdHhfY3R4LCAweDAsIHNpemVvZihzdHJ1Y3QgZW5hX2NvbV90eF9jdHgpKTsKKwllbmFfdHhfY3R4LmVuYV9idWZzID0gdHhfaW5mby0+YnVmczsKKwllbmFfdHhfY3R4LnB1c2hfaGVhZGVyID0gcHVzaF9oZHI7CisJZW5hX3R4X2N0eC5udW1fYnVmcyA9IHR4X2luZm8tPm51bV9vZl9idWZzOworCWVuYV90eF9jdHgucmVxX2lkID0gcmVxX2lkOworCWVuYV90eF9jdHguaGVhZGVyX2xlbiA9IGhlYWRlcl9sZW47CisKKwkvKiBzZXQgZmxhZ3MgYW5kIG1ldGEgZGF0YSAqLworCWVuYV90eF9jc3VtKCZlbmFfdHhfY3R4LCBza2IpOworCisJLyogcHJlcGFyZSB0aGUgcGFja2V0J3MgZGVzY3JpcHRvcnMgdG8gZG1hIGVuZ2luZSAqLworCXJjID0gZW5hX2NvbV9wcmVwYXJlX3R4KHR4X3JpbmctPmVuYV9jb21faW9fc3EsICZlbmFfdHhfY3R4LAorCQkJCSZuYl9od19kZXNjKTsKKworCWlmICh1bmxpa2VseShyYykpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIHR4X3F1ZXVlZCwgZGV2LAorCQkJICAiZmFpbGVkIHRvIHByZXBhcmUgdHggYnVmc1xuIik7CisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwkJdHhfcmluZy0+dHhfc3RhdHMucXVldWVfc3RvcCsrOworCQl0eF9yaW5nLT50eF9zdGF0cy5wcmVwYXJlX2N0eF9lcnIrKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKwkJbmV0aWZfdHhfc3RvcF9xdWV1ZSh0eHEpOworCQlnb3RvIGVycm9yX3VubWFwX2RtYTsKKwl9CisKKwluZXRkZXZfdHhfc2VudF9xdWV1ZSh0eHEsIHNrYi0+bGVuKTsKKworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwl0eF9yaW5nLT50eF9zdGF0cy5jbnQrKzsKKwl0eF9yaW5nLT50eF9zdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCisJdHhfaW5mby0+dHhfZGVzY3MgPSBuYl9od19kZXNjOworCXR4X2luZm8tPmxhc3RfamlmZmllcyA9IGppZmZpZXM7CisKKwl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IEVOQV9UWF9SSU5HX0lEWF9ORVhUKG5leHRfdG9fdXNlLAorCQl0eF9yaW5nLT5yaW5nX3NpemUpOworCisJLyogVGhpcyBXTUIgaXMgYWltZWQgdG86CisJICogMSAtIHBlcmZvcm0gc21wIGJhcnJpZXIgYmVmb3JlIHJlYWRpbmcgbmV4dF90b19jb21wbGV0aW9uCisJICogMiAtIG1ha2Ugc3VyZSB0aGUgZGVzYyB3ZXJlIHdyaXR0ZW4gYmVmb3JlIHRyaWdnZXIgREIKKwkgKi8KKwl3bWIoKTsKKworCS8qIHN0b3AgdGhlIHF1ZXVlIHdoZW4gbm8gbW9yZSBzcGFjZSBhdmFpbGFibGUsIHRoZSBwYWNrZXQgY2FuIGhhdmUgdXAKKwkgKiB0byBzZ2xfc2l6ZSArIDIuIG9uZSBmb3IgdGhlIG1ldGEgZGVzY3JpcHRvciBhbmQgb25lIGZvciBoZWFkZXIKKwkgKiAoaWYgdGhlIGhlYWRlciBpcyBsYXJnZXIgdGhhbiB0eF9tYXhfaGVhZGVyX3NpemUpLgorCSAqLworCWlmICh1bmxpa2VseShlbmFfY29tX3NxX2VtcHR5X3NwYWNlKHR4X3JpbmctPmVuYV9jb21faW9fc3EpIDwKKwkJICAgICAodHhfcmluZy0+c2dsX3NpemUgKyAyKSkpIHsKKwkJbmV0aWZfZGJnKGFkYXB0ZXIsIHR4X3F1ZXVlZCwgZGV2LCAiJXMgc3RvcCBxdWV1ZSAlZFxuIiwKKwkJCSAgX19mdW5jX18sIHFpZCk7CisKKwkJbmV0aWZfdHhfc3RvcF9xdWV1ZSh0eHEpOworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJCXR4X3JpbmctPnR4X3N0YXRzLnF1ZXVlX3N0b3ArKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKworCQkvKiBUaGVyZSBpcyBhIHJhcmUgY29uZGl0aW9uIHdoZXJlIHRoaXMgZnVuY3Rpb24gZGVjaWRlIHRvCisJCSAqIHN0b3AgdGhlIHF1ZXVlIGJ1dCBtZWFud2hpbGUgY2xlYW5fdHhfaXJxIHVwZGF0ZXMKKwkJICogbmV4dF90b19jb21wbGV0aW9uIGFuZCB0ZXJtaW5hdGVzLgorCQkgKiBUaGUgcXVldWUgd2lsbCByZW1haW4gc3RvcHBlZCBmb3JldmVyLgorCQkgKiBUbyBzb2x2ZSB0aGlzIGlzc3VlIHRoaXMgZnVuY3Rpb24gcGVyZm9ybSBybWIsIGNoZWNrCisJCSAqIHRoZSB3YWtldXAgY29uZGl0aW9uIGFuZCB3YWtlIHVwIHRoZSBxdWV1ZSBpZiBuZWVkZWQuCisJCSAqLworCQlzbXBfcm1iKCk7CisKKwkJaWYgKGVuYV9jb21fc3FfZW1wdHlfc3BhY2UodHhfcmluZy0+ZW5hX2NvbV9pb19zcSkKKwkJCQk+IEVOQV9UWF9XQUtFVVBfVEhSRVNIKSB7CisJCQluZXRpZl90eF93YWtlX3F1ZXVlKHR4cSk7CisJCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJCQl0eF9yaW5nLT50eF9zdGF0cy5xdWV1ZV93YWtldXArKzsKKwkJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZ0eF9yaW5nLT5zeW5jcCk7CisJCX0KKwl9CisKKwlpZiAobmV0aWZfeG1pdF9zdG9wcGVkKHR4cSkgfHwgIXNrYi0+eG1pdF9tb3JlKSB7CisJCS8qIHRyaWdnZXIgdGhlIGRtYSBlbmdpbmUgKi8KKwkJZW5hX2NvbV93cml0ZV9zcV9kb29yYmVsbCh0eF9yaW5nLT5lbmFfY29tX2lvX3NxKTsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmdHhfcmluZy0+c3luY3ApOworCQl0eF9yaW5nLT50eF9zdGF0cy5kb29yYmVsbHMrKzsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKwl9CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworCitlcnJvcl9yZXBvcnRfZG1hX2Vycm9yOgorCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnR4X3JpbmctPnN5bmNwKTsKKwl0eF9yaW5nLT50eF9zdGF0cy5kbWFfbWFwcGluZ19lcnIrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmdHhfcmluZy0+c3luY3ApOworCW5ldGRldl93YXJuKGFkYXB0ZXItPm5ldGRldiwgImZhaWxlZCB0byBtYXAgc2tiXG4iKTsKKworCXR4X2luZm8tPnNrYiA9IE5VTEw7CisKK2Vycm9yX3VubWFwX2RtYToKKwlpZiAoaSA+PSAwKSB7CisJCS8qIHNhdmUgdmFsdWUgb2YgZnJhZyB0aGF0IGZhaWxlZCAqLworCQlsYXN0X2ZyYWcgPSBpOworCisJCS8qIHN0YXJ0IGJhY2sgYXQgYmVnaW5uaW5nIGFuZCB1bm1hcCBza2IgKi8KKwkJdHhfaW5mby0+c2tiID0gTlVMTDsKKwkJZW5hX2J1ZiA9IHR4X2luZm8tPmJ1ZnM7CisJCWRtYV91bm1hcF9zaW5nbGUodHhfcmluZy0+ZGV2LCBkbWFfdW5tYXBfYWRkcihlbmFfYnVmLCBwYWRkciksCisJCQkJIGRtYV91bm1hcF9sZW4oZW5hX2J1ZiwgbGVuKSwgRE1BX1RPX0RFVklDRSk7CisKKwkJLyogdW5tYXAgcmVtYWluaW5nIG1hcHBlZCBwYWdlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgbGFzdF9mcmFnOyBpKyspIHsKKwkJCWVuYV9idWYrKzsKKwkJCWRtYV91bm1hcF9wYWdlKHR4X3JpbmctPmRldiwgZG1hX3VubWFwX2FkZHIoZW5hX2J1ZiwgcGFkZHIpLAorCQkJCSAgICAgICBkbWFfdW5tYXBfbGVuKGVuYV9idWYsIGxlbiksIERNQV9UT19ERVZJQ0UpOworCQl9CisJfQorCitlcnJvcl9kcm9wX3BhY2tldDoKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3N0YXRpYyB2b2lkIGVuYV9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcXVldWVzOyBpKyspCisJCW5hcGlfc2NoZWR1bGUoJmFkYXB0ZXItPmVuYV9uYXBpW2ldLm5hcGkpOworfQorI2VuZGlmIC8qIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSICovCisKK3N0YXRpYyB1MTYgZW5hX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIHZvaWQgKmFjY2VsX3ByaXYsIHNlbGVjdF9xdWV1ZV9mYWxsYmFja190IGZhbGxiYWNrKQoreworCXUxNiBxaWQ7CisJLyogd2Ugc3VzcGVjdCB0aGF0IHRoaXMgaXMgZ29vZCBmb3IgaW4tLWtlcm5lbCBuZXR3b3JrIHNlcnZpY2VzIHRoYXQKKwkgKiB3YW50IHRvIGxvb3AgaW5jb21pbmcgc2tiIHJ4IHRvIHR4IGluIG5vcm1hbCB1c2VyIGdlbmVyYXRlZCB0cmFmZmljLAorCSAqIG1vc3QgcHJvYmFibHkgd2Ugd2lsbCBub3QgZ2V0IHRvIHRoaXMKKwkgKi8KKwlpZiAoc2tiX3J4X3F1ZXVlX3JlY29yZGVkKHNrYikpCisJCXFpZCA9IHNrYl9nZXRfcnhfcXVldWUoc2tiKTsKKwllbHNlCisJCXFpZCA9IGZhbGxiYWNrKGRldiwgc2tiKTsKKworCXJldHVybiBxaWQ7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9jb25maWdfaG9zdF9pbmZvKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldikKK3sKKwlzdHJ1Y3QgZW5hX2FkbWluX2hvc3RfaW5mbyAqaG9zdF9pbmZvOworCWludCByYzsKKworCS8qIEFsbG9jYXRlIG9ubHkgdGhlIGhvc3QgaW5mbyAqLworCXJjID0gZW5hX2NvbV9hbGxvY2F0ZV9ob3N0X2luZm8oZW5hX2Rldik7CisJaWYgKHJjKSB7CisJCXByX2VycigiQ2Fubm90IGFsbG9jYXRlIGhvc3QgaW5mb1xuIik7CisJCXJldHVybjsKKwl9CisKKwlob3N0X2luZm8gPSBlbmFfZGV2LT5ob3N0X2F0dHIuaG9zdF9pbmZvOworCisJaG9zdF9pbmZvLT5vc190eXBlID0gRU5BX0FETUlOX09TX0xJTlVYOworCWhvc3RfaW5mby0+a2VybmVsX3ZlciA9IExJTlVYX1ZFUlNJT05fQ09ERTsKKwlzdHJuY3B5KGhvc3RfaW5mby0+a2VybmVsX3Zlcl9zdHIsIHV0c25hbWUoKS0+dmVyc2lvbiwKKwkJc2l6ZW9mKGhvc3RfaW5mby0+a2VybmVsX3Zlcl9zdHIpIC0gMSk7CisJaG9zdF9pbmZvLT5vc19kaXN0ID0gMDsKKwlzdHJuY3B5KGhvc3RfaW5mby0+b3NfZGlzdF9zdHIsIHV0c25hbWUoKS0+cmVsZWFzZSwKKwkJc2l6ZW9mKGhvc3RfaW5mby0+b3NfZGlzdF9zdHIpIC0gMSk7CisJaG9zdF9pbmZvLT5kcml2ZXJfdmVyc2lvbiA9CisJCShEUlZfTU9EVUxFX1ZFUl9NQUpPUikgfAorCQkoRFJWX01PRFVMRV9WRVJfTUlOT1IgPDwgRU5BX0FETUlOX0hPU1RfSU5GT19NSU5PUl9TSElGVCkgfAorCQkoRFJWX01PRFVMRV9WRVJfU1VCTUlOT1IgPDwgRU5BX0FETUlOX0hPU1RfSU5GT19TVUJfTUlOT1JfU0hJRlQpOworCisJcmMgPSBlbmFfY29tX3NldF9ob3N0X2F0dHJpYnV0ZXMoZW5hX2Rldik7CisJaWYgKHJjKSB7CisJCWlmIChyYyA9PSAtRVBFUk0pCisJCQlwcl93YXJuKCJDYW5ub3Qgc2V0IGhvc3QgYXR0cmlidXRlc1xuIik7CisJCWVsc2UKKwkJCXByX2VycigiQ2Fubm90IHNldCBob3N0IGF0dHJpYnV0ZXNcbiIpOworCisJCWdvdG8gZXJyOworCX0KKworCXJldHVybjsKKworZXJyOgorCWVuYV9jb21fZGVsZXRlX2hvc3RfaW5mbyhlbmFfZGV2KTsKK30KKworc3RhdGljIHZvaWQgZW5hX2NvbmZpZ19kZWJ1Z19hcmVhKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgZGVidWdfYXJlYV9zaXplOworCWludCByYywgc3NfY291bnQ7CisKKwlzc19jb3VudCA9IGVuYV9nZXRfc3NldF9jb3VudChhZGFwdGVyLT5uZXRkZXYsIEVUSF9TU19TVEFUUyk7CisJaWYgKHNzX2NvdW50IDw9IDApIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgYWRhcHRlci0+bmV0ZGV2LAorCQkJICAiU1MgY291bnQgaXMgbmVnYXRpdmVcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogYWxsb2NhdGUgMzIgYnl0ZXMgZm9yIGVhY2ggc3RyaW5nIGFuZCA2NGJpdCBmb3IgdGhlIHZhbHVlICovCisJZGVidWdfYXJlYV9zaXplID0gc3NfY291bnQgKiBFVEhfR1NUUklOR19MRU4gKyBzaXplb2YodTY0KSAqIHNzX2NvdW50OworCisJcmMgPSBlbmFfY29tX2FsbG9jYXRlX2RlYnVnX2FyZWEoYWRhcHRlci0+ZW5hX2RldiwgZGVidWdfYXJlYV9zaXplKTsKKwlpZiAocmMpIHsKKwkJcHJfZXJyKCJDYW5ub3QgYWxsb2NhdGUgZGVidWcgYXJlYVxuIik7CisJCXJldHVybjsKKwl9CisKKwlyYyA9IGVuYV9jb21fc2V0X2hvc3RfYXR0cmlidXRlcyhhZGFwdGVyLT5lbmFfZGV2KTsKKwlpZiAocmMpIHsKKwkJaWYgKHJjID09IC1FUEVSTSkKKwkJCW5ldGlmX3dhcm4oYWRhcHRlciwgZHJ2LCBhZGFwdGVyLT5uZXRkZXYsCisJCQkJICAgIkNhbm5vdCBzZXQgaG9zdCBhdHRyaWJ1dGVzXG4iKTsKKwkJZWxzZQorCQkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgYWRhcHRlci0+bmV0ZGV2LAorCQkJCSAgIkNhbm5vdCBzZXQgaG9zdCBhdHRyaWJ1dGVzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuOworZXJyOgorCWVuYV9jb21fZGVsZXRlX2RlYnVnX2FyZWEoYWRhcHRlci0+ZW5hX2Rldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKmVuYV9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCQkJIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCit7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgZW5hX2FkbWluX2Jhc2ljX3N0YXRzIGVuYV9zdGF0czsKKwlpbnQgcmM7CisKKwlpZiAoIXRlc3RfYml0KEVOQV9GTEFHX0RFVl9VUCwgJmFkYXB0ZXItPmZsYWdzKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyYyA9IGVuYV9jb21fZ2V0X2Rldl9iYXNpY19zdGF0cyhhZGFwdGVyLT5lbmFfZGV2LCAmZW5hX3N0YXRzKTsKKwlpZiAocmMpCisJCXJldHVybiBOVUxMOworCisJc3RhdHMtPnR4X2J5dGVzID0gKCh1NjQpZW5hX3N0YXRzLnR4X2J5dGVzX2hpZ2ggPDwgMzIpIHwKKwkJZW5hX3N0YXRzLnR4X2J5dGVzX2xvdzsKKwlzdGF0cy0+cnhfYnl0ZXMgPSAoKHU2NCllbmFfc3RhdHMucnhfYnl0ZXNfaGlnaCA8PCAzMikgfAorCQllbmFfc3RhdHMucnhfYnl0ZXNfbG93OworCisJc3RhdHMtPnJ4X3BhY2tldHMgPSAoKHU2NCllbmFfc3RhdHMucnhfcGt0c19oaWdoIDw8IDMyKSB8CisJCWVuYV9zdGF0cy5yeF9wa3RzX2xvdzsKKwlzdGF0cy0+dHhfcGFja2V0cyA9ICgodTY0KWVuYV9zdGF0cy50eF9wa3RzX2hpZ2ggPDwgMzIpIHwKKwkJZW5hX3N0YXRzLnR4X3BrdHNfbG93OworCisJc3RhdHMtPnJ4X2Ryb3BwZWQgPSAoKHU2NCllbmFfc3RhdHMucnhfZHJvcHNfaGlnaCA8PCAzMikgfAorCQllbmFfc3RhdHMucnhfZHJvcHNfbG93OworCisJc3RhdHMtPm11bHRpY2FzdCA9IDA7CisJc3RhdHMtPmNvbGxpc2lvbnMgPSAwOworCisJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSAwOworCXN0YXRzLT5yeF9jcmNfZXJyb3JzID0gMDsKKwlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzID0gMDsKKwlzdGF0cy0+cnhfZmlmb19lcnJvcnMgPSAwOworCXN0YXRzLT5yeF9taXNzZWRfZXJyb3JzID0gMDsKKwlzdGF0cy0+dHhfd2luZG93X2Vycm9ycyA9IDA7CisKKwlzdGF0cy0+cnhfZXJyb3JzID0gMDsKKwlzdGF0cy0+dHhfZXJyb3JzID0gMDsKKworCXJldHVybiBzdGF0czsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBlbmFfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZW5hX29wZW4sCisJLm5kb19zdG9wCQk9IGVuYV9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZW5hX3N0YXJ0X3htaXQsCisJLm5kb19zZWxlY3RfcXVldWUJPSBlbmFfc2VsZWN0X3F1ZXVlLAorCS5uZG9fZ2V0X3N0YXRzNjQJPSBlbmFfZ2V0X3N0YXRzNjQsCisJLm5kb190eF90aW1lb3V0CQk9IGVuYV90eF90aW1lb3V0LAorCS5uZG9fY2hhbmdlX210dQkJPSBlbmFfY2hhbmdlX210dSwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IE5VTEwsCisJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlcgk9IGVuYV9uZXRwb2xsLAorI2VuZGlmIC8qIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSICovCit9OworCitzdGF0aWMgdm9pZCBlbmFfZGV2aWNlX2lvX3N1c3BlbmQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZW5hX2FkYXB0ZXIsIHN1c3BlbmRfaW9fdGFzayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCS8qIGVuYV9uYXBpX2Rpc2FibGVfYWxsIGRpc2FibGVzIG9ubHkgdGhlIElPIGhhbmRsaW5nLgorCSAqIFdlIGFyZSBzdGlsbCBzdWJqZWN0IHRvIEFFTlEga2VlcCBhbGl2ZSB3YXRjaGRvZy4KKwkgKi8KKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZhZGFwdGVyLT5zeW5jcCk7CisJYWRhcHRlci0+ZGV2X3N0YXRzLmlvX3N1c3BlbmQrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZhZGFwdGVyLT5zeW5jcCk7CisJZW5hX25hcGlfZGlzYWJsZV9hbGwoYWRhcHRlcik7CisJbmV0aWZfdHhfbG9jayhuZXRkZXYpOworCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKKwluZXRpZl90eF91bmxvY2sobmV0ZGV2KTsKK30KKworc3RhdGljIHZvaWQgZW5hX2RldmljZV9pb19yZXN1bWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZW5hX2FkYXB0ZXIsIHJlc3VtZV9pb190YXNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYWRhcHRlci0+c3luY3ApOworCWFkYXB0ZXItPmRldl9zdGF0cy5pb19yZXN1bWUrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmYWRhcHRlci0+c3luY3ApOworCisJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCWVuYV9uYXBpX2VuYWJsZV9hbGwoYWRhcHRlcik7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2RldmljZV92YWxpZGF0ZV9wYXJhbXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICAgIHN0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4ICpnZXRfZmVhdF9jdHgpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlpbnQgcmM7CisKKwlyYyA9IGV0aGVyX2FkZHJfZXF1YWwoZ2V0X2ZlYXRfY3R4LT5kZXZfYXR0ci5tYWNfYWRkciwKKwkJCSAgICAgIGFkYXB0ZXItPm1hY19hZGRyKTsKKwlpZiAoIXJjKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwKKwkJCSAgIkVycm9yLCBtYWMgYWRkcmVzcyBhcmUgZGlmZmVyZW50XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X2NxX251bSA8IGFkYXB0ZXItPm51bV9xdWV1ZXMpIHx8CisJICAgIChnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X3NxX251bSA8IGFkYXB0ZXItPm51bV9xdWV1ZXMpKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIG5ldGRldiwKKwkJCSAgIkVycm9yLCBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGVub3VnaCBxdWV1ZXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZ2V0X2ZlYXRfY3R4LT5kZXZfYXR0ci5tYXhfbXR1IDwgbmV0ZGV2LT5tdHUpIHsKKwkJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgbmV0ZGV2LAorCQkJICAiRXJyb3IsIGRldmljZSBtYXggbXR1IGlzIHNtYWxsZXIgdGhhbiBuZXRkZXYgTVRVXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2RldmljZV9pbml0KHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldiwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICBzdHJ1Y3QgZW5hX2NvbV9kZXZfZ2V0X2ZlYXR1cmVzX2N0eCAqZ2V0X2ZlYXRfY3R4LAorCQkJICAgYm9vbCAqd2Rfc3RhdGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlib29sIHJlYWRsZXNzX3N1cHBvcnRlZDsKKwl1MzIgYWVucV9ncm91cHM7CisJaW50IGRtYV93aWR0aDsKKwlpbnQgcmM7CisKKwlyYyA9IGVuYV9jb21fbW1pb19yZWdfcmVhZF9yZXF1ZXN0X2luaXQoZW5hX2Rldik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGluaXQgbW1pbyByZWFkIGxlc3NcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogVGhlIFBDSWUgY29uZmlndXJhdGlvbiBzcGFjZSByZXZpc2lvbiBpZCBpbmRpY2F0ZSBpZiBtbWlvIHJlZworCSAqIHJlYWQgaXMgZGlzYWJsZWQKKwkgKi8KKwlyZWFkbGVzc19zdXBwb3J0ZWQgPSAhKHBkZXYtPnJldmlzaW9uICYgRU5BX01NSU9fRElTQUJMRV9SRUdfUkVBRCk7CisJZW5hX2NvbV9zZXRfbW1pb19yZWFkX21vZGUoZW5hX2RldiwgcmVhZGxlc3Nfc3VwcG9ydGVkKTsKKworCXJjID0gZW5hX2NvbV9kZXZfcmVzZXQoZW5hX2Rldik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuIG5vdCByZXNldCBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9tbWlvX3JlYWRfbGVzczsKKwl9CisKKwlyYyA9IGVuYV9jb21fdmFsaWRhdGVfdmVyc2lvbihlbmFfZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICJkZXZpY2UgdmVyc2lvbiBpcyB0b28gbG93XG4iKTsKKwkJZ290byBlcnJfbW1pb19yZWFkX2xlc3M7CisJfQorCisJZG1hX3dpZHRoID0gZW5hX2NvbV9nZXRfZG1hX3dpZHRoKGVuYV9kZXYpOworCWlmIChkbWFfd2lkdGggPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBkbWEgd2lkdGggdmFsdWUgJWQiLCBkbWFfd2lkdGgpOworCQlyYyA9IGRtYV93aWR0aDsKKwkJZ290byBlcnJfbW1pb19yZWFkX2xlc3M7CisJfQorCisJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyhkbWFfd2lkdGgpKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICJwY2lfc2V0X2RtYV9tYXNrIGZhaWxlZCAweCV4XG4iLCByYyk7CisJCWdvdG8gZXJyX21taW9fcmVhZF9sZXNzOworCX0KKworCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyhkbWFfd2lkdGgpKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICJlcnJfcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrIGZhaWxlZCAweCV4XG4iLAorCQkJcmMpOworCQlnb3RvIGVycl9tbWlvX3JlYWRfbGVzczsKKwl9CisKKwkvKiBFTkEgYWRtaW4gbGV2ZWwgaW5pdCAqLworCXJjID0gZW5hX2NvbV9hZG1pbl9pbml0KGVuYV9kZXYsICZhZW5xX2hhbmRsZXJzLCB0cnVlKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsCisJCQkiQ2FuIG5vdCBpbml0aWFsaXplIGVuYSBhZG1pbiBxdWV1ZSB3aXRoIGRldmljZVxuIik7CisJCWdvdG8gZXJyX21taW9fcmVhZF9sZXNzOworCX0KKworCS8qIFRvIGVuYWJsZSB0aGUgbXNpeCBpbnRlcnJ1cHRzIHRoZSBkcml2ZXIgbmVlZHMgdG8ga25vdyB0aGUgbnVtYmVyCisJICogb2YgcXVldWVzLiBTbyB0aGUgZHJpdmVyIHVzZXMgcG9sbGluZyBtb2RlIHRvIHJldHJpZXZlIHRoaXMKKwkgKiBpbmZvcm1hdGlvbgorCSAqLworCWVuYV9jb21fc2V0X2FkbWluX3BvbGxpbmdfbW9kZShlbmFfZGV2LCB0cnVlKTsKKworCS8qIEdldCBEZXZpY2UgQXR0cmlidXRlcyovCisJcmMgPSBlbmFfY29tX2dldF9kZXZfYXR0cl9mZWF0KGVuYV9kZXYsIGdldF9mZWF0X2N0eCk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGdldCBhdHRyaWJ1dGUgZm9yIGVuYSBkZXZpY2UgcmM9JWRcbiIsIHJjKTsKKwkJZ290byBlcnJfYWRtaW5faW5pdDsKKwl9CisKKwkvKiBUcnkgdG8gdHVybiBhbGwgdGhlIGF2YWlsYWJsZSBhZW5xIGdyb3VwcyAqLworCWFlbnFfZ3JvdXBzID0gQklUKEVOQV9BRE1JTl9MSU5LX0NIQU5HRSkgfAorCQlCSVQoRU5BX0FETUlOX0ZBVEFMX0VSUk9SKSB8CisJCUJJVChFTkFfQURNSU5fV0FSTklORykgfAorCQlCSVQoRU5BX0FETUlOX05PVElGSUNBVElPTikgfAorCQlCSVQoRU5BX0FETUlOX0tFRVBfQUxJVkUpOworCisJYWVucV9ncm91cHMgJj0gZ2V0X2ZlYXRfY3R4LT5hZW5xLnN1cHBvcnRlZF9ncm91cHM7CisKKwlyYyA9IGVuYV9jb21fc2V0X2FlbnFfY29uZmlnKGVuYV9kZXYsIGFlbnFfZ3JvdXBzKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgY29uZmlndXJlIGFlbnEgZ3JvdXBzIHJjPSAlZFxuIiwgcmMpOworCQlnb3RvIGVycl9hZG1pbl9pbml0OworCX0KKworCSp3ZF9zdGF0ZSA9ICEhKGFlbnFfZ3JvdXBzICYgQklUKEVOQV9BRE1JTl9LRUVQX0FMSVZFKSk7CisKKwllbmFfY29uZmlnX2hvc3RfaW5mbyhlbmFfZGV2KTsKKworCXJldHVybiAwOworCitlcnJfYWRtaW5faW5pdDoKKwllbmFfY29tX2FkbWluX2Rlc3Ryb3koZW5hX2Rldik7CitlcnJfbW1pb19yZWFkX2xlc3M6CisJZW5hX2NvbV9tbWlvX3JlZ19yZWFkX3JlcXVlc3RfZGVzdHJveShlbmFfZGV2KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbmFfZW5hYmxlX21zaXhfYW5kX3NldF9hZG1pbl9pbnRlcnJ1cHRzKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJCSAgICBpbnQgaW9fdmVjdG9ycykKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7CisJaW50IHJjOworCisJcmMgPSBlbmFfZW5hYmxlX21zaXgoYWRhcHRlciwgaW9fdmVjdG9ycyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuIG5vdCByZXNlcnZlIG1zaXggdmVjdG9yc1xuIik7CisJCXJldHVybiByYzsKKwl9CisKKwllbmFfc2V0dXBfbWdtbnRfaW50cihhZGFwdGVyKTsKKworCXJjID0gZW5hX3JlcXVlc3RfbWdtbnRfaXJxKGFkYXB0ZXIpOworCWlmIChyYykgeworCQlkZXZfZXJyKGRldiwgIkNhbiBub3Qgc2V0dXAgbWFuYWdlbWVudCBpbnRlcnJ1cHRzXG4iKTsKKwkJZ290byBlcnJfZGlzYWJsZV9tc2l4OworCX0KKworCWVuYV9jb21fc2V0X2FkbWluX3BvbGxpbmdfbW9kZShlbmFfZGV2LCBmYWxzZSk7CisKKwllbmFfY29tX2FkbWluX2FlbnFfZW5hYmxlKGVuYV9kZXYpOworCisJcmV0dXJuIDA7CisKK2Vycl9kaXNhYmxlX21zaXg6CisJZW5hX2Rpc2FibGVfbXNpeChhZGFwdGVyKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZW5hX2Z3X3Jlc2V0X2RldmljZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggZ2V0X2ZlYXRfY3R4OworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZW5hX2FkYXB0ZXIsIHJlc2V0X3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2ID0gYWRhcHRlci0+ZW5hX2RldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJYm9vbCBkZXZfdXAsIHdkX3N0YXRlOworCWludCByYzsKKworCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT50aW1lcl9zZXJ2aWNlKTsKKworCXJ0bmxfbG9jaygpOworCisJZGV2X3VwID0gdGVzdF9iaXQoRU5BX0ZMQUdfREVWX1VQLCAmYWRhcHRlci0+ZmxhZ3MpOworCWVuYV9jb21fc2V0X2FkbWluX3J1bm5pbmdfc3RhdGUoZW5hX2RldiwgZmFsc2UpOworCisJLyogQWZ0ZXIgY2FsbGluZyBlbmFfY2xvc2UgdGhlIHR4IHF1ZXVlcyBhbmQgdGhlIG5hcGkKKwkgKiBhcmUgZGlzYWJsZWQgc28gbm8gb25lIGNhbiBpbnRlcmZlcmUgb3IgdG91Y2ggdGhlCisJICogZGF0YSBzdHJ1Y3R1cmVzCisJICovCisJZW5hX2Nsb3NlKG5ldGRldik7CisKKwlyYyA9IGVuYV9jb21fZGV2X3Jlc2V0KGVuYV9kZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJEZXZpY2UgcmVzZXQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJZW5hX2ZyZWVfbWdtbnRfaXJxKGFkYXB0ZXIpOworCisJZW5hX2Rpc2FibGVfbXNpeChhZGFwdGVyKTsKKworCWVuYV9jb21fYWJvcnRfYWRtaW5fY29tbWFuZHMoZW5hX2Rldik7CisKKwllbmFfY29tX3dhaXRfZm9yX2Fib3J0X2NvbXBsZXRpb24oZW5hX2Rldik7CisKKwllbmFfY29tX2FkbWluX2Rlc3Ryb3koZW5hX2Rldik7CisKKwllbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF9kZXN0cm95KGVuYV9kZXYpOworCisJLyogRmluaXNoIHdpdGggdGhlIGRlc3Ryb3kgcGFydC4gU3RhcnQgdGhlIGluaXQgcGFydCAqLworCisJcmMgPSBlbmFfZGV2aWNlX2luaXQoZW5hX2RldiwgYWRhcHRlci0+cGRldiwgJmdldF9mZWF0X2N0eCwgJndkX3N0YXRlKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuIG5vdCBpbml0aWFsaXplIGRldmljZVxuIik7CisJCWdvdG8gZXJyOworCX0KKwlhZGFwdGVyLT53ZF9zdGF0ZSA9IHdkX3N0YXRlOworCisJcmMgPSBlbmFfZGV2aWNlX3ZhbGlkYXRlX3BhcmFtcyhhZGFwdGVyLCAmZ2V0X2ZlYXRfY3R4KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVmFsaWRhdGlvbiBvZiBkZXZpY2UgcGFyYW1ldGVycyBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9kZXZpY2VfZGVzdHJveTsKKwl9CisKKwlyYyA9IGVuYV9lbmFibGVfbXNpeF9hbmRfc2V0X2FkbWluX2ludGVycnVwdHMoYWRhcHRlciwKKwkJCQkJCSAgICAgIGFkYXB0ZXItPm51bV9xdWV1ZXMpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFbmFibGUgTVNJLVggZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZGV2aWNlX2Rlc3Ryb3k7CisJfQorCS8qIElmIHRoZSBpbnRlcmZhY2Ugd2FzIHVwIGJlZm9yZSB0aGUgcmVzZXQgYnJpbmcgaXQgdXAgKi8KKwlpZiAoZGV2X3VwKSB7CisJCXJjID0gZW5hX3VwKGFkYXB0ZXIpOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgSS9PIHF1ZXVlc1xuIik7CisJCQlnb3RvIGVycl9kaXNhYmxlX21zaXg7CisJCX0KKwl9CisKKwltb2RfdGltZXIoJmFkYXB0ZXItPnRpbWVyX3NlcnZpY2UsIHJvdW5kX2ppZmZpZXMoamlmZmllcyArIEhaKSk7CisKKwlydG5sX3VubG9jaygpOworCisJZGV2X2VycigmcGRldi0+ZGV2LCAiRGV2aWNlIHJlc2V0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlcbiIpOworCisJcmV0dXJuOworZXJyX2Rpc2FibGVfbXNpeDoKKwllbmFfZnJlZV9tZ21udF9pcnEoYWRhcHRlcik7CisJZW5hX2Rpc2FibGVfbXNpeChhZGFwdGVyKTsKK2Vycl9kZXZpY2VfZGVzdHJveToKKwllbmFfY29tX2FkbWluX2Rlc3Ryb3koZW5hX2Rldik7CitlcnI6CisJcnRubF91bmxvY2soKTsKKworCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJIlJlc2V0IGF0dGVtcHQgZmFpbGVkLiBDYW4gbm90IHJlc2V0IHRoZSBkZXZpY2VcbiIpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19mb3JfbWlzc2luZ190eF9jb21wbGV0aW9ucyhzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGVuYV90eF9idWZmZXIgKnR4X2J1ZjsKKwl1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKKwlzdHJ1Y3QgZW5hX3JpbmcgKnR4X3Jpbmc7CisJaW50IGksIGosIGJ1ZGdldDsKKwl1MzIgbWlzc2VkX3R4OworCisJLyogTWFrZSBzdXJlIHRoZSBkcml2ZXIgZG9lc24ndCB0dXJuIHRoZSBkZXZpY2UgaW4gb3RoZXIgcHJvY2VzcyAqLworCXNtcF9ybWIoKTsKKworCWlmICghdGVzdF9iaXQoRU5BX0ZMQUdfREVWX1VQLCAmYWRhcHRlci0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwlidWRnZXQgPSBFTkFfTU9OSVRPUkVEX1RYX1FVRVVFUzsKKworCWZvciAoaSA9IGFkYXB0ZXItPmxhc3RfbW9uaXRvcmVkX3R4X3FpZDsgaSA8IGFkYXB0ZXItPm51bV9xdWV1ZXM7IGkrKykgeworCQl0eF9yaW5nID0gJmFkYXB0ZXItPnR4X3JpbmdbaV07CisKKwkJZm9yIChqID0gMDsgaiA8IHR4X3JpbmctPnJpbmdfc2l6ZTsgaisrKSB7CisJCQl0eF9idWYgPSAmdHhfcmluZy0+dHhfYnVmZmVyX2luZm9bal07CisJCQlsYXN0X2ppZmZpZXMgPSB0eF9idWYtPmxhc3RfamlmZmllczsKKwkJCWlmICh1bmxpa2VseShsYXN0X2ppZmZpZXMgJiYgdGltZV9pc19iZWZvcmVfamlmZmllcyhsYXN0X2ppZmZpZXMgKyBUWF9USU1FT1VUKSkpIHsKKwkJCQluZXRpZl9ub3RpY2UoYWRhcHRlciwgdHhfZXJyLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkJCSAgICAgIkZvdW5kIGEgVHggdGhhdCB3YXNuJ3QgY29tcGxldGVkIG9uIHRpbWUsIHFpZCAlZCwgaW5kZXggJWQuXG4iLAorCQkJCQkgICAgIHR4X3JpbmctPnFpZCwgaik7CisKKwkJCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT5zeW5jcCk7CisJCQkJbWlzc2VkX3R4ID0gdHhfcmluZy0+dHhfc3RhdHMubWlzc2luZ190eF9jb21wKys7CisJCQkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnR4X3JpbmctPnN5bmNwKTsKKworCQkJCS8qIENsZWFyIGxhc3QgamlmZmllcyBzbyB0aGUgbG9zdCBidWZmZXIgd29uJ3QKKwkJCQkgKiBiZSBjb3VudGVkIHR3aWNlLgorCQkJCSAqLworCQkJCXR4X2J1Zi0+bGFzdF9qaWZmaWVzID0gMDsKKworCQkJCWlmICh1bmxpa2VseShtaXNzZWRfdHggPiBNQVhfTlVNX09GX1RJTUVPVVRFRF9QQUNLRVRTKSkgeworCQkJCQluZXRpZl9lcnIoYWRhcHRlciwgdHhfZXJyLCBhZGFwdGVyLT5uZXRkZXYsCisJCQkJCQkgICJUaGUgbnVtYmVyIG9mIGxvc3QgdHggY29tcGxldGlvbiBpcyBhYm92ZSB0aGUgdGhyZXNob2xkICglZCA+ICVkKS4gUmVzZXQgdGhlIGRldmljZVxuIiwKKwkJCQkJCSAgbWlzc2VkX3R4LCBNQVhfTlVNX09GX1RJTUVPVVRFRF9QQUNLRVRTKTsKKwkJCQkJc2V0X2JpdChFTkFfRkxBR19UUklHR0VSX1JFU0VULCAmYWRhcHRlci0+ZmxhZ3MpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWJ1ZGdldC0tOworCQlpZiAoIWJ1ZGdldCkKKwkJCWJyZWFrOworCX0KKworCWFkYXB0ZXItPmxhc3RfbW9uaXRvcmVkX3R4X3FpZCA9IGkgJSBhZGFwdGVyLT5udW1fcXVldWVzOworfQorCisvKiBDaGVjayBmb3Iga2VlcCBhbGl2ZSBleHBpcmF0aW9uICovCitzdGF0aWMgdm9pZCBjaGVja19mb3JfbWlzc2luZ19rZWVwX2FsaXZlKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGtlZXBfYWxpdmVfZXhwaXJlZDsKKworCWlmICghYWRhcHRlci0+d2Rfc3RhdGUpCisJCXJldHVybjsKKworCWtlZXBfYWxpdmVfZXhwaXJlZCA9IHJvdW5kX2ppZmZpZXMoYWRhcHRlci0+bGFzdF9rZWVwX2FsaXZlX2ppZmZpZXMKKwkJCQkJICAgKyBFTkFfREVWSUNFX0tBTElWRV9USU1FT1VUKTsKKwlpZiAodW5saWtlbHkodGltZV9pc19iZWZvcmVfamlmZmllcyhrZWVwX2FsaXZlX2V4cGlyZWQpKSkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJLZWVwIGFsaXZlIHdhdGNoZG9nIHRpbWVvdXQuXG4iKTsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmYWRhcHRlci0+c3luY3ApOworCQlhZGFwdGVyLT5kZXZfc3RhdHMud2RfZXhwaXJlZCsrOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmYWRhcHRlci0+c3luY3ApOworCQlzZXRfYml0KEVOQV9GTEFHX1RSSUdHRVJfUkVTRVQsICZhZGFwdGVyLT5mbGFncyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjaGVja19mb3JfYWRtaW5fY29tX3N0YXRlKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAodW5saWtlbHkoIWVuYV9jb21fZ2V0X2FkbWluX3J1bm5pbmdfc3RhdGUoYWRhcHRlci0+ZW5hX2RldikpKSB7CisJCW5ldGlmX2VycihhZGFwdGVyLCBkcnYsIGFkYXB0ZXItPm5ldGRldiwKKwkJCSAgIkVOQSBhZG1pbiBxdWV1ZSBpcyBub3QgaW4gcnVubmluZyBzdGF0ZSFcbiIpOworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZhZGFwdGVyLT5zeW5jcCk7CisJCWFkYXB0ZXItPmRldl9zdGF0cy5hZG1pbl9xX3BhdXNlKys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZhZGFwdGVyLT5zeW5jcCk7CisJCXNldF9iaXQoRU5BX0ZMQUdfVFJJR0dFUl9SRVNFVCwgJmFkYXB0ZXItPmZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV91cGRhdGVfaG9zdF9pbmZvKHN0cnVjdCBlbmFfYWRtaW5faG9zdF9pbmZvICpob3N0X2luZm8sCisJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJaG9zdF9pbmZvLT5zdXBwb3J0ZWRfbmV0d29ya19mZWF0dXJlc1swXSA9CisJCW5ldGRldi0+ZmVhdHVyZXMgJiBHRU5NQVNLX1VMTCgzMSwgMCk7CisJaG9zdF9pbmZvLT5zdXBwb3J0ZWRfbmV0d29ya19mZWF0dXJlc1sxXSA9CisJCShuZXRkZXYtPmZlYXR1cmVzICYgR0VOTUFTS19VTEwoNjMsIDMyKSkgPj4gMzI7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV90aW1lcl9zZXJ2aWNlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGVuYV9hZGFwdGVyICopZGF0YTsKKwl1OCAqZGVidWdfYXJlYSA9IGFkYXB0ZXItPmVuYV9kZXYtPmhvc3RfYXR0ci5kZWJ1Z19hcmVhX3ZpcnRfYWRkcjsKKwlzdHJ1Y3QgZW5hX2FkbWluX2hvc3RfaW5mbyAqaG9zdF9pbmZvID0KKwkJYWRhcHRlci0+ZW5hX2Rldi0+aG9zdF9hdHRyLmhvc3RfaW5mbzsKKworCWNoZWNrX2Zvcl9taXNzaW5nX2tlZXBfYWxpdmUoYWRhcHRlcik7CisKKwljaGVja19mb3JfYWRtaW5fY29tX3N0YXRlKGFkYXB0ZXIpOworCisJY2hlY2tfZm9yX21pc3NpbmdfdHhfY29tcGxldGlvbnMoYWRhcHRlcik7CisKKwlpZiAoZGVidWdfYXJlYSkKKwkJZW5hX2R1bXBfc3RhdHNfdG9fYnVmKGFkYXB0ZXIsIGRlYnVnX2FyZWEpOworCisJaWYgKGhvc3RfaW5mbykKKwkJZW5hX3VwZGF0ZV9ob3N0X2luZm8oaG9zdF9pbmZvLCBhZGFwdGVyLT5uZXRkZXYpOworCisJaWYgKHVubGlrZWx5KHRlc3RfYW5kX2NsZWFyX2JpdChFTkFfRkxBR19UUklHR0VSX1JFU0VULCAmYWRhcHRlci0+ZmxhZ3MpKSkgeworCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJUcmlnZ2VyIHJlc2V0IGlzIG9uXG4iKTsKKwkJZW5hX2R1bXBfc3RhdHNfdG9fZG1lc2coYWRhcHRlcik7CisJCXF1ZXVlX3dvcmsoZW5hX3dxLCAmYWRhcHRlci0+cmVzZXRfdGFzayk7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZXNldCB0aGUgdGltZXIgKi8KKwltb2RfdGltZXIoJmFkYXB0ZXItPnRpbWVyX3NlcnZpY2UsIGppZmZpZXMgKyBIWik7Cit9CisKK3N0YXRpYyBpbnQgZW5hX2NhbGNfaW9fcXVldWVfbnVtKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSBzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYsCisJCQkJIHN0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4ICpnZXRfZmVhdF9jdHgpCit7CisJaW50IGlvX3NxX251bSwgaW9fcXVldWVfbnVtOworCisJLyogSW4gY2FzZSBvZiBMTFEgdXNlIHRoZSBsbHEgbnVtYmVyIGluIHRoZSBnZXQgZmVhdHVyZSBjbWQgKi8KKwlpZiAoZW5hX2Rldi0+dHhfbWVtX3F1ZXVlX3R5cGUgPT0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfREVWKSB7CisJCWlvX3NxX251bSA9IGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfbGxxX251bTsKKworCQlpZiAoaW9fc3FfbnVtID09IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiVHJ5aW5nIHRvIHVzZSBMTFEgYnV0IGxscV9udW0gaXMgMC4gRmFsbCBiYWNrIGludG8gcmVndWxhciBxdWV1ZXNcbiIpOworCisJCQllbmFfZGV2LT50eF9tZW1fcXVldWVfdHlwZSA9CisJCQkJRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfSE9TVDsKKwkJCWlvX3NxX251bSA9IGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfc3FfbnVtOworCQl9CisJfSBlbHNlIHsKKwkJaW9fc3FfbnVtID0gZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9zcV9udW07CisJfQorCisJaW9fcXVldWVfbnVtID0gbWluX3QoaW50LCBudW1fcG9zc2libGVfY3B1cygpLCBFTkFfTUFYX05VTV9JT19RVUVVRVMpOworCWlvX3F1ZXVlX251bSA9IG1pbl90KGludCwgaW9fcXVldWVfbnVtLCBpb19zcV9udW0pOworCWlvX3F1ZXVlX251bSA9IG1pbl90KGludCwgaW9fcXVldWVfbnVtLAorCQkJICAgICBnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X2NxX251bSk7CisJLyogMSBJUlEgZm9yIGZvciBtZ21udCBhbmQgMSBJUlFzIGZvciBlYWNoIElPIGRpcmVjdGlvbiAqLworCWlvX3F1ZXVlX251bSA9IG1pbl90KGludCwgaW9fcXVldWVfbnVtLCBwY2lfbXNpeF92ZWNfY291bnQocGRldikgLSAxKTsKKwlpZiAodW5saWtlbHkoIWlvX3F1ZXVlX251bSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVGhlIGRldmljZSBkb2Vzbid0IGhhdmUgaW8gcXVldWVzXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIGlvX3F1ZXVlX251bTsKK30KKworc3RhdGljIHZvaWQgZW5hX3NldF9wdXNoX21vZGUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiwKKwkJCSAgICAgIHN0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4ICpnZXRfZmVhdF9jdHgpCit7CisJYm9vbCBoYXNfbWVtX2JhcjsKKworCWhhc19tZW1fYmFyID0gcGNpX3NlbGVjdF9iYXJzKHBkZXYsIElPUkVTT1VSQ0VfTUVNKSAmIEJJVChFTkFfTUVNX0JBUik7CisKKwkvKiBFbmFibGUgcHVzaCBtb2RlIGlmIGRldmljZSBzdXBwb3J0cyBMTFEgKi8KKwlpZiAoaGFzX21lbV9iYXIgJiYgKGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfbGxxX251bSA+IDApKQorCQllbmFfZGV2LT50eF9tZW1fcXVldWVfdHlwZSA9IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0RFVjsKKwllbHNlCisJCWVuYV9kZXYtPnR4X21lbV9xdWV1ZV90eXBlID0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfSE9TVDsKK30KKworc3RhdGljIHZvaWQgZW5hX3NldF9kZXZfb2ZmbG9hZHMoc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggKmZlYXQsCisJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgZGV2X2ZlYXR1cmVzID0gMDsKKworCS8qIFNldCBvZmZsb2FkIGZlYXR1cmVzICovCisJaWYgKGZlYXQtPm9mZmxvYWQudHggJgorCQlFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfVFhfTDRfSVBWNF9DU1VNX1BBUlRfTUFTSykKKwkJZGV2X2ZlYXR1cmVzIHw9IE5FVElGX0ZfSVBfQ1NVTTsKKworCWlmIChmZWF0LT5vZmZsb2FkLnR4ICYKKwkJRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RYX0w0X0lQVjZfQ1NVTV9QQVJUX01BU0spCisJCWRldl9mZWF0dXJlcyB8PSBORVRJRl9GX0lQVjZfQ1NVTTsKKworCWlmIChmZWF0LT5vZmZsb2FkLnR4ICYgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RTT19JUFY0X01BU0spCisJCWRldl9mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKKworCWlmIChmZWF0LT5vZmZsb2FkLnR4ICYgRU5BX0FETUlOX0ZFQVRVUkVfT0ZGTE9BRF9ERVNDX1RTT19JUFY2X01BU0spCisJCWRldl9mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzY7CisKKwlpZiAoZmVhdC0+b2ZmbG9hZC50eCAmIEVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19UU09fRUNOX01BU0spCisJCWRldl9mZWF0dXJlcyB8PSBORVRJRl9GX1RTT19FQ047CisKKwlpZiAoZmVhdC0+b2ZmbG9hZC5yeF9zdXBwb3J0ZWQgJgorCQlFTkFfQURNSU5fRkVBVFVSRV9PRkZMT0FEX0RFU0NfUlhfTDRfSVBWNF9DU1VNX01BU0spCisJCWRldl9mZWF0dXJlcyB8PSBORVRJRl9GX1JYQ1NVTTsKKworCWlmIChmZWF0LT5vZmZsb2FkLnJ4X3N1cHBvcnRlZCAmCisJCUVOQV9BRE1JTl9GRUFUVVJFX09GRkxPQURfREVTQ19SWF9MNF9JUFY2X0NTVU1fTUFTSykKKwkJZGV2X2ZlYXR1cmVzIHw9IE5FVElGX0ZfUlhDU1VNOworCisJbmV0ZGV2LT5mZWF0dXJlcyA9CisJCWRldl9mZWF0dXJlcyB8CisJCU5FVElGX0ZfU0cgfAorCQlORVRJRl9GX05UVVBMRSB8CisJCU5FVElGX0ZfUlhIQVNIIHwKKwkJTkVUSUZfRl9ISUdIRE1BOworCisJbmV0ZGV2LT5od19mZWF0dXJlcyB8PSBuZXRkZXYtPmZlYXR1cmVzOworCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBuZXRkZXYtPmZlYXR1cmVzOworfQorCitzdGF0aWMgdm9pZCBlbmFfc2V0X2NvbmZfZmVhdF9wYXJhbXMoc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICAgc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggKmZlYXQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworCS8qIENvcHkgbWFjIGFkZHJlc3MgKi8KKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZmVhdC0+ZGV2X2F0dHIubWFjX2FkZHIpKSB7CisJCWV0aF9od19hZGRyX3JhbmRvbShuZXRkZXYpOworCQlldGhlcl9hZGRyX2NvcHkoYWRhcHRlci0+bWFjX2FkZHIsIG5ldGRldi0+ZGV2X2FkZHIpOworCX0gZWxzZSB7CisJCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT5tYWNfYWRkciwgZmVhdC0+ZGV2X2F0dHIubWFjX2FkZHIpOworCQlldGhlcl9hZGRyX2NvcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+bWFjX2FkZHIpOworCX0KKworCS8qIFNldCBvZmZsb2FkIGZlYXR1cmVzICovCisJZW5hX3NldF9kZXZfb2ZmbG9hZHMoZmVhdCwgbmV0ZGV2KTsKKworCWFkYXB0ZXItPm1heF9tdHUgPSBmZWF0LT5kZXZfYXR0ci5tYXhfbXR1OworfQorCitzdGF0aWMgaW50IGVuYV9yc3NfaW5pdF9kZWZhdWx0KHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7CisJaW50IHJjLCBpOworCXUzMiB2YWw7CisKKwlyYyA9IGVuYV9jb21fcnNzX2luaXQoZW5hX2RldiwgRU5BX1JYX1JTU19UQUJMRV9MT0dfU0laRSk7CisJaWYgKHVubGlrZWx5KHJjKSkgeworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBpbml0IGluZGlyZWN0IHRhYmxlXG4iKTsKKwkJZ290byBlcnJfcnNzX2luaXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEVOQV9SWF9SU1NfVEFCTEVfU0laRTsgaSsrKSB7CisJCXZhbCA9IGV0aHRvb2xfcnhmaF9pbmRpcl9kZWZhdWx0KGksIGFkYXB0ZXItPm51bV9xdWV1ZXMpOworCQlyYyA9IGVuYV9jb21faW5kaXJlY3RfdGFibGVfZmlsbF9lbnRyeShlbmFfZGV2LCBpLAorCQkJCQkJICAgICAgIEVOQV9JT19SWFFfSURYKHZhbCkpOworCQlpZiAodW5saWtlbHkocmMgJiYgKHJjICE9IC1FUEVSTSkpKSB7CisJCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBmaWxsIGluZGlyZWN0IHRhYmxlXG4iKTsKKwkJCWdvdG8gZXJyX2ZpbGxfaW5kaXI7CisJCX0KKwl9CisKKwlyYyA9IGVuYV9jb21fZmlsbF9oYXNoX2Z1bmN0aW9uKGVuYV9kZXYsIEVOQV9BRE1JTl9DUkMzMiwgTlVMTCwKKwkJCQkJRU5BX0hBU0hfS0VZX1NJWkUsIDB4RkZGRkZGRkYpOworCWlmICh1bmxpa2VseShyYyAmJiAocmMgIT0gLUVQRVJNKSkpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZmlsbCBoYXNoIGZ1bmN0aW9uXG4iKTsKKwkJZ290byBlcnJfZmlsbF9pbmRpcjsKKwl9CisKKwlyYyA9IGVuYV9jb21fc2V0X2RlZmF1bHRfaGFzaF9jdHJsKGVuYV9kZXYpOworCWlmICh1bmxpa2VseShyYyAmJiAocmMgIT0gLUVQRVJNKSkpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZmlsbCBoYXNoIGNvbnRyb2xcbiIpOworCQlnb3RvIGVycl9maWxsX2luZGlyOworCX0KKworCXJldHVybiAwOworCitlcnJfZmlsbF9pbmRpcjoKKwllbmFfY29tX3Jzc19kZXN0cm95KGVuYV9kZXYpOworZXJyX3Jzc19pbml0OgorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBlbmFfcmVsZWFzZV9iYXJzKHN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2Rldiwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IHJlbGVhc2VfYmFyczsKKworCXJlbGVhc2VfYmFycyA9IHBjaV9zZWxlY3RfYmFycyhwZGV2LCBJT1JFU09VUkNFX01FTSkgJiBFTkFfQkFSX01BU0s7CisJcGNpX3JlbGVhc2Vfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LCByZWxlYXNlX2JhcnMpOworfQorCitzdGF0aWMgaW50IGVuYV9jYWxjX3F1ZXVlX3NpemUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgICAgc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2LAorCQkJICAgICAgIHUxNiAqbWF4X3R4X3NnbF9zaXplLAorCQkJICAgICAgIHUxNiAqbWF4X3J4X3NnbF9zaXplLAorCQkJICAgICAgIHN0cnVjdCBlbmFfY29tX2Rldl9nZXRfZmVhdHVyZXNfY3R4ICpnZXRfZmVhdF9jdHgpCit7CisJdTMyIHF1ZXVlX3NpemUgPSBFTkFfREVGQVVMVF9SSU5HX1NJWkU7CisKKwlxdWV1ZV9zaXplID0gbWluX3QodTMyLCBxdWV1ZV9zaXplLAorCQkJICAgZ2V0X2ZlYXRfY3R4LT5tYXhfcXVldWVzLm1heF9jcV9kZXB0aCk7CisJcXVldWVfc2l6ZSA9IG1pbl90KHUzMiwgcXVldWVfc2l6ZSwKKwkJCSAgIGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfc3FfZGVwdGgpOworCisJaWYgKGVuYV9kZXYtPnR4X21lbV9xdWV1ZV90eXBlID09IEVOQV9BRE1JTl9QTEFDRU1FTlRfUE9MSUNZX0RFVikKKwkJcXVldWVfc2l6ZSA9IG1pbl90KHUzMiwgcXVldWVfc2l6ZSwKKwkJCQkgICBnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X2xscV9kZXB0aCk7CisKKwlxdWV1ZV9zaXplID0gcm91bmRkb3duX3Bvd19vZl90d28ocXVldWVfc2l6ZSk7CisKKwlpZiAodW5saWtlbHkoIXF1ZXVlX3NpemUpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgcXVldWUgc2l6ZVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCSptYXhfdHhfc2dsX3NpemUgPSBtaW5fdCh1MTYsIEVOQV9QS1RfTUFYX0JVRlMsCisJCQkJIGdldF9mZWF0X2N0eC0+bWF4X3F1ZXVlcy5tYXhfcGFja2V0X3R4X2Rlc2NzKTsKKwkqbWF4X3J4X3NnbF9zaXplID0gbWluX3QodTE2LCBFTkFfUEtUX01BWF9CVUZTLAorCQkJCSBnZXRfZmVhdF9jdHgtPm1heF9xdWV1ZXMubWF4X3BhY2tldF9yeF9kZXNjcyk7CisKKwlyZXR1cm4gcXVldWVfc2l6ZTsKK30KKworLyogZW5hX3Byb2JlIC0gRGV2aWNlIEluaXRpYWxpemF0aW9uIFJvdXRpbmUKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdAorICogQGVudDogZW50cnkgaW4gZW5hX3BjaV90YmwKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICoKKyAqIGVuYV9wcm9iZSBpbml0aWFsaXplcyBhbiBhZGFwdGVyIGlkZW50aWZpZWQgYnkgYSBwY2lfZGV2IHN0cnVjdHVyZS4KKyAqIFRoZSBPUyBpbml0aWFsaXphdGlvbiwgY29uZmlndXJpbmcgb2YgdGhlIGFkYXB0ZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUsCisgKiBhbmQgYSBoYXJkd2FyZSByZXNldCBvY2N1ci4KKyAqLworc3RhdGljIGludCBlbmFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJc3RydWN0IGVuYV9jb21fZGV2X2dldF9mZWF0dXJlc19jdHggZ2V0X2ZlYXRfY3R4OworCXN0YXRpYyBpbnQgdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBlbmFfY29tX2RldiAqZW5hX2RldiA9IE5VTEw7CisJc3RhdGljIGludCBhZGFwdGVyc19mb3VuZDsKKwlpbnQgaW9fcXVldWVfbnVtLCBiYXJzLCByYzsKKwlpbnQgcXVldWVfc2l6ZTsKKwl1MTYgdHhfc2dsX3NpemUgPSAwOworCXUxNiByeF9zZ2xfc2l6ZSA9IDA7CisJYm9vbCB3ZF9zdGF0ZTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIiwgdmVyc2lvbik7CisKKwlyYyA9IHBjaV9lbmFibGVfZGV2aWNlX21lbShwZGV2KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX2VuYWJsZV9kZXZpY2VfbWVtKCkgZmFpbGVkIVxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWVuYV9kZXYgPSB2emFsbG9jKHNpemVvZigqZW5hX2RldikpOworCWlmICghZW5hX2RldikgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2Rpc2FibGVfZGV2aWNlOworCX0KKworCWJhcnMgPSBwY2lfc2VsZWN0X2JhcnMocGRldiwgSU9SRVNPVVJDRV9NRU0pICYgRU5BX0JBUl9NQVNLOworCXJjID0gcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LCBiYXJzLCBEUlZfTU9EVUxFX05BTUUpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zIGZhaWxlZCAlZFxuIiwKKwkJCXJjKTsKKwkJZ290byBlcnJfZnJlZV9lbmFfZGV2OworCX0KKworCWVuYV9kZXYtPnJlZ19iYXIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBFTkFfUkVHX0JBUiksCisJCQkJICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCBFTkFfUkVHX0JBUikpOworCWlmICghZW5hX2Rldi0+cmVnX2JhcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVtYXAgcmVncyBiYXJcbiIpOworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX2ZyZWVfcmVnaW9uOworCX0KKworCWVuYV9kZXYtPmRtYWRldiA9ICZwZGV2LT5kZXY7CisKKwlyYyA9IGVuYV9kZXZpY2VfaW5pdChlbmFfZGV2LCBwZGV2LCAmZ2V0X2ZlYXRfY3R4LCAmd2Rfc3RhdGUpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlbmEgZGV2aWNlIGluaXQgZmFpbGVkXG4iKTsKKwkJaWYgKHJjID09IC1FVElNRSkKKwkJCXJjID0gLUVQUk9CRV9ERUZFUjsKKwkJZ290byBlcnJfZnJlZV9yZWdpb247CisJfQorCisJZW5hX3NldF9wdXNoX21vZGUocGRldiwgZW5hX2RldiwgJmdldF9mZWF0X2N0eCk7CisKKwlpZiAoZW5hX2Rldi0+dHhfbWVtX3F1ZXVlX3R5cGUgPT0gRU5BX0FETUlOX1BMQUNFTUVOVF9QT0xJQ1lfREVWKSB7CisJCWVuYV9kZXYtPm1lbV9iYXIgPSBpb3JlbWFwX3djKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBFTkFfTUVNX0JBUiksCisJCQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgRU5BX01FTV9CQVIpKTsKKwkJaWYgKCFlbmFfZGV2LT5tZW1fYmFyKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlnb3RvIGVycl9kZXZpY2VfZGVzdHJveTsKKwkJfQorCX0KKworCS8qIGluaXRpYWwgVHggaW50ZXJydXB0IGRlbGF5LCBBc3N1bWVzIDEgdXNlYyBncmFudWxhcml0eS4KKwkqIFVwZGF0ZWQgZHVyaW5nIGRldmljZSBpbml0aWFsaXphdGlvbiB3aXRoIHRoZSByZWFsIGdyYW51bGFyaXR5CisJKi8KKwllbmFfZGV2LT5pbnRyX21vZGVyX3R4X2ludGVydmFsID0gRU5BX0lOVFJfSU5JVElBTF9UWF9JTlRFUlZBTF9VU0VDUzsKKwlpb19xdWV1ZV9udW0gPSBlbmFfY2FsY19pb19xdWV1ZV9udW0ocGRldiwgZW5hX2RldiwgJmdldF9mZWF0X2N0eCk7CisJcXVldWVfc2l6ZSA9IGVuYV9jYWxjX3F1ZXVlX3NpemUocGRldiwgZW5hX2RldiwgJnR4X3NnbF9zaXplLAorCQkJCQkgJnJ4X3NnbF9zaXplLCAmZ2V0X2ZlYXRfY3R4KTsKKwlpZiAoKHF1ZXVlX3NpemUgPD0gMCkgfHwgKGlvX3F1ZXVlX251bSA8PSAwKSkgeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gZXJyX2RldmljZV9kZXN0cm95OworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJjcmVhdGluZyAlZCBpbyBxdWV1ZXMuIHF1ZXVlIHNpemU6ICVkXG4iLAorCQkgaW9fcXVldWVfbnVtLCBxdWV1ZV9zaXplKTsKKworCS8qIGRldiB6ZXJvZWQgaW4gaW5pdF9ldGhlcmRldiAqLworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3QgZW5hX2FkYXB0ZXIpLCBpb19xdWV1ZV9udW0pOworCWlmICghbmV0ZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImFsbG9jX2V0aGVyZGV2X21xIGZhaWxlZFxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfZGV2aWNlX2Rlc3Ryb3k7CisJfQorCisJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmcGRldi0+ZGV2KTsKKworCWFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBhZGFwdGVyKTsKKworCWFkYXB0ZXItPmVuYV9kZXYgPSBlbmFfZGV2OworCWFkYXB0ZXItPm5ldGRldiA9IG5ldGRldjsKKwlhZGFwdGVyLT5wZGV2ID0gcGRldjsKKworCWVuYV9zZXRfY29uZl9mZWF0X3BhcmFtcyhhZGFwdGVyLCAmZ2V0X2ZlYXRfY3R4KTsKKworCWFkYXB0ZXItPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdChkZWJ1ZywgREVGQVVMVF9NU0dfRU5BQkxFKTsKKworCWFkYXB0ZXItPnR4X3Jpbmdfc2l6ZSA9IHF1ZXVlX3NpemU7CisJYWRhcHRlci0+cnhfcmluZ19zaXplID0gcXVldWVfc2l6ZTsKKworCWFkYXB0ZXItPm1heF90eF9zZ2xfc2l6ZSA9IHR4X3NnbF9zaXplOworCWFkYXB0ZXItPm1heF9yeF9zZ2xfc2l6ZSA9IHJ4X3NnbF9zaXplOworCisJYWRhcHRlci0+bnVtX3F1ZXVlcyA9IGlvX3F1ZXVlX251bTsKKwlhZGFwdGVyLT5sYXN0X21vbml0b3JlZF90eF9xaWQgPSAwOworCisJYWRhcHRlci0+cnhfY29weWJyZWFrID0gRU5BX0RFRkFVTFRfUlhfQ09QWUJSRUFLOworCWFkYXB0ZXItPndkX3N0YXRlID0gd2Rfc3RhdGU7CisKKwlzbnByaW50ZihhZGFwdGVyLT5uYW1lLCBFTkFfTkFNRV9NQVhfTEVOLCAiZW5hXyVkIiwgYWRhcHRlcnNfZm91bmQpOworCisJcmMgPSBlbmFfY29tX2luaXRfaW50ZXJydXB0X21vZGVyYXRpb24oYWRhcHRlci0+ZW5hX2Rldik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gcXVlcnkgaW50ZXJydXB0IG1vZGVyYXRpb24gZmVhdHVyZVxuIik7CisJCWdvdG8gZXJyX25ldGRldl9kZXN0cm95OworCX0KKwllbmFfaW5pdF9pb19yaW5ncyhhZGFwdGVyKTsKKworCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZlbmFfbmV0ZGV2X29wczsKKwluZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKKwllbmFfc2V0X2V0aHRvb2xfb3BzKG5ldGRldik7CisKKwluZXRkZXYtPnByaXZfZmxhZ3MgfD0gSUZGX1VOSUNBU1RfRkxUOworCisJdTY0X3N0YXRzX2luaXQoJmFkYXB0ZXItPnN5bmNwKTsKKworCXJjID0gZW5hX2VuYWJsZV9tc2l4X2FuZF9zZXRfYWRtaW5faW50ZXJydXB0cyhhZGFwdGVyLCBpb19xdWV1ZV9udW0pOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGVuYWJsZSBhbmQgc2V0IHRoZSBhZG1pbiBpbnRlcnJ1cHRzXG4iKTsKKwkJZ290byBlcnJfd29ya2VyX2Rlc3Ryb3k7CisJfQorCXJjID0gZW5hX3Jzc19pbml0X2RlZmF1bHQoYWRhcHRlcik7CisJaWYgKHJjICYmIChyYyAhPSAtRVBFUk0pKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBpbml0IFJTUyByYzogJWRcbiIsIHJjKTsKKwkJZ290byBlcnJfZnJlZV9tc2l4OworCX0KKworCWVuYV9jb25maWdfZGVidWdfYXJlYShhZGFwdGVyKTsKKworCW1lbWNweShhZGFwdGVyLT5uZXRkZXYtPnBlcm1fYWRkciwgYWRhcHRlci0+bWFjX2FkZHIsIG5ldGRldi0+YWRkcl9sZW4pOworCisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKworCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfcnNzOworCX0KKworCUlOSVRfV09SSygmYWRhcHRlci0+c3VzcGVuZF9pb190YXNrLCBlbmFfZGV2aWNlX2lvX3N1c3BlbmQpOworCUlOSVRfV09SSygmYWRhcHRlci0+cmVzdW1lX2lvX3Rhc2ssIGVuYV9kZXZpY2VfaW9fcmVzdW1lKTsKKwlJTklUX1dPUksoJmFkYXB0ZXItPnJlc2V0X3Rhc2ssIGVuYV9md19yZXNldF9kZXZpY2UpOworCisJYWRhcHRlci0+bGFzdF9rZWVwX2FsaXZlX2ppZmZpZXMgPSBqaWZmaWVzOworCisJaW5pdF90aW1lcigmYWRhcHRlci0+dGltZXJfc2VydmljZSk7CisJYWRhcHRlci0+dGltZXJfc2VydmljZS5leHBpcmVzID0gcm91bmRfamlmZmllcyhqaWZmaWVzICsgSFopOworCWFkYXB0ZXItPnRpbWVyX3NlcnZpY2UuZnVuY3Rpb24gPSBlbmFfdGltZXJfc2VydmljZTsKKwlhZGFwdGVyLT50aW1lcl9zZXJ2aWNlLmRhdGEgPSAodW5zaWduZWQgbG9uZylhZGFwdGVyOworCisJYWRkX3RpbWVyKCZhZGFwdGVyLT50aW1lcl9zZXJ2aWNlKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcyBmb3VuZCBhdCBtZW0gJWx4LCBtYWMgYWRkciAlcE0gUXVldWVzICVkXG4iLAorCQkgREVWSUNFX05BTUUsIChsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKKwkJIG5ldGRldi0+ZGV2X2FkZHIsIGlvX3F1ZXVlX251bSk7CisKKwlzZXRfYml0KEVOQV9GTEFHX0RFVklDRV9SVU5OSU5HLCAmYWRhcHRlci0+ZmxhZ3MpOworCisJYWRhcHRlcnNfZm91bmQrKzsKKworCXJldHVybiAwOworCitlcnJfcnNzOgorCWVuYV9jb21fZGVsZXRlX2RlYnVnX2FyZWEoZW5hX2Rldik7CisJZW5hX2NvbV9yc3NfZGVzdHJveShlbmFfZGV2KTsKK2Vycl9mcmVlX21zaXg6CisJZW5hX2NvbV9kZXZfcmVzZXQoZW5hX2Rldik7CisJZW5hX2ZyZWVfbWdtbnRfaXJxKGFkYXB0ZXIpOworCWVuYV9kaXNhYmxlX21zaXgoYWRhcHRlcik7CitlcnJfd29ya2VyX2Rlc3Ryb3k6CisJZW5hX2NvbV9kZXN0cm95X2ludGVycnVwdF9tb2RlcmF0aW9uKGVuYV9kZXYpOworCWRlbF90aW1lcigmYWRhcHRlci0+dGltZXJfc2VydmljZSk7CisJY2FuY2VsX3dvcmtfc3luYygmYWRhcHRlci0+c3VzcGVuZF9pb190YXNrKTsKKwljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5yZXN1bWVfaW9fdGFzayk7CitlcnJfbmV0ZGV2X2Rlc3Ryb3k6CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKK2Vycl9kZXZpY2VfZGVzdHJveToKKwllbmFfY29tX2RlbGV0ZV9ob3N0X2luZm8oZW5hX2Rldik7CisJZW5hX2NvbV9hZG1pbl9kZXN0cm95KGVuYV9kZXYpOworZXJyX2ZyZWVfcmVnaW9uOgorCWVuYV9yZWxlYXNlX2JhcnMoZW5hX2RldiwgcGRldik7CitlcnJfZnJlZV9lbmFfZGV2OgorCXZmcmVlKGVuYV9kZXYpOworZXJyX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZW5hX3NyaW92X2NvbmZpZ3VyZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnVtdmZzKQoreworCWludCByYzsKKworCWlmIChudW12ZnMgPiAwKSB7CisJCXJjID0gcGNpX2VuYWJsZV9zcmlvdihkZXYsIG51bXZmcyk7CisJCWlmIChyYyAhPSAwKSB7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwKKwkJCQkicGNpX2VuYWJsZV9zcmlvdiBmYWlsZWQgdG8gZW5hYmxlOiAlZCB2ZnMgd2l0aCB0aGUgZXJyb3I6ICVkXG4iLAorCQkJCW51bXZmcywgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJcmV0dXJuIG51bXZmczsKKwl9CisKKwlpZiAobnVtdmZzID09IDApIHsKKwkJcGNpX2Rpc2FibGVfc3Jpb3YoZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZW5hX3JlbW92ZSAtIERldmljZSBSZW1vdmFsIFJvdXRpbmUKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIHN0cnVjdAorICoKKyAqIGVuYV9yZW1vdmUgaXMgY2FsbGVkIGJ5IHRoZSBQQ0kgc3Vic3lzdGVtIHRvIGFsZXJ0IHRoZSBkcml2ZXIKKyAqIHRoYXQgaXQgc2hvdWxkIHJlbGVhc2UgYSBQQ0kgZGV2aWNlLgorICovCitzdGF0aWMgdm9pZCBlbmFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCWlmICghYWRhcHRlcikKKwkJLyogVGhpcyBkZXZpY2UgZGlkbid0IGxvYWQgcHJvcGVybHkgYW5kIGl0J3MgcmVzb3VyY2VzCisJCSAqIGFscmVhZHkgcmVsZWFzZWQsIG5vdGhpbmcgdG8gZG8KKwkJICovCisJCXJldHVybjsKKworCWVuYV9kZXYgPSBhZGFwdGVyLT5lbmFfZGV2OworCW5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKworI2lmZGVmIENPTkZJR19SRlNfQUNDRUwKKwlpZiAoKGFkYXB0ZXItPm1zaXhfdmVjcyA+PSAxKSAmJiAobmV0ZGV2LT5yeF9jcHVfcm1hcCkpIHsKKwkJZnJlZV9pcnFfY3B1X3JtYXAobmV0ZGV2LT5yeF9jcHVfcm1hcCk7CisJCW5ldGRldi0+cnhfY3B1X3JtYXAgPSBOVUxMOworCX0KKyNlbmRpZiAvKiBDT05GSUdfUkZTX0FDQ0VMICovCisKKwl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT50aW1lcl9zZXJ2aWNlKTsKKworCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPnJlc2V0X3Rhc2spOworCisJY2FuY2VsX3dvcmtfc3luYygmYWRhcHRlci0+c3VzcGVuZF9pb190YXNrKTsKKworCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPnJlc3VtZV9pb190YXNrKTsKKworCWVuYV9jb21fZGV2X3Jlc2V0KGVuYV9kZXYpOworCisJZW5hX2ZyZWVfbWdtbnRfaXJxKGFkYXB0ZXIpOworCisJZW5hX2Rpc2FibGVfbXNpeChhZGFwdGVyKTsKKworCWZyZWVfbmV0ZGV2KG5ldGRldik7CisKKwllbmFfY29tX21taW9fcmVnX3JlYWRfcmVxdWVzdF9kZXN0cm95KGVuYV9kZXYpOworCisJZW5hX2NvbV9hYm9ydF9hZG1pbl9jb21tYW5kcyhlbmFfZGV2KTsKKworCWVuYV9jb21fd2FpdF9mb3JfYWJvcnRfY29tcGxldGlvbihlbmFfZGV2KTsKKworCWVuYV9jb21fYWRtaW5fZGVzdHJveShlbmFfZGV2KTsKKworCWVuYV9jb21fcnNzX2Rlc3Ryb3koZW5hX2Rldik7CisKKwllbmFfY29tX2RlbGV0ZV9kZWJ1Z19hcmVhKGVuYV9kZXYpOworCisJZW5hX2NvbV9kZWxldGVfaG9zdF9pbmZvKGVuYV9kZXYpOworCisJZW5hX3JlbGVhc2VfYmFycyhlbmFfZGV2LCBwZGV2KTsKKworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCWVuYV9jb21fZGVzdHJveV9pbnRlcnJ1cHRfbW9kZXJhdGlvbihlbmFfZGV2KTsKKworCXZmcmVlKGVuYV9kZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZW5hX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRFJWX01PRFVMRV9OQU1FLAorCS5pZF90YWJsZQk9IGVuYV9wY2lfdGJsLAorCS5wcm9iZQkJPSBlbmFfcHJvYmUsCisJLnJlbW92ZQkJPSBlbmFfcmVtb3ZlLAorCS5zcmlvdl9jb25maWd1cmUgPSBlbmFfc3Jpb3ZfY29uZmlndXJlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZW5hX2luaXQodm9pZCkKK3sKKwlwcl9pbmZvKCIlcyIsIHZlcnNpb24pOworCisJZW5hX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoRFJWX01PRFVMRV9OQU1FKTsKKwlpZiAoIWVuYV93cSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBjcmVhdGUgd29ya3F1ZXVlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmVuYV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVuYV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZlbmFfcGNpX2RyaXZlcik7CisKKwlpZiAoZW5hX3dxKSB7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKGVuYV93cSk7CisJCWVuYV93cSA9IE5VTEw7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQUVOUSBIYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBlbmFfdXBkYXRlX29uX2xpbmtfY2hhbmdlOgorICogTm90aWZ5IHRoZSBuZXR3b3JrIGludGVyZmFjZSBhYm91dCB0aGUgY2hhbmdlIGluIGxpbmsgc3RhdHVzCisgKi8KK3N0YXRpYyB2b2lkIGVuYV91cGRhdGVfb25fbGlua19jaGFuZ2Uodm9pZCAqYWRhcHRlcl9kYXRhLAorCQkJCSAgICAgIHN0cnVjdCBlbmFfYWRtaW5fYWVucV9lbnRyeSAqYWVucV9lKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKilhZGFwdGVyX2RhdGE7CisJc3RydWN0IGVuYV9hZG1pbl9hZW5xX2xpbmtfY2hhbmdlX2Rlc2MgKmFlbnFfZGVzYyA9CisJCShzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfbGlua19jaGFuZ2VfZGVzYyAqKWFlbnFfZTsKKwlpbnQgc3RhdHVzID0gYWVucV9kZXNjLT5mbGFncyAmCisJCUVOQV9BRE1JTl9BRU5RX0xJTktfQ0hBTkdFX0RFU0NfTElOS19TVEFUVVNfTUFTSzsKKworCWlmIChzdGF0dXMpIHsKKwkJbmV0ZGV2X2RiZyhhZGFwdGVyLT5uZXRkZXYsICIlc1xuIiwgX19mdW5jX18pOworCQlzZXRfYml0KEVOQV9GTEFHX0xJTktfVVAsICZhZGFwdGVyLT5mbGFncyk7CisJCW5ldGlmX2NhcnJpZXJfb24oYWRhcHRlci0+bmV0ZGV2KTsKKwl9IGVsc2UgeworCQljbGVhcl9iaXQoRU5BX0ZMQUdfTElOS19VUCwgJmFkYXB0ZXItPmZsYWdzKTsKKwkJbmV0aWZfY2Fycmllcl9vZmYoYWRhcHRlci0+bmV0ZGV2KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9rZWVwX2FsaXZlX3dkKHZvaWQgKmFkYXB0ZXJfZGF0YSwKKwkJCSAgICAgIHN0cnVjdCBlbmFfYWRtaW5fYWVucV9lbnRyeSAqYWVucV9lKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKilhZGFwdGVyX2RhdGE7CisKKwlhZGFwdGVyLT5sYXN0X2tlZXBfYWxpdmVfamlmZmllcyA9IGppZmZpZXM7Cit9CisKK3N0YXRpYyB2b2lkIGVuYV9ub3RpZmljYXRpb24odm9pZCAqYWRhcHRlcl9kYXRhLAorCQkJICAgICBzdHJ1Y3QgZW5hX2FkbWluX2FlbnFfZW50cnkgKmFlbnFfZSkKK3sKKwlzdHJ1Y3QgZW5hX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGVuYV9hZGFwdGVyICopYWRhcHRlcl9kYXRhOworCisJV0FSTihhZW5xX2UtPmFlbnFfY29tbW9uX2Rlc2MuZ3JvdXAgIT0gRU5BX0FETUlOX05PVElGSUNBVElPTiwKKwkgICAgICJJbnZhbGlkIGdyb3VwKCV4KSBleHBlY3RlZCAleFxuIiwKKwkgICAgIGFlbnFfZS0+YWVucV9jb21tb25fZGVzYy5ncm91cCwKKwkgICAgIEVOQV9BRE1JTl9OT1RJRklDQVRJT04pOworCisJc3dpdGNoIChhZW5xX2UtPmFlbnFfY29tbW9uX2Rlc2Muc3luZHJvbSkgeworCWNhc2UgRU5BX0FETUlOX1NVU1BFTkQ6CisJCS8qIFN1c3BlbmQganVzdCB0aGUgSU8gcXVldWVzLgorCQkgKiBXZSBkZWxpYmVyYXRlbHkgZG9uJ3Qgc3VzcGVuZCBhZG1pbiBzbyB0aGUgdGltZXIgYW5kCisJCSAqIHRoZSBrZWVwX2FsaXZlIGV2ZW50cyBzaG91bGQgcmVtYWluLgorCQkgKi8KKwkJcXVldWVfd29yayhlbmFfd3EsICZhZGFwdGVyLT5zdXNwZW5kX2lvX3Rhc2spOworCQlicmVhazsKKwljYXNlIEVOQV9BRE1JTl9SRVNVTUU6CisJCXF1ZXVlX3dvcmsoZW5hX3dxLCAmYWRhcHRlci0+cmVzdW1lX2lvX3Rhc2spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQluZXRpZl9lcnIoYWRhcHRlciwgZHJ2LCBhZGFwdGVyLT5uZXRkZXYsCisJCQkgICJJbnZhbGlkIGFlbnEgbm90aWZpY2F0aW9uIGxpbmsgc3RhdGUgJWRcbiIsCisJCQkgIGFlbnFfZS0+YWVucV9jb21tb25fZGVzYy5zeW5kcm9tKTsKKwl9Cit9CisKKy8qIFRoaXMgaGFuZGxlciB3aWxsIGNhbGxlZCBmb3IgdW5rbm93biBldmVudCBncm91cCBvciB1bmltcGxlbWVudGVkIGhhbmRsZXJzKi8KK3N0YXRpYyB2b2lkIHVuaW1wbGVtZW50ZWRfYWVucV9oYW5kbGVyKHZvaWQgKmRhdGEsCisJCQkJICAgICAgIHN0cnVjdCBlbmFfYWRtaW5fYWVucV9lbnRyeSAqYWVucV9lKQoreworCXN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgZW5hX2FkYXB0ZXIgKilkYXRhOworCisJbmV0aWZfZXJyKGFkYXB0ZXIsIGRydiwgYWRhcHRlci0+bmV0ZGV2LAorCQkgICJVbmtub3duIGV2ZW50IHdhcyByZWNlaXZlZCBvciBldmVudCB3aXRoIHVuaW1wbGVtZW50ZWQgaGFuZGxlclxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZW5hX2FlbnFfaGFuZGxlcnMgYWVucV9oYW5kbGVycyA9IHsKKwkuaGFuZGxlcnMgPSB7CisJCVtFTkFfQURNSU5fTElOS19DSEFOR0VdID0gZW5hX3VwZGF0ZV9vbl9saW5rX2NoYW5nZSwKKwkJW0VOQV9BRE1JTl9OT1RJRklDQVRJT05dID0gZW5hX25vdGlmaWNhdGlvbiwKKwkJW0VOQV9BRE1JTl9LRUVQX0FMSVZFXSA9IGVuYV9rZWVwX2FsaXZlX3dkLAorCX0sCisJLnVuaW1wbGVtZW50ZWRfaGFuZGxlciA9IHVuaW1wbGVtZW50ZWRfYWVucV9oYW5kbGVyCit9OworCittb2R1bGVfaW5pdChlbmFfaW5pdCk7Cittb2R1bGVfZXhpdChlbmFfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9uZXRkZXYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX25ldGRldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDdlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9uZXRkZXYuaApAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBFTkFfSAorI2RlZmluZSBFTkFfSAorCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlICJlbmFfY29tLmgiCisjaW5jbHVkZSAiZW5hX2V0aF9jb20uaCIKKworI2RlZmluZSBEUlZfTU9EVUxFX1ZFUl9NQUpPUgkxCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSX01JTk9SCTAKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJfU1VCTUlOT1IgMgorCisjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJImVuYSIKKyNpZm5kZWYgRFJWX01PRFVMRV9WRVJTSU9OCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTiBcCisJX19zdHJpbmdpZnkoRFJWX01PRFVMRV9WRVJfTUFKT1IpICIuIglcCisJX19zdHJpbmdpZnkoRFJWX01PRFVMRV9WRVJfTUlOT1IpICIuIglcCisJX19zdHJpbmdpZnkoRFJWX01PRFVMRV9WRVJfU1VCTUlOT1IpCisjZW5kaWYKKworI2RlZmluZSBERVZJQ0VfTkFNRQkiRWxhc3RpYyBOZXR3b3JrIEFkYXB0ZXIgKEVOQSkiCisKKy8qIDEgZm9yIEFFTlEgKyBBRE1JTiAqLworI2RlZmluZSBFTkFfTUFYX01TSVhfVkVDKGlvX3F1ZXVlcykJKDEgKyAoaW9fcXVldWVzKSkKKworI2RlZmluZSBFTkFfUkVHX0JBUgkJCTAKKyNkZWZpbmUgRU5BX01FTV9CQVIJCQkyCisjZGVmaW5lIEVOQV9CQVJfTUFTSyAoQklUKEVOQV9SRUdfQkFSKSB8IEJJVChFTkFfTUVNX0JBUikpCisKKyNkZWZpbmUgRU5BX0RFRkFVTFRfUklOR19TSVpFCSgxMDI0KQorCisjZGVmaW5lIEVOQV9UWF9XQUtFVVBfVEhSRVNICQkoTUFYX1NLQl9GUkFHUyArIDIpCisjZGVmaW5lIEVOQV9ERUZBVUxUX1JYX0NPUFlCUkVBSwkoMTI4IC0gTkVUX0lQX0FMSUdOKQorCisvKiBsaW1pdCB0aGUgYnVmZmVyIHNpemUgdG8gNjAwIGJ5dGVzIHRvIGhhbmRsZSBNVFUgY2hhbmdlcyBmcm9tIHZlcnkKKyAqIHNtYWxsIHRvIHZlcnkgbGFyZ2UsIGluIHdoaWNoIGNhc2UgdGhlIG51bWJlciBvZiBidWZmZXJzIHBlciBwYWNrZXQKKyAqIGNvdWxkIGV4Y2VlZCBFTkFfUEtUX01BWF9CVUZTCisgKi8KKyNkZWZpbmUgRU5BX0RFRkFVTFRfTUlOX1JYX0JVRkZfQUxMT0NfU0laRSA2MDAKKworI2RlZmluZSBFTkFfTUlOX01UVQkJMTI4CisKKyNkZWZpbmUgRU5BX05BTUVfTUFYX0xFTgkyMAorI2RlZmluZSBFTkFfSVJRTkFNRV9TSVpFCTQwCisKKyNkZWZpbmUgRU5BX1BLVF9NQVhfQlVGUwkxOQorCisjZGVmaW5lIEVOQV9SWF9SU1NfVEFCTEVfTE9HX1NJWkUgIDcKKyNkZWZpbmUgRU5BX1JYX1JTU19UQUJMRV9TSVpFCSgxIDw8IEVOQV9SWF9SU1NfVEFCTEVfTE9HX1NJWkUpCisKKyNkZWZpbmUgRU5BX0hBU0hfS0VZX1NJWkUJNDAKKworLyogVGhlIG51bWJlciBvZiB0eCBwYWNrZXQgY29tcGxldGlvbnMgdGhhdCB3aWxsIGJlIGhhbmRsZWQgZWFjaCBOQVBJIHBvbGwKKyAqIGN5Y2xlIGlzIHJpbmdfc2l6ZSAvIEVOQV9UWF9QT0xMX0JVREdFVF9ESVZJREVSLgorICovCisjZGVmaW5lIEVOQV9UWF9QT0xMX0JVREdFVF9ESVZJREVSCTQKKworLyogUmVmaWxsIFJ4IHF1ZXVlIHdoZW4gbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXNjcmlwdG9ycyBpcyBiZWxvdworICogUVVFVUVfU0laRSAvIEVOQV9SWF9SRUZJTExfVEhSRVNIX0RJVklERVIKKyAqLworI2RlZmluZSBFTkFfUlhfUkVGSUxMX1RIUkVTSF9ESVZJREVSCTgKKworLyogTnVtYmVyIG9mIHF1ZXVlcyB0byBjaGVjayBmb3IgbWlzc2luZyBxdWV1ZXMgcGVyIHRpbWVyIHNlcnZpY2UgKi8KKyNkZWZpbmUgRU5BX01PTklUT1JFRF9UWF9RVUVVRVMJNAorLyogTWF4IHRpbWVvdXQgcGFja2V0cyBiZWZvcmUgZGV2aWNlIHJlc2V0ICovCisjZGVmaW5lIE1BWF9OVU1fT0ZfVElNRU9VVEVEX1BBQ0tFVFMgMzIKKworI2RlZmluZSBFTkFfVFhfUklOR19JRFhfTkVYVChpZHgsIHJpbmdfc2l6ZSkgKCgoaWR4KSArIDEpICYgKChyaW5nX3NpemUpIC0gMSkpCisKKyNkZWZpbmUgRU5BX1JYX1JJTkdfSURYX05FWFQoaWR4LCByaW5nX3NpemUpICgoKGlkeCkgKyAxKSAmICgocmluZ19zaXplKSAtIDEpKQorI2RlZmluZSBFTkFfUlhfUklOR19JRFhfQUREKGlkeCwgbiwgcmluZ19zaXplKSBcCisJKCgoaWR4KSArIChuKSkgJiAoKHJpbmdfc2l6ZSkgLSAxKSkKKworI2RlZmluZSBFTkFfSU9fVFhRX0lEWChxKQkoMiAqIChxKSkKKyNkZWZpbmUgRU5BX0lPX1JYUV9JRFgocSkJKDIgKiAocSkgKyAxKQorCisjZGVmaW5lIEVOQV9NR01OVF9JUlFfSURYCQkwCisjZGVmaW5lIEVOQV9JT19JUlFfRklSU1RfSURYCQkxCisjZGVmaW5lIEVOQV9JT19JUlFfSURYKHEpCQkoRU5BX0lPX0lSUV9GSVJTVF9JRFggKyAocSkpCisKKy8qIEVOQSBkZXZpY2Ugc2hvdWxkIHNlbmQga2VlcCBhbGl2ZSBtc2cgZXZlcnkgMSBzZWMuCisgKiBXZSB3YWl0IGZvciAzIHNlYyBqdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUuCisgKi8KKyNkZWZpbmUgRU5BX0RFVklDRV9LQUxJVkVfVElNRU9VVAkoMyAqIEhaKQorCisjZGVmaW5lIEVOQV9NTUlPX0RJU0FCTEVfUkVHX1JFQUQJQklUKDApCisKK3N0cnVjdCBlbmFfaXJxIHsKKwlpcnFfaGFuZGxlcl90IGhhbmRsZXI7CisJdm9pZCAqZGF0YTsKKwlpbnQgY3B1OworCXUzMiB2ZWN0b3I7CisJY3B1bWFza190IGFmZmluaXR5X2hpbnRfbWFzazsKKwljaGFyIG5hbWVbRU5BX0lSUU5BTUVfU0laRV07Cit9OworCitzdHJ1Y3QgZW5hX25hcGkgeworCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwlzdHJ1Y3QgZW5hX3JpbmcgKnR4X3Jpbmc7CisJc3RydWN0IGVuYV9yaW5nICpyeF9yaW5nOworCXUzMiBxaWQ7Cit9OworCitzdHJ1Y3QgZW5hX3R4X2J1ZmZlciB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkvKiBudW0gb2YgZW5hIGRlc2MgZm9yIHRoaXMgc3BlY2lmaWMgc2tiCisJICogKGluY2x1ZGVzIGRhdGEgZGVzYyBhbmQgbWV0YWRhdGEgZGVzYykKKwkgKi8KKwl1MzIgdHhfZGVzY3M7CisJLyogbnVtIG9mIGJ1ZmZlcnMgdXNlZCBieSB0aGlzIHNrYiAqLworCXUzMiBudW1fb2ZfYnVmczsKKwkvKiBTYXZlIHRoZSBsYXN0IGppZmZpZXMgdG8gZGV0ZWN0IG1pc3NpbmcgdHggcGFja2V0cyAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOworCXN0cnVjdCBlbmFfY29tX2J1ZiBidWZzW0VOQV9QS1RfTUFYX0JVRlNdOworfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CisKK3N0cnVjdCBlbmFfcnhfYnVmZmVyIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBwYWdlICpwYWdlOworCXUzMiBwYWdlX29mZnNldDsKKwlzdHJ1Y3QgZW5hX2NvbV9idWYgZW5hX2J1ZjsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkOworCitzdHJ1Y3QgZW5hX3N0YXRzX3R4IHsKKwl1NjQgY250OworCXU2NCBieXRlczsKKwl1NjQgcXVldWVfc3RvcDsKKwl1NjQgcHJlcGFyZV9jdHhfZXJyOworCXU2NCBxdWV1ZV93YWtldXA7CisJdTY0IGRtYV9tYXBwaW5nX2VycjsKKwl1NjQgbGluZWFyaXplOworCXU2NCBsaW5lYXJpemVfZmFpbGVkOworCXU2NCBuYXBpX2NvbXA7CisJdTY0IHR4X3BvbGw7CisJdTY0IGRvb3JiZWxsczsKKwl1NjQgbWlzc2luZ190eF9jb21wOworCXU2NCBiYWRfcmVxX2lkOworfTsKKworc3RydWN0IGVuYV9zdGF0c19yeCB7CisJdTY0IGNudDsKKwl1NjQgYnl0ZXM7CisJdTY0IHJlZmlsX3BhcnRpYWw7CisJdTY0IGJhZF9jc3VtOworCXU2NCBwYWdlX2FsbG9jX2ZhaWw7CisJdTY0IHNrYl9hbGxvY19mYWlsOworCXU2NCBkbWFfbWFwcGluZ19lcnI7CisJdTY0IGJhZF9kZXNjX251bTsKKwl1NjQgcnhfY29weWJyZWFrX3BrdDsKK307CisKK3N0cnVjdCBlbmFfcmluZyB7CisJLyogSG9sZHMgdGhlIGVtcHR5IHJlcXVlc3RzIGZvciBUWCBvdXQgb2Ygb3JkZXIgY29tcGxldGlvbnMgKi8KKwl1MTYgKmZyZWVfdHhfaWRzOworCXVuaW9uIHsKKwkJc3RydWN0IGVuYV90eF9idWZmZXIgKnR4X2J1ZmZlcl9pbmZvOworCQlzdHJ1Y3QgZW5hX3J4X2J1ZmZlciAqcnhfYnVmZmVyX2luZm87CisJfTsKKworCS8qIGNhY2hlIHB0ciB0byBhdm9pZCB1c2luZyB0aGUgYWRhcHRlciAqLworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgZW5hX2NvbV9kZXYgKmVuYV9kZXY7CisJc3RydWN0IGVuYV9hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBlbmFfY29tX2lvX2NxICplbmFfY29tX2lvX2NxOworCXN0cnVjdCBlbmFfY29tX2lvX3NxICplbmFfY29tX2lvX3NxOworCisJdTE2IG5leHRfdG9fdXNlOworCXUxNiBuZXh0X3RvX2NsZWFuOworCXUxNiByeF9jb3B5YnJlYWs7CisJdTE2IHFpZDsKKwl1MTYgbXR1OworCXUxNiBzZ2xfc2l6ZTsKKworCS8qIFRoZSBtYXhpbXVtIGhlYWRlciBsZW5ndGggdGhlIGRldmljZSBjYW4gaGFuZGxlICovCisJdTggdHhfbWF4X2hlYWRlcl9zaXplOworCisJLyogY3B1IGZvciBUUEggKi8KKwlpbnQgY3B1OworCSAvKiBudW1iZXIgb2YgdHgvcnhfYnVmZmVyX2luZm8ncyBlbnRyaWVzICovCisJaW50IHJpbmdfc2l6ZTsKKworCWVudW0gZW5hX2FkbWluX3BsYWNlbWVudF9wb2xpY3lfdHlwZSB0eF9tZW1fcXVldWVfdHlwZTsKKworCXN0cnVjdCBlbmFfY29tX3J4X2J1Zl9pbmZvIGVuYV9idWZzW0VOQV9QS1RfTUFYX0JVRlNdOworCXUzMiAgc21vb3RoZWRfaW50ZXJ2YWw7CisJdTMyICBwZXJfbmFwaV9wYWNrZXRzOworCXUzMiAgcGVyX25hcGlfYnl0ZXM7CisJZW51bSBlbmFfaW50cl9tb2Rlcl9sZXZlbCBtb2Rlcl90YmxfaWR4OworCXN0cnVjdCB1NjRfc3RhdHNfc3luYyBzeW5jcDsKKwl1bmlvbiB7CisJCXN0cnVjdCBlbmFfc3RhdHNfdHggdHhfc3RhdHM7CisJCXN0cnVjdCBlbmFfc3RhdHNfcnggcnhfc3RhdHM7CisJfTsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkOworCitzdHJ1Y3QgZW5hX3N0YXRzX2RldiB7CisJdTY0IHR4X3RpbWVvdXQ7CisJdTY0IGlvX3N1c3BlbmQ7CisJdTY0IGlvX3Jlc3VtZTsKKwl1NjQgd2RfZXhwaXJlZDsKKwl1NjQgaW50ZXJmYWNlX3VwOworCXU2NCBpbnRlcmZhY2VfZG93bjsKKwl1NjQgYWRtaW5fcV9wYXVzZTsKK307CisKK2VudW0gZW5hX2ZsYWdzX3QgeworCUVOQV9GTEFHX0RFVklDRV9SVU5OSU5HLAorCUVOQV9GTEFHX0RFVl9VUCwKKwlFTkFfRkxBR19MSU5LX1VQLAorCUVOQV9GTEFHX01TSVhfRU5BQkxFRCwKKwlFTkFfRkxBR19UUklHR0VSX1JFU0VUCit9OworCisvKiBhZGFwdGVyIHNwZWNpZmljIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBlbmFfYWRhcHRlciB7CisJc3RydWN0IGVuYV9jb21fZGV2ICplbmFfZGV2OworCS8qIE9TIGRlZmluZWQgc3RydWN0cyAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwkvKiByeCBwYWNrZXRzIHRoYXQgc2hvcnRlciB0aGF0IHRoaXMgbGVuIHdpbGwgYmUgY29waWVkIHRvIHRoZSBza2IKKwkgKiBoZWFkZXIKKwkgKi8KKwl1MzIgcnhfY29weWJyZWFrOworCXUzMiBtYXhfbXR1OworCisJaW50IG51bV9xdWV1ZXM7CisKKwlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeF9lbnRyaWVzOworCWludCBtc2l4X3ZlY3M7CisKKwl1MzIgdHhfdXNlY3MsIHJ4X3VzZWNzOyAvKiBpbnRlcnJ1cHQgbW9kZXJhdGlvbiAqLworCXUzMiB0eF9mcmFtZXMsIHJ4X2ZyYW1lczsgLyogaW50ZXJydXB0IG1vZGVyYXRpb24gKi8KKworCXUzMiB0eF9yaW5nX3NpemU7CisJdTMyIHJ4X3Jpbmdfc2l6ZTsKKworCXUzMiBtc2dfZW5hYmxlOworCisJdTE2IG1heF90eF9zZ2xfc2l6ZTsKKwl1MTYgbWF4X3J4X3NnbF9zaXplOworCisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOworCisJY2hhciBuYW1lW0VOQV9OQU1FX01BWF9MRU5dOworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkvKiBUWCAqLworCXN0cnVjdCBlbmFfcmluZyB0eF9yaW5nW0VOQV9NQVhfTlVNX0lPX1FVRVVFU10KKwkJX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKKworCS8qIFJYICovCisJc3RydWN0IGVuYV9yaW5nIHJ4X3JpbmdbRU5BX01BWF9OVU1fSU9fUVVFVUVTXQorCQlfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOworCisJc3RydWN0IGVuYV9uYXBpIGVuYV9uYXBpW0VOQV9NQVhfTlVNX0lPX1FVRVVFU107CisKKwlzdHJ1Y3QgZW5hX2lycSBpcnFfdGJsW0VOQV9NQVhfTVNJWF9WRUMoRU5BX01BWF9OVU1fSU9fUVVFVUVTKV07CisKKwkvKiB0aW1lciBzZXJ2aWNlICovCisJc3RydWN0IHdvcmtfc3RydWN0IHJlc2V0X3Rhc2s7CisJc3RydWN0IHdvcmtfc3RydWN0IHN1c3BlbmRfaW9fdGFzazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzdW1lX2lvX3Rhc2s7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXJfc2VydmljZTsKKworCWJvb2wgd2Rfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBsYXN0X2tlZXBfYWxpdmVfamlmZmllczsKKworCXN0cnVjdCB1NjRfc3RhdHNfc3luYyBzeW5jcDsKKwlzdHJ1Y3QgZW5hX3N0YXRzX2RldiBkZXZfc3RhdHM7CisKKwkvKiBsYXN0IHF1ZXVlIGluZGV4IHRoYXQgd2FzIGNoZWNrZWQgZm9yIHVuY29tcGxldGVkIHR4IHBhY2tldHMgKi8KKwl1MzIgbGFzdF9tb25pdG9yZWRfdHhfcWlkOworfTsKKwordm9pZCBlbmFfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworCit2b2lkIGVuYV9kdW1wX3N0YXRzX3RvX2RtZXNnKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlcik7CisKK3ZvaWQgZW5hX2R1bXBfc3RhdHNfdG9fYnVmKHN0cnVjdCBlbmFfYWRhcHRlciAqYWRhcHRlciwgdTggKmJ1Zik7CisKK2ludCBlbmFfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHNzZXQpOworCisjZW5kaWYgLyogIShFTkFfSCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX3BjaV9pZF90YmwuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX3BjaV9pZF90YmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODBkMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1hem9uL2VuYS9lbmFfcGNpX2lkX3RibC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgRU5BX1BDSV9JRF9UQkxfSF8KKyNkZWZpbmUgRU5BX1BDSV9JRF9UQkxfSF8KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0FNQVpPTgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FNQVpPTiAweDFkMGYKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZfSURfRU5BX1BGCisjZGVmaW5lIFBDSV9ERVZfSURfRU5BX1BGCTB4MGVjMgorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVl9JRF9FTkFfTExRX1BGCisjZGVmaW5lIFBDSV9ERVZfSURfRU5BX0xMUV9QRgkweDFlYzIKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZfSURfRU5BX1ZGCisjZGVmaW5lIFBDSV9ERVZfSURfRU5BX1ZGCTB4ZWMyMAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVl9JRF9FTkFfTExRX1ZGCisjZGVmaW5lIFBDSV9ERVZfSURfRU5BX0xMUV9WRgkweGVjMjEKKyNlbmRpZgorCisjZGVmaW5lIEVOQV9QQ0lfSURfVEFCTEVfRU5UUlkoZGV2aWQpIFwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNQVpPTiwgZGV2aWQpfSwKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGVuYV9wY2lfdGJsW10gPSB7CisJRU5BX1BDSV9JRF9UQUJMRV9FTlRSWShQQ0lfREVWX0lEX0VOQV9QRikKKwlFTkFfUENJX0lEX1RBQkxFX0VOVFJZKFBDSV9ERVZfSURfRU5BX0xMUV9QRikKKwlFTkFfUENJX0lEX1RBQkxFX0VOVFJZKFBDSV9ERVZfSURfRU5BX1ZGKQorCUVOQV9QQ0lfSURfVEFCTEVfRU5UUlkoUENJX0RFVl9JRF9FTkFfTExRX1ZGKQorCXsgfQorfTsKKworI2VuZGlmIC8qIEVOQV9QQ0lfSURfVEJMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9yZWdzX2RlZnMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtYXpvbi9lbmEvZW5hX3JlZ3NfZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDk3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWF6b24vZW5hL2VuYV9yZWdzX2RlZnMuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IC0gMjAxNiBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisjaWZuZGVmIF9FTkFfUkVHU19IXworI2RlZmluZSBfRU5BX1JFR1NfSF8KKworLyogZW5hX3JlZ2lzdGVycyBvZmZzZXRzICovCisjZGVmaW5lIEVOQV9SRUdTX1ZFUlNJT05fT0ZGCQkweDAKKyNkZWZpbmUgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX09GRgkJMHg0CisjZGVmaW5lIEVOQV9SRUdTX0NBUFNfT0ZGCQkweDgKKyNkZWZpbmUgRU5BX1JFR1NfQ0FQU19FWFRfT0ZGCQkweGMKKyNkZWZpbmUgRU5BX1JFR1NfQVFfQkFTRV9MT19PRkYJCTB4MTAKKyNkZWZpbmUgRU5BX1JFR1NfQVFfQkFTRV9ISV9PRkYJCTB4MTQKKyNkZWZpbmUgRU5BX1JFR1NfQVFfQ0FQU19PRkYJCTB4MTgKKyNkZWZpbmUgRU5BX1JFR1NfQUNRX0JBU0VfTE9fT0ZGCQkweDIwCisjZGVmaW5lIEVOQV9SRUdTX0FDUV9CQVNFX0hJX09GRgkJMHgyNAorI2RlZmluZSBFTkFfUkVHU19BQ1FfQ0FQU19PRkYJCTB4MjgKKyNkZWZpbmUgRU5BX1JFR1NfQVFfREJfT0ZGCQkweDJjCisjZGVmaW5lIEVOQV9SRUdTX0FDUV9UQUlMX09GRgkJMHgzMAorI2RlZmluZSBFTkFfUkVHU19BRU5RX0NBUFNfT0ZGCQkweDM0CisjZGVmaW5lIEVOQV9SRUdTX0FFTlFfQkFTRV9MT19PRkYJCTB4MzgKKyNkZWZpbmUgRU5BX1JFR1NfQUVOUV9CQVNFX0hJX09GRgkJMHgzYworI2RlZmluZSBFTkFfUkVHU19BRU5RX0hFQURfREJfT0ZGCQkweDQwCisjZGVmaW5lIEVOQV9SRUdTX0FFTlFfVEFJTF9PRkYJCTB4NDQKKyNkZWZpbmUgRU5BX1JFR1NfSU5UUl9NQVNLX09GRgkJMHg0YworI2RlZmluZSBFTkFfUkVHU19ERVZfQ1RMX09GRgkJMHg1NAorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX09GRgkJMHg1OAorI2RlZmluZSBFTkFfUkVHU19NTUlPX1JFR19SRUFEX09GRgkJMHg1YworI2RlZmluZSBFTkFfUkVHU19NTUlPX1JFU1BfTE9fT0ZGCQkweDYwCisjZGVmaW5lIEVOQV9SRUdTX01NSU9fUkVTUF9ISV9PRkYJCTB4NjQKKyNkZWZpbmUgRU5BX1JFR1NfUlNTX0lORF9FTlRSWV9VUERBVEVfT0ZGCQkweDY4CisKKy8qIHZlcnNpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5BX1JFR1NfVkVSU0lPTl9NSU5PUl9WRVJTSU9OX01BU0sJCTB4ZmYKKyNkZWZpbmUgRU5BX1JFR1NfVkVSU0lPTl9NQUpPUl9WRVJTSU9OX1NISUZUCQk4CisjZGVmaW5lIEVOQV9SRUdTX1ZFUlNJT05fTUFKT1JfVkVSU0lPTl9NQVNLCQkweGZmMDAKKworLyogY29udHJvbGxlcl92ZXJzaW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9TVUJNSU5PUl9WRVJTSU9OX01BU0sJCTB4ZmYKKyNkZWZpbmUgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01JTk9SX1ZFUlNJT05fU0hJRlQJCTgKKyNkZWZpbmUgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX01JTk9SX1ZFUlNJT05fTUFTSwkJMHhmZjAwCisjZGVmaW5lIEVOQV9SRUdTX0NPTlRST0xMRVJfVkVSU0lPTl9NQUpPUl9WRVJTSU9OX1NISUZUCQkxNgorI2RlZmluZSBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fTUFKT1JfVkVSU0lPTl9NQVNLCQkweGZmMDAwMAorI2RlZmluZSBFTkFfUkVHU19DT05UUk9MTEVSX1ZFUlNJT05fSU1QTF9JRF9TSElGVAkJMjQKKyNkZWZpbmUgRU5BX1JFR1NfQ09OVFJPTExFUl9WRVJTSU9OX0lNUExfSURfTUFTSwkJMHhmZjAwMDAwMAorCisvKiBjYXBzIHJlZ2lzdGVyICovCisjZGVmaW5lIEVOQV9SRUdTX0NBUFNfQ09OVElHVU9VU19RVUVVRV9SRVFVSVJFRF9NQVNLCQkweDEKKyNkZWZpbmUgRU5BX1JFR1NfQ0FQU19SRVNFVF9USU1FT1VUX1NISUZUCQkxCisjZGVmaW5lIEVOQV9SRUdTX0NBUFNfUkVTRVRfVElNRU9VVF9NQVNLCQkweDNlCisjZGVmaW5lIEVOQV9SRUdTX0NBUFNfRE1BX0FERFJfV0lEVEhfU0hJRlQJCTgKKyNkZWZpbmUgRU5BX1JFR1NfQ0FQU19ETUFfQUREUl9XSURUSF9NQVNLCQkweGZmMDAKKworLyogYXFfY2FwcyByZWdpc3RlciAqLworI2RlZmluZSBFTkFfUkVHU19BUV9DQVBTX0FRX0RFUFRIX01BU0sJCTB4ZmZmZgorI2RlZmluZSBFTkFfUkVHU19BUV9DQVBTX0FRX0VOVFJZX1NJWkVfU0hJRlQJCTE2CisjZGVmaW5lIEVOQV9SRUdTX0FRX0NBUFNfQVFfRU5UUllfU0laRV9NQVNLCQkweGZmZmYwMDAwCisKKy8qIGFjcV9jYXBzIHJlZ2lzdGVyICovCisjZGVmaW5lIEVOQV9SRUdTX0FDUV9DQVBTX0FDUV9ERVBUSF9NQVNLCQkweGZmZmYKKyNkZWZpbmUgRU5BX1JFR1NfQUNRX0NBUFNfQUNRX0VOVFJZX1NJWkVfU0hJRlQJCTE2CisjZGVmaW5lIEVOQV9SRUdTX0FDUV9DQVBTX0FDUV9FTlRSWV9TSVpFX01BU0sJCTB4ZmZmZjAwMDAKKworLyogYWVucV9jYXBzIHJlZ2lzdGVyICovCisjZGVmaW5lIEVOQV9SRUdTX0FFTlFfQ0FQU19BRU5RX0RFUFRIX01BU0sJCTB4ZmZmZgorI2RlZmluZSBFTkFfUkVHU19BRU5RX0NBUFNfQUVOUV9FTlRSWV9TSVpFX1NISUZUCQkxNgorI2RlZmluZSBFTkFfUkVHU19BRU5RX0NBUFNfQUVOUV9FTlRSWV9TSVpFX01BU0sJCTB4ZmZmZjAwMDAKKworLyogZGV2X2N0bCByZWdpc3RlciAqLworI2RlZmluZSBFTkFfUkVHU19ERVZfQ1RMX0RFVl9SRVNFVF9NQVNLCQkweDEKKyNkZWZpbmUgRU5BX1JFR1NfREVWX0NUTF9BUV9SRVNUQVJUX1NISUZUCQkxCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9DVExfQVFfUkVTVEFSVF9NQVNLCQkweDIKKyNkZWZpbmUgRU5BX1JFR1NfREVWX0NUTF9RVUlFU0NFTlRfU0hJRlQJCTIKKyNkZWZpbmUgRU5BX1JFR1NfREVWX0NUTF9RVUlFU0NFTlRfTUFTSwkJMHg0CisjZGVmaW5lIEVOQV9SRUdTX0RFVl9DVExfSU9fUkVTVU1FX1NISUZUCQkzCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9DVExfSU9fUkVTVU1FX01BU0sJCTB4OAorCisvKiBkZXZfc3RzIHJlZ2lzdGVyICovCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfUkVBRFlfTUFTSwkJMHgxCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfQVFfUkVTVEFSVF9JTl9QUk9HUkVTU19TSElGVAkJMQorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX0FRX1JFU1RBUlRfSU5fUFJPR1JFU1NfTUFTSwkJMHgyCisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfQVFfUkVTVEFSVF9GSU5JU0hFRF9TSElGVAkJMgorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX0FRX1JFU1RBUlRfRklOSVNIRURfTUFTSwkJMHg0CisjZGVmaW5lIEVOQV9SRUdTX0RFVl9TVFNfUkVTRVRfSU5fUFJPR1JFU1NfU0hJRlQJCTMKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19SRVNFVF9JTl9QUk9HUkVTU19NQVNLCQkweDgKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19SRVNFVF9GSU5JU0hFRF9TSElGVAkJNAorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX1JFU0VUX0ZJTklTSEVEX01BU0sJCTB4MTAKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19GQVRBTF9FUlJPUl9TSElGVAkJNQorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX0ZBVEFMX0VSUk9SX01BU0sJCTB4MjAKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19RVUlFU0NFTlRfU1RBVEVfSU5fUFJPR1JFU1NfU0hJRlQJCTYKKyNkZWZpbmUgRU5BX1JFR1NfREVWX1NUU19RVUlFU0NFTlRfU1RBVEVfSU5fUFJPR1JFU1NfTUFTSwkJMHg0MAorI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX1FVSUVTQ0VOVF9TVEFURV9BQ0hJRVZFRF9TSElGVAkJNworI2RlZmluZSBFTkFfUkVHU19ERVZfU1RTX1FVSUVTQ0VOVF9TVEFURV9BQ0hJRVZFRF9NQVNLCQkweDgwCisKKy8qIG1taW9fcmVnX3JlYWQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5BX1JFR1NfTU1JT19SRUdfUkVBRF9SRVFfSURfTUFTSwkJMHhmZmZmCisjZGVmaW5lIEVOQV9SRUdTX01NSU9fUkVHX1JFQURfUkVHX09GRl9TSElGVAkJMTYKKyNkZWZpbmUgRU5BX1JFR1NfTU1JT19SRUdfUkVBRF9SRUdfT0ZGX01BU0sJCTB4ZmZmZjAwMDAKKworLyogcnNzX2luZF9lbnRyeV91cGRhdGUgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRU5BX1JFR1NfUlNTX0lORF9FTlRSWV9VUERBVEVfSU5ERVhfTUFTSwkJMHhmZmZmCisjZGVmaW5lIEVOQV9SRUdTX1JTU19JTkRfRU5UUllfVVBEQVRFX0NRX0lEWF9TSElGVAkJMTYKKyNkZWZpbmUgRU5BX1JFR1NfUlNTX0lORF9FTlRSWV9VUERBVEVfQ1FfSURYX01BU0sJCTB4ZmZmZjAwMDAKKworI2VuZGlmIC8qX0VOQV9SRUdTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvNzk5MC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kLzc5OTAuYwppbmRleCBkY2YyYTFmLi5kYzU3ZjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvNzk5MC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC83OTkwLmMKQEAgLTQ1LDE0ICs0NSwxNCBAQAogI2RlZmluZSBXUklURVJEUChscCwgeCkJb3V0X2JlMTYobHAtPmJhc2UgKyBMQU5DRV9SRFAsICh4KSkKICNkZWZpbmUgUkVBRFJEUChscCkJaW5fYmUxNihscC0+YmFzZSArIExBTkNFX1JEUCkKIAotI2lmIGRlZmluZWQoQ09ORklHX0hQTEFOQ0UpIHx8IGRlZmluZWQoQ09ORklHX0hQTEFOQ0VfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0hQTEFOQ0UpCiAjaW5jbHVkZSAiaHBsYW5jZS5oIgogCiAjdW5kZWYgV1JJVEVSQVAKICN1bmRlZiBXUklURVJEUAogI3VuZGVmIFJFQURSRFAKIAotI2lmIGRlZmluZWQoQ09ORklHX01WTUUxNDdfTkVUKSB8fCBkZWZpbmVkKENPTkZJR19NVk1FMTQ3X05FVF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTVZNRTE0N19ORVQpCiAKIC8qIExvc3NhZ2UgRmFjdG9yIE5pbmUsIE1yIFN1bHUuICovCiAjZGVmaW5lIFdSSVRFUkFQKGxwLCB4KQkobHAtPndyaXRlcmFwKGxwLCB4KSkKQEAgLTg2LDcgKzg2LDcgQEAKIH0KIAogI2VuZGlmCi0jZW5kaWYgLyogQ09ORklHX0hQTEFOQ0UgfHwgQ09ORklHX0hQTEFOQ0VfTU9EVUxFICovCisjZW5kaWYgLyogSVNfRU5BQkxFRChDT05GSUdfSFBMQU5DRSkgKi8KIAogLyogZGVidWdnaW5nIG91dHB1dCBtYWNyb3MsIHZhcmlvdXMgZmxhdm91cnMgKi8KIC8qICNkZWZpbmUgVEVTVF9ISVRTICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYW1kODExMWUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hbWQ4MTExZS5jCmluZGV4IDk0OTYwMDUuLmY5MmNjOTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYW1kODExMWUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYW1kODExMWUuYwpAQCAtODksNyArODksNyBAQAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVkxBTl84MDIxUSkKICNkZWZpbmUgQU1EODExMUVfVkxBTl9UQUdfVVNFRCAxCiAjZWxzZQogI2RlZmluZSBBTUQ4MTExRV9WTEFOX1RBR19VU0VEIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZHJ2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWRydi5jCmluZGV4IGE5YjI3MDkuLjdmOTIxNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1kcnYuYwpAQCAtMTcwOCw5ICsxNzA4LDkgQEAKIAkubmRvX3NldF9mZWF0dXJlcwk9IHhnYmVfc2V0X2ZlYXR1cmVzLAogfTsKIAotc3RydWN0IG5ldF9kZXZpY2Vfb3BzICp4Z2JlX2dldF9uZXRkZXZfb3BzKHZvaWQpCitjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKnhnYmVfZ2V0X25ldGRldl9vcHModm9pZCkKIHsKLQlyZXR1cm4gKHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqKSZ4Z2JlX25ldGRldl9vcHM7CisJcmV0dXJuICZ4Z2JlX25ldGRldl9vcHM7CiB9CiAKIHN0YXRpYyB2b2lkIHhnYmVfcnhfcmVmcmVzaChzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWV0aHRvb2wuYwppbmRleCAxMWQ5ZjBjLi40MDA3YjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWV0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWV0aHRvb2wuYwpAQCAtNjIzLDcgKzYyMyw3IEBACiAJLmdldF90c19pbmZvID0geGdiZV9nZXRfdHNfaW5mbywKIH07CiAKLXN0cnVjdCBldGh0b29sX29wcyAqeGdiZV9nZXRfZXRodG9vbF9vcHModm9pZCkKK2NvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqeGdiZV9nZXRfZXRodG9vbF9vcHModm9pZCkKIHsKLQlyZXR1cm4gKHN0cnVjdCBldGh0b29sX29wcyAqKSZ4Z2JlX2V0aHRvb2xfb3BzOworCXJldHVybiAmeGdiZV9ldGh0b29sX29wczsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1tYWluLmMKaW5kZXggM2VlZTMyMC4uOWRlMDc4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1tYWluLmMKQEAgLTg2MSw5ICs4NjEsMTUgQEAKIAlwZGF0YS0+bHBtX2N0cmwgJj0gfk1ESU9fQ1RSTDFfTFBPV0VSOwogCVhNRElPX1dSSVRFKHBkYXRhLCBNRElPX01NRF9QQ1MsIE1ESU9fQ1RSTDEsIHBkYXRhLT5scG1fY3RybCk7CiAKLQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKIAkJcmV0ID0geGdiZV9wb3dlcnVwKG5ldGRldiwgWEdNQUNfRFJJVkVSX0NPTlRFWFQpOwogCisJCS8qIFNjaGVkdWxlIGEgcmVzdGFydCBpbiBjYXNlIHRoZSBsaW5rIG9yIHBoeSBzdGF0ZSBjaGFuZ2VkCisJCSAqIHdoaWxlIHdlIHdlcmUgcG93ZXJlZCBkb3duLgorCQkgKi8KKwkJc2NoZWR1bGVfd29yaygmcGRhdGEtPnJlc3RhcnRfd29yayk7CisJfQorCiAJREJHUFIoIjwtLXhnYmVfcmVzdW1lXG4iKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLmgKaW5kZXggOThkOWQ2My4uNWRkMTdkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUuaApAQCAtOTU2LDggKzk1Niw5IEBACiB2b2lkIHhnYmVfaW5pdF9mdW5jdGlvbl9wdHJzX2RldihzdHJ1Y3QgeGdiZV9od19pZiAqKTsKIHZvaWQgeGdiZV9pbml0X2Z1bmN0aW9uX3B0cnNfcGh5KHN0cnVjdCB4Z2JlX3BoeV9pZiAqKTsKIHZvaWQgeGdiZV9pbml0X2Z1bmN0aW9uX3B0cnNfZGVzYyhzdHJ1Y3QgeGdiZV9kZXNjX2lmICopOwotc3RydWN0IG5ldF9kZXZpY2Vfb3BzICp4Z2JlX2dldF9uZXRkZXZfb3BzKHZvaWQpOwotc3RydWN0IGV0aHRvb2xfb3BzICp4Z2JlX2dldF9ldGh0b29sX29wcyh2b2lkKTsKK2NvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqeGdiZV9nZXRfbmV0ZGV2X29wcyh2b2lkKTsKK2NvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqeGdiZV9nZXRfZXRodG9vbF9vcHModm9pZCk7CisKICNpZmRlZiBDT05GSUdfQU1EX1hHQkVfRENCCiBjb25zdCBzdHJ1Y3QgZGNibmxfcnRubF9vcHMgKnhnYmVfZ2V0X2RjYm5sX29wcyh2b2lkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUvS2NvbmZpZwppbmRleCAzMDBlM2I1Li5hZmNjYjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUvS2NvbmZpZwpAQCAtNCw2ICs0LDcgQEAKIAlkZXBlbmRzIG9uIEFSQ0hfWEdFTkUgfHwgQ09NUElMRV9URVNUCiAJc2VsZWN0IFBIWUxJQgogCXNlbGVjdCBNRElPX1hHRU5FCisJc2VsZWN0IEdQSU9MSUIKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBFdGhlcm5ldCBkcml2ZXIgZm9yIHRoZSBvbi1jaGlwIGV0aGVybmV0IGludGVyZmFjZSBvbiB0aGUKIAkgIEFQTSBYLUdlbmUgU29DLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfY2xlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9jbGUuYwppbmRleCA0NzJjMGZiLi4yM2Q3MmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9jbGUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9jbGUuYwpAQCAtMzIsMTIgKzMyLDE5IEBACiAJCVNFVF9WQUwoU0JfSERSTEVOLCBsZW4pOwogfQogCi1zdGF0aWMgdm9pZCB4Z2VuZV9jbGVfaWR0X3RvX2h3KHUzMiBkc3RxaWQsIHUzMiBmcHNlbCwKK3N0YXRpYyB2b2lkIHhnZW5lX2NsZV9pZHRfdG9faHcoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhLAorCQkJCXUzMiBkc3RxaWQsIHUzMiBmcHNlbCwKIAkJCQl1MzIgbmZwc2VsLCB1MzIgKmlkdF9yZWcpCiB7Ci0JKmlkdF9yZWcgPSAgU0VUX1ZBTChJRFRfRFNUUUlELCBkc3RxaWQpIHwKLQkJICAgIFNFVF9WQUwoSURUX0ZQU0VMLCBmcHNlbCkgfAotCQkgICAgU0VUX1ZBTChJRFRfTkZQU0VMLCBuZnBzZWwpOworCWlmIChwZGF0YS0+ZW5ldF9pZCA9PSBYR0VORV9FTkVUMSkgeworCQkqaWR0X3JlZyA9IFNFVF9WQUwoSURUX0RTVFFJRCwgZHN0cWlkKSB8CisJCQkgICBTRVRfVkFMKElEVF9GUFNFTDEsIGZwc2VsKSAgfAorCQkJICAgU0VUX1ZBTChJRFRfTkZQU0VMMSwgbmZwc2VsKTsKKwl9IGVsc2UgeworCQkqaWR0X3JlZyA9IFNFVF9WQUwoSURUX0RTVFFJRCwgZHN0cWlkKSB8CisJCQkgICBTRVRfVkFMKElEVF9GUFNFTCwgZnBzZWwpICAgfAorCQkJICAgU0VUX1ZBTChJRFRfTkZQU0VMLCBuZnBzZWwpOworCX0KIH0KIAogc3RhdGljIHZvaWQgeGdlbmVfY2xlX2RicHRyX3RvX2h3KHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSwKQEAgLTM0NCw3ICszNTEsNyBAQAogCQluZnBzZWwgPSAwOwogCQlpZHRfcmVnID0gMDsKIAotCQl4Z2VuZV9jbGVfaWR0X3RvX2h3KGRzdHFpZCwgZnBzZWwsIG5mcHNlbCwgJmlkdF9yZWcpOworCQl4Z2VuZV9jbGVfaWR0X3RvX2h3KHBkYXRhLCBkc3RxaWQsIGZwc2VsLCBuZnBzZWwsICZpZHRfcmVnKTsKIAkJcmV0ID0geGdlbmVfY2xlX2RyYW1fd3IoJnBkYXRhLT5jbGUsICZpZHRfcmVnLCAxLCBpLAogCQkJCQlSU1NfSURULCBDTEVfQ01EX1dSKTsKIAkJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2NsZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfY2xlLmgKaW5kZXggMzNjNWY2Yi4uOWFjOWY4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfY2xlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfY2xlLmgKQEAgLTE5Niw5ICsxOTYsMTMgQEAKICNkZWZpbmUgSURUX0RTVFFJRF9QT1MJCTAKICNkZWZpbmUgSURUX0RTVFFJRF9MRU4JCTEyCiAjZGVmaW5lIElEVF9GUFNFTF9QT1MJCTEyCi0jZGVmaW5lIElEVF9GUFNFTF9MRU4JCTQKLSNkZWZpbmUgSURUX05GUFNFTF9QT1MJCTE2Ci0jZGVmaW5lIElEVF9ORlBTRUxfTEVOCQk0CisjZGVmaW5lIElEVF9GUFNFTF9MRU4JCTUKKyNkZWZpbmUgSURUX05GUFNFTF9QT1MJCTE3CisjZGVmaW5lIElEVF9ORlBTRUxfTEVOCQk1CisjZGVmaW5lIElEVF9GUFNFTDFfUE9TCQkxMgorI2RlZmluZSBJRFRfRlBTRUwxX0xFTgkJNAorI2RlZmluZSBJRFRfTkZQU0VMMV9QT1MJCTE2CisjZGVmaW5lIElEVF9ORlBTRUwxX0xFTgkJNAogCiBzdHJ1Y3QgeGdlbmVfY2xlX3B0cmVlX2JyYW5jaCB7CiAJYm9vbCB2YWxpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2V0aHRvb2wuYwppbmRleCAyMmE3YjI2Li5kMzcyZDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfZXRodG9vbC5jCkBAIC01NCw1NSArNTQsNjggQEAKIAlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiJXMiLCBwZGV2LT5uYW1lKTsKIH0KIAotc3RhdGljIGludCB4Z2VuZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCB4Z2VuZV9nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHBkYXRhLT5waHlfZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBuZGV2LT5waHlkZXY7CisJdTMyIHN1cHBvcnRlZDsKIAogCWlmIChwZGF0YS0+cGh5X21vZGUgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJKSB7CiAJCWlmIChwaHlkZXYgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PREVWOwogCi0JCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHBoeWRldiwgY21kKTsKKwkJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19nZXQocGh5ZGV2LCBjbWQpOwogCX0gZWxzZSBpZiAocGRhdGEtPnBoeV9tb2RlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSSkgewogCQlpZiAocGRhdGEtPm1kaW9fZHJpdmVyKSB7CiAJCQlpZiAoIXBoeWRldikKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAotCQkJcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQocGh5ZGV2LCBjbWQpOworCQkJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19nZXQocGh5ZGV2LCBjbWQpOwogCQl9CiAKLQkJY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfQXV0b25lZyB8Ci0JCQkJIFNVUFBPUlRFRF9NSUk7Ci0JCWNtZC0+YWR2ZXJ0aXNpbmcgPSBjbWQtPnN1cHBvcnRlZDsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgU1BFRURfMTAwMCk7Ci0JCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Ci0JCWNtZC0+cG9ydCA9IFBPUlRfTUlJOwotCQljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKLQkJY21kLT5hdXRvbmVnID0gQVVUT05FR19FTkFCTEU7CisJCXN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8IFNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJCVNVUFBPUlRFRF9NSUk7CisJCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZSgKKwkJCWNtZC0+bGlua19tb2Rlcy5zdXBwb3J0ZWQsCisJCQlzdXBwb3J0ZWQpOworCQlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoCisJCQljbWQtPmxpbmtfbW9kZXMuYWR2ZXJ0aXNpbmcsCisJCQlzdXBwb3J0ZWQpOworCisJCWNtZC0+YmFzZS5zcGVlZCA9IFNQRUVEXzEwMDA7CisJCWNtZC0+YmFzZS5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwkJY21kLT5iYXNlLnBvcnQgPSBQT1JUX01JSTsKKwkJY21kLT5iYXNlLmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKIAl9IGVsc2UgewotCQljbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfCBTVVBQT1JURURfRklCUkU7Ci0JCWNtZC0+YWR2ZXJ0aXNpbmcgPSBjbWQtPnN1cHBvcnRlZDsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgU1BFRURfMTAwMDApOwotCQljbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOwotCQljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOwotCQljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKLQkJY21kLT5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOworCQlzdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwgU1VQUE9SVEVEX0ZJQlJFOworCQlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoCisJCQljbWQtPmxpbmtfbW9kZXMuc3VwcG9ydGVkLAorCQkJc3VwcG9ydGVkKTsKKwkJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKAorCQkJY21kLT5saW5rX21vZGVzLmFkdmVydGlzaW5nLAorCQkJc3VwcG9ydGVkKTsKKworCQljbWQtPmJhc2Uuc3BlZWQgPSBTUEVFRF8xMDAwMDsKKwkJY21kLT5iYXNlLmR1cGxleCA9IERVUExFWF9GVUxMOworCQljbWQtPmJhc2UucG9ydCA9IFBPUlRfRklCUkU7CisJCWNtZC0+YmFzZS5hdXRvbmVnID0gQVVUT05FR19ESVNBQkxFOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHhnZW5lX3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IHhnZW5lX3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcGRhdGEtPnBoeV9kZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG5kZXYtPnBoeWRldjsKIAogCWlmIChwZGF0YS0+cGh5X21vZGUgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJKSB7CiAJCWlmICghcGh5ZGV2KQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocGh5ZGV2LCBjbWQpOworCQlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX3NldChwaHlkZXYsIGNtZCk7CiAJfQogCiAJaWYgKHBkYXRhLT5waHlfbW9kZSA9PSBQSFlfSU5URVJGQUNFX01PREVfU0dNSUkpIHsKQEAgLTExMCw3ICsxMjMsNyBAQAogCQkJaWYgKCFwaHlkZXYpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHBoeWRldiwgY21kKTsKKwkJCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3Nfc2V0KHBoeWRldiwgY21kKTsKIAkJfQogCX0KIApAQCAtMTUyLDEyICsxNjUsMTIgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyB4Z2VuZV9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8gPSB4Z2VuZV9nZXRfZHJ2aW5mbywKLQkuZ2V0X3NldHRpbmdzID0geGdlbmVfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MgPSB4Z2VuZV9zZXRfc2V0dGluZ3MsCiAJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X3N0cmluZ3MgPSB4Z2VuZV9nZXRfc3RyaW5ncywKIAkuZ2V0X3NzZXRfY291bnQgPSB4Z2VuZV9nZXRfc3NldF9jb3VudCwKLQkuZ2V0X2V0aHRvb2xfc3RhdHMgPSB4Z2VuZV9nZXRfZXRodG9vbF9zdGF0cworCS5nZXRfZXRodG9vbF9zdGF0cyA9IHhnZW5lX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfbGlua19rc2V0dGluZ3MgPSB4Z2VuZV9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncyA9IHhnZW5lX3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKIHZvaWQgeGdlbmVfZW5ldF9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ody5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfaHcuYwppbmRleCAxOGJiOTU1Li5jNDgxZjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ody5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2h3LmMKQEAgLTcxMyw3ICs3MTMsNyBAQAogewogCXN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5kZXYpOwogCWNvbnN0IHN0cnVjdCB4Z2VuZV9tYWNfb3BzICptYWNfb3BzID0gcGRhdGEtPm1hY19vcHM7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHBkYXRhLT5waHlfZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBuZGV2LT5waHlkZXY7CiAKIAlpZiAocGh5ZGV2LT5saW5rKSB7CiAJCWlmIChwZGF0YS0+cGh5X3NwZWVkICE9IHBoeWRldi0+c3BlZWQpIHsKQEAgLTc2MSwzMSArNzYxLDI1IEBACiAJaWYgKGRldi0+b2Zfbm9kZSkgewogCQlmb3IgKGkgPSAwIDsgaSA8IDI7IGkrKykgewogCQkJbnAgPSBvZl9wYXJzZV9waGFuZGxlKGRldi0+b2Zfbm9kZSwgInBoeS1oYW5kbGUiLCBpKTsKLQkJCWlmIChucCkKKwkJCXBoeV9kZXYgPSBvZl9waHlfY29ubmVjdChuZGV2LCBucCwKKwkJCQkJCSAmeGdlbmVfZW5ldF9hZGp1c3RfbGluaywKKwkJCQkJCSAwLCBwZGF0YS0+cGh5X21vZGUpOworCQkJb2Zfbm9kZV9wdXQobnApOworCQkJaWYgKHBoeV9kZXYpCiAJCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoIW5wKSB7Ci0JCQluZXRkZXZfZGJnKG5kZXYsICJObyBwaHktaGFuZGxlIGZvdW5kIGluIERUXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0KLQkJcGh5X2RldiA9IG9mX3BoeV9jb25uZWN0KG5kZXYsIG5wLCAmeGdlbmVfZW5ldF9hZGp1c3RfbGluaywKLQkJCQkJIDAsIHBkYXRhLT5waHlfbW9kZSk7Ci0JCW9mX25vZGVfcHV0KG5wKTsKIAkJaWYgKCFwaHlfZGV2KSB7CiAJCQluZXRkZXZfZXJyKG5kZXYsICJDb3VsZCBub3QgY29ubmVjdCB0byBQSFlcbiIpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KLQotCQlwZGF0YS0+cGh5X2RldiA9IHBoeV9kZXY7CiAJfSBlbHNlIHsKICNpZmRlZiBDT05GSUdfQUNQSQogCQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSBhY3BpX3BoeV9maW5kX2RldmljZShkZXYpOwogCQlpZiAoYWRldikKLQkJCXBkYXRhLT5waHlfZGV2ID0gIGFkZXYtPmRyaXZlcl9kYXRhOwotCi0JCXBoeV9kZXYgPSBwZGF0YS0+cGh5X2RldjsKKwkJCXBoeV9kZXYgPSBhZGV2LT5kcml2ZXJfZGF0YTsKKwkJZWxzZQorCQkJcGh5X2RldiA9IE5VTEw7CiAKIAkJaWYgKCFwaHlfZGV2IHx8CiAJCSAgICBwaHlfY29ubmVjdF9kaXJlY3QobmRldiwgcGh5X2RldiwgJnhnZW5lX2VuZXRfYWRqdXN0X2xpbmssCkBAIC04NTMsOCArODQ3LDYgQEAKIAlpZiAoIXBoeSkKIAkJcmV0dXJuIC1FSU87CiAKLQlwZGF0YS0+cGh5X2RldiA9IHBoeTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTg5NCwxNCArODg2LDE4IEBACiAKIHZvaWQgeGdlbmVfZW5ldF9waHlfZGlzY29ubmVjdChzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCiB7Ci0JaWYgKHBkYXRhLT5waHlfZGV2KQotCQlwaHlfZGlzY29ubmVjdChwZGF0YS0+cGh5X2Rldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwZGF0YS0+bmRldjsKKworCWlmIChuZGV2LT5waHlkZXYpCisJCXBoeV9kaXNjb25uZWN0KG5kZXYtPnBoeWRldik7CiB9CiAKIHZvaWQgeGdlbmVfZW5ldF9tZGlvX3JlbW92ZShzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCiB7Ci0JaWYgKHBkYXRhLT5waHlfZGV2KQotCQlwaHlfZGlzY29ubmVjdChwZGF0YS0+cGh5X2Rldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwZGF0YS0+bmRldjsKKworCWlmIChuZGV2LT5waHlkZXYpCisJCXBoeV9kaXNjb25uZWN0KG5kZXYtPnBoeWRldik7CiAKIAltZGlvYnVzX3VucmVnaXN0ZXIocGRhdGEtPm1kaW9fYnVzKTsKIAltZGlvYnVzX2ZyZWUocGRhdGEtPm1kaW9fYnVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2h3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ody5oCmluZGV4IDE3OWE0NGQuLjg0NTYzMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfaHcuaApAQCAtMTI0LDYgKzEyNCwxMiBAQAogI2RlZmluZSBNQUNfUkVBRF9SRUdfT0ZGU0VUCQkweDBjCiAjZGVmaW5lIE1BQ19DT01NQU5EX0RPTkVfUkVHX09GRlNFVAkweDEwCiAKKyNkZWZpbmUgUENTX0FERFJfUkVHX09GRlNFVAkJMHgwMAorI2RlZmluZSBQQ1NfQ09NTUFORF9SRUdfT0ZGU0VUCQkweDA0CisjZGVmaW5lIFBDU19XUklURV9SRUdfT0ZGU0VUCQkweDA4CisjZGVmaW5lIFBDU19SRUFEX1JFR19PRkZTRVQJCTB4MGMKKyNkZWZpbmUgUENTX0NPTU1BTkRfRE9ORV9SRUdfT0ZGU0VUCTB4MTAKKwogI2RlZmluZSBNSUlfTUdNVF9DT05GSUdfQUREUgkJMHgyMAogI2RlZmluZSBNSUlfTUdNVF9DT01NQU5EX0FERFIJCTB4MjQKICNkZWZpbmUgTUlJX01HTVRfQUREUkVTU19BRERSCQkweDI4CkBAIC0yMzEsNiArMjM3LDggQEAKICNkZWZpbmUgVENQSERSX0xFTgkJCTYKICNkZWZpbmUgSVBIRFJfUE9TCQkJNgogI2RlZmluZSBJUEhEUl9MRU4JCQk2CisjZGVmaW5lIE1TU19QT1MJCQkJMjAKKyNkZWZpbmUgTVNTX0xFTgkJCQkyCiAjZGVmaW5lIEVDX1BPUwkJCQkyMgkvKiBFbmFibGUgY2hlY2tzdW0gKi8KICNkZWZpbmUgRUNfTEVOCQkJCTEKICNkZWZpbmUgRVRfUE9TCQkJCTIzCS8qIEVuYWJsZSBUU08gKi8KQEAgLTI0Nyw2ICsyNTUsMTEgQEAKIAogI2RlZmluZSBMQVNUX0JVRkZFUgkJCSgweDc4MDBVTEwgPDwgQlVGREFUQUxFTl9QT1MpCiAKKyNkZWZpbmUgVFNPX01TUzBfUE9TCQkJMAorI2RlZmluZSBUU09fTVNTMF9MRU4JCQkxNAorI2RlZmluZSBUU09fTVNTMV9QT1MJCQkxNgorI2RlZmluZSBUU09fTVNTMV9MRU4JCQkxNAorCiBzdHJ1Y3QgeGdlbmVfZW5ldF9yYXdfZGVzYyB7CiAJX19sZTY0IG0wOwogCV9fbGU2NCBtMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uYwppbmRleCBkMWQ2YjVlLi40MjlmMThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfbWFpbi5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgInhnZW5lX2VuZXRfbWFpbi5oIgogI2luY2x1ZGUgInhnZW5lX2VuZXRfaHcuaCIKICNpbmNsdWRlICJ4Z2VuZV9lbmV0X3NnbWFjLmgiCkBAIC03Miw3ICs3Myw2IEBACiAJCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24obmRldiwgbGVuKTsKIAkJaWYgKHVubGlrZWx5KCFza2IpKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWJ1Zl9wb29sLT5yeF9za2JbdGFpbF0gPSBza2I7CiAKIAkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShkZXYsIHNrYi0+ZGF0YSwgbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwogCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBkbWFfYWRkcikpIHsKQEAgLTgxLDYgKzgxLDggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKKwkJYnVmX3Bvb2wtPnJ4X3NrYlt0YWlsXSA9IHNrYjsKKwogCQlyYXdfZGVzYy0+bTEgPSBjcHVfdG9fbGU2NChTRVRfVkFMKERBVEFBRERSLCBkbWFfYWRkcikgfAogCQkJCQkgICBTRVRfVkFMKEJVRkRBVEFMRU4sIGJ1ZmRhdGFsZW4pIHwKIAkJCQkJICAgU0VUX0JJVChDT0hFUkVOVCkpOwpAQCAtMTAyLDEyICsxMDQsMjEgQEAKIAogc3RhdGljIHZvaWQgeGdlbmVfZW5ldF9kZWxldGVfYnVmcG9vbChzdHJ1Y3QgeGdlbmVfZW5ldF9kZXNjX3JpbmcgKmJ1Zl9wb29sKQogeworCXN0cnVjdCBkZXZpY2UgKmRldiA9IG5kZXZfdG9fZGV2KGJ1Zl9wb29sLT5uZGV2KTsKKwlzdHJ1Y3QgeGdlbmVfZW5ldF9yYXdfZGVzYzE2ICpyYXdfZGVzYzsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOwogCWludCBpOwogCiAJLyogRnJlZSB1cCB0aGUgYnVmZmVycyBoZWxkIGJ5IGhhcmR3YXJlICovCiAJZm9yIChpID0gMDsgaSA8IGJ1Zl9wb29sLT5zbG90czsgaSsrKSB7Ci0JCWlmIChidWZfcG9vbC0+cnhfc2tiW2ldKQorCQlpZiAoYnVmX3Bvb2wtPnJ4X3NrYltpXSkgewogCQkJZGV2X2tmcmVlX3NrYl9hbnkoYnVmX3Bvb2wtPnJ4X3NrYltpXSk7CisKKwkJCXJhd19kZXNjID0gJmJ1Zl9wb29sLT5yYXdfZGVzYzE2W2ldOworCQkJZG1hX2FkZHIgPSBHRVRfVkFMKERBVEFBRERSLCBsZTY0X3RvX2NwdShyYXdfZGVzYy0+bTEpKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCBkbWFfYWRkciwgWEdFTkVfRU5FVF9NQVhfTVRVLAorCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJfQogCX0KIH0KIApAQCAtMTI2LDYgKzEzNyw3IEBACiBzdGF0aWMgaW50IHhnZW5lX2VuZXRfdHhfY29tcGxldGlvbihzdHJ1Y3QgeGdlbmVfZW5ldF9kZXNjX3JpbmcgKmNwX3JpbmcsCiAJCQkJICAgIHN0cnVjdCB4Z2VuZV9lbmV0X3Jhd19kZXNjICpyYXdfZGVzYykKIHsKKwlzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihjcF9yaW5nLT5uZGV2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlza2JfZnJhZ190ICpmcmFnOwpAQCAtMTMzLDYgKzE0NSw3IEBACiAJdTE2IHNrYl9pbmRleDsKIAl1OCBzdGF0dXM7CiAJaW50IGksIHJldCA9IDA7CisJdTggbXNzX2luZGV4OwogCiAJc2tiX2luZGV4ID0gR0VUX1ZBTChVU0VSSU5GTywgbGU2NF90b19jcHUocmF3X2Rlc2MtPm0wKSk7CiAJc2tiID0gY3BfcmluZy0+Y3Bfc2tiW3NrYl9pbmRleF07CkBAIC0xNDksNiArMTYyLDEzIEBACiAJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CiAJfQogCisJaWYgKEdFVF9CSVQoRVQsIGxlNjRfdG9fY3B1KHJhd19kZXNjLT5tMykpKSB7CisJCW1zc19pbmRleCA9IEdFVF9WQUwoTVNTLCBsZTY0X3RvX2NwdShyYXdfZGVzYy0+bTMpKTsKKwkJc3Bpbl9sb2NrKCZwZGF0YS0+bXNzX2xvY2spOworCQlwZGF0YS0+bXNzX3JlZmNudFttc3NfaW5kZXhdLS07CisJCXNwaW5fdW5sb2NrKCZwZGF0YS0+bXNzX2xvY2spOworCX0KKwogCS8qIENoZWNraW5nIGZvciBlcnJvciAqLwogCXN0YXR1cyA9IEdFVF9WQUwoTEVSUiwgbGU2NF90b19jcHUocmF3X2Rlc2MtPm0wKSk7CiAJaWYgKHVubGlrZWx5KHN0YXR1cyA+IDIpKSB7CkBAIC0xNjcsMTUgKzE4Nyw1MyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1NjQgeGdlbmVfZW5ldF93b3JrX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCB4Z2VuZV9lbmV0X3NldHVwX21zcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIG1zcykKK3sKKwlzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlib29sIG1zc19pbmRleF9mb3VuZCA9IGZhbHNlOworCWludCBtc3NfaW5kZXg7CisJaW50IGk7CisKKwlzcGluX2xvY2soJnBkYXRhLT5tc3NfbG9jayk7CisKKwkvKiBSZXVzZSB0aGUgc2xvdCBpZiBNU1MgbWF0Y2hlcyAqLworCWZvciAoaSA9IDA7ICFtc3NfaW5kZXhfZm91bmQgJiYgaSA8IE5VTV9NU1NfUkVHOyBpKyspIHsKKwkJaWYgKHBkYXRhLT5tc3NbaV0gPT0gbXNzKSB7CisJCQlwZGF0YS0+bXNzX3JlZmNudFtpXSsrOworCQkJbXNzX2luZGV4ID0gaTsKKwkJCW1zc19pbmRleF9mb3VuZCA9IHRydWU7CisJCX0KKwl9CisKKwkvKiBPdmVyd3JpdGUgdGhlIHNsb3Qgd2l0aCByZWZfY291bnQgPSAwICovCisJZm9yIChpID0gMDsgIW1zc19pbmRleF9mb3VuZCAmJiBpIDwgTlVNX01TU19SRUc7IGkrKykgeworCQlpZiAoIXBkYXRhLT5tc3NfcmVmY250W2ldKSB7CisJCQlwZGF0YS0+bXNzX3JlZmNudFtpXSsrOworCQkJcGRhdGEtPm1hY19vcHMtPnNldF9tc3MocGRhdGEsIG1zcywgaSk7CisJCQlwZGF0YS0+bXNzW2ldID0gbXNzOworCQkJbXNzX2luZGV4ID0gaTsKKwkJCW1zc19pbmRleF9mb3VuZCA9IHRydWU7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmcGRhdGEtPm1zc19sb2NrKTsKKworCS8qIE5vIHNsb3RzIHdpdGggcmVmX2NvdW50ID0gMCBhdmFpbGFibGUsIHJldHVybiBidXN5ICovCisJaWYgKCFtc3NfaW5kZXhfZm91bmQpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gbXNzX2luZGV4OworfQorCitzdGF0aWMgaW50IHhnZW5lX2VuZXRfd29ya19tc2coc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTY0ICpob3BpbmZvKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gc2tiLT5kZXY7CiAJc3RydWN0IGlwaGRyICppcGg7CiAJdTggbDNobGVuID0gMCwgbDRobGVuID0gMDsKIAl1OCBldGhoZHIsIHByb3RvID0gMCwgY3N1bV9lbmFibGUgPSAwOwotCXU2NCBob3BpbmZvID0gMDsKIAl1MzIgaGRyX2xlbiwgbXNzID0gMDsKIAl1MzIgaSwgbGVuLCBucl9mcmFnczsKKwlpbnQgbXNzX2luZGV4OwogCiAJZXRoaGRyID0geGdlbmVfZW5ldF9oZHJfbGVuKHNrYi0+ZGF0YSk7CiAKQEAgLTIxNSw3ICsyNzMsMTEgQEAKIAkJCWlmICghbXNzIHx8ICgoc2tiLT5sZW4gLSBoZHJfbGVuKSA8PSBtc3MpKQogCQkJCWdvdG8gb3V0OwogCi0JCQlob3BpbmZvIHw9IFNFVF9CSVQoRVQpOworCQkJbXNzX2luZGV4ID0geGdlbmVfZW5ldF9zZXR1cF9tc3MobmRldiwgbXNzKTsKKwkJCWlmICh1bmxpa2VseShtc3NfaW5kZXggPCAwKSkKKwkJCQlyZXR1cm4gLUVCVVNZOworCisJCQkqaG9waW5mbyB8PSBTRVRfQklUKEVUKSB8IFNFVF9WQUwoTVNTLCBtc3NfaW5kZXgpOwogCQl9CiAJfSBlbHNlIGlmIChpcGgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CiAJCWw0aGxlbiA9IFVEUF9IRFJfU0laRTsKQEAgLTIyMywxNSArMjg1LDE1IEBACiAJfQogb3V0OgogCWwzaGxlbiA9IGlwX2hkcmxlbihza2IpID4+IDI7Ci0JaG9waW5mbyB8PSBTRVRfVkFMKFRDUEhEUiwgbDRobGVuKSB8Ci0JCSAgU0VUX1ZBTChJUEhEUiwgbDNobGVuKSB8Ci0JCSAgU0VUX1ZBTChFVEhIRFIsIGV0aGhkcikgfAotCQkgIFNFVF9WQUwoRUMsIGNzdW1fZW5hYmxlKSB8Ci0JCSAgU0VUX1ZBTChJUywgcHJvdG8pIHwKLQkJICBTRVRfQklUKElDKSB8Ci0JCSAgU0VUX0JJVChUWVBFX0VUSF9XT1JLX01FU1NBR0UpOworCSpob3BpbmZvIHw9IFNFVF9WQUwoVENQSERSLCBsNGhsZW4pIHwKKwkJICAgIFNFVF9WQUwoSVBIRFIsIGwzaGxlbikgfAorCQkgICAgU0VUX1ZBTChFVEhIRFIsIGV0aGhkcikgfAorCQkgICAgU0VUX1ZBTChFQywgY3N1bV9lbmFibGUpIHwKKwkJICAgIFNFVF9WQUwoSVMsIHByb3RvKSB8CisJCSAgICBTRVRfQklUKElDKSB8CisJCSAgICBTRVRfQklUKFRZUEVfRVRIX1dPUktfTUVTU0FHRSk7CiAKLQlyZXR1cm4gaG9waW5mbzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHUxNiB4Z2VuZV9lbmV0X2VuY29kZV9sZW4odTE2IGxlbikKQEAgLTI3MSwyMCArMzMzLDIyIEBACiAJZG1hX2FkZHJfdCBkbWFfYWRkciwgcGJ1Zl9hZGRyLCAqZnJhZ19kbWFfYWRkcjsKIAlza2JfZnJhZ190ICpmcmFnOwogCXUxNiB0YWlsID0gdHhfcmluZy0+dGFpbDsKLQl1NjQgaG9waW5mbzsKKwl1NjQgaG9waW5mbyA9IDA7CiAJdTMyIGxlbiwgaHdfbGVuOwogCXU4IGxsID0gMCwgbnYgPSAwLCBpZHggPSAwOwogCWJvb2wgc3BsaXQgPSBmYWxzZTsKIAl1MzIgc2l6ZSwgb2Zmc2V0LCBlbGxfYnl0ZXMgPSAwOwogCXUzMiBpLCBmaWR4LCBucl9mcmFncywgY291bnQgPSAxOworCWludCByZXQ7CiAKIAlyYXdfZGVzYyA9ICZ0eF9yaW5nLT5yYXdfZGVzY1t0YWlsXTsKIAl0YWlsID0gKHRhaWwgKyAxKSAmICh0eF9yaW5nLT5zbG90cyAtIDEpOwogCW1lbXNldChyYXdfZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCB4Z2VuZV9lbmV0X3Jhd19kZXNjKSk7CiAKLQlob3BpbmZvID0geGdlbmVfZW5ldF93b3JrX21zZyhza2IpOwotCWlmICghaG9waW5mbykKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmV0ID0geGdlbmVfZW5ldF93b3JrX21zZyhza2IsICZob3BpbmZvKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJcmF3X2Rlc2MtPm0zID0gY3B1X3RvX2xlNjQoU0VUX1ZBTChIRU5RTlVNLCB0eF9yaW5nLT5kc3RfcmluZ19udW0pIHwKIAkJCQkgICBob3BpbmZvKTsKIApAQCAtNDI0LDYgKzQ4OCw5IEBACiAJCXJldHVybiBORVRERVZfVFhfT0s7CiAKIAljb3VudCA9IHhnZW5lX2VuZXRfc2V0dXBfdHhfZGVzYyh0eF9yaW5nLCBza2IpOworCWlmIChjb3VudCA9PSAtRUJVU1kpCisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwogCWlmIChjb3VudCA8PSAwKSB7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCXJldHVybiBORVRERVZfVFhfT0s7CkBAIC00NTIsNyArNTE5LDYgQEAKIAkJCSAgICAgICBzdHJ1Y3QgeGdlbmVfZW5ldF9yYXdfZGVzYyAqcmF3X2Rlc2MpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7Ci0Jc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgeGdlbmVfZW5ldF9kZXNjX3JpbmcgKmJ1Zl9wb29sOwogCXUzMiBkYXRhbGVuLCBza2JfaW5kZXg7CkBAIC00NjEsNyArNTI3LDYgQEAKIAlpbnQgcmV0ID0gMDsKIAogCW5kZXYgPSByeF9yaW5nLT5uZGV2OwotCXBkYXRhID0gbmV0ZGV2X3ByaXYobmRldik7CiAJZGV2ID0gbmRldl90b19kZXYocnhfcmluZy0+bmRldik7CiAJYnVmX3Bvb2wgPSByeF9yaW5nLT5idWZfcG9vbDsKIApAQCAtNzM5LDggKzgwNCw4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChwZGF0YS0+cGh5X2RldikgewotCQlwaHlfc3RhcnQocGRhdGEtPnBoeV9kZXYpOworCWlmIChuZGV2LT5waHlkZXYpIHsKKwkJcGh5X3N0YXJ0KG5kZXYtPnBoeWRldik7CiAJfSBlbHNlIHsKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwZGF0YS0+bGlua193b3JrLCBQSFlfUE9MTF9MSU5LX09GRik7CiAJCW5ldGlmX2NhcnJpZXJfb2ZmKG5kZXYpOwpAQCAtNzYzLDggKzgyOCw4IEBACiAJbWFjX29wcy0+dHhfZGlzYWJsZShwZGF0YSk7CiAJbWFjX29wcy0+cnhfZGlzYWJsZShwZGF0YSk7CiAKLQlpZiAocGRhdGEtPnBoeV9kZXYpCi0JCXBoeV9zdG9wKHBkYXRhLT5waHlfZGV2KTsKKwlpZiAobmRldi0+cGh5ZGV2KQorCQlwaHlfc3RvcChuZGV2LT5waHlkZXYpOwogCWVsc2UKIAkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwZGF0YS0+bGlua193b3JrKTsKIApAQCAtMTMxMiw2ICsxMzc3LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHhnZW5lX2VuZXRfZ3Bpb2RfZ2V0KHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRhdGEtPnBkZXYtPmRldjsKKworCWlmIChwZGF0YS0+cGh5X21vZGUgIT0gUEhZX0lOVEVSRkFDRV9NT0RFX1hHTUlJKQorCQlyZXR1cm47CisKKwlwZGF0YS0+c2ZwX3JkeSA9IGdwaW9kX2dldChkZXYsICJyeGxvcyIsIEdQSU9EX0lOKTsKKwlpZiAoSVNfRVJSKHBkYXRhLT5zZnBfcmR5KSkKKwkJcGRhdGEtPnNmcF9yZHkgPSBncGlvZF9nZXQoZGV2LCAic2ZwIiwgR1BJT0RfSU4pOworfQorCiBzdGF0aWMgaW50IHhnZW5lX2VuZXRfZ2V0X3Jlc291cmNlcyhzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKQEAgLTE0MDEsNiArMTQ3OCw4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXhnZW5lX2VuZXRfZ3Bpb2RfZ2V0KHBkYXRhKTsKKwogCXBkYXRhLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihwZGF0YS0+Y2xrKSkgewogCQkvKiBGaXJtd2FyZSBtYXkgaGF2ZSBzZXQgdXAgdGhlIGNsb2NrIGFscmVhZHkuICovCkBAIC0xNDI1LDYgKzE1MDQsNyBAQAogCX0gZWxzZSB7CiAJCXBkYXRhLT5tY3hfbWFjX2FkZHIgPSBiYXNlX2FkZHIgKyBCTE9DS19BWEdfTUFDX09GRlNFVDsKIAkJcGRhdGEtPm1jeF9tYWNfY3NyX2FkZHIgPSBiYXNlX2FkZHIgKyBCTE9DS19BWEdfTUFDX0NTUl9PRkZTRVQ7CisJCXBkYXRhLT5wY3NfYWRkciA9IGJhc2VfYWRkciArIEJMT0NLX1BDU19PRkZTRVQ7CiAJfQogCXBkYXRhLT5yeF9idWZmX2NudCA9IE5VTV9QS1RfQlVGOwogCkBAIC0xNDU0LDEwICsxNTM0LDggQEAKIAkJYnVmX3Bvb2wgPSBwZGF0YS0+cnhfcmluZ1tpXS0+YnVmX3Bvb2w7CiAJCXhnZW5lX2VuZXRfaW5pdF9idWZwb29sKGJ1Zl9wb29sKTsKIAkJcmV0ID0geGdlbmVfZW5ldF9yZWZpbGxfYnVmcG9vbChidWZfcG9vbCwgcGRhdGEtPnJ4X2J1ZmZfY250KTsKLQkJaWYgKHJldCkgewotCQkJeGdlbmVfZW5ldF9kZWxldGVfZGVzY19yaW5ncyhwZGF0YSk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKIAl9CiAKIAlkc3RfcmluZ19udW0gPSB4Z2VuZV9lbmV0X2RzdF9yaW5nX251bShwZGF0YS0+cnhfcmluZ1swXSk7CkBAIC0xNDc0LDcgKzE1NTIsNyBAQAogCQlyZXQgPSBwZGF0YS0+Y2xlX29wcy0+Y2xlX2luaXQocGRhdGEpOwogCQlpZiAocmV0KSB7CiAJCQluZXRkZXZfZXJyKG5kZXYsICJQcmVjbGFzcyBUcmVlIGluaXQgZXJyb3JcbiIpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gZXJyOwogCQl9CiAJfSBlbHNlIHsKIAkJcGRhdGEtPnBvcnRfb3BzLT5jbGVfYnlwYXNzKHBkYXRhLCBkc3RfcmluZ19udW0sIGJ1Zl9wb29sLT5pZCk7CkBAIC0xNDg0LDYgKzE1NjIsMTAgQEAKIAlwZGF0YS0+bWFjX29wcy0+aW5pdChwZGF0YSk7CiAKIAlyZXR1cm4gcmV0OworCitlcnI6CisJeGdlbmVfZW5ldF9kZWxldGVfZGVzY19yaW5ncyhwZGF0YSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgeGdlbmVfZW5ldF9zZXR1cF9vcHMoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQpAQCAtMTYzMSw4ICsxNzEzLDggQEAKIAl9CiAjZW5kaWYKIAlpZiAoIXBkYXRhLT5lbmV0X2lkKSB7Ci0JCWZyZWVfbmV0ZGV2KG5kZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CiAJfQogCiAJcmV0ID0geGdlbmVfZW5ldF9nZXRfcmVzb3VyY2VzKHBkYXRhKTsKQEAgLTE2NDMsNyArMTcyNSw3IEBACiAKIAlpZiAocGRhdGEtPnBoeV9tb2RlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9YR01JSSkgewogCQluZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKLQkJcGRhdGEtPm1zcyA9IFhHRU5FX0VORVRfTVNTOworCQlzcGluX2xvY2tfaW5pdCgmcGRhdGEtPm1zc19sb2NrKTsKIAl9CiAJbmRldi0+aHdfZmVhdHVyZXMgPSBuZGV2LT5mZWF0dXJlczsKIApAQCAtMTY1NSw3ICsxNzM3LDcgQEAKIAogCXJldCA9IHhnZW5lX2VuZXRfaW5pdF9odyhwZGF0YSk7CiAJaWYgKHJldCkKLQkJZ290byBlcnJfbmV0ZGV2OworCQlnb3RvIGVycjsKIAogCWxpbmtfc3RhdGUgPSBwZGF0YS0+bWFjX29wcy0+bGlua19zdGF0ZTsKIAlpZiAocGRhdGEtPnBoeV9tb2RlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9YR01JSSkgewpAQCAtMTY2NSwyMSArMTc0NywzMiBAQAogCQkJcmV0ID0geGdlbmVfZW5ldF9tZGlvX2NvbmZpZyhwZGF0YSk7CiAJCWVsc2UKIAkJCUlOSVRfREVMQVlFRF9XT1JLKCZwZGF0YS0+bGlua193b3JrLCBsaW5rX3N0YXRlKTsKKworCQlpZiAocmV0KQorCQkJZ290byBlcnIxOwogCX0KLQlpZiAocmV0KQotCQlnb3RvIGVycjsKIAogCXhnZW5lX2VuZXRfbmFwaV9hZGQocGRhdGEpOwogCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZGV2KTsKIAlpZiAocmV0KSB7CiAJCW5ldGRldl9lcnIobmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBuZXRkZXZcbiIpOwotCQlnb3RvIGVycjsKKwkJZ290byBlcnIyOwogCX0KIAogCXJldHVybiAwOwogCi1lcnJfbmV0ZGV2OgotCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworZXJyMjoKKwkvKgorCSAqIElmIG5lY2Vzc2FyeSwgZnJlZV9uZXRkZXYoKSB3aWxsIGNhbGwgbmV0aWZfbmFwaV9kZWwoKSBhbmQgdW5kbworCSAqIHRoZSBlZmZlY3RzIG9mIHhnZW5lX2VuZXRfbmFwaV9hZGQoKSdzIGNhbGxzIHRvIG5ldGlmX25hcGlfYWRkKCkuCisJICovCisKKwlpZiAocGRhdGEtPm1kaW9fZHJpdmVyKQorCQl4Z2VuZV9lbmV0X3BoeV9kaXNjb25uZWN0KHBkYXRhKTsKKwllbHNlIGlmIChwZGF0YS0+cGh5X21vZGUgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJKQorCQl4Z2VuZV9lbmV0X21kaW9fcmVtb3ZlKHBkYXRhKTsKK2VycjE6CisJeGdlbmVfZW5ldF9kZWxldGVfZGVzY19yaW5ncyhwZGF0YSk7CiBlcnI6CiAJZnJlZV9uZXRkZXYobmRldik7CiAJcmV0dXJuIHJldDsKQEAgLTE2ODgsMTEgKzE3ODEsOSBAQAogc3RhdGljIGludCB4Z2VuZV9lbmV0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YTsKLQljb25zdCBzdHJ1Y3QgeGdlbmVfbWFjX29wcyAqbWFjX29wczsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAogCXBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JbWFjX29wcyA9IHBkYXRhLT5tYWNfb3BzOwogCW5kZXYgPSBwZGF0YS0+bmRldjsKIAogCXJ0bmxfbG9jaygpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfbWFpbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfbWFpbi5oCmluZGV4IDIxNzU0NmUuLjBjZGE1OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9tYWluLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKICNkZWZpbmUgTlVNX1BLVF9CVUYJNjQKICNkZWZpbmUgTlVNX0JVRlBPT0wJMzIKICNkZWZpbmUgTUFYX0VYUF9CVUZGUwkyNTYKLSNkZWZpbmUgWEdFTkVfRU5FVF9NU1MJMTQ0OAorI2RlZmluZSBOVU1fTVNTX1JFRwk0CiAjZGVmaW5lIFhHRU5FX01JTl9FTkVUX0ZSQU1FX1NJWkUJNjAKIAogI2RlZmluZSBYR0VORV9NQVhfRU5FVF9JUlEJMTYKQEAgLTE0Myw3ICsxNDMsNyBAQAogCXZvaWQgKCpyeF9kaXNhYmxlKShzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpOwogCXZvaWQgKCpzZXRfc3BlZWQpKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSk7CiAJdm9pZCAoKnNldF9tYWNfYWRkcikoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKTsKLQl2b2lkICgqc2V0X21zcykoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKTsKKwl2b2lkICgqc2V0X21zcykoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhLCB1MTYgbXNzLCB1OCBpbmRleCk7CiAJdm9pZCAoKmxpbmtfc3RhdGUpKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB9OwogCkBAIC0xNzQsNyArMTc0LDYgQEAKIHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlzdHJ1Y3QgbWlpX2J1cyAqbWRpb19idXM7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXY7CiAJaW50IHBoeV9zcGVlZDsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKQEAgLTE5Niw2ICsxOTUsNyBAQAogCXZvaWQgX19pb21lbSAqbWN4X21hY19hZGRyOwogCXZvaWQgX19pb21lbSAqbWN4X21hY19jc3JfYWRkcjsKIAl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKwl2b2lkIF9faW9tZW0gKnBjc19hZGRyOwogCXZvaWQgX19pb21lbSAqcmluZ19jc3JfYWRkcjsKIAl2b2lkIF9faW9tZW0gKnJpbmdfY21kX2FkZHI7CiAJaW50IHBoeV9tb2RlOwpAQCAtMjEyLDEwICsyMTIsMTMgQEAKIAl1OCBldGhfYnVmbnVtOwogCXU4IGJwX2J1Zm51bTsKIAl1MTYgcmluZ19udW07Ci0JdTMyIG1zczsKKwl1MzIgbXNzW05VTV9NU1NfUkVHXTsKKwl1MzIgbXNzX3JlZmNudFtOVU1fTVNTX1JFR107CisJc3BpbmxvY2tfdCBtc3NfbG9jazsgIC8qIG1zcyBsb2NrICovCiAJdTggdHhfZGVsYXk7CiAJdTggcnhfZGVsYXk7CiAJYm9vbCBtZGlvX2RyaXZlcjsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpzZnBfcmR5OwogfTsKIAogc3RydWN0IHhnZW5lX2luZGlyZWN0X2N0bCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF94Z21hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfeGdtYWMuYwppbmRleCA5YzZhZDBkLi42NDc1ZjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF94Z21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X3hnbWFjLmMKQEAgLTE4LDYgKzE4LDggQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgInhnZW5lX2VuZXRfbWFpbi5oIgogI2luY2x1ZGUgInhnZW5lX2VuZXRfaHcuaCIKICNpbmNsdWRlICJ4Z2VuZV9lbmV0X3hnbWFjLmgiCkBAIC04NCw2ICs4NiwyMSBAQAogCQkJICAgd3JfYWRkcik7CiB9CiAKK3N0YXRpYyB2b2lkIHhnZW5lX2VuZXRfd3JfcGNzKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSwKKwkJCSAgICAgIHUzMiB3cl9hZGRyLCB1MzIgd3JfZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHIsICp3ciwgKmNtZCwgKmNtZF9kb25lOworCisJYWRkciA9IHBkYXRhLT5wY3NfYWRkciArIFBDU19BRERSX1JFR19PRkZTRVQ7CisJd3IgPSBwZGF0YS0+cGNzX2FkZHIgKyBQQ1NfV1JJVEVfUkVHX09GRlNFVDsKKwljbWQgPSBwZGF0YS0+cGNzX2FkZHIgKyBQQ1NfQ09NTUFORF9SRUdfT0ZGU0VUOworCWNtZF9kb25lID0gcGRhdGEtPnBjc19hZGRyICsgUENTX0NPTU1BTkRfRE9ORV9SRUdfT0ZGU0VUOworCisJaWYgKCF4Z2VuZV9lbmV0X3dyX2luZGlyZWN0KGFkZHIsIHdyLCBjbWQsIGNtZF9kb25lLCB3cl9hZGRyLCB3cl9kYXRhKSkKKwkJbmV0ZGV2X2VycihwZGF0YS0+bmRldiwgIlBDUyB3cml0ZSBmYWlsZWQsIGFkZHI6ICUwNHhcbiIsCisJCQkgICB3cl9hZGRyKTsKK30KKwogc3RhdGljIHZvaWQgeGdlbmVfZW5ldF9yZF9jc3Ioc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhLAogCQkJICAgICAgdTMyIG9mZnNldCwgdTMyICp2YWwpCiB7CkBAIC0xMjIsNiArMTM5LDcgQEAKIAogCXJldHVybiB0cnVlOwogfQorCiBzdGF0aWMgdm9pZCB4Z2VuZV9lbmV0X3JkX21hYyhzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEsCiAJCQkgICAgICB1MzIgcmRfYWRkciwgdTMyICpyZF9kYXRhKQogewpAQCAtMTM3LDYgKzE1NSwyNSBAQAogCQkJICAgcmRfYWRkcik7CiB9CiAKK3N0YXRpYyBib29sIHhnZW5lX2VuZXRfcmRfcGNzKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSwKKwkJCSAgICAgIHUzMiByZF9hZGRyLCB1MzIgKnJkX2RhdGEpCit7CisJdm9pZCBfX2lvbWVtICphZGRyLCAqcmQsICpjbWQsICpjbWRfZG9uZTsKKwlib29sIHN1Y2Nlc3M7CisKKwlhZGRyID0gcGRhdGEtPnBjc19hZGRyICsgUENTX0FERFJfUkVHX09GRlNFVDsKKwlyZCA9IHBkYXRhLT5wY3NfYWRkciArIFBDU19SRUFEX1JFR19PRkZTRVQ7CisJY21kID0gcGRhdGEtPnBjc19hZGRyICsgUENTX0NPTU1BTkRfUkVHX09GRlNFVDsKKwljbWRfZG9uZSA9IHBkYXRhLT5wY3NfYWRkciArIFBDU19DT01NQU5EX0RPTkVfUkVHX09GRlNFVDsKKworCXN1Y2Nlc3MgPSB4Z2VuZV9lbmV0X3JkX2luZGlyZWN0KGFkZHIsIHJkLCBjbWQsIGNtZF9kb25lLCByZF9hZGRyLCByZF9kYXRhKTsKKwlpZiAoIXN1Y2Nlc3MpCisJCW5ldGRldl9lcnIocGRhdGEtPm5kZXYsICJQQ1MgcmVhZCBmYWlsZWQsIGFkZHI6ICUwNHhcbiIsCisJCQkgICByZF9hZGRyKTsKKworCXJldHVybiBzdWNjZXNzOworfQorCiBzdGF0aWMgaW50IHhnZW5lX2VuZXRfZWNjX2luaXQoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGRhdGEtPm5kZXY7CkBAIC0xNzEsNiArMjA4LDE3IEBACiAJeGdlbmVfZW5ldF93cl9tYWMocGRhdGEsIEFYR01BQ19DT05GSUdfMCwgMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHhnZW5lX3Bjc19yZXNldChzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCit7CisJdTMyIGRhdGE7CisKKwlpZiAoIXhnZW5lX2VuZXRfcmRfcGNzKHBkYXRhLCBQQ1NfQ09OVFJPTF8xLCAmZGF0YSkpCisJCXJldHVybjsKKworCXhnZW5lX2VuZXRfd3JfcGNzKHBkYXRhLCBQQ1NfQ09OVFJPTF8xLCBkYXRhIHwgUENTX0NUUkxfUENTX1JTVCk7CisJeGdlbmVfZW5ldF93cl9wY3MocGRhdGEsIFBDU19DT05UUk9MXzEsIGRhdGEgJiB+UENTX0NUUkxfUENTX1JTVCk7Cit9CisKIHN0YXRpYyB2b2lkIHhnZW5lX3hnbWFjX3NldF9tYWNfYWRkcihzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCiB7CiAJdTMyIGFkZHIwLCBhZGRyMTsKQEAgLTE4NCw5ICsyMzIsMjIgQEAKIAl4Z2VuZV9lbmV0X3dyX21hYyhwZGF0YSwgSFNUTUFDQURSX01TV19BRERSLCBhZGRyMSk7CiB9CiAKLXN0YXRpYyB2b2lkIHhnZW5lX3hnbWFjX3NldF9tc3Moc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQorc3RhdGljIHZvaWQgeGdlbmVfeGdtYWNfc2V0X21zcyhzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEsCisJCQkJdTE2IG1zcywgdTggaW5kZXgpCiB7Ci0JeGdlbmVfZW5ldF93cl9jc3IocGRhdGEsIFhHX1RTSUZfTVNTX1JFRzBfQUREUiwgcGRhdGEtPm1zcyk7CisJdTggb2Zmc2V0OworCXUzMiBkYXRhOworCisJb2Zmc2V0ID0gKGluZGV4IDwgMikgPyAwIDogNDsKKwl4Z2VuZV9lbmV0X3JkX2NzcihwZGF0YSwgWEdfVFNJRl9NU1NfUkVHMF9BRERSICsgb2Zmc2V0LCAmZGF0YSk7CisKKwlpZiAoIShpbmRleCAmIDB4MSkpCisJCWRhdGEgPSBTRVRfVkFMKFRTT19NU1MxLCBkYXRhID4+IFRTT19NU1MxX1BPUykgfAorCQkJU0VUX1ZBTChUU09fTVNTMCwgbXNzKTsKKwllbHNlCisJCWRhdGEgPSBTRVRfVkFMKFRTT19NU1MxLCBtc3MpIHwgU0VUX1ZBTChUU09fTVNTMCwgZGF0YSk7CisKKwl4Z2VuZV9lbmV0X3dyX2NzcihwZGF0YSwgWEdfVFNJRl9NU1NfUkVHMF9BRERSICsgb2Zmc2V0LCBkYXRhKTsKIH0KIAogc3RhdGljIHUzMiB4Z2VuZV9lbmV0X2xpbmtfc3RhdHVzKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKQEAgLTIxMCwxOCArMjcxLDE3IEBACiAJeGdlbmVfZW5ldF93cl9tYWMocGRhdGEsIEFYR01BQ19DT05GSUdfMSwgZGF0YSk7CiAKIAl4Z2VuZV94Z21hY19zZXRfbWFjX2FkZHIocGRhdGEpOwotCXhnZW5lX3hnbWFjX3NldF9tc3MocGRhdGEpOwogCiAJeGdlbmVfZW5ldF9yZF9jc3IocGRhdGEsIFhHX1JTSUZfQ09ORklHX1JFR19BRERSLCAmZGF0YSk7CiAJZGF0YSB8PSBDRkdfUlNJRl9GUEJVRkZfVElNRU9VVF9FTjsKIAl4Z2VuZV9lbmV0X3dyX2NzcihwZGF0YSwgWEdfUlNJRl9DT05GSUdfUkVHX0FERFIsIGRhdGEpOwogCi0JeGdlbmVfZW5ldF93cl9jc3IocGRhdGEsIFhHX0NGR19CWVBBU1NfQUREUiwgUkVTVU1FX1RYKTsKLQl4Z2VuZV9lbmV0X3dyX2NzcihwZGF0YSwgWEdFTkVUX1JYX0RWX0dBVEVfUkVHXzBfQUREUiwgMCk7CiAJeGdlbmVfZW5ldF9yZF9jc3IocGRhdGEsIFhHX0VORVRfU1BBUkVfQ0ZHX1JFR19BRERSLCAmZGF0YSk7CiAJZGF0YSB8PSBCSVQoMTIpOwogCXhnZW5lX2VuZXRfd3JfY3NyKHBkYXRhLCBYR19FTkVUX1NQQVJFX0NGR19SRUdfQUREUiwgZGF0YSk7CiAJeGdlbmVfZW5ldF93cl9jc3IocGRhdGEsIFhHX0VORVRfU1BBUkVfQ0ZHX1JFR18xX0FERFIsIDB4ODIpOworCXhnZW5lX2VuZXRfd3JfY3NyKHBkYXRhLCBYR0VORVRfUlhfRFZfR0FURV9SRUdfMF9BRERSLCAwKTsKKwl4Z2VuZV9lbmV0X3dyX2NzcihwZGF0YSwgWEdfQ0ZHX0JZUEFTU19BRERSLCBSRVNVTUVfVFgpOwogfQogCiBzdGF0aWMgdm9pZCB4Z2VuZV94Z21hY19yeF9lbmFibGUoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQpAQCAtMzU5LDE0ICs0MTksMTcgQEAKIHsKIAlzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEgPSBjb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLAogCQkJCQkgc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEsIGxpbmtfd29yayk7CisJc3RydWN0IGdwaW9fZGVzYyAqc2ZwX3JkeSA9IHBkYXRhLT5zZnBfcmR5OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGRhdGEtPm5kZXY7CiAJdTMyIGxpbmtfc3RhdHVzLCBwb2xsX2ludGVydmFsOwogCiAJbGlua19zdGF0dXMgPSB4Z2VuZV9lbmV0X2xpbmtfc3RhdHVzKHBkYXRhKTsKKwlpZiAobGlua19zdGF0dXMgJiYgIUlTX0VSUihzZnBfcmR5KSAmJiAhZ3Bpb2RfZ2V0X3ZhbHVlKHNmcF9yZHkpKQorCQlsaW5rX3N0YXR1cyA9IDA7CisKIAlpZiAobGlua19zdGF0dXMpIHsKIAkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5kZXYpKSB7CiAJCQluZXRpZl9jYXJyaWVyX29uKG5kZXYpOwotCQkJeGdlbmVfeGdtYWNfaW5pdChwZGF0YSk7CiAJCQl4Z2VuZV94Z21hY19yeF9lbmFibGUocGRhdGEpOwogCQkJeGdlbmVfeGdtYWNfdHhfZW5hYmxlKHBkYXRhKTsKIAkJCW5ldGRldl9pbmZvKG5kZXYsICJMaW5rIGlzIFVwIC0gMTBHYnBzXG4iKTsKQEAgLTM4MCw2ICs0NDMsOCBAQAogCQkJbmV0ZGV2X2luZm8obmRldiwgIkxpbmsgaXMgRG93blxuIik7CiAJCX0KIAkJcG9sbF9pbnRlcnZhbCA9IFBIWV9QT0xMX0xJTktfT0ZGOworCisJCXhnZW5lX3Bjc19yZXNldChwZGF0YSk7CiAJfQogCiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwZGF0YS0+bGlua193b3JrLCBwb2xsX2ludGVydmFsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X3hnbWFjLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF94Z21hYy5oCmluZGV4IGYxZWE0ODUuLjM2MGNjYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X3hnbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfeGdtYWMuaApAQCAtMjQsNiArMjQsNyBAQAogI2RlZmluZSBYMl9CTE9DS19FVEhfTUFDX0NTUl9PRkZTRVQJMHgzMDAwCiAjZGVmaW5lIEJMT0NLX0FYR19NQUNfT0ZGU0VUCQkweDA4MDAKICNkZWZpbmUgQkxPQ0tfQVhHX01BQ19DU1JfT0ZGU0VUCTB4MjAwMAorI2RlZmluZSBCTE9DS19QQ1NfT0ZGU0VUCQkweDM4MDAKIAogI2RlZmluZSBYR0VORVRfQ09ORklHX1JFR19BRERSCQkweDIwCiAjZGVmaW5lIFhHRU5FVF9TUlNUX0FERFIJCTB4MDAKQEAgLTcyLDYgKzczLDkgQEAKICNkZWZpbmUgWEdfTUNYX0lDTV9DT05GSUcwX1JFR18wX0FERFIJMHgwMGUwCiAjZGVmaW5lIFhHX01DWF9JQ01fQ09ORklHMl9SRUdfMF9BRERSCTB4MDBlOAogCisjZGVmaW5lIFBDU19DT05UUk9MXzEJCQkweDAwMDAKKyNkZWZpbmUgUENTX0NUUkxfUENTX1JTVAkJQklUKDE1KQorCiBleHRlcm4gY29uc3Qgc3RydWN0IHhnZW5lX21hY19vcHMgeGdlbmVfeGdtYWNfb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCB4Z2VuZV9wb3J0X29wcyB4Z2VuZV94Z3BvcnRfb3BzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcmMvZW1hY19tZGlvLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcmMvZW1hY19tZGlvLmMKaW5kZXggMDU4NDYwYi4uYTIyNDAzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXJjL2VtYWNfbWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FyYy9lbWFjX21kaW8uYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgKiBAYnVzOiBwb2ludHMgdG8gdGhlIG1paV9idXMgc3RydWN0dXJlCiAgKiBEZXNjcmlwdGlvbjogcmVzZXQgdGhlIE1JSSBidXMKICAqLwotaW50IGFyY19tZGlvX3Jlc2V0KHN0cnVjdCBtaWlfYnVzICpidXMpCitzdGF0aWMgaW50IGFyY19tZGlvX3Jlc2V0KHN0cnVjdCBtaWlfYnVzICpidXMpCiB7CiAJc3RydWN0IGFyY19lbWFjX3ByaXYgKnByaXYgPSBidXMtPnByaXY7CiAJc3RydWN0IGFyY19lbWFjX21kaW9fYnVzX2RhdGEgKmRhdGEgPSAmcHJpdi0+YnVzX2RhdGE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9hbHguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2FseC5oCmluZGV4IDhmYzkzYzUuLjZjYWM5MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2FseC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2FseC5oCkBAIC03NiwxMSArNzYsMTkgQEAKIAlBTFhfREVWX1FVSVJLX01TSV9JTlRYX0RJU0FCTEVfQlVHID0gQklUKDApLAogfTsKIAorI2RlZmluZSBBTFhfRkxBR19VU0lOR19NU0lYCUJJVCgwKQorI2RlZmluZSBBTFhfRkxBR19VU0lOR19NU0kJQklUKDEpCisKIHN0cnVjdCBhbHhfcHJpdiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAogCXN0cnVjdCBhbHhfaHcgaHc7CiAKKwkvKiBtc2kteCB2ZWN0b3JzICovCisJaW50IG51bV92ZWM7CisJc3RydWN0IG1zaXhfZW50cnkgKm1zaXhfZW50cmllczsKKwljaGFyIGlycV9sYmxbSUZOQU1TSVogKyA4XTsKKwogCS8qIGFsbCBkZXNjcmlwdG9yIG1lbW9yeSAqLwogCXN0cnVjdCB7CiAJCWRtYV9hZGRyX3QgZG1hOwpAQCAtMTA1LDcgKzExMyw3IEBACiAKIAl1MTYgbXNnX2VuYWJsZTsKIAotCWJvb2wgbXNpOworCWludCBmbGFnczsKIAogCS8qIHByb3RlY3RzIGh3LnN0YXRzICovCiAJc3BpbmxvY2tfdCBzdGF0c19sb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvaHcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2h3LmMKaW5kZXggMWZlMzVlNC4uNmFjNDBiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvaHcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9ody5jCkBAIC0xMDMxLDYgKzEwMzEsMjAgQEAKIAlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9XUlIsIHZhbCk7CiB9CiAKK3ZvaWQgYWx4X21hc2tfbXNpeChzdHJ1Y3QgYWx4X2h3ICpodywgaW50IGluZGV4LCBib29sIG1hc2spCit7CisJdTMyIHJlZywgdmFsOworCisJcmVnID0gQUxYX01TSVhfRU5UUllfQkFTRSArIGluZGV4ICogUENJX01TSVhfRU5UUllfU0laRSArCisJCVBDSV9NU0lYX0VOVFJZX1ZFQ1RPUl9DVFJMOworCisJdmFsID0gbWFzayA/IFBDSV9NU0lYX0VOVFJZX0NUUkxfTUFTS0JJVCA6IDA7CisKKwlhbHhfd3JpdGVfbWVtMzIoaHcsIHJlZywgdmFsKTsKKwlhbHhfcG9zdF93cml0ZShodyk7Cit9CisKKwogYm9vbCBhbHhfZ2V0X3BoeV9pbmZvKHN0cnVjdCBhbHhfaHcgKmh3KQogewogCXUxNiAgZGV2czEsIGRldnMyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvaHcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L2h3LmgKaW5kZXggZjI4OWMwNS4uMDE5MTQ3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvaHcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9ody5oCkBAIC01NjIsNiArNTYyLDcgQEAKIHZvaWQgYWx4X3NldF9tYWNhZGRyKHN0cnVjdCBhbHhfaHcgKmh3LCBjb25zdCB1OCAqYWRkcik7CiBib29sIGFseF9waHlfY29uZmlndXJlZChzdHJ1Y3QgYWx4X2h3ICpodyk7CiB2b2lkIGFseF9jb25maWd1cmVfYmFzaWMoc3RydWN0IGFseF9odyAqaHcpOwordm9pZCBhbHhfbWFza19tc2l4KHN0cnVjdCBhbHhfaHcgKmh3LCBpbnQgaW5kZXgsIGJvb2wgbWFzayk7CiB2b2lkIGFseF9kaXNhYmxlX3JzcyhzdHJ1Y3QgYWx4X2h3ICpodyk7CiBib29sIGFseF9nZXRfcGh5X2luZm8oc3RydWN0IGFseF9odyAqaHcpOwogdm9pZCBhbHhfdXBkYXRlX2h3X3N0YXRzKHN0cnVjdCBhbHhfaHcgKmh3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L21haW4uYwppbmRleCA2NDUzMTQ4Li5jMGY4NGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hbHgvbWFpbi5jCkBAIC01MSw2ICs1MSw5IEBACiAKIGNvbnN0IGNoYXIgYWx4X2Rydl9uYW1lW10gPSAiYWx4IjsKIAorc3RhdGljIGJvb2wgbXNpeCA9IGZhbHNlOworbW9kdWxlX3BhcmFtKG1zaXgsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhtc2l4LCAiRW5hYmxlIG1zaS14IGludGVycnVwdCBzdXBwb3J0Iik7CiAKIHN0YXRpYyB2b2lkIGFseF9mcmVlX3R4YnVmKHN0cnVjdCBhbHhfcHJpdiAqYWx4LCBpbnQgZW50cnkpCiB7CkBAIC0yOTIsMzIgKzI5NSwyOSBAQAogCW5hcGlfY29tcGxldGUoJmFseC0+bmFwaSk7CiAKIAkvKiBlbmFibGUgaW50ZXJydXB0ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFseC0+aXJxX2xvY2ssIGZsYWdzKTsKLQlhbHgtPmludF9tYXNrIHw9IEFMWF9JU1JfVFhfUTAgfCBBTFhfSVNSX1JYX1EwOwotCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lNUiwgYWx4LT5pbnRfbWFzayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWx4LT5pcnFfbG9jaywgZmxhZ3MpOworCWlmIChhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJWCkgeworCQlhbHhfbWFza19tc2l4KGh3LCAxLCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFseC0+aXJxX2xvY2ssIGZsYWdzKTsKKwkJYWx4LT5pbnRfbWFzayB8PSBBTFhfSVNSX1RYX1EwIHwgQUxYX0lTUl9SWF9RMDsKKwkJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSU1SLCBhbHgtPmludF9tYXNrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWx4LT5pcnFfbG9jaywgZmxhZ3MpOworCX0KIAogCWFseF9wb3N0X3dyaXRlKGh3KTsKIAogCXJldHVybiB3b3JrOwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWx4X2ludHJfaGFuZGxlKHN0cnVjdCBhbHhfcHJpdiAqYWx4LCB1MzIgaW50cikKK3N0YXRpYyBib29sIGFseF9pbnRyX2hhbmRsZV9taXNjKHN0cnVjdCBhbHhfcHJpdiAqYWx4LCB1MzIgaW50cikKIHsKIAlzdHJ1Y3QgYWx4X2h3ICpodyA9ICZhbHgtPmh3OwotCWJvb2wgd3JpdGVfaW50X21hc2sgPSBmYWxzZTsKLQotCXNwaW5fbG9jaygmYWx4LT5pcnFfbG9jayk7Ci0KLQkvKiBBQ0sgaW50ZXJydXB0ICovCi0JYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSVNSLCBpbnRyIHwgQUxYX0lTUl9ESVMpOwotCWludHIgJj0gYWx4LT5pbnRfbWFzazsKIAogCWlmIChpbnRyICYgQUxYX0lTUl9GQVRBTCkgewogCQluZXRpZl93YXJuKGFseCwgaHcsIGFseC0+ZGV2LAogCQkJICAgImZhdGFsIGludGVycnVwdCAweCV4LCByZXNldHRpbmdcbiIsIGludHIpOwogCQlhbHhfc2NoZWR1bGVfcmVzZXQoYWx4KTsKLQkJZ290byBvdXQ7CisJCXJldHVybiB0cnVlOwogCX0KIAogCWlmIChpbnRyICYgQUxYX0lTUl9BTEVSVCkKQEAgLTMyOSwxOSArMzI5LDMyIEBACiAJCSAqIGlzIGNsZWFyZWQsIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGNvdWxkIGJlIGNsZWFyZWQuCiAJCSAqLwogCQlhbHgtPmludF9tYXNrICY9IH5BTFhfSVNSX1BIWTsKLQkJd3JpdGVfaW50X21hc2sgPSB0cnVlOworCQlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JTVIsIGFseC0+aW50X21hc2spOwogCQlhbHhfc2NoZWR1bGVfbGlua19jaGVjayhhbHgpOwogCX0KIAorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlycXJldHVybl90IGFseF9pbnRyX2hhbmRsZShzdHJ1Y3QgYWx4X3ByaXYgKmFseCwgdTMyIGludHIpCit7CisJc3RydWN0IGFseF9odyAqaHcgPSAmYWx4LT5odzsKKworCXNwaW5fbG9jaygmYWx4LT5pcnFfbG9jayk7CisKKwkvKiBBQ0sgaW50ZXJydXB0ICovCisJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSVNSLCBpbnRyIHwgQUxYX0lTUl9ESVMpOworCWludHIgJj0gYWx4LT5pbnRfbWFzazsKKworCWlmIChhbHhfaW50cl9oYW5kbGVfbWlzYyhhbHgsIGludHIpKQorCQlnb3RvIG91dDsKKwogCWlmIChpbnRyICYgKEFMWF9JU1JfVFhfUTAgfCBBTFhfSVNSX1JYX1EwKSkgewogCQluYXBpX3NjaGVkdWxlKCZhbHgtPm5hcGkpOwogCQkvKiBtYXNrIHJ4L3R4IGludGVycnVwdCwgZW5hYmxlIHRoZW0gd2hlbiBuYXBpIGNvbXBsZXRlICovCiAJCWFseC0+aW50X21hc2sgJj0gfkFMWF9JU1JfQUxMX1FVRVVFUzsKLQkJd3JpdGVfaW50X21hc2sgPSB0cnVlOwotCX0KLQotCWlmICh3cml0ZV9pbnRfbWFzaykKIAkJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSU1SLCBhbHgtPmludF9tYXNrKTsKKwl9CiAKIAlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JU1IsIDApOwogCkBAIC0zNTAsNiArMzYzLDQ2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3QgYWx4X2ludHJfbXNpeF9yaW5nKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFseF9wcml2ICphbHggPSBkYXRhOworCXN0cnVjdCBhbHhfaHcgKmh3ID0gJmFseC0+aHc7CisKKwkvKiBtYXNrIGludGVycnVwdCB0byBBQ0sgY2hpcCAqLworCWFseF9tYXNrX21zaXgoaHcsIDEsIHRydWUpOworCS8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKwlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JU1IsIChBTFhfSVNSX1RYX1EwIHwgQUxYX0lTUl9SWF9RMCkpOworCisJbmFwaV9zY2hlZHVsZSgmYWx4LT5uYXBpKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGFseF9pbnRyX21zaXhfbWlzYyhpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhbHhfcHJpdiAqYWx4ID0gZGF0YTsKKwlzdHJ1Y3QgYWx4X2h3ICpodyA9ICZhbHgtPmh3OworCXUzMiBpbnRyOworCisJLyogbWFzayBpbnRlcnJ1cHQgdG8gQUNLIGNoaXAgKi8KKwlhbHhfbWFza19tc2l4KGh3LCAwLCB0cnVlKTsKKworCS8qIHJlYWQgaW50ZXJydXB0IHN0YXR1cyAqLworCWludHIgPSBhbHhfcmVhZF9tZW0zMihodywgQUxYX0lTUik7CisJaW50ciAmPSAoYWx4LT5pbnRfbWFzayAmIH5BTFhfSVNSX0FMTF9RVUVVRVMpOworCisJaWYgKGFseF9pbnRyX2hhbmRsZV9taXNjKGFseCwgaW50cikpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCS8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKwlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JU1IsIGludHIpOworCisJLyogZW5hYmxlIGludGVycnVwdCBhZ2FpbiAqLworCWFseF9tYXNrX21zaXgoaHcsIDAsIGZhbHNlKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogc3RhdGljIGlycXJldHVybl90IGFseF9pbnRyX21zaShpbnQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBhbHhfcHJpdiAqYWx4ID0gZGF0YTsKQEAgLTYxNCwzMSArNjY3LDEzNiBAQAogc3RhdGljIHZvaWQgYWx4X2NvbmZpZ192ZWN0b3JfbWFwcGluZyhzdHJ1Y3QgYWx4X3ByaXYgKmFseCkKIHsKIAlzdHJ1Y3QgYWx4X2h3ICpodyA9ICZhbHgtPmh3OworCXUzMiB0YmwgPSAwOwogCi0JYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfTVNJX01BUF9UQkwxLCAwKTsKKwlpZiAoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSVgpIHsKKwkJdGJsIHw9IDEgPDwgQUxYX01TSV9NQVBfVEJMMV9UWFEwX1NISUZUOworCQl0YmwgfD0gMSA8PCBBTFhfTVNJX01BUF9UQkwxX1JYUTBfU0hJRlQ7CisJfQorCisJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfTVNJX01BUF9UQkwxLCB0YmwpOwogCWFseF93cml0ZV9tZW0zMihodywgQUxYX01TSV9NQVBfVEJMMiwgMCk7CiAJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfTVNJX0lEX01BUCwgMCk7CiB9CiAKK3N0YXRpYyBib29sIGFseF9lbmFibGVfbXNpeChzdHJ1Y3QgYWx4X3ByaXYgKmFseCkKK3sKKwlpbnQgaSwgZXJyLCBudW1fdmVjID0gMjsKKworCWFseC0+bXNpeF9lbnRyaWVzID0ga2NhbGxvYyhudW1fdmVjLCBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWFseC0+bXNpeF9lbnRyaWVzKSB7CisJCW5ldGRldl93YXJuKGFseC0+ZGV2LCAiQWxsb2NhdGlvbiBvZiBtc2l4IGVudHJpZXMgZmFpbGVkIVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3ZlYzsgaSsrKQorCQlhbHgtPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CisKKwllcnIgPSBwY2lfZW5hYmxlX21zaXgoYWx4LT5ody5wZGV2LCBhbHgtPm1zaXhfZW50cmllcywgbnVtX3ZlYyk7CisJaWYgKGVycikgeworCQlrZnJlZShhbHgtPm1zaXhfZW50cmllcyk7CisJCW5ldGRldl93YXJuKGFseC0+ZGV2LCAiRW5hYmxpbmcgTVNJLVggaW50ZXJydXB0cyBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWFseC0+bnVtX3ZlYyA9IG51bV92ZWM7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgYWx4X3JlcXVlc3RfbXNpeChzdHJ1Y3QgYWx4X3ByaXYgKmFseCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWx4LT5kZXY7CisJaW50IGksIGVyciwgdmVjdG9yID0gMCwgZnJlZV92ZWN0b3IgPSAwOworCisJZXJyID0gcmVxdWVzdF9pcnEoYWx4LT5tc2l4X2VudHJpZXNbMF0udmVjdG9yLCBhbHhfaW50cl9tc2l4X21pc2MsCisJCQkgIDAsIG5ldGRldi0+bmFtZSwgYWx4KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwl2ZWN0b3IrKzsKKwlzcHJpbnRmKGFseC0+aXJxX2xibCwgIiVzLVR4UngtMCIsIG5ldGRldi0+bmFtZSk7CisKKwllcnIgPSByZXF1ZXN0X2lycShhbHgtPm1zaXhfZW50cmllc1t2ZWN0b3JdLnZlY3RvciwKKwkJCSAgYWx4X2ludHJfbXNpeF9yaW5nLCAwLCBhbHgtPmlycV9sYmwsIGFseCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9mcmVlOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCWZyZWVfaXJxKGFseC0+bXNpeF9lbnRyaWVzW2ZyZWVfdmVjdG9yKytdLnZlY3RvciwgYWx4KTsKKworCXZlY3Rvci0tOworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3I7IGkrKykKKwkJZnJlZV9pcnEoYWx4LT5tc2l4X2VudHJpZXNbZnJlZV92ZWN0b3IrK10udmVjdG9yLCBhbHgpOworCitvdXRfZXJyOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGFseF9pbml0X2ludHIoc3RydWN0IGFseF9wcml2ICphbHgsIGJvb2wgbXNpeCkKK3sKKwlpZiAobXNpeCkgeworCQlpZiAoYWx4X2VuYWJsZV9tc2l4KGFseCkpCisJCQlhbHgtPmZsYWdzIHw9IEFMWF9GTEFHX1VTSU5HX01TSVg7CisJfQorCisJaWYgKCEoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSVgpKSB7CisJCWFseC0+bnVtX3ZlYyA9IDE7CisKKwkJaWYgKCFwY2lfZW5hYmxlX21zaShhbHgtPmh3LnBkZXYpKQorCQkJYWx4LT5mbGFncyB8PSBBTFhfRkxBR19VU0lOR19NU0k7CisJfQorfQorCitzdGF0aWMgdm9pZCBhbHhfZGlzYWJsZV9hZHZhbmNlZF9pbnRyKHN0cnVjdCBhbHhfcHJpdiAqYWx4KQoreworCWlmIChhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJWCkgeworCQlrZnJlZShhbHgtPm1zaXhfZW50cmllcyk7CisJCXBjaV9kaXNhYmxlX21zaXgoYWx4LT5ody5wZGV2KTsKKwkJYWx4LT5mbGFncyAmPSB+QUxYX0ZMQUdfVVNJTkdfTVNJWDsKKwl9CisKKwlpZiAoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSSkgeworCQlwY2lfZGlzYWJsZV9tc2koYWx4LT5ody5wZGV2KTsKKwkJYWx4LT5mbGFncyAmPSB+QUxYX0ZMQUdfVVNJTkdfTVNJOworCX0KK30KKwogc3RhdGljIHZvaWQgYWx4X2lycV9lbmFibGUoc3RydWN0IGFseF9wcml2ICphbHgpCiB7CiAJc3RydWN0IGFseF9odyAqaHcgPSAmYWx4LT5odzsKKwlpbnQgaTsKIAogCS8qIGxldmVsLTEgaW50ZXJydXB0IHN3aXRjaCAqLwogCWFseF93cml0ZV9tZW0zMihodywgQUxYX0lTUiwgMCk7CiAJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfSU1SLCBhbHgtPmludF9tYXNrKTsKIAlhbHhfcG9zdF93cml0ZShodyk7CisKKwlpZiAoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSVgpCisJCS8qIGVuYWJsZSBhbGwgbXNpeCBpcnFzICovCisJCWZvciAoaSA9IDA7IGkgPCBhbHgtPm51bV92ZWM7IGkrKykKKwkJCWFseF9tYXNrX21zaXgoaHcsIGksIGZhbHNlKTsKIH0KIAogc3RhdGljIHZvaWQgYWx4X2lycV9kaXNhYmxlKHN0cnVjdCBhbHhfcHJpdiAqYWx4KQogewogCXN0cnVjdCBhbHhfaHcgKmh3ID0gJmFseC0+aHc7CisJaW50IGk7CiAKIAlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JU1IsIEFMWF9JU1JfRElTKTsKIAlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9JTVIsIDApOwogCWFseF9wb3N0X3dyaXRlKGh3KTsKIAotCXN5bmNocm9uaXplX2lycShhbHgtPmh3LnBkZXYtPmlycSk7CisJaWYgKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0lYKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhbHgtPm51bV92ZWM7IGkrKykgeworCQkJYWx4X21hc2tfbXNpeChodywgaSwgdHJ1ZSk7CisJCQlzeW5jaHJvbml6ZV9pcnEoYWx4LT5tc2l4X2VudHJpZXNbaV0udmVjdG9yKTsKKwkJfQorCX0gZWxzZSB7CisJCXN5bmNocm9uaXplX2lycShhbHgtPmh3LnBkZXYtPmlycSk7CisJfQogfQogCiBzdGF0aWMgaW50IGFseF9yZXF1ZXN0X2lycShzdHJ1Y3QgYWx4X3ByaXYgKmFseCkKQEAgLTY1MCw5ICs4MDgsMTggQEAKIAogCW1zaV9jdHJsID0gKGh3LT5pbXQgPj4gMSkgPDwgQUxYX01TSV9SRVRSQU5TX1RNX1NISUZUOwogCi0JaWYgKCFwY2lfZW5hYmxlX21zaShhbHgtPmh3LnBkZXYpKSB7Ci0JCWFseC0+bXNpID0gdHJ1ZTsKKwlpZiAoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSVgpIHsKKwkJYWx4X3dyaXRlX21lbTMyKGh3LCBBTFhfTVNJX1JFVFJBTlNfVElNRVIsIG1zaV9jdHJsKTsKKwkJZXJyID0gYWx4X3JlcXVlc3RfbXNpeChhbHgpOworCQlpZiAoIWVycikKKwkJCWdvdG8gb3V0OwogCisJCS8qIG1zaXggcmVxdWVzdCBmYWlsZWQsIHJlYWxsb2MgcmVzb3VyY2VzICovCisJCWFseF9kaXNhYmxlX2FkdmFuY2VkX2ludHIoYWx4KTsKKwkJYWx4X2luaXRfaW50cihhbHgsIGZhbHNlKTsKKwl9CisKKwlpZiAoYWx4LT5mbGFncyAmIEFMWF9GTEFHX1VTSU5HX01TSSkgewogCQlhbHhfd3JpdGVfbWVtMzIoaHcsIEFMWF9NU0lfUkVUUkFOU19USU1FUiwKIAkJCQltc2lfY3RybCB8IEFMWF9NU0lfTUFTS19TRUxfTElORSk7CiAJCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgYWx4X2ludHJfbXNpLCAwLApAQCAtNjYwLDYgKzgyNyw3IEBACiAJCWlmICghZXJyKQogCQkJZ290byBvdXQ7CiAJCS8qIGZhbGwgYmFjayB0byBsZWdhY3kgaW50ZXJydXB0ICovCisJCWFseC0+ZmxhZ3MgJj0gfkFMWF9GTEFHX1VTSU5HX01TSTsKIAkJcGNpX2Rpc2FibGVfbXNpKGFseC0+aHcucGRldik7CiAJfQogCkBAIC02NjksMTkgKzgzNywyNSBAQAogb3V0OgogCWlmICghZXJyKQogCQlhbHhfY29uZmlnX3ZlY3Rvcl9tYXBwaW5nKGFseCk7CisJZWxzZQorCQluZXRkZXZfZXJyKGFseC0+ZGV2LCAiSVJRIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBhbHhfZnJlZV9pcnEoc3RydWN0IGFseF9wcml2ICphbHgpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhbHgtPmh3LnBkZXY7CisJaW50IGk7CiAKLQlmcmVlX2lycShwZGV2LT5pcnEsIGFseCk7Ci0KLQlpZiAoYWx4LT5tc2kpIHsKLQkJcGNpX2Rpc2FibGVfbXNpKGFseC0+aHcucGRldik7Ci0JCWFseC0+bXNpID0gZmFsc2U7CisJaWYgKGFseC0+ZmxhZ3MgJiBBTFhfRkxBR19VU0lOR19NU0lYKSB7CisJCS8qIHdlIGhhdmUgb25seSAyIHZlY3RvcnMgd2l0aG91dCBtdWx0aSBxdWV1ZSBzdXBwb3J0ICovCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCQlmcmVlX2lycShhbHgtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IsIGFseCk7CisJfSBlbHNlIHsKKwkJZnJlZV9pcnEocGRldi0+aXJxLCBhbHgpOwogCX0KKworCWFseF9kaXNhYmxlX2FkdmFuY2VkX2ludHIoYWx4KTsKIH0KIAogc3RhdGljIGludCBhbHhfaWRlbnRpZnlfaHcoc3RydWN0IGFseF9wcml2ICphbHgpCkBAIC04NDcsMTIgKzEwMjEsMTQgQEAKIHsKIAlpbnQgZXJyOwogCisJYWx4X2luaXRfaW50cihhbHgsIG1zaXgpOworCiAJaWYgKCFyZXN1bWUpCiAJCW5ldGlmX2NhcnJpZXJfb2ZmKGFseC0+ZGV2KTsKIAogCWVyciA9IGFseF9hbGxvY19yaW5ncyhhbHgpOwogCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CisJCWdvdG8gb3V0X2Rpc2FibGVfYWR2X2ludHI7CiAKIAlhbHhfY29uZmlndXJlKGFseCk7CiAKQEAgLTg3Myw2ICsxMDQ5LDggQEAKIAogb3V0X2ZyZWVfcmluZ3M6CiAJYWx4X2ZyZWVfcmluZ3MoYWx4KTsKK291dF9kaXNhYmxlX2Fkdl9pbnRyOgorCWFseF9kaXNhYmxlX2FkdmFuY2VkX2ludHIoYWx4KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC05OTMsNiArMTE3MSwxOCBAQAogCXJ0bmxfdW5sb2NrKCk7CiB9CiAKK3N0YXRpYyBpbnQgYWx4X3RwZF9yZXEoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgbnVtOworCisJbnVtID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDE7CisJLyogd2UgbmVlZCBvbmUgZXh0cmEgZGVzY3JpcHRvciBmb3IgTFNPdjIgKi8KKwlpZiAoc2tiX2lzX2dzbyhza2IpICYmIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUFY2KQorCQludW0rKzsKKworCXJldHVybiBudW07Cit9CisKIHN0YXRpYyBpbnQgYWx4X3R4X2NzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGFseF90eGQgKmZpcnN0KQogewogCXU4IGNzbywgY3NzOwpAQCAtMTAxMiw2ICsxMjAyLDQ1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYWx4X3RzbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYWx4X3R4ZCAqZmlyc3QpCit7CisJaW50IGVycjsKKworCWlmIChza2ItPmlwX3N1bW1lZCAhPSBDSEVDS1NVTV9QQVJUSUFMKQorCQlyZXR1cm4gMDsKKworCWlmICghc2tiX2lzX2dzbyhza2IpKQorCQlyZXR1cm4gMDsKKworCWVyciA9IHNrYl9jb3dfaGVhZChza2IsIDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisKKwkJaXBoLT5jaGVjayA9IDA7CisJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKKwkJCQkJCQkgMCwgSVBQUk9UT19UQ1AsIDApOworCQlmaXJzdC0+d29yZDEgfD0gMSA8PCBUUERfSVBWNF9TSElGVDsKKwl9IGVsc2UgaWYgKHNrYl9pc19nc29fdjYoc2tiKSkgeworCQlpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbiA9IDA7CisJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJCSAgICAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCQkgICAgICAgMCwgSVBQUk9UT19UQ1AsIDApOworCQkvKiBMU092MjogdGhlIGZpcnN0IFRQRCBvbmx5IHByb3ZpZGVzIHRoZSBwYWNrZXQgbGVuZ3RoICovCisJCWZpcnN0LT5hZHJsLmwucGt0X2xlbiA9IHNrYi0+bGVuOworCQlmaXJzdC0+d29yZDEgfD0gMSA8PCBUUERfTFNPX1YyX1NISUZUOworCX0KKworCWZpcnN0LT53b3JkMSB8PSAxIDw8IFRQRF9MU09fRU5fU0hJRlQ7CisJZmlyc3QtPndvcmQxIHw9IChza2JfdHJhbnNwb3J0X29mZnNldChza2IpICYKKwkJCSBUUERfTDRIRFJPRkZTRVRfTUFTSykgPDwgVFBEX0w0SERST0ZGU0VUX1NISUZUOworCWZpcnN0LT53b3JkMSB8PSAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSAmCisJCQkgVFBEX01TU19NQVNLKSA8PCBUUERfTVNTX1NISUZUOworCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50IGFseF9tYXBfdHhfc2tiKHN0cnVjdCBhbHhfcHJpdiAqYWx4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBhbHhfdHhfcXVldWUgKnR4cSA9ICZhbHgtPnR4cTsKQEAgLTEwMjIsNiArMTI1MSwxNiBAQAogCWZpcnN0X3RwZCA9ICZ0eHEtPnRwZFt0eHEtPndyaXRlX2lkeF07CiAJdHBkID0gZmlyc3RfdHBkOwogCisJaWYgKHRwZC0+d29yZDEgJiAoMSA8PCBUUERfTFNPX1YyX1NISUZUKSkgeworCQlpZiAoKyt0eHEtPndyaXRlX2lkeCA9PSBhbHgtPnR4X3JpbmdzeikKKwkJCXR4cS0+d3JpdGVfaWR4ID0gMDsKKworCQl0cGQgPSAmdHhxLT50cGRbdHhxLT53cml0ZV9pZHhdOworCQl0cGQtPmxlbiA9IGZpcnN0X3RwZC0+bGVuOworCQl0cGQtPnZsYW5fdGFnID0gZmlyc3RfdHBkLT52bGFuX3RhZzsKKwkJdHBkLT53b3JkMSA9IGZpcnN0X3RwZC0+d29yZDE7CisJfQorCiAJbWFwbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKIAlkbWEgPSBkbWFfbWFwX3NpbmdsZSgmYWx4LT5ody5wZGV2LT5kZXYsIHNrYi0+ZGF0YSwgbWFwbGVuLAogCQkJICAgICBETUFfVE9fREVWSUNFKTsKQEAgLTEwODIsOSArMTMyMSw5IEBACiAJc3RydWN0IGFseF9wcml2ICphbHggPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBhbHhfdHhfcXVldWUgKnR4cSA9ICZhbHgtPnR4cTsKIAlzdHJ1Y3QgYWx4X3R4ZCAqZmlyc3Q7Ci0JaW50IHRwZHJlcSA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxOworCWludCB0c287CiAKLQlpZiAoYWx4X3RwZF9hdmFpbChhbHgpIDwgdHBkcmVxKSB7CisJaWYgKGFseF90cGRfYXZhaWwoYWx4KSA8IGFseF90cGRfcmVxKHNrYikpIHsKIAkJbmV0aWZfc3RvcF9xdWV1ZShhbHgtPmRldik7CiAJCWdvdG8gZHJvcDsKIAl9CkBAIC0xMDkyLDcgKzEzMzEsMTAgQEAKIAlmaXJzdCA9ICZ0eHEtPnRwZFt0eHEtPndyaXRlX2lkeF07CiAJbWVtc2V0KGZpcnN0LCAwLCBzaXplb2YoKmZpcnN0KSk7CiAKLQlpZiAoYWx4X3R4X2NzdW0oc2tiLCBmaXJzdCkpCisJdHNvID0gYWx4X3Rzbyhza2IsIGZpcnN0KTsKKwlpZiAodHNvIDwgMCkKKwkJZ290byBkcm9wOworCWVsc2UgaWYgKCF0c28gJiYgYWx4X3R4X2NzdW0oc2tiLCBmaXJzdCkpCiAJCWdvdG8gZHJvcDsKIAogCWlmIChhbHhfbWFwX3R4X3NrYihhbHgsIHNrYikgPCAwKQpAQCAtMTE3Miw3ICsxNDE0LDEwIEBACiB7CiAJc3RydWN0IGFseF9wcml2ICphbHggPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0JaWYgKGFseC0+bXNpKQorCWlmIChhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJWCkgeworCQlhbHhfaW50cl9tc2l4X21pc2MoMCwgYWx4KTsKKwkJYWx4X2ludHJfbXNpeF9yaW5nKDAsIGFseCk7CisJfSBlbHNlIGlmIChhbHgtPmZsYWdzICYgQUxYX0ZMQUdfVVNJTkdfTVNJKQogCQlhbHhfaW50cl9tc2koMCwgYWx4KTsKIAllbHNlCiAJCWFseF9pbnRyX2xlZ2FjeSgwLCBhbHgpOwpAQCAtMTM1MSw3ICsxNTk2LDEwIEBACiAJCX0KIAl9CiAKLQluZXRkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTTsKKwluZXRkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8CisJCQkgICAgICBORVRJRl9GX0hXX0NTVU0gfAorCQkJICAgICAgTkVUSUZfRl9UU08gfAorCQkJICAgICAgTkVUSUZfRl9UU082OwogCiAJaWYgKGFseF9nZXRfcGVybV9tYWNhZGRyKGh3LCBody0+cGVybV9hZGRyKSkgewogCQlkZXZfd2FybigmcGRldi0+ZGV2LApAQCAtMTU0NSw2ICsxNzkzLDggQEAKIAkgIC5kcml2ZXJfZGF0YSA9IEFMWF9ERVZfUVVJUktfTVNJX0lOVFhfRElTQUJMRV9CVUcgfSwKIAl7IFBDSV9WREVWSUNFKEFUVEFOU0lDLCBBTFhfREVWX0lEX0UyNDAwKSwKIAkgIC5kcml2ZXJfZGF0YSA9IEFMWF9ERVZfUVVJUktfTVNJX0lOVFhfRElTQUJMRV9CVUcgfSwKKwl7IFBDSV9WREVWSUNFKEFUVEFOU0lDLCBBTFhfREVWX0lEX0UyNTAwKSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFMWF9ERVZfUVVJUktfTVNJX0lOVFhfRElTQUJMRV9CVUcgfSwKIAl7IFBDSV9WREVWSUNFKEFUVEFOU0lDLCBBTFhfREVWX0lEX0FSODE2MiksCiAJICAuZHJpdmVyX2RhdGEgPSBBTFhfREVWX1FVSVJLX01TSV9JTlRYX0RJU0FCTEVfQlVHIH0sCiAJeyBQQ0lfVkRFVklDRShBVFRBTlNJQywgQUxYX0RFVl9JRF9BUjgxNzEpIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2FseC9yZWcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L3JlZy5oCmluZGV4IDA5NTllNjguLjFmYzJkODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYWx4L3JlZy5oCkBAIC0zOCw2ICszOCw3IEBACiAjZGVmaW5lIEFMWF9ERVZfSURfQVI4MTYxCQkJCTB4MTA5MQogI2RlZmluZSBBTFhfREVWX0lEX0UyMjAwCQkJCTB4ZTA5MQogI2RlZmluZSBBTFhfREVWX0lEX0UyNDAwCQkJCTB4ZTBhMQorI2RlZmluZSBBTFhfREVWX0lEX0UyNTAwCQkJCTB4ZTBiMQogI2RlZmluZSBBTFhfREVWX0lEX0FSODE2MgkJCQkweDEwOTAKICNkZWZpbmUgQUxYX0RFVl9JRF9BUjgxNzEJCQkJMHgxMEExCiAjZGVmaW5lIEFMWF9ERVZfSURfQVI4MTcyCQkJCTB4MTBBMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYjQ0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iNDQuYwppbmRleCA3NGYwYTM3Li4xN2FhMzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iNDQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iNDQuYwpAQCAtMTQ4Niw3ICsxNDg2LDcgQEAKIAliNDRfZW5hYmxlX2ludHMoYnApOwogCiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0VYVEVSTkFMX1BIWSkKLQkJcGh5X3N0YXJ0KGJwLT5waHlkZXYpOworCQlwaHlfc3RhcnQoZGV2LT5waHlkZXYpOwogCiAJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKIG91dDoKQEAgLTE2NTEsNyArMTY1MSw3IEBACiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0VYVEVSTkFMX1BIWSkKLQkJcGh5X3N0b3AoYnAtPnBoeWRldik7CisJCXBoeV9zdG9wKGRldi0+cGh5ZGV2KTsKIAogCW5hcGlfZGlzYWJsZSgmYnAtPm5hcGkpOwogCkBAIC0xODMyLDkwICsxODMyLDEwMCBAQAogCXJldHVybiByOwogfQogCi1zdGF0aWMgaW50IGI0NF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IGI0NF9nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBzdXBwb3J0ZWQsIGFkdmVydGlzaW5nOwogCiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0VYVEVSTkFMX1BIWSkgewotCQlCVUdfT04oIWJwLT5waHlkZXYpOwotCQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChicC0+cGh5ZGV2LCBjbWQpOworCQlCVUdfT04oIWRldi0+cGh5ZGV2KTsKKwkJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19nZXQoZGV2LT5waHlkZXYsIGNtZCk7CiAJfQogCi0JY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX0F1dG9uZWcpOwotCWNtZC0+c3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8Ci0JCQkgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKLQkJCSAgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8Ci0JCQkgIFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwgfAotCQkJICBTVVBQT1JURURfTUlJKTsKKwlzdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX0F1dG9uZWcpOworCXN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQkgICAgICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCB8CisJCSAgICAgIFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYgfAorCQkgICAgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJICAgICAgU1VQUE9SVEVEX01JSSk7CiAKLQljbWQtPmFkdmVydGlzaW5nID0gMDsKKwlhZHZlcnRpc2luZyA9IDA7CiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0FEVl8xMEhBTEYpCi0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGY7CisJCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOwogCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19BRFZfMTBGVUxMKQotCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9GdWxsOworCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKIAlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfQURWXzEwMEhBTEYpCi0JCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmOworCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGY7CiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0FEVl8xMDBGVUxMKQotCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKLQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfUGF1c2UgfCBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7Ci0JZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgKChicC0+ZmxhZ3MgJiBCNDRfRkxBR18xMDBfQkFTRV9UKSA/Ci0JCQkJICAgIFNQRUVEXzEwMCA6IFNQRUVEXzEwKSk7Ci0JY21kLT5kdXBsZXggPSAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRlVMTF9EVVBMRVgpID8KKwkJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOworCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfUGF1c2UgfCBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CisJY21kLT5iYXNlLnNwZWVkID0gKGJwLT5mbGFncyAmIEI0NF9GTEFHXzEwMF9CQVNFX1QpID8KKwkJU1BFRURfMTAwIDogU1BFRURfMTA7CisJY21kLT5iYXNlLmR1cGxleCA9IChicC0+ZmxhZ3MgJiBCNDRfRkxBR19GVUxMX0RVUExFWCkgPwogCQlEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOwotCWNtZC0+cG9ydCA9IDA7Ci0JY21kLT5waHlfYWRkcmVzcyA9IGJwLT5waHlfYWRkcjsKLQljbWQtPnRyYW5zY2VpdmVyID0gKGJwLT5mbGFncyAmIEI0NF9GTEFHX0VYVEVSTkFMX1BIWSkgPwotCQlYQ1ZSX0VYVEVSTkFMIDogWENWUl9JTlRFUk5BTDsKLQljbWQtPmF1dG9uZWcgPSAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRk9SQ0VfTElOSykgPworCWNtZC0+YmFzZS5wb3J0ID0gMDsKKwljbWQtPmJhc2UucGh5X2FkZHJlc3MgPSBicC0+cGh5X2FkZHI7CisJY21kLT5iYXNlLmF1dG9uZWcgPSAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRk9SQ0VfTElOSykgPwogCQlBVVRPTkVHX0RJU0FCTEUgOiBBVVRPTkVHX0VOQUJMRTsKLQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKQotCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKwlpZiAoY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpCisJCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKworCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZShjbWQtPmxpbmtfbW9kZXMuc3VwcG9ydGVkLAorCQkJCQkJc3VwcG9ydGVkKTsKKwlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoY21kLT5saW5rX21vZGVzLmFkdmVydGlzaW5nLAorCQkJCQkJYWR2ZXJ0aXNpbmcpOworCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpewotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCAwKTsKLQkJY21kLT5kdXBsZXggPSAweGZmOworCQljbWQtPmJhc2Uuc3BlZWQgPSAwOworCQljbWQtPmJhc2UuZHVwbGV4ID0gMHhmZjsKIAl9Ci0JY21kLT5tYXh0eHBrdCA9IDA7Ci0JY21kLT5tYXhyeHBrdCA9IDA7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBiNDRfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBiNDRfc2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgc3BlZWQ7CiAJaW50IHJldDsKKwl1MzIgYWR2ZXJ0aXNpbmc7CiAKIAlpZiAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRVhURVJOQUxfUEhZKSB7Ci0JCUJVR19PTighYnAtPnBoeWRldik7CisJCUJVR19PTighZGV2LT5waHlkZXYpOwogCQlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CiAJCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCiAJCQliNDRfc2V0dXBfcGh5KGJwKTsKIAotCQlyZXQgPSBwaHlfZXRodG9vbF9zc2V0KGJwLT5waHlkZXYsIGNtZCk7CisJCXJldCA9IHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQoZGV2LT5waHlkZXYsIGNtZCk7CiAKIAkJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CiAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlzcGVlZCA9IGV0aHRvb2xfY21kX3NwZWVkKGNtZCk7CisJc3BlZWQgPSBjbWQtPmJhc2Uuc3BlZWQ7CisKKwlldGh0b29sX2NvbnZlcnRfbGlua19tb2RlX3RvX2xlZ2FjeV91MzIoJmFkdmVydGlzaW5nLAorCQkJCQkJY21kLT5saW5rX21vZGVzLmFkdmVydGlzaW5nKTsKIAogCS8qIFdlIGRvIG5vdCBzdXBwb3J0IGdpZ2FiaXQuICovCi0JaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewotCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmCisJaWYgKGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJCWlmIChhZHZlcnRpc2luZyAmCiAJCSAgICAoQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8CiAJCSAgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgaWYgKChzcGVlZCAhPSBTUEVFRF8xMDAgJiYKIAkJICAgIHNwZWVkICE9IFNQRUVEXzEwKSB8fAotCQkgICAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYKLQkJICAgIGNtZC0+ZHVwbGV4ICE9IERVUExFWF9GVUxMKSkgeworCQkgICAoY21kLT5iYXNlLmR1cGxleCAhPSBEVVBMRVhfSEFMRiAmJgorCQkgICAgY21kLT5iYXNlLmR1cGxleCAhPSBEVVBMRVhfRlVMTCkpIHsKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKIAotCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwlpZiAoY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKIAkJYnAtPmZsYWdzICY9IH4oQjQ0X0ZMQUdfRk9SQ0VfTElOSyB8CiAJCQkgICAgICAgQjQ0X0ZMQUdfMTAwX0JBU0VfVCB8CiAJCQkgICAgICAgQjQ0X0ZMQUdfRlVMTF9EVVBMRVggfApAQCAtMTkyMywxOSArMTkzMywxOSBAQAogCQkJICAgICAgIEI0NF9GTEFHX0FEVl8xMEZVTEwgfAogCQkJICAgICAgIEI0NF9GTEFHX0FEVl8xMDBIQUxGIHwKIAkJCSAgICAgICBCNDRfRkxBR19BRFZfMTAwRlVMTCk7Ci0JCWlmIChjbWQtPmFkdmVydGlzaW5nID09IDApIHsKKwkJaWYgKGFkdmVydGlzaW5nID09IDApIHsKIAkJCWJwLT5mbGFncyB8PSAoQjQ0X0ZMQUdfQURWXzEwSEFMRiB8CiAJCQkJICAgICAgQjQ0X0ZMQUdfQURWXzEwRlVMTCB8CiAJCQkJICAgICAgQjQ0X0ZMQUdfQURWXzEwMEhBTEYgfAogCQkJCSAgICAgIEI0NF9GTEFHX0FEVl8xMDBGVUxMKTsKIAkJfSBlbHNlIHsKLQkJCWlmIChjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCisJCQlpZiAoYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKIAkJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQURWXzEwSEFMRjsKLQkJCWlmIChjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCQlpZiAoYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKIAkJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQURWXzEwRlVMTDsKLQkJCWlmIChjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQorCQkJaWYgKGFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQogCQkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19BRFZfMTAwSEFMRjsKLQkJCWlmIChjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQkJaWYgKGFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQogCQkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19BRFZfMTAwRlVMTDsKIAkJfQogCX0gZWxzZSB7CkBAIC0xOTQzLDcgKzE5NTMsNyBAQAogCQlicC0+ZmxhZ3MgJj0gfihCNDRfRkxBR18xMDBfQkFTRV9UIHwgQjQ0X0ZMQUdfRlVMTF9EVVBMRVgpOwogCQlpZiAoc3BlZWQgPT0gU1BFRURfMTAwKQogCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHXzEwMF9CQVNFX1Q7Ci0JCWlmIChjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJaWYgKGNtZC0+YmFzZS5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCiAJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfRlVMTF9EVVBMRVg7CiAJfQogCkBAIC0yMTEwLDggKzIxMjAsNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGI0NF9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8JCT0gYjQ0X2dldF9kcnZpbmZvLAotCS5nZXRfc2V0dGluZ3MJCT0gYjQ0X2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IGI0NF9zZXRfc2V0dGluZ3MsCiAJLm53YXlfcmVzZXQJCT0gYjQ0X253YXlfcmVzZXQsCiAJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLmdldF93b2wJCT0gYjQ0X2dldF93b2wsCkBAIC0yMTI1LDYgKzIxMzMsOCBAQAogCS5nZXRfc3RyaW5ncwkJPSBiNDRfZ2V0X3N0cmluZ3MsCiAJLmdldF9zc2V0X2NvdW50CQk9IGI0NF9nZXRfc3NldF9jb3VudCwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBiNDRfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9saW5rX2tzZXR0aW5ncwk9IGI0NF9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncwk9IGI0NF9zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCiBzdGF0aWMgaW50IGI0NF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKQEAgLTIxMzcsOCArMjE0Nyw4IEBACiAKIAlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0VYVEVSTkFMX1BIWSkgewotCQlCVUdfT04oIWJwLT5waHlkZXYpOwotCQllcnIgPSBwaHlfbWlpX2lvY3RsKGJwLT5waHlkZXYsIGlmciwgY21kKTsKKwkJQlVHX09OKCFkZXYtPnBoeWRldik7CisJCWVyciA9IHBoeV9taWlfaW9jdGwoZGV2LT5waHlkZXYsIGlmciwgY21kKTsKIAl9IGVsc2UgewogCQllcnIgPSBnZW5lcmljX21paV9pb2N0bCgmYnAtPm1paV9pZiwgaWZfbWlpKGlmciksIGNtZCwgTlVMTCk7CiAJfQpAQCAtMjIwNiw3ICsyMjE2LDcgQEAKIHN0YXRpYyB2b2lkIGI0NF9hZGp1c3RfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBiNDQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYnAtPnBoeWRldjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gZGV2LT5waHlkZXY7CiAJYm9vbCBzdGF0dXNfY2hhbmdlZCA9IDA7CiAKIAlCVUdfT04oIXBoeWRldik7CkBAIC0yMzAzLDcgKzIzMTMsNiBAQAogCQkJICAgICAgU1VQUE9SVEVEX01JSSk7CiAJcGh5ZGV2LT5hZHZlcnRpc2luZyA9IHBoeWRldi0+c3VwcG9ydGVkOwogCi0JYnAtPnBoeWRldiA9IHBoeWRldjsKIAlicC0+b2xkX2xpbmsgPSAwOwogCWJwLT5waHlfYWRkciA9IHBoeWRldi0+bWRpby5hZGRyOwogCkBAIC0yMzIzLDkgKzIzMzIsMTAgQEAKIAogc3RhdGljIHZvaWQgYjQ0X3VucmVnaXN0ZXJfcGh5X29uZShzdHJ1Y3QgYjQ0ICpicCkKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnAtPmRldjsKIAlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1cyA9IGJwLT5taWlfYnVzOwogCi0JcGh5X2Rpc2Nvbm5lY3QoYnAtPnBoeWRldik7CisJcGh5X2Rpc2Nvbm5lY3QoZGV2LT5waHlkZXYpOwogCW1kaW9idXNfdW5yZWdpc3RlcihtaWlfYnVzKTsKIAltZGlvYnVzX2ZyZWUobWlpX2J1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iNDQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5oCmluZGV4IDY1ZDg4ZDcuLjg5ZDJjZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5oCkBAIC00MDQsNyArNDA0LDYgQEAKIAl1MzIJCQl0eF9wZW5kaW5nOwogCXU4CQkJcGh5X2FkZHI7CiAJdTgJCQlmb3JjZV9jb3B5YnJlYWs7Ci0Jc3RydWN0IHBoeV9kZXZpY2UJKnBoeWRldjsKIAlzdHJ1Y3QgbWlpX2J1cwkJKm1paV9idXM7CiAJaW50CQkJb2xkX2xpbms7CiAJc3RydWN0IG1paV9pZl9pbmZvCW1paV9pZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbTYzeHhfZW5ldC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtNjN4eF9lbmV0LmMKaW5kZXggNmM4YmM1Zi4uYWUzNjRjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtNjN4eF9lbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtNjN4eF9lbmV0LmMKQEAgLTc5MSw3ICs3OTEsNyBAQAogCWludCBzdGF0dXNfY2hhbmdlZDsKIAogCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXBoeWRldiA9IHByaXYtPnBoeWRldjsKKwlwaHlkZXYgPSBkZXYtPnBoeWRldjsKIAlzdGF0dXNfY2hhbmdlZCA9IDA7CiAKIAlpZiAocHJpdi0+b2xkX2xpbmsgIT0gcGh5ZGV2LT5saW5rKSB7CkBAIC05MTMsNyArOTEzLDYgQEAKIAkJcHJpdi0+b2xkX2xpbmsgPSAwOwogCQlwcml2LT5vbGRfZHVwbGV4ID0gLTE7CiAJCXByaXYtPm9sZF9wYXVzZSA9IC0xOwotCQlwcml2LT5waHlkZXYgPSBwaHlkZXY7CiAJfQogCiAJLyogbWFzayBhbGwgaW50ZXJydXB0cyBhbmQgcmVxdWVzdCB0aGVtICovCkBAIC0xMDg1LDcgKzEwODQsNyBAQAogCQkJIEVORVRETUFDX0lSTUFTSywgcHJpdi0+dHhfY2hhbik7CiAKIAlpZiAocHJpdi0+aGFzX3BoeSkKLQkJcGh5X3N0YXJ0KHByaXYtPnBoeWRldik7CisJCXBoeV9zdGFydChwaHlkZXYpOwogCWVsc2UKIAkJYmNtX2VuZXRfYWRqdXN0X2xpbmsoZGV2KTsKIApAQCAtMTEyNyw3ICsxMTI2LDcgQEAKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKIAogb3V0X3BoeV9kaXNjb25uZWN0OgotCXBoeV9kaXNjb25uZWN0KHByaXYtPnBoeWRldik7CisJcGh5X2Rpc2Nvbm5lY3QocGh5ZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMTkwLDcgKzExODksNyBAQAogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAluYXBpX2Rpc2FibGUoJnByaXYtPm5hcGkpOwogCWlmIChwcml2LT5oYXNfcGh5KQotCQlwaHlfc3RvcChwcml2LT5waHlkZXYpOworCQlwaHlfc3RvcChkZXYtPnBoeWRldik7CiAJZGVsX3RpbWVyX3N5bmMoJnByaXYtPnJ4X3RpbWVvdXQpOwogCiAJLyogbWFzayBhbGwgaW50ZXJydXB0cyAqLwpAQCAtMTIzNCwxMCArMTIzMyw4IEBACiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAKIAkvKiByZWxlYXNlIHBoeSAqLwotCWlmIChwcml2LT5oYXNfcGh5KSB7Ci0JCXBoeV9kaXNjb25uZWN0KHByaXYtPnBoeWRldik7Ci0JCXByaXYtPnBoeWRldiA9IE5VTEw7Ci0JfQorCWlmIChwcml2LT5oYXNfcGh5KQorCQlwaHlfZGlzY29ubmVjdChkZXYtPnBoeWRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0MzcsNjQgKzE0MzQsNjggQEAKIAogCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWlmIChwcml2LT5oYXNfcGh5KSB7Ci0JCWlmICghcHJpdi0+cGh5ZGV2KQorCQlpZiAoIWRldi0+cGh5ZGV2KQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCXJldHVybiBnZW5waHlfcmVzdGFydF9hbmVnKHByaXYtPnBoeWRldik7CisJCXJldHVybiBnZW5waHlfcmVzdGFydF9hbmVnKGRldi0+cGh5ZGV2KTsKIAl9CiAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKLXN0YXRpYyBpbnQgYmNtX2VuZXRfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBiY21fZW5ldF9nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgYmNtX2VuZXRfcHJpdiAqcHJpdjsKKwl1MzIgc3VwcG9ydGVkLCBhZHZlcnRpc2luZzsKIAogCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JY21kLT5tYXhyeHBrdCA9IDA7Ci0JY21kLT5tYXh0eHBrdCA9IDA7Ci0KIAlpZiAocHJpdi0+aGFzX3BoeSkgewotCQlpZiAoIXByaXYtPnBoeWRldikKKwkJaWYgKCFkZXYtPnBoeWRldikKIAkJCXJldHVybiAtRU5PREVWOwotCQlyZXR1cm4gcGh5X2V0aHRvb2xfZ3NldChwcml2LT5waHlkZXYsIGNtZCk7CisJCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3NfZ2V0KGRldi0+cGh5ZGV2LCBjbWQpOwogCX0gZWxzZSB7Ci0JCWNtZC0+YXV0b25lZyA9IDA7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsICgocHJpdi0+Zm9yY2Vfc3BlZWRfMTAwKQotCQkJCQkgICAgPyBTUEVFRF8xMDAgOiBTUEVFRF8xMCkpOwotCQljbWQtPmR1cGxleCA9IChwcml2LT5mb3JjZV9kdXBsZXhfZnVsbCkgPworCQljbWQtPmJhc2UuYXV0b25lZyA9IDA7CisJCWNtZC0+YmFzZS5zcGVlZCA9IChwcml2LT5mb3JjZV9zcGVlZF8xMDApID8KKwkJCVNQRUVEXzEwMCA6IFNQRUVEXzEwOworCQljbWQtPmJhc2UuZHVwbGV4ID0gKHByaXYtPmZvcmNlX2R1cGxleF9mdWxsKSA/CiAJCQlEVVBMRVhfRlVMTCA6IERVUExFWF9IQUxGOwotCQljbWQtPnN1cHBvcnRlZCA9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmICB8CisJCXN1cHBvcnRlZCA9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmIHwKIAkJCUFEVkVSVElTRURfMTBiYXNlVF9GdWxsIHwKIAkJCUFEVkVSVElTRURfMTAwYmFzZVRfSGFsZiB8CiAJCQlBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7Ci0JCWNtZC0+YWR2ZXJ0aXNpbmcgPSAwOwotCQljbWQtPnBvcnQgPSBQT1JUX01JSTsKLQkJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7CisJCWFkdmVydGlzaW5nID0gMDsKKwkJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKAorCQkJY21kLT5saW5rX21vZGVzLnN1cHBvcnRlZCwgc3VwcG9ydGVkKTsKKwkJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKAorCQkJY21kLT5saW5rX21vZGVzLmFkdmVydGlzaW5nLCBhZHZlcnRpc2luZyk7CisJCWNtZC0+YmFzZS5wb3J0ID0gUE9SVF9NSUk7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJjbV9lbmV0X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgYmNtX2VuZXRfc2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IGJjbV9lbmV0X3ByaXYgKnByaXY7CiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpZiAocHJpdi0+aGFzX3BoeSkgewotCQlpZiAoIXByaXYtPnBoeWRldikKKwkJaWYgKCFkZXYtPnBoeWRldikKIAkJCXJldHVybiAtRU5PREVWOwotCQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwcml2LT5waHlkZXYsIGNtZCk7CisJCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3Nfc2V0KGRldi0+cGh5ZGV2LCBjbWQpOwogCX0gZWxzZSB7CiAKLQkJaWYgKGNtZC0+YXV0b25lZyB8fAotCQkgICAgKGNtZC0+c3BlZWQgIT0gU1BFRURfMTAwICYmIGNtZC0+c3BlZWQgIT0gU1BFRURfMTApIHx8Ci0JCSAgICBjbWQtPnBvcnQgIT0gUE9SVF9NSUkpCisJCWlmIChjbWQtPmJhc2UuYXV0b25lZyB8fAorCQkgICAgKGNtZC0+YmFzZS5zcGVlZCAhPSBTUEVFRF8xMDAgJiYKKwkJICAgICBjbWQtPmJhc2Uuc3BlZWQgIT0gU1BFRURfMTApIHx8CisJCSAgICBjbWQtPmJhc2UucG9ydCAhPSBQT1JUX01JSSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXByaXYtPmZvcmNlX3NwZWVkXzEwMCA9IChjbWQtPnNwZWVkID09IFNQRUVEXzEwMCkgPyAxIDogMDsKLQkJcHJpdi0+Zm9yY2VfZHVwbGV4X2Z1bGwgPSAoY21kLT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpID8gMSA6IDA7CisJCXByaXYtPmZvcmNlX3NwZWVkXzEwMCA9CisJCQkoY21kLT5iYXNlLnNwZWVkID09IFNQRUVEXzEwMCkgPyAxIDogMDsKKwkJcHJpdi0+Zm9yY2VfZHVwbGV4X2Z1bGwgPQorCQkJKGNtZC0+YmFzZS5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpID8gMSA6IDA7CiAKIAkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJCWJjbV9lbmV0X2FkanVzdF9saW5rKGRldik7CkBAIC0xNTg4LDE0ICsxNTg5LDE0IEBACiAJLmdldF9zc2V0X2NvdW50CQk9IGJjbV9lbmV0X2dldF9zc2V0X2NvdW50LAogCS5nZXRfZXRodG9vbF9zdGF0cyAgICAgID0gYmNtX2VuZXRfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLm53YXlfcmVzZXQJCT0gYmNtX2VuZXRfbndheV9yZXNldCwKLQkuZ2V0X3NldHRpbmdzCQk9IGJjbV9lbmV0X2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IGJjbV9lbmV0X3NldF9zZXR0aW5ncywKIAkuZ2V0X2RydmluZm8JCT0gYmNtX2VuZXRfZ2V0X2RydmluZm8sCiAJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLmdldF9yaW5ncGFyYW0JCT0gYmNtX2VuZXRfZ2V0X3JpbmdwYXJhbSwKIAkuc2V0X3JpbmdwYXJhbQkJPSBiY21fZW5ldF9zZXRfcmluZ3BhcmFtLAogCS5nZXRfcGF1c2VwYXJhbQkJPSBiY21fZW5ldF9nZXRfcGF1c2VwYXJhbSwKIAkuc2V0X3BhdXNlcGFyYW0JCT0gYmNtX2VuZXRfc2V0X3BhdXNlcGFyYW0sCisJLmdldF9saW5rX2tzZXR0aW5ncwk9IGJjbV9lbmV0X2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzCT0gYmNtX2VuZXRfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogc3RhdGljIGludCBiY21fZW5ldF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQpAQCAtMTYwNCw5ICsxNjA1LDkgQEAKIAogCXByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWlmIChwcml2LT5oYXNfcGh5KSB7Ci0JCWlmICghcHJpdi0+cGh5ZGV2KQorCQlpZiAoIWRldi0+cGh5ZGV2KQogCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCXJldHVybiBwaHlfbWlpX2lvY3RsKHByaXYtPnBoeWRldiwgcnEsIGNtZCk7CisJCXJldHVybiBwaHlfbWlpX2lvY3RsKGRldi0+cGh5ZGV2LCBycSwgY21kKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY202M3h4X2VuZXQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbTYzeHhfZW5ldC5oCmluZGV4IGY1NWFmNDMuLjBhMWI3YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbTYzeHhfZW5ldC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbTYzeHhfZW5ldC5oCkBAIC0yOTAsNyArMjkwLDYgQEAKIAogCS8qIHVzZWQgd2hlbiBhIHBoeSBpcyBjb25uZWN0ZWQgKHBoeWxpYiB1c2VkKSAqLwogCXN0cnVjdCBtaWlfYnVzICptaWlfYnVzOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJaW50IG9sZF9saW5rOwogCWludCBvbGRfZHVwbGV4OwogCWludCBvbGRfcGF1c2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY21zeXNwb3J0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iY21zeXNwb3J0LmMKaW5kZXggYjJkMzA4Ni4uYzMzNTRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmNtc3lzcG9ydC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JjbXN5c3BvcnQuYwpAQCAtNTgsOCArNTgsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIGludHJsMl8jI3doaWNoIyNfbWFza19jbGVhcihzdHJ1Y3QgYmNtX3N5c3BvcnRfcHJpdiAqcHJpdiwgXAogCQkJCQkJdTMyIG1hc2spCQlcCiB7CQkJCQkJCQkJXAotCWludHJsMl8jI3doaWNoIyNfd3JpdGVsKHByaXYsIG1hc2ssIElOVFJMMl9DUFVfTUFTS19DTEVBUik7CVwKIAlwcml2LT5pcnEjI3doaWNoIyNfbWFzayAmPSB+KG1hc2spOwkJCQlcCisJaW50cmwyXyMjd2hpY2gjI193cml0ZWwocHJpdiwgbWFzaywgSU5UUkwyX0NQVV9NQVNLX0NMRUFSKTsJXAogfQkJCQkJCQkJCVwKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbnRybDJfIyN3aGljaCMjX21hc2tfc2V0KHN0cnVjdCBiY21fc3lzcG9ydF9wcml2ICpwcml2LCBcCiAJCQkJCQl1MzIgbWFzaykJCVwKQEAgLTE2OTIsNyArMTY5Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYmNtX3N5c3BvcnRfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJjbV9zeXNwb3J0X2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwkJPSBiY21fc3lzcG9ydF9nZXRfZHJ2aW5mbywKIAkuZ2V0X21zZ2xldmVsCQk9IGJjbV9zeXNwb3J0X2dldF9tc2dsdmwsCiAJLnNldF9tc2dsZXZlbAkJPSBiY21fc3lzcG9ydF9zZXRfbXNnbHZsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMtYmNtYS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMtYmNtYS5jCmluZGV4IDlhOTc0NWM0Li5jMTZlYzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy1iY21hLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMtYmNtYS5jCkBAIC05Miw2ICs5Miw3IEBACiAvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvbWFjLWdiaXQvZ21hYy9jaGlwYXR0YWNoICovCiBzdGF0aWMgaW50IGJnbWFjX3Byb2JlKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSkKIHsKKwlzdHJ1Y3QgYmNtYV9jaGlwaW5mbyAqY2kgPSAmY29yZS0+YnVzLT5jaGlwaW5mbzsKIAlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9ICZjb3JlLT5idXMtPnNwcm9tOwogCXN0cnVjdCBtaWlfYnVzICptaWlfYnVzOwogCXN0cnVjdCBiZ21hYyAqYmdtYWM7CkBAIC0xNTcsOSArMTU4LDEwIEBACiAJZGV2X2luZm8oYmdtYWMtPmRldiwgIkZvdW5kIFBIWSBhZGRyOiAlZCVzXG4iLCBiZ21hYy0+cGh5YWRkciwKIAkJIGJnbWFjLT5waHlhZGRyID09IEJHTUFDX1BIWV9OT1JFR1MgPyAiIChOT1JFR1MpIiA6ICIiKTsKIAotCWlmICghYmdtYWNfaXNfYmNtNDcwN19mYW1pbHkoY29yZSkpIHsKKwlpZiAoIWJnbWFjX2lzX2JjbTQ3MDdfZmFtaWx5KGNvcmUpICYmCisJICAgICEoY2ktPmlkID09IEJDTUFfQ0hJUF9JRF9CQ001MzU3MyAmJiBjb3JlLT5jb3JlX3VuaXQgPT0gMSkpIHsKIAkJbWlpX2J1cyA9IGJjbWFfbWRpb19taWlfcmVnaXN0ZXIoY29yZSwgYmdtYWMtPnBoeWFkZHIpOwotCQlpZiAoIUlTX0VSUihtaWlfYnVzKSkgeworCQlpZiAoSVNfRVJSKG1paV9idXMpKSB7CiAJCQllcnIgPSBQVFJfRVJSKG1paV9idXMpOwogCQkJZ290byBlcnI7CiAJCX0KQEAgLTIzMCw2ICsyMzIsMjEgQEAKIAkJYmdtYWMtPmZlYXR1cmVfZmxhZ3MgfD0gQkdNQUNfRkVBVF9OT19SRVNFVDsKIAkJYmdtYWMtPmZlYXR1cmVfZmxhZ3MgfD0gQkdNQUNfRkVBVF9GT1JDRV9TUEVFRF8yNTAwOwogCQlicmVhazsKKwljYXNlIEJDTUFfQ0hJUF9JRF9CQ001MzU3MzoKKwkJYmdtYWMtPmZlYXR1cmVfZmxhZ3MgfD0gQkdNQUNfRkVBVF9DTEtDVExTVDsKKwkJYmdtYWMtPmZlYXR1cmVfZmxhZ3MgfD0gQkdNQUNfRkVBVF9TRVRfUlhRX0NMSzsKKwkJaWYgKGNpLT5wa2cgPT0gQkNNQV9QS0dfSURfQkNNNDcxODkpCisJCQliZ21hYy0+ZmVhdHVyZV9mbGFncyB8PSBCR01BQ19GRUFUX0lPU1RfQVRUQUNIRUQ7CisJCWlmIChjb3JlLT5jb3JlX3VuaXQgPT0gMCkgeworCQkJYmdtYWMtPmZlYXR1cmVfZmxhZ3MgfD0gQkdNQUNfRkVBVF9DQzRfSUZfU1dfVFlQRTsKKwkJCWlmIChjaS0+cGtnID09IEJDTUFfUEtHX0lEX0JDTTQ3MTg5KQorCQkJCWJnbWFjLT5mZWF0dXJlX2ZsYWdzIHw9CisJCQkJCUJHTUFDX0ZFQVRfQ0M0X0lGX1NXX1RZUEVfUkdNSUk7CisJCX0gZWxzZSBpZiAoY29yZS0+Y29yZV91bml0ID09IDEpIHsKKwkJCWJnbWFjLT5mZWF0dXJlX2ZsYWdzIHw9IEJHTUFDX0ZFQVRfSVJRX0lEX09PQl82OworCQkJYmdtYWMtPmZlYXR1cmVfZmxhZ3MgfD0gQkdNQUNfRkVBVF9DQzdfSUZfVFlQRV9SR01JSTsKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQliZ21hYy0+ZmVhdHVyZV9mbGFncyB8PSBCR01BQ19GRUFUX0NMS0NUTFNUOwogCQliZ21hYy0+ZmVhdHVyZV9mbGFncyB8PSBCR01BQ19GRUFUX1NFVF9SWFFfQ0xLOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmMKaW5kZXggYzQ3NTFlYy4uNmVhMGU1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5jCkBAIC05MzIsNyArOTMyLDggQEAKIAkJCWV0X3N3dHlwZSA8PD0gNDsKIAkJCXN3X3R5cGUgPSBldF9zd3R5cGU7CiAJCX0gZWxzZSBpZiAoYmdtYWMtPmZlYXR1cmVfZmxhZ3MgJiBCR01BQ19GRUFUX1NXX1RZUEVfRVBIWVJNSUkpIHsKLQkJCXN3X3R5cGUgPSBCR01BQ19DSElQQ1RMXzFfU1dfVFlQRV9FUEhZUk1JSTsKKwkJCXN3X3R5cGUgPSBCR01BQ19DSElQQ1RMXzFfSUZfVFlQRV9STUlJIHwKKwkJCQkgIEJHTUFDX0NISVBDVExfMV9TV19UWVBFX0VQSFlSTUlJOwogCQl9IGVsc2UgaWYgKGJnbWFjLT5mZWF0dXJlX2ZsYWdzICYgQkdNQUNfRkVBVF9TV19UWVBFX1JHTUlJKSB7CiAJCQlzd190eXBlID0gQkdNQUNfQ0hJUENUTF8xX0lGX1RZUEVfUkdNSUkgfAogCQkJCSAgQkdNQUNfQ0hJUENUTF8xX1NXX1RZUEVfUkdNSUk7CkBAIC05NDAsNiArOTQxLDI3IEBACiAJCWJnbWFjX2Njb19jdGxfbWFza3NldChiZ21hYywgMSwgfihCR01BQ19DSElQQ1RMXzFfSUZfVFlQRV9NQVNLIHwKIAkJCQkJCSAgQkdNQUNfQ0hJUENUTF8xX1NXX1RZUEVfTUFTSyksCiAJCQkJICAgICAgc3dfdHlwZSk7CisJfSBlbHNlIGlmIChiZ21hYy0+ZmVhdHVyZV9mbGFncyAmIEJHTUFDX0ZFQVRfQ0M0X0lGX1NXX1RZUEUpIHsKKwkJdTMyIHN3X3R5cGUgPSBCR01BQ19DSElQQ1RMXzRfSUZfVFlQRV9NSUkgfAorCQkJICAgICAgQkdNQUNfQ0hJUENUTF80X1NXX1RZUEVfRVBIWTsKKwkJdTggZXRfc3d0eXBlID0gMDsKKwkJY2hhciBidWZbNF07CisKKwkJaWYgKGJjbTQ3eHhfbnZyYW1fZ2V0ZW52KCJldF9zd3R5cGUiLCBidWYsIHNpemVvZihidWYpKSA+IDApIHsKKwkJCWlmIChrc3RydG91OChidWYsIDAsICZldF9zd3R5cGUpKQorCQkJCWRldl9lcnIoYmdtYWMtPmRldiwgIkZhaWxlZCB0byBwYXJzZSBldF9zd3R5cGUgKCVzKVxuIiwKKwkJCQkJYnVmKTsKKwkJCXN3X3R5cGUgPSAoZXRfc3d0eXBlICYgMHgwZikgPDwgMTI7CisJCX0gZWxzZSBpZiAoYmdtYWMtPmZlYXR1cmVfZmxhZ3MgJiBCR01BQ19GRUFUX0NDNF9JRl9TV19UWVBFX1JHTUlJKSB7CisJCQlzd190eXBlID0gQkdNQUNfQ0hJUENUTF80X0lGX1RZUEVfUkdNSUkgfAorCQkJCSAgQkdNQUNfQ0hJUENUTF80X1NXX1RZUEVfUkdNSUk7CisJCX0KKwkJYmdtYWNfY2NvX2N0bF9tYXNrc2V0KGJnbWFjLCA0LCB+KEJHTUFDX0NISVBDVExfNF9JRl9UWVBFX01BU0sgfAorCQkJCQkJICBCR01BQ19DSElQQ1RMXzRfU1dfVFlQRV9NQVNLKSwKKwkJCQkgICAgICBzd190eXBlKTsKKwl9IGVsc2UgaWYgKGJnbWFjLT5mZWF0dXJlX2ZsYWdzICYgQkdNQUNfRkVBVF9DQzdfSUZfVFlQRV9SR01JSSkgeworCQliZ21hY19jY29fY3RsX21hc2tzZXQoYmdtYWMsIDcsIH5CR01BQ19DSElQQ1RMXzdfSUZfVFlQRV9NQVNLLAorCQkJCSAgICAgIEJHTUFDX0NISVBDVExfN19JRl9UWVBFX1JHTUlJKTsKIAl9CiAKIAlpZiAoaW9zdCAmIEJHTUFDX0JDTUFfSU9TVF9BVFRBQ0hFRCAmJiAhYmdtYWMtPmhhc19yb2Jvc3cpCkBAIC0xNDY3LDYgKzE0ODksMTAgQEAKIAkgKi8KIAliZ21hY19jbGtfZW5hYmxlKGJnbWFjLCAwKTsKIAorCS8qIFRoaXMgc2VlbXMgdG8gYmUgZml4aW5nIElSUSBieSBhc3NpZ25pbmcgT09CICM2IHRvIHRoZSBjb3JlICovCisJaWYgKGJnbWFjLT5mZWF0dXJlX2ZsYWdzICYgQkdNQUNfRkVBVF9JUlFfSURfT09CXzYpCisJCWJnbWFjX2lkbV93cml0ZShiZ21hYywgQkNNQV9PT0JfU0VMX09VVF9BMzAsIDB4ODYpOworCiAJYmdtYWNfY2hpcF9yZXNldChiZ21hYyk7CiAKIAllcnIgPSBiZ21hY19kbWFfYWxsb2MoYmdtYWMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmgKaW5kZXggMjRhMjUwMi4uODA4MzZiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5oCkBAIC0zNjksNiArMzY5LDIxIEBACiAjZGVmaW5lIEJHTUFDX0NISVBDVExfMV9TV19UWVBFX1JHTUlJCQkweDAwMDAwMEMwCiAjZGVmaW5lIEJHTUFDX0NISVBDVExfMV9SWENfRExMX0JZUEFTUwkJMHgwMDAxMDAwMAogCisjZGVmaW5lIEJHTUFDX0NISVBDVExfNF9JRl9UWVBFX01BU0sJCTB4MDAwMDMwMDAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF80X0lGX1RZUEVfUk1JSQkJMHgwMDAwMDAwMAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzRfSUZfVFlQRV9NSUkJCTB4MDAwMDEwMDAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF80X0lGX1RZUEVfUkdNSUkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF80X1NXX1RZUEVfTUFTSwkJMHgwMDAwQzAwMAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzRfU1dfVFlQRV9FUEhZCQkweDAwMDAwMDAwCisjZGVmaW5lIEJHTUFDX0NISVBDVExfNF9TV19UWVBFX0VQSFlNSUkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF80X1NXX1RZUEVfRVBIWVJNSUkJMHgwMDAwODAwMAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzRfU1dfVFlQRV9SR01JSQkJMHgwMDAwQzAwMAorCisjZGVmaW5lIEJHTUFDX0NISVBDVExfN19JRl9UWVBFX01BU0sJCTB4MDAwMDAwQzAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF83X0lGX1RZUEVfUk1JSQkJMHgwMDAwMDAwMAorI2RlZmluZSBCR01BQ19DSElQQ1RMXzdfSUZfVFlQRV9NSUkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQkdNQUNfQ0hJUENUTF83X0lGX1RZUEVfUkdNSUkJCTB4MDAwMDAwODAKKwogI2RlZmluZSBCR01BQ19XRUlHSFQJNjQKIAogI2RlZmluZSBFVEhFUl9NQVhfTEVOICAgMTUxOApAQCAtMzkwLDYgKzQwNSwxMCBAQAogI2RlZmluZSBCR01BQ19GRUFUX05PX0NMUl9NSUIJCUJJVCgxMykKICNkZWZpbmUgQkdNQUNfRkVBVF9GT1JDRV9TUEVFRF8yNTAwCUJJVCgxNCkKICNkZWZpbmUgQkdNQUNfRkVBVF9DTURDRkdfU1JfUkVWNAlCSVQoMTUpCisjZGVmaW5lIEJHTUFDX0ZFQVRfSVJRX0lEX09PQl82CQlCSVQoMTYpCisjZGVmaW5lIEJHTUFDX0ZFQVRfQ0M0X0lGX1NXX1RZUEUJQklUKDE3KQorI2RlZmluZSBCR01BQ19GRUFUX0NDNF9JRl9TV19UWVBFX1JHTUlJCUJJVCgxOCkKKyNkZWZpbmUgQkdNQUNfRkVBVF9DQzdfSUZfVFlQRV9SR01JSQlCSVQoMTkpCiAKIHN0cnVjdCBiZ21hY19zbG90X2luZm8gewogCXVuaW9uIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuYwppbmRleCA4ZmMzZjNjLi4yN2YxMWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5jCkBAIC01MCw3ICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L2Flci5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfQ05JQykgfHwgZGVmaW5lZChDT05GSUdfQ05JQ19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQ05JQykKICNkZWZpbmUgQkNNX0NOSUMgMQogI2luY2x1ZGUgImNuaWNfaWYuaCIKICNlbmRpZgpAQCAtNjM1NiwxMCArNjM1Niw2IEBACiAJc3RydWN0IGJueDIgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgcmM7CiAKLQlyYyA9IGJueDJfcmVxdWVzdF9maXJtd2FyZShicCk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBvdXQ7Ci0KIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCiAJYm54Ml9kaXNhYmxlX2ludChicCk7CkBAIC02NDI4LDcgKzY0MjQsNiBAQAogCWJueDJfZnJlZV9pcnEoYnApOwogCWJueDJfZnJlZV9tZW0oYnApOwogCWJueDJfZGVsX25hcGkoYnApOwotCWJueDJfcmVsZWFzZV9maXJtd2FyZShicCk7CiAJZ290byBvdXQ7CiB9CiAKQEAgLTg1NzUsNiArODU3MCwxMiBAQAogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKKwlyYyA9IGJueDJfcmVxdWVzdF9maXJtd2FyZShicCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJYm54Ml9yZXNldF9jaGlwKGJwLCBCTlgyX0RSVl9NU0dfQ09ERV9SRVNFVCk7CiAJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGJwLT5tYWNfYWRkciwgRVRIX0FMRU4pOwogCiAJZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0cgfApAQCAtODYwNyw2ICs4NjA4LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3I6CisJYm54Ml9yZWxlYXNlX2Zpcm13YXJlKGJwKTsKIAlwY2lfaW91bm1hcChwZGV2LCBicC0+cmVndmlldyk7CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9jbW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCmluZGV4IDBlNjhmYWQuLjI0M2NiOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCkBAIC00OTIsNyArNDkyLDggQEAKIGludCBibngyeF9nZXRfdmZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwKIAkJCXN0cnVjdCBpZmxhX3ZmX2luZm8gKml2aSk7CiBpbnQgYm54Mnhfc2V0X3ZmX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcXVldWUsIHU4ICptYWMpOwotaW50IGJueDJ4X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcyk7CitpbnQgYm54Mnhfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zLAorCQkgICAgICBfX2JlMTYgdmxhbl9wcm90byk7CiAKIC8qIHNlbGVjdF9xdWV1ZSBjYWxsYmFjayAqLwogdTE2IGJueDJ4X3NlbGVjdF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbWFpbi5jCmluZGV4IDk3ZTg5MjUuLjIwZmU2YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9tYWluLmMKQEAgLTc3Miw2ICs3NzIsMTEgQEAKIAkJKGJwLT5jb21tb24uYmNfdmVyICYgMHhmZjAwKSA+PiA4LAogCQkoYnAtPmNvbW1vbi5iY192ZXIgJiAweGZmKSk7CiAKKwlpZiAocGNpX2NoYW5uZWxfb2ZmbGluZShicC0+cGRldikpIHsKKwkJQk5YMlhfRVJSKCJDYW5ub3QgZHVtcCBNQ1AgaW5mbyB3aGlsZSBpbiBQQ0kgZXJyb3JcbiIpOworCQlyZXR1cm47CisJfQorCiAJdmFsID0gUkVHX1JEKGJwLCBNQ1BfUkVHX01DUFJfQ1BVX1BST0dSQU1fQ09VTlRFUik7CiAJaWYgKHZhbCA9PSBSRUdfUkQoYnAsIE1DUF9SRUdfTUNQUl9DUFVfUFJPR1JBTV9DT1VOVEVSKSkKIAkJQk5YMlhfRVJSKCIlcyIgIk1DUCBQQyBhdCAweCV4XG4iLCBsdmwsIHZhbCk7CkBAIC05NDE1LDEwICs5NDIwLDE2IEBACiAJLyogUmVsZWFzZSBJUlFzICovCiAJYm54MnhfZnJlZV9pcnEoYnApOwogCi0JLyogUmVzZXQgdGhlIGNoaXAgKi8KLQlyYyA9IGJueDJ4X3Jlc2V0X2h3KGJwLCByZXNldF9jb2RlKTsKLQlpZiAocmMpCi0JCUJOWDJYX0VSUigiSFdfUkVTRVQgZmFpbGVkXG4iKTsKKwkvKiBSZXNldCB0aGUgY2hpcCwgdW5sZXNzIFBDSSBmdW5jdGlvbiBpcyBvZmZsaW5lLiBJZiB3ZSByZWFjaCB0aGlzCisJICogcG9pbnQgZm9sbG93aW5nIGEgUENJIGVycm9yIGhhbmRsaW5nLCBpdCBtZWFucyBkZXZpY2UgaXMgcmVhbGx5CisJICogaW4gYSBiYWQgc3RhdGUgYW5kIHdlJ3JlIGFib3V0IHRvIHJlbW92ZSBpdCwgc28gcmVzZXQgdGhlIGNoaXAKKwkgKiBpcyBub3QgYSBnb29kIGlkZWEuCisJICovCisJaWYgKCFwY2lfY2hhbm5lbF9vZmZsaW5lKGJwLT5wZGV2KSkgeworCQlyYyA9IGJueDJ4X3Jlc2V0X2h3KGJwLCByZXNldF9jb2RlKTsKKwkJaWYgKHJjKQorCQkJQk5YMlhfRVJSKCJIV19SRVNFVCBmYWlsZWRcbiIpOworCX0KIAogCS8qIFJlcG9ydCBVTkxPQURfRE9ORSB0byBNQ1AgKi8KIAlibngyeF9zZW5kX3VubG9hZF9kb25lKGJwLCBrZWVwX2xpbmspOwpAQCAtMTI1NTIsMzkgKzEyNTYzLDYyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYm54MnhfaW5pdF9tY2FzdF9tYWNzX2xpc3Qoc3RydWN0IGJueDJ4ICpicCwKLQkJCQkgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCkKK3N0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW1fZ3JvdXAKIHsKLQlpbnQgbWNfY291bnQgPSBuZXRkZXZfbWNfY291bnQoYnAtPmRldik7Ci0Jc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSAqbWNfbWFjID0KLQkJa2NhbGxvYyhtY19jb3VudCwgc2l6ZW9mKCptY19tYWMpLCBHRlBfQVRPTUlDKTsKLQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCXN0cnVjdCBsaXN0X2hlYWQgbWNhc3RfZ3JvdXBfbGluazsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtIG1jYXN0X2VsZW1zW107Cit9OwogCi0JaWYgKCFtY19tYWMpCi0JCXJldHVybiAtRU5PTUVNOworI2RlZmluZSBNQ0FTVF9FTEVNU19QRVJfUEcgXAorCSgoUEFHRV9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW1fZ3JvdXApKSAvIFwKKwlzaXplb2Yoc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbSkpCiAKLQlJTklUX0xJU1RfSEVBRCgmcC0+bWNhc3RfbGlzdCk7CitzdGF0aWMgdm9pZCBibngyeF9mcmVlX21jYXN0X21hY3NfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICptY2FzdF9ncm91cF9saXN0KQoreworCXN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW1fZ3JvdXAgKmN1cnJlbnRfbWNhc3RfZ3JvdXA7CiAKLQluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgYnAtPmRldikgewotCQltY19tYWMtPm1hYyA9IGJueDJ4X21jX2FkZHIoaGEpOwotCQlsaXN0X2FkZF90YWlsKCZtY19tYWMtPmxpbmssICZwLT5tY2FzdF9saXN0KTsKLQkJbWNfbWFjKys7CisJd2hpbGUgKCFsaXN0X2VtcHR5KG1jYXN0X2dyb3VwX2xpc3QpKSB7CisJCWN1cnJlbnRfbWNhc3RfZ3JvdXAgPSBsaXN0X2ZpcnN0X2VudHJ5KG1jYXN0X2dyb3VwX2xpc3QsCisJCQkJICAgICAgc3RydWN0IGJueDJ4X21jYXN0X2xpc3RfZWxlbV9ncm91cCwKKwkJCQkgICAgICBtY2FzdF9ncm91cF9saW5rKTsKKwkJbGlzdF9kZWwoJmN1cnJlbnRfbWNhc3RfZ3JvdXAtPm1jYXN0X2dyb3VwX2xpbmspOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY3VycmVudF9tY2FzdF9ncm91cCk7CiAJfQotCi0JcC0+bWNhc3RfbGlzdF9sZW4gPSBtY19jb3VudDsKLQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBibngyeF9mcmVlX21jYXN0X21hY3NfbGlzdCgKLQlzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCkKK3N0YXRpYyBpbnQgYm54MnhfaW5pdF9tY2FzdF9tYWNzX2xpc3Qoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwKKwkJCQkgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICptY2FzdF9ncm91cF9saXN0KQogewotCXN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW0gKm1jX21hYyA9Ci0JCWxpc3RfZmlyc3RfZW50cnkoJnAtPm1jYXN0X2xpc3QsIHN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW0sCi0JCQkJIGxpbmspOworCXN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW0gKm1jX21hYzsKKwlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCXN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW1fZ3JvdXAgKmN1cnJlbnRfbWNhc3RfZ3JvdXAgPSBOVUxMOworCWludCBtY19jb3VudCA9IG5ldGRldl9tY19jb3VudChicC0+ZGV2KTsKKwlpbnQgb2Zmc2V0ID0gMDsKIAotCVdBUk5fT04oIW1jX21hYyk7Ci0Ja2ZyZWUobWNfbWFjKTsKKwlJTklUX0xJU1RfSEVBRCgmcC0+bWNhc3RfbGlzdCk7CisJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGJwLT5kZXYpIHsKKwkJaWYgKCFvZmZzZXQpIHsKKwkJCWN1cnJlbnRfbWNhc3RfZ3JvdXAgPQorCQkJCShzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtX2dyb3VwICopCisJCQkJX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOworCQkJaWYgKCFjdXJyZW50X21jYXN0X2dyb3VwKSB7CisJCQkJYm54MnhfZnJlZV9tY2FzdF9tYWNzX2xpc3QobWNhc3RfZ3JvdXBfbGlzdCk7CisJCQkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWMgTUFDIGxpc3RcbiIpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJbGlzdF9hZGQoJmN1cnJlbnRfbWNhc3RfZ3JvdXAtPm1jYXN0X2dyb3VwX2xpbmssCisJCQkJIG1jYXN0X2dyb3VwX2xpc3QpOworCQl9CisJCW1jX21hYyA9ICZjdXJyZW50X21jYXN0X2dyb3VwLT5tY2FzdF9lbGVtc1tvZmZzZXRdOworCQltY19tYWMtPm1hYyA9IGJueDJ4X21jX2FkZHIoaGEpOworCQlsaXN0X2FkZF90YWlsKCZtY19tYWMtPmxpbmssICZwLT5tY2FzdF9saXN0KTsKKwkJb2Zmc2V0Kys7CisJCWlmIChvZmZzZXQgPT0gTUNBU1RfRUxFTVNfUEVSX1BHKQorCQkJb2Zmc2V0ID0gMDsKKwl9CisJcC0+bWNhc3RfbGlzdF9sZW4gPSBtY19jb3VudDsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMjYzMiw4ICsxMjY2Niw5IEBACiAJCQkJIEJOWDJYX1VDX0xJU1RfTUFDLCAmcmFtcm9kX2ZsYWdzKTsKIH0KIAotc3RhdGljIGludCBibngyeF9zZXRfbWNfbGlzdChzdHJ1Y3QgYm54MnggKmJwKQorc3RhdGljIGludCBibngyeF9zZXRfbWNfbGlzdF9lMXgoc3RydWN0IGJueDJ4ICpicCkKIHsKKwlMSVNUX0hFQUQobWNhc3RfZ3JvdXBfbGlzdCk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJwLT5kZXY7CiAJc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgcnBhcmFtID0ge05VTEx9OwogCWludCByYyA9IDA7CkBAIC0xMjY0OSwxMiArMTI2ODQsOSBAQAogCiAJLyogdGhlbiwgY29uZmlndXJlIGEgbmV3IE1BQ3MgbGlzdCAqLwogCWlmIChuZXRkZXZfbWNfY291bnQoZGV2KSkgewotCQlyYyA9IGJueDJ4X2luaXRfbWNhc3RfbWFjc19saXN0KGJwLCAmcnBhcmFtKTsKLQkJaWYgKHJjKSB7Ci0JCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBjcmVhdGUgbXVsdGljYXN0IE1BQ3MgbGlzdDogJWRcbiIsCi0JCQkJICByYyk7CisJCXJjID0gYm54MnhfaW5pdF9tY2FzdF9tYWNzX2xpc3QoYnAsICZycGFyYW0sICZtY2FzdF9ncm91cF9saXN0KTsKKwkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwotCQl9CiAKIAkJLyogTm93IGFkZCB0aGUgbmV3IE1BQ3MgKi8KIAkJcmMgPSBibngyeF9jb25maWdfbWNhc3QoYnAsICZycGFyYW0sCkBAIC0xMjY2Myw3ICsxMjY5NSw0NCBAQAogCQkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gc2V0IGEgbmV3IG11bHRpY2FzdCBjb25maWd1cmF0aW9uOiAlZFxuIiwKIAkJCQkgIHJjKTsKIAotCQlibngyeF9mcmVlX21jYXN0X21hY3NfbGlzdCgmcnBhcmFtKTsKKwkJYm54MnhfZnJlZV9tY2FzdF9tYWNzX2xpc3QoJm1jYXN0X2dyb3VwX2xpc3QpOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBibngyeF9zZXRfbWNfbGlzdChzdHJ1Y3QgYm54MnggKmJwKQoreworCUxJU1RfSEVBRChtY2FzdF9ncm91cF9saXN0KTsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyBycGFyYW0gPSB7TlVMTH07CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGJwLT5kZXY7CisJaW50IHJjID0gMDsKKworCS8qIE9uIG9sZGVyIGFkYXB0ZXJzLCB3ZSBuZWVkIHRvIGZsdXNoIGFuZCByZS1hZGQgZmlsdGVycyAqLworCWlmIChDSElQX0lTX0UxeChicCkpCisJCXJldHVybiBibngyeF9zZXRfbWNfbGlzdF9lMXgoYnApOworCisJcnBhcmFtLm1jYXN0X29iaiA9ICZicC0+bWNhc3Rfb2JqOworCisJaWYgKG5ldGRldl9tY19jb3VudChkZXYpKSB7CisJCXJjID0gYm54MnhfaW5pdF9tY2FzdF9tYWNzX2xpc3QoYnAsICZycGFyYW0sICZtY2FzdF9ncm91cF9saXN0KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qIE92ZXJyaWRlIHRoZSBjdXJlbnRseSBjb25maWd1cmVkIHNldCBvZiBtYyBmaWx0ZXJzICovCisJCXJjID0gYm54MnhfY29uZmlnX21jYXN0KGJwLCAmcnBhcmFtLAorCQkJCQlCTlgyWF9NQ0FTVF9DTURfU0VUKTsKKwkJaWYgKHJjIDwgMCkKKwkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIHNldCBhIG5ldyBtdWx0aWNhc3QgY29uZmlndXJhdGlvbjogJWRcbiIsCisJCQkJICByYyk7CisKKwkJYm54MnhfZnJlZV9tY2FzdF9tYWNzX2xpc3QoJm1jYXN0X2dyb3VwX2xpc3QpOworCX0gZWxzZSB7CisJCS8qIElmIG5vIG1jIGFkZHJlc3NlcyBhcmUgcmVxdWlyZWQsIGZsdXNoIHRoZSBjb25maWd1cmF0aW9uICovCisJCXJjID0gYm54MnhfY29uZmlnX21jYXN0KGJwLCAmcnBhcmFtLCBCTlgyWF9NQ0FTVF9DTURfREVMKTsKKwkJaWYgKHJjKQorCQkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gY2xlYXIgbXVsdGljYXN0IGNvbmZpZ3VyYXRpb24gJWRcbiIsCisJCQkJICByYyk7CiAJfQogCiAJcmV0dXJuIHJjOwpAQCAtMTMyMDMsMTMgKzEzMjcyLDIyIEBACiAJCU5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9MUk8gfCBORVRJRl9GX0dSTyB8CiAJCU5FVElGX0ZfUlhIQVNIIHwgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFg7CiAJaWYgKCFjaGlwX2lzX2UxeCkgewotCQlkZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfR1NPX0dSRSB8IE5FVElGX0ZfR1NPX1VEUF9UVU5ORUwgfAotCQkJCSAgICBORVRJRl9GX0dTT19JUFhJUDQ7CisJCWRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9HU09fR1JFIHwgTkVUSUZfRl9HU09fR1JFX0NTVU0gfAorCQkJCSAgICBORVRJRl9GX0dTT19JUFhJUDQgfAorCQkJCSAgICBORVRJRl9GX0dTT19VRFBfVFVOTkVMIHwKKwkJCQkgICAgTkVUSUZfRl9HU09fVURQX1RVTk5FTF9DU1VNIHwKKwkJCQkgICAgTkVUSUZfRl9HU09fUEFSVElBTDsKKwogCQlkZXYtPmh3X2VuY19mZWF0dXJlcyA9CiAJCQlORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTSB8IE5FVElGX0ZfU0cgfAogCQkJTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTT19FQ04gfCBORVRJRl9GX1RTTzYgfAogCQkJTkVUSUZfRl9HU09fSVBYSVA0IHwKLQkJCU5FVElGX0ZfR1NPX0dSRSB8IE5FVElGX0ZfR1NPX1VEUF9UVU5ORUw7CisJCQlORVRJRl9GX0dTT19HUkUgfCBORVRJRl9GX0dTT19HUkVfQ1NVTSB8CisJCQlORVRJRl9GX0dTT19VRFBfVFVOTkVMIHwgTkVUSUZfRl9HU09fVURQX1RVTk5FTF9DU1VNIHwKKwkJCU5FVElGX0ZfR1NPX1BBUlRJQUw7CisKKwkJZGV2LT5nc29fcGFydGlhbF9mZWF0dXJlcyA9IE5FVElGX0ZfR1NPX0dSRV9DU1VNIHwKKwkJCQkJICAgIE5FVElGX0ZfR1NPX1VEUF9UVU5ORUxfQ1NVTTsKIAl9CiAKIAlkZXYtPnZsYW5fZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0gfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmMKaW5kZXggZmY3MDJhNy4uY2VhNmJkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5jCkBAIC0yNjAwLDggKzI2MDAsMjkgQEAKIAl1OCBwYWRbMl07IC8qIEZvciBhIG5hdHVyYWwgYWxpZ25tZW50IG9mIHRoZSBmb2xsb3dpbmcgYnVmZmVyICovCiB9OwogCitzdHJ1Y3QgYm54MnhfbWNhc3RfYmluX2VsZW0geworCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKKwlpbnQgYmluOworCWludCB0eXBlOyAvKiBCTlgyWF9NQ0FTVF9DTURfU0VUX3tBREQsIERFTH0gKi8KK307CisKK3VuaW9uIGJueDJ4X21jYXN0X2VsZW0geworCXN0cnVjdCBibngyeF9tY2FzdF9iaW5fZWxlbSBiaW5fZWxlbTsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfbWFjX2VsZW0gbWFjX2VsZW07Cit9OworCitzdHJ1Y3QgYm54MnhfbWNhc3RfZWxlbV9ncm91cCB7CisJc3RydWN0IGxpc3RfaGVhZCBtY2FzdF9ncm91cF9saW5rOworCXVuaW9uIGJueDJ4X21jYXN0X2VsZW0gbWNhc3RfZWxlbXNbXTsKK307CisKKyNkZWZpbmUgTUNBU1RfTUFDX0VMRU1TX1BFUl9QRyBcCisJKChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IGJueDJ4X21jYXN0X2VsZW1fZ3JvdXApKSAvIFwKKwlzaXplb2YodW5pb24gYm54MnhfbWNhc3RfZWxlbSkpCisKIHN0cnVjdCBibngyeF9wZW5kaW5nX21jYXN0X2NtZCB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCXN0cnVjdCBsaXN0X2hlYWQgZ3JvdXBfaGVhZDsKIAlpbnQgdHlwZTsgLyogQk5YMlhfTUNBU1RfQ01EX1ggKi8KIAl1bmlvbiB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgbWFjc19oZWFkOwpAQCAtMjYwOSw2ICsyNjMwLDExIEBACiAJCWludCBuZXh0X2JpbjsgLyogTmVlZGVkIGZvciBSRVNUT1JFIGZsb3cgd2l0aCBhcHJveCBtYXRjaCAqLwogCX0gZGF0YTsKIAorCWJvb2wgc2V0X2NvbnZlcnQ7IC8qIGluIGNhc2UgdHlwZSA9PSBCTlgyWF9NQ0FTVF9DTURfU0VULCB0aGlzIGlzIHNldAorCQkJICAgKiB3aGVuIG1hY3NfaGVhZCBoYWQgYmVlbiBjb252ZXJ0ZWQgdG8gYSBsaXN0IG9mCisJCQkgICAqIGJueDJ4X21jYXN0X2Jpbl9lbGVtLgorCQkJICAgKi8KKwogCWJvb2wgZG9uZTsgLyogc2V0IHRvIHRydWUsIHdoZW4gdGhlIGNvbW1hbmQgaGFzIGJlZW4gaGFuZGxlZCwKIAkJICAgICogcHJhY3RpY2FsbHkgdXNlZCBpbiA1NzcxMiBoYW5kbGluZyBvbmx5LCB3aGVyZSBvbmUgcGVuZGluZwogCQkgICAgKiBjb21tYW5kIG1heSBiZSBoYW5kbGVkIGluIGEgZmV3IG9wZXJhdGlvbnMuIEFzIGxvbmcgYXMgZm9yCkBAIC0yNjI3LDUzICsyNjUzLDkzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGJueDJ4X2ZyZWVfZ3JvdXBzKHN0cnVjdCBsaXN0X2hlYWQgKm1jYXN0X2dyb3VwX2xpc3QpCit7CisJc3RydWN0IGJueDJ4X21jYXN0X2VsZW1fZ3JvdXAgKmN1cnJlbnRfbWNhc3RfZ3JvdXA7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkobWNhc3RfZ3JvdXBfbGlzdCkpIHsKKwkJY3VycmVudF9tY2FzdF9ncm91cCA9IGxpc3RfZmlyc3RfZW50cnkobWNhc3RfZ3JvdXBfbGlzdCwKKwkJCQkgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfZWxlbV9ncm91cCwKKwkJCQkgICAgICBtY2FzdF9ncm91cF9saW5rKTsKKwkJbGlzdF9kZWwoJmN1cnJlbnRfbWNhc3RfZ3JvdXAtPm1jYXN0X2dyb3VwX2xpbmspOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY3VycmVudF9tY2FzdF9ncm91cCk7CisJfQorfQorCiBzdGF0aWMgaW50IGJueDJ4X21jYXN0X2VucXVldWVfY21kKHN0cnVjdCBibngyeCAqYnAsCiAJCQkJICAgc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbywKIAkJCQkgICBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwKIAkJCQkgICBlbnVtIGJueDJ4X21jYXN0X2NtZCBjbWQpCiB7Ci0JaW50IHRvdGFsX3N6OwogCXN0cnVjdCBibngyeF9wZW5kaW5nX21jYXN0X2NtZCAqbmV3X2NtZDsKLQlzdHJ1Y3QgYm54MnhfbWNhc3RfbWFjX2VsZW0gKmN1cl9tYWMgPSBOVUxMOwogCXN0cnVjdCBibngyeF9tY2FzdF9saXN0X2VsZW0gKnBvczsKLQlpbnQgbWFjc19saXN0X2xlbiA9ICgoY21kID09IEJOWDJYX01DQVNUX0NNRF9BREQpID8KLQkJCSAgICAgcC0+bWNhc3RfbGlzdF9sZW4gOiAwKTsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfZWxlbV9ncm91cCAqZWxlbV9ncm91cDsKKwlzdHJ1Y3QgYm54MnhfbWNhc3RfbWFjX2VsZW0gKm1hY19lbGVtOworCWludCB0b3RhbF9lbGVtcyA9IDAsIG1hY3NfbGlzdF9sZW4gPSAwLCBvZmZzZXQgPSAwOworCisJLyogV2hlbiBhZGRpbmcgTUFDcyB3ZSdsbCBuZWVkIHRvIHN0b3JlIHRoZWlyIHZhbHVlcyAqLworCWlmIChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX0FERCB8fCBjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX1NFVCkKKwkJbWFjc19saXN0X2xlbiA9IHAtPm1jYXN0X2xpc3RfbGVuOwogCiAJLyogSWYgdGhlIGNvbW1hbmQgaXMgZW1wdHkgKCJoYW5kbGUgcGVuZGluZyBjb21tYW5kcyBvbmx5IiksIGJyZWFrICovCiAJaWYgKCFwLT5tY2FzdF9saXN0X2xlbikKIAkJcmV0dXJuIDA7CiAKLQl0b3RhbF9zeiA9IHNpemVvZigqbmV3X2NtZCkgKwotCQltYWNzX2xpc3RfbGVuICogc2l6ZW9mKHN0cnVjdCBibngyeF9tY2FzdF9tYWNfZWxlbSk7Ci0KIAkvKiBBZGQgbWNhc3QgaXMgY2FsbGVkIHVuZGVyIHNwaW5fbG9jaywgdGh1cyBjYWxsaW5nIHdpdGggR0ZQX0FUT01JQyAqLwotCW5ld19jbWQgPSBremFsbG9jKHRvdGFsX3N6LCBHRlBfQVRPTUlDKTsKLQorCW5ld19jbWQgPSBremFsbG9jKHNpemVvZigqbmV3X2NtZCksIEdGUF9BVE9NSUMpOwogCWlmICghbmV3X2NtZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlJTklUX0xJU1RfSEVBRCgmbmV3X2NtZC0+ZGF0YS5tYWNzX2hlYWQpOworCUlOSVRfTElTVF9IRUFEKCZuZXdfY21kLT5ncm91cF9oZWFkKTsKKwluZXdfY21kLT50eXBlID0gY21kOworCW5ld19jbWQtPmRvbmUgPSBmYWxzZTsKKwogCURQKEJOWDJYX01TR19TUCwgIkFib3V0IHRvIGVucXVldWUgYSBuZXcgJWQgY29tbWFuZC4gbWFjc19saXN0X2xlbj0lZFxuIiwKIAkgICBjbWQsIG1hY3NfbGlzdF9sZW4pOwogCi0JSU5JVF9MSVNUX0hFQUQoJm5ld19jbWQtPmRhdGEubWFjc19oZWFkKTsKLQotCW5ld19jbWQtPnR5cGUgPSBjbWQ7Ci0JbmV3X2NtZC0+ZG9uZSA9IGZhbHNlOwotCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEJOWDJYX01DQVNUX0NNRF9BREQ6Ci0JCWN1cl9tYWMgPSAoc3RydWN0IGJueDJ4X21jYXN0X21hY19lbGVtICopCi0JCQkgICgodTggKiluZXdfY21kICsgc2l6ZW9mKCpuZXdfY21kKSk7Ci0KLQkJLyogUHVzaCB0aGUgTUFDcyBvZiB0aGUgY3VycmVudCBjb21tYW5kIGludG8gdGhlIHBlbmRpbmcgY29tbWFuZAotCQkgKiBNQUNzIGxpc3Q6IEZJRk8KKwljYXNlIEJOWDJYX01DQVNUX0NNRF9TRVQ6CisJCS8qIEZvciBhIHNldCBjb21tYW5kLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIHN1ZmZpY2llbnQgbWVtb3J5IGZvcgorCQkgKiBhbGwgdGhlIGJpbnMsIHNpbmNlIHdlIGNhbid0IGFuYWx5emUgYXQgdGhpcyBwb2ludCBob3cgbXVjaAorCQkgKiBtZW1vcnkgd291bGQgYmUgcmVxdWlyZWQuCiAJCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnAtPm1jYXN0X2xpc3QsIGxpbmspIHsKLQkJCW1lbWNweShjdXJfbWFjLT5tYWMsIHBvcy0+bWFjLCBFVEhfQUxFTik7Ci0JCQlsaXN0X2FkZF90YWlsKCZjdXJfbWFjLT5saW5rLCAmbmV3X2NtZC0+ZGF0YS5tYWNzX2hlYWQpOwotCQkJY3VyX21hYysrOworCQl0b3RhbF9lbGVtcyA9IG1hY3NfbGlzdF9sZW47CisJCWlmIChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX1NFVCkgeworCQkJaWYgKHRvdGFsX2VsZW1zIDwgQk5YMlhfTUNBU1RfQklOU19OVU0pCisJCQkJdG90YWxfZWxlbXMgPSBCTlgyWF9NQ0FTVF9CSU5TX05VTTsKIAkJfQotCisJCXdoaWxlICh0b3RhbF9lbGVtcyA+IDApIHsKKwkJCWVsZW1fZ3JvdXAgPSAoc3RydWN0IGJueDJ4X21jYXN0X2VsZW1fZ3JvdXAgKikKKwkJCQkgICAgIF9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDIHwgX19HRlBfWkVSTyk7CisJCQlpZiAoIWVsZW1fZ3JvdXApIHsKKwkJCQlibngyeF9mcmVlX2dyb3VwcygmbmV3X2NtZC0+Z3JvdXBfaGVhZCk7CisJCQkJa2ZyZWUobmV3X2NtZCk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQl0b3RhbF9lbGVtcyAtPSBNQ0FTVF9NQUNfRUxFTVNfUEVSX1BHOworCQkJbGlzdF9hZGRfdGFpbCgmZWxlbV9ncm91cC0+bWNhc3RfZ3JvdXBfbGluaywKKwkJCQkgICAgICAmbmV3X2NtZC0+Z3JvdXBfaGVhZCk7CisJCX0KKwkJZWxlbV9ncm91cCA9IGxpc3RfZmlyc3RfZW50cnkoJm5ld19jbWQtPmdyb3VwX2hlYWQsCisJCQkJCSAgICAgIHN0cnVjdCBibngyeF9tY2FzdF9lbGVtX2dyb3VwLAorCQkJCQkgICAgICBtY2FzdF9ncm91cF9saW5rKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZwLT5tY2FzdF9saXN0LCBsaW5rKSB7CisJCQltYWNfZWxlbSA9ICZlbGVtX2dyb3VwLT5tY2FzdF9lbGVtc1tvZmZzZXRdLm1hY19lbGVtOworCQkJbWVtY3B5KG1hY19lbGVtLT5tYWMsIHBvcy0+bWFjLCBFVEhfQUxFTik7CisJCQkvKiBQdXNoIHRoZSBNQUNzIG9mIHRoZSBjdXJyZW50IGNvbW1hbmQgaW50byB0aGUgcGVuZGluZworCQkJICogY29tbWFuZCBNQUNzIGxpc3Q6IEZJRk8KKwkJCSAqLworCQkJbGlzdF9hZGRfdGFpbCgmbWFjX2VsZW0tPmxpbmssCisJCQkJICAgICAgJm5ld19jbWQtPmRhdGEubWFjc19oZWFkKTsKKwkJCW9mZnNldCsrOworCQkJaWYgKG9mZnNldCA9PSBNQ0FTVF9NQUNfRUxFTVNfUEVSX1BHKSB7CisJCQkJb2Zmc2V0ID0gMDsKKwkJCQllbGVtX2dyb3VwID0gbGlzdF9uZXh0X2VudHJ5KGVsZW1fZ3JvdXAsCisJCQkJCQkJICAgICBtY2FzdF9ncm91cF9saW5rKTsKKwkJCX0KKwkJfQogCQlicmVhazsKIAogCWNhc2UgQk5YMlhfTUNBU1RfQ01EX0RFTDoKQEAgLTI3NzEsNyArMjgzNyw4IEBACiAJdTggcnhfdHhfYWRkX2ZsYWcgPSBibngyeF9tY2FzdF9nZXRfcnhfdHhfZmxhZyhvKTsKIAlpbnQgYmluOwogCi0JaWYgKChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX0FERCkgfHwgKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfUkVTVE9SRSkpCisJaWYgKChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX0FERCkgfHwgKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfUkVTVE9SRSkgfHwKKwkgICAgKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfU0VUX0FERCkpCiAJCXJ4X3R4X2FkZF9mbGFnIHw9IEVUSF9NVUxUSUNBU1RfUlVMRVNfQ01EX0lTX0FERDsKIAogCWRhdGEtPnJ1bGVzW2lkeF0uY21kX2dlbmVyYWxfZGF0YSB8PSByeF90eF9hZGRfZmxhZzsKQEAgLTI3OTcsNiArMjg2NCwxNiBAQAogCQliaW4gPSBjZmdfZGF0YS0+YmluOwogCQlicmVhazsKIAorCWNhc2UgQk5YMlhfTUNBU1RfQ01EX1NFVF9BREQ6CisJCWJpbiA9IGNmZ19kYXRhLT5iaW47CisJCUJJVF9WRUM2NF9TRVRfQklUKG8tPnJlZ2lzdHJ5LmFwcm94X21hdGNoLnZlYywgYmluKTsKKwkJYnJlYWs7CisKKwljYXNlIEJOWDJYX01DQVNUX0NNRF9TRVRfREVMOgorCQliaW4gPSBjZmdfZGF0YS0+YmluOworCQlCSVRfVkVDNjRfQ0xFQVJfQklUKG8tPnJlZ2lzdHJ5LmFwcm94X21hdGNoLnZlYywgYmluKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlCTlgyWF9FUlIoIlVua25vd24gY29tbWFuZDogJWRcbiIsIGNtZCk7CiAJCXJldHVybjsKQEAgLTI5MzIsNiArMzAwOSwxMTAgQEAKIAkJY21kX3Bvcy0+ZGF0YS5uZXh0X2JpbisrOwogfQogCitzdGF0aWMgdm9pZAorYm54MnhfbWNhc3RfaGRsX3BlbmRpbmdfc2V0X2UyX2NvbnZlcnQoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkgICAgICAgc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbywKKwkJCQkgICAgICAgc3RydWN0IGJueDJ4X3BlbmRpbmdfbWNhc3RfY21kICpjbWRfcG9zKQoreworCXU2NCBjdXJbQk5YMlhfTUNBU1RfVkVDX1NaXSwgcmVxW0JOWDJYX01DQVNUX1ZFQ19TWl07CisJc3RydWN0IGJueDJ4X21jYXN0X21hY19lbGVtICpwbWFjX3BvcywgKnBtYWNfcG9zX247CisJc3RydWN0IGJueDJ4X21jYXN0X2Jpbl9lbGVtICpwX2l0ZW07CisJc3RydWN0IGJueDJ4X21jYXN0X2VsZW1fZ3JvdXAgKmVsZW1fZ3JvdXA7CisJaW50IGNudCA9IDAsIG1hY19jbnQgPSAwLCBvZmZzZXQgPSAwLCBpOworCisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKHU2NCkgKiBCTlgyWF9NQ0FTVF9WRUNfU1opOworCW1lbWNweShjdXIsIG8tPnJlZ2lzdHJ5LmFwcm94X21hdGNoLnZlYywKKwkgICAgICAgc2l6ZW9mKHU2NCkgKiBCTlgyWF9NQ0FTVF9WRUNfU1opOworCisJLyogRmlsbCBgY3VycmVudCcgd2l0aCB0aGUgcmVxdWlyZWQgc2V0IG9mIGJpbnMgdG8gY29uZmlndXJlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBtYWNfcG9zLCBwbWFjX3Bvc19uLCAmY21kX3Bvcy0+ZGF0YS5tYWNzX2hlYWQsCisJCQkJIGxpbmspIHsKKwkJaW50IGJpbiA9IGJueDJ4X21jYXN0X2Jpbl9mcm9tX21hYyhwbWFjX3Bvcy0+bWFjKTsKKworCQlEUChCTlgyWF9NU0dfU1AsICJTZXQgY29udGFpbnMgJXBNIG1jYXN0IE1BQ1xuIiwKKwkJICAgcG1hY19wb3MtPm1hYyk7CisKKwkJQklUX1ZFQzY0X1NFVF9CSVQocmVxLCBiaW4pOworCQlsaXN0X2RlbCgmcG1hY19wb3MtPmxpbmspOworCQltYWNfY250Kys7CisJfQorCisJLyogV2Ugbm8gbG9uZ2VyIGhhdmUgdXNlIGZvciB0aGUgTUFDczsgTmVlZCB0byByZS11c2UgbWVtb3J5IGZvcgorCSAqIGEgbGlzdCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjb25maWd1cmUgYmlucy4KKwkgKi8KKwljbWRfcG9zLT5zZXRfY29udmVydCA9IHRydWU7CisJSU5JVF9MSVNUX0hFQUQoJmNtZF9wb3MtPmRhdGEubWFjc19oZWFkKTsKKwllbGVtX2dyb3VwID0gbGlzdF9maXJzdF9lbnRyeSgmY21kX3Bvcy0+Z3JvdXBfaGVhZCwKKwkJCQkgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfZWxlbV9ncm91cCwKKwkJCQkgICAgICBtY2FzdF9ncm91cF9saW5rKTsKKwlmb3IgKGkgPSAwOyBpIDwgQk5YMlhfTUNBU1RfQklOU19OVU07IGkrKykgeworCQlib29sIGJfY3VycmVudCA9ICEhQklUX1ZFQzY0X1RFU1RfQklUKGN1ciwgaSk7CisJCWJvb2wgYl9yZXF1aXJlZCA9ICEhQklUX1ZFQzY0X1RFU1RfQklUKHJlcSwgaSk7CisKKwkJaWYgKGJfY3VycmVudCA9PSBiX3JlcXVpcmVkKQorCQkJY29udGludWU7CisKKwkJcF9pdGVtID0gJmVsZW1fZ3JvdXAtPm1jYXN0X2VsZW1zW29mZnNldF0uYmluX2VsZW07CisJCXBfaXRlbS0+YmluID0gaTsKKwkJcF9pdGVtLT50eXBlID0gYl9yZXF1aXJlZCA/IEJOWDJYX01DQVNUX0NNRF9TRVRfQURECisJCQkJCSAgOiBCTlgyWF9NQ0FTVF9DTURfU0VUX0RFTDsKKwkJbGlzdF9hZGRfdGFpbCgmcF9pdGVtLT5saW5rICwgJmNtZF9wb3MtPmRhdGEubWFjc19oZWFkKTsKKwkJY250Kys7CisJCW9mZnNldCsrOworCQlpZiAob2Zmc2V0ID09IE1DQVNUX01BQ19FTEVNU19QRVJfUEcpIHsKKwkJCW9mZnNldCA9IDA7CisJCQllbGVtX2dyb3VwID0gbGlzdF9uZXh0X2VudHJ5KGVsZW1fZ3JvdXAsCisJCQkJCQkgICAgIG1jYXN0X2dyb3VwX2xpbmspOworCQl9CisJfQorCisJLyogV2Ugbm93IGRlZmluaXRlbHkga25vdyBob3cgbWFueSBjb21tYW5kcyBhcmUgaGlkaW5nIGhlcmUuCisJICogQWxzbyBuZWVkIHRvIGNvcnJlY3QgdGhlIGRpc3J1cHRpb24gd2UndmUgYWRkZWQgdG8gZ3VhcmFudGVlIHRoaXMKKwkgKiB3b3VsZCBiZSBlbnF1ZXVlZC4KKwkgKi8KKwlvLT50b3RhbF9wZW5kaW5nX251bSAtPSAoby0+bWF4X2NtZF9sZW4gKyBtYWNfY250KTsKKwlvLT50b3RhbF9wZW5kaW5nX251bSArPSBjbnQ7CisKKwlEUChCTlgyWF9NU0dfU1AsICJvLT50b3RhbF9wZW5kaW5nX251bT0lZFxuIiwgby0+dG90YWxfcGVuZGluZ19udW0pOworfQorCitzdGF0aWMgdm9pZAorYm54MnhfbWNhc3RfaGRsX3BlbmRpbmdfc2V0X2UyKHN0cnVjdCBibngyeCAqYnAsCisJCQkgICAgICAgc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbywKKwkJCSAgICAgICBzdHJ1Y3QgYm54MnhfcGVuZGluZ19tY2FzdF9jbWQgKmNtZF9wb3MsCisJCQkgICAgICAgaW50ICpjbnQpCit7CisJdW5pb24gYm54MnhfbWNhc3RfY29uZmlnX2RhdGEgY2ZnX2RhdGEgPSB7TlVMTH07CisJc3RydWN0IGJueDJ4X21jYXN0X2Jpbl9lbGVtICpwX2l0ZW0sICpwX2l0ZW1fbjsKKworCS8qIFRoaXMgaXMgYWN0dWFsbHkgYSAyLXBhcnQgc2NoZW1lIC0gaXQgc3RhcnRzIGJ5IGNvbnZlcnRpbmcgdGhlIE1BQ3MKKwkgKiBpbnRvIGEgbGlzdCBvZiBiaW5zIHRvIGJlIGFkZGVkL3JlbW92ZWQsIGFuZCBjb3JyZWN0aW5nIHRoZSBudW1iZXJzCisJICogb24gdGhlIG9iamVjdC4gdGhpcyBpcyBub3cgYWxsb3dlZCwgYXMgd2UncmUgbm93IHN1cmUgdGhhdCBhbGwKKwkgKiBwcmV2aW91cyBjb25maWd1cmVkIHJlcXVlc3RzIGhhdmUgYWxyZWFkeSBhcHBsaWVkLgorCSAqIFRoZSBzZWNvbmQgcGFydCBpcyBhY3R1YWxseSBhZGRpbmcgcnVsZXMgZm9yIHRoZSBuZXdseSBpbnRyb2R1Y2VkCisJICogZW50cmllcyBbbGlrZSBhbGwgdGhlIHJlc3Qgb2YgdGhlIGhkbF9wZW5kaW5nIGZ1bmN0aW9uc10uCisJICovCisJaWYgKCFjbWRfcG9zLT5zZXRfY29udmVydCkKKwkJYm54MnhfbWNhc3RfaGRsX3BlbmRpbmdfc2V0X2UyX2NvbnZlcnQoYnAsIG8sIGNtZF9wb3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBfaXRlbSwgcF9pdGVtX24sICZjbWRfcG9zLT5kYXRhLm1hY3NfaGVhZCwKKwkJCQkgbGluaykgeworCQljZmdfZGF0YS5iaW4gPSAodTgpcF9pdGVtLT5iaW47CisJCW8tPnNldF9vbmVfcnVsZShicCwgbywgKmNudCwgJmNmZ19kYXRhLCBwX2l0ZW0tPnR5cGUpOworCQkoKmNudCkrKzsKKworCQlsaXN0X2RlbCgmcF9pdGVtLT5saW5rKTsKKworCQkvKiBCcmVhayBpZiB3ZSByZWFjaGVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBydWxlcy4gKi8KKwkJaWYgKCpjbnQgPj0gby0+bWF4X2NtZF9sZW4pCisJCQlicmVhazsKKwl9CisKKwkvKiBpZiBubyBtb3JlIE1BQ3MgdG8gY29uZmlndXJlIC0gd2UgYXJlIGRvbmUgKi8KKwlpZiAobGlzdF9lbXB0eSgmY21kX3Bvcy0+ZGF0YS5tYWNzX2hlYWQpKQorCQljbWRfcG9zLT5kb25lID0gdHJ1ZTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgYm54MnhfbWNhc3RfaGFuZGxlX3BlbmRpbmdfY21kc19lMihzdHJ1Y3QgYm54MnggKmJwLAogCQkJCXN0cnVjdCBibngyeF9tY2FzdF9yYW1yb2RfcGFyYW1zICpwKQogewpAQCAtMjk1NSw2ICszMTM2LDEwIEBACiAJCQkJCQkJICAgJmNudCk7CiAJCQlicmVhazsKIAorCQljYXNlIEJOWDJYX01DQVNUX0NNRF9TRVQ6CisJCQlibngyeF9tY2FzdF9oZGxfcGVuZGluZ19zZXRfZTIoYnAsIG8sIGNtZF9wb3MsICZjbnQpOworCQkJYnJlYWs7CisKIAkJZGVmYXVsdDoKIAkJCUJOWDJYX0VSUigiVW5rbm93biBjb21tYW5kOiAlZFxuIiwgY21kX3Bvcy0+dHlwZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI5NjUsNiArMzE1MCw3IEBACiAJCSAqLwogCQlpZiAoY21kX3Bvcy0+ZG9uZSkgewogCQkJbGlzdF9kZWwoJmNtZF9wb3MtPmxpbmspOworCQkJYm54MnhfZnJlZV9ncm91cHMoJmNtZF9wb3MtPmdyb3VwX2hlYWQpOwogCQkJa2ZyZWUoY21kX3Bvcyk7CiAJCX0KIApAQCAtMzA5NSw2ICszMjgxLDE5IEBACiAJCW8tPnNldF9yZWdpc3RyeV9zaXplKG8sIHJlZ19zeiArIHAtPm1jYXN0X2xpc3RfbGVuKTsKIAkJYnJlYWs7CiAKKwljYXNlIEJOWDJYX01DQVNUX0NNRF9TRVQ6CisJCS8qIFdlIGNhbiBvbmx5IGxlYXJuIGhvdyBtYW55IGNvbW1hbmRzIHdvdWxkIGFjdHVhbGx5IGJlIHVzZWQKKwkJICogd2hlbiB0aGlzIGlzIGJlaW5nIGNvbmZpZ3VyZWQuIFNvIGZvciBub3csIHNpbXBseSBndWFyYW50ZWUKKwkJICogdGhlIGNvbW1hbmQgd2lsbCBiZSBlbnF1ZXVlZCBbdG8gcmVmcmFpbiBmcm9tIGFkZGluZyBsb2dpYworCQkgKiB0aGF0IGhhbmRsZXMgdGhpcyBhbmQgVEhFTiBsZWFybnMgaXQgbmVlZHMgc2V2ZXJhbCByYW1yb2RzXS4KKwkJICogSnVzdCBsaWtlIGZvciBBREQvQ29udCwgdGhlIG1jYXN0X2xpc3RfbGVuIG1pZ2h0IGJlIGFuIG92ZXIKKwkJICogZXN0aW1hdGlvbjsgb3IgZXZlbiBtb3JlIHNvLCBzaW5jZSB3ZSBkb24ndCB0YWtlIGludG8KKwkJICogYWNjb3VudCB0aGUgcG9zc2liaWxpdHkgb2YgcmVtb3ZhbCBvZiBleGlzdGluZyBiaW5zLgorCQkgKi8KKwkJby0+c2V0X3JlZ2lzdHJ5X3NpemUobywgcmVnX3N6ICsgcC0+bWNhc3RfbGlzdF9sZW4pOworCQlvLT50b3RhbF9wZW5kaW5nX251bSArPSBvLT5tYXhfY21kX2xlbjsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlCTlgyWF9FUlIoIlVua25vd24gY29tbWFuZDogJWRcbiIsIGNtZCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzEwOCwxMiArMzMwNywxNiBAQAogCiBzdGF0aWMgdm9pZCBibngyeF9tY2FzdF9yZXZlcnRfZTIoc3RydWN0IGJueDJ4ICpicCwKIAkJCQkgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwKLQkJCQkgICAgICBpbnQgb2xkX251bV9iaW5zKQorCQkJCSAgaW50IG9sZF9udW1fYmlucywKKwkJCQkgIGVudW0gYm54MnhfbWNhc3RfY21kIGNtZCkKIHsKIAlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvID0gcC0+bWNhc3Rfb2JqOwogCiAJby0+c2V0X3JlZ2lzdHJ5X3NpemUobywgb2xkX251bV9iaW5zKTsKIAlvLT50b3RhbF9wZW5kaW5nX251bSAtPSBwLT5tY2FzdF9saXN0X2xlbjsKKworCWlmIChjbWQgPT0gQk5YMlhfTUNBU1RfQ01EX1NFVCkKKwkJby0+dG90YWxfcGVuZGluZ19udW0gLT0gby0+bWF4X2NtZF9sZW47CiB9CiAKIC8qKgpAQCAtMzIyMyw5ICszNDI2LDExIEBACiAJCWJueDJ4X21jYXN0X3JlZnJlc2hfcmVnaXN0cnlfZTIoYnAsIG8pOwogCiAJLyogSWYgQ0xFQVJfT05MWSB3YXMgcmVxdWVzdGVkIC0gZG9uJ3Qgc2VuZCBhIHJhbXJvZCBhbmQgY2xlYXIKLQkgKiBSQU1ST0RfUEVORElORyBzdGF0dXMgaW1tZWRpYXRlbHkuCisJICogUkFNUk9EX1BFTkRJTkcgc3RhdHVzIGltbWVkaWF0ZWx5LiBkdWUgdG8gdGhlIFNFVCBvcHRpb24sIGl0J3MgYWxzbworCSAqIHBvc3NpYmxlIHRoYXQgYWZ0ZXIgZXZhbHVhdGluZyB0aGUgZGlmZmVyZW5jZXMgdGhlcmUncyBubyBuZWVkIGZvcgorCSAqIGEgcmFtcm9kLiBJbiB0aGF0IGNhc2UsIHdlIGNhbiBza2lwIGl0IGFzIHdlbGwuCiAJICovCi0JaWYgKHRlc3RfYml0KFJBTVJPRF9EUlZfQ0xSX09OTFksICZwLT5yYW1yb2RfZmxhZ3MpKSB7CisJaWYgKHRlc3RfYml0KFJBTVJPRF9EUlZfQ0xSX09OTFksICZwLT5yYW1yb2RfZmxhZ3MpIHx8ICFjbnQpIHsKIAkJcmF3LT5jbGVhcl9wZW5kaW5nKHJhdyk7CiAJCXJldHVybiAwOwogCX0gZWxzZSB7CkBAIC0zMjUzLDYgKzM0NTgsMTEgQEAKIAkJCQkgICAgc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnAsCiAJCQkJICAgIGVudW0gYm54MnhfbWNhc3RfY21kIGNtZCkKIHsKKwlpZiAoY21kID09IEJOWDJYX01DQVNUX0NNRF9TRVQpIHsKKwkJQk5YMlhfRVJSKCJDYW4ndCB1c2UgYHNldCcgY29tbWFuZCBvbiBlMWghXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogTWFyaywgdGhhdCB0aGVyZSBpcyBhIHdvcmsgdG8gZG8gKi8KIAlpZiAoKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfREVMKSB8fCAoY21kID09IEJOWDJYX01DQVNUX0NNRF9SRVNUT1JFKSkKIAkJcC0+bWNhc3RfbGlzdF9sZW4gPSAxOwpAQCAtMzI2Miw3ICszNDcyLDggQEAKIAogc3RhdGljIHZvaWQgYm54MnhfbWNhc3RfcmV2ZXJ0X2UxaChzdHJ1Y3QgYm54MnggKmJwLAogCQkJCSAgICAgICBzdHJ1Y3QgYm54MnhfbWNhc3RfcmFtcm9kX3BhcmFtcyAqcCwKLQkJCQkgICAgICAgaW50IG9sZF9udW1fYmlucykKKwkJCQkgICAgICAgaW50IG9sZF9udW1fYmlucywKKwkJCQkgICAgICAgZW51bSBibngyeF9tY2FzdF9jbWQgY21kKQogewogCS8qIERvIG5vdGhpbmcgKi8KIH0KQEAgLTMzNzIsNiArMzU4MywxMSBAQAogCXN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8gPSBwLT5tY2FzdF9vYmo7CiAJaW50IHJlZ19zeiA9IG8tPmdldF9yZWdpc3RyeV9zaXplKG8pOwogCisJaWYgKGNtZCA9PSBCTlgyWF9NQ0FTVF9DTURfU0VUKSB7CisJCUJOWDJYX0VSUigiQ2FuJ3QgdXNlIGBzZXQnIGNvbW1hbmQgb24gZTEhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJc3dpdGNoIChjbWQpIHsKIAkvKiBERUwgY29tbWFuZCBkZWxldGVzIGFsbCBjdXJyZW50bHkgY29uZmlndXJlZCBNQUNzICovCiAJY2FzZSBCTlgyWF9NQ0FTVF9DTURfREVMOgpAQCAtMzQyMiw3ICszNjM4LDggQEAKIAogc3RhdGljIHZvaWQgYm54MnhfbWNhc3RfcmV2ZXJ0X2UxKHN0cnVjdCBibngyeCAqYnAsCiAJCQkJICAgICAgc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnAsCi0JCQkJICAgICAgaW50IG9sZF9udW1fbWFjcykKKwkJCQkgICBpbnQgb2xkX251bV9tYWNzLAorCQkJCSAgIGVudW0gYm54MnhfbWNhc3RfY21kIGNtZCkKIHsKIAlzdHJ1Y3QgYm54MnhfbWNhc3Rfb2JqICpvID0gcC0+bWNhc3Rfb2JqOwogCkBAIC0zNTcyLDYgKzM3ODksNyBAQAogCX0KIAogCWxpc3RfZGVsKCZjbWRfcG9zLT5saW5rKTsKKwlibngyeF9mcmVlX2dyb3VwcygmY21kX3Bvcy0+Z3JvdXBfaGVhZCk7CiAJa2ZyZWUoY21kX3Bvcyk7CiAKIAlyZXR1cm4gY250OwpAQCAtMzgxNiw3ICs0MDM0LDcgQEAKIAlyLT5jbGVhcl9wZW5kaW5nKHIpOwogCiBlcnJvcl9leGl0MToKLQlvLT5yZXZlcnQoYnAsIHAsIG9sZF9yZWdfc2l6ZSk7CisJby0+cmV2ZXJ0KGJwLCBwLCBvbGRfcmVnX3NpemUsIGNtZCk7CiAKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuaAppbmRleCA0MDQ4ZmM1Li4wYmYyZmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmgKQEAgLTUzNiw2ICs1MzYsMTUgQEAKIAlCTlgyWF9NQ0FTVF9DTURfQ09OVCwKIAlCTlgyWF9NQ0FTVF9DTURfREVMLAogCUJOWDJYX01DQVNUX0NNRF9SRVNUT1JFLAorCisJLyogRm9sbG93aW5nIHRoaXMsIG11bHRpY2FzdCBjb25maWd1cmF0aW9uIHNob3VsZCBlcXVhbCB0byBhcHByb3gKKwkgKiB0aGUgc2V0IG9mIE1BQ3MgcHJvdmlkZWQgW2kuZS4sIHJlbW92ZSBhbGwgZWxzZV0uCisJICogVGhlIHR3byBzdWItY29tbWFuZHMgYXJlIHVzZWQgaW50ZXJuYWxseSB0byBkZWNpZGUgd2hldGhlciBhIGdpdmVuCisJICogYmluIGlzIHRvIGJlIGFkZGVkIG9yIHJlbW92ZWQKKwkgKi8KKwlCTlgyWF9NQ0FTVF9DTURfU0VULAorCUJOWDJYX01DQVNUX0NNRF9TRVRfQURELAorCUJOWDJYX01DQVNUX0NNRF9TRVRfREVMLAogfTsKIAogc3RydWN0IGJueDJ4X21jYXN0X29iaiB7CkBAIC02MzUsNyArNjQ0LDggQEAKIAkgKi8KIAl2b2lkICgqcmV2ZXJ0KShzdHJ1Y3QgYm54MnggKmJwLAogCQkgICAgICAgc3RydWN0IGJueDJ4X21jYXN0X3JhbXJvZF9wYXJhbXMgKnAsCi0JCSAgICAgICBpbnQgb2xkX251bV9iaW5zKTsKKwkJICAgICAgIGludCBvbGRfbnVtX2JpbnMsCisJCSAgICAgICBlbnVtIGJueDJ4X21jYXN0X2NtZCBjbWQpOwogCiAJaW50ICgqZ2V0X3JlZ2lzdHJ5X3NpemUpKHN0cnVjdCBibngyeF9tY2FzdF9vYmogKm8pOwogCXZvaWQgKCpzZXRfcmVnaXN0cnlfc2l6ZSkoc3RydWN0IGJueDJ4X21jYXN0X29iaiAqbywgaW50IG4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmMKaW5kZXggNjMyZGFmZi4uM2Y3N2QwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5jCkBAIC01NzMsMTcgKzU3Myw2IEBACiAJCX0KIAl9CiAKLQkvKiBjbGVhciBleGlzdGluZyBtY2FzdHMgKi8KLQltY2FzdC5tY2FzdF9saXN0X2xlbiA9IHZmLT5tY2FzdF9saXN0X2xlbjsKLQl2Zi0+bWNhc3RfbGlzdF9sZW4gPSBtY19udW07Ci0JcmMgPSBibngyeF9jb25maWdfbWNhc3QoYnAsICZtY2FzdCwgQk5YMlhfTUNBU1RfQ01EX0RFTCk7Ci0JaWYgKHJjKSB7Ci0JCUJOWDJYX0VSUigiRmFpbGVkIHRvIHJlbW92ZSBtdWx0aWNhc3RzXG4iKTsKLQkJa2ZyZWUobWMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogdXBkYXRlIG1jYXN0IGxpc3Qgb24gdGhlIHJhbXJvZCBwYXJhbXMgKi8KIAlpZiAobWNfbnVtKSB7CiAJCUlOSVRfTElTVF9IRUFEKCZtY2FzdC5tY2FzdF9saXN0KTsKIAkJZm9yIChpID0gMDsgaSA8IG1jX251bTsgaSsrKSB7CkBAIC01OTQsMTIgKzU4MywxOCBAQAogCiAJCS8qIGFkZCBuZXcgbWNhc3RzICovCiAJCW1jYXN0Lm1jYXN0X2xpc3RfbGVuID0gbWNfbnVtOwotCQlyYyA9IGJueDJ4X2NvbmZpZ19tY2FzdChicCwgJm1jYXN0LCBCTlgyWF9NQ0FTVF9DTURfQUREKTsKKwkJcmMgPSBibngyeF9jb25maWdfbWNhc3QoYnAsICZtY2FzdCwgQk5YMlhfTUNBU1RfQ01EX1NFVCk7CiAJCWlmIChyYykKLQkJCUJOWDJYX0VSUigiRmFsZWQgdG8gYWRkIG11bHRpY2FzdHNcbiIpOwotCQlrZnJlZShtYyk7CisJCQlCTlgyWF9FUlIoIkZhbGVkIHRvIHNldCBtdWx0aWNhc3RzXG4iKTsKKwl9IGVsc2UgeworCQkvKiBjbGVhciBleGlzdGluZyBtY2FzdHMgKi8KKwkJcmMgPSBibngyeF9jb25maWdfbWNhc3QoYnAsICZtY2FzdCwgQk5YMlhfTUNBU1RfQ01EX0RFTCk7CisJCWlmIChyYykKKwkJCUJOWDJYX0VSUigiRmFpbGVkIHRvIHJlbW92ZSBtdWx0aWNhc3RzXG4iKTsKIAl9CiAKKwlrZnJlZShtYyk7CisKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE1ODMsNyArMTU3OCw2IEBACiAJCSAqICBJdCBuZWVkcyB0byBiZSBpbml0aWFsaXplZCBoZXJlIHNvIHRoYXQgaXQgY2FuIGJlIHNhZmVseQogCQkgKiAgaGFuZGxlZCBieSBhIHN1YnNlcXVlbnQgRkxSIGZsb3cuCiAJCSAqLwotCQl2Zi0+bWNhc3RfbGlzdF9sZW4gPSAwOwogCQlibngyeF9pbml0X21jYXN0X29iaihicCwgJnZmLT5tY2FzdF9vYmosIDB4RkYsCiAJCQkJICAgICAweEZGLCAweEZGLCAweEZGLAogCQkJCSAgICAgYm54MnhfdmZfc3AoYnAsIHZmLCBtY2FzdF9yZGF0YSksCkBAIC0yNTI3LDcgKzI1MjEsOCBAQAogCWZvcl9lYWNoX3ZmKGJwLCB2ZmlkeCkgewogCQlidWxsZXRpbiA9IEJQX1ZGX0JVTExFVElOKGJwLCB2ZmlkeCk7CiAJCWlmIChidWxsZXRpbi0+dmFsaWRfYml0bWFwICYgKDEgPDwgVkxBTl9WQUxJRCkpCi0JCQlibngyeF9zZXRfdmZfdmxhbihicC0+ZGV2LCB2ZmlkeCwgYnVsbGV0aW4tPnZsYW4sIDApOworCQkJYm54Mnhfc2V0X3ZmX3ZsYW4oYnAtPmRldiwgdmZpZHgsIGJ1bGxldGluLT52bGFuLCAwLAorCQkJCQkgIGh0b25zKEVUSF9QXzgwMjFRKSk7CiAJfQogfQogCkBAIC0yNzg3LDcgKzI3ODIsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgYm54Mnhfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmaWR4LCB1MTYgdmxhbiwgdTggcW9zKQoraW50IGJueDJ4X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZmlkeCwgdTE2IHZsYW4sIHU4IHFvcywKKwkJICAgICAgX19iZTE2IHZsYW5fcHJvdG8pCiB7CiAJc3RydWN0IHBmX3ZmX2J1bGxldGluX2NvbnRlbnQgKmJ1bGxldGluID0gTlVMTDsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTI4MDIsNiArMjc5OCw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKIAlEUChCTlgyWF9NU0dfSU9WLCAiY29uZmlndXJpbmcgVkYgJWQgd2l0aCBWTEFOICVkIHFvcyAlZFxuIiwKIAkgICB2ZmlkeCwgdmxhbiwgMCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5oCmluZGV4IDY3MGE1ODEuLjdhNmQ0MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuaApAQCAtMTk1LDcgKzE5NSw2IEBACiAJaW50IGxlYWRpbmdfcnNzOwogCiAJLyogTUNBU1Qgb2JqZWN0ICovCi0JaW50IG1jYXN0X2xpc3RfbGVuOwogCXN0cnVjdCBibngyeF9tY2FzdF9vYmoJCW1jYXN0X29iajsKIAogCS8qIFJTUyBjb25maWd1cmF0aW9uIG9iamVjdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuYwppbmRleCAyY2Y3OTEwLi5hOWY5ZjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHQuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4KICNpbmNsdWRlIDxuZXQvdWRwLmg+CkBAIC05Myw1MCArOTQsNDkgQEAKIAlCQ001NzQwNF9OUEFSLAogCUJDTTU3NDA2X05QQVIsCiAJQkNNNTc0MDdfU0ZQLAorCUJDTTU3NDA3X05QQVIsCiAJQkNNNTc0MTRfTlBBUiwKIAlCQ001NzQxNl9OUEFSLAotCUJDTTU3MzA0X1ZGLAotCUJDTTU3NDA0X1ZGLAotCUJDTTU3NDE0X1ZGLAotCUJDTTU3MzE0X1ZGLAorCU5FVFhUUkVNRV9FX1ZGLAorCU5FVFhUUkVNRV9DX1ZGLAogfTsKIAogLyogaW5kZXhlZCBieSBlbnVtIGFib3ZlICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAljaGFyICpuYW1lOwogfSBib2FyZF9pbmZvW10gPSB7Ci0JeyAiQnJvYWRjb20gQkNNNTczMDEgTmV0WHRyZW1lLUMgU2luZ2xlLXBvcnQgMTBHYiBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzMwMiBOZXRYdHJlbWUtQyBEdWFsLXBvcnQgMTBHYi8yNUdiIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MzA0IE5ldFh0cmVtZS1DIER1YWwtcG9ydCAxMEdiLzI1R2IvNDBHYi81MEdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MzAxIE5ldFh0cmVtZS1DIDEwR2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTczMDIgTmV0WHRyZW1lLUMgMTBHYi8yNUdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MzA0IE5ldFh0cmVtZS1DIDEwR2IvMjVHYi80MEdiLzUwR2IgRXRoZXJuZXQiIH0sCiAJeyAiQnJvYWRjb20gQkNNNTc0MTcgTmV0WHRyZW1lLUUgRXRoZXJuZXQgUGFydGl0aW9uIiB9LAotCXsgIkJyb2FkY29tIEJDTTU4NzAwIE5pdHJvIDQtcG9ydCAxR2IvMi41R2IvMTBHYiBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzMxMSBOZXRYdHJlbWUtQyBTaW5nbGUtcG9ydCAxMEdiIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3MzEyIE5ldFh0cmVtZS1DIER1YWwtcG9ydCAxMEdiLzI1R2IgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MDIgTmV0WHRyZW1lLUUgRHVhbC1wb3J0IDEwR2IgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MDQgTmV0WHRyZW1lLUUgRHVhbC1wb3J0IDEwR2IvMjVHYiBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQwNiBOZXRYdHJlbWUtRSBEdWFsLXBvcnQgMTBHQmFzZS1UIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU4NzAwIE5pdHJvIDFHYi8yLjVHYi8xMEdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3MzExIE5ldFh0cmVtZS1DIDEwR2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTczMTIgTmV0WHRyZW1lLUMgMTBHYi8yNUdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDAyIE5ldFh0cmVtZS1FIDEwR2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MDQgTmV0WHRyZW1lLUUgMTBHYi8yNUdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDA2IE5ldFh0cmVtZS1FIDEwR0Jhc2UtVCBFdGhlcm5ldCIgfSwKIAl7ICJCcm9hZGNvbSBCQ001NzQwMiBOZXRYdHJlbWUtRSBFdGhlcm5ldCBQYXJ0aXRpb24iIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MDcgTmV0WHRyZW1lLUUgRHVhbC1wb3J0IDEwR0Jhc2UtVCBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQxMiBOZXRYdHJlbWUtRSBEdWFsLXBvcnQgMTBHYiBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQxNCBOZXRYdHJlbWUtRSBEdWFsLXBvcnQgMTBHYi8yNUdiIEV0aGVybmV0IiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDE2IE5ldFh0cmVtZS1FIER1YWwtcG9ydCAxMEdCYXNlLVQgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MTcgTmV0WHRyZW1lLUUgRHVhbC1wb3J0IDEwR0Jhc2UtVCBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQwNyBOZXRYdHJlbWUtRSAxMEdCYXNlLVQgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MTIgTmV0WHRyZW1lLUUgMTBHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQxNCBOZXRYdHJlbWUtRSAxMEdiLzI1R2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MTYgTmV0WHRyZW1lLUUgMTBHQmFzZS1UIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDE3IE5ldFh0cmVtZS1FIDEwR0Jhc2UtVCBFdGhlcm5ldCIgfSwKIAl7ICJCcm9hZGNvbSBCQ001NzQxMiBOZXRYdHJlbWUtRSBFdGhlcm5ldCBQYXJ0aXRpb24iIH0sCi0JeyAiQnJvYWRjb20gQkNNNTczMTQgTmV0WHRyZW1lLUMgRHVhbC1wb3J0IDEwR2IvMjVHYi80MEdiLzUwR2IgRXRoZXJuZXQiIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MTcgTmV0WHRyZW1lLUUgRHVhbC1wb3J0IDEwR2IvMjVHYiBFdGhlcm5ldCIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzQxNiBOZXRYdHJlbWUtRSBEdWFsLXBvcnQgMTBHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzMxNCBOZXRYdHJlbWUtQyAxMEdiLzI1R2IvNDBHYi81MEdiIEV0aGVybmV0IiB9LAorCXsgIkJyb2FkY29tIEJDTTU3NDE3IE5ldFh0cmVtZS1FIDEwR2IvMjVHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQxNiBOZXRYdHJlbWUtRSAxMEdiIEV0aGVybmV0IiB9LAogCXsgIkJyb2FkY29tIEJDTTU3NDA0IE5ldFh0cmVtZS1FIEV0aGVybmV0IFBhcnRpdGlvbiIgfSwKIAl7ICJCcm9hZGNvbSBCQ001NzQwNiBOZXRYdHJlbWUtRSBFdGhlcm5ldCBQYXJ0aXRpb24iIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MDcgTmV0WHRyZW1lLUUgRHVhbC1wb3J0IDI1R2IgRXRoZXJuZXQiIH0sCisJeyAiQnJvYWRjb20gQkNNNTc0MDcgTmV0WHRyZW1lLUUgMjVHYiBFdGhlcm5ldCIgfSwKKwl7ICJCcm9hZGNvbSBCQ001NzQwNyBOZXRYdHJlbWUtRSBFdGhlcm5ldCBQYXJ0aXRpb24iIH0sCiAJeyAiQnJvYWRjb20gQkNNNTc0MTQgTmV0WHRyZW1lLUUgRXRoZXJuZXQgUGFydGl0aW9uIiB9LAogCXsgIkJyb2FkY29tIEJDTTU3NDE2IE5ldFh0cmVtZS1FIEV0aGVybmV0IFBhcnRpdGlvbiIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzMwNCBOZXRYdHJlbWUtQyBFdGhlcm5ldCBWaXJ0dWFsIEZ1bmN0aW9uIiB9LAotCXsgIkJyb2FkY29tIEJDTTU3NDA0IE5ldFh0cmVtZS1FIEV0aGVybmV0IFZpcnR1YWwgRnVuY3Rpb24iIH0sCi0JeyAiQnJvYWRjb20gQkNNNTc0MTQgTmV0WHRyZW1lLUUgRXRoZXJuZXQgVmlydHVhbCBGdW5jdGlvbiIgfSwKLQl7ICJCcm9hZGNvbSBCQ001NzMxNCBOZXRYdHJlbWUtRSBFdGhlcm5ldCBWaXJ0dWFsIEZ1bmN0aW9uIiB9LAorCXsgIkJyb2FkY29tIE5ldFh0cmVtZS1FIEV0aGVybmV0IFZpcnR1YWwgRnVuY3Rpb24iIH0sCisJeyAiQnJvYWRjb20gTmV0WHRyZW1lLUMgRXRoZXJuZXQgVmlydHVhbCBGdW5jdGlvbiIgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBibnh0X3BjaV90YmxbXSA9IHsKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2YzApLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQxN19OUEFSIH0sCiAJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmM4KSwgLmRyaXZlcl9kYXRhID0gQkNNNTczMDEgfSwKIAl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2YzkpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzMwMiB9LAogCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZjYSksIC5kcml2ZXJfZGF0YSA9IEJDTTU3MzA0IH0sCkBAIC0xNjAsMTMgKzE2MCwxOSBAQAogCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlNyksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDA0X05QQVIgfSwKIAl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZTgpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQwNl9OUEFSIH0sCiAJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmU5KSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MDdfU0ZQIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmVhKSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MDdfTlBBUiB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlYiksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDEyX05QQVIgfSwKIAl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZWMpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQxNF9OUEFSIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmVkKSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MTRfTlBBUiB9LAogCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZlZSksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDE2X05QQVIgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZWYpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzQxNl9OUEFSIH0sCiAjaWZkZWYgQ09ORklHX0JOWFRfU1JJT1YKLQl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2Y2IpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzMwNF9WRiB9LAotCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZkMyksIC5kcml2ZXJfZGF0YSA9IEJDTTU3NDA0X1ZGIH0sCi0JeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmRjKSwgLmRyaXZlcl9kYXRhID0gQkNNNTc0MTRfVkYgfSwKLQl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZTEpLCAuZHJpdmVyX2RhdGEgPSBCQ001NzMxNF9WRiB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZjMSksIC5kcml2ZXJfZGF0YSA9IE5FVFhUUkVNRV9FX1ZGIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmNiKSwgLmRyaXZlcl9kYXRhID0gTkVUWFRSRU1FX0NfVkYgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZDMpLCAuZHJpdmVyX2RhdGEgPSBORVRYVFJFTUVfRV9WRiB9LAorCXsgUENJX1ZERVZJQ0UoQlJPQURDT00sIDB4MTZkYyksIC5kcml2ZXJfZGF0YSA9IE5FVFhUUkVNRV9FX1ZGIH0sCisJeyBQQ0lfVkRFVklDRShCUk9BRENPTSwgMHgxNmUxKSwgLmRyaXZlcl9kYXRhID0gTkVUWFRSRU1FX0NfVkYgfSwKKwl7IFBDSV9WREVWSUNFKEJST0FEQ09NLCAweDE2ZTUpLCAuZHJpdmVyX2RhdGEgPSBORVRYVFJFTUVfQ19WRiB9LAogI2VuZGlmCiAJeyAwIH0KIH07CkBAIC0xODksOCArMTk1LDcgQEAKIAogc3RhdGljIGJvb2wgYm54dF92Zl9wY2lpZChlbnVtIGJvYXJkX2lkeCBpZHgpCiB7Ci0JcmV0dXJuIChpZHggPT0gQkNNNTczMDRfVkYgfHwgaWR4ID09IEJDTTU3NDA0X1ZGIHx8Ci0JCWlkeCA9PSBCQ001NzMxNF9WRiB8fCBpZHggPT0gQkNNNTc0MTRfVkYpOworCXJldHVybiAoaWR4ID09IE5FVFhUUkVNRV9DX1ZGIHx8IGlkeCA9PSBORVRYVFJFTUVfRV9WRik7CiB9CiAKICNkZWZpbmUgREJfQ1BfUkVBUk1fRkxBR1MJKERCX0tFWV9DUCB8IERCX0lEWF9WQUxJRCkKQEAgLTM1Myw4ICszNTgsOCBAQAogCQlwdXNoX2xlbiA9IChsZW5ndGggKyBzaXplb2YoKnR4X3B1c2gpICsgNykgLyA4OwogCQlpZiAocHVzaF9sZW4gPiAxNikgewogCQkJX19pb3dyaXRlNjRfY29weSh0eHItPnR4X2Rvb3JiZWxsLCB0eF9wdXNoX2J1ZiwgMTYpOwotCQkJX19pb3dyaXRlNjRfY29weSh0eHItPnR4X2Rvb3JiZWxsICsgNCwgdHhfcHVzaF9idWYgKyAxLAotCQkJCQkgcHVzaF9sZW4gLSAxNik7CisJCQlfX2lvd3JpdGUzMl9jb3B5KHR4ci0+dHhfZG9vcmJlbGwgKyA0LCB0eF9wdXNoX2J1ZiArIDEsCisJCQkJCSAocHVzaF9sZW4gLSAxNikgPDwgMSk7CiAJCX0gZWxzZSB7CiAJCQlfX2lvd3JpdGU2NF9jb3B5KHR4ci0+dHhfZG9vcmJlbGwsIHR4X3B1c2hfYnVmLAogCQkJCQkgcHVzaF9sZW4pOwpAQCAtMzQxOSwxMCArMzQyNCwxMCBAQAogCiAJYm54dF9od3JtX2NtZF9oZHJfaW5pdChicCwgJnJlcSwgSFdSTV9WTklDX1JTU19DRkcsIC0xLCAtMSk7CiAJaWYgKHNldF9yc3MpIHsKLQkJdm5pYy0+aGFzaF90eXBlID0gQk5YVF9SU1NfSEFTSF9UWVBFX0ZMQUdfSVBWNCB8Ci0JCQkJIEJOWFRfUlNTX0hBU0hfVFlQRV9GTEFHX1RDUF9JUFY0IHwKLQkJCQkgQk5YVF9SU1NfSEFTSF9UWVBFX0ZMQUdfSVBWNiB8Ci0JCQkJIEJOWFRfUlNTX0hBU0hfVFlQRV9GTEFHX1RDUF9JUFY2OworCQl2bmljLT5oYXNoX3R5cGUgPSBWTklDX1JTU19DRkdfUkVRX0hBU0hfVFlQRV9JUFY0IHwKKwkJCQkgIFZOSUNfUlNTX0NGR19SRVFfSEFTSF9UWVBFX1RDUF9JUFY0IHwKKwkJCQkgIFZOSUNfUlNTX0NGR19SRVFfSEFTSF9UWVBFX0lQVjYgfAorCQkJCSAgVk5JQ19SU1NfQ0ZHX1JFUV9IQVNIX1RZUEVfVENQX0lQVjY7CiAKIAkJcmVxLmhhc2hfdHlwZSA9IGNwdV90b19sZTMyKHZuaWMtPmhhc2hfdHlwZSk7CiAKQEAgLTQxNTYsNiArNDE2MSwxMSBAQAogCWlmIChyYykKIAkJZ290byBod3JtX2Z1bmNfcWNhcHNfZXhpdDsKIAorCWJwLT50eF9wdXNoX3RocmVzaCA9IDA7CisJaWYgKHJlc3AtPmZsYWdzICYKKwkgICAgY3B1X3RvX2xlMzIoRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX1BVU0hfTU9ERV9TVVBQT1JURUQpKQorCQlicC0+dHhfcHVzaF90aHJlc2ggPSBCTlhUX1RYX1BVU0hfVEhSRVNIOworCiAJaWYgKEJOWFRfUEYoYnApKSB7CiAJCXN0cnVjdCBibnh0X3BmX2luZm8gKnBmID0gJmJwLT5wZjsKIApAQCAtNDE4NywxMiArNDE5Nyw2IEBACiAJCXN0cnVjdCBibnh0X3ZmX2luZm8gKnZmID0gJmJwLT52ZjsKIAogCQl2Zi0+ZndfZmlkID0gbGUxNl90b19jcHUocmVzcC0+ZmlkKTsKLQkJbWVtY3B5KHZmLT5tYWNfYWRkciwgcmVzcC0+bWFjX2FkZHJlc3MsIEVUSF9BTEVOKTsKLQkJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIodmYtPm1hY19hZGRyKSkKLQkJCS8qIG92ZXJ3cml0ZSBuZXRkZXYgZGV2X2FkciB3aXRoIGFkbWluIFZGIE1BQyAqLwotCQkJbWVtY3B5KGJwLT5kZXYtPmRldl9hZGRyLCB2Zi0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKLQkJZWxzZQotCQkJcmFuZG9tX2V0aGVyX2FkZHIoYnAtPmRldi0+ZGV2X2FkZHIpOwogCiAJCXZmLT5tYXhfcnNzY29zX2N0eHMgPSBsZTE2X3RvX2NwdShyZXNwLT5tYXhfcnNzY29zX2N0eCk7CiAJCXZmLT5tYXhfY3BfcmluZ3MgPSBsZTE2X3RvX2NwdShyZXNwLT5tYXhfY21wbF9yaW5ncyk7CkBAIC00MjA0LDE0ICs0MjA4LDIxIEBACiAJCXZmLT5tYXhfbDJfY3R4cyA9IGxlMTZfdG9fY3B1KHJlc3AtPm1heF9sMl9jdHhzKTsKIAkJdmYtPm1heF92bmljcyA9IGxlMTZfdG9fY3B1KHJlc3AtPm1heF92bmljcyk7CiAJCXZmLT5tYXhfc3RhdF9jdHhzID0gbGUxNl90b19jcHUocmVzcC0+bWF4X3N0YXRfY3R4KTsKKworCQltZW1jcHkodmYtPm1hY19hZGRyLCByZXNwLT5tYWNfYWRkcmVzcywgRVRIX0FMRU4pOworCQltdXRleF91bmxvY2soJmJwLT5od3JtX2NtZF9sb2NrKTsKKworCQlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcih2Zi0+bWFjX2FkZHIpKSB7CisJCQkvKiBvdmVyd3JpdGUgbmV0ZGV2IGRldl9hZHIgd2l0aCBhZG1pbiBWRiBNQUMgKi8KKwkJCW1lbWNweShicC0+ZGV2LT5kZXZfYWRkciwgdmYtPm1hY19hZGRyLCBFVEhfQUxFTik7CisJCX0gZWxzZSB7CisJCQlyYW5kb21fZXRoZXJfYWRkcihicC0+ZGV2LT5kZXZfYWRkcik7CisJCQlyYyA9IGJueHRfYXBwcm92ZV9tYWMoYnAsIGJwLT5kZXYtPmRldl9hZGRyKTsKKwkJfQorCQlyZXR1cm4gcmM7CiAjZW5kaWYKIAl9CiAKLQlicC0+dHhfcHVzaF90aHJlc2ggPSAwOwotCWlmIChyZXNwLT5mbGFncyAmCi0JICAgIGNwdV90b19sZTMyKEZVTkNfUUNBUFNfUkVTUF9GTEFHU19QVVNIX01PREVfU1VQUE9SVEVEKSkKLQkJYnAtPnR4X3B1c2hfdGhyZXNoID0gQk5YVF9UWF9QVVNIX1RIUkVTSDsKLQogaHdybV9mdW5jX3FjYXBzX2V4aXQ6CiAJbXV0ZXhfdW5sb2NrKCZicC0+aHdybV9jbWRfbG9jayk7CiAJcmV0dXJuIHJjOwpAQCAtNDI0OSw2ICs0MjYwLDkgQEAKIAlpZiAoYnAtPm1heF90YyA+IEJOWFRfTUFYX1FVRVVFKQogCQlicC0+bWF4X3RjID0gQk5YVF9NQVhfUVVFVUU7CiAKKwlpZiAocmVzcC0+cXVldWVfY2ZnX2luZm8gJiBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0NGR19JTkZPX0FTWU1fQ0ZHKQorCQlicC0+bWF4X3RjID0gMTsKKwogCXFwdHIgPSAmcmVzcC0+cXVldWVfaWQwOwogCWZvciAoaSA9IDA7IGkgPCBicC0+bWF4X3RjOyBpKyspIHsKIAkJYnAtPnFfaW5mb1tpXS5xdWV1ZV9pZCA9ICpxcHRyKys7CkBAIC00MzA3LDYgKzQzMjEsMzEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK2ludCBibnh0X2h3cm1fZndfc2V0X3RpbWUoc3RydWN0IGJueHQgKmJwKQoreworI2lmIElTX0VOQUJMRUQoQ09ORklHX1JUQ19MSUIpCisJc3RydWN0IGh3cm1fZndfc2V0X3RpbWVfaW5wdXQgcmVxID0gezB9OworCXN0cnVjdCBydGNfdGltZSB0bTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKworCWlmIChicC0+aHdybV9zcGVjX2NvZGUgPCAweDEwNDAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKKwlydGNfdGltZV90b190bSh0di50dl9zZWMsICZ0bSk7CisJYm54dF9od3JtX2NtZF9oZHJfaW5pdChicCwgJnJlcSwgSFdSTV9GV19TRVRfVElNRSwgLTEsIC0xKTsKKwlyZXEueWVhciA9IGNwdV90b19sZTE2KDE5MDAgKyB0bS50bV95ZWFyKTsKKwlyZXEubW9udGggPSAxICsgdG0udG1fbW9uOworCXJlcS5kYXkgPSB0bS50bV9tZGF5OworCXJlcS5ob3VyID0gdG0udG1faG91cjsKKwlyZXEubWludXRlID0gdG0udG1fbWluOworCXJlcS5zZWNvbmQgPSB0bS50bV9zZWM7CisJcmV0dXJuIGh3cm1fc2VuZF9tZXNzYWdlKGJwLCAmcmVxLCBzaXplb2YocmVxKSwgSFdSTV9DTURfVElNRU9VVCk7CisjZWxzZQorCXJldHVybiAtRU9QTk9UU1VQUDsKKyNlbmRpZgorfQorCiBzdGF0aWMgaW50IGJueHRfaHdybV9wb3J0X3FzdGF0cyhzdHJ1Y3QgYm54dCAqYnApCiB7CiAJaW50IHJjOwpAQCAtNjgwNCw2ICs2ODQzLDggQEAKIAlpZiAocmMpCiAJCWdvdG8gaW5pdF9lcnI7CiAKKwlibnh0X2h3cm1fZndfc2V0X3RpbWUoYnApOworCiAJZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNIHwgTkVUSUZfRl9TRyB8CiAJCQkgICBORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNiB8CiAJCQkgICBORVRJRl9GX0dTT19VRFBfVFVOTkVMIHwgTkVUSUZfRl9HU09fR1JFIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmgKaW5kZXggMjNlMDRhNi4uNTFiMTY0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0LmgKQEAgLTExLDEwICsxMSwxMCBAQAogI2RlZmluZSBCTlhUX0gKIAogI2RlZmluZSBEUlZfTU9EVUxFX05BTUUJCSJibnh0X2VuIgotI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuMy4wIgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuNS4wIgogCiAjZGVmaW5lIERSVl9WRVJfTUFKCTEKLSNkZWZpbmUgRFJWX1ZFUl9NSU4JMworI2RlZmluZSBEUlZfVkVSX01JTgk1CiAjZGVmaW5lIERSVl9WRVJfVVBECTAKIAogc3RydWN0IHR4X2JkIHsKQEAgLTEwNiwxMSArMTA2LDExIEBACiAJICNkZWZpbmUgQ01QX1RZUEVfUkVNT1RFX0RSSVZFUl9SRVEJCQkgMzQKIAkgI2RlZmluZSBDTVBfVFlQRV9SRU1PVEVfRFJJVkVSX1JFU1AJCQkgMzYKIAkgI2RlZmluZSBDTVBfVFlQRV9FUlJPUl9TVEFUVVMJCQkJIDQ4Ci0JICNkZWZpbmUgQ01QTF9CQVNFX1RZUEVfU1RBVF9FSkVDVAkJCSAoMHgxYVVMIDw8IDApCi0JICNkZWZpbmUgQ01QTF9CQVNFX1RZUEVfSFdSTV9ET05FCQkJICgweDIwVUwgPDwgMCkKLQkgI2RlZmluZSBDTVBMX0JBU0VfVFlQRV9IV1JNX0ZXRF9SRVEJCQkgKDB4MjJVTCA8PCAwKQotCSAjZGVmaW5lIENNUExfQkFTRV9UWVBFX0hXUk1fRldEX1JFU1AJCQkgKDB4MjRVTCA8PCAwKQotCSAjZGVmaW5lIENNUExfQkFTRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQJCSAoMHgyZVVMIDw8IDApCisJICNkZWZpbmUgQ01QTF9CQVNFX1RZUEVfU1RBVF9FSkVDVAkJCSAweDFhVUwKKwkgI2RlZmluZSBDTVBMX0JBU0VfVFlQRV9IV1JNX0RPTkUJCQkgMHgyMFVMCisJICNkZWZpbmUgQ01QTF9CQVNFX1RZUEVfSFdSTV9GV0RfUkVRCQkJIDB4MjJVTAorCSAjZGVmaW5lIENNUExfQkFTRV9UWVBFX0hXUk1fRldEX1JFU1AJCQkgMHgyNFVMCisJICNkZWZpbmUgQ01QTF9CQVNFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVAkJIDB4MmVVTAogCiAJI2RlZmluZSBUWF9DTVBfRkxBR1NfRVJST1IJCQkJKDEgPDwgNikKIAkjZGVmaW5lIFRYX0NNUF9GTEFHU19QVVNICQkJCSgxIDw8IDcpCkBAIC0zODksMTEgKzM4OSw2IEBACiAKICNkZWZpbmUgSU5WQUxJRF9IV19SSU5HX0lECSgodTE2KS0xKQogCi0jZGVmaW5lIEJOWFRfUlNTX0hBU0hfVFlQRV9GTEFHX0lQVjQJCTB4MDEKLSNkZWZpbmUgQk5YVF9SU1NfSEFTSF9UWVBFX0ZMQUdfVENQX0lQVjQJMHgwMgotI2RlZmluZSBCTlhUX1JTU19IQVNIX1RZUEVfRkxBR19JUFY2CQkweDA0Ci0jZGVmaW5lIEJOWFRfUlNTX0hBU0hfVFlQRV9GTEFHX1RDUF9JUFY2CTB4MDgKLQogLyogVGhlIGhhcmR3YXJlIHN1cHBvcnRzIGNlcnRhaW4gcGFnZSBzaXplcy4gIFVzZSB0aGUgc3VwcG9ydGVkIHBhZ2Ugc2l6ZXMKICAqIHRvIGFsbG9jYXRlIHRoZSByaW5ncy4KICAqLwpAQCAtNDE4LDcgKzQxMyw3IEBACiAKICNkZWZpbmUgQk5YVF9SWF9QQUdFX1NJWkUgKDEgPDwgQk5YVF9SWF9QQUdFX1NISUZUKQogCi0jZGVmaW5lIEJOWFRfTUlOX1BLVF9TSVpFCTQ1CisjZGVmaW5lIEJOWFRfTUlOX1BLVF9TSVpFCTUyCiAKICNkZWZpbmUgQk5YVF9OVU1fVEVTVFMoYnApCTAKIApAQCAtMTIyNSw2ICsxMjIwLDcgQEAKIGludCBibnh0X2h3cm1fZnVuY19xY2FwcyhzdHJ1Y3QgYm54dCAqKTsKIGludCBibnh0X2h3cm1fc2V0X3BhdXNlKHN0cnVjdCBibnh0ICopOwogaW50IGJueHRfaHdybV9zZXRfbGlua19zZXR0aW5nKHN0cnVjdCBibnh0ICosIGJvb2wsIGJvb2wpOworaW50IGJueHRfaHdybV9md19zZXRfdGltZShzdHJ1Y3QgYm54dCAqKTsKIGludCBibnh0X29wZW5fbmljKHN0cnVjdCBibnh0ICosIGJvb2wsIGJvb2wpOwogaW50IGJueHRfY2xvc2VfbmljKHN0cnVjdCBibnh0ICosIGJvb2wsIGJvb2wpOwogaW50IGJueHRfZ2V0X21heF9yaW5ncyhzdHJ1Y3QgYm54dCAqLCBpbnQgKiwgaW50ICosIGJvb2wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9ldGh0b29sLmMKaW5kZXggYjgzZTE3NC4uYTdlMDRmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZXRodG9vbC5jCkBAIC0yMSw2ICsyMSw4IEBACiAjaW5jbHVkZSAiYm54dF9udm1fZGVmcy5oIgkvKiBOVlJBTSBjb250ZW50IGNvbnN0YW50IGFuZCBzdHJ1Y3R1cmUgZGVmcyAqLwogI2luY2x1ZGUgImJueHRfZndfaGRyLmgiCS8qIEZpcm13YXJlIGhkciBjb25zdGFudCBhbmQgc3RydWN0dXJlIGRlZnMgKi8KICNkZWZpbmUgRkxBU0hfTlZSQU1fVElNRU9VVAkoKEhXUk1fQ01EX1RJTUVPVVQpICogMTAwKQorI2RlZmluZSBGTEFTSF9QQUNLQUdFX1RJTUVPVVQJKChIV1JNX0NNRF9USU1FT1VUKSAqIDIwMCkKKyNkZWZpbmUgSU5TVEFMTF9QQUNLQUdFX1RJTUVPVVQJKChIV1JNX0NNRF9USU1FT1VUKSAqIDIwMCkKIAogc3RhdGljIGNoYXIgKmJueHRfZ2V0X3BrZ3ZlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pOwogCkBAIC0zNDYsNyArMzQ4LDcgQEAKIAlpbnQgbWF4X3J4X3JpbmdzLCBtYXhfdHhfcmluZ3MsIHRjczsKIAogCWJueHRfZ2V0X21heF9yaW5ncyhicCwgJm1heF9yeF9yaW5ncywgJm1heF90eF9yaW5ncywgdHJ1ZSk7Ci0JY2hhbm5lbC0+bWF4X2NvbWJpbmVkID0gbWF4X3J4X3JpbmdzOworCWNoYW5uZWwtPm1heF9jb21iaW5lZCA9IG1heF90KGludCwgbWF4X3J4X3JpbmdzLCBtYXhfdHhfcmluZ3MpOwogCiAJaWYgKGJueHRfZ2V0X21heF9yaW5ncyhicCwgJm1heF9yeF9yaW5ncywgJm1heF90eF9yaW5ncywgZmFsc2UpKSB7CiAJCW1heF9yeF9yaW5ncyA9IDA7CkBAIC00MDQsOCArNDA2LDggQEAKIAlpZiAodGNzID4gMSkKIAkJbWF4X3R4X3JpbmdzIC89IHRjczsKIAotCWlmIChzaCAmJiAoY2hhbm5lbC0+Y29tYmluZWRfY291bnQgPiBtYXhfcnhfcmluZ3MgfHwKLQkJICAgY2hhbm5lbC0+Y29tYmluZWRfY291bnQgPiBtYXhfdHhfcmluZ3MpKQorCWlmIChzaCAmJgorCSAgICBjaGFubmVsLT5jb21iaW5lZF9jb3VudCA+IG1heF90KGludCwgbWF4X3J4X3JpbmdzLCBtYXhfdHhfcmluZ3MpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmICghc2ggJiYgKGNoYW5uZWwtPnJ4X2NvdW50ID4gbWF4X3J4X3JpbmdzIHx8CkBAIC00MjgsOCArNDMwLDEwIEBACiAKIAlpZiAoc2gpIHsKIAkJYnAtPmZsYWdzIHw9IEJOWFRfRkxBR19TSEFSRURfUklOR1M7Ci0JCWJwLT5yeF9ucl9yaW5ncyA9IGNoYW5uZWwtPmNvbWJpbmVkX2NvdW50OwotCQlicC0+dHhfbnJfcmluZ3NfcGVyX3RjID0gY2hhbm5lbC0+Y29tYmluZWRfY291bnQ7CisJCWJwLT5yeF9ucl9yaW5ncyA9IG1pbl90KGludCwgY2hhbm5lbC0+Y29tYmluZWRfY291bnQsCisJCQkJCW1heF9yeF9yaW5ncyk7CisJCWJwLT50eF9ucl9yaW5nc19wZXJfdGMgPSBtaW5fdChpbnQsIGNoYW5uZWwtPmNvbWJpbmVkX2NvdW50LAorCQkJCQkgICAgICAgbWF4X3R4X3JpbmdzKTsKIAl9IGVsc2UgewogCQlicC0+ZmxhZ3MgJj0gfkJOWFRfRkxBR19TSEFSRURfUklOR1M7CiAJCWJwLT5yeF9ucl9yaW5ncyA9IGNoYW5uZWwtPnJ4X2NvdW50OwpAQCAtMTAyOCw2ICsxMDMyLDEwIEBACiAJcmV0dXJuIGJwLT5saW5rX2luZm8ubGlua191cDsKIH0KIAorc3RhdGljIGludCBibnh0X2ZpbmRfbnZyYW1faXRlbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgdHlwZSwgdTE2IG9yZGluYWwsCisJCQkJdTE2IGV4dCwgdTE2ICppbmRleCwgdTMyICppdGVtX2xlbmd0aCwKKwkJCQl1MzIgKmRhdGFfbGVuZ3RoKTsKKwogc3RhdGljIGludCBibnh0X2ZsYXNoX252cmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgdTE2IGRpcl90eXBlLAogCQkJICAgIHUxNiBkaXJfb3JkaW5hbCwKQEAgLTExNzksNyArMTE4Nyw2IEBACiAJCQkgICAodW5zaWduZWQgbG9uZyljYWxjdWxhdGVkX2NyYyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQkvKiBUT0RPOiBWYWxpZGF0ZSBkaWdpdGFsIHNpZ25hdHVyZSAoUlNBLWVuY3J5cHRlZCBTSEEtMjU2IGhhc2gpIGhlcmUgKi8KIAlyYyA9IGJueHRfZmxhc2hfbnZyYW0oZGV2LCBkaXJfdHlwZSwgQk5YX0RJUl9PUkRJTkFMX0ZJUlNULAogCQkJICAgICAgMCwgMCwgZndfZGF0YSwgZndfc2l6ZSk7CiAJaWYgKHJjID09IDApCS8qIEZpcm13YXJlIHVwZGF0ZSBzdWNjZXNzZnVsICovCkBAIC0xMTg4LDYgKzExOTUsNTcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgYm54dF9mbGFzaF9taWNyb2NvZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQl1MTYgZGlyX3R5cGUsCisJCQkJY29uc3QgdTggKmZ3X2RhdGEsCisJCQkJc2l6ZV90IGZ3X3NpemUpCit7CisJc3RydWN0IGJueHRfdWNvZGVfdHJhaWxlciAqdHJhaWxlcjsKKwl1MzIgY2FsY3VsYXRlZF9jcmM7CisJdTMyIHN0b3JlZF9jcmM7CisJaW50IHJjID0gMDsKKworCWlmIChmd19zaXplIDwgc2l6ZW9mKHN0cnVjdCBibnh0X3Vjb2RlX3RyYWlsZXIpKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiSW52YWxpZCBtaWNyb2NvZGUgZmlsZSBzaXplOiAldVxuIiwKKwkJCSAgICh1bnNpZ25lZCBpbnQpZndfc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0cmFpbGVyID0gKHN0cnVjdCBibnh0X3Vjb2RlX3RyYWlsZXIgKikoZndfZGF0YSArIChmd19zaXplIC0KKwkJCQkJCXNpemVvZigqdHJhaWxlcikpKTsKKwlpZiAodHJhaWxlci0+c2lnICE9IGNwdV90b19sZTMyKEJOWFRfVUNPREVfVFJBSUxFUl9TSUdOQVRVUkUpKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiSW52YWxpZCBtaWNyb2NvZGUgdHJhaWxlciBzaWduYXR1cmU6ICUwOFhcbiIsCisJCQkgICBsZTMyX3RvX2NwdSh0cmFpbGVyLT5zaWcpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChsZTE2X3RvX2NwdSh0cmFpbGVyLT5kaXJfdHlwZSkgIT0gZGlyX3R5cGUpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJFeHBlY3RlZCBtaWNyb2NvZGUgdHlwZTogJWQsIHJlYWQ6ICVkXG4iLAorCQkJICAgZGlyX3R5cGUsIGxlMTZfdG9fY3B1KHRyYWlsZXItPmRpcl90eXBlKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobGUxNl90b19jcHUodHJhaWxlci0+dHJhaWxlcl9sZW5ndGgpIDwKKwkJc2l6ZW9mKHN0cnVjdCBibnh0X3Vjb2RlX3RyYWlsZXIpKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiSW52YWxpZCBtaWNyb2NvZGUgdHJhaWxlciBsZW5ndGg6ICVkXG4iLAorCQkJICAgbGUxNl90b19jcHUodHJhaWxlci0+dHJhaWxlcl9sZW5ndGgpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29uZmlybSB0aGUgQ1JDMzIgY2hlY2tzdW0gb2YgdGhlIGZpbGU6ICovCisJc3RvcmVkX2NyYyA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKGZ3X2RhdGEgKyBmd19zaXplIC0KKwkJCQkJICAgICBzaXplb2Yoc3RvcmVkX2NyYykpKTsKKwljYWxjdWxhdGVkX2NyYyA9IH5jcmMzMih+MCwgZndfZGF0YSwgZndfc2l6ZSAtIHNpemVvZihzdG9yZWRfY3JjKSk7CisJaWYgKGNhbGN1bGF0ZWRfY3JjICE9IHN0b3JlZF9jcmMpIHsKKwkJbmV0ZGV2X2VycihkZXYsCisJCQkgICAiQ1JDMzIgKCUwOGxYKSBkb2VzIG5vdCBtYXRjaCBjYWxjdWxhdGVkOiAlMDhsWFxuIiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKXN0b3JlZF9jcmMsCisJCQkgICAodW5zaWduZWQgbG9uZyljYWxjdWxhdGVkX2NyYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyYyA9IGJueHRfZmxhc2hfbnZyYW0oZGV2LCBkaXJfdHlwZSwgQk5YX0RJUl9PUkRJTkFMX0ZJUlNULAorCQkJICAgICAgMCwgMCwgZndfZGF0YSwgZndfc2l6ZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBib29sIGJueHRfZGlyX3R5cGVfaXNfYXBlX2Jpbl9mb3JtYXQodTE2IGRpcl90eXBlKQogewogCXN3aXRjaCAoZGlyX3R5cGUpIHsKQEAgLTEyMDYsNyArMTI2NCw3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBibnh0X2Rpcl90eXBlX2lzX3VucHJvdGVjdGVkX2V4ZWNfZm9ybWF0KHUxNiBkaXJfdHlwZSkKK3N0YXRpYyBib29sIGJueHRfZGlyX3R5cGVfaXNfb3RoZXJfZXhlY19mb3JtYXQodTE2IGRpcl90eXBlKQogewogCXN3aXRjaCAoZGlyX3R5cGUpIHsKIAljYXNlIEJOWF9ESVJfVFlQRV9BVlM6CkBAIC0xMjI3LDcgKzEyODUsNyBAQAogc3RhdGljIGJvb2wgYm54dF9kaXJfdHlwZV9pc19leGVjdXRhYmxlKHUxNiBkaXJfdHlwZSkKIHsKIAlyZXR1cm4gYm54dF9kaXJfdHlwZV9pc19hcGVfYmluX2Zvcm1hdChkaXJfdHlwZSkgfHwKLQkJYm54dF9kaXJfdHlwZV9pc191bnByb3RlY3RlZF9leGVjX2Zvcm1hdChkaXJfdHlwZSk7CisJCWJueHRfZGlyX3R5cGVfaXNfb3RoZXJfZXhlY19mb3JtYXQoZGlyX3R5cGUpOwogfQogCiBzdGF0aWMgaW50IGJueHRfZmxhc2hfZmlybXdhcmVfZnJvbV9maWxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0xMjM3LDEwICsxMjk1LDYgQEAKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgICpmdzsKIAlpbnQJCQlyYzsKIAotCWlmIChkaXJfdHlwZSAhPSBCTlhfRElSX1RZUEVfVVBEQVRFICYmCi0JICAgIGJueHRfZGlyX3R5cGVfaXNfZXhlY3V0YWJsZShkaXJfdHlwZSkgPT0gZmFsc2UpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlsZW5hbWUsICZkZXYtPmRldik7CiAJaWYgKHJjICE9IDApIHsKIAkJbmV0ZGV2X2VycihkZXYsICJFcnJvciAlZCByZXF1ZXN0aW5nIGZpcm13YXJlIGZpbGU6ICVzXG4iLApAQCAtMTI0OSw2ICsxMzAzLDggQEAKIAl9CiAJaWYgKGJueHRfZGlyX3R5cGVfaXNfYXBlX2Jpbl9mb3JtYXQoZGlyX3R5cGUpID09IHRydWUpCiAJCXJjID0gYm54dF9mbGFzaF9maXJtd2FyZShkZXYsIGRpcl90eXBlLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCWVsc2UgaWYgKGJueHRfZGlyX3R5cGVfaXNfb3RoZXJfZXhlY19mb3JtYXQoZGlyX3R5cGUpID09IHRydWUpCisJCXJjID0gYm54dF9mbGFzaF9taWNyb2NvZGUoZGV2LCBkaXJfdHlwZSwgZnctPmRhdGEsIGZ3LT5zaXplKTsKIAllbHNlCiAJCXJjID0gYm54dF9mbGFzaF9udnJhbShkZXYsIGRpcl90eXBlLCBCTlhfRElSX09SRElOQUxfRklSU1QsCiAJCQkJICAgICAgMCwgMCwgZnctPmRhdGEsIGZ3LT5zaXplKTsKQEAgLTEyNTcsMTAgKzEzMTMsODMgQEAKIH0KIAogc3RhdGljIGludCBibnh0X2ZsYXNoX3BhY2thZ2VfZnJvbV9maWxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCWNoYXIgKmZpbGVuYW1lKQorCQkJCQljaGFyICpmaWxlbmFtZSwgdTMyIGluc3RhbGxfdHlwZSkKIHsKLQluZXRkZXZfZXJyKGRldiwgInBhY2thZ2VzIGFyZSBub3QgeWV0IHN1cHBvcnRlZFxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7CisJc3RydWN0IGJueHQgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgaHdybV9udm1faW5zdGFsbF91cGRhdGVfb3V0cHV0ICpyZXNwID0gYnAtPmh3cm1fY21kX3Jlc3BfYWRkcjsKKwlzdHJ1Y3QgaHdybV9udm1faW5zdGFsbF91cGRhdGVfaW5wdXQgaW5zdGFsbCA9IHswfTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCXUzMiBpdGVtX2xlbjsKKwl1MTYgaW5kZXg7CisJaW50IHJjOworCisJYm54dF9od3JtX2Z3X3NldF90aW1lKGJwKTsKKworCWlmIChibnh0X2ZpbmRfbnZyYW1faXRlbShkZXYsIEJOWF9ESVJfVFlQRV9VUERBVEUsCisJCQkJIEJOWF9ESVJfT1JESU5BTF9GSVJTVCwgQk5YX0RJUl9FWFRfTk9ORSwKKwkJCQkgJmluZGV4LCAmaXRlbV9sZW4sIE5VTEwpICE9IDApIHsKKwkJbmV0ZGV2X2VycihkZXYsICJQS0cgdXBkYXRlIGFyZWEgbm90IGNyZWF0ZWQgaW4gbnZyYW1cbiIpOworCQlyZXR1cm4gLUVOT0JVRlM7CisJfQorCisJcmMgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZmlsZW5hbWUsICZkZXYtPmRldik7CisJaWYgKHJjICE9IDApIHsKKwkJbmV0ZGV2X2VycihkZXYsICJQS0cgZXJyb3IgJWQgcmVxdWVzdGluZyBmaWxlOiAlc1xuIiwKKwkJCSAgIHJjLCBmaWxlbmFtZSk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoZnctPnNpemUgPiBpdGVtX2xlbikgeworCQluZXRkZXZfZXJyKGRldiwgIlBLRyBpbnN1ZmZpY2llbnQgdXBkYXRlIGFyZWEgaW4gbnZyYW06ICVsdSIsCisJCQkgICAodW5zaWduZWQgbG9uZylmdy0+c2l6ZSk7CisJCXJjID0gLUVGQklHOworCX0gZWxzZSB7CisJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwkJdTggKmttZW07CisJCXN0cnVjdCBod3JtX252bV9tb2RpZnlfaW5wdXQgbW9kaWZ5ID0gezB9OworCisJCWJueHRfaHdybV9jbWRfaGRyX2luaXQoYnAsICZtb2RpZnksIEhXUk1fTlZNX01PRElGWSwgLTEsIC0xKTsKKworCQltb2RpZnkuZGlyX2lkeCA9IGNwdV90b19sZTE2KGluZGV4KTsKKwkJbW9kaWZ5LmxlbiA9IGNwdV90b19sZTMyKGZ3LT5zaXplKTsKKworCQlrbWVtID0gZG1hX2FsbG9jX2NvaGVyZW50KCZicC0+cGRldi0+ZGV2LCBmdy0+c2l6ZSwKKwkJCQkJICAmZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisJCWlmICgha21lbSkgeworCQkJbmV0ZGV2X2VycihkZXYsCisJCQkJICAgImRtYV9hbGxvY19jb2hlcmVudCBmYWlsdXJlLCBsZW5ndGggPSAldVxuIiwKKwkJCQkgICAodW5zaWduZWQgaW50KWZ3LT5zaXplKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShrbWVtLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCQkJbW9kaWZ5Lmhvc3Rfc3JjX2FkZHIgPSBjcHVfdG9fbGU2NChkbWFfaGFuZGxlKTsKKworCQkJcmMgPSBod3JtX3NlbmRfbWVzc2FnZShicCwgJm1vZGlmeSwgc2l6ZW9mKG1vZGlmeSksCisJCQkJCSAgICAgICBGTEFTSF9QQUNLQUdFX1RJTUVPVVQpOworCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmJwLT5wZGV2LT5kZXYsIGZ3LT5zaXplLCBrbWVtLAorCQkJCQkgIGRtYV9oYW5kbGUpOworCQl9CisJfQorCXJlbGVhc2VfZmlybXdhcmUoZncpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKChpbnN0YWxsX3R5cGUgJiAweGZmZmYpID09IDApCisJCWluc3RhbGxfdHlwZSA+Pj0gMTY7CisJYm54dF9od3JtX2NtZF9oZHJfaW5pdChicCwgJmluc3RhbGwsIEhXUk1fTlZNX0lOU1RBTExfVVBEQVRFLCAtMSwgLTEpOworCWluc3RhbGwuaW5zdGFsbF90eXBlID0gY3B1X3RvX2xlMzIoaW5zdGFsbF90eXBlKTsKKworCXJjID0gaHdybV9zZW5kX21lc3NhZ2UoYnAsICZpbnN0YWxsLCBzaXplb2YoaW5zdGFsbCksCisJCQkgICAgICAgSU5TVEFMTF9QQUNLQUdFX1RJTUVPVVQpOworCWlmIChyYykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHJlc3AtPnJlc3VsdCkgeworCQluZXRkZXZfZXJyKGRldiwgIlBLRyBpbnN0YWxsIGVycm9yID0gJWQsIHByb2JsZW1faXRlbSA9ICVkXG4iLAorCQkJICAgKHM4KXJlc3AtPnJlc3VsdCwgKGludClyZXNwLT5wcm9ibGVtX2l0ZW0pOworCQlyZXR1cm4gLUVOT1BLRzsKKwl9CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYm54dF9mbGFzaF9kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTEyNzEsOCArMTQwMCwxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoZmxhc2gtPnJlZ2lvbiA9PSBFVEhUT09MX0ZMQVNIX0FMTF9SRUdJT05TKQotCQlyZXR1cm4gYm54dF9mbGFzaF9wYWNrYWdlX2Zyb21fZmlsZShkZXYsIGZsYXNoLT5kYXRhKTsKKwlpZiAoZmxhc2gtPnJlZ2lvbiA9PSBFVEhUT09MX0ZMQVNIX0FMTF9SRUdJT05TIHx8CisJICAgIGZsYXNoLT5yZWdpb24gPiAweGZmZmYpCisJCXJldHVybiBibnh0X2ZsYXNoX3BhY2thZ2VfZnJvbV9maWxlKGRldiwgZmxhc2gtPmRhdGEsCisJCQkJCQkgICAgZmxhc2gtPnJlZ2lvbik7CiAKIAlyZXR1cm4gYm54dF9mbGFzaF9maXJtd2FyZV9mcm9tX2ZpbGUoZGV2LCBmbGFzaC0+cmVnaW9uLCBmbGFzaC0+ZGF0YSk7CiB9CkBAIC0xNTE2LDcgKzE2NDcsNyBAQAogCiAJLyogQ3JlYXRlIG9yIHJlLXdyaXRlIGFuIE5WTSBpdGVtOiAqLwogCWlmIChibnh0X2Rpcl90eXBlX2lzX2V4ZWN1dGFibGUodHlwZSkgPT0gdHJ1ZSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAlleHQgPSBlZXByb20tPm1hZ2ljICYgMHhmZmZmOwogCW9yZGluYWwgPSBlZXByb20tPm9mZnNldCA+PiAxNjsKIAlhdHRyID0gZWVwcm9tLT5vZmZzZXQgJiAweGZmZmY7CkBAIC0xNzE4LDYgKzE4NDksMjUgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgYm54dF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IHJjID0gMDsKKworCXN0cnVjdCBibnh0ICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJueHRfbGlua19pbmZvICpsaW5rX2luZm8gPSAmYnAtPmxpbmtfaW5mbzsKKworCWlmICghQk5YVF9TSU5HTEVfUEYoYnApKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIShsaW5rX2luZm8tPmF1dG9uZWcgJiBCTlhUX0FVVE9ORUdfU1BFRUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCXJjID0gYm54dF9od3JtX3NldF9saW5rX3NldHRpbmcoYnAsIHRydWUsIGZhbHNlKTsKKworCXJldHVybiByYzsKK30KKwogY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJueHRfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9saW5rX2tzZXR0aW5ncwk9IGJueHRfZ2V0X2xpbmtfa3NldHRpbmdzLAogCS5zZXRfbGlua19rc2V0dGluZ3MJPSBibnh0X3NldF9saW5rX2tzZXR0aW5ncywKQEAgLTE3NTAsNCArMTkwMCw1IEBACiAJLnNldF9lZWUJCT0gYm54dF9zZXRfZWVlLAogCS5nZXRfbW9kdWxlX2luZm8JPSBibnh0X2dldF9tb2R1bGVfaW5mbywKIAkuZ2V0X21vZHVsZV9lZXByb20JPSBibnh0X2dldF9tb2R1bGVfZWVwcm9tLAorCS5ud2F5X3Jlc2V0CQk9IGJueHRfbndheV9yZXNldAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9md19oZHIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9md19oZHIuaAppbmRleCA4MmJmNDRhLi5jYWQzMGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfZndfaGRyLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2Z3X2hkci5oCkBAIC0xMSw2ICsxMSw3IEBACiAjZGVmaW5lIF9fQk5YVF9GV19IRFJfSF9fCiAKICNkZWZpbmUgQk5YVF9GSVJNV0FSRV9CSU5fU0lHTkFUVVJFICAgICAweDFhNGQ0MzQyCS8qICJCQ00iKzB4MWEgKi8KKyNkZWZpbmUgQk5YVF9VQ09ERV9UUkFJTEVSX1NJR05BVFVSRQkweDcyNmM3MjU0CS8qICJUcmxyIiAqLwogCiBlbnVtIFNVUFBPUlRFRF9GQU1JTFkgewogCURFVklDRV81NzAyXzNfNF9GQU1JTFksCQkvKiAwICAtIERlbmFsaSwgVmluc29uLCBLMiAqLwpAQCAtODUsNyArODYsNyBAQAogCiBzdHJ1Y3QgYm54dF9md19oZWFkZXIgewogCV9fbGUzMiBzaWduYXR1cmU7CS8qIGNvbnN0YWlucyB0aGUgY29uc3RhbnQgdmFsdWUgb2YKLQkJCQkgKiBCTlhUX0Zpcm13YXJlX0Jpbl9TaWduYXR1cmVzCisJCQkJICogQk5YVF9GSVJNV0FSRV9CSU5fU0lHTkFUVVJFCiAJCQkJICovCiAJdTggZmxhZ3M7CQkvKiByZXNlcnZlZCBmb3IgQ2hpTVAgdXNlICovCiAJdTggY29kZV90eXBlOwkJLyogZW51bSBTVVBQT1JURURfQ09ERSAqLwpAQCAtMTAyLDQgKzEwMywxNyBAQAogCXU4IG1ham9yX3ZlcjsKIH07CiAKKy8qIE1pY3JvY29kZSBhbmQgcHJlLWJvb3Qgc29mdHdhcmUvZmlybXdhcmUgdHJhaWxlcjogKi8KK3N0cnVjdCBibnh0X3Vjb2RlX3RyYWlsZXIgeworCXU4IHJzYV9zaWdbMjU2XTsKKwlfX2xlMTYgZmxhZ3M7CisJdTggdmVyc2lvbl9mb3JtYXQ7CisJdTggdmVyc2lvbl9sZW5ndGg7CisJdTggdmVyc2lvblsxNl07CisJX19sZTE2IGRpcl90eXBlOworCV9fbGUxNiB0cmFpbGVyX2xlbmd0aDsKKwlfX2xlMzIgc2lnOwkJLyogQk5YVF9VQ09ERV9UUkFJTEVSX1NJR05BVFVSRSAqLworCV9fbGUzMiBjaGtzdW07CQkvKiBDUkMtMzIgKi8KK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2hzaS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X2hzaS5oCmluZGV4IDUxNzU2N2YuLjA0YTk2Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9oc2kuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfaHNpLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEVKRUNUX0NNUExfVFlQRV9NQVNLCQkJCSAgICAweDNmVUwKIAkjZGVmaW5lIEVKRUNUX0NNUExfVFlQRV9TRlQJCQkJICAgIDAKLQkjZGVmaW5lIEVKRUNUX0NNUExfVFlQRV9TVEFUX0VKRUNUCQkJICAgKDB4MWFVTCA8PCAwKQorCSNkZWZpbmUgRUpFQ1RfQ01QTF9UWVBFX1NUQVRfRUpFQ1QJCQkgICAweDFhVUwKIAlfX2xlMTYgbGVuOwogCV9fbGUzMiBvcGFxdWU7CiAJX19sZTMyIHY7CkBAIC01Miw3ICs1Miw3IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0NNUExfVFlQRV9NQVNLCQkJCSAgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQ01QTF9UWVBFX1NGVAkJCQkgICAgMAotCSNkZWZpbmUgSFdSTV9DTVBMX1RZUEVfSFdSTV9ET05FCQkJICAgKDB4MjBVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9DTVBMX1RZUEVfSFdSTV9ET05FCQkJICAgMHgyMFVMCiAJX19sZTE2IHNlcXVlbmNlX2lkOwogCV9fbGUzMiB1bnVzZWRfMTsKIAlfX2xlMzIgdjsKQEAgLTY1LDcgKzY1LDcgQEAKIAlfX2xlMTYgcmVxX2xlbl90eXBlOwogCSNkZWZpbmUgSFdSTV9GV0RfUkVRX0NNUExfVFlQRV9NQVNLCQkJICAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9GV0RfUkVRX0NNUExfVFlQRV9TRlQJCQkgICAgMAotCSNkZWZpbmUgSFdSTV9GV0RfUkVRX0NNUExfVFlQRV9IV1JNX0ZXRF9SRVEJCSAgICgweDIyVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fRldEX1JFUV9DTVBMX1RZUEVfSFdSTV9GV0RfUkVRCQkgICAweDIyVUwKIAkjZGVmaW5lIEhXUk1fRldEX1JFUV9DTVBMX1JFUV9MRU5fTUFTSwkJCSAgICAweGZmYzBVTAogCSNkZWZpbmUgSFdSTV9GV0RfUkVRX0NNUExfUkVRX0xFTl9TRlQJCQkgICAgNgogCV9fbGUxNiBzb3VyY2VfaWQ7CkBAIC04MSw3ICs4MSw3IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0ZXRF9SRVNQX0NNUExfVFlQRV9NQVNLCQkJICAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9GV0RfUkVTUF9DTVBMX1RZUEVfU0ZUCQkJICAgIDAKLQkjZGVmaW5lIEhXUk1fRldEX1JFU1BfQ01QTF9UWVBFX0hXUk1fRldEX1JFU1AJCSAgICgweDI0VUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fRldEX1JFU1BfQ01QTF9UWVBFX0hXUk1fRldEX1JFU1AJCSAgIDB4MjRVTAogCV9fbGUxNiBzb3VyY2VfaWQ7CiAJX19sZTE2IHJlc3BfbGVuOwogCV9fbGUxNiB1bnVzZWRfMTsKQEAgLTk2LDI1ICs5NiwyNiBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1RZUEVfTUFTSwkJICAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1RZUEVfU0ZUCQkJICAgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgICAgICAgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAgICAgICAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfTElOS19TVEFUVVNfQ0hBTkdFICgweDBVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0xJTktfTVRVX0NIQU5HRSAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9MSU5LX1NQRUVEX0NIQU5HRSAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfRENCX0NPTkZJR19DSEFOR0UgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1BPUlRfQ09OTl9OT1RfQUxMT1dFRCAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9MSU5LX1NQRUVEX0NGR19OT1RfQUxMT1dFRCAoMHg1VUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9MSU5LX1NQRUVEX0NGR19DSEFOR0UgKDB4NlVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfUE9SVF9QSFlfQ0ZHX0NIQU5HRSAoMHg3VUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9GVU5DX0RSVlJfVU5MT0FEICAgKDB4MTBVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0ZVTkNfRFJWUl9MT0FEICAgICAoMHgxMVVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfUEZfRFJWUl9VTkxPQUQgICAgICgweDIwVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9QRl9EUlZSX0xPQUQgICAgICAgKDB4MjFVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1ZGX0ZMUgkJICAgKDB4MzBVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1ZGX01BQ19BRERSX0NIQU5HRSAoMHgzMVVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfUEZfVkZfQ09NTV9TVEFUVVNfQ0hBTkdFICgweDMyVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9WRl9DRkdfQ0hBTkdFICAgICAgKDB4MzNVTCA8PCAwKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0hXUk1fRVJST1IJICAgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0xJTktfU1RBVFVTX0NIQU5HRSAweDBVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0xJTktfTVRVX0NIQU5HRSAgICAweDFVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0xJTktfU1BFRURfQ0hBTkdFICAweDJVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0RDQl9DT05GSUdfQ0hBTkdFICAweDNVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1BPUlRfQ09OTl9OT1RfQUxMT1dFRCAweDRVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0xJTktfU1BFRURfQ0ZHX05PVF9BTExPV0VEIDB4NVVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfTElOS19TUEVFRF9DRkdfQ0hBTkdFIDB4NlVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfUE9SVF9QSFlfQ0ZHX0NIQU5HRSAweDdVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX0ZVTkNfRFJWUl9VTkxPQUQgICAweDEwVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9GVU5DX0RSVlJfTE9BRCAgICAgMHgxMVVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfRlVOQ19GTFJfUFJPQ19DTVBMVCAweDEyVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9QRl9EUlZSX1VOTE9BRCAgICAgMHgyMFVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfUEZfRFJWUl9MT0FEICAgICAgIDB4MjFVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1ZGX0ZMUgkJICAgMHgzMFVMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfVkZfTUFDX0FERFJfQ0hBTkdFIDB4MzFVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0VWRU5UX0lEX1BGX1ZGX0NPTU1fU1RBVFVTX0NIQU5HRSAweDMyVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9WRl9DRkdfQ0hBTkdFICAgICAgMHgzM1VMCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRVZFTlRfSURfSFdSTV9FUlJPUgkgICAweGZmVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVgkJCSAgICAweDFVTApAQCAtMTMwLDkgKzEzMSw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TVEFUVVNfQ0hBTkdFX1RZUEVfTUFTSyAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NUQVRVU19DSEFOR0VfVFlQRV9TRlQgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NUQVRVU19DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NUQVRVU19DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NUQVRVU19DSEFOR0VfRVZFTlRfSURfTElOS19TVEFUVVNfQ0hBTkdFICgweDBVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1RBVFVTX0NIQU5HRV9FVkVOVF9JRF9MSU5LX1NUQVRVU19DSEFOR0UgMHgwVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TVEFUVVNfQ0hBTkdFX1YJICAgIDB4MVVMCkBAIC0xNTYsOSArMTU3LDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX01UVV9DSEFOR0VfVFlQRV9NQVNLICAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfTVRVX0NIQU5HRV9UWVBFX1NGVCAgICAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfTVRVX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfTVRVX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfTVRVX0NIQU5HRV9FVkVOVF9JRF9MSU5LX01UVV9DSEFOR0UgKDB4MVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19NVFVfQ0hBTkdFX0VWRU5UX0lEX0xJTktfTVRVX0NIQU5HRSAweDFVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX01UVV9DSEFOR0VfVgkgICAgMHgxVUwKQEAgLTE3Niw5ICsxNzcsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX1RZUEVfTUFTSyAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfVFlQRV9TRlQgICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0lEX0xJTktfU1BFRURfQ0hBTkdFICgweDJVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0lEX0xJTktfU1BFRURfQ0hBTkdFIDB4MlVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX1YJICAgIDB4MVVMCkBAIC0yMDAsOCArMjAxLDcgQEAKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9EQVRBMV9ORVdfTElOS19TUEVFRF8xMDBNQlBTXzQwR0IgKDB4MTkwVUwgPDwgMSkKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9EQVRBMV9ORVdfTElOS19TUEVFRF8xMDBNQlBTXzUwR0IgKDB4MWY0VUwgPDwgMSkKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9EQVRBMV9ORVdfTElOS19TUEVFRF8xMDBNQlBTXzEwMEdCICgweDNlOFVMIDw8IDEpCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfREFUQTFfTkVXX0xJTktfU1BFRURfMTAwTUJQU18xME1CICgweGZmZmZVTCA8PCAxKQotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0RBVEExX05FV19MSU5LX1NQRUVEXzEwME1CUFNfTEFTVCAgICBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfREFUQTFfTkVXX0xJTktfU1BFRURfMTAwTUJQU18xME1CCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfREFUQTFfTkVXX0xJTktfU1BFRURfMTAwTUJQU19MQVNUICAgIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NIQU5HRV9FVkVOVF9EQVRBMV9ORVdfTElOS19TUEVFRF8xMDBNQlBTXzEwMEdCCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DSEFOR0VfRVZFTlRfREFUQTFfUE9SVF9JRF9NQVNLIDB4ZmZmZjAwMDBVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0hBTkdFX0VWRU5UX0RBVEExX1BPUlRfSURfU0ZUIDE2CiB9OwpAQCAtMjExLDkgKzIxMSw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRENCX0NPTkZJR19DSEFOR0VfVFlQRV9NQVNLICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9EQ0JfQ09ORklHX0NIQU5HRV9UWVBFX1NGVCAgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9EQ0JfQ09ORklHX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0RDQl9DT05GSUdfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRENCX0NPTkZJR19DSEFOR0VfRVZFTlRfSURfRENCX0NPTkZJR19DSEFOR0UgKDB4M1VMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRENCX0NPTkZJR19DSEFOR0VfRVZFTlRfSURfRENCX0NPTkZJR19DSEFOR0UgMHgzVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRENCX0NPTkZJR19DSEFOR0VfVgkgICAgMHgxVUwKQEAgLTIzMSw5ICsyMzEsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BPUlRfQ09OTl9OT1RfQUxMT1dFRF9UWVBFX01BU0sgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUE9SVF9DT05OX05PVF9BTExPV0VEX1RZUEVfU0ZUIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QT1JUX0NPTk5fTk9UX0FMTE9XRURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QT1JUX0NPTk5fTk9UX0FMTE9XRURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QT1JUX0NPTk5fTk9UX0FMTE9XRURfRVZFTlRfSURfUE9SVF9DT05OX05PVF9BTExPV0VEICgweDRVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BPUlRfQ09OTl9OT1RfQUxMT1dFRF9FVkVOVF9JRF9QT1JUX0NPTk5fTk9UX0FMTE9XRUQgMHg0VUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUE9SVF9DT05OX05PVF9BTExPV0VEX1YgICAgICAweDFVTApAQCAtMjU4LDkgKzI1OCw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfTk9UX0FMTE9XRURfVFlQRV9NQVNLIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX05PVF9BTExPV0VEX1RZUEVfU0ZUIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19OT1RfQUxMT1dFRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX05PVF9BTExPV0VEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfTk9UX0FMTE9XRURfRVZFTlRfSURfTElOS19TUEVFRF9DRkdfTk9UX0FMTE9XRUQgKDB4NVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfTk9UX0FMTE9XRURfRVZFTlRfSURfTElOS19TUEVFRF9DRkdfTk9UX0FMTE9XRUQgMHg1VUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfTk9UX0FMTE9XRURfViAweDFVTApAQCAtMjc4LDkgKzI3OCw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfQ0hBTkdFX1RZUEVfTUFTSyAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19DSEFOR0VfVFlQRV9TRlQgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX0NIQU5HRV9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0xJTktfU1BFRURfQ0ZHX0NIQU5HRV9FVkVOVF9JRF9MSU5LX1NQRUVEX0NGR19DSEFOR0UgKDB4NlVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfTElOS19TUEVFRF9DRkdfQ0hBTkdFX0VWRU5UX0lEX0xJTktfU1BFRURfQ0ZHX0NIQU5HRSAweDZVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9MSU5LX1NQRUVEX0NGR19DSEFOR0VfViAgICAgIDB4MVVMCkBAIC0zMDAsOSArMzAwLDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfVU5MT0FEX1RZUEVfTUFTSyAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9VTkxPQURfVFlQRV9TRlQgICAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9VTkxPQURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfVU5MT0FEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX1VOTE9BRF9FVkVOVF9JRF9GVU5DX0RSVlJfVU5MT0FEICgweDEwVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfVU5MT0FEX0VWRU5UX0lEX0ZVTkNfRFJWUl9VTkxPQUQgMHgxMFVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9VTkxPQURfVgkgICAgMHgxVUwKQEAgLTMyMCw5ICszMjAsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9MT0FEX1RZUEVfTUFTSyAgICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX0xPQURfVFlQRV9TRlQgICAgICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX0xPQURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfTE9BRF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0ZVTkNfRFJWUl9MT0FEX0VWRU5UX0lEX0ZVTkNfRFJWUl9MT0FEICgweDExVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9GVU5DX0RSVlJfTE9BRF9FVkVOVF9JRF9GVU5DX0RSVlJfTE9BRCAweDExVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfRlVOQ19EUlZSX0xPQURfVgkJICAgIDB4MVVMCkBAIC0zNDAsOSArMzQwLDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX1VOTE9BRF9UWVBFX01BU0sgICAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfVU5MT0FEX1RZUEVfU0ZUICAgICAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfVU5MT0FEX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAoMHgyZVVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9VTkxPQURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX1VOTE9BRF9FVkVOVF9JRF9QRl9EUlZSX1VOTE9BRCAoMHgyMFVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9VTkxPQURfRVZFTlRfSURfUEZfRFJWUl9VTkxPQUQgMHgyMFVMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX0RSVlJfVU5MT0FEX1YJCSAgICAweDFVTApAQCAtMzYyLDkgKzM2Miw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfRFJWUl9MT0FEX1RZUEVfTUFTSyAgICAgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX0xPQURfVFlQRV9TRlQJICAgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX0xPQURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX0xPQURfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX0xPQURfRVZFTlRfSURfUEZfRFJWUl9MT0FEICgweDIxVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX0xPQURfRVZFTlRfSURfUEZfRFJWUl9MT0FEIDB4MjFVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9EUlZSX0xPQURfVgkJICAgIDB4MVVMCkBAIC0zODQsOSArMzg0LDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9GTFJfVFlQRV9NQVNLCQkgICAgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfRkxSX1RZUEVfU0ZUCQkgICAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0ZMUl9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0ZMUl9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgMHgyZVVMCiAJX19sZTE2IGV2ZW50X2lkOwotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0ZMUl9FVkVOVF9JRF9WRl9GTFIgICAgICAoMHgzMFVMIDw8IDApCisJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfRkxSX0VWRU5UX0lEX1ZGX0ZMUiAgICAgIDB4MzBVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9GTFJfVgkJCSAgICAweDFVTApAQCAtNDA0LDkgKzQwNCw5IEBACiAJX19sZTE2IHR5cGU7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfTUFDX0FERFJfQ0hBTkdFX1RZUEVfTUFTSyAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9NQUNfQUREUl9DSEFOR0VfVFlQRV9TRlQgIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9NQUNfQUREUl9DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9NQUNfQUREUl9DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9NQUNfQUREUl9DSEFOR0VfRVZFTlRfSURfVkZfTUFDX0FERFJfQ0hBTkdFICgweDMxVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9NQUNfQUREUl9DSEFOR0VfRVZFTlRfSURfVkZfTUFDX0FERFJfQ0hBTkdFIDB4MzFVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9NQUNfQUREUl9DSEFOR0VfVgkgICAgMHgxVUwKQEAgLTQyNCw5ICs0MjQsOSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1BGX1ZGX0NPTU1fU1RBVFVTX0NIQU5HRV9UWVBFX01BU0sgMHgzZlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfUEZfVkZfQ09NTV9TVEFUVVNfQ0hBTkdFX1RZUEVfU0ZUIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9WRl9DT01NX1NUQVRVU19DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9WRl9DT01NX1NUQVRVU19DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9WRl9DT01NX1NUQVRVU19DSEFOR0VfRVZFTlRfSURfUEZfVkZfQ09NTV9TVEFUVVNfQ0hBTkdFICgweDMyVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9WRl9DT01NX1NUQVRVU19DSEFOR0VfRVZFTlRfSURfUEZfVkZfQ09NTV9TVEFUVVNfQ0hBTkdFIDB4MzJVTAogCV9fbGUzMiBldmVudF9kYXRhMjsKIAl1OCBvcGFxdWVfdjsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9QRl9WRl9DT01NX1NUQVRVU19DSEFOR0VfViAgIDB4MVVMCkBAIC00NDMsOSArNDQzLDkgQEAKIAlfX2xlMTYgdHlwZTsKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9DRkdfQ0hBTkdFX1RZUEVfTUFTSyAgICAgIDB4M2ZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0NGR19DSEFOR0VfVFlQRV9TRlQgICAgICAgMAotCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0NGR19DSEFOR0VfVFlQRV9IV1JNX0FTWU5DX0VWRU5UICgweDJlVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9DRkdfQ0hBTkdFX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCAweDJlVUwKIAlfX2xlMTYgZXZlbnRfaWQ7Ci0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfVkZfQ0ZHX0NIQU5HRV9FVkVOVF9JRF9WRl9DRkdfQ0hBTkdFICgweDMzVUwgPDwgMCkKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9WRl9DRkdfQ0hBTkdFX0VWRU5UX0lEX1ZGX0NGR19DSEFOR0UgMHgzM1VMCiAJX19sZTMyIGV2ZW50X2RhdGEyOwogCXU4IG9wYXF1ZV92OwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1ZGX0NGR19DSEFOR0VfVgkJICAgIDB4MVVMCkBAIC00NjUsMTUgKzQ2NSwxNSBAQAogCV9fbGUxNiB0eXBlOwogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfVFlQRV9NQVNLCSAgICAweDNmVUwKIAkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX1RZUEVfU0ZUCSAgICAwCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9UWVBFX0hXUk1fQVNZTkNfRVZFTlQgKDB4MmVVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfVFlQRV9IV1JNX0FTWU5DX0VWRU5UIDB4MmVVTAogCV9fbGUxNiBldmVudF9pZDsKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0lEX0hXUk1fRVJST1IgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfSURfSFdSTV9FUlJPUiAweGZmVUwKIAlfX2xlMzIgZXZlbnRfZGF0YTI7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9EQVRBMl9TRVZFUklUWV9NQVNLIDB4ZmZVTAogCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfREFUQTJfU0VWRVJJVFlfU0ZUIDAKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0RBVEEyX1NFVkVSSVRZX1dBUk5JTkcgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9EQVRBMl9TRVZFUklUWV9OT05GQVRBTCAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0RBVEEyX1NFVkVSSVRZX0ZBVEFMICgweDJVTCA8PCAwKQorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfREFUQTJfU0VWRVJJVFlfV0FSTklORyAweDBVTAorCSNkZWZpbmUgSFdSTV9BU1lOQ19FVkVOVF9DTVBMX0hXUk1fRVJST1JfRVZFTlRfREFUQTJfU0VWRVJJVFlfTk9ORkFUQUwgMHgxVUwKKwkjZGVmaW5lIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0RBVEEyX1NFVkVSSVRZX0ZBVEFMIDB4MlVMCiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9EQVRBMl9TRVZFUklUWV9MQVNUICAgIEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9IV1JNX0VSUk9SX0VWRU5UX0RBVEEyX1NFVkVSSVRZX0ZBVEFMCiAJdTggb3BhcXVlX3Y7CiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9WCQkgICAgMHgxVUwKQEAgLTQ4NSwxMiArNDg1LDEyIEBACiAJI2RlZmluZSBIV1JNX0FTWU5DX0VWRU5UX0NNUExfSFdSTV9FUlJPUl9FVkVOVF9EQVRBMV9USU1FU1RBTVAgMHgxVUwKIH07CiAKLS8qIEhXIFJlc291cmNlIE1hbmFnZXIgU3BlY2lmaWNhdGlvbiAxLjMuMCAqLworLyogSFcgUmVzb3VyY2UgTWFuYWdlciBTcGVjaWZpY2F0aW9uIDEuNS4xICovCiAjZGVmaW5lIEhXUk1fVkVSU0lPTl9NQUpPUgkxCi0jZGVmaW5lIEhXUk1fVkVSU0lPTl9NSU5PUgkzCi0jZGVmaW5lIEhXUk1fVkVSU0lPTl9VUERBVEUJMAorI2RlZmluZSBIV1JNX1ZFUlNJT05fTUlOT1IJNQorI2RlZmluZSBIV1JNX1ZFUlNJT05fVVBEQVRFCTEKIAotI2RlZmluZSBIV1JNX1ZFUlNJT05fU1RSCSIxLjMuMCIKKyNkZWZpbmUgSFdSTV9WRVJTSU9OX1NUUgkiMS41LjEiCiAvKgogICogRm9sbG93aW5nIGlzIHRoZSBzaWduYXR1cmUgZm9yIEhXUk0gbWVzc2FnZSBmaWVsZCB0aGF0IGluZGljYXRlcyBub3QKICAqIGFwcGxpY2FibGUgKEFsbCBGJ3MpLiBOZWVkIHRvIGNhc3QgaXQgdGhlIHNpemUgb2YgdGhlIGZpZWxkIGlmIG5lZWRlZC4KQEAgLTU1Niw4ICs1NTYsOCBAQAogCSNkZWZpbmUgSFdSTV9RVUVVRV9RUE9SVENGRwkJCQkgICAoMHgzMFVMKQogCSNkZWZpbmUgSFdSTV9RVUVVRV9RQ0ZHCQkJCSAgICgweDMxVUwpCiAJI2RlZmluZSBIV1JNX1FVRVVFX0NGRwkJCQkJICAgKDB4MzJVTCkKLQkjZGVmaW5lIEhXUk1fUVVFVUVfQlVGRkVSU19RQ0ZHCQkJICAgKDB4MzNVTCkKLQkjZGVmaW5lIEhXUk1fUVVFVUVfQlVGRkVSU19DRkcJCQkJICAgKDB4MzRVTCkKKwkjZGVmaW5lIFJFU0VSVkVEMgkJCQkJICAgKDB4MzNVTCkKKwkjZGVmaW5lIFJFU0VSVkVEMwkJCQkJICAgKDB4MzRVTCkKIAkjZGVmaW5lIEhXUk1fUVVFVUVfUEZDRU5BQkxFX1FDRkcJCQkgICAoMHgzNVVMKQogCSNkZWZpbmUgSFdSTV9RVUVVRV9QRkNFTkFCTEVfQ0ZHCQkJICAgKDB4MzZVTCkKIAkjZGVmaW5lIEhXUk1fUVVFVUVfUFJJMkNPU19RQ0ZHCQkJICAgKDB4MzdVTCkKQEAgLTU3NCw2ICs1NzQsNyBAQAogCSNkZWZpbmUgSFdSTV9WTklDX1JTU19RQ0ZHCQkJCSAgICgweDQ3VUwpCiAJI2RlZmluZSBIV1JNX1ZOSUNfUExDTU9ERVNfQ0ZHCQkJCSAgICgweDQ4VUwpCiAJI2RlZmluZSBIV1JNX1ZOSUNfUExDTU9ERVNfUUNGRwkJCSAgICgweDQ5VUwpCisJI2RlZmluZSBIV1JNX1ZOSUNfUUNBUFMJCQkJICAgKDB4NGFVTCkKIAkjZGVmaW5lIEhXUk1fUklOR19BTExPQwkJCQkgICAoMHg1MFVMKQogCSNkZWZpbmUgSFdSTV9SSU5HX0ZSRUUJCQkJCSAgICgweDUxVUwpCiAJI2RlZmluZSBIV1JNX1JJTkdfQ01QTF9SSU5HX1FBR0dJTlRfUEFSQU1TCQkgICAoMHg1MlVMKQpAQCAtNTgxLDEzICs1ODIsMTUgQEAKIAkjZGVmaW5lIEhXUk1fUklOR19SRVNFVAkJCQkgICAoMHg1ZVVMKQogCSNkZWZpbmUgSFdSTV9SSU5HX0dSUF9BTExPQwkJCQkgICAoMHg2MFVMKQogCSNkZWZpbmUgSFdSTV9SSU5HX0dSUF9GUkVFCQkJCSAgICgweDYxVUwpCisJI2RlZmluZSBSRVNFUlZFRDUJCQkJCSAgICgweDY0VUwpCisJI2RlZmluZSBSRVNFUlZFRDYJCQkJCSAgICgweDY1VUwpCiAJI2RlZmluZSBIV1JNX1ZOSUNfUlNTX0NPU19MQl9DVFhfQUxMT0MJCQkgICAoMHg3MFVMKQogCSNkZWZpbmUgSFdSTV9WTklDX1JTU19DT1NfTEJfQ1RYX0ZSRUUJCQkgICAoMHg3MVVMKQogCSNkZWZpbmUgSFdSTV9DRkFfTDJfRklMVEVSX0FMTE9DCQkJICAgKDB4OTBVTCkKIAkjZGVmaW5lIEhXUk1fQ0ZBX0wyX0ZJTFRFUl9GUkVFCQkJICAgKDB4OTFVTCkKIAkjZGVmaW5lIEhXUk1fQ0ZBX0wyX0ZJTFRFUl9DRkcJCQkJICAgKDB4OTJVTCkKIAkjZGVmaW5lIEhXUk1fQ0ZBX0wyX1NFVF9SWF9NQVNLCQkJICAgKDB4OTNVTCkKLQkjZGVmaW5lIFJFU0VSVkVEMwkJCQkJICAgKDB4OTRVTCkKKwkjZGVmaW5lIFJFU0VSVkVENAkJCQkJICAgKDB4OTRVTCkKIAkjZGVmaW5lIEhXUk1fQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0MJCQkgICAoMHg5NVVMKQogCSNkZWZpbmUgSFdSTV9DRkFfVFVOTkVMX0ZJTFRFUl9GUkVFCQkJICAgKDB4OTZVTCkKIAkjZGVmaW5lIEhXUk1fQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQwkJCSAgICgweDk3VUwpCkBAIC02MDcsNiArNjEwLDggQEAKIAkjZGVmaW5lIEhXUk1fU1RBVF9DVFhfQ0xSX1NUQVRTCQkJICAgKDB4YjNVTCkKIAkjZGVmaW5lIEhXUk1fRldfUkVTRVQJCQkJCSAgICgweGMwVUwpCiAJI2RlZmluZSBIV1JNX0ZXX1FTVEFUVVMJCQkJICAgKDB4YzFVTCkKKwkjZGVmaW5lIEhXUk1fRldfU0VUX1RJTUUJCQkJICAgKDB4YzhVTCkKKwkjZGVmaW5lIEhXUk1fRldfR0VUX1RJTUUJCQkJICAgKDB4YzlVTCkKIAkjZGVmaW5lIEhXUk1fRVhFQ19GV0RfUkVTUAkJCQkgICAoMHhkMFVMKQogCSNkZWZpbmUgSFdSTV9SRUpFQ1RfRldEX1JFU1AJCQkJICAgKDB4ZDFVTCkKIAkjZGVmaW5lIEhXUk1fRldEX1JFU1AJCQkJCSAgICgweGQyVUwpCkBAIC02MTUsMTEgKzYyMCwxMyBAQAogCSNkZWZpbmUgSFdSTV9XT0xfRklMVEVSX0FMTE9DCQkJCSAgICgweGYwVUwpCiAJI2RlZmluZSBIV1JNX1dPTF9GSUxURVJfRlJFRQkJCQkgICAoMHhmMVVMKQogCSNkZWZpbmUgSFdSTV9XT0xfRklMVEVSX1FDRkcJCQkJICAgKDB4ZjJVTCkKKwkjZGVmaW5lIEhXUk1fV09MX1JFQVNPTl9RQ0ZHCQkJCSAgICgweGYzVUwpCiAJI2RlZmluZSBIV1JNX0RCR19SRUFEX0RJUkVDVAkJCQkgICAoMHhmZjEwVUwpCiAJI2RlZmluZSBIV1JNX0RCR19SRUFEX0lORElSRUNUCQkJCSAgICgweGZmMTFVTCkKIAkjZGVmaW5lIEhXUk1fREJHX1dSSVRFX0RJUkVDVAkJCQkgICAoMHhmZjEyVUwpCiAJI2RlZmluZSBIV1JNX0RCR19XUklURV9JTkRJUkVDVAkJCSAgICgweGZmMTNVTCkKIAkjZGVmaW5lIEhXUk1fREJHX0RVTVAJCQkJCSAgICgweGZmMTRVTCkKKwkjZGVmaW5lIEhXUk1fTlZNX0lOU1RBTExfVVBEQVRFCQkJICAgKDB4ZmZmM1VMKQogCSNkZWZpbmUgSFdSTV9OVk1fTU9ESUZZCQkJCSAgICgweGZmZjRVTCkKIAkjZGVmaW5lIEhXUk1fTlZNX1ZFUklGWV9VUERBVEUJCQkJICAgKDB4ZmZmNVVMKQogCSNkZWZpbmUgSFdSTV9OVk1fR0VUX0RFVl9JTkZPCQkJCSAgICgweGZmZjZVTCkKQEAgLTgyNCw3ICs4MzEsOSBAQAogCXU4IG5ldGN0cmxfZndfbWluOwogCXU4IG5ldGN0cmxfZndfYmxkOwogCXU4IG5ldGN0cmxfZndfcnN2ZDsKLQlfX2xlMzIgcmVzZXJ2ZWQxOworCV9fbGUzMiBkZXZfY2Fwc19jZmc7CisJI2RlZmluZSBWRVJfR0VUX1JFU1BfREVWX0NBUFNfQ0ZHX1NFQ1VSRV9GV19VUERfU1VQUE9SVEVEICAweDFVTAorCSNkZWZpbmUgVkVSX0dFVF9SRVNQX0RFVl9DQVBTX0NGR19GV19EQ0JYX0FHRU5UX1NVUFBPUlRFRCAgMHgyVUwKIAl1OCByb2NlX2Z3X21hajsKIAl1OCByb2NlX2Z3X21pbjsKIAl1OCByb2NlX2Z3X2JsZDsKQEAgLTgzOSw5ICs4NDgsOSBAQAogCXU4IGNoaXBfbWV0YWw7CiAJdTggY2hpcF9ib25kX2lkOwogCXU4IGNoaXBfcGxhdGZvcm1fdHlwZTsKLQkjZGVmaW5lIFZFUl9HRVRfUkVTUF9DSElQX1BMQVRGT1JNX1RZUEVfQVNJQwkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBWRVJfR0VUX1JFU1BfQ0hJUF9QTEFURk9STV9UWVBFX0ZQR0EJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgVkVSX0dFVF9SRVNQX0NISVBfUExBVEZPUk1fVFlQRV9QQUxMQURJVU0JICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBWRVJfR0VUX1JFU1BfQ0hJUF9QTEFURk9STV9UWVBFX0FTSUMJCSAgIDB4MFVMCisJI2RlZmluZSBWRVJfR0VUX1JFU1BfQ0hJUF9QTEFURk9STV9UWVBFX0ZQR0EJCSAgIDB4MVVMCisJI2RlZmluZSBWRVJfR0VUX1JFU1BfQ0hJUF9QTEFURk9STV9UWVBFX1BBTExBRElVTQkgICAweDJVTAogCV9fbGUxNiBtYXhfcmVxX3dpbl9sZW47CiAJX19sZTE2IG1heF9yZXNwX2xlbjsKIAlfX2xlMTYgZGVmX3JlcV90aW1lb3V0OwpAQCAtODYzLDEwICs4NzIsMTAgQEAKIAkjZGVmaW5lIEZVTkNfUkVTRVRfUkVRX0VOQUJMRVNfVkZfSURfVkFMSUQJCSAgICAweDFVTAogCV9fbGUxNiB2Zl9pZDsKIAl1OCBmdW5jX3Jlc2V0X2xldmVsOwotCSNkZWZpbmUgRlVOQ19SRVNFVF9SRVFfRlVOQ19SRVNFVF9MRVZFTF9SRVNFVEFMTAkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfUkVTRVRfUkVRX0ZVTkNfUkVTRVRfTEVWRUxfUkVTRVRNRQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfUkVTRVRfUkVRX0ZVTkNfUkVTRVRfTEVWRUxfUkVTRVRDSElMRFJFTiAgICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBGVU5DX1JFU0VUX1JFUV9GVU5DX1JFU0VUX0xFVkVMX1JFU0VUVkYJICAgKDB4M1VMIDw8IDApCisJI2RlZmluZSBGVU5DX1JFU0VUX1JFUV9GVU5DX1JFU0VUX0xFVkVMX1JFU0VUQUxMCSAgIDB4MFVMCisJI2RlZmluZSBGVU5DX1JFU0VUX1JFUV9GVU5DX1JFU0VUX0xFVkVMX1JFU0VUTUUJICAgMHgxVUwKKwkjZGVmaW5lIEZVTkNfUkVTRVRfUkVRX0ZVTkNfUkVTRVRfTEVWRUxfUkVTRVRDSElMRFJFTiAgICAgMHgyVUwKKwkjZGVmaW5lIEZVTkNfUkVTRVRfUkVRX0ZVTkNfUkVTRVRfTEVWRUxfUkVTRVRWRgkgICAweDNVTAogCXU4IHVudXNlZF8wOwogfTsKIApAQCAtMTAyOCw2ICsxMDM3LDEwIEBACiAJI2RlZmluZSBGVU5DX1FDQVBTX1JFU1BfRkxBR1NfUk9DRV9WMl9TVVBQT1JURUQJICAgIDB4MTBVTAogCSNkZWZpbmUgRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX1dPTF9NQUdJQ1BLVF9TVVBQT1JURUQgICAgICAgMHgyMFVMCiAJI2RlZmluZSBGVU5DX1FDQVBTX1JFU1BfRkxBR1NfV09MX0JNUF9TVVBQT1JURUQJICAgIDB4NDBVTAorCSNkZWZpbmUgRlVOQ19RQ0FQU19SRVNQX0ZMQUdTX1RYX1JJTkdfUkxfU1VQUE9SVEVECSAgICAweDgwVUwKKwkjZGVmaW5lIEZVTkNfUUNBUFNfUkVTUF9GTEFHU19UWF9CV19DRkdfU1VQUE9SVEVECSAgICAweDEwMFVMCisJI2RlZmluZSBGVU5DX1FDQVBTX1JFU1BfRkxBR1NfVkZfVFhfUklOR19STF9TVVBQT1JURUQgICAgICAweDIwMFVMCisJI2RlZmluZSBGVU5DX1FDQVBTX1JFU1BfRkxBR1NfVkZfQldfQ0ZHX1NVUFBPUlRFRAkgICAgMHg0MDBVTAogCXU4IG1hY19hZGRyZXNzWzZdOwogCV9fbGUxNiBtYXhfcnNzY29zX2N0eDsKIAlfX2xlMTYgbWF4X2NtcGxfcmluZ3M7CkBAIC0xMDQ3LDkgKzEwNjAsOCBAQAogCV9fbGUzMiBtYXhfbWNhc3RfZmlsdGVyczsKIAlfX2xlMzIgbWF4X2Zsb3dfaWQ7CiAJX19sZTMyIG1heF9od19yaW5nX2dycHM7CisJX19sZTE2IG1heF9zcF90eF9yaW5nczsKIAl1OCB1bnVzZWRfMDsKLQl1OCB1bnVzZWRfMTsKLQl1OCB1bnVzZWRfMjsKIAl1OCB2YWxpZDsKIH07CiAKQEAgLTEwNzcsNiArMTA4OSw3IEBACiAJX19sZTE2IGZsYWdzOwogCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfRkxBR1NfT09CX1dPTF9NQUdJQ1BLVF9FTkFCTEVEICAgICAgMHgxVUwKIAkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX0ZMQUdTX09PQl9XT0xfQk1QX0VOQUJMRUQJICAgIDB4MlVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9GTEFHU19GV19EQ0JYX0FHRU5UX0VOQUJMRUQJICAgIDB4NFVMCiAJdTggbWFjX2FkZHJlc3NbNl07CiAJX19sZTE2IHBjaV9pZDsKIAlfX2xlMTYgYWxsb2NfcnNzY29zX2N0eDsKQEAgLTEwODksMjkgKzExMDIsNDYgQEAKIAlfX2xlMTYgbXJ1OwogCV9fbGUxNiBzdGF0X2N0eF9pZDsKIAl1OCBwb3J0X3BhcnRpdGlvbl90eXBlOwotCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9TUEYJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9NUEZTCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9OUEFSMV8wCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9OUEFSMV81CSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9OUEFSMl8wCSAgICgweDRVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9VTktOT1dOCSAgICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfU1BGCQkgICAweDBVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9NUEZTCSAgIDB4MVVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX05QQVIxXzAJICAgMHgyVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX1BPUlRfUEFSVElUSU9OX1RZUEVfTlBBUjFfNQkgICAweDNVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfUE9SVF9QQVJUSVRJT05fVFlQRV9OUEFSMl8wCSAgIDB4NFVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9QT1JUX1BBUlRJVElPTl9UWVBFX1VOS05PV04JICAgMHhmZlVMCiAJdTggdW51c2VkXzA7CiAJX19sZTE2IGRmbHRfdm5pY19pZDsKIAl1OCB1bnVzZWRfMTsKIAl1OCB1bnVzZWRfMjsKIAlfX2xlMzIgbWluX2J3OworCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUlOX0JXX0JXX1ZBTFVFX01BU0sJCSAgICAweGZmZmZmZmZVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUlOX0JXX0JXX1ZBTFVFX1NGVAkJICAgIDAKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01JTl9CV19SU1ZECQkJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSwkgICAgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NSU5fQldfQldfVkFMVUVfVU5JVF9TRlQJICAgIDI5CisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NSU5fQldfQldfVkFMVUVfVU5JVF9NQlBTCSAgICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01JTl9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAgICAgICAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NSU5fQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIEZVTkNfUUNGR19SRVNQX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAlfX2xlMzIgbWF4X2J3OworCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUFYX0JXX0JXX1ZBTFVFX01BU0sJCSAgICAweGZmZmZmZmZVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUFYX0JXX0JXX1ZBTFVFX1NGVAkJICAgIDAKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01BWF9CV19SU1ZECQkJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUFTSwkgICAgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NQVhfQldfQldfVkFMVUVfVU5JVF9TRlQJICAgIDI5CisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NQVhfQldfQldfVkFMVUVfVU5JVF9NQlBTCSAgICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX01BWF9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAgICAgICAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9NQVhfQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIEZVTkNfUUNGR19SRVNQX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAl1OCBldmJfbW9kZTsKLQkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX0VWQl9NT0RFX05PX0VWQgkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfRVZCX01PREVfVkVCCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9FVkJfTU9ERV9WRVBBCQkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBGVU5DX1FDRkdfUkVTUF9FVkJfTU9ERV9OT19FVkIJCQkgICAweDBVTAorCSNkZWZpbmUgRlVOQ19RQ0ZHX1JFU1BfRVZCX01PREVfVkVCCQkJICAgMHgxVUwKKwkjZGVmaW5lIEZVTkNfUUNGR19SRVNQX0VWQl9NT0RFX1ZFUEEJCQkgICAweDJVTAogCXU4IHVudXNlZF8zOwotCV9fbGUxNiB1bnVzZWRfNDsKKwlfX2xlMTYgYWxsb2NfdmZzOwogCV9fbGUzMiBhbGxvY19tY2FzdF9maWx0ZXJzOwogCV9fbGUzMiBhbGxvY19od19yaW5nX2dycHM7Ci0JdTggdW51c2VkXzU7Ci0JdTggdW51c2VkXzY7Ci0JdTggdW51c2VkXzc7CisJX19sZTE2IGFsbG9jX3NwX3R4X3JpbmdzOworCXU4IHVudXNlZF80OwogCXU4IHZhbGlkOwogfTsKIApAQCAtMTE3MSwxOCArMTIwMSwzNiBAQAogCV9fbGUxNiBkZmx0X3ZsYW47CiAJX19iZTMyIGRmbHRfaXBfYWRkcls0XTsKIAlfX2xlMzIgbWluX2J3OworCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01JTl9CV19CV19WQUxVRV9NQVNLCQkgICAgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NSU5fQldfQldfVkFMVUVfU0ZUCQkgICAgMAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01JTl9CV19SU1ZECQkJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01JTl9CV19CV19WQUxVRV9VTklUX01BU0sJCSAgICAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NSU5fQldfQldfVkFMVUVfVU5JVF9TRlQJCSAgICAyOQorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01JTl9CV19CV19WQUxVRV9VTklUX01CUFMJCSAgICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NSU5fQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgICAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQJICAgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01JTl9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgRlVOQ19DRkdfUkVRX01JTl9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAlfX2xlMzIgbWF4X2J3OworCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01BWF9CV19CV19WQUxVRV9NQVNLCQkgICAgMHhmZmZmZmZmVUwKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NQVhfQldfQldfVkFMVUVfU0ZUCQkgICAgMAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01BWF9CV19SU1ZECQkJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX01BU0sJCSAgICAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9TRlQJCSAgICAyOQorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX01CUFMJCSAgICgweDBVTCA8PCAyOSkKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9QRVJDRU5UMV8xMDAgICAgKDB4MVVMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQJICAgKDB4N1VMIDw8IDI5KQorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgRlVOQ19DRkdfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX0lOVkFMSUQKIAlfX2xlMTYgYXN5bmNfZXZlbnRfY3I7CiAJdTggdmxhbl9hbnRpc3Bvb2ZfbW9kZTsKLQkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9WTEFOX0FOVElTUE9PRl9NT0RFX05PQ0hFQ0sJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0NGR19SRVFfVkxBTl9BTlRJU1BPT0ZfTU9ERV9WQUxJREFURV9WTEFOICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19DRkdfUkVRX1ZMQU5fQU5USVNQT09GX01PREVfSU5TRVJUX0lGX1ZMQU5ETkUgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0NGR19SRVFfVkxBTl9BTlRJU1BPT0ZfTU9ERV9JTlNFUlRfT1JfT1ZFUlJJREVfVkxBTiAoMHgzVUwgPDwgMCkKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9WTEFOX0FOVElTUE9PRl9NT0RFX05PQ0hFQ0sJICAgMHgwVUwKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9WTEFOX0FOVElTUE9PRl9NT0RFX1ZBTElEQVRFX1ZMQU4gICAgMHgxVUwKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9WTEFOX0FOVElTUE9PRl9NT0RFX0lOU0VSVF9JRl9WTEFORE5FIDB4MlVMCisJI2RlZmluZSBGVU5DX0NGR19SRVFfVkxBTl9BTlRJU1BPT0ZfTU9ERV9JTlNFUlRfT1JfT1ZFUlJJREVfVkxBTiAweDNVTAogCXU4IGFsbG93ZWRfdmxhbl9wcmlzOwogCXU4IGV2Yl9tb2RlOwotCSNkZWZpbmUgRlVOQ19DRkdfUkVRX0VWQl9NT0RFX05PX0VWQgkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19DRkdfUkVRX0VWQl9NT0RFX1ZFQgkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19DRkdfUkVRX0VWQl9NT0RFX1ZFUEEJCQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIEZVTkNfQ0ZHX1JFUV9FVkJfTU9ERV9OT19FVkIJCQkgICAweDBVTAorCSNkZWZpbmUgRlVOQ19DRkdfUkVRX0VWQl9NT0RFX1ZFQgkJCSAgIDB4MVVMCisJI2RlZmluZSBGVU5DX0NGR19SRVFfRVZCX01PREVfVkVQQQkJCSAgIDB4MlVMCiAJdTggdW51c2VkXzI7CiAJX19sZTE2IG51bV9tY2FzdF9maWx0ZXJzOwogfTsKQEAgLTEzNDEsMTYgKzEzODksMTYgQEAKIAkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX0VOQUJMRVNfVkZfUkVRX0ZXRAkJICAgIDB4OFVMCiAJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9FTkFCTEVTX0FTWU5DX0VWRU5UX0ZXRAkgICAgMHgxMFVMCiAJX19sZTE2IG9zX3R5cGU7Ci0JI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX1VOS05PV04JCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9PVEhFUgkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX01TRE9TCQkgICAoMHhlVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfV0lORE9XUwkJICAgKDB4MTJVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9TT0xBUklTCQkgICAoMHgxZFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX0xJTlVYCQkgICAoMHgyNFVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX0ZSRUVCU0QJCSAgICgweDJhVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfRVNYSQkJCSAgICgweDY4VUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfV0lOODY0CQkgICAoMHg3M1VMIDw8IDApCi0JI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX1dJTjIwMTJSMgkJICAgKDB4NzRVTCA8PCAwKQorCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9VTktOT1dOCQkgICAweDBVTAorCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9PVEhFUgkJICAgMHgxVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfTVNET1MJCSAgIDB4ZVVMCisJI2RlZmluZSBGVU5DX0RSVl9SR1RSX1JFUV9PU19UWVBFX1dJTkRPV1MJCSAgIDB4MTJVTAorCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9TT0xBUklTCQkgICAweDFkVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfTElOVVgJCSAgIDB4MjRVTAorCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9GUkVFQlNECQkgICAweDJhVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1JHVFJfUkVRX09TX1RZUEVfRVNYSQkJCSAgIDB4NjhVTAorCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9XSU44NjQJCSAgIDB4NzNVTAorCSNkZWZpbmUgRlVOQ19EUlZfUkdUUl9SRVFfT1NfVFlQRV9XSU4yMDEyUjIJCSAgIDB4NzRVTAogCXU4IHZlcl9tYWo7CiAJdTggdmVyX21pbjsKIAl1OCB2ZXJfdXBkOwpAQCAtMTQxNSwxMyArMTQ2MywxMyBAQAogCV9fbGUxNiB2Zl9pZDsKIAlfX2xlMTYgcmVxX2J1Zl9udW1fcGFnZXM7CiAJX19sZTE2IHJlcV9idWZfcGFnZV9zaXplOwotCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfMTZCCSAgICgweDRVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfNEsJCSAgICgweGNVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfOEsJCSAgICgweGRVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfNjRLCSAgICgweDEwVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzJNCQkgICAoMHgxNVVMIDw8IDApCi0JI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV80TQkJICAgKDB4MTZVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfMUcJCSAgICgweDFlVUwgPDwgMCkKKwkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzE2QgkgICAweDRVTAorCSNkZWZpbmUgRlVOQ19CVUZfUkdUUl9SRVFfUkVRX0JVRl9QQUdFX1NJWkVfNEsJCSAgIDB4Y1VMCisJI2RlZmluZSBGVU5DX0JVRl9SR1RSX1JFUV9SRVFfQlVGX1BBR0VfU0laRV84SwkJICAgMHhkVUwKKwkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzY0SwkgICAweDEwVUwKKwkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzJNCQkgICAweDE1VUwKKwkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzRNCQkgICAweDE2VUwKKwkjZGVmaW5lIEZVTkNfQlVGX1JHVFJfUkVRX1JFUV9CVUZfUEFHRV9TSVpFXzFHCQkgICAweDFlVUwKIAlfX2xlMTYgcmVxX2J1Zl9sZW47CiAJX19sZTE2IHJlc3BfYnVmX2xlbjsKIAl1OCB1bnVzZWRfMDsKQEAgLTE0NzMsMTYgKzE1MjEsMTYgQEAKIAlfX2xlMTYgc2VxX2lkOwogCV9fbGUxNiByZXNwX2xlbjsKIAlfX2xlMTYgb3NfdHlwZTsKLQkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX1VOS05PV04JCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfT1RIRVIJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfTVNET1MJCSAgICgweGVVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfV0lORE9XUwkJICAgKDB4MTJVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfU09MQVJJUwkJICAgKDB4MWRVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfTElOVVgJCSAgICgweDI0VUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX0ZSRUVCU0QJCSAgICgweDJhVUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX0VTWEkJCSAgICgweDY4VUwgPDwgMCkKLQkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX1dJTjg2NAkJICAgKDB4NzNVTCA8PCAwKQotCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfV0lOMjAxMlIyCQkgICAoMHg3NFVMIDw8IDApCisJI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9VTktOT1dOCQkgICAweDBVTAorCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfT1RIRVIJCSAgIDB4MVVMCisJI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9NU0RPUwkJICAgMHhlVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX1dJTkRPV1MJCSAgIDB4MTJVTAorCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfU09MQVJJUwkJICAgMHgxZFVMCisJI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9MSU5VWAkJICAgMHgyNFVMCisJI2RlZmluZSBGVU5DX0RSVl9RVkVSX1JFU1BfT1NfVFlQRV9GUkVFQlNECQkgICAweDJhVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX0VTWEkJCSAgIDB4NjhVTAorCSNkZWZpbmUgRlVOQ19EUlZfUVZFUl9SRVNQX09TX1RZUEVfV0lOODY0CQkgICAweDczVUwKKwkjZGVmaW5lIEZVTkNfRFJWX1FWRVJfUkVTUF9PU19UWVBFX1dJTjIwMTJSMgkJICAgMHg3NFVMCiAJdTggdmVyX21hajsKIAl1OCB2ZXJfbWluOwogCXU4IHZlcl91cGQ7CkBAIC0xNTI4LDQ0ICsxNTc2LDQ0IEBACiAJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0VOQUJMRVNfVFhfTFBJX1RJTUVSCQkgICAgMHg0MDBVTAogCV9fbGUxNiBwb3J0X2lkOwogCV9fbGUxNiBmb3JjZV9saW5rX3NwZWVkOwotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzEwME1CCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzFHQgkJICAgKDB4YVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMkdCCQkgICAoMHgxNFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMl81R0IJICAgKDB4MTlVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzEwR0IJCSAgICgweDY0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8yMEdCCQkgICAoMHhjOFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMjVHQgkJICAgKDB4ZmFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzQwR0IJCSAgICgweDE5MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfNTBHQgkJICAgKDB4MWY0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8xMDBHQgkgICAoMHgzZThVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzEwTUIJCSAgICgweGZmZmZVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzEwME1CCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMUdCCQkgICAweGFVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzJHQgkJICAgMHgxNFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMl81R0IJICAgMHgxOVVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMTBHQgkJICAgMHg2NFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMjBHQgkJICAgMHhjOFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMjVHQgkJICAgMHhmYVVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfNDBHQgkJICAgMHgxOTBVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9GT1JDRV9MSU5LX1NQRUVEXzUwR0IJCSAgIDB4MWY0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfTElOS19TUEVFRF8xMDBHQgkgICAweDNlOFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX0xJTktfU1BFRURfMTBNQgkJICAgMHhmZmZmVUwKIAl1OCBhdXRvX21vZGU7Ci0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTU9ERV9OT05FCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19NT0RFX0FMTF9TUEVFRFMJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX01PREVfT05FX1NQRUVECQkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19NT0RFX09ORV9PUl9CRUxPVwkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19NT0RFX1NQRUVEX01BU0sJCSAgICgweDRVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX01PREVfTk9ORQkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19NT0RFX0FMTF9TUEVFRFMJCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTU9ERV9PTkVfU1BFRUQJCSAgIDB4MlVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTU9ERV9PTkVfT1JfQkVMT1cJICAgMHgzVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19NT0RFX1NQRUVEX01BU0sJCSAgIDB4NFVMCiAJdTggYXV0b19kdXBsZXg7Ci0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fRFVQTEVYX0hBTEYJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0RVUExFWF9GVUxMCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19EVVBMRVhfQk9USAkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fRFVQTEVYX0hBTEYJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fRFVQTEVYX0ZVTEwJCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fRFVQTEVYX0JPVEgJCSAgIDB4MlVMCiAJdTggYXV0b19wYXVzZTsKIAkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19QQVVTRV9UWAkJCSAgICAweDFVTAogCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX1BBVVNFX1JYCQkJICAgIDB4MlVMCiAJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fUEFVU0VfQVVUT05FR19QQVVTRQkgICAgMHg0VUwKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMTYgYXV0b19saW5rX3NwZWVkOwotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMTAwTUIJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMUdCCQkgICAoMHhhVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzJHQgkJICAgKDB4MTRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMl81R0IJCSAgICgweDE5VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzEwR0IJCSAgICgweDY0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzIwR0IJCSAgICgweGM4VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzI1R0IJCSAgICgweGZhVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzQwR0IJCSAgICgweDE5MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF81MEdCCQkgICAoMHgxZjRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMTAwR0IJCSAgICgweDNlOFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8xME1CCQkgICAoMHhmZmZmVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzEwME1CCQkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMUdCCQkgICAweGFVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMkdCCQkgICAweDE0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzJfNUdCCQkgICAweDE5VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzEwR0IJCSAgIDB4NjRVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfMjBHQgkJICAgMHhjOFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8yNUdCCQkgICAweGZhVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzQwR0IJCSAgIDB4MTkwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzUwR0IJCSAgIDB4MWY0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEXzEwMEdCCQkgICAweDNlOFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF8xME1CCQkgICAweGZmZmZVTAogCV9fbGUxNiBhdXRvX2xpbmtfc3BlZWRfbWFzazsKIAkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEX01BU0tfMTAwTUJIRCAgICAgIDB4MVVMCiAJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0FVVE9fTElOS19TUEVFRF9NQVNLXzEwME1CCSAgICAweDJVTApAQCAtMTU4MiwxMiArMTYzMCwxMiBAQAogCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9BVVRPX0xJTktfU1BFRURfTUFTS18xME1CSEQgICAgICAgMHgxMDAwVUwKIAkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfQVVUT19MSU5LX1NQRUVEX01BU0tfMTBNQgkgICAgMHgyMDAwVUwKIAl1OCB3aXJlc3BlZWQ7Ci0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX1dJUkVTUEVFRF9PRkYJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfV0lSRVNQRUVEX09OCQkJICAgKDB4MVVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX1dJUkVTUEVFRF9PRkYJCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9XSVJFU1BFRURfT04JCQkgICAweDFVTAogCXU4IGxwYms7Ci0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0xQQktfTk9ORQkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9MUEJLX0xPQ0FMCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0xQQktfUkVNT1RFCQkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0xQQktfTk9ORQkJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0xQQktfTE9DQUwJCQkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfQ0ZHX1JFUV9MUEJLX1JFTU9URQkJCSAgIDB4MlVMCiAJdTggZm9yY2VfcGF1c2U7CiAJI2RlZmluZSBQT1JUX1BIWV9DRkdfUkVRX0ZPUkNFX1BBVVNFX1RYCQkgICAgMHgxVUwKIAkjZGVmaW5lIFBPUlRfUEhZX0NGR19SRVFfRk9SQ0VfUEFVU0VfUlgJCSAgICAweDJVTApAQCAtMTY0MSwyNSArMTY4OSwyNSBAQAogCV9fbGUxNiBzZXFfaWQ7CiAJX19sZTE2IHJlc3BfbGVuOwogCXU4IGxpbms7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19OT19MSU5LCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NJR05BTAkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfTElOSwkJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfTk9fTElOSwkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NJR05BTAkJCSAgIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19MSU5LCQkJICAgMHgyVUwKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMTYgbGlua19zcGVlZDsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzEwME1CCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzFHQgkJICAgKDB4YVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8yR0IJCSAgICgweDE0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzJfNUdCCQkgICAoMHgxOVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8xMEdCCQkgICAoMHg2NFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8yMEdCCQkgICAoMHhjOFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8yNUdCCQkgICAoMHhmYVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF80MEdCCQkgICAoMHgxOTBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfNTBHQgkJICAgKDB4MWY0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzEwMEdCCQkgICAoMHgzZThVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMTBNQgkJICAgKDB4ZmZmZlVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8xMDBNQgkJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzFHQgkJICAgMHhhVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzJHQgkJICAgMHgxNFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8yXzVHQgkJICAgMHgxOVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8xMEdCCQkgICAweDY0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1NQRUVEXzIwR0IJCSAgIDB4YzhVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMjVHQgkJICAgMHhmYVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF80MEdCCQkgICAweDE5MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF81MEdCCQkgICAweDFmNFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19TUEVFRF8xMDBHQgkJICAgMHgzZThVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfU1BFRURfMTBNQgkJICAgMHhmZmZmVUwKIAl1OCBkdXBsZXg7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRFVQTEVYX0hBTEYJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9EVVBMRVhfRlVMTAkJCSAgICgweDFVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0RVUExFWF9IQUxGCQkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9EVVBMRVhfRlVMTAkJCSAgIDB4MVVMCiAJdTggcGF1c2U7CiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEFVU0VfVFgJCQkgICAgMHgxVUwKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QQVVTRV9SWAkJCSAgICAweDJVTApAQCAtMTY3OSwzOSArMTcyNywzOSBAQAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1NVUFBPUlRfU1BFRURTXzEwTUJIRAkgICAgMHgxMDAwVUwKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9TVVBQT1JUX1NQRUVEU18xME1CCQkgICAgMHgyMDAwVUwKIAlfX2xlMTYgZm9yY2VfbGlua19zcGVlZDsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzEwME1CCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMUdCCSAgICgweGFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMkdCCSAgICgweDE0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzJfNUdCCSAgICgweDE5VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzEwR0IJICAgKDB4NjRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMjBHQgkgICAoMHhjOFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8yNUdCCSAgICgweGZhVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzQwR0IJICAgKDB4MTkwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzUwR0IJICAgKDB4MWY0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzEwMEdCCSAgICgweDNlOFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8xME1CCSAgICgweGZmZmZVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMTAwTUIJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzFHQgkgICAweGFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMkdCCSAgIDB4MTRVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMl81R0IJICAgMHgxOVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF8xMEdCCSAgIDB4NjRVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMjBHQgkgICAweGM4VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzI1R0IJICAgMHhmYVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfTElOS19TUEVFRF80MEdCCSAgIDB4MTkwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9MSU5LX1NQRUVEXzUwR0IJICAgMHgxZjRVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMTAwR0IJICAgMHgzZThVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0ZPUkNFX0xJTktfU1BFRURfMTBNQgkgICAweGZmZmZVTAogCXU4IGF1dG9fbW9kZTsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX01PREVfTk9ORQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19NT0RFX0FMTF9TUEVFRFMJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19NT0RFX09ORV9TUEVFRAkJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19NT0RFX09ORV9PUl9CRUxPVwkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX01PREVfU1BFRURfTUFTSwkgICAoMHg0VUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX01PREVfTk9ORQkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX01PREVfQUxMX1NQRUVEUwkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTU9ERV9PTkVfU1BFRUQJCSAgIDB4MlVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19NT0RFX09ORV9PUl9CRUxPVwkgICAweDNVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTU9ERV9TUEVFRF9NQVNLCSAgIDB4NFVMCiAJdTggYXV0b19wYXVzZTsKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX1BBVVNFX1RYCQkgICAgMHgxVUwKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX1BBVVNFX1JYCQkgICAgMHgyVUwKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX1BBVVNFX0FVVE9ORUdfUEFVU0UJICAgIDB4NFVMCiAJX19sZTE2IGF1dG9fbGlua19zcGVlZDsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMTAwTUIJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzFHQgkJICAgKDB4YVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzJHQgkJICAgKDB4MTRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8yXzVHQgkgICAoMHgxOVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzEwR0IJICAgKDB4NjRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8yMEdCCSAgICgweGM4VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMjVHQgkgICAoMHhmYVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzQwR0IJICAgKDB4MTkwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfNTBHQgkgICAoMHgxZjRVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8xMDBHQgkgICAoMHgzZThVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8xME1CCSAgICgweGZmZmZVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8xMDBNQgkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8xR0IJCSAgIDB4YVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzJHQgkJICAgMHgxNFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzJfNUdCCSAgIDB4MTlVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8xMEdCCSAgIDB4NjRVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8yMEdCCSAgIDB4YzhVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF8yNUdCCSAgIDB4ZmFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF80MEdCCSAgIDB4MTkwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfNTBHQgkgICAweDFmNFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEXzEwMEdCCSAgIDB4M2U4VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfMTBNQgkgICAweGZmZmZVTAogCV9fbGUxNiBhdXRvX2xpbmtfc3BlZWRfbWFzazsKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfTUFTS18xMDBNQkhEICAgIDB4MVVMCiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfQVVUT19MSU5LX1NQRUVEX01BU0tfMTAwTUIgICAgICAweDJVTApAQCAtMTcyOCw0NiArMTc3Niw0NiBAQAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0FVVE9fTElOS19TUEVFRF9NQVNLXzEwTUJIRCAgICAgMHgxMDAwVUwKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9BVVRPX0xJTktfU1BFRURfTUFTS18xME1CICAgICAgIDB4MjAwMFVMCiAJdTggd2lyZXNwZWVkOwotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1dJUkVTUEVFRF9PRkYJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1dJUkVTUEVFRF9PTgkJICAgKDB4MVVMIDw8IDApCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfV0lSRVNQRUVEX09GRgkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9XSVJFU1BFRURfT04JCSAgIDB4MVVMCiAJdTggbHBiazsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MUEJLX05PTkUJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MUEJLX0xPQ0FMCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTFBCS19SRU1PVEUJCQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MUEJLX05PTkUJCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xQQktfTE9DQUwJCQkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xQQktfUkVNT1RFCQkJICAgMHgyVUwKIAl1OCBmb3JjZV9wYXVzZTsKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9GT1JDRV9QQVVTRV9UWAkJICAgIDB4MVVMCiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfRk9SQ0VfUEFVU0VfUlgJCSAgICAweDJVTAogCXU4IG1vZHVsZV9zdGF0dXM7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19OT05FCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX0RJU0FCTEVUWAkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX1dBUk5JTkdNU0cgICAgICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTU9EVUxFX1NUQVRVU19QV1JET1dOCSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfTk9USU5TRVJURUQgICAgICAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX05PVEFQUExJQ0FCTEUgICAgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfTk9ORQkJICAgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NT0RVTEVfU1RBVFVTX0RJU0FCTEVUWAkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfV0FSTklOR01TRyAgICAgICAweDJVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfUFdSRE9XTgkgICAweDNVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfTk9USU5TRVJURUQgICAgICAweDRVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01PRFVMRV9TVEFUVVNfTk9UQVBQTElDQUJMRSAgICAweGZmVUwKIAlfX2xlMzIgcHJlZW1waGFzaXM7CiAJdTggcGh5X21hajsKIAl1OCBwaHlfbWluOwogCXU4IHBoeV9ibGQ7CiAJdTggcGh5X3R5cGU7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfVU5LTk9XTgkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUNSCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFS1I0CQkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFTFIJCSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VTUgkJICAgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUtSMgkJICAgKDB4NVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUtYCQkgICAoMHg2VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFS1IJCSAgICgweDdVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VUCQkgICAoMHg4VUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFVEUJCSAgICgweDlVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX1NHTUlJRVhUUEhZCSAgICgweGFVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX1VOS05PV04JCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUNSCQkgICAweDFVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VLUjQJCSAgIDB4MlVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRUxSCQkgICAweDNVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VTUgkJICAgMHg0VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFS1IyCQkgICAweDVVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX0JBU0VLWAkJICAgMHg2VUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfVFlQRV9CQVNFS1IJCSAgIDB4N1VMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRVQJCSAgIDB4OFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfUEhZX1RZUEVfQkFTRVRFCQkgICAweDlVTAorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9UWVBFX1NHTUlJRVhUUEhZCSAgIDB4YVVMCiAJdTggbWVkaWFfdHlwZTsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NRURJQV9UWVBFX1VOS05PV04JCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01FRElBX1RZUEVfVFAJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX01FRElBX1RZUEVfREFDCQkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NRURJQV9UWVBFX0ZJQlJFCQkgICAoMHgzVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NRURJQV9UWVBFX1VOS05PV04JCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTUVESUFfVFlQRV9UUAkJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NRURJQV9UWVBFX0RBQwkJICAgMHgyVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9NRURJQV9UWVBFX0ZJQlJFCQkgICAweDNVTAogCXU4IHhjdnJfcGtnX3R5cGU7Ci0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfWENWUl9QS0dfVFlQRV9YQ1ZSX0lOVEVSTkFMICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1hDVlJfUEtHX1RZUEVfWENWUl9FWFRFUk5BTCAgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9YQ1ZSX1BLR19UWVBFX1hDVlJfSU5URVJOQUwgICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9YQ1ZSX1BLR19UWVBFX1hDVlJfRVhURVJOQUwgICAgMHgyVUwKIAl1OCBlZWVfY29uZmlnX3BoeV9hZGRyOwogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX1BIWV9BRERSX01BU0sJCSAgICAweDFmVUwKIAkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9QSFlfQUREUl9TRlQJCSAgICAwCkBAIC0xNzk2LDExICsxODQ0LDExIEBACiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9TUEVFRFNfMTBNQkhEICAweDEwMDBVTAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfU1BFRURTXzEwTUIgICAgMHgyMDAwVUwKIAl1OCBsaW5rX3BhcnRuZXJfYWR2X2F1dG9fbW9kZTsKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX0FVVE9fTU9ERV9OT05FICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfQVVUT19NT0RFX0FMTF9TUEVFRFMgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9BVVRPX01PREVfT05FX1NQRUVEICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfQVVUT19NT0RFX09ORV9PUl9CRUxPVyAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX0FVVE9fTU9ERV9TUEVFRF9NQVNLICgweDRVTCA8PCAwKQorCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfQVVUT19NT0RFX05PTkUgMHgwVUwKKwkjZGVmaW5lIFBPUlRfUEhZX1FDRkdfUkVTUF9MSU5LX1BBUlRORVJfQURWX0FVVE9fTU9ERV9BTExfU1BFRURTIDB4MVVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9BVVRPX01PREVfT05FX1NQRUVEIDB4MlVMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9BVVRPX01PREVfT05FX09SX0JFTE9XIDB4M1VMCisJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9BVVRPX01PREVfU1BFRURfTUFTSyAweDRVTAogCXU4IGxpbmtfcGFydG5lcl9hZHZfcGF1c2U7CiAJI2RlZmluZSBQT1JUX1BIWV9RQ0ZHX1JFU1BfTElOS19QQVJUTkVSX0FEVl9QQVVTRV9UWCAgICAgICAweDFVTAogCSNkZWZpbmUgUE9SVF9QSFlfUUNGR19SRVNQX0xJTktfUEFSVE5FUl9BRFZfUEFVU0VfUlggICAgICAgMHgyVUwKQEAgLTE4NTksNyArMTkwNyw3IEBACiAJX19sZTY0IHJlc3BfYWRkcjsKIAlfX2xlMzIgZmxhZ3M7CiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX01BVENIX0xJTksJCSAgICAweDFVTAotCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19DT1NfQVNTSUdOTUVOVF9FTkFCTEUgICAgICAgMHgyVUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfVkxBTl9QUkkyQ09TX0VOQUJMRQkgICAgMHgyVUwKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfVFVOTkVMX1BSSTJDT1NfRU5BQkxFICAgICAgIDB4NFVMCiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX0lQX0RTQ1AyQ09TX0VOQUJMRQkgICAgMHg4VUwKIAkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRkxBR1NfUFRQX1JYX1RTX0NBUFRVUkVfRU5BQkxFICAgIDB4MTBVTApAQCAtMTg2OCwyOCArMTkxNiw1MCBAQAogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19QVFBfVFhfVFNfQ0FQVFVSRV9ESVNBQkxFICAgMHg4MFVMCiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX09PQl9XT0xfRU5BQkxFCQkgICAgMHgxMDBVTAogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9GTEFHU19PT0JfV09MX0RJU0FCTEUJCSAgICAweDIwMFVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX1ZMQU5fUFJJMkNPU19ESVNBQkxFCSAgICAweDQwMFVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX1RVTk5FTF9QUkkyQ09TX0RJU0FCTEUgICAgICAweDgwMFVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0ZMQUdTX0lQX0RTQ1AyQ09TX0RJU0FCTEUJICAgIDB4MTAwMFVMCiAJX19sZTMyIGVuYWJsZXM7CiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0VOQUJMRVNfSVBHCQkJICAgIDB4MVVMCiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0VOQUJMRVNfTFBCSwkJCSAgICAweDJVTAotCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9FTkFCTEVTX0lWTEFOX1BSSTJDT1NfTUFQX1BSSSAgICAgMHg0VUwKLQkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRU5BQkxFU19MQ09TX01BUF9QUkkJCSAgICAweDhVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9FTkFCTEVTX1ZMQU5fUFJJMkNPU19NQVBfUFJJICAgICAgMHg0VUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfRU5BQkxFU19SRVNFUlZFRDEJCSAgICAweDhVTAogCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9FTkFCTEVTX1RVTk5FTF9QUkkyQ09TX01BUF9QUkkgICAgMHgxMFVMCiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0VOQUJMRVNfRFNDUDJDT1NfTUFQX1BSSQkgICAgMHgyMFVMCiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0VOQUJMRVNfUlhfVFNfQ0FQVFVSRV9QVFBfTVNHX1RZUEUgMHg0MFVMCiAJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0VOQUJMRVNfVFhfVFNfQ0FQVFVSRV9QVFBfTVNHX1RZUEUgMHg4MFVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0VOQUJMRVNfQ09TX0ZJRUxEX0NGRwkJICAgIDB4MTAwVUwKIAlfX2xlMTYgcG9ydF9pZDsKIAl1OCBpcGc7CiAJdTggbHBiazsKLQkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfTFBCS19OT05FCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0xQQktfTE9DQUwJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfTFBCS19SRU1PVEUJCQkgICAoMHgyVUwgPDwgMCkKLQl1OCBpdmxhbl9wcmkyY29zX21hcF9wcmk7Ci0JdTggbGNvc19tYXBfcHJpOworCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9MUEJLX05PTkUJCQkgICAweDBVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9MUEJLX0xPQ0FMCQkJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfTFBCS19SRU1PVEUJCQkgICAweDJVTAorCXU4IHZsYW5fcHJpMmNvc19tYXBfcHJpOworCXU4IHJlc2VydmVkMTsKIAl1OCB0dW5uZWxfcHJpMmNvc19tYXBfcHJpOwogCXU4IGRzY3AycHJpX21hcF9wcmk7CiAJX19sZTE2IHJ4X3RzX2NhcHR1cmVfcHRwX21zZ190eXBlOwogCV9fbGUxNiB0eF90c19jYXB0dXJlX3B0cF9tc2dfdHlwZTsKLQlfX2xlMzIgdW51c2VkXzA7CisJdTggY29zX2ZpZWxkX2NmZzsKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19SU1ZEMQkJICAgIDB4MVVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVkxBTl9QUklfU0VMX01BU0sgICAweDZVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1ZMQU5fUFJJX1NFTF9TRlQgICAgMQorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1ZMQU5fUFJJX1NFTF9JTk5FUk1PU1QgKDB4MFVMIDw8IDEpCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVkxBTl9QUklfU0VMX09VVEVSICgweDFVTCA8PCAxKQorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1ZMQU5fUFJJX1NFTF9PVVRFUk1PU1QgKDB4MlVMIDw8IDEpCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVkxBTl9QUklfU0VMX1VOU1BFQ0lGSUVEICgweDNVTCA8PCAxKQorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1ZMQU5fUFJJX1NFTF9MQVNUICAgIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19WTEFOX1BSSV9TRUxfVU5TUEVDSUZJRUQKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19UX1ZMQU5fUFJJX1NFTF9NQVNLIDB4MThVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1RfVkxBTl9QUklfU0VMX1NGVCAgMworCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX1RfVkxBTl9QUklfU0VMX0lOTkVSTU9TVCAoMHgwVUwgPDwgMykKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19UX1ZMQU5fUFJJX1NFTF9PVVRFUiAoMHgxVUwgPDwgMykKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19UX1ZMQU5fUFJJX1NFTF9PVVRFUk1PU1QgKDB4MlVMIDw8IDMpCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVF9WTEFOX1BSSV9TRUxfVU5TUEVDSUZJRUQgKDB4M1VMIDw8IDMpCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVF9WTEFOX1BSSV9TRUxfTEFTVCAgICBQT1JUX01BQ19DRkdfUkVRX0NPU19GSUVMRF9DRkdfVF9WTEFOX1BSSV9TRUxfVU5TUEVDSUZJRUQKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVFfQ09TX0ZJRUxEX0NGR19ERUZBVUxUX0NPU19NQVNLICAgIDB4ZTBVTAorCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFUV9DT1NfRklFTERfQ0ZHX0RFRkFVTFRfQ09TX1NGVCAgICAgNQorCXU4IHVudXNlZF8wWzNdOwogfTsKIAogLyogT3V0cHV0ICgxNiBieXRlcykgKi8KQEAgLTE5MDIsOSArMTk3Miw5IEBACiAJX19sZTE2IG10dTsKIAl1OCBpcGc7CiAJdTggbHBiazsKLQkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVNQX0xQQktfTk9ORQkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFU1BfTFBCS19MT0NBTAkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUE9SVF9NQUNfQ0ZHX1JFU1BfTFBCS19SRU1PVEUJCQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVNQX0xQQktfTk9ORQkJCSAgIDB4MFVMCisJI2RlZmluZSBQT1JUX01BQ19DRkdfUkVTUF9MUEJLX0xPQ0FMCQkJICAgMHgxVUwKKwkjZGVmaW5lIFBPUlRfTUFDX0NGR19SRVNQX0xQQktfUkVNT1RFCQkJICAgMHgyVUwKIAl1OCB1bnVzZWRfMDsKIAl1OCB2YWxpZDsKIH07CkBAIC0yMTYzLDggKzIyMzMsOCBAQAogCV9fbGU2NCByZXNwX2FkZHI7CiAJX19sZTMyIGZsYWdzOwogCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVRX0ZMQUdTX1BBVEgJCQkgICAgMHgxVUwKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFUV9GTEFHU19QQVRIX1RYCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFUV9GTEFHU19QQVRIX1JYCQkgICAoMHgxVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFUV9GTEFHU19QQVRIX1RYCQkgICAweDBVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVRX0ZMQUdTX1BBVEhfUlgJCSAgIDB4MVVMCiAJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVFfRkxBR1NfUEFUSF9MQVNUICAgIFFVRVVFX1FQT1JUQ0ZHX1JFUV9GTEFHU19QQVRIX1JYCiAJX19sZTE2IHBvcnRfaWQ7CiAJX19sZTE2IHVudXNlZF8wOwpAQCAtMjE3OSw1MCArMjI0OSw1MSBAQAogCXU4IG1heF9jb25maWd1cmFibGVfcXVldWVzOwogCXU4IG1heF9jb25maWd1cmFibGVfbG9zc2xlc3NfcXVldWVzOwogCXU4IHF1ZXVlX2NmZ19hbGxvd2VkOwotCXU4IHF1ZXVlX2J1ZmZlcnNfY2ZnX2FsbG93ZWQ7CisJdTggcXVldWVfY2ZnX2luZm87CisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0NGR19JTkZPX0FTWU1fQ0ZHCSAgICAweDFVTAogCXU4IHF1ZXVlX3BmY2VuYWJsZV9jZmdfYWxsb3dlZDsKIAl1OCBxdWV1ZV9wcmkyY29zX2NmZ19hbGxvd2VkOwogCXU4IHF1ZXVlX2NvczJid19jZmdfYWxsb3dlZDsKIAl1OCBxdWV1ZV9pZDA7CiAJdTggcXVldWVfaWQwX3NlcnZpY2VfcHJvZmlsZTsKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQwX1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQwX1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQwX1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQwX1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAweDBVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDBfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTIDB4MVVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMF9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAweGZmVUwKIAl1OCBxdWV1ZV9pZDE7CiAJdTggcXVldWVfaWQxX3NlcnZpY2VfcHJvZmlsZTsKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQxX1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQxX1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQxX1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQxX1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAweDBVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDFfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTIDB4MVVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMV9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAweGZmVUwKIAl1OCBxdWV1ZV9pZDI7CiAJdTggcXVldWVfaWQyX3NlcnZpY2VfcHJvZmlsZTsKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQyX1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQyX1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQyX1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQyX1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAweDBVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDJfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTIDB4MVVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEMl9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAweGZmVUwKIAl1OCBxdWV1ZV9pZDM7CiAJdTggcXVldWVfaWQzX3NlcnZpY2VfcHJvZmlsZTsKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQzX1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQzX1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQzX1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQzX1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAweDBVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDNfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTIDB4MVVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEM19TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAweGZmVUwKIAl1OCBxdWV1ZV9pZDQ7CiAJdTggcXVldWVfaWQ0X3NlcnZpY2VfcHJvZmlsZTsKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ0X1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ0X1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ0X1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ0X1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAweDBVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDRfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTIDB4MVVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENF9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAweGZmVUwKIAl1OCBxdWV1ZV9pZDU7CiAJdTggcXVldWVfaWQ1X3NlcnZpY2VfcHJvZmlsZTsKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ1X1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ1X1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ1X1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ1X1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAweDBVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDVfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTIDB4MVVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENV9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAweGZmVUwKIAl1OCBxdWV1ZV9pZDY7CiAJdTggcXVldWVfaWQ2X3NlcnZpY2VfcHJvZmlsZTsKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ2X1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ2X1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ2X1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ2X1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAweDBVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDZfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTIDB4MVVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lENl9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAweGZmVUwKIAl1OCBxdWV1ZV9pZDc7CiAJdTggcXVldWVfaWQ3X3NlcnZpY2VfcHJvZmlsZTsKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ3X1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ3X1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUyAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ3X1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIFFVRVVFX1FQT1JUQ0ZHX1JFU1BfUVVFVUVfSUQ3X1NFUlZJQ0VfUFJPRklMRV9MT1NTWSAweDBVTAorCSNkZWZpbmUgUVVFVUVfUVBPUlRDRkdfUkVTUF9RVUVVRV9JRDdfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTIDB4MVVMCisJI2RlZmluZSBRVUVVRV9RUE9SVENGR19SRVNQX1FVRVVFX0lEN19TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTiAweGZmVUwKIAl1OCB2YWxpZDsKIH07CiAKQEAgLTIyMzUsMTkgKzIzMDYsMjEgQEAKIAlfX2xlMTYgdGFyZ2V0X2lkOwogCV9fbGU2NCByZXNwX2FkZHI7CiAJX19sZTMyIGZsYWdzOwotCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRICQkJICAgIDB4MVVMCi0JI2RlZmluZSBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEhfVFgJCQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSF9SWAkJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRIX0xBU1QgICAgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRIX1JYCisJI2RlZmluZSBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEhfTUFTSwkJCSAgICAweDNVTAorCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRIX1NGVAkJCSAgICAwCisJI2RlZmluZSBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEhfVFgJCQkgICAweDBVTAorCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9GTEFHU19QQVRIX1JYCQkJICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRkxBR1NfUEFUSF9CSURJUgkJCSAgIDB4MlVMCisJI2RlZmluZSBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEhfTEFTVCAgICBRVUVVRV9DRkdfUkVRX0ZMQUdTX1BBVEhfQklESVIKIAlfX2xlMzIgZW5hYmxlczsKIAkjZGVmaW5lIFFVRVVFX0NGR19SRVFfRU5BQkxFU19ERkxUX0xFTgkJCSAgICAweDFVTAogCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9FTkFCTEVTX1NFUlZJQ0VfUFJPRklMRQkJICAgIDB4MlVMCiAJX19sZTMyIHF1ZXVlX2lkOwogCV9fbGUzMiBkZmx0X2xlbjsKIAl1OCBzZXJ2aWNlX3Byb2ZpbGU7Ci0JI2RlZmluZSBRVUVVRV9DRkdfUkVRX1NFUlZJQ0VfUFJPRklMRV9MT1NTWQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DRkdfUkVRX1NFUlZJQ0VfUFJPRklMRV9MT1NTTEVTUwkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9DRkdfUkVRX1NFUlZJQ0VfUFJPRklMRV9VTktOT1dOCQkgICAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9DRkdfUkVRX1NFUlZJQ0VfUFJPRklMRV9MT1NTWQkJICAgMHgwVUwKKwkjZGVmaW5lIFFVRVVFX0NGR19SRVFfU0VSVklDRV9QUk9GSUxFX0xPU1NMRVNTCQkgICAweDFVTAorCSNkZWZpbmUgUVVFVUVfQ0ZHX1JFUV9TRVJWSUNFX1BST0ZJTEVfVU5LTk9XTgkJICAgMHhmZlVMCiAJdTggdW51c2VkXzBbN107CiB9OwogCkBAIC0yMjY0LDUwICsyMzM3LDYgQEAKIAl1OCB2YWxpZDsKIH07CiAKLS8qIGh3cm1fcXVldWVfYnVmZmVyc19jZmcgKi8KLS8qIElucHV0ICg1NiBieXRlcykgKi8KLXN0cnVjdCBod3JtX3F1ZXVlX2J1ZmZlcnNfY2ZnX2lucHV0IHsKLQlfX2xlMTYgcmVxX3R5cGU7Ci0JX19sZTE2IGNtcGxfcmluZzsKLQlfX2xlMTYgc2VxX2lkOwotCV9fbGUxNiB0YXJnZXRfaWQ7Ci0JX19sZTY0IHJlc3BfYWRkcjsKLQlfX2xlMzIgZmxhZ3M7Ci0JI2RlZmluZSBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRkxBR1NfUEFUSAkJICAgIDB4MVVMCi0JI2RlZmluZSBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRkxBR1NfUEFUSF9UWAkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRkxBR1NfUEFUSF9SWAkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRkxBR1NfUEFUSF9MQVNUICAgIFFVRVVFX0JVRkZFUlNfQ0ZHX1JFUV9GTEFHU19QQVRIX1JYCi0JX19sZTMyIGVuYWJsZXM7Ci0JI2RlZmluZSBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRU5BQkxFU19SRVNFUlZFRAkJICAgIDB4MVVMCi0JI2RlZmluZSBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRU5BQkxFU19TSEFSRUQJCSAgICAweDJVTAotCSNkZWZpbmUgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0VOQUJMRVNfWE9GRgkJICAgIDB4NFVMCi0JI2RlZmluZSBRVUVVRV9CVUZGRVJTX0NGR19SRVFfRU5BQkxFU19YT04JCSAgICAweDhVTAotCSNkZWZpbmUgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0VOQUJMRVNfRlVMTAkJICAgIDB4MTBVTAotCSNkZWZpbmUgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0VOQUJMRVNfTk9URlVMTAkJICAgIDB4MjBVTAotCSNkZWZpbmUgUVVFVUVfQlVGRkVSU19DRkdfUkVRX0VOQUJMRVNfTUFYCQkgICAgMHg0MFVMCi0JX19sZTMyIHF1ZXVlX2lkOwotCV9fbGUzMiByZXNlcnZlZDsKLQlfX2xlMzIgc2hhcmVkOwotCV9fbGUzMiB4b2ZmOwotCV9fbGUzMiB4b247Ci0JX19sZTMyIGZ1bGw7Ci0JX19sZTMyIG5vdGZ1bGw7Ci0JX19sZTMyIG1heDsKLX07Ci0KLS8qIE91dHB1dCAoMTYgYnl0ZXMpICovCi1zdHJ1Y3QgaHdybV9xdWV1ZV9idWZmZXJzX2NmZ19vdXRwdXQgewotCV9fbGUxNiBlcnJvcl9jb2RlOwotCV9fbGUxNiByZXFfdHlwZTsKLQlfX2xlMTYgc2VxX2lkOwotCV9fbGUxNiByZXNwX2xlbjsKLQlfX2xlMzIgdW51c2VkXzA7Ci0JdTggdW51c2VkXzE7Ci0JdTggdW51c2VkXzI7Ci0JdTggdW51c2VkXzM7Ci0JdTggdmFsaWQ7Ci19OwotCiAvKiBod3JtX3F1ZXVlX3BmY2VuYWJsZV9jZmcgKi8KIC8qIElucHV0ICgyNCBieXRlcykgKi8KIHN0cnVjdCBod3JtX3F1ZXVlX3BmY2VuYWJsZV9jZmdfaW5wdXQgewpAQCAtMjM1MSwxMiArMjM4MCwyMiBAQAogCV9fbGUxNiB0YXJnZXRfaWQ7CiAJX19sZTY0IHJlc3BfYWRkcjsKIAlfX2xlMzIgZmxhZ3M7Ci0JI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfUEFUSAkJICAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfUEFUSF9NQVNLCQkgICAgMHgzVUwKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19QQVRIX1NGVAkJICAgIDAKIAkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19QQVRIX1RYCQkgICAoMHgwVUwgPDwgMCkKIAkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19QQVRIX1JYCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19QQVRIX0xBU1QgICAgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0ZMQUdTX1BBVEhfUlgKLQkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19JVkxBTgkJICAgIDB4MlVMCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfUEFUSF9CSURJUgkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfUEFUSF9MQVNUICAgIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9GTEFHU19QQVRIX0JJRElSCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRkxBR1NfSVZMQU4JCSAgICAweDRVTAogCV9fbGUzMiBlbmFibGVzOworCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0VOQUJMRVNfUFJJMF9DT1NfUVVFVUVfSUQgICAgMHgxVUwKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9FTkFCTEVTX1BSSTFfQ09TX1FVRVVFX0lEICAgIDB4MlVMCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRU5BQkxFU19QUkkyX0NPU19RVUVVRV9JRCAgICAweDRVTAorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0VOQUJMRVNfUFJJM19DT1NfUVVFVUVfSUQgICAgMHg4VUwKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9FTkFCTEVTX1BSSTRfQ09TX1FVRVVFX0lEICAgIDB4MTBVTAorCSNkZWZpbmUgUVVFVUVfUFJJMkNPU19DRkdfUkVRX0VOQUJMRVNfUFJJNV9DT1NfUVVFVUVfSUQgICAgMHgyMFVMCisJI2RlZmluZSBRVUVVRV9QUkkyQ09TX0NGR19SRVFfRU5BQkxFU19QUkk2X0NPU19RVUVVRV9JRCAgICAweDQwVUwKKwkjZGVmaW5lIFFVRVVFX1BSSTJDT1NfQ0ZHX1JFUV9FTkFCTEVTX1BSSTdfQ09TX1FVRVVFX0lEICAgIDB4ODBVTAogCXU4IHBvcnRfaWQ7CiAJdTggcHJpMF9jb3NfcXVldWVfaWQ7CiAJdTggcHJpMV9jb3NfcXVldWVfaWQ7CkBAIC0yNDA0LDgyICsyNDQzLDIyNiBAQAogCXU4IHF1ZXVlX2lkMDsKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMzIgcXVldWVfaWQwX21pbl9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NSU5fQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01JTl9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01JTl9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NSU5fQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01JTl9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01JTl9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01JTl9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCV9fbGUzMiBxdWV1ZV9pZDBfbWF4X2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01BWF9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUFYX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUFYX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX01BWF9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NQVhfQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJdTggcXVldWVfaWQwX3RzYV9hc3NpZ247Ci0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfVFNBX0FTU0lHTl9TUCAgICAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX1RTQV9BU1NJR05fRVRTICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMF9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfVFNBX0FTU0lHTl9TUCAgICAgIDB4MFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfVFNBX0FTU0lHTl9FVFMgICAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDBfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAweDJVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQwX1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAweGZmVUwKIAl1OCBxdWV1ZV9pZDBfcHJpX2x2bDsKIAl1OCBxdWV1ZV9pZDBfYndfd2VpZ2h0OwogCXU4IHF1ZXVlX2lkMTsKIAlfX2xlMzIgcXVldWVfaWQxX21pbl9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NSU5fQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01JTl9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01JTl9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NSU5fQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01JTl9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01JTl9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01JTl9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCV9fbGUzMiBxdWV1ZV9pZDFfbWF4X2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01BWF9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUFYX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUFYX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX01BWF9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NQVhfQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJdTggcXVldWVfaWQxX3RzYV9hc3NpZ247Ci0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfVFNBX0FTU0lHTl9TUCAgICAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX1RTQV9BU1NJR05fRVRTICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMV9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfVFNBX0FTU0lHTl9TUCAgICAgIDB4MFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfVFNBX0FTU0lHTl9FVFMgICAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDFfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAweDJVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQxX1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAweGZmVUwKIAl1OCBxdWV1ZV9pZDFfcHJpX2x2bDsKIAl1OCBxdWV1ZV9pZDFfYndfd2VpZ2h0OwogCXU4IHF1ZXVlX2lkMjsKIAlfX2xlMzIgcXVldWVfaWQyX21pbl9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NSU5fQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01JTl9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01JTl9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NSU5fQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01JTl9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01JTl9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01JTl9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCV9fbGUzMiBxdWV1ZV9pZDJfbWF4X2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01BWF9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUFYX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUFYX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX01BWF9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NQVhfQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJdTggcXVldWVfaWQyX3RzYV9hc3NpZ247Ci0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfVFNBX0FTU0lHTl9TUCAgICAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX1RTQV9BU1NJR05fRVRTICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEMl9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfVFNBX0FTU0lHTl9TUCAgICAgIDB4MFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfVFNBX0FTU0lHTl9FVFMgICAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDJfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAweDJVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQyX1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAweGZmVUwKIAl1OCBxdWV1ZV9pZDJfcHJpX2x2bDsKIAl1OCBxdWV1ZV9pZDJfYndfd2VpZ2h0OwogCXU4IHF1ZXVlX2lkMzsKIAlfX2xlMzIgcXVldWVfaWQzX21pbl9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NSU5fQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01JTl9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01JTl9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NSU5fQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01JTl9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01JTl9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01JTl9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCV9fbGUzMiBxdWV1ZV9pZDNfbWF4X2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01BWF9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUFYX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUFYX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX01BWF9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NQVhfQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJdTggcXVldWVfaWQzX3RzYV9hc3NpZ247Ci0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfVFNBX0FTU0lHTl9TUCAgICAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX1RTQV9BU1NJR05fRVRTICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEM19UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfVFNBX0FTU0lHTl9TUCAgICAgIDB4MFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfVFNBX0FTU0lHTl9FVFMgICAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDNfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAweDJVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQzX1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAweGZmVUwKIAl1OCBxdWV1ZV9pZDNfcHJpX2x2bDsKIAl1OCBxdWV1ZV9pZDNfYndfd2VpZ2h0OwogCXU4IHF1ZXVlX2lkNDsKIAlfX2xlMzIgcXVldWVfaWQ0X21pbl9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NSU5fQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01JTl9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01JTl9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NSU5fQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01JTl9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01JTl9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01JTl9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCV9fbGUzMiBxdWV1ZV9pZDRfbWF4X2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01BWF9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUFYX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUFYX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X01BWF9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NQVhfQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJdTggcXVldWVfaWQ0X3RzYV9hc3NpZ247Ci0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfVFNBX0FTU0lHTl9TUCAgICAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X1RTQV9BU1NJR05fRVRTICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENF9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfVFNBX0FTU0lHTl9TUCAgICAgIDB4MFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfVFNBX0FTU0lHTl9FVFMgICAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDRfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAweDJVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ0X1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAweGZmVUwKIAl1OCBxdWV1ZV9pZDRfcHJpX2x2bDsKIAl1OCBxdWV1ZV9pZDRfYndfd2VpZ2h0OwogCXU4IHF1ZXVlX2lkNTsKIAlfX2xlMzIgcXVldWVfaWQ1X21pbl9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NSU5fQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01JTl9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01JTl9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NSU5fQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01JTl9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01JTl9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01JTl9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCV9fbGUzMiBxdWV1ZV9pZDVfbWF4X2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01BWF9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUFYX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUFYX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X01BWF9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NQVhfQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJdTggcXVldWVfaWQ1X3RzYV9hc3NpZ247Ci0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfVFNBX0FTU0lHTl9TUCAgICAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X1RTQV9BU1NJR05fRVRTICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENV9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfVFNBX0FTU0lHTl9TUCAgICAgIDB4MFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfVFNBX0FTU0lHTl9FVFMgICAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDVfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAweDJVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ1X1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAweGZmVUwKIAl1OCBxdWV1ZV9pZDVfcHJpX2x2bDsKIAl1OCBxdWV1ZV9pZDVfYndfd2VpZ2h0OwogCXU4IHF1ZXVlX2lkNjsKIAlfX2xlMzIgcXVldWVfaWQ2X21pbl9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NSU5fQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01JTl9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01JTl9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NSU5fQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01JTl9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01JTl9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01JTl9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCV9fbGUzMiBxdWV1ZV9pZDZfbWF4X2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01BWF9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUFYX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUFYX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X01BWF9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NQVhfQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJdTggcXVldWVfaWQ2X3RzYV9hc3NpZ247Ci0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfVFNBX0FTU0lHTl9TUCAgICAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X1RTQV9BU1NJR05fRVRTICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lENl9UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfVFNBX0FTU0lHTl9TUCAgICAgIDB4MFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfVFNBX0FTU0lHTl9FVFMgICAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDZfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAweDJVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ2X1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAweGZmVUwKIAl1OCBxdWV1ZV9pZDZfcHJpX2x2bDsKIAl1OCBxdWV1ZV9pZDZfYndfd2VpZ2h0OwogCXU4IHF1ZXVlX2lkNzsKIAlfX2xlMzIgcXVldWVfaWQ3X21pbl9idzsKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NSU5fQldfQldfVkFMVUVfTUFTSyAweGZmZmZmZmZVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01JTl9CV19CV19WQUxVRV9TRlQgMAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01JTl9CV19SU1ZECSAgICAweDEwMDAwMDAwVUwKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NSU5fQldfQldfVkFMVUVfVU5JVF9NQVNLIDB4ZTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01JTl9CV19CV19WQUxVRV9VTklUX1NGVCAyOQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01JTl9CV19CV19WQUxVRV9VTklUX01CUFMgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01JTl9CV19CV19WQUxVRV9VTklUX1BFUkNFTlQxXzEwMCAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRCAoMHg3VUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfTEFTVCAgICBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUlOX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCV9fbGUzMiBxdWV1ZV9pZDdfbWF4X2J3OworCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01BWF9CV19CV19WQUxVRV9NQVNLIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUFYX0JXX0JXX1ZBTFVFX1NGVCAwCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUFYX0JXX1JTVkQJICAgIDB4MTAwMDAwMDBVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X01BWF9CV19CV19WQUxVRV9VTklUX01BU0sgMHhlMDAwMDAwMFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfU0ZUIDI5CisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfTUJQUyAoMHgwVUwgPDwgMjkpCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICgweDFVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NQVhfQldfQldfVkFMVUVfVU5JVF9MQVNUICAgIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElECiAJdTggcXVldWVfaWQ3X3RzYV9hc3NpZ247Ci0JI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfVFNBX0FTU0lHTl9TUCAgICAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X1RTQV9BU1NJR05fRVRTICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFFVRVVFX0NPUzJCV19DRkdfUkVRX1FVRVVFX0lEN19UU0FfQVNTSUdOX1JFU0VSVkVEX0ZJUlNUICgweDJVTCA8PCAwKQotCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfVFNBX0FTU0lHTl9TUCAgICAgIDB4MFVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfVFNBX0FTU0lHTl9FVFMgICAgIDB4MVVMCisJI2RlZmluZSBRVUVVRV9DT1MyQldfQ0ZHX1JFUV9RVUVVRV9JRDdfVFNBX0FTU0lHTl9SRVNFUlZFRF9GSVJTVCAweDJVTAorCSNkZWZpbmUgUVVFVUVfQ09TMkJXX0NGR19SRVFfUVVFVUVfSUQ3X1RTQV9BU1NJR05fUkVTRVJWRURfTEFTVCAweGZmVUwKIAl1OCBxdWV1ZV9pZDdfcHJpX2x2bDsKIAl1OCBxdWV1ZV9pZDdfYndfd2VpZ2h0OwogCXU4IHVudXNlZF8xWzVdOwpAQCAtMjU2Myw2ICsyNzQ2LDcgQEAKIAkjZGVmaW5lIFZOSUNfQ0ZHX1JFUV9GTEFHU19CRF9TVEFMTF9NT0RFCQkgICAgMHg0VUwKIAkjZGVmaW5lIFZOSUNfQ0ZHX1JFUV9GTEFHU19ST0NFX0RVQUxfVk5JQ19NT0RFCQkgICAgMHg4VUwKIAkjZGVmaW5lIFZOSUNfQ0ZHX1JFUV9GTEFHU19ST0NFX09OTFlfVk5JQ19NT0RFCQkgICAgMHgxMFVMCisJI2RlZmluZSBWTklDX0NGR19SRVFfRkxBR1NfUlNTX0RGTFRfQ1JfTU9ERQkJICAgIDB4MjBVTAogCV9fbGUzMiBlbmFibGVzOwogCSNkZWZpbmUgVk5JQ19DRkdfUkVRX0VOQUJMRVNfREZMVF9SSU5HX0dSUAkJICAgIDB4MVVMCiAJI2RlZmluZSBWTklDX0NGR19SRVFfRU5BQkxFU19SU1NfUlVMRQkJCSAgICAweDJVTApAQCAtMjYxNSwxOCArMjc5OSwxOCBAQAogCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9FTkFCTEVTX01JTl9BR0dfTEVOCQkgICAgMHg4VUwKIAlfX2xlMTYgdm5pY19pZDsKIAlfX2xlMTYgbWF4X2FnZ19zZWdzOwotCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHX1NFR1NfMQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dfU0VHU18yCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR19TRUdTXzQJCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHX1NFR1NfOAkJICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dfU0VHU19NQVgJCSAgICgweDFmVUwgPDwgMCkKKwkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR19TRUdTXzEJCSAgIDB4MFVMCisJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dfU0VHU18yCQkgICAweDFVTAorCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHX1NFR1NfNAkJICAgMHgyVUwKKwkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR19TRUdTXzgJCSAgIDB4M1VMCisJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dfU0VHU19NQVgJCSAgIDB4MWZVTAogCV9fbGUxNiBtYXhfYWdnczsKLQkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfMQkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU18yCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTXzQJCQkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfOAkJCSAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU18xNgkJCSAgICgweDRVTCA8PCAwKQotCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU19NQVgJCQkgICAoMHg3VUwgPDwgMCkKKwkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfMQkJCSAgIDB4MFVMCisJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTXzIJCQkgICAweDFVTAorCSNkZWZpbmUgVk5JQ19UUEFfQ0ZHX1JFUV9NQVhfQUdHU180CQkJICAgMHgyVUwKKwkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfOAkJCSAgIDB4M1VMCisJI2RlZmluZSBWTklDX1RQQV9DRkdfUkVRX01BWF9BR0dTXzE2CQkJICAgMHg0VUwKKwkjZGVmaW5lIFZOSUNfVFBBX0NGR19SRVFfTUFYX0FHR1NfTUFYCQkJICAgMHg3VUwKIAl1OCB1bnVzZWRfMDsKIAl1OCB1bnVzZWRfMTsKIAlfX2xlMzIgbWF4X2FnZ190aW1lcjsKQEAgLTI3ODAsMTUgKzI5NjQsMTUgQEAKIAlfX2xlNjQgcmVzcF9hZGRyOwogCV9fbGUzMiBlbmFibGVzOwogCSNkZWZpbmUgUklOR19BTExPQ19SRVFfRU5BQkxFU19SRVNFUlZFRDEJCSAgICAweDFVTAotCSNkZWZpbmUgUklOR19BTExPQ19SRVFfRU5BQkxFU19SRVNFUlZFRDIJCSAgICAweDJVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfRU5BQkxFU19SSU5HX0FSQl9DRkcJCSAgICAweDJVTAogCSNkZWZpbmUgUklOR19BTExPQ19SRVFfRU5BQkxFU19SRVNFUlZFRDMJCSAgICAweDRVTAogCSNkZWZpbmUgUklOR19BTExPQ19SRVFfRU5BQkxFU19TVEFUX0NUWF9JRF9WQUxJRAkgICAgMHg4VUwKIAkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0VOQUJMRVNfUkVTRVJWRUQ0CQkgICAgMHgxMFVMCiAJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9FTkFCTEVTX01BWF9CV19WQUxJRAkJICAgIDB4MjBVTAogCXU4IHJpbmdfdHlwZTsKLQkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfVFlQRV9DTVBMCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX1RZUEVfVFgJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfVFlQRV9SWAkJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19UWVBFX0NNUEwJCQkgICAweDBVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19UWVBFX1RYCQkJICAgMHgxVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfVFlQRV9SWAkJCSAgIDB4MlVMCiAJdTggdW51c2VkXzA7CiAJX19sZTE2IHVudXNlZF8xOwogCV9fbGU2NCBwYWdlX3RibF9hZGRyOwpAQCAtMjgwNCwxOCArMjk4OCwzNiBAQAogCXU4IHVudXNlZF80OwogCXU4IHVudXNlZF81OwogCV9fbGUzMiByZXNlcnZlZDE7Ci0JX19sZTE2IHJlc2VydmVkMjsKKwlfX2xlMTYgcmluZ19hcmJfY2ZnOworCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19BUkJfQ0ZHX0FSQl9QT0xJQ1lfTUFTSwkgICAgMHhmVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfQVJCX0NGR19BUkJfUE9MSUNZX1NGVAkgICAgMAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19BUkJfQ0ZHX0FSQl9QT0xJQ1lfU1AJICAgKDB4MVVMIDw8IDApCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX0FSQl9DRkdfQVJCX1BPTElDWV9XRlEJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9SSU5HX0FSQl9DRkdfQVJCX1BPTElDWV9MQVNUICAgIFJJTkdfQUxMT0NfUkVRX1JJTkdfQVJCX0NGR19BUkJfUE9MSUNZX1dGUQorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19BUkJfQ0ZHX1JTVkRfTUFTSwkJICAgIDB4ZjBVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19BUkJfQ0ZHX1JTVkRfU0ZUCQkgICAgNAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfUklOR19BUkJfQ0ZHX0FSQl9QT0xJQ1lfUEFSQU1fTUFTSyAgMHhmZjAwVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX1JJTkdfQVJCX0NGR19BUkJfUE9MSUNZX1BBUkFNX1NGVCAgIDgKIAl1OCB1bnVzZWRfNjsKIAl1OCB1bnVzZWRfNzsKIAlfX2xlMzIgcmVzZXJ2ZWQzOwogCV9fbGUzMiBzdGF0X2N0eF9pZDsKIAlfX2xlMzIgcmVzZXJ2ZWQ0OwogCV9fbGUzMiBtYXhfYnc7CisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9NQVhfQldfQldfVkFMVUVfTUFTSwkJICAgIDB4ZmZmZmZmZlVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9NQVhfQldfQldfVkFMVUVfU0ZUCQkgICAgMAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfTUFYX0JXX1JTVkQJCQkgICAgMHgxMDAwMDAwMFVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9NQVNLCSAgICAweGUwMDAwMDAwVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX1NGVAkgICAgMjkKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX01CUFMJICAgKDB4MFVMIDw8IDI5KQorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfUEVSQ0VOVDFfMTAwICAoMHgxVUwgPDwgMjkpCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9NQVhfQldfQldfVkFMVUVfVU5JVF9JTlZBTElEICAgICAgICgweDdVTCA8PCAyOSkKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX01BWF9CV19CV19WQUxVRV9VTklUX0xBU1QgICAgUklOR19BTExPQ19SRVFfTUFYX0JXX0JXX1ZBTFVFX1VOSVRfSU5WQUxJRAogCXU4IGludF9tb2RlOwotCSNkZWZpbmUgUklOR19BTExPQ19SRVFfSU5UX01PREVfTEVHQUNZCQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9JTlRfTU9ERV9SU1ZECQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9JTlRfTU9ERV9NU0lYCQkJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9JTlRfTU9ERV9QT0xMCQkJICAgKDB4M1VMIDw8IDApCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9JTlRfTU9ERV9MRUdBQ1kJCQkgICAweDBVTAorCSNkZWZpbmUgUklOR19BTExPQ19SRVFfSU5UX01PREVfUlNWRAkJCSAgIDB4MVVMCisJI2RlZmluZSBSSU5HX0FMTE9DX1JFUV9JTlRfTU9ERV9NU0lYCQkJICAgMHgyVUwKKwkjZGVmaW5lIFJJTkdfQUxMT0NfUkVRX0lOVF9NT0RFX1BPTEwJCQkgICAweDNVTAogCXU4IHVudXNlZF84WzNdOwogfTsKIApAQCAtMjg0Miw5ICszMDQ0LDkgQEAKIAlfX2xlMTYgdGFyZ2V0X2lkOwogCV9fbGU2NCByZXNwX2FkZHI7CiAJdTggcmluZ190eXBlOwotCSNkZWZpbmUgUklOR19GUkVFX1JFUV9SSU5HX1RZUEVfQ01QTAkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUklOR19GUkVFX1JFUV9SSU5HX1RZUEVfVFgJCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFJJTkdfRlJFRV9SRVFfUklOR19UWVBFX1JYCQkJICAgKDB4MlVMIDw8IDApCisJI2RlZmluZSBSSU5HX0ZSRUVfUkVRX1JJTkdfVFlQRV9DTVBMCQkJICAgMHgwVUwKKwkjZGVmaW5lIFJJTkdfRlJFRV9SRVFfUklOR19UWVBFX1RYCQkJICAgMHgxVUwKKwkjZGVmaW5lIFJJTkdfRlJFRV9SRVFfUklOR19UWVBFX1JYCQkJICAgMHgyVUwKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMTYgcmluZ19pZDsKIAlfX2xlMzIgdW51c2VkXzE7CkBAIC0yOTQyLDkgKzMxNDQsOSBAQAogCV9fbGUxNiB0YXJnZXRfaWQ7CiAJX19sZTY0IHJlc3BfYWRkcjsKIAl1OCByaW5nX3R5cGU7Ci0JI2RlZmluZSBSSU5HX1JFU0VUX1JFUV9SSU5HX1RZUEVfQ01QTAkJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgUklOR19SRVNFVF9SRVFfUklOR19UWVBFX1RYCQkJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBSSU5HX1JFU0VUX1JFUV9SSU5HX1RZUEVfUlgJCQkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIFJJTkdfUkVTRVRfUkVRX1JJTkdfVFlQRV9DTVBMCQkJICAgMHgwVUwKKwkjZGVmaW5lIFJJTkdfUkVTRVRfUkVRX1JJTkdfVFlQRV9UWAkJCSAgIDB4MVVMCisJI2RlZmluZSBSSU5HX1JFU0VUX1JFUV9SSU5HX1RZUEVfUlgJCQkgICAweDJVTAogCXU4IHVudXNlZF8wOwogCV9fbGUxNiByaW5nX2lkOwogCV9fbGUzMiB1bnVzZWRfMTsKQEAgLTMwNjgsMzYgKzMyNzAsMzYgQEAKIAlfX2xlMTYgdF9sMl9pdmxhbjsKIAlfX2xlMTYgdF9sMl9pdmxhbl9tYXNrOwogCXU4IHNyY190eXBlOwotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfTlBPUlQJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfUEYJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfVkYJCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfVk5JQwkJICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9LT05HCQkgICAoMHg0VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX0FQRQkJICAgKDB4NVVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9CT05PCQkgICAoMHg2VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX1RBTkcJCSAgICgweDdVTCA8PCAwKQorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfTlBPUlQJCSAgIDB4MFVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9QRgkJICAgMHgxVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX1ZGCQkgICAweDJVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfVk5JQwkJICAgMHgzVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1NSQ19UWVBFX0tPTkcJCSAgIDB4NFVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9BUEUJCSAgIDB4NVVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9TUkNfVFlQRV9CT05PCQkgICAweDZVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfU1JDX1RZUEVfVEFORwkJICAgMHg3VUwKIAl1OCB1bnVzZWRfNjsKIAlfX2xlMzIgc3JjX2lkOwogCXU4IHR1bm5lbF90eXBlOwotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTk9OVFVOTkVMICAgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTlZHUkUJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9MMkdSRQkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQSVAJICAgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUJICAgKDB4NVVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9NUExTCSAgICgweDZVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfU1RUCSAgICgweDdVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBHUkUJICAgKDB4OFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9BTllUVU5ORUwgICAgICgweGZmVUwgPDwgMCkKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05PTlRVTk5FTCAgICAgMHgwVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOCSAgIDB4MVVMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OVkdSRQkgICAweDJVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTDJHUkUJICAgMHgzVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQSVAJICAgMHg0VUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRQkgICAweDVVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTVBMUwkgICAweDZVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfU1RUCSAgIDB4N1VMCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUEdSRQkgICAweDhVTAorCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfQU5ZVFVOTkVMICAgICAweGZmVUwKIAl1OCB1bnVzZWRfNzsKIAlfX2xlMTYgZHN0X2lkOwogCV9fbGUxNiBtaXJyb3Jfdm5pY19pZDsKIAl1OCBwcmlfaGludDsKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX05PX1BSRUZFUgkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0FCT1ZFX0ZJTFRFUiAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9CRUxPV19GSUxURVIgICAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0wyX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfTUFYCQkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX01JTgkJICAgKDB4NFVMIDw8IDApCisJI2RlZmluZSBDRkFfTDJfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9OT19QUkVGRVIJICAgMHgwVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0FCT1ZFX0ZJTFRFUiAgICAgMHgxVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0JFTE9XX0ZJTFRFUiAgICAgMHgyVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX01BWAkJICAgMHgzVUwKKwkjZGVmaW5lIENGQV9MMl9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX01JTgkJICAgMHg0VUwKIAl1OCB1bnVzZWRfODsKIAlfX2xlMzIgdW51c2VkXzk7CiAJX19sZTY0IGwyX2ZpbHRlcl9pZF9oaW50OwpAQCAtMzI0NiwxNiArMzQ0OCwxNiBAQAogCXU4IGwzX2FkZHJfdHlwZTsKIAl1OCB0X2wzX2FkZHJfdHlwZTsKIAl1OCB0dW5uZWxfdHlwZTsKLQkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9OT05UVU5ORUwgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfVlhMQU4gICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05WR1JFICAgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9MMkdSRSAgICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBJUCAgICAgICgweDRVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRSAgICAoMHg1VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9NUExTICAgICAgKDB4NlVMIDw8IDApCi0JI2RlZmluZSBDRkFfVFVOTkVMX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfU1RUICAgICAgICgweDdVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQR1JFICAgICAoMHg4VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9UVU5ORUxfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9BTllUVU5ORUwgKDB4ZmZVTCA8PCAwKQorCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05PTlRVTk5FTCAweDBVTAorCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOICAgICAweDFVTAorCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05WR1JFICAgICAweDJVTAorCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0wyR1JFICAgICAweDNVTAorCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQSVAgICAgICAweDRVTAorCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRSAgICAweDVVTAorCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX01QTFMgICAgICAweDZVTAorCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1NUVCAgICAgICAweDdVTAorCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0lQR1JFICAgICAweDhVTAorCSNkZWZpbmUgQ0ZBX1RVTk5FTF9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0FOWVRVTk5FTCAweGZmVUwKIAl1OCB1bnVzZWRfMDsKIAlfX2xlMzIgdm5pOwogCV9fbGUzMiBkc3Rfdm5pY19pZDsKQEAgLTMzMTEsMTQgKzM1MTMsMTQgQEAKIAlfX2xlMzIgZmxhZ3M7CiAJI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9GTEFHU19MT09QQkFDSwkgICAgMHgxVUwKIAl1OCBlbmNhcF90eXBlOwotCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9WWExBTiAgICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfTlZHUkUgICAgICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX0wyR1JFICAgICAgICgweDNVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9JUElQCSAgICgweDRVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9HRU5FVkUgICAgICAoMHg1VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfTVBMUwkgICAoMHg2VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfVkxBTgkgICAoMHg3VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfSVBHUkUgICAgICAgKDB4OFVMIDw8IDApCisJI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX1ZYTEFOICAgICAgIDB4MVVMCisJI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX05WR1JFICAgICAgIDB4MlVMCisJI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX0wyR1JFICAgICAgIDB4M1VMCisJI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX0lQSVAJICAgMHg0VUwKKwkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfR0VORVZFICAgICAgMHg1VUwKKwkjZGVmaW5lIENGQV9FTkNBUF9SRUNPUkRfQUxMT0NfUkVRX0VOQ0FQX1RZUEVfTVBMUwkgICAweDZVTAorCSNkZWZpbmUgQ0ZBX0VOQ0FQX1JFQ09SRF9BTExPQ19SRVFfRU5DQVBfVFlQRV9WTEFOCSAgIDB4N1VMCisJI2RlZmluZSBDRkFfRU5DQVBfUkVDT1JEX0FMTE9DX1JFUV9FTkNBUF9UWVBFX0lQR1JFICAgICAgIDB4OFVMCiAJdTggdW51c2VkXzA7CiAJX19sZTE2IHVudXNlZF8xOwogCV9fbGUzMiBlbmNhcF9kYXRhWzE2XTsKQEAgLTMzOTcsMzIgKzM1OTksMzIgQEAKIAl1OCBzcmNfbWFjYWRkcls2XTsKIAlfX2JlMTYgZXRoZXJ0eXBlOwogCXU4IGlwX2FkZHJfdHlwZTsKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9BRERSX1RZUEVfVU5LTk9XTiAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfQUREUl9UWVBFX0lQVjQgICAgICgweDRVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX0FERFJfVFlQRV9JUFY2ICAgICAoMHg2VUwgPDwgMCkKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9BRERSX1RZUEVfVU5LTk9XTiAgMHgwVUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9BRERSX1RZUEVfSVBWNCAgICAgMHg0VUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9BRERSX1RZUEVfSVBWNiAgICAgMHg2VUwKIAl1OCBpcF9wcm90b2NvbDsKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9JUF9QUk9UT0NPTF9VTktOT1dOICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfUFJPVE9DT0xfVURQICAgICAgICgweDZVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX0lQX1BST1RPQ09MX1RDUCAgICAgICAoMHgxMVVMIDw8IDApCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfUFJPVE9DT0xfVU5LTk9XTiAgIDB4MFVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfUFJPVE9DT0xfVURQICAgICAgIDB4NlVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfSVBfUFJPVE9DT0xfVENQICAgICAgIDB4MTFVTAogCV9fbGUxNiBkc3RfaWQ7CiAJX19sZTE2IG1pcnJvcl92bmljX2lkOwogCXU4IHR1bm5lbF90eXBlOwotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX05PTlRVTk5FTCAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9WWExBTiAgICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTlZHUkUgICAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0wyR1JFICAgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9JUElQICAgICAgKDB4NFVMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfR0VORVZFICAgICgweDVVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX01QTFMgICAgICAoMHg2VUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9TVFQgICAgICAgKDB4N1VMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBHUkUgICAgICgweDhVTCA8PCAwKQotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0FOWVRVTk5FTCAoMHhmZlVMIDw8IDApCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTk9OVFVOTkVMIDB4MFVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfVlhMQU4gICAgIDB4MVVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTlZHUkUgICAgIDB4MlVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTDJHUkUgICAgIDB4M1VMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBJUCAgICAgIDB4NFVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfR0VORVZFICAgIDB4NVVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfTVBMUyAgICAgIDB4NlVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfU1RUICAgICAgIDB4N1VMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfSVBHUkUgICAgIDB4OFVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfVFVOTkVMX1RZUEVfQU5ZVFVOTkVMIDB4ZmZVTAogCXU4IHByaV9oaW50OwotCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX05PX1BSRUZFUiAgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9BQk9WRQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9CRUxPVwkgICAoMHgyVUwgPDwgMCkKLQkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9ISUdIRVNUICAgICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfTE9XRVNUICAgICAgICgweDRVTCA8PCAwKQorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX05PX1BSRUZFUiAgICAweDBVTAorCSNkZWZpbmUgQ0ZBX05UVVBMRV9GSUxURVJfQUxMT0NfUkVRX1BSSV9ISU5UX0FCT1ZFCSAgIDB4MVVMCisJI2RlZmluZSBDRkFfTlRVUExFX0ZJTFRFUl9BTExPQ19SRVFfUFJJX0hJTlRfQkVMT1cJICAgMHgyVUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9ISUdIRVNUICAgICAgMHgzVUwKKwkjZGVmaW5lIENGQV9OVFVQTEVfRklMVEVSX0FMTE9DX1JFUV9QUklfSElOVF9MT1dFU1QgICAgICAgMHg0VUwKIAlfX2JlMzIgc3JjX2lwYWRkcls0XTsKIAlfX2JlMzIgc3JjX2lwYWRkcl9tYXNrWzRdOwogCV9fYmUzMiBkc3RfaXBhZGRyWzRdOwpAQCAtMzUxMSw4ICszNzEzLDggQEAKIAlfX2xlMTYgdGFyZ2V0X2lkOwogCV9fbGU2NCByZXNwX2FkZHI7CiAJdTggdHVubmVsX3R5cGU7Ci0JI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfUVVFUllfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOICAgICAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX1FVRVJZX1JFUV9UVU5ORUxfVFlQRV9HRU5FVkUgICAgICAoMHg1VUwgPDwgMCkKKwkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9RVUVSWV9SRVFfVFVOTkVMX1RZUEVfVlhMQU4gICAgICAgMHgxVUwKKwkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9RVUVSWV9SRVFfVFVOTkVMX1RZUEVfR0VORVZFICAgICAgMHg1VUwKIAl1OCB1bnVzZWRfMFs3XTsKIH07CiAKQEAgLTM1MzksOCArMzc0MSw4IEBACiAJX19sZTE2IHRhcmdldF9pZDsKIAlfX2xlNjQgcmVzcF9hZGRyOwogCXU4IHR1bm5lbF90eXBlOwotCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX0FMTE9DX1JFUV9UVU5ORUxfVFlQRV9WWExBTiAgICAgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIFRVTk5FTF9EU1RfUE9SVF9BTExPQ19SRVFfVFVOTkVMX1RZUEVfR0VORVZFICAgICAgKDB4NVVMIDw8IDApCisJI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOICAgICAgIDB4MVVMCisJI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfQUxMT0NfUkVRX1RVTk5FTF9UWVBFX0dFTkVWRSAgICAgIDB4NVVMCiAJdTggdW51c2VkXzA7CiAJX19iZTE2IHR1bm5lbF9kc3RfcG9ydF92YWw7CiAJX19sZTMyIHVudXNlZF8xOwpAQCAtMzU3MCw4ICszNzcyLDggQEAKIAlfX2xlMTYgdGFyZ2V0X2lkOwogCV9fbGU2NCByZXNwX2FkZHI7CiAJdTggdHVubmVsX3R5cGU7Ci0JI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfRlJFRV9SRVFfVFVOTkVMX1RZUEVfVlhMQU4JICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfRlJFRV9SRVFfVFVOTkVMX1RZUEVfR0VORVZFICAgICAgICgweDVVTCA8PCAwKQorCSNkZWZpbmUgVFVOTkVMX0RTVF9QT1JUX0ZSRUVfUkVRX1RVTk5FTF9UWVBFX1ZYTEFOCSAgIDB4MVVMCisJI2RlZmluZSBUVU5ORUxfRFNUX1BPUlRfRlJFRV9SRVFfVFVOTkVMX1RZUEVfR0VORVZFICAgICAgIDB4NVVMCiAJdTggdW51c2VkXzA7CiAJX19sZTE2IHR1bm5lbF9kc3RfcG9ydF9pZDsKIAlfX2xlMzIgdW51c2VkXzE7CkBAIC0zNzIwLDE1ICszOTIyLDE1IEBACiAJX19sZTE2IHRhcmdldF9pZDsKIAlfX2xlNjQgcmVzcF9hZGRyOwogCXU4IGVtYmVkZGVkX3Byb2NfdHlwZTsKLQkjZGVmaW5lIEZXX1JFU0VUX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfQk9PVAkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBGV19SRVNFVF9SRVFfRU1CRURERURfUFJPQ19UWVBFX01HTVQJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRldfUkVTRVRfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9ORVRDVFJMCSAgICgweDJVTCA8PCAwKQotCSNkZWZpbmUgRldfUkVTRVRfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9ST0NFCQkgICAoMHgzVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1JFU0VUX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfUlNWRAkJICAgKDB4NFVMIDw8IDApCisJI2RlZmluZSBGV19SRVNFVF9SRVFfRU1CRURERURfUFJPQ19UWVBFX0JPT1QJCSAgIDB4MFVMCisJI2RlZmluZSBGV19SRVNFVF9SRVFfRU1CRURERURfUFJPQ19UWVBFX01HTVQJCSAgIDB4MVVMCisJI2RlZmluZSBGV19SRVNFVF9SRVFfRU1CRURERURfUFJPQ19UWVBFX05FVENUUkwJICAgMHgyVUwKKwkjZGVmaW5lIEZXX1JFU0VUX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfUk9DRQkJICAgMHgzVUwKKwkjZGVmaW5lIEZXX1JFU0VUX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfUlNWRAkJICAgMHg0VUwKIAl1OCBzZWxmcnN0X3N0YXR1czsKLQkjZGVmaW5lIEZXX1JFU0VUX1JFUV9TRUxGUlNUX1NUQVRVU19TRUxGUlNUTk9ORQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1JFU0VUX1JFUV9TRUxGUlNUX1NUQVRVU19TRUxGUlNUQVNBUAkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1JFU0VUX1JFUV9TRUxGUlNUX1NUQVRVU19TRUxGUlNUUENJRVJTVAkgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIEZXX1JFU0VUX1JFUV9TRUxGUlNUX1NUQVRVU19TRUxGUlNUTk9ORQkgICAweDBVTAorCSNkZWZpbmUgRldfUkVTRVRfUkVRX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RBU0FQCSAgIDB4MVVMCisJI2RlZmluZSBGV19SRVNFVF9SRVFfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVFBDSUVSU1QJICAgMHgyVUwKIAlfX2xlMTYgdW51c2VkXzBbM107CiB9OwogCkBAIC0zNzM5LDkgKzM5NDEsOSBAQAogCV9fbGUxNiBzZXFfaWQ7CiAJX19sZTE2IHJlc3BfbGVuOwogCXU4IHNlbGZyc3Rfc3RhdHVzOwotCSNkZWZpbmUgRldfUkVTRVRfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUTk9ORQkgICAoMHgwVUwgPDwgMCkKLQkjZGVmaW5lIEZXX1JFU0VUX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVEFTQVAJICAgKDB4MVVMIDw8IDApCi0JI2RlZmluZSBGV19SRVNFVF9SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RQQ0lFUlNUICAgICAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgRldfUkVTRVRfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUTk9ORQkgICAweDBVTAorCSNkZWZpbmUgRldfUkVTRVRfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUQVNBUAkgICAweDFVTAorCSNkZWZpbmUgRldfUkVTRVRfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUUENJRVJTVCAgICAgICAweDJVTAogCXU4IHVudXNlZF8wOwogCV9fbGUxNiB1bnVzZWRfMTsKIAl1OCB1bnVzZWRfMjsKQEAgLTM3NTksMTEgKzM5NjEsMTEgQEAKIAlfX2xlMTYgdGFyZ2V0X2lkOwogCV9fbGU2NCByZXNwX2FkZHI7CiAJdTggZW1iZWRkZWRfcHJvY190eXBlOwotCSNkZWZpbmUgRldfUVNUQVRVU19SRVFfRU1CRURERURfUFJPQ19UWVBFX0JPT1QJCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRldfUVNUQVRVU19SRVFfRU1CRURERURfUFJPQ19UWVBFX01HTVQJCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRldfUVNUQVRVU19SRVFfRU1CRURERURfUFJPQ19UWVBFX05FVENUUkwJICAgKDB4MlVMIDw8IDApCi0JI2RlZmluZSBGV19RU1RBVFVTX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfUk9DRQkJICAgKDB4M1VMIDw8IDApCi0JI2RlZmluZSBGV19RU1RBVFVTX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfUlNWRAkJICAgKDB4NFVMIDw8IDApCisJI2RlZmluZSBGV19RU1RBVFVTX1JFUV9FTUJFRERFRF9QUk9DX1RZUEVfQk9PVAkJICAgMHgwVUwKKwkjZGVmaW5lIEZXX1FTVEFUVVNfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9NR01UCQkgICAweDFVTAorCSNkZWZpbmUgRldfUVNUQVRVU19SRVFfRU1CRURERURfUFJPQ19UWVBFX05FVENUUkwJICAgMHgyVUwKKwkjZGVmaW5lIEZXX1FTVEFUVVNfUkVRX0VNQkVEREVEX1BST0NfVFlQRV9ST0NFCQkgICAweDNVTAorCSNkZWZpbmUgRldfUVNUQVRVU19SRVFfRU1CRURERURfUFJPQ19UWVBFX1JTVkQJCSAgIDB4NFVMCiAJdTggdW51c2VkXzBbN107CiB9OwogCkBAIC0zNzc0LDkgKzM5NzYsOSBAQAogCV9fbGUxNiBzZXFfaWQ7CiAJX19sZTE2IHJlc3BfbGVuOwogCXU4IHNlbGZyc3Rfc3RhdHVzOwotCSNkZWZpbmUgRldfUVNUQVRVU19SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1ROT05FCSAgICgweDBVTCA8PCAwKQotCSNkZWZpbmUgRldfUVNUQVRVU19SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RBU0FQCSAgICgweDFVTCA8PCAwKQotCSNkZWZpbmUgRldfUVNUQVRVU19SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RQQ0lFUlNUICAgICAoMHgyVUwgPDwgMCkKKwkjZGVmaW5lIEZXX1FTVEFUVVNfUkVTUF9TRUxGUlNUX1NUQVRVU19TRUxGUlNUTk9ORQkgICAweDBVTAorCSNkZWZpbmUgRldfUVNUQVRVU19SRVNQX1NFTEZSU1RfU1RBVFVTX1NFTEZSU1RBU0FQCSAgIDB4MVVMCisJI2RlZmluZSBGV19RU1RBVFVTX1JFU1BfU0VMRlJTVF9TVEFUVVNfU0VMRlJTVFBDSUVSU1QgICAgIDB4MlVMCiAJdTggdW51c2VkXzA7CiAJX19sZTE2IHVudXNlZF8xOwogCXU4IHVudXNlZF8yOwpAQCAtMzc4NSw2ICszOTg3LDQyIEBACiAJdTggdmFsaWQ7CiB9OwogCisvKiBod3JtX2Z3X3NldF90aW1lICovCisvKiBJbnB1dCAoMzIgYnl0ZXMpICovCitzdHJ1Y3QgaHdybV9md19zZXRfdGltZV9pbnB1dCB7CisJX19sZTE2IHJlcV90eXBlOworCV9fbGUxNiBjbXBsX3Jpbmc7CisJX19sZTE2IHNlcV9pZDsKKwlfX2xlMTYgdGFyZ2V0X2lkOworCV9fbGU2NCByZXNwX2FkZHI7CisJX19sZTE2IHllYXI7CisJI2RlZmluZSBGV19TRVRfVElNRV9SRVFfWUVBUl9VTktOT1dOCQkJICAgMHgwVUwKKwl1OCBtb250aDsKKwl1OCBkYXk7CisJdTggaG91cjsKKwl1OCBtaW51dGU7CisJdTggc2Vjb25kOworCXU4IHVudXNlZF8wOworCV9fbGUxNiBtaWxsaXNlY29uZDsKKwlfX2xlMTYgem9uZTsKKwkjZGVmaW5lIEZXX1NFVF9USU1FX1JFUV9aT05FX1VUQwkJCSAgIDB4MFVMCisJI2RlZmluZSBGV19TRVRfVElNRV9SRVFfWk9ORV9VTktOT1dOCQkJICAgMHhmZmZmVUwKKwlfX2xlMzIgdW51c2VkXzE7Cit9OworCisvKiBPdXRwdXQgKDE2IGJ5dGVzKSAqLworc3RydWN0IGh3cm1fZndfc2V0X3RpbWVfb3V0cHV0IHsKKwlfX2xlMTYgZXJyb3JfY29kZTsKKwlfX2xlMTYgcmVxX3R5cGU7CisJX19sZTE2IHNlcV9pZDsKKwlfX2xlMTYgcmVzcF9sZW47CisJX19sZTMyIHVudXNlZF8wOworCXU4IHVudXNlZF8xOworCXU4IHVudXNlZF8yOworCXU4IHVudXNlZF8zOworCXU4IHZhbGlkOworfTsKKwogLyogaHdybV9leGVjX2Z3ZF9yZXNwICovCiAvKiBJbnB1dCAoMTI4IGJ5dGVzKSAqLwogc3RydWN0IGh3cm1fZXhlY19md2RfcmVzcF9pbnB1dCB7CkBAIC0zOTIxLDMyICs0MTU5LDYgQEAKIAl1OCB2YWxpZDsKIH07CiAKLS8qIGh3cm1fbnZtX3Jhd193cml0ZV9ibGsgKi8KLS8qIElucHV0ICgzMiBieXRlcykgKi8KLXN0cnVjdCBod3JtX252bV9yYXdfd3JpdGVfYmxrX2lucHV0IHsKLQlfX2xlMTYgcmVxX3R5cGU7Ci0JX19sZTE2IGNtcGxfcmluZzsKLQlfX2xlMTYgc2VxX2lkOwotCV9fbGUxNiB0YXJnZXRfaWQ7Ci0JX19sZTY0IHJlc3BfYWRkcjsKLQlfX2xlNjQgaG9zdF9zcmNfYWRkcjsKLQlfX2xlMzIgZGVzdF9hZGRyOwotCV9fbGUzMiBsZW47Ci19OwotCi0vKiBPdXRwdXQgKDE2IGJ5dGVzKSAqLwotc3RydWN0IGh3cm1fbnZtX3Jhd193cml0ZV9ibGtfb3V0cHV0IHsKLQlfX2xlMTYgZXJyb3JfY29kZTsKLQlfX2xlMTYgcmVxX3R5cGU7Ci0JX19sZTE2IHNlcV9pZDsKLQlfX2xlMTYgcmVzcF9sZW47Ci0JX19sZTMyIHVudXNlZF8wOwotCXU4IHVudXNlZF8xOwotCXU4IHVudXNlZF8yOwotCXU4IHVudXNlZF8zOwotCXU4IHZhbGlkOwotfTsKLQogLyogaHdybV9udm1fcmVhZCAqLwogLyogSW5wdXQgKDQwIGJ5dGVzKSAqLwogc3RydWN0IGh3cm1fbnZtX3JlYWRfaW5wdXQgewpAQCAtNDEzMiw5ICs0MzQ0LDkgQEAKIAl1OCBvcHRfb3JkaW5hbDsKIAkjZGVmaW5lIE5WTV9GSU5EX0RJUl9FTlRSWV9SRVFfT1BUX09SRElOQUxfTUFTSwkgICAgMHgzVUwKIAkjZGVmaW5lIE5WTV9GSU5EX0RJUl9FTlRSWV9SRVFfT1BUX09SRElOQUxfU0ZUCQkgICAgMAotCSNkZWZpbmUgTlZNX0ZJTkRfRElSX0VOVFJZX1JFUV9PUFRfT1JESU5BTF9FUQkJICAgKDB4MFVMIDw8IDApCi0JI2RlZmluZSBOVk1fRklORF9ESVJfRU5UUllfUkVRX09QVF9PUkRJTkFMX0dFCQkgICAoMHgxVUwgPDwgMCkKLQkjZGVmaW5lIE5WTV9GSU5EX0RJUl9FTlRSWV9SRVFfT1BUX09SRElOQUxfR1QJCSAgICgweDJVTCA8PCAwKQorCSNkZWZpbmUgTlZNX0ZJTkRfRElSX0VOVFJZX1JFUV9PUFRfT1JESU5BTF9FUQkJICAgMHgwVUwKKwkjZGVmaW5lIE5WTV9GSU5EX0RJUl9FTlRSWV9SRVFfT1BUX09SRElOQUxfR0UJCSAgIDB4MVVMCisJI2RlZmluZSBOVk1fRklORF9ESVJfRU5UUllfUkVRX09QVF9PUkRJTkFMX0dUCQkgICAweDJVTAogCXU4IHVudXNlZF8xWzNdOwogfTsKIApAQCAtNDI2Niw0ICs0NDc4LDQxIEBACiAJdTggdmFsaWQ7CiB9OwogCisvKiBod3JtX252bV9pbnN0YWxsX3VwZGF0ZSAqLworLyogSW5wdXQgKDI0IGJ5dGVzKSAqLworc3RydWN0IGh3cm1fbnZtX2luc3RhbGxfdXBkYXRlX2lucHV0IHsKKwlfX2xlMTYgcmVxX3R5cGU7CisJX19sZTE2IGNtcGxfcmluZzsKKwlfX2xlMTYgc2VxX2lkOworCV9fbGUxNiB0YXJnZXRfaWQ7CisJX19sZTY0IHJlc3BfYWRkcjsKKwlfX2xlMzIgaW5zdGFsbF90eXBlOworCSNkZWZpbmUgTlZNX0lOU1RBTExfVVBEQVRFX1JFUV9JTlNUQUxMX1RZUEVfTk9STUFMCSAgIDB4MFVMCisJI2RlZmluZSBOVk1fSU5TVEFMTF9VUERBVEVfUkVRX0lOU1RBTExfVFlQRV9BTEwJICAgMHhmZmZmZmZmZlVMCisJX19sZTMyIHVudXNlZF8wOworfTsKKworLyogT3V0cHV0ICgyNCBieXRlcykgKi8KK3N0cnVjdCBod3JtX252bV9pbnN0YWxsX3VwZGF0ZV9vdXRwdXQgeworCV9fbGUxNiBlcnJvcl9jb2RlOworCV9fbGUxNiByZXFfdHlwZTsKKwlfX2xlMTYgc2VxX2lkOworCV9fbGUxNiByZXNwX2xlbjsKKwlfX2xlNjQgaW5zdGFsbGVkX2l0ZW1zOworCXU4IHJlc3VsdDsKKwkjZGVmaW5lIE5WTV9JTlNUQUxMX1VQREFURV9SRVNQX1JFU1VMVF9TVUNDRVNTCQkgICAweDBVTAorCXU4IHByb2JsZW1faXRlbTsKKwkjZGVmaW5lIE5WTV9JTlNUQUxMX1VQREFURV9SRVNQX1BST0JMRU1fSVRFTV9OT05FCSAgIDB4MFVMCisJI2RlZmluZSBOVk1fSU5TVEFMTF9VUERBVEVfUkVTUF9QUk9CTEVNX0lURU1fUEFDS0FHRSAgICAgIDB4ZmZVTAorCXU4IHJlc2V0X3JlcXVpcmVkOworCSNkZWZpbmUgTlZNX0lOU1RBTExfVVBEQVRFX1JFU1BfUkVTRVRfUkVRVUlSRURfTk9ORSAgICAgICAweDBVTAorCSNkZWZpbmUgTlZNX0lOU1RBTExfVVBEQVRFX1JFU1BfUkVTRVRfUkVRVUlSRURfUENJCSAgIDB4MVVMCisJI2RlZmluZSBOVk1fSU5TVEFMTF9VUERBVEVfUkVTUF9SRVNFVF9SRVFVSVJFRF9QT1dFUiAgICAgIDB4MlVMCisJdTggdW51c2VkXzA7CisJdTggdW51c2VkXzE7CisJdTggdW51c2VkXzI7CisJdTggdW51c2VkXzM7CisJdTggdmFsaWQ7Cit9OworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmMKaW5kZXggNTBkMjAwNy4uZWM2Y2QxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54dC9ibnh0X3NyaW92LmMKQEAgLTE5LDYgKzE5LDQ1IEBACiAjaW5jbHVkZSAiYm54dF9ldGh0b29sLmgiCiAKICNpZmRlZiBDT05GSUdfQk5YVF9TUklPVgorc3RhdGljIGludCBibnh0X2h3cm1fZndkX2FzeW5jX2V2ZW50X2NtcGwoc3RydWN0IGJueHQgKmJwLAorCQkJCQkgIHN0cnVjdCBibnh0X3ZmX2luZm8gKnZmLCB1MTYgZXZlbnRfaWQpCit7CisJc3RydWN0IGh3cm1fZndkX2FzeW5jX2V2ZW50X2NtcGxfb3V0cHV0ICpyZXNwID0gYnAtPmh3cm1fY21kX3Jlc3BfYWRkcjsKKwlzdHJ1Y3QgaHdybV9md2RfYXN5bmNfZXZlbnRfY21wbF9pbnB1dCByZXEgPSB7MH07CisJc3RydWN0IGh3cm1fYXN5bmNfZXZlbnRfY21wbCAqYXN5bmNfY21wbDsKKwlpbnQgcmMgPSAwOworCisJYm54dF9od3JtX2NtZF9oZHJfaW5pdChicCwgJnJlcSwgSFdSTV9GV0RfQVNZTkNfRVZFTlRfQ01QTCwgLTEsIC0xKTsKKwlpZiAodmYpCisJCXJlcS5lbmNhcF9hc3luY19ldmVudF90YXJnZXRfaWQgPSBjcHVfdG9fbGUxNih2Zi0+ZndfZmlkKTsKKwllbHNlCisJCS8qIGJyb2FkY2FzdCB0aGlzIGFzeW5jIGV2ZW50IHRvIGFsbCBWRnMgKi8KKwkJcmVxLmVuY2FwX2FzeW5jX2V2ZW50X3RhcmdldF9pZCA9IGNwdV90b19sZTE2KDB4ZmZmZik7CisJYXN5bmNfY21wbCA9IChzdHJ1Y3QgaHdybV9hc3luY19ldmVudF9jbXBsICopcmVxLmVuY2FwX2FzeW5jX2V2ZW50X2NtcGw7CisJYXN5bmNfY21wbC0+dHlwZSA9CisJCWNwdV90b19sZTE2KEhXUk1fQVNZTkNfRVZFTlRfQ01QTF9UWVBFX0hXUk1fQVNZTkNfRVZFTlQpOworCWFzeW5jX2NtcGwtPmV2ZW50X2lkID0gY3B1X3RvX2xlMTYoZXZlbnRfaWQpOworCisJbXV0ZXhfbG9jaygmYnAtPmh3cm1fY21kX2xvY2spOworCXJjID0gX2h3cm1fc2VuZF9tZXNzYWdlKGJwLCAmcmVxLCBzaXplb2YocmVxKSwgSFdSTV9DTURfVElNRU9VVCk7CisKKwlpZiAocmMpIHsKKwkJbmV0ZGV2X2VycihicC0+ZGV2LCAiaHdybV9md2RfYXN5bmNfZXZlbnRfY21wbCBmYWlsZWQuIHJjOiVkXG4iLAorCQkJICAgcmMpOworCQlnb3RvIGZ3ZF9hc3luY19ldmVudF9jbXBsX2V4aXQ7CisJfQorCisJaWYgKHJlc3AtPmVycm9yX2NvZGUpIHsKKwkJbmV0ZGV2X2VycihicC0+ZGV2LCAiaHdybV9md2RfYXN5bmNfZXZlbnRfY21wbCBlcnJvciAlZFxuIiwKKwkJCSAgIHJlc3AtPmVycm9yX2NvZGUpOworCQlyYyA9IC0xOworCX0KKworZndkX2FzeW5jX2V2ZW50X2NtcGxfZXhpdDoKKwltdXRleF91bmxvY2soJmJwLT5od3JtX2NtZF9sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbnQgYm54dF92Zl9uZG9fcHJlcChzdHJ1Y3QgYm54dCAqYnAsIGludCB2Zl9pZCkKIHsKIAlpZiAoIXRlc3RfYml0KEJOWFRfU1RBVEVfT1BFTiwgJmJwLT5zdGF0ZSkpIHsKQEAgLTEzNSw3ICsxNzQsOCBAQAogCXJldHVybiBod3JtX3NlbmRfbWVzc2FnZShicCwgJnJlcSwgc2l6ZW9mKHJlcSksIEhXUk1fQ01EX1RJTUVPVVQpOwogfQogCi1pbnQgYm54dF9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmZfaWQsIHUxNiB2bGFuX2lkLCB1OCBxb3MpCitpbnQgYm54dF9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmZfaWQsIHUxNiB2bGFuX2lkLCB1OCBxb3MsCisJCSAgICAgX19iZTE2IHZsYW5fcHJvdG8pCiB7CiAJc3RydWN0IGh3cm1fZnVuY19jZmdfaW5wdXQgcmVxID0gezB9OwogCXN0cnVjdCBibnh0ICpicCA9IG5ldGRldl9wcml2KGRldik7CkBAIC0xNDYsNiArMTg2LDkgQEAKIAlpZiAoYnAtPmh3cm1fc3BlY19jb2RlIDwgMHgxMDIwMSkKIAkJcmV0dXJuIC1FTk9UU1VQUDsKIAorCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKIAlyYyA9IGJueHRfdmZfbmRvX3ByZXAoYnAsIHZmX2lkKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKQEAgLTI0Myw4ICsyODYsOSBAQAogCQlyYyA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KLQkvKiBDSElNUCBUT0RPOiBzZW5kIG1zZyB0byBWRiB0byB1cGRhdGUgbmV3IGxpbmsgc3RhdGUgKi8KLQorCWlmICh2Zi0+ZmxhZ3MgJiAoQk5YVF9WRl9MSU5LX1VQIHwgQk5YVF9WRl9MSU5LX0ZPUkNFRCkpCisJCXJjID0gYm54dF9od3JtX2Z3ZF9hc3luY19ldmVudF9jbXBsKGJwLCB2ZiwKKwkJCUhXUk1fQVNZTkNfRVZFTlRfQ01QTF9FVkVOVF9JRF9MSU5LX1NUQVRVU19DSEFOR0UpOwogCXJldHVybiByYzsKIH0KIApAQCAtNTI1LDQ2ICs1NjksNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBibnh0X2h3cm1fZndkX2FzeW5jX2V2ZW50X2NtcGwoc3RydWN0IGJueHQgKmJwLAotCQkJCQkgIHN0cnVjdCBibnh0X3ZmX2luZm8gKnZmLAotCQkJCQkgIHUxNiBldmVudF9pZCkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBod3JtX2Z3ZF9hc3luY19ldmVudF9jbXBsX2lucHV0IHJlcSA9IHswfTsKLQlzdHJ1Y3QgaHdybV9md2RfYXN5bmNfZXZlbnRfY21wbF9vdXRwdXQgKnJlc3AgPSBicC0+aHdybV9jbWRfcmVzcF9hZGRyOwotCXN0cnVjdCBod3JtX2FzeW5jX2V2ZW50X2NtcGwgKmFzeW5jX2NtcGw7Ci0KLQlibnh0X2h3cm1fY21kX2hkcl9pbml0KGJwLCAmcmVxLCBIV1JNX0ZXRF9BU1lOQ19FVkVOVF9DTVBMLCAtMSwgLTEpOwotCWlmICh2ZikKLQkJcmVxLmVuY2FwX2FzeW5jX2V2ZW50X3RhcmdldF9pZCA9IGNwdV90b19sZTE2KHZmLT5md19maWQpOwotCWVsc2UKLQkJLyogYnJvYWRjYXN0IHRoaXMgYXN5bmMgZXZlbnQgdG8gYWxsIFZGcyAqLwotCQlyZXEuZW5jYXBfYXN5bmNfZXZlbnRfdGFyZ2V0X2lkID0gY3B1X3RvX2xlMTYoMHhmZmZmKTsKLQlhc3luY19jbXBsID0gKHN0cnVjdCBod3JtX2FzeW5jX2V2ZW50X2NtcGwgKilyZXEuZW5jYXBfYXN5bmNfZXZlbnRfY21wbDsKLQlhc3luY19jbXBsLT50eXBlID0KLQkJY3B1X3RvX2xlMTYoSFdSTV9BU1lOQ19FVkVOVF9DTVBMX1RZUEVfSFdSTV9BU1lOQ19FVkVOVCk7Ci0JYXN5bmNfY21wbC0+ZXZlbnRfaWQgPSBjcHVfdG9fbGUxNihldmVudF9pZCk7Ci0KLQltdXRleF9sb2NrKCZicC0+aHdybV9jbWRfbG9jayk7Ci0JcmMgPSBfaHdybV9zZW5kX21lc3NhZ2UoYnAsICZyZXEsIHNpemVvZihyZXEpLCBIV1JNX0NNRF9USU1FT1VUKTsKLQotCWlmIChyYykgewotCQluZXRkZXZfZXJyKGJwLT5kZXYsICJod3JtX2Z3ZF9hc3luY19ldmVudF9jbXBsIGZhaWxlZC4gcmM6JWRcbiIsCi0JCQkgICByYyk7Ci0JCWdvdG8gZndkX2FzeW5jX2V2ZW50X2NtcGxfZXhpdDsKLQl9Ci0KLQlpZiAocmVzcC0+ZXJyb3JfY29kZSkgewotCQluZXRkZXZfZXJyKGJwLT5kZXYsICJod3JtX2Z3ZF9hc3luY19ldmVudF9jbXBsIGVycm9yICVkXG4iLAotCQkJICAgcmVzcC0+ZXJyb3JfY29kZSk7Ci0JCXJjID0gLTE7Ci0JfQotCi1md2RfYXN5bmNfZXZlbnRfY21wbF9leGl0OgotCW11dGV4X3VubG9jaygmYnAtPmh3cm1fY21kX2xvY2spOwotCXJldHVybiByYzsKLX0KLQogdm9pZCBibnh0X3NyaW92X2Rpc2FibGUoc3RydWN0IGJueHQgKmJwKQogewogCXUxNiBudW1fdmZzID0gcGNpX251bV92ZihicC0+cGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibnh0L2JueHRfc3Jpb3YuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5oCmluZGV4IDAzOTI2NzAuLjFhYjcyZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueHQvYm54dF9zcmlvdi5oCkBAIC0xMiw3ICsxMiw3IEBACiAKIGludCBibnh0X2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCBzdHJ1Y3QgaWZsYV92Zl9pbmZvICopOwogaW50IGJueHRfc2V0X3ZmX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIHU4ICopOwotaW50IGJueHRfc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50LCB1MTYsIHU4KTsKK2ludCBibnh0X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgdTE2LCB1OCwgX19iZTE2KTsKIGludCBibnh0X3NldF92Zl9idyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIGludCwgaW50KTsKIGludCBibnh0X3NldF92Zl9saW5rX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgaW50KTsKIGludCBibnh0X3NldF92Zl9zcG9vZmNoayhzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIGJvb2wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtZ2VuZXQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmMKaW5kZXggOGQ0Zjg0OS4uNDQ2NGJjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtZ2VuZXQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21nZW5ldC5jCkBAIC00NTAsMjggKzQ1MCwzMiBAQAogCQkJZ2VuZXRfZG1hX3JpbmdfcmVnc1tyXSk7CiB9CiAKLXN0YXRpYyBpbnQgYmNtZ2VuZXRfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBiY21nZW5ldF9nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKKwlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKIAlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIWRldi0+cGh5ZGV2KQorCWlmICghcHJpdi0+cGh5ZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KGRldi0+cGh5ZGV2LCBjbWQpOworCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3NfZ2V0KHByaXYtPnBoeWRldiwgY21kKTsKIH0KIAotc3RhdGljIGludCBiY21nZW5ldF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IGJjbWdlbmV0X3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogeworCXN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghZGV2LT5waHlkZXYpCisJaWYgKCFwcml2LT5waHlkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQoZGV2LT5waHlkZXYsIGNtZCk7CisJcmV0dXJuIHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQocHJpdi0+cGh5ZGV2LCBjbWQpOwogfQogCiBzdGF0aWMgaW50IGJjbWdlbmV0X3NldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC05MzcsNyArOTQxLDcgQEAKIAllLT5lZWVfYWN0aXZlID0gcC0+ZWVlX2FjdGl2ZTsKIAllLT50eF9scGlfdGltZXIgPSBiY21nZW5ldF91bWFjX3JlYWRsKHByaXYsIFVNQUNfRUVFX0xQSV9USU1FUik7CiAKLQlyZXR1cm4gcGh5X2V0aHRvb2xfZ2V0X2VlZShkZXYtPnBoeWRldiwgZSk7CisJcmV0dXJuIHBoeV9ldGh0b29sX2dldF9lZWUocHJpdi0+cGh5ZGV2LCBlKTsKIH0KIAogc3RhdGljIGludCBiY21nZW5ldF9zZXRfZWVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2VlZSAqZSkKQEAgLTk1NCw3ICs5NTgsNyBAQAogCWlmICghcC0+ZWVlX2VuYWJsZWQpIHsKIAkJYmNtZ2VuZXRfZWVlX2VuYWJsZV9zZXQoZGV2LCBmYWxzZSk7CiAJfSBlbHNlIHsKLQkJcmV0ID0gcGh5X2luaXRfZWVlKGRldi0+cGh5ZGV2LCAwKTsKKwkJcmV0ID0gcGh5X2luaXRfZWVlKHByaXYtPnBoeWRldiwgMCk7CiAJCWlmIChyZXQpIHsKIAkJCW5ldGlmX2Vycihwcml2LCBodywgZGV2LCAiRUVFIGluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gcmV0OwpAQCAtOTY0LDIxICs5NjgsMjEgQEAKIAkJYmNtZ2VuZXRfZWVlX2VuYWJsZV9zZXQoZGV2LCB0cnVlKTsKIAl9CiAKLQlyZXR1cm4gcGh5X2V0aHRvb2xfc2V0X2VlZShkZXYtPnBoeWRldiwgZSk7CisJcmV0dXJuIHBoeV9ldGh0b29sX3NldF9lZWUocHJpdi0+cGh5ZGV2LCBlKTsKIH0KIAogc3RhdGljIGludCBiY21nZW5ldF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIGdlbnBoeV9yZXN0YXJ0X2FuZWcoZGV2LT5waHlkZXYpOworCXN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiBnZW5waHlfcmVzdGFydF9hbmVnKHByaXYtPnBoeWRldik7CiB9CiAKIC8qIHN0YW5kYXJkIGV0aHRvb2wgc3VwcG9ydCBmdW5jdGlvbnMuICovCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGJjbWdlbmV0X2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBiY21nZW5ldF9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3N0cmluZ3MJCT0gYmNtZ2VuZXRfZ2V0X3N0cmluZ3MsCiAJLmdldF9zc2V0X2NvdW50CQk9IGJjbWdlbmV0X2dldF9zc2V0X2NvdW50LAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IGJjbWdlbmV0X2dldF9ldGh0b29sX3N0YXRzLAotCS5nZXRfc2V0dGluZ3MJCT0gYmNtZ2VuZXRfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJCT0gYmNtZ2VuZXRfc2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbwkJPSBiY21nZW5ldF9nZXRfZHJ2aW5mbywKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X21zZ2xldmVsCQk9IGJjbWdlbmV0X2dldF9tc2dsZXZlbCwKQEAgLTk5MCwxOSArOTk0LDIwIEBACiAJLm53YXlfcmVzZXQJCT0gYmNtZ2VuZXRfbndheV9yZXNldCwKIAkuZ2V0X2NvYWxlc2NlCQk9IGJjbWdlbmV0X2dldF9jb2FsZXNjZSwKIAkuc2V0X2NvYWxlc2NlCQk9IGJjbWdlbmV0X3NldF9jb2FsZXNjZSwKKwkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gYmNtZ2VuZXRfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MJPSBiY21nZW5ldF9zZXRfbGlua19rc2V0dGluZ3MsCiB9OwogCiAvKiBQb3dlciBkb3duIHRoZSB1bmltYWMsIGJhc2VkIG9uIG1vZGUuICovCiBzdGF0aWMgaW50IGJjbWdlbmV0X3Bvd2VyX2Rvd24oc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsCiAJCQkJZW51bSBiY21nZW5ldF9wb3dlcl9tb2RlIG1vZGUpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcml2LT5kZXY7CiAJaW50IHJldCA9IDA7CiAJdTMyIHJlZzsKIAogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgR0VORVRfUE9XRVJfQ0FCTEVfU0VOU0U6Ci0JCXBoeV9kZXRhY2gobmRldi0+cGh5ZGV2KTsKKwkJcGh5X2RldGFjaChwcml2LT5waHlkZXYpOwogCQlicmVhazsKIAogCWNhc2UgR0VORVRfUE9XRVJfV09MX01BR0lDOgpAQCAtMTA2Myw2ICsxMDY4LDcgQEAKIC8qIGlvY3RsIGhhbmRsZSBzcGVjaWFsIGNvbW1hbmRzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIGV0aHRvb2wuICovCiBzdGF0aWMgaW50IGJjbWdlbmV0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCiB7CisJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCB2YWwgPSAwOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCkBAIC0xMDcyLDEwICsxMDc4LDEwIEBACiAJY2FzZSBTSU9DR01JSVBIWToKIAljYXNlIFNJT0NHTUlJUkVHOgogCWNhc2UgU0lPQ1NNSUlSRUc6Ci0JCWlmICghZGV2LT5waHlkZXYpCisJCWlmICghcHJpdi0+cGh5ZGV2KQogCQkJdmFsID0gLUVOT0RFVjsKIAkJZWxzZQotCQkJdmFsID0gcGh5X21paV9pb2N0bChkZXYtPnBoeWRldiwgcnEsIGNtZCk7CisJCQl2YWwgPSBwaHlfbWlpX2lvY3RsKHByaXYtPnBoeWRldiwgcnEsIGNtZCk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTI0NTgsNyArMjQ2NCw2IEBACiB7CiAJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoCiAJCQl3b3JrLCBzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiwgYmNtZ2VuZXRfaXJxX3dvcmspOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHJpdi0+ZGV2OwogCiAJbmV0aWZfZGJnKHByaXYsIGludHIsIHByaXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKQEAgLTI0NzEsNyArMjQ3Niw3IEBACiAKIAkvKiBMaW5rIFVQL0RPV04gZXZlbnQgKi8KIAlpZiAocHJpdi0+aXJxMF9zdGF0ICYgVU1BQ19JUlFfTElOS19FVkVOVCkgewotCQlwaHlfbWFjX2ludGVycnVwdChuZGV2LT5waHlkZXYsCisJCXBoeV9tYWNfaW50ZXJydXB0KHByaXYtPnBoeWRldiwKIAkJCQkgICEhKHByaXYtPmlycTBfc3RhdCAmIFVNQUNfSVJRX0xJTktfVVApKTsKIAkJcHJpdi0+aXJxMF9zdGF0ICY9IH5VTUFDX0lSUV9MSU5LX0VWRU5UOwogCX0KQEAgLTI2NjQsMTI4ICsyNjY5LDYgQEAKIAliY21nZW5ldF90ZG1hX3dyaXRlbChwcml2LCByZWcsIERNQV9DVFJMKTsKIH0KIAotc3RhdGljIGJvb2wgYmNtZ2VuZXRfaGZiX2lzX2ZpbHRlcl9lbmFibGVkKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAotCQkJCQkgICB1MzIgZl9pbmRleCkKLXsKLQl1MzIgb2Zmc2V0OwotCXUzMiByZWc7Ci0KLQlvZmZzZXQgPSBIRkJfRkxUX0VOQUJMRV9WM1BMVVMgKyAoZl9pbmRleCA8IDMyKSAqIHNpemVvZih1MzIpOwotCXJlZyA9IGJjbWdlbmV0X2hmYl9yZWdfcmVhZGwocHJpdiwgb2Zmc2V0KTsKLQlyZXR1cm4gISEocmVnICYgKDEgPDwgKGZfaW5kZXggJSAzMikpKTsKLX0KLQotc3RhdGljIHZvaWQgYmNtZ2VuZXRfaGZiX2VuYWJsZV9maWx0ZXIoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsIHUzMiBmX2luZGV4KQotewotCXUzMiBvZmZzZXQ7Ci0JdTMyIHJlZzsKLQotCW9mZnNldCA9IEhGQl9GTFRfRU5BQkxFX1YzUExVUyArIChmX2luZGV4IDwgMzIpICogc2l6ZW9mKHUzMik7Ci0JcmVnID0gYmNtZ2VuZXRfaGZiX3JlZ19yZWFkbChwcml2LCBvZmZzZXQpOwotCXJlZyB8PSAoMSA8PCAoZl9pbmRleCAlIDMyKSk7Ci0JYmNtZ2VuZXRfaGZiX3JlZ193cml0ZWwocHJpdiwgcmVnLCBvZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBiY21nZW5ldF9oZmJfc2V0X2ZpbHRlcl9yeF9xdWV1ZV9tYXBwaW5nKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAotCQkJCQkJICAgICB1MzIgZl9pbmRleCwgdTMyIHJ4X3F1ZXVlKQotewotCXUzMiBvZmZzZXQ7Ci0JdTMyIHJlZzsKLQotCW9mZnNldCA9IGZfaW5kZXggLyA4OwotCXJlZyA9IGJjbWdlbmV0X3JkbWFfcmVhZGwocHJpdiwgRE1BX0lOREVYMlJJTkdfMCArIG9mZnNldCk7Ci0JcmVnICY9IH4oMHhGIDw8ICg0ICogKGZfaW5kZXggJSA4KSkpOwotCXJlZyB8PSAoKHJ4X3F1ZXVlICYgMHhGKSA8PCAoNCAqIChmX2luZGV4ICUgOCkpKTsKLQliY21nZW5ldF9yZG1hX3dyaXRlbChwcml2LCByZWcsIERNQV9JTkRFWDJSSU5HXzAgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgdm9pZCBiY21nZW5ldF9oZmJfc2V0X2ZpbHRlcl9sZW5ndGgoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsCi0JCQkJCSAgIHUzMiBmX2luZGV4LCB1MzIgZl9sZW5ndGgpCi17Ci0JdTMyIG9mZnNldDsKLQl1MzIgcmVnOwotCi0Jb2Zmc2V0ID0gSEZCX0ZMVF9MRU5fVjNQTFVTICsKLQkJICgocHJpdi0+aHdfcGFyYW1zLT5oZmJfZmlsdGVyX2NudCAtIDEgLSBmX2luZGV4KSAvIDQpICoKLQkJIHNpemVvZih1MzIpOwotCXJlZyA9IGJjbWdlbmV0X2hmYl9yZWdfcmVhZGwocHJpdiwgb2Zmc2V0KTsKLQlyZWcgJj0gfigweEZGIDw8ICg4ICogKGZfaW5kZXggJSA0KSkpOwotCXJlZyB8PSAoKGZfbGVuZ3RoICYgMHhGRikgPDwgKDggKiAoZl9pbmRleCAlIDQpKSk7Ci0JYmNtZ2VuZXRfaGZiX3JlZ193cml0ZWwocHJpdiwgcmVnLCBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW50IGJjbWdlbmV0X2hmYl9maW5kX3VudXNlZF9maWx0ZXIoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYpCi17Ci0JdTMyIGZfaW5kZXg7Ci0KLQlmb3IgKGZfaW5kZXggPSAwOyBmX2luZGV4IDwgcHJpdi0+aHdfcGFyYW1zLT5oZmJfZmlsdGVyX2NudDsgZl9pbmRleCsrKQotCQlpZiAoIWJjbWdlbmV0X2hmYl9pc19maWx0ZXJfZW5hYmxlZChwcml2LCBmX2luZGV4KSkKLQkJCXJldHVybiBmX2luZGV4OwotCi0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLS8qIGJjbWdlbmV0X2hmYl9hZGRfZmlsdGVyCi0gKgotICogQWRkIG5ldyBmaWx0ZXIgdG8gSGFyZHdhcmUgRmlsdGVyIEJsb2NrIHRvIG1hdGNoIGFuZCBkaXJlY3QgUnggdHJhZmZpYyB0bwotICogZGVzaXJlZCBSeCBxdWV1ZS4KLSAqCi0gKiBmX2RhdGEgaXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgMzItYml0IGludGVnZXJzIHdoZXJlIGVhY2ggMzItYml0IGludGVnZXIKLSAqIHByb3ZpZGVzIGZpbHRlciBkYXRhIGZvciAyIGJ5dGVzICg0IG5pYmJsZXMpIG9mIFJ4IGZyYW1lOgotICoKLSAqIGJpdHMgMzE6MjAgLSB1bnVzZWQKLSAqIGJpdCAgMTkgICAgLSBuaWJibGUgMCBtYXRjaCBlbmFibGUKLSAqIGJpdCAgMTggICAgLSBuaWJibGUgMSBtYXRjaCBlbmFibGUKLSAqIGJpdCAgMTcgICAgLSBuaWJibGUgMiBtYXRjaCBlbmFibGUKLSAqIGJpdCAgMTYgICAgLSBuaWJibGUgMyBtYXRjaCBlbmFibGUKLSAqIGJpdHMgMTU6MTIgLSBuaWJibGUgMCBkYXRhCi0gKiBiaXRzIDExOjggIC0gbmliYmxlIDEgZGF0YQotICogYml0cyA3OjQgICAtIG5pYmJsZSAyIGRhdGEKLSAqIGJpdHMgMzowICAgLSBuaWJibGUgMyBkYXRhCi0gKgotICogRXhhbXBsZToKLSAqIEluIG9yZGVyIHRvIG1hdGNoOgotICogLSBFdGhlcm5ldCBmcmFtZSB0eXBlID0gMHgwODAwIChJUCkKLSAqIC0gSVAgdmVyc2lvbiBmaWVsZCA9IDQKLSAqIC0gSVAgcHJvdG9jb2wgZmllbGQgPSAweDExIChVRFApCi0gKgotICogVGhlIGZvbGxvd2luZyBmaWx0ZXIgaXMgbmVlZGVkOgotICogdTMyIGhmYl9maWx0ZXJfaXB2NF91ZHBbXSA9IHsKLSAqICAgUnggZnJhbWUgb2Zmc2V0IDB4MDA6IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0gKiAgIFJ4IGZyYW1lIG9mZnNldCAweDA4OiAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMEYwODAwLCAweDAwMDg0MDAwLAotICogICBSeCBmcmFtZSBvZmZzZXQgMHgxMDogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzMDAxMSwKLSAqIH07Ci0gKgotICogVG8gYWRkIHRoZSBmaWx0ZXIgdG8gSEZCIGFuZCBkaXJlY3QgdGhlIHRyYWZmaWMgdG8gUnggcXVldWUgMCwgY2FsbDoKLSAqIGJjbWdlbmV0X2hmYl9hZGRfZmlsdGVyKHByaXYsIGhmYl9maWx0ZXJfaXB2NF91ZHAsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKGhmYl9maWx0ZXJfaXB2NF91ZHApLCAwKTsKLSAqLwotaW50IGJjbWdlbmV0X2hmYl9hZGRfZmlsdGVyKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LCB1MzIgKmZfZGF0YSwKLQkJCSAgICB1MzIgZl9sZW5ndGgsIHUzMiByeF9xdWV1ZSkKLXsKLQlpbnQgZl9pbmRleDsKLQl1MzIgaTsKLQotCWZfaW5kZXggPSBiY21nZW5ldF9oZmJfZmluZF91bnVzZWRfZmlsdGVyKHByaXYpOwotCWlmIChmX2luZGV4IDwgMCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoZl9sZW5ndGggPiBwcml2LT5od19wYXJhbXMtPmhmYl9maWx0ZXJfc2l6ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZl9sZW5ndGg7IGkrKykKLQkJYmNtZ2VuZXRfaGZiX3dyaXRlbChwcml2LCBmX2RhdGFbaV0sCi0JCQkoZl9pbmRleCAqIHByaXYtPmh3X3BhcmFtcy0+aGZiX2ZpbHRlcl9zaXplICsgaSkgKgotCQkJc2l6ZW9mKHUzMikpOwotCi0JYmNtZ2VuZXRfaGZiX3NldF9maWx0ZXJfbGVuZ3RoKHByaXYsIGZfaW5kZXgsIDIgKiBmX2xlbmd0aCk7Ci0JYmNtZ2VuZXRfaGZiX3NldF9maWx0ZXJfcnhfcXVldWVfbWFwcGluZyhwcml2LCBmX2luZGV4LCByeF9xdWV1ZSk7Ci0JYmNtZ2VuZXRfaGZiX2VuYWJsZV9maWx0ZXIocHJpdiwgZl9pbmRleCk7Ci0JYmNtZ2VuZXRfaGZiX3JlZ193cml0ZWwocHJpdiwgMHgxLCBIRkJfQ1RSTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogYmNtZ2VuZXRfaGZiX2NsZWFyCiAgKgogICogQ2xlYXIgSGFyZHdhcmUgRmlsdGVyIEJsb2NrIGFuZCBkaXNhYmxlIGFsbCBmaWx0ZXJpbmcuCkBAIC0yODMzLDcgKzI3MTYsNyBAQAogCS8qIE1vbml0b3IgbGluayBpbnRlcnJ1cHRzIG5vdyAqLwogCWJjbWdlbmV0X2xpbmtfaW50cl9lbmFibGUocHJpdik7CiAKLQlwaHlfc3RhcnQoZGV2LT5waHlkZXYpOworCXBoeV9zdGFydChwcml2LT5waHlkZXYpOwogfQogCiBzdGF0aWMgaW50IGJjbWdlbmV0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTI5MzIsNyArMjgxNSw3IEBACiAJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKGRldik7Ci0JcGh5X3N0b3AoZGV2LT5waHlkZXYpOworCXBoeV9zdG9wKHByaXYtPnBoeWRldik7CiAJYmNtZ2VuZXRfaW50cl9kaXNhYmxlKHByaXYpOwogCWJjbWdlbmV0X2Rpc2FibGVfcnhfbmFwaShwcml2KTsKIAliY21nZW5ldF9kaXNhYmxlX3R4X25hcGkocHJpdik7CkBAIC0yOTU4LDcgKzI4NDEsNyBAQAogCWJjbWdlbmV0X25ldGlmX3N0b3AoZGV2KTsKIAogCS8qIFJlYWxseSBraWxsIHRoZSBQSFkgc3RhdGUgbWFjaGluZSBhbmQgZGlzY29ubmVjdCBmcm9tIGl0ICovCi0JcGh5X2Rpc2Nvbm5lY3QoZGV2LT5waHlkZXYpOworCXBoeV9kaXNjb25uZWN0KHByaXYtPnBoeWRldik7CiAKIAkvKiBEaXNhYmxlIE1BQyByZWNlaXZlICovCiAJdW1hY19lbmFibGVfc2V0KHByaXYsIENNRF9SWF9FTiwgZmFsc2UpOwpAQCAtMzUxNyw3ICszNDAwLDcgQEAKIAogCWJjbWdlbmV0X25ldGlmX3N0b3AoZGV2KTsKIAotCXBoeV9zdXNwZW5kKGRldi0+cGh5ZGV2KTsKKwlwaHlfc3VzcGVuZChwcml2LT5waHlkZXYpOwogCiAJbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOwogCkBAIC0zNTgxLDcgKzM0NjQsNyBAQAogCWlmIChwcml2LT53b2xvcHRzKQogCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrX3dvbCk7CiAKLQlwaHlfaW5pdF9odyhkZXYtPnBoeWRldik7CisJcGh5X2luaXRfaHcocHJpdi0+cGh5ZGV2KTsKIAkvKiBTcGVlZCBzZXR0aW5ncyBtdXN0IGJlIHJlc3RvcmVkICovCiAJYmNtZ2VuZXRfbWlpX2NvbmZpZyhwcml2LT5kZXYpOwogCkBAIC0zNjE0LDcgKzM0OTcsNyBAQAogCiAJbmV0aWZfZGV2aWNlX2F0dGFjaChkZXYpOwogCi0JcGh5X3Jlc3VtZShkZXYtPnBoeWRldik7CisJcGh5X3Jlc3VtZShwcml2LT5waHlkZXYpOwogCiAJaWYgKHByaXYtPmVlZS5lZWVfZW5hYmxlZCkKIAkJYmNtZ2VuZXRfZWVlX2VuYWJsZV9zZXQoZGV2LCB0cnVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21nZW5ldC5oCmluZGV4IDBmMDg2OGMuLjFlMmRjMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtZ2VuZXQuaApAQCAtNTk3LDYgKzU5Nyw3IEBACiAKIAkvKiBNRElPIGJ1cyB2YXJpYWJsZXMgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwogCWJvb2wgaW50ZXJuYWxfcGh5OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5X2RuOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWRpb19kbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbW1paS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtbWlpLmMKaW5kZXggZTkwN2FjZC4uNDU3YzNiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtbWlpLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtbWlpLmMKQEAgLTg2LDcgKzg2LDcgQEAKIHZvaWQgYmNtZ2VuZXRfbWlpX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBkZXYtPnBoeWRldjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcHJpdi0+cGh5ZGV2OwogCXUzMiByZWcsIGNtZF9iaXRzID0gMDsKIAlib29sIHN0YXR1c19jaGFuZ2VkID0gZmFsc2U7CiAKQEAgLTE4Myw5ICsxODMsOSBAQAogCWlmIChHRU5FVF9JU19WNChwcml2KSkKIAkJcmV0dXJuOwogCi0JaWYgKGRldi0+cGh5ZGV2KSB7Ci0JCXBoeV9pbml0X2h3KGRldi0+cGh5ZGV2KTsKLQkJcGh5X3N0YXJ0X2FuZWcoZGV2LT5waHlkZXYpOworCWlmIChwcml2LT5waHlkZXYpIHsKKwkJcGh5X2luaXRfaHcocHJpdi0+cGh5ZGV2KTsKKwkJcGh5X3N0YXJ0X2FuZWcocHJpdi0+cGh5ZGV2KTsKIAl9CiB9CiAKQEAgLTIzNiw3ICsyMzYsNiBAQAogCiBzdGF0aWMgdm9pZCBiY21nZW5ldF9tb2NhX3BoeV9zZXR1cChzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHByaXYtPmRldjsKIAl1MzIgcmVnOwogCiAJLyogU3BlZWQgc2V0dGluZ3MgYXJlIHNldCBpbiBiY21nZW5ldF9taWlfc2V0dXAoKSAqLwpAQCAtMjQ1LDE0ICsyNDQsMTQgQEAKIAliY21nZW5ldF9zeXNfd3JpdGVsKHByaXYsIHJlZywgU1lTX1BPUlRfQ1RSTCk7CiAKIAlpZiAocHJpdi0+aHdfcGFyYW1zLT5mbGFncyAmIEdFTkVUX0hBU19NT0NBX0xJTktfREVUKQotCQlmaXhlZF9waHlfc2V0X2xpbmtfdXBkYXRlKG5kZXYtPnBoeWRldiwKKwkJZml4ZWRfcGh5X3NldF9saW5rX3VwZGF0ZShwcml2LT5waHlkZXYsCiAJCQkJCSAgYmNtZ2VuZXRfZml4ZWRfcGh5X2xpbmtfdXBkYXRlKTsKIH0KIAogaW50IGJjbWdlbmV0X21paV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGRldi0+cGh5ZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBwcml2LT5waHlkZXY7CiAJc3RydWN0IGRldmljZSAqa2RldiA9ICZwcml2LT5wZGV2LT5kZXY7CiAJY29uc3QgY2hhciAqcGh5X25hbWUgPSBOVUxMOwogCXUzMiBpZF9tb2RlX2RpcyA9IDA7CkBAIC0zMDMsNyArMzAyLDcgQEAKIAkJICogY2FwYWJpbGl0aWVzLCB1c2UgdGhhdCBrbm93bGVkZ2UgdG8gYWxzbyBjb25maWd1cmUgdGhlCiAJCSAqIFJldmVyc2UgTUlJIGludGVyZmFjZSBjb3JyZWN0bHkuCiAJCSAqLwotCQlpZiAoKHBoeWRldi0+c3VwcG9ydGVkICYgUEhZX0JBU0lDX0ZFQVRVUkVTKSA9PQorCQlpZiAoKHByaXYtPnBoeWRldi0+c3VwcG9ydGVkICYgUEhZX0JBU0lDX0ZFQVRVUkVTKSA9PQogCQkJCVBIWV9CQVNJQ19GRUFUVVJFUykKIAkJCXBvcnRfY3RybCA9IFBPUlRfTU9ERV9FWFRfUlZNSUlfMjU7CiAJCWVsc2UKQEAgLTM3Miw3ICszNzEsNyBAQAogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9IGVsc2UgewotCQlwaHlkZXYgPSBkZXYtPnBoeWRldjsKKwkJcGh5ZGV2ID0gcHJpdi0+cGh5ZGV2OwogCQlwaHlkZXYtPmRldl9mbGFncyA9IHBoeV9mbGFnczsKIAogCQlyZXQgPSBwaHlfY29ubmVjdF9kaXJlY3QoZGV2LCBwaHlkZXYsIGJjbWdlbmV0X21paV9zZXR1cCwKQEAgLTM4Myw2ICszODIsOCBAQAogCQl9CiAJfQogCisJcHJpdi0+cGh5ZGV2ID0gcGh5ZGV2OworCiAJLyogQ29uZmlndXJlIHBvcnQgbXVsdGlwbGV4ZXIgYmFzZWQgb24gd2hhdCB0aGUgcHJvYmVkIFBIWSBkZXZpY2Ugc2luY2UKIAkgKiByZWFkaW5nIHRoZSAnbWF4LXNwZWVkJyBwcm9wZXJ0eSBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIHN1cHBvcnRlZAogCSAqIFBIWSBzcGVlZCB3aGljaCBpcyBuZWVkZWQgZm9yIGJjbWdlbmV0X21paV9jb25maWcoKSB0byBjb25maWd1cmUKQEAgLTM5MCw3ICszOTEsNyBAQAogCSAqLwogCXJldCA9IGJjbWdlbmV0X21paV9jb25maWcoZGV2KTsKIAlpZiAocmV0KSB7Ci0JCXBoeV9kaXNjb25uZWN0KHBoeWRldik7CisJCXBoeV9kaXNjb25uZWN0KHByaXYtPnBoeWRldik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC00MDAsNyArNDAxLDcgQEAKIAkgKiBFdGhlcm5ldCBNQUMgSVNScwogCSAqLwogCWlmIChwcml2LT5pbnRlcm5hbF9waHkpCi0JCXBoeWRldi0+aXJxID0gUEhZX0lHTk9SRV9JTlRFUlJVUFQ7CisJCXByaXYtPnBoeWRldi0+aXJxID0gUEhZX0lHTk9SRV9JTlRFUlJVUFQ7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYwNSw2ICs2MDYsNyBAQAogCiAJfQogCisJcHJpdi0+cGh5ZGV2ID0gcGh5ZGV2OwogCXByaXYtPnBoeV9pbnRlcmZhY2UgPSBwZC0+cGh5X2ludGVyZmFjZTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYwppbmRleCA2NTkyNjEyLi5hOTI3YTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS90ZzMuYwpAQCAtMTIwNzksOTUgKzEyMDc5LDEwNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgdGczX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgdGczX2dldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHN1cHBvcnRlZCwgYWR2ZXJ0aXNpbmc7CiAKIAlpZiAodGczX2ZsYWcodHAsIFVTRV9QSFlMSUIpKSB7CiAJCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0lTX0NPTk5FQ1RFRCkpCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJcGh5ZGV2ID0gbWRpb2J1c19nZXRfcGh5KHRwLT5tZGlvX2J1cywgdHAtPnBoeV9hZGRyKTsKLQkJcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQocGh5ZGV2LCBjbWQpOworCQlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX2dldChwaHlkZXYsIGNtZCk7CiAJfQogCi0JY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX0F1dG9uZWcpOworCXN1cHBvcnRlZCA9IChTVVBQT1JURURfQXV0b25lZyk7CiAKIAlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR18xMF8xMDBfT05MWSkpCi0JCWNtZC0+c3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwMGJhc2VUX0hhbGYgfAotCQkJCSAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCk7CisJCXN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmIHwKKwkJCSAgICAgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCk7CiAKIAlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19BTllfU0VSREVTKSkgewotCQljbWQtPnN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAotCQkJCSAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAotCQkJCSAgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8Ci0JCQkJICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKLQkJCQkgIFNVUFBPUlRFRF9UUCk7Ci0JCWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJCXN1cHBvcnRlZCB8PSAoU1VQUE9SVEVEXzEwMGJhc2VUX0hhbGYgfAorCQkJICAgICAgU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGwgfAorCQkJICAgICAgU1VQUE9SVEVEXzEwYmFzZVRfSGFsZiB8CisJCQkgICAgICBTVVBQT1JURURfMTBiYXNlVF9GdWxsIHwKKwkJCSAgICAgIFNVUFBPUlRFRF9UUCk7CisJCWNtZC0+YmFzZS5wb3J0ID0gUE9SVF9UUDsKIAl9IGVsc2UgewotCQljbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfRklCUkU7Ci0JCWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7CisJCXN1cHBvcnRlZCB8PSBTVVBQT1JURURfRklCUkU7CisJCWNtZC0+YmFzZS5wb3J0ID0gUE9SVF9GSUJSRTsKIAl9CisJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKGNtZC0+bGlua19tb2Rlcy5zdXBwb3J0ZWQsCisJCQkJCQlzdXBwb3J0ZWQpOwogCi0JY21kLT5hZHZlcnRpc2luZyA9IHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZzsKKwlhZHZlcnRpc2luZyA9IHRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZzsKIAlpZiAodGczX2ZsYWcodHAsIFBBVVNFX0FVVE9ORUcpKSB7CiAJCWlmICh0cC0+bGlua19jb25maWcuZmxvd2N0cmwgJiBGTE9XX0NUUkxfUlgpIHsKIAkJCWlmICh0cC0+bGlua19jb25maWcuZmxvd2N0cmwgJiBGTE9XX0NUUkxfVFgpIHsKLQkJCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfUGF1c2U7CisJCQkJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QYXVzZTsKIAkJCX0gZWxzZSB7Ci0JCQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlIHwKLQkJCQkJCSAgICBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CisJCQkJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9QYXVzZSB8CisJCQkJCUFEVkVSVElTRURfQXN5bV9QYXVzZTsKIAkJCX0KIAkJfSBlbHNlIGlmICh0cC0+bGlua19jb25maWcuZmxvd2N0cmwgJiBGTE9XX0NUUkxfVFgpIHsKLQkJCWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9Bc3ltX1BhdXNlOworCQkJYWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9Bc3ltX1BhdXNlOwogCQl9CiAJfQorCWV0aHRvb2xfY29udmVydF9sZWdhY3lfdTMyX3RvX2xpbmtfbW9kZShjbWQtPmxpbmtfbW9kZXMuYWR2ZXJ0aXNpbmcsCisJCQkJCQlhZHZlcnRpc2luZyk7CisKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpICYmIHRwLT5saW5rX3VwKSB7Ci0JCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQpOwotCQljbWQtPmR1cGxleCA9IHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZHVwbGV4OwotCQljbWQtPmxwX2FkdmVydGlzaW5nID0gdHAtPmxpbmtfY29uZmlnLnJtdF9hZHY7CisJCWNtZC0+YmFzZS5zcGVlZCA9IHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfc3BlZWQ7CisJCWNtZC0+YmFzZS5kdXBsZXggPSB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleDsKKwkJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKAorCQkJY21kLT5saW5rX21vZGVzLmxwX2FkdmVydGlzaW5nLAorCQkJdHAtPmxpbmtfY29uZmlnLnJtdF9hZHYpOworCiAJCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0FOWV9TRVJERVMpKSB7CiAJCQlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfTURJWF9TVEFURSkKLQkJCQljbWQtPmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESV9YOworCQkJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NRElfWDsKIAkJCWVsc2UKLQkJCQljbWQtPmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESTsKKwkJCQljbWQtPmJhc2UuZXRoX3RwX21kaXggPSBFVEhfVFBfTURJOwogCQl9CiAJfSBlbHNlIHsKLQkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgU1BFRURfVU5LTk9XTik7Ci0JCWNtZC0+ZHVwbGV4ID0gRFVQTEVYX1VOS05PV047Ci0JCWNtZC0+ZXRoX3RwX21kaXggPSBFVEhfVFBfTURJX0lOVkFMSUQ7CisJCWNtZC0+YmFzZS5zcGVlZCA9IFNQRUVEX1VOS05PV047CisJCWNtZC0+YmFzZS5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKKwkJY21kLT5iYXNlLmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESV9JTlZBTElEOwogCX0KLQljbWQtPnBoeV9hZGRyZXNzID0gdHAtPnBoeV9hZGRyOwotCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOwotCWNtZC0+YXV0b25lZyA9IHRwLT5saW5rX2NvbmZpZy5hdXRvbmVnOwotCWNtZC0+bWF4dHhwa3QgPSAwOwotCWNtZC0+bWF4cnhwa3QgPSAwOworCWNtZC0+YmFzZS5waHlfYWRkcmVzcyA9IHRwLT5waHlfYWRkcjsKKwljbWQtPmJhc2UuYXV0b25lZyA9IHRwLT5saW5rX2NvbmZpZy5hdXRvbmVnOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRnM19zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IHRnM19zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiBzcGVlZCA9IGV0aHRvb2xfY21kX3NwZWVkKGNtZCk7CisJdTMyIHNwZWVkID0gY21kLT5iYXNlLnNwZWVkOworCXUzMiBhZHZlcnRpc2luZzsKIAogCWlmICh0ZzNfZmxhZyh0cCwgVVNFX1BIWUxJQikpIHsKIAkJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldjsKIAkJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfQ09OTkVDVEVEKSkKIAkJCXJldHVybiAtRUFHQUlOOwogCQlwaHlkZXYgPSBtZGlvYnVzX2dldF9waHkodHAtPm1kaW9fYnVzLCB0cC0+cGh5X2FkZHIpOwotCQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwaHlkZXYsIGNtZCk7CisJCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3Nfc2V0KHBoeWRldiwgY21kKTsKIAl9CiAKLQlpZiAoY21kLT5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFICYmCi0JICAgIGNtZC0+YXV0b25lZyAhPSBBVVRPTkVHX0RJU0FCTEUpCisJaWYgKGNtZC0+YmFzZS5hdXRvbmVnICE9IEFVVE9ORUdfRU5BQkxFICYmCisJICAgIGNtZC0+YmFzZS5hdXRvbmVnICE9IEFVVE9ORUdfRElTQUJMRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSAmJgotCSAgICBjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCAmJgotCSAgICBjbWQtPmR1cGxleCAhPSBEVVBMRVhfSEFMRikKKwlpZiAoY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFICYmCisJICAgIGNtZC0+YmFzZS5kdXBsZXggIT0gRFVQTEVYX0ZVTEwgJiYKKwkgICAgY21kLT5iYXNlLmR1cGxleCAhPSBEVVBMRVhfSEFMRikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7CisJZXRodG9vbF9jb252ZXJ0X2xpbmtfbW9kZV90b19sZWdhY3lfdTMyKCZhZHZlcnRpc2luZywKKwkJCQkJCWNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZyk7CisKKwlpZiAoY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKIAkJdTMyIG1hc2sgPSBBRFZFUlRJU0VEX0F1dG9uZWcgfAogCQkJICAgQURWRVJUSVNFRF9QYXVzZSB8CiAJCQkgICBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CkBAIC0xMjE4NSw3ICsxMjE5Nyw3IEBACiAJCWVsc2UKIAkJCW1hc2sgfD0gQURWRVJUSVNFRF9GSUJSRTsKIAotCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIH5tYXNrKQorCQlpZiAoYWR2ZXJ0aXNpbmcgJiB+bWFzaykKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCW1hc2sgJj0gKEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGYgfApAQCAtMTIxOTUsMTMgKzEyMjA3LDEzIEBACiAJCQkgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfAogCQkJIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKTsKIAotCQljbWQtPmFkdmVydGlzaW5nICY9IG1hc2s7CisJCWFkdmVydGlzaW5nICY9IG1hc2s7CiAJfSBlbHNlIHsKIAkJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0FOWV9TRVJERVMpIHsKIAkJCWlmIChzcGVlZCAhPSBTUEVFRF8xMDAwKQogCQkJCXJldHVybiAtRUlOVkFMOwogCi0JCQlpZiAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCQlpZiAoY21kLT5iYXNlLmR1cGxleCAhPSBEVVBMRVhfRlVMTCkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfSBlbHNlIHsKIAkJCWlmIChzcGVlZCAhPSBTUEVFRF8xMDAgJiYKQEAgLTEyMjEyLDE2ICsxMjIyNCwxNiBAQAogCiAJdGczX2Z1bGxfbG9jayh0cCwgMCk7CiAKLQl0cC0+bGlua19jb25maWcuYXV0b25lZyA9IGNtZC0+YXV0b25lZzsKLQlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKSB7Ci0JCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZyA9IChjbWQtPmFkdmVydGlzaW5nIHwKKwl0cC0+bGlua19jb25maWcuYXV0b25lZyA9IGNtZC0+YmFzZS5hdXRvbmVnOworCWlmIChjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgeworCQl0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgPSAoYWR2ZXJ0aXNpbmcgfAogCQkJCQkgICAgICBBRFZFUlRJU0VEX0F1dG9uZWcpOwogCQl0cC0+bGlua19jb25maWcuc3BlZWQgPSBTUEVFRF9VTktOT1dOOwogCQl0cC0+bGlua19jb25maWcuZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CiAJfSBlbHNlIHsKIAkJdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nID0gMDsKIAkJdHAtPmxpbmtfY29uZmlnLnNwZWVkID0gc3BlZWQ7Ci0JCXRwLT5saW5rX2NvbmZpZy5kdXBsZXggPSBjbWQtPmR1cGxleDsKKwkJdHAtPmxpbmtfY29uZmlnLmR1cGxleCA9IGNtZC0+YmFzZS5kdXBsZXg7CiAJfQogCiAJdHAtPnBoeV9mbGFncyB8PSBURzNfUEhZRkxHX1VTRVJfQ09ORklHVVJFRDsKQEAgLTE0MDEyLDYgKzE0MDI0LDcgQEAKIAlpZiAoKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA+IE1BWF9SWENPTF9USUNLUykgfHwKIAkgICAgKCFlYy0+cnhfY29hbGVzY2VfdXNlY3MpIHx8CiAJICAgIChlYy0+dHhfY29hbGVzY2VfdXNlY3MgPiBNQVhfVFhDT0xfVElDS1MpIHx8CisJICAgICghZWMtPnR4X2NvYWxlc2NlX3VzZWNzKSB8fAogCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID4gTUFYX1JYTUFYX0ZSQU1FUykgfHwKIAkgICAgKGVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA+IE1BWF9UWE1BWF9GUkFNRVMpIHx8CiAJICAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3NfaXJxID4gbWF4X3J4Y29hbF90aWNrX2ludCkgfHwKQEAgLTE0MDIyLDE2ICsxNDAzNSw2IEBACiAJICAgIChlYy0+c3RhdHNfYmxvY2tfY29hbGVzY2VfdXNlY3MgPCBtaW5fc3RhdF9jb2FsX3RpY2tzKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBObyByeCBpbnRlcnJ1cHRzIHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGJvdGggYXJlIHplcm8gKi8KLQlpZiAoKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA9PSAwKSAmJgotCSAgICAoZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID09IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIE5vIHR4IGludGVycnVwdHMgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgYm90aCBhcmUgemVybyAqLwotCWlmICgoZWMtPnR4X2NvYWxlc2NlX3VzZWNzID09IDApICYmCi0JICAgIChlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPT0gMCkpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJLyogT25seSBjb3B5IHJlbGV2YW50IHBhcmFtZXRlcnMsIGlnbm9yZSBhbGwgb3RoZXJzLiAqLwogCXRwLT5jb2FsLnJ4X2NvYWxlc2NlX3VzZWNzID0gZWMtPnJ4X2NvYWxlc2NlX3VzZWNzOwogCXRwLT5jb2FsLnR4X2NvYWxlc2NlX3VzZWNzID0gZWMtPnR4X2NvYWxlc2NlX3VzZWNzOwpAQCAtMTQxMDMsOCArMTQxMDYsNiBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHRnM19ldGh0b29sX29wcyA9IHsKLQkuZ2V0X3NldHRpbmdzCQk9IHRnM19nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSB0ZzNfc2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbwkJPSB0ZzNfZ2V0X2RydmluZm8sCiAJLmdldF9yZWdzX2xlbgkJPSB0ZzNfZ2V0X3JlZ3NfbGVuLAogCS5nZXRfcmVncwkJPSB0ZzNfZ2V0X3JlZ3MsCkBAIC0xNDEzNyw2ICsxNDEzOCw4IEBACiAJLmdldF90c19pbmZvCQk9IHRnM19nZXRfdHNfaW5mbywKIAkuZ2V0X2VlZQkJPSB0ZzNfZ2V0X2VlZSwKIAkuc2V0X2VlZQkJPSB0ZzNfc2V0X2VlZSwKKwkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gdGczX2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzCT0gdGczX3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnRnM19nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTgxMzEsMTQgKzE4MTM0LDE0IEBACiAKIAlydG5sX2xvY2soKTsKIAotCS8qIFdlIG5lZWRuJ3QgcmVjb3ZlciBmcm9tIHBlcm1hbmVudCBlcnJvciAqLwotCWlmIChzdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19mcm96ZW4pCi0JCXRwLT5wY2llcnJfcmVjb3ZlcnkgPSB0cnVlOwotCiAJLyogV2UgcHJvYmFibHkgZG9uJ3QgaGF2ZSBuZXRkZXYgeWV0ICovCiAJaWYgKCFuZXRkZXYgfHwgIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJZ290byBkb25lOwogCisJLyogV2UgbmVlZG4ndCByZWNvdmVyIGZyb20gcGVybWFuZW50IGVycm9yICovCisJaWYgKHN0YXRlID09IHBjaV9jaGFubmVsX2lvX2Zyb3plbikKKwkJdHAtPnBjaWVycl9yZWNvdmVyeSA9IHRydWU7CisKIAl0ZzNfcGh5X3N0b3AodHApOwogCiAJdGczX25ldGlmX3N0b3AodHApOwpAQCAtMTgyMzUsNyArMTgyMzgsNyBAQAogCiAJcnRubF9sb2NrKCk7CiAKLQlpZiAoIW5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKKwlpZiAoIW5ldGRldiB8fCAhbmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQlnb3RvIGRvbmU7CiAKIAl0ZzNfZnVsbF9sb2NrKHRwLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuYwppbmRleCA3NzFjYzI2Li5mOWRmNGI1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuYwpAQCAtNTQsOSArNTQsNyBAQAogICogR2xvYmFsIHZhcmlhYmxlcwogICovCiBzdGF0aWMgdTMyIGJuYWRfcnhxc19wZXJfY3EgPSAyOwotc3RhdGljIHUzMiBibmFfaWQ7Ci1zdGF0aWMgc3RydWN0IG11dGV4IGJuYWRfbGlzdF9tdXRleDsKLXN0YXRpYyBMSVNUX0hFQUQoYm5hZF9saXN0KTsKK3N0YXRpYyBhdG9taWNfdCBibmFfaWQ7CiBzdGF0aWMgY29uc3QgdTggYm5hZF9iY2FzdF9hZGRyW10gX19hbGlnbmVkKDIpID0KIAl7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKIApAQCAtNzYsMjMgKzc0LDYgQEAKIAkoX3Jlc19pbmZvKS0+cmVzX3UubWVtX2luZm8ubGVuID0gKF9zaXplKTsJCVwKIH0gd2hpbGUgKDApCiAKLXN0YXRpYyB2b2lkCi1ibmFkX2FkZF90b19saXN0KHN0cnVjdCBibmFkICpibmFkKQotewotCW11dGV4X2xvY2soJmJuYWRfbGlzdF9tdXRleCk7Ci0JbGlzdF9hZGRfdGFpbCgmYm5hZC0+bGlzdF9lbnRyeSwgJmJuYWRfbGlzdCk7Ci0JYm5hZC0+aWQgPSBibmFfaWQrKzsKLQltdXRleF91bmxvY2soJmJuYWRfbGlzdF9tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1ibmFkX3JlbW92ZV9mcm9tX2xpc3Qoc3RydWN0IGJuYWQgKmJuYWQpCi17Ci0JbXV0ZXhfbG9jaygmYm5hZF9saXN0X211dGV4KTsKLQlsaXN0X2RlbCgmYm5hZC0+bGlzdF9lbnRyeSk7Ci0JbXV0ZXhfdW5sb2NrKCZibmFkX2xpc3RfbXV0ZXgpOwotfQotCiAvKgogICogUmVpbml0aWFsaXplIGNvbXBsZXRpb25zIGluIENRLCBvbmNlIFJ4IGlzIHRha2VuIGRvd24KICAqLwpAQCAtMzU3MywxNCArMzU1NCwxMiBAQAogewogCXNwaW5fbG9ja19pbml0KCZibmFkLT5ibmFfbG9jayk7CiAJbXV0ZXhfaW5pdCgmYm5hZC0+Y29uZl9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmYm5hZF9saXN0X211dGV4KTsKIH0KIAogc3RhdGljIHZvaWQKIGJuYWRfbG9ja191bmluaXQoc3RydWN0IGJuYWQgKmJuYWQpCiB7CiAJbXV0ZXhfZGVzdHJveSgmYm5hZC0+Y29uZl9tdXRleCk7Ci0JbXV0ZXhfZGVzdHJveSgmYm5hZF9saXN0X211dGV4KTsKIH0KIAogLyogUENJIEluaXRpYWxpemF0aW9uICovCkBAIC0zNjUzLDcgKzM2MzIsNyBAQAogCX0KIAlibmFkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlibmFkX2xvY2tfaW5pdChibmFkKTsKLQlibmFkX2FkZF90b19saXN0KGJuYWQpOworCWJuYWQtPmlkID0gYXRvbWljX2luY19yZXR1cm4oJmJuYV9pZCkgLSAxOwogCiAJbXV0ZXhfbG9jaygmYm5hZC0+Y29uZl9tdXRleCk7CiAJLyoKQEAgLTM4MDcsNyArMzc4Niw2IEBACiAJYm5hZF9wY2lfdW5pbml0KHBkZXYpOwogdW5sb2NrX211dGV4OgogCW11dGV4X3VubG9jaygmYm5hZC0+Y29uZl9tdXRleCk7Ci0JYm5hZF9yZW1vdmVfZnJvbV9saXN0KGJuYWQpOwogCWJuYWRfbG9ja191bmluaXQoYm5hZCk7CiAJZnJlZV9uZXRkZXYobmV0ZGV2KTsKIAlyZXR1cm4gZXJyOwpAQCAtMzg0NSw3ICszODIzLDYgQEAKIAlibmFkX2Rpc2FibGVfbXNpeChibmFkKTsKIAlibmFkX3BjaV91bmluaXQocGRldik7CiAJbXV0ZXhfdW5sb2NrKCZibmFkLT5jb25mX211dGV4KTsKLQlibmFkX3JlbW92ZV9mcm9tX2xpc3QoYm5hZCk7CiAJYm5hZF9sb2NrX3VuaW5pdChibmFkKTsKIAkvKiBSZW1vdmUgdGhlIGRlYnVnZnMgbm9kZSBmb3IgdGhpcyBibmFkICovCiAJa2ZyZWUoYm5hZC0+cmVnZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmgKaW5kZXggZjRlZDgxNi4uNDZmN2I4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuaApAQCAtMjg4LDcgKzI4OCw2IEBACiBzdHJ1Y3QgYm5hZCB7CiAJc3RydWN0IG5ldF9kZXZpY2UJKm5ldGRldjsKIAl1MzIJCQlpZDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3RfZW50cnk7CiAKIAkvKiBEYXRhIHBhdGggKi8KIAlzdHJ1Y3QgYm5hZF90eF9pbmZvIHR4X2luZm9bQk5BRF9NQVhfVFhdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2V0aHRvb2wuYwppbmRleCAwZTRmZGMzLi4zMWY2MWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2V0aHRvb2wuYwpAQCAtMzEsMTUgKzMxLDEwIEBACiAjZGVmaW5lIEJOQURfTlVNX1RYRl9DT1VOVEVSUyAxMgogI2RlZmluZSBCTkFEX05VTV9SWEZfQ09VTlRFUlMgMTAKICNkZWZpbmUgQk5BRF9OVU1fQ1FfQ09VTlRFUlMgKDMgKyA1KQotI2RlZmluZSBCTkFEX05VTV9SWFFfQ09VTlRFUlMgNgorI2RlZmluZSBCTkFEX05VTV9SWFFfQ09VTlRFUlMgNwogI2RlZmluZSBCTkFEX05VTV9UWFFfQ09VTlRFUlMgNQogCi0jZGVmaW5lIEJOQURfRVRIVE9PTF9TVEFUU19OVU0JCQkJCQlcCi0JKHNpemVvZihzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQpIC8gc2l6ZW9mKHU2NCkgKwlcCi0Jc2l6ZW9mKHN0cnVjdCBibmFkX2Rydl9zdGF0cykgLyBzaXplb2YodTY0KSArCQlcCi0Jb2Zmc2V0b2Yoc3RydWN0IGJmaV9lbmV0X3N0YXRzLCByeGZfc3RhdHNbMF0pIC8gc2l6ZW9mKHU2NCkpCi0KLXN0YXRpYyBjb25zdCBjaGFyICpibmFkX25ldF9zdGF0c19zdHJpbmdzW0JOQURfRVRIVE9PTF9TVEFUU19OVU1dID0geworc3RhdGljIGNvbnN0IGNoYXIgKmJuYWRfbmV0X3N0YXRzX3N0cmluZ3NbXSA9IHsKIAkicnhfcGFja2V0cyIsCiAJInR4X3BhY2tldHMiLAogCSJyeF9ieXRlcyIsCkBAIC01MCwyMiArNDUsMTAgQEAKIAkidHhfZHJvcHBlZCIsCiAJIm11bHRpY2FzdCIsCiAJImNvbGxpc2lvbnMiLAotCiAJInJ4X2xlbmd0aF9lcnJvcnMiLAotCSJyeF9vdmVyX2Vycm9ycyIsCiAJInJ4X2NyY19lcnJvcnMiLAogCSJyeF9mcmFtZV9lcnJvcnMiLAotCSJyeF9maWZvX2Vycm9ycyIsCi0JInJ4X21pc3NlZF9lcnJvcnMiLAotCi0JInR4X2Fib3J0ZWRfZXJyb3JzIiwKLQkidHhfY2Fycmllcl9lcnJvcnMiLAogCSJ0eF9maWZvX2Vycm9ycyIsCi0JInR4X2hlYXJ0YmVhdF9lcnJvcnMiLAotCSJ0eF93aW5kb3dfZXJyb3JzIiwKLQotCSJyeF9jb21wcmVzc2VkIiwKLQkidHhfY29tcHJlc3NlZCIsCiAKIAkibmV0aWZfcXVldWVfc3RvcCIsCiAJIm5ldGlmX3F1ZXVlX3dha2V1cCIsCkBAIC0yNTQsNiArMjM3LDggQEAKIAkiZmNfdHhfZmlkX3Bhcml0eV9lcnJvcnMiLAogfTsKIAorI2RlZmluZSBCTkFEX0VUSFRPT0xfU1RBVFNfTlVNCUFSUkFZX1NJWkUoYm5hZF9uZXRfc3RhdHNfc3RyaW5ncykKKwogc3RhdGljIGludAogYm5hZF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCiB7CkBAIC02NTgsNiArNjQzLDggQEAKIAkJCQlzdHJpbmcgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQkJCXNwcmludGYoc3RyaW5nLCAicnhxJWRfYWxsb2NidWZfZmFpbGVkIiwgcV9udW0pOwogCQkJCXN0cmluZyArPSBFVEhfR1NUUklOR19MRU47CisJCQkJc3ByaW50ZihzdHJpbmcsICJyeHElZF9tYXBidWZfZmFpbGVkIiwgcV9udW0pOworCQkJCXN0cmluZyArPSBFVEhfR1NUUklOR19MRU47CiAJCQkJc3ByaW50ZihzdHJpbmcsICJyeHElZF9wcm9kdWNlcl9pbmRleCIsIHFfbnVtKTsKIAkJCQlzdHJpbmcgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQkJCXNwcmludGYoc3RyaW5nLCAicnhxJWRfY29uc3VtZXJfaW5kZXgiLCBxX251bSk7CkBAIC02NzgsNiArNjY1LDkgQEAKIAkJCQkJc3ByaW50ZihzdHJpbmcsICJyeHElZF9hbGxvY2J1Zl9mYWlsZWQiLAogCQkJCQkJCQlxX251bSk7CiAJCQkJCXN0cmluZyArPSBFVEhfR1NUUklOR19MRU47CisJCQkJCXNwcmludGYoc3RyaW5nLCAicnhxJWRfbWFwYnVmX2ZhaWxlZCIsCisJCQkJCQlxX251bSk7CisJCQkJCXN0cmluZyArPSBFVEhfR1NUUklOR19MRU47CiAJCQkJCXNwcmludGYoc3RyaW5nLCAicnhxJWRfcHJvZHVjZXJfaW5kZXgiLAogCQkJCQkJCQlxX251bSk7CiAJCQkJCXN0cmluZyArPSBFVEhfR1NUUklOR19MRU47CkBAIC04NTQsOSArODQ0LDkgQEAKIAkJICAgICAgIHU2NCAqYnVmKQogewogCXN0cnVjdCBibmFkICpibmFkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlpbnQgaSwgaiwgYmk7CisJaW50IGksIGosIGJpID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqbmV0X3N0YXRzNjQ7CisJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0IG5ldF9zdGF0czY0OwogCXU2NCAqc3RhdHM2NDsKIAl1MzIgYm1hcDsKIApAQCAtODcxLDE0ICs4NjEsMjUgQEAKIAkgKiB1bmRlciB0aGUgc2FtZSBsb2NrCiAJICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7Ci0JYmkgPSAwOwotCW1lbXNldChidWYsIDAsIHN0YXRzLT5uX3N0YXRzICogc2l6ZW9mKHU2NCkpOwogCi0JbmV0X3N0YXRzNjQgPSAoc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICopYnVmOwotCWJuYWRfbmV0ZGV2X3FzdGF0c19maWxsKGJuYWQsIG5ldF9zdGF0czY0KTsKLQlibmFkX25ldGRldl9od3N0YXRzX2ZpbGwoYm5hZCwgbmV0X3N0YXRzNjQpOworCW1lbXNldCgmbmV0X3N0YXRzNjQsIDAsIHNpemVvZihuZXRfc3RhdHM2NCkpOworCWJuYWRfbmV0ZGV2X3FzdGF0c19maWxsKGJuYWQsICZuZXRfc3RhdHM2NCk7CisJYm5hZF9uZXRkZXZfaHdzdGF0c19maWxsKGJuYWQsICZuZXRfc3RhdHM2NCk7CiAKLQliaSA9IHNpemVvZigqbmV0X3N0YXRzNjQpIC8gc2l6ZW9mKHU2NCk7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQucnhfcGFja2V0czsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC50eF9wYWNrZXRzOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnJ4X2J5dGVzOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnR4X2J5dGVzOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnJ4X2Vycm9yczsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC50eF9lcnJvcnM7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQucnhfZHJvcHBlZDsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC50eF9kcm9wcGVkOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0Lm11bHRpY2FzdDsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC5jb2xsaXNpb25zOworCWJ1ZltiaSsrXSA9IG5ldF9zdGF0czY0LnJ4X2xlbmd0aF9lcnJvcnM7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQucnhfY3JjX2Vycm9yczsKKwlidWZbYmkrK10gPSBuZXRfc3RhdHM2NC5yeF9mcmFtZV9lcnJvcnM7CisJYnVmW2JpKytdID0gbmV0X3N0YXRzNjQudHhfZmlmb19lcnJvcnM7CiAKIAkvKiBHZXQgbmV0aWZfcXVldWVfc3RvcHBlZCBmcm9tIHN0YWNrICovCiAJYm5hZC0+c3RhdHMuZHJ2X3N0YXRzLm5ldGlmX3F1ZXVlX3N0b3BwZWQgPSBuZXRpZl9xdWV1ZV9zdG9wcGVkKG5ldGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL21hY2IuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5jCmluZGV4IDg5YzBjZmEuLjYzMTQ0YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5jCkBAIC01NDEsNiArNTQxLDE0IEBACiAJfQogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbWFjYl9zZXRfYWRkcihzdHJ1Y3QgbWFjYl9kbWFfZGVzYyAqZGVzYywgZG1hX2FkZHJfdCBhZGRyKQoreworCWRlc2MtPmFkZHIgPSAodTMyKWFkZHI7CisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCWRlc2MtPmFkZHJoID0gKHUzMikoYWRkciA+PiAzMik7CisjZW5kaWYKK30KKwogc3RhdGljIHZvaWQgbWFjYl90eF9lcnJvcl90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgbWFjYl9xdWV1ZQkqcXVldWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1hY2JfcXVldWUsCkBAIC02MjEsMTQgKzYyOSwxNyBAQAogCiAJLyogU2V0IGVuZCBvZiBUWCBxdWV1ZSAqLwogCWRlc2MgPSBtYWNiX3R4X2Rlc2MocXVldWUsIDApOwotCWRlc2MtPmFkZHIgPSAwOworCW1hY2Jfc2V0X2FkZHIoZGVzYywgMCk7CiAJZGVzYy0+Y3RybCA9IE1BQ0JfQklUKFRYX1VTRUQpOwogCiAJLyogTWFrZSBkZXNjcmlwdG9yIHVwZGF0ZXMgdmlzaWJsZSB0byBoYXJkd2FyZSAqLwogCXdtYigpOwogCiAJLyogUmVpbml0aWFsaXplIHRoZSBUWCBkZXNjIHF1ZXVlICovCi0JcXVldWVfd3JpdGVsKHF1ZXVlLCBUQlFQLCBxdWV1ZS0+dHhfcmluZ19kbWEpOworCXF1ZXVlX3dyaXRlbChxdWV1ZSwgVEJRUCwgKHUzMikocXVldWUtPnR4X3JpbmdfZG1hKSk7CisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCXF1ZXVlX3dyaXRlbChxdWV1ZSwgVEJRUEgsICh1MzIpKHF1ZXVlLT50eF9yaW5nX2RtYSA+PiAzMikpOworI2VuZGlmCiAJLyogTWFrZSBUWCByaW5nIHJlZmxlY3Qgc3RhdGUgb2YgaGFyZHdhcmUgKi8KIAlxdWV1ZS0+dHhfaGVhZCA9IDA7CiAJcXVldWUtPnR4X3RhaWwgPSAwOwpAQCAtNzUwLDcgKzc2MSw3IEBACiAKIAkJCWlmIChlbnRyeSA9PSBSWF9SSU5HX1NJWkUgLSAxKQogCQkJCXBhZGRyIHw9IE1BQ0JfQklUKFJYX1dSQVApOwotCQkJYnAtPnJ4X3JpbmdbZW50cnldLmFkZHIgPSBwYWRkcjsKKwkJCW1hY2Jfc2V0X2FkZHIoJihicC0+cnhfcmluZ1tlbnRyeV0pLCBwYWRkcik7CiAJCQlicC0+cnhfcmluZ1tlbnRyeV0uY3RybCA9IDA7CiAKIAkJCS8qIHByb3Blcmx5IGFsaWduIEV0aGVybmV0IGhlYWRlciAqLwpAQCAtNzk4LDcgKzgwOSw5IEBACiAJaW50CQkJY291bnQgPSAwOwogCiAJd2hpbGUgKGNvdW50IDwgYnVkZ2V0KSB7Ci0JCXUzMiBhZGRyLCBjdHJsOworCQl1MzIgY3RybDsKKwkJZG1hX2FkZHJfdCBhZGRyOworCQlib29sIHJ4dXNlZDsKIAogCQllbnRyeSA9IG1hY2JfcnhfcmluZ193cmFwKGJwLT5yeF90YWlsKTsKIAkJZGVzYyA9ICZicC0+cnhfcmluZ1tlbnRyeV07CkBAIC04MDYsMTAgKzgxOSwxNCBAQAogCQkvKiBNYWtlIGh3IGRlc2NyaXB0b3IgdXBkYXRlcyB2aXNpYmxlIHRvIENQVSAqLwogCQlybWIoKTsKIAotCQlhZGRyID0gZGVzYy0+YWRkcjsKKwkJcnh1c2VkID0gKGRlc2MtPmFkZHIgJiBNQUNCX0JJVChSWF9VU0VEKSkgPyB0cnVlIDogZmFsc2U7CisJCWFkZHIgPSBNQUNCX0JGKFJYX1dBRERSLCBNQUNCX0JGRVhUKFJYX1dBRERSLCBkZXNjLT5hZGRyKSk7CisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCQlhZGRyIHw9ICgodTY0KShkZXNjLT5hZGRyaCkgPDwgMzIpOworI2VuZGlmCiAJCWN0cmwgPSBkZXNjLT5jdHJsOwogCi0JCWlmICghKGFkZHIgJiBNQUNCX0JJVChSWF9VU0VEKSkpCisJCWlmICghcnh1c2VkKQogCQkJYnJlYWs7CiAKIAkJYnAtPnJ4X3RhaWwrKzsKQEAgLTgzNSw3ICs4NTIsNiBAQAogCQluZXRkZXZfdmRiZyhicC0+ZGV2LCAiZ2VtX3J4ICV1IChsZW4gJXUpXG4iLCBlbnRyeSwgbGVuKTsKIAogCQlza2JfcHV0KHNrYiwgbGVuKTsKLQkJYWRkciA9IE1BQ0JfQkYoUlhfV0FERFIsIE1BQ0JfQkZFWFQoUlhfV0FERFIsIGFkZHIpKTsKIAkJZG1hX3VubWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwgYWRkciwKIAkJCQkgYnAtPnJ4X2J1ZmZlcl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCkBAIC0xMjk5LDcgKzEzMTUsNyBAQAogCQkJY3RybCB8PSBNQUNCX0JJVChUWF9XUkFQKTsKIAogCQkvKiBTZXQgVFggYnVmZmVyIGRlc2NyaXB0b3IgKi8KLQkJZGVzYy0+YWRkciA9IHR4X3NrYi0+bWFwcGluZzsKKwkJbWFjYl9zZXRfYWRkcihkZXNjLCB0eF9za2ItPm1hcHBpbmcpOwogCQkvKiBkZXNjLT5hZGRyIG11c3QgYmUgdmlzaWJsZSB0byBoYXJkd2FyZSBiZWZvcmUgY2xlYXJpbmcKIAkJICogJ1RYX1VTRUQnIGJpdCBpbiBkZXNjLT5jdHJsLgogCQkgKi8KQEAgLTEzMjMsNiArMTMzOSwyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBtYWNiX2NsZWFyX2NzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBubyBjaGFuZ2UgZm9yIHBhY2tldHMgd2l0aG91dCBjaGVja3N1bSBvZmZsb2FkaW5nICovCisJaWYgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpCisJCXJldHVybiAwOworCisJLyogbWFrZSBzdXJlIHdlIGNhbiBtb2RpZnkgdGhlIGhlYWRlciAqLworCWlmICh1bmxpa2VseShza2JfY293X2hlYWQoc2tiLCAwKSkpCisJCXJldHVybiAtMTsKKworCS8qIGluaXRpYWxpemUgY2hlY2tzdW0gZmllbGQKKwkgKiBUaGlzIGlzIHJlcXVpcmVkIC0gYXQgbGVhc3QgZm9yIFp5bnEsIHdoaWNoIG90aGVyd2lzZSBjYWxjdWxhdGVzCisJICogd3JvbmcgVURQIGhlYWRlciBjaGVja3N1bXMgZm9yIFVEUCBwYWNrZXRzIHdpdGggVURQIGRhdGEgbGVuIDw9MgorCSAqLworCSooX19zdW0xNiAqKShza2JfY2hlY2tzdW1fc3RhcnQoc2tiKSArIHNrYi0+Y3N1bV9vZmZzZXQpID0gMDsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBtYWNiX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAl1MTYgcXVldWVfaW5kZXggPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKQEAgLTEzNjIsNiArMTM5NiwxMSBAQAogCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAJfQogCisJaWYgKG1hY2JfY2xlYXJfY3N1bShza2IpKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWdvdG8gdW5sb2NrOworCX0KKwogCS8qIE1hcCBzb2NrZXQgYnVmZmVyIGZvciBETUEgdHJhbnNmZXIgKi8KIAlpZiAoIW1hY2JfdHhfbWFwKGJwLCBxdWV1ZSwgc2tiKSkgewogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtMTQyMiw2ICsxNDYxLDkgQEAKIAogCQlkZXNjID0gJmJwLT5yeF9yaW5nW2ldOwogCQlhZGRyID0gTUFDQl9CRihSWF9XQUREUiwgTUFDQl9CRkVYVChSWF9XQUREUiwgZGVzYy0+YWRkcikpOworI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwkJYWRkciB8PSAoKHU2NCkoZGVzYy0+YWRkcmgpIDw8IDMyKTsKKyNlbmRpZgogCQlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBhZGRyLCBicC0+cnhfYnVmZmVyX3NpemUsCiAJCQkJIERNQV9GUk9NX0RFVklDRSk7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CkBAIC0xNTQ3LDcgKzE1ODksNyBAQAogCiAJZm9yIChxID0gMCwgcXVldWUgPSBicC0+cXVldWVzOyBxIDwgYnAtPm51bV9xdWV1ZXM7ICsrcSwgKytxdWV1ZSkgewogCQlmb3IgKGkgPSAwOyBpIDwgVFhfUklOR19TSVpFOyBpKyspIHsKLQkJCXF1ZXVlLT50eF9yaW5nW2ldLmFkZHIgPSAwOworCQkJbWFjYl9zZXRfYWRkcigmKHF1ZXVlLT50eF9yaW5nW2ldKSwgMCk7CiAJCQlxdWV1ZS0+dHhfcmluZ1tpXS5jdHJsID0gTUFDQl9CSVQoVFhfVVNFRCk7CiAJCX0KIAkJcXVldWUtPnR4X3JpbmdbVFhfUklOR19TSVpFIC0gMV0uY3RybCB8PSBNQUNCX0JJVChUWF9XUkFQKTsKQEAgLTE2OTQsNiArMTczNiwxMCBAQAogCQkJZG1hY2ZnIHw9IEdFTV9CSVQoVFhDT0VOKTsKIAkJZWxzZQogCQkJZG1hY2ZnICY9IH5HRU1fQklUKFRYQ09FTik7CisKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJCWRtYWNmZyB8PSBHRU1fQklUKEFERFI2NCk7CisjZW5kaWYKIAkJbmV0ZGV2X2RiZyhicC0+ZGV2LCAiQ2FkZW5jZSBjb25maWd1cmUgRE1BIHdpdGggMHglMDh4XG4iLAogCQkJICAgZG1hY2ZnKTsKIAkJZ2VtX3dyaXRlbChicCwgRE1BQ0ZHLCBkbWFjZmcpOwpAQCAtMTczOSw5ICsxNzg1LDE1IEBACiAJbWFjYl9jb25maWd1cmVfZG1hKGJwKTsKIAogCS8qIEluaXRpYWxpemUgVFggYW5kIFJYIGJ1ZmZlcnMgKi8KLQltYWNiX3dyaXRlbChicCwgUkJRUCwgYnAtPnJ4X3JpbmdfZG1hKTsKKwltYWNiX3dyaXRlbChicCwgUkJRUCwgKHUzMikoYnAtPnJ4X3JpbmdfZG1hKSk7CisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCW1hY2Jfd3JpdGVsKGJwLCBSQlFQSCwgKHUzMikoYnAtPnJ4X3JpbmdfZG1hID4+IDMyKSk7CisjZW5kaWYKIAlmb3IgKHEgPSAwLCBxdWV1ZSA9IGJwLT5xdWV1ZXM7IHEgPCBicC0+bnVtX3F1ZXVlczsgKytxLCArK3F1ZXVlKSB7Ci0JCXF1ZXVlX3dyaXRlbChxdWV1ZSwgVEJRUCwgcXVldWUtPnR4X3JpbmdfZG1hKTsKKwkJcXVldWVfd3JpdGVsKHF1ZXVlLCBUQlFQLCAodTMyKShxdWV1ZS0+dHhfcmluZ19kbWEpKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJCXF1ZXVlX3dyaXRlbChxdWV1ZSwgVEJRUEgsICh1MzIpKHF1ZXVlLT50eF9yaW5nX2RtYSA+PiAzMikpOworI2VuZGlmCiAKIAkJLyogRW5hYmxlIGludGVycnVwdHMgKi8KIAkJcXVldWVfd3JpdGVsKHF1ZXVlLCBJRVIsCkBAIC0yMzAzLDcgKzIzNTUsOCBAQAogfQogCiBzdGF0aWMgaW50IG1hY2JfY2xrX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGNsayAqKnBjbGssCi0JCQkgc3RydWN0IGNsayAqKmhjbGssIHN0cnVjdCBjbGsgKip0eF9jbGspCisJCQkgc3RydWN0IGNsayAqKmhjbGssIHN0cnVjdCBjbGsgKip0eF9jbGssCisJCQkgc3RydWN0IGNsayAqKnJ4X2NsaykKIHsKIAlpbnQgZXJyOwogCkBAIC0yMzI1LDYgKzIzNzgsMTAgQEAKIAlpZiAoSVNfRVJSKCp0eF9jbGspKQogCQkqdHhfY2xrID0gTlVMTDsKIAorCSpyeF9jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInJ4X2NsayIpOworCWlmIChJU19FUlIoKnJ4X2NsaykpCisJCSpyeF9jbGsgPSBOVUxMOworCiAJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKCpwY2xrKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgcGNsayAoJXUpXG4iLCBlcnIpOwpAQCAtMjM0Myw4ICsyNDAwLDE3IEBACiAJCWdvdG8gZXJyX2Rpc2FibGVfaGNsazsKIAl9CiAKKwllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoKnJ4X2Nsayk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIHJ4X2NsayAoJXUpXG4iLCBlcnIpOworCQlnb3RvIGVycl9kaXNhYmxlX3R4Y2xrOworCX0KKwogCXJldHVybiAwOwogCitlcnJfZGlzYWJsZV90eGNsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoKnR4X2Nsayk7CisKIGVycl9kaXNhYmxlX2hjbGs6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKCpoY2xrKTsKIApAQCAtMjM3OSw2ICsyNDQ1LDkgQEAKIAkJCXF1ZXVlLT5JRFIgID0gR0VNX0lEUihod19xIC0gMSk7CiAJCQlxdWV1ZS0+SU1SICA9IEdFTV9JTVIoaHdfcSAtIDEpOwogCQkJcXVldWUtPlRCUVAgPSBHRU1fVEJRUChod19xIC0gMSk7CisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCQkJcXVldWUtPlRCUVBIID0gR0VNX1RCUVBIKGh3X3EgLTEpOworI2VuZGlmCiAJCX0gZWxzZSB7CiAJCQkvKiBxdWV1ZTAgdXNlcyBsZWdhY3kgcmVnaXN0ZXJzICovCiAJCQlxdWV1ZS0+SVNSICA9IE1BQ0JfSVNSOwpAQCAtMjM4Niw2ICsyNDU1LDkgQEAKIAkJCXF1ZXVlLT5JRFIgID0gTUFDQl9JRFI7CiAJCQlxdWV1ZS0+SU1SICA9IE1BQ0JfSU1SOwogCQkJcXVldWUtPlRCUVAgPSBNQUNCX1RCUVA7CisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCQkJcXVldWUtPlRCUVBIID0gTUFDQl9UQlFQSDsKKyNlbmRpZgogCQl9CiAKIAkJLyogZ2V0IGlycTogaGVyZSB3ZSB1c2UgdGhlIGxpbnV4IHF1ZXVlIGluZGV4LCBub3QgdGhlIGhhcmR3YXJlCkBAIC0yNzI4LDEyICsyODAwLDE0IEBACiB9OwogCiBzdGF0aWMgaW50IGF0OTFldGhlcl9jbGtfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgY2xrICoqcGNsaywKLQkJCSAgICAgIHN0cnVjdCBjbGsgKipoY2xrLCBzdHJ1Y3QgY2xrICoqdHhfY2xrKQorCQkJICAgICAgc3RydWN0IGNsayAqKmhjbGssIHN0cnVjdCBjbGsgKip0eF9jbGssCisJCQkgICAgICBzdHJ1Y3QgY2xrICoqcnhfY2xrKQogewogCWludCBlcnI7CiAKIAkqaGNsayA9IE5VTEw7CiAJKnR4X2NsayA9IE5VTEw7CisJKnJ4X2NsayA9IE5VTEw7CiAKIAkqcGNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiZXRoZXJfY2xrIik7CiAJaWYgKElTX0VSUigqcGNsaykpCkBAIC0yODU3LDEzICsyOTMxLDEzIEBACiBzdGF0aWMgaW50IG1hY2JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgKCpjbGtfaW5pdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqLCBzdHJ1Y3QgY2xrICoqLAotCQkJc3RydWN0IGNsayAqKiwgc3RydWN0IGNsayAqKikKKwkJCXN0cnVjdCBjbGsgKiosIHN0cnVjdCBjbGsgKiosICBzdHJ1Y3QgY2xrICoqKQogCQkJCQkgICAgICA9IG1hY2JfY2xrX2luaXQ7CiAJaW50ICgqaW5pdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKSA9IG1hY2JfaW5pdDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlICpwaHlfbm9kZTsKIAljb25zdCBzdHJ1Y3QgbWFjYl9jb25maWcgKm1hY2JfY29uZmlnID0gTlVMTDsKLQlzdHJ1Y3QgY2xrICpwY2xrLCAqaGNsayA9IE5VTEwsICp0eF9jbGsgPSBOVUxMOworCXN0cnVjdCBjbGsgKnBjbGssICpoY2xrID0gTlVMTCwgKnR4X2NsayA9IE5VTEwsICpyeF9jbGsgPSBOVUxMOwogCXVuc2lnbmVkIGludCBxdWV1ZV9tYXNrLCBudW1fcXVldWVzOwogCXN0cnVjdCBtYWNiX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCWJvb2wgbmF0aXZlX2lvOwpAQCAtMjg5MSw3ICsyOTY1LDcgQEAKIAkJfQogCX0KIAotCWVyciA9IGNsa19pbml0KHBkZXYsICZwY2xrLCAmaGNsaywgJnR4X2Nsayk7CisJZXJyID0gY2xrX2luaXQocGRldiwgJnBjbGssICZoY2xrLCAmdHhfY2xrLCAmcnhfY2xrKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yOTI3LDYgKzMwMDEsNyBAQAogCWJwLT5wY2xrID0gcGNsazsKIAlicC0+aGNsayA9IGhjbGs7CiAJYnAtPnR4X2NsayA9IHR4X2NsazsKKwlicC0+cnhfY2xrID0gcnhfY2xrOwogCWlmIChtYWNiX2NvbmZpZykKIAkJYnAtPmp1bWJvX21heF9sZW4gPSBtYWNiX2NvbmZpZy0+anVtYm9fbWF4X2xlbjsKIApAQCAtMjkzNSw2ICszMDEwLDExIEBACiAJCWJwLT53b2wgfD0gTUFDQl9XT0xfSEFTX01BR0lDX1BBQ0tFVDsKIAlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgYnAtPndvbCAmIE1BQ0JfV09MX0hBU19NQUdJQ19QQUNLRVQpOwogCisjaWZkZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCWlmIChHRU1fQkZFWFQoREJXREVGLCBnZW1fcmVhZGwoYnAsIERDRkcxKSkgPiBHRU1fREJXMzIpCisJCWRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soNDQpKTsKKyNlbmRpZgorCiAJc3Bpbl9sb2NrX2luaXQoJmJwLT5sb2NrKTsKIAogCS8qIHNldHVwIGNhcGFiaWxpdGllcyAqLwpAQCAtMjk0NSw3ICszMDI1LDcgQEAKIAlkZXYtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJaWYgKGRldi0+aXJxIDwgMCkgewogCQllcnIgPSBkZXYtPmlycTsKLQkJZ290byBlcnJfZGlzYWJsZV9jbG9ja3M7CisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKIAl9CiAKIAltYWMgPSBvZl9nZXRfbWFjX2FkZHJlc3MobnApOwpAQCAtMzAyMCw2ICszMTAwLDcgQEAKIAljbGtfZGlzYWJsZV91bnByZXBhcmUodHhfY2xrKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoaGNsayk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBjbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShyeF9jbGspOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTMwNDYsNiArMzEyNyw3IEBACiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShicC0+dHhfY2xrKTsKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGJwLT5oY2xrKTsKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGJwLT5wY2xrKTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGJwLT5yeF9jbGspOwogCQlmcmVlX25ldGRldihkZXYpOwogCX0KIApAQCAtMzA2OSw2ICszMTUxLDcgQEAKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGJwLT50eF9jbGspOwogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYnAtPmhjbGspOwogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYnAtPnBjbGspOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYnAtPnJ4X2Nsayk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zMDg4LDYgKzMxNzEsNyBAQAogCQljbGtfcHJlcGFyZV9lbmFibGUoYnAtPnBjbGspOwogCQljbGtfcHJlcGFyZV9lbmFibGUoYnAtPmhjbGspOwogCQljbGtfcHJlcGFyZV9lbmFibGUoYnAtPnR4X2Nsayk7CisJCWNsa19wcmVwYXJlX2VuYWJsZShicC0+cnhfY2xrKTsKIAl9CiAKIAluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL21hY2IuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5oCmluZGV4IGI2ZmNmMTAuLjhiZWQ0YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5oCkBAIC02Niw2ICs2Niw4IEBACiAjZGVmaW5lIE1BQ0JfVVNSSU8JCTB4MDBjMAogI2RlZmluZSBNQUNCX1dPTAkJMHgwMGM0CiAjZGVmaW5lIE1BQ0JfTUlECQkweDAwZmMKKyNkZWZpbmUgTUFDQl9UQlFQSAkJMHgwNEM4CisjZGVmaW5lIE1BQ0JfUkJRUEgJCTB4MDRENAogCiAvKiBHRU0gcmVnaXN0ZXIgb2Zmc2V0cy4gKi8KICNkZWZpbmUgR0VNX05DRkdSCQkweDAwMDQgLyogTmV0d29yayBDb25maWcgKi8KQEAgLTEzOSw2ICsxNDEsNyBAQAogCiAjZGVmaW5lIEdFTV9JU1IoaHdfcSkJCSgweDA0MDAgKyAoKGh3X3EpIDw8IDIpKQogI2RlZmluZSBHRU1fVEJRUChod19xKQkJKDB4MDQ0MCArICgoaHdfcSkgPDwgMikpCisjZGVmaW5lIEdFTV9UQlFQSChod19xKQkJKDB4MDRDOCkKICNkZWZpbmUgR0VNX1JCUVAoaHdfcSkJCSgweDA0ODAgKyAoKGh3X3EpIDw8IDIpKQogI2RlZmluZSBHRU1fSUVSKGh3X3EpCQkoMHgwNjAwICsgKChod19xKSA8PCAyKSkKICNkZWZpbmUgR0VNX0lEUihod19xKQkJKDB4MDYyMCArICgoaHdfcSkgPDwgMikpCkBAIC0yNDksNiArMjUyLDggQEAKICNkZWZpbmUgR0VNX1JYQlNfU0laRQkJOAogI2RlZmluZSBHRU1fRERSUF9PRkZTRVQJCTI0IC8qIGRpc2Nfd2hlbl9ub19haGIgKi8KICNkZWZpbmUgR0VNX0REUlBfU0laRQkJMQorI2RlZmluZSBHRU1fQUREUjY0X09GRlNFVAkzMCAvKiBBZGRyZXNzIGJ1cyB3aWR0aCAtIDY0YiBvciAzMmIgKi8KKyNkZWZpbmUgR0VNX0FERFI2NF9TSVpFCQkxCiAKIAogLyogQml0ZmllbGRzIGluIE5TUiAqLwpAQCAtNDc0LDYgKzQ3OSwxMCBAQAogc3RydWN0IG1hY2JfZG1hX2Rlc2MgewogCXUzMglhZGRyOwogCXUzMgljdHJsOworI2lmZGVmIENPTkZJR19BUkNIX0RNQV9BRERSX1RfNjRCSVQKKwl1MzIgICAgIGFkZHJoOworCXUzMiAgICAgcmVzdmQ7CisjZW5kaWYKIH07CiAKIC8qIERNQSBkZXNjcmlwdG9yIGJpdGZpZWxkcyAqLwpAQCAtNzYzLDcgKzc3Miw4IEBACiAJdTMyCQkJY2FwczsKIAl1bnNpZ25lZCBpbnQJCWRtYV9idXJzdF9sZW5ndGg7CiAJaW50CSgqY2xrX2luaXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBjbGsgKipwY2xrLAotCQkJICAgIHN0cnVjdCBjbGsgKipoY2xrLCBzdHJ1Y3QgY2xrICoqdHhfY2xrKTsKKwkJCSAgICBzdHJ1Y3QgY2xrICoqaGNsaywgc3RydWN0IGNsayAqKnR4X2NsaywKKwkJCSAgICBzdHJ1Y3QgY2xrICoqcnhfY2xrKTsKIAlpbnQJKCppbml0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIAlpbnQJanVtYm9fbWF4X2xlbjsKIH07CkBAIC03NzcsNiArNzg3LDcgQEAKIAl1bnNpZ25lZCBpbnQJCUlEUjsKIAl1bnNpZ25lZCBpbnQJCUlNUjsKIAl1bnNpZ25lZCBpbnQJCVRCUVA7CisJdW5zaWduZWQgaW50CQlUQlFQSDsKIAogCXVuc2lnbmVkIGludAkJdHhfaGVhZCwgdHhfdGFpbDsKIAlzdHJ1Y3QgbWFjYl9kbWFfZGVzYwkqdHhfcmluZzsKQEAgLTgwOSw2ICs4MjAsNyBAQAogCXN0cnVjdCBjbGsJCSpwY2xrOwogCXN0cnVjdCBjbGsJCSpoY2xrOwogCXN0cnVjdCBjbGsJCSp0eF9jbGs7CisJc3RydWN0IGNsawkJKnJ4X2NsazsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwogCXN0cnVjdCBuYXBpX3N0cnVjdAluYXBpOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzCXN0YXRzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vS2NvbmZpZwppbmRleCAwZWYyMzJkLi45MmY0MTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vS2NvbmZpZwpAQCAtMzYsMTAgKzM2LDIwIEBACiAJZGVwZW5kcyBvbiA2NEJJVAogCXNlbGVjdCBQSFlMSUIKIAlzZWxlY3QgTURJT19USFVOREVSCisJc2VsZWN0IFRIVU5ERVJfTklDX1JHWAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHByb2dyYW1taW5nIGFuZCBjb250cm9sbGluZyBvZiBNQUMKIAkgIGludGVyZmFjZSBmcm9tIE5JQyBwaHlzaWNhbCBmdW5jdGlvbiBkcml2ZXIuCiAKK2NvbmZpZwlUSFVOREVSX05JQ19SR1gKKwl0cmlzdGF0ZSAiVGh1bmRlciBNQUMgaW50ZXJmYWNlIGRyaXZlciAoUkdYKSIKKwlkZXBlbmRzIG9uIDY0QklUCisJc2VsZWN0IFBIWUxJQgorCXNlbGVjdCBNRElPX1RIVU5ERVIKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBjb25maWd1cmluZyBYQ1YgYmxvY2sgb2YgUkdYIGludGVyZmFjZQorCSAgcHJlc2VudCBvbiBDTjgxWFggY2hpcC4KKwogY29uZmlnIExJUVVJRElPCiAJdHJpc3RhdGUgIkNhdml1bSBMaXF1aWRJTyBzdXBwb3J0IgogCWRlcGVuZHMgb24gNjRCSVQKQEAgLTQ4LDcgKzU4LDcgQEAKIAlzZWxlY3QgTElCQ1JDMzJDCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgQ2F2aXVtIExpcXVpZElPIEludGVsbGlnZW50IFNlcnZlciBBZGFwdGVycwotCSAgYmFzZWQgb24gQ042NlhYIGFuZCBDTjY4WFggY2hpcHMuCisJICBiYXNlZCBvbiBDTjY2WFgsIENONjhYWCBhbmQgQ04yM1hYIGNoaXBzLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBsaXF1aWRpby4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vTWFrZWZpbGUKaW5kZXggMmYzNjY4MC4uNWEyN2IyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9NYWtlZmlsZQpAQCAtMywxNCArMywxNiBAQAogIwogb2JqLSQoQ09ORklHX0xJUVVJRElPKSArPSBsaXF1aWRpby5vCiAKLWxpcXVpZGlvLW9ianMgOj0gbGlvX21haW4ubyAgXAotCSAgICAgIGxpb19ldGh0b29sLm8gICAgICBcCi0JICAgICAgcmVxdWVzdF9tYW5hZ2VyLm8gIFwKLQkgICAgICByZXNwb25zZV9tYW5hZ2VyLm8gXAotCSAgICAgIG9jdGVvbl9kZXZpY2UubyAgICBcCi0JICAgICAgY242Nnh4X2RldmljZS5vICAgIFwKLQkgICAgICBjbjY4eHhfZGV2aWNlLm8gICAgXAotCSAgICAgIG9jdGVvbl9tZW1fb3BzLm8gICBcCi0JICAgICAgb2N0ZW9uX2Ryb3EubyAgICAgIFwKLQkgICAgICBvY3Rlb25fY29uc29sZS5vICAgXAotCSAgICAgIG9jdGVvbl9uaWMubworbGlxdWlkaW8tJChDT05GSUdfTElRVUlESU8pICs9IGxpb19ldGh0b29sLm8gXAorCQkJbGlvX2NvcmUubyAgICAgICAgIFwKKwkJCXJlcXVlc3RfbWFuYWdlci5vICBcCisJCQlyZXNwb25zZV9tYW5hZ2VyLm8gXAorCQkJb2N0ZW9uX2RldmljZS5vICAgIFwKKwkJCWNuNjZ4eF9kZXZpY2UubyAgICBcCisJCQljbjY4eHhfZGV2aWNlLm8gICAgXAorCQkJY24yM3h4X3BmX2RldmljZS5vIFwKKwkJCW9jdGVvbl9tZW1fb3BzLm8gICBcCisJCQlvY3Rlb25fZHJvcS5vICAgICAgXAorCQkJb2N0ZW9uX25pYy5vCisKK2xpcXVpZGlvLW9ianMgOj0gbGlvX21haW4ubyBvY3Rlb25fY29uc29sZS5vICQobGlxdWlkaW8teSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjIzeHhfcGZfZGV2aWNlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY24yM3h4X3BmX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZGIxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY24yM3h4X3BmX2RldmljZS5jCkBAIC0wLDAgKzEsMTIzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQXV0aG9yOiBDYXZpdW0sIEluYy4KKyoKKyogQ29udGFjdDogc3VwcG9ydEBjYXZpdW0uY29tCisqICAgICAgICAgIFBsZWFzZSBpbmNsdWRlICJMaXF1aWRJTyIgaW4gdGhlIHN1YmplY3QuCisqCisqIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENhdml1bSwgSW5jLgorKgorKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKgorKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisqIEFTLUlTIGFuZCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyogZGV0YWlscy4KKyoKKyogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorKiBDb250YWN0IENhdml1bSwgSW5jLiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlICJsaXF1aWRpb19jb21tb24uaCIKKyNpbmNsdWRlICJvY3Rlb25fZHJvcS5oIgorI2luY2x1ZGUgIm9jdGVvbl9pcS5oIgorI2luY2x1ZGUgInJlc3BvbnNlX21hbmFnZXIuaCIKKyNpbmNsdWRlICJvY3Rlb25fZGV2aWNlLmgiCisjaW5jbHVkZSAiY24yM3h4X3BmX2RldmljZS5oIgorI2luY2x1ZGUgIm9jdGVvbl9tYWluLmgiCisKKyNkZWZpbmUgUkVTRVRfTk9URE9ORSAwCisjZGVmaW5lIFJFU0VUX0RPTkUgMQorCisvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIFNMSSBQYWNrZXQgSW5wdXQgSmFiYmVyIFJlZ2lzdGVyIHRvIGFsbG93CisgKiBWWExBTiBUU08gcGFja2V0cyB3aGljaCBjYW4gYmUgNjQ0MjQgYnl0ZXMsIGV4Y2VlZGluZyB0aGUKKyAqIE1BWF9HU09fU0laRSB3ZSBzdXBwbGllZCB0byB0aGUga2VybmVsCisgKi8KKyNkZWZpbmUgQ04yM1hYX0lOUFVUX0pBQkJFUiA2NDYwMAorCisjZGVmaW5lIExJT0xVVF9SSU5HX0RJU1RSSUJVVElPTiA5Citjb25zdCBpbnQgbGlvbHV0X251bV92ZnNfdG9fcmluZ3NfcGVyX3ZmW0xJT0xVVF9SSU5HX0RJU1RSSUJVVElPTl0gPSB7CisJMCwgOCwgNCwgMiwgMiwgMiwgMSwgMSwgMQorfTsKKwordm9pZCBjbjIzeHhfZHVtcF9wZl9pbml0aWFsaXplZF9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJaW50IGkgPSAwOworCXUzMiByZWd2YWwgPSAwOworCXN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICpjbjIzeHggPSAoc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKilvY3QtPmNoaXA7CisKKwkvKkluIGNuMjN4eF9zb2Z0X3Jlc2V0Ki8KKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglbGx4XG4iLAorCQkiQ04yM1hYX1dJTl9XUl9NQVNLX1JFRyIsIENWTV9DQVNUNjQoQ04yM1hYX1dJTl9XUl9NQVNLX1JFRyksCisJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfV0lOX1dSX01BU0tfUkVHKSkpOworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJDTjIzWFhfU0xJX1NDUkFUQ0gxIiwgQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX1NDUkFUQ0gxKSwKKwkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfU0NSQVRDSDEpKSk7CisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJIkNOMjNYWF9SU1RfU09GVF9SU1QiLCBDTjIzWFhfUlNUX1NPRlRfUlNULAorCQlsaW9fcGNpX3JlYWRxKG9jdCwgQ04yM1hYX1JTVF9TT0ZUX1JTVCkpOworCisJLypJbiBjbjIzeHhfc2V0X2RwaV9yZWdzKi8KKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiQ04yM1hYX0RQSV9ETUFfQ09OVFJPTCIsIENOMjNYWF9EUElfRE1BX0NPTlRST0wsCisJCWxpb19wY2lfcmVhZHEob2N0LCBDTjIzWFhfRFBJX0RNQV9DT05UUk9MKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9EUElfRE1BX0VOR19FTkIiLCBpLAorCQkJQ04yM1hYX0RQSV9ETUFfRU5HX0VOQihpKSwKKwkJCWxpb19wY2lfcmVhZHEob2N0LCBDTjIzWFhfRFBJX0RNQV9FTkdfRU5CKGkpKSk7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9EUElfRE1BX0VOR19CVUYiLCBpLAorCQkJQ04yM1hYX0RQSV9ETUFfRU5HX0JVRihpKSwKKwkJCWxpb19wY2lfcmVhZHEob2N0LCBDTjIzWFhfRFBJX0RNQV9FTkdfQlVGKGkpKSk7CisJfQorCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JTAxNmxseFxuIiwgIkNOMjNYWF9EUElfQ1RMIiwKKwkJQ04yM1hYX0RQSV9DVEwsIGxpb19wY2lfcmVhZHEob2N0LCBDTjIzWFhfRFBJX0NUTCkpOworCisJLypJbiBjbjIzeHhfc2V0dXBfcGNpZV9tcHMgYW5kIGNuMjN4eF9zZXR1cF9wY2llX21ycnMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQob2N0LT5wY2lfZGV2LCBDTjIzWFhfQ09ORklHX1BDSUVfREVWQ1RMLCAmcmVndmFsKTsKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNUTCIsCisJCUNWTV9DQVNUNjQoQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNUTCksIENWTV9DQVNUNjQocmVndmFsKSk7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJIkNOMjNYWF9EUElfU0xJX1BSVFhfQ0ZHIiwgb2N0LT5wY2llX3BvcnQsCisJCUNOMjNYWF9EUElfU0xJX1BSVFhfQ0ZHKG9jdC0+cGNpZV9wb3J0KSwKKwkJbGlvX3BjaV9yZWFkcShvY3QsIENOMjNYWF9EUElfU0xJX1BSVFhfQ0ZHKG9jdC0+cGNpZV9wb3J0KSkpOworCisJLypJbiBjbjIzeHhfc3BlY2lmaWNfcmVnc19zZXR1cCAqLworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiQ04yM1hYX1NMSV9TMk1fUE9SVFhfQ1RMIiwgb2N0LT5wY2llX3BvcnQsCisJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9TMk1fUE9SVFhfQ1RMKG9jdC0+cGNpZV9wb3J0KSksCisJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQoCisJCQlvY3QsIENOMjNYWF9TTElfUzJNX1BPUlRYX0NUTChvY3QtPnBjaWVfcG9ydCkpKSk7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkiQ04yM1hYX1NMSV9SSU5HX1JTVCIsIENWTV9DQVNUNjQoQ04yM1hYX1NMSV9QS1RfSU9RX1JJTkdfUlNUKSwKKwkJKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfUEtUX0lPUV9SSU5HX1JTVCkpOworCisJLypJbiBjbjIzeHhfc2V0dXBfZ2xvYmFsX21hY19yZWdzKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9NQUNTOyBpKyspIHsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NChpLCBvY3QtPnBmX251bSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NAorCQkJCShvY3QsIENOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0CisJCQkJCShpLCBvY3QtPnBmX251bSkpKSk7CisJfQorCisJLypJbiBjbjIzeHhfc2V0dXBfZ2xvYmFsX2lucHV0X3JlZ3MqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUzsgaSsrKSB7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NCIsIGksCisJCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0CisJCQkJKG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KGkpKSkpOworCX0KKworCS8qSW4gY24yM3h4X3NldHVwX2dsb2JhbF9vdXRwdXRfcmVncyovCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJIkNOMjNYWF9TTElfT1FfV01BUksiLCBDVk1fQ0FTVDY0KENOMjNYWF9TTElfT1FfV01BUkspLAorCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9PUV9XTUFSSykpKTsKKworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVM7IGkrKykgeworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MIiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcigKKwkJCQlvY3QsIENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0woaSkpKSk7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFMiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTKGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJb2N0LCBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTKGkpKSkpOworCX0KKworCS8qSW4gY24yM3h4X2VuYWJsZV9pbnRlcnJ1cHQgYW5kIGNuMjN4eF9kaXNhYmxlX2ludGVycnVwdCovCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJImNuMjN4eC0+aW50cl9lbmJfcmVnNjQiLAorCQlDVk1fQ0FTVDY0KChsb25nKShjbjIzeHgtPmludHJfZW5iX3JlZzY0KSksCisJCUNWTV9DQVNUNjQocmVhZHEoY24yM3h4LT5pbnRyX2VuYl9yZWc2NCkpKTsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJjbjIzeHgtPmludHJfc3VtX3JlZzY0IiwKKwkJQ1ZNX0NBU1Q2NCgobG9uZykoY24yM3h4LT5pbnRyX3N1bV9yZWc2NCkpLAorCQlDVk1fQ0FTVDY0KHJlYWRxKGNuMjN4eC0+aW50cl9zdW1fcmVnNjQpKSk7CisKKwkvKkluIGNuMjN4eF9zZXR1cF9pcV9yZWdzKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9JTlBVVF9RVUVVRVM7IGkrKykgeworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX0lRX0JBU0VfQUREUjY0IiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9JUV9CQVNFX0FERFI2NChpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCW9jdCwgQ04yM1hYX1NMSV9JUV9CQVNFX0FERFI2NChpKSkpKTsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9JUV9TSVpFIiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9JUV9TSVpFKGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyCisJCQkJKG9jdCwgQ04yM1hYX1NMSV9JUV9TSVpFKGkpKSkpOworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX0lRX0RPT1JCRUxMIiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9JUV9ET09SQkVMTChpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCW9jdCwgQ04yM1hYX1NMSV9JUV9ET09SQkVMTChpKSkpKTsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9JUV9JTlNUUl9DT1VOVDY0IiwgaSwKKwkJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9JUV9JTlNUUl9DT1VOVDY0KGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJb2N0LCBDTjIzWFhfU0xJX0lRX0lOU1RSX0NPVU5UNjQoaSkpKSk7CisJfQorCisJLypJbiBjbjIzeHhfc2V0dXBfb3FfcmVncyovCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUzsgaSsrKSB7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfT1FfQkFTRV9BRERSNjQiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX09RX0JBU0VfQUREUjY0KGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJb2N0LCBDTjIzWFhfU0xJX09RX0JBU0VfQUREUjY0KGkpKSkpOworCQlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzKCVkKVslbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJCSJDTjIzWFhfU0xJX09RX1NJWkUiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX09RX1NJWkUoaSkpLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3IKKwkJCQkob2N0LCBDTjIzWFhfU0xJX09RX1NJWkUoaSkpKSk7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfT1FfQlVGRl9JTkZPX1NJWkUiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX09RX0JVRkZfSU5GT19TSVpFKGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyKAorCQkJCW9jdCwgQ04yM1hYX1NMSV9PUV9CVUZGX0lORk9fU0laRShpKSkpKTsKKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyglZClbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCQkiQ04yM1hYX1NMSV9PUV9QS1RTX1NFTlQiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX09RX1BLVFNfU0VOVChpKSksCisJCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCW9jdCwgQ04yM1hYX1NMSV9PUV9QS1RTX1NFTlQoaSkpKSk7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMoJWQpWyVsbHhdIDogMHglMDE2bGx4XG4iLAorCQkJIkNOMjNYWF9TTElfT1FfUEtUU19DUkVESVQiLCBpLAorCQkJQ1ZNX0NBU1Q2NChDTjIzWFhfU0xJX09RX1BLVFNfQ1JFRElUKGkpKSwKKwkJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJb2N0LCBDTjIzWFhfU0xJX09RX1BLVFNfQ1JFRElUKGkpKSkpOworCX0KKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXNbJWxseF0gOiAweCUwMTZsbHhcbiIsCisJCSJDTjIzWFhfU0xJX1BLVF9USU1FX0lOVCIsCisJCUNWTV9DQVNUNjQoQ04yM1hYX1NMSV9QS1RfVElNRV9JTlQpLAorCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9QS1RfVElNRV9JTlQpKSk7CisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICIlc1slbGx4XSA6IDB4JTAxNmxseFxuIiwKKwkJIkNOMjNYWF9TTElfUEtUX0NOVF9JTlQiLAorCQlDVk1fQ0FTVDY0KENOMjNYWF9TTElfUEtUX0NOVF9JTlQpLAorCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9QS1RfQ05UX0lOVCkpKTsKK30KKworc3RhdGljIGludCBjbjIzeHhfcGZfc29mdF9yZXNldChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9XSU5fV1JfTUFTS19SRUcsIDB4RkYpOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJPQ1RFT05bJWRdOiBCSVNUIGVuYWJsZWQgZm9yIENOMjNYWCBzb2Z0IHJlc2V0XG4iLAorCQlvY3QtPm9jdGVvbl9pZCk7CisKKwlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1NDUkFUQ0gxLCAweDEyMzRVTEwpOworCisJLyogSW5pdGlhdGUgY2hpcC13aWRlIHNvZnQgcmVzZXQgKi8KKwlsaW9fcGNpX3JlYWRxKG9jdCwgQ04yM1hYX1JTVF9TT0ZUX1JTVCk7CisJbGlvX3BjaV93cml0ZXEob2N0LCAxLCBDTjIzWFhfUlNUX1NPRlRfUlNUKTsKKworCS8qIFdhaXQgZm9yIDEwMG1zIGFzIE9jdGVvbiByZXNldHMuICovCisJbWRlbGF5KDEwMCk7CisKKwlpZiAob2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1NDUkFUQ0gxKSA9PSAweDEyMzRVTEwpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJPQ1RFT05bJWRdOiBTb2Z0IHJlc2V0IGZhaWxlZFxuIiwKKwkJCW9jdC0+b2N0ZW9uX2lkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJPQ1RFT05bJWRdOiBSZXNldCBjb21wbGV0ZWRcbiIsCisJCW9jdC0+b2N0ZW9uX2lkKTsKKworCS8qIHJlc3RvcmUgdGhlICByZXNldCB2YWx1ZSovCisJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1dJTl9XUl9NQVNLX1JFRywgMHhGRik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY24yM3h4X2VuYWJsZV9lcnJvcl9yZXBvcnRpbmcoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl1MzIgcmVndmFsOworCXUzMiB1bmNvcnJlY3RhYmxlX2Vycl9tYXNrLCBjb3JydGFibGVfZXJyX3N0YXR1czsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChvY3QtPnBjaV9kZXYsIENOMjNYWF9DT05GSUdfUENJRV9ERVZDVEwsICZyZWd2YWwpOworCWlmIChyZWd2YWwgJiBDTjIzWFhfQ09ORklHX1BDSUVfREVWQ1RMX01BU0spIHsKKwkJdW5jb3JyZWN0YWJsZV9lcnJfbWFzayA9IDA7CisJCWNvcnJ0YWJsZV9lcnJfc3RhdHVzID0gMDsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG9jdC0+cGNpX2RldiwKKwkJCQkgICAgICBDTjIzWFhfQ09ORklHX1BDSUVfVU5DT1JSRUNUX0VSUl9NQVNLLAorCQkJCSAgICAgICZ1bmNvcnJlY3RhYmxlX2Vycl9tYXNrKTsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG9jdC0+cGNpX2RldiwKKwkJCQkgICAgICBDTjIzWFhfQ09ORklHX1BDSUVfQ09SUkVDVF9FUlJfU1RBVFVTLAorCQkJCSAgICAgICZjb3JydGFibGVfZXJyX3N0YXR1cyk7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiUENJLUUgRmF0YWwgZXJyb3IgZGV0ZWN0ZWQ7XG4iCisJCQkJICJcdGRldl9jdGxfc3RhdHVzX3JlZyA9IDB4JTA4eFxuIgorCQkJCSAiXHR1bmNvcnJlY3RhYmxlX2Vycm9yX21hc2tfcmVnID0gMHglMDh4XG4iCisJCQkJICJcdGNvcnJlY3RhYmxlX2Vycm9yX3N0YXR1c19yZWcgPSAweCUwOHhcbiIsCisJCQkgICAgcmVndmFsLCB1bmNvcnJlY3RhYmxlX2Vycl9tYXNrLAorCQkJICAgIGNvcnJ0YWJsZV9lcnJfc3RhdHVzKTsKKwl9CisKKwlyZWd2YWwgfD0gMHhmOyAvKiBFbmFibGUgTGluayBlcnJvciByZXBvcnRpbmcgKi8KKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiT0NURU9OWyVkXTogRW5hYmxpbmcgUENJLUUgZXJyb3IgcmVwb3J0aW5nLi5cbiIsCisJCW9jdC0+b2N0ZW9uX2lkKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG9jdC0+cGNpX2RldiwgQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNUTCwgcmVndmFsKTsKK30KKworc3RhdGljIHUzMiBjbjIzeHhfY29wcm9jZXNzb3JfY2xvY2soc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwkvKiBCaXRzIDI5OjI0IG9mIFJTVF9CT09UW1BOUl9NVUxdIGhvbGRzIHRoZSByZWYuY2xvY2sgTVVMVElQTElFUgorCSAqIGZvciBTTEkuCisJICovCisKKwkvKiBUQkQ6IGdldCB0aGUgaW5mbyBpbiBIYW5kLXNoYWtlICovCisJcmV0dXJuICgoKGxpb19wY2lfcmVhZHEob2N0LCBDTjIzWFhfUlNUX0JPT1QpID4+IDI0KSAmIDB4M2YpICogNTApOworfQorCit1MzIgY24yM3h4X3BmX2dldF9vcV90aWNrcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1MzIgdGltZV9pbnRyX2luX3VzKQoreworCS8qIFRoaXMgZ2l2ZXMgdGhlIFNMSSBjbG9jayBwZXIgbWljcm9zZWMgKi8KKwl1MzIgb3F0aWNrc19wZXJfdXMgPSBjbjIzeHhfY29wcm9jZXNzb3JfY2xvY2sob2N0KTsKKworCW9jdC0+cGZ2Zl9oc3dvcmQuY29wcm9jX3RpY3NfcGVyX3VzID0gb3F0aWNrc19wZXJfdXM7CisKKwkvKiBUaGlzIGdpdmVzIHRoZSBjbG9jayBjeWNsZXMgcGVyIG1pbGxpc2Vjb25kICovCisJb3F0aWNrc19wZXJfdXMgKj0gMTAwMDsKKworCS8qIFRoaXMgZ2l2ZXMgdGhlIG9xIHRpY2tzICgxMDI0IGNvcmUgY2xvY2sgY3ljbGVzKSBwZXIgbWlsbGlzZWNvbmQgKi8KKwlvcXRpY2tzX3Blcl91cyAvPSAxMDI0OworCisJLyogdGltZV9pbnRyIGlzIGluIG1pY3Jvc2Vjb25kcy4gVGhlIG5leHQgMiBzdGVwcyBnaXZlcyB0aGUgb3EgdGlja3MKKwkgKiAgY29ycmVzc3BvbmRpbmcgdG8gdGltZV9pbnRyLgorCSAqLworCW9xdGlja3NfcGVyX3VzICo9IHRpbWVfaW50cl9pbl91czsKKwlvcXRpY2tzX3Blcl91cyAvPSAxMDAwOworCisJcmV0dXJuIG9xdGlja3NfcGVyX3VzOworfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfc2V0dXBfZ2xvYmFsX21hY19yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdTY0IHJlZ192YWw7CisJdTE2IG1hY19ubyA9IG9jdC0+cGNpZV9wb3J0OworCXUxNiBwZl9udW0gPSBvY3QtPnBmX251bTsKKworCS8qIHByb2dyYW1taW5nIFNSTiBhbmQgVFJTIGZvciBlYWNoIE1BQygwLi4zKSAgKi8KKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXM6VXNpbmcgcGNpZSBwb3J0ICVkXG4iLAorCQlfX2Z1bmNfXywgbWFjX25vKTsKKwkvKiBCeSBkZWZhdWx0LCBtYXBwaW5nIGFsbCA2NCBJT1FzIHRvICBhIHNpbmdsZSBNQUNzICovCisKKwlyZWdfdmFsID0KKwkgICAgb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NChtYWNfbm8sIHBmX251bSkpOworCisJaWYgKG9jdC0+cmV2X2lkID09IE9DVEVPTl9DTjIzWFhfUkVWXzFfMSkgeworCQkvKiBzZXR0aW5nIFNSTiA8NjowPiAgKi8KKwkJcmVnX3ZhbCA9IHBmX251bSAqIENOMjNYWF9NQVhfUklOR1NfUEVSX1BGX1BBU1NfMV8xOworCX0gZWxzZSB7CisJCS8qIHNldHRpbmcgU1JOIDw2OjA+ICAqLworCQlyZWdfdmFsID0gcGZfbnVtICogQ04yM1hYX01BWF9SSU5HU19QRVJfUEY7CisJfQorCisJLyogc2V0dGluZyBUUlMgPDIzOjE2PiAqLworCXJlZ192YWwgPSByZWdfdmFsIHwKKwkJICAob2N0LT5zcmlvdl9pbmZvLnRycyA8PCBDTjIzWFhfUEtUX01BQ19DVExfUklORk9fVFJTX0JJVF9QT1MpOworCS8qIHdyaXRlIHRoZXNlIHNldHRpbmdzIHRvIE1BQyByZWdpc3RlciAqLworCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0KG1hY19ubywgcGZfbnVtKSwKKwkJCSAgIHJlZ192YWwpOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJTTElfUEtUX01BQyglZClfUEYoJWQpX1JJTkZPIDogMHglMDE2bGx4XG4iLAorCQltYWNfbm8sIHBmX251bSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NAorCQkob2N0LCBDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NChtYWNfbm8sIHBmX251bSkpKTsKK30KKworc3RhdGljIGludCBjbjIzeHhfcmVzZXRfaW9fcXVldWVzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJaW50IHJldF92YWwgPSAwOworCXU2NCBkNjQ7CisJdTMyIHFfbm8sIHNybiwgZXJuOworCXUzMiBsb29wID0gMTAwMDsKKworCXNybiA9IG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm47CisJZXJuID0gc3JuICsgb2N0LT5zcmlvdl9pbmZvLm51bV9wZl9yaW5nczsKKworCS8qQXMgcGVyIEhSTSByZWcgZGVzY3JpcHRpb24sIHMvdyBjYW50IHdyaXRlIDAgdG8gRU5CLiAqLworCS8qdG8gbWFrZSB0aGUgcXVldWUgb2ZmLCBuZWVkIHRvIHNldCB0aGUgUlNUIGJpdC4gKi8KKworCS8qIFJlc2V0IHRoZSBFbmFibGUgYml0IGZvciBhbGwgdGhlIDY0IElRcy4gICovCisJZm9yIChxX25vID0gc3JuOyBxX25vIDwgZXJuOyBxX25vKyspIHsKKwkJLyogc2V0IFJTVCBiaXQgdG8gMS4gVGhpcyBiaXQgYXBwbGllcyB0byBib3RoIElRIGFuZCBPUSAqLworCQlkNjQgPSBvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSk7CisJCWQ2NCA9IGQ2NCB8IENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JTVDsKKwkJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pLCBkNjQpOworCX0KKworCS8qd2FpdCB1bnRpbCB0aGUgUlNUIGJpdCBpcyBjbGVhciBvciB0aGUgUlNUIGFuZCBxdWl0ZSBiaXRzIGFyZSBzZXQqLworCWZvciAocV9ubyA9IHNybjsgcV9ubyA8IGVybjsgcV9ubysrKSB7CisJCXU2NCByZWdfdmFsID0gb2N0ZW9uX3JlYWRfY3NyNjQob2N0LAorCQkJCQlDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpOworCQl3aGlsZSAoKFJFQURfT05DRShyZWdfdmFsKSAmIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JTVCkgJiYKKwkJICAgICAgICEoUkVBRF9PTkNFKHJlZ192YWwpICYgQ04yM1hYX1BLVF9JTlBVVF9DVExfUVVJRVQpICYmCisJCSAgICAgICBsb29wLS0pIHsKKwkJCVdSSVRFX09OQ0UocmVnX3ZhbCwgb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkgICAgb2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpKTsKKwkJfQorCQlpZiAoIWxvb3ApIHsKKwkJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LAorCQkJCSJjbGVhcmluZyB0aGUgcmVzZXQgcmVnIGZhaWxlZCBvciBzZXR0aW5nIHRoZSBxdWlldCByZWcgZmFpbGVkIGZvciBxbm86ICV1XG4iLAorCQkJCXFfbm8pOworCQkJcmV0dXJuIC0xOworCQl9CisJCVdSSVRFX09OQ0UocmVnX3ZhbCwgUkVBRF9PTkNFKHJlZ192YWwpICYKKwkJCX5DTjIzWFhfUEtUX0lOUFVUX0NUTF9SU1QpOworCQlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubyksCisJCQkJICAgUkVBRF9PTkNFKHJlZ192YWwpKTsKKworCQlXUklURV9PTkNFKHJlZ192YWwsIG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJICAgb2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpKTsKKwkJaWYgKFJFQURfT05DRShyZWdfdmFsKSAmIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JTVCkgeworCQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsCisJCQkJImNsZWFyaW5nIHRoZSByZXNldCBmYWlsZWQgZm9yIHFubzogJXVcbiIsCisJCQkJcV9ubyk7CisJCQlyZXRfdmFsID0gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGludCBjbjIzeHhfcGZfc2V0dXBfZ2xvYmFsX2lucHV0X3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl1MzIgcV9ubywgZXJuLCBzcm47CisJdTY0IHBmX251bTsKKwl1NjQgaW50cl90aHJlc2hvbGQsIHJlZ192YWw7CisJc3RydWN0IG9jdGVvbl9pbnN0cl9xdWV1ZSAqaXE7CisJc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKmNuMjN4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqKW9jdC0+Y2hpcDsKKworCXBmX251bSA9IG9jdC0+cGZfbnVtOworCisJc3JuID0gb2N0LT5zcmlvdl9pbmZvLnBmX3NybjsKKwllcm4gPSBzcm4gKyBvY3QtPnNyaW92X2luZm8ubnVtX3BmX3JpbmdzOworCisJaWYgKGNuMjN4eF9yZXNldF9pb19xdWV1ZXMob2N0KSkKKwkJcmV0dXJuIC0xOworCisJLyoqIFNldCB0aGUgTUFDX05VTSBhbmQgUFZGX05VTSBpbiBJUV9QS1RfQ09OVFJPTCByZWcKKwkqIGZvciBhbGwgcXVldWVzLk9ubHkgUEYgY2FuIHNldCB0aGVzZSBiaXRzLgorCSogYml0cyAyOTozMCBpbmRpY2F0ZSB0aGUgTUFDIG51bS4KKwkqIGJpdHMgMzI6NDcgaW5kaWNhdGUgdGhlIFBWRiBudW0uCisJKi8KKwlmb3IgKHFfbm8gPSAwOyBxX25vIDwgZXJuOyBxX25vKyspIHsKKwkJcmVnX3ZhbCA9IG9jdC0+cGNpZV9wb3J0IDw8IENOMjNYWF9QS1RfSU5QVVRfQ1RMX01BQ19OVU1fUE9TOworCQlyZWdfdmFsIHw9IHBmX251bSA8PCBDTjIzWFhfUEtUX0lOUFVUX0NUTF9QRl9OVU1fUE9TOworCisJCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSwKKwkJCQkgICByZWdfdmFsKTsKKwl9CisKKwkvKiBTZWxlY3QgRVMsIFJPLCBOUywgUkRTSVpFLERQVFIgRm9tYXQjMCBmb3IKKwkgKiBwZiBxdWV1ZXMKKwkgKi8KKwlmb3IgKHFfbm8gPSBzcm47IHFfbm8gPCBlcm47IHFfbm8rKykgeworCQl2b2lkIF9faW9tZW0gKmluc3RfY250X3JlZzsKKworCQlpcSA9IG9jdC0+aW5zdHJfcXVldWVbcV9ub107CisJCWlmIChpcSkKKwkJCWluc3RfY250X3JlZyA9IGlxLT5pbnN0X2NudF9yZWc7CisJCWVsc2UKKwkJCWluc3RfY250X3JlZyA9ICh1OCAqKW9jdC0+bW1pb1swXS5od19hZGRyICsKKwkJCQkgICAgICAgQ04yM1hYX1NMSV9JUV9JTlNUUl9DT1VOVDY0KHFfbm8pOworCisJCXJlZ192YWwgPQorCQkgICAgb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubykpOworCisJCXJlZ192YWwgfD0gQ04yM1hYX1BLVF9JTlBVVF9DVExfTUFTSzsKKworCQlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubyksCisJCQkJICAgcmVnX3ZhbCk7CisKKwkJLyogU2V0IFdNQVJLIGxldmVsIGZvciB0cmlnZ2VyaW5nIFBJX0lOVCAqLworCQkvKiBpbnRyX3RocmVzaG9sZCA9IENOMjNYWF9ERUZfSVFfSU5UUl9USFJFU0hPTEQgJiAqLworCQlpbnRyX3RocmVzaG9sZCA9IENGR19HRVRfSVFfSU5UUl9QS1QoY24yM3h4LT5jb25mKSAmCisJCQkJIENOMjNYWF9QS1RfSU5fRE9ORV9XTUFSS19NQVNLOworCisJCXdyaXRlcSgocmVhZHEoaW5zdF9jbnRfcmVnKSAmCisJCQl+KENOMjNYWF9QS1RfSU5fRE9ORV9XTUFSS19NQVNLIDw8CisJCQkgIENOMjNYWF9QS1RfSU5fRE9ORV9XTUFSS19CSVRfUE9TKSkgfAorCQkgICAgICAgKGludHJfdGhyZXNob2xkIDw8IENOMjNYWF9QS1RfSU5fRE9ORV9XTUFSS19CSVRfUE9TKSwKKwkJICAgICAgIGluc3RfY250X3JlZyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfcGZfc2V0dXBfZ2xvYmFsX291dHB1dF9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdTMyIHJlZ192YWw7CisJdTMyIHFfbm8sIGVybiwgc3JuOworCXU2NCB0aW1lX3RocmVzaG9sZDsKKworCXN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICpjbjIzeHggPSAoc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKilvY3QtPmNoaXA7CisKKwlzcm4gPSBvY3QtPnNyaW92X2luZm8ucGZfc3JuOworCWVybiA9IHNybiArIG9jdC0+c3Jpb3ZfaW5mby5udW1fcGZfcmluZ3M7CisKKwlpZiAoQ0ZHX0dFVF9JU19TTElfQlBfT04oY24yM3h4LT5jb25mKSkgeworCQlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX09RX1dNQVJLLCAzMik7CisJfSBlbHNlIHsKKwkJLyoqIFNldCBPdXRwdXQgcXVldWUgd2F0ZXJtYXJrIHRvIDAgdG8gZGlzYWJsZSBiYWNrcHJlc3N1cmUgKi8KKwkJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9PUV9XTUFSSywgMCk7CisJfQorCisJZm9yIChxX25vID0gc3JuOyBxX25vIDwgZXJuOyBxX25vKyspIHsKKwkJcmVnX3ZhbCA9IG9jdGVvbl9yZWFkX2NzcihvY3QsIENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0wocV9ubykpOworCisJCS8qIHNldCBJUFRSICYgRFBUUiAqLworCQlyZWdfdmFsIHw9CisJCSAgICAoQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0lQVFIgfCBDTjIzWFhfUEtUX09VVFBVVF9DVExfRFBUUik7CisKKwkJLyogcmVzZXQgQk1PREUgKi8KKwkJcmVnX3ZhbCAmPSB+KENOMjNYWF9QS1RfT1VUUFVUX0NUTF9CTU9ERSk7CisKKwkJLyogTm8gUmVsYXhlZCBPcmRlcmluZywgTm8gU25vb3AsIDY0LWJpdCBCeXRlIHN3YXAKKwkJICogZm9yIE91dHB1dCBRdWV1ZSBTY2F0dGVyTGlzdAorCQkgKiByZXNldCBST1JfUCwgTlNSX1AKKwkJICovCisJCXJlZ192YWwgJj0gfihDTjIzWFhfUEtUX09VVFBVVF9DVExfUk9SX1ApOworCQlyZWdfdmFsICY9IH4oQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX05TUl9QKTsKKworI2lmZGVmIF9fTElUVExFX0VORElBTl9CSVRGSUVMRAorCQlyZWdfdmFsICY9IH4oQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0VTX1ApOworI2Vsc2UKKwkJcmVnX3ZhbCB8PSAoQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0VTX1ApOworI2VuZGlmCisJCS8qIE5vIFJlbGF4ZWQgT3JkZXJpbmcsIE5vIFNub29wLCA2NC1iaXQgQnl0ZSBzd2FwCisJCSAqIGZvciBPdXRwdXQgUXVldWUgRGF0YQorCQkgKiByZXNldCBST1IsIE5TUgorCQkgKi8KKwkJcmVnX3ZhbCAmPSB+KENOMjNYWF9QS1RfT1VUUFVUX0NUTF9ST1IpOworCQlyZWdfdmFsICY9IH4oQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX05TUik7CisJCS8qIHNldCB0aGUgRVMgYml0ICovCisJCXJlZ192YWwgfD0gKENOMjNYWF9QS1RfT1VUUFVUX0NUTF9FUyk7CisKKwkJLyogd3JpdGUgYWxsIHRoZSBzZWxlY3RlZCBzZXR0aW5ncyAqLworCQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfQ09OVFJPTChxX25vKSwgcmVnX3ZhbCk7CisKKwkJLyogRW5hYmxpbmcgdGhlc2UgaW50ZXJydXB0IGluIG9jdC0+Zm5fbGlzdC5lbmFibGVfaW50ZXJydXB0KCkKKwkJICogcm91dGluZSB3aGljaCBjYWxsZWQgYWZ0ZXIgSU9RIGluaXQuCisJCSAqIFNldCB1cCBpbnRlcnJ1cHQgcGFja2V0IGFuZCB0aW1lIHRocmVzaG9sZHMKKwkJICogZm9yIGFsbCB0aGUgT1FzCisJCSAqLworCQl0aW1lX3RocmVzaG9sZCA9IGNuMjN4eF9wZl9nZXRfb3FfdGlja3MoCisJCSAgICBvY3QsICh1MzIpQ0ZHX0dFVF9PUV9JTlRSX1RJTUUoY24yM3h4LT5jb25mKSk7CisKKwkJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMUyhxX25vKSwKKwkJCQkgICAoQ0ZHX0dFVF9PUV9JTlRSX1BLVChjbjIzeHgtPmNvbmYpIHwKKwkJCQkgICAgKHRpbWVfdGhyZXNob2xkIDw8IDMyKSkpOworCX0KKworCS8qKiBTZXR0aW5nIHRoZSB3YXRlciBtYXJrIGxldmVsIGZvciBwa28gYmFjayBwcmVzc3VyZSAqKi8KKwl3cml0ZXEoMHg0MCwgKHU4ICopb2N0LT5tbWlvWzBdLmh3X2FkZHIgKyBDTjIzWFhfU0xJX09RX1dNQVJLKTsKKworCS8qKiBEaXNhYmxpbmcgc2V0dGluZyBPUXMgaW4gcmVzZXQgd2hlbiByaW5nIGhhcyBubyBkb3JlYmVsbHMKKwkgICogZW5hYmxpbmcgdGhpcyB3aWxsIGNhdXNlIG9mIGhlYWQgb2YgbGluZSBibG9ja2luZworCSAgKi8KKwkvKiBEbyBpdCBvbmx5IGZvciBwYXNzMS4xLiBhbmQgcGFzczEuMiAqLworCWlmICgob2N0LT5yZXZfaWQgPT0gT0NURU9OX0NOMjNYWF9SRVZfMV8wKSB8fAorCSAgICAob2N0LT5yZXZfaWQgPT0gT0NURU9OX0NOMjNYWF9SRVZfMV8xKSkKKwkJd3JpdGVxKHJlYWRxKCh1OCAqKW9jdC0+bW1pb1swXS5od19hZGRyICsKKwkJCQkgICAgIENOMjNYWF9TTElfR0JMX0NPTlRST0wpIHwgMHgyLAorCQkgICAgICAgKHU4ICopb2N0LT5tbWlvWzBdLmh3X2FkZHIgKyBDTjIzWFhfU0xJX0dCTF9DT05UUk9MKTsKKworCS8qKiBFbmFibGUgY2hhbm5lbC1sZXZlbCBiYWNrcHJlc3N1cmUgKi8KKwlpZiAob2N0LT5wZl9udW0pCisJCXdyaXRlcSgweGZmZmZmZmZmZmZmZmZmZmZVTEwsCisJCSAgICAgICAodTggKilvY3QtPm1taW9bMF0uaHdfYWRkciArIENOMjNYWF9TTElfT1VUX0JQX0VOMl9XMVMpOworCWVsc2UKKwkJd3JpdGVxKDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCwKKwkJICAgICAgICh1OCAqKW9jdC0+bW1pb1swXS5od19hZGRyICsgQ04yM1hYX1NMSV9PVVRfQlBfRU5fVzFTKTsKK30KKworc3RhdGljIGludCBjbjIzeHhfc2V0dXBfcGZfZGV2aWNlX3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwljbjIzeHhfZW5hYmxlX2Vycm9yX3JlcG9ydGluZyhvY3QpOworCisJLyogcHJvZ3JhbSB0aGUgTUFDKDAuLjMpX1JJTkZPIGJlZm9yZSBzZXR0aW5nIHVwIGlucHV0L291dHB1dCByZWdzICovCisJY24yM3h4X3NldHVwX2dsb2JhbF9tYWNfcmVncyhvY3QpOworCisJaWYgKGNuMjN4eF9wZl9zZXR1cF9nbG9iYWxfaW5wdXRfcmVncyhvY3QpKQorCQlyZXR1cm4gLTE7CisKKwljbjIzeHhfcGZfc2V0dXBfZ2xvYmFsX291dHB1dF9yZWdzKG9jdCk7CisKKwkvKiBEZWZhdWx0IGVycm9yIHRpbWVvdXQgdmFsdWUgc2hvdWxkIGJlIDB4MjAwMDAwIHRvIGF2b2lkIGhvc3QgaGFuZworCSAqIHdoZW4gcmVhZHMgaW52YWxpZCByZWdpc3RlcgorCSAqLworCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfV0lORE9XX0NUTCwKKwkJCSAgIENOMjNYWF9TTElfV0lORE9XX0NUTF9ERUZBVUxUKTsKKworCS8qIHNldCBTTElfUEtUX0lOX0pBQkJFUiB0byBoYW5kbGUgbGFyZ2UgVlhMQU4gcGFja2V0cyAqLworCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfUEtUX0lOX0pBQkJFUiwgQ04yM1hYX0lOUFVUX0pBQkJFUik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9zZXR1cF9pcV9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHUzMiBpcV9ubykKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3F1ZXVlICppcSA9IG9jdC0+aW5zdHJfcXVldWVbaXFfbm9dOworCXU2NCBwa3RfaW5fZG9uZTsKKworCWlxX25vICs9IG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm47CisKKwkvKiBXcml0ZSB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IHF1ZXVlJ3MgcmluZyBhbmQgaXRzIHNpemUgICovCisJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9JUV9CQVNFX0FERFI2NChpcV9ubyksCisJCQkgICBpcS0+YmFzZV9hZGRyX2RtYSk7CisJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENOMjNYWF9TTElfSVFfU0laRShpcV9ubyksIGlxLT5tYXhfY291bnQpOworCisJLyogUmVtZW1iZXIgdGhlIGRvb3JiZWxsICYgaW5zdHJ1Y3Rpb24gY291bnQgcmVnaXN0ZXIgYWRkcgorCSAqIGZvciB0aGlzIHF1ZXVlCisJICovCisJaXEtPmRvb3JiZWxsX3JlZyA9CisJICAgICh1OCAqKW9jdC0+bW1pb1swXS5od19hZGRyICsgQ04yM1hYX1NMSV9JUV9ET09SQkVMTChpcV9ubyk7CisJaXEtPmluc3RfY250X3JlZyA9CisJICAgICh1OCAqKW9jdC0+bW1pb1swXS5od19hZGRyICsgQ04yM1hYX1NMSV9JUV9JTlNUUl9DT1VOVDY0KGlxX25vKTsKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIkluc3RRWyVkXTpkYmVsbCByZWcgQCAweCVwIGluc3RjbnRfcmVnIEAgMHglcFxuIiwKKwkJaXFfbm8sIGlxLT5kb29yYmVsbF9yZWcsIGlxLT5pbnN0X2NudF9yZWcpOworCisJLyogU3RvcmUgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gY291bnRlciAodXNlZCBpbiBmbHVzaF9pcQorCSAqIGNhbGN1bGF0aW9uKQorCSAqLworCXBrdF9pbl9kb25lID0gcmVhZHEoaXEtPmluc3RfY250X3JlZyk7CisKKwlpZiAob2N0LT5tc2l4X29uKSB7CisJCS8qIFNldCBDSU5UX0VOQiB0byBlbmFibGUgSVEgaW50ZXJydXB0ICAgKi8KKwkJd3JpdGVxKChwa3RfaW5fZG9uZSB8IENOMjNYWF9JTlRSX0NJTlRfRU5CKSwKKwkJICAgICAgIGlxLT5pbnN0X2NudF9yZWcpOworCX0gZWxzZSB7CisJCS8qIENsZWFyIHRoZSBjb3VudCBieSB3cml0aW5nIGJhY2sgd2hhdCB3ZSByZWFkLCBidXQgZG9uJ3QKKwkJICogZW5hYmxlIGludGVycnVwdHMKKwkJICovCisJCXdyaXRlcShwa3RfaW5fZG9uZSwgaXEtPmluc3RfY250X3JlZyk7CisJfQorCisJaXEtPnJlc2V0X2luc3RyX2NudCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9zZXR1cF9vcV9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHUzMiBvcV9ubykKK3sKKwl1MzIgcmVnX3ZhbDsKKwlzdHJ1Y3Qgb2N0ZW9uX2Ryb3EgKmRyb3EgPSBvY3QtPmRyb3Fbb3Ffbm9dOworCXN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICpjbjIzeHggPSAoc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKilvY3QtPmNoaXA7CisJdTY0IHRpbWVfdGhyZXNob2xkOworCXU2NCBjbnRfdGhyZXNob2xkOworCisJb3Ffbm8gKz0gb2N0LT5zcmlvdl9pbmZvLnBmX3NybjsKKworCW9jdGVvbl93cml0ZV9jc3I2NChvY3QsIENOMjNYWF9TTElfT1FfQkFTRV9BRERSNjQob3Ffbm8pLAorCQkJICAgZHJvcS0+ZGVzY19yaW5nX2RtYSk7CisJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENOMjNYWF9TTElfT1FfU0laRShvcV9ubyksIGRyb3EtPm1heF9jb3VudCk7CisKKwlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ04yM1hYX1NMSV9PUV9CVUZGX0lORk9fU0laRShvcV9ubyksCisJCQkgKGRyb3EtPmJ1ZmZlcl9zaXplIHwgKE9DVF9SSF9TSVpFIDw8IDE2KSkpOworCisJLyogR2V0IHRoZSBtYXBwZWQgYWRkcmVzcyBvZiB0aGUgcGt0X3NlbnQgYW5kIHBrdHNfY3JlZGl0IHJlZ3MgKi8KKwlkcm9xLT5wa3RzX3NlbnRfcmVnID0KKwkgICAgKHU4ICopb2N0LT5tbWlvWzBdLmh3X2FkZHIgKyBDTjIzWFhfU0xJX09RX1BLVFNfU0VOVChvcV9ubyk7CisJZHJvcS0+cGt0c19jcmVkaXRfcmVnID0KKwkgICAgKHU4ICopb2N0LT5tbWlvWzBdLmh3X2FkZHIgKyBDTjIzWFhfU0xJX09RX1BLVFNfQ1JFRElUKG9xX25vKTsKKworCWlmICghb2N0LT5tc2l4X29uKSB7CisJCS8qIEVuYWJsZSB0aGlzIG91dHB1dCBxdWV1ZSB0byBnZW5lcmF0ZSBQYWNrZXQgVGltZXIgSW50ZXJydXB0CisJCSAqLworCQlyZWdfdmFsID0KKwkJICAgIG9jdGVvbl9yZWFkX2NzcihvY3QsIENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0wob3Ffbm8pKTsKKwkJcmVnX3ZhbCB8PSBDTjIzWFhfUEtUX09VVFBVVF9DVExfVEVOQjsKKwkJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0wob3Ffbm8pLAorCQkJCSByZWdfdmFsKTsKKworCQkvKiBFbmFibGUgdGhpcyBvdXRwdXQgcXVldWUgdG8gZ2VuZXJhdGUgUGFja2V0IENvdW50IEludGVycnVwdAorCQkgKi8KKwkJcmVnX3ZhbCA9CisJCSAgICBvY3Rlb25fcmVhZF9jc3Iob2N0LCBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKG9xX25vKSk7CisJCXJlZ192YWwgfD0gQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0NFTkI7CisJCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKG9xX25vKSwKKwkJCQkgcmVnX3ZhbCk7CisJfSBlbHNlIHsKKwkJdGltZV90aHJlc2hvbGQgPSBjbjIzeHhfcGZfZ2V0X29xX3RpY2tzKAorCQkgICAgb2N0LCAodTMyKUNGR19HRVRfT1FfSU5UUl9USU1FKGNuMjN4eC0+Y29uZikpOworCQljbnRfdGhyZXNob2xkID0gKHUzMilDRkdfR0VUX09RX0lOVFJfUEtUKGNuMjN4eC0+Y29uZik7CisKKwkJb2N0ZW9uX3dyaXRlX2NzcjY0KAorCQkgICAgb2N0LCBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTKG9xX25vKSwKKwkJICAgICgodGltZV90aHJlc2hvbGQgPDwgMzIgfCBjbnRfdGhyZXNob2xkKSkpOworCX0KK30KKworc3RhdGljIGludCBjbjIzeHhfZW5hYmxlX2lvX3F1ZXVlcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXU2NCByZWdfdmFsOworCXUzMiBzcm4sIGVybiwgcV9ubzsKKwl1MzIgbG9vcCA9IDEwMDA7CisKKwlzcm4gPSBvY3QtPnNyaW92X2luZm8ucGZfc3JuOworCWVybiA9IHNybiArIG9jdC0+bnVtX2lxczsKKworCWZvciAocV9ubyA9IHNybjsgcV9ubyA8IGVybjsgcV9ubysrKSB7CisJCS8qIHNldCB0aGUgY29ycmVzcG9uZGluZyBJUSBJU182NEIgYml0ICovCisJCWlmIChvY3QtPmlvX3FtYXNrLmlxNjRCICYgQklUX1VMTChxX25vIC0gc3JuKSkgeworCQkJcmVnX3ZhbCA9IG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKTsKKwkJCXJlZ192YWwgPSByZWdfdmFsIHwgQ04yM1hYX1BLVF9JTlBVVF9DVExfSVNfNjRCOworCQkJb2N0ZW9uX3dyaXRlX2NzcjY0KAorCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pLCByZWdfdmFsKTsKKwkJfQorCisJCS8qIHNldCB0aGUgY29ycmVzcG9uZGluZyBJUSBFTkIgYml0ICovCisJCWlmIChvY3QtPmlvX3FtYXNrLmlxICYgQklUX1VMTChxX25vIC0gc3JuKSkgeworCQkJLyogSU9RcyBhcmUgaW4gcmVzZXQgYnkgZGVmYXVsdCBpbiBQRU0yIG1vZGUsCisJCQkgKiBjbGVhcmluZyByZXNldCBiaXQKKwkJCSAqLworCQkJcmVnX3ZhbCA9IG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKTsKKworCQkJaWYgKHJlZ192YWwgJiBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SU1QpIHsKKwkJCQl3aGlsZSAoKHJlZ192YWwgJiBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SU1QpICYmCisJCQkJICAgICAgICEocmVnX3ZhbCAmCisJCQkJCSBDTjIzWFhfUEtUX0lOUFVUX0NUTF9RVUlFVCkgJiYKKwkJCQkgICAgICAgbG9vcC0tKSB7CisJCQkJCXJlZ192YWwgPSBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQkJICAgIG9jdCwKKwkJCQkJICAgIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSk7CisJCQkJfQorCQkJCWlmICghbG9vcCkgeworCQkJCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwKKwkJCQkJCSJjbGVhcmluZyB0aGUgcmVzZXQgcmVnIGZhaWxlZCBvciBzZXR0aW5nIHRoZSBxdWlldCByZWcgZmFpbGVkIGZvciBxbm86ICV1XG4iLAorCQkJCQkJcV9ubyk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJcmVnX3ZhbCA9IHJlZ192YWwgJiB+Q04yM1hYX1BLVF9JTlBVVF9DVExfUlNUOworCQkJCW9jdGVvbl93cml0ZV9jc3I2NCgKKwkJCQkgICAgb2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubyksCisJCQkJICAgIHJlZ192YWwpOworCisJCQkJcmVnX3ZhbCA9IG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCSAgICBvY3QsIENOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSk7CisJCQkJaWYgKHJlZ192YWwgJiBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SU1QpIHsKKwkJCQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsCisJCQkJCQkiY2xlYXJpbmcgdGhlIHJlc2V0IGZhaWxlZCBmb3IgcW5vOiAldVxuIiwKKwkJCQkJCXFfbm8pOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJfQorCQkJcmVnX3ZhbCA9IG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJICAgIG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKTsKKwkJCXJlZ192YWwgPSByZWdfdmFsIHwgQ04yM1hYX1BLVF9JTlBVVF9DVExfUklOR19FTkI7CisJCQlvY3Rlb25fd3JpdGVfY3NyNjQoCisJCQkgICAgb2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubyksIHJlZ192YWwpOworCQl9CisJfQorCWZvciAocV9ubyA9IHNybjsgcV9ubyA8IGVybjsgcV9ubysrKSB7CisJCXUzMiByZWdfdmFsOworCQkvKiBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgT1EgRU5CIGJpdCAqLworCQlpZiAob2N0LT5pb19xbWFzay5vcSAmIEJJVF9VTEwocV9ubyAtIHNybikpIHsKKwkJCXJlZ192YWwgPSBvY3Rlb25fcmVhZF9jc3IoCisJCQkgICAgb2N0LCBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKHFfbm8pKTsKKwkJCXJlZ192YWwgPSByZWdfdmFsIHwgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX1JJTkdfRU5COworCQkJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0wocV9ubyksCisJCQkJCSByZWdfdmFsKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY24yM3h4X2Rpc2FibGVfaW9fcXVldWVzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJaW50IHFfbm8sIGxvb3A7CisJdTY0IGQ2NDsKKwl1MzIgZDMyOworCXUzMiBzcm4sIGVybjsKKworCXNybiA9IG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm47CisJZXJuID0gc3JuICsgb2N0LT5udW1faXFzOworCisJLyoqKiBEaXNhYmxlIElucHV0IFF1ZXVlcy4gKioqLworCWZvciAocV9ubyA9IHNybjsgcV9ubyA8IGVybjsgcV9ubysrKSB7CisJCWxvb3AgPSBIWjsKKworCQkvKiBzdGFydCB0aGUgUmVzZXQgZm9yIGEgcGFydGljdWxhciByaW5nICovCisJCVdSSVRFX09OQ0UoZDY0LCBvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCSAgIG9jdCwgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pKSk7CisJCVdSSVRFX09OQ0UoZDY0LCBSRUFEX09OQ0UoZDY0KSAmCisJCQkJCSh+KENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JJTkdfRU5CKSkpOworCQlXUklURV9PTkNFKGQ2NCwgUkVBRF9PTkNFKGQ2NCkgfCBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SU1QpOworCQlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQocV9ubyksCisJCQkJICAgUkVBRF9PTkNFKGQ2NCkpOworCisJCS8qIFdhaXQgdW50aWwgaGFyZHdhcmUgaW5kaWNhdGVzIHRoYXQgdGhlIHBhcnRpY3VsYXIgSVEKKwkJICogaXMgb3V0IG9mIHJlc2V0LgorCQkgKi8KKwkJV1JJVEVfT05DRShkNjQsIG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCQlvY3QsIENOMjNYWF9TTElfUEtUX0lPUV9SSU5HX1JTVCkpOworCQl3aGlsZSAoIShSRUFEX09OQ0UoZDY0KSAmIEJJVF9VTEwocV9ubykpICYmIGxvb3AtLSkgeworCQkJV1JJVEVfT05DRShkNjQsIG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJCQlvY3QsIENOMjNYWF9TTElfUEtUX0lPUV9SSU5HX1JTVCkpOworCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCX0KKworCQkvKiBSZXNldCB0aGUgZG9vcmJlbGwgcmVnaXN0ZXIgZm9yIHRoaXMgSW5wdXQgUXVldWUuICovCisJCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjIzWFhfU0xJX0lRX0RPT1JCRUxMKHFfbm8pLCAweEZGRkZGRkZGKTsKKwkJd2hpbGUgKG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9JUV9ET09SQkVMTChxX25vKSkgJiYKKwkJICAgICAgIGxvb3AtLSkgeworCQkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoMSk7CisJCX0KKwl9CisKKwkvKioqIERpc2FibGUgT3V0cHV0IFF1ZXVlcy4gKioqLworCWZvciAocV9ubyA9IHNybjsgcV9ubyA8IGVybjsgcV9ubysrKSB7CisJCWxvb3AgPSBIWjsKKworCQkvKiBXYWl0IHVudGlsIGhhcmR3YXJlIGluZGljYXRlcyB0aGF0IHRoZSBwYXJ0aWN1bGFyIElRCisJCSAqIGlzIG91dCBvZiByZXNldC5JdCBnaXZlbiB0aGF0IFNMSV9QS1RfUklOR19SU1QgaXMKKwkJICogY29tbW9uIGZvciBib3RoIElRcyBhbmQgT1FzCisJCSAqLworCQlXUklURV9PTkNFKGQ2NCwgb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJCW9jdCwgQ04yM1hYX1NMSV9QS1RfSU9RX1JJTkdfUlNUKSk7CisJCXdoaWxlICghKFJFQURfT05DRShkNjQpICYgQklUX1VMTChxX25vKSkgJiYgbG9vcC0tKSB7CisJCQlXUklURV9PTkNFKGQ2NCwgb2N0ZW9uX3JlYWRfY3NyNjQoCisJCQkJCW9jdCwgQ04yM1hYX1NMSV9QS1RfSU9RX1JJTkdfUlNUKSk7CisJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJfQorCisJCS8qIFJlc2V0IHRoZSBkb29yYmVsbCByZWdpc3RlciBmb3IgdGhpcyBPdXRwdXQgUXVldWUuICovCisJCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjIzWFhfU0xJX09RX1BLVFNfQ1JFRElUKHFfbm8pLAorCQkJCSAweEZGRkZGRkZGKTsKKwkJd2hpbGUgKG9jdGVvbl9yZWFkX2NzcjY0KG9jdCwKKwkJCQkJIENOMjNYWF9TTElfT1FfUEtUU19DUkVESVQocV9ubykpICYmCisJCSAgICAgICBsb29wLS0pIHsKKwkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOworCQl9CisKKwkJLyogY2xlYXIgdGhlIFNMSV9QS1QoMC4uNjMpX0NOVFNbQ05UXSByZWcgdmFsdWUgKi8KKwkJV1JJVEVfT05DRShkMzIsIG9jdGVvbl9yZWFkX2NzcigKKwkJCQkJb2N0LCBDTjIzWFhfU0xJX09RX1BLVFNfU0VOVChxX25vKSkpOworCQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ04yM1hYX1NMSV9PUV9QS1RTX1NFTlQocV9ubyksCisJCQkJIFJFQURfT05DRShkMzIpKTsKKwl9Cit9CisKK3N0YXRpYyB1NjQgY24yM3h4X3BmX21zaXhfaW50ZXJydXB0X2hhbmRsZXIodm9pZCAqZGV2KQoreworCXN0cnVjdCBvY3Rlb25faW9xX3ZlY3RvciAqaW9xX3ZlY3RvciA9IChzdHJ1Y3Qgb2N0ZW9uX2lvcV92ZWN0b3IgKilkZXY7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGlvcV92ZWN0b3ItPm9jdF9kZXY7CisJdTY0IHBrdHNfc2VudDsKKwl1NjQgcmV0ID0gMDsKKwlzdHJ1Y3Qgb2N0ZW9uX2Ryb3EgKmRyb3EgPSBvY3QtPmRyb3FbaW9xX3ZlY3Rvci0+ZHJvcV9pbmRleF07CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIkluICVzIG9jdGVvbl9kZXYgQCAlcFxuIiwgX19mdW5jX18sIG9jdCk7CisKKwlpZiAoIWRyb3EpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICIyM1hYIGJyaW5ndXAgRklYTUU6IG9jdCBwZm51bTolZCBpb3FfdmVjdG9yLT5pb3FfbnVtIDolZCBkcm9xIGlzIE5VTExcbiIsCisJCQlvY3QtPnBmX251bSwgaW9xX3ZlY3Rvci0+aW9xX251bSk7CisJCXJldHVybiAwOworCX0KKworCXBrdHNfc2VudCA9IHJlYWRxKGRyb3EtPnBrdHNfc2VudF9yZWcpOworCisJLyogSWYgb3VyIGRldmljZSBoYXMgaW50ZXJydXB0ZWQsIHRoZW4gcHJvY2VlZC4gQWxzbyBjaGVjaworCSAqIGZvciBhbGwgZidzIGlmIGludGVycnVwdCB3YXMgdHJpZ2dlcmVkIG9uIGFuIGVycm9yCisJICogYW5kIHRoZSBQQ0kgcmVhZCBmYWlscy4KKwkgKi8KKwlpZiAoIXBrdHNfc2VudCB8fCAocGt0c19zZW50ID09IDB4RkZGRkZGRkZGRkZGRkZGRlVMTCkpCisJCXJldHVybiByZXQ7CisKKwkvKiBXcml0ZSBjb3VudCByZWcgaW4gc2xpX3BrdF9jbnRzIHRvIGNsZWFyIHRoZXNlIGludC4qLworCWlmICgocGt0c19zZW50ICYgQ04yM1hYX0lOVFJfUE9fSU5UKSB8fAorCSAgICAocGt0c19zZW50ICYgQ04yM1hYX0lOVFJfUElfSU5UKSkgeworCQlpZiAocGt0c19zZW50ICYgQ04yM1hYX0lOVFJfUE9fSU5UKQorCQkJcmV0IHw9IE1TSVhfUE9fSU5UOworCX0KKworCWlmIChwa3RzX3NlbnQgJiBDTjIzWFhfSU5UUl9QSV9JTlQpCisJCS8qIFdlIHdpbGwgY2xlYXIgdGhlIGNvdW50IHdoZW4gd2UgdXBkYXRlIHRoZSByZWFkX2luZGV4LiAqLworCQlyZXQgfD0gTVNJWF9QSV9JTlQ7CisKKwkvKiBOZXZlciBuZWVkIHRvIGhhbmRsZSBtc2l4IG1ib3ggaW50ciBmb3IgcGYuIFRoZXkgYXJyaXZlIG9uIHRoZSBsYXN0CisJICogbXNpeAorCSAqLworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjbjIzeHhfaW50ZXJydXB0X2hhbmRsZXIodm9pZCAqZGV2KQoreworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSAoc3RydWN0IG9jdGVvbl9kZXZpY2UgKilkZXY7CisJc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKmNuMjN4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqKW9jdC0+Y2hpcDsKKwl1NjQgaW50cjY0OworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJJbiAlcyBvY3Rlb25fZGV2IEAgJXBcbiIsIF9fZnVuY19fLCBvY3QpOworCWludHI2NCA9IHJlYWRxKGNuMjN4eC0+aW50cl9zdW1fcmVnNjQpOworCisJb2N0LT5pbnRfc3RhdHVzID0gMDsKKworCWlmIChpbnRyNjQgJiBDTjIzWFhfSU5UUl9FUlIpCisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiT0NURU9OWyVkXTogRXJyb3IgSW50cjogMHglMDE2bGx4XG4iLAorCQkJb2N0LT5vY3Rlb25faWQsIENWTV9DQVNUNjQoaW50cjY0KSk7CisKKwlpZiAob2N0LT5tc2l4X29uICE9IExJT19GTEFHX01TSVhfRU5BQkxFRCkgeworCQlpZiAoaW50cjY0ICYgQ04yM1hYX0lOVFJfUEtUX0RBVEEpCisJCQlvY3QtPmludF9zdGF0dXMgfD0gT0NUX0RFVl9JTlRSX1BLVF9EQVRBOworCX0KKworCWlmIChpbnRyNjQgJiAoQ04yM1hYX0lOVFJfRE1BMF9GT1JDRSkpCisJCW9jdC0+aW50X3N0YXR1cyB8PSBPQ1RfREVWX0lOVFJfRE1BMF9GT1JDRTsKKwlpZiAoaW50cjY0ICYgKENOMjNYWF9JTlRSX0RNQTFfRk9SQ0UpKQorCQlvY3QtPmludF9zdGF0dXMgfD0gT0NUX0RFVl9JTlRSX0RNQTFfRk9SQ0U7CisKKwkvKiBDbGVhciB0aGUgY3VycmVudCBpbnRlcnJ1cHRzICovCisJd3JpdGVxKGludHI2NCwgY24yM3h4LT5pbnRyX3N1bV9yZWc2NCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9iYXIxX2lkeF9zZXR1cChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1NjQgY29yZV9hZGRyLAorCQkJCSAgdTMyIGlkeCwgaW50IHZhbGlkKQoreworCXU2NCBiYXIxOworCXU2NCByZWdfYWRyOworCisJaWYgKCF2YWxpZCkgeworCQlyZWdfYWRyID0gbGlvX3BjaV9yZWFkcSgKKwkJCW9jdCwgQ04yM1hYX1BFTV9CQVIxX0lOREVYX1JFRyhvY3QtPnBjaWVfcG9ydCwgaWR4KSk7CisJCVdSSVRFX09OQ0UoYmFyMSwgcmVnX2Fkcik7CisJCWxpb19wY2lfd3JpdGVxKG9jdCwgKFJFQURfT05DRShiYXIxKSAmIDB4RkZGRkZGRkVVTEwpLAorCQkJICAgICAgIENOMjNYWF9QRU1fQkFSMV9JTkRFWF9SRUcob2N0LT5wY2llX3BvcnQsIGlkeCkpOworCQlyZWdfYWRyID0gbGlvX3BjaV9yZWFkcSgKKwkJCW9jdCwgQ04yM1hYX1BFTV9CQVIxX0lOREVYX1JFRyhvY3QtPnBjaWVfcG9ydCwgaWR4KSk7CisJCVdSSVRFX09OQ0UoYmFyMSwgcmVnX2Fkcik7CisJCXJldHVybjsKKwl9CisKKwkvKiAgVGhlIFBFTSgwLi4zKV9CQVIxX0lOREVYKDAuLjE1KVtBRERSX0lEWF08MjM6ND4gc3RvcmVzCisJICogIGJpdHMgPDQxOjIyPiBvZiB0aGUgQ29yZSBBZGRyCisJICovCisJbGlvX3BjaV93cml0ZXEob2N0LCAoKChjb3JlX2FkZHIgPj4gMjIpIDw8IDQpIHwgUENJX0JBUjFfTUFTSyksCisJCSAgICAgICBDTjIzWFhfUEVNX0JBUjFfSU5ERVhfUkVHKG9jdC0+cGNpZV9wb3J0LCBpZHgpKTsKKworCVdSSVRFX09OQ0UoYmFyMSwgbGlvX3BjaV9yZWFkcSgKKwkJICAgb2N0LCBDTjIzWFhfUEVNX0JBUjFfSU5ERVhfUkVHKG9jdC0+cGNpZV9wb3J0LCBpZHgpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9iYXIxX2lkeF93cml0ZShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1MzIgaWR4LCB1MzIgbWFzaykKK3sKKwlsaW9fcGNpX3dyaXRlcShvY3QsIG1hc2ssCisJCSAgICAgICBDTjIzWFhfUEVNX0JBUjFfSU5ERVhfUkVHKG9jdC0+cGNpZV9wb3J0LCBpZHgpKTsKK30KKworc3RhdGljIHUzMiBjbjIzeHhfYmFyMV9pZHhfcmVhZChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1MzIgaWR4KQoreworCXJldHVybiAodTMyKWxpb19wY2lfcmVhZHEoCisJICAgIG9jdCwgQ04yM1hYX1BFTV9CQVIxX0lOREVYX1JFRyhvY3QtPnBjaWVfcG9ydCwgaWR4KSk7Cit9CisKKy8qIGFsd2F5cyBjYWxsIHdpdGggbG9jayBoZWxkICovCitzdGF0aWMgdTMyIGNuMjN4eF91cGRhdGVfcmVhZF9pbmRleChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3F1ZXVlICppcSkKK3sKKwl1MzIgbmV3X2lkeDsKKwl1MzIgbGFzdF9kb25lOworCXUzMiBwa3RfaW5fZG9uZSA9IHJlYWRsKGlxLT5pbnN0X2NudF9yZWcpOworCisJbGFzdF9kb25lID0gcGt0X2luX2RvbmUgLSBpcS0+cGt0X2luX2RvbmU7CisJaXEtPnBrdF9pbl9kb25lID0gcGt0X2luX2RvbmU7CisKKwkvKiBNb2R1bG8gb2YgdGhlIG5ldyBpbmRleCB3aXRoIHRoZSBJUSBzaXplIHdpbGwgZ2l2ZSB1cworCSAqIHRoZSBuZXcgaW5kZXguICBUaGUgaXEtPnJlc2V0X2luc3RyX2NudCBpcyBhbHdheXMgemVybyBmb3IKKwkgKiBjbjIzeHgsIHNvIG5vIGV4dHJhIGFkanVzdG1lbnRzIGFyZSBuZWVkZWQuCisJICovCisJbmV3X2lkeCA9IChpcS0+b2N0ZW9uX3JlYWRfaW5kZXggKworCQkgICAodTMyKShsYXN0X2RvbmUgJiBDTjIzWFhfUEtUX0lOX0RPTkVfQ05UX01BU0spKSAlCisJCSAgaXEtPm1heF9jb3VudDsKKworCXJldHVybiBuZXdfaWR4OworfQorCitzdGF0aWMgdm9pZCBjbjIzeHhfZW5hYmxlX3BmX2ludGVycnVwdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1OCBpbnRyX2ZsYWcpCit7CisJc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKmNuMjN4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqKW9jdC0+Y2hpcDsKKwl1NjQgaW50cl92YWwgPSAwOworCisJLyogIERpdmlkZSB0aGUgc2luZ2xlIHdyaXRlIHRvIG11bHRpcGxlIHdyaXRlcyBiYXNlZCBvbiB0aGUgZmxhZy4gKi8KKwkvKiBFbmFibGUgSW50ZXJydXB0ICovCisJaWYgKGludHJfZmxhZyA9PSBPQ1RFT05fQUxMX0lOVFIpIHsKKwkJd3JpdGVxKGNuMjN4eC0+aW50cl9tYXNrNjQsIGNuMjN4eC0+aW50cl9lbmJfcmVnNjQpOworCX0gZWxzZSBpZiAoaW50cl9mbGFnICYgT0NURU9OX09VVFBVVF9JTlRSKSB7CisJCWludHJfdmFsID0gcmVhZHEoY24yM3h4LT5pbnRyX2VuYl9yZWc2NCk7CisJCWludHJfdmFsIHw9IENOMjNYWF9JTlRSX1BLVF9EQVRBOworCQl3cml0ZXEoaW50cl92YWwsIGNuMjN4eC0+aW50cl9lbmJfcmVnNjQpOworCX0KK30KKworc3RhdGljIHZvaWQgY24yM3h4X2Rpc2FibGVfcGZfaW50ZXJydXB0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHU4IGludHJfZmxhZykKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqY24yM3h4ID0gKHN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICopb2N0LT5jaGlwOworCXU2NCBpbnRyX3ZhbCA9IDA7CisKKwkvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKwlpZiAoaW50cl9mbGFnID09IE9DVEVPTl9BTExfSU5UUikgeworCQl3cml0ZXEoMCwgY24yM3h4LT5pbnRyX2VuYl9yZWc2NCk7CisJfSBlbHNlIGlmIChpbnRyX2ZsYWcgJiBPQ1RFT05fT1VUUFVUX0lOVFIpIHsKKwkJaW50cl92YWwgPSByZWFkcShjbjIzeHgtPmludHJfZW5iX3JlZzY0KTsKKwkJaW50cl92YWwgJj0gfkNOMjNYWF9JTlRSX1BLVF9EQVRBOworCQl3cml0ZXEoaW50cl92YWwsIGNuMjN4eC0+aW50cl9lbmJfcmVnNjQpOworCX0KK30KKworc3RhdGljIHZvaWQgY24yM3h4X2dldF9wY2llX3FsbXBvcnQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwlvY3QtPnBjaWVfcG9ydCA9IChvY3Rlb25fcmVhZF9jc3Iob2N0LCBDTjIzWFhfU0xJX01BQ19OVU1CRVIpKSAmIDB4ZmY7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIk9DVEVPTjogQ04yM3h4IHVzZXMgUENJRSBQb3J0ICVkXG4iLAorCQlvY3QtPnBjaWVfcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9nZXRfcGZfbnVtKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJdTMyIGZkbF9iaXQgPSAwOworCisJLyoqIFJlYWQgRnVuY3Rpb24gRGVwZW5kZW5jeSBMaW5rIHJlZyB0byBnZXQgdGhlIGZ1bmN0aW9uIG51bWJlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChvY3QtPnBjaV9kZXYsIENOMjNYWF9QQ0lFX1NSSU9WX0ZETCwgJmZkbF9iaXQpOworCW9jdC0+cGZfbnVtID0gKChmZGxfYml0ID4+IENOMjNYWF9QQ0lFX1NSSU9WX0ZETF9CSVRfUE9TKSAmCisJCSAgICAgICBDTjIzWFhfUENJRV9TUklPVl9GRExfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIGNuMjN4eF9zZXR1cF9yZWdfYWRkcmVzcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXU4IF9faW9tZW0gKmJhcjBfcGNpYWRkciA9IG9jdC0+bW1pb1swXS5od19hZGRyOworCXN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICpjbjIzeHggPSAoc3RydWN0IG9jdGVvbl9jbjIzeHhfcGYgKilvY3QtPmNoaXA7CisKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fd3JfYWRkcl9oaSA9CisJICAgICh1MzIgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1dSX0FERFJfSEkpOworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl93cl9hZGRyX2xvID0KKwkgICAgKHUzMiBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fV1JfQUREUl9MTyk7CisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3dyX2FkZHIgPQorCSAgICAodTY0IF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9XUl9BRERSNjQpOworCisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3JkX2FkZHJfaGkgPQorCSAgICAodTMyIF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9SRF9BRERSX0hJKTsKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fcmRfYWRkcl9sbyA9CisJICAgICh1MzIgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1JEX0FERFJfTE8pOworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl9yZF9hZGRyID0KKwkgICAgKHU2NCBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fUkRfQUREUjY0KTsKKworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl93cl9kYXRhX2hpID0KKwkgICAgKHUzMiBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fV1JfREFUQV9ISSk7CisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3dyX2RhdGFfbG8gPQorCSAgICAodTMyIF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9XUl9EQVRBX0xPKTsKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fd3JfZGF0YSA9CisJICAgICh1NjQgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1dSX0RBVEE2NCk7CisKKwlvY3QtPnJlZ19saXN0LnBjaV93aW5fcmRfZGF0YV9oaSA9CisJICAgICh1MzIgX19pb21lbSAqKShiYXIwX3BjaWFkZHIgKyBDTjIzWFhfV0lOX1JEX0RBVEFfSEkpOworCW9jdC0+cmVnX2xpc3QucGNpX3dpbl9yZF9kYXRhX2xvID0KKwkgICAgKHUzMiBfX2lvbWVtICopKGJhcjBfcGNpYWRkciArIENOMjNYWF9XSU5fUkRfREFUQV9MTyk7CisJb2N0LT5yZWdfbGlzdC5wY2lfd2luX3JkX2RhdGEgPQorCSAgICAodTY0IF9faW9tZW0gKikoYmFyMF9wY2lhZGRyICsgQ04yM1hYX1dJTl9SRF9EQVRBNjQpOworCisJY24yM3h4X2dldF9wY2llX3FsbXBvcnQob2N0KTsKKworCWNuMjN4eC0+aW50cl9tYXNrNjQgPSBDTjIzWFhfSU5UUl9NQVNLOworCWlmICghb2N0LT5tc2l4X29uKQorCQljbjIzeHgtPmludHJfbWFzazY0IHw9IENOMjNYWF9JTlRSX1BLVF9USU1FOworCWlmIChvY3QtPnJldl9pZCA+PSBPQ1RFT05fQ04yM1hYX1JFVl8xXzEpCisJCWNuMjN4eC0+aW50cl9tYXNrNjQgfD0gQ04yM1hYX0lOVFJfVkZfTUJPWDsKKworCWNuMjN4eC0+aW50cl9zdW1fcmVnNjQgPQorCSAgICBiYXIwX3BjaWFkZHIgKworCSAgICBDTjIzWFhfU0xJX01BQ19QRl9JTlRfU1VNNjQob2N0LT5wY2llX3BvcnQsIG9jdC0+cGZfbnVtKTsKKwljbjIzeHgtPmludHJfZW5iX3JlZzY0ID0KKwkgICAgYmFyMF9wY2lhZGRyICsKKwkgICAgQ04yM1hYX1NMSV9NQUNfUEZfSU5UX0VOQjY0KG9jdC0+cGNpZV9wb3J0LCBvY3QtPnBmX251bSk7Cit9CisKK3N0YXRpYyBpbnQgY24yM3h4X3NyaW92X2NvbmZpZyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXUzMiB0b3RhbF9yaW5nczsKKwlzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZiAqY24yM3h4ID0gKHN0cnVjdCBvY3Rlb25fY24yM3h4X3BmICopb2N0LT5jaGlwOworCS8qIG51bV92ZnMgaXMgYWxyZWFkeSBmaWxsZWQgZm9yIHVzICovCisJdTMyIHBmX3NybiwgbnVtX3BmX3JpbmdzOworCisJY24yM3h4LT5jb25mID0KKwkgICAgKHN0cnVjdCBvY3Rlb25fY29uZmlnICopb2N0X2dldF9jb25maWdfaW5mbyhvY3QsIExJT18yM1hYKTsKKwlzd2l0Y2ggKG9jdC0+cmV2X2lkKSB7CisJY2FzZSBPQ1RFT05fQ04yM1hYX1JFVl8xXzA6CisJCXRvdGFsX3JpbmdzID0gQ04yM1hYX01BWF9SSU5HU19QRVJfUEZfUEFTU18xXzA7CisJCWJyZWFrOworCWNhc2UgT0NURU9OX0NOMjNYWF9SRVZfMV8xOgorCQl0b3RhbF9yaW5ncyA9IENOMjNYWF9NQVhfUklOR1NfUEVSX1BGX1BBU1NfMV8xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl0b3RhbF9yaW5ncyA9IENOMjNYWF9NQVhfUklOR1NfUEVSX1BGOworCQlicmVhazsKKwl9CisJaWYgKCFvY3QtPnNyaW92X2luZm8ubnVtX3BmX3JpbmdzKSB7CisJCWlmICh0b3RhbF9yaW5ncyA+IG51bV9wcmVzZW50X2NwdXMoKSkKKwkJCW51bV9wZl9yaW5ncyA9IG51bV9wcmVzZW50X2NwdXMoKTsKKwkJZWxzZQorCQkJbnVtX3BmX3JpbmdzID0gdG90YWxfcmluZ3M7CisJfSBlbHNlIHsKKwkJbnVtX3BmX3JpbmdzID0gb2N0LT5zcmlvdl9pbmZvLm51bV9wZl9yaW5nczsKKworCQlpZiAobnVtX3BmX3JpbmdzID4gdG90YWxfcmluZ3MpIHsKKwkJCWRldl93YXJuKCZvY3QtPnBjaV9kZXYtPmRldiwKKwkJCQkgIm51bV9xdWV1ZXNfcGVyX3BmIHJlcXVlc3RlZCAldSBpcyBtb3JlIHRoYW4gYXZhaWxhYmxlIHJpbmdzLiBSZWR1Y2luZyB0byAldVxuIiwKKwkJCQkgbnVtX3BmX3JpbmdzLCB0b3RhbF9yaW5ncyk7CisJCQludW1fcGZfcmluZ3MgPSB0b3RhbF9yaW5nczsKKwkJfQorCX0KKworCXRvdGFsX3JpbmdzID0gbnVtX3BmX3JpbmdzOworCS8qIHRoZSBmaXJzdCByaW5nIG9mIHRoZSBwZiAqLworCXBmX3NybiA9IHRvdGFsX3JpbmdzIC0gbnVtX3BmX3JpbmdzOworCisJb2N0LT5zcmlvdl9pbmZvLnRycyA9IHRvdGFsX3JpbmdzOworCW9jdC0+c3Jpb3ZfaW5mby5wZl9zcm4gPSBwZl9zcm47CisJb2N0LT5zcmlvdl9pbmZvLm51bV9wZl9yaW5ncyA9IG51bV9wZl9yaW5nczsKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgInRyczolZCBwZl9zcm46JWQgbnVtX3BmX3JpbmdzOiVkXG4iLAorCQlvY3QtPnNyaW92X2luZm8udHJzLCBvY3QtPnNyaW92X2luZm8ucGZfc3JuLAorCQlvY3QtPnNyaW92X2luZm8ubnVtX3BmX3JpbmdzKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNldHVwX2NuMjN4eF9vY3Rlb25fcGZfZGV2aWNlKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCit7CisJaWYgKG9jdGVvbl9tYXBfcGNpX2Jhcngob2N0LCAwLCAwKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAob2N0ZW9uX21hcF9wY2lfYmFyeChvY3QsIDEsIE1BWF9CQVIxX0lPUkVNQVBfU0laRSkpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBDTjIzWFggQkFSMSBtYXAgZmFpbGVkXG4iLAorCQkJX19mdW5jX18pOworCQlvY3Rlb25fdW5tYXBfcGNpX2Jhcngob2N0LCAwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJY24yM3h4X2dldF9wZl9udW0ob2N0KTsKKworCWlmIChjbjIzeHhfc3Jpb3ZfY29uZmlnKG9jdCkpIHsKKwkJb2N0ZW9uX3VubWFwX3BjaV9iYXJ4KG9jdCwgMCk7CisJCW9jdGVvbl91bm1hcF9wY2lfYmFyeChvY3QsIDEpOworCQlyZXR1cm4gMTsKKwl9CisKKwlvY3Rlb25fd3JpdGVfY3NyNjQob2N0LCBDTjIzWFhfU0xJX01BQ19DUkVESVRfQ05ULCAweDNGODAyMDgwODAyMDgwVUxMKTsKKworCW9jdC0+Zm5fbGlzdC5zZXR1cF9pcV9yZWdzID0gY24yM3h4X3NldHVwX2lxX3JlZ3M7CisJb2N0LT5mbl9saXN0LnNldHVwX29xX3JlZ3MgPSBjbjIzeHhfc2V0dXBfb3FfcmVnczsKKwlvY3QtPmZuX2xpc3QucHJvY2Vzc19pbnRlcnJ1cHRfcmVncyA9IGNuMjN4eF9pbnRlcnJ1cHRfaGFuZGxlcjsKKwlvY3QtPmZuX2xpc3QubXNpeF9pbnRlcnJ1cHRfaGFuZGxlciA9IGNuMjN4eF9wZl9tc2l4X2ludGVycnVwdF9oYW5kbGVyOworCisJb2N0LT5mbl9saXN0LnNvZnRfcmVzZXQgPSBjbjIzeHhfcGZfc29mdF9yZXNldDsKKwlvY3QtPmZuX2xpc3Quc2V0dXBfZGV2aWNlX3JlZ3MgPSBjbjIzeHhfc2V0dXBfcGZfZGV2aWNlX3JlZ3M7CisJb2N0LT5mbl9saXN0LnVwZGF0ZV9pcV9yZWFkX2lkeCA9IGNuMjN4eF91cGRhdGVfcmVhZF9pbmRleDsKKworCW9jdC0+Zm5fbGlzdC5iYXIxX2lkeF9zZXR1cCA9IGNuMjN4eF9iYXIxX2lkeF9zZXR1cDsKKwlvY3QtPmZuX2xpc3QuYmFyMV9pZHhfd3JpdGUgPSBjbjIzeHhfYmFyMV9pZHhfd3JpdGU7CisJb2N0LT5mbl9saXN0LmJhcjFfaWR4X3JlYWQgPSBjbjIzeHhfYmFyMV9pZHhfcmVhZDsKKworCW9jdC0+Zm5fbGlzdC5lbmFibGVfaW50ZXJydXB0ID0gY24yM3h4X2VuYWJsZV9wZl9pbnRlcnJ1cHQ7CisJb2N0LT5mbl9saXN0LmRpc2FibGVfaW50ZXJydXB0ID0gY24yM3h4X2Rpc2FibGVfcGZfaW50ZXJydXB0OworCisJb2N0LT5mbl9saXN0LmVuYWJsZV9pb19xdWV1ZXMgPSBjbjIzeHhfZW5hYmxlX2lvX3F1ZXVlczsKKwlvY3QtPmZuX2xpc3QuZGlzYWJsZV9pb19xdWV1ZXMgPSBjbjIzeHhfZGlzYWJsZV9pb19xdWV1ZXM7CisKKwljbjIzeHhfc2V0dXBfcmVnX2FkZHJlc3Mob2N0KTsKKworCW9jdC0+Y29wcm9jX2Nsb2NrX3JhdGUgPSAxMDAwMDAwVUxMICogY24yM3h4X2NvcHJvY2Vzc29yX2Nsb2NrKG9jdCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZhbGlkYXRlX2NuMjN4eF9wZl9jb25maWdfaW5mbyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LAorCQkJCSAgIHN0cnVjdCBvY3Rlb25fY29uZmlnICpjb25mMjN4eCkKK3sKKwlpZiAoQ0ZHX0dFVF9JUV9NQVhfUShjb25mMjN4eCkgPiBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUykgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzOiBOdW0gSVEgKCVkKSBleGNlZWRzIE1heCAoJWQpXG4iLAorCQkJX19mdW5jX18sIENGR19HRVRfSVFfTUFYX1EoY29uZjIzeHgpLAorCQkJQ04yM1hYX01BWF9JTlBVVF9RVUVVRVMpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoQ0ZHX0dFVF9PUV9NQVhfUShjb25mMjN4eCkgPiBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVMpIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICIlczogTnVtIE9RICglZCkgZXhjZWVkcyBNYXggKCVkKVxuIiwKKwkJCV9fZnVuY19fLCBDRkdfR0VUX09RX01BWF9RKGNvbmYyM3h4KSwKKwkJCUNOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUyk7CisJCXJldHVybiAxOworCX0KKworCWlmIChDRkdfR0VUX0lRX0lOU1RSX1RZUEUoY29uZjIzeHgpICE9IE9DVEVPTl8zMkJZVEVfSU5TVFIgJiYKKwkgICAgQ0ZHX0dFVF9JUV9JTlNUUl9UWVBFKGNvbmYyM3h4KSAhPSBPQ1RFT05fNjRCWVRFX0lOU1RSKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXM6IEludmFsaWQgaW5zdHIgdHlwZSBmb3IgSVFcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAxOworCX0KKworCWlmICghKENGR19HRVRfT1FfSU5GT19QVFIoY29uZjIzeHgpKSB8fAorCSAgICAhKENGR19HRVRfT1FfUkVGSUxMX1RIUkVTSE9MRChjb25mMjN4eCkpKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXM6IEludmFsaWQgcGFyYW1ldGVyIGZvciBPUVxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKCEoQ0ZHX0dFVF9PUV9JTlRSX1RJTUUoY29uZjIzeHgpKSkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzOiBJbnZhbGlkIHBhcmFtZXRlciBmb3IgT1FcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGNuMjN4eF9kdW1wX2lxX3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl1MzIgcmVndmFsLCBxX25vOworCisJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJTTElfSVFfRE9PUkJFTExfMCBbMHgleF06IDB4JTAxNmxseFxuIiwKKwkJQ04yM1hYX1NMSV9JUV9ET09SQkVMTCgwKSwKKwkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NAorCQkJKG9jdCwgQ04yM1hYX1NMSV9JUV9ET09SQkVMTCgwKSkpKTsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiU0xJX0lRX0JBU0VBRERSXzAgWzB4JXhdOiAweCUwMTZsbHhcbiIsCisJCUNOMjNYWF9TTElfSVFfQkFTRV9BRERSNjQoMCksCisJCUNWTV9DQVNUNjQob2N0ZW9uX3JlYWRfY3NyNjQKKwkJCShvY3QsIENOMjNYWF9TTElfSVFfQkFTRV9BRERSNjQoMCkpKSk7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIlNMSV9JUV9GSUZPX1JTSVpFXzAgWzB4JXhdOiAweCUwMTZsbHhcbiIsCisJCUNOMjNYWF9TTElfSVFfU0laRSgwKSwKKwkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfSVFfU0laRSgwKSkpKTsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiU0xJX0NUTF9TVEFUVVMgWzB4JXhdOiAweCUwMTZsbHhcbiIsCisJCUNOMjNYWF9TTElfQ1RMX1NUQVRVUywKKwkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfQ1RMX1NUQVRVUykpKTsKKworCWZvciAocV9ubyA9IDA7IHFfbm8gPCBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUzsgcV9ubysrKSB7CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiU0xJX1BLVFslZF1fSU5QVVRfQ1RMIFsweCV4XTogMHglMDE2bGx4XG4iLAorCQkJcV9ubywgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KHFfbm8pLAorCQkJQ1ZNX0NBU1Q2NChvY3Rlb25fcmVhZF9jc3I2NAorCQkJCShvY3QsCisJCQkJCUNOMjNYWF9TTElfSVFfUEtUX0NPTlRST0w2NChxX25vKSkpKTsKKwl9CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQob2N0LT5wY2lfZGV2LCBDTjIzWFhfQ09ORklHX1BDSUVfREVWQ1RMLCAmcmVndmFsKTsKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIkNvbmZpZyBEZXZDdGwgWzB4JXhdOiAweCUwOHhcbiIsCisJCUNOMjNYWF9DT05GSUdfUENJRV9ERVZDVEwsIHJlZ3ZhbCk7CisKKwlkZXZfZGJnKCZvY3QtPnBjaV9kZXYtPmRldiwgIlNMSV9QUlRbJWRdX0NGRyBbMHglbGx4XTogMHglMDE2bGx4XG4iLAorCQlvY3QtPnBjaWVfcG9ydCwgQ04yM1hYX0RQSV9TTElfUFJUWF9DRkcob2N0LT5wY2llX3BvcnQpLAorCQlDVk1fQ0FTVDY0KGxpb19wY2lfcmVhZHEoCisJCQlvY3QsIENOMjNYWF9EUElfU0xJX1BSVFhfQ0ZHKG9jdC0+cGNpZV9wb3J0KSkpKTsKKworCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiU0xJX1MyTV9QT1JUWyVkXV9DVEwgWzB4JXhdOiAweCUwMTZsbHhcbiIsCisJCW9jdC0+cGNpZV9wb3J0LCBDTjIzWFhfU0xJX1MyTV9QT1JUWF9DVEwob2N0LT5wY2llX3BvcnQpLAorCQlDVk1fQ0FTVDY0KG9jdGVvbl9yZWFkX2NzcjY0KAorCQkJb2N0LCBDTjIzWFhfU0xJX1MyTV9QT1JUWF9DVEwob2N0LT5wY2llX3BvcnQpKSkpOworfQorCitpbnQgY24yM3h4X2Z3X2xvYWRlZChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXU2NCB2YWw7CisKKwl2YWwgPSBvY3Rlb25fcmVhZF9jc3I2NChvY3QsIENOMjNYWF9TTElfU0NSQVRDSDEpOworCXJldHVybiAodmFsID4+IDEpICYgMVVMTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjIzeHhfcGZfZGV2aWNlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY24yM3h4X3BmX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYjVjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY24yM3h4X3BmX2RldmljZS5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEF1dGhvcjogQ2F2aXVtLCBJbmMuCisqCisqIENvbnRhY3Q6IHN1cHBvcnRAY2F2aXVtLmNvbQorKiAgICAgICAgICBQbGVhc2UgaW5jbHVkZSAiTGlxdWlkSU8iIGluIHRoZSBzdWJqZWN0LgorKgorKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNSBDYXZpdW0sIEluYy4KKyoKKyogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbiAyLCBhcworKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyoKKyogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorKiBBUy1JUyBhbmQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFRJVExFLCBvcgorKiBOT05JTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCisqIGRldGFpbHMuCisqCisqIFRoaXMgZmlsZSBtYXkgYWxzbyBiZSBhdmFpbGFibGUgdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBmcm9tIENhdml1bS4KKyogQ29udGFjdCBDYXZpdW0sIEluYy4gZm9yIG1vcmUgaW5mb3JtYXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qISBcZmlsZSAgY24yM3h4X2RldmljZS5oCisgKiBcYnJpZWYgSG9zdCBEcml2ZXI6IFJvdXRpbmVzIHRoYXQgcGVyZm9ybSBDTjIzWFggc3BlY2lmaWMgb3BlcmF0aW9ucy4KKyovCisKKyNpZm5kZWYgX19DTjIzWFhfUEZfREVWSUNFX0hfXworI2RlZmluZSBfX0NOMjNYWF9QRl9ERVZJQ0VfSF9fCisKKyNpbmNsdWRlICJjbjIzeHhfcGZfcmVncy5oIgorCisvKiBSZWdpc3RlciBhZGRyZXNzIGFuZCBjb25maWd1cmF0aW9uIGZvciBhIENOMjNYWCBkZXZpY2VzLgorICogSWYgZGV2aWNlIHNwZWNpZmljIGNoYW5nZXMgbmVlZCB0byBiZSBtYWRlIHRoZW4gYWRkIGEgc3RydWN0IHRvIGluY2x1ZGUKKyAqIGRldmljZSBzcGVjaWZpYyBmaWVsZHMgYXMgc2hvd24gaW4gdGhlIGNvbW1lbnRlZCBzZWN0aW9uCisgKi8KK3N0cnVjdCBvY3Rlb25fY24yM3h4X3BmIHsKKwkvKiogUENJIGludGVycnVwdCBzdW1tYXJ5IHJlZ2lzdGVyICovCisJdTggX19pb21lbSAqaW50cl9zdW1fcmVnNjQ7CisKKwkvKiogUENJIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwl1OCBfX2lvbWVtICppbnRyX2VuYl9yZWc2NDsKKworCS8qKiBUaGUgUENJIGludGVycnVwdCBtYXNrIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwl1NjQgaW50cl9tYXNrNjQ7CisKKwlzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyAqY29uZjsKK307CisKK2ludCBzZXR1cF9jbjIzeHhfb2N0ZW9uX3BmX2RldmljZShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KTsKKworaW50IHZhbGlkYXRlX2NuMjN4eF9wZl9jb25maWdfaW5mbyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LAorCQkJCSAgIHN0cnVjdCBvY3Rlb25fY29uZmlnICpjb25mMjN4eCk7CisKK3UzMiBjbjIzeHhfcGZfZ2V0X29xX3RpY2tzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHUzMiB0aW1lX2ludHJfaW5fdXMpOworCit2b2lkIGNuMjN4eF9kdW1wX3BmX2luaXRpYWxpemVkX3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCk7CisKK2ludCBjbjIzeHhfZndfbG9hZGVkKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY24yM3h4X3BmX3JlZ3MuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjIzeHhfcGZfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDc5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY24yM3h4X3BmX3JlZ3MuaApAQCAtMCwwICsxLDYwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQXV0aG9yOiBDYXZpdW0sIEluYy4KKyoKKyogQ29udGFjdDogc3VwcG9ydEBjYXZpdW0uY29tCisqICAgICAgICAgIFBsZWFzZSBpbmNsdWRlICJMaXF1aWRJTyIgaW4gdGhlIHN1YmplY3QuCisqCisqIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENhdml1bSwgSW5jLgorKgorKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKgorKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisqIEFTLUlTIGFuZCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyogZGV0YWlscy4KKyoKKyogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorKiBDb250YWN0IENhdml1bSwgSW5jLiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyohIFxmaWxlIGNuMjN4eF9yZWdzLmgKKyAqIFxicmllZiBIb3N0IERyaXZlcjogUmVnaXN0ZXIgQWRkcmVzcyBhbmQgUmVnaXN0ZXIgTWFzayB2YWx1ZXMgZm9yCisgKiBPY3Rlb24gQ04yM1hYIGRldmljZXMuCisqLworCisjaWZuZGVmIF9fQ04yM1hYX1BGX1JFR1NfSF9fCisjZGVmaW5lIF9fQ04yM1hYX1BGX1JFR1NfSF9fCisKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfVkVORE9SX0lECTB4MDAKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfREVWSUNFX0lECTB4MDIKKworI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19YUEFOU0lPTl9CQVIgICAgICAgICAgICAgMHgzOAorCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX01TSVhfQ0FQCQkgICAweDUwCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX01TSVhfTE1TSQkJICAgMHg1NAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19NU0lYX1VNU0kJCSAgIDB4NTgKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfTVNJWF9NU0lNRAkJICAgMHg1QworI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19NU0lYX01TSU1NCQkgICAweDYwCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX01TSVhfTVNJTVAJCSAgIDB4NjQKKworI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX0NBUCAgICAgICAgICAgICAgICAgMHg3MAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNBUCAgICAgICAgICAgICAgMHg3NAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNUTCAgICAgICAgICAgICAgMHg3OAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX0xJTktDQVAgICAgICAgICAgICAgMHg3QworI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX0xJTktDVEwgICAgICAgICAgICAgMHg4MAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX1NMT1RDQVAgICAgICAgICAgICAgMHg4NAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX1NMT1RDVEwgICAgICAgICAgICAgMHg4OAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX0RFVkNUTDIgICAgICAgICAgICAgMHg5OAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX0xJTktDVEwyICAgICAgICAgICAgMHhBMAorI2RlZmluZSAgICAgQ04yM1hYX0NPTkZJR19QQ0lFX1VOQ09SUkVDVF9FUlJfTUFTSyAgMHgxMDgKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9DT1JSRUNUX0VSUl9TVEFUVVMgIDB4MTEwCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1BDSUVfREVWQ1RMX01BU0sgICAgICAgICAweDAwMDQwMDAwCisKKyNkZWZpbmUgICAgIENOMjNYWF9QQ0lFX1NSSU9WX0ZETAkJICAgMHgxODgKKyNkZWZpbmUgICAgIENOMjNYWF9QQ0lFX1NSSU9WX0ZETF9CSVRfUE9TCSAgIDB4MTAKKyNkZWZpbmUgICAgIENOMjNYWF9QQ0lFX1NSSU9WX0ZETF9NQVNLCQkgICAweEZGCisKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfUENJRV9GTFRNU0sgICAgICAgICAgICAgIDB4NzIwCisKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfU1JJT1ZfVkZERVZJRCAgICAgICAgICAgIDB4MTkwCisKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfU1JJT1ZfQkFSX1NUQVJUCSAgIDB4MTlDCisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1NSSU9WX0JBUlgoaSkJCVwKKwkJKENOMjNYWF9DT05GSUdfU1JJT1ZfQkFSX1NUQVJUICsgKGkgKiA0KSkKKyNkZWZpbmUgICAgIENOMjNYWF9DT05GSUdfU1JJT1ZfQkFSX1BGCQkgICAweDA4CisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1NSSU9WX0JBUl82NEJJVAkgICAweDA0CisjZGVmaW5lICAgICBDTjIzWFhfQ09ORklHX1NSSU9WX0JBUl9JTwkJICAgMHgwMQorCisvKiAjIyMjIyMjIyMjIyMjIyAgQkFSMCBSZWdpc3RlcnMgIyMjIyMjIyMjIyMjIyMjIyAqLworCisjZGVmaW5lICAgIENOMjNYWF9TTElfQ1RMX1BPUlRfU1RBUlQgICAgICAgICAgICAgICAweDI4NkUwCisjZGVmaW5lICAgIENOMjNYWF9QT1JUX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAweDEwCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9DVExfUE9SVChwKSAgICAgICAgICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfQ1RMX1BPUlRfU1RBUlQgKyAoKHApICogQ04yM1hYX1BPUlRfT0ZGU0VUKSkKKworLyogMiBzY2F0Y2ggcmVnaXN0ZXJzICg2NC1iaXQpICAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX1dJTkRPV19DVEwgICAgICAgICAgICAgICAgICAgMHgyODJFMAorI2RlZmluZSAgICBDTjIzWFhfU0xJX1NDUkFUQ0gxICAgICAgICAgICAgICAgICAgICAgMHgyODNDMAorI2RlZmluZSAgICBDTjIzWFhfU0xJX1NDUkFUQ0gyICAgICAgICAgICAgICAgICAgICAgMHgyODNEMAorI2RlZmluZSAgICBDTjIzWFhfU0xJX1dJTkRPV19DVExfREVGQVVMVCAgICAgICAgICAgMHgyMDAwMDBVTEwKKworLyogMSByZWdpc3RlcnMgKDY0LWJpdCkgIC0gU0xJX0NUTF9TVEFUVVMgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9DVExfU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4Mjg1NzAKKworLyogU0xJIFBhY2tldCBJbnB1dCBKYWJiZXIgUmVnaXN0ZXIgKDY0IGJpdCByZWdpc3RlcikKKyAqIDwzMTowPiBmb3IgQnl0ZSBjb3VudCBmb3IgbGltaXRpbmcgc2l6ZXMgb2YgcGFja2V0IHNpemVzCisgKiB0aGF0IGFyZSBhbGxvd2VkIGZvciBzbGkgcGFja2V0IGluYm91bmQgcGFja2V0cy4KKyAqIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDB4RkEwMCg9NjQwMDApLgorICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfUEtUX0lOX0pBQkJFUiAgICAgICAgICAgICAgICAweDI5MTcwCisvKiBUaGUgaW5wdXQgamFiYmVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBUU08gbWF4IHNpemUuCisgKiBEdWUgdG8gSC9XIGxpbWl0YXRpb24sIHRoaXMgbmVlZCB0byBiZSByZWR1Y2VkIHRvIDYwMDAwCisgKiBpbiBvcmRlciB0byB0byBIL1cgVFNPIGFuZCBhdm9pZCB0aGUgV1FFIG1hbGZhcm1hdGlvbgorICogUEtPX0JVR18yNDk4OV9XUUVfTEVOCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RFRkFVTFRfSU5QVVRfSkFCQkVSICAgICAgICAgICAgIDB4RUE2MCAvKjYwMDAwKi8KKworI2RlZmluZSAgICBDTjIzWFhfV0lOX1dSX0FERFJfTE8gICAgICAgICAgICAgICAgICAgMHgyMDAwMAorI2RlZmluZSAgICBDTjIzWFhfV0lOX1dSX0FERFJfSEkgICAgICAgICAgICAgICAgICAgMHgyMDAwNAorI2RlZmluZSAgICBDTjIzWFhfV0lOX1dSX0FERFI2NCAgICAgICAgICAgICAgICAgICAgQ04yM1hYX1dJTl9XUl9BRERSX0xPCisKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9SRF9BRERSX0xPICAgICAgICAgICAgICAgICAgIDB4MjAwMTAKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9SRF9BRERSX0hJICAgICAgICAgICAgICAgICAgIDB4MjAwMTQKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9SRF9BRERSNjQgICAgICAgICAgICAgICAgICAgIENOMjNYWF9XSU5fUkRfQUREUl9MTworCisjZGVmaW5lICAgIENOMjNYWF9XSU5fV1JfREFUQV9MTyAgICAgICAgICAgICAgICAgICAweDIwMDIwCisjZGVmaW5lICAgIENOMjNYWF9XSU5fV1JfREFUQV9ISSAgICAgICAgICAgICAgICAgICAweDIwMDI0CisjZGVmaW5lICAgIENOMjNYWF9XSU5fV1JfREFUQTY0ICAgICAgICAgICAgICAgICAgICBDTjIzWFhfV0lOX1dSX0RBVEFfTE8KKworI2RlZmluZSAgICBDTjIzWFhfV0lOX1JEX0RBVEFfTE8gICAgICAgICAgICAgICAgICAgMHgyMDA0MAorI2RlZmluZSAgICBDTjIzWFhfV0lOX1JEX0RBVEFfSEkgICAgICAgICAgICAgICAgICAgMHgyMDA0NAorI2RlZmluZSAgICBDTjIzWFhfV0lOX1JEX0RBVEE2NCAgICAgICAgICAgICAgICAgICAgQ04yM1hYX1dJTl9SRF9EQVRBX0xPCisKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9XUl9NQVNLX0xPICAgICAgICAgICAgICAgICAgIDB4MjAwMzAKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9XUl9NQVNLX0hJICAgICAgICAgICAgICAgICAgIDB4MjAwMzQKKyNkZWZpbmUgICAgQ04yM1hYX1dJTl9XUl9NQVNLX1JFRyAgICAgICAgICAgICAgICAgIENOMjNYWF9XSU5fV1JfTUFTS19MTworI2RlZmluZSAgICBDTjIzWFhfU0xJX01BQ19DUkVESVRfQ05UICAgICAgICAgICAgICAgMHgyM0Q3MAorCisvKiA0IHJlZ2lzdGVycyAoNjQtYml0KSBmb3IgbWFwcGluZyBJT1FzIHRvIE1BQ3MoUEVNcyktCisgKiBTTElfUEtUX01BQygwLi4zKV9QRigwLi4xKV9SSU5GTworICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfUEtUX01BQ19SSU5GT19TVEFSVDY0ICAgICAgIDB4MjkwMzAKKworLyoxIHJlZ2lzdGVyICg2NC1iaXQpIHRvIGRldGVybWluZSB3aGV0aGVyIElPUXMgYXJlIGluIHJlc2V0LiAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX1BLVF9JT1FfUklOR19SU1QgICAgICAgICAgICAweDI5MUUwCisKKy8qIEVhY2ggSW5wdXQgUXVldWUgcmVnaXN0ZXIgaXMgYXQgYSAxNi1ieXRlIE9mZnNldCBpbiBCQVIwICovCisjZGVmaW5lICAgIENOMjNYWF9JUV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAKKworI2RlZmluZSAgICBDTjIzWFhfTUFDX1JJTkZPX09GRlNFVCAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lICAgIENOMjNYWF9QRl9SSU5GT19PRkZTRVQgICAgICAgICAgICAgICAgIDB4MTAKKworI2RlZmluZSBDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NChtYWMsIHBmKQkJXAorCQkoQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPX1NUQVJUNjQgKyAgICAgXAorCQkgKChtYWMpICogQ04yM1hYX01BQ19SSU5GT19PRkZTRVQpICsJXAorCQkgKChwZikgKiBDTjIzWFhfUEZfUklORk9fT0ZGU0VUKSkKKworLyoqIG1hc2sgZm9yIHRvdGFsIHJpbmdzLCBzZXR0aW5nIFRSUyB0byBiYXNlICovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfTUFDX0NUTF9SSU5GT19UUlMgICAgICAgICAgICAgICBCSVRfVUxMKDE2KQorLyoqIG1hc2sgZm9yIHN0YXJ0aW5nIHJpbmcgbnVtYmVyOiBzZXR0aW5nIFNSTiA8NjowPiA9IDB4N0YgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9NQUNfQ1RMX1JJTkZPX1NSTiAgICAgICAgICAgICAgICgweDdGKQorCisvKiBTdGFydGluZyBiaXQgb2YgdGhlIFRSUyBmaWVsZCBpbiBDTjIzWFhfU0xJX1BLVF9NQUNfUklORk82NCByZWdpc3RlciAqLworI2RlZmluZSAgICBDTjIzWFhfUEtUX01BQ19DVExfUklORk9fVFJTX0JJVF9QT1MgICAgIDE2CisvKiBTdGFydGluZyBiaXQgb2YgU1JOIGZpZWxkIGluIENOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0IHJlZ2lzdGVyICovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfTUFDX0NUTF9SSU5GT19TUk5fQklUX1BPUyAgICAgMAorLyogU3RhcnRpbmcgYml0IG9mIFJQVkYgZmllbGQgaW4gQ04yM1hYX1NMSV9QS1RfTUFDX1JJTkZPNjQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9NQUNfQ1RMX1JJTkZPX1JQVkZfQklUX1BPUyAgICAgMzIKKy8qIFN0YXJ0aW5nIGJpdCBvZiBOVkZTIGZpZWxkIGluIENOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0IHJlZ2lzdGVyICovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfTUFDX0NUTF9SSU5GT19OVkZTX0JJVF9QT1MgICAgIDQ4CisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSRVFVRVNUIFFVRVVFICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisvKiA2NCByZWdpc3RlcnMgZm9yIElucHV0IFF1ZXVlIEluc3RyIENvdW50IC0gU0xJX1BLVF9JTl9ET05FMF9DTlRTICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfSVFfSU5TVFJfQ09VTlRfU1RBUlQ2NCAgICAgMHgxMDA0MAorCisvKiA2NCByZWdpc3RlcnMgZm9yIElucHV0IFF1ZXVlcyBTdGFydCBBZGRyIC0gU0xJX1BLVDBfSU5TVFJfQkFERFIgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JUV9CQVNFX0FERFJfU1RBUlQ2NCAgICAgICAweDEwMDEwCisKKy8qIDY0IHJlZ2lzdGVycyBmb3IgSW5wdXQgRG9vcmJlbGwgLSBTTElfUEtUMF9JTlNUUl9CQU9GRl9EQkVMTCAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lRX0RPT1JCRUxMX1NUQVJUICAgICAgICAgIDB4MTAwMjAKKworLyogNjQgcmVnaXN0ZXJzIGZvciBJbnB1dCBRdWV1ZSBzaXplIC0gU0xJX1BLVDBfSU5TVFJfRklGT19SU0laRSAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lRX1NJWkVfU1RBUlQgICAgICAgICAgICAgIDB4MTAwMzAKKworLyogNjQgcmVnaXN0ZXJzICg2NC1iaXQpIC0gRVMsIFJPLCBOUywgQXJiaXRyYXRpb24gZm9yIElucHV0IFF1ZXVlIERhdGEgJgorICogZ2F0aGVyIGxpc3QgZmV0Y2hlcy4gU0xJX1BLVCgwLi42MylfSU5QVVRfQ09OVFJPTC4KKyAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MX1NUQVJUNjQgICAgMHgxMDAwMAorCisvKi0tLS0tLS0gUmVxdWVzdCBRdWV1ZSBNYWNyb3MgLS0tLS0tLS0tKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JUV9QS1RfQ09OVFJPTDY0KGlxKSAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MX1NUQVJUNjQgKyAoKGlxKSAqIENOMjNYWF9JUV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfSVFfQkFTRV9BRERSNjQoaXEpICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfSVFfQkFTRV9BRERSX1NUQVJUNjQgKyAoKGlxKSAqIENOMjNYWF9JUV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfSVFfU0laRShpcSkgICAgICAgICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfSVFfU0laRV9TVEFSVCArICgoaXEpICogQ04yM1hYX0lRX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JUV9ET09SQkVMTChpcSkgICAgICAgICAgICAgXAorCQkoQ04yM1hYX1NMSV9JUV9ET09SQkVMTF9TVEFSVCArICgoaXEpICogQ04yM1hYX0lRX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9JUV9JTlNUUl9DT1VOVDY0KGlxKSAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX0lRX0lOU1RSX0NPVU5UX1NUQVJUNjQgKyAoKGlxKSAqIENOMjNYWF9JUV9PRkZTRVQpKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLSBNYXNrcyAtLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfVkZfTlVNICAgICAgICAgICAgICAgICAgQklUX1VMTCgzMikKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfTUFDX05VTSAgICAgICAgICAgICAgICAgQklUKDI5KQorLyogTnVtYmVyIG9mIGluc3RydWN0aW9ucyB0byBiZSByZWFkIGluIG9uZSBNQUMgcmVhZCByZXF1ZXN0LgorICogc2V0dGluZyB0byBNYXggdmFsdWUoNCkKKyAqLworI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SRFNJWkUgICAgICAgICAgICAgICAgICAoMyA8PCAyNSkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfSVNfNjRCICAgICAgICAgICAgICAgICAgQklUKDI0KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SU1QgICAgICAgICAgICAgICAgICAgICBCSVQoMjMpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1FVSUVUICAgICAgICAgICAgICAgICAgIEJJVCgyOCkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfUklOR19FTkIgICAgICAgICAgICAgICAgQklUKDIyKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9EQVRBX05TICAgICAgICAgICAgICAgICBCSVQoOCkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfREFUQV9FU182NEJfU1dBUCAgICAgICAgQklUKDYpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX0RBVEFfUk8gICAgICAgICAgICAgICAgIEJJVCg1KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9VU0VfQ1NSICAgICAgICAgICAgICAgICBCSVQoNCkKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfR0FUSEVSX05TICAgICAgICAgICAgICAgQklUKDMpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX0dBVEhFUl9FU182NEJfU1dBUCAgICAgICgyKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9HQVRIRVJfUk8gICAgICAgICAgICAgICAoMSkKKworLyoqIFJpbmdzIHBlciBWaXJ0dWFsIEZ1bmN0aW9uICoqLworI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9SUFZGX01BU0sgICAgICAgICAgICAgICAoMHgzRikKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfUlBWRl9QT1MgICAgICAgICAgICAgICAgKDQ4KQorLyoqIFRoZXNlIGJpdHNbNDc6NDRdIHNlbGVjdCB0aGUgUGh5c2ljYWwgZnVuY3Rpb24gbnVtYmVyIHdpdGhpbiB0aGUgTUFDICovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1BGX05VTV9NQVNLICAgICAgICAgICAgICgweDcpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1BGX05VTV9QT1MgICAgICAgICAgICAgICg0NSkKKy8qKiBUaGVzZSBiaXRzWzQzOjMyXSBzZWxlY3QgdGhlIGZ1bmN0aW9uIG51bWJlciB3aXRoaW4gdGhlIFBGICovCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1ZGX05VTV9NQVNLICAgICAgICAgICAgICgweDFGRkYpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1ZGX05VTV9QT1MgICAgICAgICAgICAgICgzMikKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfTUFDX05VTV9NQVNLICAgICAgICAgICAgKDB4MykKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfTUFDX05VTV9QT1MgICAgICAgICAgICAgKDI5KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOX0RPTkVfV01BUktfTUFTSyAgICAgICAgICAgICAgICAoMHhGRkZGVUxMKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOX0RPTkVfV01BUktfQklUX1BPUyAgICAgICAgICAgICAoMzIpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfSU5fRE9ORV9DTlRfTUFTSyAgICAgICAgICAgICAgICAgICgweDAwMDAwMDAwRkZGRkZGRkZVTEwpCisKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9JTlBVVF9DVExfTUFTSwkJCQlcCisJCShDTjIzWFhfUEtUX0lOUFVUX0NUTF9SRFNJWkUJCXwJXAorCQkgQ04yM1hYX1BLVF9JTlBVVF9DVExfREFUQV9FU182NEJfU1dBUAl8CVwKKwkJIENOMjNYWF9QS1RfSU5QVVRfQ1RMX1VTRV9DU1IpCisjZWxzZQorI2RlZmluZSAgICBDTjIzWFhfUEtUX0lOUFVUX0NUTF9NQVNLCQkJCVwKKwkJKENOMjNYWF9QS1RfSU5QVVRfQ1RMX1JEU0laRQkJfAlcCisJCSBDTjIzWFhfUEtUX0lOUFVUX0NUTF9EQVRBX0VTXzY0Ql9TV0FQCXwJXAorCQkgQ04yM1hYX1BLVF9JTlBVVF9DVExfVVNFX0NTUgkJfAlcCisJCSBDTjIzWFhfUEtUX0lOUFVUX0NUTF9HQVRIRVJfRVNfNjRCX1NXQVApCisjZW5kaWYKKworLyoqIE1hc2tzIGZvciBTTElfUEtUX0lOX0RPTkUoMC4uNjMpX0NOVFMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0lOX0RPTkVfQ05UU19QSV9JTlQgICAgICAgICAgICAgICBCSVRfVUxMKDYyKQorI2RlZmluZSAgICBDTjIzWFhfSU5fRE9ORV9DTlRTX0NJTlRfRU5CICAgICAgICAgICAgIEJJVF9VTEwoNDgpCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBPVVRQVVQgUVVFVUUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisKKy8qIDY0IHJlZ2lzdGVycyBmb3IgT3V0cHV0IHF1ZXVlIGNvbnRyb2wgLSBTTElfUEtUKDAuLjYzKV9PVVRQVVRfQ09OVFJPTCAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MX1NUQVJUICAgICAgIDB4MTAwNTAKKworLyogNjQgcmVnaXN0ZXJzIGZvciBPdXRwdXQgcXVldWUgYnVmZmVyIGFuZCBpbmZvIHNpemUgLSBTTElfUEtUMF9PVVRfU0laRSAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RMF9CVUZGX0lORk9fU0laRSAgICAgICAgIDB4MTAwNjAKKworLyogNjQgcmVnaXN0ZXJzIGZvciBPdXRwdXQgUXVldWUgU3RhcnQgQWRkciAtIFNMSV9QS1QwX1NMSVNUX0JBRERSICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfQkFTRV9BRERSX1NUQVJUNjQgICAgICAgMHgxMDA3MAorCisvKiA2NCByZWdpc3RlcnMgZm9yIE91dHB1dCBRdWV1ZSBQYWNrZXQgQ3JlZGl0cyAtIFNMSV9QS1QwX1NMSVNUX0JBT0ZGX0RCRUxMICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfUEtUX0NSRURJVFNfU1RBUlQgICAgICAgMHgxMDA4MAorCisvKiA2NCByZWdpc3RlcnMgZm9yIE91dHB1dCBRdWV1ZSBzaXplIC0gU0xJX1BLVDBfU0xJU1RfRklGT19SU0laRSAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1NJWkVfU1RBUlQgICAgICAgICAgICAgIDB4MTAwOTAKKworLyogNjQgcmVnaXN0ZXJzIGZvciBPdXRwdXQgUXVldWUgUGFja2V0IENvdW50IC0gU0xJX1BLVDBfQ05UUyAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1BLVF9TRU5UX1NUQVJUICAgICAgICAgIDB4MTAwQjAKKworLyogNjQgcmVnaXN0ZXJzIGZvciBPdXRwdXQgUXVldWUgSU5UIExldmVscyAtIFNMSV9QS1QwX0lOVF9MRVZFTFMgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMU19TVEFSVDY0ICAgMHgxMDBBMAorCisvKiBFYWNoIE91dHB1dCBRdWV1ZSByZWdpc3RlciBpcyBhdCBhIDE2LWJ5dGUgT2Zmc2V0IGluIEJBUjAgKi8KKyNkZWZpbmUgICAgQ04yM1hYX09RX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwCisKKy8qIDEgKDY0LWJpdCByZWdpc3RlcikgZm9yIE91dHB1dCBRdWV1ZSBiYWNrcHJlc3N1cmUgYWNyb3NzIGFsbCByaW5ncy4gKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9XTUFSSyAgICAgICAgICAgICAgICAgICAweDI5MTgwCisKKy8qIEdsb2JhbCBwa3QgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX0dCTF9DT05UUk9MICAgICAgICAgICAgICAgIDB4MjkyMTAKKworLyogQmFja3ByZXNzdXJlIGVuYWJsZSByZWdpc3RlciBmb3IgUEYwICAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09VVF9CUF9FTl9XMVMgICAgICAgICAgICAgIDB4MjkyNjAKKworLyogQmFja3ByZXNzdXJlIGVuYWJsZSByZWdpc3RlciBmb3IgUEYxICAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX09VVF9CUF9FTjJfVzFTICAgICAgICAgICAgIDB4MjkyNzAKKworLyogQmFja3ByZXNzdXJlIGRpc2FibGUgcmVnaXN0ZXIgZm9yIFBGMCAgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PVVRfQlBfRU5fVzFDICAgICAgICAgICAgICAweDI5MjgwCisKKy8qIEJhY2twcmVzc3VyZSBkaXNhYmxlIHJlZ2lzdGVyIGZvciBQRjEgICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1VUX0JQX0VOMl9XMUMgICAgICAgICAgICAgMHgyOTI5MAorCisvKi0tLS0tLS0gT3V0cHV0IFF1ZXVlIE1hY3JvcyAtLS0tLS0tLS0qLworCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0wob3EpICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfT1FfUEtUX0NPTlRST0xfU1RBUlQgKyAoKG9xKSAqIENOMjNYWF9PUV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfQkFTRV9BRERSNjQob3EpICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfT1FfQkFTRV9BRERSX1NUQVJUNjQgKyAoKG9xKSAqIENOMjNYWF9PUV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfU0laRShvcSkgICAgICAgICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfT1FfU0laRV9TVEFSVCArICgob3EpICogQ04yM1hYX09RX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9CVUZGX0lORk9fU0laRShvcSkgICAgICAgICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfT1EwX0JVRkZfSU5GT19TSVpFICsgKChvcSkgKiBDTjIzWFhfT1FfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1BLVFNfU0VOVChvcSkgICAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX09RX1BLVF9TRU5UX1NUQVJUICsgKChvcSkgKiBDTjIzWFhfT1FfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1BLVFNfQ1JFRElUKG9xKSAgICAgICAgICBcCisJCShDTjIzWFhfU0xJX09RX1BLVF9DUkVESVRTX1NUQVJUICsgKChvcSkgKiBDTjIzWFhfT1FfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTKG9xKQkJXAorCQkoQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMU19TVEFSVDY0ICsJXAorCQkgKChvcSkgKiBDTjIzWFhfT1FfT0ZGU0VUKSkKKworLypNYWNybydzIGZvciBhY2Nlc3NpbmcgQ05UIGFuZCBUSU1FIHNlcGFyYXRlbHkgZnJvbSBJTlRfTEVWRUxTKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMU19DTlQob3EpCQlcCisJCShDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTX1NUQVJUNjQgKyBcCisJCSAoKG9xKSAqIENOMjNYWF9PUV9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFNfVElNRShvcSkJXAorCQkoQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMU19TVEFSVDY0ICsJXAorCQkgKChvcSkgKiBDTjIzWFhfT1FfT0ZGU0VUKSArIDQpCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tIE1hc2tzIC0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfVEVOQiAgICAgICAgICAgICAgICAgIEJJVCgxMykKKyNkZWZpbmUgICAgQ04yM1hYX1BLVF9PVVRQVVRfQ1RMX0NFTkIgICAgICAgICAgICAgICAgICBCSVQoMTIpCisjZGVmaW5lICAgIENOMjNYWF9QS1RfT1VUUFVUX0NUTF9JUFRSICAgICAgICAgICAgICAgICAgQklUKDExKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfRVMgICAgICAgICAgICAgICAgICAgIEJJVCg5KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfTlNSICAgICAgICAgICAgICAgICAgIEJJVCg4KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfUk9SICAgICAgICAgICAgICAgICAgIEJJVCg3KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfRFBUUiAgICAgICAgICAgICAgICAgIEJJVCg2KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfQk1PREUgICAgICAgICAgICAgICAgIEJJVCg1KQorI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfRVNfUCAgICAgICAgICAgICAgICAgIEJJVCgzKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfTlNSX1AgICAgICAgICAgICAgICAgIEJJVCgyKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfUk9SX1AgICAgICAgICAgICAgICAgIEJJVCgxKQorI2RlZmluZSAgICBDTjIzWFhfUEtUX09VVFBVVF9DVExfUklOR19FTkIgICAgICAgICAgICAgIEJJVCgwKQorCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTWFpbGJveCBSZWcgTWFjcm9zICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisjZGVmaW5lICAgIENOMjNYWF9TTElfUEtUX01CT1hfSU5UX1NUQVJUICAgICAgICAgICAgIDB4MTAyMTAKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9QS1RfUEZfVkZfTUJPWF9TSUdfU1RBUlQgICAgICAgMHgxMDIwMAorI2RlZmluZSAgICBDTjIzWFhfU0xJX01BQ19QRl9NQk9YX0lOVF9TVEFSVCAgICAgICAgICAweDI3MzgwCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9NQk9YX09GRlNFVAkJICAgICAweDIwMDAwCisjZGVmaW5lICAgIENOMjNYWF9TTElfTUJPWF9TSUdfSURYX09GRlNFVAkgICAgIDB4OAorCisjZGVmaW5lICAgIENOMjNYWF9TTElfUEtUX01CT1hfSU5UKHEpICAgICAgICAgIFwKKwkJKENOMjNYWF9TTElfUEtUX01CT1hfSU5UX1NUQVJUICsgKChxKSAqIENOMjNYWF9TTElfTUJPWF9PRkZTRVQpKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfUEtUX1BGX1ZGX01CT1hfU0lHKHEsIGlkeCkJCVwKKwkJKENOMjNYWF9TTElfUEtUX1BGX1ZGX01CT1hfU0lHX1NUQVJUICsJCVwKKwkJICgocSkgKiBDTjIzWFhfU0xJX01CT1hfT0ZGU0VUICsJCVwKKwkJICAoaWR4KSAqIENOMjNYWF9TTElfTUJPWF9TSUdfSURYX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9NQUNfUEZfTUJPWF9JTlQobWFjLCBwZikJCVwKKwkJKENOMjNYWF9TTElfTUFDX1BGX01CT1hfSU5UX1NUQVJUICsJXAorCQkgKChtYWMpICogQ04yM1hYX01BQ19JTlRfT0ZGU0VUICsJXAorCQkgIChwZikgKiBDTjIzWFhfUEZfSU5UX09GRlNFVCkpCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBETUEgQ291bnRlcnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisKKy8qIDIgcmVnaXN0ZXJzICg2NC1iaXQpIC0gRE1BIENvdW50IC0gMSBmb3IgZWFjaCBETUEgY291bnRlciAwLzEuICovCisjZGVmaW5lICAgIENOMjNYWF9ETUFfQ05UX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4Mjg0MDAKKworLyogMiByZWdpc3RlcnMgKDY0LWJpdCkgLSBETUEgVGltZXIgMC8xLCBjb250YWlucyBETUEgdGltZXIgdmFsdWVzICovCisvKiBTTElfRE1BXzBfVElNICovCisjZGVmaW5lICAgIENOMjNYWF9ETUFfVElNX1NUQVJUICAgICAgICAgICAgICAgICAgIDB4Mjg0MjAKKworLyogMiByZWdpc3RlcnMgKDY0LWJpdCkgLSBETUEgY291bnQgJiBUaW1lIEludGVycnVwdCB0aHJlc2hvbGQgLQorICogU0xJX0RNQV8wX0lOVF9MRVZFTAorICovCisjZGVmaW5lICAgIENOMjNYWF9ETUFfSU5UX0xFVkVMX1NUQVJUICAgICAgICAgICAgIDB4MjgzRTAKKworLyogRWFjaCBETUEgcmVnaXN0ZXIgaXMgYXQgYSAxNi1ieXRlIE9mZnNldCBpbiBCQVIwICovCisjZGVmaW5lICAgIENOMjNYWF9ETUFfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKworLyotLS0tLS0tLS0tIERNQSBDb3VudGVyIE1hY3JvcyAtLS0tLS0tLS0qLworI2RlZmluZSAgICBDTjIzWFhfRE1BX0NOVChkcSkgICAgICAgICAgICAgICAgICAgICAgXAorCQkoQ04yM1hYX0RNQV9DTlRfU1RBUlQgKyAoKGRxKSAqIENOMjNYWF9ETUFfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfRE1BX0lOVF9MRVZFTChkcSkgICAgICAgICAgICAgICAgXAorCQkoQ04yM1hYX0RNQV9JTlRfTEVWRUxfU1RBUlQgKyAoKGRxKSAqIENOMjNYWF9ETUFfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfRE1BX1BLVF9JTlRfTEVWRUwoZHEpICAgICAgICAgICAgXAorCQkoQ04yM1hYX0RNQV9JTlRfTEVWRUxfU1RBUlQgKyAoKGRxKSAqIENOMjNYWF9ETUFfT0ZGU0VUKSkKKworI2RlZmluZSAgICBDTjIzWFhfRE1BX1RJTUVfSU5UX0xFVkVMKGRxKSAgICAgICAgICAgXAorCQkoQ04yM1hYX0RNQV9JTlRfTEVWRUxfU1RBUlQgKyA0ICsgKChkcSkgKiBDTjIzWFhfRE1BX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX0RNQV9USU0oZHEpICAgICAgICAgICAgICAgICAgICAgXAorCQkoQ04yM1hYX0RNQV9USU1fU1RBUlQgKyAoKGRxKSAqIENOMjNYWF9ETUFfT0ZGU0VUKSkKKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgTVNJWCBUQUJMRSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworI2RlZmluZQlDTjIzWFhfTVNJWF9UQUJMRV9BRERSX1NUQVJUCQkweDAKKyNkZWZpbmUJQ04yM1hYX01TSVhfVEFCTEVfREFUQV9TVEFSVAkJMHg4CisKKyNkZWZpbmUJQ04yM1hYX01TSVhfVEFCTEVfU0laRQkJCTB4MTAKKyNkZWZpbmUJQ04yM1hYX01TSVhfVEFCTEVfRU5UUklFUwkJMHg0MQorCisjZGVmaW5lIENOMjNYWF9NU0lYX0VOVFJZX1ZFQ1RPUl9DVEwJQklUX1VMTCgzMikKKworI2RlZmluZQlDTjIzWFhfTVNJWF9UQUJMRV9BRERSKGlkeCkJCVwKKwkoQ04yM1hYX01TSVhfVEFCTEVfQUREUl9TVEFSVCArICgoaWR4KSAqIENOMjNYWF9NU0lYX1RBQkxFX1NJWkUpKQorCisjZGVmaW5lCUNOMjNYWF9NU0lYX1RBQkxFX0RBVEEoaWR4KQkJXAorCShDTjIzWFhfTVNJWF9UQUJMRV9EQVRBX1NUQVJUICsgKChpZHgpICogQ04yM1hYX01TSVhfVEFCTEVfU0laRSkpCisKKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIElOVEVSUlVQVFMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisjZGVmaW5lIENOMjNYWF9NQUNfSU5UX09GRlNFVCAgIDB4MjAKKyNkZWZpbmUgQ04yM1hYX1BGX0lOVF9PRkZTRVQgICAgMHgxMAorCisvKiAxIHJlZ2lzdGVyICg2NC1iaXQpIGZvciBJbnRlcnJ1cHQgU3VtbWFyeSAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lOVF9TVU02NCAgICAgICAgICAgIDB4MjcwMDAKKworLyogNCByZWdpc3RlcnMgKDY0LWJpdCkgZm9yIEludGVycnVwdCBFbmFibGUgZm9yIGVhY2ggUG9ydCAqLworI2RlZmluZSAgICBDTjIzWFhfU0xJX0lOVF9FTkI2NCAgICAgICAgICAgIDB4MjcwODAKKworI2RlZmluZSAgICBDTjIzWFhfU0xJX01BQ19QRl9JTlRfU1VNNjQobWFjLCBwZikJCQlcCisJCShDTjIzWFhfU0xJX0lOVF9TVU02NCArCQkJCVwKKwkJICgobWFjKSAqIENOMjNYWF9NQUNfSU5UX09GRlNFVCkgKwkJXAorCQkgKChwZikgKiBDTjIzWFhfUEZfSU5UX09GRlNFVCkpCisKKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9NQUNfUEZfSU5UX0VOQjY0KG1hYywgcGYpCQlcCisJCShDTjIzWFhfU0xJX0lOVF9FTkI2NCArCQkJXAorCQkgKChtYWMpICogQ04yM1hYX01BQ19JTlRfT0ZGU0VUKSArCVwKKwkJICgocGYpICogQ04yM1hYX1BGX0lOVF9PRkZTRVQpKQorCisvKiAxIHJlZ2lzdGVyICg2NC1iaXQpIHRvIGluZGljYXRlIHdoaWNoIE91dHB1dCBRdWV1ZSByZWFjaGVkIHBrdCB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9QS1RfQ05UX0lOVCAgICAgICAgICAgICAgICAweDI5MTMwCisKKy8qIDEgcmVnaXN0ZXIgKDY0LWJpdCkgdG8gaW5kaWNhdGUgd2hpY2ggT3V0cHV0IFF1ZXVlIHJlYWNoZWQgdGltZSB0aHJlc2hvbGQgKi8KKyNkZWZpbmUgICAgQ04yM1hYX1NMSV9QS1RfVElNRV9JTlQgICAgICAgICAgICAgICAweDI5MTQwCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tIEludGVycnVwdCBNYXNrcyAtLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9QT19JTlQJCQlCSVRfVUxMKDYzKQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9QSV9JTlQJCQlCSVRfVUxMKDYyKQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9NQk9YX0lOVAkJCUJJVF9VTEwoNjEpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1JFU0VORAkJCUJJVF9VTEwoNjApCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfQ0lOVF9FTkIgICAgICAgICAgICAgICAgIEJJVF9VTEwoNDgpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX01CT1hfRU5CICAgICAgICAgICAgICAgICBCSVQoMCkKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9STUxfVElNRU9VVF9FUlIgICAgICAgICAgICgxKQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX01JT19JTlQgICAgICAgICAgICAgICAgICAgQklUKDEpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUkVTRVJWRUQxICAgICAgICAgICAgICAgICAoMyA8PCAyKQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1BLVF9DT1VOVCAgICAgICAgICAgICAgICAgQklUKDQpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1BLVF9USU1FICAgICAgICAgICAgICAgICAgQklUKDUpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUkVTRVJWRUQyICAgICAgICAgICAgICAgICAoMyA8PCA2KQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX00wVVBCMF9FUlIgICAgICAgICAgICAgICAgQklUKDgpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX00wVVBXSV9FUlIgICAgICAgICAgICAgICAgQklUKDkpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX00wVU5CMF9FUlIgICAgICAgICAgICAgICAgQklUKDEwKQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9NMFVOV0lfRVJSICAgICAgICAgICAgICAgIEJJVCgxMSkKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9SRVNFUlZFRDMgICAgICAgICAgICAgICAgICgweEZGRkZGVUxMIDw8IDEyKQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0RNQTBfRk9SQ0UgICAgICAgICAgICAgICAgQklUX1VMTCgzMikKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRE1BMV9GT1JDRSAgICAgICAgICAgICAgICBCSVRfVUxMKDMzKQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0RNQTBfQ09VTlQgICAgICAgICAgICAgICAgQklUX1VMTCgzNCkKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRE1BMV9DT1VOVCAgICAgICAgICAgICAgICBCSVRfVUxMKDM1KQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0RNQTBfVElNRSAgICAgICAgICAgICAgICAgQklUX1VMTCgzNikKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRE1BMV9USU1FICAgICAgICAgICAgICAgICBCSVRfVUxMKDM3KQorCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1JFU0VSVkVENCAgICAgICAgICAgICAgICAgKDB4N0ZGRkZVTEwgPDwgMzgpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfVkZfTUJPWCAgICAgICAgICAgICAgICAgICBCSVRfVUxMKDU3KQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9ETUFWRl9FUlIgICAgICAgICAgICAgICAgIEJJVF9VTEwoNTgpCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0RNQVBGX0VSUiAgICAgICAgICAgICAgICAgQklUX1VMTCg1OSkKKworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9QS1RWRl9FUlIgICAgICAgICAgICAgICAgIEJJVF9VTEwoNjApCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1BLVFBGX0VSUiAgICAgICAgICAgICAgICAgQklUX1VMTCg2MSkKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfUFBWRl9FUlIgICAgICAgICAgICAgICAgICBCSVRfVUxMKDYyKQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9QUFBGX0VSUiAgICAgICAgICAgICAgICAgIEJJVF9VTEwoNjMpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRE1BMF9EQVRBICAgICAgICAgICAgICAgICAoQ04yM1hYX0lOVFJfRE1BMF9USU1FKQorI2RlZmluZSAgICBDTjIzWFhfSU5UUl9ETUExX0RBVEEgICAgICAgICAgICAgICAgIChDTjIzWFhfSU5UUl9ETUExX1RJTUUpCisKKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfRE1BX0RBVEEgICAgICAgICAgICAgICAgICBcCisJCShDTjIzWFhfSU5UUl9ETUEwX0RBVEEgfCBDTjIzWFhfSU5UUl9ETUExX0RBVEEpCisKKy8qIEJ5IGZhdWx0IG9ubHkgVElNRSBiYXNlZCAqLworI2RlZmluZSAgICBDTjIzWFhfSU5UUl9QS1RfREFUQSAgICAgICAgICAgICAgICAgIChDTjIzWFhfSU5UUl9QS1RfVElNRSkKKy8qIEZvciBib3RoIENPVU5UIGFuZCBUSU1FIGJhc2VkICovCisvKiAjZGVmaW5lICAgIENOMjNYWF9JTlRSX1BLVF9EQVRBICAgICAgICAgICAgICAgICAgXAorICogKENOMjNYWF9JTlRSX1BLVF9DT1VOVCB8IENOMjNYWF9JTlRSX1BLVF9USU1FKQorICovCisKKy8qIFN1bSBvZiBpbnRlcnJ1cHRzIGZvciBhbGwgUENJLUV4cHJlc3MgRGF0YSBJbnRlcnJ1cHRzICovCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX1BDSUVfREFUQSAgICAgICAgICAgICAgICAgXAorCQkoQ04yM1hYX0lOVFJfRE1BX0RBVEEgfCBDTjIzWFhfSU5UUl9QS1RfREFUKQorCisvKiBTdW0gb2YgaW50ZXJydXB0cyBmb3IgZXJyb3IgZXZlbnRzICovCisjZGVmaW5lICAgIENOMjNYWF9JTlRSX0VSUgkJCVwKKwkJKENOMjNYWF9JTlRSX00wVVBCMF9FUlIJfAlcCisJCSBDTjIzWFhfSU5UUl9NMFVQV0lfRVJSCXwJXAorCQkgQ04yM1hYX0lOVFJfTTBVTkIwX0VSUgl8CVwKKwkJIENOMjNYWF9JTlRSX00wVU5XSV9FUlIJfAlcCisJCSBDTjIzWFhfSU5UUl9ETUFWRl9FUlIJfAlcCisJCSBDTjIzWFhfSU5UUl9ETUFQRl9FUlIJfAlcCisJCSBDTjIzWFhfSU5UUl9QS1RQRl9FUlIJfAlcCisJCSBDTjIzWFhfSU5UUl9QUFBGX0VSUgl8CVwKKwkJIENOMjNYWF9JTlRSX1BQVkZfRVJSKQorCisvKiBQcm9ncmFtbWVkIE1hc2sgZm9yIEludGVycnVwdCBTdW0gKi8KKyNkZWZpbmUgICAgQ04yM1hYX0lOVFJfTUFTSwkJCVwKKwkJKENOMjNYWF9JTlRSX0RNQV9EQVRBCXwJXAorCQkgQ04yM1hYX0lOVFJfRE1BMF9GT1JDRQl8CVwKKwkJIENOMjNYWF9JTlRSX0RNQTFfRk9SQ0UJfAlcCisJCSBDTjIzWFhfSU5UUl9NSU9fSU5UCXwJXAorCQkgQ04yM1hYX0lOVFJfRVJSKQorCisvKiA0IFJlZ2lzdGVycyAoNjQgLSBiaXQpICovCisjZGVmaW5lICAgIENOMjNYWF9TTElfUzJNX1BPUlRfQ1RMX1NUQVJUICAgICAgICAgMHgyM0Q4MAorI2RlZmluZSAgICBDTjIzWFhfU0xJX1MyTV9QT1JUWF9DVEwocG9ydCkJXAorCQkoQ04yM1hYX1NMSV9TMk1fUE9SVF9DVExfU1RBUlQgKyAocG9ydCAqIDB4MTApKQorCisjZGVmaW5lICAgIENOMjNYWF9TTElfTUFDX05VTUJFUiAgICAgICAgICAgICAgICAgMHgyMDA1MAorCisvKiogUEVNKDAuLjMpX0JBUjFfSU5ERVgoMC4uMTUpYWRkcmVzcyBpcyBkZWZpbmVkIGFzCisgKiAgYWRkciA9ICgweDAwMDExODAwQzAwMDAxMDAgIHxwb3J0IDw8MjQgfGlkeCA8PDMgKQorICogIEhlcmUsIHBvcnQgaXMgUEVNKDAuLjMpICYgaWR4IGlzIElOREVYKDAuLjE1KQorICovCisjZGVmaW5lICAgIENOMjNYWF9QRU1fQkFSMV9JTkRFWF9TVEFSVCAgICAgICAgICAgICAweDAwMDExODAwQzAwMDAxMDBVTEwKKyNkZWZpbmUgICAgQ04yM1hYX1BFTV9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lICAgIENOMjNYWF9CQVIxX0lOREVYX09GRlNFVCAgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgICAgQ04yM1hYX1BFTV9CQVIxX0lOREVYX1JFRyhwb3J0LCBpZHgpCQlcCisJCShDTjIzWFhfUEVNX0JBUjFfSU5ERVhfU1RBUlQgKyAoKHBvcnQpIDw8IENOMjNYWF9QRU1fT0ZGU0VUKSArIFwKKwkJICgoaWR4KSA8PCBDTjIzWFhfQkFSMV9JTkRFWF9PRkZTRVQpKQorCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRFBJICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisvKiAxIHJlZ2lzdGVyICg2NC1iaXQpIC0gcHJvdmlkZXMgRE1BIEVuYWJsZSAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX0NUTCAgICAgICAgICAgICAgICAgMHgwMDAxZGYwMDAwMDAwMDQwVUxMCisKKy8qIDEgcmVnaXN0ZXIgKDY0LWJpdCkgLSBDb250cm9scyB0aGUgRE1BIElPIE9wZXJhdGlvbiAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9DT05UUk9MICAgICAgICAgMHgwMDAxZGYwMDAwMDAwMDQ4VUxMCisKKy8qIDEgcmVnaXN0ZXIgKDY0LWJpdCkgLSBQcm92aWRlcyBETUEgSW5zdHInbiBRdWV1ZSBFbmFibGUgICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfUkVRX0dCTF9FTkIgICAgICAgICAweDAwMDFkZjAwMDAwMDAwNTBVTEwKKworLyogMSByZWdpc3RlciAoNjQtYml0KSAtIERQSV9SRVFfRVJSX1JTUAorICogSW5kaWNhdGVzIHdoaWNoIEluc3RyJ24gUXVldWUgcmVjZWl2ZWQgZXJyb3IgcmVzcG9uc2UgZnJvbSB0aGUgSU8gc3ViLXN5c3RlbQorICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfUkVRX0VSUl9SU1AgICAgICAgICAweDAwMDFkZjAwMDAwMDAwNThVTEwKKworLyogMSByZWdpc3RlciAoNjQtYml0KSAtIERQSV9SRVFfRVJSX1JTVAorICogSW5kaWNhdGVzIHdoaWNoIEluc3RyJ24gUXVldWUgZHJvcHBlZCBhbiBJbnN0ciduCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9SRVFfRVJSX1JTVCAgICAgICAgIDB4MDAwMWRmMDAwMDAwMDA2MFVMTAorCisvKiA2IHJlZ2lzdGVyICg2NC1iaXQpIC0gRFBJX0RNQV9FTkcoMC4uNSlfRU4KKyAqIFByb3ZpZGVzIERNQSBFbmdpbmUgUXVldWUgRW5hYmxlCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfRU5HMF9FTkIgICAgICAgIDB4MDAwMWRmMDAwMDAwMDA4MFVMTAorI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9FTkdfRU5CKGVuZykgKENOMjNYWF9EUElfRE1BX0VORzBfRU5CICsgKGVuZyAqIDgpKQorCisvKiA4IHJlZ2lzdGVyICg2NC1iaXQpIC0gRFBJX0RNQSgwLi43KV9SRVFRX0NUTAorICogUHJvdmlkZXMgY29udHJvbCBiaXRzIGZvciB0cmFuc2FjdGlvbiBvbiA4IFF1ZXVlcworICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX1JFUVEwX0NUTCAgICAgICAweDAwMDFkZjAwMDAwMDAxODBVTEwKKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfUkVRUV9DVEwocV9ubykJXAorCQkoQ04yM1hYX0RQSV9ETUFfUkVRUTBfQ1RMICsgKHFfbm8gKiA4KSkKKworLyogNiByZWdpc3RlciAoNjQtYml0KSAtIERQSV9FTkcoMC4uNSlfQlVGCisgKiBQcm92aWRlcyBETUEgRW5naW5lIEZJRk8gKFF1ZXVlKSBTaXplCisgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfRU5HMF9CVUYgICAgICAgIDB4MDAwMWRmMDAwMDAwMDg4MFVMTAorI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9FTkdfQlVGKGVuZykgICBcCisJCShDTjIzWFhfRFBJX0RNQV9FTkcwX0JVRiArIChlbmcgKiA4KSkKKworLyogNCBSZWdpc3RlcnMgKDY0LWJpdCkgKi8KKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9TTElfUFJUX0NGR19TVEFSVCAgIDB4MDAwMWRmMDAwMDAwMDkwMFVMTAorI2RlZmluZSAgICBDTjIzWFhfRFBJX1NMSV9QUlRYX0NGRyhwb3J0KSAgICAgICAgXAorCQkoQ04yM1hYX0RQSV9TTElfUFJUX0NGR19TVEFSVCArIChwb3J0ICogMHg4KSkKKworLyogTWFza3MgZm9yIERQSV9ETUFfQ09OVFJPTCBSZWdpc3RlciAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9DT01NSVRfTU9ERSAgICAgQklUX1VMTCg1OCkKKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfUEtUX0VOICAgICAgICAgIEJJVF9VTEwoNTYpCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX0VOQiAgICAgICAgICAgICAoMHgwRlVMTCA8PCA0OCkKKy8qIFNldCB0aGUgRE1BIENvbnRyb2wsIHRvIHVwZGF0ZSBwYWNrZXQgY291bnQgbm90IGJ5dGUgY291bnQgc2VudCBieSBETUEsCisgKiB3aGVuIHdlIHVzZSBJbnRlcnJ1cHQgQ29hbGVzY2luZyAoQ0EgbW9kZSkKKyAqLworI2RlZmluZSAgICBDTjIzWFhfRFBJX0RNQV9PX0FERDEgICAgICAgICAgQklUKDE5KQorLypzZWxlY3RpbmcgNjQtYml0IEJ5dGUgU3dhcCBNb2RlICovCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX09fRVMgICAgICAgICAgICBCSVQoMTUpCisjZGVmaW5lICAgIENOMjNYWF9EUElfRE1BX09fTU9ERSAgICAgICAgICBCSVQoMTQpCisKKyNkZWZpbmUgICAgQ04yM1hYX0RQSV9ETUFfQ1RMX01BU0sJCQlcCisJCShDTjIzWFhfRFBJX0RNQV9DT01NSVRfTU9ERQl8CVwKKwkJIENOMjNYWF9EUElfRE1BX1BLVF9FTgkJfAlcCisJCSBDTjIzWFhfRFBJX0RNQV9PX0VTCQl8CVwKKwkJIENOMjNYWF9EUElfRE1BX09fTU9ERSkKKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFJTVCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKworI2RlZmluZSAgICBDTjIzWFhfUlNUX0JPT1QgICAgICAgICAgICAweDAwMDExODAwMDYwMDE2MDBVTEwKKyNkZWZpbmUgICAgQ04yM1hYX1JTVF9TT0ZUX1JTVCAgICAgICAgMHgwMDAxMTgwMDA2MDAxNjgwVUxMCisKKyNkZWZpbmUgICAgQ04yM1hYX0xNQzBfUkVTRVRfQ1RMICAgICAgICAgICAgICAgMHgwMDAxMTgwMDg4MDAwMTgwVUxMCisjZGVmaW5lICAgIENOMjNYWF9MTUMwX1JFU0VUX0NUTF9ERFIzUlNUX01BU0sgIDB4MDAwMDAwMDAwMDAwMDAwMVVMTAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY2eHhfZGV2aWNlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242Nnh4X2RldmljZS5jCmluZGV4IGMwM2QzNzAuLmU3NzlhZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY2eHhfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjZ4eF9kZXZpY2UuYwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJb2N0ZW9uX3dyaXRlX2NzcihvY3QsIENONlhYWF9TTElfUEtUX0NOVF9JTlRfRU5CLCBpbnRyKTsKIH0KIAotdm9pZCBsaW9fY242eHh4X2VuYWJsZV9pb19xdWV1ZXMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK2ludCBsaW9fY242eHh4X2VuYWJsZV9pb19xdWV1ZXMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKIHsKIAl1MzIgbWFzazsKIApAQCAtMzUzLDYgKzM1Myw4IEBACiAJbWFzayA9IG9jdGVvbl9yZWFkX2NzcihvY3QsIENONlhYWF9TTElfUEtUX09VVF9FTkIpOwogCW1hc2sgfD0gb2N0LT5pb19xbWFzay5vcTsKIAlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfT1VUX0VOQiwgbWFzayk7CisKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBsaW9fY242eHh4X2Rpc2FibGVfaW9fcXVldWVzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCkBAIC00MTgsMzYgKzQyMCw2IEBACiAJCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9USU1FX0lOVCwgZDMyKTsKIH0KIAotdm9pZCBsaW9fY242eHh4X3JlaW5pdF9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX09DVEVPTl9JTlNUUl9RVUVVRVMob2N0KTsgaSsrKSB7Ci0JCWlmICghKG9jdC0+aW9fcW1hc2suaXEgJiAoMVVMTCA8PCBpKSkpCi0JCQljb250aW51ZTsKLQkJb2N0LT5mbl9saXN0LnNldHVwX2lxX3JlZ3Mob2N0LCBpKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX09DVEVPTl9PVVRQVVRfUVVFVUVTKG9jdCk7IGkrKykgewotCQlpZiAoIShvY3QtPmlvX3FtYXNrLm9xICYgKDFVTEwgPDwgaSkpKQotCQkJY29udGludWU7Ci0JCW9jdC0+Zm5fbGlzdC5zZXR1cF9vcV9yZWdzKG9jdCwgaSk7Ci0JfQotCi0Jb2N0LT5mbl9saXN0LnNldHVwX2RldmljZV9yZWdzKG9jdCk7Ci0KLQlvY3QtPmZuX2xpc3QuZW5hYmxlX2ludGVycnVwdChvY3QtPmNoaXApOwotCi0Jb2N0LT5mbl9saXN0LmVuYWJsZV9pb19xdWV1ZXMob2N0KTsKLQotCS8qIGZvciAoaSA9IDA7IGkgPCBvY3QtPm51bV9vcXM7IGkrKykgeyAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfT0NURU9OX09VVFBVVF9RVUVVRVMob2N0KTsgaSsrKSB7Ci0JCWlmICghKG9jdC0+aW9fcW1hc2sub3EgJiAoMVVMTCA8PCBpKSkpCi0JCQljb250aW51ZTsKLQkJd3JpdGVsKG9jdC0+ZHJvcVtpXS0+bWF4X2NvdW50LCBvY3QtPmRyb3FbaV0tPnBrdHNfY3JlZGl0X3JlZyk7Ci0JfQotfQotCiB2b2lkCiBsaW9fY242eHh4X2JhcjFfaWR4X3NldHVwKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsCiAJCQkgIHU2NCBjb3JlX2FkZHIsCkBAIC01MDcsMTggKzQ3OSwyMCBAQAogCXJldHVybiBuZXdfaWR4OwogfQogCi12b2lkIGxpb19jbjZ4eHhfZW5hYmxlX2ludGVycnVwdCh2b2lkICpjaGlwKQordm9pZCBsaW9fY242eHh4X2VuYWJsZV9pbnRlcnJ1cHQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwKKwkJCQkgdTggdW51c2VkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQogewotCXN0cnVjdCBvY3Rlb25fY242eHh4ICpjbjZ4eHggPSAoc3RydWN0IG9jdGVvbl9jbjZ4eHggKiljaGlwOworCXN0cnVjdCBvY3Rlb25fY242eHh4ICpjbjZ4eHggPSAoc3RydWN0IG9jdGVvbl9jbjZ4eHggKilvY3QtPmNoaXA7CiAJdTY0IG1hc2sgPSBjbjZ4eHgtPmludHJfbWFzazY0IHwgQ042WFhYX0lOVFJfRE1BMF9GT1JDRTsKIAogCS8qIEVuYWJsZSBJbnRlcnJ1cHQgKi8KIAl3cml0ZXEobWFzaywgY242eHh4LT5pbnRyX2VuYl9yZWc2NCk7CiB9CiAKLXZvaWQgbGlvX2NuNnh4eF9kaXNhYmxlX2ludGVycnVwdCh2b2lkICpjaGlwKQordm9pZCBsaW9fY242eHh4X2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsCisJCQkJICB1OCB1bnVzZWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCiB7Ci0Jc3RydWN0IG9jdGVvbl9jbjZ4eHggKmNuNnh4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuNnh4eCAqKWNoaXA7CisJc3RydWN0IG9jdGVvbl9jbjZ4eHggKmNuNnh4eCA9IChzdHJ1Y3Qgb2N0ZW9uX2NuNnh4eCAqKW9jdC0+Y2hpcDsKIAogCS8qIERpc2FibGUgSW50ZXJydXB0cyAqLwogCXdyaXRlcSgwLCBjbjZ4eHgtPmludHJfZW5iX3JlZzY0KTsKQEAgLTcxNCw3ICs2ODgsNiBAQAogCiAJb2N0LT5mbl9saXN0LnNvZnRfcmVzZXQgPSBsaW9fY242eHh4X3NvZnRfcmVzZXQ7CiAJb2N0LT5mbl9saXN0LnNldHVwX2RldmljZV9yZWdzID0gbGlvX2NuNnh4eF9zZXR1cF9kZXZpY2VfcmVnczsKLQlvY3QtPmZuX2xpc3QucmVpbml0X3JlZ3MgPSBsaW9fY242eHh4X3JlaW5pdF9yZWdzOwogCW9jdC0+Zm5fbGlzdC51cGRhdGVfaXFfcmVhZF9pZHggPSBsaW9fY242eHh4X3VwZGF0ZV9yZWFkX2luZGV4OwogCiAJb2N0LT5mbl9saXN0LmJhcjFfaWR4X3NldHVwID0gbGlvX2NuNnh4eF9iYXIxX2lkeF9zZXR1cDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY2eHhfZGV2aWNlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242Nnh4X2RldmljZS5oCmluZGV4IDI4YzQ3MjIuLmE0MGE5MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY2eHhfZGV2aWNlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2NuNjZ4eF9kZXZpY2UuaApAQCAtODAsMTggKzgwLDE3IEBACiB2b2lkIGxpb19jbjZ4eHhfc2V0dXBfZ2xvYmFsX291dHB1dF9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpOwogdm9pZCBsaW9fY242eHh4X3NldHVwX2lxX3JlZ3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTMyIGlxX25vKTsKIHZvaWQgbGlvX2NuNnh4eF9zZXR1cF9vcV9yZWdzKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHUzMiBvcV9ubyk7Ci12b2lkIGxpb19jbjZ4eHhfZW5hYmxlX2lvX3F1ZXVlcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KTsKK2ludCBsaW9fY242eHh4X2VuYWJsZV9pb19xdWV1ZXMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCk7CiB2b2lkIGxpb19jbjZ4eHhfZGlzYWJsZV9pb19xdWV1ZXMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCk7CiBpcnFyZXR1cm5fdCBsaW9fY242eHh4X3Byb2Nlc3NfaW50ZXJydXB0X3JlZ3Modm9pZCAqZGV2KTsKLXZvaWQgbGlvX2NuNnh4eF9yZWluaXRfcmVncyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KTsKIHZvaWQgbGlvX2NuNnh4eF9iYXIxX2lkeF9zZXR1cChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1NjQgY29yZV9hZGRyLAogCQkJICAgICAgIHUzMiBpZHgsIGludCB2YWxpZCk7CiB2b2lkIGxpb19jbjZ4eHhfYmFyMV9pZHhfd3JpdGUoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTMyIGlkeCwgdTMyIG1hc2spOwogdTMyIGxpb19jbjZ4eHhfYmFyMV9pZHhfcmVhZChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCB1MzIgaWR4KTsKIHUzMgogbGlvX2NuNnh4eF91cGRhdGVfcmVhZF9pbmRleChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3F1ZXVlICppcSk7Ci12b2lkIGxpb19jbjZ4eHhfZW5hYmxlX2ludGVycnVwdCh2b2lkICpjaGlwKTsKLXZvaWQgbGlvX2NuNnh4eF9kaXNhYmxlX2ludGVycnVwdCh2b2lkICpjaGlwKTsKK3ZvaWQgbGlvX2NuNnh4eF9lbmFibGVfaW50ZXJydXB0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QsIHU4IHVudXNlZCk7Cit2b2lkIGxpb19jbjZ4eHhfZGlzYWJsZV9pbnRlcnJ1cHQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTggdW51c2VkKTsKIHZvaWQgY242eHh4X2dldF9wY2llX3FsbXBvcnQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCk7CiB2b2lkIGxpb19jbjZ4eHhfc2V0dXBfcmVnX2FkZHJlc3Moc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdm9pZCAqY2hpcCwKIAkJCQkgIHN0cnVjdCBvY3Rlb25fcmVnX2xpc3QgKnJlZ19saXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY4eHhfZGV2aWNlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242OHh4X2RldmljZS5jCmluZGV4IDI5NzU1YmM2Li5kYmYzNTY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vY242OHh4X2RldmljZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9jbjY4eHhfZGV2aWNlLmMKQEAgLTE0OCw3ICsxNDgsNiBAQAogCW9jdC0+Zm5fbGlzdC5wcm9jZXNzX2ludGVycnVwdF9yZWdzID0gbGlvX2NuNnh4eF9wcm9jZXNzX2ludGVycnVwdF9yZWdzOwogCW9jdC0+Zm5fbGlzdC5zb2Z0X3Jlc2V0ID0gbGlvX2NuNjh4eF9zb2Z0X3Jlc2V0OwogCW9jdC0+Zm5fbGlzdC5zZXR1cF9kZXZpY2VfcmVncyA9IGxpb19jbjY4eHhfc2V0dXBfZGV2aWNlX3JlZ3M7Ci0Jb2N0LT5mbl9saXN0LnJlaW5pdF9yZWdzID0gbGlvX2NuNnh4eF9yZWluaXRfcmVnczsKIAlvY3QtPmZuX2xpc3QudXBkYXRlX2lxX3JlYWRfaWR4ID0gbGlvX2NuNnh4eF91cGRhdGVfcmVhZF9pbmRleDsKIAogCW9jdC0+Zm5fbGlzdC5iYXIxX2lkeF9zZXR1cCA9IGxpb19jbjZ4eHhfYmFyMV9pZHhfc2V0dXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlvX2NvcmUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saW9fY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMWVkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlvX2NvcmUuYwpAQCAtMCwwICsxLDI2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogQXV0aG9yOiBDYXZpdW0sIEluYy4KKyoKKyogQ29udGFjdDogc3VwcG9ydEBjYXZpdW0uY29tCisqICAgICAgICAgIFBsZWFzZSBpbmNsdWRlICJMaXF1aWRJTyIgaW4gdGhlIHN1YmplY3QuCisqCisqIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IENhdml1bSwgSW5jLgorKgorKiBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBWZXJzaW9uIDIsIGFzCisqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKgorKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisqIEFTLUlTIGFuZCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgVElUTEUsIG9yCisqIE5PTklORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyogZGV0YWlscy4KKyoKKyogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgorKiBDb250YWN0IENhdml1bSwgSW5jLiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSAibGlxdWlkaW9fY29tbW9uLmgiCisjaW5jbHVkZSAib2N0ZW9uX2Ryb3EuaCIKKyNpbmNsdWRlICJvY3Rlb25faXEuaCIKKyNpbmNsdWRlICJyZXNwb25zZV9tYW5hZ2VyLmgiCisjaW5jbHVkZSAib2N0ZW9uX2RldmljZS5oIgorI2luY2x1ZGUgIm9jdGVvbl9uaWMuaCIKKyNpbmNsdWRlICJvY3Rlb25fbWFpbi5oIgorI2luY2x1ZGUgIm9jdGVvbl9uZXR3b3JrLmgiCisKK2ludCBsaXF1aWRpb19zZXRfZmVhdHVyZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgY21kLCB1MTYgcGFyYW0xKQoreworCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OworCXN0cnVjdCBvY3RuaWNfY3RybF9wa3QgbmN0cmw7CisJaW50IHJldCA9IDA7CisKKwltZW1zZXQoJm5jdHJsLCAwLCBzaXplb2Yoc3RydWN0IG9jdG5pY19jdHJsX3BrdCkpOworCisJbmN0cmwubmNtZC51NjQgPSAwOworCW5jdHJsLm5jbWQucy5jbWQgPSBjbWQ7CisJbmN0cmwubmNtZC5zLnBhcmFtMSA9IHBhcmFtMTsKKwluY3RybC5pcV9ubyA9IGxpby0+bGluZm8udHhwY2lxWzBdLnMucV9ubzsKKwluY3RybC53YWl0X3RpbWUgPSAxMDA7CisJbmN0cmwubmV0cG5kZXYgPSAodTY0KW5ldGRldjsKKwluY3RybC5jYl9mbiA9IGxpcXVpZGlvX2xpbmtfY3RybF9jbWRfY29tcGxldGlvbjsKKworCXJldCA9IG9jdG5ldF9zZW5kX25pY19jdHJsX3BrdChsaW8tPm9jdF9kZXYsICZuY3RybCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJGZWF0dXJlIGNoYW5nZSBmYWlsZWQgaW4gY29yZSAocmV0OiAweCV4KVxuIiwKKwkJCXJldCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgb2N0ZW9uX3JlcG9ydF90eF9jb21wbGV0aW9uX3RvX2JxbCh2b2lkICp0eHEsIHVuc2lnbmVkIGludCBwa3RzX2NvbXBsLAorCQkJCQl1bnNpZ25lZCBpbnQgYnl0ZXNfY29tcGwpCit7CisJc3RydWN0IG5ldGRldl9xdWV1ZSAqbmV0ZGV2X3F1ZXVlID0gdHhxOworCisJbmV0ZGV2X3R4X2NvbXBsZXRlZF9xdWV1ZShuZXRkZXZfcXVldWUsIHBrdHNfY29tcGwsIGJ5dGVzX2NvbXBsKTsKK30KKwordm9pZCBvY3Rlb25fdXBkYXRlX3R4X2NvbXBsZXRpb25fY291bnRlcnModm9pZCAqYnVmLCBpbnQgcmVxdHlwZSwKKwkJCQkJICB1bnNpZ25lZCBpbnQgKnBrdHNfY29tcGwsCisJCQkJCSAgdW5zaWduZWQgaW50ICpieXRlc19jb21wbCkKK3sKKwlzdHJ1Y3Qgb2N0bmV0X2J1Zl9mcmVlX2luZm8gKmZpbmZvOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYzsKKworCXN3aXRjaCAocmVxdHlwZSkgeworCWNhc2UgUkVRVFlQRV9OT1JFU1BfTkVUOgorCWNhc2UgUkVRVFlQRV9OT1JFU1BfTkVUX1NHOgorCQlmaW5mbyA9IGJ1ZjsKKwkJc2tiID0gZmluZm8tPnNrYjsKKwkJYnJlYWs7CisKKwljYXNlIFJFUVRZUEVfUkVTUF9ORVRfU0c6CisJY2FzZSBSRVFUWVBFX1JFU1BfTkVUOgorCQlzYyA9IGJ1ZjsKKwkJc2tiID0gc2MtPmNhbGxiYWNrX2FyZzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJKCpwa3RzX2NvbXBsKSsrOworLypUT0RPLCBVc2Ugc29tZSBvdGhlciBwb3VuZCBkZWZpbmUgdG8gc3VnZ2VzdAorICogdGhlIGZhY3QgdGhhdCBpcXMgYXJlIG5vdCB0aWVkIHRvIG5ldGRldnMKKyAqIGFuZCBjYW4gdGFrZSB0cmFmZmljIGZyb20gZGlmZmVyZW50IG5ldGRldnMKKyAqIGhlbmNlIGJxbCByZXBvcnRpbmcgaXMgZG9uZSBwZXIgcGFja2V0CisgKiB0aGFuIGluIGJ1bGsuIFVzYWdlIG9mIE5PX05BUEkgaW4gdHhxIGNvbXBsZXRpb24gaXMKKyAqIGEgbGl0dGxlIGNvbmZ1c2luZworICovCisJKmJ5dGVzX2NvbXBsICs9IHNrYi0+bGVuOworfQorCit2b2lkIG9jdGVvbl9yZXBvcnRfc2VudF9ieXRlc190b19icWwodm9pZCAqYnVmLCBpbnQgcmVxdHlwZSkKK3sKKwlzdHJ1Y3Qgb2N0bmV0X2J1Zl9mcmVlX2luZm8gKmZpbmZvOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjOworCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKworCXN3aXRjaCAocmVxdHlwZSkgeworCWNhc2UgUkVRVFlQRV9OT1JFU1BfTkVUOgorCWNhc2UgUkVRVFlQRV9OT1JFU1BfTkVUX1NHOgorCQlmaW5mbyA9IGJ1ZjsKKwkJc2tiID0gZmluZm8tPnNrYjsKKwkJYnJlYWs7CisKKwljYXNlIFJFUVRZUEVfUkVTUF9ORVRfU0c6CisJY2FzZSBSRVFUWVBFX1JFU1BfTkVUOgorCQlzYyA9IGJ1ZjsKKwkJc2tiID0gc2MtPmNhbGxiYWNrX2FyZzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShza2ItPmRldiwgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOworCW5ldGRldl90eF9zZW50X3F1ZXVlKHR4cSwgc2tiLT5sZW4pOworfQorCit2b2lkIGxpcXVpZGlvX2xpbmtfY3RybF9jbWRfY29tcGxldGlvbih2b2lkICpuY3RybF9wdHIpCit7CisJc3RydWN0IG9jdG5pY19jdHJsX3BrdCAqbmN0cmwgPSAoc3RydWN0IG9jdG5pY19jdHJsX3BrdCAqKW5jdHJsX3B0cjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopbmN0cmwtPm5ldHBuZGV2OworCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OworCXU4ICptYWM7CisKKwlzd2l0Y2ggKG5jdHJsLT5uY21kLnMuY21kKSB7CisJY2FzZSBPQ1RORVRfQ01EX0NIQU5HRV9ERVZGTEFHUzoKKwljYXNlIE9DVE5FVF9DTURfU0VUX01VTFRJX0xJU1Q6CisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX0NIQU5HRV9NQUNBRERSOgorCQltYWMgPSAoKHU4ICopJm5jdHJsLT51ZGRbMF0pICsgMjsKKwkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKKwkJCSAgICJNQUNBZGRyIGNoYW5nZWQgdG8gJTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMng6JTIuMnhcbiIsCisJCQkgICBtYWNbMF0sIG1hY1sxXSwKKwkJCSAgIG1hY1syXSwgbWFjWzNdLAorCQkJICAgbWFjWzRdLCBtYWNbNV0pOworCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9DSEFOR0VfTVRVOgorCQkvKiBJZiBjb21tYW5kIGlzIHN1Y2Nlc3NmdWwsIGNoYW5nZSB0aGUgTVRVLiAqLworCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LCAiTVRVIENoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKKwkJCSAgIG5ldGRldi0+bXR1LCBuY3RybC0+bmNtZC5zLnBhcmFtMSk7CisJCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIE1UVSBDaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsCisJCQkgbmV0ZGV2LT5uYW1lLCBuZXRkZXYtPm10dSwKKwkJCSBuY3RybC0+bmNtZC5zLnBhcmFtMSk7CisJCW5ldGRldi0+bXR1ID0gbmN0cmwtPm5jbWQucy5wYXJhbTE7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhsaW8tPmxpbmtfc3RhdHVzX3dxLndxLAorCQkJCSAgICZsaW8tPmxpbmtfc3RhdHVzX3dxLndrLndvcmssIDApOworCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9HUElPX0FDQ0VTUzoKKwkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwgIkxFRCBGbGFzaGluZyB2aXN1YWwgaWRlbnRpZmljYXRpb25cbiIpOworCisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX0lEX0FDVElWRToKKwkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwgIkxFRCBGbGFzaGluZyB2aXN1YWwgaWRlbnRpZmljYXRpb25cbiIpOworCisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX0xST19FTkFCTEU6CisJCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIExSTyBFbmFibGVkXG4iLCBuZXRkZXYtPm5hbWUpOworCQlicmVhazsKKworCWNhc2UgT0NUTkVUX0NNRF9MUk9fRElTQUJMRToKKwkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgTFJPIERpc2FibGVkXG4iLAorCQkJIG5ldGRldi0+bmFtZSk7CisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX1ZFUkJPU0VfRU5BQkxFOgorCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBGaXJtd2FyZSBkZWJ1ZyBlbmFibGVkXG4iLAorCQkJIG5ldGRldi0+bmFtZSk7CisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX1ZFUkJPU0VfRElTQUJMRToKKwkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgRmlybXdhcmUgZGVidWcgZGlzYWJsZWRcbiIsCisJCQkgbmV0ZGV2LT5uYW1lKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfRU5BQkxFX1ZMQU5fRklMVEVSOgorCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBWTEFOIGZpbHRlciBlbmFibGVkXG4iLAorCQkJIG5ldGRldi0+bmFtZSk7CisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX0FERF9WTEFOX0ZJTFRFUjoKKwkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgVkxBTiBmaWx0ZXIgJWQgYWRkZWRcbiIsCisJCQkgbmV0ZGV2LT5uYW1lLCBuY3RybC0+bmNtZC5zLnBhcmFtMSk7CisJCWJyZWFrOworCisJY2FzZSBPQ1RORVRfQ01EX0RFTF9WTEFOX0ZJTFRFUjoKKwkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgVkxBTiBmaWx0ZXIgJWQgcmVtb3ZlZFxuIiwKKwkJCSBuZXRkZXYtPm5hbWUsIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfU0VUX1NFVFRJTkdTOgorCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBzZXR0aW5ncyBjaGFuZ2VkXG4iLAorCQkJIG5ldGRldi0+bmFtZSk7CisKKwkJYnJlYWs7CisKKwkvKiBDYXNlIHRvIGhhbmRsZSAiT0NUTkVUX0NNRF9UTkxfUlhfQ1NVTV9DVEwiCisJICogQ29tbWFuZCBwYXNzZWQgYnkgTklDIGRyaXZlcgorCSAqLworCWNhc2UgT0NUTkVUX0NNRF9UTkxfUlhfQ1NVTV9DVEw6CisJCWlmIChuY3RybC0+bmNtZC5zLnBhcmFtMSA9PSBPQ1RORVRfQ01EX1JYQ1NVTV9FTkFCTEUpIHsKKwkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCisJCQkJICAgIlJYIENoZWNrc3VtIE9mZmxvYWQgRW5hYmxlZFxuIik7CisJCX0gZWxzZSBpZiAobmN0cmwtPm5jbWQucy5wYXJhbTEgPT0KKwkJCSAgIE9DVE5FVF9DTURfUlhDU1VNX0RJU0FCTEUpIHsKKwkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCisJCQkJICAgIlJYIENoZWNrc3VtIE9mZmxvYWQgRGlzYWJsZWRcbiIpOworCQl9CisJCWJyZWFrOworCisJCS8qIENhc2UgdG8gaGFuZGxlICJPQ1RORVRfQ01EX1ROTF9UWF9DU1VNX0NUTCIKKwkJICogQ29tbWFuZCBwYXNzZWQgYnkgTklDIGRyaXZlcgorCQkgKi8KKwljYXNlIE9DVE5FVF9DTURfVE5MX1RYX0NTVU1fQ1RMOgorCQlpZiAobmN0cmwtPm5jbWQucy5wYXJhbTEgPT0gT0NUTkVUX0NNRF9UWENTVU1fRU5BQkxFKSB7CisJCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAorCQkJCSAgICJUWCBDaGVja3N1bSBPZmZsb2FkIEVuYWJsZWRcbiIpOworCQl9IGVsc2UgaWYgKG5jdHJsLT5uY21kLnMucGFyYW0xID09CisJCQkgICBPQ1RORVRfQ01EX1RYQ1NVTV9ESVNBQkxFKSB7CisJCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LAorCQkJCSAgICJUWCBDaGVja3N1bSBPZmZsb2FkIERpc2FibGVkXG4iKTsKKwkJfQorCQlicmVhazsKKworCQkvKiBDYXNlIHRvIGhhbmRsZSAiT0NUTkVUX0NNRF9WWExBTl9QT1JUX0NPTkZJRyIKKwkJICogQ29tbWFuZCBwYXNzZWQgYnkgTklDIGRyaXZlcgorCQkgKi8KKwljYXNlIE9DVE5FVF9DTURfVlhMQU5fUE9SVF9DT05GSUc6CisJCWlmIChuY3RybC0+bmNtZC5zLm1vcmUgPT0gT0NUTkVUX0NNRF9WWExBTl9QT1JUX0FERCkgeworCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKKwkJCQkgICAiVnhMQU4gRGVzdGluYXRpb24gVURQIFBPUlQ6JWQgQURERURcbiIsCisJCQkJICAgbmN0cmwtPm5jbWQucy5wYXJhbTEpOworCQl9IGVsc2UgaWYgKG5jdHJsLT5uY21kLnMubW9yZSA9PQorCQkJICAgT0NUTkVUX0NNRF9WWExBTl9QT1JUX0RFTCkgeworCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKKwkJCQkgICAiVnhMQU4gRGVzdGluYXRpb24gVURQIFBPUlQ6JWQgREVMRVRFRFxuIiwKKwkJCQkgICBuY3RybC0+bmNtZC5zLnBhcmFtMSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE9DVE5FVF9DTURfU0VUX0ZMT1dfQ1RMOgorCQluZXRpZl9pbmZvKGxpbywgcHJvYmUsIGxpby0+bmV0ZGV2LCAiU2V0IFJYL1RYIGZsb3cgY29udHJvbCBwYXJhbWV0ZXJzXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIFVua25vd24gY21kICVkXG4iLCBfX2Z1bmNfXywKKwkJCW5jdHJsLT5uY21kLnMuY21kKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlvX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saW9fZXRodG9vbC5jCmluZGV4IDI4OWViODkuLmYxNjNlMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saW9fZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saW9fZXRodG9vbC5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAib2N0ZW9uX25ldHdvcmsuaCIKICNpbmNsdWRlICJjbjY2eHhfcmVncy5oIgogI2luY2x1ZGUgImNuNjZ4eF9kZXZpY2UuaCIKKyNpbmNsdWRlICJjbjIzeHhfcGZfZGV2aWNlLmgiCiAKIHN0YXRpYyBpbnQgb2N0bmV0X2dldF9saW5rX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogCkBAIC03NSw2ICs3Niw3IEBACiAKICNkZWZpbmUgQVJSQVlfTEVOR1RIKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKICNkZWZpbmUgT0NUX0VUSFRPT0xfUkVHRFVNUF9MRU4gIDQwOTYKKyNkZWZpbmUgT0NUX0VUSFRPT0xfUkVHRFVNUF9MRU5fMjNYWCAgKDQwOTYgKiAxMSkKICNkZWZpbmUgT0NUX0VUSFRPT0xfUkVHU1ZFUiAgMQogCiAvKiBzdGF0aXN0aWNzIG9mIFBGICovCkBAIC0xODgsNiArMTkwLDEwIEBACiAJImJ1ZmZlcl9hbGxvY19mYWlsdXJlIiwKIH07CiAKKy8qIExpcXVpZElPIGRyaXZlciBwcml2YXRlIGZsYWdzICovCitzdGF0aWMgY29uc3QgY2hhciBvY3RfcHJpdl9mbGFnc19zdHJpbmdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKK307CisKICNkZWZpbmUgT0NUTklDX05DTURfQVVUT05FR19PTiAgMHgxCiAjZGVmaW5lIE9DVE5JQ19OQ01EX1BIWV9PTiAgICAgIDB4MgogCkBAIC0yNTksNiArMjY1LDEzIEBACiAJCW1heF90eCA9IENGR19HRVRfSVFfTUFYX1EoY29uZjZ4KTsKIAkJcnhfY291bnQgPSBDRkdfR0VUX05VTV9SWFFTX05JQ19JRihjb25mNngsIGxpby0+aWZpZHgpOwogCQl0eF9jb3VudCA9IENGR19HRVRfTlVNX1RYUVNfTklDX0lGKGNvbmY2eCwgbGlvLT5pZmlkeCk7CisJfSBlbHNlIGlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJc3RydWN0IG9jdGVvbl9jb25maWcgKmNvbmYyMyA9IENISVBfRklFTEQob2N0LCBjbjIzeHhfcGYsIGNvbmYpOworCisJCW1heF9yeCA9IENGR19HRVRfT1FfTUFYX1EoY29uZjIzKTsKKwkJbWF4X3R4ID0gQ0ZHX0dFVF9JUV9NQVhfUShjb25mMjMpOworCQlyeF9jb3VudCA9IENGR19HRVRfTlVNX1JYUVNfTklDX0lGKGNvbmYyMywgbGlvLT5pZmlkeCk7CisJCXR4X2NvdW50ID0gQ0ZHX0dFVF9OVU1fVFhRU19OSUNfSUYoY29uZjIzLCBsaW8tPmlmaWR4KTsKIAl9CiAKIAljaGFubmVsLT5tYXhfcnggPSBtYXhfcng7CkBAIC0yOTAsMTggKzMwMywxNiBAQAogCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKIAlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0X2RldiA9IGxpby0+b2N0X2RldjsKIAlzdHJ1Y3Qgb2N0ZW9uX2JvYXJkX2luZm8gKmJvYXJkX2luZm87Ci0JaW50IGxlbjsKIAotCWlmIChlZXByb20tPm9mZnNldCAhPSAwKQorCWlmIChlZXByb20tPm9mZnNldCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAllZXByb20tPm1hZ2ljID0gb2N0X2Rldi0+cGNpX2Rldi0+dmVuZG9yOwogCWJvYXJkX2luZm8gPSAoc3RydWN0IG9jdGVvbl9ib2FyZF9pbmZvICopKCZvY3RfZGV2LT5ib2FyZGluZm8pOwotCWxlbiA9Ci0JCXNwcmludGYoKGNoYXIgKilieXRlcywKLQkJCSJib2FyZG5hbWU6JXMgc2VyaWFsbnVtOiVzIG1hajolbGxkIG1pbjolbGxkXG4iLAotCQkJYm9hcmRfaW5mby0+bmFtZSwgYm9hcmRfaW5mby0+c2VyaWFsX251bWJlciwKLQkJCWJvYXJkX2luZm8tPm1ham9yLCBib2FyZF9pbmZvLT5taW5vcik7CisJc3ByaW50ZigoY2hhciAqKWJ5dGVzLAorCQkiYm9hcmRuYW1lOiVzIHNlcmlhbG51bTolcyBtYWo6JWxsZCBtaW46JWxsZFxuIiwKKwkJYm9hcmRfaW5mby0+bmFtZSwgYm9hcmRfaW5mby0+c2VyaWFsX251bWJlciwKKwkJYm9hcmRfaW5mby0+bWFqb3IsIGJvYXJkX2luZm8tPm1pbm9yKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzMzLDYgKzM0NCwzMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9jdG5ldF9pZF9hY3RpdmUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKKwlzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0IG5jdHJsOworCWludCByZXQgPSAwOworCisJbWVtc2V0KCZuY3RybCwgMCwgc2l6ZW9mKHN0cnVjdCBvY3RuaWNfY3RybF9wa3QpKTsKKworCW5jdHJsLm5jbWQudTY0ID0gMDsKKwluY3RybC5uY21kLnMuY21kID0gT0NUTkVUX0NNRF9JRF9BQ1RJVkU7CisJbmN0cmwubmNtZC5zLnBhcmFtMSA9IHZhbDsKKwluY3RybC5pcV9ubyA9IGxpby0+bGluZm8udHhwY2lxWzBdLnMucV9ubzsKKwluY3RybC53YWl0X3RpbWUgPSAxMDA7CisJbmN0cmwubmV0cG5kZXYgPSAodTY0KW5ldGRldjsKKwluY3RybC5jYl9mbiA9IGxpcXVpZGlvX2xpbmtfY3RybF9jbWRfY29tcGxldGlvbjsKKworCXJldCA9IG9jdG5ldF9zZW5kX25pY19jdHJsX3BrdChsaW8tPm9jdF9kZXYsICZuY3RybCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJGYWlsZWQgdG8gY29uZmlndXJlIGdwaW8gdmFsdWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyogQ2FsbGJhY2sgZm9yIHdoZW4gbWRpbyBjb21tYW5kIHJlc3BvbnNlIGFycml2ZXMKICAqLwogc3RhdGljIHZvaWQgb2N0bmV0X21kaW9fcmVzcF9jYWxsYmFjayhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LApAQCAtNDA2LDcgKzQ0Myw3IEBACiAJCWRldl9lcnIoJm9jdF9kZXYtPnBjaV9kZXYtPmRldiwKIAkJCSJvY3RuZXRfbWRpbzQ1X2FjY2VzcyBpbnN0cnVjdGlvbiBmYWlsZWQgc3RhdHVzOiAleFxuIiwKIAkJCXJldHZhbCk7Ci0JCXJldHZhbCA9ICAtRUJVU1k7CisJCXJldHZhbCA9IC1FQlVTWTsKIAl9IGVsc2UgewogCQkvKiBTbGVlcCBvbiBhIHdhaXQgcXVldWUgdGlsbCB0aGUgY29uZCBmbGFnIGluZGljYXRlcyB0aGF0IHRoZQogCQkgKiByZXNwb25zZSBhcnJpdmVkCkBAIC00NzYsNiArNTEzLDExIEBACiAJCQkJCQkgICAmdmFsdWUpOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgaWYgKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ04yM1hYX1BGX1ZJRCkgeworCQkJb2N0bmV0X2lkX2FjdGl2ZShuZXRkZXYsIExFRF9JREVOVElGSUNBVElPTl9PTik7CisKKwkJCS8qIHJldHVybnMgMCBzaW5jZSB1cGRhdGVzIGFyZSBhc3luY2hyb25vdXMgKi8KKwkJCXJldHVybiAwOwogCQl9IGVsc2UgewogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTUyMSw3ICs1NjMsMTAgQEAKIAkJCQkJCSAgICZsaW8tPnBoeV9iZWFjb25fdmFsKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIGlmIChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NOMjNYWF9QRl9WSUQpIHsKKwkJCW9jdG5ldF9pZF9hY3RpdmUobmV0ZGV2LCBMRURfSURFTlRJRklDQVRJT05fT0ZGKTsKIAorCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNTUwLDYgKzU5NSwxMyBAQAogCQlyeF9tYXhfcGVuZGluZyA9IENONlhYWF9NQVhfT1FfREVTQ1JJUFRPUlM7CiAJCXJ4X3BlbmRpbmcgPSBDRkdfR0VUX05VTV9SWF9ERVNDU19OSUNfSUYoY29uZjZ4LCBsaW8tPmlmaWR4KTsKIAkJdHhfcGVuZGluZyA9IENGR19HRVRfTlVNX1RYX0RFU0NTX05JQ19JRihjb25mNngsIGxpby0+aWZpZHgpOworCX0gZWxzZSBpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCXN0cnVjdCBvY3Rlb25fY29uZmlnICpjb25mMjMgPSBDSElQX0ZJRUxEKG9jdCwgY24yM3h4X3BmLCBjb25mKTsKKworCQl0eF9tYXhfcGVuZGluZyA9IENOMjNYWF9NQVhfSVFfREVTQ1JJUFRPUlM7CisJCXJ4X21heF9wZW5kaW5nID0gQ04yM1hYX01BWF9PUV9ERVNDUklQVE9SUzsKKwkJcnhfcGVuZGluZyA9IENGR19HRVRfTlVNX1JYX0RFU0NTX05JQ19JRihjb25mMjMsIGxpby0+aWZpZHgpOworCQl0eF9wZW5kaW5nID0gQ0ZHX0dFVF9OVU1fVFhfREVTQ1NfTklDX0lGKGNvbmYyMywgbGlvLT5pZmlkeCk7CiAJfQogCiAJaWYgKGxpby0+bXR1ID4gT0NUTkVUX0RFRkFVTFRfRlJNX1NJWkUgLSBPQ1RORVRfRlJNX0hFQURFUl9TSVpFKSB7CkBAIC02MTAsNiArNjYyLDY5IEBACiAJcGF1c2UtPnJ4X3BhdXNlID0gb2N0LT5yeF9wYXVzZTsKIH0KIAorc3RhdGljIGludAorbGlvX3NldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQoreworCS8qIE5vdGVzOiBOb3Qgc3VwcG9ydGluZyBhbnkgYXV0byBuZWdvdGlhdGlvbiBpbiB0aGVzZQorCSAqIGRyaXZlcnMuCisJICovCisJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7CisJc3RydWN0IG9jdG5pY19jdHJsX3BrdCBuY3RybDsKKwlzdHJ1Y3Qgb2N0X2xpbmtfaW5mbyAqbGluZm8gPSAmbGlvLT5saW5mbzsKKworCWludCByZXQgPSAwOworCisJaWYgKG9jdC0+Y2hpcF9pZCAhPSBPQ1RFT05fQ04yM1hYX1BGX1ZJRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGluZm8tPmxpbmsucy5kdXBsZXggPT0gMCkgeworCQkvKm5vIGZsb3cgY29udHJvbCBmb3IgaGFsZiBkdXBsZXgqLworCQlpZiAocGF1c2UtPnJ4X3BhdXNlIHx8IHBhdXNlLT50eF9wYXVzZSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qZG8gbm90IHN1cHBvcnQgYXV0b25lZyBvZiBsaW5rIGZsb3cgY29udHJvbCovCisJaWYgKHBhdXNlLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmbmN0cmwsIDAsIHNpemVvZihzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0KSk7CisKKwluY3RybC5uY21kLnU2NCA9IDA7CisJbmN0cmwubmNtZC5zLmNtZCA9IE9DVE5FVF9DTURfU0VUX0ZMT1dfQ1RMOworCW5jdHJsLmlxX25vID0gbGlvLT5saW5mby50eHBjaXFbMF0ucy5xX25vOworCW5jdHJsLndhaXRfdGltZSA9IDEwMDsKKwluY3RybC5uZXRwbmRldiA9ICh1NjQpbmV0ZGV2OworCW5jdHJsLmNiX2ZuID0gbGlxdWlkaW9fbGlua19jdHJsX2NtZF9jb21wbGV0aW9uOworCisJaWYgKHBhdXNlLT5yeF9wYXVzZSkgeworCQkvKmVuYWJsZSByeCBwYXVzZSovCisJCW5jdHJsLm5jbWQucy5wYXJhbTEgPSAxOworCX0gZWxzZSB7CisJCS8qZGlzYWJsZSByeCBwYXVzZSovCisJCW5jdHJsLm5jbWQucy5wYXJhbTEgPSAwOworCX0KKworCWlmIChwYXVzZS0+dHhfcGF1c2UpIHsKKwkJLyplbmFibGUgdHggcGF1c2UqLworCQluY3RybC5uY21kLnMucGFyYW0yID0gMTsKKwl9IGVsc2UgeworCQkvKmRpc2FibGUgdHggcGF1c2UqLworCQluY3RybC5uY21kLnMucGFyYW0yID0gMDsKKwl9CisKKwlyZXQgPSBvY3RuZXRfc2VuZF9uaWNfY3RybF9wa3QobGlvLT5vY3RfZGV2LCAmbmN0cmwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBwYXVzZSBwYXJhbWV0ZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvY3QtPnJ4X3BhdXNlID0gcGF1c2UtPnJ4X3BhdXNlOworCW9jdC0+dHhfcGF1c2UgPSBwYXVzZS0+dHhfcGF1c2U7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQKIGxpb19nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLApAQCAtODc3LDYgKzk5MiwyNyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgbGlvX2dldF9wcml2X2ZsYWdzX3N0cmluZ3Moc3RydWN0IGxpbyAqbGlvLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0X2RldiA9IGxpby0+b2N0X2RldjsKKwlpbnQgaTsKKworCXN3aXRjaCAob2N0X2Rldi0+Y2hpcF9pZCkgeworCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9jdF9wcml2X2ZsYWdzX3N0cmluZ3MpOyBpKyspIHsKKwkJCXNwcmludGYoZGF0YSwgIiVzIiwgb2N0X3ByaXZfZmxhZ3Nfc3RyaW5nc1tpXSk7CisJCQlkYXRhICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJfQorCQlicmVhazsKKwljYXNlIE9DVEVPTl9DTjY4WFg6CisJY2FzZSBPQ1RFT05fQ042NlhYOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQluZXRpZl9pbmZvKGxpbywgZHJ2LCBsaW8tPm5ldGRldiwgIlVua25vd24gQ2hpcCAhIVxuIik7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIHZvaWQgbGlvX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQogewogCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKQEAgLTkxNiwxMiArMTA1MiwzMSBAQAogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBFVEhfU1NfUFJJVl9GTEFHUzoKKwkJbGlvX2dldF9wcml2X2ZsYWdzX3N0cmluZ3MobGlvLCBkYXRhKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbmV0aWZfaW5mbyhsaW8sIGRydiwgbGlvLT5uZXRkZXYsICJVbmtub3duIFN0cmluZ3NldCAhIVxuIik7CiAJCWJyZWFrOwogCX0KIH0KIAorc3RhdGljIGludCBsaW9fZ2V0X3ByaXZfZmxhZ3Nfc3NfY291bnQoc3RydWN0IGxpbyAqbGlvKQoreworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3RfZGV2ID0gbGlvLT5vY3RfZGV2OworCisJc3dpdGNoIChvY3RfZGV2LT5jaGlwX2lkKSB7CisJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDoKKwkJcmV0dXJuIEFSUkFZX1NJWkUob2N0X3ByaXZfZmxhZ3Nfc3RyaW5ncyk7CisJY2FzZSBPQ1RFT05fQ042OFhYOgorCWNhc2UgT0NURU9OX0NONjZYWDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWRlZmF1bHQ6CisJCW5ldGlmX2luZm8obGlvLCBkcnYsIGxpby0+bmV0ZGV2LCAiVW5rbm93biBDaGlwICEhXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KK30KKwogc3RhdGljIGludCBsaW9fZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHNzZXQpCiB7CiAJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOwpAQCAtOTMyLDYgKzEwODcsOCBAQAogCQlyZXR1cm4gKEFSUkFZX1NJWkUob2N0X3N0YXRzX3N0cmluZ3MpICsKIAkJCUFSUkFZX1NJWkUob2N0X2lxX3N0YXRzX3N0cmluZ3MpICogb2N0X2Rldi0+bnVtX2lxcyArCiAJCQlBUlJBWV9TSVpFKG9jdF9kcm9xX3N0YXRzX3N0cmluZ3MpICogb2N0X2Rldi0+bnVtX29xcyk7CisJY2FzZSBFVEhfU1NfUFJJVl9GTEFHUzoKKwkJcmV0dXJuIGxpb19nZXRfcHJpdl9mbGFnc19zc19jb3VudChsaW8pOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CkBAIC05NDgsNiArMTEwNSwxNiBAQAogCWludHJtb2RfY2ZnID0gJm9jdC0+aW50cm1vZDsKIAogCXN3aXRjaCAob2N0LT5jaGlwX2lkKSB7CisJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDoKKwkJaWYgKCFpbnRybW9kX2NmZy0+cnhfZW5hYmxlKSB7CisJCQlpbnRyX2NvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzID0gaW50cm1vZF9jZmctPnJ4X3VzZWNzOworCQkJaW50cl9jb2FsLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9CisJCQkJaW50cm1vZF9jZmctPnJ4X2ZyYW1lczsKKwkJfQorCQlpZiAoIWludHJtb2RfY2ZnLT50eF9lbmFibGUpCisJCQlpbnRyX2NvYWwtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzID0KKwkJCQlpbnRybW9kX2NmZy0+dHhfZnJhbWVzOworCQlicmVhazsKIAljYXNlIE9DVEVPTl9DTjY4WFg6CiAJY2FzZSBPQ1RFT05fQ042NlhYOiB7CiAJCXN0cnVjdCBvY3Rlb25fY242eHh4ICpjbjZ4eHggPQpAQCAtOTgzLDcgKzExNTAsMTUgQEAKIAkJaW50cl9jb2FsLT5yeF9jb2FsZXNjZV91c2Vjc19sb3cgPQogCQkJaW50cm1vZF9jZmctPnJ4X21pbnRtcl90cmlnZ2VyOwogCQlpbnRyX2NvYWwtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzX2xvdyA9Ci0JCQlpbnRybW9kX2NmZy0+cnhfbWluY250X3RyaWdnZXI7CisJCSAgICBpbnRybW9kX2NmZy0+cnhfbWluY250X3RyaWdnZXI7CisJfQorCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkgJiYKKwkgICAgKGludHJtb2RfY2ZnLT50eF9lbmFibGUpKSB7CisJCWludHJfY29hbC0+dXNlX2FkYXB0aXZlX3R4X2NvYWxlc2NlID0gaW50cm1vZF9jZmctPnR4X2VuYWJsZTsKKwkJaW50cl9jb2FsLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19oaWdoID0KKwkJICAgIGludHJtb2RfY2ZnLT50eF9tYXhjbnRfdHJpZ2dlcjsKKwkJaW50cl9jb2FsLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lc19sb3cgPQorCQkgICAgaW50cm1vZF9jZmctPnR4X21pbmNudF90cmlnZ2VyOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTEwNjAsMTEgKzEyMzUsMTEgQEAKIG9jdG5ldF9uaWNfc3RhdHNfY2FsbGJhY2soc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdF9kZXYsCiAJCQkgIHUzMiBzdGF0dXMsIHZvaWQgKnB0cikKIHsKLQlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAgKnNjID0gKHN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICAqKXB0cjsKLQlzdHJ1Y3Qgb2N0X25pY19zdGF0c19yZXNwICpyZXNwID0gKHN0cnVjdCBvY3RfbmljX3N0YXRzX3Jlc3AgKikKLQkJc2MtPnZpcnRycHRyOwotCXN0cnVjdCBvY3RfbmljX3N0YXRzX2N0cmwgKmN0cmwgPSAoc3RydWN0IG9jdF9uaWNfc3RhdHNfY3RybCAqKQotCQlzYy0+Y3R4cHRyOworCXN0cnVjdCBvY3Rlb25fc29mdF9jb21tYW5kICpzYyA9IChzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqKXB0cjsKKwlzdHJ1Y3Qgb2N0X25pY19zdGF0c19yZXNwICpyZXNwID0KKwkgICAgKHN0cnVjdCBvY3RfbmljX3N0YXRzX3Jlc3AgKilzYy0+dmlydHJwdHI7CisJc3RydWN0IG9jdF9uaWNfc3RhdHNfY3RybCAqY3RybCA9CisJICAgIChzdHJ1Y3Qgb2N0X25pY19zdGF0c19jdHJsICopc2MtPmN0eHB0cjsKIAlzdHJ1Y3QgbmljX3J4X3N0YXRzICpyc3BfcnN0YXRzID0gJnJlc3AtPnN0YXRzLmZyb213aXJlOwogCXN0cnVjdCBuaWNfdHhfc3RhdHMgKnJzcF90c3RhdHMgPSAmcmVzcC0+c3RhdHMuZnJvbWhvc3Q7CiAKQEAgLTEzMTQsMTQgKzE0ODksMzUgQEAKIAkJQ0ZHX1NFVF9PUV9JTlRSX1BLVChjbjZ4eHgtPmNvbmYsIHJ4X21heF9jb2FsZXNjZWRfZnJhbWVzKTsKIAkJYnJlYWs7CiAJfQorCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6IHsKKwkJaW50IHFfbm87CisKKwkJaWYgKCFpbnRyX2NvYWwtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzKQorCQkJcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSBvY3QtPmludHJtb2QucnhfZnJhbWVzOworCQllbHNlCisJCQlyeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9CisJCQkgICAgaW50cl9jb2FsLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lczsKKwkJZm9yIChxX25vID0gMDsgcV9ubyA8IG9jdC0+bnVtX29xczsgcV9ubysrKSB7CisJCQlxX25vICs9IG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm47CisJCQlvY3Rlb25fd3JpdGVfY3NyNjQoCisJCQkgICAgb2N0LCBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTKHFfbm8pLAorCQkJICAgIChvY3Rlb25fcmVhZF9jc3I2NCgKKwkJCQkgb2N0LCBDTjIzWFhfU0xJX09RX1BLVF9JTlRfTEVWRUxTKHFfbm8pKSAmCisJCQkgICAgICgweDNmZmZmZjAwMDAwMDAwVUwpKSB8CisJCQkJcnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMpOworCQkJLypjb25zaWRlciBzZXR0aW5nIHJlc2VuZCBiaXQqLworCQl9CisJCW9jdC0+aW50cm1vZC5yeF9mcmFtZXMgPSByeF9tYXhfY29hbGVzY2VkX2ZyYW1lczsKKwkJYnJlYWs7CisJfQogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvY3RfY2ZnX3J4X2ludHJ0aW1lKHN0cnVjdCBsaW8gKmxpbywgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UKLQkJCSAgICAgICAqaW50cl9jb2FsKQorc3RhdGljIGludCBvY3RfY2ZnX3J4X2ludHJ0aW1lKHN0cnVjdCBsaW8gKmxpbywKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqaW50cl9jb2FsKQogewogCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7CiAJdTMyIHRpbWVfdGhyZXNob2xkLCByeF9jb2FsZXNjZV91c2VjczsKQEAgLTEzNDYsNiArMTU0MiwyNyBAQAogCQlDRkdfU0VUX09RX0lOVFJfVElNRShjbjZ4eHgtPmNvbmYsIHJ4X2NvYWxlc2NlX3VzZWNzKTsKIAkJYnJlYWs7CiAJfQorCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6IHsKKwkJdTY0IHRpbWVfdGhyZXNob2xkOworCQlpbnQgcV9ubzsKKworCQlpZiAoIWludHJfY29hbC0+cnhfY29hbGVzY2VfdXNlY3MpCisJCQlyeF9jb2FsZXNjZV91c2VjcyA9IG9jdC0+aW50cm1vZC5yeF91c2VjczsKKwkJZWxzZQorCQkJcnhfY29hbGVzY2VfdXNlY3MgPSBpbnRyX2NvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzOworCQl0aW1lX3RocmVzaG9sZCA9CisJCSAgICBjbjIzeHhfcGZfZ2V0X29xX3RpY2tzKG9jdCwgKHUzMilyeF9jb2FsZXNjZV91c2Vjcyk7CisJCWZvciAocV9ubyA9IDA7IHFfbm8gPCBvY3QtPm51bV9vcXM7IHFfbm8rKykgeworCQkJcV9ubyArPSBvY3QtPnNyaW92X2luZm8ucGZfc3JuOworCQkJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdCwKKwkJCQkJICAgQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMUyhxX25vKSwKKwkJCQkJICAgKG9jdC0+aW50cm1vZC5yeF9mcmFtZXMgfAorCQkJCQkgICAgKHRpbWVfdGhyZXNob2xkIDw8IDMyKSkpOworCQkJLypjb25zaWRlciB3cml0aW5nIHRvIHJlc2VuZCBiaXQgaGVyZSovCisJCX0KKwkJb2N0LT5pbnRybW9kLnJ4X3VzZWNzID0gcnhfY29hbGVzY2VfdXNlY3M7CisJCWJyZWFrOworCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMzU4LDEyICsxNTc1LDM3IEBACiAJCSAgIF9fYXR0cmlidXRlX18oKHVudXNlZCkpKQogewogCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7CisJdTMyIGlxX2ludHJfcGt0OworCXZvaWQgX19pb21lbSAqaW5zdF9jbnRfcmVnOworCXU2NCB2YWw7CiAKIAkvKiBDb25maWcgQ250IGJhc2VkIGludGVycnVwdCB2YWx1ZXMgKi8KIAlzd2l0Y2ggKG9jdC0+Y2hpcF9pZCkgewogCWNhc2UgT0NURU9OX0NONjhYWDoKIAljYXNlIE9DVEVPTl9DTjY2WFg6CiAJCWJyZWFrOworCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6IHsKKwkJaW50IHFfbm87CisKKwkJaWYgKCFpbnRyX2NvYWwtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzKQorCQkJaXFfaW50cl9wa3QgPSBDTjIzWFhfREVGX0lRX0lOVFJfVEhSRVNIT0xEICYKKwkJCQkgICAgICBDTjIzWFhfUEtUX0lOX0RPTkVfV01BUktfTUFTSzsKKwkJZWxzZQorCQkJaXFfaW50cl9wa3QgPSBpbnRyX2NvYWwtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzICYKKwkJCQkgICAgICBDTjIzWFhfUEtUX0lOX0RPTkVfV01BUktfTUFTSzsKKwkJZm9yIChxX25vID0gMDsgcV9ubyA8IG9jdC0+bnVtX2lxczsgcV9ubysrKSB7CisJCQlpbnN0X2NudF9yZWcgPSAob2N0LT5pbnN0cl9xdWV1ZVtxX25vXSktPmluc3RfY250X3JlZzsKKwkJCXZhbCA9IHJlYWRxKGluc3RfY250X3JlZyk7CisJCQkvKmNsZWFyIHdtYXJrIGFuZCBjb3VudC5kb250IHdhbnQgdG8gd3JpdGUgY291bnQgYmFjayovCisJCQl2YWwgPSAodmFsICYgMHhGRkZGMDAwMDAwMDAwMDAwVUxMKSB8CisJCQkgICAgICAoKHU2NClpcV9pbnRyX3BrdAorCQkJICAgICAgIDw8IENOMjNYWF9QS1RfSU5fRE9ORV9XTUFSS19CSVRfUE9TKTsKKwkJCXdyaXRlcSh2YWwsIGluc3RfY250X3JlZyk7CisJCQkvKmNvbnNpZGVyIHNldHRpbmcgcmVzZW5kIGJpdCovCisJCX0KKwkJb2N0LT5pbnRybW9kLnR4X2ZyYW1lcyA9IGlxX2ludHJfcGt0OworCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTM5OSw2ICsxNjQxLDggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWJyZWFrOworCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE1NDEsOSArMTc4NSwyMzcgQEAKIH0KIAogLyogUmV0dXJuIHJlZ2lzdGVyIGR1bXAgbGVuLiAqLwotc3RhdGljIGludCBsaW9fZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCitzdGF0aWMgaW50IGxpb19nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gT0NUX0VUSFRPT0xfUkVHRFVNUF9MRU47CisJc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhkZXYpOworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7CisKKwlzd2l0Y2ggKG9jdC0+Y2hpcF9pZCkgeworCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6CisJCXJldHVybiBPQ1RfRVRIVE9PTF9SRUdEVU1QX0xFTl8yM1hYOworCWRlZmF1bHQ6CisJCXJldHVybiBPQ1RfRVRIVE9PTF9SRUdEVU1QX0xFTjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY24yM3h4X3JlYWRfY3NyX3JlZyhjaGFyICpzLCBzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQoreworCXUzMiByZWc7CisJdTggcGZfbnVtID0gb2N0LT5wZl9udW07CisJaW50IGxlbiA9IDA7CisJaW50IGk7CisKKwkvKiBQQ0kgIFdpbmRvdyBSZWdpc3RlcnMgKi8KKworCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sICJcblx0IE9jdGVvbiBDU1IgUmVnaXN0ZXJzXG5cbiIpOworCisJLyoweDI5MDMwIG9yIDB4MjkwNDAqLworCXJlZyA9IENOMjNYWF9TTElfUEtUX01BQ19SSU5GTzY0KG9jdC0+cGNpZV9wb3J0LCBvY3QtPnBmX251bSk7CisJbGVuICs9IHNwcmludGYocyArIGxlbiwKKwkJICAgICAgICJcblslMDh4XSAoU0xJX1BLVF9NQUMlZF9QRiVkX1JJTkZPKTogJTAxNmxseFxuIiwKKwkJICAgICAgIHJlZywgb2N0LT5wY2llX3BvcnQsIG9jdC0+cGZfbnVtLAorCQkgICAgICAgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoweDI3MDgwIG9yIDB4MjcwOTAqLworCXJlZyA9IENOMjNYWF9TTElfTUFDX1BGX0lOVF9FTkI2NChvY3QtPnBjaWVfcG9ydCwgb2N0LT5wZl9udW0pOworCWxlbiArPQorCSAgICBzcHJpbnRmKHMgKyBsZW4sICJcblslMDh4XSAoU0xJX01BQyVkX1BGJWRfSU5UX0VOQik6ICUwMTZsbHhcbiIsCisJCSAgICByZWcsIG9jdC0+cGNpZV9wb3J0LCBvY3QtPnBmX251bSwKKwkJICAgICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMHgyNzAwMCBvciAweDI3MDEwKi8KKwlyZWcgPSBDTjIzWFhfU0xJX01BQ19QRl9JTlRfU1VNNjQob2N0LT5wY2llX3BvcnQsIG9jdC0+cGZfbnVtKTsKKwlsZW4gKz0KKwkgICAgc3ByaW50ZihzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9NQUMlZF9QRiVkX0lOVF9TVU0pOiAlMDE2bGx4XG4iLAorCQkgICAgcmVnLCBvY3QtPnBjaWVfcG9ydCwgb2N0LT5wZl9udW0sCisJCSAgICAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjB4MjkxMjAqLworCXJlZyA9IDB4MjkxMjA7CisJbGVuICs9IHNwcmludGYocyArIGxlbiwgIlxuWyUwOHhdIChTTElfUEtUX01FTV9DVEwpOiAlMDE2bGx4XG4iLCByZWcsCisJCSAgICAgICAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjB4MjczMDAqLworCXJlZyA9IDB4MjczMDAgKyBvY3QtPnBjaWVfcG9ydCAqIENOMjNYWF9NQUNfSU5UX09GRlNFVCArCisJICAgICAgKG9jdC0+cGZfbnVtKSAqIENOMjNYWF9QRl9JTlRfT0ZGU0VUOworCWxlbiArPSBzcHJpbnRmKAorCSAgICBzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9NQUMlZF9QRiVkX1BLVF9WRl9JTlQpOiAlMDE2bGx4XG4iLCByZWcsCisJICAgIG9jdC0+cGNpZV9wb3J0LCBvY3QtPnBmX251bSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoweDI3MjAwKi8KKwlyZWcgPSAweDI3MjAwICsgb2N0LT5wY2llX3BvcnQgKiBDTjIzWFhfTUFDX0lOVF9PRkZTRVQgKworCSAgICAgIChvY3QtPnBmX251bSkgKiBDTjIzWFhfUEZfSU5UX09GRlNFVDsKKwlsZW4gKz0gc3ByaW50ZihzICsgbGVuLAorCQkgICAgICAgIlxuWyUwOHhdIChTTElfTUFDJWRfUEYlZF9QUF9WRl9JTlQpOiAlMDE2bGx4XG4iLAorCQkgICAgICAgcmVnLCBvY3QtPnBjaWVfcG9ydCwgb2N0LT5wZl9udW0sCisJCSAgICAgICAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjI5MTMwKi8KKwlyZWcgPSBDTjIzWFhfU0xJX1BLVF9DTlRfSU5UOworCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sICJcblslMDh4XSAoU0xJX1BLVF9DTlRfSU5UKTogJTAxNmxseFxuIiwgcmVnLAorCQkgICAgICAgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoweDI5MTQwKi8KKwlyZWcgPSBDTjIzWFhfU0xJX1BLVF9USU1FX0lOVDsKKwlsZW4gKz0gc3ByaW50ZihzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9QS1RfVElNRV9JTlQpOiAlMDE2bGx4XG4iLCByZWcsCisJCSAgICAgICAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjB4MjkxNjAqLworCXJlZyA9IDB4MjkxNjA7CisJbGVuICs9IHNwcmludGYocyArIGxlbiwgIlxuWyUwOHhdIChTTElfUEtUX0lOVCk6ICUwMTZsbHhcbiIsIHJlZywKKwkJICAgICAgICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKworCS8qMHgyOTE4MCovCisJcmVnID0gQ04yM1hYX1NMSV9PUV9XTUFSSzsKKwlsZW4gKz0gc3ByaW50ZihzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9QS1RfT1VUUFVUX1dNQVJLKTogJTAxNmxseFxuIiwKKwkJICAgICAgIHJlZywgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoweDI5MUUwKi8KKwlyZWcgPSBDTjIzWFhfU0xJX1BLVF9JT1FfUklOR19SU1Q7CisJbGVuICs9IHNwcmludGYocyArIGxlbiwgIlxuWyUwOHhdIChTTElfUEtUX1JJTkdfUlNUKTogJTAxNmxseFxuIiwgcmVnLAorCQkgICAgICAgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLyoweDI5MjEwKi8KKwlyZWcgPSBDTjIzWFhfU0xJX0dCTF9DT05UUk9MOworCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sCisJCSAgICAgICAiXG5bJTA4eF0gKFNMSV9QS1RfR0JMX0NPTlRST0wpOiAlMDE2bGx4XG4iLCByZWcsCisJCSAgICAgICAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisKKwkvKjB4MjkyMjAqLworCXJlZyA9IDB4MjkyMjA7CisJbGVuICs9IHNwcmludGYocyArIGxlbiwgIlxuWyUwOHhdIChTTElfUEtUX0JJU1RfU1RBVFVTKTogJTAxNmxseFxuIiwKKwkJICAgICAgIHJlZywgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJLypQRiBvbmx5Ki8KKwlpZiAocGZfbnVtID09IDApIHsKKwkJLyoweDI5MjYwKi8KKwkJcmVnID0gQ04yM1hYX1NMSV9PVVRfQlBfRU5fVzFTOworCQlsZW4gKz0gc3ByaW50ZihzICsgbGVuLAorCQkJICAgICAgICJcblslMDh4XSAoU0xJX1BLVF9PVVRfQlBfRU5fVzFTKTogICUwMTZsbHhcbiIsCisJCQkgICAgICAgcmVnLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJfSBlbHNlIGlmIChwZl9udW0gPT0gMSkgeworCQkvKjB4MjkyNzAqLworCQlyZWcgPSBDTjIzWFhfU0xJX09VVF9CUF9FTjJfVzFTOworCQlsZW4gKz0gc3ByaW50ZihzICsgbGVuLAorCQkJICAgICAgICJcblslMDh4XSAoU0xJX1BLVF9PVVRfQlBfRU4yX1cxUyk6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgcmVnLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUzsgaSsrKSB7CisJCXJlZyA9IENOMjNYWF9TTElfT1FfQlVGRl9JTkZPX1NJWkUoaSk7CisJCWxlbiArPQorCQkgICAgc3ByaW50ZihzICsgbGVuLCAiXG5bJTA4eF0gKFNMSV9QS1QlZF9PVVRfU0laRSk6ICUwMTZsbHhcbiIsCisJCQkgICAgcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJfQorCisJLyoweDEwMDQwKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9JTlBVVF9RVUVVRVM7IGkrKykgeworCQlyZWcgPSBDTjIzWFhfU0xJX0lRX0lOU1RSX0NPVU5UNjQoaSk7CisJCWxlbiArPSBzcHJpbnRmKHMgKyBsZW4sCisJCQkgICAgICAgIlxuWyUwOHhdIChTTElfUEtUX0lOX0RPTkUlZF9DTlRTKTogJTAxNmxseFxuIiwKKwkJCSAgICAgICByZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwl9CisKKwkvKjB4MTAwODAqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVM7IGkrKykgeworCQlyZWcgPSBDTjIzWFhfU0xJX09RX1BLVFNfQ1JFRElUKGkpOworCQlsZW4gKz0gc3ByaW50ZihzICsgbGVuLAorCQkJICAgICAgICJcblslMDh4XSAoU0xJX1BLVCVkX1NMSVNUX0JBT0ZGX0RCRUxMKTogJTAxNmxseFxuIiwKKwkJCSAgICAgICByZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwl9CisKKwkvKjB4MTAwOTAqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVM7IGkrKykgeworCQlyZWcgPSBDTjIzWFhfU0xJX09RX1NJWkUoaSk7CisJCWxlbiArPSBzcHJpbnRmKAorCQkgICAgcyArIGxlbiwgIlxuWyUwOHhdIChTTElfUEtUJWRfU0xJU1RfRklGT19SU0laRSk6ICUwMTZsbHhcbiIsCisJCSAgICByZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwl9CisKKwkvKjB4MTAwNTAqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVM7IGkrKykgeworCQlyZWcgPSBDTjIzWFhfU0xJX09RX1BLVF9DT05UUk9MKGkpOworCQlsZW4gKz0gc3ByaW50ZigKKwkJCXMgKyBsZW4sCisJCQkiXG5bJTA4eF0gKFNMSV9QS1QlZF9fT1VUUFVUX0NPTlRST0wpOiAlMDE2bGx4XG4iLAorCQkJcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJfQorCisJLyoweDEwMDcwKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTOyBpKyspIHsKKwkJcmVnID0gQ04yM1hYX1NMSV9PUV9CQVNFX0FERFI2NChpKTsKKwkJbGVuICs9IHNwcmludGYocyArIGxlbiwKKwkJCSAgICAgICAiXG5bJTA4eF0gKFNMSV9QS1QlZF9TTElTVF9CQUREUik6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJfQorCisJLyoweDEwMGEwKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTOyBpKyspIHsKKwkJcmVnID0gQ04yM1hYX1NMSV9PUV9QS1RfSU5UX0xFVkVMUyhpKTsKKwkJbGVuICs9IHNwcmludGYocyArIGxlbiwKKwkJCSAgICAgICAiXG5bJTA4eF0gKFNMSV9QS1QlZF9JTlRfTEVWRUxTKTogJTAxNmxseFxuIiwKKwkJCSAgICAgICByZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwl9CisKKwkvKjB4MTAwYjAqLworCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVM7IGkrKykgeworCQlyZWcgPSBDTjIzWFhfU0xJX09RX1BLVFNfU0VOVChpKTsKKwkJbGVuICs9IHNwcmludGYocyArIGxlbiwgIlxuWyUwOHhdIChTTElfUEtUJWRfQ05UUyk6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJfQorCisJLyoweDEwMGMwKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTOyBpKyspIHsKKwkJcmVnID0gMHgxMDBjMCArIGkgKiBDTjIzWFhfT1FfT0ZGU0VUOworCQlsZW4gKz0gc3ByaW50ZihzICsgbGVuLAorCQkJICAgICAgICJcblslMDh4XSAoU0xJX1BLVCVkX0VSUk9SX0lORk8pOiAlMDE2bGx4XG4iLAorCQkJICAgICAgIHJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCisJCS8qMHgxMDAwMCovCisJCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUzsgaSsrKSB7CisJCQlyZWcgPSBDTjIzWFhfU0xJX0lRX1BLVF9DT05UUk9MNjQoaSk7CisJCQlsZW4gKz0gc3ByaW50ZigKKwkJCQlzICsgbGVuLAorCQkJCSJcblslMDh4XSAoU0xJX1BLVCVkX0lOUFVUX0NPTlRST0wpOiAlMDE2bGx4XG4iLAorCQkJCXJlZywgaSwgKHU2NClvY3Rlb25fcmVhZF9jc3I2NChvY3QsIHJlZykpOworCQl9CisKKwkJLyoweDEwMDEwKi8KKwkJZm9yIChpID0gMDsgaSA8IENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTOyBpKyspIHsKKwkJCXJlZyA9IENOMjNYWF9TTElfSVFfQkFTRV9BRERSNjQoaSk7CisJCQlsZW4gKz0gc3ByaW50ZigKKwkJCSAgICBzICsgbGVuLAorCQkJICAgICJcblslMDh4XSAoU0xJX1BLVCVkX0lOU1RSX0JBRERSKTogJTAxNmxseFxuIiwgcmVnLAorCQkJICAgIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwkJfQorCisJCS8qMHgxMDAyMCovCisJCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUzsgaSsrKSB7CisJCQlyZWcgPSBDTjIzWFhfU0xJX0lRX0RPT1JCRUxMKGkpOworCQkJbGVuICs9IHNwcmludGYoCisJCQkgICAgcyArIGxlbiwKKwkJCSAgICAiXG5bJTA4eF0gKFNMSV9QS1QlZF9JTlNUUl9CQU9GRl9EQkVMTCk6ICUwMTZsbHhcbiIsCisJCQkgICAgcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJCX0KKworCQkvKjB4MTAwMzAqLworCQlmb3IgKGkgPSAwOyBpIDwgQ04yM1hYX01BWF9JTlBVVF9RVUVVRVM7IGkrKykgeworCQkJcmVnID0gQ04yM1hYX1NMSV9JUV9TSVpFKGkpOworCQkJbGVuICs9IHNwcmludGYoCisJCQkgICAgcyArIGxlbiwKKwkJCSAgICAiXG5bJTA4eF0gKFNMSV9QS1QlZF9JTlNUUl9GSUZPX1JTSVpFKTogJTAxNmxseFxuIiwKKwkJCSAgICByZWcsIGksICh1NjQpb2N0ZW9uX3JlYWRfY3NyNjQob2N0LCByZWcpKTsKKwkJfQorCisJCS8qMHgxMDA0MCovCisJCWZvciAoaSA9IDA7IGkgPCBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUzsgaSsrKQorCQkJcmVnID0gQ04yM1hYX1NMSV9JUV9JTlNUUl9DT1VOVDY0KGkpOworCQlsZW4gKz0gc3ByaW50ZihzICsgbGVuLAorCQkJICAgICAgICJcblslMDh4XSAoU0xJX1BLVF9JTl9ET05FJWRfQ05UUyk6ICUwMTZsbHhcbiIsCisJCQkgICAgICAgcmVnLCBpLCAodTY0KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgcmVnKSk7CisJfQorCisJcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIGludCBjbjZ4eHhfcmVhZF9jc3JfcmVnKGNoYXIgKnMsIHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCkBAIC0xNjg4LDYgKzIxNjAsMTAgQEAKIAlyZWdzLT52ZXJzaW9uID0gT0NUX0VUSFRPT0xfUkVHU1ZFUjsKIAogCXN3aXRjaCAob2N0LT5jaGlwX2lkKSB7CisJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDoKKwkJbWVtc2V0KHJlZ2J1ZiwgMCwgT0NUX0VUSFRPT0xfUkVHRFVNUF9MRU5fMjNYWCk7CisJCWxlbiArPSBjbjIzeHhfcmVhZF9jc3JfcmVnKHJlZ2J1ZiArIGxlbiwgb2N0KTsKKwkJYnJlYWs7CiAJY2FzZSBPQ1RFT05fQ042OFhYOgogCWNhc2UgT0NURU9OX0NONjZYWDoKIAkJbWVtc2V0KHJlZ2J1ZiwgMCwgT0NUX0VUSFRPT0xfUkVHRFVNUF9MRU4pOwpAQCAtMTcyOSw2ICsyMjA1LDcgQEAKIAkuZ2V0X3N0cmluZ3MJCT0gbGlvX2dldF9zdHJpbmdzLAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IGxpb19nZXRfZXRodG9vbF9zdGF0cywKIAkuZ2V0X3BhdXNlcGFyYW0JCT0gbGlvX2dldF9wYXVzZXBhcmFtLAorCS5zZXRfcGF1c2VwYXJhbQkJPSBsaW9fc2V0X3BhdXNlcGFyYW0sCiAJLmdldF9yZWdzX2xlbgkJPSBsaW9fZ2V0X3JlZ3NfbGVuLAogCS5nZXRfcmVncwkJPSBsaW9fZ2V0X3JlZ3MsCiAJLmdldF9tc2dsZXZlbAkJPSBsaW9fZ2V0X21zZ2xldmVsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpb19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlvX21haW4uYwppbmRleCAyMGQ2OTQyLi5hZmM2ZjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlvX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlvX21haW4uYwpAQCAtMjEsMTEgKzIxLDEwIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRfdHN0YW1wLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcHRwX2Nsb2NrX2tlcm5lbC5oPgogI2luY2x1ZGUgPG5ldC92eGxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlICJsaXF1aWRpb19jb21tb24uaCIKICNpbmNsdWRlICJvY3Rlb25fZHJvcS5oIgogI2luY2x1ZGUgIm9jdGVvbl9pcS5oIgpAQCAtMzcsNiArMzYsNyBAQAogI2luY2x1ZGUgImNuNjZ4eF9yZWdzLmgiCiAjaW5jbHVkZSAiY242Nnh4X2RldmljZS5oIgogI2luY2x1ZGUgImNuNjh4eF9kZXZpY2UuaCIKKyNpbmNsdWRlICJjbjIzeHhfcGZfZGV2aWNlLmgiCiAjaW5jbHVkZSAibGlxdWlkaW9faW1hZ2UuaCIKIAogTU9EVUxFX0FVVEhPUigiQ2F2aXVtIE5ldHdvcmtzLCA8c3VwcG9ydEBjYXZpdW0uY29tPiIpOwpAQCAtNTIsMTEgKzUyLDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZGRyX3RpbWVvdXQsCiAJCSAiTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciBERFIgaW5pdGlhbGl6YXRpb24uIDAgd2FpdHMgZm9yIGRkcl90aW1lb3V0IHRvIGJlIHNldCB0byBub24temVybyB2YWx1ZSBiZWZvcmUgc3RhcnRpbmcgdG8gY2hlY2siKTsKIAotc3RhdGljIHUzMiBjb25zb2xlX2JpdG1hc2s7Ci1tb2R1bGVfcGFyYW0oY29uc29sZV9iaXRtYXNrLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhjb25zb2xlX2JpdG1hc2ssCi0JCSAiQml0bWFzayBpbmRpY2F0aW5nIHdoaWNoIGNvbnNvbGVzIGhhdmUgZGVidWcgb3V0cHV0IHJlZGlyZWN0ZWQgdG8gc3lzbG9nLiIpOwotCiAjZGVmaW5lIERFRkFVTFRfTVNHX0VOQUJMRSAoTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRSB8IE5FVElGX01TR19MSU5LKQogCiAjZGVmaW5lIElOQ1JfSU5TVFJRVUVVRV9QS1RfQ09VTlQob2N0ZW9uX2Rldl9wdHIsIGlxX25vLCBmaWVsZCwgY291bnQpICBcCkBAIC0xMDIsNiArOTcsMTQgQEAKIAl1NjQgc3RhdHVzOwogfTsKIAorc3RydWN0IGxpcXVpZGlvX3J4X2N0bF9jb250ZXh0IHsKKwlpbnQgb2N0ZW9uX2lkOworCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2M7CisKKwlpbnQgY29uZDsKK307CisKIHN0cnVjdCBvY3RfbGlua19zdGF0dXNfcmVzcCB7CiAJdTY0IHJoOwogCXN0cnVjdCBvY3RfbGlua19pbmZvIGxpbmtfaW5mbzsKQEAgLTEzOSw3ICsxNDIsOCBAQAogI2RlZmluZSBPQ1ROSUNfTUFYX1NHICAoTUFYX1NLQl9GUkFHUykKIAogI2RlZmluZSBPQ1ROSUNfR1NPX01BWF9IRUFERVJfU0laRSAxMjgKLSNkZWZpbmUgT0NUTklDX0dTT19NQVhfU0laRSAoR1NPX01BWF9TSVpFIC0gT0NUTklDX0dTT19NQVhfSEVBREVSX1NJWkUpCisjZGVmaW5lIE9DVE5JQ19HU09fTUFYX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCShDTjIzWFhfREVGQVVMVF9JTlBVVF9KQUJCRVIgLSBPQ1ROSUNfR1NPX01BWF9IRUFERVJfU0laRSkKIAogLyoqIFN0cnVjdHVyZSBvZiBhIG5vZGUgaW4gbGlzdCBvZiBnYXRoZXIgY29tcG9uZW50cyBtYWludGFpbmVkIGJ5CiAgKiBOSUMgZHJpdmVyIGZvciBlYWNoIG5ldHdvcmsgZGV2aWNlLgpAQCAtMTYyLDI3ICsxNjYsNiBAQAogCXU2NCBzZ19kbWFfcHRyOwogfTsKIAotLyoqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgTklDIGRyaXZlciB0byBzdG9yZSBpbmZvcm1hdGlvbiByZXF1aXJlZAotICogdG8gZnJlZSB0aGUgc2tfYnVmZiB3aGVuIHRoZSBwYWNrZXQgaGFzIGJlZW4gZmV0Y2hlZCBieSBPY3Rlb24uCi0gKiBCeXRlcyBvZmZzZXQgYmVsb3cgYXNzdW1lIHdvcnN0LWNhc2Ugb2YgYSA2NC1iaXQgc3lzdGVtLgotICovCi1zdHJ1Y3Qgb2N0bmV0X2J1Zl9mcmVlX2luZm8gewotCS8qKiBCeXRlcyAxLTguICBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLiAqLwotCXN0cnVjdCBsaW8gKmxpbzsKLQotCS8qKiBCeXRlcyA5LTE2LiAgUG9pbnRlciB0byBza19idWZmLiAqLwotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQkvKiogQnl0ZXMgMTctMjQuICBQb2ludGVyIHRvIGdhdGhlciBsaXN0LiAqLwotCXN0cnVjdCBvY3RuaWNfZ2F0aGVyICpnOwotCi0JLyoqIEJ5dGVzIDI1LTMyLiBQaHlzaWNhbCBhZGRyZXNzIG9mIHNrYi0+ZGF0YSBvciBnYXRoZXIgbGlzdC4gKi8KLQl1NjQgZHB0cjsKLQotCS8qKiBCeXRlcyAzMy00Ny4gUGlnZ3liYWNrZWQgc29mdCBjb21tYW5kLCBpZiBhbnkgKi8KLQlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2M7Ci19OwotCiBzdHJ1Y3QgaGFuZHNoYWtlIHsKIAlzdHJ1Y3QgY29tcGxldGlvbiBpbml0OwogCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0ZWQ7CkBAIC0xOTgsNiArMTgxLDcgQEAKIH07CiAKIHN0YXRpYyBpbnQgb2N0ZW9uX2RldmljZV9pbml0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICopOworc3RhdGljIGludCBsaXF1aWRpb19zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogc3RhdGljIHZvaWQgbGlxdWlkaW9fcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIHN0YXRpYyBpbnQgbGlxdWlkaW9fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwpAQCAtMjE5LDYgKzIwMywyMCBAQAogCQkJY29udGludWU7CiAJCXJlc2NoZWR1bGUgfD0gb2N0ZW9uX2Ryb3FfcHJvY2Vzc19wYWNrZXRzKG9jdCwgb2N0LT5kcm9xW3Ffbm9dLAogCQkJCQkJCSAgTUFYX1BBQ0tFVF9CVURHRVQpOworCQlsaW9fZW5hYmxlX2lycShvY3QtPmRyb3FbcV9ub10sIE5VTEwpOworCisJCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkgJiYgb2N0LT5tc2l4X29uKSB7CisJCQkvKiBzZXQgdGltZSBhbmQgY250IGludGVycnVwdCB0aHJlc2hvbGRzIGZvciB0aGlzIERST1EKKwkJCSAqIGZvciBOQVBJCisJCQkgKi8KKwkJCWludCBhZGp1c3RlZF9xX25vID0gcV9ubyArIG9jdC0+c3Jpb3ZfaW5mby5wZl9zcm47CisKKwkJCW9jdGVvbl93cml0ZV9jc3I2NCgKKwkJCSAgICBvY3QsIENOMjNYWF9TTElfT1FfUEtUX0lOVF9MRVZFTFMoYWRqdXN0ZWRfcV9ubyksCisJCQkgICAgMHg1NzAwMDAwMDQwVUxMKTsKKwkJCW9jdGVvbl93cml0ZV9jc3I2NCgKKwkJCSAgICBvY3QsIENOMjNYWF9TTElfT1FfUEtUU19TRU5UKGFkanVzdGVkX3Ffbm8pLCAwKTsKKwkJfQogCX0KIAogCWlmIChyZXNjaGVkdWxlKQpAQCAtMjUyLDc2ICsyNTAsNiBAQAogCXJldHVybiBwa3RfY250OwogfQogCi12b2lkIG9jdGVvbl9yZXBvcnRfdHhfY29tcGxldGlvbl90b19icWwodm9pZCAqdHhxLCB1bnNpZ25lZCBpbnQgcGt0c19jb21wbCwKLQkJCQkJdW5zaWduZWQgaW50IGJ5dGVzX2NvbXBsKQotewotCXN0cnVjdCBuZXRkZXZfcXVldWUgKm5ldGRldl9xdWV1ZSA9IHR4cTsKLQotCW5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUobmV0ZGV2X3F1ZXVlLCBwa3RzX2NvbXBsLCBieXRlc19jb21wbCk7Ci19Ci0KLXZvaWQgb2N0ZW9uX3VwZGF0ZV90eF9jb21wbGV0aW9uX2NvdW50ZXJzKHZvaWQgKmJ1ZiwgaW50IHJlcXR5cGUsCi0JCQkJCSAgdW5zaWduZWQgaW50ICpwa3RzX2NvbXBsLAotCQkJCQkgIHVuc2lnbmVkIGludCAqYnl0ZXNfY29tcGwpCi17Ci0Jc3RydWN0IG9jdG5ldF9idWZfZnJlZV9pbmZvICpmaW5mbzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKLQlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2M7Ci0KLQlzd2l0Y2ggKHJlcXR5cGUpIHsKLQljYXNlIFJFUVRZUEVfTk9SRVNQX05FVDoKLQljYXNlIFJFUVRZUEVfTk9SRVNQX05FVF9TRzoKLQkJZmluZm8gPSBidWY7Ci0JCXNrYiA9IGZpbmZvLT5za2I7Ci0JCWJyZWFrOwotCi0JY2FzZSBSRVFUWVBFX1JFU1BfTkVUX1NHOgotCWNhc2UgUkVRVFlQRV9SRVNQX05FVDoKLQkJc2MgPSBidWY7Ci0JCXNrYiA9IHNjLT5jYWxsYmFja19hcmc7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuOwotCX0KLQotCSgqcGt0c19jb21wbCkrKzsKLQkqYnl0ZXNfY29tcGwgKz0gc2tiLT5sZW47Ci19Ci0KLXZvaWQgb2N0ZW9uX3JlcG9ydF9zZW50X2J5dGVzX3RvX2JxbCh2b2lkICpidWYsIGludCByZXF0eXBlKQotewotCXN0cnVjdCBvY3RuZXRfYnVmX2ZyZWVfaW5mbyAqZmluZm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2M7Ci0Jc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxOwotCi0Jc3dpdGNoIChyZXF0eXBlKSB7Ci0JY2FzZSBSRVFUWVBFX05PUkVTUF9ORVQ6Ci0JY2FzZSBSRVFUWVBFX05PUkVTUF9ORVRfU0c6Ci0JCWZpbmZvID0gYnVmOwotCQlza2IgPSBmaW5mby0+c2tiOwotCQlicmVhazsKLQotCWNhc2UgUkVRVFlQRV9SRVNQX05FVF9TRzoKLQljYXNlIFJFUVRZUEVfUkVTUF9ORVQ6Ci0JCXNjID0gYnVmOwotCQlza2IgPSBzYy0+Y2FsbGJhY2tfYXJnOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0KLQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHNrYi0+ZGV2LCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7Ci0JbmV0ZGV2X3R4X3NlbnRfcXVldWUodHhxLCBza2ItPmxlbik7Ci19Ci0KLWludCBvY3Rlb25fY29uc29sZV9kZWJ1Z19lbmFibGVkKHUzMiBjb25zb2xlKQotewotCXJldHVybiAoY29uc29sZV9iaXRtYXNrID4+IChjb25zb2xlKSkgJiAweDE7Ci19Ci0KIC8qKgogICogXGJyaWVmIEZvcmNlcyBhbGwgSU8gcXVldWVzIG9mZiBvbiBhIGdpdmVuIGRldmljZQogICogQHBhcmFtIG9jdCBQb2ludGVyIHRvIE9jdGVvbiBkZXZpY2UKQEAgLTQ0MSw3ICszNjksNyBAQAogCXBjaV9kaXNhYmxlX2RldmljZShvY3QtPnBjaV9kZXYpOwogCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICAqLwotCW9jdC0+Zm5fbGlzdC5kaXNhYmxlX2ludGVycnVwdChvY3QtPmNoaXApOworCW9jdC0+Zm5fbGlzdC5kaXNhYmxlX2ludGVycnVwdChvY3QsIE9DVEVPTl9BTExfSU5UUik7CiAKIAlwY2llcnJvcl9xdWllc2NlX2RldmljZShvY3QpOwogCkBAIC01NzAsNiArNDk4LDkgQEAKIAl7ICAgICAgIC8qIDY2eHggKi8KIAkJUENJX1ZFTkRPUl9JRF9DQVZJVU0sIDB4OTIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAKIAl9LAorCXsgICAgICAgLyogMjN4eCBwZiAqLworCQlQQ0lfVkVORE9SX0lEX0NBVklVTSwgMHg5NzAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwCisJfSwKIAl7CiAJCTAsIDAsIDAsIDAsIDAsIDAsIDAKIAl9CkBAIC01ODcsNyArNTE4LDYgQEAKIAkuc3VzcGVuZAk9IGxpcXVpZGlvX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBsaXF1aWRpb19yZXN1bWUsCiAjZW5kaWYKLQogfTsKIAogLyoqCkBAIC05MzYsNiArODY2LDUyIEBACiB9CiAKIC8qKgorICogXGJyaWVmIFJvdXRpbmUgdG8gbm90aWZ5IE1UVSBjaGFuZ2UKKyAqIEBwYXJhbSB3b3JrIHdvcmtfc3RydWN0IGRhdGEgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIG9jdG5ldF9saW5rX3N0YXR1c19jaGFuZ2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBjYXZpdW1fd2sgKndrID0gKHN0cnVjdCBjYXZpdW1fd2sgKil3b3JrOworCXN0cnVjdCBsaW8gKmxpbyA9IChzdHJ1Y3QgbGlvICopd2stPmN0eHB0cjsKKworCXJ0bmxfbG9jaygpOworCWNhbGxfbmV0ZGV2aWNlX25vdGlmaWVycyhORVRERVZfQ0hBTkdFTVRVLCBsaW8tPm5ldGRldik7CisJcnRubF91bmxvY2soKTsKK30KKworLyoqCisgKiBcYnJpZWYgU2V0cyB1cCB0aGUgbXR1IHN0YXR1cyBjaGFuZ2Ugd29yaworICogQHBhcmFtIG5ldGRldiBuZXR3b3JrIGRldmljZQorICovCitzdGF0aWMgaW5saW5lIGludCBzZXR1cF9saW5rX3N0YXR1c19jaGFuZ2Vfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IGxpby0+b2N0X2RldjsKKworCWxpby0+bGlua19zdGF0dXNfd3Eud3EgPSBhbGxvY193b3JrcXVldWUoImxpbmstc3RhdHVzIiwKKwkJCQkJCSBXUV9NRU1fUkVDTEFJTSwgMCk7CisJaWYgKCFsaW8tPmxpbmtfc3RhdHVzX3dxLndxKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAidW5hYmxlIHRvIGNyZWF0ZSBjYXZpdW0gbGluayBzdGF0dXMgd3FcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCUlOSVRfREVMQVlFRF9XT1JLKCZsaW8tPmxpbmtfc3RhdHVzX3dxLndrLndvcmssCisJCQkgIG9jdG5ldF9saW5rX3N0YXR1c19jaGFuZ2UpOworCWxpby0+bGlua19zdGF0dXNfd3Eud2suY3R4cHRyID0gbGlvOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhbnVwX2xpbmtfc3RhdHVzX2NoYW5nZV93cShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKKworCWlmIChsaW8tPmxpbmtfc3RhdHVzX3dxLndxKSB7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbGlvLT5saW5rX3N0YXR1c193cS53ay53b3JrKTsKKwkJZGVzdHJveV93b3JrcXVldWUobGlvLT5saW5rX3N0YXR1c193cS53cSk7CisJfQorfQorCisvKioKICAqIFxicmllZiBVcGRhdGUgbGluayBzdGF0dXMKICAqIEBwYXJhbSBuZXRkZXYgbmV0d29yayBkZXZpY2UKICAqIEBwYXJhbSBscyBsaW5rIHN0YXR1cyBzdHJ1Y3R1cmUKQEAgLTk3Myw4ICs5NDksNiBAQAogCXN0cnVjdCBsaW8gKmxpbzsKIAlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3F1ZXVlICppcSA9IG9jdC0+aW5zdHJfcXVldWVbaXFfbnVtXTsKIAotCS8qb2N0ZW9uX3VwZGF0ZV9pcV9yZWFkX2lkeChvY3QsIGlxKTsqLwotCiAJbmV0ZGV2ID0gb2N0LT5wcm9wc1tpcS0+aWZpZHhdLm5ldGRldjsKIAogCS8qIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGZpcnN0IElRIGRvZXMgbm90IGhhdmUKQEAgLTEwMDIsMTIgKzk3NiwzMiBAQAogCX0KIH0KIAorc3RhdGljCitpbnQgbGlxdWlkaW9fc2NoZWR1bGVfbXNpeF9kcm9xX3BrdF9oYW5kbGVyKHN0cnVjdCBvY3Rlb25fZHJvcSAqZHJvcSwgdTY0IHJldCkKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gZHJvcS0+b2N0X2RldjsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZV9wcml2ICpvY3RfcHJpdiA9CisJICAgIChzdHJ1Y3Qgb2N0ZW9uX2RldmljZV9wcml2ICopb2N0LT5wcml2OworCisJaWYgKGRyb3EtPm9wcy5wb2xsX21vZGUpIHsKKwkJZHJvcS0+b3BzLm5hcGlfZm4oZHJvcSk7CisJfSBlbHNlIHsKKwkJaWYgKHJldCAmIE1TSVhfUE9fSU5UKSB7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZvY3RfcHJpdi0+ZHJvcV90YXNrbGV0KTsKKwkJCXJldHVybiAxOworCQl9CisJCS8qIHRoaXMgd2lsbCBiZSBmbHVzaGVkIHBlcmlvZGljYWxseSBieSBjaGVjayBpcSBkYiAqLworCQlpZiAocmV0ICYgTVNJWF9QSV9JTlQpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogXGJyaWVmIERyb3EgcGFja2V0IHByb2Nlc3NvciBzY2VkdWxlcgogICogQHBhcmFtIG9jdCBvY3Rlb24gZGV2aWNlCiAgKi8KLXN0YXRpYwotdm9pZCBsaXF1aWRpb19zY2hlZHVsZV9kcm9xX3BrdF9oYW5kbGVycyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQorc3RhdGljIHZvaWQgbGlxdWlkaW9fc2NoZWR1bGVfZHJvcV9wa3RfaGFuZGxlcnMoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2RldmljZV9wcml2ICpvY3RfcHJpdiA9CiAJCShzdHJ1Y3Qgb2N0ZW9uX2RldmljZV9wcml2ICopb2N0LT5wcml2OwpAQCAtMTAzMiwxOSArMTAyNiwzNiBAQAogCX0KIH0KIAorc3RhdGljIGlycXJldHVybl90CitsaXF1aWRpb19tc2l4X2ludHJfaGFuZGxlcihpbnQgaXJxIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLCB2b2lkICpkZXYpCit7CisJdTY0IHJldDsKKwlzdHJ1Y3Qgb2N0ZW9uX2lvcV92ZWN0b3IgKmlvcV92ZWN0b3IgPSAoc3RydWN0IG9jdGVvbl9pb3FfdmVjdG9yICopZGV2OworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBpb3FfdmVjdG9yLT5vY3RfZGV2OworCXN0cnVjdCBvY3Rlb25fZHJvcSAqZHJvcSA9IG9jdC0+ZHJvcVtpb3FfdmVjdG9yLT5kcm9xX2luZGV4XTsKKworCXJldCA9IG9jdC0+Zm5fbGlzdC5tc2l4X2ludGVycnVwdF9oYW5kbGVyKGlvcV92ZWN0b3IpOworCisJaWYgKChyZXQgJiBNU0lYX1BPX0lOVCkgfHwgKHJldCAmIE1TSVhfUElfSU5UKSkKKwkJbGlxdWlkaW9fc2NoZWR1bGVfbXNpeF9kcm9xX3BrdF9oYW5kbGVyKGRyb3EsIHJldCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIC8qKgogICogXGJyaWVmIEludGVycnVwdCBoYW5kbGVyIGZvciBvY3Rlb24KICAqIEBwYXJhbSBpcnEgdW51c2VkCiAgKiBAcGFyYW0gZGV2IG9jdGVvbiBkZXZpY2UKICAqLwogc3RhdGljCi1pcnFyZXR1cm5fdCBsaXF1aWRpb19pbnRyX2hhbmRsZXIoaW50IGlycSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwgdm9pZCAqZGV2KQoraXJxcmV0dXJuX3QgbGlxdWlkaW9fbGVnYWN5X2ludHJfaGFuZGxlcihpbnQgaXJxIF9fYXR0cmlidXRlX18oKHVudXNlZCkpLAorCQkJCQkgdm9pZCAqZGV2KQogewogCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSAoc3RydWN0IG9jdGVvbl9kZXZpY2UgKilkZXY7CiAJaXJxcmV0dXJuX3QgcmV0OwogCiAJLyogRGlzYWJsZSBvdXIgaW50ZXJydXB0cyBmb3IgdGhlIGR1cmF0aW9uIG9mIElTUiAqLwotCW9jdC0+Zm5fbGlzdC5kaXNhYmxlX2ludGVycnVwdChvY3QtPmNoaXApOworCW9jdC0+Zm5fbGlzdC5kaXNhYmxlX2ludGVycnVwdChvY3QsIE9DVEVPTl9BTExfSU5UUik7CiAKIAlyZXQgPSBvY3QtPmZuX2xpc3QucHJvY2Vzc19pbnRlcnJ1cHRfcmVncyhvY3QpOwogCkBAIC0xMDUzLDcgKzEwNjQsNyBAQAogCiAJLyogUmUtZW5hYmxlIG91ciBpbnRlcnJ1cHRzICAqLwogCWlmICghKGF0b21pY19yZWFkKCZvY3QtPnN0YXR1cykgPT0gT0NUX0RFVl9JTl9SRVNFVCkpCi0JCW9jdC0+Zm5fbGlzdC5lbmFibGVfaW50ZXJydXB0KG9jdC0+Y2hpcCk7CisJCW9jdC0+Zm5fbGlzdC5lbmFibGVfaW50ZXJydXB0KG9jdCwgT0NURU9OX0FMTF9JTlRSKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMDY3LDIyICsxMDc4LDIwNCBAQAogc3RhdGljIGludCBvY3Rlb25fc2V0dXBfaW50ZXJydXB0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCiB7CiAJaW50IGlycXJldCwgZXJyOworCXN0cnVjdCBtc2l4X2VudHJ5ICptc2l4X2VudHJpZXM7CisJaW50IGk7CisJaW50IG51bV9pb3FfdmVjdG9yczsKKwlpbnQgbnVtX2FsbG9jX2lvcV92ZWN0b3JzOwogCi0JZXJyID0gcGNpX2VuYWJsZV9tc2kob2N0LT5wY2lfZGV2KTsKLQlpZiAoZXJyKQotCQlkZXZfd2Fybigmb2N0LT5wY2lfZGV2LT5kZXYsICJSZXZlcnRpbmcgdG8gbGVnYWN5IGludGVycnVwdHMuIEVycm9yOiAlZFxuIiwKLQkJCSBlcnIpOwotCWVsc2UKLQkJb2N0LT5mbGFncyB8PSBMSU9fRkxBR19NU0lfRU5BQkxFRDsKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpICYmIG9jdC0+bXNpeF9vbikgeworCQlvY3QtPm51bV9tc2l4X2lycXMgPSBvY3QtPnNyaW92X2luZm8ubnVtX3BmX3JpbmdzOworCQkvKiBvbmUgbm9uIGlvcSBpbnRlcnJ1cHQgZm9yIGhhbmRsaW5nIHNsaV9tYWNfcGZfaW50X3N1bSAqLworCQlvY3QtPm51bV9tc2l4X2lycXMgKz0gMTsKIAotCWlycXJldCA9IHJlcXVlc3RfaXJxKG9jdC0+cGNpX2Rldi0+aXJxLCBsaXF1aWRpb19pbnRyX2hhbmRsZXIsCi0JCQkgICAgIElSUUZfU0hBUkVELCAib2N0ZW9uIiwgb2N0KTsKLQlpZiAoaXJxcmV0KSB7Ci0JCWlmIChvY3QtPmZsYWdzICYgTElPX0ZMQUdfTVNJX0VOQUJMRUQpCi0JCQlwY2lfZGlzYWJsZV9tc2kob2N0LT5wY2lfZGV2KTsKLQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJSZXF1ZXN0IElSUSBmYWlsZWQgd2l0aCBjb2RlOiAlZFxuIiwKLQkJCWlycXJldCk7Ci0JCXJldHVybiAxOworCQlvY3QtPm1zaXhfZW50cmllcyA9IGtjYWxsb2MoCisJCSAgICBvY3QtPm51bV9tc2l4X2lycXMsIHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSksIEdGUF9LRVJORUwpOworCQlpZiAoIW9jdC0+bXNpeF9lbnRyaWVzKQorCQkJcmV0dXJuIDE7CisKKwkJbXNpeF9lbnRyaWVzID0gKHN0cnVjdCBtc2l4X2VudHJ5ICopb2N0LT5tc2l4X2VudHJpZXM7CisJCS8qQXNzdW1wdGlvbiBpcyB0aGF0IHBmIG1zaXggdmVjdG9ycyBzdGFydCBmcm9tIHBmIHNybiB0byBwZiB0bworCQkgKiB0cnMgYW5kIG5vdCBmcm9tIDAuIGlmIG5vdCBjaGFuZ2UgdGhpcyBjb2RlCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgb2N0LT5udW1fbXNpeF9pcnFzIC0gMTsgaSsrKQorCQkJbXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gb2N0LT5zcmlvdl9pbmZvLnBmX3NybiArIGk7CisJCW1zaXhfZW50cmllc1tvY3QtPm51bV9tc2l4X2lycXMgLSAxXS5lbnRyeSA9CisJCSAgICBvY3QtPnNyaW92X2luZm8udHJzOworCQludW1fYWxsb2NfaW9xX3ZlY3RvcnMgPSBwY2lfZW5hYmxlX21zaXhfcmFuZ2UoCisJCQkJCQlvY3QtPnBjaV9kZXYsIG1zaXhfZW50cmllcywKKwkJCQkJCW9jdC0+bnVtX21zaXhfaXJxcywKKwkJCQkJCW9jdC0+bnVtX21zaXhfaXJxcyk7CisJCWlmIChudW1fYWxsb2NfaW9xX3ZlY3RvcnMgPCAwKSB7CisJCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgInVuYWJsZSB0byBBbGxvY2F0ZSBNU0ktWCBpbnRlcnJ1cHRzXG4iKTsKKwkJCWtmcmVlKG9jdC0+bXNpeF9lbnRyaWVzKTsKKwkJCW9jdC0+bXNpeF9lbnRyaWVzID0gTlVMTDsKKwkJCXJldHVybiAxOworCQl9CisJCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiT0NURU9OOiBFbm91Z2ggTVNJLVggaW50ZXJydXB0cyBhcmUgYWxsb2NhdGVkLi4uXG4iKTsKKworCQludW1faW9xX3ZlY3RvcnMgPSBvY3QtPm51bV9tc2l4X2lycXM7CisKKwkJLyoqIEZvciBQRiwgdGhlcmUgaXMgb25lIG5vbi1pb3EgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJbnVtX2lvcV92ZWN0b3JzIC09IDE7CisJCWlycXJldCA9IHJlcXVlc3RfaXJxKG1zaXhfZW50cmllc1tudW1faW9xX3ZlY3RvcnNdLnZlY3RvciwKKwkJCQkgICAgIGxpcXVpZGlvX2xlZ2FjeV9pbnRyX2hhbmRsZXIsIDAsICJvY3Rlb24iLAorCQkJCSAgICAgb2N0KTsKKwkJaWYgKGlycXJldCkgeworCQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsCisJCQkJIk9DVEVPTjogUmVxdWVzdF9pcnEgZmFpbGVkIGZvciBNU0lYIGludGVycnVwdCBFcnJvcjogJWRcbiIsCisJCQkJaXJxcmV0KTsKKwkJCXBjaV9kaXNhYmxlX21zaXgob2N0LT5wY2lfZGV2KTsKKwkJCWtmcmVlKG9jdC0+bXNpeF9lbnRyaWVzKTsKKwkJCW9jdC0+bXNpeF9lbnRyaWVzID0gTlVMTDsKKwkJCXJldHVybiAxOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IG51bV9pb3FfdmVjdG9yczsgaSsrKSB7CisJCQlpcnFyZXQgPSByZXF1ZXN0X2lycShtc2l4X2VudHJpZXNbaV0udmVjdG9yLAorCQkJCQkgICAgIGxpcXVpZGlvX21zaXhfaW50cl9oYW5kbGVyLCAwLAorCQkJCQkgICAgICJvY3Rlb24iLCAmb2N0LT5pb3FfdmVjdG9yW2ldKTsKKwkJCWlmIChpcnFyZXQpIHsKKwkJCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwKKwkJCQkJIk9DVEVPTjogUmVxdWVzdF9pcnEgZmFpbGVkIGZvciBNU0lYIGludGVycnVwdCBFcnJvcjogJWRcbiIsCisJCQkJCWlycXJldCk7CisJCQkJLyoqIEZyZWVpbmcgdGhlIG5vbi1pb3EgaXJxIHZlY3RvciBoZXJlIC4gKi8KKwkJCQlmcmVlX2lycShtc2l4X2VudHJpZXNbbnVtX2lvcV92ZWN0b3JzXS52ZWN0b3IsCisJCQkJCSBvY3QpOworCisJCQkJd2hpbGUgKGkpIHsKKwkJCQkJaS0tOworCQkJCQkvKiogY2xlYXJpbmcgYWZmaW5pdHkgbWFzay4gKi8KKwkJCQkJaXJxX3NldF9hZmZpbml0eV9oaW50KAorCQkJCQkJbXNpeF9lbnRyaWVzW2ldLnZlY3RvciwgTlVMTCk7CisJCQkJCWZyZWVfaXJxKG1zaXhfZW50cmllc1tpXS52ZWN0b3IsCisJCQkJCQkgJm9jdC0+aW9xX3ZlY3RvcltpXSk7CisJCQkJfQorCQkJCXBjaV9kaXNhYmxlX21zaXgob2N0LT5wY2lfZGV2KTsKKwkJCQlrZnJlZShvY3QtPm1zaXhfZW50cmllcyk7CisJCQkJb2N0LT5tc2l4X2VudHJpZXMgPSBOVUxMOworCQkJCXJldHVybiAxOworCQkJfQorCQkJb2N0LT5pb3FfdmVjdG9yW2ldLnZlY3RvciA9IG1zaXhfZW50cmllc1tpXS52ZWN0b3I7CisJCQkvKiBhc3NpZ24gdGhlIGNwdSBtYXNrIGZvciB0aGlzIG1zaXggaW50ZXJydXB0IHZlY3RvciAqLworCQkJaXJxX3NldF9hZmZpbml0eV9oaW50KAorCQkJCQltc2l4X2VudHJpZXNbaV0udmVjdG9yLAorCQkJCQkoJm9jdC0+aW9xX3ZlY3RvcltpXS5hZmZpbml0eV9tYXNrKSk7CisJCX0KKwkJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJPQ1RFT05bJWRdOiBNU0ktWCBlbmFibGVkXG4iLAorCQkJb2N0LT5vY3Rlb25faWQpOworCX0gZWxzZSB7CisJCWVyciA9IHBjaV9lbmFibGVfbXNpKG9jdC0+cGNpX2Rldik7CisJCWlmIChlcnIpCisJCQlkZXZfd2Fybigmb2N0LT5wY2lfZGV2LT5kZXYsICJSZXZlcnRpbmcgdG8gbGVnYWN5IGludGVycnVwdHMuIEVycm9yOiAlZFxuIiwKKwkJCQkgZXJyKTsKKwkJZWxzZQorCQkJb2N0LT5mbGFncyB8PSBMSU9fRkxBR19NU0lfRU5BQkxFRDsKKworCQlpcnFyZXQgPSByZXF1ZXN0X2lycShvY3QtPnBjaV9kZXYtPmlycSwKKwkJCQkgICAgIGxpcXVpZGlvX2xlZ2FjeV9pbnRyX2hhbmRsZXIsIElSUUZfU0hBUkVELAorCQkJCSAgICAgIm9jdGVvbiIsIG9jdCk7CisJCWlmIChpcnFyZXQpIHsKKwkJCWlmIChvY3QtPmZsYWdzICYgTElPX0ZMQUdfTVNJX0VOQUJMRUQpCisJCQkJcGNpX2Rpc2FibGVfbXNpKG9jdC0+cGNpX2Rldik7CisJCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlJlcXVlc3QgSVJRIGZhaWxlZCB3aXRoIGNvZGU6ICVkXG4iLAorCQkJCWlycXJldCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsaXF1aWRpb193YXRjaGRvZyh2b2lkICpwYXJhbSkKK3sKKwl1NjQgd2RvZzsKKwl1MTYgbWFza19vZl9zdHVja19jb3JlcyA9IDA7CisJdTE2IG1hc2tfb2ZfY3Jhc2hlZF9jb3JlcyA9IDA7CisJaW50IGNvcmVfbnVtOworCXU4IGNvcmVfaXNfc3R1Y2tbTElPX01BWF9DT1JFU107CisJdTggY29yZV9jcmFzaGVkW0xJT19NQVhfQ09SRVNdOworCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBwYXJhbTsKKworCW1lbXNldChjb3JlX2lzX3N0dWNrLCAwLCBzaXplb2YoY29yZV9pc19zdHVjaykpOworCW1lbXNldChjb3JlX2NyYXNoZWQsIDAsIHNpemVvZihjb3JlX2NyYXNoZWQpKTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCW1hc2tfb2ZfY3Jhc2hlZF9jb3JlcyA9CisJCSAgICAodTE2KW9jdGVvbl9yZWFkX2NzcjY0KG9jdCwgQ04yM1hYX1NMSV9TQ1JBVENIMik7CisKKwkJZm9yIChjb3JlX251bSA9IDA7IGNvcmVfbnVtIDwgTElPX01BWF9DT1JFUzsgY29yZV9udW0rKykgeworCQkJaWYgKCFjb3JlX2lzX3N0dWNrW2NvcmVfbnVtXSkgeworCQkJCXdkb2cgPSBsaW9fcGNpX3JlYWRxKG9jdCwgQ0lVM19XRE9HKGNvcmVfbnVtKSk7CisKKwkJCQkvKiBsb29rIGF0IHdhdGNoZG9nIHN0YXRlIGZpZWxkICovCisJCQkJd2RvZyAmPSBDSVUzX1dET0dfTUFTSzsKKwkJCQlpZiAod2RvZykgeworCQkJCQkvKiB0aGlzIHdhdGNoZG9nIHRpbWVyIGhhcyBleHBpcmVkICovCisJCQkJCWNvcmVfaXNfc3R1Y2tbY29yZV9udW1dID0KKwkJCQkJCUxJT19NT05JVE9SX1dET0dfRVhQSVJFOworCQkJCQltYXNrX29mX3N0dWNrX2NvcmVzIHw9ICgxIDw8IGNvcmVfbnVtKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICghY29yZV9jcmFzaGVkW2NvcmVfbnVtXSkKKwkJCQljb3JlX2NyYXNoZWRbY29yZV9udW1dID0KKwkJCQkgICAgKG1hc2tfb2ZfY3Jhc2hlZF9jb3JlcyA+PiBjb3JlX251bSkgJiAxOworCQl9CisKKwkJaWYgKG1hc2tfb2Zfc3R1Y2tfY29yZXMpIHsKKwkJCWZvciAoY29yZV9udW0gPSAwOyBjb3JlX251bSA8IExJT19NQVhfQ09SRVM7CisJCQkgICAgIGNvcmVfbnVtKyspIHsKKwkJCQlpZiAoY29yZV9pc19zdHVja1tjb3JlX251bV0gPT0gMSkgeworCQkJCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwKKwkJCQkJCSJFUlJPUjogT2N0ZW9uIGNvcmUgJWQgaXMgc3R1Y2shXG4iLAorCQkJCQkJY29yZV9udW0pOworCQkJCQkvKiAyIG1lYW5zIHdlIGhhdmUgcHJpbnRrJ2QgIGFuIGVycm9yCisJCQkJCSAqIHNvIG5vIG5lZWQgdG8gcmVwZWF0IHRoZSBzYW1lIHByaW50aworCQkJCQkgKi8KKwkJCQkJY29yZV9pc19zdHVja1tjb3JlX251bV0gPQorCQkJCQkJTElPX01PTklUT1JfQ09SRV9TVFVDS19NU0dEOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChtYXNrX29mX2NyYXNoZWRfY29yZXMpIHsKKwkJCWZvciAoY29yZV9udW0gPSAwOyBjb3JlX251bSA8IExJT19NQVhfQ09SRVM7CisJCQkgICAgIGNvcmVfbnVtKyspIHsKKwkJCQlpZiAoY29yZV9jcmFzaGVkW2NvcmVfbnVtXSA9PSAxKSB7CisJCQkJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LAorCQkJCQkJIkVSUk9SOiBPY3Rlb24gY29yZSAlZCBjcmFzaGVkISAgU2VlIG9jdC1md2R1bXAgZm9yIGRldGFpbHMuXG4iLAorCQkJCQkJY29yZV9udW0pOworCQkJCQkvKiAyIG1lYW5zIHdlIGhhdmUgcHJpbnRrJ2QgIGFuIGVycm9yCisJCQkJCSAqIHNvIG5vIG5lZWQgdG8gcmVwZWF0IHRoZSBzYW1lIHByaW50aworCQkJCQkgKi8KKwkJCQkJY29yZV9jcmFzaGVkW2NvcmVfbnVtXSA9CisJCQkJCQlMSU9fTU9OSVRPUl9DT1JFX1NUVUNLX01TR0Q7CisJCQkJfQorCQkJfQorCQl9CisjaWZkZWYgQ09ORklHX01PRFVMRV9VTkxPQUQKKwkJaWYgKG1hc2tfb2Zfc3R1Y2tfY29yZXMgfHwgbWFza19vZl9jcmFzaGVkX2NvcmVzKSB7CisJCQkvKiBtYWtlIG1vZHVsZSByZWZjb3VudD0wIHNvIHRoYXQgcm1tb2Qgd2lsbCB3b3JrICovCisJCQlsb25nIHJlZmNvdW50OworCisJCQlyZWZjb3VudCA9IG1vZHVsZV9yZWZjb3VudChUSElTX01PRFVMRSk7CisKKwkJCXdoaWxlIChyZWZjb3VudCA+IDApIHsKKwkJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwkJCQlyZWZjb3VudCA9IG1vZHVsZV9yZWZjb3VudChUSElTX01PRFVMRSk7CisJCQl9CisKKwkJCS8qIGNvbXBlbnNhdGUgZm9yIGFuZCB3aXRoc3RhbmQgYW4gdW5saWtlbHkgKGJ1dCBzdGlsbAorCQkJICogcG9zc2libGUpIHJhY2UgY29uZGl0aW9uCisJCQkgKi8KKwkJCXdoaWxlIChyZWZjb3VudCA8IDApIHsKKwkJCQl0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJCQkJcmVmY291bnQgPSBtb2R1bGVfcmVmY291bnQoVEhJU19NT0RVTEUpOworCQkJfQorCQl9CisjZW5kaWYKKwkJLyogc2xlZXAgZm9yIHR3byBzZWNvbmRzICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMiAqIEhaKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTExMDcsNiArMTMwMCw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWlmIChwZGV2LT5kZXZpY2UgPT0gT0NURU9OX0NOMjNYWF9QRl9WSUQpCisJCW9jdF9kZXYtPm1zaXhfb24gPSBMSU9fRkxBR19NU0lYX0VOQUJMRUQ7CisKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiSW5pdGlhbGl6aW5nIGRldmljZSAleDoleC5cbiIsCiAJCSAodTMyKXBkZXYtPnZlbmRvciwgKHUzMilwZGV2LT5kZXZpY2UpOwogCkBAIC0xMTMwLDYgKzEzMjYsMzAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0X2RldikpIHsKKwkJdTY0IHNjcmF0Y2gxOworCQl1OCBidXMsIGRldmljZSwgZnVuY3Rpb247CisKKwkJc2NyYXRjaDEgPSBvY3Rlb25fcmVhZF9jc3I2NChvY3RfZGV2LCBDTjIzWFhfU0xJX1NDUkFUQ0gxKTsKKwkJaWYgKCEoc2NyYXRjaDEgJiA0VUxMKSkgeworCQkJLyogQml0IDIgb2YgU0xJX1NDUkFUQ0hfMSBpcyBhIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdAorCQkJICogdGhlIGxpbyB3YXRjaGRvZyBrZXJuZWwgdGhyZWFkIGlzIHJ1bm5pbmcgZm9yIHRoaXMKKwkJCSAqIE5JQy4gIEVhY2ggTklDIGdldHMgb25lIHdhdGNoZG9nIGtlcm5lbCB0aHJlYWQuCisJCQkgKi8KKwkJCXNjcmF0Y2gxIHw9IDRVTEw7CisJCQlvY3Rlb25fd3JpdGVfY3NyNjQob2N0X2RldiwgQ04yM1hYX1NMSV9TQ1JBVENIMSwKKwkJCQkJICAgc2NyYXRjaDEpOworCisJCQlidXMgPSBwZGV2LT5idXMtPm51bWJlcjsKKwkJCWRldmljZSA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKKwkJCWZ1bmN0aW9uID0gUENJX0ZVTkMocGRldi0+ZGV2Zm4pOworCQkJb2N0X2Rldi0+d2F0Y2hkb2dfdGFzayA9IGt0aHJlYWRfY3JlYXRlKAorCQkJICAgIGxpcXVpZGlvX3dhdGNoZG9nLCBvY3RfZGV2LAorCQkJICAgICJsaW93ZC8lMDJoaHg6JTAyaGh4LiVoaHgiLCBidXMsIGRldmljZSwgZnVuY3Rpb24pOworCQkJd2FrZV91cF9wcm9jZXNzKG9jdF9kZXYtPndhdGNoZG9nX3Rhc2spOworCQl9CisJfQorCiAJb2N0X2Rldi0+cnhfcGF1c2UgPSAxOwogCW9jdF9kZXYtPnR4X3BhdXNlID0gMTsKIApAQCAtMTE0Niw2ICsxMzY2LDcgQEAKIHN0YXRpYyB2b2lkIG9jdGVvbl9kZXN0cm95X3Jlc291cmNlcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQogewogCWludCBpOworCXN0cnVjdCBtc2l4X2VudHJ5ICptc2l4X2VudHJpZXM7CiAJc3RydWN0IG9jdGVvbl9kZXZpY2VfcHJpdiAqb2N0X3ByaXYgPQogCQkoc3RydWN0IG9jdGVvbl9kZXZpY2VfcHJpdiAqKW9jdC0+cHJpdjsKIApAQCAtMTE5MCwyMSArMTQxMSw0MCBAQAogCQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJPUSBoYWQgcGVuZGluZyBwYWNrZXRzXG4iKTsKIAogCQkvKiBEaXNhYmxlIGludGVycnVwdHMgICovCi0JCW9jdC0+Zm5fbGlzdC5kaXNhYmxlX2ludGVycnVwdChvY3QtPmNoaXApOworCQlvY3QtPmZuX2xpc3QuZGlzYWJsZV9pbnRlcnJ1cHQob2N0LCBPQ1RFT05fQUxMX0lOVFIpOwogCi0JCS8qIFJlbGVhc2UgdGhlIGludGVycnVwdCBsaW5lICovCi0JCWZyZWVfaXJxKG9jdC0+cGNpX2Rldi0+aXJxLCBvY3QpOworCQlpZiAob2N0LT5tc2l4X29uKSB7CisJCQltc2l4X2VudHJpZXMgPSAoc3RydWN0IG1zaXhfZW50cnkgKilvY3QtPm1zaXhfZW50cmllczsKKwkJCWZvciAoaSA9IDA7IGkgPCBvY3QtPm51bV9tc2l4X2lycXMgLSAxOyBpKyspIHsKKwkJCQkvKiBjbGVhciB0aGUgYWZmaW5pdHlfY3B1bWFzayAqLworCQkJCWlycV9zZXRfYWZmaW5pdHlfaGludChtc2l4X2VudHJpZXNbaV0udmVjdG9yLAorCQkJCQkJICAgICAgTlVMTCk7CisJCQkJZnJlZV9pcnEobXNpeF9lbnRyaWVzW2ldLnZlY3RvciwKKwkJCQkJICZvY3QtPmlvcV92ZWN0b3JbaV0pOworCQkJfQorCQkJLyogbm9uLWlvdiB2ZWN0b3IncyBhcmd1bWVudCBpcyBvY3Qgc3RydWN0ICovCisJCQlmcmVlX2lycShtc2l4X2VudHJpZXNbaV0udmVjdG9yLCBvY3QpOwogCi0JCWlmIChvY3QtPmZsYWdzICYgTElPX0ZMQUdfTVNJX0VOQUJMRUQpCi0JCQlwY2lfZGlzYWJsZV9tc2kob2N0LT5wY2lfZGV2KTsKKwkJCXBjaV9kaXNhYmxlX21zaXgob2N0LT5wY2lfZGV2KTsKKwkJCWtmcmVlKG9jdC0+bXNpeF9lbnRyaWVzKTsKKwkJCW9jdC0+bXNpeF9lbnRyaWVzID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qIFJlbGVhc2UgdGhlIGludGVycnVwdCBsaW5lICovCisJCQlmcmVlX2lycShvY3QtPnBjaV9kZXYtPmlycSwgb2N0KTsKIAotCQkvKiBmYWxsdGhyb3VnaCAqLworCQkJaWYgKG9jdC0+ZmxhZ3MgJiBMSU9fRkxBR19NU0lfRU5BQkxFRCkKKwkJCQlwY2lfZGlzYWJsZV9tc2kob2N0LT5wY2lfZGV2KTsKKwkJfQorCisJCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCQlvY3Rlb25fZnJlZV9pb3FfdmVjdG9yKG9jdCk7CisJLyogZmFsbHRocm91Z2ggKi8KIAljYXNlIE9DVF9ERVZfSU5fUkVTRVQ6CiAJY2FzZSBPQ1RfREVWX0RST1FfSU5JVF9ET05FOgogCQkvKmF0b21pY19zZXQoJm9jdC0+c3RhdHVzLCBPQ1RfREVWX0RST1FfSU5JVF9ET05FKTsqLwogCQltZGVsYXkoMTAwKTsKIAkJZm9yIChpID0gMDsgaSA8IE1BWF9PQ1RFT05fT1VUUFVUX1FVRVVFUyhvY3QpOyBpKyspIHsKLQkJCWlmICghKG9jdC0+aW9fcW1hc2sub3EgJiAoMVVMTCA8PCBpKSkpCisJCQlpZiAoIShvY3QtPmlvX3FtYXNrLm9xICYgQklUX1VMTChpKSkpCiAJCQkJY29udGludWU7CiAJCQlvY3Rlb25fZGVsZXRlX2Ryb3Eob2N0LCBpKTsKIAkJfQpAQCAtMTIyNiwxNiArMTQ2NiwxNSBAQAogCQlvY3Rlb25fZGVsZXRlX3Jlc3BvbnNlX2xpc3Qob2N0KTsKIAogCQkvKiBmYWxsdGhyb3VnaCAqLwotCWNhc2UgT0NUX0RFVl9TQ19CVUZGX1BPT0xfSU5JVF9ET05FOgotCQlvY3Rlb25fZnJlZV9zY19idWZmZXJfcG9vbChvY3QpOwotCi0JCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBPQ1RfREVWX0lOU1RSX1FVRVVFX0lOSVRfRE9ORToKIAkJZm9yIChpID0gMDsgaSA8IE1BWF9PQ1RFT05fSU5TVFJfUVVFVUVTKG9jdCk7IGkrKykgewotCQkJaWYgKCEob2N0LT5pb19xbWFzay5pcSAmICgxVUxMIDw8IGkpKSkKKwkJCWlmICghKG9jdC0+aW9fcW1hc2suaXEgJiBCSVRfVUxMKGkpKSkKIAkJCQljb250aW51ZTsKIAkJCW9jdGVvbl9kZWxldGVfaW5zdHJfcXVldWUob2N0LCBpKTsKIAkJfQorCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgT0NUX0RFVl9TQ19CVUZGX1BPT0xfSU5JVF9ET05FOgorCQlvY3Rlb25fZnJlZV9zY19idWZmZXJfcG9vbChvY3QpOwogCiAJCS8qIGZhbGx0aHJvdWdoICovCiAJY2FzZSBPQ1RfREVWX0RJU1BBVENIX0lOSVRfRE9ORToKQEAgLTEyNDQsOSArMTQ4Myw5IEBACiAKIAkJLyogZmFsbHRocm91Z2ggKi8KIAljYXNlIE9DVF9ERVZfUENJX01BUF9ET05FOgotCiAJCS8qIFNvZnQgcmVzZXQgdGhlIG9jdGVvbiBkZXZpY2UgYmVmb3JlIGV4aXRpbmcgKi8KLQkJb2N0LT5mbl9saXN0LnNvZnRfcmVzZXQob2N0KTsKKwkJaWYgKCghT0NURU9OX0NOMjNYWF9QRihvY3QpKSB8fCAhb2N0LT5vY3Rlb25faWQpCisJCQlvY3QtPmZuX2xpc3Quc29mdF9yZXNldChvY3QpOwogCiAJCW9jdGVvbl91bm1hcF9wY2lfYmFyeChvY3QsIDApOwogCQlvY3Rlb25fdW5tYXBfcGNpX2Jhcngob2N0LCAxKTsKQEAgLTEyNjQsMjMgKzE1MDMsODkgQEAKIH0KIAogLyoqCisgKiBcYnJpZWYgQ2FsbGJhY2sgZm9yIHJ4IGN0cmwKKyAqIEBwYXJhbSBzdGF0dXMgc3RhdHVzIG9mIHJlcXVlc3QKKyAqIEBwYXJhbSBidWYgcG9pbnRlciB0byByZXNwIHN0cnVjdHVyZQorICovCitzdGF0aWMgdm9pZCByeF9jdGxfY2FsbGJhY2soc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwKKwkJCSAgICB1MzIgc3RhdHVzLAorCQkJICAgIHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2MgPSAoc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKilidWY7CisJc3RydWN0IGxpcXVpZGlvX3J4X2N0bF9jb250ZXh0ICpjdHg7CisKKwljdHggID0gKHN0cnVjdCBsaXF1aWRpb19yeF9jdGxfY29udGV4dCAqKXNjLT5jdHhwdHI7CisKKwlvY3QgPSBsaW9fZ2V0X2RldmljZShjdHgtPm9jdGVvbl9pZCk7CisJaWYgKHN0YXR1cykKKwkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJyeCBjdGwgaW5zdHJ1Y3Rpb24gZmFpbGVkLiBTdGF0dXM6ICVsbHhcbiIsCisJCQlDVk1fQ0FTVDY0KHN0YXR1cykpOworCVdSSVRFX09OQ0UoY3R4LT5jb25kLCAxKTsKKworCS8qIFRoaXMgYmFycmllciBpcyByZXF1aXJlZCB0byBiZSBzdXJlIHRoYXQgdGhlIHJlc3BvbnNlIGhhcyBiZWVuCisJICogd3JpdHRlbiBmdWxseSBiZWZvcmUgd2FraW5nIHVwIHRoZSBoYW5kbGVyCisJICovCisJd21iKCk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmN0eC0+d2MpOworfQorCisvKioKICAqIFxicmllZiBTZW5kIFJ4IGNvbnRyb2wgY29tbWFuZAogICogQHBhcmFtIGxpbyBwZXItbmV0d29yayBwcml2YXRlIGRhdGEKICAqIEBwYXJhbSBzdGFydF9zdG9wIHdoZXRoZXIgdG8gc3RhcnQgb3Igc3RvcAogICovCiBzdGF0aWMgdm9pZCBzZW5kX3J4X2N0cmxfY21kKHN0cnVjdCBsaW8gKmxpbywgaW50IHN0YXJ0X3N0b3ApCiB7Ci0Jc3RydWN0IG9jdG5pY19jdHJsX3BrdCBuY3RybDsKKwlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2M7CisJc3RydWN0IGxpcXVpZGlvX3J4X2N0bF9jb250ZXh0ICpjdHg7CisJdW5pb24gb2N0bmV0X2NtZCAqbmNtZDsKKwlpbnQgY3R4X3NpemUgPSBzaXplb2Yoc3RydWN0IGxpcXVpZGlvX3J4X2N0bF9jb250ZXh0KTsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gKHN0cnVjdCBvY3Rlb25fZGV2aWNlICopbGlvLT5vY3RfZGV2OworCWludCByZXR2YWw7CiAKLQltZW1zZXQoJm5jdHJsLCAwLCBzaXplb2Yoc3RydWN0IG9jdG5pY19jdHJsX3BrdCkpOworCWlmIChvY3QtPnByb3BzW2xpby0+aWZpZHhdLnJ4X29uID09IHN0YXJ0X3N0b3ApCisJCXJldHVybjsKIAotCW5jdHJsLm5jbWQucy5jbWQgPSBPQ1RORVRfQ01EX1JYX0NUTDsKLQluY3RybC5uY21kLnMucGFyYW0xID0gc3RhcnRfc3RvcDsKLQluY3RybC5pcV9ubyA9IGxpby0+bGluZm8udHhwY2lxWzBdLnMucV9ubzsKLQluY3RybC5uZXRwbmRldiA9ICh1NjQpbGlvLT5uZXRkZXY7CisJc2MgPSAoc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKikKKwkJb2N0ZW9uX2FsbG9jX3NvZnRfY29tbWFuZChvY3QsIE9DVE5FVF9DTURfU0laRSwKKwkJCQkJICAxNiwgY3R4X3NpemUpOwogCi0JaWYgKG9jdG5ldF9zZW5kX25pY19jdHJsX3BrdChsaW8tPm9jdF9kZXYsICZuY3RybCkgPCAwKQorCW5jbWQgPSAodW5pb24gb2N0bmV0X2NtZCAqKXNjLT52aXJ0ZHB0cjsKKwljdHggID0gKHN0cnVjdCBsaXF1aWRpb19yeF9jdGxfY29udGV4dCAqKXNjLT5jdHhwdHI7CisKKwlXUklURV9PTkNFKGN0eC0+Y29uZCwgMCk7CisJY3R4LT5vY3Rlb25faWQgPSBsaW9fZ2V0X2RldmljZV9pZChvY3QpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+d2MpOworCisJbmNtZC0+dTY0ID0gMDsKKwluY21kLT5zLmNtZCA9IE9DVE5FVF9DTURfUlhfQ1RMOworCW5jbWQtPnMucGFyYW0xID0gc3RhcnRfc3RvcDsKKworCW9jdGVvbl9zd2FwXzhCX2RhdGEoKHU2NCAqKW5jbWQsIChPQ1RORVRfQ01EX1NJWkUgPj4gMykpOworCisJc2MtPmlxX25vID0gbGlvLT5saW5mby50eHBjaXFbMF0ucy5xX25vOworCisJb2N0ZW9uX3ByZXBhcmVfc29mdF9jb21tYW5kKG9jdCwgc2MsIE9QQ09ERV9OSUMsCisJCQkJICAgIE9QQ09ERV9OSUNfQ01ELCAwLCAwLCAwKTsKKworCXNjLT5jYWxsYmFjayA9IHJ4X2N0bF9jYWxsYmFjazsKKwlzYy0+Y2FsbGJhY2tfYXJnID0gc2M7CisJc2MtPndhaXRfdGltZSA9IDUwMDA7CisKKwlyZXR2YWwgPSBvY3Rlb25fc2VuZF9zb2Z0X2NvbW1hbmQob2N0LCBzYyk7CisJaWYgKHJldHZhbCA9PSBJUV9TRU5EX0ZBSUxFRCkgewogCQluZXRpZl9pbmZvKGxpbywgcnhfZXJyLCBsaW8tPm5ldGRldiwgIkZhaWxlZCB0byBzZW5kIFJYIENvbnRyb2wgbWVzc2FnZVxuIik7CisJfSBlbHNlIHsKKwkJLyogU2xlZXAgb24gYSB3YWl0IHF1ZXVlIHRpbGwgdGhlIGNvbmQgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUKKwkJICogcmVzcG9uc2UgYXJyaXZlZCBvciB0aW1lZC1vdXQuCisJCSAqLworCQlpZiAoc2xlZXBfY29uZCgmY3R4LT53YywgJmN0eC0+Y29uZCkgPT0gLUVJTlRSKQorCQkJcmV0dXJuOworCQlvY3QtPnByb3BzW2xpby0+aWZpZHhdLnJ4X29uID0gc3RhcnRfc3RvcDsKKwl9CisKKwlvY3Rlb25fZnJlZV9zb2Z0X2NvbW1hbmQob2N0LCBzYyk7CiB9CiAKIC8qKgpAQCAtMTMwNywyMSArMTYxMiwyNCBAQAogCiAJZGV2X2RiZygmb2N0LT5wY2lfZGV2LT5kZXYsICJOSUMgZGV2aWNlIGNsZWFudXBcbiIpOwogCi0Jc2VuZF9yeF9jdHJsX2NtZChsaW8sIDApOwotCiAJaWYgKGF0b21pY19yZWFkKCZsaW8tPmlmc3RhdGUpICYgTElPX0lGU1RBVEVfUlVOTklORykKLQkJdHhxc19zdG9wKG5ldGRldik7CisJCWxpcXVpZGlvX3N0b3AobmV0ZGV2KTsKIAogCWlmIChvY3QtPnByb3BzW2xpby0+aWZpZHhdLm5hcGlfZW5hYmxlZCA9PSAxKSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuYXBpLCBuLCAmbmV0ZGV2LT5uYXBpX2xpc3QsIGRldl9saXN0KQogCQkJbmFwaV9kaXNhYmxlKG5hcGkpOwogCiAJCW9jdC0+cHJvcHNbbGlvLT5pZmlkeF0ubmFwaV9lbmFibGVkID0gMDsKKworCQlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQkJb2N0LT5kcm9xWzBdLT5vcHMucG9sbF9tb2RlID0gMDsKIAl9CiAKIAlpZiAoYXRvbWljX3JlYWQoJmxpby0+aWZzdGF0ZSkgJiBMSU9fSUZTVEFURV9SRUdJU1RFUkVEKQogCQl1bnJlZ2lzdGVyX25ldGRldihuZXRkZXYpOwogCisJY2xlYW51cF9saW5rX3N0YXR1c19jaGFuZ2Vfd3EobmV0ZGV2KTsKKwogCWRlbGV0ZV9nbGlzdHMobGlvKTsKIAogCWZyZWVfbmV0ZGV2KG5ldGRldik7CkBAIC0xMzc0LDYgKzE2ODIsOSBAQAogCiAJZGV2X2RiZygmb2N0X2Rldi0+cGNpX2Rldi0+ZGV2LCAiU3RvcHBpbmcgZGV2aWNlXG4iKTsKIAorCWlmIChvY3RfZGV2LT53YXRjaGRvZ190YXNrKQorCQlrdGhyZWFkX3N0b3Aob2N0X2Rldi0+d2F0Y2hkb2dfdGFzayk7CisKIAlpZiAob2N0X2Rldi0+YXBwX21vZGUgJiYgKG9jdF9kZXYtPmFwcF9tb2RlID09IENWTV9EUlZfTklDX0FQUCkpCiAJCWxpcXVpZGlvX3N0b3BfbmljX21vZHVsZShvY3RfZGV2KTsKIApAQCAtMTQxNyw2ICsxNzI4LDEyIEBACiAJCXMgPSAiQ042NlhYIjsKIAkJYnJlYWs7CiAKKwljYXNlIE9DVEVPTl9DTjIzWFhfUENJSURfUEY6CisJCW9jdC0+Y2hpcF9pZCA9IE9DVEVPTl9DTjIzWFhfUEZfVklEOworCQlyZXQgPSBzZXR1cF9jbjIzeHhfb2N0ZW9uX3BmX2RldmljZShvY3QpOworCQlzID0gIkNOMjNYWCI7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcyA9ICI/IjsKIAkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJVbmtub3duIGRldmljZSBmb3VuZCAoZGV2X2lkOiAleClcbiIsCkBAIC0xODY3LDcgKzIxODQsNyBAQAogCXN0cnVjdCBsaXF1aWRpb19pZl9jZmdfY29udGV4dCAqY3R4OwogCiAJcmVzcCA9IChzdHJ1Y3QgbGlxdWlkaW9faWZfY2ZnX3Jlc3AgKilzYy0+dmlydHJwdHI7Ci0JY3R4ICA9IChzdHJ1Y3QgbGlxdWlkaW9faWZfY2ZnX2NvbnRleHQgKilzYy0+Y3R4cHRyOworCWN0eCA9IChzdHJ1Y3QgbGlxdWlkaW9faWZfY2ZnX2NvbnRleHQgKilzYy0+Y3R4cHRyOwogCiAJb2N0ID0gbGlvX2dldF9kZXZpY2UoY3R4LT5vY3Rlb25faWQpOwogCWlmIChyZXNwLT5zdGF0dXMpCkBAIC0yMDYwLDExICsyMzc3LDE0IEBACiAgKi8KIHN0YXRpYyB2b2lkIGxpcXVpZGlvX25hcGlfZHJ2X2NhbGxiYWNrKHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0OwogCXN0cnVjdCBvY3Rlb25fZHJvcSAqZHJvcSA9IGFyZzsKIAlpbnQgdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAoZHJvcS0+Y3B1X2lkID09IHRoaXNfY3B1KSB7Ci0JCW5hcGlfc2NoZWR1bGUoJmRyb3EtPm5hcGkpOworCW9jdCA9IGRyb3EtPm9jdF9kZXY7CisKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpIHx8IGRyb3EtPmNwdV9pZCA9PSB0aGlzX2NwdSkgeworCQluYXBpX3NjaGVkdWxlX2lycW9mZigmZHJvcS0+bmFwaSk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgKmNzZCA9ICZkcm9xLT5jc2Q7CiAKQEAgLTIxNzMsMTcgKzI0OTMsMTUgQEAKIAkJCQkJCSAgIGxpby0+aWZpZHgpLCBOVUxMKTsKIAkJaWYgKHJldHZhbCkgewogCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LAotCQkJCSIgJXMgOiBSdW50aW1lIERST1EoUnhRKSBjcmVhdGlvbiBmYWlsZWQuXG4iLAorCQkJCSIlcyA6IFJ1bnRpbWUgRFJPUShSeFEpIGNyZWF0aW9uIGZhaWxlZC5cbiIsCiAJCQkJX19mdW5jX18pOwogCQkJcmV0dXJuIDE7CiAJCX0KIAogCQlkcm9xID0gb2N0ZW9uX2Rldi0+ZHJvcVtxX25vXTsKIAkJbmFwaSA9ICZkcm9xLT5uYXBpOwotCQlkZXZfZGJnKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsCi0JCQkibmV0aWZfbmFwaV9hZGQgbmV0ZGV2OiVsbHggb2N0OiVsbHhcbiIsCi0JCQkodTY0KW5ldGRldiwKLQkJCSh1NjQpb2N0ZW9uX2Rldik7CisJCWRldl9kYmcoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIm5ldGlmX25hcGlfYWRkIG5ldGRldjolbGx4IG9jdDolbGx4IHBmX251bTolZFxuIiwKKwkJCSh1NjQpbmV0ZGV2LCAodTY0KW9jdGVvbl9kZXYsIG9jdGVvbl9kZXYtPnBmX251bSk7CiAJCW5ldGlmX25hcGlfYWRkKG5ldGRldiwgbmFwaSwgbGlxdWlkaW9fbmFwaV9wb2xsLCA2NCk7CiAKIAkJLyogZGVzaWduYXRlIGEgQ1BVIGZvciB0aGlzIGRyb3EgKi8KQEAgLTIxOTUsNiArMjUxMywxNCBAQAogCQlvY3Rlb25fcmVnaXN0ZXJfZHJvcV9vcHMob2N0ZW9uX2RldiwgcV9ubywgJmRyb3Ffb3BzKTsKIAl9CiAKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3Rlb25fZGV2KSkgeworCQkvKiAyM1hYIFBGIGNhbiByZWNlaXZlIGNvbnRyb2wgbWVzc2FnZXMgKHZpYSB0aGUgZmlyc3QgUEYtb3duZWQKKwkJICogZHJvcSkgZnJvbSB0aGUgZmlybXdhcmUgZXZlbiBpZiB0aGUgZXRoWCBpbnRlcmZhY2UgaXMgZG93biwKKwkJICogc28gdGhhdCdzIHdoeSBwb2xsX21vZGUgbXVzdCBiZSBvZmYgZm9yIHRoZSBmaXJzdCBkcm9xLgorCQkgKi8KKwkJb2N0ZW9uX2Rldi0+ZHJvcVswXS0+b3BzLnBvbGxfbW9kZSA9IDA7CisJfQorCiAJLyogc2V0IHVwIElRcy4gKi8KIAlmb3IgKHEgPSAwOyBxIDwgbGlvLT5saW5mby5udW1fdHhwY2lxOyBxKyspIHsKIAkJbnVtX3R4X2Rlc2NzID0gQ0ZHX0dFVF9OVU1fVFhfREVTQ1NfTklDX0lGKG9jdGVvbl9nZXRfY29uZgpAQCAtMjIzNSw3ICsyNTYxLDcgQEAKICAqIFxicmllZiBTZXRzIHVwIHRoZSB0eHEgcG9sbCBjaGVjawogICogQHBhcmFtIG5ldGRldiBuZXR3b3JrIGRldmljZQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfdHhfcG9sbF9mbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RhdGljIGlubGluZSBpbnQgc2V0dXBfdHhfcG9sbF9mbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKIAlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OwpAQCAtMjI0NCwyMSArMjU3MCwyNCBAQAogCQkJCQkJV1FfTUVNX1JFQ0xBSU0sIDApOwogCWlmICghbGlvLT50eHFfc3RhdHVzX3dxLndxKSB7CiAJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAidW5hYmxlIHRvIGNyZWF0ZSBjYXZpdW0gdHhxIHN0YXR1cyB3cVxuIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCX0KIAlJTklUX0RFTEFZRURfV09SSygmbGlvLT50eHFfc3RhdHVzX3dxLndrLndvcmssCiAJCQkgIG9jdG5ldF9wb2xsX2NoZWNrX3R4cV9zdGF0dXMpOwogCWxpby0+dHhxX3N0YXR1c193cS53ay5jdHhwdHIgPSBsaW87CiAJcXVldWVfZGVsYXllZF93b3JrKGxpby0+dHhxX3N0YXR1c193cS53cSwKIAkJCSAgICZsaW8tPnR4cV9zdGF0dXNfd3Eud2sud29yaywgbXNlY3NfdG9famlmZmllcygxKSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhbnVwX3R4X3BvbGxfZm4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgbGlvICpsaW8gPSBHRVRfTElPKG5ldGRldik7CiAKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmxpby0+dHhxX3N0YXR1c193cS53ay53b3JrKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShsaW8tPnR4cV9zdGF0dXNfd3Eud3EpOworCWlmIChsaW8tPnR4cV9zdGF0dXNfd3Eud3EpIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZsaW8tPnR4cV9zdGF0dXNfd3Eud2sud29yayk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKGxpby0+dHhxX3N0YXR1c193cS53cSk7CisJfQogfQogCiAvKioKQEAgLTIyNzYsMjQgKzI2MDUsMzQgQEAKIAkJCW5hcGlfZW5hYmxlKG5hcGkpOwogCiAJCW9jdC0+cHJvcHNbbGlvLT5pZmlkeF0ubmFwaV9lbmFibGVkID0gMTsKKworCQlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQkJb2N0LT5kcm9xWzBdLT5vcHMucG9sbF9tb2RlID0gMTsKIAl9CiAKIAlvY3RfcHRwX29wZW4obmV0ZGV2KTsKIAogCWlmc3RhdGVfc2V0KGxpbywgTElPX0lGU1RBVEVfUlVOTklORyk7CiAKLQlzZXR1cF90eF9wb2xsX2ZuKG5ldGRldik7Ci0KLQlzdGFydF90eHEobmV0ZGV2KTsKKwkvKiBSZWFkeSBmb3IgbGluayBzdGF0dXMgdXBkYXRlcyAqLworCWxpby0+aW50Zl9vcGVuID0gMTsKIAogCW5ldGlmX2luZm8obGlvLCBpZnVwLCBsaW8tPm5ldGRldiwgIkludGVyZmFjZSBPcGVuLCByZWFkeSBmb3IgdHJhZmZpY1xuIik7CiAKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCWlmICghb2N0LT5tc2l4X29uKQorCQkJaWYgKHNldHVwX3R4X3BvbGxfZm4obmV0ZGV2KSkKKwkJCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJaWYgKHNldHVwX3R4X3BvbGxfZm4obmV0ZGV2KSkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlzdGFydF90eHEobmV0ZGV2KTsKKwogCS8qIHRlbGwgT2N0ZW9uIHRvIHN0YXJ0IGZvcndhcmRpbmcgcGFja2V0cyB0byBob3N0ICovCiAJc2VuZF9yeF9jdHJsX2NtZChsaW8sIDEpOwogCi0JLyogUmVhZHkgZm9yIGxpbmsgc3RhdHVzIHVwZGF0ZXMgKi8KLQlsaW8tPmludGZfb3BlbiA9IDE7Ci0KIAlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBpbnRlcmZhY2UgaXMgb3BlbmVkXG4iLAogCQkgbmV0ZGV2LT5uYW1lKTsKIApAQCAtMjMyOCw3ICsyNjY3LDEyIEBACiAJLyogTm93IGl0IHNob3VsZCBiZSBzYWZlIHRvIHRlbGwgT2N0ZW9uIHRoYXQgbmljIGludGVyZmFjZSBpcyBkb3duLiAqLwogCXNlbmRfcnhfY3RybF9jbWQobGlvLCAwKTsKIAotCWNsZWFudXBfdHhfcG9sbF9mbihuZXRkZXYpOworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJaWYgKCFvY3QtPm1zaXhfb24pCisJCQljbGVhbnVwX3R4X3BvbGxfZm4obmV0ZGV2KTsKKwl9IGVsc2UgeworCQljbGVhbnVwX3R4X3BvbGxfZm4obmV0ZGV2KTsKKwl9CiAKIAlpZiAobGlvLT5wdHBfY2xvY2spIHsKIAkJcHRwX2Nsb2NrX3VucmVnaXN0ZXIobGlvLT5wdHBfY2xvY2spOwpAQCAtMjM0MCwxNDMgKzI2ODQsNiBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGxpcXVpZGlvX2xpbmtfY3RybF9jbWRfY29tcGxldGlvbih2b2lkICpuY3RybF9wdHIpCi17Ci0Jc3RydWN0IG9jdG5pY19jdHJsX3BrdCAqbmN0cmwgPSAoc3RydWN0IG9jdG5pY19jdHJsX3BrdCAqKW5jdHJsX3B0cjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopbmN0cmwtPm5ldHBuZGV2OwotCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKLQlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OwotCXU4ICptYWM7Ci0KLQlzd2l0Y2ggKG5jdHJsLT5uY21kLnMuY21kKSB7Ci0JY2FzZSBPQ1RORVRfQ01EX0NIQU5HRV9ERVZGTEFHUzoKLQljYXNlIE9DVE5FVF9DTURfU0VUX01VTFRJX0xJU1Q6Ci0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX0NIQU5HRV9NQUNBRERSOgotCQltYWMgPSAoKHU4ICopJm5jdHJsLT51ZGRbMF0pICsgMjsKLQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKLQkJCSAgICIlcyAlMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeFxuIiwKLQkJCSAgICJNQUNBZGRyIGNoYW5nZWQgdG8iLCBtYWNbMF0sIG1hY1sxXSwKLQkJCSAgIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX0NIQU5HRV9NVFU6Ci0JCS8qIElmIGNvbW1hbmQgaXMgc3VjY2Vzc2Z1bCwgY2hhbmdlIHRoZSBNVFUuICovCi0JCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsICIgTVRVIENoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwKLQkJCSAgIG5ldGRldi0+bXR1LCBuY3RybC0+bmNtZC5zLnBhcmFtMSk7Ci0JCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIE1UVSBDaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsCi0JCQkgbmV0ZGV2LT5uYW1lLCBuZXRkZXYtPm10dSwKLQkJCSBuY3RybC0+bmNtZC5zLnBhcmFtMSk7Ci0JCXJ0bmxfbG9jaygpOwotCQluZXRkZXYtPm10dSA9IG5jdHJsLT5uY21kLnMucGFyYW0xOwotCQljYWxsX25ldGRldmljZV9ub3RpZmllcnMoTkVUREVWX0NIQU5HRU1UVSwgbmV0ZGV2KTsKLQkJcnRubF91bmxvY2soKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfR1BJT19BQ0NFU1M6Ci0JCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsICJMRUQgRmxhc2hpbmcgdmlzdWFsIGlkZW50aWZpY2F0aW9uXG4iKTsKLQotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9MUk9fRU5BQkxFOgotCQlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICIlcyBMUk8gRW5hYmxlZFxuIiwgbmV0ZGV2LT5uYW1lKTsKLQkJYnJlYWs7Ci0KLQljYXNlIE9DVE5FVF9DTURfTFJPX0RJU0FCTEU6Ci0JCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIExSTyBEaXNhYmxlZFxuIiwKLQkJCSBuZXRkZXYtPm5hbWUpOwotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9WRVJCT1NFX0VOQUJMRToKLQkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgTFJPIEVuYWJsZWRcbiIsIG5ldGRldi0+bmFtZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX1ZFUkJPU0VfRElTQUJMRToKLQkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgTFJPIERpc2FibGVkXG4iLAotCQkJIG5ldGRldi0+bmFtZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX0VOQUJMRV9WTEFOX0ZJTFRFUjoKLQkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgVkxBTiBmaWx0ZXIgZW5hYmxlZFxuIiwKLQkJCSBuZXRkZXYtPm5hbWUpOwotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9BRERfVkxBTl9GSUxURVI6Ci0JCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIFZMQU4gZmlsdGVyICVkIGFkZGVkXG4iLAotCQkJIG5ldGRldi0+bmFtZSwgbmN0cmwtPm5jbWQucy5wYXJhbTEpOwotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9ERUxfVkxBTl9GSUxURVI6Ci0JCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzIFZMQU4gZmlsdGVyICVkIHJlbW92ZWRcbiIsCi0JCQkgbmV0ZGV2LT5uYW1lLCBuY3RybC0+bmNtZC5zLnBhcmFtMSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBPQ1RORVRfQ01EX1NFVF9TRVRUSU5HUzoKLQkJZGV2X2luZm8oJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgc2V0dGluZ3MgY2hhbmdlZFxuIiwKLQkJCSBuZXRkZXYtPm5hbWUpOwotCi0JCWJyZWFrOwotCQkvKiBDYXNlIHRvIGhhbmRsZSAiT0NUTkVUX0NNRF9UTkxfUlhfQ1NVTV9DVEwiCi0JCSAqIENvbW1hbmQgcGFzc2VkIGJ5IE5JQyBkcml2ZXIKLQkJICovCi0JY2FzZSBPQ1RORVRfQ01EX1ROTF9SWF9DU1VNX0NUTDoKLQkJaWYgKG5jdHJsLT5uY21kLnMucGFyYW0xID09IE9DVE5FVF9DTURfUlhDU1VNX0VOQUJMRSkgewotCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKLQkJCQkgICAiJXMgUlggQ2hlY2tzdW0gT2ZmbG9hZCBFbmFibGVkXG4iLAotCQkJCSAgIG5ldGRldi0+bmFtZSk7Ci0JCX0gZWxzZSBpZiAobmN0cmwtPm5jbWQucy5wYXJhbTEgPT0KLQkJCSAgIE9DVE5FVF9DTURfUlhDU1VNX0RJU0FCTEUpIHsKLQkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCi0JCQkJICAgIiVzIFJYIENoZWNrc3VtIE9mZmxvYWQgRGlzYWJsZWRcbiIsCi0JCQkJICAgbmV0ZGV2LT5uYW1lKTsKLQkJfQotCQlicmVhazsKLQotCQkvKiBDYXNlIHRvIGhhbmRsZSAiT0NUTkVUX0NNRF9UTkxfVFhfQ1NVTV9DVEwiCi0JCSAqIENvbW1hbmQgcGFzc2VkIGJ5IE5JQyBkcml2ZXIKLQkJICovCi0JY2FzZSBPQ1RORVRfQ01EX1ROTF9UWF9DU1VNX0NUTDoKLQkJaWYgKG5jdHJsLT5uY21kLnMucGFyYW0xID09IE9DVE5FVF9DTURfVFhDU1VNX0VOQUJMRSkgewotCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKLQkJCQkgICAiJXMgVFggQ2hlY2tzdW0gT2ZmbG9hZCBFbmFibGVkXG4iLAotCQkJCSAgIG5ldGRldi0+bmFtZSk7Ci0JCX0gZWxzZSBpZiAobmN0cmwtPm5jbWQucy5wYXJhbTEgPT0KLQkJCSAgIE9DVE5FVF9DTURfVFhDU1VNX0RJU0FCTEUpIHsKLQkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCi0JCQkJICAgIiVzIFRYIENoZWNrc3VtIE9mZmxvYWQgRGlzYWJsZWRcbiIsCi0JCQkJICAgbmV0ZGV2LT5uYW1lKTsKLQkJfQotCQlicmVhazsKLQotCQkvKiBDYXNlIHRvIGhhbmRsZSAiT0NUTkVUX0NNRF9WWExBTl9QT1JUX0NPTkZJRyIKLQkJICogQ29tbWFuZCBwYXNzZWQgYnkgTklDIGRyaXZlcgotCQkgKi8KLQljYXNlIE9DVE5FVF9DTURfVlhMQU5fUE9SVF9DT05GSUc6Ci0JCWlmIChuY3RybC0+bmNtZC5zLm1vcmUgPT0gT0NUTkVUX0NNRF9WWExBTl9QT1JUX0FERCkgewotCQkJbmV0aWZfaW5mbyhsaW8sIHByb2JlLCBsaW8tPm5ldGRldiwKLQkJCQkgICAiJXMgVnhMQU4gRGVzdGluYXRpb24gVURQIFBPUlQ6JWQgQURERURcbiIsCi0JCQkJICAgbmV0ZGV2LT5uYW1lLAotCQkJCSAgIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKLQkJfSBlbHNlIGlmIChuY3RybC0+bmNtZC5zLm1vcmUgPT0KLQkJCSAgIE9DVE5FVF9DTURfVlhMQU5fUE9SVF9ERUwpIHsKLQkJCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsCi0JCQkJICAgIiVzIFZ4TEFOIERlc3RpbmF0aW9uIFVEUCBQT1JUOiVkIERFTEVURURcbiIsCi0JCQkJICAgbmV0ZGV2LT5uYW1lLAotCQkJCSAgIG5jdHJsLT5uY21kLnMucGFyYW0xKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgT0NUTkVUX0NNRF9TRVRfRkxPV19DVEw6Ci0JCW5ldGlmX2luZm8obGlvLCBwcm9iZSwgbGlvLT5uZXRkZXYsICJTZXQgUlgvVFggZmxvdyBjb250cm9sIHBhcmFtZXRlcnNcbiIpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgVW5rbm93biBjbWQgJWRcbiIsIF9fZnVuY19fLAotCQkJbmN0cmwtPm5jbWQucy5jbWQpOwotCX0KLX0KLQogLyoqCiAgKiBcYnJpZWYgQ29udmVydHMgYSBtYXNrIGJhc2VkIG9uIG5ldCBkZXZpY2UgZmxhZ3MKICAqIEBwYXJhbSBuZXRkZXYgbmV0d29yayBkZXZpY2UKQEAgLTI4MTcsOCArMzAyNCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHNlbmRfbmljX3RpbWVzdGFtcF9wa3Qoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwKIAkJCQkJIHN0cnVjdCBvY3RuaWNfZGF0YV9wa3QgKm5kYXRhLAotCQkJCQkgc3RydWN0IG9jdG5ldF9idWZfZnJlZV9pbmZvICpmaW5mbywKLQkJCQkJIGludCB4bWl0X21vcmUpCisJCQkJCSBzdHJ1Y3Qgb2N0bmV0X2J1Zl9mcmVlX2luZm8gKmZpbmZvKQogewogCWludCByZXR2YWw7CiAJc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKnNjOwpAQCAtMjg0Niw5ICszMDUyLDE1IEBACiAJc2MtPmNhbGxiYWNrX2FyZyA9IGZpbmZvLT5za2I7CiAJc2MtPmlxX25vID0gbmRhdGEtPnFfbm87CiAKLQlsZW4gPSAodTMyKSgoc3RydWN0IG9jdGVvbl9pbnN0cl9paDIgKikoJnNjLT5jbWQuY21kMi5paDIpKS0+ZGxlbmdzejsKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQlsZW4gPSAodTMyKSgoc3RydWN0IG9jdGVvbl9pbnN0cl9paDMgKikKKwkJCSAgICAoJnNjLT5jbWQuY21kMy5paDMpKS0+ZGxlbmdzejsKKwllbHNlCisJCWxlbiA9ICh1MzIpKChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMiAqKQorCQkJICAgICgmc2MtPmNtZC5jbWQyLmloMikpLT5kbGVuZ3N6OwogCi0JcmluZ19kb29yYmVsbCA9ICF4bWl0X21vcmU7CisJcmluZ19kb29yYmVsbCA9IDE7CisKIAlyZXR2YWwgPSBvY3Rlb25fc2VuZF9jb21tYW5kKG9jdCwgc2MtPmlxX25vLCByaW5nX2Rvb3JiZWxsLCAmc2MtPmNtZCwKIAkJCQkgICAgIHNjLCBsZW4sIG5kYXRhLT5yZXF0eXBlKTsKIApAQCAtMjg4MSw3ICszMDkzLDcgQEAKIAl1bmlvbiB0eF9pbmZvICp0eF9pbmZvOwogCWludCBzdGF0dXMgPSAwOwogCWludCBxX2lkeCA9IDAsIGlxX25vID0gMDsKLQlpbnQgeG1pdF9tb3JlLCBqOworCWludCBqOwogCXU2NCBkcHRyID0gMDsKIAl1MzIgdGFnID0gMDsKIApAQCAtMjk4MCw3ICszMTkyLDEwIEBACiAJCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAJCX0KIAotCQluZGF0YS5jbWQuY21kMi5kcHRyID0gZHB0cjsKKwkJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJCW5kYXRhLmNtZC5jbWQzLmRwdHIgPSBkcHRyOworCQllbHNlCisJCQluZGF0YS5jbWQuY21kMi5kcHRyID0gZHB0cjsKIAkJZmluZm8tPmRwdHIgPSBkcHRyOwogCQluZGF0YS5yZXF0eXBlID0gUkVRVFlQRV9OT1JFU1BfTkVUOwogCkBAIC0zMDU1LDE1ICszMjcwLDIzIEBACiAJCQkJCSAgIGctPnNnX3NpemUsIERNQV9UT19ERVZJQ0UpOwogCQlkcHRyID0gZy0+c2dfZG1hX3B0cjsKIAotCQluZGF0YS5jbWQuY21kMi5kcHRyID0gZHB0cjsKKwkJaWYgKE9DVEVPTl9DTjIzWFhfUEYob2N0KSkKKwkJCW5kYXRhLmNtZC5jbWQzLmRwdHIgPSBkcHRyOworCQllbHNlCisJCQluZGF0YS5jbWQuY21kMi5kcHRyID0gZHB0cjsKIAkJZmluZm8tPmRwdHIgPSBkcHRyOwogCQlmaW5mby0+ZyA9IGc7CiAKIAkJbmRhdGEucmVxdHlwZSA9IFJFUVRZUEVfTk9SRVNQX05FVF9TRzsKIAl9CiAKLQlpcmggPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmbmRhdGEuY21kLmNtZDIuaXJoOwotCXR4X2luZm8gPSAodW5pb24gdHhfaW5mbyAqKSZuZGF0YS5jbWQuY21kMi5vc3NwWzBdOworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJaXJoID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJm5kYXRhLmNtZC5jbWQzLmlyaDsKKwkJdHhfaW5mbyA9ICh1bmlvbiB0eF9pbmZvICopJm5kYXRhLmNtZC5jbWQzLm9zc3BbMF07CisJfSBlbHNlIHsKKwkJaXJoID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJm5kYXRhLmNtZC5jbWQyLmlyaDsKKwkJdHhfaW5mbyA9ICh1bmlvbiB0eF9pbmZvICopJm5kYXRhLmNtZC5jbWQyLm9zc3BbMF07CisJfQogCiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpIHsKIAkJdHhfaW5mby0+cy5nc29fc2l6ZSA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CkBAIC0zMDc3LDEyICszMzAwLDEwIEBACiAJCWlyaC0+dmxhbiA9IHNrYl92bGFuX3RhZ19nZXQoc2tiKSAmIDB4ZmZmOwogCX0KIAotCXhtaXRfbW9yZSA9IHNrYi0+eG1pdF9tb3JlOwotCiAJaWYgKHVubGlrZWx5KGNtZHNldHVwLnMudGltZXN0YW1wKSkKLQkJc3RhdHVzID0gc2VuZF9uaWNfdGltZXN0YW1wX3BrdChvY3QsICZuZGF0YSwgZmluZm8sIHhtaXRfbW9yZSk7CisJCXN0YXR1cyA9IHNlbmRfbmljX3RpbWVzdGFtcF9wa3Qob2N0LCAmbmRhdGEsIGZpbmZvKTsKIAllbHNlCi0JCXN0YXR1cyA9IG9jdG5ldF9zZW5kX25pY19kYXRhX3BrdChvY3QsICZuZGF0YSwgeG1pdF9tb3JlKTsKKwkJc3RhdHVzID0gb2N0bmV0X3NlbmRfbmljX2RhdGFfcGt0KG9jdCwgJm5kYXRhKTsKIAlpZiAoc3RhdHVzID09IElRX1NFTkRfRkFJTEVEKQogCQlnb3RvIGxpb194bWl0X2ZhaWxlZDsKIApAQCAtMzE5MCw4ICszNDExLDggQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0NUTkVUX0NNRF9SWENTVU1fRElTQUJMRQogICogQHJldHVybnMgICAgICAgICAgICAgICAgICAgICBTVUNDRVNTIG9yIEZBSUxVUkUKICAqLwotaW50IGxpcXVpZGlvX3NldF9yeGNzdW1fY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgY29tbWFuZCwKLQkJCQl1OCByeF9jbWQpCitzdGF0aWMgaW50IGxpcXVpZGlvX3NldF9yeGNzdW1fY29tbWFuZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgY29tbWFuZCwKKwkJCQkgICAgICAgdTggcnhfY21kKQogewogCXN0cnVjdCBsaW8gKmxpbyA9IEdFVF9MSU8obmV0ZGV2KTsKIAlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0ID0gbGlvLT5vY3RfZGV2OwpAQCAtMzI0OSwzMSArMzQ3MCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGxpcXVpZGlvX3NldF9mZWF0dXJlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBjbWQsIHUxNiBwYXJhbTEpCi17Ci0Jc3RydWN0IGxpbyAqbGlvID0gR0VUX0xJTyhuZXRkZXYpOwotCXN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QgPSBsaW8tPm9jdF9kZXY7Ci0Jc3RydWN0IG9jdG5pY19jdHJsX3BrdCBuY3RybDsKLQlpbnQgcmV0ID0gMDsKLQotCW1lbXNldCgmbmN0cmwsIDAsIHNpemVvZihzdHJ1Y3Qgb2N0bmljX2N0cmxfcGt0KSk7Ci0KLQluY3RybC5uY21kLnU2NCA9IDA7Ci0JbmN0cmwubmNtZC5zLmNtZCA9IGNtZDsKLQluY3RybC5uY21kLnMucGFyYW0xID0gcGFyYW0xOwotCW5jdHJsLmlxX25vID0gbGlvLT5saW5mby50eHBjaXFbMF0ucy5xX25vOwotCW5jdHJsLndhaXRfdGltZSA9IDEwMDsKLQluY3RybC5uZXRwbmRldiA9ICh1NjQpbmV0ZGV2OwotCW5jdHJsLmNiX2ZuID0gbGlxdWlkaW9fbGlua19jdHJsX2NtZF9jb21wbGV0aW9uOwotCi0JcmV0ID0gb2N0bmV0X3NlbmRfbmljX2N0cmxfcGt0KGxpby0+b2N0X2RldiwgJm5jdHJsKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIkZlYXR1cmUgY2hhbmdlIGZhaWxlZCBpbiBjb3JlIChyZXQ6IDB4JXgpXG4iLAotCQkJcmV0KTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQogLyoqIFxicmllZiBOZXQgZGV2aWNlIGZpeCBmZWF0dXJlcwogICogQHBhcmFtIG5ldGRldiAgcG9pbnRlciB0byBuZXR3b3JrIGRldmljZQogICogQHBhcmFtIHJlcXVlc3QgZmVhdHVyZXMgcmVxdWVzdGVkCkBAIC0zNDkyLDggKzM2ODgsOSBAQAogCXVuaW9uIG9jdF9uaWNfaWZfY2ZnIGlmX2NmZzsKIAl1bnNpZ25lZCBpbnQgYmFzZV9xdWV1ZTsKIAl1bnNpZ25lZCBpbnQgZ214X3BvcnRfaWQ7Ci0JdTMyIHJlc3Bfc2l6ZSwgY3R4X3NpemU7CisJdTMyIHJlc3Bfc2l6ZSwgY3R4X3NpemUsIGRhdGFfc2l6ZTsKIAl1MzIgaWZpZHhfb3JfcGZudW07CisJc3RydWN0IGxpb192ZXJzaW9uICp2ZGF0YTsKIAogCS8qIFRoaXMgaXMgdG8gaGFuZGxlIGxpbmsgc3RhdHVzIGNoYW5nZXMgKi8KIAlvY3Rlb25fcmVnaXN0ZXJfZGlzcGF0Y2hfZm4ob2N0ZW9uX2RldiwgT1BDT0RFX05JQywKQEAgLTM1MTUsMjEgKzM3MTIsMzcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgb2N0ZW9uX2Rldi0+aWZjb3VudDsgaSsrKSB7CiAJCXJlc3Bfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbGlxdWlkaW9faWZfY2ZnX3Jlc3ApOwogCQljdHhfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbGlxdWlkaW9faWZfY2ZnX2NvbnRleHQpOworCQlkYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGxpb192ZXJzaW9uKTsKIAkJc2MgPSAoc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKikKLQkJCW9jdGVvbl9hbGxvY19zb2Z0X2NvbW1hbmQob2N0ZW9uX2RldiwgMCwKKwkJCW9jdGVvbl9hbGxvY19zb2Z0X2NvbW1hbmQob2N0ZW9uX2RldiwgZGF0YV9zaXplLAogCQkJCQkJICByZXNwX3NpemUsIGN0eF9zaXplKTsKIAkJcmVzcCA9IChzdHJ1Y3QgbGlxdWlkaW9faWZfY2ZnX3Jlc3AgKilzYy0+dmlydHJwdHI7CiAJCWN0eCAgPSAoc3RydWN0IGxpcXVpZGlvX2lmX2NmZ19jb250ZXh0ICopc2MtPmN0eHB0cjsKKwkJdmRhdGEgPSAoc3RydWN0IGxpb192ZXJzaW9uICopc2MtPnZpcnRkcHRyOwogCi0JCW51bV9pcXVldWVzID0KLQkJCUNGR19HRVRfTlVNX1RYUVNfTklDX0lGKG9jdGVvbl9nZXRfY29uZihvY3Rlb25fZGV2KSwgaSk7Ci0JCW51bV9vcXVldWVzID0KLQkJCUNGR19HRVRfTlVNX1JYUVNfTklDX0lGKG9jdGVvbl9nZXRfY29uZihvY3Rlb25fZGV2KSwgaSk7Ci0JCWJhc2VfcXVldWUgPQotCQkJQ0ZHX0dFVF9CQVNFX1FVRV9OSUNfSUYob2N0ZW9uX2dldF9jb25mKG9jdGVvbl9kZXYpLCBpKTsKLQkJZ214X3BvcnRfaWQgPQotCQkJQ0ZHX0dFVF9HTVhJRF9OSUNfSUYob2N0ZW9uX2dldF9jb25mKG9jdGVvbl9kZXYpLCBpKTsKLQkJaWZpZHhfb3JfcGZudW0gPSBpOworCQkqKCh1NjQgKil2ZGF0YSkgPSAwOworCQl2ZGF0YS0+bWFqb3IgPSBjcHVfdG9fYmUxNihMSVFVSURJT19CQVNFX01BSk9SX1ZFUlNJT04pOworCQl2ZGF0YS0+bWlub3IgPSBjcHVfdG9fYmUxNihMSVFVSURJT19CQVNFX01JTk9SX1ZFUlNJT04pOworCQl2ZGF0YS0+bWljcm8gPSBjcHVfdG9fYmUxNihMSVFVSURJT19CQVNFX01JQ1JPX1ZFUlNJT04pOworCisJCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdGVvbl9kZXYpKSB7CisJCQludW1faXF1ZXVlcyA9IG9jdGVvbl9kZXYtPnNyaW92X2luZm8ubnVtX3BmX3JpbmdzOworCQkJbnVtX29xdWV1ZXMgPSBvY3Rlb25fZGV2LT5zcmlvdl9pbmZvLm51bV9wZl9yaW5nczsKKwkJCWJhc2VfcXVldWUgPSBvY3Rlb25fZGV2LT5zcmlvdl9pbmZvLnBmX3NybjsKKworCQkJZ214X3BvcnRfaWQgPSBvY3Rlb25fZGV2LT5wZl9udW07CisJCQlpZmlkeF9vcl9wZm51bSA9IG9jdGVvbl9kZXYtPnBmX251bTsKKwkJfSBlbHNlIHsKKwkJCW51bV9pcXVldWVzID0gQ0ZHX0dFVF9OVU1fVFhRU19OSUNfSUYoCisJCQkJCQlvY3Rlb25fZ2V0X2NvbmYob2N0ZW9uX2RldiksIGkpOworCQkJbnVtX29xdWV1ZXMgPSBDRkdfR0VUX05VTV9SWFFTX05JQ19JRigKKwkJCQkJCW9jdGVvbl9nZXRfY29uZihvY3Rlb25fZGV2KSwgaSk7CisJCQliYXNlX3F1ZXVlID0gQ0ZHX0dFVF9CQVNFX1FVRV9OSUNfSUYoCisJCQkJCQlvY3Rlb25fZ2V0X2NvbmYob2N0ZW9uX2RldiksIGkpOworCQkJZ214X3BvcnRfaWQgPSBDRkdfR0VUX0dNWElEX05JQ19JRigKKwkJCQkJCW9jdGVvbl9nZXRfY29uZihvY3Rlb25fZGV2KSwgaSk7CisJCQlpZmlkeF9vcl9wZm51bSA9IGk7CisJCX0KIAogCQlkZXZfZGJnKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsCiAJCQkicmVxdWVzdGluZyBjb25maWcgZm9yIGludGVyZmFjZSAlZCwgaXFzICVkLCBvcXMgJWRcbiIsCkBAIC0zNTY2LDcgKzM3NzksMTEgQEAKIAkJLyogU2xlZXAgb24gYSB3YWl0IHF1ZXVlIHRpbGwgdGhlIGNvbmQgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUKIAkJICogcmVzcG9uc2UgYXJyaXZlZCBvciB0aW1lZC1vdXQuCiAJCSAqLwotCQlzbGVlcF9jb25kKCZjdHgtPndjLCAmY3R4LT5jb25kKTsKKwkJaWYgKHNsZWVwX2NvbmQoJmN0eC0+d2MsICZjdHgtPmNvbmQpID09IC1FSU5UUikgeworCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiV2FpdCBpbnRlcnJ1cHRlZFxuIik7CisJCQlnb3RvIHNldHVwX25pY193YWl0X2ludHI7CisJCX0KKwogCQlyZXR2YWwgPSByZXNwLT5zdGF0dXM7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgImlxL29xIGNvbmZpZyBmYWlsZWRcbiIpOwpAQCAtMzYzMywxMiArMzg1MCwxNiBAQAogCiAJCWxpby0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnLCBERUZBVUxUX01TR19FTkFCTEUpOwogCi0JCWxpby0+ZGV2X2NhcGFiaWxpdHkgPSBORVRJRl9GX0hJR0hETUEKLQkJCQl8IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNCi0JCQkJfCBORVRJRl9GX1NHIHwgTkVUSUZfRl9SWENTVU0KLQkJCQl8IE5FVElGX0ZfR1JPCi0JCQkJfCBORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNgotCQkJCXwgTkVUSUZfRl9MUk87CisJCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdGVvbl9kZXYpIHx8CisJCSAgICBPQ1RFT05fQ042WFhYKG9jdGVvbl9kZXYpKSB7CisJCQlsaW8tPmRldl9jYXBhYmlsaXR5ID0gTkVUSUZfRl9ISUdIRE1BCisJCQkJCSAgICAgIHwgTkVUSUZfRl9JUF9DU1VNCisJCQkJCSAgICAgIHwgTkVUSUZfRl9JUFY2X0NTVU0KKwkJCQkJICAgICAgfCBORVRJRl9GX1NHIHwgTkVUSUZfRl9SWENTVU0KKwkJCQkJICAgICAgfCBORVRJRl9GX0dSTworCQkJCQkgICAgICB8IE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082CisJCQkJCSAgICAgIHwgTkVUSUZfRl9MUk87CisJCX0KIAkJbmV0aWZfc2V0X2dzb19tYXhfc2l6ZShuZXRkZXYsIE9DVE5JQ19HU09fTUFYX1NJWkUpOwogCiAJCS8qICBDb3B5IG9mIHRyYW5zbWl0IGVuY2Fwc3VsYXRpb24gY2FwYWJpbGl0aWVzOgpAQCAtMzcxMyw3ICszOTM0LDEwIEBACiAKIAkJLyogUmVnaXN0ZXIgZXRodG9vbCBzdXBwb3J0ICovCiAJCWxpcXVpZGlvX3NldF9ldGh0b29sX29wcyhuZXRkZXYpOwotCQlvY3Rlb25fZGV2LT5wcml2X2ZsYWdzID0gMHgwOworCQlpZiAobGlvLT5vY3RfZGV2LT5jaGlwX2lkID09IE9DVEVPTl9DTjIzWFhfUEZfVklEKQorCQkJb2N0ZW9uX2Rldi0+cHJpdl9mbGFncyA9IE9DVF9QUklWX0ZMQUdfREVGQVVMVDsKKwkJZWxzZQorCQkJb2N0ZW9uX2Rldi0+cHJpdl9mbGFncyA9IDB4MDsKIAogCQlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKQogCQkJbGlxdWlkaW9fc2V0X2ZlYXR1cmUobmV0ZGV2LCBPQ1RORVRfQ01EX0xST19FTkFCTEUsCkBAIC0zNzI1LDYgKzM5NDksOSBAQAogCQkJbGlxdWlkaW9fc2V0X2ZlYXR1cmUobmV0ZGV2LAogCQkJCQkgICAgIE9DVE5FVF9DTURfVkVSQk9TRV9FTkFCTEUsIDApOwogCisJCWlmIChzZXR1cF9saW5rX3N0YXR1c19jaGFuZ2Vfd3EobmV0ZGV2KSkKKwkJCWdvdG8gc2V0dXBfbmljX2Rldl9mYWlsOworCiAJCS8qIFJlZ2lzdGVyIHRoZSBuZXR3b3JrIGRldmljZSB3aXRoIHRoZSBPUyAqLwogCQlpZiAocmVnaXN0ZXJfbmV0ZGV2KG5ldGRldikpIHsKIAkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKQEAgLTM3NjAsNiArMzk4Nyw4IEBACiAKIAlvY3Rlb25fZnJlZV9zb2Z0X2NvbW1hbmQob2N0ZW9uX2Rldiwgc2MpOwogCitzZXR1cF9uaWNfd2FpdF9pbnRyOgorCiAJd2hpbGUgKGktLSkgewogCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsCiAJCQkiTklDIGlmaWR4OiVkIFNldHVwIGZhaWxlZFxuIiwgaSk7CkBAIC0zNzg5LDggKzQwMTgsNyBAQAogCS8qIHJ1biBwb3J0X2NvbmZpZyBjb21tYW5kIGZvciBlYWNoIHBvcnQgKi8KIAlvY3QtPmlmY291bnQgPSBudW1fbmljX3BvcnRzOwogCi0JbWVtc2V0KG9jdC0+cHJvcHMsIDAsCi0JICAgICAgIHNpemVvZihzdHJ1Y3Qgb2N0ZGV2X3Byb3BzKSAqIG51bV9uaWNfcG9ydHMpOworCW1lbXNldChvY3QtPnByb3BzLCAwLCBzaXplb2Yoc3RydWN0IG9jdGRldl9wcm9wcykgKiBudW1fbmljX3BvcnRzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfT0NURU9OX0xJTktTOyBpKyspCiAJCW9jdC0+cHJvcHNbaV0uZ214cG9ydCA9IC0xOwpAQCAtMzgwNiw3ICs0MDM0LDcgQEAKIAkvKiBJbml0aWFsaXplIGludGVycnVwdCBtb2RlcmF0aW9uIHBhcmFtcyAqLwogCWludHJtb2RfY2ZnID0gJigoc3RydWN0IG9jdGVvbl9kZXZpY2UgKilvY3QpLT5pbnRybW9kOwogCWludHJtb2RfY2ZnLT5yeF9lbmFibGUgPSAxOwotCWludHJtb2RfY2ZnLT5jaGVja19pbnRydmwgPSAgIExJT19JTlRSTU9EX0NIRUNLX0lOVEVSVkFMOworCWludHJtb2RfY2ZnLT5jaGVja19pbnRydmwgPSBMSU9fSU5UUk1PRF9DSEVDS19JTlRFUlZBTDsKIAlpbnRybW9kX2NmZy0+bWF4cGt0X3JhdGV0aHIgPSBMSU9fSU5UUk1PRF9NQVhQS1RfUkFURVRIUjsKIAlpbnRybW9kX2NmZy0+bWlucGt0X3JhdGV0aHIgPSBMSU9fSU5UUk1PRF9NSU5QS1RfUkFURVRIUjsKIAlpbnRybW9kX2NmZy0+cnhfbWF4Y250X3RyaWdnZXIgPSBMSU9fSU5UUk1PRF9SWE1BWENOVF9UUklHR0VSOwpAQCAtMzgxOCw2ICs0MDQ2LDcgQEAKIAlpbnRybW9kX2NmZy0+dHhfbWluY250X3RyaWdnZXIgPSBMSU9fSU5UUk1PRF9UWE1JTkNOVF9UUklHR0VSOwogCWludHJtb2RfY2ZnLT5yeF9mcmFtZXMgPSBDRkdfR0VUX09RX0lOVFJfUEtUKG9jdGVvbl9nZXRfY29uZihvY3QpKTsKIAlpbnRybW9kX2NmZy0+cnhfdXNlY3MgPSBDRkdfR0VUX09RX0lOVFJfVElNRShvY3Rlb25fZ2V0X2NvbmYob2N0KSk7CisJaW50cm1vZF9jZmctPnR4X2ZyYW1lcyA9IENGR19HRVRfSVFfSU5UUl9QS1Qob2N0ZW9uX2dldF9jb25mKG9jdCkpOwogCWRldl9kYmcoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiTmV0d29yayBpbnRlcmZhY2VzIHJlYWR5XG4iKTsKIAogCXJldHVybiByZXR2YWw7CkBAIC0zODgwLDYgKzQxMDksNyBAQAogc3RhdGljIGludCBvY3Rlb25fZGV2aWNlX2luaXQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdGVvbl9kZXYpCiB7CiAJaW50IGosIHJldDsKKwlpbnQgZndfbG9hZGVkID0gMDsKIAljaGFyIGJvb3RjbWRbXSA9ICJcbiI7CiAJc3RydWN0IG9jdGVvbl9kZXZpY2VfcHJpdiAqb2N0X3ByaXYgPQogCQkoc3RydWN0IG9jdGVvbl9kZXZpY2VfcHJpdiAqKW9jdGVvbl9kZXYtPnByaXY7CkBAIC0zOTAxLDkgKzQxMzEsMjMgQEAKIAogCW9jdGVvbl9kZXYtPmFwcF9tb2RlID0gQ1ZNX0RSVl9JTlZBTElEX0FQUDsKIAotCS8qIERvIGEgc29mdCByZXNldCBvZiB0aGUgT2N0ZW9uIGRldmljZS4gKi8KLQlpZiAob2N0ZW9uX2Rldi0+Zm5fbGlzdC5zb2Z0X3Jlc2V0KG9jdGVvbl9kZXYpKQorCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdGVvbl9kZXYpKSB7CisJCWlmICghY24yM3h4X2Z3X2xvYWRlZChvY3Rlb25fZGV2KSkgeworCQkJZndfbG9hZGVkID0gMDsKKwkJCS8qIERvIGEgc29mdCByZXNldCBvZiB0aGUgT2N0ZW9uIGRldmljZS4gKi8KKwkJCWlmIChvY3Rlb25fZGV2LT5mbl9saXN0LnNvZnRfcmVzZXQob2N0ZW9uX2RldikpCisJCQkJcmV0dXJuIDE7CisJCQkvKiB0aGluZ3MgbWlnaHQgaGF2ZSBjaGFuZ2VkICovCisJCQlpZiAoIWNuMjN4eF9md19sb2FkZWQob2N0ZW9uX2RldikpCisJCQkJZndfbG9hZGVkID0gMDsKKwkJCWVsc2UKKwkJCQlmd19sb2FkZWQgPSAxOworCQl9IGVsc2UgeworCQkJZndfbG9hZGVkID0gMTsKKwkJfQorCX0gZWxzZSBpZiAob2N0ZW9uX2Rldi0+Zm5fbGlzdC5zb2Z0X3Jlc2V0KG9jdGVvbl9kZXYpKSB7CiAJCXJldHVybiAxOworCX0KIAogCS8qIEluaXRpYWxpemUgdGhlIGRpc3BhdGNoIG1lY2hhbmlzbSB1c2VkIHRvIHB1c2ggcGFja2V0cyBhcnJpdmluZyBvbgogCSAqIE9jdGVvbiBPdXRwdXQgcXVldWVzLgpAQCAtMzkyNSw2ICs0MTY5LDIyIEBACiAKIAlvY3Rlb25fc2V0X2lvX3F1ZXVlc19vZmYob2N0ZW9uX2Rldik7CiAKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3Rlb25fZGV2KSkgeworCQlyZXQgPSBvY3Rlb25fZGV2LT5mbl9saXN0LnNldHVwX2RldmljZV9yZWdzKG9jdGVvbl9kZXYpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJPQ1RFT046IEZhaWxlZCB0byBjb25maWd1cmUgZGV2aWNlIHJlZ2lzdGVyc1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogSW5pdGlhbGl6ZSBzb2Z0IGNvbW1hbmQgYnVmZmVyIHBvb2wKKwkgKi8KKwlpZiAob2N0ZW9uX3NldHVwX3NjX2J1ZmZlcl9wb29sKG9jdGVvbl9kZXYpKSB7CisJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgInNjIGJ1ZmZlciBwb29sIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWF0b21pY19zZXQoJm9jdGVvbl9kZXYtPnN0YXR1cywgT0NUX0RFVl9TQ19CVUZGX1BPT0xfSU5JVF9ET05FKTsKKwogCS8qICBTZXR1cCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgbWFuYWdlIHRoaXMgT2N0ZW9uJ3MgSW5wdXQgcXVldWVzLiAqLwogCWlmIChvY3Rlb25fc2V0dXBfaW5zdHJfcXVldWVzKG9jdGVvbl9kZXYpKSB7CiAJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwKQEAgLTM5MzYsMTQgKzQxOTYsNiBAQAogCX0KIAlhdG9taWNfc2V0KCZvY3Rlb25fZGV2LT5zdGF0dXMsIE9DVF9ERVZfSU5TVFJfUVVFVUVfSU5JVF9ET05FKTsKIAotCS8qIEluaXRpYWxpemUgc29mdCBjb21tYW5kIGJ1ZmZlciBwb29sCi0JICovCi0JaWYgKG9jdGVvbl9zZXR1cF9zY19idWZmZXJfcG9vbChvY3Rlb25fZGV2KSkgewotCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJzYyBidWZmZXIgcG9vbCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCXJldHVybiAxOwotCX0KLQlhdG9taWNfc2V0KCZvY3Rlb25fZGV2LT5zdGF0dXMsIE9DVF9ERVZfU0NfQlVGRl9QT09MX0lOSVRfRE9ORSk7Ci0KIAkvKiBJbml0aWFsaXplIGxpc3RzIHRvIG1hbmFnZSB0aGUgcmVxdWVzdHMgb2YgZGlmZmVyZW50IHR5cGVzIHRoYXQKIAkgKiBhcnJpdmUgZnJvbSB1c2VyICYga2VybmVsIGFwcGxpY2F0aW9ucyBmb3IgdGhpcyBvY3Rlb24gZGV2aWNlLgogCSAqLwpAQCAtMzk2MywxNSArNDIxNSwyMyBAQAogCiAJYXRvbWljX3NldCgmb2N0ZW9uX2Rldi0+c3RhdHVzLCBPQ1RfREVWX0RST1FfSU5JVF9ET05FKTsKIAotCS8qIFRoZSBpbnB1dCBhbmQgb3V0cHV0IHF1ZXVlIHJlZ2lzdGVycyB3ZXJlIHNldHVwIGVhcmxpZXIgKHRoZSBxdWV1ZXMKLQkgKiB3ZXJlIG5vdCBlbmFibGVkKS4gQW55IGFkZGl0aW9uYWwgcmVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZQotCSAqIHByb2dyYW1tZWQgc2hvdWxkIGJlIGRvbmUgbm93LgotCSAqLwotCXJldCA9IG9jdGVvbl9kZXYtPmZuX2xpc3Quc2V0dXBfZGV2aWNlX3JlZ3Mob2N0ZW9uX2Rldik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsCi0JCQkiRmFpbGVkIHRvIGNvbmZpZ3VyZSBkZXZpY2UgcmVnaXN0ZXJzXG4iKTsKLQkJcmV0dXJuIHJldDsKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3Rlb25fZGV2KSkgeworCQlpZiAob2N0ZW9uX2FsbG9jYXRlX2lvcV92ZWN0b3Iob2N0ZW9uX2RldikpIHsKKwkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIk9DVEVPTjogaW9xIHZlY3RvciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJfSBlbHNlIHsKKwkJLyogVGhlIGlucHV0IGFuZCBvdXRwdXQgcXVldWUgcmVnaXN0ZXJzIHdlcmUgc2V0dXAgZWFybGllciAodGhlCisJCSAqIHF1ZXVlcyB3ZXJlIG5vdCBlbmFibGVkKS4gQW55IGFkZGl0aW9uYWwgcmVnaXN0ZXJzCisJCSAqIHRoYXQgbmVlZCB0byBiZSBwcm9ncmFtbWVkIHNob3VsZCBiZSBkb25lIG5vdy4KKwkJICovCisJCXJldCA9IG9jdGVvbl9kZXYtPmZuX2xpc3Quc2V0dXBfZGV2aWNlX3JlZ3Mob2N0ZW9uX2Rldik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwKKwkJCQkiRmFpbGVkIHRvIGNvbmZpZ3VyZSBkZXZpY2UgcmVnaXN0ZXJzXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAKIAkvKiBJbml0aWFsaXplIHRoZSB0YXNrbGV0IHRoYXQgaGFuZGxlcyBvdXRwdXQgcXVldWUgcGFja2V0IHByb2Nlc3NpbmcuKi8KQEAgLTM5ODUsNjMgKzQyNDUsNzYgQEAKIAkJcmV0dXJuIDE7CiAKIAkvKiBFbmFibGUgT2N0ZW9uIGRldmljZSBpbnRlcnJ1cHRzICovCi0Jb2N0ZW9uX2Rldi0+Zm5fbGlzdC5lbmFibGVfaW50ZXJydXB0KG9jdGVvbl9kZXYtPmNoaXApOworCW9jdGVvbl9kZXYtPmZuX2xpc3QuZW5hYmxlX2ludGVycnVwdChvY3Rlb25fZGV2LCBPQ1RFT05fQUxMX0lOVFIpOwogCiAJLyogRW5hYmxlIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHF1ZXVlcyBmb3IgdGhpcyBPY3Rlb24gZGV2aWNlICovCi0Jb2N0ZW9uX2Rldi0+Zm5fbGlzdC5lbmFibGVfaW9fcXVldWVzKG9jdGVvbl9kZXYpOworCXJldCA9IG9jdGVvbl9kZXYtPmZuX2xpc3QuZW5hYmxlX2lvX3F1ZXVlcyhvY3Rlb25fZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgaW5wdXQvb3V0cHV0IHF1ZXVlcyIpOworCQlyZXR1cm4gcmV0OworCX0KIAogCWF0b21pY19zZXQoJm9jdGVvbl9kZXYtPnN0YXR1cywgT0NUX0RFVl9JT19RVUVVRVNfRE9ORSk7CiAKLQlkZXZfZGJnKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJXYWl0aW5nIGZvciBERFIgaW5pdGlhbGl6YXRpb24uLi5cbiIpOworCWlmICgoIU9DVEVPTl9DTjIzWFhfUEYob2N0ZW9uX2RldikpIHx8ICFmd19sb2FkZWQpIHsKKwkJZGV2X2RiZygmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiV2FpdGluZyBmb3IgRERSIGluaXRpYWxpemF0aW9uLi4uXG4iKTsKKwkJaWYgKCFkZHJfdGltZW91dCkgeworCQkJZGV2X2luZm8oJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwKKwkJCQkgIldBSVRJTkcuIFNldCBkZHJfdGltZW91dCB0byBub24temVybyB2YWx1ZSB0byBwcm9jZWVkIHdpdGggaW5pdGlhbGl6YXRpb24uXG4iKTsKKwkJfQogCi0JaWYgKGRkcl90aW1lb3V0ID09IDApCi0JCWRldl9pbmZvKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJXQUlUSU5HLiBTZXQgZGRyX3RpbWVvdXQgdG8gbm9uLXplcm8gdmFsdWUgdG8gcHJvY2VlZCB3aXRoIGluaXRpYWxpemF0aW9uLlxuIik7CisJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKEhaICogTElPX1JFU0VUX1NFQ1MpOwogCi0Jc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFogKiBMSU9fUkVTRVRfU0VDUyk7Ci0KLQkvKiBXYWl0IGZvciB0aGUgb2N0ZW9uIHRvIGluaXRpYWxpemUgRERSIGFmdGVyIHRoZSBzb2Z0LXJlc2V0LiAqLwotCXdoaWxlIChkZHJfdGltZW91dCA9PSAwKSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmIChzY2hlZHVsZV90aW1lb3V0KEhaIC8gMTApKSB7Ci0JCQkvKiB1c2VyIHByb2JhYmx5IHByZXNzZWQgQ29udHJvbC1DICovCisJCS8qIFdhaXQgZm9yIHRoZSBvY3Rlb24gdG8gaW5pdGlhbGl6ZSBERFIgYWZ0ZXIgdGhlIHNvZnQtcmVzZXQuKi8KKwkJd2hpbGUgKCFkZHJfdGltZW91dCkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWlmIChzY2hlZHVsZV90aW1lb3V0KEhaIC8gMTApKSB7CisJCQkJLyogdXNlciBwcm9iYWJseSBwcmVzc2VkIENvbnRyb2wtQyAqLworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJCXJldCA9IG9jdGVvbl93YWl0X2Zvcl9kZHJfaW5pdChvY3Rlb25fZGV2LCAmZGRyX3RpbWVvdXQpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsCisJCQkJIkREUiBub3QgaW5pdGlhbGl6ZWQuIFBsZWFzZSBjb25maXJtIHRoYXQgYm9hcmQgaXMgY29uZmlndXJlZCB0byBib290IGZyb20gRmxhc2gsIHJldDogJWRcbiIsCisJCQkJcmV0KTsKIAkJCXJldHVybiAxOwogCQl9Ci0JfQotCXJldCA9IG9jdGVvbl93YWl0X2Zvcl9kZHJfaW5pdChvY3Rlb25fZGV2LCAmZGRyX3RpbWVvdXQpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LAotCQkJIkREUiBub3QgaW5pdGlhbGl6ZWQuIFBsZWFzZSBjb25maXJtIHRoYXQgYm9hcmQgaXMgY29uZmlndXJlZCB0byBib290IGZyb20gRmxhc2gsIHJldDogJWRcbiIsCi0JCQlyZXQpOwotCQlyZXR1cm4gMTsKLQl9CiAKLQlpZiAob2N0ZW9uX3dhaXRfZm9yX2Jvb3Rsb2FkZXIob2N0ZW9uX2RldiwgMTAwMCkgIT0gMCkgewotCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJCb2FyZCBub3QgcmVzcG9uZGluZ1xuIik7Ci0JCXJldHVybiAxOwotCX0KKwkJaWYgKG9jdGVvbl93YWl0X2Zvcl9ib290bG9hZGVyKG9jdGVvbl9kZXYsIDEwMDApKSB7CisJCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJCb2FyZCBub3QgcmVzcG9uZGluZ1xuIik7CisJCQlyZXR1cm4gMTsKKwkJfQogCi0JLyogRGl2ZXJ0IHVib290IHRvIHRha2UgY29tbWFuZHMgZnJvbSBob3N0IGluc3RlYWQuICovCi0JcmV0ID0gb2N0ZW9uX2NvbnNvbGVfc2VuZF9jbWQob2N0ZW9uX2RldiwgYm9vdGNtZCwgNTApOworCQkvKiBEaXZlcnQgdWJvb3QgdG8gdGFrZSBjb21tYW5kcyBmcm9tIGhvc3QgaW5zdGVhZC4gKi8KKwkJcmV0ID0gb2N0ZW9uX2NvbnNvbGVfc2VuZF9jbWQob2N0ZW9uX2RldiwgYm9vdGNtZCwgNTApOwogCi0JZGV2X2RiZygmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiSW5pdGlhbGl6aW5nIGNvbnNvbGVzXG4iKTsKLQlyZXQgPSBvY3Rlb25faW5pdF9jb25zb2xlcyhvY3Rlb25fZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkNvdWxkIG5vdCBhY2Nlc3MgYm9hcmQgY29uc29sZXNcbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0ID0gb2N0ZW9uX2FkZF9jb25zb2xlKG9jdGVvbl9kZXYsIDApOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiQ291bGQgbm90IGFjY2VzcyBib2FyZCBjb25zb2xlXG4iKTsKLQkJcmV0dXJuIDE7Ci0JfQorCQlkZXZfZGJnKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJJbml0aWFsaXppbmcgY29uc29sZXNcbiIpOworCQlyZXQgPSBvY3Rlb25faW5pdF9jb25zb2xlcyhvY3Rlb25fZGV2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiQ291bGQgbm90IGFjY2VzcyBib2FyZCBjb25zb2xlc1xuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlyZXQgPSBvY3Rlb25fYWRkX2NvbnNvbGUob2N0ZW9uX2RldiwgMCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkNvdWxkIG5vdCBhY2Nlc3MgYm9hcmQgY29uc29sZVxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQogCi0JYXRvbWljX3NldCgmb2N0ZW9uX2Rldi0+c3RhdHVzLCBPQ1RfREVWX0NPTlNPTEVfSU5JVF9ET05FKTsKKwkJYXRvbWljX3NldCgmb2N0ZW9uX2Rldi0+c3RhdHVzLCBPQ1RfREVWX0NPTlNPTEVfSU5JVF9ET05FKTsKIAotCWRldl9kYmcoJm9jdGVvbl9kZXYtPnBjaV9kZXYtPmRldiwgIkxvYWRpbmcgZmlybXdhcmVcbiIpOwotCXJldCA9IGxvYWRfZmlybXdhcmUob2N0ZW9uX2Rldik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJDb3VsZCBub3QgbG9hZCBmaXJtd2FyZSB0byBib2FyZFxuIik7Ci0JCXJldHVybiAxOworCQlkZXZfZGJnKCZvY3Rlb25fZGV2LT5wY2lfZGV2LT5kZXYsICJMb2FkaW5nIGZpcm13YXJlXG4iKTsKKwkJcmV0ID0gbG9hZF9maXJtd2FyZShvY3Rlb25fZGV2KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycigmb2N0ZW9uX2Rldi0+cGNpX2Rldi0+ZGV2LCAiQ291bGQgbm90IGxvYWQgZmlybXdhcmUgdG8gYm9hcmRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogc2V0IGJpdCAxIG9mIFNMSV9TQ1JBVENIXzEgdG8gaW5kaWNhdGUgdGhhdCBmaXJtd2FyZSBpcworCQkgKiBsb2FkZWQKKwkJICovCisJCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdGVvbl9kZXYpKQorCQkJb2N0ZW9uX3dyaXRlX2NzcjY0KG9jdGVvbl9kZXYsIENOMjNYWF9TTElfU0NSQVRDSDEsCisJCQkJCSAgIDJVTEwpOwogCX0KIAogCWhhbmRzaGFrZVtvY3Rlb25fZGV2LT5vY3Rlb25faWRdLmluaXRfb2sgPSAxOwpAQCAtNDA1Nyw3ICs0MzMwLDYgQEAKIAkJICAgICAgIG9jdGVvbl9kZXYtPmRyb3Fbal0tPnBrdHNfY3JlZGl0X3JlZyk7CiAKIAkvKiBQYWNrZXRzIGNhbiBzdGFydCBhcnJpdmluZyBvbiB0aGUgb3V0cHV0IHF1ZXVlcyBmcm9tIHRoaXMgcG9pbnQuICovCi0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpcXVpZGlvX2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL2xpcXVpZGlvX2NvbW1vbi5oCmluZGV4IDE5OWE4YjkuLjBkOTkwYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9saXF1aWRpb19jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vbGlxdWlkaW9fY29tbW9uLmgKQEAgLTMwLDEwICszMCwyNCBAQAogCiAjaW5jbHVkZSAib2N0ZW9uX2NvbmZpZy5oIgogCi0jZGVmaW5lIExJUVVJRElPX0JBU0VfVkVSU0lPTiAgICIxLjQiCi0jZGVmaW5lIExJUVVJRElPX01JQ1JPX1ZFUlNJT04gICIuMSIKICNkZWZpbmUgTElRVUlESU9fUEFDS0FHRSAiIgotI2RlZmluZSBMSVFVSURJT19WRVJTSU9OICAiMS40LjEiCisjZGVmaW5lIExJUVVJRElPX0JBU0VfTUFKT1JfVkVSU0lPTiAxCisjZGVmaW5lIExJUVVJRElPX0JBU0VfTUlOT1JfVkVSU0lPTiA0CisjZGVmaW5lIExJUVVJRElPX0JBU0VfTUlDUk9fVkVSU0lPTiAxCisjZGVmaW5lIExJUVVJRElPX0JBU0VfVkVSU0lPTiAgIF9fc3RyaW5naWZ5KExJUVVJRElPX0JBU0VfTUFKT1JfVkVSU0lPTikgIi4iIFwKKwkJCQlfX3N0cmluZ2lmeShMSVFVSURJT19CQVNFX01JTk9SX1ZFUlNJT04pCisjZGVmaW5lIExJUVVJRElPX01JQ1JPX1ZFUlNJT04gICIuIiBfX3N0cmluZ2lmeShMSVFVSURJT19CQVNFX01JQ1JPX1ZFUlNJT04pCisjZGVmaW5lIExJUVVJRElPX1ZFUlNJT04gICAgICAgIExJUVVJRElPX1BBQ0tBR0UgXAorCQkJCV9fc3RyaW5naWZ5KExJUVVJRElPX0JBU0VfTUFKT1JfVkVSU0lPTikgIi4iIFwKKwkJCQlfX3N0cmluZ2lmeShMSVFVSURJT19CQVNFX01JTk9SX1ZFUlNJT04pIFwKKwkJCQkiLiIgX19zdHJpbmdpZnkoTElRVUlESU9fQkFTRV9NSUNST19WRVJTSU9OKQorCitzdHJ1Y3QgbGlvX3ZlcnNpb24geworCXUxNiAgbWFqb3I7CisJdTE2ICBtaW5vcjsKKwl1MTYgIG1pY3JvOworCXUxNiAgcmVzZXJ2ZWQ7Cit9OwogCiAjZGVmaW5lIENPTlRST0xfSVEgMAogLyoqIFRhZyB0eXBlcyB1c2VkIGJ5IE9jdGVvbiBjb3JlcyBpbiBpdHMgd29yay4gKi8KQEAgLTIxOCw2ICsyMzIsOSBAQAogI2RlZmluZSAgIE9DVE5FVF9DTURfQUREX1ZMQU5fRklMVEVSICAweDE3CiAjZGVmaW5lICAgT0NUTkVUX0NNRF9ERUxfVkxBTl9GSUxURVIgIDB4MTgKICNkZWZpbmUgICBPQ1RORVRfQ01EX1ZYTEFOX1BPUlRfQ09ORklHIDB4MTkKKworI2RlZmluZSAgIE9DVE5FVF9DTURfSURfQUNUSVZFICAgICAgICAgMHgxYQorCiAjZGVmaW5lICAgT0NUTkVUX0NNRF9WWExBTl9QT1JUX0FERCAgICAweDAKICNkZWZpbmUgICBPQ1RORVRfQ01EX1ZYTEFOX1BPUlRfREVMICAgIDB4MQogI2RlZmluZSAgIE9DVE5FVF9DTURfUlhDU1VNX0VOQUJMRSAgICAgMHgwCkBAIC0yOTYsNiArMzEzLDEzIEBACiAKICNkZWZpbmUgICBPQ1RORVRfQ01EX1NJWkUgICAgIChzaXplb2YodW5pb24gb2N0bmV0X2NtZCkpCiAKKy8qcGtpaWgzICsgaXJoICsgb3NzcFswXSArIG9zc3BbMV0gKyByZHAgKyBycHRyID0gNDAgYnl0ZXMgKi8KKyNkZWZpbmUgTElPX1NPRlRDTURSRVNQX0lIMiAgICAgICA0MAorI2RlZmluZSBMSU9fU09GVENNRFJFU1BfSUgzICAgICAgICg0MCArIDgpCisKKyNkZWZpbmUgTElPX1BDSUNNRF9PMiAgICAgICAgICAgICAyNAorI2RlZmluZSBMSU9fUENJQ01EX08zICAgICAgICAgICAgICgyNCArIDgpCisKIC8qIEluc3RydWN0aW9uIEhlYWRlcihEUEkpIC0gZm9yIE9DVEVPTi1JSUkgbW9kZWxzICovCiBzdHJ1Y3QgIG9jdGVvbl9pbnN0cl9paDMgewogI2lmZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRApAQCAtODE0LDYgKzgzOCw4IEBACiAjZGVmaW5lIFZJVEVTU0VfUEhZX0dQSU9fRFJJVkVPRkYgMHg0CiAjZGVmaW5lIFZJVEVTU0VfUEhZX0dQSU9fSElHSCAgICAgMHgyCiAjZGVmaW5lIFZJVEVTU0VfUEhZX0dQSU9fTE9XICAgICAgMHgzCisjZGVmaW5lIExFRF9JREVOVElGSUNBVElPTl9PTiAgICAgMHgxCisjZGVmaW5lIExFRF9JREVOVElGSUNBVElPTl9PRkYgICAgMHgwCiAKIHN0cnVjdCBvY3RfbWRpb19jbWQgewogCXU2NCBvcDsKQEAgLTgzMiw3ICs4NTgsNyBAQAogLyogaW50cm1vZDogbWF4LiBwYWNrZXRzIHRvIHRyaWdnZXIgaW50ZXJydXB0ICovCiAjZGVmaW5lIExJT19JTlRSTU9EX1JYTUFYQ05UX1RSSUdHRVIJMzg0CiAvKiBpbnRybW9kOiBtaW4uIHBhY2tldHMgdG8gdHJpZ2dlciBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgTElPX0lOVFJNT0RfUlhNSU5DTlRfVFJJR0dFUgkxCisjZGVmaW5lIExJT19JTlRSTU9EX1JYTUlOQ05UX1RSSUdHRVIJMAogLyogaW50cm1vZDogbWF4LiB0aW1lIHRvIHRyaWdnZXIgaW50ZXJydXB0ICovCiAjZGVmaW5lIExJT19JTlRSTU9EX1JYTUFYVE1SX1RSSUdHRVIJMTI4CiAvKiA2Nnh4OmludHJtb2Q6IG1pbi4gdGltZSB0byB0cmlnZ2VyIGludGVycnVwdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9jb25maWcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fY29uZmlnLmgKaW5kZXggYjMzOTZlMy4uYzc2NTU2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9jb25maWcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2NvbmZpZy5oCkBAIC02NCw2ICs2NCwzNCBAQAogI2RlZmluZSAgIERFRkFVTFRfTlVNX05JQ19QT1JUU182OFhYICAgNAogI2RlZmluZSAgIERFRkFVTFRfTlVNX05JQ19QT1JUU182OFhYXzIxME5WICAyCiAKKy8qIENOMjN4eCAgSVEgY29uZmlndXJhdGlvbiBtYWNyb3MgKi8KKyNkZWZpbmUgICBDTjIzWFhfTUFYX1JJTkdTX1BFUl9QRl9QQVNTXzFfMCAxMgorI2RlZmluZSAgIENOMjNYWF9NQVhfUklOR1NfUEVSX1BGX1BBU1NfMV8xIDMyCisjZGVmaW5lICAgQ04yM1hYX01BWF9SSU5HU19QRVJfUEYgICAgICAgICAgNjQKKworI2RlZmluZSAgIENOMjNYWF9NQVhfSU5QVVRfUVVFVUVTCUNOMjNYWF9NQVhfUklOR1NfUEVSX1BGCisjZGVmaW5lICAgQ04yM1hYX01BWF9JUV9ERVNDUklQVE9SUwkyMDQ4CisjZGVmaW5lICAgQ04yM1hYX0RCX01JTiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSAgIENOMjNYWF9EQl9NQVggICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgICBDTjIzWFhfREJfVElNRU9VVCAgICAgICAgICAgICAxCisKKyNkZWZpbmUgICBDTjIzWFhfTUFYX09VVFBVVF9RVUVVRVMJQ04yM1hYX01BWF9SSU5HU19QRVJfUEYKKyNkZWZpbmUgICBDTjIzWFhfTUFYX09RX0RFU0NSSVBUT1JTCTIwNDgKKyNkZWZpbmUgICBDTjIzWFhfT1FfQlVGX1NJWkUJCTE1MzYKKyNkZWZpbmUgICBDTjIzWFhfT1FfUEtUU1BFUl9JTlRSCTEyOAorLyojZGVmaW5lIENBVklVTV9PTkxZX0NOMjNYWF9SWF9QRVJGKi8KKyNkZWZpbmUgICBDTjIzWFhfT1FfUkVGSUxfVEhSRVNIT0xECTEyOAorCisjZGVmaW5lICAgQ04yM1hYX09RX0lOVFJfUEtUCQk2NAorI2RlZmluZSAgIENOMjNYWF9PUV9JTlRSX1RJTUUJCTEwMAorI2RlZmluZSAgIERFRkFVTFRfTlVNX05JQ19QT1JUU18yM1hYCTEKKworI2RlZmluZSAgIENOMjNYWF9DRkdfSU9fUVVFVUVTCQlDTjIzWFhfTUFYX1JJTkdTX1BFUl9QRgorLyogUEVNcyBjb3VudCAqLworI2RlZmluZSAgIENOMjNYWF9NQVhfTUFDUwkJNAorCisjZGVmaW5lICAgQ04yM1hYX0RFRl9JUV9JTlRSX1RIUkVTSE9MRAkzMgorI2RlZmluZSAgIENOMjNYWF9ERUZfSVFfSU5UUl9CWVRFX1RIUkVTSE9MRCAgICg2NCAqIDEwMjQpCiAvKiBjb21tb24gT0NURU9OIGNvbmZpZ3VyYXRpb24gbWFjcm9zICovCiAjZGVmaW5lICAgQ042WFhYX0NGR19JT19RVUVVRVMgICAgICAgICAzMgogI2RlZmluZSAgIE9DVEVPTl8zMkJZVEVfSU5TVFIgICAgICAgICAgMzIKQEAgLTkyLDYgKzEyMCw5IEBACiAjZGVmaW5lIENGR19HRVRfSVFfREJfTUlOKGNmZykgICAgICAgICAgICAgICAgICAgKChjZmcpLT5pcS5kYl9taW4pCiAjZGVmaW5lIENGR19HRVRfSVFfREJfVElNRU9VVChjZmcpICAgICAgICAgICAgICAgKChjZmcpLT5pcS5kYl90aW1lb3V0KQogCisjZGVmaW5lIENGR19HRVRfSVFfSU5UUl9QS1QoY2ZnKSAgICAgICAgICAgICAgICAgKChjZmcpLT5pcS5pcV9pbnRyX3BrdCkKKyNkZWZpbmUgQ0ZHX1NFVF9JUV9JTlRSX1BLVChjZmcsIHZhbCkgICAgICAgICAgICAoY2ZnKS0+aXEuaXFfaW50cl9wa3QgPSB2YWwKKwogI2RlZmluZSBDRkdfR0VUX09RX01BWF9RKGNmZykgICAgICAgICAgICAgICAgICAgICgoY2ZnKS0+b3EubWF4X29xcykKICNkZWZpbmUgQ0ZHX0dFVF9PUV9JTkZPX1BUUihjZmcpICAgICAgICAgICAgICAgICAoKGNmZyktPm9xLmluZm9fcHRyKQogI2RlZmluZSBDRkdfR0VUX09RX1BLVFNfUEVSX0lOVFIoY2ZnKSAgICAgICAgICAgICgoY2ZnKS0+b3EucGt0c19wZXJfaW50cikKQEAgLTE0MCwxOSArMTcxLDI0IEBACiBlbnVtIGxpb19jYXJkX3R5cGUgewogCUxJT18yMTBTViA9IDAsIC8qIFR3byBwb3J0LCA2Nnh4ICovCiAJTElPXzIxME5WLCAgICAgLyogVHdvIHBvcnQsIDY4eHggKi8KLQlMSU9fNDEwTlYgICAgICAvKiBGb3VyIHBvcnQsIDY4eHggKi8KKwlMSU9fNDEwTlYsICAgICAvKiBGb3VyIHBvcnQsIDY4eHggKi8KKwlMSU9fMjNYWCAgICAgICAvKiAyM3h4ICovCiB9OwogCiAjZGVmaW5lIExJT18yMTBTVl9OQU1FICIyMTBzdiIKICNkZWZpbmUgTElPXzIxME5WX05BTUUgIjIxMG52IgogI2RlZmluZSBMSU9fNDEwTlZfTkFNRSAiNDEwbnYiCisjZGVmaW5lIExJT18yM1hYX05BTUUgICIyM3h4IgogCiAvKiogU3RydWN0dXJlIHRvIGRlZmluZSB0aGUgY29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzIGZvciBlYWNoIElucHV0IHF1ZXVlLgogICogIEFwcGxpY2FibGUgdG8gYWxsIE9jdGVvbiBwcm9jZXNzb3JzCiAgKiovCiBzdHJ1Y3Qgb2N0ZW9uX2lxX2NvbmZpZyB7CiAjaWZkZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECi0JdTY0IHJlc2VydmVkOjMyOworCXU2NCByZXNlcnZlZDoxNjsKKworCS8qKiBUeCBpbnRlcnJ1cHQgcGFja2V0cy4gQXBwbGljYWJsZSB0byAyM3h4IG9ubHkgKi8KKwl1NjQgaXFfaW50cl9wa3Q6MTY7CiAKIAkvKiogTWluaW11bSB0aWNrcyB0byB3YWl0IGJlZm9yZSBjaGVja2luZyBmb3IgcGVuZGluZyBpbnN0cnVjdGlvbnMuICovCiAJdTY0IGRiX3RpbWVvdXQ6MTY7CkBAIC0xOTIsNyArMjI4LDEwIEBACiAJLyoqIE1pbmltdW0gdGlja3MgdG8gd2FpdCBiZWZvcmUgY2hlY2tpbmcgZm9yIHBlbmRpbmcgaW5zdHJ1Y3Rpb25zLiAqLwogCXU2NCBkYl90aW1lb3V0OjE2OwogCi0JdTY0IHJlc2VydmVkOjMyOworCS8qKiBUeCBpbnRlcnJ1cHQgcGFja2V0cy4gQXBwbGljYWJsZSB0byAyM3h4IG9ubHkgKi8KKwl1NjQgaXFfaW50cl9wa3Q6MTY7CisKKwl1NjQgcmVzZXJ2ZWQ6MTY7CiAjZW5kaWYKIH07CiAKQEAgLTQxNiwxMSArNDU1LDE1IEBACiAjZGVmaW5lIERJU1BBVENIX0xJU1RfU0laRSAgICAgICAgICAgICAgICAgICAgICBCSVQoT1BDT0RFX01BU0tfQklUUykKIAogLyogTWF4aW11bSBudW1iZXIgb2YgT2N0ZW9uIEluc3RydWN0aW9uIChjb21tYW5kKSBxdWV1ZXMgKi8KLSNkZWZpbmUgTUFYX09DVEVPTl9JTlNUUl9RVUVVRVMob2N0KSAgICAgICAgIENONlhYWF9NQVhfSU5QVVRfUVVFVUVTCi0vKiBNYXhpbXVtIG51bWJlciBvZiBPY3Rlb24gT3V0cHV0IHF1ZXVlcyAqLwotI2RlZmluZSBNQVhfT0NURU9OX09VVFBVVF9RVUVVRVMob2N0KSAgICAgICAgIENONlhYWF9NQVhfT1VUUFVUX1FVRVVFUworI2RlZmluZSBNQVhfT0NURU9OX0lOU1RSX1FVRVVFUyhvY3QpCQlcCisJCShPQ1RFT05fQ04yM1hYX1BGKG9jdCkgPyBDTjIzWFhfTUFYX0lOUFVUX1FVRVVFUyA6IFwKKwkJCQkJQ042WFhYX01BWF9JTlBVVF9RVUVVRVMpCiAKLSNkZWZpbmUgTUFYX1BPU1NJQkxFX09DVEVPTl9JTlNUUl9RVUVVRVMgICAgICAgQ042WFhYX01BWF9JTlBVVF9RVUVVRVMKLSNkZWZpbmUgTUFYX1BPU1NJQkxFX09DVEVPTl9PVVRQVVRfUVVFVUVTICAgICAgQ042WFhYX01BWF9PVVRQVVRfUVVFVUVTCisvKiBNYXhpbXVtIG51bWJlciBvZiBPY3Rlb24gSW5zdHJ1Y3Rpb24gKGNvbW1hbmQpIHF1ZXVlcyAqLworI2RlZmluZSBNQVhfT0NURU9OX09VVFBVVF9RVUVVRVMob2N0KQkJXAorCQkoT0NURU9OX0NOMjNYWF9QRihvY3QpID8gQ04yM1hYX01BWF9PVVRQVVRfUVVFVUVTIDogXAorCQkJCQlDTjZYWFhfTUFYX09VVFBVVF9RVUVVRVMpCiAKKyNkZWZpbmUgTUFYX1BPU1NJQkxFX09DVEVPTl9JTlNUUl9RVUVVRVMJQ04yM1hYX01BWF9JTlBVVF9RVUVVRVMKKyNkZWZpbmUgTUFYX1BPU1NJQkxFX09DVEVPTl9PVVRQVVRfUVVFVUVTCUNOMjNYWF9NQVhfT1VUUFVUX1FVRVVFUwogI2VuZGlmIC8qIF9fT0NURU9OX0NPTkZJR19IX18gICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2NvbnNvbGUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fY29uc29sZS5jCmluZGV4IGJiYjUwZWEuLjAxYTUwZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fY29uc29sZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fY29uc29sZS5jCkBAIC0yNSwxMiArMjUsMTMgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CiAjaW5jbHVkZSAibGlxdWlkaW9fY29tbW9uLmgiCiAjaW5jbHVkZSAib2N0ZW9uX2Ryb3EuaCIKICNpbmNsdWRlICJvY3Rlb25faXEuaCIKICNpbmNsdWRlICJyZXNwb25zZV9tYW5hZ2VyLmgiCiAjaW5jbHVkZSAib2N0ZW9uX2RldmljZS5oIgotI2luY2x1ZGUgIm9jdGVvbl9tYWluLmgiCisjaW5jbHVkZSAibGlxdWlkaW9faW1hZ2UuaCIKICNpbmNsdWRlICJvY3Rlb25fbWVtX29wcy5oIgogCiBzdGF0aWMgdm9pZCBvY3Rlb25fcmVtb3RlX2xvY2sodm9pZCk7CkBAIC00MCw2ICs0MSwxMCBAQAogCQkJCQkgICAgIHUzMiBmbGFncyk7CiBzdGF0aWMgaW50IG9jdGVvbl9jb25zb2xlX3JlYWQoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgdTMyIGNvbnNvbGVfbnVtLAogCQkJICAgICAgIGNoYXIgKmJ1ZmZlciwgdTMyIGJ1Zl9zaXplKTsKK3N0YXRpYyB1MzIgY29uc29sZV9iaXRtYXNrOworbW9kdWxlX3BhcmFtKGNvbnNvbGVfYml0bWFzaywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoY29uc29sZV9iaXRtYXNrLAorCQkgIkJpdG1hc2sgaW5kaWNhdGluZyB3aGljaCBjb25zb2xlcyBoYXZlIGRlYnVnIG91dHB1dCByZWRpcmVjdGVkIHRvIHN5c2xvZy4iKTsKIAogI2RlZmluZSBNSU4oYSwgYikgbWluKChhKSwgKGIpKQogI2RlZmluZSBDQVNUX1VMTCh2KSAoKHU2NCkodikpCkBAIC0xNzcsNiArMTgyLDE1IEBACiAJX19jdm14X2Jvb3RtZW1fZGVzY19nZXQob2N0LCBhZGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCW9mZnNldG9mKHN0cnVjdCBjdm14X2Jvb3RtZW1fbmFtZWRfYmxvY2tfZGVzYywgZmllbGQpLCAgIFwKIAkJU0laRU9GX0ZJRUxEKHN0cnVjdCBjdm14X2Jvb3RtZW1fbmFtZWRfYmxvY2tfZGVzYywgZmllbGQpKQorLyoqCisgKiBcYnJpZWYgZGV0ZXJtaW5lcyBpZiBhIGdpdmVuIGNvbnNvbGUgaGFzIGRlYnVnIGVuYWJsZWQuCisgKiBAcGFyYW0gY29uc29sZSBjb25zb2xlIHRvIGNoZWNrCisgKiBAcmV0dXJucyAgMSA9IGVuYWJsZWQuIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgb2N0ZW9uX2NvbnNvbGVfZGVidWdfZW5hYmxlZCh1MzIgY29uc29sZSkKK3sKKwlyZXR1cm4gKGNvbnNvbGVfYml0bWFzayA+PiAoY29uc29sZSkpICYgMHgxOworfQogCiAvKioKICAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBnZXQgbWFjcm9zIGRlZmluZWQKQEAgLTcwOSwzICs3MjMsMTA0IEBACiAKIAlyZXR1cm4gYnl0ZXNfdG9fcmVhZDsKIH0KKworI2RlZmluZSBGQlVGX1NJWkUJKDQgKiAxMDI0ICogMTAyNCkKK3U4IGZidWZbRkJVRl9TSVpFXTsKKworaW50IG9jdGVvbl9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgICAgc2l6ZV90IHNpemUpCit7CisJaW50IHJldCA9IDA7CisJdTggKnAgPSBmYnVmOworCXUzMiBjcmMzMl9yZXN1bHQ7CisJdTY0IGxvYWRfYWRkcjsKKwl1MzIgaW1hZ2VfbGVuOworCXN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIgKmg7CisJdTMyIGksIHJlbTsKKworCWlmIChzaXplIDwgc2l6ZW9mKHN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIpKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiRmlybXdhcmUgZmlsZSB0b28gc21hbGwgKCVkIDwgJWQpLlxuIiwKKwkJCSh1MzIpc2l6ZSwKKwkJCSh1MzIpc2l6ZW9mKHN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaCA9IChzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyICopZGF0YTsKKworCWlmIChiZTMyX3RvX2NwdShoLT5tYWdpYykgIT0gTElPX05JQ19NQUdJQykgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlVucmVjb2duaXplZCBmaXJtd2FyZSBmaWxlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNyYzMyX3Jlc3VsdCA9IGNyYzMyKCh1bnNpZ25lZCBpbnQpfjAsIGRhdGEsCisJCQkgICAgIHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyKSAtCisJCQkgICAgIHNpemVvZih1MzIpKSBeIH4wVTsKKwlpZiAoY3JjMzJfcmVzdWx0ICE9IGJlMzJfdG9fY3B1KGgtPmNyYzMyKSkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIkZpcm13YXJlIENSQyBtaXNtYXRjaCAoMHglMDh4ICE9IDB4JTA4eCkuXG4iLAorCQkJY3JjMzJfcmVzdWx0LCBiZTMyX3RvX2NwdShoLT5jcmMzMikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RybmNtcChMSVFVSURJT19QQUNLQUdFLCBoLT52ZXJzaW9uLCBzdHJsZW4oTElRVUlESU9fUEFDS0FHRSkpKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiVW5tYXRjaGVkIGZpcm13YXJlIHBhY2thZ2UgdHlwZS4gRXhwZWN0ZWQgJXMsIGdvdCAlcy5cbiIsCisJCQlMSVFVSURJT19QQUNLQUdFLCBoLT52ZXJzaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG1lbWNtcChMSVFVSURJT19CQVNFX1ZFUlNJT04sIGgtPnZlcnNpb24gKyBzdHJsZW4oTElRVUlESU9fUEFDS0FHRSksCisJCSAgIHN0cmxlbihMSVFVSURJT19CQVNFX1ZFUlNJT04pKSkgeworCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlVubWF0Y2hlZCBmaXJtd2FyZSB2ZXJzaW9uLiBFeHBlY3RlZCAlcy54LCBnb3QgJXMuXG4iLAorCQkJTElRVUlESU9fQkFTRV9WRVJTSU9OLAorCQkJaC0+dmVyc2lvbiArIHN0cmxlbihMSVFVSURJT19QQUNLQUdFKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChiZTMyX3RvX2NwdShoLT5udW1faW1hZ2VzKSA+IExJT19NQVhfSU1BR0VTKSB7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiVG9vIG1hbnkgaW1hZ2VzIGluIGZpcm13YXJlIGZpbGUgKCVkKS5cbiIsCisJCQliZTMyX3RvX2NwdShoLT5udW1faW1hZ2VzKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIkZpcm13YXJlIHZlcnNpb246ICVzXG4iLCBoLT52ZXJzaW9uKTsKKwlzbnByaW50ZihvY3QtPmZ3X2luZm8ubGlxdWlkaW9fZmlybXdhcmVfdmVyc2lvbiwgMzIsICJMSVFVSURJTzogJXMiLAorCQkgaC0+dmVyc2lvbik7CisKKwlkYXRhICs9IHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyKTsKKworCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzOiBMb2FkaW5nICVkIGltYWdlc1xuIiwgX19mdW5jX18sCisJCSBiZTMyX3RvX2NwdShoLT5udW1faW1hZ2VzKSk7CisJLyogbG9hZCBhbGwgaW1hZ2VzICovCisJZm9yIChpID0gMDsgaSA8IGJlMzJfdG9fY3B1KGgtPm51bV9pbWFnZXMpOyBpKyspIHsKKwkJbG9hZF9hZGRyID0gYmU2NF90b19jcHUoaC0+ZGVzY1tpXS5hZGRyKTsKKwkJaW1hZ2VfbGVuID0gYmUzMl90b19jcHUoaC0+ZGVzY1tpXS5sZW4pOworCisJCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIkxvYWRpbmcgZmlybXdhcmUgJWQgYXQgJWxseFxuIiwKKwkJCSBpbWFnZV9sZW4sIGxvYWRfYWRkcik7CisKKwkJLyogV3JpdGUgaW4gNE1CIGNodW5rcyovCisJCXJlbSA9IGltYWdlX2xlbjsKKworCQl3aGlsZSAocmVtKSB7CisJCQlpZiAocmVtIDwgRkJVRl9TSVpFKQorCQkJCXNpemUgPSByZW07CisJCQllbHNlCisJCQkJc2l6ZSA9IEZCVUZfU0laRTsKKworCQkJbWVtY3B5KHAsIGRhdGEsIHNpemUpOworCisJCQkvKiBkb3dubG9hZCB0aGUgaW1hZ2UgKi8KKwkJCW9jdGVvbl9wY2lfd3JpdGVfY29yZV9tZW0ob2N0LCBsb2FkX2FkZHIsIHAsICh1MzIpc2l6ZSk7CisKKwkJCWRhdGEgKz0gc2l6ZTsKKwkJCXJlbSAtPSAodTMyKXNpemU7CisJCQlsb2FkX2FkZHIgKz0gc2l6ZTsKKwkJfQorCX0KKwlkZXZfaW5mbygmb2N0LT5wY2lfZGV2LT5kZXYsICJXcml0aW5nIGJvb3QgY29tbWFuZDogJXNcbiIsCisJCSBoLT5ib290Y21kKTsKKworCS8qIEludm9rZSB0aGUgYm9vdGNtZCAqLworCXJldCA9IG9jdGVvbl9jb25zb2xlX3NlbmRfY21kKG9jdCwgaC0+Ym9vdGNtZCwgNTApOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2RldmljZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kZXZpY2UuYwppbmRleCAwZWI1MDRhLi41ODZiNjg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2RldmljZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZGV2aWNlLmMKQEAgLTIwLDcgKzIwLDYgQEAKICogQ29udGFjdCBDYXZpdW0sIEluYy4gZm9yIG1vcmUgaW5mb3JtYXRpb24KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSAibGlxdWlkaW9fY29tbW9uLmgiCkBAIC0zMiw4ICszMSw3IEBACiAjaW5jbHVkZSAib2N0ZW9uX25ldHdvcmsuaCIKICNpbmNsdWRlICJjbjY2eHhfcmVncy5oIgogI2luY2x1ZGUgImNuNjZ4eF9kZXZpY2UuaCIKLSNpbmNsdWRlICJsaXF1aWRpb19pbWFnZS5oIgotI2luY2x1ZGUgIm9jdGVvbl9tZW1fb3BzLmgiCisjaW5jbHVkZSAiY24yM3h4X3BmX2RldmljZS5oIgogCiAvKiogRGVmYXVsdCBjb25maWd1cmF0aW9uCiAgKiAgZm9yIENONjZYWCBPQ1RFT04gTW9kZWxzLgpAQCAtNDIwLDYgKzQxOCwxMDggQEAKIAksCiB9OwogCitzdGF0aWMgc3RydWN0IG9jdGVvbl9jb25maWcgZGVmYXVsdF9jbjIzeHhfY29uZiA9IHsKKwkuY2FyZF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBMSU9fMjNYWCwKKwkuY2FyZF9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBMSU9fMjNYWF9OQU1FLAorCS8qKiBJUSBhdHRyaWJ1dGVzICovCisJLmlxID0geworCQkubWF4X2lxcwkJPSBDTjIzWFhfQ0ZHX0lPX1FVRVVFUywKKwkJLnBlbmRpbmdfbGlzdF9zaXplCT0gKENOMjNYWF9NQVhfSVFfREVTQ1JJUFRPUlMgKgorCQkJCQkgICBDTjIzWFhfQ0ZHX0lPX1FVRVVFUyksCisJCS5pbnN0cl90eXBlCQk9IE9DVEVPTl82NEJZVEVfSU5TVFIsCisJCS5kYl9taW4JCQk9IENOMjNYWF9EQl9NSU4sCisJCS5kYl90aW1lb3V0CQk9IENOMjNYWF9EQl9USU1FT1VULAorCQkuaXFfaW50cl9wa3QJCT0gQ04yM1hYX0RFRl9JUV9JTlRSX1RIUkVTSE9MRCwKKwl9LAorCisJLyoqIE9RIGF0dHJpYnV0ZXMgKi8KKwkub3EgPSB7CisJCS5tYXhfb3FzCQk9IENOMjNYWF9DRkdfSU9fUVVFVUVTLAorCQkuaW5mb19wdHIJCT0gT0NURU9OX09RX0lORk9QVFJfTU9ERSwKKwkJLnBrdHNfcGVyX2ludHIJPSBDTjIzWFhfT1FfUEtUU1BFUl9JTlRSLAorCQkucmVmaWxsX3RocmVzaG9sZAk9IENOMjNYWF9PUV9SRUZJTF9USFJFU0hPTEQsCisJCS5vcV9pbnRyX3BrdAk9IENOMjNYWF9PUV9JTlRSX1BLVCwKKwkJLm9xX2ludHJfdGltZQk9IENOMjNYWF9PUV9JTlRSX1RJTUUsCisJfSwKKworCS5udW1fbmljX3BvcnRzCQkJCT0gREVGQVVMVF9OVU1fTklDX1BPUlRTXzIzWFgsCisJLm51bV9kZWZfcnhfZGVzY3MJCQk9IENOMjNYWF9NQVhfT1FfREVTQ1JJUFRPUlMsCisJLm51bV9kZWZfdHhfZGVzY3MJCQk9IENOMjNYWF9NQVhfSVFfREVTQ1JJUFRPUlMsCisJLmRlZl9yeF9idWZfc2l6ZQkJCT0gQ04yM1hYX09RX0JVRl9TSVpFLAorCisJLyogRm9yIGV0aGVybmV0IGludGVyZmFjZSAwOiAgUG9ydCBjZmcgQXR0cmlidXRlcyAqLworCS5uaWNfaWZfY2ZnWzBdID0geworCQkvKiBNYXggVHhxczogSGFsZiBmb3IgZWFjaCBvZiB0aGUgdHdvIHBvcnRzIDptYXhfaXEvMiAqLworCQkubWF4X3R4cXMJCQk9IE1BWF9UWFFTX1BFUl9JTlRGLAorCisJCS8qIEFjdHVhbCBjb25maWd1cmVkIHZhbHVlLiBSYW5nZSBjb3VsZCBiZTogMS4uLm1heF90eHFzICovCisJCS5udW1fdHhxcwkJCT0gREVGX1RYUVNfUEVSX0lOVEYsCisKKwkJLyogTWF4IFJ4cXM6IEhhbGYgZm9yIGVhY2ggb2YgdGhlIHR3byBwb3J0cyA6bWF4X29xLzIgICovCisJCS5tYXhfcnhxcwkJCT0gTUFYX1JYUVNfUEVSX0lOVEYsCisKKwkJLyogQWN0dWFsIGNvbmZpZ3VyZWQgdmFsdWUuIFJhbmdlIGNvdWxkIGJlOiAxLi4ubWF4X3J4cXMgKi8KKwkJLm51bV9yeHFzCQkJPSBERUZfUlhRU19QRVJfSU5URiwKKworCQkvKiBOdW0gb2YgZGVzYyBmb3IgcnggcmluZ3MgKi8KKwkJLm51bV9yeF9kZXNjcwkJCT0gQ04yM1hYX01BWF9PUV9ERVNDUklQVE9SUywKKworCQkvKiBOdW0gb2YgZGVzYyBmb3IgdHggcmluZ3MgKi8KKwkJLm51bV90eF9kZXNjcwkJCT0gQ04yM1hYX01BWF9JUV9ERVNDUklQVE9SUywKKworCQkvKiBTS0Igc2l6ZSwgV2UgbmVlZCBub3QgY2hhbmdlIGJ1ZiBzaXplIGV2ZW4gZm9yIEp1bWJvIGZyYW1lcy4KKwkJICogT2N0ZW9uIGNhbiBzZW5kIGp1bWJvIGZyYW1lcyBpbiA0IGNvbnNlY3V0aXZlIGRlc2NyaXB0b3JzLAorCQkgKi8KKwkJLnJ4X2J1Zl9zaXplCQkJPSBDTjIzWFhfT1FfQlVGX1NJWkUsCisKKwkJLmJhc2VfcXVldWUJCQk9IEJBU0VfUVVFVUVfTk9UX1JFUVVFU1RFRCwKKworCQkuZ214X3BvcnRfaWQJCQk9IDAsCisJfSwKKworCS5uaWNfaWZfY2ZnWzFdID0geworCQkvKiBNYXggVHhxczogSGFsZiBmb3IgZWFjaCBvZiB0aGUgdHdvIHBvcnRzIDptYXhfaXEvMiAqLworCQkubWF4X3R4cXMJCQk9IE1BWF9UWFFTX1BFUl9JTlRGLAorCisJCS8qIEFjdHVhbCBjb25maWd1cmVkIHZhbHVlLiBSYW5nZSBjb3VsZCBiZTogMS4uLm1heF90eHFzICovCisJCS5udW1fdHhxcwkJCT0gREVGX1RYUVNfUEVSX0lOVEYsCisKKwkJLyogTWF4IFJ4cXM6IEhhbGYgZm9yIGVhY2ggb2YgdGhlIHR3byBwb3J0cyA6bWF4X29xLzIgICovCisJCS5tYXhfcnhxcwkJCT0gTUFYX1JYUVNfUEVSX0lOVEYsCisKKwkJLyogQWN0dWFsIGNvbmZpZ3VyZWQgdmFsdWUuIFJhbmdlIGNvdWxkIGJlOiAxLi4ubWF4X3J4cXMgKi8KKwkJLm51bV9yeHFzCQkJPSBERUZfUlhRU19QRVJfSU5URiwKKworCQkvKiBOdW0gb2YgZGVzYyBmb3IgcnggcmluZ3MgKi8KKwkJLm51bV9yeF9kZXNjcwkJCT0gQ04yM1hYX01BWF9PUV9ERVNDUklQVE9SUywKKworCQkvKiBOdW0gb2YgZGVzYyBmb3IgdHggcmluZ3MgKi8KKwkJLm51bV90eF9kZXNjcwkJCT0gQ04yM1hYX01BWF9JUV9ERVNDUklQVE9SUywKKworCQkvKiBTS0Igc2l6ZSwgV2UgbmVlZCBub3QgY2hhbmdlIGJ1ZiBzaXplIGV2ZW4gZm9yIEp1bWJvIGZyYW1lcy4KKwkJICogT2N0ZW9uIGNhbiBzZW5kIGp1bWJvIGZyYW1lcyBpbiA0IGNvbnNlY3V0aXZlIGRlc2NyaXB0b3JzLAorCQkgKi8KKwkJLnJ4X2J1Zl9zaXplCQkJPSBDTjIzWFhfT1FfQlVGX1NJWkUsCisKKwkJLmJhc2VfcXVldWUJCQk9IEJBU0VfUVVFVUVfTk9UX1JFUVVFU1RFRCwKKworCQkuZ214X3BvcnRfaWQJCQk9IDEsCisJfSwKKworCS5taXNjCQkJCQk9IHsKKwkJLyogSG9zdCBkcml2ZXIgbGluayBxdWVyeSBpbnRlcnZhbCAqLworCQkub2N0X2xpbmtfcXVlcnlfaW50ZXJ2YWwJPSAxMDAsCisKKwkJLyogT2N0ZW9uIGxpbmsgcXVlcnkgaW50ZXJ2YWwgKi8KKwkJLmhvc3RfbGlua19xdWVyeV9pbnRlcnZhbAk9IDUwMCwKKworCQkuZW5hYmxlX3NsaV9vcV9icAkJPSAwLAorCisJCS8qIENvbnRyb2wgcXVldWUgZ3JvdXAgKi8KKwkJLmN0cmxxX2dycAkJCT0gMSwKKwl9Cit9OworCiBlbnVtIHsKIAlPQ1RFT05fQ09ORklHX1RZUEVfREVGQVVMVCA9IDAsCiAJTlVNX09DVEVPTl9DT05GUywKQEAgLTQ4Nyw2ICs1ODcsOCBAQAogCQl9IGVsc2UgaWYgKChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NONjhYWCkgJiYKIAkJCSAgIChjYXJkX3R5cGUgPT0gTElPXzQxME5WKSkgewogCQkJcmV0ID0gICh2b2lkICopJmRlZmF1bHRfY242OHh4X2NvbmY7CisJCX0gZWxzZSBpZiAob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjIzWFhfUEZfVklEKSB7CisJCQlyZXQgPSAgKHZvaWQgKikmZGVmYXVsdF9jbjIzeHhfY29uZjsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNTAxLDcgKzYwMyw4IEBACiAJY2FzZSBPQ1RFT05fQ042NlhYOgogCWNhc2UgT0NURU9OX0NONjhYWDoKIAkJcmV0dXJuIGxpb192YWxpZGF0ZV9jbjZ4eHhfY29uZmlnX2luZm8ob2N0LCBjb25mKTsKLQorCWNhc2UgT0NURU9OX0NOMjNYWF9QRl9WSUQ6CisJCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTU0MSwxMDcgKzY0NCw2IEBACiAJcmV0dXJuIG9jdF9kZXZfYXBwX3N0cltDVk1fRFJWX0lOVkFMSURfQVBQIC0gQ1ZNX0RSVl9BUFBfU1RBUlRdOwogfQogCi11OCBmYnVmWzQgKiAxMDI0ICogMTAyNF07Ci0KLWludCBvY3Rlb25fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwgY29uc3QgdTggKmRhdGEsCi0JCQkgICAgIHNpemVfdCBzaXplKQotewotCWludCByZXQgPSAwOwotCXU4ICpwID0gZmJ1ZjsKLQl1MzIgY3JjMzJfcmVzdWx0OwotCXU2NCBsb2FkX2FkZHI7Ci0JdTMyIGltYWdlX2xlbjsKLQlzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyICpoOwotCXUzMiBpLCByZW0sIGJhc2VfbGVuID0gc3RybGVuKExJUVVJRElPX0JBU0VfVkVSU0lPTik7Ci0JY2hhciAqYmFzZTsKLQotCWlmIChzaXplIDwgc2l6ZW9mKHN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIpKSB7Ci0JCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiRmlybXdhcmUgZmlsZSB0b28gc21hbGwgKCVkIDwgJWQpLlxuIiwKLQkJCSh1MzIpc2l6ZSwKLQkJCSh1MzIpc2l6ZW9mKHN0cnVjdCBvY3Rlb25fZmlybXdhcmVfZmlsZV9oZWFkZXIpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaCA9IChzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyICopZGF0YTsKLQotCWlmIChiZTMyX3RvX2NwdShoLT5tYWdpYykgIT0gTElPX05JQ19NQUdJQykgewotCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlVucmVjb2duaXplZCBmaXJtd2FyZSBmaWxlLlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNyYzMyX3Jlc3VsdCA9IGNyYzMyKCh1bnNpZ25lZCBpbnQpfjAsIGRhdGEsCi0JCQkgICAgIHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyKSAtCi0JCQkgICAgIHNpemVvZih1MzIpKSBeIH4wVTsKLQlpZiAoY3JjMzJfcmVzdWx0ICE9IGJlMzJfdG9fY3B1KGgtPmNyYzMyKSkgewotCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIkZpcm13YXJlIENSQyBtaXNtYXRjaCAoMHglMDh4ICE9IDB4JTA4eCkuXG4iLAotCQkJY3JjMzJfcmVzdWx0LCBiZTMyX3RvX2NwdShoLT5jcmMzMikpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc3RybmNtcChMSVFVSURJT19QQUNLQUdFLCBoLT52ZXJzaW9uLCBzdHJsZW4oTElRVUlESU9fUEFDS0FHRSkpKSB7Ci0JCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiVW5tYXRjaGVkIGZpcm13YXJlIHBhY2thZ2UgdHlwZS4gRXhwZWN0ZWQgJXMsIGdvdCAlcy5cbiIsCi0JCQlMSVFVSURJT19QQUNLQUdFLCBoLT52ZXJzaW9uKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JYmFzZSA9IGgtPnZlcnNpb24gKyBzdHJsZW4oTElRVUlESU9fUEFDS0FHRSk7Ci0JcmV0ID0gbWVtY21wKExJUVVJRElPX0JBU0VfVkVSU0lPTiwgYmFzZSwgYmFzZV9sZW4pOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycigmb2N0LT5wY2lfZGV2LT5kZXYsICJVbm1hdGNoZWQgZmlybXdhcmUgdmVyc2lvbi4gRXhwZWN0ZWQgJXMueCwgZ290ICVzLlxuIiwKLQkJCUxJUVVJRElPX0JBU0VfVkVSU0lPTiwgYmFzZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChiZTMyX3RvX2NwdShoLT5udW1faW1hZ2VzKSA+IExJT19NQVhfSU1BR0VTKSB7Ci0JCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiVG9vIG1hbnkgaW1hZ2VzIGluIGZpcm13YXJlIGZpbGUgKCVkKS5cbiIsCi0JCQliZTMyX3RvX2NwdShoLT5udW1faW1hZ2VzKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIkZpcm13YXJlIHZlcnNpb246ICVzXG4iLCBoLT52ZXJzaW9uKTsKLQlzbnByaW50ZihvY3QtPmZ3X2luZm8ubGlxdWlkaW9fZmlybXdhcmVfdmVyc2lvbiwgMzIsICJMSVFVSURJTzogJXMiLAotCQkgaC0+dmVyc2lvbik7Ci0KLQlkYXRhICs9IHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2Zpcm13YXJlX2ZpbGVfaGVhZGVyKTsKLQotCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIiVzOiBMb2FkaW5nICVkIGltYWdlc1xuIiwgX19mdW5jX18sCi0JCSBiZTMyX3RvX2NwdShoLT5udW1faW1hZ2VzKSk7Ci0JLyogbG9hZCBhbGwgaW1hZ2VzICovCi0JZm9yIChpID0gMDsgaSA8IGJlMzJfdG9fY3B1KGgtPm51bV9pbWFnZXMpOyBpKyspIHsKLQkJbG9hZF9hZGRyID0gYmU2NF90b19jcHUoaC0+ZGVzY1tpXS5hZGRyKTsKLQkJaW1hZ2VfbGVuID0gYmUzMl90b19jcHUoaC0+ZGVzY1tpXS5sZW4pOwotCi0JCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIkxvYWRpbmcgZmlybXdhcmUgJWQgYXQgJWxseFxuIiwKLQkJCSBpbWFnZV9sZW4sIGxvYWRfYWRkcik7Ci0KLQkJLyogV3JpdGUgaW4gNE1CIGNodW5rcyovCi0JCXJlbSA9IGltYWdlX2xlbjsKLQotCQl3aGlsZSAocmVtKSB7Ci0JCQlpZiAocmVtIDwgKDQgKiAxMDI0ICogMTAyNCkpCi0JCQkJc2l6ZSA9IHJlbTsKLQkJCWVsc2UKLQkJCQlzaXplID0gNCAqIDEwMjQgKiAxMDI0OwotCi0JCQltZW1jcHkocCwgZGF0YSwgc2l6ZSk7Ci0KLQkJCS8qIGRvd25sb2FkIHRoZSBpbWFnZSAqLwotCQkJb2N0ZW9uX3BjaV93cml0ZV9jb3JlX21lbShvY3QsIGxvYWRfYWRkciwgcCwgKHUzMilzaXplKTsKLQotCQkJZGF0YSArPSBzaXplOwotCQkJcmVtIC09ICh1MzIpc2l6ZTsKLQkJCWxvYWRfYWRkciArPSBzaXplOwotCQl9Ci0JfQotCWRldl9pbmZvKCZvY3QtPnBjaV9kZXYtPmRldiwgIldyaXRpbmcgYm9vdCBjb21tYW5kOiAlc1xuIiwKLQkJIGgtPmJvb3RjbWQpOwotCi0JLyogSW52b2tlIHRoZSBib290Y21kICovCi0JcmV0ID0gb2N0ZW9uX2NvbnNvbGVfc2VuZF9jbWQob2N0LCBoLT5ib290Y21kLCA1MCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogdm9pZCBvY3Rlb25fZnJlZV9kZXZpY2VfbWVtKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCiB7CiAJaW50IGk7CkBAIC02NzYsNiArNjc4LDkgQEAKIAkJY29uZmlnc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2NuNnh4eCk7CiAJCWJyZWFrOwogCisJY2FzZSBPQ1RFT05fQ04yM1hYX1BGX1ZJRDoKKwkJY29uZmlnc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2NuMjN4eF9wZik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2VycigiJXM6IFVua25vd24gUENJIERldmljZTogMHgleFxuIiwKIAkJICAgICAgIF9fZnVuY19fLApAQCAtNzQxLDYgKzc0Niw0NSBAQAogCXJldHVybiBvY3Q7CiB9CiAKK2ludAorb2N0ZW9uX2FsbG9jYXRlX2lvcV92ZWN0b3Ioc3RydWN0IG9jdGVvbl9kZXZpY2UgICpvY3QpCit7CisJaW50IGksIG51bV9pb3FzID0gMDsKKwlzdHJ1Y3Qgb2N0ZW9uX2lvcV92ZWN0b3IgKmlvcV92ZWN0b3I7CisJaW50IGNwdV9udW07CisJaW50IHNpemU7CisKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQludW1faW9xcyA9IG9jdC0+c3Jpb3ZfaW5mby5udW1fcGZfcmluZ3M7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgb2N0ZW9uX2lvcV92ZWN0b3IpICogbnVtX2lvcXM7CisKKwlvY3QtPmlvcV92ZWN0b3IgPSB2bWFsbG9jKHNpemUpOworCWlmICghb2N0LT5pb3FfdmVjdG9yKQorCQlyZXR1cm4gMTsKKwltZW1zZXQob2N0LT5pb3FfdmVjdG9yLCAwLCBzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2lvcXM7IGkrKykgeworCQlpb3FfdmVjdG9yCQk9ICZvY3QtPmlvcV92ZWN0b3JbaV07CisJCWlvcV92ZWN0b3ItPm9jdF9kZXYJPSBvY3Q7CisJCWlvcV92ZWN0b3ItPmlxX2luZGV4CT0gaTsKKwkJaW9xX3ZlY3Rvci0+ZHJvcV9pbmRleAk9IGk7CisKKwkJY3B1X251bSA9IGkgJSBudW1fb25saW5lX2NwdXMoKTsKKwkJY3B1bWFza19zZXRfY3B1KGNwdV9udW0sICZpb3FfdmVjdG9yLT5hZmZpbml0eV9tYXNrKTsKKworCQlpZiAob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjIzWFhfUEZfVklEKQorCQkJaW9xX3ZlY3Rvci0+aW9xX251bQk9IGkgKyBvY3QtPnNyaW92X2luZm8ucGZfc3JuOworCQllbHNlCisJCQlpb3FfdmVjdG9yLT5pb3FfbnVtCT0gaTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK29jdGVvbl9mcmVlX2lvcV92ZWN0b3Ioc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCkKK3sKKwl2ZnJlZShvY3QtPmlvcV92ZWN0b3IpOworfQorCiAvKiB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIHNldHRpbmcgdXAgdGhlIGZpcnN0IHF1ZXVlICovCiBpbnQgb2N0ZW9uX3NldHVwX2luc3RyX3F1ZXVlcyhzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0KQogewpAQCAtNzQ5LDEwICs3OTMsMTIgQEAKIAl1bmlvbiBvY3RfdHhwY2lxIHR4cGNpcTsKIAlpbnQgbnVtYV9ub2RlID0gY3B1X3RvX25vZGUoaXFfbm8gJSBudW1fb25saW5lX2NwdXMoKSk7CiAKLQkvKiB0aGlzIGNhdXNlcyBxdWV1ZSAwIHRvIGJlIGRlZmF1bHQgcXVldWUgKi8KIAlpZiAoT0NURU9OX0NONlhYWChvY3QpKQogCQludW1fZGVzY3MgPQogCQkJQ0ZHX0dFVF9OVU1fREVGX1RYX0RFU0NTKENISVBfRklFTEQob2N0LCBjbjZ4eHgsIGNvbmYpKTsKKwllbHNlIGlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCW51bV9kZXNjcyA9IENGR19HRVRfTlVNX0RFRl9UWF9ERVNDUyhDSElQX0ZJRUxEKG9jdCwgY24yM3h4X3BmLAorCQkJCQkJCQljb25mKSk7CiAKIAlvY3QtPm51bV9pcXMgPSAwOwogCkBAIC03NjksNiArODE1LDcgQEAKIAlvY3QtPmluc3RyX3F1ZXVlWzBdLT5pZmlkeCA9IDA7CiAJdHhwY2lxLnU2NCA9IDA7CiAJdHhwY2lxLnMucV9ubyA9IGlxX25vOworCXR4cGNpcS5zLnBraW5kID0gb2N0LT5wZnZmX2hzd29yZC5wa2luZDsKIAl0eHBjaXEucy51c2VfcXBnID0gMDsKIAl0eHBjaXEucy5xcGcgPSAwOwogCWlmIChvY3Rlb25faW5pdF9pbnN0cl9xdWV1ZShvY3QsIHR4cGNpcSwgbnVtX2Rlc2NzKSkgewpAQCAtNzg4LDE0ICs4MzUsMTcgQEAKIAl1MzIgb3Ffbm8gPSAwOwogCWludCBudW1hX25vZGUgPSBjcHVfdG9fbm9kZShvcV9ubyAlIG51bV9vbmxpbmVfY3B1cygpKTsKIAotCS8qIHRoaXMgY2F1c2VzIHF1ZXVlIDAgdG8gYmUgZGVmYXVsdCBxdWV1ZSAqLwogCWlmIChPQ1RFT05fQ042WFhYKG9jdCkpIHsKIAkJbnVtX2Rlc2NzID0KIAkJCUNGR19HRVRfTlVNX0RFRl9SWF9ERVNDUyhDSElQX0ZJRUxEKG9jdCwgY242eHh4LCBjb25mKSk7CiAJCWRlc2Nfc2l6ZSA9CiAJCQlDRkdfR0VUX0RFRl9SWF9CVUZfU0laRShDSElQX0ZJRUxEKG9jdCwgY242eHh4LCBjb25mKSk7CisJfSBlbHNlIGlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJbnVtX2Rlc2NzID0gQ0ZHX0dFVF9OVU1fREVGX1JYX0RFU0NTKENISVBfRklFTEQob2N0LCBjbjIzeHhfcGYsCisJCQkJCQkJCWNvbmYpKTsKKwkJZGVzY19zaXplID0gQ0ZHX0dFVF9ERUZfUlhfQlVGX1NJWkUoQ0hJUF9GSUVMRChvY3QsIGNuMjN4eF9wZiwKKwkJCQkJCQkgICAgICAgY29uZikpOwogCX0KLQogCW9jdC0+bnVtX29xcyA9IDA7CiAJb2N0LT5kcm9xWzBdID0gdm1hbGxvY19ub2RlKHNpemVvZigqb2N0LT5kcm9xWzBdKSwgbnVtYV9ub2RlKTsKIAlpZiAoIW9jdC0+ZHJvcVswXSkKQEAgLTgxMiwxMCArODYyLDEwIEBACiAKIHZvaWQgb2N0ZW9uX3NldF9pb19xdWV1ZXNfb2ZmKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCiB7Ci0JLyogRGlzYWJsZSB0aGUgaS9wIGFuZCBvL3AgcXVldWVzIGZvciB0aGlzIE9jdGVvbi4gKi8KLQotCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9JTlNUUl9FTkIsIDApOwotCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9PVVRfRU5CLCAwKTsKKwlpZiAoT0NURU9OX0NONlhYWChvY3QpKSB7CisJCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9JTlNUUl9FTkIsIDApOworCQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfT1VUX0VOQiwgMCk7CisJfQogfQogCiB2b2lkIG9jdGVvbl9zZXRfZHJvcV9wa3Rfb3Aoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCwKQEAgLTgyNSwxNCArODc1LDE2IEBACiAJdTMyIHJlZ192YWwgPSAwOwogCiAJLyogRGlzYWJsZSB0aGUgaS9wIGFuZCBvL3AgcXVldWVzIGZvciB0aGlzIE9jdGVvbi4gKi8KLQlyZWdfdmFsID0gb2N0ZW9uX3JlYWRfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfT1VUX0VOQik7CisJaWYgKE9DVEVPTl9DTjZYWFgob2N0KSkgeworCQlyZWdfdmFsID0gb2N0ZW9uX3JlYWRfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfT1VUX0VOQik7CiAKLQlpZiAoZW5hYmxlKQotCQlyZWdfdmFsID0gcmVnX3ZhbCB8ICgxIDw8IHFfbm8pOwotCWVsc2UKLQkJcmVnX3ZhbCA9IHJlZ192YWwgJiAofigxIDw8IHFfbm8pKTsKKwkJaWYgKGVuYWJsZSkKKwkJCXJlZ192YWwgPSByZWdfdmFsIHwgKDEgPDwgcV9ubyk7CisJCWVsc2UKKwkJCXJlZ192YWwgPSByZWdfdmFsICYgKH4oMSA8PCBxX25vKSk7CiAKLQlvY3Rlb25fd3JpdGVfY3NyKG9jdCwgQ042WFhYX1NMSV9QS1RfT1VUX0VOQiwgcmVnX3ZhbCk7CisJCW9jdGVvbl93cml0ZV9jc3Iob2N0LCBDTjZYWFhfU0xJX1BLVF9PVVRfRU5CLCByZWdfdmFsKTsKKwl9CiB9CiAKIGludCBvY3Rlb25faW5pdF9kaXNwYXRjaF9saXN0KHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpCkBAIC0xMDE5LDYgKzEwNzEsOSBAQAogCWlmIChPQ1RFT05fQ042WFhYKG9jdCkpCiAJCW51bV9uaWNfcG9ydHMgPQogCQkJQ0ZHX0dFVF9OVU1fTklDX1BPUlRTKENISVBfRklFTEQob2N0LCBjbjZ4eHgsIGNvbmYpKTsKKwllbHNlIGlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCW51bV9uaWNfcG9ydHMgPQorCQkJQ0ZHX0dFVF9OVU1fTklDX1BPUlRTKENISVBfRklFTEQob2N0LCBjbjIzeHhfcGYsIGNvbmYpKTsKIAogCWlmIChhdG9taWNfcmVhZCgmb2N0LT5zdGF0dXMpID49IE9DVF9ERVZfUlVOTklORykgewogCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlJlY2VpdmVkIENPUkUgT0sgd2hlbiBkZXZpY2Ugc3RhdGUgaXMgMHgleFxuIiwKQEAgLTEwNDYsNiArMTEwMSwxMiBAQAogCX0KIAlvY3QtPmZ3X2luZm8uYXBwX2NhcF9mbGFncyA9IHJlY3ZfcGt0LT5yaC5yX2NvcmVfZHJ2X2luaXQuYXBwX2NhcF9mbGFnczsKIAlvY3QtPmZ3X2luZm8uYXBwX21vZGUgPSAodTMyKXJlY3ZfcGt0LT5yaC5yX2NvcmVfZHJ2X2luaXQuYXBwX21vZGU7CisJb2N0LT5wZnZmX2hzd29yZC5hcHBfbW9kZSA9ICh1MzIpcmVjdl9wa3QtPnJoLnJfY29yZV9kcnZfaW5pdC5hcHBfbW9kZTsKKworCW9jdC0+cGZ2Zl9oc3dvcmQucGtpbmQgPSByZWN2X3BrdC0+cmgucl9jb3JlX2Rydl9pbml0LnBraW5kOworCisJZm9yIChpID0gMDsgaSA8IG9jdC0+bnVtX2lxczsgaSsrKQorCQlvY3QtPmluc3RyX3F1ZXVlW2ldLT50eHBjaXEucy5wa2luZCA9IG9jdC0+cGZ2Zl9oc3dvcmQucGtpbmQ7CiAKIAlhdG9taWNfc2V0KCZvY3QtPnN0YXR1cywgT0NUX0RFVl9DT1JFX09LKTsKIApAQCAtMTEwOCw4ICsxMTY5LDEwIEBACiAJaWYgKE9DVEVPTl9DTjZYWFgob2N0KSkgewogCQlkZWZhdWx0X29jdF9jb25mID0KIAkJCShzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyAqKShDSElQX0ZJRUxEKG9jdCwgY242eHh4LCBjb25mKSk7CisJfSBlbHNlIGlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJZGVmYXVsdF9vY3RfY29uZiA9IChzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyAqKQorCQkJKENISVBfRklFTEQob2N0LCBjbjIzeHhfcGYsIGNvbmYpKTsKIAl9Ci0KIAlyZXR1cm4gZGVmYXVsdF9vY3RfY29uZjsKIH0KIApAQCAtMTE0MSw3ICsxMjA0LDkgQEAKIAkgKiBTbyB3cml0ZSBNU0IgZmlyc3QKIAkgKi8KIAlhZGRyaGkgPSAoYWRkciA+PiAzMik7Ci0JaWYgKChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NONjZYWCkgfHwgKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ042OFhYKSkKKwlpZiAoKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ042NlhYKSB8fAorCSAgICAob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjY4WFgpIHx8CisJICAgIChvY3QtPmNoaXBfaWQgPT0gT0NURU9OX0NOMjNYWF9QRl9WSUQpKQogCQlhZGRyaGkgfD0gMHgwMDA2MDAwMDsKIAl3cml0ZWwoYWRkcmhpLCBvY3QtPnJlZ19saXN0LnBjaV93aW5fcmRfYWRkcl9oaSk7CiAKQEAgLTExODUsOCArMTI1MCwxNSBAQAogCXU2NCBsbWMwX3Jlc2V0X2N0bDsKIAogCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSBhIEREUiBpbnRlcmZhY2UgaXMgZW5hYmxlZCAqLwotCWxtYzBfcmVzZXRfY3RsID0gbGlvX3BjaV9yZWFkcShvY3QsIENONlhYWF9MTUMwX1JFU0VUX0NUTCk7Ci0JYWNjZXNzX29rYXkgPSAobG1jMF9yZXNldF9jdGwgJiBDTjZYWFhfTE1DMF9SRVNFVF9DVExfRERSM1JTVF9NQVNLKTsKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCWxtYzBfcmVzZXRfY3RsID0gbGlvX3BjaV9yZWFkcShvY3QsIENOMjNYWF9MTUMwX1JFU0VUX0NUTCk7CisJCWFjY2Vzc19va2F5ID0KKwkJCShsbWMwX3Jlc2V0X2N0bCAmIENOMjNYWF9MTUMwX1JFU0VUX0NUTF9ERFIzUlNUX01BU0spOworCX0gZWxzZSB7CisJCWxtYzBfcmVzZXRfY3RsID0gbGlvX3BjaV9yZWFkcShvY3QsIENONlhYWF9MTUMwX1JFU0VUX0NUTCk7CisJCWFjY2Vzc19va2F5ID0KKwkJCShsbWMwX3Jlc2V0X2N0bCAmIENONlhYWF9MTUMwX1JFU0VUX0NUTF9ERFIzUlNUX01BU0spOworCX0KIAogCXJldHVybiBhY2Nlc3Nfb2theSA/IDAgOiAxOwogfQpAQCAtMTIyNiwzICsxMjk4LDM5IEBACiAJCQlyZXR1cm4gb2N0ZW9uX2Rldi0+b2N0ZW9uX2lkOwogCXJldHVybiAtMTsKIH0KKwordm9pZCBsaW9fZW5hYmxlX2lycShzdHJ1Y3Qgb2N0ZW9uX2Ryb3EgKmRyb3EsIHN0cnVjdCBvY3Rlb25faW5zdHJfcXVldWUgKmlxKQoreworCXU2NCBpbnN0cl9jbnQ7CisJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCA9IE5VTEw7CisKKwkvKiB0aGUgd2hvbGUgdGhpbmcgbmVlZHMgdG8gYmUgYXRvbWljLCBpZGVhbGx5ICovCisJaWYgKGRyb3EpIHsKKwkJc3Bpbl9sb2NrX2JoKCZkcm9xLT5sb2NrKTsKKwkJd3JpdGVsKGRyb3EtPnBrdF9jb3VudCwgZHJvcS0+cGt0c19zZW50X3JlZyk7CisJCWRyb3EtPnBrdF9jb3VudCA9IDA7CisJCXNwaW5fdW5sb2NrX2JoKCZkcm9xLT5sb2NrKTsKKwkJb2N0ID0gZHJvcS0+b2N0X2RldjsKKwl9CisJaWYgKGlxKSB7CisJCXNwaW5fbG9ja19iaCgmaXEtPmxvY2spOworCQl3cml0ZWwoaXEtPnBrdF9pbl9kb25lLCBpcS0+aW5zdF9jbnRfcmVnKTsKKwkJaXEtPnBrdF9pbl9kb25lID0gMDsKKwkJc3Bpbl91bmxvY2tfYmgoJmlxLT5sb2NrKTsKKwkJb2N0ID0gaXEtPm9jdF9kZXY7CisJfQorCS8qd3JpdGUgcmVzZW5kLiBXcml0aW5nIFJFU0VORCBpbiBTTElfUEtUWF9DTlRTIHNob3VsZCBiZSBlbm91Z2gKKwkgKnRvIHRyaWdnZXIgdHggaW50ZXJydXB0cyBhcyB3ZWxsLCBpZiB0aGV5IGFyZSBwZW5kaW5nLgorCSAqLworCWlmIChvY3QgJiYgT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCWlmIChkcm9xKQorCQkJd3JpdGVxKENOMjNYWF9JTlRSX1JFU0VORCwgZHJvcS0+cGt0c19zZW50X3JlZyk7CisJCS8qd2UgcmFjZSB3aXRoIGZpcm1yd2FyZSBoZXJlLiByZWFkIGFuZCB3cml0ZSB0aGUgSU5fRE9ORV9DTlRTKi8KKwkJZWxzZSBpZiAoaXEpIHsKKwkJCWluc3RyX2NudCA9ICByZWFkcShpcS0+aW5zdF9jbnRfcmVnKTsKKwkJCXdyaXRlcSgoKGluc3RyX2NudCAmIDB4RkZGRkZGRkYwMDAwMDAwMFVMTCkgfAorCQkJCUNOMjNYWF9JTlRSX1JFU0VORCksCisJCQkgICAgICAgaXEtPmluc3RfY250X3JlZyk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2RldmljZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kZXZpY2UuaAppbmRleCAwMWVkZmI0Li5kYTE1YzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2RldmljZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZGV2aWNlLmgKQEAgLTMwLDEzICszMCwxOSBAQAogLyoqIFBDSSBWZW5kb3JJZCBEZXZpY2UgSWQgKi8KICNkZWZpbmUgIE9DVEVPTl9DTjY4WFhfUENJSUQgICAgICAgICAgMHg5MTE3N2QKICNkZWZpbmUgIE9DVEVPTl9DTjY2WFhfUENJSUQgICAgICAgICAgMHg5MjE3N2QKLQorI2RlZmluZSAgT0NURU9OX0NOMjNYWF9QQ0lJRF9QRiAgICAgICAweDk3MDIxNzdkCiAvKiogRHJpdmVyIGlkZW50aWZpZXMgY2hpcHMgYnkgdGhlc2UgSWRzLCBjcmVhdGVkIGJ5IGNsdWJiaW5nIHRvZ2V0aGVyCiAgKiAgRGV2aWNlSWQrUmV2aXNpb25JZDsgV2hlcmUgUmV2aXNpb24gSWQgaXMgbm90IHVzZWQgdG8gZGlzdGluZ3Vpc2gKICAqICBiZXR3ZWVuIGNoaXBzLCBhIHZhbHVlIG9mIDAgaXMgdXNlZCBmb3IgcmV2aXNpb24gaWQuCiAgKi8KICNkZWZpbmUgIE9DVEVPTl9DTjY4WFggICAgICAgICAgICAgICAgMHgwMDkxCiAjZGVmaW5lICBPQ1RFT05fQ042NlhYICAgICAgICAgICAgICAgIDB4MDA5MgorI2RlZmluZSAgT0NURU9OX0NOMjNYWF9QRl9WSUQgICAgICAgICAweDk3MDIKKworLyoqUmV2aXNpb25JZCBmb3IgdGhlIGNoaXBzICovCisjZGVmaW5lICBPQ1RFT05fQ04yM1hYX1JFVl8xXzAgICAgICAgIDB4MDAKKyNkZWZpbmUgIE9DVEVPTl9DTjIzWFhfUkVWXzFfMSAgICAgICAgMHgwMQorI2RlZmluZSAgT0NURU9OX0NOMjNYWF9SRVZfMl8wICAgICAgICAweDgwCiAKIC8qKiBFbmRpYW4tc3dhcCBtb2RlcyBzdXBwb3J0ZWQgYnkgT2N0ZW9uLiAqLwogZW51bSBvY3Rlb25fcGNpX3N3YXBfbW9kZSB7CkBAIC00Niw2ICs1Miw5IEBACiAJT0NURU9OX1BDSV8zMkJJVF9MV19TV0FQID0gMwogfTsKIAorI2RlZmluZSAgT0NURU9OX09VVFBVVF9JTlRSICAgKDIpCisjZGVmaW5lICBPQ1RFT05fQUxMX0lOVFIgICAgICAweGZmCisKIC8qLS0tLS0tLS0tLS0tLS0tICAgUENJIEJBUjEgaW5kZXggcmVnaXN0ZXJzIC0tLS0tLS0tLS0tLS0qLwogCiAvKiBCQVIxIE1hc2sgKi8KQEAgLTE5OCw5ICsyMDcsOSBAQAogCXZvaWQgKCpzZXR1cF9vcV9yZWdzKShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqLCB1MzIpOwogCiAJaXJxcmV0dXJuX3QgKCpwcm9jZXNzX2ludGVycnVwdF9yZWdzKSh2b2lkICopOworCXU2NCAoKm1zaXhfaW50ZXJydXB0X2hhbmRsZXIpKHZvaWQgKik7CiAJaW50ICgqc29mdF9yZXNldCkoc3RydWN0IG9jdGVvbl9kZXZpY2UgKik7CiAJaW50ICgqc2V0dXBfZGV2aWNlX3JlZ3MpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICopOwotCXZvaWQgKCpyZWluaXRfcmVncykoc3RydWN0IG9jdGVvbl9kZXZpY2UgKik7CiAJdm9pZCAoKmJhcjFfaWR4X3NldHVwKShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqLCB1NjQsIHUzMiwgaW50KTsKIAl2b2lkICgqYmFyMV9pZHhfd3JpdGUpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICosIHUzMiwgdTMyKTsKIAl1MzIgKCpiYXIxX2lkeF9yZWFkKShzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqLCB1MzIpOwpAQCAtMjA5LDEwICsyMTgsMTAgQEAKIAl2b2lkICgqZW5hYmxlX29xX3BrdF90aW1lX2ludHIpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICosIHUzMik7CiAJdm9pZCAoKmRpc2FibGVfb3FfcGt0X3RpbWVfaW50cikoc3RydWN0IG9jdGVvbl9kZXZpY2UgKiwgdTMyKTsKIAotCXZvaWQgKCplbmFibGVfaW50ZXJydXB0KSh2b2lkICopOwotCXZvaWQgKCpkaXNhYmxlX2ludGVycnVwdCkodm9pZCAqKTsKKwl2b2lkICgqZW5hYmxlX2ludGVycnVwdCkoc3RydWN0IG9jdGVvbl9kZXZpY2UgKiwgdTgpOworCXZvaWQgKCpkaXNhYmxlX2ludGVycnVwdCkoc3RydWN0IG9jdGVvbl9kZXZpY2UgKiwgdTgpOwogCi0Jdm9pZCAoKmVuYWJsZV9pb19xdWV1ZXMpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICopOworCWludCAoKmVuYWJsZV9pb19xdWV1ZXMpKHN0cnVjdCBvY3Rlb25fZGV2aWNlICopOwogCXZvaWQgKCpkaXNhYmxlX2lvX3F1ZXVlcykoc3RydWN0IG9jdGVvbl9kZXZpY2UgKik7CiB9OwogCkBAIC0yNjYsMTEgKzI3NSw3MiBAQAogCS8qIEVhY2ggaW50ZXJmYWNlIGluIHRoZSBPY3Rlb24gZGV2aWNlIGhhcyBhIG5ldHdvcmsKIAkgKiBkZXZpY2UgcG9pbnRlciAodXNlZCBmb3IgT1Mgc3BlY2lmaWMgY2FsbHMpLgogCSAqLworCWludCAgICByeF9vbjsKIAlpbnQgICAgbmFwaV9lbmFibGVkOwogCWludCAgICBnbXhwb3J0OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiB9OwogCisjZGVmaW5lIExJT19GTEFHX01TSVhfRU5BQkxFRAkweDEKKyNkZWZpbmUgTVNJWF9QT19JTlQJCTB4MQorI2RlZmluZSBNU0lYX1BJX0lOVAkJMHgyCisKK3N0cnVjdCBvY3Rlb25fcGZfdmZfaHNfd29yZCB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxECisJLyoqIFBLSU5EIHZhbHVlIGFzc2lnbmVkIGZvciB0aGUgRFBJIGludGVyZmFjZSAqLworCXU2NCAgICAgICAgcGtpbmQgOiA4OworCisJLyoqIE9DVEVPTiBjb3JlIGNsb2NrIG11bHRpcGxpZXIgICAqLworCXU2NCAgICAgICAgY29yZV90aWNzX3Blcl91cyA6IDE2OworCisJLyoqIE9DVEVPTiBjb3Byb2Nlc3NvciBjbG9jayBtdWx0aXBsaWVyICAqLworCXU2NCAgICAgICAgY29wcm9jX3RpY3NfcGVyX3VzIDogMTY7CisKKwkvKiogYXBwIHRoYXQgY3VycmVudGx5IHJ1bm5pbmcgb24gT0NURU9OICAqLworCXU2NCAgICAgICAgYXBwX21vZGUgOiA4OworCisJLyoqIFJFU0VSVkVEICovCisJdTY0IHJlc2VydmVkIDogMTY7CisKKyNlbHNlCisKKwkvKiogUkVTRVJWRUQgKi8KKwl1NjQgcmVzZXJ2ZWQgOiAxNjsKKworCS8qKiBhcHAgdGhhdCBjdXJyZW50bHkgcnVubmluZyBvbiBPQ1RFT04gICovCisJdTY0ICAgICAgICBhcHBfbW9kZSA6IDg7CisKKwkvKiogT0NURU9OIGNvcHJvY2Vzc29yIGNsb2NrIG11bHRpcGxpZXIgICovCisJdTY0ICAgICAgICBjb3Byb2NfdGljc19wZXJfdXMgOiAxNjsKKworCS8qKiBPQ1RFT04gY29yZSBjbG9jayBtdWx0aXBsaWVyICAgKi8KKwl1NjQgICAgICAgIGNvcmVfdGljc19wZXJfdXMgOiAxNjsKKworCS8qKiBQS0lORCB2YWx1ZSBhc3NpZ25lZCBmb3IgdGhlIERQSSBpbnRlcmZhY2UgKi8KKwl1NjQgICAgICAgIHBraW5kIDogODsKKyNlbmRpZgorfTsKKworc3RydWN0IG9jdGVvbl9zcmlvdl9pbmZvIHsKKwkvKiBBY3R1YWwgcmluZ3MgbGVmdCBmb3IgUEYgZGV2aWNlICovCisJdTMyCW51bV9wZl9yaW5nczsKKworCS8qIFNSTiBvZiBQRiB1c2FibGUgSU8gcXVldWVzICAgKi8KKwl1MzIJcGZfc3JuOworCS8qIHRvdGFsIHBmIHJpbmdzICovCisJdTMyCXRyczsKKworfTsKKworc3RydWN0IG9jdGVvbl9pb3FfdmVjdG9yIHsKKwlzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAgICpvY3RfZGV2OworCWludAkJICAgICAgICBpcV9pbmRleDsKKwlpbnQJCSAgICAgICAgZHJvcV9pbmRleDsKKwlpbnQJCQl2ZWN0b3I7CisJc3RydWN0IGNwdW1hc2sJCWFmZmluaXR5X21hc2s7CisJdTMyCQkJaW9xX251bTsKK307CisKIC8qKiBUaGUgT2N0ZW9uIGRldmljZS4KICAqICBFYWNoIE9jdGVvbiBkZXZpY2UgaGFzIHRoaXMgc3RydWN0dXJlIHRvIHJlcHJlc2VudCBhbGwgaXRzCiAgKiAgY29tcG9uZW50cy4KQEAgLTI5Niw3ICszNjYsNyBAQAogCS8qKiBPY3Rlb24gQ2hpcCB0eXBlLiAqLwogCXUxNiBjaGlwX2lkOwogCXUxNiByZXZfaWQ7Ci0KKwl1MTYgcGZfbnVtOwogCS8qKiBUaGlzIGRldmljZSdzIGlkIC0gc2V0IGJ5IHRoZSBkcml2ZXIuICovCiAJdTMyIG9jdGVvbl9pZDsKIApAQCAtMzA1LDcgKzM3NSw2IEBACiAKIAl1MTYgZmxhZ3M7CiAjZGVmaW5lIExJT19GTEFHX01TSV9FTkFCTEVEICAgICAgICAgICAgICAgICAgKHUzMikoMSA8PCAxKQotI2RlZmluZSBMSU9fRkxBR19NU0lYX0VOQUJMRUQgICAgICAgICAgICAgICAgICh1MzIpKDEgPDwgMikKIAogCS8qKiBUaGUgc3RhdGUgb2YgdGhpcyBkZXZpY2UgKi8KIAlhdG9taWNfdCBzdGF0dXM7CkBAIC0zOTUsNiArNDY0LDE5IEBACiAKIAl2b2lkICpwcml2OwogCisJaW50IG51bV9tc2l4X2lycXM7CisKKwl2b2lkICptc2l4X2VudHJpZXM7CisKKwlzdHJ1Y3Qgb2N0ZW9uX3NyaW92X2luZm8gc3Jpb3ZfaW5mbzsKKworCXN0cnVjdCBvY3Rlb25fcGZfdmZfaHNfd29yZCBwZnZmX2hzd29yZDsKKworCWludCBtc2l4X29uOworCisJLyoqIElPcSBpbmZvcm1hdGlvbiBvZiBpdCdzIGNvcnJlc3BvbmRpbmcgTVNJLVggaW50ZXJydXB0LiAqLworCXN0cnVjdCBvY3Rlb25faW9xX3ZlY3RvciAgICAqaW9xX3ZlY3RvcjsKKwogCWludCByeF9wYXVzZTsKIAlpbnQgdHhfcGF1c2U7CiAKQEAgLTQwMiwxMiArNDg0LDE1IEBACiAKIAkvKiBwcml2YXRlIGZsYWdzIHRvIGNvbnRyb2wgZHJpdmVyLXNwZWNpZmljIGZlYXR1cmVzIHRocm91Z2ggZXRodG9vbCAqLwogCXUzMiBwcml2X2ZsYWdzOworCisJdm9pZCAqd2F0Y2hkb2dfdGFzazsKIH07CiAKICNkZWZpbmUgIE9DVF9EUlZfT05MSU5FIDEKICNkZWZpbmUgIE9DVF9EUlZfT0ZGTElORSAyCiAjZGVmaW5lICBPQ1RFT05fQ042WFhYKG9jdCkgICAgICAgICAgICgob2N0LT5jaGlwX2lkID09IE9DVEVPTl9DTjY2WFgpIHx8IFwKIAkJCQkgICAgICAgKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ042OFhYKSkKKyNkZWZpbmUgIE9DVEVPTl9DTjIzWFhfUEYob2N0KSAgICAgICAgKG9jdC0+Y2hpcF9pZCA9PSBPQ1RFT05fQ04yM1hYX1BGX1ZJRCkKICNkZWZpbmUgQ0hJUF9GSUVMRChvY3QsIFRZUEUsIGZpZWxkKSAgICAgICAgICAgICBcCiAJKCgoc3RydWN0IG9jdGVvbl8gIyMgVFlQRSAgKikob2N0LT5jaGlwKSktPmZpZWxkKQogCkBAIC02NjEsMTMgKzc0NiwyNCBAQAogICovCiBzdHJ1Y3Qgb2N0ZW9uX2NvbmZpZyAqb2N0ZW9uX2dldF9jb25mKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3QpOwogCit2b2lkIG9jdGVvbl9mcmVlX2lvcV92ZWN0b3Ioc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdCk7CitpbnQgb2N0ZW9uX2FsbG9jYXRlX2lvcV92ZWN0b3Ioc3RydWN0IG9jdGVvbl9kZXZpY2UgICpvY3QpOwordm9pZCBsaW9fZW5hYmxlX2lycShzdHJ1Y3Qgb2N0ZW9uX2Ryb3EgKmRyb3EsIHN0cnVjdCBvY3Rlb25faW5zdHJfcXVldWUgKmlxKTsKKwogLyogTGlxdWlkSU8gZHJpdmVyIHBpdmF0ZSBmbGFncyAqLwogZW51bSB7CiAJT0NUX1BSSVZfRkxBR19UWF9CWVRFUyA9IDAsIC8qIFR4IGludGVycnVwdHMgYnkgcGVuZGluZyBieXRlIGNvdW50ICovCiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgbGlvX3NldF9wcml2X2ZsYWcoc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdGRldiwgdTMyIGZsYWcsCi0JCQkJICAgICB1MzIgdmFsKQorI2RlZmluZSBPQ1RfUFJJVl9GTEFHX0RFRkFVTFQgMHgwCisKK3N0YXRpYyBpbmxpbmUgdTMyIGxpb19nZXRfcHJpdl9mbGFnKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3RkZXYsIHUzMiBmbGFnKQoreworCXJldHVybiAhIShvY3RkZXYtPnByaXZfZmxhZ3MgJiAoMHgxIDw8IGZsYWcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpb19zZXRfcHJpdl9mbGFnKHN0cnVjdCBvY3Rlb25fZGV2aWNlICpvY3RkZXYsCisJCQkJICAgICB1MzIgZmxhZywgdTMyIHZhbCkKIHsKIAlpZiAodmFsKQogCQlvY3RkZXYtPnByaXZfZmxhZ3MgfD0gKDB4MSA8PCBmbGFnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZHJvcS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kcm9xLmMKaW5kZXggZTBhZmU0Yy4uZjYwZTUzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kcm9xLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9kcm9xLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJvY3Rlb25fbmV0d29yay5oIgogI2luY2x1ZGUgImNuNjZ4eF9yZWdzLmgiCiAjaW5jbHVkZSAiY242Nnh4X2RldmljZS5oIgorI2luY2x1ZGUgImNuMjN4eF9wZl9kZXZpY2UuaCIKIAogI2RlZmluZSAgICAgQ1ZNX01JTihkMSwgZDIpICAgICAgICAgICAoKChkMSkgPCAoZDIpKSA/IChkMSkgOiAoZDIpKQogI2RlZmluZSAgICAgQ1ZNX01BWChkMSwgZDIpICAgICAgICAgICAoKChkMSkgPiAoZDIpKSA/IChkMSkgOiAoZDIpKQpAQCAtOTIsMjIgKzkzLDI1IEBACiAJcmV0dXJuIGZuX2FyZzsKIH0KIAotLyoqIENoZWNrIGZvciBwYWNrZXRzIG9uIERyb3EuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoCi0gKiBsb2NrIGhlbGQuCisvKiogQ2hlY2sgZm9yIHBhY2tldHMgb24gRHJvcS4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLgogICogIEBwYXJhbSAgZHJvcSAtIERyb3Egb24gd2hpY2ggY291bnQgaXMgY2hlY2tlZC4KICAqICBAcmV0dXJuIFJldHVybnMgcGFja2V0IGNvdW50LgogICovCiB1MzIgb2N0ZW9uX2Ryb3FfY2hlY2tfaHdfZm9yX3BrdHMoc3RydWN0IG9jdGVvbl9kcm9xICpkcm9xKQogewogCXUzMiBwa3RfY291bnQgPSAwOworCXUzMiBsYXN0X2NvdW50OwogCiAJcGt0X2NvdW50ID0gcmVhZGwoZHJvcS0+cGt0c19zZW50X3JlZyk7Ci0JaWYgKHBrdF9jb3VudCkgewotCQlhdG9taWNfYWRkKHBrdF9jb3VudCwgJmRyb3EtPnBrdHNfcGVuZGluZyk7Ci0JCXdyaXRlbChwa3RfY291bnQsIGRyb3EtPnBrdHNfc2VudF9yZWcpOwotCX0KIAotCXJldHVybiBwa3RfY291bnQ7CisJbGFzdF9jb3VudCA9IHBrdF9jb3VudCAtIGRyb3EtPnBrdF9jb3VudDsKKwlkcm9xLT5wa3RfY291bnQgPSBwa3RfY291bnQ7CisKKwkvKiB3ZSBzaGFsbCB3cml0ZSB0byBjbnRzICBhdCBuYXBpIGlycSBlbmFibGUgb3IgZW5kIG9mIGRyb3EgdGFza2xldCAqLworCWlmIChsYXN0X2NvdW50KQorCQlhdG9taWNfYWRkKGxhc3RfY291bnQsICZkcm9xLT5wa3RzX3BlbmRpbmcpOworCisJcmV0dXJuIGxhc3RfY291bnQ7CiB9CiAKIHN0YXRpYyB2b2lkIG9jdGVvbl9kcm9xX2NvbXB1dGVfbWF4X3BhY2tldF9idWZzKHN0cnVjdCBvY3Rlb25fZHJvcSAqZHJvcSkKQEAgLTI1OSw2ICsyNjMsMTEgQEAKIAkJY19wa3RzX3Blcl9pbnRyID0gKHUzMilDRkdfR0VUX09RX1BLVFNfUEVSX0lOVFIoY29uZjZ4KTsKIAkJY19yZWZpbGxfdGhyZXNob2xkID0KIAkJCSh1MzIpQ0ZHX0dFVF9PUV9SRUZJTExfVEhSRVNIT0xEKGNvbmY2eCk7CisJfSBlbHNlIGlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJc3RydWN0IG9jdGVvbl9jb25maWcgKmNvbmYyMyA9IENISVBfRklFTEQob2N0LCBjbjIzeHhfcGYsIGNvbmYpOworCisJCWNfcGt0c19wZXJfaW50ciA9ICh1MzIpQ0ZHX0dFVF9PUV9QS1RTX1BFUl9JTlRSKGNvbmYyMyk7CisJCWNfcmVmaWxsX3RocmVzaG9sZCA9ICh1MzIpQ0ZHX0dFVF9PUV9SRUZJTExfVEhSRVNIT0xEKGNvbmYyMyk7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtNTY0LDcgKzU3Myw3IEBACiAJCQkodW5zaWduZWQgaW50KXJoLT5yLm9wY29kZSwKIAkJCSh1bnNpZ25lZCBpbnQpcmgtPnIuc3ViY29kZSk7CiAJCWRyb3EtPnN0YXRzLmRyb3BwZWRfbm9kaXNwYXRjaCsrOwotCX0gICAgICAgICAgICAgICAgICAgICAgIC8qIGVsc2UgKGRpc3BhdGNoX2ZuIC4uLiAqLworCX0KIAogCXJldHVybiBjbnQ7CiB9CkBAIC03MzUsMTYgKzc0NCwyMCBAQAogCXUzMiBwa3RfY291bnQgPSAwLCBwa3RzX3Byb2Nlc3NlZCA9IDA7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqdG1wMjsKIAorCS8qIEdyYWIgdGhlIGRyb3EgbG9jayAqLworCXNwaW5fbG9jaygmZHJvcS0+bG9jayk7CisKKwlvY3Rlb25fZHJvcV9jaGVja19od19mb3JfcGt0cyhkcm9xKTsKIAlwa3RfY291bnQgPSBhdG9taWNfcmVhZCgmZHJvcS0+cGt0c19wZW5kaW5nKTsKLQlpZiAoIXBrdF9jb3VudCkKKworCWlmICghcGt0X2NvdW50KSB7CisJCXNwaW5fdW5sb2NrKCZkcm9xLT5sb2NrKTsKIAkJcmV0dXJuIDA7CisJfQogCiAJaWYgKHBrdF9jb3VudCA+IGJ1ZGdldCkKIAkJcGt0X2NvdW50ID0gYnVkZ2V0OwogCi0JLyogR3JhYiB0aGUgZHJvcSBsb2NrICovCi0Jc3Bpbl9sb2NrKCZkcm9xLT5sb2NrKTsKLQogCXBrdHNfcHJvY2Vzc2VkID0gb2N0ZW9uX2Ryb3FfZmFzdF9wcm9jZXNzX3BhY2tldHMob2N0LCBkcm9xLCBwa3RfY291bnQpOwogCiAJYXRvbWljX3N1Yihwa3RzX3Byb2Nlc3NlZCwgJmRyb3EtPnBrdHNfcGVuZGluZyk7CkBAIC03ODksNiArODAyLDggQEAKIAlzcGluX2xvY2soJmRyb3EtPmxvY2spOwogCiAJd2hpbGUgKHRvdGFsX3BrdHNfcHJvY2Vzc2VkIDwgYnVkZ2V0KSB7CisJCW9jdGVvbl9kcm9xX2NoZWNrX2h3X2Zvcl9wa3RzKGRyb3EpOworCiAJCXBrdHNfYXZhaWxhYmxlID0KIAkJCUNWTV9NSU4oKGJ1ZGdldCAtIHRvdGFsX3BrdHNfcHJvY2Vzc2VkKSwKIAkJCQkodTMyKShhdG9taWNfcmVhZCgmZHJvcS0+cGt0c19wZW5kaW5nKSkpOwpAQCAtODAzLDggKzgxOCw2IEBACiAJCWF0b21pY19zdWIocGt0c19wcm9jZXNzZWQsICZkcm9xLT5wa3RzX3BlbmRpbmcpOwogCiAJCXRvdGFsX3BrdHNfcHJvY2Vzc2VkICs9IHBrdHNfcHJvY2Vzc2VkOwotCi0JCW9jdGVvbl9kcm9xX2NoZWNrX2h3X2Zvcl9wa3RzKGRyb3EpOwogCX0KIAogCXNwaW5fdW5sb2NrKCZkcm9xLT5sb2NrKTsKQEAgLTg3NCw4ICs4ODcsMTEgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCWJyZWFrOworCQljYXNlIE9DVEVPTl9DTjIzWFhfUEZfVklEOiB7CisJCQlsaW9fZW5hYmxlX2lycShvY3QtPmRyb3FbcV9ub10sIG9jdC0+aW5zdHJfcXVldWVbcV9ub10pOwogCQl9Ci0KKwkJYnJlYWs7CisJCX0KIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2Ryb3EuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZHJvcS5oCmluZGV4IDVhNmZiOTEuLjViZTAwMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZHJvcS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fZHJvcS5oCkBAIC0yNjEsNiArMjYxLDggQEAKIAogCXUzMiBxX25vOwogCisJdTMyIHBrdF9jb3VudDsKKwogCXN0cnVjdCBvY3Rlb25fZHJvcV9vcHMgb3BzOwogCiAJc3RydWN0IG9jdGVvbl9kZXZpY2UgKm9jdF9kZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2lxLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX2lxLmgKaW5kZXggZmY0YjFkNi4uZTRkNDI2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9pcS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25faXEuaApAQCAtODgsNiArODgsOCBAQAogCS8qKiBBIHNwaW5sb2NrIHRvIHByb3RlY3Qgd2hpbGUgcG9zdGluZyBvbiB0aGUgcmluZy4gICovCiAJc3BpbmxvY2tfdCBwb3N0X2xvY2s7CiAKKwl1MzIgcGt0X2luX2RvbmU7CisKIAkvKiogQSBzcGlubG9jayB0byBwcm90ZWN0IGFjY2VzcyB0byB0aGUgaW5wdXQgcmluZy4qLwogCXNwaW5sb2NrX3QgaXFfZmx1c2hfcnVubmluZ19sb2NrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX21haW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbWFpbi5oCmluZGV4IGJjMTRlNGMuLjM2NjI5OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbWFpbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbWFpbi5oCkBAIC0zOCwxMiArMzgsMjYgQEAKIAogI2RlZmluZSBEUlZfTkFNRSAiTGlxdWlkSU8iCiAKLS8qKgotICogXGJyaWVmIGRldGVybWluZXMgaWYgYSBnaXZlbiBjb25zb2xlIGhhcyBkZWJ1ZyBlbmFibGVkLgotICogQHBhcmFtIGNvbnNvbGUgY29uc29sZSB0byBjaGVjawotICogQHJldHVybnMgIDEgPSBlbmFibGVkLiAwIG90aGVyd2lzZQorLyoqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgYnkgTklDIGRyaXZlciB0byBzdG9yZSBpbmZvcm1hdGlvbiByZXF1aXJlZAorICogdG8gZnJlZSB0aGUgc2tfYnVmZiB3aGVuIHRoZSBwYWNrZXQgaGFzIGJlZW4gZmV0Y2hlZCBieSBPY3Rlb24uCisgKiBCeXRlcyBvZmZzZXQgYmVsb3cgYXNzdW1lIHdvcnN0LWNhc2Ugb2YgYSA2NC1iaXQgc3lzdGVtLgogICovCi1pbnQgb2N0ZW9uX2NvbnNvbGVfZGVidWdfZW5hYmxlZCh1MzIgY29uc29sZSk7CitzdHJ1Y3Qgb2N0bmV0X2J1Zl9mcmVlX2luZm8geworCS8qKiBCeXRlcyAxLTguICBQb2ludGVyIHRvIG5ldHdvcmsgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLiAqLworCXN0cnVjdCBsaW8gKmxpbzsKKworCS8qKiBCeXRlcyA5LTE2LiAgUG9pbnRlciB0byBza19idWZmLiAqLworCXN0cnVjdCBza19idWZmICpza2I7CisKKwkvKiogQnl0ZXMgMTctMjQuICBQb2ludGVyIHRvIGdhdGhlciBsaXN0LiAqLworCXN0cnVjdCBvY3RuaWNfZ2F0aGVyICpnOworCisJLyoqIEJ5dGVzIDI1LTMyLiBQaHlzaWNhbCBhZGRyZXNzIG9mIHNrYi0+ZGF0YSBvciBnYXRoZXIgbGlzdC4gKi8KKwl1NjQgZHB0cjsKKworCS8qKiBCeXRlcyAzMy00Ny4gUGlnZ3liYWNrZWQgc29mdCBjb21tYW5kLCBpZiBhbnkgKi8KKwlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2M7Cit9OwogCiAvKiBCUUwtcmVsYXRlZCBmdW5jdGlvbnMgKi8KIHZvaWQgb2N0ZW9uX3JlcG9ydF9zZW50X2J5dGVzX3RvX2JxbCh2b2lkICpidWYsIGludCByZXF0eXBlKTsKQEAgLTE2NywyMiArMTgxLDI2IEBACiAjZGVmaW5lIGNubmljX2ZyZWVfYWxpZ25lZF9kbWEocGNpX2RldiwgcHRyLCBzaXplLCBvcmlnX3B0ciwgZG1hX2FkZHIpIFwKIAkJZnJlZV9wYWdlcyhvcmlnX3B0ciwgZ2V0X29yZGVyKHNpemUpKQogCi1zdGF0aWMgaW5saW5lIHZvaWQKK3N0YXRpYyBpbmxpbmUgaW50CiBzbGVlcF9jb25kKHdhaXRfcXVldWVfaGVhZF90ICp3YWl0X3F1ZXVlLCBpbnQgKmNvbmRpdGlvbikKIHsKKwlpbnQgZXJybm8gPSAwOwogCXdhaXRfcXVldWVfdCB3ZTsKIAogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3ZSwgY3VycmVudCk7CiAJYWRkX3dhaXRfcXVldWUod2FpdF9xdWV1ZSwgJndlKTsKIAl3aGlsZSAoIShSRUFEX09OQ0UoKmNvbmRpdGlvbikpKSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQllcnJubyA9IC1FSU5UUjsKIAkJCWdvdG8gb3V0OworCQl9CiAJCXNjaGVkdWxlKCk7CiAJfQogb3V0OgogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmVtb3ZlX3dhaXRfcXVldWUod2FpdF9xdWV1ZSwgJndlKTsKKwlyZXR1cm4gZXJybm87CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9tZW1fb3BzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX21lbV9vcHMuYwppbmRleCA5NWE0YmJlLi4wZGMwODFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX21lbV9vcHMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX21lbV9vcHMuYwpAQCAtMTksNyArMTksNiBAQAogICogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgogICogQ29udGFjdCBDYXZpdW0sIEluYy4gZm9yIG1vcmUgaW5mb3JtYXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgImxpcXVpZGlvX2NvbW1vbi5oIgogI2luY2x1ZGUgIm9jdGVvbl9kcm9xLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25ldHdvcmsuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmV0d29yay5oCmluZGV4IGZiODIwZGMuLmU1ZDFkZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmV0d29yay5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmV0d29yay5oCkBAIC0yNiw4ICsyNiw2IEBACiAKICNpZm5kZWYgX19PQ1RFT05fTkVUV09SS19IX18KICNkZWZpbmUgX19PQ1RFT05fTkVUV09SS19IX18KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9wdHBfY2xvY2tfa2VybmVsLmg+CiAKICNkZWZpbmUgTElPX01BWF9NVFVfU0laRSAoT0NUTkVUX01BWF9GUk1fU0laRSAtIE9DVE5FVF9GUk1fSEVBREVSX1NJWkUpCkBAIC0xMjQsMTEgKzEyMiwyMSBAQAogCiAJLyogd29yayBxdWV1ZSBmb3IgIHR4cSBzdGF0dXMgKi8KIAlzdHJ1Y3QgY2F2aXVtX3dxCXR4cV9zdGF0dXNfd3E7CisKKwkvKiB3b3JrIHF1ZXVlIGZvciAgbGluayBzdGF0dXMgKi8KKwlzdHJ1Y3QgY2F2aXVtX3dxCWxpbmtfc3RhdHVzX3dxOworCiB9OwogCiAjZGVmaW5lIExJT19TSVpFICAgICAgICAgKHNpemVvZihzdHJ1Y3QgbGlvKSkKICNkZWZpbmUgR0VUX0xJTyhuZXRkZXYpICAoKHN0cnVjdCBsaW8gKiluZXRkZXZfcHJpdihuZXRkZXYpKQogCisjZGVmaW5lIENJVTNfV0RPRyhjKSAgICAgICAgICAgICAgICAgKDB4MTAxMDAwMDAyMDAwMFVMTCArIChjIDw8IDMpKQorI2RlZmluZSBDSVUzX1dET0dfTUFTSyAgICAgICAgICAgICAgIDEyVUxMCisjZGVmaW5lIExJT19NT05JVE9SX1dET0dfRVhQSVJFICAgICAgMQorI2RlZmluZSBMSU9fTU9OSVRPUl9DT1JFX1NUVUNLX01TR0QgIDIKKyNkZWZpbmUgTElPX01BWF9DT1JFUyAgICAgICAgICAgICAgICAxMgorCiAvKioKICAqIFxicmllZiBFbmFibGUgb3IgZGlzYWJsZSBmZWF0dXJlCiAgKiBAcGFyYW0gbmV0ZGV2ICAgIHBvaW50ZXIgdG8gbmV0d29yayBkZXZpY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmljLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25pYy5jCmluZGV4IDE2NjcyN2IuLjQwYWMxZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmljLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL29jdGVvbl9uaWMuYwpAQCAtMTksNyArMTksNiBAQAogICogVGhpcyBmaWxlIG1heSBhbHNvIGJlIGF2YWlsYWJsZSB1bmRlciBhIGRpZmZlcmVudCBsaWNlbnNlIGZyb20gQ2F2aXVtLgogICogQ29udGFjdCBDYXZpdW0sIEluYy4gZm9yIG1vcmUgaW5mb3JtYXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgImxpcXVpZGlvX2NvbW1vbi5oIgpAQCAtMzYsNiArMzUsNyBAQAogCQkJICAgICAgIHUzMgkJICAgICAgIHJkYXRhc2l6ZSkKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2M7CisJc3RydWN0IG9jdGVvbl9pbnN0cl9paDMgICppaDM7CiAJc3RydWN0IG9jdGVvbl9pbnN0cl9paDIgICppaDI7CiAJc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKmlyaDsKIAlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3JkcCAqcmRwOwpAQCAtNTIsMTAgKzUyLDE5IEBACiAJLyogQWRkIGluIHRoZSByZXNwb25zZSByZWxhdGVkIGZpZWxkcy4gT3Bjb2RlIGFuZCBQYXJhbSBhcmUgYWxyZWFkeQogCSAqIHRoZXJlLgogCSAqLwotCWloMiAgICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgyICopJnNjLT5jbWQuY21kMi5paDI7Ci0JcmRwICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3JkcCAqKSZzYy0+Y21kLmNtZDIucmRwOwotCWlyaCAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmc2MtPmNtZC5jbWQyLmlyaDsKLQlpaDItPmZzeiA9IDQwOyAvKiBpcmggKyBvc3NwWzBdICsgb3NzcFsxXSArIHJkcCArIHJwdHIgPSA0MCBieXRlcyAqLworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJaWgzICAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9paDMgKikmc2MtPmNtZC5jbWQzLmloMzsKKwkJcmRwICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3JkcCAqKSZzYy0+Y21kLmNtZDMucmRwOworCQlpcmggICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJnNjLT5jbWQuY21kMy5pcmg7CisJCS8qcGtpaWgzICsgaXJoICsgb3NzcFswXSArIG9zc3BbMV0gKyByZHAgKyBycHRyID0gNDAgYnl0ZXMgKi8KKwkJaWgzLT5mc3ogPSBMSU9fU09GVENNRFJFU1BfSUgzOworCX0gZWxzZSB7CisJCWloMiAgICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgyICopJnNjLT5jbWQuY21kMi5paDI7CisJCXJkcCAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9yZHAgKikmc2MtPmNtZC5jbWQyLnJkcDsKKwkJaXJoICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZzYy0+Y21kLmNtZDIuaXJoOworCQkvKiBpcmggKyBvc3NwWzBdICsgb3NzcFsxXSArIHJkcCArIHJwdHIgPSA0MCBieXRlcyAqLworCQlpaDItPmZzeiA9IExJT19TT0ZUQ01EUkVTUF9JSDI7CisJfQogCiAJaXJoLT5yZmxhZyA9IDE7IC8qIGEgcmVzcG9uc2UgaXMgcmVxdWlyZWQgKi8KIApAQCAtNjQsNyArNzMsMTAgQEAKIAogCSpzYy0+c3RhdHVzX3dvcmQgPSBDT01QTEVUSU9OX1dPUkRfSU5JVDsKIAotCXNjLT5jbWQuY21kMi5ycHRyID0gIHNjLT5kbWFycHRyOworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCXNjLT5jbWQuY21kMy5ycHRyID0gIHNjLT5kbWFycHRyOworCWVsc2UKKwkJc2MtPmNtZC5jbWQyLnJwdHIgPSAgc2MtPmRtYXJwdHI7CiAKIAlzYy0+d2FpdF90aW1lID0gMTAwMDsKIAlzYy0+dGltZW91dCA9IGppZmZpZXMgKyBzYy0+d2FpdF90aW1lOwpAQCAtNzMsMTIgKzg1LDkgQEAKIH0KIAogaW50IG9jdG5ldF9zZW5kX25pY19kYXRhX3BrdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LAotCQkJICAgICBzdHJ1Y3Qgb2N0bmljX2RhdGFfcGt0ICpuZGF0YSwKLQkJCSAgICAgdTMyIHhtaXRfbW9yZSkKKwkJCSAgICAgc3RydWN0IG9jdG5pY19kYXRhX3BrdCAqbmRhdGEpCiB7Ci0JaW50IHJpbmdfZG9vcmJlbGw7Ci0KLQlyaW5nX2Rvb3JiZWxsID0gIXhtaXRfbW9yZTsKKwlpbnQgcmluZ19kb29yYmVsbCA9IDE7CiAKIAlyZXR1cm4gb2N0ZW9uX3NlbmRfY29tbWFuZChvY3QsIG5kYXRhLT5xX25vLCByaW5nX2Rvb3JiZWxsLCAmbmRhdGEtPmNtZCwKIAkJCQkgICBuZGF0YS0+YnVmLCBuZGF0YS0+ZGF0YXNpemUsCkBAIC0xODMsOCArMTkyLDggQEAKIAlyZXR2YWwgPSBvY3Rlb25fc2VuZF9zb2Z0X2NvbW1hbmQob2N0LCBzYyk7CiAJaWYgKHJldHZhbCA9PSBJUV9TRU5EX0ZBSUxFRCkgewogCQlvY3Rlb25fZnJlZV9zb2Z0X2NvbW1hbmQob2N0LCBzYyk7Ci0JCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgc29mdCBjb21tYW5kOiVkIHNlbmQgZmFpbGVkIHN0YXR1czogJXhcbiIsCi0JCQlfX2Z1bmNfXywgbmN0cmwtPm5jbWQucy5jbWQsIHJldHZhbCk7CisJCWRldl9lcnIoJm9jdC0+cGNpX2Rldi0+ZGV2LCAiJXMgcGZfbnVtOiVkIHNvZnQgY29tbWFuZDolZCBzZW5kIGZhaWxlZCBzdGF0dXM6ICV4XG4iLAorCQkJX19mdW5jX18sIG9jdC0+cGZfbnVtLCBuY3RybC0+bmNtZC5zLmNtZCwgcmV0dmFsKTsKIAkJc3Bpbl91bmxvY2tfYmgoJm9jdC0+Y21kX3Jlc3Bfd3Fsb2NrKTsKIAkJcmV0dXJuIC0xOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmljLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25pYy5oCmluZGV4IGI3MWEyYmIuLjRiOGRhNjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vb2N0ZW9uX25pYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9vY3Rlb25fbmljLmgKQEAgLTEzOCw3ICsxMzgsNyBAQAogCS8qIGFzc3VtZSB0aGF0IHJmbGFnIGlzIGNsZWFyZWQgc28gdGhlcmVmb3JlIGZyb250IGRhdGEgd2lsbCBvbmx5IGhhdmUKIAkgKiBpcmggYW5kIG9zc3BbMF0sIG9zc3BbMV0gZm9yIGEgdG90YWwgb2YgMzIgYnl0ZXMKIAkgKi8KLQlpaDItPmZzeiA9IDI0OworCWloMi0+ZnN6ID0gTElPX1BDSUNNRF9PMjsKIAogCWloMi0+dGFndHlwZSA9IE9SREVSRURfVEFHOwogCWloMi0+Z3JwID0gREVGQVVMVF9QT1dfR1JQOwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJICovCiAJaWgzLT5wa2luZCAgICAgICA9IG9jdC0+aW5zdHJfcXVldWVbc2V0dXAtPnMuaXFfbm9dLT50eHBjaXEucy5wa2luZDsKIAkvKlBLSSBJSCovCi0JaWgzLT5mc3ogPSAyNCArIDg7CisJaWgzLT5mc3ogPSBMSU9fUENJQ01EX08zOwogCiAJaWYgKCFzZXR1cC0+cy5nYXRoZXIpIHsKIAkJaWgzLT5kbGVuZ3N6ID0gc2V0dXAtPnMudS5kYXRhc2l6ZTsKQEAgLTI3OCw3ICsyNzgsNyBAQAogICogcXVldWUgc2hvdWxkIGJlIHN0b3BwZWQsIGFuZCBJUV9TRU5EX09LIGlmIGl0IHNlbnQgb2theS4KICAqLwogaW50IG9jdG5ldF9zZW5kX25pY19kYXRhX3BrdChzdHJ1Y3Qgb2N0ZW9uX2RldmljZSAqb2N0LAotCQkJICAgICBzdHJ1Y3Qgb2N0bmljX2RhdGFfcGt0ICpuZGF0YSwgdTMyIHhtaXRfbW9yZSk7CisJCQkgICAgIHN0cnVjdCBvY3RuaWNfZGF0YV9wa3QgKm5kYXRhKTsKIAogLyoqIFNlbmQgYSBOSUMgY29udHJvbCBwYWNrZXQgdG8gdGhlIGRldmljZQogICogQHBhcmFtIG9jdCAtIG9jdGVvbiBkZXZpY2UgcG9pbnRlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL3JlcXVlc3RfbWFuYWdlci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL3JlcXVlc3RfbWFuYWdlci5jCmluZGV4IGQzMjQ5MmYxLi45MDg2NmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vcmVxdWVzdF9tYW5hZ2VyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL2xpcXVpZGlvL3JlcXVlc3RfbWFuYWdlci5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAib2N0ZW9uX21haW4uaCIKICNpbmNsdWRlICJvY3Rlb25fbmV0d29yay5oIgogI2luY2x1ZGUgImNuNjZ4eF9kZXZpY2UuaCIKKyNpbmNsdWRlICJjbjIzeHhfcGZfZGV2aWNlLmgiCiAKICNkZWZpbmUgSU5DUl9JTlNUUlFVRVVFX1BLVF9DT1VOVChvY3Rlb25fZGV2X3B0ciwgaXFfbm8sIGZpZWxkLCBjb3VudCkgIFwKIAkob2N0ZW9uX2Rldl9wdHItPmluc3RyX3F1ZXVlW2lxX25vXS0+c3RhdHMuZmllbGQgKz0gY291bnQpCkBAIC03MSw3ICs3Miw4IEBACiAKIAlpZiAoT0NURU9OX0NONlhYWChvY3QpKQogCQljb25mID0gJihDRkdfR0VUX0lRX0NGRyhDSElQX0ZJRUxEKG9jdCwgY242eHh4LCBjb25mKSkpOwotCisJZWxzZSBpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKQorCQljb25mID0gJihDRkdfR0VUX0lRX0NGRyhDSElQX0ZJRUxEKG9jdCwgY24yM3h4X3BmLCBjb25mKSkpOwogCWlmICghY29uZikgewogCQlkZXZfZXJyKCZvY3QtPnBjaV9kZXYtPmRldiwgIlVuc3VwcG9ydGVkIENoaXAgJXhcbiIsCiAJCQlvY3QtPmNoaXBfaWQpOwpAQCAtODgsNiArOTAsNyBAQAogCXFfc2l6ZSA9ICh1MzIpY29uZi0+aW5zdHJfdHlwZSAqIG51bV9kZXNjczsKIAogCWlxID0gb2N0LT5pbnN0cl9xdWV1ZVtpcV9ub107CisKIAlpcS0+b2N0X2RldiA9IG9jdDsKIAogCXNldF9kZXZfbm9kZSgmb2N0LT5wY2lfZGV2LT5kZXYsIG51bWFfbm9kZSk7CkBAIC0xODEsNiArMTg0LDkgQEAKIAlpZiAoT0NURU9OX0NONlhYWChvY3QpKQogCQlkZXNjX3NpemUgPQogCQkgICAgQ0ZHX0dFVF9JUV9JTlNUUl9UWVBFKENISVBfRklFTEQob2N0LCBjbjZ4eHgsIGNvbmYpKTsKKwllbHNlIGlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCWRlc2Nfc2l6ZSA9CisJCSAgICBDRkdfR0VUX0lRX0lOU1RSX1RZUEUoQ0hJUF9GSUVMRChvY3QsIGNuMjN4eF9wZiwgY29uZikpOwogCiAJdmZyZWUoaXEtPnJlcXVlc3RfbGlzdCk7CiAKQEAgLTM4Myw3ICszODksMTIgQEAKIAkJY2FzZSBSRVFUWVBFX1NPRlRfQ09NTUFORDoKIAkJCXNjID0gYnVmOwogCi0JCQlpcmggPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKikmc2MtPmNtZC5jbWQyLmlyaDsKKwkJCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpCisJCQkJaXJoID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopCisJCQkJCSZzYy0+Y21kLmNtZDMuaXJoOworCQkJZWxzZQorCQkJCWlyaCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKQorCQkJCQkmc2MtPmNtZC5jbWQyLmlyaDsKIAkJCWlmIChpcmgtPnJmbGFnKSB7CiAJCQkJLyogV2UncmUgZXhwZWN0aW5nIGEgcmVzcG9uc2UgZnJvbSBPY3Rlb24uCiAJCQkJICogSXQncyB1cCB0byBsaW9fcHJvY2Vzc19vcmRlcmVkX2xpc3QoKSB0bwpAQCAtNDk5LDYgKzUxMCw3IEBACiAKIAlpZiAoIW9jdCkKIAkJcmV0dXJuOworCiAJaXEgPSBvY3QtPmluc3RyX3F1ZXVlW2lxX25vXTsKIAlpZiAoIWlxKQogCQlyZXR1cm47CkBAIC01MTQsNiArNTI2LDggQEAKIAogCS8qIEZsdXNoIHRoZSBpbnN0cnVjdGlvbiBxdWV1ZSAqLwogCW9jdGVvbl9mbHVzaF9pcShvY3QsIGlxLCAxLCAwKTsKKworCWxpb19lbmFibGVfaXJxKE5VTEwsIGlxKTsKIH0KIAogLyogQ2FsbGVkIGJ5IHRoZSBQb2xsIHRocmVhZCBhdCByZWd1bGFyIGludGVydmFscyB0byBjaGVjayB0aGUgaW5zdHJ1Y3Rpb24KQEAgLTU4MCw2ICs1OTQsOCBAQAogewogCXN0cnVjdCBvY3Rlb25fY29uZmlnICpvY3RfY2ZnOwogCXN0cnVjdCBvY3Rlb25faW5zdHJfaWgyICppaDI7CisJc3RydWN0IG9jdGVvbl9pbnN0cl9paDMgKmloMzsKKwlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3BraV9paDMgKnBraV9paDM7CiAJc3RydWN0IG9jdGVvbl9pbnN0cl9pcmggKmlyaDsKIAlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3JkcCAqcmRwOwogCkBAIC01ODgsMzYgKzYwNCw4OCBAQAogCiAJb2N0X2NmZyA9IG9jdGVvbl9nZXRfY29uZihvY3QpOwogCi0JaWgyICAgICAgICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgyICopJnNjLT5jbWQuY21kMi5paDI7Ci0JaWgyLT50YWd0eXBlID0gQVRPTUlDX1RBRzsKLQlpaDItPnRhZyAgICAgPSBMSU9fQ09OVFJPTDsKLQlpaDItPnJhdyAgICAgPSAxOwotCWloMi0+Z3JwICAgICA9IENGR19HRVRfQ1RSTF9RX0dSUChvY3RfY2ZnKTsKKwlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3QpKSB7CisJCWloMyA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMyAqKSZzYy0+Y21kLmNtZDMuaWgzOwogCi0JaWYgKHNjLT5kYXRhc2l6ZSkgewotCQlpaDItPmRsZW5nc3ogPSBzYy0+ZGF0YXNpemU7Ci0JCWloMi0+cnMgPSAxOwotCX0KKwkJaWgzLT5wa2luZCA9IG9jdC0+aW5zdHJfcXVldWVbc2MtPmlxX25vXS0+dHhwY2lxLnMucGtpbmQ7CiAKLQlpcmggICAgICAgICAgICA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZzYy0+Y21kLmNtZDIuaXJoOwotCWlyaC0+b3Bjb2RlICAgID0gb3Bjb2RlOwotCWlyaC0+c3ViY29kZSAgID0gc3ViY29kZTsKKwkJcGtpX2loMyA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3BraV9paDMgKikmc2MtPmNtZC5jbWQzLnBraV9paDM7CiAKLQkvKiBvcGNvZGUvc3ViY29kZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIChvc3NwKSAqLwotCWlyaC0+b3NzcCAgICAgICA9IGlyaF9vc3NwOwotCXNjLT5jbWQuY21kMi5vc3NwWzBdID0gb3NzcDA7Ci0Jc2MtPmNtZC5jbWQyLm9zc3BbMV0gPSBvc3NwMTsKKwkJcGtpX2loMy0+dyAgICAgICAgICAgPSAxOworCQlwa2lfaWgzLT5yYXcgICAgICAgICA9IDE7CisJCXBraV9paDMtPnV0YWcgICAgICAgID0gMTsKKwkJcGtpX2loMy0+dXFwZyAgICAgICAgPQorCQkJb2N0LT5pbnN0cl9xdWV1ZVtzYy0+aXFfbm9dLT50eHBjaXEucy51c2VfcXBnOworCQlwa2lfaWgzLT51dHQgICAgICAgICA9IDE7CisJCXBraV9paDMtPnRhZyAgICAgPSBMSU9fQ09OVFJPTDsKKwkJcGtpX2loMy0+dGFndHlwZSA9IEFUT01JQ19UQUc7CisJCXBraV9paDMtPnFwZyAgICAgICAgID0KKwkJCW9jdC0+aW5zdHJfcXVldWVbc2MtPmlxX25vXS0+dHhwY2lxLnMucXBnOworCQlwa2lfaWgzLT5wbSAgICAgICAgICA9IDB4NzsKKwkJcGtpX2loMy0+c2wgICAgICAgICAgPSA4OwogCi0JaWYgKHNjLT5yZGF0YXNpemUpIHsKLQkJcmRwID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfcmRwICopJnNjLT5jbWQuY21kMi5yZHA7Ci0JCXJkcC0+cGNpZV9wb3J0ID0gb2N0LT5wY2llX3BvcnQ7Ci0JCXJkcC0+cmxlbiAgICAgID0gc2MtPnJkYXRhc2l6ZTsKKwkJaWYgKHNjLT5kYXRhc2l6ZSkKKwkJCWloMy0+ZGxlbmdzeiA9IHNjLT5kYXRhc2l6ZTsKIAotCQlpcmgtPnJmbGFnID0gIDE7Ci0JCWloMi0+ZnN6ICAgPSA0MDsgLyogaXJoK29zc3BbMF0rb3NzcFsxXStyZHArcnB0ciA9IDQwIGJ5dGVzICovCisJCWlyaCAgICAgICAgICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJnNjLT5jbWQuY21kMy5pcmg7CisJCWlyaC0+b3Bjb2RlICAgID0gb3Bjb2RlOworCQlpcmgtPnN1YmNvZGUgICA9IHN1YmNvZGU7CisKKwkJLyogb3Bjb2RlL3N1YmNvZGUgc3BlY2lmaWMgcGFyYW1ldGVycyAob3NzcCkgKi8KKwkJaXJoLT5vc3NwICAgICAgID0gaXJoX29zc3A7CisJCXNjLT5jbWQuY21kMy5vc3NwWzBdID0gb3NzcDA7CisJCXNjLT5jbWQuY21kMy5vc3NwWzFdID0gb3NzcDE7CisKKwkJaWYgKHNjLT5yZGF0YXNpemUpIHsKKwkJCXJkcCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3JkcCAqKSZzYy0+Y21kLmNtZDMucmRwOworCQkJcmRwLT5wY2llX3BvcnQgPSBvY3QtPnBjaWVfcG9ydDsKKwkJCXJkcC0+cmxlbiAgICAgID0gc2MtPnJkYXRhc2l6ZTsKKworCQkJaXJoLT5yZmxhZyA9ICAxOworCQkJLypQS0kgSUgzKi8KKwkJCS8qIHBraV9paDMgaXJoK29zc3BbMF0rb3NzcFsxXStyZHArcnB0ciA9IDQ4IGJ5dGVzICovCisJCQlpaDMtPmZzeiAgICA9IExJT19TT0ZUQ01EUkVTUF9JSDM7CisJCX0gZWxzZSB7CisJCQlpcmgtPnJmbGFnID0gIDA7CisJCQkvKlBLSSBJSDMqLworCQkJLyogcGtpX2gzICsgaXJoICsgb3NzcFswXSArIG9zc3BbMV0gPSAzMiBieXRlcyAqLworCQkJaWgzLT5mc3ogICAgPSBMSU9fUENJQ01EX08zOworCQl9CisKIAl9IGVsc2UgewotCQlpcmgtPnJmbGFnID0gIDA7Ci0JCWloMi0+ZnN6ICAgPSAyNDsgLyogaXJoICsgb3NzcFswXSArIG9zc3BbMV0gPSAyNCBieXRlcyAqLworCQlpaDIgICAgICAgICAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9paDIgKikmc2MtPmNtZC5jbWQyLmloMjsKKwkJaWgyLT50YWd0eXBlID0gQVRPTUlDX1RBRzsKKwkJaWgyLT50YWcgICAgID0gTElPX0NPTlRST0w7CisJCWloMi0+cmF3ICAgICA9IDE7CisJCWloMi0+Z3JwICAgICA9IENGR19HRVRfQ1RSTF9RX0dSUChvY3RfY2ZnKTsKKworCQlpZiAoc2MtPmRhdGFzaXplKSB7CisJCQlpaDItPmRsZW5nc3ogPSBzYy0+ZGF0YXNpemU7CisJCQlpaDItPnJzID0gMTsKKwkJfQorCisJCWlyaCAgICAgICAgICAgID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJnNjLT5jbWQuY21kMi5pcmg7CisJCWlyaC0+b3Bjb2RlICAgID0gb3Bjb2RlOworCQlpcmgtPnN1YmNvZGUgICA9IHN1YmNvZGU7CisKKwkJLyogb3Bjb2RlL3N1YmNvZGUgc3BlY2lmaWMgcGFyYW1ldGVycyAob3NzcCkgKi8KKwkJaXJoLT5vc3NwICAgICAgID0gaXJoX29zc3A7CisJCXNjLT5jbWQuY21kMi5vc3NwWzBdID0gb3NzcDA7CisJCXNjLT5jbWQuY21kMi5vc3NwWzFdID0gb3NzcDE7CisKKwkJaWYgKHNjLT5yZGF0YXNpemUpIHsKKwkJCXJkcCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX3JkcCAqKSZzYy0+Y21kLmNtZDIucmRwOworCQkJcmRwLT5wY2llX3BvcnQgPSBvY3QtPnBjaWVfcG9ydDsKKwkJCXJkcC0+cmxlbiAgICAgID0gc2MtPnJkYXRhc2l6ZTsKKworCQkJaXJoLT5yZmxhZyA9ICAxOworCQkJLyogaXJoK29zc3BbMF0rb3NzcFsxXStyZHArcnB0ciA9IDQwIGJ5dGVzICovCisJCQlpaDItPmZzeiAgID0gTElPX1NPRlRDTURSRVNQX0lIMjsKKwkJfSBlbHNlIHsKKwkJCWlyaC0+cmZsYWcgPSAgMDsKKwkJCS8qIGlyaCArIG9zc3BbMF0gKyBvc3NwWzFdID0gMjQgYnl0ZXMgKi8KKwkJCWloMi0+ZnN6ICAgPSBMSU9fUENJQ01EX08yOworCQl9CiAJfQogfQogCkBAIC02MjUsMjMgKzY5MywzOSBAQAogCQkJICAgICBzdHJ1Y3Qgb2N0ZW9uX3NvZnRfY29tbWFuZCAqc2MpCiB7CiAJc3RydWN0IG9jdGVvbl9pbnN0cl9paDIgKmloMjsKKwlzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMyAqaWgzOwogCXN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICppcmg7CiAJdTMyIGxlbjsKIAotCWloMiA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMiAqKSZzYy0+Y21kLmNtZDIuaWgyOwotCWlmIChpaDItPmRsZW5nc3opIHsKLQkJV0FSTl9PTighc2MtPmRtYWRwdHIpOwotCQlzYy0+Y21kLmNtZDIuZHB0ciA9IHNjLT5kbWFkcHRyOworCWlmIChPQ1RFT05fQ04yM1hYX1BGKG9jdCkpIHsKKwkJaWgzID0gIChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2loMyAqKSZzYy0+Y21kLmNtZDMuaWgzOworCQlpZiAoaWgzLT5kbGVuZ3N6KSB7CisJCQlXQVJOX09OKCFzYy0+ZG1hZHB0cik7CisJCQlzYy0+Y21kLmNtZDMuZHB0ciA9IHNjLT5kbWFkcHRyOworCQl9CisJCWlyaCA9IChzdHJ1Y3Qgb2N0ZW9uX2luc3RyX2lyaCAqKSZzYy0+Y21kLmNtZDMuaXJoOworCQlpZiAoaXJoLT5yZmxhZykgeworCQkJV0FSTl9PTighc2MtPmRtYXJwdHIpOworCQkJV0FSTl9PTighc2MtPnN0YXR1c193b3JkKTsKKwkJCSpzYy0+c3RhdHVzX3dvcmQgPSBDT01QTEVUSU9OX1dPUkRfSU5JVDsKKwkJCXNjLT5jbWQuY21kMy5ycHRyID0gc2MtPmRtYXJwdHI7CisJCX0KKwkJbGVuID0gKHUzMilpaDMtPmRsZW5nc3o7CisJfSBlbHNlIHsKKwkJaWgyID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaWgyICopJnNjLT5jbWQuY21kMi5paDI7CisJCWlmIChpaDItPmRsZW5nc3opIHsKKwkJCVdBUk5fT04oIXNjLT5kbWFkcHRyKTsKKwkJCXNjLT5jbWQuY21kMi5kcHRyID0gc2MtPmRtYWRwdHI7CisJCX0KKwkJaXJoID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJnNjLT5jbWQuY21kMi5pcmg7CisJCWlmIChpcmgtPnJmbGFnKSB7CisJCQlXQVJOX09OKCFzYy0+ZG1hcnB0cik7CisJCQlXQVJOX09OKCFzYy0+c3RhdHVzX3dvcmQpOworCQkJKnNjLT5zdGF0dXNfd29yZCA9IENPTVBMRVRJT05fV09SRF9JTklUOworCQkJc2MtPmNtZC5jbWQyLnJwdHIgPSBzYy0+ZG1hcnB0cjsKKwkJfQorCQlsZW4gPSAodTMyKWloMi0+ZGxlbmdzejsKIAl9Ci0JaXJoID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfaXJoICopJnNjLT5jbWQuY21kMi5pcmg7Ci0JaWYgKGlyaC0+cmZsYWcpIHsKLQkJV0FSTl9PTighc2MtPmRtYXJwdHIpOwotCQlXQVJOX09OKCFzYy0+c3RhdHVzX3dvcmQpOwotCQkqc2MtPnN0YXR1c193b3JkID0gQ09NUExFVElPTl9XT1JEX0lOSVQ7Ci0KLQkJc2MtPmNtZC5jbWQyLnJwdHIgPSBzYy0+ZG1hcnB0cjsKLQl9Ci0JbGVuID0gKHUzMilpaDItPmRsZW5nc3o7CiAKIAlpZiAoc2MtPndhaXRfdGltZSkKIAkJc2MtPnRpbWVvdXQgPSBqaWZmaWVzICsgc2MtPndhaXRfdGltZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9yZXNwb25zZV9tYW5hZ2VyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vcmVzcG9uc2VfbWFuYWdlci5jCmluZGV4IDcwOTA0OWUuLmJlNTIxNzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vbGlxdWlkaW8vcmVzcG9uc2VfbWFuYWdlci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS9saXF1aWRpby9yZXNwb25zZV9tYW5hZ2VyLmMKQEAgLTkxLDggKzkxLDEzIEBACiAKIAkJc2MgPSAoc3RydWN0IG9jdGVvbl9zb2Z0X2NvbW1hbmQgKilvcmRlcmVkX3NjX2xpc3QtPgogCQkgICAgaGVhZC5uZXh0OwotCQlyZHAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9yZHAgKikmc2MtPmNtZC5jbWQyLnJkcDsKLQkJcnB0ciA9IHNjLT5jbWQuY21kMi5ycHRyOworCQlpZiAoT0NURU9OX0NOMjNYWF9QRihvY3Rlb25fZGV2KSkgeworCQkJcmRwID0gKHN0cnVjdCBvY3Rlb25faW5zdHJfcmRwICopJnNjLT5jbWQuY21kMy5yZHA7CisJCQlycHRyID0gc2MtPmNtZC5jbWQzLnJwdHI7CisJCX0gZWxzZSB7CisJCQlyZHAgPSAoc3RydWN0IG9jdGVvbl9pbnN0cl9yZHAgKikmc2MtPmNtZC5jbWQyLnJkcDsKKwkJCXJwdHIgPSBzYy0+Y21kLmNtZDIucnB0cjsKKwkJfQogCiAJCXN0YXR1cyA9IE9DVEVPTl9SRVFVRVNUX1BFTkRJTkc7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvTWFrZWZpbGUKaW5kZXggNWM0NjE1Yy4uNmI0ZDRhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvTWFrZWZpbGUKQEAgLTIsNiArMiw3IEBACiAjIE1ha2VmaWxlIGZvciBDYXZpdW0ncyBUaHVuZGVyIGV0aGVybmV0IGRldmljZQogIwogCitvYmotJChDT05GSUdfVEhVTkRFUl9OSUNfUkdYKSArPSB0aHVuZGVyX3hjdi5vCiBvYmotJChDT05GSUdfVEhVTkRFUl9OSUNfQkdYKSArPSB0aHVuZGVyX2JneC5vCiBvYmotJChDT05GSUdfVEhVTkRFUl9OSUNfUEYpICs9IG5pY3BmLm8KIG9iai0kKENPTkZJR19USFVOREVSX05JQ19WRikgKz0gbmljdmYubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWMuaAppbmRleCA4MzAyNWJiLi4zMDQyNjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWMuaApAQCAtMjAsNiArMjAsMTcgQEAKICNkZWZpbmUJUENJX0RFVklDRV9JRF9USFVOREVSX05JQ19WRgkJMHhBMDM0CiAjZGVmaW5lCVBDSV9ERVZJQ0VfSURfVEhVTkRFUl9CR1gJCTB4QTAyNgogCisvKiBTdWJzeXN0ZW0gZGV2aWNlIElEcyAqLworI2RlZmluZSBQQ0lfU1VCU1lTX0RFVklEXzg4WFhfTklDX1BGCQkweEExMUUKKyNkZWZpbmUgUENJX1NVQlNZU19ERVZJRF84MVhYX05JQ19QRgkJMHhBMjFFCisjZGVmaW5lIFBDSV9TVUJTWVNfREVWSURfODNYWF9OSUNfUEYJCTB4QTMxRQorCisjZGVmaW5lIFBDSV9TVUJTWVNfREVWSURfODhYWF9QQVNTMV9OSUNfVkYJMHhBMTFFCisjZGVmaW5lIFBDSV9TVUJTWVNfREVWSURfODhYWF9OSUNfVkYJCTB4QTEzNAorI2RlZmluZSBQQ0lfU1VCU1lTX0RFVklEXzgxWFhfTklDX1ZGCQkweEEyMzQKKyNkZWZpbmUgUENJX1NVQlNZU19ERVZJRF84M1hYX05JQ19WRgkJMHhBMzM0CisKKwogLyogUENJIEJBUiBub3MgKi8KICNkZWZpbmUJUENJX0NGR19SRUdfQkFSX05VTQkJMAogI2RlZmluZQlQQ0lfTVNJWF9SRUdfQkFSX05VTQkJNApAQCAtNDEsNDAgKzUyLDggQEAKIC8qIE1heCBwa2luZHMgKi8KICNkZWZpbmUJTklDX01BWF9QS0lORAkJCTE2CiAKLS8qIFJ4IENoYW5uZWxzICovCi0vKiBSZWNlaXZlIGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbiBUTlMgYnlwYXNzIG1vZGUKLSAqIEJlbG93IGlzIGNvbmZpZ3VyYXRpb24gaW4gVE5TIGJ5cGFzcyBtb2RlCi0gKiBCR1gwLUxNQUMwLUNIQU4wIC0gVk5JQyBDSEFOMAotICogQkdYMC1MTUFDMS1DSEFOMCAtIFZOSUMgQ0hBTjE2Ci0gKiAuLi4KLSAqIEJHWDEtTE1BQzAtQ0hBTjAgLSBWTklDIENIQU4xMjgKLSAqIC4uLgotICogQkdYMS1MTUFDMy1DSEFOMCAtIFZOSUMgQ0hBTjE3NAotICovCi0jZGVmaW5lCU5JQ19JTlRGX0NPVU5UCQkJMiAgLyogSW50ZXJmYWNlcyBidHcgVk5JQyBhbmQgVE5TL0JHWCAqLwotI2RlZmluZQlOSUNfQ0hBTlNfUEVSX0lORgkJMTI4Ci0jZGVmaW5lCU5JQ19NQVhfQ0hBTlMJCQkoTklDX0lOVEZfQ09VTlQgKiBOSUNfQ0hBTlNfUEVSX0lORikKLSNkZWZpbmUJTklDX0NQSV9DT1VOVAkJCTIwNDggLyogTm8gb2YgY2hhbm5lbCBwYXJzZSBpbmRpY2VzICovCi0KLS8qIFROUyBieXBhc3MgbW9kZTogMS0xIG1hcHBpbmcgYmV0d2VlbiBWTklDIGFuZCBCR1g6TE1BQyAqLwotI2RlZmluZSBOSUNfTUFYX0JHWAkJCU1BWF9CR1hfUEVSX0NOODhYWAotI2RlZmluZQlOSUNfQ1BJX1BFUl9CR1gJCQkoTklDX0NQSV9DT1VOVCAvIE5JQ19NQVhfQkdYKQotI2RlZmluZQlOSUNfTUFYX0NQSV9QRVJfTE1BQwkJNjQgLyogTWF4IHdoZW4gQ1BJX0FMRyBpcyBJUCBkaWZmc2VydiAqLwotI2RlZmluZQlOSUNfUlNTSV9QRVJfQkdYCQkoTklDX1JTU0lfQ09VTlQgLyBOSUNfTUFYX0JHWCkKLQotLyogVHggc2NoZWR1bGluZyAqLwotI2RlZmluZQlOSUNfTUFYX1RMNAkJCTEwMjQKLSNkZWZpbmUJTklDX01BWF9UTDRfU0hBUEVSUwkJMjU2IC8qIDEgc2hhcGVyIGZvciA0IFRMNHMgKi8KLSNkZWZpbmUJTklDX01BWF9UTDMJCQkyNTYKLSNkZWZpbmUJTklDX01BWF9UTDNfU0hBUEVSUwkJNjQgIC8qIDEgc2hhcGVyIGZvciA0IFRMM3MgKi8KLSNkZWZpbmUJTklDX01BWF9UTDIJCQk2NAotI2RlZmluZQlOSUNfTUFYX1RMMl9TSEFQRVJTCQkyICAvKiAxIHNoYXBlciBmb3IgMzIgVEwycyAqLwotI2RlZmluZQlOSUNfTUFYX1RMMQkJCTIKLQotLyogVE5TIGJ5cGFzcyBtb2RlICovCi0jZGVmaW5lCU5JQ19UTDJfUEVSX0JHWAkJCTMyCi0jZGVmaW5lCU5JQ19UTDRfUEVSX0JHWAkJCShOSUNfTUFYX1RMNCAvIE5JQ19NQVhfQkdYKQotI2RlZmluZQlOSUNfVEw0X1BFUl9MTUFDCQkoTklDX01BWF9UTDQgLyBOSUNfQ0hBTlNfUEVSX0lORikKKy8qIE1heCB3aGVuIENQSV9BTEcgaXMgSVAgZGlmZnNlcnYgKi8KKyNkZWZpbmUJTklDX01BWF9DUElfUEVSX0xNQUMJCTY0CiAKIC8qIE5JQyBWRiBJbnRlcnJ1cHRzICovCiAjZGVmaW5lCU5JQ1ZGX0lOVFJfQ1EJCQkwCkBAIC0xNDgsNyArMTI3LDYgQEAKIAlzdHJ1Y3QJbmFwaV9zdHJ1Y3QgbmFwaTsKIH07CiAKLSNkZWZpbmUJTklDX1JTU0lfQ09VTlQJCQk0MDk2IC8qIFRvdGFsIG5vIG9mIFJTUyBpbmRpY2VzICovCiAjZGVmaW5lIE5JQ19NQVhfUlNTX0hBU0hfQklUUwkJOAogI2RlZmluZSBOSUNfTUFYX1JTU19JRFJfVEJMX1NJWkUJKDEgPDwgTklDX01BWF9SU1NfSEFTSF9CSVRTKQogI2RlZmluZSBSU1NfSEFTSF9LRVlfU0laRQkJNSAvKiAzMjAgYml0IGtleSAqLwpAQCAtMjczLDEyICsyNTEsMTQgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0ZGV2OwogCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKIAl2b2lkIF9faW9tZW0JCSpyZWdfYmFzZTsKKyNkZWZpbmUJTUFYX1FVRVVFU19QRVJfUVNFVAkJCTgKIAlzdHJ1Y3QgcXVldWVfc2V0CSpxczsKIAlzdHJ1Y3QgbmljdmZfY3FfcG9sbAkqbmFwaVs4XTsKIAl1OAkJCXZmX2lkOwogCXU4CQkJc3FzX2lkOwogCWJvb2wgICAgICAgICAgICAgICAgICAgIHNxc19tb2RlOwogCWJvb2wJCQlod190c287CisJYm9vbAkJCXQ4ODsKIAogCS8qIFJlY2VpdmUgYnVmZmVyIGFsbG9jICovCiAJdTMyCQkJcmJfcGFnZV9vZmZzZXQ7CkBAIC0zMjUsNyArMzA1LDcgQEAKIAlib29sCQkJbXNpeF9lbmFibGVkOwogCXU4CQkJbnVtX3ZlYzsKIAlzdHJ1Y3QgbXNpeF9lbnRyeQltc2l4X2VudHJpZXNbTklDX1ZGX01TSVhfVkVDVE9SU107Ci0JY2hhcgkJCWlycV9uYW1lW05JQ19WRl9NU0lYX1ZFQ1RPUlNdWzIwXTsKKwljaGFyCQkJaXJxX25hbWVbTklDX1ZGX01TSVhfVkVDVE9SU11bSUZOQU1TSVogKyAxNV07CiAJYm9vbAkJCWlycV9hbGxvY2F0ZWRbTklDX1ZGX01TSVhfVkVDVE9SU107CiAJY3B1bWFza192YXJfdAkJYWZmaW5pdHlfbWFza1tOSUNfVkZfTVNJWF9WRUNUT1JTXTsKIApAQCAtMzY4LDYgKzM0OCw3IEBACiAjZGVmaW5lCU5JQ19NQk9YX01TR19QTklDVkZfUFRSCQkweDE0CS8qIEdldCBwcmltYXJ5IHFzZXQgbmljdmYgcHRyICovCiAjZGVmaW5lCU5JQ19NQk9YX01TR19TTklDVkZfUFRSCQkweDE1CS8qIFNlbmQgc3FldCBuaWN2ZiBwdHIgdG8gUFZGICovCiAjZGVmaW5lCU5JQ19NQk9YX01TR19MT09QQkFDSwkJMHgxNgkvKiBTZXQgaW50ZXJmYWNlIGluIGxvb3BiYWNrICovCisjZGVmaW5lCU5JQ19NQk9YX01TR19SRVNFVF9TVEFUX0NPVU5URVIgMHgxNwkvKiBSZXNldCBzdGF0aXN0aWNzIGNvdW50ZXJzICovCiAjZGVmaW5lCU5JQ19NQk9YX01TR19DRkdfRE9ORQkJMHhGMAkvKiBWRiBjb25maWd1cmF0aW9uIGRvbmUgKi8KICNkZWZpbmUJTklDX01CT1hfTVNHX1NIVVRET1dOCQkweEYxCS8qIFZGIGlzIGJlaW5nIHNodXRkb3duICovCiAKQEAgLTQ4NCw2ICs0NjUsMzEgQEAKIAlib29sICBlbmFibGU7CiB9OwogCisvKiBSZXNldCBzdGF0aXN0aWNzIGNvdW50ZXJzICovCitzdHJ1Y3QgcmVzZXRfc3RhdF9jZmcgeworCXU4ICAgIG1zZzsKKwkvKiBCaXRtYXAgdG8gc2VsZWN0IE5JQ19QRl9WTklDKHZmX2lkKV9SWF9TVEFUKDAuLjEzKSAqLworCXUxNiAgIHJ4X3N0YXRfbWFzazsKKwkvKiBCaXRtYXAgdG8gc2VsZWN0IE5JQ19QRl9WTklDKHZmX2lkKV9UWF9TVEFUKDAuLjQpICovCisJdTggICAgdHhfc3RhdF9tYXNrOworCS8qIEJpdG1hcCB0byBzZWxlY3QgTklDX1BGX1FTKDAuLjEyNylfUlEoMC4uNylfU1RBVCgwLi4xKQorCSAqIGJpdDE0LCBiaXQxNSBOSUNfUEZfUVModmZfaWQpX1JRN19TVEFUKDAuLjEpCisJICogYml0MTIsIGJpdDEzIE5JQ19QRl9RUyh2Zl9pZClfUlE2X1NUQVQoMC4uMSkKKwkgKiAuLgorCSAqIGJpdDIsIGJpdDMgTklDX1BGX1FTKHZmX2lkKV9SUTFfU1RBVCgwLi4xKQorCSAqIGJpdDAsIGJpdDEgTklDX1BGX1FTKHZmX2lkKV9SUTBfU1RBVCgwLi4xKQorCSAqLworCXUxNiAgIHJxX3N0YXRfbWFzazsKKwkvKiBCaXRtYXAgdG8gc2VsZWN0IE5JQ19QRl9RUygwLi4xMjcpX1NRKDAuLjcpX1NUQVQoMC4uMSkKKwkgKiBiaXQxNCwgYml0MTUgTklDX1BGX1FTKHZmX2lkKV9TUTdfU1RBVCgwLi4xKQorCSAqIGJpdDEyLCBiaXQxMyBOSUNfUEZfUVModmZfaWQpX1NRNl9TVEFUKDAuLjEpCisJICogLi4KKwkgKiBiaXQyLCBiaXQzIE5JQ19QRl9RUyh2Zl9pZClfU1ExX1NUQVQoMC4uMSkKKwkgKiBiaXQwLCBiaXQxIE5JQ19QRl9RUyh2Zl9pZClfU1EwX1NUQVQoMC4uMSkKKwkgKi8KKwl1MTYgICBzcV9zdGF0X21hc2s7Cit9OworCiAvKiAxMjggYml0IHNoYXJlZCBtZW1vcnkgYmV0d2VlbiBQRiBhbmQgZWFjaCBWRiAqLwogdW5pb24gbmljX21ieCB7CiAJc3RydWN0IHsgdTggbXNnOyB9CW1zZzsKQEAgLTUwMSw2ICs1MDcsNyBAQAogCXN0cnVjdCBzcXNfYWxsb2MgICAgICAgIHNxc19hbGxvYzsKIAlzdHJ1Y3QgbmljdmZfcHRyCW5pY3ZmOwogCXN0cnVjdCBzZXRfbG9vcGJhY2sJbGJrOworCXN0cnVjdCByZXNldF9zdGF0X2NmZwlyZXNldF9zdGF0OwogfTsKIAogI2RlZmluZSBOSUNfTk9ERV9JRF9NQVNLCTB4MDMKQEAgLTUxNCw3ICs1MjEsMTQgQEAKIAogc3RhdGljIGlubGluZSBib29sIHBhc3MxX3NpbGljb24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0JcmV0dXJuIHBkZXYtPnJldmlzaW9uIDwgODsKKwlyZXR1cm4gKHBkZXYtPnJldmlzaW9uIDwgOCkgJiYKKwkJKHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gUENJX1NVQlNZU19ERVZJRF84OFhYX05JQ19QRik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwYXNzMl9zaWxpY29uKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiAocGRldi0+cmV2aXNpb24gPj0gOCkgJiYKKwkJKHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gUENJX1NVQlNZU19ERVZJRF84OFhYX05JQ19QRik7CiB9CiAKIGludCBuaWN2Zl9zZXRfcmVhbF9udW1fcXVldWVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljX21haW4uYwppbmRleCAxNmVkMjAzLi4yYmJmNGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY19tYWluLmMKQEAgLTIwLDggKzIwLDI1IEBACiAjZGVmaW5lIERSVl9OQU1FCSJ0aHVuZGVyLW5pYyIKICNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMCIKIAorc3RydWN0IGh3X2luZm8geworCXU4CQliZ3hfY250OworCXU4CQljaGFuc19wZXJfbG1hYzsKKwl1OAkJY2hhbnNfcGVyX2JneDsgLyogUngvVHggY2hhbnMgKi8KKwl1OAkJY2hhbnNfcGVyX3JneDsKKwl1OAkJY2hhbnNfcGVyX2xiazsKKwl1MTYJCWNwaV9jbnQ7CisJdTE2CQlyc3NpX2NudDsKKwl1MTYJCXJzc19pbmRfdGJsX3NpemU7CisJdTE2CQl0bDRfY250OworCXUxNgkJdGwzX2NudDsKKwl1OAkJdGwyX2NudDsKKwl1OAkJdGwxX2NudDsKKwlib29sCQl0bDFfcGVyX2JneDsgLyogVEwxIHBlciBCR1ggb3IgcGVyIExNQUMgKi8KK307CisKIHN0cnVjdCBuaWNwZiB7CiAJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworCXN0cnVjdCBod19pbmZvICAgICAgICAgICpodzsKIAl1OAkJCW5vZGU7CiAJdW5zaWduZWQgaW50CQlmbGFnczsKIAl1OAkJCW51bV92Zl9lbjsgICAgICAvKiBObyBvZiBWRiBlbmFibGVkICovCkBAIC0zNiwyMiArNTMsMjIgQEAKICNkZWZpbmUJTklDX1NFVF9WRl9MTUFDX01BUChiZ3gsIGxtYWMpCSgoKGJneCAmIDB4RikgPDwgNCkgfCAobG1hYyAmIDB4RikpCiAjZGVmaW5lCU5JQ19HRVRfQkdYX0ZST01fVkZfTE1BQ19NQVAobWFwKQkoKG1hcCA+PiA0KSAmIDB4RikKICNkZWZpbmUJTklDX0dFVF9MTUFDX0ZST01fVkZfTE1BQ19NQVAobWFwKQkobWFwICYgMHhGKQotCXU4CQkJdmZfbG1hY19tYXBbTUFYX0xNQUNdOworCXU4CQkJKnZmX2xtYWNfbWFwOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgICAgIGR3b3JrOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpjaGVja19saW5rOwotCXU4CQkJbGlua1tNQVhfTE1BQ107Ci0JdTgJCQlkdXBsZXhbTUFYX0xNQUNdOwotCXUzMgkJCXNwZWVkW01BWF9MTUFDXTsKKwl1OAkJCSpsaW5rOworCXU4CQkJKmR1cGxleDsKKwl1MzIJCQkqc3BlZWQ7CiAJdTE2CQkJY3BpX2Jhc2VbTUFYX05VTV9WRlNfU1VQUE9SVEVEXTsKIAl1MTYJCQlyc3NpX2Jhc2VbTUFYX05VTV9WRlNfU1VQUE9SVEVEXTsKLQl1MTYJCQlyc3NfaW5kX3RibF9zaXplOwogCWJvb2wJCQltYnhfbG9ja1tNQVhfTlVNX1ZGU19TVVBQT1JURURdOwogCiAJLyogTVNJLVggKi8KIAlib29sCQkJbXNpeF9lbmFibGVkOwogCXU4CQkJbnVtX3ZlYzsKLQlzdHJ1Y3QgbXNpeF9lbnRyeQltc2l4X2VudHJpZXNbTklDX1BGX01TSVhfVkVDVE9SU107CisJc3RydWN0IG1zaXhfZW50cnkJKm1zaXhfZW50cmllczsKIAlib29sCQkJaXJxX2FsbG9jYXRlZFtOSUNfUEZfTVNJWF9WRUNUT1JTXTsKKwljaGFyCQkJaXJxX25hbWVbTklDX1BGX01TSVhfVkVDVE9SU11bMjBdOwogfTsKIAogLyogU3VwcG9ydGVkIGRldmljZXMgKi8KQEAgLTg5LDkgKzEwNiwyMiBAQAogLyogUEYgLT4gVkYgbWFpbGJveCBjb21tdW5pY2F0aW9uIEFQSXMgKi8KIHN0YXRpYyB2b2lkIG5pY19lbmFibGVfbWJ4X2ludHIoc3RydWN0IG5pY3BmICpuaWMpCiB7Ci0JLyogRW5hYmxlIG1haWxib3ggaW50ZXJydXB0IGZvciBhbGwgMTI4IFZGcyAqLwotCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfTUFJTEJPWF9FTkFfVzFTLCB+MHVsbCk7Ci0JbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9NQUlMQk9YX0VOQV9XMVMgKyBzaXplb2YodTY0KSwgfjB1bGwpOworCWludCB2Zl9jbnQgPSBwY2lfc3Jpb3ZfZ2V0X3RvdGFsdmZzKG5pYy0+cGRldik7CisKKyNkZWZpbmUgSU5UUl9NQVNLKHZmcykgKCh2ZnMgPCA2NCkgPyAoQklUX1VMTCh2ZnMpIC0gMSkgOiAofjB1bGwpKQorCisJLyogQ2xlYXIgaXQsIHRvIGF2b2lkIHNwdXJpb3VzIGludGVycnVwdHMgKGlmIGFueSkgKi8KKwluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX01BSUxCT1hfSU5ULCBJTlRSX01BU0sodmZfY250KSk7CisKKwkvKiBFbmFibGUgbWFpbGJveCBpbnRlcnJ1cHQgZm9yIGFsbCBWRnMgKi8KKwluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX01BSUxCT1hfRU5BX1cxUywgSU5UUl9NQVNLKHZmX2NudCkpOworCS8qIE9uZSBtYWlsYm94IGludHIgZW5hYmxlIHJlZyBwZXIgNjQgVkZzICovCisJaWYgKHZmX2NudCA+IDY0KSB7CisJCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfTUFJTEJPWF9JTlQgKyBzaXplb2YodTY0KSwKKwkJCSAgICAgIElOVFJfTUFTSyh2Zl9jbnQgLSA2NCkpOworCQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX01BSUxCT1hfRU5BX1cxUyArIHNpemVvZih1NjQpLAorCQkJICAgICAgSU5UUl9NQVNLKHZmX2NudCAtIDY0KSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBuaWNfY2xlYXJfbWJ4X2ludHIoc3RydWN0IG5pY3BmICpuaWMsIGludCB2ZiwgaW50IG1ieF9yZWcpCkBAIC0xNDQsNyArMTc0LDcgQEAKIAogCW1ieC5uaWNfY2ZnLnRuc19tb2RlID0gTklDX1ROU19CWVBBU1NfTU9ERTsKIAotCWlmICh2ZiA8IE1BWF9MTUFDKSB7CisJaWYgKHZmIDwgbmljLT5udW1fdmZfZW4pIHsKIAkJYmd4X2lkeCA9IE5JQ19HRVRfQkdYX0ZST01fVkZfTE1BQ19NQVAobmljLT52Zl9sbWFjX21hcFt2Zl0pOwogCQlsbWFjID0gTklDX0dFVF9MTUFDX0ZST01fVkZfTE1BQ19NQVAobmljLT52Zl9sbWFjX21hcFt2Zl0pOwogCkBAIC0xNTUsNyArMTg1LDcgQEAKIAltYngubmljX2NmZy5zcXNfbW9kZSA9ICh2ZiA+PSBuaWMtPm51bV92Zl9lbikgPyB0cnVlIDogZmFsc2U7CiAJbWJ4Lm5pY19jZmcubm9kZV9pZCA9IG5pYy0+bm9kZTsKIAotCW1ieC5uaWNfY2ZnLmxvb3BiYWNrX3N1cHBvcnRlZCA9IHZmIDwgTUFYX0xNQUM7CisJbWJ4Lm5pY19jZmcubG9vcGJhY2tfc3VwcG9ydGVkID0gdmYgPCBuaWMtPm51bV92Zl9lbjsKIAogCW5pY19zZW5kX21zZ190b192ZihuaWMsIHZmLCAmbWJ4KTsKIH0KQEAgLTI0OCwxNCArMjc4LDI3IEBACiAvKiBTZXQgbWluaW11bSB0cmFuc21pdCBwYWNrZXQgc2l6ZSAqLwogc3RhdGljIHZvaWQgbmljX3NldF90eF9wa3RfcGFkKHN0cnVjdCBuaWNwZiAqbmljLCBpbnQgc2l6ZSkKIHsKLQlpbnQgbG1hYzsKKwlpbnQgbG1hYywgbWF4X2xtYWM7CisJdTE2IHNkZXZpZDsKIAl1NjQgbG1hY19jZmc7CiAKLQkvKiBNYXggdmFsdWUgdGhhdCBjYW4gYmUgc2V0IGlzIDYwICovCi0JaWYgKHNpemUgPiA2MCkKLQkJc2l6ZSA9IDYwOworCS8qIFRoZXJlIGlzIGEgaXNzdWUgaW4gSFcgd2hlcmUtaW4gd2hpbGUgc2VuZGluZyBHU08gc2l6ZWQKKwkgKiBwa3RzIGFzIHBhcnQgb2YgVFNPLCBpZiBwa3QgbGVuIGZhbGxzIGJlbG93IHRoaXMgc2l6ZQorCSAqIE5JQyB3aWxsIHplcm8gUEFEIHBhY2tldCBhbmQgYWxzbyB1cGRhdGVzIElQIHRvdGFsIGxlbmd0aC4KKwkgKiBIZW5jZSBzZXQgdGhpcyB2YWx1ZSB0byBsZXNzdGhhbiBtaW4gcGt0IHNpemUgb2YgTUFDK0lQK1RDUAorCSAqIGhlYWRlcnMsIEJHWCB3aWxsIGRvIHRoZSBwYWRkaW5nIHRvIHRyYW5zbWl0IDY0IGJ5dGUgcGt0LgorCSAqLworCWlmIChzaXplID4gNTIpCisJCXNpemUgPSA1MjsKIAotCWZvciAobG1hYyA9IDA7IGxtYWMgPCAoTUFYX0JHWF9QRVJfQ044OFhYICogTUFYX0xNQUNfUEVSX0JHWCk7IGxtYWMrKykgeworCXBjaV9yZWFkX2NvbmZpZ193b3JkKG5pYy0+cGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJnNkZXZpZCk7CisJLyogODF4eCdzIFJHWCBoYXMgb25seSBvbmUgTE1BQyAqLworCWlmIChzZGV2aWQgPT0gUENJX1NVQlNZU19ERVZJRF84MVhYX05JQ19QRikKKwkJbWF4X2xtYWMgPSAoKG5pYy0+aHctPmJneF9jbnQgLSAxKSAqIE1BWF9MTUFDX1BFUl9CR1gpICsgMTsKKwllbHNlCisJCW1heF9sbWFjID0gbmljLT5ody0+Ymd4X2NudCAqIE1BWF9MTUFDX1BFUl9CR1g7CisKKwlmb3IgKGxtYWMgPSAwOyBsbWFjIDwgbWF4X2xtYWM7IGxtYWMrKykgewogCQlsbWFjX2NmZyA9IG5pY19yZWdfcmVhZChuaWMsIE5JQ19QRl9MTUFDXzBfN19DRkcgfCAobG1hYyA8PCAzKSk7CiAJCWxtYWNfY2ZnICY9IH4oMHhGIDw8IDIpOwogCQlsbWFjX2NmZyB8PSAoKHNpemUgLyA0KSA8PCAyKTsKQEAgLTI3NSw3ICszMTgsNyBAQAogCiAJbmljLT5udW1fdmZfZW4gPSAwOwogCi0JZm9yIChiZ3ggPSAwOyBiZ3ggPCBOSUNfTUFYX0JHWDsgYmd4KyspIHsKKwlmb3IgKGJneCA9IDA7IGJneCA8IG5pYy0+aHctPmJneF9jbnQ7IGJneCsrKSB7CiAJCWlmICghKGJneF9tYXAgJiAoMSA8PCBiZ3gpKSkKIAkJCWNvbnRpbnVlOwogCQlsbWFjX2NudCA9IGJneF9nZXRfbG1hY19jb3VudChuaWMtPm5vZGUsIGJneCk7CkBAIC0yOTUsMjggKzMzOCwxMjUgQEAKIAkJCW5pY19yZWdfd3JpdGUobmljLAogCQkJCSAgICAgIE5JQ19QRl9MTUFDXzBfN19DUkVESVQgKyAobG1hYyAqIDgpLAogCQkJCSAgICAgIGxtYWNfY3JlZGl0KTsKKworCQkvKiBPbiBDTjgxWFggdGhlcmUgYXJlIG9ubHkgOCBWRnMgYnV0IG1heCBwb3NzaWJsZSBubyBvZgorCQkgKiBpbnRlcmZhY2VzIGFyZSA5LgorCQkgKi8KKwkJaWYgKG5pYy0+bnVtX3ZmX2VuID49IHBjaV9zcmlvdl9nZXRfdG90YWx2ZnMobmljLT5wZGV2KSkgeworCQkJbmljLT5udW1fdmZfZW4gPSBwY2lfc3Jpb3ZfZ2V0X3RvdGFsdmZzKG5pYy0+cGRldik7CisJCQlicmVhazsKKwkJfQogCX0KIH0KIAorc3RhdGljIHZvaWQgbmljX2ZyZWVfbG1hY21lbShzdHJ1Y3QgbmljcGYgKm5pYykKK3sKKwlrZnJlZShuaWMtPnZmX2xtYWNfbWFwKTsKKwlrZnJlZShuaWMtPmxpbmspOworCWtmcmVlKG5pYy0+ZHVwbGV4KTsKKwlrZnJlZShuaWMtPnNwZWVkKTsKK30KKworc3RhdGljIGludCBuaWNfZ2V0X2h3X2luZm8oc3RydWN0IG5pY3BmICpuaWMpCit7CisJdTggbWF4X2xtYWM7CisJdTE2IHNkZXZpZDsKKwlzdHJ1Y3QgaHdfaW5mbyAqaHcgPSBuaWMtPmh3OworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQobmljLT5wZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmc2RldmlkKTsKKworCXN3aXRjaCAoc2RldmlkKSB7CisJY2FzZSBQQ0lfU1VCU1lTX0RFVklEXzg4WFhfTklDX1BGOgorCQlody0+Ymd4X2NudCA9IE1BWF9CR1hfUEVSX0NOODhYWDsKKwkJaHctPmNoYW5zX3Blcl9sbWFjID0gMTY7CisJCWh3LT5jaGFuc19wZXJfYmd4ID0gMTI4OworCQlody0+Y3BpX2NudCA9IDIwNDg7CisJCWh3LT5yc3NpX2NudCA9IDQwOTY7CisJCWh3LT5yc3NfaW5kX3RibF9zaXplID0gTklDX01BWF9SU1NfSURSX1RCTF9TSVpFOworCQlody0+dGwzX2NudCA9IDI1NjsKKwkJaHctPnRsMl9jbnQgPSA2NDsKKwkJaHctPnRsMV9jbnQgPSAyOworCQlody0+dGwxX3Blcl9iZ3ggPSB0cnVlOworCQlicmVhazsKKwljYXNlIFBDSV9TVUJTWVNfREVWSURfODFYWF9OSUNfUEY6CisJCWh3LT5iZ3hfY250ID0gTUFYX0JHWF9QRVJfQ044MVhYOworCQlody0+Y2hhbnNfcGVyX2xtYWMgPSA4OworCQlody0+Y2hhbnNfcGVyX2JneCA9IDMyOworCQlody0+Y2hhbnNfcGVyX3JneCA9IDg7CisJCWh3LT5jaGFuc19wZXJfbGJrID0gMjQ7CisJCWh3LT5jcGlfY250ID0gNTEyOworCQlody0+cnNzaV9jbnQgPSAyNTY7CisJCWh3LT5yc3NfaW5kX3RibF9zaXplID0gMzI7IC8qIE1heCBSU1NJIC8gTWF4IGludGVyZmFjZXMgKi8KKwkJaHctPnRsM19jbnQgPSA2NDsKKwkJaHctPnRsMl9jbnQgPSAxNjsKKwkJaHctPnRsMV9jbnQgPSAxMDsKKwkJaHctPnRsMV9wZXJfYmd4ID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgUENJX1NVQlNZU19ERVZJRF84M1hYX05JQ19QRjoKKwkJaHctPmJneF9jbnQgPSBNQVhfQkdYX1BFUl9DTjgzWFg7CisJCWh3LT5jaGFuc19wZXJfbG1hYyA9IDg7CisJCWh3LT5jaGFuc19wZXJfYmd4ID0gMzI7CisJCWh3LT5jaGFuc19wZXJfbGJrID0gNjQ7CisJCWh3LT5jcGlfY250ID0gMjA0ODsKKwkJaHctPnJzc2lfY250ID0gMTAyNDsKKwkJaHctPnJzc19pbmRfdGJsX3NpemUgPSA2NDsgLyogTWF4IFJTU0kgLyBNYXggaW50ZXJmYWNlcyAqLworCQlody0+dGwzX2NudCA9IDI1NjsKKwkJaHctPnRsMl9jbnQgPSA2NDsKKwkJaHctPnRsMV9jbnQgPSAxODsKKwkJaHctPnRsMV9wZXJfYmd4ID0gZmFsc2U7CisJCWJyZWFrOworCX0KKwlody0+dGw0X2NudCA9IE1BWF9RVUVVRVNfUEVSX1FTRVQgKiBwY2lfc3Jpb3ZfZ2V0X3RvdGFsdmZzKG5pYy0+cGRldik7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIExNQUMgdHJhY2tpbmcgZWxlbWVudHMgKi8KKwltYXhfbG1hYyA9IGh3LT5iZ3hfY250ICogTUFYX0xNQUNfUEVSX0JHWDsKKwluaWMtPnZmX2xtYWNfbWFwID0ga21hbGxvY19hcnJheShtYXhfbG1hYywgc2l6ZW9mKHU4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuaWMtPnZmX2xtYWNfbWFwKQorCQlnb3RvIGVycm9yOworCW5pYy0+bGluayA9IGttYWxsb2NfYXJyYXkobWF4X2xtYWMsIHNpemVvZih1OCksIEdGUF9LRVJORUwpOworCWlmICghbmljLT5saW5rKQorCQlnb3RvIGVycm9yOworCW5pYy0+ZHVwbGV4ID0ga21hbGxvY19hcnJheShtYXhfbG1hYywgc2l6ZW9mKHU4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuaWMtPmR1cGxleCkKKwkJZ290byBlcnJvcjsKKwluaWMtPnNwZWVkID0ga21hbGxvY19hcnJheShtYXhfbG1hYywgc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOworCWlmICghbmljLT5zcGVlZCkKKwkJZ290byBlcnJvcjsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJbmljX2ZyZWVfbG1hY21lbShuaWMpOworCXJldHVybiAtRU5PTUVNOworfQorCiAjZGVmaW5lIEJHWDBfQkxPQ0sgOAogI2RlZmluZSBCR1gxX0JMT0NLIDkKIAotc3RhdGljIHZvaWQgbmljX2luaXRfaHcoc3RydWN0IG5pY3BmICpuaWMpCitzdGF0aWMgaW50IG5pY19pbml0X2h3KHN0cnVjdCBuaWNwZiAqbmljKQogewotCWludCBpOworCWludCBpLCBlcnI7CiAJdTY0IGNxbV9jZmc7CiAKKwkvKiBHZXQgSFcgY2FwYWJpbGl0eSBpbmZvICovCisJZXJyID0gbmljX2dldF9od19pbmZvKG5pYyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCS8qIEVuYWJsZSBOSUMgSFcgYmxvY2sgKi8KIAluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX0NGRywgMHgzKTsKIAogCS8qIEVuYWJsZSBiYWNrcHJlc3N1cmUgKi8KIAluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX0JQX0NGRywgKDFVTEwgPDwgNikgfCAweDAzKTsKIAotCS8qIERpc2FibGUgVE5TIG1vZGUgb24gYm90aCBpbnRlcmZhY2VzICovCi0JbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9JTlRGXzBfMV9TRU5EX0NGRywKLQkJICAgICAgKE5JQ19UTlNfQllQQVNTX01PREUgPDwgNykgfCBCR1gwX0JMT0NLKTsKLQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX0lOVEZfMF8xX1NFTkRfQ0ZHIHwgKDEgPDwgOCksCi0JCSAgICAgIChOSUNfVE5TX0JZUEFTU19NT0RFIDw8IDcpIHwgQkdYMV9CTE9DSyk7CisJLyogVE5TIGFuZCBUTlMgYnlwYXNzIG1vZGVzIGFyZSBwcmVzZW50IG9ubHkgb24gODh4eCAqLworCWlmIChuaWMtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gUENJX1NVQlNZU19ERVZJRF84OFhYX05JQ19QRikgeworCQkvKiBEaXNhYmxlIFROUyBtb2RlIG9uIGJvdGggaW50ZXJmYWNlcyAqLworCQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX0lOVEZfMF8xX1NFTkRfQ0ZHLAorCQkJICAgICAgKE5JQ19UTlNfQllQQVNTX01PREUgPDwgNykgfCBCR1gwX0JMT0NLKTsKKwkJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9JTlRGXzBfMV9TRU5EX0NGRyB8ICgxIDw8IDgpLAorCQkJICAgICAgKE5JQ19UTlNfQllQQVNTX01PREUgPDwgNykgfCBCR1gxX0JMT0NLKTsKKwl9CisKIAluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX0lOVEZfMF8xX0JQX0NGRywKIAkJICAgICAgKDFVTEwgPDwgNjMpIHwgQkdYMF9CTE9DSyk7CiAJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9JTlRGXzBfMV9CUF9DRkcgKyAoMSA8PCA4KSwKQEAgLTM0NiwxMSArNDg2LDE0IEBACiAJY3FtX2NmZyA9IG5pY19yZWdfcmVhZChuaWMsIE5JQ19QRl9DUU1fQ0ZHKTsKIAlpZiAoY3FtX2NmZyA8IE5JQ1BGX0NRTV9NSU5fRFJPUF9MRVZFTCkKIAkJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9DUU1fQ0ZHLCBOSUNQRl9DUU1fTUlOX0RST1BfTEVWRUwpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIENoYW5uZWwgcGFyc2UgaW5kZXggY29uZmlndXJhdGlvbiAqLwogc3RhdGljIHZvaWQgbmljX2NvbmZpZ19jcGkoc3RydWN0IG5pY3BmICpuaWMsIHN0cnVjdCBjcGlfY2ZnX21zZyAqY2ZnKQogeworCXN0cnVjdCBod19pbmZvICpodyA9IG5pYy0+aHc7CiAJdTMyIHZuaWMsIGJneCwgbG1hYywgY2hhbjsKIAl1MzIgcGFkZCwgY3BpX2NvdW50ID0gMDsKIAl1NjQgY3BpX2Jhc2UsIGNwaSwgcnNzaV9iYXNlLCByc3NpOwpAQCAtMzYwLDkgKzUwMyw5IEBACiAJYmd4ID0gTklDX0dFVF9CR1hfRlJPTV9WRl9MTUFDX01BUChuaWMtPnZmX2xtYWNfbWFwW3ZuaWNdKTsKIAlsbWFjID0gTklDX0dFVF9MTUFDX0ZST01fVkZfTE1BQ19NQVAobmljLT52Zl9sbWFjX21hcFt2bmljXSk7CiAKLQljaGFuID0gKGxtYWMgKiBNQVhfQkdYX0NIQU5TX1BFUl9MTUFDKSArIChiZ3ggKiBOSUNfQ0hBTlNfUEVSX0lORik7Ci0JY3BpX2Jhc2UgPSAobG1hYyAqIE5JQ19NQVhfQ1BJX1BFUl9MTUFDKSArIChiZ3ggKiBOSUNfQ1BJX1BFUl9CR1gpOwotCXJzc2lfYmFzZSA9IChsbWFjICogbmljLT5yc3NfaW5kX3RibF9zaXplKSArIChiZ3ggKiBOSUNfUlNTSV9QRVJfQkdYKTsKKwljaGFuID0gKGxtYWMgKiBody0+Y2hhbnNfcGVyX2xtYWMpICsgKGJneCAqIGh3LT5jaGFuc19wZXJfYmd4KTsKKwljcGlfYmFzZSA9IHZuaWMgKiBOSUNfTUFYX0NQSV9QRVJfTE1BQzsKKwlyc3NpX2Jhc2UgPSB2bmljICogaHctPnJzc19pbmRfdGJsX3NpemU7CiAKIAkvKiBSeCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KIAluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX0NIQU5fMF8yNTVfUlhfQlBfQ0ZHIHwgKGNoYW4gPDwgMyksCkBAIC00MzQsNyArNTc3LDcgQEAKIAltc2cgPSAodTY0ICopJm1ieDsKIAogCW1ieC5yc3Nfc2l6ZS5tc2cgPSBOSUNfTUJPWF9NU0dfUlNTX1NJWkU7Ci0JbWJ4LnJzc19zaXplLmluZF90Ymxfc2l6ZSA9IG5pYy0+cnNzX2luZF90Ymxfc2l6ZTsKKwltYngucnNzX3NpemUuaW5kX3RibF9zaXplID0gbmljLT5ody0+cnNzX2luZF90Ymxfc2l6ZTsKIAluaWNfc2VuZF9tc2dfdG9fdmYobmljLCB2ZiwgJm1ieCk7CiB9CiAKQEAgLTQ4MSw3ICs2MjQsNyBAQAogLyogNCBsZXZlbCB0cmFuc21pdCBzaWRlIHNjaGVkdWxlciBjb25maWd1dGF0aW9uCiAgKiBmb3IgVE5TIGJ5cGFzcyBtb2RlCiAgKgotICogU2FtcGxlIGNvbmZpZ3VyYXRpb24gZm9yIFNRMAorICogU2FtcGxlIGNvbmZpZ3VyYXRpb24gZm9yIFNRMCBvbiA4OHh4CiAgKiBWTklDMC1TUTAgLT4gVEw0KDApICAgLT4gVEwzWzBdICAgLT4gVEwyWzBdICAtPiBUTDFbMF0gLT4gQkdYMAogICogVk5JQzEtU1EwIC0+IFRMNCg4KSAgIC0+IFRMM1syXSAgIC0+IFRMMlswXSAgLT4gVEwxWzBdIC0+IEJHWDAKICAqIFZOSUMyLVNRMCAtPiBUTDQoMTYpICAtPiBUTDNbNF0gICAtPiBUTDJbMV0gIC0+IFRMMVswXSAtPiBCR1gwCkBAIC00OTQsNiArNjM3LDcgQEAKIHN0YXRpYyB2b2lkIG5pY190eF9jaGFubmVsX2NmZyhzdHJ1Y3QgbmljcGYgKm5pYywgdTggdm5pYywKIAkJCSAgICAgICBzdHJ1Y3Qgc3FfY2ZnX21zZyAqc3EpCiB7CisJc3RydWN0IGh3X2luZm8gKmh3ID0gbmljLT5odzsKIAl1MzIgYmd4LCBsbWFjLCBjaGFuOwogCXUzMiB0bDIsIHRsMywgdGw0OwogCXUzMiBycl9xdWFudHVtOwpAQCAtNTEyLDIxICs2NTYsMjggQEAKIAkvKiAyNCBieXRlcyBmb3IgRkNTLCBJUEcgYW5kIHByZWFtYmxlICovCiAJcnJfcXVhbnR1bSA9ICgoTklDX0hXX01BWF9GUlMgKyAyNCkgLyA0KTsKIAotCWlmICghc3EtPnNxc19tb2RlKSB7Ci0JCXRsNCA9IChsbWFjICogTklDX1RMNF9QRVJfTE1BQykgKyAoYmd4ICogTklDX1RMNF9QRVJfQkdYKTsKLQl9IGVsc2UgewotCQlmb3IgKHN2ZiA9IDA7IHN2ZiA8IE1BWF9TUVNfUEVSX1ZGOyBzdmYrKykgewotCQkJaWYgKG5pYy0+dmZfc3FzW3Bxc192bmljXVtzdmZdID09IHZuaWMpCi0JCQkJYnJlYWs7CisJLyogRm9yIDg4eHggMC01MTEgVEw0IHRyYW5zbWl0cyB2aWEgQkdYMCBhbmQKKwkgKiA1MTItMTAyMyBUTDRzIHRyYW5zbWl0IHZpYSBCR1gxLgorCSAqLworCWlmIChody0+dGwxX3Blcl9iZ3gpIHsKKwkJdGw0ID0gYmd4ICogKGh3LT50bDRfY250IC8gaHctPmJneF9jbnQpOworCQlpZiAoIXNxLT5zcXNfbW9kZSkgeworCQkJdGw0ICs9IChsbWFjICogTUFYX1FVRVVFU19QRVJfUVNFVCk7CisJCX0gZWxzZSB7CisJCQlmb3IgKHN2ZiA9IDA7IHN2ZiA8IE1BWF9TUVNfUEVSX1ZGOyBzdmYrKykgeworCQkJCWlmIChuaWMtPnZmX3Nxc1twcXNfdm5pY11bc3ZmXSA9PSB2bmljKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXRsNCArPSAoTUFYX0xNQUNfUEVSX0JHWCAqIE1BWF9RVUVVRVNfUEVSX1FTRVQpOworCQkJdGw0ICs9IChsbWFjICogTUFYX1FVRVVFU19QRVJfUVNFVCAqIE1BWF9TUVNfUEVSX1ZGKTsKKwkJCXRsNCArPSAoc3ZmICogTUFYX1FVRVVFU19QRVJfUVNFVCk7CiAJCX0KLQkJdGw0ID0gKE1BWF9MTUFDX1BFUl9CR1ggKiBOSUNfVEw0X1BFUl9MTUFDKTsKLQkJdGw0ICs9IChsbWFjICogTklDX1RMNF9QRVJfTE1BQyAqIE1BWF9TUVNfUEVSX1ZGKTsKLQkJdGw0ICs9IChzdmYgKiBOSUNfVEw0X1BFUl9MTUFDKTsKLQkJdGw0ICs9IChiZ3ggKiBOSUNfVEw0X1BFUl9CR1gpOworCX0gZWxzZSB7CisJCXRsNCA9ICh2bmljICogTUFYX1FVRVVFU19QRVJfUVNFVCk7CiAJfQogCXRsNCArPSBzcV9pZHg7CiAKLQl0bDMgPSB0bDQgLyAoTklDX01BWF9UTDQgLyBOSUNfTUFYX1RMMyk7CisJdGwzID0gdGw0IC8gKGh3LT50bDRfY250IC8gaHctPnRsM19jbnQpOwogCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfUVNFVF8wXzEyN19TUV8wXzdfQ0ZHMiB8CiAJCSAgICAgICgodTY0KXZuaWMgPDwgTklDX1FTX0lEX1NISUZUKSB8CiAJCSAgICAgICgodTMyKXNxX2lkeCA8PCBOSUNfUV9OVU1fU0hJRlQpLCB0bDQpOwpAQCAtNTM0LDggKzY4NSwxOSBAQAogCQkgICAgICAoKHU2NCl2bmljIDw8IDI3KSB8ICgodTMyKXNxX2lkeCA8PCAyNCkgfCBycl9xdWFudHVtKTsKIAogCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfVEwzXzBfMjU1X0NGRyB8ICh0bDMgPDwgMyksIHJyX3F1YW50dW0pOwotCWNoYW4gPSAobG1hYyAqIE1BWF9CR1hfQ0hBTlNfUEVSX0xNQUMpICsgKGJneCAqIE5JQ19DSEFOU19QRVJfSU5GKTsKLQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1RMM18wXzI1NV9DSEFOIHwgKHRsMyA8PCAzKSwgY2hhbik7CisKKwkvKiBPbiA4OHh4IDAtMTI3IGNoYW5uZWxzIGFyZSBmb3IgQkdYMCBhbmQKKwkgKiAxMjctMjU1IGNoYW5uZWxzIGZvciBCR1gxLgorCSAqCisJICogT24gODF4eC84M3h4IFRMM19DSEFOIHJlZyBzaG91bGQgYmUgY29uZmlndXJlZCB3aXRoIGNoYW5uZWwKKwkgKiB3aXRoaW4gTE1BQyBpLmUgMC03IGFuZCBub3QgdGhlIGFjdHVhbCBjaGFubmVsIG51bWJlciBsaWtlIG9uIDg4eHgKKwkgKi8KKwljaGFuID0gKGxtYWMgKiBody0+Y2hhbnNfcGVyX2xtYWMpICsgKGJneCAqIGh3LT5jaGFuc19wZXJfYmd4KTsKKwlpZiAoaHctPnRsMV9wZXJfYmd4KQorCQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1RMM18wXzI1NV9DSEFOIHwgKHRsMyA8PCAzKSwgY2hhbik7CisJZWxzZQorCQluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1RMM18wXzI1NV9DSEFOIHwgKHRsMyA8PCAzKSwgMCk7CisKIAkvKiBFbmFibGUgYmFja3ByZXNzdXJlIG9uIHRoZSBjaGFubmVsICovCiAJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9DSEFOXzBfMjU1X1RYX0NGRyB8IChjaGFuIDw8IDMpLCAxKTsKIApAQCAtNTQ0LDYgKzcwNiwxNiBAQAogCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfVEwyXzBfNjNfQ0ZHIHwgKHRsMiA8PCAzKSwgcnJfcXVhbnR1bSk7CiAJLyogTm8gcHJpb3JpdGllcyBhcyBvZiBub3cgKi8KIAluaWNfcmVnX3dyaXRlKG5pYywgTklDX1BGX1RMMl8wXzYzX1BSSSB8ICh0bDIgPDwgMyksIDB4MDApOworCisJLyogVW5saWtlIDg4eHggd2hlcmUgVEwycyAwLTMxIHRyYW5zbWl0cyB0byBUTDEgJzAnIGFuZCByZXN0IHRvIFRMMSAnMScKKwkgKiBvbiA4MXh4LzgzeHggVEwyIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgdG8gdHJhbnNtaXQgdG8gb25lIG9mIHRoZQorCSAqIHBvc3NpYmxlIExNQUNzLgorCSAqCisJICogVGhpcyByZWdpc3RlciBkb2Vzbid0IGV4aXN0IG9uIDg4eHguCisJICovCisJaWYgKCFody0+dGwxX3Blcl9iZ3gpCisJCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfVEwyX0xNQUMgfCAodGwyIDw8IDMpLAorCQkJICAgICAgbG1hYyArIChiZ3ggKiBNQVhfTE1BQ19QRVJfQkdYKSk7CiB9CiAKIC8qIFNlbmQgcHJpbWFyeSBuaWN2ZiBwb2ludGVyIHRvIHNlY29uZGFyeSBRUydzIFZGICovCkBAIC02MTUsNyArNzg3LDcgQEAKIHsKIAlpbnQgYmd4X2lkeCwgbG1hY19pZHg7CiAKLQlpZiAobGJrLT52Zl9pZCA+IE1BWF9MTUFDKQorCWlmIChsYmstPnZmX2lkID49IG5pYy0+bnVtX3ZmX2VuKQogCQlyZXR1cm4gLTE7CiAKIAliZ3hfaWR4ID0gTklDX0dFVF9CR1hfRlJPTV9WRl9MTUFDX01BUChuaWMtPnZmX2xtYWNfbWFwW2xiay0+dmZfaWRdKTsKQEAgLTYyNiw2ICs3OTgsNjcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogUmVzZXQgc3RhdGlzdGljcyBjb3VudGVycyAqLworc3RhdGljIGludCBuaWNfcmVzZXRfc3RhdF9jb3VudGVycyhzdHJ1Y3QgbmljcGYgKm5pYywKKwkJCQkgICBpbnQgdmYsIHN0cnVjdCByZXNldF9zdGF0X2NmZyAqY2ZnKQoreworCWludCBpLCBzdGF0LCBxbnVtOworCXU2NCByZWdfYWRkcjsKKworCWZvciAoaSA9IDA7IGkgPCBSWF9TVEFUU19FTlVNX0xBU1Q7IGkrKykgeworCQlpZiAoY2ZnLT5yeF9zdGF0X21hc2sgJiBCSVQoaSkpIHsKKwkJCXJlZ19hZGRyID0gTklDX1BGX1ZOSUNfMF8xMjdfUlhfU1RBVF8wXzEzIHwKKwkJCQkgICAodmYgPDwgTklDX1FTX0lEX1NISUZUKSB8CisJCQkJICAgKGkgPDwgMyk7CisJCQluaWNfcmVnX3dyaXRlKG5pYywgcmVnX2FkZHIsIDApOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRYX1NUQVRTX0VOVU1fTEFTVDsgaSsrKSB7CisJCWlmIChjZmctPnR4X3N0YXRfbWFzayAmIEJJVChpKSkgeworCQkJcmVnX2FkZHIgPSBOSUNfUEZfVk5JQ18wXzEyN19UWF9TVEFUXzBfNCB8CisJCQkJICAgKHZmIDw8IE5JQ19RU19JRF9TSElGVCkgfAorCQkJCSAgIChpIDw8IDMpOworCQkJbmljX3JlZ193cml0ZShuaWMsIHJlZ19hZGRyLCAwKTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPD0gMTU7IGkrKykgeworCQlxbnVtID0gaSA+PiAxOworCQlzdGF0ID0gaSAmIDEgPyAxIDogMDsKKwkJcmVnX2FkZHIgPSAodmYgPDwgTklDX1FTX0lEX1NISUZUKSB8CisJCQkgICAocW51bSA8PCBOSUNfUV9OVU1fU0hJRlQpIHwgKHN0YXQgPDwgMyk7CisJCWlmIChjZmctPnJxX3N0YXRfbWFzayAmIEJJVChpKSkgeworCQkJcmVnX2FkZHIgfD0gTklDX1BGX1FTRVRfMF8xMjdfUlFfMF83X1NUQVRfMF8xOworCQkJbmljX3JlZ193cml0ZShuaWMsIHJlZ19hZGRyLCAwKTsKKwkJfQorCQlpZiAoY2ZnLT5zcV9zdGF0X21hc2sgJiBCSVQoaSkpIHsKKwkJCXJlZ19hZGRyIHw9IE5JQ19QRl9RU0VUXzBfMTI3X1NRXzBfN19TVEFUXzBfMTsKKwkJCW5pY19yZWdfd3JpdGUobmljLCByZWdfYWRkciwgMCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5pY19lbmFibGVfdHVubmVsX3BhcnNpbmcoc3RydWN0IG5pY3BmICpuaWMsIGludCB2ZikKK3sKKwl1NjQgcHJvdF9kZWYgPSAoSVBWNl9QUk9UIDw8IDMyKSB8IChJUFY0X1BST1QgPDwgMTYpIHwgRVRfUFJPVDsKKwl1NjQgdnhsYW5fcHJvdF9kZWYgPSAoSVBWNl9QUk9UX0RFRiA8PCAzMikgfAorCQkJICAgICAgKElQVjRfUFJPVF9ERUYpIDw8IDE2IHwgRVRfUFJPVF9ERUY7CisKKwkvKiBDb25maWd1cmUgdHVubmVsIHBhcnNpbmcgcGFyYW1ldGVycyAqLworCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfUlhfR0VORVZFX0RFRiwKKwkJICAgICAgKDFVTEwgPDwgNjMgfCBVRFBfR0VORVZFX1BPUlRfTlVNKSk7CisJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9SWF9HRU5FVkVfUFJPVF9ERUYsCisJCSAgICAgICgoN1VMTCA8PCA2MSkgfCBwcm90X2RlZikpOworCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfUlhfTlZHUkVfUFJPVF9ERUYsCisJCSAgICAgICgoN1VMTCA8PCA2MSkgfCBwcm90X2RlZikpOworCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfUlhfVlhMQU5fREVGXzBfMSwKKwkJICAgICAgKCgxVUxMIDw8IDYzKSB8IFVEUF9WWExBTl9QT1JUX05VTSkpOworCW5pY19yZWdfd3JpdGUobmljLCBOSUNfUEZfUlhfVlhMQU5fUFJPVF9ERUYsCisJCSAgICAgICgoMHhmVUxMIDw8IDYwKSB8IHZ4bGFuX3Byb3RfZGVmKSk7Cit9CisKIHN0YXRpYyB2b2lkIG5pY19lbmFibGVfdmYoc3RydWN0IG5pY3BmICpuaWMsIGludCB2ZiwgYm9vbCBlbmFibGUpCiB7CiAJaW50IGJneCwgbG1hYzsKQEAgLTY2NCwxOCArODk3LDE3IEBACiAJCW1ieF9hZGRyICs9IHNpemVvZih1NjQpOwogCX0KIAotCWRldl9kYmcoJm5pYy0+cGRldi0+ZGV2LCAiJXM6IE1haWxib3ggbXNnICVkIGZyb20gVkYlZFxuIiwKKwlkZXZfZGJnKCZuaWMtPnBkZXYtPmRldiwgIiVzOiBNYWlsYm94IG1zZyAweCUwMnggZnJvbSBWRiVkXG4iLAogCQlfX2Z1bmNfXywgbWJ4Lm1zZy5tc2csIHZmKTsKIAlzd2l0Y2ggKG1ieC5tc2cubXNnKSB7CiAJY2FzZSBOSUNfTUJPWF9NU0dfUkVBRFk6CiAJCW5pY19tYnhfc2VuZF9yZWFkeShuaWMsIHZmKTsKLQkJaWYgKHZmIDwgTUFYX0xNQUMpIHsKKwkJaWYgKHZmIDwgbmljLT5udW1fdmZfZW4pIHsKIAkJCW5pYy0+bGlua1t2Zl0gPSAwOwogCQkJbmljLT5kdXBsZXhbdmZdID0gMDsKIAkJCW5pYy0+c3BlZWRbdmZdID0gMDsKIAkJfQotCQlyZXQgPSAxOwotCQlicmVhazsKKwkJZ290byB1bmxvY2s7CiAJY2FzZSBOSUNfTUJPWF9NU0dfUVNfQ0ZHOgogCQlyZWdfYWRkciA9IE5JQ19QRl9RU0VUXzBfMTI3X0NGRyB8CiAJCQkgICAobWJ4LnFzLm51bSA8PCBOSUNfUVNfSURfU0hJRlQpOwpAQCAtNjkzLDYgKzkyNSwxNSBAQAogCQkJICAgKG1ieC5ycS5xc19udW0gPDwgTklDX1FTX0lEX1NISUZUKSB8CiAJCQkgICAobWJ4LnJxLnJxX251bSA8PCBOSUNfUV9OVU1fU0hJRlQpOwogCQluaWNfcmVnX3dyaXRlKG5pYywgcmVnX2FkZHIsIG1ieC5ycS5jZmcpOworCQkvKiBFbmFibGUgQ1FFX1JYMl9TIGV4dGVuc2lvbiBpbiBDUUVfUlggZGVzY3JpcHRvci4KKwkJICogVGhpcyBnZXRzIGFwcGVuZGVkIGJ5IGRlZmF1bHQgb24gODF4eC84M3h4IGNoaXBzLAorCQkgKiBmb3IgY29uc2lzdGVuY3kgZW5hYmxpbmcgdGhlIHNhbWUgb24gODh4eCBwYXNzMgorCQkgKiB3aGVyZSB0aGlzIGlzIGludHJvZHVjZWQuCisJCSAqLworCQlpZiAocGFzczJfc2lsaWNvbihuaWMtPnBkZXYpKQorCQkJbmljX3JlZ193cml0ZShuaWMsIE5JQ19QRl9SWF9DRkcsIDB4MDEpOworCQlpZiAoIXBhc3MxX3NpbGljb24obmljLT5wZGV2KSkKKwkJCW5pY19lbmFibGVfdHVubmVsX3BhcnNpbmcobmljLCB2Zik7CiAJCWJyZWFrOwogCWNhc2UgTklDX01CT1hfTVNHX1JRX0JQX0NGRzoKIAkJcmVnX2FkZHIgPSBOSUNfUEZfUVNFVF8wXzEyN19SUV8wXzdfQlBfQ0ZHIHwKQEAgLTcxNyw4ICs5NTgsMTAgQEAKIAkJbmljX3R4X2NoYW5uZWxfY2ZnKG5pYywgbWJ4LnFzLm51bSwgJm1ieC5zcSk7CiAJCWJyZWFrOwogCWNhc2UgTklDX01CT1hfTVNHX1NFVF9NQUM6Ci0JCWlmICh2ZiA+PSBuaWMtPm51bV92Zl9lbikKKwkJaWYgKHZmID49IG5pYy0+bnVtX3ZmX2VuKSB7CisJCQlyZXQgPSAtMTsgLyogTkFDSyAqLwogCQkJYnJlYWs7CisJCX0KIAkJbG1hYyA9IG1ieC5tYWMudmZfaWQ7CiAJCWJneCA9IE5JQ19HRVRfQkdYX0ZST01fVkZfTE1BQ19NQVAobmljLT52Zl9sbWFjX21hcFtsbWFjXSk7CiAJCWxtYWMgPSBOSUNfR0VUX0xNQUNfRlJPTV9WRl9MTUFDX01BUChuaWMtPnZmX2xtYWNfbWFwW2xtYWNdKTsKQEAgLTc2NywyNSArMTAxMCwzOCBAQAogCWNhc2UgTklDX01CT1hfTVNHX0xPT1BCQUNLOgogCQlyZXQgPSBuaWNfY29uZmlnX2xvb3BiYWNrKG5pYywgJm1ieC5sYmspOwogCQlicmVhazsKKwljYXNlIE5JQ19NQk9YX01TR19SRVNFVF9TVEFUX0NPVU5URVI6CisJCXJldCA9IG5pY19yZXNldF9zdGF0X2NvdW50ZXJzKG5pYywgdmYsICZtYngucmVzZXRfc3RhdCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoJm5pYy0+cGRldi0+ZGV2LAogCQkJIkludmFsaWQgbXNnIGZyb20gVkYlZCwgbXNnIDB4JXhcbiIsIHZmLCBtYngubXNnLm1zZyk7CiAJCWJyZWFrOwogCX0KIAotCWlmICghcmV0KQorCWlmICghcmV0KSB7CiAJCW5pY19tYnhfc2VuZF9hY2sobmljLCB2Zik7Ci0JZWxzZSBpZiAobWJ4Lm1zZy5tc2cgIT0gTklDX01CT1hfTVNHX1JFQURZKQorCX0gZWxzZSBpZiAobWJ4Lm1zZy5tc2cgIT0gTklDX01CT1hfTVNHX1JFQURZKSB7CisJCWRldl9lcnIoJm5pYy0+cGRldi0+ZGV2LCAiTkFDSyBmb3IgTUJPWCAweCUwMnggZnJvbSBWRiAlZFxuIiwKKwkJCW1ieC5tc2cubXNnLCB2Zik7CiAJCW5pY19tYnhfc2VuZF9uYWNrKG5pYywgdmYpOworCX0KIHVubG9jazoKIAluaWMtPm1ieF9sb2NrW3ZmXSA9IGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCBuaWNfbWJ4X2ludHJfaGFuZGxlciAoc3RydWN0IG5pY3BmICpuaWMsIGludCBtYngpCitzdGF0aWMgaXJxcmV0dXJuX3QgbmljX21ieF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqbmljX2lycSkKIHsKKwlzdHJ1Y3QgbmljcGYgKm5pYyA9IChzdHJ1Y3QgbmljcGYgKiluaWNfaXJxOworCWludCBtYng7CiAJdTY0IGludHI7CiAJdTggIHZmLCB2Zl9wZXJfbWJ4X3JlZyA9IDY0OwogCisJaWYgKGlycSA9PSBuaWMtPm1zaXhfZW50cmllc1tOSUNfUEZfSU5UUl9JRF9NQk9YMF0udmVjdG9yKQorCQltYnggPSAwOworCWVsc2UKKwkJbWJ4ID0gMTsKKwogCWludHIgPSBuaWNfcmVnX3JlYWQobmljLCBOSUNfUEZfTUFJTEJPWF9JTlQgKyAobWJ4IDw8IDMpKTsKIAlkZXZfZGJnKCZuaWMtPnBkZXYtPmRldiwgIlBGIGludGVycnVwdCBNYm94JWQgMHglbGx4XG4iLCBtYngsIGludHIpOwogCWZvciAodmYgPSAwOyB2ZiA8IHZmX3Blcl9tYnhfcmVnOyB2ZisrKSB7CkBAIC03OTcsMjMgKzEwNTMsNiBAQAogCQkJbmljX2NsZWFyX21ieF9pbnRyKG5pYywgdmYsIG1ieCk7CiAJCX0KIAl9Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBuaWNfbWJ4MF9pbnRyX2hhbmRsZXIgKGludCBpcnEsIHZvaWQgKm5pY19pcnEpCi17Ci0Jc3RydWN0IG5pY3BmICpuaWMgPSAoc3RydWN0IG5pY3BmICopbmljX2lycTsKLQotCW5pY19tYnhfaW50cl9oYW5kbGVyKG5pYywgMCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBuaWNfbWJ4MV9pbnRyX2hhbmRsZXIgKGludCBpcnEsIHZvaWQgKm5pY19pcnEpCi17Ci0Jc3RydWN0IG5pY3BmICpuaWMgPSAoc3RydWN0IG5pY3BmICopbmljX2lycTsKLQotCW5pY19tYnhfaW50cl9oYW5kbGVyKG5pYywgMSk7Ci0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTgyMSw3ICsxMDYwLDEzIEBACiB7CiAJaW50IGksIHJldDsKIAotCW5pYy0+bnVtX3ZlYyA9IE5JQ19QRl9NU0lYX1ZFQ1RPUlM7CisJbmljLT5udW1fdmVjID0gcGNpX21zaXhfdmVjX2NvdW50KG5pYy0+cGRldik7CisKKwluaWMtPm1zaXhfZW50cmllcyA9IGttYWxsb2NfYXJyYXkobmljLT5udW1fdmVjLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSksCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFuaWMtPm1zaXhfZW50cmllcykKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmljLT5udW1fdmVjOyBpKyspCiAJCW5pYy0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKQEAgLTgyOSw4ICsxMDc0LDkgQEAKIAlyZXQgPSBwY2lfZW5hYmxlX21zaXgobmljLT5wZGV2LCBuaWMtPm1zaXhfZW50cmllcywgbmljLT5udW1fdmVjKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJm5pYy0+cGRldi0+ZGV2LAotCQkJIlJlcXVlc3QgZm9yICMlZCBtc2l4IHZlY3RvcnMgZmFpbGVkXG4iLAotCQkJICAgbmljLT5udW1fdmVjKTsKKwkJCSJSZXF1ZXN0IGZvciAjJWQgbXNpeCB2ZWN0b3JzIGZhaWxlZCwgcmV0dXJuZWQgJWRcbiIsCisJCQkgICBuaWMtPm51bV92ZWMsIHJldCk7CisJCWtmcmVlKG5pYy0+bXNpeF9lbnRyaWVzKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTg0Miw2ICsxMDg4LDcgQEAKIHsKIAlpZiAobmljLT5tc2l4X2VuYWJsZWQpIHsKIAkJcGNpX2Rpc2FibGVfbXNpeChuaWMtPnBkZXYpOworCQlrZnJlZShuaWMtPm1zaXhfZW50cmllcyk7CiAJCW5pYy0+bXNpeF9lbmFibGVkID0gMDsKIAkJbmljLT5udW1fdmVjID0gMDsKIAl9CkBAIC04NjAsMjcgKzExMDcsMjYgQEAKIAogc3RhdGljIGludCBuaWNfcmVnaXN0ZXJfaW50ZXJydXB0cyhzdHJ1Y3QgbmljcGYgKm5pYykKIHsKLQlpbnQgcmV0OworCWludCBpLCByZXQ7CiAKIAkvKiBFbmFibGUgTVNJLVggKi8KIAlyZXQgPSBuaWNfZW5hYmxlX21zaXgobmljKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JLyogUmVnaXN0ZXIgbWFpbGJveCBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KLQlyZXQgPSByZXF1ZXN0X2lycShuaWMtPm1zaXhfZW50cmllc1tOSUNfUEZfSU5UUl9JRF9NQk9YMF0udmVjdG9yLAotCQkJICBuaWNfbWJ4MF9pbnRyX2hhbmRsZXIsIDAsICJOSUMgTWJveDAiLCBuaWMpOwotCWlmIChyZXQpCi0JCWdvdG8gZmFpbDsKKwkvKiBSZWdpc3RlciBtYWlsYm94IGludGVycnVwdCBoYW5kbGVyICovCisJZm9yIChpID0gTklDX1BGX0lOVFJfSURfTUJPWDA7IGkgPCBuaWMtPm51bV92ZWM7IGkrKykgeworCQlzcHJpbnRmKG5pYy0+aXJxX25hbWVbaV0sCisJCQkiTklDUEYgTWJveCVkIiwgKGkgLSBOSUNfUEZfSU5UUl9JRF9NQk9YMCkpOwogCi0JbmljLT5pcnFfYWxsb2NhdGVkW05JQ19QRl9JTlRSX0lEX01CT1gwXSA9IHRydWU7CisJCXJldCA9IHJlcXVlc3RfaXJxKG5pYy0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvciwKKwkJCQkgIG5pY19tYnhfaW50cl9oYW5kbGVyLCAwLAorCQkJCSAgbmljLT5pcnFfbmFtZVtpXSwgbmljKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZmFpbDsKIAotCXJldCA9IHJlcXVlc3RfaXJxKG5pYy0+bXNpeF9lbnRyaWVzW05JQ19QRl9JTlRSX0lEX01CT1gxXS52ZWN0b3IsCi0JCQkgIG5pY19tYngxX2ludHJfaGFuZGxlciwgMCwgIk5JQyBNYm94MSIsIG5pYyk7Ci0JaWYgKHJldCkKLQkJZ290byBmYWlsOwotCi0JbmljLT5pcnFfYWxsb2NhdGVkW05JQ19QRl9JTlRSX0lEX01CT1gxXSA9IHRydWU7CisJCW5pYy0+aXJxX2FsbG9jYXRlZFtpXSA9IHRydWU7CisJfQogCiAJLyogRW5hYmxlIG1haWxib3ggaW50ZXJydXB0ICovCiAJbmljX2VuYWJsZV9tYnhfaW50cihuaWMpOwpAQCAtODg5LDYgKzExMzUsNyBAQAogZmFpbDoKIAlkZXZfZXJyKCZuaWMtPnBkZXYtPmRldiwgIlJlcXVlc3QgaXJxIGZhaWxlZFxuIik7CiAJbmljX2ZyZWVfYWxsX2ludGVycnVwdHMobmljKTsKKwluaWNfZGlzYWJsZV9tc2l4KG5pYyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtOTAzLDYgKzExNTAsMTIgQEAKIAlpbnQgcG9zLCBzcXNfcGVyX3ZmID0gTUFYX1NRU19QRVJfVkZfU0lOR0xFX05PREU7CiAJdTE2IHRvdGFsX3ZmOwogCisJLyogU2Vjb25kYXJ5IFFzZXRzIGFyZSBuZWVkZWQgb25seSBpZiBDUFUgY291bnQgaXMKKwkgKiBtb3JldGhhbiBNQVhfUVVFVUVTX1BFUl9RU0VULgorCSAqLworCWlmIChudW1fb25saW5lX2NwdXMoKSA8PSBNQVhfUVVFVUVTX1BFUl9RU0VUKQorCQlyZXR1cm4gMDsKKwogCS8qIENoZWNrIGlmIGl0cyBhIG11bHRpLW5vZGUgZW52aXJvbm1lbnQgKi8KIAlpZiAobnJfbm9kZV9pZHMgPiAxKQogCQlzcXNfcGVyX3ZmID0gTUFYX1NRU19QRVJfVkY7CkBAIC0xMDA4LDYgKzEyNjEsMTIgQEAKIAlpZiAoIW5pYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwluaWMtPmh3ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBod19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuaWMtPmh3KSB7CisJCWRldm1fa2ZyZWUoZGV2LCBuaWMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlwY2lfc2V0X2RydmRhdGEocGRldiwgbmljKTsKIAogCW5pYy0+cGRldiA9IHBkZXY7CkBAIC0xMDQ3LDEzICsxMzA2LDEyIEBACiAKIAluaWMtPm5vZGUgPSBuaWNfZ2V0X25vZGVfaWQocGRldik7CiAKLQluaWNfc2V0X2xtYWNfdmZfbWFwcGluZyhuaWMpOwotCiAJLyogSW5pdGlhbGl6ZSBoYXJkd2FyZSAqLwotCW5pY19pbml0X2h3KG5pYyk7CisJZXJyID0gbmljX2luaXRfaHcobmljKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbnM7CiAKLQkvKiBTZXQgUlNTIFRCTCBzaXplIGZvciBlYWNoIFZGICovCi0JbmljLT5yc3NfaW5kX3RibF9zaXplID0gTklDX01BWF9SU1NfSURSX1RCTF9TSVpFOworCW5pY19zZXRfbG1hY192Zl9tYXBwaW5nKG5pYyk7CiAKIAkvKiBSZWdpc3RlciBpbnRlcnJ1cHRzICovCiAJZXJyID0gbmljX3JlZ2lzdGVyX2ludGVycnVwdHMobmljKTsKQEAgLTEwODYsNiArMTM0NCw5IEBACiBlcnJfcmVsZWFzZV9yZWdpb25zOgogCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CiBlcnJfZGlzYWJsZV9kZXZpY2U6CisJbmljX2ZyZWVfbG1hY21lbShuaWMpOworCWRldm1fa2ZyZWUoZGV2LCBuaWMtPmh3KTsKKwlkZXZtX2tmcmVlKGRldiwgbmljKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCXJldHVybiBlcnI7CkBAIC0xMTA2LDYgKzEzNjcsMTEgQEAKIAogCW5pY191bnJlZ2lzdGVyX2ludGVycnVwdHMobmljKTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCisJbmljX2ZyZWVfbG1hY21lbShuaWMpOworCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgbmljLT5odyk7CisJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBuaWMpOworCiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY19yZWcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY19yZWcuaAppbmRleCBhZmIxMGUzLi5lZGY3NzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWNfcmVnLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljX3JlZy5oCkBAIC0zNiw2ICszNiwyMCBAQAogI2RlZmluZSAgIE5JQ19QRl9NQUlMQk9YX0VOQV9XMUMJCSgweDA0NTApCiAjZGVmaW5lICAgTklDX1BGX01BSUxCT1hfRU5BX1cxUwkJKDB4MDQ3MCkKICNkZWZpbmUgICBOSUNfUEZfUlhfRVRZUEVfMF83CQkJKDB4MDUwMCkKKyNkZWZpbmUgICBOSUNfUEZfUlhfR0VORVZFX0RFRgkJCSgweDA1ODApCisjZGVmaW5lICAgIFVEUF9HRU5FVkVfUE9SVF9OVU0JCQkJMHgxN0MxVUxMCisjZGVmaW5lICAgTklDX1BGX1JYX0dFTkVWRV9QUk9UX0RFRgkJKDB4MDU4OCkKKyNkZWZpbmUgICAgSVBWNl9QUk9UCQkJCQkweDg2RERVTEwKKyNkZWZpbmUgICAgSVBWNF9QUk9UCQkJCQkweDgwMFVMTAorI2RlZmluZSAgICBFVF9QUk9UCQkJCQkweDY1NThVTEwKKyNkZWZpbmUgICBOSUNfUEZfUlhfTlZHUkVfUFJPVF9ERUYJCSgweDA1OTgpCisjZGVmaW5lICAgTklDX1BGX1JYX1ZYTEFOX0RFRl8wXzEJCSgweDA1QTApCisjZGVmaW5lICAgIFVEUF9WWExBTl9QT1JUX05VTQkJCQkweDEyQjUKKyNkZWZpbmUgICBOSUNfUEZfUlhfVlhMQU5fUFJPVF9ERUYJCSgweDA1QjApCisjZGVmaW5lICAgIElQVjZfUFJPVF9ERUYJCQkJMHgyVUxMCisjZGVmaW5lICAgIElQVjRfUFJPVF9ERUYJCQkJMHgxVUxMCisjZGVmaW5lICAgIEVUX1BST1RfREVGCQkJCQkweDNVTEwKKyNkZWZpbmUgICBOSUNfUEZfUlhfQ0ZHCQkJCSgweDA1RDApCiAjZGVmaW5lICAgTklDX1BGX1BLSU5EXzBfMTVfQ0ZHCQkJKDB4MDYwMCkKICNkZWZpbmUgICBOSUNfUEZfRUNDMF9GTElQMAkJCSgweDEwMDApCiAjZGVmaW5lICAgTklDX1BGX0VDQzFfRkxJUDAJCQkoMHgxMDA4KQpAQCAtMTAzLDYgKzExNyw3IEBACiAjZGVmaW5lICAgTklDX1BGX1NXX1NZTkNfUlhfRE9ORQkJKDB4NDkwMDA4KQogI2RlZmluZSAgIE5JQ19QRl9UTDJfMF82M19DRkcJCQkoMHg1MDAwMDApCiAjZGVmaW5lICAgTklDX1BGX1RMMl8wXzYzX1BSSQkJCSgweDUyMDAwMCkKKyNkZWZpbmUgICBOSUNfUEZfVEwyX0xNQUMJCQkoMHg1NDAwMDApCiAjZGVmaW5lICAgTklDX1BGX1RMMl8wXzYzX1NIX1NUQVRVUwkJKDB4NTgwMDAwKQogI2RlZmluZSAgIE5JQ19QRl9UTDNBXzBfNjNfQ0ZHCQkJKDB4NUYwMDAwKQogI2RlZmluZSAgIE5JQ19QRl9UTDNfMF8yNTVfQ0ZHCQkJKDB4NjAwMDAwKQpAQCAtMTcwLDcgKzE4NSw2IEBACiAjZGVmaW5lICAgTklDX1FTRVRfU1FfMF83X0RPT1IJCQkoMHgwMTA4MzgpCiAjZGVmaW5lICAgTklDX1FTRVRfU1FfMF83X1NUQVRVUwkJKDB4MDEwODQwKQogI2RlZmluZSAgIE5JQ19RU0VUX1NRXzBfN19ERUJVRwkJCSgweDAxMDg0OCkKLSNkZWZpbmUgICBOSUNfUVNFVF9TUV8wXzdfQ05NX0NIRwkJKDB4MDEwODYwKQogI2RlZmluZSAgIE5JQ19RU0VUX1NRXzBfN19TVEFUXzBfMQkJKDB4MDEwOTAwKQogCiAjZGVmaW5lICAgTklDX1FTRVRfUkJEUl8wXzFfQ0ZHCQkJKDB4MDEwQzAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfZXRodG9vbC5jCmluZGV4IGQyZDhlZjIuLmFkNGZkZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9ldGh0b29sLmMKQEAgLTM4Miw3ICszODIsMTAgQEAKIAkJcFtpKytdID0gbmljdmZfcXVldWVfcmVnX3JlYWQobmljLCBOSUNfUVNFVF9TUV8wXzdfRE9PUiwgcSk7CiAJCXBbaSsrXSA9IG5pY3ZmX3F1ZXVlX3JlZ19yZWFkKG5pYywgTklDX1FTRVRfU1FfMF83X1NUQVRVUywgcSk7CiAJCXBbaSsrXSA9IG5pY3ZmX3F1ZXVlX3JlZ19yZWFkKG5pYywgTklDX1FTRVRfU1FfMF83X0RFQlVHLCBxKTsKLQkJcFtpKytdID0gbmljdmZfcXVldWVfcmVnX3JlYWQobmljLCBOSUNfUVNFVF9TUV8wXzdfQ05NX0NIRywgcSk7CisJCS8qIFBhZGRpbmcsIHdhcyBOSUNfUVNFVF9TUV8wXzdfQ05NX0NIRywgd2hpY2gKKwkJICogcHJvZHVjZXMgYnVzIGVycm9ycyB3aGVuIHJlYWQKKwkJICovCisJCXBbaSsrXSA9IDA7CiAJCXBbaSsrXSA9IG5pY3ZmX3F1ZXVlX3JlZ19yZWFkKG5pYywgTklDX1FTRVRfU1FfMF83X1NUQVRfMF8xLCBxKTsKIAkJcmVnX29mZnNldCA9IE5JQ19RU0VUX1NRXzBfN19TVEFUXzBfMSB8ICgxIDw8IDMpOwogCQlwW2krK10gPSBuaWN2Zl9xdWV1ZV9yZWdfcmVhZChuaWMsIHJlZ19vZmZzZXQsIHEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfbWFpbi5jCmluZGV4IGExOWU3M2YuLjQ1YTEzZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9tYWluLmMKQEAgLTI5LDEwICsyOSwyMCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIG5pY3ZmX2lkX3RhYmxlW10gPSB7CiAJeyBQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0NBVklVTSwKIAkJCSBQQ0lfREVWSUNFX0lEX1RIVU5ERVJfTklDX1ZGLAotCQkJIFBDSV9WRU5ET1JfSURfQ0FWSVVNLCAweEExMzQpIH0sCisJCQkgUENJX1ZFTkRPUl9JRF9DQVZJVU0sCisJCQkgUENJX1NVQlNZU19ERVZJRF84OFhYX05JQ19WRikgfSwKIAl7IFBDSV9ERVZJQ0VfU1VCKFBDSV9WRU5ET1JfSURfQ0FWSVVNLAogCQkJIFBDSV9ERVZJQ0VfSURfVEhVTkRFUl9QQVNTMV9OSUNfVkYsCi0JCQkgUENJX1ZFTkRPUl9JRF9DQVZJVU0sIDB4QTExRSkgfSwKKwkJCSBQQ0lfVkVORE9SX0lEX0NBVklVTSwKKwkJCSBQQ0lfU1VCU1lTX0RFVklEXzg4WFhfUEFTUzFfTklDX1ZGKSB9LAorCXsgUENJX0RFVklDRV9TVUIoUENJX1ZFTkRPUl9JRF9DQVZJVU0sCisJCQkgUENJX0RFVklDRV9JRF9USFVOREVSX05JQ19WRiwKKwkJCSBQQ0lfVkVORE9SX0lEX0NBVklVTSwKKwkJCSBQQ0lfU1VCU1lTX0RFVklEXzgxWFhfTklDX1ZGKSB9LAorCXsgUENJX0RFVklDRV9TVUIoUENJX1ZFTkRPUl9JRF9DQVZJVU0sCisJCQkgUENJX0RFVklDRV9JRF9USFVOREVSX05JQ19WRiwKKwkJCSBQQ0lfVkVORE9SX0lEX0NBVklVTSwKKwkJCSBQQ0lfU1VCU1lTX0RFVklEXzgzWFhfTklDX1ZGKSB9LAogCXsgMCwgfSAgLyogZW5kIG9mIHRhYmxlICovCiB9OwogCkBAIC0xMzQsMTUgKzE0NCwxOSBAQAogCiAJLyogV2FpdCBmb3IgcHJldmlvdXMgbWVzc2FnZSB0byBiZSBhY2tlZCwgdGltZW91dCAyc2VjICovCiAJd2hpbGUgKCFuaWMtPnBmX2Fja2VkKSB7Ci0JCWlmIChuaWMtPnBmX25hY2tlZCkKKwkJaWYgKG5pYy0+cGZfbmFja2VkKSB7CisJCQluZXRkZXZfZXJyKG5pYy0+bmV0ZGV2LAorCQkJCSAgICJQRiBOQUNLIHRvIG1ib3ggbXNnIDB4JTAyeCBmcm9tIFZGJWRcbiIsCisJCQkJICAgKG1ieC0+bXNnLm1zZyAmIDB4RkYpLCBuaWMtPnZmX2lkKTsKIAkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJCW1zbGVlcChzbGVlcCk7CiAJCWlmIChuaWMtPnBmX2Fja2VkKQogCQkJYnJlYWs7CiAJCXRpbWVvdXQgLT0gc2xlZXA7CiAJCWlmICghdGltZW91dCkgewogCQkJbmV0ZGV2X2VycihuaWMtPm5ldGRldiwKLQkJCQkgICAiUEYgZGlkbid0IGFjayB0byBtYm94IG1zZyAlZCBmcm9tIFZGJWRcbiIsCisJCQkJICAgIlBGIGRpZG4ndCBBQ0sgdG8gbWJveCBtc2cgMHglMDJ4IGZyb20gVkYlZFxuIiwKIAkJCQkgICAobWJ4LT5tc2cubXNnICYgMHhGRiksIG5pYy0+dmZfaWQpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQpAQCAtMzUyLDEzICszNjYsNyBAQAogCiAJcnNzLT5lbmFibGUgPSB0cnVlOwogCi0JLyogVXNpbmcgdGhlIEhXIHJlc2V0IHZhbHVlIGZvciBub3cgKi8KLQlyc3MtPmtleVswXSA9IDB4RkVFRDBCQURGRUVEMEJBRFVMTDsKLQlyc3MtPmtleVsxXSA9IDB4RkVFRDBCQURGRUVEMEJBRFVMTDsKLQlyc3MtPmtleVsyXSA9IDB4RkVFRDBCQURGRUVEMEJBRFVMTDsKLQlyc3MtPmtleVszXSA9IDB4RkVFRDBCQURGRUVEMEJBRFVMTDsKLQlyc3MtPmtleVs0XSA9IDB4RkVFRDBCQURGRUVEMEJBRFVMTDsKLQorCW5ldGRldl9yc3Nfa2V5X2ZpbGwocnNzLT5rZXksIFJTU19IQVNIX0tFWV9TSVpFICogc2l6ZW9mKHU2NCkpOwogCW5pY3ZmX3NldF9yc3Nfa2V5KG5pYyk7CiAKIAlyc3MtPmNmZyA9IFJTU19JUF9IQVNIX0VOQSB8IFJTU19UQ1BfSEFTSF9FTkEgfCBSU1NfVURQX0hBU0hfRU5BOwpAQCAtNTA3LDEyICs1MTUsMTUgQEAKIAogc3RhdGljIHZvaWQgbmljdmZfc25kX3BrdF9oYW5kbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkJICBzdHJ1Y3QgY21wX3F1ZXVlICpjcSwKLQkJCQkgIHN0cnVjdCBjcWVfc2VuZF90ICpjcWVfdHgsIGludCBjcWVfdHlwZSkKKwkJCQkgIHN0cnVjdCBjcWVfc2VuZF90ICpjcWVfdHgsCisJCQkJICBpbnQgY3FlX3R5cGUsIGludCBidWRnZXQsCisJCQkJICB1bnNpZ25lZCBpbnQgKnR4X3BrdHMsIHVuc2lnbmVkIGludCAqdHhfYnl0ZXMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJc3RydWN0IG5pY3ZmICpuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBzbmRfcXVldWUgKnNxOwogCXN0cnVjdCBzcV9oZHJfc3ViZGVzYyAqaGRyOworCXN0cnVjdCBzcV9oZHJfc3ViZGVzYyAqdHNvX3NxZTsKIAogCXNxID0gJm5pYy0+cXMtPnNxW2NxZV90eC0+c3FfaWR4XTsKIApAQCAtNTI3LDE3ICs1MzgsMjMgQEAKIAogCW5pY3ZmX2NoZWNrX2NxZV90eF9lcnJzKG5pYywgY3EsIGNxZV90eCk7CiAJc2tiID0gKHN0cnVjdCBza19idWZmICopc3EtPnNrYnVmZltjcWVfdHgtPnNxZV9wdHJdOwotCS8qIEZvciBUU08gb2ZmbG9hZGVkIHBhY2tldHMgb25seSBvbmUgU1FFIHdpbGwgaGF2ZSBhIHZhbGlkIFNLQiAqLwogCWlmIChza2IpIHsKKwkJLyogQ2hlY2sgZm9yIGR1bW15IGRlc2NyaXB0b3IgdXNlZCBmb3IgSFcgVFNPIG9mZmxvYWQgb24gODh4eCAqLworCQlpZiAoaGRyLT5kb250X3NlbmQpIHsKKwkJCS8qIEdldCBhY3R1YWwgVFNPIGRlc2NyaXB0b3JzIGFuZCBmcmVlIHRoZW0gKi8KKwkJCXRzb19zcWUgPQorCQkJIChzdHJ1Y3Qgc3FfaGRyX3N1YmRlc2MgKilHRVRfU1FfREVTQyhzcSwgaGRyLT5yc3ZkMik7CisJCQluaWN2Zl9wdXRfc3FfZGVzYyhzcSwgdHNvX3NxZS0+c3ViZGVzY19jbnQgKyAxKTsKKwkJfQogCQluaWN2Zl9wdXRfc3FfZGVzYyhzcSwgaGRyLT5zdWJkZXNjX2NudCArIDEpOwogCQlwcmVmZXRjaChza2IpOwotCQlkZXZfY29uc3VtZV9za2JfYW55KHNrYik7CisJCSgqdHhfcGt0cykrKzsKKwkJKnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQluYXBpX2NvbnN1bWVfc2tiKHNrYiwgYnVkZ2V0KTsKIAkJc3EtPnNrYnVmZltjcWVfdHgtPnNxZV9wdHJdID0gKHU2NClOVUxMOwogCX0gZWxzZSB7Ci0JCS8qIEluIGNhc2Ugb2YgSFcgVFNPLCBIVyBzZW5kcyBhIENRRSBmb3IgZWFjaCBzZWdtZW50IG9mIGEgVFNPCi0JCSAqIHBhY2tldCBpbnN0ZWFkIG9mIGEgc2luZ2xlIENRRSBmb3IgdGhlIHdob2xlIFRTTyBwYWNrZXQKLQkJICogdHJhbnNtaXR0ZWQuIEVhY2ggb2YgdGhpcyBDUUUgcG9pbnRzIHRvIHRoZSBzYW1lIFNRRSwgc28KLQkJICogYXZvaWQgZnJlZWluZyBzYW1lIFNRRSBtdWx0aXBsZSB0aW1lcy4KKwkJLyogSW4gY2FzZSBvZiBTVyBUU08gb24gODh4eCwgb25seSBsYXN0IHNlZ21lbnQgd2lsbCBoYXZlCisJCSAqIGEgU0tCIGF0dGFjaGVkLCBzbyBqdXN0IGZyZWUgU1FFcyBoZXJlLgogCQkgKi8KIAkJaWYgKCFuaWMtPmh3X3RzbykKIAkJCW5pY3ZmX3B1dF9zcV9kZXNjKHNxLCBoZHItPnN1YmRlc2NfY250ICsgMSk7CkBAIC02NDgsNiArNjY1LDcgQEAKIAlzdHJ1Y3QgY21wX3F1ZXVlICpjcSA9ICZxcy0+Y3FbY3FfaWR4XTsKIAlzdHJ1Y3QgY3FlX3J4X3QgKmNxX2Rlc2M7CiAJc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxOworCXVuc2lnbmVkIGludCB0eF9wa3RzID0gMCwgdHhfYnl0ZXMgPSAwOwogCiAJc3Bpbl9sb2NrX2JoKCZjcS0+bG9jayk7CiBsb29wOgpAQCAtNjg2LDcgKzcwNCw4IEBACiAJCWJyZWFrOwogCQljYXNlIENRRV9UWVBFX1NFTkQ6CiAJCQluaWN2Zl9zbmRfcGt0X2hhbmRsZXIobmV0ZGV2LCBjcSwKLQkJCQkJICAgICAgKHZvaWQgKiljcV9kZXNjLCBDUUVfVFlQRV9TRU5EKTsKKwkJCQkJICAgICAgKHZvaWQgKiljcV9kZXNjLCBDUUVfVFlQRV9TRU5ELAorCQkJCQkgICAgICBidWRnZXQsICZ0eF9wa3RzLCAmdHhfYnl0ZXMpOwogCQkJdHhfZG9uZSsrOwogCQlicmVhazsKIAkJY2FzZSBDUUVfVFlQRV9JTlZBTElEOgpAQCAtNzE1LDYgKzczNCw5IEBACiAJCW5ldGRldiA9IG5pYy0+cG5pY3ZmLT5uZXRkZXY7CiAJCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUobmV0ZGV2LAogCQkJCQkgIG5pY3ZmX25ldGRldl9xaWR4KG5pYywgY3FfaWR4KSk7CisJCWlmICh0eF9wa3RzKQorCQkJbmV0ZGV2X3R4X2NvbXBsZXRlZF9xdWV1ZSh0eHEsIHR4X3BrdHMsIHR4X2J5dGVzKTsKKwogCQluaWMgPSBuaWMtPnBuaWN2ZjsKIAkJaWYgKG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQodHhxKSAmJiBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKIAkJCW5ldGlmX3R4X3N0YXJ0X3F1ZXVlKHR4cSk7CkBAIC05MjgsMTYgKzk1MCwxOSBAQAogCWludCB2ZWN0b3I7CiAKIAlmb3JfZWFjaF9jcV9pcnEoaXJxKQotCQlzcHJpbnRmKG5pYy0+aXJxX25hbWVbaXJxXSwgIk5JQ1ZGJWQgQ1ElZCIsCi0JCQluaWMtPnZmX2lkLCBpcnEpOworCQlzcHJpbnRmKG5pYy0+aXJxX25hbWVbaXJxXSwgIiVzLXJ4dHgtJWQiLAorCQkJbmljLT5wbmljdmYtPm5ldGRldi0+bmFtZSwKKwkJCW5pY3ZmX25ldGRldl9xaWR4KG5pYywgaXJxKSk7CiAKIAlmb3JfZWFjaF9zcV9pcnEoaXJxKQotCQlzcHJpbnRmKG5pYy0+aXJxX25hbWVbaXJxXSwgIk5JQ1ZGJWQgU1ElZCIsCi0JCQluaWMtPnZmX2lkLCBpcnEgLSBOSUNWRl9JTlRSX0lEX1NRKTsKKwkJc3ByaW50ZihuaWMtPmlycV9uYW1lW2lycV0sICIlcy1zcS0lZCIsCisJCQluaWMtPnBuaWN2Zi0+bmV0ZGV2LT5uYW1lLAorCQkJbmljdmZfbmV0ZGV2X3FpZHgobmljLCBpcnEgLSBOSUNWRl9JTlRSX0lEX1NRKSk7CiAKIAlmb3JfZWFjaF9yYmRyX2lycShpcnEpCi0JCXNwcmludGYobmljLT5pcnFfbmFtZVtpcnFdLCAiTklDVkYlZCBSQkRSJWQiLAotCQkJbmljLT52Zl9pZCwgaXJxIC0gTklDVkZfSU5UUl9JRF9SQkRSKTsKKwkJc3ByaW50ZihuaWMtPmlycV9uYW1lW2lycV0sICIlcy1yYmRyLSVkIiwKKwkJCW5pYy0+cG5pY3ZmLT5uZXRkZXYtPm5hbWUsCisJCQluaWMtPnNxc19tb2RlID8gKG5pYy0+c3FzX2lkICsgMSkgOiAwKTsKIAogCS8qIFJlZ2lzdGVyIENRIGludGVycnVwdHMgKi8KIAlmb3IgKGlycSA9IDA7IGlycSA8IG5pYy0+cXMtPmNxX2NudDsgaXJxKyspIHsKQEAgLTk2MSw4ICs5ODYsOSBAQAogCX0KIAogCS8qIFJlZ2lzdGVyIFFTIGVycm9yIGludGVycnVwdCAqLwotCXNwcmludGYobmljLT5pcnFfbmFtZVtOSUNWRl9JTlRSX0lEX1FTX0VSUl0sCi0JCSJOSUNWRiVkIFFzZXQgZXJyb3IiLCBuaWMtPnZmX2lkKTsKKwlzcHJpbnRmKG5pYy0+aXJxX25hbWVbTklDVkZfSU5UUl9JRF9RU19FUlJdLCAiJXMtcXNldC1lcnItJWQiLAorCQluaWMtPnBuaWN2Zi0+bmV0ZGV2LT5uYW1lLAorCQluaWMtPnNxc19tb2RlID8gKG5pYy0+c3FzX2lkICsgMSkgOiAwKTsKIAlpcnEgPSBOSUNWRl9JTlRSX0lEX1FTX0VSUjsKIAlyZXQgPSByZXF1ZXN0X2lycShuaWMtPm1zaXhfZW50cmllc1tpcnFdLnZlY3RvciwKIAkJCSAgbmljdmZfcXNfZXJyX2ludHJfaGFuZGxlciwKQEAgLTExNDEsNiArMTE2Nyw5IEBACiAKIAluZXRpZl90eF9kaXNhYmxlKG5ldGRldik7CiAKKwlmb3IgKHFpZHggPSAwOyBxaWR4IDwgbmV0ZGV2LT5udW1fdHhfcXVldWVzOyBxaWR4KyspCisJCW5ldGRldl90eF9yZXNldF9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5ldGRldiwgcWlkeCkpOworCiAJLyogRnJlZSByZXNvdXJjZXMgKi8KIAluaWN2Zl9jb25maWdfZGF0YV90cmFuc2ZlcihuaWMsIGZhbHNlKTsKIApAQCAtMTE5MSw3ICsxMjIwLDcgQEAKIAl9CiAKIAkvKiBDaGVjayBpZiB3ZSBnb3QgTUFDIGFkZHJlc3MgZnJvbSBQRiBvciBlbHNlIGdlbmVyYXRlIGEgcmFkb20gTUFDICovCi0JaWYgKGlzX3plcm9fZXRoZXJfYWRkcihuZXRkZXYtPmRldl9hZGRyKSkgeworCWlmICghbmljLT5zcXNfbW9kZSAmJiBpc196ZXJvX2V0aGVyX2FkZHIobmV0ZGV2LT5kZXZfYWRkcikpIHsKIAkJZXRoX2h3X2FkZHJfcmFuZG9tKG5ldGRldik7CiAJCW5pY3ZmX2h3X3NldF9tYWNfYWRkcihuaWMsIG5ldGRldik7CiAJfQpAQCAtMTUwMiw2ICsxNTMxLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCBuaWN2ZiAqbmljOwogCWludCAgICBlcnIsIHFjb3VudDsKKwl1MTYgICAgc2RldmlkOwogCiAJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKGVycikgewpAQCAtMTUyNywxNCArMTU1NywxMyBAQAogCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbnM7CiAJfQogCi0JcWNvdW50ID0gTUFYX0NNUF9RVUVVRVNfUEVSX1FTOworCXFjb3VudCA9IG5ldGlmX2dldF9udW1fZGVmYXVsdF9yc3NfcXVldWVzKCk7CiAKIAkvKiBSZXN0cmljdCBtdWx0aXFzZXQgc3VwcG9ydCBvbmx5IGZvciBob3N0IGJvdW5kIFZGcyAqLwogCWlmIChwZGV2LT5pc192aXJ0Zm4pIHsKIAkJLyogU2V0IG1heCBudW1iZXIgb2YgcXVldWVzIHBlciBWRiAqLwotCQlxY291bnQgPSByb3VuZHVwKG51bV9vbmxpbmVfY3B1cygpLCBNQVhfQ01QX1FVRVVFU19QRVJfUVMpOwotCQlxY291bnQgPSBtaW4ocWNvdW50LAotCQkJICAgICAoTUFYX1NRU19QRVJfVkYgKyAxKSAqIE1BWF9DTVBfUVVFVUVTX1BFUl9RUyk7CisJCXFjb3VudCA9IG1pbl90KGludCwgbnVtX29ubGluZV9jcHVzKCksCisJCQkgICAgICAgKE1BWF9TUVNfUEVSX1ZGICsgMSkgKiBNQVhfQ01QX1FVRVVFU19QRVJfUVMpOwogCX0KIAogCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2X21xcyhzaXplb2Yoc3RydWN0IG5pY3ZmKSwgcWNvdW50LCBxY291bnQpOwpAQCAtMTU3NSw2ICsxNjA0LDEwIEBACiAJaWYgKCFwYXNzMV9zaWxpY29uKG5pYy0+cGRldikpCiAJCW5pYy0+aHdfdHNvID0gdHJ1ZTsKIAorCXBjaV9yZWFkX2NvbmZpZ193b3JkKG5pYy0+cGRldiwgUENJX1NVQlNZU1RFTV9JRCwgJnNkZXZpZCk7CisJaWYgKHNkZXZpZCA9PSAweEExMzQpCisJCW5pYy0+dDg4ID0gdHJ1ZTsKKwogCS8qIENoZWNrIGlmIHRoaXMgVkYgaXMgaW4gUVMgb25seSBtb2RlICovCiAJaWYgKG5pYy0+c3FzX21vZGUpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfcXVldWVzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9xdWV1ZXMuYwppbmRleCAwZmY4ZTYwLi5hNGZjNTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9xdWV1ZXMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci9uaWN2Zl9xdWV1ZXMuYwpAQCAtNDc5LDYgKzQ3OSwxNiBAQAogCQkJCQkgICAgICBOSUNfUVNFVF9SUV9HRU5fQ0ZHLCAwLCBycV9jZmcpOwogfQogCitzdGF0aWMgdm9pZCBuaWN2Zl9yZXNldF9yY3ZfcXVldWVfc3RhdHMoc3RydWN0IG5pY3ZmICpuaWMpCit7CisJdW5pb24gbmljX21ieCBtYnggPSB7fTsKKworCS8qIFJlc2V0IGFsbCBSWFEncyBzdGF0cyAqLworCW1ieC5yZXNldF9zdGF0Lm1zZyA9IE5JQ19NQk9YX01TR19SRVNFVF9TVEFUX0NPVU5URVI7CisJbWJ4LnJlc2V0X3N0YXQucnFfc3RhdF9tYXNrID0gMHhGRkZGOworCW5pY3ZmX3NlbmRfbXNnX3RvX3BmKG5pYywgJm1ieCk7Cit9CisKIC8qIENvbmZpZ3VyZXMgcmVjZWl2ZSBxdWV1ZSAqLwogc3RhdGljIHZvaWQgbmljdmZfcmN2X3F1ZXVlX2NvbmZpZyhzdHJ1Y3QgbmljdmYgKm5pYywgc3RydWN0IHF1ZXVlX3NldCAqcXMsCiAJCQkJICAgaW50IHFpZHgsIGJvb2wgZW5hYmxlKQpAQCAtNzYyLDEwICs3NzIsMTAgQEAKIAluaWMtPnFzID0gcXM7CiAKIAkvKiBTZXQgY291bnQgb2YgZWFjaCBxdWV1ZSAqLwotCXFzLT5yYmRyX2NudCA9IFJCRFJfQ05UOwotCXFzLT5ycV9jbnQgPSBSQ1ZfUVVFVUVfQ05UOwotCXFzLT5zcV9jbnQgPSBTTkRfUVVFVUVfQ05UOwotCXFzLT5jcV9jbnQgPSBDTVBfUVVFVUVfQ05UOworCXFzLT5yYmRyX2NudCA9IERFRkFVTFRfUkJEUl9DTlQ7CisJcXMtPnJxX2NudCA9IG1pbl90KHU4LCBNQVhfUkNWX1FVRVVFU19QRVJfUVMsIG51bV9vbmxpbmVfY3B1cygpKTsKKwlxcy0+c3FfY250ID0gbWluX3QodTgsIE1BWF9TTkRfUVVFVUVTX1BFUl9RUywgbnVtX29ubGluZV9jcHVzKCkpOworCXFzLT5jcV9jbnQgPSBtYXhfdCh1OCwgcXMtPnJxX2NudCwgcXMtPnNxX2NudCk7CiAKIAkvKiBTZXQgcXVldWUgbGVuZ3RocyAqLwogCXFzLT5yYmRyX2xlbiA9IFJDVl9CVUZfQ09VTlQ7CkBAIC04MTIsNiArODIyLDExIEBACiAJCW5pY3ZmX2ZyZWVfcmVzb3VyY2VzKG5pYyk7CiAJfQogCisJLyogUmVzZXQgUlhRJ3Mgc3RhdHMuCisJICogU1EncyBzdGF0cyB3aWxsIGdldCByZXNldCBhdXRvbWF0aWNhbGx5IG9uY2UgU1EgaXMgcmVzZXQuCisJICovCisJbmljdmZfcmVzZXRfcmN2X3F1ZXVlX3N0YXRzKG5pYyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTM4LDYgKzk1Myw4IEBACiAJcmV0dXJuIG51bV9lZGVzY3MgKyBzaC0+Z3NvX3NlZ3M7CiB9CiAKKyNkZWZpbmUgUE9TVF9DUUVfREVTQ19DT1VOVCAyCisKIC8qIEdldCB0aGUgbnVtYmVyIG9mIFNRIGRlc2NyaXB0b3JzIG5lZWRlZCB0byB4bWl0IHRoaXMgc2tiICovCiBzdGF0aWMgaW50IG5pY3ZmX3NxX3N1YmRlc2NfcmVxdWlyZWQoc3RydWN0IG5pY3ZmICpuaWMsIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC05NDgsNiArOTY1LDEwIEBACiAJCXJldHVybiBzdWJkZXNjX2NudDsKIAl9CiAKKwkvKiBEdW1teSBkZXNjcmlwdG9ycyB0byBnZXQgVFNPIHBrdCBjb21wbGV0aW9uIG5vdGlmaWNhdGlvbiAqLworCWlmIChuaWMtPnQ4OCAmJiBuaWMtPmh3X3RzbyAmJiBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKQorCQlzdWJkZXNjX2NudCArPSBQT1NUX0NRRV9ERVNDX0NPVU5UOworCiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpCiAJCXN1YmRlc2NfY250ICs9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CiAKQEAgLTk2NSwxNCArOTg2LDIxIEBACiAJc3RydWN0IHNxX2hkcl9zdWJkZXNjICpoZHI7CiAKIAloZHIgPSAoc3RydWN0IHNxX2hkcl9zdWJkZXNjICopR0VUX1NRX0RFU0Moc3EsIHFlbnRyeSk7Ci0Jc3EtPnNrYnVmZltxZW50cnldID0gKHU2NClza2I7Ci0KIAltZW1zZXQoaGRyLCAwLCBTTkRfUVVFVUVfREVTQ19TSVpFKTsKIAloZHItPnN1YmRlc2NfdHlwZSA9IFNRX0RFU0NfVFlQRV9IRUFERVI7Ci0JLyogRW5hYmxlIG5vdGlmaWNhdGlvbiB2aWEgQ1FFIGFmdGVyIHByb2Nlc3NpbmcgU1FFICovCi0JaGRyLT5wb3N0X2NxZSA9IDE7Ci0JLyogTm8gb2Ygc3ViZGVzY3JpcHRvcnMgZm9sbG93aW5nIHRoaXMgKi8KLQloZHItPnN1YmRlc2NfY250ID0gc3ViZGVzY19jbnQ7CisKKwlpZiAobmljLT50ODggJiYgbmljLT5od190c28gJiYgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgeworCQkvKiBwb3N0X2NxZSA9IDAsIHRvIGF2b2lkIEhXIHBvc3RpbmcgYSBDUUUgZm9yIGV2ZXJ5IFRTTworCQkgKiBzZWdtZW50IHRyYW5zbWl0dGVkIG9uIDg4eHguCisJCSAqLworCQloZHItPnN1YmRlc2NfY250ID0gc3ViZGVzY19jbnQgLSBQT1NUX0NRRV9ERVNDX0NPVU5UOworCX0gZWxzZSB7CisJCXNxLT5za2J1ZmZbcWVudHJ5XSA9ICh1NjQpc2tiOworCQkvKiBFbmFibGUgbm90aWZpY2F0aW9uIHZpYSBDUUUgYWZ0ZXIgcHJvY2Vzc2luZyBTUUUgKi8KKwkJaGRyLT5wb3N0X2NxZSA9IDE7CisJCS8qIE5vIG9mIHN1YmRlc2NyaXB0b3JzIGZvbGxvd2luZyB0aGlzICovCisJCWhkci0+c3ViZGVzY19jbnQgPSBzdWJkZXNjX2NudDsKKwl9CiAJaGRyLT50b3RfbGVuID0gbGVuOwogCiAJLyogT2ZmbG9hZCBjaGVja3N1bSBjYWxjdWxhdGlvbiB0byBIVyAqLwpAQCAtMTAyMyw2ICsxMDUxLDU1IEBACiAJZ2F0aGVyLT5hZGRyID0gZGF0YTsKIH0KIAorLyogQWRkIEhEUiArIElNTUVESUFURSBzdWJkZXNjcmlwdG9ycyByaWdodCBhZnRlciBkZXNjcmlwdG9ycyBvZiBhIFRTTworICogcGFja2V0IHNvIHRoYXQgYSBDUUUgaXMgcG9zdGVkIGFzIGEgbm90aWZhdGlvbiBmb3IgdHJhbnNtaXNzaW9uIG9mCisgKiBUU08gcGFja2V0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbmljdmZfc3FfYWRkX2NxZV9zdWJkZXNjKHN0cnVjdCBzbmRfcXVldWUgKnNxLCBpbnQgcWVudHJ5LAorCQkJCQkgICAgaW50IHRzb19zcWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNxX2ltbV9zdWJkZXNjICppbW07CisJc3RydWN0IHNxX2hkcl9zdWJkZXNjICpoZHI7CisKKwlzcS0+c2tidWZmW3FlbnRyeV0gPSAodTY0KXNrYjsKKworCWhkciA9IChzdHJ1Y3Qgc3FfaGRyX3N1YmRlc2MgKilHRVRfU1FfREVTQyhzcSwgcWVudHJ5KTsKKwltZW1zZXQoaGRyLCAwLCBTTkRfUVVFVUVfREVTQ19TSVpFKTsKKwloZHItPnN1YmRlc2NfdHlwZSA9IFNRX0RFU0NfVFlQRV9IRUFERVI7CisJLyogRW5hYmxlIG5vdGlmaWNhdGlvbiB2aWEgQ1FFIGFmdGVyIHByb2Nlc3NpbmcgU1FFICovCisJaGRyLT5wb3N0X2NxZSA9IDE7CisJLyogVGhlcmUgaXMgbm8gcGFja2V0IHRvIHRyYW5zbWl0IGhlcmUgKi8KKwloZHItPmRvbnRfc2VuZCA9IDE7CisJaGRyLT5zdWJkZXNjX2NudCA9IFBPU1RfQ1FFX0RFU0NfQ09VTlQgLSAxOworCWhkci0+dG90X2xlbiA9IDE7CisJLyogQWN0dWFsIFRTTyBoZWFkZXIgU1FFIGluZGV4LCBuZWVkZWQgZm9yIGNsZWFudXAgKi8KKwloZHItPnJzdmQyID0gdHNvX3NxZTsKKworCXFlbnRyeSA9IG5pY3ZmX2dldF9ueHRfc3FlbnRyeShzcSwgcWVudHJ5KTsKKwlpbW0gPSAoc3RydWN0IHNxX2ltbV9zdWJkZXNjICopR0VUX1NRX0RFU0Moc3EsIHFlbnRyeSk7CisJbWVtc2V0KGltbSwgMCwgU05EX1FVRVVFX0RFU0NfU0laRSk7CisJaW1tLT5zdWJkZXNjX3R5cGUgPSBTUV9ERVNDX1RZUEVfSU1NRURJQVRFOworCWltbS0+bGVuID0gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5pY3ZmX3NxX2Rvb3JiZWxsKHN0cnVjdCBuaWN2ZiAqbmljLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgaW50IHNxX251bSwgaW50IGRlc2NfY250KQoreworCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKworCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUobmljLT5wbmljdmYtPm5ldGRldiwKKwkJCQkgIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKKworCW5ldGRldl90eF9zZW50X3F1ZXVlKHR4cSwgc2tiLT5sZW4pOworCisJLyogbWFrZSBzdXJlIGFsbCBtZW1vcnkgc3RvcmVzIGFyZSBkb25lIGJlZm9yZSByaW5naW5nIGRvb3JiZWxsICovCisJc21wX3dtYigpOworCisJLyogSW5mb3JtIEhXIHRvIHhtaXQgYWxsIFRTTyBzZWdtZW50cyAqLworCW5pY3ZmX3F1ZXVlX3JlZ193cml0ZShuaWMsIE5JQ19RU0VUX1NRXzBfN19ET09SLAorCQkJICAgICAgc3FfbnVtLCBkZXNjX2NudCk7Cit9CisKIC8qIFNlZ21lbnQgYSBUU08gcGFja2V0IGludG8gJ2dzb19zaXplJyBzZWdtZW50cyBhbmQgYXBwZW5kCiAgKiB0aGVtIHRvIFNRIGZvciB0cmFuc2ZlcgogICovCkBAIC0xMDgyLDEyICsxMTU5LDggQEAKIAkvKiBTYXZlIFNLQiBpbiB0aGUgbGFzdCBzZWdtZW50IGZvciBmcmVlaW5nICovCiAJc3EtPnNrYnVmZltoZHJfcWVudHJ5XSA9ICh1NjQpc2tiOwogCi0JLyogbWFrZSBzdXJlIGFsbCBtZW1vcnkgc3RvcmVzIGFyZSBkb25lIGJlZm9yZSByaW5naW5nIGRvb3JiZWxsICovCi0Jc21wX3dtYigpOworCW5pY3ZmX3NxX2Rvb3JiZWxsKG5pYywgc2tiLCBzcV9udW0sIGRlc2NfY250KTsKIAotCS8qIEluZm9ybSBIVyB0byB4bWl0IGFsbCBUU08gc2VnbWVudHMgKi8KLQluaWN2Zl9xdWV1ZV9yZWdfd3JpdGUobmljLCBOSUNfUVNFVF9TUV8wXzdfRE9PUiwKLQkJCSAgICAgIHNxX251bSwgZGVzY19jbnQpOwogCW5pYy0+ZHJ2X3N0YXRzLnR4X3RzbysrOwogCXJldHVybiAxOwogfQpAQCAtMTA5Niw3ICsxMTY5LDcgQEAKIGludCBuaWN2Zl9zcV9hcHBlbmRfc2tiKHN0cnVjdCBuaWN2ZiAqbmljLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBpLCBzaXplOwotCWludCBzdWJkZXNjX2NudDsKKwlpbnQgc3ViZGVzY19jbnQsIHRzb19zcWUgPSAwOwogCWludCBzcV9udW0sIHFlbnRyeTsKIAlzdHJ1Y3QgcXVldWVfc2V0ICpxczsKIAlzdHJ1Y3Qgc25kX3F1ZXVlICpzcTsKQEAgLTExMzEsNiArMTIwNCw3IEBACiAJLyogQWRkIFNRIGhlYWRlciBzdWJkZXNjICovCiAJbmljdmZfc3FfYWRkX2hkcl9zdWJkZXNjKG5pYywgc3EsIHFlbnRyeSwgc3ViZGVzY19jbnQgLSAxLAogCQkJCSBza2IsIHNrYi0+bGVuKTsKKwl0c29fc3FlID0gcWVudHJ5OwogCiAJLyogQWRkIFNRIGdhdGhlciBzdWJkZXNjcyAqLwogCXFlbnRyeSA9IG5pY3ZmX2dldF9ueHRfc3FlbnRyeShzcSwgcWVudHJ5KTsKQEAgLTExNTQsMTIgKzEyMjgsMTMgQEAKIAl9CiAKIGRvb3JiZWxsOgotCS8qIG1ha2Ugc3VyZSBhbGwgbWVtb3J5IHN0b3JlcyBhcmUgZG9uZSBiZWZvcmUgcmluZ2luZyBkb29yYmVsbCAqLwotCXNtcF93bWIoKTsKKwlpZiAobmljLT50ODggJiYgc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgeworCQlxZW50cnkgPSBuaWN2Zl9nZXRfbnh0X3NxZW50cnkoc3EsIHFlbnRyeSk7CisJCW5pY3ZmX3NxX2FkZF9jcWVfc3ViZGVzYyhzcSwgcWVudHJ5LCB0c29fc3FlLCBza2IpOworCX0KIAotCS8qIEluZm9ybSBIVyB0byB4bWl0IG5ldyBwYWNrZXQgKi8KLQluaWN2Zl9xdWV1ZV9yZWdfd3JpdGUobmljLCBOSUNfUVNFVF9TUV8wXzdfRE9PUiwKLQkJCSAgICAgIHNxX251bSwgc3ViZGVzY19jbnQpOworCW5pY3ZmX3NxX2Rvb3JiZWxsKG5pYywgc2tiLCBzcV9udW0sIHN1YmRlc2NfY250KTsKKwogCXJldHVybiAxOwogCiBhcHBlbmRfZmFpbDoKQEAgLTExODQsMTMgKzEyNTksMjMgQEAKIAlpbnQgZnJhZzsKIAlpbnQgcGF5bG9hZF9sZW4gPSAwOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXN0cnVjdCBza19idWZmICpza2JfZnJhZyA9IE5VTEw7Ci0Jc3RydWN0IHNrX2J1ZmYgKnByZXZfZnJhZyA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IG9mZnNldDsKIAl1MTYgKnJiX2xlbnMgPSBOVUxMOwogCXU2NCAqcmJfcHRycyA9IE5VTEw7CiAKIAlyYl9sZW5zID0gKHZvaWQgKiljcWVfcnggKyAoMyAqIHNpemVvZih1NjQpKTsKLQlyYl9wdHJzID0gKHZvaWQgKiljcWVfcnggKyAoNiAqIHNpemVvZih1NjQpKTsKKwkvKiBFeGNlcHQgODh4eCBwYXNzMSBvbiBhbGwgb3RoZXIgY2hpcHMgQ1FFX1JYMl9TIGlzIGFkZGVkIHRvCisJICogQ1FFX1JYIGF0IHdvcmQ2LCBoZW5jZSBidWZmZXIgcG9pbnRlcnMgbW92ZSBieSB3b3JkCisJICoKKwkgKiBVc2UgZXhpc3RpbmcgJ2h3X3RzbycgZmxhZyB3aGljaCB3aWxsIGJlIHNldCBmb3IgYWxsIGNoaXBzCisJICogZXhjZXB0IDg4eHggcGFzczEgaW5zdGVhZCBvZiBhIGFkZGl0aW9uYWwgY2FjaGUgbGluZQorCSAqIGFjY2VzcyAob3IgbWlzcykgYnkgdXNpbmcgcGNpIGRldidzIHJldmlzaW9uLgorCSAqLworCWlmICghbmljLT5od190c28pCisJCXJiX3B0cnMgPSAodm9pZCAqKWNxZV9yeCArICg2ICogc2l6ZW9mKHU2NCkpOworCWVsc2UKKwkJcmJfcHRycyA9ICh2b2lkICopY3FlX3J4ICsgKDcgKiBzaXplb2YodTY0KSk7CiAKIAluZXRkZXZfZGJnKG5pYy0+bmV0ZGV2LCAiJXMgcmJfY250ICVkIHJiMF9wdHIgJWxseCByYjBfc3ogJWRcbiIsCiAJCSAgIF9fZnVuY19fLCBjcWVfcngtPnJiX2NudCwgY3FlX3J4LT5yYjBfcHRyLCBjcWVfcngtPnJiMF9zeik7CkBAIC0xMjA4LDIyICsxMjkzLDEwIEBACiAJCQlza2JfcHV0KHNrYiwgcGF5bG9hZF9sZW4pOwogCQl9IGVsc2UgewogCQkJLyogQWRkIGZyYWdtZW50cyAqLwotCQkJc2tiX2ZyYWcgPSBuaWN2Zl9yYl9wdHJfdG9fc2tiKG5pYywgKnJiX3B0cnMsCi0JCQkJCQkgICAgICAgcGF5bG9hZF9sZW4pOwotCQkJaWYgKCFza2JfZnJhZykgewotCQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQotCQkJaWYgKCFza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkKLQkJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IHNrYl9mcmFnOwotCQkJZWxzZQotCQkJCXByZXZfZnJhZy0+bmV4dCA9IHNrYl9mcmFnOwotCi0JCQlwcmV2X2ZyYWcgPSBza2JfZnJhZzsKLQkJCXNrYi0+bGVuICs9IHBheWxvYWRfbGVuOwotCQkJc2tiLT5kYXRhX2xlbiArPSBwYXlsb2FkX2xlbjsKLQkJCXNrYl9mcmFnLT5sZW4gPSBwYXlsb2FkX2xlbjsKKwkJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UocGh5c190b192aXJ0KCpyYl9wdHJzKSk7CisJCQlvZmZzZXQgPSBwaHlzX3RvX3ZpcnQoKnJiX3B0cnMpIC0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCQkJc2tiX2FkZF9yeF9mcmFnKHNrYiwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncywgcGFnZSwKKwkJCQkJb2Zmc2V0LCBwYXlsb2FkX2xlbiwgUkNWX0ZSQUdfTEVOKTsKIAkJfQogCQkvKiBOZXh0IGJ1ZmZlciBwb2ludGVyICovCiAJCXJiX3B0cnMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL25pY3ZmX3F1ZXVlcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfcXVldWVzLmgKaW5kZXggNjY3M2UxMS4uODY5ZjMzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfcXVldWVzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvbmljdmZfcXVldWVzLmgKQEAgLTU3LDEwICs1Nyw3IEBACiAjZGVmaW5lIENNUF9RVUVVRV9TSVpFNgkJNlVMTCAvKiA2NEsgZW50cmllcyAqLwogCiAvKiBEZWZhdWx0IHF1ZXVlIGNvdW50IHBlciBRUywgaXRzIGxlbmd0aHMgYW5kIHRocmVzaG9sZCB2YWx1ZXMgKi8KLSNkZWZpbmUgUkJEUl9DTlQJCTEKLSNkZWZpbmUgUkNWX1FVRVVFX0NOVAkJOAotI2RlZmluZSBTTkRfUVVFVUVfQ05UCQk4Ci0jZGVmaW5lIENNUF9RVUVVRV9DTlQJCTggLyogTWF4IG9mIFJDViBhbmQgU05EIHFjb3VudCAqLworI2RlZmluZSBERUZBVUxUX1JCRFJfQ05UCTEKIAogI2RlZmluZSBTTkRfUVNJWkUJCVNORF9RVUVVRV9TSVpFMgogI2RlZmluZSBTTkRfUVVFVUVfTEVOCQkoMVVMTCA8PCAoU05EX1FTSVpFICsgMTApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvdGh1bmRlcl9iZ3guYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL3RodW5kZXJfYmd4LmMKaW5kZXggNjNhMzlhYy4uOGJiYWVkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvdGh1bmRlcl9iZ3guYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci90aHVuZGVyX2JneC5jCkBAIC0yOCw2ICsyOCw5IEBACiAJc3RydWN0IGJneAkJKmJneDsKIAlpbnQJCQlkbWFjOwogCXU4CQkJbWFjW0VUSF9BTEVOXTsKKwl1OCAgICAgICAgICAgICAgICAgICAgICBsbWFjX3R5cGU7CisJdTggICAgICAgICAgICAgICAgICAgICAgbGFuZV90b19zZHM7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgdXNlX3RyYWluaW5nOwogCWJvb2wJCQlsaW5rX3VwOwogCWludAkJCWxtYWNpZDsgLyogSUQgd2l0aGluIEJHWCAqLwogCWludAkJCWxtYWNpZF9iZDsgLyogSUQgb24gYm9hcmQgKi8KQEAgLTQzLDE0ICs0NiwxMyBAQAogCiBzdHJ1Y3QgYmd4IHsKIAl1OAkJCWJneF9pZDsKLQl1OAkJCXFsbV9tb2RlOwogCXN0cnVjdAlsbWFjCQlsbWFjW01BWF9MTUFDX1BFUl9CR1hdOwogCWludAkJCWxtYWNfY291bnQ7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgbG1hY190eXBlOwotCWludCAgICAgICAgICAgICAgICAgICAgIGxhbmVfdG9fc2RzOwotCWludAkJCXVzZV90cmFpbmluZzsKKwl1OAkJCW1heF9sbWFjOwogCXZvaWQgX19pb21lbQkJKnJlZ19iYXNlOwogCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwlib29sICAgICAgICAgICAgICAgICAgICBpc19kbG07CisJYm9vbCAgICAgICAgICAgICAgICAgICAgaXNfcmd4OwogfTsKIAogc3RhdGljIHN0cnVjdCBiZ3ggKmJneF92bmljW01BWF9CR1hfVEhVTkRFUl07CkBAIC02MSw2ICs2Myw3IEBACiAvKiBTdXBwb3J0ZWQgZGV2aWNlcyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJneF9pZF90YWJsZVtdID0gewogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NBVklVTSwgUENJX0RFVklDRV9JRF9USFVOREVSX0JHWCkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9DQVZJVU0sIFBDSV9ERVZJQ0VfSURfVEhVTkRFUl9SR1gpIH0sCiAJeyAwLCB9ICAvKiBlbmQgb2YgdGFibGUgKi8KIH07CiAKQEAgLTEyNCw4ICsxMjcsOCBAQAogCWludCBpOwogCXVuc2lnbmVkIG1hcCA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JHWF9QRVJfQ044OFhYOyBpKyspIHsKLQkJaWYgKGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfQ044OFhYKSArIGldKQorCWZvciAoaSA9IDA7IGkgPCBNQVhfQkdYX1BFUl9OT0RFOyBpKyspIHsKKwkJaWYgKGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfTk9ERSkgKyBpXSkKIAkJCW1hcCB8PSAoMSA8PCBpKTsKIAl9CiAKQEAgLTEzOCw3ICsxNDEsNyBAQAogewogCXN0cnVjdCBiZ3ggKmJneDsKIAotCWJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfQ044OFhYKSArIGJneF9pZHhdOworCWJneCA9IGJneF92bmljWyhub2RlICogTUFYX0JHWF9QRVJfTk9ERSkgKyBiZ3hfaWR4XTsKIAlpZiAoYmd4KQogCQlyZXR1cm4gYmd4LT5sbWFjX2NvdW50OwogCkBAIC0xNTMsNyArMTU2LDcgQEAKIAlzdHJ1Y3QgYmd4ICpiZ3g7CiAJc3RydWN0IGxtYWMgKmxtYWM7CiAKLQliZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX0NOODhYWCkgKyBiZ3hfaWR4XTsKKwliZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX05PREUpICsgYmd4X2lkeF07CiAJaWYgKCFiZ3gpCiAJCXJldHVybjsKIApAQCAtMTY2LDcgKzE2OSw3IEBACiAKIGNvbnN0IHU4ICpiZ3hfZ2V0X2xtYWNfbWFjKGludCBub2RlLCBpbnQgYmd4X2lkeCwgaW50IGxtYWNpZCkKIHsKLQlzdHJ1Y3QgYmd4ICpiZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX0NOODhYWCkgKyBiZ3hfaWR4XTsKKwlzdHJ1Y3QgYmd4ICpiZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX05PREUpICsgYmd4X2lkeF07CiAKIAlpZiAoYmd4KQogCQlyZXR1cm4gYmd4LT5sbWFjW2xtYWNpZF0ubWFjOwpAQCAtMTc3LDcgKzE4MCw3IEBACiAKIHZvaWQgYmd4X3NldF9sbWFjX21hYyhpbnQgbm9kZSwgaW50IGJneF9pZHgsIGludCBsbWFjaWQsIGNvbnN0IHU4ICptYWMpCiB7Ci0Jc3RydWN0IGJneCAqYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9DTjg4WFgpICsgYmd4X2lkeF07CisJc3RydWN0IGJneCAqYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9OT0RFKSArIGJneF9pZHhdOwogCiAJaWYgKCFiZ3gpCiAJCXJldHVybjsKQEAgLTE4OCwxMSArMTkxLDEzIEBACiAKIHZvaWQgYmd4X2xtYWNfcnhfdHhfZW5hYmxlKGludCBub2RlLCBpbnQgYmd4X2lkeCwgaW50IGxtYWNpZCwgYm9vbCBlbmFibGUpCiB7Ci0Jc3RydWN0IGJneCAqYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9DTjg4WFgpICsgYmd4X2lkeF07CisJc3RydWN0IGJneCAqYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9OT0RFKSArIGJneF9pZHhdOworCXN0cnVjdCBsbWFjICpsbWFjOwogCXU2NCBjZmc7CiAKIAlpZiAoIWJneCkKIAkJcmV0dXJuOworCWxtYWMgPSAmYmd4LT5sbWFjW2xtYWNpZF07CiAKIAljZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9DTVJYX0NGRyk7CiAJaWYgKGVuYWJsZSkKQEAgLTIwMCw2ICsyMDUsOSBAQAogCWVsc2UKIAkJY2ZnICY9IH4oQ01SX1BLVF9SWF9FTiB8IENNUl9QS1RfVFhfRU4pOwogCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjaWQsIEJHWF9DTVJYX0NGRywgY2ZnKTsKKworCWlmIChiZ3gtPmlzX3JneCkKKwkJeGN2X3NldHVwX2xpbmsoZW5hYmxlID8gbG1hYy0+bGlua191cCA6IDAsIGxtYWMtPmxhc3Rfc3BlZWQpOwogfQogRVhQT1JUX1NZTUJPTChiZ3hfbG1hY19yeF90eF9lbmFibGUpOwogCkBAIC0yNjYsOSArMjc0LDEyIEBACiAKIAlwb3J0X2NmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWMtPmxtYWNpZCwgQkdYX0dNUF9HTUlfUFJUWF9DRkcpOwogCi0JLyogcmVuYWJsZSBsbWFjICovCisJLyogUmUtZW5hYmxlIGxtYWMgKi8KIAljbXJfY2ZnIHw9IENNUl9FTjsKIAliZ3hfcmVnX3dyaXRlKGJneCwgbG1hYy0+bG1hY2lkLCBCR1hfQ01SWF9DRkcsIGNtcl9jZmcpOworCisJaWYgKGJneC0+aXNfcmd4ICYmIChjbXJfY2ZnICYgKENNUl9QS1RfUlhfRU4gfCBDTVJfUEtUX1RYX0VOKSkpCisJCXhjdl9zZXR1cF9saW5rKGxtYWMtPmxpbmtfdXAsIGxtYWMtPmxhc3Rfc3BlZWQpOwogfQogCiBzdGF0aWMgdm9pZCBiZ3hfbG1hY19oYW5kbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCkBAIC0zMTQsNyArMzI1LDcgQEAKIHsKIAlzdHJ1Y3QgYmd4ICpiZ3g7CiAKLQliZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX0NOODhYWCkgKyBiZ3hfaWR4XTsKKwliZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX05PREUpICsgYmd4X2lkeF07CiAJaWYgKCFiZ3gpCiAJCXJldHVybiAwOwogCkBAIC0zMjgsNyArMzM5LDcgQEAKIHsKIAlzdHJ1Y3QgYmd4ICpiZ3g7CiAKLQliZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX0NOODhYWCkgKyBiZ3hfaWR4XTsKKwliZ3ggPSBiZ3hfdm5pY1sobm9kZSAqIE1BWF9CR1hfUEVSX05PREUpICsgYmd4X2lkeF07CiAJaWYgKCFiZ3gpCiAJCXJldHVybiAwOwogCkBAIC0zNTYsNyArMzY3LDcgQEAKIAlzdHJ1Y3QgbG1hYyAqbG1hYzsKIAl1NjQgICAgY2ZnOwogCi0JYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9DTjg4WFgpICsgYmd4X2lkeF07CisJYmd4ID0gYmd4X3ZuaWNbKG5vZGUgKiBNQVhfQkdYX1BFUl9OT0RFKSArIGJneF9pZHhdOwogCWlmICghYmd4KQogCQlyZXR1cm47CiAKQEAgLTM3OSw4ICszOTAsOSBAQAogfQogRVhQT1JUX1NZTUJPTChiZ3hfbG1hY19pbnRlcm5hbF9sb29wYmFjayk7CiAKLXN0YXRpYyBpbnQgYmd4X2xtYWNfc2dtaWlfaW5pdChzdHJ1Y3QgYmd4ICpiZ3gsIGludCBsbWFjaWQpCitzdGF0aWMgaW50IGJneF9sbWFjX3NnbWlpX2luaXQoc3RydWN0IGJneCAqYmd4LCBzdHJ1Y3QgbG1hYyAqbG1hYykKIHsKKwlpbnQgbG1hY2lkID0gbG1hYy0+bG1hY2lkOwogCXU2NCBjZmc7CiAKIAliZ3hfcmVnX21vZGlmeShiZ3gsIGxtYWNpZCwgQkdYX0dNUF9HTUlfVFhYX1RIUkVTSCwgMHgzMCk7CkBAIC00MDksMTggKzQyMSwyOSBAQAogCWNmZyB8PSAoUENTX01SWF9DVExfUlNUX0FOIHwgUENTX01SWF9DVExfQU5fRU4pOwogCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjaWQsIEJHWF9HTVBfUENTX01SWF9DVEwsIGNmZyk7CiAKLQlpZiAoYmd4X3BvbGxfcmVnKGJneCwgbG1hY2lkLCBCR1hfR01QX1BDU19NUlhfU1RBVFVTLAotCQkJIFBDU19NUlhfU1RBVFVTX0FOX0NQVCwgZmFsc2UpKSB7Ci0JCWRldl9lcnIoJmJneC0+cGRldi0+ZGV2LCAiQkdYIEFOX0NQVCBub3QgY29tcGxldGVkXG4iKTsKLQkJcmV0dXJuIC0xOworCWlmIChsbWFjLT5sbWFjX3R5cGUgPT0gQkdYX01PREVfUVNHTUlJKSB7CisJCS8qIERpc2FibGUgZGlzcGFyaXR5IGNoZWNrIGZvciBRU0dNSUkgKi8KKwkJY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfR01QX1BDU19NSVNDWF9DVEwpOworCQljZmcgJj0gflBDU19NSVNDX0NUTF9ESVNQX0VOOworCQliZ3hfcmVnX3dyaXRlKGJneCwgbG1hY2lkLCBCR1hfR01QX1BDU19NSVNDWF9DVEwsIGNmZyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChsbWFjLT5sbWFjX3R5cGUgPT0gQkdYX01PREVfU0dNSUkpIHsKKwkJaWYgKGJneF9wb2xsX3JlZyhiZ3gsIGxtYWNpZCwgQkdYX0dNUF9QQ1NfTVJYX1NUQVRVUywKKwkJCQkgUENTX01SWF9TVEFUVVNfQU5fQ1BULCBmYWxzZSkpIHsKKwkJCWRldl9lcnIoJmJneC0+cGRldi0+ZGV2LCAiQkdYIEFOX0NQVCBub3QgY29tcGxldGVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJneF9sbWFjX3hhdWlfaW5pdChzdHJ1Y3QgYmd4ICpiZ3gsIGludCBsbWFjaWQsIGludCBsbWFjX3R5cGUpCitzdGF0aWMgaW50IGJneF9sbWFjX3hhdWlfaW5pdChzdHJ1Y3QgYmd4ICpiZ3gsIHN0cnVjdCBsbWFjICpsbWFjKQogewogCXU2NCBjZmc7CisJaW50IGxtYWNpZCA9IGxtYWMtPmxtYWNpZDsKIAogCS8qIFJlc2V0IFNQVSAqLwogCWJneF9yZWdfbW9kaWZ5KGJneCwgbG1hY2lkLCBCR1hfU1BVWF9DT05UUk9MMSwgU1BVX0NUTF9SRVNFVCk7CkBAIC00MzYsMTIgKzQ1OSwxNCBAQAogCiAJYmd4X3JlZ19tb2RpZnkoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0NPTlRST0wxLCBTUFVfQ1RMX0xPV19QT1dFUik7CiAJLyogU2V0IGludGVybGVhdmVkIHJ1bm5pbmcgZGlzcGFyaXR5IGZvciBSWEFVSSAqLwotCWlmIChiZ3gtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV9SWEFVSSkKLQkJYmd4X3JlZ19tb2RpZnkoYmd4LCBsbWFjaWQsCi0JCQkgICAgICAgQkdYX1NQVVhfTUlTQ19DT05UUk9MLCBTUFVfTUlTQ19DVExfUlhfRElTKTsKLQllbHNlCisJaWYgKGxtYWMtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV9SWEFVSSkKIAkJYmd4X3JlZ19tb2RpZnkoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX01JU0NfQ09OVFJPTCwKLQkJCSAgICAgICBTUFVfTUlTQ19DVExfUlhfRElTIHwgU1BVX01JU0NfQ1RMX0lOVExWX1JESVNQKTsKKwkJCSAgICAgICBTUFVfTUlTQ19DVExfSU5UTFZfUkRJU1ApOworCisJLyogQ2xlYXIgcmVjZWl2ZSBwYWNrZXQgZGlzYWJsZSAqLworCWNmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfTUlTQ19DT05UUk9MKTsKKwljZmcgJj0gflNQVV9NSVNDX0NUTF9SWF9ESVM7CisJYmd4X3JlZ193cml0ZShiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfTUlTQ19DT05UUk9MLCBjZmcpOwogCiAJLyogY2xlYXIgYWxsIGludGVycnVwdHMgKi8KIAljZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9TTVVYX1JYX0lOVCk7CkBAIC00NTEsNyArNDc2LDcgQEAKIAljZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0lOVCk7CiAJYmd4X3JlZ193cml0ZShiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfSU5ULCBjZmcpOwogCi0JaWYgKGJneC0+dXNlX3RyYWluaW5nKSB7CisJaWYgKGxtYWMtPnVzZV90cmFpbmluZykgewogCQliZ3hfcmVnX3dyaXRlKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9CUl9QTURfTFBfQ1VQLCAweDAwKTsKIAkJYmd4X3JlZ193cml0ZShiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfQlJfUE1EX0xEX0NVUCwgMHgwMCk7CiAJCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0JSX1BNRF9MRF9SRVAsIDB4MDApOwpAQCAtNDc0LDkgKzQ5OSw5IEBACiAJYmd4X3JlZ193cml0ZShiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfQU5fQ09OVFJPTCwgY2ZnKTsKIAogCWNmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGxtYWNpZCwgQkdYX1NQVVhfQU5fQURWKTsKLQlpZiAoYmd4LT5sbWFjX3R5cGUgPT0gQkdYX01PREVfMTBHX0tSKQorCWlmIChsbWFjLT5sbWFjX3R5cGUgPT0gQkdYX01PREVfMTBHX0tSKQogCQljZmcgfD0gKDEgPDwgMjMpOwotCWVsc2UgaWYgKGJneC0+bG1hY190eXBlID09IEJHWF9NT0RFXzQwR19LUikKKwllbHNlIGlmIChsbWFjLT5sbWFjX3R5cGUgPT0gQkdYX01PREVfNDBHX0tSKQogCQljZmcgfD0gKDEgPDwgMjQpOwogCWVsc2UKIAkJY2ZnICY9IH4oKDEgPDwgMjMpIHwgKDEgPDwgMjQpKTsKQEAgLTUxMSwxMSArNTM2LDEwIEBACiB7CiAJc3RydWN0IGJneCAqYmd4ID0gbG1hYy0+Ymd4OwogCWludCBsbWFjaWQgPSBsbWFjLT5sbWFjaWQ7Ci0JaW50IGxtYWNfdHlwZSA9IGJneC0+bG1hY190eXBlOworCWludCBsbWFjX3R5cGUgPSBsbWFjLT5sbWFjX3R5cGU7CiAJdTY0IGNmZzsKIAotCWJneF9yZWdfbW9kaWZ5KGJneCwgbG1hY2lkLCBCR1hfU1BVWF9NSVNDX0NPTlRST0wsIFNQVV9NSVNDX0NUTF9SWF9ESVMpOwotCWlmIChiZ3gtPnVzZV90cmFpbmluZykgeworCWlmIChsbWFjLT51c2VfdHJhaW5pbmcpIHsKIAkJY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9JTlQpOwogCQlpZiAoIShjZmcgJiAoMXVsbCA8PCAxMykpKSB7CiAJCQljZmcgPSAoMXVsbCA8PCAxMykgfCAoMXVsbCA8PCAxNCk7CkBAIC01NTYsNyArNTgwLDcgQEAKIAkJCSAgICAgICBCR1hfU1BVWF9TVEFUVVMyLCBTUFVfU1RBVFVTMl9SQ1ZGTFQpOwogCWlmIChiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX1NUQVRVUzIpICYgU1BVX1NUQVRVUzJfUkNWRkxUKSB7CiAJCWRldl9lcnIoJmJneC0+cGRldi0+ZGV2LCAiUmVjZWl2ZSBmYXVsdCwgcmV0cnkgdHJhaW5pbmdcbiIpOwotCQlpZiAoYmd4LT51c2VfdHJhaW5pbmcpIHsKKwkJaWYgKGxtYWMtPnVzZV90cmFpbmluZykgewogCQkJY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfU1BVWF9JTlQpOwogCQkJaWYgKCEoY2ZnICYgKDF1bGwgPDwgMTMpKSkgewogCQkJCWNmZyA9ICgxdWxsIDw8IDEzKSB8ICgxdWxsIDw8IDE0KTsKQEAgLTU4NCwxMSArNjA4LDYgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCS8qIENsZWFyIHJlY2VpdmUgcGFja2V0IGRpc2FibGUgKi8KLQljZmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX01JU0NfQ09OVFJPTCk7Ci0JY2ZnICY9IH5TUFVfTUlTQ19DVExfUlhfRElTOwotCWJneF9yZWdfd3JpdGUoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX01JU0NfQ09OVFJPTCwgY2ZnKTsKLQogCS8qIENoZWNrIGZvciBNQUMgUlggZmF1bHRzICovCiAJY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgbG1hY2lkLCBCR1hfU01VWF9SWF9DVEwpOwogCS8qIDAgLSBMaW5rIGlzIG9rYXksIDEgLSBMb2NhbCBmYXVsdCwgMiAtIFJlbW90ZSBmYXVsdCAqLwpAQCAtNTk5LDcgKzYxOCw3IEBACiAJLyogUnggbG9jYWwvcmVtb3RlIGZhdWx0IHNlZW4uCiAJICogRG8gbG1hYyByZWluaXQgdG8gc2VlIGlmIGNvbmRpdGlvbiByZWNvdmVycwogCSAqLwotCWJneF9sbWFjX3hhdWlfaW5pdChiZ3gsIGxtYWNpZCwgYmd4LT5sbWFjX3R5cGUpOworCWJneF9sbWFjX3hhdWlfaW5pdChiZ3gsIGxtYWMpOwogCiAJcmV0dXJuIC0xOwogfQpAQCAtNjIzLDcgKzY0Miw3IEBACiAJaWYgKChzcHVfbGluayAmIFNQVV9TVEFUVVMxX1JDVl9MTkspICYmCiAJICAgICEoc211X2xpbmsgJiBTTVVfUlhfQ1RMX1NUQVRVUykpIHsKIAkJbG1hYy0+bGlua191cCA9IDE7Ci0JCWlmIChsbWFjLT5iZ3gtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV9YTEFVSSkKKwkJaWYgKGxtYWMtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV9YTEFVSSkKIAkJCWxtYWMtPmxhc3Rfc3BlZWQgPSA0MDAwMDsKIAkJZWxzZQogCQkJbG1hYy0+bGFzdF9zcGVlZCA9IDEwMDAwOwpAQCAtNjQ5LDYgKzY2OCwxNiBAQAogCXF1ZXVlX2RlbGF5ZWRfd29yayhsbWFjLT5jaGVja19saW5rLCAmbG1hYy0+ZHdvcmssIEhaICogMik7CiB9CiAKK3N0YXRpYyBpbnQgcGh5X2ludGVyZmFjZV9tb2RlKHU4IGxtYWNfdHlwZSkKK3sKKwlpZiAobG1hY190eXBlID09IEJHWF9NT0RFX1FTR01JSSkKKwkJcmV0dXJuIFBIWV9JTlRFUkZBQ0VfTU9ERV9RU0dNSUk7CisJaWYgKGxtYWNfdHlwZSA9PSBCR1hfTU9ERV9SR01JSSkKKwkJcmV0dXJuIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSTsKKworCXJldHVybiBQSFlfSU5URVJGQUNFX01PREVfU0dNSUk7Cit9CisKIHN0YXRpYyBpbnQgYmd4X2xtYWNfZW5hYmxlKHN0cnVjdCBiZ3ggKmJneCwgdTggbG1hY2lkKQogewogCXN0cnVjdCBsbWFjICpsbWFjOwpAQCAtNjU3LDEzICs2ODYsMTUgQEAKIAlsbWFjID0gJmJneC0+bG1hY1tsbWFjaWRdOwogCWxtYWMtPmJneCA9IGJneDsKIAotCWlmIChiZ3gtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV9TR01JSSkgeworCWlmICgobG1hYy0+bG1hY190eXBlID09IEJHWF9NT0RFX1NHTUlJKSB8fAorCSAgICAobG1hYy0+bG1hY190eXBlID09IEJHWF9NT0RFX1FTR01JSSkgfHwKKwkgICAgKGxtYWMtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV9SR01JSSkpIHsKIAkJbG1hYy0+aXNfc2dtaWkgPSAxOwotCQlpZiAoYmd4X2xtYWNfc2dtaWlfaW5pdChiZ3gsIGxtYWNpZCkpCisJCWlmIChiZ3hfbG1hY19zZ21paV9pbml0KGJneCwgbG1hYykpCiAJCQlyZXR1cm4gLTE7CiAJfSBlbHNlIHsKIAkJbG1hYy0+aXNfc2dtaWkgPSAwOwotCQlpZiAoYmd4X2xtYWNfeGF1aV9pbml0KGJneCwgbG1hY2lkLCBiZ3gtPmxtYWNfdHlwZSkpCisJCWlmIChiZ3hfbG1hY194YXVpX2luaXQoYmd4LCBsbWFjKSkKIAkJCXJldHVybiAtMTsKIAl9CiAKQEAgLTY4NSwxMCArNzE2LDEwIEBACiAJLyogUmVzdG9yZSBkZWZhdWx0IGNmZywgaW5jYXNlIGxvdyBsZXZlbCBmaXJtd2FyZSBjaGFuZ2VkIGl0ICovCiAJYmd4X3JlZ193cml0ZShiZ3gsIGxtYWNpZCwgQkdYX0NNUlhfUlhfRE1BQ19DVEwsIDB4MDMpOwogCi0JaWYgKChiZ3gtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV9YRkkpICYmCi0JICAgIChiZ3gtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV9YTEFVSSkgJiYKLQkgICAgKGJneC0+bG1hY190eXBlICE9IEJHWF9NT0RFXzQwR19LUikgJiYKLQkgICAgKGJneC0+bG1hY190eXBlICE9IEJHWF9NT0RFXzEwR19LUikpIHsKKwlpZiAoKGxtYWMtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV9YRkkpICYmCisJICAgIChsbWFjLT5sbWFjX3R5cGUgIT0gQkdYX01PREVfWExBVUkpICYmCisJICAgIChsbWFjLT5sbWFjX3R5cGUgIT0gQkdYX01PREVfNDBHX0tSKSAmJgorCSAgICAobG1hYy0+bG1hY190eXBlICE9IEJHWF9NT0RFXzEwR19LUikpIHsKIAkJaWYgKCFsbWFjLT5waHlkZXYpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtNjk2LDcgKzcyNyw3IEBACiAKIAkJaWYgKHBoeV9jb25uZWN0X2RpcmVjdCgmbG1hYy0+bmV0ZGV2LCBsbWFjLT5waHlkZXYsCiAJCQkJICAgICAgIGJneF9sbWFjX2hhbmRsZXIsCi0JCQkJICAgICAgIFBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSSkpCisJCQkJICAgICAgIHBoeV9pbnRlcmZhY2VfbW9kZShsbWFjLT5sbWFjX3R5cGUpKSkKIAkJCXJldHVybiAtRU5PREVWOwogCiAJCXBoeV9zdGFydF9hbmVnKGxtYWMtPnBoeWRldik7CkBAIC03NTMsNzYgKzc4NCwxOSBAQAogCiAJYmd4X2ZsdXNoX2RtYWNfYWRkcnMoYmd4LCBsbWFjaWQpOwogCi0JaWYgKChiZ3gtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV9YRkkpICYmCi0JICAgIChiZ3gtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV9YTEFVSSkgJiYKLQkgICAgKGJneC0+bG1hY190eXBlICE9IEJHWF9NT0RFXzQwR19LUikgJiYKLQkgICAgKGJneC0+bG1hY190eXBlICE9IEJHWF9NT0RFXzEwR19LUikgJiYgbG1hYy0+cGh5ZGV2KQorCWlmICgobG1hYy0+bG1hY190eXBlICE9IEJHWF9NT0RFX1hGSSkgJiYKKwkgICAgKGxtYWMtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV9YTEFVSSkgJiYKKwkgICAgKGxtYWMtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV80MEdfS1IpICYmCisJICAgIChsbWFjLT5sbWFjX3R5cGUgIT0gQkdYX01PREVfMTBHX0tSKSAmJiBsbWFjLT5waHlkZXYpCiAJCXBoeV9kaXNjb25uZWN0KGxtYWMtPnBoeWRldik7CiAKIAlsbWFjLT5waHlkZXYgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBiZ3hfc2V0X251bV9wb3J0cyhzdHJ1Y3QgYmd4ICpiZ3gpCi17Ci0JdTY0IGxtYWNfY291bnQ7Ci0KLQlzd2l0Y2ggKGJneC0+cWxtX21vZGUpIHsKLQljYXNlIFFMTV9NT0RFX1NHTUlJOgotCQliZ3gtPmxtYWNfY291bnQgPSA0OwotCQliZ3gtPmxtYWNfdHlwZSA9IEJHWF9NT0RFX1NHTUlJOwotCQliZ3gtPmxhbmVfdG9fc2RzID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBRTE1fTU9ERV9YQVVJXzFYNDoKLQkJYmd4LT5sbWFjX2NvdW50ID0gMTsKLQkJYmd4LT5sbWFjX3R5cGUgPSBCR1hfTU9ERV9YQVVJOwotCQliZ3gtPmxhbmVfdG9fc2RzID0gMHhFNDsKLQkJCWJyZWFrOwotCWNhc2UgUUxNX01PREVfUlhBVUlfMlgyOgotCQliZ3gtPmxtYWNfY291bnQgPSAyOwotCQliZ3gtPmxtYWNfdHlwZSA9IEJHWF9NT0RFX1JYQVVJOwotCQliZ3gtPmxhbmVfdG9fc2RzID0gMHhFNDsKLQkJCWJyZWFrOwotCWNhc2UgUUxNX01PREVfWEZJXzRYMToKLQkJYmd4LT5sbWFjX2NvdW50ID0gNDsKLQkJYmd4LT5sbWFjX3R5cGUgPSBCR1hfTU9ERV9YRkk7Ci0JCWJneC0+bGFuZV90b19zZHMgPSAwOwotCQlicmVhazsKLQljYXNlIFFMTV9NT0RFX1hMQVVJXzFYNDoKLQkJYmd4LT5sbWFjX2NvdW50ID0gMTsKLQkJYmd4LT5sbWFjX3R5cGUgPSBCR1hfTU9ERV9YTEFVSTsKLQkJYmd4LT5sYW5lX3RvX3NkcyA9IDB4RTQ7Ci0JCWJyZWFrOwotCWNhc2UgUUxNX01PREVfMTBHX0tSXzRYMToKLQkJYmd4LT5sbWFjX2NvdW50ID0gNDsKLQkJYmd4LT5sbWFjX3R5cGUgPSBCR1hfTU9ERV8xMEdfS1I7Ci0JCWJneC0+bGFuZV90b19zZHMgPSAwOwotCQliZ3gtPnVzZV90cmFpbmluZyA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgUUxNX01PREVfNDBHX0tSNF8xWDQ6Ci0JCWJneC0+bG1hY19jb3VudCA9IDE7Ci0JCWJneC0+bG1hY190eXBlID0gQkdYX01PREVfNDBHX0tSOwotCQliZ3gtPmxhbmVfdG9fc2RzID0gMHhFNDsKLQkJYmd4LT51c2VfdHJhaW5pbmcgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQliZ3gtPmxtYWNfY291bnQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQkvKiBDaGVjayBpZiBsb3cgbGV2ZWwgZmlybXdhcmUgaGFzIHByb2dyYW1tZWQgTE1BQyBjb3VudAotCSAqIGJhc2VkIG9uIGJvYXJkIHR5cGUsIGlmIHllcyBjb25zaWRlciB0aGF0IG90aGVyd2lzZQotCSAqIHRoZSBkZWZhdWx0IHN0YXRpYyB2YWx1ZXMKLQkgKi8KLQlsbWFjX2NvdW50ID0gYmd4X3JlZ19yZWFkKGJneCwgMCwgQkdYX0NNUl9SWF9MTUFDUykgJiAweDc7Ci0JaWYgKGxtYWNfY291bnQgIT0gNCkKLQkJYmd4LT5sbWFjX2NvdW50ID0gbG1hY19jb3VudDsKLX0KLQogc3RhdGljIHZvaWQgYmd4X2luaXRfaHcoc3RydWN0IGJneCAqYmd4KQogewogCWludCBpOwotCi0JYmd4X3NldF9udW1fcG9ydHMoYmd4KTsKKwlzdHJ1Y3QgbG1hYyAqbG1hYzsKIAogCWJneF9yZWdfbW9kaWZ5KGJneCwgMCwgQkdYX0NNUl9HTE9CQUxfQ0ZHLCBDTVJfR0xPQkFMX0NGR19GQ1NfU1RSSVApOwogCWlmIChiZ3hfcmVnX3JlYWQoYmd4LCAwLCBCR1hfQ01SX0JJU1RfU1RBVFVTKSkKQEAgLTgzMCwxNyArODA0LDkgQEAKIAogCS8qIFNldCBsbWFjIHR5cGUgYW5kIGxhbmUyc2VyZGVzIG1hcHBpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgYmd4LT5sbWFjX2NvdW50OyBpKyspIHsKLQkJaWYgKGJneC0+bG1hY190eXBlID09IEJHWF9NT0RFX1JYQVVJKSB7Ci0JCQlpZiAoaSkKLQkJCQliZ3gtPmxhbmVfdG9fc2RzID0gMHgwZTsKLQkJCWVsc2UKLQkJCQliZ3gtPmxhbmVfdG9fc2RzID0gMHgwNDsKLQkJCWJneF9yZWdfd3JpdGUoYmd4LCBpLCBCR1hfQ01SWF9DRkcsCi0JCQkJICAgICAgKGJneC0+bG1hY190eXBlIDw8IDgpIHwgYmd4LT5sYW5lX3RvX3Nkcyk7Ci0JCQljb250aW51ZTsKLQkJfQorCQlsbWFjID0gJmJneC0+bG1hY1tpXTsKIAkJYmd4X3JlZ193cml0ZShiZ3gsIGksIEJHWF9DTVJYX0NGRywKLQkJCSAgICAgIChiZ3gtPmxtYWNfdHlwZSA8PCA4KSB8IChiZ3gtPmxhbmVfdG9fc2RzICsgaSkpOworCQkJICAgICAgKGxtYWMtPmxtYWNfdHlwZSA8PCA4KSB8IGxtYWMtPmxhbmVfdG9fc2RzKTsKIAkJYmd4LT5sbWFjW2ldLmxtYWNpZF9iZCA9IGxtYWNfY291bnQ7CiAJCWxtYWNfY291bnQrKzsKIAl9CkBAIC04NjMsNTUgKzgyOSwyMTIgQEAKIAkJYmd4X3JlZ193cml0ZShiZ3gsIDAsIEJHWF9DTVJfUlhfU1RSRUVSSU5HICsgKGkgKiA4KSwgMHgwMCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJneF9nZXRfcWxtX21vZGUoc3RydWN0IGJneCAqYmd4KQorc3RhdGljIHU4IGJneF9nZXRfbGFuZTJzZHNfY2ZnKHN0cnVjdCBiZ3ggKmJneCwgc3RydWN0IGxtYWMgKmxtYWMpCit7CisJcmV0dXJuICh1OCkoYmd4X3JlZ19yZWFkKGJneCwgbG1hYy0+bG1hY2lkLCBCR1hfQ01SWF9DRkcpICYgMHhGRik7Cit9CisKK3N0YXRpYyB2b2lkIGJneF9wcmludF9xbG1fbW9kZShzdHJ1Y3QgYmd4ICpiZ3gsIHU4IGxtYWNpZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYmd4LT5wZGV2LT5kZXY7Ci0JaW50IGxtYWNfdHlwZTsKLQlpbnQgdHJhaW5fZW47CisJc3RydWN0IGxtYWMgKmxtYWM7CisJY2hhciBzdHJbMjBdOworCXU4IGRsbTsKIAotCS8qIFJlYWQgTE1BQzAgdHlwZSB0byBmaWd1cmUgb3V0IFFMTSBtb2RlCi0JICogVGhpcyBpcyBjb25maWd1cmVkIGJ5IGxvdyBsZXZlbCBmaXJtd2FyZQotCSAqLwotCWxtYWNfdHlwZSA9IGJneF9yZWdfcmVhZChiZ3gsIDAsIEJHWF9DTVJYX0NGRyk7Ci0JbG1hY190eXBlID0gKGxtYWNfdHlwZSA+PiA4KSAmIDB4MDc7CisJaWYgKGxtYWNpZCA+IGJneC0+bWF4X2xtYWMpCisJCXJldHVybjsKIAotCXRyYWluX2VuID0gYmd4X3JlZ19yZWFkKGJneCwgMCwgQkdYX1NQVVhfQlJfUE1EX0NSVEwpICYKLQkJCQlTUFVfUE1EX0NSVExfVFJBSU5fRU47CisJbG1hYyA9ICZiZ3gtPmxtYWNbbG1hY2lkXTsKKwlkbG0gPSAobG1hY2lkIC8gMikgKyAoYmd4LT5iZ3hfaWQgKiAyKTsKKwlpZiAoIWJneC0+aXNfZGxtKQorCQlzcHJpbnRmKHN0ciwgIkJHWCVkIFFMTSBtb2RlIiwgYmd4LT5iZ3hfaWQpOworCWVsc2UKKwkJc3ByaW50ZihzdHIsICJCR1glZCBETE0lZCBtb2RlIiwgYmd4LT5iZ3hfaWQsIGRsbSk7CiAKLQlzd2l0Y2ggKGxtYWNfdHlwZSkgeworCXN3aXRjaCAobG1hYy0+bG1hY190eXBlKSB7CiAJY2FzZSBCR1hfTU9ERV9TR01JSToKLQkJYmd4LT5xbG1fbW9kZSA9IFFMTV9NT0RFX1NHTUlJOwotCQlkZXZfaW5mbyhkZXYsICJCR1glZCBRTE0gbW9kZTogU0dNSUlcbiIsIGJneC0+Ymd4X2lkKTsKKwkJZGV2X2luZm8oZGV2LCAiJXM6IFNHTUlJXG4iLCAoY2hhciAqKXN0cik7CiAJCWJyZWFrOwogCWNhc2UgQkdYX01PREVfWEFVSToKLQkJYmd4LT5xbG1fbW9kZSA9IFFMTV9NT0RFX1hBVUlfMVg0OwotCQlkZXZfaW5mbyhkZXYsICJCR1glZCBRTE0gbW9kZTogWEFVSVxuIiwgYmd4LT5iZ3hfaWQpOworCQlkZXZfaW5mbyhkZXYsICIlczogWEFVSVxuIiwgKGNoYXIgKilzdHIpOwogCQlicmVhazsKIAljYXNlIEJHWF9NT0RFX1JYQVVJOgotCQliZ3gtPnFsbV9tb2RlID0gUUxNX01PREVfUlhBVUlfMlgyOwotCQlkZXZfaW5mbyhkZXYsICJCR1glZCBRTE0gbW9kZTogUlhBVUlcbiIsIGJneC0+Ymd4X2lkKTsKKwkJZGV2X2luZm8oZGV2LCAiJXM6IFJYQVVJXG4iLCAoY2hhciAqKXN0cik7CiAJCWJyZWFrOwogCWNhc2UgQkdYX01PREVfWEZJOgotCQlpZiAoIXRyYWluX2VuKSB7Ci0JCQliZ3gtPnFsbV9tb2RlID0gUUxNX01PREVfWEZJXzRYMTsKLQkJCWRldl9pbmZvKGRldiwgIkJHWCVkIFFMTSBtb2RlOiBYRklcbiIsIGJneC0+Ymd4X2lkKTsKLQkJfSBlbHNlIHsKLQkJCWJneC0+cWxtX21vZGUgPSBRTE1fTU9ERV8xMEdfS1JfNFgxOwotCQkJZGV2X2luZm8oZGV2LCAiQkdYJWQgUUxNIG1vZGU6IDEwR19LUlxuIiwgYmd4LT5iZ3hfaWQpOwotCQl9CisJCWlmICghbG1hYy0+dXNlX3RyYWluaW5nKQorCQkJZGV2X2luZm8oZGV2LCAiJXM6IFhGSVxuIiwgKGNoYXIgKilzdHIpOworCQllbHNlCisJCQlkZXZfaW5mbyhkZXYsICIlczogMTBHX0tSXG4iLCAoY2hhciAqKXN0cik7CiAJCWJyZWFrOwogCWNhc2UgQkdYX01PREVfWExBVUk6Ci0JCWlmICghdHJhaW5fZW4pIHsKLQkJCWJneC0+cWxtX21vZGUgPSBRTE1fTU9ERV9YTEFVSV8xWDQ7Ci0JCQlkZXZfaW5mbyhkZXYsICJCR1glZCBRTE0gbW9kZTogWExBVUlcbiIsIGJneC0+Ymd4X2lkKTsKLQkJfSBlbHNlIHsKLQkJCWJneC0+cWxtX21vZGUgPSBRTE1fTU9ERV80MEdfS1I0XzFYNDsKLQkJCWRldl9pbmZvKGRldiwgIkJHWCVkIFFMTSBtb2RlOiA0MEdfS1I0XG4iLCBiZ3gtPmJneF9pZCk7Ci0JCX0KKwkJaWYgKCFsbWFjLT51c2VfdHJhaW5pbmcpCisJCQlkZXZfaW5mbyhkZXYsICIlczogWExBVUlcbiIsIChjaGFyICopc3RyKTsKKwkJZWxzZQorCQkJZGV2X2luZm8oZGV2LCAiJXM6IDQwR19LUjRcbiIsIChjaGFyICopc3RyKTsKKwkJYnJlYWs7CisJY2FzZSBCR1hfTU9ERV9RU0dNSUk6CisJCWlmICgobG1hY2lkID09IDApICYmCisJCSAgICAoYmd4X2dldF9sYW5lMnNkc19jZmcoYmd4LCBsbWFjKSAhPSBsbWFjaWQpKQorCQkJcmV0dXJuOworCQlpZiAoKGxtYWNpZCA9PSAyKSAmJgorCQkgICAgKGJneF9nZXRfbGFuZTJzZHNfY2ZnKGJneCwgbG1hYykgPT0gbG1hY2lkKSkKKwkJCXJldHVybjsKKwkJZGV2X2luZm8oZGV2LCAiJXM6IFFTR01JSVxuIiwgKGNoYXIgKilzdHIpOworCQlicmVhazsKKwljYXNlIEJHWF9NT0RFX1JHTUlJOgorCQlkZXZfaW5mbyhkZXYsICIlczogUkdNSUlcbiIsIChjaGFyICopc3RyKTsKKwkJYnJlYWs7CisJY2FzZSBCR1hfTU9ERV9JTlZBTElEOgorCQkvKiBOb3RoaW5nIHRvIGRvICovCisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgbG1hY19zZXRfbGFuZTJzZHMoc3RydWN0IGJneCAqYmd4LCBzdHJ1Y3QgbG1hYyAqbG1hYykKK3sKKwlzd2l0Y2ggKGxtYWMtPmxtYWNfdHlwZSkgeworCWNhc2UgQkdYX01PREVfU0dNSUk6CisJY2FzZSBCR1hfTU9ERV9YRkk6CisJCWxtYWMtPmxhbmVfdG9fc2RzID0gbG1hYy0+bG1hY2lkOworCQlicmVhazsKKwljYXNlIEJHWF9NT0RFX1hBVUk6CisJY2FzZSBCR1hfTU9ERV9YTEFVSToKKwljYXNlIEJHWF9NT0RFX1JHTUlJOgorCQlsbWFjLT5sYW5lX3RvX3NkcyA9IDB4RTQ7CisJCWJyZWFrOworCWNhc2UgQkdYX01PREVfUlhBVUk6CisJCWxtYWMtPmxhbmVfdG9fc2RzID0gKGxtYWMtPmxtYWNpZCkgPyAweEUgOiAweDQ7CisJCWJyZWFrOworCWNhc2UgQkdYX01PREVfUVNHTUlJOgorCQkvKiBUaGVyZSBpcyBubyB3YXkgdG8gZGV0ZXJtaW5lIGlmIERMTTAvMiBpcyBRU0dNSUkgb3IKKwkJICogRExNMS8zIGlzIGNvbmZpZ3VyZWQgdG8gUVNHTUlJIGFzIGJvb3Rsb2FkZXIgd2lsbAorCQkgKiBjb25maWd1cmUgYWxsIExNQUNzLCBzbyB0YWtlIHdoYXRldmVyIGlzIGNvbmZpZ3VyZWQKKwkJICogYnkgbG93IGxldmVsIGZpcm13YXJlLgorCQkgKi8KKwkJbG1hYy0+bGFuZV90b19zZHMgPSBiZ3hfZ2V0X2xhbmUyc2RzX2NmZyhiZ3gsIGxtYWMpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQliZ3gtPnFsbV9tb2RlID0gUUxNX01PREVfU0dNSUk7Ci0JCWRldl9pbmZvKGRldiwgIkJHWCVkIFFMTSBkZWZhdWx0IG1vZGU6IFNHTUlJXG4iLCBiZ3gtPmJneF9pZCk7CisJCWxtYWMtPmxhbmVfdG9fc2RzID0gMDsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBsbWFjX3NldF90cmFpbmluZyhzdHJ1Y3QgYmd4ICpiZ3gsIHN0cnVjdCBsbWFjICpsbWFjLCBpbnQgbG1hY2lkKQoreworCWlmICgobG1hYy0+bG1hY190eXBlICE9IEJHWF9NT0RFXzEwR19LUikgJiYKKwkgICAgKGxtYWMtPmxtYWNfdHlwZSAhPSBCR1hfTU9ERV80MEdfS1IpKSB7CisJCWxtYWMtPnVzZV90cmFpbmluZyA9IDA7CisJCXJldHVybjsKKwl9CisKKwlsbWFjLT51c2VfdHJhaW5pbmcgPSBiZ3hfcmVnX3JlYWQoYmd4LCBsbWFjaWQsIEJHWF9TUFVYX0JSX1BNRF9DUlRMKSAmCisJCQkJCQkJU1BVX1BNRF9DUlRMX1RSQUlOX0VOOworfQorCitzdGF0aWMgdm9pZCBiZ3hfc2V0X2xtYWNfY29uZmlnKHN0cnVjdCBiZ3ggKmJneCwgdTggaWR4KQoreworCXN0cnVjdCBsbWFjICpsbWFjOworCXN0cnVjdCBsbWFjICpvbG1hYzsKKwl1NjQgY21yX2NmZzsKKwl1OCBsbWFjX3R5cGU7CisJdTggbGFuZV90b19zZHM7CisKKwlsbWFjID0gJmJneC0+bG1hY1tpZHhdOworCisJaWYgKCFiZ3gtPmlzX2RsbSB8fCBiZ3gtPmlzX3JneCkgeworCQkvKiBSZWFkIExNQUMwIHR5cGUgdG8gZmlndXJlIG91dCBRTE0gbW9kZQorCQkgKiBUaGlzIGlzIGNvbmZpZ3VyZWQgYnkgbG93IGxldmVsIGZpcm13YXJlCisJCSAqLworCQljbXJfY2ZnID0gYmd4X3JlZ19yZWFkKGJneCwgMCwgQkdYX0NNUlhfQ0ZHKTsKKwkJbG1hYy0+bG1hY190eXBlID0gKGNtcl9jZmcgPj4gOCkgJiAweDA3OworCQlpZiAoYmd4LT5pc19yZ3gpCisJCQlsbWFjLT5sbWFjX3R5cGUgPSBCR1hfTU9ERV9SR01JSTsKKwkJbG1hY19zZXRfdHJhaW5pbmcoYmd4LCBsbWFjLCAwKTsKKwkJbG1hY19zZXRfbGFuZTJzZHMoYmd4LCBsbWFjKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE9uIDgxeHggQkdYIGNhbiBiZSBzcGxpdCBhY3Jvc3MgMiBETE1zCisJICogZmlybXdhcmUgcHJvZ3JhbXMgbG1hY190eXBlIG9mIExNQUMwIGFuZCBMTUFDMgorCSAqLworCWlmICgoaWR4ID09IDApIHx8IChpZHggPT0gMikpIHsKKwkJY21yX2NmZyA9IGJneF9yZWdfcmVhZChiZ3gsIGlkeCwgQkdYX0NNUlhfQ0ZHKTsKKwkJbG1hY190eXBlID0gKHU4KSgoY21yX2NmZyA+PiA4KSAmIDB4MDcpOworCQlsYW5lX3RvX3NkcyA9ICh1OCkoY21yX2NmZyAmIDB4RkYpOworCQkvKiBDaGVjayBpZiBjb25maWcgaXMgbm90IHJlc2V0IHZhbHVlICovCisJCWlmICgobG1hY190eXBlID09IDApICYmIChsYW5lX3RvX3NkcyA9PSAweEU0KSkKKwkJCWxtYWMtPmxtYWNfdHlwZSA9IEJHWF9NT0RFX0lOVkFMSUQ7CisJCWVsc2UKKwkJCWxtYWMtPmxtYWNfdHlwZSA9IGxtYWNfdHlwZTsKKwkJbG1hY19zZXRfdHJhaW5pbmcoYmd4LCBsbWFjLCBsbWFjLT5sbWFjaWQpOworCQlsbWFjX3NldF9sYW5lMnNkcyhiZ3gsIGxtYWMpOworCisJCS8qIFNldCBMTUFDIHR5cGUgb2Ygb3RoZXIgbG1hYyBvbiBzYW1lIERMTSBpLmUgTE1BQyAxLzMgKi8KKwkJb2xtYWMgPSAmYmd4LT5sbWFjW2lkeCArIDFdOworCQlvbG1hYy0+bG1hY190eXBlID0gbG1hYy0+bG1hY190eXBlOworCQlsbWFjX3NldF90cmFpbmluZyhiZ3gsIG9sbWFjLCBvbG1hYy0+bG1hY2lkKTsKKwkJbG1hY19zZXRfbGFuZTJzZHMoYmd4LCBvbG1hYyk7CisJfQorfQorCitzdGF0aWMgYm9vbCBpc19kbG0wX2luX2JneF9tb2RlKHN0cnVjdCBiZ3ggKmJneCkKK3sKKwlzdHJ1Y3QgbG1hYyAqbG1hYzsKKworCWlmICghYmd4LT5pc19kbG0pCisJCXJldHVybiB0cnVlOworCisJbG1hYyA9ICZiZ3gtPmxtYWNbMF07CisJaWYgKGxtYWMtPmxtYWNfdHlwZSA9PSBCR1hfTU9ERV9JTlZBTElEKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYmd4X2dldF9xbG1fbW9kZShzdHJ1Y3QgYmd4ICpiZ3gpCit7CisJc3RydWN0IGxtYWMgKmxtYWM7CisJc3RydWN0IGxtYWMgKmxtYWMwMTsKKwlzdHJ1Y3QgbG1hYyAqbG1hYzIzOworCXU4ICBpZHg7CisKKwkvKiBJbml0IGFsbCBMTUFDJ3MgdHlwZSB0byBpbnZhbGlkICovCisJZm9yIChpZHggPSAwOyBpZHggPCBiZ3gtPm1heF9sbWFjOyBpZHgrKykgeworCQlsbWFjID0gJmJneC0+bG1hY1tpZHhdOworCQlsbWFjLT5sbWFjaWQgPSBpZHg7CisJCWxtYWMtPmxtYWNfdHlwZSA9IEJHWF9NT0RFX0lOVkFMSUQ7CisJCWxtYWMtPnVzZV90cmFpbmluZyA9IGZhbHNlOworCX0KKworCS8qIEl0IGlzIGFzc3VtZWQgdGhhdCBsb3cgbGV2ZWwgZmlybXdhcmUgc2V0cyB0aGlzIHZhbHVlICovCisJYmd4LT5sbWFjX2NvdW50ID0gYmd4X3JlZ19yZWFkKGJneCwgMCwgQkdYX0NNUl9SWF9MTUFDUykgJiAweDc7CisJaWYgKGJneC0+bG1hY19jb3VudCA+IGJneC0+bWF4X2xtYWMpCisJCWJneC0+bG1hY19jb3VudCA9IGJneC0+bWF4X2xtYWM7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGJneC0+bWF4X2xtYWM7IGlkeCsrKQorCQliZ3hfc2V0X2xtYWNfY29uZmlnKGJneCwgaWR4KTsKKworCWlmICghYmd4LT5pc19kbG0gfHwgYmd4LT5pc19yZ3gpIHsKKwkJYmd4X3ByaW50X3FsbV9tb2RlKGJneCwgMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYmd4LT5sbWFjX2NvdW50KSB7CisJCWJneF9wcmludF9xbG1fbW9kZShiZ3gsIDApOworCQliZ3hfcHJpbnRfcWxtX21vZGUoYmd4LCAyKTsKKwl9CisKKwkvKiBJZiBETE0wIGlzIG5vdCBpbiBCR1ggbW9kZSB0aGVuIExNQUMwLzEgaGF2ZQorCSAqIHRvIGJlIGNvbmZpZ3VyZWQgd2l0aCBzZXJkZXMgbGFuZXMgb2YgRExNMQorCSAqLworCWlmIChpc19kbG0wX2luX2JneF9tb2RlKGJneCkgfHwgKGJneC0+bG1hY19jb3VudCA+IDIpKQorCQlyZXR1cm47CisJZm9yIChpZHggPSAwOyBpZHggPCBiZ3gtPmxtYWNfY291bnQ7IGlkeCsrKSB7CisJCWxtYWMwMSA9ICZiZ3gtPmxtYWNbaWR4XTsKKwkJbG1hYzIzID0gJmJneC0+bG1hY1tpZHggKyAyXTsKKwkJbG1hYzAxLT5sbWFjX3R5cGUgPSBsbWFjMjMtPmxtYWNfdHlwZTsKKwkJbG1hYzAxLT5sYW5lX3RvX3NkcyA9IGxtYWMyMy0+bGFuZV90b19zZHM7CiAJfQogfQogCkBAIC0xMDQyLDcgKzExNjUsNyBAQAogCQl9CiAKIAkJbG1hYysrOwotCQlpZiAobG1hYyA9PSBNQVhfTE1BQ19QRVJfQkdYKSB7CisJCWlmIChsbWFjID09IGJneC0+bWF4X2xtYWMpIHsKIAkJCW9mX25vZGVfcHV0KG5vZGUpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTEwODcsNiArMTIxMCw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKIAlzdHJ1Y3QgYmd4ICpiZ3ggPSBOVUxMOwogCXU4IGxtYWM7CisJdTE2IHNkZXZpZDsKIAogCWJneCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqYmd4KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFiZ3gpCkBAIC0xMTE1LDEwICsxMjM5LDMwIEBACiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uczsKIAl9Ci0JYmd4LT5iZ3hfaWQgPSAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFBDSV9DRkdfUkVHX0JBUl9OVU0pID4+IDI0KSAmIDE7Ci0JYmd4LT5iZ3hfaWQgKz0gbmljX2dldF9ub2RlX2lkKHBkZXYpICogTUFYX0JHWF9QRVJfQ044OFhYOwogCi0JYmd4X3ZuaWNbYmd4LT5iZ3hfaWRdID0gYmd4OworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9ERVZJQ0VfSUQsICZzZGV2aWQpOworCWlmIChzZGV2aWQgIT0gUENJX0RFVklDRV9JRF9USFVOREVSX1JHWCkgeworCQliZ3gtPmJneF9pZCA9CisJCSAgICAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIFBDSV9DRkdfUkVHX0JBUl9OVU0pID4+IDI0KSAmIDE7CisJCWJneC0+Ymd4X2lkICs9IG5pY19nZXRfbm9kZV9pZChwZGV2KSAqIE1BWF9CR1hfUEVSX05PREU7CisJCWJneC0+bWF4X2xtYWMgPSBNQVhfTE1BQ19QRVJfQkdYOworCQliZ3hfdm5pY1tiZ3gtPmJneF9pZF0gPSBiZ3g7CisJfSBlbHNlIHsKKwkJYmd4LT5pc19yZ3ggPSB0cnVlOworCQliZ3gtPm1heF9sbWFjID0gMTsKKwkJYmd4LT5iZ3hfaWQgPSBNQVhfQkdYX1BFUl9DTjgxWFggLSAxOworCQliZ3hfdm5pY1tiZ3gtPmJneF9pZF0gPSBiZ3g7CisJCXhjdl9pbml0X2h3KCk7CisJfQorCisJLyogT24gODF4eCBhbGwgYXJlIERMTXMgYW5kIG9uIDgzeHggdGhlcmUgYXJlIDMgQkdYIFFMTXMgYW5kIG9uZQorCSAqIEJHWCBpLmUgQkdYMiBjYW4gYmUgc3BsaXQgYWNyb3NzIDIgRExNcy4KKwkgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmc2RldmlkKTsKKwlpZiAoKHNkZXZpZCA9PSBQQ0lfU1VCU1lTX0RFVklEXzgxWFhfQkdYKSB8fAorCSAgICAoKHNkZXZpZCA9PSBQQ0lfU1VCU1lTX0RFVklEXzgzWFhfQkdYKSAmJiAoYmd4LT5iZ3hfaWQgPT0gMikpKQorCQliZ3gtPmlzX2RsbSA9IHRydWU7CisKIAliZ3hfZ2V0X3FsbV9tb2RlKGJneCk7CiAKIAllcnIgPSBiZ3hfaW5pdF9waHkoYmd4KTsKQEAgLTExMzMsNiArMTI3Nyw4IEBACiAJCWlmIChlcnIpIHsKIAkJCWRldl9lcnIoZGV2LCAiQkdYJWQgZmFpbGVkIHRvIGVuYWJsZSBsbWFjJWRcbiIsCiAJCQkJYmd4LT5iZ3hfaWQsIGxtYWMpOworCQkJd2hpbGUgKGxtYWMpCisJCQkJYmd4X2xtYWNfZGlzYWJsZShiZ3gsIC0tbG1hYyk7CiAJCQlnb3RvIGVycl9lbmFibGU7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci90aHVuZGVyX2JneC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvdGh1bmRlcl9iZ3guaAppbmRleCA0MjAxMGQyLi5kNTljNzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYXZpdW0vdGh1bmRlci90aHVuZGVyX2JneC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL3RodW5kZXJfYmd4LmgKQEAgLTksOCArOSwyMCBAQAogI2lmbmRlZiBUSFVOREVSX0JHWF9ICiAjZGVmaW5lIFRIVU5ERVJfQkdYX0gKIAotI2RlZmluZSAgICBNQVhfQkdYX1RIVU5ERVIJCQk4IC8qIE1heCA0IG5vZGVzLCAyIHBlciBub2RlICovCisvKiBQQ0kgZGV2aWNlIElEICovCisjZGVmaW5lCVBDSV9ERVZJQ0VfSURfVEhVTkRFUl9CR1gJCTB4QTAyNgorI2RlZmluZQlQQ0lfREVWSUNFX0lEX1RIVU5ERVJfUkdYCQkweEEwNTQKKworLyogU3Vic3lzdGVtIGRldmljZSBJRHMgKi8KKyNkZWZpbmUgUENJX1NVQlNZU19ERVZJRF84OFhYX0JHWAkJMHhBMTI2CisjZGVmaW5lIFBDSV9TVUJTWVNfREVWSURfODFYWF9CR1gJCTB4QTIyNgorI2RlZmluZSBQQ0lfU1VCU1lTX0RFVklEXzgzWFhfQkdYCQkweEEzMjYKKworI2RlZmluZSAgICBNQVhfQkdYX1RIVU5ERVIJCQk4IC8qIE1heCAyIG5vZGVzLCA0IHBlciBub2RlICovCiAjZGVmaW5lICAgIE1BWF9CR1hfUEVSX0NOODhYWAkJCTIKKyNkZWZpbmUgICAgTUFYX0JHWF9QRVJfQ044MVhYCQkJMyAvKiAyIEJHWHMgKyAxIFJHWCAqLworI2RlZmluZSAgICBNQVhfQkdYX1BFUl9DTjgzWFgJCQk0CisjZGVmaW5lICAgIE1BWF9CR1hfUEVSX05PREUJCQk0CiAjZGVmaW5lICAgIE1BWF9MTUFDX1BFUl9CR1gJCQk0CiAjZGVmaW5lICAgIE1BWF9CR1hfQ0hBTlNfUEVSX0xNQUMJCTE2CiAjZGVmaW5lICAgIE1BWF9ETUFDX1BFUl9MTUFDCQkJOApAQCAtMTgsOCArMzAsNiBAQAogCiAjZGVmaW5lICAgIE1BWF9ETUFDX1BFUl9MTUFDX1ROU19CWVBBU1NfTU9ERQkyCiAKLSNkZWZpbmUgICAgTUFYX0xNQUMJKE1BWF9CR1hfUEVSX0NOODhYWCAqIE1BWF9MTUFDX1BFUl9CR1gpCi0KIC8qIFJlZ2lzdGVycyAqLwogI2RlZmluZSBCR1hfQ01SWF9DRkcJCQkweDAwCiAjZGVmaW5lICBDTVJfUEtUX1RYX0VOCQkJCUJJVF9VTEwoMTMpCkBAIC0xMzYsNiArMTQ2LDcgQEAKICNkZWZpbmUgQkdYX0dNUF9QQ1NfQU5YX0FOX1JFU1VMVFMJMHgzMDAyMAogI2RlZmluZSBCR1hfR01QX1BDU19TR01fQU5fQURWCQkweDMwMDY4CiAjZGVmaW5lIEJHWF9HTVBfUENTX01JU0NYX0NUTAkJMHgzMDA3OAorI2RlZmluZSAgUENTX01JU0NfQ1RMX0RJU1BfRU4JCQlCSVRfVUxMKDEzKQogI2RlZmluZSAgUENTX01JU0NfQ1RMX0dNWF9FTk8JCQlCSVRfVUxMKDExKQogI2RlZmluZSAgUENTX01JU0NfQ1RMX1NBTVBfUFRfTUFTSwkweDdGdWxsCiAjZGVmaW5lIEJHWF9HTVBfR01JX1BSVFhfQ0ZHCQkweDM4MDIwCkBAIC0xOTQsNiArMjA1LDkgQEAKIHZvaWQgYmd4X2dldF9sbWFjX2xpbmtfc3RhdGUoaW50IG5vZGUsIGludCBiZ3hfaWR4LCBpbnQgbG1hY2lkLCB2b2lkICpzdGF0dXMpOwogdm9pZCBiZ3hfbG1hY19pbnRlcm5hbF9sb29wYmFjayhpbnQgbm9kZSwgaW50IGJneF9pZHgsCiAJCQkJaW50IGxtYWNfaWR4LCBib29sIGVuYWJsZSk7Cit2b2lkIHhjdl9pbml0X2h3KHZvaWQpOwordm9pZCB4Y3Zfc2V0dXBfbGluayhib29sIGxpbmtfdXAsIGludCBsaW5rX3NwZWVkKTsKKwogdTY0IGJneF9nZXRfcnhfc3RhdHMoaW50IG5vZGUsIGludCBiZ3hfaWR4LCBpbnQgbG1hYywgaW50IGlkeCk7CiB1NjQgYmd4X2dldF90eF9zdGF0cyhpbnQgbm9kZSwgaW50IGJneF9pZHgsIGludCBsbWFjLCBpbnQgaWR4KTsKICNkZWZpbmUgQkdYX1JYX1NUQVRTX0NPVU5UIDExCkBAIC0yMTMsMTYgKzIyNyw5IEBACiAJQkdYX01PREVfWExBVUkgPSA0LCAvKiA0IGxhbmVzLCAxMC4zMTI1IEdiYXVkICovCiAJQkdYX01PREVfMTBHX0tSID0gMywvKiAxIGxhbmUsIDEwLjMxMjUgR2JhdWQgKi8KIAlCR1hfTU9ERV80MEdfS1IgPSA0LC8qIDQgbGFuZXMsIDEwLjMxMjUgR2JhdWQgKi8KLX07Ci0KLWVudW0gcWxtX21vZGUgewotCVFMTV9NT0RFX1NHTUlJLCAgICAgICAgIC8qIFNHTUlJLCBlYWNoIGxhbmUgaW5kZXBlbmRlbnQgKi8KLQlRTE1fTU9ERV9YQVVJXzFYNCwgICAgICAvKiAxIFhBVUkgb3IgRFhBVUksIDQgbGFuZXMgKi8KLQlRTE1fTU9ERV9SWEFVSV8yWDIsICAgICAvKiAyIFJYQVVJLCAyIGxhbmVzIGVhY2ggKi8KLQlRTE1fTU9ERV9YRklfNFgxLCAgICAgICAvKiA0IFhGSSwgMSBsYW5lIGVhY2ggKi8KLQlRTE1fTU9ERV9YTEFVSV8xWDQsICAgICAvKiAxIFhMQVVJLCA0IGxhbmVzIGVhY2ggKi8KLQlRTE1fTU9ERV8xMEdfS1JfNFgxLCAgICAvKiA0IDEwR0JBU0UtS1IsIDEgbGFuZSBlYWNoICovCi0JUUxNX01PREVfNDBHX0tSNF8xWDQsICAgLyogMSA0MEdCQVNFLUtSNCwgNCBsYW5lcyBlYWNoICovCisJQkdYX01PREVfUkdNSUkgPSA1LAorCUJHWF9NT0RFX1FTR01JSSA9IDYsCisJQkdYX01PREVfSU5WQUxJRCA9IDcsCiB9OwogCiAjZW5kaWYgLyogVEhVTkRFUl9CR1hfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2F2aXVtL3RodW5kZXIvdGh1bmRlcl94Y3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL3RodW5kZXJfeGN2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdiZWZlZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Nhdml1bS90aHVuZGVyL3RodW5kZXJfeGN2LmMKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQ2F2aXVtLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9tZGlvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CisKKyNpbmNsdWRlICJuaWMuaCIKKyNpbmNsdWRlICJ0aHVuZGVyX2JneC5oIgorCisjZGVmaW5lIERSVl9OQU1FCSJ0aHVuZGVyLXhjdiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMCIKKworLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBYQ1ZfUkVTRVQJCTB4MDAKKyNkZWZpbmUgICBQT1JUX0VOCQlCSVRfVUxMKDYzKQorI2RlZmluZSAgIENMS19SRVNFVAkJQklUX1VMTCgxNSkKKyNkZWZpbmUgICBETExfUkVTRVQJCUJJVF9VTEwoMTEpCisjZGVmaW5lICAgQ09NUF9FTgkJQklUX1VMTCg3KQorI2RlZmluZSAgIFRYX1BLVF9SRVNFVAkJQklUX1VMTCgzKQorI2RlZmluZSAgIFRYX0RBVEFfUkVTRVQJCUJJVF9VTEwoMikKKyNkZWZpbmUgICBSWF9QS1RfUkVTRVQJCUJJVF9VTEwoMSkKKyNkZWZpbmUgICBSWF9EQVRBX1JFU0VUCQlCSVRfVUxMKDApCisjZGVmaW5lIFhDVl9ETExfQ1RMCQkweDEwCisjZGVmaW5lICAgQ0xLUlhfQllQCQlCSVRfVUxMKDIzKQorI2RlZmluZSAgIENMS1RYX0JZUAkJQklUX1VMTCgxNSkKKyNkZWZpbmUgWENWX0NPTVBfQ1RMCQkweDIwCisjZGVmaW5lICAgRFJWX0JZUAkJQklUX1VMTCg2MykKKyNkZWZpbmUgWENWX0NUTAkJCTB4MzAKKyNkZWZpbmUgWENWX0lOVAkJCTB4NDAKKyNkZWZpbmUgWENWX0lOVF9XMVMJCTB4NDgKKyNkZWZpbmUgWENWX0lOVF9FTkFfVzFDCQkweDUwCisjZGVmaW5lIFhDVl9JTlRfRU5BX1cxUwkJMHg1OAorI2RlZmluZSBYQ1ZfSU5CTkRfU1RBVFVTCTB4ODAKKyNkZWZpbmUgWENWX0JBVENIX0NSRF9SRVQJMHgxMDAKKworc3RydWN0IHhjdiB7CisJdm9pZCBfX2lvbWVtCQkqcmVnX2Jhc2U7CisJc3RydWN0IHBjaV9kZXYJCSpwZGV2OworfTsKKworc3RhdGljIHN0cnVjdCB4Y3YgKnhjdjsKKworLyogU3VwcG9ydGVkIGRldmljZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCB4Y3ZfaWRfdGFibGVbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9DQVZJVU0sIDB4QTA1NikgfSwKKwl7IDAsIH0gIC8qIGVuZCBvZiB0YWJsZSAqLworfTsKKworTU9EVUxFX0FVVEhPUigiQ2F2aXVtIEluYyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDYXZpdW0gVGh1bmRlciBSR1gvWENWIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHhjdl9pZF90YWJsZSk7CisKK3ZvaWQgeGN2X2luaXRfaHcodm9pZCkKK3sKKwl1NjQgIGNmZzsKKworCS8qIFRha2UgRExMIG91dCBvZiByZXNldCAqLworCWNmZyA9IHJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJY2ZnICY9IH5ETExfUkVTRVQ7CisJd3JpdGVxX3JlbGF4ZWQoY2ZnLCB4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKworCS8qIFRha2UgY2xvY2sgdHJlZSBvdXQgb2YgcmVzZXQgKi8KKwljZmcgPSByZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCWNmZyAmPSB+Q0xLX1JFU0VUOworCXdyaXRlcV9yZWxheGVkKGNmZywgeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJLyogV2FpdCBmb3IgRExMIHRvIGxvY2sgKi8KKwltc2xlZXAoMSk7CisKKwkvKiBDb25maWd1cmUgRExMIC0gZW5hYmxlIG9yIGJ5cGFzcworCSAqIFRYIG5vIGJ5cGFzcywgUlggYnlwYXNzCisJICovCisJY2ZnID0gcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX0RMTF9DVEwpOworCWNmZyAmPSB+MHhGRjAzOworCWNmZyB8PSBDTEtSWF9CWVA7CisJd3JpdGVxX3JlbGF4ZWQoY2ZnLCB4Y3YtPnJlZ19iYXNlICsgWENWX0RMTF9DVEwpOworCisJLyogRW5hYmxlIGNvbXBlbnNhdGlvbiBjb250cm9sbGVyIGFuZCBmb3JjZSB0aGUKKwkgKiB3cml0ZSB0byBiZSB2aXNpYmxlIHRvIEhXIGJ5IHJlYWRpZyBiYWNrLgorCSAqLworCWNmZyA9IHJlYWRxX3JlbGF4ZWQoeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisJY2ZnIHw9IENPTVBfRU47CisJd3JpdGVxX3JlbGF4ZWQoY2ZnLCB4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwlyZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCS8qIFdhaXQgZm9yIGNvbXBlbnNhdGlvbiBzdGF0ZSBtYWNoaW5lIHRvIGxvY2sgKi8KKwltc2xlZXAoMTApOworCisJLyogZW5hYmxlIHRoZSBYQ1YgYmxvY2sgKi8KKwljZmcgPSByZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCWNmZyB8PSBQT1JUX0VOOworCXdyaXRlcV9yZWxheGVkKGNmZywgeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisKKwljZmcgPSByZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCWNmZyB8PSBDTEtfUkVTRVQ7CisJd3JpdGVxX3JlbGF4ZWQoY2ZnLCB4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKK30KK0VYUE9SVF9TWU1CT0woeGN2X2luaXRfaHcpOworCit2b2lkIHhjdl9zZXR1cF9saW5rKGJvb2wgbGlua191cCwgaW50IGxpbmtfc3BlZWQpCit7CisJdTY0ICBjZmc7CisJaW50IHNwZWVkID0gMjsKKworCWlmICgheGN2KSB7CisJCWRldl9lcnIoJnhjdi0+cGRldi0+ZGV2LAorCQkJIlhDViBpbml0IG5vdCBkb25lLCBwcm9iZSBtYXkgaGF2ZSBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGxpbmtfc3BlZWQgPT0gMTAwKQorCQlzcGVlZCA9IDE7CisJZWxzZSBpZiAobGlua19zcGVlZCA9PSAxMCkKKwkJc3BlZWQgPSAwOworCisJaWYgKGxpbmtfdXApIHsKKwkJLyogc2V0IG9wZXJhdGluZyBzcGVlZCAqLworCQljZmcgPSByZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfQ1RMKTsKKwkJY2ZnICY9IH4weDAzOworCQljZmcgfD0gc3BlZWQ7CisJCXdyaXRlcV9yZWxheGVkKGNmZywgeGN2LT5yZWdfYmFzZSArIFhDVl9DVEwpOworCisJCS8qIFJlc2V0IGRhdGFwYXRocyAqLworCQljZmcgPSByZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCQljZmcgfD0gVFhfREFUQV9SRVNFVCB8IFJYX0RBVEFfUkVTRVQ7CisJCXdyaXRlcV9yZWxheGVkKGNmZywgeGN2LT5yZWdfYmFzZSArIFhDVl9SRVNFVCk7CisKKwkJLyogRW5hYmxlIHRoZSBwYWNrZXQgZmxvdyAqLworCQljZmcgPSByZWFkcV9yZWxheGVkKHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCQljZmcgfD0gVFhfUEtUX1JFU0VUIHwgUlhfUEtUX1JFU0VUOworCQl3cml0ZXFfcmVsYXhlZChjZmcsIHhjdi0+cmVnX2Jhc2UgKyBYQ1ZfUkVTRVQpOworCisJCS8qIFJldHVybiBjcmVkaXRzIHRvIFJHWCAqLworCQl3cml0ZXFfcmVsYXhlZCgweDAxLCB4Y3YtPnJlZ19iYXNlICsgWENWX0JBVENIX0NSRF9SRVQpOworCX0gZWxzZSB7CisJCS8qIERpc2FibGUgcGFja2V0IGZsb3cgKi8KKwkJY2ZnID0gcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwkJY2ZnICY9IH4oVFhfUEtUX1JFU0VUIHwgUlhfUEtUX1JFU0VUKTsKKwkJd3JpdGVxX3JlbGF4ZWQoY2ZnLCB4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwkJcmVhZHFfcmVsYXhlZCh4Y3YtPnJlZ19iYXNlICsgWENWX1JFU0VUKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHhjdl9zZXR1cF9saW5rKTsKKworc3RhdGljIGludCB4Y3ZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCisJeGN2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCB4Y3YpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXhjdikKKwkJcmV0dXJuIC1FTk9NRU07CisJeGN2LT5wZGV2ID0gcGRldjsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCB4Y3YpOworCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZVxuIik7CisJCWdvdG8gZXJyX2tmcmVlOworCX0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJQQ0kgcmVxdWVzdCByZWdpb25zIGZhaWxlZCAweCV4XG4iLCBlcnIpOworCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKKwl9CisKKwkvKiBNQVAgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKwl4Y3YtPnJlZ19iYXNlID0gcGNpbV9pb21hcChwZGV2LCBQQ0lfQ0ZHX1JFR19CQVJfTlVNLCAwKTsKKwlpZiAoIXhjdi0+cmVnX2Jhc2UpIHsKKwkJZGV2X2VycihkZXYsICJYQ1Y6IENhbm5vdCBtYXAgQ1NSIG1lbW9yeSBzcGFjZSwgYWJvcnRpbmdcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9yZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9yZWxlYXNlX3JlZ2lvbnM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9kaXNhYmxlX2RldmljZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfa2ZyZWU6CisJZGV2bV9rZnJlZShkZXYsIHhjdik7CisJeGN2ID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB4Y3ZfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisKKwlpZiAoeGN2KSB7CisJCWRldm1fa2ZyZWUoZGV2LCB4Y3YpOworCQl4Y3YgPSBOVUxMOworCX0KKworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgeGN2X2RyaXZlciA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAorCS5pZF90YWJsZSA9IHhjdl9pZF90YWJsZSwKKwkucHJvYmUgPSB4Y3ZfcHJvYmUsCisJLnJlbW92ZSA9IHhjdl9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB4Y3ZfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcl9pbmZvKCIlcywgdmVyICVzXG4iLCBEUlZfTkFNRSwgRFJWX1ZFUlNJT04pOworCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnhjdl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgeGN2X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ4Y3ZfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoeGN2X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHhjdl9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9NYWtlZmlsZQppbmRleCBhY2UwYWI5Li5jNmI3MWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAKIG9iai0kKENPTkZJR19DSEVMU0lPX1Q0KSArPSBjeGdiNC5vCiAKLWN4Z2I0LW9ianMgOj0gY3hnYjRfbWFpbi5vIGwydC5vIHQ0X2h3Lm8gc2dlLm8gY2xpcF90YmwubyBjeGdiNF9ldGh0b29sLm8KK2N4Z2I0LW9ianMgOj0gY3hnYjRfbWFpbi5vIGwydC5vIHQ0X2h3Lm8gc2dlLm8gY2xpcF90YmwubyBjeGdiNF9ldGh0b29sLm8gY3hnYjRfdWxkLm8gc2NoZWQubyBjeGdiNF9maWx0ZXIubyBjeGdiNF90Y191MzIubwogY3hnYjQtJChDT05GSUdfQ0hFTFNJT19UNF9EQ0IpICs9ICBjeGdiNF9kY2IubwogY3hnYjQtJChDT05GSUdfQ0hFTFNJT19UNF9GQ09FKSArPSAgY3hnYjRfZmNvZS5vCiBjeGdiNC0kKENPTkZJR19ERUJVR19GUykgKz0gY3hnYjRfZGVidWdmcy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0LmgKaW5kZXggMmUyYWE5Zi4uMjhlNjUzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjQuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtNTMsNiArNTMsOCBAQAogI2luY2x1ZGUgImN4Z2I0X3VsZC5oIgogCiAjZGVmaW5lIENIX1dBUk4oYWRhcCwgZm10LCAuLi4pIGRldl93YXJuKGFkYXAtPnBkZXZfZGV2LCBmbXQsICMjIF9fVkFfQVJHU19fKQorZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYWRhcHRlcl9saXN0OworZXh0ZXJuIHN0cnVjdCBtdXRleCB1bGRfbXV0ZXg7CiAKIGVudW0gewogCU1BWF9OUE9SVFMJPSA0LCAgICAgLyogbWF4ICMgb2YgcG9ydHMgKi8KQEAgLTMzOCwxMiArMzQwLDE0IEBACiAJZW51bSBjaGlwX3R5cGUgY2hpcDsgICAgICAgICAgICAgICAvKiBjaGlwIGNvZGUgKi8KIAlzdHJ1Y3QgYXJjaF9zcGVjaWZpY19wYXJhbXMgYXJjaDsgIC8qIGNoaXAgc3BlY2lmaWMgcGFyYW1zICovCiAJdW5zaWduZWQgY2hhciBvZmZsb2FkOworCXVuc2lnbmVkIGNoYXIgY3J5cHRvOwkJLyogSFcgY2FwYWJpbGl0eSBmb3IgY3J5cHRvICovCiAKIAl1bnNpZ25lZCBjaGFyIGJ5cGFzczsKIAogCXVuc2lnbmVkIGludCBvZmxkcV93cl9jcmVkOwogCWJvb2wgdWxwdHhfbWVtd3JpdGVfZHNnbDsgICAgICAgICAgLyogdXNlIG9mIFQ1IERTR0wgYWxsb3dlZCAqLwogCisJdW5zaWduZWQgaW50IG5zY2hlZF9jbHM7ICAgICAgICAgIC8qIG51bWJlciBvZiB0cmFmZmljIGNsYXNzZXMgKi8KIAl1bnNpZ25lZCBpbnQgbWF4X29yZGlyZF9xcDsgICAgICAgLyogTWF4IHJlYWQgZGVwdGggcGVyIFJETUEgUVAgKi8KIAl1bnNpZ25lZCBpbnQgbWF4X2lyZF9hZGFwdGVyOyAgICAgLyogTWF4IHJlYWQgZGVwdGggcGVyIGFkYXB0ZXIgKi8KIH07CkBAIC00MDMsNyArNDA3LDYgQEAKIAlzdHJ1Y3QgZndfaGRyIGZ3X2hkcjsKIH07CiAKLQogc3RydWN0IHRyYWNlX3BhcmFtcyB7CiAJdTMyIGRhdGFbVFJBQ0VfTEVOIC8gNF07CiAJdTMyIG1hc2tbVFJBQ0VfTEVOIC8gNF07CkBAIC00MTksOCArNDIyLDggQEAKIAl1bnNpZ25lZCBzaG9ydCBzdXBwb3J0ZWQ7ICAgICAgICAvKiBsaW5rIGNhcGFiaWxpdGllcyAqLwogCXVuc2lnbmVkIHNob3J0IGFkdmVydGlzaW5nOyAgICAgIC8qIGFkdmVydGlzZWQgY2FwYWJpbGl0aWVzICovCiAJdW5zaWduZWQgc2hvcnQgbHBfYWR2ZXJ0aXNpbmc7ICAgLyogcGVlciBhZHZlcnRpc2VkIGNhcGFiaWxpdGllcyAqLwotCXVuc2lnbmVkIHNob3J0IHJlcXVlc3RlZF9zcGVlZDsgIC8qIHNwZWVkIHVzZXIgaGFzIHJlcXVlc3RlZCAqLwotCXVuc2lnbmVkIHNob3J0IHNwZWVkOyAgICAgICAgICAgIC8qIGFjdHVhbCBsaW5rIHNwZWVkICovCisJdW5zaWduZWQgaW50ICAgcmVxdWVzdGVkX3NwZWVkOyAgLyogc3BlZWQgdXNlciBoYXMgcmVxdWVzdGVkICovCisJdW5zaWduZWQgaW50ICAgc3BlZWQ7ICAgICAgICAgICAgLyogYWN0dWFsIGxpbmsgc3BlZWQgKi8KIAl1bnNpZ25lZCBjaGFyICByZXF1ZXN0ZWRfZmM7ICAgICAvKiBmbG93IGNvbnRyb2wgdXNlciBoYXMgcmVxdWVzdGVkICovCiAJdW5zaWduZWQgY2hhciAgZmM7ICAgICAgICAgICAgICAgLyogYWN0dWFsIGxpbmsgZmxvdyBjb250cm9sICovCiAJdW5zaWduZWQgY2hhciAgYXV0b25lZzsgICAgICAgICAgLyogYXV0b25lZ290aWF0aW5nPyAqLwpAQCAtNDM0LDExICs0MzcsNiBAQAogCU1BWF9FVEhfUVNFVFMgPSAzMiwgICAgICAgICAgIC8qICMgb2YgRXRoZXJuZXQgVHgvUnggcXVldWUgc2V0cyAqLwogCU1BWF9PRkxEX1FTRVRTID0gMTYsICAgICAgICAgIC8qICMgb2Ygb2ZmbG9hZCBUeCwgaXNjc2kgUnggcXVldWUgc2V0cyAqLwogCU1BWF9DVFJMX1FVRVVFUyA9IE5DSEFOLCAgICAgIC8qICMgb2YgY29udHJvbCBUeCBxdWV1ZXMgKi8KLQlNQVhfUkRNQV9RVUVVRVMgPSBOQ0hBTiwgICAgICAvKiAjIG9mIHN0cmVhbWluZyBSRE1BIFJ4IHF1ZXVlcyAqLwotCU1BWF9SRE1BX0NJUVMgPSAzMiwgICAgICAgIC8qICMgb2YgIFJETUEgY29uY2VudHJhdG9yIElRcyAqLwotCi0JLyogIyBvZiBzdHJlYW1pbmcgaVNDU0lUIFJ4IHF1ZXVlcyAqLwotCU1BWF9JU0NTSVRfUVVFVUVTID0gTUFYX09GTERfUVNFVFMsCiB9OwogCiBlbnVtIHsKQEAgLTQ1NSw4ICs0NTMsNyBAQAogZW51bSB7CiAJSU5HUV9FWFRSQVMgPSAyLCAgICAgICAgLyogZmlybXdhcmUgZXZlbnQgcXVldWUgYW5kICovCiAJCQkJLyogICBmb3J3YXJkZWQgaW50ZXJydXB0cyAqLwotCU1BWF9JTkdRID0gTUFYX0VUSF9RU0VUUyArIE1BWF9PRkxEX1FTRVRTICsgTUFYX1JETUFfUVVFVUVTICsKLQkJICAgTUFYX1JETUFfQ0lRUyArIE1BWF9JU0NTSVRfUVVFVUVTICsgSU5HUV9FWFRSQVMsCisJTUFYX0lOR1EgPSBNQVhfRVRIX1FTRVRTICsgSU5HUV9FWFRSQVMsCiB9OwogCiBzdHJ1Y3QgYWRhcHRlcjsKQEAgLTQ5Myw2ICs0OTAsNyBAQAogI2VuZGlmIC8qIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UgKi8KIAlib29sIHJ4dHN0YW1wOyAgLyogRW5hYmxlIFRTICovCiAJc3RydWN0IGh3dHN0YW1wX2NvbmZpZyB0c3RhbXBfY29uZmlnOworCXN0cnVjdCBzY2hlZF90YWJsZSAqc2NoZWRfdGJsOwogfTsKIAogc3RydWN0IGRlbnRyeTsKQEAgLTUxMCw2ICs1MDgsMTAgQEAKIAlGV19PRkxEX0NPTk4gICAgICAgPSAoMSA8PCA5KSwKIH07CiAKK2VudW0geworCVVMUF9DUllQVE9fTE9PS0FTSURFID0gMSA8PCAwLAorfTsKKwogc3RydWN0IHJ4X3N3X2Rlc2M7CiAKIHN0cnVjdCBzZ2VfZmwgeyAgICAgICAgICAgICAgICAgICAgIC8qIFNHRSBmcmVlLWJ1ZmZlciBxdWV1ZSBzdGF0ZSAqLwpAQCAtNjgwLDE3ICs2ODIsMjQgQEAKIAl1OCBmdWxsOyAgICAgICAgICAgICAgICAgICAgLyogdGhlIFR4IHJpbmcgaXMgZnVsbCAqLwogfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCitzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyB7CisJY2hhciBuYW1lW0lGTkFNU0laXTsJLyogbmFtZSBvZiBVTEQgZHJpdmVyICovCisJc3RydWN0IHNnZV9vZmxkX3J4cSAqdWxkcnhxOyAvKiBSeHEncyBmb3IgVUxEICovCisJdTE2ICptc2l4X3RibDsJCS8qIG1zaXhfdGJsIGZvciB1bGQgKi8KKwl1MTYgKnJzcHFfaWQ7CQkvKiByZXNwb25zZSBxdWV1ZSBpZCdzIG9mIHJ4cSAqLworCXUxNiBucnhxOwkJLyogIyBvZiBpbmdyZXNzIHVsZCBxdWV1ZXMgKi8KKwl1MTYgbmNpcTsJCS8qICMgb2YgY29tcGxldGlvbiBxdWV1ZXMgKi8KKwl1OCB1bGQ7CQkJLyogdWxkIHR5cGUgKi8KK307CisKIHN0cnVjdCBzZ2UgewogCXN0cnVjdCBzZ2VfZXRoX3R4cSBldGh0eHFbTUFYX0VUSF9RU0VUU107CiAJc3RydWN0IHNnZV9vZmxkX3R4cSBvZmxkdHhxW01BWF9PRkxEX1FTRVRTXTsKIAlzdHJ1Y3Qgc2dlX2N0cmxfdHhxIGN0cmxxW01BWF9DVFJMX1FVRVVFU107CiAKIAlzdHJ1Y3Qgc2dlX2V0aF9yeHEgZXRocnhxW01BWF9FVEhfUVNFVFNdOwotCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgaXNjc2lyeHFbTUFYX09GTERfUVNFVFNdOwotCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgaXNjc2l0cnhxW01BWF9JU0NTSVRfUVVFVUVTXTsKLQlzdHJ1Y3Qgc2dlX29mbGRfcnhxIHJkbWFyeHFbTUFYX1JETUFfUVVFVUVTXTsKLQlzdHJ1Y3Qgc2dlX29mbGRfcnhxIHJkbWFjaXFbTUFYX1JETUFfQ0lRU107CiAJc3RydWN0IHNnZV9yc3BxIGZ3X2V2dHEgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqKnVsZF9yeHFfaW5mbzsKIAogCXN0cnVjdCBzZ2VfcnNwcSBpbnRycSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCXNwaW5sb2NrX3QgaW50cnFfbG9jazsKQEAgLTY5OCwxNCArNzA3LDggQEAKIAl1MTYgbWF4X2V0aHFzZXRzOyAgICAgICAgICAgLyogIyBvZiBhdmFpbGFibGUgRXRoZXJuZXQgcXVldWUgc2V0cyAqLwogCXUxNiBldGhxc2V0czsgICAgICAgICAgICAgICAvKiAjIG9mIGFjdGl2ZSBFdGhlcm5ldCBxdWV1ZSBzZXRzICovCiAJdTE2IGV0aHR4cV9yb3ZlcjsgICAgICAgICAgIC8qIFR4IHF1ZXVlIHRvIGNsZWFuIHVwIG5leHQgKi8KLQl1MTYgaXNjc2lxc2V0czsgICAgICAgICAgICAgIC8qICMgb2YgYWN0aXZlIGlTQ1NJIHF1ZXVlIHNldHMgKi8KLQl1MTYgbmlzY3NpdHE7ICAgICAgICAgICAgICAgLyogIyBvZiBhdmFpbGFibGUgaVNDU1QgUnggcXVldWVzICovCi0JdTE2IHJkbWFxczsgICAgICAgICAgICAgICAgIC8qICMgb2YgYXZhaWxhYmxlIFJETUEgUnggcXVldWVzICovCi0JdTE2IHJkbWFjaXFzOyAgICAgICAgICAgICAgIC8qICMgb2YgYXZhaWxhYmxlIFJETUEgY29uY2VudHJhdG9yIElRcyAqLwotCXUxNiBpc2NzaV9yeHFbTUFYX09GTERfUVNFVFNdOwotCXUxNiBpc2NzaXRfcnhxW01BWF9JU0NTSVRfUVVFVUVTXTsKLQl1MTYgcmRtYV9yeHFbTUFYX1JETUFfUVVFVUVTXTsKLQl1MTYgcmRtYV9jaXFbTUFYX1JETUFfQ0lRU107CisJdTE2IG9mbGRxc2V0czsgICAgICAgICAgICAgIC8qICMgb2YgYWN0aXZlIG9mbGQgcXVldWUgc2V0cyAqLworCXUxNiBucXNfcGVyX3VsZDsJICAgIC8qICMgb2YgUnggcXVldWVzIHBlciBVTEQgKi8KIAl1MTYgdGltZXJfdmFsW1NHRV9OVElNRVJTXTsKIAl1OCBjb3VudGVyX3ZhbFtTR0VfTkNPVU5URVJTXTsKIAl1MzIgZmxfcGdfb3JkZXI7ICAgICAgICAgICAgLyogbGFyZ2UgcGFnZSBhbGxvY2F0aW9uIHNpemUgKi8KQEAgLTcyOSwxMCArNzMyLDcgQEAKIH07CiAKICNkZWZpbmUgZm9yX2VhY2hfZXRocnhxKHNnZSwgaSkgZm9yIChpID0gMDsgaSA8IChzZ2UpLT5ldGhxc2V0czsgaSsrKQotI2RlZmluZSBmb3JfZWFjaF9pc2NzaXJ4cShzZ2UsIGkpIGZvciAoaSA9IDA7IGkgPCAoc2dlKS0+aXNjc2lxc2V0czsgaSsrKQotI2RlZmluZSBmb3JfZWFjaF9pc2NzaXRyeHEoc2dlLCBpKSBmb3IgKGkgPSAwOyBpIDwgKHNnZSktPm5pc2NzaXRxOyBpKyspCi0jZGVmaW5lIGZvcl9lYWNoX3JkbWFyeHEoc2dlLCBpKSBmb3IgKGkgPSAwOyBpIDwgKHNnZSktPnJkbWFxczsgaSsrKQotI2RlZmluZSBmb3JfZWFjaF9yZG1hY2lxKHNnZSwgaSkgZm9yIChpID0gMDsgaSA8IChzZ2UpLT5yZG1hY2lxczsgaSsrKQorI2RlZmluZSBmb3JfZWFjaF9vZmxkdHhxKHNnZSwgaSkgZm9yIChpID0gMDsgaSA8IChzZ2UpLT5vZmxkcXNldHM7IGkrKykKIAogc3RydWN0IGwydF9kYXRhOwogCkBAIC03NTcsNiArNzU3LDIzIEBACiAJdTggYWRkcltFVEhfQUxFTl07CiB9OwogCitzdHJ1Y3QgdWxkX21zaXhfYm1hcCB7CisJdW5zaWduZWQgbG9uZyAqbXNpeF9ibWFwOworCXVuc2lnbmVkIGludCBtYXBzaXplOworCXNwaW5sb2NrX3QgbG9jazsgLyogbG9jayBmb3IgYWNxdWlyaW5nIGJpdG1hcCAqLworfTsKKworc3RydWN0IHVsZF9tc2l4X2luZm8geworCXVuc2lnbmVkIHNob3J0IHZlYzsKKwljaGFyIGRlc2NbSUZOQU1TSVogKyAxMF07CisJdW5zaWduZWQgaW50IGlkeDsKK307CisKK3N0cnVjdCB2Zl9pbmZvIHsKKwl1bnNpZ25lZCBjaGFyIHZmX21hY19hZGRyW0VUSF9BTEVOXTsKKwlib29sIHBmX3NldF9tYWM7Cit9OworCiBzdHJ1Y3QgYWRhcHRlciB7CiAJdm9pZCBfX2lvbWVtICpyZWdzOwogCXZvaWQgX19pb21lbSAqYmFyMjsKQEAgLTc2Nyw2ICs3ODQsNyBAQAogCXVuc2lnbmVkIGludCBtYm94OwogCXVuc2lnbmVkIGludCBwZjsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGFkYXBfaWR4OwogCWVudW0gY2hpcF90eXBlIGNoaXA7CiAKIAlpbnQgbXNnX2VuYWJsZTsKQEAgLTc3OSw2ICs3OTcsOSBAQAogCQl1bnNpZ25lZCBzaG9ydCB2ZWM7CiAJCWNoYXIgZGVzY1tJRk5BTVNJWiArIDEwXTsKIAl9IG1zaXhfaW5mb1tNQVhfSU5HUSArIDFdOworCXN0cnVjdCB1bGRfbXNpeF9pbmZvICptc2l4X2luZm9fdWxkczsgLyogbXNpeCBpbmZvIGZvciB1bGQncyAqLworCXN0cnVjdCB1bGRfbXNpeF9ibWFwIG1zaXhfYm1hcF91bGRzOyAvKiBtc2l4IGJpdG1hcCBmb3IgYWxsIHVsZCAqLworCWludCBtc2lfaWR4OwogCiAJc3RydWN0IGRvb3JiZWxsX3N0YXRzIGRiX3N0YXRzOwogCXN0cnVjdCBzZ2Ugc2dlOwpAQCAtNzg2LDYgKzgwNyw5IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKnBvcnRbTUFYX05QT1JUU107CiAJdTggY2hhbl9tYXBbTkNIQU5dOyAgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIC0+IHBvcnQgbWFwICovCiAKKwlzdHJ1Y3QgdmZfaW5mbyAqdmZpbmZvOworCXU4IG51bV92ZnM7CisKIAl1MzIgZmlsdGVyX21vZGU7CiAJdW5zaWduZWQgaW50IGwydF9zdGFydDsKIAl1bnNpZ25lZCBpbnQgbDJ0X2VuZDsKQEAgLTc5Myw3ICs4MTcsMTAgQEAKIAl1bnNpZ25lZCBpbnQgY2xpcHRfc3RhcnQ7CiAJdW5zaWduZWQgaW50IGNsaXB0X2VuZDsKIAlzdHJ1Y3QgY2xpcF90YmwgKmNsaXB0OworCXN0cnVjdCBjeGdiNF91bGRfaW5mbyAqdWxkOwogCXZvaWQgKnVsZF9oYW5kbGVbQ1hHQjRfVUxEX01BWF07CisJdW5zaWduZWQgaW50IG51bV91bGQ7CisJdW5zaWduZWQgaW50IG51bV9vZmxkX3VsZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Rfbm9kZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHJjdV9ub2RlOwogCXN0cnVjdCBsaXN0X2hlYWQgbWFjX2hsaXN0OyAvKiBsaXN0IG9mIE1BQyBhZGRyZXNzZXMgaW4gTVBTIEhhc2ggKi8KQEAgLTgxMyw2ICs4NDAsOCBAQAogI2RlZmluZSBUNF9PU19MT0dfTUJPWF9DTURTIDI1NgogCXN0cnVjdCBtYm94X2NtZF9sb2cgKm1ib3hfbG9nOwogCisJc3RydWN0IG11dGV4IHVsZF9tdXRleDsKKwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcm9vdDsKIAlib29sIHVzZV9iZDsgICAgIC8qIFVzZSBTR0UgQmFjayBEb29yIGludGZjIGZvciByZWFkaW5nIFNHRSBDb250ZXh0cyAqLwogCWJvb2wgdHJhY2VfcnNzOwkvKiAxIGltcGxpZXMgdGhhdCBkaWZmZXJlbnQgUlNTIGZsaXQgcGVyIGZpbHRlciBpcwpAQCAtODIyLDYgKzg1MSw1OCBAQAogCiAJc3BpbmxvY2tfdCBzdGF0c19sb2NrOwogCXNwaW5sb2NrX3Qgd2luMF9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisKKwkvKiBUQyB1MzIgb2ZmbG9hZCAqLworCXN0cnVjdCBjeGdiNF90Y191MzJfdGFibGUgKnRjX3UzMjsKK307CisKKy8qIFN1cHBvcnQgZm9yICJzY2hlZC1jbGFzcyIgY29tbWFuZCB0byBhbGxvdyBhIFRYIFNjaGVkdWxpbmcgQ2xhc3MgdG8gYmUKKyAqIHByb2dyYW1tZWQgd2l0aCB2YXJpb3VzIHBhcmFtZXRlcnMuCisgKi8KK3N0cnVjdCBjaF9zY2hlZF9wYXJhbXMgeworCXM4ICAgdHlwZTsgICAgICAgICAgICAgICAgICAgICAvKiBwYWNrZXQgb3IgZmxvdyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXM4ICAgbGV2ZWw7ICAgIC8qIHNjaGVkdWxlciBoaWVyYXJjaHkgbGV2ZWwgKi8KKwkJCXM4ICAgbW9kZTsgICAgIC8qIHBlci1jbGFzcyBvciBwZXItZmxvdyAqLworCQkJczggICByYXRldW5pdDsgLyogYml0IG9yIHBhY2tldCByYXRlICovCisJCQlzOCAgIHJhdGVtb2RlOyAvKiAlcG9ydCByZWxhdGl2ZSBvciBrYnBzIGFic29sdXRlICovCisJCQlzOCAgIGNoYW5uZWw7ICAvKiBzY2hlZHVsZXIgY2hhbm5lbCBbMC4uTl0gKi8KKwkJCXM4ICAgY2xhc3M7ICAgIC8qIHNjaGVkdWxlciBjbGFzcyBbMC4uTl0gKi8KKwkJCXMzMiAgbWlucmF0ZTsgIC8qIG1pbmltdW0gcmF0ZSAqLworCQkJczMyICBtYXhyYXRlOyAgLyogbWF4aW11bSByYXRlICovCisJCQlzMTYgIHdlaWdodDsgICAvKiBwZXJjZW50IHdlaWdodCAqLworCQkJczE2ICBwa3RzaXplOyAgLyogYXZlcmFnZSBwYWNrZXQgc2l6ZSAqLworCQl9IHBhcmFtczsKKwl9IHU7Cit9OworCitlbnVtIHsKKwlTQ0hFRF9DTEFTU19UWVBFX1BBQ0tFVCA9IDAsICAgIC8qIGNsYXNzIHR5cGUgKi8KK307CisKK2VudW0geworCVNDSEVEX0NMQVNTX0xFVkVMX0NMX1JMID0gMCwgICAgLyogY2xhc3MgcmF0ZSBsaW1pdGVyICovCit9OworCitlbnVtIHsKKwlTQ0hFRF9DTEFTU19NT0RFX0NMQVNTID0gMCwgICAgIC8qIHBlci1jbGFzcyBzY2hlZHVsaW5nICovCit9OworCitlbnVtIHsKKwlTQ0hFRF9DTEFTU19SQVRFVU5JVF9CSVRTID0gMCwgIC8qIGJpdCByYXRlIHNjaGVkdWxpbmcgKi8KK307CisKK2VudW0geworCVNDSEVEX0NMQVNTX1JBVEVNT0RFX0FCUyA9IDEsICAgLyogS2IvcyAqLworfTsKKworLyogU3VwcG9ydCBmb3IgInNjaGVkX3F1ZXVlIiBjb21tYW5kIHRvIGFsbG93IG9uZSBvciBtb3JlIE5JQyBUWCBRdWV1ZXMKKyAqIHRvIGJlIGJvdW5kIHRvIGEgVFggU2NoZWR1bGluZyBDbGFzcy4KKyAqLworc3RydWN0IGNoX3NjaGVkX3F1ZXVlIHsKKwlzOCAgIHF1ZXVlOyAgICAvKiBxdWV1ZSBpbmRleCAqLworCXM4ICAgY2xhc3M7ICAgIC8qIGNsYXNzIGluZGV4ICovCiB9OwogCiAvKiBEZWZpbmVkIGJpdCB3aWR0aCBvZiB1c2VyIGRlZmluYWJsZSBmaWx0ZXIgdHVwbGVzCkBAIC05NDcsMTEgKzEwMjgsNDcgQEAKIAlWTEFOX1JFV1JJVEUKIH07CiAKKy8qIEhvc3Qgc2hhZG93IGNvcHkgb2YgaW5ncmVzcyBmaWx0ZXIgZW50cnkuICBUaGlzIGlzIGluIGhvc3QgbmF0aXZlIGZvcm1hdAorICogYW5kIGRvZXNuJ3QgbWF0Y2ggdGhlIG9yZGVyaW5nIG9yIGJpdCBvcmRlciwgZXRjLiBvZiB0aGUgaGFyZHdhcmUgb2YgdGhlCisgKiBmaXJtd2FyZSBjb21tYW5kLiAgVGhlIHVzZSBvZiBiaXQtZmllbGQgc3RydWN0dXJlIGVsZW1lbnRzIGlzIHB1cmVseSB0bworICogcmVtaW5kIG91cnNlbHZlcyBvZiB0aGUgZmllbGQgc2l6ZSBsaW1pdGF0aW9ucyBhbmQgc2F2ZSBtZW1vcnkgaW4gdGhlIGNhc2UKKyAqIHdoZXJlIHRoZSBmaWx0ZXIgdGFibGUgaXMgbGFyZ2UuCisgKi8KK3N0cnVjdCBmaWx0ZXJfZW50cnkgeworCS8qIEFkbWluaXN0cmF0aXZlIGZpZWxkcyBmb3IgZmlsdGVyLiAqLworCXUzMiB2YWxpZDoxOyAgICAgICAgICAgIC8qIGZpbHRlciBhbGxvY2F0ZWQgYW5kIHZhbGlkICovCisJdTMyIGxvY2tlZDoxOyAgICAgICAgICAgLyogZmlsdGVyIGlzIGFkbWluaXN0cmF0aXZlbHkgbG9ja2VkICovCisKKwl1MzIgcGVuZGluZzoxOyAgICAgICAgICAvKiBmaWx0ZXIgYWN0aW9uIGlzIHBlbmRpbmcgZmlybXdhcmUgcmVwbHkgKi8KKwl1MzIgc210aWR4Ojg7ICAgICAgICAgICAvKiBTb3VyY2UgTUFDIFRhYmxlIGluZGV4IGZvciBzbWFjICovCisJc3RydWN0IGZpbHRlcl9jdHggKmN0eDsgLyogQ2FsbGVyJ3MgY29tcGxldGlvbiBob29rICovCisJc3RydWN0IGwydF9lbnRyeSAqbDJ0OyAgLyogTGF5ZXIgVHdvIFRhYmxlIGVudHJ5IGZvciBkbWFjICovCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsgLyogQXNzb2NpYXRlZCBuZXQgZGV2aWNlICovCisJdTMyIHRpZDsgICAgICAgICAgICAgICAgLyogVGhpcyB3aWxsIHN0b3JlIHRoZSBhY3R1YWwgdGlkICovCisKKwkvKiBUaGUgZmlsdGVyIGl0c2VsZi4gIE1vc3Qgb2YgdGhpcyBpcyBhIHN0cmFpZ2h0IGNvcHkgb2YgaW5mb3JtYXRpb24KKwkgKiBwcm92aWRlZCBieSB0aGUgZXh0ZW5kZWQgaW9jdGwoKS4gIFNvbWUgZmllbGRzIGFyZSB0cmFuc2xhdGVkIHRvCisJICogaW50ZXJuYWwgZm9ybXMgLS0gZm9yIGluc3RhbmNlIHRoZSBJbmdyZXNzIFF1ZXVlIElEIHBhc3NlZCBpbiBmcm9tCisJICogdGhlIGlvY3RsKCkgaXMgdHJhbnNsYXRlZCBpbnRvIHRoZSBBYnNvbHV0ZSBJbmdyZXNzIFF1ZXVlIElELgorCSAqLworCXN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiBmczsKK307CisKIHN0YXRpYyBpbmxpbmUgaW50IGlzX29mZmxvYWQoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXApCiB7CiAJcmV0dXJuIGFkYXAtPnBhcmFtcy5vZmZsb2FkOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpc19wY2lfdWxkKGNvbnN0IHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXJldHVybiBhZGFwLT5wYXJhbXMuY3J5cHRvOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc191bGQoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIChhZGFwLT5wYXJhbXMub2ZmbG9hZCB8fCBhZGFwLT5wYXJhbXMuY3J5cHRvKTsKK30KKwogc3RhdGljIGlubGluZSB1MzIgdDRfcmVhZF9yZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHUzMiByZWdfYWRkcikKIHsKIAlyZXR1cm4gcmVhZGwoYWRhcC0+cmVncyArIHJlZ19hZGRyKTsKQEAgLTExNzgsNiArMTI5NSw4IEBACiBpbnQgdDRfc2dlX2FsbG9jX2N0cmxfdHhxKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX2N0cmxfdHhxICp0eHEsCiAJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpcWlkLAogCQkJICB1bnNpZ25lZCBpbnQgY21wbHFpZCk7CitpbnQgdDRfc2dlX21vZF9jdHJsX3R4cShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IGVxaWQsCisJCQl1bnNpZ25lZCBpbnQgY21wbHFpZCk7CiBpbnQgdDRfc2dlX2FsbG9jX29mbGRfdHhxKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX29mbGRfdHhxICp0eHEsCiAJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBpcWlkKTsKIGlycXJldHVybl90IHQ0X3NnZV9pbnRyX21zaXgoaW50IGlycSwgdm9pZCAqY29va2llKTsKQEAgLTExODUsOCArMTMwNCw2IEBACiB2b2lkIHQ0X3NnZV9zdGFydChzdHJ1Y3QgYWRhcHRlciAqYWRhcCk7CiB2b2lkIHQ0X3NnZV9zdG9wKHN0cnVjdCBhZGFwdGVyICphZGFwKTsKIGludCBjeGdiX2J1c3lfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGkpOwotaW50IGN4Z2I0X3NldF9yc3BxX2ludHJfcGFyYW1zKHN0cnVjdCBzZ2VfcnNwcSAqcSwgdW5zaWduZWQgaW50IHVzLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBjbnQpOwogdm9pZCBjeGdiNF9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBpbnQgY3hnYjRfd3JpdGVfcnNzKGNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpLCBjb25zdCB1MTYgKnF1ZXVlcyk7CiBleHRlcm4gaW50IGRiZmlmb19pbnRfdGhyZXNoOwpAQCAtMTI4OSw2ICsxNDA2LDE4IEBACiAJcmV0dXJuIGEgJiAweDNmOwogfQogCitpbnQgY3hnYjRfc2V0X3JzcHFfaW50cl9wYXJhbXMoc3RydWN0IHNnZV9yc3BxICpxLCB1bnNpZ25lZCBpbnQgdXMsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNudCk7CitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9yc3BxKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX3JzcHEgKnEsCisJCQkgICAgIHVuc2lnbmVkIGludCB1cywgdW5zaWduZWQgaW50IGNudCwKKwkJCSAgICAgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBpcWVfc2l6ZSkKK3sKKwlxLT5hZGFwID0gYWRhcDsKKwljeGdiNF9zZXRfcnNwcV9pbnRyX3BhcmFtcyhxLCB1cywgY250KTsKKwlxLT5pcWVfbGVuID0gaXFlX3NpemU7CisJcS0+c2l6ZSA9IHNpemU7Cit9CisKIHZvaWQgdDRfd3JpdGVfaW5kaXJlY3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBhZGRyX3JlZywKIAkJICAgICAgIHVuc2lnbmVkIGludCBkYXRhX3JlZywgY29uc3QgdTMyICp2YWxzLAogCQkgICAgICAgdW5zaWduZWQgaW50IG5yZWdzLCB1bnNpZ25lZCBpbnQgc3RhcnRfaWR4KTsKQEAgLTE1MTQsNiArMTY0Myw5IEBACiAJCQkgaW50IGZpbHRlcl9pbmRleCwgaW50ICplbmFibGVkKTsKIGludCB0NF9md2FkZHJzcGFjZV93cml0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IG1ib3gsCiAJCQkgdTMyIGFkZHIsIHUzMiB2YWwpOworaW50IHQ0X3NjaGVkX3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHR5cGUsIGludCBsZXZlbCwgaW50IG1vZGUsCisJCSAgICBpbnQgcmF0ZXVuaXQsIGludCByYXRlbW9kZSwgaW50IGNoYW5uZWwsIGludCBjbGFzcywKKwkJICAgIGludCBtaW5yYXRlLCBpbnQgbWF4cmF0ZSwgaW50IHdlaWdodCwgaW50IHBrdHNpemUpOwogdm9pZCB0NF9zZ2VfZGVjb2RlX2lkbWFfc3RhdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBzdGF0ZSk7CiB2b2lkIHQ0X2ZyZWVfbWVtKHZvaWQgKmFkZHIpOwogdm9pZCB0NF9pZG1hX21vbml0b3JfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKQEAgLTE1MjEsNCArMTY1MywxMSBAQAogdm9pZCB0NF9pZG1hX21vbml0b3Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCiAJCSAgICAgc3RydWN0IHNnZV9pZG1hX21vbml0b3Jfc3RhdGUgKmlkbWEsCiAJCSAgICAgaW50IGh6LCBpbnQgdGlja3MpOworaW50IHQ0X3NldF92Zl9tYWNfYWNsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgdmYsCisJCSAgICAgIHVuc2lnbmVkIGludCBuYWRkciwgdTggKmFkZHIpOwordm9pZCB0NF91bGRfbWVtX2ZyZWUoc3RydWN0IGFkYXB0ZXIgKmFkYXApOworaW50IHQ0X3VsZF9tZW1fYWxsb2Moc3RydWN0IGFkYXB0ZXIgKmFkYXApOwordm9pZCB0NF91bGRfY2xlYW5fdXAoc3RydWN0IGFkYXB0ZXIgKmFkYXApOwordm9pZCB0NF9yZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcih2b2lkKTsKK3ZvaWQgZnJlZV9yc3BxX2ZsKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX3JzcHEgKnJxLCBzdHJ1Y3Qgc2dlX2ZsICpmbCk7CiAjZW5kaWYgLyogX19DWEdCNF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9kZWJ1Z2ZzLmMKaW5kZXggOTFmYjUwOC4uMjA0NTVkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9kZWJ1Z2ZzLmMKQEAgLTI0MzIsMTcgKzI0MzIsMTEgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHNlcS0+cHJpdmF0ZTsKIAlpbnQgZXRoX2VudHJpZXMgPSBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLmV0aHFzZXRzLCA0KTsKLQlpbnQgaXNjc2lfZW50cmllcyA9IERJVl9ST1VORF9VUChhZGFwLT5zZ2UuaXNjc2lxc2V0cywgNCk7Ci0JaW50IGlzY3NpdF9lbnRyaWVzID0gRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5uaXNjc2l0cSwgNCk7Ci0JaW50IHJkbWFfZW50cmllcyA9IERJVl9ST1VORF9VUChhZGFwLT5zZ2UucmRtYXFzLCA0KTsKLQlpbnQgY2lxX2VudHJpZXMgPSBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLnJkbWFjaXFzLCA0KTsKKwlpbnQgb2ZsZF9lbnRyaWVzID0gRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5vZmxkcXNldHMsIDQpOwogCWludCBjdHJsX2VudHJpZXMgPSBESVZfUk9VTkRfVVAoTUFYX0NUUkxfUVVFVUVTLCA0KTsKIAlpbnQgaSwgciA9ICh1aW50cHRyX3QpdiAtIDE7Ci0JaW50IGlzY3NpX2lkeCA9IHIgLSBldGhfZW50cmllczsKLQlpbnQgaXNjc2l0X2lkeCA9IGlzY3NpX2lkeCAtIGlzY3NpX2VudHJpZXM7Ci0JaW50IHJkbWFfaWR4ID0gaXNjc2l0X2lkeCAtIGlzY3NpdF9lbnRyaWVzOwotCWludCBjaXFfaWR4ID0gcmRtYV9pZHggLSByZG1hX2VudHJpZXM7Ci0JaW50IGN0cmxfaWR4ID0gIGNpcV9pZHggLSBjaXFfZW50cmllczsKKwlpbnQgb2ZsZF9pZHggPSByIC0gZXRoX2VudHJpZXM7CisJaW50IGN0cmxfaWR4ID0gIG9mbGRfaWR4IC0gb2ZsZF9lbnRyaWVzOwogCWludCBmcV9pZHggPSAgY3RybF9pZHggLSBjdHJsX2VudHJpZXM7CiAKIAlpZiAocikKQEAgLTI1MTgsMTE5ICsyNTEyLDE3IEBACiAJCVJMKCJGTExvdzoiLCBmbC5sb3cpOwogCQlSTCgiRkxTdGFydmluZzoiLCBmbC5zdGFydmluZyk7CiAKLQl9IGVsc2UgaWYgKGlzY3NpX2lkeCA8IGlzY3NpX2VudHJpZXMpIHsKLQkJY29uc3Qgc3RydWN0IHNnZV9vZmxkX3J4cSAqcnggPQotCQkJJmFkYXAtPnNnZS5pc2NzaXJ4cVtpc2NzaV9pZHggKiA0XTsKKwl9IGVsc2UgaWYgKG9mbGRfaWR4IDwgb2ZsZF9lbnRyaWVzKSB7CiAJCWNvbnN0IHN0cnVjdCBzZ2Vfb2ZsZF90eHEgKnR4ID0KLQkJCSZhZGFwLT5zZ2Uub2ZsZHR4cVtpc2NzaV9pZHggKiA0XTsKLQkJaW50IG4gPSBtaW4oNCwgYWRhcC0+c2dlLmlzY3NpcXNldHMgLSA0ICogaXNjc2lfaWR4KTsKKwkJCSZhZGFwLT5zZ2Uub2ZsZHR4cVtvZmxkX2lkeCAqIDRdOworCQlpbnQgbiA9IG1pbig0LCBhZGFwLT5zZ2Uub2ZsZHFzZXRzIC0gNCAqIG9mbGRfaWR4KTsKIAotCQlTKCJRVHlwZToiLCAiaVNDU0kiKTsKKwkJUygiUVR5cGU6IiwgIk9GTEQtVHhxIik7CiAJCVQoIlR4USBJRDoiLCBxLmNudHh0X2lkKTsKIAkJVCgiVHhRIHNpemU6IiwgcS5zaXplKTsKIAkJVCgiVHhRIGludXNlOiIsIHEuaW5fdXNlKTsKIAkJVCgiVHhRIENJRFg6IiwgcS5jaWR4KTsKIAkJVCgiVHhRIFBJRFg6IiwgcS5waWR4KTsKLQkJUigiUnNwUSBJRDoiLCByc3BxLmFic19pZCk7Ci0JCVIoIlJzcFEgc2l6ZToiLCByc3BxLnNpemUpOwotCQlSKCJSc3BRRSBzaXplOiIsIHJzcHEuaXFlX2xlbik7Ci0JCVIoIlJzcFEgQ0lEWDoiLCByc3BxLmNpZHgpOwotCQlSKCJSc3BRIEdlbjoiLCByc3BxLmdlbik7Ci0JCVMzKCJ1IiwgIkludHIgZGVsYXk6IiwgcXRpbWVyX3ZhbChhZGFwLCAmcnhbaV0ucnNwcSkpOwotCQlTMygidSIsICJJbnRyIHBrdGNudDoiLAotCQkgICBhZGFwLT5zZ2UuY291bnRlcl92YWxbcnhbaV0ucnNwcS5wa3RjbnRfaWR4XSk7Ci0JCVIoIkZMIElEOiIsIGZsLmNudHh0X2lkKTsKLQkJUigiRkwgc2l6ZToiLCBmbC5zaXplIC0gOCk7Ci0JCVIoIkZMIHBlbmQ6IiwgZmwucGVuZF9jcmVkKTsKLQkJUigiRkwgYXZhaWw6IiwgZmwuYXZhaWwpOwotCQlSKCJGTCBQSURYOiIsIGZsLnBpZHgpOwotCQlSKCJGTCBDSURYOiIsIGZsLmNpZHgpOwotCQlSTCgiUnhQYWNrZXRzOiIsIHN0YXRzLnBrdHMpOwotCQlSTCgiUnhJbW1Qa3RzOiIsIHN0YXRzLmltbSk7Ci0JCVJMKCJSeE5vTWVtOiIsIHN0YXRzLm5vbWVtKTsKLQkJUkwoIkZMQWxsb2NFcnI6IiwgZmwuYWxsb2NfZmFpbGVkKTsKLQkJUkwoIkZMTHJnQWxjRXJyOiIsIGZsLmxhcmdlX2FsbG9jX2ZhaWxlZCk7Ci0JCVJMKCJGTE1hcEVycjoiLCBmbC5tYXBwaW5nX2Vycik7Ci0JCVJMKCJGTExvdzoiLCBmbC5sb3cpOwotCQlSTCgiRkxTdGFydmluZzoiLCBmbC5zdGFydmluZyk7Ci0KLQl9IGVsc2UgaWYgKGlzY3NpdF9pZHggPCBpc2NzaXRfZW50cmllcykgewotCQljb25zdCBzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyeCA9Ci0JCQkmYWRhcC0+c2dlLmlzY3NpdHJ4cVtpc2NzaXRfaWR4ICogNF07Ci0JCWludCBuID0gbWluKDQsIGFkYXAtPnNnZS5uaXNjc2l0cSAtIDQgKiBpc2NzaXRfaWR4KTsKLQotCQlTKCJRVHlwZToiLCAiaVNDU0lUIik7Ci0JCVIoIlJzcFEgSUQ6IiwgcnNwcS5hYnNfaWQpOwotCQlSKCJSc3BRIHNpemU6IiwgcnNwcS5zaXplKTsKLQkJUigiUnNwUUUgc2l6ZToiLCByc3BxLmlxZV9sZW4pOwotCQlSKCJSc3BRIENJRFg6IiwgcnNwcS5jaWR4KTsKLQkJUigiUnNwUSBHZW46IiwgcnNwcS5nZW4pOwotCQlTMygidSIsICJJbnRyIGRlbGF5OiIsIHF0aW1lcl92YWwoYWRhcCwgJnJ4W2ldLnJzcHEpKTsKLQkJUzMoInUiLCAiSW50ciBwa3RjbnQ6IiwKLQkJICAgYWRhcC0+c2dlLmNvdW50ZXJfdmFsW3J4W2ldLnJzcHEucGt0Y250X2lkeF0pOwotCQlSKCJGTCBJRDoiLCBmbC5jbnR4dF9pZCk7Ci0JCVIoIkZMIHNpemU6IiwgZmwuc2l6ZSAtIDgpOwotCQlSKCJGTCBwZW5kOiIsIGZsLnBlbmRfY3JlZCk7Ci0JCVIoIkZMIGF2YWlsOiIsIGZsLmF2YWlsKTsKLQkJUigiRkwgUElEWDoiLCBmbC5waWR4KTsKLQkJUigiRkwgQ0lEWDoiLCBmbC5jaWR4KTsKLQkJUkwoIlJ4UGFja2V0czoiLCBzdGF0cy5wa3RzKTsKLQkJUkwoIlJ4SW1tUGt0czoiLCBzdGF0cy5pbW0pOwotCQlSTCgiUnhOb01lbToiLCBzdGF0cy5ub21lbSk7Ci0JCVJMKCJGTEFsbG9jRXJyOiIsIGZsLmFsbG9jX2ZhaWxlZCk7Ci0JCVJMKCJGTExyZ0FsY0VycjoiLCBmbC5sYXJnZV9hbGxvY19mYWlsZWQpOwotCQlSTCgiRkxNYXBFcnI6IiwgZmwubWFwcGluZ19lcnIpOwotCQlSTCgiRkxMb3c6IiwgZmwubG93KTsKLQkJUkwoIkZMU3RhcnZpbmc6IiwgZmwuc3RhcnZpbmcpOwotCi0JfSBlbHNlIGlmIChyZG1hX2lkeCA8IHJkbWFfZW50cmllcykgewotCQljb25zdCBzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyeCA9Ci0JCQkJJmFkYXAtPnNnZS5yZG1hcnhxW3JkbWFfaWR4ICogNF07Ci0JCWludCBuID0gbWluKDQsIGFkYXAtPnNnZS5yZG1hcXMgLSA0ICogcmRtYV9pZHgpOwotCi0JCVMoIlFUeXBlOiIsICJSRE1BLUNQTCIpOwotCQlTKCJJbnRlcmZhY2U6IiwKLQkJICByeFtpXS5yc3BxLm5ldGRldiA/IHJ4W2ldLnJzcHEubmV0ZGV2LT5uYW1lIDogIk4vQSIpOwotCQlSKCJSc3BRIElEOiIsIHJzcHEuYWJzX2lkKTsKLQkJUigiUnNwUSBzaXplOiIsIHJzcHEuc2l6ZSk7Ci0JCVIoIlJzcFFFIHNpemU6IiwgcnNwcS5pcWVfbGVuKTsKLQkJUigiUnNwUSBDSURYOiIsIHJzcHEuY2lkeCk7Ci0JCVIoIlJzcFEgR2VuOiIsIHJzcHEuZ2VuKTsKLQkJUzMoInUiLCAiSW50ciBkZWxheToiLCBxdGltZXJfdmFsKGFkYXAsICZyeFtpXS5yc3BxKSk7Ci0JCVMzKCJ1IiwgIkludHIgcGt0Y250OiIsCi0JCSAgIGFkYXAtPnNnZS5jb3VudGVyX3ZhbFtyeFtpXS5yc3BxLnBrdGNudF9pZHhdKTsKLQkJUigiRkwgSUQ6IiwgZmwuY250eHRfaWQpOwotCQlSKCJGTCBzaXplOiIsIGZsLnNpemUgLSA4KTsKLQkJUigiRkwgcGVuZDoiLCBmbC5wZW5kX2NyZWQpOwotCQlSKCJGTCBhdmFpbDoiLCBmbC5hdmFpbCk7Ci0JCVIoIkZMIFBJRFg6IiwgZmwucGlkeCk7Ci0JCVIoIkZMIENJRFg6IiwgZmwuY2lkeCk7Ci0JCVJMKCJSeFBhY2tldHM6Iiwgc3RhdHMucGt0cyk7Ci0JCVJMKCJSeEltbVBrdHM6Iiwgc3RhdHMuaW1tKTsKLQkJUkwoIlJ4Tm9NZW06Iiwgc3RhdHMubm9tZW0pOwotCQlSTCgiRkxBbGxvY0VycjoiLCBmbC5hbGxvY19mYWlsZWQpOwotCQlSTCgiRkxMcmdBbGNFcnI6IiwgZmwubGFyZ2VfYWxsb2NfZmFpbGVkKTsKLQkJUkwoIkZMTWFwRXJyOiIsIGZsLm1hcHBpbmdfZXJyKTsKLQkJUkwoIkZMTG93OiIsIGZsLmxvdyk7Ci0JCVJMKCJGTFN0YXJ2aW5nOiIsIGZsLnN0YXJ2aW5nKTsKLQotCX0gZWxzZSBpZiAoY2lxX2lkeCA8IGNpcV9lbnRyaWVzKSB7Ci0JCWNvbnN0IHN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnJ4ID0gJmFkYXAtPnNnZS5yZG1hY2lxW2NpcV9pZHggKiA0XTsKLQkJaW50IG4gPSBtaW4oNCwgYWRhcC0+c2dlLnJkbWFjaXFzIC0gNCAqIGNpcV9pZHgpOwotCi0JCVMoIlFUeXBlOiIsICJSRE1BLUNJUSIpOwotCQlTKCJJbnRlcmZhY2U6IiwKLQkJICByeFtpXS5yc3BxLm5ldGRldiA/IHJ4W2ldLnJzcHEubmV0ZGV2LT5uYW1lIDogIk4vQSIpOwotCQlSKCJSc3BRIElEOiIsIHJzcHEuYWJzX2lkKTsKLQkJUigiUnNwUSBzaXplOiIsIHJzcHEuc2l6ZSk7Ci0JCVIoIlJzcFFFIHNpemU6IiwgcnNwcS5pcWVfbGVuKTsKLQkJUigiUnNwUSBDSURYOiIsIHJzcHEuY2lkeCk7Ci0JCVIoIlJzcFEgR2VuOiIsIHJzcHEuZ2VuKTsKLQkJUzMoInUiLCAiSW50ciBkZWxheToiLCBxdGltZXJfdmFsKGFkYXAsICZyeFtpXS5yc3BxKSk7Ci0JCVMzKCJ1IiwgIkludHIgcGt0Y250OiIsCi0JCSAgIGFkYXAtPnNnZS5jb3VudGVyX3ZhbFtyeFtpXS5yc3BxLnBrdGNudF9pZHhdKTsKLQkJUkwoIlJ4QU46Iiwgc3RhdHMuYW4pOwotCQlSTCgiUnhOb01lbToiLCBzdGF0cy5ub21lbSk7CiAKIAl9IGVsc2UgaWYgKGN0cmxfaWR4IDwgY3RybF9lbnRyaWVzKSB7CiAJCWNvbnN0IHN0cnVjdCBzZ2VfY3RybF90eHEgKnR4ID0gJmFkYXAtPnNnZS5jdHJscVtjdHJsX2lkeCAqIDRdOwpAQCAtMjY3MiwxMCArMjU2NCw3IEBACiBzdGF0aWMgaW50IHNnZV9xdWV1ZV9lbnRyaWVzKGNvbnN0IHN0cnVjdCBhZGFwdGVyICphZGFwKQogewogCXJldHVybiBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLmV0aHFzZXRzLCA0KSArCi0JICAgICAgIERJVl9ST1VORF9VUChhZGFwLT5zZ2UuaXNjc2lxc2V0cywgNCkgKwotCSAgICAgICBESVZfUk9VTkRfVVAoYWRhcC0+c2dlLm5pc2NzaXRxLCA0KSArCi0JICAgICAgIERJVl9ST1VORF9VUChhZGFwLT5zZ2UucmRtYXFzLCA0KSArCi0JICAgICAgIERJVl9ST1VORF9VUChhZGFwLT5zZ2UucmRtYWNpcXMsIDQpICsKKwkgICAgICAgRElWX1JPVU5EX1VQKGFkYXAtPnNnZS5vZmxkcXNldHMsIDQpICsKIAkgICAgICAgRElWX1JPVU5EX1VQKE1BWF9DVFJMX1FVRVVFUywgNCkgKyAxOwogfQogCkBAIC0yODU5LDEyICsyNzQ4LDYgQEAKIAkJCQkgc2l6ZV9tYiA8PCAyMCk7CiB9CiAKLXN0YXRpYyBpbnQgYmxvY2tlZF9mbF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IGJsb2NrZWRfZmxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsCiAJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0yOTA4LDcgKzI3OTEsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibG9ja2VkX2ZsX2ZvcHMgPSB7CiAJLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IGJsb2NrZWRfZmxfb3BlbiwKKwkub3BlbiAgICA9IHNpbXBsZV9vcGVuLAogCS5yZWFkICAgID0gYmxvY2tlZF9mbF9yZWFkLAogCS53cml0ZSAgID0gYmxvY2tlZF9mbF93cml0ZSwKIAkubGxzZWVrICA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2ZpbHRlci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDczNjczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9maWx0ZXIuYwpAQCAtMCwwICsxLDcyMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImN4Z2I0LmgiCisjaW5jbHVkZSAidDRfcmVncy5oIgorI2luY2x1ZGUgImwydC5oIgorI2luY2x1ZGUgInQ0ZndfYXBpLmgiCisjaW5jbHVkZSAiY3hnYjRfZmlsdGVyLmgiCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19maWVsZF9zZXQodTMyIHZhbCwgdTMyIG1hc2spCit7CisJcmV0dXJuIHZhbCB8fCBtYXNrOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgdW5zdXBwb3J0ZWQodTMyIGNvbmYsIHUzMiBjb25mX21hc2ssIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCXJldHVybiAhKGNvbmYgJiBjb25mX21hc2spICYmIGlzX2ZpZWxkX3NldCh2YWwsIG1hc2spOworfQorCisvKiBWYWxpZGF0ZSBmaWx0ZXIgc3BlYyBhZ2FpbnN0IGNvbmZpZ3VyYXRpb24gZG9uZSBvbiB0aGUgY2FyZC4gKi8KK3N0YXRpYyBpbnQgdmFsaWRhdGVfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmZzKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKKwl1MzIgZmNvbmYsIGljb25mOworCisJLyogQ2hlY2sgZm9yIHVuY29uZmlndXJlZCBmaWVsZHMgYmVpbmcgdXNlZC4gKi8KKwlmY29uZiA9IGFkYXB0ZXItPnBhcmFtcy50cC52bGFuX3ByaV9tYXA7CisJaWNvbmYgPSBhZGFwdGVyLT5wYXJhbXMudHAuaW5ncmVzc19jb25maWc7CisKKwlpZiAodW5zdXBwb3J0ZWQoZmNvbmYsIEZDT0VfRiwgZnMtPnZhbC5mY29lLCBmcy0+bWFzay5mY29lKSB8fAorCSAgICB1bnN1cHBvcnRlZChmY29uZiwgUE9SVF9GLCBmcy0+dmFsLmlwb3J0LCBmcy0+bWFzay5pcG9ydCkgfHwKKwkgICAgdW5zdXBwb3J0ZWQoZmNvbmYsIFRPU19GLCBmcy0+dmFsLnRvcywgZnMtPm1hc2sudG9zKSB8fAorCSAgICB1bnN1cHBvcnRlZChmY29uZiwgRVRIRVJUWVBFX0YsIGZzLT52YWwuZXRodHlwZSwKKwkJCWZzLT5tYXNrLmV0aHR5cGUpIHx8CisJICAgIHVuc3VwcG9ydGVkKGZjb25mLCBNQUNNQVRDSF9GLCBmcy0+dmFsLm1hY2lkeCwgZnMtPm1hc2subWFjaWR4KSB8fAorCSAgICB1bnN1cHBvcnRlZChmY29uZiwgTVBTSElUVFlQRV9GLCBmcy0+dmFsLm1hdGNodHlwZSwKKwkJCWZzLT5tYXNrLm1hdGNodHlwZSkgfHwKKwkgICAgdW5zdXBwb3J0ZWQoZmNvbmYsIEZSQUdNRU5UQVRJT05fRiwgZnMtPnZhbC5mcmFnLCBmcy0+bWFzay5mcmFnKSB8fAorCSAgICB1bnN1cHBvcnRlZChmY29uZiwgUFJPVE9DT0xfRiwgZnMtPnZhbC5wcm90bywgZnMtPm1hc2sucHJvdG8pIHx8CisJICAgIHVuc3VwcG9ydGVkKGZjb25mLCBWTklDX0lEX0YsIGZzLT52YWwucGZ2Zl92bGQsCisJCQlmcy0+bWFzay5wZnZmX3ZsZCkgfHwKKwkgICAgdW5zdXBwb3J0ZWQoZmNvbmYsIFZOSUNfSURfRiwgZnMtPnZhbC5vdmxhbl92bGQsCisJCQlmcy0+bWFzay5vdmxhbl92bGQpIHx8CisJICAgIHVuc3VwcG9ydGVkKGZjb25mLCBWTEFOX0YsIGZzLT52YWwuaXZsYW5fdmxkLCBmcy0+bWFzay5pdmxhbl92bGQpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBUNCBpbmNvbnZlbmllbnRseSB1c2VzIHRoZSBzYW1lIEZUX1ZOSUNfSURfVyBiaXRzIGZvciBib3RoIHRoZSBPdXRlcgorCSAqIFZMQU4gVGFnIGFuZCBQRi9WRi9WRnZsZCBmaWVsZHMgYmFzZWQgb24gVk5JQ19GIGJlaW5nIHNldAorCSAqIGluIFRQX0lOR1JFU1NfQ09ORklHLiAgSGVuc2UgdGhlIHNvbWV3aGF0IGNyYXp5IGNoZWNrcworCSAqIGJlbG93LiAgQWRkaXRpb25hbGx5LCBzaW5jZSB0aGUgVDQgZmlybXdhcmUgaW50ZXJmYWNlIGFsc28KKwkgKiBjYXJyaWVzIHRoYXQgb3ZlcmxhcCwgd2UgbmVlZCB0byB0cmFuc2xhdGUgYW55IFBGL1ZGCisJICogc3BlY2lmaWNhdGlvbiBpbnRvIHRoYXQgaW50ZXJuYWwgZm9ybWF0IGJlbG93LgorCSAqLworCWlmIChpc19maWVsZF9zZXQoZnMtPnZhbC5wZnZmX3ZsZCwgZnMtPm1hc2sucGZ2Zl92bGQpICYmCisJICAgIGlzX2ZpZWxkX3NldChmcy0+dmFsLm92bGFuX3ZsZCwgZnMtPm1hc2sub3ZsYW5fdmxkKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICh1bnN1cHBvcnRlZChpY29uZiwgVk5JQ19GLCBmcy0+dmFsLnBmdmZfdmxkLCBmcy0+bWFzay5wZnZmX3ZsZCkgfHwKKwkgICAgKGlzX2ZpZWxkX3NldChmcy0+dmFsLm92bGFuX3ZsZCwgZnMtPm1hc2sub3ZsYW5fdmxkKSAmJgorCSAgICAgKGljb25mICYgVk5JQ19GKSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoZnMtPnZhbC5wZiA+IDB4NyB8fCBmcy0+dmFsLnZmID4gMHg3ZikKKwkJcmV0dXJuIC1FUkFOR0U7CisJZnMtPm1hc2sucGYgJj0gMHg3OworCWZzLT5tYXNrLnZmICY9IDB4N2Y7CisKKwkvKiBJZiB0aGUgdXNlciBpcyByZXF1ZXN0aW5nIHRoYXQgdGhlIGZpbHRlciBhY3Rpb24gbG9vcAorCSAqIG1hdGNoaW5nIHBhY2tldHMgYmFjayBvdXQgb25lIG9mIG91ciBwb3J0cywgbWFrZSBzdXJlIHRoYXQKKwkgKiB0aGUgZWdyZXNzIHBvcnQgaXMgaW4gcmFuZ2UuCisJICovCisJaWYgKGZzLT5hY3Rpb24gPT0gRklMVEVSX1NXSVRDSCAmJgorCSAgICBmcy0+ZXBvcnQgPj0gYWRhcHRlci0+cGFyYW1zLm5wb3J0cykKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwkvKiBEb24ndCBhbGxvdyB2YXJpb3VzIHRyaXZpYWxseSBvYnZpb3VzIGJvZ3VzIG91dC1vZi1yYW5nZSB2YWx1ZXMuLi4gKi8KKwlpZiAoZnMtPnZhbC5pcG9ydCA+PSBhZGFwdGVyLT5wYXJhbXMubnBvcnRzKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCS8qIFQ0IGRvZXNuJ3Qgc3VwcG9ydCByZW1vdmluZyBWTEFOIFRhZ3MgZm9yIGxvb3AgYmFjayBmaWx0ZXJzLiAqLworCWlmIChpc190NChhZGFwdGVyLT5wYXJhbXMuY2hpcCkgJiYKKwkgICAgZnMtPmFjdGlvbiA9PSBGSUxURVJfU1dJVENIICYmCisJICAgIChmcy0+bmV3dmxhbiA9PSBWTEFOX1JFTU9WRSB8fAorCSAgICAgZnMtPm5ld3ZsYW4gPT0gVkxBTl9SRVdSSVRFKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZpbHRlcl9zdGVlcnEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmcykKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldjJhZGFwKGRldik7CisJaW50IGlxOworCisJLyogSWYgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCBzdGVlcmluZyBtYXRjaGluZyBJbmdyZXNzIFBhY2tldHMKKwkgKiB0byBhIHNwZWNpZmljIFF1ZXVlIFNldCwgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQncyBpbiByYW5nZQorCSAqIGZvciB0aGUgcG9ydCBhbmQgbWFwIHRoYXQgaW50byB0aGUgQWJzb2x1dGUgUXVldWUgSUQgb2YgdGhlCisJICogUXVldWUgU2V0J3MgUmVzcG9uc2UgUXVldWUuCisJICovCisJaWYgKCFmcy0+ZGlyc3RlZXIpIHsKKwkJaWYgKGZzLT5pcSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpcSA9IDA7CisJfSBlbHNlIHsKKwkJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCisJCS8qIElmIHRoZSBpcSBpZCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBxc2V0cywKKwkJICogdGhlbiBhc3N1bWUgaXQgaXMgYW4gYWJzb2x1dGUgcWlkLgorCQkgKi8KKwkJaWYgKGZzLT5pcSA8IHBpLT5ucXNldHMpCisJCQlpcSA9IGFkYXB0ZXItPnNnZS5ldGhyeHFbcGktPmZpcnN0X3FzZXQgKworCQkJCQkJIGZzLT5pcV0ucnNwcS5hYnNfaWQ7CisJCWVsc2UKKwkJCWlxID0gZnMtPmlxOworCX0KKworCXJldHVybiBpcTsKK30KKworc3RhdGljIGludCBjeGdiNF9zZXRfZnRpZChzdHJ1Y3QgdGlkX2luZm8gKnQsIGludCBmaWR4LCBpbnQgZmFtaWx5KQoreworCXNwaW5fbG9ja19iaCgmdC0+ZnRpZF9sb2NrKTsKKworCWlmICh0ZXN0X2JpdChmaWR4LCB0LT5mdGlkX2JtYXApKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZ0LT5mdGlkX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChmYW1pbHkgPT0gUEZfSU5FVCkKKwkJX19zZXRfYml0KGZpZHgsIHQtPmZ0aWRfYm1hcCk7CisJZWxzZQorCQliaXRtYXBfYWxsb2NhdGVfcmVnaW9uKHQtPmZ0aWRfYm1hcCwgZmlkeCwgMik7CisKKwlzcGluX3VubG9ja19iaCgmdC0+ZnRpZF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3hnYjRfY2xlYXJfZnRpZChzdHJ1Y3QgdGlkX2luZm8gKnQsIGludCBmaWR4LCBpbnQgZmFtaWx5KQoreworCXNwaW5fbG9ja19iaCgmdC0+ZnRpZF9sb2NrKTsKKwlpZiAoZmFtaWx5ID09IFBGX0lORVQpCisJCV9fY2xlYXJfYml0KGZpZHgsIHQtPmZ0aWRfYm1hcCk7CisJZWxzZQorCQliaXRtYXBfcmVsZWFzZV9yZWdpb24odC0+ZnRpZF9ibWFwLCBmaWR4LCAyKTsKKwlzcGluX3VubG9ja19iaCgmdC0+ZnRpZF9sb2NrKTsKK30KKworLyogRGVsZXRlIHRoZSBmaWx0ZXIgYXQgYSBzcGVjaWZpZWQgaW5kZXguICovCitzdGF0aWMgaW50IGRlbF9maWx0ZXJfd3Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBmaWR4KQoreworCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYltmaWR4XTsKKwlzdHJ1Y3QgZndfZmlsdGVyX3dyICpmd3I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbGVuID0gc2l6ZW9mKCpmd3IpOworCisJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJZndyID0gKHN0cnVjdCBmd19maWx0ZXJfd3IgKilfX3NrYl9wdXQoc2tiLCBsZW4pOworCXQ0X21rX2ZpbHRkZWx3cihmLT50aWQsIGZ3ciwgYWRhcHRlci0+c2dlLmZ3X2V2dHEuYWJzX2lkKTsKKworCS8qIE1hcmsgdGhlIGZpbHRlciBhcyAicGVuZGluZyIgYW5kIHNoaXAgb2ZmIHRoZSBGaWx0ZXIgV29yayBSZXF1ZXN0LgorCSAqIFdoZW4gd2UgZ2V0IHRoZSBXb3JrIFJlcXVlc3QgUmVwbHkgd2UnbGwgY2xlYXIgdGhlIHBlbmRpbmcgc3RhdHVzLgorCSAqLworCWYtPnBlbmRpbmcgPSAxOworCXQ0X21nbXRfdHgoYWRhcHRlciwgc2tiKTsKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBhIFdvcmsgUmVxdWVzdCB0byB3cml0ZSB0aGUgZmlsdGVyIGF0IGEgc3BlY2lmaWVkIGluZGV4LiAgV2UgY29uc3RydWN0CisgKiBhIEZpcm13YXJlIEZpbHRlciBXb3JrIFJlcXVlc3QgdG8gaGF2ZSB0aGUgd29yayBkb25lIGFuZCBwdXQgdGhlIGluZGljYXRlZAorICogZmlsdGVyIGludG8gInBlbmRpbmciIG1vZGUgd2hpY2ggd2lsbCBwcmV2ZW50IGFueSBmdXJ0aGVyIGFjdGlvbnMgYWdhaW5zdAorICogaXQgdGlsbCB3ZSBnZXQgYSByZXBseSBmcm9tIHRoZSBmaXJtd2FyZSBvbiB0aGUgY29tcGxldGlvbiBzdGF0dXMgb2YgdGhlCisgKiByZXF1ZXN0LgorICovCitpbnQgc2V0X2ZpbHRlcl93cihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGZpZHgpCit7CisJc3RydWN0IGZpbHRlcl9lbnRyeSAqZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiW2ZpZHhdOworCXN0cnVjdCBmd19maWx0ZXJfd3IgKmZ3cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemVvZigqZndyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSWYgdGhlIG5ldyBmaWx0ZXIgcmVxdWlyZXMgbG9vcGJhY2sgRGVzdGluYXRpb24gTUFDIGFuZC9vciBWTEFOCisJICogcmV3cml0aW5nIHRoZW4gd2UgbmVlZCB0byBhbGxvY2F0ZSBhIExheWVyIDIgVGFibGUgKEwyVCkgZW50cnkgZm9yCisJICogdGhlIGZpbHRlci4KKwkgKi8KKwlpZiAoZi0+ZnMubmV3ZG1hYyB8fCBmLT5mcy5uZXd2bGFuKSB7CisJCS8qIGFsbG9jYXRlIEwyVCBlbnRyeSBmb3IgbmV3IGZpbHRlciAqLworCQlmLT5sMnQgPSB0NF9sMnRfYWxsb2Nfc3dpdGNoaW5nKGFkYXB0ZXIsIGYtPmZzLnZsYW4sCisJCQkJCQlmLT5mcy5lcG9ydCwgZi0+ZnMuZG1hYyk7CisJCWlmICghZi0+bDJ0KSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJZndyID0gKHN0cnVjdCBmd19maWx0ZXJfd3IgKilfX3NrYl9wdXQoc2tiLCBzaXplb2YoKmZ3cikpOworCW1lbXNldChmd3IsIDAsIHNpemVvZigqZndyKSk7CisKKwkvKiBJdCB3b3VsZCBiZSBuaWNlIHRvIHB1dCBtb3N0IG9mIHRoZSBmb2xsb3dpbmcgaW4gdDRfaHcuYyBidXQgbW9zdAorCSAqIG9mIHRoZSB3b3JrIGlzIHRyYW5zbGF0aW5nIHRoZSBjeGdidG9vbCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbgorCSAqIGludG8gdGhlIFdvcmsgUmVxdWVzdCBhbmQgdGhlIGRlZmluaXRpb24gb2YgdGhhdCBzdHJ1Y3R1cmUgaXMKKwkgKiBjdXJyZW50bHkgaW4gY3hnYnRvb2wuaCB3aGljaCBpc24ndCBhcHByb3ByaWF0ZSB0byBwdWxsIGludG8gdGhlCisJICogY29tbW9uIGNvZGUuICBXZSBtYXkgZXZlbnR1YWxseSB0cnkgdG8gY29tZSB1cCB3aXRoIGEgbW9yZSBuZXV0cmFsCisJICogZmlsdGVyIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIGJ1dCBmb3Igbm93IGl0J3MgZWFzaWVzdCB0byBzaW1wbHkKKwkgKiBwdXQgdGhpcyBmYWlybHkgZGlyZWN0IGNvZGUgaW4gbGluZSAuLi4KKwkgKi8KKwlmd3ItPm9wX3BrZCA9IGh0b25sKEZXX1dSX09QX1YoRldfRklMVEVSX1dSKSk7CisJZndyLT5sZW4xNl9wa2QgPSBodG9ubChGV19XUl9MRU4xNl9WKHNpemVvZigqZndyKSAvIDE2KSk7CisJZndyLT50aWRfdG9faXEgPQorCQlodG9ubChGV19GSUxURVJfV1JfVElEX1YoZi0+dGlkKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9SUVRZUEVfVihmLT5mcy50eXBlKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9OT1JFUExZX1YoMCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfSVFfVihmLT5mcy5pcSkpOworCWZ3ci0+ZGVsX2ZpbHRlcl90b19sMnRpeCA9CisJCWh0b25sKEZXX0ZJTFRFUl9XUl9SUFRUSURfVihmLT5mcy5ycHR0aWQpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX0RST1BfVihmLT5mcy5hY3Rpb24gPT0gRklMVEVSX0RST1ApIHwKKwkJICAgICAgRldfRklMVEVSX1dSX0RJUlNURUVSX1YoZi0+ZnMuZGlyc3RlZXIpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX01BU0tIQVNIX1YoZi0+ZnMubWFza2hhc2gpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX0RJUlNURUVSSEFTSF9WKGYtPmZzLmRpcnN0ZWVyaGFzaCkgfAorCQkgICAgICBGV19GSUxURVJfV1JfTFBCS19WKGYtPmZzLmFjdGlvbiA9PSBGSUxURVJfU1dJVENIKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9ETUFDX1YoZi0+ZnMubmV3ZG1hYykgfAorCQkgICAgICBGV19GSUxURVJfV1JfU01BQ19WKGYtPmZzLm5ld3NtYWMpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX0lOU1ZMQU5fVihmLT5mcy5uZXd2bGFuID09IFZMQU5fSU5TRVJUIHx8CisJCQkJCSAgICAgZi0+ZnMubmV3dmxhbiA9PSBWTEFOX1JFV1JJVEUpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX1JNVkxBTl9WKGYtPmZzLm5ld3ZsYW4gPT0gVkxBTl9SRU1PVkUgfHwKKwkJCQkJICAgIGYtPmZzLm5ld3ZsYW4gPT0gVkxBTl9SRVdSSVRFKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9ISVRDTlRTX1YoZi0+ZnMuaGl0Y250cykgfAorCQkgICAgICBGV19GSUxURVJfV1JfVFhDSEFOX1YoZi0+ZnMuZXBvcnQpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX1BSSU9fVihmLT5mcy5wcmlvKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9MMlRJWF9WKGYtPmwydCA/IGYtPmwydC0+aWR4IDogMCkpOworCWZ3ci0+ZXRodHlwZSA9IGh0b25zKGYtPmZzLnZhbC5ldGh0eXBlKTsKKwlmd3ItPmV0aHR5cGVtID0gaHRvbnMoZi0+ZnMubWFzay5ldGh0eXBlKTsKKwlmd3ItPmZyYWdfdG9fb3ZsYW5fdmxkbSA9CisJCShGV19GSUxURVJfV1JfRlJBR19WKGYtPmZzLnZhbC5mcmFnKSB8CisJCSBGV19GSUxURVJfV1JfRlJBR01fVihmLT5mcy5tYXNrLmZyYWcpIHwKKwkJIEZXX0ZJTFRFUl9XUl9JVkxBTl9WTERfVihmLT5mcy52YWwuaXZsYW5fdmxkKSB8CisJCSBGV19GSUxURVJfV1JfT1ZMQU5fVkxEX1YoZi0+ZnMudmFsLm92bGFuX3ZsZCkgfAorCQkgRldfRklMVEVSX1dSX0lWTEFOX1ZMRE1fVihmLT5mcy5tYXNrLml2bGFuX3ZsZCkgfAorCQkgRldfRklMVEVSX1dSX09WTEFOX1ZMRE1fVihmLT5mcy5tYXNrLm92bGFuX3ZsZCkpOworCWZ3ci0+c21hY19zZWwgPSAwOworCWZ3ci0+cnhfY2hhbl9yeF9ycGxfaXEgPQorCQlodG9ucyhGV19GSUxURVJfV1JfUlhfQ0hBTl9WKDApIHwKKwkJICAgICAgRldfRklMVEVSX1dSX1JYX1JQTF9JUV9WKGFkYXB0ZXItPnNnZS5md19ldnRxLmFic19pZCkpOworCWZ3ci0+bWFjaV90b19tYXRjaHR5cGVtID0KKwkJaHRvbmwoRldfRklMVEVSX1dSX01BQ0lfVihmLT5mcy52YWwubWFjaWR4KSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9NQUNJTV9WKGYtPmZzLm1hc2subWFjaWR4KSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9GQ09FX1YoZi0+ZnMudmFsLmZjb2UpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX0ZDT0VNX1YoZi0+ZnMubWFzay5mY29lKSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9QT1JUX1YoZi0+ZnMudmFsLmlwb3J0KSB8CisJCSAgICAgIEZXX0ZJTFRFUl9XUl9QT1JUTV9WKGYtPmZzLm1hc2suaXBvcnQpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX01BVENIVFlQRV9WKGYtPmZzLnZhbC5tYXRjaHR5cGUpIHwKKwkJICAgICAgRldfRklMVEVSX1dSX01BVENIVFlQRU1fVihmLT5mcy5tYXNrLm1hdGNodHlwZSkpOworCWZ3ci0+cHRjbCA9IGYtPmZzLnZhbC5wcm90bzsKKwlmd3ItPnB0Y2xtID0gZi0+ZnMubWFzay5wcm90bzsKKwlmd3ItPnR0eXAgPSBmLT5mcy52YWwudG9zOworCWZ3ci0+dHR5cG0gPSBmLT5mcy5tYXNrLnRvczsKKwlmd3ItPml2bGFuID0gaHRvbnMoZi0+ZnMudmFsLml2bGFuKTsKKwlmd3ItPml2bGFubSA9IGh0b25zKGYtPmZzLm1hc2suaXZsYW4pOworCWZ3ci0+b3ZsYW4gPSBodG9ucyhmLT5mcy52YWwub3ZsYW4pOworCWZ3ci0+b3ZsYW5tID0gaHRvbnMoZi0+ZnMubWFzay5vdmxhbik7CisJbWVtY3B5KGZ3ci0+bGlwLCBmLT5mcy52YWwubGlwLCBzaXplb2YoZndyLT5saXApKTsKKwltZW1jcHkoZndyLT5saXBtLCBmLT5mcy5tYXNrLmxpcCwgc2l6ZW9mKGZ3ci0+bGlwbSkpOworCW1lbWNweShmd3ItPmZpcCwgZi0+ZnMudmFsLmZpcCwgc2l6ZW9mKGZ3ci0+ZmlwKSk7CisJbWVtY3B5KGZ3ci0+ZmlwbSwgZi0+ZnMubWFzay5maXAsIHNpemVvZihmd3ItPmZpcG0pKTsKKwlmd3ItPmxwID0gaHRvbnMoZi0+ZnMudmFsLmxwb3J0KTsKKwlmd3ItPmxwbSA9IGh0b25zKGYtPmZzLm1hc2subHBvcnQpOworCWZ3ci0+ZnAgPSBodG9ucyhmLT5mcy52YWwuZnBvcnQpOworCWZ3ci0+ZnBtID0gaHRvbnMoZi0+ZnMubWFzay5mcG9ydCk7CisJaWYgKGYtPmZzLm5ld3NtYWMpCisJCW1lbWNweShmd3ItPnNtYSwgZi0+ZnMuc21hYywgc2l6ZW9mKGZ3ci0+c21hKSk7CisKKwkvKiBNYXJrIHRoZSBmaWx0ZXIgYXMgInBlbmRpbmciIGFuZCBzaGlwIG9mZiB0aGUgRmlsdGVyIFdvcmsgUmVxdWVzdC4KKwkgKiBXaGVuIHdlIGdldCB0aGUgV29yayBSZXF1ZXN0IFJlcGx5IHdlJ2xsIGNsZWFyIHRoZSBwZW5kaW5nIHN0YXR1cy4KKwkgKi8KKwlmLT5wZW5kaW5nID0gMTsKKwlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0NPTlRST0wsIGYtPmZzLnZhbC5pcG9ydCAmIDB4Myk7CisJdDRfb2ZsZF9zZW5kKGFkYXB0ZXIsIHNrYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiBhbiBlcnJvciBudW1iZXIgaWYgdGhlIGluZGljYXRlZCBmaWx0ZXIgaXNuJ3Qgd3JpdGFibGUgLi4uICovCitpbnQgd3JpdGFibGVfZmlsdGVyKHN0cnVjdCBmaWx0ZXJfZW50cnkgKmYpCit7CisJaWYgKGYtPmxvY2tlZCkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoZi0+cGVuZGluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorCisvKiBEZWxldGUgdGhlIGZpbHRlciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IChpZiB2YWxpZCkuICBUaGUgY2hlY2tzIGZvciBhbGwKKyAqIHRoZSBjb21tb24gcHJvYmxlbXMgd2l0aCBkb2luZyB0aGlzIGxpa2UgdGhlIGZpbHRlciBiZWluZyBsb2NrZWQsIGN1cnJlbnRseQorICogcGVuZGluZyBpbiBhbm90aGVyIG9wZXJhdGlvbiwgZXRjLgorICovCitpbnQgZGVsZXRlX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGZpZHgpCit7CisJc3RydWN0IGZpbHRlcl9lbnRyeSAqZjsKKwlpbnQgcmV0OworCisJaWYgKGZpZHggPj0gYWRhcHRlci0+dGlkcy5uZnRpZHMgKyBhZGFwdGVyLT50aWRzLm5zZnRpZHMpCisJCXJldHVybiAtRUlOVkFMOworCisJZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiW2ZpZHhdOworCXJldCA9IHdyaXRhYmxlX2ZpbHRlcihmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmIChmLT52YWxpZCkKKwkJcmV0dXJuIGRlbF9maWx0ZXJfd3IoYWRhcHRlciwgZmlkeCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2xlYXIgYSBmaWx0ZXIgYW5kIHJlbGVhc2UgYW55IG9mIGl0cyByZXNvdXJjZXMgdGhhdCB3ZSBvd24uICBUaGlzIGFsc28KKyAqIGNsZWFycyB0aGUgZmlsdGVyJ3MgInBlbmRpbmciIHN0YXR1cy4KKyAqLwordm9pZCBjbGVhcl9maWx0ZXIoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHN0cnVjdCBmaWx0ZXJfZW50cnkgKmYpCit7CisJLyogSWYgdGhlIG5ldyBvciBvbGQgZmlsdGVyIGhhdmUgbG9vcGJhY2sgcmV3cml0ZWluZyBydWxlcyB0aGVuIHdlJ2xsCisJICogbmVlZCB0byBmcmVlIGFueSBleGlzdGluZyBMYXllciBUd28gVGFibGUgKEwyVCkgZW50cmllcyBvZiB0aGUgb2xkCisJICogZmlsdGVyIHJ1bGUuICBUaGUgZmlybXdhcmUgd2lsbCBoYW5kbGUgZnJlZWluZyB1cCBhbnkgU291cmNlIE1BQworCSAqIFRhYmxlIChTTVQpIGVudHJpZXMgdXNlZCBmb3IgcmV3cml0aW5nIFNvdXJjZSBNQUMgQWRkcmVzc2VzIGluCisJICogbG9vcGJhY2sgcnVsZXMuCisJICovCisJaWYgKGYtPmwydCkKKwkJY3hnYjRfbDJ0X3JlbGVhc2UoZi0+bDJ0KTsKKworCS8qIFRoZSB6ZXJvaW5nIG9mIHRoZSBmaWx0ZXIgcnVsZSBiZWxvdyBjbGVhcnMgdGhlIGZpbHRlciB2YWxpZCwKKwkgKiBwZW5kaW5nLCBsb2NrZWQgZmxhZ3MsIGwydCBwb2ludGVyLCBldGMuIHNvIGl0J3MgYWxsIHdlIG5lZWQgZm9yCisJICogdGhpcyBvcGVyYXRpb24uCisJICovCisJbWVtc2V0KGYsIDAsIHNpemVvZigqZikpOworfQorCit2b2lkIGNsZWFyX2FsbF9maWx0ZXJzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGFkYXB0ZXItPnRpZHMuZnRpZF90YWIpIHsKKwkJc3RydWN0IGZpbHRlcl9lbnRyeSAqZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiWzBdOworCQl1bnNpZ25lZCBpbnQgbWF4X2Z0aWQgPSBhZGFwdGVyLT50aWRzLm5mdGlkcyArCisJCQkJCWFkYXB0ZXItPnRpZHMubnNmdGlkczsKKworCQlmb3IgKGkgPSAwOyBpIDwgbWF4X2Z0aWQ7IGkrKywgZisrKQorCQkJaWYgKGYtPnZhbGlkIHx8IGYtPnBlbmRpbmcpCisJCQkJY2xlYXJfZmlsdGVyKGFkYXB0ZXIsIGYpOworCX0KK30KKworLyogRmlsbCB1cCBkZWZhdWx0IG1hc2tzIGZvciBzZXQgbWF0Y2ggZmllbGRzLiAqLworc3RhdGljIHZvaWQgZmlsbF9kZWZhdWx0X21hc2soc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmcykKK3sKKwl1bnNpZ25lZCBpbnQgbGlwID0gMCwgbGlwX21hc2sgPSAwOworCXVuc2lnbmVkIGludCBmaXAgPSAwLCBmaXBfbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoZnMtPnZhbC5pcG9ydCAmJiAhZnMtPm1hc2suaXBvcnQpCisJCWZzLT5tYXNrLmlwb3J0IHw9IH4wOworCWlmIChmcy0+dmFsLmZjb2UgJiYgIWZzLT5tYXNrLmZjb2UpCisJCWZzLT5tYXNrLmZjb2UgfD0gfjA7CisJaWYgKGZzLT52YWwubWF0Y2h0eXBlICYmICFmcy0+bWFzay5tYXRjaHR5cGUpCisJCWZzLT5tYXNrLm1hdGNodHlwZSB8PSB+MDsKKwlpZiAoZnMtPnZhbC5tYWNpZHggJiYgIWZzLT5tYXNrLm1hY2lkeCkKKwkJZnMtPm1hc2subWFjaWR4IHw9IH4wOworCWlmIChmcy0+dmFsLmV0aHR5cGUgJiYgIWZzLT5tYXNrLmV0aHR5cGUpCisJCWZzLT5tYXNrLmV0aHR5cGUgfD0gfjA7CisJaWYgKGZzLT52YWwuaXZsYW4gJiYgIWZzLT5tYXNrLml2bGFuKQorCQlmcy0+bWFzay5pdmxhbiB8PSB+MDsKKwlpZiAoZnMtPnZhbC5vdmxhbiAmJiAhZnMtPm1hc2sub3ZsYW4pCisJCWZzLT5tYXNrLm92bGFuIHw9IH4wOworCWlmIChmcy0+dmFsLmZyYWcgJiYgIWZzLT5tYXNrLmZyYWcpCisJCWZzLT5tYXNrLmZyYWcgfD0gfjA7CisJaWYgKGZzLT52YWwudG9zICYmICFmcy0+bWFzay50b3MpCisJCWZzLT5tYXNrLnRvcyB8PSB+MDsKKwlpZiAoZnMtPnZhbC5wcm90byAmJiAhZnMtPm1hc2sucHJvdG8pCisJCWZzLT5tYXNrLnByb3RvIHw9IH4wOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnMtPnZhbC5saXApOyBpKyspIHsKKwkJbGlwIHw9IGZzLT52YWwubGlwW2ldOworCQlsaXBfbWFzayB8PSBmcy0+bWFzay5saXBbaV07CisJCWZpcCB8PSBmcy0+dmFsLmZpcFtpXTsKKwkJZmlwX21hc2sgfD0gZnMtPm1hc2suZmlwW2ldOworCX0KKworCWlmIChsaXAgJiYgIWxpcF9tYXNrKQorCQltZW1zZXQoZnMtPm1hc2subGlwLCB+MCwgc2l6ZW9mKGZzLT5tYXNrLmxpcCkpOworCisJaWYgKGZpcCAmJiAhZmlwX21hc2spCisJCW1lbXNldChmcy0+bWFzay5maXAsIH4wLCBzaXplb2YoZnMtPm1hc2subGlwKSk7CisKKwlpZiAoZnMtPnZhbC5scG9ydCAmJiAhZnMtPm1hc2subHBvcnQpCisJCWZzLT5tYXNrLmxwb3J0ID0gfjA7CisJaWYgKGZzLT52YWwuZnBvcnQgJiYgIWZzLT5tYXNrLmZwb3J0KQorCQlmcy0+bWFzay5mcG9ydCA9IH4wOworfQorCisvKiBDaGVjayBhIENoZWxzaW8gRmlsdGVyIFJlcXVlc3QgZm9yIHZhbGlkaXR5LCBjb252ZXJ0IGl0IGludG8gb3VyIGludGVybmFsCisgKiBmb3JtYXQgYW5kIHNlbmQgaXQgdG8gdGhlIGhhcmR3YXJlLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgYW4gZXJyb3IgbnVtYmVyCisgKiBvdGhlcndpc2UuICBXZSBhdHRhY2ggYW55IHByb3ZpZGVkIGZpbHRlciBvcGVyYXRpb24gY29udGV4dCB0byB0aGUgaW50ZXJuYWwKKyAqIGZpbHRlciBzcGVjaWZpY2F0aW9uIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgc2lnbmFsaW5nIGNvbXBsZXRpb24gb2YgdGhlCisgKiBvcGVyYXRpb24uCisgKi8KK2ludCBfX2N4Z2I0X3NldF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZpbHRlcl9pZCwKKwkJICAgICAgIHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZnMsCisJCSAgICAgICBzdHJ1Y3QgZmlsdGVyX2N0eCAqY3R4KQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKKwl1bnNpZ25lZCBpbnQgbWF4X2ZpZHgsIGZpZHg7CisJc3RydWN0IGZpbHRlcl9lbnRyeSAqZjsKKwl1MzIgaWNvbmY7CisJaW50IGlxLCByZXQ7CisKKwltYXhfZmlkeCA9IGFkYXB0ZXItPnRpZHMubmZ0aWRzOworCWlmIChmaWx0ZXJfaWQgIT0gKG1heF9maWR4ICsgYWRhcHRlci0+dGlkcy5uc2Z0aWRzIC0gMSkgJiYKKwkgICAgZmlsdGVyX2lkID49IG1heF9maWR4KQorCQlyZXR1cm4gLUUyQklHOworCisJZmlsbF9kZWZhdWx0X21hc2soZnMpOworCisJcmV0ID0gdmFsaWRhdGVfZmlsdGVyKGRldiwgZnMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpcSA9IGdldF9maWx0ZXJfc3RlZXJxKGRldiwgZnMpOworCWlmIChpcSA8IDApCisJCXJldHVybiBpcTsKKworCS8qIElQdjYgZmlsdGVycyBvY2N1cHkgZm91ciBzbG90cyBhbmQgbXVzdCBiZSBhbGlnbmVkIG9uCisJICogZm91ci1zbG90IGJvdW5kYXJpZXMuICBJUHY0IGZpbHRlcnMgb25seSBvY2N1cHkgYSBzaW5nbGUKKwkgKiBzbG90IGFuZCBoYXZlIG5vIGFsaWdubWVudCByZXF1aXJlbWVudHMgYnV0IHdyaXRpbmcgYSBuZXcKKwkgKiBJUHY0IGZpbHRlciBpbnRvIHRoZSBtaWRkbGUgb2YgYW4gZXhpc3RpbmcgSVB2NiBmaWx0ZXIKKwkgKiByZXF1aXJlcyBjbGVhcmluZyB0aGUgb2xkIElQdjYgZmlsdGVyIGFuZCBoZW5jZSB3ZSBwcmV2ZW50CisJICogaW5zZXJ0aW9uLgorCSAqLworCWlmIChmcy0+dHlwZSA9PSAwKSB7IC8qIElQdjQgKi8KKwkJLyogSWYgb3VyIElQdjQgZmlsdGVyIGlzbid0IGJlaW5nIHdyaXR0ZW4gdG8gYQorCQkgKiBtdWx0aXBsZSBvZiBmb3VyIGZpbHRlciBpbmRleCBhbmQgdGhlcmUncyBhbiBJUHY2CisJCSAqIGZpbHRlciBhdCB0aGUgbXVsdGlwbGUgb2YgNCBiYXNlIHNsb3QsIHRoZW4gd2UKKwkJICogcHJldmVudCBpbnNlcnRpb24uCisJCSAqLworCQlmaWR4ID0gZmlsdGVyX2lkICYgfjB4MzsKKwkJaWYgKGZpZHggIT0gZmlsdGVyX2lkICYmCisJCSAgICBhZGFwdGVyLT50aWRzLmZ0aWRfdGFiW2ZpZHhdLmZzLnR5cGUpIHsKKwkJCWYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYltmaWR4XTsKKwkJCWlmIChmLT52YWxpZCkgeworCQkJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsCisJCQkJCSJJbnZhbGlkIGxvY2F0aW9uLiBJUHY2IHJlcXVpcmVzIDQgc2xvdHMgYW5kIGlzIG9jY3VweWluZyBzbG90cyAldSB0byAldVxuIiwKKwkJCQkJZmlkeCwgZmlkeCArIDMpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfSBlbHNlIHsgLyogSVB2NiAqLworCQkvKiBFbnN1cmUgdGhhdCB0aGUgSVB2NiBmaWx0ZXIgaXMgYWxpZ25lZCBvbiBhCisJCSAqIG11bHRpcGxlIG9mIDQgYm91bmRhcnkuCisJCSAqLworCQlpZiAoZmlsdGVyX2lkICYgMHgzKSB7CisJCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LAorCQkJCSJJbnZhbGlkIGxvY2F0aW9uLiBJUHY2IG11c3QgYmUgYWxpZ25lZCBvbiBhIDQtc2xvdCBib3VuZGFyeVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIENoZWNrIGFsbCBleGNlcHQgdGhlIGJhc2Ugb3ZlcmxhcHBpbmcgSVB2NCBmaWx0ZXIgc2xvdHMuICovCisJCWZvciAoZmlkeCA9IGZpbHRlcl9pZCArIDE7IGZpZHggPCBmaWx0ZXJfaWQgKyA0OyBmaWR4KyspIHsKKwkJCWYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYltmaWR4XTsKKwkJCWlmIChmLT52YWxpZCkgeworCQkJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsCisJCQkJCSJJbnZhbGlkIGxvY2F0aW9uLiAgSVB2NiByZXF1aXJlcyA0IHNsb3RzIGFuZCBhbiBJUHY0IGZpbHRlciBleGlzdHMgYXQgJXVcbiIsCisJCQkJCWZpZHgpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfQorCisJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgcHJvdmlkZWQgZmlsdGVyIGluZGV4IGlzIG5vdAorCSAqIGFscmVhZHkgaW4gdXNlIGJ5IHNvbWVvbmUgZWxzZQorCSAqLworCWYgPSAmYWRhcHRlci0+dGlkcy5mdGlkX3RhYltmaWx0ZXJfaWRdOworCWlmIChmLT52YWxpZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWZpZHggPSBmaWx0ZXJfaWQgKyBhZGFwdGVyLT50aWRzLmZ0aWRfYmFzZTsKKwlyZXQgPSBjeGdiNF9zZXRfZnRpZCgmYWRhcHRlci0+dGlkcywgZmlsdGVyX2lkLAorCQkJICAgICBmcy0+dHlwZSA/IFBGX0lORVQ2IDogUEZfSU5FVCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgZmlsdGVyIHJlcXVlc3RlZCBpcyB3cml0YWJsZSAuLi4gKi8KKwlyZXQgPSB3cml0YWJsZV9maWx0ZXIoZik7CisJaWYgKHJldCkgeworCQkvKiBDbGVhciB0aGUgYml0cyB3ZSBoYXZlIHNldCBhYm92ZSAqLworCQljeGdiNF9jbGVhcl9mdGlkKCZhZGFwdGVyLT50aWRzLCBmaWx0ZXJfaWQsCisJCQkJIGZzLT50eXBlID8gUEZfSU5FVDYgOiBQRl9JTkVUKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBDbGVhciBvdXQgYW55IG9sZCByZXNvdXJjZXMgYmVpbmcgdXNlZCBieSB0aGUgZmlsdGVyIGJlZm9yZQorCSAqIHdlIHN0YXJ0IGNvbnN0cnVjdGluZyB0aGUgbmV3IGZpbHRlci4KKwkgKi8KKwlpZiAoZi0+dmFsaWQpCisJCWNsZWFyX2ZpbHRlcihhZGFwdGVyLCBmKTsKKworCS8qIENvbnZlcnQgdGhlIGZpbHRlciBzcGVjaWZpY2F0aW9uIGludG8gb3VyIGludGVybmFsIGZvcm1hdC4KKwkgKiBXZSBjb3B5IHRoZSBQRi9WRiBzcGVjaWZpY2F0aW9uIGludG8gdGhlIE91dGVyIFZMQU4gZmllbGQKKwkgKiBoZXJlIHNvIHRoZSByZXN0IG9mIHRoZSBjb2RlIC0tIGluY2x1ZGluZyB0aGUgaW50ZXJmYWNlIHRvCisJICogdGhlIGZpcm13YXJlIC0tIGRvZXNuJ3QgaGF2ZSB0byBjb25zdGFudGx5IGRvIHRoZXNlIGNoZWNrcy4KKwkgKi8KKwlmLT5mcyA9ICpmczsKKwlmLT5mcy5pcSA9IGlxOworCWYtPmRldiA9IGRldjsKKworCWljb25mID0gYWRhcHRlci0+cGFyYW1zLnRwLmluZ3Jlc3NfY29uZmlnOworCWlmIChpY29uZiAmIFZOSUNfRikgeworCQlmLT5mcy52YWwub3ZsYW4gPSAoZnMtPnZhbC5wZiA8PCAxMykgfCBmcy0+dmFsLnZmOworCQlmLT5mcy5tYXNrLm92bGFuID0gKGZzLT5tYXNrLnBmIDw8IDEzKSB8IGZzLT5tYXNrLnZmOworCQlmLT5mcy52YWwub3ZsYW5fdmxkID0gZnMtPnZhbC5wZnZmX3ZsZDsKKwkJZi0+ZnMubWFzay5vdmxhbl92bGQgPSBmcy0+bWFzay5wZnZmX3ZsZDsKKwl9CisKKwkvKiBBdHRlbXB0IHRvIHNldCB0aGUgZmlsdGVyLiAgSWYgd2UgZG9uJ3Qgc3VjY2VlZCwgd2UgY2xlYXIKKwkgKiBpdCBhbmQgcmV0dXJuIHRoZSBmYWlsdXJlLgorCSAqLworCWYtPmN0eCA9IGN0eDsKKwlmLT50aWQgPSBmaWR4OyAvKiBTYXZlIHRoZSBhY3R1YWwgdGlkICovCisJcmV0ID0gc2V0X2ZpbHRlcl93cihhZGFwdGVyLCBmaWx0ZXJfaWQpOworCWlmIChyZXQpIHsKKwkJY3hnYjRfY2xlYXJfZnRpZCgmYWRhcHRlci0+dGlkcywgZmlsdGVyX2lkLAorCQkJCSBmcy0+dHlwZSA/IFBGX0lORVQ2IDogUEZfSU5FVCk7CisJCWNsZWFyX2ZpbHRlcihhZGFwdGVyLCBmKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBDaGVjayBhIGRlbGV0ZSBmaWx0ZXIgcmVxdWVzdCBmb3IgdmFsaWRpdHkgYW5kIHNlbmQgaXQgdG8gdGhlIGhhcmR3YXJlLgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgYW4gZXJyb3IgbnVtYmVyIG90aGVyd2lzZS4gIFdlIGF0dGFjaCBhbnkgcHJvdmlkZWQKKyAqIGZpbHRlciBvcGVyYXRpb24gY29udGV4dCB0byB0aGUgaW50ZXJuYWwgZmlsdGVyIHNwZWNpZmljYXRpb24gaW4gb3JkZXIgdG8KKyAqIGZhY2lsaXRhdGUgc2lnbmFsaW5nIGNvbXBsZXRpb24gb2YgdGhlIG9wZXJhdGlvbi4KKyAqLworaW50IF9fY3hnYjRfZGVsX2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmlsdGVyX2lkLAorCQkgICAgICAgc3RydWN0IGZpbHRlcl9jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldjJhZGFwKGRldik7CisJc3RydWN0IGZpbHRlcl9lbnRyeSAqZjsKKwl1bnNpZ25lZCBpbnQgbWF4X2ZpZHg7CisJaW50IHJldDsKKworCW1heF9maWR4ID0gYWRhcHRlci0+dGlkcy5uZnRpZHM7CisJaWYgKGZpbHRlcl9pZCAhPSAobWF4X2ZpZHggKyBhZGFwdGVyLT50aWRzLm5zZnRpZHMgLSAxKSAmJgorCSAgICBmaWx0ZXJfaWQgPj0gbWF4X2ZpZHgpCisJCXJldHVybiAtRTJCSUc7CisKKwlmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbZmlsdGVyX2lkXTsKKwlyZXQgPSB3cml0YWJsZV9maWx0ZXIoZik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChmLT52YWxpZCkgeworCQlmLT5jdHggPSBjdHg7CisJCWN4Z2I0X2NsZWFyX2Z0aWQoJmFkYXB0ZXItPnRpZHMsIGZpbHRlcl9pZCwKKwkJCQkgZi0+ZnMudHlwZSA/IFBGX0lORVQ2IDogUEZfSU5FVCk7CisJCXJldHVybiBkZWxfZmlsdGVyX3dyKGFkYXB0ZXIsIGZpbHRlcl9pZCk7CisJfQorCisJLyogSWYgdGhlIGNhbGxlciBoYXMgcGFzc2VkIGluIGEgQ29tcGxldGlvbiBDb250ZXh0IHRoZW4gd2UgbmVlZCB0bworCSAqIG1hcmsgaXQgYXMgYSBzdWNjZXNzZnVsIGNvbXBsZXRpb24gc28gdGhleSBkb24ndCBzdGFsbCB3YWl0aW5nCisJICogZm9yIGl0LgorCSAqLworCWlmIChjdHgpIHsKKwkJY3R4LT5yZXN1bHQgPSAwOworCQljb21wbGV0ZSgmY3R4LT5jb21wbGV0aW9uKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGN4Z2I0X3NldF9maWx0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGZpbHRlcl9pZCwKKwkJICAgICBzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmZzKQoreworCXN0cnVjdCBmaWx0ZXJfY3R4IGN0eDsKKwlpbnQgcmV0OworCisJaW5pdF9jb21wbGV0aW9uKCZjdHguY29tcGxldGlvbik7CisKKwlyZXQgPSBfX2N4Z2I0X3NldF9maWx0ZXIoZGV2LCBmaWx0ZXJfaWQsIGZzLCAmY3R4KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIFdhaXQgZm9yIHJlcGx5ICovCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjdHguY29tcGxldGlvbiwgMTAgKiBIWik7CisJaWYgKCFyZXQpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJcmV0ID0gY3R4LnJlc3VsdDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY3hnYjRfZGVsX2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmlsdGVyX2lkKQoreworCXN0cnVjdCBmaWx0ZXJfY3R4IGN0eDsKKwlpbnQgcmV0OworCisJaW5pdF9jb21wbGV0aW9uKCZjdHguY29tcGxldGlvbik7CisKKwlyZXQgPSBfX2N4Z2I0X2RlbF9maWx0ZXIoZGV2LCBmaWx0ZXJfaWQsICZjdHgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogV2FpdCBmb3IgcmVwbHkgKi8KKwlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmN0eC5jb21wbGV0aW9uLCAxMCAqIEhaKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZXQgPSBjdHgucmVzdWx0Oworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qIEhhbmRsZSBhIGZpbHRlciB3cml0ZS9kZWxldGlvbiByZXBseS4gKi8KK3ZvaWQgZmlsdGVyX3JwbChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgY29uc3Qgc3RydWN0IGNwbF9zZXRfdGNiX3JwbCAqcnBsKQoreworCXVuc2lnbmVkIGludCB0aWQgPSBHRVRfVElEKHJwbCk7CisJc3RydWN0IGZpbHRlcl9lbnRyeSAqZiA9IE5VTEw7CisJdW5zaWduZWQgaW50IG1heF9maWR4OworCWludCBpZHg7CisKKwltYXhfZmlkeCA9IGFkYXAtPnRpZHMubmZ0aWRzICsgYWRhcC0+dGlkcy5uc2Z0aWRzOworCS8qIEdldCB0aGUgY29ycmVzcG9uZGluZyBmaWx0ZXIgZW50cnkgZm9yIHRoaXMgdGlkICovCisJaWYgKGFkYXAtPnRpZHMuZnRpZF90YWIpIHsKKwkJLyogQ2hlY2sgdGhpcyBpbiBub3JtYWwgZmlsdGVyIHJlZ2lvbiAqLworCQlpZHggPSB0aWQgLSBhZGFwLT50aWRzLmZ0aWRfYmFzZTsKKwkJaWYgKGlkeCA+PSBtYXhfZmlkeCkKKwkJCXJldHVybjsKKwkJZiA9ICZhZGFwLT50aWRzLmZ0aWRfdGFiW2lkeF07CisJCWlmIChmLT50aWQgIT0gdGlkKQorCQkJcmV0dXJuOworCX0KKworCS8qIFdlIGZvdW5kIHRoZSBmaWx0ZXIgZW50cnkgZm9yIHRoaXMgdGlkICovCisJaWYgKGYpIHsKKwkJdW5zaWduZWQgaW50IHJldCA9IFRDQl9DT09LSUVfRyhycGwtPmNvb2tpZSk7CisJCXN0cnVjdCBmaWx0ZXJfY3R4ICpjdHg7CisKKwkJLyogUHVsbCBvZmYgYW55IGZpbHRlciBvcGVyYXRpb24gY29udGV4dCBhdHRhY2hlZCB0byB0aGUKKwkJICogZmlsdGVyLgorCQkgKi8KKwkJY3R4ID0gZi0+Y3R4OworCQlmLT5jdHggPSBOVUxMOworCisJCWlmIChyZXQgPT0gRldfRklMVEVSX1dSX0ZMVF9ERUxFVEVEKSB7CisJCQkvKiBDbGVhciB0aGUgZmlsdGVyIHdoZW4gd2UgZ2V0IGNvbmZpcm1hdGlvbiBmcm9tIHRoZQorCQkJICogaGFyZHdhcmUgdGhhdCB0aGUgZmlsdGVyIGhhcyBiZWVuIGRlbGV0ZWQuCisJCQkgKi8KKwkJCWNsZWFyX2ZpbHRlcihhZGFwLCBmKTsKKwkJCWlmIChjdHgpCisJCQkJY3R4LT5yZXN1bHQgPSAwOworCQl9IGVsc2UgaWYgKHJldCA9PSBGV19GSUxURVJfV1JfU01UX1RCTF9GVUxMKSB7CisJCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LCAiZmlsdGVyICV1IHNldHVwIGZhaWxlZCBkdWUgdG8gZnVsbCBTTVRcbiIsCisJCQkJaWR4KTsKKwkJCWNsZWFyX2ZpbHRlcihhZGFwLCBmKTsKKwkJCWlmIChjdHgpCisJCQkJY3R4LT5yZXN1bHQgPSAtRU5PTUVNOworCQl9IGVsc2UgaWYgKHJldCA9PSBGV19GSUxURVJfV1JfRkxUX0FEREVEKSB7CisJCQlmLT5zbXRpZHggPSAoYmU2NF90b19jcHUocnBsLT5vbGR2YWwpID4+IDI0KSAmIDB4ZmY7CisJCQlmLT5wZW5kaW5nID0gMDsgIC8qIGFzeW5jaHJvbm91cyBzZXR1cCBjb21wbGV0ZWQgKi8KKwkJCWYtPnZhbGlkID0gMTsKKwkJCWlmIChjdHgpIHsKKwkJCQljdHgtPnJlc3VsdCA9IDA7CisJCQkJY3R4LT50aWQgPSBpZHg7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gIElzc3VlIGEgd2FybmluZyBhYm91dCB0aGUKKwkJCSAqIHByb2JsZW0gYW5kIGNsZWFyIGV2ZXJ5dGhpbmcgb3V0LgorCQkJICovCisJCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LCAiZmlsdGVyICV1IHNldHVwIGZhaWxlZCB3aXRoIGVycm9yICV1XG4iLAorCQkJCWlkeCwgcmV0KTsKKwkJCWNsZWFyX2ZpbHRlcihhZGFwLCBmKTsKKwkJCWlmIChjdHgpCisJCQkJY3R4LT5yZXN1bHQgPSAtRUlOVkFMOworCQl9CisJCWlmIChjdHgpCisJCQljb21wbGV0ZSgmY3R4LT5jb21wbGV0aW9uKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2ZpbHRlci5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9maWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzc0MmNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9maWx0ZXIuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fQ1hHQjRfRklMVEVSX0gKKyNkZWZpbmUgX19DWEdCNF9GSUxURVJfSAorCisjaW5jbHVkZSAidDRfbXNnLmgiCisKK3ZvaWQgZmlsdGVyX3JwbChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgY29uc3Qgc3RydWN0IGNwbF9zZXRfdGNiX3JwbCAqcnBsKTsKK3ZvaWQgY2xlYXJfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmKTsKKworaW50IHNldF9maWx0ZXJfd3Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCBmaWR4KTsKK2ludCBkZWxldGVfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgZmlkeCk7CisKK2ludCB3cml0YWJsZV9maWx0ZXIoc3RydWN0IGZpbHRlcl9lbnRyeSAqZik7Cit2b2lkIGNsZWFyX2FsbF9maWx0ZXJzKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKKyNlbmRpZiAvKiBfX0NYR0I0X0ZJTFRFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfbWFpbi5jCmluZGV4IGM0NWRlNDkuLmNmMTQ3Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfbWFpbi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC02Nyw2ICs2Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgogCiAjaW5jbHVkZSAiY3hnYjQuaCIKKyNpbmNsdWRlICJjeGdiNF9maWx0ZXIuaCIKICNpbmNsdWRlICJ0NF9yZWdzLmgiCiAjaW5jbHVkZSAidDRfdmFsdWVzLmgiCiAjaW5jbHVkZSAidDRfbXNnLmgiCkBAIC03Niw2ICs3Nyw4IEBACiAjaW5jbHVkZSAiY3hnYjRfZGVidWdmcy5oIgogI2luY2x1ZGUgImNsaXBfdGJsLmgiCiAjaW5jbHVkZSAibDJ0LmgiCisjaW5jbHVkZSAic2NoZWQuaCIKKyNpbmNsdWRlICJjeGdiNF90Y191MzIuaCIKIAogY2hhciBjeGdiNF9kcml2ZXJfbmFtZVtdID0gS0JVSUxEX01PRE5BTUU7CiAKQEAgLTg2LDMwICs4OSw2IEBACiBjb25zdCBjaGFyIGN4Z2I0X2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKICNkZWZpbmUgRFJWX0RFU0MgIkNoZWxzaW8gVDQvVDUvVDYgTmV0d29yayBEcml2ZXIiCiAKLS8qIEhvc3Qgc2hhZG93IGNvcHkgb2YgaW5ncmVzcyBmaWx0ZXIgZW50cnkuICBUaGlzIGlzIGluIGhvc3QgbmF0aXZlIGZvcm1hdAotICogYW5kIGRvZXNuJ3QgbWF0Y2ggdGhlIG9yZGVyaW5nIG9yIGJpdCBvcmRlciwgZXRjLiBvZiB0aGUgaGFyZHdhcmUgb2YgdGhlCi0gKiBmaXJtd2FyZSBjb21tYW5kLiAgVGhlIHVzZSBvZiBiaXQtZmllbGQgc3RydWN0dXJlIGVsZW1lbnRzIGlzIHB1cmVseSB0bwotICogcmVtaW5kIG91cnNlbHZlcyBvZiB0aGUgZmllbGQgc2l6ZSBsaW1pdGF0aW9ucyBhbmQgc2F2ZSBtZW1vcnkgaW4gdGhlIGNhc2UKLSAqIHdoZXJlIHRoZSBmaWx0ZXIgdGFibGUgaXMgbGFyZ2UuCi0gKi8KLXN0cnVjdCBmaWx0ZXJfZW50cnkgewotCS8qIEFkbWluaXN0cmF0aXZlIGZpZWxkcyBmb3IgZmlsdGVyLgotCSAqLwotCXUzMiB2YWxpZDoxOyAgICAgICAgICAgIC8qIGZpbHRlciBhbGxvY2F0ZWQgYW5kIHZhbGlkICovCi0JdTMyIGxvY2tlZDoxOyAgICAgICAgICAgLyogZmlsdGVyIGlzIGFkbWluaXN0cmF0aXZlbHkgbG9ja2VkICovCi0KLQl1MzIgcGVuZGluZzoxOyAgICAgICAgICAvKiBmaWx0ZXIgYWN0aW9uIGlzIHBlbmRpbmcgZmlybXdhcmUgcmVwbHkgKi8KLQl1MzIgc210aWR4Ojg7ICAgICAgICAgICAvKiBTb3VyY2UgTUFDIFRhYmxlIGluZGV4IGZvciBzbWFjICovCi0Jc3RydWN0IGwydF9lbnRyeSAqbDJ0OyAgLyogTGF5ZXIgVHdvIFRhYmxlIGVudHJ5IGZvciBkbWFjICovCi0KLQkvKiBUaGUgZmlsdGVyIGl0c2VsZi4gIE1vc3Qgb2YgdGhpcyBpcyBhIHN0cmFpZ2h0IGNvcHkgb2YgaW5mb3JtYXRpb24KLQkgKiBwcm92aWRlZCBieSB0aGUgZXh0ZW5kZWQgaW9jdGwoKS4gIFNvbWUgZmllbGRzIGFyZSB0cmFuc2xhdGVkIHRvCi0JICogaW50ZXJuYWwgZm9ybXMgLS0gZm9yIGluc3RhbmNlIHRoZSBJbmdyZXNzIFF1ZXVlIElEIHBhc3NlZCBpbiBmcm9tCi0JICogdGhlIGlvY3RsKCkgaXMgdHJhbnNsYXRlZCBpbnRvIHRoZSBBYnNvbHV0ZSBJbmdyZXNzIFF1ZXVlIElELgotCSAqLwotCXN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiBmczsKLX07Ci0KICNkZWZpbmUgREZMVF9NU0dfRU5BQkxFIChORVRJRl9NU0dfRFJWIHwgTkVUSUZfTVNHX1BST0JFIHwgTkVUSUZfTVNHX0xJTksgfCBcCiAJCQkgTkVUSUZfTVNHX1RJTUVSIHwgTkVUSUZfTVNHX0lGRE9XTiB8IE5FVElGX01TR19JRlVQIHxcCiAJCQkgTkVUSUZfTVNHX1JYX0VSUiB8IE5FVElGX01TR19UWF9FUlIpCkBAIC0yMjMsMTMgKzIwMiw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjeGdiNF9kZWJ1Z2ZzX3Jvb3Q7CiAKLXN0YXRpYyBMSVNUX0hFQUQoYWRhcHRlcl9saXN0KTsKLXN0YXRpYyBERUZJTkVfTVVURVgodWxkX211dGV4KTsKLS8qIEFkYXB0ZXIgbGlzdCB0byBiZSBhY2Nlc3NlZCBmcm9tIGF0b21pYyBjb250ZXh0ICovCi1zdGF0aWMgTElTVF9IRUFEKGFkYXBfcmN1X2xpc3QpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhhZGFwX3JjdV9sb2NrKTsKLXN0YXRpYyBzdHJ1Y3QgY3hnYjRfdWxkX2luZm8gdWxkc1tDWEdCNF9VTERfTUFYXTsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB1bGRfc3RyW10gPSB7ICJSRE1BIiwgImlTQ1NJIiwgImlTQ1NJVCIgfTsKK0xJU1RfSEVBRChhZGFwdGVyX2xpc3QpOworREVGSU5FX01VVEVYKHVsZF9tdXRleCk7CiAKIHN0YXRpYyB2b2lkIGxpbmtfcmVwb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0zMDMsMTEgKzI3Nyw5IEBACiAJCQl0eHEtPmRjYl9wcmlvID0gdmFsdWU7CiAJfQogfQotI2VuZGlmIC8qIENPTkZJR19DSEVMU0lPX1Q0X0RDQiAqLwogCi1pbnQgY3hnYjRfZGNiX2VuYWJsZWQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgY3hnYjRfZGNiX2VuYWJsZWQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLSNpZmRlZiBDT05GSUdfQ0hFTFNJT19UNF9EQ0IKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAoIXBpLT5kY2IuZW5hYmxlZCkKQEAgLTMxNSwxMSArMjg3LDggQEAKIAogCXJldHVybiAoKHBpLT5kY2Iuc3RhdGUgPT0gQ1hHQjRfRENCX1NUQVRFX0ZXX0FMTFNZTkNFRCkgfHwKIAkJKHBpLT5kY2Iuc3RhdGUgPT0gQ1hHQjRfRENCX1NUQVRFX0hPU1QpKTsKLSNlbHNlCi0JcmV0dXJuIDA7Ci0jZW5kaWYKIH0KLUVYUE9SVF9TWU1CT0woY3hnYjRfZGNiX2VuYWJsZWQpOworI2VuZGlmIC8qIENPTkZJR19DSEVMU0lPX1Q0X0RDQiAqLwogCiB2b2lkIHQ0X29zX2xpbmtfY2hhbmdlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IHBvcnRfaWQsIGludCBsaW5rX3N0YXQpCiB7CkBAIC01MzEsNjYgKzUwMCw2IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0NIRUxTSU9fVDRfRENCICovCiAKLS8qIENsZWFyIGEgZmlsdGVyIGFuZCByZWxlYXNlIGFueSBvZiBpdHMgcmVzb3VyY2VzIHRoYXQgd2Ugb3duLiAgVGhpcyBhbHNvCi0gKiBjbGVhcnMgdGhlIGZpbHRlcidzICJwZW5kaW5nIiBzdGF0dXMuCi0gKi8KLXN0YXRpYyB2b2lkIGNsZWFyX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IGZpbHRlcl9lbnRyeSAqZikKLXsKLQkvKiBJZiB0aGUgbmV3IG9yIG9sZCBmaWx0ZXIgaGF2ZSBsb29wYmFjayByZXdyaXRlaW5nIHJ1bGVzIHRoZW4gd2UnbGwKLQkgKiBuZWVkIHRvIGZyZWUgYW55IGV4aXN0aW5nIExheWVyIFR3byBUYWJsZSAoTDJUKSBlbnRyaWVzIG9mIHRoZSBvbGQKLQkgKiBmaWx0ZXIgcnVsZS4gIFRoZSBmaXJtd2FyZSB3aWxsIGhhbmRsZSBmcmVlaW5nIHVwIGFueSBTb3VyY2UgTUFDCi0JICogVGFibGUgKFNNVCkgZW50cmllcyB1c2VkIGZvciByZXdyaXRpbmcgU291cmNlIE1BQyBBZGRyZXNzZXMgaW4KLQkgKiBsb29wYmFjayBydWxlcy4KLQkgKi8KLQlpZiAoZi0+bDJ0KQotCQljeGdiNF9sMnRfcmVsZWFzZShmLT5sMnQpOwotCi0JLyogVGhlIHplcm9pbmcgb2YgdGhlIGZpbHRlciBydWxlIGJlbG93IGNsZWFycyB0aGUgZmlsdGVyIHZhbGlkLAotCSAqIHBlbmRpbmcsIGxvY2tlZCBmbGFncywgbDJ0IHBvaW50ZXIsIGV0Yy4gc28gaXQncyBhbGwgd2UgbmVlZCBmb3IKLQkgKiB0aGlzIG9wZXJhdGlvbi4KLQkgKi8KLQltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7Ci19Ci0KLS8qIEhhbmRsZSBhIGZpbHRlciB3cml0ZS9kZWxldGlvbiByZXBseS4KLSAqLwotc3RhdGljIHZvaWQgZmlsdGVyX3JwbChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgY29uc3Qgc3RydWN0IGNwbF9zZXRfdGNiX3JwbCAqcnBsKQotewotCXVuc2lnbmVkIGludCBpZHggPSBHRVRfVElEKHJwbCk7Ci0JdW5zaWduZWQgaW50IG5pZHggPSBpZHggLSBhZGFwLT50aWRzLmZ0aWRfYmFzZTsKLQl1bnNpZ25lZCBpbnQgcmV0OwotCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmY7Ci0KLQlpZiAoaWR4ID49IGFkYXAtPnRpZHMuZnRpZF9iYXNlICYmIG5pZHggPAotCSAgIChhZGFwLT50aWRzLm5mdGlkcyArIGFkYXAtPnRpZHMubnNmdGlkcykpIHsKLQkJaWR4ID0gbmlkeDsKLQkJcmV0ID0gVENCX0NPT0tJRV9HKHJwbC0+Y29va2llKTsKLQkJZiA9ICZhZGFwLT50aWRzLmZ0aWRfdGFiW2lkeF07Ci0KLQkJaWYgKHJldCA9PSBGV19GSUxURVJfV1JfRkxUX0RFTEVURUQpIHsKLQkJCS8qIENsZWFyIHRoZSBmaWx0ZXIgd2hlbiB3ZSBnZXQgY29uZmlybWF0aW9uIGZyb20gdGhlCi0JCQkgKiBoYXJkd2FyZSB0aGF0IHRoZSBmaWx0ZXIgaGFzIGJlZW4gZGVsZXRlZC4KLQkJCSAqLwotCQkJY2xlYXJfZmlsdGVyKGFkYXAsIGYpOwotCQl9IGVsc2UgaWYgKHJldCA9PSBGV19GSUxURVJfV1JfU01UX1RCTF9GVUxMKSB7Ci0JCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LCAiZmlsdGVyICV1IHNldHVwIGZhaWxlZCBkdWUgdG8gZnVsbCBTTVRcbiIsCi0JCQkJaWR4KTsKLQkJCWNsZWFyX2ZpbHRlcihhZGFwLCBmKTsKLQkJfSBlbHNlIGlmIChyZXQgPT0gRldfRklMVEVSX1dSX0ZMVF9BRERFRCkgewotCQkJZi0+c210aWR4ID0gKGJlNjRfdG9fY3B1KHJwbC0+b2xkdmFsKSA+PiAyNCkgJiAweGZmOwotCQkJZi0+cGVuZGluZyA9IDA7ICAvKiBhc3luY2hyb25vdXMgc2V0dXAgY29tcGxldGVkICovCi0JCQlmLT52YWxpZCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBTb21ldGhpbmcgd2VudCB3cm9uZy4gIElzc3VlIGEgd2FybmluZyBhYm91dCB0aGUKLQkJCSAqIHByb2JsZW0gYW5kIGNsZWFyIGV2ZXJ5dGhpbmcgb3V0LgotCQkJICovCi0JCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LCAiZmlsdGVyICV1IHNldHVwIGZhaWxlZCB3aXRoIGVycm9yICV1XG4iLAotCQkJCWlkeCwgcmV0KTsKLQkJCWNsZWFyX2ZpbHRlcihhZGFwLCBmKTsKLQkJfQotCX0KLX0KLQogLyogUmVzcG9uc2UgcXVldWUgaGFuZGxlciBmb3IgdGhlIEZXIGV2ZW50IHF1ZXVlLgogICovCiBzdGF0aWMgaW50IGZ3ZXZ0cV9oYW5kbGVyKHN0cnVjdCBzZ2VfcnNwcSAqcSwgY29uc3QgX19iZTY0ICpyc3AsCkBAIC02NzcsNTYgKzU4Niw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIEZsdXNoIHRoZSBhZ2dyZWdhdGVkIGxybyBzZXNzaW9ucyAqLwotc3RhdGljIHZvaWQgdWxkcnhfZmx1c2hfaGFuZGxlcihzdHJ1Y3Qgc2dlX3JzcHEgKnEpCi17Ci0JaWYgKHVsZHNbcS0+dWxkXS5scm9fZmx1c2gpCi0JCXVsZHNbcS0+dWxkXS5scm9fZmx1c2goJnEtPmxyb19tZ3IpOwotfQotCi0vKioKLSAqCXVsZHJ4X2hhbmRsZXIgLSByZXNwb25zZSBxdWV1ZSBoYW5kbGVyIGZvciBVTEQgcXVldWVzCi0gKglAcTogdGhlIHJlc3BvbnNlIHF1ZXVlIHRoYXQgcmVjZWl2ZWQgdGhlIHBhY2tldAotICoJQHJzcDogdGhlIHJlc3BvbnNlIHF1ZXVlIGRlc2NyaXB0b3IgaG9sZGluZyB0aGUgb2ZmbG9hZCBtZXNzYWdlCi0gKglAZ2w6IHRoZSBnYXRoZXIgbGlzdCBvZiBwYWNrZXQgZnJhZ21lbnRzCi0gKgotICoJRGVsaXZlciBhbiBpbmdyZXNzIG9mZmxvYWQgcGFja2V0IHRvIGEgVUxELiAgQWxsIHByb2Nlc3NpbmcgaXMgZG9uZSBieQotICoJdGhlIFVMRCwgd2UganVzdCBtYWludGFpbiBzdGF0aXN0aWNzLgotICovCi1zdGF0aWMgaW50IHVsZHJ4X2hhbmRsZXIoc3RydWN0IHNnZV9yc3BxICpxLCBjb25zdCBfX2JlNjQgKnJzcCwKLQkJCSBjb25zdCBzdHJ1Y3QgcGt0X2dsICpnbCkKLXsKLQlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyeHEgPSBjb250YWluZXJfb2YocSwgc3RydWN0IHNnZV9vZmxkX3J4cSwgcnNwcSk7Ci0JaW50IHJldDsKLQotCS8qIEZXIGNhbiBzZW5kIENQTHMgZW5jYXBzdWxhdGVkIGluIGEgQ1BMX0ZXNF9NU0cuCi0JICovCi0JaWYgKCgoY29uc3Qgc3RydWN0IHJzc19oZWFkZXIgKilyc3ApLT5vcGNvZGUgPT0gQ1BMX0ZXNF9NU0cgJiYKLQkgICAgKChjb25zdCBzdHJ1Y3QgY3BsX2Z3NF9tc2cgKikocnNwICsgMSkpLT50eXBlID09IEZXX1RZUEVfUlNTQ1BMKQotCQlyc3AgKz0gMjsKLQotCWlmIChxLT5mbHVzaF9oYW5kbGVyKQotCQlyZXQgPSB1bGRzW3EtPnVsZF0ubHJvX3J4X2hhbmRsZXIocS0+YWRhcC0+dWxkX2hhbmRsZVtxLT51bGRdLAotCQkJCQkJICByc3AsIGdsLCAmcS0+bHJvX21nciwKLQkJCQkJCSAgJnEtPm5hcGkpOwotCWVsc2UKLQkJcmV0ID0gdWxkc1txLT51bGRdLnJ4X2hhbmRsZXIocS0+YWRhcC0+dWxkX2hhbmRsZVtxLT51bGRdLAotCQkJCQkgICAgICByc3AsIGdsKTsKLQotCWlmIChyZXQpIHsKLQkJcnhxLT5zdGF0cy5ub21lbSsrOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYgKGdsID09IE5VTEwpCi0JCXJ4cS0+c3RhdHMuaW1tKys7Ci0JZWxzZSBpZiAoZ2wgPT0gQ1hHQjRfTVNHX0FOKQotCQlyeHEtPnN0YXRzLmFuKys7Ci0JZWxzZQotCQlyeHEtPnN0YXRzLnBrdHMrKzsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgZGlzYWJsZV9tc2koc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgVVNJTkdfTVNJWCkgewpAQCAtNzc4LDMwICs2MzcsMTIgQEAKIAkJCXNucHJpbnRmKGFkYXAtPm1zaXhfaW5mb1ttc2lfaWR4XS5kZXNjLCBuLCAiJXMtUnglZCIsCiAJCQkJIGQtPm5hbWUsIGkpOwogCX0KLQotCS8qIG9mZmxvYWQgcXVldWVzICovCi0JZm9yX2VhY2hfaXNjc2lyeHEoJmFkYXAtPnNnZSwgaSkKLQkJc25wcmludGYoYWRhcC0+bXNpeF9pbmZvW21zaV9pZHgrK10uZGVzYywgbiwgIiVzLWlzY3NpJWQiLAotCQkJIGFkYXAtPnBvcnRbMF0tPm5hbWUsIGkpOwotCi0JZm9yX2VhY2hfaXNjc2l0cnhxKCZhZGFwLT5zZ2UsIGkpCi0JCXNucHJpbnRmKGFkYXAtPm1zaXhfaW5mb1ttc2lfaWR4KytdLmRlc2MsIG4sICIlcy1pU0NTSVQlZCIsCi0JCQkgYWRhcC0+cG9ydFswXS0+bmFtZSwgaSk7Ci0KLQlmb3JfZWFjaF9yZG1hcnhxKCZhZGFwLT5zZ2UsIGkpCi0JCXNucHJpbnRmKGFkYXAtPm1zaXhfaW5mb1ttc2lfaWR4KytdLmRlc2MsIG4sICIlcy1yZG1hJWQiLAotCQkJIGFkYXAtPnBvcnRbMF0tPm5hbWUsIGkpOwotCi0JZm9yX2VhY2hfcmRtYWNpcSgmYWRhcC0+c2dlLCBpKQotCQlzbnByaW50ZihhZGFwLT5tc2l4X2luZm9bbXNpX2lkeCsrXS5kZXNjLCBuLCAiJXMtcmRtYS1jaXElZCIsCi0JCQkgYWRhcC0+cG9ydFswXS0+bmFtZSwgaSk7CiB9CiAKIHN0YXRpYyBpbnQgcmVxdWVzdF9tc2l4X3F1ZXVlX2lycXMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7Ci0JaW50IGVyciwgZXRocWlkeCwgaXNjc2lxaWR4ID0gMCwgcmRtYXFpZHggPSAwLCByZG1hY2lxcWlkeCA9IDA7Ci0JaW50IGlzY3NpdHFpZHggPSAwOworCWludCBlcnIsIGV0aHFpZHg7CiAJaW50IG1zaV9pbmRleCA9IDI7CiAKIAllcnIgPSByZXF1ZXN0X2lycShhZGFwLT5tc2l4X2luZm9bMV0udmVjLCB0NF9zZ2VfaW50cl9tc2l4LCAwLApAQCAtODE4LDU3ICs2NTksOSBAQAogCQkJZ290byB1bndpbmQ7CiAJCW1zaV9pbmRleCsrOwogCX0KLQlmb3JfZWFjaF9pc2NzaXJ4cShzLCBpc2NzaXFpZHgpIHsKLQkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleF0udmVjLAotCQkJCSAgdDRfc2dlX2ludHJfbXNpeCwgMCwKLQkJCQkgIGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXhdLmRlc2MsCi0JCQkJICAmcy0+aXNjc2lyeHFbaXNjc2lxaWR4XS5yc3BxKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gdW53aW5kOwotCQltc2lfaW5kZXgrKzsKLQl9Ci0JZm9yX2VhY2hfaXNjc2l0cnhxKHMsIGlzY3NpdHFpZHgpIHsKLQkJZXJyID0gcmVxdWVzdF9pcnEoYWRhcC0+bXNpeF9pbmZvW21zaV9pbmRleF0udmVjLAotCQkJCSAgdDRfc2dlX2ludHJfbXNpeCwgMCwKLQkJCQkgIGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXhdLmRlc2MsCi0JCQkJICAmcy0+aXNjc2l0cnhxW2lzY3NpdHFpZHhdLnJzcHEpOwotCQlpZiAoZXJyKQotCQkJZ290byB1bndpbmQ7Ci0JCW1zaV9pbmRleCsrOwotCX0KLQlmb3JfZWFjaF9yZG1hcnhxKHMsIHJkbWFxaWR4KSB7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXhdLnZlYywKLQkJCQkgIHQ0X3NnZV9pbnRyX21zaXgsIDAsCi0JCQkJICBhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4XS5kZXNjLAotCQkJCSAgJnMtPnJkbWFyeHFbcmRtYXFpZHhdLnJzcHEpOwotCQlpZiAoZXJyKQotCQkJZ290byB1bndpbmQ7Ci0JCW1zaV9pbmRleCsrOwotCX0KLQlmb3JfZWFjaF9yZG1hY2lxKHMsIHJkbWFjaXFxaWR4KSB7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXhdLnZlYywKLQkJCQkgIHQ0X3NnZV9pbnRyX21zaXgsIDAsCi0JCQkJICBhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4XS5kZXNjLAotCQkJCSAgJnMtPnJkbWFjaXFbcmRtYWNpcXFpZHhdLnJzcHEpOwotCQlpZiAoZXJyKQotCQkJZ290byB1bndpbmQ7Ci0JCW1zaV9pbmRleCsrOwotCX0KIAlyZXR1cm4gMDsKIAogdW53aW5kOgotCXdoaWxlICgtLXJkbWFjaXFxaWR4ID49IDApCi0JCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1stLW1zaV9pbmRleF0udmVjLAotCQkJICZzLT5yZG1hY2lxW3JkbWFjaXFxaWR4XS5yc3BxKTsKLQl3aGlsZSAoLS1yZG1hcWlkeCA+PSAwKQotCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bLS1tc2lfaW5kZXhdLnZlYywKLQkJCSAmcy0+cmRtYXJ4cVtyZG1hcWlkeF0ucnNwcSk7Ci0Jd2hpbGUgKC0taXNjc2l0cWlkeCA+PSAwKQotCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bLS1tc2lfaW5kZXhdLnZlYywKLQkJCSAmcy0+aXNjc2l0cnhxW2lzY3NpdHFpZHhdLnJzcHEpOwotCXdoaWxlICgtLWlzY3NpcWlkeCA+PSAwKQotCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bLS1tc2lfaW5kZXhdLnZlYywKLQkJCSAmcy0+aXNjc2lyeHFbaXNjc2lxaWR4XS5yc3BxKTsKIAl3aGlsZSAoLS1ldGhxaWR4ID49IDApCiAJCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1stLW1zaV9pbmRleF0udmVjLAogCQkJICZzLT5ldGhyeHFbZXRocWlkeF0ucnNwcSk7CkBAIC04ODQsMTYgKzY3Nyw2IEBACiAJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvWzFdLnZlYywgJnMtPmZ3X2V2dHEpOwogCWZvcl9lYWNoX2V0aHJ4cShzLCBpKQogCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4KytdLnZlYywgJnMtPmV0aHJ4cVtpXS5yc3BxKTsKLQlmb3JfZWFjaF9pc2NzaXJ4cShzLCBpKQotCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4KytdLnZlYywKLQkJCSAmcy0+aXNjc2lyeHFbaV0ucnNwcSk7Ci0JZm9yX2VhY2hfaXNjc2l0cnhxKHMsIGkpCi0JCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1ttc2lfaW5kZXgrK10udmVjLAotCQkJICZzLT5pc2NzaXRyeHFbaV0ucnNwcSk7Ci0JZm9yX2VhY2hfcmRtYXJ4cShzLCBpKQotCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4KytdLnZlYywgJnMtPnJkbWFyeHFbaV0ucnNwcSk7Ci0JZm9yX2VhY2hfcmRtYWNpcShzLCBpKQotCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9bbXNpX2luZGV4KytdLnZlYywgJnMtPnJkbWFjaXFbaV0ucnNwcSk7CiB9CiAKIC8qKgpAQCAtMTAzMiwyOCArODE1LDMwIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGFsbG9jX29mbGRfcnhxcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9vZmxkX3J4cSAqcSwKLQkJCSAgIHVuc2lnbmVkIGludCBucSwgdW5zaWduZWQgaW50IHBlcl9jaGFuLCBpbnQgbXNpX2lkeCwKLQkJCSAgIHUxNiAqaWRzLCBib29sIGxybykKLXsKLQlpbnQgaSwgZXJyOwogCi0JZm9yIChpID0gMDsgaSA8IG5xOyBpKyssIHErKykgewotCQlpZiAobXNpX2lkeCA+IDApCi0JCQltc2lfaWR4Kys7Ci0JCWVyciA9IHQ0X3NnZV9hbGxvY19yeHEoYWRhcCwgJnEtPnJzcHEsIGZhbHNlLAotCQkJCSAgICAgICBhZGFwLT5wb3J0W2kgLyBwZXJfY2hhbl0sCi0JCQkJICAgICAgIG1zaV9pZHgsIHEtPmZsLnNpemUgPyAmcS0+ZmwgOiBOVUxMLAotCQkJCSAgICAgICB1bGRyeF9oYW5kbGVyLAotCQkJCSAgICAgICBscm8gPyB1bGRyeF9mbHVzaF9oYW5kbGVyIDogTlVMTCwKLQkJCQkgICAgICAgMCk7CitzdGF0aWMgaW50IHNldHVwX2Z3X3NnZV9xdWV1ZXMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7CisJaW50IGVyciA9IDA7CisKKwliaXRtYXBfemVybyhzLT5zdGFydmluZ19mbCwgcy0+ZWdyX3N6KTsKKwliaXRtYXBfemVybyhzLT50eHFfbWFwZXJyLCBzLT5lZ3Jfc3opOworCisJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJYWRhcC0+bXNpX2lkeCA9IDE7ICAgICAgICAgLyogdmVjdG9yIDAgaXMgZm9yIG5vbi1xdWV1ZSBpbnRlcnJ1cHRzICovCisJZWxzZSB7CisJCWVyciA9IHQ0X3NnZV9hbGxvY19yeHEoYWRhcCwgJnMtPmludHJxLCBmYWxzZSwgYWRhcC0+cG9ydFswXSwgMCwKKwkJCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgLTEpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKLQkJbWVtc2V0KCZxLT5zdGF0cywgMCwgc2l6ZW9mKHEtPnN0YXRzKSk7Ci0JCWlmIChpZHMpCi0JCQlpZHNbaV0gPSBxLT5yc3BxLmFic19pZDsKKwkJYWRhcC0+bXNpX2lkeCA9IC0oKGludClzLT5pbnRycS5hYnNfaWQgKyAxKTsKIAl9Ci0JcmV0dXJuIDA7CisKKwllcnIgPSB0NF9zZ2VfYWxsb2NfcnhxKGFkYXAsICZzLT5md19ldnRxLCB0cnVlLCBhZGFwLT5wb3J0WzBdLAorCQkJICAgICAgIGFkYXAtPm1zaV9pZHgsIE5VTEwsIGZ3ZXZ0cV9oYW5kbGVyLCBOVUxMLCAtMSk7CisJaWYgKGVycikKKwkJdDRfZnJlZV9zZ2VfcmVzb3VyY2VzKGFkYXApOworCXJldHVybiBlcnI7CiB9CiAKIC8qKgpAQCAtMTA2Niw0MSArODUxLDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgc2V0dXBfc2dlX3F1ZXVlcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKIHsKLQlpbnQgZXJyLCBtc2lfaWR4LCBpLCBqOworCWludCBlcnIsIGksIGo7CiAJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7Ci0KLQliaXRtYXBfemVybyhzLT5zdGFydmluZ19mbCwgcy0+ZWdyX3N6KTsKLQliaXRtYXBfemVybyhzLT50eHFfbWFwZXJyLCBzLT5lZ3Jfc3opOwotCi0JaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkKLQkJbXNpX2lkeCA9IDE7ICAgICAgICAgLyogdmVjdG9yIDAgaXMgZm9yIG5vbi1xdWV1ZSBpbnRlcnJ1cHRzICovCi0JZWxzZSB7Ci0JCWVyciA9IHQ0X3NnZV9hbGxvY19yeHEoYWRhcCwgJnMtPmludHJxLCBmYWxzZSwgYWRhcC0+cG9ydFswXSwgMCwKLQkJCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgLTEpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJbXNpX2lkeCA9IC0oKGludClzLT5pbnRycS5hYnNfaWQgKyAxKTsKLQl9Ci0KLQkvKiBOT1RFOiBJZiB5b3UgYWRkL2RlbGV0ZSBhbnkgSW5ncmVzcy9FZ3Jlc3MgUXVldWUgYWxsb2NhdGlvbnMgaW4gaGVyZSwKLQkgKiBkb24ndCBmb3JnZXQgdG8gdXBkYXRlIHRoZSBmb2xsb3dpbmcgd2hpY2ggbmVlZCB0byBiZQotCSAqIHN5bmNocm9uaXplZCB0byBhbmQgY2hhbmdlcyBoZXJlLgotCSAqCi0JICogMS4gVGhlIGNhbGN1bGF0aW9ucyBvZiBNQVhfSU5HUSBpbiBjeGdiNC5oLgotCSAqCi0JICogMi4gVXBkYXRlIGVuYWJsZV9tc2l4L25hbWVfbXNpeF92ZWNzL3JlcXVlc3RfbXNpeF9xdWV1ZV9pcnFzCi0JICogICAgdG8gYWNjb21tb2RhdGUgYW55IG5ldy9kZWxldGVkIEluZ3Jlc3MgUXVldWVzCi0JICogICAgd2hpY2ggbmVlZCBNU0ktWCBWZWN0b3JzLgotCSAqCi0JICogMy4gVXBkYXRlIHNnZV9xaW5mb19zaG93KCkgdG8gaW5jbHVkZSBpbmZvcm1hdGlvbiBvbiB0aGUKLQkgKiAgICBuZXcvZGVsZXRlZCBxdWV1ZXMuCi0JICovCi0JZXJyID0gdDRfc2dlX2FsbG9jX3J4cShhZGFwLCAmcy0+ZndfZXZ0cSwgdHJ1ZSwgYWRhcC0+cG9ydFswXSwKLQkJCSAgICAgICBtc2lfaWR4LCBOVUxMLCBmd2V2dHFfaGFuZGxlciwgTlVMTCwgLTEpOwotCWlmIChlcnIpIHsKLWZyZWVvdXQ6CXQ0X2ZyZWVfc2dlX3Jlc291cmNlcyhhZGFwKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvID0gcy0+dWxkX3J4cV9pbmZvW0NYR0I0X1VMRF9SRE1BXTsKKwl1bnNpZ25lZCBpbnQgY21wbHFpZCA9IDA7CiAKIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXAtPnBvcnRbaV07CkBAIC0xMTA5LDEwICs4NjMsMTAgQEAKIAkJc3RydWN0IHNnZV9ldGhfdHhxICp0ID0gJnMtPmV0aHR4cVtwaS0+Zmlyc3RfcXNldF07CiAKIAkJZm9yIChqID0gMDsgaiA8IHBpLT5ucXNldHM7IGorKywgcSsrKSB7Ci0JCQlpZiAobXNpX2lkeCA+IDApCi0JCQkJbXNpX2lkeCsrOworCQkJaWYgKGFkYXAtPm1zaV9pZHggPiAwKQorCQkJCWFkYXAtPm1zaV9pZHgrKzsKIAkJCWVyciA9IHQ0X3NnZV9hbGxvY19yeHEoYWRhcCwgJnEtPnJzcHEsIGZhbHNlLCBkZXYsCi0JCQkJCSAgICAgICBtc2lfaWR4LCAmcS0+ZmwsCisJCQkJCSAgICAgICBhZGFwLT5tc2lfaWR4LCAmcS0+ZmwsCiAJCQkJCSAgICAgICB0NF9ldGhyeF9oYW5kbGVyLAogCQkJCQkgICAgICAgTlVMTCwKIAkJCQkJICAgICAgIHQ0X2dldF9tcHNfYmdfbWFwKGFkYXAsCkBAIC0xMTMxLDggKzg4NSw4IEBACiAJCX0KIAl9CiAKLQlqID0gcy0+aXNjc2lxc2V0cyAvIGFkYXAtPnBhcmFtcy5ucG9ydHM7IC8qIGlzY3NpIHF1ZXVlcyBwZXIgY2hhbm5lbCAqLwotCWZvcl9lYWNoX2lzY3NpcnhxKHMsIGkpIHsKKwlqID0gcy0+b2ZsZHFzZXRzIC8gYWRhcC0+cGFyYW1zLm5wb3J0czsgLyogaXNjc2kgcXVldWVzIHBlciBjaGFubmVsICovCisJZm9yX2VhY2hfb2ZsZHR4cShzLCBpKSB7CiAJCWVyciA9IHQ0X3NnZV9hbGxvY19vZmxkX3R4cShhZGFwLCAmcy0+b2ZsZHR4cVtpXSwKIAkJCQkJICAgIGFkYXAtPnBvcnRbaSAvIGpdLAogCQkJCQkgICAgcy0+ZndfZXZ0cS5jbnR4dF9pZCk7CkBAIC0xMTQwLDMwICs4OTQsMTUgQEAKIAkJCWdvdG8gZnJlZW91dDsKIAl9CiAKLSNkZWZpbmUgQUxMT0NfT0ZMRF9SWFFTKGZpcnN0cSwgbnEsIHBlcl9jaGFuLCBpZHMsIGxybykgZG8geyBcCi0JZXJyID0gYWxsb2Nfb2ZsZF9yeHFzKGFkYXAsIGZpcnN0cSwgbnEsIHBlcl9jaGFuLCBtc2lfaWR4LCBpZHMsIGxybyk7IFwKLQlpZiAoZXJyKSBcCi0JCWdvdG8gZnJlZW91dDsgXAotCWlmIChtc2lfaWR4ID4gMCkgXAotCQltc2lfaWR4ICs9IG5xOyBcCi19IHdoaWxlICgwKQotCi0JQUxMT0NfT0ZMRF9SWFFTKHMtPmlzY3NpcnhxLCBzLT5pc2NzaXFzZXRzLCBqLCBzLT5pc2NzaV9yeHEsIGZhbHNlKTsKLQlBTExPQ19PRkxEX1JYUVMocy0+aXNjc2l0cnhxLCBzLT5uaXNjc2l0cSwgaiwgcy0+aXNjc2l0X3J4cSwgdHJ1ZSk7Ci0JQUxMT0NfT0ZMRF9SWFFTKHMtPnJkbWFyeHEsIHMtPnJkbWFxcywgMSwgcy0+cmRtYV9yeHEsIGZhbHNlKTsKLQlqID0gcy0+cmRtYWNpcXMgLyBhZGFwLT5wYXJhbXMubnBvcnRzOyAvKiByZG1hcSBxdWV1ZXMgcGVyIGNoYW5uZWwgKi8KLQlBTExPQ19PRkxEX1JYUVMocy0+cmRtYWNpcSwgcy0+cmRtYWNpcXMsIGosIHMtPnJkbWFfY2lxLCBmYWxzZSk7Ci0KLSN1bmRlZiBBTExPQ19PRkxEX1JYUVMKLQogCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgewotCQkvKgotCQkgKiBOb3RlIHRoYXQgLT5yZG1hcnhxW2ldLnJzcHEuY250eHRfaWQgYmVsb3cgaXMgMCBpZiB3ZSBkb24ndAorCQkvKiBOb3RlIHRoYXQgY21wbHFpZCBiZWxvdyBpcyAwIGlmIHdlIGRvbid0CiAJCSAqIGhhdmUgUkRNQSBxdWV1ZXMsIGFuZCB0aGF0J3MgdGhlIHJpZ2h0IHZhbHVlLgogCQkgKi8KKwkJaWYgKHJ4cV9pbmZvKQorCQkJY21wbHFpZAk9IHJ4cV9pbmZvLT51bGRyeHFbaV0ucnNwcS5jbnR4dF9pZDsKKwogCQllcnIgPSB0NF9zZ2VfYWxsb2NfY3RybF90eHEoYWRhcCwgJnMtPmN0cmxxW2ldLCBhZGFwLT5wb3J0W2ldLAotCQkJCQkgICAgcy0+ZndfZXZ0cS5jbnR4dF9pZCwKLQkJCQkJICAgIHMtPnJkbWFyeHFbaV0ucnNwcS5jbnR4dF9pZCk7CisJCQkJCSAgICBzLT5md19ldnRxLmNudHh0X2lkLCBjbXBscWlkKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZnJlZW91dDsKIAl9CkBAIC0xMTc0LDYgKzkxMyw5IEBACiAJCSAgICAgUlNTQ09OVFJPTF9WKG5ldGRldjJwaW5mbyhhZGFwLT5wb3J0WzBdKS0+dHhfY2hhbikgfAogCQkgICAgIFFVRVVFTlVNQkVSX1Yocy0+ZXRocnhxWzBdLnJzcHEuYWJzX2lkKSk7CiAJcmV0dXJuIDA7CitmcmVlb3V0OgorCXQ0X2ZyZWVfc2dlX3Jlc291cmNlcyhhZGFwKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtMTE5NywxNTEgKzkzOSw2IEBACiAJa3ZmcmVlKGFkZHIpOwogfQogCi0vKiBTZW5kIGEgV29yayBSZXF1ZXN0IHRvIHdyaXRlIHRoZSBmaWx0ZXIgYXQgYSBzcGVjaWZpZWQgaW5kZXguICBXZSBjb25zdHJ1Y3QKLSAqIGEgRmlybXdhcmUgRmlsdGVyIFdvcmsgUmVxdWVzdCB0byBoYXZlIHRoZSB3b3JrIGRvbmUgYW5kIHB1dCB0aGUgaW5kaWNhdGVkCi0gKiBmaWx0ZXIgaW50byAicGVuZGluZyIgbW9kZSB3aGljaCB3aWxsIHByZXZlbnQgYW55IGZ1cnRoZXIgYWN0aW9ucyBhZ2FpbnN0Ci0gKiBpdCB0aWxsIHdlIGdldCBhIHJlcGx5IGZyb20gdGhlIGZpcm13YXJlIG9uIHRoZSBjb21wbGV0aW9uIHN0YXR1cyBvZiB0aGUKLSAqIHJlcXVlc3QuCi0gKi8KLXN0YXRpYyBpbnQgc2V0X2ZpbHRlcl93cihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgaW50IGZpZHgpCi17Ci0Jc3RydWN0IGZpbHRlcl9lbnRyeSAqZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiW2ZpZHhdOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGZ3X2ZpbHRlcl93ciAqZndyOwotCXVuc2lnbmVkIGludCBmdGlkOwotCi0Jc2tiID0gYWxsb2Nfc2tiKHNpemVvZigqZndyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFza2IpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogSWYgdGhlIG5ldyBmaWx0ZXIgcmVxdWlyZXMgbG9vcGJhY2sgRGVzdGluYXRpb24gTUFDIGFuZC9vciBWTEFOCi0JICogcmV3cml0aW5nIHRoZW4gd2UgbmVlZCB0byBhbGxvY2F0ZSBhIExheWVyIDIgVGFibGUgKEwyVCkgZW50cnkgZm9yCi0JICogdGhlIGZpbHRlci4KLQkgKi8KLQlpZiAoZi0+ZnMubmV3ZG1hYyB8fCBmLT5mcy5uZXd2bGFuKSB7Ci0JCS8qIGFsbG9jYXRlIEwyVCBlbnRyeSBmb3IgbmV3IGZpbHRlciAqLwotCQlmLT5sMnQgPSB0NF9sMnRfYWxsb2Nfc3dpdGNoaW5nKGFkYXB0ZXIsIGYtPmZzLnZsYW4sCi0JCQkJCQlmLT5mcy5lcG9ydCwgZi0+ZnMuZG1hYyk7Ci0JCWlmIChmLT5sMnQgPT0gTlVMTCkgewotCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCX0KLQotCWZ0aWQgPSBhZGFwdGVyLT50aWRzLmZ0aWRfYmFzZSArIGZpZHg7Ci0KLQlmd3IgPSAoc3RydWN0IGZ3X2ZpbHRlcl93ciAqKV9fc2tiX3B1dChza2IsIHNpemVvZigqZndyKSk7Ci0JbWVtc2V0KGZ3ciwgMCwgc2l6ZW9mKCpmd3IpKTsKLQotCS8qIEl0IHdvdWxkIGJlIG5pY2UgdG8gcHV0IG1vc3Qgb2YgdGhlIGZvbGxvd2luZyBpbiB0NF9ody5jIGJ1dCBtb3N0Ci0JICogb2YgdGhlIHdvcmsgaXMgdHJhbnNsYXRpbmcgdGhlIGN4Z2J0b29sIGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uCi0JICogaW50byB0aGUgV29yayBSZXF1ZXN0IGFuZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGF0IHN0cnVjdHVyZSBpcwotCSAqIGN1cnJlbnRseSBpbiBjeGdidG9vbC5oIHdoaWNoIGlzbid0IGFwcHJvcHJpYXRlIHRvIHB1bGwgaW50byB0aGUKLQkgKiBjb21tb24gY29kZS4gIFdlIG1heSBldmVudHVhbGx5IHRyeSB0byBjb21lIHVwIHdpdGggYSBtb3JlIG5ldXRyYWwKLQkgKiBmaWx0ZXIgc3BlY2lmaWNhdGlvbiBzdHJ1Y3R1cmUgYnV0IGZvciBub3cgaXQncyBlYXNpZXN0IHRvIHNpbXBseQotCSAqIHB1dCB0aGlzIGZhaXJseSBkaXJlY3QgY29kZSBpbiBsaW5lIC4uLgotCSAqLwotCWZ3ci0+b3BfcGtkID0gaHRvbmwoRldfV1JfT1BfVihGV19GSUxURVJfV1IpKTsKLQlmd3ItPmxlbjE2X3BrZCA9IGh0b25sKEZXX1dSX0xFTjE2X1Yoc2l6ZW9mKCpmd3IpLzE2KSk7Ci0JZndyLT50aWRfdG9faXEgPQotCQlodG9ubChGV19GSUxURVJfV1JfVElEX1YoZnRpZCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfUlFUWVBFX1YoZi0+ZnMudHlwZSkgfAotCQkgICAgICBGV19GSUxURVJfV1JfTk9SRVBMWV9WKDApIHwKLQkJICAgICAgRldfRklMVEVSX1dSX0lRX1YoZi0+ZnMuaXEpKTsKLQlmd3ItPmRlbF9maWx0ZXJfdG9fbDJ0aXggPQotCQlodG9ubChGV19GSUxURVJfV1JfUlBUVElEX1YoZi0+ZnMucnB0dGlkKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9EUk9QX1YoZi0+ZnMuYWN0aW9uID09IEZJTFRFUl9EUk9QKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9ESVJTVEVFUl9WKGYtPmZzLmRpcnN0ZWVyKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9NQVNLSEFTSF9WKGYtPmZzLm1hc2toYXNoKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9ESVJTVEVFUkhBU0hfVihmLT5mcy5kaXJzdGVlcmhhc2gpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX0xQQktfVihmLT5mcy5hY3Rpb24gPT0gRklMVEVSX1NXSVRDSCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfRE1BQ19WKGYtPmZzLm5ld2RtYWMpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX1NNQUNfVihmLT5mcy5uZXdzbWFjKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9JTlNWTEFOX1YoZi0+ZnMubmV3dmxhbiA9PSBWTEFOX0lOU0VSVCB8fAotCQkJCQkgICAgIGYtPmZzLm5ld3ZsYW4gPT0gVkxBTl9SRVdSSVRFKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9STVZMQU5fVihmLT5mcy5uZXd2bGFuID09IFZMQU5fUkVNT1ZFIHx8Ci0JCQkJCSAgICBmLT5mcy5uZXd2bGFuID09IFZMQU5fUkVXUklURSkgfAotCQkgICAgICBGV19GSUxURVJfV1JfSElUQ05UU19WKGYtPmZzLmhpdGNudHMpIHwKLQkJICAgICAgRldfRklMVEVSX1dSX1RYQ0hBTl9WKGYtPmZzLmVwb3J0KSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9QUklPX1YoZi0+ZnMucHJpbykgfAotCQkgICAgICBGV19GSUxURVJfV1JfTDJUSVhfVihmLT5sMnQgPyBmLT5sMnQtPmlkeCA6IDApKTsKLQlmd3ItPmV0aHR5cGUgPSBodG9ucyhmLT5mcy52YWwuZXRodHlwZSk7Ci0JZndyLT5ldGh0eXBlbSA9IGh0b25zKGYtPmZzLm1hc2suZXRodHlwZSk7Ci0JZndyLT5mcmFnX3RvX292bGFuX3ZsZG0gPQotCQkoRldfRklMVEVSX1dSX0ZSQUdfVihmLT5mcy52YWwuZnJhZykgfAotCQkgRldfRklMVEVSX1dSX0ZSQUdNX1YoZi0+ZnMubWFzay5mcmFnKSB8Ci0JCSBGV19GSUxURVJfV1JfSVZMQU5fVkxEX1YoZi0+ZnMudmFsLml2bGFuX3ZsZCkgfAotCQkgRldfRklMVEVSX1dSX09WTEFOX1ZMRF9WKGYtPmZzLnZhbC5vdmxhbl92bGQpIHwKLQkJIEZXX0ZJTFRFUl9XUl9JVkxBTl9WTERNX1YoZi0+ZnMubWFzay5pdmxhbl92bGQpIHwKLQkJIEZXX0ZJTFRFUl9XUl9PVkxBTl9WTERNX1YoZi0+ZnMubWFzay5vdmxhbl92bGQpKTsKLQlmd3ItPnNtYWNfc2VsID0gMDsKLQlmd3ItPnJ4X2NoYW5fcnhfcnBsX2lxID0KLQkJaHRvbnMoRldfRklMVEVSX1dSX1JYX0NIQU5fVigwKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9SWF9SUExfSVFfVihhZGFwdGVyLT5zZ2UuZndfZXZ0cS5hYnNfaWQpKTsKLQlmd3ItPm1hY2lfdG9fbWF0Y2h0eXBlbSA9Ci0JCWh0b25sKEZXX0ZJTFRFUl9XUl9NQUNJX1YoZi0+ZnMudmFsLm1hY2lkeCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfTUFDSU1fVihmLT5mcy5tYXNrLm1hY2lkeCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfRkNPRV9WKGYtPmZzLnZhbC5mY29lKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9GQ09FTV9WKGYtPmZzLm1hc2suZmNvZSkgfAotCQkgICAgICBGV19GSUxURVJfV1JfUE9SVF9WKGYtPmZzLnZhbC5pcG9ydCkgfAotCQkgICAgICBGV19GSUxURVJfV1JfUE9SVE1fVihmLT5mcy5tYXNrLmlwb3J0KSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9NQVRDSFRZUEVfVihmLT5mcy52YWwubWF0Y2h0eXBlKSB8Ci0JCSAgICAgIEZXX0ZJTFRFUl9XUl9NQVRDSFRZUEVNX1YoZi0+ZnMubWFzay5tYXRjaHR5cGUpKTsKLQlmd3ItPnB0Y2wgPSBmLT5mcy52YWwucHJvdG87Ci0JZndyLT5wdGNsbSA9IGYtPmZzLm1hc2sucHJvdG87Ci0JZndyLT50dHlwID0gZi0+ZnMudmFsLnRvczsKLQlmd3ItPnR0eXBtID0gZi0+ZnMubWFzay50b3M7Ci0JZndyLT5pdmxhbiA9IGh0b25zKGYtPmZzLnZhbC5pdmxhbik7Ci0JZndyLT5pdmxhbm0gPSBodG9ucyhmLT5mcy5tYXNrLml2bGFuKTsKLQlmd3ItPm92bGFuID0gaHRvbnMoZi0+ZnMudmFsLm92bGFuKTsKLQlmd3ItPm92bGFubSA9IGh0b25zKGYtPmZzLm1hc2sub3ZsYW4pOwotCW1lbWNweShmd3ItPmxpcCwgZi0+ZnMudmFsLmxpcCwgc2l6ZW9mKGZ3ci0+bGlwKSk7Ci0JbWVtY3B5KGZ3ci0+bGlwbSwgZi0+ZnMubWFzay5saXAsIHNpemVvZihmd3ItPmxpcG0pKTsKLQltZW1jcHkoZndyLT5maXAsIGYtPmZzLnZhbC5maXAsIHNpemVvZihmd3ItPmZpcCkpOwotCW1lbWNweShmd3ItPmZpcG0sIGYtPmZzLm1hc2suZmlwLCBzaXplb2YoZndyLT5maXBtKSk7Ci0JZndyLT5scCA9IGh0b25zKGYtPmZzLnZhbC5scG9ydCk7Ci0JZndyLT5scG0gPSBodG9ucyhmLT5mcy5tYXNrLmxwb3J0KTsKLQlmd3ItPmZwID0gaHRvbnMoZi0+ZnMudmFsLmZwb3J0KTsKLQlmd3ItPmZwbSA9IGh0b25zKGYtPmZzLm1hc2suZnBvcnQpOwotCWlmIChmLT5mcy5uZXdzbWFjKQotCQltZW1jcHkoZndyLT5zbWEsIGYtPmZzLnNtYWMsIHNpemVvZihmd3ItPnNtYSkpOwotCi0JLyogTWFyayB0aGUgZmlsdGVyIGFzICJwZW5kaW5nIiBhbmQgc2hpcCBvZmYgdGhlIEZpbHRlciBXb3JrIFJlcXVlc3QuCi0JICogV2hlbiB3ZSBnZXQgdGhlIFdvcmsgUmVxdWVzdCBSZXBseSB3ZSdsbCBjbGVhciB0aGUgcGVuZGluZyBzdGF0dXMuCi0JICovCi0JZi0+cGVuZGluZyA9IDE7Ci0Jc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9DT05UUk9MLCBmLT5mcy52YWwuaXBvcnQgJiAweDMpOwotCXQ0X29mbGRfc2VuZChhZGFwdGVyLCBza2IpOwotCXJldHVybiAwOwotfQotCi0vKiBEZWxldGUgdGhlIGZpbHRlciBhdCBhIHNwZWNpZmllZCBpbmRleC4KLSAqLwotc3RhdGljIGludCBkZWxfZmlsdGVyX3dyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBpbnQgZmlkeCkKLXsKLQlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmID0gJmFkYXB0ZXItPnRpZHMuZnRpZF90YWJbZmlkeF07Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgZndfZmlsdGVyX3dyICpmd3I7Ci0JdW5zaWduZWQgaW50IGxlbiwgZnRpZDsKLQotCWxlbiA9IHNpemVvZigqZndyKTsKLQlmdGlkID0gYWRhcHRlci0+dGlkcy5mdGlkX2Jhc2UgKyBmaWR4OwotCi0Jc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFza2IpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZndyID0gKHN0cnVjdCBmd19maWx0ZXJfd3IgKilfX3NrYl9wdXQoc2tiLCBsZW4pOwotCXQ0X21rX2ZpbHRkZWx3cihmdGlkLCBmd3IsIGFkYXB0ZXItPnNnZS5md19ldnRxLmFic19pZCk7Ci0KLQkvKiBNYXJrIHRoZSBmaWx0ZXIgYXMgInBlbmRpbmciIGFuZCBzaGlwIG9mZiB0aGUgRmlsdGVyIFdvcmsgUmVxdWVzdC4KLQkgKiBXaGVuIHdlIGdldCB0aGUgV29yayBSZXF1ZXN0IFJlcGx5IHdlJ2xsIGNsZWFyIHRoZSBwZW5kaW5nIHN0YXR1cy4KLQkgKi8KLQlmLT5wZW5kaW5nID0gMTsKLQl0NF9tZ210X3R4KGFkYXB0ZXIsIHNrYik7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB1MTYgY3hnYl9zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgdm9pZCAqYWNjZWxfcHJpdiwgc2VsZWN0X3F1ZXVlX2ZhbGxiYWNrX3QgZmFsbGJhY2spCiB7CkBAIC0xNzIzLDE5ICsxMzIwLDIyIEBACiAgKi8KIHN0YXRpYyBpbnQgdGlkX2luaXQoc3RydWN0IHRpZF9pbmZvICp0KQogewotCXNpemVfdCBzaXplOwotCXVuc2lnbmVkIGludCBzdGlkX2JtYXBfc2l6ZTsKLQl1bnNpZ25lZCBpbnQgbmF0aWRzID0gdC0+bmF0aWRzOwogCXN0cnVjdCBhZGFwdGVyICphZGFwID0gY29udGFpbmVyX29mKHQsIHN0cnVjdCBhZGFwdGVyLCB0aWRzKTsKKwl1bnNpZ25lZCBpbnQgbWF4X2Z0aWRzID0gdC0+bmZ0aWRzICsgdC0+bnNmdGlkczsKKwl1bnNpZ25lZCBpbnQgbmF0aWRzID0gdC0+bmF0aWRzOworCXVuc2lnbmVkIGludCBzdGlkX2JtYXBfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnRpZF9ibWFwX3NpemU7CisJc2l6ZV90IHNpemU7CiAKIAlzdGlkX2JtYXBfc2l6ZSA9IEJJVFNfVE9fTE9OR1ModC0+bnN0aWRzICsgdC0+bnNmdGlkcyk7CisJZnRpZF9ibWFwX3NpemUgPSBCSVRTX1RPX0xPTkdTKHQtPm5mdGlkcyk7CiAJc2l6ZSA9IHQtPm50aWRzICogc2l6ZW9mKCp0LT50aWRfdGFiKSArCiAJICAgICAgIG5hdGlkcyAqIHNpemVvZigqdC0+YXRpZF90YWIpICsKIAkgICAgICAgdC0+bnN0aWRzICogc2l6ZW9mKCp0LT5zdGlkX3RhYikgKwogCSAgICAgICB0LT5uc2Z0aWRzICogc2l6ZW9mKCp0LT5zdGlkX3RhYikgKwogCSAgICAgICBzdGlkX2JtYXBfc2l6ZSAqIHNpemVvZihsb25nKSArCi0JICAgICAgIHQtPm5mdGlkcyAqIHNpemVvZigqdC0+ZnRpZF90YWIpICsKLQkgICAgICAgdC0+bnNmdGlkcyAqIHNpemVvZigqdC0+ZnRpZF90YWIpOworCSAgICAgICBtYXhfZnRpZHMgKiBzaXplb2YoKnQtPmZ0aWRfdGFiKSArCisJICAgICAgIGZ0aWRfYm1hcF9zaXplICogc2l6ZW9mKGxvbmcpOwogCiAJdC0+dGlkX3RhYiA9IHQ0X2FsbG9jX21lbShzaXplKTsKIAlpZiAoIXQtPnRpZF90YWIpCkBAIC0xNzQ1LDggKzEzNDUsMTAgQEAKIAl0LT5zdGlkX3RhYiA9IChzdHJ1Y3Qgc2Vydl9lbnRyeSAqKSZ0LT5hdGlkX3RhYltuYXRpZHNdOwogCXQtPnN0aWRfYm1hcCA9ICh1bnNpZ25lZCBsb25nICopJnQtPnN0aWRfdGFiW3QtPm5zdGlkcyArIHQtPm5zZnRpZHNdOwogCXQtPmZ0aWRfdGFiID0gKHN0cnVjdCBmaWx0ZXJfZW50cnkgKikmdC0+c3RpZF9ibWFwW3N0aWRfYm1hcF9zaXplXTsKKwl0LT5mdGlkX2JtYXAgPSAodW5zaWduZWQgbG9uZyAqKSZ0LT5mdGlkX3RhYlttYXhfZnRpZHNdOwogCXNwaW5fbG9ja19pbml0KCZ0LT5zdGlkX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZ0LT5hdGlkX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZ0LT5mdGlkX2xvY2spOwogCiAJdC0+c3RpZHNfaW5fdXNlID0gMDsKIAl0LT5zZnRpZHNfaW5fdXNlID0gMDsKQEAgLTE3NjEsMTIgKzEzNjMsMTYgQEAKIAkJCXQtPmF0aWRfdGFiW25hdGlkcyAtIDFdLm5leHQgPSAmdC0+YXRpZF90YWJbbmF0aWRzXTsKIAkJdC0+YWZyZWUgPSB0LT5hdGlkX3RhYjsKIAl9Ci0JYml0bWFwX3plcm8odC0+c3RpZF9ibWFwLCB0LT5uc3RpZHMgKyB0LT5uc2Z0aWRzKTsKLQkvKiBSZXNlcnZlIHN0aWQgMCBmb3IgVDQvVDUgYWRhcHRlcnMgKi8KLQlpZiAoIXQtPnN0aWRfYmFzZSAmJgotCSAgICAoQ0hFTFNJT19DSElQX1ZFUlNJT04oYWRhcC0+cGFyYW1zLmNoaXApIDw9IENIRUxTSU9fVDUpKQotCQlfX3NldF9iaXQoMCwgdC0+c3RpZF9ibWFwKTsKIAorCWlmIChpc19vZmZsb2FkKGFkYXApKSB7CisJCWJpdG1hcF96ZXJvKHQtPnN0aWRfYm1hcCwgdC0+bnN0aWRzICsgdC0+bnNmdGlkcyk7CisJCS8qIFJlc2VydmUgc3RpZCAwIGZvciBUNC9UNSBhZGFwdGVycyAqLworCQlpZiAoIXQtPnN0aWRfYmFzZSAmJgorCQkgICAgQ0hFTFNJT19DSElQX1ZFUlNJT04oYWRhcC0+cGFyYW1zLmNoaXApIDw9IENIRUxTSU9fVDUpCisJCQlfX3NldF9iaXQoMCwgdC0+c3RpZF9ibWFwKTsKKwl9CisKKwliaXRtYXBfemVybyh0LT5mdGlkX2JtYXAsIHQtPm5mdGlkcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIzMTYsNyArMTkyMiw3IEBACiAKIAlmb3JfZWFjaF9ldGhyeHEoJmFkYXAtPnNnZSwgaSkKIAkJZGlzYWJsZV90eHFfZGIoJmFkYXAtPnNnZS5ldGh0eHFbaV0ucSk7Ci0JZm9yX2VhY2hfaXNjc2lyeHEoJmFkYXAtPnNnZSwgaSkKKwlmb3JfZWFjaF9vZmxkdHhxKCZhZGFwLT5zZ2UsIGkpCiAJCWRpc2FibGVfdHhxX2RiKCZhZGFwLT5zZ2Uub2ZsZHR4cVtpXS5xKTsKIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpCiAJCWRpc2FibGVfdHhxX2RiKCZhZGFwLT5zZ2UuY3RybHFbaV0ucSk7CkBAIC0yMzI4LDcgKzE5MzQsNyBAQAogCiAJZm9yX2VhY2hfZXRocnhxKCZhZGFwLT5zZ2UsIGkpCiAJCWVuYWJsZV90eHFfZGIoYWRhcCwgJmFkYXAtPnNnZS5ldGh0eHFbaV0ucSk7Ci0JZm9yX2VhY2hfaXNjc2lyeHEoJmFkYXAtPnNnZSwgaSkKKwlmb3JfZWFjaF9vZmxkdHhxKCZhZGFwLT5zZ2UsIGkpCiAJCWVuYWJsZV90eHFfZGIoYWRhcCwgJmFkYXAtPnNnZS5vZmxkdHhxW2ldLnEpOwogCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkKIAkJZW5hYmxlX3R4cV9kYihhZGFwLCAmYWRhcC0+c2dlLmN0cmxxW2ldLnEpOwpAQCAtMjMzNiw5ICsxOTQyLDEwIEBACiAKIHN0YXRpYyB2b2lkIG5vdGlmeV9yZG1hX3VsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgZW51bSBjeGdiNF9jb250cm9sIGNtZCkKIHsKLQlpZiAoYWRhcC0+dWxkX2hhbmRsZVtDWEdCNF9VTERfUkRNQV0pCi0JCXVsZHNbQ1hHQjRfVUxEX1JETUFdLmNvbnRyb2woYWRhcC0+dWxkX2hhbmRsZVtDWEdCNF9VTERfUkRNQV0sCi0JCQkJY21kKTsKKwllbnVtIGN4Z2I0X3VsZCB0eXBlID0gQ1hHQjRfVUxEX1JETUE7CisKKwlpZiAoYWRhcC0+dWxkICYmIGFkYXAtPnVsZFt0eXBlXS5oYW5kbGUpCisJCWFkYXAtPnVsZFt0eXBlXS5jb250cm9sKGFkYXAtPnVsZFt0eXBlXS5oYW5kbGUsIGNtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIHByb2Nlc3NfZGJfZnVsbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0yMzkyLDEzICsxOTk5LDE0IEBACiAJaWYgKHJldCkKIAkJQ0hfV0FSTihhZGFwLCAiREIgZHJvcCByZWNvdmVyeSBmYWlsZWQuXG4iKTsKIH0KKwogc3RhdGljIHZvaWQgcmVjb3Zlcl9hbGxfcXVldWVzKHN0cnVjdCBhZGFwdGVyICphZGFwKQogewogCWludCBpOwogCiAJZm9yX2VhY2hfZXRocnhxKCZhZGFwLT5zZ2UsIGkpCiAJCXN5bmNfdHhxX3BpZHgoYWRhcCwgJmFkYXAtPnNnZS5ldGh0eHFbaV0ucSk7Ci0JZm9yX2VhY2hfaXNjc2lyeHEoJmFkYXAtPnNnZSwgaSkKKwlmb3JfZWFjaF9vZmxkdHhxKCZhZGFwLT5zZ2UsIGkpCiAJCXN5bmNfdHhxX3BpZHgoYWRhcCwgJmFkYXAtPnNnZS5vZmxkdHhxW2ldLnEpOwogCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkKIAkJc3luY190eHFfcGlkeChhZGFwLCAmYWRhcC0+c2dlLmN0cmxxW2ldLnEpOwpAQCAtMjQ2Myw5NCArMjA3MSwxMiBAQAogCXF1ZXVlX3dvcmsoYWRhcC0+d29ya3EsICZhZGFwLT5kYl9kcm9wX3Rhc2spOwogfQogCi1zdGF0aWMgdm9pZCB1bGRfYXR0YWNoKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkKQordm9pZCB0NF9yZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcih2b2lkKQogewotCXZvaWQgKmhhbmRsZTsKLQlzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gbGxpOwotCXVuc2lnbmVkIHNob3J0IGk7Ci0KLQlsbGkucGRldiA9IGFkYXAtPnBkZXY7Ci0JbGxpLnBmID0gYWRhcC0+cGY7Ci0JbGxpLmwydCA9IGFkYXAtPmwydDsKLQlsbGkudGlkcyA9ICZhZGFwLT50aWRzOwotCWxsaS5wb3J0cyA9IGFkYXAtPnBvcnQ7Ci0JbGxpLnZyID0gJmFkYXAtPnZyZXM7Ci0JbGxpLm10dXMgPSBhZGFwLT5wYXJhbXMubXR1czsKLQlpZiAodWxkID09IENYR0I0X1VMRF9SRE1BKSB7Ci0JCWxsaS5yeHFfaWRzID0gYWRhcC0+c2dlLnJkbWFfcnhxOwotCQlsbGkuY2lxX2lkcyA9IGFkYXAtPnNnZS5yZG1hX2NpcTsKLQkJbGxpLm5yeHEgPSBhZGFwLT5zZ2UucmRtYXFzOwotCQlsbGkubmNpcSA9IGFkYXAtPnNnZS5yZG1hY2lxczsKLQl9IGVsc2UgaWYgKHVsZCA9PSBDWEdCNF9VTERfSVNDU0kpIHsKLQkJbGxpLnJ4cV9pZHMgPSBhZGFwLT5zZ2UuaXNjc2lfcnhxOwotCQlsbGkubnJ4cSA9IGFkYXAtPnNnZS5pc2NzaXFzZXRzOwotCX0gZWxzZSBpZiAodWxkID09IENYR0I0X1VMRF9JU0NTSVQpIHsKLQkJbGxpLnJ4cV9pZHMgPSBhZGFwLT5zZ2UuaXNjc2l0X3J4cTsKLQkJbGxpLm5yeHEgPSBhZGFwLT5zZ2UubmlzY3NpdHE7Ci0JfQotCWxsaS5udHhxID0gYWRhcC0+c2dlLmlzY3NpcXNldHM7Ci0JbGxpLm5jaGFuID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKLQlsbGkubnBvcnRzID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKLQlsbGkud3JfY3JlZCA9IGFkYXAtPnBhcmFtcy5vZmxkcV93cl9jcmVkOwotCWxsaS5hZGFwdGVyX3R5cGUgPSBhZGFwLT5wYXJhbXMuY2hpcDsKLQlsbGkuaXNjc2lfaW9sZW4gPSBNQVhSWERBVEFfRyh0NF9yZWFkX3JlZyhhZGFwLCBUUF9QQVJBX1JFRzJfQSkpOwotCWxsaS5pc2NzaV90YWdtYXNrID0gdDRfcmVhZF9yZWcoYWRhcCwgVUxQX1JYX0lTQ1NJX1RBR01BU0tfQSk7Ci0JbGxpLmlzY3NpX3Bnc3pfb3JkZXIgPSB0NF9yZWFkX3JlZyhhZGFwLCBVTFBfUlhfSVNDU0lfUFNaX0EpOwotCWxsaS5pc2NzaV9sbGltaXQgPSB0NF9yZWFkX3JlZyhhZGFwLCBVTFBfUlhfSVNDU0lfTExJTUlUX0EpOwotCWxsaS5pc2NzaV9wcG0gPSAmYWRhcC0+aXNjc2lfcHBtOwotCWxsaS5jY2xrX3BzID0gMTAwMDAwMDAwMCAvIGFkYXAtPnBhcmFtcy52cGQuY2NsazsKLQlsbGkudWRiX2RlbnNpdHkgPSAxIDw8IGFkYXAtPnBhcmFtcy5zZ2UuZXFfcXBwOwotCWxsaS51Y3FfZGVuc2l0eSA9IDEgPDwgYWRhcC0+cGFyYW1zLnNnZS5pcV9xcHA7Ci0JbGxpLmZpbHRfbW9kZSA9IGFkYXAtPnBhcmFtcy50cC52bGFuX3ByaV9tYXA7Ci0JLyogTU9EUV9SRVFfTUFQIHNldHMgcXVldWVzIDAtMyB0byBjaGFuIDAtMyAqLwotCWZvciAoaSA9IDA7IGkgPCBOQ0hBTjsgaSsrKQotCQlsbGkudHhfbW9kcVtpXSA9IGk7Ci0JbGxpLmd0c19yZWcgPSBhZGFwLT5yZWdzICsgTVlQRl9SRUcoU0dFX1BGX0dUU19BKTsKLQlsbGkuZGJfcmVnID0gYWRhcC0+cmVncyArIE1ZUEZfUkVHKFNHRV9QRl9LRE9PUkJFTExfQSk7Ci0JbGxpLmZ3X3ZlcnMgPSBhZGFwLT5wYXJhbXMuZndfdmVyczsKLQlsbGkuZGJmaWZvX2ludF90aHJlc2ggPSBkYmZpZm9faW50X3RocmVzaDsKLQlsbGkuc2dlX2luZ3BhZGJvdW5kYXJ5ID0gYWRhcC0+c2dlLmZsX2FsaWduOwotCWxsaS5zZ2VfZWdyc3RhdHVzcGFnZXNpemUgPSBhZGFwLT5zZ2Uuc3RhdF9sZW47Ci0JbGxpLnNnZV9wa3RzaGlmdCA9IGFkYXAtPnNnZS5wa3RzaGlmdDsKLQlsbGkuZW5hYmxlX2Z3X29mbGRfY29ubiA9IGFkYXAtPmZsYWdzICYgRldfT0ZMRF9DT05OOwotCWxsaS5tYXhfb3JkaXJkX3FwID0gYWRhcC0+cGFyYW1zLm1heF9vcmRpcmRfcXA7Ci0JbGxpLm1heF9pcmRfYWRhcHRlciA9IGFkYXAtPnBhcmFtcy5tYXhfaXJkX2FkYXB0ZXI7Ci0JbGxpLnVscHR4X21lbXdyaXRlX2RzZ2wgPSBhZGFwLT5wYXJhbXMudWxwdHhfbWVtd3JpdGVfZHNnbDsKLQlsbGkubm9kZWlkID0gZGV2X3RvX25vZGUoYWRhcC0+cGRldl9kZXYpOwotCi0JaGFuZGxlID0gdWxkc1t1bGRdLmFkZCgmbGxpKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJZGV2X3dhcm4oYWRhcC0+cGRldl9kZXYsCi0JCQkgImNvdWxkIG5vdCBhdHRhY2ggdG8gdGhlICVzIGRyaXZlciwgZXJyb3IgJWxkXG4iLAotCQkJIHVsZF9zdHJbdWxkXSwgUFRSX0VSUihoYW5kbGUpKTsKLQkJcmV0dXJuOwotCX0KLQotCWFkYXAtPnVsZF9oYW5kbGVbdWxkXSA9IGhhbmRsZTsKLQogCWlmICghbmV0ZXZlbnRfcmVnaXN0ZXJlZCkgewogCQlyZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcigmY3hnYjRfbmV0ZXZlbnRfbmIpOwogCQluZXRldmVudF9yZWdpc3RlcmVkID0gdHJ1ZTsKIAl9Ci0KLQlpZiAoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKLQkJdWxkc1t1bGRdLnN0YXRlX2NoYW5nZShoYW5kbGUsIENYR0I0X1NUQVRFX1VQKTsKLX0KLQotc3RhdGljIHZvaWQgYXR0YWNoX3VsZHMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlzcGluX2xvY2soJmFkYXBfcmN1X2xvY2spOwotCWxpc3RfYWRkX3RhaWxfcmN1KCZhZGFwLT5yY3Vfbm9kZSwgJmFkYXBfcmN1X2xpc3QpOwotCXNwaW5fdW5sb2NrKCZhZGFwX3JjdV9sb2NrKTsKLQotCW11dGV4X2xvY2soJnVsZF9tdXRleCk7Ci0JbGlzdF9hZGRfdGFpbCgmYWRhcC0+bGlzdF9ub2RlLCAmYWRhcHRlcl9saXN0KTsKLQlmb3IgKGkgPSAwOyBpIDwgQ1hHQjRfVUxEX01BWDsgaSsrKQotCQlpZiAodWxkc1tpXS5hZGQpCi0JCQl1bGRfYXR0YWNoKGFkYXAsIGkpOwotCW11dGV4X3VubG9jaygmdWxkX211dGV4KTsKIH0KIAogc3RhdGljIHZvaWQgZGV0YWNoX3VsZHMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCkBAIC0yNTYwLDIwICsyMDg2LDE2IEBACiAJbXV0ZXhfbG9jaygmdWxkX211dGV4KTsKIAlsaXN0X2RlbCgmYWRhcC0+bGlzdF9ub2RlKTsKIAlmb3IgKGkgPSAwOyBpIDwgQ1hHQjRfVUxEX01BWDsgaSsrKQotCQlpZiAoYWRhcC0+dWxkX2hhbmRsZVtpXSkgewotCQkJdWxkc1tpXS5zdGF0ZV9jaGFuZ2UoYWRhcC0+dWxkX2hhbmRsZVtpXSwKKwkJaWYgKGFkYXAtPnVsZCAmJiBhZGFwLT51bGRbaV0uaGFuZGxlKSB7CisJCQlhZGFwLT51bGRbaV0uc3RhdGVfY2hhbmdlKGFkYXAtPnVsZFtpXS5oYW5kbGUsCiAJCQkJCSAgICAgQ1hHQjRfU1RBVEVfREVUQUNIKTsKLQkJCWFkYXAtPnVsZF9oYW5kbGVbaV0gPSBOVUxMOworCQkJYWRhcC0+dWxkW2ldLmhhbmRsZSA9IE5VTEw7CiAJCX0KIAlpZiAobmV0ZXZlbnRfcmVnaXN0ZXJlZCAmJiBsaXN0X2VtcHR5KCZhZGFwdGVyX2xpc3QpKSB7CiAJCXVucmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoJmN4Z2I0X25ldGV2ZW50X25iKTsKIAkJbmV0ZXZlbnRfcmVnaXN0ZXJlZCA9IGZhbHNlOwogCX0KIAltdXRleF91bmxvY2soJnVsZF9tdXRleCk7Ci0KLQlzcGluX2xvY2soJmFkYXBfcmN1X2xvY2spOwotCWxpc3RfZGVsX3JjdSgmYWRhcC0+cmN1X25vZGUpOwotCXNwaW5fdW5sb2NrKCZhZGFwX3JjdV9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgbm90aWZ5X3VsZHMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGVudW0gY3hnYjRfc3RhdGUgbmV3X3N0YXRlKQpAQCAtMjU4Miw2MSArMjEwNCwxMiBAQAogCiAJbXV0ZXhfbG9jaygmdWxkX211dGV4KTsKIAlmb3IgKGkgPSAwOyBpIDwgQ1hHQjRfVUxEX01BWDsgaSsrKQotCQlpZiAoYWRhcC0+dWxkX2hhbmRsZVtpXSkKLQkJCXVsZHNbaV0uc3RhdGVfY2hhbmdlKGFkYXAtPnVsZF9oYW5kbGVbaV0sIG5ld19zdGF0ZSk7CisJCWlmIChhZGFwLT51bGQgJiYgYWRhcC0+dWxkW2ldLmhhbmRsZSkKKwkJCWFkYXAtPnVsZFtpXS5zdGF0ZV9jaGFuZ2UoYWRhcC0+dWxkW2ldLmhhbmRsZSwKKwkJCQkJCSAgbmV3X3N0YXRlKTsKIAltdXRleF91bmxvY2soJnVsZF9tdXRleCk7CiB9CiAKLS8qKgotICoJY3hnYjRfcmVnaXN0ZXJfdWxkIC0gcmVnaXN0ZXIgYW4gdXBwZXItbGF5ZXIgZHJpdmVyCi0gKglAdHlwZTogdGhlIFVMRCB0eXBlCi0gKglAcDogdGhlIFVMRCBtZXRob2RzCi0gKgotICoJUmVnaXN0ZXJzIGFuIHVwcGVyLWxheWVyIGRyaXZlciB3aXRoIHRoaXMgZHJpdmVyIGFuZCBub3RpZmllcyB0aGUgVUxECi0gKglhYm91dCBhbnkgcHJlc2VudGx5IGF2YWlsYWJsZSBkZXZpY2VzIHRoYXQgc3VwcG9ydCBpdHMgdHlwZS4gIFJldHVybnMKLSAqCSUtRUJVU1kgaWYgYSBVTEQgb2YgdGhlIHNhbWUgdHlwZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0gKi8KLWludCBjeGdiNF9yZWdpc3Rlcl91bGQoZW51bSBjeGdiNF91bGQgdHlwZSwgY29uc3Qgc3RydWN0IGN4Z2I0X3VsZF9pbmZvICpwKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBhZGFwdGVyICphZGFwOwotCi0JaWYgKHR5cGUgPj0gQ1hHQjRfVUxEX01BWCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbXV0ZXhfbG9jaygmdWxkX211dGV4KTsKLQlpZiAodWxkc1t0eXBlXS5hZGQpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0JdWxkc1t0eXBlXSA9ICpwOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRhcCwgJmFkYXB0ZXJfbGlzdCwgbGlzdF9ub2RlKQotCQl1bGRfYXR0YWNoKGFkYXAsIHR5cGUpOwotb3V0OgltdXRleF91bmxvY2soJnVsZF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woY3hnYjRfcmVnaXN0ZXJfdWxkKTsKLQotLyoqCi0gKgljeGdiNF91bnJlZ2lzdGVyX3VsZCAtIHVucmVnaXN0ZXIgYW4gdXBwZXItbGF5ZXIgZHJpdmVyCi0gKglAdHlwZTogdGhlIFVMRCB0eXBlCi0gKgotICoJVW5yZWdpc3RlcnMgYW4gZXhpc3RpbmcgdXBwZXItbGF5ZXIgZHJpdmVyLgotICovCi1pbnQgY3hnYjRfdW5yZWdpc3Rlcl91bGQoZW51bSBjeGdiNF91bGQgdHlwZSkKLXsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcDsKLQotCWlmICh0eXBlID49IENYR0I0X1VMRF9NQVgpCi0JCXJldHVybiAtRUlOVkFMOwotCW11dGV4X2xvY2soJnVsZF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwLCAmYWRhcHRlcl9saXN0LCBsaXN0X25vZGUpCi0JCWFkYXAtPnVsZF9oYW5kbGVbdHlwZV0gPSBOVUxMOwotCXVsZHNbdHlwZV0uYWRkID0gTlVMTDsKLQltdXRleF91bmxvY2soJnVsZF9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGN4Z2I0X3VucmVnaXN0ZXJfdWxkKTsKLQogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgaW50IGN4Z2I0X2luZXQ2YWRkcl9oYW5kbGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKIAkJCQkgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkYXRhKQpAQCAtMjc0MSw3ICsyMjE0LDYgQEAKIAkJCQkgIGFkYXAtPm1zaXhfaW5mb1swXS5kZXNjLCBhZGFwKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gaXJxX2VycjsKLQogCQllcnIgPSByZXF1ZXN0X21zaXhfcXVldWVfaXJxcyhhZGFwKTsKIAkJaWYgKGVycikgewogCQkJZnJlZV9pcnEoYWRhcC0+bXNpeF9pbmZvWzBdLnZlYywgYWRhcCk7CkBAIC0yODE5LDQwICsyMjkxLDYgQEAKIAlyZXR1cm4gdDRfZW5hYmxlX3ZpKGFkYXB0ZXIsIGFkYXB0ZXItPnBmLCBwaS0+dmlpZCwgZmFsc2UsIGZhbHNlKTsKIH0KIAotLyogUmV0dXJuIGFuIGVycm9yIG51bWJlciBpZiB0aGUgaW5kaWNhdGVkIGZpbHRlciBpc24ndCB3cml0YWJsZSAuLi4KLSAqLwotc3RhdGljIGludCB3cml0YWJsZV9maWx0ZXIoc3RydWN0IGZpbHRlcl9lbnRyeSAqZikKLXsKLQlpZiAoZi0+bG9ja2VkKQotCQlyZXR1cm4gLUVQRVJNOwotCWlmIChmLT5wZW5kaW5nKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIERlbGV0ZSB0aGUgZmlsdGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggKGlmIHZhbGlkKS4gIFRoZSBjaGVja3MgZm9yIGFsbAotICogdGhlIGNvbW1vbiBwcm9ibGVtcyB3aXRoIGRvaW5nIHRoaXMgbGlrZSB0aGUgZmlsdGVyIGJlaW5nIGxvY2tlZCwgY3VycmVudGx5Ci0gKiBwZW5kaW5nIGluIGFub3RoZXIgb3BlcmF0aW9uLCBldGMuCi0gKi8KLXN0YXRpYyBpbnQgZGVsZXRlX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IGZpZHgpCi17Ci0Jc3RydWN0IGZpbHRlcl9lbnRyeSAqZjsKLQlpbnQgcmV0OwotCi0JaWYgKGZpZHggPj0gYWRhcHRlci0+dGlkcy5uZnRpZHMgKyBhZGFwdGVyLT50aWRzLm5zZnRpZHMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiW2ZpZHhdOwotCXJldCA9IHdyaXRhYmxlX2ZpbHRlcihmKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCWlmIChmLT52YWxpZCkKLQkJcmV0dXJuIGRlbF9maWx0ZXJfd3IoYWRhcHRlciwgZmlkeCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogaW50IGN4Z2I0X2NyZWF0ZV9zZXJ2ZXJfZmlsdGVyKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdGlkLAogCQlfX2JlMzIgc2lwLCBfX2JlMTYgc3BvcnQsIF9fYmUxNiB2bGFuLAogCQl1bnNpZ25lZCBpbnQgcXVldWUsIHVuc2lnbmVkIGNoYXIgcG9ydCwgdW5zaWduZWQgY2hhciBtYXNrKQpAQCAtMjkyMiw3ICsyMzYwLDYgQEAKIGludCBjeGdiNF9yZW1vdmVfc2VydmVyX2ZpbHRlcihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3RpZCwKIAkJdW5zaWduZWQgaW50IHF1ZXVlLCBib29sIGlwdjYpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgZmlsdGVyX2VudHJ5ICpmOwogCXN0cnVjdCBhZGFwdGVyICphZGFwOwogCkBAIC0yOTM2LDExICsyMzczLDcgQEAKIAkvKiBVbmxvY2sgdGhlIGZpbHRlciAqLwogCWYtPmxvY2tlZCA9IDA7CiAKLQlyZXQgPSBkZWxldGVfZmlsdGVyKGFkYXAsIHN0aWQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZGVsZXRlX2ZpbHRlcihhZGFwLCBzdGlkKTsKIH0KIEVYUE9SVF9TWU1CT0woY3hnYjRfcmVtb3ZlX3NlcnZlcl9maWx0ZXIpOwogCkBAIC0zMDc4LDYgKzI1MTEsODUgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX1BDSV9JT1YKK3N0YXRpYyBpbnQgZHVtbXlfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIFR1cm4gY2FycmllciBvZmYgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0byB0cmFuc21pdCBhbnl0aGluZyBvbiB0aGlzCisJICogaW50ZXJmYWNlLgorCSAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbGwgTUFDIGFkZHJlc3MgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIGJ5IHRoZSBGVyAqLworc3RhdGljIHZvaWQgZmlsbF92Zl9zdGF0aW9uX21hY19hZGRyKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXVuc2lnbmVkIGludCBpOworCXU4IGh3X2FkZHJbRVRIX0FMRU5dLCBtYWNhZGRyW0VUSF9BTEVOXTsKKwlpbnQgZXJyOworCXU4ICpuYTsKKwl1MTYgYSwgYjsKKworCWVyciA9IHQ0X2dldF9yYXdfdnBkX3BhcmFtcyhhZGFwLCAmYWRhcC0+cGFyYW1zLnZwZCk7CisJaWYgKCFlcnIpIHsKKwkJbmEgPSBhZGFwLT5wYXJhbXMudnBkLm5hOworCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJCWh3X2FkZHJbaV0gPSAoaGV4MnZhbChuYVsyICogaSArIDBdKSAqIDE2ICsKKwkJCQkgICAgICBoZXgydmFsKG5hWzIgKiBpICsgMV0pKTsKKwkJYSA9IChod19hZGRyWzBdIDw8IDgpIHwgaHdfYWRkclsxXTsKKwkJYiA9IChod19hZGRyWzFdIDw8IDgpIHwgaHdfYWRkclsyXTsKKwkJYSBePSBiOworCQlhIHw9IDB4MDIwMDsgICAgLyogbG9jYWxseSBhc3NpZ25lZCBFdGhlcm5ldCBNQUMgYWRkcmVzcyAqLworCQlhICY9IH4weDAxMDA7ICAgLyogbm90IGEgbXVsdGljYXN0IEV0aGVybmV0IE1BQyBhZGRyZXNzICovCisJCW1hY2FkZHJbMF0gPSBhID4+IDg7CisJCW1hY2FkZHJbMV0gPSBhICYgMHhmZjsKKworCQlmb3IgKGkgPSAyOyBpIDwgNTsgaSsrKQorCQkJbWFjYWRkcltpXSA9IGh3X2FkZHJbaSArIDFdOworCisJCWZvciAoaSA9IDA7IGkgPCBhZGFwLT5udW1fdmZzOyBpKyspIHsKKwkJCW1hY2FkZHJbNV0gPSBhZGFwLT5wZiAqIDE2ICsgaTsKKwkJCWV0aGVyX2FkZHJfY29weShhZGFwLT52ZmluZm9baV0udmZfbWFjX2FkZHIsIG1hY2FkZHIpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGN4Z2Jfc2V0X3ZmX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIHU4ICptYWMpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7CisJaW50IHJldDsKKworCS8qIHZlcmlmeSBNQUMgYWRkciBpcyB2YWxpZCAqLworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihtYWMpKSB7CisJCWRldl9lcnIocGktPmFkYXB0ZXItPnBkZXZfZGV2LAorCQkJIkludmFsaWQgRXRoZXJuZXQgYWRkcmVzcyAlcE0gZm9yIFZGICVkXG4iLAorCQkJbWFjLCB2Zik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9pbmZvKHBpLT5hZGFwdGVyLT5wZGV2X2RldiwKKwkJICJTZXR0aW5nIE1BQyAlcE0gb24gVkYgJWRcbiIsIG1hYywgdmYpOworCXJldCA9IHQ0X3NldF92Zl9tYWNfYWNsKGFkYXAsIHZmICsgMSwgMSwgbWFjKTsKKwlpZiAoIXJldCkKKwkJZXRoZXJfYWRkcl9jb3B5KGFkYXAtPnZmaW5mb1t2Zl0udmZfbWFjX2FkZHIsIG1hYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjeGdiX2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIGludCB2Ziwgc3RydWN0IGlmbGFfdmZfaW5mbyAqaXZpKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBpLT5hZGFwdGVyOworCisJaWYgKHZmID49IGFkYXAtPm51bV92ZnMpCisJCXJldHVybiAtRUlOVkFMOworCWl2aS0+dmYgPSB2ZjsKKwlldGhlcl9hZGRyX2NvcHkoaXZpLT5tYWMsIGFkYXAtPnZmaW5mb1t2Zl0udmZfbWFjX2FkZHIpOworCXJldHVybiAwOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgY3hnYl9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKIHsKIAlpbnQgcmV0OwpAQCAtMzExNCw2ICsyNjI2LDExNiBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgY3hnYl9zZXRfdHhfbWF4cmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5kZXgsIHUzMiByYXRlKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBpLT5hZGFwdGVyOworCXN0cnVjdCBzY2hlZF9jbGFzcyAqZTsKKwlzdHJ1Y3QgY2hfc2NoZWRfcGFyYW1zIHA7CisJc3RydWN0IGNoX3NjaGVkX3F1ZXVlIHFlOworCXUzMiByZXFfcmF0ZTsKKwlpbnQgZXJyID0gMDsKKworCWlmICghY2FuX3NjaGVkKGRldikpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gcGktPm5xc2V0cyAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkpIHsKKwkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwKKwkJCSJGYWlsZWQgdG8gcmF0ZSBsaW1pdCBvbiBxdWV1ZSAlZC4gTGluayBEb3duP1xuIiwKKwkJCWluZGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29udmVydCBmcm9tIE1icHMgdG8gS2JwcyAqLworCXJlcV9yYXRlID0gcmF0ZSA8PCAxMDsKKworCS8qIE1heCByYXRlIGlzIDEwIEdicHMgKi8KKwlpZiAocmVxX3JhdGUgPj0gU0NIRURfTUFYX1JBVEVfS0JQUykgeworCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LAorCQkJIkludmFsaWQgcmF0ZSAldSBNYnBzLCBNYXggcmF0ZSBpcyAldSBHYnBzXG4iLAorCQkJcmF0ZSwgU0NIRURfTUFYX1JBVEVfS0JQUyk7CisJCXJldHVybiAtRVJBTkdFOworCX0KKworCS8qIEZpcnN0IHVuYmluZCB0aGUgcXVldWUgZnJvbSBhbnkgZXhpc3RpbmcgY2xhc3MgKi8KKwltZW1zZXQoJnFlLCAwLCBzaXplb2YocWUpKTsKKwlxZS5xdWV1ZSA9IGluZGV4OworCXFlLmNsYXNzID0gU0NIRURfQ0xTX05PTkU7CisKKwllcnIgPSBjeGdiNF9zY2hlZF9jbGFzc191bmJpbmQoZGV2LCAodm9pZCAqKSgmcWUpLCBTQ0hFRF9RVUVVRSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGFkYXAtPnBkZXZfZGV2LAorCQkJIlVuYmluZGluZyBRdWV1ZSAlZCBvbiBwb3J0ICVkIGZhaWwuIEVycjogJWRcbiIsCisJCQlpbmRleCwgcGktPnBvcnRfaWQsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogUXVldWUgYWxyZWFkeSB1bmJvdW5kICovCisJaWYgKCFyZXFfcmF0ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBGZXRjaCBhbnkgYXZhaWxhYmxlIHVudXNlZCBvciBtYXRjaGluZyBzY2hlZHVsaW5nIGNsYXNzICovCisJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOworCXAudHlwZSA9IFNDSEVEX0NMQVNTX1RZUEVfUEFDS0VUOworCXAudS5wYXJhbXMubGV2ZWwgICAgPSBTQ0hFRF9DTEFTU19MRVZFTF9DTF9STDsKKwlwLnUucGFyYW1zLm1vZGUgICAgID0gU0NIRURfQ0xBU1NfTU9ERV9DTEFTUzsKKwlwLnUucGFyYW1zLnJhdGV1bml0ID0gU0NIRURfQ0xBU1NfUkFURVVOSVRfQklUUzsKKwlwLnUucGFyYW1zLnJhdGVtb2RlID0gU0NIRURfQ0xBU1NfUkFURU1PREVfQUJTOworCXAudS5wYXJhbXMuY2hhbm5lbCAgPSBwaS0+dHhfY2hhbjsKKwlwLnUucGFyYW1zLmNsYXNzICAgID0gU0NIRURfQ0xTX05PTkU7CisJcC51LnBhcmFtcy5taW5yYXRlICA9IDA7CisJcC51LnBhcmFtcy5tYXhyYXRlICA9IHJlcV9yYXRlOworCXAudS5wYXJhbXMud2VpZ2h0ICAgPSAwOworCXAudS5wYXJhbXMucGt0c2l6ZSAgPSBkZXYtPm10dTsKKworCWUgPSBjeGdiNF9zY2hlZF9jbGFzc19hbGxvYyhkZXYsICZwKTsKKwlpZiAoIWUpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogQmluZCB0aGUgcXVldWUgdG8gYSBzY2hlZHVsaW5nIGNsYXNzICovCisJbWVtc2V0KCZxZSwgMCwgc2l6ZW9mKHFlKSk7CisJcWUucXVldWUgPSBpbmRleDsKKwlxZS5jbGFzcyA9IGUtPmlkeDsKKworCWVyciA9IGN4Z2I0X3NjaGVkX2NsYXNzX2JpbmQoZGV2LCAodm9pZCAqKSgmcWUpLCBTQ0hFRF9RVUVVRSk7CisJaWYgKGVycikKKwkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwKKwkJCSJRdWV1ZSByYXRlIGxpbWl0aW5nIGZhaWxlZC4gRXJyOiAlZFxuIiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGN4Z2Jfc2V0dXBfdGMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGhhbmRsZSwgX19iZTE2IHByb3RvLAorCQkJIHN0cnVjdCB0Y190b19uZXRkZXYgKnRjKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2MnBpbmZvKGRldik7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBuZXRkZXYyYWRhcChkZXYpOworCisJaWYgKCEoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkpIHsKKwkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwKKwkJCSJGYWlsZWQgdG8gc2V0dXAgdGMgb24gcG9ydCAlZC4gTGluayBEb3duP1xuIiwKKwkJCXBpLT5wb3J0X2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKFRDX0hfTUFKKGhhbmRsZSkgPT0gVENfSF9NQUooVENfSF9JTkdSRVNTKSAmJgorCSAgICB0Yy0+dHlwZSA9PSBUQ19TRVRVUF9DTFNVMzIpIHsKKwkJc3dpdGNoICh0Yy0+Y2xzX3UzMi0+Y29tbWFuZCkgeworCQljYXNlIFRDX0NMU1UzMl9ORVdfS05PREU6CisJCWNhc2UgVENfQ0xTVTMyX1JFUExBQ0VfS05PREU6CisJCQlyZXR1cm4gY3hnYjRfY29uZmlnX2tub2RlKGRldiwgcHJvdG8sIHRjLT5jbHNfdTMyKTsKKwkJY2FzZSBUQ19DTFNVMzJfREVMRVRFX0tOT0RFOgorCQkJcmV0dXJuIGN4Z2I0X2RlbGV0ZV9rbm9kZShkZXYsIHByb3RvLCB0Yy0+Y2xzX3UzMik7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgY3hnYjRfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4gICAgICAgICAgICAgPSBjeGdiX29wZW4sCiAJLm5kb19zdG9wICAgICAgICAgICAgID0gY3hnYl9jbG9zZSwKQEAgLTMxMzYsNyArMjc1OCwzMSBAQAogI2lmZGVmIENPTkZJR19ORVRfUlhfQlVTWV9QT0xMCiAJLm5kb19idXN5X3BvbGwgICAgICAgID0gY3hnYl9idXN5X3BvbGwsCiAjZW5kaWYKKwkubmRvX3NldF90eF9tYXhyYXRlICAgPSBjeGdiX3NldF90eF9tYXhyYXRlLAorCS5uZG9fc2V0dXBfdGMgICAgICAgICA9IGN4Z2Jfc2V0dXBfdGMsCit9OwogCisjaWZkZWYgQ09ORklHX1BDSV9JT1YKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgY3hnYjRfbWdtdF9uZXRkZXZfb3BzID0geworCS5uZG9fb3BlbiAgICAgICAgICAgICA9IGR1bW15X29wZW4sCisJLm5kb19zZXRfdmZfbWFjICAgICAgID0gY3hnYl9zZXRfdmZfbWFjLAorCS5uZG9fZ2V0X3ZmX2NvbmZpZyAgICA9IGN4Z2JfZ2V0X3ZmX2NvbmZpZywKK307CisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldjJhZGFwKGRldik7CisKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgY3hnYjRfZHJpdmVyX25hbWUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIGN4Z2I0X2RyaXZlcl92ZXJzaW9uLAorCQlzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAorCQlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBjeGdiNF9tZ210X2V0aHRvb2xfb3BzID0geworCS5nZXRfZHJ2aW5mbyAgICAgICA9IGdldF9kcnZpbmZvLAogfTsKIAogdm9pZCB0NF9mYXRhbF9lcnIoc3RydWN0IGFkYXB0ZXIgKmFkYXApCkBAIC0zOTc5LDYgKzM2MjUsMTIgQEAKIAlhZGFwLT5jbGlwdF9zdGFydCA9IHZhbFswXTsKIAlhZGFwLT5jbGlwdF9lbmQgPSB2YWxbMV07CiAKKwkvKiBXZSBkb24ndCB5ZXQgaGF2ZSBhIFBBUkFNcyBjYWxscyB0byByZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIFRyYWZmaWMKKwkgKiBDbGFzc2VzIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUvZmlybXdhcmUgc28gd2UgaGFyZCBjb2RlIGl0IGhlcmUKKwkgKiBmb3Igbm93LgorCSAqLworCWFkYXAtPnBhcmFtcy5uc2NoZWRfY2xzID0gaXNfdDQoYWRhcC0+cGFyYW1zLmNoaXApID8gMTUgOiAxNjsKKwogCS8qIHF1ZXJ5IHBhcmFtcyByZWxhdGVkIHRvIGFjdGl2ZSBmaWx0ZXIgcmVnaW9uICovCiAJcGFyYW1zWzBdID0gRldfUEFSQU1fUEZWRihBQ1RJVkVfRklMVEVSX1NUQVJUKTsKIAlwYXJhbXNbMV0gPSBGV19QQVJBTV9QRlZGKEFDVElWRV9GSUxURVJfRU5EKTsKQEAgLTQwNjcsNiArMzcxOSw3IEBACiAJCWFkYXAtPnBhcmFtcy5vZmxkcV93cl9jcmVkID0gdmFsWzVdOwogCiAJCWFkYXAtPnBhcmFtcy5vZmZsb2FkID0gMTsKKwkJYWRhcC0+bnVtX29mbGRfdWxkICs9IDE7CiAJfQogCWlmIChjYXBzX2NtZC5yZG1hY2FwcykgewogCQlwYXJhbXNbMF0gPSBGV19QQVJBTV9QRlZGKFNUQUdfU1RBUlQpOwpAQCAtNDExOSw2ICszNzcyLDcgQEAKIAkJCSAibWF4X29yZGlyZF9xcCAlZCBtYXhfaXJkX2FkYXB0ZXIgJWRcbiIsCiAJCQkgYWRhcC0+cGFyYW1zLm1heF9vcmRpcmRfcXAsCiAJCQkgYWRhcC0+cGFyYW1zLm1heF9pcmRfYWRhcHRlcik7CisJCWFkYXAtPm51bV9vZmxkX3VsZCArPSAyOwogCX0KIAlpZiAoY2Fwc19jbWQuaXNjc2ljYXBzKSB7CiAJCXBhcmFtc1swXSA9IEZXX1BBUkFNX1BGVkYoSVNDU0lfU1RBUlQpOwpAQCAtNDEyOSw2ICszNzgzLDEzIEBACiAJCQlnb3RvIGJ5ZTsKIAkJYWRhcC0+dnJlcy5pc2NzaS5zdGFydCA9IHZhbFswXTsKIAkJYWRhcC0+dnJlcy5pc2NzaS5zaXplID0gdmFsWzFdIC0gdmFsWzBdICsgMTsKKwkJLyogTElPIHRhcmdldCBhbmQgY3hnYjRpIGluaXRpYWl0b3IgKi8KKwkJYWRhcC0+bnVtX29mbGRfdWxkICs9IDI7CisJfQorCWlmIChjYXBzX2NtZC5jcnlwdG9jYXBzKSB7CisJCS8qIFNob3VsZCBxdWVyeSBwYXJhbXMgaGVyZS4uLlRPRE8gKi8KKwkJYWRhcC0+cGFyYW1zLmNyeXB0byB8PSBVTFBfQ1JZUFRPX0xPT0tBU0lERTsKKwkJYWRhcC0+bnVtX3VsZCArPSAxOwogCX0KICN1bmRlZiBGV19QQVJBTV9QRlZGCiAjdW5kZWYgRldfUEFSQU1fREVWCkBAIC00MzA1LDIwICszOTY2LDE3IEBACiAJLnJlc3VtZSAgICAgICAgID0gZWVoX3Jlc3VtZSwKIH07CiAKKy8qIFJldHVybiB0cnVlIGlmIHRoZSBMaW5rIENvbmZpZ3VyYXRpb24gc3VwcG9ydHMgIkhpZ2ggU3BlZWRzIiAodGhvc2UgZ3JlYXRlcgorICogdGhhbiAxR2IvcykuCisgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBpc194XzEwZ19wb3J0KGNvbnN0IHN0cnVjdCBsaW5rX2NvbmZpZyAqbGMpCiB7Ci0JcmV0dXJuIChsYy0+c3VwcG9ydGVkICYgRldfUE9SVF9DQVBfU1BFRURfMTBHKSAhPSAwIHx8Ci0JICAgICAgIChsYy0+c3VwcG9ydGVkICYgRldfUE9SVF9DQVBfU1BFRURfNDBHKSAhPSAwOwotfQorCXVuc2lnbmVkIGludCBzcGVlZHMsIGhpZ2hfc3BlZWRzOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9yc3BxKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX3JzcHEgKnEsCi0JCQkgICAgIHVuc2lnbmVkIGludCB1cywgdW5zaWduZWQgaW50IGNudCwKLQkJCSAgICAgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGludCBpcWVfc2l6ZSkKLXsKLQlxLT5hZGFwID0gYWRhcDsKLQljeGdiNF9zZXRfcnNwcV9pbnRyX3BhcmFtcyhxLCB1cywgY250KTsKLQlxLT5pcWVfbGVuID0gaXFlX3NpemU7Ci0JcS0+c2l6ZSA9IHNpemU7CisJc3BlZWRzID0gRldfUE9SVF9DQVBfU1BFRURfVihGV19QT1JUX0NBUF9TUEVFRF9HKGxjLT5zdXBwb3J0ZWQpKTsKKwloaWdoX3NwZWVkcyA9IHNwZWVkcyAmIH4oRldfUE9SVF9DQVBfU1BFRURfMTAwTSB8IEZXX1BPUlRfQ0FQX1NQRUVEXzFHKTsKKworCXJldHVybiBoaWdoX3NwZWVkcyAhPSAwOwogfQogCiAvKgpAQCAtNDMzMyw3ICszOTkxLDE2IEBACiAjaWZuZGVmIENPTkZJR19DSEVMU0lPX1Q0X0RDQgogCWludCBxMTBnID0gMDsKICNlbmRpZgotCWludCBjaXFfc2l6ZTsKKworCS8qIFJlZHVjZSBtZW1vcnkgdXNhZ2UgaW4ga2R1bXAgZW52aXJvbm1lbnQsIGRpc2FibGUgYWxsIG9mZmxvYWQuCisJICovCisJaWYgKGlzX2tkdW1wX2tlcm5lbCgpKSB7CisJCWFkYXAtPnBhcmFtcy5vZmZsb2FkID0gMDsKKwkJYWRhcC0+cGFyYW1zLmNyeXB0byA9IDA7CisJfSBlbHNlIGlmIChpc191bGQoYWRhcCkgJiYgdDRfdWxkX21lbV9hbGxvYyhhZGFwKSkgeworCQlhZGFwLT5wYXJhbXMub2ZmbG9hZCA9IDA7CisJCWFkYXAtPnBhcmFtcy5jcnlwdG8gPSAwOworCX0KIAogCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkKIAkJbjEwZyArPSBpc194XzEwZ19wb3J0KCZhZGFwMnBpbmZvKGFkYXAsIGkpLT5saW5rX2NmZyk7CkBAIC00MzY1LDExICs0MDMyLDYgQEAKIAlpZiAocTEwZyA+IG5ldGlmX2dldF9udW1fZGVmYXVsdF9yc3NfcXVldWVzKCkpCiAJCXExMGcgPSBuZXRpZl9nZXRfbnVtX2RlZmF1bHRfcnNzX3F1ZXVlcygpOwogCi0JLyogUmVkdWNlIG1lbW9yeSB1c2FnZSBpbiBrZHVtcCBlbnZpcm9ubWVudCwgZGlzYWJsZSBhbGwgb2ZmbG9hZC4KLQkgKi8KLQlpZiAoaXNfa2R1bXBfa2VybmVsKCkpCi0JCWFkYXAtPnBhcmFtcy5vZmZsb2FkID0gMDsKLQogCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgewogCQlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IGFkYXAycGluZm8oYWRhcCwgaSk7CiAKQEAgLTQzODIsMzMgKzQwNDQsMTggQEAKIAlzLT5ldGhxc2V0cyA9IHFpZHg7CiAJcy0+bWF4X2V0aHFzZXRzID0gcWlkeDsgICAvKiBNU0ktWCBtYXkgbG93ZXIgaXQgbGF0ZXIgKi8KIAotCWlmIChpc19vZmZsb2FkKGFkYXApKSB7CisJaWYgKGlzX3VsZChhZGFwKSkgewogCQkvKgogCQkgKiBGb3Igb2ZmbG9hZCB3ZSB1c2UgMSBxdWV1ZS9jaGFubmVsIGlmIGFsbCBwb3J0cyBhcmUgdXAgdG8gMUcsCiAJCSAqIG90aGVyd2lzZSB3ZSBkaXZpZGUgYWxsIGF2YWlsYWJsZSBxdWV1ZXMgYW1vbmdzdCB0aGUgY2hhbm5lbHMKIAkJICogY2FwcGVkIGJ5IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvcmVzLgogCQkgKi8KIAkJaWYgKG4xMGcpIHsKLQkJCWkgPSBtaW5fdChpbnQsIEFSUkFZX1NJWkUocy0+aXNjc2lyeHEpLAotCQkJCSAgbnVtX29ubGluZV9jcHVzKCkpOwotCQkJcy0+aXNjc2lxc2V0cyA9IHJvdW5kdXAoaSwgYWRhcC0+cGFyYW1zLm5wb3J0cyk7Ci0JCX0gZWxzZQotCQkJcy0+aXNjc2lxc2V0cyA9IGFkYXAtPnBhcmFtcy5ucG9ydHM7Ci0JCS8qIEZvciBSRE1BIG9uZSBSeCBxdWV1ZSBwZXIgY2hhbm5lbCBzdWZmaWNlcyAqLwotCQlzLT5yZG1hcXMgPSBhZGFwLT5wYXJhbXMubnBvcnRzOwotCQkvKiBUcnkgYW5kIGFsbG93IGF0IGxlYXN0IDEgQ0lRIHBlciBjcHUgcm91bmRpbmcgZG93bgotCQkgKiB0byB0aGUgbnVtYmVyIG9mIHBvcnRzLCB3aXRoIGEgbWluaW11bSBvZiAxIHBlciBwb3J0LgotCQkgKiBBIDIgcG9ydCBjYXJkIGluIGEgNiBjcHUgc3lzdGVtOiA2IENJUXMsIDMgLyBwb3J0LgotCQkgKiBBIDQgcG9ydCBjYXJkIGluIGEgNiBjcHUgc3lzdGVtOiA0IENJUXMsIDEgLyBwb3J0LgotCQkgKiBBIDQgcG9ydCBjYXJkIGluIGEgMiBjcHUgc3lzdGVtOiA0IENJUXMsIDEgLyBwb3J0LgotCQkgKi8KLQkJcy0+cmRtYWNpcXMgPSBtaW5fdChpbnQsIE1BWF9SRE1BX0NJUVMsIG51bV9vbmxpbmVfY3B1cygpKTsKLQkJcy0+cmRtYWNpcXMgPSAocy0+cmRtYWNpcXMgLyBhZGFwLT5wYXJhbXMubnBvcnRzKSAqCi0JCQkJYWRhcC0+cGFyYW1zLm5wb3J0czsKLQkJcy0+cmRtYWNpcXMgPSBtYXhfdChpbnQsIHMtPnJkbWFjaXFzLCBhZGFwLT5wYXJhbXMubnBvcnRzKTsKLQotCQlpZiAoIWlzX3Q0KGFkYXAtPnBhcmFtcy5jaGlwKSkKLQkJCXMtPm5pc2NzaXRxID0gcy0+aXNjc2lxc2V0czsKKwkJCWkgPSBudW1fb25saW5lX2NwdXMoKTsKKwkJCXMtPm9mbGRxc2V0cyA9IHJvdW5kdXAoaSwgYWRhcC0+cGFyYW1zLm5wb3J0cyk7CisJCX0gZWxzZSB7CisJCQlzLT5vZmxkcXNldHMgPSBhZGFwLT5wYXJhbXMubnBvcnRzOworCQl9CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+ZXRocnhxKTsgaSsrKSB7CkBAIC00NDI3LDQ3ICs0MDc0LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5vZmxkdHhxKTsgaSsrKQogCQlzLT5vZmxkdHhxW2ldLnEuc2l6ZSA9IDEwMjQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzLT5pc2NzaXJ4cSk7IGkrKykgewotCQlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyID0gJnMtPmlzY3NpcnhxW2ldOwotCi0JCWluaXRfcnNwcShhZGFwLCAmci0+cnNwcSwgNSwgMSwgMTAyNCwgNjQpOwotCQlyLT5yc3BxLnVsZCA9IENYR0I0X1VMRF9JU0NTSTsKLQkJci0+Zmwuc2l6ZSA9IDcyOwotCX0KLQotCWlmICghaXNfdDQoYWRhcC0+cGFyYW1zLmNoaXApKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHMtPmlzY3NpdHJ4cSk7IGkrKykgewotCQkJc3RydWN0IHNnZV9vZmxkX3J4cSAqciA9ICZzLT5pc2NzaXRyeHFbaV07Ci0KLQkJCWluaXRfcnNwcShhZGFwLCAmci0+cnNwcSwgNSwgMSwgMTAyNCwgNjQpOwotCQkJci0+cnNwcS51bGQgPSBDWEdCNF9VTERfSVNDU0lUOwotCQkJci0+Zmwuc2l6ZSA9IDcyOwotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+cmRtYXJ4cSk7IGkrKykgewotCQlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyID0gJnMtPnJkbWFyeHFbaV07Ci0KLQkJaW5pdF9yc3BxKGFkYXAsICZyLT5yc3BxLCA1LCAxLCA1MTEsIDY0KTsKLQkJci0+cnNwcS51bGQgPSBDWEdCNF9VTERfUkRNQTsKLQkJci0+Zmwuc2l6ZSA9IDcyOwotCX0KLQotCWNpcV9zaXplID0gNjQgKyBhZGFwLT52cmVzLmNxLnNpemUgKyBhZGFwLT50aWRzLm5mdGlkczsKLQlpZiAoY2lxX3NpemUgPiBTR0VfTUFYX0lRX1NJWkUpIHsKLQkJQ0hfV0FSTihhZGFwLCAiQ0lRIHNpemUgdG9vIHNtYWxsIGZvciBhdmFpbGFibGUgSVFzXG4iKTsKLQkJY2lxX3NpemUgPSBTR0VfTUFYX0lRX1NJWkU7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+cmRtYWNpcSk7IGkrKykgewotCQlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyID0gJnMtPnJkbWFjaXFbaV07Ci0KLQkJaW5pdF9yc3BxKGFkYXAsICZyLT5yc3BxLCA1LCAxLCBjaXFfc2l6ZSwgNjQpOwotCQlyLT5yc3BxLnVsZCA9IENYR0I0X1VMRF9SRE1BOwotCX0KLQogCWluaXRfcnNwcShhZGFwLCAmcy0+ZndfZXZ0cSwgMCwgMSwgMTAyNCwgNjQpOwotCWluaXRfcnNwcShhZGFwLCAmcy0+aW50cnEsIDAsIDEsIDIgKiBNQVhfSU5HUSwgNjQpOworCWluaXRfcnNwcShhZGFwLCAmcy0+aW50cnEsIDAsIDEsIDUxMiwgNjQpOwogfQogCiAvKgpAQCAtNDQ5OCw0MiArNDEwNiw5MCBAQAogCX0KIH0KIAorc3RhdGljIGludCBnZXRfbXNpeF9pbmZvKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXN0cnVjdCB1bGRfbXNpeF9pbmZvICptc2l4X2luZm87CisJdW5zaWduZWQgaW50IG1heF9pbmdxID0gMDsKKworCWlmIChpc19vZmZsb2FkKGFkYXApKQorCQltYXhfaW5ncSArPSBNQVhfT0ZMRF9RU0VUUyAqIGFkYXAtPm51bV9vZmxkX3VsZDsKKwlpZiAoaXNfcGNpX3VsZChhZGFwKSkKKwkJbWF4X2luZ3EgKz0gTUFYX09GTERfUVNFVFMgKiBhZGFwLT5udW1fdWxkOworCisJaWYgKCFtYXhfaW5ncSkKKwkJZ290byBvdXQ7CisKKwltc2l4X2luZm8gPSBrY2FsbG9jKG1heF9pbmdxLCBzaXplb2YoKm1zaXhfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghbXNpeF9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFkYXAtPm1zaXhfYm1hcF91bGRzLm1zaXhfYm1hcCA9IGtjYWxsb2MoQklUU19UT19MT05HUyhtYXhfaW5ncSksCisJCQkJCQkgc2l6ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXAtPm1zaXhfYm1hcF91bGRzLm1zaXhfYm1hcCkgeworCQlrZnJlZShtc2l4X2luZm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmFkYXAtPm1zaXhfYm1hcF91bGRzLmxvY2spOworCWFkYXAtPm1zaXhfaW5mb191bGRzID0gbXNpeF9pbmZvOworb3V0OgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX21zaXhfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlpZiAoIShhZGFwLT5udW1fdWxkICYmIGFkYXAtPm51bV9vZmxkX3VsZCkpCisJCXJldHVybjsKKworCWtmcmVlKGFkYXAtPm1zaXhfaW5mb191bGRzKTsKKwlrZnJlZShhZGFwLT5tc2l4X2JtYXBfdWxkcy5tc2l4X2JtYXApOworfQorCiAvKiAyIE1TSS1YIHZlY3RvcnMgbmVlZGVkIGZvciB0aGUgRlcgcXVldWUgYW5kIG5vbi1kYXRhIGludGVycnVwdHMgKi8KICNkZWZpbmUgRVhUUkFfVkVDUyAyCiAKIHN0YXRpYyBpbnQgZW5hYmxlX21zaXgoc3RydWN0IGFkYXB0ZXIgKmFkYXApCiB7Ci0JaW50IG9mbGRfbmVlZCA9IDA7Ci0JaW50IGksIHdhbnQsIG5lZWQsIGFsbG9jYXRlZDsKKwlpbnQgb2ZsZF9uZWVkID0gMCwgdWxkX25lZWQgPSAwOworCWludCBpLCBqLCB3YW50LCBuZWVkLCBhbGxvY2F0ZWQ7CiAJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7CiAJdW5zaWduZWQgaW50IG5jaGFuID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllczsKKwlpbnQgbWF4X2luZ3EgPSBNQVhfSU5HUTsKIAotCWVudHJpZXMgPSBrbWFsbG9jKHNpemVvZigqZW50cmllcykgKiAoTUFYX0lOR1EgKyAxKSwKKwlpZiAoaXNfcGNpX3VsZChhZGFwKSkKKwkJbWF4X2luZ3EgKz0gKE1BWF9PRkxEX1FTRVRTICogYWRhcC0+bnVtX3VsZCk7CisJaWYgKGlzX29mZmxvYWQoYWRhcCkpCisJCW1heF9pbmdxICs9IChNQVhfT0ZMRF9RU0VUUyAqIGFkYXAtPm51bV9vZmxkX3VsZCk7CisJZW50cmllcyA9IGttYWxsb2Moc2l6ZW9mKCplbnRyaWVzKSAqIChtYXhfaW5ncSArIDEpLAogCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIWVudHJpZXMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9JTkdRICsgMTsgKytpKQorCS8qIG1hcCBmb3IgbXNpeCAqLworCWlmIChnZXRfbXNpeF9pbmZvKGFkYXApKSB7CisJCWFkYXAtPnBhcmFtcy5vZmZsb2FkID0gMDsKKwkJYWRhcC0+cGFyYW1zLmNyeXB0byA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1heF9pbmdxICsgMTsgKytpKQogCQllbnRyaWVzW2ldLmVudHJ5ID0gaTsKIAogCXdhbnQgPSBzLT5tYXhfZXRocXNldHMgKyBFWFRSQV9WRUNTOwogCWlmIChpc19vZmZsb2FkKGFkYXApKSB7Ci0JCXdhbnQgKz0gcy0+cmRtYXFzICsgcy0+cmRtYWNpcXMgKyBzLT5pc2NzaXFzZXRzCSsKLQkJCXMtPm5pc2NzaXRxOwotCQkvKiBuZWVkIG5jaGFuIGZvciBlYWNoIHBvc3NpYmxlIFVMRCAqLwotCQlpZiAoaXNfdDQoYWRhcC0+cGFyYW1zLmNoaXApKQotCQkJb2ZsZF9uZWVkID0gMyAqIG5jaGFuOwotCQllbHNlCi0JCQlvZmxkX25lZWQgPSA0ICogbmNoYW47CisJCXdhbnQgKz0gYWRhcC0+bnVtX29mbGRfdWxkICogcy0+b2ZsZHFzZXRzOworCQlvZmxkX25lZWQgPSBhZGFwLT5udW1fb2ZsZF91bGQgKiBuY2hhbjsKKwl9CisJaWYgKGlzX3BjaV91bGQoYWRhcCkpIHsKKwkJd2FudCArPSBhZGFwLT5udW1fdWxkICogcy0+b2ZsZHFzZXRzOworCQl1bGRfbmVlZCA9IGFkYXAtPm51bV91bGQgKiBuY2hhbjsKIAl9CiAjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDRfRENCCiAJLyogRm9yIERhdGEgQ2VudGVyIEJyaWRnaW5nIHdlIG5lZWQgOCBFdGhlcm5ldCBUWCBQcmlvcml0eSBRdWV1ZXMgZm9yCiAJICogZWFjaCBwb3J0LgogCSAqLwotCW5lZWQgPSA4ICogYWRhcC0+cGFyYW1zLm5wb3J0cyArIEVYVFJBX1ZFQ1MgKyBvZmxkX25lZWQ7CisJbmVlZCA9IDggKiBhZGFwLT5wYXJhbXMubnBvcnRzICsgRVhUUkFfVkVDUyArIG9mbGRfbmVlZCArIHVsZF9uZWVkOwogI2Vsc2UKLQluZWVkID0gYWRhcC0+cGFyYW1zLm5wb3J0cyArIEVYVFJBX1ZFQ1MgKyBvZmxkX25lZWQ7CisJbmVlZCA9IGFkYXAtPnBhcmFtcy5ucG9ydHMgKyBFWFRSQV9WRUNTICsgb2ZsZF9uZWVkICsgdWxkX25lZWQ7CiAjZW5kaWYKIAlhbGxvY2F0ZWQgPSBwY2lfZW5hYmxlX21zaXhfcmFuZ2UoYWRhcC0+cGRldiwgZW50cmllcywgbmVlZCwgd2FudCk7CiAJaWYgKGFsbG9jYXRlZCA8IDApIHsKQEAgLTQ1NDcsMzMgKzQyMDMsMzEgQEAKIAkgKiBFdmVyeSBncm91cCBnZXRzIGl0cyBtaW5pbXVtIHJlcXVpcmVtZW50IGFuZCBOSUMgZ2V0cyB0b3AKIAkgKiBwcmlvcml0eSBmb3IgbGVmdG92ZXJzLgogCSAqLwotCWkgPSBhbGxvY2F0ZWQgLSBFWFRSQV9WRUNTIC0gb2ZsZF9uZWVkOworCWkgPSBhbGxvY2F0ZWQgLSBFWFRSQV9WRUNTIC0gb2ZsZF9uZWVkIC0gdWxkX25lZWQ7CiAJaWYgKGkgPCBzLT5tYXhfZXRocXNldHMpIHsKIAkJcy0+bWF4X2V0aHFzZXRzID0gaTsKIAkJaWYgKGkgPCBzLT5ldGhxc2V0cykKIAkJCXJlZHVjZV9ldGhxcyhhZGFwLCBpKTsKIAl9Ci0JaWYgKGlzX29mZmxvYWQoYWRhcCkpIHsKLQkJaWYgKGFsbG9jYXRlZCA8IHdhbnQpIHsKLQkJCXMtPnJkbWFxcyA9IG5jaGFuOwotCQkJcy0+cmRtYWNpcXMgPSBuY2hhbjsKLQotCQkJaWYgKCFpc190NChhZGFwLT5wYXJhbXMuY2hpcCkpCi0JCQkJcy0+bmlzY3NpdHEgPSBuY2hhbjsKLQkJfQotCi0JCS8qIGxlZnRvdmVycyBnbyB0byBPRkxEICovCi0JCWkgPSBhbGxvY2F0ZWQgLSBFWFRSQV9WRUNTIC0gcy0+bWF4X2V0aHFzZXRzIC0KLQkJICAgIHMtPnJkbWFxcyAtIHMtPnJkbWFjaXFzIC0gcy0+bmlzY3NpdHE7Ci0JCXMtPmlzY3NpcXNldHMgPSAoaSAvIG5jaGFuKSAqIG5jaGFuOyAgLyogcm91bmQgZG93biAqLwotCisJaWYgKGlzX3VsZChhZGFwKSkgeworCQlpZiAoYWxsb2NhdGVkIDwgd2FudCkKKwkJCXMtPm5xc19wZXJfdWxkID0gbmNoYW47CisJCWVsc2UKKwkJCXMtPm5xc19wZXJfdWxkID0gcy0+b2ZsZHFzZXRzOwogCX0KLQlmb3IgKGkgPSAwOyBpIDwgYWxsb2NhdGVkOyArK2kpCisKKwlmb3IgKGkgPSAwOyBpIDwgKHMtPm1heF9ldGhxc2V0cyArIEVYVFJBX1ZFQ1MpOyArK2kpCiAJCWFkYXAtPm1zaXhfaW5mb1tpXS52ZWMgPSBlbnRyaWVzW2ldLnZlY3RvcjsKKwlpZiAoaXNfdWxkKGFkYXApKSB7CisJCWZvciAoaiA9IDAgOyBpIDwgYWxsb2NhdGVkOyArK2ksIGorKykgeworCQkJYWRhcC0+bXNpeF9pbmZvX3VsZHNbal0udmVjID0gZW50cmllc1tpXS52ZWN0b3I7CisJCQlhZGFwLT5tc2l4X2luZm9fdWxkc1tqXS5pZHggPSBpOworCQl9CisJCWFkYXAtPm1zaXhfYm1hcF91bGRzLm1hcHNpemUgPSBqOworCX0KIAlkZXZfaW5mbyhhZGFwLT5wZGV2X2RldiwgIiVkIE1TSS1YIHZlY3RvcnMgYWxsb2NhdGVkLCAiCi0JCSAibmljICVkIGlzY3NpICVkIHJkbWEgY3BsICVkIHJkbWEgY2lxICVkXG4iLAotCQkgYWxsb2NhdGVkLCBzLT5tYXhfZXRocXNldHMsIHMtPmlzY3NpcXNldHMsIHMtPnJkbWFxcywKLQkJIHMtPnJkbWFjaXFzKTsKKwkJICJuaWMgJWQgcGVyIHVsZCAlZFxuIiwKKwkJIGFsbG9jYXRlZCwgcy0+bWF4X2V0aHFzZXRzLCBzLT5ucXNfcGVyX3VsZCk7CiAKIAlrZnJlZShlbnRyaWVzKTsKIAlyZXR1cm4gMDsKQEAgLTQ3NTYsOCArNDQxMCwxMiBAQAogCQlidWZwICs9IHNwcmludGYoYnVmcCwgIjEwMDAvIik7CiAJaWYgKHBpLT5saW5rX2NmZy5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9TUEVFRF8xMEcpCiAJCWJ1ZnAgKz0gc3ByaW50ZihidWZwLCAiMTBHLyIpOworCWlmIChwaS0+bGlua19jZmcuc3VwcG9ydGVkICYgRldfUE9SVF9DQVBfU1BFRURfMjVHKQorCQlidWZwICs9IHNwcmludGYoYnVmcCwgIjI1Ry8iKTsKIAlpZiAocGktPmxpbmtfY2ZnLnN1cHBvcnRlZCAmIEZXX1BPUlRfQ0FQX1NQRUVEXzQwRykKIAkJYnVmcCArPSBzcHJpbnRmKGJ1ZnAsICI0MEcvIik7CisJaWYgKHBpLT5saW5rX2NmZy5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9TUEVFRF8xMDBHKQorCQlidWZwICs9IHNwcmludGYoYnVmcCwgIjEwMEcvIik7CiAJaWYgKGJ1ZnAgIT0gYnVmKQogCQktLWJ1ZnA7CiAJc3ByaW50ZihidWZwLCAiQkFTRS0lcyIsIHQ0X2dldF9wb3J0X3R5cGVfZGVzY3JpcHRpb24ocGktPnBvcnRfdHlwZSkpOwpAQCAtNDc4Myw3ICs0NDQxLDkgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAogCXQ0X2ZyZWVfbWVtKGFkYXB0ZXItPmwydCk7CisJdDRfY2xlYW51cF9zY2hlZChhZGFwdGVyKTsKIAl0NF9mcmVlX21lbShhZGFwdGVyLT50aWRzLnRpZF90YWIpOworCWN4Z2I0X2NsZWFudXBfdGNfdTMyKGFkYXB0ZXIpOwogCWtmcmVlKGFkYXB0ZXItPnNnZS5lZ3JfbWFwKTsKIAlrZnJlZShhZGFwdGVyLT5zZ2UuaW5ncl9tYXApOwogCWtmcmVlKGFkYXB0ZXItPnNnZS5zdGFydmluZ19mbCk7CkBAIC00ODM0LDIxICs0NDk0LDU5IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUENJX0lPVgorc3RhdGljIHZvaWQgZHVtbXlfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPnR5cGUgPSBBUlBIUkRfTk9ORTsKKwlkZXYtPm10dSA9IDA7CisJZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSAwOworCWRldi0+YWRkcl9sZW4gPSAwOworCWRldi0+dHhfcXVldWVfbGVuID0gMDsKKwlkZXYtPmZsYWdzIHw9IElGRl9OT0FSUDsKKwlkZXYtPnByaXZfZmxhZ3MgfD0gSUZGX05PX1FVRVVFOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHN0cnVjdHVyZS4gKi8KKwlkZXYtPm5ldGRldl9vcHMgPSAmY3hnYjRfbWdtdF9uZXRkZXZfb3BzOworCWRldi0+ZXRodG9vbF9vcHMgPSAmY3hnYjRfbWdtdF9ldGh0b29sX29wczsKKwlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKK30KKworc3RhdGljIGludCBjb25maWdfbWdtdF9kZXYoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaTsKKwljaGFyIG5hbWVbSUZOQU1TSVpdOworCWludCBlcnI7CisKKwlzbnByaW50ZihuYW1lLCBJRk5BTVNJWiwgIm1nbXRwZiVkJWQiLCBhZGFwLT5hZGFwX2lkeCwgYWRhcC0+cGYpOworCW5ldGRldiA9IGFsbG9jX25ldGRldigwLCBuYW1lLCBORVRfTkFNRV9VTktOT1dOLCBkdW1teV9zZXR1cCk7CisJaWYgKCFuZXRkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcGkgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXBpLT5hZGFwdGVyID0gYWRhcDsKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCisJYWRhcC0+cG9ydFswXSA9IG5ldGRldjsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihhZGFwLT5wb3J0WzBdKTsKKwlpZiAoZXJyKSB7CisJCXByX2luZm8oIlVuYWJsZSB0byByZWdpc3RlciBWRiBtZ210IG5ldGRldiAlc1xuIiwgbmFtZSk7CisJCWZyZWVfbmV0ZGV2KGFkYXAtPnBvcnRbMF0pOworCQlhZGFwLT5wb3J0WzBdID0gTlVMTDsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY3hnYjRfaW92X2NvbmZpZ3VyZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IG51bV92ZnMpCiB7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJaW50IGVyciA9IDA7CiAJaW50IGN1cnJlbnRfdmZzID0gcGNpX251bV92ZihwZGV2KTsKIAl1MzIgcGNpZV9mdzsKLQl2b2lkIF9faW9tZW0gKnJlZ3M7CiAKLQlyZWdzID0gcGNpX2lvcmVtYXBfYmFyKHBkZXYsIDApOwotCWlmICghcmVncykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgbWFwIGRldmljZSByZWdpc3RlcnNcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwY2llX2Z3ID0gcmVhZGwocmVncyArIFBDSUVfRldfQSk7Ci0JaW91bm1hcChyZWdzKTsKKwlwY2llX2Z3ID0gcmVhZGwoYWRhcC0+cmVncyArIFBDSUVfRldfQSk7CiAJLyogQ2hlY2sgaWYgY3hnYjQgaXMgdGhlIE1BU1RFUiBhbmQgZncgaXMgaW5pdGlhbGl6ZWQgKi8KIAlpZiAoIShwY2llX2Z3ICYgUENJRV9GV19JTklUX0YpIHx8CiAJICAgICEocGNpZV9mdyAmIFBDSUVfRldfTUFTVEVSX1ZMRF9GKSB8fApAQCAtNDg3NSw2ICs0NTczLDE0IEBACiAJICovCiAJaWYgKCFudW1fdmZzKSB7CiAJCXBjaV9kaXNhYmxlX3NyaW92KHBkZXYpOworCQlpZiAoYWRhcC0+cG9ydFswXSkgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXYoYWRhcC0+cG9ydFswXSk7CisJCQlhZGFwLT5wb3J0WzBdID0gTlVMTDsKKwkJfQorCQkvKiBmcmVlIFZGIHJlc291cmNlcyAqLworCQlrZnJlZShhZGFwLT52ZmluZm8pOworCQlhZGFwLT52ZmluZm8gPSBOVUxMOworCQlhZGFwLT5udW1fdmZzID0gMDsKIAkJcmV0dXJuIG51bV92ZnM7CiAJfQogCkBAIC00ODgyLDcgKzQ1ODgsMTcgQEAKIAkJZXJyID0gcGNpX2VuYWJsZV9zcmlvdihwZGV2LCBudW1fdmZzKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CisKKwkJYWRhcC0+bnVtX3ZmcyA9IG51bV92ZnM7CisJCWVyciA9IGNvbmZpZ19tZ210X2RldihwZGV2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQorCisJYWRhcC0+dmZpbmZvID0ga2NhbGxvYyhhZGFwLT5udW1fdmZzLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdmZfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChhZGFwLT52ZmluZm8pCisJCWZpbGxfdmZfc3RhdGlvbl9tYWNfYWRkcihhZGFwKTsKIAlyZXR1cm4gbnVtX3ZmczsKIH0KICNlbmRpZgpAQCAtNDg5Myw5ICs0NjA5LDExIEBACiAJc3RydWN0IHBvcnRfaW5mbyAqcGk7CiAJYm9vbCBoaWdoZG1hID0gZmFsc2U7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CiAJdm9pZCBfX2lvbWVtICpyZWdzOwogCXUzMiB3aG9hbWksIHBsX3JldjsKIAllbnVtIGNoaXBfdHlwZSBjaGlwOworCXN0YXRpYyBpbnQgYWRhcF9pZHggPSAxOwogCiAJcHJpbnRrX29uY2UoS0VSTl9JTkZPICIlcyAtIHZlcnNpb24gJXNcbiIsIERSVl9ERVNDLCBEUlZfVkVSU0lPTik7CiAKQEAgLTQ5MzAsNyArNDY0OCw5IEBACiAJZnVuYyA9IENIRUxTSU9fQ0hJUF9WRVJTSU9OKGNoaXApIDw9IENIRUxTSU9fVDUgPwogCQlTT1VSQ0VQRl9HKHdob2FtaSkgOiBUNl9TT1VSQ0VQRl9HKHdob2FtaSk7CiAJaWYgKGZ1bmMgIT0gZW50LT5kcml2ZXJfZGF0YSkgeworI2lmbmRlZiBDT05GSUdfUENJX0lPVgogCQlpb3VubWFwKHJlZ3MpOworI2VuZGlmCiAJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAkJcGNpX3NhdmVfc3RhdGUocGRldik7ICAgICAgICAvKiB0byByZXN0b3JlIFNSLUlPViBsYXRlciAqLwogCQlnb3RvIHNyaW92OwpAQCAtNDk2Miw2ICs0NjgyLDcgQEAKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfdW5tYXBfYmFyMDsKIAl9CisJYWRhcF9pZHgrKzsKIAogCWFkYXB0ZXItPndvcmtxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImN4Z2I0Iik7CiAJaWYgKCFhZGFwdGVyLT53b3JrcSkgewpAQCAtNTA0OCw4ICs0NzY5LDYgQEAKIAkJCSAgICAgIFQ2X1NUQVRNT0RFX1YoMCkpKTsKIAogCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkgewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCiAJCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3QgcG9ydF9pbmZvKSwKIAkJCQkJICAgTUFYX0VUSF9RU0VUUyk7CiAJCWlmICghbmV0ZGV2KSB7CkBAIC01MDY5LDcgKzQ3ODgsOCBAQAogCQluZXRkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8IFRTT19GTEFHUyB8CiAJCQlORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTSB8CiAJCQlORVRJRl9GX1JYQ1NVTSB8IE5FVElGX0ZfUlhIQVNIIHwKLQkJCU5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlg7CisJCQlORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCB8IE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYIHwKKwkJCU5FVElGX0ZfSFdfVEM7CiAJCWlmIChoaWdoZG1hKQogCQkJbmV0ZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX0hJR0hETUE7CiAJCW5ldGRldi0+ZmVhdHVyZXMgfD0gbmV0ZGV2LT5od19mZWF0dXJlczsKQEAgLTUxNDMsMTAgKzQ4NjMsMjYgQEAKIAkJfQogCX0KICNlbmRpZgotCWlmIChpc19vZmZsb2FkKGFkYXB0ZXIpICYmIHRpZF9pbml0KCZhZGFwdGVyLT50aWRzKSA8IDApIHsKKworCWZvcl9lYWNoX3BvcnQoYWRhcHRlciwgaSkgeworCQlwaSA9IGFkYXAycGluZm8oYWRhcHRlciwgaSk7CisJCXBpLT5zY2hlZF90YmwgPSB0NF9pbml0X3NjaGVkKGFkYXB0ZXItPnBhcmFtcy5uc2NoZWRfY2xzKTsKKwkJaWYgKCFwaS0+c2NoZWRfdGJsKQorCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCQkgImNvdWxkIG5vdCBhY3RpdmF0ZSBzY2hlZHVsaW5nIG9uIHBvcnQgJWRcbiIsCisJCQkJIGkpOworCX0KKworCWlmICh0aWRfaW5pdCgmYWRhcHRlci0+dGlkcykgPCAwKSB7CiAJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgVElEIHRhYmxlLCAiCiAJCQkgImNvbnRpbnVpbmdcbiIpOwogCQlhZGFwdGVyLT5wYXJhbXMub2ZmbG9hZCA9IDA7CisJfSBlbHNlIHsKKwkJYWRhcHRlci0+dGNfdTMyID0gY3hnYjRfaW5pdF90Y191MzIoYWRhcHRlciwKKwkJCQkJCSAgICBDWEdCNF9NQVhfTElOS19IQU5ETEUpOworCQlpZiAoIWFkYXB0ZXItPnRjX3UzMikKKwkJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkJICJjb3VsZCBub3Qgb2ZmbG9hZCB0YyB1MzIsIGNvbnRpbnVpbmdcbiIpOwogCX0KIAogCWlmIChpc19vZmZsb2FkKGFkYXB0ZXIpKSB7CkBAIC01MTY4LDggKzQ5MDQsMTEgQEAKIAkvKiBTZWUgd2hhdCBpbnRlcnJ1cHRzIHdlJ2xsIGJlIHVzaW5nICovCiAJaWYgKG1zaSA+IDEgJiYgZW5hYmxlX21zaXgoYWRhcHRlcikgPT0gMCkKIAkJYWRhcHRlci0+ZmxhZ3MgfD0gVVNJTkdfTVNJWDsKLQllbHNlIGlmIChtc2kgPiAwICYmIHBjaV9lbmFibGVfbXNpKHBkZXYpID09IDApCisJZWxzZSBpZiAobXNpID4gMCAmJiBwY2lfZW5hYmxlX21zaShwZGV2KSA9PSAwKSB7CiAJCWFkYXB0ZXItPmZsYWdzIHw9IFVTSU5HX01TSTsKKwkJaWYgKG1zaSA+IDEpCisJCQlmcmVlX21zaXhfaW5mbyhhZGFwdGVyKTsKKwl9CiAKIAkvKiBjaGVjayBmb3IgUENJIEV4cHJlc3MgYmFuZHdpZHRoIGNhcGFiaWx0aXRlcyAqLwogCWN4Z2I0X2NoZWNrX3BjaWVfY2FwcyhhZGFwdGVyKTsKQEAgLTUyMTMsMTAgKzQ5NTIsMTUgQEAKIAkvKiBQQ0llIEVFSCByZWNvdmVyeSBvbiBwb3dlcnBjIHBsYXRmb3JtcyBuZWVkcyBmdW5kYW1lbnRhbCByZXNldCAqLwogCXBkZXYtPm5lZWRzX2ZyZXNldCA9IDE7CiAKLQlpZiAoaXNfb2ZmbG9hZChhZGFwdGVyKSkKLQkJYXR0YWNoX3VsZHMoYWRhcHRlcik7CisJaWYgKGlzX3VsZChhZGFwdGVyKSkgeworCQltdXRleF9sb2NrKCZ1bGRfbXV0ZXgpOworCQlsaXN0X2FkZF90YWlsKCZhZGFwdGVyLT5saXN0X25vZGUsICZhZGFwdGVyX2xpc3QpOworCQltdXRleF91bmxvY2soJnVsZF9tdXRleCk7CisJfQogCiAJcHJpbnRfYWRhcHRlcl9pbmZvKGFkYXB0ZXIpOworCXNldHVwX2Z3X3NnZV9xdWV1ZXMoYWRhcHRlcik7CisJcmV0dXJuIDA7CiAKIHNyaW92OgogI2lmZGVmIENPTkZJR19QQ0lfSU9WCkBAIC01MjMwLDExICs0OTc0LDQ4IEBACiAJCQkJICJpbnN0YW50aWF0ZWQgJXUgdmlydHVhbCBmdW5jdGlvbnNcbiIsCiAJCQkJIG51bV92ZltmdW5jXSk7CiAJfQotI2VuZGlmCisKKwlhZGFwdGVyID0ga3phbGxvYyhzaXplb2YoKmFkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmcmVlX3BjaV9yZWdpb247CisJfQorCisJYWRhcHRlci0+cGRldiA9IHBkZXY7CisJYWRhcHRlci0+cGRldl9kZXYgPSAmcGRldi0+ZGV2OworCWFkYXB0ZXItPm5hbWUgPSBwY2lfbmFtZShwZGV2KTsKKwlhZGFwdGVyLT5tYm94ID0gZnVuYzsKKwlhZGFwdGVyLT5wZiA9IGZ1bmM7CisJYWRhcHRlci0+cmVncyA9IHJlZ3M7CisJYWRhcHRlci0+YWRhcF9pZHggPSBhZGFwX2lkeDsKKwlhZGFwdGVyLT5tYm94X2xvZyA9IGt6YWxsb2Moc2l6ZW9mKCphZGFwdGVyLT5tYm94X2xvZykgKworCQkJCSAgICAoc2l6ZW9mKHN0cnVjdCBtYm94X2NtZCkgKgorCQkJCSAgICAgVDRfT1NfTE9HX01CT1hfQ01EUyksCisJCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghYWRhcHRlci0+bWJveF9sb2cpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmcmVlX2FkYXB0ZXI7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBhZGFwdGVyKTsKIAlyZXR1cm4gMDsKIAorIGZyZWVfYWRhcHRlcjoKKwlrZnJlZShhZGFwdGVyKTsKKyBmcmVlX3BjaV9yZWdpb246CisJaW91bm1hcChyZWdzKTsKKwlwY2lfZGlzYWJsZV9zcmlvdihwZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXJldHVybiBlcnI7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCisKICBvdXRfZnJlZV9kZXY6CiAJZnJlZV9zb21lX3Jlc291cmNlcyhhZGFwdGVyKTsKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQlmcmVlX21zaXhfaW5mbyhhZGFwdGVyKTsKKwlpZiAoYWRhcHRlci0+bnVtX3VsZCB8fCBhZGFwdGVyLT5udW1fb2ZsZF91bGQpCisJCXQ0X3VsZF9tZW1fZnJlZShhZGFwdGVyKTsKICBvdXRfdW5tYXBfYmFyOgogCWlmICghaXNfdDQoYWRhcHRlci0+cGFyYW1zLmNoaXApKQogCQlpb3VubWFwKGFkYXB0ZXItPmJhcjIpOwpAQCAtNTI1OCwxMiArNTAzOSwxMiBAQAogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCi0jaWZkZWYgQ09ORklHX1BDSV9JT1YKLQlwY2lfZGlzYWJsZV9zcmlvdihwZGV2KTsKKwlpZiAoIWFkYXB0ZXIpIHsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwkJcmV0dXJuOworCX0KIAotI2VuZGlmCi0KLQlpZiAoYWRhcHRlcikgeworCWlmIChhZGFwdGVyLT5wZiA9PSA0KSB7CiAJCWludCBpOwogCiAJCS8qIFRlYXIgZG93biBwZXItYWRhcHRlciBXb3JrIFF1ZXVlIGZpcnN0IHNpbmNlIGl0IGNhbiBjb250YWluCkBAIC01MjcxLDcgKzUwNTIsNyBAQAogCQkgKi8KIAkJZGVzdHJveV93b3JrcXVldWUoYWRhcHRlci0+d29ya3EpOwogCi0JCWlmIChpc19vZmZsb2FkKGFkYXB0ZXIpKQorCQlpZiAoaXNfdWxkKGFkYXB0ZXIpKQogCQkJZGV0YWNoX3VsZHMoYWRhcHRlcik7CiAKIAkJZGlzYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOwpAQCAtNTI4NSwxNyArNTA2NiwxNSBAQAogCQkvKiBJZiB3ZSBhbGxvY2F0ZWQgZmlsdGVycywgZnJlZSB1cCBzdGF0ZSBhc3NvY2lhdGVkIHdpdGggYW55CiAJCSAqIHZhbGlkIGZpbHRlcnMgLi4uCiAJCSAqLwotCQlpZiAoYWRhcHRlci0+dGlkcy5mdGlkX3RhYikgewotCQkJc3RydWN0IGZpbHRlcl9lbnRyeSAqZiA9ICZhZGFwdGVyLT50aWRzLmZ0aWRfdGFiWzBdOwotCQkJZm9yIChpID0gMDsgaSA8IChhZGFwdGVyLT50aWRzLm5mdGlkcyArCi0JCQkJCWFkYXB0ZXItPnRpZHMubnNmdGlkcyk7IGkrKywgZisrKQotCQkJCWlmIChmLT52YWxpZCkKLQkJCQkJY2xlYXJfZmlsdGVyKGFkYXB0ZXIsIGYpOwotCQl9CisJCWNsZWFyX2FsbF9maWx0ZXJzKGFkYXB0ZXIpOwogCiAJCWlmIChhZGFwdGVyLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQogCQkJY3hnYl9kb3duKGFkYXB0ZXIpOwogCisJCWlmIChhZGFwdGVyLT5mbGFncyAmIFVTSU5HX01TSVgpCisJCQlmcmVlX21zaXhfaW5mbyhhZGFwdGVyKTsKKwkJaWYgKGFkYXB0ZXItPm51bV91bGQgfHwgYWRhcHRlci0+bnVtX29mbGRfdWxkKQorCQkJdDRfdWxkX21lbV9mcmVlKGFkYXB0ZXIpOwogCQlmcmVlX3NvbWVfcmVzb3VyY2VzKGFkYXB0ZXIpOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCXQ0X2NsZWFudXBfY2xpcF90YmwoYWRhcHRlcik7CkBAIC01MzEyLDggKzUwOTEsNjQgQEAKIAkJa2ZyZWUoYWRhcHRlci0+bWJveF9sb2cpOwogCQlzeW5jaHJvbml6ZV9yY3UoKTsKIAkJa2ZyZWUoYWRhcHRlcik7Ci0JfSBlbHNlCisJfQorI2lmZGVmIENPTkZJR19QQ0lfSU9WCisJZWxzZSB7CisJCWlmIChhZGFwdGVyLT5wb3J0WzBdKQorCQkJdW5yZWdpc3Rlcl9uZXRkZXYoYWRhcHRlci0+cG9ydFswXSk7CisJCWlvdW5tYXAoYWRhcHRlci0+cmVncyk7CisJCWtmcmVlKGFkYXB0ZXItPnZmaW5mbyk7CisJCWtmcmVlKGFkYXB0ZXIpOworCQlwY2lfZGlzYWJsZV9zcmlvdihwZGV2KTsKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwl9CisjZW5kaWYKK30KKworLyogIlNodXRkb3duIiBxdWllc2NlcyB0aGUgZGV2aWNlLCBzdG9wcGluZyBJbmdyZXNzIFBhY2tldCBhbmQgSW50ZXJydXB0CisgKiBkZWxpdmVyeS4gIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBzdHJpcHBlZCBkb3duIHZlcnNpb24gb2YgdGhlIFBDSSByZW1vdmUoKQorICogZnVuY3Rpb24gd2hlcmUgd2UgZG8gdGhlIG1pbmltYWwgYW1vdW50IG9mIHdvcmsgbmVjZXNzYXJ5IHRvIHNodXRkb3duIGFueQorICogZnVydGhlciBhY3Rpdml0eS4KKyAqLworc3RhdGljIHZvaWQgc2h1dGRvd25fb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJLyogQXMgd2l0aCByZW1vdmVfb25lKCkgYWJvdmUgKHNlZSBleHRlbmRlZCBjb21tZW50KSwgd2Ugb25seSB3YW50IGRvCisJICogZG8gY2xlYW51cCBvbiBQQ0kgRGV2aWNlcyB3aGljaCB3ZW50IGFsbCB0aGUgd2F5IHRocm91Z2ggaW5pdF9vbmUoKQorCSAqIC4uLgorCSAqLworCWlmICghYWRhcHRlcikgeworCQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCQlyZXR1cm47CisJfQorCisJaWYgKGFkYXB0ZXItPnBmID09IDQpIHsKKwkJaW50IGk7CisKKwkJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKQorCQkJaWYgKGFkYXB0ZXItPnBvcnRbaV0tPnJlZ19zdGF0ZSA9PSBORVRSRUdfUkVHSVNURVJFRCkKKwkJCQljeGdiX2Nsb3NlKGFkYXB0ZXItPnBvcnRbaV0pOworCisJCXQ0X3VsZF9jbGVhbl91cChhZGFwdGVyKTsKKwkJZGlzYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOworCQlkaXNhYmxlX21zaShhZGFwdGVyKTsKKworCQl0NF9zZ2Vfc3RvcChhZGFwdGVyKTsKKwkJaWYgKGFkYXB0ZXItPmZsYWdzICYgRldfT0spCisJCQl0NF9md19ieWUoYWRhcHRlciwgYWRhcHRlci0+bWJveCk7CisJfQorI2lmZGVmIENPTkZJR19QQ0lfSU9WCisJZWxzZSB7CisJCWlmIChhZGFwdGVyLT5wb3J0WzBdKQorCQkJdW5yZWdpc3Rlcl9uZXRkZXYoYWRhcHRlci0+cG9ydFswXSk7CisJCWlvdW5tYXAoYWRhcHRlci0+cmVncyk7CisJCWtmcmVlKGFkYXB0ZXItPnZmaW5mbyk7CisJCWtmcmVlKGFkYXB0ZXIpOworCQlwY2lfZGlzYWJsZV9zcmlvdihwZGV2KTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwl9CisjZW5kaWYKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGN4Z2I0X2RyaXZlciA9IHsKQEAgLTUzMjEsNyArNTE1Niw3IEBACiAJLmlkX3RhYmxlID0gY3hnYjRfcGNpX3RibCwKIAkucHJvYmUgICAgPSBpbml0X29uZSwKIAkucmVtb3ZlICAgPSByZW1vdmVfb25lLAotCS5zaHV0ZG93biA9IHJlbW92ZV9vbmUsCisJLnNodXRkb3duID0gc2h1dGRvd25fb25lLAogI2lmZGVmIENPTkZJR19QQ0lfSU9WCiAJLnNyaW92X2NvbmZpZ3VyZSA9IGN4Z2I0X2lvdl9jb25maWd1cmUsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdGNfdTMyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3RjX3UzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDJkZWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3RjX3UzMi5jCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfZ2FjdC5oPgorI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfbWlycmVkLmg+CisKKyNpbmNsdWRlICJjeGdiNC5oIgorI2luY2x1ZGUgImN4Z2I0X3RjX3UzMl9wYXJzZS5oIgorI2luY2x1ZGUgImN4Z2I0X3RjX3UzMi5oIgorCisvKiBGaWxsIGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uIHdpdGggcGFyc2VkIG1hdGNoIHZhbHVlL21hc2sgcGFpci4gKi8KK3N0YXRpYyBpbnQgZmlsbF9tYXRjaF9maWVsZHMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsCisJCQkgICAgIHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZnMsCisJCQkgICAgIHN0cnVjdCB0Y19jbHNfdTMyX29mZmxvYWQgKmNscywKKwkJCSAgICAgY29uc3Qgc3RydWN0IGN4Z2I0X21hdGNoX2ZpZWxkICplbnRyeSwKKwkJCSAgICAgYm9vbCBuZXh0X2hlYWRlcikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwl1MzIgdmFsLCBtYXNrOworCWludCBvZmYsIGVycjsKKwlib29sIGZvdW5kOworCisJZm9yIChpID0gMDsgaSA8IGNscy0+a25vZGUuc2VsLT5ua2V5czsgaSsrKSB7CisJCW9mZiA9IGNscy0+a25vZGUuc2VsLT5rZXlzW2ldLm9mZjsKKwkJdmFsID0gY2xzLT5rbm9kZS5zZWwtPmtleXNbaV0udmFsOworCQltYXNrID0gY2xzLT5rbm9kZS5zZWwtPmtleXNbaV0ubWFzazsKKworCQlpZiAobmV4dF9oZWFkZXIpIHsKKwkJCS8qIEZvciBuZXh0IGhlYWRlcnMsIHBhcnNlIG9ubHkga2V5cyB3aXRoIG9mZm1hc2sgKi8KKwkJCWlmICghY2xzLT5rbm9kZS5zZWwtPmtleXNbaV0ub2ZmbWFzaykKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCS8qIEZvciB0aGUgcmVtYWluaW5nLCBwYXJzZSBvbmx5IGtleXMgd2l0aG91dCBvZmZtYXNrICovCisJCQlpZiAoY2xzLT5rbm9kZS5zZWwtPmtleXNbaV0ub2ZmbWFzaykKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWZvdW5kID0gZmFsc2U7CisKKwkJZm9yIChqID0gMDsgZW50cnlbal0udmFsOyBqKyspIHsKKwkJCWlmIChvZmYgPT0gZW50cnlbal0ub2ZmKSB7CisJCQkJZm91bmQgPSB0cnVlOworCQkJCWVyciA9IGVudHJ5W2pdLnZhbChmcywgdmFsLCBtYXNrKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlyZXR1cm4gZXJyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFmb3VuZCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBGaWxsIGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uIHdpdGggcGFyc2VkIGFjdGlvbi4gKi8KK3N0YXRpYyBpbnQgZmlsbF9hY3Rpb25fZmllbGRzKHN0cnVjdCBhZGFwdGVyICphZGFwLAorCQkJICAgICAgc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmcywKKwkJCSAgICAgIHN0cnVjdCB0Y19jbHNfdTMyX29mZmxvYWQgKmNscykKK3sKKwl1bnNpZ25lZCBpbnQgbnVtX2FjdGlvbnMgPSAwOworCWNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmE7CisJc3RydWN0IHRjZl9leHRzICpleHRzOworCUxJU1RfSEVBRChhY3Rpb25zKTsKKworCWV4dHMgPSBjbHMtPmtub2RlLmV4dHM7CisJaWYgKHRjX25vX2FjdGlvbnMoZXh0cykpCisJCXJldHVybiAtRUlOVkFMOworCisJdGNmX2V4dHNfdG9fbGlzdChleHRzLCAmYWN0aW9ucyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCAmYWN0aW9ucywgbGlzdCkgeworCQkvKiBEb24ndCBhbGxvdyBtb3JlIHRoYW4gb25lIGFjdGlvbiBwZXIgcnVsZS4gKi8KKwkJaWYgKG51bV9hY3Rpb25zKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogRHJvcCBpbiBoYXJkd2FyZS4gKi8KKwkJaWYgKGlzX3RjZl9nYWN0X3Nob3QoYSkpIHsKKwkJCWZzLT5hY3Rpb24gPSBGSUxURVJfRFJPUDsKKwkJCW51bV9hY3Rpb25zKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFJlLWRpcmVjdCB0byBzcGVjaWZpZWQgcG9ydCBpbiBoYXJkd2FyZS4gKi8KKwkJaWYgKGlzX3RjZl9taXJyZWRfcmVkaXJlY3QoYSkpIHsKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpuX2RldjsKKwkJCXVuc2lnbmVkIGludCBpLCBpbmRleDsKKwkJCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCQkJaW5kZXggPSB0Y2ZfbWlycmVkX2lmaW5kZXgoYSk7CisJCQlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKKwkJCQluX2RldiA9IGFkYXAtPnBvcnRbaV07CisJCQkJaWYgKGluZGV4ID09IG5fZGV2LT5pZmluZGV4KSB7CisJCQkJCWZzLT5hY3Rpb24gPSBGSUxURVJfU1dJVENIOworCQkJCQlmcy0+ZXBvcnQgPSBpOworCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJLyogSW50ZXJmYWNlIGRvZXNuJ3QgYmVsb25nIHRvIGFueSBwb3J0IG9mCisJCQkgKiB0aGUgdW5kZXJseWluZyBoYXJkd2FyZS4KKwkJCSAqLworCQkJaWYgKCFmb3VuZCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJbnVtX2FjdGlvbnMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVW4tc3VwcG9ydGVkIGFjdGlvbi4gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBjeGdiNF9jb25maWdfa25vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTE2IHByb3RvY29sLAorCQkgICAgICAgc3RydWN0IHRjX2Nsc191MzJfb2ZmbG9hZCAqY2xzKQoreworCWNvbnN0IHN0cnVjdCBjeGdiNF9tYXRjaF9maWVsZCAqc3RhcnQsICpsaW5rX3N0YXJ0ID0gTlVMTDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldjJhZGFwKGRldik7CisJc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uIGZzOworCXN0cnVjdCBjeGdiNF90Y191MzJfdGFibGUgKnQ7CisJc3RydWN0IGN4Z2I0X2xpbmsgKmxpbms7CisJdW5zaWduZWQgaW50IGZpbHRlcl9pZDsKKwl1MzIgdWh0aWQsIGxpbmtfdWh0aWQ7CisJYm9vbCBpc19pcHY2ID0gZmFsc2U7CisJaW50IHJldDsKKworCWlmICghY2FuX3RjX3UzMl9vZmZsb2FkKGRldikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmIChwcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkgJiYgcHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVBWNikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIEZldGNoIHRoZSBsb2NhdGlvbiB0byBpbnNlcnQgdGhlIGZpbHRlci4gKi8KKwlmaWx0ZXJfaWQgPSBjbHMtPmtub2RlLmhhbmRsZSAmIDB4RkZGRkY7CisKKwlpZiAoZmlsdGVyX2lkID4gYWRhcHRlci0+dGlkcy5uZnRpZHMpIHsKKwkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJCSJMb2NhdGlvbiAlZCBvdXQgb2YgcmFuZ2UgZm9yIGluc2VydGlvbi4gTWF4OiAlZFxuIiwKKwkJCWZpbHRlcl9pZCwgYWRhcHRlci0+dGlkcy5uZnRpZHMpOworCQlyZXR1cm4gLUVSQU5HRTsKKwl9CisKKwl0ID0gYWRhcHRlci0+dGNfdTMyOworCXVodGlkID0gVENfVTMyX1VTRVJIVElEKGNscy0+a25vZGUuaGFuZGxlKTsKKwlsaW5rX3VodGlkID0gVENfVTMyX1VTRVJIVElEKGNscy0+a25vZGUubGlua19oYW5kbGUpOworCisJLyogRW5zdXJlIHRoYXQgdWh0aWQgaXMgZWl0aGVyIHJvb3QgdTMyIChpLmUuIDB4ODAwKQorCSAqIG9yIGEgYSB2YWxpZCBsaW5rZWQgYnVja2V0LgorCSAqLworCWlmICh1aHRpZCAhPSAweDgwMCAmJiB1aHRpZCA+PSB0LT5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEVuc3VyZSBsaW5rIGhhbmRsZSB1aHRpZCBpcyBzYW5lLCBpZiBzcGVjaWZpZWQuICovCisJaWYgKGxpbmtfdWh0aWQgPj0gdC0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1zZXQoJmZzLCAwLCBzaXplb2YoZnMpKTsKKworCWlmIChwcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkgeworCQlzdGFydCA9IGN4Z2I0X2lwdjZfZmllbGRzOworCQlpc19pcHY2ID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlzdGFydCA9IGN4Z2I0X2lwdjRfZmllbGRzOworCQlpc19pcHY2ID0gZmFsc2U7CisJfQorCisJaWYgKHVodGlkICE9IDB4ODAwKSB7CisJCS8qIExpbmsgbXVzdCBleGlzdCBmcm9tIHJvb3Qgbm9kZSBiZWZvcmUgaW5zZXJ0aW9uLiAqLworCQlpZiAoIXQtPnRhYmxlW3VodGlkIC0gMV0ubGlua19oYW5kbGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBMaW5rIG11c3QgaGF2ZSBhIHZhbGlkIHN1cHBvcnRlZCBuZXh0IGhlYWRlci4gKi8KKwkJbGlua19zdGFydCA9IHQtPnRhYmxlW3VodGlkIC0gMV0ubWF0Y2hfZmllbGQ7CisJCWlmICghbGlua19zdGFydCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFBhcnNlIGxpbmtzIGFuZCByZWNvcmQgdGhlbSBmb3Igc3Vic2VxdWVudCBqdW1wcyB0byB2YWxpZAorCSAqIG5leHQgaGVhZGVycy4KKwkgKi8KKwlpZiAobGlua191aHRpZCkgeworCQljb25zdCBzdHJ1Y3QgY3hnYjRfbmV4dF9oZWFkZXIgKm5leHQ7CisJCWJvb2wgZm91bmQgPSBmYWxzZTsKKwkJdW5zaWduZWQgaW50IGksIGo7CisJCXUzMiB2YWwsIG1hc2s7CisJCWludCBvZmY7CisKKwkJaWYgKHQtPnRhYmxlW2xpbmtfdWh0aWQgLSAxXS5saW5rX2hhbmRsZSkgeworCQkJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJCQkiTGluayBoYW5kbGUgZXhpc3RzIGZvcjogMHgleFxuIiwKKwkJCQlsaW5rX3VodGlkKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJbmV4dCA9IGlzX2lwdjYgPyBjeGdiNF9pcHY2X2p1bXBzIDogY3hnYjRfaXB2NF9qdW1wczsKKworCQkvKiBUcnkgdG8gZmluZCBtYXRjaGVzIHRoYXQgYWxsb3cganVtcHMgdG8gbmV4dCBoZWFkZXIuICovCisJCWZvciAoaSA9IDA7IG5leHRbaV0uanVtcDsgaSsrKSB7CisJCQlpZiAobmV4dFtpXS5vZmZvZmYgIT0gY2xzLT5rbm9kZS5zZWwtPm9mZm9mZiB8fAorCQkJICAgIG5leHRbaV0uc2hpZnQgIT0gY2xzLT5rbm9kZS5zZWwtPm9mZnNoaWZ0IHx8CisJCQkgICAgbmV4dFtpXS5tYXNrICE9IGNscy0+a25vZGUuc2VsLT5vZmZtYXNrIHx8CisJCQkgICAgbmV4dFtpXS5vZmZzZXQgIT0gY2xzLT5rbm9kZS5zZWwtPm9mZikKKwkJCQljb250aW51ZTsKKworCQkJLyogRm91bmQgYSBwb3NzaWJsZSBjYW5kaWRhdGUuICBGaW5kIGEga2V5IHRoYXQKKwkJCSAqIG1hdGNoZXMgdGhlIGNvcnJlc3BvbmRpbmcgb2Zmc2V0LCB2YWx1ZSwgYW5kCisJCQkgKiBtYXNrIHRvIGp1bXAgdG8gbmV4dCBoZWFkZXIuCisJCQkgKi8KKwkJCWZvciAoaiA9IDA7IGogPCBjbHMtPmtub2RlLnNlbC0+bmtleXM7IGorKykgeworCQkJCW9mZiA9IGNscy0+a25vZGUuc2VsLT5rZXlzW2pdLm9mZjsKKwkJCQl2YWwgPSBjbHMtPmtub2RlLnNlbC0+a2V5c1tqXS52YWw7CisJCQkJbWFzayA9IGNscy0+a25vZGUuc2VsLT5rZXlzW2pdLm1hc2s7CisKKwkJCQlpZiAobmV4dFtpXS5tYXRjaF9vZmYgPT0gb2ZmICYmCisJCQkJICAgIG5leHRbaV0ubWF0Y2hfdmFsID09IHZhbCAmJgorCQkJCSAgICBuZXh0W2ldLm1hdGNoX21hc2sgPT0gbWFzaykgeworCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCFmb3VuZCkKKwkJCQljb250aW51ZTsgLyogVHJ5IG5leHQgY2FuZGlkYXRlLiAqLworCisJCQkvKiBDYW5kaWRhdGUgdG8ganVtcCB0byBuZXh0IGhlYWRlciBmb3VuZC4KKwkJCSAqIFRyYW5zbGF0ZSBhbGwga2V5cyB0byBpbnRlcm5hbCBzcGVjaWZpY2F0aW9uCisJCQkgKiBhbmQgc3RvcmUgdGhlbSBpbiBqdW1wIHRhYmxlLiBUaGlzIHNwZWMgaXMgY29waWVkCisJCQkgKiBsYXRlciB0byBzZXQgdGhlIGFjdHVhbCBmaWx0ZXJzLgorCQkJICovCisJCQlyZXQgPSBmaWxsX21hdGNoX2ZpZWxkcyhhZGFwdGVyLCAmZnMsIGNscywKKwkJCQkJCXN0YXJ0LCBmYWxzZSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCisJCQlsaW5rID0gJnQtPnRhYmxlW2xpbmtfdWh0aWQgLSAxXTsKKwkJCWxpbmstPm1hdGNoX2ZpZWxkID0gbmV4dFtpXS5qdW1wOworCQkJbGluay0+bGlua19oYW5kbGUgPSBjbHMtPmtub2RlLmhhbmRsZTsKKwkJCW1lbWNweSgmbGluay0+ZnMsICZmcywgc2l6ZW9mKGZzKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE5vIGNhbmRpZGF0ZSBmb3VuZCB0byBqdW1wIHRvIG5leHQgaGVhZGVyLiAqLworCQlpZiAoIWZvdW5kKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogRmlsbCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiBtYXRjaCBmaWVsZHMgdG8gYmUgc2hpcHBlZCB0byBoYXJkd2FyZS4KKwkgKiBDb3B5IHRoZSBsaW5rZWQgc3BlYyAoaWYgYW55KSBmaXJzdC4gIEFuZCB0aGVuIHVwZGF0ZSB0aGUgc3BlYyBhcworCSAqIG5lZWRlZC4KKwkgKi8KKwlpZiAodWh0aWQgIT0gMHg4MDAgJiYgdC0+dGFibGVbdWh0aWQgLSAxXS5saW5rX2hhbmRsZSkgeworCQkvKiBDb3B5IGxpbmtlZCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqLworCQltZW1jcHkoJmZzLCAmdC0+dGFibGVbdWh0aWQgLSAxXS5mcywgc2l6ZW9mKGZzKSk7CisJCXJldCA9IGZpbGxfbWF0Y2hfZmllbGRzKGFkYXB0ZXIsICZmcywgY2xzLAorCQkJCQlsaW5rX3N0YXJ0LCB0cnVlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGZpbGxfbWF0Y2hfZmllbGRzKGFkYXB0ZXIsICZmcywgY2xzLCBzdGFydCwgZmFsc2UpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogRmlsbCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiBhY3Rpb24gZmllbGRzIHRvIGJlIHNoaXBwZWQgdG8KKwkgKiBoYXJkd2FyZS4KKwkgKi8KKwlyZXQgPSBmaWxsX2FjdGlvbl9maWVsZHMoYWRhcHRlciwgJmZzLCBjbHMpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogVGhlIGZpbHRlciBzcGVjIGhhcyBiZWVuIGNvbXBsZXRlbHkgYnVpbHQgZnJvbSB0aGUgaW5mbworCSAqIHByb3ZpZGVkIGZyb20gdTMyLiAgV2Ugbm93IHNldCBzb21lIGRlZmF1bHQgZmllbGRzIGluIHRoZQorCSAqIHNwZWMgZm9yIHNhbml0eS4KKwkgKi8KKworCS8qIE1hdGNoIG9ubHkgcGFja2V0cyBjb21pbmcgZnJvbSB0aGUgaW5ncmVzcyBwb3J0IHdoZXJlIHRoaXMKKwkgKiBmaWx0ZXIgd2lsbCBiZSBjcmVhdGVkLgorCSAqLworCWZzLnZhbC5pcG9ydCA9IG5ldGRldjJwaW5mbyhkZXYpLT5wb3J0X2lkOworCWZzLm1hc2suaXBvcnQgPSB+MDsKKworCS8qIEVuYWJsZSBmaWx0ZXIgaGl0IGNvdW50cy4gKi8KKwlmcy5oaXRjbnRzID0gMTsKKworCS8qIFNldCB0eXBlIG9mIGZpbHRlciAtIElQdjYgb3IgSVB2NCAqLworCWZzLnR5cGUgPSBpc19pcHY2ID8gMSA6IDA7CisKKwkvKiBTZXQgdGhlIGZpbHRlciAqLworCXJldCA9IGN4Z2I0X3NldF9maWx0ZXIoZGV2LCBmaWx0ZXJfaWQsICZmcyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBJZiB0aGlzIGlzIGEgbGlua2VkIGJ1Y2tldCwgdGhlbiBzZXQgdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiBlbnRyeSBpbiB0aGUgYml0bWFwIHRvIG1hcmsgaXQgYXMgYmVsb25naW5nIHRvIHRoaXMgbGlua2VkCisJICogYnVja2V0LgorCSAqLworCWlmICh1aHRpZCAhPSAweDgwMCAmJiB0LT50YWJsZVt1aHRpZCAtIDFdLmxpbmtfaGFuZGxlKQorCQlzZXRfYml0KGZpbHRlcl9pZCwgdC0+dGFibGVbdWh0aWQgLSAxXS50aWRfbWFwKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2ludCBjeGdiNF9kZWxldGVfa25vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTE2IHByb3RvY29sLAorCQkgICAgICAgc3RydWN0IHRjX2Nsc191MzJfb2ZmbG9hZCAqY2xzKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKKwl1bnNpZ25lZCBpbnQgZmlsdGVyX2lkLCBtYXhfdGlkcywgaSwgajsKKwlzdHJ1Y3QgY3hnYjRfbGluayAqbGluayA9IE5VTEw7CisJc3RydWN0IGN4Z2I0X3RjX3UzMl90YWJsZSAqdDsKKwl1MzIgaGFuZGxlLCB1aHRpZDsKKwlpbnQgcmV0OworCisJaWYgKCFjYW5fdGNfdTMyX29mZmxvYWQoZGV2KSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogRmV0Y2ggdGhlIGxvY2F0aW9uIHRvIGRlbGV0ZSB0aGUgZmlsdGVyLiAqLworCWZpbHRlcl9pZCA9IGNscy0+a25vZGUuaGFuZGxlICYgMHhGRkZGRjsKKworCWlmIChmaWx0ZXJfaWQgPiBhZGFwdGVyLT50aWRzLm5mdGlkcykgeworCQlkZXZfZXJyKGFkYXB0ZXItPnBkZXZfZGV2LAorCQkJIkxvY2F0aW9uICVkIG91dCBvZiByYW5nZSBmb3IgZGVsZXRpb24uIE1heDogJWRcbiIsCisJCQlmaWx0ZXJfaWQsIGFkYXB0ZXItPnRpZHMubmZ0aWRzKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQorCisJdCA9IGFkYXB0ZXItPnRjX3UzMjsKKwloYW5kbGUgPSBjbHMtPmtub2RlLmhhbmRsZTsKKwl1aHRpZCA9IFRDX1UzMl9VU0VSSFRJRChjbHMtPmtub2RlLmhhbmRsZSk7CisKKwkvKiBFbnN1cmUgdGhhdCB1aHRpZCBpcyBlaXRoZXIgcm9vdCB1MzIgKGkuZS4gMHg4MDApCisJICogb3IgYSBhIHZhbGlkIGxpbmtlZCBidWNrZXQuCisJICovCisJaWYgKHVodGlkICE9IDB4ODAwICYmIHVodGlkID49IHQtPnNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRGVsZXRlIHRoZSBzcGVjaWZpZWQgZmlsdGVyICovCisJaWYgKHVodGlkICE9IDB4ODAwKSB7CisJCWxpbmsgPSAmdC0+dGFibGVbdWh0aWQgLSAxXTsKKwkJaWYgKCFsaW5rLT5saW5rX2hhbmRsZSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICghdGVzdF9iaXQoZmlsdGVyX2lkLCBsaW5rLT50aWRfbWFwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGN4Z2I0X2RlbF9maWx0ZXIoZGV2LCBmaWx0ZXJfaWQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKGxpbmspCisJCWNsZWFyX2JpdChmaWx0ZXJfaWQsIGxpbmstPnRpZF9tYXApOworCisJLyogSWYgYSBsaW5rIGlzIGJlaW5nIGRlbGV0ZWQsIHRoZW4gZGVsZXRlIGFsbCBmaWx0ZXJzCisJICogYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rLgorCSAqLworCW1heF90aWRzID0gYWRhcHRlci0+dGlkcy5uZnRpZHM7CisJZm9yIChpID0gMDsgaSA8IHQtPnNpemU7IGkrKykgeworCQlsaW5rID0gJnQtPnRhYmxlW2ldOworCisJCWlmIChsaW5rLT5saW5rX2hhbmRsZSA9PSBoYW5kbGUpIHsKKwkJCWZvciAoaiA9IDA7IGogPCBtYXhfdGlkczsgaisrKSB7CisJCQkJaWYgKCF0ZXN0X2JpdChqLCBsaW5rLT50aWRfbWFwKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlyZXQgPSBfX2N4Z2I0X2RlbF9maWx0ZXIoZGV2LCBqLCBOVUxMKTsKKwkJCQlpZiAocmV0KQorCQkJCQlnb3RvIG91dDsKKworCQkJCWNsZWFyX2JpdChqLCBsaW5rLT50aWRfbWFwKTsKKwkJCX0KKworCQkJLyogQ2xlYXIgdGhlIGxpbmsgc3RhdGUgKi8KKwkJCWxpbmstPm1hdGNoX2ZpZWxkID0gTlVMTDsKKwkJCWxpbmstPmxpbmtfaGFuZGxlID0gMDsKKwkJCW1lbXNldCgmbGluay0+ZnMsIDAsIHNpemVvZihsaW5rLT5mcykpOworCQkJYnJlYWs7CisJCX0KKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGN4Z2I0X2NsZWFudXBfdGNfdTMyKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBjeGdiNF90Y191MzJfdGFibGUgKnQ7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIWFkYXAtPnRjX3UzMikKKwkJcmV0dXJuOworCisJLyogRnJlZSB1cCBhbGwgYWxsb2NhdGVkIG1lbW9yeS4gKi8KKwl0ID0gYWRhcC0+dGNfdTMyOworCWZvciAoaSA9IDA7IGkgPCB0LT5zaXplOyBpKyspIHsKKwkJc3RydWN0IGN4Z2I0X2xpbmsgKmxpbmsgPSAmdC0+dGFibGVbaV07CisKKwkJdDRfZnJlZV9tZW0obGluay0+dGlkX21hcCk7CisJfQorCXQ0X2ZyZWVfbWVtKGFkYXAtPnRjX3UzMik7Cit9CisKK3N0cnVjdCBjeGdiNF90Y191MzJfdGFibGUgKmN4Z2I0X2luaXRfdGNfdTMyKHN0cnVjdCBhZGFwdGVyICphZGFwLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBjeGdiNF90Y191MzJfdGFibGUgKnQ7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIXNpemUpCisJCXJldHVybiBOVUxMOworCisJdCA9IHQ0X2FsbG9jX21lbShzaXplb2YoKnQpICsKKwkJCSAoc2l6ZSAqIHNpemVvZihzdHJ1Y3QgY3hnYjRfbGluaykpKTsKKwlpZiAoIXQpCisJCXJldHVybiBOVUxMOworCisJdC0+c2l6ZSA9IHNpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgdC0+c2l6ZTsgaSsrKSB7CisJCXN0cnVjdCBjeGdiNF9saW5rICpsaW5rID0gJnQtPnRhYmxlW2ldOworCQl1bnNpZ25lZCBpbnQgYm1hcF9zaXplOworCQl1bnNpZ25lZCBpbnQgbWF4X3RpZHM7CisKKwkJbWF4X3RpZHMgPSBhZGFwLT50aWRzLm5mdGlkczsKKwkJYm1hcF9zaXplID0gQklUU19UT19MT05HUyhtYXhfdGlkcyk7CisJCWxpbmstPnRpZF9tYXAgPSB0NF9hbGxvY19tZW0oc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogYm1hcF9zaXplKTsKKwkJaWYgKCFsaW5rLT50aWRfbWFwKQorCQkJZ290byBvdXRfbm9fbWVtOworCQliaXRtYXBfemVybyhsaW5rLT50aWRfbWFwLCBtYXhfdGlkcyk7CisJfQorCisJcmV0dXJuIHQ7CisKK291dF9ub19tZW06CisJZm9yIChpID0gMDsgaSA8IHQtPnNpemU7IGkrKykgeworCQlzdHJ1Y3QgY3hnYjRfbGluayAqbGluayA9ICZ0LT50YWJsZVtpXTsKKworCQlpZiAobGluay0+dGlkX21hcCkKKwkJCXQ0X2ZyZWVfbWVtKGxpbmstPnRpZF9tYXApOworCX0KKworCWlmICh0KQorCQl0NF9mcmVlX21lbSh0KTsKKworCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF90Y191MzIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdGNfdTMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkYzg4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdGNfdTMyLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19DWEdCNF9UQ19VMzJfSAorI2RlZmluZSBfX0NYR0I0X1RDX1UzMl9ICisKKyNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgorCisjZGVmaW5lIENYR0I0X01BWF9MSU5LX0hBTkRMRSAzMgorCitzdGF0aWMgaW5saW5lIGJvb2wgY2FuX3RjX3UzMl9vZmZsb2FkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBuZXRkZXYyYWRhcChkZXYpOworCisJcmV0dXJuIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19UQykgJiYgYWRhcC0+dGNfdTMyID8gdHJ1ZSA6IGZhbHNlOworfQorCitpbnQgY3hnYjRfY29uZmlnX2tub2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUxNiBwcm90b2NvbCwKKwkJICAgICAgIHN0cnVjdCB0Y19jbHNfdTMyX29mZmxvYWQgKmNscyk7CitpbnQgY3hnYjRfZGVsZXRlX2tub2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUxNiBwcm90b2NvbCwKKwkJICAgICAgIHN0cnVjdCB0Y19jbHNfdTMyX29mZmxvYWQgKmNscyk7CisKK3ZvaWQgY3hnYjRfY2xlYW51cF90Y191MzIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOworc3RydWN0IGN4Z2I0X3RjX3UzMl90YWJsZSAqY3hnYjRfaW5pdF90Y191MzIoc3RydWN0IGFkYXB0ZXIgKmFkYXAsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHNpemUpOworI2VuZGlmIC8qIF9fQ1hHQjRfVENfVTMyX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdGNfdTMyX3BhcnNlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3RjX3UzMl9wYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Yjk5ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3RjX3UzMl9wYXJzZS5oCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0NYR0I0X1RDX1UzMl9QQVJTRV9ICisjZGVmaW5lIF9fQ1hHQjRfVENfVTMyX1BBUlNFX0gKKworc3RydWN0IGN4Z2I0X21hdGNoX2ZpZWxkIHsKKwlpbnQgb2ZmOyAvKiBPZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZWFkZXIgdG8gbWF0Y2ggKi8KKwkvKiBGaWxsIHRoZSB2YWx1ZS9tYXNrIHBhaXIgaW4gdGhlIHNwZWMgaWYgbWF0Y2hlZCAqLworCWludCAoKnZhbCkoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLCB1MzIgdmFsLCB1MzIgbWFzayk7Cit9OworCisvKiBJUHY0IG1hdGNoIGZpZWxkcyAqLworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY0X3RvcyhzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJICAgICAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJZi0+dmFsLnRvcyAgPSAobnRvaGwodmFsKSAgPj4gMTYpICYgMHgwMDAwMDBGRjsKKwlmLT5tYXNrLnRvcyA9IChudG9obChtYXNrKSA+PiAxNikgJiAweDAwMDAwMEZGOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2NF9mcmFnKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkgICAgICAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJdTMyIG1hc2tfdmFsOworCXU4IGZyYWdfdmFsOworCisJZnJhZ192YWwgPSAobnRvaGwodmFsKSA+PiAxMykgJiAweDAwMDAwMDA3OworCW1hc2tfdmFsID0gbnRvaGwobWFzaykgJiAweDAwMDBGRkZGOworCisJaWYgKGZyYWdfdmFsID09IDB4MSAmJiBtYXNrX3ZhbCAhPSAweDNGRkYpIHsgLyogTUYgc2V0ICovCisJCWYtPnZhbC5mcmFnID0gMTsKKwkJZi0+bWFzay5mcmFnID0gMTsKKwl9IGVsc2UgaWYgKGZyYWdfdmFsID09IDB4MiAmJiBtYXNrX3ZhbCAhPSAweDNGRkYpIHsgLyogREYgc2V0ICovCisJCWYtPnZhbC5mcmFnID0gMDsKKwkJZi0+bWFzay5mcmFnID0gMTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY0X3Byb3RvKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJdTMyIHZhbCwgdTMyIG1hc2spCit7CisJZi0+dmFsLnByb3RvICA9IChudG9obCh2YWwpICA+PiAxNikgJiAweDAwMDAwMEZGOworCWYtPm1hc2sucHJvdG8gPSAobnRvaGwobWFzaykgPj4gMTYpICYgMHgwMDAwMDBGRjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjRfc3JjX2lwKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCW1lbWNweSgmZi0+dmFsLmZpcFswXSwgICZ2YWwsICBzaXplb2YodTMyKSk7CisJbWVtY3B5KCZmLT5tYXNrLmZpcFswXSwgJm1hc2ssIHNpemVvZih1MzIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjRfZHN0X2lwKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCW1lbWNweSgmZi0+dmFsLmxpcFswXSwgICZ2YWwsICBzaXplb2YodTMyKSk7CisJbWVtY3B5KCZmLT5tYXNrLmxpcFswXSwgJm1hc2ssIHNpemVvZih1MzIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGN4Z2I0X21hdGNoX2ZpZWxkIGN4Z2I0X2lwdjRfZmllbGRzW10gPSB7CisJeyAub2ZmID0gMCwgIC52YWwgPSBjeGdiNF9maWxsX2lwdjRfdG9zIH0sCisJeyAub2ZmID0gNCwgIC52YWwgPSBjeGdiNF9maWxsX2lwdjRfZnJhZyB9LAorCXsgLm9mZiA9IDgsICAudmFsID0gY3hnYjRfZmlsbF9pcHY0X3Byb3RvIH0sCisJeyAub2ZmID0gMTIsIC52YWwgPSBjeGdiNF9maWxsX2lwdjRfc3JjX2lwIH0sCisJeyAub2ZmID0gMTYsIC52YWwgPSBjeGdiNF9maWxsX2lwdjRfZHN0X2lwIH0sCisJeyAudmFsID0gTlVMTCB9Cit9OworCisvKiBJUHY2IG1hdGNoIGZpZWxkcyAqLworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY2X3RvcyhzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJICAgICAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJZi0+dmFsLnRvcyAgPSAobnRvaGwodmFsKSAgPj4gMjApICYgMHgwMDAwMDBGRjsKKwlmLT5tYXNrLnRvcyA9IChudG9obChtYXNrKSA+PiAyMCkgJiAweDAwMDAwMEZGOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2Nl9wcm90byhzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCXUzMiB2YWwsIHUzMiBtYXNrKQoreworCWYtPnZhbC5wcm90byAgPSAobnRvaGwodmFsKSAgPj4gOCkgJiAweDAwMDAwMEZGOworCWYtPm1hc2sucHJvdG8gPSAobnRvaGwobWFzaykgPj4gOCkgJiAweDAwMDAwMEZGOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2Nl9zcmNfaXAwKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwltZW1jcHkoJmYtPnZhbC5maXBbMF0sICAmdmFsLCAgc2l6ZW9mKHUzMikpOworCW1lbWNweSgmZi0+bWFzay5maXBbMF0sICZtYXNrLCBzaXplb2YodTMyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY2X3NyY19pcDEoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQkgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCW1lbWNweSgmZi0+dmFsLmZpcFs0XSwgICZ2YWwsICBzaXplb2YodTMyKSk7CisJbWVtY3B5KCZmLT5tYXNrLmZpcFs0XSwgJm1hc2ssIHNpemVvZih1MzIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjZfc3JjX2lwMihzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCSAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJbWVtY3B5KCZmLT52YWwuZmlwWzhdLCAgJnZhbCwgIHNpemVvZih1MzIpKTsKKwltZW1jcHkoJmYtPm1hc2suZmlwWzhdLCAmbWFzaywgc2l6ZW9mKHUzMikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2Nl9zcmNfaXAzKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwltZW1jcHkoJmYtPnZhbC5maXBbMTJdLCAgJnZhbCwgIHNpemVvZih1MzIpKTsKKwltZW1jcHkoJmYtPm1hc2suZmlwWzEyXSwgJm1hc2ssIHNpemVvZih1MzIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjZfZHN0X2lwMChzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCSAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJbWVtY3B5KCZmLT52YWwubGlwWzBdLCAgJnZhbCwgIHNpemVvZih1MzIpKTsKKwltZW1jcHkoJmYtPm1hc2subGlwWzBdLCAmbWFzaywgc2l6ZW9mKHUzMikpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfaXB2Nl9kc3RfaXAxKHN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiAqZiwKKwkJCQkJICB1MzIgdmFsLCB1MzIgbWFzaykKK3sKKwltZW1jcHkoJmYtPnZhbC5saXBbNF0sICAmdmFsLCAgc2l6ZW9mKHUzMikpOworCW1lbWNweSgmZi0+bWFzay5saXBbNF0sICZtYXNrLCBzaXplb2YodTMyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY3hnYjRfZmlsbF9pcHY2X2RzdF9pcDIoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCQkgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCW1lbWNweSgmZi0+dmFsLmxpcFs4XSwgICZ2YWwsICBzaXplb2YodTMyKSk7CisJbWVtY3B5KCZmLT5tYXNrLmxpcFs4XSwgJm1hc2ssIHNpemVvZih1MzIpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjeGdiNF9maWxsX2lwdjZfZHN0X2lwMyhzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmYsCisJCQkJCSAgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJbWVtY3B5KCZmLT52YWwubGlwWzEyXSwgICZ2YWwsICBzaXplb2YodTMyKSk7CisJbWVtY3B5KCZmLT5tYXNrLmxpcFsxMl0sICZtYXNrLCBzaXplb2YodTMyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjeGdiNF9tYXRjaF9maWVsZCBjeGdiNF9pcHY2X2ZpZWxkc1tdID0geworCXsgLm9mZiA9IDAsICAudmFsID0gY3hnYjRfZmlsbF9pcHY2X3RvcyB9LAorCXsgLm9mZiA9IDQsICAudmFsID0gY3hnYjRfZmlsbF9pcHY2X3Byb3RvIH0sCisJeyAub2ZmID0gOCwgIC52YWwgPSBjeGdiNF9maWxsX2lwdjZfc3JjX2lwMCB9LAorCXsgLm9mZiA9IDEyLCAudmFsID0gY3hnYjRfZmlsbF9pcHY2X3NyY19pcDEgfSwKKwl7IC5vZmYgPSAxNiwgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2Nl9zcmNfaXAyIH0sCisJeyAub2ZmID0gMjAsIC52YWwgPSBjeGdiNF9maWxsX2lwdjZfc3JjX2lwMyB9LAorCXsgLm9mZiA9IDI0LCAudmFsID0gY3hnYjRfZmlsbF9pcHY2X2RzdF9pcDAgfSwKKwl7IC5vZmYgPSAyOCwgLnZhbCA9IGN4Z2I0X2ZpbGxfaXB2Nl9kc3RfaXAxIH0sCisJeyAub2ZmID0gMzIsIC52YWwgPSBjeGdiNF9maWxsX2lwdjZfZHN0X2lwMiB9LAorCXsgLm9mZiA9IDM2LCAudmFsID0gY3hnYjRfZmlsbF9pcHY2X2RzdF9pcDMgfSwKKwl7IC52YWwgPSBOVUxMIH0KK307CisKKy8qIFRDUC9VRFAgbWF0Y2ggKi8KK3N0YXRpYyBpbmxpbmUgaW50IGN4Z2I0X2ZpbGxfbDRfcG9ydHMoc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmLAorCQkJCSAgICAgIHUzMiB2YWwsIHUzMiBtYXNrKQoreworCWYtPnZhbC5mcG9ydCAgPSBudG9obCh2YWwpICA+PiAxNjsKKwlmLT5tYXNrLmZwb3J0ID0gbnRvaGwobWFzaykgPj4gMTY7CisJZi0+dmFsLmxwb3J0ICA9IG50b2hsKHZhbCkgICYgMHgwMDAwRkZGRjsKKwlmLT5tYXNrLmxwb3J0ID0gbnRvaGwobWFzaykgJiAweDAwMDBGRkZGOworCisJcmV0dXJuIDA7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGN4Z2I0X21hdGNoX2ZpZWxkIGN4Z2I0X3RjcF9maWVsZHNbXSA9IHsKKwl7IC5vZmYgPSAwLCAudmFsID0gY3hnYjRfZmlsbF9sNF9wb3J0cyB9LAorCXsgLnZhbCA9IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjeGdiNF9tYXRjaF9maWVsZCBjeGdiNF91ZHBfZmllbGRzW10gPSB7CisJeyAub2ZmID0gMCwgLnZhbCA9IGN4Z2I0X2ZpbGxfbDRfcG9ydHMgfSwKKwl7IC52YWwgPSBOVUxMIH0KK307CisKK3N0cnVjdCBjeGdiNF9uZXh0X2hlYWRlciB7CisJdW5zaWduZWQgaW50IG9mZnNldDsgLyogT2Zmc2V0IHRvIG5leHQgaGVhZGVyICovCisJLyogb2Zmc2V0LCBzaGlmdCwgYW5kIG1hc2sgYWRkZWQgdG8gb2Zmc2V0IGFib3ZlCisJICogdG8gZ2V0IHRvIG5leHQgaGVhZGVyLiAgVXNlZnVsIHdoZW4gdXNpbmcgYSBoZWFkZXIKKwkgKiBmaWVsZCdzIHZhbHVlIHRvIGp1bXAgdG8gbmV4dCBoZWFkZXIgc3VjaCBhcyBJSEwgZmllbGQKKwkgKiBpbiBJUHY0IGhlYWRlci4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgb2Zmb2ZmOworCXUzMiBzaGlmdDsKKwl1MzIgbWFzazsKKwkvKiBtYXRjaCBjcml0ZXJpYSB0byBtYWtlIHRoaXMganVtcCAqLworCXVuc2lnbmVkIGludCBtYXRjaF9vZmY7CisJdTMyIG1hdGNoX3ZhbDsKKwl1MzIgbWF0Y2hfbWFzazsKKwkvKiBsb2NhdGlvbiBvZiBqdW1wIHRvIG1ha2UgKi8KKwljb25zdCBzdHJ1Y3QgY3hnYjRfbWF0Y2hfZmllbGQgKmp1bXA7Cit9OworCisvKiBBY2NlcHQgYSBydWxlIHdpdGggYSBqdW1wIHRvIHRyYW5zcG9ydCBsYXllciBoZWFkZXIgYmFzZWQgb24gSUhMIGZpZWxkIGluCisgKiBJUHY0IGhlYWRlci4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjeGdiNF9uZXh0X2hlYWRlciBjeGdiNF9pcHY0X2p1bXBzW10gPSB7CisJeyAub2Zmc2V0ID0gMCwgLm9mZm9mZiA9IDAsIC5zaGlmdCA9IDYsIC5tYXNrID0gMHhGLAorCSAgLm1hdGNoX29mZiA9IDgsIC5tYXRjaF92YWwgPSAweDYwMCwgLm1hdGNoX21hc2sgPSAweEZGMDAsCisJICAuanVtcCA9IGN4Z2I0X3RjcF9maWVsZHMgfSwKKwl7IC5vZmZzZXQgPSAwLCAub2Zmb2ZmID0gMCwgLnNoaWZ0ID0gNiwgLm1hc2sgPSAweEYsCisJICAubWF0Y2hfb2ZmID0gOCwgLm1hdGNoX3ZhbCA9IDB4MTEwMCwgLm1hdGNoX21hc2sgPSAweEZGMDAsCisJICAuanVtcCA9IGN4Z2I0X3VkcF9maWVsZHMgfSwKKwl7IC5qdW1wID0gTlVMTCB9Cit9OworCisvKiBBY2NlcHQgYSBydWxlIHdpdGggYSBqdW1wIGRpcmVjdGx5IHBhc3QgdGhlIDQwIEJ5dGVzIG9mIElQdjYgZml4ZWQgaGVhZGVyCisgKiB0byBnZXQgdG8gdHJhbnNwb3J0IGxheWVyIGhlYWRlci4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjeGdiNF9uZXh0X2hlYWRlciBjeGdiNF9pcHY2X2p1bXBzW10gPSB7CisJeyAub2Zmc2V0ID0gMHgyOCwgLm9mZm9mZiA9IDAsIC5zaGlmdCA9IDAsIC5tYXNrID0gMCwKKwkgIC5tYXRjaF9vZmYgPSA0LCAubWF0Y2hfdmFsID0gMHg2MDAwMCwgLm1hdGNoX21hc2sgPSAweEZGMDAwMCwKKwkgIC5qdW1wID0gY3hnYjRfdGNwX2ZpZWxkcyB9LAorCXsgLm9mZnNldCA9IDB4MjgsIC5vZmZvZmYgPSAwLCAuc2hpZnQgPSAwLCAubWFzayA9IDAsCisJICAubWF0Y2hfb2ZmID0gNCwgLm1hdGNoX3ZhbCA9IDB4MTEwMDAwLCAubWF0Y2hfbWFzayA9IDB4RkYwMDAwLAorCSAgLmp1bXAgPSBjeGdiNF91ZHBfZmllbGRzIH0sCisJeyAuanVtcCA9IE5VTEwgfQorfTsKKworc3RydWN0IGN4Z2I0X2xpbmsgeworCWNvbnN0IHN0cnVjdCBjeGdiNF9tYXRjaF9maWVsZCAqbWF0Y2hfZmllbGQ7ICAvKiBOZXh0IGhlYWRlciAqLworCXN0cnVjdCBjaF9maWx0ZXJfc3BlY2lmaWNhdGlvbiBmczsgLyogTWF0Y2ggc3BlYyBhc3NvY2lhdGVkIHdpdGggbGluayAqLworCXUzMiBsaW5rX2hhbmRsZTsgICAgICAgICAvKiBLbm9kZSBoYW5kbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5rICovCisJdW5zaWduZWQgbG9uZyAqdGlkX21hcDsgIC8qIEJpdG1hcCBmb3IgZmlsdGVyIHRpZHMgKi8KK307CisKK3N0cnVjdCBjeGdiNF90Y191MzJfdGFibGUgeworCXVuc2lnbmVkIGludCBzaXplOyAgICAgICAgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0YWJsZSAqLworCXN0cnVjdCBjeGdiNF9saW5rIHRhYmxlWzBdOyAvKiBKdW1wIHRhYmxlICovCit9OworI2VuZGlmIC8qIF9fQ1hHQjRfVENfVTMyX1BBUlNFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdWxkLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3VsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YjJkMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3VsZC5jCkBAIC0wLDAgKzEsNjk2IEBACisvKgorICogY3hnYjRfdWxkLmM6Q2hlbHNpbyBVcHBlciBMYXllciBEcml2ZXIgSW50ZXJmYWNlIGZvciBUNC9UNS9UNiBTR0UgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqCisgKiAgV3JpdHRlbiBieTogQXR1bCBHdXB0YSAoYXR1bC5ndXB0YUBjaGVsc2lvLmNvbSkKKyAqICBXcml0dGVuIGJ5OiBIYXJpcHJhc2FkIFNoZW5haSAoaGFyaXByYXNhZEBjaGVsc2lvLmNvbSkKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJjeGdiNC5oIgorI2luY2x1ZGUgImN4Z2I0X3VsZC5oIgorI2luY2x1ZGUgInQ0X3JlZ3MuaCIKKyNpbmNsdWRlICJ0NGZ3X2FwaS5oIgorI2luY2x1ZGUgInQ0X21zZy5oIgorCisjZGVmaW5lIGZvcl9lYWNoX3VsZHJ4cShtLCBpKSBmb3IgKGkgPSAwOyBpIDwgKChtKS0+bnJ4cSArIChtKS0+bmNpcSk7IGkrKykKKworc3RhdGljIGludCBnZXRfbXNpeF9pZHhfZnJvbV9ibWFwKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXN0cnVjdCB1bGRfbXNpeF9ibWFwICpibWFwID0gJmFkYXAtPm1zaXhfYm1hcF91bGRzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1zaXhfaWR4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJtYXAtPmxvY2ssIGZsYWdzKTsKKwltc2l4X2lkeCA9IGZpbmRfZmlyc3RfemVyb19iaXQoYm1hcC0+bXNpeF9ibWFwLCBibWFwLT5tYXBzaXplKTsKKwlpZiAobXNpeF9pZHggPCBibWFwLT5tYXBzaXplKSB7CisJCV9fc2V0X2JpdChtc2l4X2lkeCwgYm1hcC0+bXNpeF9ibWFwKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibWFwLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJtYXAtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbXNpeF9pZHg7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfbXNpeF9pZHhfaW5fYm1hcChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IG1zaXhfaWR4KQoreworCXN0cnVjdCB1bGRfbXNpeF9ibWFwICpibWFwID0gJmFkYXAtPm1zaXhfYm1hcF91bGRzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYm1hcC0+bG9jaywgZmxhZ3MpOworCSBfX2NsZWFyX2JpdChtc2l4X2lkeCwgYm1hcC0+bXNpeF9ibWFwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibWFwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIEZsdXNoIHRoZSBhZ2dyZWdhdGVkIGxybyBzZXNzaW9ucyAqLworc3RhdGljIHZvaWQgdWxkcnhfZmx1c2hfaGFuZGxlcihzdHJ1Y3Qgc2dlX3JzcHEgKnEpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBxLT5hZGFwOworCisJaWYgKGFkYXAtPnVsZFtxLT51bGRdLmxyb19mbHVzaCkKKwkJYWRhcC0+dWxkW3EtPnVsZF0ubHJvX2ZsdXNoKCZxLT5scm9fbWdyKTsKK30KKworLyoqCisgKgl1bGRyeF9oYW5kbGVyIC0gcmVzcG9uc2UgcXVldWUgaGFuZGxlciBmb3IgVUxEIHF1ZXVlcworICoJQHE6IHRoZSByZXNwb25zZSBxdWV1ZSB0aGF0IHJlY2VpdmVkIHRoZSBwYWNrZXQKKyAqCUByc3A6IHRoZSByZXNwb25zZSBxdWV1ZSBkZXNjcmlwdG9yIGhvbGRpbmcgdGhlIG9mZmxvYWQgbWVzc2FnZQorICoJQGdsOiB0aGUgZ2F0aGVyIGxpc3Qgb2YgcGFja2V0IGZyYWdtZW50cworICoKKyAqCURlbGl2ZXIgYW4gaW5ncmVzcyBvZmZsb2FkIHBhY2tldCB0byBhIFVMRC4gIEFsbCBwcm9jZXNzaW5nIGlzIGRvbmUgYnkKKyAqCXRoZSBVTEQsIHdlIGp1c3QgbWFpbnRhaW4gc3RhdGlzdGljcy4KKyAqLworc3RhdGljIGludCB1bGRyeF9oYW5kbGVyKHN0cnVjdCBzZ2VfcnNwcSAqcSwgY29uc3QgX19iZTY0ICpyc3AsCisJCQkgY29uc3Qgc3RydWN0IHBrdF9nbCAqZ2wpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBxLT5hZGFwOworCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnJ4cSA9IGNvbnRhaW5lcl9vZihxLCBzdHJ1Y3Qgc2dlX29mbGRfcnhxLCByc3BxKTsKKwlpbnQgcmV0OworCisJLyogRlcgY2FuIHNlbmQgQ1BMcyBlbmNhcHN1bGF0ZWQgaW4gYSBDUExfRlc0X01TRyAqLworCWlmICgoKGNvbnN0IHN0cnVjdCByc3NfaGVhZGVyICopcnNwKS0+b3Bjb2RlID09IENQTF9GVzRfTVNHICYmCisJICAgICgoY29uc3Qgc3RydWN0IGNwbF9mdzRfbXNnICopKHJzcCArIDEpKS0+dHlwZSA9PSBGV19UWVBFX1JTU0NQTCkKKwkJcnNwICs9IDI7CisKKwlpZiAocS0+Zmx1c2hfaGFuZGxlcikKKwkJcmV0ID0gYWRhcC0+dWxkW3EtPnVsZF0ubHJvX3J4X2hhbmRsZXIoYWRhcC0+dWxkW3EtPnVsZF0uaGFuZGxlLAorCQkJCXJzcCwgZ2wsICZxLT5scm9fbWdyLAorCQkJCSZxLT5uYXBpKTsKKwllbHNlCisJCXJldCA9IGFkYXAtPnVsZFtxLT51bGRdLnJ4X2hhbmRsZXIoYWRhcC0+dWxkW3EtPnVsZF0uaGFuZGxlLAorCQkJCXJzcCwgZ2wpOworCisJaWYgKHJldCkgeworCQlyeHEtPnN0YXRzLm5vbWVtKys7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoIWdsKQorCQlyeHEtPnN0YXRzLmltbSsrOworCWVsc2UgaWYgKGdsID09IENYR0I0X01TR19BTikKKwkJcnhxLT5zdGF0cy5hbisrOworCWVsc2UKKwkJcnhxLT5zdGF0cy5wa3RzKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfdWxkX3J4cXMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsCisJCQkgIHN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbywKKwkJCSAgdW5zaWduZWQgaW50IG5xLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCBib29sIGxybykKK3sKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKKwlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpxID0gcnhxX2luZm8tPnVsZHJ4cSArIG9mZnNldDsKKwl1bnNpZ25lZCBzaG9ydCAqaWRzID0gcnhxX2luZm8tPnJzcHFfaWQgKyBvZmZzZXQ7CisJdW5zaWduZWQgaW50IHBlcl9jaGFuID0gbnEgLyBhZGFwLT5wYXJhbXMubnBvcnRzOworCXVuc2lnbmVkIGludCBibWFwX2lkeCA9IDA7CisJaW50IGksIGVyciwgbXNpX2lkeDsKKworCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpCisJCW1zaV9pZHggPSAxOworCWVsc2UKKwkJbXNpX2lkeCA9IC0oKGludClzLT5pbnRycS5hYnNfaWQgKyAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBucTsgaSsrLCBxKyspIHsKKwkJaWYgKG1zaV9pZHggPj0gMCkgeworCQkJYm1hcF9pZHggPSBnZXRfbXNpeF9pZHhfZnJvbV9ibWFwKGFkYXApOworCQkJbXNpX2lkeCA9IGFkYXAtPm1zaXhfaW5mb191bGRzW2JtYXBfaWR4XS5pZHg7CisJCX0KKwkJZXJyID0gdDRfc2dlX2FsbG9jX3J4cShhZGFwLCAmcS0+cnNwcSwgZmFsc2UsCisJCQkJICAgICAgIGFkYXAtPnBvcnRbaSAvIHBlcl9jaGFuXSwKKwkJCQkgICAgICAgbXNpX2lkeCwKKwkJCQkgICAgICAgcS0+Zmwuc2l6ZSA/ICZxLT5mbCA6IE5VTEwsCisJCQkJICAgICAgIHVsZHJ4X2hhbmRsZXIsCisJCQkJICAgICAgIGxybyA/IHVsZHJ4X2ZsdXNoX2hhbmRsZXIgOiBOVUxMLAorCQkJCSAgICAgICAwKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZnJlZW91dDsKKwkJaWYgKG1zaV9pZHggPj0gMCkKKwkJCXJ4cV9pbmZvLT5tc2l4X3RibFtpICsgb2Zmc2V0XSA9IGJtYXBfaWR4OworCQltZW1zZXQoJnEtPnN0YXRzLCAwLCBzaXplb2YocS0+c3RhdHMpKTsKKwkJaWYgKGlkcykKKwkJCWlkc1tpXSA9IHEtPnJzcHEuYWJzX2lkOworCX0KKwlyZXR1cm4gMDsKK2ZyZWVvdXQ6CisJcSA9IHJ4cV9pbmZvLT51bGRyeHEgKyBvZmZzZXQ7CisJZm9yICggOyBpOyBpLS0sIHErKykgeworCQlpZiAocS0+cnNwcS5kZXNjKQorCQkJZnJlZV9yc3BxX2ZsKGFkYXAsICZxLT5yc3BxLAorCQkJCSAgICAgcS0+Zmwuc2l6ZSA/ICZxLT5mbCA6IE5VTEwpOworCX0KKworCS8qIFdlIG5lZWQgdG8gZnJlZSByeHEgYWxzbyBpbiBjYXNlIG9mIGNpcSBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KKwlpZiAob2Zmc2V0KSB7CisJCXEgPSByeHFfaW5mby0+dWxkcnhxICsgb2Zmc2V0OworCQlmb3IgKCA7IGk7IGktLSwgcSsrKSB7CisJCQlpZiAocS0+cnNwcS5kZXNjKQorCQkJCWZyZWVfcnNwcV9mbChhZGFwLCAmcS0+cnNwcSwKKwkJCQkJICAgICBxLT5mbC5zaXplID8gJnEtPmZsIDogTlVMTCk7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorc2V0dXBfc2dlX3F1ZXVlc191bGQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGRfdHlwZSwgYm9vbCBscm8pCit7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvID0gYWRhcC0+c2dlLnVsZF9yeHFfaW5mb1t1bGRfdHlwZV07CisJaW50IGksIHJldCA9IDA7CisKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKSB7CisJCXJ4cV9pbmZvLT5tc2l4X3RibCA9IGtjYWxsb2MoKHJ4cV9pbmZvLT5ucnhxICsgcnhxX2luZm8tPm5jaXEpLAorCQkJCQkgICAgIHNpemVvZih1bnNpZ25lZCBzaG9ydCksCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghcnhxX2luZm8tPm1zaXhfdGJsKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gISghYWxsb2NfdWxkX3J4cXMoYWRhcCwgcnhxX2luZm8sIHJ4cV9pbmZvLT5ucnhxLCAwLCBscm8pICYmCisJCSAhYWxsb2NfdWxkX3J4cXMoYWRhcCwgcnhxX2luZm8sIHJ4cV9pbmZvLT5uY2lxLAorCQkJCSByeHFfaW5mby0+bnJ4cSwgbHJvKSk7CisKKwkvKiBUZWxsIHVQIHRvIHJvdXRlIGNvbnRyb2wgcXVldWUgY29tcGxldGlvbnMgdG8gcmRtYSByc3BxICovCisJaWYgKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUgJiYKKwkgICAgIXJldCAmJiB1bGRfdHlwZSA9PSBDWEdCNF9VTERfUkRNQSkgeworCQlzdHJ1Y3Qgc2dlICpzID0gJmFkYXAtPnNnZTsKKwkJdW5zaWduZWQgaW50IGNtcGxxaWQ7CisJCXUzMiBwYXJhbSwgY21kb3A7CisKKwkJY21kb3AgPSBGV19QQVJBTVNfUEFSQU1fRE1BUV9FUV9DTVBMSVFJRF9DVFJMOworCQlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKKwkJCWNtcGxxaWQgPSByeHFfaW5mby0+dWxkcnhxW2ldLnJzcHEuY250eHRfaWQ7CisJCQlwYXJhbSA9IChGV19QQVJBTVNfTU5FTV9WKEZXX1BBUkFNU19NTkVNX0RNQVEpIHwKKwkJCQkgRldfUEFSQU1TX1BBUkFNX1hfVihjbWRvcCkgfAorCQkJCSBGV19QQVJBTVNfUEFSQU1fWVpfVihzLT5jdHJscVtpXS5xLmNudHh0X2lkKSk7CisJCQlyZXQgPSB0NF9zZXRfcGFyYW1zKGFkYXAsIGFkYXAtPm1ib3gsIGFkYXAtPnBmLAorCQkJCQkgICAgMCwgMSwgJnBhcmFtLCAmY21wbHFpZCk7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdDRfZnJlZV91bGRfcnhxcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgaW50IG4sCisJCQkgICAgIHN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnEpCit7CisJZm9yICggOyBuOyBuLS0sIHErKykgeworCQlpZiAocS0+cnNwcS5kZXNjKQorCQkJZnJlZV9yc3BxX2ZsKGFkYXAsICZxLT5yc3BxLAorCQkJCSAgICAgcS0+Zmwuc2l6ZSA/ICZxLT5mbCA6IE5VTEwpOworCX0KK30KKworc3RhdGljIHZvaWQgZnJlZV9zZ2VfcXVldWVzX3VsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZF90eXBlKQoreworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbyA9IGFkYXAtPnNnZS51bGRfcnhxX2luZm9bdWxkX3R5cGVdOworCisJaWYgKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUgJiYgdWxkX3R5cGUgPT0gQ1hHQjRfVUxEX1JETUEpIHsKKwkJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7CisJCXUzMiBwYXJhbSwgY21kb3AsIGNtcGxxaWQgPSAwOworCQlpbnQgaTsKKworCQljbWRvcCA9IEZXX1BBUkFNU19QQVJBTV9ETUFRX0VRX0NNUExJUUlEX0NUUkw7CisJCWZvcl9lYWNoX3BvcnQoYWRhcCwgaSkgeworCQkJcGFyYW0gPSAoRldfUEFSQU1TX01ORU1fVihGV19QQVJBTVNfTU5FTV9ETUFRKSB8CisJCQkJIEZXX1BBUkFNU19QQVJBTV9YX1YoY21kb3ApIHwKKwkJCQkgRldfUEFSQU1TX1BBUkFNX1laX1Yocy0+Y3RybHFbaV0ucS5jbnR4dF9pZCkpOworCQkJdDRfc2V0X3BhcmFtcyhhZGFwLCBhZGFwLT5tYm94LCBhZGFwLT5wZiwKKwkJCQkgICAgICAwLCAxLCAmcGFyYW0sICZjbXBscWlkKTsKKwkJfQorCX0KKworCWlmIChyeHFfaW5mby0+bmNpcSkKKwkJdDRfZnJlZV91bGRfcnhxcyhhZGFwLCByeHFfaW5mby0+bmNpcSwKKwkJCQkgcnhxX2luZm8tPnVsZHJ4cSArIHJ4cV9pbmZvLT5ucnhxKTsKKwl0NF9mcmVlX3VsZF9yeHFzKGFkYXAsIHJ4cV9pbmZvLT5ucnhxLCByeHFfaW5mby0+dWxkcnhxKTsKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQlrZnJlZShyeHFfaW5mby0+bXNpeF90YmwpOworfQorCitzdGF0aWMgaW50IGNmZ19xdWV1ZXNfdWxkKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkX3R5cGUsCisJCQkgIGNvbnN0IHN0cnVjdCBjeGdiNF91bGRfaW5mbyAqdWxkX2luZm8pCit7CisJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvOworCWludCBpLCBucnhxLCBjaXFfc2l6ZTsKKworCXJ4cV9pbmZvID0ga3phbGxvYyhzaXplb2YoKnJ4cV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeHFfaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYICYmIHVsZF9pbmZvLT5ucnhxID4gcy0+bnFzX3Blcl91bGQpIHsKKwkJaSA9IHMtPm5xc19wZXJfdWxkOworCQlyeHFfaW5mby0+bnJ4cSA9IHJvdW5kdXAoaSwgYWRhcC0+cGFyYW1zLm5wb3J0cyk7CisJfSBlbHNlIHsKKwkJaSA9IG1pbl90KGludCwgdWxkX2luZm8tPm5yeHEsCisJCQkgIG51bV9vbmxpbmVfY3B1cygpKTsKKwkJcnhxX2luZm8tPm5yeHEgPSByb3VuZHVwKGksIGFkYXAtPnBhcmFtcy5ucG9ydHMpOworCX0KKwlpZiAoIXVsZF9pbmZvLT5jaXEpIHsKKwkJcnhxX2luZm8tPm5jaXEgPSAwOworCX0gZWxzZSAgeworCQlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQkJcnhxX2luZm8tPm5jaXEgPSBtaW5fdChpbnQsIHMtPm5xc19wZXJfdWxkLAorCQkJCQkgICAgICAgbnVtX29ubGluZV9jcHVzKCkpOworCQllbHNlCisJCQlyeHFfaW5mby0+bmNpcSA9IG1pbl90KGludCwgTUFYX09GTERfUVNFVFMsCisJCQkJCSAgICAgICBudW1fb25saW5lX2NwdXMoKSk7CisJCXJ4cV9pbmZvLT5uY2lxID0gKChyeHFfaW5mby0+bmNpcSAvIGFkYXAtPnBhcmFtcy5ucG9ydHMpICoKKwkJCQkgIGFkYXAtPnBhcmFtcy5ucG9ydHMpOworCQlyeHFfaW5mby0+bmNpcSA9IG1heF90KGludCwgcnhxX2luZm8tPm5jaXEsCisJCQkJICAgICAgIGFkYXAtPnBhcmFtcy5ucG9ydHMpOworCX0KKworCW5yeHEgPSByeHFfaW5mby0+bnJ4cSArIHJ4cV9pbmZvLT5uY2lxOyAvKiB0b3RhbCByeHEncyAqLworCXJ4cV9pbmZvLT51bGRyeHEgPSBrY2FsbG9jKG5yeHEsIHNpemVvZihzdHJ1Y3Qgc2dlX29mbGRfcnhxKSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ4cV9pbmZvLT51bGRyeHEpIHsKKwkJa2ZyZWUocnhxX2luZm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyeHFfaW5mby0+cnNwcV9pZCA9IGtjYWxsb2MobnJ4cSwgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeHFfaW5mby0+cnNwcV9pZCkgeworCQlrZnJlZShyeHFfaW5mby0+dWxkcnhxKTsKKwkJa2ZyZWUocnhxX2luZm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcnhxX2luZm8tPm5yeHE7IGkrKykgeworCQlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyID0gJnJ4cV9pbmZvLT51bGRyeHFbaV07CisKKwkJaW5pdF9yc3BxKGFkYXAsICZyLT5yc3BxLCA1LCAxLCB1bGRfaW5mby0+cnhxX3NpemUsIDY0KTsKKwkJci0+cnNwcS51bGQgPSB1bGRfdHlwZTsKKwkJci0+Zmwuc2l6ZSA9IDcyOworCX0KKworCWNpcV9zaXplID0gNjQgKyBhZGFwLT52cmVzLmNxLnNpemUgKyBhZGFwLT50aWRzLm5mdGlkczsKKwlpZiAoY2lxX3NpemUgPiBTR0VfTUFYX0lRX1NJWkUpIHsKKwkJZGV2X3dhcm4oYWRhcC0+cGRldl9kZXYsICJDSVEgc2l6ZSB0b28gc21hbGwgZm9yIGF2YWlsYWJsZSBJUXNcbiIpOworCQljaXFfc2l6ZSA9IFNHRV9NQVhfSVFfU0laRTsKKwl9CisKKwlmb3IgKGkgPSByeHFfaW5mby0+bnJ4cTsgaSA8IG5yeHE7IGkrKykgeworCQlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpyID0gJnJ4cV9pbmZvLT51bGRyeHFbaV07CisKKwkJaW5pdF9yc3BxKGFkYXAsICZyLT5yc3BxLCA1LCAxLCBjaXFfc2l6ZSwgNjQpOworCQlyLT5yc3BxLnVsZCA9IHVsZF90eXBlOworCX0KKworCW1lbWNweShyeHFfaW5mby0+bmFtZSwgdWxkX2luZm8tPm5hbWUsIElGTkFNU0laKTsKKwlhZGFwLT5zZ2UudWxkX3J4cV9pbmZvW3VsZF90eXBlXSA9IHJ4cV9pbmZvOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcXVldWVzX3VsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZF90eXBlKQoreworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbyA9IGFkYXAtPnNnZS51bGRfcnhxX2luZm9bdWxkX3R5cGVdOworCisJa2ZyZWUocnhxX2luZm8tPnJzcHFfaWQpOworCWtmcmVlKHJ4cV9pbmZvLT51bGRyeHEpOworCWtmcmVlKHJ4cV9pbmZvKTsKK30KKworc3RhdGljIGludAorcmVxdWVzdF9tc2l4X3F1ZXVlX2lycXNfdWxkKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkX3R5cGUpCit7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvID0gYWRhcC0+c2dlLnVsZF9yeHFfaW5mb1t1bGRfdHlwZV07CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgaW50IGlkeCwgYm1hcF9pZHg7CisKKwlmb3JfZWFjaF91bGRyeHEocnhxX2luZm8sIGlkeCkgeworCQlibWFwX2lkeCA9IHJ4cV9pbmZvLT5tc2l4X3RibFtpZHhdOworCQllcnIgPSByZXF1ZXN0X2lycShhZGFwLT5tc2l4X2luZm9fdWxkc1tibWFwX2lkeF0udmVjLAorCQkJCSAgdDRfc2dlX2ludHJfbXNpeCwgMCwKKwkJCQkgIGFkYXAtPm1zaXhfaW5mb191bGRzW2JtYXBfaWR4XS5kZXNjLAorCQkJCSAgJnJ4cV9pbmZvLT51bGRyeHFbaWR4XS5yc3BxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdW53aW5kOworCX0KKwlyZXR1cm4gMDsKK3Vud2luZDoKKwl3aGlsZSAoaWR4LS0gPiAwKSB7CisJCWJtYXBfaWR4ID0gcnhxX2luZm8tPm1zaXhfdGJsW2lkeF07CisJCWZyZWVfbXNpeF9pZHhfaW5fYm1hcChhZGFwLCBibWFwX2lkeCk7CisJCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb191bGRzW2JtYXBfaWR4XS52ZWMsCisJCQkgJnJ4cV9pbmZvLT51bGRyeHFbaWR4XS5yc3BxKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQKK2ZyZWVfbXNpeF9xdWV1ZV9pcnFzX3VsZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZF90eXBlKQoreworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbyA9IGFkYXAtPnNnZS51bGRfcnhxX2luZm9bdWxkX3R5cGVdOworCXVuc2lnbmVkIGludCBpZHgsIGJtYXBfaWR4OworCisJZm9yX2VhY2hfdWxkcnhxKHJ4cV9pbmZvLCBpZHgpIHsKKwkJYm1hcF9pZHggPSByeHFfaW5mby0+bXNpeF90YmxbaWR4XTsKKworCQlmcmVlX21zaXhfaWR4X2luX2JtYXAoYWRhcCwgYm1hcF9pZHgpOworCQlmcmVlX2lycShhZGFwLT5tc2l4X2luZm9fdWxkc1tibWFwX2lkeF0udmVjLAorCQkJICZyeHFfaW5mby0+dWxkcnhxW2lkeF0ucnNwcSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBuYW1lX21zaXhfdmVjc191bGQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGRfdHlwZSkKK3sKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm8gPSBhZGFwLT5zZ2UudWxkX3J4cV9pbmZvW3VsZF90eXBlXTsKKwlpbnQgbiA9IHNpemVvZihhZGFwLT5tc2l4X2luZm9fdWxkc1swXS5kZXNjKTsKKwl1bnNpZ25lZCBpbnQgaWR4LCBibWFwX2lkeDsKKworCWZvcl9lYWNoX3VsZHJ4cShyeHFfaW5mbywgaWR4KSB7CisJCWJtYXBfaWR4ID0gcnhxX2luZm8tPm1zaXhfdGJsW2lkeF07CisKKwkJc25wcmludGYoYWRhcC0+bXNpeF9pbmZvX3VsZHNbYm1hcF9pZHhdLmRlc2MsIG4sICIlcy0lcyVkIiwKKwkJCSBhZGFwLT5wb3J0WzBdLT5uYW1lLCByeHFfaW5mby0+bmFtZSwgaWR4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9yeChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9yc3BxICpxKQoreworCWlmICghcSkKKwkJcmV0dXJuOworCisJaWYgKHEtPmhhbmRsZXIpIHsKKwkJY3hnYl9idXN5X3BvbGxfaW5pdF9sb2NrKHEpOworCQluYXBpX2VuYWJsZSgmcS0+bmFwaSk7CisJfQorCS8qIDAtaW5jcmVtZW50IEdUUyB0byBzdGFydCB0aGUgdGltZXIgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJdDRfd3JpdGVfcmVnKGFkYXAsIE1ZUEZfUkVHKFNHRV9QRl9HVFNfQSksCisJCSAgICAgU0VJTlRBUk1fVihxLT5pbnRyX3BhcmFtcykgfAorCQkgICAgIElOR1JFU1NRSURfVihxLT5jbnR4dF9pZCkpOworfQorCitzdGF0aWMgdm9pZCBxdWllc2NlX3J4KHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX3JzcHEgKnEpCit7CisJaWYgKHEgJiYgcS0+aGFuZGxlcikgeworCQluYXBpX2Rpc2FibGUoJnEtPm5hcGkpOworCQlsb2NhbF9iaF9kaXNhYmxlKCk7CisJCXdoaWxlICghY3hnYl9wb2xsX2xvY2tfbmFwaShxKSkKKwkJCW1kZWxheSgxKTsKKwkJbG9jYWxfYmhfZW5hYmxlKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbmFibGVfcnhfdWxkKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgdWxkX3R5cGUpCit7CisJc3RydWN0IHNnZV91bGRfcnhxX2luZm8gKnJ4cV9pbmZvID0gYWRhcC0+c2dlLnVsZF9yeHFfaW5mb1t1bGRfdHlwZV07CisJaW50IGlkeDsKKworCWZvcl9lYWNoX3VsZHJ4cShyeHFfaW5mbywgaWR4KQorCQllbmFibGVfcngoYWRhcCwgJnJ4cV9pbmZvLT51bGRyeHFbaWR4XS5yc3BxKTsKK30KKworc3RhdGljIHZvaWQgcXVpZXNjZV9yeF91bGQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGRfdHlwZSkKK3sKKwlzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqcnhxX2luZm8gPSBhZGFwLT5zZ2UudWxkX3J4cV9pbmZvW3VsZF90eXBlXTsKKwlpbnQgaWR4OworCisJZm9yX2VhY2hfdWxkcnhxKHJ4cV9pbmZvLCBpZHgpCisJCXF1aWVzY2VfcngoYWRhcCwgJnJ4cV9pbmZvLT51bGRyeHFbaWR4XS5yc3BxKTsKK30KKworc3RhdGljIHZvaWQgdWxkX3F1ZXVlX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCB1bGRfdHlwZSwKKwkJCSAgIHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqbGxpKQoreworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbyA9IGFkYXAtPnNnZS51bGRfcnhxX2luZm9bdWxkX3R5cGVdOworCisJbGxpLT5yeHFfaWRzID0gcnhxX2luZm8tPnJzcHFfaWQ7CisJbGxpLT5ucnhxID0gcnhxX2luZm8tPm5yeHE7CisJbGxpLT5jaXFfaWRzID0gcnhxX2luZm8tPnJzcHFfaWQgKyByeHFfaW5mby0+bnJ4cTsKKwlsbGktPm5jaXEgPSByeHFfaW5mby0+bmNpcTsKK30KKworaW50IHQ0X3VsZF9tZW1fYWxsb2Moc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7CisKKwlhZGFwLT51bGQgPSBrY2FsbG9jKENYR0I0X1VMRF9NQVgsIHNpemVvZigqYWRhcC0+dWxkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwLT51bGQpCisJCXJldHVybiAtRU5PTUVNOworCisJcy0+dWxkX3J4cV9pbmZvID0ga3phbGxvYyhDWEdCNF9VTERfTUFYICoKKwkJCQkgIHNpemVvZihzdHJ1Y3Qgc2dlX3VsZF9yeHFfaW5mbyAqKSwKKwkJCQkgIEdGUF9LRVJORUwpOworCWlmICghcy0+dWxkX3J4cV9pbmZvKQorCQlnb3RvIGVycl91bGQ7CisKKwlyZXR1cm4gMDsKK2Vycl91bGQ6CisJa2ZyZWUoYWRhcC0+dWxkKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCB0NF91bGRfbWVtX2ZyZWUoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7CisKKwlrZnJlZShzLT51bGRfcnhxX2luZm8pOworCWtmcmVlKGFkYXAtPnVsZCk7Cit9CisKK3ZvaWQgdDRfdWxkX2NsZWFuX3VwKHN0cnVjdCBhZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBzZ2VfdWxkX3J4cV9pbmZvICpyeHFfaW5mbzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghYWRhcC0+dWxkKQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IENYR0I0X1VMRF9NQVg7IGkrKykgeworCQlpZiAoIWFkYXAtPnVsZFtpXS5oYW5kbGUpCisJCQljb250aW51ZTsKKwkJcnhxX2luZm8gPSBhZGFwLT5zZ2UudWxkX3J4cV9pbmZvW2ldOworCQlpZiAoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKKwkJCXF1aWVzY2VfcnhfdWxkKGFkYXAsIGkpOworCQlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKQorCQkJZnJlZV9tc2l4X3F1ZXVlX2lycXNfdWxkKGFkYXAsIGkpOworCQlmcmVlX3NnZV9xdWV1ZXNfdWxkKGFkYXAsIGkpOworCQlmcmVlX3F1ZXVlc191bGQoYWRhcCwgaSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB1bGRfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IGN4Z2I0X2xsZF9pbmZvICpsbGQpCit7CisJaW50IGk7CisKKwlsbGQtPnBkZXYgPSBhZGFwLT5wZGV2OworCWxsZC0+cGYgPSBhZGFwLT5wZjsKKwlsbGQtPmwydCA9IGFkYXAtPmwydDsKKwlsbGQtPnRpZHMgPSAmYWRhcC0+dGlkczsKKwlsbGQtPnBvcnRzID0gYWRhcC0+cG9ydDsKKwlsbGQtPnZyID0gJmFkYXAtPnZyZXM7CisJbGxkLT5tdHVzID0gYWRhcC0+cGFyYW1zLm10dXM7CisJbGxkLT5udHhxID0gYWRhcC0+c2dlLm9mbGRxc2V0czsKKwlsbGQtPm5jaGFuID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKKwlsbGQtPm5wb3J0cyA9IGFkYXAtPnBhcmFtcy5ucG9ydHM7CisJbGxkLT53cl9jcmVkID0gYWRhcC0+cGFyYW1zLm9mbGRxX3dyX2NyZWQ7CisJbGxkLT5pc2NzaV9pb2xlbiA9IE1BWFJYREFUQV9HKHQ0X3JlYWRfcmVnKGFkYXAsIFRQX1BBUkFfUkVHMl9BKSk7CisJbGxkLT5pc2NzaV90YWdtYXNrID0gdDRfcmVhZF9yZWcoYWRhcCwgVUxQX1JYX0lTQ1NJX1RBR01BU0tfQSk7CisJbGxkLT5pc2NzaV9wZ3N6X29yZGVyID0gdDRfcmVhZF9yZWcoYWRhcCwgVUxQX1JYX0lTQ1NJX1BTWl9BKTsKKwlsbGQtPmlzY3NpX2xsaW1pdCA9IHQ0X3JlYWRfcmVnKGFkYXAsIFVMUF9SWF9JU0NTSV9MTElNSVRfQSk7CisJbGxkLT5pc2NzaV9wcG0gPSAmYWRhcC0+aXNjc2lfcHBtOworCWxsZC0+YWRhcHRlcl90eXBlID0gYWRhcC0+cGFyYW1zLmNoaXA7CisJbGxkLT5jY2xrX3BzID0gMTAwMDAwMDAwMCAvIGFkYXAtPnBhcmFtcy52cGQuY2NsazsKKwlsbGQtPnVkYl9kZW5zaXR5ID0gMSA8PCBhZGFwLT5wYXJhbXMuc2dlLmVxX3FwcDsKKwlsbGQtPnVjcV9kZW5zaXR5ID0gMSA8PCBhZGFwLT5wYXJhbXMuc2dlLmlxX3FwcDsKKwlsbGQtPmZpbHRfbW9kZSA9IGFkYXAtPnBhcmFtcy50cC52bGFuX3ByaV9tYXA7CisJLyogTU9EUV9SRVFfTUFQIHNldHMgcXVldWVzIDAtMyB0byBjaGFuIDAtMyAqLworCWZvciAoaSA9IDA7IGkgPCBOQ0hBTjsgaSsrKQorCQlsbGQtPnR4X21vZHFbaV0gPSBpOworCWxsZC0+Z3RzX3JlZyA9IGFkYXAtPnJlZ3MgKyBNWVBGX1JFRyhTR0VfUEZfR1RTX0EpOworCWxsZC0+ZGJfcmVnID0gYWRhcC0+cmVncyArIE1ZUEZfUkVHKFNHRV9QRl9LRE9PUkJFTExfQSk7CisJbGxkLT5md192ZXJzID0gYWRhcC0+cGFyYW1zLmZ3X3ZlcnM7CisJbGxkLT5kYmZpZm9faW50X3RocmVzaCA9IGRiZmlmb19pbnRfdGhyZXNoOworCWxsZC0+c2dlX2luZ3BhZGJvdW5kYXJ5ID0gYWRhcC0+c2dlLmZsX2FsaWduOworCWxsZC0+c2dlX2VncnN0YXR1c3BhZ2VzaXplID0gYWRhcC0+c2dlLnN0YXRfbGVuOworCWxsZC0+c2dlX3BrdHNoaWZ0ID0gYWRhcC0+c2dlLnBrdHNoaWZ0OworCWxsZC0+ZW5hYmxlX2Z3X29mbGRfY29ubiA9IGFkYXAtPmZsYWdzICYgRldfT0ZMRF9DT05OOworCWxsZC0+bWF4X29yZGlyZF9xcCA9IGFkYXAtPnBhcmFtcy5tYXhfb3JkaXJkX3FwOworCWxsZC0+bWF4X2lyZF9hZGFwdGVyID0gYWRhcC0+cGFyYW1zLm1heF9pcmRfYWRhcHRlcjsKKwlsbGQtPnVscHR4X21lbXdyaXRlX2RzZ2wgPSBhZGFwLT5wYXJhbXMudWxwdHhfbWVtd3JpdGVfZHNnbDsKKwlsbGQtPm5vZGVpZCA9IGRldl90b19ub2RlKGFkYXAtPnBkZXZfZGV2KTsKK30KKworc3RhdGljIHZvaWQgdWxkX2F0dGFjaChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHVsZCkKK3sKKwl2b2lkICpoYW5kbGU7CisJc3RydWN0IGN4Z2I0X2xsZF9pbmZvIGxsaTsKKworCXVsZF9pbml0KGFkYXAsICZsbGkpOworCXVsZF9xdWV1ZV9pbml0KGFkYXAsIHVsZCwgJmxsaSk7CisKKwloYW5kbGUgPSBhZGFwLT51bGRbdWxkXS5hZGQoJmxsaSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCWRldl93YXJuKGFkYXAtPnBkZXZfZGV2LAorCQkJICJjb3VsZCBub3QgYXR0YWNoIHRvIHRoZSAlcyBkcml2ZXIsIGVycm9yICVsZFxuIiwKKwkJCSBhZGFwLT51bGRbdWxkXS5uYW1lLCBQVFJfRVJSKGhhbmRsZSkpOworCQlyZXR1cm47CisJfQorCisJYWRhcC0+dWxkW3VsZF0uaGFuZGxlID0gaGFuZGxlOworCXQ0X3JlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCk7CisKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKKwkJYWRhcC0+dWxkW3VsZF0uc3RhdGVfY2hhbmdlKGhhbmRsZSwgQ1hHQjRfU1RBVEVfVVApOworfQorCisvKioKKyAqCWN4Z2I0X3JlZ2lzdGVyX3VsZCAtIHJlZ2lzdGVyIGFuIHVwcGVyLWxheWVyIGRyaXZlcgorICoJQHR5cGU6IHRoZSBVTEQgdHlwZQorICoJQHA6IHRoZSBVTEQgbWV0aG9kcworICoKKyAqCVJlZ2lzdGVycyBhbiB1cHBlci1sYXllciBkcml2ZXIgd2l0aCB0aGlzIGRyaXZlciBhbmQgbm90aWZpZXMgdGhlIFVMRAorICoJYWJvdXQgYW55IHByZXNlbnRseSBhdmFpbGFibGUgZGV2aWNlcyB0aGF0IHN1cHBvcnQgaXRzIHR5cGUuICBSZXR1cm5zCisgKgklLUVCVVNZIGlmIGEgVUxEIG9mIHRoZSBzYW1lIHR5cGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkLgorICovCitpbnQgY3hnYjRfcmVnaXN0ZXJfdWxkKGVudW0gY3hnYjRfdWxkIHR5cGUsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3hnYjRfdWxkX2luZm8gKnApCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGFkYXBfaWR4ID0gMDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcDsKKworCWlmICh0eXBlID49IENYR0I0X1VMRF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdWxkX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFkYXAsICZhZGFwdGVyX2xpc3QsIGxpc3Rfbm9kZSkgeworCQlpZiAoKHR5cGUgPT0gQ1hHQjRfVUxEX0NSWVBUTyAmJiAhaXNfcGNpX3VsZChhZGFwKSkgfHwKKwkJICAgICh0eXBlICE9IENYR0I0X1VMRF9DUllQVE8gJiYgIWlzX29mZmxvYWQoYWRhcCkpKQorCQkJY29udGludWU7CisJCWlmICh0eXBlID09IENYR0I0X1VMRF9JU0NTSVQgJiYgaXNfdDQoYWRhcC0+cGFyYW1zLmNoaXApKQorCQkJY29udGludWU7CisJCXJldCA9IGNmZ19xdWV1ZXNfdWxkKGFkYXAsIHR5cGUsIHApOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCXJldCA9IHNldHVwX3NnZV9xdWV1ZXNfdWxkKGFkYXAsIHR5cGUsIHAtPmxybyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZyZWVfcXVldWVzOworCQlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKSB7CisJCQluYW1lX21zaXhfdmVjc191bGQoYWRhcCwgdHlwZSk7CisJCQlyZXQgPSByZXF1ZXN0X21zaXhfcXVldWVfaXJxc191bGQoYWRhcCwgdHlwZSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZnJlZV9yeHE7CisJCX0KKwkJaWYgKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCisJCQllbmFibGVfcnhfdWxkKGFkYXAsIHR5cGUpOworCQlpZiAoYWRhcC0+dWxkW3R5cGVdLmFkZCkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBmcmVlX2lycTsKKwkJfQorCQlhZGFwLT51bGRbdHlwZV0gPSAqcDsKKwkJdWxkX2F0dGFjaChhZGFwLCB0eXBlKTsKKwkJYWRhcF9pZHgrKzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ1bGRfbXV0ZXgpOworCXJldHVybiAwOworCitmcmVlX2lycToKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKKwkJcXVpZXNjZV9yeF91bGQoYWRhcCwgdHlwZSk7CisJaWYgKGFkYXAtPmZsYWdzICYgVVNJTkdfTVNJWCkKKwkJZnJlZV9tc2l4X3F1ZXVlX2lycXNfdWxkKGFkYXAsIHR5cGUpOworZnJlZV9yeHE6CisJZnJlZV9zZ2VfcXVldWVzX3VsZChhZGFwLCB0eXBlKTsKK2ZyZWVfcXVldWVzOgorCWZyZWVfcXVldWVzX3VsZChhZGFwLCB0eXBlKTsKK291dDoKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRhcCwgJmFkYXB0ZXJfbGlzdCwgbGlzdF9ub2RlKSB7CisJCWlmICgodHlwZSA9PSBDWEdCNF9VTERfQ1JZUFRPICYmICFpc19wY2lfdWxkKGFkYXApKSB8fAorCQkgICAgKHR5cGUgIT0gQ1hHQjRfVUxEX0NSWVBUTyAmJiAhaXNfb2ZmbG9hZChhZGFwKSkpCisJCQljb250aW51ZTsKKwkJaWYgKHR5cGUgPT0gQ1hHQjRfVUxEX0lTQ1NJVCAmJiBpc190NChhZGFwLT5wYXJhbXMuY2hpcCkpCisJCQljb250aW51ZTsKKwkJaWYgKCFhZGFwX2lkeCkKKwkJCWJyZWFrOworCQlhZGFwLT51bGRbdHlwZV0uaGFuZGxlID0gTlVMTDsKKwkJYWRhcC0+dWxkW3R5cGVdLmFkZCA9IE5VTEw7CisJCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQorCQkJcXVpZXNjZV9yeF91bGQoYWRhcCwgdHlwZSk7CisJCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpCisJCQlmcmVlX21zaXhfcXVldWVfaXJxc191bGQoYWRhcCwgdHlwZSk7CisJCWZyZWVfc2dlX3F1ZXVlc191bGQoYWRhcCwgdHlwZSk7CisJCWZyZWVfcXVldWVzX3VsZChhZGFwLCB0eXBlKTsKKwkJYWRhcF9pZHgtLTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ1bGRfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGN4Z2I0X3JlZ2lzdGVyX3VsZCk7CisKKy8qKgorICoJY3hnYjRfdW5yZWdpc3Rlcl91bGQgLSB1bnJlZ2lzdGVyIGFuIHVwcGVyLWxheWVyIGRyaXZlcgorICoJQHR5cGU6IHRoZSBVTEQgdHlwZQorICoKKyAqCVVucmVnaXN0ZXJzIGFuIGV4aXN0aW5nIHVwcGVyLWxheWVyIGRyaXZlci4KKyAqLworaW50IGN4Z2I0X3VucmVnaXN0ZXJfdWxkKGVudW0gY3hnYjRfdWxkIHR5cGUpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXA7CisKKwlpZiAodHlwZSA+PSBDWEdCNF9VTERfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnVsZF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhZGFwLCAmYWRhcHRlcl9saXN0LCBsaXN0X25vZGUpIHsKKwkJaWYgKCh0eXBlID09IENYR0I0X1VMRF9DUllQVE8gJiYgIWlzX3BjaV91bGQoYWRhcCkpIHx8CisJCSAgICAodHlwZSAhPSBDWEdCNF9VTERfQ1JZUFRPICYmICFpc19vZmZsb2FkKGFkYXApKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodHlwZSA9PSBDWEdCNF9VTERfSVNDU0lUICYmIGlzX3Q0KGFkYXAtPnBhcmFtcy5jaGlwKSkKKwkJCWNvbnRpbnVlOworCQlhZGFwLT51bGRbdHlwZV0uaGFuZGxlID0gTlVMTDsKKwkJYWRhcC0+dWxkW3R5cGVdLmFkZCA9IE5VTEw7CisJCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQorCQkJcXVpZXNjZV9yeF91bGQoYWRhcCwgdHlwZSk7CisJCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpCisJCQlmcmVlX21zaXhfcXVldWVfaXJxc191bGQoYWRhcCwgdHlwZSk7CisJCWZyZWVfc2dlX3F1ZXVlc191bGQoYWRhcCwgdHlwZSk7CisJCWZyZWVfcXVldWVzX3VsZChhZGFwLCB0eXBlKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ1bGRfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGN4Z2I0X3VucmVnaXN0ZXJfdWxkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdWxkLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X3VsZC5oCmluZGV4IGYzYzU4YWEuLjQ3YmQxNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfdWxkLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF91bGQuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMzIsOCArMzIsOCBAQAogICogU09GVFdBUkUuCiAgKi8KIAotI2lmbmRlZiBfX0NYR0I0X09GTERfSAotI2RlZmluZSBfX0NYR0I0X09GTERfSAorI2lmbmRlZiBfX0NYR0I0X1VMRF9ICisjZGVmaW5lIF9fQ1hHQjRfVUxEX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTQyLDYgKzQyLDggQEAKICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlICJjeGdiNC5oIgogCisjZGVmaW5lIE1BWF9VTERfUVNFVFMgMTYKKwogLyogQ1BMIG1lc3NhZ2UgcHJpb3JpdHkgbGV2ZWxzICovCiBlbnVtIHsKIAlDUExfUFJJT1JJVFlfREFUQSAgICAgPSAwLCAgLyogZGF0YSBtZXNzYWdlcyAqLwpAQCAtMTA0LDYgKzEwNiw3IEBACiAJdW5zaWduZWQgaW50IGF0aWRfYmFzZTsKIAogCXN0cnVjdCBmaWx0ZXJfZW50cnkgKmZ0aWRfdGFiOworCXVuc2lnbmVkIGxvbmcgKmZ0aWRfYm1hcDsKIAl1bnNpZ25lZCBpbnQgbmZ0aWRzOwogCXVuc2lnbmVkIGludCBmdGlkX2Jhc2U7CiAJdW5zaWduZWQgaW50IGFmdGlkX2Jhc2U7CkBAIC0xMjQsNiArMTI3LDggQEAKIAlhdG9taWNfdCB0aWRzX2luX3VzZTsKIAkvKiBUSURzIGluIHRoZSBIQVNIICovCiAJYXRvbWljX3QgaGFzaF90aWRzX2luX3VzZTsKKwkvKiBsb2NrIGZvciBzZXR0aW5nL2NsZWFyaW5nIGZpbHRlciBiaXRtYXAgKi8KKwlzcGlubG9ja190IGZ0aWRfbG9jazsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqbG9va3VwX3RpZChjb25zdCBzdHJ1Y3QgdGlkX2luZm8gKnQsIHVuc2lnbmVkIGludCB0aWQpCkBAIC0xODMsMTUgKzE4OCwzOCBAQAogaW50IGN4Z2I0X3JlbW92ZV9zZXJ2ZXJfZmlsdGVyKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdGlkLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBxdWV1ZSwgYm9vbCBpcHY2KTsKIAorLyogRmlsdGVyIG9wZXJhdGlvbiBjb250ZXh0IHRvIGFsbG93IGNhbGxlcnMgb2YgY3hnYjRfc2V0X2ZpbHRlcigpIGFuZAorICogY3hnYjRfZGVsX2ZpbHRlcigpIHRvIHdhaXQgZm9yIGFuIGFzeW5jaHJvbm91cyBjb21wbGV0aW9uLgorICovCitzdHJ1Y3QgZmlsdGVyX2N0eCB7CisJc3RydWN0IGNvbXBsZXRpb24gY29tcGxldGlvbjsJLyogY29tcGxldGlvbiByZW5kZXp2b3VzICovCisJdm9pZCAqY2xvc3VyZTsJCQkvKiBjYWxsZXIncyBvcGFxdWUgaW5mb3JtYXRpb24gKi8KKwlpbnQgcmVzdWx0OwkJCS8qIHJlc3VsdCBvZiBvcGVyYXRpb24gKi8KKwl1MzIgdGlkOwkJCS8qIHRvIHN0b3JlIHRpZCAqLworfTsKKworc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uOworCitpbnQgX19jeGdiNF9zZXRfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmaWx0ZXJfaWQsCisJCSAgICAgICBzdHJ1Y3QgY2hfZmlsdGVyX3NwZWNpZmljYXRpb24gKmZzLAorCQkgICAgICAgc3RydWN0IGZpbHRlcl9jdHggKmN0eCk7CitpbnQgX19jeGdiNF9kZWxfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmaWx0ZXJfaWQsCisJCSAgICAgICBzdHJ1Y3QgZmlsdGVyX2N0eCAqY3R4KTsKK2ludCBjeGdiNF9zZXRfZmlsdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmaWx0ZXJfaWQsCisJCSAgICAgc3RydWN0IGNoX2ZpbHRlcl9zcGVjaWZpY2F0aW9uICpmcyk7CitpbnQgY3hnYjRfZGVsX2ZpbHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgZmlsdGVyX2lkKTsKKwogc3RhdGljIGlubGluZSB2b2lkIHNldF93cl90eHEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHByaW8sIGludCBxdWV1ZSkKIHsKIAlza2Jfc2V0X3F1ZXVlX21hcHBpbmcoc2tiLCAocXVldWUgPDwgMSkgfCBwcmlvKTsKIH0KIAogZW51bSBjeGdiNF91bGQgeworCUNYR0I0X1VMRF9JTklULAogCUNYR0I0X1VMRF9SRE1BLAogCUNYR0I0X1VMRF9JU0NTSSwKIAlDWEdCNF9VTERfSVNDU0lULAorCUNYR0I0X1VMRF9DUllQVE8sCiAJQ1hHQjRfVUxEX01BWAogfTsKIApAQCAtMjg0LDYgKzMxMiwxMSBAQAogCiBzdHJ1Y3QgY3hnYjRfdWxkX2luZm8gewogCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZCAqaGFuZGxlOworCXVuc2lnbmVkIGludCBucnhxOworCXVuc2lnbmVkIGludCByeHFfc2l6ZTsKKwlib29sIGNpcTsKKwlib29sIGxybzsKIAl2b2lkICooKmFkZCkoY29uc3Qgc3RydWN0IGN4Z2I0X2xsZF9pbmZvICpwKTsKIAlpbnQgKCpyeF9oYW5kbGVyKSh2b2lkICpoYW5kbGUsIGNvbnN0IF9fYmU2NCAqcnNwLAogCQkJICBjb25zdCBzdHJ1Y3QgcGt0X2dsICpnbCk7CkBAIC0zMzAsNCArMzYzLDQgQEAKIAkJCSB1NjQgKnBiYXIyX3FvZmZzZXQsCiAJCQkgdW5zaWduZWQgaW50ICpwYmFyMl9xaWQpOwogCi0jZW5kaWYgIC8qICFfX0NYR0I0X09GTERfSCAqLworI2VuZGlmICAvKiAhX19DWEdCNF9VTERfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zY2hlZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zY2hlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWRlNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NjaGVkLmMKQEAgLTAsMCArMSw1NTYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlICJjeGdiNC5oIgorI2luY2x1ZGUgInNjaGVkLmgiCisKKy8qIFNwaW5sb2NrIG11c3QgYmUgaGVsZCBieSBjYWxsZXIgKi8KK3N0YXRpYyBpbnQgdDRfc2NoZWRfY2xhc3NfZndfY21kKHN0cnVjdCBwb3J0X2luZm8gKnBpLAorCQkJCSBzdHJ1Y3QgY2hfc2NoZWRfcGFyYW1zICpwLAorCQkJCSBlbnVtIHNjaGVkX2Z3X29wcyBvcCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBpLT5hZGFwdGVyOworCXN0cnVjdCBzY2hlZF90YWJsZSAqcyA9IHBpLT5zY2hlZF90Ymw7CisJc3RydWN0IHNjaGVkX2NsYXNzICplOworCWludCBlcnIgPSAwOworCisJZSA9ICZzLT50YWJbcC0+dS5wYXJhbXMuY2xhc3NdOworCXN3aXRjaCAob3ApIHsKKwljYXNlIFNDSEVEX0ZXX09QX0FERDoKKwkJZXJyID0gdDRfc2NoZWRfcGFyYW1zKGFkYXAsIHAtPnR5cGUsCisJCQkJICAgICAgcC0+dS5wYXJhbXMubGV2ZWwsIHAtPnUucGFyYW1zLm1vZGUsCisJCQkJICAgICAgcC0+dS5wYXJhbXMucmF0ZXVuaXQsCisJCQkJICAgICAgcC0+dS5wYXJhbXMucmF0ZW1vZGUsCisJCQkJICAgICAgcC0+dS5wYXJhbXMuY2hhbm5lbCwgZS0+aWR4LAorCQkJCSAgICAgIHAtPnUucGFyYW1zLm1pbnJhdGUsIHAtPnUucGFyYW1zLm1heHJhdGUsCisJCQkJICAgICAgcC0+dS5wYXJhbXMud2VpZ2h0LCBwLT51LnBhcmFtcy5wa3RzaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1RTVVBQOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBTcGlubG9jayBtdXN0IGJlIGhlbGQgYnkgY2FsbGVyICovCitzdGF0aWMgaW50IHQ0X3NjaGVkX2JpbmRfdW5iaW5kX29wKHN0cnVjdCBwb3J0X2luZm8gKnBpLCB2b2lkICphcmcsCisJCQkJICAgZW51bSBzY2hlZF9iaW5kX3R5cGUgdHlwZSwgYm9vbCBiaW5kKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7CisJdTMyIGZ3X21uZW0sIGZ3X2NsYXNzLCBmd19wYXJhbTsKKwl1bnNpZ25lZCBpbnQgcGYgPSBhZGFwLT5wZjsKKwl1bnNpZ25lZCBpbnQgdmYgPSAwOworCWludCBlcnIgPSAwOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTQ0hFRF9RVUVVRTogeworCQlzdHJ1Y3Qgc2NoZWRfcXVldWVfZW50cnkgKnFlOworCisJCXFlID0gKHN0cnVjdCBzY2hlZF9xdWV1ZV9lbnRyeSAqKWFyZzsKKworCQkvKiBDcmVhdGUgYSB0ZW1wbGF0ZSBmb3IgdGhlIEZXX1BBUkFNU19DTUQgbW5lbW9uaWMgYW5kCisJCSAqIHZhbHVlIChUWCBTY2hlZHVsaW5nIENsYXNzIGluIHRoaXMgY2FzZSkuCisJCSAqLworCQlmd19tbmVtID0gKEZXX1BBUkFNU19NTkVNX1YoRldfUEFSQU1TX01ORU1fRE1BUSkgfAorCQkJICAgRldfUEFSQU1TX1BBUkFNX1hfVigKKwkJCQkgICBGV19QQVJBTVNfUEFSQU1fRE1BUV9FUV9TQ0hFRENMQVNTX0VUSCkpOworCQlmd19jbGFzcyA9IGJpbmQgPyBxZS0+cGFyYW0uY2xhc3MgOiBGV19TQ0hFRF9DTFNfTk9ORTsKKwkJZndfcGFyYW0gPSAoZndfbW5lbSB8IEZXX1BBUkFNU19QQVJBTV9ZWl9WKHFlLT5jbnR4dF9pZCkpOworCisJCXBmID0gYWRhcC0+cGY7CisJCXZmID0gMDsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWVyciA9IC1FTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gdDRfc2V0X3BhcmFtcyhhZGFwLCBhZGFwLT5tYm94LCBwZiwgdmYsIDEsICZmd19wYXJhbSwgJmZ3X2NsYXNzKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfY2xhc3MgKnQ0X3NjaGVkX3F1ZXVlX2xvb2t1cChzdHJ1Y3QgcG9ydF9pbmZvICpwaSwKKwkJCQkJCSBjb25zdCB1bnNpZ25lZCBpbnQgcWlkLAorCQkJCQkJIGludCAqaW5kZXgpCit7CisJc3RydWN0IHNjaGVkX3RhYmxlICpzID0gcGktPnNjaGVkX3RibDsKKwlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmUsICplbmQ7CisJc3RydWN0IHNjaGVkX2NsYXNzICpmb3VuZCA9IE5VTEw7CisJaW50IGk7CisKKwkvKiBMb29rIGZvciBhIGNsYXNzIHdpdGggbWF0Y2hpbmcgYm91bmQgcXVldWUgcGFyYW1ldGVycyAqLworCWVuZCA9ICZzLT50YWJbcy0+c2NoZWRfc2l6ZV07CisJZm9yIChlID0gJnMtPnRhYlswXTsgZSAhPSBlbmQ7ICsrZSkgeworCQlzdHJ1Y3Qgc2NoZWRfcXVldWVfZW50cnkgKnFlOworCisJCWkgPSAwOworCQlpZiAoZS0+c3RhdGUgPT0gU0NIRURfU1RBVEVfVU5VU0VEKQorCQkJY29udGludWU7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShxZSwgJmUtPnF1ZXVlX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChxZS0+Y250eHRfaWQgPT0gcWlkKSB7CisJCQkJZm91bmQgPSBlOworCQkJCWlmIChpbmRleCkKKwkJCQkJKmluZGV4ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWkrKzsKKwkJfQorCisJCWlmIChmb3VuZCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludCB0NF9zY2hlZF9xdWV1ZV91bmJpbmQoc3RydWN0IHBvcnRfaW5mbyAqcGksIHN0cnVjdCBjaF9zY2hlZF9xdWV1ZSAqcCkKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBpLT5hZGFwdGVyOworCXN0cnVjdCBzY2hlZF9jbGFzcyAqZTsKKwlzdHJ1Y3Qgc2NoZWRfcXVldWVfZW50cnkgKnFlID0gTlVMTDsKKwlzdHJ1Y3Qgc2dlX2V0aF90eHEgKnR4cTsKKwl1bnNpZ25lZCBpbnQgcWlkOworCWludCBpbmRleCA9IC0xOworCWludCBlcnIgPSAwOworCisJaWYgKHAtPnF1ZXVlIDwgMCB8fCBwLT5xdWV1ZSA+PSBwaS0+bnFzZXRzKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCXR4cSA9ICZhZGFwLT5zZ2UuZXRodHhxW3BpLT5maXJzdF9xc2V0ICsgcC0+cXVldWVdOworCXFpZCA9IHR4cS0+cS5jbnR4dF9pZDsKKworCS8qIEZpbmQgdGhlIGV4aXN0aW5nIGNsYXNzIHRoYXQgdGhlIHF1ZXVlIGlzIGJvdW5kIHRvICovCisJZSA9IHQ0X3NjaGVkX3F1ZXVlX2xvb2t1cChwaSwgcWlkLCAmaW5kZXgpOworCWlmIChlICYmIGluZGV4ID49IDApIHsKKwkJaW50IGkgPSAwOworCisJCXNwaW5fbG9jaygmZS0+bG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocWUsICZlLT5xdWV1ZV9saXN0LCBsaXN0KSB7CisJCQlpZiAoaSA9PSBpbmRleCkKKwkJCQlicmVhazsKKwkJCWkrKzsKKwkJfQorCQllcnIgPSB0NF9zY2hlZF9iaW5kX3VuYmluZF9vcChwaSwgKHZvaWQgKilxZSwgU0NIRURfUVVFVUUsCisJCQkJCSAgICAgIGZhbHNlKTsKKwkJaWYgKGVycikgeworCQkJc3Bpbl91bmxvY2soJmUtPmxvY2spOworCQkJZ290byBvdXQ7CisJCX0KKworCQlsaXN0X2RlbCgmcWUtPmxpc3QpOworCQl0NF9mcmVlX21lbShxZSk7CisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZlLT5yZWZjbnQpKSB7CisJCQllLT5zdGF0ZSA9IFNDSEVEX1NUQVRFX1VOVVNFRDsKKwkJCW1lbXNldCgmZS0+aW5mbywgMCwgc2l6ZW9mKGUtPmluZm8pKTsKKwkJfQorCQlzcGluX3VubG9jaygmZS0+bG9jayk7CisJfQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdDRfc2NoZWRfcXVldWVfYmluZChzdHJ1Y3QgcG9ydF9pbmZvICpwaSwgc3RydWN0IGNoX3NjaGVkX3F1ZXVlICpwKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7CisJc3RydWN0IHNjaGVkX3RhYmxlICpzID0gcGktPnNjaGVkX3RibDsKKwlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmU7CisJc3RydWN0IHNjaGVkX3F1ZXVlX2VudHJ5ICpxZSA9IE5VTEw7CisJc3RydWN0IHNnZV9ldGhfdHhxICp0eHE7CisJdW5zaWduZWQgaW50IHFpZDsKKwlpbnQgZXJyID0gMDsKKworCWlmIChwLT5xdWV1ZSA8IDAgfHwgcC0+cXVldWUgPj0gcGktPm5xc2V0cykKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlxZSA9IHQ0X2FsbG9jX21lbShzaXplb2Yoc3RydWN0IHNjaGVkX3F1ZXVlX2VudHJ5KSk7CisJaWYgKCFxZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0eHEgPSAmYWRhcC0+c2dlLmV0aHR4cVtwaS0+Zmlyc3RfcXNldCArIHAtPnF1ZXVlXTsKKwlxaWQgPSB0eHEtPnEuY250eHRfaWQ7CisKKwkvKiBVbmJpbmQgcXVldWUgZnJvbSBhbnkgZXhpc3RpbmcgY2xhc3MgKi8KKwllcnIgPSB0NF9zY2hlZF9xdWV1ZV91bmJpbmQocGksIHApOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogQmluZCBxdWV1ZSB0byBzcGVjaWZpZWQgY2xhc3MgKi8KKwltZW1zZXQocWUsIDAsIHNpemVvZigqcWUpKTsKKwlxZS0+Y250eHRfaWQgPSBxaWQ7CisJbWVtY3B5KCZxZS0+cGFyYW0sIHAsIHNpemVvZihxZS0+cGFyYW0pKTsKKworCWUgPSAmcy0+dGFiW3FlLT5wYXJhbS5jbGFzc107CisJc3Bpbl9sb2NrKCZlLT5sb2NrKTsKKwllcnIgPSB0NF9zY2hlZF9iaW5kX3VuYmluZF9vcChwaSwgKHZvaWQgKilxZSwgU0NIRURfUVVFVUUsIHRydWUpOworCWlmIChlcnIpIHsKKwkJdDRfZnJlZV9tZW0ocWUpOworCQlzcGluX3VubG9jaygmZS0+bG9jayk7CisJCWdvdG8gb3V0OworCX0KKworCWxpc3RfYWRkX3RhaWwoJnFlLT5saXN0LCAmZS0+cXVldWVfbGlzdCk7CisJYXRvbWljX2luYygmZS0+cmVmY250KTsKKwlzcGluX3VubG9jaygmZS0+bG9jayk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdDRfc2NoZWRfY2xhc3NfdW5iaW5kX2FsbChzdHJ1Y3QgcG9ydF9pbmZvICpwaSwKKwkJCQkgICAgICBzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmUsCisJCQkJICAgICAgZW51bSBzY2hlZF9iaW5kX3R5cGUgdHlwZSkKK3sKKwlpZiAoIWUpCisJCXJldHVybjsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU0NIRURfUVVFVUU6IHsKKwkJc3RydWN0IHNjaGVkX3F1ZXVlX2VudHJ5ICpxZTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHFlLCAmZS0+cXVldWVfbGlzdCwgbGlzdCkKKwkJCXQ0X3NjaGVkX3F1ZXVlX3VuYmluZChwaSwgJnFlLT5wYXJhbSk7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdDRfc2NoZWRfY2xhc3NfYmluZF91bmJpbmRfb3Aoc3RydWN0IHBvcnRfaW5mbyAqcGksIHZvaWQgKmFyZywKKwkJCQkJIGVudW0gc2NoZWRfYmluZF90eXBlIHR5cGUsIGJvb2wgYmluZCkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmICghYXJnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU0NIRURfUVVFVUU6IHsKKwkJc3RydWN0IGNoX3NjaGVkX3F1ZXVlICpxZSA9IChzdHJ1Y3QgY2hfc2NoZWRfcXVldWUgKilhcmc7CisKKwkJaWYgKGJpbmQpCisJCQllcnIgPSB0NF9zY2hlZF9xdWV1ZV9iaW5kKHBpLCBxZSk7CisJCWVsc2UKKwkJCWVyciA9IHQ0X3NjaGVkX3F1ZXVlX3VuYmluZChwaSwgcWUpOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1RTVVBQOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGN4Z2I0X3NjaGVkX2NsYXNzX2JpbmQgLSBCaW5kIGFuIGVudGl0eSB0byBhIHNjaGVkdWxpbmcgY2xhc3MKKyAqIEBkZXY6IG5ldF9kZXZpY2UgcG9pbnRlcgorICogQGFyZzogRW50aXR5IG9wYXF1ZSBkYXRhCisgKiBAdHlwZTogRW50aXR5IHR5cGUgKFF1ZXVlKQorICoKKyAqIEJpbmRzIGFuIGVudGl0eSAocXVldWUpIHRvIGEgc2NoZWR1bGluZyBjbGFzcy4gIElmIHRoZSBlbnRpdHkKKyAqIGlzIGJvdW5kIHRvIGFub3RoZXIgY2xhc3MsIGl0IHdpbGwgYmUgdW5ib3VuZCBmcm9tIHRoZSBvdGhlciBjbGFzcworICogYW5kIGJvdW5kIHRvIHRoZSBjbGFzcyBzcGVjaWZpZWQgaW4gQGFyZy4KKyAqLworaW50IGN4Z2I0X3NjaGVkX2NsYXNzX2JpbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYXJnLAorCQkJICAgZW51bSBzY2hlZF9iaW5kX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldjJwaW5mbyhkZXYpOworCXN0cnVjdCBzY2hlZF90YWJsZSAqczsKKwlpbnQgZXJyID0gMDsKKwl1OCBjbGFzc19pZDsKKworCWlmICghY2FuX3NjaGVkKGRldikpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAoIWFyZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNDSEVEX1FVRVVFOiB7CisJCXN0cnVjdCBjaF9zY2hlZF9xdWV1ZSAqcWUgPSAoc3RydWN0IGNoX3NjaGVkX3F1ZXVlICopYXJnOworCisJCWNsYXNzX2lkID0gcWUtPmNsYXNzOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlpZiAoIXZhbGlkX2NsYXNzX2lkKGRldiwgY2xhc3NfaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjbGFzc19pZCA9PSBTQ0hFRF9DTFNfTk9ORSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXMgPSBwaS0+c2NoZWRfdGJsOworCXdyaXRlX2xvY2soJnMtPnJ3X2xvY2spOworCWVyciA9IHQ0X3NjaGVkX2NsYXNzX2JpbmRfdW5iaW5kX29wKHBpLCBhcmcsIHR5cGUsIHRydWUpOworCXdyaXRlX3VubG9jaygmcy0+cndfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGN4Z2I0X3NjaGVkX2NsYXNzX3VuYmluZCAtIFVuYmluZCBhbiBlbnRpdHkgZnJvbSBhIHNjaGVkdWxpbmcgY2xhc3MKKyAqIEBkZXY6IG5ldF9kZXZpY2UgcG9pbnRlcgorICogQGFyZzogRW50aXR5IG9wYXF1ZSBkYXRhCisgKiBAdHlwZTogRW50aXR5IHR5cGUgKFF1ZXVlKQorICoKKyAqIFVuYmluZHMgYW4gZW50aXR5IChxdWV1ZSkgZnJvbSBhIHNjaGVkdWxpbmcgY2xhc3MuCisgKi8KK2ludCBjeGdiNF9zY2hlZF9jbGFzc191bmJpbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYXJnLAorCQkJICAgICBlbnVtIHNjaGVkX2JpbmRfdHlwZSB0eXBlKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2MnBpbmZvKGRldik7CisJc3RydWN0IHNjaGVkX3RhYmxlICpzOworCWludCBlcnIgPSAwOworCXU4IGNsYXNzX2lkOworCisJaWYgKCFjYW5fc2NoZWQoZGV2KSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCWlmICghYXJnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU0NIRURfUVVFVUU6IHsKKwkJc3RydWN0IGNoX3NjaGVkX3F1ZXVlICpxZSA9IChzdHJ1Y3QgY2hfc2NoZWRfcXVldWUgKilhcmc7CisKKwkJY2xhc3NfaWQgPSBxZS0+Y2xhc3M7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKworCWlmICghdmFsaWRfY2xhc3NfaWQoZGV2LCBjbGFzc19pZCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcyA9IHBpLT5zY2hlZF90Ymw7CisJd3JpdGVfbG9jaygmcy0+cndfbG9jayk7CisJZXJyID0gdDRfc2NoZWRfY2xhc3NfYmluZF91bmJpbmRfb3AocGksIGFyZywgdHlwZSwgZmFsc2UpOworCXdyaXRlX3VubG9jaygmcy0+cndfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBJZiBAcCBpcyBOVUxMLCBmZXRjaCBhbnkgYXZhaWxhYmxlIHVudXNlZCBjbGFzcyAqLworc3RhdGljIHN0cnVjdCBzY2hlZF9jbGFzcyAqdDRfc2NoZWRfY2xhc3NfbG9va3VwKHN0cnVjdCBwb3J0X2luZm8gKnBpLAorCQkJCQkJY29uc3Qgc3RydWN0IGNoX3NjaGVkX3BhcmFtcyAqcCkKK3sKKwlzdHJ1Y3Qgc2NoZWRfdGFibGUgKnMgPSBwaS0+c2NoZWRfdGJsOworCXN0cnVjdCBzY2hlZF9jbGFzcyAqZSwgKmVuZDsKKwlzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmZvdW5kID0gTlVMTDsKKworCWlmICghcCkgeworCQkvKiBHZXQgYW55IGF2YWlsYWJsZSB1bnVzZWQgY2xhc3MgKi8KKwkJZW5kID0gJnMtPnRhYltzLT5zY2hlZF9zaXplXTsKKwkJZm9yIChlID0gJnMtPnRhYlswXTsgZSAhPSBlbmQ7ICsrZSkgeworCQkJaWYgKGUtPnN0YXRlID09IFNDSEVEX1NUQVRFX1VOVVNFRCkgeworCQkJCWZvdW5kID0gZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIExvb2sgZm9yIGEgY2xhc3Mgd2l0aCBtYXRjaGluZyBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgKi8KKwkJc3RydWN0IGNoX3NjaGVkX3BhcmFtcyBpbmZvOworCQlzdHJ1Y3QgY2hfc2NoZWRfcGFyYW1zIHRwOworCisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJbWVtc2V0KCZ0cCwgMCwgc2l6ZW9mKHRwKSk7CisKKwkJbWVtY3B5KCZ0cCwgcCwgc2l6ZW9mKHRwKSk7CisJCS8qIERvbid0IHRyeSB0byBtYXRjaCBjbGFzcyBwYXJhbWV0ZXIgKi8KKwkJdHAudS5wYXJhbXMuY2xhc3MgPSBTQ0hFRF9DTFNfTk9ORTsKKworCQllbmQgPSAmcy0+dGFiW3MtPnNjaGVkX3NpemVdOworCQlmb3IgKGUgPSAmcy0+dGFiWzBdOyBlICE9IGVuZDsgKytlKSB7CisJCQlpZiAoZS0+c3RhdGUgPT0gU0NIRURfU1RBVEVfVU5VU0VEKQorCQkJCWNvbnRpbnVlOworCisJCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCQltZW1jcHkoJmluZm8sICZlLT5pbmZvLCBzaXplb2YoaW5mbykpOworCQkJLyogRG9uJ3QgdHJ5IHRvIG1hdGNoIGNsYXNzIHBhcmFtZXRlciAqLworCQkJaW5mby51LnBhcmFtcy5jbGFzcyA9IFNDSEVEX0NMU19OT05FOworCisJCQlpZiAoKGluZm8udHlwZSA9PSB0cC50eXBlKSAmJgorCQkJICAgICghbWVtY21wKCZpbmZvLnUucGFyYW1zLCAmdHAudS5wYXJhbXMsCisJCQkJICAgICBzaXplb2YoaW5mby51LnBhcmFtcykpKSkgeworCQkJCWZvdW5kID0gZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHN0cnVjdCBzY2hlZF9jbGFzcyAqdDRfc2NoZWRfY2xhc3NfYWxsb2Moc3RydWN0IHBvcnRfaW5mbyAqcGksCisJCQkJCQlzdHJ1Y3QgY2hfc2NoZWRfcGFyYW1zICpwKQoreworCXN0cnVjdCBzY2hlZF90YWJsZSAqcyA9IHBpLT5zY2hlZF90Ymw7CisJc3RydWN0IHNjaGVkX2NsYXNzICplOworCXU4IGNsYXNzX2lkOworCWludCBlcnI7CisKKwlpZiAoIXApCisJCXJldHVybiBOVUxMOworCisJY2xhc3NfaWQgPSBwLT51LnBhcmFtcy5jbGFzczsKKworCS8qIE9ubHkgYWNjZXB0IHNlYXJjaCBmb3IgZXhpc3RpbmcgY2xhc3Mgd2l0aCBtYXRjaGluZyBwYXJhbXMKKwkgKiBvciBhbGxvY2F0aW9uIG9mIG5ldyBjbGFzcyB3aXRoIHNwZWNpZmllZCBwYXJhbXMKKwkgKi8KKwlpZiAoY2xhc3NfaWQgIT0gU0NIRURfQ0xTX05PTkUpCisJCXJldHVybiBOVUxMOworCisJd3JpdGVfbG9jaygmcy0+cndfbG9jayk7CisJLyogU2VlIGlmIHRoZXJlJ3MgYW4gZXhpc2l0aW5nIGNsYXNzIHdpdGggc2FtZQorCSAqIHJlcXVlc3RlZCBzY2hlZCBwYXJhbXMKKwkgKi8KKwllID0gdDRfc2NoZWRfY2xhc3NfbG9va3VwKHBpLCBwKTsKKwlpZiAoIWUpIHsKKwkJc3RydWN0IGNoX3NjaGVkX3BhcmFtcyBucDsKKworCQkvKiBGZXRjaCBhbnkgYXZhaWxhYmxlIHVudXNlZCBjbGFzcyAqLworCQllID0gdDRfc2NoZWRfY2xhc3NfbG9va3VwKHBpLCBOVUxMKTsKKwkJaWYgKCFlKQorCQkJZ290byBvdXQ7CisKKwkJbWVtc2V0KCZucCwgMCwgc2l6ZW9mKG5wKSk7CisJCW1lbWNweSgmbnAsIHAsIHNpemVvZihucCkpOworCQlucC51LnBhcmFtcy5jbGFzcyA9IGUtPmlkeDsKKworCQlzcGluX2xvY2soJmUtPmxvY2spOworCQkvKiBOZXcgY2xhc3MgKi8KKwkJZXJyID0gdDRfc2NoZWRfY2xhc3NfZndfY21kKHBpLCAmbnAsIFNDSEVEX0ZXX09QX0FERCk7CisJCWlmIChlcnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZlLT5sb2NrKTsKKwkJCWUgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJbWVtY3B5KCZlLT5pbmZvLCAmbnAsIHNpemVvZihlLT5pbmZvKSk7CisJCWF0b21pY19zZXQoJmUtPnJlZmNudCwgMCk7CisJCWUtPnN0YXRlID0gU0NIRURfU1RBVEVfQUNUSVZFOworCQlzcGluX3VubG9jaygmZS0+bG9jayk7CisJfQorCitvdXQ6CisJd3JpdGVfdW5sb2NrKCZzLT5yd19sb2NrKTsKKwlyZXR1cm4gZTsKK30KKworLyoqCisgKiBjeGdiNF9zY2hlZF9jbGFzc19hbGxvYyAtIGFsbG9jYXRlIGEgc2NoZWR1bGluZyBjbGFzcworICogQGRldjogbmV0X2RldmljZSBwb2ludGVyCisgKiBAcDogbmV3IHNjaGVkdWxpbmcgY2xhc3MgdG8gY3JlYXRlLgorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgc2NoZWR1bGluZyBjbGFzcyBjcmVhdGVkLiAgSWYgQHAgaXMgTlVMTCwgdGhlbgorICogaXQgYWxsb2NhdGVzIGFuZCByZXR1cm5zIGFueSBhdmFpbGFibGUgdW51c2VkIHNjaGVkdWxpbmcgY2xhc3MuIElmIGEKKyAqIHNjaGVkdWxpbmcgY2xhc3Mgd2l0aCBtYXRjaGluZyBAcCBpcyBmb3VuZCwgdGhlbiB0aGUgbWF0Y2hpbmcgY2xhc3MgaXMKKyAqIHJldHVybmVkLgorICovCitzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmN4Z2I0X3NjaGVkX2NsYXNzX2FsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgY2hfc2NoZWRfcGFyYW1zICpwKQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2MnBpbmZvKGRldik7CisJdTggY2xhc3NfaWQ7CisKKwlpZiAoIWNhbl9zY2hlZChkZXYpKQorCQlyZXR1cm4gTlVMTDsKKworCWNsYXNzX2lkID0gcC0+dS5wYXJhbXMuY2xhc3M7CisJaWYgKCF2YWxpZF9jbGFzc19pZChkZXYsIGNsYXNzX2lkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdDRfc2NoZWRfY2xhc3NfYWxsb2MocGksIHApOworfQorCitzdGF0aWMgdm9pZCB0NF9zY2hlZF9jbGFzc19mcmVlKHN0cnVjdCBwb3J0X2luZm8gKnBpLCBzdHJ1Y3Qgc2NoZWRfY2xhc3MgKmUpCit7CisJdDRfc2NoZWRfY2xhc3NfdW5iaW5kX2FsbChwaSwgZSwgU0NIRURfUVVFVUUpOworfQorCitzdHJ1Y3Qgc2NoZWRfdGFibGUgKnQ0X2luaXRfc2NoZWQodW5zaWduZWQgaW50IHNjaGVkX3NpemUpCit7CisJc3RydWN0IHNjaGVkX3RhYmxlICpzOworCXVuc2lnbmVkIGludCBpOworCisJcyA9IHQ0X2FsbG9jX21lbShzaXplb2YoKnMpICsgc2NoZWRfc2l6ZSAqIHNpemVvZihzdHJ1Y3Qgc2NoZWRfY2xhc3MpKTsKKwlpZiAoIXMpCisJCXJldHVybiBOVUxMOworCisJcy0+c2NoZWRfc2l6ZSA9IHNjaGVkX3NpemU7CisJcndsb2NrX2luaXQoJnMtPnJ3X2xvY2spOworCisJZm9yIChpID0gMDsgaSA8IHMtPnNjaGVkX3NpemU7IGkrKykgeworCQltZW1zZXQoJnMtPnRhYltpXSwgMCwgc2l6ZW9mKHN0cnVjdCBzY2hlZF9jbGFzcykpOworCQlzLT50YWJbaV0uaWR4ID0gaTsKKwkJcy0+dGFiW2ldLnN0YXRlID0gU0NIRURfU1RBVEVfVU5VU0VEOworCQlJTklUX0xJU1RfSEVBRCgmcy0+dGFiW2ldLnF1ZXVlX2xpc3QpOworCQlzcGluX2xvY2tfaW5pdCgmcy0+dGFiW2ldLmxvY2spOworCQlhdG9taWNfc2V0KCZzLT50YWJbaV0ucmVmY250LCAwKTsKKwl9CisJcmV0dXJuIHM7Cit9CisKK3ZvaWQgdDRfY2xlYW51cF9zY2hlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3Qgc2NoZWRfdGFibGUgKnM7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKKwkJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXYycGluZm8oYWRhcC0+cG9ydFtpXSk7CisKKwkJcyA9IHBpLT5zY2hlZF90Ymw7CisJCWZvciAoaSA9IDA7IGkgPCBzLT5zY2hlZF9zaXplOyBpKyspIHsKKwkJCXN0cnVjdCBzY2hlZF9jbGFzcyAqZTsKKworCQkJd3JpdGVfbG9jaygmcy0+cndfbG9jayk7CisJCQllID0gJnMtPnRhYltpXTsKKwkJCWlmIChlLT5zdGF0ZSA9PSBTQ0hFRF9TVEFURV9BQ1RJVkUpCisJCQkJdDRfc2NoZWRfY2xhc3NfZnJlZShwaSwgZSk7CisJCQl3cml0ZV91bmxvY2soJnMtPnJ3X2xvY2spOworCQl9CisJCXQ0X2ZyZWVfbWVtKHMpOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2NoZWQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2NoZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2IyYjNmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zY2hlZC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX0NYR0I0X1NDSEVEX0gKKyNkZWZpbmUgX19DWEdCNF9TQ0hFRF9ICisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorCisjZGVmaW5lIFNDSEVEX0NMU19OT05FIDB4ZmYKKworI2RlZmluZSBGV19TQ0hFRF9DTFNfTk9ORSAweGZmZmZmZmZmCisKKy8qIE1heCByYXRlIHRoYXQgY2FuIGJlIHNldCB0byBhIHNjaGVkdWxpbmcgY2xhc3MgaXMgMTAgR2JwcyAqLworI2RlZmluZSBTQ0hFRF9NQVhfUkFURV9LQlBTIDEwMDAwMDAwVQorCitlbnVtIHsKKwlTQ0hFRF9TVEFURV9BQ1RJVkUsCisJU0NIRURfU1RBVEVfVU5VU0VELAorfTsKKworZW51bSBzY2hlZF9md19vcHMgeworCVNDSEVEX0ZXX09QX0FERCwKK307CisKK2VudW0gc2NoZWRfYmluZF90eXBlIHsKKwlTQ0hFRF9RVUVVRSwKK307CisKK3N0cnVjdCBzY2hlZF9xdWV1ZV9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGludCBjbnR4dF9pZDsKKwlzdHJ1Y3QgY2hfc2NoZWRfcXVldWUgcGFyYW07Cit9OworCitzdHJ1Y3Qgc2NoZWRfY2xhc3MgeworCXU4IHN0YXRlOworCXU4IGlkeDsKKwlzdHJ1Y3QgY2hfc2NoZWRfcGFyYW1zIGluZm87CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZV9saXN0OworCXNwaW5sb2NrX3QgbG9jazsgLyogUGVyIGNsYXNzIGxvY2sgKi8KKwlhdG9taWNfdCByZWZjbnQ7Cit9OworCitzdHJ1Y3Qgc2NoZWRfdGFibGUgeyAgICAgIC8qIHBlciBwb3J0IHNjaGVkdWxpbmcgdGFibGUgKi8KKwl1OCBzY2hlZF9zaXplOworCXJ3bG9ja190IHJ3X2xvY2s7IC8qIFRhYmxlIGxvY2sgKi8KKwlzdHJ1Y3Qgc2NoZWRfY2xhc3MgdGFiWzBdOworfTsKKworc3RhdGljIGlubGluZSBib29sIGNhbl9zY2hlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2MnBpbmZvKGRldik7CisKKwlyZXR1cm4gIXBpLT5zY2hlZF90YmwgPyBmYWxzZSA6IHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB2YWxpZF9jbGFzc19pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjbGFzc19pZCkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldjJwaW5mbyhkZXYpOworCisJaWYgKChjbGFzc19pZCA+IHBpLT5zY2hlZF90YmwtPnNjaGVkX3NpemUgLSAxKSAmJgorCSAgICAoY2xhc3NfaWQgIT0gU0NIRURfQ0xTX05PTkUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworaW50IGN4Z2I0X3NjaGVkX2NsYXNzX2JpbmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYXJnLAorCQkJICAgZW51bSBzY2hlZF9iaW5kX3R5cGUgdHlwZSk7CitpbnQgY3hnYjRfc2NoZWRfY2xhc3NfdW5iaW5kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFyZywKKwkJCSAgICAgZW51bSBzY2hlZF9iaW5kX3R5cGUgdHlwZSk7CisKK3N0cnVjdCBzY2hlZF9jbGFzcyAqY3hnYjRfc2NoZWRfY2xhc3NfYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgIHN0cnVjdCBjaF9zY2hlZF9wYXJhbXMgKnApOworCitzdHJ1Y3Qgc2NoZWRfdGFibGUgKnQ0X2luaXRfc2NoZWQodW5zaWduZWQgaW50IHNpemUpOwordm9pZCB0NF9jbGVhbnVwX3NjaGVkKHN0cnVjdCBhZGFwdGVyICphZGFwKTsKKyNlbmRpZiAgLyogX19DWEdCNF9TQ0hFRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NnZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zZ2UuYwppbmRleCBhZDM1NTJkLi4xZTc0ZmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NnZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMKQEAgLTI4NjAsNiArMjg2MCwxOCBAQAogCXJldHVybiAwOwogfQogCitpbnQgdDRfc2dlX21vZF9jdHJsX3R4cShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IGVxaWQsCisJCQl1bnNpZ25lZCBpbnQgY21wbHFpZCkKK3sKKwl1MzIgcGFyYW0sIHZhbDsKKworCXBhcmFtID0gKEZXX1BBUkFNU19NTkVNX1YoRldfUEFSQU1TX01ORU1fRE1BUSkgfAorCQkgRldfUEFSQU1TX1BBUkFNX1hfVihGV19QQVJBTVNfUEFSQU1fRE1BUV9FUV9DTVBMSVFJRF9DVFJMKSB8CisJCSBGV19QQVJBTVNfUEFSQU1fWVpfVihlcWlkKSk7CisJdmFsID0gY21wbHFpZDsKKwlyZXR1cm4gdDRfc2V0X3BhcmFtcyhhZGFwLCBhZGFwLT5tYm94LCBhZGFwLT5wZiwgMCwgMSwgJnBhcmFtLCAmdmFsKTsKK30KKwogaW50IHQ0X3NnZV9hbGxvY19vZmxkX3R4cShzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9vZmxkX3R4cSAqdHhxLAogCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgaXFpZCkKIHsKQEAgLTI5MjgsOCArMjk0MCw4IEBACiAJcS0+ZGVzYyA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfcnNwcV9mbChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9yc3BxICpycSwKLQkJCSBzdHJ1Y3Qgc2dlX2ZsICpmbCkKK3ZvaWQgZnJlZV9yc3BxX2ZsKHN0cnVjdCBhZGFwdGVyICphZGFwLCBzdHJ1Y3Qgc2dlX3JzcHEgKnJxLAorCQkgIHN0cnVjdCBzZ2VfZmwgKmZsKQogewogCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOwogCXVuc2lnbmVkIGludCBmbF9pZCA9IGZsID8gZmwtPmNudHh0X2lkIDogMHhmZmZmOwpAQCAtMzAxNCwxMiArMzAyNiw2IEBACiAJCX0KIAl9CiAKLQkvKiBjbGVhbiB1cCBSRE1BIGFuZCBpU0NTSSBSeCBxdWV1ZXMgKi8KLQl0NF9mcmVlX29mbGRfcnhxcyhhZGFwLCBhZGFwLT5zZ2UuaXNjc2lxc2V0cywgYWRhcC0+c2dlLmlzY3NpcnhxKTsKLQl0NF9mcmVlX29mbGRfcnhxcyhhZGFwLCBhZGFwLT5zZ2UubmlzY3NpdHEsIGFkYXAtPnNnZS5pc2NzaXRyeHEpOwotCXQ0X2ZyZWVfb2ZsZF9yeHFzKGFkYXAsIGFkYXAtPnNnZS5yZG1hcXMsIGFkYXAtPnNnZS5yZG1hcnhxKTsKLQl0NF9mcmVlX29mbGRfcnhxcyhhZGFwLCBhZGFwLT5zZ2UucmRtYWNpcXMsIGFkYXAtPnNnZS5yZG1hY2lxKTsKLQogCS8qIGNsZWFuIHVwIG9mZmxvYWQgVHggcXVldWVzICovCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWRhcC0+c2dlLm9mbGR0eHEpOyBpKyspIHsKIAkJc3RydWN0IHNnZV9vZmxkX3R4cSAqcSA9ICZhZGFwLT5zZ2Uub2ZsZHR4cVtpXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfaHcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfaHcuYwppbmRleCBkYzkyYzgwLi4yMGRlYzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9ody5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDaGVsc2lvIFQ0IEV0aGVybmV0IGRyaXZlciBmb3IgTGludXguCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0yNzI5LDcgKzI3MjksNyBAQAogCiBvdXQ6CiAJdmZyZWUodnBkKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKIH0KIAogLyoqCkBAIC0zNjI3LDcgKzM2MjcsOCBAQAogfQogCiAjZGVmaW5lIEFEVkVSVF9NQVNLIChGV19QT1JUX0NBUF9TUEVFRF8xMDBNIHwgRldfUE9SVF9DQVBfU1BFRURfMUcgfFwKLQkJICAgICBGV19QT1JUX0NBUF9TUEVFRF8xMEcgfCBGV19QT1JUX0NBUF9TUEVFRF80MEcgfCBcCisJCSAgICAgRldfUE9SVF9DQVBfU1BFRURfMTBHIHwgRldfUE9SVF9DQVBfU1BFRURfMjVHIHwgXAorCQkgICAgIEZXX1BPUlRfQ0FQX1NQRUVEXzQwRyB8IEZXX1BPUlRfQ0FQX1NQRUVEXzEwMEcgfCBcCiAJCSAgICAgRldfUE9SVF9DQVBfQU5FRykKIAogLyoqCkBAIC03MTk2LDggKzcxOTcsMTIgQEAKIAkJc3BlZWQgPSAxMDAwOwogCWVsc2UgaWYgKHN0YXQgJiBGV19QT1JUX0NNRF9MU1BFRURfVihGV19QT1JUX0NBUF9TUEVFRF8xMEcpKQogCQlzcGVlZCA9IDEwMDAwOworCWVsc2UgaWYgKHN0YXQgJiBGV19QT1JUX0NNRF9MU1BFRURfVihGV19QT1JUX0NBUF9TUEVFRF8yNUcpKQorCQlzcGVlZCA9IDI1MDAwOwogCWVsc2UgaWYgKHN0YXQgJiBGV19QT1JUX0NNRF9MU1BFRURfVihGV19QT1JUX0NBUF9TUEVFRF80MEcpKQogCQlzcGVlZCA9IDQwMDAwOworCWVsc2UgaWYgKHN0YXQgJiBGV19QT1JUX0NNRF9MU1BFRURfVihGV19QT1JUX0NBUF9TUEVFRF8xMDBHKSkKKwkJc3BlZWQgPSAxMDAwMDA7CiAKIAlsYyA9ICZwaS0+bGlua19jZmc7CiAKQEAgLTgyNjQsMyArODI2OSw3MyBAQAogCQl0NF9zZ2VfZGVjb2RlX2lkbWFfc3RhdGUoYWRhcHRlciwgaWRtYS0+aWRtYV9zdGF0ZVtpXSk7CiAJfQogfQorCisvKioKKyAqCXQ0X3NldF92Zl9tYWMgLSBTZXQgTUFDIGFkZHJlc3MgZm9yIHRoZSBzcGVjaWZpZWQgVkYKKyAqCUBhZGFwdGVyOiBUaGUgYWRhcHRlcgorICoJQHZmOiBvbmUgb2YgdGhlIFZGcyBpbnN0YW50aWF0ZWQgYnkgdGhlIHNwZWNpZmllZCBQRgorICoJQG5hZGRyOiB0aGUgbnVtYmVyIG9mIE1BQyBhZGRyZXNzZXMKKyAqCUBhZGRyOiB0aGUgTUFDIGFkZHJlc3MoZXMpIHRvIGJlIHNldCB0byB0aGUgc3BlY2lmaWVkIFZGCisgKi8KK2ludCB0NF9zZXRfdmZfbWFjX2FjbChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdW5zaWduZWQgaW50IHZmLAorCQkgICAgICB1bnNpZ25lZCBpbnQgbmFkZHIsIHU4ICphZGRyKQoreworCXN0cnVjdCBmd19hY2xfbWFjX2NtZCBjbWQ7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5vcF90b192Zm4gPSBjcHVfdG9fYmUzMihGV19DTURfT1BfVihGV19BQ0xfTUFDX0NNRCkgfAorCQkJCSAgICBGV19DTURfUkVRVUVTVF9GIHwKKwkJCQkgICAgRldfQ01EX1dSSVRFX0YgfAorCQkJCSAgICBGV19BQ0xfTUFDX0NNRF9QRk5fVihhZGFwdGVyLT5wZikgfAorCQkJCSAgICBGV19BQ0xfTUFDX0NNRF9WRk5fVih2ZikpOworCisJLyogTm90ZTogRG8gbm90IGVuYWJsZSB0aGUgQUNMICovCisJY21kLmVuX3RvX2xlbjE2ID0gY3B1X3RvX2JlMzIoKHVuc2lnbmVkIGludClGV19MRU4xNihjbWQpKTsKKwljbWQubm1hYyA9IG5hZGRyOworCisJc3dpdGNoIChhZGFwdGVyLT5wZikgeworCWNhc2UgMzoKKwkJbWVtY3B5KGNtZC5tYWNhZGRyMywgYWRkciwgc2l6ZW9mKGNtZC5tYWNhZGRyMykpOworCQlicmVhazsKKwljYXNlIDI6CisJCW1lbWNweShjbWQubWFjYWRkcjIsIGFkZHIsIHNpemVvZihjbWQubWFjYWRkcjIpKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltZW1jcHkoY21kLm1hY2FkZHIxLCBhZGRyLCBzaXplb2YoY21kLm1hY2FkZHIxKSk7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJbWVtY3B5KGNtZC5tYWNhZGRyMCwgYWRkciwgc2l6ZW9mKGNtZC5tYWNhZGRyMCkpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdDRfd3JfbWJveChhZGFwdGVyLCBhZGFwdGVyLT5tYm94LCAmY21kLCBzaXplb2YoY21kKSwgJmNtZCk7Cit9CisKK2ludCB0NF9zY2hlZF9wYXJhbXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGludCB0eXBlLCBpbnQgbGV2ZWwsIGludCBtb2RlLAorCQkgICAgaW50IHJhdGV1bml0LCBpbnQgcmF0ZW1vZGUsIGludCBjaGFubmVsLCBpbnQgY2xhc3MsCisJCSAgICBpbnQgbWlucmF0ZSwgaW50IG1heHJhdGUsIGludCB3ZWlnaHQsIGludCBwa3RzaXplKQoreworCXN0cnVjdCBmd19zY2hlZF9jbWQgY21kOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwljbWQub3BfdG9fd3JpdGUgPSBjcHVfdG9fYmUzMihGV19DTURfT1BfVihGV19TQ0hFRF9DTUQpIHwKKwkJCQkgICAgICBGV19DTURfUkVRVUVTVF9GIHwKKwkJCQkgICAgICBGV19DTURfV1JJVEVfRik7CisJY21kLnJldHZhbF9sZW4xNiA9IGNwdV90b19iZTMyKEZXX0xFTjE2KGNtZCkpOworCisJY21kLnUucGFyYW1zLnNjID0gRldfU0NIRURfU0NfUEFSQU1TOworCWNtZC51LnBhcmFtcy50eXBlID0gdHlwZTsKKwljbWQudS5wYXJhbXMubGV2ZWwgPSBsZXZlbDsKKwljbWQudS5wYXJhbXMubW9kZSA9IG1vZGU7CisJY21kLnUucGFyYW1zLmNoID0gY2hhbm5lbDsKKwljbWQudS5wYXJhbXMuY2wgPSBjbGFzczsKKwljbWQudS5wYXJhbXMudW5pdCA9IHJhdGV1bml0OworCWNtZC51LnBhcmFtcy5yYXRlID0gcmF0ZW1vZGU7CisJY21kLnUucGFyYW1zLm1pbiA9IGNwdV90b19iZTMyKG1pbnJhdGUpOworCWNtZC51LnBhcmFtcy5tYXggPSBjcHVfdG9fYmUzMihtYXhyYXRlKTsKKwljbWQudS5wYXJhbXMud2VpZ2h0ID0gY3B1X3RvX2JlMTYod2VpZ2h0KTsKKwljbWQudS5wYXJhbXMucGt0c2l6ZSA9IGNwdV90b19iZTE2KHBrdHNpemUpOworCisJcmV0dXJuIHQ0X3dyX21ib3hfbWVhdChhZGFwdGVyLCBhZGFwdGVyLT5tYm94LCAmY21kLCBzaXplb2YoY21kKSwKKwkJCSAgICAgICBOVUxMLCAxKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfbXNnLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X21zZy5oCmluZGV4IGUwZWJlMTMuLmZiYTNiMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfbXNnLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9tc2cuaApAQCAtNjEsNiArNjEsNyBAQAogCUNQTF9BQk9SVF9SRVFfUlNTICAgICA9IDB4MkIsCiAJQ1BMX0FCT1JUX1JQTF9SU1MgICAgID0gMHgyRCwKIAorCUNQTF9SWF9QSFlTX0FERFIgICAgICA9IDB4MzAsCiAJQ1BMX0NMT1NFX0NPTl9SUEwgICAgID0gMHgzMiwKIAlDUExfSVNDU0lfSERSICAgICAgICAgPSAweDMzLAogCUNQTF9SRE1BX0NRRSAgICAgICAgICA9IDB4MzUsCkBAIC04Myw2ICs4NCwxMCBAQAogCUNQTF9QQVNTX09QRU5fUkVRNiAgICA9IDB4ODEsCiAJQ1BMX0FDVF9PUEVOX1JFUTYgICAgID0gMHg4MywKIAorCUNQTF9UWF9UTFNfUERVICAgICA9ICAgIDB4ODgsCisJQ1BMX1RYX1NFQ19QRFUgICAgICAgID0gMHg4QSwKKwlDUExfVFhfVExTX0FDSyAgICAgICAgPSAweDhCLAorCiAJQ1BMX1JETUFfVEVSTUlOQVRFICAgID0gMHhBMiwKIAlDUExfUkRNQV9XUklURSAgICAgICAgPSAweEE0LAogCUNQTF9TR0VfRUdSX1VQREFURSAgICA9IDB4QTUsCkBAIC05NCw2ICs5OSw4IEBACiAJQ1BMX0ZXNF9QTEQgICAgICAgICAgID0gMHhDMSwKIAlDUExfRlc0X0FDSyAgICAgICAgICAgPSAweEMzLAogCisJQ1BMX1JYX1BIWVNfRFNHTCAgICAgID0gMHhEMCwKKwogCUNQTF9GVzZfTVNHICAgICAgICAgICA9IDB4RTAsCiAJQ1BMX0ZXNl9QTEQgICAgICAgICAgID0gMHhFMSwKIAlDUExfVFhfUEtUX0xTTyAgICAgICAgPSAweEVELApAQCAtMTM2Miw2ICsxMzY5LDE1IEBACiAJX19iZTMyIGxlbjsKIH07CiAKK3N0cnVjdCB1bHBfdHhwa3QgeworCV9fYmUzMiBjbWRfZGVzdDsKKwlfX2JlMzIgbGVuOworfTsKKworI2RlZmluZSBVTFBUWF9DTURfUyAgICAyNAorI2RlZmluZSBVTFBUWF9DTURfTSAgICAweEZGCisjZGVmaW5lIFVMUFRYX0NNRF9WKHgpICgoeCkgPDwgVUxQVFhfQ01EX1MpCisKICNkZWZpbmUgVUxQVFhfTlNHRV9TICAgIDAKICNkZWZpbmUgVUxQVFhfTlNHRV9WKHgpICgoeCkgPDwgVUxQVFhfTlNHRV9TKQogCkBAIC0xMzY5LDYgKzEzODUsMjIgQEAKICNkZWZpbmUgVUxQVFhfTU9SRV9WKHgpCSgoeCkgPDwgVUxQVFhfTU9SRV9TKQogI2RlZmluZSBVTFBUWF9NT1JFX0YJVUxQVFhfTU9SRV9WKDFVKQogCisjZGVmaW5lIFVMUF9UWFBLVF9ERVNUX1MgICAgMTYKKyNkZWZpbmUgVUxQX1RYUEtUX0RFU1RfTSAgICAweDMKKyNkZWZpbmUgVUxQX1RYUEtUX0RFU1RfVih4KSAoKHgpIDw8IFVMUF9UWFBLVF9ERVNUX1MpCisKKyNkZWZpbmUgVUxQX1RYUEtUX0ZJRF9TICAgICA0CisjZGVmaW5lIFVMUF9UWFBLVF9GSURfTSAgICAgMHg3ZmYKKyNkZWZpbmUgVUxQX1RYUEtUX0ZJRF9WKHgpICAoKHgpIDw8IFVMUF9UWFBLVF9GSURfUykKKworI2RlZmluZSBVTFBfVFhQS1RfUk9fUyAgICAgIDMKKyNkZWZpbmUgVUxQX1RYUEtUX1JPX1YoeCkgKCh4KSA8PCBVTFBfVFhQS1RfUk9fUykKKyNkZWZpbmUgVUxQX1RYUEtUX1JPX0YgVUxQX1RYUEtUX1JPX1YoMVUpCisKKyNkZWZpbmUgVUxQX1RYX1NDX01PUkVfUyAyMworI2RlZmluZSBVTFBfVFhfU0NfTU9SRV9WKHgpICgoeCkgPDwgVUxQX1RYX1NDX01PUkVfUykKKyNkZWZpbmUgVUxQX1RYX1NDX01PUkVfRiAgVUxQX1RYX1NDX01PUkVfVigxVSkKKwogc3RydWN0IHVscF9tZW1faW8gewogCVdSX0hEUjsKIAlfX2JlMzIgY21kOwpAQCAtMTQwNiw0ICsxNDM4LDQwOSBAQAogI2RlZmluZSBVTFBfTUVNSU9fREFUQV9MRU5fUyAgICAwCiAjZGVmaW5lIFVMUF9NRU1JT19EQVRBX0xFTl9WKHgpICgoeCkgPDwgVUxQX01FTUlPX0RBVEFfTEVOX1MpCiAKKyNkZWZpbmUgVUxQVFhfTlNHRV9TICAgIDAKKyNkZWZpbmUgVUxQVFhfTlNHRV9NICAgIDB4RkZGRgorI2RlZmluZSBVTFBUWF9OU0dFX1YoeCkgKCh4KSA8PCBVTFBUWF9OU0dFX1MpCisjZGVmaW5lIFVMUFRYX05TR0VfRyh4KSAoKCh4KSA+PiBVTFBUWF9OU0dFX1MpICYgVUxQVFhfTlNHRV9NKQorCitzdHJ1Y3QgdWxwdHhfc2NfbWVtcmQgeworCV9fYmUzMiBjbWRfdG9fbGVuOworCV9fYmUzMiBhZGRyOworfTsKKworI2RlZmluZSBVTFBfVFhQS1RfREFUQU1PRElGWV9TICAgICAgIDIzCisjZGVmaW5lIFVMUF9UWFBLVF9EQVRBTU9ESUZZX00gICAgICAgMHgxCisjZGVmaW5lIFVMUF9UWFBLVF9EQVRBTU9ESUZZX1YoeCkgICAgKCh4KSA8PCBVTFBfVFhQS1RfREFUQU1PRElGWV9TKQorI2RlZmluZSBVTFBfVFhQS1RfREFUQU1PRElGWV9HKHgpICAgIFwKKwkoKCh4KSA+PiBVTFBfVFhQS1RfREFUQU1PRElGWV9TKSAmIFVMUF9UWFBLVF9EQVRBTU9ESUZZX19NKQorI2RlZmluZSBVTFBfVFhQS1RfREFUQU1PRElGWV9GICAgICAgIFVMUF9UWFBLVF9EQVRBTU9ESUZZX1YoMVUpCisKKyNkZWZpbmUgVUxQX1RYUEtUX0NIQU5ORUxJRF9TICAgICAgICAyMgorI2RlZmluZSBVTFBfVFhQS1RfQ0hBTk5FTElEX00gICAgICAgIDB4MQorI2RlZmluZSBVTFBfVFhQS1RfQ0hBTk5FTElEX1YoeCkgICAgICgoeCkgPDwgVUxQX1RYUEtUX0NIQU5ORUxJRF9TKQorI2RlZmluZSBVTFBfVFhQS1RfQ0hBTk5FTElEX0coeCkgICAgIFwKKwkoKCh4KSA+PiBVTFBfVFhQS1RfQ0hBTk5FTElEX1MpICYgVUxQX1RYUEtUX0NIQU5ORUxJRF9NKQorI2RlZmluZSBVTFBfVFhQS1RfQ0hBTk5FTElEX0YgICAgICAgIFVMUF9UWFBLVF9DSEFOTkVMSURfVigxVSkKKworI2RlZmluZSBTQ01EX1NFUV9OT19DVFJMX1MgICAgICAyOQorI2RlZmluZSBTQ01EX1NFUV9OT19DVFJMX00gICAgICAweDMKKyNkZWZpbmUgU0NNRF9TRVFfTk9fQ1RSTF9WKHgpICAgKCh4KSA8PCBTQ01EX1NFUV9OT19DVFJMX1MpCisjZGVmaW5lIFNDTURfU0VRX05PX0NUUkxfRyh4KSAgIFwKKwkoKCh4KSA+PiBTQ01EX1NFUV9OT19DVFJMX1MpICYgU0NNRF9TRVFfTk9fQ1RSTF9NKQorCisvKiBTdHNGaWVsZFByc250LSBTdGF0dXMgZmllbGQgYXQgdGhlIGVuZCBvZiB0aGUgVExTIFBEVSAqLworI2RlZmluZSBTQ01EX1NUQVRVU19QUkVTRU5UX1MgICAyOAorI2RlZmluZSBTQ01EX1NUQVRVU19QUkVTRU5UX00gICAweDEKKyNkZWZpbmUgU0NNRF9TVEFUVVNfUFJFU0VOVF9WKHgpICAgICgoeCkgPDwgU0NNRF9TVEFUVVNfUFJFU0VOVF9TKQorI2RlZmluZSBTQ01EX1NUQVRVU19QUkVTRU5UX0coeCkgICAgXAorCSgoKHgpID4+IFNDTURfU1RBVFVTX1BSRVNFTlRfUykgJiBTQ01EX1NUQVRVU19QUkVTRU5UX00pCisjZGVmaW5lIFNDTURfU1RBVFVTX1BSRVNFTlRfRiAgIFNDTURfU1RBVFVTX1BSRVNFTlRfVigxVSkKKworLyogUHJvdG9WZXJzaW9uIC0gUHJvdG9jb2wgVmVyc2lvbiAwOiAxLjIsIDE6MS4xLCAyOkRUTFMsIDM6R2VuZXJpYywKKyAqIDMtMTU6IFJlc2VydmVkLgorICovCisjZGVmaW5lIFNDTURfUFJPVE9fVkVSU0lPTl9TICAgIDI0CisjZGVmaW5lIFNDTURfUFJPVE9fVkVSU0lPTl9NICAgIDB4ZgorI2RlZmluZSBTQ01EX1BST1RPX1ZFUlNJT05fVih4KSAoKHgpIDw8IFNDTURfUFJPVE9fVkVSU0lPTl9TKQorI2RlZmluZSBTQ01EX1BST1RPX1ZFUlNJT05fRyh4KSBcCisJKCgoeCkgPj4gU0NNRF9QUk9UT19WRVJTSU9OX1MpICYgU0NNRF9QUk9UT19WRVJTSU9OX00pCisKKy8qIEVuY0RlY0N0cmwgLSBFbmNyeXB0aW9uL0RlY3J5cHRpb24gQ29udHJvbC4gMDogRW5jcnlwdCwgMTogRGVjcnlwdCAqLworI2RlZmluZSBTQ01EX0VOQ19ERUNfQ1RSTF9TICAgICAyMworI2RlZmluZSBTQ01EX0VOQ19ERUNfQ1RSTF9NICAgICAweDEKKyNkZWZpbmUgU0NNRF9FTkNfREVDX0NUUkxfVih4KSAgKCh4KSA8PCBTQ01EX0VOQ19ERUNfQ1RSTF9TKQorI2RlZmluZSBTQ01EX0VOQ19ERUNfQ1RSTF9HKHgpICBcCisJKCgoeCkgPj4gU0NNRF9FTkNfREVDX0NUUkxfUykgJiBTQ01EX0VOQ19ERUNfQ1RSTF9NKQorI2RlZmluZSBTQ01EX0VOQ19ERUNfQ1RSTF9GIFNDTURfRU5DX0RFQ19DVFJMX1YoMVUpCisKKy8qIENpcGhlckF1dGhTZXFDdHJsIC0gQ2lwaGVyIEF1dGhlbnRpY2F0aW9uIFNlcXVlbmNlIENvbnRyb2wuICovCisjZGVmaW5lIFNDTURfQ0lQSF9BVVRIX1NFUV9DVFJMX1MgICAgICAgMjIKKyNkZWZpbmUgU0NNRF9DSVBIX0FVVEhfU0VRX0NUUkxfTSAgICAgICAweDEKKyNkZWZpbmUgU0NNRF9DSVBIX0FVVEhfU0VRX0NUUkxfVih4KSAgICBcCisJKCh4KSA8PCBTQ01EX0NJUEhfQVVUSF9TRVFfQ1RSTF9TKQorI2RlZmluZSBTQ01EX0NJUEhfQVVUSF9TRVFfQ1RSTF9HKHgpICAgIFwKKwkoKCh4KSA+PiBTQ01EX0NJUEhfQVVUSF9TRVFfQ1RSTF9TKSAmIFNDTURfQ0lQSF9BVVRIX1NFUV9DVFJMX00pCisjZGVmaW5lIFNDTURfQ0lQSF9BVVRIX1NFUV9DVFJMX0YgICBTQ01EX0NJUEhfQVVUSF9TRVFfQ1RSTF9WKDFVKQorCisvKiBDaXBoTW9kZSAtICBDaXBoZXIgTW9kZS4gMDogTk9QLCAxOkFFUy1DQkMsIDI6QUVTLUdDTSwgMzpBRVMtQ1RSLAorICogNDpHZW5lcmljLUFFUywgNS0xNTogUmVzZXJ2ZWQuCisgKi8KKyNkZWZpbmUgU0NNRF9DSVBIX01PREVfUyAgICAxOAorI2RlZmluZSBTQ01EX0NJUEhfTU9ERV9NICAgIDB4ZgorI2RlZmluZSBTQ01EX0NJUEhfTU9ERV9WKHgpICgoeCkgPDwgU0NNRF9DSVBIX01PREVfUykKKyNkZWZpbmUgU0NNRF9DSVBIX01PREVfRyh4KSBcCisJKCgoeCkgPj4gU0NNRF9DSVBIX01PREVfUykgJiBTQ01EX0NJUEhfTU9ERV9NKQorCisvKiBBdXRoTW9kZSAtIEF1dGggTW9kZS4gMDogTk9QLCAxOlNIQTEsIDI6U0hBMi0yMjQsIDM6U0hBMi0yNTYKKyAqIDQtMTU6IFJlc2VydmVkCisgKi8KKyNkZWZpbmUgU0NNRF9BVVRIX01PREVfUyAgICAxNAorI2RlZmluZSBTQ01EX0FVVEhfTU9ERV9NICAgIDB4ZgorI2RlZmluZSBTQ01EX0FVVEhfTU9ERV9WKHgpICgoeCkgPDwgU0NNRF9BVVRIX01PREVfUykKKyNkZWZpbmUgU0NNRF9BVVRIX01PREVfRyh4KSBcCisJKCgoeCkgPj4gU0NNRF9BVVRIX01PREVfUykgJiBTQ01EX0FVVEhfTU9ERV9NKQorCisvKiBIbWFjQ3RybCAtIEhNQUMgQ29udHJvbC4gMDpOT1AsIDE6Tm8gdHJ1bmNhdGlvbiwgMjpTdXBwb3J0IEhNQUMgVHJ1bmNhdGlvbgorICogcGVyIFJGQyA0MzY2LCAzOklQU2VjIDk2IGJpdHMsIDQtNzpSZXNlcnZlZAorICovCisjZGVmaW5lIFNDTURfSE1BQ19DVFJMX1MgICAgMTEKKyNkZWZpbmUgU0NNRF9ITUFDX0NUUkxfTSAgICAweDcKKyNkZWZpbmUgU0NNRF9ITUFDX0NUUkxfVih4KSAoKHgpIDw8IFNDTURfSE1BQ19DVFJMX1MpCisjZGVmaW5lIFNDTURfSE1BQ19DVFJMX0coeCkgXAorCSgoKHgpID4+IFNDTURfSE1BQ19DVFJMX1MpICYgU0NNRF9ITUFDX0NUUkxfTSkKKworLyogSXZTaXplIC0gSVYgc2l6ZSBpbiB1bml0cyBvZiAyIGJ5dGVzICovCisjZGVmaW5lIFNDTURfSVZfU0laRV9TICA3CisjZGVmaW5lIFNDTURfSVZfU0laRV9NICAweGYKKyNkZWZpbmUgU0NNRF9JVl9TSVpFX1YoeCkgICAoKHgpIDw8IFNDTURfSVZfU0laRV9TKQorI2RlZmluZSBTQ01EX0lWX1NJWkVfRyh4KSAgIFwKKwkoKCh4KSA+PiBTQ01EX0lWX1NJWkVfUykgJiBTQ01EX0lWX1NJWkVfTSkKKworLyogTnVtSVZzIC0gTnVtYmVyIG9mIElWcyAqLworI2RlZmluZSBTQ01EX05VTV9JVlNfUyAgMAorI2RlZmluZSBTQ01EX05VTV9JVlNfTSAgMHg3ZgorI2RlZmluZSBTQ01EX05VTV9JVlNfVih4KSAgICgoeCkgPDwgU0NNRF9OVU1fSVZTX1MpCisjZGVmaW5lIFNDTURfTlVNX0lWU19HKHgpICAgXAorCSgoKHgpID4+IFNDTURfTlVNX0lWU19TKSAmIFNDTURfTlVNX0lWU19NKQorCisvKiBFbmJEYmdJZCAtIElmIHRoaXMgaXMgZW5hYmxlZCB1cHBlciAyMCAoNjM6NDQpIGJpdHMgaWYgU2VxTnVtYmVyCisgKiAoYmVsb3cpIGFyZSB1c2VkIGFzIENpZCAoY29ubmVjdGlvbiBpZCBmb3IgZGVidWcgc3RhdHVzKSwgdGhlc2UKKyAqIGJpdHMgYXJlIHBhZGRlZCB0byB6ZXJvIGZvciBmb3JtaW5nIHRoZSA2NCBiaXQKKyAqIHNlcXVlbmNlIG51bWJlciBmb3IgVExTCisgKi8KKyNkZWZpbmUgU0NNRF9FTkJfREJHSURfUyAgMzEKKyNkZWZpbmUgU0NNRF9FTkJfREJHSURfTSAgMHgxCisjZGVmaW5lIFNDTURfRU5CX0RCR0lEX1YoeCkgICAoKHgpIDw8IFNDTURfRU5CX0RCR0lEX1MpCisjZGVmaW5lIFNDTURfRU5CX0RCR0lEX0coeCkgICBcCisJKCgoeCkgPj4gU0NNRF9FTkJfREJHSURfUykgJiBTQ01EX0VOQl9EQkdJRF9NKQorCisvKiBJViBnZW5lcmF0aW9uIGluIFNXLiAqLworI2RlZmluZSBTQ01EX0lWX0dFTl9DVFJMX1MgICAgICAzMAorI2RlZmluZSBTQ01EX0lWX0dFTl9DVFJMX00gICAgICAweDEKKyNkZWZpbmUgU0NNRF9JVl9HRU5fQ1RSTF9WKHgpICAgKCh4KSA8PCBTQ01EX0lWX0dFTl9DVFJMX1MpCisjZGVmaW5lIFNDTURfSVZfR0VOX0NUUkxfRyh4KSAgIFwKKwkoKCh4KSA+PiBTQ01EX0lWX0dFTl9DVFJMX1MpICYgU0NNRF9JVl9HRU5fQ1RSTF9NKQorI2RlZmluZSBTQ01EX0lWX0dFTl9DVFJMX0YgIFNDTURfSVZfR0VOX0NUUkxfVigxVSkKKworLyogTW9yZSBmcmFncyAqLworI2RlZmluZSBTQ01EX01PUkVfRlJBR1NfUyAgIDIwCisjZGVmaW5lIFNDTURfTU9SRV9GUkFHU19NICAgMHgxCisjZGVmaW5lIFNDTURfTU9SRV9GUkFHU19WKHgpICAgICgoeCkgPDwgU0NNRF9NT1JFX0ZSQUdTX1MpCisjZGVmaW5lIFNDTURfTU9SRV9GUkFHU19HKHgpICAgICgoKHgpID4+IFNDTURfTU9SRV9GUkFHU19TKSAmIFNDTURfTU9SRV9GUkFHU19NKQorCisvKmxhc3QgZnJhZyAqLworI2RlZmluZSBTQ01EX0xBU1RfRlJBR19TICAgIDE5CisjZGVmaW5lIFNDTURfTEFTVF9GUkFHX00gICAgMHgxCisjZGVmaW5lIFNDTURfTEFTVF9GUkFHX1YoeCkgKCh4KSA8PCBTQ01EX0xBU1RfRlJBR19TKQorI2RlZmluZSBTQ01EX0xBU1RfRlJBR19HKHgpICgoKHgpID4+IFNDTURfTEFTVF9GUkFHX1MpICYgU0NNRF9MQVNUX0ZSQUdfTSkKKworLyogVGxzQ29tcFBkdSAqLworI2RlZmluZSBTQ01EX1RMU19DT01QUERVX1MgICAgMTgKKyNkZWZpbmUgU0NNRF9UTFNfQ09NUFBEVV9NICAgIDB4MQorI2RlZmluZSBTQ01EX1RMU19DT01QUERVX1YoeCkgKCh4KSA8PCBTQ01EX1RMU19DT01QUERVX1MpCisjZGVmaW5lIFNDTURfVExTX0NPTVBQRFVfRyh4KSAoKCh4KSA+PiBTQ01EX1RMU19DT01QUERVX1MpICYgU0NNRF9UTFNfQ09NUFBEVV9NKQorCisvKiBLZXlDbnR4dElubGluZSAtIEtleSBjb250ZXh0IGlubGluZSBhZnRlciB0aGUgc2NtZCAgT1IgUGF5bG9hZE9ubHkqLworI2RlZmluZSBTQ01EX0tFWV9DVFhfSU5MSU5FX1MgICAxNworI2RlZmluZSBTQ01EX0tFWV9DVFhfSU5MSU5FX00gICAweDEKKyNkZWZpbmUgU0NNRF9LRVlfQ1RYX0lOTElORV9WKHgpICAgICgoeCkgPDwgU0NNRF9LRVlfQ1RYX0lOTElORV9TKQorI2RlZmluZSBTQ01EX0tFWV9DVFhfSU5MSU5FX0coeCkgICAgXAorCSgoKHgpID4+IFNDTURfS0VZX0NUWF9JTkxJTkVfUykgJiBTQ01EX0tFWV9DVFhfSU5MSU5FX00pCisjZGVmaW5lIFNDTURfS0VZX0NUWF9JTkxJTkVfRiAgIFNDTURfS0VZX0NUWF9JTkxJTkVfVigxVSkKKworLyogVExTRnJhZ0VuYWJsZSAtIDA6IEhvc3QgY3JlYXRlZCBUTFMgUERVcywgMTogVExTIEZyYW1nbWVudGF0aW9uIGluIEFTSUMgKi8KKyNkZWZpbmUgU0NNRF9UTFNfRlJBR19FTkFCTEVfUyAgMTYKKyNkZWZpbmUgU0NNRF9UTFNfRlJBR19FTkFCTEVfTSAgMHgxCisjZGVmaW5lIFNDTURfVExTX0ZSQUdfRU5BQkxFX1YoeCkgICAoKHgpIDw8IFNDTURfVExTX0ZSQUdfRU5BQkxFX1MpCisjZGVmaW5lIFNDTURfVExTX0ZSQUdfRU5BQkxFX0coeCkgICBcCisJKCgoeCkgPj4gU0NNRF9UTFNfRlJBR19FTkFCTEVfUykgJiBTQ01EX1RMU19GUkFHX0VOQUJMRV9NKQorI2RlZmluZSBTQ01EX1RMU19GUkFHX0VOQUJMRV9GICBTQ01EX1RMU19GUkFHX0VOQUJMRV9WKDFVKQorCisvKiBNYWNPbmx5IC0gT25seSBzZW5kIHRoZSBNQUMgYW5kIGRpc2NhcmQgUERVLiBUaGlzIGlzIHZhbGlkIGZvciBoYXNoIG9ubHkKKyAqIG1vZGVzLCBpbiB0aGlzIGNhc2UgVExTX1RYICB3aWxsIGRyb3AgdGhlIFBEVSBhbmQgb25seQorICogc2VuZCBiYWNrIHRoZSBNQUMgYnl0ZXMuCisgKi8KKyNkZWZpbmUgU0NNRF9NQUNfT05MWV9TIDE1CisjZGVmaW5lIFNDTURfTUFDX09OTFlfTSAweDEKKyNkZWZpbmUgU0NNRF9NQUNfT05MWV9WKHgpICAoKHgpIDw8IFNDTURfTUFDX09OTFlfUykKKyNkZWZpbmUgU0NNRF9NQUNfT05MWV9HKHgpICBcCisJKCgoeCkgPj4gU0NNRF9NQUNfT05MWV9TKSAmIFNDTURfTUFDX09OTFlfTSkKKyNkZWZpbmUgU0NNRF9NQUNfT05MWV9GIFNDTURfTUFDX09OTFlfVigxVSkKKworLyogQWFkSVZEcm9wIC0gRHJvcCB0aGUgQUFEIGFuZCBJViBmaWVsZHMuIFVzZWZ1bCBpbiBwcm90b2NvbHMKKyAqIHdoaWNoIGhhdmUgY29tcGxleCBBQUQgYW5kIElWIGZvcm1hdGlvbnMgRWc6QUVTLUNDTQorICovCisjZGVmaW5lIFNDTURfQUFESVZEUk9QX1MgMTQKKyNkZWZpbmUgU0NNRF9BQURJVkRST1BfTSAweDEKKyNkZWZpbmUgU0NNRF9BQURJVkRST1BfVih4KSAgKCh4KSA8PCBTQ01EX0FBRElWRFJPUF9TKQorI2RlZmluZSBTQ01EX0FBRElWRFJPUF9HKHgpICBcCisJKCgoeCkgPj4gU0NNRF9BQURJVkRST1BfUykgJiBTQ01EX0FBRElWRFJPUF9NKQorI2RlZmluZSBTQ01EX0FBRElWRFJPUF9GIFNDTURfQUFESVZEUk9QX1YoMVUpCisKKy8qIEhkckxlbmd0aCAtIExlbmd0aCBvZiBhbGwgaGVhZGVycyBleGNsdWRpbmcgVExTIGhlYWRlcgorICogcHJlc2VudCBiZWZvcmUgc3RhcnQgb2YgY3J5cHRvIFBEVS9wYXlsb2FkLgorICovCisjZGVmaW5lIFNDTURfSERSX0xFTl9TICAwCisjZGVmaW5lIFNDTURfSERSX0xFTl9NICAweDNmZmYKKyNkZWZpbmUgU0NNRF9IRFJfTEVOX1YoeCkgICAoKHgpIDw8IFNDTURfSERSX0xFTl9TKQorI2RlZmluZSBTQ01EX0hEUl9MRU5fRyh4KSAgIFwKKwkoKCh4KSA+PiBTQ01EX0hEUl9MRU5fUykgJiBTQ01EX0hEUl9MRU5fTSkKKworc3RydWN0IGNwbF90eF9zZWNfcGR1IHsKKwlfX2JlMzIgb3BfaXZpbnNydG9mc3Q7CisJX19iZTMyIHBsZGxlbjsKKwlfX2JlMzIgYWFkc3RhcnRfY2lwaGVyc3RvcF9oaTsKKwlfX2JlMzIgY2lwaGVyc3RvcF9sb19hdXRoaW5zZXJ0OworCV9fYmUzMiBzZXFub19udW1pdnM7CisJX19iZTMyIGl2Z2VuX2hkcmxlbjsKKwlfX2JlNjQgc2NtZDE7Cit9OworCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX09QQ09ERV9TICAgICAyNAorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9PUENPREVfTSAgICAgMHhmZgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9PUENPREVfVih4KSAgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9PUENPREVfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfT1BDT0RFX0coeCkgIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9PUENPREVfUykgJiBDUExfVFhfU0VDX1BEVV9PUENPREVfTSkKKworLyogUlggQ2hhbm5lbCBJZCAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9SWENISURfUyAgMjIKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfUlhDSElEX00gIDB4MQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9SWENISURfVih4KSAgICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfUlhDSElEX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1JYQ0hJRF9HKHgpICAgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX1JYQ0hJRF9TKSAmIENQTF9UWF9TRUNfUERVX1JYQ0hJRF9NKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9SWENISURfRiAgQ1BMX1RYX1NFQ19QRFVfUlhDSElEX1YoMVUpCisKKy8qIEFjayBGb2xsb3dzICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FDS0ZPTExPV1NfUyAgMjEKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUNLRk9MTE9XU19NICAweDEKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUNLRk9MTE9XU19WKHgpICAgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9BQ0tGT0xMT1dTX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FDS0ZPTExPV1NfRyh4KSAgIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9BQ0tGT0xMT1dTX1MpICYgQ1BMX1RYX1NFQ19QRFVfQUNLRk9MTE9XU19NKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQ0tGT0xMT1dTX0YgIENQTF9UWF9TRUNfUERVX0FDS0ZPTExPV1NfVigxVSkKKworLyogTG9vcGJhY2sgYml0IGluIGNwbF90eF9zZWNfcGR1ICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1VMUFRYTFBCS19TICAyMAorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9VTFBUWExQQktfTSAgMHgxCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1VMUFRYTFBCS19WKHgpICAgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9VTFBUWExQQktfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfVUxQVFhMUEJLX0coeCkgICBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfVUxQVFhMUEJLX1MpICYgQ1BMX1RYX1NFQ19QRFVfVUxQVFhMUEJLX00pCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1VMUFRYTFBCS19GICBDUExfVFhfU0VDX1BEVV9VTFBUWExQQktfVigxVSkKKworLyogTGVuZ3RoIG9mIGNwbCBoZWFkZXIgZW5jYXBzdWxhdGVkICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NQTExFTl9TICAgICAxNgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DUExMRU5fTSAgICAgMHhmCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NQTExFTl9WKHgpICAoKHgpIDw8IENQTF9UWF9TRUNfUERVX0NQTExFTl9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DUExMRU5fRyh4KSAgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX0NQTExFTl9TKSAmIENQTF9UWF9TRUNfUERVX0NQTExFTl9NKQorCisvKiBQbGFjZUhvbGRlciAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9QTEFDRUhPTERFUl9TICAgIDEwCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1BMQUNFSE9MREVSX00gICAgMHgxCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX1BMQUNFSE9MREVSX1YoeCkgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9QTEFDRUhPTERFUl9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9QTEFDRUhPTERFUl9HKHgpIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9QTEFDRUhPTERFUl9TKSAmIFwKKwkgQ1BMX1RYX1NFQ19QRFVfUExBQ0VIT0xERVJfTSkKKworLyogSXZJbnNydE9mZnNldDogSW5zZXJ0aW9uIGxvY2F0aW9uIGZvciBJViAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9JVklOU1JUT0ZTVF9TICAgIDAKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfSVZJTlNSVE9GU1RfTSAgICAweDNmZgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9JVklOU1JUT0ZTVF9WKHgpICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfSVZJTlNSVE9GU1RfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfSVZJTlNSVE9GU1RfRyh4KSBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfSVZJTlNSVE9GU1RfUykgJiBcCisJIENQTF9UWF9TRUNfUERVX0lWSU5TUlRPRlNUX00pCisKKy8qIEFhZFN0YXJ0T2Zmc2V0OiBPZmZzZXQgaW4gYnl0ZXMgZm9yIEFBRCBzdGFydCBmcm9tCisgKiB0aGUgZmlyc3QgYnl0ZSBmb2xsb3dpbmcgdGhlIHBrdCBoZWFkZXJzICgwLTI1NSBieXRlcykKKyAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQURTVEFSVF9TICAgMjQKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUFEU1RBUlRfTSAgIDB4ZmYKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUFEU1RBUlRfVih4KSAgICAoKHgpIDw8IENQTF9UWF9TRUNfUERVX0FBRFNUQVJUX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FBRFNUQVJUX0coeCkgICAgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX0FBRFNUQVJUX1MpICYgXAorCSBDUExfVFhfU0VDX1BEVV9BQURTVEFSVF9NKQorCisvKiBBYWRTdG9wT2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgZm9yIEFBRCBzdG9wL2VuZCBmcm9tIHRoZSBmaXJzdCBieXRlIGZvbGxvd2luZworICogdGhlIHBrdCBoZWFkZXJzICgwLTUxMSBieXRlcykKKyAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BQURTVE9QX1MgICAgMTUKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUFEU1RPUF9NICAgIDB4MWZmCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FBRFNUT1BfVih4KSAoKHgpIDw8IENQTF9UWF9TRUNfUERVX0FBRFNUT1BfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQUFEU1RPUF9HKHgpIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9BQURTVE9QX1MpICYgQ1BMX1RYX1NFQ19QRFVfQUFEU1RPUF9NKQorCisvKiBDaXBoZXJTdGFydE9mZnNldDogb2Zmc2V0IGluIGJ5dGVzIGZvciBlbmNyeXB0aW9uL2RlY3J5cHRpb24gc3RhcnQgZnJvbSB0aGUKKyAqIGZpcnN0IGJ5dGUgZm9sbG93aW5nIHRoZSBwa3QgaGVhZGVycyAoMC0xMDIzIGJ5dGVzKQorICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUQVJUX1MgICAgNQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVEFSVF9NICAgIDB4M2ZmCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUQVJUX1YoeCkgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVEFSVF9TKQorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVEFSVF9HKHgpIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVEFSVF9TKSAmIFwKKwkgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RBUlRfTSkKKworLyogQ2lwaGVyU3RvcE9mZnNldDogb2Zmc2V0IGluIGJ5dGVzIGZvciBlbmNyeXB0aW9uL2RlY3J5cHRpb24gZW5kCisgKiBmcm9tIGVuZCBvZiB0aGUgcGF5bG9hZCBvZiB0aGlzIGNvbW1hbmQgKDAtNTExIGJ5dGVzKQorICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfSElfUyAgICAgIDAKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9ISV9NICAgICAgMHgxZgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0hJX1YoeCkgICBcCisJKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0hJX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfSElfRyh4KSAgIFwKKwkoKCh4KSA+PiBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0hJX1MpICYgXAorCSBDUExfVFhfU0VDX1BEVV9DSVBIRVJTVE9QX0hJX00pCisKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9MT19TICAgICAgMjgKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9MT19NICAgICAgMHhmCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfTE9fVih4KSAgIFwKKwkoKHgpIDw8IENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfTE9fUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQ0lQSEVSU1RPUF9MT19HKHgpICAgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfTE9fUykgJiBcCisJIENQTF9UWF9TRUNfUERVX0NJUEhFUlNUT1BfTE9fTSkKKworLyogQXV0aFN0YXJ0T2Zmc2V0OiBvZmZzZXQgaW4gYnl0ZXMgZm9yIGF1dGhlbnRpY2F0aW9uIHN0YXJ0IGZyb20KKyAqIHRoZSBmaXJzdCBieXRlIGZvbGxvd2luZyB0aGUgcGt0IGhlYWRlcnMgKDAtMTAyMykKKyAqLworI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRIU1RBUlRfUyAgMTgKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUQVJUX00gIDB4M2ZmCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhTVEFSVF9WKHgpICAgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9BVVRIU1RBUlRfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUQVJUX0coeCkgICBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfQVVUSFNUQVJUX1MpICYgXAorCSBDUExfVFhfU0VDX1BEVV9BVVRIU1RBUlRfTSkKKworLyogQXV0aFN0b3BPZmZzZXQ6IG9mZnNldCBpbiBieXRlcyBmb3IgYXV0aGVudGljYXRpb24KKyAqIGVuZCBmcm9tIGVuZCBvZiB0aGUgcGF5bG9hZCBvZiB0aGlzIGNvbW1hbmQgKDAtNTExIEJ5dGVzKQorICovCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhTVE9QX1MgICA5CisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhTVE9QX00gICAweDFmZgorI2RlZmluZSBDUExfVFhfU0VDX1BEVV9BVVRIU1RPUF9WKHgpICAgICgoeCkgPDwgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUT1BfUykKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSFNUT1BfRyh4KSAgICBcCisJKCgoeCkgPj4gQ1BMX1RYX1NFQ19QRFVfQVVUSFNUT1BfUykgJiBcCisJIENQTF9UWF9TRUNfUERVX0FVVEhTVE9QX00pCisKKy8qIEF1dGhJbnNydE9mZnNldDogb2Zmc2V0IGluIGJ5dGVzIGZvciBhdXRoZW50aWNhdGlvbiBpbnNlcnRpb24KKyAqIGZyb20gZW5kIG9mIHRoZSBwYXlsb2FkIG9mIHRoaXMgY29tbWFuZCAoMC01MTEgYnl0ZXMpCisgKi8KKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSElOU0VSVF9TIDAKKyNkZWZpbmUgQ1BMX1RYX1NFQ19QRFVfQVVUSElOU0VSVF9NIDB4MWZmCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhJTlNFUlRfVih4KSAgKCh4KSA8PCBDUExfVFhfU0VDX1BEVV9BVVRISU5TRVJUX1MpCisjZGVmaW5lIENQTF9UWF9TRUNfUERVX0FVVEhJTlNFUlRfRyh4KSAgXAorCSgoKHgpID4+IENQTF9UWF9TRUNfUERVX0FVVEhJTlNFUlRfUykgJiBcCisJIENQTF9UWF9TRUNfUERVX0FVVEhJTlNFUlRfTSkKKworc3RydWN0IGNwbF9yeF9waHlzX2RzZ2wgeworCV9fYmUzMiBvcF90b190aWQ7CisJX19iZTMyIHBjaXJseG9yZGVyX3RvX25vb2ZzZ2VudHI7CisJc3RydWN0IHJzc19oZWFkZXIgcnNzX2hkcl9pbnQ7Cit9OworCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfT1BDT0RFX1MgICAgICAgMjQKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9PUENPREVfTSAgICAgICAweGZmCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfT1BDT0RFX1YoeCkgICAgKCh4KSA8PCBDUExfUlhfUEhZU19EU0dMX09QQ09ERV9TKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX09QQ09ERV9HKHgpICAgIFwKKwkoKCh4KSA+PiBDUExfUlhfUEhZU19EU0dMX09QQ09ERV9TKSAmIENQTF9SWF9QSFlTX0RTR0xfT1BDT0RFX00pCisKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9JU1JETUFfUyAgICAgICAyMworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX0lTUkRNQV9NICAgICAgIDB4MQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX0lTUkRNQV9WKHgpICAgICgoeCkgPDwgQ1BMX1JYX1BIWVNfRFNHTF9JU1JETUFfUykKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9JU1JETUFfRyh4KSAgICBcCisJKCgoeCkgPj4gQ1BMX1JYX1BIWVNfRFNHTF9JU1JETUFfUykgJiBDUExfUlhfUEhZU19EU0dMX0lTUkRNQV9NKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX0lTUkRNQV9GICAgICAgIENQTF9SWF9QSFlTX0RTR0xfSVNSRE1BX1YoMVUpCisKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9SU1ZEMV9TICAgICAgICAyMAorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1JTVkQxX00gICAgICAgIDB4NworI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1JTVkQxX1YoeCkgICAgICgoeCkgPDwgQ1BMX1JYX1BIWVNfRFNHTF9SU1ZEMV9TKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1JTVkQxX0coeCkgICAgIFwKKwkoKCh4KSA+PiBDUExfUlhfUEhZU19EU0dMX1JTVkQxX1MpICYgXAorCSBDUExfUlhfUEhZU19EU0dMX1JTVkQxX00pCisKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lSTFhPUkRFUl9TICAgICAgICAgIDMxCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJUkxYT1JERVJfTSAgICAgICAgICAweDEKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lSTFhPUkRFUl9WKHgpICAgICAgIFwKKwkoKHgpIDw8IENQTF9SWF9QSFlTX0RTR0xfUENJUkxYT1JERVJfUykKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lSTFhPUkRFUl9HKHgpICAgICAgIFwKKwkoKCh4KSA+PiBDUExfUlhfUEhZU19EU0dMX1BDSVJMWE9SREVSX1MpICYgXAorCSBDUExfUlhfUEhZU19EU0dMX1BDSVJMWE9SREVSX00pCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJUkxYT1JERVJfRiAgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lSTFhPUkRFUl9WKDFVKQorCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJTk9TTk9PUF9TICAgICAgICAgICAzMAorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX1BDSU5PU05PT1BfTSAgICAgICAgICAgMHgxCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJTk9TTk9PUF9WKHgpICAgICAgICBcCisJKCh4KSA8PCBDUExfUlhfUEhZU19EU0dMX1BDSU5PU05PT1BfUykKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lOT1NOT09QX0coeCkgICAgICAgIFwKKwkoKCh4KSA+PiBDUExfUlhfUEhZU19EU0dMX1BDSU5PU05PT1BfUykgJiBcCisJIENQTF9SWF9QSFlTX0RTR0xfUENJTk9TTk9PUF9NKQorCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJTk9TTk9PUF9GICAgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lOT1NOT09QX1YoMVUpCisKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVEVOQl9TICAgICAgICAgIDI5CisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRFTkJfTSAgICAgICAgICAweDEKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVEVOQl9WKHgpICAgICAgIFwKKwkoKHgpIDw8IENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRFTkJfUykKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVEVOQl9HKHgpICAgICAgIFwKKwkoKCh4KSA+PiBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5URU5CX1MpICYgXAorCSBDUExfUlhfUEhZU19EU0dMX1BDSVRQSE5URU5CX00pCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRFTkJfRiAgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVEVOQl9WKDFVKQorCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRfUyAgICAgMjcKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVF9NICAgICAweDMKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVF9WKHgpICAoKHgpIDw8IENQTF9SWF9QSFlTX0RTR0xfUENJVFBITlRfUykKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVF9HKHgpICBcCisJKCgoeCkgPj4gQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVF9TKSAmIFwKKwkgQ1BMX1JYX1BIWVNfRFNHTF9QQ0lUUEhOVF9NKQorCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfRENBSURfUyAgICAgICAgMTYKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9EQ0FJRF9NICAgICAgICAweDdmZgorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX0RDQUlEX1YoeCkgICAgICgoeCkgPDwgQ1BMX1JYX1BIWVNfRFNHTF9EQ0FJRF9TKQorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX0RDQUlEX0coeCkgICAgIFwKKwkoKCh4KSA+PiBDUExfUlhfUEhZU19EU0dMX0RDQUlEX1MpICYgXAorCSBDUExfUlhfUEhZU19EU0dMX0RDQUlEX00pCisKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9OT09GU0dFTlRSX1MgICAgICAgICAgIDAKKyNkZWZpbmUgQ1BMX1JYX1BIWVNfRFNHTF9OT09GU0dFTlRSX00gICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBDUExfUlhfUEhZU19EU0dMX05PT0ZTR0VOVFJfVih4KSAgICAgICAgXAorCSgoeCkgPDwgQ1BMX1JYX1BIWVNfRFNHTF9OT09GU0dFTlRSX1MpCisjZGVmaW5lIENQTF9SWF9QSFlTX0RTR0xfTk9PRlNHRU5UUl9HKHgpICAgICAgICBcCisJKCgoeCkgPj4gQ1BMX1JYX1BIWVNfRFNHTF9OT09GU0dFTlRSX1MpICYgXAorCSBDUExfUlhfUEhZU19EU0dMX05PT0ZTR0VOVFJfTSkKKwogI2VuZGlmICAvKiBfX1Q0X01TR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0ZndfYXBpLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0ZndfYXBpLmgKaW5kZXggYTg5YjMwNy4uNGI1OGIzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NGZ3X2FwaS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRmd19hcGkuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOS0yMDE0IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMTAyLDYgKzEwMiw3IEBACiAJRldfUklfRlJfTlNNUl9XUiAgICAgICAgICAgICAgID0gMHgxOSwKIAlGV19SSV9JTlZfTFNUQUdfV1IgICAgICAgICAgICAgPSAweDFhLAogCUZXX0lTQ1NJX1RYX0RBVEFfV1IJICAgICAgID0gMHg0NSwKKwlGV19DUllQVE9fTE9PS0FTSURFX1dSICAgICAgICAgPSAwWDZkLAogCUZXX0xBU1RDMkVfV1IgICAgICAgICAgICAgICAgICA9IDB4NzAKIH07CiAKQEAgLTY4MCw2ICs2ODEsNyBAQAogCUZXX1JTU19JTkRfVEJMX0NNRCAgICAgICAgICAgICA9IDB4MjAsCiAJRldfUlNTX0dMQl9DT05GSUdfQ01EICAgICAgICAgID0gMHgyMiwKIAlGV19SU1NfVklfQ09ORklHX0NNRCAgICAgICAgICAgPSAweDIzLAorCUZXX1NDSEVEX0NNRCAgICAgICAgICAgICAgICAgICA9IDB4MjQsCiAJRldfREVWTE9HX0NNRCAgICAgICAgICAgICAgICAgID0gMHgyNSwKIAlGV19DTElQX0NNRCAgICAgICAgICAgICAgICAgICAgPSAweDI4LAogCUZXX0xBU1RDMkVfQ01EICAgICAgICAgICAgICAgICA9IDB4NDAsCkBAIC0xMDYwLDcgKzEwNjIsNyBAQAogCV9fYmUxNiBuaWNjYXBzOwogCV9fYmUxNiBvZmxkY2FwczsKIAlfX2JlMTYgcmRtYWNhcHM7Ci0JX19iZTE2IHI0OworCV9fYmUxNiBjcnlwdG9jYXBzOwogCV9fYmUxNiBpc2NzaWNhcHM7CiAJX19iZTE2IGZjb2VjYXBzOwogCV9fYmUzMiBjZmNzdW07CkBAIC0yMjY1LDYgKzIyNjcsMTIgQEAKIAlGV19QT1JUX0NBUF84MDJfM19BU01fRElSCT0gMHg4MDAwLAogfTsKIAorI2RlZmluZSBGV19QT1JUX0NBUF9TUEVFRF9TICAgICAwCisjZGVmaW5lIEZXX1BPUlRfQ0FQX1NQRUVEX00gICAgIDB4M2YKKyNkZWZpbmUgRldfUE9SVF9DQVBfU1BFRURfVih4KSAgKCh4KSA8PCBGV19QT1JUX0NBUF9TUEVFRF9TKQorI2RlZmluZSBGV19QT1JUX0NBUF9TUEVFRF9HKHgpIFwKKwkoKCh4KSA+PiBGV19QT1JUX0NBUF9TUEVFRF9TKSAmIEZXX1BPUlRfQ0FQX1NQRUVEX00pCisKIGVudW0gZndfcG9ydF9tZGkgewogCUZXX1BPUlRfQ0FQX01ESV9VTkNIQU5HRUQsCiAJRldfUE9SVF9DQVBfTURJX0FVVE8sCkBAIC0yOTYxLDYgKzI5NjksNDEgQEAKICNkZWZpbmUgRldfUlNTX1ZJX0NPTkZJR19DTURfVURQRU5fVih4KQkoKHgpIDw8IEZXX1JTU19WSV9DT05GSUdfQ01EX1VEUEVOX1MpCiAjZGVmaW5lIEZXX1JTU19WSV9DT05GSUdfQ01EX1VEUEVOX0YJRldfUlNTX1ZJX0NPTkZJR19DTURfVURQRU5fVigxVSkKIAorZW51bSBmd19zY2hlZF9zYyB7CisJRldfU0NIRURfU0NfUEFSQU1TCQk9IDEsCit9OworCitzdHJ1Y3QgZndfc2NoZWRfY21kIHsKKwlfX2JlMzIgb3BfdG9fd3JpdGU7CisJX19iZTMyIHJldHZhbF9sZW4xNjsKKwl1bmlvbiBmd19zY2hlZCB7CisJCXN0cnVjdCBmd19zY2hlZF9jb25maWcgeworCQkJX191OCAgIHNjOworCQkJX191OCAgIHR5cGU7CisJCQlfX3U4ICAgbWlubWF4ZW47CisJCQlfX3U4ICAgcjNbNV07CisJCQlfX3U4ICAgbmNsYXNzZXNbNF07CisJCQlfX2JlMzIgcjQ7CisJCX0gY29uZmlnOworCQlzdHJ1Y3QgZndfc2NoZWRfcGFyYW1zIHsKKwkJCV9fdTggICBzYzsKKwkJCV9fdTggICB0eXBlOworCQkJX191OCAgIGxldmVsOworCQkJX191OCAgIG1vZGU7CisJCQlfX3U4ICAgdW5pdDsKKwkJCV9fdTggICByYXRlOworCQkJX191OCAgIGNoOworCQkJX191OCAgIGNsOworCQkJX19iZTMyIG1pbjsKKwkJCV9fYmUzMiBtYXg7CisJCQlfX2JlMTYgd2VpZ2h0OworCQkJX19iZTE2IHBrdHNpemU7CisJCQlfX2JlMTYgYnVyc3RzaXplOworCQkJX19iZTE2IHI0OworCQl9IHBhcmFtczsKKwl9IHU7Cit9OworCiBzdHJ1Y3QgZndfY2xpcF9jbWQgewogCV9fYmUzMiBvcF90b193cml0ZTsKIAlfX2JlMzIgYWxsb2NfdG9fbGVuMTY7CkBAIC0zMjQ5LDQgKzMyOTIsMTI3IEBACiAjZGVmaW5lIFBDSUVfRldfUEZfREVWTE9HX01FTVRZUEVfRyh4KSBcCiAJKCgoeCkgPj4gUENJRV9GV19QRl9ERVZMT0dfTUVNVFlQRV9TKSAmIFBDSUVfRldfUEZfREVWTE9HX01FTVRZUEVfTSkKIAorI2RlZmluZSBNQVhfSU1NX09GTERfVFhfREFUQV9XUl9MRU4gKDB4ZmYgKyBzaXplb2Yoc3RydWN0IGZ3X29mbGRfdHhfZGF0YV93cikpCisKK3N0cnVjdCBmd19jcnlwdG9fbG9va2FzaWRlX3dyIHsKKwlfX2JlMzIgb3BfdG9fY2N0eF9zaXplOworCV9fYmUzMiBsZW4xNl9wa2Q7CisJX19iZTMyIHNlc3Npb25faWQ7CisJX19iZTMyIHJ4X2NoaWRfdG9fcnhfcV9pZDsKKwlfX2JlMzIga2V5X2FkZHI7CisJX19iZTMyIHBsZF9zaXplX2hhc2hfc2l6ZTsKKwlfX2JlNjQgY29va2llOworfTsKKworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX09QQ09ERV9TIDI0CisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfT1BDT0RFX00gMHhmZgorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX09QQ09ERV9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfT1BDT0RFX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfT1BDT0RFX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfT1BDT0RFX1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX09QQ09ERV9NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ09NUExfUyAyMworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NPTVBMX00gMHgxCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ09NUExfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NPTVBMX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ09NUExfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DT01QTF9TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DT01QTF9NKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NPTVBMX0YgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DT01QTF9WKDFVKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSU1NX0xFTl9TIDE1CisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSU1NX0xFTl9NIDB4ZmYKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JTU1fTEVOX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JTU1fTEVOX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSU1NX0xFTl9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lNTV9MRU5fUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSU1NX0xFTl9NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9MT0NfUyA1CisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9MT0NfTSAweDMKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX0xPQ19WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9MT0NfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX0xPQ19HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfTE9DX1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfTE9DX00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9DQ1RYX1NJWkVfUyAwCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9TSVpFX00gMHgxZgorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfU0laRV9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9TSVpFX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9TSVpFX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfQ0NUWF9TSVpFX1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0NDVFhfU0laRV9NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfTEVOMTZfUyAwCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfTEVOMTZfTSAweGZmCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfTEVOMTZfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xFTjE2X1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfTEVOMTZfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MRU4xNl9TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MRU4xNl9NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfQ0hJRF9TIDI5CisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfQ0hJRF9NIDB4MworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX0NISURfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX0NISURfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9DSElEX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfQ0hJRF9TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9DSElEX00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MQ0JfUyAgMjcKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MQ0JfTSAgMHgzCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfTENCX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MQ0JfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MQ0JfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9MQ0JfUykgJiBGV19DUllQVE9fTE9PS0FTSURFX1dSX0xDQl9NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUEhBU0hfUyAyNQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BIQVNIX00gMHgzCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUEhBU0hfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BIQVNIX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUEhBU0hfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QSEFTSF9TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QSEFTSF9NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSVZfUyAgIDIzCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSVZfTSAgIDB4MworI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lWX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9JVl9TKQorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lWX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfSVZfUykgJiBGV19DUllQVE9fTE9PS0FTSURFX1dSX0lWX00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9UWF9DSF9TIDEwCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfVFhfQ0hfTSAweDMKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9UWF9DSF9WKHgpIFwKKwkoKHgpIDw8IEZXX0NSWVBUT19MT09LQVNJREVfV1JfVFhfQ0hfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9UWF9DSF9HKHgpIFwKKwkoKCh4KSA+PiBGV19DUllQVE9fTE9PS0FTSURFX1dSX1RYX0NIX1MpICYgXAorCSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1RYX0NIX00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9RX0lEX1MgMAorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX1FfSURfTSAweDNmZgorI2RlZmluZSBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX1FfSURfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX1JYX1FfSURfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9RX0lEX0coeCkgXAorCSgoKHgpID4+IEZXX0NSWVBUT19MT09LQVNJREVfV1JfUlhfUV9JRF9TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9SWF9RX0lEX00pCisKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QTERfU0laRV9TIDI0CisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUExEX1NJWkVfTSAweGZmCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUExEX1NJWkVfVih4KSBcCisJKCh4KSA8PCBGV19DUllQVE9fTE9PS0FTSURFX1dSX1BMRF9TSVpFX1MpCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfUExEX1NJWkVfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QTERfU0laRV9TKSAmIFwKKwkgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9QTERfU0laRV9NKQorCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSEFTSF9TSVpFX1MgMTcKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9IQVNIX1NJWkVfTSAweDdmCisjZGVmaW5lIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSEFTSF9TSVpFX1YoeCkgXAorCSgoeCkgPDwgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9IQVNIX1NJWkVfUykKKyNkZWZpbmUgRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9IQVNIX1NJWkVfRyh4KSBcCisJKCgoeCkgPj4gRldfQ1JZUFRPX0xPT0tBU0lERV9XUl9IQVNIX1NJWkVfUykgJiBcCisJIEZXX0NSWVBUT19MT09LQVNJREVfV1JfSEFTSF9TSVpFX00pCisKICNlbmRpZiAvKiBfVDRGV19JTlRFUkZBQ0VfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9jeGdiNHZmX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9jeGdiNHZmX21haW4uYwppbmRleCBlMTE2YmI4Li4xMDBiMmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvY3hnYjR2Zl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jCkBAIC0yMzc4LDcgKzIzNzgsNyBAQAogCSAqLwogCXBtYXNrX25wb3J0cyA9IGh3ZWlnaHQzMihhZGFwdGVyLT5wYXJhbXMudmZyZXMucG1hc2spOwogCWlmIChwbWFza19ucG9ydHMgPCBhZGFwdGVyLT5wYXJhbXMubnBvcnRzKSB7Ci0JCWRldl93YXJuKGFkYXB0ZXItPnBkZXZfZGV2LCAib25seSB1c2luZyAlZCBvZiAlZCBwcm92aXNzaW9uZWQiCisJCWRldl93YXJuKGFkYXB0ZXItPnBkZXZfZGV2LCAib25seSB1c2luZyAlZCBvZiAlZCBwcm92aXNpb25lZCIKIAkJCSAiIHZpcnR1YWwgaW50ZXJmYWNlczsgbGltaXRlZCBieSBQb3J0IEFjY2VzcyBSaWdodHMiCiAJCQkgIiBtYXNrICUjeFxuIiwgcG1hc2tfbnBvcnRzLCBhZGFwdGVyLT5wYXJhbXMubnBvcnRzLAogCQkJIGFkYXB0ZXItPnBhcmFtcy52ZnJlcy5wbWFzayk7CkBAIC0yNzc3LDYgKzI3NzcsNyBAQAogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyOwogCXN0cnVjdCBwb3J0X2luZm8gKnBpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJdW5zaWduZWQgaW50IHBmOwogCiAJLyoKIAkgKiBQcmludCBvdXIgZHJpdmVyIGJhbm5lciB0aGUgZmlyc3QgdGltZSB3ZSdyZSBjYWxsZWQgdG8gaW5pdGlhbGl6ZSBhCkBAIC0yOTAzLDggKzI5MDQsMTEgQEAKIAkgKiBBbGxvY2F0ZSBvdXIgImFkYXB0ZXIgcG9ydHMiIGFuZCBzdGl0Y2ggZXZlcnl0aGluZyB0b2dldGhlci4KIAkgKi8KIAlwbWFzayA9IGFkYXB0ZXItPnBhcmFtcy52ZnJlcy5wbWFzazsKKwlwZiA9IHQ0dmZfZ2V0X3BmX2Zyb21fdmYoYWRhcHRlcik7CiAJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBwaWR4KSB7CiAJCWludCBwb3J0X2lkLCB2aWlkOworCQl1OCBtYWNbRVRIX0FMRU5dOworCQl1bnNpZ25lZCBpbnQgbmFkZHIgPSAxOwogCiAJCS8qCiAJCSAqIFdlIHNpbXBsaXN0aWNhbGx5IGFsbG9jYXRlIG91ciB2aXJ0dWFsIGludGVyZmFjZXMKQEAgLTI5NzUsNiArMjk3OSwyNiBAQAogCQkJCXBpZHgpOwogCQkJZ290byBlcnJfZnJlZV9kZXY7CiAJCX0KKworCQllcnIgPSB0NHZmX2dldF92Zl9tYWNfYWNsKGFkYXB0ZXIsIHBmLCAmbmFkZHIsIG1hYyk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkidW5hYmxlIHRvIGRldGVybWluZSBNQUMgQUNMIGFkZHJlc3MsICIKKwkJCQkiY29udGludWluZyBhbnl3YXkuLiAoc3RhdHVzICVkKVxuIiwgZXJyKTsKKwkJfSBlbHNlIGlmIChuYWRkciAmJiBhZGFwdGVyLT5wYXJhbXMudmZyZXMubnZpID09IDEpIHsKKwkJCXN0cnVjdCBzb2NrYWRkciBhZGRyOworCisJCQlldGhlcl9hZGRyX2NvcHkoYWRkci5zYV9kYXRhLCBtYWMpOworCQkJZXJyID0gY3hnYjR2Zl9zZXRfbWFjX2FkZHIobmV0ZGV2LCAmYWRkcik7CisJCQlpZiAoZXJyKSB7CisJCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCQkidW5hYmxlIHRvIHNldCBNQUMgYWRkcmVzcyAlcE1cbiIsCisJCQkJCW1hYyk7CisJCQkJZ290byBlcnJfZnJlZV9kZXY7CisJCQl9CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJCSAiVXNpbmcgYXNzaWduZWQgTUFDIEFDTDogJXBNXG4iLCBtYWMpOworCQl9CiAJfQogCiAJLyogU2VlIHdoYXQgaW50ZXJydXB0cyB3ZSdsbCBiZSB1c2luZy4gIElmIHdlJ3ZlIGJlZW4gY29uZmlndXJlZCB0bwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3NnZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3NnZS5jCmluZGV4IGM4ZmQ0ZjguLmYzZWQ5Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvc2dlLmMKQEAgLTE2NDgsMTQgKzE2NDgsMTUgQEAKIAogCWlmIChjc3VtX29rICYmICFwa3QtPmVycl92ZWMgJiYKIAkgICAgKGJlMzJfdG9fY3B1KHBrdC0+bDJpbmZvKSAmIChSWEZfVURQX0YgfCBSWEZfVENQX0YpKSkgewotCQlpZiAoIXBrdC0+aXBfZnJhZykKKwkJaWYgKCFwa3QtPmlwX2ZyYWcpIHsKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7Ci0JCWVsc2UgeworCQkJcnhxLT5zdGF0cy5yeF9jc28rKzsKKwkJfSBlbHNlIGlmIChwa3QtPmwyaW5mbyAmIGh0b25sKFJYRl9JUF9GKSkgewogCQkJX19zdW0xNiBjID0gKF9fZm9yY2UgX19zdW0xNilwa3QtPmNzdW07CiAJCQlza2ItPmNzdW0gPSBjc3VtX3VuZm9sZChjKTsKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fQ09NUExFVEU7CisJCQlyeHEtPnN0YXRzLnJ4X2NzbysrOwogCQl9Ci0JCXJ4cS0+c3RhdHMucnhfY3NvKys7CiAJfSBlbHNlCiAJCXNrYl9jaGVja3N1bV9ub25lX2Fzc2VydChza2IpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvdDR2Zl9jb21tb24uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi90NHZmX2NvbW1vbi5oCmluZGV4IDhlZTU0MTQuLmIzOTAzZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi90NHZmX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi90NHZmX2NvbW1vbi5oCkBAIC0xMDgsOCArMTA4LDggQEAKIAl1bnNpZ25lZCBpbnQgICBzdXBwb3J0ZWQ7ICAgICAgICAvKiBsaW5rIGNhcGFiaWxpdGllcyAqLwogCXVuc2lnbmVkIGludCAgIGFkdmVydGlzaW5nOyAgICAgIC8qIGFkdmVydGlzZWQgY2FwYWJpbGl0aWVzICovCiAJdW5zaWduZWQgc2hvcnQgbHBfYWR2ZXJ0aXNpbmc7ICAgLyogcGVlciBhZHZlcnRpc2VkIGNhcGFiaWxpdGllcyAqLwotCXVuc2lnbmVkIHNob3J0IHJlcXVlc3RlZF9zcGVlZDsgIC8qIHNwZWVkIHVzZXIgaGFzIHJlcXVlc3RlZCAqLwotCXVuc2lnbmVkIHNob3J0IHNwZWVkOyAgICAgICAgICAgIC8qIGFjdHVhbCBsaW5rIHNwZWVkICovCisJdW5zaWduZWQgaW50ICAgcmVxdWVzdGVkX3NwZWVkOyAgLyogc3BlZWQgdXNlciBoYXMgcmVxdWVzdGVkICovCisJdW5zaWduZWQgaW50ICAgc3BlZWQ7ICAgICAgICAgICAgLyogYWN0dWFsIGxpbmsgc3BlZWQgKi8KIAl1bnNpZ25lZCBjaGFyICByZXF1ZXN0ZWRfZmM7ICAgICAvKiBmbG93IGNvbnRyb2wgdXNlciBoYXMgcmVxdWVzdGVkICovCiAJdW5zaWduZWQgY2hhciAgZmM7ICAgICAgICAgICAgICAgLyogYWN0dWFsIGxpbmsgZmxvdyBjb250cm9sICovCiAJdW5zaWduZWQgY2hhciAgYXV0b25lZzsgICAgICAgICAgLyogYXV0b25lZ290aWF0aW5nPyAqLwpAQCAtMjcxLDEwICsyNzEsMTcgQEAKIAlyZXR1cm4gKGxjLT5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9TUEVFRF8xMEcpICE9IDA7CiB9CiAKKy8qIFJldHVybiB0cnVlIGlmIHRoZSBMaW5rIENvbmZpZ3VyYXRpb24gc3VwcG9ydHMgIkhpZ2ggU3BlZWRzIiAodGhvc2UgZ3JlYXRlcgorICogdGhhbiAxR2IvcykuCisgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBpc194XzEwZ19wb3J0KGNvbnN0IHN0cnVjdCBsaW5rX2NvbmZpZyAqbGMpCiB7Ci0JcmV0dXJuIChsYy0+c3VwcG9ydGVkICYgRldfUE9SVF9DQVBfU1BFRURfMTBHKSAhPSAwIHx8Ci0JCShsYy0+c3VwcG9ydGVkICYgRldfUE9SVF9DQVBfU1BFRURfNDBHKSAhPSAwOworCXVuc2lnbmVkIGludCBzcGVlZHMsIGhpZ2hfc3BlZWRzOworCisJc3BlZWRzID0gRldfUE9SVF9DQVBfU1BFRURfVihGV19QT1JUX0NBUF9TUEVFRF9HKGxjLT5zdXBwb3J0ZWQpKTsKKwloaWdoX3NwZWVkcyA9IHNwZWVkcyAmIH4oRldfUE9SVF9DQVBfU1BFRURfMTAwTSB8IEZXX1BPUlRfQ0FQX1NQRUVEXzFHKTsKKworCXJldHVybiBoaWdoX3NwZWVkcyAhPSAwOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjb3JlX3RpY2tzX3Blcl91c2VjKGNvbnN0IHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQpAQCAtMzQ3LDYgKzM1NCw3IEBACiAJCQl1NjQgKnBiYXIyX3FvZmZzZXQsCiAJCQl1bnNpZ25lZCBpbnQgKnBiYXIyX3FpZCk7CiAKK3Vuc2lnbmVkIGludCB0NHZmX2dldF9wZl9mcm9tX3ZmKHN0cnVjdCBhZGFwdGVyICopOwogaW50IHQ0dmZfZ2V0X3NnZV9wYXJhbXMoc3RydWN0IGFkYXB0ZXIgKik7CiBpbnQgdDR2Zl9nZXRfdnBkX3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqKTsKIGludCB0NHZmX2dldF9kZXZfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICopOwpAQCAtMzgxLDUgKzM4OSw3IEBACiAKIGludCB0NHZmX2hhbmRsZV9md19ycGwoc3RydWN0IGFkYXB0ZXIgKiwgY29uc3QgX19iZTY0ICopOwogaW50IHQ0dmZfcHJlcF9hZGFwdGVyKHN0cnVjdCBhZGFwdGVyICopOworaW50IHQ0dmZfZ2V0X3ZmX21hY19hY2woc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBwZiwKKwkJCXVuc2lnbmVkIGludCAqbmFkZHIsIHU4ICphZGRyKTsKIAogI2VuZGlmIC8qIF9fVDRWRl9DT01NT05fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvdDR2Zl9ody5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3Q0dmZfaHcuYwppbmRleCA0MjdiZmE3Li5lOTgyNDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvdDR2Zl9ody5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi90NHZmX2h3LmMKQEAgLTMxNCw4ICszMTQsOSBAQAogfQogCiAjZGVmaW5lIEFEVkVSVF9NQVNLIChGV19QT1JUX0NBUF9TUEVFRF8xMDBNIHwgRldfUE9SVF9DQVBfU1BFRURfMUcgfFwKLQkJICAgICBGV19QT1JUX0NBUF9TUEVFRF8xMEcgfCBGV19QT1JUX0NBUF9TUEVFRF80MEcgfCBcCi0JCSAgICAgRldfUE9SVF9DQVBfU1BFRURfMTAwRyB8IEZXX1BPUlRfQ0FQX0FORUcpCisJCSAgICAgRldfUE9SVF9DQVBfU1BFRURfMTBHIHwgRldfUE9SVF9DQVBfU1BFRURfMjVHIHwgXAorCQkgICAgIEZXX1BPUlRfQ0FQX1NQRUVEXzQwRyB8IEZXX1BPUlRfQ0FQX1NQRUVEXzEwMEcgfCBcCisJCSAgICAgRldfUE9SVF9DQVBfQU5FRykKIAogLyoqCiAgKglpbml0X2xpbmtfY29uZmlnIC0gaW5pdGlhbGl6ZSBhIGxpbmsncyBTVyBzdGF0ZQpAQCAtNjM5LDYgKzY0MCwxNSBAQAogCXJldHVybiAwOwogfQogCit1bnNpZ25lZCBpbnQgdDR2Zl9nZXRfcGZfZnJvbV92ZihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgd2hvYW1pOworCisJd2hvYW1pID0gdDRfcmVhZF9yZWcoYWRhcHRlciwgVDRWRl9QTF9CQVNFX0FERFIgKyBQTF9WRl9XSE9BTUlfQSk7CisJcmV0dXJuIChDSEVMU0lPX0NISVBfVkVSU0lPTihhZGFwdGVyLT5wYXJhbXMuY2hpcCkgPD0gQ0hFTFNJT19UNSA/CisJCQlTT1VSQ0VQRl9HKHdob2FtaSkgOiBUNl9TT1VSQ0VQRl9HKHdob2FtaSkpOworfQorCiAvKioKICAqCXQ0dmZfZ2V0X3NnZV9wYXJhbXMgLSByZXRyaWV2ZSBhZGFwdGVyIFNjYXR0ZXIgZ2F0aGVyIEVuZ2luZSBwYXJhbWV0ZXJzCiAgKglAYWRhcHRlcjogdGhlIGFkYXB0ZXIKQEAgLTcxNiw3ICs3MjYsNiBAQAogCSAqIHJlYWQuCiAJICovCiAJaWYgKCFpc190NChhZGFwdGVyLT5wYXJhbXMuY2hpcCkpIHsKLQkJdTMyIHdob2FtaTsKIAkJdW5zaWduZWQgaW50IHBmLCBzX2hwcywgc19xcHA7CiAKIAkJcGFyYW1zWzBdID0gKEZXX1BBUkFNU19NTkVNX1YoRldfUEFSQU1TX01ORU1fUkVHKSB8CkBAIC03NDAsMTEgKzc0OSw3IEBACiAJCSAqIHJlZ2lzdGVyIHdlIGp1c3QgcmVhZC4gRG8gaXQgb25jZSBoZXJlIHNvIG90aGVyIGNvZGUgaW4KIAkJICogdGhlIGRyaXZlciBjYW4ganVzdCB1c2UgaXQuCiAJCSAqLwotCQl3aG9hbWkgPSB0NF9yZWFkX3JlZyhhZGFwdGVyLAotCQkJCSAgICAgVDRWRl9QTF9CQVNFX0FERFIgKyBQTF9WRl9XSE9BTUlfQSk7Ci0JCXBmID0gQ0hFTFNJT19DSElQX1ZFUlNJT04oYWRhcHRlci0+cGFyYW1zLmNoaXApIDw9IENIRUxTSU9fVDUgPwotCQkJU09VUkNFUEZfRyh3aG9hbWkpIDogVDZfU09VUkNFUEZfRyh3aG9hbWkpOwotCisJCXBmID0gdDR2Zl9nZXRfcGZfZnJvbV92ZihhZGFwdGVyKTsKIAkJc19ocHMgPSAoSE9TVFBBR0VTSVpFUEYwX1MgKwogCQkJIChIT1NUUEFHRVNJWkVQRjFfUyAtIEhPU1RQQUdFU0laRVBGMF9TKSAqIHBmKTsKIAkJc2dlX3BhcmFtcy0+c2dlX3ZmX2hwcyA9CkBAIC0xNzEyLDggKzE3MTcsMTIgQEAKIAkJCXNwZWVkID0gMTAwMDsKIAkJZWxzZSBpZiAoc3RhdCAmIEZXX1BPUlRfQ01EX0xTUEVFRF9WKEZXX1BPUlRfQ0FQX1NQRUVEXzEwRykpCiAJCQlzcGVlZCA9IDEwMDAwOworCQllbHNlIGlmIChzdGF0ICYgRldfUE9SVF9DTURfTFNQRUVEX1YoRldfUE9SVF9DQVBfU1BFRURfMjVHKSkKKwkJCXNwZWVkID0gMjUwMDA7CiAJCWVsc2UgaWYgKHN0YXQgJiBGV19QT1JUX0NNRF9MU1BFRURfVihGV19QT1JUX0NBUF9TUEVFRF80MEcpKQogCQkJc3BlZWQgPSA0MDAwMDsKKwkJZWxzZSBpZiAoc3RhdCAmIEZXX1BPUlRfQ01EX0xTUEVFRF9WKEZXX1BPUlRfQ0FQX1NQRUVEXzEwMEcpKQorCQkJc3BlZWQgPSAxMDAwMDA7CiAKIAkJLyoKIAkJICogU2NhbiBhbGwgb2Ygb3VyICJwb3J0cyIgKFZpcnR1YWwgSW50ZXJmYWNlcykgbG9va2luZyBmb3IKQEAgLTE4MDcsMyArMTgxNiw1MCBAQAogCiAJcmV0dXJuIDA7CiB9CisKKy8qKgorICoJdDR2Zl9nZXRfdmZfbWFjX2FjbCAtIEdldCB0aGUgTUFDIGFkZHJlc3MgdG8gYmUgc2V0IHRvCisgKgkJCSAgICAgIHRoZSBWSSBvZiB0aGlzIFZGLgorICoJQGFkYXB0ZXI6IFRoZSBhZGFwdGVyCisgKglAcGY6IFRoZSBwZiBhc3NvY2lhdGVkIHdpdGggdmYKKyAqCUBuYWRkcjogdGhlIG51bWJlciBvZiBBQ0wgTUFDIGFkZHJlc3NlcyByZXR1cm5lZCBpbiBhZGRyCisgKglAYWRkcjogUGxhY2Vob2xkZXIgZm9yIE1BQyBhZGRyZXNzZXMKKyAqCisgKglGaW5kIHRoZSBNQUMgYWRkcmVzcyB0byBiZSBzZXQgdG8gdGhlIFZGJ3MgVkkuIFRoZSByZXF1ZXN0ZWQgTUFDIGFkZHJlc3MKKyAqCWlzIGZyb20gdGhlIGhvc3QgT1MgdmlhIGNhbGxiYWNrIGluIHRoZSBQRiBkcml2ZXIuCisgKi8KK2ludCB0NHZmX2dldF92Zl9tYWNfYWNsKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgcGYsCisJCQl1bnNpZ25lZCBpbnQgKm5hZGRyLCB1OCAqYWRkcikKK3sKKwlzdHJ1Y3QgZndfYWNsX21hY19jbWQgY21kOworCWludCByZXQ7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWNtZC5vcF90b192Zm4gPSBjcHVfdG9fYmUzMihGV19DTURfT1BfVihGV19BQ0xfTUFDX0NNRCkgfAorCQkJCSAgICBGV19DTURfUkVRVUVTVF9GIHwKKwkJCQkgICAgRldfQ01EX1JFQURfRik7CisJY21kLmVuX3RvX2xlbjE2ID0gY3B1X3RvX2JlMzIoKHVuc2lnbmVkIGludClGV19MRU4xNihjbWQpKTsKKwlyZXQgPSB0NHZmX3dyX21ib3goYWRhcHRlciwgJmNtZCwgc2l6ZW9mKGNtZCksICZjbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoY21kLm5tYWMgPCAqbmFkZHIpCisJCSpuYWRkciA9IGNtZC5ubWFjOworCisJc3dpdGNoIChwZikgeworCWNhc2UgMzoKKwkJbWVtY3B5KGFkZHIsIGNtZC5tYWNhZGRyMywgc2l6ZW9mKGNtZC5tYWNhZGRyMykpOworCQlicmVhazsKKwljYXNlIDI6CisJCW1lbWNweShhZGRyLCBjbWQubWFjYWRkcjIsIHNpemVvZihjbWQubWFjYWRkcjIpKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltZW1jcHkoYWRkciwgY21kLm1hY2FkZHIxLCBzaXplb2YoY21kLm1hY2FkZHIxKSk7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJbWVtY3B5KGFkZHIsIGNtZC5tYWNhZGRyMCwgc2l6ZW9mKGNtZC5tYWNhZGRyMCkpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9saWJjeGdiL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9saWJjeGdiL01ha2VmaWxlCmluZGV4IDIzNjIyMzAuLjI1MzRlMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2xpYmN4Z2IvTWFrZWZpbGUKQEAgLTEsMyArMSw1IEBACitjY2ZsYWdzLXkgOj0gLUlkcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0CisKIG9iai0kKENPTkZJR19DSEVMU0lPX0xJQikgKz0gbGliY3hnYi5vCiAKLWxpYmN4Z2IteSA6PSBsaWJjeGdiX3BwbS5vCitsaWJjeGdiLXkgOj0gbGliY3hnYl9wcG0ubyBsaWJjeGdiX2NtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYi9saWJjeGdiX2NtLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2xpYmN4Z2IvbGliY3hnYl9jbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMGRlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2xpYmN4Z2IvbGliY3hnYl9jbS5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENoZWxzaW8gQ29tbXVuaWNhdGlvbnMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqCSAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqCSAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICoJICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICoJICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqCSAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CisKKyNpbmNsdWRlICJsaWJjeGdiX2NtLmgiCisKK3ZvaWQKK2N4Z2JfZ2V0XzR0dXBsZShzdHJ1Y3QgY3BsX3Bhc3NfYWNjZXB0X3JlcSAqcmVxLCBlbnVtIGNoaXBfdHlwZSB0eXBlLAorCQlpbnQgKmlwdHlwZSwgX191OCAqbG9jYWxfaXAsIF9fdTggKnBlZXJfaXAsCisJCV9fYmUxNiAqbG9jYWxfcG9ydCwgX19iZTE2ICpwZWVyX3BvcnQpCit7CisJaW50IGV0aF9sZW4gPSAoQ0hFTFNJT19DSElQX1ZFUlNJT04odHlwZSkgPD0gQ0hFTFNJT19UNSkgPworCQkgICAgICBFVEhfSERSX0xFTl9HKGJlMzJfdG9fY3B1KHJlcS0+aGRyX2xlbikpIDoKKwkJICAgICAgVDZfRVRIX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKTsKKwlpbnQgaXBfbGVuID0gKENIRUxTSU9fQ0hJUF9WRVJTSU9OKHR5cGUpIDw9IENIRUxTSU9fVDUpID8KKwkJICAgICBJUF9IRFJfTEVOX0coYmUzMl90b19jcHUocmVxLT5oZHJfbGVuKSkgOgorCQkgICAgIFQ2X0lQX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKTsKKwlzdHJ1Y3QgaXBoZHIgKmlwID0gKHN0cnVjdCBpcGhkciAqKSgodTggKikocmVxICsgMSkgKyBldGhfbGVuKTsKKwlzdHJ1Y3QgaXB2NmhkciAqaXA2ID0gKHN0cnVjdCBpcHY2aGRyICopKCh1OCAqKShyZXEgKyAxKSArIGV0aF9sZW4pOworCXN0cnVjdCB0Y3BoZHIgKnRjcCA9IChzdHJ1Y3QgdGNwaGRyICopCisJCQkgICAgICgodTggKikocmVxICsgMSkgKyBldGhfbGVuICsgaXBfbGVuKTsKKworCWlmIChpcC0+dmVyc2lvbiA9PSA0KSB7CisJCXByX2RlYnVnKCIlcyBzYWRkciAweCV4IGRhZGRyIDB4JXggc3BvcnQgJXUgZHBvcnQgJXVcbiIsCisJCQkgX19mdW5jX18sIG50b2hsKGlwLT5zYWRkciksIG50b2hsKGlwLT5kYWRkciksCisJCQkgbnRvaHModGNwLT5zb3VyY2UpLCBudG9ocyh0Y3AtPmRlc3QpKTsKKwkJKmlwdHlwZSA9IDQ7CisJCW1lbWNweShwZWVyX2lwLCAmaXAtPnNhZGRyLCA0KTsKKwkJbWVtY3B5KGxvY2FsX2lwLCAmaXAtPmRhZGRyLCA0KTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiJXMgc2FkZHIgJXBJNiBkYWRkciAlcEk2IHNwb3J0ICV1IGRwb3J0ICV1XG4iLAorCQkJIF9fZnVuY19fLCBpcDYtPnNhZGRyLnM2X2FkZHIsIGlwNi0+ZGFkZHIuczZfYWRkciwKKwkJCSBudG9ocyh0Y3AtPnNvdXJjZSksIG50b2hzKHRjcC0+ZGVzdCkpOworCQkqaXB0eXBlID0gNjsKKwkJbWVtY3B5KHBlZXJfaXAsIGlwNi0+c2FkZHIuczZfYWRkciwgMTYpOworCQltZW1jcHkobG9jYWxfaXAsIGlwNi0+ZGFkZHIuczZfYWRkciwgMTYpOworCX0KKwkqcGVlcl9wb3J0ID0gdGNwLT5zb3VyY2U7CisJKmxvY2FsX3BvcnQgPSB0Y3AtPmRlc3Q7Cit9CitFWFBPUlRfU1lNQk9MKGN4Z2JfZ2V0XzR0dXBsZSk7CisKK3N0YXRpYyBib29sCitjeGdiX291cl9pbnRlcmZhY2Uoc3RydWN0IGN4Z2I0X2xsZF9pbmZvICpsbGRpLAorCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqKCpnZXRfcmVhbF9kZXYpKHN0cnVjdCBuZXRfZGV2aWNlICopLAorCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZWdyZXNzX2RldikKK3sKKwlpbnQgaTsKKworCWVncmVzc19kZXYgPSBnZXRfcmVhbF9kZXYoZWdyZXNzX2Rldik7CisJZm9yIChpID0gMDsgaSA8IGxsZGktPm5wb3J0czsgaSsrKQorCQlpZiAobGxkaS0+cG9ydHNbaV0gPT0gZWdyZXNzX2RldikKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworc3RydWN0IGRzdF9lbnRyeSAqCitjeGdiX2ZpbmRfcm91dGUoc3RydWN0IGN4Z2I0X2xsZF9pbmZvICpsbGRpLAorCQlzdHJ1Y3QgbmV0X2RldmljZSAqKCpnZXRfcmVhbF9kZXYpKHN0cnVjdCBuZXRfZGV2aWNlICopLAorCQlfX2JlMzIgbG9jYWxfaXAsIF9fYmUzMiBwZWVyX2lwLCBfX2JlMTYgbG9jYWxfcG9ydCwKKwkJX19iZTE2IHBlZXJfcG9ydCwgdTggdG9zKQoreworCXN0cnVjdCBydGFibGUgKnJ0OworCXN0cnVjdCBmbG93aTQgZmw0OworCXN0cnVjdCBuZWlnaGJvdXIgKm47CisKKwlydCA9IGlwX3JvdXRlX291dHB1dF9wb3J0cygmaW5pdF9uZXQsICZmbDQsIE5VTEwsIHBlZXJfaXAsIGxvY2FsX2lwLAorCQkJCSAgIHBlZXJfcG9ydCwgbG9jYWxfcG9ydCwgSVBQUk9UT19UQ1AsCisJCQkJICAgdG9zLCAwKTsKKwlpZiAoSVNfRVJSKHJ0KSkKKwkJcmV0dXJuIE5VTEw7CisJbiA9IGRzdF9uZWlnaF9sb29rdXAoJnJ0LT5kc3QsICZwZWVyX2lwKTsKKwlpZiAoIW4pCisJCXJldHVybiBOVUxMOworCWlmICghY3hnYl9vdXJfaW50ZXJmYWNlKGxsZGksIGdldF9yZWFsX2Rldiwgbi0+ZGV2KSAmJgorCSAgICAhKG4tPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7CisJCW5laWdoX3JlbGVhc2Uobik7CisJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW5laWdoX3JlbGVhc2Uobik7CisJcmV0dXJuICZydC0+ZHN0OworfQorRVhQT1JUX1NZTUJPTChjeGdiX2ZpbmRfcm91dGUpOworCitzdHJ1Y3QgZHN0X2VudHJ5ICoKK2N4Z2JfZmluZF9yb3V0ZTYoc3RydWN0IGN4Z2I0X2xsZF9pbmZvICpsbGRpLAorCQkgc3RydWN0IG5ldF9kZXZpY2UgKigqZ2V0X3JlYWxfZGV2KShzdHJ1Y3QgbmV0X2RldmljZSAqKSwKKwkJIF9fdTggKmxvY2FsX2lwLCBfX3U4ICpwZWVyX2lwLCBfX2JlMTYgbG9jYWxfcG9ydCwKKwkJIF9fYmUxNiBwZWVyX3BvcnQsIHU4IHRvcywgX191MzIgc2luNl9zY29wZV9pZCkKK3sKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBOVUxMOworCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0lQVjYpKSB7CisJCXN0cnVjdCBmbG93aTYgZmw2OworCisJCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7CisJCW1lbWNweSgmZmw2LmRhZGRyLCBwZWVyX2lwLCAxNik7CisJCW1lbWNweSgmZmw2LnNhZGRyLCBsb2NhbF9pcCwgMTYpOworCQlpZiAoaXB2Nl9hZGRyX3R5cGUoJmZsNi5kYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQorCQkJZmw2LmZsb3dpNl9vaWYgPSBzaW42X3Njb3BlX2lkOworCQlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KCZpbml0X25ldCwgTlVMTCwgJmZsNik7CisJCWlmICghZHN0KQorCQkJZ290byBvdXQ7CisJCWlmICghY3hnYl9vdXJfaW50ZXJmYWNlKGxsZGksIGdldF9yZWFsX2RldiwKKwkJCQkJaXA2X2RzdF9pZGV2KGRzdCktPmRldikgJiYKKwkJICAgICEoaXA2X2RzdF9pZGV2KGRzdCktPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7CisJCQlkc3RfcmVsZWFzZShkc3QpOworCQkJZHN0ID0gTlVMTDsKKwkJfQorCX0KKworb3V0OgorCXJldHVybiBkc3Q7Cit9CitFWFBPUlRfU1lNQk9MKGN4Z2JfZmluZF9yb3V0ZTYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9saWJjeGdiL2xpYmN4Z2JfY20uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYi9saWJjeGdiX2NtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1Yjk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vbGliY3hnYi9saWJjeGdiX2NtLmgKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICoJICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICoJICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKgkgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKgkgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICoJICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fTElCQ1hHQl9DTV9IX18KKyNkZWZpbmUgX19MSUJDWEdCX0NNX0hfXworCisKKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisKKyNpbmNsdWRlIDxjeGdiNC5oPgorI2luY2x1ZGUgPHQ0X21zZy5oPgorI2luY2x1ZGUgPGwydC5oPgorCit2b2lkCitjeGdiX2dldF80dHVwbGUoc3RydWN0IGNwbF9wYXNzX2FjY2VwdF9yZXEgKiwgZW51bSBjaGlwX3R5cGUsCisJCWludCAqLCBfX3U4ICosIF9fdTggKiwgX19iZTE2ICosIF9fYmUxNiAqKTsKK3N0cnVjdCBkc3RfZW50cnkgKgorY3hnYl9maW5kX3JvdXRlKHN0cnVjdCBjeGdiNF9sbGRfaW5mbyAqLAorCQlzdHJ1Y3QgbmV0X2RldmljZSAqKCopKHN0cnVjdCBuZXRfZGV2aWNlICopLAorCQlfX2JlMzIsIF9fYmUzMiwgX19iZTE2LAlfX2JlMTYsIHU4KTsKK3N0cnVjdCBkc3RfZW50cnkgKgorY3hnYl9maW5kX3JvdXRlNihzdHJ1Y3QgY3hnYjRfbGxkX2luZm8gKiwKKwkJIHN0cnVjdCBuZXRfZGV2aWNlICooKikoc3RydWN0IG5ldF9kZXZpY2UgKiksCisJCSBfX3U4ICosIF9fdTggKiwgX19iZTE2LCBfX2JlMTYsIHU4LCBfX3UzMik7CisKKy8qIFJldHVybnMgd2hldGhlciBhIENQTCBzdGF0dXMgY29udmV5cyBuZWdhdGl2ZSBhZHZpY2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBjeGdiX2lzX25lZ19hZHYodW5zaWduZWQgaW50IHN0YXR1cykKK3sKKwlyZXR1cm4gc3RhdHVzID09IENQTF9FUlJfUlRYX05FR19BRFZJQ0UgfHwKKwkgICAgICAgc3RhdHVzID09IENQTF9FUlJfUEVSU0lTVF9ORUdfQURWSUNFIHx8CisJICAgICAgIHN0YXR1cyA9PSBDUExfRVJSX0tFRVBBTFZfTkVHX0FEVklDRTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitjeGdiX2Jlc3RfbXR1KGNvbnN0IHVuc2lnbmVkIHNob3J0ICptdHVzLCB1bnNpZ25lZCBzaG9ydCBtdHUsCisJICAgICAgdW5zaWduZWQgaW50ICppZHgsIGludCB1c2VfdHMsIGludCBpcHY2KQoreworCXVuc2lnbmVkIHNob3J0IGhkcl9zaXplID0gKGlwdjYgPworCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgOgorCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXBoZHIpKSArCisJCQkJICBzaXplb2Yoc3RydWN0IHRjcGhkcikgKworCQkJCSAgKHVzZV90cyA/CisJCQkJICAgcm91bmRfdXAoVENQT0xFTl9USU1FU1RBTVAsIDQpIDogMCk7CisJdW5zaWduZWQgc2hvcnQgZGF0YV9zaXplID0gbXR1IC0gaGRyX3NpemU7CisKKwljeGdiNF9iZXN0X2FsaWduZWRfbXR1KG10dXMsIGhkcl9zaXplLCBkYXRhX3NpemUsIDgsIGlkeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGN4Z2JfY29tcHV0ZV93c2NhbGUodTMyIHdpbikKK3sKKwl1MzIgd3NjYWxlID0gMDsKKworCXdoaWxlICh3c2NhbGUgPCAxNCAmJiAoNjU1MzUgPDwgd3NjYWxlKSA8IHdpbikKKwkJd3NjYWxlKys7CisJcmV0dXJuIHdzY2FsZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitjeGdiX21rX3RpZF9yZWxlYXNlKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBsZW4sIHUzMiB0aWQsIHUxNiBjaGFuKQoreworCXN0cnVjdCBjcGxfdGlkX3JlbGVhc2UgKnJlcTsKKworCXJlcSA9IChzdHJ1Y3QgY3BsX3RpZF9yZWxlYXNlICopX19za2JfcHV0KHNrYiwgbGVuKTsKKwltZW1zZXQocmVxLCAwLCBsZW4pOworCisJSU5JVF9UUF9XUihyZXEsIHRpZCk7CisJT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfVElEX1JFTEVBU0UsIHRpZCkpOworCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfU0VUVVAsIGNoYW4pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2N4Z2JfbWtfY2xvc2VfY29uX3JlcShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbGVuLCB1MzIgdGlkLCB1MTYgY2hhbiwKKwkJICAgICAgdm9pZCAqaGFuZGxlLCBhcnBfZXJyX2hhbmRsZXJfdCBoYW5kbGVyKQoreworCXN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSAqcmVxOworCisJcmVxID0gKHN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSAqKV9fc2tiX3B1dChza2IsIGxlbik7CisJbWVtc2V0KHJlcSwgMCwgbGVuKTsKKworCUlOSVRfVFBfV1IocmVxLCB0aWQpOworCU9QQ09ERV9USUQocmVxKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX0NMT1NFX0NPTl9SRVEsIHRpZCkpOworCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgY2hhbik7CisJdDRfc2V0X2FycF9lcnJfaGFuZGxlcihza2IsIGhhbmRsZSwgaGFuZGxlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY3hnYl9ta19hYm9ydF9yZXEoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGxlbiwgdTMyIHRpZCwgdTE2IGNoYW4sCisJCSAgdm9pZCAqaGFuZGxlLCBhcnBfZXJyX2hhbmRsZXJfdCBoYW5kbGVyKQoreworCXN0cnVjdCBjcGxfYWJvcnRfcmVxICpyZXE7CisKKwlyZXEgPSAoc3RydWN0IGNwbF9hYm9ydF9yZXEgKilfX3NrYl9wdXQoc2tiLCBsZW4pOworCW1lbXNldChyZXEsIDAsIGxlbik7CisKKwlJTklUX1RQX1dSKHJlcSwgdGlkKTsKKwlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9BQk9SVF9SRVEsIHRpZCkpOworCXJlcS0+Y21kID0gQ1BMX0FCT1JUX1NFTkRfUlNUOworCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgY2hhbik7CisJdDRfc2V0X2FycF9lcnJfaGFuZGxlcihza2IsIGhhbmRsZSwgaGFuZGxlcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY3hnYl9ta19hYm9ydF9ycGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGxlbiwgdTMyIHRpZCwgdTE2IGNoYW4pCit7CisJc3RydWN0IGNwbF9hYm9ydF9ycGwgKnJwbDsKKworCXJwbCA9IChzdHJ1Y3QgY3BsX2Fib3J0X3JwbCAqKV9fc2tiX3B1dChza2IsIGxlbik7CisJbWVtc2V0KHJwbCwgMCwgbGVuKTsKKworCUlOSVRfVFBfV1IocnBsLCB0aWQpOworCU9QQ09ERV9USUQocnBsKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX0FCT1JUX1JQTCwgdGlkKSk7CisJcnBsLT5jbWQgPSBDUExfQUJPUlRfTk9fUlNUOworCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfREFUQSwgY2hhbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY3hnYl9ta19yeF9kYXRhX2FjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbGVuLCB1MzIgdGlkLCB1MTYgY2hhbiwKKwkJICAgIHUzMiBjcmVkaXRfZGFjaykKK3sKKwlzdHJ1Y3QgY3BsX3J4X2RhdGFfYWNrICpyZXE7CisKKwlyZXEgPSAoc3RydWN0IGNwbF9yeF9kYXRhX2FjayAqKV9fc2tiX3B1dChza2IsIGxlbik7CisJbWVtc2V0KHJlcSwgMCwgbGVuKTsKKworCUlOSVRfVFBfV1IocmVxLCB0aWQpOworCU9QQ09ERV9USUQocmVxKSA9IGNwdV90b19iZTMyKE1LX09QQ09ERV9USUQoQ1BMX1JYX0RBVEFfQUNLLCB0aWQpKTsKKwlyZXEtPmNyZWRpdF9kYWNrID0gY3B1X3RvX2JlMzIoY3JlZGl0X2RhY2spOworCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfQUNLLCBjaGFuKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlNHg1LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuYwppbmRleCBmMGU5ZTJlLi42NjIwZmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuYwpAQCAtMTk2Niw3ICsxOTY2LDcgQEAKICAgICB9IGVsc2UgaWYgKGxwLT5zZXR1cF9mID09IEhBU0hfUEVSRikgeyAgIC8qIEhhc2ggRmlsdGVyaW5nICovCiAJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewogCQljcmMgPSBldGhlcl9jcmNfbGUoRVRIX0FMRU4sIGhhLT5hZGRyKTsKLQkJaGFzaGNvZGUgPSBjcmMgJiBIQVNIX0JJVFM7ICAvKiBoYXNoY29kZSBpcyA5IExTYiBvZiBDUkMgKi8KKwkJaGFzaGNvZGUgPSBjcmMgJiBERTRYNV9IQVNIX0JJVFM7ICAvKiBoYXNoY29kZSBpcyA5IExTYiBvZiBDUkMgKi8KIAogCQlieXRlID0gaGFzaGNvZGUgPj4gMzsgICAgICAgIC8qIGJpdFszLThdIC0+IGJ5dGUgaW4gZmlsdGVyICovCiAJCWJpdCA9IDEgPDwgKGhhc2hjb2RlICYgMHgwNyk7LyogYml0WzAtMl0gLT4gYml0IGluIGJ5dGUgKi8KQEAgLTUwNDMsNyArNTA0Myw3IEBACiAJICAgICoocGEgKyBpKSA9IGRldi0+ZGV2X2FkZHJbaV07ICAgICAgICAgICAgICAgICAvKiBIb3N0IGFkZHJlc3MgKi8KIAkgICAgaWYgKGkgJiAweDAxKSBwYSArPSAyOwogCX0KLQkqKGxwLT5zZXR1cF9mcmFtZSArIChIQVNIX1RBQkxFX0xFTiA+PiAzKSAtIDMpID0gMHg4MDsKKwkqKGxwLT5zZXR1cF9mcmFtZSArIChERTRYNV9IQVNIX1RBQkxFX0xFTiA+PiAzKSAtIDMpID0gMHg4MDsKICAgICB9IGVsc2UgewogCWZvciAoaT0wOyBpPEVUSF9BTEVOOyBpKyspIHsgLyogSG9zdCBhZGRyZXNzICovCiAJICAgICoocGEgKyAoaSYxKSkgPSBkZXYtPmRldl9hZGRyW2ldOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlNHg1LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuaAppbmRleCBlYzc1NmViLi4xYmZkYzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuaApAQCAtODYwLDggKzg2MCw4IEBACiAjZGVmaW5lIFBDSSAgMAogI2RlZmluZSBFSVNBIDEKIAotI2RlZmluZSBIQVNIX1RBQkxFX0xFTiAgIDUxMiAgICAgICAvKiBCaXRzICovCi0jZGVmaW5lIEhBU0hfQklUUyAgICAgICAgMHgwMWZmICAgIC8qIDkgTFMgYml0cyAqLworI2RlZmluZSBERTRYNV9IQVNIX1RBQkxFX0xFTiAgIDUxMiAgICAgICAvKiBCaXRzICovCisjZGVmaW5lIERFNFg1X0hBU0hfQklUUyAgICAgICAgMHgwMWZmICAgIC8qIDkgTFMgYml0cyAqLwogCiAjZGVmaW5lIFNFVFVQX0ZSQU1FX0xFTiAgMTkyICAgICAgIC8qIEJ5dGVzICovCiAjZGVmaW5lIElNUEVSRl9QQV9PRkZTRVQgMTU2ICAgICAgIC8qIEJ5dGVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbGluay9zdW5kYW5jZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGxpbmsvc3VuZGFuY2UuYwppbmRleCA1OGM2MzM4Li43OWQ4MDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbGluay9zdW5kYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RsaW5rL3N1bmRhbmNlLmMKQEAgLTg2Nyw3ICs4NjcsNyBAQAogCiAJLyogSW5pdGlhbGl6ZSBvdGhlciByZWdpc3RlcnMuICovCiAJX19zZXRfbWFjX2FkZHIoZGV2KTsKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTEFOXzgwMjFRKQogCWlvd3JpdGUxNihkZXYtPm10dSArIDE4LCBpb2FkZHIgKyBNYXhGcmFtZVNpemUpOwogI2Vsc2UKIAlpb3dyaXRlMTYoZGV2LT5tdHUgKyAxNCwgaW9hZGRyICsgTWF4RnJhbWVTaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlLmgKaW5kZXggNDU1NWUwNC4uNmNmYTYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlLmgKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlICJiZV9ody5oIgogI2luY2x1ZGUgImJlX3JvY2UuaCIKIAotI2RlZmluZSBEUlZfVkVSCQkJIjExLjAuMC4wIgorI2RlZmluZSBEUlZfVkVSCQkJIjExLjEuMC4wIgogI2RlZmluZSBEUlZfTkFNRQkJImJlMm5ldCIKICNkZWZpbmUgQkVfTkFNRQkJCSJFbXVsZXggQmxhZGVFbmdpbmUyIgogI2RlZmluZSBCRTNfTkFNRQkJIkVtdWxleCBCbGFkZUVuZ2luZTMiCkBAIC0zOTksMTMgKzM5OSwxMyBAQAogI2RlZmluZSBCRV9GTEFHU19QSFlfTUlTQ09ORklHVVJFRAkJQklUKDEwKQogI2RlZmluZSBCRV9GTEFHU19FUlJfREVURUNUSU9OX1NDSEVEVUxFRAlCSVQoMTEpCiAjZGVmaW5lIEJFX0ZMQUdTX09TMkJNQwkJCQlCSVQoMTIpCisjZGVmaW5lIEJFX0ZMQUdTX1RSWV9SRUNPVkVSWQkJCUJJVCgxMykKIAogI2RlZmluZSBCRV9VQ19QTUFDX0NPVU5UCQkJMzAKICNkZWZpbmUgQkVfVkZfVUNfUE1BQ19DT1VOVAkJCTIKIAogI2RlZmluZSBNQVhfRVJSX1JFQ09WRVJZX1JFVFJZX0NPVU5UCQkzCiAjZGVmaW5lIEVSUl9ERVRFQ1RJT05fREVMQVkJCQkxMDAwCi0jZGVmaW5lIEVSUl9SRUNPVkVSWV9SRVRSWV9ERUxBWQkJMzAwMDAKIAogLyogRXRodG9vbCBzZXRfZHVtcCBmbGFncyAqLwogI2RlZmluZSBMQU5DRVJfSU5JVElBVEVfRldfRFVNUAkJCTB4MQpAQCAtNTA4LDYgKzUwOCw3MCBAQAogCXUxNiBsc29fbXNzOwkvKiBNU1MgZm9yIExTTyAqLwogfTsKIAorc3RydWN0IGJlX2V0aF9hZGRyIHsKKwl1bnNpZ25lZCBjaGFyIG1hY1tFVEhfQUxFTl07Cit9OworCisjZGVmaW5lIEJFX1NFQwkxMDAwCQkJLyogaW4gbXNlYyAqLworI2RlZmluZSBCRV9NSU4JKDYwICogQkVfU0VDKQkJLyogaW4gbXNlYyAqLworI2RlZmluZSBCRV9IT1VSCSg2MCAqIEJFX01JTikJCS8qIGluIG1zZWMgKi8KKworI2RlZmluZSBFUlJfUkVDT1ZFUllfTUFYX1JFVFJZX0NPVU5UCQkzCisjZGVmaW5lIEVSUl9SRUNPVkVSWV9ERVRFQ1RJT05fREVMQVkJCUJFX1NFQworI2RlZmluZSBFUlJfUkVDT1ZFUllfUkVUUllfREVMQVkJCSgzMCAqIEJFX1NFQykKKworLyogVUUtZGV0ZWN0aW9uLWR1cmF0aW9uIGluIEJFeC9Ta3loYXdrOgorICogQWxsIFBGcyBtdXN0IHdhaXQgZm9yIHRoaXMgZHVyYXRpb24gYWZ0ZXIgdGhleSBkZXRlY3QgVUUgYmVmb3JlIHJlYWRpbmcKKyAqIFNMSVBPUlRfU0VNQVBIT1JFIHJlZ2lzdGVyLiBBdCB0aGUgZW5kIG9mIHRoaXMgZHVyYXRpb24sIHRoZSBGaXJtd2FyZQorICogZ3VhcmFudGVlcyB0aGF0IHRoZSBTTElQT1JUX1NFTUFQSE9SRSByZWdpc3RlciBpcyB1cGRhdGVkIHRvIGluZGljYXRlCisgKiBpZiB0aGUgVUUgaXMgcmVjb3ZlcmFibGUuCisgKi8KKyNkZWZpbmUgRVJSX1JFQ09WRVJZX1VFX0RFVEVDVF9EVVJBVElPTgkJCUJFX1NFQworCisvKiBJbml0aWFsIGlkbGUgdGltZSAoaW4gbXNlYykgdG8gZWxhcHNlIGFmdGVyIGRyaXZlciBsb2FkLAorICogYmVmb3JlIFVFIHJlY292ZXJ5IGlzIGFsbG93ZWQuCisgKi8KKyNkZWZpbmUgRVJSX0lETEVfSFIJCQkyNAorI2RlZmluZSBFUlJfUkVDT1ZFUllfSURMRV9USU1FCQkoRVJSX0lETEVfSFIgKiBCRV9IT1VSKQorCisvKiBUaW1lIGludGVydmFsIChpbiBtc2VjKSBhZnRlciB3aGljaCBVRSByZWNvdmVyeSBjYW4gYmUgcmVwZWF0ZWQgKi8KKyNkZWZpbmUgRVJSX0lOVEVSVkFMX0hSCQkJNzIKKyNkZWZpbmUgRVJSX1JFQ09WRVJZX0lOVEVSVkFMCQkoRVJSX0lOVEVSVkFMX0hSICogQkVfSE9VUikKKworLyogQkV4L1NIIFVFIHJlY292ZXJ5IHN0YXRlIG1hY2hpbmUgKi8KK2VudW0geworCUVSUl9SRUNPVkVSWV9TVF9OT05FID0gMCwJCS8qIE5vIFJlY292ZXJ5ICovCisJRVJSX1JFQ09WRVJZX1NUX0RFVEVDVCA9IDEsCQkvKiBVRSBkZXRlY3Rpb24gZHVyYXRpb24gKi8KKwlFUlJfUkVDT1ZFUllfU1RfUkVTRVQgPSAyLAkJLyogUmVzZXQgUGhhc2UgKFBGMCBvbmx5KSAqLworCUVSUl9SRUNPVkVSWV9TVF9QUkVfUE9MTCA9IDMsCQkvKiBQcmUtUG9sbCBQaGFzZSAoYWxsIFBGcykgKi8KKwlFUlJfUkVDT1ZFUllfU1RfUkVJTklUID0gNAkJLyogUmUtaW5pdGlhbGl6ZSBQaGFzZSAqLworfTsKKworc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5IHsKKwkvKiBMYW5jZXIgZXJyb3IgcmVjb3ZlcnkgdmFyaWFibGVzICovCisJdTggcmVjb3ZlcnlfcmV0cmllczsKKworCS8qIEJFeC9Ta3loYXdrIGVycm9yIHJlY292ZXJ5IHZhcmlhYmxlcyAqLworCXU4IHJlY292ZXJ5X3N0YXRlOworCXUxNiB1ZV90b19yZXNldF90aW1lOwkJLyogVGltZSBhZnRlciBVRSwgdG8gc29mdCByZXNldAorCQkJCQkgKiB0aGUgY2hpcCAtIFBGMCBvbmx5CisJCQkJCSAqLworCXUxNiB1ZV90b19wb2xsX3RpbWU7CQkvKiBUaW1lIGFmdGVyIFVFLCB0byBSZXN0YXJ0IFBvbGxpbmcKKwkJCQkJICogb2YgU0xJUE9SVF9TRU1BUEhPUkUgcmVnCisJCQkJCSAqLworCXUxNiBsYXN0X2Vycl9jb2RlOworCWJvb2wgcmVjb3Zlcnlfc3VwcG9ydGVkOworCXVuc2lnbmVkIGxvbmcgcHJvYmVfdGltZTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfcmVjb3ZlcnlfdGltZTsKKworCS8qIENvbW1vbiB0byBib3RoIExhbmNlciAmIEJFeC9TSCBlcnJvciByZWNvdmVyeSAqLworCXUzMiByZXNjaGVkX2RlbGF5OworCXN0cnVjdCBkZWxheWVkX3dvcmsgZXJyX2RldGVjdGlvbl93b3JrOworfTsKKworLyogRXRodG9vbCBwcml2X2ZsYWdzICovCisjZGVmaW5lCUJFX0RJU0FCTEVfVFBFX1JFQ09WRVJZCTB4MQorCiBzdHJ1Y3QgYmVfYWRhcHRlciB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKQEAgLTUyMyw3ICs1ODcsNyBAQAogCXN0cnVjdCBiZV9kbWFfbWVtIG1ib3hfbWVtX2FsbG9jZWQ7CiAKIAlzdHJ1Y3QgYmVfbWNjX29iaiBtY2Nfb2JqOwotCXNwaW5sb2NrX3QgbWNjX2xvY2s7CS8qIEZvciBzZXJpYWxpemluZyBtY2MgY21kcyB0byBCRSBjYXJkICovCisJc3RydWN0IG11dGV4IG1jY19sb2NrOwkvKiBGb3Igc2VyaWFsaXppbmcgbWNjIGNtZHMgdG8gQkUgY2FyZCAqLwogCXNwaW5sb2NrX3QgbWNjX2NxX2xvY2s7CiAKIAl1MTYgY2ZnX251bV9yeF9pcnFzOwkJLyogY29uZmlndXJlZCB2aWEgc2V0LWNoYW5uZWxzICovCkBAIC01NTYsNyArNjIwLDYgQEAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CiAJdTE2IHdvcmtfY291bnRlcjsKIAotCXN0cnVjdCBkZWxheWVkX3dvcmsgYmVfZXJyX2RldGVjdGlvbl93b3JrOwogCXU4IHJlY292ZXJ5X3JldHJpZXM7CiAJdTggZXJyX2ZsYWdzOwogCWJvb2wgcGNpY2ZnX21hcHBlZDsJLyogcGNpY2ZnIG9idGFpbmVkIHZpYSBwY2lfaW9tYXAoKSAqLwpAQCAtNTcwLDkgKzYzMywxNSBAQAogCWludCBpZl9oYW5kbGU7CQkvKiBVc2VkIHRvIGNvbmZpZ3VyZSBmaWx0ZXJpbmcgKi8KIAl1MzIgaWZfZmxhZ3M7CQkvKiBJbnRlcmZhY2UgZmlsdGVyaW5nIGZsYWdzICovCiAJdTMyICpwbWFjX2lkOwkJLyogTUFDIGFkZHIgaGFuZGxlIHVzZWQgYnkgQkUgY2FyZCAqLworCXN0cnVjdCBiZV9ldGhfYWRkciAqdWNfbGlzdDsvKiBsaXN0IG9mIHVjLWFkZHJzIHByb2dyYW1tZWQgKG5vdCBwZXJtKSAqLwogCXUzMiB1Y19tYWNzOwkJLyogQ291bnQgb2Ygc2Vjb25kYXJ5IFVDIE1BQyBwcm9ncmFtbWVkICovCisJc3RydWN0IGJlX2V0aF9hZGRyICptY19saXN0Oy8qIGxpc3Qgb2YgbWNhc3QgYWRkcnMgcHJvZ3JhbW1lZCAqLworCXUzMiBtY19jb3VudDsKIAl1bnNpZ25lZCBsb25nIHZpZHNbQklUU19UT19MT05HUyhWTEFOX05fVklEKV07CiAJdTE2IHZsYW5zX2FkZGVkOworCWJvb2wgdXBkYXRlX3VjX2xpc3Q7CisJYm9vbCB1cGRhdGVfbWNfbGlzdDsKKwlzdHJ1Y3QgbXV0ZXggcnhfZmlsdGVyX2xvY2s7LyogRm9yIHByb3RlY3Rpbmcgdmlkc1tdICYgbWMvdWNfbGlzdFtdICovCiAKIAl1MzIgYmVhY29uX3N0YXRlOwkvKiBmb3Igc2V0X3BoeXNfaWQgKi8KIApAQCAtNjI0LDYgKzY5MywxOCBAQAogCXUzMiBmYXRfZHVtcF9sZW47CiAJdTE2IHNlcmlhbF9udW1bQ05UTF9TRVJJQUxfTlVNX1dPUkRTXTsKIAl1OCBwaHlfc3RhdGU7IC8qIHN0YXRlIG9mIHNmcCBvcHRpY3MgKGZ1bmN0aW9uYWwsIGZhdWx0ZWQsIGV0Yy4sKSAqLworCXU4IGRldl9tYWNbRVRIX0FMRU5dOworCXUzMiBwcml2X2ZsYWdzOyAvKiBldGh0b29sIGdldC9zZXRfcHJpdl9mbGFncygpICovCisJc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5IGVycm9yX3JlY292ZXJ5OworfTsKKworLyogVXNlZCBmb3IgZGVmZXJlZCBGVyBjb25maWcgY21kcy4gQWRkIGZpZWxkcyB0byB0aGlzIHN0cnVjdCBhcyByZXFkICovCitzdHJ1Y3QgYmVfY21kX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyOworCXVuaW9uIHsKKwkJX19iZTE2IHZ4bGFuX3BvcnQ7CisJfSBpbmZvOwogfTsKIAogI2RlZmluZSBiZV9waHlzZm4oYWRhcHRlcikJCSghYWRhcHRlci0+dmlydGZuKQpAQCAtODQ4LDYgKzkyOSw5IEBACiAJcmV0dXJuIHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApICYmIGlwX2hkcihza2IpLT52ZXJzaW9uID09IDQ7CiB9CiAKKyNkZWZpbmUgYmVfZXJyb3JfcmVjb3ZlcmluZyhhZGFwdGVyKQlcCisJCShhZGFwdGVyLT5mbGFncyAmIEJFX0ZMQUdTX1RSWV9SRUNPVkVSWSkKKwogI2RlZmluZSBCRV9FUlJPUl9FRUgJCTEKICNkZWZpbmUgQkVfRVJST1JfVUUJCUJJVCgxKQogI2RlZmluZSBCRV9FUlJPUl9GVwkJQklUKDIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuYwppbmRleCAyY2MxMTc1Li45Y2ZmZTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmMKQEAgLTkyLDYgKzkyLDExIEBACiAJCUNNRF9TVUJTWVNURU1fQ09NTU9OLAogCQlCRV9QUklWX0RFVkNGRyB8IEJFX1BSSVZfVkhBRE0KIAl9LAorCXsKKwkJT1BDT0RFX0NPTU1PTl9HRVRfRVhUX0ZBVF9DQVBBQklMSVRJRVMsCisJCUNNRF9TVUJTWVNURU1fQ09NTU9OLAorCQlCRV9QUklWX0RFVkNGRworCX0KIH07CiAKIHN0YXRpYyBib29sIGJlX2NtZF9hbGxvd2VkKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1OCBvcGNvZGUsIHU4IHN1YnN5c3RlbSkKQEAgLTU3MSw3ICs1NzYsNyBAQAogLyogV2FpdCB0aWxsIG5vIG1vcmUgcGVuZGluZyBtY2MgcmVxdWVzdHMgYXJlIHByZXNlbnQgKi8KIHN0YXRpYyBpbnQgYmVfbWNjX3dhaXRfY29tcGwoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0jZGVmaW5lIG1jY190aW1lb3V0CQkxMjAwMDAgLyogMTJzIHRpbWVvdXQgKi8KKyNkZWZpbmUgbWNjX3RpbWVvdXQJCTEyMDAwIC8qIDEycyB0aW1lb3V0ICovCiAJaW50IGksIHN0YXR1cyA9IDA7CiAJc3RydWN0IGJlX21jY19vYmogKm1jY19vYmogPSAmYWRhcHRlci0+bWNjX29iajsKIApAQCAtNTg1LDcgKzU5MCw3IEBACiAKIAkJaWYgKGF0b21pY19yZWFkKCZtY2Nfb2JqLT5xLnVzZWQpID09IDApCiAJCQlicmVhazsKLQkJdWRlbGF5KDEwMCk7CisJCXVzbGVlcF9yYW5nZSg1MDAsIDEwMDApOwogCX0KIAlpZiAoaSA9PSBtY2NfdGltZW91dCkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJGVyBub3QgcmVzcG9uZGluZ1xuIik7CkBAIC03MDUsNyArNzEwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUxNiBiZV9QT1NUX3N0YWdlX2dldChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3UxNiBiZV9QT1NUX3N0YWdlX2dldChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAl1MzIgc2VtOwogCkBAIC04NjMsNyArODY4LDcgQEAKIHN0YXRpYyBpbnQgYmVfY21kX2xvY2soc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaWYgKHVzZV9tY2MoYWRhcHRlcikpIHsKLQkJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWRhcHRlci0+bWJveF9sb2NrKTsKQEAgLTg3NCw3ICs4NzksNyBAQAogc3RhdGljIHZvaWQgYmVfY21kX3VubG9jayhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpZiAodXNlX21jYyhhZGFwdGVyKSkKLQkJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwkJcmV0dXJuIG11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCWVsc2UKIAkJcmV0dXJuIG11dGV4X3VubG9jaygmYWRhcHRlci0+bWJveF9sb2NrKTsKIH0KQEAgLTEwNDQsNyArMTA0OSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfbWFjX3F1ZXJ5ICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTEwNzMsNyArMTA3OCw3IEBACiAJfQogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xMDg1LDcgKzEwOTAsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX3BtYWNfYWRkICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTExMTAsNyArMTExNSw3IEBACiAJfQogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCSBpZiAoc3RhdHVzID09IE1DQ19TVEFUVVNfVU5BVVRIT1JJWkVEX1JFUVVFU1QpCiAJCXN0YXR1cyA9IC1FUEVSTTsKQEAgLTExMjgsNyArMTEzMyw3IEBACiAJaWYgKHBtYWNfaWQgPT0gLTEpCiAJCXJldHVybiAwOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTE0OCw3ICsxMTUzLDcgQEAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE0MTEsNyArMTQxNiw3IEBACiAJc3RydWN0IGJlX2RtYV9tZW0gKnFfbWVtID0gJnJ4cS0+ZG1hX21lbTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTQ0MSw3ICsxNDQ2LDcgQEAKIAl9CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE1MDUsNyArMTUxMCw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfcV9kZXN0cm95ICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTE1MjIsNyArMTUyNyw3IEBACiAJcS0+Y3JlYXRlZCA9IGZhbHNlOwogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNTkwLDcgKzE1OTUsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX2hkciAqaGRyOwogCWludCBzdGF0dXMgPSAwOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTYxOCw3ICsxNjIzLDcgQEAKIAlhZGFwdGVyLT5zdGF0c19jbWRfc2VudCA9IHRydWU7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE2MzQsNyArMTYzOSw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9FVEgpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTY1Nyw3ICsxNjYyLDcgQEAKIAlhZGFwdGVyLT5zdGF0c19jbWRfc2VudCA9IHRydWU7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE2OTQsNyArMTY5OSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfbGlua19zdGF0dXMgKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJaWYgKGxpbmtfc3RhdHVzKQogCQkqbGlua19zdGF0dXMgPSBMSU5LX0RPV047CkBAIC0xNzMzLDcgKzE3MzgsNyBAQAogCX0KIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTc0NCw3ICsxNzQ5LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfY250bF9hZGRubF9hdHRyaWJzICpyZXE7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0xNzU5LDcgKzE3NjQsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeShhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE4MDgsNyArMTgxMyw3IEBACiAJaWYgKCFnZXRfZmF0X2NtZC52YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3aGlsZSAodG90YWxfc2l6ZSkgewogCQlidWZfc2l6ZSA9IG1pbih0b3RhbF9zaXplLCAodTMyKTYwKjEwMjQpOwpAQCAtMTg0OCw3ICsxODUzLDcgQEAKIGVycjoKIAlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBnZXRfZmF0X2NtZC5zaXplLAogCQkJICBnZXRfZmF0X2NtZC52YSwgZ2V0X2ZhdF9jbWQuZG1hKTsKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE4NTksNyArMTg2NCw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfZ2V0X2Z3X3ZlcnNpb24gKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTg4Miw3ICsxODg3LDcgQEAKIAkJCXNpemVvZihhZGFwdGVyLT5md19vbl9mbGFzaCkpOwogCX0KIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE4OTYsNyArMTkwMSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfbW9kaWZ5X2VxX2RlbGF5ICpyZXE7CiAJaW50IHN0YXR1cyA9IDAsIGk7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0xOTE5LDcgKzE5MjQsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeShhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE5NDYsNyArMTk1MSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfdmxhbl9jb25maWcgKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMTk2OCw3ICsxOTczLDcgQEAKIAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE5NzksNyArMTk4NCw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfcnhfZmlsdGVyICpyZXEgPSBtZW0tPnZhOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0xOTk2LDggKzIwMDEsNyBAQAogCXJlcS0+aWZfZmxhZ3MgPSAodmFsdWUgPT0gT04pID8gcmVxLT5pZl9mbGFnc19tYXNrIDogMDsKIAogCWlmIChmbGFncyAmIEJFX0lGX0ZMQUdTX01VTFRJQ0FTVCkgewotCQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCQlpbnQgaSA9IDA7CisJCWludCBpOwogCiAJCS8qIFJlc2V0IG1jYXN0IHByb21pc2MgbW9kZSBpZiBhbHJlYWR5IHNldCBieSBzZXR0aW5nIG1hc2sKIAkJICogYW5kIG5vdCBzZXR0aW5nIGZsYWdzIGZpZWxkCkBAIC0yMDA1LDE0ICsyMDA5LDE1IEBACiAJCXJlcS0+aWZfZmxhZ3NfbWFzayB8PQogCQkJY3B1X3RvX2xlMzIoQkVfSUZfRkxBR1NfTUNBU1RfUFJPTUlTQ1VPVVMgJgogCQkJCSAgICBiZV9pZl9jYXBfZmxhZ3MoYWRhcHRlcikpOwotCQlyZXEtPm1jYXN0X251bSA9IGNwdV90b19sZTMyKG5ldGRldl9tY19jb3VudChhZGFwdGVyLT5uZXRkZXYpKTsKLQkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGFkYXB0ZXItPm5ldGRldikKLQkJCW1lbWNweShyZXEtPm1jYXN0X21hY1tpKytdLmJ5dGUsIGhhLT5hZGRyLCBFVEhfQUxFTik7CisJCXJlcS0+bWNhc3RfbnVtID0gY3B1X3RvX2xlMzIoYWRhcHRlci0+bWNfY291bnQpOworCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bWNfY291bnQ7IGkrKykKKwkJCWV0aGVyX2FkZHJfY29weShyZXEtPm1jYXN0X21hY1tpXS5ieXRlLAorCQkJCQlhZGFwdGVyLT5tY19saXN0W2ldLm1hYyk7CiAJfQogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjA0Myw3ICsyMDQ4LDcgQEAKIAkJCSAgICBDTURfU1VCU1lTVEVNX0NPTU1PTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0yMDYzLDcgKzIwNjgsNyBAQAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAlpZiAoYmFzZV9zdGF0dXMoc3RhdHVzKSA9PSBNQ0NfU1RBVFVTX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCkKIAkJcmV0dXJuICAtRU9QTk9UU1VQUDsKQEAgLTIwODIsNyArMjA4Nyw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9DT01NT04pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMjEwNSw3ICsyMTEwLDcgQEAKIAl9CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIxODYsNyArMjE5MSw3IEBACiAJaWYgKCEoYmVfaWZfY2FwX2ZsYWdzKGFkYXB0ZXIpICYgQkVfSUZfRkxBR1NfUlNTKSkKIAkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0yMjExLDcgKzIyMTYsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjIyMyw3ICsyMjI4LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9lbmFibGVfZGlzYWJsZV9iZWFjb24gKnJlcTsKIAlpbnQgc3RhdHVzOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMjI0NCw3ICsyMjQ5LDcgQEAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIyNTUsNyArMjI2MCw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfZ2V0X2JlYWNvbl9zdGF0ZSAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0yMjc5LDcgKzIyODQsNyBAQAogCX0KIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjMwMyw3ICsyMzA4LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMjMyNSw3ICsyMzMwLDcgQEAKIAkJbWVtY3B5KGRhdGEsIHJlc3AtPnBhZ2VfZGF0YSwgUEFHRV9EQVRBX0xFTik7CiAJfQogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJZG1hX2ZyZWVfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwgY21kLnNpemUsIGNtZC52YSwgY21kLmRtYSk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTIzNDIsNyArMjM0Nyw3IEBACiAJdm9pZCAqY3R4dCA9IE5VTEw7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlhZGFwdGVyLT5mbGFzaF9zdGF0dXMgPSAwOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKQEAgLTIzODQsNyArMjM4OSw3IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnJfdW5sb2NrOwogCi0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhZGFwdGVyLT5ldF9jbWRfY29tcGwsCiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKDYwMDAwKSkpCkBAIC0yNDAzLDcgKzI0MDgsNyBAQAogCXJldHVybiBzdGF0dXM7CiAKIGVycl91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNDU3LDcgKzI0NjIsNyBAQAogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTI0NzUsNyArMjQ4MCw3IEBACiAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNDg4LDcgKzI0OTMsNyBAQAogCXN0cnVjdCBsYW5jZXJfY21kX3Jlc3BfcmVhZF9vYmplY3QgKnJlc3A7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTI1MjIsNyArMjUyNyw3IEBACiAJfQogCiBlcnJfdW5sb2NrOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjUzNCw3ICsyNTM5LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3dyaXRlX2ZsYXNocm9tICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlhZGFwdGVyLT5mbGFzaF9zdGF0dXMgPSAwOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKQEAgLTI1NTksNyArMjU2NCw3IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnJfdW5sb2NrOwogCi0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhZGFwdGVyLT5ldF9jbWRfY29tcGwsCiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKDQwMDAwKSkpCkBAIC0yNTcwLDcgKzI1NzUsNyBAQAogCXJldHVybiBzdGF0dXM7CiAKIGVycl91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0yNTgxLDcgKzI1ODYsNyBAQAogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTI2MDgsNyArMjYxMyw3IEBACiAJCW1lbWNweShmbGFzaGVkX2NyYywgcmVxLT5jcmMsIDQpOwogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zMTkyLDcgKzMxOTcsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX2FjcGlfd29sX21hZ2ljX2NvbmZpZyAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zMjA5LDcgKzMyMTQsNyBAQAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzIyNCw3ICszMjI5LDcgQEAKIAkJCSAgICBDTURfU1VCU1lTVEVNX0xPV0xFVkVMKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTMyNDcsNyArMzI1Miw3IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnJfdW5sb2NrOwogCi0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhZGFwdGVyLT5ldF9jbWRfY29tcGwsCiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKFNFVF9MQl9NT0RFX1RJTUVPVVQpKSkKQEAgLTMyNTYsNyArMzI2MSw3IEBACiAJcmV0dXJuIHN0YXR1czsKIAogZXJyX3VubG9jazoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTMyNzMsNyArMzI3OCw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9MT1dMRVZFTCkpCiAJCXJldHVybiAtRVBFUk07CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zMjk5LDcgKzMzMDQsNyBAQAogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyOwogCi0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFkYXB0ZXItPmV0X2NtZF9jb21wbCk7CiAJcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKQEAgLTMzMDcsNyArMzMxMiw3IEBACiAKIAlyZXR1cm4gc3RhdHVzOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzMyMyw3ICszMzI4LDcgQEAKIAkJCSAgICBDTURfU1VCU1lTVEVNX0xPV0xFVkVMKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTMzNTcsNyArMzM2Miw3IEBACiAJfQogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zMzY4LDcgKzMzNzMsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX3NlZXByb21fcmVhZCAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zMzg0LDcgKzMzODksNyBAQAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzM5OSw3ICszNDA0LDcgQEAKIAkJCSAgICBDTURfU1VCU1lTVEVNX0NPTU1PTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zNDQ0LDcgKzM0NDksNyBAQAogCX0KIAlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBjbWQuc2l6ZSwgY21kLnZhLCBjbWQuZG1hKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM0NTQsNyArMzQ1OSw3IEBACiAJc3RydWN0IGJlX2NtZF9yZXFfc2V0X3FvcyAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zNDc0LDcgKzM0NzksNyBAQAogCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzU4MSw3ICszNTg2LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfZm5fcHJpdmlsZWdlcyAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zNjEzLDcgKzM2MTgsNyBAQAogCX0KIAogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzYyNSw3ICszNjMwLDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9zZXRfZm5fcHJpdmlsZWdlcyAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC0zNjQ1LDcgKzM2NTAsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMzY3Nyw3ICszNjgyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzc0MSw3ICszNzQ2LDcgQEAKIAl9CiAKIG91dDoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCWRtYV9mcmVlX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsIGdldF9tYWNfbGlzdF9jbWQuc2l6ZSwKIAkJCSAgZ2V0X21hY19saXN0X2NtZC52YSwgZ2V0X21hY19saXN0X2NtZC5kbWEpOwogCXJldHVybiBzdGF0dXM7CkBAIC0zODAxLDcgKzM4MDYsNyBAQAogCWlmICghY21kLnZhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTM4MjMsNyArMzgyOCw3IEBACiAKIGVycjoKIAlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBjbWQuc2l6ZSwgY21kLnZhLCBjbWQuZG1hKTsKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM4NTksNyArMzg2NCw3IEBACiAJCQkgICAgQ01EX1NVQlNZU1RFTV9DT01NT04pKQogCQlyZXR1cm4gLUVQRVJNOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzkwMCw3ICszOTA1LDcgQEAKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM5MTQsNyArMzkxOSw3IEBACiAJaW50IHN0YXR1czsKIAl1MTYgdmlkOwogCi0Jc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKIAlpZiAoIXdyYikgewpAQCAtMzk2MSw3ICszOTY2LDcgQEAKIAl9CiAKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQxMjcsNiArNDEzMiwxMCBAQAogCXN0cnVjdCBiZV9jbWRfcmVxX2dldF9leHRfZmF0X2NhcHMgKnJlcTsKIAlpbnQgc3RhdHVzOwogCisJaWYgKCFiZV9jbWRfYWxsb3dlZChhZGFwdGVyLCBPUENPREVfQ09NTU9OX0dFVF9FWFRfRkFUX0NBUEFCSUxJVElFUywKKwkJCSAgICBDTURfU1VCU1lTVEVNX0NPTU1PTikpCisJCXJldHVybiAtRVBFUk07CisKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwdGVyLT5tYm94X2xvY2spKQogCQlyZXR1cm4gLTE7CiAKQEAgLTQxMzgsNyArNDE0Nyw3IEBACiAKIAlyZXEgPSBjbWQtPnZhOwogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCSAgICAgICBPUENPREVfQ09NTU9OX0dFVF9FWFRfRkFUX0NBUEFCSUxJVEVTLAorCQkJICAgICAgIE9QQ09ERV9DT01NT05fR0VUX0VYVF9GQVRfQ0FQQUJJTElUSUVTLAogCQkJICAgICAgIGNtZC0+c2l6ZSwgd3JiLCBjbWQpOwogCXJlcS0+cGFyYW1ldGVyX3R5cGUgPSBjcHVfdG9fbGUzMigxKTsKIApAQCAtNDE1Niw3ICs0MTY1LDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3JlcV9zZXRfZXh0X2ZhdF9jYXBzICpyZXE7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTQxNjcsMTIgKzQxNzYsMTIgQEAKIAlyZXEgPSBjbWQtPnZhOwogCW1lbWNweSgmcmVxLT5zZXRfcGFyYW1zLCBjb25maWdzLCBzaXplb2Yoc3RydWN0IGJlX2ZhdF9jb25mX3BhcmFtcykpOwogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCSAgICAgICBPUENPREVfQ09NTU9OX1NFVF9FWFRfRkFUX0NBUEFCSUxJVEVTLAorCQkJICAgICAgIE9QQ09ERV9DT01NT05fU0VUX0VYVF9GQVRfQ0FQQUJJTElUSUVTLAogCQkJICAgICAgIGNtZC0+c2l6ZSwgd3JiLCBjbWQpOwogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDM3Myw3ICs0MzgyLDcgQEAKIH0KIAogLyogVGhpcyByb3V0aW5lIHJldHVybnMgYSBsaXN0IG9mIGFsbCB0aGUgTklDIFBGX251bXMgaW4gdGhlIGFkYXB0ZXIgKi8KLXUxNiBiZV9nZXRfbmljX3BmX251bV9saXN0KHU4ICpidWYsIHUzMiBkZXNjX2NvdW50LCB1MTYgKm5pY19wZl9udW1zKQorc3RhdGljIHUxNiBiZV9nZXRfbmljX3BmX251bV9saXN0KHU4ICpidWYsIHUzMiBkZXNjX2NvdW50LCB1MTYgKm5pY19wZl9udW1zKQogewogCXN0cnVjdCBiZV9yZXNfZGVzY19oZHIgKmhkciA9IChzdHJ1Y3QgYmVfcmVzX2Rlc2NfaGRyICopYnVmOwogCXN0cnVjdCBiZV9wY2llX3Jlc19kZXNjICpwY2llID0gTlVMTDsKQEAgLTQ1MjUsNyArNDUzNCw3IEBACiB9CiAKIC8qIE1hcmsgYWxsIGZpZWxkcyBpbnZhbGlkICovCi12b2lkIGJlX3Jlc2V0X25pY19kZXNjKHN0cnVjdCBiZV9uaWNfcmVzX2Rlc2MgKm5pYykKK3N0YXRpYyB2b2lkIGJlX3Jlc2V0X25pY19kZXNjKHN0cnVjdCBiZV9uaWNfcmVzX2Rlc2MgKm5pYykKIHsKIAltZW1zZXQobmljLCAwLCBzaXplb2YoKm5pYykpOwogCW5pYy0+dW5pY2FzdF9tYWNfY291bnQgPSAweEZGRkY7CkBAIC00NjUwLDcgKzQ2NTksNyBAQAogCWlmIChpZmFjZSA9PSAweEZGRkZGRkZGKQogCQlyZXR1cm4gLTE7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC00NjY3LDcgKzQ2NzYsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDcwMSw3ICs0NzEwLDcgQEAKIAlzdHJ1Y3QgYmVfY21kX3Jlc3BfZ2V0X2lmYWNlX2xpc3QgKnJlc3A7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTQ3MjIsNyArNDczMSw3IEBACiAJfQogCiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC00ODE2LDcgKzQ4MjUsNyBAQAogCWlmIChCRXhfY2hpcChhZGFwdGVyKSkKIAkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC00ODM0LDcgKzQ4NDMsNyBAQAogCXJlcS0+ZW5hYmxlID0gMTsKIAlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CiBlcnI6Ci0Jc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC00ODk4LDE0ICs0OTA3LDE1IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IF9fYmVfY21kX3NldF9sb2dpY2FsX2xpbmtfY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICAgaW50IGxpbmtfc3RhdGUsIGludCB2ZXJzaW9uLCB1OCBkb21haW4pCitzdGF0aWMgaW50CitfX2JlX2NtZF9zZXRfbG9naWNhbF9saW5rX2NvbmZpZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgaW50IGxpbmtfc3RhdGUsIGludCB2ZXJzaW9uLCB1OCBkb21haW4pCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9zZXRfbGxfbGluayAqcmVxOwogCWludCBzdGF0dXM7CiAKLQlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CkBAIC00OTMxLDcgKzQ5NDEsNyBAQAogCiAJc3RhdHVzID0gYmVfbWNjX25vdGlmeV93YWl0KGFkYXB0ZXIpOwogZXJyOgotCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDk1NCw2ICs0OTY0LDU3IEBACiAJCQkJCQkJICAxLCBkb21haW4pOwogCXJldHVybiBzdGF0dXM7CiB9CisKK2ludCBiZV9jbWRfc2V0X2ZlYXR1cmVzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV9jbWRfcmVzcF9zZXRfZmVhdHVyZXMgKnJlc3A7CisJc3RydWN0IGJlX2NtZF9yZXFfc2V0X2ZlYXR1cmVzICpyZXE7CisJc3RydWN0IGJlX21jY193cmIgKndyYjsKKwlpbnQgc3RhdHVzOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWRhcHRlci0+bWNjX2xvY2spKQorCQlyZXR1cm4gLTE7CisKKwl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOworCWlmICghd3JiKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCisJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAorCQkJICAgICAgIE9QQ09ERV9DT01NT05fU0VUX0ZFQVRVUkVTLAorCQkJICAgICAgIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKKworCXJlcS0+ZmVhdHVyZXMgPSBjcHVfdG9fbGUzMihCRV9GRUFUVVJFX1VFX1JFQ09WRVJZKTsKKwlyZXEtPnBhcmFtZXRlcl9sZW4gPSBjcHVfdG9fbGUzMihzaXplb2Yoc3RydWN0IGJlX3JlcV91ZV9yZWNvdmVyeSkpOworCXJlcS0+cGFyYW1ldGVyLnJlcS51ZXIgPSBjcHVfdG9fbGUzMihCRV9VRV9SRUNPVkVSWV9VRVJfTUFTSyk7CisKKwlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBlcnI7CisKKwlyZXNwID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCisJYWRhcHRlci0+ZXJyb3JfcmVjb3ZlcnkudWVfdG9fcG9sbF90aW1lID0KKwkJbGUxNl90b19jcHUocmVzcC0+cGFyYW1ldGVyLnJlc3AudWUycnApOworCWFkYXB0ZXItPmVycm9yX3JlY292ZXJ5LnVlX3RvX3Jlc2V0X3RpbWUgPQorCQlsZTE2X3RvX2NwdShyZXNwLT5wYXJhbWV0ZXIucmVzcC51ZTJzcik7CisJYWRhcHRlci0+ZXJyb3JfcmVjb3ZlcnkucmVjb3Zlcnlfc3VwcG9ydGVkID0gdHJ1ZTsKK2VycjoKKwkvKiBDaGVja2luZyAiTUNDX1NUQVRVU19JTlZBTElEX0xFTkdUSCIgZm9yIFNLSCBhcyBGVworCSAqIHJldHVybnMgdGhpcyBlcnJvciBpbiBvbGRlciBmaXJtd2FyZSB2ZXJzaW9ucworCSAqLworCWlmIChiYXNlX3N0YXR1cyhzdGF0dXMpID09IE1DQ19TVEFUVVNfSUxMRUdBTF9SRVFVRVNUIHx8CisJICAgIGJhc2Vfc3RhdHVzKHN0YXR1cykgPT0gTUNDX1NUQVRVU19JTlZBTElEX0xFTkdUSCkKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSAiQWRhcHRlciBkb2VzIG5vdCBzdXBwb3J0IEhXIGVycm9yIHJlY292ZXJ5XG4iKTsKKworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKIGludCBiZV9yb2NlX21jY19jbWQodm9pZCAqbmV0ZGV2X2hhbmRsZSwgdm9pZCAqd3JiX3BheWxvYWQsCiAJCSAgICBpbnQgd3JiX3BheWxvYWRfc2l6ZSwgdTE2ICpjbWRfc3RhdHVzLCB1MTYgKmV4dF9zdGF0dXMpCiB7CkBAIC00OTY0LDcgKzUwMjUsNyBAQAogCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgKnJlc3A7CiAJaW50IHN0YXR1czsKIAotCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2xvY2soJmFkYXB0ZXItPm1jY19sb2NrKTsKIAogCXdyYiA9IHdyYl9mcm9tX21jY3EoYWRhcHRlcik7CiAJaWYgKCF3cmIpIHsKQEAgLTQ5ODcsNyArNTA0OCw3IEBACiAJbWVtY3B5KHdyYl9wYXlsb2FkLCByZXNwLCBzaXplb2YoKnJlc3ApICsgcmVzcC0+cmVzcG9uc2VfbGVuZ3RoKTsKIAliZV9kd3NfbGVfdG9fY3B1KHdyYl9wYXlsb2FkLCBzaXplb2YoKnJlc3ApICsgcmVzcC0+cmVzcG9uc2VfbGVuZ3RoKTsKIGVycjoKLQlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWNjX2xvY2spOwogCXJldHVybiBzdGF0dXM7CiB9CiBFWFBPUlRfU1lNQk9MKGJlX3JvY2VfbWNjX2NtZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuaAppbmRleCAwZDZiZTIyLi4xYmQ4MmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmgKQEAgLTU4LDcgKzU4LDggQEAKIAlNQ0NfU1RBVFVTX0lOU1VGRklDSUVOVF9CVUZGRVIgPSA0LAogCU1DQ19TVEFUVVNfVU5BVVRIT1JJWkVEX1JFUVVFU1QgPSA1LAogCU1DQ19TVEFUVVNfTk9UX1NVUFBPUlRFRCA9IDY2LAotCU1DQ19TVEFUVVNfRkVBVFVSRV9OT1RfU1VQUE9SVEVEID0gNjgKKwlNQ0NfU1RBVFVTX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCA9IDY4LAorCU1DQ19TVEFUVVNfSU5WQUxJRF9MRU5HVEggPSAxMTYKIH07CiAKIC8qIEFkZGl0aW9uYWwgc3RhdHVzICovCkBAIC0yOTQsOCArMjk1LDggQEAKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfUEhZX0RFVEFJTFMJCQkxMDIKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfRFJJVkVSX0ZVTkNUSU9OX0NBUAkJMTAzCiAjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0NOVExfQURESVRJT05BTF9BVFRSSUJVVEVTCTEyMQotI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9FWFRfRkFUX0NBUEFCSUxJVEVTCQkxMjUKLSNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfRVhUX0ZBVF9DQVBBQklMSVRFUwkJMTI2CisjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0VYVF9GQVRfQ0FQQUJJTElUSUVTCQkxMjUKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfRVhUX0ZBVF9DQVBBQklMSVRJRVMJCTEyNgogI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9NQUNfTElTVAkJCTE0NwogI2RlZmluZSBPUENPREVfQ09NTU9OX1NFVF9NQUNfTElTVAkJCTE0OAogI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9IU1dfQ09ORklHCQkJMTUyCkBAIC0zMDgsNiArMzA5LDcgQEAKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9SRUFEX09CSkVDVAkJCTE3MQogI2RlZmluZSBPUENPREVfQ09NTU9OX1dSSVRFX09CSkVDVAkJCTE3MgogI2RlZmluZSBPUENPREVfQ09NTU9OX0RFTEVURV9PQkpFQ1QJCQkxNzQKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfRkVBVFVSRVMJCQkxOTEKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9NQU5BR0VfSUZBQ0VfRklMVEVSUwkJMTkzCiAjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX0lGQUNFX0xJU1QJCQkxOTQKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9FTkFCTEVfRElTQUJMRV9WRgkJCTE5NgpAQCAtMjMxNSw2ICsyMzE3LDQxIEBACiAJc3RydWN0IGJlX2lmX2Rlc2MgaWZfZGVzYzsKIH07CiAKKy8qKioqKioqKioqKioqKiBTZXQgRmVhdHVyZXMgKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUJQkVfRkVBVFVSRV9VRV9SRUNPVkVSWQkJMHgxMAorI2RlZmluZQlCRV9VRV9SRUNPVkVSWV9VRVJfTUFTSwkJMHgxCisKK3N0cnVjdCBiZV9yZXFfdWVfcmVjb3ZlcnkgeworCXUzMgl1ZXI7CisJdTMyCXJzdmQ7Cit9OworCitzdHJ1Y3QgYmVfY21kX3JlcV9zZXRfZmVhdHVyZXMgeworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciBoZHI7CisJdTMyIGZlYXR1cmVzOworCXUzMiBwYXJhbWV0ZXJfbGVuOworCXVuaW9uIHsKKwkJc3RydWN0IGJlX3JlcV91ZV9yZWNvdmVyeSByZXE7CisJCXUzMiByc3ZkWzJdOworCX0gcGFyYW1ldGVyOworfTsKKworc3RydWN0IGJlX3Jlc3BfdWVfcmVjb3ZlcnkgeworCXUzMiB1ZXI7CisJdTE2IHVlMnJwOworCXUxNiB1ZTJzcjsKK307CisKK3N0cnVjdCBiZV9jbWRfcmVzcF9zZXRfZmVhdHVyZXMgeworCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgaGRyOworCXUzMiBmZWF0dXJlczsKKwl1MzIgcGFyYW1ldGVyX2xlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBiZV9yZXNwX3VlX3JlY292ZXJ5IHJlc3A7CisJCXUzMiByc3ZkWzJdOworCX0gcGFyYW1ldGVyOworfTsKKwogLyoqKioqKioqKioqKioqKiBTZXQgbG9naWNhbCBsaW5rICoqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBQTElOS19FTkFCTEUgICAgICAgICAgICBCSVQoMCkKICNkZWZpbmUgUExJTktfVFJBQ0sgICAgICAgICAgICAgQklUKDgpCkBAIC0yMzQzLDYgKzIzODAsNyBAQAogCXUzMiBjYXBfY29udHJvbF9mbGFnczsKIH0gX19wYWNrZWQ7CiAKK3UxNiBiZV9QT1NUX3N0YWdlX2dldChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgYmVfcGNpX2ZudW1fZ2V0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKIGludCBiZV9md193YWl0X3JlYWR5KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKIGludCBiZV9jbWRfbWFjX2FkZHJfcXVlcnkoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICptYWNfYWRkciwKQEAgLTI0NzAsMyArMjUwOCw0IEBACiBpbnQgYmVfY21kX3NldF9zcmlvdl9jb25maWcoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkgICAgc3RydWN0IGJlX3Jlc291cmNlcyByZXMsIHUxNiBudW1fdmZzLAogCQkJICAgIHN0cnVjdCBiZV9yZXNvdXJjZXMgKnZmdF9yZXMpOworaW50IGJlX2NtZF9zZXRfZmVhdHVyZXMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ldGh0b29sLmMKaW5kZXggNTBlN2JlNS4uMGE0OGEzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfZXRodG9vbC5jCkBAIC00MjEsNiArNDIxLDEwIEBACiAJfQogfQogCitzdGF0aWMgY29uc3QgY2hhciBiZV9wcml2X2ZsYWdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwkiZGlzYWJsZS10cGUtcmVjb3ZlcnkiCit9OworCiBzdGF0aWMgdm9pZCBiZV9nZXRfc3RhdF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHVpbnQzMl90IHN0cmluZ3NldCwKIAkJCQl1aW50OF90ICpkYXRhKQogewpAQCAtNDU0LDYgKzQ1OCwxMCBAQAogCQkJZGF0YSArPSBFVEhfR1NUUklOR19MRU47CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBFVEhfU1NfUFJJVl9GTEFHUzoKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmVfcHJpdl9mbGFncyk7IGkrKykKKwkJCXN0cmNweShkYXRhICsgaSAqIEVUSF9HU1RSSU5HX0xFTiwgYmVfcHJpdl9mbGFnc1tpXSk7CisJCWJyZWFrOwogCX0KIH0KIApAQCAtNDY4LDYgKzQ3Niw4IEBACiAJCXJldHVybiBFVEhUT09MX1NUQVRTX05VTSArCiAJCQlhZGFwdGVyLT5udW1fcnhfcXMgKiBFVEhUT09MX1JYU1RBVFNfTlVNICsKIAkJCWFkYXB0ZXItPm51bV90eF9xcyAqIEVUSFRPT0xfVFhTVEFUU19OVU07CisJY2FzZSBFVEhfU1NfUFJJVl9GTEFHUzoKKwkJcmV0dXJuIEFSUkFZX1NJWkUoYmVfcHJpdl9mbGFncyk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTM2MCw2ICsxMzcwLDM0IEBACiAJcmV0dXJuIGJlX2NtZF9zdGF0dXMoc3RhdHVzKTsKIH0KIAorc3RhdGljIHUzMiBiZV9nZXRfcHJpdl9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXJldHVybiBhZGFwdGVyLT5wcml2X2ZsYWdzOworfQorCitzdGF0aWMgaW50IGJlX3NldF9wcml2X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJYm9vbCB0cGVfb2xkID0gISEoYWRhcHRlci0+cHJpdl9mbGFncyAmIEJFX0RJU0FCTEVfVFBFX1JFQ09WRVJZKTsKKwlib29sIHRwZV9uZXcgPSAhIShmbGFncyAmIEJFX0RJU0FCTEVfVFBFX1JFQ09WRVJZKTsKKworCWlmICh0cGVfb2xkICE9IHRwZV9uZXcpIHsKKwkJaWYgKHRwZV9uZXcpIHsKKwkJCWFkYXB0ZXItPnByaXZfZmxhZ3MgfD0gQkVfRElTQUJMRV9UUEVfUkVDT1ZFUlk7CisJCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSAiSFcgZXJyb3IgcmVjb3ZlcnkgaXMgZGlzYWJsZWRcbiIpOworCQl9IGVsc2UgeworCQkJYWRhcHRlci0+cHJpdl9mbGFncyAmPSB+QkVfRElTQUJMRV9UUEVfUkVDT1ZFUlk7CisJCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSAiSFcgZXJyb3IgcmVjb3ZlcnkgaXMgZW5hYmxlZFxuIik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwogY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGJlX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MgPSBiZV9nZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvID0gYmVfZ2V0X2RydmluZm8sCkBAIC0xMzczLDYgKzE0MTEsOCBAQAogCS5nZXRfcmluZ3BhcmFtID0gYmVfZ2V0X3JpbmdwYXJhbSwKIAkuZ2V0X3BhdXNlcGFyYW0gPSBiZV9nZXRfcGF1c2VwYXJhbSwKIAkuc2V0X3BhdXNlcGFyYW0gPSBiZV9zZXRfcGF1c2VwYXJhbSwKKwkuc2V0X3ByaXZfZmxhZ3MgPSBiZV9zZXRfcHJpdl9mbGFncywKKwkuZ2V0X3ByaXZfZmxhZ3MgPSBiZV9nZXRfcHJpdl9mbGFncywKIAkuZ2V0X3N0cmluZ3MgPSBiZV9nZXRfc3RhdF9zdHJpbmdzLAogCS5zZXRfcGh5c19pZCA9IGJlX3NldF9waHlzX2lkLAogCS5zZXRfZHVtcCA9IGJlX3NldF9kdW1wLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2h3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfaHcuaAppbmRleCBjNjg0YmIzLi45Mjk0MmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfaHcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfaHcuaApAQCAtMzIsMTggKzMyLDIzIEBACiAjZGVmaW5lIE1QVV9FUF9DT05UUk9MIAkJMAogCiAvKioqKioqKioqKiBNUFUgc2VtcGhvcmU6IHVzZWQgZm9yIFNIICYgQkUgICoqKioqKioqKioqKiovCisjZGVmaW5lIFNMSVBPUlRfU09GVFJFU0VUX09GRlNFVAkJMHg1YwkvKiBDU1IgQkFSIG9mZnNldCAqLwogI2RlZmluZSBTTElQT1JUX1NFTUFQSE9SRV9PRkZTRVRfQkV4CQkweGFjICAvKiBDU1IgQkFSIG9mZnNldCAqLwogI2RlZmluZSBTTElQT1JUX1NFTUFQSE9SRV9PRkZTRVRfU0gJCTB4OTQgIC8qIFBDSS1DRkcgb2Zmc2V0ICovCiAjZGVmaW5lIFBPU1RfU1RBR0VfTUFTSwkJCQkweDAwMDBGRkZGCiAjZGVmaW5lIFBPU1RfRVJSX01BU0sJCQkJMHgxCiAjZGVmaW5lIFBPU1RfRVJSX1NISUZUCQkJCTMxCisjZGVmaW5lIFBPU1RfRVJSX1JFQ09WRVJZX0NPREVfTUFTSwkJMHhGRkYKKworLyogU29mdCBSZXNldCByZWdpc3RlciBtYXNrcyAqLworI2RlZmluZSBTTElQT1JUX1NPRlRSRVNFVF9TUl9NQVNLCQkweDAwMDAwMDgwCS8qIFNSIGJpdCAqLwogCiAvKiBNUFUgc2VtcGhvcmUgUE9TVCBzdGFnZSB2YWx1ZXMgKi8KICNkZWZpbmUgUE9TVF9TVEFHRV9BV0FJVElOR19IT1NUX1JEWSAJMHgxIC8qIEZXIGF3YWl0aW5nIGdvYWhlYWQgZnJvbSBob3N0ICovCiAjZGVmaW5lIFBPU1RfU1RBR0VfSE9TVF9SRFkgCQkweDIgLyogSG9zdCBoYXMgZ2l2ZW4gZ28tYWhlZCB0byBGVyAqLwogI2RlZmluZSBQT1NUX1NUQUdFX0JFX1JFU0VUCQkweDMgLyogSG9zdCB3YW50cyB0byByZXNldCBjaGlwICovCiAjZGVmaW5lIFBPU1RfU1RBR0VfQVJNRldfUkRZCQkweGMwMDAJLyogRlcgaXMgZG9uZSB3aXRoIFBPU1QgKi8KLQorI2RlZmluZSBQT1NUX1NUQUdFX1JFQ09WRVJBQkxFX0VSUgkweEUwMDAJLyogUmVjb3ZlcmFibGUgZXJyIGRldGVjdGVkICovCiAKIC8qIExhbmNlciBTTElQT1JUIHJlZ2lzdGVycyAqLwogI2RlZmluZSBTTElQT1JUX1NUQVRVU19PRkZTRVQJCTB4NDA0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX21haW4uYwppbmRleCA4NzRjNzUzLi5kY2I5MzBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9tYWluLmMKQEAgLTQxLDYgKzQxLDExIEBACiBtb2R1bGVfcGFyYW0ocnhfZnJhZ19zaXplLCB1c2hvcnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhyeF9mcmFnX3NpemUsICJTaXplIG9mIGEgZnJhZ21lbnQgdGhhdCBob2xkcyByY3ZkIGRhdGEuIik7CiAKKy8qIFBlci1tb2R1bGUgZXJyb3IgZGV0ZWN0aW9uL3JlY292ZXJ5IHdvcmtxIHNoYXJlZCBhY3Jvc3MgYWxsIGZ1bmN0aW9ucy4KKyAqIEVhY2ggZnVuY3Rpb24gc2NoZWR1bGVzIGl0cyBvd24gd29yayByZXF1ZXN0IG9uIHRoaXMgc2hhcmVkIHdvcmtxLgorICovCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJlX2Vycl9yZWNvdmVyeV93b3JrcTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJlX2Rldl9pZHNbXSA9IHsKIAl7IFBDSV9ERVZJQ0UoQkVfVkVORE9SX0lELCBCRV9ERVZJQ0VfSUQxKSB9LAogCXsgUENJX0RFVklDRShCRV9WRU5ET1JfSUQsIEJFX0RFVklDRV9JRDIpIH0sCkBAIC01Myw2ICs1OCwxMCBAQAogCXsgMCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJlX2Rldl9pZHMpOworCisvKiBXb3JrcXVldWUgdXNlZCBieSBhbGwgZnVuY3Rpb25zIGZvciBkZWZlcmluZyBjbWQgY2FsbHMgdG8gdGhlIGFkYXB0ZXIgKi8KK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYmVfd3E7CisKIC8qIFVFIFN0YXR1cyBMb3cgQ1NSICovCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVlX3N0YXR1c19sb3dfZGVzY1tdID0gewogCSJDRVYiLApAQCAtMjYwLDYgKzI2OSwzOCBAQAogCWlvd3JpdGUzMih2YWwsIGFkYXB0ZXItPmRiICsgREJfQ1FfT0ZGU0VUKTsKIH0KIAorc3RhdGljIGludCBiZV9kZXZfbWFjX2FkZChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKm1hYykKK3sKKwlpbnQgaTsKKworCS8qIENoZWNrIGlmIG1hYyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIGFzIHBhcnQgb2YgdWMtbGlzdCAqLworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT51Y19tYWNzOyBpKyspIHsKKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWwoKHU4ICopJmFkYXB0ZXItPnVjX2xpc3RbaSAqIEVUSF9BTEVOXSwKKwkJCQkgICAgIG1hYykpIHsKKwkJCS8qIG1hYyBhbHJlYWR5IGFkZGVkLCBza2lwIGFkZGl0aW9uICovCisJCQlhZGFwdGVyLT5wbWFjX2lkWzBdID0gYWRhcHRlci0+cG1hY19pZFtpICsgMV07CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiBiZV9jbWRfcG1hY19hZGQoYWRhcHRlciwgbWFjLCBhZGFwdGVyLT5pZl9oYW5kbGUsCisJCQkgICAgICAgJmFkYXB0ZXItPnBtYWNfaWRbMF0sIDApOworfQorCitzdGF0aWMgdm9pZCBiZV9kZXZfbWFjX2RlbChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgaW50IHBtYWNfaWQpCit7CisJaW50IGk7CisKKwkvKiBTa2lwIGRlbGV0aW9uIGlmIHRoZSBwcm9ncmFtbWVkIG1hYyBpcworCSAqIGJlaW5nIHVzZWQgaW4gdWMtbGlzdAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT51Y19tYWNzOyBpKyspIHsKKwkJaWYgKGFkYXB0ZXItPnBtYWNfaWRbaSArIDFdID09IHBtYWNfaWQpCisJCQlyZXR1cm47CisJfQorCWJlX2NtZF9wbWFjX2RlbChhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsIHBtYWNfaWQsIDApOworfQorCiBzdGF0aWMgaW50IGJlX21hY19hZGRyX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpwKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTI2Nyw3ICszMDgsNyBAQAogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CiAJaW50IHN0YXR1czsKIAl1OCBtYWNbRVRIX0FMRU5dOwotCXUzMiBvbGRfcG1hY19pZCA9IGFkYXB0ZXItPnBtYWNfaWRbMF0sIGN1cnJfcG1hY19pZCA9IDA7CisJdTMyIG9sZF9wbWFjX2lkID0gYWRhcHRlci0+cG1hY19pZFswXTsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwpAQCAtMjc1LDcgKzMxNiw3IEBACiAJLyogUHJvY2VlZCBmdXJ0aGVyIG9ubHkgaWYsIFVzZXIgcHJvdmlkZWQgTUFDIGlzIGRpZmZlcmVudAogCSAqIGZyb20gYWN0aXZlIE1BQwogCSAqLwotCWlmIChldGhlcl9hZGRyX2VxdWFsKGFkZHItPnNhX2RhdGEsIG5ldGRldi0+ZGV2X2FkZHIpKQorCWlmIChldGhlcl9hZGRyX2VxdWFsKGFkZHItPnNhX2RhdGEsIGFkYXB0ZXItPmRldl9tYWMpKQogCQlyZXR1cm4gMDsKIAogCS8qIGlmIGRldmljZSBpcyBub3QgcnVubmluZywgY29weSBNQUMgdG8gbmV0ZGV2LT5kZXZfYWRkciAqLwpAQCAtMjg4LDIzICszMjksMjIgQEAKIAkgKiBGSUxUTUdNVCBwcml2aWxlZ2UuIFRoaXMgZmFpbHVyZSBpcyBPSywgb25seSBpZiB0aGUgUEYgcHJvZ3JhbW1lZAogCSAqIHRoZSBNQUMgZm9yIHRoZSBWRi4KIAkgKi8KLQlzdGF0dXMgPSBiZV9jbWRfcG1hY19hZGQoYWRhcHRlciwgKHU4ICopYWRkci0+c2FfZGF0YSwKLQkJCQkgYWRhcHRlci0+aWZfaGFuZGxlLCAmYWRhcHRlci0+cG1hY19pZFswXSwgMCk7CisJbXV0ZXhfbG9jaygmYWRhcHRlci0+cnhfZmlsdGVyX2xvY2spOworCXN0YXR1cyA9IGJlX2Rldl9tYWNfYWRkKGFkYXB0ZXIsICh1OCAqKWFkZHItPnNhX2RhdGEpOwogCWlmICghc3RhdHVzKSB7Ci0JCWN1cnJfcG1hY19pZCA9IGFkYXB0ZXItPnBtYWNfaWRbMF07CiAKIAkJLyogRGVsZXRlIHRoZSBvbGQgcHJvZ3JhbW1lZCBNQUMuIFRoaXMgY2FsbCBtYXkgZmFpbCBpZiB0aGUKIAkJICogb2xkIE1BQyB3YXMgYWxyZWFkeSBkZWxldGVkIGJ5IHRoZSBQRiBkcml2ZXIuCiAJCSAqLwogCQlpZiAoYWRhcHRlci0+cG1hY19pZFswXSAhPSBvbGRfcG1hY19pZCkKLQkJCWJlX2NtZF9wbWFjX2RlbChhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsCi0JCQkJCW9sZF9wbWFjX2lkLCAwKTsKKwkJCWJlX2Rldl9tYWNfZGVsKGFkYXB0ZXIsIG9sZF9wbWFjX2lkKTsKIAl9CiAKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPnJ4X2ZpbHRlcl9sb2NrKTsKIAkvKiBEZWNpZGUgaWYgdGhlIG5ldyBNQUMgaXMgc3VjY2Vzc2Z1bGx5IGFjdGl2YXRlZCBvbmx5IGFmdGVyCiAJICogcXVlcnlpbmcgdGhlIEZXCiAJICovCi0Jc3RhdHVzID0gYmVfY21kX2dldF9hY3RpdmVfbWFjKGFkYXB0ZXIsIGN1cnJfcG1hY19pZCwgbWFjLAorCXN0YXR1cyA9IGJlX2NtZF9nZXRfYWN0aXZlX21hYyhhZGFwdGVyLCBhZGFwdGVyLT5wbWFjX2lkWzBdLCBtYWMsCiAJCQkJICAgICAgIGFkYXB0ZXItPmlmX2hhbmRsZSwgdHJ1ZSwgMCk7CiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnI7CkBAIC0zMTcsNiArMzU3LDcgQEAKIAkJZ290byBlcnI7CiAJfQogZG9uZToKKwlldGhlcl9hZGRyX2NvcHkoYWRhcHRlci0+ZGV2X21hYywgYWRkci0+c2FfZGF0YSk7CiAJZXRoZXJfYWRkcl9jb3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEpOwogCWRldl9pbmZvKGRldiwgIk1BQyBhZGRyZXNzIGNoYW5nZWQgdG8gJXBNXG4iLCBhZGRyLT5zYV9kYXRhKTsKIAlyZXR1cm4gMDsKQEAgLTE0MjAsMTMgKzE0NjEsMTggQEAKIAl1MTYgbnVtID0gMCwgaSA9IDA7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQkvKiBObyBuZWVkIHRvIGZ1cnRoZXIgY29uZmlndXJlIHZpZHMgaWYgaW4gcHJvbWlzY3VvdXMgbW9kZSAqLwotCWlmIChiZV9pbl9hbGxfcHJvbWlzYyhhZGFwdGVyKSkKKwkvKiBObyBuZWVkIHRvIGNoYW5nZSB0aGUgVkxBTiBzdGF0ZSBpZiB0aGUgSS9GIGlzIGluIHByb21pc2N1b3VzICovCisJaWYgKGFkYXB0ZXItPm5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykKIAkJcmV0dXJuIDA7CiAKIAlpZiAoYWRhcHRlci0+dmxhbnNfYWRkZWQgPiBiZV9tYXhfdmxhbnMoYWRhcHRlcikpCiAJCXJldHVybiBiZV9zZXRfdmxhbl9wcm9taXNjKGFkYXB0ZXIpOwogCisJaWYgKGFkYXB0ZXItPmlmX2ZsYWdzICYgQkVfSUZfRkxBR1NfVkxBTl9QUk9NSVNDVU9VUykgeworCQlzdGF0dXMgPSBiZV9jbGVhcl92bGFuX3Byb21pc2MoYWRhcHRlcik7CisJCWlmIChzdGF0dXMpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KIAkvKiBDb25zdHJ1Y3QgVkxBTiBUYWJsZSB0byBnaXZlIHRvIEhXICovCiAJZm9yX2VhY2hfc2V0X2JpdChpLCBhZGFwdGVyLT52aWRzLCBWTEFOX05fVklEKQogCQl2aWRzW251bSsrXSA9IGNwdV90b19sZTE2KGkpOwpAQCAtMTQzOSw4ICsxNDg1LDYgQEAKIAkJICAgIGFkZGxfc3RhdHVzKHN0YXR1cykgPT0KIAkJCQlNQ0NfQURETF9TVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUykKIAkJCXJldHVybiBiZV9zZXRfdmxhbl9wcm9taXNjKGFkYXB0ZXIpOwotCX0gZWxzZSBpZiAoYWRhcHRlci0+aWZfZmxhZ3MgJiBCRV9JRl9GTEFHU19WTEFOX1BST01JU0NVT1VTKSB7Ci0JCXN0YXR1cyA9IGJlX2NsZWFyX3ZsYW5fcHJvbWlzYyhhZGFwdGVyKTsKIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE0NTAsNDYgKzE0OTQsNDUgQEAKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IHN0YXR1cyA9IDA7CiAKKwltdXRleF9sb2NrKCZhZGFwdGVyLT5yeF9maWx0ZXJfbG9jayk7CisKIAkvKiBQYWNrZXRzIHdpdGggVklEIDAgYXJlIGFsd2F5cyByZWNlaXZlZCBieSBMYW5jZXIgYnkgZGVmYXVsdCAqLwogCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSAmJiB2aWQgPT0gMCkKLQkJcmV0dXJuIHN0YXR1czsKKwkJZ290byBkb25lOwogCiAJaWYgKHRlc3RfYml0KHZpZCwgYWRhcHRlci0+dmlkcykpCi0JCXJldHVybiBzdGF0dXM7CisJCWdvdG8gZG9uZTsKIAogCXNldF9iaXQodmlkLCBhZGFwdGVyLT52aWRzKTsKIAlhZGFwdGVyLT52bGFuc19hZGRlZCsrOwogCiAJc3RhdHVzID0gYmVfdmlkX2NvbmZpZyhhZGFwdGVyKTsKLQlpZiAoc3RhdHVzKSB7Ci0JCWFkYXB0ZXItPnZsYW5zX2FkZGVkLS07Ci0JCWNsZWFyX2JpdCh2aWQsIGFkYXB0ZXItPnZpZHMpOwotCX0KLQorZG9uZToKKwltdXRleF91bmxvY2soJmFkYXB0ZXItPnJ4X2ZpbHRlcl9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgaW50IGJlX3ZsYW5fcmVtX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBfX2JlMTYgcHJvdG8sIHUxNiB2aWQpCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBzdGF0dXMgPSAwOworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+cnhfZmlsdGVyX2xvY2spOwogCiAJLyogUGFja2V0cyB3aXRoIFZJRCAwIGFyZSBhbHdheXMgcmVjZWl2ZWQgYnkgTGFuY2VyIGJ5IGRlZmF1bHQgKi8KIAlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikgJiYgdmlkID09IDApCi0JCXJldHVybiAwOworCQlnb3RvIGRvbmU7CiAKIAlpZiAoIXRlc3RfYml0KHZpZCwgYWRhcHRlci0+dmlkcykpCi0JCXJldHVybiAwOworCQlnb3RvIGRvbmU7CiAKIAljbGVhcl9iaXQodmlkLCBhZGFwdGVyLT52aWRzKTsKIAlhZGFwdGVyLT52bGFuc19hZGRlZC0tOwogCi0JcmV0dXJuIGJlX3ZpZF9jb25maWcoYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJlX2NsZWFyX2FsbF9wcm9taXNjKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQotewotCWJlX2NtZF9yeF9maWx0ZXIoYWRhcHRlciwgQkVfSUZfRkxBR1NfQUxMX1BST01JU0NVT1VTLCBPRkYpOwotCWFkYXB0ZXItPmlmX2ZsYWdzICY9IH5CRV9JRl9GTEFHU19BTExfUFJPTUlTQ1VPVVM7CisJc3RhdHVzID0gYmVfdmlkX2NvbmZpZyhhZGFwdGVyKTsKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5yeF9maWx0ZXJfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIHZvaWQgYmVfc2V0X2FsbF9wcm9taXNjKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQpAQCAtMTUxMCw3NSArMTU1MywyMjYgQEAKIAkJYWRhcHRlci0+aWZfZmxhZ3MgfD0gQkVfSUZfRkxBR1NfTUNBU1RfUFJPTUlTQ1VPVVM7CiB9CiAKLXN0YXRpYyB2b2lkIGJlX3NldF9tY19saXN0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgYmVfc2V0X3VjX3Byb21pc2Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IHN0YXR1czsKIAotCXN0YXR1cyA9IGJlX2NtZF9yeF9maWx0ZXIoYWRhcHRlciwgQkVfSUZfRkxBR1NfTVVMVElDQVNULCBPTik7CisJaWYgKGFkYXB0ZXItPmlmX2ZsYWdzICYgQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVMpCisJCXJldHVybjsKKworCXN0YXR1cyA9IGJlX2NtZF9yeF9maWx0ZXIoYWRhcHRlciwgQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVMsIE9OKTsKIAlpZiAoIXN0YXR1cykKLQkJYWRhcHRlci0+aWZfZmxhZ3MgJj0gfkJFX0lGX0ZMQUdTX01DQVNUX1BST01JU0NVT1VTOwotCWVsc2UKKwkJYWRhcHRlci0+aWZfZmxhZ3MgfD0gQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVM7Cit9CisKK3N0YXRpYyB2b2lkIGJlX2NsZWFyX3VjX3Byb21pc2Moc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHN0YXR1czsKKworCWlmICghKGFkYXB0ZXItPmlmX2ZsYWdzICYgQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVMpKQorCQlyZXR1cm47CisKKwlzdGF0dXMgPSBiZV9jbWRfcnhfZmlsdGVyKGFkYXB0ZXIsIEJFX0lGX0ZMQUdTX1BST01JU0NVT1VTLCBPRkYpOworCWlmICghc3RhdHVzKQorCQlhZGFwdGVyLT5pZl9mbGFncyAmPSB+QkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVM7Cit9CisKKy8qIFRoZSBiZWxvdyAyIGZ1bmN0aW9ucyBhcmUgdGhlIGNhbGxiYWNrIGFyZ3MgZm9yIF9fZGV2X21jX3N5bmMvZGV2X3VjX3N5bmMoKS4KKyAqIFdlIHVzZSBhIHNpbmdsZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgYm90aCBzeW5jIGFuZCB1bnN5bmMuIFdlIHJlYWxseSBkb24ndAorICogYWRkL3JlbW92ZSBhZGRyZXNzZXMgdGhyb3VnaCB0aGlzIGNhbGxiYWNrLiBCdXQsIHdlIHVzZSBpdCB0byBkZXRlY3QgY2hhbmdlcworICogdG8gdGhlIHVjL21jIGxpc3RzLiBUaGUgZW50aXJlIHVjL21jIGxpc3QgaXMgcHJvZ3JhbW1lZCBpbiBiZV9zZXRfcnhfbW9kZSgpLgorICovCitzdGF0aWMgaW50IGJlX3VjX2xpc3RfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJYWRhcHRlci0+dXBkYXRlX3VjX2xpc3QgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJlX21jX2xpc3RfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIpCit7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJYWRhcHRlci0+dXBkYXRlX21jX2xpc3QgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZV9zZXRfbWNfbGlzdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisJYm9vbCBtY19wcm9taXNjID0gZmFsc2U7CisJaW50IHN0YXR1czsKKworCW5ldGlmX2FkZHJfbG9ja19iaChuZXRkZXYpOworCV9fZGV2X21jX3N5bmMobmV0ZGV2LCBiZV9tY19saXN0X3VwZGF0ZSwgYmVfbWNfbGlzdF91cGRhdGUpOworCisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlhZGFwdGVyLT51cGRhdGVfbWNfbGlzdCA9IGZhbHNlOworCX0gZWxzZSBpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSB8fAorCQkgICBuZXRkZXZfbWNfY291bnQobmV0ZGV2KSA+IGJlX21heF9tYyhhZGFwdGVyKSkgeworCQkvKiBFbmFibGUgbXVsdGljYXN0IHByb21pc2MgaWYgbnVtIGNvbmZpZ3VyZWQgZXhjZWVkcworCQkgKiB3aGF0IHdlIHN1cHBvcnQKKwkJICovCisJCW1jX3Byb21pc2MgPSB0cnVlOworCQlhZGFwdGVyLT51cGRhdGVfbWNfbGlzdCA9IGZhbHNlOworCX0gZWxzZSBpZiAoYWRhcHRlci0+aWZfZmxhZ3MgJiBCRV9JRl9GTEFHU19NQ0FTVF9QUk9NSVNDVU9VUykgeworCQkvKiBVcGRhdGUgbWMtbGlzdCB1bmNvbmRpdGlvbmFsbHkgaWYgdGhlIGlmYWNlIHdhcyBwcmV2aW91c2x5CisJCSAqIGluIG1jLXByb21pc2MgbW9kZSBhbmQgbm93IGlzIG91dCBvZiB0aGF0IG1vZGUuCisJCSAqLworCQlhZGFwdGVyLT51cGRhdGVfbWNfbGlzdCA9IHRydWU7CisJfQorCisJaWYgKGFkYXB0ZXItPnVwZGF0ZV9tY19saXN0KSB7CisJCWludCBpID0gMDsKKworCQkvKiBjYWNoZSB0aGUgbWMtbGlzdCBpbiBhZGFwdGVyICovCisJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBuZXRkZXYpIHsKKwkJCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT5tY19saXN0W2ldLm1hYywgaGEtPmFkZHIpOworCQkJaSsrOworCQl9CisJCWFkYXB0ZXItPm1jX2NvdW50ID0gbmV0ZGV2X21jX2NvdW50KG5ldGRldik7CisJfQorCW5ldGlmX2FkZHJfdW5sb2NrX2JoKG5ldGRldik7CisKKwlpZiAobWNfcHJvbWlzYykgewogCQliZV9zZXRfbWNfcHJvbWlzYyhhZGFwdGVyKTsKKwl9IGVsc2UgaWYgKGFkYXB0ZXItPnVwZGF0ZV9tY19saXN0KSB7CisJCXN0YXR1cyA9IGJlX2NtZF9yeF9maWx0ZXIoYWRhcHRlciwgQkVfSUZfRkxBR1NfTVVMVElDQVNULCBPTik7CisJCWlmICghc3RhdHVzKQorCQkJYWRhcHRlci0+aWZfZmxhZ3MgJj0gfkJFX0lGX0ZMQUdTX01DQVNUX1BST01JU0NVT1VTOworCQllbHNlCisJCQliZV9zZXRfbWNfcHJvbWlzYyhhZGFwdGVyKTsKKworCQlhZGFwdGVyLT51cGRhdGVfbWNfbGlzdCA9IGZhbHNlOworCX0KK30KKworc3RhdGljIHZvaWQgYmVfY2xlYXJfbWNfbGlzdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJX19kZXZfbWNfdW5zeW5jKG5ldGRldiwgTlVMTCk7CisJYmVfY21kX3J4X2ZpbHRlcihhZGFwdGVyLCBCRV9JRl9GTEFHU19NVUxUSUNBU1QsIE9GRik7CisJYWRhcHRlci0+bWNfY291bnQgPSAwOworfQorCitzdGF0aWMgaW50IGJlX3VjX21hY19hZGQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCB1Y19pZHgpCit7CisJaWYgKGV0aGVyX2FkZHJfZXF1YWwoKHU4ICopJmFkYXB0ZXItPnVjX2xpc3RbdWNfaWR4ICogRVRIX0FMRU5dLAorCQkJICAgICBhZGFwdGVyLT5kZXZfbWFjKSkgeworCQlhZGFwdGVyLT5wbWFjX2lkW3VjX2lkeCArIDFdID0gYWRhcHRlci0+cG1hY19pZFswXTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGJlX2NtZF9wbWFjX2FkZChhZGFwdGVyLAorCQkJICAgICAgICh1OCAqKSZhZGFwdGVyLT51Y19saXN0W3VjX2lkeCAqIEVUSF9BTEVOXSwKKwkJCSAgICAgICBhZGFwdGVyLT5pZl9oYW5kbGUsCisJCQkgICAgICAgJmFkYXB0ZXItPnBtYWNfaWRbdWNfaWR4ICsgMV0sIDApOworfQorCitzdGF0aWMgdm9pZCBiZV91Y19tYWNfZGVsKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBpbnQgcG1hY19pZCkKK3sKKwlpZiAocG1hY19pZCA9PSBhZGFwdGVyLT5wbWFjX2lkWzBdKQorCQlyZXR1cm47CisKKwliZV9jbWRfcG1hY19kZWwoYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLCBwbWFjX2lkLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgYmVfc2V0X3VjX2xpc3Qoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCWludCBpID0gMTsgLyogRmlyc3Qgc2xvdCBpcyBjbGFpbWVkIGJ5IHRoZSBQcmltYXJ5IE1BQyAqLworCWJvb2wgdWNfcHJvbWlzYyA9IGZhbHNlOworCWludCBjdXJyX3VjX21hY3MgPSAwLCBpOwogCi0JZm9yICg7IGFkYXB0ZXItPnVjX21hY3MgPiAwOyBhZGFwdGVyLT51Y19tYWNzLS0sIGkrKykKLQkJYmVfY21kX3BtYWNfZGVsKGFkYXB0ZXIsIGFkYXB0ZXItPmlmX2hhbmRsZSwKLQkJCQlhZGFwdGVyLT5wbWFjX2lkW2ldLCAwKTsKKwluZXRpZl9hZGRyX2xvY2tfYmgobmV0ZGV2KTsKKwlfX2Rldl91Y19zeW5jKG5ldGRldiwgYmVfdWNfbGlzdF91cGRhdGUsIGJlX3VjX2xpc3RfdXBkYXRlKTsKIAotCWlmIChuZXRkZXZfdWNfY291bnQoYWRhcHRlci0+bmV0ZGV2KSA+IGJlX21heF91YyhhZGFwdGVyKSkgewotCQliZV9zZXRfYWxsX3Byb21pc2MoYWRhcHRlcik7Ci0JCXJldHVybjsKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCWFkYXB0ZXItPnVwZGF0ZV91Y19saXN0ID0gZmFsc2U7CisJfSBlbHNlIGlmIChuZXRkZXZfdWNfY291bnQobmV0ZGV2KSA+IChiZV9tYXhfdWMoYWRhcHRlcikgLSAxKSkgeworCQl1Y19wcm9taXNjID0gdHJ1ZTsKKwkJYWRhcHRlci0+dXBkYXRlX3VjX2xpc3QgPSBmYWxzZTsKKwl9ICBlbHNlIGlmIChhZGFwdGVyLT5pZl9mbGFncyAmIEJFX0lGX0ZMQUdTX1BST01JU0NVT1VTKSB7CisJCS8qIFVwZGF0ZSB1Yy1saXN0IHVuY29uZGl0aW9uYWxseSBpZiB0aGUgaWZhY2Ugd2FzIHByZXZpb3VzbHkKKwkJICogaW4gdWMtcHJvbWlzYyBtb2RlIGFuZCBub3cgaXMgb3V0IG9mIHRoYXQgbW9kZS4KKwkJICovCisJCWFkYXB0ZXItPnVwZGF0ZV91Y19saXN0ID0gdHJ1ZTsKIAl9CiAKLQluZXRkZXZfZm9yX2VhY2hfdWNfYWRkcihoYSwgYWRhcHRlci0+bmV0ZGV2KSB7Ci0JCWFkYXB0ZXItPnVjX21hY3MrKzsgLyogRmlyc3Qgc2xvdCBpcyBmb3IgUHJpbWFyeSBNQUMgKi8KLQkJYmVfY21kX3BtYWNfYWRkKGFkYXB0ZXIsICh1OCAqKWhhLT5hZGRyLCBhZGFwdGVyLT5pZl9oYW5kbGUsCi0JCQkJJmFkYXB0ZXItPnBtYWNfaWRbYWRhcHRlci0+dWNfbWFjc10sIDApOworCWlmIChhZGFwdGVyLT51cGRhdGVfdWNfbGlzdCkgeworCQlpID0gMTsgLyogRmlyc3Qgc2xvdCBpcyBjbGFpbWVkIGJ5IHRoZSBQcmltYXJ5IE1BQyAqLworCisJCS8qIGNhY2hlIHRoZSB1Yy1saXN0IGluIGFkYXB0ZXIgYXJyYXkgKi8KKwkJbmV0ZGV2X2Zvcl9lYWNoX3VjX2FkZHIoaGEsIG5ldGRldikgeworCQkJZXRoZXJfYWRkcl9jb3B5KGFkYXB0ZXItPnVjX2xpc3RbaV0ubWFjLCBoYS0+YWRkcik7CisJCQlpKys7CisJCX0KKwkJY3Vycl91Y19tYWNzID0gbmV0ZGV2X3VjX2NvdW50KG5ldGRldik7CisJfQorCW5ldGlmX2FkZHJfdW5sb2NrX2JoKG5ldGRldik7CisKKwlpZiAodWNfcHJvbWlzYykgeworCQliZV9zZXRfdWNfcHJvbWlzYyhhZGFwdGVyKTsKKwl9IGVsc2UgaWYgKGFkYXB0ZXItPnVwZGF0ZV91Y19saXN0KSB7CisJCWJlX2NsZWFyX3VjX3Byb21pc2MoYWRhcHRlcik7CisKKwkJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnVjX21hY3M7IGkrKykKKwkJCWJlX3VjX21hY19kZWwoYWRhcHRlciwgYWRhcHRlci0+cG1hY19pZFtpICsgMV0pOworCisJCWZvciAoaSA9IDA7IGkgPCBjdXJyX3VjX21hY3M7IGkrKykKKwkJCWJlX3VjX21hY19hZGQoYWRhcHRlciwgaSk7CisJCWFkYXB0ZXItPnVjX21hY3MgPSBjdXJyX3VjX21hY3M7CisJCWFkYXB0ZXItPnVwZGF0ZV91Y19saXN0ID0gZmFsc2U7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBiZV9jbGVhcl91Y19saXN0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAxOyBpIDwgKGFkYXB0ZXItPnVjX21hY3MgKyAxKTsgaSsrKQotCQliZV9jbWRfcG1hY19kZWwoYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLAotCQkJCWFkYXB0ZXItPnBtYWNfaWRbaV0sIDApOworCV9fZGV2X3VjX3Vuc3luYyhuZXRkZXYsIE5VTEwpOworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT51Y19tYWNzOyBpKyspCisJCWJlX3VjX21hY19kZWwoYWRhcHRlciwgYWRhcHRlci0+cG1hY19pZFtpICsgMV0pOworCiAJYWRhcHRlci0+dWNfbWFjcyA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGJlX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCitzdGF0aWMgdm9pZCBfX2JlX3NldF9yeF9tb2RlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewotCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OworCisJbXV0ZXhfbG9jaygmYWRhcHRlci0+cnhfZmlsdGVyX2xvY2spOwogCiAJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgewotCQliZV9zZXRfYWxsX3Byb21pc2MoYWRhcHRlcik7Ci0JCXJldHVybjsKKwkJaWYgKCFiZV9pbl9hbGxfcHJvbWlzYyhhZGFwdGVyKSkKKwkJCWJlX3NldF9hbGxfcHJvbWlzYyhhZGFwdGVyKTsKKwl9IGVsc2UgaWYgKGJlX2luX2FsbF9wcm9taXNjKGFkYXB0ZXIpKSB7CisJCS8qIFdlIG5lZWQgdG8gcmUtcHJvZ3JhbSB0aGUgdmxhbi1saXN0IG9yIGNsZWFyCisJCSAqIHZsYW4tcHJvbWlzYyBtb2RlIChpZiBuZWVkZWQpIHdoZW4gdGhlIGludGVyZmFjZQorCQkgKiBjb21lcyBvdXQgb2YgcHJvbWlzYyBtb2RlLgorCQkgKi8KKwkJYmVfdmlkX2NvbmZpZyhhZGFwdGVyKTsKIAl9CiAKLQkvKiBJbnRlcmZhY2Ugd2FzIHByZXZpb3VzbHkgaW4gcHJvbWlzY3VvdXMgbW9kZTsgZGlzYWJsZSBpdCAqLwotCWlmIChiZV9pbl9hbGxfcHJvbWlzYyhhZGFwdGVyKSkgewotCQliZV9jbGVhcl9hbGxfcHJvbWlzYyhhZGFwdGVyKTsKLQkJaWYgKGFkYXB0ZXItPnZsYW5zX2FkZGVkKQotCQkJYmVfdmlkX2NvbmZpZyhhZGFwdGVyKTsKLQl9Ci0KLQkvKiBFbmFibGUgbXVsdGljYXN0IHByb21pc2MgaWYgbnVtIGNvbmZpZ3VyZWQgZXhjZWVkcyB3aGF0IHdlIHN1cHBvcnQgKi8KLQlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSB8fAotCSAgICBuZXRkZXZfbWNfY291bnQobmV0ZGV2KSA+IGJlX21heF9tYyhhZGFwdGVyKSkgewotCQliZV9zZXRfbWNfcHJvbWlzYyhhZGFwdGVyKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChuZXRkZXZfdWNfY291bnQobmV0ZGV2KSAhPSBhZGFwdGVyLT51Y19tYWNzKQotCQliZV9zZXRfdWNfbGlzdChhZGFwdGVyKTsKLQorCWJlX3NldF91Y19saXN0KGFkYXB0ZXIpOwogCWJlX3NldF9tY19saXN0KGFkYXB0ZXIpOworCisJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5yeF9maWx0ZXJfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGJlX3dvcmtfc2V0X3J4X21vZGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBiZV9jbWRfd29yayAqY21kX3dvcmsgPQorCQkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfY21kX3dvcmssIHdvcmspOworCisJX19iZV9zZXRfcnhfbW9kZShjbWRfd29yay0+YWRhcHRlcik7CisJa2ZyZWUoY21kX3dvcmspOwogfQogCiBzdGF0aWMgaW50IGJlX3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCB1OCAqbWFjKQpAQCAtMTcwMSw3ICsxODk1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBiZV9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpCitzdGF0aWMgaW50IGJlX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcywKKwkJCSAgX19iZTE2IHZsYW5fcHJvdG8pCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBiZV92Zl9jZmcgKnZmX2NmZyA9ICZhZGFwdGVyLT52Zl9jZmdbdmZdOwpAQCAtMTcxMyw2ICsxOTA4LDkgQEAKIAlpZiAodmYgPj0gYWRhcHRlci0+bnVtX3ZmcyB8fCB2bGFuID4gNDA5NSB8fCBxb3MgPiA3KQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKIAlpZiAodmxhbiB8fCBxb3MpIHsKIAkJdmxhbiB8PSBxb3MgPDwgVkxBTl9QUklPX1NISUZUOwogCQlzdGF0dXMgPSBiZV9zZXRfdmZfdHZ0KGFkYXB0ZXIsIHZmLCB2bGFuKTsKQEAgLTMyMjAsOSArMzQxOCw3IEBACiAJCSAqLwogCiAJCWlmICh1ZV9sbyB8fCB1ZV9oaSkgewotCQkJZGV2X2VycihkZXYsCi0JCQkJIlVucmVjb3ZlcmFibGUgRXJyb3IgZGV0ZWN0ZWQgaW4gdGhlIGFkYXB0ZXIiKTsKLQkJCWRldl9lcnIoZGV2LCAiUGxlYXNlIHJlYm9vdCBzZXJ2ZXIgdG8gcmVjb3ZlciIpOworCQkJZGV2X2VycihkZXYsICJFcnJvciBkZXRlY3RlZCBpbiB0aGUgYWRhcHRlciIpOwogCQkJaWYgKHNreWhhd2tfY2hpcChhZGFwdGVyKSkKIAkJCQliZV9zZXRfZXJyb3IoYWRhcHRlciwgQkVfRVJST1JfVUUpOwogCkBAIC0zNDI1LDEwICszNjIxLDkgQEAKIAogc3RhdGljIHZvaWQgYmVfZGlzYWJsZV9pZl9maWx0ZXJzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewotCWJlX2NtZF9wbWFjX2RlbChhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsCi0JCQlhZGFwdGVyLT5wbWFjX2lkWzBdLCAwKTsKLQorCWJlX2Rldl9tYWNfZGVsKGFkYXB0ZXIsIGFkYXB0ZXItPnBtYWNfaWRbMF0pOwogCWJlX2NsZWFyX3VjX2xpc3QoYWRhcHRlcik7CisJYmVfY2xlYXJfbWNfbGlzdChhZGFwdGVyKTsKIAogCS8qIFRoZSBJRkFDRSBmbGFncyBhcmUgZW5hYmxlZCBpbiB0aGUgb3BlbiBwYXRoIGFuZCBjbGVhcmVkCiAJICogaW4gdGhlIGNsb3NlIHBhdGguIFdoZW4gYSBWRiBnZXRzIGRldGFjaGVkIGZyb20gdGhlIGhvc3QgYW5kCkBAIC0zNDYyLDYgKzM2NTcsMTEgQEAKIAlpZiAoIShhZGFwdGVyLT5mbGFncyAmIEJFX0ZMQUdTX1NFVFVQX0RPTkUpKQogCQlyZXR1cm4gMDsKIAorCS8qIEJlZm9yZSBhdHRlbXB0aW5nIGNsZWFudXAgZW5zdXJlIGFsbCB0aGUgcGVuZGluZyBjbWRzIGluIHRoZQorCSAqIGNvbmZpZ193cSBoYXZlIGZpbmlzaGVkIGV4ZWN1dGlvbgorCSAqLworCWZsdXNoX3dvcmtxdWV1ZShiZV93cSk7CisKIAliZV9kaXNhYmxlX2lmX2ZpbHRlcnMoYWRhcHRlcik7CiAKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBCRV9GTEFHU19OQVBJX0VOQUJMRUQpIHsKQEAgLTM1NzYsMTcgKzM3NzYsMTYgQEAKIAogCS8qIEZvciBCRTMgVkZzLCB0aGUgUEYgcHJvZ3JhbXMgdGhlIGluaXRpYWwgTUFDIGFkZHJlc3MgKi8KIAlpZiAoIShCRXhfY2hpcChhZGFwdGVyKSAmJiBiZV92aXJ0Zm4oYWRhcHRlcikpKSB7Ci0JCXN0YXR1cyA9IGJlX2NtZF9wbWFjX2FkZChhZGFwdGVyLCBhZGFwdGVyLT5uZXRkZXYtPmRldl9hZGRyLAotCQkJCQkgYWRhcHRlci0+aWZfaGFuZGxlLAotCQkJCQkgJmFkYXB0ZXItPnBtYWNfaWRbMF0sIDApOworCQlzdGF0dXMgPSBiZV9kZXZfbWFjX2FkZChhZGFwdGVyLCBhZGFwdGVyLT5uZXRkZXYtPmRldl9hZGRyKTsKIAkJaWYgKHN0YXR1cykKIAkJCXJldHVybiBzdGF0dXM7CisJCWV0aGVyX2FkZHJfY29weShhZGFwdGVyLT5kZXZfbWFjLCBhZGFwdGVyLT5uZXRkZXYtPmRldl9hZGRyKTsKIAl9CiAKIAlpZiAoYWRhcHRlci0+dmxhbnNfYWRkZWQpCiAJCWJlX3ZpZF9jb25maWcoYWRhcHRlcik7CiAKLQliZV9zZXRfcnhfbW9kZShhZGFwdGVyLT5uZXRkZXYpOworCV9fYmVfc2V0X3J4X21vZGUoYWRhcHRlcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM3NTksOCArMzk1OCwxMyBAQAogCiBzdGF0aWMgdm9pZCBiZV9jYW5jZWxfZXJyX2RldGVjdGlvbihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKKwlzdHJ1Y3QgYmVfZXJyb3JfcmVjb3ZlcnkgKmVycl9yZWMgPSAmYWRhcHRlci0+ZXJyb3JfcmVjb3Zlcnk7CisKKwlpZiAoIWJlX2Vycl9yZWNvdmVyeV93b3JrcSkKKwkJcmV0dXJuOworCiAJaWYgKGFkYXB0ZXItPmZsYWdzICYgQkVfRkxBR1NfRVJSX0RFVEVDVElPTl9TQ0hFRFVMRUQpIHsKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZhZGFwdGVyLT5iZV9lcnJfZGV0ZWN0aW9uX3dvcmspOworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmVycl9yZWMtPmVycl9kZXRlY3Rpb25fd29yayk7CiAJCWFkYXB0ZXItPmZsYWdzICY9IH5CRV9GTEFHU19FUlJfREVURUNUSU9OX1NDSEVEVUxFRDsKIAl9CiB9CkBAIC0zODYwLDYgKzQwNjQsMjAgQEAKIAkJdmZ0X3Jlcy0+bWF4X21jY19jb3VudCA9IHJlcy5tYXhfbWNjX2NvdW50IC8gKG51bV92ZnMgKyAxKTsKIH0KIAorc3RhdGljIHZvaWQgYmVfaWZfZGVzdHJveShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwliZV9jbWRfaWZfZGVzdHJveShhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsICAwKTsKKworCWtmcmVlKGFkYXB0ZXItPnBtYWNfaWQpOworCWFkYXB0ZXItPnBtYWNfaWQgPSBOVUxMOworCisJa2ZyZWUoYWRhcHRlci0+bWNfbGlzdCk7CisJYWRhcHRlci0+bWNfbGlzdCA9IE5VTEw7CisKKwlrZnJlZShhZGFwdGVyLT51Y19saXN0KTsKKwlhZGFwdGVyLT51Y19saXN0ID0gTlVMTDsKK30KKwogc3RhdGljIGludCBiZV9jbGVhcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CkBAIC0zODY3LDYgKzQwODUsOCBAQAogCiAJYmVfY2FuY2VsX3dvcmtlcihhZGFwdGVyKTsKIAorCWZsdXNoX3dvcmtxdWV1ZShiZV93cSk7CisKIAlpZiAoc3Jpb3ZfZW5hYmxlZChhZGFwdGVyKSkKIAkJYmVfdmZfY2xlYXIoYWRhcHRlcik7CiAKQEAgLTM4ODQsMTAgKzQxMDQsOCBAQAogCX0KIAogCWJlX2Rpc2FibGVfdnhsYW5fb2ZmbG9hZHMoYWRhcHRlcik7Ci0Ja2ZyZWUoYWRhcHRlci0+cG1hY19pZCk7Ci0JYWRhcHRlci0+cG1hY19pZCA9IE5VTEw7CiAKLQliZV9jbWRfaWZfZGVzdHJveShhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsICAwKTsKKwliZV9pZl9kZXN0cm95KGFkYXB0ZXIpOwogCiAJYmVfY2xlYXJfcXVldWVzKGFkYXB0ZXIpOwogCkBAIC00MTUxLDcgKzQzNjksNyBAQAogICogZm9yIGRpc3RyaWJ1dGlvbiBiZXR3ZWVuIHRoZSBWRnMuIFRoaXMgc2VsZi1pbXBvc2VkIGxpbWl0IHdpbGwgZGV0ZXJtaW5lIHRoZQogICogbm86IG9mIFZGcyBmb3Igd2hpY2ggUlNTIGNhbiBiZSBlbmFibGVkLgogICovCi12b2lkIGJlX2NhbGN1bGF0ZV9wZl9wb29sX3Jzc190YWJsZXMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgdm9pZCBiZV9jYWxjdWxhdGVfcGZfcG9vbF9yc3NfdGFibGVzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBiZV9wb3J0X3Jlc291cmNlcyBwb3J0X3JlcyA9IHswfTsKIAl1OCByc3NfdGFibGVzX29uX3BvcnQ7CkBAIC00MzQxLDE0ICs0NTU5LDI5IEBACiAKIHN0YXRpYyB2b2lkIGJlX3NjaGVkdWxlX3dvcmtlcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhiZV93cSwgJmFkYXB0ZXItPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwogCWFkYXB0ZXItPmZsYWdzIHw9IEJFX0ZMQUdTX1dPUktFUl9TQ0hFRFVMRUQ7CiB9CiAKK3N0YXRpYyB2b2lkIGJlX2Rlc3Ryb3lfZXJyX3JlY292ZXJ5X3dvcmtxKHZvaWQpCit7CisJaWYgKCFiZV9lcnJfcmVjb3Zlcnlfd29ya3EpCisJCXJldHVybjsKKworCWZsdXNoX3dvcmtxdWV1ZShiZV9lcnJfcmVjb3Zlcnlfd29ya3EpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGJlX2Vycl9yZWNvdmVyeV93b3JrcSk7CisJYmVfZXJyX3JlY292ZXJ5X3dvcmtxID0gTlVMTDsKK30KKwogc3RhdGljIHZvaWQgYmVfc2NoZWR1bGVfZXJyX2RldGVjdGlvbihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGRlbGF5KQogewotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWRhcHRlci0+YmVfZXJyX2RldGVjdGlvbl93b3JrLAotCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOworCXN0cnVjdCBiZV9lcnJvcl9yZWNvdmVyeSAqZXJyX3JlYyA9ICZhZGFwdGVyLT5lcnJvcl9yZWNvdmVyeTsKKworCWlmICghYmVfZXJyX3JlY292ZXJ5X3dvcmtxKQorCQlyZXR1cm47CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYmVfZXJyX3JlY292ZXJ5X3dvcmtxLCAmZXJyX3JlYy0+ZXJyX2RldGVjdGlvbl93b3JrLAorCQkJICAgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogCWFkYXB0ZXItPmZsYWdzIHw9IEJFX0ZMQUdTX0VSUl9ERVRFQ1RJT05fU0NIRURVTEVEOwogfQogCkBAIC00MzkzLDYgKzQ2MjYsMjIgQEAKIAl1MzIgY2FwX2ZsYWdzID0gYmVfaWZfY2FwX2ZsYWdzKGFkYXB0ZXIpOwogCWludCBzdGF0dXM7CiAKKwkvKiBhbGxvYyByZXF1aXJlZCBtZW1vcnkgZm9yIG90aGVyIGZpbHRlcmluZyBmaWVsZHMgKi8KKwlhZGFwdGVyLT5wbWFjX2lkID0ga2NhbGxvYyhiZV9tYXhfdWMoYWRhcHRlciksCisJCQkJICAgc2l6ZW9mKCphZGFwdGVyLT5wbWFjX2lkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwdGVyLT5wbWFjX2lkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFkYXB0ZXItPm1jX2xpc3QgPSBrY2FsbG9jKGJlX21heF9tYyhhZGFwdGVyKSwKKwkJCQkgICBzaXplb2YoKmFkYXB0ZXItPm1jX2xpc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXItPm1jX2xpc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJYWRhcHRlci0+dWNfbGlzdCA9IGtjYWxsb2MoYmVfbWF4X3VjKGFkYXB0ZXIpLAorCQkJCSAgIHNpemVvZigqYWRhcHRlci0+dWNfbGlzdCksIEdGUF9LRVJORUwpOworCWlmICghYWRhcHRlci0+dWNfbGlzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlpZiAoYWRhcHRlci0+Y2ZnX251bV9yeF9pcnFzID09IDEpCiAJCWNhcF9mbGFncyAmPSB+KEJFX0lGX0ZMQUdTX0RFRlFfUlNTIHwgQkVfSUZfRkxBR1NfUlNTKTsKIApAQCAtNDQwMSw3ICs0NjUwLDEwIEBACiAJc3RhdHVzID0gYmVfY21kX2lmX2NyZWF0ZShhZGFwdGVyLCBiZV9pZl9jYXBfZmxhZ3MoYWRhcHRlciksIGVuX2ZsYWdzLAogCQkJCSAgJmFkYXB0ZXItPmlmX2hhbmRsZSwgMCk7CiAKLQlyZXR1cm4gc3RhdHVzOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwlyZXR1cm4gMDsKIH0KIAogaW50IGJlX3VwZGF0ZV9xdWV1ZXMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC00NDU4LDEwICs0NzEwLDE1IEBACiAJcmV0dXJuIGZ3X21ham9yOwogfQogCi0vKiBJZiBhbnkgVkZzIGFyZSBhbHJlYWR5IGVuYWJsZWQgZG9uJ3QgRkxSIHRoZSBQRiAqLworLyogSWYgaXQgaXMgZXJyb3IgcmVjb3ZlcnksIEZMUiB0aGUgUEYKKyAqIEVsc2UgaWYgYW55IFZGcyBhcmUgYWxyZWFkeSBlbmFibGVkIGRvbid0IEZMUiB0aGUgUEYKKyAqLwogc3RhdGljIGJvb2wgYmVfcmVzZXRfcmVxdWlyZWQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JcmV0dXJuIHBjaV9udW1fdmYoYWRhcHRlci0+cGRldikgPyBmYWxzZSA6IHRydWU7CisJaWYgKGJlX2Vycm9yX3JlY292ZXJpbmcoYWRhcHRlcikpCisJCXJldHVybiB0cnVlOworCWVsc2UKKwkJcmV0dXJuIHBjaV9udW1fdmYoYWRhcHRlci0+cGRldikgPT0gMDsKIH0KIAogLyogV2FpdCBmb3IgdGhlIEZXIHRvIGJlIHJlYWR5IGFuZCBwZXJmb3JtIHRoZSByZXF1aXJlZCBpbml0aWFsaXphdGlvbiAqLwpAQCAtNDQ3Myw2ICs0NzMwLDkgQEAKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCisJLyogRlcgaXMgbm93IHJlYWR5OyBjbGVhciBlcnJvcnMgdG8gYWxsb3cgY21kcy9kb29yYmVsbCAqLworCWJlX2NsZWFyX2Vycm9yKGFkYXB0ZXIsIEJFX0NMRUFSX0FMTCk7CisKIAlpZiAoYmVfcmVzZXRfcmVxdWlyZWQoYWRhcHRlcikpIHsKIAkJc3RhdHVzID0gYmVfY21kX3Jlc2V0X2Z1bmN0aW9uKGFkYXB0ZXIpOwogCQlpZiAoc3RhdHVzKQpAQCAtNDQ4MCw5ICs0NzQwLDYgQEAKIAogCQkvKiBXYWl0IGZvciBpbnRlcnJ1cHRzIHRvIHF1aWVzY2UgYWZ0ZXIgYW4gRkxSICovCiAJCW1zbGVlcCgxMDApOwotCi0JCS8qIFdlIGNhbiBjbGVhciBhbGwgZXJyb3JzIHdoZW4gZnVuY3Rpb24gcmVzZXQgc3VjY2VlZHMgKi8KLQkJYmVfY2xlYXJfZXJyb3IoYWRhcHRlciwgQkVfQ0xFQVJfQUxMKTsKIAl9CiAKIAkvKiBUZWxsIEZXIHdlJ3JlIHJlYWR5IHRvIGZpcmUgY21kcyAqLwpAQCAtNDUzMCwxMSArNDc4Nyw2IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnI7CiAKLQlhZGFwdGVyLT5wbWFjX2lkID0ga2NhbGxvYyhiZV9tYXhfdWMoYWRhcHRlciksCi0JCQkJICAgc2l6ZW9mKCphZGFwdGVyLT5wbWFjX2lkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZGFwdGVyLT5wbWFjX2lkKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCXN0YXR1cyA9IGJlX21zaXhfZW5hYmxlKGFkYXB0ZXIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyOwpAQCAtNDU5NSw2ICs0ODQ3LDkgQEAKIAlpZiAoIXN0YXR1cyAmJiBiZV9wYXVzZV9zdXBwb3J0ZWQoYWRhcHRlcikpCiAJCWFkYXB0ZXItPnBoeS5mY19hdXRvbmVnID0gMTsKIAorCWlmIChiZV9waHlzZm4oYWRhcHRlcikgJiYgIWxhbmNlcl9jaGlwKGFkYXB0ZXIpKQorCQliZV9jbWRfc2V0X2ZlYXR1cmVzKGFkYXB0ZXIpOworCiAJYmVfc2NoZWR1bGVfd29ya2VyKGFkYXB0ZXIpOwogCWFkYXB0ZXItPmZsYWdzIHw9IEJFX0ZMQUdTX1NFVFVQX0RPTkU7CiAJcmV0dXJuIDA7CkBAIC00NzI4LDYgKzQ5ODMsMjMgQEAKIAkJCQkgICAgICAgMCwgMCwgbmxmbGFncywgZmlsdGVyX21hc2ssIE5VTEwpOwogfQogCitzdGF0aWMgc3RydWN0IGJlX2NtZF93b3JrICpiZV9hbGxvY193b3JrKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkgdm9pZCAoKmZ1bmMpKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSkKK3sKKwlzdHJ1Y3QgYmVfY21kX3dvcmsgKndvcms7CisKKwl3b3JrID0ga3phbGxvYyhzaXplb2YoKndvcmspLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXdvcmspIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJImJlX3dvcmsgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJSU5JVF9XT1JLKCZ3b3JrLT53b3JrLCBmdW5jKTsKKwl3b3JrLT5hZGFwdGVyID0gYWRhcHRlcjsKKwlyZXR1cm4gd29yazsKK30KKwogLyogVnhMQU4gb2ZmbG9hZCBOb3RlczoKICAqCiAgKiBUaGUgc3RhY2sgZGVmaW5lcyB0dW5uZWwgb2ZmbG9hZCBmbGFncyAoaHdfZW5jX2ZlYXR1cmVzKSBmb3IgSVAgYW5kIGRvZXNuJ3QKQEAgLTQ3NDIsMjMgKzUwMTQsMTkgQEAKICAqIGFkZHMgbW9yZSB0aGFuIG9uZSBwb3J0LCBkaXNhYmxlIG9mZmxvYWRzIGFuZCBkb24ndCByZS1lbmFibGUgdGhlbSBhZ2FpbgogICogdW50aWwgYWZ0ZXIgYWxsIHRoZSB0dW5uZWxzIGFyZSByZW1vdmVkLgogICovCi1zdGF0aWMgdm9pZCBiZV9hZGRfdnhsYW5fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJICAgICAgc3RydWN0IHVkcF90dW5uZWxfaW5mbyAqdGkpCitzdGF0aWMgdm9pZCBiZV93b3JrX2FkZF92eGxhbl9wb3J0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2NtZF93b3JrICpjbWRfd29yayA9CisJCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiZV9jbWRfd29yaywgd29yayk7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbWRfd29yay0+YWRhcHRlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7Ci0JX19iZTE2IHBvcnQgPSB0aS0+cG9ydDsKKwlfX2JlMTYgcG9ydCA9IGNtZF93b3JrLT5pbmZvLnZ4bGFuX3BvcnQ7CiAJaW50IHN0YXR1czsKIAotCWlmICh0aS0+dHlwZSAhPSBVRFBfVFVOTkVMX1RZUEVfVlhMQU4pCi0JCXJldHVybjsKLQotCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSB8fCBCRXhfY2hpcChhZGFwdGVyKSB8fCBiZV9pc19tYyhhZGFwdGVyKSkKLQkJcmV0dXJuOwotCiAJaWYgKGFkYXB0ZXItPnZ4bGFuX3BvcnQgPT0gcG9ydCAmJiBhZGFwdGVyLT52eGxhbl9wb3J0X2NvdW50KSB7CiAJCWFkYXB0ZXItPnZ4bGFuX3BvcnRfYWxpYXNlcysrOwotCQlyZXR1cm47CisJCWdvdG8gZG9uZTsKIAl9CiAKIAlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBCRV9GTEFHU19WWExBTl9PRkZMT0FEUykgewpAQCAtNDc3MCw3ICs1MDM4LDcgQEAKIAl9CiAKIAlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydF9jb3VudCsrID49IDEpCi0JCXJldHVybjsKKwkJZ290byBkb25lOwogCiAJc3RhdHVzID0gYmVfY21kX21hbmFnZV9pZmFjZShhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsCiAJCQkJICAgICBPUF9DT05WRVJUX05PUk1BTF9UT19UVU5ORUwpOwpAQCAtNDc5NSwyOSArNTA2MywyNiBAQAogCiAJZGV2X2luZm8oZGV2LCAiRW5hYmxlZCBWeExBTiBvZmZsb2FkcyBmb3IgVURQIHBvcnQgJWRcbiIsCiAJCSBiZTE2X3RvX2NwdShwb3J0KSk7Ci0JcmV0dXJuOworCWdvdG8gZG9uZTsKIGVycjoKIAliZV9kaXNhYmxlX3Z4bGFuX29mZmxvYWRzKGFkYXB0ZXIpOworZG9uZToKKwlrZnJlZShjbWRfd29yayk7CiB9CiAKLXN0YXRpYyB2b2lkIGJlX2RlbF92eGxhbl9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgICBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKK3N0YXRpYyB2b2lkIGJlX3dvcmtfZGVsX3Z4bGFuX3BvcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlfX2JlMTYgcG9ydCA9IHRpLT5wb3J0OwotCi0JaWYgKHRpLT50eXBlICE9IFVEUF9UVU5ORUxfVFlQRV9WWExBTikKLQkJcmV0dXJuOwotCi0JaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpIHx8IEJFeF9jaGlwKGFkYXB0ZXIpIHx8IGJlX2lzX21jKGFkYXB0ZXIpKQotCQlyZXR1cm47CisJc3RydWN0IGJlX2NtZF93b3JrICpjbWRfd29yayA9CisJCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiZV9jbWRfd29yaywgd29yayk7CisJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbWRfd29yay0+YWRhcHRlcjsKKwlfX2JlMTYgcG9ydCA9IGNtZF93b3JrLT5pbmZvLnZ4bGFuX3BvcnQ7CiAKIAlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCAhPSBwb3J0KQogCQlnb3RvIGRvbmU7CiAKIAlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydF9hbGlhc2VzKSB7CiAJCWFkYXB0ZXItPnZ4bGFuX3BvcnRfYWxpYXNlcy0tOwotCQlyZXR1cm47CisJCWdvdG8gb3V0OwogCX0KIAogCWJlX2Rpc2FibGVfdnhsYW5fb2ZmbG9hZHMoYWRhcHRlcik7CkBAIC00ODI3LDYgKzUwOTIsNDAgQEAKIAkJIGJlMTZfdG9fY3B1KHBvcnQpKTsKIGRvbmU6CiAJYWRhcHRlci0+dnhsYW5fcG9ydF9jb3VudC0tOworb3V0OgorCWtmcmVlKGNtZF93b3JrKTsKK30KKworc3RhdGljIHZvaWQgYmVfY2ZnX3Z4bGFuX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgIHN0cnVjdCB1ZHBfdHVubmVsX2luZm8gKnRpLAorCQkJICAgICAgdm9pZCAoKmZ1bmMpKHN0cnVjdCB3b3JrX3N0cnVjdCAqKSkKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX2NtZF93b3JrICpjbWRfd29yazsKKworCWlmICh0aS0+dHlwZSAhPSBVRFBfVFVOTkVMX1RZUEVfVlhMQU4pCisJCXJldHVybjsKKworCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSB8fCBCRXhfY2hpcChhZGFwdGVyKSB8fCBiZV9pc19tYyhhZGFwdGVyKSkKKwkJcmV0dXJuOworCisJY21kX3dvcmsgPSBiZV9hbGxvY193b3JrKGFkYXB0ZXIsIGZ1bmMpOworCWlmIChjbWRfd29yaykgeworCQljbWRfd29yay0+aW5mby52eGxhbl9wb3J0ID0gdGktPnBvcnQ7CisJCXF1ZXVlX3dvcmsoYmVfd3EsICZjbWRfd29yay0+d29yayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiZV9kZWxfdnhsYW5fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICAgc3RydWN0IHVkcF90dW5uZWxfaW5mbyAqdGkpCit7CisJYmVfY2ZnX3Z4bGFuX3BvcnQobmV0ZGV2LCB0aSwgYmVfd29ya19kZWxfdnhsYW5fcG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGJlX2FkZF92eGxhbl9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKK3sKKwliZV9jZmdfdnhsYW5fcG9ydChuZXRkZXYsIHRpLCBiZV93b3JrX2FkZF92eGxhbl9wb3J0KTsKIH0KIAogc3RhdGljIG5ldGRldl9mZWF0dXJlc190IGJlX2ZlYXR1cmVzX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IsCkBAIC00ODkxLDYgKzUxOTAsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYmVfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGJlX2NtZF93b3JrICp3b3JrOworCisJd29yayA9IGJlX2FsbG9jX3dvcmsoYWRhcHRlciwgYmVfd29ya19zZXRfcnhfbW9kZSk7CisJaWYgKHdvcmspCisJCXF1ZXVlX3dvcmsoYmVfd3EsICZ3b3JrLT53b3JrKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBiZV9uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbgkJPSBiZV9vcGVuLAogCS5uZG9fc3RvcAkJPSBiZV9jbG9zZSwKQEAgLTQ5ODQsMTMgKzUyOTMsMTQ1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGJlX3NvZnRfcmVzZXQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIHZhbDsKKworCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJJbml0aWF0aW5nIGNoaXAgc29mdCByZXNldFxuIik7CisJdmFsID0gaW9yZWFkMzIoYWRhcHRlci0+cGNpY2ZnICsgU0xJUE9SVF9TT0ZUUkVTRVRfT0ZGU0VUKTsKKwl2YWwgfD0gU0xJUE9SVF9TT0ZUUkVTRVRfU1JfTUFTSzsKKwlpb3dyaXRlMzIodmFsLCBhZGFwdGVyLT5wY2ljZmcgKyBTTElQT1JUX1NPRlRSRVNFVF9PRkZTRVQpOworfQorCitzdGF0aWMgYm9vbCBiZV9lcnJfaXNfcmVjb3ZlcmFibGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5ICplcnJfcmVjID0gJmFkYXB0ZXItPmVycm9yX3JlY292ZXJ5OworCXVuc2lnbmVkIGxvbmcgaW5pdGlhbF9pZGxlX3RpbWUgPQorCQltc2Vjc190b19qaWZmaWVzKEVSUl9SRUNPVkVSWV9JRExFX1RJTUUpOworCXVuc2lnbmVkIGxvbmcgcmVjb3ZlcnlfaW50ZXJ2YWwgPQorCQltc2Vjc190b19qaWZmaWVzKEVSUl9SRUNPVkVSWV9JTlRFUlZBTCk7CisJdTE2IHVlX2Vycl9jb2RlOworCXUzMiB2YWw7CisKKwl2YWwgPSBiZV9QT1NUX3N0YWdlX2dldChhZGFwdGVyKTsKKwlpZiAoKHZhbCAmIFBPU1RfU1RBR0VfUkVDT1ZFUkFCTEVfRVJSKSAhPSBQT1NUX1NUQUdFX1JFQ09WRVJBQkxFX0VSUikKKwkJcmV0dXJuIGZhbHNlOworCXVlX2Vycl9jb2RlID0gdmFsICYgUE9TVF9FUlJfUkVDT1ZFUllfQ09ERV9NQVNLOworCWlmICh1ZV9lcnJfY29kZSA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJSZWNvdmVyYWJsZSBIVyBlcnJvciBjb2RlOiAweCV4XG4iLAorCQl1ZV9lcnJfY29kZSk7CisKKwlpZiAoamlmZmllcyAtIGVycl9yZWMtPnByb2JlX3RpbWUgPD0gaW5pdGlhbF9pZGxlX3RpbWUpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIkNhbm5vdCByZWNvdmVyIHdpdGhpbiAlbHUgc2VjIGZyb20gZHJpdmVyIGxvYWRcbiIsCisJCQlqaWZmaWVzX3RvX21zZWNzKGluaXRpYWxfaWRsZV90aW1lKSAvIE1TRUNfUEVSX1NFQyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoZXJyX3JlYy0+bGFzdF9yZWNvdmVyeV90aW1lICYmCisJICAgIChqaWZmaWVzIC0gZXJyX3JlYy0+bGFzdF9yZWNvdmVyeV90aW1lIDw9IHJlY292ZXJ5X2ludGVydmFsKSkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkiQ2Fubm90IHJlY292ZXIgd2l0aGluICVsdSBzZWMgZnJvbSBsYXN0IHJlY292ZXJ5XG4iLAorCQkJamlmZmllc190b19tc2VjcyhyZWNvdmVyeV9pbnRlcnZhbCkgLyBNU0VDX1BFUl9TRUMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHVlX2Vycl9jb2RlID09IGVycl9yZWMtPmxhc3RfZXJyX2NvZGUpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIkNhbm5vdCByZWNvdmVyIGZyb20gYSBjb25zZWN1dGl2ZSBUUEUgZXJyb3JcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZXJyX3JlYy0+bGFzdF9yZWNvdmVyeV90aW1lID0gamlmZmllczsKKwllcnJfcmVjLT5sYXN0X2Vycl9jb2RlID0gdWVfZXJyX2NvZGU7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgYmVfdHBlX3JlY292ZXIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5ICplcnJfcmVjID0gJmFkYXB0ZXItPmVycm9yX3JlY292ZXJ5OworCWludCBzdGF0dXMgPSAtRUFHQUlOOworCXUzMiB2YWw7CisKKwlzd2l0Y2ggKGVycl9yZWMtPnJlY292ZXJ5X3N0YXRlKSB7CisJY2FzZSBFUlJfUkVDT1ZFUllfU1RfTk9ORToKKwkJZXJyX3JlYy0+cmVjb3Zlcnlfc3RhdGUgPSBFUlJfUkVDT1ZFUllfU1RfREVURUNUOworCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gRVJSX1JFQ09WRVJZX1VFX0RFVEVDVF9EVVJBVElPTjsKKwkJYnJlYWs7CisKKwljYXNlIEVSUl9SRUNPVkVSWV9TVF9ERVRFQ1Q6CisJCXZhbCA9IGJlX1BPU1Rfc3RhZ2VfZ2V0KGFkYXB0ZXIpOworCQlpZiAoKHZhbCAmIFBPU1RfU1RBR0VfUkVDT1ZFUkFCTEVfRVJSKSAhPQorCQkgICAgUE9TVF9TVEFHRV9SRUNPVkVSQUJMRV9FUlIpIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiVW5yZWNvdmVyYWJsZSBIVyBlcnJvciBkZXRlY3RlZDogMHgleFxuIiwgdmFsKTsKKwkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiUmVjb3ZlcmFibGUgSFcgZXJyb3IgZGV0ZWN0ZWRcbiIpOworCisJCS8qIE9ubHkgUEYwIGluaXRpYXRlcyBDaGlwIFNvZnQgUmVzZXQuIEJ1dCBQRjAgbXVzdCB3YWl0IFVFMlNSCisJCSAqIG1pbGxpc2Vjb25kcyBiZWZvcmUgaXQgY2hlY2tzIGZvciBmaW5hbCBlcnJvciBzdGF0dXMgaW4KKwkJICogU0xJUE9SVF9TRU1BUEhPUkUgdG8gZGV0ZXJtaW5lIGlmIHJlY292ZXJ5IGNyaXRlcmlhIGlzIG1ldC4KKwkJICogSWYgaXQgZG9lcywgdGhlbiBQRjAgaW5pdGlhdGVzIGEgU29mdCBSZXNldC4KKwkJICovCisJCWlmIChhZGFwdGVyLT5wZl9udW0gPT0gMCkgeworCQkJZXJyX3JlYy0+cmVjb3Zlcnlfc3RhdGUgPSBFUlJfUkVDT1ZFUllfU1RfUkVTRVQ7CisJCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gZXJyX3JlYy0+dWVfdG9fcmVzZXRfdGltZSAtCisJCQkJCUVSUl9SRUNPVkVSWV9VRV9ERVRFQ1RfRFVSQVRJT047CisJCQlicmVhazsKKwkJfQorCisJCWVycl9yZWMtPnJlY292ZXJ5X3N0YXRlID0gRVJSX1JFQ09WRVJZX1NUX1BSRV9QT0xMOworCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gZXJyX3JlYy0+dWVfdG9fcG9sbF90aW1lIC0KKwkJCQkJRVJSX1JFQ09WRVJZX1VFX0RFVEVDVF9EVVJBVElPTjsKKwkJYnJlYWs7CisKKwljYXNlIEVSUl9SRUNPVkVSWV9TVF9SRVNFVDoKKwkJaWYgKCFiZV9lcnJfaXNfcmVjb3ZlcmFibGUoYWRhcHRlcikpIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiRmFpbGVkIHRvIG1lZXQgcmVjb3ZlcnkgY3JpdGVyaWFcbiIpOworCQkJc3RhdHVzID0gLUVJTzsKKwkJCWVycl9yZWMtPnJlc2NoZWRfZGVsYXkgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJYmVfc29mdF9yZXNldChhZGFwdGVyKTsKKwkJZXJyX3JlYy0+cmVjb3Zlcnlfc3RhdGUgPSBFUlJfUkVDT1ZFUllfU1RfUFJFX1BPTEw7CisJCWVycl9yZWMtPnJlc2NoZWRfZGVsYXkgPSBlcnJfcmVjLT51ZV90b19wb2xsX3RpbWUgLQorCQkJCQllcnJfcmVjLT51ZV90b19yZXNldF90aW1lOworCQlicmVhazsKKworCWNhc2UgRVJSX1JFQ09WRVJZX1NUX1BSRV9QT0xMOgorCQllcnJfcmVjLT5yZWNvdmVyeV9zdGF0ZSA9IEVSUl9SRUNPVkVSWV9TVF9SRUlOSVQ7CisJCWVycl9yZWMtPnJlc2NoZWRfZGVsYXkgPSAwOworCQlzdGF0dXMgPSAwOwkJCS8qIGRvbmUgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCQllcnJfcmVjLT5yZXNjaGVkX2RlbGF5ID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdGljIGludCBiZV9lcnJfcmVjb3ZlcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgc3RhdHVzOwogCi0JLyogRXJyb3IgcmVjb3ZlcnkgaXMgc3VwcG9ydGVkIG9ubHkgTGFuY2VyIGFzIG9mIG5vdyAqLwotCWlmICghbGFuY2VyX2NoaXAoYWRhcHRlcikpCi0JCXJldHVybiAtRUlPOworCWlmICghbGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKKwkJaWYgKCFhZGFwdGVyLT5lcnJvcl9yZWNvdmVyeS5yZWNvdmVyeV9zdXBwb3J0ZWQgfHwKKwkJICAgIGFkYXB0ZXItPnByaXZfZmxhZ3MgJiBCRV9ESVNBQkxFX1RQRV9SRUNPVkVSWSkKKwkJCXJldHVybiAtRUlPOworCQlzdGF0dXMgPSBiZV90cGVfcmVjb3ZlcihhZGFwdGVyKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gZXJyOworCX0KIAogCS8qIFdhaXQgZm9yIGFkYXB0ZXIgdG8gcmVhY2ggcXVpZXNjZW50IHN0YXRlIGJlZm9yZQogCSAqIGRlc3Ryb3lpbmcgcXVldWVzCkBAIC00OTk5LDU5ICs1NDQwLDc0IEBACiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnI7CiAKKwlhZGFwdGVyLT5mbGFncyB8PSBCRV9GTEFHU19UUllfUkVDT1ZFUlk7CisKIAliZV9jbGVhbnVwKGFkYXB0ZXIpOwogCiAJc3RhdHVzID0gYmVfcmVzdW1lKGFkYXB0ZXIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyOwogCi0JcmV0dXJuIDA7CisJYWRhcHRlci0+ZmxhZ3MgJj0gfkJFX0ZMQUdTX1RSWV9SRUNPVkVSWTsKKwogZXJyOgogCXJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXRpYyB2b2lkIGJlX2Vycl9kZXRlY3Rpb25fdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CisJc3RydWN0IGJlX2Vycm9yX3JlY292ZXJ5ICplcnJfcmVjID0KKwkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfZXJyb3JfcmVjb3ZlcnksCisJCQkJICAgICBlcnJfZGV0ZWN0aW9uX3dvcmsud29yayk7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPQotCQkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfYWRhcHRlciwKLQkJCQkJICAgICBiZV9lcnJfZGV0ZWN0aW9uX3dvcmsud29yayk7CisJCQljb250YWluZXJfb2YoZXJyX3JlYywgc3RydWN0IGJlX2FkYXB0ZXIsCisJCQkJICAgICBlcnJvcl9yZWNvdmVyeSk7CisJdTMyIHJlc2NoZWRfZGVsYXkgPSBFUlJfUkVDT1ZFUllfREVURUNUSU9OX0RFTEFZOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7CiAJaW50IHJlY292ZXJ5X3N0YXR1czsKLQlpbnQgZGVsYXkgPSBFUlJfREVURUNUSU9OX0RFTEFZOwogCiAJYmVfZGV0ZWN0X2Vycm9yKGFkYXB0ZXIpOwotCi0JaWYgKGJlX2NoZWNrX2Vycm9yKGFkYXB0ZXIsIEJFX0VSUk9SX0hXKSkKLQkJcmVjb3Zlcnlfc3RhdHVzID0gYmVfZXJyX3JlY292ZXIoYWRhcHRlcik7Ci0JZWxzZQorCWlmICghYmVfY2hlY2tfZXJyb3IoYWRhcHRlciwgQkVfRVJST1JfSFcpKQogCQlnb3RvIHJlc2NoZWR1bGVfdGFzazsKIAorCXJlY292ZXJ5X3N0YXR1cyA9IGJlX2Vycl9yZWNvdmVyKGFkYXB0ZXIpOwogCWlmICghcmVjb3Zlcnlfc3RhdHVzKSB7Ci0JCWFkYXB0ZXItPnJlY292ZXJ5X3JldHJpZXMgPSAwOworCQllcnJfcmVjLT5yZWNvdmVyeV9yZXRyaWVzID0gMDsKKwkJZXJyX3JlYy0+cmVjb3Zlcnlfc3RhdGUgPSBFUlJfUkVDT1ZFUllfU1RfTk9ORTsKIAkJZGV2X2luZm8oZGV2LCAiQWRhcHRlciByZWNvdmVyeSBzdWNjZXNzZnVsXG4iKTsKIAkJZ290byByZXNjaGVkdWxlX3Rhc2s7Ci0JfSBlbHNlIGlmIChiZV92aXJ0Zm4oYWRhcHRlcikpIHsKKwl9IGVsc2UgaWYgKCFsYW5jZXJfY2hpcChhZGFwdGVyKSAmJiBlcnJfcmVjLT5yZXNjaGVkX2RlbGF5KSB7CisJCS8qIEJFeC9TSCByZWNvdmVyeSBzdGF0ZSBtYWNoaW5lICovCisJCWlmIChhZGFwdGVyLT5wZl9udW0gPT0gMCAmJgorCQkgICAgZXJyX3JlYy0+cmVjb3Zlcnlfc3RhdGUgPiBFUlJfUkVDT1ZFUllfU1RfREVURUNUKQorCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSJBZGFwdGVyIHJlY292ZXJ5IGluIHByb2dyZXNzXG4iKTsKKwkJcmVzY2hlZF9kZWxheSA9IGVycl9yZWMtPnJlc2NoZWRfZGVsYXk7CisJCWdvdG8gcmVzY2hlZHVsZV90YXNrOworCX0gZWxzZSBpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikgJiYgYmVfdmlydGZuKGFkYXB0ZXIpKSB7CiAJCS8qIEZvciBWRnMsIGNoZWNrIGlmIFBGIGhhdmUgYWxsb2NhdGVkIHJlc291cmNlcwogCQkgKiBldmVyeSBzZWNvbmQuCiAJCSAqLwogCQlkZXZfZXJyKGRldiwgIlJlLXRyeWluZyBhZGFwdGVyIHJlY292ZXJ5XG4iKTsKIAkJZ290byByZXNjaGVkdWxlX3Rhc2s7Ci0JfSBlbHNlIGlmIChhZGFwdGVyLT5yZWNvdmVyeV9yZXRyaWVzKysgPAotCQkgICBNQVhfRVJSX1JFQ09WRVJZX1JFVFJZX0NPVU5UKSB7CisJfSBlbHNlIGlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSAmJiBlcnJfcmVjLT5yZWNvdmVyeV9yZXRyaWVzKysgPAorCQkgICBFUlJfUkVDT1ZFUllfTUFYX1JFVFJZX0NPVU5UKSB7CiAJCS8qIEluIGNhc2Ugb2YgYW5vdGhlciBlcnJvciBkdXJpbmcgcmVjb3ZlcnksIGl0IHRha2VzIDMwIHNlYwogCQkgKiBmb3IgYWRhcHRlciB0byBjb21lIG91dCBvZiBlcnJvci4gUmV0cnkgZXJyb3IgcmVjb3ZlcnkgYWZ0ZXIKIAkJICogdGhpcyB0aW1lIGludGVydmFsLgogCQkgKi8KIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiUmUtdHJ5aW5nIGFkYXB0ZXIgcmVjb3ZlcnlcbiIpOwotCQlkZWxheSA9IEVSUl9SRUNPVkVSWV9SRVRSWV9ERUxBWTsKKwkJcmVzY2hlZF9kZWxheSA9IEVSUl9SRUNPVkVSWV9SRVRSWV9ERUxBWTsKIAkJZ290byByZXNjaGVkdWxlX3Rhc2s7CiAJfSBlbHNlIHsKIAkJZGV2X2VycihkZXYsICJBZGFwdGVyIHJlY292ZXJ5IGZhaWxlZFxuIik7CisJCWRldl9lcnIoZGV2LCAiUGxlYXNlIHJlYm9vdCBzZXJ2ZXIgdG8gcmVjb3ZlclxuIik7CiAJfQogCiAJcmV0dXJuOworCiByZXNjaGVkdWxlX3Rhc2s6Ci0JYmVfc2NoZWR1bGVfZXJyX2RldGVjdGlvbihhZGFwdGVyLCBkZWxheSk7CisJYmVfc2NoZWR1bGVfZXJyX2RldGVjdGlvbihhZGFwdGVyLCByZXNjaGVkX2RlbGF5KTsKIH0KIAogc3RhdGljIHZvaWQgYmVfbG9nX3NmcF9pbmZvKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQpAQCAtNTExNiw3ICs1NTcyLDcgQEAKIAogcmVzY2hlZHVsZToKIAlhZGFwdGVyLT53b3JrX2NvdW50ZXIrKzsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhiZV93cSwgJmFkYXB0ZXItPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwogfQogCiBzdGF0aWMgdm9pZCBiZV91bm1hcF9wY2lfYmFycyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTUyNTYsMTQgKzU3MTIsMTggQEAKIAl9CiAKIAltdXRleF9pbml0KCZhZGFwdGVyLT5tYm94X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5tY2NfbG9jayk7CisJbXV0ZXhfaW5pdCgmYWRhcHRlci0+bWNjX2xvY2spOworCW11dGV4X2luaXQoJmFkYXB0ZXItPnJ4X2ZpbHRlcl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+bWNjX2NxX2xvY2spOwogCWluaXRfY29tcGxldGlvbigmYWRhcHRlci0+ZXRfY21kX2NvbXBsKTsKIAogCXBjaV9zYXZlX3N0YXRlKGFkYXB0ZXItPnBkZXYpOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmFkYXB0ZXItPndvcmssIGJlX3dvcmtlcik7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJmFkYXB0ZXItPmJlX2Vycl9kZXRlY3Rpb25fd29yaywKKworCWFkYXB0ZXItPmVycm9yX3JlY292ZXJ5LnJlY292ZXJ5X3N0YXRlID0gRVJSX1JFQ09WRVJZX1NUX05PTkU7CisJYWRhcHRlci0+ZXJyb3JfcmVjb3ZlcnkucmVzY2hlZF9kZWxheSA9IDA7CisJSU5JVF9ERUxBWUVEX1dPUksoJmFkYXB0ZXItPmVycm9yX3JlY292ZXJ5LmVycl9kZXRlY3Rpb25fd29yaywKIAkJCSAgYmVfZXJyX2RldGVjdGlvbl90YXNrKTsKIAogCWFkYXB0ZXItPnJ4X2ZjID0gdHJ1ZTsKQEAgLTUyOTgsNiArNTc1OCw5IEBACiAKIAliZV9jbGVhcihhZGFwdGVyKTsKIAorCWlmICghcGNpX3Zmc19hc3NpZ25lZChhZGFwdGVyLT5wZGV2KSkKKwkJYmVfY21kX3Jlc2V0X2Z1bmN0aW9uKGFkYXB0ZXIpOworCiAJLyogdGVsbCBmdyB3ZSdyZSBkb25lIHdpdGggZmlyaW5nIGNtZHMgKi8KIAliZV9jbWRfZndfY2xlYW4oYWRhcHRlcik7CiAKQEAgLTU0NTQsNiArNTkxNyw3IEBACiAJYmVfcm9jZV9kZXZfYWRkKGFkYXB0ZXIpOwogCiAJYmVfc2NoZWR1bGVfZXJyX2RldGVjdGlvbihhZGFwdGVyLCBFUlJfREVURUNUSU9OX0RFTEFZKTsKKwlhZGFwdGVyLT5lcnJvcl9yZWNvdmVyeS5wcm9iZV90aW1lID0gamlmZmllczsKIAogCS8qIE9uIERpZSB0ZW1wZXJhdHVyZSBub3Qgc3VwcG9ydGVkIGZvciBWRi4gKi8KIAlpZiAoYmVfcGh5c2ZuKGFkYXB0ZXIpICYmIElTX0VOQUJMRUQoQ09ORklHX0JFMk5FVF9IV01PTikpIHsKQEAgLTU2OTksNiArNjE2Myw4IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGJlX2luaXRfbW9kdWxlKHZvaWQpCiB7CisJaW50IHN0YXR1czsKKwogCWlmIChyeF9mcmFnX3NpemUgIT0gODE5MiAmJiByeF9mcmFnX3NpemUgIT0gNDA5NiAmJgogCSAgICByeF9mcmFnX3NpemUgIT0gMjA0OCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCkBAIC01NzEyLDEyICs2MTc4LDMzIEBACiAJCXByX2luZm8oRFJWX05BTUUgIiA6IFVzZSBzeXNmcyBtZXRob2QgdG8gZW5hYmxlIFZGc1xuIik7CiAJfQogCi0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7CisJYmVfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYmVfd3EiKTsKKwlpZiAoIWJlX3dxKSB7CisJCXByX3dhcm4oRFJWX05BTUUgIndvcmtxdWV1ZSBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJYmVfZXJyX3JlY292ZXJ5X3dvcmtxID0KKwkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImJlX2Vycl9yZWNvdmVyIik7CisJaWYgKCFiZV9lcnJfcmVjb3Zlcnlfd29ya3EpCisJCXByX3dhcm4oRFJWX05BTUUgIkNvdWxkIG5vdCBjcmVhdGUgZXJyb3IgcmVjb3Zlcnkgd29ya3F1ZXVlXG4iKTsKKworCXN0YXR1cyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7CisJaWYgKHN0YXR1cykgeworCQlkZXN0cm95X3dvcmtxdWV1ZShiZV93cSk7CisJCWJlX2Rlc3Ryb3lfZXJyX3JlY292ZXJ5X3dvcmtxKCk7CisJfQorCXJldHVybiBzdGF0dXM7CiB9CiBtb2R1bGVfaW5pdChiZV9pbml0X21vZHVsZSk7CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBiZV9leGl0X21vZHVsZSh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYmVfZHJpdmVyKTsKKworCWJlX2Rlc3Ryb3lfZXJyX3JlY292ZXJ5X3dvcmtxKCk7CisKKwlpZiAoYmVfd3EpCisJCWRlc3Ryb3lfd29ya3F1ZXVlKGJlX3dxKTsKIH0KIG1vZHVsZV9leGl0KGJlX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRnbWFjMTAwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mYXJhZGF5L2Z0Z21hYzEwMC5jCmluZGV4IDM2MzYxZjguLjI2MjU4NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRnbWFjMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9mdGdtYWMxMDAuYwpAQCAtNjAsNiArNjAsOCBAQAogCXN0cnVjdCBmdGdtYWMxMDBfZGVzY3MgKmRlc2NzOwogCWRtYV9hZGRyX3QgZGVzY3NfZG1hX2FkZHI7CiAKKwlzdHJ1Y3QgcGFnZSAqcnhfcGFnZXNbUlhfUVVFVUVfRU5UUklFU107CisKIAl1bnNpZ25lZCBpbnQgcnhfcG9pbnRlcjsKIAl1bnNpZ25lZCBpbnQgdHhfY2xlYW5fcG9pbnRlcjsKIAl1bnNpZ25lZCBpbnQgdHhfcG9pbnRlcjsKQEAgLTc3LDYgKzc5LDkgQEAKIAlpbnQgaW50X21hc2tfYWxsOwogCWJvb2wgdXNlX25jc2k7CiAJYm9vbCBlbmFibGVkOworCisJdTMyIHJ4ZGVzMF9lZG9ycl9tYXNrOworCXUzMiB0eGRlczBfZWRvdHJfbWFzazsKIH07CiAKIHN0YXRpYyBpbnQgZnRnbWFjMTAwX2FsbG9jX3J4X3BhZ2Uoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKQEAgLTI1NywxMCArMjYyLDExIEBACiAJcmV0dXJuIHJ4ZGVzLT5yeGRlczAgJiBjcHVfdG9fbGUzMihGVEdNQUMxMDBfUlhERVMwX1JYUEtUX1JEWSk7CiB9CiAKLXN0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfZG1hX293bihzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfZG1hX293bihjb25zdCBzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LAorCQkJCQlzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKIHsKIAkvKiBjbGVhciBzdGF0dXMgYml0cyAqLwotCXJ4ZGVzLT5yeGRlczAgJj0gY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMF9FRE9SUik7CisJcnhkZXMtPnJ4ZGVzMCAmPSBjcHVfdG9fbGUzMihwcml2LT5yeGRlczBfZWRvcnJfbWFzayk7CiB9CiAKIHN0YXRpYyBib29sIGZ0Z21hYzEwMF9yeGRlc19yeF9lcnJvcihzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKQEAgLTI5OCw5ICszMDQsMTAgQEAKIAlyZXR1cm4gcnhkZXMtPnJ4ZGVzMCAmIGNwdV90b19sZTMyKEZUR01BQzEwMF9SWERFUzBfTVVMVElDQVNUKTsKIH0KIAotc3RhdGljIHZvaWQgZnRnbWFjMTAwX3J4ZGVzX3NldF9lbmRfb2ZfcmluZyhzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfZW5kX29mX3JpbmcoY29uc3Qgc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkJICAgIHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQogewotCXJ4ZGVzLT5yeGRlczAgfD0gY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMF9FRE9SUik7CisJcnhkZXMtPnJ4ZGVzMCB8PSBjcHVfdG9fbGUzMihwcml2LT5yeGRlczBfZWRvcnJfbWFzayk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfZG1hX2FkZHIoc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMsCkBAIC0zNDEsMTggKzM0OCwyNyBAQAogCXJldHVybiByeGRlcy0+cnhkZXMxICYgY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1JYREVTMV9JUF9DSEtTVU1fRVJSKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqKmZ0Z21hYzEwMF9yeGRlc19wYWdlX3Nsb3Qoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkJCSAgICAgIHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQoreworCXJldHVybiAmcHJpdi0+cnhfcGFnZXNbcnhkZXMgLSBwcml2LT5kZXNjcy0+cnhkZXNdOworfQorCiAvKgogICogcnhkZXMyIGlzIG5vdCB1c2VkIGJ5IGhhcmR3YXJlLiBXZSB1c2UgaXQgdG8ga2VlcCB0cmFjayBvZiBwYWdlLgogICogU2luY2UgaGFyZHdhcmUgZG9lcyBub3QgdG91Y2ggaXQsIHdlIGNhbiBza2lwIGNwdV90b19sZTMyKCkvbGUzMl90b19jcHUoKS4KICAqLwotc3RhdGljIHZvaWQgZnRnbWFjMTAwX3J4ZGVzX3NldF9wYWdlKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF9yeGRlc19zZXRfcGFnZShzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LAorCQkJCSAgICAgc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMsCisJCQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlyeGRlcy0+cnhkZXMyID0gKHVuc2lnbmVkIGludClwYWdlOworCSpmdGdtYWMxMDBfcnhkZXNfcGFnZV9zbG90KHByaXYsIHJ4ZGVzKSA9IHBhZ2U7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqZnRnbWFjMTAwX3J4ZGVzX2dldF9wYWdlKHN0cnVjdCBmdGdtYWMxMDBfcnhkZXMgKnJ4ZGVzKQorc3RhdGljIHN0cnVjdCBwYWdlICpmdGdtYWMxMDBfcnhkZXNfZ2V0X3BhZ2Uoc3RydWN0IGZ0Z21hYzEwMCAqcHJpdiwKKwkJCQkJICAgICBzdHJ1Y3QgZnRnbWFjMTAwX3J4ZGVzICpyeGRlcykKIHsKLQlyZXR1cm4gKHN0cnVjdCBwYWdlICopcnhkZXMtPnJ4ZGVzMjsKKwlyZXR1cm4gKmZ0Z21hYzEwMF9yeGRlc19wYWdlX3Nsb3QocHJpdiwgcnhkZXMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0zODIsNyArMzk4LDcgQEAKIAkJaWYgKGZ0Z21hYzEwMF9yeGRlc19maXJzdF9zZWdtZW50KHJ4ZGVzKSkKIAkJCXJldHVybiByeGRlczsKIAotCQlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24ocnhkZXMpOworCQlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24ocHJpdiwgcnhkZXMpOwogCQlmdGdtYWMxMDBfcnhfcG9pbnRlcl9hZHZhbmNlKHByaXYpOwogCQlyeGRlcyA9IGZ0Z21hYzEwMF9jdXJyZW50X3J4ZGVzKHByaXYpOwogCX0KQEAgLTQ1Myw3ICs0NjksNyBAQAogCQlpZiAoZnRnbWFjMTAwX3J4ZGVzX2xhc3Rfc2VnbWVudChyeGRlcykpCiAJCQlkb25lID0gdHJ1ZTsKIAotCQlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24ocnhkZXMpOworCQlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24ocHJpdiwgcnhkZXMpOwogCQlmdGdtYWMxMDBfcnhfcG9pbnRlcl9hZHZhbmNlKHByaXYpOwogCQlyeGRlcyA9IGZ0Z21hYzEwMF9jdXJyZW50X3J4ZGVzKHByaXYpOwogCX0gd2hpbGUgKCFkb25lICYmIGZ0Z21hYzEwMF9yeGRlc19wYWNrZXRfcmVhZHkocnhkZXMpKTsKQEAgLTUwMSw3ICs1MTcsNyBAQAogCiAJZG8gewogCQlkbWFfYWRkcl90IG1hcCA9IGZ0Z21hYzEwMF9yeGRlc19nZXRfZG1hX2FkZHIocnhkZXMpOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGZ0Z21hYzEwMF9yeGRlc19nZXRfcGFnZShyeGRlcyk7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gZnRnbWFjMTAwX3J4ZGVzX2dldF9wYWdlKHByaXYsIHJ4ZGVzKTsKIAkJdW5zaWduZWQgaW50IHNpemU7CiAKIAkJZG1hX3VubWFwX3BhZ2UocHJpdi0+ZGV2LCBtYXAsIFJYX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwpAQCAtNTQ1LDEwICs1NjEsMTEgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGludGVybmFsIGZ1bmN0aW9ucyAodHJhbnNtaXQgZGVzY3JpcHRvcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGZ0Z21hYzEwMF90eGRlc19yZXNldChzdHJ1Y3QgZnRnbWFjMTAwX3R4ZGVzICp0eGRlcykKK3N0YXRpYyB2b2lkIGZ0Z21hYzEwMF90eGRlc19yZXNldChjb25zdCBzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LAorCQkJCSAgc3RydWN0IGZ0Z21hYzEwMF90eGRlcyAqdHhkZXMpCiB7CiAJLyogY2xlYXIgYWxsIGV4Y2VwdCBlbmQgb2YgcmluZyBiaXQgKi8KLQl0eGRlcy0+dHhkZXMwICY9IGNwdV90b19sZTMyKEZUR01BQzEwMF9UWERFUzBfRURPVFIpOworCXR4ZGVzLT50eGRlczAgJj0gY3B1X3RvX2xlMzIocHJpdi0+dHhkZXMwX2Vkb3RyX21hc2spOwogCXR4ZGVzLT50eGRlczEgPSAwOwogCXR4ZGVzLT50eGRlczIgPSAwOwogCXR4ZGVzLT50eGRlczMgPSAwOwpAQCAtNTY5LDkgKzU4NiwxMCBAQAogCXR4ZGVzLT50eGRlczAgfD0gY3B1X3RvX2xlMzIoRlRHTUFDMTAwX1RYREVTMF9UWERNQV9PV04pOwogfQogCi1zdGF0aWMgdm9pZCBmdGdtYWMxMDBfdHhkZXNfc2V0X2VuZF9vZl9yaW5nKHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzKQorc3RhdGljIHZvaWQgZnRnbWFjMTAwX3R4ZGVzX3NldF9lbmRfb2ZfcmluZyhjb25zdCBzdHJ1Y3QgZnRnbWFjMTAwICpwcml2LAorCQkJCQkgICAgc3RydWN0IGZ0Z21hYzEwMF90eGRlcyAqdHhkZXMpCiB7Ci0JdHhkZXMtPnR4ZGVzMCB8PSBjcHVfdG9fbGUzMihGVEdNQUMxMDBfVFhERVMwX0VET1RSKTsKKwl0eGRlcy0+dHhkZXMwIHw9IGNwdV90b19sZTMyKHByaXYtPnR4ZGVzMF9lZG90cl9tYXNrKTsKIH0KIAogc3RhdGljIHZvaWQgZnRnbWFjMTAwX3R4ZGVzX3NldF9maXJzdF9zZWdtZW50KHN0cnVjdCBmdGdtYWMxMDBfdHhkZXMgKnR4ZGVzKQpAQCAtNjkwLDcgKzcwOCw3IEBACiAKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKLQlmdGdtYWMxMDBfdHhkZXNfcmVzZXQodHhkZXMpOworCWZ0Z21hYzEwMF90eGRlc19yZXNldChwcml2LCB0eGRlcyk7CiAKIAlmdGdtYWMxMDBfdHhfY2xlYW5fcG9pbnRlcl9hZHZhbmNlKHByaXYpOwogCkBAIC03NzksOSArNzk3LDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZnRnbWFjMTAwX3J4ZGVzX3NldF9wYWdlKHJ4ZGVzLCBwYWdlKTsKKwlmdGdtYWMxMDBfcnhkZXNfc2V0X3BhZ2UocHJpdiwgcnhkZXMsIHBhZ2UpOwogCWZ0Z21hYzEwMF9yeGRlc19zZXRfZG1hX2FkZHIocnhkZXMsIG1hcCk7Ci0JZnRnbWFjMTAwX3J4ZGVzX3NldF9kbWFfb3duKHJ4ZGVzKTsKKwlmdGdtYWMxMDBfcnhkZXNfc2V0X2RtYV9vd24ocHJpdiwgcnhkZXMpOwogCXJldHVybiAwOwogfQogCkBAIC03OTEsNyArODA5LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9FTlRSSUVTOyBpKyspIHsKIAkJc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMgPSAmcHJpdi0+ZGVzY3MtPnJ4ZGVzW2ldOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGZ0Z21hYzEwMF9yeGRlc19nZXRfcGFnZShyeGRlcyk7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gZnRnbWFjMTAwX3J4ZGVzX2dldF9wYWdlKHByaXYsIHJ4ZGVzKTsKIAkJZG1hX2FkZHJfdCBtYXAgPSBmdGdtYWMxMDBfcnhkZXNfZ2V0X2RtYV9hZGRyKHJ4ZGVzKTsKIAogCQlpZiAoIXBhZ2UpCkBAIC04MjgsNyArODQ2LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBpbml0aWFsaXplIFJYIHJpbmcgKi8KLQlmdGdtYWMxMDBfcnhkZXNfc2V0X2VuZF9vZl9yaW5nKCZwcml2LT5kZXNjcy0+cnhkZXNbUlhfUVVFVUVfRU5UUklFUyAtIDFdKTsKKwlmdGdtYWMxMDBfcnhkZXNfc2V0X2VuZF9vZl9yaW5nKHByaXYsCisJCQkJCSZwcml2LT5kZXNjcy0+cnhkZXNbUlhfUVVFVUVfRU5UUklFUyAtIDFdKTsKIAogCWZvciAoaSA9IDA7IGkgPCBSWF9RVUVVRV9FTlRSSUVTOyBpKyspIHsKIAkJc3RydWN0IGZ0Z21hYzEwMF9yeGRlcyAqcnhkZXMgPSAmcHJpdi0+ZGVzY3MtPnJ4ZGVzW2ldOwpAQCAtODM4LDcgKzg1Nyw4IEBACiAJfQogCiAJLyogaW5pdGlhbGl6ZSBUWCByaW5nICovCi0JZnRnbWFjMTAwX3R4ZGVzX3NldF9lbmRfb2ZfcmluZygmcHJpdi0+ZGVzY3MtPnR4ZGVzW1RYX1FVRVVFX0VOVFJJRVMgLSAxXSk7CisJZnRnbWFjMTAwX3R4ZGVzX3NldF9lbmRfb2ZfcmluZyhwcml2LAorCQkJCQkmcHJpdi0+ZGVzY3MtPnR4ZGVzW1RYX1FVRVVFX0VOVFJJRVMgLSAxXSk7CiAJcmV0dXJuIDA7CiAKIGVycjoKQEAgLTEwNTUsMTQgKzEwNzUsMTIgQEAKIAl9CiAKIAlpZiAoc3RhdHVzICYgcHJpdi0+aW50X21hc2tfYWxsICYgKEZUR01BQzEwMF9JTlRfTk9fUlhCVUYgfAotCQkJRlRHTUFDMTAwX0lOVF9SUEtUX0xPU1QgfCBGVEdNQUMxMDBfSU5UX0FIQl9FUlIgfAotCQkJRlRHTUFDMTAwX0lOVF9QSFlTVFNfQ0hHKSkgeworCQkJRlRHTUFDMTAwX0lOVF9SUEtUX0xPU1QgfCBGVEdNQUMxMDBfSU5UX0FIQl9FUlIpKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQluZXRkZXZfaW5mbyhuZXRkZXYsICJbSVNSXSA9IDB4JXg6ICVzJXMlcyVzXG4iLCBzdGF0dXMsCisJCQluZXRkZXZfaW5mbyhuZXRkZXYsICJbSVNSXSA9IDB4JXg6ICVzJXMlc1xuIiwgc3RhdHVzLAogCQkJCSAgICBzdGF0dXMgJiBGVEdNQUMxMDBfSU5UX05PX1JYQlVGID8gIk5PX1JYQlVGICIgOiAiIiwKIAkJCQkgICAgc3RhdHVzICYgRlRHTUFDMTAwX0lOVF9SUEtUX0xPU1QgPyAiUlBLVF9MT1NUICIgOiAiIiwKLQkJCQkgICAgc3RhdHVzICYgRlRHTUFDMTAwX0lOVF9BSEJfRVJSID8gIkFIQl9FUlIgIiA6ICIiLAotCQkJCSAgICBzdGF0dXMgJiBGVEdNQUMxMDBfSU5UX1BIWVNUU19DSEcgPyAiUEhZU1RTX0NIRyIgOiAiIik7CisJCQkJICAgIHN0YXR1cyAmIEZUR01BQzEwMF9JTlRfQUhCX0VSUiA/ICJBSEJfRVJSICIgOiAiIik7CiAKIAkJaWYgKHN0YXR1cyAmIEZUR01BQzEwMF9JTlRfTk9fUlhCVUYpIHsKIAkJCS8qIFJYIGJ1ZmZlciB1bmF2YWlsYWJsZSAqLwpAQCAtMTA5Miw2ICsxMTEwLDcgQEAKIHN0YXRpYyBpbnQgZnRnbWFjMTAwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgZnRnbWFjMTAwICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOwogCWludCBlcnI7CiAKIAllcnIgPSBmdGdtYWMxMDBfYWxsb2NfYnVmZmVycyhwcml2KTsKQEAgLTExMTcsNiArMTEzNiwxMSBAQAogCiAJZnRnbWFjMTAwX2luaXRfaHcocHJpdik7CiAJZnRnbWFjMTAwX3N0YXJ0X2h3KHByaXYsIHByaXYtPnVzZV9uY3NpID8gMTAwIDogMTApOworCisJLyogQ2xlYXIgc3RhbGUgaW50ZXJydXB0cyAqLworCXN0YXR1cyA9IGlvcmVhZDMyKHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX0lTUik7CisJaW93cml0ZTMyKHN0YXR1cywgcHJpdi0+YmFzZSArIEZUR01BQzEwMF9PRkZTRVRfSVNSKTsKKwogCWlmIChuZXRkZXYtPnBoeWRldikKIAkJcGh5X3N0YXJ0KG5ldGRldi0+cGh5ZGV2KTsKIAllbHNlIGlmIChwcml2LT51c2VfbmNzaSkKQEAgLTExNjYsNiArMTE5MCw4IEBACiAJbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKIAlpZiAobmV0ZGV2LT5waHlkZXYpCiAJCXBoeV9zdG9wKG5ldGRldi0+cGh5ZGV2KTsKKwllbHNlIGlmIChwcml2LT51c2VfbmNzaSkKKwkJbmNzaV9zdG9wX2Rldihwcml2LT5uZGV2KTsKIAogCWZ0Z21hYzEwMF9zdG9wX2h3KHByaXYpOwogCWZyZWVfaXJxKHByaXYtPmlycSwgbmV0ZGV2KTsKQEAgLTEyMjYsMTIgKzEyNTIsMjEgQEAKIAlzdHJ1Y3QgZnRnbWFjMTAwICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKHByaXYtPmRldik7CiAJaW50IGksIGVyciA9IDA7CisJdTMyIHJlZzsKIAogCS8qIGluaXRpYWxpemUgbWRpbyBidXMgKi8KIAlwcml2LT5taWlfYnVzID0gbWRpb2J1c19hbGxvYygpOwogCWlmICghcHJpdi0+bWlpX2J1cykKIAkJcmV0dXJuIC1FSU87CiAKKwlpZiAob2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJhc3BlZWQsYXN0MjQwMCIpIHx8CisJICAgIG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiYXNwZWVkLGFzdDI1MDAiKSkgeworCQkvKiBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgb2xkIE1ESU8gaW50ZXJmYWNlICovCisJCXJlZyA9IGlvcmVhZDMyKHByaXYtPmJhc2UgKyBGVEdNQUMxMDBfT0ZGU0VUX1JFVlIpOworCQlyZWcgJj0gfkZUR01BQzEwMF9SRVZSX05FV19NRElPX0lOVEVSRkFDRTsKKwkJaW93cml0ZTMyKHJlZywgcHJpdi0+YmFzZSArIEZUR01BQzEwMF9PRkZTRVRfUkVWUik7CisJfTsKKwogCXByaXYtPm1paV9idXMtPm5hbWUgPSAiZnRnbWFjMTAwX21kaW8iOwogCXNucHJpbnRmKHByaXYtPm1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIlcy0lZCIsCiAJCSBwZGV2LT5uYW1lLCBwZGV2LT5pZCk7CkBAIC0xMzU1LDkgKzEzOTAsMTggQEAKIAkJCSAgICAgIEZUR01BQzEwMF9JTlRfWFBLVF9FVEggfAogCQkJICAgICAgRlRHTUFDMTAwX0lOVF9YUEtUX0xPU1QgfAogCQkJICAgICAgRlRHTUFDMTAwX0lOVF9BSEJfRVJSIHwKLQkJCSAgICAgIEZUR01BQzEwMF9JTlRfUEhZU1RTX0NIRyB8CiAJCQkgICAgICBGVEdNQUMxMDBfSU5UX1JQS1RfQlVGIHwKIAkJCSAgICAgIEZUR01BQzEwMF9JTlRfTk9fUlhCVUYpOworCisJaWYgKG9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiYXNwZWVkLGFzdDI0MDAiKSB8fAorCSAgICBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImFzcGVlZCxhc3QyNTAwIikpIHsKKwkJcHJpdi0+cnhkZXMwX2Vkb3JyX21hc2sgPSBCSVQoMzApOworCQlwcml2LT50eGRlczBfZWRvdHJfbWFzayA9IEJJVCgzMCk7CisJfSBlbHNlIHsKKwkJcHJpdi0+cnhkZXMwX2Vkb3JyX21hc2sgPSBCSVQoMTUpOworCQlwcml2LT50eGRlczBfZWRvdHJfbWFzayA9IEJJVCgxNSk7CisJfQorCiAJaWYgKHBkZXYtPmRldi5vZl9ub2RlICYmCiAJICAgIG9mX2dldF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwgInVzZS1uY3NpIiwgTlVMTCkpIHsKIAkJaWYgKCFJU19FTkFCTEVEKENPTkZJR19ORVRfTkNTSSkpIHsKQEAgLTEzNjcsNyArMTQxMSw2IEBACiAKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgIlVzaW5nIE5DU0kgaW50ZXJmYWNlXG4iKTsKIAkJcHJpdi0+dXNlX25jc2kgPSB0cnVlOwotCQlwcml2LT5pbnRfbWFza19hbGwgJj0gfkZUR01BQzEwMF9JTlRfUEhZU1RTX0NIRzsKIAkJcHJpdi0+bmRldiA9IG5jc2lfcmVnaXN0ZXJfZGV2KG5ldGRldiwgZnRnbWFjMTAwX25jc2lfaGFuZGxlcik7CiAJCWlmICghcHJpdi0+bmRldikKIAkJCWdvdG8gZXJyX25jc2lfZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9mdGdtYWMxMDAuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZhcmFkYXkvZnRnbWFjMTAwLmgKaW5kZXggMTM0MDhkNC4uYTdjZTBhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmFyYWRheS9mdGdtYWMxMDAuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mYXJhZGF5L2Z0Z21hYzEwMC5oCkBAIC0xMzQsNiArMTM0LDExIEBACiAjZGVmaW5lIEZUR01BQzEwMF9ETUFGSUZPU19UWERNQV9SRVEJCSgxIDw8IDMxKQogCiAvKgorICogRmVhdHVyZSBSZWdpc3RlcgorICovCisjZGVmaW5lIEZUR01BQzEwMF9SRVZSX05FV19NRElPX0lOVEVSRkFDRQlCSVQoMzEpCisKKy8qCiAgKiBSZWNlaXZlIGJ1ZmZlciBzaXplIHJlZ2lzdGVyCiAgKi8KICNkZWZpbmUgRlRHTUFDMTAwX1JCU1JfU0laRSh4KQkJKCh4KSAmIDB4M2ZmZikKQEAgLTE1Miw2ICsxNTcsNyBAQAogI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfRlVMTERVUAkJKDEgPDwgOCkKICNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX0dJR0FfTU9ERQkoMSA8PCA5KQogI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfQ1JDX0FQRAkJKDEgPDwgMTApCisjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9QSFlfTElOS19MRVZFTAkoMSA8PCAxMSkKICNkZWZpbmUgRlRHTUFDMTAwX01BQ0NSX1JYX1JVTlQJCSgxIDw8IDEyKQogI2RlZmluZSBGVEdNQUMxMDBfTUFDQ1JfSlVNQk9fTEYJKDEgPDwgMTMpCiAjZGVmaW5lIEZUR01BQzEwMF9NQUNDUl9SWF9BTEwJCSgxIDw8IDE0KQpAQCAtMTg5LDcgKzE5NSw2IEBACiB9IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpOwogCiAjZGVmaW5lIEZUR01BQzEwMF9UWERFUzBfVFhCVUZfU0laRSh4KQkoKHgpICYgMHgzZmZmKQotI2RlZmluZSBGVEdNQUMxMDBfVFhERVMwX0VET1RSCQkoMSA8PCAxNSkKICNkZWZpbmUgRlRHTUFDMTAwX1RYREVTMF9DUkNfRVJSCSgxIDw8IDE5KQogI2RlZmluZSBGVEdNQUMxMDBfVFhERVMwX0xUUwkJKDEgPDwgMjgpCiAjZGVmaW5lIEZUR01BQzEwMF9UWERFUzBfRlRTCQkoMSA8PCAyOSkKQEAgLTIxNSw3ICsyMjAsNiBAQAogfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgxNikpKTsKIAogI2RlZmluZSBGVEdNQUMxMDBfUlhERVMwX1ZEQkMJCTB4M2ZmZgotI2RlZmluZSBGVEdNQUMxMDBfUlhERVMwX0VET1JSCQkoMSA8PCAxNSkKICNkZWZpbmUgRlRHTUFDMTAwX1JYREVTMF9NVUxUSUNBU1QJKDEgPDwgMTYpCiAjZGVmaW5lIEZUR01BQzEwMF9SWERFUzBfQlJPQURDQVNUCSgxIDw8IDE3KQogI2RlZmluZSBGVEdNQUMxMDBfUlhERVMwX1JYX0VSUgkJKDEgPDwgMTgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbWFpbi5jCmluZGV4IDAxZjdlODEuLjQ4YTAzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbWFpbi5jCkBAIC04OSwxMCArODksMTAgQEAKIAkJLmRyaXZlcl9kYXRhID0gMCwKIAl9LCB7CiAJCS5uYW1lID0gImlteDI1LWZlYyIsCi0JCS5kcml2ZXJfZGF0YSA9IEZFQ19RVUlSS19VU0VfR0FTS0VUIHwgRkVDX1FVSVJLX0hBU19SQUNDLAorCQkuZHJpdmVyX2RhdGEgPSBGRUNfUVVJUktfVVNFX0dBU0tFVCwKIAl9LCB7CiAJCS5uYW1lID0gImlteDI3LWZlYyIsCi0JCS5kcml2ZXJfZGF0YSA9IEZFQ19RVUlSS19IQVNfUkFDQywKKwkJLmRyaXZlcl9kYXRhID0gMCwKIAl9LCB7CiAJCS5uYW1lID0gImlteDI4LWZlYyIsCiAJCS5kcml2ZXJfZGF0YSA9IEZFQ19RVUlSS19FTkVUX01BQyB8IEZFQ19RVUlSS19TV0FQX0ZSQU1FIHwKQEAgLTE4MCw2ICsxODAsNyBAQAogLyogRkVDIHJlY2VpdmUgYWNjZWxlcmF0aW9uICovCiAjZGVmaW5lIEZFQ19SQUNDX0lQRElTCQkoMSA8PCAxKQogI2RlZmluZSBGRUNfUkFDQ19QUk9ESVMJCSgxIDw8IDIpCisjZGVmaW5lIEZFQ19SQUNDX1NISUZUMTYJQklUKDcpCiAjZGVmaW5lIEZFQ19SQUNDX09QVElPTlMJKEZFQ19SQUNDX0lQRElTIHwgRkVDX1JBQ0NfUFJPRElTKQogCiAvKgpAQCAtOTEyLDEzICs5MTMsMTEgQEAKIAkgKiBlbmV0LW1hYyByZXNldCB3aWxsIHJlc2V0IG1hYyBhZGRyZXNzIHJlZ2lzdGVycyB0b28sCiAJICogc28gbmVlZCB0byByZWNvbmZpZ3VyZSBpdC4KIAkgKi8KLQlpZiAoZmVwLT5xdWlya3MgJiBGRUNfUVVJUktfRU5FVF9NQUMpIHsKLQkJbWVtY3B5KCZ0ZW1wX21hYywgbmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQkJd3JpdGVsKChfX2ZvcmNlIHUzMiljcHVfdG9fYmUzMih0ZW1wX21hY1swXSksCi0JCSAgICAgICBmZXAtPmh3cCArIEZFQ19BRERSX0xPVyk7Ci0JCXdyaXRlbCgoX19mb3JjZSB1MzIpY3B1X3RvX2JlMzIodGVtcF9tYWNbMV0pLAotCQkgICAgICAgZmVwLT5od3AgKyBGRUNfQUREUl9ISUdIKTsKLQl9CisJbWVtY3B5KCZ0ZW1wX21hYywgbmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwl3cml0ZWwoKF9fZm9yY2UgdTMyKWNwdV90b19iZTMyKHRlbXBfbWFjWzBdKSwKKwkgICAgICAgZmVwLT5od3AgKyBGRUNfQUREUl9MT1cpOworCXdyaXRlbCgoX19mb3JjZSB1MzIpY3B1X3RvX2JlMzIodGVtcF9tYWNbMV0pLAorCSAgICAgICBmZXAtPmh3cCArIEZFQ19BRERSX0hJR0gpOwogCiAJLyogQ2xlYXIgYW55IG91dHN0YW5kaW5nIGludGVycnVwdC4gKi8KIAl3cml0ZWwoMHhmZmZmZmZmZiwgZmVwLT5od3AgKyBGRUNfSUVWRU5UKTsKQEAgLTk0NSw5ICs5NDQsMTEgQEAKIAogI2lmICFkZWZpbmVkKENPTkZJR19NNTI3MikKIAlpZiAoZmVwLT5xdWlya3MgJiBGRUNfUVVJUktfSEFTX1JBQ0MpIHsKLQkJLyogc2V0IFJYIGNoZWNrc3VtICovCiAJCXZhbCA9IHJlYWRsKGZlcC0+aHdwICsgRkVDX1JBQ0MpOworCQkvKiBhbGlnbiBJUCBoZWFkZXIgKi8KKwkJdmFsIHw9IEZFQ19SQUNDX1NISUZUMTY7CiAJCWlmIChmZXAtPmNzdW1fZmxhZ3MgJiBGTEFHX1JYX0NTVU1fRU5BQkxFRCkKKwkJCS8qIHNldCBSWCBjaGVja3N1bSAqLwogCQkJdmFsIHw9IEZFQ19SQUNDX09QVElPTlM7CiAJCWVsc2UKIAkJCXZhbCAmPSB+RkVDX1JBQ0NfT1BUSU9OUzsKQEAgLTE0MjgsNiArMTQyOSwxMiBAQAogCQlwcmVmZXRjaChza2ItPmRhdGEgLSBORVRfSVBfQUxJR04pOwogCQlza2JfcHV0KHNrYiwgcGt0X2xlbiAtIDQpOwogCQlkYXRhID0gc2tiLT5kYXRhOworCisjaWYgIWRlZmluZWQoQ09ORklHX001MjcyKQorCQlpZiAoZmVwLT5xdWlya3MgJiBGRUNfUVVJUktfSEFTX1JBQ0MpCisJCQlkYXRhID0gc2tiX3B1bGxfaW5saW5lKHNrYiwgMik7CisjZW5kaWYKKwogCQlpZiAoIWlzX2NvcHlicmVhayAmJiBuZWVkX3N3YXApCiAJCQlzd2FwX2J1ZmZlcihkYXRhLCBwa3RfbGVuKTsKIApAQCAtMjg4Nyw3ICsyODk0LDcgQEAKICAqIHRoaXMga2luZCBvZiBmZWF0dXJlPykuCiAgKi8KIAotI2RlZmluZSBIQVNIX0JJVFMJNgkJLyogI2JpdHMgaW4gaGFzaCAqLworI2RlZmluZSBGRUNfSEFTSF9CSVRTCTYJCS8qICNiaXRzIGluIGhhc2ggKi8KICNkZWZpbmUgQ1JDMzJfUE9MWQkweEVEQjg4MzIwCiAKIHN0YXRpYyB2b2lkIHNldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKQEAgLTI5MzUsMTAgKzI5NDIsMTAgQEAKIAkJCX0KIAkJfQogCi0JCS8qIG9ubHkgdXBwZXIgNiBiaXRzIChIQVNIX0JJVFMpIGFyZSB1c2VkCisJCS8qIG9ubHkgdXBwZXIgNiBiaXRzIChGRUNfSEFTSF9CSVRTKSBhcmUgdXNlZAogCQkgKiB3aGljaCBwb2ludCB0byBzcGVjaWZpYyBiaXQgaW4gaGUgaGFzaCByZWdpc3RlcnMKIAkJICovCi0JCWhhc2ggPSAoY3JjID4+ICgzMiAtIEhBU0hfQklUUykpICYgMHgzZjsKKwkJaGFzaCA9IChjcmMgPj4gKDMyIC0gRkVDX0hBU0hfQklUUykpICYgMHgzZjsKIAogCQlpZiAoaGFzaCA+IDMxKSB7CiAJCQl0bXAgPSByZWFkbChmZXAtPmh3cCArIEZFQ19HUlBfSEFTSF9UQUJMRV9ISUdIKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mbWFuL2ZtYW5fbWFjLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZm1hbi9mbWFuX21hYy5oCmluZGV4IDhkZGVlZGIuLmRkZjAyNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mbWFuL2ZtYW5fbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZtYW4vZm1hbl9tYWMuaApAQCAtMTkyLDcgKzE5Miw3IEBACiAJLyogQSBoYW5kbGUgdG8gdGhlIEZNIG9iamVjdCB0aGlzIHBvcnQgcmVsYXRlZCB0byAqLwogCXZvaWQgKmZtOwogCS8qIE1ESU8gZXhjZXB0aW9ucyBpbnRlcnJ1cHQgc291cmNlIC0gbm90IHZhbGlkIGZvciBhbGwKLQkgKiBNQUNzOyBNVVNUIGJlIHNldCB0byAnTk9fSVJRJyBmb3IgTUFDcyB0aGF0IGRvbid0IGhhdmUKKwkgKiBNQUNzOyBNVVNUIGJlIHNldCB0byAwIGZvciBNQUNzIHRoYXQgZG9uJ3QgaGF2ZQogCSAqIG1kaW8taXJxLCBvciBmb3IgcG9sbGluZwogCSAqLwogCXZvaWQgKmRldl9pZDsgLyogZGV2aWNlIGNvb2tpZSB1c2VkIGJ5IHRoZSBleGNlcHRpb24gY2JzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LW1haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCmluZGV4IDYxZmQ0ODYuLmRjMTIwYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCkBAIC02MCw2ICs2MCw5IEBACiBNT0RVTEVfUEFSTV9ERVNDKGZzX2VuZXRfZGVidWcsCiAJCSAiRnJlZXNjYWxlIGJpdG1hcHBlZCBkZWJ1Z2dpbmcgbWVzc2FnZSBlbmFibGUgdmFsdWUiKTsKIAorI2RlZmluZSBSWF9SSU5HX1NJWkUJMzIKKyNkZWZpbmUgVFhfUklOR19TSVpFCTY0CisKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgZnNfZW5ldF9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogI2VuZGlmCkBAIC03OSw4ICs4Miw4IEBACiAJCXNrYl9yZXNlcnZlKHNrYiwgYWxpZ24gLSBvZmYpOwogfQogCi0vKiBOQVBJIHJlY2VpdmUgZnVuY3Rpb24gKi8KLXN0YXRpYyBpbnQgZnNfZW5ldF9yeF9uYXBpKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKKy8qIE5BUEkgZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgZnNfZW5ldF9uYXBpKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIHsKIAlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSwgbmFwaSk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGZlcC0+bmRldjsKQEAgLTkwLDE0NyArOTMsMTcgQEAKIAlpbnQgcmVjZWl2ZWQgPSAwOwogCXUxNiBwa3RfbGVuLCBzYzsKIAlpbnQgY3VyaWR4OwotCi0JaWYgKGJ1ZGdldCA8PSAwKQotCQlyZXR1cm4gcmVjZWl2ZWQ7Ci0KLQkvKgotCSAqIEZpcnN0LCBncmFiIGFsbCBvZiB0aGUgc3RhdHMgZm9yIHRoZSBpbmNvbWluZyBwYWNrZXQuCi0JICogVGhlc2UgZ2V0IG1lc3NlZCB1cCBpZiB3ZSBnZXQgY2FsbGVkIGR1ZSB0byBhIGJ1c3kgY29uZGl0aW9uLgotCSAqLwotCWJkcCA9IGZlcC0+Y3VyX3J4OwotCi0JLyogY2xlYXIgUlggc3RhdHVzIGJpdHMgZm9yIG5hcGkqLwotCSgqZmVwLT5vcHMtPm5hcGlfY2xlYXJfcnhfZXZlbnQpKGRldik7Ci0KLQl3aGlsZSAoKChzYyA9IENCRFJfU0MoYmRwKSkgJiBCRF9FTkVUX1JYX0VNUFRZKSA9PSAwKSB7Ci0JCWN1cmlkeCA9IGJkcCAtIGZlcC0+cnhfYmRfYmFzZTsKLQotCQkvKgotCQkgKiBTaW5jZSB3ZSBoYXZlIGFsbG9jYXRlZCBzcGFjZSB0byBob2xkIGEgY29tcGxldGUgZnJhbWUsCi0JCSAqIHRoZSBsYXN0IGluZGljYXRvciBzaG91bGQgYmUgc2V0LgotCQkgKi8KLQkJaWYgKChzYyAmIEJEX0VORVRfUlhfTEFTVCkgPT0gMCkKLQkJCWRldl93YXJuKGZlcC0+ZGV2LCAicmN2IGlzIG5vdCArbGFzdFxuIik7Ci0KLQkJLyoKLQkJICogQ2hlY2sgZm9yIGVycm9ycy4KLQkJICovCi0JCWlmIChzYyAmIChCRF9FTkVUX1JYX0xHIHwgQkRfRU5FVF9SWF9TSCB8IEJEX0VORVRfUlhfQ0wgfAotCQkJICBCRF9FTkVUX1JYX05PIHwgQkRfRU5FVF9SWF9DUiB8IEJEX0VORVRfUlhfT1YpKSB7Ci0JCQlmZXAtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJLyogRnJhbWUgdG9vIGxvbmcgb3IgdG9vIHNob3J0LiAqLwotCQkJaWYgKHNjICYgKEJEX0VORVRfUlhfTEcgfCBCRF9FTkVUX1JYX1NIKSkKLQkJCQlmZXAtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKLQkJCS8qIEZyYW1lIGFsaWdubWVudCAqLwotCQkJaWYgKHNjICYgKEJEX0VORVRfUlhfTk8gfCBCRF9FTkVUX1JYX0NMKSkKLQkJCQlmZXAtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwotCQkJLyogQ1JDIEVycm9yICovCi0JCQlpZiAoc2MgJiBCRF9FTkVUX1JYX0NSKQotCQkJCWZlcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwotCQkJLyogRklGTyBvdmVycnVuICovCi0JCQlpZiAoc2MgJiBCRF9FTkVUX1JYX09WKQotCQkJCWZlcC0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwotCi0JCQlza2IgPSBmZXAtPnJ4X3NrYnVmZltjdXJpZHhdOwotCi0JCQlkbWFfdW5tYXBfc2luZ2xlKGZlcC0+ZGV2LCBDQkRSX0JVRkFERFIoYmRwKSwKLQkJCQlMMV9DQUNIRV9BTElHTihQS1RfTUFYQlVGX1NJWkUpLAotCQkJCURNQV9GUk9NX0RFVklDRSk7Ci0KLQkJCXNrYm4gPSBza2I7Ci0KLQkJfSBlbHNlIHsKLQkJCXNrYiA9IGZlcC0+cnhfc2tidWZmW2N1cmlkeF07Ci0KLQkJCWRtYV91bm1hcF9zaW5nbGUoZmVwLT5kZXYsIENCRFJfQlVGQUREUihiZHApLAotCQkJCUwxX0NBQ0hFX0FMSUdOKFBLVF9NQVhCVUZfU0laRSksCi0JCQkJRE1BX0ZST01fREVWSUNFKTsKLQotCQkJLyoKLQkJCSAqIFByb2Nlc3MgdGhlIGluY29taW5nIGZyYW1lLgotCQkJICovCi0JCQlmZXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCXBrdF9sZW4gPSBDQkRSX0RBVExFTihiZHApIC0gNDsJLyogcmVtb3ZlIENSQyAqLwotCQkJZmVwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuICsgNDsKLQotCQkJaWYgKHBrdF9sZW4gPD0gZnBpLT5yeF9jb3B5YnJlYWspIHsKLQkJCQkvKiArMiB0byBtYWtlIElQIGhlYWRlciBMMSBjYWNoZSBhbGlnbmVkICovCi0JCQkJc2tibiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBwa3RfbGVuICsgMik7Ci0JCQkJaWYgKHNrYm4gIT0gTlVMTCkgewotCQkJCQlza2JfcmVzZXJ2ZShza2JuLCAyKTsJLyogYWxpZ24gSVAgaGVhZGVyICovCi0JCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAotCQkJCQkJICAgICAgc2tibi0+ZGF0YSwgcGt0X2xlbik7Ci0JCQkJCXN3YXAoc2tiLCBza2JuKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNrYm4gPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgRU5FVF9SWF9GUlNJWkUpOwotCi0JCQkJaWYgKHNrYm4pCi0JCQkJCXNrYl9hbGlnbihza2JuLCBFTkVUX1JYX0FMSUdOKTsKLQkJCX0KLQotCQkJaWYgKHNrYm4gIT0gTlVMTCkgewotCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJLyogTWFrZSByb29tICovCi0JCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKLQkJCQlyZWNlaXZlZCsrOwotCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Ci0JCQl9IGVsc2UgewotCQkJCWZlcC0+c3RhdHMucnhfZHJvcHBlZCsrOwotCQkJCXNrYm4gPSBza2I7Ci0JCQl9Ci0JCX0KLQotCQlmZXAtPnJ4X3NrYnVmZltjdXJpZHhdID0gc2tibjsKLQkJQ0JEV19CVUZBRERSKGJkcCwgZG1hX21hcF9zaW5nbGUoZmVwLT5kZXYsIHNrYm4tPmRhdGEsCi0JCQkgICAgIEwxX0NBQ0hFX0FMSUdOKFBLVF9NQVhCVUZfU0laRSksCi0JCQkgICAgIERNQV9GUk9NX0RFVklDRSkpOwotCQlDQkRXX0RBVExFTihiZHAsIDApOwotCQlDQkRXX1NDKGJkcCwgKHNjICYgfkJEX0VORVRfUlhfU1RBVFMpIHwgQkRfRU5FVF9SWF9FTVBUWSk7Ci0KLQkJLyoKLQkJICogVXBkYXRlIEJEIHBvaW50ZXIgdG8gbmV4dCBlbnRyeS4KLQkJICovCi0JCWlmICgoc2MgJiBCRF9FTkVUX1JYX1dSQVApID09IDApCi0JCQliZHArKzsKLQkJZWxzZQotCQkJYmRwID0gZmVwLT5yeF9iZF9iYXNlOwotCi0JCSgqZmVwLT5vcHMtPnJ4X2JkX2RvbmUpKGRldik7Ci0KLQkJaWYgKHJlY2VpdmVkID49IGJ1ZGdldCkKLQkJCWJyZWFrOwotCX0KLQotCWZlcC0+Y3VyX3J4ID0gYmRwOwotCi0JaWYgKHJlY2VpdmVkIDwgYnVkZ2V0KSB7Ci0JCS8qIGRvbmUgKi8KLQkJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQkJKCpmZXAtPm9wcy0+bmFwaV9lbmFibGVfcngpKGRldik7Ci0JfQotCXJldHVybiByZWNlaXZlZDsKLX0KLQotc3RhdGljIGludCBmc19lbmV0X3R4X25hcGkoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlLAotCQkJCQkJICAgbmFwaV90eCk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGZlcC0+bmRldjsKLQljYmRfdCBfX2lvbWVtICpiZHA7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgZGlydHlpZHgsIGRvX3dha2UsIGRvX3Jlc3RhcnQ7Ci0JdTE2IHNjOwotCWludCBoYXNfdHhfd29yayA9IDA7CisJaW50IHR4X2xlZnQgPSBUWF9SSU5HX1NJWkU7CiAKIAlzcGluX2xvY2soJmZlcC0+dHhfbG9jayk7CiAJYmRwID0gZmVwLT5kaXJ0eV90eDsKIAotCS8qIGNsZWFyIFRYIHN0YXR1cyBiaXRzIGZvciBuYXBpKi8KLQkoKmZlcC0+b3BzLT5uYXBpX2NsZWFyX3R4X2V2ZW50KShkZXYpOworCS8qIGNsZWFyIHN0YXR1cyBiaXRzIGZvciBuYXBpKi8KKwkoKmZlcC0+b3BzLT5uYXBpX2NsZWFyX2V2ZW50KShkZXYpOwogCiAJZG9fd2FrZSA9IGRvX3Jlc3RhcnQgPSAwOwotCXdoaWxlICgoKHNjID0gQ0JEUl9TQyhiZHApKSAmIEJEX0VORVRfVFhfUkVBRFkpID09IDApIHsKKwl3aGlsZSAoKChzYyA9IENCRFJfU0MoYmRwKSkgJiBCRF9FTkVUX1RYX1JFQURZKSA9PSAwICYmIHR4X2xlZnQpIHsKIAkJZGlydHlpZHggPSBiZHAgLSBmZXAtPnR4X2JkX2Jhc2U7CiAKIAkJaWYgKGZlcC0+dHhfZnJlZSA9PSBmZXAtPnR4X3JpbmcpCkBAIC0zMDIsOSArMTc1LDkgQEAKIAkJICogU2luY2Ugd2UgaGF2ZSBmcmVlZCB1cCBhIGJ1ZmZlciwgdGhlIHJpbmcgaXMgbm8gbG9uZ2VyCiAJCSAqIGZ1bGwuCiAJCSAqLwotCQlpZiAoKytmZXAtPnR4X2ZyZWUgPj0gTUFYX1NLQl9GUkFHUykKKwkJaWYgKCsrZmVwLT50eF9mcmVlID09IE1BWF9TS0JfRlJBR1MpCiAJCQlkb193YWtlID0gMTsKLQkJaGFzX3R4X3dvcmsgPSAxOworCQl0eF9sZWZ0LS07CiAJfQogCiAJZmVwLT5kaXJ0eV90eCA9IGJkcDsKQEAgLTMxMiwxOSArMTg1LDEyOSBAQAogCWlmIChkb19yZXN0YXJ0KQogCQkoKmZlcC0+b3BzLT50eF9yZXN0YXJ0KShkZXYpOwogCi0JaWYgKCFoYXNfdHhfd29yaykgewotCQluYXBpX2NvbXBsZXRlKG5hcGkpOwotCQkoKmZlcC0+b3BzLT5uYXBpX2VuYWJsZV90eCkoZGV2KTsKLQl9Ci0KIAlzcGluX3VubG9jaygmZmVwLT50eF9sb2NrKTsKIAogCWlmIChkb193YWtlKQogCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CiAKLQlpZiAoaGFzX3R4X3dvcmspCi0JCXJldHVybiBidWRnZXQ7Ci0JcmV0dXJuIDA7CisJLyoKKwkgKiBGaXJzdCwgZ3JhYiBhbGwgb2YgdGhlIHN0YXRzIGZvciB0aGUgaW5jb21pbmcgcGFja2V0LgorCSAqIFRoZXNlIGdldCBtZXNzZWQgdXAgaWYgd2UgZ2V0IGNhbGxlZCBkdWUgdG8gYSBidXN5IGNvbmRpdGlvbi4KKwkgKi8KKwliZHAgPSBmZXAtPmN1cl9yeDsKKworCXdoaWxlICgoKHNjID0gQ0JEUl9TQyhiZHApKSAmIEJEX0VORVRfUlhfRU1QVFkpID09IDAgJiYKKwkgICAgICAgcmVjZWl2ZWQgPCBidWRnZXQpIHsKKwkJY3VyaWR4ID0gYmRwIC0gZmVwLT5yeF9iZF9iYXNlOworCisJCS8qCisJCSAqIFNpbmNlIHdlIGhhdmUgYWxsb2NhdGVkIHNwYWNlIHRvIGhvbGQgYSBjb21wbGV0ZSBmcmFtZSwKKwkJICogdGhlIGxhc3QgaW5kaWNhdG9yIHNob3VsZCBiZSBzZXQuCisJCSAqLworCQlpZiAoKHNjICYgQkRfRU5FVF9SWF9MQVNUKSA9PSAwKQorCQkJZGV2X3dhcm4oZmVwLT5kZXYsICJyY3YgaXMgbm90ICtsYXN0XG4iKTsKKworCQkvKgorCQkgKiBDaGVjayBmb3IgZXJyb3JzLgorCQkgKi8KKwkJaWYgKHNjICYgKEJEX0VORVRfUlhfTEcgfCBCRF9FTkVUX1JYX1NIIHwgQkRfRU5FVF9SWF9DTCB8CisJCQkgIEJEX0VORVRfUlhfTk8gfCBCRF9FTkVUX1JYX0NSIHwgQkRfRU5FVF9SWF9PVikpIHsKKwkJCWZlcC0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkvKiBGcmFtZSB0b28gbG9uZyBvciB0b28gc2hvcnQuICovCisJCQlpZiAoc2MgJiAoQkRfRU5FVF9SWF9MRyB8IEJEX0VORVRfUlhfU0gpKQorCQkJCWZlcC0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOworCQkJLyogRnJhbWUgYWxpZ25tZW50ICovCisJCQlpZiAoc2MgJiAoQkRfRU5FVF9SWF9OTyB8IEJEX0VORVRfUlhfQ0wpKQorCQkJCWZlcC0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CisJCQkvKiBDUkMgRXJyb3IgKi8KKwkJCWlmIChzYyAmIEJEX0VORVRfUlhfQ1IpCisJCQkJZmVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisJCQkvKiBGSUZPIG92ZXJydW4gKi8KKwkJCWlmIChzYyAmIEJEX0VORVRfUlhfT1YpCisJCQkJZmVwLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CisKKwkJCXNrYm4gPSBmZXAtPnJ4X3NrYnVmZltjdXJpZHhdOworCQl9IGVsc2UgeworCQkJc2tiID0gZmVwLT5yeF9za2J1ZmZbY3VyaWR4XTsKKworCQkJLyoKKwkJCSAqIFByb2Nlc3MgdGhlIGluY29taW5nIGZyYW1lLgorCQkJICovCisJCQlmZXAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCXBrdF9sZW4gPSBDQkRSX0RBVExFTihiZHApIC0gNDsJLyogcmVtb3ZlIENSQyAqLworCQkJZmVwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuICsgNDsKKworCQkJaWYgKHBrdF9sZW4gPD0gZnBpLT5yeF9jb3B5YnJlYWspIHsKKwkJCQkvKiArMiB0byBtYWtlIElQIGhlYWRlciBMMSBjYWNoZSBhbGlnbmVkICovCisJCQkJc2tibiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBwa3RfbGVuICsgMik7CisJCQkJaWYgKHNrYm4gIT0gTlVMTCkgeworCQkJCQlza2JfcmVzZXJ2ZShza2JuLCAyKTsJLyogYWxpZ24gSVAgaGVhZGVyICovCisJCQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGEoc2tiLAorCQkJCQkJICAgICAgc2tibi0+ZGF0YSwgcGt0X2xlbik7CisJCQkJCXN3YXAoc2tiLCBza2JuKTsKKwkJCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZmVwLT5kZXYsCisJCQkJCQlDQkRSX0JVRkFERFIoYmRwKSwKKwkJCQkJCUwxX0NBQ0hFX0FMSUdOKHBrdF9sZW4pLAorCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXNrYm4gPSBuZXRkZXZfYWxsb2Nfc2tiKGRldiwgRU5FVF9SWF9GUlNJWkUpOworCisJCQkJaWYgKHNrYm4pIHsKKwkJCQkJZG1hX2FkZHJfdCBkbWE7CisKKwkJCQkJc2tiX2FsaWduKHNrYm4sIEVORVRfUlhfQUxJR04pOworCisJCQkJCWRtYV91bm1hcF9zaW5nbGUoZmVwLT5kZXYsCisJCQkJCQlDQkRSX0JVRkFERFIoYmRwKSwKKwkJCQkJCUwxX0NBQ0hFX0FMSUdOKFBLVF9NQVhCVUZfU0laRSksCisJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCisJCQkJCWRtYSA9IGRtYV9tYXBfc2luZ2xlKGZlcC0+ZGV2LAorCQkJCQkJc2tibi0+ZGF0YSwKKwkJCQkJCUwxX0NBQ0hFX0FMSUdOKFBLVF9NQVhCVUZfU0laRSksCisJCQkJCQlETUFfRlJPTV9ERVZJQ0UpOworCQkJCQlDQkRXX0JVRkFERFIoYmRwLCBkbWEpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHNrYm4gIT0gTlVMTCkgeworCQkJCXNrYl9wdXQoc2tiLCBwa3RfbGVuKTsJLyogTWFrZSByb29tICovCisJCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZGV2KTsKKwkJCQlyZWNlaXZlZCsrOworCQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCQl9IGVsc2UgeworCQkJCWZlcC0+c3RhdHMucnhfZHJvcHBlZCsrOworCQkJCXNrYm4gPSBza2I7CisJCQl9CisJCX0KKworCQlmZXAtPnJ4X3NrYnVmZltjdXJpZHhdID0gc2tibjsKKwkJQ0JEV19EQVRMRU4oYmRwLCAwKTsKKwkJQ0JEV19TQyhiZHAsIChzYyAmIH5CRF9FTkVUX1JYX1NUQVRTKSB8IEJEX0VORVRfUlhfRU1QVFkpOworCisJCS8qCisJCSAqIFVwZGF0ZSBCRCBwb2ludGVyIHRvIG5leHQgZW50cnkuCisJCSAqLworCQlpZiAoKHNjICYgQkRfRU5FVF9SWF9XUkFQKSA9PSAwKQorCQkJYmRwKys7CisJCWVsc2UKKwkJCWJkcCA9IGZlcC0+cnhfYmRfYmFzZTsKKworCQkoKmZlcC0+b3BzLT5yeF9iZF9kb25lKShkZXYpOworCX0KKworCWZlcC0+Y3VyX3J4ID0gYmRwOworCisJaWYgKHJlY2VpdmVkIDwgYnVkZ2V0ICYmIHR4X2xlZnQpIHsKKwkJLyogZG9uZSAqLworCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCQkoKmZlcC0+b3BzLT5uYXBpX2VuYWJsZSkoZGV2KTsKKworCQlyZXR1cm4gcmVjZWl2ZWQ7CisJfQorCisJcmV0dXJuIGJ1ZGdldDsKIH0KIAogLyoKQEAgLTM1MCwxOCArMzMzLDE4IEBACiAJCW5yKys7CiAKIAkJaW50X2Nscl9ldmVudHMgPSBpbnRfZXZlbnRzOwotCQlpbnRfY2xyX2V2ZW50cyAmPSB+ZmVwLT5ldl9uYXBpX3J4OworCQlpbnRfY2xyX2V2ZW50cyAmPSB+ZmVwLT5ldl9uYXBpOwogCiAJCSgqZmVwLT5vcHMtPmNsZWFyX2ludF9ldmVudHMpKGRldiwgaW50X2Nscl9ldmVudHMpOwogCiAJCWlmIChpbnRfZXZlbnRzICYgZmVwLT5ldl9lcnIpCiAJCQkoKmZlcC0+b3BzLT5ldl9lcnJvcikoZGV2LCBpbnRfZXZlbnRzKTsKIAotCQlpZiAoaW50X2V2ZW50cyAmIGZlcC0+ZXZfcngpIHsKKwkJaWYgKGludF9ldmVudHMgJiBmZXAtPmV2KSB7CiAJCQluYXBpX29rID0gbmFwaV9zY2hlZHVsZV9wcmVwKCZmZXAtPm5hcGkpOwogCi0JCQkoKmZlcC0+b3BzLT5uYXBpX2Rpc2FibGVfcngpKGRldik7Ci0JCQkoKmZlcC0+b3BzLT5jbGVhcl9pbnRfZXZlbnRzKShkZXYsIGZlcC0+ZXZfbmFwaV9yeCk7CisJCQkoKmZlcC0+b3BzLT5uYXBpX2Rpc2FibGUpKGRldik7CisJCQkoKmZlcC0+b3BzLT5jbGVhcl9pbnRfZXZlbnRzKShkZXYsIGZlcC0+ZXZfbmFwaSk7CiAKIAkJCS8qIE5PVEU6IGl0IGlzIHBvc3NpYmxlIGZvciBGQ0NzIGluIE5BUEkgbW9kZSAgICAqLwogCQkJLyogdG8gc3VibWl0IGEgc3B1cmlvdXMgaW50ZXJydXB0IHdoaWxlIGluIHBvbGwgICovCkBAIC0zNjksMTcgKzM1Miw2IEBACiAJCQkJX19uYXBpX3NjaGVkdWxlKCZmZXAtPm5hcGkpOwogCQl9CiAKLQkJaWYgKGludF9ldmVudHMgJiBmZXAtPmV2X3R4KSB7Ci0JCQluYXBpX29rID0gbmFwaV9zY2hlZHVsZV9wcmVwKCZmZXAtPm5hcGlfdHgpOwotCi0JCQkoKmZlcC0+b3BzLT5uYXBpX2Rpc2FibGVfdHgpKGRldik7Ci0JCQkoKmZlcC0+b3BzLT5jbGVhcl9pbnRfZXZlbnRzKShkZXYsIGZlcC0+ZXZfbmFwaV90eCk7Ci0KLQkJCS8qIE5PVEU6IGl0IGlzIHBvc3NpYmxlIGZvciBGQ0NzIGluIE5BUEkgbW9kZSAgICAqLwotCQkJLyogdG8gc3VibWl0IGEgc3B1cmlvdXMgaW50ZXJydXB0IHdoaWxlIGluIHBvbGwgICovCi0JCQlpZiAobmFwaV9vaykKLQkJCQlfX25hcGlfc2NoZWR1bGUoJmZlcC0+bmFwaV90eCk7Ci0JCX0KIAl9CiAKIAloYW5kbGVkID0gbnIgPiAwOwpAQCAtNjU5LDcgKzYzMSw4IEBACiAJfQogCiAJcGh5X3N0YXJ0KGRldi0+cGh5ZGV2KTsKLQl3YWtlID0gZmVwLT50eF9mcmVlICYmICEoQ0JEUl9TQyhmZXAtPmN1cl90eCkgJiBCRF9FTkVUX1RYX1JFQURZKTsKKwl3YWtlID0gZmVwLT50eF9mcmVlID49IE1BWF9TS0JfRlJBR1MgJiYKKwkgICAgICAgIShDQkRSX1NDKGZlcC0+Y3VyX3R4KSAmIEJEX0VORVRfVFhfUkVBRFkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZlcC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHdha2UpCkBAIC03NTEsMTEgKzcyNCwxMCBAQAogCWludCBlcnI7CiAKIAkvKiB0byBpbml0aWFsaXplIHRoZSBmZXAtPmN1cl9yeCwuLi4gKi8KLQkvKiBub3QgZG9pbmcgdGhpcywgd2lsbCBjYXVzZSBhIGNyYXNoIGluIGZzX2VuZXRfcnhfbmFwaSAqLworCS8qIG5vdCBkb2luZyB0aGlzLCB3aWxsIGNhdXNlIGEgY3Jhc2ggaW4gZnNfZW5ldF9uYXBpICovCiAJZnNfaW5pdF9iZHMoZmVwLT5uZGV2KTsKIAogCW5hcGlfZW5hYmxlKCZmZXAtPm5hcGkpOwotCW5hcGlfZW5hYmxlKCZmZXAtPm5hcGlfdHgpOwogCiAJLyogSW5zdGFsbCBvdXIgaW50ZXJydXB0IGhhbmRsZXIuICovCiAJciA9IHJlcXVlc3RfaXJxKGZlcC0+aW50ZXJydXB0LCBmc19lbmV0X2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCkBAIC03NjMsNyArNzM1LDYgQEAKIAlpZiAociAhPSAwKSB7CiAJCWRldl9lcnIoZmVwLT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgRlNfRU5FVCBJUlEhIik7CiAJCW5hcGlfZGlzYWJsZSgmZmVwLT5uYXBpKTsKLQkJbmFwaV9kaXNhYmxlKCZmZXAtPm5hcGlfdHgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTc3MSw3ICs3NDIsNiBAQAogCWlmIChlcnIpIHsKIAkJZnJlZV9pcnEoZmVwLT5pbnRlcnJ1cHQsIGRldik7CiAJCW5hcGlfZGlzYWJsZSgmZmVwLT5uYXBpKTsKLQkJbmFwaV9kaXNhYmxlKCZmZXAtPm5hcGlfdHgpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlwaHlfc3RhcnQoZGV2LT5waHlkZXYpOwpAQCAtNzg5LDcgKzc1OSw2IEBACiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAJbmFwaV9kaXNhYmxlKCZmZXAtPm5hcGkpOwotCW5hcGlfZGlzYWJsZSgmZmVwLT5uYXBpX3R4KTsKIAlwaHlfc3RvcChkZXYtPnBoeWRldik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZmVwLT5sb2NrLCBmbGFncyk7CkBAIC04NjEsNiArODMwLDQ0IEBACiAJZmVwLT5tc2dfZW5hYmxlID0gdmFsdWU7CiB9CiAKK3N0YXRpYyBpbnQgZnNfZ2V0X3R1bmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgY29uc3Qgc3RydWN0IGV0aHRvb2xfdHVuYWJsZSAqdHVuYSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmc19wbGF0Zm9ybV9pbmZvICpmcGkgPSBmZXAtPmZwaTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAodHVuYS0+aWQpIHsKKwljYXNlIEVUSFRPT0xfUlhfQ09QWUJSRUFLOgorCQkqKHUzMiAqKWRhdGEgPSBmcGktPnJ4X2NvcHlicmVhazsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmc19zZXRfdHVuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBjb25zdCBzdHJ1Y3QgZXRodG9vbF90dW5hYmxlICp0dW5hLCBjb25zdCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGZzX3BsYXRmb3JtX2luZm8gKmZwaSA9IGZlcC0+ZnBpOworCWludCByZXQgPSAwOworCisJc3dpdGNoICh0dW5hLT5pZCkgeworCWNhc2UgRVRIVE9PTF9SWF9DT1BZQlJFQUs6CisJCWZwaS0+cnhfY29weWJyZWFrID0gKih1MzIgKilkYXRhOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGZzX2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbyA9IGZzX2dldF9kcnZpbmZvLAogCS5nZXRfcmVnc19sZW4gPSBmc19nZXRfcmVnc19sZW4sCkBAIC04NzIsNiArODc5LDggQEAKIAkuZ2V0X3RzX2luZm8gPSBldGh0b29sX29wX2dldF90c19pbmZvLAogCS5nZXRfbGlua19rc2V0dGluZ3MgPSBwaHlfZXRodG9vbF9nZXRfbGlua19rc2V0dGluZ3MsCiAJLnNldF9saW5rX2tzZXR0aW5ncyA9IHBoeV9ldGh0b29sX3NldF9saW5rX2tzZXR0aW5ncywKKwkuZ2V0X3R1bmFibGUgPSBmc19nZXRfdHVuYWJsZSwKKwkuc2V0X3R1bmFibGUgPSBmc19zZXRfdHVuYWJsZSwKIH07CiAKIHN0YXRpYyBpbnQgZnNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKQEAgLTkzOSw4ICs5NDgsOCBAQAogCQlmcGktPmNwX2NvbW1hbmQgPSAqZGF0YTsKIAl9CiAKLQlmcGktPnJ4X3JpbmcgPSAzMjsKLQlmcGktPnR4X3JpbmcgPSA2NDsKKwlmcGktPnJ4X3JpbmcgPSBSWF9SSU5HX1NJWkU7CisJZnBpLT50eF9yaW5nID0gVFhfUklOR19TSVpFOwogCWZwaS0+cnhfY29weWJyZWFrID0gMjQwOwogCWZwaS0+bmFwaV93ZWlnaHQgPSAxNzsKIAlmcGktPnBoeV9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShvZmRldi0+ZGV2Lm9mX25vZGUsICJwaHktaGFuZGxlIiwgMCk7CkBAIC0xMDI0LDggKzEwMzMsNyBAQAogCiAJbmRldi0+bmV0ZGV2X29wcyA9ICZmc19lbmV0X25ldGRldl9vcHM7CiAJbmRldi0+d2F0Y2hkb2dfdGltZW8gPSAyICogSFo7Ci0JbmV0aWZfbmFwaV9hZGQobmRldiwgJmZlcC0+bmFwaSwgZnNfZW5ldF9yeF9uYXBpLCBmcGktPm5hcGlfd2VpZ2h0KTsKLQluZXRpZl90eF9uYXBpX2FkZChuZGV2LCAmZmVwLT5uYXBpX3R4LCBmc19lbmV0X3R4X25hcGksIDIpOworCW5ldGlmX25hcGlfYWRkKG5kZXYsICZmZXAtPm5hcGksIGZzX2VuZXRfbmFwaSwgZnBpLT5uYXBpX3dlaWdodCk7CiAKIAluZGV2LT5ldGh0b29sX29wcyA9ICZmc19ldGh0b29sX29wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvZnNfZW5ldC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvZnNfZW5ldC5oCmluZGV4IGUyOWY1NGEuLmZlZTI0YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LmgKQEAgLTgxLDEyICs4MSw5IEBACiAJdm9pZCAoKmFkanVzdF9saW5rKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl2b2lkICgqcmVzdGFydCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJdm9pZCAoKnN0b3ApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpuYXBpX2NsZWFyX3J4X2V2ZW50KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQl2b2lkICgqbmFwaV9lbmFibGVfcngpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpuYXBpX2Rpc2FibGVfcngpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpuYXBpX2NsZWFyX3R4X2V2ZW50KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQl2b2lkICgqbmFwaV9lbmFibGVfdHgpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpuYXBpX2Rpc2FibGVfdHgpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpuYXBpX2NsZWFyX2V2ZW50KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqbmFwaV9lbmFibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpuYXBpX2Rpc2FibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXZvaWQgKCpyeF9iZF9kb25lKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl2b2lkICgqdHhfa2lja3N0YXJ0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAl1MzIgKCpnZXRfaW50X2V2ZW50cykoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CkBAIC0xMjIsNyArMTE5LDYgQEAKIAogc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSB7CiAJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7Ci0Jc3RydWN0IG5hcGlfc3RydWN0IG5hcGlfdHg7CiAJc3RydWN0IGRldmljZSAqZGV2OwkvKiBwb2ludGVyIGJhY2sgdG8gdGhlIGRldmljZSAobXVzdCBiZSBpbml0aWFsaXplZCBmaXJzdCkgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlzcGlubG9ja190IGxvY2s7CS8qIGR1cmluZyBhbGwgb3BzIGV4Y2VwdCBUWCBwY2t0IHByb2Nlc3NpbmcgKi8KQEAgLTE1MiwxMCArMTQ4LDggQEAKIAlpbnQgb2xkZHVwbGV4LCBvbGRzcGVlZCwgb2xkbGluazsJLyogY3VycmVudCBzZXR0aW5ncyAqLwogCiAJLyogZXZlbnQgbWFza3MgKi8KLQl1MzIgZXZfbmFwaV9yeDsJCS8qIG1hc2sgb2YgTkFQSSByeCBldmVudHMgKi8KLQl1MzIgZXZfbmFwaV90eDsJCS8qIG1hc2sgb2YgTkFQSSByeCBldmVudHMgKi8KLQl1MzIgZXZfcng7CQkvKiByeCBldmVudCBtYXNrICAgICAgICAgICovCi0JdTMyIGV2X3R4OwkJLyogdHggZXZlbnQgbWFzayAgICAgICAgICAqLworCXUzMiBldl9uYXBpOwkJLyogbWFzayBvZiBOQVBJIGV2ZW50cyAqLworCXUzMiBldjsJCQkvKiBldmVudCBtYXNrICAgICAgICAgICovCiAJdTMyIGV2X2VycjsJCS8qIGVycm9yIGV2ZW50IG1hc2sgICAgICAgKi8KIAogCXUxNiBiZF9yeF9lbXB0eTsJLyogbWFzayBvZiBCRCByeCBlbXB0eQkgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtZmNjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtZmNjLmMKaW5kZXggZDcxNzYxYS4uMTIwYzc1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWFjLWZjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1mY2MuYwpAQCAtOTAsNyArOTAsNyBAQAogCWludCByZXQgPSAtRUlOVkFMOwogCiAJZmVwLT5pbnRlcnJ1cHQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+ZGV2Lm9mX25vZGUsIDApOwotCWlmIChmZXAtPmludGVycnVwdCA9PSBOT19JUlEpCisJaWYgKCFmZXAtPmludGVycnVwdCkKIAkJZ290byBvdXQ7CiAKIAlmZXAtPmZjYy5mY2NwID0gb2ZfaW9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKQEAgLTEyNCwxMCArMTI0LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZGVmaW5lIEZDQ19OQVBJX1JYX0VWRU5UX01TSwkoRkNDX0VORVRfUlhGIHwgRkNDX0VORVRfUlhCKQotI2RlZmluZSBGQ0NfTkFQSV9UWF9FVkVOVF9NU0sJKEZDQ19FTkVUX1RYQikKLSNkZWZpbmUgRkNDX1JYX0VWRU5UCQkoRkNDX0VORVRfUlhGKQotI2RlZmluZSBGQ0NfVFhfRVZFTlQJCShGQ0NfRU5FVF9UWEIpCisjZGVmaW5lIEZDQ19OQVBJX0VWRU5UX01TSwkoRkNDX0VORVRfUlhGIHwgRkNDX0VORVRfUlhCIHwgRkNDX0VORVRfVFhCKQorI2RlZmluZSBGQ0NfRVZFTlQJCShGQ0NfRU5FVF9SWEYgfCBGQ0NfRU5FVF9UWEIpCiAjZGVmaW5lIEZDQ19FUlJfRVZFTlRfTVNLCShGQ0NfRU5FVF9UWEUpCiAKIHN0YXRpYyBpbnQgc2V0dXBfZGF0YShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTM3LDEwICsxMzUsOCBAQAogCWlmIChkb19wZF9zZXR1cChmZXApICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZmVwLT5ldl9uYXBpX3J4ID0gRkNDX05BUElfUlhfRVZFTlRfTVNLOwotCWZlcC0+ZXZfbmFwaV90eCA9IEZDQ19OQVBJX1RYX0VWRU5UX01TSzsKLQlmZXAtPmV2X3J4ID0gRkNDX1JYX0VWRU5UOwotCWZlcC0+ZXZfdHggPSBGQ0NfVFhfRVZFTlQ7CisJZmVwLT5ldl9uYXBpID0gRkNDX05BUElfRVZFTlRfTVNLOworCWZlcC0+ZXYgPSBGQ0NfRVZFTlQ7CiAJZmVwLT5ldl9lcnIgPSBGQ0NfRVJSX0VWRU5UX01TSzsKIAogCXJldHVybiAwOwpAQCAtNDI0LDUyICs0MjAsMjggQEAKIAlmc19jbGVhbnVwX2JkcyhkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2NsZWFyX3J4X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2NsZWFyX2V2ZW50X2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlmY2NfdCBfX2lvbWVtICpmY2NwID0gZmVwLT5mY2MuZmNjcDsKIAotCVcxNihmY2NwLCBmY2NfZmNjZSwgRkNDX05BUElfUlhfRVZFTlRfTVNLKTsKKwlXMTYoZmNjcCwgZmNjX2ZjY2UsIEZDQ19OQVBJX0VWRU5UX01TSyk7CiB9CiAKLXN0YXRpYyB2b2lkIG5hcGlfZW5hYmxlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJZmNjX3QgX19pb21lbSAqZmNjcCA9IGZlcC0+ZmNjLmZjY3A7CiAKLQlTMTYoZmNjcCwgZmNjX2ZjY20sIEZDQ19OQVBJX1JYX0VWRU5UX01TSyk7CisJUzE2KGZjY3AsIGZjY19mY2NtLCBGQ0NfTkFQSV9FVkVOVF9NU0spOwogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2Rpc2FibGVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJZmNjX3QgX19pb21lbSAqZmNjcCA9IGZlcC0+ZmNjLmZjY3A7CiAKLQlDMTYoZmNjcCwgZmNjX2ZjY20sIEZDQ19OQVBJX1JYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfY2xlYXJfdHhfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWZjY190IF9faW9tZW0gKmZjY3AgPSBmZXAtPmZjYy5mY2NwOwotCi0JVzE2KGZjY3AsIGZjY19mY2NlLCBGQ0NfTkFQSV9UWF9FVkVOVF9NU0spOwotfQotCi1zdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0JZmNjX3QgX19pb21lbSAqZmNjcCA9IGZlcC0+ZmNjLmZjY3A7Ci0KLQlTMTYoZmNjcCwgZmNjX2ZjY20sIEZDQ19OQVBJX1RYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0JZmNjX3QgX19pb21lbSAqZmNjcCA9IGZlcC0+ZmNjLmZjY3A7Ci0KLQlDMTYoZmNjcCwgZmNjX2ZjY20sIEZDQ19OQVBJX1RYX0VWRU5UX01TSyk7CisJQzE2KGZjY3AsIGZjY19mY2NtLCBGQ0NfTkFQSV9FVkVOVF9NU0spOwogfQogCiBzdGF0aWMgdm9pZCByeF9iZF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC01OTUsMTIgKzU2Nyw5IEBACiAJLnNldF9tdWx0aWNhc3RfbGlzdAk9IHNldF9tdWx0aWNhc3RfbGlzdCwKIAkucmVzdGFydAkJPSByZXN0YXJ0LAogCS5zdG9wCQkJPSBzdG9wLAotCS5uYXBpX2NsZWFyX3J4X2V2ZW50CT0gbmFwaV9jbGVhcl9yeF9ldmVudCwKLQkubmFwaV9lbmFibGVfcngJCT0gbmFwaV9lbmFibGVfcngsCi0JLm5hcGlfZGlzYWJsZV9yeAk9IG5hcGlfZGlzYWJsZV9yeCwKLQkubmFwaV9jbGVhcl90eF9ldmVudAk9IG5hcGlfY2xlYXJfdHhfZXZlbnQsCi0JLm5hcGlfZW5hYmxlX3R4CQk9IG5hcGlfZW5hYmxlX3R4LAotCS5uYXBpX2Rpc2FibGVfdHgJPSBuYXBpX2Rpc2FibGVfdHgsCisJLm5hcGlfY2xlYXJfZXZlbnQJPSBuYXBpX2NsZWFyX2V2ZW50X2ZzLAorCS5uYXBpX2VuYWJsZQkJPSBuYXBpX2VuYWJsZV9mcywKKwkubmFwaV9kaXNhYmxlCQk9IG5hcGlfZGlzYWJsZV9mcywKIAkucnhfYmRfZG9uZQkJPSByeF9iZF9kb25lLAogCS50eF9raWNrc3RhcnQJCT0gdHhfa2lja3N0YXJ0LAogCS5nZXRfaW50X2V2ZW50cwkJPSBnZXRfaW50X2V2ZW50cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1mZWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1mZWMuYwppbmRleCAzNWEzMThlLi43NzdiZWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtZmVjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWFjLWZlYy5jCkBAIC05OSw3ICs5OSw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZmVwLT5kZXYpOwogCiAJZmVwLT5pbnRlcnJ1cHQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+ZGV2Lm9mX25vZGUsIDApOwotCWlmIChmZXAtPmludGVycnVwdCA9PSBOT19JUlEpCisJaWYgKCFmZXAtPmludGVycnVwdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmZXAtPmZlYy5mZWNwID0gb2ZfaW9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKQEAgLTEwOSwxMCArMTA5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBGRUNfTkFQSV9SWF9FVkVOVF9NU0sJKEZFQ19FTkVUX1JYRiB8IEZFQ19FTkVUX1JYQikKLSNkZWZpbmUgRkVDX05BUElfVFhfRVZFTlRfTVNLCShGRUNfRU5FVF9UWEYpCi0jZGVmaW5lIEZFQ19SWF9FVkVOVAkJKEZFQ19FTkVUX1JYRikKLSNkZWZpbmUgRkVDX1RYX0VWRU5UCQkoRkVDX0VORVRfVFhGKQorI2RlZmluZSBGRUNfTkFQSV9FVkVOVF9NU0sJKEZFQ19FTkVUX1JYRiB8IEZFQ19FTkVUX1JYQiB8IEZFQ19FTkVUX1RYRikKKyNkZWZpbmUgRkVDX0VWRU5UCQkoRkVDX0VORVRfUlhGIHwgRkVDX0VORVRfVFhGKQogI2RlZmluZSBGRUNfRVJSX0VWRU5UX01TSwkoRkVDX0VORVRfSEJFUlIgfCBGRUNfRU5FVF9CQUJSIHwgXAogCQkJCSBGRUNfRU5FVF9CQUJUIHwgRkVDX0VORVRfRUJFUlIpCiAKQEAgLTEyNiwxMCArMTI0LDggQEAKIAlmZXAtPmZlYy5odGhpID0gMDsKIAlmZXAtPmZlYy5odGxvID0gMDsKIAotCWZlcC0+ZXZfbmFwaV9yeCA9IEZFQ19OQVBJX1JYX0VWRU5UX01TSzsKLQlmZXAtPmV2X25hcGlfdHggPSBGRUNfTkFQSV9UWF9FVkVOVF9NU0s7Ci0JZmVwLT5ldl9yeCA9IEZFQ19SWF9FVkVOVDsKLQlmZXAtPmV2X3R4ID0gRkVDX1RYX0VWRU5UOworCWZlcC0+ZXZfbmFwaSA9IEZFQ19OQVBJX0VWRU5UX01TSzsKKwlmZXAtPmV2ID0gRkVDX0VWRU5UOwogCWZlcC0+ZXZfZXJyID0gRkVDX0VSUl9FVkVOVF9NU0s7CiAKIAlyZXR1cm4gMDsKQEAgLTM5Niw1MiArMzkyLDI4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2NsZWFyX3J4X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2NsZWFyX2V2ZW50X2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZmVjIF9faW9tZW0gKmZlY3AgPSBmZXAtPmZlYy5mZWNwOwogCi0JRlcoZmVjcCwgaWV2ZW50LCBGRUNfTkFQSV9SWF9FVkVOVF9NU0spOworCUZXKGZlY3AsIGlldmVudCwgRkVDX05BUElfRVZFTlRfTVNLKTsKIH0KIAotc3RhdGljIHZvaWQgbmFwaV9lbmFibGVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG5hcGlfZW5hYmxlX2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZmVjIF9faW9tZW0gKmZlY3AgPSBmZXAtPmZlYy5mZWNwOwogCi0JRlMoZmVjcCwgaW1hc2ssIEZFQ19OQVBJX1JYX0VWRU5UX01TSyk7CisJRlMoZmVjcCwgaW1hc2ssIEZFQ19OQVBJX0VWRU5UX01TSyk7CiB9CiAKLXN0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgbmFwaV9kaXNhYmxlX2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZmVjIF9faW9tZW0gKmZlY3AgPSBmZXAtPmZlYy5mZWNwOwogCi0JRkMoZmVjcCwgaW1hc2ssIEZFQ19OQVBJX1JYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfY2xlYXJfdHhfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBmZWMgX19pb21lbSAqZmVjcCA9IGZlcC0+ZmVjLmZlY3A7Ci0KLQlGVyhmZWNwLCBpZXZlbnQsIEZFQ19OQVBJX1RYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfZW5hYmxlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgZmVjIF9faW9tZW0gKmZlY3AgPSBmZXAtPmZlYy5mZWNwOwotCi0JRlMoZmVjcCwgaW1hc2ssIEZFQ19OQVBJX1RYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGZlYyBfX2lvbWVtICpmZWNwID0gZmVwLT5mZWMuZmVjcDsKLQotCUZDKGZlY3AsIGltYXNrLCBGRUNfTkFQSV9UWF9FVkVOVF9NU0spOworCUZDKGZlY3AsIGltYXNrLCBGRUNfTkFQSV9FVkVOVF9NU0spOwogfQogCiBzdGF0aWMgdm9pZCByeF9iZF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC01MTMsMTIgKzQ4NSw5IEBACiAJLnNldF9tdWx0aWNhc3RfbGlzdAk9IHNldF9tdWx0aWNhc3RfbGlzdCwKIAkucmVzdGFydAkJPSByZXN0YXJ0LAogCS5zdG9wCQkJPSBzdG9wLAotCS5uYXBpX2NsZWFyX3J4X2V2ZW50CT0gbmFwaV9jbGVhcl9yeF9ldmVudCwKLQkubmFwaV9lbmFibGVfcngJCT0gbmFwaV9lbmFibGVfcngsCi0JLm5hcGlfZGlzYWJsZV9yeAk9IG5hcGlfZGlzYWJsZV9yeCwKLQkubmFwaV9jbGVhcl90eF9ldmVudAk9IG5hcGlfY2xlYXJfdHhfZXZlbnQsCi0JLm5hcGlfZW5hYmxlX3R4CQk9IG5hcGlfZW5hYmxlX3R4LAotCS5uYXBpX2Rpc2FibGVfdHgJPSBuYXBpX2Rpc2FibGVfdHgsCisJLm5hcGlfY2xlYXJfZXZlbnQJPSBuYXBpX2NsZWFyX2V2ZW50X2ZzLAorCS5uYXBpX2VuYWJsZQkJPSBuYXBpX2VuYWJsZV9mcywKKwkubmFwaV9kaXNhYmxlCQk9IG5hcGlfZGlzYWJsZV9mcywKIAkucnhfYmRfZG9uZQkJPSByeF9iZF9kb25lLAogCS50eF9raWNrc3RhcnQJCT0gdHhfa2lja3N0YXJ0LAogCS5nZXRfaW50X2V2ZW50cwkJPSBnZXRfaW50X2V2ZW50cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1zY2MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21hYy1zY2MuYwppbmRleCBlOGI5YzMzLi4xNWFiZDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9tYWMtc2NjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWFjLXNjYy5jCkBAIC05OSw3ICs5OSw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZmVwLT5kZXYpOwogCiAJZmVwLT5pbnRlcnJ1cHQgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+ZGV2Lm9mX25vZGUsIDApOwotCWlmIChmZXAtPmludGVycnVwdCA9PSBOT19JUlEpCisJaWYgKCFmZXAtPmludGVycnVwdCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmZXAtPnNjYy5zY2NwID0gb2ZfaW9tYXAob2ZkZXYtPmRldi5vZl9ub2RlLCAwKTsKQEAgLTExNSwxMCArMTE1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBTQ0NfTkFQSV9SWF9FVkVOVF9NU0sJKFNDQ0VfRU5FVF9SWEYgfCBTQ0NFX0VORVRfUlhCKQotI2RlZmluZSBTQ0NfTkFQSV9UWF9FVkVOVF9NU0sJKFNDQ0VfRU5FVF9UWEIpCi0jZGVmaW5lIFNDQ19SWF9FVkVOVAkJKFNDQ0VfRU5FVF9SWEYpCi0jZGVmaW5lIFNDQ19UWF9FVkVOVAkJKFNDQ0VfRU5FVF9UWEIpCisjZGVmaW5lIFNDQ19OQVBJX0VWRU5UX01TSwkoU0NDRV9FTkVUX1JYRiB8IFNDQ0VfRU5FVF9SWEIgfCBTQ0NFX0VORVRfVFhCKQorI2RlZmluZSBTQ0NfRVZFTlQJCShTQ0NFX0VORVRfUlhGIHwgU0NDRV9FTkVUX1RYQikKICNkZWZpbmUgU0NDX0VSUl9FVkVOVF9NU0sJKFNDQ0VfRU5FVF9UWEUgfCBTQ0NFX0VORVRfQlNZKQogCiBzdGF0aWMgaW50IHNldHVwX2RhdGEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTEzMCwxMCArMTI4LDggQEAKIAlmZXAtPnNjYy5odGhpID0gMDsKIAlmZXAtPnNjYy5odGxvID0gMDsKIAotCWZlcC0+ZXZfbmFwaV9yeCA9IFNDQ19OQVBJX1JYX0VWRU5UX01TSzsKLQlmZXAtPmV2X25hcGlfdHggPSBTQ0NfTkFQSV9UWF9FVkVOVF9NU0s7Ci0JZmVwLT5ldl9yeCA9IFNDQ19SWF9FVkVOVDsKLQlmZXAtPmV2X3R4ID0gU0NDX1RYX0VWRU5UIHwgU0NDRV9FTkVUX1RYRTsKKwlmZXAtPmV2X25hcGkgPSBTQ0NfTkFQSV9FVkVOVF9NU0s7CisJZmVwLT5ldiA9IFNDQ19FVkVOVCB8IFNDQ0VfRU5FVF9UWEU7CiAJZmVwLT5ldl9lcnIgPSBTQ0NfRVJSX0VWRU5UX01TSzsKIAogCXJldHVybiAwOwpAQCAtMzc5LDUyICszNzUsMjggQEAKIAlmc19jbGVhbnVwX2JkcyhkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2NsZWFyX3J4X2V2ZW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2NsZWFyX2V2ZW50X2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZzX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzY2NfdCBfX2lvbWVtICpzY2NwID0gZmVwLT5zY2Muc2NjcDsKIAotCVcxNihzY2NwLCBzY2Nfc2NjZSwgU0NDX05BUElfUlhfRVZFTlRfTVNLKTsKKwlXMTYoc2NjcCwgc2NjX3NjY2UsIFNDQ19OQVBJX0VWRU5UX01TSyk7CiB9CiAKLXN0YXRpYyB2b2lkIG5hcGlfZW5hYmxlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJc2NjX3QgX19pb21lbSAqc2NjcCA9IGZlcC0+c2NjLnNjY3A7CiAKLQlTMTYoc2NjcCwgc2NjX3NjY20sIFNDQ19OQVBJX1JYX0VWRU5UX01TSyk7CisJUzE2KHNjY3AsIHNjY19zY2NtLCBTQ0NfTkFQSV9FVkVOVF9NU0spOwogfQogCi1zdGF0aWMgdm9pZCBuYXBpX2Rpc2FibGVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7CiAJc2NjX3QgX19pb21lbSAqc2NjcCA9IGZlcC0+c2NjLnNjY3A7CiAKLQlDMTYoc2NjcCwgc2NjX3NjY20sIFNDQ19OQVBJX1JYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfY2xlYXJfdHhfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgZnNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXNjY190IF9faW9tZW0gKnNjY3AgPSBmZXAtPnNjYy5zY2NwOwotCi0JVzE2KHNjY3AsIHNjY19zY2NlLCBTQ0NfTkFQSV9UWF9FVkVOVF9NU0spOwotfQotCi1zdGF0aWMgdm9pZCBuYXBpX2VuYWJsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc2NjX3QgX19pb21lbSAqc2NjcCA9IGZlcC0+c2NjLnNjY3A7Ci0KLQlTMTYoc2NjcCwgc2NjX3NjY20sIFNDQ19OQVBJX1RYX0VWRU5UX01TSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5hcGlfZGlzYWJsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBmc19lbmV0X3ByaXZhdGUgKmZlcCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc2NjX3QgX19pb21lbSAqc2NjcCA9IGZlcC0+c2NjLnNjY3A7Ci0KLQlDMTYoc2NjcCwgc2NjX3NjY20sIFNDQ19OQVBJX1RYX0VWRU5UX01TSyk7CisJQzE2KHNjY3AsIHNjY19zY2NtLCBTQ0NfTkFQSV9FVkVOVF9NU0spOwogfQogCiBzdGF0aWMgdm9pZCByeF9iZF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC00OTcsMTIgKzQ2OSw5IEBACiAJLnNldF9tdWx0aWNhc3RfbGlzdAk9IHNldF9tdWx0aWNhc3RfbGlzdCwKIAkucmVzdGFydAkJPSByZXN0YXJ0LAogCS5zdG9wCQkJPSBzdG9wLAotCS5uYXBpX2NsZWFyX3J4X2V2ZW50CT0gbmFwaV9jbGVhcl9yeF9ldmVudCwKLQkubmFwaV9lbmFibGVfcngJCT0gbmFwaV9lbmFibGVfcngsCi0JLm5hcGlfZGlzYWJsZV9yeAk9IG5hcGlfZGlzYWJsZV9yeCwKLQkubmFwaV9jbGVhcl90eF9ldmVudAk9IG5hcGlfY2xlYXJfdHhfZXZlbnQsCi0JLm5hcGlfZW5hYmxlX3R4CQk9IG5hcGlfZW5hYmxlX3R4LAotCS5uYXBpX2Rpc2FibGVfdHgJPSBuYXBpX2Rpc2FibGVfdHgsCisJLm5hcGlfY2xlYXJfZXZlbnQJPSBuYXBpX2NsZWFyX2V2ZW50X2ZzLAorCS5uYXBpX2VuYWJsZQkJPSBuYXBpX2VuYWJsZV9mcywKKwkubmFwaV9kaXNhYmxlCQk9IG5hcGlfZGlzYWJsZV9mcywKIAkucnhfYmRfZG9uZQkJPSByeF9iZF9kb25lLAogCS50eF9raWNrc3RhcnQJCT0gdHhfa2lja3N0YXJ0LAogCS5nZXRfaW50X2V2ZW50cwkJPSBnZXRfaW50X2V2ZW50cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc2xfcHFfbWRpby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzbF9wcV9tZGlvLmMKaW5kZXggZjNjNjNkYy4uNDQ2YzdiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzbF9wcV9tZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzbF9wcV9tZGlvLmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfR0lBTkZBUikgfHwgZGVmaW5lZChDT05GSUdfR0lBTkZBUl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfR0lBTkZBUikKIC8qCiAgKiBSZXR1cm4gdGhlIFRCSVBBIGFkZHJlc3MsIHN0YXJ0aW5nIGZyb20gdGhlIGFkZHJlc3MKICAqIG9mIHRoZSBtYXBwZWQgR0ZBUiBNRElPIHJlZ2lzdGVycyAoc3RydWN0IGdmYXIpCkBAIC0yMjgsNyArMjI4LDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfVUNDX0dFVEgpIHx8IGRlZmluZWQoQ09ORklHX1VDQ19HRVRIX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19VQ0NfR0VUSCkKIC8qCiAgKiBSZXR1cm4gdGhlIFRCSVBBUiBhZGRyZXNzIGZvciBhIFFFIE1ESU8gbm9kZSwgc3RhcnRpbmcgZnJvbSB0aGUgYWRkcmVzcwogICogb2YgdGhlIG1hcHBlZCBNSUkgcmVnaXN0ZXJzIChzdHJ1Y3QgZnNsX3BxX21paSkKQEAgLTMwNiw3ICszMDYsNyBAQAogI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzbF9wcV9tZGlvX21hdGNoW10gPSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfR0lBTkZBUikgfHwgZGVmaW5lZChDT05GSUdfR0lBTkZBUl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfR0lBTkZBUikKIAl7CiAJCS5jb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSIsCiAJCS5kYXRhID0gJihzdHJ1Y3QgZnNsX3BxX21kaW9fZGF0YSkgewpAQCAtMzQ0LDcgKzM0NCw3IEBACiAJCX0sCiAJfSwKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1VDQ19HRVRIKSB8fCBkZWZpbmVkKENPTkZJR19VQ0NfR0VUSF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVUNDX0dFVEgpCiAJewogCQkuY29tcGF0aWJsZSA9ICJmc2wsdWNjLW1kaW8iLAogCQkuZGF0YSA9ICYoc3RydWN0IGZzbF9wcV9tZGlvX2RhdGEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5jCmluZGV4IGQyMDkzNWQuLjRiNGY1YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuYwpAQCAtMjkyMiwxNyArMjkyMiwyNSBAQAogewogCXVuc2lnbmVkIGludCBzaXplID0gbHN0YXR1cyAmIEJEX0xFTkdUSF9NQVNLOwogCXN0cnVjdCBwYWdlICpwYWdlID0gcnhiLT5wYWdlOworCWJvb2wgbGFzdCA9ICEhKGxzdGF0dXMgJiBCRF9MRkxBRyhSWEJEX0xBU1QpKTsKIAogCS8qIFJlbW92ZSB0aGUgRkNTIGZyb20gdGhlIHBhY2tldCBsZW5ndGggKi8KLQlpZiAobGlrZWx5KGxzdGF0dXMgJiBCRF9MRkxBRyhSWEJEX0xBU1QpKSkKKwlpZiAobGFzdCkKIAkJc2l6ZSAtPSBFVEhfRkNTX0xFTjsKIAotCWlmIChsaWtlbHkoZmlyc3QpKQorCWlmIChsaWtlbHkoZmlyc3QpKSB7CiAJCXNrYl9wdXQoc2tiLCBzaXplKTsKLQllbHNlCi0JCXNrYl9hZGRfcnhfZnJhZyhza2IsIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MsIHBhZ2UsCi0JCQkJcnhiLT5wYWdlX29mZnNldCArIFJYQlVGX0FMSUdOTUVOVCwKLQkJCQlzaXplLCBHRkFSX1JYQl9UUlVFU0laRSk7CisJfSBlbHNlIHsKKwkJLyogdGhlIGxhc3QgZnJhZ21lbnRzJyBsZW5ndGggY29udGFpbnMgdGhlIGZ1bGwgZnJhbWUgbGVuZ3RoICovCisJCWlmIChsYXN0KQorCQkJc2l6ZSAtPSBza2ItPmxlbjsKKworCQkvKiBpbiBjYXNlIHRoZSBsYXN0IGZyYWdtZW50IGNvbnNpc3RlZCBvbmx5IG9mIHRoZSBGQ1MgKi8KKwkJaWYgKHNpemUgPiAwKQorCQkJc2tiX2FkZF9yeF9mcmFnKHNrYiwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncywgcGFnZSwKKwkJCQkJcnhiLT5wYWdlX29mZnNldCArIFJYQlVGX0FMSUdOTUVOVCwKKwkJCQkJc2l6ZSwgR0ZBUl9SWEJfVFJVRVNJWkUpOworCX0KIAogCS8qIHRyeSByZXVzZSBwYWdlICovCiAJaWYgKHVubGlrZWx5KHBhZ2VfY291bnQocGFnZSkgIT0gMSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuaAppbmRleCAzNzNmZDA5Li42ZThhOWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmgKQEAgLTEwMCw3ICsxMDAsOCBAQAogI2RlZmluZSBERUZBVUxUX1JYX0xGQ19USFIgIDE2CiAjZGVmaW5lIERFRkFVTFRfTEZDX1BUVlZBTCAgNAogCi0jZGVmaW5lIEdGQVJfUlhCX1NJWkUgMTUzNgorLyogcHJldmVudCBmcmFnbWVuYXRpb24gYnkgSFcgaW4gRFNBIGVudmlyb25tZW50cyAqLworI2RlZmluZSBHRkFSX1JYQl9TSVpFIHJvdW5kdXAoMTUzNiArIDgsIDY0KQogI2RlZmluZSBHRkFSX1NLQkZSQUdfU0laRSAoUlhCVUZfQUxJR05NRU5UICsgR0ZBUl9SWEJfU0laRSBcCiAJCQkgICsgU0tCX0RBVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKSkKICNkZWZpbmUgR0ZBUl9SWEJfVFJVRVNJWkUgMjA0OApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvdWNjX2dldGguYwppbmRleCA1YmYxYWRlLi4xODZlZjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvdWNjX2dldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvdWNjX2dldGguYwpAQCAtMzc1Niw3ICszNzU2LDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmICgoKnByb3AgPCBRRV9DTEtfTk9ORSkgfHwgKCpwcm9wID4gUUVfQ0xLMjQpKSB7Ci0JCQlwcl9lcnIoImludmFsaWQgcngtY2xvY2sgcHJvcHBlcnR5XG4iKTsKKwkJCXByX2VycigiaW52YWxpZCByeC1jbG9jayBwcm9wZXJ0eVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQl1Z19pbmZvLT51Zl9pbmZvLnJ4X2Nsb2NrID0gKnByb3A7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUveGdtYWNfbWRpby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3hnbWFjX21kaW8uYwppbmRleCA3YjhmZTg2Li5lMDNiMzBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUveGdtYWNfbWRpby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS94Z21hY19tZGlvLmMKQEAgLTI3MSwxMSArMjcxLDggQEAKIAkJZ290byBlcnJfaW9yZW1hcDsKIAl9CiAKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLAotCQkJICAgICJsaXR0bGUtZW5kaWFuIiwgTlVMTCkpCi0JCXByaXYtPmlzX2xpdHRsZV9lbmRpYW4gPSB0cnVlOwotCWVsc2UKLQkJcHJpdi0+aXNfbGl0dGxlX2VuZGlhbiA9IGZhbHNlOworCXByaXYtPmlzX2xpdHRsZV9lbmRpYW4gPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkgICAgICAgImxpdHRsZS1lbmRpYW4iKTsKIAogCXJldCA9IG9mX21kaW9idXNfcmVnaXN0ZXIoYnVzLCBucCk7CiAJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpcDA0X2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpcDA0X2V0aC5jCmluZGV4IDBjNGFmZTkuLjM5Nzc4ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXAwNF9ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGlwMDRfZXRoLmMKQEAgLTYwMCw3ICs2MDAsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotZW51bSBocnRpbWVyX3Jlc3RhcnQgdHhfZG9uZShzdHJ1Y3QgaHJ0aW1lciAqaHJ0aW1lcikKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCB0eF9kb25lKHN0cnVjdCBocnRpbWVyICpocnRpbWVyKQogewogCXN0cnVjdCBoaXAwNF9wcml2ICpwcml2OwogCkBAIC03NTUsMTMgKzc1NSwxMyBAQAogCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihkcnZpbmZvLT52ZXJzaW9uKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgaGlwMDRfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGhpcDA0X2V0aHRvb2xfb3BzID0gewogCS5nZXRfY29hbGVzY2UJCT0gaGlwMDRfZ2V0X2NvYWxlc2NlLAogCS5zZXRfY29hbGVzY2UJCT0gaGlwMDRfc2V0X2NvYWxlc2NlLAogCS5nZXRfZHJ2aW5mbwkJPSBoaXAwNF9nZXRfZHJ2aW5mbywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaGlwMDRfbmV0ZGV2X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaGlwMDRfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gaGlwMDRfbWFjX29wZW4sCiAJLm5kb19zdG9wCQk9IGhpcDA0X21hY19zdG9wLAogCS5uZG9fZ2V0X3N0YXRzCQk9IGhpcDA0X2dldF9zdGF0cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXNpX2ZlbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGlzaV9mZW1hYy5jCmluZGV4IGI1ZDdhZDAuLmNlZDE4NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXNpX2ZlbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpc2lfZmVtYWMuYwpAQCAtNjk5LDcgKzY5OSw3IEBACiAJcmV0dXJuIHBoeV9taWlfaW9jdGwoZGV2LT5waHlkZXYsIGlmcmVxLCBjbWQpOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGhpc2lfZmVtYWNfZXRodG9vbHNfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBoaXNpX2ZlbWFjX2V0aHRvb2xzX29wcyA9IHsKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gcGh5X2V0aHRvb2xfZ2V0X2xpbmtfa3NldHRpbmdzLAogCS5zZXRfbGlua19rc2V0dGluZ3MJPSBwaHlfZXRodG9vbF9zZXRfbGlua19rc2V0dGluZ3MsCkBAIC05NDAsOCArOTQwLDggQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotaW50IGhpc2lfZmVtYWNfZHJ2X3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKLQkJCSAgIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgaGlzaV9mZW1hY19kcnZfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGhpc2lfZmVtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwpAQCAtOTU3LDcgKzk1Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBoaXNpX2ZlbWFjX2Rydl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgaGlzaV9mZW1hY19kcnZfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgaGlzaV9mZW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGl4NWhkMl9nbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaGl4NWhkMl9nbWFjLmMKaW5kZXggMjc1NjE4Yi4uZTY5YTZiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hpeDVoZDJfZ21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9oaXg1aGQyX2dtYWMuYwpAQCAtNzUwLDcgKzc1MCw3IEBACiAJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBoaXg1aGQyX25ldF9zZXRfbWFjX2FkZHJlc3MsCiB9OwogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGhpeDVoZDJfZXRodG9vbHNfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBoaXg1aGQyX2V0aHRvb2xzX29wcyA9IHsKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X2xpbmtfa3NldHRpbmdzICAgICA9IHBoeV9ldGh0b29sX2dldF9saW5rX2tzZXR0aW5ncywKIAkuc2V0X2xpbmtfa3NldHRpbmdzICAgICA9IHBoeV9ldGh0b29sX3NldF9saW5rX2tzZXR0aW5ncywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21hYy5jCmluZGV4IDVjOGFmZTEuLmE4MzQ3NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWMuYwpAQCAtNjg0LDggKzY4NCw3IEBACiAJaWYgKCFwaHkgfHwgSVNfRVJSKHBoeSkpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKG1kaW8tPmlycSkKLQkJcGh5LT5pcnEgPSBtZGlvLT5pcnFbYWRkcl07CisJcGh5LT5pcnEgPSBtZGlvLT5pcnFbYWRkcl07CiAKIAkvKiBBbGwgZGF0YSBpcyBub3cgc3RvcmVkIGluIHRoZSBwaHkgc3RydWN0OwogCSAqIHJlZ2lzdGVyIGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFpbi5jCmluZGV4IGFmYjVkYWEuLmViNDQ4ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfbWFpbi5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKQEAgLTExNSwxMCArMTE2LDggQEAKIAogCQkJZHNhZl9kZXYtPnNjX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwKIAkJCQkJCQkJICByZXMpOwotCQkJaWYgKElTX0VSUihkc2FmX2Rldi0+c2NfYmFzZSkpIHsKLQkJCQlkZXZfZXJyKGRzYWZfZGV2LT5kZXYsICJzdWJjdHJsIGNhbiBub3QgbWFwIVxuIik7CisJCQlpZiAoSVNfRVJSKGRzYWZfZGV2LT5zY19iYXNlKSkKIAkJCQlyZXR1cm4gUFRSX0VSUihkc2FmX2Rldi0+c2NfYmFzZSk7Ci0JCQl9CiAKIAkJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwKIAkJCQkJCSAgICByZXNfaWR4KyspOwpAQCAtMTI5LDEwICsxMjgsOCBAQAogCiAJCQlkc2FmX2Rldi0+c2RzX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwKIAkJCQkJCQkJICAgcmVzKTsKLQkJCWlmIChJU19FUlIoZHNhZl9kZXYtPnNkc19iYXNlKSkgewotCQkJCWRldl9lcnIoZHNhZl9kZXYtPmRldiwgInNlcmRlcy1jdHJsIGNhbiBub3QgbWFwIVxuIik7CisJCQlpZiAoSVNfRVJSKGRzYWZfZGV2LT5zZHNfYmFzZSkpCiAJCQkJcmV0dXJuIFBUUl9FUlIoZHNhZl9kZXYtPnNkc19iYXNlKTsKLQkJCX0KIAkJfSBlbHNlIHsKIAkJCWRzYWZfZGV2LT5zdWJfY3RybCA9IHN5c2NvbjsKIAkJfQpAQCAtMTQ3LDEwICsxNDQsOCBAQAogCQl9CiAJfQogCWRzYWZfZGV2LT5wcGVfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwotCWlmIChJU19FUlIoZHNhZl9kZXYtPnBwZV9iYXNlKSkgewotCQlkZXZfZXJyKGRzYWZfZGV2LT5kZXYsICJwcGUtYmFzZSByZXNvdXJjZSBjYW4gbm90IG1hcCFcbiIpOworCWlmIChJU19FUlIoZHNhZl9kZXYtPnBwZV9iYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoZHNhZl9kZXYtPnBwZV9iYXNlKTsKLQl9CiAJZHNhZl9kZXYtPnBwZV9wYWRkciA9IHJlcy0+c3RhcnQ7CiAKIAlpZiAoIUhOU19EU0FGX0lTX0RFQlVHKGRzYWZfZGV2KSkgewpAQCAtMTY2LDEwICsxNjEsOCBAQAogCQkJfQogCQl9CiAJCWRzYWZfZGV2LT5pb19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JCWlmIChJU19FUlIoZHNhZl9kZXYtPmlvX2Jhc2UpKSB7Ci0JCQlkZXZfZXJyKGRzYWZfZGV2LT5kZXYsICJkc2FmLWJhc2UgcmVzb3VyY2UgY2FuIG5vdCBtYXAhXG4iKTsKKwkJaWYgKElTX0VSUihkc2FmX2Rldi0+aW9fYmFzZSkpCiAJCQlyZXR1cm4gUFRSX0VSUihkc2FmX2Rldi0+aW9fYmFzZSk7Ci0JCX0KIAl9CiAKIAlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZHNhZl9kZXYtPmRldiwgImRlc2MtbnVtIiwgJmRlc2NfbnVtKTsKQEAgLTI3ODEsNiArMjc3NCw4OSBAQAogCiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGdfZHNhZl9kcml2ZXIpOwogCisvKioKKyAqIGhuc19kc2FmX3JvY2VfcmVzZXQgLSByZXNldCBkc2FmIGFuZCByb2NlCisgKiBAZHNhZl9md25vZGU6IFBvaW50ZXIgdG8gZnJhbWV3b3JrIG5vZGUgZm9yIHRoZSBkYXNmCisgKiBAZW5hYmxlOiBmYWxzZSAtIHJlcXVlc3QgcmVzZXQgLCB0cnVlIC0gZHJvcCByZXNldAorICogcmV0dWVuIDAgLSBzdWNjZXNzICwgbmVnYXRpdmUgLWZhaWwKKyAqLworaW50IGhuc19kc2FmX3JvY2VfcmVzZXQoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmRzYWZfZndub2RlLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZHNhZl9kZXZpY2UgKmRzYWZfZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJdTMyIG1wOworCXUzMiBzbDsKKwl1MzIgY3JlZGl0OworCWludCBpOworCWNvbnN0IHUzMiBwb3J0X21hcFtEU0FGX1JPQ0VfQ1JFRElUX0NITl1bRFNBRl9ST0NFX0NIQU5fTU9ERV9OVU1dID0geworCQl7RFNBRl9ST0NFX1BPUlRfMCwgRFNBRl9ST0NFX1BPUlRfMCwgRFNBRl9ST0NFX1BPUlRfMH0sCisJCXtEU0FGX1JPQ0VfUE9SVF8xLCBEU0FGX1JPQ0VfUE9SVF8wLCBEU0FGX1JPQ0VfUE9SVF8wfSwKKwkJe0RTQUZfUk9DRV9QT1JUXzIsIERTQUZfUk9DRV9QT1JUXzEsIERTQUZfUk9DRV9QT1JUXzB9LAorCQl7RFNBRl9ST0NFX1BPUlRfMywgRFNBRl9ST0NFX1BPUlRfMSwgRFNBRl9ST0NFX1BPUlRfMH0sCisJCXtEU0FGX1JPQ0VfUE9SVF80LCBEU0FGX1JPQ0VfUE9SVF8yLCBEU0FGX1JPQ0VfUE9SVF8xfSwKKwkJe0RTQUZfUk9DRV9QT1JUXzQsIERTQUZfUk9DRV9QT1JUXzIsIERTQUZfUk9DRV9QT1JUXzF9LAorCQl7RFNBRl9ST0NFX1BPUlRfNSwgRFNBRl9ST0NFX1BPUlRfMywgRFNBRl9ST0NFX1BPUlRfMX0sCisJCXtEU0FGX1JPQ0VfUE9SVF81LCBEU0FGX1JPQ0VfUE9SVF8zLCBEU0FGX1JPQ0VfUE9SVF8xfSwKKwl9OworCWNvbnN0IHUzMiBzbF9tYXBbRFNBRl9ST0NFX0NSRURJVF9DSE5dW0RTQUZfUk9DRV9DSEFOX01PREVfTlVNXSA9IHsKKwkJe0RTQUZfUk9DRV9TTF8wLCBEU0FGX1JPQ0VfU0xfMCwgRFNBRl9ST0NFX1NMXzB9LAorCQl7RFNBRl9ST0NFX1NMXzAsIERTQUZfUk9DRV9TTF8xLCBEU0FGX1JPQ0VfU0xfMX0sCisJCXtEU0FGX1JPQ0VfU0xfMCwgRFNBRl9ST0NFX1NMXzAsIERTQUZfUk9DRV9TTF8yfSwKKwkJe0RTQUZfUk9DRV9TTF8wLCBEU0FGX1JPQ0VfU0xfMSwgRFNBRl9ST0NFX1NMXzN9LAorCQl7RFNBRl9ST0NFX1NMXzAsIERTQUZfUk9DRV9TTF8wLCBEU0FGX1JPQ0VfU0xfMH0sCisJCXtEU0FGX1JPQ0VfU0xfMSwgRFNBRl9ST0NFX1NMXzEsIERTQUZfUk9DRV9TTF8xfSwKKwkJe0RTQUZfUk9DRV9TTF8wLCBEU0FGX1JPQ0VfU0xfMCwgRFNBRl9ST0NFX1NMXzJ9LAorCQl7RFNBRl9ST0NFX1NMXzEsIERTQUZfUk9DRV9TTF8xLCBEU0FGX1JPQ0VfU0xfM30sCisJfTsKKworCWlmICghaXNfb2Zfbm9kZShkc2FmX2Z3bm9kZSkpIHsKKwkJcHJfZXJyKCJoaXNpX2RzYWY6IE9ubHkgc3VwcG9ydCBEVCBub2RlIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZSh0b19vZl9ub2RlKGRzYWZfZndub2RlKSk7CisJZHNhZl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJaWYgKEFFX0lTX1ZFUjEoZHNhZl9kZXYtPmRzYWZfdmVyKSkgeworCQlkZXZfZXJyKGRzYWZfZGV2LT5kZXYsICIlcyB2MSBjaGlwIGRvZXNuJ3Qgc3VwcG9ydCBSb0NFIVxuIiwKKwkJCWRzYWZfZGV2LT5hZV9kZXYubmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghZW5hYmxlKSB7CisJCS8qIFJlc2V0IHJvY2VlLWNoYW5uZWxzIGluIGRzYWYgYW5kIHJvY2VlICovCisJCWhuc19kc2FmX3Nyc3RfY2hucyhkc2FmX2RldiwgRFNBRl9DSE5TX01BU0ssIGZhbHNlKTsKKwkJaG5zX2RzYWZfcm9jZV9zcnN0KGRzYWZfZGV2LCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJLyogQ29uZmlndXJlIGRzYWYgdHggcm9jZSBjb3JyZXNwb25kIHRvIHBvcnQgbWFwIGFuZCBzbCBtYXAgKi8KKwkJbXAgPSBkc2FmX3JlYWRfZGV2KGRzYWZfZGV2LCBEU0FGX1JPQ0VfUE9SVF9NQVBfUkVHKTsKKwkJZm9yIChpID0gMDsgaSA8IERTQUZfUk9DRV9DUkVESVRfQ0hOOyBpKyspCisJCQlkc2FmX3NldF9maWVsZChtcCwgNyA8PCBpICogMywgaSAqIDMsCisJCQkJICAgICAgIHBvcnRfbWFwW2ldW0RTQUZfUk9DRV82UE9SVF9NT0RFXSk7CisJCWRzYWZfc2V0X2ZpZWxkKG1wLCAzIDw8IGkgKiAzLCBpICogMywgMCk7CisJCWRzYWZfd3JpdGVfZGV2KGRzYWZfZGV2LCBEU0FGX1JPQ0VfUE9SVF9NQVBfUkVHLCBtcCk7CisKKwkJc2wgPSBkc2FmX3JlYWRfZGV2KGRzYWZfZGV2LCBEU0FGX1JPQ0VfU0xfTUFQX1JFRyk7CisJCWZvciAoaSA9IDA7IGkgPCBEU0FGX1JPQ0VfQ1JFRElUX0NITjsgaSsrKQorCQkJZHNhZl9zZXRfZmllbGQoc2wsIDMgPDwgaSAqIDIsIGkgKiAyLAorCQkJCSAgICAgICBzbF9tYXBbaV1bRFNBRl9ST0NFXzZQT1JUX01PREVdKTsKKwkJZHNhZl93cml0ZV9kZXYoZHNhZl9kZXYsIERTQUZfUk9DRV9TTF9NQVBfUkVHLCBzbCk7CisKKwkJLyogRGUtcmVzZXQgcm9jZWUtY2hhbm5lbHMgaW4gZHNhZiBhbmQgcm9jZWUgKi8KKwkJaG5zX2RzYWZfc3JzdF9jaG5zKGRzYWZfZGV2LCBEU0FGX0NITlNfTUFTSywgdHJ1ZSk7CisJCW1zbGVlcChTUlNUX1RJTUVfSU5URVJWQUwpOworCQlobnNfZHNhZl9yb2NlX3Nyc3QoZHNhZl9kZXYsIHRydWUpOworCisJCS8qIEVhbmJsZSBkc2FmIGNoYW5uZWwgcm9jZWUgY3JlZGl0ICovCisJCWNyZWRpdCA9IGRzYWZfcmVhZF9kZXYoZHNhZl9kZXYsIERTQUZfU0JNX1JPQ0VFX0NGR19SRUdfUkVHKTsKKwkJZHNhZl9zZXRfYml0KGNyZWRpdCwgRFNBRl9TQk1fUk9DRUVfQ0ZHX0NSRF9FTl9CLCAwKTsKKwkJZHNhZl93cml0ZV9kZXYoZHNhZl9kZXYsIERTQUZfU0JNX1JPQ0VFX0NGR19SRUdfUkVHLCBjcmVkaXQpOworCisJCWRzYWZfc2V0X2JpdChjcmVkaXQsIERTQUZfU0JNX1JPQ0VFX0NGR19DUkRfRU5fQiwgMSk7CisJCWRzYWZfd3JpdGVfZGV2KGRzYWZfZGV2LCBEU0FGX1NCTV9ST0NFRV9DRkdfUkVHX1JFRywgY3JlZGl0KTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGhuc19kc2FmX3JvY2VfcmVzZXQpOworCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJIdWF3ZWkgVGVjaC4gQ28uLCBMdGQuIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkhOUyBEU0FGIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9tYWluLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21haW4uaAppbmRleCAxZGFmMDE4Li5mMzY4MWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21haW4uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21haW4uaApAQCAtNDMsNiArNDMsMzIgQEAKICNkZWZpbmUgRFNBRl9QUklPX05SCTgKICNkZWZpbmUgRFNBRl9SRUdfUEVSX1pPTkUJMwogCisjZGVmaW5lIERTQUZfUk9DRV9DUkVESVRfQ0hOCTgKKyNkZWZpbmUgRFNBRl9ST0NFX0NIQU5fTU9ERQkzCisKK2VudW0gZHNhZl9yb2NlX3BvcnRfbW9kZSB7CisJRFNBRl9ST0NFXzZQT1JUX01PREUsCisJRFNBRl9ST0NFXzRQT1JUX01PREUsCisJRFNBRl9ST0NFXzJQT1JUX01PREUsCisJRFNBRl9ST0NFX0NIQU5fTU9ERV9OVU0sCit9OworCitlbnVtIGRzYWZfcm9jZV9wb3J0X251bSB7CisJRFNBRl9ST0NFX1BPUlRfMCwKKwlEU0FGX1JPQ0VfUE9SVF8xLAorCURTQUZfUk9DRV9QT1JUXzIsCisJRFNBRl9ST0NFX1BPUlRfMywKKwlEU0FGX1JPQ0VfUE9SVF80LAorCURTQUZfUk9DRV9QT1JUXzUsCit9OworCitlbnVtIGRzYWZfcm9jZV9xb3Nfc2wgeworCURTQUZfUk9DRV9TTF8wLAorCURTQUZfUk9DRV9TTF8xLAorCURTQUZfUk9DRV9TTF8yLAorCURTQUZfUk9DRV9TTF8zLAorfTsKKwogI2RlZmluZSBEU0FGX1NUQVRTX1JFQUQocCwgb2Zmc2V0KSAoKigodTY0ICopKCh1OCAqKShwKSArIChvZmZzZXQpKSkpCiAjZGVmaW5lIEhOU19EU0FGX0lTX0RFQlVHKGRldikgKGRldi0+ZHNhZl9tb2RlID09IERTQUZfTU9ERV9ESVNBQkxFX1NQKQogCkBAIC00MTksNiArNDQ1LDEwIEBACiAKIHZvaWQgaG5zX2RzYWZfZml4X21hY19tb2RlKHN0cnVjdCBobnNfbWFjX2NiICptYWNfY2IpOwogCit2b2lkIGhuc19kc2FmX3Nyc3RfY2hucyhzdHJ1Y3QgZHNhZl9kZXZpY2UgKmRzYWZfZGV2LCB1MzIgbXNrLCBib29sIGVuYWJsZSk7CisKK3ZvaWQgaG5zX2RzYWZfcm9jZV9zcnN0KHN0cnVjdCBkc2FmX2RldmljZSAqZHNhZl9kZXYsIGJvb2wgZW5hYmxlKTsKKwogaW50IGhuc19kc2FmX2FlX2luaXQoc3RydWN0IGRzYWZfZGV2aWNlICpkc2FmX2Rldik7CiB2b2lkIGhuc19kc2FmX2FlX3VuaW5pdChzdHJ1Y3QgZHNhZl9kZXZpY2UgKmRzYWZfZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9taXNjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21pc2MuYwppbmRleCA2MTFiNjdiLi4zNmI5Zjc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21pc2MuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX21pc2MuYwpAQCAtMjMxLDYgKzIzMSw0MiBAQAogCWRzYWZfd3JpdGVfc3ViKGRzYWZfZGV2LCByZWdfYWRkciwgcmVnX3ZhbCk7CiB9CiAKKy8qKgorICogaG5zX2RzYWZfc3JzdF9jaG5zIC0gcmVzZXQgZHNhZiBjaGFubmVscworICogQGRzYWZfZGV2OiBkc2FmIGRldmljZSBzdHJ1Y3QgcG9pbnRlcgorICogQG1zazogeGJhciBjaGFubmVscyBtYXNrIHZhbHVlOgorICogYml0MC01IGZvciB4Z2UwLTUKKyAqIGJpdDYtMTEgZm9yIHBwZTAtNQorICogYml0MTItMTcgZm9yIHJvY2UwLTUKKyAqIGJpdDE4LTE5IGZvciBjb20vZGZ4CisgKiBAZW5hYmxlOiBmYWxzZSAtIHJlcXVlc3QgcmVzZXQgLCB0cnVlIC0gZHJvcCByZXNldAorICovCit2b2lkIGhuc19kc2FmX3Nyc3RfY2hucyhzdHJ1Y3QgZHNhZl9kZXZpY2UgKmRzYWZfZGV2LCB1MzIgbXNrLCBib29sIGVuYWJsZSkKK3sKKwl1MzIgcmVnX2FkZHI7CisKKwlpZiAoIWVuYWJsZSkKKwkJcmVnX2FkZHIgPSBEU0FGX1NVQl9TQ19EU0FGX1JFU0VUX1JFUV9SRUc7CisJZWxzZQorCQlyZWdfYWRkciA9IERTQUZfU1VCX1NDX0RTQUZfUkVTRVRfRFJFUV9SRUc7CisKKwlkc2FmX3dyaXRlX3N1Yihkc2FmX2RldiwgcmVnX2FkZHIsIG1zayk7Cit9CisKK3ZvaWQgaG5zX2RzYWZfcm9jZV9zcnN0KHN0cnVjdCBkc2FmX2RldmljZSAqZHNhZl9kZXYsIGJvb2wgZW5hYmxlKQoreworCWlmICghZW5hYmxlKSB7CisJCWRzYWZfd3JpdGVfc3ViKGRzYWZfZGV2LCBEU0FGX1NVQl9TQ19ST0NFRV9SRVNFVF9SRVFfUkVHLCAxKTsKKwl9IGVsc2UgeworCQlkc2FmX3dyaXRlX3N1Yihkc2FmX2RldiwKKwkJCSAgICAgICBEU0FGX1NVQl9TQ19ST0NFRV9DTEtfRElTX1JFRywgMSk7CisJCWRzYWZfd3JpdGVfc3ViKGRzYWZfZGV2LAorCQkJICAgICAgIERTQUZfU1VCX1NDX1JPQ0VFX1JFU0VUX0RSRVFfUkVHLCAxKTsKKwkJbXNsZWVwKDIwKTsKKwkJZHNhZl93cml0ZV9zdWIoZHNhZl9kZXYsIERTQUZfU1VCX1NDX1JPQ0VFX0NMS19FTl9SRUcsIDEpOworCX0KK30KKwogc3RhdGljIHZvaWQKIGhuc19kc2FmX3hnZV9jb3JlX3Nyc3RfYnlfcG9ydF9hY3BpKHN0cnVjdCBkc2FmX2RldmljZSAqZHNhZl9kZXYsCiAJCQkJICAgIHUzMiBwb3J0LCBib29sIGRlcmVzZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX3BwZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9wcGUuYwppbmRleCBmZjhiNmE0Li42ZWE4NzIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX3BwZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfcHBlLmMKQEAgLTMyOCw5ICszMjgsMTAgQEAKIHN0YXRpYyB2b2lkIGhuc19wcGVfdW5pbml0X2h3KHN0cnVjdCBobnNfcHBlX2NiICpwcGVfY2IpCiB7CiAJdTMyIHBvcnQ7Ci0Jc3RydWN0IGRzYWZfZGV2aWNlICpkc2FmX2RldiA9IHBwZV9jYi0+cHBlX2NvbW1vbl9jYi0+ZHNhZl9kZXY7CiAKIAlpZiAocHBlX2NiLT5wcGVfY29tbW9uX2NiKSB7CisJCXN0cnVjdCBkc2FmX2RldmljZSAqZHNhZl9kZXYgPSBwcGVfY2ItPnBwZV9jb21tb25fY2ItPmRzYWZfZGV2OworCiAJCXBvcnQgPSBwcGVfY2ItPmluZGV4OwogCQlkc2FmX2Rldi0+bWlzY19vcC0+cHBlX3Nyc3QoZHNhZl9kZXYsIHBvcnQsIDApOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfcmVnLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19kc2FmX3JlZy5oCmluZGV4IDIzNWY3NDQuLjEzYzE2YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2RzYWZfcmVnLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZHNhZl9yZWcuaApAQCAtNzcsNiArNzcsMTIgQEAKICNkZWZpbmUgRFNBRl9TVUJfU0NfUFBFX1JFU0VUX0RSRVFfUkVHCQkJMHhBNEMKICNkZWZpbmUgRFNBRl9TVUJfU0NfUkNCX1BQRV9DT01fUkVTRVRfUkVRX1JFRwkJMHhBODgKICNkZWZpbmUgRFNBRl9TVUJfU0NfUkNCX1BQRV9DT01fUkVTRVRfRFJFUV9SRUcJCTB4QThDCisjZGVmaW5lIERTQUZfU1VCX1NDX0RTQUZfUkVTRVRfUkVRX1JFRwkJCTB4QUE4CisjZGVmaW5lIERTQUZfU1VCX1NDX1JPQ0VFX1JFU0VUX1JFUV9SRUcJCQkweEE1MAorI2RlZmluZSBEU0FGX1NVQl9TQ19EU0FGX1JFU0VUX0RSRVFfUkVHCQkJMHhBQUMKKyNkZWZpbmUgRFNBRl9TVUJfU0NfUk9DRUVfQ0xLX0RJU19SRUcJCQkweDMyQworI2RlZmluZSBEU0FGX1NVQl9TQ19ST0NFRV9SRVNFVF9EUkVRX1JFRwkJMHhBNTQKKyNkZWZpbmUgRFNBRl9TVUJfU0NfUk9DRUVfQ0xLX0VOX1JFRwkJCTB4MzI4CiAjZGVmaW5lIERTQUZfU1VCX1NDX0xJR0hUX01PRFVMRV9ERVRFQ1RfRU5fUkVHCQkweDIwNjAKICNkZWZpbmUgRFNBRl9TVUJfU0NfVENBTV9NQklTVF9FTl9SRUcJCQkweDIzMDAKICNkZWZpbmUgRFNBRl9TVUJfU0NfRFNBRl9DTEtfU1RfUkVHCQkJMHg1MzAwCkBAIC0xMzMsNiArMTM5LDggQEAKICNkZWZpbmUgRFNBRl9ST0NFRV9JTlRfU1RTXzBfUkVHCTB4MjAwCiAjZGVmaW5lIERTQUZWMl9TRVJERVNfTEJLXzBfUkVHICAgICAgICAgMHgyMjAKICNkZWZpbmUgRFNBRl9QQVVTRV9DRkdfUkVHCQkweDI0MAorI2RlZmluZSBEU0FGX1JPQ0VfUE9SVF9NQVBfUkVHCQkweDJBMAorI2RlZmluZSBEU0FGX1JPQ0VfU0xfTUFQX1JFRwkJMHgyQTQKICNkZWZpbmUgRFNBRl9QUEVfUUlEX0NGR18wX1JFRwkJMHgzMDAKICNkZWZpbmUgRFNBRl9TV19QT1JUX1RZUEVfMF9SRUcJCTB4MzIwCiAjZGVmaW5lIERTQUZfU1RQX1BPUlRfVFlQRV8wX1JFRwkweDM0MApAQCAtMTc4LDYgKzE4Niw3IEBACiAjZGVmaW5lIERTQUZfU0JNX0JQX0NGR18yX1hHRV9SRUdfMF9SRUcJCTB4MjAwQwogI2RlZmluZSBEU0FGX1NCTV9CUF9DRkdfMl9QUEVfUkVHXzBfUkVHCQkweDIzMEMKICNkZWZpbmUgRFNBRl9TQk1fQlBfQ0ZHXzJfUk9DRUVfUkVHXzBfUkVHCTB4MjYwQworI2RlZmluZSBEU0FGX1NCTV9ST0NFRV9DRkdfUkVHX1JFRwkJMHgyMzgwCiAjZGVmaW5lIERTQUZWMl9TQk1fQlBfQ0ZHXzJfUk9DRUVfUkVHXzBfUkVHCTB4MjM4QwogI2RlZmluZSBEU0FGX1NCTV9GUkVFX0NOVF8wXzBfUkVHCQkweDIwMTAKICNkZWZpbmUgRFNBRl9TQk1fRlJFRV9DTlRfMV8wX1JFRwkJMHgyMDE0CkBAIC03OTYsNiArODA1LDkgQEAKICNkZWZpbmUgRFNBRlYyX1NCTV9DRkc0X1JFU0VUX0JVRl9OVU1fTk9fUEZDX1MgOQogI2RlZmluZSBEU0FGVjJfU0JNX0NGRzRfUkVTRVRfQlVGX05VTV9OT19QRkNfTSAoKCgxVUxMIDw8IDkpIC0gMSkgPDwgOSkKIAorI2RlZmluZSBEU0FGX0NITlNfTUFTSwkJCTB4M2YwMDAKKyNkZWZpbmUgRFNBRl9TQk1fUk9DRUVfQ0ZHX0NSRF9FTl9CCTIKKyNkZWZpbmUgU1JTVF9USU1FX0lOVEVSVkFMCQkyMAogI2RlZmluZSBEU0FGVjJfU0JNX0NGRzJfUk9DRUVfU0VUX0JVRl9OVU1fUyAwCiAjZGVmaW5lIERTQUZWMl9TQk1fQ0ZHMl9ST0NFRV9TRVRfQlVGX05VTV9NICgoKDFVTEwgPDwgOCkgLSAxKSA8PCAwKQogI2RlZmluZSBEU0FGVjJfU0JNX0NGRzJfUk9DRUVfUkVTRVRfQlVGX05VTV9TIDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2VuZXQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2VuZXQuYwppbmRleCBkN2UxZjhjLi4wNTlhYWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19lbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZW5ldC5jCkBAIC05OTQsMTAgKzk5NCwxMCBAQAogCXN0cnVjdCBobmFlX2hhbmRsZSAqaCA9IHByaXYtPmFlX2hhbmRsZTsKIAlpbnQgc3RhdGUgPSAxOwogCi0JaWYgKHByaXYtPnBoeSkgeworCWlmIChuZGV2LT5waHlkZXYpIHsKIAkJaC0+ZGV2LT5vcHMtPmFkanVzdF9saW5rKGgsIG5kZXYtPnBoeWRldi0+c3BlZWQsCiAJCQkJCSBuZGV2LT5waHlkZXYtPmR1cGxleCk7Ci0JCXN0YXRlID0gcHJpdi0+cGh5LT5saW5rOworCQlzdGF0ZSA9IG5kZXYtPnBoeWRldi0+bGluazsKIAl9CiAJc3RhdGUgPSBzdGF0ZSAmJiBoLT5kZXYtPm9wcy0+Z2V0X3N0YXR1cyhoKTsKIApAQCAtMTAyMiw3ICsxMDIyLDYgQEAKICAqLwogaW50IGhuc19uaWNfaW5pdF9waHkoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBobmFlX2hhbmRsZSAqaCkKIHsKLQlzdHJ1Y3QgaG5zX25pY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBoLT5waHlfZGV2OwogCWludCByZXQ7CiAKQEAgLTEwNDYsOCArMTA0NSw2IEBACiAJaWYgKGgtPnBoeV9pZiA9PSBQSFlfSU5URVJGQUNFX01PREVfWEdNSUkpCiAJCXBoeV9kZXYtPmF1dG9uZWcgPSBmYWxzZTsKIAotCXByaXYtPnBoeSA9IHBoeV9kZXY7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIyNCw4ICsxMjIxLDggQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF9zdGFydF9lcnI7CiAKLQlpZiAocHJpdi0+cGh5KQotCQlwaHlfc3RhcnQocHJpdi0+cGh5KTsKKwlpZiAobmRldi0+cGh5ZGV2KQorCQlwaHlfc3RhcnQobmRldi0+cGh5ZGV2KTsKIAogCWNsZWFyX2JpdChOSUNfU1RBVEVfRE9XTiwgJnByaXYtPnN0YXRlKTsKIAkodm9pZCltb2RfdGltZXIoJnByaXYtPnNlcnZpY2VfdGltZXIsIGppZmZpZXMgKyBTRVJWSUNFX1RJTUVSX0haKTsKQEAgLTEyNTksOCArMTI1Niw4IEBACiAJbmV0aWZfdHhfZGlzYWJsZShuZGV2KTsKIAlwcml2LT5saW5rID0gMDsKIAotCWlmIChwcml2LT5waHkpCi0JCXBoeV9zdG9wKHByaXYtPnBoeSk7CisJaWYgKG5kZXYtPnBoeWRldikKKwkJcGh5X3N0b3AobmRldi0+cGh5ZGV2KTsKIAogCW9wcyA9IHByaXYtPmFlX2hhbmRsZS0+ZGV2LT5vcHM7CiAKQEAgLTEzNTksOCArMTM1Niw3IEBACiBzdGF0aWMgaW50IGhuc19uaWNfZG9faW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICppZnIsCiAJCQkgICAgaW50IGNtZCkKIHsKLQlzdHJ1Y3QgaG5zX25pY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldiA9IHByaXYtPnBoeTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldiA9IG5ldGRldi0+cGh5ZGV2OwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjAxNyw5ICsyMDEzLDggQEAKIAkJaG5zX25pY191bmluaXRfcmluZ19kYXRhKHByaXYpOwogCXByaXYtPnJpbmdfZGF0YSA9IE5VTEw7CiAKLQlpZiAocHJpdi0+cGh5KQotCQlwaHlfZGlzY29ubmVjdChwcml2LT5waHkpOwotCXByaXYtPnBoeSA9IE5VTEw7CisJaWYgKG5kZXYtPnBoeWRldikKKwkJcGh5X2Rpc2Nvbm5lY3QobmRldi0+cGh5ZGV2KTsKIAogCWlmICghSVNfRVJSX09SX05VTEwocHJpdi0+YWVfaGFuZGxlKSkKIAkJaG5hZV9wdXRfaGFuZGxlKHByaXYtPmFlX2hhbmRsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19lbmV0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19lbmV0LmgKaW5kZXggNDRiYjMwMS4uNWI0MTJkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZW5ldC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2VuZXQuaApAQCAtNTksNyArNTksNiBAQAogCXUzMiBwb3J0X2lkOwogCWludCBwaHlfbW9kZTsKIAlpbnQgcGh5X2xlZF92YWw7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgaG5hZV9oYW5kbGUgKmFlX2hhbmRsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2hpc2lsaWNvbi9obnMvaG5zX2V0aHRvb2wuYwppbmRleCBhYjMzNDg3Li40N2U1OWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9oaXNpbGljb24vaG5zL2huc19ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaGlzaWxpY29uL2hucy9obnNfZXRodG9vbC5jCkBAIC00OCw5ICs0OCw5IEBACiAKIAloID0gcHJpdi0+YWVfaGFuZGxlOwogCi0JaWYgKHByaXYtPnBoeSkgewotCQlpZiAoIWdlbnBoeV9yZWFkX3N0YXR1cyhwcml2LT5waHkpKQotCQkJbGlua19zdGF0ID0gcHJpdi0+cGh5LT5saW5rOworCWlmIChuZXRfZGV2LT5waHlkZXYpIHsKKwkJaWYgKCFnZW5waHlfcmVhZF9zdGF0dXMobmV0X2Rldi0+cGh5ZGV2KSkKKwkJCWxpbmtfc3RhdCA9IG5ldF9kZXYtPnBoeWRldi0+bGluazsKIAkJZWxzZQogCQkJbGlua19zdGF0ID0gMDsKIAl9CkBAIC02NCwxNSArNjQsMTQgQEAKIH0KIAogc3RhdGljIHZvaWQgaG5zX2dldF9tZGl4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCi0JCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJaW50IG1kaXhfY3RybCwgbWRpeCwgcmV0dmFsLCBpc19yZXNvbHZlZDsKLQlzdHJ1Y3QgaG5zX25pY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBwcml2LT5waHk7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBuZXRfZGV2LT5waHlkZXY7CiAKIAlpZiAoIXBoeV9kZXYgfHwgIXBoeV9kZXYtPm1kaW8uYnVzKSB7Ci0JCWNtZC0+ZXRoX3RwX21kaXhfY3RybCA9IEVUSF9UUF9NRElfSU5WQUxJRDsKLQkJY21kLT5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NRElfSU5WQUxJRDsKKwkJY21kLT5iYXNlLmV0aF90cF9tZGl4X2N0cmwgPSBFVEhfVFBfTURJX0lOVkFMSUQ7CisJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NRElfSU5WQUxJRDsKIAkJcmV0dXJuOwogCX0KIApAQCAtODksMzUgKzg4LDM1IEBACiAKIAlzd2l0Y2ggKG1kaXhfY3RybCkgewogCWNhc2UgMHgwOgotCQljbWQtPmV0aF90cF9tZGl4X2N0cmwgPSBFVEhfVFBfTURJOworCQljbWQtPmJhc2UuZXRoX3RwX21kaXhfY3RybCA9IEVUSF9UUF9NREk7CiAJCWJyZWFrOwogCWNhc2UgMHgxOgotCQljbWQtPmV0aF90cF9tZGl4X2N0cmwgPSBFVEhfVFBfTURJX1g7CisJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeF9jdHJsID0gRVRIX1RQX01ESV9YOwogCQlicmVhazsKIAljYXNlIDB4MzoKLQkJY21kLT5ldGhfdHBfbWRpeF9jdHJsID0gRVRIX1RQX01ESV9BVVRPOworCQljbWQtPmJhc2UuZXRoX3RwX21kaXhfY3RybCA9IEVUSF9UUF9NRElfQVVUTzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJY21kLT5ldGhfdHBfbWRpeF9jdHJsID0gRVRIX1RQX01ESV9JTlZBTElEOworCQljbWQtPmJhc2UuZXRoX3RwX21kaXhfY3RybCA9IEVUSF9UUF9NRElfSU5WQUxJRDsKIAkJYnJlYWs7CiAJfQogCiAJaWYgKCFpc19yZXNvbHZlZCkKLQkJY21kLT5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NRElfSU5WQUxJRDsKKwkJY21kLT5iYXNlLmV0aF90cF9tZGl4ID0gRVRIX1RQX01ESV9JTlZBTElEOwogCWVsc2UgaWYgKG1kaXgpCi0JCWNtZC0+ZXRoX3RwX21kaXggPSBFVEhfVFBfTURJX1g7CisJCWNtZC0+YmFzZS5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NRElfWDsKIAllbHNlCi0JCWNtZC0+ZXRoX3RwX21kaXggPSBFVEhfVFBfTURJOworCQljbWQtPmJhc2UuZXRoX3RwX21kaXggPSBFVEhfVFBfTURJOwogfQogCiAvKioKLSAqaG5zX25pY19nZXRfc2V0dGluZ3MgLSBpbXBsZW1lbnQgZXRodG9vbCBnZXQgc2V0dGluZ3MKKyAqaG5zX25pY19nZXRfbGlua19rc2V0dGluZ3MgLSBpbXBsZW1lbnQgZXRodG9vbCBnZXQgbGluayBrc2V0dGluZ3MKICAqQG5ldF9kZXY6IG5ldF9kZXZpY2UKLSAqQGNtZDogZXRodG9vbF9jbWQKKyAqQGNtZDogZXRodG9vbF9saW5rX2tzZXR0aW5ncwogICpyZXR1ZW4gMCAtIHN1Y2Nlc3MgLCBuZWdhdGl2ZSAtLWZhaWwKICAqLwotc3RhdGljIGludCBobnNfbmljX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKLQkJCQlzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3N0YXRpYyBpbnQgaG5zX25pY19nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCQkJICAgICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgaG5zX25pY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJc3RydWN0IGhuYWVfaGFuZGxlICpoOwpAQCAtMTI1LDYgKzEyNCw3IEBACiAJaW50IHJldDsKIAl1OCBkdXBsZXg7CiAJdTE2IHNwZWVkOworCXUzMiBzdXBwb3J0ZWQsIGFkdmVydGlzaW5nOwogCiAJaWYgKCFwcml2IHx8ICFwcml2LT5hZV9oYW5kbGUpCiAJCXJldHVybiAtRVNSQ0g7CkBAIC0xMzksMzggKzEzOSw0MyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKiBXaGVuIHRoZXJlIGlzIG5vIHBoeSwgYXV0b25lZyBpcyBvZmYuICovCi0JY21kLT5hdXRvbmVnID0gZmFsc2U7Ci0JZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgc3BlZWQpOwotCWNtZC0+ZHVwbGV4ID0gZHVwbGV4OworCWV0aHRvb2xfY29udmVydF9saW5rX21vZGVfdG9fbGVnYWN5X3UzMigmc3VwcG9ydGVkLAorCQkJCQkJY21kLT5saW5rX21vZGVzLnN1cHBvcnRlZCk7CisJZXRodG9vbF9jb252ZXJ0X2xpbmtfbW9kZV90b19sZWdhY3lfdTMyKCZhZHZlcnRpc2luZywKKwkJCQkJCWNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZyk7CiAKLQlpZiAocHJpdi0+cGh5KQotCQkodm9pZClwaHlfZXRodG9vbF9nc2V0KHByaXYtPnBoeSwgY21kKTsKKwkvKiBXaGVuIHRoZXJlIGlzIG5vIHBoeSwgYXV0b25lZyBpcyBvZmYuICovCisJY21kLT5iYXNlLmF1dG9uZWcgPSBmYWxzZTsKKwljbWQtPmJhc2UuY21kID0gc3BlZWQ7CisJY21kLT5iYXNlLmR1cGxleCA9IGR1cGxleDsKKworCWlmIChuZXRfZGV2LT5waHlkZXYpCisJCSh2b2lkKXBoeV9ldGh0b29sX2tzZXR0aW5nc19nZXQobmV0X2Rldi0+cGh5ZGV2LCBjbWQpOwogCiAJbGlua19zdGF0ID0gaG5zX25pY19nZXRfbGluayhuZXRfZGV2KTsKIAlpZiAoIWxpbmtfc3RhdCkgewotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCAodTMyKVNQRUVEX1VOS05PV04pOwotCQljbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOworCQljbWQtPmJhc2Uuc3BlZWQgPSAodTMyKVNQRUVEX1VOS05PV047CisJCWNtZC0+YmFzZS5kdXBsZXggPSBEVVBMRVhfVU5LTk9XTjsKIAl9CiAKLQlpZiAoY21kLT5hdXRvbmVnKQotCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKwlpZiAoY21kLT5iYXNlLmF1dG9uZWcpCisJCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKIAotCWNtZC0+c3VwcG9ydGVkIHw9IGgtPmlmX3N1cHBvcnQ7CisJc3VwcG9ydGVkIHw9IGgtPmlmX3N1cHBvcnQ7CiAJaWYgKGgtPnBoeV9pZiA9PSBQSFlfSU5URVJGQUNFX01PREVfU0dNSUkpIHsKLQkJY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX1RQOwotCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CisJCXN1cHBvcnRlZCB8PSBTVVBQT1JURURfVFA7CisJCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CiAJfSBlbHNlIGlmIChoLT5waHlfaWYgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1hHTUlJKSB7Ci0JCWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9GSUJSRTsKLQkJY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDAwYmFzZUtSX0Z1bGw7CisJCXN1cHBvcnRlZCB8PSBTVVBQT1JURURfRklCUkU7CisJCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMDBiYXNlS1JfRnVsbDsKIAl9CiAKIAlzd2l0Y2ggKGgtPm1lZGlhX3R5cGUpIHsKIAljYXNlIEhOQUVfTUVESUFfVFlQRV9GSUJFUjoKLQkJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwkJY21kLT5iYXNlLnBvcnQgPSBQT1JUX0ZJQlJFOwogCQlicmVhazsKIAljYXNlIEhOQUVfTUVESUFfVFlQRV9DT1BQRVI6Ci0JCWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJCWNtZC0+YmFzZS5wb3J0ID0gUE9SVF9UUDsKIAkJYnJlYWs7CiAJY2FzZSBITkFFX01FRElBX1RZUEVfVU5LTk9XTjoKIAlkZWZhdWx0OgpAQCAtMTc4LDIzICsxODMsMjcgQEAKIAl9CiAKIAlpZiAoIShBRV9JU19WRVIxKHByaXYtPmVuZXRfdmVyKSAmJiBoLT5wb3J0X3R5cGUgPT0gSE5BRV9QT1JUX0RFQlVHKSkKLQkJY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX1BhdXNlOworCQlzdXBwb3J0ZWQgfD0gU1VQUE9SVEVEX1BhdXNlOwogCi0JY21kLT50cmFuc2NlaXZlciA9IFhDVlJfRVhURVJOQUw7Ci0JY21kLT5tZGlvX3N1cHBvcnQgPSAoRVRIX01ESU9fU1VQUE9SVFNfQzQ1IHwgRVRIX01ESU9fU1VQUE9SVFNfQzIyKTsKKwlldGh0b29sX2NvbnZlcnRfbGVnYWN5X3UzMl90b19saW5rX21vZGUoY21kLT5saW5rX21vZGVzLnN1cHBvcnRlZCwKKwkJCQkJCXN1cHBvcnRlZCk7CisJZXRodG9vbF9jb252ZXJ0X2xlZ2FjeV91MzJfdG9fbGlua19tb2RlKGNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZywKKwkJCQkJCWFkdmVydGlzaW5nKTsKKworCWNtZC0+YmFzZS5tZGlvX3N1cHBvcnQgPSBFVEhfTURJT19TVVBQT1JUU19DNDUgfCBFVEhfTURJT19TVVBQT1JUU19DMjI7CiAJaG5zX2dldF9tZGl4X21vZGUobmV0X2RldiwgY21kKTsKIAogCXJldHVybiAwOwogfQogCiAvKioKLSAqaG5zX25pY19zZXRfc2V0dGluZ3MgLSBpbXBsZW1lbnQgZXRodG9vbCBzZXQgc2V0dGluZ3MKKyAqaG5zX25pY19zZXRfbGlua19zZXR0aW5ncyAtIGltcGxlbWVudCBldGh0b29sIHNldCBsaW5rIGtzZXR0aW5ncwogICpAbmV0X2RldjogbmV0X2RldmljZQotICpAY21kOiBldGh0b29sX2NtZAorICpAY21kOiBldGh0b29sX2xpbmtfa3NldHRpbmdzCiAgKnJldHVlbiAwIC0gc3VjY2VzcyAsIG5lZ2F0aXZlIC0tZmFpbAogICovCi1zdGF0aWMgaW50IGhuc19uaWNfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAotCQkJCXN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIGludCBobnNfbmljX3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXN0cnVjdCBobnNfbmljX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlzdHJ1Y3QgaG5hZV9oYW5kbGUgKmg7CkBAIC0yMDgsMjQgKzIxNywyNSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWggPSBwcml2LT5hZV9oYW5kbGU7Ci0Jc3BlZWQgPSBldGh0b29sX2NtZF9zcGVlZChjbWQpOworCXNwZWVkID0gY21kLT5iYXNlLnNwZWVkOwogCiAJaWYgKGgtPnBoeV9pZiA9PSBQSFlfSU5URVJGQUNFX01PREVfWEdNSUkpIHsKLQkJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSB8fCBzcGVlZCAhPSBTUEVFRF8xMDAwMCB8fAotCQkgICAgY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCWlmIChjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSB8fAorCQkgICAgc3BlZWQgIT0gU1BFRURfMTAwMDAgfHwKKwkJICAgIGNtZC0+YmFzZS5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgaWYgKGgtPnBoeV9pZiA9PSBQSFlfSU5URVJGQUNFX01PREVfU0dNSUkpIHsKLQkJaWYgKCFwcml2LT5waHkgJiYgY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKQorCQlpZiAoIW5ldF9kZXYtPnBoeWRldiAmJiBjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmIChzcGVlZCA9PSBTUEVFRF8xMDAwICYmIGNtZC0+ZHVwbGV4ID09IERVUExFWF9IQUxGKQorCQlpZiAoc3BlZWQgPT0gU1BFRURfMTAwMCAmJiBjbWQtPmJhc2UuZHVwbGV4ID09IERVUExFWF9IQUxGKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChwcml2LT5waHkpCi0JCQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwcml2LT5waHksIGNtZCk7CisJCWlmIChuZXRfZGV2LT5waHlkZXYpCisJCQlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX3NldChuZXRfZGV2LT5waHlkZXYsIGNtZCk7CiAKIAkJaWYgKChzcGVlZCAhPSBTUEVFRF8xMCAmJiBzcGVlZCAhPSBTUEVFRF8xMDAgJiYKLQkJICAgICBzcGVlZCAhPSBTUEVFRF8xMDAwKSB8fCAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYKLQkJICAgICBjbWQtPmR1cGxleCAhPSBEVVBMRVhfRlVMTCkpCisJCSAgICAgc3BlZWQgIT0gU1BFRURfMTAwMCkgfHwgKGNtZC0+YmFzZS5kdXBsZXggIT0gRFVQTEVYX0hBTEYgJiYKKwkJICAgICBjbWQtPmJhc2UuZHVwbGV4ICE9IERVUExFWF9GVUxMKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSB7CiAJCW5ldGRldl9lcnIobmV0X2RldiwgIk5vdCBzdXBwb3J0ZWQhIik7CkBAIC0yMzMsNyArMjQzLDcgQEAKIAl9CiAKIAlpZiAoaC0+ZGV2LT5vcHMtPmFkanVzdF9saW5rKSB7Ci0JCWgtPmRldi0+b3BzLT5hZGp1c3RfbGluayhoLCAoaW50KXNwZWVkLCBjbWQtPmR1cGxleCk7CisJCWgtPmRldi0+b3BzLT5hZGp1c3RfbGluayhoLCAoaW50KXNwZWVkLCBjbWQtPmJhc2UuZHVwbGV4KTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zMDUsNyArMzE1LDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgaG5zX25pY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBwcml2LT5waHk7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXYgPSBuZGV2LT5waHlkZXY7CiAJc3RydWN0IGhuYWVfaGFuZGxlICpoID0gcHJpdi0+YWVfaGFuZGxlOwogCiAJc3dpdGNoIChsb29wKSB7CkBAIC05MTAsNyArOTIwLDcgQEAKIAkJbWVtY3B5KGJ1ZmYsIGhuc19uaWNfdGVzdF9zdHJzW01BQ19JTlRFUk5BTExPT1BfU0VSREVTXSwKIAkJICAgICAgIEVUSF9HU1RSSU5HX0xFTik7CiAJCWJ1ZmYgKz0gRVRIX0dTVFJJTkdfTEVOOwotCQlpZiAoKHByaXYtPnBoeSkgJiYgKCFwcml2LT5waHktPmlzX2M0NSkpCisJCWlmICgobmV0ZGV2LT5waHlkZXYpICYmICghbmV0ZGV2LT5waHlkZXYtPmlzX2M0NSkpCiAJCQltZW1jcHkoYnVmZiwgaG5zX25pY190ZXN0X3N0cnNbTUFDX0lOVEVSTkFMTE9PUF9QSFldLAogCQkJICAgICAgIEVUSF9HU1RSSU5HX0xFTik7CiAKQEAgLTk5Niw3ICsxMDA2LDcgQEAKIAkJaWYgKHByaXYtPmFlX2hhbmRsZS0+cGh5X2lmID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9YR01JSSkKIAkJCWNudC0tOwogCi0JCWlmICgoIXByaXYtPnBoeSkgfHwgKHByaXYtPnBoeS0+aXNfYzQ1KSkKKwkJaWYgKCghbmV0ZGV2LT5waHlkZXYpIHx8IChuZXRkZXYtPnBoeWRldi0+aXNfYzQ1KSkKIAkJCWNudC0tOwogCiAJCXJldHVybiBjbnQ7CkBAIC0xMDE1LDggKzEwMjUsNyBAQAogaW50IGhuc19waHlfbGVkX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmFsdWUpCiB7CiAJaW50IHJldHZhbDsKLQlzdHJ1Y3QgaG5zX25pY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldiA9IHByaXYtPnBoeTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldiA9IG5ldGRldi0+cGh5ZGV2OwogCiAJcmV0dmFsID0gcGh5X3dyaXRlKHBoeV9kZXYsIEhOU19QSFlfUEFHRV9SRUcsIEhOU19QSFlfUEFHRV9MRUQpOwogCXJldHZhbCB8PSBwaHlfd3JpdGUocGh5X2RldiwgSE5TX0xFRF9GQ19SRUcsIHZhbHVlKTsKQEAgLTEwMzksNyArMTA0OCw3IEBACiB7CiAJc3RydWN0IGhuc19uaWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGhuYWVfaGFuZGxlICpoID0gcHJpdi0+YWVfaGFuZGxlOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2ID0gcHJpdi0+cGh5OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2ID0gbmV0ZGV2LT5waHlkZXY7CiAJaW50IHJldDsKIAogCWlmIChwaHlfZGV2KQpAQCAtMTE1OSw4ICsxMTY4LDcgQEAKIHN0YXRpYyBpbnQgaG5zX25pY19ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IGhuc19uaWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeSA9IHByaXYtPnBoeTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ID0gbmV0ZGV2LT5waHlkZXY7CiAKIAlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CiAJCWlmIChwaHkpCkBAIC0xMjY0LDExICsxMjcyLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBobnNfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGhuc19ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8gPSBobnNfbmljX2dldF9kcnZpbmZvLAogCS5nZXRfbGluayAgPSBobnNfbmljX2dldF9saW5rLAotCS5nZXRfc2V0dGluZ3MgID0gaG5zX25pY19nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncyAgPSBobnNfbmljX3NldF9zZXR0aW5ncywKIAkuZ2V0X3JpbmdwYXJhbSA9IGhuc19nZXRfcmluZ3BhcmFtLAogCS5nZXRfcGF1c2VwYXJhbSA9IGhuc19nZXRfcGF1c2VwYXJhbSwKIAkuc2V0X3BhdXNlcGFyYW0gPSBobnNfc2V0X3BhdXNlcGFyYW0sCkBAIC0xMjg4LDYgKzEyOTQsOCBAQAogCS5nZXRfcnhmaCA9IGhuc19nZXRfcnNzLAogCS5zZXRfcnhmaCA9IGhuc19zZXRfcnNzLAogCS5nZXRfcnhuZmMgPSBobnNfZ2V0X3J4bmZjLAorCS5nZXRfbGlua19rc2V0dGluZ3MgID0gaG5zX25pY19nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncyAgPSBobnNfbmljX3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKIHZvaWQgaG5zX2V0aHRvb2xfc2V0X29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2k4MjV4eC84MjU5Ni5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaTgyNXh4LzgyNTk2LmMKaW5kZXggYmVmYjRhYy4uY2UyMzViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaTgyNXh4LzgyNTk2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaTgyNXh4LzgyNTk2LmMKQEAgLTg5LDEwICs4OSwxMCBAQAogI2RlZmluZSBERUIoeCx5KQlpZiAoaTU5Nl9kZWJ1ZyAmICh4KSkgeQogCiAKLSNpZiBkZWZpbmVkKENPTkZJR19NVk1FMTZ4X05FVCkgfHwgZGVmaW5lZChDT05GSUdfTVZNRTE2eF9ORVRfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX01WTUUxNnhfTkVUKQogI2RlZmluZSBFTkFCTEVfTVZNRTE2eF9ORVQKICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0JWTUU2MDAwX05FVCkgfHwgZGVmaW5lZChDT05GSUdfQlZNRTYwMDBfTkVUX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19CVk1FNjAwMF9ORVQpCiAjZGVmaW5lIEVOQUJMRV9CVk1FNjAwMF9ORVQKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9jb3JlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9jb3JlLmMKaW5kZXggNGM5NzcxZC4uOGYxMzkxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL2NvcmUuYwpAQCAtOTc3LDcgKzk3NywzNyBAQAogCQlkZXYtPm1jYXN0X3BlbmRpbmcgPSAxOwogCQlyZXR1cm47CiAJfQorCisJbXV0ZXhfbG9jaygmZGV2LT5saW5rX2xvY2spOwogCV9fZW1hY19zZXRfbXVsdGljYXN0X2xpc3QoZGV2KTsKKwltdXRleF91bmxvY2soJmRldi0+bGlua19sb2NrKTsKK30KKworc3RhdGljIGludCBlbWFjX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqc2EpCit7CisJc3RydWN0IGVtYWNfaW5zdGFuY2UgKmRldiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHNhOworCXN0cnVjdCBlbWFjX3JlZ3MgX19pb21lbSAqcCA9IGRldi0+ZW1hY3A7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCisJICAgICAgIHJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCW11dGV4X2xvY2soJmRldi0+bGlua19sb2NrKTsKKworCW1lbWNweShuZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgbmRldi0+YWRkcl9sZW4pOworCisJZW1hY19yeF9kaXNhYmxlKGRldik7CisJZW1hY190eF9kaXNhYmxlKGRldik7CisJb3V0X2JlMzIoJnAtPmlhaHIsIChuZGV2LT5kZXZfYWRkclswXSA8PCA4KSB8IG5kZXYtPmRldl9hZGRyWzFdKTsKKwlvdXRfYmUzMigmcC0+aWFsciwgKG5kZXYtPmRldl9hZGRyWzJdIDw8IDI0KSB8CisJCShuZGV2LT5kZXZfYWRkclszXSA8PCAxNikgfCAobmRldi0+ZGV2X2FkZHJbNF0gPDwgOCkgfAorCQluZGV2LT5kZXZfYWRkcls1XSk7CisJZW1hY190eF9lbmFibGUoZGV2KTsKKwllbWFjX3J4X2VuYWJsZShkZXYpOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxpbmtfbG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBlbWFjX3Jlc2l6ZV9yeF9yaW5nKHN0cnVjdCBlbWFjX2luc3RhbmNlICpkZXYsIGludCBuZXdfbXR1KQpAQCAtMjY4Niw3ICsyNzE2LDcgQEAKIAkubmRvX2RvX2lvY3RsCQk9IGVtYWNfaW9jdGwsCiAJLm5kb190eF90aW1lb3V0CQk9IGVtYWNfdHhfdGltZW91dCwKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLQkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGV0aF9tYWNfYWRkciwKKwkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGVtYWNfc2V0X21hY19hZGRyZXNzLAogCS5uZG9fc3RhcnRfeG1pdAkJPSBlbWFjX3N0YXJ0X3htaXQsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogfTsKQEAgLTI2OTksNyArMjcyOSw3IEBACiAJLm5kb19kb19pb2N0bAkJPSBlbWFjX2lvY3RsLAogCS5uZG9fdHhfdGltZW91dAkJPSBlbWFjX3R4X3RpbWVvdXQsCiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBlbWFjX3NldF9tYWNfYWRkcmVzcywKIAkubmRvX3N0YXJ0X3htaXQJCT0gZW1hY19zdGFydF94bWl0X3NnLAogCS5uZG9fY2hhbmdlX210dQkJPSBlbWFjX2NoYW5nZV9tdHUsCiB9OwpAQCAtMjc1MCw3ICsyNzgwLDcgQEAKIAkvKiBHZXQgaW50ZXJydXB0cy4gRU1BQyBpcnEgaXMgbWFuZGF0b3J5LCBXT0wgaXJxIGlzIG9wdGlvbmFsICovCiAJZGV2LT5lbWFjX2lycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKIAlkZXYtPndvbF9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMSk7Ci0JaWYgKGRldi0+ZW1hY19pcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFkZXYtPmVtYWNfaXJxKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbid0IG1hcCBtYWluIGludGVycnVwdFxuIiwgbnAtPmZ1bGxfbmFtZSk7CiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQpAQCAtMjkxMyw5ICsyOTQzLDkgQEAKICBlcnJfcmVnX3VubWFwOgogCWlvdW5tYXAoZGV2LT5lbWFjcCk7CiAgZXJyX2lycV91bm1hcDoKLQlpZiAoZGV2LT53b2xfaXJxICE9IE5PX0lSUSkKKwlpZiAoZGV2LT53b2xfaXJxKQogCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGRldi0+d29sX2lycSk7Ci0JaWYgKGRldi0+ZW1hY19pcnEgIT0gTk9fSVJRKQorCWlmIChkZXYtPmVtYWNfaXJxKQogCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGRldi0+ZW1hY19pcnEpOwogIGVycl9mcmVlOgogCWZyZWVfbmV0ZGV2KG5kZXYpOwpAQCAtMjk1Nyw5ICsyOTg3LDkgQEAKIAllbWFjX2RiZ191bnJlZ2lzdGVyKGRldik7CiAJaW91bm1hcChkZXYtPmVtYWNwKTsKIAotCWlmIChkZXYtPndvbF9pcnEgIT0gTk9fSVJRKQorCWlmIChkZXYtPndvbF9pcnEpCiAJCWlycV9kaXNwb3NlX21hcHBpbmcoZGV2LT53b2xfaXJxKTsKLQlpZiAoZGV2LT5lbWFjX2lycSAhPSBOT19JUlEpCisJaWYgKGRldi0+ZW1hY19pcnEpCiAJCWlycV9kaXNwb3NlX21hcHBpbmcoZGV2LT5lbWFjX2lycSk7CiAKIAlmcmVlX25ldGRldihkZXYtPm5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvbWFsLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9tYWwuYwppbmRleCBmZGI1Y2RiLi5hYWY2ZmVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9tYWwuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9tYWwuYwpAQCAtNTk3LDkgKzU5Nyw4IEBACiAJCW1hbC0+cnhkZV9pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChvZmRldi0+ZGV2Lm9mX25vZGUsIDQpOwogCX0KIAotCWlmIChtYWwtPnR4ZW9iX2lycSA9PSBOT19JUlEgfHwgbWFsLT5yeGVvYl9pcnEgPT0gTk9fSVJRIHx8Ci0JICAgIG1hbC0+c2Vycl9pcnEgPT0gTk9fSVJRIHx8IG1hbC0+dHhkZV9pcnEgPT0gTk9fSVJRIHx8Ci0JICAgIG1hbC0+cnhkZV9pcnEgPT0gTk9fSVJRKSB7CisJaWYgKCFtYWwtPnR4ZW9iX2lycSB8fCAhbWFsLT5yeGVvYl9pcnEgfHwgIW1hbC0+c2Vycl9pcnEgfHwKKwkgICAgIW1hbC0+dHhkZV9pcnEgIHx8ICFtYWwtPnJ4ZGVfaXJxKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkgICAgICAgIm1hbCVkOiBmYWlsZWQgdG8gbWFwIGludGVycnVwdHMgIVxuIiwgaW5kZXgpOwogCQllcnIgPSAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZuaWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12bmljLmMKaW5kZXggODhmM2M4NS4uYmZlMTdkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZuaWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdm5pYy5jCkBAIC0yMDMsNyArMjAzLDggQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+dmRldi0+ZGV2OwogCiAJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBsdGItPnNpemUsIGx0Yi0+YnVmZiwgbHRiLT5hZGRyKTsKLQlzZW5kX3JlcXVlc3RfdW5tYXAoYWRhcHRlciwgbHRiLT5tYXBfaWQpOworCWlmICghYWRhcHRlci0+ZmFpbG92ZXIpCisJCXNlbmRfcmVxdWVzdF91bm1hcChhZGFwdGVyLCBsdGItPm1hcF9pZCk7CiB9CiAKIHN0YXRpYyBpbnQgYWxsb2NfcnhfcG9vbChzdHJ1Y3QgaWJtdm5pY19hZGFwdGVyICphZGFwdGVyLApAQCAtNTIyLDcgKzUyMyw4IEBACiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnJlcV9yeF9xdWV1ZXM7IGkrKykKIAkJbmFwaV9kaXNhYmxlKCZhZGFwdGVyLT5uYXBpW2ldKTsKIAotCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpOworCWlmICghYWRhcHRlci0+ZmFpbG92ZXIpCisJCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpOwogCiAJaWYgKGFkYXB0ZXItPmJvdW5jZV9idWZmZXIpIHsKIAkJaWYgKCFkbWFfbWFwcGluZ19lcnJvcihkZXYsIGFkYXB0ZXItPmJvdW5jZV9idWZmZXJfZG1hKSkgewpAQCAtMTQyMiw3ICsxNDI0LDcgQEAKIAkJc2NycSA9IGFkYXB0ZXItPnR4X3NjcnFbaV07CiAJCXNjcnEtPmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBzY3JxLT5od19pcnEpOwogCi0JCWlmIChzY3JxLT5pcnEgPT0gTk9fSVJRKSB7CisJCWlmICghc2NycS0+aXJxKSB7CiAJCQlyYyA9IC1FSU5WQUw7CiAJCQlkZXZfZXJyKGRldiwgIkVycm9yIG1hcHBpbmcgaXJxXG4iKTsKIAkJCWdvdG8gcmVxX3R4X2lycV9mYWlsZWQ7CkBAIC0xNDQyLDcgKzE0NDQsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5yZXFfcnhfcXVldWVzOyBpKyspIHsKIAkJc2NycSA9IGFkYXB0ZXItPnJ4X3NjcnFbaV07CiAJCXNjcnEtPmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBzY3JxLT5od19pcnEpOwotCQlpZiAoc2NycS0+aXJxID09IE5PX0lSUSkgeworCQlpZiAoIXNjcnEtPmlycSkgewogCQkJcmMgPSAtRUlOVkFMOwogCQkJZGV2X2VycihkZXYsICJFcnJvciBtYXBwaW5nIGlycVxuIik7CiAJCQlnb3RvIHJlcV9yeF9pcnFfZmFpbGVkOwpAQCAtMjc3NywxMiArMjc3OSw2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGlibXZuaWNfZndfY29tcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IHRyYWNlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGxlbiwKIAkJCSAgbG9mZl90ICpwcG9zKQogewpAQCAtMjgzNCw3ICsyODMwLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhY2Vfb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBpYm12bmljX2Z3X2NvbXBfb3BlbiwKKwkub3BlbgkJPSBzaW1wbGVfb3BlbiwKIAkucmVhZAkJPSB0cmFjZV9yZWFkLAogfTsKIApAQCAtMjg4NCw3ICsyODgwLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGF1c2VkX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gaWJtdm5pY19md19jb21wX29wZW4sCisJLm9wZW4JCT0gc2ltcGxlX29wZW4sCiAJLnJlYWQJCT0gcGF1c2VkX3JlYWQsCiAJLndyaXRlCQk9IHBhdXNlZF93cml0ZSwKIH07CkBAIC0yOTMyLDcgKzI5MjgsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjaW5nX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gaWJtdm5pY19md19jb21wX29wZW4sCisJLm9wZW4JCT0gc2ltcGxlX29wZW4sCiAJLnJlYWQJCT0gdHJhY2luZ19yZWFkLAogCS53cml0ZQkJPSB0cmFjaW5nX3dyaXRlLAogfTsKQEAgLTI5ODUsNyArMjk4MSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVycm9yX2xldmVsX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gaWJtdm5pY19md19jb21wX29wZW4sCisJLm9wZW4JCT0gc2ltcGxlX29wZW4sCiAJLnJlYWQJCT0gZXJyb3JfbGV2ZWxfcmVhZCwKIAkud3JpdGUJCT0gZXJyb3JfbGV2ZWxfd3JpdGUsCiB9OwpAQCAtMzAzNiw3ICszMDMyLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhY2VfbGV2ZWxfb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBpYm12bmljX2Z3X2NvbXBfb3BlbiwKKwkub3BlbgkJPSBzaW1wbGVfb3BlbiwKIAkucmVhZAkJPSB0cmFjZV9sZXZlbF9yZWFkLAogCS53cml0ZQkJPSB0cmFjZV9sZXZlbF93cml0ZSwKIH07CkBAIC0zMDg5LDcgKzMwODUsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjZV9zaXplX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm9wZW4JCT0gaWJtdm5pY19md19jb21wX29wZW4sCisJLm9wZW4JCT0gc2ltcGxlX29wZW4sCiAJLnJlYWQJCT0gdHJhY2VfYnVmZl9zaXplX3JlYWQsCiAJLndyaXRlCQk9IHRyYWNlX2J1ZmZfc2l6ZV93cml0ZSwKIH07CkBAIC0zMjgwLDYgKzMyNzYsMTAgQEAKIAkJCXJjID0gaWJtdm5pY19zZW5kX2NycV9pbml0KGFkYXB0ZXIpOwogCQkJaWYgKHJjKQogCQkJCWRldl9lcnIoZGV2LCAiRXJyb3Igc2VuZGluZyBpbml0IHJjPSVsZFxuIiwgcmMpOworCQl9IGVsc2UgaWYgKGdlbl9jcnEtPmNtZCA9PSBJQk1WTklDX0RFVklDRV9GQUlMT1ZFUikgeworCQkJZGV2X2luZm8oZGV2LCAiQmFja2luZyBkZXZpY2UgZmFpbG92ZXIgZGV0ZWN0ZWRcbiIpOworCQkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKKwkJCWFkYXB0ZXItPmZhaWxvdmVyID0gdHJ1ZTsKIAkJfSBlbHNlIHsKIAkJCS8qIFRoZSBhZGFwdGVyIGxvc3QgdGhlIGNvbm5lY3Rpb24gKi8KIAkJCWRldl9lcnIoZGV2LCAiVmlydHVhbCBBZGFwdGVyIGZhaWxlZCAocmM9JWQpXG4iLApAQCAtMzYxNSw4ICszNjE1LDE4IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnZkZXYtPmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwogCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoMzAwMDApOworCWJvb2wgcmVzdGFydCA9IGZhbHNlOwogCWludCByYzsKIAorCWlmIChhZGFwdGVyLT5mYWlsb3ZlcikgeworCQlyZWxlYXNlX3N1Yl9jcnFzKGFkYXB0ZXIpOworCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7CisJCQluZXRpZl90eF9kaXNhYmxlKG5ldGRldik7CisJCQlpYm12bmljX2Nsb3NlKG5ldGRldik7CisJCQlyZXN0YXJ0ID0gdHJ1ZTsKKwkJfQorCX0KKwogCXNlbmRfdmVyc2lvbl94Y2hnKGFkYXB0ZXIpOwogCXJlaW5pdF9jb21wbGV0aW9uKCZhZGFwdGVyLT5pbml0X2RvbmUpOwogCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZhZGFwdGVyLT5pbml0X2RvbmUsIHRpbWVvdXQpKSB7CkBAIC0zNjQ1LDYgKzM2NTUsMTcgQEAKIAogCW5ldGRldi0+cmVhbF9udW1fdHhfcXVldWVzID0gYWRhcHRlci0+cmVxX3R4X3F1ZXVlczsKIAorCWlmIChhZGFwdGVyLT5mYWlsb3ZlcikgeworCQlhZGFwdGVyLT5mYWlsb3ZlciA9IGZhbHNlOworCQlpZiAocmVzdGFydCkgeworCQkJcmMgPSBpYm12bmljX29wZW4obmV0ZGV2KTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIHJlc3RhcnRfZmFpbGVkOworCQl9CisJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwkJcmV0dXJuOworCX0KKwogCXJjID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CiAJaWYgKHJjKSB7CiAJCWRldl9lcnIoZGV2LApAQCAtMzY1NSw2ICszNjc2LDggQEAKIAogCXJldHVybjsKIAorcmVzdGFydF9mYWlsZWQ6CisJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVzdGFydCBpYm12bmljLCByYz0lZFxuIiwgcmMpOwogcmVnaXN0ZXJfZmFpbGVkOgogCXJlbGVhc2Vfc3ViX2NycXMoYWRhcHRlcik7CiB0YXNrX2ZhaWxlZDoKQEAgLTM2OTIsNiArMzcxNSw3IEBACiAJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgbmV0ZGV2KTsKIAlhZGFwdGVyLT52ZGV2ID0gZGV2OwogCWFkYXB0ZXItPm5ldGRldiA9IG5ldGRldjsKKwlhZGFwdGVyLT5mYWlsb3ZlciA9IGZhbHNlOwogCiAJZXRoZXJfYWRkcl9jb3B5KGFkYXB0ZXItPm1hY19hZGRyLCBtYWNfYWRkcl9wKTsKIAlldGhlcl9hZGRyX2NvcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+bWFjX2FkZHIpOwpAQCAtMzcyMSw2ICszNzQ1LDcgQEAKIAlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJmRldi0+ZGV2LCBhZGFwdGVyLT5zdGF0c190b2tlbikpIHsKIAkJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0NNTykpCiAJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkNvdWxkbid0IG1hcCBzdGF0cyBidWZmZXJcbiIpOworCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZnJlZV9jcnE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdm5pYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZuaWMuaAppbmRleCBlODI4OThmLi5iZmM4NGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdm5pYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12bmljLmgKQEAgLTgzMCw2ICs4MzAsNyBAQAogCUlCTVZOSUNfQ1JRX0lOSVQgICAgICAgICAgICAgICAgID0gMHgwMSwKIAlJQk1WTklDX0NSUV9JTklUX0NPTVBMRVRFICAgICAgICA9IDB4MDIsCiAJSUJNVk5JQ19QQVJUSVRJT05fTUlHUkFURUQgICAgICAgPSAweDA2LAorCUlCTVZOSUNfREVWSUNFX0ZBSUxPVkVSICAgICAgICAgID0gMHgwOCwKIH07CiAKIHN0cnVjdCBpYm12bmljX2NycV9xdWV1ZSB7CkBAIC0xMDQ3LDQgKzEwNDgsNSBAQAogCXU4IG1hcF9pZDsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdCB2bmljX2NycV9pbml0OworCWJvb2wgZmFpbG92ZXI7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3B0cC5jCmluZGV4IDJlMWIxN2EuLmFkMDM3NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcHRwLmMKQEAgLTMzNCw3ICszMzQsNyBAQAogCWlmIChJU19FUlIoYWRhcHRlci0+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+cnNzX2x1dF91c2VyLAogCQkJICAgICAgIEk0MEVfSExVVF9BUlJBWV9TSVpFKTsKQEAgLTI5NDMsNiArMzA4NSw5IEBACiAJfSBlbHNlIHsKIAkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CiAJCXBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgfD0gSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOworCisJCS8qIGZsdXNoIGN1cnJlbnQgQVRSIHNldHRpbmdzICovCisJCXNldF9iaXQoX19JNDBFX0ZEX0ZMVVNIX1JFUVVFU1RFRCwgJnBmLT5zdGF0ZSk7CiAJfQogCiAJaWYgKChmbGFncyAmIEk0MEVfUFJJVl9GTEFHU19WRUJfU1RBVFMpICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX21haW4uYwppbmRleCBjNmFjN2E2Li5hYzFmYWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9tYWluLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAogI2RlZmluZSBEUlZfVkVSU0lPTl9NQUpPUiAxCiAjZGVmaW5lIERSVl9WRVJTSU9OX01JTk9SIDYKLSNkZWZpbmUgRFJWX1ZFUlNJT05fQlVJTEQgMTEKKyNkZWZpbmUgRFJWX1ZFUlNJT05fQlVJTEQgMTYKICNkZWZpbmUgRFJWX1ZFUlNJT04gX19zdHJpbmdpZnkoRFJWX1ZFUlNJT05fTUFKT1IpICIuIiBcCiAJICAgICBfX3N0cmluZ2lmeShEUlZfVkVSU0lPTl9NSU5PUikgIi4iIFwKIAkgICAgIF9fc3RyaW5naWZ5KERSVl9WRVJTSU9OX0JVSUxEKSAgICBEUlZfS0VSTgpAQCAtNTcsOCArNTcsNiBAQAogc3RhdGljIGludCBpNDBlX3NldHVwX21pc2NfdmVjdG9yKHN0cnVjdCBpNDBlX3BmICpwZik7CiBzdGF0aWMgdm9pZCBpNDBlX2RldGVybWluZV9xdWV1ZV91c2FnZShzdHJ1Y3QgaTQwZV9wZiAqcGYpOwogc3RhdGljIGludCBpNDBlX3NldHVwX3BmX2ZpbHRlcl9jb250cm9sKHN0cnVjdCBpNDBlX3BmICpwZik7Ci1zdGF0aWMgdm9pZCBpNDBlX2ZpbGxfcnNzX2x1dChzdHJ1Y3QgaTQwZV9wZiAqcGYsIHU4ICpsdXQsCi0JCQkgICAgICB1MTYgcnNzX3RhYmxlX3NpemUsIHUxNiByc3Nfc2l6ZSk7CiBzdGF0aWMgdm9pZCBpNDBlX2ZkaXJfc2Jfc2V0dXAoc3RydWN0IGk0MGVfcGYgKnBmKTsKIHN0YXRpYyBpbnQgaTQwZV92ZWJfZ2V0X2J3X2luZm8oc3RydWN0IGk0MGVfdmViICp2ZWIpOwogCkBAIC01MjcsNiArNTI1LDcgQEAKIAkJCXBmLT52ZWJbaV0tPnN0YXRfb2Zmc2V0c19sb2FkZWQgPSBmYWxzZTsKIAkJfQogCX0KKwlwZi0+aHdfY3N1bV9yeF9lcnJvciA9IDA7CiB9CiAKIC8qKgpAQCAtMTMxNiw3ICsxMzE1LDcgQEAKIAllbGVtZW50LnZsYW5fdGFnID0gMDsKIAkvKiAuLi5hbmQgc29tZSBmaXJtd2FyZSBkb2VzIGl0IHRoaXMgd2F5LiAqLwogCWVsZW1lbnQuZmxhZ3MgPSBJNDBFX0FRQ19NQUNWTEFOX0RFTF9QRVJGRUNUX01BVENIIHwKLQkJCUk0MEVfQVFDX01BQ1ZMQU5fQUREX0lHTk9SRV9WTEFOOworCQkJSTQwRV9BUUNfTUFDVkxBTl9ERUxfSUdOT1JFX1ZMQU47CiAJaTQwZV9hcV9yZW1vdmVfbWFjdmxhbigmcGYtPmh3LCB2c2ktPnNlaWQsICZlbGVtZW50LCAxLCBOVUxMKTsKIH0KIApAQCAtMTkwOSw3ICsxOTA4LDcgQEAKIAkJCWV0aGVyX2FkZHJfY29weShkZWxfbGlzdFtudW1fZGVsXS5tYWNfYWRkciwgZi0+bWFjYWRkcik7CiAJCQlpZiAoZi0+dmxhbiA9PSBJNDBFX1ZMQU5fQU5ZKSB7CiAJCQkJZGVsX2xpc3RbbnVtX2RlbF0udmxhbl90YWcgPSAwOwotCQkJCWNtZF9mbGFncyB8PSBJNDBFX0FRQ19NQUNWTEFOX0FERF9JR05PUkVfVkxBTjsKKwkJCQljbWRfZmxhZ3MgfD0gSTQwRV9BUUNfTUFDVkxBTl9ERUxfSUdOT1JFX1ZMQU47CiAJCQl9IGVsc2UgewogCQkJCWRlbF9saXN0W251bV9kZWxdLnZsYW5fdGFnID0KIAkJCQkJY3B1X3RvX2xlMTYoKHUxNikoZi0+dmxhbikpOwpAQCAtNDYxNiw3ICs0NjE1LDcgQEAKIHN0YXRpYyB1OCBpNDBlX3BmX2dldF9udW1fdGMoc3RydWN0IGk0MGVfcGYgKnBmKQogewogCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7Ci0JdTggaSwgZW5hYmxlZF90YzsKKwl1OCBpLCBlbmFibGVkX3RjID0gMTsKIAl1OCBudW1fdGMgPSAwOwogCXN0cnVjdCBpNDBlX2RjYnhfY29uZmlnICpkY2JjZmcgPSAmaHctPmxvY2FsX2RjYnhfY29uZmlnOwogCkBAIC00NjM0LDggKzQ2MzMsNiBAQAogCWVsc2UKIAkJcmV0dXJuIDE7IC8qIE9ubHkgVEMwICovCiAKLQkvKiBBdCBsZWFzdCBoYXZlIFRDMCAqLwotCWVuYWJsZWRfdGMgPSAoZW5hYmxlZF90YyA/IGVuYWJsZWRfdGMgOiAweDEpOwogCWZvciAoaSA9IDA7IGkgPCBJNDBFX01BWF9UUkFGRklDX0NMQVNTOyBpKyspIHsKIAkJaWYgKGVuYWJsZWRfdGMgJiBCSVQoaSkpCiAJCQludW1fdGMrKzsKQEAgLTUxMTMsOSArNTExMCwxMyBAQAogCQkJCSAgICAgICBEQ0JfQ0FQX0RDQlhfVkVSX0lFRUU7CiAKIAkJCXBmLT5mbGFncyB8PSBJNDBFX0ZMQUdfRENCX0NBUEFCTEU7Ci0JCQkvKiBFbmFibGUgRENCIHRhZ2dpbmcgb25seSB3aGVuIG1vcmUgdGhhbiBvbmUgVEMgKi8KKwkJCS8qIEVuYWJsZSBEQ0IgdGFnZ2luZyBvbmx5IHdoZW4gbW9yZSB0aGFuIG9uZSBUQworCQkJICogb3IgZXhwbGljaXRseSBkaXNhYmxlIGlmIG9ubHkgb25lIFRDCisJCQkgKi8KIAkJCWlmIChpNDBlX2RjYl9nZXRfbnVtX3RjKCZody0+bG9jYWxfZGNieF9jb25maWcpID4gMSkKIAkJCQlwZi0+ZmxhZ3MgfD0gSTQwRV9GTEFHX0RDQl9FTkFCTEVEOworCQkJZWxzZQorCQkJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0RDQl9FTkFCTEVEOwogCQkJZGV2X2RiZygmcGYtPnBkZXYtPmRldiwKIAkJCQkiRENCWCBvZmZsb2FkIGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBQRi5cbiIpOwogCQl9CkBAIC01MjQxLDcgKzUyNDIsNyBAQAogCQkvKiByZXNldCBmZCBjb3VudGVycyAqLwogCQlwZi0+ZmRfYWRkX2VyciA9IHBmLT5mZF9hdHJfY250ID0gMDsKIAkJaWYgKHBmLT5mZF90Y3BfcnVsZSA+IDApIHsKLQkJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOworCQkJcGYtPmF1dG9fZGlzYWJsZV9mbGFncyB8PSBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CiAJCQlpZiAoSTQwRV9ERUJVR19GRCAmIHBmLT5ody5kZWJ1Z19tYXNrKQogCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRm9yY2luZyBBVFIgb2ZmLCBzaWRlYmFuZCBydWxlcyBmb3IgVENQL0lQdjQgZXhpc3RcbiIpOwogCQkJcGYtPmZkX3RjcF9ydWxlID0gMDsKQEAgLTU0MzEsNyArNTQzMiw2IEBACiAJd3IzMigmcGYtPmh3LCBJNDBFX0dMTEFOX1RTT01TS19MLCBiZTMyX3RvX2NwdShUQ1BfRkxBR19DV1IpID4+IDE2KTsKIAogCXVkcF90dW5uZWxfZ2V0X3J4X2luZm8obmV0ZGV2KTsKLQlpNDBlX25vdGlmeV9jbGllbnRfb2ZfbmV0ZGV2X29wZW4odnNpKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTcxNyw3ICs1NzE3LDcgQEAKIAl1OCB0eXBlOwogCiAJLyogTm90IERDQiBjYXBhYmxlIG9yIGNhcGFiaWxpdHkgZGlzYWJsZWQgKi8KLQlpZiAoIShwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRENCX0NBUEFCTEUpKQorCWlmICghKHBmLT5mbGFncyAmIEk0MEVfRkxBR19EQ0JfRU5BQkxFRCkpCiAJCXJldHVybiByZXQ7CiAKIAkvKiBJZ25vcmUgaWYgZXZlbnQgaXMgbm90IGZvciBOZWFyZXN0IEJyaWRnZSAqLwpAQCAtNTkzOSwxMyArNTkzOSwxNyBAQAogCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRkQgU2lkZWJhbmQvbnR1cGxlIGlzIGJlaW5nIGVuYWJsZWQgc2luY2Ugd2UgaGF2ZSBzcGFjZSBpbiB0aGUgdGFibGUgbm93XG4iKTsKIAkJfQogCX0KLQkvKiBXYWl0IGZvciBzb21lIG1vcmUgc3BhY2UgdG8gYmUgYXZhaWxhYmxlIHRvIHR1cm4gb24gQVRSICovCisKKwkvKiBXYWl0IGZvciBzb21lIG1vcmUgc3BhY2UgdG8gYmUgYXZhaWxhYmxlIHRvIHR1cm4gb24gQVRSLiBXZSBhbHNvCisJICogbXVzdCBjaGVjayB0aGF0IG5vIGV4aXN0aW5nIG50dXBsZSBydWxlcyBmb3IgVENQIGFyZSBpbiBlZmZlY3QKKwkgKi8KIAlpZiAoZmNudF9wcm9nIDwgKGZjbnRfYXZhaWwgLSBJNDBFX0ZESVJfQlVGRkVSX0hFQURfUk9PTSAqIDIpKSB7CiAJCWlmICgocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSAmJgotCQkgICAgKHBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQpKSB7CisJCSAgICAocGYtPmF1dG9fZGlzYWJsZV9mbGFncyAmIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkgJiYKKwkJICAgIChwZi0+ZmRfdGNwX3J1bGUgPT0gMCkpIHsKIAkJCXBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKIAkJCWlmIChJNDBFX0RFQlVHX0ZEICYgcGYtPmh3LmRlYnVnX21hc2spCi0JCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJBVFIgaXMgYmVpbmcgZW5hYmxlZCBzaW5jZSB3ZSBoYXZlIHNwYWNlIGluIHRoZSB0YWJsZSBub3dcbiIpOworCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiQVRSIGlzIGJlaW5nIGVuYWJsZWQgc2luY2Ugd2UgaGF2ZSBzcGFjZSBpbiB0aGUgdGFibGUgYW5kIHRoZXJlIGFyZSBubyBjb25mbGljdGluZyBudHVwbGUgcnVsZXNcbiIpOwogCQl9CiAJfQogCkBAIC01OTc2LDkgKzU5ODAsNiBAQAogCWludCBmZF9yb29tOwogCWludCByZWc7CiAKLQlpZiAoIShwZi0+ZmxhZ3MgJiAoSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQgfCBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQpKSkKLQkJcmV0dXJuOwotCiAJaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHBmLT5mZF9mbHVzaF90aW1lc3RhbXAgKwogCQkJCSAoSTQwRV9NSU5fRkRfRkxVU0hfSU5URVJWQUwgKiBIWikpKQogCQlyZXR1cm47CkBAIC01OTk4LDcgKzU5OTksNyBAQAogCX0KIAogCXBmLT5mZF9mbHVzaF90aW1lc3RhbXAgPSBqaWZmaWVzOwotCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOworCXBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgfD0gSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOwogCS8qIGZsdXNoIGFsbCBmaWx0ZXJzICovCiAJd3IzMigmcGYtPmh3LCBJNDBFX1BGUUZfQ1RMXzEsCiAJICAgICBJNDBFX1BGUUZfQ1RMXzFfQ0xFQVJGRFRBQkxFX01BU0spOwpAQCAtNjAxOCw3ICs2MDE5LDcgQEAKIAkJLyogcmVwbGF5IHNpZGViYW5kIGZpbHRlcnMgKi8KIAkJaTQwZV9mZGlyX2ZpbHRlcl9yZXN0b3JlKHBmLT52c2lbcGYtPmxhbl92c2ldKTsKIAkJaWYgKCFkaXNhYmxlX2F0cikKLQkJCXBmLT5mbGFncyB8PSBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CisJCQlwZi0+YXV0b19kaXNhYmxlX2ZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CiAJCWNsZWFyX2JpdChfX0k0MEVfRkRfRkxVU0hfUkVRVUVTVEVELCAmcGYtPnN0YXRlKTsKIAkJaWYgKEk0MEVfREVCVUdfRkQgJiBwZi0+aHcuZGVidWdfbWFzaykKIAkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRkQgRmlsdGVyIHRhYmxlIGZsdXNoZWQgYW5kIEZELVNCIHJlcGxheWVkLlxuIik7CkBAIC02MDUyLDkgKzYwNTMsNiBAQAogCWlmICh0ZXN0X2JpdChfX0k0MEVfRE9XTiwgJnBmLT5zdGF0ZSkpCiAJCXJldHVybjsKIAotCWlmICghKHBmLT5mbGFncyAmIChJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCB8IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkpKQotCQlyZXR1cm47Ci0KIAlpZiAodGVzdF9iaXQoX19JNDBFX0ZEX0ZMVVNIX1JFUVVFU1RFRCwgJnBmLT5zdGF0ZSkpCiAJCWk0MGVfZmRpcl9mbHVzaF9hbmRfcmVwbGF5KHBmKTsKIApAQCAtNzE1NCw5ICs3MTUyLDkgQEAKIAkJCXBmLT5wZW5kaW5nX3VkcF9iaXRtYXAgJj0gfkJJVF9VTEwoaSk7CiAJCQlwb3J0ID0gcGYtPnVkcF9wb3J0c1tpXS5pbmRleDsKIAkJCWlmIChwb3J0KQotCQkJCXJldCA9IGk0MGVfYXFfYWRkX3VkcF90dW5uZWwoaHcsIG50b2hzKHBvcnQpLAotCQkJCQkJICAgICBwZi0+dWRwX3BvcnRzW2ldLnR5cGUsCi0JCQkJCQkgICAgIE5VTEwsIE5VTEwpOworCQkJCXJldCA9IGk0MGVfYXFfYWRkX3VkcF90dW5uZWwoaHcsIHBvcnQsCisJCQkJCQkJcGYtPnVkcF9wb3J0c1tpXS50eXBlLAorCQkJCQkJCU5VTEwsIE5VTEwpOwogCQkJZWxzZQogCQkJCXJldCA9IGk0MGVfYXFfZGVsX3VkcF90dW5uZWwoaHcsIGksIE5VTEwpOwogCkBAIC03NjQzLDcgKzc2NDEsNiBAQAogCQkJdmVjdG9yc19sZWZ0LS07CiAJCX0gZWxzZSB7CiAJCQlwZi0+bnVtX2Zkc2JfbXNpeCA9IDA7Ci0JCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9TQl9FTkFCTEVEOwogCQl9CiAJfQogCkBAIC03NjYzLDYgKzc2NjAsOCBAQAogI2VuZGlmCiAJLyogY2FuIHdlIHJlc2VydmUgZW5vdWdoIGZvciBpV0FSUD8gKi8KIAlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX0lXQVJQX0VOQUJMRUQpIHsKKwkJaXdhcnBfcmVxdWVzdGVkID0gcGYtPm51bV9pd2FycF9tc2l4OworCiAJCWlmICghdmVjdG9yc19sZWZ0KQogCQkJcGYtPm51bV9pd2FycF9tc2l4ID0gMDsKIAkJZWxzZSBpZiAodmVjdG9yc19sZWZ0IDwgcGYtPm51bV9pd2FycF9tc2l4KQpAQCAtNzY3NiwxOCArNzY3NSwyMyBAQAogCQlpbnQgdm1kcV92ZWNzX3dhbnRlZCA9IHBmLT5udW1fdm1kcV92c2lzICogcGYtPm51bV92bWRxX3FwczsKIAkJaW50IHZtZHFfdmVjcyA9IG1pbl90KGludCwgdmVjdG9yc19sZWZ0LCB2bWRxX3ZlY3Nfd2FudGVkKTsKIAotCQkvKiBpZiB3ZSdyZSBzaG9ydCBvbiB2ZWN0b3JzIGZvciB3aGF0J3MgZGVzaXJlZCwgd2UgbGltaXQKLQkJICogdGhlIHF1ZXVlcyBwZXIgdm1kcS4gIElmIHRoaXMgaXMgc3RpbGwgbW9yZSB0aGFuIGFyZQotCQkgKiBhdmFpbGFibGUsIHRoZSB1c2VyIHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhlIG51bWJlciBvZgotCQkgKiBxdWV1ZXMvdmVjdG9ycyB1c2VkIGJ5IHRoZSBQRiBsYXRlciB3aXRoIHRoZSBldGh0b29sCi0JCSAqIGNoYW5uZWxzIGNvbW1hbmQKLQkJICovCi0JCWlmICh2bWRxX3ZlY3MgPCB2bWRxX3ZlY3Nfd2FudGVkKQotCQkJcGYtPm51bV92bWRxX3FwcyA9IDE7Ci0JCXBmLT5udW1fdm1kcV9tc2l4ID0gcGYtPm51bV92bWRxX3FwczsKKwkJaWYgKCF2ZWN0b3JzX2xlZnQpIHsKKwkJCXBmLT5udW1fdm1kcV9tc2l4ID0gMDsKKwkJCXBmLT5udW1fdm1kcV9xcHMgPSAwOworCQl9IGVsc2UgeworCQkJLyogaWYgd2UncmUgc2hvcnQgb24gdmVjdG9ycyBmb3Igd2hhdCdzIGRlc2lyZWQsIHdlIGxpbWl0CisJCQkgKiB0aGUgcXVldWVzIHBlciB2bWRxLiAgSWYgdGhpcyBpcyBzdGlsbCBtb3JlIHRoYW4gYXJlCisJCQkgKiBhdmFpbGFibGUsIHRoZSB1c2VyIHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhlIG51bWJlciBvZgorCQkJICogcXVldWVzL3ZlY3RvcnMgdXNlZCBieSB0aGUgUEYgbGF0ZXIgd2l0aCB0aGUgZXRodG9vbAorCQkJICogY2hhbm5lbHMgY29tbWFuZAorCQkJICovCisJCQlpZiAodm1kcV92ZWNzIDwgdm1kcV92ZWNzX3dhbnRlZCkKKwkJCQlwZi0+bnVtX3ZtZHFfcXBzID0gMTsKKwkJCXBmLT5udW1fdm1kcV9tc2l4ID0gcGYtPm51bV92bWRxX3FwczsKIAotCQl2X2J1ZGdldCArPSB2bWRxX3ZlY3M7Ci0JCXZlY3RvcnNfbGVmdCAtPSB2bWRxX3ZlY3M7CisJCQl2X2J1ZGdldCArPSB2bWRxX3ZlY3M7CisJCQl2ZWN0b3JzX2xlZnQgLT0gdm1kcV92ZWNzOworCQl9CiAJfQogCiAJcGYtPm1zaXhfZW50cmllcyA9IGtjYWxsb2Modl9idWRnZXQsIHNpemVvZihzdHJ1Y3QgbXNpeF9lbnRyeSksCkBAIC03Njk5LDIxICs3NzAzLDYgQEAKIAkJcGYtPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CiAJdl9hY3R1YWwgPSBpNDBlX3Jlc2VydmVfbXNpeF92ZWN0b3JzKHBmLCB2X2J1ZGdldCk7CiAKLQlpZiAodl9hY3R1YWwgIT0gdl9idWRnZXQpIHsKLQkJLyogSWYgd2UgaGF2ZSBsaW1pdGVkIHJlc291cmNlcywgd2Ugd2lsbCBzdGFydCB3aXRoIG5vIHZlY3RvcnMKLQkJICogZm9yIHRoZSBzcGVjaWFsIGZlYXR1cmVzIGFuZCB0aGVuIGFsbG9jYXRlIHZlY3RvcnMgdG8gc29tZQotCQkgKiBvZiB0aGVzZSBmZWF0dXJlcyBiYXNlZCBvbiB0aGUgcG9saWN5IGFuZCBhdCB0aGUgZW5kIGRpc2FibGUKLQkJICogdGhlIGZlYXR1cmVzIHRoYXQgZGlkIG5vdCBnZXQgYW55IHZlY3RvcnMuCi0JCSAqLwotCQlpd2FycF9yZXF1ZXN0ZWQgPSBwZi0+bnVtX2l3YXJwX21zaXg7Ci0JCXBmLT5udW1faXdhcnBfbXNpeCA9IDA7Ci0jaWZkZWYgSTQwRV9GQ09FCi0JCXBmLT5udW1fZmNvZV9xcHMgPSAwOwotCQlwZi0+bnVtX2Zjb2VfbXNpeCA9IDA7Ci0jZW5kaWYKLQkJcGYtPm51bV92bWRxX21zaXggPSAwOwotCX0KLQogCWlmICh2X2FjdHVhbCA8IEk0MEVfTUlOX01TSVgpIHsKIAkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfTVNJWF9FTkFCTEVEOwogCQlrZnJlZShwZi0+bXNpeF9lbnRyaWVzKTsKQEAgLTc3MjcsOSArNzcxNiwxNiBAQAogCQlwZi0+bnVtX2xhbl9xcHMgPSAxOwogCQlwZi0+bnVtX2xhbl9tc2l4ID0gMTsKIAotCX0gZWxzZSBpZiAodl9hY3R1YWwgIT0gdl9idWRnZXQpIHsKKwl9IGVsc2UgaWYgKCF2ZWN0b3JzX2xlZnQpIHsKKwkJLyogSWYgd2UgaGF2ZSBsaW1pdGVkIHJlc291cmNlcywgd2Ugd2lsbCBzdGFydCB3aXRoIG5vIHZlY3RvcnMKKwkJICogZm9yIHRoZSBzcGVjaWFsIGZlYXR1cmVzIGFuZCB0aGVuIGFsbG9jYXRlIHZlY3RvcnMgdG8gc29tZQorCQkgKiBvZiB0aGVzZSBmZWF0dXJlcyBiYXNlZCBvbiB0aGUgcG9saWN5IGFuZCBhdCB0aGUgZW5kIGRpc2FibGUKKwkJICogdGhlIGZlYXR1cmVzIHRoYXQgZGlkIG5vdCBnZXQgYW55IHZlY3RvcnMuCisJCSAqLwogCQlpbnQgdmVjOwogCisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAorCQkJICJNU0ktWCB2ZWN0b3IgbGltaXQgcmVhY2hlZCwgYXR0ZW1wdGluZyB0byByZWRpc3RyaWJ1dGUgdmVjdG9yc1xuIik7CiAJCS8qIHJlc2VydmUgdGhlIG1pc2MgdmVjdG9yICovCiAJCXZlYyA9IHZfYWN0dWFsIC0gMTsKIApAQCAtNzczNyw3ICs3NzMzLDEwIEBACiAJCXBmLT5udW1fdm1kcV9tc2l4ID0gMTsgICAgLyogZm9yY2UgVk1EcXMgdG8gb25seSBvbmUgdmVjdG9yICovCiAJCXBmLT5udW1fdm1kcV92c2lzID0gMTsKIAkJcGYtPm51bV92bWRxX3FwcyA9IDE7Ci0JCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQ7CisjaWZkZWYgSTQwRV9GQ09FCisJCXBmLT5udW1fZmNvZV9xcHMgPSAwOworCQlwZi0+bnVtX2Zjb2VfbXNpeCA9IDA7CisjZW5kaWYKIAogCQkvKiBwYXJ0aXRpb24gb3V0IHRoZSByZW1haW5pbmcgdmVjdG9ycyAqLwogCQlzd2l0Y2ggKHZlYykgewpAQCAtNzc2OSw5ICs3NzY4LDE0IEBACiAJCQkJcGYtPm51bV92bWRxX3ZzaXMgPSBtaW5fdChpbnQsICh2ZWMgLyAyKSwKIAkJCQkJCSAgSTQwRV9ERUZBVUxUX05VTV9WTURRX1ZTSSk7CiAJCQl9CisJCQlpZiAocGYtPmZsYWdzICYgSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQpIHsKKwkJCQlwZi0+bnVtX2Zkc2JfbXNpeCA9IDE7CisJCQkJdmVjLS07CisJCQl9CiAJCQlwZi0+bnVtX2xhbl9tc2l4ID0gbWluX3QoaW50LAogCQkJICAgICAgICh2ZWMgLSAocGYtPm51bV9pd2FycF9tc2l4ICsgcGYtPm51bV92bWRxX3ZzaXMpKSwKIAkJCQkJCQkgICAgICBwZi0+bnVtX2xhbl9tc2l4KTsKKwkJCXBmLT5udW1fbGFuX3FwcyA9IHBmLT5udW1fbGFuX21zaXg7CiAjaWZkZWYgSTQwRV9GQ09FCiAJCQkvKiBnaXZlIG9uZSB2ZWN0b3IgdG8gRkNvRSAqLwogCQkJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19GQ09FX0VOQUJMRUQpIHsKQEAgLTc3ODMsNiArNzc4NywxMSBAQAogCQl9CiAJfQogCisJaWYgKChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkgJiYKKwkgICAgKHBmLT5udW1fZmRzYl9tc2l4ID09IDApKSB7CisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiU2lkZWJhbmQgRmxvd2RpciBkaXNhYmxlZCwgbm90IGVub3VnaCBNU0ktWCB2ZWN0b3JzXG4iKTsKKwkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRDsKKwl9CiAJaWYgKChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfVk1EUV9FTkFCTEVEKSAmJgogCSAgICAocGYtPm51bV92bWRxX21zaXggPT0gMCkpIHsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJWTURxIGRpc2FibGVkLCBub3QgZW5vdWdoIE1TSS1YIHZlY3RvcnNcbiIpOwpAQCAtNzgwMSw2ICs3ODEwLDEzIEBACiAJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZDT0VfRU5BQkxFRDsKIAl9CiAjZW5kaWYKKwlpNDBlX2RlYnVnKCZwZi0+aHcsIEk0MEVfREVCVUdfSU5JVCwKKwkJICAgIk1TSS1YIHZlY3RvciBkaXN0cmlidXRpb246IFBGICVkLCBWTURxICVkLCBGRFNCICVkLCBpV0FSUCAlZFxuIiwKKwkJICAgcGYtPm51bV9sYW5fbXNpeCwKKwkJICAgcGYtPm51bV92bWRxX21zaXggKiBwZi0+bnVtX3ZtZHFfdnNpcywKKwkJICAgcGYtPm51bV9mZHNiX21zaXgsCisJCSAgIHBmLT5udW1faXdhcnBfbXNpeCk7CisKIAlyZXR1cm4gdl9hY3R1YWw7CiB9CiAKQEAgLTc4OTcsNiArNzkxMyw3IEBACiAjZW5kaWYKIAkJCQkgICAgICAgSTQwRV9GTEFHX1JTU19FTkFCTEVECXwKIAkJCQkgICAgICAgSTQwRV9GTEFHX0RDQl9DQVBBQkxFCXwKKwkJCQkgICAgICAgSTQwRV9GTEFHX0RDQl9FTkFCTEVECXwKIAkJCQkgICAgICAgSTQwRV9GTEFHX1NSSU9WX0VOQUJMRUQJfAogCQkJCSAgICAgICBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRAl8CiAJCQkJICAgICAgIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRAl8CkBAIC03OTg2LDcyICs4MDAzLDM0IEBACiBzdGF0aWMgaW50IGk0MGVfY29uZmlnX3Jzc19hcShzdHJ1Y3QgaTQwZV92c2kgKnZzaSwgY29uc3QgdTggKnNlZWQsCiAJCQkgICAgICB1OCAqbHV0LCB1MTYgbHV0X3NpemUpCiB7Ci0Jc3RydWN0IGk0MGVfYXFjX2dldF9zZXRfcnNzX2tleV9kYXRhIHJzc19rZXk7CiAJc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOwogCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7Ci0JYm9vbCBwZl9sdXQgPSBmYWxzZTsKLQl1OCAqcnNzX2x1dDsKLQlpbnQgcmV0LCBpOworCWludCByZXQgPSAwOwogCi0JbWVtY3B5KCZyc3Nfa2V5LCBzZWVkLCBzaXplb2YocnNzX2tleSkpOwotCi0JcnNzX2x1dCA9IGt6YWxsb2MocGYtPnJzc190YWJsZV9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJzc19sdXQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogUG9wdWxhdGUgdGhlIExVVCB3aXRoIG1heCBuby4gb2YgcXVldWVzIGluIHJvdW5kIHJvYmluIGZhc2hpb24gKi8KLQlmb3IgKGkgPSAwOyBpIDwgdnNpLT5yc3NfdGFibGVfc2l6ZTsgaSsrKQotCQlyc3NfbHV0W2ldID0gaSAlIHZzaS0+cnNzX3NpemU7Ci0KLQlyZXQgPSBpNDBlX2FxX3NldF9yc3Nfa2V5KGh3LCB2c2ktPmlkLCAmcnNzX2tleSk7Ci0JaWYgKHJldCkgewotCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKLQkJCSAiQ2Fubm90IHNldCBSU1Mga2V5LCBlcnIgJXMgYXFfZXJyICVzXG4iLAotCQkJIGk0MGVfc3RhdF9zdHIoJnBmLT5odywgcmV0KSwKLQkJCSBpNDBlX2FxX3N0cigmcGYtPmh3LCBwZi0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzKSk7Ci0JCWdvdG8gY29uZmlnX3Jzc19hcV9vdXQ7CisJaWYgKHNlZWQpIHsKKwkJc3RydWN0IGk0MGVfYXFjX2dldF9zZXRfcnNzX2tleV9kYXRhICpzZWVkX2R3ID0KKwkJCShzdHJ1Y3QgaTQwZV9hcWNfZ2V0X3NldF9yc3Nfa2V5X2RhdGEgKilzZWVkOworCQlyZXQgPSBpNDBlX2FxX3NldF9yc3Nfa2V5KGh3LCB2c2ktPmlkLCBzZWVkX2R3KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCisJCQkJICJDYW5ub3Qgc2V0IFJTUyBrZXksIGVyciAlcyBhcV9lcnIgJXNcbiIsCisJCQkJIGk0MGVfc3RhdF9zdHIoaHcsIHJldCksCisJCQkJIGk0MGVfYXFfc3RyKGh3LCBody0+YXEuYXNxX2xhc3Rfc3RhdHVzKSk7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQorCWlmIChsdXQpIHsKKwkJYm9vbCBwZl9sdXQgPSB2c2ktPnR5cGUgPT0gSTQwRV9WU0lfTUFJTiA/IHRydWUgOiBmYWxzZTsKIAotCWlmICh2c2ktPnR5cGUgPT0gSTQwRV9WU0lfTUFJTikKLQkJcGZfbHV0ID0gdHJ1ZTsKLQotCXJldCA9IGk0MGVfYXFfc2V0X3Jzc19sdXQoaHcsIHZzaS0+aWQsIHBmX2x1dCwgcnNzX2x1dCwKLQkJCQkgIHZzaS0+cnNzX3RhYmxlX3NpemUpOwotCWlmIChyZXQpCi0JCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkJICJDYW5ub3Qgc2V0IFJTUyBsdXQsIGVyciAlcyBhcV9lcnIgJXNcbiIsCi0JCQkgaTQwZV9zdGF0X3N0cigmcGYtPmh3LCByZXQpLAotCQkJIGk0MGVfYXFfc3RyKCZwZi0+aHcsIHBmLT5ody5hcS5hc3FfbGFzdF9zdGF0dXMpKTsKLQotY29uZmlnX3Jzc19hcV9vdXQ6Ci0Ja2ZyZWUocnNzX2x1dCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpNDBlX3ZzaV9jb25maWdfcnNzIC0gUHJlcGFyZSBmb3IgVlNJKFZNRHEpIFJTUyBpZiB1c2VkCi0gKiBAdnNpOiBWU0kgc3RydWN0dXJlCi0gKiovCi1zdGF0aWMgaW50IGk0MGVfdnNpX2NvbmZpZ19yc3Moc3RydWN0IGk0MGVfdnNpICp2c2kpCi17Ci0JdTggc2VlZFtJNDBFX0hLRVlfQVJSQVlfU0laRV07Ci0Jc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOwotCXU4ICpsdXQ7Ci0JaW50IHJldDsKLQotCWlmICghKHBmLT5mbGFncyAmIEk0MEVfRkxBR19SU1NfQVFfQ0FQQUJMRSkpCi0JCXJldHVybiAwOwotCi0JbHV0ID0ga3phbGxvYyh2c2ktPnJzc190YWJsZV9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWx1dCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpNDBlX2ZpbGxfcnNzX2x1dChwZiwgbHV0LCB2c2ktPnJzc190YWJsZV9zaXplLCB2c2ktPnJzc19zaXplKTsKLQluZXRkZXZfcnNzX2tleV9maWxsKCh2b2lkICopc2VlZCwgSTQwRV9IS0VZX0FSUkFZX1NJWkUpOwotCXZzaS0+cnNzX3NpemUgPSBtaW5fdChpbnQsIHBmLT5hbGxvY19yc3Nfc2l6ZSwgdnNpLT5udW1fcXVldWVfcGFpcnMpOwotCXJldCA9IGk0MGVfY29uZmlnX3Jzc19hcSh2c2ksIHNlZWQsIGx1dCwgdnNpLT5yc3NfdGFibGVfc2l6ZSk7Ci0Ja2ZyZWUobHV0KTsKLQorCQlyZXQgPSBpNDBlX2FxX3NldF9yc3NfbHV0KGh3LCB2c2ktPmlkLCBwZl9sdXQsIGx1dCwgbHV0X3NpemUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKKwkJCQkgIkNhbm5vdCBzZXQgUlNTIGx1dCwgZXJyICVzIGFxX2VyciAlc1xuIiwKKwkJCQkgaTQwZV9zdGF0X3N0cihodywgcmV0KSwKKwkJCQkgaTQwZV9hcV9zdHIoaHcsIGh3LT5hcS5hc3FfbGFzdF9zdGF0dXMpKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODEwMiw2ICs4MDgxLDQ2IEBACiB9CiAKIC8qKgorICogaTQwZV92c2lfY29uZmlnX3JzcyAtIFByZXBhcmUgZm9yIFZTSShWTURxKSBSU1MgaWYgdXNlZAorICogQHZzaTogVlNJIHN0cnVjdHVyZQorICoqLworc3RhdGljIGludCBpNDBlX3ZzaV9jb25maWdfcnNzKHN0cnVjdCBpNDBlX3ZzaSAqdnNpKQoreworCXU4IHNlZWRbSTQwRV9IS0VZX0FSUkFZX1NJWkVdOworCXN0cnVjdCBpNDBlX3BmICpwZiA9IHZzaS0+YmFjazsKKwl1OCAqbHV0OworCWludCByZXQ7CisKKwlpZiAoIShwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfUlNTX0FRX0NBUEFCTEUpKQorCQlyZXR1cm4gMDsKKworCWlmICghdnNpLT5yc3Nfc2l6ZSkKKwkJdnNpLT5yc3Nfc2l6ZSA9IG1pbl90KGludCwgcGYtPmFsbG9jX3Jzc19zaXplLAorCQkJCSAgICAgIHZzaS0+bnVtX3F1ZXVlX3BhaXJzKTsKKwlpZiAoIXZzaS0+cnNzX3NpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJbHV0ID0ga3phbGxvYyh2c2ktPnJzc190YWJsZV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWx1dCkKKwkJcmV0dXJuIC1FTk9NRU07CisJLyogVXNlIHRoZSB1c2VyIGNvbmZpZ3VyZWQgaGFzaCBrZXlzIGFuZCBsb29rdXAgdGFibGUgaWYgdGhlcmUgaXMgb25lLAorCSAqIG90aGVyd2lzZSB1c2UgZGVmYXVsdAorCSAqLworCWlmICh2c2ktPnJzc19sdXRfdXNlcikKKwkJbWVtY3B5KGx1dCwgdnNpLT5yc3NfbHV0X3VzZXIsIHZzaS0+cnNzX3RhYmxlX3NpemUpOworCWVsc2UKKwkJaTQwZV9maWxsX3Jzc19sdXQocGYsIGx1dCwgdnNpLT5yc3NfdGFibGVfc2l6ZSwgdnNpLT5yc3Nfc2l6ZSk7CisJaWYgKHZzaS0+cnNzX2hrZXlfdXNlcikKKwkJbWVtY3B5KHNlZWQsIHZzaS0+cnNzX2hrZXlfdXNlciwgSTQwRV9IS0VZX0FSUkFZX1NJWkUpOworCWVsc2UKKwkJbmV0ZGV2X3Jzc19rZXlfZmlsbCgodm9pZCAqKXNlZWQsIEk0MEVfSEtFWV9BUlJBWV9TSVpFKTsKKwlyZXQgPSBpNDBlX2NvbmZpZ19yc3NfYXEodnNpLCBzZWVkLCBsdXQsIHZzaS0+cnNzX3RhYmxlX3NpemUpOworCWtmcmVlKGx1dCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKICAqIGk0MGVfY29uZmlnX3Jzc19yZWcgLSBDb25maWd1cmUgUlNTIGtleXMgYW5kIGx1dCBieSB3cml0aW5nIHJlZ2lzdGVycwogICogQHZzaTogUG9pbnRlciB0byB2c2kgc3RydWN0dXJlCiAgKiBAc2VlZDogUlNTIGhhc2ggc2VlZApAQCAtODIzOSw4ICs4MjU4LDggQEAKICAqIEByc3NfdGFibGVfc2l6ZTogTG9va3VwIHRhYmxlIHNpemUKICAqIEByc3Nfc2l6ZTogUmFuZ2Ugb2YgcXVldWUgbnVtYmVyIGZvciBoYXNoaW5nCiAgKi8KLXN0YXRpYyB2b2lkIGk0MGVfZmlsbF9yc3NfbHV0KHN0cnVjdCBpNDBlX3BmICpwZiwgdTggKmx1dCwKLQkJCSAgICAgIHUxNiByc3NfdGFibGVfc2l6ZSwgdTE2IHJzc19zaXplKQordm9pZCBpNDBlX2ZpbGxfcnNzX2x1dChzdHJ1Y3QgaTQwZV9wZiAqcGYsIHU4ICpsdXQsCisJCSAgICAgICB1MTYgcnNzX3RhYmxlX3NpemUsIHUxNiByc3Nfc2l6ZSkKIHsKIAl1MTYgaTsKIApAQCAtODI4MSw2ICs4MzAwLDggQEAKIAlpZiAoIXZzaS0+cnNzX3NpemUpCiAJCXZzaS0+cnNzX3NpemUgPSBtaW5fdChpbnQsIHBmLT5hbGxvY19yc3Nfc2l6ZSwKIAkJCQkgICAgICB2c2ktPm51bV9xdWV1ZV9wYWlycyk7CisJaWYgKCF2c2ktPnJzc19zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWx1dCA9IGt6YWxsb2ModnNpLT5yc3NfdGFibGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFsdXQpCkBAIC04NjA1LDcgKzg2MjYsNiBAQAogCQkJICAgICBJNDBFX0ZMQUdfV0JfT05fSVRSX0NBUEFCTEUgfAogCQkJICAgICBJNDBFX0ZMQUdfTVVMVElQTEVfVENQX1VEUF9SU1NfUENUWVBFIHwKIAkJCSAgICAgSTQwRV9GTEFHX05PX1BDSV9MSU5LX0NIRUNLIHwKLQkJCSAgICAgSTQwRV9GTEFHXzEwME1fU0dNSUlfQ0FQQUJMRSB8CiAJCQkgICAgIEk0MEVfRkxBR19VU0VfU0VUX0xMRFBfTUlCIHwKIAkJCSAgICAgSTQwRV9GTEFHX0dFTkVWRV9PRkZMT0FEX0NBUEFCTEU7CiAJfSBlbHNlIGlmICgocGYtPmh3LmFxLmFwaV9tYWpfdmVyID4gMSkgfHwKQEAgLTg2ODAsMTggKzg3MDAsNDAgQEAKIAkJLyogcmVzZXQgZmQgY291bnRlcnMgKi8KIAkJcGYtPmZkX2FkZF9lcnIgPSBwZi0+ZmRfYXRyX2NudCA9IHBmLT5mZF90Y3BfcnVsZSA9IDA7CiAJCXBmLT5mZGlyX3BmX2FjdGl2ZV9maWx0ZXJzID0gMDsKLQkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKLQkJaWYgKEk0MEVfREVCVUdfRkQgJiBwZi0+aHcuZGVidWdfbWFzaykKLQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiQVRSIHJlLWVuYWJsZWQuXG4iKTsKIAkJLyogaWYgQVRSIHdhcyBhdXRvIGRpc2FibGVkIGl0IGNhbiBiZSByZS1lbmFibGVkLiAqLwogCQlpZiAoKHBmLT5mbGFncyAmIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkgJiYKLQkJICAgIChwZi0+YXV0b19kaXNhYmxlX2ZsYWdzICYgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSkKKwkJICAgIChwZi0+YXV0b19kaXNhYmxlX2ZsYWdzICYgSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEKSkgewogCQkJcGYtPmF1dG9fZGlzYWJsZV9mbGFncyAmPSB+STQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOworCQkJaWYgKEk0MEVfREVCVUdfRkQgJiBwZi0+aHcuZGVidWdfbWFzaykKKwkJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkFUUiByZS1lbmFibGVkLlxuIik7CisJCX0KIAl9CiAJcmV0dXJuIG5lZWRfcmVzZXQ7CiB9CiAKIC8qKgorICogaTQwZV9jbGVhcl9yc3NfbHV0IC0gY2xlYXIgdGhlIHJ4IGhhc2ggbG9va3VwIHRhYmxlCisgKiBAdnNpOiB0aGUgVlNJIGJlaW5nIGNvbmZpZ3VyZWQKKyAqKi8KK3N0YXRpYyB2b2lkIGk0MGVfY2xlYXJfcnNzX2x1dChzdHJ1Y3QgaTQwZV92c2kgKnZzaSkKK3sKKwlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7CisJc3RydWN0IGk0MGVfaHcgKmh3ID0gJnBmLT5odzsKKwl1MTYgdmZfaWQgPSB2c2ktPnZmX2lkOworCXU4IGk7CisKKwlpZiAodnNpLT50eXBlID09IEk0MEVfVlNJX01BSU4pIHsKKwkJZm9yIChpID0gMDsgaSA8PSBJNDBFX1BGUUZfSExVVF9NQVhfSU5ERVg7IGkrKykKKwkJCXdyMzIoaHcsIEk0MEVfUEZRRl9ITFVUKGkpLCAwKTsKKwl9IGVsc2UgaWYgKHZzaS0+dHlwZSA9PSBJNDBFX1ZTSV9TUklPVikgeworCQlmb3IgKGkgPSAwOyBpIDw9IEk0MEVfVkZRRl9ITFVUX01BWF9JTkRFWDsgaSsrKQorCQkJaTQwZV93cml0ZV9yeF9jdGwoaHcsIEk0MEVfVkZRRl9ITFVUMShpLCB2Zl9pZCksIDApOworCX0gZWxzZSB7CisJCWRldl9lcnIoJnBmLT5wZGV2LT5kZXYsICJDYW5ub3Qgc2V0IFJTUyBMVVQgLSBpbnZhbGlkIFZTSSB0eXBlXG4iKTsKKwl9Cit9CisKKy8qKgogICogaTQwZV9zZXRfZmVhdHVyZXMgLSBzZXQgdGhlIG5ldGRldiBmZWF0dXJlIGZsYWdzCiAgKiBAbmV0ZGV2OiBwdHIgdG8gdGhlIG5ldGRldiBiZWluZyBhZGp1c3RlZAogICogQGZlYXR1cmVzOiB0aGUgZmVhdHVyZSBzZXQgdGhhdCB0aGUgc3RhY2sgaXMgc3VnZ2VzdGluZwpAQCAtODcwNCw2ICs4NzQ2LDEyIEBACiAJc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOwogCWJvb2wgbmVlZF9yZXNldDsKIAorCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfUlhIQVNIICYmICEobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhIQVNIKSkKKwkJaTQwZV9wZl9jb25maWdfcnNzKHBmKTsKKwllbHNlIGlmICghKGZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpICYmCisJCSBuZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpCisJCWk0MGVfY2xlYXJfcnNzX2x1dCh2c2kpOworCiAJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlgpCiAJCWk0MGVfdmxhbl9zdHJpcHBpbmdfZW5hYmxlKHZzaSk7CiAJZWxzZQpAQCAtMTA1MDMsNiArMTA1NTEsNyBAQAogCQkJICAgICAgIEk0MEVfRkxBR19GRF9TQl9FTkFCTEVECXwKIAkJCSAgICAgICBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQJfAogCQkJICAgICAgIEk0MEVfRkxBR19EQ0JfQ0FQQUJMRQl8CisJCQkgICAgICAgSTQwRV9GTEFHX0RDQl9FTkFCTEVECXwKIAkJCSAgICAgICBJNDBFX0ZMQUdfU1JJT1ZfRU5BQkxFRAl8CiAJCQkgICAgICAgSTQwRV9GTEFHX1ZNRFFfRU5BQkxFRCk7CiAJfSBlbHNlIGlmICghKHBmLT5mbGFncyAmIChJNDBFX0ZMQUdfUlNTX0VOQUJMRUQgfApAQCAtMTA1MjYsNyArMTA1NzUsOCBAQAogCQkvKiBOb3QgZW5vdWdoIHF1ZXVlcyBmb3IgYWxsIFRDcyAqLwogCQlpZiAoKHBmLT5mbGFncyAmIEk0MEVfRkxBR19EQ0JfQ0FQQUJMRSkgJiYKIAkJICAgIChxdWV1ZXNfbGVmdCA8IEk0MEVfTUFYX1RSQUZGSUNfQ0xBU1MpKSB7Ci0JCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19EQ0JfQ0FQQUJMRTsKKwkJCXBmLT5mbGFncyAmPSB+KEk0MEVfRkxBR19EQ0JfQ0FQQUJMRSB8CisJCQkJCUk0MEVfRkxBR19EQ0JfRU5BQkxFRCk7CiAJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIm5vdCBlbm91Z2ggcXVldWVzIGZvciBEQ0IuIERDQiBpcyBkaXNhYmxlZC5cbiIpOwogCQl9CiAJCXBmLT5udW1fbGFuX3FwcyA9IG1heF90KGludCwgcGYtPnJzc19zaXplX21heCwKQEAgLTEwOTIzLDcgKzEwOTczLDcgQEAKIAllcnIgPSBpNDBlX2luaXRfcGZfZGNiKHBmKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJEQ0IgaW5pdCBmYWlsZWQgJWQsIGRpc2FibGVkXG4iLCBlcnIpOwotCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19EQ0JfQ0FQQUJMRTsKKwkJcGYtPmZsYWdzICY9IH4oSTQwRV9GTEFHX0RDQl9DQVBBQkxFICYgSTQwRV9GTEFHX0RDQl9FTkFCTEVEKTsKIAkJLyogQ29udGludWUgd2l0aG91dCBEQ0IgZW5hYmxlZCAqLwogCX0KICNlbmRpZiAvKiBDT05GSUdfSTQwRV9EQ0IgKi8KQEAgLTExMzAzLDExICsxMTM1Myw3IEBACiAJfQogCiAJLyogc2h1dGRvd24gdGhlIGFkbWlucSAqLwotCXJldF9jb2RlID0gaTQwZV9zaHV0ZG93bl9hZG1pbnEoaHcpOwotCWlmIChyZXRfY29kZSkKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwKLQkJCSAiRmFpbGVkIHRvIGRlc3Ryb3kgdGhlIEFkbWluIFF1ZXVlIHJlc291cmNlczogJWRcbiIsCi0JCQkgcmV0X2NvZGUpOworCWk0MGVfc2h1dGRvd25fYWRtaW5xKGh3KTsKIAogCS8qIGRlc3Ryb3kgdGhlIGxvY2tzIG9ubHkgb25jZSwgaGVyZSAqLwogCW11dGV4X2Rlc3Ryb3koJmh3LT5hcS5hcnFfbXV0ZXgpOwpAQCAtMTEzNTQsNiArMTE0MDAsMTIgQEAKIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlczogZXJyb3IgJWRcbiIsIF9fZnVuY19fLCBlcnJvcik7CiAKKwlpZiAoIXBmKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIkNhbm5vdCByZWNvdmVyIC0gZXJyb3IgaGFwcGVuZWQgZHVyaW5nIGRldmljZSBwcm9iZVxuIik7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKwogCS8qIHNodXRkb3duIGFsbCBvcGVyYXRpb25zICovCiAJaWYgKCF0ZXN0X2JpdChfX0k0MEVfU1VTUEVOREVELCAmcGYtPnN0YXRlKSkgewogCQlydG5sX2xvY2soKTsKQEAgLTExNTc2LDcgKzExNjI4LDggQEAKIAkgKiBpdCBjYW4ndCBiZSBhbnkgd29yc2UgdGhhbiB1c2luZyB0aGUgc3lzdGVtIHdvcmtxdWV1ZSB3aGljaAogCSAqIHdhcyBhbHJlYWR5IHNpbmdsZSB0aHJlYWRlZAogCSAqLwotCWk0MGVfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShpNDBlX2RyaXZlcl9uYW1lKTsKKwlpNDBlX3dxID0gYWxsb2Nfd29ya3F1ZXVlKCIlcyIsIFdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSwKKwkJCQkgIGk0MGVfZHJpdmVyX25hbWUpOwogCWlmICghaTQwZV93cSkgewogCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIiwgaTQwZV9kcml2ZXJfbmFtZSk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3B0cC5jCmluZGV4IGVkMzljYmEuLmYxZmVjZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfcHRwLmMKQEAgLTY2OSw3ICs2NjksNyBAQAogCQlwZi0+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+bmZjX2xvY2spOworfQogLyogaWdiX21haW4uYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfcHRwLmMKaW5kZXggMzM2YzEwMy4uYTc4OTVjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX3B0cC5jCkBAIC01OTEsNiArNTkxLDcgQEAKIAkJCXRzaW0gfD0gVFNJTlRSX1NZU19XUkFQOwogCQllbHNlCiAJCQl0c2ltICY9IH5UU0lOVFJfU1lTX1dSQVA7CisJCWlnYi0+cHBzX3N5c193cmFwX29uID0gISFvbjsKIAkJd3IzMihFMTAwMF9UU0lNLCB0c2ltKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWdiLT50bXJlZ19sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwpAQCAtOTk4LDEyICs5OTksMTIgQEAKIAogCS8qIGRlZmluZSBldGhlcnR5cGUgZmlsdGVyIGZvciB0aW1lc3RhbXBlZCBwYWNrZXRzICovCiAJaWYgKGlzX2wyKQotCQl3cjMyKEUxMDAwX0VUUUYoMyksCisJCXdyMzIoRTEwMDBfRVRRRihJR0JfRVRRRl9GSUxURVJfMTU4OCksCiAJCSAgICAgKEUxMDAwX0VUUUZfRklMVEVSX0VOQUJMRSB8IC8qIGVuYWJsZSBmaWx0ZXIgKi8KIAkJICAgICAgRTEwMDBfRVRRRl8xNTg4IHwgLyogZW5hYmxlIHRpbWVzdGFtcGluZyAqLwogCQkgICAgICBFVEhfUF8xNTg4KSk7ICAgICAvKiAxNTg4IGV0aCBwcm90b2NvbCB0eXBlICovCiAJZWxzZQotCQl3cjMyKEUxMDAwX0VUUUYoMyksIDApOworCQl3cjMyKEUxMDAwX0VUUUYoSUdCX0VUUUZfRklMVEVSXzE1ODgpLCAwKTsKIAogCS8qIEw0IFF1ZXVlIEZpbHRlclszXTogZmlsdGVyIGJ5IGRlc3RpbmF0aW9uIHBvcnQgYW5kIHByb3RvY29sICovCiAJaWYgKGlzX2w0KSB7CkBAIC0xMTU5LDcgKzExNjAsNyBAQAogCWlmIChJU19FUlIoYWRhcHRlci0+cHRwX2Nsb2NrKSkgewogCQlhZGFwdGVyLT5wdHBfY2xvY2sgPSBOVUxMOwogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJwdHBfY2xvY2tfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAoYWRhcHRlci0+cHRwX2Nsb2NrKSB7CiAJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJhZGRlZCBQSEMgb24gJXNcbiIsCiAJCQkgYWRhcHRlci0+bmV0ZGV2LT5uYW1lKTsKIAkJYWRhcHRlci0+cHRwX2ZsYWdzIHw9IElHQl9QVFBfRU5BQkxFRDsKQEAgLTEyMzUsNyArMTIzNiw5IEBACiAJY2FzZSBlMTAwMF9pMjExOgogCQl3cjMyKEUxMDAwX1RTQVVYQywgMHgwKTsKIAkJd3IzMihFMTAwMF9UU1NEUCwgMHgwKTsKLQkJd3IzMihFMTAwMF9UU0lNLCBUU1lOQ19JTlRFUlJVUFRTKTsKKwkJd3IzMihFMTAwMF9UU0lNLAorCQkgICAgIFRTWU5DX0lOVEVSUlVQVFMgfAorCQkgICAgIChhZGFwdGVyLT5wcHNfc3lzX3dyYXBfb24gPyBUU0lOVFJfU1lTX1dSQVAgOiAwKSk7CiAJCXdyMzIoRTEwMDBfSU1TLCBFMTAwMF9JTVNfVFMpOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYwppbmRleCBiMDc3OGJhLi4xMmJiODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYwpAQCAtNDcsNyArNDcsNyBAQAogCiAjaW5jbHVkZSAiaWdidmYuaCIKIAotI2RlZmluZSBEUlZfVkVSU0lPTiAiMi4wLjItayIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjIuNC4wLWsiCiBjaGFyIGlnYnZmX2RyaXZlcl9uYW1lW10gPSAiaWdidmYiOwogY29uc3QgY2hhciBpZ2J2Zl9kcml2ZXJfdmVyc2lvbltdID0gRFJWX1ZFUlNJT047CiBzdGF0aWMgY29uc3QgY2hhciBpZ2J2Zl9kcml2ZXJfc3RyaW5nW10gPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlLmgKaW5kZXggOTQ3NWZmOS4uYjA2ZTMyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZS5oCkBAIC00NSwxMCArNDUsMTAgQEAKICNpbmNsdWRlICJpeGdiZV90eXBlLmgiCiAjaW5jbHVkZSAiaXhnYmVfY29tbW9uLmgiCiAjaW5jbHVkZSAiaXhnYmVfZGNiLmgiCi0jaWYgZGVmaW5lZChDT05GSUdfRkNPRSkgfHwgZGVmaW5lZChDT05GSUdfRkNPRV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfRkNPRSkKICNkZWZpbmUgSVhHQkVfRkNPRQogI2luY2x1ZGUgIml4Z2JlX2Zjb2UuaCIKLSNlbmRpZiAvKiBDT05GSUdfRkNPRSBvciBDT05GSUdfRkNPRV9NT0RVTEUgKi8KKyNlbmRpZiAvKiBJU19FTkFCTEVEKENPTkZJR19GQ09FKSAqLwogI2lmZGVmIENPTkZJR19JWEdCRV9EQ0EKICNpbmNsdWRlIDxsaW51eC9kY2EuaD4KICNlbmRpZgpAQCAtNjQ1LDYgKzY0NSw3IEBACiAjZGVmaW5lIElYR0JFX0ZMQUdfUlhfSFdUU1RBTVBfRU5BQkxFRAkJQklUKDI1KQogI2RlZmluZSBJWEdCRV9GTEFHX1JYX0hXVFNUQU1QX0lOX1JFR0lTVEVSCUJJVCgyNikKICNkZWZpbmUgSVhHQkVfRkxBR19EQ0JfQ0FQQUJMRQkJCUJJVCgyNykKKyNkZWZpbmUgSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFCUJJVCgyOCkKIAogCXUzMiBmbGFnczI7CiAjZGVmaW5lIElYR0JFX0ZMQUcyX1JTQ19DQVBBQkxFCQkJQklUKDApCkBAIC02NTMsMTMgKzY1NCwxMiBAQAogI2RlZmluZSBJWEdCRV9GTEFHMl9URU1QX1NFTlNPUl9FVkVOVAkJQklUKDMpCiAjZGVmaW5lIElYR0JFX0ZMQUcyX1NFQVJDSF9GT1JfU0ZQCQlCSVQoNCkKICNkZWZpbmUgSVhHQkVfRkxBRzJfU0ZQX05FRURTX1JFU0VUCQlCSVQoNSkKLSNkZWZpbmUgSVhHQkVfRkxBRzJfUkVTRVRfUkVRVUVTVEVECQlCSVQoNikKICNkZWZpbmUgSVhHQkVfRkxBRzJfRkRJUl9SRVFVSVJFU19SRUlOSVQJQklUKDcpCiAjZGVmaW5lIElYR0JFX0ZMQUcyX1JTU19GSUVMRF9JUFY0X1VEUAkJQklUKDgpCiAjZGVmaW5lIElYR0JFX0ZMQUcyX1JTU19GSUVMRF9JUFY2X1VEUAkJQklUKDkpCiAjZGVmaW5lIElYR0JFX0ZMQUcyX1BUUF9QUFNfRU5BQkxFRAkJQklUKDEwKQogI2RlZmluZSBJWEdCRV9GTEFHMl9QSFlfSU5URVJSVVBUCQlCSVQoMTEpCi0jZGVmaW5lIElYR0JFX0ZMQUcyX1ZYTEFOX1JFUkVHX05FRURFRAkJQklUKDEyKQorI2RlZmluZSBJWEdCRV9GTEFHMl9VRFBfVFVOX1JFUkVHX05FRURFRAlCSVQoMTIpCiAjZGVmaW5lIElYR0JFX0ZMQUcyX1ZMQU5fUFJPTUlTQwkJQklUKDEzKQogCiAJLyogVHggZmFzdCBwYXRoIGRhdGEgKi8KQEAgLTY3Myw2ICs2NzMsNyBAQAogCiAJLyogUG9ydCBudW1iZXIgdXNlZCB0byBpZGVudGlmeSBWWExBTiB0cmFmZmljICovCiAJX19iZTE2IHZ4bGFuX3BvcnQ7CisJX19iZTE2IGdlbmV2ZV9wb3J0OwogCiAJLyogVFggKi8KIAlzdHJ1Y3QgaXhnYmVfcmluZyAqdHhfcmluZ1tNQVhfVFhfUVVFVUVTXSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwpAQCAtODQwLDYgKzg0MSw3IEBACiAJX19JWEdCRV9JTl9TRlBfSU5JVCwKIAlfX0lYR0JFX1BUUF9SVU5OSU5HLAogCV9fSVhHQkVfUFRQX1RYX0lOX1BST0dSRVNTLAorCV9fSVhHQkVfUkVTRVRfUkVRVUVTVEVELAogfTsKIAogc3RydWN0IGl4Z2JlX2NiIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKaW5kZXggYjQyMTdmMy4uNzdkMzAzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMKQEAgLTk5LDYgKzk5LDcgQEAKIAkJY2FzZSBJWEdCRV9ERVZfSURfWDU1MFQ6CiAJCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBUMToKIAkJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX1hfMTBHX1Q6CisJCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9BXzEwR19UOgogCQkJc3VwcG9ydGVkID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtMjk1OCw4ICsyOTU5LDEwIEBACiAJfQogCiAJLyogd2FzIHRoYXQgdGhlIGxhc3QgcG9vbCB1c2luZyB0aGlzIHJhcj8gKi8KLQlpZiAobXBzYXJfbG8gPT0gMCAmJiBtcHNhcl9oaSA9PSAwICYmIHJhciAhPSAwKQorCWlmIChtcHNhcl9sbyA9PSAwICYmIG1wc2FyX2hpID09IDAgJiYKKwkgICAgcmFyICE9IDAgJiYgcmFyICE9IGh3LT5tYWMuc2FuX21hY19yYXJfaW5kZXgpCiAJCWh3LT5tYWMub3BzLmNsZWFyX3JhcihodywgcmFyKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9ldGh0b29sLmMKaW5kZXggMGQ3MjA5ZS4uZjQ5ZjgwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYwpAQCAtMTkzLDcgKzE5Myw5IEBACiAJaWYgKHN1cHBvcnRlZF9saW5rICYgSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEwpCiAJCWVjbWQtPnN1cHBvcnRlZCB8PSBpeGdiZV9nZXRfc3VwcG9ydGVkXzEwZ3R5cGVzKGh3KTsKIAlpZiAoc3VwcG9ydGVkX2xpbmsgJiBJWEdCRV9MSU5LX1NQRUVEXzFHQl9GVUxMKQotCQllY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCQllY21kLT5zdXBwb3J0ZWQgfD0gKGl4Z2JlX2lzYmFja3BsYW5lKGh3LT5waHkubWVkaWFfdHlwZSkpID8KKwkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsIDoKKwkJCQkgICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7CiAJaWYgKHN1cHBvcnRlZF9saW5rICYgSVhHQkVfTElOS19TUEVFRF8xMDBfRlVMTCkKIAkJZWNtZC0+c3VwcG9ydGVkIHw9IGl4Z2JlX2lzYmFja3BsYW5lKGh3LT5waHkubWVkaWFfdHlwZSkgPwogCQkJCSAgIFNVUFBPUlRFRF8xMDAwYmFzZUtYX0Z1bGwgOgpAQCAtMzExLDYgKzMxMywyNSBAQAogCQlicmVhazsKIAl9CiAKKwkvKiBJbmRpY2F0ZSBwYXVzZSBzdXBwb3J0ICovCisJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9QYXVzZTsKKworCXN3aXRjaCAoaHctPmZjLnJlcXVlc3RlZF9tb2RlKSB7CisJY2FzZSBpeGdiZV9mY19mdWxsOgorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlOworCQlicmVhazsKKwljYXNlIGl4Z2JlX2ZjX3J4X3BhdXNlOgorCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlIHwKKwkJCQkgICAgIEFEVkVSVElTRURfQXN5bV9QYXVzZTsKKwkJYnJlYWs7CisJY2FzZSBpeGdiZV9mY190eF9wYXVzZToKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF9Bc3ltX1BhdXNlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllY21kLT5hZHZlcnRpc2luZyAmPSB+KEFEVkVSVElTRURfUGF1c2UgfAorCQkJCSAgICAgICBBRFZFUlRJU0VEX0FzeW1fUGF1c2UpOworCX0KKwogCWlmIChuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKIAkJc3dpdGNoIChhZGFwdGVyLT5saW5rX3NwZWVkKSB7CiAJCWNhc2UgSVhHQkVfTElOS19TUEVFRF8xMEdCX0ZVTEw6CkBAIC0yOTI2LDkgKzI5NDcsMTMgQEAKIHN0YXRpYyB2b2lkIGl4Z2JlX2dldF9yZXRhKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgKmluZGlyKQogewogCWludCBpLCByZXRhX3NpemUgPSBpeGdiZV9yc3NfaW5kaXJfdGJsX2VudHJpZXMoYWRhcHRlcik7CisJdTE2IHJzc19tID0gYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLm1hc2s7CisKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQpCisJCXJzc19tID0gYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLmluZGljZXMgLSAxOwogCiAJZm9yIChpID0gMDsgaSA8IHJldGFfc2l6ZTsgaSsrKQotCQlpbmRpcltpXSA9IGFkYXB0ZXItPnJzc19pbmRpcl90YmxbaV07CisJCWluZGlyW2ldID0gYWRhcHRlci0+cnNzX2luZGlyX3RibFtpXSAmIHJzc19tOwogfQogCiBzdGF0aWMgaW50IGl4Z2JlX2dldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiAqaW5kaXIsIHU4ICprZXksCkBAIC0zMDM5LDggKzMwNjQsOCBAQAogCQkvKiBXZSBvbmx5IHN1cHBvcnQgb25lIHFfdmVjdG9yIHdpdGhvdXQgTVNJLVggKi8KIAkJbWF4X2NvbWJpbmVkID0gMTsKIAl9IGVsc2UgaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEKSB7Ci0JCS8qIFNSLUlPViBjdXJyZW50bHkgb25seSBhbGxvd3Mgb25lIHF1ZXVlIG9uIHRoZSBQRiAqLwotCQltYXhfY29tYmluZWQgPSAxOworCQkvKiBMaW1pdCB2YWx1ZSBiYXNlZCBvbiB0aGUgcXVldWUgbWFzayAqLworCQltYXhfY29tYmluZWQgPSBhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1JTU10ubWFzayArIDE7CiAJfSBlbHNlIGlmICh0Y3MgPiAxKSB7CiAJCS8qIEZvciBEQ0IgcmVwb3J0IGNoYW5uZWxzIHBlciB0cmFmZmljIGNsYXNzICovCiAJCWlmIChhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBpeGdiZV9tYWNfODI1OThFQikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbGliLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9saWIuYwppbmRleCBiY2RjODg0Li4xNWFiMzM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9saWIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9saWIuYwpAQCAtNTE1LDE1ICs1MTUsMTYgQEAKIAl2bWRxX2kgPSBtaW5fdCh1MTYsIElYR0JFX01BWF9WTURRX0lORElDRVMsIHZtZHFfaSk7CiAKIAkvKiA2NCBwb29sIG1vZGUgd2l0aCAyIHF1ZXVlcyBwZXIgcG9vbCAqLwotCWlmICgodm1kcV9pID4gMzIpIHx8IChyc3NfaSA8IDQpIHx8ICh2bWRxX2kgPiAxNiAmJiBwb29scykpIHsKKwlpZiAoKHZtZHFfaSA+IDMyKSB8fCAodm1kcV9pID4gMTYgJiYgcG9vbHMpKSB7CiAJCXZtZHFfbSA9IElYR0JFXzgyNTk5X1ZNRFFfMlFfTUFTSzsKIAkJcnNzX20gPSBJWEdCRV9SU1NfMlFfTUFTSzsKIAkJcnNzX2kgPSBtaW5fdCh1MTYsIHJzc19pLCAyKTsKLQkvKiAzMiBwb29sIG1vZGUgd2l0aCA0IHF1ZXVlcyBwZXIgcG9vbCAqLworCS8qIDMyIHBvb2wgbW9kZSB3aXRoIHVwIHRvIDQgcXVldWVzIHBlciBwb29sICovCiAJfSBlbHNlIHsKIAkJdm1kcV9tID0gSVhHQkVfODI1OTlfVk1EUV80UV9NQVNLOwogCQlyc3NfbSA9IElYR0JFX1JTU180UV9NQVNLOwotCQlyc3NfaSA9IDQ7CisJCS8qIFdlIGNhbiBzdXBwb3J0IDQsIDIsIG9yIDEgcXVldWVzICovCisJCXJzc19pID0gKHJzc19pID4gMykgPyA0IDogKHJzc19pID4gMSkgPyAyIDogMTsKIAl9CiAKICNpZmRlZiBJWEdCRV9GQ09FCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMKaW5kZXggYjRmMDM3NC4uYTI0NGQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYwpAQCAtMTM3LDYgKzEzNyw3IEBACiAJe1BDSV9WREVWSUNFKElOVEVMLCBJWEdCRV9ERVZfSURfWDU1MEVNX0FfU0ZQX04pLCBib2FyZF94NTUwZW1fYSB9LAogCXtQQ0lfVkRFVklDRShJTlRFTCwgSVhHQkVfREVWX0lEX1g1NTBFTV9BX1NHTUlJKSwgYm9hcmRfeDU1MGVtX2EgfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TR01JSV9MKSwgYm9hcmRfeDU1MGVtX2EgfSwKKwl7UENJX1ZERVZJQ0UoSU5URUwsIElYR0JFX0RFVl9JRF9YNTUwRU1fQV8xMEdfVCksIGJvYXJkX3g1NTBlbV9hfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TRlApLCBib2FyZF94NTUwZW1fYSB9LAogCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KIAl7MCwgfQpAQCAtMTEwMyw3ICsxMTA0LDcgQEAKIAogCS8qIERvIHRoZSByZXNldCBvdXRzaWRlIG9mIGludGVycnVwdCBjb250ZXh0ICovCiAJaWYgKCF0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpIHsKLQkJYWRhcHRlci0+ZmxhZ3MyIHw9IElYR0JFX0ZMQUcyX1JFU0VUX1JFUVVFU1RFRDsKKwkJc2V0X2JpdChfX0lYR0JFX1JFU0VUX1JFUVVFU1RFRCwgJmFkYXB0ZXItPnN0YXRlKTsKIAkJZV93YXJuKGRydiwgImluaXRpYXRpbmcgcmVzZXQgZHVlIHRvIHR4IHRpbWVvdXRcbiIpOwogCQlpeGdiZV9zZXJ2aWNlX2V2ZW50X3NjaGVkdWxlKGFkYXB0ZXIpOwogCX0KQEAgLTE0OTUsNyArMTQ5Niw2IEBACiAJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCV9fbGUxNiBwa3RfaW5mbyA9IHJ4X2Rlc2MtPndiLmxvd2VyLmxvX2R3b3JkLmhzX3Jzcy5wa3RfaW5mbzsKLQlfX2xlMTYgaGRyX2luZm8gPSByeF9kZXNjLT53Yi5sb3dlci5sb19kd29yZC5oc19yc3MuaGRyX2luZm87CiAJYm9vbCBlbmNhcF9wa3QgPSBmYWxzZTsKIAogCXNrYl9jaGVja3N1bV9ub25lX2Fzc2VydChza2IpOwpAQCAtMTUwNCw4ICsxNTA0LDggQEAKIAlpZiAoIShyaW5nLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pKQogCQlyZXR1cm47CiAKLQlpZiAoKHBrdF9pbmZvICYgY3B1X3RvX2xlMTYoSVhHQkVfUlhEQURWX1BLVFRZUEVfVlhMQU4pKSAmJgotCSAgICAoaGRyX2luZm8gJiBjcHVfdG9fbGUxNihJWEdCRV9SWERBRFZfUEtUVFlQRV9UVU5ORUwgPj4gMTYpKSkgeworCS8qIGNoZWNrIGZvciBWWExBTiBhbmQgR2VuZXZlIHBhY2tldHMgKi8KKwlpZiAocGt0X2luZm8gJiBjcHVfdG9fbGUxNihJWEdCRV9SWERBRFZfUEtUVFlQRV9WWExBTikpIHsKIAkJZW5jYXBfcGt0ID0gdHJ1ZTsKIAkJc2tiLT5lbmNhcHN1bGF0aW9uID0gMTsKIAl9CkBAIC0yNzc3LDcgKzI3NzcsNyBAQAogCQl9CiAJCWlmIChlaWNyICYgSVhHQkVfRUlDUl9FQ0MpIHsKIAkJCWVfaW5mbyhsaW5rLCAiUmVjZWl2ZWQgRUNDIEVyciwgaW5pdGlhdGluZyByZXNldFxuIik7Ci0JCQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfUkVTRVRfUkVRVUVTVEVEOworCQkJc2V0X2JpdChfX0lYR0JFX1JFU0VUX1JFUVVFU1RFRCwgJmFkYXB0ZXItPnN0YXRlKTsKIAkJCWl4Z2JlX3NlcnZpY2VfZXZlbnRfc2NoZWR1bGUoYWRhcHRlcik7CiAJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0VJQ1IsIElYR0JFX0VJQ1JfRUNDKTsKIAkJfQpAQCAtMzAwNyw3ICszMDA3LDcgQEAKIAljYXNlIGl4Z2JlX21hY194NTUwZW1fYToKIAkJaWYgKGVpY3IgJiBJWEdCRV9FSUNSX0VDQykgewogCQkJZV9pbmZvKGxpbmssICJSZWNlaXZlZCBFQ0MgRXJyLCBpbml0aWF0aW5nIHJlc2V0XG4iKTsKLQkJCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9SRVNFVF9SRVFVRVNURUQ7CisJCQlzZXRfYml0KF9fSVhHQkVfUkVTRVRfUkVRVUVTVEVELCAmYWRhcHRlci0+c3RhdGUpOwogCQkJaXhnYmVfc2VydmljZV9ldmVudF9zY2hlZHVsZShhZGFwdGVyKTsKIAkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRUlDUiwgSVhHQkVfRUlDUl9FQ0MpOwogCQl9CkBAIC0zMjI0LDcgKzMyMjQsNyBAQAogCQl0eGRjdGwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVFhEQ1RMKHJlZ19pZHgpKTsKIAl9IHdoaWxlICgtLXdhaXRfbG9vcCAmJiAhKHR4ZGN0bCAmIElYR0JFX1RYRENUTF9FTkFCTEUpKTsKIAlpZiAoIXdhaXRfbG9vcCkKLQkJZV9lcnIoZHJ2LCAiQ291bGQgbm90IGVuYWJsZSBUeCBRdWV1ZSAlZFxuIiwgcmVnX2lkeCk7CisJCWh3X2RiZyhodywgIkNvdWxkIG5vdCBlbmFibGUgVHggUXVldWUgJWRcbiIsIHJlZ19pZHgpOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9zZXR1cF9tdHFjKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQpAQCAtMzI0OCw3ICszMjQ4LDggQEAKIAkJCW10cWMgfD0gSVhHQkVfTVRRQ19SVF9FTkEgfCBJWEdCRV9NVFFDXzhUQ184VFE7CiAJCWVsc2UgaWYgKHRjcyA+IDEpCiAJCQltdHFjIHw9IElYR0JFX01UUUNfUlRfRU5BIHwgSVhHQkVfTVRRQ180VENfNFRROwotCQllbHNlIGlmIChhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1JTU10uaW5kaWNlcyA9PSA0KQorCQllbHNlIGlmIChhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1ZNRFFdLm1hc2sgPT0KKwkJCSBJWEdCRV84MjU5OV9WTURRXzRRX01BU0spCiAJCQltdHFjIHw9IElYR0JFX01UUUNfMzJWRjsKIAkJZWxzZQogCQkJbXRxYyB8PSBJWEdCRV9NVFFDXzY0VkY7CkBAIC0zNDc1LDEyICszNDc2LDEyIEBACiAJdTMyIHJldGFfZW50cmllcyA9IGl4Z2JlX3Jzc19pbmRpcl90YmxfZW50cmllcyhhZGFwdGVyKTsKIAl1MTYgcnNzX2kgPSBhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1JTU10uaW5kaWNlczsKIAotCS8qIFByb2dyYW0gdGFibGUgZm9yIGF0IGxlYXN0IDIgcXVldWVzIHcvIFNSLUlPViBzbyB0aGF0IFZGcyBjYW4KKwkvKiBQcm9ncmFtIHRhYmxlIGZvciBhdCBsZWFzdCA0IHF1ZXVlcyB3LyBTUi1JT1Ygc28gdGhhdCBWRnMgY2FuCiAJICogbWFrZSBmdWxsIHVzZSBvZiBhbnkgcmluZ3MgdGhleSBtYXkgaGF2ZS4gIFdlIHdpbGwgdXNlIHRoZQogCSAqIFBTUlRZUEUgcmVnaXN0ZXIgdG8gY29udHJvbCBob3cgbWFueSByaW5ncyB3ZSB1c2Ugd2l0aGluIHRoZSBQRi4KIAkgKi8KLQlpZiAoKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEKSAmJiAocnNzX2kgPCAyKSkKLQkJcnNzX2kgPSAyOworCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQpICYmIChyc3NfaSA8IDQpKQorCQlyc3NfaSA9IDQ7CiAKIAkvKiBGaWxsIG91dCBoYXNoIGZ1bmN0aW9uIHNlZWRzICovCiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCkBAIC0zNTQ0LDcgKzM1NDUsOCBAQAogCQkJCW1ycWMgPSBJWEdCRV9NUlFDX1ZNRFFSVDhUQ0VOOwkvKiA4IFRDcyAqLwogCQkJZWxzZSBpZiAodGNzID4gMSkKIAkJCQltcnFjID0gSVhHQkVfTVJRQ19WTURRUlQ0VENFTjsJLyogNCBUQ3MgKi8KLQkJCWVsc2UgaWYgKGFkYXB0ZXItPnJpbmdfZmVhdHVyZVtSSU5HX0ZfUlNTXS5pbmRpY2VzID09IDQpCisJCQllbHNlIGlmIChhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1ZNRFFdLm1hc2sgPT0KKwkJCQkgSVhHQkVfODI1OTlfVk1EUV80UV9NQVNLKQogCQkJCW1ycWMgPSBJWEdCRV9NUlFDX1ZNRFFSU1MzMkVOOwogCQkJZWxzZQogCQkJCW1ycWMgPSBJWEdCRV9NUlFDX1ZNRFFSU1M2NEVOOwpAQCAtMzkyMiw2ICszOTI0LDkgQEAKIAlyZmN0bCAmPSB+SVhHQkVfUkZDVExfUlNDX0RJUzsKIAlpZiAoIShhZGFwdGVyLT5mbGFnczIgJiBJWEdCRV9GTEFHMl9SU0NfRU5BQkxFRCkpCiAJCXJmY3RsIHw9IElYR0JFX1JGQ1RMX1JTQ19ESVM7CisKKwkvKiBkaXNhYmxlIE5GUyBmaWx0ZXJpbmcgKi8KKwlyZmN0bCB8PSAoSVhHQkVfUkZDVExfTkZTV19ESVMgfCBJWEdCRV9SRkNUTF9ORlNSX0RJUyk7CiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SRkNUTCwgcmZjdGwpOwogCiAJLyogUHJvZ3JhbSByZWdpc3RlcnMgZm9yIHRoZSBkaXN0cmlidXRpb24gb2YgcXVldWVzICovCkBAIC00MTAyLDIzICs0MTA3LDIwIEBACiAKIAl2bG5jdHJsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZMTkNUUkwpOwogCi0Jc3dpdGNoIChody0+bWFjLnR5cGUpIHsKLQljYXNlIGl4Z2JlX21hY184MjU5OUVCOgotCWNhc2UgaXhnYmVfbWFjX1g1NDA6Ci0JY2FzZSBpeGdiZV9tYWNfWDU1MDoKLQljYXNlIGl4Z2JlX21hY19YNTUwRU1feDoKLQljYXNlIGl4Z2JlX21hY194NTUwZW1fYToKLQlkZWZhdWx0OgotCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1ZNRFFfRU5BQkxFRCkKLQkJCWJyZWFrOwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIGl4Z2JlX21hY184MjU5OEVCOgotCQkvKiBsZWdhY3kgY2FzZSwgd2UgY2FuIGp1c3QgZGlzYWJsZSBWTEFOIGZpbHRlcmluZyAqLworCWlmIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVk1EUV9FTkFCTEVEKSB7CisJLyogRm9yIFZNRHEgYW5kIFNSLUlPViB3ZSBtdXN0IGxlYXZlIFZMQU4gZmlsdGVyaW5nIGVuYWJsZWQgKi8KKwkJdmxuY3RybCB8PSBJWEdCRV9WTE5DVFJMX1ZGRTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WTE5DVFJMLCB2bG5jdHJsKTsKKwl9IGVsc2UgewogCQl2bG5jdHJsICY9IH5JWEdCRV9WTE5DVFJMX1ZGRTsKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WTE5DVFJMLCB2bG5jdHJsKTsKIAkJcmV0dXJuOwogCX0KIAorCS8qIE5vdGhpbmcgdG8gZG8gZm9yIDgyNTk4ICovCisJaWYgKGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfODI1OThFQikKKwkJcmV0dXJuOworCiAJLyogV2UgYXJlIGFscmVhZHkgaW4gVkxBTiBwcm9taXNjLCBub3RoaW5nIHRvIGRvICovCiAJaWYgKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1ZMQU5fUFJPTUlTQykKIAkJcmV0dXJuOwpAQCAtNDEyNiwxMCArNDEyOCw2IEBACiAJLyogU2V0IGZsYWcgc28gd2UgZG9uJ3QgcmVkbyB1bm5lY2Vzc2FyeSB3b3JrICovCiAJYWRhcHRlci0+ZmxhZ3MyIHw9IElYR0JFX0ZMQUcyX1ZMQU5fUFJPTUlTQzsKIAotCS8qIEZvciBWTURxIGFuZCBTUi1JT1Ygd2UgbXVzdCBsZWF2ZSBWTEFOIGZpbHRlcmluZyBlbmFibGVkICovCi0JdmxuY3RybCB8PSBJWEdCRV9WTE5DVFJMX1ZGRTsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZMTkNUUkwsIHZsbmN0cmwpOwotCiAJLyogQWRkIFBGIHRvIGFsbCBhY3RpdmUgcG9vbHMgKi8KIAlmb3IgKGkgPSBJWEdCRV9WTFZGX0VOVFJJRVM7IC0taTspIHsKIAkJdTMyIHJlZ19vZmZzZXQgPSBJWEdCRV9WTFZGQihpICogMiArIFZNRFFfUCgwKSAvIDMyKTsKQEAgLTQyMDEsMTkgKzQxOTksOSBAQAogCXZsbmN0cmwgfD0gSVhHQkVfVkxOQ1RSTF9WRkU7CiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WTE5DVFJMLCB2bG5jdHJsKTsKIAotCXN3aXRjaCAoaHctPm1hYy50eXBlKSB7Ci0JY2FzZSBpeGdiZV9tYWNfODI1OTlFQjoKLQljYXNlIGl4Z2JlX21hY19YNTQwOgotCWNhc2UgaXhnYmVfbWFjX1g1NTA6Ci0JY2FzZSBpeGdiZV9tYWNfWDU1MEVNX3g6Ci0JY2FzZSBpeGdiZV9tYWNfeDU1MGVtX2E6Ci0JZGVmYXVsdDoKLQkJaWYgKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19WTURRX0VOQUJMRUQpCi0JCQlicmVhazsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JY2FzZSBpeGdiZV9tYWNfODI1OThFQjoKKwlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVk1EUV9FTkFCTEVEKSB8fAorCSAgICBody0+bWFjLnR5cGUgPT0gaXhnYmVfbWFjXzgyNTk4RUIpCiAJCXJldHVybjsKLQl9CiAKIAkvKiBXZSBhcmUgbm90IGluIFZMQU4gcHJvbWlzYywgbm90aGluZyB0byBkbyAqLwogCWlmICghKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1ZMQU5fUFJPTUlTQykpCkBAIC00NTg2LDE4ICs0NTc0LDIzIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpeGdiZV9jbGVhcl92eGxhbl9wb3J0KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIHZvaWQgaXhnYmVfY2xlYXJfdWRwX3R1bm5lbF9wb3J0KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgbWFzaykKIHsKLQlzd2l0Y2ggKGFkYXB0ZXItPmh3Lm1hYy50eXBlKSB7Ci0JY2FzZSBpeGdiZV9tYWNfWDU1MDoKLQljYXNlIGl4Z2JlX21hY19YNTUwRU1feDoKLQljYXNlIGl4Z2JlX21hY194NTUwZW1fYToKLQkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfVlhMQU5DVFJMLCAwKTsKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiB2eGxhbmN0cmw7CisKKwlpZiAoIShhZGFwdGVyLT5mbGFncyAmIChJWEdCRV9GTEFHX1ZYTEFOX09GRkxPQURfQ0FQQUJMRSB8CisJCQkJSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFKSkpCisJCXJldHVybjsKKworCXZ4bGFuY3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9WWExBTkNUUkwpICYmIH5tYXNrOworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVlhMQU5DVFJMLCB2eGxhbmN0cmwpOworCisJaWYgKG1hc2sgJiBJWEdCRV9WWExBTkNUUkxfVlhMQU5fVURQUE9SVF9NQVNLKQogCQlhZGFwdGVyLT52eGxhbl9wb3J0ID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorCisJaWYgKG1hc2sgJiBJWEdCRV9WWExBTkNUUkxfR0VORVZFX1VEUFBPUlRfTUFTSykKKwkJYWRhcHRlci0+Z2VuZXZlX3BvcnQgPSAwOwogfQogCiAjaWZkZWYgQ09ORklHX0lYR0JFX0RDQgpAQCAtNTUwMCw4ICs1NDkzLDggQEAKIAogCWl4Z2JlX25hcGlfZGlzYWJsZV9hbGwoYWRhcHRlcik7CiAKLQlhZGFwdGVyLT5mbGFnczIgJj0gfihJWEdCRV9GTEFHMl9GRElSX1JFUVVJUkVTX1JFSU5JVCB8Ci0JCQkgICAgIElYR0JFX0ZMQUcyX1JFU0VUX1JFUVVFU1RFRCk7CisJY2xlYXJfYml0KF9fSVhHQkVfUkVTRVRfUkVRVUVTVEVELCAmYWRhcHRlci0+c3RhdGUpOworCWFkYXB0ZXItPmZsYWdzMiAmPSB+SVhHQkVfRkxBRzJfRkRJUl9SRVFVSVJFU19SRUlOSVQ7CiAJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfTkVFRF9MSU5LX1VQREFURTsKIAogCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5zZXJ2aWNlX3RpbWVyKTsKQEAgLTU3MTEsOCArNTcwNCwxMCBAQAogCQlpZiAoZndzbSAmIElYR0JFX0ZXU01fVFNfRU5BQkxFRCkKIAkJCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9URU1QX1NFTlNPUl9DQVBBQkxFOwogCQlicmVhazsKLQljYXNlIGl4Z2JlX21hY19YNTUwRU1feDoKIAljYXNlIGl4Z2JlX21hY194NTUwZW1fYToKKwkJYWRhcHRlci0+ZmxhZ3MgfD0gSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFOworCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgaXhnYmVfbWFjX1g1NTBFTV94OgogI2lmZGVmIENPTkZJR19JWEdCRV9EQ0IKIAkJYWRhcHRlci0+ZmxhZ3MgJj0gfklYR0JFX0ZMQUdfRENCX0NBUEFCTEU7CiAjZW5kaWYKQEAgLTYxNDQsNyArNjEzOSw3IEBACiAKIAlpeGdiZV91cF9jb21wbGV0ZShhZGFwdGVyKTsKIAotCWl4Z2JlX2NsZWFyX3Z4bGFuX3BvcnQoYWRhcHRlcik7CisJaXhnYmVfY2xlYXJfdWRwX3R1bm5lbF9wb3J0KGFkYXB0ZXIsIElYR0JFX1ZYTEFOQ1RSTF9BTExfVURQUE9SVF9NQVNLKTsKIAl1ZHBfdHVubmVsX2dldF9yeF9pbmZvKG5ldGRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTY5MjEsNyArNjkxNiw3IEBACiAJCQkgKiAoRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQpLgogCQkJICovCiAJCQllX3dhcm4oZHJ2LCAiaW5pdGlhdGluZyByZXNldCB0byBjbGVhciBUeCB3b3JrIGFmdGVyIGxpbmsgbG9zc1xuIik7Ci0JCQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfUkVTRVRfUkVRVUVTVEVEOworCQkJc2V0X2JpdChfX0lYR0JFX1JFU0VUX1JFUVVFU1RFRCwgJmFkYXB0ZXItPnN0YXRlKTsKIAkJfQogCX0KIH0KQEAgLTcxODcsMTEgKzcxODIsOSBAQAogCiBzdGF0aWMgdm9pZCBpeGdiZV9yZXNldF9zdWJ0YXNrKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewotCWlmICghKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1JFU0VUX1JFUVVFU1RFRCkpCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoX19JWEdCRV9SRVNFVF9SRVFVRVNURUQsICZhZGFwdGVyLT5zdGF0ZSkpCiAJCXJldHVybjsKIAotCWFkYXB0ZXItPmZsYWdzMiAmPSB+SVhHQkVfRkxBRzJfUkVTRVRfUkVRVUVTVEVEOwotCiAJLyogSWYgd2UncmUgYWxyZWFkeSBkb3duLCByZW1vdmluZyBvciByZXNldHRpbmcsIGp1c3QgYmFpbCAqLwogCWlmICh0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkgfHwKIAkgICAgdGVzdF9iaXQoX19JWEdCRV9SRU1PVklORywgJmFkYXB0ZXItPnN0YXRlKSB8fApAQCAtNzIyNSw5ICs3MjE4LDkgQEAKIAkJaXhnYmVfc2VydmljZV9ldmVudF9jb21wbGV0ZShhZGFwdGVyKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAoYWRhcHRlci0+ZmxhZ3MyICYgSVhHQkVfRkxBRzJfVlhMQU5fUkVSRUdfTkVFREVEKSB7CisJaWYgKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX1VEUF9UVU5fUkVSRUdfTkVFREVEKSB7CiAJCXJ0bmxfbG9jaygpOwotCQlhZGFwdGVyLT5mbGFnczIgJj0gfklYR0JFX0ZMQUcyX1ZYTEFOX1JFUkVHX05FRURFRDsKKwkJYWRhcHRlci0+ZmxhZ3MyICY9IH5JWEdCRV9GTEFHMl9VRFBfVFVOX1JFUkVHX05FRURFRDsKIAkJdWRwX3R1bm5lbF9nZXRfcnhfaW5mbyhhZGFwdGVyLT5uZXRkZXYpOwogCQlydG5sX3VubG9jaygpOwogCX0KQEAgLTc2NjcsNiArNzY2MCwxMCBAQAogCQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCAmJgogCQkgICAgdWRwX2hkcihza2IpLT5kZXN0ID09IGFkYXB0ZXItPnZ4bGFuX3BvcnQpCiAJCQloZHIubmV0d29yayA9IHNrYl9pbm5lcl9uZXR3b3JrX2hlYWRlcihza2IpOworCisJCWlmIChhZGFwdGVyLT5nZW5ldmVfcG9ydCAmJgorCQkgICAgdWRwX2hkcihza2IpLT5kZXN0ID09IGFkYXB0ZXItPmdlbmV2ZV9wb3J0KQorCQkJaGRyLm5ldHdvcmsgPSBza2JfaW5uZXJfbmV0d29ya19oZWFkZXIoc2tiKTsKIAl9CiAKIAkvKiBDdXJyZW50bHkgb25seSBJUHY0L0lQdjYgd2l0aCBUQ1AgaXMgc3VwcG9ydGVkICovCkBAIC04ODAyLDEwICs4Nzk5LDIzIEBACiAJbmV0ZGV2LT5mZWF0dXJlcyA9IGZlYXR1cmVzOwogCiAJaWYgKChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVlhMQU5fT0ZGTE9BRF9DQVBBQkxFKSkgewotCQlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkKLQkJCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9WWExBTl9SRVJFR19ORUVERUQ7Ci0JCWVsc2UKLQkJCWl4Z2JlX2NsZWFyX3Z4bGFuX3BvcnQoYWRhcHRlcik7CisJCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKSB7CisJCQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfVURQX1RVTl9SRVJFR19ORUVERUQ7CisJCX0gZWxzZSB7CisJCQl1MzIgcG9ydF9tYXNrID0gSVhHQkVfVlhMQU5DVFJMX1ZYTEFOX1VEUFBPUlRfTUFTSzsKKworCQkJaXhnYmVfY2xlYXJfdWRwX3R1bm5lbF9wb3J0KGFkYXB0ZXIsIHBvcnRfbWFzayk7CisJCX0KKwl9CisKKwlpZiAoKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFKSkgeworCQlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkgeworCQkJYWRhcHRlci0+ZmxhZ3MyIHw9IElYR0JFX0ZMQUcyX1VEUF9UVU5fUkVSRUdfTkVFREVEOworCQl9IGVsc2UgeworCQkJdTMyIHBvcnRfbWFzayA9IElYR0JFX1ZYTEFOQ1RSTF9HRU5FVkVfVURQUE9SVF9NQVNLOworCisJCQlpeGdiZV9jbGVhcl91ZHBfdHVubmVsX3BvcnQoYWRhcHRlciwgcG9ydF9tYXNrKTsKKwkJfQogCX0KIAogCWlmIChuZWVkX3Jlc2V0KQpAQCAtODgxOCw2NyArODgyOCwxMTUgQEAKIH0KIAogLyoqCi0gKiBpeGdiZV9hZGRfdnhsYW5fcG9ydCAtIEdldCBub3RpZmljYXRpb25zIGFib3V0IFZYTEFOIHBvcnRzIHRoYXQgY29tZSB1cAorICogaXhnYmVfYWRkX3VkcF90dW5uZWxfcG9ydCAtIEdldCBub3RpZmljYXRpb25zIGFib3V0IGFkZGluZyBVRFAgdHVubmVsIHBvcnRzCiAgKiBAZGV2OiBUaGUgcG9ydCdzIG5ldGRldgogICogQHRpOiBUdW5uZWwgZW5kcG9pbnQgaW5mb3JtYXRpb24KICAqKi8KLXN0YXRpYyB2b2lkIGl4Z2JlX2FkZF92eGxhbl9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCB1ZHBfdHVubmVsX2luZm8gKnRpKQorc3RhdGljIHZvaWQgaXhnYmVfYWRkX3VkcF90dW5uZWxfcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCB1ZHBfdHVubmVsX2luZm8gKnRpKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCV9fYmUxNiBwb3J0ID0gdGktPnBvcnQ7Ci0KLQlpZiAodGktPnR5cGUgIT0gVURQX1RVTk5FTF9UWVBFX1ZYTEFOKQotCQlyZXR1cm47CisJdTMyIHBvcnRfc2hpZnQgPSAwOworCXUzMiByZWc7CiAKIAlpZiAodGktPnNhX2ZhbWlseSAhPSBBRl9JTkVUKQogCQlyZXR1cm47CiAKLQlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVlhMQU5fT0ZGTE9BRF9DQVBBQkxFKSkKLQkJcmV0dXJuOworCXN3aXRjaCAodGktPnR5cGUpIHsKKwljYXNlIFVEUF9UVU5ORUxfVFlQRV9WWExBTjoKKwkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1ZYTEFOX09GRkxPQURfQ0FQQUJMRSkpCisJCQlyZXR1cm47CiAKLQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCA9PSBwb3J0KQotCQlyZXR1cm47CisJCWlmIChhZGFwdGVyLT52eGxhbl9wb3J0ID09IHBvcnQpCisJCQlyZXR1cm47CiAKLQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCkgewotCQluZXRkZXZfaW5mbyhkZXYsCi0JCQkgICAgIkhpdCBNYXggbnVtIG9mIFZYTEFOIHBvcnRzLCBub3QgYWRkaW5nIHBvcnQgJWRcbiIsCi0JCQkgICAgbnRvaHMocG9ydCkpOworCQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCkgeworCQkJbmV0ZGV2X2luZm8oZGV2LAorCQkJCSAgICAiVlhMQU4gcG9ydCAlZCBzZXQsIG5vdCBhZGRpbmcgcG9ydCAlZFxuIiwKKwkJCQkgICAgbnRvaHMoYWRhcHRlci0+dnhsYW5fcG9ydCksCisJCQkJICAgIG50b2hzKHBvcnQpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWFkYXB0ZXItPnZ4bGFuX3BvcnQgPSBwb3J0OworCQlicmVhazsKKwljYXNlIFVEUF9UVU5ORUxfVFlQRV9HRU5FVkU6CisJCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFKSkKKwkJCXJldHVybjsKKworCQlpZiAoYWRhcHRlci0+Z2VuZXZlX3BvcnQgPT0gcG9ydCkKKwkJCXJldHVybjsKKworCQlpZiAoYWRhcHRlci0+Z2VuZXZlX3BvcnQpIHsKKwkJCW5ldGRldl9pbmZvKGRldiwKKwkJCQkgICAgIkdFTkVWRSBwb3J0ICVkIHNldCwgbm90IGFkZGluZyBwb3J0ICVkXG4iLAorCQkJCSAgICBudG9ocyhhZGFwdGVyLT5nZW5ldmVfcG9ydCksCisJCQkJICAgIG50b2hzKHBvcnQpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBvcnRfc2hpZnQgPSBJWEdCRV9WWExBTkNUUkxfR0VORVZFX1VEUFBPUlRfU0hJRlQ7CisJCWFkYXB0ZXItPmdlbmV2ZV9wb3J0ID0gcG9ydDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcmV0dXJuOwogCX0KIAotCWFkYXB0ZXItPnZ4bGFuX3BvcnQgPSBwb3J0OwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVlhMQU5DVFJMLCBudG9ocyhwb3J0KSk7CisJcmVnID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZYTEFOQ1RSTCkgfCBudG9ocyhwb3J0KSA8PCBwb3J0X3NoaWZ0OworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVlhMQU5DVFJMLCByZWcpOwogfQogCiAvKioKLSAqIGl4Z2JlX2RlbF92eGxhbl9wb3J0IC0gR2V0IG5vdGlmaWNhdGlvbnMgYWJvdXQgVlhMQU4gcG9ydHMgdGhhdCBnbyBhd2F5CisgKiBpeGdiZV9kZWxfdWRwX3R1bm5lbF9wb3J0IC0gR2V0IG5vdGlmaWNhdGlvbnMgYWJvdXQgcmVtb3ZpbmcgVURQIHR1bm5lbCBwb3J0cwogICogQGRldjogVGhlIHBvcnQncyBuZXRkZXYKICAqIEB0aTogVHVubmVsIGVuZHBvaW50IGluZm9ybWF0aW9uCiAgKiovCi1zdGF0aWMgdm9pZCBpeGdiZV9kZWxfdnhsYW5fcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKK3N0YXRpYyB2b2lkIGl4Z2JlX2RlbF91ZHBfdHVubmVsX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgdWRwX3R1bm5lbF9pbmZvICp0aSkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIHBvcnRfbWFzazsKIAotCWlmICh0aS0+dHlwZSAhPSBVRFBfVFVOTkVMX1RZUEVfVlhMQU4pCisJaWYgKHRpLT50eXBlICE9IFVEUF9UVU5ORUxfVFlQRV9WWExBTiAmJgorCSAgICB0aS0+dHlwZSAhPSBVRFBfVFVOTkVMX1RZUEVfR0VORVZFKQogCQlyZXR1cm47CiAKIAlpZiAodGktPnNhX2ZhbWlseSAhPSBBRl9JTkVUKQogCQlyZXR1cm47CiAKLQlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfVlhMQU5fT0ZGTE9BRF9DQVBBQkxFKSkKLQkJcmV0dXJuOworCXN3aXRjaCAodGktPnR5cGUpIHsKKwljYXNlIFVEUF9UVU5ORUxfVFlQRV9WWExBTjoKKwkJaWYgKCEoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1ZYTEFOX09GRkxPQURfQ0FQQUJMRSkpCisJCQlyZXR1cm47CiAKLQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCAhPSB0aS0+cG9ydCkgewotCQluZXRkZXZfaW5mbyhkZXYsICJQb3J0ICVkIHdhcyBub3QgZm91bmQsIG5vdCBkZWxldGluZ1xuIiwKLQkJCSAgICBudG9ocyh0aS0+cG9ydCkpOworCQlpZiAoYWRhcHRlci0+dnhsYW5fcG9ydCAhPSB0aS0+cG9ydCkgeworCQkJbmV0ZGV2X2luZm8oZGV2LCAiVlhMQU4gcG9ydCAlZCBub3QgZm91bmRcbiIsCisJCQkJICAgIG50b2hzKHRpLT5wb3J0KSk7CisJCQlyZXR1cm47CisJCX0KKworCQlwb3J0X21hc2sgPSBJWEdCRV9WWExBTkNUUkxfVlhMQU5fVURQUE9SVF9NQVNLOworCQlicmVhazsKKwljYXNlIFVEUF9UVU5ORUxfVFlQRV9HRU5FVkU6CisJCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19HRU5FVkVfT0ZGTE9BRF9DQVBBQkxFKSkKKwkJCXJldHVybjsKKworCQlpZiAoYWRhcHRlci0+Z2VuZXZlX3BvcnQgIT0gdGktPnBvcnQpIHsKKwkJCW5ldGRldl9pbmZvKGRldiwgIkdFTkVWRSBwb3J0ICVkIG5vdCBmb3VuZFxuIiwKKwkJCQkgICAgbnRvaHModGktPnBvcnQpKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXBvcnRfbWFzayA9IElYR0JFX1ZYTEFOQ1RSTF9HRU5FVkVfVURQUE9SVF9NQVNLOworCQlicmVhazsKKwlkZWZhdWx0OgogCQlyZXR1cm47CiAJfQogCi0JaXhnYmVfY2xlYXJfdnhsYW5fcG9ydChhZGFwdGVyKTsKLQlhZGFwdGVyLT5mbGFnczIgfD0gSVhHQkVfRkxBRzJfVlhMQU5fUkVSRUdfTkVFREVEOworCWl4Z2JlX2NsZWFyX3VkcF90dW5uZWxfcG9ydChhZGFwdGVyLCBwb3J0X21hc2spOworCWFkYXB0ZXItPmZsYWdzMiB8PSBJWEdCRV9GTEFHMl9VRFBfVFVOX1JFUkVHX05FRURFRDsKIH0KIAogc3RhdGljIGludCBpeGdiZV9uZG9fZmRiX2FkZChzdHJ1Y3QgbmRtc2cgKm5kbSwgc3RydWN0IG5sYXR0ciAqdGJbXSwKQEAgLTkxOTIsOCArOTI1MCw4IEBACiAJLm5kb19icmlkZ2VfZ2V0bGluawk9IGl4Z2JlX25kb19icmlkZ2VfZ2V0bGluaywKIAkubmRvX2Rmd2RfYWRkX3N0YXRpb24JPSBpeGdiZV9md2RfYWRkLAogCS5uZG9fZGZ3ZF9kZWxfc3RhdGlvbgk9IGl4Z2JlX2Z3ZF9kZWwsCi0JLm5kb191ZHBfdHVubmVsX2FkZAk9IGl4Z2JlX2FkZF92eGxhbl9wb3J0LAotCS5uZG9fdWRwX3R1bm5lbF9kZWwJPSBpeGdiZV9kZWxfdnhsYW5fcG9ydCwKKwkubmRvX3VkcF90dW5uZWxfYWRkCT0gaXhnYmVfYWRkX3VkcF90dW5uZWxfcG9ydCwKKwkubmRvX3VkcF90dW5uZWxfZGVsCT0gaXhnYmVfZGVsX3VkcF90dW5uZWxfcG9ydCwKIAkubmRvX2ZlYXR1cmVzX2NoZWNrCT0gaXhnYmVfZmVhdHVyZXNfY2hlY2ssCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9waHkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3BoeS5jCmluZGV4IGRiMDczMWUuLjAyMWFiOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3BoeS5jCkBAIC0zNDYsOCArMzQ2LDggQEAKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQotCQkvKiBjbGVhciB2YWx1ZSBpZiBub3RoaW5nIGZvdW5kICovCi0JCWh3LT5waHkubWRpby5wcnRhZCA9IDA7CisJCS8qIGluZGljYXRlIG5vIFBIWSBmb3VuZCAqLworCQlody0+cGh5Lm1kaW8ucHJ0YWQgPSBNRElPX1BSVEFEX05PTkU7CiAJCXJldHVybiBJWEdCRV9FUlJfUEhZX0FERFJfSU5WQUxJRDsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3B0cC5jCmluZGV4IGU1NDMxYmYuLmE5MjI3NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3B0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3B0cC5jCkBAIC0xMjU0LDcgKzEyNTQsNyBAQAogCQlhZGFwdGVyLT5wdHBfY2xvY2sgPSBOVUxMOwogCQllX2Rldl9lcnIoInB0cF9jbG9ja19yZWdpc3RlciBmYWlsZWRcbiIpOwogCQlyZXR1cm4gZXJyOwotCX0gZWxzZQorCX0gZWxzZSBpZiAoYWRhcHRlci0+cHRwX2Nsb2NrKQogCQllX2Rldl9pbmZvKCJyZWdpc3RlcmVkIFBIQyBkZXZpY2Ugb24gJXNcbiIsIG5ldGRldi0+bmFtZSk7CiAKIAkvKiBzZXQgZGVmYXVsdCB0aW1lc3RhbXAgbW9kZSB0byBkaXNhYmxlZCBoZXJlLiBXZSBkbyB0aGlzIGluCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuYwppbmRleCA4NjE4NTk5Li43ZTVkOTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmMKQEAgLTMyOSwxMyArMzI5LDE1IEBACiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV92ZnM7IGkrKykKIAkJaXhnYmVfdmZfY29uZmlndXJhdGlvbihkZXYsIChpIHwgMHgxMDAwMDAwMCkpOwogCisJLyogcmVzZXQgYmVmb3JlIGVuYWJsaW5nIFNSSU9WIHRvIGF2b2lkIG1haWxib3ggaXNzdWVzICovCisJaXhnYmVfc3Jpb3ZfcmVpbml0KGFkYXB0ZXIpOworCiAJZXJyID0gcGNpX2VuYWJsZV9zcmlvdihkZXYsIG51bV92ZnMpOwogCWlmIChlcnIpIHsKIAkJZV9kZXZfd2FybigiRmFpbGVkIHRvIGVuYWJsZSBQQ0kgc3Jpb3Y6ICVkXG4iLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlpeGdiZV9nZXRfdmZzKGFkYXB0ZXIpOwotCWl4Z2JlX3NyaW92X3JlaW5pdChhZGFwdGVyKTsKIAogCXJldHVybiBudW1fdmZzOwogI2Vsc2UKQEAgLTEzNTQsMTMgKzEzNTYsMTYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgaXhnYmVfbmRvX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcykKK2ludCBpeGdiZV9uZG9fc2V0X3ZmX3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCB1MTYgdmxhbiwKKwkJCSAgdTggcW9zLCBfX2JlMTYgdmxhbl9wcm90bykKIHsKIAlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlpZiAoKHZmID49IGFkYXB0ZXItPm51bV92ZnMpIHx8ICh2bGFuID4gNDA5NSkgfHwgKHFvcyA+IDcpKQogCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOwogCWlmICh2bGFuIHx8IHFvcykgewogCQkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgcG9ydCBWTEFOIHNldCwgaWYgc28KIAkJICogd2UgaGF2ZSB0byBkZWxldGUgdGhlIG9sZCBvbmUgZmlyc3QgYmVmb3JlIHdlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuaAppbmRleCA0N2U2NWUyLi4wYzc5NzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmgKQEAgLTQzLDcgKzQzLDcgQEAKIHZvaWQgaXhnYmVfcGluZ19hbGxfdmZzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKIGludCBpeGdiZV9uZG9fc2V0X3ZmX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcXVldWUsIHU4ICptYWMpOwogaW50IGl4Z2JlX25kb19zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcXVldWUsIHUxNiB2bGFuLAotCQkJICAgdTggcW9zKTsKKwkJCSAgIHU4IHFvcywgX19iZTE2IHZsYW5fcHJvdG8pOwogaW50IGl4Z2JlX2xpbmtfbWJwcyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgaXhnYmVfbmRvX3NldF92Zl9idyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsIGludCBtaW5fdHhfcmF0ZSwKIAkJCWludCBtYXhfdHhfcmF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV90eXBlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV90eXBlLmgKaW5kZXggMTI0OGE5OS4uMzFkODJlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfdHlwZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3R5cGUuaApAQCAtOTAsNiArOTAsNyBAQAogI2RlZmluZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfU0ZQX04JMHgxNUM0CiAjZGVmaW5lIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TR01JSQkweDE1QzYKICNkZWZpbmUgSVhHQkVfREVWX0lEX1g1NTBFTV9BX1NHTUlJX0wJMHgxNUM3CisjZGVmaW5lIElYR0JFX0RFVl9JRF9YNTUwRU1fQV8xMEdfVAkweDE1QzgKICNkZWZpbmUgSVhHQkVfREVWX0lEX1g1NTBFTV9BX1NGUAkweDE1Q0UKIAogLyogVkYgRGV2aWNlIElEcyAqLwpAQCAtNDg3LDYgKzQ4OCwxMyBAQAogI2RlZmluZSBJWEdCRV9GSEZUX0VYVChfbikJKDB4MDk4MDAgKyAoKF9uKSAqIDB4MTAwKSkgLyogRXh0IEZsZXhpYmxlIEhvc3QKIAkJCQkJCQkgICAgKiBGaWx0ZXIgVGFibGUgKi8KIAorLyogbWFza3MgZm9yIGFjY2Vzc2luZyBWWExBTiBhbmQgR0VORVZFIFVEUCBwb3J0cyAqLworI2RlZmluZSBJWEdCRV9WWExBTkNUUkxfVlhMQU5fVURQUE9SVF9NQVNLICAgICAweDAwMDBmZmZmIC8qIFZYTEFOIHBvcnQgKi8KKyNkZWZpbmUgSVhHQkVfVlhMQU5DVFJMX0dFTkVWRV9VRFBQT1JUX01BU0sgICAgMHhmZmZmMDAwMCAvKiBHRU5FVkUgcG9ydCAqLworI2RlZmluZSBJWEdCRV9WWExBTkNUUkxfQUxMX1VEUFBPUlRfTUFTSyAgICAgICAweGZmZmZmZmZmIC8qIEdFTkVWRS9WWExBTiAqLworCisjZGVmaW5lIElYR0JFX1ZYTEFOQ1RSTF9HRU5FVkVfVURQUE9SVF9TSElGVCAgIDE2CisKICNkZWZpbmUgSVhHQkVfRkxFWElCTEVfRklMVEVSX0NPVU5UX01BWCAgICAgICAgIDQKICNkZWZpbmUgSVhHQkVfRVhUX0ZMRVhJQkxFX0ZJTFRFUl9DT1VOVF9NQVggICAgIDIKIApAQCAtMTgyMyw2ICsxODMxLDkgQEAKICNkZWZpbmUgSVhHQkVfTEVEX0lWUlQoX2kpICAgICAgIElYR0JFX0xFRF9PRkZTRVQoSVhHQkVfTEVEX0lWUlRfQkFTRSwgX2kpCiAjZGVmaW5lIElYR0JFX0xFRF9CTElOSyhfaSkgICAgICBJWEdCRV9MRURfT0ZGU0VUKElYR0JFX0xFRF9CTElOS19CQVNFLCBfaSkKICNkZWZpbmUgSVhHQkVfTEVEX01PREVfTUFTSyhfaSkgIElYR0JFX0xFRF9PRkZTRVQoSVhHQkVfTEVEX01PREVfTUFTS19CQVNFLCBfaSkKKyNkZWZpbmUgSVhHQkVfWDU1N19MRURfTUFOVUFMX1NFVF9NQVNLCUJJVCg4KQorI2RlZmluZSBJWEdCRV9YNTU3X01BWF9MRURfSU5ERVgJMworI2RlZmluZSBJWEdCRV9YNTU3X0xFRF9QUk9WSVNJT05JTkcJMHhDNDMwCiAKIC8qIExFRCBtb2RlcyAqLwogI2RlZmluZSBJWEdCRV9MRURfTElOS19VUCAgICAgICAweDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3g1NTAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3g1NTAuYwppbmRleCA0NzE2Y2E0Li43ZTZiOTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV94NTUwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfeDU1MC5jCkBAIC0yOTUsNiArMjk1LDEyIEBACiAJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfS1JfTDoKIAkJaHctPnBoeS50eXBlID0gaXhnYmVfcGh5X3g1NTBlbV9rcjsKIAkJYnJlYWs7CisJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfMTBHX1Q6CisJCWlmIChody0+YnVzLmxhbl9pZCkKKwkJCWh3LT5waHkucGh5X3NlbWFwaG9yZV9tYXNrID0gSVhHQkVfR1NTUl9QSFkxX1NNOworCQllbHNlCisJCQlody0+cGh5LnBoeV9zZW1hcGhvcmVfbWFzayA9IElYR0JFX0dTU1JfUEhZMF9TTTsKKwkJLyogRmFsbHRocm91Z2ggKi8KIAljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fWF8xR19UOgogCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9YXzEwR19UOgogCQlyZXR1cm4gaXhnYmVfaWRlbnRpZnlfcGh5X2dlbmVyaWMoaHcpOwpAQCAtMTQ1Myw3ICsxNDU5LDcgQEAKIAkvKiBDb25maWd1cmUgaW50ZXJuYWwgUEhZIGZvciBLUi9LWC4gKi8KIAlpeGdiZV9zZXR1cF9rcl9zcGVlZF94NTUwZW0oaHcsIHNwZWVkKTsKIAotCWlmICghaHctPnBoeS5tZGlvLnBydGFkIHx8IGh3LT5waHkubWRpby5wcnRhZCA9PSAweEZGRkYpCisJaWYgKGh3LT5waHkubWRpby5wcnRhZCA9PSBNRElPX1BSVEFEX05PTkUpCiAJCXJldHVybiBJWEdCRV9FUlJfUEhZX0FERFJfSU5WQUxJRDsKIAogCS8qIEdldCBleHRlcm5hbCBQSFkgZGV2aWNlIGlkICovCkBAIC0yMTE0LDYgKzIxMjAsNTAgQEAKIAlyZXR1cm4gaXhnYmVfZW5hYmxlX2xhc2lfZXh0X3RfeDU1MGVtKGh3KTsKIH0KIAorLyoqCisgKiAgaXhnYmVfbGVkX29uX3RfeDU1MGVtIC0gVHVybnMgb24gdGhlIHNvZnR3YXJlIGNvbnRyb2xsYWJsZSBMRURzLgorICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKKyAqICBAbGVkX2lkeDogbGVkIG51bWJlciB0byB0dXJuIG9uCisgKiovCitzdGF0aWMgczMyIGl4Z2JlX2xlZF9vbl90X3g1NTBlbShzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgbGVkX2lkeCkKK3sKKwl1MTYgcGh5X2RhdGE7CisKKwlpZiAobGVkX2lkeCA+PSBJWEdCRV9YNTU3X01BWF9MRURfSU5ERVgpCisJCXJldHVybiBJWEdCRV9FUlJfUEFSQU07CisKKwkvKiBUbyB0dXJuIG9uIHRoZSBMRUQsIHNldCBtb2RlIHRvIE9OLiAqLworCWh3LT5waHkub3BzLnJlYWRfcmVnKGh3LCBJWEdCRV9YNTU3X0xFRF9QUk9WSVNJT05JTkcgKyBsZWRfaWR4LAorCQkJICAgICBJWEdCRV9NRElPX1ZFTkRPUl9TUEVDSUZJQ18xX0RFVl9UWVBFLCAmcGh5X2RhdGEpOworCXBoeV9kYXRhIHw9IElYR0JFX1g1NTdfTEVEX01BTlVBTF9TRVRfTUFTSzsKKwlody0+cGh5Lm9wcy53cml0ZV9yZWcoaHcsIElYR0JFX1g1NTdfTEVEX1BST1ZJU0lPTklORyArIGxlZF9pZHgsCisJCQkgICAgICBJWEdCRV9NRElPX1ZFTkRPUl9TUEVDSUZJQ18xX0RFVl9UWVBFLCBwaHlfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgaXhnYmVfbGVkX29mZl90X3g1NTBlbSAtIFR1cm5zIG9mZiB0aGUgc29mdHdhcmUgY29udHJvbGxhYmxlIExFRHMuCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICogIEBsZWRfaWR4OiBsZWQgbnVtYmVyIHRvIHR1cm4gb2ZmCisgKiovCitzdGF0aWMgczMyIGl4Z2JlX2xlZF9vZmZfdF94NTUwZW0oc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGxlZF9pZHgpCit7CisJdTE2IHBoeV9kYXRhOworCisJaWYgKGxlZF9pZHggPj0gSVhHQkVfWDU1N19NQVhfTEVEX0lOREVYKQorCQlyZXR1cm4gSVhHQkVfRVJSX1BBUkFNOworCisJLyogVG8gdHVybiBvbiB0aGUgTEVELCBzZXQgbW9kZSB0byBPTi4gKi8KKwlody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgSVhHQkVfWDU1N19MRURfUFJPVklTSU9OSU5HICsgbGVkX2lkeCwKKwkJCSAgICAgSVhHQkVfTURJT19WRU5ET1JfU1BFQ0lGSUNfMV9ERVZfVFlQRSwgJnBoeV9kYXRhKTsKKwlwaHlfZGF0YSAmPSB+SVhHQkVfWDU1N19MRURfTUFOVUFMX1NFVF9NQVNLOworCWh3LT5waHkub3BzLndyaXRlX3JlZyhodywgSVhHQkVfWDU1N19MRURfUFJPVklTSU9OSU5HICsgbGVkX2lkeCwKKwkJCSAgICAgIElYR0JFX01ESU9fVkVORE9SX1NQRUNJRklDXzFfREVWX1RZUEUsIHBoeV9kYXRhKTsKKworCXJldHVybiAwOworfQorCiAvKiogaXhnYmVfZ2V0X2xjZF94NTUwZW0gLSBEZXRlcm1pbmUgbG93ZXN0IGNvbW1vbiBkZW5vbWluYXRvcgogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqICBAbGNkX3NwZWVkOiBwb2ludGVyIHRvIGxvd2VzdCBjb21tb24gbGluayBzcGVlZApAQCAtMjM0NCwxOCArMjM5NCwxMiBAQAogCS8qIElmIFg1NTIgKFg1NTBFTV9hKSBhbmQgTURJTyBpcyBjb25uZWN0ZWQgdG8gZXh0ZXJuYWwgUEhZLCB0aGVuIHNldAogCSAqIFBIWSBhZGRyZXNzLiBUaGlzIHJlZ2lzdGVyIGZpZWxkIHdhcyBoYXMgb25seSBiZWVuIHVzZWQgZm9yIFg1NTIuCiAJICovCi0JaWYgKCFody0+cGh5Lm53X21uZ19pZl9zZWwpIHsKLQkJaWYgKGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfeDU1MGVtX2EpIHsKLQkJCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gaHctPmJhY2s7Ci0KLQkJCWVfd2FybihkcnYsICJud19tbmdfaWZfc2VsIG5vdCBzZXRcbiIpOwotCQl9Ci0JCXJldHVybjsKKwlpZiAoaHctPm1hYy50eXBlID09IGl4Z2JlX21hY194NTUwZW1fYSAmJgorCSAgICBody0+cGh5Lm53X21uZ19pZl9zZWwgJiBJWEdCRV9OV19NTkdfSUZfU0VMX01ESU9fQUNUKSB7CisJCWh3LT5waHkubWRpby5wcnRhZCA9IChody0+cGh5Lm53X21uZ19pZl9zZWwgJgorCQkJCSAgICAgIElYR0JFX05XX01OR19JRl9TRUxfTURJT19QSFlfQUREKSA+PgorCQkJCSAgICAgSVhHQkVfTldfTU5HX0lGX1NFTF9NRElPX1BIWV9BRERfU0hJRlQ7CiAJfQotCi0JaHctPnBoeS5tZGlvLnBydGFkID0gKGh3LT5waHkubndfbW5nX2lmX3NlbCAmCi0JCQkgICAgICBJWEdCRV9OV19NTkdfSUZfU0VMX01ESU9fUEhZX0FERCkgPj4KLQkJCSAgICAgSVhHQkVfTldfTU5HX0lGX1NFTF9NRElPX1BIWV9BRERfU0hJRlQ7CiB9CiAKIC8qKiBpeGdiZV9pbml0X3BoeV9vcHNfWDU1MGVtIC0gUEhZL1NGUCBzcGVjaWZpYyBpbml0CkBAIC0yNDU2LDYgKzI1MDAsNyBAQAogCQlicmVhazsKIAljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fWF8xR19UOgogCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9YXzEwR19UOgorCWNhc2UgSVhHQkVfREVWX0lEX1g1NTBFTV9BXzEwR19UOgogCQltZWRpYV90eXBlID0gaXhnYmVfbWVkaWFfdHlwZV9jb3BwZXI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yNTE0LDYgKzI1NTksOSBAQAogCiAJc3dpdGNoIChody0+ZGV2aWNlX2lkKSB7CiAJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX1hfMTBHX1Q6CisJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfU0dNSUk6CisJY2FzZSBJWEdCRV9ERVZfSURfWDU1MEVNX0FfU0dNSUlfTDoKKwljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fQV8xMEdfVDoKIAljYXNlIElYR0JFX0RFVl9JRF9YNTUwRU1fQV9TRlA6CiAJCS8qIENvbmZpZyBNRElPIGNsb2NrIHNwZWVkIGJlZm9yZSB0aGUgZmlyc3QgTURJTyBQSFkgYWNjZXNzICovCiAJCWhscmVnMCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9ITFJFRzApOwpAQCAtMjg1Myw4ICsyOTAxLDYgQEAKIAkud3JpdGVfYW5hbG9nX3JlZzgJCT0gTlVMTCwgXAogCS5zZXRfcnhwYmEJCQk9ICZpeGdiZV9zZXRfcnhwYmFfZ2VuZXJpYywgXAogCS5jaGVja19saW5rCQkJPSAmaXhnYmVfY2hlY2tfbWFjX2xpbmtfZ2VuZXJpYywgXAotCS5sZWRfb24JCQkJPSAmaXhnYmVfbGVkX29uX2dlbmVyaWMsIFwKLQkubGVkX29mZgkJCT0gJml4Z2JlX2xlZF9vZmZfZ2VuZXJpYywgXAogCS5ibGlua19sZWRfc3RhcnQJCT0gJml4Z2JlX2JsaW5rX2xlZF9zdGFydF9YNTQwLCBcCiAJLmJsaW5rX2xlZF9zdG9wCQkJPSAmaXhnYmVfYmxpbmtfbGVkX3N0b3BfWDU0MCwgXAogCS5zZXRfcmFyCQkJPSAmaXhnYmVfc2V0X3Jhcl9nZW5lcmljLCBcCkBAIC0yODg2LDYgKzI5MzIsOCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl4Z2JlX21hY19vcGVyYXRpb25zIG1hY19vcHNfWDU1MCA9IHsKIAlYNTUwX0NPTU1PTl9NQUMKKwkubGVkX29uCQkJPSBpeGdiZV9sZWRfb25fZ2VuZXJpYywKKwkubGVkX29mZgkJPSBpeGdiZV9sZWRfb2ZmX2dlbmVyaWMsCiAJLnJlc2V0X2h3CQk9ICZpeGdiZV9yZXNldF9od19YNTQwLAogCS5nZXRfbWVkaWFfdHlwZQkJPSAmaXhnYmVfZ2V0X21lZGlhX3R5cGVfWDU0MCwKIAkuZ2V0X3Nhbl9tYWNfYWRkcgk9ICZpeGdiZV9nZXRfc2FuX21hY19hZGRyX2dlbmVyaWMsCkBAIC0yOTA0LDYgKzI5NTIsOCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl4Z2JlX21hY19vcGVyYXRpb25zIG1hY19vcHNfWDU1MEVNX3ggPSB7CiAJWDU1MF9DT01NT05fTUFDCisJLmxlZF9vbgkJCT0gaXhnYmVfbGVkX29uX3RfeDU1MGVtLAorCS5sZWRfb2ZmCQk9IGl4Z2JlX2xlZF9vZmZfdF94NTUwZW0sCiAJLnJlc2V0X2h3CQk9ICZpeGdiZV9yZXNldF9od19YNTUwZW0sCiAJLmdldF9tZWRpYV90eXBlCQk9ICZpeGdiZV9nZXRfbWVkaWFfdHlwZV9YNTUwZW0sCiAJLmdldF9zYW5fbWFjX2FkZHIJPSBOVUxMLApAQCAtMjkyMiw2ICsyOTcyLDggQEAKIAogc3RhdGljIHN0cnVjdCBpeGdiZV9tYWNfb3BlcmF0aW9ucyBtYWNfb3BzX3g1NTBlbV9hID0gewogCVg1NTBfQ09NTU9OX01BQworCS5sZWRfb24JCQk9IGl4Z2JlX2xlZF9vbl90X3g1NTBlbSwKKwkubGVkX29mZgkJPSBpeGdiZV9sZWRfb2ZmX3RfeDU1MGVtLAogCS5yZXNldF9odwkJPSBpeGdiZV9yZXNldF9od19YNTUwZW0sCiAJLmdldF9tZWRpYV90eXBlCQk9IGl4Z2JlX2dldF9tZWRpYV90eXBlX1g1NTBlbSwKIAkuZ2V0X3Nhbl9tYWNfYWRkcgk9IE5VTEwsCkBAIC0yOTk3LDYgKzMwNDksOCBAQAogCS5pZGVudGlmeQkJPSAmaXhnYmVfaWRlbnRpZnlfcGh5X3g1NTBlbSwKIAkucmVhZF9yZWcJCT0gJml4Z2JlX3JlYWRfcGh5X3JlZ194NTUwYSwKIAkud3JpdGVfcmVnCQk9ICZpeGdiZV93cml0ZV9waHlfcmVnX3g1NTBhLAorCS5yZWFkX3JlZ19tZGkJCT0gJml4Z2JlX3JlYWRfcGh5X3JlZ19tZGksCisJLndyaXRlX3JlZ19tZGkJCT0gJml4Z2JlX3dyaXRlX3BoeV9yZWdfbWRpLAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBpeGdiZV9tdmFsc19YNTUwW0lYR0JFX01WQUxTX0lEWF9MSU1JVF0gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zi5oCmluZGV4IGJlNTJmNTkuLjU2MzlmYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zi5oCkBAIC01MDIsMTIgKzUwMiw5IEBACiB2b2lkIGl4Z2JlX25hcGlfYWRkX2FsbChzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgaXhnYmVfbmFwaV9kZWxfYWxsKHN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCi0jaWZkZWYgREVCVUcKLWNoYXIgKml4Z2JldmZfZ2V0X2h3X2Rldl9uYW1lKHN0cnVjdCBpeGdiZV9odyAqaHcpOwotI2RlZmluZSBod19kYmcoaHcsIGZvcm1hdCwgYXJnLi4uKSBcCi0JcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZvcm1hdCwgaXhnYmV2Zl9nZXRfaHdfZGV2X25hbWUoaHcpLCAjI2FyZykKLSNlbHNlCi0jZGVmaW5lIGh3X2RiZyhodywgZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCisjZGVmaW5lIGl4Z2JldmZfaHdfdG9fbmV0ZGV2KGh3KSBcCisJKCgoc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqKShodyktPmJhY2spLT5uZXRkZXYpCiAKKyNkZWZpbmUgaHdfZGJnKGh3LCBmb3JtYXQsIGFyZy4uLikgXAorCW5ldGRldl9kYmcoaXhnYmV2Zl9od190b19uZXRkZXYoaHcpLCBmb3JtYXQsICMjIGFyZykKICNlbmRpZiAvKiBfSVhHQkVWRl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMKaW5kZXggZDlkNjYxNi4uN2VhYWMzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jCkBAIC0xNjEyLDcgKzE2MTIsNyBAQAogCQl0eGRjdGwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVkZUWERDVEwocmVnX2lkeCkpOwogCX0gIHdoaWxlICgtLXdhaXRfbG9vcCAmJiAhKHR4ZGN0bCAmIElYR0JFX1RYRENUTF9FTkFCTEUpKTsKIAlpZiAoIXdhaXRfbG9vcCkKLQkJcHJfZXJyKCJDb3VsZCBub3QgZW5hYmxlIFR4IFF1ZXVlICVkXG4iLCByZWdfaWR4KTsKKwkJaHdfZGJnKGh3LCAiQ291bGQgbm90IGVuYWJsZSBUeCBRdWV1ZSAlZFxuIiwgcmVnX2lkeCk7CiB9CiAKIC8qKgpAQCAtMTgxMCw4ICsxODEwLDEwIEBACiAJaWYgKGh3LT5tYWMudHlwZSA+PSBpeGdiZV9tYWNfWDU1MF92ZikKIAkJaXhnYmV2Zl9zZXR1cF92Zm1ycWMoYWRhcHRlcik7CiAKKwlzcGluX2xvY2tfYmgoJmFkYXB0ZXItPm1ieF9sb2NrKTsKIAkvKiBub3RpZnkgdGhlIFBGIG9mIG91ciBpbnRlbnQgdG8gdXNlIHRoaXMgc2l6ZSBvZiBmcmFtZSAqLwogCXJldCA9IGh3LT5tYWMub3BzLnNldF9ybHBtbChodywgbmV0ZGV2LT5tdHUgKyBFVEhfSExFTiArIEVUSF9GQ1NfTEVOKTsKKwlzcGluX3VubG9ja19iaCgmYWRhcHRlci0+bWJ4X2xvY2spOwogCWlmIChyZXQpCiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKIAkJCSJGYWlsZWQgdG8gc2V0IE1UVSBhdCAlZFxuIiwgbmV0ZGV2LT5tdHUpOwpAQCAtMjk5Myw2ICsyOTk1LDcgQEAKICAqKi8KIGludCBpeGdiZXZmX3NldHVwX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaXhnYmV2Zl9yaW5nICp0eF9yaW5nKQogeworCXN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdih0eF9yaW5nLT5uZXRkZXYpOwogCWludCBzaXplOwogCiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXhnYmV2Zl90eF9idWZmZXIpICogdHhfcmluZy0+Y291bnQ7CkBAIC0zNzU3LDggKzM3NjAsMTAgQEAKIAlpZiAoKG5ld19tdHUgPCA2OCkgfHwgKG1heF9mcmFtZSA+IG1heF9wb3NzaWJsZV9mcmFtZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tYnhfbG9jayk7CiAJLyogbm90aWZ5IHRoZSBQRiBvZiBvdXIgaW50ZW50IHRvIHVzZSB0aGlzIHNpemUgb2YgZnJhbWUgKi8KIAlyZXQgPSBody0+bWFjLm9wcy5zZXRfcmxwbWwoaHcsIG1heF9mcmFtZSk7CisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1ieF9sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi92Zi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi92Zi5jCmluZGV4IGE1MmY3MGUuLmQ0NmJhMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvdmYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL3ZmLmMKQEAgLTI4NCw3ICsyODQsOCBAQAogCWlmIChhZGRyKQogCQlldGhlcl9hZGRyX2NvcHkobXNnX2FkZHIsIGFkZHIpOwogCi0JcmV0X3ZhbCA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2didWYsIG1zZ2J1ZiwgMyk7CisJcmV0X3ZhbCA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2didWYsIG1zZ2J1ZiwKKwkJCQkJICAgICBzaXplb2YobXNnYnVmKSAvIHNpemVvZih1MzIpKTsKIAlpZiAoIXJldF92YWwpIHsKIAkJbXNnYnVmWzBdICY9IH5JWEdCRV9WVF9NU0dUWVBFX0NUUzsKIApAQCAtNDQxLDcgKzQ0Miw4IEBACiAJbXNnYnVmWzBdID0gSVhHQkVfVkZfU0VUX01BQ19BRERSOwogCWV0aGVyX2FkZHJfY29weShtc2dfYWRkciwgYWRkcik7CiAKLQlyZXRfdmFsID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZ2J1ZiwgbXNnYnVmLCAyKTsKKwlyZXRfdmFsID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZ2J1ZiwgbXNnYnVmLAorCQkJCQkgICAgIHNpemVvZihtc2didWYpIC8gc2l6ZW9mKHUzMikpOwogCiAJbXNnYnVmWzBdICY9IH5JWEdCRV9WVF9NU0dUWVBFX0NUUzsKIApAQCAtNTUxLDcgKzU1Myw4IEBACiAJbXNnYnVmWzBdID0gSVhHQkVfVkZfVVBEQVRFX1hDQVNUX01PREU7CiAJbXNnYnVmWzFdID0geGNhc3RfbW9kZTsKIAotCWVyciA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2didWYsIG1zZ2J1ZiwgMik7CisJZXJyID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZ2J1ZiwgbXNnYnVmLAorCQkJCQkgc2l6ZW9mKG1zZ2J1ZikgLyBzaXplb2YodTMyKSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtNTg4LDcgKzU5MSw4IEBACiAJLyogU2V0dGluZyB0aGUgOCBiaXQgZmllbGQgTVNHIElORk8gdG8gVFJVRSBpbmRpY2F0ZXMgImFkZCIgKi8KIAltc2didWZbMF0gfD0gdmxhbl9vbiA8PCBJWEdCRV9WVF9NU0dJTkZPX1NISUZUOwogCi0JZXJyID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZ2J1ZiwgbXNnYnVmLCAyKTsKKwllcnIgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnYnVmLCBtc2didWYsCisJCQkJCSBzaXplb2YobXNnYnVmKSAvIHNpemVvZih1MzIpKTsKIAlpZiAoZXJyKQogCQlnb3RvIG1ieF9lcnI7CiAKQEAgLTc5MSw3ICs3OTUsOCBAQAogCW1zZ2J1ZlswXSA9IElYR0JFX1ZGX1NFVF9MUEU7CiAJbXNnYnVmWzFdID0gbWF4X3NpemU7CiAKLQlyZXRfdmFsID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZ2J1ZiwgbXNnYnVmLCAyKTsKKwlyZXRfdmFsID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZ2J1ZiwgbXNnYnVmLAorCQkJCQkgICAgIHNpemVvZihtc2didWYpIC8gc2l6ZW9mKHUzMikpOwogCWlmIChyZXRfdmFsKQogCQlyZXR1cm4gcmV0X3ZhbDsKIAlpZiAoKG1zZ2J1ZlswXSAmIElYR0JFX1ZGX1NFVF9MUEUpICYmCkBAIC04MzcsNyArODQyLDggQEAKIAltc2dbMV0gPSBhcGk7CiAJbXNnWzJdID0gMDsKIAotCWVyciA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2csIG1zZywgMyk7CisJZXJyID0gaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soaHcsIG1zZywgbXNnLAorCQkJCQkgc2l6ZW9mKG1zZykgLyBzaXplb2YodTMyKSk7CiAJaWYgKCFlcnIpIHsKIAkJbXNnWzBdICY9IH5JWEdCRV9WVF9NU0dUWVBFX0NUUzsKIApAQCAtODg3LDcgKzg5Myw4IEBACiAJbXNnWzBdID0gSVhHQkVfVkZfR0VUX1FVRVVFOwogCW1zZ1sxXSA9IG1zZ1syXSA9IG1zZ1szXSA9IG1zZ1s0XSA9IDA7CiAKLQllcnIgPSBpeGdiZXZmX3dyaXRlX21zZ19yZWFkX2FjayhodywgbXNnLCBtc2csIDUpOworCWVyciA9IGl4Z2JldmZfd3JpdGVfbXNnX3JlYWRfYWNrKGh3LCBtc2csIG1zZywKKwkJCQkJIHNpemVvZihtc2cpIC8gc2l6ZW9mKHUzMikpOwogCWlmICghZXJyKSB7CiAJCW1zZ1swXSAmPSB+SVhHQkVfVlRfTVNHVFlQRV9DVFM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZtZGlvLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bWRpby5jCmluZGV4IDg5ODJjODguLmEwZDFiMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZtZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm1kaW8uYwpAQCAtMjExLDggKzIxMSw3IEBACiAJZGV2LT5yZWdzID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpKTsKIAlpZiAoIWRldi0+cmVncykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gcmVtYXAgU01JIHJlZ2lzdGVyXG4iKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfbWRpbzsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5zbWlfYnVzeV93YWl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YS5jCmluZGV4IGQ0MWMyOGQuLjVjYjA3YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGEuYwpAQCAtMzgyLDcgKzM4Miw4IEBACiAJc3RydWN0IG12bmV0YV9yeF9xdWV1ZSAqcnhxczsKIAlzdHJ1Y3QgbXZuZXRhX3R4X3F1ZXVlICp0eHFzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNwdV9ub3RpZmllcjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlX29ubGluZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlX2RlYWQ7CiAJaW50IHJ4cV9kZWY7CiAJLyogUHJvdGVjdCB0aGUgYWNjZXNzIHRvIHRoZSBwZXJjcHUgaW50ZXJydXB0IHJlZ2lzdGVycywKIAkgKiBlbnN1cmluZyB0aGF0IHRoZSBjb25maWd1cmF0aW9uIHJlbWFpbnMgY29oZXJlbnQuCkBAIC0zOTksNyArNDAwLDYgQEAKIAl1MTYgcnhfcmluZ19zaXplOwogCiAJc3RydWN0IG1paV9idXMgKm1paV9idXM7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXY7CiAJcGh5X2ludGVyZmFjZV90IHBoeV9pbnRlcmZhY2U7CiAJc3RydWN0IGRldmljZV9ub2RlICpwaHlfbm9kZTsKIAl1bnNpZ25lZCBpbnQgbGluazsKQEAgLTU3NCw2ICs1NzQsNyBAQAogCWludCBuZXh0X2Rlc2NfdG9fcHJvYzsKIH07CiAKK3N0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIG9ubGluZV9ocHN0YXRlOwogLyogVGhlIGhhcmR3YXJlIHN1cHBvcnRzIGVpZ2h0ICg4KSByeCBxdWV1ZXMsIGJ1dCB3ZSBhcmUgb25seSBhbGxvd2luZwogICogdGhlIGZpcnN0IG9uZSB0byBiZSB1c2VkLiBUaGVyZWZvcmUsIGxldCdzIGp1c3QgYWxsb2NhdGUgb25lIHF1ZXVlLgogICovCkBAIC02MzUsOCArNjM2LDkgQEAKIH0KIAogLyogR2V0IFN5c3RlbSBOZXR3b3JrIFN0YXRpc3RpY3MgKi8KLXN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqbXZuZXRhX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cykKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKgorbXZuZXRhX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCiB7CiAJc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgaW50IHN0YXJ0OwpAQCAtMjY1MSw2ICsyNjUzLDcgQEAKIAl1MzIgY2F1c2VfcnhfdHg7CiAJaW50IHJ4X3F1ZXVlOwogCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHAgPSBuZXRkZXZfcHJpdihuYXBpLT5kZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHAtPmRldjsKIAlzdHJ1Y3QgbXZuZXRhX3BjcHVfcG9ydCAqcG9ydCA9IHRoaXNfY3B1X3B0cihwcC0+cG9ydHMpOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKHBwLT5kZXYpKSB7CkBAIC0yNjY4LDcgKzI2NzEsNyBAQAogCQkJCShNVk5FVEFfQ0FVU0VfUEhZX1NUQVRVU19DSEFOR0UgfAogCQkJCSBNVk5FVEFfQ0FVU0VfTElOS19DSEFOR0UgfAogCQkJCSBNVk5FVEFfQ0FVU0VfUFNDX1NZTkNfQ0hBTkdFKSkpIHsKLQkJCW12bmV0YV9maXhlZF9saW5rX3VwZGF0ZShwcCwgcHAtPnBoeV9kZXYpOworCQkJbXZuZXRhX2ZpeGVkX2xpbmtfdXBkYXRlKHBwLCBuZGV2LT5waHlkZXYpOwogCQl9CiAJfQogCkBAIC0yOTYzLDYgKzI5NjYsNyBAQAogc3RhdGljIHZvaWQgbXZuZXRhX3N0YXJ0X2RldihzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwKQogewogCWludCBjcHU7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwcC0+ZGV2OwogCiAJbXZuZXRhX21heF9yeF9zaXplX3NldChwcCwgcHAtPnBrdF9zaXplKTsKIAltdm5ldGFfdHhxX21heF90eF9zaXplX3NldChwcCwgcHAtPnBrdF9zaXplKTsKQEAgLTI5ODUsMTUgKzI5ODksMTYgQEAKIAkJICAgIE1WTkVUQV9DQVVTRV9MSU5LX0NIQU5HRSB8CiAJCSAgICBNVk5FVEFfQ0FVU0VfUFNDX1NZTkNfQ0hBTkdFKTsKIAotCXBoeV9zdGFydChwcC0+cGh5X2Rldik7CisJcGh5X3N0YXJ0KG5kZXYtPnBoeWRldik7CiAJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhwcC0+ZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgbXZuZXRhX3N0b3BfZGV2KHN0cnVjdCBtdm5ldGFfcG9ydCAqcHApCiB7CiAJdW5zaWduZWQgaW50IGNwdTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBwLT5kZXY7CiAKLQlwaHlfc3RvcChwcC0+cGh5X2Rldik7CisJcGh5X3N0b3AobmRldi0+cGh5ZGV2KTsKIAogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCXN0cnVjdCBtdm5ldGFfcGNwdV9wb3J0ICpwb3J0ID0gcGVyX2NwdV9wdHIocHAtPnBvcnRzLCBjcHUpOwpAQCAtMzE2Niw3ICszMTcxLDcgQEAKIHN0YXRpYyB2b2lkIG12bmV0YV9hZGp1c3RfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHBwLT5waHlfZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBuZGV2LT5waHlkZXY7CiAJaW50IHN0YXR1c19jaGFuZ2UgPSAwOwogCiAJaWYgKHBoeWRldi0+bGluaykgewpAQCAtMzI0NCw3ICszMjQ5LDYgQEAKIAlwaHlfZGV2LT5zdXBwb3J0ZWQgJj0gUEhZX0dCSVRfRkVBVFVSRVM7CiAJcGh5X2Rldi0+YWR2ZXJ0aXNpbmcgPSBwaHlfZGV2LT5zdXBwb3J0ZWQ7CiAKLQlwcC0+cGh5X2RldiA9IHBoeV9kZXY7CiAJcHAtPmxpbmsgICAgPSAwOwogCXBwLT5kdXBsZXggID0gMDsKIAlwcC0+c3BlZWQgICA9IDA7CkBAIC0zMjU0LDggKzMyNTgsOSBAQAogCiBzdGF0aWMgdm9pZCBtdm5ldGFfbWRpb19yZW1vdmUoc3RydWN0IG12bmV0YV9wb3J0ICpwcCkKIHsKLQlwaHlfZGlzY29ubmVjdChwcC0+cGh5X2Rldik7Ci0JcHAtPnBoeV9kZXYgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcHAtPmRldjsKKworCXBoeV9kaXNjb25uZWN0KG5kZXYtPnBoeWRldik7CiB9CiAKIC8qIEVsZWN0aW5nIGEgQ1BVIG11c3QgYmUgZG9uZSBpbiBhbiBhdG9taWMgd2F5OiBpdCBzaG91bGQgYmUgZG9uZQpAQCAtMzMxMSwxMDEgKzMzMTYsMTA0IEBACiAJfQogfTsKIAotc3RhdGljIGludCBtdm5ldGFfcGVyY3B1X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitzdGF0aWMgaW50IG12bmV0YV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQogewotCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHAgPSBjb250YWluZXJfb2YobmZiLCBzdHJ1Y3QgbXZuZXRhX3BvcnQsCi0JCQkJCSAgICAgIGNwdV9ub3RpZmllcik7Ci0JaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHUsIG90aGVyX2NwdTsKKwlpbnQgb3RoZXJfY3B1OworCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHAgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBtdm5ldGFfcG9ydCwKKwkJCQkJCSAgbm9kZV9vbmxpbmUpOwogCXN0cnVjdCBtdm5ldGFfcGNwdV9wb3J0ICpwb3J0ID0gcGVyX2NwdV9wdHIocHAtPnBvcnRzLCBjcHUpOwogCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQljYXNlIENQVV9ET1dOX0ZBSUxFRF9GUk9aRU46Ci0JCXNwaW5fbG9jaygmcHAtPmxvY2spOwotCQkvKiBDb25maWd1cmluZyB0aGUgZHJpdmVyIGZvciBhIG5ldyBDUFUgd2hpbGUgdGhlCi0JCSAqIGRyaXZlciBpcyBzdG9wcGluZyBpcyByYWN5LCBzbyBqdXN0IGF2b2lkIGl0LgotCQkgKi8KLQkJaWYgKHBwLT5pc19zdG9wcGVkKSB7Ci0JCQlzcGluX3VubG9jaygmcHAtPmxvY2spOwotCQkJYnJlYWs7CisKKwlzcGluX2xvY2soJnBwLT5sb2NrKTsKKwkvKgorCSAqIENvbmZpZ3VyaW5nIHRoZSBkcml2ZXIgZm9yIGEgbmV3IENQVSB3aGlsZSB0aGUgZHJpdmVyIGlzCisJICogc3RvcHBpbmcgaXMgcmFjeSwgc28ganVzdCBhdm9pZCBpdC4KKwkgKi8KKwlpZiAocHAtPmlzX3N0b3BwZWQpIHsKKwkJc3Bpbl91bmxvY2soJnBwLT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhwcC0+ZGV2KTsKKworCS8qCisJICogV2UgaGF2ZSB0byBzeW5jaHJvbmlzZSBvbiB0aGEgbmFwaSBvZiBlYWNoIENQVSBleGNlcHQgdGhlIG9uZQorCSAqIGp1c3QgYmVpbmcgd29rZW4gdXAKKwkgKi8KKwlmb3JfZWFjaF9vbmxpbmVfY3B1KG90aGVyX2NwdSkgeworCQlpZiAob3RoZXJfY3B1ICE9IGNwdSkgeworCQkJc3RydWN0IG12bmV0YV9wY3B1X3BvcnQgKm90aGVyX3BvcnQgPQorCQkJCXBlcl9jcHVfcHRyKHBwLT5wb3J0cywgb3RoZXJfY3B1KTsKKworCQkJbmFwaV9zeW5jaHJvbml6ZSgmb3RoZXJfcG9ydC0+bmFwaSk7CiAJCX0KLQkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHBwLT5kZXYpOwotCi0JCS8qIFdlIGhhdmUgdG8gc3luY2hyb25pc2Ugb24gdGhhIG5hcGkgb2YgZWFjaCBDUFUKLQkJICogZXhjZXB0IHRoZSBvbmUganVzdCBiZWluZyB3YWtlZCB1cAotCQkgKi8KLQkJZm9yX2VhY2hfb25saW5lX2NwdShvdGhlcl9jcHUpIHsKLQkJCWlmIChvdGhlcl9jcHUgIT0gY3B1KSB7Ci0JCQkJc3RydWN0IG12bmV0YV9wY3B1X3BvcnQgKm90aGVyX3BvcnQgPQotCQkJCQlwZXJfY3B1X3B0cihwcC0+cG9ydHMsIG90aGVyX2NwdSk7Ci0KLQkJCQluYXBpX3N5bmNocm9uaXplKCZvdGhlcl9wb3J0LT5uYXBpKTsKLQkJCX0KLQkJfQotCi0JCS8qIE1hc2sgYWxsIGV0aGVybmV0IHBvcnQgaW50ZXJydXB0cyAqLwotCQlvbl9lYWNoX2NwdShtdm5ldGFfcGVyY3B1X21hc2tfaW50ZXJydXB0LCBwcCwgdHJ1ZSk7Ci0JCW5hcGlfZW5hYmxlKCZwb3J0LT5uYXBpKTsKLQotCi0JCS8qIEVuYWJsZSBwZXItQ1BVIGludGVycnVwdHMgb24gdGhlIENQVSB0aGF0IGlzCi0JCSAqIGJyb3VnaHQgdXAuCi0JCSAqLwotCQltdm5ldGFfcGVyY3B1X2VuYWJsZShwcCk7Ci0KLQkJLyogRW5hYmxlIHBlci1DUFUgaW50ZXJydXB0IG9uIHRoZSBvbmUgQ1BVIHdlIGNhcmUKLQkJICogYWJvdXQuCi0JCSAqLwotCQltdm5ldGFfcGVyY3B1X2VsZWN0KHBwKTsKLQotCQkvKiBVbm1hc2sgYWxsIGV0aGVybmV0IHBvcnQgaW50ZXJydXB0cyAqLwotCQlvbl9lYWNoX2NwdShtdm5ldGFfcGVyY3B1X3VubWFza19pbnRlcnJ1cHQsIHBwLCB0cnVlKTsKLQkJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9JTlRSX01JU0NfTUFTSywKLQkJCU1WTkVUQV9DQVVTRV9QSFlfU1RBVFVTX0NIQU5HRSB8Ci0JCQlNVk5FVEFfQ0FVU0VfTElOS19DSEFOR0UgfAotCQkJTVZORVRBX0NBVVNFX1BTQ19TWU5DX0NIQU5HRSk7Ci0JCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMocHAtPmRldik7Ci0JCXNwaW5fdW5sb2NrKCZwcC0+bG9jayk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLQljYXNlIENQVV9ET1dOX1BSRVBBUkVfRlJPWkVOOgotCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocHAtPmRldik7Ci0JCS8qIFRoYW5rcyB0byB0aGlzIGxvY2sgd2UgYXJlIHN1cmUgdGhhdCBhbnkgcGVuZGluZwotCQkgKiBjcHUgZWxlY3Rpb24gaXMgZG9uZQotCQkgKi8KLQkJc3Bpbl9sb2NrKCZwcC0+bG9jayk7Ci0JCS8qIE1hc2sgYWxsIGV0aGVybmV0IHBvcnQgaW50ZXJydXB0cyAqLwotCQlvbl9lYWNoX2NwdShtdm5ldGFfcGVyY3B1X21hc2tfaW50ZXJydXB0LCBwcCwgdHJ1ZSk7Ci0JCXNwaW5fdW5sb2NrKCZwcC0+bG9jayk7Ci0KLQkJbmFwaV9zeW5jaHJvbml6ZSgmcG9ydC0+bmFwaSk7Ci0JCW5hcGlfZGlzYWJsZSgmcG9ydC0+bmFwaSk7Ci0JCS8qIERpc2FibGUgcGVyLUNQVSBpbnRlcnJ1cHRzIG9uIHRoZSBDUFUgdGhhdCBpcwotCQkgKiBicm91Z2h0IGRvd24uCi0JCSAqLwotCQltdm5ldGFfcGVyY3B1X2Rpc2FibGUocHApOwotCi0JCWJyZWFrOwotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCS8qIENoZWNrIGlmIGEgbmV3IENQVSBtdXN0IGJlIGVsZWN0ZWQgbm93IHRoaXMgb24gaXMgZG93biAqLwotCQlzcGluX2xvY2soJnBwLT5sb2NrKTsKLQkJbXZuZXRhX3BlcmNwdV9lbGVjdChwcCk7Ci0JCXNwaW5fdW5sb2NrKCZwcC0+bG9jayk7Ci0JCS8qIFVubWFzayBhbGwgZXRoZXJuZXQgcG9ydCBpbnRlcnJ1cHRzICovCi0JCW9uX2VhY2hfY3B1KG12bmV0YV9wZXJjcHVfdW5tYXNrX2ludGVycnVwdCwgcHAsIHRydWUpOwotCQltdnJlZ193cml0ZShwcCwgTVZORVRBX0lOVFJfTUlTQ19NQVNLLAotCQkJTVZORVRBX0NBVVNFX1BIWV9TVEFUVVNfQ0hBTkdFIHwKLQkJCU1WTkVUQV9DQVVTRV9MSU5LX0NIQU5HRSB8Ci0JCQlNVk5FVEFfQ0FVU0VfUFNDX1NZTkNfQ0hBTkdFKTsKLQkJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhwcC0+ZGV2KTsKLQkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIE5PVElGWV9PSzsKKwkvKiBNYXNrIGFsbCBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KKwlvbl9lYWNoX2NwdShtdm5ldGFfcGVyY3B1X21hc2tfaW50ZXJydXB0LCBwcCwgdHJ1ZSk7CisJbmFwaV9lbmFibGUoJnBvcnQtPm5hcGkpOworCisJLyoKKwkgKiBFbmFibGUgcGVyLUNQVSBpbnRlcnJ1cHRzIG9uIHRoZSBDUFUgdGhhdCBpcworCSAqIGJyb3VnaHQgdXAuCisJICovCisJbXZuZXRhX3BlcmNwdV9lbmFibGUocHApOworCisJLyoKKwkgKiBFbmFibGUgcGVyLUNQVSBpbnRlcnJ1cHQgb24gdGhlIG9uZSBDUFUgd2UgY2FyZQorCSAqIGFib3V0LgorCSAqLworCW12bmV0YV9wZXJjcHVfZWxlY3QocHApOworCisJLyogVW5tYXNrIGFsbCBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KKwlvbl9lYWNoX2NwdShtdm5ldGFfcGVyY3B1X3VubWFza19pbnRlcnJ1cHQsIHBwLCB0cnVlKTsKKwltdnJlZ193cml0ZShwcCwgTVZORVRBX0lOVFJfTUlTQ19NQVNLLAorCQkgICAgTVZORVRBX0NBVVNFX1BIWV9TVEFUVVNfQ0hBTkdFIHwKKwkJICAgIE1WTkVUQV9DQVVTRV9MSU5LX0NIQU5HRSB8CisJCSAgICBNVk5FVEFfQ0FVU0VfUFNDX1NZTkNfQ0hBTkdFKTsKKwluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKHBwLT5kZXYpOworCXNwaW5fdW5sb2NrKCZwcC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZuZXRhX2NwdV9kb3duX3ByZXBhcmUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCit7CisJc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IG12bmV0YV9wb3J0LAorCQkJCQkJICBub2RlX29ubGluZSk7CisJc3RydWN0IG12bmV0YV9wY3B1X3BvcnQgKnBvcnQgPSBwZXJfY3B1X3B0cihwcC0+cG9ydHMsIGNwdSk7CisKKwkvKgorCSAqIFRoYW5rcyB0byB0aGlzIGxvY2sgd2UgYXJlIHN1cmUgdGhhdCBhbnkgcGVuZGluZyBjcHUgZWxlY3Rpb24gaXMKKwkgKiBkb25lLgorCSAqLworCXNwaW5fbG9jaygmcHAtPmxvY2spOworCS8qIE1hc2sgYWxsIGV0aGVybmV0IHBvcnQgaW50ZXJydXB0cyAqLworCW9uX2VhY2hfY3B1KG12bmV0YV9wZXJjcHVfbWFza19pbnRlcnJ1cHQsIHBwLCB0cnVlKTsKKwlzcGluX3VubG9jaygmcHAtPmxvY2spOworCisJbmFwaV9zeW5jaHJvbml6ZSgmcG9ydC0+bmFwaSk7CisJbmFwaV9kaXNhYmxlKCZwb3J0LT5uYXBpKTsKKwkvKiBEaXNhYmxlIHBlci1DUFUgaW50ZXJydXB0cyBvbiB0aGUgQ1BVIHRoYXQgaXMgYnJvdWdodCBkb3duLiAqLworCW12bmV0YV9wZXJjcHVfZGlzYWJsZShwcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXZuZXRhX2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHAgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCBtdm5ldGFfcG9ydCwKKwkJCQkJCSAgbm9kZV9kZWFkKTsKKworCS8qIENoZWNrIGlmIGEgbmV3IENQVSBtdXN0IGJlIGVsZWN0ZWQgbm93IHRoaXMgb24gaXMgZG93biAqLworCXNwaW5fbG9jaygmcHAtPmxvY2spOworCW12bmV0YV9wZXJjcHVfZWxlY3QocHApOworCXNwaW5fdW5sb2NrKCZwcC0+bG9jayk7CisJLyogVW5tYXNrIGFsbCBldGhlcm5ldCBwb3J0IGludGVycnVwdHMgKi8KKwlvbl9lYWNoX2NwdShtdm5ldGFfcGVyY3B1X3VubWFza19pbnRlcnJ1cHQsIHBwLCB0cnVlKTsKKwltdnJlZ193cml0ZShwcCwgTVZORVRBX0lOVFJfTUlTQ19NQVNLLAorCQkgICAgTVZORVRBX0NBVVNFX1BIWV9TVEFUVVNfQ0hBTkdFIHwKKwkJICAgIE1WTkVUQV9DQVVTRV9MSU5LX0NIQU5HRSB8CisJCSAgICBNVk5FVEFfQ0FVU0VfUFNDX1NZTkNfQ0hBTkdFKTsKKwluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKHBwLT5kZXYpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG12bmV0YV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0zNDQyLDcgKzM0NTAsMTUgQEAKIAkvKiBSZWdpc3RlciBhIENQVSBub3RpZmllciB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgb3VyIENQVQogCSAqIG1pZ2h0IGJlIHRha2VuIG9mZmxpbmUuCiAJICovCi0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZwcC0+Y3B1X25vdGlmaWVyKTsKKwlyZXQgPSBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Vfbm9jYWxscyhvbmxpbmVfaHBzdGF0ZSwKKwkJCQkJICAgICAgICZwcC0+bm9kZV9vbmxpbmUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCisJcmV0ID0gY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfTkVUX01WTkVUQV9ERUFELAorCQkJCQkgICAgICAgJnBwLT5ub2RlX2RlYWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2ZyZWVfb25saW5lX2hwOwogCiAJLyogSW4gZGVmYXVsdCBsaW5rIGlzIGRvd24gKi8KIAluZXRpZl9jYXJyaWVyX29mZihwcC0+ZGV2KTsKQEAgLTM0NTAsMTUgKzM0NjYsMTkgQEAKIAlyZXQgPSBtdm5ldGFfbWRpb19wcm9iZShwcCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbmV0ZGV2X2VycihkZXYsICJjYW5ub3QgcHJvYmUgTURJTyBidXNcbiIpOwotCQlnb3RvIGVycl9mcmVlX2lycTsKKwkJZ290byBlcnJfZnJlZV9kZWFkX2hwOwogCX0KIAogCW12bmV0YV9zdGFydF9kZXYocHApOwogCiAJcmV0dXJuIDA7CiAKK2Vycl9mcmVlX2RlYWRfaHA6CisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfTkVUX01WTkVUQV9ERUFELAorCQkJCQkgICAgJnBwLT5ub2RlX2RlYWQpOworZXJyX2ZyZWVfb25saW5lX2hwOgorCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKG9ubGluZV9ocHN0YXRlLCAmcHAtPm5vZGVfb25saW5lKTsKIGVycl9mcmVlX2lycToKLQl1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcigmcHAtPmNwdV9ub3RpZmllcik7CiAJb25fZWFjaF9jcHUobXZuZXRhX3BlcmNwdV9kaXNhYmxlLCBwcCwgdHJ1ZSk7CiAJZnJlZV9wZXJjcHVfaXJxKHBwLT5kZXYtPmlycSwgcHAtPnBvcnRzKTsKIGVycl9jbGVhbnVwX3R4cXM6CkBAIC0zNDg0LDcgKzM1MDQsMTAgQEAKIAogCW12bmV0YV9zdG9wX2RldihwcCk7CiAJbXZuZXRhX21kaW9fcmVtb3ZlKHBwKTsKLQl1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcigmcHAtPmNwdV9ub3RpZmllcik7CisKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhvbmxpbmVfaHBzdGF0ZSwgJnBwLT5ub2RlX29ubGluZSk7CisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfTkVUX01WTkVUQV9ERUFELAorCQkJCQkgICAgJnBwLT5ub2RlX2RlYWQpOwogCW9uX2VhY2hfY3B1KG12bmV0YV9wZXJjcHVfZGlzYWJsZSwgcHAsIHRydWUpOwogCWZyZWVfcGVyY3B1X2lycShkZXYtPmlycSwgcHAtPnBvcnRzKTsKIAltdm5ldGFfY2xlYW51cF9yeHFzKHBwKTsKQEAgLTM0OTUsNDIgKzM1MTgsMzEgQEAKIAogc3RhdGljIGludCBtdm5ldGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7Ci0Jc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAoIXBwLT5waHlfZGV2KQorCWlmICghZGV2LT5waHlkZXYpCiAJCXJldHVybiAtRU5PVFNVUFA7CiAKLQlyZXR1cm4gcGh5X21paV9pb2N0bChwcC0+cGh5X2RldiwgaWZyLCBjbWQpOworCXJldHVybiBwaHlfbWlpX2lvY3RsKGRldi0+cGh5ZGV2LCBpZnIsIGNtZCk7CiB9CiAKIC8qIEV0aHRvb2wgbWV0aG9kcyAqLwogCi0vKiBHZXQgc2V0dGluZ3MgKHBoeSBhZGRyZXNzLCBzcGVlZCkgZm9yIGV0aHRvb2xzICovCi1pbnQgbXZuZXRhX2V0aHRvb2xfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorLyogU2V0IGxpbmsga3NldHRpbmdzIChwaHkgYWRkcmVzcywgc3BlZWQpIGZvciBldGh0b29scyAqLworc3RhdGljIGludAorbXZuZXRhX2V0aHRvb2xfc2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKLQlzdHJ1Y3QgbXZuZXRhX3BvcnQgKnBwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmICghcHAtPnBoeV9kZXYpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQocHAtPnBoeV9kZXYsIGNtZCk7Ci19Ci0KLS8qIFNldCBzZXR0aW5ncyAocGh5IGFkZHJlc3MsIHNwZWVkKSBmb3IgZXRodG9vbHMgKi8KLWludCBtdm5ldGFfZXRodG9vbF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCi17Ci0Jc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHBwLT5waHlfZGV2OworCXN0cnVjdCBtdm5ldGFfcG9ydCAqcHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbmRldi0+cGh5ZGV2OwogCiAJaWYgKCFwaHlkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpICE9IHBwLT51c2VfaW5iYW5kX3N0YXR1cykgeworCWlmICgoY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpICE9IHBwLT51c2VfaW5iYW5kX3N0YXR1cykgewogCQl1MzIgdmFsOwogCi0JCW12bmV0YV9zZXRfYXV0b25lZyhwcCwgY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKTsKKwkJbXZuZXRhX3NldF9hdXRvbmVnKHBwLCBjbWQtPmJhc2UuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSk7CiAKLQkJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpIHsKKwkJaWYgKGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRElTQUJMRSkgewogCQkJdmFsID0gbXZyZWdfcmVhZChwcCwgTVZORVRBX0dNQUNfQVVUT05FR19DT05GSUcpOwogCQkJdmFsICY9IH4oTVZORVRBX0dNQUNfQ09ORklHX01JSV9TUEVFRCB8CiAJCQkJIE1WTkVUQV9HTUFDX0NPTkZJR19HTUlJX1NQRUVEIHwKQEAgLTM1NDcsMTcgKzM1NTksMTcgQEAKIAkJCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfR01BQ19BVVRPTkVHX0NPTkZJRywgdmFsKTsKIAkJfQogCi0JCXBwLT51c2VfaW5iYW5kX3N0YXR1cyA9IChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpOworCQlwcC0+dXNlX2luYmFuZF9zdGF0dXMgPSAoY21kLT5iYXNlLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpOwogCQluZXRkZXZfaW5mbyhwcC0+ZGV2LCAiYXV0b25lZyBzdGF0dXMgc2V0IHRvICVpXG4iLAogCQkJICAgIHBwLT51c2VfaW5iYW5kX3N0YXR1cyk7CiAKLQkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkgewogCQkJbXZuZXRhX3BvcnRfZG93bihwcCk7CiAJCQltdm5ldGFfcG9ydF91cChwcCk7CiAJCX0KIAl9CiAKLQlyZXR1cm4gcGh5X2V0aHRvb2xfc3NldChwcC0+cGh5X2RldiwgY21kKTsKKwlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX3NldChuZGV2LT5waHlkZXYsIGNtZCk7CiB9CiAKIC8qIFNldCBpbnRlcnJ1cHQgY29hbGVzY2luZyBmb3IgZXRodG9vbHMgKi8KQEAgLTM4MjEsOCArMzgzMyw2IEBACiAKIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBtdm5ldGFfZXRoX3Rvb2xfb3BzID0gewogCS5nZXRfbGluayAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCi0JLmdldF9zZXR0aW5ncyAgID0gbXZuZXRhX2V0aHRvb2xfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MgICA9IG12bmV0YV9ldGh0b29sX3NldF9zZXR0aW5ncywKIAkuc2V0X2NvYWxlc2NlICAgPSBtdm5ldGFfZXRodG9vbF9zZXRfY29hbGVzY2UsCiAJLmdldF9jb2FsZXNjZSAgID0gbXZuZXRhX2V0aHRvb2xfZ2V0X2NvYWxlc2NlLAogCS5nZXRfZHJ2aW5mbyAgICA9IG12bmV0YV9ldGh0b29sX2dldF9kcnZpbmZvLApAQCAtMzgzNSw2ICszODQ1LDggQEAKIAkuZ2V0X3J4bmZjCT0gbXZuZXRhX2V0aHRvb2xfZ2V0X3J4bmZjLAogCS5nZXRfcnhmaAk9IG12bmV0YV9ldGh0b29sX2dldF9yeGZoLAogCS5zZXRfcnhmaAk9IG12bmV0YV9ldGh0b29sX3NldF9yeGZoLAorCS5nZXRfbGlua19rc2V0dGluZ3MgPSBwaHlfZXRodG9vbF9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncyA9IG12bmV0YV9ldGh0b29sX3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKIC8qIEluaXRpYWxpemUgaHcgKi8KQEAgLTQwMjQsNyArNDAzNiw2IEBACiAJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoZG4sICJtYW5hZ2VkIiwgJm1hbmFnZWQpOwogCXBwLT51c2VfaW5iYW5kX3N0YXR1cyA9IChlcnIgPT0gMCAmJgogCQkJCSBzdHJjbXAobWFuYWdlZCwgImluLWJhbmQtc3RhdHVzIikgPT0gMCk7Ci0JcHAtPmNwdV9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gbXZuZXRhX3BlcmNwdV9ub3RpZmllcjsKIAogCXBwLT5yeHFfZGVmID0gcnhxX2RlZjsKIApAQCAtNDIyNyw3ICs0MjM4LDQyIEBACiAJfSwKIH07CiAKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXZuZXRhX2RyaXZlcik7CitzdGF0aWMgaW50IF9faW5pdCBtdm5ldGFfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfT05MSU5FX0RZTiwgIm5ldC9tdm1ldGE6b25saW5lIiwKKwkJCQkgICAgICBtdm5ldGFfY3B1X29ubGluZSwKKwkJCQkgICAgICBtdm5ldGFfY3B1X2Rvd25fcHJlcGFyZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCW9ubGluZV9ocHN0YXRlID0gcmV0OworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX05FVF9NVk5FVEFfREVBRCwgIm5ldC9tdm5ldGE6ZGVhZCIsCisJCQkJICAgICAgTlVMTCwgbXZuZXRhX2NwdV9kZWFkKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9kZWFkOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtdm5ldGFfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKwlyZXR1cm4gMDsKKworZXJyOgorCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZShDUFVIUF9ORVRfTVZORVRBX0RFQUQpOworZXJyX2RlYWQ6CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKG9ubGluZV9ocHN0YXRlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorbW9kdWxlX2luaXQobXZuZXRhX2RyaXZlcl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG12bmV0YV9kcml2ZXJfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtdm5ldGFfZHJpdmVyKTsKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoQ1BVSFBfTkVUX01WTkVUQV9ERUFEKTsKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUob25saW5lX2hwc3RhdGUpOworfQorbW9kdWxlX2V4aXQobXZuZXRhX2RyaXZlcl9leGl0KTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXJ2ZWxsIE5FVEEgRXRoZXJuZXQgRHJpdmVyIC0gd3d3Lm1hcnZlbGwuY29tIik7CiBNT0RVTEVfQVVUSE9SKCJSYW1pIFJvc2VuIDxyb3NlbnJAbWFydmVsbC5jb20+LCBUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhX2JtLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YV9ibS5oCmluZGV4IGU3NGZkNDQuLmEzMmRlNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhX2JtLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGFfYm0uaApAQCAtMTMzLDcgKzEzMyw3IEBACiB2b2lkICptdm5ldGFfZnJhZ19hbGxvYyh1bnNpZ25lZCBpbnQgZnJhZ19zaXplKTsKIHZvaWQgbXZuZXRhX2ZyYWdfZnJlZSh1bnNpZ25lZCBpbnQgZnJhZ19zaXplLCB2b2lkICpkYXRhKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01WTkVUQV9CTSkgfHwgZGVmaW5lZChDT05GSUdfTVZORVRBX0JNX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19NVk5FVEFfQk0pCiB2b2lkIG12bmV0YV9ibV9wb29sX2Rlc3Ryb3koc3RydWN0IG12bmV0YV9ibSAqcHJpdiwKIAkJCSAgICBzdHJ1Y3QgbXZuZXRhX2JtX3Bvb2wgKmJtX3Bvb2wsIHU4IHBvcnRfbWFwKTsKIHZvaWQgbXZuZXRhX2JtX2J1ZnNfZnJlZShzdHJ1Y3QgbXZuZXRhX2JtICpwcml2LCBzdHJ1Y3QgbXZuZXRhX2JtX3Bvb2wgKmJtX3Bvb2wsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NreTIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCmluZGV4IDQ2NzEzOGIuLmYwNWVhNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCkBAIC0zMDcwLDcgKzMwNzAsNyBAQAogCQkJZ290byBkb25lOwogCX0KIAotCW5hcGlfY29tcGxldGUobmFwaSk7CisJbmFwaV9jb21wbGV0ZV9kb25lKG5hcGksIHdvcmtfZG9uZSk7CiAJc2t5Ml9yZWFkMzIoaHcsIEIwX1kyX1NQX0xJU1IpOwogZG9uZToKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVkaWF0ZWsvbXRrX2V0aF9zb2MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lZGlhdGVrL210a19ldGhfc29jLmMKaW5kZXggZjE2MDk1NC4uYWQ0YWI5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVkaWF0ZWsvbXRrX2V0aF9zb2MuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRlay9tdGtfZXRoX3NvYy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KQEAgLTUwLDYgKzUxLDEwIEBACiAJTVRLX0VUSFRPT0xfU1RBVChyeF9mbG93X2NvbnRyb2xfcGFja2V0cyksCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG10a19jbGtzX3NvdXJjZV9uYW1lW10gPSB7CisJImV0aGlmIiwgImVzdyIsICJncDEiLCAiZ3AyIiwgInRyZ3BsbCIKK307CisKIHZvaWQgbXRrX3czMihzdHJ1Y3QgbXRrX2V0aCAqZXRoLCB1MzIgdmFsLCB1bnNpZ25lZCByZWcpCiB7CiAJX19yYXdfd3JpdGVsKHZhbCwgZXRoLT5iYXNlICsgcmVnKTsKQEAgLTEzMCw2ICsxMzUsMzMgQEAKIAlyZXR1cm4gX210a19tZGlvX3JlYWQoZXRoLCBwaHlfYWRkciwgcGh5X3JlZyk7CiB9CiAKK3N0YXRpYyB2b2lkIG10a19nbWFjMF9yZ21paV9hZGp1c3Qoc3RydWN0IG10a19ldGggKmV0aCwgaW50IHNwZWVkKQoreworCXUzMiB2YWw7CisJaW50IHJldDsKKworCXZhbCA9IChzcGVlZCA9PSBTUEVFRF8xMDAwKSA/CisJCUlOVEZfTU9ERV9SR01JSV8xMDAwIDogSU5URl9NT0RFX1JHTUlJXzEwXzEwMDsKKwltdGtfdzMyKGV0aCwgdmFsLCBJTlRGX01PREUpOworCisJcmVnbWFwX3VwZGF0ZV9iaXRzKGV0aC0+ZXRoc3lzLCBFVEhTWVNfQ0xLQ0ZHMCwKKwkJCSAgIEVUSFNZU19UUkdNSUlfQ0xLX1NFTDM2Ml81LAorCQkJICAgRVRIU1lTX1RSR01JSV9DTEtfU0VMMzYyXzUpOworCisJdmFsID0gKHNwZWVkID09IFNQRUVEXzEwMDApID8gMjUwMDAwMDAwIDogNTAwMDAwMDAwOworCXJldCA9IGNsa19zZXRfcmF0ZShldGgtPmNsa3NbTVRLX0NMS19UUkdQTExdLCB2YWwpOworCWlmIChyZXQpCisJCWRldl9lcnIoZXRoLT5kZXYsICJGYWlsZWQgdG8gc2V0IHRyZ21paSBwbGw6ICVkXG4iLCByZXQpOworCisJdmFsID0gKHNwZWVkID09IFNQRUVEXzEwMDApID8KKwkJUkNLX0NUUkxfUkdNSUlfMTAwMCA6IFJDS19DVFJMX1JHTUlJXzEwXzEwMDsKKwltdGtfdzMyKGV0aCwgdmFsLCBUUkdNSUlfUkNLX0NUUkwpOworCisJdmFsID0gKHNwZWVkID09IFNQRUVEXzEwMDApID8KKwkJVENLX0NUUkxfUkdNSUlfMTAwMCA6IFRDS19DVFJMX1JHTUlJXzEwXzEwMDsKKwltdGtfdzMyKGV0aCwgdmFsLCBUUkdNSUlfVENLX0NUUkwpOworfQorCiBzdGF0aWMgdm9pZCBtdGtfcGh5X2xpbmtfYWRqdXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CkBAIC0xNDAsNyArMTcyLDEwIEBACiAJCSAgTUFDX01DUl9SWF9FTiB8IE1BQ19NQ1JfQkFDS09GRl9FTiB8CiAJCSAgTUFDX01DUl9CQUNLUFJfRU47CiAKLQlzd2l0Y2ggKG1hYy0+cGh5X2Rldi0+c3BlZWQpIHsKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoTVRLX1JFU0VUVElORywgJm1hYy0+aHctPnN0YXRlKSkpCisJCXJldHVybjsKKworCXN3aXRjaCAoZGV2LT5waHlkZXYtPnNwZWVkKSB7CiAJY2FzZSBTUEVFRF8xMDAwOgogCQltY3IgfD0gTUFDX01DUl9TUEVFRF8xMDAwOwogCQlicmVhazsKQEAgLTE0OSwyMCArMTg0LDIzIEBACiAJCWJyZWFrOwogCX07CiAKLQlpZiAobWFjLT5waHlfZGV2LT5saW5rKQorCWlmIChtYWMtPmlkID09IDAgJiYgIW1hYy0+dHJnbWlpKQorCQltdGtfZ21hYzBfcmdtaWlfYWRqdXN0KG1hYy0+aHcsIGRldi0+cGh5ZGV2LT5zcGVlZCk7CisKKwlpZiAoZGV2LT5waHlkZXYtPmxpbmspCiAJCW1jciB8PSBNQUNfTUNSX0ZPUkNFX0xJTks7CiAKLQlpZiAobWFjLT5waHlfZGV2LT5kdXBsZXgpIHsKKwlpZiAoZGV2LT5waHlkZXYtPmR1cGxleCkgewogCQltY3IgfD0gTUFDX01DUl9GT1JDRV9EUFg7CiAKLQkJaWYgKG1hYy0+cGh5X2Rldi0+cGF1c2UpCisJCWlmIChkZXYtPnBoeWRldi0+cGF1c2UpCiAJCQlybXRfYWR2ID0gTFBBX1BBVVNFX0NBUDsKLQkJaWYgKG1hYy0+cGh5X2Rldi0+YXN5bV9wYXVzZSkKKwkJaWYgKGRldi0+cGh5ZGV2LT5hc3ltX3BhdXNlKQogCQkJcm10X2FkdiB8PSBMUEFfUEFVU0VfQVNZTTsKIAotCQlpZiAobWFjLT5waHlfZGV2LT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfUGF1c2UpCisJCWlmIChkZXYtPnBoeWRldi0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEX1BhdXNlKQogCQkJbGNsX2FkdiB8PSBBRFZFUlRJU0VfUEFVU0VfQ0FQOwotCQlpZiAobWFjLT5waHlfZGV2LT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfQXN5bV9QYXVzZSkKKwkJaWYgKGRldi0+cGh5ZGV2LT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfQXN5bV9QYXVzZSkKIAkJCWxjbF9hZHYgfD0gQURWRVJUSVNFX1BBVVNFX0FTWU07CiAKIAkJZmxvd2N0cmwgPSBtaWlfcmVzb2x2ZV9mbG93Y3RybF9mZHgobGNsX2Fkdiwgcm10X2Fkdik7CkBAIC0xNzksNyArMjE3LDcgQEAKIAogCW10a193MzIobWFjLT5odywgbWNyLCBNVEtfTUFDX01DUihtYWMtPmlkKSk7CiAKLQlpZiAobWFjLT5waHlfZGV2LT5saW5rKQorCWlmIChkZXYtPnBoeWRldi0+bGluaykKIAkJbmV0aWZfY2Fycmllcl9vbihkZXYpOwogCWVsc2UKIAkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKQEAgLTE4OCwxNyArMjI2LDkgQEAKIHN0YXRpYyBpbnQgbXRrX3BoeV9jb25uZWN0X25vZGUoc3RydWN0IG10a19ldGggKmV0aCwgc3RydWN0IG10a19tYWMgKm1hYywKIAkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoeV9ub2RlKQogewotCWNvbnN0IF9fYmUzMiAqX2FkZHIgPSBOVUxMOwogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7Ci0JaW50IHBoeV9tb2RlLCBhZGRyOworCWludCBwaHlfbW9kZTsKIAotCV9hZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KHBoeV9ub2RlLCAicmVnIiwgTlVMTCk7Ci0KLQlpZiAoIV9hZGRyIHx8IChiZTMyX3RvX2NwdSgqX2FkZHIpID49IDB4MjApKSB7Ci0JCXByX2VycigiJXM6IGludmFsaWQgcGh5IGFkZHJlc3NcbiIsIHBoeV9ub2RlLT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWFkZHIgPSBiZTMyX3RvX2NwdSgqX2FkZHIpOwogCXBoeV9tb2RlID0gb2ZfZ2V0X3BoeV9tb2RlKHBoeV9ub2RlKTsKIAlpZiAocGh5X21vZGUgPCAwKSB7CiAJCWRldl9lcnIoZXRoLT5kZXYsICJpbmNvcnJlY3QgcGh5LW1vZGUgJWRcbiIsIHBoeV9tb2RlKTsKQEAgLTIxNywxNyArMjQ3LDE3IEBACiAJCSBtYWMtPmlkLCBwaHlkZXZfbmFtZShwaHlkZXYpLCBwaHlkZXYtPnBoeV9pZCwKIAkJIHBoeWRldi0+ZHJ2LT5uYW1lKTsKIAotCW1hYy0+cGh5X2RldiA9IHBoeWRldjsKLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG10a19waHlfY29ubmVjdChzdHJ1Y3QgbXRrX21hYyAqbWFjKQorc3RhdGljIGludCBtdGtfcGh5X2Nvbm5lY3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gbWFjLT5odzsKKwlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbXRrX2V0aCAqZXRoOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JdTMyIHZhbCwgZ2VfbW9kZTsKKwl1MzIgdmFsOwogCisJZXRoID0gbWFjLT5odzsKIAlucCA9IG9mX3BhcnNlX3BoYW5kbGUobWFjLT5vZl9ub2RlLCAicGh5LWhhbmRsZSIsIDApOwogCWlmICghbnAgJiYgb2ZfcGh5X2lzX2ZpeGVkX2xpbmsobWFjLT5vZl9ub2RlKSkKIAkJaWYgKCFvZl9waHlfcmVnaXN0ZXJfZml4ZWRfbGluayhtYWMtPm9mX25vZGUpKQpAQCAtMjM2LDIyICsyNjYsMjQgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzd2l0Y2ggKG9mX2dldF9waHlfbW9kZShucCkpIHsKKwljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9UUkdNSUk6CisJCW1hYy0+dHJnbWlpID0gdHJ1ZTsKIAljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV9UWElEOgogCWNhc2UgUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX1JYSUQ6CiAJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfSUQ6CiAJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUk6Ci0JCWdlX21vZGUgPSAwOworCQltYWMtPmdlX21vZGUgPSAwOwogCQlicmVhazsKIAljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUk6Ci0JCWdlX21vZGUgPSAxOworCQltYWMtPmdlX21vZGUgPSAxOwogCQlicmVhazsKIAljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9SRVZNSUk6Ci0JCWdlX21vZGUgPSAyOworCQltYWMtPmdlX21vZGUgPSAyOwogCQlicmVhazsKIAljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJOgogCQlpZiAoIW1hYy0+aWQpCiAJCQlnb3RvIGVycl9waHk7Ci0JCWdlX21vZGUgPSAzOworCQltYWMtPmdlX21vZGUgPSAzOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlnb3RvIGVycl9waHk7CkBAIC0yNjAsMjMgKzI5MiwyNiBAQAogCS8qIHB1dCB0aGUgZ21hYyBpbnRvIHRoZSByaWdodCBtb2RlICovCiAJcmVnbWFwX3JlYWQoZXRoLT5ldGhzeXMsIEVUSFNZU19TWVNDRkcwLCAmdmFsKTsKIAl2YWwgJj0gflNZU0NGRzBfR0VfTU9ERShTWVNDRkcwX0dFX01BU0ssIG1hYy0+aWQpOwotCXZhbCB8PSBTWVNDRkcwX0dFX01PREUoZ2VfbW9kZSwgbWFjLT5pZCk7CisJdmFsIHw9IFNZU0NGRzBfR0VfTU9ERShtYWMtPmdlX21vZGUsIG1hYy0+aWQpOwogCXJlZ21hcF93cml0ZShldGgtPmV0aHN5cywgRVRIU1lTX1NZU0NGRzAsIHZhbCk7CiAKLQltdGtfcGh5X2Nvbm5lY3Rfbm9kZShldGgsIG1hYywgbnApOwotCW1hYy0+cGh5X2Rldi0+YXV0b25lZyA9IEFVVE9ORUdfRU5BQkxFOwotCW1hYy0+cGh5X2Rldi0+c3BlZWQgPSAwOwotCW1hYy0+cGh5X2Rldi0+ZHVwbGV4ID0gMDsKKwkvKiBjb3VwbGUgcGh5ZGV2IHRvIG5ldF9kZXZpY2UgKi8KKwlpZiAobXRrX3BoeV9jb25uZWN0X25vZGUoZXRoLCBtYWMsIG5wKSkKKwkJZ290byBlcnJfcGh5OworCisJZGV2LT5waHlkZXYtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKKwlkZXYtPnBoeWRldi0+c3BlZWQgPSAwOworCWRldi0+cGh5ZGV2LT5kdXBsZXggPSAwOwogCiAJaWYgKG9mX3BoeV9pc19maXhlZF9saW5rKG1hYy0+b2Zfbm9kZSkpCi0JCW1hYy0+cGh5X2Rldi0+c3VwcG9ydGVkIHw9CisJCWRldi0+cGh5ZGV2LT5zdXBwb3J0ZWQgfD0KIAkJU1VQUE9SVEVEX1BhdXNlIHwgU1VQUE9SVEVEX0FzeW1fUGF1c2U7CiAKLQltYWMtPnBoeV9kZXYtPnN1cHBvcnRlZCAmPSBQSFlfR0JJVF9GRUFUVVJFUyB8IFNVUFBPUlRFRF9QYXVzZSB8CisJZGV2LT5waHlkZXYtPnN1cHBvcnRlZCAmPSBQSFlfR0JJVF9GRUFUVVJFUyB8IFNVUFBPUlRFRF9QYXVzZSB8CiAJCQkJICAgU1VQUE9SVEVEX0FzeW1fUGF1c2U7Ci0JbWFjLT5waHlfZGV2LT5hZHZlcnRpc2luZyA9IG1hYy0+cGh5X2Rldi0+c3VwcG9ydGVkIHwKKwlkZXYtPnBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBkZXYtPnBoeWRldi0+c3VwcG9ydGVkIHwKIAkJCQkgICAgQURWRVJUSVNFRF9BdXRvbmVnOwotCXBoeV9zdGFydF9hbmVnKG1hYy0+cGh5X2Rldik7CisJcGh5X3N0YXJ0X2FuZWcoZGV2LT5waHlkZXYpOwogCiAJb2Zfbm9kZV9wdXQobnApOwogCkBAIC0yODQsMTQgKzMxOSwxNCBAQAogCiBlcnJfcGh5OgogCW9mX25vZGVfcHV0KG5wKTsKLQlkZXZfZXJyKGV0aC0+ZGV2LCAiaW52YWxpZCBwaHlfbW9kZVxuIik7CisJZGV2X2VycihldGgtPmRldiwgIiVzOiBpbnZhbGlkIHBoeVxuIiwgX19mdW5jX18pOwogCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgaW50IG10a19tZGlvX2luaXQoc3RydWN0IG10a19ldGggKmV0aCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1paV9ucDsKLQlpbnQgZXJyOworCWludCByZXQ7CiAKIAltaWlfbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShldGgtPmRldi0+b2Zfbm9kZSwgIm1kaW8tYnVzIik7CiAJaWYgKCFtaWlfbnApIHsKQEAgLTMwMCwxMyArMzM1LDEzIEBACiAJfQogCiAJaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKG1paV9ucCkpIHsKLQkJZXJyID0gMDsKKwkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJfcHV0X25vZGU7CiAJfQogCi0JZXRoLT5taWlfYnVzID0gbWRpb2J1c19hbGxvYygpOworCWV0aC0+bWlpX2J1cyA9IGRldm1fbWRpb2J1c19hbGxvYyhldGgtPmRldik7CiAJaWYgKCFldGgtPm1paV9idXMpIHsKLQkJZXJyID0gLUVOT01FTTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfcHV0X25vZGU7CiAJfQogCkBAIC0zMTcsMTkgKzM1MiwxMSBAQAogCWV0aC0+bWlpX2J1cy0+cGFyZW50ID0gZXRoLT5kZXY7CiAKIAlzbnByaW50ZihldGgtPm1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIlcyIsIG1paV9ucC0+bmFtZSk7Ci0JZXJyID0gb2ZfbWRpb2J1c19yZWdpc3RlcihldGgtPm1paV9idXMsIG1paV9ucCk7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfZnJlZV9idXM7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2ZyZWVfYnVzOgotCW1kaW9idXNfZnJlZShldGgtPm1paV9idXMpOworCXJldCA9IG9mX21kaW9idXNfcmVnaXN0ZXIoZXRoLT5taWlfYnVzLCBtaWlfbnApOwogCiBlcnJfcHV0X25vZGU6CiAJb2Zfbm9kZV9wdXQobWlpX25wKTsKLQlldGgtPm1paV9idXMgPSBOVUxMOwotCXJldHVybiBlcnI7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgbXRrX21kaW9fY2xlYW51cChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQpAQCAtMzM4LDI5ICszNjUsMjkgQEAKIAkJcmV0dXJuOwogCiAJbWRpb2J1c191bnJlZ2lzdGVyKGV0aC0+bWlpX2J1cyk7Ci0Jb2Zfbm9kZV9wdXQoZXRoLT5taWlfYnVzLT5kZXYub2Zfbm9kZSk7Ci0JbWRpb2J1c19mcmVlKGV0aC0+bWlpX2J1cyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtdGtfaXJxX2Rpc2FibGUoc3RydWN0IG10a19ldGggKmV0aCwgdTMyIG1hc2spCitzdGF0aWMgaW5saW5lIHZvaWQgbXRrX2lycV9kaXNhYmxlKHN0cnVjdCBtdGtfZXRoICpldGgsCisJCQkJICAgdW5zaWduZWQgcmVnLCB1MzIgbWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiB2YWw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXRoLT5pcnFfbG9jaywgZmxhZ3MpOwotCXZhbCA9IG10a19yMzIoZXRoLCBNVEtfUURNQV9JTlRfTUFTSyk7Ci0JbXRrX3czMihldGgsIHZhbCAmIH5tYXNrLCBNVEtfUURNQV9JTlRfTUFTSyk7CisJdmFsID0gbXRrX3IzMihldGgsIHJlZyk7CisJbXRrX3czMihldGgsIHZhbCAmIH5tYXNrLCByZWcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0aC0+aXJxX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG10a19pcnFfZW5hYmxlKHN0cnVjdCBtdGtfZXRoICpldGgsIHUzMiBtYXNrKQorc3RhdGljIGlubGluZSB2b2lkIG10a19pcnFfZW5hYmxlKHN0cnVjdCBtdGtfZXRoICpldGgsCisJCQkJICB1bnNpZ25lZCByZWcsIHUzMiBtYXNrKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHZhbDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZldGgtPmlycV9sb2NrLCBmbGFncyk7Ci0JdmFsID0gbXRrX3IzMihldGgsIE1US19RRE1BX0lOVF9NQVNLKTsKLQltdGtfdzMyKGV0aCwgdmFsIHwgbWFzaywgTVRLX1FETUFfSU5UX01BU0spOworCXZhbCA9IG10a19yMzIoZXRoLCByZWcpOworCW10a193MzIoZXRoLCB2YWwgfCBtYXNrLCByZWcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0aC0+aXJxX2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMzY5LDE4ICszOTYsMjAgQEAKIAlpbnQgcmV0ID0gZXRoX21hY19hZGRyKGRldiwgcCk7CiAJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CiAJY29uc3QgY2hhciAqbWFjYWRkciA9IGRldi0+ZGV2X2FkZHI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWFjLT5ody0+cGFnZV9sb2NrLCBmbGFncyk7CisJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1US19SRVNFVFRJTkcsICZtYWMtPmh3LT5zdGF0ZSkpKQorCQlyZXR1cm4gLUVCVVNZOworCisJc3Bpbl9sb2NrX2JoKCZtYWMtPmh3LT5wYWdlX2xvY2spOwogCW10a193MzIobWFjLT5odywgKG1hY2FkZHJbMF0gPDwgOCkgfCBtYWNhZGRyWzFdLAogCQlNVEtfR0RNQV9NQUNfQURSSChtYWMtPmlkKSk7CiAJbXRrX3czMihtYWMtPmh3LCAobWFjYWRkclsyXSA8PCAyNCkgfCAobWFjYWRkclszXSA8PCAxNikgfAogCQkobWFjYWRkcls0XSA8PCA4KSB8IG1hY2FkZHJbNV0sCiAJCU1US19HRE1BX01BQ19BRFJMKG1hYy0+aWQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWMtPmh3LT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19iaCgmbWFjLT5ody0+cGFnZV9sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTg4LDE0ICs2MTcsMTUgQEAKIAlkbWFfYWRkcl90IG1hcHBlZF9hZGRyOwogCXVuc2lnbmVkIGludCBucl9mcmFnczsKIAlpbnQgaSwgbl9kZXNjID0gMTsKLQl1MzIgdHhkNCA9IDA7CisJdTMyIHR4ZDQgPSAwLCBmcG9ydDsKIAogCWl0eGQgPSByaW5nLT5uZXh0X2ZyZWU7CiAJaWYgKGl0eGQgPT0gcmluZy0+bGFzdF9mcmVlKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIHNldCB0aGUgZm9yd2FyZCBwb3J0ICovCi0JdHhkNCB8PSAobWFjLT5pZCArIDEpIDw8IFRYX0RNQV9GUE9SVF9TSElGVDsKKwlmcG9ydCA9IChtYWMtPmlkICsgMSkgPDwgVFhfRE1BX0ZQT1JUX1NISUZUOworCXR4ZDQgfD0gZnBvcnQ7CiAKIAl0eF9idWYgPSBtdGtfZGVzY190b190eF9idWYocmluZywgaXR4ZCk7CiAJbWVtc2V0KHR4X2J1ZiwgMCwgc2l6ZW9mKCp0eF9idWYpKTsKQEAgLTY1Myw3ICs2ODMsNyBAQAogCQkJV1JJVEVfT05DRSh0eGQtPnR4ZDMsIChUWF9ETUFfU1dDIHwKIAkJCQkJICAgICAgIFRYX0RNQV9QTEVOMChmcmFnX21hcF9zaXplKSB8CiAJCQkJCSAgICAgICBsYXN0X2ZyYWcgKiBUWF9ETUFfTFMwKSk7Ci0JCQlXUklURV9PTkNFKHR4ZC0+dHhkNCwgMCk7CisJCQlXUklURV9PTkNFKHR4ZC0+dHhkNCwgZnBvcnQpOwogCiAJCQl0eF9idWYtPnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKU1US19ETUFfRFVNTVlfREVTQzsKIAkJCXR4X2J1ZiA9IG10a19kZXNjX3RvX3R4X2J1ZihyaW5nLCB0eGQpOwpAQCAtNzY0LDcgKzc5NCw2IEBACiAJc3RydWN0IG10a19ldGggKmV0aCA9IG1hYy0+aHc7CiAJc3RydWN0IG10a190eF9yaW5nICpyaW5nID0gJmV0aC0+dHhfcmluZzsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgZ3NvID0gZmFsc2U7CiAJaW50IHR4X251bTsKIApAQCAtNzcyLDE0ICs4MDEsMTcgQEAKIAkgKiBob3dldmVyIHdlIGhhdmUgMiBxdWV1ZXMgcnVubmluZyBvbiB0aGUgc2FtZSByaW5nIHNvIHdlIG5lZWQgdG8gbG9jawogCSAqIHRoZSByaW5nIGFjY2VzcwogCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZldGgtPnBhZ2VfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmZXRoLT5wYWdlX2xvY2spOworCisJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1US19SRVNFVFRJTkcsICZldGgtPnN0YXRlKSkpCisJCWdvdG8gZHJvcDsKIAogCXR4X251bSA9IG10a19jYWxfdHhkX3JlcShza2IpOwogCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmcmluZy0+ZnJlZV9jb3VudCkgPD0gdHhfbnVtKSkgewogCQltdGtfc3RvcF9xdWV1ZShldGgpOwogCQluZXRpZl9lcnIoZXRoLCB0eF9xdWV1ZWQsIGRldiwKIAkJCSAgIlR4IFJpbmcgZnVsbCB3aGVuIHF1ZXVlIGF3YWtlIVxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0aC0+cGFnZV9sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrKCZldGgtPnBhZ2VfbG9jayk7CiAJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAl9CiAKQEAgLTgwNCwyMiArODM2LDYyIEBACiAJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZyaW5nLT5mcmVlX2NvdW50KSA8PSByaW5nLT50aHJlc2gpKQogCQltdGtfc3RvcF9xdWV1ZShldGgpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRoLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9jaygmZXRoLT5wYWdlX2xvY2spOwogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogZHJvcDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGgtPnBhZ2VfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrKCZldGgtPnBhZ2VfbG9jayk7CiAJc3RhdHMtPnR4X2Ryb3BwZWQrKzsKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIAorc3RhdGljIHN0cnVjdCBtdGtfcnhfcmluZyAqbXRrX2dldF9yeF9yaW5nKHN0cnVjdCBtdGtfZXRoICpldGgpCit7CisJaW50IGk7CisJc3RydWN0IG10a19yeF9yaW5nICpyaW5nOworCWludCBpZHg7CisKKwlpZiAoIWV0aC0+aHdscm8pCisJCXJldHVybiAmZXRoLT5yeF9yaW5nWzBdOworCisJZm9yIChpID0gMDsgaSA8IE1US19NQVhfUlhfUklOR19OVU07IGkrKykgeworCQlyaW5nID0gJmV0aC0+cnhfcmluZ1tpXTsKKwkJaWR4ID0gTkVYVF9SWF9ERVNQX0lEWChyaW5nLT5jYWxjX2lkeCwgcmluZy0+ZG1hX3NpemUpOworCQlpZiAocmluZy0+ZG1hW2lkeF0ucnhkMiAmIFJYX0RNQV9ET05FKSB7CisJCQlyaW5nLT5jYWxjX2lkeF91cGRhdGUgPSB0cnVlOworCQkJcmV0dXJuIHJpbmc7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgbXRrX3VwZGF0ZV9yeF9jcHVfaWR4KHN0cnVjdCBtdGtfZXRoICpldGgpCit7CisJc3RydWN0IG10a19yeF9yaW5nICpyaW5nOworCWludCBpOworCisJaWYgKCFldGgtPmh3bHJvKSB7CisJCXJpbmcgPSAmZXRoLT5yeF9yaW5nWzBdOworCQltdGtfdzMyKGV0aCwgcmluZy0+Y2FsY19pZHgsIHJpbmctPmNyeF9pZHhfcmVnKTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgTVRLX01BWF9SWF9SSU5HX05VTTsgaSsrKSB7CisJCQlyaW5nID0gJmV0aC0+cnhfcmluZ1tpXTsKKwkJCWlmIChyaW5nLT5jYWxjX2lkeF91cGRhdGUpIHsKKwkJCQlyaW5nLT5jYWxjX2lkeF91cGRhdGUgPSBmYWxzZTsKKwkJCQltdGtfdzMyKGV0aCwgcmluZy0+Y2FsY19pZHgsIHJpbmctPmNyeF9pZHhfcmVnKTsKKwkJCX0KKwkJfQorCX0KK30KKwogc3RhdGljIGludCBtdGtfcG9sbF9yeChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQsCiAJCSAgICAgICBzdHJ1Y3QgbXRrX2V0aCAqZXRoKQogewotCXN0cnVjdCBtdGtfcnhfcmluZyAqcmluZyA9ICZldGgtPnJ4X3Jpbmc7Ci0JaW50IGlkeCA9IHJpbmctPmNhbGNfaWR4OworCXN0cnVjdCBtdGtfcnhfcmluZyAqcmluZzsKKwlpbnQgaWR4OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdTggKmRhdGEsICpuZXdfZGF0YTsKIAlzdHJ1Y3QgbXRrX3J4X2RtYSAqcnhkLCB0cnhkOwpAQCAtODMxLDcgKzkwMywxMSBAQAogCQlkbWFfYWRkcl90IGRtYV9hZGRyOwogCQlpbnQgbWFjID0gMDsKIAotCQlpZHggPSBORVhUX1JYX0RFU1BfSURYKGlkeCk7CisJCXJpbmcgPSBtdGtfZ2V0X3J4X3JpbmcoZXRoKTsKKwkJaWYgKHVubGlrZWx5KCFyaW5nKSkKKwkJCWdvdG8gcnhfZG9uZTsKKworCQlpZHggPSBORVhUX1JYX0RFU1BfSURYKHJpbmctPmNhbGNfaWR4LCByaW5nLT5kbWFfc2l6ZSk7CiAJCXJ4ZCA9ICZyaW5nLT5kbWFbaWR4XTsKIAkJZGF0YSA9IHJpbmctPmRhdGFbaWR4XTsKIApAQCAtODQ2LDYgKzkyMiw5IEBACiAKIAkJbmV0ZGV2ID0gZXRoLT5uZXRkZXZbbWFjXTsKIAorCQlpZiAodW5saWtlbHkodGVzdF9iaXQoTVRLX1JFU0VUVElORywgJmV0aC0+c3RhdGUpKSkKKwkJCWdvdG8gcmVsZWFzZV9kZXNjOworCiAJCS8qIGFsbG9jIG5ldyBidWZmZXIgKi8KIAkJbmV3X2RhdGEgPSBuYXBpX2FsbG9jX2ZyYWcocmluZy0+ZnJhZ19zaXplKTsKIAkJaWYgKHVubGlrZWx5KCFuZXdfZGF0YSkpIHsKQEAgLTg2NSw3ICs5NDQsNyBAQAogCQkvKiByZWNlaXZlIGRhdGEgKi8KIAkJc2tiID0gYnVpbGRfc2tiKGRhdGEsIHJpbmctPmZyYWdfc2l6ZSk7CiAJCWlmICh1bmxpa2VseSghc2tiKSkgewotCQkJcHV0X3BhZ2UodmlydF90b19oZWFkX3BhZ2UobmV3X2RhdGEpKTsKKwkJCXNrYl9mcmVlX2ZyYWcobmV3X2RhdGEpOwogCQkJbmV0ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlnb3RvIHJlbGVhc2VfZGVzYzsKIAkJfQpAQCAtODk1LDE3ICs5NzQsMTkgQEAKIAkJcnhkLT5yeGQyID0gUlhfRE1BX1BMRU4wKHJpbmctPmJ1Zl9zaXplKTsKIAogCQlyaW5nLT5jYWxjX2lkeCA9IGlkeDsKKworCQlkb25lKys7CisJfQorCityeF9kb25lOgorCWlmIChkb25lKSB7CiAJCS8qIG1ha2Ugc3VyZSB0aGF0IGFsbCBjaGFuZ2VzIHRvIHRoZSBkbWEgcmluZyBhcmUgZmx1c2hlZCBiZWZvcmUKIAkJICogd2UgY29udGludWUKIAkJICovCiAJCXdtYigpOwotCQltdGtfdzMyKGV0aCwgcmluZy0+Y2FsY19pZHgsIE1US19RUlhfQ1JYX0lEWDApOwotCQlkb25lKys7CisJCW10a191cGRhdGVfcnhfY3B1X2lkeChldGgpOwogCX0KIAotCWlmIChkb25lIDwgYnVkZ2V0KQotCQltdGtfdzMyKGV0aCwgTVRLX1JYX0RPTkVfSU5ULCBNVEtfUU1US19JTlRfU1RBVFVTKTsKLQogCXJldHVybiBkb25lOwogfQogCkBAIC0xMDE0LDcgKzEwOTUsNyBAQAogCQlyZXR1cm4gYnVkZ2V0OwogCiAJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQltdGtfaXJxX2VuYWJsZShldGgsIE1US19UWF9ET05FX0lOVCk7CisJbXRrX2lycV9lbmFibGUoZXRoLCBNVEtfUURNQV9JTlRfTUFTSywgTVRLX1RYX0RPTkVfSU5UKTsKIAogCXJldHVybiB0eF9kb25lOwogfQpAQCAtMTAyNCwzMCArMTEwNSwzMyBAQAogCXN0cnVjdCBtdGtfZXRoICpldGggPSBjb250YWluZXJfb2YobmFwaSwgc3RydWN0IG10a19ldGgsIHJ4X25hcGkpOwogCXUzMiBzdGF0dXMsIG1hc2s7CiAJaW50IHJ4X2RvbmUgPSAwOworCWludCByZW1haW5fYnVkZ2V0ID0gYnVkZ2V0OwogCiAJbXRrX2hhbmRsZV9zdGF0dXNfaXJxKGV0aCk7Ci0JbXRrX3czMihldGgsIE1US19SWF9ET05FX0lOVCwgTVRLX1FNVEtfSU5UX1NUQVRVUyk7Ci0JcnhfZG9uZSA9IG10a19wb2xsX3J4KG5hcGksIGJ1ZGdldCwgZXRoKTsKKworcG9sbF9hZ2FpbjoKKwltdGtfdzMyKGV0aCwgTVRLX1JYX0RPTkVfSU5ULCBNVEtfUERNQV9JTlRfU1RBVFVTKTsKKwlyeF9kb25lID0gbXRrX3BvbGxfcngobmFwaSwgcmVtYWluX2J1ZGdldCwgZXRoKTsKIAogCWlmICh1bmxpa2VseShuZXRpZl9tc2dfaW50cihldGgpKSkgewotCQlzdGF0dXMgPSBtdGtfcjMyKGV0aCwgTVRLX1FNVEtfSU5UX1NUQVRVUyk7Ci0JCW1hc2sgPSBtdGtfcjMyKGV0aCwgTVRLX1FETUFfSU5UX01BU0spOworCQlzdGF0dXMgPSBtdGtfcjMyKGV0aCwgTVRLX1BETUFfSU5UX1NUQVRVUyk7CisJCW1hc2sgPSBtdGtfcjMyKGV0aCwgTVRLX1BETUFfSU5UX01BU0spOwogCQlkZXZfaW5mbyhldGgtPmRldiwKIAkJCSAiZG9uZSByeCAlZCwgaW50ciAweCUwOHgvMHgleFxuIiwKIAkJCSByeF9kb25lLCBzdGF0dXMsIG1hc2spOwogCX0KLQotCWlmIChyeF9kb25lID09IGJ1ZGdldCkKKwlpZiAocnhfZG9uZSA9PSByZW1haW5fYnVkZ2V0KQogCQlyZXR1cm4gYnVkZ2V0OwogCi0Jc3RhdHVzID0gbXRrX3IzMihldGgsIE1US19RTVRLX0lOVF9TVEFUVVMpOwotCWlmIChzdGF0dXMgJiBNVEtfUlhfRE9ORV9JTlQpCi0JCXJldHVybiBidWRnZXQ7Ci0KKwlzdGF0dXMgPSBtdGtfcjMyKGV0aCwgTVRLX1BETUFfSU5UX1NUQVRVUyk7CisJaWYgKHN0YXR1cyAmIE1US19SWF9ET05FX0lOVCkgeworCQlyZW1haW5fYnVkZ2V0IC09IHJ4X2RvbmU7CisJCWdvdG8gcG9sbF9hZ2FpbjsKKwl9CiAJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQltdGtfaXJxX2VuYWJsZShldGgsIE1US19SWF9ET05FX0lOVCk7CisJbXRrX2lycV9lbmFibGUoZXRoLCBNVEtfUERNQV9JTlRfTUFTSywgTVRLX1JYX0RPTkVfSU5UKTsKIAotCXJldHVybiByeF9kb25lOworCXJldHVybiByeF9kb25lICsgYnVkZ2V0IC0gcmVtYWluX2J1ZGdldDsKIH0KIAogc3RhdGljIGludCBtdGtfdHhfYWxsb2Moc3RydWN0IG10a19ldGggKmV0aCkKQEAgLTEwOTQsNiArMTE3OCw3IEBACiAJbXRrX3czMihldGgsCiAJCXJpbmctPnBoeXMgKyAoKE1US19ETUFfU0laRSAtIDEpICogc3opLAogCQlNVEtfUVRYX0RSWF9QVFIpOworCW10a193MzIoZXRoLCAoUURNQV9SRVNfVEhSRVMgPDwgOCkgfCBRRE1BX1JFU19USFJFUywgTVRLX1FUWF9DRkcoMCkpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTExMjIsMzIgKzEyMDcsNDEgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbXRrX3J4X2FsbG9jKHN0cnVjdCBtdGtfZXRoICpldGgpCitzdGF0aWMgaW50IG10a19yeF9hbGxvYyhzdHJ1Y3QgbXRrX2V0aCAqZXRoLCBpbnQgcmluZ19ubywgaW50IHJ4X2ZsYWcpCiB7Ci0Jc3RydWN0IG10a19yeF9yaW5nICpyaW5nID0gJmV0aC0+cnhfcmluZzsKKwlzdHJ1Y3QgbXRrX3J4X3JpbmcgKnJpbmcgPSAmZXRoLT5yeF9yaW5nW3Jpbmdfbm9dOworCWludCByeF9kYXRhX2xlbiwgcnhfZG1hX3NpemU7CiAJaW50IGk7CiAKLQlyaW5nLT5mcmFnX3NpemUgPSBtdGtfbWF4X2ZyYWdfc2l6ZShFVEhfREFUQV9MRU4pOworCWlmIChyeF9mbGFnID09IE1US19SWF9GTEFHU19IV0xSTykgeworCQlyeF9kYXRhX2xlbiA9IE1US19NQVhfTFJPX1JYX0xFTkdUSDsKKwkJcnhfZG1hX3NpemUgPSBNVEtfSFdfTFJPX0RNQV9TSVpFOworCX0gZWxzZSB7CisJCXJ4X2RhdGFfbGVuID0gRVRIX0RBVEFfTEVOOworCQlyeF9kbWFfc2l6ZSA9IE1US19ETUFfU0laRTsKKwl9CisKKwlyaW5nLT5mcmFnX3NpemUgPSBtdGtfbWF4X2ZyYWdfc2l6ZShyeF9kYXRhX2xlbik7CiAJcmluZy0+YnVmX3NpemUgPSBtdGtfbWF4X2J1Zl9zaXplKHJpbmctPmZyYWdfc2l6ZSk7Ci0JcmluZy0+ZGF0YSA9IGtjYWxsb2MoTVRLX0RNQV9TSVpFLCBzaXplb2YoKnJpbmctPmRhdGEpLAorCXJpbmctPmRhdGEgPSBrY2FsbG9jKHJ4X2RtYV9zaXplLCBzaXplb2YoKnJpbmctPmRhdGEpLAogCQkJICAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIXJpbmctPmRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZm9yIChpID0gMDsgaSA8IE1US19ETUFfU0laRTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHJ4X2RtYV9zaXplOyBpKyspIHsKIAkJcmluZy0+ZGF0YVtpXSA9IG5ldGRldl9hbGxvY19mcmFnKHJpbmctPmZyYWdfc2l6ZSk7CiAJCWlmICghcmluZy0+ZGF0YVtpXSkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXJpbmctPmRtYSA9IGRtYV9hbGxvY19jb2hlcmVudChldGgtPmRldiwKLQkJCQkgICAgICAgTVRLX0RNQV9TSVpFICogc2l6ZW9mKCpyaW5nLT5kbWEpLAorCQkJCSAgICAgICByeF9kbWFfc2l6ZSAqIHNpemVvZigqcmluZy0+ZG1hKSwKIAkJCQkgICAgICAgJnJpbmctPnBoeXMsCiAJCQkJICAgICAgIEdGUF9BVE9NSUMgfCBfX0dGUF9aRVJPKTsKIAlpZiAoIXJpbmctPmRtYSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlmb3IgKGkgPSAwOyBpIDwgTVRLX0RNQV9TSVpFOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcnhfZG1hX3NpemU7IGkrKykgewogCQlkbWFfYWRkcl90IGRtYV9hZGRyID0gZG1hX21hcF9zaW5nbGUoZXRoLT5kZXYsCiAJCQkJcmluZy0+ZGF0YVtpXSArIE5FVF9TS0JfUEFELAogCQkJCXJpbmctPmJ1Zl9zaXplLApAQCAtMTE1OCwyOCArMTI1MiwzMCBAQAogCiAJCXJpbmctPmRtYVtpXS5yeGQyID0gUlhfRE1BX1BMRU4wKHJpbmctPmJ1Zl9zaXplKTsKIAl9Ci0JcmluZy0+Y2FsY19pZHggPSBNVEtfRE1BX1NJWkUgLSAxOworCXJpbmctPmRtYV9zaXplID0gcnhfZG1hX3NpemU7CisJcmluZy0+Y2FsY19pZHhfdXBkYXRlID0gZmFsc2U7CisJcmluZy0+Y2FsY19pZHggPSByeF9kbWFfc2l6ZSAtIDE7CisJcmluZy0+Y3J4X2lkeF9yZWcgPSBNVEtfUFJYX0NSWF9JRFhfQ0ZHKHJpbmdfbm8pOwogCS8qIG1ha2Ugc3VyZSB0aGF0IGFsbCBjaGFuZ2VzIHRvIHRoZSBkbWEgcmluZyBhcmUgZmx1c2hlZCBiZWZvcmUgd2UKIAkgKiBjb250aW51ZQogCSAqLwogCXdtYigpOwogCi0JbXRrX3czMihldGgsIGV0aC0+cnhfcmluZy5waHlzLCBNVEtfUVJYX0JBU0VfUFRSMCk7Ci0JbXRrX3czMihldGgsIE1US19ETUFfU0laRSwgTVRLX1FSWF9NQVhfQ05UMCk7Ci0JbXRrX3czMihldGgsIGV0aC0+cnhfcmluZy5jYWxjX2lkeCwgTVRLX1FSWF9DUlhfSURYMCk7Ci0JbXRrX3czMihldGgsIE1US19QU1RfRFJYX0lEWDAsIE1US19RRE1BX1JTVF9JRFgpOwotCW10a193MzIoZXRoLCAoUURNQV9SRVNfVEhSRVMgPDwgOCkgfCBRRE1BX1JFU19USFJFUywgTVRLX1FUWF9DRkcoMCkpOworCW10a193MzIoZXRoLCByaW5nLT5waHlzLCBNVEtfUFJYX0JBU0VfUFRSX0NGRyhyaW5nX25vKSk7CisJbXRrX3czMihldGgsIHJ4X2RtYV9zaXplLCBNVEtfUFJYX01BWF9DTlRfQ0ZHKHJpbmdfbm8pKTsKKwltdGtfdzMyKGV0aCwgcmluZy0+Y2FsY19pZHgsIHJpbmctPmNyeF9pZHhfcmVnKTsKKwltdGtfdzMyKGV0aCwgTVRLX1BTVF9EUlhfSURYX0NGRyhyaW5nX25vKSwgTVRLX1BETUFfUlNUX0lEWCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbXRrX3J4X2NsZWFuKHN0cnVjdCBtdGtfZXRoICpldGgpCitzdGF0aWMgdm9pZCBtdGtfcnhfY2xlYW4oc3RydWN0IG10a19ldGggKmV0aCwgaW50IHJpbmdfbm8pCiB7Ci0Jc3RydWN0IG10a19yeF9yaW5nICpyaW5nID0gJmV0aC0+cnhfcmluZzsKKwlzdHJ1Y3QgbXRrX3J4X3JpbmcgKnJpbmcgPSAmZXRoLT5yeF9yaW5nW3Jpbmdfbm9dOwogCWludCBpOwogCiAJaWYgKHJpbmctPmRhdGEgJiYgcmluZy0+ZG1hKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBNVEtfRE1BX1NJWkU7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgcmluZy0+ZG1hX3NpemU7IGkrKykgewogCQkJaWYgKCFyaW5nLT5kYXRhW2ldKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFyaW5nLT5kbWFbaV0ucnhkMSkKQEAgLTExOTYsMTMgKzEyOTIsMjc1IEBACiAKIAlpZiAocmluZy0+ZG1hKSB7CiAJCWRtYV9mcmVlX2NvaGVyZW50KGV0aC0+ZGV2LAotCQkJCSAgTVRLX0RNQV9TSVpFICogc2l6ZW9mKCpyaW5nLT5kbWEpLAorCQkJCSAgcmluZy0+ZG1hX3NpemUgKiBzaXplb2YoKnJpbmctPmRtYSksCiAJCQkJICByaW5nLT5kbWEsCiAJCQkJICByaW5nLT5waHlzKTsKIAkJcmluZy0+ZG1hID0gTlVMTDsKIAl9CiB9CiAKK3N0YXRpYyBpbnQgbXRrX2h3bHJvX3J4X2luaXQoc3RydWN0IG10a19ldGggKmV0aCkKK3sKKwlpbnQgaTsKKwl1MzIgcmluZ19jdHJsX2R3MSA9IDAsIHJpbmdfY3RybF9kdzIgPSAwLCByaW5nX2N0cmxfZHczID0gMDsKKwl1MzIgbHJvX2N0cmxfZHcwID0gMCwgbHJvX2N0cmxfZHczID0gMDsKKworCS8qIHNldCBMUk8gcmluZ3MgdG8gYXV0by1sZWFybiBtb2RlcyAqLworCXJpbmdfY3RybF9kdzIgfD0gTVRLX1JJTkdfQVVUT19MRVJBTl9NT0RFOworCisJLyogdmFsaWRhdGUgTFJPIHJpbmcgKi8KKwlyaW5nX2N0cmxfZHcyIHw9IE1US19SSU5HX1ZMRDsKKworCS8qIHNldCBBR0UgdGltZXIgKHVuaXQ6IDIwdXMpICovCisJcmluZ19jdHJsX2R3MiB8PSBNVEtfUklOR19BR0VfVElNRV9IOworCXJpbmdfY3RybF9kdzEgfD0gTVRLX1JJTkdfQUdFX1RJTUVfTDsKKworCS8qIHNldCBtYXggQUdHIHRpbWVyICh1bml0OiAyMHVzKSAqLworCXJpbmdfY3RybF9kdzIgfD0gTVRLX1JJTkdfTUFYX0FHR19USU1FOworCisJLyogc2V0IG1heCBMUk8gQUdHIGNvdW50ICovCisJcmluZ19jdHJsX2R3MiB8PSBNVEtfUklOR19NQVhfQUdHX0NOVF9MOworCXJpbmdfY3RybF9kdzMgfD0gTVRLX1JJTkdfTUFYX0FHR19DTlRfSDsKKworCWZvciAoaSA9IDE7IGkgPCBNVEtfTUFYX1JYX1JJTkdfTlVNOyBpKyspIHsKKwkJbXRrX3czMihldGgsIHJpbmdfY3RybF9kdzEsIE1US19MUk9fQ1RSTF9EVzFfQ0ZHKGkpKTsKKwkJbXRrX3czMihldGgsIHJpbmdfY3RybF9kdzIsIE1US19MUk9fQ1RSTF9EVzJfQ0ZHKGkpKTsKKwkJbXRrX3czMihldGgsIHJpbmdfY3RybF9kdzMsIE1US19MUk9fQ1RSTF9EVzNfQ0ZHKGkpKTsKKwl9CisKKwkvKiBJUHY0IGNoZWNrc3VtIHVwZGF0ZSBlbmFibGUgKi8KKwlscm9fY3RybF9kdzAgfD0gTVRLX0wzX0NLU19VUERfRU47CisKKwkvKiBzd2l0Y2ggcHJpb3JpdHkgY29tcGFyaXNvbiB0byBwYWNrZXQgY291bnQgbW9kZSAqLworCWxyb19jdHJsX2R3MCB8PSBNVEtfTFJPX0FMVF9QS1RfQ05UX01PREU7CisKKwkvKiBiYW5kd2lkdGggdGhyZXNob2xkIHNldHRpbmcgKi8KKwltdGtfdzMyKGV0aCwgTVRLX0hXX0xST19CV19USFJFLCBNVEtfUERNQV9MUk9fQ1RSTF9EVzIpOworCisJLyogYXV0by1sZWFybiBzY29yZSBkZWx0YSBzZXR0aW5nICovCisJbXRrX3czMihldGgsIE1US19IV19MUk9fUkVQTEFDRV9ERUxUQSwgTVRLX1BETUFfTFJPX0FMVF9TQ09SRV9ERUxUQSk7CisKKwkvKiBzZXQgcmVmcmVzaCB0aW1lciBmb3IgYWx0ZXJpbmcgZmxvd3MgdG8gMSBzZWMuICh1bml0OiAyMHVzKSAqLworCW10a193MzIoZXRoLCAoTVRLX0hXX0xST19USU1FUl9VTklUIDw8IDE2KSB8IE1US19IV19MUk9fUkVGUkVTSF9USU1FLAorCQlNVEtfUERNQV9MUk9fQUxUX1JFRlJFU0hfVElNRVIpOworCisJLyogc2V0IEhXIExSTyBtb2RlICYgdGhlIG1heCBhZ2dyZWdhdGlvbiBjb3VudCBmb3IgcnggcGFja2V0cyAqLworCWxyb19jdHJsX2R3MyB8PSBNVEtfQURNQV9NT0RFIHwgKE1US19IV19MUk9fTUFYX0FHR19DTlQgJiAweGZmKTsKKworCS8qIHRoZSBtaW5pbWFsIHJlbWFpbmluZyByb29tIG9mIFNETDAgaW4gUlhEIGZvciBscm8gYWdncmVnYXRpb24gKi8KKwlscm9fY3RybF9kdzMgfD0gTVRLX0xST19NSU5fUlhEX1NETDsKKworCS8qIGVuYWJsZSBIVyBMUk8gKi8KKwlscm9fY3RybF9kdzAgfD0gTVRLX0xST19FTjsKKworCW10a193MzIoZXRoLCBscm9fY3RybF9kdzMsIE1US19QRE1BX0xST19DVFJMX0RXMyk7CisJbXRrX3czMihldGgsIGxyb19jdHJsX2R3MCwgTVRLX1BETUFfTFJPX0NUUkxfRFcwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtdGtfaHdscm9fcnhfdW5pbml0KHN0cnVjdCBtdGtfZXRoICpldGgpCit7CisJaW50IGk7CisJdTMyIHZhbDsKKworCS8qIHJlbGlucXVpc2ggbHJvIHJpbmdzLCBmbHVzaCBhZ2dyZWdhdGVkIHBhY2tldHMgKi8KKwltdGtfdzMyKGV0aCwgTVRLX0xST19SSU5HX1JFTElOUVVJU0hfUkVRLCBNVEtfUERNQV9MUk9fQ1RSTF9EVzApOworCisJLyogd2FpdCBmb3IgcmVsaW5xdWlzaG1lbnRzIGRvbmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQl2YWwgPSBtdGtfcjMyKGV0aCwgTVRLX1BETUFfTFJPX0NUUkxfRFcwKTsKKwkJaWYgKHZhbCAmIE1US19MUk9fUklOR19SRUxJTlFVSVNIX0RPTkUpIHsKKwkJCW1zbGVlcCgyMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisKKwkvKiBpbnZhbGlkYXRlIGxybyByaW5ncyAqLworCWZvciAoaSA9IDE7IGkgPCBNVEtfTUFYX1JYX1JJTkdfTlVNOyBpKyspCisJCW10a193MzIoZXRoLCAwLCBNVEtfTFJPX0NUUkxfRFcyX0NGRyhpKSk7CisKKwkvKiBkaXNhYmxlIEhXIExSTyAqLworCW10a193MzIoZXRoLCAwLCBNVEtfUERNQV9MUk9fQ1RSTF9EVzApOworfQorCitzdGF0aWMgdm9pZCBtdGtfaHdscm9fdmFsX2lwYWRkcihzdHJ1Y3QgbXRrX2V0aCAqZXRoLCBpbnQgaWR4LCBfX2JlMzIgaXApCit7CisJdTMyIHJlZ192YWw7CisKKwlyZWdfdmFsID0gbXRrX3IzMihldGgsIE1US19MUk9fQ1RSTF9EVzJfQ0ZHKGlkeCkpOworCisJLyogaW52YWxpZGF0ZSB0aGUgSVAgc2V0dGluZyAqLworCW10a193MzIoZXRoLCAocmVnX3ZhbCAmIH5NVEtfUklOR19NWUlQX1ZMRCksIE1US19MUk9fQ1RSTF9EVzJfQ0ZHKGlkeCkpOworCisJbXRrX3czMihldGgsIGlwLCBNVEtfTFJPX0RJUF9EVzBfQ0ZHKGlkeCkpOworCisJLyogdmFsaWRhdGUgdGhlIElQIHNldHRpbmcgKi8KKwltdGtfdzMyKGV0aCwgKHJlZ192YWwgfCBNVEtfUklOR19NWUlQX1ZMRCksIE1US19MUk9fQ1RSTF9EVzJfQ0ZHKGlkeCkpOworfQorCitzdGF0aWMgdm9pZCBtdGtfaHdscm9faW52YWxfaXBhZGRyKHN0cnVjdCBtdGtfZXRoICpldGgsIGludCBpZHgpCit7CisJdTMyIHJlZ192YWw7CisKKwlyZWdfdmFsID0gbXRrX3IzMihldGgsIE1US19MUk9fQ1RSTF9EVzJfQ0ZHKGlkeCkpOworCisJLyogaW52YWxpZGF0ZSB0aGUgSVAgc2V0dGluZyAqLworCW10a193MzIoZXRoLCAocmVnX3ZhbCAmIH5NVEtfUklOR19NWUlQX1ZMRCksIE1US19MUk9fQ1RSTF9EVzJfQ0ZHKGlkeCkpOworCisJbXRrX3czMihldGgsIDAsIE1US19MUk9fRElQX0RXMF9DRkcoaWR4KSk7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2h3bHJvX2dldF9pcF9jbnQoc3RydWN0IG10a19tYWMgKm1hYykKK3sKKwlpbnQgY250ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFYX0xST19JUF9DTlQ7IGkrKykgeworCQlpZiAobWFjLT5od2xyb19pcFtpXSkKKwkJCWNudCsrOworCX0KKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2h3bHJvX2FkZF9pcGFkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kKQoreworCXN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYyAqZnNwID0KKwkJKHN0cnVjdCBldGh0b29sX3J4X2Zsb3dfc3BlYyAqKSZjbWQtPmZzOworCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtdGtfZXRoICpldGggPSBtYWMtPmh3OworCWludCBod2xyb19pZHg7CisKKwlpZiAoKGZzcC0+Zmxvd190eXBlICE9IFRDUF9WNF9GTE9XKSB8fAorCSAgICAoIWZzcC0+aF91LnRjcF9pcDRfc3BlYy5pcDRkc3QpIHx8CisJICAgIChmc3AtPmxvY2F0aW9uID4gMSkpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFjLT5od2xyb19pcFtmc3AtPmxvY2F0aW9uXSA9IGh0b25sKGZzcC0+aF91LnRjcF9pcDRfc3BlYy5pcDRkc3QpOworCWh3bHJvX2lkeCA9IChtYWMtPmlkICogTVRLX01BWF9MUk9fSVBfQ05UKSArIGZzcC0+bG9jYXRpb247CisKKwltYWMtPmh3bHJvX2lwX2NudCA9IG10a19od2xyb19nZXRfaXBfY250KG1hYyk7CisKKwltdGtfaHdscm9fdmFsX2lwYWRkcihldGgsIGh3bHJvX2lkeCwgbWFjLT5od2xyb19pcFtmc3AtPmxvY2F0aW9uXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfaHdscm9fZGVsX2lwYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCit7CisJc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICpmc3AgPQorCQkoc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICopJmNtZC0+ZnM7CisJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG10a19ldGggKmV0aCA9IG1hYy0+aHc7CisJaW50IGh3bHJvX2lkeDsKKworCWlmIChmc3AtPmxvY2F0aW9uID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYWMtPmh3bHJvX2lwW2ZzcC0+bG9jYXRpb25dID0gMDsKKwlod2xyb19pZHggPSAobWFjLT5pZCAqIE1US19NQVhfTFJPX0lQX0NOVCkgKyBmc3AtPmxvY2F0aW9uOworCisJbWFjLT5od2xyb19pcF9jbnQgPSBtdGtfaHdscm9fZ2V0X2lwX2NudChtYWMpOworCisJbXRrX2h3bHJvX2ludmFsX2lwYWRkcihldGgsIGh3bHJvX2lkeCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXRrX2h3bHJvX25ldGRldl9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG10a19ldGggKmV0aCA9IG1hYy0+aHc7CisJaW50IGksIGh3bHJvX2lkeDsKKworCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFYX0xST19JUF9DTlQ7IGkrKykgeworCQltYWMtPmh3bHJvX2lwW2ldID0gMDsKKwkJaHdscm9faWR4ID0gKG1hYy0+aWQgKiBNVEtfTUFYX0xST19JUF9DTlQpICsgaTsKKworCQltdGtfaHdscm9faW52YWxfaXBhZGRyKGV0aCwgaHdscm9faWR4KTsKKwl9CisKKwltYWMtPmh3bHJvX2lwX2NudCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2h3bHJvX2dldF9mZGlyX2VudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBldGh0b29sX3J4bmZjICpjbWQpCit7CisJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICpmc3AgPQorCQkoc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICopJmNtZC0+ZnM7CisKKwkvKiBvbmx5IHRjcCBkc3QgaXB2NCBpcyBtZWFuaW5nZnVsLCBvdGhlcnMgYXJlIG1lYW5pbmdsZXNzICovCisJZnNwLT5mbG93X3R5cGUgPSBUQ1BfVjRfRkxPVzsKKwlmc3AtPmhfdS50Y3BfaXA0X3NwZWMuaXA0ZHN0ID0gbnRvaGwobWFjLT5od2xyb19pcFtmc3AtPmxvY2F0aW9uXSk7CisJZnNwLT5tX3UudGNwX2lwNF9zcGVjLmlwNGRzdCA9IDA7CisKKwlmc3AtPmhfdS50Y3BfaXA0X3NwZWMuaXA0c3JjID0gMDsKKwlmc3AtPm1fdS50Y3BfaXA0X3NwZWMuaXA0c3JjID0gMHhmZmZmZmZmZjsKKwlmc3AtPmhfdS50Y3BfaXA0X3NwZWMucHNyYyA9IDA7CisJZnNwLT5tX3UudGNwX2lwNF9zcGVjLnBzcmMgPSAweGZmZmY7CisJZnNwLT5oX3UudGNwX2lwNF9zcGVjLnBkc3QgPSAwOworCWZzcC0+bV91LnRjcF9pcDRfc3BlYy5wZHN0ID0gMHhmZmZmOworCWZzcC0+aF91LnRjcF9pcDRfc3BlYy50b3MgPSAwOworCWZzcC0+bV91LnRjcF9pcDRfc3BlYy50b3MgPSAweGZmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2h3bHJvX2dldF9mZGlyX2FsbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCwKKwkJCQkgIHUzMiAqcnVsZV9sb2NzKQoreworCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBjbnQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1US19NQVhfTFJPX0lQX0NOVDsgaSsrKSB7CisJCWlmIChtYWMtPmh3bHJvX2lwW2ldKSB7CisJCQlydWxlX2xvY3NbY250XSA9IGk7CisJCQljbnQrKzsKKwkJfQorCX0KKworCWNtZC0+cnVsZV9jbnQgPSBjbnQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5ldGRldl9mZWF0dXJlc190IG10a19maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKK3sKKwlpZiAoIShmZWF0dXJlcyAmIE5FVElGX0ZfTFJPKSkgeworCQlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwkJaW50IGlwX2NudCA9IG10a19od2xyb19nZXRfaXBfY250KG1hYyk7CisKKwkJaWYgKGlwX2NudCkgeworCQkJbmV0ZGV2X2luZm8oZGV2LCAiUlggZmxvdyBpcyBwcm9ncmFtbWVkLCBMUk8gc2hvdWxkIGtlZXAgb25cbiIpOworCisJCQlmZWF0dXJlcyB8PSBORVRJRl9GX0xSTzsKKwkJfQorCX0KKworCXJldHVybiBmZWF0dXJlczsKK30KKworc3RhdGljIGludCBtdGtfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQoreworCWludCBlcnIgPSAwOworCisJaWYgKCEoKGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlcykgJiBORVRJRl9GX0xSTykpCisJCXJldHVybiAwOworCisJaWYgKCEoZmVhdHVyZXMgJiBORVRJRl9GX0xSTykpCisJCW10a19od2xyb19uZXRkZXZfZGlzYWJsZShkZXYpOworCisJcmV0dXJuIGVycjsKK30KKwogLyogd2FpdCBmb3IgRE1BIHRvIGZpbmlzaCB3aGF0ZXZlciBpdCBpcyBkb2luZyBiZWZvcmUgd2Ugc3RhcnQgdXNpbmcgaXQgYWdhaW4gKi8KIHN0YXRpYyBpbnQgbXRrX2RtYV9idXN5X3dhaXQoc3RydWN0IG10a19ldGggKmV0aCkKIHsKQEAgLTEyMjMsNiArMTU4MSw3IEBACiBzdGF0aWMgaW50IG10a19kbWFfaW5pdChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQogewogCWludCBlcnI7CisJdTMyIGk7CiAKIAlpZiAobXRrX2RtYV9idXN5X3dhaXQoZXRoKSkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTEyMzgsMTAgKzE1OTcsMjEgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gbXRrX3J4X2FsbG9jKGV0aCk7CisJZXJyID0gbXRrX3J4X2FsbG9jKGV0aCwgMCwgTVRLX1JYX0ZMQUdTX05PUk1BTCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAorCWlmIChldGgtPmh3bHJvKSB7CisJCWZvciAoaSA9IDE7IGkgPCBNVEtfTUFYX1JYX1JJTkdfTlVNOyBpKyspIHsKKwkJCWVyciA9IG10a19yeF9hbGxvYyhldGgsIGksIE1US19SWF9GTEFHU19IV0xSTyk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJZXJyID0gbXRrX2h3bHJvX3J4X2luaXQoZXRoKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCiAJLyogRW5hYmxlIHJhbmRvbSBlYXJseSBkcm9wIGFuZCBzZXQgZHJvcCB0aHJlc2hvbGQgYXV0b21hdGljYWxseSAqLwogCW10a193MzIoZXRoLCBGQ19USFJFU19EUk9QX01PREUgfCBGQ19USFJFU19EUk9QX0VOIHwgRkNfVEhSRVNfTUlOLAogCQlNVEtfUURNQV9GQ19USFJFUyk7CkBAIC0xMjY2LDcgKzE2MzYsMTQgQEAKIAkJZXRoLT5waHlfc2NyYXRjaF9yaW5nID0gMDsKIAl9CiAJbXRrX3R4X2NsZWFuKGV0aCk7Ci0JbXRrX3J4X2NsZWFuKGV0aCk7CisJbXRrX3J4X2NsZWFuKGV0aCwgMCk7CisKKwlpZiAoZXRoLT5od2xybykgeworCQltdGtfaHdscm9fcnhfdW5pbml0KGV0aCk7CisJCWZvciAoaSA9IDE7IGkgPCBNVEtfTUFYX1JYX1JJTkdfTlVNOyBpKyspCisJCQltdGtfcnhfY2xlYW4oZXRoLCBpKTsKKwl9CisKIAlrZnJlZShldGgtPnNjcmF0Y2hfaGVhZCk7CiB9CiAKQEAgLTEyODcsNyArMTY2NCw3IEBACiAKIAlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmZXRoLT5yeF9uYXBpKSkpIHsKIAkJX19uYXBpX3NjaGVkdWxlKCZldGgtPnJ4X25hcGkpOwotCQltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfUlhfRE9ORV9JTlQpOworCQltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfUERNQV9JTlRfTUFTSywgTVRLX1JYX0RPTkVfSU5UKTsKIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0xMjk5LDcgKzE2NzYsNyBAQAogCiAJaWYgKGxpa2VseShuYXBpX3NjaGVkdWxlX3ByZXAoJmV0aC0+dHhfbmFwaSkpKSB7CiAJCV9fbmFwaV9zY2hlZHVsZSgmZXRoLT50eF9uYXBpKTsKLQkJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1RYX0RPTkVfSU5UKTsKKwkJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1FETUFfSU5UX01BU0ssIE1US19UWF9ET05FX0lOVCk7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMTMxMCwxMSArMTY4NywxMiBAQAogewogCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtdGtfZXRoICpldGggPSBtYWMtPmh3OwotCXUzMiBpbnRfbWFzayA9IE1US19UWF9ET05FX0lOVCB8IE1US19SWF9ET05FX0lOVDsKIAotCW10a19pcnFfZGlzYWJsZShldGgsIGludF9tYXNrKTsKKwltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfUURNQV9JTlRfTUFTSywgTVRLX1RYX0RPTkVfSU5UKTsKKwltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfUERNQV9JTlRfTUFTSywgTVRLX1JYX0RPTkVfSU5UKTsKIAltdGtfaGFuZGxlX2lycV9yeChldGgtPmlycVsyXSwgZGV2KTsKLQltdGtfaXJxX2VuYWJsZShldGgsIGludF9tYXNrKTsKKwltdGtfaXJxX2VuYWJsZShldGgsIE1US19RRE1BX0lOVF9NQVNLLCBNVEtfVFhfRE9ORV9JTlQpOworCW10a19pcnFfZW5hYmxlKGV0aCwgTVRLX1BETUFfSU5UX01BU0ssIE1US19SWF9ET05FX0lOVCk7CiB9CiAjZW5kaWYKIApAQCAtMTMyOSwxMSArMTcwNywxNSBAQAogCX0KIAogCW10a193MzIoZXRoLAotCQlNVEtfVFhfV0JfRERPTkUgfCBNVEtfUlhfRE1BX0VOIHwgTVRLX1RYX0RNQV9FTiB8Ci0JCU1US19SWF8yQl9PRkZTRVQgfCBNVEtfRE1BX1NJWkVfMTZEV09SRFMgfAotCQlNVEtfUlhfQlRfMzJEV09SRFMgfCBNVEtfTkRQX0NPX1BSTywKKwkJTVRLX1RYX1dCX0RET05FIHwgTVRLX1RYX0RNQV9FTiB8CisJCU1US19ETUFfU0laRV8xNkRXT1JEUyB8IE1US19ORFBfQ09fUFJPLAogCQlNVEtfUURNQV9HTE9fQ0ZHKTsKIAorCW10a193MzIoZXRoLAorCQlNVEtfUlhfRE1BX0VOIHwgTVRLX1JYXzJCX09GRlNFVCB8CisJCU1US19SWF9CVF8zMkRXT1JEUyB8IE1US19NVUxUSV9FTiwKKwkJTVRLX1BETUFfR0xPX0NGRyk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM1MSwxMSArMTczMywxMiBAQAogCiAJCW5hcGlfZW5hYmxlKCZldGgtPnR4X25hcGkpOwogCQluYXBpX2VuYWJsZSgmZXRoLT5yeF9uYXBpKTsKLQkJbXRrX2lycV9lbmFibGUoZXRoLCBNVEtfVFhfRE9ORV9JTlQgfCBNVEtfUlhfRE9ORV9JTlQpOworCQltdGtfaXJxX2VuYWJsZShldGgsIE1US19RRE1BX0lOVF9NQVNLLCBNVEtfVFhfRE9ORV9JTlQpOworCQltdGtfaXJxX2VuYWJsZShldGgsIE1US19QRE1BX0lOVF9NQVNLLCBNVEtfUlhfRE9ORV9JTlQpOwogCX0KIAlhdG9taWNfaW5jKCZldGgtPmRtYV9yZWZjbnQpOwogCi0JcGh5X3N0YXJ0KG1hYy0+cGh5X2Rldik7CisJcGh5X3N0YXJ0KGRldi0+cGh5ZGV2KTsKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC0xMzYzLDE2ICsxNzQ2LDE1IEBACiAKIHN0YXRpYyB2b2lkIG10a19zdG9wX2RtYShzdHJ1Y3QgbXRrX2V0aCAqZXRoLCB1MzIgZ2xvX2NmZykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiB2YWw7CiAJaW50IGk7CiAKIAkvKiBzdG9wIHRoZSBkbWEgZW5naW5lICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmV0aC0+cGFnZV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2JoKCZldGgtPnBhZ2VfbG9jayk7CiAJdmFsID0gbXRrX3IzMihldGgsIGdsb19jZmcpOwogCW10a193MzIoZXRoLCB2YWwgJiB+KE1US19UWF9XQl9ERE9ORSB8IE1US19SWF9ETUFfRU4gfCBNVEtfVFhfRE1BX0VOKSwKIAkJZ2xvX2NmZyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRoLT5wYWdlX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19iaCgmZXRoLT5wYWdlX2xvY2spOwogCiAJLyogd2FpdCBmb3IgZG1hIHN0b3AgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewpAQCAtMTM5MSwzMiArMTc3Myw2MyBAQAogCXN0cnVjdCBtdGtfZXRoICpldGggPSBtYWMtPmh3OwogCiAJbmV0aWZfdHhfZGlzYWJsZShkZXYpOwotCXBoeV9zdG9wKG1hYy0+cGh5X2Rldik7CisJcGh5X3N0b3AoZGV2LT5waHlkZXYpOwogCiAJLyogb25seSBzaHV0ZG93biBETUEgaWYgdGhpcyBpcyB0aGUgbGFzdCB1c2VyICovCiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZldGgtPmRtYV9yZWZjbnQpKQogCQlyZXR1cm4gMDsKIAotCW10a19pcnFfZGlzYWJsZShldGgsIE1US19UWF9ET05FX0lOVCB8IE1US19SWF9ET05FX0lOVCk7CisJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1FETUFfSU5UX01BU0ssIE1US19UWF9ET05FX0lOVCk7CisJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1BETUFfSU5UX01BU0ssIE1US19SWF9ET05FX0lOVCk7CiAJbmFwaV9kaXNhYmxlKCZldGgtPnR4X25hcGkpOwogCW5hcGlfZGlzYWJsZSgmZXRoLT5yeF9uYXBpKTsKIAogCW10a19zdG9wX2RtYShldGgsIE1US19RRE1BX0dMT19DRkcpOworCW10a19zdG9wX2RtYShldGgsIE1US19QRE1BX0dMT19DRkcpOwogCiAJbXRrX2RtYV9mcmVlKGV0aCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgbXRrX2h3X2luaXQoc3RydWN0IG10a19ldGggKmV0aCkKK3N0YXRpYyB2b2lkIGV0aHN5c19yZXNldChzdHJ1Y3QgbXRrX2V0aCAqZXRoLCB1MzIgcmVzZXRfYml0cykKIHsKLQlpbnQgZXJyLCBpOworCXJlZ21hcF91cGRhdGVfYml0cyhldGgtPmV0aHN5cywgRVRIU1lTX1JTVENUUkwsCisJCQkgICByZXNldF9iaXRzLAorCQkJICAgcmVzZXRfYml0cyk7CiAKLQkvKiByZXNldCB0aGUgZnJhbWUgZW5naW5lICovCi0JcmVzZXRfY29udHJvbF9hc3NlcnQoZXRoLT5yc3RjKTsKLQl1c2xlZXBfcmFuZ2UoMTAsIDIwKTsKLQlyZXNldF9jb250cm9sX2RlYXNzZXJ0KGV0aC0+cnN0Yyk7Ci0JdXNsZWVwX3JhbmdlKDEwLCAyMCk7CisJdXNsZWVwX3JhbmdlKDEwMDAsIDExMDApOworCXJlZ21hcF91cGRhdGVfYml0cyhldGgtPmV0aHN5cywgRVRIU1lTX1JTVENUUkwsCisJCQkgICByZXNldF9iaXRzLAorCQkJICAgfnJlc2V0X2JpdHMpOworCW1kZWxheSgxMCk7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2h3X2luaXQoc3RydWN0IG10a19ldGggKmV0aCkKK3sKKwlpbnQgaSwgdmFsOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoTVRLX0hXX0lOSVQsICZldGgtPnN0YXRlKSkKKwkJcmV0dXJuIDA7CisKKwlwbV9ydW50aW1lX2VuYWJsZShldGgtPmRldik7CisJcG1fcnVudGltZV9nZXRfc3luYyhldGgtPmRldik7CisKKwljbGtfcHJlcGFyZV9lbmFibGUoZXRoLT5jbGtzW01US19DTEtfRVRISUZdKTsKKwljbGtfcHJlcGFyZV9lbmFibGUoZXRoLT5jbGtzW01US19DTEtfRVNXXSk7CisJY2xrX3ByZXBhcmVfZW5hYmxlKGV0aC0+Y2xrc1tNVEtfQ0xLX0dQMV0pOworCWNsa19wcmVwYXJlX2VuYWJsZShldGgtPmNsa3NbTVRLX0NMS19HUDJdKTsKKwlldGhzeXNfcmVzZXQoZXRoLCBSU1RDVFJMX0ZFKTsKKwlldGhzeXNfcmVzZXQoZXRoLCBSU1RDVFJMX1BQRSk7CisKKwlyZWdtYXBfcmVhZChldGgtPmV0aHN5cywgRVRIU1lTX1NZU0NGRzAsICZ2YWwpOworCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFDX0NPVU5UOyBpKyspIHsKKwkJaWYgKCFldGgtPm1hY1tpXSkKKwkJCWNvbnRpbnVlOworCQl2YWwgJj0gflNZU0NGRzBfR0VfTU9ERShTWVNDRkcwX0dFX01BU0ssIGV0aC0+bWFjW2ldLT5pZCk7CisJCXZhbCB8PSBTWVNDRkcwX0dFX01PREUoZXRoLT5tYWNbaV0tPmdlX21vZGUsIGV0aC0+bWFjW2ldLT5pZCk7CisJfQorCXJlZ21hcF93cml0ZShldGgtPmV0aHN5cywgRVRIU1lTX1NZU0NGRzAsIHZhbCk7CiAKIAkvKiBTZXQgR0UyIGRyaXZpbmcgYW5kIHNsZXcgcmF0ZSAqLwogCXJlZ21hcF93cml0ZShldGgtPnBjdGwsIEdQSU9fRFJWX1NFTDEwLCAweGEwMCk7CkBAIC0xNDM2LDIyICsxODQ5LDExIEBACiAJLyogRW5hYmxlIFJYIFZMYW4gT2ZmbG9hZGluZyAqLwogCW10a193MzIoZXRoLCAxLCBNVEtfQ0RNUF9FR19DVFJMKTsKIAotCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoZXRoLT5kZXYsIGV0aC0+aXJxWzFdLCBtdGtfaGFuZGxlX2lycV90eCwgMCwKLQkJCSAgICAgICBkZXZfbmFtZShldGgtPmRldiksIGV0aCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKGV0aC0+ZGV2LCBldGgtPmlycVsyXSwgbXRrX2hhbmRsZV9pcnFfcngsIDAsCi0JCQkgICAgICAgZGV2X25hbWUoZXRoLT5kZXYpLCBldGgpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBtdGtfbWRpb19pbml0KGV0aCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQogCS8qIGRpc2FibGUgZGVsYXkgYW5kIG5vcm1hbCBpbnRlcnJ1cHQgKi8KIAltdGtfdzMyKGV0aCwgMCwgTVRLX1FETUFfREVMQVlfSU5UKTsKLQltdGtfaXJxX2Rpc2FibGUoZXRoLCB+MCk7CisJbXRrX3czMihldGgsIDAsIE1US19QRE1BX0RFTEFZX0lOVCk7CisJbXRrX2lycV9kaXNhYmxlKGV0aCwgTVRLX1FETUFfSU5UX01BU0ssIH4wKTsKKwltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfUERNQV9JTlRfTUFTSywgfjApOwogCW10a193MzIoZXRoLCBSU1RfR0xfUFNFLCBNVEtfUlNUX0dMKTsKIAltdGtfdzMyKGV0aCwgMCwgTVRLX1JTVF9HTCk7CiAKQEAgLTE0NjUsOSArMTg2Nyw4IEBACiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQl1MzIgdmFsID0gbXRrX3IzMihldGgsIE1US19HRE1BX0ZXRF9DRkcoaSkpOwogCi0JCS8qIHNldHVwIHRoZSBmb3J3YXJkIHBvcnQgdG8gc2VuZCBmcmFtZSB0byBRRE1BICovCisJCS8qIHNldHVwIHRoZSBmb3J3YXJkIHBvcnQgdG8gc2VuZCBmcmFtZSB0byBQRE1BICovCiAJCXZhbCAmPSB+MHhmZmZmOwotCQl2YWwgfD0gMHg1NTU1OwogCiAJCS8qIEVuYWJsZSBSWCBjaGVja3N1bSAqLwogCQl2YWwgfD0gTVRLX0dETUFfSUNTX0VOIHwgTVRLX0dETUFfVENTX0VOIHwgTVRLX0dETUFfVUNTX0VOOwpAQCAtMTQ3OSw2ICsxODgwLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbXRrX2h3X2RlaW5pdChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQoreworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE1US19IV19JTklULCAmZXRoLT5zdGF0ZSkpCisJCXJldHVybiAwOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGV0aC0+Y2xrc1tNVEtfQ0xLX0dQMl0pOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShldGgtPmNsa3NbTVRLX0NMS19HUDFdKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZXRoLT5jbGtzW01US19DTEtfRVNXXSk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGV0aC0+Y2xrc1tNVEtfQ0xLX0VUSElGXSk7CisKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGV0aC0+ZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoZXRoLT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IG10a19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CkBAIC0xNDk3LDcgKzE5MTQsNyBAQAogCQlkZXYtPmFkZHJfYXNzaWduX3R5cGUgPSBORVRfQUREUl9SQU5ET007CiAJfQogCi0JcmV0dXJuIG10a19waHlfY29ubmVjdChtYWMpOworCXJldHVybiBtdGtfcGh5X2Nvbm5lY3QoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgbXRrX3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTUwNSwyMiArMTkyMiwxOCBAQAogCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtdGtfZXRoICpldGggPSBtYWMtPmh3OwogCi0JcGh5X2Rpc2Nvbm5lY3QobWFjLT5waHlfZGV2KTsKLQltdGtfbWRpb19jbGVhbnVwKGV0aCk7Ci0JbXRrX2lycV9kaXNhYmxlKGV0aCwgfjApOwotCWZyZWVfaXJxKGV0aC0+aXJxWzFdLCBkZXYpOwotCWZyZWVfaXJxKGV0aC0+aXJxWzJdLCBkZXYpOworCXBoeV9kaXNjb25uZWN0KGRldi0+cGh5ZGV2KTsKKwltdGtfaXJxX2Rpc2FibGUoZXRoLCBNVEtfUURNQV9JTlRfTUFTSywgfjApOworCW10a19pcnFfZGlzYWJsZShldGgsIE1US19QRE1BX0lOVF9NQVNLLCB+MCk7CiB9CiAKIHN0YXRpYyBpbnQgbXRrX2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQogewotCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwotCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNJT0NHTUlJUEhZOgogCWNhc2UgU0lPQ0dNSUlSRUc6CiAJY2FzZSBTSU9DU01JSVJFRzoKLQkJcmV0dXJuIHBoeV9taWlfaW9jdGwobWFjLT5waHlfZGV2LCBpZnIsIGNtZCk7CisJCXJldHVybiBwaHlfbWlpX2lvY3RsKGRldi0+cGh5ZGV2LCBpZnIsIGNtZCk7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMTUzNiw2ICsxOTQ5LDEyIEBACiAKIAlydG5sX2xvY2soKTsKIAorCWRldl9kYmcoZXRoLT5kZXYsICJbJXNdWyVkXSByZXNldFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0X2xvY2soTVRLX1JFU0VUVElORywgJmV0aC0+c3RhdGUpKQorCQljcHVfcmVsYXgoKTsKKworCWRldl9kYmcoZXRoLT5kZXYsICJbJXNdWyVkXSBtdGtfc3RvcCBzdGFydHNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJLyogc3RvcCBhbGwgZGV2aWNlcyB0byBtYWtlIHN1cmUgdGhhdCBkbWEgaXMgcHJvcGVybHkgc2h1dCBkb3duICovCiAJZm9yIChpID0gMDsgaSA8IE1US19NQUNfQ09VTlQ7IGkrKykgewogCQlpZiAoIWV0aC0+bmV0ZGV2W2ldKQpAQCAtMTU0Myw2ICsxOTYyLDI3IEBACiAJCW10a19zdG9wKGV0aC0+bmV0ZGV2W2ldKTsKIAkJX19zZXRfYml0KGksICZyZXN0YXJ0KTsKIAl9CisJZGV2X2RiZyhldGgtPmRldiwgIlslc11bJWRdIG10a19zdG9wIGVuZHNcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwkvKiByZXN0YXJ0IHVuZGVybHlpbmcgaGFyZHdhcmUgc3VjaCBhcyBwb3dlciwgY2xvY2ssIHBpbiBtdXgKKwkgKiBhbmQgdGhlIGNvbm5lY3RlZCBwaHkKKwkgKi8KKwltdGtfaHdfZGVpbml0KGV0aCk7CisKKwlpZiAoZXRoLT5kZXYtPnBpbnMpCisJCXBpbmN0cmxfc2VsZWN0X3N0YXRlKGV0aC0+ZGV2LT5waW5zLT5wLAorCQkJCSAgICAgZXRoLT5kZXYtPnBpbnMtPmRlZmF1bHRfc3RhdGUpOworCW10a19od19pbml0KGV0aCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVRLX01BQ19DT1VOVDsgaSsrKSB7CisJCWlmICghZXRoLT5tYWNbaV0gfHwKKwkJICAgIG9mX3BoeV9pc19maXhlZF9saW5rKGV0aC0+bWFjW2ldLT5vZl9ub2RlKSkKKwkJCWNvbnRpbnVlOworCQllcnIgPSBwaHlfaW5pdF9odyhldGgtPm5ldGRldltpXS0+cGh5ZGV2KTsKKwkJaWYgKGVycikKKwkJCWRldl9lcnIoZXRoLT5kZXYsICIlczogUEhZIGluaXQgZmFpbGVkLlxuIiwKKwkJCQlldGgtPm5ldGRldltpXS0+bmFtZSk7CisJfQogCiAJLyogcmVzdGFydCBETUEgYW5kIGVuYWJsZSBJUlFzICovCiAJZm9yIChpID0gMDsgaSA8IE1US19NQUNfQ09VTlQ7IGkrKykgewpAQCAtMTU1NSw1MSArMTk5NSw2OSBAQAogCQkJZGV2X2Nsb3NlKGV0aC0+bmV0ZGV2W2ldKTsKIAkJfQogCX0KKworCWRldl9kYmcoZXRoLT5kZXYsICJbJXNdWyVkXSByZXNldCBkb25lXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJY2xlYXJfYml0X3VubG9jayhNVEtfUkVTRVRUSU5HLCAmZXRoLT5zdGF0ZSk7CisKIAlydG5sX3VubG9jaygpOwogfQogCi1zdGF0aWMgaW50IG10a19jbGVhbnVwKHN0cnVjdCBtdGtfZXRoICpldGgpCitzdGF0aWMgaW50IG10a19mcmVlX2RldihzdHJ1Y3QgbXRrX2V0aCAqZXRoKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1US19NQUNfQ09VTlQ7IGkrKykgewogCQlpZiAoIWV0aC0+bmV0ZGV2W2ldKQogCQkJY29udGludWU7Ci0KLQkJdW5yZWdpc3Rlcl9uZXRkZXYoZXRoLT5uZXRkZXZbaV0pOwogCQlmcmVlX25ldGRldihldGgtPm5ldGRldltpXSk7CiAJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRrX3VucmVnX2RldihzdHJ1Y3QgbXRrX2V0aCAqZXRoKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1US19NQUNfQ09VTlQ7IGkrKykgeworCQlpZiAoIWV0aC0+bmV0ZGV2W2ldKQorCQkJY29udGludWU7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGV0aC0+bmV0ZGV2W2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfY2xlYW51cChzdHJ1Y3QgbXRrX2V0aCAqZXRoKQoreworCW10a191bnJlZ19kZXYoZXRoKTsKKwltdGtfZnJlZV9kZXYoZXRoKTsKIAljYW5jZWxfd29ya19zeW5jKCZldGgtPnBlbmRpbmdfd29yayk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdGtfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IG10a19nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewotCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBlcnI7CisJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KG5kZXYpOwogCi0JZXJyID0gcGh5X3JlYWRfc3RhdHVzKG1hYy0+cGh5X2Rldik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1US19SRVNFVFRJTkcsICZtYWMtPmh3LT5zdGF0ZSkpKQorCQlyZXR1cm4gLUVCVVNZOwogCi0JcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQobWFjLT5waHlfZGV2LCBjbWQpOworCXJldHVybiBwaHlfZXRodG9vbF9rc2V0dGluZ3NfZ2V0KG5kZXYtPnBoeWRldiwgY21kKTsKIH0KIAotc3RhdGljIGludCBtdGtfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCitzdGF0aWMgaW50IG10a19zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewotCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtdGtfbWFjICptYWMgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAotCWlmIChjbWQtPnBoeV9hZGRyZXNzICE9IG1hYy0+cGh5X2Rldi0+bWRpby5hZGRyKSB7Ci0JCW1hYy0+cGh5X2RldiA9IG1kaW9idXNfZ2V0X3BoeShtYWMtPmh3LT5taWlfYnVzLAotCQkJCQkgICAgICAgY21kLT5waHlfYWRkcmVzcyk7Ci0JCWlmICghbWFjLT5waHlfZGV2KQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNVEtfUkVTRVRUSU5HLCAmbWFjLT5ody0+c3RhdGUpKSkKKwkJcmV0dXJuIC1FQlVTWTsKIAotCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KG1hYy0+cGh5X2RldiwgY21kKTsKKwlyZXR1cm4gcGh5X2V0aHRvb2xfa3NldHRpbmdzX3NldChuZGV2LT5waHlkZXYsIGNtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIG10a19nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTYzMCw3ICsyMDg4LDEwIEBACiB7CiAJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CiAKLQlyZXR1cm4gZ2VucGh5X3Jlc3RhcnRfYW5lZyhtYWMtPnBoeV9kZXYpOworCWlmICh1bmxpa2VseSh0ZXN0X2JpdChNVEtfUkVTRVRUSU5HLCAmbWFjLT5ody0+c3RhdGUpKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiBnZW5waHlfcmVzdGFydF9hbmVnKGRldi0+cGh5ZGV2KTsKIH0KIAogc3RhdGljIHUzMiBtdGtfZ2V0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTE2MzgsMTEgKzIwOTksMTQgQEAKIAlzdHJ1Y3QgbXRrX21hYyAqbWFjID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgZXJyOwogCi0JZXJyID0gZ2VucGh5X3VwZGF0ZV9saW5rKG1hYy0+cGh5X2Rldik7CisJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1US19SRVNFVFRJTkcsICZtYWMtPmh3LT5zdGF0ZSkpKQorCQlyZXR1cm4gLUVCVVNZOworCisJZXJyID0gZ2VucGh5X3VwZGF0ZV9saW5rKGRldi0+cGh5ZGV2KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXRodG9vbF9vcF9nZXRfbGluayhkZXYpOwogCi0JcmV0dXJuIG1hYy0+cGh5X2Rldi0+bGluazsKKwlyZXR1cm4gZGV2LT5waHlkZXYtPmxpbms7CiB9CiAKIHN0YXRpYyB2b2lkIG10a19nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqZGF0YSkKQEAgLTE2NzgsNiArMjE0Miw5IEBACiAJdW5zaWduZWQgaW50IHN0YXJ0OwogCWludCBpOwogCisJaWYgKHVubGlrZWx5KHRlc3RfYml0KE1US19SRVNFVFRJTkcsICZtYWMtPmh3LT5zdGF0ZSkpKQorCQlyZXR1cm47CisKIAlpZiAobmV0aWZfcnVubmluZyhkZXYpICYmIG5ldGlmX2RldmljZV9wcmVzZW50KGRldikpIHsKIAkJaWYgKHNwaW5fdHJ5bG9jaygmaHdzdGF0cy0+c3RhdHNfbG9jaykpIHsKIAkJCW10a19zdGF0c191cGRhdGVfbWFjKG1hYyk7CkBAIC0xNjg1LDggKzIxNTIsOSBAQAogCQl9CiAJfQogCisJZGF0YV9zcmMgPSAodTY0ICopaHdzdGF0czsKKwogCWRvIHsKLQkJZGF0YV9zcmMgPSAodTY0Kilod3N0YXRzOwogCQlkYXRhX2RzdCA9IGRhdGE7CiAJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2lycSgmaHdzdGF0cy0+c3luY3ApOwogCkBAIC0xNjk1LDkgKzIxNjMsNjUgQEAKIAl9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnlfaXJxKCZod3N0YXRzLT5zeW5jcCwgc3RhcnQpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBtdGtfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncwkJPSBtdGtfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJCT0gbXRrX3NldF9zZXR0aW5ncywKK3N0YXRpYyBpbnQgbXRrX2dldF9yeG5mYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kLAorCQkJIHUzMiAqcnVsZV9sb2NzKQoreworCWludCByZXQgPSAtRU9QTk9UU1VQUDsKKworCXN3aXRjaCAoY21kLT5jbWQpIHsKKwljYXNlIEVUSFRPT0xfR1JYUklOR1M6CisJCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pIHsKKwkJCWNtZC0+ZGF0YSA9IE1US19NQVhfUlhfUklOR19OVU07CisJCQlyZXQgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HUlhDTFNSTENOVDoKKwkJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xSTykgeworCQkJc3RydWN0IG10a19tYWMgKm1hYyA9IG5ldGRldl9wcml2KGRldik7CisKKwkJCWNtZC0+cnVsZV9jbnQgPSBtYWMtPmh3bHJvX2lwX2NudDsKKwkJCXJldCA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX0dSWENMU1JVTEU6CisJCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pCisJCQlyZXQgPSBtdGtfaHdscm9fZ2V0X2ZkaXJfZW50cnkoZGV2LCBjbWQpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfR1JYQ0xTUkxBTEw6CisJCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pCisJCQlyZXQgPSBtdGtfaHdscm9fZ2V0X2ZkaXJfYWxsKGRldiwgY21kLAorCQkJCQkJICAgICBydWxlX2xvY3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10a19zZXRfcnhuZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmNtZCkKK3sKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKGNtZC0+Y21kKSB7CisJY2FzZSBFVEhUT09MX1NSWENMU1JMSU5TOgorCQlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTFJPKQorCQkJcmV0ID0gbXRrX2h3bHJvX2FkZF9pcGFkZHIoZGV2LCBjbWQpOworCQlicmVhazsKKwljYXNlIEVUSFRPT0xfU1JYQ0xTUkxERUw6CisJCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pCisJCQlyZXQgPSBtdGtfaHdscm9fZGVsX2lwYWRkcihkZXYsIGNtZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbXRrX2V0aHRvb2xfb3BzID0geworCS5nZXRfbGlua19rc2V0dGluZ3MJPSBtdGtfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MJPSBtdGtfc2V0X2xpbmtfa3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbwkJPSBtdGtfZ2V0X2RydmluZm8sCiAJLmdldF9tc2dsZXZlbAkJPSBtdGtfZ2V0X21zZ2xldmVsLAogCS5zZXRfbXNnbGV2ZWwJCT0gbXRrX3NldF9tc2dsZXZlbCwKQEAgLTE3MDYsNiArMjIzMCw4IEBACiAJLmdldF9zdHJpbmdzCQk9IG10a19nZXRfc3RyaW5ncywKIAkuZ2V0X3NzZXRfY291bnQJCT0gbXRrX2dldF9zc2V0X2NvdW50LAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IG10a19nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3J4bmZjCQk9IG10a19nZXRfcnhuZmMsCisJLnNldF9yeG5mYyAgICAgICAgICAgICAgPSBtdGtfc2V0X3J4bmZjLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBtdGtfbmV0ZGV2X29wcyA9IHsKQEAgLTE3MjAsNiArMjI0Niw4IEBACiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogCS5uZG9fdHhfdGltZW91dAkJPSBtdGtfdHhfdGltZW91dCwKIAkubmRvX2dldF9zdGF0czY0ICAgICAgICA9IG10a19nZXRfc3RhdHM2NCwKKwkubmRvX2ZpeF9mZWF0dXJlcwk9IG10a19maXhfZmVhdHVyZXMsCisJLm5kb19zZXRfZmVhdHVyZXMJPSBtdGtfc2V0X2ZlYXR1cmVzLAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBtdGtfcG9sbF9jb250cm9sbGVyLAogI2VuZGlmCkBAIC0xNzU4LDYgKzIyODYsOSBAQAogCW1hYy0+aHcgPSBldGg7CiAJbWFjLT5vZl9ub2RlID0gbnA7CiAKKwltZW1zZXQobWFjLT5od2xyb19pcCwgMCwgc2l6ZW9mKG1hYy0+aHdscm9faXApKTsKKwltYWMtPmh3bHJvX2lwX2NudCA9IDA7CisKIAltYWMtPmh3X3N0YXRzID0gZGV2bV9remFsbG9jKGV0aC0+ZGV2LAogCQkJCSAgICAgc2l6ZW9mKCptYWMtPmh3X3N0YXRzKSwKIAkJCQkgICAgIEdGUF9LRVJORUwpOwpAQCAtMTc3NCwyMSArMjMwNSwxNyBAQAogCWV0aC0+bmV0ZGV2W2lkXS0+d2F0Y2hkb2dfdGltZW8gPSA1ICogSFo7CiAJZXRoLT5uZXRkZXZbaWRdLT5uZXRkZXZfb3BzID0gJm10a19uZXRkZXZfb3BzOwogCWV0aC0+bmV0ZGV2W2lkXS0+YmFzZV9hZGRyID0gKHVuc2lnbmVkIGxvbmcpZXRoLT5iYXNlOworCisJZXRoLT5uZXRkZXZbaWRdLT5od19mZWF0dXJlcyA9IE1US19IV19GRUFUVVJFUzsKKwlpZiAoZXRoLT5od2xybykKKwkJZXRoLT5uZXRkZXZbaWRdLT5od19mZWF0dXJlcyB8PSBORVRJRl9GX0xSTzsKKwogCWV0aC0+bmV0ZGV2W2lkXS0+dmxhbl9mZWF0dXJlcyA9IE1US19IV19GRUFUVVJFUyAmCiAJCX4oTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCk7CiAJZXRoLT5uZXRkZXZbaWRdLT5mZWF0dXJlcyB8PSBNVEtfSFdfRkVBVFVSRVM7CiAJZXRoLT5uZXRkZXZbaWRdLT5ldGh0b29sX29wcyA9ICZtdGtfZXRodG9vbF9vcHM7CiAKLQllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZXRoLT5uZXRkZXZbaWRdKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoZXRoLT5kZXYsICJlcnJvciBicmluZ2luZyB1cCBkZXZpY2VcbiIpOwotCQlnb3RvIGZyZWVfbmV0ZGV2OwotCX0KIAlldGgtPm5ldGRldltpZF0tPmlycSA9IGV0aC0+aXJxWzBdOwotCW5ldGlmX2luZm8oZXRoLCBwcm9iZSwgZXRoLT5uZXRkZXZbaWRdLAotCQkgICAibWVkaWF0ZWsgZnJhbWUgZW5naW5lIGF0IDB4JTA4bHgsIGlycSAlZFxuIiwKLQkJICAgZXRoLT5uZXRkZXZbaWRdLT5iYXNlX2FkZHIsIGV0aC0+aXJxWzBdKTsKLQogCXJldHVybiAwOwogCiBmcmVlX25ldGRldjoKQEAgLTE4MTMsNiArMjM0MCw3IEBACiAJaWYgKCFldGgpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZXRoLT5kZXYgPSAmcGRldi0+ZGV2OwogCWV0aC0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwogCWlmIChJU19FUlIoZXRoLT5iYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoZXRoLT5iYXNlKTsKQEAgLTE4MzQsMTEgKzIzNjIsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihldGgtPnBjdGwpOwogCX0KIAotCWV0aC0+cnN0YyA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgImV0aCIpOwotCWlmIChJU19FUlIoZXRoLT5yc3RjKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBldGggcmVzZXQgZm91bmRcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihldGgtPnJzdGMpOwotCX0KKwlldGgtPmh3bHJvID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLCAibWVkaWF0ZWssaHdscm8iKTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJZXRoLT5pcnFbaV0gPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIGkpOwpAQCAtMTg0NywyMSArMjM3MSwxNiBAQAogCQkJcmV0dXJuIC1FTlhJTzsKIAkJfQogCX0KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldGgtPmNsa3MpOyBpKyspIHsKKwkJZXRoLT5jbGtzW2ldID0gZGV2bV9jbGtfZ2V0KGV0aC0+ZGV2LAorCQkJCQkgICAgbXRrX2Nsa3Nfc291cmNlX25hbWVbaV0pOworCQlpZiAoSVNfRVJSKGV0aC0+Y2xrc1tpXSkpIHsKKwkJCWlmIChQVFJfRVJSKGV0aC0+Y2xrc1tpXSkgPT0gLUVQUk9CRV9ERUZFUikKKwkJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQogCi0JZXRoLT5jbGtfZXRoaWYgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImV0aGlmIik7Ci0JZXRoLT5jbGtfZXN3ID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJlc3ciKTsKLQlldGgtPmNsa19ncDEgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImdwMSIpOwotCWV0aC0+Y2xrX2dwMiA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiZ3AyIik7Ci0JaWYgKElTX0VSUihldGgtPmNsa19lc3cpIHx8IElTX0VSUihldGgtPmNsa19ncDEpIHx8Ci0JICAgIElTX0VSUihldGgtPmNsa19ncDIpIHx8IElTX0VSUihldGgtPmNsa19ldGhpZikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JY2xrX3ByZXBhcmVfZW5hYmxlKGV0aC0+Y2xrX2V0aGlmKTsKLQljbGtfcHJlcGFyZV9lbmFibGUoZXRoLT5jbGtfZXN3KTsKLQljbGtfcHJlcGFyZV9lbmFibGUoZXRoLT5jbGtfZ3AxKTsKLQljbGtfcHJlcGFyZV9lbmFibGUoZXRoLT5jbGtfZ3AyKTsKLQotCWV0aC0+ZGV2ID0gJnBkZXYtPmRldjsKIAlldGgtPm1zZ19lbmFibGUgPSBuZXRpZl9tc2dfaW5pdChtdGtfbXNnX2xldmVsLCBNVEtfREVGQVVMVF9NU0dfRU5BQkxFKTsKIAlJTklUX1dPUksoJmV0aC0+cGVuZGluZ193b3JrLCBtdGtfcGVuZGluZ193b3JrKTsKIApAQCAtMTg3OSw3ICsyMzk4LDM1IEBACiAKIAkJZXJyID0gbXRrX2FkZF9tYWMoZXRoLCBtYWNfbnApOwogCQlpZiAoZXJyKQotCQkJZ290byBlcnJfZnJlZV9kZXY7CisJCQlnb3RvIGVycl9kZWluaXRfaHc7CisJfQorCisJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShldGgtPmRldiwgZXRoLT5pcnFbMV0sIG10a19oYW5kbGVfaXJxX3R4LCAwLAorCQkJICAgICAgIGRldl9uYW1lKGV0aC0+ZGV2KSwgZXRoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mcmVlX2RldjsKKworCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoZXRoLT5kZXYsIGV0aC0+aXJxWzJdLCBtdGtfaGFuZGxlX2lycV9yeCwgMCwKKwkJCSAgICAgICBkZXZfbmFtZShldGgtPmRldiksIGV0aCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9kZXY7CisKKwllcnIgPSBtdGtfbWRpb19pbml0KGV0aCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZV9kZXY7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVRLX01BWF9ERVZTOyBpKyspIHsKKwkJaWYgKCFldGgtPm5ldGRldltpXSkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IHJlZ2lzdGVyX25ldGRldihldGgtPm5ldGRldltpXSk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoZXRoLT5kZXYsICJlcnJvciBicmluZ2luZyB1cCBkZXZpY2VcbiIpOworCQkJZ290byBlcnJfZGVpbml0X21kaW87CisJCX0gZWxzZQorCQkJbmV0aWZfaW5mbyhldGgsIHByb2JlLCBldGgtPm5ldGRldltpXSwKKwkJCQkgICAibWVkaWF0ZWsgZnJhbWUgZW5naW5lIGF0IDB4JTA4bHgsIGlycSAlZFxuIiwKKwkJCQkgICBldGgtPm5ldGRldltpXS0+YmFzZV9hZGRyLCBldGgtPmlycVswXSk7CiAJfQogCiAJLyogd2UgcnVuIDIgZGV2aWNlcyBvbiB0aGUgc2FtZSBETUEgcmluZyBzbyB3ZSBuZWVkIGEgZHVtbXkgZGV2aWNlCkBAIC0xODk1LDI0ICsyNDQyLDM0IEBACiAKIAlyZXR1cm4gMDsKIAorZXJyX2RlaW5pdF9tZGlvOgorCW10a19tZGlvX2NsZWFudXAoZXRoKTsKIGVycl9mcmVlX2RldjoKLQltdGtfY2xlYW51cChldGgpOworCW10a19mcmVlX2RldihldGgpOworZXJyX2RlaW5pdF9odzoKKwltdGtfaHdfZGVpbml0KGV0aCk7CisKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IG10a19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbXRrX2V0aCAqZXRoID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CiAKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoZXRoLT5jbGtfZXRoaWYpOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShldGgtPmNsa19lc3cpOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShldGgtPmNsa19ncDEpOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShldGgtPmNsa19ncDIpOworCS8qIHN0b3AgYWxsIGRldmljZXMgdG8gbWFrZSBzdXJlIHRoYXQgZG1hIGlzIHByb3Blcmx5IHNodXQgZG93biAqLworCWZvciAoaSA9IDA7IGkgPCBNVEtfTUFDX0NPVU5UOyBpKyspIHsKKwkJaWYgKCFldGgtPm5ldGRldltpXSkKKwkJCWNvbnRpbnVlOworCQltdGtfc3RvcChldGgtPm5ldGRldltpXSk7CisJfQorCisJbXRrX2h3X2RlaW5pdChldGgpOwogCiAJbmV0aWZfbmFwaV9kZWwoJmV0aC0+dHhfbmFwaSk7CiAJbmV0aWZfbmFwaV9kZWwoJmV0aC0+cnhfbmFwaSk7CiAJbXRrX2NsZWFudXAoZXRoKTsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwltdGtfbWRpb19jbGVhbnVwKGV0aCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5MjEsNiArMjQ3OCw3IEBACiAJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDc2MjMtZXRoIiB9LAogCXt9LAogfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX210a19tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG10a19kcml2ZXIgPSB7CiAJLnByb2JlID0gbXRrX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVkaWF0ZWsvbXRrX2V0aF9zb2MuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lZGlhdGVrL210a19ldGhfc29jLmgKaW5kZXggZjgyZTNhYy4uMzAwMzE5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVkaWF0ZWsvbXRrX2V0aF9zb2MuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWRpYXRlay9tdGtfZXRoX3NvYy5oCkBAIC0zOSw3ICszOSwyMSBAQAogCQkJCSBORVRJRl9GX1NHIHwgTkVUSUZfRl9UU08gfCBcCiAJCQkJIE5FVElGX0ZfVFNPNiB8IFwKIAkJCQkgTkVUSUZfRl9JUFY2X0NTVU0pCi0jZGVmaW5lIE5FWFRfUlhfREVTUF9JRFgoWCkJKCgoWCkgKyAxKSAmIChNVEtfRE1BX1NJWkUgLSAxKSkKKyNkZWZpbmUgTkVYVF9SWF9ERVNQX0lEWChYLCBZKQkoKChYKSArIDEpICYgKChZKSAtIDEpKQorCisjZGVmaW5lIE1US19NQVhfUlhfUklOR19OVU0JNAorI2RlZmluZSBNVEtfSFdfTFJPX0RNQV9TSVpFCTgKKworI2RlZmluZQlNVEtfTUFYX0xST19SWF9MRU5HVEgJCSg0MDk2ICogMykKKyNkZWZpbmUJTVRLX01BWF9MUk9fSVBfQ05UCQkyCisjZGVmaW5lCU1US19IV19MUk9fVElNRVJfVU5JVAkJMQkvKiAyMCB1cyAqLworI2RlZmluZQlNVEtfSFdfTFJPX1JFRlJFU0hfVElNRQkJNTAwMDAJLyogMSBzZWMuICovCisjZGVmaW5lCU1US19IV19MUk9fQUdHX1RJTUUJCTEwCS8qIDIwMHVzICovCisjZGVmaW5lCU1US19IV19MUk9fQUdFX1RJTUUJCTUwCS8qIDFtcyAqLworI2RlZmluZQlNVEtfSFdfTFJPX01BWF9BR0dfQ05UCQk2NAorI2RlZmluZQlNVEtfSFdfTFJPX0JXX1RIUkUJCTMwMDAKKyNkZWZpbmUJTVRLX0hXX0xST19SRVBMQUNFX0RFTFRBCTEwMDAKKyNkZWZpbmUJTVRLX0hXX0xST19TRExfUkVNQUlOX1JPT00JMTUyMgogCiAvKiBGcmFtZSBFbmdpbmUgR2xvYmFsIFJlc2V0IFJlZ2lzdGVyICovCiAjZGVmaW5lIE1US19SU1RfR0wJCTB4MDQKQEAgLTUwLDYgKzY0LDkgQEAKICNkZWZpbmUgTVRLX0dETTFfQUYJCUJJVCgyOCkKICNkZWZpbmUgTVRLX0dETTJfQUYJCUJJVCgyOSkKIAorLyogUERNQSBIVyBMUk8gQWx0ZXIgRmxvdyBUaW1lciBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUERNQV9MUk9fQUxUX1JFRlJFU0hfVElNRVIJMHgxYworCiAvKiBGcmFtZSBFbmdpbmUgSW50ZXJydXB0IEdyb3VwaW5nIFJlZ2lzdGVyICovCiAjZGVmaW5lIE1US19GRV9JTlRfR1JQCQkweDIwCiAKQEAgLTY4LDEwICs4NSw3NyBAQAogLyogVW5pY2FzdCBGaWx0ZXIgTUFDIEFkZHJlc3MgUmVnaXN0ZXIgLSBIaWdoICovCiAjZGVmaW5lIE1US19HRE1BX01BQ19BRFJIKHgpCSgweDUwQyArICh4ICogMHgxMDAwKSkKIAorLyogUERNQSBSWCBCYXNlIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRLX1BSWF9CQVNFX1BUUjAJMHg5MDAKKyNkZWZpbmUgTVRLX1BSWF9CQVNFX1BUUl9DRkcoeCkJKE1US19QUlhfQkFTRV9QVFIwICsgKHggKiAweDEwKSkKKworLyogUERNQSBSWCBNYXhpbXVtIENvdW50IFJlZ2lzdGVyICovCisjZGVmaW5lIE1US19QUlhfTUFYX0NOVDAJMHg5MDQKKyNkZWZpbmUgTVRLX1BSWF9NQVhfQ05UX0NGRyh4KQkoTVRLX1BSWF9NQVhfQ05UMCArICh4ICogMHgxMCkpCisKKy8qIFBETUEgUlggQ1BVIFBvaW50ZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRLX1BSWF9DUlhfSURYMAkweDkwOAorI2RlZmluZSBNVEtfUFJYX0NSWF9JRFhfQ0ZHKHgpCShNVEtfUFJYX0NSWF9JRFgwICsgKHggKiAweDEwKSkKKworLyogUERNQSBIVyBMUk8gQ29udHJvbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVRLX1BETUFfTFJPX0NUUkxfRFcwCTB4OTgwCisjZGVmaW5lIE1US19MUk9fRU4JCQlCSVQoMCkKKyNkZWZpbmUgTVRLX0wzX0NLU19VUERfRU4JCUJJVCg3KQorI2RlZmluZSBNVEtfTFJPX0FMVF9QS1RfQ05UX01PREUJQklUKDIxKQorI2RlZmluZSBNVEtfTFJPX1JJTkdfUkVMSU5RVUlTSF9SRVEJKDB4NyA8PCAyNikKKyNkZWZpbmUgTVRLX0xST19SSU5HX1JFTElOUVVJU0hfRE9ORQkoMHg3IDw8IDI5KQorCisjZGVmaW5lIE1US19QRE1BX0xST19DVFJMX0RXMQkweDk4NAorI2RlZmluZSBNVEtfUERNQV9MUk9fQ1RSTF9EVzIJMHg5ODgKKyNkZWZpbmUgTVRLX1BETUFfTFJPX0NUUkxfRFczCTB4OThjCisjZGVmaW5lIE1US19BRE1BX01PREUJCUJJVCgxNSkKKyNkZWZpbmUgTVRLX0xST19NSU5fUlhEX1NETAkoTVRLX0hXX0xST19TRExfUkVNQUlOX1JPT00gPDwgMTYpCisKKy8qIFBETUEgR2xvYmFsIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRLX1BETUFfR0xPX0NGRwkweGEwNAorI2RlZmluZSBNVEtfTVVMVElfRU4JCUJJVCgxMCkKKworLyogUERNQSBSZXNldCBJbmRleCBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUERNQV9SU1RfSURYCTB4YTA4CisjZGVmaW5lIE1US19QU1RfRFJYX0lEWDAJQklUKDE2KQorI2RlZmluZSBNVEtfUFNUX0RSWF9JRFhfQ0ZHKHgpCShNVEtfUFNUX0RSWF9JRFgwIDw8ICh4KSkKKworLyogUERNQSBEZWxheSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRLX1BETUFfREVMQVlfSU5UCTB4YTBjCisKKy8qIFBETUEgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUERNQV9JTlRfU1RBVFVTCTB4YTIwCisKKy8qIFBETUEgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTVRLX1BETUFfSU5UX01BU0sJMHhhMjgKKworLyogUERNQSBIVyBMUk8gQWx0ZXIgRmxvdyBEZWx0YSBSZWdpc3RlciAqLworI2RlZmluZSBNVEtfUERNQV9MUk9fQUxUX1NDT1JFX0RFTFRBCTB4YTRjCisKIC8qIFBETUEgSW50ZXJydXB0IGdyb3VwaW5nIHJlZ2lzdGVycyAqLwogI2RlZmluZSBNVEtfUERNQV9JTlRfR1JQMQkweGE1MAogI2RlZmluZSBNVEtfUERNQV9JTlRfR1JQMgkweGE1NAogCisvKiBQRE1BIEhXIExSTyBJUCBTZXR0aW5nIFJlZ2lzdGVycyAqLworI2RlZmluZSBNVEtfTFJPX1JYX1JJTkcwX0RJUF9EVzAJMHhiMDQKKyNkZWZpbmUgTVRLX0xST19ESVBfRFcwX0NGRyh4KQkJKE1US19MUk9fUlhfUklORzBfRElQX0RXMCArICh4ICogMHg0MCkpCisjZGVmaW5lIE1US19SSU5HX01ZSVBfVkxECQlCSVQoOSkKKworLyogUERNQSBIVyBMUk8gUmluZyBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZSBNVEtfTFJPX1JYX1JJTkcwX0NUUkxfRFcxCTB4YjI4CisjZGVmaW5lIE1US19MUk9fUlhfUklORzBfQ1RSTF9EVzIJMHhiMmMKKyNkZWZpbmUgTVRLX0xST19SWF9SSU5HMF9DVFJMX0RXMwkweGIzMAorI2RlZmluZSBNVEtfTFJPX0NUUkxfRFcxX0NGRyh4KQkJKE1US19MUk9fUlhfUklORzBfQ1RSTF9EVzEgKyAoeCAqIDB4NDApKQorI2RlZmluZSBNVEtfTFJPX0NUUkxfRFcyX0NGRyh4KQkJKE1US19MUk9fUlhfUklORzBfQ1RSTF9EVzIgKyAoeCAqIDB4NDApKQorI2RlZmluZSBNVEtfTFJPX0NUUkxfRFczX0NGRyh4KQkJKE1US19MUk9fUlhfUklORzBfQ1RSTF9EVzMgKyAoeCAqIDB4NDApKQorI2RlZmluZSBNVEtfUklOR19BR0VfVElNRV9MCQkoKE1US19IV19MUk9fQUdFX1RJTUUgJiAweDNmZikgPDwgMjIpCisjZGVmaW5lIE1US19SSU5HX0FHRV9USU1FX0gJCSgoTVRLX0hXX0xST19BR0VfVElNRSA+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+ZGIueGRwLmRvb3JiZWxsID0gZmFsc2U7CisJfQorCiAJbWx4NV9jcXdxX3VwZGF0ZV9kYl9yZWNvcmQoJmNxLT53cSk7CiAKIAkvKiBlbnN1cmUgY3Egc3BhY2UgaXMgZnJlZWQgYmVmb3JlIGVuYWJsaW5nIG1vcmUgY3FlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX3N0YXRzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fc3RhdHMuaAppbmRleCA3YjlkOGE5Li41NzQ1MmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fc3RhdHMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fc3RhdHMuaApAQCAtNjUsMTcgKzY1LDI0IEBACiAJdTY0IHJ4X2NzdW1fbm9uZTsKIAl1NjQgcnhfY3N1bV9jb21wbGV0ZTsKIAl1NjQgcnhfY3N1bV91bm5lY2Vzc2FyeV9pbm5lcjsKKwl1NjQgcnhfeGRwX2Ryb3A7CisJdTY0IHJ4X3hkcF90eDsKKwl1NjQgcnhfeGRwX3R4X2Z1bGw7CiAJdTY0IHR4X2NzdW1fcGFydGlhbDsKIAl1NjQgdHhfY3N1bV9wYXJ0aWFsX2lubmVyOwogCXU2NCB0eF9xdWV1ZV9zdG9wcGVkOwogCXU2NCB0eF9xdWV1ZV93YWtlOwogCXU2NCB0eF9xdWV1ZV9kcm9wcGVkOworCXU2NCB0eF94bWl0X21vcmU7CiAJdTY0IHJ4X3dxZV9lcnI7CiAJdTY0IHJ4X21wd3FlX2ZpbGxlcjsKLQl1NjQgcnhfbXB3cWVfZnJhZzsKIAl1NjQgcnhfYnVmZl9hbGxvY19lcnI7CiAJdTY0IHJ4X2NxZV9jb21wcmVzc19ibGtzOwogCXU2NCByeF9jcWVfY29tcHJlc3NfcGt0czsKKwl1NjQgcnhfY2FjaGVfcmV1c2U7CisJdTY0IHJ4X2NhY2hlX2Z1bGw7CisJdTY0IHJ4X2NhY2hlX2VtcHR5OworCXU2NCByeF9jYWNoZV9idXN5OwogCiAJLyogU3BlY2lhbCBoYW5kbGluZyBjb3VudGVycyAqLwogCXU2NCBsaW5rX2Rvd25fZXZlbnRzX3BoeTsKQEAgLTk2LDE3ICsxMDMsMjQgQEAKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X2NzdW1fbm9uZSkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X2NzdW1fY29tcGxldGUpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9jc3VtX3VubmVjZXNzYXJ5X2lubmVyKSB9LAorCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfeGRwX2Ryb3ApIH0sCisJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF94ZHBfdHgpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF94ZHBfdHhfZnVsbCkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHR4X2NzdW1fcGFydGlhbCkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHR4X2NzdW1fcGFydGlhbF9pbm5lcikgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHR4X3F1ZXVlX3N0b3BwZWQpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCB0eF9xdWV1ZV93YWtlKSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgdHhfcXVldWVfZHJvcHBlZCkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHR4X3htaXRfbW9yZSkgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X3dxZV9lcnIpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9tcHdxZV9maWxsZXIpIH0sCi0JeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9tcHdxZV9mcmFnKSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfYnVmZl9hbGxvY19lcnIpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9jcWVfY29tcHJlc3NfYmxrcykgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfU1RBVChzdHJ1Y3QgbWx4NWVfc3dfc3RhdHMsIHJ4X2NxZV9jb21wcmVzc19wa3RzKSB9LAorCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfY2FjaGVfcmV1c2UpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9jYWNoZV9mdWxsKSB9LAorCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgcnhfY2FjaGVfZW1wdHkpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1NUQVQoc3RydWN0IG1seDVlX3N3X3N0YXRzLCByeF9jYWNoZV9idXN5KSB9LAogCXsgTUxYNUVfREVDTEFSRV9TVEFUKHN0cnVjdCBtbHg1ZV9zd19zdGF0cywgbGlua19kb3duX2V2ZW50c19waHkpIH0sCiB9OwogCkBAIC0yNzAsMTIgKzI4NCwxOCBAQAogCXU2NCBjc3VtX25vbmU7CiAJdTY0IGxyb19wYWNrZXRzOwogCXU2NCBscm9fYnl0ZXM7CisJdTY0IHhkcF9kcm9wOworCXU2NCB4ZHBfdHg7CisJdTY0IHhkcF90eF9mdWxsOwogCXU2NCB3cWVfZXJyOwogCXU2NCBtcHdxZV9maWxsZXI7Ci0JdTY0IG1wd3FlX2ZyYWc7CiAJdTY0IGJ1ZmZfYWxsb2NfZXJyOwogCXU2NCBjcWVfY29tcHJlc3NfYmxrczsKIAl1NjQgY3FlX2NvbXByZXNzX3BrdHM7CisJdTY0IGNhY2hlX3JldXNlOworCXU2NCBjYWNoZV9mdWxsOworCXU2NCBjYWNoZV9lbXB0eTsKKwl1NjQgY2FjaGVfYnVzeTsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY291bnRlcl9kZXNjIHJxX3N0YXRzX2Rlc2NbXSA9IHsKQEAgLTI4NCwyMCArMzA0LDI3IEBACiAJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBjc3VtX2NvbXBsZXRlKSB9LAogCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgY3N1bV91bm5lY2Vzc2FyeV9pbm5lcikgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIGNzdW1fbm9uZSkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIHhkcF9kcm9wKSB9LAorCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgeGRwX3R4KSB9LAorCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgeGRwX3R4X2Z1bGwpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBscm9fcGFja2V0cykgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIGxyb19ieXRlcykgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIHdxZV9lcnIpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBtcHdxZV9maWxsZXIpIH0sCi0JeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBtcHdxZV9mcmFnKSB9LAogCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgYnVmZl9hbGxvY19lcnIpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBjcWVfY29tcHJlc3NfYmxrcykgfSwKIAl7IE1MWDVFX0RFQ0xBUkVfUlhfU1RBVChzdHJ1Y3QgbWx4NWVfcnFfc3RhdHMsIGNxZV9jb21wcmVzc19wa3RzKSB9LAorCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgY2FjaGVfcmV1c2UpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBjYWNoZV9mdWxsKSB9LAorCXsgTUxYNUVfREVDTEFSRV9SWF9TVEFUKHN0cnVjdCBtbHg1ZV9ycV9zdGF0cywgY2FjaGVfZW1wdHkpIH0sCisJeyBNTFg1RV9ERUNMQVJFX1JYX1NUQVQoc3RydWN0IG1seDVlX3JxX3N0YXRzLCBjYWNoZV9idXN5KSB9LAogfTsKIAogc3RydWN0IG1seDVlX3NxX3N0YXRzIHsKIAkvKiBjb21tb25seSBhY2Nlc3NlZCBpbiBkYXRhIHBhdGggKi8KIAl1NjQgcGFja2V0czsKIAl1NjQgYnl0ZXM7CisJdTY0IHhtaXRfbW9yZTsKIAl1NjQgdHNvX3BhY2tldHM7CiAJdTY0IHRzb19ieXRlczsKIAl1NjQgdHNvX2lubmVyX3BhY2tldHM7CkBAIC0zMjQsNiArMzUxLDcgQEAKIAl7IE1MWDVFX0RFQ0xBUkVfVFhfU1RBVChzdHJ1Y3QgbWx4NWVfc3Ffc3RhdHMsIHN0b3BwZWQpIH0sCiAJeyBNTFg1RV9ERUNMQVJFX1RYX1NUQVQoc3RydWN0IG1seDVlX3NxX3N0YXRzLCB3YWtlKSB9LAogCXsgTUxYNUVfREVDTEFSRV9UWF9TVEFUKHN0cnVjdCBtbHg1ZV9zcV9zdGF0cywgZHJvcHBlZCkgfSwKKwl7IE1MWDVFX0RFQ0xBUkVfVFhfU1RBVChzdHJ1Y3QgbWx4NWVfc3Ffc3RhdHMsIHhtaXRfbW9yZSkgfSwKIH07CiAKICNkZWZpbmUgTlVNX1NXX0NPVU5URVJTCQkJQVJSQVlfU0laRShzd19zdGF0c19kZXNjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VuX3RjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdGMuYwppbmRleCBkYzhiMWNiLi5jZThjNTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdGMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdGMuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JoYXNodGFibGUuaD4KICNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+CiAjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19taXJyZWQuaD4KKyNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX3ZsYW4uaD4KICNpbmNsdWRlICJlbi5oIgogI2luY2x1ZGUgImVuX3RjLmgiCiAjaW5jbHVkZSAiZXN3aXRjaC5oIgpAQCAtNDcsNiArNDgsNyBAQAogCXN0cnVjdCByaGFzaF9oZWFkCW5vZGU7CiAJdTY0CQkJY29va2llOwogCXN0cnVjdCBtbHg1X2Zsb3dfcnVsZQkqcnVsZTsKKwlzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyOwogfTsKIAogI2RlZmluZSBNTFg1RV9UQ19UQUJMRV9OVU1fRU5UUklFUyAxMDI0CkBAIC0xMTQsMjcgKzExNiwzMCBAQAogCiBzdGF0aWMgc3RydWN0IG1seDVfZmxvd19ydWxlICptbHg1ZV90Y19hZGRfZmRiX2Zsb3coc3RydWN0IG1seDVlX3ByaXYgKnByaXYsCiAJCQkJCQkgICAgc3RydWN0IG1seDVfZmxvd19zcGVjICpzcGVjLAotCQkJCQkJICAgIHUzMiBhY3Rpb24sIHUzMiBkc3RfdnBvcnQpCisJCQkJCQkgICAgc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0ciAqYXR0cikKIHsKIAlzdHJ1Y3QgbWx4NV9lc3dpdGNoICplc3cgPSBwcml2LT5tZGV2LT5wcml2LmVzd2l0Y2g7Ci0Jc3RydWN0IG1seDVfZXN3aXRjaF9yZXAgKnJlcCA9IHByaXYtPnBwcml2OwotCXUzMiBzcmNfdnBvcnQ7CisJaW50IGVycjsKIAotCWlmIChyZXAtPnZwb3J0KSAvKiBzZXQgc291cmNlIHZwb3J0IGZvciB0aGUgZmxvdyAqLwotCQlzcmNfdnBvcnQgPSByZXAtPnZwb3J0OwotCWVsc2UKLQkJc3JjX3Zwb3J0ID0gRkRCX1VQTElOS19WUE9SVDsKKwllcnIgPSBtbHg1X2Vzd2l0Y2hfYWRkX3ZsYW5fYWN0aW9uKGVzdywgYXR0cik7CisJaWYgKGVycikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAotCXJldHVybiBtbHg1X2Vzd2l0Y2hfYWRkX29mZmxvYWRlZF9ydWxlKGVzdywgc3BlYywgYWN0aW9uLCBzcmNfdnBvcnQsIGRzdF92cG9ydCk7CisJcmV0dXJuIG1seDVfZXN3aXRjaF9hZGRfb2ZmbG9hZGVkX3J1bGUoZXN3LCBzcGVjLCBhdHRyKTsKIH0KIAogc3RhdGljIHZvaWQgbWx4NWVfdGNfZGVsX2Zsb3coc3RydWN0IG1seDVlX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKnJ1bGUpCisJCQkgICAgICBzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKnJ1bGUsCisJCQkgICAgICBzdHJ1Y3QgbWx4NV9lc3dfZmxvd19hdHRyICphdHRyKQogeworCXN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdyA9IHByaXYtPm1kZXYtPnByaXYuZXN3aXRjaDsKIAlzdHJ1Y3QgbWx4NV9mYyAqY291bnRlciA9IE5VTEw7CiAKIAljb3VudGVyID0gbWx4NV9mbG93X3J1bGVfY291bnRlcihydWxlKTsKIAorCWlmIChlc3cgJiYgZXN3LT5tb2RlID09IFNSSU9WX09GRkxPQURTKQorCQltbHg1X2Vzd2l0Y2hfZGVsX3ZsYW5fYWN0aW9uKGVzdywgYXR0cik7CisKIAltbHg1X2RlbF9mbG93X3J1bGUocnVsZSk7CiAKIAltbHg1X2ZjX2Rlc3Ryb3kocHJpdi0+bWRldiwgY291bnRlcik7CkBAIC0xNTksNiArMTY0LDcgQEAKIAkgICAgfihCSVQoRkxPV19ESVNTRUNUT1JfS0VZX0NPTlRST0wpIHwKIAkgICAgICBCSVQoRkxPV19ESVNTRUNUT1JfS0VZX0JBU0lDKSB8CiAJICAgICAgQklUKEZMT1dfRElTU0VDVE9SX0tFWV9FVEhfQUREUlMpIHwKKwkgICAgICBCSVQoRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU4pIHwKIAkgICAgICBCSVQoRkxPV19ESVNTRUNUT1JfS0VZX0lQVjRfQUREUlMpIHwKIAkgICAgICBCSVQoRkxPV19ESVNTRUNUT1JfS0VZX0lQVjZfQUREUlMpIHwKIAkgICAgICBCSVQoRkxPV19ESVNTRUNUT1JfS0VZX1BPUlRTKSkpIHsKQEAgLTE3MCw3ICsxNzYsNyBAQAogCWlmIChkaXNzZWN0b3JfdXNlc19rZXkoZi0+ZGlzc2VjdG9yLCBGTE9XX0RJU1NFQ1RPUl9LRVlfQ09OVFJPTCkpIHsKIAkJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9jb250cm9sICprZXkgPQogCQkJc2tiX2Zsb3dfZGlzc2VjdG9yX3RhcmdldChmLT5kaXNzZWN0b3IsCi0JCQkJCQkgIEZMT1dfRElTU0VDVE9SX0tFWV9CQVNJQywKKwkJCQkJCSAgRkxPV19ESVNTRUNUT1JfS0VZX0NPTlRST0wsCiAJCQkJCQkgIGYtPmtleSk7CiAJCWFkZHJfdHlwZSA9IGtleS0+YWRkcl90eXBlOwogCX0KQEAgLTIyMiw2ICsyMjgsMjQgQEAKIAkJCQlrZXktPnNyYyk7CiAJfQogCisJaWYgKGRpc3NlY3Rvcl91c2VzX2tleShmLT5kaXNzZWN0b3IsIEZMT1dfRElTU0VDVE9SX0tFWV9WTEFOKSkgeworCQlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3ZsYW4gKmtleSA9CisJCQlza2JfZmxvd19kaXNzZWN0b3JfdGFyZ2V0KGYtPmRpc3NlY3RvciwKKwkJCQkJCSAgRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU4sCisJCQkJCQkgIGYtPmtleSk7CisJCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdmxhbiAqbWFzayA9CisJCQlza2JfZmxvd19kaXNzZWN0b3JfdGFyZ2V0KGYtPmRpc3NlY3RvciwKKwkJCQkJCSAgRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU4sCisJCQkJCQkgIGYtPm1hc2spOworCQlpZiAobWFzay0+dmxhbl9pZCkgeworCQkJTUxYNV9TRVQoZnRlX21hdGNoX3NldF9seXJfMl80LCBoZWFkZXJzX2MsIHZsYW5fdGFnLCAxKTsKKwkJCU1MWDVfU0VUKGZ0ZV9tYXRjaF9zZXRfbHlyXzJfNCwgaGVhZGVyc192LCB2bGFuX3RhZywgMSk7CisKKwkJCU1MWDVfU0VUKGZ0ZV9tYXRjaF9zZXRfbHlyXzJfNCwgaGVhZGVyc19jLCBmaXJzdF92aWQsIG1hc2stPnZsYW5faWQpOworCQkJTUxYNV9TRVQoZnRlX21hdGNoX3NldF9seXJfMl80LCBoZWFkZXJzX3YsIGZpcnN0X3ZpZCwga2V5LT52bGFuX2lkKTsKKwkJfQorCX0KKwogCWlmIChhZGRyX3R5cGUgPT0gRkxPV19ESVNTRUNUT1JfS0VZX0lQVjRfQUREUlMpIHsKIAkJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9pcHY0X2FkZHJzICprZXkgPQogCQkJc2tiX2Zsb3dfZGlzc2VjdG9yX3RhcmdldChmLT5kaXNzZWN0b3IsCkBAIC0zNjEsNyArMzg1LDcgQEAKIH0KIAogc3RhdGljIGludCBwYXJzZV90Y19mZGJfYWN0aW9ucyhzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiwgc3RydWN0IHRjZl9leHRzICpleHRzLAotCQkJCXUzMiAqYWN0aW9uLCB1MzIgKmRlc3RfdnBvcnQpCisJCQkJc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0ciAqYXR0cikKIHsKIAljb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphOwogCUxJU1RfSEVBRChhY3Rpb25zKTsKQEAgLTM2OSwxNyArMzkzLDE0IEBACiAJaWYgKHRjX25vX2FjdGlvbnMoZXh0cykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JKmFjdGlvbiA9IDA7CisJbWVtc2V0KGF0dHIsIDAsIHNpemVvZigqYXR0cikpOworCWF0dHItPmluX3JlcCA9IHByaXYtPnBwcml2OwogCiAJdGNmX2V4dHNfdG9fbGlzdChleHRzLCAmYWN0aW9ucyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCAmYWN0aW9ucywgbGlzdCkgewotCQkvKiBPbmx5IHN1cHBvcnQgYSBzaW5nbGUgYWN0aW9uIHBlciBydWxlICovCi0JCWlmICgqYWN0aW9uKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAkJaWYgKGlzX3RjZl9nYWN0X3Nob3QoYSkpIHsKLQkJCSphY3Rpb24gPSBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRFJPUCB8Ci0JCQkJICBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fQ09VTlQ7CisJCQlhdHRyLT5hY3Rpb24gfD0gTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0RST1AgfAorCQkJCQlNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fQ09VTlQ7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0zODcsNyArNDA4LDYgQEAKIAkJCWludCBpZmluZGV4ID0gdGNmX21pcnJlZF9pZmluZGV4KGEpOwogCQkJc3RydWN0IG5ldF9kZXZpY2UgKm91dF9kZXY7CiAJCQlzdHJ1Y3QgbWx4NWVfcHJpdiAqb3V0X3ByaXY7Ci0JCQlzdHJ1Y3QgbWx4NV9lc3dpdGNoX3JlcCAqb3V0X3JlcDsKIAogCQkJb3V0X2RldiA9IF9fZGV2X2dldF9ieV9pbmRleChkZXZfbmV0KHByaXYtPm5ldGRldiksIGlmaW5kZXgpOwogCkBAIC0zOTcsMTMgKzQxNywyMiBAQAogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCisJCQlhdHRyLT5hY3Rpb24gfD0gTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0ZXRF9ERVNUOwogCQkJb3V0X3ByaXYgPSBuZXRkZXZfcHJpdihvdXRfZGV2KTsKLQkJCW91dF9yZXAgID0gb3V0X3ByaXYtPnBwcml2OwotCQkJaWYgKG91dF9yZXAtPnZwb3J0ID09IDApCi0JCQkJKmRlc3RfdnBvcnQgPSBGREJfVVBMSU5LX1ZQT1JUOwotCQkJZWxzZQotCQkJCSpkZXN0X3Zwb3J0ID0gb3V0X3JlcC0+dnBvcnQ7Ci0JCQkqYWN0aW9uID0gTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0ZXRF9ERVNUOworCQkJYXR0ci0+b3V0X3JlcCA9IG91dF9wcml2LT5wcHJpdjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGlzX3RjZl92bGFuKGEpKSB7CisJCQlpZiAodGNmX3ZsYW5fYWN0aW9uKGEpID09IFZMQU5fRl9QT1ApIHsKKwkJCQlhdHRyLT5hY3Rpb24gfD0gTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX1ZMQU5fUE9QOworCQkJfSBlbHNlIGlmICh0Y2Zfdmxhbl9hY3Rpb24oYSkgPT0gVkxBTl9GX1BVU0gpIHsKKwkJCQlpZiAodGNmX3ZsYW5fcHVzaF9wcm90byhhKSAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCQkJCWF0dHItPmFjdGlvbiB8PSBNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fVkxBTl9QVVNIOworCQkJCWF0dHItPnZsYW4gPSB0Y2Zfdmxhbl9wdXNoX3ZpZChhKTsKKwkJCX0KIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTQxNywxOCArNDQ2LDI5IEBACiB7CiAJc3RydWN0IG1seDVlX3RjX3RhYmxlICp0YyA9ICZwcml2LT5mcy50YzsKIAlpbnQgZXJyID0gMDsKLQl1MzIgZmxvd190YWcsIGFjdGlvbiwgZGVzdF92cG9ydCA9IDA7CisJYm9vbCBmZGJfZmxvdyA9IGZhbHNlOworCXUzMiBmbG93X3RhZywgYWN0aW9uOwogCXN0cnVjdCBtbHg1ZV90Y19mbG93ICpmbG93OwogCXN0cnVjdCBtbHg1X2Zsb3dfc3BlYyAqc3BlYzsKIAlzdHJ1Y3QgbWx4NV9mbG93X3J1bGUgKm9sZCA9IE5VTEw7CisJc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0ciAqb2xkX2F0dHIgPSBOVUxMOwogCXN0cnVjdCBtbHg1X2Vzd2l0Y2ggKmVzdyA9IHByaXYtPm1kZXYtPnByaXYuZXN3aXRjaDsKIAorCWlmIChlc3cgJiYgZXN3LT5tb2RlID09IFNSSU9WX09GRkxPQURTKQorCQlmZGJfZmxvdyA9IHRydWU7CisKIAlmbG93ID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmdGMtPmh0LCAmZi0+Y29va2llLAogCQkJCSAgICAgIHRjLT5odF9wYXJhbXMpOwotCWlmIChmbG93KQorCWlmIChmbG93KSB7CiAJCW9sZCA9IGZsb3ctPnJ1bGU7Ci0JZWxzZQotCQlmbG93ID0ga3phbGxvYyhzaXplb2YoKmZsb3cpLCBHRlBfS0VSTkVMKTsKKwkJb2xkX2F0dHIgPSBmbG93LT5hdHRyOworCX0gZWxzZSB7CisJCWlmIChmZGJfZmxvdykKKwkJCWZsb3cgPSBremFsbG9jKHNpemVvZigqZmxvdykgKyBzaXplb2Yoc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0ciksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCQllbHNlCisJCQlmbG93ID0ga3phbGxvYyhzaXplb2YoKmZsb3cpLCBHRlBfS0VSTkVMKTsKKwl9CiAKIAlzcGVjID0gbWx4NV92emFsbG9jKHNpemVvZigqc3BlYykpOwogCWlmICghc3BlYyB8fCAhZmxvdykgewpAQCAtNDQyLDExICs0ODIsMTIgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJfZnJlZTsKIAotCWlmIChlc3cgJiYgZXN3LT5tb2RlID09IFNSSU9WX09GRkxPQURTKSB7Ci0JCWVyciA9IHBhcnNlX3RjX2ZkYl9hY3Rpb25zKHByaXYsIGYtPmV4dHMsICZhY3Rpb24sICZkZXN0X3Zwb3J0KTsKKwlpZiAoZmRiX2Zsb3cpIHsKKwkJZmxvdy0+YXR0ciAgPSAoc3RydWN0IG1seDVfZXN3X2Zsb3dfYXR0ciAqKShmbG93ICsgMSk7CisJCWVyciA9IHBhcnNlX3RjX2ZkYl9hY3Rpb25zKHByaXYsIGYtPmV4dHMsIGZsb3ctPmF0dHIpOwogCQlpZiAoZXJyIDwgMCkKIAkJCWdvdG8gZXJyX2ZyZWU7Ci0JCWZsb3ctPnJ1bGUgPSBtbHg1ZV90Y19hZGRfZmRiX2Zsb3cocHJpdiwgc3BlYywgYWN0aW9uLCBkZXN0X3Zwb3J0KTsKKwkJZmxvdy0+cnVsZSA9IG1seDVlX3RjX2FkZF9mZGJfZmxvdyhwcml2LCBzcGVjLCBmbG93LT5hdHRyKTsKIAl9IGVsc2UgewogCQllcnIgPSBwYXJzZV90Y19uaWNfYWN0aW9ucyhwcml2LCBmLT5leHRzLCAmYWN0aW9uLCAmZmxvd190YWcpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTQ2NSw3ICs1MDYsNyBAQAogCQlnb3RvIGVycl9kZWxfcnVsZTsKIAogCWlmIChvbGQpCi0JCW1seDVlX3RjX2RlbF9mbG93KHByaXYsIG9sZCk7CisJCW1seDVlX3RjX2RlbF9mbG93KHByaXYsIG9sZCwgb2xkX2F0dHIpOwogCiAJZ290byBvdXQ7CiAKQEAgLTQ5Myw3ICs1MzQsNyBAQAogCiAJcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmdGMtPmh0LCAmZmxvdy0+bm9kZSwgdGMtPmh0X3BhcmFtcyk7CiAKLQltbHg1ZV90Y19kZWxfZmxvdyhwcml2LCBmbG93LT5ydWxlKTsKKwltbHg1ZV90Y19kZWxfZmxvdyhwcml2LCBmbG93LT5ydWxlLCBmbG93LT5hdHRyKTsKIAogCWtmcmVlKGZsb3cpOwogCkBAIC01NTAsNyArNTkxLDcgQEAKIAlzdHJ1Y3QgbWx4NWVfdGNfZmxvdyAqZmxvdyA9IHB0cjsKIAlzdHJ1Y3QgbWx4NWVfcHJpdiAqcHJpdiA9IGFyZzsKIAotCW1seDVlX3RjX2RlbF9mbG93KHByaXYsIGZsb3ctPnJ1bGUpOworCW1seDVlX3RjX2RlbF9mbG93KHByaXYsIGZsb3ctPnJ1bGUsIGZsb3ctPmF0dHIpOwogCWtmcmVlKGZsb3cpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdHguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9lbl90eC5jCmluZGV4IGUwNzNiZjU5Li43MGE3MTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdHguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZW5fdHguYwpAQCAtNTIsNyArNTIsNiBAQAogCWNzZWctPm9wbW9kX2lkeF9vcGNvZGUgPSBjcHVfdG9fYmUzMigoc3EtPnBjIDw8IDgpIHwgTUxYNV9PUENPREVfTk9QKTsKIAljc2VnLT5xcG5fZHMgICAgICAgICAgID0gY3B1X3RvX2JlMzIoKHNxLT5zcW4gPDwgOCkgfCAweDAxKTsKIAotCXNxLT5za2JbcGldID0gTlVMTDsKIAlzcS0+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+a3ZkX2hhc2hfZG91YmxlX3NpemUpOworCQkJCQkJCQltYm94LCAxKTsKKwkJbWx4c3dfY21kX21ib3hfY29uZmlnX3Byb2ZpbGVfa3ZkX2hhc2hfZG91YmxlX3NpemVfc2V0KG1ib3gsCisJCQkJCQlyZXNvdXJjZXMtPmt2ZF9kb3VibGVfc2l6ZSk7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IE1MWFNXX0NPTkZJR19QUk9GSUxFX1NXSURfQ09VTlQ7IGkrKykKQEAgLTE1MjQsNyArMTYwNyw3IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfcXVlcnlfcmVzb3VyY2VzOwogCi0JZXJyID0gbWx4c3dfcGNpX2NvbmZpZ19wcm9maWxlKG1seHN3X3BjaSwgbWJveCwgcHJvZmlsZSk7CisJZXJyID0gbWx4c3dfcGNpX2NvbmZpZ19wcm9maWxlKG1seHN3X3BjaSwgbWJveCwgcHJvZmlsZSwgcmVzb3VyY2VzKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9jb25maWdfcHJvZmlsZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcG9ydC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvcG9ydC5oCmluZGV4IGYzM2I5OTcuLmFmMzcxYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3BvcnQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9wb3J0LmgKQEAgLTU2LDYgKzU2LDcgQEAKICNkZWZpbmUgTUxYU1dfUE9SVF9QSFlfQklUU19NQVNLCShNTFhTV19QT1JUX01BWF9QSFlfUE9SVFMgLSAxKQogCiAjZGVmaW5lIE1MWFNXX1BPUlRfQ1BVX1BPUlQJCTB4MAorI2RlZmluZSBNTFhTV19QT1JUX1JPVVRFUl9QT1JUCQkoTUxYU1dfUE9SVF9NQVhfUEhZX1BPUlRTICsgMikKIAogI2RlZmluZSBNTFhTV19QT1JUX0RPTlRfQ0FSRQkJKE1MWFNXX1BPUlRfTUFYX1BPUlRTKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9yZWcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3JlZy5oCmluZGV4IDE3MjEwOTguLjY0NjBjNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3JlZy5oCkBAIC01OTEsNiArNTkxLDEyIEBACiAgKi8KIE1MWFNXX0lURU0zMihyZWcsIHNmbiwgc3dpZCwgMHgwMCwgMjQsIDgpOwogCisvKiByZWdfc2ZuX2VuZAorICogRm9yY2VzIHRoZSBjdXJyZW50IHNlc3Npb24gdG8gZW5kLgorICogQWNjZXNzOiBPUAorICovCitNTFhTV19JVEVNMzIocmVnLCBzZm4sIGVuZCwgMHgwNCwgMjAsIDEpOworCiAvKiByZWdfc2ZuX251bV9yZWMKICAqIFJlcXVlc3Q6IE51bWJlciBvZiBsZWFybmVkIG5vdGlmaWNhdGlvbnMgYW5kIGFnZWQtb3V0IG5vdGlmaWNhdGlvbgogICogcmVjb3JkcyByZXF1ZXN0ZWQuCkBAIC02MDUsNiArNjExLDcgQEAKIHsKIAlNTFhTV19SRUdfWkVSTyhzZm4sIHBheWxvYWQpOwogCW1seHN3X3JlZ19zZm5fc3dpZF9zZXQocGF5bG9hZCwgMCk7CisJbWx4c3dfcmVnX3Nmbl9lbmRfc2V0KHBheWxvYWQsIDEpOwogCW1seHN3X3JlZ19zZm5fbnVtX3JlY19zZXQocGF5bG9hZCwgTUxYU1dfUkVHX1NGTl9SRUNfTUFYX0NPVU5UKTsKIH0KIApAQCAtMTM4NSw3ICsxMzkyLDcgQEAKIHsKIAlNTFhTV19SRUdfWkVSTyhzbGNyLCBwYXlsb2FkKTsKIAltbHhzd19yZWdfc2xjcl9wcF9zZXQocGF5bG9hZCwgTUxYU1dfUkVHX1NMQ1JfUFBfR0xPQkFMKTsKLQltbHhzd19yZWdfc2xjcl90eXBlX3NldChwYXlsb2FkLCBNTFhTV19SRUdfU0xDUl9UWVBFX1hPUik7CisJbWx4c3dfcmVnX3NsY3JfdHlwZV9zZXQocGF5bG9hZCwgTUxYU1dfUkVHX1NMQ1JfVFlQRV9DUkMpOwogCW1seHN3X3JlZ19zbGNyX2xhZ19oYXNoX3NldChwYXlsb2FkLCBsYWdfaGFzaCk7CiB9CiAKQEAgLTIxMzEsNiArMjEzOCwxOCBAQAogICovCiBNTFhTV19JVEVNMzIocmVnLCBwdHlzLCBwcm90b19tYXNrLCAweDAwLCAwLCAzKTsKIAorZW51bSB7CisJTUxYU1dfUkVHX1BUWVNfQU5fU1RBVFVTX05BLAorCU1MWFNXX1JFR19QVFlTX0FOX1NUQVRVU19PSywKKwlNTFhTV19SRUdfUFRZU19BTl9TVEFUVVNfRkFJTCwKK307CisKKy8qIHJlZ19wdHlzX2FuX3N0YXR1cworICogQXV0b25lZ290aWF0aW9uIHN0YXR1cy4KKyAqIEFjY2VzczogUk8KKyAqLworTUxYU1dfSVRFTTMyKHJlZywgcHR5cywgYW5fc3RhdHVzLCAweDA0LCAyOCwgNCk7CisKICNkZWZpbmUgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEX1NHTUlJCQkJQklUKDApCiAjZGVmaW5lIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDAwQkFTRV9LWAkJQklUKDEpCiAjZGVmaW5lIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMEdCQVNFX0NYNAkJQklUKDIpCkBAIC0yMTQ1LDYgKzIxNjQsNyBAQAogI2RlZmluZSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9FUl9MUgkJQklUKDE0KQogI2RlZmluZSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNDBHQkFTRV9TUjQJCUJJVCgxNSkKICNkZWZpbmUgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzQwR0JBU0VfTFI0X0VSNAlCSVQoMTYpCisjZGVmaW5lIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF81MEdCQVNFX1NSMgkJQklUKDE4KQogI2RlZmluZSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNTBHQkFTRV9LUjQJCUJJVCgxOSkKICNkZWZpbmUgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX0NSNAkJQklUKDIwKQogI2RlZmluZSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfU1I0CQlCSVQoMjEpCkBAIC0yMTc3LDYgKzIxOTcsMTMgQEAKICAqLwogTUxYU1dfSVRFTTMyKHJlZywgcHR5cywgZXRoX3Byb3RvX29wZXIsIDB4MjQsIDAsIDMyKTsKIAorLyogcmVnX3B0eXNfZXRoX3Byb3RvX2xwX2FkdmVydGlzZQorICogVGhlIHByb3RvY29scyB0aGF0IHdlcmUgYWR2ZXJ0aXNlZCBieSB0aGUgbGluayBwYXJ0bmVyIGR1cmluZworICogYXV0b25lZ290aWF0aW9uLgorICogQWNjZXNzOiBSTworICovCitNTFhTV19JVEVNMzIocmVnLCBwdHlzLCBldGhfcHJvdG9fbHBfYWR2ZXJ0aXNlLCAweDMwLCAwLCAzMik7CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBtbHhzd19yZWdfcHR5c19wYWNrKGNoYXIgKnBheWxvYWQsIHU4IGxvY2FsX3BvcnQsCiAJCQkJICAgICAgIHUzMiBwcm90b19hZG1pbikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bS5jCmluZGV4IDFmODE2ODkuLjFlYzBhNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW0uYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgPGdlbmVyYXRlZC91dHNyZWxlYXNlLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9jbHMuaD4KICNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX21pcnJlZC5oPgorI2luY2x1ZGUgPG5ldC9uZXRldmVudC5oPgogCiAjaW5jbHVkZSAic3BlY3RydW0uaCIKICNpbmNsdWRlICJjb3JlLmgiCkBAIC0yNDcsNyArMjQ4LDggQEAKIAlzcGFuX2VudHJ5LT51c2VkID0gZmFsc2U7CiB9CiAKLXN0cnVjdCBtbHhzd19zcF9zcGFuX2VudHJ5ICptbHhzd19zcF9zcGFuX2VudHJ5X2ZpbmQoc3RydWN0IG1seHN3X3NwX3BvcnQgKnBvcnQpCitzdGF0aWMgc3RydWN0IG1seHN3X3NwX3NwYW5fZW50cnkgKgorbWx4c3dfc3Bfc3Bhbl9lbnRyeV9maW5kKHN0cnVjdCBtbHhzd19zcF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBwb3J0LT5tbHhzd19zcDsKIAlpbnQgaTsKQEAgLTI2MSw3ICsyNjMsOCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdHJ1Y3QgbWx4c3dfc3Bfc3Bhbl9lbnRyeSAqbWx4c3dfc3Bfc3Bhbl9lbnRyeV9nZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKnBvcnQpCitzdGF0aWMgc3RydWN0IG1seHN3X3NwX3NwYW5fZW50cnkKKyptbHhzd19zcF9zcGFuX2VudHJ5X2dldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgbWx4c3dfc3Bfc3Bhbl9lbnRyeSAqc3Bhbl9lbnRyeTsKIApAQCAtMzYzLDcgKzM2Niw4IEBACiAJfQogCiAJLyogYmluZCB0aGUgcG9ydCB0byB0aGUgU1BBTiBlbnRyeSAqLwotCW1seHN3X3JlZ19tcGFyX3BhY2sobXBhcl9wbCwgcG9ydC0+bG9jYWxfcG9ydCwgdHlwZSwgdHJ1ZSwgcGFfaWQpOworCW1seHN3X3JlZ19tcGFyX3BhY2sobXBhcl9wbCwgcG9ydC0+bG9jYWxfcG9ydCwKKwkJCSAgICAoZW51bSBtbHhzd19yZWdfbXBhcl9pX2UpIHR5cGUsIHRydWUsIHBhX2lkKTsKIAllcnIgPSBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhtcGFyKSwgbXBhcl9wbCk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfbXBhcl9yZWdfd3JpdGU7CkBAIC00MDQsNyArNDA4LDggQEAKIAkJcmV0dXJuOwogCiAJLyogcmVtb3ZlIHRoZSBpbnNwZWN0ZWQgcG9ydCAqLwotCW1seHN3X3JlZ19tcGFyX3BhY2sobXBhcl9wbCwgcG9ydC0+bG9jYWxfcG9ydCwgdHlwZSwgZmFsc2UsIHBhX2lkKTsKKwltbHhzd19yZWdfbXBhcl9wYWNrKG1wYXJfcGwsIHBvcnQtPmxvY2FsX3BvcnQsCisJCQkgICAgKGVudW0gbWx4c3dfcmVnX21wYXJfaV9lKSB0eXBlLCBmYWxzZSwgcGFfaWQpOwogCW1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKG1wYXIpLCBtcGFyX3BsKTsKIAogCS8qIHJlbW92ZSB0aGUgU0JJQiBidWZmZXIgaWYgaXQgd2FzIGVncmVzcyBTUEFOICovCkBAIC01NTUsOCArNTYwLDkgQEAKIAlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc3ZmYSksIHN2ZmFfcGwpOwogfQogCi1zdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKLQkJCQkJICB1MTYgdmlkLCBib29sIGxlYXJuX2VuYWJsZSkKK2ludCBfX21seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKKwkJCQkgICAgIHUxNiB2aWRfYmVnaW4sIHUxNiB2aWRfZW5kLAorCQkJCSAgICAgYm9vbCBsZWFybl9lbmFibGUpCiB7CiAJc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwogCWNoYXIgKnNwdm1scl9wbDsKQEAgLTU2NSwxMyArNTcxLDIwIEBACiAJc3B2bWxyX3BsID0ga21hbGxvYyhNTFhTV19SRUdfU1BWTUxSX0xFTiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzcHZtbHJfcGwpCiAJCXJldHVybiAtRU5PTUVNOwotCW1seHN3X3JlZ19zcHZtbHJfcGFjayhzcHZtbHJfcGwsIG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQsIHZpZCwgdmlkLAotCQkJICAgICAgbGVhcm5fZW5hYmxlKTsKKwltbHhzd19yZWdfc3B2bWxyX3BhY2soc3B2bWxyX3BsLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0LCB2aWRfYmVnaW4sCisJCQkgICAgICB2aWRfZW5kLCBsZWFybl9lbmFibGUpOwogCWVyciA9IG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHNwdm1sciksIHNwdm1scl9wbCk7CiAJa2ZyZWUoc3B2bWxyX3BsKTsKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKKwkJCQkJICB1MTYgdmlkLCBib29sIGxlYXJuX2VuYWJsZSkKK3sKKwlyZXR1cm4gX19tbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQobWx4c3dfc3BfcG9ydCwgdmlkLCB2aWQsCisJCQkJCQlsZWFybl9lbmFibGUpOworfQorCiBzdGF0aWMgaW50CiBtbHhzd19zcF9wb3J0X3N5c3RlbV9wb3J0X21hcHBpbmdfc2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0KQogewpAQCAtODEwLDkgKzgyMyw5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqCi1tbHhzd19zcF9wb3J0X2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCitzdGF0aWMgaW50CittbHhzd19zcF9wb3J0X2dldF9zd19zdGF0czY0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqc3RhdHMpCiB7CiAJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbHhzd19zcF9wb3J0X3BjcHVfc3RhdHMgKnA7CkBAIC04MzksNiArODUyLDEwNyBAQAogCQl0eF9kcm9wcGVkCSs9IHAtPnR4X2Ryb3BwZWQ7CiAJfQogCXN0YXRzLT50eF9kcm9wcGVkCT0gdHhfZHJvcHBlZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgbWx4c3dfc3BfcG9ydF9oYXNfb2ZmbG9hZF9zdGF0cyhpbnQgYXR0cl9pZCkKK3sKKwlzd2l0Y2ggKGF0dHJfaWQpIHsKKwljYXNlIElGTEFfT0ZGTE9BRF9YU1RBVFNfQ1BVX0hJVDoKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfZ2V0X29mZmxvYWRfc3RhdHMoaW50IGF0dHJfaWQsIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgIHZvaWQgKnNwKQoreworCXN3aXRjaCAoYXR0cl9pZCkgeworCWNhc2UgSUZMQV9PRkZMT0FEX1hTVEFUU19DUFVfSElUOgorCQlyZXR1cm4gbWx4c3dfc3BfcG9ydF9nZXRfc3dfc3RhdHM2NChkZXYsIHNwKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBtbHhzd19zcF9wb3J0X2dldF9zdGF0c19yYXcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGdycCwKKwkJCQkgICAgICAgaW50IHByaW8sIGNoYXIgKnBwY250X3BsKQoreworCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CisKKwltbHhzd19yZWdfcHBjbnRfcGFjayhwcGNudF9wbCwgbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydCwgZ3JwLCBwcmlvKTsKKwlyZXR1cm4gbWx4c3dfcmVnX3F1ZXJ5KG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocHBjbnQpLCBwcGNudF9wbCk7Cit9CisKK3N0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9nZXRfaHdfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQoreworCWNoYXIgcHBjbnRfcGxbTUxYU1dfUkVHX1BQQ05UX0xFTl07CisJaW50IGVycjsKKworCWVyciA9IG1seHN3X3NwX3BvcnRfZ2V0X3N0YXRzX3JhdyhkZXYsIE1MWFNXX1JFR19QUENOVF9JRUVFXzgwMjNfQ05ULAorCQkJCQkgIDAsIHBwY250X3BsKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXN0YXRzLT50eF9wYWNrZXRzID0KKwkJbWx4c3dfcmVnX3BwY250X2FfZnJhbWVzX3RyYW5zbWl0dGVkX29rX2dldChwcGNudF9wbCk7CisJc3RhdHMtPnJ4X3BhY2tldHMgPQorCQltbHhzd19yZWdfcHBjbnRfYV9mcmFtZXNfcmVjZWl2ZWRfb2tfZ2V0KHBwY250X3BsKTsKKwlzdGF0cy0+dHhfYnl0ZXMgPQorCQltbHhzd19yZWdfcHBjbnRfYV9vY3RldHNfdHJhbnNtaXR0ZWRfb2tfZ2V0KHBwY250X3BsKTsKKwlzdGF0cy0+cnhfYnl0ZXMgPQorCQltbHhzd19yZWdfcHBjbnRfYV9vY3RldHNfcmVjZWl2ZWRfb2tfZ2V0KHBwY250X3BsKTsKKwlzdGF0cy0+bXVsdGljYXN0ID0KKwkJbWx4c3dfcmVnX3BwY250X2FfbXVsdGljYXN0X2ZyYW1lc19yZWNlaXZlZF9va19nZXQocHBjbnRfcGwpOworCisJc3RhdHMtPnJ4X2NyY19lcnJvcnMgPQorCQltbHhzd19yZWdfcHBjbnRfYV9mcmFtZV9jaGVja19zZXF1ZW5jZV9lcnJvcnNfZ2V0KHBwY250X3BsKTsKKwlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzID0KKwkJbWx4c3dfcmVnX3BwY250X2FfYWxpZ25tZW50X2Vycm9yc19nZXQocHBjbnRfcGwpOworCisJc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMgPSAoCisJCW1seHN3X3JlZ19wcGNudF9hX2luX3JhbmdlX2xlbmd0aF9lcnJvcnNfZ2V0KHBwY250X3BsKSArCisJCW1seHN3X3JlZ19wcGNudF9hX291dF9vZl9yYW5nZV9sZW5ndGhfZmllbGRfZ2V0KHBwY250X3BsKSArCisJCW1seHN3X3JlZ19wcGNudF9hX2ZyYW1lX3Rvb19sb25nX2Vycm9yc19nZXQocHBjbnRfcGwpKTsKKworCXN0YXRzLT5yeF9lcnJvcnMgPSAoc3RhdHMtPnJ4X2NyY19lcnJvcnMgKworCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzICsgc3RhdHMtPnJ4X2xlbmd0aF9lcnJvcnMpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXRzX2NhY2hlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbWx4c3dfc3BfcG9ydCwKKwkJCSAgICAgaHdfc3RhdHMudXBkYXRlX2R3LndvcmspOworCisJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG1seHN3X3NwX3BvcnQtPmRldikpCisJCWdvdG8gb3V0OworCisJbWx4c3dfc3BfcG9ydF9nZXRfaHdfc3RhdHMobWx4c3dfc3BfcG9ydC0+ZGV2LAorCQkJCSAgIG1seHN3X3NwX3BvcnQtPmh3X3N0YXRzLmNhY2hlKTsKKworb3V0OgorCW1seHN3X2NvcmVfc2NoZWR1bGVfZHcoJm1seHN3X3NwX3BvcnQtPmh3X3N0YXRzLnVwZGF0ZV9kdywKKwkJCSAgICAgICBNTFhTV19IV19TVEFUU19VUERBVEVfVElNRSk7Cit9CisKKy8qIFJldHVybiB0aGUgc3RhdHMgZnJvbSBhIGNhY2hlIHRoYXQgaXMgdXBkYXRlZCBwZXJpb2RpY2FsbHksCisgKiBhcyB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGdldCBjYWxsZWQgaW4gYW4gYXRvbWljIGNvbnRleHQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKgorbWx4c3dfc3BfcG9ydF9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQoreworCXN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW1lbWNweShzdGF0cywgbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMuY2FjaGUsIHNpemVvZigqc3RhdHMpKTsKKwogCXJldHVybiBzdGF0czsKIH0KIApAQCAtOTczLDEwICsxMDg3LDYgQEAKIAkJCWdvdG8gZXJyX3BvcnRfdnBfbW9kZV90cmFuczsKIAl9CiAKLQllcnIgPSBtbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQobWx4c3dfc3BfdnBvcnQsIHZpZCwgZmFsc2UpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3BvcnRfdmlkX2xlYXJuaW5nX3NldDsKLQogCWVyciA9IG1seHN3X3NwX3BvcnRfdmxhbl9zZXQobWx4c3dfc3BfdnBvcnQsIHZpZCwgdmlkLCB0cnVlLCB1bnRhZ2dlZCk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfcG9ydF9hZGRfdmlkOwpAQCAtOTg0LDggKzEwOTQsNiBAQAogCXJldHVybiAwOwogCiBlcnJfcG9ydF9hZGRfdmlkOgotCW1seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF92cG9ydCwgdmlkLCB0cnVlKTsKLWVycl9wb3J0X3ZpZF9sZWFybmluZ19zZXQ6CiAJaWYgKGxpc3RfaXNfc2luZ3VsYXIoJm1seHN3X3NwX3BvcnQtPnZwb3J0c19saXN0KSkKIAkJbWx4c3dfc3BfcG9ydF92bGFuX21vZGVfdHJhbnMobWx4c3dfc3BfcG9ydCk7CiBlcnJfcG9ydF92cF9tb2RlX3RyYW5zOgpAQCAtMTAxMiw4ICsxMTIwLDYgQEAKIAogCW1seHN3X3NwX3BvcnRfdmxhbl9zZXQobWx4c3dfc3BfdnBvcnQsIHZpZCwgdmlkLCBmYWxzZSwgZmFsc2UpOwogCi0JbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3Zwb3J0LCB2aWQsIHRydWUpOwotCiAJLyogRHJvcCBGSUQgcmVmZXJlbmNlLiBJZiB0aGlzIHdhcyB0aGUgbGFzdCByZWZlcmVuY2UgdGhlCiAJICogcmVzb3VyY2VzIHdpbGwgYmUgZnJlZWQuCiAJICovCkBAIC0xMjA4LDYgKzEzMTQsOCBAQAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gbWx4c3dfc3BfcG9ydF9zZXRfbWFjX2FkZHJlc3MsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IG1seHN3X3NwX3BvcnRfY2hhbmdlX210dSwKIAkubmRvX2dldF9zdGF0czY0CT0gbWx4c3dfc3BfcG9ydF9nZXRfc3RhdHM2NCwKKwkubmRvX2hhc19vZmZsb2FkX3N0YXRzCT0gbWx4c3dfc3BfcG9ydF9oYXNfb2ZmbG9hZF9zdGF0cywKKwkubmRvX2dldF9vZmZsb2FkX3N0YXRzCT0gbWx4c3dfc3BfcG9ydF9nZXRfb2ZmbG9hZF9zdGF0cywKIAkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IG1seHN3X3NwX3BvcnRfYWRkX3ZpZCwKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSBtbHhzd19zcF9wb3J0X2tpbGxfdmlkLAogCS5uZG9fbmVpZ2hfY29uc3RydWN0CT0gbWx4c3dfc3Bfcm91dGVyX25laWdoX2NvbnN0cnVjdCwKQEAgLTE1NDYsOCArMTY1NCw2IEBACiAJCQkJICAgICAgZW51bSBtbHhzd19yZWdfcHBjbnRfZ3JwIGdycCwgaW50IHByaW8sCiAJCQkJICAgICAgdTY0ICpkYXRhLCBpbnQgZGF0YV9pbmRleCkKIHsKLQlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwogCXN0cnVjdCBtbHhzd19zcF9wb3J0X2h3X3N0YXRzICpod19zdGF0czsKIAljaGFyIHBwY250X3BsW01MWFNXX1JFR19QUENOVF9MRU5dOwogCWludCBpLCBsZW47CkBAIC0xNTU2LDEwICsxNjYyLDkgQEAKIAllcnIgPSBtbHhzd19zcF9nZXRfaHdfc3RhdHNfYnlfZ3JvdXAoJmh3X3N0YXRzLCAmbGVuLCBncnApOwogCWlmIChlcnIpCiAJCXJldHVybjsKLQltbHhzd19yZWdfcHBjbnRfcGFjayhwcGNudF9wbCwgbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydCwgZ3JwLCBwcmlvKTsKLQllcnIgPSBtbHhzd19yZWdfcXVlcnkobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhwcGNudCksIHBwY250X3BsKTsKKwltbHhzd19zcF9wb3J0X2dldF9zdGF0c19yYXcoZGV2LCBncnAsIHByaW8sIHBwY250X3BsKTsKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JCWRhdGFbZGF0YV9pbmRleCArIGldID0gIWVyciA/IGh3X3N0YXRzW2ldLmdldHRlcihwcGNudF9wbCkgOiAwOworCQlkYXRhW2RhdGFfaW5kZXggKyBpXSA9IGh3X3N0YXRzW2ldLmdldHRlcihwcGNudF9wbCk7CiB9CiAKIHN0YXRpYyB2b2lkIG1seHN3X3NwX3BvcnRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0xNTk4LDExMiArMTcwMywxNDkgQEAKIH0KIAogc3RydWN0IG1seHN3X3NwX3BvcnRfbGlua19tb2RlIHsKKwllbnVtIGV0aHRvb2xfbGlua19tb2RlX2JpdF9pbmRpY2VzIG1hc2tfZXRodG9vbDsKIAl1MzIgbWFzazsKLQl1MzIgc3VwcG9ydGVkOwotCXUzMiBhZHZlcnRpc2VkOwogCXUzMiBzcGVlZDsKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbWx4c3dfc3BfcG9ydF9saW5rX21vZGUgbWx4c3dfc3BfcG9ydF9saW5rX21vZGVbXSA9IHsKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBCQVNFX1QsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfMTAwYmFzZVRfRnVsbCwKLQkJLmFkdmVydGlzZWQJPSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwsCi0JCS5zcGVlZAkJPSAxMDAsCi0JfSwKLQl7Ci0JCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBCQVNFX1RYLAotCQkuc3BlZWQJCT0gMTAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMTAwYmFzZVRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8xMDAsCiAJfSwKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF9TR01JSSB8CiAJCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwMEJBU0VfS1gsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfMTAwMGJhc2VLWF9GdWxsLAotCQkuc3BlZWQJCT0gMTAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzEwMDBiYXNlS1hfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8xMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9ULAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCwKLQkJLmFkdmVydGlzZWQJPSBBRFZFUlRJU0VEXzEwMDAwYmFzZVRfRnVsbCwKLQkJLnNwZWVkCQk9IDEwMDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlVF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9DWDQgfAogCQkJCSAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwR0JBU0VfS1g0LAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzEwMDAwYmFzZUtYNF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfMTAwMDBiYXNlS1g0X0Z1bGwsCi0JCS5zcGVlZAkJPSAxMDAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzEwMDAwYmFzZUtYNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9LUiB8CiAJCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9DUiB8CiAJCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9TUiB8CiAJCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9FUl9MUiwKLQkJLnN1cHBvcnRlZAk9IFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfMTAwMDBiYXNlS1JfRnVsbCwKLQkJLnNwZWVkCQk9IDEwMDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlS1JfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8xMDAwMCwKIAl9LAogCXsKIAkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzIwR0JBU0VfS1IyLAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzIwMDAwYmFzZUtSMl9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfMjAwMDBiYXNlS1IyX0Z1bGwsCi0JCS5zcGVlZAkJPSAyMDAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzIwMDAwYmFzZUtSMl9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzIwMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNDBHQkFTRV9DUjQsCi0JCS5zdXBwb3J0ZWQJPSBTVVBQT1JURURfNDAwMDBiYXNlQ1I0X0Z1bGwsCi0JCS5hZHZlcnRpc2VkCT0gQURWRVJUSVNFRF80MDAwMGJhc2VDUjRfRnVsbCwKLQkJLnNwZWVkCQk9IDQwMDAwLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfNDAwMDBiYXNlQ1I0X0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfNDAwMDAsCiAJfSwKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF80MEdCQVNFX0tSNCwKLQkJLnN1cHBvcnRlZAk9IFNVUFBPUlRFRF80MDAwMGJhc2VLUjRfRnVsbCwKLQkJLmFkdmVydGlzZWQJPSBBRFZFUlRJU0VEXzQwMDAwYmFzZUtSNF9GdWxsLAotCQkuc3BlZWQJCT0gNDAwMDAsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV80MDAwMGJhc2VLUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF80MDAwMCwKIAl9LAogCXsKIAkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzQwR0JBU0VfU1I0LAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzQwMDAwYmFzZVNSNF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfNDAwMDBiYXNlU1I0X0Z1bGwsCi0JCS5zcGVlZAkJPSA0MDAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzQwMDAwYmFzZVNSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzQwMDAwLAogCX0sCiAJewogCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNDBHQkFTRV9MUjRfRVI0LAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzQwMDAwYmFzZUxSNF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfNDAwMDBiYXNlTFI0X0Z1bGwsCi0JCS5zcGVlZAkJPSA0MDAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzQwMDAwYmFzZUxSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzQwMDAwLAogCX0sCiAJewotCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjVHQkFTRV9DUiB8Ci0JCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjVHQkFTRV9LUiB8Ci0JCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjVHQkFTRV9TUiwKLQkJLnNwZWVkCQk9IDI1MDAwLAorCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjVHQkFTRV9DUiwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzI1MDAwYmFzZUNSX0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMjUwMDAsCiAJfSwKIAl7Ci0JCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF81MEdCQVNFX0tSNCB8Ci0JCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNTBHQkFTRV9DUjIgfAotCQkJCSAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzUwR0JBU0VfS1IyLAotCQkuc3BlZWQJCT0gNTAwMDAsCisJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8yNUdCQVNFX0tSLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMjUwMDBiYXNlS1JfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8yNTAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzI1R0JBU0VfU1IsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV8yNTAwMGJhc2VTUl9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzI1MDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMjVHQkFTRV9TUiwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzI1MDAwYmFzZVNSX0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMjUwMDAsCisJfSwKKwl7CisJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF81MEdCQVNFX0NSMiwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzUwMDAwYmFzZUNSMl9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzUwMDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNTBHQkFTRV9LUjIsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV81MDAwMGJhc2VLUjJfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF81MDAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzUwR0JBU0VfU1IyLAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfNTAwMDBiYXNlU1IyX0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfNTAwMDAsCiAJfSwKIAl7CiAJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF81NkdCQVNFX1I0LAotCQkuc3VwcG9ydGVkCT0gU1VQUE9SVEVEXzU2MDAwYmFzZUtSNF9GdWxsLAotCQkuYWR2ZXJ0aXNlZAk9IEFEVkVSVElTRURfNTYwMDBiYXNlS1I0X0Z1bGwsCi0JCS5zcGVlZAkJPSA1NjAwMCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzU2MDAwYmFzZUtSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzU2MDAwLAogCX0sCiAJewotCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfQ1I0IHwKLQkJCQkgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBHQkFTRV9TUjQgfAotCQkJCSAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX0tSNCB8Ci0JCQkJICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfTFI0X0VSNCwKLQkJLnNwZWVkCQk9IDEwMDAwMCwKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzU2R0JBU0VfUjQsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV81NjAwMGJhc2VDUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF81NjAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzU2R0JBU0VfUjQsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV81NjAwMGJhc2VTUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF81NjAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzU2R0JBU0VfUjQsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV81NjAwMGJhc2VMUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF81NjAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX0NSNCwKKwkJLm1hc2tfZXRodG9vbAk9IEVUSFRPT0xfTElOS19NT0RFXzEwMDAwMGJhc2VDUjRfRnVsbF9CSVQsCisJCS5zcGVlZAkJPSBTUEVFRF8xMDAwMDAsCisJfSwKKwl7CisJCS5tYXNrCQk9IE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBHQkFTRV9TUjQsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV8xMDAwMDBiYXNlU1I0X0Z1bGxfQklULAorCQkuc3BlZWQJCT0gU1BFRURfMTAwMDAwLAorCX0sCisJeworCQkubWFzawkJPSBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTAwR0JBU0VfS1I0LAorCQkubWFza19ldGh0b29sCT0gRVRIVE9PTF9MSU5LX01PREVfMTAwMDAwYmFzZUtSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMDAwMCwKKwl9LAorCXsKKwkJLm1hc2sJCT0gTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX0xSNF9FUjQsCisJCS5tYXNrX2V0aHRvb2wJPSBFVEhUT09MX0xJTktfTU9ERV8xMDAwMDBiYXNlTFI0X0VSNF9GdWxsX0JJVCwKKwkJLnNwZWVkCQk9IFNQRUVEXzEwMDAwMCwKIAl9LAogfTsKIAogI2RlZmluZSBNTFhTV19TUF9QT1JUX0xJTktfTU9ERV9MRU4gQVJSQVlfU0laRShtbHhzd19zcF9wb3J0X2xpbmtfbW9kZSkKIAotc3RhdGljIHUzMiBtbHhzd19zcF9mcm9tX3B0eXNfc3VwcG9ydGVkX3BvcnQodTMyIHB0eXNfZXRoX3Byb3RvKQorc3RhdGljIHZvaWQKK21seHN3X3NwX2Zyb21fcHR5c19zdXBwb3J0ZWRfcG9ydCh1MzIgcHR5c19ldGhfcHJvdG8sCisJCQkJICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCWlmIChwdHlzX2V0aF9wcm90byAmIChNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9DUiB8CiAJCQkgICAgICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9TUiB8CkBAIC0xNzExLDQzICsxODUzLDI5IEBACiAJCQkgICAgICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfNDBHQkFTRV9TUjQgfAogCQkJICAgICAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMEdCQVNFX1NSNCB8CiAJCQkgICAgICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfU0dNSUkpKQotCQlyZXR1cm4gU1VQUE9SVEVEX0ZJQlJFOworCQlldGh0b29sX2xpbmtfa3NldHRpbmdzX2FkZF9saW5rX21vZGUoY21kLCBzdXBwb3J0ZWQsIEZJQlJFKTsKIAogCWlmIChwdHlzX2V0aF9wcm90byAmIChNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9LUiB8CiAJCQkgICAgICBNTFhTV19SRUdfUFRZU19FVEhfU1BFRURfMTBHQkFTRV9LWDQgfAogCQkJICAgICAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzQwR0JBU0VfS1I0IHwKIAkJCSAgICAgIE1MWFNXX1JFR19QVFlTX0VUSF9TUEVFRF8xMDBHQkFTRV9LUjQgfAogCQkJICAgICAgTUxYU1dfUkVHX1BUWVNfRVRIX1NQRUVEXzEwMDBCQVNFX0tYKSkKLQkJcmV0dXJuIFNVUFBPUlRFRF9CYWNrcGxhbmU7Ci0JcmV0dXJuIDA7CisJCWV0aHRvb2xfbGlua19rc2V0dGluZ3NfYWRkX2xpbmtfbW9kZShjbWQsIHN1cHBvcnRlZCwgQmFja3BsYW5lKTsKIH0KIAotc3RhdGljIHUzMiBtbHhzd19zcF9mcm9tX3B0eXNfc3VwcG9ydGVkX2xpbmsodTMyIHB0eXNfZXRoX3Byb3RvKQorc3RhdGljIHZvaWQgbWx4c3dfc3BfZnJvbV9wdHlzX2xpbmsodTMyIHB0eXNfZXRoX3Byb3RvLCB1bnNpZ25lZCBsb25nICptb2RlKQogewotCXUzMiBtb2RlcyA9IDA7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfUE9SVF9MSU5LX01PREVfTEVOOyBpKyspIHsKIAkJaWYgKHB0eXNfZXRoX3Byb3RvICYgbWx4c3dfc3BfcG9ydF9saW5rX21vZGVbaV0ubWFzaykKLQkJCW1vZGVzIHw9IG1seHN3X3NwX3BvcnRfbGlua19tb2RlW2ldLnN1cHBvcnRlZDsKKwkJCV9fc2V0X2JpdChtbHhzd19zcF9wb3J0X2xpbmtfbW9kZVtpXS5tYXNrX2V0aHRvb2wsCisJCQkJICBtb2RlKTsKIAl9Ci0JcmV0dXJuIG1vZGVzOwotfQotCi1zdGF0aWMgdTMyIG1seHN3X3NwX2Zyb21fcHR5c19hZHZlcnRfbGluayh1MzIgcHR5c19ldGhfcHJvdG8pCi17Ci0JdTMyIG1vZGVzID0gMDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNTFhTV19TUF9QT1JUX0xJTktfTU9ERV9MRU47IGkrKykgewotCQlpZiAocHR5c19ldGhfcHJvdG8gJiBtbHhzd19zcF9wb3J0X2xpbmtfbW9kZVtpXS5tYXNrKQotCQkJbW9kZXMgfD0gbWx4c3dfc3BfcG9ydF9saW5rX21vZGVbaV0uYWR2ZXJ0aXNlZDsKLQl9Ci0JcmV0dXJuIG1vZGVzOwogfQogCiBzdGF0aWMgdm9pZCBtbHhzd19zcF9mcm9tX3B0eXNfc3BlZWRfZHVwbGV4KGJvb2wgY2Fycmllcl9vaywgdTMyIHB0eXNfZXRoX3Byb3RvLAotCQkJCQkgICAgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCisJCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQogewogCXUzMiBzcGVlZCA9IFNQRUVEX1VOS05PV047CiAJdTggZHVwbGV4ID0gRFVQTEVYX1VOS05PV047CkBAIC0xNzY0LDggKzE4OTIsOCBAQAogCQl9CiAJfQogb3V0OgotCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIHNwZWVkKTsKLQljbWQtPmR1cGxleCA9IGR1cGxleDsKKwljbWQtPmJhc2Uuc3BlZWQgPSBzcGVlZDsKKwljbWQtPmJhc2UuZHVwbGV4ID0gZHVwbGV4OwogfQogCiBzdGF0aWMgdTggbWx4c3dfc3BfcG9ydF9jb25uZWN0b3JfcG9ydCh1MzIgcHR5c19ldGhfcHJvdG8pCkBAIC0xNzkwLDQ5ICsxOTE4LDE1IEBACiAJcmV0dXJuIFBPUlRfT1RIRVI7CiB9CiAKLXN0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwotCWNoYXIgcHR5c19wbFtNTFhTV19SRUdfUFRZU19MRU5dOwotCXUzMiBldGhfcHJvdG9fY2FwOwotCXUzMiBldGhfcHJvdG9fYWRtaW47Ci0JdTMyIGV0aF9wcm90b19vcGVyOwotCWludCBlcnI7Ci0KLQltbHhzd19yZWdfcHR5c19wYWNrKHB0eXNfcGwsIG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQsIDApOwotCWVyciA9IG1seHN3X3JlZ19xdWVyeShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHB0eXMpLCBwdHlzX3BsKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBwcm90byIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQltbHhzd19yZWdfcHR5c191bnBhY2socHR5c19wbCwgJmV0aF9wcm90b19jYXAsCi0JCQkgICAgICAmZXRoX3Byb3RvX2FkbWluLCAmZXRoX3Byb3RvX29wZXIpOwotCi0JY21kLT5zdXBwb3J0ZWQgPSBtbHhzd19zcF9mcm9tX3B0eXNfc3VwcG9ydGVkX3BvcnQoZXRoX3Byb3RvX2NhcCkgfAotCQkJIG1seHN3X3NwX2Zyb21fcHR5c19zdXBwb3J0ZWRfbGluayhldGhfcHJvdG9fY2FwKSB8Ci0JCQkgU1VQUE9SVEVEX1BhdXNlIHwgU1VQUE9SVEVEX0FzeW1fUGF1c2UgfAotCQkJIFNVUFBPUlRFRF9BdXRvbmVnOwotCWNtZC0+YWR2ZXJ0aXNpbmcgPSBtbHhzd19zcF9mcm9tX3B0eXNfYWR2ZXJ0X2xpbmsoZXRoX3Byb3RvX2FkbWluKTsKLQltbHhzd19zcF9mcm9tX3B0eXNfc3BlZWRfZHVwbGV4KG5ldGlmX2NhcnJpZXJfb2soZGV2KSwKLQkJCQkJZXRoX3Byb3RvX29wZXIsIGNtZCk7Ci0KLQlldGhfcHJvdG9fb3BlciA9IGV0aF9wcm90b19vcGVyID8gZXRoX3Byb3RvX29wZXIgOiBldGhfcHJvdG9fY2FwOwotCWNtZC0+cG9ydCA9IG1seHN3X3NwX3BvcnRfY29ubmVjdG9yX3BvcnQoZXRoX3Byb3RvX29wZXIpOwotCWNtZC0+bHBfYWR2ZXJ0aXNpbmcgPSBtbHhzd19zcF9mcm9tX3B0eXNfYWR2ZXJ0X2xpbmsoZXRoX3Byb3RvX29wZXIpOwotCi0JY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1MzIgbWx4c3dfc3BfdG9fcHR5c19hZHZlcnRfbGluayh1MzIgYWR2ZXJ0aXNpbmcpCitzdGF0aWMgdTMyCittbHhzd19zcF90b19wdHlzX2FkdmVydF9saW5rKGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJdTMyIHB0eXNfcHJvdG8gPSAwOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1BPUlRfTElOS19NT0RFX0xFTjsgaSsrKSB7Ci0JCWlmIChhZHZlcnRpc2luZyAmIG1seHN3X3NwX3BvcnRfbGlua19tb2RlW2ldLmFkdmVydGlzZWQpCisJCWlmICh0ZXN0X2JpdChtbHhzd19zcF9wb3J0X2xpbmtfbW9kZVtpXS5tYXNrX2V0aHRvb2wsCisJCQkgICAgIGNtZC0+bGlua19tb2Rlcy5hZHZlcnRpc2luZykpCiAJCQlwdHlzX3Byb3RvIHw9IG1seHN3X3NwX3BvcnRfbGlua19tb2RlW2ldLm1hc2s7CiAJfQogCXJldHVybiBwdHlzX3Byb3RvOwpAQCAtMTg2Miw2MSArMTk1NiwxMTMgQEAKIAlyZXR1cm4gcHR5c19wcm90bzsKIH0KIAotc3RhdGljIGludCBtbHhzd19zcF9wb3J0X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQorc3RhdGljIHZvaWQgbWx4c3dfc3BfcG9ydF9nZXRfbGlua19zdXBwb3J0ZWQodTMyIGV0aF9wcm90b19jYXAsCisJCQkJCSAgICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKK3sKKwlldGh0b29sX2xpbmtfa3NldHRpbmdzX2FkZF9saW5rX21vZGUoY21kLCBzdXBwb3J0ZWQsIEFzeW1fUGF1c2UpOworCWV0aHRvb2xfbGlua19rc2V0dGluZ3NfYWRkX2xpbmtfbW9kZShjbWQsIHN1cHBvcnRlZCwgQXV0b25lZyk7CisJZXRodG9vbF9saW5rX2tzZXR0aW5nc19hZGRfbGlua19tb2RlKGNtZCwgc3VwcG9ydGVkLCBQYXVzZSk7CisKKwltbHhzd19zcF9mcm9tX3B0eXNfc3VwcG9ydGVkX3BvcnQoZXRoX3Byb3RvX2NhcCwgY21kKTsKKwltbHhzd19zcF9mcm9tX3B0eXNfbGluayhldGhfcHJvdG9fY2FwLCBjbWQtPmxpbmtfbW9kZXMuc3VwcG9ydGVkKTsKK30KKworc3RhdGljIHZvaWQgbWx4c3dfc3BfcG9ydF9nZXRfbGlua19hZHZlcnRpc2UodTMyIGV0aF9wcm90b19hZG1pbiwgYm9vbCBhdXRvbmVnLAorCQkJCQkgICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCit7CisJaWYgKCFhdXRvbmVnKQorCQlyZXR1cm47CisKKwlldGh0b29sX2xpbmtfa3NldHRpbmdzX2FkZF9saW5rX21vZGUoY21kLCBhZHZlcnRpc2luZywgQXV0b25lZyk7CisJbWx4c3dfc3BfZnJvbV9wdHlzX2xpbmsoZXRoX3Byb3RvX2FkbWluLCBjbWQtPmxpbmtfbW9kZXMuYWR2ZXJ0aXNpbmcpOworfQorCitzdGF0aWMgdm9pZAorbWx4c3dfc3BfcG9ydF9nZXRfbGlua19scF9hZHZlcnRpc2UodTMyIGV0aF9wcm90b19scCwgdTggYXV0b25lZ19zdGF0dXMsCisJCQkJICAgIHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCit7CisJaWYgKGF1dG9uZWdfc3RhdHVzICE9IE1MWFNXX1JFR19QVFlTX0FOX1NUQVRVU19PSyB8fCAhZXRoX3Byb3RvX2xwKQorCQlyZXR1cm47CisKKwlldGh0b29sX2xpbmtfa3NldHRpbmdzX2FkZF9saW5rX21vZGUoY21kLCBscF9hZHZlcnRpc2luZywgQXV0b25lZyk7CisJbWx4c3dfc3BfZnJvbV9wdHlzX2xpbmsoZXRoX3Byb3RvX2xwLCBjbWQtPmxpbmtfbW9kZXMubHBfYWR2ZXJ0aXNpbmcpOworfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3BvcnRfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9saW5rX2tzZXR0aW5ncyAqY21kKQoreworCXUzMiBldGhfcHJvdG9fY2FwLCBldGhfcHJvdG9fYWRtaW4sIGV0aF9wcm90b19vcGVyLCBldGhfcHJvdG9fbHA7CisJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBtbHhzd19zcF9wb3J0LT5tbHhzd19zcDsKKwljaGFyIHB0eXNfcGxbTUxYU1dfUkVHX1BUWVNfTEVOXTsKKwl1OCBhdXRvbmVnX3N0YXR1czsKKwlib29sIGF1dG9uZWc7CisJaW50IGVycjsKKworCWF1dG9uZWcgPSBtbHhzd19zcF9wb3J0LT5saW5rLmF1dG9uZWc7CisJbWx4c3dfcmVnX3B0eXNfcGFjayhwdHlzX3BsLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0LCAwKTsKKwllcnIgPSBtbHhzd19yZWdfcXVlcnkobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhwdHlzKSwgcHR5c19wbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwltbHhzd19yZWdfcHR5c191bnBhY2socHR5c19wbCwgJmV0aF9wcm90b19jYXAsICZldGhfcHJvdG9fYWRtaW4sCisJCQkgICAgICAmZXRoX3Byb3RvX29wZXIpOworCisJbWx4c3dfc3BfcG9ydF9nZXRfbGlua19zdXBwb3J0ZWQoZXRoX3Byb3RvX2NhcCwgY21kKTsKKworCW1seHN3X3NwX3BvcnRfZ2V0X2xpbmtfYWR2ZXJ0aXNlKGV0aF9wcm90b19hZG1pbiwgYXV0b25lZywgY21kKTsKKworCWV0aF9wcm90b19scCA9IG1seHN3X3JlZ19wdHlzX2V0aF9wcm90b19scF9hZHZlcnRpc2VfZ2V0KHB0eXNfcGwpOworCWF1dG9uZWdfc3RhdHVzID0gbWx4c3dfcmVnX3B0eXNfYW5fc3RhdHVzX2dldChwdHlzX3BsKTsKKwltbHhzd19zcF9wb3J0X2dldF9saW5rX2xwX2FkdmVydGlzZShldGhfcHJvdG9fbHAsIGF1dG9uZWdfc3RhdHVzLCBjbWQpOworCisJY21kLT5iYXNlLmF1dG9uZWcgPSBhdXRvbmVnID8gQVVUT05FR19FTkFCTEUgOiBBVVRPTkVHX0RJU0FCTEU7CisJY21kLT5iYXNlLnBvcnQgPSBtbHhzd19zcF9wb3J0X2Nvbm5lY3Rvcl9wb3J0KGV0aF9wcm90b19vcGVyKTsKKwltbHhzd19zcF9mcm9tX3B0eXNfc3BlZWRfZHVwbGV4KG5ldGlmX2NhcnJpZXJfb2soZGV2KSwgZXRoX3Byb3RvX29wZXIsCisJCQkJCWNtZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbWx4c3dfc3BfcG9ydF9zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1seHN3X3NwICptbHhzd19zcCA9IG1seHN3X3NwX3BvcnQtPm1seHN3X3NwOwogCWNoYXIgcHR5c19wbFtNTFhTV19SRUdfUFRZU19MRU5dOwotCXUzMiBzcGVlZDsKLQl1MzIgZXRoX3Byb3RvX25ldzsKLQl1MzIgZXRoX3Byb3RvX2NhcDsKLQl1MzIgZXRoX3Byb3RvX2FkbWluOworCXUzMiBldGhfcHJvdG9fY2FwLCBldGhfcHJvdG9fbmV3OworCWJvb2wgYXV0b25lZzsKIAlpbnQgZXJyOwogCi0Jc3BlZWQgPSBldGh0b29sX2NtZF9zcGVlZChjbWQpOwotCi0JZXRoX3Byb3RvX25ldyA9IGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSA/Ci0JCW1seHN3X3NwX3RvX3B0eXNfYWR2ZXJ0X2xpbmsoY21kLT5hZHZlcnRpc2luZykgOgotCQltbHhzd19zcF90b19wdHlzX3NwZWVkKHNwZWVkKTsKLQogCW1seHN3X3JlZ19wdHlzX3BhY2socHR5c19wbCwgbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydCwgMCk7CiAJZXJyID0gbWx4c3dfcmVnX3F1ZXJ5KG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocHR5cyksIHB0eXNfcGwpOwotCWlmIChlcnIpIHsKLQkJbmV0ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHByb3RvIik7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKLQl9Ci0JbWx4c3dfcmVnX3B0eXNfdW5wYWNrKHB0eXNfcGwsICZldGhfcHJvdG9fY2FwLCAmZXRoX3Byb3RvX2FkbWluLCBOVUxMKTsKKwltbHhzd19yZWdfcHR5c191bnBhY2socHR5c19wbCwgJmV0aF9wcm90b19jYXAsIE5VTEwsIE5VTEwpOworCisJYXV0b25lZyA9IGNtZC0+YmFzZS5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFOworCWV0aF9wcm90b19uZXcgPSBhdXRvbmVnID8KKwkJbWx4c3dfc3BfdG9fcHR5c19hZHZlcnRfbGluayhjbWQpIDoKKwkJbWx4c3dfc3BfdG9fcHR5c19zcGVlZChjbWQtPmJhc2Uuc3BlZWQpOwogCiAJZXRoX3Byb3RvX25ldyA9IGV0aF9wcm90b19uZXcgJiBldGhfcHJvdG9fY2FwOwogCWlmICghZXRoX3Byb3RvX25ldykgewotCQluZXRkZXZfZXJyKGRldiwgIk5vdCBzdXBwb3J0ZWQgcHJvdG8gYWRtaW4gcmVxdWVzdGVkIik7CisJCW5ldGRldl9lcnIoZGV2LCAiTm8gc3VwcG9ydGVkIHNwZWVkIHJlcXVlc3RlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoZXRoX3Byb3RvX25ldyA9PSBldGhfcHJvdG9fYWRtaW4pCi0JCXJldHVybiAwOwogCiAJbWx4c3dfcmVnX3B0eXNfcGFjayhwdHlzX3BsLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0LCBldGhfcHJvdG9fbmV3KTsKIAllcnIgPSBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhwdHlzKSwgcHR5c19wbCk7Ci0JaWYgKGVycikgewotCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgcHJvdG8gYWRtaW4iKTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gMDsKIAotCWVyciA9IG1seHN3X3NwX3BvcnRfYWRtaW5fc3RhdHVzX3NldChtbHhzd19zcF9wb3J0LCBmYWxzZSk7Ci0JaWYgKGVycikgewotCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgYWRtaW4gc3RhdHVzIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCW1seHN3X3NwX3BvcnQtPmxpbmsuYXV0b25lZyA9IGF1dG9uZWc7CiAKLQllcnIgPSBtbHhzd19zcF9wb3J0X2FkbWluX3N0YXR1c19zZXQobWx4c3dfc3BfcG9ydCwgdHJ1ZSk7Ci0JaWYgKGVycikgewotCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgYWRtaW4gc3RhdHVzIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCW1seHN3X3NwX3BvcnRfYWRtaW5fc3RhdHVzX3NldChtbHhzd19zcF9wb3J0LCBmYWxzZSk7CisJbWx4c3dfc3BfcG9ydF9hZG1pbl9zdGF0dXNfc2V0KG1seHN3X3NwX3BvcnQsIHRydWUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTMwLDggKzIwNzYsOCBAQAogCS5zZXRfcGh5c19pZAkJPSBtbHhzd19zcF9wb3J0X3NldF9waHlzX2lkLAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IG1seHN3X3NwX3BvcnRfZ2V0X3N0YXRzLAogCS5nZXRfc3NldF9jb3VudAkJPSBtbHhzd19zcF9wb3J0X2dldF9zc2V0X2NvdW50LAotCS5nZXRfc2V0dGluZ3MJCT0gbWx4c3dfc3BfcG9ydF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwkJPSBtbHhzd19zcF9wb3J0X3NldF9zZXR0aW5ncywKKwkuZ2V0X2xpbmtfa3NldHRpbmdzCT0gbWx4c3dfc3BfcG9ydF9nZXRfbGlua19rc2V0dGluZ3MsCisJLnNldF9saW5rX2tzZXR0aW5ncwk9IG1seHN3X3NwX3BvcnRfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogc3RhdGljIGludApAQCAtMjA4MSw2ICsyMjI3LDcgQEAKIAltbHhzd19zcF9wb3J0LT5tYXBwaW5nLm1vZHVsZSA9IG1vZHVsZTsKIAltbHhzd19zcF9wb3J0LT5tYXBwaW5nLndpZHRoID0gd2lkdGg7CiAJbWx4c3dfc3BfcG9ydC0+bWFwcGluZy5sYW5lID0gbGFuZTsKKwltbHhzd19zcF9wb3J0LT5saW5rLmF1dG9uZWcgPSAxOwogCWJ5dGVzID0gRElWX1JPVU5EX1VQKFZMQU5fTl9WSUQsIEJJVFNfUEVSX0JZVEUpOwogCW1seHN3X3NwX3BvcnQtPmFjdGl2ZV92bGFucyA9IGt6YWxsb2MoYnl0ZXMsIEdGUF9LRVJORUwpOwogCWlmICghbWx4c3dfc3BfcG9ydC0+YWN0aXZlX3ZsYW5zKSB7CkBAIC0yMTAyLDkgKzIyNDksMjYgQEAKIAkJZ290byBlcnJfYWxsb2Nfc3RhdHM7CiAJfQogCisJbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMuY2FjaGUgPQorCQlremFsbG9jKHNpemVvZigqbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMuY2FjaGUpLCBHRlBfS0VSTkVMKTsKKworCWlmICghbWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMuY2FjaGUpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfYWxsb2NfaHdfc3RhdHM7CisJfQorCUlOSVRfREVMQVlFRF9XT1JLKCZtbHhzd19zcF9wb3J0LT5od19zdGF0cy51cGRhdGVfZHcsCisJCQkgICZ1cGRhdGVfc3RhdHNfY2FjaGUpOworCiAJZGV2LT5uZXRkZXZfb3BzID0gJm1seHN3X3NwX3BvcnRfbmV0ZGV2X29wczsKIAlkZXYtPmV0aHRvb2xfb3BzID0gJm1seHN3X3NwX3BvcnRfZXRodG9vbF9vcHM7CiAKKwllcnIgPSBtbHhzd19zcF9wb3J0X3N3aWRfc2V0KG1seHN3X3NwX3BvcnQsIDApOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIlBvcnQgJWQ6IEZhaWxlZCB0byBzZXQgU1dJRFxuIiwKKwkJCW1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQpOworCQlnb3RvIGVycl9wb3J0X3N3aWRfc2V0OworCX0KKwogCWVyciA9IG1seHN3X3NwX3BvcnRfZGV2X2FkZHJfaW5pdChtbHhzd19zcF9wb3J0KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIobWx4c3dfc3AtPmJ1c19pbmZvLT5kZXYsICJQb3J0ICVkOiBVbmFibGUgdG8gaW5pdCBwb3J0IG1hYyBhZGRyZXNzXG4iLApAQCAtMjEyMSw3ICsyMjg1LDcgQEAKIAkvKiBFYWNoIHBhY2tldCBuZWVkcyB0byBoYXZlIGEgVHggaGVhZGVyIChtZXRhZGF0YSkgb24gdG9wIGFsbCBvdGhlcgogCSAqIGhlYWRlcnMuCiAJICovCi0JZGV2LT5oYXJkX2hlYWRlcl9sZW4gKz0gTUxYU1dfVFhIRFJfTEVOOworCWRldi0+bmVlZGVkX2hlYWRyb29tID0gTUxYU1dfVFhIRFJfTEVOOwogCiAJZXJyID0gbWx4c3dfc3BfcG9ydF9zeXN0ZW1fcG9ydF9tYXBwaW5nX3NldChtbHhzd19zcF9wb3J0KTsKIAlpZiAoZXJyKSB7CkBAIC0yMTMwLDEzICsyMjk0LDYgQEAKIAkJZ290byBlcnJfcG9ydF9zeXN0ZW1fcG9ydF9tYXBwaW5nX3NldDsKIAl9CiAKLQllcnIgPSBtbHhzd19zcF9wb3J0X3N3aWRfc2V0KG1seHN3X3NwX3BvcnQsIDApOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIlBvcnQgJWQ6IEZhaWxlZCB0byBzZXQgU1dJRFxuIiwKLQkJCW1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQpOwotCQlnb3RvIGVycl9wb3J0X3N3aWRfc2V0OwotCX0KLQogCWVyciA9IG1seHN3X3NwX3BvcnRfc3BlZWRfYnlfd2lkdGhfc2V0KG1seHN3X3NwX3BvcnQsIHdpZHRoKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIobWx4c3dfc3AtPmJ1c19pbmZvLT5kZXYsICJQb3J0ICVkOiBGYWlsZWQgdG8gZW5hYmxlIHNwZWVkc1xuIiwKQEAgLTIyMDIsNiArMjM1OSw3IEBACiAJCWdvdG8gZXJyX2NvcmVfcG9ydF9pbml0OwogCX0KIAorCW1seHN3X2NvcmVfc2NoZWR1bGVfZHcoJm1seHN3X3NwX3BvcnQtPmh3X3N0YXRzLnVwZGF0ZV9kdywgMCk7CiAJcmV0dXJuIDA7CiAKIGVycl9jb3JlX3BvcnRfaW5pdDoKQEAgLTIyMTgsMTAgKzIzNzYsMTIgQEAKIGVycl9wb3J0X2FkbWluX3N0YXR1c19zZXQ6CiBlcnJfcG9ydF9tdHVfc2V0OgogZXJyX3BvcnRfc3BlZWRfYnlfd2lkdGhfc2V0OgotCW1seHN3X3NwX3BvcnRfc3dpZF9zZXQobWx4c3dfc3BfcG9ydCwgTUxYU1dfUE9SVF9TV0lEX0RJU0FCTEVEX1BPUlQpOwotZXJyX3BvcnRfc3dpZF9zZXQ6CiBlcnJfcG9ydF9zeXN0ZW1fcG9ydF9tYXBwaW5nX3NldDoKIGVycl9kZXZfYWRkcl9pbml0OgorCW1seHN3X3NwX3BvcnRfc3dpZF9zZXQobWx4c3dfc3BfcG9ydCwgTUxYU1dfUE9SVF9TV0lEX0RJU0FCTEVEX1BPUlQpOworZXJyX3BvcnRfc3dpZF9zZXQ6CisJa2ZyZWUobWx4c3dfc3BfcG9ydC0+aHdfc3RhdHMuY2FjaGUpOworZXJyX2FsbG9jX2h3X3N0YXRzOgogCWZyZWVfcGVyY3B1KG1seHN3X3NwX3BvcnQtPnBjcHVfc3RhdHMpOwogZXJyX2FsbG9jX3N0YXRzOgogCWtmcmVlKG1seHN3X3NwX3BvcnQtPnVudGFnZ2VkX3ZsYW5zKTsKQEAgLTIyMzgsNiArMjM5OCw3IEBACiAKIAlpZiAoIW1seHN3X3NwX3BvcnQpCiAJCXJldHVybjsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJm1seHN3X3NwX3BvcnQtPmh3X3N0YXRzLnVwZGF0ZV9kdyk7CiAJbWx4c3dfY29yZV9wb3J0X2ZpbmkoJm1seHN3X3NwX3BvcnQtPmNvcmVfcG9ydCk7CiAJdW5yZWdpc3Rlcl9uZXRkZXYobWx4c3dfc3BfcG9ydC0+ZGV2KTsgLyogVGhpcyBjYWxscyBuZG9fc3RvcCAqLwogCW1seHN3X3NwLT5wb3J0c1tsb2NhbF9wb3J0XSA9IE5VTEw7CkBAIC0yMjQ3LDYgKzI0MDgsNyBAQAogCW1seHN3X3NwX3BvcnRfc3dpZF9zZXQobWx4c3dfc3BfcG9ydCwgTUxYU1dfUE9SVF9TV0lEX0RJU0FCTEVEX1BPUlQpOwogCW1seHN3X3NwX3BvcnRfbW9kdWxlX3VubWFwKG1seHN3X3NwLCBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0KTsKIAlmcmVlX3BlcmNwdShtbHhzd19zcF9wb3J0LT5wY3B1X3N0YXRzKTsKKwlrZnJlZShtbHhzd19zcF9wb3J0LT5od19zdGF0cy5jYWNoZSk7CiAJa2ZyZWUobWx4c3dfc3BfcG9ydC0+dW50YWdnZWRfdmxhbnMpOwogCWtmcmVlKG1seHN3X3NwX3BvcnQtPmFjdGl2ZV92bGFucyk7CiAJV0FSTl9PTl9PTkNFKCFsaXN0X2VtcHR5KCZtbHhzd19zcF9wb3J0LT52cG9ydHNfbGlzdCkpOwpAQCAtMjU3MCwxMjMgKzI3MzIsNDcgQEAKIAluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogfQogCitzdGF0aWMgdm9pZCBtbHhzd19zcF9yeF9saXN0ZW5lcl9tYXJrX2Z1bmMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggbG9jYWxfcG9ydCwKKwkJCQkJICAgdm9pZCAqcHJpdikKK3sKKwlza2ItPm9mZmxvYWRfZndkX21hcmsgPSAxOworCXJldHVybiBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jKHNrYiwgbG9jYWxfcG9ydCwgcHJpdik7Cit9CisKKyNkZWZpbmUgTUxYU1dfU1BfUlhMKF9mdW5jLCBfdHJhcF9pZCwgX2FjdGlvbikJCQlcCisJewkJCQkJCQlcCisJCS5mdW5jID0gX2Z1bmMsCQkJCQlcCisJCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCQlcCisJCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF8jI190cmFwX2lkLAkJXAorCQkuYWN0aW9uID0gTUxYU1dfUkVHX0hQS1RfQUNUSU9OXyMjX2FjdGlvbiwJXAorCX0KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBtbHhzd19yeF9saXN0ZW5lciBtbHhzd19zcF9yeF9saXN0ZW5lcltdID0gewotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfRkRCX01DLAotCX0sCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsIEZEQl9NQywgVFJBUF9UT19DUFUpLAogCS8qIFRyYXBzIGZvciBzcGVjaWZpYyBMMiBwYWNrZXQgdHlwZXMsIG5vdCB0cmFwcGVkIGFzIEZEQiBNQyAqLwotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfU1RQLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9MQUNQLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9FQVBPTCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfTExEUCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfTU1SUCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfTVZSUCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfUlBWU1QsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0RIQ1AsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0lHTVBfUVVFUlksCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0lHTVBfVjFfUkVQT1JULAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9JR01QX1YyX1JFUE9SVCwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfSUdNUF9WMl9MRUFWRSwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfSUdNUF9WM19SRVBPUlQsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX0FSUEJDLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9BUlBVQywKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfTVRVRVJST1IsCi0JfSwKLQl7Ci0JCS5mdW5jID0gbWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywKLQkJLmxvY2FsX3BvcnQgPSBNTFhTV19QT1JUX0RPTlRfQ0FSRSwKLQkJLnRyYXBfaWQgPSBNTFhTV19UUkFQX0lEX1RUTEVSUk9SLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9MQkVSUk9SLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9PU1BGLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9JUDJNRSwKLQl9LAotCXsKLQkJLmZ1bmMgPSBtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLAotCQkubG9jYWxfcG9ydCA9IE1MWFNXX1BPUlRfRE9OVF9DQVJFLAotCQkudHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfUlRSX0lOR1JFU1MwLAotCX0sCi0JewotCQkuZnVuYyA9IG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsCi0JCS5sb2NhbF9wb3J0ID0gTUxYU1dfUE9SVF9ET05UX0NBUkUsCi0JCS50cmFwX2lkID0gTUxYU1dfVFJBUF9JRF9IT1NUX01JU1NfSVBWNCwKLQl9LAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBTVFAsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgTEFDUCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBFQVBPTCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBMTERQLCBUUkFQX1RPX0NQVSksCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsIE1NUlAsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgTVZSUCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBSUFZTVCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9tYXJrX2Z1bmMsIERIQ1AsIE1JUlJPUl9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9tYXJrX2Z1bmMsIElHTVBfUVVFUlksIE1JUlJPUl9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBJR01QX1YxX1JFUE9SVCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBJR01QX1YyX1JFUE9SVCwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBJR01QX1YyX0xFQVZFLCBUUkFQX1RPX0NQVSksCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX2Z1bmMsIElHTVBfVjNfUkVQT1JULCBUUkFQX1RPX0NQVSksCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX21hcmtfZnVuYywgQVJQQkMsIE1JUlJPUl9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9tYXJrX2Z1bmMsIEFSUFVDLCBNSVJST1JfVE9fQ1BVKSwKKwkvKiBMMyB0cmFwcyAqLworCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBNVFVFUlJPUiwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBUVExFUlJPUiwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBMQkVSUk9SLCBUUkFQX1RPX0NQVSksCisJTUxYU1dfU1BfUlhMKG1seHN3X3NwX3J4X2xpc3RlbmVyX21hcmtfZnVuYywgT1NQRiwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBJUDJNRSwgVFJBUF9UT19DUFUpLAorCU1MWFNXX1NQX1JYTChtbHhzd19zcF9yeF9saXN0ZW5lcl9mdW5jLCBSVFJfSU5HUkVTUzAsIFRSQVBfVE9fQ1BVKSwKKwlNTFhTV19TUF9SWEwobWx4c3dfc3BfcnhfbGlzdGVuZXJfZnVuYywgSE9TVF9NSVNTX0lQVjQsIFRSQVBfVE9fQ1BVKSwKIH07CiAKIHN0YXRpYyBpbnQgbWx4c3dfc3BfdHJhcHNfaW5pdChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQpAQCAtMjcxMyw3ICsyNzk5LDcgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gZXJyX3J4X2xpc3RlbmVyX3JlZ2lzdGVyOwogCi0JCW1seHN3X3JlZ19ocGt0X3BhY2soaHBrdF9wbCwgTUxYU1dfUkVHX0hQS1RfQUNUSU9OX1RSQVBfVE9fQ1BVLAorCQltbHhzd19yZWdfaHBrdF9wYWNrKGhwa3RfcGwsIG1seHN3X3NwX3J4X2xpc3RlbmVyW2ldLmFjdGlvbiwKIAkJCQkgICAgbWx4c3dfc3BfcnhfbGlzdGVuZXJbaV0udHJhcF9pZCk7CiAJCWVyciA9IG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKGhwa3QpLCBocGt0X3BsKTsKIAkJaWYgKGVycikKQEAgLTI4MDEsNyArMjg4Nyw5IEBACiAKIHN0YXRpYyBpbnQgbWx4c3dfc3BfbGFnX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKIHsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJY2hhciBzbGNyX3BsW01MWFNXX1JFR19TTENSX0xFTl07CisJaW50IGVycjsKIAogCW1seHN3X3JlZ19zbGNyX3BhY2soc2xjcl9wbCwgTUxYU1dfUkVHX1NMQ1JfTEFHX0hBU0hfU01BQyB8CiAJCQkJICAgICBNTFhTV19SRUdfU0xDUl9MQUdfSEFTSF9ETUFDIHwKQEAgLTI4MTIsNyArMjkwMCwyNiBAQAogCQkJCSAgICAgTUxYU1dfUkVHX1NMQ1JfTEFHX0hBU0hfU1BPUlQgfAogCQkJCSAgICAgTUxYU1dfUkVHX1NMQ1JfTEFHX0hBU0hfRFBPUlQgfAogCQkJCSAgICAgTUxYU1dfUkVHX1NMQ1JfTEFHX0hBU0hfSVBQUk9UTyk7Ci0JcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHNsY3IpLCBzbGNyX3BsKTsKKwllcnIgPSBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhzbGNyKSwgc2xjcl9wbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJaWYgKCEocmVzb3VyY2VzLT5tYXhfbGFnX3ZhbGlkICYmIHJlc291cmNlcy0+bWF4X3BvcnRzX2luX2xhZ192YWxpZCkpCisJCXJldHVybiAtRUlPOworCisJbWx4c3dfc3AtPmxhZ3MgPSBrY2FsbG9jKHJlc291cmNlcy0+bWF4X2xhZywKKwkJCQkgc2l6ZW9mKHN0cnVjdCBtbHhzd19zcF91cHBlciksCisJCQkJIEdGUF9LRVJORUwpOworCWlmICghbWx4c3dfc3AtPmxhZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1seHN3X3NwX2xhZ19maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCit7CisJa2ZyZWUobWx4c3dfc3AtPmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IG1seHN3X3NwX2luaXQoc3RydWN0IG1seHN3X2NvcmUgKm1seHN3X2NvcmUsCkBAIC0yODk2LDYgKzMwMDMsNyBAQAogZXJyX3JvdXRlcl9pbml0OgogCW1seHN3X3NwX3N3aXRjaGRldl9maW5pKG1seHN3X3NwKTsKIGVycl9zd2l0Y2hkZXZfaW5pdDoKKwltbHhzd19zcF9sYWdfZmluaShtbHhzd19zcCk7CiBlcnJfbGFnX2luaXQ6CiAJbWx4c3dfc3BfYnVmZmVyc19maW5pKG1seHN3X3NwKTsKIGVycl9idWZmZXJzX2luaXQ6CkBAIC0yOTA5LDM4ICszMDE3LDI2IEBACiBzdGF0aWMgdm9pZCBtbHhzd19zcF9maW5pKHN0cnVjdCBtbHhzd19jb3JlICptbHhzd19jb3JlKQogewogCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBtbHhzd19jb3JlX2RyaXZlcl9wcml2KG1seHN3X2NvcmUpOwotCWludCBpOwogCiAJbWx4c3dfc3BfcG9ydHNfcmVtb3ZlKG1seHN3X3NwKTsKIAltbHhzd19zcF9zcGFuX2ZpbmkobWx4c3dfc3ApOwogCW1seHN3X3NwX3JvdXRlcl9maW5pKG1seHN3X3NwKTsKIAltbHhzd19zcF9zd2l0Y2hkZXZfZmluaShtbHhzd19zcCk7CisJbWx4c3dfc3BfbGFnX2ZpbmkobWx4c3dfc3ApOwogCW1seHN3X3NwX2J1ZmZlcnNfZmluaShtbHhzd19zcCk7CiAJbWx4c3dfc3BfdHJhcHNfZmluaShtbHhzd19zcCk7CiAJbWx4c3dfc3BfZXZlbnRfdW5yZWdpc3RlcihtbHhzd19zcCwgTUxYU1dfVFJBUF9JRF9QVURFKTsKIAlXQVJOX09OKCFsaXN0X2VtcHR5KCZtbHhzd19zcC0+dmZpZHMubGlzdCkpOwogCVdBUk5fT04oIWxpc3RfZW1wdHkoJm1seHN3X3NwLT5maWRzKSk7Ci0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1JJRl9NQVg7IGkrKykKLQkJV0FSTl9PTl9PTkNFKG1seHN3X3NwLT5yaWZzW2ldKTsKIH0KIAogc3RhdGljIHN0cnVjdCBtbHhzd19jb25maWdfcHJvZmlsZSBtbHhzd19zcF9jb25maWdfcHJvZmlsZSA9IHsKIAkudXNlZF9tYXhfdmVwYV9jaGFubmVscwkJPSAxLAogCS5tYXhfdmVwYV9jaGFubmVscwkJPSAwLAotCS51c2VkX21heF9sYWcJCQk9IDEsCi0JLm1heF9sYWcJCQk9IE1MWFNXX1NQX0xBR19NQVgsCi0JLnVzZWRfbWF4X3BvcnRfcGVyX2xhZwkJPSAxLAotCS5tYXhfcG9ydF9wZXJfbGFnCQk9IE1MWFNXX1NQX1BPUlRfUEVSX0xBR19NQVgsCiAJLnVzZWRfbWF4X21pZAkJCT0gMSwKIAkubWF4X21pZAkJCT0gTUxYU1dfU1BfTUlEX01BWCwKIAkudXNlZF9tYXhfcGd0CQkJPSAxLAogCS5tYXhfcGd0CQkJPSAwLAotCS51c2VkX21heF9zeXN0ZW1fcG9ydAkJPSAxLAotCS5tYXhfc3lzdGVtX3BvcnQJCT0gNjQsCi0JLnVzZWRfbWF4X3ZsYW5fZ3JvdXBzCQk9IDEsCi0JLm1heF92bGFuX2dyb3VwcwkJPSAxMjcsCi0JLnVzZWRfbWF4X3JlZ2lvbnMJCT0gMSwKLQkubWF4X3JlZ2lvbnMJCQk9IDQwMCwKIAkudXNlZF9mbG9vZF90YWJsZXMJCT0gMSwKIAkudXNlZF9mbG9vZF9tb2RlCQk9IDEsCiAJLmZsb29kX21vZGUJCQk9IDMsCkBAIC0yOTUyLDEwICszMDQ4LDExIEBACiAJLm1heF9pYl9tYwkJCT0gMCwKIAkudXNlZF9tYXhfcGtleQkJCT0gMSwKIAkubWF4X3BrZXkJCQk9IDAsCi0JLnVzZWRfa3ZkX3NpemVzCQkJPSAxLAorCS51c2VkX2t2ZF9zcGxpdF9kYXRhCQk9IDEsCisJLmt2ZF9oYXNoX2dyYW51bGFyaXR5CQk9IE1MWFNXX1NQX0tWRF9HUkFOVUxBUklUWSwKKwkua3ZkX2hhc2hfc2luZ2xlX3BhcnRzCQk9IDIsCisJLmt2ZF9oYXNoX2RvdWJsZV9wYXJ0cwkJPSAxLAogCS5rdmRfbGluZWFyX3NpemUJCT0gTUxYU1dfU1BfS1ZEX0xJTkVBUl9TSVpFLAotCS5rdmRfaGFzaF9zaW5nbGVfc2l6ZQkJPSBNTFhTV19TUF9LVkRfSEFTSF9TSU5HTEVfU0laRSwKLQkua3ZkX2hhc2hfZG91YmxlX3NpemUJCT0gTUxYU1dfU1BfS1ZEX0hBU0hfRE9VQkxFX1NJWkUsCiAJLnN3aWRfY29uZmlnCQkJPSB7CiAJCXsKIAkJCS51c2VkX3R5cGUJPSAxLApAQCAtMzA3MiwxMyArMzE2OSwxNSBAQAogCiBzdGF0aWMgaW50IG1seHN3X3NwX2F2YWlsX3JpZl9nZXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKIHsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfUklGX01BWDsgaSsrKQorCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3JpZjsgaSsrKQogCQlpZiAoIW1seHN3X3NwLT5yaWZzW2ldKQogCQkJcmV0dXJuIGk7CiAKLQlyZXR1cm4gTUxYU1dfU1BfUklGX01BWDsKKwlyZXR1cm4gTUxYU1dfU1BfSU5WQUxJRF9SSUY7CiB9CiAKIHN0YXRpYyB2b2lkIG1seHN3X3NwX3Zwb3J0X3JpZl9zcF9hdHRyX2dldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfdnBvcnQsCkBAIC0zMTU4LDcgKzMyNTcsNyBAQAogCWludCBlcnI7CiAKIAlyaWYgPSBtbHhzd19zcF9hdmFpbF9yaWZfZ2V0KG1seHN3X3NwKTsKLQlpZiAocmlmID09IE1MWFNXX1NQX1JJRl9NQVgpCisJaWYgKHJpZiA9PSBNTFhTV19TUF9JTlZBTElEX1JJRikKIAkJcmV0dXJuIEVSUl9QVFIoLUVSQU5HRSk7CiAKIAllcnIgPSBtbHhzd19zcF92cG9ydF9yaWZfc3Bfb3AobWx4c3dfc3BfdnBvcnQsIGwzX2RldiwgcmlmLCB0cnVlKTsKQEAgLTMzMjQsNiArMzQyMywzOSBAQAogCXJldHVybiBtbHhzd19zcF9maWRfZmluZChtbHhzd19zcCwgZmlkKTsKIH0KIAorc3RhdGljIGVudW0gbWx4c3dfZmxvb2RfdGFibGVfdHlwZSBtbHhzd19zcF9mbG9vZF90YWJsZV90eXBlX2dldCh1MTYgZmlkKQoreworCXJldHVybiBtbHhzd19zcF9maWRfaXNfdmZpZChmaWQpID8gTUxYU1dfUkVHX1NGR0NfVEFCTEVfVFlQRV9GSUQgOgorCSAgICAgICBNTFhTV19SRUdfU0ZHQ19UQUJMRV9UWVBFX0ZJRF9PRkZFU1Q7Cit9CisKK3N0YXRpYyB1MTYgbWx4c3dfc3BfZmxvb2RfdGFibGVfaW5kZXhfZ2V0KHUxNiBmaWQpCit7CisJcmV0dXJuIG1seHN3X3NwX2ZpZF9pc192ZmlkKGZpZCkgPyBtbHhzd19zcF9maWRfdG9fdmZpZChmaWQpIDogZmlkOworfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3JvdXRlcl9wb3J0X2Zsb29kX3NldChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLCB1MTYgZmlkLAorCQkJCQkgIGJvb2wgc2V0KQoreworCWVudW0gbWx4c3dfZmxvb2RfdGFibGVfdHlwZSB0YWJsZV90eXBlOworCWNoYXIgKnNmdHJfcGw7CisJdTE2IGluZGV4OworCWludCBlcnI7CisKKwlzZnRyX3BsID0ga21hbGxvYyhNTFhTV19SRUdfU0ZUUl9MRU4sIEdGUF9LRVJORUwpOworCWlmICghc2Z0cl9wbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0YWJsZV90eXBlID0gbWx4c3dfc3BfZmxvb2RfdGFibGVfdHlwZV9nZXQoZmlkKTsKKwlpbmRleCA9IG1seHN3X3NwX2Zsb29kX3RhYmxlX2luZGV4X2dldChmaWQpOworCW1seHN3X3JlZ19zZnRyX3BhY2soc2Z0cl9wbCwgTUxYU1dfU1BfRkxPT0RfVEFCTEVfQk0sIGluZGV4LCB0YWJsZV90eXBlLAorCQkJICAgIDEsIE1MWFNXX1BPUlRfUk9VVEVSX1BPUlQsIHNldCk7CisJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2Z0ciksIHNmdHJfcGwpOworCisJa2ZyZWUoc2Z0cl9wbCk7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGVudW0gbWx4c3dfcmVnX3JpdHJfaWZfdHlwZSBtbHhzd19zcF9yaWZfdHlwZV9nZXQodTE2IGZpZCkKIHsKIAlpZiAobWx4c3dfc3BfZmlkX2lzX3ZmaWQoZmlkKSkKQEAgLTMzNTcsMTIgKzM0ODksMTYgQEAKIAlpbnQgZXJyOwogCiAJcmlmID0gbWx4c3dfc3BfYXZhaWxfcmlmX2dldChtbHhzd19zcCk7Ci0JaWYgKHJpZiA9PSBNTFhTV19TUF9SSUZfTUFYKQorCWlmIChyaWYgPT0gTUxYU1dfU1BfSU5WQUxJRF9SSUYpCiAJCXJldHVybiAtRVJBTkdFOwogCisJZXJyID0gbWx4c3dfc3Bfcm91dGVyX3BvcnRfZmxvb2Rfc2V0KG1seHN3X3NwLCBmLT5maWQsIHRydWUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAllcnIgPSBtbHhzd19zcF9yaWZfYnJpZGdlX29wKG1seHN3X3NwLCBsM19kZXYsIGYtPmZpZCwgcmlmLCB0cnVlKTsKIAlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycl9yaWZfYnJpZGdlX29wOwogCiAJZXJyID0gbWx4c3dfc3BfcmlmX2ZkYl9vcChtbHhzd19zcCwgbDNfZGV2LT5kZXZfYWRkciwgZi0+ZmlkLCB0cnVlKTsKIAlpZiAoZXJyKQpAQCAtMzM4NSw2ICszNTIxLDggQEAKIAltbHhzd19zcF9yaWZfZmRiX29wKG1seHN3X3NwLCBsM19kZXYtPmRldl9hZGRyLCBmLT5maWQsIGZhbHNlKTsKIGVycl9yaWZfZmRiX29wOgogCW1seHN3X3NwX3JpZl9icmlkZ2Vfb3AobWx4c3dfc3AsIGwzX2RldiwgZi0+ZmlkLCByaWYsIGZhbHNlKTsKK2Vycl9yaWZfYnJpZGdlX29wOgorCW1seHN3X3NwX3JvdXRlcl9wb3J0X2Zsb29kX3NldChtbHhzd19zcCwgZi0+ZmlkLCBmYWxzZSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMzQwNCw2ICszNTQyLDggQEAKIAogCW1seHN3X3NwX3JpZl9icmlkZ2Vfb3AobWx4c3dfc3AsIGwzX2RldiwgZi0+ZmlkLCByaWYsIGZhbHNlKTsKIAorCW1seHN3X3NwX3JvdXRlcl9wb3J0X2Zsb29kX3NldChtbHhzd19zcCwgZi0+ZmlkLCBmYWxzZSk7CisKIAluZXRkZXZfZGJnKGwzX2RldiwgIlJJRj0lZCBkZXN0cm95ZWRcbiIsIHJpZik7CiB9CiAKQEAgLTM1NTYsMTIgKzM2OTYsMTQgQEAKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJdTggbG9jYWxfcG9ydCA9IG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQ7CiAJdTE2IGxhZ19pZCA9IG1seHN3X3NwX3BvcnQtPmxhZ19pZDsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJaW50IGksIGNvdW50ID0gMDsKIAogCWlmICghbWx4c3dfc3BfcG9ydC0+bGFnZ2VkKQogCQlyZXR1cm4gdHJ1ZTsKIAotCWZvciAoaSA9IDA7IGkgPCBNTFhTV19TUF9QT1JUX1BFUl9MQUdfTUFYOyBpKyspIHsKKwlyZXNvdXJjZXMgPSBtbHhzd19jb3JlX3Jlc291cmNlc19nZXQobWx4c3dfc3AtPmNvcmUpOworCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPm1heF9wb3J0c19pbl9sYWc7IGkrKykgewogCQlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbGFnX3BvcnQ7CiAKIAkJbGFnX3BvcnQgPSBtbHhzd19zcF9wb3J0X2xhZ2dlZF9nZXQobWx4c3dfc3AsIGxhZ19pZCwgaSk7CkBAIC0zNzY3LDExICszOTA5LDEzIEBACiAJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqbGFnX2RldiwKIAkJCQkgIHUxNiAqcF9sYWdfaWQpCiB7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCXN0cnVjdCBtbHhzd19zcF91cHBlciAqbGFnOwogCWludCBmcmVlX2xhZ19pZCA9IC0xOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX0xBR19NQVg7IGkrKykgeworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X2xhZzsgaSsrKSB7CiAJCWxhZyA9IG1seHN3X3NwX2xhZ19nZXQobWx4c3dfc3AsIGkpOwogCQlpZiAobGFnLT5yZWZfY291bnQpIHsKIAkJCWlmIChsYWctPmRldiA9PSBsYWdfZGV2KSB7CkBAIC0zODA1LDkgKzM5NDksMTEgQEAKIHN0YXRpYyBpbnQgbWx4c3dfc3BfcG9ydF9sYWdfaW5kZXhfZ2V0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsCiAJCQkJICAgICAgIHUxNiBsYWdfaWQsIHU4ICpwX3BvcnRfaW5kZXgpCiB7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1BPUlRfUEVSX0xBR19NQVg7IGkrKykgeworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3BvcnRzX2luX2xhZzsgaSsrKSB7CiAJCWlmICghbWx4c3dfc3BfcG9ydF9sYWdnZWRfZ2V0KG1seHN3X3NwLCBsYWdfaWQsIGkpKSB7CiAJCQkqcF9wb3J0X2luZGV4ID0gaTsKIAkJCXJldHVybiAwOwpAQCAtNDUwMCwxOCArNDY0NiwyNiBAQAogCS5wcmlvcml0eSA9IDEwLAkvKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgRklCIG5vdGlmaWVyIGJsb2NrICovCiB9OwogCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9uYiBfX3JlYWRfbW9zdGx5ID0geworCS5ub3RpZmllcl9jYWxsID0gbWx4c3dfc3Bfcm91dGVyX25ldGV2ZW50X2V2ZW50LAorfTsKKwogc3RhdGljIGludCBfX2luaXQgbWx4c3dfc3BfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwogCiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZtbHhzd19zcF9uZXRkZXZpY2VfbmIpOwogCXJlZ2lzdGVyX2luZXRhZGRyX25vdGlmaWVyKCZtbHhzd19zcF9pbmV0YWRkcl9uYik7CisJcmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoJm1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9uYik7CisKIAllcnIgPSBtbHhzd19jb3JlX2RyaXZlcl9yZWdpc3RlcigmbWx4c3dfc3BfZHJpdmVyKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9jb3JlX2RyaXZlcl9yZWdpc3RlcjsKIAlyZXR1cm4gMDsKIAogZXJyX2NvcmVfZHJpdmVyX3JlZ2lzdGVyOgorCXVucmVnaXN0ZXJfbmV0ZXZlbnRfbm90aWZpZXIoJm1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9uYik7CisJdW5yZWdpc3Rlcl9pbmV0YWRkcl9ub3RpZmllcigmbWx4c3dfc3BfaW5ldGFkZHJfbmIpOwogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZtbHhzd19zcF9uZXRkZXZpY2VfbmIpOwogCXJldHVybiBlcnI7CiB9CkBAIC00NTE5LDYgKzQ2NzMsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IG1seHN3X3NwX21vZHVsZV9leGl0KHZvaWQpCiB7CiAJbWx4c3dfY29yZV9kcml2ZXJfdW5yZWdpc3RlcigmbWx4c3dfc3BfZHJpdmVyKTsKKwl1bnJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZtbHhzd19zcF9yb3V0ZXJfbmV0ZXZlbnRfbmIpOwogCXVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJm1seHN3X3NwX2luZXRhZGRyX25iKTsKIAl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbWx4c3dfc3BfbmV0ZGV2aWNlX25iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bS5oCmluZGV4IGFiM2ZlYjguLjliMjI4NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW0uaApAQCAtNDUsNyArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9kY2JubC5oPgogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgotI2luY2x1ZGUgPG5ldC9zd2l0Y2hkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCiAjaW5jbHVkZSAicG9ydC5oIgogI2luY2x1ZGUgImNvcmUuaCIKQEAgLTU0LDEwICs1NCw3IEBACiAjZGVmaW5lIE1MWFNXX1NQX1ZGSURfTUFYIDY2NTYJLyogQnJpZGdlZCBWTEFOIGludGVyZmFjZXMgKi8KIAogI2RlZmluZSBNTFhTV19TUF9SRklEX0JBU0UgMTUzNjAKLSNkZWZpbmUgTUxYU1dfU1BfUklGX01BWCA4MDAKLQotI2RlZmluZSBNTFhTV19TUF9MQUdfTUFYIDY0Ci0jZGVmaW5lIE1MWFNXX1NQX1BPUlRfUEVSX0xBR19NQVggMTYKKyNkZWZpbmUgTUxYU1dfU1BfSU5WQUxJRF9SSUYgMHhmZmZmCiAKICNkZWZpbmUgTUxYU1dfU1BfTUlEX01BWCA3MDAwCiAKQEAgLTY3LDggKzY0LDYgQEAKICNkZWZpbmUgTUxYU1dfU1BfTFBNX1RSRUVfTUFYIDIyCiAjZGVmaW5lIE1MWFNXX1NQX0xQTV9UUkVFX0NPVU5UIChNTFhTV19TUF9MUE1fVFJFRV9NQVggLSBNTFhTV19TUF9MUE1fVFJFRV9NSU4pCiAKLSNkZWZpbmUgTUxYU1dfU1BfVklSVFVBTF9ST1VURVJfTUFYIDI1NgotCiAjZGVmaW5lIE1MWFNXX1NQX1BPUlRfQkFTRV9TUEVFRCAyNTAwMAkvKiBNYi9zICovCiAKICNkZWZpbmUgTUxYU1dfU1BfQllURVNfUEVSX0NFTEwgOTYKQEAgLTc3LDggKzcyLDcgQEAKICNkZWZpbmUgTUxYU1dfU1BfQ0VMTFNfVE9fQllURVMoYykgKGMgKiBNTFhTV19TUF9CWVRFU19QRVJfQ0VMTCkKIAogI2RlZmluZSBNTFhTV19TUF9LVkRfTElORUFSX1NJWkUgNjU1MzYgLyogZW50cmllcyAqLwotI2RlZmluZSBNTFhTV19TUF9LVkRfSEFTSF9TSU5HTEVfU0laRSAxNjM4NDAgLyogZW50cmllcyAqLwotI2RlZmluZSBNTFhTV19TUF9LVkRfSEFTSF9ET1VCTEVfU0laRSAzMjc2OCAvKiBlbnRyaWVzICovCisjZGVmaW5lIE1MWFNXX1NQX0tWRF9HUkFOVUxBUklUWSAxMjgKIAogLyogTWF4aW11bSBkZWxheSBidWZmZXIgbmVlZGVkIGluIGNhc2Ugb2YgUEFVU0UgZnJhbWVzLCBpbiBjZWxscy4KICAqIEFzc3VtZXMgMTAwbSBjYWJsZSBhbmQgbWF4aW11bSBNVFUuCkBAIC0yNTMsNyArMjQ3LDcgQEAKIAogc3RydWN0IG1seHN3X3NwX3JvdXRlciB7CiAJc3RydWN0IG1seHN3X3NwX2xwbV90cmVlIGxwbV90cmVlc1tNTFhTV19TUF9MUE1fVFJFRV9DT1VOVF07Ci0Jc3RydWN0IG1seHN3X3NwX3ZyIHZyc1tNTFhTV19TUF9WSVJUVUFMX1JPVVRFUl9NQVhdOworCXN0cnVjdCBtbHhzd19zcF92ciAqdnJzOwogCXN0cnVjdCByaGFzaHRhYmxlIG5laWdoX2h0OwogCXN0cnVjdCB7CiAJCXN0cnVjdCBkZWxheWVkX3dvcmsgZHc7CkBAIC0yNjMsNiArMjU3LDcgQEAKICNkZWZpbmUgTUxYU1dfU1BfVU5SRVNPTFZFRF9OSF9QUk9CRV9JTlRFUlZBTCA1MDAwIC8qIG1zICovCiAJc3RydWN0IGxpc3RfaGVhZCBuZXh0aG9wX2dyb3VwX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBuZXh0aG9wX25laWdoc19saXN0OworCWJvb2wgYWJvcnRlZDsKIH07CiAKIHN0cnVjdCBtbHhzd19zcCB7CkBAIC0yNzUsNyArMjcwLDcgQEAKIAkJREVDTEFSRV9CSVRNQVAobWFwcGVkLCBNTFhTV19TUF9NSURfTUFYKTsKIAl9IGJyX21pZHM7CiAJc3RydWN0IGxpc3RfaGVhZCBmaWRzOwkvKiBWTEFOLWF3YXJlIGJyaWRnZSBGSURzICovCi0Jc3RydWN0IG1seHN3X3NwX3JpZiAqcmlmc1tNTFhTV19TUF9SSUZfTUFYXTsKKwlzdHJ1Y3QgbWx4c3dfc3BfcmlmICoqcmlmczsKIAlzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqKnBvcnRzOwogCXN0cnVjdCBtbHhzd19jb3JlICpjb3JlOwogCWNvbnN0IHN0cnVjdCBtbHhzd19idXNfaW5mbyAqYnVzX2luZm87CkBAIC0yOTAsNyArMjg1LDcgQEAKICNkZWZpbmUgTUxYU1dfU1BfREVGQVVMVF9BR0VJTkdfVElNRSAzMDAKIAl1MzIgYWdlaW5nX3RpbWU7CiAJc3RydWN0IG1seHN3X3NwX3VwcGVyIG1hc3Rlcl9icmlkZ2U7Ci0Jc3RydWN0IG1seHN3X3NwX3VwcGVyIGxhZ3NbTUxYU1dfU1BfTEFHX01BWF07CisJc3RydWN0IG1seHN3X3NwX3VwcGVyICpsYWdzOwogCXU4IHBvcnRfdG9fbW9kdWxlW01MWFNXX1BPUlRfTUFYX1BPUlRTXTsKIAlzdHJ1Y3QgbWx4c3dfc3Bfc2Igc2I7CiAJc3RydWN0IG1seHN3X3NwX3JvdXRlciByb3V0ZXI7CkBAIC0zMDIsNiArMjk3LDcgQEAKIAkJc3RydWN0IG1seHN3X3NwX3NwYW5fZW50cnkgKmVudHJpZXM7CiAJCWludCBlbnRyaWVzX2NvdW50OwogCX0gc3BhbjsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZmliX25iOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbWx4c3dfc3BfdXBwZXIgKgpAQCAtMzQxLDcgKzMzNyw4IEBACiAJfSB2cG9ydDsKIAlzdHJ1Y3QgewogCQl1OCB0eF9wYXVzZToxLAotCQkgICByeF9wYXVzZToxOworCQkgICByeF9wYXVzZToxLAorCQkgICBhdXRvbmVnOjE7CiAJfSBsaW5rOwogCXN0cnVjdCB7CiAJCXN0cnVjdCBpZWVlX2V0cyAqZXRzOwpAQCAtMzYwLDYgKzM1NywxMSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgdnBvcnRzX2xpc3Q7CiAJLyogVEMgaGFuZGxlcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbWFsbF90Y19saXN0OworCXN0cnVjdCB7CisJCSNkZWZpbmUgTUxYU1dfSFdfU1RBVFNfVVBEQVRFX1RJTUUgSFoKKwkJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpjYWNoZTsKKwkJc3RydWN0IGRlbGF5ZWRfd29yayB1cGRhdGVfZHc7CisJfSBod19zdGF0czsKIH07CiAKIHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0X2xvd2VyX2Rldl9ob2xkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtNDc3LDkgKzQ3OSwxMiBAQAogbWx4c3dfc3BfcmlmX2ZpbmRfYnlfZGV2KGNvbnN0IHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsCiAJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfUklGX01BWDsgaSsrKQorCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5tYXhfcmlmOyBpKyspCiAJCWlmIChtbHhzd19zcC0+cmlmc1tpXSAmJiBtbHhzd19zcC0+cmlmc1tpXS0+ZGV2ID09IGRldikKIAkJCXJldHVybiBtbHhzd19zcC0+cmlmc1tpXTsKIApAQCAtNTU4LDYgKzU2Myw5IEBACiBpbnQgbWx4c3dfc3BfcG9ydF9ldHNfbWF4cmF0ZV9zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCiAJCQkJICBlbnVtIG1seHN3X3JlZ19xZWVjX2hyIGhyLCB1OCBpbmRleCwKIAkJCQkgIHU4IG5leHRfaW5kZXgsIHUzMiBtYXhyYXRlKTsKK2ludCBfX21seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKKwkJCQkgICAgIHUxNiB2aWRfYmVnaW4sIHUxNiB2aWRfZW5kLAorCQkJCSAgICAgYm9vbCBsZWFybl9lbmFibGUpOwogCiAjaWZkZWYgQ09ORklHX01MWFNXX1NQRUNUUlVNX0RDQgogCkBAIC01NzgsMTUgKzU4NiwxMiBAQAogCiBpbnQgbWx4c3dfc3Bfcm91dGVyX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCk7CiB2b2lkIG1seHN3X3NwX3JvdXRlcl9maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApOwotaW50IG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCi0JCQkgICAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKTsKLWludCBtbHhzd19zcF9yb3V0ZXJfZmliNF9kZWwoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliICpmaWI0KTsKIGludCBtbHhzd19zcF9yb3V0ZXJfbmVpZ2hfY29uc3RydWN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBuZWlnaGJvdXIgKm4pOwogdm9pZCBtbHhzd19zcF9yb3V0ZXJfbmVpZ2hfZGVzdHJveShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBuZWlnaGJvdXIgKm4pOworaW50IG1seHN3X3NwX3JvdXRlcl9uZXRldmVudF9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpOwogCiBpbnQgbWx4c3dfc3Bfa3ZkbF9hbGxvYyhzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLCB1bnNpZ25lZCBpbnQgZW50cnlfY291bnQpOwogdm9pZCBtbHhzd19zcF9rdmRsX2ZyZWUoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwgaW50IGVudHJ5X2luZGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX2J1ZmZlcnMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX2J1ZmZlcnMuYwppbmRleCAyMzc0MThhLi5iY2FlZDhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bV9idWZmZXJzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fYnVmZmVycy5jCkBAIC01OTUsOSArNTk1LDkgQEAKIAllbnVtIG1seHN3X3JlZ19zYnh4X2RpciBkaXIgPSBkaXJfZ2V0KHBvb2xfaW5kZXgpOwogCXN0cnVjdCBtbHhzd19zcF9zYl9wciAqcHIgPSBtbHhzd19zcF9zYl9wcl9nZXQobWx4c3dfc3AsIHBvb2wsIGRpcik7CiAKLQlwb29sX2luZm8tPnBvb2xfdHlwZSA9IGRpcjsKKwlwb29sX2luZm8tPnBvb2xfdHlwZSA9IChlbnVtIGRldmxpbmtfc2JfcG9vbF90eXBlKSBkaXI7CiAJcG9vbF9pbmZvLT5zaXplID0gTUxYU1dfU1BfQ0VMTFNfVE9fQllURVMocHItPnNpemUpOwotCXBvb2xfaW5mby0+dGhyZXNob2xkX3R5cGUgPSBwci0+bW9kZTsKKwlwb29sX2luZm8tPnRocmVzaG9sZF90eXBlID0gKGVudW0gZGV2bGlua19zYl90aHJlc2hvbGRfdHlwZSkgcHItPm1vZGU7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTYwOCw5ICs2MDgsMTAgQEAKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfY29yZV9kcml2ZXJfcHJpdihtbHhzd19jb3JlKTsKIAl1OCBwb29sID0gcG9vbF9nZXQocG9vbF9pbmRleCk7CiAJZW51bSBtbHhzd19yZWdfc2J4eF9kaXIgZGlyID0gZGlyX2dldChwb29sX2luZGV4KTsKLQllbnVtIG1seHN3X3JlZ19zYnByX21vZGUgbW9kZSA9IHRocmVzaG9sZF90eXBlOwogCXUzMiBwb29sX3NpemUgPSBNTFhTV19TUF9CWVRFU19UT19DRUxMUyhzaXplKTsKKwllbnVtIG1seHN3X3JlZ19zYnByX21vZGUgbW9kZTsKIAorCW1vZGUgPSAoZW51bSBtbHhzd19yZWdfc2Jwcl9tb2RlKSB0aHJlc2hvbGRfdHlwZTsKIAlyZXR1cm4gbWx4c3dfc3Bfc2JfcHJfd3JpdGUobWx4c3dfc3AsIHBvb2wsIGRpciwgbW9kZSwgcG9vbF9zaXplKTsKIH0KIApAQCAtNjk2LDEzICs2OTcsMTMgQEAKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJdTggbG9jYWxfcG9ydCA9IG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQ7CiAJdTggcGdfYnVmZiA9IHRjX2luZGV4OwotCWVudW0gbWx4c3dfcmVnX3NieHhfZGlyIGRpciA9IHBvb2xfdHlwZTsKKwllbnVtIG1seHN3X3JlZ19zYnh4X2RpciBkaXIgPSAoZW51bSBtbHhzd19yZWdfc2J4eF9kaXIpIHBvb2xfdHlwZTsKIAlzdHJ1Y3QgbWx4c3dfc3Bfc2JfY20gKmNtID0gbWx4c3dfc3Bfc2JfY21fZ2V0KG1seHN3X3NwLCBsb2NhbF9wb3J0LAogCQkJCQkJICAgICAgIHBnX2J1ZmYsIGRpcik7CiAKIAkqcF90aHJlc2hvbGQgPSBtbHhzd19zcF9zYl90aHJlc2hvbGRfb3V0KG1seHN3X3NwLCBjbS0+cG9vbCwgZGlyLAogCQkJCQkJIGNtLT5tYXhfYnVmZik7Ci0JKnBfcG9vbF9pbmRleCA9IHBvb2xfaW5kZXhfZ2V0KGNtLT5wb29sLCBwb29sX3R5cGUpOworCSpwX3Bvb2xfaW5kZXggPSBwb29sX2luZGV4X2dldChjbS0+cG9vbCwgZGlyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzE2LDIzICs3MTcsMTkgQEAKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJdTggbG9jYWxfcG9ydCA9IG1seHN3X3NwX3BvcnQtPmxvY2FsX3BvcnQ7CiAJdTggcGdfYnVmZiA9IHRjX2luZGV4OwotCWVudW0gbWx4c3dfcmVnX3NieHhfZGlyIGRpciA9IHBvb2xfdHlwZTsKLQl1OCBwb29sID0gcG9vbF9pbmRleDsKKwllbnVtIG1seHN3X3JlZ19zYnh4X2RpciBkaXIgPSAoZW51bSBtbHhzd19yZWdfc2J4eF9kaXIpIHBvb2xfdHlwZTsKKwl1OCBwb29sID0gcG9vbF9nZXQocG9vbF9pbmRleCk7CiAJdTMyIG1heF9idWZmOwogCWludCBlcnI7CiAKKwlpZiAoZGlyICE9IGRpcl9nZXQocG9vbF9pbmRleCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJZXJyID0gbWx4c3dfc3Bfc2JfdGhyZXNob2xkX2luKG1seHN3X3NwLCBwb29sLCBkaXIsCiAJCQkJICAgICAgIHRocmVzaG9sZCwgJm1heF9idWZmKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKHBvb2xfdHlwZSA9PSBERVZMSU5LX1NCX1BPT0xfVFlQRV9FR1JFU1MpIHsKLQkJaWYgKHBvb2wgPCBNTFhTV19TUF9TQl9QT09MX0NPVU5UKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXBvb2wgLT0gTUxYU1dfU1BfU0JfUE9PTF9DT1VOVDsKLQl9IGVsc2UgaWYgKHBvb2wgPj0gTUxYU1dfU1BfU0JfUE9PTF9DT1VOVCkgewotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAJcmV0dXJuIG1seHN3X3NwX3NiX2NtX3dyaXRlKG1seHN3X3NwLCBsb2NhbF9wb3J0LCBwZ19idWZmLCBkaXIsCiAJCQkJICAgIDAsIG1heF9idWZmLCBwb29sKTsKIH0KQEAgLTk0Nyw3ICs5NDQsNyBAQAogCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBtbHhzd19zcF9wb3J0LT5tbHhzd19zcDsKIAl1OCBsb2NhbF9wb3J0ID0gbWx4c3dfc3BfcG9ydC0+bG9jYWxfcG9ydDsKIAl1OCBwZ19idWZmID0gdGNfaW5kZXg7Ci0JZW51bSBtbHhzd19yZWdfc2J4eF9kaXIgZGlyID0gcG9vbF90eXBlOworCWVudW0gbWx4c3dfcmVnX3NieHhfZGlyIGRpciA9IChlbnVtIG1seHN3X3JlZ19zYnh4X2RpcikgcG9vbF90eXBlOwogCXN0cnVjdCBtbHhzd19zcF9zYl9jbSAqY20gPSBtbHhzd19zcF9zYl9jbV9nZXQobWx4c3dfc3AsIGxvY2FsX3BvcnQsCiAJCQkJCQkgICAgICAgcGdfYnVmZiwgZGlyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fcm91dGVyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zcGVjdHJ1bV9yb3V0ZXIuYwppbmRleCA5MGJiOTNiLi43OGZjNTU3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fcm91dGVyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fcm91dGVyLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZXZlbnQuaD4KICNpbmNsdWRlIDxuZXQvbmVpZ2hib3VyLmg+CiAjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9pcF9maWIuaD4KIAogI2luY2x1ZGUgInNwZWN0cnVtLmgiCiAjaW5jbHVkZSAiY29yZS5oIgpAQCAtMTA3LDYgKzEwOCw3IEBACiB9CiAKIHN0cnVjdCBtbHhzd19zcF9maWJfa2V5IHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXVuc2lnbmVkIGNoYXIgYWRkcltzaXplb2Yoc3RydWN0IGluNl9hZGRyKV07CiAJdW5zaWduZWQgY2hhciBwcmVmaXhfbGVuOwogfTsKQEAgLTEyMSwxNyArMTIzLDIwIEBACiAKIHN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgewogCXN0cnVjdCByaGFzaF9oZWFkIGh0X25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBtbHhzd19zcF9maWJfa2V5IGtleTsKIAllbnVtIG1seHN3X3NwX2ZpYl9lbnRyeV90eXBlIHR5cGU7Ci0JdTggYWRkZWQ6MTsKKwl1bnNpZ25lZCBpbnQgcmVmX2NvdW50OwogCXUxNiByaWY7IC8qIHVzZWQgZm9yIGFjdGlvbiBsb2NhbCAqLwogCXN0cnVjdCBtbHhzd19zcF92ciAqdnI7CisJc3RydWN0IGZpYl9pbmZvICpmaTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5leHRob3BfZ3JvdXBfbm9kZTsKIAlzdHJ1Y3QgbWx4c3dfc3BfbmV4dGhvcF9ncm91cCAqbmhfZ3JvdXA7CiB9OwogCiBzdHJ1Y3QgbWx4c3dfc3BfZmliIHsKIAlzdHJ1Y3Qgcmhhc2h0YWJsZSBodDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVudHJ5X2xpc3Q7CiAJdW5zaWduZWQgbG9uZyBwcmVmaXhfcmVmX2NvdW50W01MWFNXX1NQX1BSRUZJWF9DT1VOVF07CiAJc3RydWN0IG1seHN3X3NwX3ByZWZpeF91c2FnZSBwcmVmaXhfdXNhZ2U7CiB9OwpAQCAtMTUzLDYgKzE1OCw3IEBACiAJCQkJICAgICBtbHhzd19zcF9maWJfaHRfcGFyYW1zKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOworCWxpc3RfYWRkX3RhaWwoJmZpYl9lbnRyeS0+bGlzdCwgJmZpYi0+ZW50cnlfbGlzdCk7CiAJaWYgKGZpYi0+cHJlZml4X3JlZl9jb3VudFtwcmVmaXhfbGVuXSsrID09IDApCiAJCW1seHN3X3NwX3ByZWZpeF91c2FnZV9zZXQoJmZpYi0+cHJlZml4X3VzYWdlLCBwcmVmaXhfbGVuKTsKIAlyZXR1cm4gMDsKQEAgLTE2NSwxOSArMTcxLDIyIEBACiAKIAlpZiAoLS1maWItPnByZWZpeF9yZWZfY291bnRbcHJlZml4X2xlbl0gPT0gMCkKIAkJbWx4c3dfc3BfcHJlZml4X3VzYWdlX2NsZWFyKCZmaWItPnByZWZpeF91c2FnZSwgcHJlZml4X2xlbik7CisJbGlzdF9kZWwoJmZpYl9lbnRyeS0+bGlzdCk7CiAJcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmZmliLT5odCwgJmZpYl9lbnRyeS0+aHRfbm9kZSwKIAkJCSAgICAgICBtbHhzd19zcF9maWJfaHRfcGFyYW1zKTsKIH0KIAogc3RhdGljIHN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKgogbWx4c3dfc3BfZmliX2VudHJ5X2NyZWF0ZShzdHJ1Y3QgbWx4c3dfc3BfZmliICpmaWIsIGNvbnN0IHZvaWQgKmFkZHIsCi0JCQkgIHNpemVfdCBhZGRyX2xlbiwgdW5zaWduZWQgY2hhciBwcmVmaXhfbGVuKQorCQkJICBzaXplX3QgYWRkcl9sZW4sIHVuc2lnbmVkIGNoYXIgcHJlZml4X2xlbiwKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnk7CiAKIAlmaWJfZW50cnkgPSBremFsbG9jKHNpemVvZigqZmliX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmaWJfZW50cnkpCiAJCXJldHVybiBOVUxMOworCWZpYl9lbnRyeS0+a2V5LmRldiA9IGRldjsKIAltZW1jcHkoZmliX2VudHJ5LT5rZXkuYWRkciwgYWRkciwgYWRkcl9sZW4pOwogCWZpYl9lbnRyeS0+a2V5LnByZWZpeF9sZW4gPSBwcmVmaXhfbGVuOwogCXJldHVybiBmaWJfZW50cnk7CkBAIC0xOTAsMTAgKzE5OSwxMyBAQAogCiBzdGF0aWMgc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqCiBtbHhzd19zcF9maWJfZW50cnlfbG9va3VwKHN0cnVjdCBtbHhzd19zcF9maWIgKmZpYiwgY29uc3Qgdm9pZCAqYWRkciwKLQkJCSAgc2l6ZV90IGFkZHJfbGVuLCB1bnNpZ25lZCBjaGFyIHByZWZpeF9sZW4pCisJCQkgIHNpemVfdCBhZGRyX2xlbiwgdW5zaWduZWQgY2hhciBwcmVmaXhfbGVuLAorCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBtbHhzd19zcF9maWJfa2V5IGtleSA9IHt7IDAgfSB9OworCXN0cnVjdCBtbHhzd19zcF9maWJfa2V5IGtleTsKIAorCW1lbXNldCgma2V5LCAwLCBzaXplb2Yoa2V5KSk7CisJa2V5LmRldiA9IGRldjsKIAltZW1jcHkoa2V5LmFkZHIsIGFkZHIsIGFkZHJfbGVuKTsKIAlrZXkucHJlZml4X2xlbiA9IHByZWZpeF9sZW47CiAJcmV0dXJuIHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJmZpYi0+aHQsICZrZXksIG1seHN3X3NwX2ZpYl9odF9wYXJhbXMpOwpAQCAtMjEwLDYgKzIyMiw3IEBACiAJZXJyID0gcmhhc2h0YWJsZV9pbml0KCZmaWItPmh0LCAmbWx4c3dfc3BfZmliX2h0X3BhcmFtcyk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfcmhhc2h0YWJsZV9pbml0OworCUlOSVRfTElTVF9IRUFEKCZmaWItPmVudHJ5X2xpc3QpOwogCXJldHVybiBmaWI7CiAKIGVycl9yaGFzaHRhYmxlX2luaXQ6CkBAIC0yNDYsNyArMjU5LDkgQEAKIHsKIAljaGFyIHJhbHRhX3BsW01MWFNXX1JFR19SQUxUQV9MRU5dOwogCi0JbWx4c3dfcmVnX3JhbHRhX3BhY2socmFsdGFfcGwsIHRydWUsIGxwbV90cmVlLT5wcm90bywgbHBtX3RyZWUtPmlkKTsKKwltbHhzd19yZWdfcmFsdGFfcGFjayhyYWx0YV9wbCwgdHJ1ZSwKKwkJCSAgICAgKGVudW0gbWx4c3dfcmVnX3JhbHh4X3Byb3RvY29sKSBscG1fdHJlZS0+cHJvdG8sCisJCQkgICAgIGxwbV90cmVlLT5pZCk7CiAJcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJhbHRhKSwgcmFsdGFfcGwpOwogfQogCkBAIC0yNTUsNyArMjcwLDkgQEAKIHsKIAljaGFyIHJhbHRhX3BsW01MWFNXX1JFR19SQUxUQV9MRU5dOwogCi0JbWx4c3dfcmVnX3JhbHRhX3BhY2socmFsdGFfcGwsIGZhbHNlLCBscG1fdHJlZS0+cHJvdG8sIGxwbV90cmVlLT5pZCk7CisJbWx4c3dfcmVnX3JhbHRhX3BhY2socmFsdGFfcGwsIGZhbHNlLAorCQkJICAgICAoZW51bSBtbHhzd19yZWdfcmFseHhfcHJvdG9jb2wpIGxwbV90cmVlLT5wcm90bywKKwkJCSAgICAgbHBtX3RyZWUtPmlkKTsKIAlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsdGEpLCByYWx0YV9wbCk7CiB9CiAKQEAgLTM2MiwxMCArMzc5LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWx4c3dfc3BfdnIgKm1seHN3X3NwX3ZyX2ZpbmRfdW51c2VkKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCiB7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCXN0cnVjdCBtbHhzd19zcF92ciAqdnI7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfVklSVFVBTF9ST1VURVJfTUFYOyBpKyspIHsKKwlyZXNvdXJjZXMgPSBtbHhzd19jb3JlX3Jlc291cmNlc19nZXQobWx4c3dfc3AtPmNvcmUpOworCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPm1heF92aXJ0dWFsX3JvdXRlcnM7IGkrKykgewogCQl2ciA9ICZtbHhzd19zcC0+cm91dGVyLnZyc1tpXTsKIAkJaWYgKCF2ci0+dXNlZCkKIAkJCXJldHVybiB2cjsKQEAgLTM3OCw3ICszOTcsOSBAQAogewogCWNoYXIgcmFsdGJfcGxbTUxYU1dfUkVHX1JBTFRCX0xFTl07CiAKLQltbHhzd19yZWdfcmFsdGJfcGFjayhyYWx0Yl9wbCwgdnItPmlkLCB2ci0+cHJvdG8sIHZyLT5scG1fdHJlZS0+aWQpOworCW1seHN3X3JlZ19yYWx0Yl9wYWNrKHJhbHRiX3BsLCB2ci0+aWQsCisJCQkgICAgIChlbnVtIG1seHN3X3JlZ19yYWx4eF9wcm90b2NvbCkgdnItPnByb3RvLAorCQkJICAgICB2ci0+bHBtX3RyZWUtPmlkKTsKIAlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsdGIpLCByYWx0Yl9wbCk7CiB9CiAKQEAgLTM4OCw3ICs0MDksOCBAQAogCWNoYXIgcmFsdGJfcGxbTUxYU1dfUkVHX1JBTFRCX0xFTl07CiAKIAkvKiBCaW5kIHRvIHRyZWUgMCB3aGljaCBpcyBkZWZhdWx0ICovCi0JbWx4c3dfcmVnX3JhbHRiX3BhY2socmFsdGJfcGwsIHZyLT5pZCwgdnItPnByb3RvLCAwKTsKKwltbHhzd19yZWdfcmFsdGJfcGFjayhyYWx0Yl9wbCwgdnItPmlkLAorCQkJICAgICAoZW51bSBtbHhzd19yZWdfcmFseHhfcHJvdG9jb2wpIHZyLT5wcm90bywgMCk7CiAJcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJhbHRiKSwgcmFsdGJfcGwpOwogfQogCkBAIC00MDQsMTEgKzQyNiwxNCBAQAogCQkJCQkgICAgdTMyIHRiX2lkLAogCQkJCQkgICAgZW51bSBtbHhzd19zcF9sM3Byb3RvIHByb3RvKQogeworCXN0cnVjdCBtbHhzd19yZXNvdXJjZXMgKnJlc291cmNlczsKIAlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyOwogCWludCBpOwogCiAJdGJfaWQgPSBtbHhzd19zcF9maXhfdGJfaWQodGJfaWQpOwotCWZvciAoaSA9IDA7IGkgPCBNTFhTV19TUF9WSVJUVUFMX1JPVVRFUl9NQVg7IGkrKykgeworCisJcmVzb3VyY2VzID0gbWx4c3dfY29yZV9yZXNvdXJjZXNfZ2V0KG1seHN3X3NwLT5jb3JlKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5tYXhfdmlydHVhbF9yb3V0ZXJzOyBpKyspIHsKIAkJdnIgPSAmbWx4c3dfc3AtPnJvdXRlci52cnNbaV07CiAJCWlmICh2ci0+dXNlZCAmJiB2ci0+cHJvdG8gPT0gcHJvdG8gJiYgdnItPnRiX2lkID09IHRiX2lkKQogCQkJcmV0dXJuIHZyOwpAQCAtNTQyLDE1ICs1NjcsMzMgQEAKIAkJCQkJICAgJnZyLT5maWItPnByZWZpeF91c2FnZSk7CiB9CiAKLXN0YXRpYyB2b2lkIG1seHN3X3NwX3Zyc19pbml0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCitzdGF0aWMgaW50IG1seHN3X3NwX3Zyc19pbml0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCiB7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCXN0cnVjdCBtbHhzd19zcF92ciAqdnI7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUxYU1dfU1BfVklSVFVBTF9ST1VURVJfTUFYOyBpKyspIHsKKwlyZXNvdXJjZXMgPSBtbHhzd19jb3JlX3Jlc291cmNlc19nZXQobWx4c3dfc3AtPmNvcmUpOworCWlmICghcmVzb3VyY2VzLT5tYXhfdmlydHVhbF9yb3V0ZXJzX3ZhbGlkKQorCQlyZXR1cm4gLUVJTzsKKworCW1seHN3X3NwLT5yb3V0ZXIudnJzID0ga2NhbGxvYyhyZXNvdXJjZXMtPm1heF92aXJ0dWFsX3JvdXRlcnMsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbWx4c3dfc3BfdnIpLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIW1seHN3X3NwLT5yb3V0ZXIudnJzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMtPm1heF92aXJ0dWFsX3JvdXRlcnM7IGkrKykgewogCQl2ciA9ICZtbHhzd19zcC0+cm91dGVyLnZyc1tpXTsKIAkJdnItPmlkID0gaTsKIAl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWx4c3dfc3BfdnJzX2Zpbmkoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKK3sKKwlrZnJlZShtbHhzd19zcC0+cm91dGVyLnZycyk7CiB9CiAKIHN0cnVjdCBtbHhzd19zcF9uZWlnaF9rZXkgewpAQCAtNjU3LDcgKzcwMCw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCXIgPSBtbHhzd19zcF9yaWZfZmluZF9ieV9kZXYobWx4c3dfc3AsIGRldik7CisJciA9IG1seHN3X3NwX3JpZl9maW5kX2J5X2RldihtbHhzd19zcCwgbi0+ZGV2KTsKIAlpZiAoV0FSTl9PTighcikpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC05MzgsOCArOTgxLDggQEAKIAltbHhzd19zcF9wb3J0X2Rldl9wdXQobWx4c3dfc3BfcG9ydCk7CiB9CiAKLXN0YXRpYyBpbnQgbWx4c3dfc3Bfcm91dGVyX25ldGV2ZW50X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK2ludCBtbHhzd19zcF9yb3V0ZXJfbmV0ZXZlbnRfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQsCisJCQkJICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQogewogCXN0cnVjdCBtbHhzd19zcF9uZWlnaF9lbnRyeSAqbmVpZ2hfZW50cnk7CiAJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQ7CkBAIC0xMDA5LDEwICsxMDUyLDYgQEAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbWx4c3dfc3Bfcm91dGVyX25ldGV2ZW50X25iIF9fcmVhZF9tb3N0bHkgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBtbHhzd19zcF9yb3V0ZXJfbmV0ZXZlbnRfZXZlbnQsCi19OwotCiBzdGF0aWMgaW50IG1seHN3X3NwX25laWdoX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKIHsKIAlpbnQgZXJyOwpAQCAtMTAyNywxMCArMTA2Niw2IEBACiAJICovCiAJbWx4c3dfc3Bfcm91dGVyX25laWdoc191cGRhdGVfaW50ZXJ2YWxfaW5pdChtbHhzd19zcCk7CiAKLQllcnIgPSByZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcigmbWx4c3dfc3Bfcm91dGVyX25ldGV2ZW50X25iKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9yZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcjsKLQogCS8qIENyZWF0ZSB0aGUgZGVsYXllZCB3b3JrcyBmb3IgdGhlIGFjdGl2aXR5X3VwZGF0ZSAqLwogCUlOSVRfREVMQVlFRF9XT1JLKCZtbHhzd19zcC0+cm91dGVyLm5laWdoc191cGRhdGUuZHcsCiAJCQkgIG1seHN3X3NwX3JvdXRlcl9uZWlnaHNfdXBkYXRlX3dvcmspOwpAQCAtMTAzOSwxNyArMTA3NCwxMiBAQAogCW1seHN3X2NvcmVfc2NoZWR1bGVfZHcoJm1seHN3X3NwLT5yb3V0ZXIubmVpZ2hzX3VwZGF0ZS5kdywgMCk7CiAJbWx4c3dfY29yZV9zY2hlZHVsZV9kdygmbWx4c3dfc3AtPnJvdXRlci5uZXh0aG9wX3Byb2JlX2R3LCAwKTsKIAlyZXR1cm4gMDsKLQotZXJyX3JlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyOgotCXJoYXNodGFibGVfZGVzdHJveSgmbWx4c3dfc3AtPnJvdXRlci5uZWlnaF9odCk7Ci0JcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgbWx4c3dfc3BfbmVpZ2hfZmluaShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQogewogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbWx4c3dfc3AtPnJvdXRlci5uZWlnaHNfdXBkYXRlLmR3KTsKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJm1seHN3X3NwLT5yb3V0ZXIubmV4dGhvcF9wcm9iZV9kdyk7Ci0JdW5yZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcigmbWx4c3dfc3Bfcm91dGVyX25ldGV2ZW50X25iKTsKIAlyaGFzaHRhYmxlX2Rlc3Ryb3koJm1seHN3X3NwLT5yb3V0ZXIubmVpZ2hfaHQpOwogfQogCkBAIC0xMDg4LDkgKzExMTgsMTAgQEAKIHsKIAljaGFyIHJhbGV1X3BsW01MWFNXX1JFR19SQUxFVV9MRU5dOwogCi0JbWx4c3dfcmVnX3JhbGV1X3BhY2socmFsZXVfcGwsIHZyLT5wcm90bywgdnItPmlkLAotCQkJICAgICBhZGpfaW5kZXgsIGVjbXBfc2l6ZSwKLQkJCSAgICAgbmV3X2Fkal9pbmRleCwgbmV3X2VjbXBfc2l6ZSk7CisJbWx4c3dfcmVnX3JhbGV1X3BhY2socmFsZXVfcGwsCisJCQkgICAgIChlbnVtIG1seHN3X3JlZ19yYWx4eF9wcm90b2NvbCkgdnItPnByb3RvLCB2ci0+aWQsCisJCQkgICAgIGFkal9pbmRleCwgZWNtcF9zaXplLCBuZXdfYWRqX2luZGV4LAorCQkJICAgICBuZXdfZWNtcF9zaXplKTsKIAlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsZXUpLCByYWxldV9wbCk7CiB9CiAKQEAgLTE0OTYsNDMgKzE1MjcsNiBAQAogCW1seHN3X3NwX25leHRob3BfZ3JvdXBfZGVzdHJveShtbHhzd19zcCwgbmhfZ3JwKTsKIH0KIAotc3RhdGljIGludCBfX21seHN3X3NwX3JvdXRlcl9pbml0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCi17Ci0JY2hhciByZ2NyX3BsW01MWFNXX1JFR19SR0NSX0xFTl07Ci0KLQltbHhzd19yZWdfcmdjcl9wYWNrKHJnY3JfcGwsIHRydWUpOwotCW1seHN3X3JlZ19yZ2NyX21heF9yb3V0ZXJfaW50ZXJmYWNlc19zZXQocmdjcl9wbCwgTUxYU1dfU1BfUklGX01BWCk7Ci0JcmV0dXJuIG1seHN3X3JlZ193cml0ZShtbHhzd19zcC0+Y29yZSwgTUxYU1dfUkVHKHJnY3IpLCByZ2NyX3BsKTsKLX0KLQotc3RhdGljIHZvaWQgX19tbHhzd19zcF9yb3V0ZXJfZmluaShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQotewotCWNoYXIgcmdjcl9wbFtNTFhTV19SRUdfUkdDUl9MRU5dOwotCi0JbWx4c3dfcmVnX3JnY3JfcGFjayhyZ2NyX3BsLCBmYWxzZSk7Ci0JbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmdjciksIHJnY3JfcGwpOwotfQotCi1pbnQgbWx4c3dfc3Bfcm91dGVyX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKLXsKLQlpbnQgZXJyOwotCi0JSU5JVF9MSVNUX0hFQUQoJm1seHN3X3NwLT5yb3V0ZXIubmV4dGhvcF9uZWlnaHNfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJm1seHN3X3NwLT5yb3V0ZXIubmV4dGhvcF9ncm91cF9saXN0KTsKLQllcnIgPSBfX21seHN3X3NwX3JvdXRlcl9pbml0KG1seHN3X3NwKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCW1seHN3X3NwX2xwbV9pbml0KG1seHN3X3NwKTsKLQltbHhzd19zcF92cnNfaW5pdChtbHhzd19zcCk7Ci0JcmV0dXJuIG1seHN3X3NwX25laWdoX2luaXQobWx4c3dfc3ApOwotfQotCi12b2lkIG1seHN3X3NwX3JvdXRlcl9maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCi17Ci0JbWx4c3dfc3BfbmVpZ2hfZmluaShtbHhzd19zcCk7Ci0JX19tbHhzd19zcF9yb3V0ZXJfZmluaShtbHhzd19zcCk7Ci19Ci0KIHN0YXRpYyBpbnQgbWx4c3dfc3BfZmliX2VudHJ5X29wNF9yZW1vdGUoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwKIAkJCQkJIHN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeSwKIAkJCQkJIGVudW0gbWx4c3dfcmVnX3JhbHVlX29wIG9wKQpAQCAtMTU1OCw4ICsxNTUyLDkgQEAKIAkJdHJhcF9pZCA9IE1MWFNXX1RSQVBfSURfUlRSX0lOR1JFU1MwOwogCX0KIAotCW1seHN3X3JlZ19yYWx1ZV9wYWNrNChyYWx1ZV9wbCwgdnItPnByb3RvLCBvcCwgdnItPmlkLAotCQkJICAgICAgZmliX2VudHJ5LT5rZXkucHJlZml4X2xlbiwgKnBfZGlwKTsKKwltbHhzd19yZWdfcmFsdWVfcGFjazQocmFsdWVfcGwsCisJCQkgICAgICAoZW51bSBtbHhzd19yZWdfcmFseHhfcHJvdG9jb2wpIHZyLT5wcm90bywgb3AsCisJCQkgICAgICB2ci0+aWQsIGZpYl9lbnRyeS0+a2V5LnByZWZpeF9sZW4sICpwX2RpcCk7CiAJbWx4c3dfcmVnX3JhbHVlX2FjdF9yZW1vdGVfcGFjayhyYWx1ZV9wbCwgdHJhcF9hY3Rpb24sIHRyYXBfaWQsCiAJCQkJCWFkamFjZW5jeV9pbmRleCwgZWNtcF9zaXplKTsKIAlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsdWUpLCByYWx1ZV9wbCk7CkBAIC0xNTczLDggKzE1NjgsOSBAQAogCXUzMiAqcF9kaXAgPSAodTMyICopIGZpYl9lbnRyeS0+a2V5LmFkZHI7CiAJc3RydWN0IG1seHN3X3NwX3ZyICp2ciA9IGZpYl9lbnRyeS0+dnI7CiAKLQltbHhzd19yZWdfcmFsdWVfcGFjazQocmFsdWVfcGwsIHZyLT5wcm90bywgb3AsIHZyLT5pZCwKLQkJCSAgICAgIGZpYl9lbnRyeS0+a2V5LnByZWZpeF9sZW4sICpwX2RpcCk7CisJbWx4c3dfcmVnX3JhbHVlX3BhY2s0KHJhbHVlX3BsLAorCQkJICAgICAgKGVudW0gbWx4c3dfcmVnX3JhbHh4X3Byb3RvY29sKSB2ci0+cHJvdG8sIG9wLAorCQkJICAgICAgdnItPmlkLCBmaWJfZW50cnktPmtleS5wcmVmaXhfbGVuLCAqcF9kaXApOwogCW1seHN3X3JlZ19yYWx1ZV9hY3RfbG9jYWxfcGFjayhyYWx1ZV9wbCwKIAkJCQkgICAgICAgTUxYU1dfUkVHX1JBTFVFX1RSQVBfQUNUSU9OX05PUCwgMCwKIAkJCQkgICAgICAgZmliX2VudHJ5LT5yaWYpOwpAQCAtMTU4OSw4ICsxNTg1LDkgQEAKIAl1MzIgKnBfZGlwID0gKHUzMiAqKSBmaWJfZW50cnktPmtleS5hZGRyOwogCXN0cnVjdCBtbHhzd19zcF92ciAqdnIgPSBmaWJfZW50cnktPnZyOwogCi0JbWx4c3dfcmVnX3JhbHVlX3BhY2s0KHJhbHVlX3BsLCB2ci0+cHJvdG8sIG9wLCB2ci0+aWQsCi0JCQkgICAgICBmaWJfZW50cnktPmtleS5wcmVmaXhfbGVuLCAqcF9kaXApOworCW1seHN3X3JlZ19yYWx1ZV9wYWNrNChyYWx1ZV9wbCwKKwkJCSAgICAgIChlbnVtIG1seHN3X3JlZ19yYWx4eF9wcm90b2NvbCkgdnItPnByb3RvLCBvcCwKKwkJCSAgICAgIHZyLT5pZCwgZmliX2VudHJ5LT5rZXkucHJlZml4X2xlbiwgKnBfZGlwKTsKIAltbHhzd19yZWdfcmFsdWVfYWN0X2lwMm1lX3BhY2socmFsdWVfcGwpOwogCXJldHVybiBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhyYWx1ZSksIHJhbHVlX3BsKTsKIH0KQEAgLTE2MjYsMTEgKzE2MjMsOCBAQAogc3RhdGljIGludCBtbHhzd19zcF9maWJfZW50cnlfdXBkYXRlKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsCiAJCQkJICAgICBzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnkpCiB7Ci0JZW51bSBtbHhzd19yZWdfcmFsdWVfb3Agb3A7Ci0KLQlvcCA9ICFmaWJfZW50cnktPmFkZGVkID8gTUxYU1dfUkVHX1JBTFVFX09QX1dSSVRFX1dSSVRFIDoKLQkJCQkgTUxYU1dfUkVHX1JBTFVFX09QX1dSSVRFX1VQREFURTsKLQlyZXR1cm4gbWx4c3dfc3BfZmliX2VudHJ5X29wKG1seHN3X3NwLCBmaWJfZW50cnksIG9wKTsKKwlyZXR1cm4gbWx4c3dfc3BfZmliX2VudHJ5X29wKG1seHN3X3NwLCBmaWJfZW50cnksCisJCQkJICAgICBNTFhTV19SRUdfUkFMVUVfT1BfV1JJVEVfV1JJVEUpOwogfQogCiBzdGF0aWMgaW50IG1seHN3X3NwX2ZpYl9lbnRyeV9kZWwoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwKQEAgLTE2NDAsMTI5ICsxNjM0LDE4MCBAQAogCQkJCSAgICAgTUxYU1dfUkVHX1JBTFVFX09QX1dSSVRFX0RFTEVURSk7CiB9CiAKLXN0cnVjdCBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGRfaW5mbyB7Ci0Jc3RydWN0IHN3aXRjaGRldl90cmFuc19pdGVtIHRyaXRlbTsKLQlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwOwotCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeTsKLX07Ci0KLXN0YXRpYyB2b2lkIG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9pbmZvX2Rlc3Ryb3kodm9pZCBjb25zdCAqZGF0YSkKLXsKLQljb25zdCBzdHJ1Y3QgbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkX2luZm8gKmluZm8gPSBkYXRhOwotCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeSA9IGluZm8tPmZpYl9lbnRyeTsKLQlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gaW5mby0+bWx4c3dfc3A7Ci0Jc3RydWN0IG1seHN3X3NwX3ZyICp2ciA9IGZpYl9lbnRyeS0+dnI7Ci0KLQltbHhzd19zcF9maWJfZW50cnlfZGVzdHJveShmaWJfZW50cnkpOwotCW1seHN3X3NwX3ZyX3B1dChtbHhzd19zcCwgdnIpOwotCWtmcmVlKGluZm8pOwotfQotCiBzdGF0aWMgaW50CiBtbHhzd19zcF9yb3V0ZXJfZmliNF9lbnRyeV9pbml0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsCi0JCQkJY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCisJCQkJY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbywKIAkJCQlzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnkpCiB7Ci0Jc3RydWN0IGZpYl9pbmZvICpmaSA9IGZpYjQtPmZpOworCXN0cnVjdCBmaWJfaW5mbyAqZmkgPSBmZW5faW5mby0+Zmk7CisJc3RydWN0IG1seHN3X3NwX3JpZiAqciA9IE5VTEw7CisJaW50IG5oc2VsOworCWludCBlcnI7CiAKLQlpZiAoZmliNC0+dHlwZSA9PSBSVE5fTE9DQUwgfHwgZmliNC0+dHlwZSA9PSBSVE5fQlJPQURDQVNUKSB7CisJaWYgKGZlbl9pbmZvLT50eXBlID09IFJUTl9MT0NBTCB8fCBmZW5faW5mby0+dHlwZSA9PSBSVE5fQlJPQURDQVNUKSB7CiAJCWZpYl9lbnRyeS0+dHlwZSA9IE1MWFNXX1NQX0ZJQl9FTlRSWV9UWVBFX1RSQVA7CiAJCXJldHVybiAwOwogCX0KLQlpZiAoZmliNC0+dHlwZSAhPSBSVE5fVU5JQ0FTVCkKKwlpZiAoZmVuX2luZm8tPnR5cGUgIT0gUlROX1VOSUNBU1QpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGZpLT5maWJfc2NvcGUgIT0gUlRfU0NPUEVfVU5JVkVSU0UpIHsKLQkJc3RydWN0IG1seHN3X3NwX3JpZiAqcjsKKwlmb3IgKG5oc2VsID0gMDsgbmhzZWwgPCBmaS0+ZmliX25oczsgbmhzZWwrKykgeworCQljb25zdCBzdHJ1Y3QgZmliX25oICpuaCA9ICZmaS0+ZmliX25oW25oc2VsXTsKIAotCQlmaWJfZW50cnktPnR5cGUgPSBNTFhTV19TUF9GSUJfRU5UUllfVFlQRV9MT0NBTDsKLQkJciA9IG1seHN3X3NwX3JpZl9maW5kX2J5X2RldihtbHhzd19zcCwgZmktPmZpYl9kZXYpOwotCQlpZiAoIXIpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJZmliX2VudHJ5LT5yaWYgPSByLT5yaWY7CisJCWlmICghbmgtPm5oX2RldikKKwkJCWNvbnRpbnVlOworCQlyID0gbWx4c3dfc3BfcmlmX2ZpbmRfYnlfZGV2KG1seHN3X3NwLCBuaC0+bmhfZGV2KTsKKwkJaWYgKCFyKSB7CisJCQkvKiBJbiBjYXNlIHJvdXRlciBpbnRlcmZhY2UgaXMgbm90IGZvdW5kIGZvcgorCQkJICogYXQgbGVhc3Qgb25lIG9mIHRoZSBuZXh0aG9wcywgdGhhdCBtZWFucworCQkJICogdGhlIG5leHRob3AgcG9pbnRzIHRvIHNvbWUgZGV2aWNlIHVucmVsYXRlZAorCQkJICogdG8gdXMuIFNldCB0cmFwIGFuZCBwYXNzIHRoZSBwYWNrZXRzIGZvcgorCQkJICogdGhpcyBwcmVmaXggdG8ga2VybmVsLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghcikgeworCQlmaWJfZW50cnktPnR5cGUgPSBNTFhTV19TUF9GSUJfRU5UUllfVFlQRV9UUkFQOwogCQlyZXR1cm4gMDsKIAl9Ci0JZmliX2VudHJ5LT50eXBlID0gTUxYU1dfU1BfRklCX0VOVFJZX1RZUEVfUkVNT1RFOwotCXJldHVybiBtbHhzd19zcF9uZXh0aG9wX2dyb3VwX2dldChtbHhzd19zcCwgZmliX2VudHJ5LCBmaSk7CisKKwlpZiAoZmktPmZpYl9zY29wZSAhPSBSVF9TQ09QRV9VTklWRVJTRSkgeworCQlmaWJfZW50cnktPnR5cGUgPSBNTFhTV19TUF9GSUJfRU5UUllfVFlQRV9MT0NBTDsKKwkJZmliX2VudHJ5LT5yaWYgPSByLT5yaWY7CisJfSBlbHNlIHsKKwkJZmliX2VudHJ5LT50eXBlID0gTUxYU1dfU1BfRklCX0VOVFJZX1RZUEVfUkVNT1RFOworCQllcnIgPSBtbHhzd19zcF9uZXh0aG9wX2dyb3VwX2dldChtbHhzd19zcCwgZmliX2VudHJ5LCBmaSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlmaWJfaW5mb19vZmZsb2FkX2luYyhmZW5faW5mby0+ZmkpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZAogbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZW50cnlfZmluaShzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAogCQkJCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeSkKIHsKLQlpZiAoZmliX2VudHJ5LT50eXBlICE9IE1MWFNXX1NQX0ZJQl9FTlRSWV9UWVBFX1JFTU9URSkKLQkJcmV0dXJuOwotCW1seHN3X3NwX25leHRob3BfZ3JvdXBfcHV0KG1seHN3X3NwLCBmaWJfZW50cnkpOworCWlmIChmaWJfZW50cnktPnR5cGUgIT0gTUxYU1dfU1BfRklCX0VOVFJZX1RZUEVfVFJBUCkKKwkJZmliX2luZm9fb2ZmbG9hZF9kZWMoZmliX2VudHJ5LT5maSk7CisJaWYgKGZpYl9lbnRyeS0+dHlwZSA9PSBNTFhTV19TUF9GSUJfRU5UUllfVFlQRV9SRU1PVEUpCisJCW1seHN3X3NwX25leHRob3BfZ3JvdXBfcHV0KG1seHN3X3NwLCBmaWJfZW50cnkpOwogfQogCi1zdGF0aWMgaW50Ci1tbHhzd19zcF9yb3V0ZXJfZmliNF9hZGRfcHJlcGFyZShzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKLQkJCQkgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCi0JCQkJIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQorc3RhdGljIHN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKgorbWx4c3dfc3BfZmliX2VudHJ5X2dldChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAorCQkgICAgICAgY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbykKIHsKLQlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7Ci0Jc3RydWN0IG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9pbmZvICppbmZvOwogCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeTsKKwlzdHJ1Y3QgZmliX2luZm8gKmZpID0gZmVuX2luZm8tPmZpOwogCXN0cnVjdCBtbHhzd19zcF92ciAqdnI7CiAJaW50IGVycjsKIAotCXZyID0gbWx4c3dfc3BfdnJfZ2V0KG1seHN3X3NwLCBmaWI0LT5kc3RfbGVuLCBmaWI0LT50Yl9pZCwKKwl2ciA9IG1seHN3X3NwX3ZyX2dldChtbHhzd19zcCwgZmVuX2luZm8tPmRzdF9sZW4sIGZlbl9pbmZvLT50Yl9pZCwKIAkJCSAgICAgTUxYU1dfU1BfTDNfUFJPVE9fSVBWNCk7CiAJaWYgKElTX0VSUih2cikpCi0JCXJldHVybiBQVFJfRVJSKHZyKTsKKwkJcmV0dXJuIEVSUl9DQVNUKHZyKTsKIAotCWZpYl9lbnRyeSA9IG1seHN3X3NwX2ZpYl9lbnRyeV9jcmVhdGUodnItPmZpYiwgJmZpYjQtPmRzdCwKLQkJCQkJICAgICAgc2l6ZW9mKGZpYjQtPmRzdCksIGZpYjQtPmRzdF9sZW4pOworCWZpYl9lbnRyeSA9IG1seHN3X3NwX2ZpYl9lbnRyeV9sb29rdXAodnItPmZpYiwgJmZlbl9pbmZvLT5kc3QsCisJCQkJCSAgICAgIHNpemVvZihmZW5faW5mby0+ZHN0KSwKKwkJCQkJICAgICAgZmVuX2luZm8tPmRzdF9sZW4sIGZpLT5maWJfZGV2KTsKKwlpZiAoZmliX2VudHJ5KSB7CisJCS8qIEFscmVhZHkgZXhpc3RzLCBqdXN0IHRha2UgYSByZWZlcmVuY2UgKi8KKwkJZmliX2VudHJ5LT5yZWZfY291bnQrKzsKKwkJcmV0dXJuIGZpYl9lbnRyeTsKKwl9CisJZmliX2VudHJ5ID0gbWx4c3dfc3BfZmliX2VudHJ5X2NyZWF0ZSh2ci0+ZmliLCAmZmVuX2luZm8tPmRzdCwKKwkJCQkJICAgICAgc2l6ZW9mKGZlbl9pbmZvLT5kc3QpLAorCQkJCQkgICAgICBmZW5faW5mby0+ZHN0X2xlbiwgZmktPmZpYl9kZXYpOwogCWlmICghZmliX2VudHJ5KSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZpYl9lbnRyeV9jcmVhdGU7CiAJfQogCWZpYl9lbnRyeS0+dnIgPSB2cjsKKwlmaWJfZW50cnktPmZpID0gZmk7CisJZmliX2VudHJ5LT5yZWZfY291bnQgPSAxOwogCi0JZXJyID0gbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZW50cnlfaW5pdChtbHhzd19zcCwgZmliNCwgZmliX2VudHJ5KTsKKwllcnIgPSBtbHhzd19zcF9yb3V0ZXJfZmliNF9lbnRyeV9pbml0KG1seHN3X3NwLCBmZW5faW5mbywgZmliX2VudHJ5KTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9maWI0X2VudHJ5X2luaXQ7CiAKLQlpbmZvID0ga21hbGxvYyhzaXplb2YoKmluZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluZm8pIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfYWxsb2NfaW5mbzsKLQl9Ci0JaW5mby0+bWx4c3dfc3AgPSBtbHhzd19zcDsKLQlpbmZvLT5maWJfZW50cnkgPSBmaWJfZW50cnk7Ci0Jc3dpdGNoZGV2X3RyYW5zX2l0ZW1fZW5xdWV1ZSh0cmFucywgaW5mbywKLQkJCQkgICAgIG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9pbmZvX2Rlc3Ryb3ksCi0JCQkJICAgICAmaW5mby0+dHJpdGVtKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZmliX2VudHJ5OwogCi1lcnJfYWxsb2NfaW5mbzoKLQltbHhzd19zcF9yb3V0ZXJfZmliNF9lbnRyeV9maW5pKG1seHN3X3NwLCBmaWJfZW50cnkpOwogZXJyX2ZpYjRfZW50cnlfaW5pdDoKIAltbHhzd19zcF9maWJfZW50cnlfZGVzdHJveShmaWJfZW50cnkpOwogZXJyX2ZpYl9lbnRyeV9jcmVhdGU6CiAJbWx4c3dfc3BfdnJfcHV0KG1seHN3X3NwLCB2cik7Ci0JcmV0dXJuIGVycjsKKworCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKLXN0YXRpYyBpbnQKLW1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9jb21taXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCi0JCQkJY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQsCi0JCQkJc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCitzdGF0aWMgc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqCittbHhzd19zcF9maWJfZW50cnlfZmluZChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAorCQkJY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbykKIHsKLQlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7Ci0Jc3RydWN0IG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZF9pbmZvICppbmZvOworCXN0cnVjdCBtbHhzd19zcF92ciAqdnI7CisKKwl2ciA9IG1seHN3X3NwX3ZyX2ZpbmQobWx4c3dfc3AsIGZlbl9pbmZvLT50Yl9pZCwKKwkJCSAgICAgIE1MWFNXX1NQX0wzX1BST1RPX0lQVjQpOworCWlmICghdnIpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIG1seHN3X3NwX2ZpYl9lbnRyeV9sb29rdXAodnItPmZpYiwgJmZlbl9pbmZvLT5kc3QsCisJCQkJCSBzaXplb2YoZmVuX2luZm8tPmRzdCksCisJCQkJCSBmZW5faW5mby0+ZHN0X2xlbiwKKwkJCQkJIGZlbl9pbmZvLT5maS0+ZmliX2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIG1seHN3X3NwX2ZpYl9lbnRyeV9wdXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCwKKwkJCQkgICBzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnkpCit7CisJc3RydWN0IG1seHN3X3NwX3ZyICp2ciA9IGZpYl9lbnRyeS0+dnI7CisKKwlpZiAoLS1maWJfZW50cnktPnJlZl9jb3VudCA9PSAwKSB7CisJCW1seHN3X3NwX3JvdXRlcl9maWI0X2VudHJ5X2ZpbmkobWx4c3dfc3AsIGZpYl9lbnRyeSk7CisJCW1seHN3X3NwX2ZpYl9lbnRyeV9kZXN0cm95KGZpYl9lbnRyeSk7CisJfQorCW1seHN3X3NwX3ZyX3B1dChtbHhzd19zcCwgdnIpOworfQorCitzdGF0aWMgdm9pZCBtbHhzd19zcF9maWJfZW50cnlfcHV0X2FsbChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAorCQkJCSAgICAgICBzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICpmaWJfZW50cnkpCit7CisJdW5zaWduZWQgaW50IGxhc3RfcmVmX2NvdW50OworCisJZG8geworCQlsYXN0X3JlZl9jb3VudCA9IGZpYl9lbnRyeS0+cmVmX2NvdW50OworCQltbHhzd19zcF9maWJfZW50cnlfcHV0KG1seHN3X3NwLCBmaWJfZW50cnkpOworCX0gd2hpbGUgKGxhc3RfcmVmX2NvdW50ICE9IDEpOworfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3JvdXRlcl9maWI0X2FkZChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAorCQkJCSAgICBzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvKQorewogCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeTsKIAlzdHJ1Y3QgbWx4c3dfc3BfdnIgKnZyOwogCWludCBlcnI7CiAKLQlpbmZvID0gc3dpdGNoZGV2X3RyYW5zX2l0ZW1fZGVxdWV1ZSh0cmFucyk7Ci0JZmliX2VudHJ5ID0gaW5mby0+ZmliX2VudHJ5OwotCWtmcmVlKGluZm8pOworCWlmIChtbHhzd19zcC0+cm91dGVyLmFib3J0ZWQpCisJCXJldHVybiAwOworCisJZmliX2VudHJ5ID0gbWx4c3dfc3BfZmliX2VudHJ5X2dldChtbHhzd19zcCwgZmVuX2luZm8pOworCWlmIChJU19FUlIoZmliX2VudHJ5KSkgeworCQlkZXZfd2FybihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIkZhaWxlZCB0byBnZXQgRklCNCBlbnRyeSBiZWluZyBhZGRlZC5cbiIpOworCQlyZXR1cm4gUFRSX0VSUihmaWJfZW50cnkpOworCX0KKworCWlmIChmaWJfZW50cnktPnJlZl9jb3VudCAhPSAxKQorCQlyZXR1cm4gMDsKIAogCXZyID0gZmliX2VudHJ5LT52cjsKLQllcnIgPSBtbHhzd19zcF9maWJfZW50cnlfaW5zZXJ0KGZpYl9lbnRyeS0+dnItPmZpYiwgZmliX2VudHJ5KTsKLQlpZiAoZXJyKQorCWVyciA9IG1seHN3X3NwX2ZpYl9lbnRyeV9pbnNlcnQodnItPmZpYiwgZmliX2VudHJ5KTsKKwlpZiAoZXJyKSB7CisJCWRldl93YXJuKG1seHN3X3NwLT5idXNfaW5mby0+ZGV2LCAiRmFpbGVkIHRvIGluc2VydCBGSUI0IGVudHJ5IGJlaW5nIGFkZGVkLlxuIik7CiAJCWdvdG8gZXJyX2ZpYl9lbnRyeV9pbnNlcnQ7CisJfQogCWVyciA9IG1seHN3X3NwX2ZpYl9lbnRyeV91cGRhdGUobWx4c3dfc3AsIGZpYl9lbnRyeSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfZmliX2VudHJ5X2FkZDsKQEAgLTE3NzEsNDUgKzE4MTYsMTk4IEBACiBlcnJfZmliX2VudHJ5X2FkZDoKIAltbHhzd19zcF9maWJfZW50cnlfcmVtb3ZlKHZyLT5maWIsIGZpYl9lbnRyeSk7CiBlcnJfZmliX2VudHJ5X2luc2VydDoKLQltbHhzd19zcF9yb3V0ZXJfZmliNF9lbnRyeV9maW5pKG1seHN3X3NwLCBmaWJfZW50cnkpOwotCW1seHN3X3NwX2ZpYl9lbnRyeV9kZXN0cm95KGZpYl9lbnRyeSk7Ci0JbWx4c3dfc3BfdnJfcHV0KG1seHN3X3NwLCB2cik7CisJbWx4c3dfc3BfZmliX2VudHJ5X3B1dChtbHhzd19zcCwgZmliX2VudHJ5KTsKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkKHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAotCQkJICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiAqZmliNCwKLQkJCSAgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCitzdGF0aWMgaW50IG1seHN3X3NwX3JvdXRlcl9maWI0X2RlbChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwLAorCQkJCSAgICBzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvKQogewotCWlmIChzd2l0Y2hkZXZfdHJhbnNfcGhfcHJlcGFyZSh0cmFucykpCi0JCXJldHVybiBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGRfcHJlcGFyZShtbHhzd19zcF9wb3J0LAotCQkJCQkJCWZpYjQsIHRyYW5zKTsKLQlyZXR1cm4gbWx4c3dfc3Bfcm91dGVyX2ZpYjRfYWRkX2NvbW1pdChtbHhzd19zcF9wb3J0LAotCQkJCQkgICAgICAgZmliNCwgdHJhbnMpOwotfQotCi1pbnQgbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZGVsKHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAotCQkJICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiAqZmliNCkKLXsKLQlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJc3RydWN0IG1seHN3X3NwX2ZpYl9lbnRyeSAqZmliX2VudHJ5OwotCXN0cnVjdCBtbHhzd19zcF92ciAqdnI7CiAKLQl2ciA9IG1seHN3X3NwX3ZyX2ZpbmQobWx4c3dfc3AsIGZpYjQtPnRiX2lkLCBNTFhTV19TUF9MM19QUk9UT19JUFY0KTsKLQlpZiAoIXZyKSB7Ci0JCWRldl93YXJuKG1seHN3X3NwLT5idXNfaW5mby0+ZGV2LCAiRmFpbGVkIHRvIGZpbmQgdmlydHVhbCByb3V0ZXIgZm9yIEZJQjQgZW50cnkgYmVpbmcgcmVtb3ZlZC5cbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0JZmliX2VudHJ5ID0gbWx4c3dfc3BfZmliX2VudHJ5X2xvb2t1cCh2ci0+ZmliLCAmZmliNC0+ZHN0LAotCQkJCQkgICAgICBzaXplb2YoZmliNC0+ZHN0KSwgZmliNC0+ZHN0X2xlbik7CisJaWYgKG1seHN3X3NwLT5yb3V0ZXIuYWJvcnRlZCkKKwkJcmV0dXJuIDA7CisKKwlmaWJfZW50cnkgPSBtbHhzd19zcF9maWJfZW50cnlfZmluZChtbHhzd19zcCwgZmVuX2luZm8pOwogCWlmICghZmliX2VudHJ5KSB7CiAJCWRldl93YXJuKG1seHN3X3NwLT5idXNfaW5mby0+ZGV2LCAiRmFpbGVkIHRvIGZpbmQgRklCNCBlbnRyeSBiZWluZyByZW1vdmVkLlxuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KLQltbHhzd19zcF9maWJfZW50cnlfZGVsKG1seHN3X3NwX3BvcnQtPm1seHN3X3NwLCBmaWJfZW50cnkpOwotCW1seHN3X3NwX2ZpYl9lbnRyeV9yZW1vdmUodnItPmZpYiwgZmliX2VudHJ5KTsKLQltbHhzd19zcF9yb3V0ZXJfZmliNF9lbnRyeV9maW5pKG1seHN3X3NwLCBmaWJfZW50cnkpOwotCW1seHN3X3NwX2ZpYl9lbnRyeV9kZXN0cm95KGZpYl9lbnRyeSk7Ci0JbWx4c3dfc3BfdnJfcHV0KG1seHN3X3NwLCB2cik7CisKKwlpZiAoZmliX2VudHJ5LT5yZWZfY291bnQgPT0gMSkgeworCQltbHhzd19zcF9maWJfZW50cnlfZGVsKG1seHN3X3NwLCBmaWJfZW50cnkpOworCQltbHhzd19zcF9maWJfZW50cnlfcmVtb3ZlKGZpYl9lbnRyeS0+dnItPmZpYiwgZmliX2VudHJ5KTsKKwl9CisKKwltbHhzd19zcF9maWJfZW50cnlfcHV0KG1seHN3X3NwLCBmaWJfZW50cnkpOwogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW50IG1seHN3X3NwX3JvdXRlcl9zZXRfYWJvcnRfdHJhcChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQoreworCWNoYXIgcmFsdGFfcGxbTUxYU1dfUkVHX1JBTFRBX0xFTl07CisJY2hhciByYWxzdF9wbFtNTFhTV19SRUdfUkFMU1RfTEVOXTsKKwljaGFyIHJhbHRiX3BsW01MWFNXX1JFR19SQUxUQl9MRU5dOworCWNoYXIgcmFsdWVfcGxbTUxYU1dfUkVHX1JBTFVFX0xFTl07CisJaW50IGVycjsKKworCW1seHN3X3JlZ19yYWx0YV9wYWNrKHJhbHRhX3BsLCB0cnVlLCBNTFhTV19SRUdfUkFMWFhfUFJPVE9DT0xfSVBWNCwKKwkJCSAgICAgTUxYU1dfU1BfTFBNX1RSRUVfTUlOKTsKKwllcnIgPSBtbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhyYWx0YSksIHJhbHRhX3BsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbWx4c3dfcmVnX3JhbHN0X3BhY2socmFsc3RfcGwsIDB4ZmYsIE1MWFNXX1NQX0xQTV9UUkVFX01JTik7CisJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsc3QpLCByYWxzdF9wbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW1seHN3X3JlZ19yYWx0Yl9wYWNrKHJhbHRiX3BsLCAwLCBNTFhTV19SRUdfUkFMWFhfUFJPVE9DT0xfSVBWNCwgMCk7CisJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsdGIpLCByYWx0Yl9wbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW1seHN3X3JlZ19yYWx1ZV9wYWNrNChyYWx1ZV9wbCwgTUxYU1dfU1BfTDNfUFJPVE9fSVBWNCwKKwkJCSAgICAgIE1MWFNXX1JFR19SQUxVRV9PUF9XUklURV9XUklURSwgMCwgMCwgMCk7CisJbWx4c3dfcmVnX3JhbHVlX2FjdF9pcDJtZV9wYWNrKHJhbHVlX3BsKTsKKwlyZXR1cm4gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmFsdWUpLCByYWx1ZV9wbCk7Cit9CisKK3N0YXRpYyB2b2lkIG1seHN3X3NwX3JvdXRlcl9maWI0X2Fib3J0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCit7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOworCXN0cnVjdCBtbHhzd19zcF9maWJfZW50cnkgKmZpYl9lbnRyeTsKKwlzdHJ1Y3QgbWx4c3dfc3BfZmliX2VudHJ5ICp0bXA7CisJc3RydWN0IG1seHN3X3NwX3ZyICp2cjsKKwlpbnQgaTsKKwlpbnQgZXJyOworCisJcmVzb3VyY2VzID0gbWx4c3dfY29yZV9yZXNvdXJjZXNfZ2V0KG1seHN3X3NwLT5jb3JlKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5tYXhfdmlydHVhbF9yb3V0ZXJzOyBpKyspIHsKKwkJdnIgPSAmbWx4c3dfc3AtPnJvdXRlci52cnNbaV07CisJCWlmICghdnItPnVzZWQpCisJCQljb250aW51ZTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmliX2VudHJ5LCB0bXAsCisJCQkJCSAmdnItPmZpYi0+ZW50cnlfbGlzdCwgbGlzdCkgeworCQkJYm9vbCBkb19icmVhayA9ICZ0bXAtPmxpc3QgPT0gJnZyLT5maWItPmVudHJ5X2xpc3Q7CisKKwkJCW1seHN3X3NwX2ZpYl9lbnRyeV9kZWwobWx4c3dfc3AsIGZpYl9lbnRyeSk7CisJCQltbHhzd19zcF9maWJfZW50cnlfcmVtb3ZlKGZpYl9lbnRyeS0+dnItPmZpYiwKKwkJCQkJCSAgZmliX2VudHJ5KTsKKwkJCW1seHN3X3NwX2ZpYl9lbnRyeV9wdXRfYWxsKG1seHN3X3NwLCBmaWJfZW50cnkpOworCQkJaWYgKGRvX2JyZWFrKQorCQkJCWJyZWFrOworCQl9CisJfQorCW1seHN3X3NwLT5yb3V0ZXIuYWJvcnRlZCA9IHRydWU7CisJZXJyID0gbWx4c3dfc3Bfcm91dGVyX3NldF9hYm9ydF90cmFwKG1seHN3X3NwKTsKKwlpZiAoZXJyKQorCQlkZXZfd2FybihtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIkZhaWxlZCB0byBzZXQgYWJvcnQgdHJhcC5cbiIpOworfQorCitzdGF0aWMgaW50IF9fbWx4c3dfc3Bfcm91dGVyX2luaXQoc3RydWN0IG1seHN3X3NwICptbHhzd19zcCkKK3sKKwlzdHJ1Y3QgbWx4c3dfcmVzb3VyY2VzICpyZXNvdXJjZXM7CisJY2hhciByZ2NyX3BsW01MWFNXX1JFR19SR0NSX0xFTl07CisJaW50IGVycjsKKworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJaWYgKCFyZXNvdXJjZXMtPm1heF9yaWZfdmFsaWQpCisJCXJldHVybiAtRUlPOworCisJbWx4c3dfc3AtPnJpZnMgPSBrY2FsbG9jKHJlc291cmNlcy0+bWF4X3JpZiwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBtbHhzd19zcF9yaWYgKiksIEdGUF9LRVJORUwpOworCWlmICghbWx4c3dfc3AtPnJpZnMpCisJCXJldHVybiAtRU5PTUVNOworCisJbWx4c3dfcmVnX3JnY3JfcGFjayhyZ2NyX3BsLCB0cnVlKTsKKwltbHhzd19yZWdfcmdjcl9tYXhfcm91dGVyX2ludGVyZmFjZXNfc2V0KHJnY3JfcGwsIHJlc291cmNlcy0+bWF4X3JpZik7CisJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmdjciksIHJnY3JfcGwpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JnY3JfZmFpbDsKKworCXJldHVybiAwOworCitlcnJfcmdjcl9mYWlsOgorCWtmcmVlKG1seHN3X3NwLT5yaWZzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX21seHN3X3NwX3JvdXRlcl9maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCit7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOworCWNoYXIgcmdjcl9wbFtNTFhTV19SRUdfUkdDUl9MRU5dOworCWludCBpOworCisJbWx4c3dfcmVnX3JnY3JfcGFjayhyZ2NyX3BsLCBmYWxzZSk7CisJbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcocmdjciksIHJnY3JfcGwpOworCisJcmVzb3VyY2VzID0gbWx4c3dfY29yZV9yZXNvdXJjZXNfZ2V0KG1seHN3X3NwLT5jb3JlKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzb3VyY2VzLT5tYXhfcmlmOyBpKyspCisJCVdBUk5fT05fT05DRShtbHhzd19zcC0+cmlmc1tpXSk7CisKKwlrZnJlZShtbHhzd19zcC0+cmlmcyk7Cit9CisKK3N0YXRpYyBpbnQgbWx4c3dfc3Bfcm91dGVyX2ZpYl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBtbHhzd19zcCwgZmliX25iKTsKKwlzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvID0gcHRyOworCWludCBlcnI7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBGSUJfRVZFTlRfRU5UUllfQUREOgorCQllcnIgPSBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGQobWx4c3dfc3AsIGZlbl9pbmZvKTsKKwkJaWYgKGVycikKKwkJCW1seHN3X3NwX3JvdXRlcl9maWI0X2Fib3J0KG1seHN3X3NwKTsKKwkJYnJlYWs7CisJY2FzZSBGSUJfRVZFTlRfRU5UUllfREVMOgorCQltbHhzd19zcF9yb3V0ZXJfZmliNF9kZWwobWx4c3dfc3AsIGZlbl9pbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBGSUJfRVZFTlRfUlVMRV9BREQ6IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRklCX0VWRU5UX1JVTEVfREVMOgorCQltbHhzd19zcF9yb3V0ZXJfZmliNF9hYm9ydChtbHhzd19zcCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK2ludCBtbHhzd19zcF9yb3V0ZXJfaW5pdChzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwKQoreworCWludCBlcnI7CisKKwlJTklUX0xJU1RfSEVBRCgmbWx4c3dfc3AtPnJvdXRlci5uZXh0aG9wX25laWdoc19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmbWx4c3dfc3AtPnJvdXRlci5uZXh0aG9wX2dyb3VwX2xpc3QpOworCWVyciA9IF9fbWx4c3dfc3Bfcm91dGVyX2luaXQobWx4c3dfc3ApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltbHhzd19zcF9scG1faW5pdChtbHhzd19zcCk7CisJZXJyID0gbWx4c3dfc3BfdnJzX2luaXQobWx4c3dfc3ApOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3Zyc19pbml0OworCisJZXJyID0gIG1seHN3X3NwX25laWdoX2luaXQobWx4c3dfc3ApOworCWlmIChlcnIpCisJCWdvdG8gZXJyX25laWdoX2luaXQ7CisKKwltbHhzd19zcC0+ZmliX25iLm5vdGlmaWVyX2NhbGwgPSBtbHhzd19zcF9yb3V0ZXJfZmliX2V2ZW50OworCXJlZ2lzdGVyX2ZpYl9ub3RpZmllcigmbWx4c3dfc3AtPmZpYl9uYik7CisJcmV0dXJuIDA7CisKK2Vycl9uZWlnaF9pbml0OgorCW1seHN3X3NwX3Zyc19maW5pKG1seHN3X3NwKTsKK2Vycl92cnNfaW5pdDoKKwlfX21seHN3X3NwX3JvdXRlcl9maW5pKG1seHN3X3NwKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIG1seHN3X3NwX3JvdXRlcl9maW5pKHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3ApCit7CisJdW5yZWdpc3Rlcl9maWJfbm90aWZpZXIoJm1seHN3X3NwLT5maWJfbmIpOworCW1seHN3X3NwX25laWdoX2ZpbmkobWx4c3dfc3ApOworCW1seHN3X3NwX3Zyc19maW5pKG1seHN3X3NwKTsKKwlfX21seHN3X3NwX3JvdXRlcl9maW5pKG1seHN3X3NwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3NwZWN0cnVtX3N3aXRjaGRldi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fc3dpdGNoZGV2LmMKaW5kZXggZDFiNTljZC4uNWUwMGM3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fc3dpdGNoZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3BlY3RydW1fc3dpdGNoZGV2LmMKQEAgLTE2Nyw4ICsxNjcsOCBAQAogfQogCiBzdGF0aWMgaW50IF9fbWx4c3dfc3BfcG9ydF9mbG9vZF9zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCi0JCQkJICAgICB1MTYgaWR4X2JlZ2luLCB1MTYgaWR4X2VuZCwgYm9vbCBzZXQsCi0JCQkJICAgICBib29sIG9ubHlfdWMpCisJCQkJICAgICB1MTYgaWR4X2JlZ2luLCB1MTYgaWR4X2VuZCwgYm9vbCB1Y19zZXQsCisJCQkJICAgICBib29sIGJtX3NldCkKIHsKIAlzdHJ1Y3QgbWx4c3dfc3AgKm1seHN3X3NwID0gbWx4c3dfc3BfcG9ydC0+bWx4c3dfc3A7CiAJdTE2IGxvY2FsX3BvcnQgPSBtbHhzd19zcF9wb3J0LT5sb2NhbF9wb3J0OwpAQCAtMTg3LDI4ICsxODcsMjIgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAltbHhzd19yZWdfc2Z0cl9wYWNrKHNmdHJfcGwsIE1MWFNXX1NQX0ZMT09EX1RBQkxFX1VDLCBpZHhfYmVnaW4sCi0JCQkgICAgdGFibGVfdHlwZSwgcmFuZ2UsIGxvY2FsX3BvcnQsIHNldCk7CisJCQkgICAgdGFibGVfdHlwZSwgcmFuZ2UsIGxvY2FsX3BvcnQsIHVjX3NldCk7CiAJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2Z0ciksIHNmdHJfcGwpOwogCWlmIChlcnIpCiAJCWdvdG8gYnVmZmVyX291dDsKIAotCS8qIEZsb29kaW5nIGNvbnRyb2wgYWxsb3dzIG9uZSB0byBkZWNpZGUgd2hldGhlciBhIGdpdmVuIHBvcnQgd2lsbAotCSAqIGZsb29kIHVuaWNhc3QgdHJhZmZpYyBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gRkRCIGVudHJ5LgotCSAqLwotCWlmIChvbmx5X3VjKQotCQlnb3RvIGJ1ZmZlcl9vdXQ7Ci0KIAltbHhzd19yZWdfc2Z0cl9wYWNrKHNmdHJfcGwsIE1MWFNXX1NQX0ZMT09EX1RBQkxFX0JNLCBpZHhfYmVnaW4sCi0JCQkgICAgdGFibGVfdHlwZSwgcmFuZ2UsIGxvY2FsX3BvcnQsIHNldCk7CisJCQkgICAgdGFibGVfdHlwZSwgcmFuZ2UsIGxvY2FsX3BvcnQsIGJtX3NldCk7CiAJZXJyID0gbWx4c3dfcmVnX3dyaXRlKG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2Z0ciksIHNmdHJfcGwpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2Zsb29kX2JtX3NldDsKLQllbHNlCi0JCWdvdG8gYnVmZmVyX291dDsKKworCWdvdG8gYnVmZmVyX291dDsKIAogZXJyX2Zsb29kX2JtX3NldDoKIAltbHhzd19yZWdfc2Z0cl9wYWNrKHNmdHJfcGwsIE1MWFNXX1NQX0ZMT09EX1RBQkxFX1VDLCBpZHhfYmVnaW4sCi0JCQkgICAgdGFibGVfdHlwZSwgcmFuZ2UsIGxvY2FsX3BvcnQsICFzZXQpOworCQkJICAgIHRhYmxlX3R5cGUsIHJhbmdlLCBsb2NhbF9wb3J0LCAhdWNfc2V0KTsKIAltbHhzd19yZWdfd3JpdGUobWx4c3dfc3AtPmNvcmUsIE1MWFNXX1JFRyhzZnRyKSwgc2Z0cl9wbCk7CiBidWZmZXJfb3V0OgogCWtmcmVlKHNmdHJfcGwpOwpAQCAtMjU3LDE2ICsyNTEsNDMgQEAKIAkgKiB0aGUgc3RhcnQgb2YgdGhlIHZGSURzIHJhbmdlLgogCSAqLwogCXZmaWQgPSBtbHhzd19zcF9maWRfdG9fdmZpZChmaWQpOwotCXJldHVybiBfX21seHN3X3NwX3BvcnRfZmxvb2Rfc2V0KG1seHN3X3NwX3Zwb3J0LCB2ZmlkLCB2ZmlkLCBzZXQsCi0JCQkJCSBmYWxzZSk7CisJcmV0dXJuIF9fbWx4c3dfc3BfcG9ydF9mbG9vZF9zZXQobWx4c3dfc3BfdnBvcnQsIHZmaWQsIHZmaWQsIHNldCwgc2V0KTsKK30KKworc3RhdGljIGludCBtbHhzd19zcF9wb3J0X2xlYXJuaW5nX3NldChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKKwkJCQkgICAgICBib29sIHNldCkKK3sKKwl1MTYgdmlkOworCWludCBlcnI7CisKKwlpZiAobWx4c3dfc3BfcG9ydF9pc192cG9ydChtbHhzd19zcF9wb3J0KSkgeworCQl2aWQgPSBtbHhzd19zcF92cG9ydF92aWRfZ2V0KG1seHN3X3NwX3BvcnQpOworCisJCXJldHVybiBfX21seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF9wb3J0LCB2aWQsIHZpZCwKKwkJCQkJCQlzZXQpOworCX0KKworCWZvcl9lYWNoX3NldF9iaXQodmlkLCBtbHhzd19zcF9wb3J0LT5hY3RpdmVfdmxhbnMsIFZMQU5fTl9WSUQpIHsKKwkJZXJyID0gX19tbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQobWx4c3dfc3BfcG9ydCwgdmlkLCB2aWQsCisJCQkJCQkgICAgICAgc2V0KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3BvcnRfdmlkX2xlYXJuaW5nX3NldDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3BvcnRfdmlkX2xlYXJuaW5nX3NldDoKKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgbWx4c3dfc3BfcG9ydC0+YWN0aXZlX3ZsYW5zLCBWTEFOX05fVklEKQorCQlfX21seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF9wb3J0LCB2aWQsIHZpZCwgIXNldCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBtbHhzd19zcF9wb3J0X2F0dHJfYnJfZmxhZ3Nfc2V0KHN0cnVjdCBtbHhzd19zcF9wb3J0ICptbHhzd19zcF9wb3J0LAogCQkJCQkgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucywKIAkJCQkJICAgdW5zaWduZWQgbG9uZyBicnBvcnRfZmxhZ3MpCiB7CisJdW5zaWduZWQgbG9uZyBsZWFybmluZyA9IG1seHN3X3NwX3BvcnQtPmxlYXJuaW5nID8gQlJfTEVBUk5JTkcgOiAwOwogCXVuc2lnbmVkIGxvbmcgdWNfZmxvb2QgPSBtbHhzd19zcF9wb3J0LT51Y19mbG9vZCA/IEJSX0ZMT09EIDogMDsKLQlib29sIHNldDsKIAlpbnQgZXJyOwogCiAJaWYgKCFtbHhzd19zcF9wb3J0LT5icmlkZ2VkKQpAQCAtMjc2LDE3ICsyOTcsMzAgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoKHVjX2Zsb29kIF4gYnJwb3J0X2ZsYWdzKSAmIEJSX0ZMT09EKSB7Ci0JCXNldCA9IG1seHN3X3NwX3BvcnQtPnVjX2Zsb29kID8gZmFsc2UgOiB0cnVlOwotCQllcnIgPSBtbHhzd19zcF9wb3J0X3VjX2Zsb29kX3NldChtbHhzd19zcF9wb3J0LCBzZXQpOworCQllcnIgPSBtbHhzd19zcF9wb3J0X3VjX2Zsb29kX3NldChtbHhzd19zcF9wb3J0LAorCQkJCQkJICFtbHhzd19zcF9wb3J0LT51Y19mbG9vZCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCX0KIAorCWlmICgobGVhcm5pbmcgXiBicnBvcnRfZmxhZ3MpICYgQlJfTEVBUk5JTkcpIHsKKwkJZXJyID0gbWx4c3dfc3BfcG9ydF9sZWFybmluZ19zZXQobWx4c3dfc3BfcG9ydCwKKwkJCQkJCSAhbWx4c3dfc3BfcG9ydC0+bGVhcm5pbmcpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfcG9ydF9sZWFybmluZ19zZXQ7CisJfQorCiAJbWx4c3dfc3BfcG9ydC0+dWNfZmxvb2QgPSBicnBvcnRfZmxhZ3MgJiBCUl9GTE9PRCA/IDEgOiAwOwogCW1seHN3X3NwX3BvcnQtPmxlYXJuaW5nID0gYnJwb3J0X2ZsYWdzICYgQlJfTEVBUk5JTkcgPyAxIDogMDsKIAltbHhzd19zcF9wb3J0LT5sZWFybmluZ19zeW5jID0gYnJwb3J0X2ZsYWdzICYgQlJfTEVBUk5JTkdfU1lOQyA/IDEgOiAwOwogCiAJcmV0dXJuIDA7CisKK2Vycl9wb3J0X2xlYXJuaW5nX3NldDoKKwlpZiAoKHVjX2Zsb29kIF4gYnJwb3J0X2ZsYWdzKSAmIEJSX0ZMT09EKQorCQltbHhzd19zcF9wb3J0X3VjX2Zsb29kX3NldChtbHhzd19zcF9wb3J0LAorCQkJCQkgICBtbHhzd19zcF9wb3J0LT51Y19mbG9vZCk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBtbHhzd19zcF9hZ2Vpbmdfc2V0KHN0cnVjdCBtbHhzd19zcCAqbWx4c3dfc3AsIHUzMiBhZ2VpbmdfdGltZSkKQEAgLTQ2MCw2ICs0OTQsOSBAQAogewogCXN0cnVjdCBtbHhzd19zcF9maWQgKmY7CiAKKwlpZiAodGVzdF9iaXQoZmlkLCBtbHhzd19zcF9wb3J0LT5hY3RpdmVfdmxhbnMpKQorCQlyZXR1cm4gMDsKKwogCWYgPSBtbHhzd19zcF9maWRfZmluZChtbHhzd19zcF9wb3J0LT5tbHhzd19zcCwgZmlkKTsKIAlpZiAoIWYpIHsKIAkJZiA9IG1seHN3X3NwX2ZpZF9jcmVhdGUobWx4c3dfc3BfcG9ydC0+bWx4c3dfc3AsIGZpZCk7CkBAIC01MTcsNyArNTU0LDcgQEAKIAl9CiAKIAllcnIgPSBfX21seHN3X3NwX3BvcnRfZmxvb2Rfc2V0KG1seHN3X3NwX3BvcnQsIGZpZF9iZWdpbiwgZmlkX2VuZCwKLQkJCQkJdHJ1ZSwgZmFsc2UpOworCQkJCQltbHhzd19zcF9wb3J0LT51Y19mbG9vZCwgdHJ1ZSk7CiAJaWYgKGVycikKIAkJZ290byBlcnJfcG9ydF9mbG9vZF9zZXQ7CiAKQEAgLTYzNSw2ICs2NzIsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtbHhzd19zcF9wb3J0X3ZpZF9sZWFybmluZ19zZXQoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCisJCQkJCSAgdTE2IHZpZF9iZWdpbiwgdTE2IHZpZF9lbmQsCisJCQkJCSAgYm9vbCBsZWFybl9lbmFibGUpCit7CisJdTE2IHZpZCwgdmlkX2U7CisJaW50IGVycjsKKworCWZvciAodmlkID0gdmlkX2JlZ2luOyB2aWQgPD0gdmlkX2VuZDsKKwkgICAgIHZpZCArPSBNTFhTV19SRUdfU1BWTUxSX1JFQ19NQVhfQ09VTlQpIHsKKwkJdmlkX2UgPSBtaW4oKHUxNikgKHZpZCArIE1MWFNXX1JFR19TUFZNTFJfUkVDX01BWF9DT1VOVCAtIDEpLAorCQkJICAgIHZpZF9lbmQpOworCisJCWVyciA9IF9fbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3BvcnQsIHZpZCwKKwkJCQkJCSAgICAgICB2aWRfZSwgbGVhcm5fZW5hYmxlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19tbHhzd19zcF9wb3J0X3ZsYW5zX2FkZChzdHJ1Y3QgbWx4c3dfc3BfcG9ydCAqbWx4c3dfc3BfcG9ydCwKIAkJCQkgICAgIHUxNiB2aWRfYmVnaW4sIHUxNiB2aWRfZW5kLAogCQkJCSAgICAgYm9vbCBmbGFnX3VudGFnZ2VkLCBib29sIGZsYWdfcHZpZCkKQEAgLTY3NSw2ICs3MzMsMTQgQEAKIAkJfQogCX0KIAorCWVyciA9IG1seHN3X3NwX3BvcnRfdmlkX2xlYXJuaW5nX3NldChtbHhzd19zcF9wb3J0LCB2aWRfYmVnaW4sIHZpZF9lbmQsCisJCQkJCSAgICAgbWx4c3dfc3BfcG9ydC0+bGVhcm5pbmcpOworCWlmIChlcnIpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IGxlYXJuaW5nIGZvciBWSURzICVkLSVkXG4iLAorCQkJICAgdmlkX2JlZ2luLCB2aWRfZW5kKTsKKwkJZ290byBlcnJfcG9ydF92aWRfbGVhcm5pbmdfc2V0OworCX0KKwogCS8qIENoYW5naW5nIGFjdGl2aXR5IGJpdHMgb25seSBpZiBIVyBvcGVyYXRpb24gc3VjY2VkZWQgKi8KIAlmb3IgKHZpZCA9IHZpZF9iZWdpbjsgdmlkIDw9IHZpZF9lbmQ7IHZpZCsrKSB7CiAJCXNldF9iaXQodmlkLCBtbHhzd19zcF9wb3J0LT5hY3RpdmVfdmxhbnMpOwpAQCAtNjk3LDYgKzc2Myw5IEBACiBlcnJfcG9ydF9zdHBfc3RhdGVfc2V0OgogCWZvciAodmlkID0gdmlkX2JlZ2luOyB2aWQgPD0gdmlkX2VuZDsgdmlkKyspCiAJCWNsZWFyX2JpdCh2aWQsIG1seHN3X3NwX3BvcnQtPmFjdGl2ZV92bGFucyk7CisJbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3BvcnQsIHZpZF9iZWdpbiwgdmlkX2VuZCwKKwkJCQkgICAgICAgZmFsc2UpOworZXJyX3BvcnRfdmlkX2xlYXJuaW5nX3NldDoKIAlpZiAob2xkX3B2aWQgIT0gbWx4c3dfc3BfcG9ydC0+cHZpZCkKIAkJbWx4c3dfc3BfcG9ydF9wdmlkX3NldChtbHhzd19zcF9wb3J0LCBvbGRfcHZpZCk7CiBlcnJfcG9ydF9wdmlkX3NldDoKQEAgLTk3NSwxMSArMTA0NCw2IEBACiAJCQkJCSAgICAgIFNXSVRDSERFVl9PQkpfUE9SVF9WTEFOKG9iaiksCiAJCQkJCSAgICAgIHRyYW5zKTsKIAkJYnJlYWs7Ci0JY2FzZSBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCOgotCQllcnIgPSBtbHhzd19zcF9yb3V0ZXJfZmliNF9hZGQobWx4c3dfc3BfcG9ydCwKLQkJCQkJICAgICAgIFNXSVRDSERFVl9PQkpfSVBWNF9GSUIob2JqKSwKLQkJCQkJICAgICAgIHRyYW5zKTsKLQkJYnJlYWs7CiAJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfRkRCOgogCQllcnIgPSBtbHhzd19zcF9wb3J0X2ZkYl9zdGF0aWNfYWRkKG1seHN3X3NwX3BvcnQsCiAJCQkJCQkgICBTV0lUQ0hERVZfT0JKX1BPUlRfRkRCKG9iaiksCkBAIC0xMDAxLDI5ICsxMDY1LDIwIEBACiBzdGF0aWMgaW50IF9fbWx4c3dfc3BfcG9ydF92bGFuc19kZWwoc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQsCiAJCQkJICAgICB1MTYgdmlkX2JlZ2luLCB1MTYgdmlkX2VuZCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbWx4c3dfc3BfcG9ydC0+ZGV2OwogCXUxNiB2aWQsIHB2aWQ7Ci0JaW50IGVycjsKIAogCWlmICghbWx4c3dfc3BfcG9ydC0+YnJpZGdlZCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllcnIgPSBfX21seHN3X3NwX3BvcnRfdmxhbnNfc2V0KG1seHN3X3NwX3BvcnQsIHZpZF9iZWdpbiwgdmlkX2VuZCwKLQkJCQkJZmFsc2UsIGZhbHNlKTsKLQlpZiAoZXJyKSB7Ci0JCW5ldGRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIGRlbCBWSURzICVkLSVkXG4iLCB2aWRfYmVnaW4sCi0JCQkgICB2aWRfZW5kKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJbWx4c3dfc3BfcG9ydF92aWRfbGVhcm5pbmdfc2V0KG1seHN3X3NwX3BvcnQsIHZpZF9iZWdpbiwgdmlkX2VuZCwKKwkJCQkgICAgICAgZmFsc2UpOwogCiAJcHZpZCA9IG1seHN3X3NwX3BvcnQtPnB2aWQ7Ci0JaWYgKHB2aWQgPj0gdmlkX2JlZ2luICYmIHB2aWQgPD0gdmlkX2VuZCkgewotCQllcnIgPSBtbHhzd19zcF9wb3J0X3B2aWRfc2V0KG1seHN3X3NwX3BvcnQsIDApOwotCQlpZiAoZXJyKSB7Ci0JCQluZXRkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBkZWwgUFZJRCAlZFxuIiwgcHZpZCk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JfQorCWlmIChwdmlkID49IHZpZF9iZWdpbiAmJiBwdmlkIDw9IHZpZF9lbmQpCisJCW1seHN3X3NwX3BvcnRfcHZpZF9zZXQobWx4c3dfc3BfcG9ydCwgMCk7CisKKwlfX21seHN3X3NwX3BvcnRfdmxhbnNfc2V0KG1seHN3X3NwX3BvcnQsIHZpZF9iZWdpbiwgdmlkX2VuZCwgZmFsc2UsCisJCQkJICBmYWxzZSk7CiAKIAltbHhzd19zcF9wb3J0X2ZpZF9sZWF2ZShtbHhzd19zcF9wb3J0LCB2aWRfYmVnaW4sIHZpZF9lbmQpOwogCkBAIC0xMTIxLDEwICsxMTc2LDYgQEAKIAkJZXJyID0gbWx4c3dfc3BfcG9ydF92bGFuc19kZWwobWx4c3dfc3BfcG9ydCwKIAkJCQkJICAgICAgU1dJVENIREVWX09CSl9QT1JUX1ZMQU4ob2JqKSk7CiAJCWJyZWFrOwotCWNhc2UgU1dJVENIREVWX09CSl9JRF9JUFY0X0ZJQjoKLQkJZXJyID0gbWx4c3dfc3Bfcm91dGVyX2ZpYjRfZGVsKG1seHN3X3NwX3BvcnQsCi0JCQkJCSAgICAgICBTV0lUQ0hERVZfT0JKX0lQVjRfRklCKG9iaikpOwotCQlicmVhazsKIAljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9GREI6CiAJCWVyciA9IG1seHN3X3NwX3BvcnRfZmRiX3N0YXRpY19kZWwobWx4c3dfc3BfcG9ydCwKIAkJCQkJCSAgIFNXSVRDSERFVl9PQkpfUE9SVF9GREIob2JqKSk7CkBAIC0xMTQ1LDkgKzExOTYsMTEgQEAKIAkJCQkJCSAgIHUxNiBsYWdfaWQpCiB7CiAJc3RydWN0IG1seHN3X3NwX3BvcnQgKm1seHN3X3NwX3BvcnQ7CisJc3RydWN0IG1seHN3X3Jlc291cmNlcyAqcmVzb3VyY2VzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1MWFNXX1NQX1BPUlRfUEVSX0xBR19NQVg7IGkrKykgeworCXJlc291cmNlcyA9IG1seHN3X2NvcmVfcmVzb3VyY2VzX2dldChtbHhzd19zcC0+Y29yZSk7CisJZm9yIChpID0gMDsgaSA8IHJlc291cmNlcy0+bWF4X3BvcnRzX2luX2xhZzsgaSsrKSB7CiAJCW1seHN3X3NwX3BvcnQgPSBtbHhzd19zcF9wb3J0X2xhZ2dlZF9nZXQobWx4c3dfc3AsIGxhZ19pZCwgaSk7CiAJCWlmIChtbHhzd19zcF9wb3J0KQogCQkJcmV0dXJuIG1seHN3X3NwX3BvcnQ7CkBAIC0xMzY2LDggKzE0MTksNiBAQAogCQl2aWQgPSBmaWQ7CiAJfQogCi0JYWRkaW5nID0gYWRkaW5nICYmIG1seHN3X3NwX3BvcnQtPmxlYXJuaW5nOwotCiBkb19mZGJfb3A6CiAJZXJyID0gbWx4c3dfc3BfcG9ydF9mZGJfdWNfb3AobWx4c3dfc3AsIGxvY2FsX3BvcnQsIG1hYywgZmlkLAogCQkJCSAgICAgIGFkZGluZywgdHJ1ZSk7CkBAIC0xNDI5LDggKzE0ODAsNiBAQAogCQl2aWQgPSBmaWQ7CiAJfQogCi0JYWRkaW5nID0gYWRkaW5nICYmIG1seHN3X3NwX3BvcnQtPmxlYXJuaW5nOwotCiBkb19mZGJfb3A6CiAJZXJyID0gbWx4c3dfc3BfcG9ydF9mZGJfdWNfbGFnX29wKG1seHN3X3NwLCBsYWdfaWQsIG1hYywgZmlkLCBsYWdfdmlkLAogCQkJCQkgIGFkZGluZywgdHJ1ZSk7CkBAIC0xNDk2LDIwICsxNTQ1LDE4IEBACiAJbWx4c3dfc3AgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG1seHN3X3NwLCBmZGJfbm90aWZ5LmR3LndvcmspOwogCiAJcnRubF9sb2NrKCk7Ci0JZG8gewotCQltbHhzd19yZWdfc2ZuX3BhY2soc2ZuX3BsKTsKLQkJZXJyID0gbWx4c3dfcmVnX3F1ZXJ5KG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2ZuKSwgc2ZuX3BsKTsKLQkJaWYgKGVycikgewotCQkJZGV2X2Vycl9yYXRlbGltaXRlZChtbHhzd19zcC0+YnVzX2luZm8tPmRldiwgIkZhaWxlZCB0byBnZXQgRkRCIG5vdGlmaWNhdGlvbnNcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJbnVtX3JlYyA9IG1seHN3X3JlZ19zZm5fbnVtX3JlY19nZXQoc2ZuX3BsKTsKLQkJZm9yIChpID0gMDsgaSA8IG51bV9yZWM7IGkrKykKLQkJCW1seHN3X3NwX2ZkYl9ub3RpZnlfcmVjX3Byb2Nlc3MobWx4c3dfc3AsIHNmbl9wbCwgaSk7CisJbWx4c3dfcmVnX3Nmbl9wYWNrKHNmbl9wbCk7CisJZXJyID0gbWx4c3dfcmVnX3F1ZXJ5KG1seHN3X3NwLT5jb3JlLCBNTFhTV19SRUcoc2ZuKSwgc2ZuX3BsKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQobWx4c3dfc3AtPmJ1c19pbmZvLT5kZXYsICJGYWlsZWQgdG8gZ2V0IEZEQiBub3RpZmljYXRpb25zXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCW51bV9yZWMgPSBtbHhzd19yZWdfc2ZuX251bV9yZWNfZ2V0KHNmbl9wbCk7CisJZm9yIChpID0gMDsgaSA8IG51bV9yZWM7IGkrKykKKwkJbWx4c3dfc3BfZmRiX25vdGlmeV9yZWNfcHJvY2VzcyhtbHhzd19zcCwgc2ZuX3BsLCBpKTsKIAotCX0gd2hpbGUgKG51bV9yZWMpOworb3V0OgogCXJ0bmxfdW5sb2NrKCk7Ci0KIAlrZnJlZShzZm5fcGwpOwogCW1seHN3X3NwX2ZkYl9ub3RpZnlfd29ya19zY2hlZHVsZShtbHhzd19zcCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zd2l0Y2h4Mi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4c3cvc3dpdGNoeDIuYwppbmRleCAzNzdkYWE0Li5jMGMyM2UyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHhzdy9zd2l0Y2h4Mi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seHN3L3N3aXRjaHgyLmMKQEAgLTk5Nyw3ICs5OTcsNyBAQAogCS8qIEVhY2ggcGFja2V0IG5lZWRzIHRvIGhhdmUgYSBUeCBoZWFkZXIgKG1ldGFkYXRhKSBvbiB0b3AgYWxsIG90aGVyCiAJICogaGVhZGVycy4KIAkgKi8KLQlkZXYtPmhhcmRfaGVhZGVyX2xlbiArPSBNTFhTV19UWEhEUl9MRU47CisJZGV2LT5uZWVkZWRfaGVhZHJvb20gPSBNTFhTV19UWEhEUl9MRU47CiAKIAllcnIgPSBtbHhzd19zeF9wb3J0X21vZHVsZV9jaGVjayhtbHhzd19zeF9wb3J0LCAmdXNhYmxlKTsKIAlpZiAoZXJyKSB7CkBAIC0xNTEyLDEwICsxNTEyLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgbWx4c3dfY29uZmlnX3Byb2ZpbGUgbWx4c3dfc3hfY29uZmlnX3Byb2ZpbGUgPSB7CiAJLnVzZWRfbWF4X3ZlcGFfY2hhbm5lbHMJCT0gMSwKIAkubWF4X3ZlcGFfY2hhbm5lbHMJCT0gMCwKLQkudXNlZF9tYXhfbGFnCQkJPSAxLAotCS5tYXhfbGFnCQkJPSA2NCwKLQkudXNlZF9tYXhfcG9ydF9wZXJfbGFnCQk9IDEsCi0JLm1heF9wb3J0X3Blcl9sYWcJCT0gMTYsCiAJLnVzZWRfbWF4X21pZAkJCT0gMSwKIAkubWF4X21pZAkJCT0gNzAwMCwKIAkudXNlZF9tYXhfcGd0CQkJPSAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9uczgzODIwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL25zODM4MjAuYwppbmRleCBlYjgwN2IwLi41NjlhZGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL25zODM4MjAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL25zODM4MjAuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKIC8qIHR1bmFibGVzICovCiAjZGVmaW5lIFJYX0JVRl9TSVpFCTE1MDAJLyogODE5MiAqLwotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1ZMQU5fODAyMVEpCiAjZGVmaW5lIE5TODM4MjBfVkxBTl9BQ0NFTF9TVVBQT1JUCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvTWFrZWZpbGUKaW5kZXggNjgxNzg4MS4uMGVmYjJiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL01ha2VmaWxlCkBAIC0zLDYgKzMsMTMgQEAKIG5mcF9uZXR2Zi1vYmpzIDo9IFwKIAkgICAgbmZwX25ldF9jb21tb24ubyBcCiAJICAgIG5mcF9uZXRfZXRodG9vbC5vIFwKKwkgICAgbmZwX25ldF9vZmZsb2FkLm8gXAogCSAgICBuZnBfbmV0dmZfbWFpbi5vCiAKK2lmZXEgKCQoQ09ORklHX0JQRl9TWVNDQUxMKSx5KQorbmZwX25ldHZmLW9ianMgKz0gXAorCSAgICBuZnBfYnBmX3ZlcmlmaWVyLm8gXAorCSAgICBuZnBfYnBmX2ppdC5vCitlbmRpZgorCiBuZnBfbmV0dmYtJChDT05GSUdfTkZQX05FVF9ERUJVRykgKz0gbmZwX25ldF9kZWJ1Z2ZzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2FzbS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0cm9ub21lL25mcC9uZnBfYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0ODRiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2FzbS5oCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE5ldHJvbm9tZSBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBMaWNlbnNlIFZlcnNpb24gMiwKKyAqIEp1bmUgMTk5MSBhcyBzaG93biBpbiB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5IG9mIHRoaXMKKyAqIHNvdXJjZSB0cmVlIG9yIHRoZSBCU0QgMi1DbGF1c2UgTGljZW5zZSBwcm92aWRlZCBiZWxvdy4gIFlvdSBoYXZlIHRoZQorICogb3B0aW9uIHRvIGxpY2Vuc2UgdGhpcyBzb2Z0d2FyZSB1bmRlciB0aGUgY29tcGxldGUgdGVybXMgb2YgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogVGhlIEJTRCAyLUNsYXVzZSBMaWNlbnNlOgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfX05GUF9BU01fSF9fCisjZGVmaW5lIF9fTkZQX0FTTV9IX18gMQorCisjaW5jbHVkZSAibmZwX2JwZi5oIgorCisjZGVmaW5lIFJFR19OT05FCTAKKworI2RlZmluZSBSRV9SRUdfTk9fRFNUCTB4MDIwCisjZGVmaW5lIFJFX1JFR19JTU0JMHgwMjAKKyNkZWZpbmUgUkVfUkVHX0lNTV9lbmNvZGUoeCkJCQkJCVwKKwkoUkVfUkVHX0lNTSB8ICgoeCkgJiAweDFmKSB8ICgoKHgpICYgMHg2MCkgPDwgMSkpCisjZGVmaW5lIFJFX1JFR19JTU1fTUFYCSAweDA3ZlVMTAorI2RlZmluZSBSRV9SRUdfWEZSCTB4MDgwCisKKyNkZWZpbmUgVVJfUkVHX1hGUgkweDE4MAorI2RlZmluZSBVUl9SRUdfTk4JMHgyODAKKyNkZWZpbmUgVVJfUkVHX05PX0RTVAkweDMwMAorI2RlZmluZSBVUl9SRUdfSU1NCVVSX1JFR19OT19EU1QKKyNkZWZpbmUgVVJfUkVHX0lNTV9lbmNvZGUoeCkgKFVSX1JFR19JTU0gfCAoeCkpCisjZGVmaW5lIFVSX1JFR19JTU1fTUFYCSAweDBmZlVMTAorCisjZGVmaW5lIE9QX0JSX0JBU0UJMHgwZDgwMDAwMDAyMFVMTAorI2RlZmluZSBPUF9CUl9CQVNFX01BU0sJMHgwZjgwMDBjM2NlMFVMTAorI2RlZmluZSBPUF9CUl9NQVNLCTB4MDAwMDAwMDAwMWZVTEwKKyNkZWZpbmUgT1BfQlJfRVZfUElQCTB4MDAwMDAwMDAzMDBVTEwKKyNkZWZpbmUgT1BfQlJfQ1NTCTB4MDAwMDAwM2MwMDBVTEwKKyNkZWZpbmUgT1BfQlJfREVGQlIJMHgwMDAwMDMwMDAwMFVMTAorI2RlZmluZSBPUF9CUl9BRERSX0xPCTB4MDA3ZmZjMDAwMDBVTEwKKyNkZWZpbmUgT1BfQlJfQUREUl9ISQkweDEwMDAwMDAwMDAwVUxMCisKKyNkZWZpbmUgbmZwX2lzX2JyKF9pbnNuKQkJCQlcCisJKCgoX2luc24pICYgT1BfQlJfQkFTRV9NQVNLKSA9PSBPUF9CUl9CQVNFKQorCitlbnVtIGJyX21hc2sgeworCUJSX0JFUSA9IDB4MDAsCisJQlJfQk5FID0gMHgwMSwKKwlCUl9CSFMgPSAweDA0LAorCUJSX0JMTyA9IDB4MDUsCisJQlJfQkdFID0gMHgwOCwKKwlCUl9VTkMgPSAweDE4LAorfTsKKworZW51bSBicl9ldl9waXAgeworCUJSX0VWX1BJUF9VTkNPTkQgPSAwLAorCUJSX0VWX1BJUF9DT05EID0gMSwKK307CisKK2VudW0gYnJfY3R4X3NpZ25hbF9zdGF0ZSB7CisJQlJfQ1NTX05PTkUgPSAyLAorfTsKKworI2RlZmluZSBPUF9CQllURV9CQVNFCTB4MGM4MDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfQkJfQV9TUkMJMHgwMDAwMDAwMDBmZlVMTAorI2RlZmluZSBPUF9CQl9CWVRFCTB4MDAwMDAwMDAzMDBVTEwKKyNkZWZpbmUgT1BfQkJfQl9TUkMJMHgwMDAwMDAzZmMwMFVMTAorI2RlZmluZSBPUF9CQl9JOAkweDAwMDAwMDQwMDAwVUxMCisjZGVmaW5lIE9QX0JCX0VRCTB4MDAwMDAwODAwMDBVTEwKKyNkZWZpbmUgT1BfQkJfREVGQlIJMHgwMDAwMDMwMDAwMFVMTAorI2RlZmluZSBPUF9CQl9BRERSX0xPCTB4MDA3ZmZjMDAwMDBVTEwKKyNkZWZpbmUgT1BfQkJfQUREUl9ISQkweDEwMDAwMDAwMDAwVUxMCisKKyNkZWZpbmUgT1BfQkFMVV9CQVNFCTB4MGU4MDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfQkFfQV9TUkMJMHgwMDAwMDAwMDNmZlVMTAorI2RlZmluZSBPUF9CQV9CX1NSQwkweDAwMDAwMGZmYzAwVUxMCisjZGVmaW5lIE9QX0JBX0RFRkJSCTB4MDAwMDAzMDAwMDBVTEwKKyNkZWZpbmUgT1BfQkFfQUREUl9ISQkweDAwMDdmYzAwMDAwVUxMCisKKyNkZWZpbmUgT1BfSU1NRURfQV9TUkMJMHgwMDAwMDAwMDNmZlVMTAorI2RlZmluZSBPUF9JTU1FRF9CX1NSQwkweDAwMDAwMGZmYzAwVUxMCisjZGVmaW5lIE9QX0lNTUVEX0lNTQkweDAwMDBmZjAwMDAwVUxMCisjZGVmaW5lIE9QX0lNTUVEX1dJRFRICTB4MDAwNjAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfSU1NRURfSU5WCTB4MDAwODAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfSU1NRURfU0hJRlQJMHgwMDYwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9JTU1FRF9CQVNFCTB4MGYwMDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfSU1NRURfV1JfQUIJMHgyMDAwMDAwMDAwMFVMTAorCitlbnVtIGltbWVkX3dpZHRoIHsKKwlJTU1FRF9XSURUSF9BTEwgPSAwLAorCUlNTUVEX1dJRFRIX0JZVEUgPSAxLAorCUlNTUVEX1dJRFRIX1dPUkQgPSAyLAorfTsKKworZW51bSBpbW1lZF9zaGlmdCB7CisJSU1NRURfU0hJRlRfMEIgPSAwLAorCUlNTUVEX1NISUZUXzFCID0gMSwKKwlJTU1FRF9TSElGVF8yQiA9IDIsCit9OworCisjZGVmaW5lIE9QX1NIRl9CQVNFCTB4MDgwMDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfU0hGX0FfU1JDCTB4MDAwMDAwMDAwZmZVTEwKKyNkZWZpbmUgT1BfU0hGX1NDCTB4MDAwMDAwMDAzMDBVTEwKKyNkZWZpbmUgT1BfU0hGX0JfU1JDCTB4MDAwMDAwM2ZjMDBVTEwKKyNkZWZpbmUgT1BfU0hGX0k4CTB4MDAwMDAwNDAwMDBVTEwKKyNkZWZpbmUgT1BfU0hGX1NXCTB4MDAwMDAwODAwMDBVTEwKKyNkZWZpbmUgT1BfU0hGX0RTVAkweDAwMDBmZjAwMDAwVUxMCisjZGVmaW5lIE9QX1NIRl9TSElGVAkweDAwMWYwMDAwMDAwVUxMCisjZGVmaW5lIE9QX1NIRl9PUAkweDAwZTAwMDAwMDAwVUxMCisjZGVmaW5lIE9QX1NIRl9EU1RfQUIJMHgwMTAwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9TSEZfV1JfQUIJMHgyMDAwMDAwMDAwMFVMTAorCitlbnVtIHNoZl9vcCB7CisJU0hGX09QX05PTkUgPSAwLAorCVNIRl9PUF9BTkQgPSAyLAorCVNIRl9PUF9PUiA9IDUsCit9OworCitlbnVtIHNoZl9zYyB7CisJU0hGX1NDX1JfUk9UID0gMCwKKwlTSEZfU0NfUl9TSEYgPSAxLAorCVNIRl9TQ19MX1NIRiA9IDIsCisJU0hGX1NDX1JfRFNIRiA9IDMsCit9OworCisjZGVmaW5lIE9QX0FMVV9BX1NSQwkweDAwMDAwMDAwM2ZmVUxMCisjZGVmaW5lIE9QX0FMVV9CX1NSQwkweDAwMDAwMGZmYzAwVUxMCisjZGVmaW5lIE9QX0FMVV9EU1QJMHgwMDAzZmYwMDAwMFVMTAorI2RlZmluZSBPUF9BTFVfU1cJMHgwMDA0MDAwMDAwMFVMTAorI2RlZmluZSBPUF9BTFVfT1AJMHgwMGY4MDAwMDAwMFVMTAorI2RlZmluZSBPUF9BTFVfRFNUX0FCCTB4MDEwMDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfQUxVX0JBU0UJMHgwYTAwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9BTFVfV1JfQUIJMHgyMDAwMDAwMDAwMFVMTAorCitlbnVtIGFsdV9vcCB7CisJQUxVX09QX05PTkUJPSAweDAwLAorCUFMVV9PUF9BREQJPSAweDAxLAorCUFMVV9PUF9ORUcJPSAweDA0LAorCUFMVV9PUF9BTkQJPSAweDA4LAorCUFMVV9PUF9TVUJfQwk9IDB4MGQsCisJQUxVX09QX0FERF9DCT0gMHgxMSwKKwlBTFVfT1BfT1IJPSAweDE0LAorCUFMVV9PUF9TVUIJPSAweDE1LAorCUFMVV9PUF9YT1IJPSAweDE4LAorfTsKKworZW51bSBhbHVfZHN0X2FiIHsKKwlBTFVfRFNUX0EgPSAwLAorCUFMVV9EU1RfQiA9IDEsCit9OworCisjZGVmaW5lIE9QX0xERl9CQVNFCTB4MGMwMDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfTERGX0FfU1JDCTB4MDAwMDAwMDAwZmZVTEwKKyNkZWZpbmUgT1BfTERGX1NDCTB4MDAwMDAwMDAzMDBVTEwKKyNkZWZpbmUgT1BfTERGX0JfU1JDCTB4MDAwMDAwM2ZjMDBVTEwKKyNkZWZpbmUgT1BfTERGX0k4CTB4MDAwMDAwNDAwMDBVTEwKKyNkZWZpbmUgT1BfTERGX1NXCTB4MDAwMDAwODAwMDBVTEwKKyNkZWZpbmUgT1BfTERGX1pGCTB4MDAwMDAxMDAwMDBVTEwKKyNkZWZpbmUgT1BfTERGX0JNQVNLCTB4MDAwMGYwMDAwMDBVTEwKKyNkZWZpbmUgT1BfTERGX1NIRgkweDAwMWYwMDAwMDAwVUxMCisjZGVmaW5lIE9QX0xERl9XUl9BQgkweDIwMDAwMDAwMDAwVUxMCisKKyNkZWZpbmUgT1BfQ01EX0FfU1JDCSAweDAwMDAwMDAwMGZmVUxMCisjZGVmaW5lIE9QX0NNRF9DVFgJIDB4MDAwMDAwMDAzMDBVTEwKKyNkZWZpbmUgT1BfQ01EX0JfU1JDCSAweDAwMDAwMDNmYzAwVUxMCisjZGVmaW5lIE9QX0NNRF9UT0tFTgkgMHgwMDAwMDBjMDAwMFVMTAorI2RlZmluZSBPUF9DTURfWEZFUgkgMHgwMDAwMWYwMDAwMFVMTAorI2RlZmluZSBPUF9DTURfQ05UCSAweDAwMDBlMDAwMDAwVUxMCisjZGVmaW5lIE9QX0NNRF9TSUcJIDB4MDAwZjAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfQ01EX1RHVF9DTUQJIDB4MDdmMDAwMDAwMDBVTEwKKyNkZWZpbmUgT1BfQ01EX01PREUJMHgxYzAwMDAwMDAwMDBVTEwKKworc3RydWN0IGNtZF90Z3RfYWN0IHsKKwl1OCB0b2tlbjsKKwl1OCB0Z3RfY21kOworfTsKKworZW51bSBjbWRfdGd0X21hcCB7CisJQ01EX1RHVF9SRUFEOCwKKwlDTURfVEdUX1dSSVRFOCwKKwlDTURfVEdUX1JFQURfTEUsCisJQ01EX1RHVF9SRUFEX1NXQVBfTEUsCisJX19DTURfVEdUX01BUF9TSVpFLAorfTsKKworZW51bSBjbWRfbW9kZSB7CisJQ01EX01PREVfNDBiX0FCCT0gMCwKKwlDTURfTU9ERV80MGJfQkEJPSAxLAorCUNNRF9NT0RFXzMyYgk9IDQsCit9OworCitlbnVtIGNtZF9jdHhfc3dhcCB7CisJQ01EX0NUWF9TV0FQID0gMCwKKwlDTURfQ1RYX05PX1NXQVAgPSAzLAorfTsKKworI2RlZmluZSBPUF9MQ1NSX0JBU0UJMHgwZmMwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9MQ1NSX0FfU1JDCTB4MDAwMDAwMDAzZmZVTEwKKyNkZWZpbmUgT1BfTENTUl9CX1NSQwkweDAwMDAwMGZmYzAwVUxMCisjZGVmaW5lIE9QX0xDU1JfV1JJVEUJMHgwMDAwMDIwMDAwMFVMTAorI2RlZmluZSBPUF9MQ1NSX0FERFIJMHgwMDFmZmMwMDAwMFVMTAorCitlbnVtIGxjc3Jfd3Jfc3JjIHsKKwlMQ1NSX1dSX0FSRUcsCisJTENTUl9XUl9CUkVHLAorCUxDU1JfV1JfSU1NLAorfTsKKworI2RlZmluZSBPUF9DQVJCX0JBU0UJMHgwZTAwMDAwMDAwMFVMTAorI2RlZmluZSBPUF9DQVJCX09SCTB4MDAwMDAwMTAwMDBVTEwKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9icGYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldHJvbm9tZS9uZnAvbmZwX2JwZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWE4YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRyb25vbWUvbmZwL25mcF9icGYuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBOZXRyb25vbWUgU3lzdGVtcywgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgTGljZW5zZSBWZXJzaW9uIDIsCisgKiBKdW5lIDE5OTEgYXMgc2hvd24gaW4gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGlzCisgKiBzb3VyY2UgdHJlZSBvciB0aGUgQlNEIDItQ2xhdXNlIExpY2Vuc2UgcHJvdmlkZWQgYmVsb3cuICBZb3UgaGF2ZSB0aGUKKyAqIG9wdGlvbiB0byBsaWNlbnNlIHRoaXMgc29mdHdhcmUgdW5kZXIgdGhlIGNvbXBsZXRlIHRlcm1zIG9mIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIFRoZSBCU0QgMi1DbGF1c2UgTGljZW5zZToKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19ORlBfQlBGX0hfXworI2RlZmluZSBfX05GUF9CUEZfSF9fIDEKKworI2luY2x1ZGUgPGxpbnV4L2JpdGZpZWxkLmg+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+YWNxdWlyZWRbdHlwZV0uY2lkX21hcCk7CiB9CiAKLWludCBxZWRfY3h0X2dldF9jaWRfaW5mbyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSBzdHJ1Y3QgcWVkX2N4dF9pbmZvICpwX2luZm8pCitpbnQgcWVkX2N4dF9nZXRfY2lkX2luZm8oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfY3h0X2luZm8gKnBfaW5mbykKIHsKIAlzdHJ1Y3QgcWVkX2N4dF9tbmdyICpwX21uZ3IgPSBwX2h3Zm4tPnBfY3h0X21uZ3I7CiAJdTMyIGNvbm5fY3h0X3NpemUsIGh3X3Bfc2l6ZSwgY3h0c19wZXJfcCwgbGluZTsKQEAgLTE4NjAsNiArMTg0NSw4IEBACiAJLyogU2V0IHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgQ09SRSBjb25uZWN0aW9ucyAqLwogCXUzMiBjb3JlX2NpZHMgPSAxOyAvKiBTUFEgKi8KIAorCWlmIChwX2h3Zm4tPnVzaW5nX2xsMikKKwkJY29yZV9jaWRzICs9IDQ7CiAJcWVkX2N4dF9zZXRfcHJvdG9fY2lkX2NvdW50KHBfaHdmbiwgUFJPVE9DT0xJRF9DT1JFLCBjb3JlX2NpZHMsIDApOwogCiAJc3dpdGNoIChwX2h3Zm4tPmh3X2luZm8ucGVyc29uYWxpdHkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2N4dC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfY3h0LmgKaW5kZXggYzZmNmYyZS4uMmI4YmRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfY3h0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfY3h0LmgKQEAgLTE3MCw2ICsxNzAsMTMgQEAKICAqLwogdm9pZCBxZWRfY3h0X3JlbGVhc2VfY2lkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJIHUzMiBjaWQpOworaW50IHFlZF9jeHRfZHluYW1pY19pbHRfYWxsb2Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICBlbnVtIHFlZF9jeHRfZWxlbV90eXBlIGVsZW1fdHlwZSwgdTMyIGlpZCk7Cit1MzIgcWVkX2N4dF9nZXRfcHJvdG9fdGlkX2NvdW50KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCWVudW0gcHJvdG9jb2xfdHlwZSB0eXBlKTsKK3UzMiBxZWRfY3h0X2dldF9wcm90b19jaWRfc3RhcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJZW51bSBwcm90b2NvbF90eXBlIHR5cGUpOworaW50IHFlZF9jeHRfZnJlZV9wcm90b19pbHQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIGVudW0gcHJvdG9jb2xfdHlwZSBwcm90byk7CiAKICNkZWZpbmUgUUVEX0NUWF9XT1JLSU5HX01FTSAwCiAjZGVmaW5lIFFFRF9DVFhfRkxfTUVNIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2RjYnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2RjYnguYwppbmRleCAyMjZjYjA4Li4xMzBkYTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kY2J4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGNieC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAicWVkX2RjYnguaCIKICNpbmNsdWRlICJxZWRfaHNpLmgiCiAjaW5jbHVkZSAicWVkX3NwLmgiCisjaW5jbHVkZSAicWVkX3NyaW92LmgiCiAjaWZkZWYgQ09ORklHX0RDQgogI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRfZXRoX2lmLmg+CiAjZW5kaWYKQEAgLTg3NCwxMSArODc1LDggQEAKIAlpbnQgcmMgPSAwOwogCiAJcF9od2ZuLT5wX2RjYnhfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpwX2h3Zm4tPnBfZGNieF9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwX2h3Zm4tPnBfZGNieF9pbmZvKSB7Ci0JCURQX05PVElDRShwX2h3Zm4sCi0JCQkgICJGYWlsZWQgdG8gYWxsb2NhdGUgJ3N0cnVjdCBxZWRfZGNieF9pbmZvJ1xuIik7CisJaWYgKCFwX2h3Zm4tPnBfZGNieF9pbmZvKQogCQlyYyA9IC1FTk9NRU07Ci0JfQogCiAJcmV0dXJuIHJjOwogfQpAQCAtOTQ1LDYgKzk0Myw5IEBACiAJc3RydWN0IHFlZF9wdHQgKnBfcHR0OwogCWludCByYzsKIAorCWlmIChJU19WRihwX2h3Zm4tPmNkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXBfcHR0ID0gcWVkX3B0dF9hY3F1aXJlKHBfaHdmbik7CiAJaWYgKCFwX3B0dCkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTk4NCw2ICs5ODUsNyBAQAogCQlpZiAocF9wYXJhbXMtPnBmYy5wcmlvW2ldKQogCQkJcGZjX21hcCB8PSBCSVQoaSk7CiAKKwkqcGZjICY9IH5EQ0JYX1BGQ19QUklfRU5fQklUTUFQX01BU0s7CiAJKnBmYyB8PSAocGZjX21hcCA8PCBEQ0JYX1BGQ19QUklfRU5fQklUTUFQX1NISUZUKTsKIAogCURQX1ZFUkJPU0UocF9od2ZuLCBRRURfTVNHX0RDQiwgInBmYyA9IDB4JXhcbiIsICpwZmMpOwpAQCAtMTA1OCwyNCArMTA2MCwzMyBAQAogCiAJZm9yIChpID0gMDsgaSA8IERDQlhfTUFYX0FQUF9QUk9UT0NPTDsgaSsrKSB7CiAJCWVudHJ5ID0gJnBfYXBwLT5hcHBfcHJpX3RibFtpXS5lbnRyeTsKKwkJKmVudHJ5ID0gMDsKIAkJaWYgKGllZWUpIHsKLQkJCSplbnRyeSAmPSB+RENCWF9BUFBfU0ZfSUVFRV9NQVNLOworCQkJKmVudHJ5ICY9IH4oRENCWF9BUFBfU0ZfSUVFRV9NQVNLIHwgRENCWF9BUFBfU0ZfTUFTSyk7CiAJCQlzd2l0Y2ggKHBfcGFyYW1zLT5hcHBfZW50cnlbaV0uc2ZfaWVlZSkgewogCQkJY2FzZSBRRURfRENCWF9TRl9JRUVFX0VUSFRZUEU6CiAJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX0lFRUVfRVRIVFlQRSA8PAogCQkJCQkgICBEQ0JYX0FQUF9TRl9JRUVFX1NISUZUKTsKKwkJCQkqZW50cnkgfD0gKCh1MzIpRENCWF9BUFBfU0ZfRVRIVFlQRSA8PAorCQkJCQkgICBEQ0JYX0FQUF9TRl9TSElGVCk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFFFRF9EQ0JYX1NGX0lFRUVfVENQX1BPUlQ6CiAJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX0lFRUVfVENQX1BPUlQgPDwKIAkJCQkJICAgRENCWF9BUFBfU0ZfSUVFRV9TSElGVCk7CisJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX1BPUlQgPDwKKwkJCQkJICAgRENCWF9BUFBfU0ZfU0hJRlQpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBRRURfRENCWF9TRl9JRUVFX1VEUF9QT1JUOgogCQkJCSplbnRyeSB8PSAoKHUzMilEQ0JYX0FQUF9TRl9JRUVFX1VEUF9QT1JUIDw8CiAJCQkJCSAgIERDQlhfQVBQX1NGX0lFRUVfU0hJRlQpOworCQkJCSplbnRyeSB8PSAoKHUzMilEQ0JYX0FQUF9TRl9QT1JUIDw8CisJCQkJCSAgIERDQlhfQVBQX1NGX1NISUZUKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgUUVEX0RDQlhfU0ZfSUVFRV9UQ1BfVURQX1BPUlQ6CiAJCQkJKmVudHJ5IHw9ICgodTMyKURDQlhfQVBQX1NGX0lFRUVfVENQX1VEUF9QT1JUIDw8CiAJCQkJCSAgIERDQlhfQVBQX1NGX0lFRUVfU0hJRlQpOworCQkJCSplbnRyeSB8PSAoKHUzMilEQ0JYX0FQUF9TRl9QT1JUIDw8CisJCQkJCSAgIERDQlhfQVBQX1NGX1NISUZUKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTExNzUsMTEgKzExODYsOSBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlkY2J4X2luZm8gPSBrbWFsbG9jKHNpemVvZigqZGNieF9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkY2J4X2luZm8pIHsKLQkJRFBfRVJSKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzdHJ1Y3QgcWVkX2RjYnhfaW5mb1xuIik7CisJZGNieF9pbmZvID0ga3phbGxvYyhzaXplb2YoKmRjYnhfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghZGNieF9pbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlyYyA9IHFlZF9kY2J4X3F1ZXJ5X3BhcmFtcyhwX2h3Zm4sIGRjYnhfaW5mbywgUUVEX0RDQlhfT1BFUkFUSU9OQUxfTUlCKTsKIAlpZiAocmMpIHsKQEAgLTEyMTIsMTEgKzEyMjEsOSBAQAogewogCXN0cnVjdCBxZWRfZGNieF9nZXQgKmRjYnhfaW5mbzsKIAotCWRjYnhfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpkY2J4X2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRjYnhfaW5mbykgewotCQlEUF9FUlIoaHdmbi0+Y2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRjYnhfaW5mb1xuIik7CisJZGNieF9pbmZvID0ga3phbGxvYyhzaXplb2YoKmRjYnhfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghZGNieF9pbmZvKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlpZiAocWVkX2RjYnhfcXVlcnlfcGFyYW1zKGh3Zm4sIGRjYnhfaW5mbywgdHlwZSkpIHsKIAkJa2ZyZWUoZGNieF9pbmZvKTsKQEAgLTE5NjgsNiArMTk3NSw3IEBACiAKIAlpZiAoIWRjYnhfaW5mby0+b3BlcmF0aW9uYWwuaWVlZSkgewogCQlEUF9JTkZPKGh3Zm4sICJEQ0JYIGlzIG5vdCBlbmFibGVkL29wZXJhdGlvbmFsIGluIElFRUUgbW9kZVxuIik7CisJCWtmcmVlKGRjYnhfaW5mbyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjEzNiwxNyArMjE0NCwxOSBAQAogCXJldHVybiByYzsKIH0KIAotaW50IHFlZF9kY2JubF9pZWVlX3BlZXJfZ2V0ZXRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgaWVlZV9ldHMgKmV0cykKK3N0YXRpYyBpbnQKK3FlZF9kY2JubF9pZWVlX3BlZXJfZ2V0ZXRzKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgaWVlZV9ldHMgKmV0cykKIHsKIAlyZXR1cm4gcWVkX2RjYm5sX2dldF9pZWVlX2V0cyhjZGV2LCBldHMsIHRydWUpOwogfQogCi1pbnQgcWVkX2RjYm5sX2llZWVfcGVlcl9nZXRwZmMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBpZWVlX3BmYyAqcGZjKQorc3RhdGljIGludAorcWVkX2RjYm5sX2llZWVfcGVlcl9nZXRwZmMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBpZWVlX3BmYyAqcGZjKQogewogCXJldHVybiBxZWRfZGNibmxfZ2V0X2llZWVfcGZjKGNkZXYsIHBmYywgdHJ1ZSk7CiB9CiAKLWludCBxZWRfZGNibmxfaWVlZV9nZXRhcHAoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBkY2JfYXBwICphcHApCitzdGF0aWMgaW50IHFlZF9kY2JubF9pZWVlX2dldGFwcChzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IGRjYl9hcHAgKmFwcCkKIHsKIAlzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4gPSBRRURfTEVBRElOR19IV0ZOKGNkZXYpOwogCXN0cnVjdCBxZWRfZGNieF9nZXQgKmRjYnhfaW5mbzsKQEAgLTIxOTAsNyArMjIwMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBxZWRfZGNibmxfaWVlZV9zZXRhcHAoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBkY2JfYXBwICphcHApCitzdGF0aWMgaW50IHFlZF9kY2JubF9pZWVlX3NldGFwcChzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IGRjYl9hcHAgKmFwcCkKIHsKIAlzdHJ1Y3QgcWVkX2h3Zm4gKmh3Zm4gPSBRRURfTEVBRElOR19IV0ZOKGNkZXYpOwogCXN0cnVjdCBxZWRfZGNieF9nZXQgKmRjYnhfaW5mbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2RlYnVnLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTdkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZWJ1Zy5jCkBAIC0wLDAgKzEsNjg5OCBAQAorLyogUUxvZ2ljIHFlZCBOSUMgRHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZgorICogdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSAicWVkLmgiCisjaW5jbHVkZSAicWVkX2hzaS5oIgorI2luY2x1ZGUgInFlZF9ody5oIgorI2luY2x1ZGUgInFlZF9tY3AuaCIKKyNpbmNsdWRlICJxZWRfcmVnX2FkZHIuaCIKKworLyogQ2hpcCBJRHMgZW51bSAqLworZW51bSBjaGlwX2lkcyB7CisJQ0hJUF9SRVNFUlZFRCwKKwlDSElQX0JCX0IwLAorCUNISVBfSzIsCisJTUFYX0NISVBfSURTCit9OworCisvKiBNZW1vcnkgZ3JvdXBzIGVudW0gKi8KK2VudW0gbWVtX2dyb3VwcyB7CisJTUVNX0dST1VQX1BYUF9NRU0sCisJTUVNX0dST1VQX0RNQUVfTUVNLAorCU1FTV9HUk9VUF9DTV9NRU0sCisJTUVNX0dST1VQX1FNX01FTSwKKwlNRU1fR1JPVVBfVE1fTUVNLAorCU1FTV9HUk9VUF9CUkJfUkFNLAorCU1FTV9HUk9VUF9CUkJfTUVNLAorCU1FTV9HUk9VUF9QUlNfTUVNLAorCU1FTV9HUk9VUF9TRE1fTUVNLAorCU1FTV9HUk9VUF9QQlVGLAorCU1FTV9HUk9VUF9JT1IsCisJTUVNX0dST1VQX1JBTSwKKwlNRU1fR1JPVVBfQlRCX1JBTSwKKwlNRU1fR1JPVVBfUkRJRl9DVFgsCisJTUVNX0dST1VQX1RESUZfQ1RYLAorCU1FTV9HUk9VUF9DT05OX0NGQ19NRU0sCisJTUVNX0dST1VQX1RBU0tfQ0ZDX01FTSwKKwlNRU1fR1JPVVBfQ0FVX1BJLAorCU1FTV9HUk9VUF9DQVVfTUVNLAorCU1FTV9HUk9VUF9QWFBfSUxULAorCU1FTV9HUk9VUF9NVUxEX01FTSwKKwlNRU1fR1JPVVBfQlRCX01FTSwKKwlNRU1fR1JPVVBfSUdVX01FTSwKKwlNRU1fR1JPVVBfSUdVX01TSVgsCisJTUVNX0dST1VQX0NBVV9TQiwKKwlNRU1fR1JPVVBfQk1CX1JBTSwKKwlNRU1fR1JPVVBfQk1CX01FTSwKKwlNRU1fR1JPVVBTX05VTQorfTsKKworLyogTWVtb3J5IGdyb3VwcyBuYW1lcyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzX21lbV9ncm91cF9uYW1lc1tdID0geworCSJQWFBfTUVNIiwKKwkiRE1BRV9NRU0iLAorCSJDTV9NRU0iLAorCSJRTV9NRU0iLAorCSJUTV9NRU0iLAorCSJCUkJfUkFNIiwKKwkiQlJCX01FTSIsCisJIlBSU19NRU0iLAorCSJTRE1fTUVNIiwKKwkiUEJVRiIsCisJIklPUiIsCisJIlJBTSIsCisJIkJUQl9SQU0iLAorCSJSRElGX0NUWCIsCisJIlRESUZfQ1RYIiwKKwkiQ09OTl9DRkNfTUVNIiwKKwkiVEFTS19DRkNfTUVNIiwKKwkiQ0FVX1BJIiwKKwkiQ0FVX01FTSIsCisJIlBYUF9JTFQiLAorCSJNVUxEX01FTSIsCisJIkJUQl9NRU0iLAorCSJJR1VfTUVNIiwKKwkiSUdVX01TSVgiLAorCSJDQVVfU0IiLAorCSJCTUJfUkFNIiwKKwkiQk1CX01FTSIsCit9OworCisvKiBJZGxlIGNoZWNrIGNvbmRpdGlvbnMgKi8KK3N0YXRpYyB1MzIgY29uZDQoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gKChyWzBdICYgaW1tWzBdKSAhPSBpbW1bMV0pICYmICgoclsxXSAmIGltbVsyXSkgIT0gaW1tWzNdKTsKK30KKworc3RhdGljIHUzMiBjb25kNihjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiAoKHJbMF0gPj4gaW1tWzBdKSAmIGltbVsxXSkgIT0gaW1tWzJdOworfQorCitzdGF0aWMgdTMyIGNvbmQ1KGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuIChyWzBdICYgaW1tWzBdKSAhPSBpbW1bMV07Cit9CisKK3N0YXRpYyB1MzIgY29uZDgoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gKChyWzBdICYgaW1tWzBdKSA+PiBpbW1bMV0pICE9CisJICAgICgoKHJbMF0gJiBpbW1bMl0pID4+IGltbVszXSkgfCAoKHJbMV0gJiBpbW1bNF0pIDw8IGltbVs1XSkpOworfQorCitzdGF0aWMgdTMyIGNvbmQ5KGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuICgoclswXSAmIGltbVswXSkgPj4gaW1tWzFdKSAhPSAoclswXSAmIGltbVsyXSk7Cit9CisKK3N0YXRpYyB1MzIgY29uZDEoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gKHJbMF0gJiB+aW1tWzBdKSAhPSBpbW1bMV07Cit9CisKK3N0YXRpYyB1MzIgY29uZDAoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gclswXSAhPSBpbW1bMF07Cit9CisKK3N0YXRpYyB1MzIgY29uZDEwKGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuIHJbMF0gIT0gclsxXSAmJiByWzJdID09IGltbVswXTsKK30KKworc3RhdGljIHUzMiBjb25kMTEoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gclswXSAhPSByWzFdICYmIHJbMl0gPiBpbW1bMF07Cit9CisKK3N0YXRpYyB1MzIgY29uZDMoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gclswXSAhPSByWzFdOworfQorCitzdGF0aWMgdTMyIGNvbmQxMihjb25zdCB1MzIgKnIsIGNvbnN0IHUzMiAqaW1tKQoreworCXJldHVybiByWzBdICYgaW1tWzBdOworfQorCitzdGF0aWMgdTMyIGNvbmQ3KGNvbnN0IHUzMiAqciwgY29uc3QgdTMyICppbW0pCit7CisJcmV0dXJuIHJbMF0gPCAoclsxXSAtIGltbVswXSk7Cit9CisKK3N0YXRpYyB1MzIgY29uZDIoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkKK3sKKwlyZXR1cm4gclswXSA+IGltbVswXTsKK30KKworLyogQXJyYXkgb2YgSWRsZSBDaGVjayBjb25kaXRpb25zICovCitzdGF0aWMgdTMyKCpjb25kX2FycltdKSAoY29uc3QgdTMyICpyLCBjb25zdCB1MzIgKmltbSkgPSB7CisJY29uZDAsCisJY29uZDEsCisJY29uZDIsCisJY29uZDMsCisJY29uZDQsCisJY29uZDUsCisJY29uZDYsCisJY29uZDcsCisJY29uZDgsCisJY29uZDksCisJY29uZDEwLAorCWNvbmQxMSwKKwljb25kMTIsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEYXRhIFR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2VudW0gcGxhdGZvcm1faWRzIHsKKwlQTEFURk9STV9BU0lDLAorCVBMQVRGT1JNX1JFU0VSVkVELAorCVBMQVRGT1JNX1JFU0VSVkVEMiwKKwlQTEFURk9STV9SRVNFUlZFRDMsCisJTUFYX1BMQVRGT1JNX0lEUworfTsKKworc3RydWN0IGRiZ19hcnJheSB7CisJY29uc3QgdTMyICpwdHI7CisJdTMyIHNpemVfaW5fZHdvcmRzOworfTsKKworLyogQ2hpcCBjb25zdGFudCBkZWZpbml0aW9ucyAqLworc3RydWN0IGNoaXBfZGVmcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgeworCQl1OCBudW1fcG9ydHM7CisJCXU4IG51bV9wZnM7CisJfSBwZXJfcGxhdGZvcm1bTUFYX1BMQVRGT1JNX0lEU107Cit9OworCisvKiBQbGF0Zm9ybSBjb25zdGFudCBkZWZpbml0aW9ucyAqLworc3RydWN0IHBsYXRmb3JtX2RlZnMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdTMyIGRlbGF5X2ZhY3RvcjsKK307CisKKy8qIFN0b3JtIGNvbnN0YW50IGRlZmluaXRpb25zICovCitzdHJ1Y3Qgc3Rvcm1fZGVmcyB7CisJY2hhciBsZXR0ZXI7CisJZW51bSBibG9ja19pZCBibG9ja19pZDsKKwllbnVtIGRiZ19idXNfY2xpZW50cyBkYmdfY2xpZW50X2lkW01BWF9DSElQX0lEU107CisJYm9vbCBoYXNfdmZjOworCXUzMiBzZW1fZmFzdF9tZW1fYWRkcjsKKwl1MzIgc2VtX2ZyYW1lX21vZGVfYWRkcjsKKwl1MzIgc2VtX3Nsb3dfZW5hYmxlX2FkZHI7CisJdTMyIHNlbV9zbG93X21vZGVfYWRkcjsKKwl1MzIgc2VtX3Nsb3dfbW9kZTFfY29uZl9hZGRyOworCXUzMiBzZW1fc3luY19kYmdfZW1wdHlfYWRkcjsKKwl1MzIgc2VtX3Nsb3dfZGJnX2VtcHR5X2FkZHI7CisJdTMyIGNtX2N0eF93cl9hZGRyOworCXUzMiBjbV9jb25uX2FnX2N0eF9saWRfc2l6ZTsgLyogSW4gcXVhZC1yZWdzICovCisJdTMyIGNtX2Nvbm5fYWdfY3R4X3JkX2FkZHI7CisJdTMyIGNtX2Nvbm5fc3RfY3R4X2xpZF9zaXplOyAvKiBJbiBxdWFkLXJlZ3MgKi8KKwl1MzIgY21fY29ubl9zdF9jdHhfcmRfYWRkcjsKKwl1MzIgY21fdGFza19hZ19jdHhfbGlkX3NpemU7IC8qIEluIHF1YWQtcmVncyAqLworCXUzMiBjbV90YXNrX2FnX2N0eF9yZF9hZGRyOworCXUzMiBjbV90YXNrX3N0X2N0eF9saWRfc2l6ZTsgLyogSW4gcXVhZC1yZWdzICovCisJdTMyIGNtX3Rhc2tfc3RfY3R4X3JkX2FkZHI7Cit9OworCisvKiBCbG9jayBjb25zdGFudCBkZWZpbml0aW9ucyAqLworc3RydWN0IGJsb2NrX2RlZnMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJYm9vbCBoYXNfZGJnX2J1c1tNQVhfQ0hJUF9JRFNdOworCWJvb2wgYXNzb2NpYXRlZF90b19zdG9ybTsKKwl1MzIgc3Rvcm1faWQ7IC8qIFZhbGlkIG9ubHkgaWYgYXNzb2NpYXRlZF90b19zdG9ybSBpcyB0cnVlICovCisJZW51bSBkYmdfYnVzX2NsaWVudHMgZGJnX2NsaWVudF9pZFtNQVhfQ0hJUF9JRFNdOworCXUzMiBkYmdfc2VsZWN0X2FkZHI7CisJdTMyIGRiZ19jeWNsZV9lbmFibGVfYWRkcjsKKwl1MzIgZGJnX3NoaWZ0X2FkZHI7CisJdTMyIGRiZ19mb3JjZV92YWxpZF9hZGRyOworCXUzMiBkYmdfZm9yY2VfZnJhbWVfYWRkcjsKKwlib29sIGhhc19yZXNldF9iaXQ7CisJYm9vbCB1bnJlc2V0OyAvKiBJZiB0cnVlLCB0aGUgYmxvY2sgaXMgdGFrZW4gb3V0IG9mIHJlc2V0IGJlZm9yZSBkdW1wICovCisJZW51bSBkYmdfcmVzZXRfcmVncyByZXNldF9yZWc7CisJdTggcmVzZXRfYml0X29mZnNldDsgLyogQml0IG9mZnNldCBpbiByZXNldCByZWdpc3RlciAqLworfTsKKworLyogUmVzZXQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KK3N0cnVjdCByZXNldF9yZWdfZGVmcyB7CisJdTMyIGFkZHI7CisJdTMyIHVucmVzZXRfdmFsOworCWJvb2wgZXhpc3RzW01BWF9DSElQX0lEU107Cit9OworCitzdHJ1Y3QgZ3JjX3BhcmFtX2RlZnMgeworCXUzMiBkZWZhdWx0X3ZhbFtNQVhfQ0hJUF9JRFNdOworCXUzMiBtaW47CisJdTMyIG1heDsKKwlib29sIGlzX3ByZXNldDsKKwl1MzIgZXhjbHVkZV9hbGxfcHJlc2V0X3ZhbDsKKwl1MzIgY3Jhc2hfcHJlc2V0X3ZhbDsKK307CisKK3N0cnVjdCByc3NfbWVtX2RlZnMgeworCWNvbnN0IGNoYXIgKm1lbV9uYW1lOworCWNvbnN0IGNoYXIgKnR5cGVfbmFtZTsKKwl1MzIgYWRkcjsgLyogSW4gMTI4YiB1bml0cyAqLworCXUzMiBudW1fZW50cmllc1tNQVhfQ0hJUF9JRFNdOworCXUzMiBlbnRyeV93aWR0aFtNQVhfQ0hJUF9JRFNdOyAvKiBJbiBiaXRzICovCit9OworCitzdHJ1Y3QgdmZjX3JhbV9kZWZzIHsKKwljb25zdCBjaGFyICptZW1fbmFtZTsKKwljb25zdCBjaGFyICp0eXBlX25hbWU7CisJdTMyIGJhc2Vfcm93OworCXUzMiBudW1fcm93czsKK307CisKK3N0cnVjdCBiaWdfcmFtX2RlZnMgeworCWNvbnN0IGNoYXIgKmluc3RhbmNlX25hbWU7CisJZW51bSBtZW1fZ3JvdXBzIG1lbV9ncm91cF9pZDsKKwllbnVtIG1lbV9ncm91cHMgcmFtX21lbV9ncm91cF9pZDsKKwllbnVtIGRiZ19ncmNfcGFyYW1zIGdyY19wYXJhbTsKKwl1MzIgYWRkcl9yZWdfYWRkcjsKKwl1MzIgZGF0YV9yZWdfYWRkcjsKKwl1MzIgbnVtX29mX2Jsb2Nrc1tNQVhfQ0hJUF9JRFNdOworfTsKKworc3RydWN0IHBoeV9kZWZzIHsKKwljb25zdCBjaGFyICpwaHlfbmFtZTsKKwl1MzIgYmFzZV9hZGRyOworCXUzMiB0YnVzX2FkZHJfbG9fYWRkcjsKKwl1MzIgdGJ1c19hZGRyX2hpX2FkZHI7CisJdTMyIHRidXNfZGF0YV9sb19hZGRyOworCXUzMiB0YnVzX2RhdGFfaGlfYWRkcjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDb25zdGFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBNQVhfTENJRFMJCQkzMjAKKyNkZWZpbmUgTUFYX0xUSURTCQkJMzIwCisjZGVmaW5lIE5VTV9JT1JfU0VUUwkJCTIKKyNkZWZpbmUgSU9SU19QRVJfU0VUCQkJMTc2CisjZGVmaW5lIElPUl9TRVRfT0ZGU0VUKHNldF9pZCkJCSgoc2V0X2lkKSAqIDI1NikKKyNkZWZpbmUgQllURVNfSU5fRFdPUkQJCQlzaXplb2YodTMyKQorCisvKiBJbiB0aGUgbWFjcm9zIGJlbG93LCBzaXplIGFuZCBvZmZzZXQgYXJlIHNwZWNpZmllZCBpbiBiaXRzICovCisjZGVmaW5lIENFSUxfRFdPUkRTKHNpemUpCQlESVZfUk9VTkRfVVAoc2l6ZSwgMzIpCisjZGVmaW5lIEZJRUxEX0JJVF9PRkZTRVQodHlwZSwgZmllbGQpCXR5cGUgIyMgXyAjIyBmaWVsZCAjIyBfICMjIE9GRlNFVAorI2RlZmluZSBGSUVMRF9CSVRfU0laRSh0eXBlLCBmaWVsZCkJdHlwZSAjIyBfICMjIGZpZWxkICMjIF8gIyMgU0laRQorI2RlZmluZSBGSUVMRF9EV09SRF9PRkZTRVQodHlwZSwgZmllbGQpIFwKKwkgKGludCkoRklFTERfQklUX09GRlNFVCh0eXBlLCBmaWVsZCkgLyAzMikKKyNkZWZpbmUgRklFTERfRFdPUkRfU0hJRlQodHlwZSwgZmllbGQpCShGSUVMRF9CSVRfT0ZGU0VUKHR5cGUsIGZpZWxkKSAlIDMyKQorI2RlZmluZSBGSUVMRF9CSVRfTUFTSyh0eXBlLCBmaWVsZCkgXAorCSgoKDEgPDwgRklFTERfQklUX1NJWkUodHlwZSwgZmllbGQpKSAtIDEpIDw8IFwKKwkgRklFTERfRFdPUkRfU0hJRlQodHlwZSwgZmllbGQpKQorI2RlZmluZSBTRVRfVkFSX0ZJRUxEKHZhciwgdHlwZSwgZmllbGQsIHZhbCkgXAorCWRvIHsgXAorCQl2YXJbRklFTERfRFdPUkRfT0ZGU0VUKHR5cGUsIGZpZWxkKV0gJj0JXAorCQkofkZJRUxEX0JJVF9NQVNLKHR5cGUsIGZpZWxkKSk7CVwKKwkJdmFyW0ZJRUxEX0RXT1JEX09GRlNFVCh0eXBlLCBmaWVsZCldIHw9IFwKKwkJKHZhbCkgPDwgRklFTERfRFdPUkRfU0hJRlQodHlwZSwgZmllbGQpOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgQVJSX1JFR19XUihkZXYsIHB0dCwgYWRkciwgYXJyLCBhcnJfc2l6ZSkgXAorCWRvIHsgXAorCQlmb3IgKGkgPSAwOyBpIDwgKGFycl9zaXplKTsgaSsrKSBcCisJCQlxZWRfd3IoZGV2LCBwdHQsIGFkZHIsCShhcnIpW2ldKTsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEFSUl9SRUdfUkQoZGV2LCBwdHQsIGFkZHIsIGFyciwgYXJyX3NpemUpIFwKKwlkbyB7IFwKKwkJZm9yIChpID0gMDsgaSA8IChhcnJfc2l6ZSk7IGkrKykgXAorCQkJKGFycilbaV0gPSBxZWRfcmQoZGV2LCBwdHQsIGFkZHIpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBEV09SRFNfVE9fQllURVMoZHdvcmRzKQkJKChkd29yZHMpICogQllURVNfSU5fRFdPUkQpCisjZGVmaW5lIEJZVEVTX1RPX0RXT1JEUyhieXRlcykJCSgoYnl0ZXMpIC8gQllURVNfSU5fRFdPUkQpCisjZGVmaW5lIFJBTV9MSU5FU19UT19EV09SRFMobGluZXMpCSgobGluZXMpICogMikKKyNkZWZpbmUgUkFNX0xJTkVTX1RPX0JZVEVTKGxpbmVzKSBcCisJRFdPUkRTX1RPX0JZVEVTKFJBTV9MSU5FU19UT19EV09SRFMobGluZXMpKQorI2RlZmluZSBSRUdfRFVNUF9MRU5fU0hJRlQJCTI0CisjZGVmaW5lIE1FTV9EVU1QX0VOVFJZX1NJWkVfRFdPUkRTIFwKKwlCWVRFU19UT19EV09SRFMoc2l6ZW9mKHN0cnVjdCBkYmdfZHVtcF9tZW0pKQorI2RlZmluZSBJRExFX0NIS19SVUxFX1NJWkVfRFdPUkRTIFwKKwlCWVRFU19UT19EV09SRFMoc2l6ZW9mKHN0cnVjdCBkYmdfaWRsZV9jaGtfcnVsZSkpCisjZGVmaW5lIElETEVfQ0hLX1JFU1VMVF9IRFJfRFdPUkRTIFwKKwlCWVRFU19UT19EV09SRFMoc2l6ZW9mKHN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X2hkcikpCisjZGVmaW5lIElETEVfQ0hLX1JFU1VMVF9SRUdfSERSX0RXT1JEUyBcCisJQllURVNfVE9fRFdPUkRTKHNpemVvZihzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9yZWdfaGRyKSkKKyNkZWZpbmUgSURMRV9DSEtfTUFYX0VOVFJJRVNfU0laRQkzMgorCisvKiBUaGUgc2l6ZXMgYW5kIG9mZnNldHMgYmVsb3cgYXJlIHNwZWNpZmllZCBpbiBiaXRzICovCisjZGVmaW5lIFZGQ19DQU1fQ01EX1NUUlVDVF9TSVpFCQk2NAorI2RlZmluZSBWRkNfQ0FNX0NNRF9ST1dfT0ZGU0VUCQk0OAorI2RlZmluZSBWRkNfQ0FNX0NNRF9ST1dfU0laRQkJOQorI2RlZmluZSBWRkNfQ0FNX0FERFJfU1RSVUNUX1NJWkUJMTYKKyNkZWZpbmUgVkZDX0NBTV9BRERSX09QX09GRlNFVAkJMAorI2RlZmluZSBWRkNfQ0FNX0FERFJfT1BfU0laRQkJNAorI2RlZmluZSBWRkNfQ0FNX1JFU1BfU1RSVUNUX1NJWkUJMjU2CisjZGVmaW5lIFZGQ19SQU1fQUREUl9TVFJVQ1RfU0laRQkxNgorI2RlZmluZSBWRkNfUkFNX0FERFJfT1BfT0ZGU0VUCQkwCisjZGVmaW5lIFZGQ19SQU1fQUREUl9PUF9TSVpFCQkyCisjZGVmaW5lIFZGQ19SQU1fQUREUl9ST1dfT0ZGU0VUCQkyCisjZGVmaW5lIFZGQ19SQU1fQUREUl9ST1dfU0laRQkJMTAKKyNkZWZpbmUgVkZDX1JBTV9SRVNQX1NUUlVDVF9TSVpFCTI1NgorI2RlZmluZSBWRkNfQ0FNX0NNRF9EV09SRFMJCUNFSUxfRFdPUkRTKFZGQ19DQU1fQ01EX1NUUlVDVF9TSVpFKQorI2RlZmluZSBWRkNfQ0FNX0FERFJfRFdPUkRTCQlDRUlMX0RXT1JEUyhWRkNfQ0FNX0FERFJfU1RSVUNUX1NJWkUpCisjZGVmaW5lIFZGQ19DQU1fUkVTUF9EV09SRFMJCUNFSUxfRFdPUkRTKFZGQ19DQU1fUkVTUF9TVFJVQ1RfU0laRSkKKyNkZWZpbmUgVkZDX1JBTV9DTURfRFdPUkRTCQlWRkNfQ0FNX0NNRF9EV09SRFMKKyNkZWZpbmUgVkZDX1JBTV9BRERSX0RXT1JEUwkJQ0VJTF9EV09SRFMoVkZDX1JBTV9BRERSX1NUUlVDVF9TSVpFKQorI2RlZmluZSBWRkNfUkFNX1JFU1BfRFdPUkRTCQlDRUlMX0RXT1JEUyhWRkNfUkFNX1JFU1BfU1RSVUNUX1NJWkUpCisjZGVmaW5lIE5VTV9WRkNfUkFNX1RZUEVTCQk0CisjZGVmaW5lIFZGQ19DQU1fTlVNX1JPV1MJCTUxMgorI2RlZmluZSBWRkNfT1BDT0RFX0NBTV9SRAkJMTQKKyNkZWZpbmUgVkZDX09QQ09ERV9SQU1fUkQJCTAKKyNkZWZpbmUgTlVNX1JTU19NRU1fVFlQRVMJCTUKKyNkZWZpbmUgTlVNX0JJR19SQU1fVFlQRVMJCTMKKyNkZWZpbmUgQklHX1JBTV9CTE9DS19TSVpFX0JZVEVTCTEyOAorI2RlZmluZSBCSUdfUkFNX0JMT0NLX1NJWkVfRFdPUkRTIFwKKwlCWVRFU19UT19EV09SRFMoQklHX1JBTV9CTE9DS19TSVpFX0JZVEVTKQorI2RlZmluZSBOVU1fUEhZX1RCVVNfQUREUkVTU0VTCQkyMDQ4CisjZGVmaW5lIFBIWV9EVU1QX1NJWkVfRFdPUkRTCQkoTlVNX1BIWV9UQlVTX0FERFJFU1NFUyAvIDIpCisjZGVmaW5lIFJFU0VUX1JFR19VTlJFU0VUX09GRlNFVAk0CisjZGVmaW5lIFNUQUxMX0RFTEFZX01TCQkJNTAwCisjZGVmaW5lIFNUQVRJQ19ERUJVR19MSU5FX0RXT1JEUwk5CisjZGVmaW5lIE5VTV9EQkdfQlVTX0xJTkVTCQkyNTYKKyNkZWZpbmUgTlVNX0NPTU1PTl9HTE9CQUxfUEFSQU1TCTgKKyNkZWZpbmUgRldfSU1HX01BSU4JCQkxCisjZGVmaW5lIFJFR19GSUZPX0RFUFRIX0VMRU1FTlRTCQkzMgorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX0RXT1JEUwkJMgorI2RlZmluZSBSRUdfRklGT19ERVBUSF9EV09SRFMgXAorCShSRUdfRklGT19FTEVNRU5UX0RXT1JEUyAqIFJFR19GSUZPX0RFUFRIX0VMRU1FTlRTKQorI2RlZmluZSBJR1VfRklGT19ERVBUSF9FTEVNRU5UUwkJNjQKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRFMJCTQKKyNkZWZpbmUgSUdVX0ZJRk9fREVQVEhfRFdPUkRTIFwKKwkoSUdVX0ZJRk9fRUxFTUVOVF9EV09SRFMgKiBJR1VfRklGT19ERVBUSF9FTEVNRU5UUykKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9ERVBUSF9FTEVNRU5UUwkyMAorI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfRFdPUkRTCTIKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9ERVBUSF9EV09SRFMgXAorCShQUk9URUNUSU9OX09WRVJSSURFX0RFUFRIX0VMRU1FTlRTICogXAorCSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfRFdPUkRTKQorI2RlZmluZSBNQ1BfU1BBRF9UUkFDRV9PRkZTSVpFX0FERFIgXAorCShNQ1BfUkVHX1NDUkFUQ0ggKyBcCisJIG9mZnNldG9mKHN0cnVjdCBzdGF0aWNfaW5pdCwgc2VjdGlvbnNbU1BBRF9TRUNUSU9OX1RSQUNFXSkpCisjZGVmaW5lIE1DUF9UUkFDRV9NRVRBX0lNQUdFX1NJR05BVFVSRSAgMHg2Njk5NTVhYQorI2RlZmluZSBFTVBUWV9GV19WRVJTSU9OX1NUUgkJIj8/P18/Pz9fPz8/Xz8/PyIKKyNkZWZpbmUgRU1QVFlfRldfSU1BR0VfU1RSCQkiPz8/Pz8/Pz8/Pz8/Pz8/IgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ29uc3RhbnQgQXJyYXlzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlYnVnIGFycmF5cyAqLworc3RhdGljIHN0cnVjdCBkYmdfYXJyYXkgc19kYmdfYXJyYXlzW01BWF9CSU5fREJHX0JVRkZFUl9UWVBFXSA9IHsgezB9IH07CisKKy8qIENoaXAgY29uc3RhbnQgZGVmaW5pdGlvbnMgYXJyYXkgKi8KK3N0YXRpYyBzdHJ1Y3QgY2hpcF9kZWZzIHNfY2hpcF9kZWZzW01BWF9DSElQX0lEU10gPSB7CisJeyAicmVzZXJ2ZWQiLCB7IHswLCAwfSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfSB9IH0sCisJeyAiYmJfYjAiLAorCSAgeyB7TUFYX05VTV9QT1JUU19CQiwgTUFYX05VTV9QRlNfQkJ9LCB7MCwgMH0sIHswLCAwfSwgezAsIDB9IH0gfSwKKwl7ICJrMiIsIHsge01BWF9OVU1fUE9SVFNfSzIsIE1BWF9OVU1fUEZTX0syfSwgezAsIDB9LCB7MCwgMH0sIHswLCAwfSB9IH0KK307CisKKy8qIFN0b3JtIGNvbnN0YW50IGRlZmluaXRpb25zIGFycmF5ICovCitzdGF0aWMgc3RydWN0IHN0b3JtX2RlZnMgc19zdG9ybV9kZWZzW10gPSB7CisJLyogVHN0b3JtICovCisJeydUJywgQkxPQ0tfVFNFTSwKKwkge0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsCisJICBEQkdfQlVTX0NMSUVOVF9SQkNUfSwgdHJ1ZSwKKwkgVFNFTV9SRUdfRkFTVF9NRU1PUlksCisJIFRTRU1fUkVHX0RCR19GUkFNRV9NT0RFLCBUU0VNX1JFR19TTE9XX0RCR19BQ1RJVkUsCisJIFRTRU1fUkVHX1NMT1dfREJHX01PREUsIFRTRU1fUkVHX0RCR19NT0RFMV9DRkcsCisJIFRTRU1fUkVHX1NZTkNfREJHX0VNUFRZLCBUU0VNX1JFR19TTE9XX0RCR19FTVBUWSwKKwkgVENNX1JFR19DVFhfUkJDX0FDQ1MsCisJIDQsIFRDTV9SRUdfQUdHX0NPTl9DVFgsCisJIDE2LCBUQ01fUkVHX1NNX0NPTl9DVFgsCisJIDIsIFRDTV9SRUdfQUdHX1RBU0tfQ1RYLAorCSA0LCBUQ01fUkVHX1NNX1RBU0tfQ1RYfSwKKwkvKiBNc3Rvcm0gKi8KKwl7J00nLCBCTE9DS19NU0VNLAorCSB7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwKKwkgIERCR19CVVNfQ0xJRU5UX1JCQ019LCBmYWxzZSwKKwkgTVNFTV9SRUdfRkFTVF9NRU1PUlksCisJIE1TRU1fUkVHX0RCR19GUkFNRV9NT0RFLCBNU0VNX1JFR19TTE9XX0RCR19BQ1RJVkUsCisJIE1TRU1fUkVHX1NMT1dfREJHX01PREUsIE1TRU1fUkVHX0RCR19NT0RFMV9DRkcsCisJIE1TRU1fUkVHX1NZTkNfREJHX0VNUFRZLCBNU0VNX1JFR19TTE9XX0RCR19FTVBUWSwKKwkgTUNNX1JFR19DVFhfUkJDX0FDQ1MsCisJIDEsIE1DTV9SRUdfQUdHX0NPTl9DVFgsCisJIDEwLCBNQ01fUkVHX1NNX0NPTl9DVFgsCisJIDIsIE1DTV9SRUdfQUdHX1RBU0tfQ1RYLAorCSA3LCBNQ01fUkVHX1NNX1RBU0tfQ1RYfSwKKwkvKiBVc3Rvcm0gKi8KKwl7J1UnLCBCTE9DS19VU0VNLAorCSB7REJHX0JVU19DTElFTlRfUkJDVSwgREJHX0JVU19DTElFTlRfUkJDVSwKKwkgIERCR19CVVNfQ0xJRU5UX1JCQ1V9LCBmYWxzZSwKKwkgVVNFTV9SRUdfRkFTVF9NRU1PUlksCisJIFVTRU1fUkVHX0RCR19GUkFNRV9NT0RFLCBVU0VNX1JFR19TTE9XX0RCR19BQ1RJVkUsCisJIFVTRU1fUkVHX1NMT1dfREJHX01PREUsIFVTRU1fUkVHX0RCR19NT0RFMV9DRkcsCisJIFVTRU1fUkVHX1NZTkNfREJHX0VNUFRZLCBVU0VNX1JFR19TTE9XX0RCR19FTVBUWSwKKwkgVUNNX1JFR19DVFhfUkJDX0FDQ1MsCisJIDIsIFVDTV9SRUdfQUdHX0NPTl9DVFgsCisJIDEzLCBVQ01fUkVHX1NNX0NPTl9DVFgsCisJIDMsIFVDTV9SRUdfQUdHX1RBU0tfQ1RYLAorCSAzLCBVQ01fUkVHX1NNX1RBU0tfQ1RYfSwKKwkvKiBYc3Rvcm0gKi8KKwl7J1gnLCBCTE9DS19YU0VNLAorCSB7REJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWCwKKwkgIERCR19CVVNfQ0xJRU5UX1JCQ1h9LCBmYWxzZSwKKwkgWFNFTV9SRUdfRkFTVF9NRU1PUlksCisJIFhTRU1fUkVHX0RCR19GUkFNRV9NT0RFLCBYU0VNX1JFR19TTE9XX0RCR19BQ1RJVkUsCisJIFhTRU1fUkVHX1NMT1dfREJHX01PREUsIFhTRU1fUkVHX0RCR19NT0RFMV9DRkcsCisJIFhTRU1fUkVHX1NZTkNfREJHX0VNUFRZLCBYU0VNX1JFR19TTE9XX0RCR19FTVBUWSwKKwkgWENNX1JFR19DVFhfUkJDX0FDQ1MsCisJIDksIFhDTV9SRUdfQUdHX0NPTl9DVFgsCisJIDE1LCBYQ01fUkVHX1NNX0NPTl9DVFgsCisJIDAsIDAsCisJIDAsIDB9LAorCS8qIFlzdG9ybSAqLworCXsnWScsIEJMT0NLX1lTRU0sCisJIHtEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYLAorCSAgREJHX0JVU19DTElFTlRfUkJDWX0sIGZhbHNlLAorCSBZU0VNX1JFR19GQVNUX01FTU9SWSwKKwkgWVNFTV9SRUdfREJHX0ZSQU1FX01PREUsIFlTRU1fUkVHX1NMT1dfREJHX0FDVElWRSwKKwkgWVNFTV9SRUdfU0xPV19EQkdfTU9ERSwgWVNFTV9SRUdfREJHX01PREUxX0NGRywKKwkgWVNFTV9SRUdfU1lOQ19EQkdfRU1QVFksIFRTRU1fUkVHX1NMT1dfREJHX0VNUFRZLAorCSBZQ01fUkVHX0NUWF9SQkNfQUNDUywKKwkgMiwgWUNNX1JFR19BR0dfQ09OX0NUWCwKKwkgMywgWUNNX1JFR19TTV9DT05fQ1RYLAorCSAyLCBZQ01fUkVHX0FHR19UQVNLX0NUWCwKKwkgMTIsIFlDTV9SRUdfU01fVEFTS19DVFh9LAorCS8qIFBzdG9ybSAqLworCXsnUCcsIEJMT0NLX1BTRU0sCisJIHtEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTLAorCSAgREJHX0JVU19DTElFTlRfUkJDU30sIHRydWUsCisJIFBTRU1fUkVHX0ZBU1RfTUVNT1JZLAorCSBQU0VNX1JFR19EQkdfRlJBTUVfTU9ERSwgUFNFTV9SRUdfU0xPV19EQkdfQUNUSVZFLAorCSBQU0VNX1JFR19TTE9XX0RCR19NT0RFLCBQU0VNX1JFR19EQkdfTU9ERTFfQ0ZHLAorCSBQU0VNX1JFR19TWU5DX0RCR19FTVBUWSwgUFNFTV9SRUdfU0xPV19EQkdfRU1QVFksCisJIFBDTV9SRUdfQ1RYX1JCQ19BQ0NTLAorCSAwLCAwLAorCSAxMCwgUENNX1JFR19TTV9DT05fQ1RYLAorCSAwLCAwLAorCSAwLCAwfQorfTsKKworLyogQmxvY2sgZGVmaW5pdGlvbnMgYXJyYXkgKi8KK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19ncmNfZGVmcyA9IHsKKwkiZ3JjIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDTiwgREJHX0JVU19DTElFTlRfUkJDTiwgREJHX0JVU19DTElFTlRfUkJDTn0sCisJR1JDX1JFR19EQkdfU0VMRUNULCBHUkNfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJR1JDX1JFR19EQkdfU0hJRlQsIEdSQ19SRUdfREJHX0ZPUkNFX1ZBTElELAorCUdSQ19SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfVUEsIDEKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19taXNjc19kZWZzID0geworCSJtaXNjcyIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJZmFsc2UsIGZhbHNlLCBNQVhfREJHX1JFU0VUX1JFR1MsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19taXNjX2RlZnMgPSB7CisJIm1pc2MiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCWZhbHNlLCBmYWxzZSwgTUFYX0RCR19SRVNFVF9SRUdTLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfZGJ1X2RlZnMgPSB7CisJImRidSIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJZmFsc2UsIGZhbHNlLCBNQVhfREJHX1JFU0VUX1JFR1MsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wZ2x1ZV9iX2RlZnMgPSB7CisJInBnbHVlX2IiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNILCBEQkdfQlVTX0NMSUVOVF9SQkNILCBEQkdfQlVTX0NMSUVOVF9SQkNIfSwKKwlQR0xVRV9CX1JFR19EQkdfU0VMRUNULCBQR0xVRV9CX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBHTFVFX0JfUkVHX0RCR19TSElGVCwgUEdMVUVfQl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBHTFVFX0JfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViwgMQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2NuaWdfZGVmcyA9IHsKKwkiY25pZyIsIHtmYWxzZSwgZmFsc2UsIHRydWV9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgREJHX0JVU19DTElFTlRfUkJDV30sCisJQ05JR19SRUdfREJHX1NFTEVDVF9LMiwgQ05JR19SRUdfREJHX0RXT1JEX0VOQUJMRV9LMiwKKwlDTklHX1JFR19EQkdfU0hJRlRfSzIsIENOSUdfUkVHX0RCR19GT1JDRV9WQUxJRF9LMiwKKwlDTklHX1JFR19EQkdfRk9SQ0VfRlJBTUVfSzIsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19jcG11X2RlZnMgPSB7CisJImNwbXUiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWLCA4Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbmNzaV9kZWZzID0geworCSJuY3NpIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDWiwgREJHX0JVU19DTElFTlRfUkJDWiwgREJHX0JVU19DTElFTlRfUkJDWn0sCisJTkNTSV9SRUdfREJHX1NFTEVDVCwgTkNTSV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlOQ1NJX1JFR19EQkdfU0hJRlQsIE5DU0lfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlOQ1NJX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYsIDUKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19vcHRlX2RlZnMgPSB7CisJIm9wdGUiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWLCA0Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfYm1iX2RlZnMgPSB7CisJImJtYiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1osIERCR19CVVNfQ0xJRU5UX1JCQ1osIERCR19CVVNfQ0xJRU5UX1JCQ0J9LAorCUJNQl9SRUdfREJHX1NFTEVDVCwgQk1CX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCUJNQl9SRUdfREJHX1NISUZULCBCTUJfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlCTUJfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9VQSwgNworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3BjaWVfZGVmcyA9IHsKKwkicGNpZSIsIHtmYWxzZSwgZmFsc2UsIHRydWV9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgREJHX0JVU19DTElFTlRfUkJDSH0sCisJUENJRV9SRUdfREJHX0NPTU1PTl9TRUxFQ1QsIFBDSUVfUkVHX0RCR19DT01NT05fRFdPUkRfRU5BQkxFLAorCVBDSUVfUkVHX0RCR19DT01NT05fU0hJRlQsIFBDSUVfUkVHX0RCR19DT01NT05fRk9SQ0VfVkFMSUQsCisJUENJRV9SRUdfREJHX0NPTU1PTl9GT1JDRV9GUkFNRSwKKwlmYWxzZSwgZmFsc2UsIE1BWF9EQkdfUkVTRVRfUkVHUywgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX21jcF9kZWZzID0geworCSJtY3AiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCWZhbHNlLCBmYWxzZSwgTUFYX0RCR19SRVNFVF9SRUdTLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbWNwMl9kZWZzID0geworCSJtY3AyIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDWiwgREJHX0JVU19DTElFTlRfUkJDWiwgREJHX0JVU19DTElFTlRfUkJDWn0sCisJTUNQMl9SRUdfREJHX1NFTEVDVCwgTUNQMl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlNQ1AyX1JFR19EQkdfU0hJRlQsIE1DUDJfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlNQ1AyX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJZmFsc2UsIGZhbHNlLCBNQVhfREJHX1JFU0VUX1JFR1MsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wc3doc3RfZGVmcyA9IHsKKwkicHN3aHN0Iiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUH0sCisJUFNXSFNUX1JFR19EQkdfU0VMRUNULCBQU1dIU1RfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFNXSFNUX1JFR19EQkdfU0hJRlQsIFBTV0hTVF9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBTV0hTVF9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfSFYsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wc3doc3QyX2RlZnMgPSB7CisJInBzd2hzdDIiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQfSwKKwlQU1dIU1QyX1JFR19EQkdfU0VMRUNULCBQU1dIU1QyX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBTV0hTVDJfUkVHX0RCR19TSElGVCwgUFNXSFNUMl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBTV0hTVDJfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX0hWLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHN3cmRfZGVmcyA9IHsKKwkicHN3cmQiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQfSwKKwlQU1dSRF9SRUdfREJHX1NFTEVDVCwgUFNXUkRfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFNXUkRfUkVHX0RCR19TSElGVCwgUFNXUkRfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQU1dSRF9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfSFYsIDIKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wc3dyZDJfZGVmcyA9IHsKKwkicHN3cmQyIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUH0sCisJUFNXUkQyX1JFR19EQkdfU0VMRUNULCBQU1dSRDJfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFNXUkQyX1JFR19EQkdfU0hJRlQsIFBTV1JEMl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBTV1JEMl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfSFYsIDIKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wc3d3cl9kZWZzID0geworCSJwc3d3ciIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1B9LAorCVBTV1dSX1JFR19EQkdfU0VMRUNULCBQU1dXUl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQU1dXUl9SRUdfREJHX1NISUZULCBQU1dXUl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBTV1dSX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9IViwgMworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3Bzd3dyMl9kZWZzID0geworCSJwc3d3cjIiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfSFYsIDMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wc3dycV9kZWZzID0geworCSJwc3dycSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1B9LAorCVBTV1JRX1JFR19EQkdfU0VMRUNULCBQU1dSUV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQU1dSUV9SRUdfREJHX1NISUZULCBQU1dSUV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBTV1JRX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9IViwgMQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3Bzd3JxMl9kZWZzID0geworCSJwc3dycTIiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQfSwKKwlQU1dSUTJfUkVHX0RCR19TRUxFQ1QsIFBTV1JRMl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQU1dSUTJfUkVHX0RCR19TSElGVCwgUFNXUlEyX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFNXUlEyX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9IViwgMQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3BnbGNzX2RlZnMgPSB7CisJInBnbGNzIiwge2ZhbHNlLCBmYWxzZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBEQkdfQlVTX0NMSUVOVF9SQkNIfSwKKwlQR0xDU19SRUdfREJHX1NFTEVDVCwgUEdMQ1NfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUEdMQ1NfUkVHX0RCR19TSElGVCwgUEdMQ1NfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQR0xDU19SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWLCAyCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHR1X2RlZnMgPSB7CisJInB0dSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1B9LAorCVBUVV9SRUdfREJHX1NFTEVDVCwgUFRVX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBUVV9SRUdfREJHX1NISUZULCBQVFVfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQVFVfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDIwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfZG1hZV9kZWZzID0geworCSJkbWFlIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUCwgREJHX0JVU19DTElFTlRfUkJDUH0sCisJRE1BRV9SRUdfREJHX1NFTEVDVCwgRE1BRV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlETUFFX1JFR19EQkdfU0hJRlQsIERNQUVfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlETUFFX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAyOAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3RjbV9kZWZzID0geworCSJ0Y20iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19UU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1R9LAorCVRDTV9SRUdfREJHX1NFTEVDVCwgVENNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVRDTV9SRUdfREJHX1NISUZULCBUQ01fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlUQ01fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDUKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19tY21fZGVmcyA9IHsKKwkibWNtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfTVNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNNfSwKKwlNQ01fUkVHX0RCR19TRUxFQ1QsIE1DTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlNQ01fUkVHX0RCR19TSElGVCwgTUNNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJTUNNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAzCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfdWNtX2RlZnMgPSB7CisJInVjbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1VTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDVSwgREJHX0JVU19DTElFTlRfUkJDVSwgREJHX0JVU19DTElFTlRfUkJDVX0sCisJVUNNX1JFR19EQkdfU0VMRUNULCBVQ01fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJVUNNX1JFR19EQkdfU0hJRlQsIFVDTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVVDTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgOAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3hjbV9kZWZzID0geworCSJ4Y20iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19YU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1h9LAorCVhDTV9SRUdfREJHX1NFTEVDVCwgWENNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVhDTV9SRUdfREJHX1NISUZULCBYQ01fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlYQ01fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDE5Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfeWNtX2RlZnMgPSB7CisJInljbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1lTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWX0sCisJWUNNX1JFR19EQkdfU0VMRUNULCBZQ01fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJWUNNX1JFR19EQkdfU0hJRlQsIFlDTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVlDTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgNQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3BjbV9kZWZzID0geworCSJwY20iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19QU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1N9LAorCVBDTV9SRUdfREJHX1NFTEVDVCwgUENNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBDTV9SRUdfREJHX1NISUZULCBQQ01fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQQ01fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDQKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19xbV9kZWZzID0geworCSJxbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1AsIERCR19CVVNfQ0xJRU5UX1JCQ1F9LAorCVFNX1JFR19EQkdfU0VMRUNULCBRTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlRTV9SRUdfREJHX1NISUZULCBRTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVFNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAxNgorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3RtX2RlZnMgPSB7CisJInRtIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDU30sCisJVE1fUkVHX0RCR19TRUxFQ1QsIFRNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVRNX1JFR19EQkdfU0hJRlQsIFRNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJVE1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDE3Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfZG9ycV9kZWZzID0geworCSJkb3JxIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWX0sCisJRE9SUV9SRUdfREJHX1NFTEVDVCwgRE9SUV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlET1JRX1JFR19EQkdfU0hJRlQsIERPUlFfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlET1JRX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAxOAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2JyYl9kZWZzID0geworCSJicmIiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNSLCBEQkdfQlVTX0NMSUVOVF9SQkNSLCBEQkdfQlVTX0NMSUVOVF9SQkNSfSwKKwlCUkJfUkVHX0RCR19TRUxFQ1QsIEJSQl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlCUkJfUkVHX0RCR19TSElGVCwgQlJCX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJQlJCX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfc3JjX2RlZnMgPSB7CisJInNyYyIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ0YsIERCR19CVVNfQ0xJRU5UX1JCQ0YsIERCR19CVVNfQ0xJRU5UX1JCQ0Z9LAorCVNSQ19SRUdfREJHX1NFTEVDVCwgU1JDX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVNSQ19SRUdfREJHX1NISUZULCBTUkNfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlTUkNfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDIKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wcnNfZGVmcyA9IHsKKwkicHJzIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUiwgREJHX0JVU19DTElFTlRfUkJDUiwgREJHX0JVU19DTElFTlRfUkJDUn0sCisJUFJTX1JFR19EQkdfU0VMRUNULCBQUlNfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFJTX1JFR19EQkdfU0hJRlQsIFBSU19SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBSU19SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3RzZG1fZGVmcyA9IHsKKwkidHNkbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1RTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVH0sCisJVFNETV9SRUdfREJHX1NFTEVDVCwgVFNETV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlUU0RNX1JFR19EQkdfU0hJRlQsIFRTRE1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlUU0RNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAzCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbXNkbV9kZWZzID0geworCSJtc2RtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfTVNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNNfSwKKwlNU0RNX1JFR19EQkdfU0VMRUNULCBNU0RNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCU1TRE1fUkVHX0RCR19TSElGVCwgTVNETV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCU1TRE1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDYKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja191c2RtX2RlZnMgPSB7CisJInVzZG0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19VU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1UsIERCR19CVVNfQ0xJRU5UX1JCQ1UsIERCR19CVVNfQ0xJRU5UX1JCQ1V9LAorCVVTRE1fUkVHX0RCR19TRUxFQ1QsIFVTRE1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJVVNETV9SRUdfREJHX1NISUZULCBVU0RNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJVVNETV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgNworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3hzZG1fZGVmcyA9IHsKKwkieHNkbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1hTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWH0sCisJWFNETV9SRUdfREJHX1NFTEVDVCwgWFNETV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlYU0RNX1JFR19EQkdfU0hJRlQsIFhTRE1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlYU0RNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAyMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3lzZG1fZGVmcyA9IHsKKwkieXNkbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX1lTVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWCwgREJHX0JVU19DTElFTlRfUkJDWX0sCisJWVNETV9SRUdfREJHX1NFTEVDVCwgWVNETV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlZU0RNX1JFR19EQkdfU0hJRlQsIFlTRE1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlZU0RNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCA4Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHNkbV9kZWZzID0geworCSJwc2RtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfUFNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTLCBEQkdfQlVTX0NMSUVOVF9SQkNTfSwKKwlQU0RNX1JFR19EQkdfU0VMRUNULCBQU0RNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBTRE1fUkVHX0RCR19TSElGVCwgUFNETV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVBTRE1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDcKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja190c2VtX2RlZnMgPSB7CisJInRzZW0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19UU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1R9LAorCVRTRU1fUkVHX0RCR19TRUxFQ1QsIFRTRU1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJVFNFTV9SRUdfREJHX1NISUZULCBUU0VNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJVFNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgNAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX21zZW1fZGVmcyA9IHsKKwkibXNlbSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgdHJ1ZSwgREJHX01TVE9STV9JRCwKKwl7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDTX0sCisJTVNFTV9SRUdfREJHX1NFTEVDVCwgTVNFTV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlNU0VNX1JFR19EQkdfU0hJRlQsIE1TRU1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlNU0VNX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCA5Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfdXNlbV9kZWZzID0geworCSJ1c2VtIiwge3RydWUsIHRydWUsIHRydWV9LCB0cnVlLCBEQkdfVVNUT1JNX0lELAorCXtEQkdfQlVTX0NMSUVOVF9SQkNVLCBEQkdfQlVTX0NMSUVOVF9SQkNVLCBEQkdfQlVTX0NMSUVOVF9SQkNVfSwKKwlVU0VNX1JFR19EQkdfU0VMRUNULCBVU0VNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVVTRU1fUkVHX0RCR19TSElGVCwgVVNFTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVVTRU1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDkKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja194c2VtX2RlZnMgPSB7CisJInhzZW0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19YU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1h9LAorCVhTRU1fUkVHX0RCR19TRUxFQ1QsIFhTRU1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJWFNFTV9SRUdfREJHX1NISUZULCBYU0VNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJWFNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMjEKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja195c2VtX2RlZnMgPSB7CisJInlzZW0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19ZU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1gsIERCR19CVVNfQ0xJRU5UX1JCQ1l9LAorCVlTRU1fUkVHX0RCR19TRUxFQ1QsIFlTRU1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJWVNFTV9SRUdfREJHX1NISUZULCBZU0VNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJWVNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMTEKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19wc2VtX2RlZnMgPSB7CisJInBzZW0iLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIHRydWUsIERCR19QU1RPUk1fSUQsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1N9LAorCVBTRU1fUkVHX0RCR19TRUxFQ1QsIFBTRU1fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUFNFTV9SRUdfREJHX1NISUZULCBQU0VNX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJUFNFTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMTAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19yc3NfZGVmcyA9IHsKKwkicnNzIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVH0sCisJUlNTX1JFR19EQkdfU0VMRUNULCBSU1NfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJUlNTX1JFR19EQkdfU0hJRlQsIFJTU19SRUdfREJHX0ZPUkNFX1ZBTElELAorCVJTU19SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMTgKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja190bWxkX2RlZnMgPSB7CisJInRtbGQiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNULCBEQkdfQlVTX0NMSUVOVF9SQkNNfSwKKwlUTUxEX1JFR19EQkdfU0VMRUNULCBUTUxEX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVRNTERfUkVHX0RCR19TSElGVCwgVE1MRF9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVRNTERfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDEzCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbXVsZF9kZWZzID0geworCSJtdWxkIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDVSwgREJHX0JVU19DTElFTlRfUkJDVSwgREJHX0JVU19DTElFTlRfUkJDVX0sCisJTVVMRF9SRUdfREJHX1NFTEVDVCwgTVVMRF9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlNVUxEX1JFR19EQkdfU0hJRlQsIE1VTERfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlNVUxEX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAxNAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3l1bGRfZGVmcyA9IHsKKwkieXVsZCIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1UsIERCR19CVVNfQ0xJRU5UX1JCQ1UsIERCR19CVVNfQ0xJRU5UX1JCQ1V9LAorCVlVTERfUkVHX0RCR19TRUxFQ1QsIFlVTERfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJWVVMRF9SRUdfREJHX1NISUZULCBZVUxEX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJWVVMRF9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMTUKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja194eWxkX2RlZnMgPSB7CisJInh5bGQiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYLCBEQkdfQlVTX0NMSUVOVF9SQkNYfSwKKwlYWUxEX1JFR19EQkdfU0VMRUNULCBYWUxEX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVhZTERfUkVHX0RCR19TSElGVCwgWFlMRF9SRUdfREJHX0ZPUkNFX1ZBTElELAorCVhZTERfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDEyCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcHJtX2RlZnMgPSB7CisJInBybSIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ019LAorCVBSTV9SRUdfREJHX1NFTEVDVCwgUFJNX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBSTV9SRUdfREJHX1NISUZULCBQUk1fUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQUk1fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIsIDIxCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcGJmX3BiMV9kZWZzID0geworCSJwYmZfcGIxIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDVn0sCisJUEJGX1BCMV9SRUdfREJHX1NFTEVDVCwgUEJGX1BCMV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQQkZfUEIxX1JFR19EQkdfU0hJRlQsIFBCRl9QQjFfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQQkZfUEIxX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLAorCTExCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcGJmX3BiMl9kZWZzID0geworCSJwYmZfcGIyIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDUywgREJHX0JVU19DTElFTlRfUkJDVn0sCisJUEJGX1BCMl9SRUdfREJHX1NFTEVDVCwgUEJGX1BCMl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlQQkZfUEIyX1JFR19EQkdfU0hJRlQsIFBCRl9QQjJfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQQkZfUEIyX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLAorCTEyCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcnBiX2RlZnMgPSB7CisJInJwYiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ1QsIERCR19CVVNfQ0xJRU5UX1JCQ019LAorCVJQQl9SRUdfREJHX1NFTEVDVCwgUlBCX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVJQQl9SRUdfREJHX1NISUZULCBSUEJfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlSUEJfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDEzCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfYnRiX2RlZnMgPSB7CisJImJ0YiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1IsIERCR19CVVNfQ0xJRU5UX1JCQ1IsIERCR19CVVNfQ0xJRU5UX1JCQ1Z9LAorCUJUQl9SRUdfREJHX1NFTEVDVCwgQlRCX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCUJUQl9SRUdfREJHX1NISUZULCBCVEJfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlCVEJfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDEwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcGJmX2RlZnMgPSB7CisJInBiZiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1Z9LAorCVBCRl9SRUdfREJHX1NFTEVDVCwgUEJGX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCVBCRl9SRUdfREJHX1NISUZULCBQQkZfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlQQkZfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDE1Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcmRpZl9kZWZzID0geworCSJyZGlmIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDVCwgREJHX0JVU19DTElFTlRfUkJDTX0sCisJUkRJRl9SRUdfREJHX1NFTEVDVCwgUkRJRl9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlSRElGX1JFR19EQkdfU0hJRlQsIFJESUZfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlSRElGX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAxNgorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3RkaWZfZGVmcyA9IHsKKwkidGRpZiIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1MsIERCR19CVVNfQ0xJRU5UX1JCQ1N9LAorCVRESUZfUkVHX0RCR19TRUxFQ1QsIFRESUZfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJVERJRl9SRUdfREJHX1NISUZULCBURElGX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJVERJRl9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwgMTcKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19jZHVfZGVmcyA9IHsKKwkiY2R1Iiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDRiwgREJHX0JVU19DTElFTlRfUkJDRiwgREJHX0JVU19DTElFTlRfUkJDRn0sCisJQ0RVX1JFR19EQkdfU0VMRUNULCBDRFVfUkVHX0RCR19EV09SRF9FTkFCTEUsCisJQ0RVX1JFR19EQkdfU0hJRlQsIENEVV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCUNEVV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIHRydWUsIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMSwgMjMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19jY2ZjX2RlZnMgPSB7CisJImNjZmMiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNGLCBEQkdfQlVTX0NMSUVOVF9SQkNGLCBEQkdfQlVTX0NMSUVOVF9SQkNGfSwKKwlDQ0ZDX1JFR19EQkdfU0VMRUNULCBDQ0ZDX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCUNDRkNfUkVHX0RCR19TSElGVCwgQ0NGQ19SRUdfREJHX0ZPUkNFX1ZBTElELAorCUNDRkNfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzEsIDI0Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfdGNmY19kZWZzID0geworCSJ0Y2ZjIiwge3RydWUsIHRydWUsIHRydWV9LCBmYWxzZSwgMCwKKwl7REJHX0JVU19DTElFTlRfUkJDRiwgREJHX0JVU19DTElFTlRfUkJDRiwgREJHX0JVU19DTElFTlRfUkJDRn0sCisJVENGQ19SRUdfREJHX1NFTEVDVCwgVENGQ19SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlUQ0ZDX1JFR19EQkdfU0hJRlQsIFRDRkNfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlUQ0ZDX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAyNQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2lndV9kZWZzID0geworCSJpZ3UiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQfSwKKwlJR1VfUkVHX0RCR19TRUxFQ1QsIElHVV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlJR1VfUkVHX0RCR19TSElGVCwgSUdVX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJSUdVX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLCAyNworfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2NhdV9kZWZzID0geworCSJjYXUiLCB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQLCBEQkdfQlVTX0NMSUVOVF9SQkNQfSwKKwlDQVVfUkVHX0RCR19TRUxFQ1QsIENBVV9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlDQVVfUkVHX0RCR19TSElGVCwgQ0FVX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJQ0FVX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8yLCAxOQorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX3VtYWNfZGVmcyA9IHsKKwkidW1hYyIsIHtmYWxzZSwgZmFsc2UsIHRydWV9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgREJHX0JVU19DTElFTlRfUkJDWn0sCisJVU1BQ19SRUdfREJHX1NFTEVDVCwgVU1BQ19SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlVTUFDX1JFR19EQkdfU0hJRlQsIFVNQUNfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlVTUFDX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYsIDYKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja194bWFjX2RlZnMgPSB7CisJInhtYWMiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCWZhbHNlLCBmYWxzZSwgTUFYX0RCR19SRVNFVF9SRUdTLCAwCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfZGJnX2RlZnMgPSB7CisJImRiZyIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WQVVYLCAzCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbmlnX2RlZnMgPSB7CisJIm5pZyIsIHt0cnVlLCB0cnVlLCB0cnVlfSwgZmFsc2UsIDAsCisJe0RCR19CVVNfQ0xJRU5UX1JCQ04sIERCR19CVVNfQ0xJRU5UX1JCQ04sIERCR19CVVNfQ0xJRU5UX1JCQ059LAorCU5JR19SRUdfREJHX1NFTEVDVCwgTklHX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCU5JR19SRUdfREJHX1NISUZULCBOSUdfUkVHX0RCR19GT1JDRV9WQUxJRCwKKwlOSUdfUkVHX0RCR19GT1JDRV9GUkFNRSwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZBVVgsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja193b2xfZGVmcyA9IHsKKwkid29sIiwge2ZhbHNlLCBmYWxzZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBEQkdfQlVTX0NMSUVOVF9SQkNafSwKKwlXT0xfUkVHX0RCR19TRUxFQ1QsIFdPTF9SRUdfREJHX0RXT1JEX0VOQUJMRSwKKwlXT0xfUkVHX0RCR19TSElGVCwgV09MX1JFR19EQkdfRk9SQ0VfVkFMSUQsCisJV09MX1JFR19EQkdfRk9SQ0VfRlJBTUUsCisJdHJ1ZSwgdHJ1ZSwgREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WQVVYLCA3Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfYm1ibl9kZWZzID0geworCSJibWJuIiwge2ZhbHNlLCBmYWxzZSwgdHJ1ZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBEQkdfQlVTX0NMSUVOVF9SQkNCfSwKKwlCTUJOX1JFR19EQkdfU0VMRUNULCBCTUJOX1JFR19EQkdfRFdPUkRfRU5BQkxFLAorCUJNQk5fUkVHX0RCR19TSElGVCwgQk1CTl9SRUdfREJHX0ZPUkNFX1ZBTElELAorCUJNQk5fUkVHX0RCR19GT1JDRV9GUkFNRSwKKwlmYWxzZSwgZmFsc2UsIE1BWF9EQkdfUkVTRVRfUkVHUywgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2lwY19kZWZzID0geworCSJpcGMiLCB7ZmFsc2UsIGZhbHNlLCBmYWxzZX0sIGZhbHNlLCAwLAorCXtNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTLCBNQVhfREJHX0JVU19DTElFTlRTfSwKKwkwLCAwLCAwLCAwLCAwLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX1VBLCA4Cit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfbndtX2RlZnMgPSB7CisJIm53bSIsIHtmYWxzZSwgZmFsc2UsIHRydWV9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgREJHX0JVU19DTElFTlRfUkJDV30sCisJTldNX1JFR19EQkdfU0VMRUNULCBOV01fUkVHX0RCR19EV09SRF9FTkFCTEUsCisJTldNX1JFR19EQkdfU0hJRlQsIE5XTV9SRUdfREJHX0ZPUkNFX1ZBTElELAorCU5XTV9SRUdfREJHX0ZPUkNFX0ZSQU1FLAorCXRydWUsIGZhbHNlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWXzIsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19ud3NfZGVmcyA9IHsKKwkibndzIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwl0cnVlLCBmYWxzZSwgREJHX1JFU0VUX1JFR19NSVNDU19QTF9IViwgMTIKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19tc19kZWZzID0geworCSJtcyIsIHtmYWxzZSwgZmFsc2UsIGZhbHNlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFN9LAorCTAsIDAsIDAsIDAsIDAsCisJdHJ1ZSwgZmFsc2UsIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYsIDEzCit9OworCitzdGF0aWMgc3RydWN0IGJsb2NrX2RlZnMgYmxvY2tfcGh5X3BjaWVfZGVmcyA9IHsKKwkicGh5X3BjaWUiLCB7ZmFsc2UsIGZhbHNlLCB0cnVlfSwgZmFsc2UsIDAsCisJe01BWF9EQkdfQlVTX0NMSUVOVFMsIE1BWF9EQkdfQlVTX0NMSUVOVFMsIERCR19CVVNfQ0xJRU5UX1JCQ0h9LAorCVBDSUVfUkVHX0RCR19DT01NT05fU0VMRUNULCBQQ0lFX1JFR19EQkdfQ09NTU9OX0RXT1JEX0VOQUJMRSwKKwlQQ0lFX1JFR19EQkdfQ09NTU9OX1NISUZULCBQQ0lFX1JFR19EQkdfQ09NTU9OX0ZPUkNFX1ZBTElELAorCVBDSUVfUkVHX0RCR19DT01NT05fRk9SQ0VfRlJBTUUsCisJZmFsc2UsIGZhbHNlLCBNQVhfREJHX1JFU0VUX1JFR1MsIDAKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2tfZGVmcyBibG9ja19sZWRfZGVmcyA9IHsKKwkibGVkIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwl0cnVlLCB0cnVlLCBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWLCAxNAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX21pc2NfYWV1X2RlZnMgPSB7CisJIm1pc2NfYWV1Iiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwlmYWxzZSwgZmFsc2UsIE1BWF9EQkdfUkVTRVRfUkVHUywgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzIGJsb2NrX2JhcjBfbWFwX2RlZnMgPSB7CisJImJhcjBfbWFwIiwge2ZhbHNlLCBmYWxzZSwgZmFsc2V9LCBmYWxzZSwgMCwKKwl7TUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UUywgTUFYX0RCR19CVVNfQ0xJRU5UU30sCisJMCwgMCwgMCwgMCwgMCwKKwlmYWxzZSwgZmFsc2UsIE1BWF9EQkdfUkVTRVRfUkVHUywgMAorfTsKKworc3RhdGljIHN0cnVjdCBibG9ja19kZWZzICpzX2Jsb2NrX2RlZnNbTUFYX0JMT0NLX0lEXSA9IHsKKwkmYmxvY2tfZ3JjX2RlZnMsCisJJmJsb2NrX21pc2NzX2RlZnMsCisJJmJsb2NrX21pc2NfZGVmcywKKwkmYmxvY2tfZGJ1X2RlZnMsCisJJmJsb2NrX3BnbHVlX2JfZGVmcywKKwkmYmxvY2tfY25pZ19kZWZzLAorCSZibG9ja19jcG11X2RlZnMsCisJJmJsb2NrX25jc2lfZGVmcywKKwkmYmxvY2tfb3B0ZV9kZWZzLAorCSZibG9ja19ibWJfZGVmcywKKwkmYmxvY2tfcGNpZV9kZWZzLAorCSZibG9ja19tY3BfZGVmcywKKwkmYmxvY2tfbWNwMl9kZWZzLAorCSZibG9ja19wc3doc3RfZGVmcywKKwkmYmxvY2tfcHN3aHN0Ml9kZWZzLAorCSZibG9ja19wc3dyZF9kZWZzLAorCSZibG9ja19wc3dyZDJfZGVmcywKKwkmYmxvY2tfcHN3d3JfZGVmcywKKwkmYmxvY2tfcHN3d3IyX2RlZnMsCisJJmJsb2NrX3Bzd3JxX2RlZnMsCisJJmJsb2NrX3Bzd3JxMl9kZWZzLAorCSZibG9ja19wZ2xjc19kZWZzLAorCSZibG9ja19kbWFlX2RlZnMsCisJJmJsb2NrX3B0dV9kZWZzLAorCSZibG9ja190Y21fZGVmcywKKwkmYmxvY2tfbWNtX2RlZnMsCisJJmJsb2NrX3VjbV9kZWZzLAorCSZibG9ja194Y21fZGVmcywKKwkmYmxvY2tfeWNtX2RlZnMsCisJJmJsb2NrX3BjbV9kZWZzLAorCSZibG9ja19xbV9kZWZzLAorCSZibG9ja190bV9kZWZzLAorCSZibG9ja19kb3JxX2RlZnMsCisJJmJsb2NrX2JyYl9kZWZzLAorCSZibG9ja19zcmNfZGVmcywKKwkmYmxvY2tfcHJzX2RlZnMsCisJJmJsb2NrX3RzZG1fZGVmcywKKwkmYmxvY2tfbXNkbV9kZWZzLAorCSZibG9ja191c2RtX2RlZnMsCisJJmJsb2NrX3hzZG1fZGVmcywKKwkmYmxvY2tfeXNkbV9kZWZzLAorCSZibG9ja19wc2RtX2RlZnMsCisJJmJsb2NrX3RzZW1fZGVmcywKKwkmYmxvY2tfbXNlbV9kZWZzLAorCSZibG9ja191c2VtX2RlZnMsCisJJmJsb2NrX3hzZW1fZGVmcywKKwkmYmxvY2tfeXNlbV9kZWZzLAorCSZibG9ja19wc2VtX2RlZnMsCisJJmJsb2NrX3Jzc19kZWZzLAorCSZibG9ja190bWxkX2RlZnMsCisJJmJsb2NrX211bGRfZGVmcywKKwkmYmxvY2tfeXVsZF9kZWZzLAorCSZibG9ja194eWxkX2RlZnMsCisJJmJsb2NrX3BybV9kZWZzLAorCSZibG9ja19wYmZfcGIxX2RlZnMsCisJJmJsb2NrX3BiZl9wYjJfZGVmcywKKwkmYmxvY2tfcnBiX2RlZnMsCisJJmJsb2NrX2J0Yl9kZWZzLAorCSZibG9ja19wYmZfZGVmcywKKwkmYmxvY2tfcmRpZl9kZWZzLAorCSZibG9ja190ZGlmX2RlZnMsCisJJmJsb2NrX2NkdV9kZWZzLAorCSZibG9ja19jY2ZjX2RlZnMsCisJJmJsb2NrX3RjZmNfZGVmcywKKwkmYmxvY2tfaWd1X2RlZnMsCisJJmJsb2NrX2NhdV9kZWZzLAorCSZibG9ja191bWFjX2RlZnMsCisJJmJsb2NrX3htYWNfZGVmcywKKwkmYmxvY2tfZGJnX2RlZnMsCisJJmJsb2NrX25pZ19kZWZzLAorCSZibG9ja193b2xfZGVmcywKKwkmYmxvY2tfYm1ibl9kZWZzLAorCSZibG9ja19pcGNfZGVmcywKKwkmYmxvY2tfbndtX2RlZnMsCisJJmJsb2NrX253c19kZWZzLAorCSZibG9ja19tc19kZWZzLAorCSZibG9ja19waHlfcGNpZV9kZWZzLAorCSZibG9ja19sZWRfZGVmcywKKwkmYmxvY2tfbWlzY19hZXVfZGVmcywKKwkmYmxvY2tfYmFyMF9tYXBfZGVmcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGVmcyBzX3BsYXRmb3JtX2RlZnNbXSA9IHsKKwl7ImFzaWMiLCAxfSwKKwl7InJlc2VydmVkIiwgMH0sCisJeyJyZXNlcnZlZDIiLCAwfSwKKwl7InJlc2VydmVkMyIsIDB9Cit9OworCitzdGF0aWMgc3RydWN0IGdyY19wYXJhbV9kZWZzIHNfZ3JjX3BhcmFtX2RlZnNbXSA9IHsKKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMSwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9UU1RPUk0gKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMSwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9NU1RPUk0gKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMSwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9VU1RPUk0gKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMSwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9YU1RPUk0gKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMSwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9ZU1RPUk0gKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMSwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9QU1RPUk0gKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9SRUdTICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfUkFNICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfUEJVRiAqLworCXt7MCwgMCwgMH0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0lPUiAqLworCXt7MCwgMCwgMH0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1ZGQyAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0NNX0NUWCAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0lMVCAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1JTUyAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0NBVSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1FNICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfTUNQICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX1JFU0VSVkVEICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfQ0ZDICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfSUdVICovCisJe3swLCAwLCAwfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfQlJCICovCisJe3swLCAwLCAwfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfQlRCICovCisJe3swLCAwLCAwfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfQk1CICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfTklHICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9LAkvKiBEQkdfR1JDX1BBUkFNX0RVTVBfTVVMRCAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1BSUyAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0RNQUUgKi8KKwl7ezEsIDEsIDF9LCAwLCAxLCBmYWxzZSwgMCwgMX0sCS8qIERCR19HUkNfUEFSQU1fRFVNUF9UTSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1NETSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0RJRiAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX1NUQVRJQyAqLworCXt7MCwgMCwgMH0sIDAsIDEsIGZhbHNlLCAwLCAwfSwJLyogREJHX0dSQ19QQVJBTV9VTlNUQUxMICovCisJe3tNQVhfTENJRFMsIE1BWF9MQ0lEUywgTUFYX0xDSURTfSwgMSwgTUFYX0xDSURTLCBmYWxzZSwgTUFYX0xDSURTLAorCSBNQVhfTENJRFN9LAkJCS8qIERCR19HUkNfUEFSQU1fTlVNX0xDSURTICovCisJe3tNQVhfTFRJRFMsIE1BWF9MVElEUywgTUFYX0xUSURTfSwgMSwgTUFYX0xUSURTLCBmYWxzZSwgTUFYX0xUSURTLAorCSBNQVhfTFRJRFN9LAkJCS8qIERCR19HUkNfUEFSQU1fTlVNX0xUSURTICovCisJe3swLCAwLCAwfSwgMCwgMSwgdHJ1ZSwgMCwgMH0sCS8qIERCR19HUkNfUEFSQU1fRVhDTFVERV9BTEwgKi8KKwl7ezAsIDAsIDB9LCAwLCAxLCB0cnVlLCAwLCAwfSwJLyogREJHX0dSQ19QQVJBTV9DUkFTSCAqLworCXt7MCwgMCwgMH0sIDAsIDEsIGZhbHNlLCAxLCAwfSwJLyogREJHX0dSQ19QQVJBTV9QQVJJVFlfU0FGRSAqLworCXt7MSwgMSwgMX0sIDAsIDEsIGZhbHNlLCAwLCAxfSwJLyogREJHX0dSQ19QQVJBTV9EVU1QX0NNICovCisJe3sxLCAxLCAxfSwgMCwgMSwgZmFsc2UsIDAsIDF9CS8qIERCR19HUkNfUEFSQU1fRFVNUF9QSFkgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcnNzX21lbV9kZWZzIHNfcnNzX21lbV9kZWZzW10gPSB7CisJeyAicnNzX21lbV9jaWQiLCAicnNzX2NpZCIsIDAsCisJICB7MjU2LCAyNTYsIDMyMH0sCisJICB7MzIsIDMyLCAzMn0gfSwKKwl7ICJyc3NfbWVtX2tleV9tc2IiLCAicnNzX2tleSIsIDEwMjQsCisJICB7MTI4LCAxMjgsIDIwOH0sCisJICB7MjU2LCAyNTYsIDI1Nn0gfSwKKwl7ICJyc3NfbWVtX2tleV9sc2IiLCAicnNzX2tleSIsIDIwNDgsCisJICB7MTI4LCAxMjgsIDIwOH0sCisJICB7NjQsIDY0LCA2NH0gfSwKKwl7ICJyc3NfbWVtX2luZm8iLCAicnNzX2luZm8iLCAzMDcyLAorCSAgezEyOCwgMTI4LCAyMDh9LAorCSAgezE2LCAxNiwgMTZ9IH0sCisJeyAicnNzX21lbV9pbmQiLCAicnNzX2luZCIsIDQwOTYsCisJICB7KDEyOCAqIDEyOCksICgxMjggKiAxMjgpLCAoMTI4ICogMjA4KX0sCisJICB7MTYsIDE2LCAxNn0gfQorfTsKKworc3RhdGljIHN0cnVjdCB2ZmNfcmFtX2RlZnMgc192ZmNfcmFtX2RlZnNbXSA9IHsKKwl7InZmY19yYW1fdHQxIiwgInZmY19yYW0iLCAwLCA1MTJ9LAorCXsidmZjX3JhbV9tdHQyIiwgInZmY19yYW0iLCA1MTIsIDEyOH0sCisJeyJ2ZmNfcmFtX3N0dDIiLCAidmZjX3JhbSIsIDY0MCwgMzJ9LAorCXsidmZjX3JhbV9yb192ZWN0IiwgInZmY19yYW0iLCA2NzIsIDMyfQorfTsKKworc3RhdGljIHN0cnVjdCBiaWdfcmFtX2RlZnMgc19iaWdfcmFtX2RlZnNbXSA9IHsKKwl7ICJCUkIiLCBNRU1fR1JPVVBfQlJCX01FTSwgTUVNX0dST1VQX0JSQl9SQU0sIERCR19HUkNfUEFSQU1fRFVNUF9CUkIsCisJICBCUkJfUkVHX0JJR19SQU1fQUREUkVTUywgQlJCX1JFR19CSUdfUkFNX0RBVEEsCisJICB7NDgwMCwgNDgwMCwgNTYzMn0gfSwKKwl7ICJCVEIiLCBNRU1fR1JPVVBfQlRCX01FTSwgTUVNX0dST1VQX0JUQl9SQU0sIERCR19HUkNfUEFSQU1fRFVNUF9CVEIsCisJICBCVEJfUkVHX0JJR19SQU1fQUREUkVTUywgQlRCX1JFR19CSUdfUkFNX0RBVEEsCisJICB7Mjg4MCwgMjg4MCwgMzY4MH0gfSwKKwl7ICJCTUIiLCBNRU1fR1JPVVBfQk1CX01FTSwgTUVNX0dST1VQX0JNQl9SQU0sIERCR19HUkNfUEFSQU1fRFVNUF9CTUIsCisJICBCTUJfUkVHX0JJR19SQU1fQUREUkVTUywgQk1CX1JFR19CSUdfUkFNX0RBVEEsCisJICB7MTE1MiwgMTE1MiwgMTE1Mn0gfQorfTsKKworc3RhdGljIHN0cnVjdCByZXNldF9yZWdfZGVmcyBzX3Jlc2V0X3JlZ3NfZGVmc1tdID0geworCXsgTUlTQ1NfUkVHX1JFU0VUX1BMX1VBLCAweDAsCisJICB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0gfSwJCS8qIERCR19SRVNFVF9SRUdfTUlTQ1NfUExfVUEgKi8KKwl7IE1JU0NTX1JFR19SRVNFVF9QTF9IViwgMHgwLAorCSAge3RydWUsIHRydWUsIHRydWV9IH0sCQkvKiBEQkdfUkVTRVRfUkVHX01JU0NTX1BMX0hWICovCisJeyBNSVNDU19SRUdfUkVTRVRfUExfSFZfMiwgMHgwLAorCSAge2ZhbHNlLCBmYWxzZSwgdHJ1ZX0gfSwJLyogREJHX1JFU0VUX1JFR19NSVNDU19QTF9IVl8yICovCisJeyBNSVNDX1JFR19SRVNFVF9QTF9VQSwgMHgwLAorCSAge3RydWUsIHRydWUsIHRydWV9IH0sCQkvKiBEQkdfUkVTRVRfUkVHX01JU0NfUExfVUEgKi8KKwl7IE1JU0NfUkVHX1JFU0VUX1BMX0hWLCAweDAsCisJICB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0gfSwJCS8qIERCR19SRVNFVF9SRUdfTUlTQ19QTF9IViAqLworCXsgTUlTQ19SRUdfUkVTRVRfUExfUERBX1ZNQUlOXzEsIDB4NDQwNDA0MCwKKwkgIHt0cnVlLCB0cnVlLCB0cnVlfSB9LAkJLyogREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xICovCisJeyBNSVNDX1JFR19SRVNFVF9QTF9QREFfVk1BSU5fMiwgMHg3YzAwMDA3LAorCSAge3RydWUsIHRydWUsIHRydWV9IH0sCQkvKiBEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZNQUlOXzIgKi8KKwl7IE1JU0NfUkVHX1JFU0VUX1BMX1BEQV9WQVVYLCAweDIsCisJICB7dHJ1ZSwgdHJ1ZSwgdHJ1ZX0gfSwJCS8qIERCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVkFVWCAqLworfTsKKworc3RhdGljIHN0cnVjdCBwaHlfZGVmcyBzX3BoeV9kZWZzW10gPSB7CisJeyJud19waHkiLCBOV1NfUkVHX05XU19DTVUsIFBIWV9OV19JUF9SRUdfUEhZMF9UT1BfVEJVU19BRERSXzdfMCwKKwkgUEhZX05XX0lQX1JFR19QSFkwX1RPUF9UQlVTX0FERFJfMTVfOCwKKwkgUEhZX05XX0lQX1JFR19QSFkwX1RPUF9UQlVTX0RBVEFfN18wLAorCSBQSFlfTldfSVBfUkVHX1BIWTBfVE9QX1RCVVNfREFUQV8xMV84fSwKKwl7InNnbWlpX3BoeSIsIE1TX1JFR19NU19DTVUsIFBIWV9TR01JSV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMyLAorCSBQSFlfU0dNSUlfSVBfUkVHX0FIQl9DTVVfQ1NSXzBfWDEzMywKKwkgUEhZX1NHTUlJX0lQX1JFR19BSEJfQ01VX0NTUl8wX1gxMzAsCisJIFBIWV9TR01JSV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMxfSwKKwl7InBjaWVfcGh5MCIsIFBIWV9QQ0lFX1JFR19QSFkwLCBQSFlfUENJRV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMyLAorCSBQSFlfUENJRV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMzLAorCSBQSFlfUENJRV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMwLAorCSBQSFlfUENJRV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMxfSwKKwl7InBjaWVfcGh5MSIsIFBIWV9QQ0lFX1JFR19QSFkxLCBQSFlfUENJRV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMyLAorCSBQSFlfUENJRV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMzLAorCSBQSFlfUENJRV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMwLAorCSBQSFlfUENJRV9JUF9SRUdfQUhCX0NNVV9DU1JfMF9YMTMxfSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIFByaXZhdGUgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUmVhZHMgYW5kIHJldHVybnMgYSBzaW5nbGUgZHdvcmQgZnJvbSB0aGUgc3BlY2lmaWVkIHVuYWxpZ25lZCBidWZmZXIgKi8KK3N0YXRpYyB1MzIgcWVkX3JlYWRfdW5hbGlnbmVkX2R3b3JkKHU4ICpidWYpCit7CisJdTMyIGR3b3JkOworCisJbWVtY3B5KCh1OCAqKSZkd29yZCwgYnVmLCBzaXplb2YoZHdvcmQpKTsKKwlyZXR1cm4gZHdvcmQ7Cit9CisKKy8qIEluaXRpYWxpemVzIGRlYnVnIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgZGV2aWNlICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfZGV2X2luaXQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisKKwlpZiAoZGV2X2RhdGEtPmluaXRpYWxpemVkKQorCQlyZXR1cm4gREJHX1NUQVRVU19PSzsKKworCWlmIChRRURfSVNfSzIocF9od2ZuLT5jZGV2KSkgeworCQlkZXZfZGF0YS0+Y2hpcF9pZCA9IENISVBfSzI7CisJCWRldl9kYXRhLT5tb2RlX2VuYWJsZVtNT0RFX0syXSA9IDE7CisJfSBlbHNlIGlmIChRRURfSVNfQkJfQjAocF9od2ZuLT5jZGV2KSkgeworCQlkZXZfZGF0YS0+Y2hpcF9pZCA9IENISVBfQkJfQjA7CisJCWRldl9kYXRhLT5tb2RlX2VuYWJsZVtNT0RFX0JCX0IwXSA9IDE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIERCR19TVEFUVVNfVU5LTk9XTl9DSElQOworCX0KKworCWRldl9kYXRhLT5wbGF0Zm9ybV9pZCA9IFBMQVRGT1JNX0FTSUM7CisJZGV2X2RhdGEtPm1vZGVfZW5hYmxlW01PREVfQVNJQ10gPSAxOworCWRldl9kYXRhLT5pbml0aWFsaXplZCA9IHRydWU7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKKy8qIFJlYWRzIHRoZSBGVyBpbmZvIHN0cnVjdHVyZSBmb3IgdGhlIHNwZWNpZmllZCBTdG9ybSBmcm9tIHRoZSBjaGlwLAorICogYW5kIHdyaXRlcyBpdCB0byB0aGUgc3BlY2lmaWVkIGZ3X2luZm8gcG9pbnRlci4KKyAqLworc3RhdGljIHZvaWQgcWVkX3JlYWRfZndfaW5mbyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJICAgICB1OCBzdG9ybV9pZCwgc3RydWN0IGZ3X2luZm8gKmZ3X2luZm8pCit7CisJLyogUmVhZCBmaXJzdCB0aGUgYWRkcmVzcyB0aGF0IHBvaW50cyB0byBmd19pbmZvIGxvY2F0aW9uLgorCSAqIFRoZSBhZGRyZXNzIGlzIGxvY2F0ZWQgaW4gdGhlIGxhc3QgbGluZSBvZiB0aGUgU3Rvcm0gUkFNLgorCSAqLworCXUzMiBhZGRyID0gc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5zZW1fZmFzdF9tZW1fYWRkciArCisJCSAgIFNFTV9GQVNUX1JFR19JTlRfUkFNICsKKwkJICAgRFdPUkRTX1RPX0JZVEVTKFNFTV9GQVNUX1JFR19JTlRfUkFNX1NJWkUpIC0KKwkJICAgc2l6ZW9mKHN0cnVjdCBmd19pbmZvX2xvY2F0aW9uKTsKKwlzdHJ1Y3QgZndfaW5mb19sb2NhdGlvbiBmd19pbmZvX2xvY2F0aW9uOworCXUzMiAqZGVzdCA9ICh1MzIgKikmZndfaW5mb19sb2NhdGlvbjsKKwl1MzIgaTsKKworCW1lbXNldCgmZndfaW5mb19sb2NhdGlvbiwgMCwgc2l6ZW9mKGZ3X2luZm9fbG9jYXRpb24pKTsKKwltZW1zZXQoZndfaW5mbywgMCwgc2l6ZW9mKCpmd19pbmZvKSk7CisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1RPX0RXT1JEUyhzaXplb2YoZndfaW5mb19sb2NhdGlvbikpOworCSAgICAgaSsrLCBhZGRyICs9IEJZVEVTX0lOX0RXT1JEKQorCQlkZXN0W2ldID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIGFkZHIpOworCWlmIChmd19pbmZvX2xvY2F0aW9uLnNpemUgPiAwICYmIGZ3X2luZm9fbG9jYXRpb24uc2l6ZSA8PQorCSAgICBzaXplb2YoKmZ3X2luZm8pKSB7CisJCS8qIFJlYWQgRlcgdmVyc2lvbiBpbmZvIGZyb20gU3Rvcm0gUkFNICovCisJCWFkZHIgPSBmd19pbmZvX2xvY2F0aW9uLmdyY19hZGRyOworCQlkZXN0ID0gKHUzMiAqKWZ3X2luZm87CisJCWZvciAoaSA9IDA7IGkgPCBCWVRFU19UT19EV09SRFMoZndfaW5mb19sb2NhdGlvbi5zaXplKTsKKwkJICAgICBpKyssIGFkZHIgKz0gQllURVNfSU5fRFdPUkQpCisJCQlkZXN0W2ldID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIGFkZHIpOworCX0KK30KKworLyogRHVtcHMgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplCisgKiBpbiBieXRlcyAoYWN0dWFsIGxlbmd0aCArIDEgZm9yIHRoZSBudWxsIGNoYXJhY3RlciB0ZXJtaW5hdGlvbikuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2R1bXBfc3RyKGNoYXIgKmR1bXBfYnVmLCBib29sIGR1bXAsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpZiAoZHVtcCkKKwkJc3RyY3B5KGR1bXBfYnVmLCBzdHIpOworCXJldHVybiAodTMyKXN0cmxlbihzdHIpICsgMTsKK30KKworLyogRHVtcHMgemVyb3MgdG8gYWxpZ24gdGhlIHNwZWNpZmllZCBidWZmZXIgdG8gZHdvcmRzLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZQorICogaW4gYnl0ZXMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2R1bXBfYWxpZ24oY2hhciAqZHVtcF9idWYsIGJvb2wgZHVtcCwgdTMyIGJ5dGVfb2Zmc2V0KQoreworCXU4IG9mZnNldF9pbl9kd29yZCA9ICh1OCkoYnl0ZV9vZmZzZXQgJiAweDMpLCBhbGlnbl9zaXplOworCisJYWxpZ25fc2l6ZSA9IG9mZnNldF9pbl9kd29yZCA/IEJZVEVTX0lOX0RXT1JEIC0gb2Zmc2V0X2luX2R3b3JkIDogMDsKKworCWlmIChkdW1wICYmIGFsaWduX3NpemUpCisJCW1lbXNldChkdW1wX2J1ZiwgMCwgYWxpZ25fc2l6ZSk7CisJcmV0dXJuIGFsaWduX3NpemU7Cit9CisKKy8qIFdyaXRlcyB0aGUgc3BlY2lmaWVkIHN0cmluZyBwYXJhbSB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZHVtcF9zdHJfcGFyYW0odTMyICpkdW1wX2J1ZiwKKwkJCSAgICAgIGJvb2wgZHVtcCwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnBhcmFtX25hbWUsIGNvbnN0IGNoYXIgKnBhcmFtX3ZhbCkKK3sKKwljaGFyICpjaGFyX2J1ZiA9IChjaGFyICopZHVtcF9idWY7CisJdTMyIG9mZnNldCA9IDA7CisKKwkvKiBEdW1wIHBhcmFtIG5hbWUgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyKGNoYXJfYnVmICsgb2Zmc2V0LCBkdW1wLCBwYXJhbV9uYW1lKTsKKworCS8qIEluZGljYXRlIGEgc3RyaW5nIHBhcmFtIHZhbHVlICovCisJaWYgKGR1bXApCisJCSooY2hhcl9idWYgKyBvZmZzZXQpID0gMTsKKwlvZmZzZXQrKzsKKworCS8qIER1bXAgcGFyYW0gdmFsdWUgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyKGNoYXJfYnVmICsgb2Zmc2V0LCBkdW1wLCBwYXJhbV92YWwpOworCisJLyogQWxpZ24gYnVmZmVyIHRvIG5leHQgZHdvcmQgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfYWxpZ24oY2hhcl9idWYgKyBvZmZzZXQsIGR1bXAsIG9mZnNldCk7CisJcmV0dXJuIEJZVEVTX1RPX0RXT1JEUyhvZmZzZXQpOworfQorCisvKiBXcml0ZXMgdGhlIHNwZWNpZmllZCBudW1lcmljIHBhcmFtIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9kdW1wX251bV9wYXJhbSh1MzIgKmR1bXBfYnVmLAorCQkJICAgICAgYm9vbCBkdW1wLCBjb25zdCBjaGFyICpwYXJhbV9uYW1lLCB1MzIgcGFyYW1fdmFsKQoreworCWNoYXIgKmNoYXJfYnVmID0gKGNoYXIgKilkdW1wX2J1ZjsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCS8qIER1bXAgcGFyYW0gbmFtZSAqLworCW9mZnNldCArPSBxZWRfZHVtcF9zdHIoY2hhcl9idWYgKyBvZmZzZXQsIGR1bXAsIHBhcmFtX25hbWUpOworCisJLyogSW5kaWNhdGUgYSBudW1lcmljIHBhcmFtIHZhbHVlICovCisJaWYgKGR1bXApCisJCSooY2hhcl9idWYgKyBvZmZzZXQpID0gMDsKKwlvZmZzZXQrKzsKKworCS8qIEFsaWduIGJ1ZmZlciB0byBuZXh0IGR3b3JkICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX2FsaWduKGNoYXJfYnVmICsgb2Zmc2V0LCBkdW1wLCBvZmZzZXQpOworCisJLyogRHVtcCBwYXJhbSB2YWx1ZSAoYW5kIGNoYW5nZSBvZmZzZXQgZnJvbSBieXRlcyB0byBkd29yZHMpICovCisJb2Zmc2V0ID0gQllURVNfVE9fRFdPUkRTKG9mZnNldCk7CisJaWYgKGR1bXApCisJCSooZHVtcF9idWYgKyBvZmZzZXQpID0gcGFyYW1fdmFsOworCW9mZnNldCsrOworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIFJlYWRzIHRoZSBGVyB2ZXJzaW9uIGFuZCB3cml0ZXMgaXQgYXMgYSBwYXJhbSB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZHVtcF9md192ZXJfcGFyYW0oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwljaGFyIGZ3X3Zlcl9zdHJbMTZdID0gRU1QVFlfRldfVkVSU0lPTl9TVFI7CisJY2hhciBmd19pbWdfc3RyWzE2XSA9IEVNUFRZX0ZXX0lNQUdFX1NUUjsKKwlzdHJ1Y3QgZndfaW5mbyBmd19pbmZvID0geyB7MH0sIHswfSB9OworCWludCBwcmludGVkX2NoYXJzOworCXUzMiBvZmZzZXQgPSAwOworCisJaWYgKGR1bXApIHsKKwkJLyogUmVhZCBGVyBpbWFnZS92ZXJzaW9uIGZyb20gUFJBTSBpbiBhIG5vbi1yZXNldCBTRU1JICovCisJCWJvb2wgZm91bmQgPSBmYWxzZTsKKwkJdTggc3Rvcm1faWQ7CisKKwkJZm9yIChzdG9ybV9pZCA9IDA7IHN0b3JtX2lkIDwgTUFYX0RCR19TVE9STVMgJiYgIWZvdW5kOworCQkgICAgIHN0b3JtX2lkKyspIHsKKwkJCS8qIFJlYWQgRlcgdmVyc2lvbi9pbWFnZSAgKi8KKwkJCWlmICghZGV2X2RhdGEtPmJsb2NrX2luX3Jlc2V0CisJCQkgICAgW3Nfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uYmxvY2tfaWRdKSB7CisJCQkJLyogcmVhZCBGVyBpbmZvIGZvciB0aGUgY3VycmVudCBTdG9ybSAqLworCQkJCXFlZF9yZWFkX2Z3X2luZm8ocF9od2ZuLAorCQkJCQkJIHBfcHR0LCBzdG9ybV9pZCwgJmZ3X2luZm8pOworCisJCQkJLyogQ3JlYXRlIEZXIHZlcnNpb24vaW1hZ2Ugc3RyaW5ncyAqLworCQkJCXByaW50ZWRfY2hhcnMgPQorCQkJCSAgICBzbnByaW50Zihmd192ZXJfc3RyLAorCQkJCQkgICAgIHNpemVvZihmd192ZXJfc3RyKSwKKwkJCQkJICAgICAiJWRfJWRfJWRfJWQiLAorCQkJCQkgICAgIGZ3X2luZm8udmVyLm51bS5tYWpvciwKKwkJCQkJICAgICBmd19pbmZvLnZlci5udW0ubWlub3IsCisJCQkJCSAgICAgZndfaW5mby52ZXIubnVtLnJldiwKKwkJCQkJICAgICBmd19pbmZvLnZlci5udW0uZW5nKTsKKwkJCQlpZiAocHJpbnRlZF9jaGFycyA8IDAgfHwgcHJpbnRlZF9jaGFycyA+PQorCQkJCSAgICBzaXplb2YoZndfdmVyX3N0cikpCisJCQkJCURQX05PVElDRShwX2h3Zm4sCisJCQkJCQkgICJVbmV4cGVjdGVkIGRlYnVnIGVycm9yOiBpbnZhbGlkIEZXIHZlcnNpb24gc3RyaW5nXG4iKTsKKwkJCQlzd2l0Y2ggKGZ3X2luZm8udmVyLmltYWdlX2lkKSB7CisJCQkJY2FzZSBGV19JTUdfTUFJTjoKKwkJCQkJc3RyY3B5KGZ3X2ltZ19zdHIsICJtYWluIik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXN0cmNweShmd19pbWdfc3RyLCAidW5rbm93biIpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlmb3VuZCA9IHRydWU7CisJCQl9CisJCX0KKwl9CisKKwkvKiBEdW1wIEZXIHZlcnNpb24sIGltYWdlIGFuZCB0aW1lc3RhbXAgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgImZ3LXZlcnNpb24iLCBmd192ZXJfc3RyKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgImZ3LWltYWdlIiwgZndfaW1nX3N0cik7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsCisJCQkJICAgICAiZnctdGltZXN0YW1wIiwgZndfaW5mby52ZXIudGltZXN0YW1wKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBSZWFkcyB0aGUgTUZXIHZlcnNpb24gYW5kIHdyaXRlcyBpdCBhcyBhIHBhcmFtIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9kdW1wX21md192ZXJfcGFyYW0oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJY2hhciBtZndfdmVyX3N0clsxNl0gPSBFTVBUWV9GV19WRVJTSU9OX1NUUjsKKworCWlmIChkdW1wKSB7CisJCXUzMiBnbG9iYWxfc2VjdGlvbl9vZmZzaXplLCBnbG9iYWxfc2VjdGlvbl9hZGRyLCBtZndfdmVyOworCQl1MzIgcHVibGljX2RhdGFfYWRkciwgZ2xvYmFsX3NlY3Rpb25fb2Zmc2l6ZV9hZGRyOworCQlpbnQgcHJpbnRlZF9jaGFyczsKKworCQkvKiBGaW5kIE1DUCBwdWJsaWMgZGF0YSBHUkMgYWRkcmVzcy4KKwkJICogTmVlZHMgdG8gYmUgT1JlZCB3aXRoIE1DUF9SRUdfU0NSQVRDSCBkdWUgdG8gYSBIVyBidWcuCisJCSAqLworCQlwdWJsaWNfZGF0YV9hZGRyID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkJCSAgTUlTQ19SRUdfU0hBUkVEX01FTV9BRERSKSB8CisJCQkJCSAgTUNQX1JFR19TQ1JBVENIOworCisJCS8qIEZpbmQgTUNQIHB1YmxpYyBnbG9iYWwgc2VjdGlvbiBvZmZzZXQgKi8KKwkJZ2xvYmFsX3NlY3Rpb25fb2Zmc2l6ZV9hZGRyID0gcHVibGljX2RhdGFfYWRkciArCisJCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBtY3BfcHVibGljX2RhdGEsCisJCQkJCQkgICAgICAgc2VjdGlvbnMpICsKKwkJCQkJICAgICAgc2l6ZW9mKG9mZnNpemVfdCkgKiBQVUJMSUNfR0xPQkFMOworCQlnbG9iYWxfc2VjdGlvbl9vZmZzaXplID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkJCQlnbG9iYWxfc2VjdGlvbl9vZmZzaXplX2FkZHIpOworCQlnbG9iYWxfc2VjdGlvbl9hZGRyID0gTUNQX1JFR19TQ1JBVENIICsKKwkJCQkgICAgICAoZ2xvYmFsX3NlY3Rpb25fb2Zmc2l6ZSAmCisJCQkJICAgICAgIE9GRlNJWkVfT0ZGU0VUX01BU0spICogNDsKKworCQkvKiBSZWFkIE1GVyB2ZXJzaW9uIGZyb20gTUNQIHB1YmxpYyBnbG9iYWwgc2VjdGlvbiAqLworCQltZndfdmVyID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkJIGdsb2JhbF9zZWN0aW9uX2FkZHIgKworCQkJCSBvZmZzZXRvZihzdHJ1Y3QgcHVibGljX2dsb2JhbCwgbWZ3X3ZlcikpOworCisJCS8qIER1bXAgTUZXIHZlcnNpb24gcGFyYW0gKi8KKwkJcHJpbnRlZF9jaGFycyA9IHNucHJpbnRmKG1md192ZXJfc3RyLCBzaXplb2YobWZ3X3Zlcl9zdHIpLAorCQkJCQkgIiVkXyVkXyVkXyVkIiwKKwkJCQkJICh1OCkgKG1md192ZXIgPj4gMjQpLAorCQkJCQkgKHU4KSAobWZ3X3ZlciA+PiAxNiksCisJCQkJCSAodTgpIChtZndfdmVyID4+IDgpLAorCQkJCQkgKHU4KSBtZndfdmVyKTsKKwkJaWYgKHByaW50ZWRfY2hhcnMgPCAwIHx8IHByaW50ZWRfY2hhcnMgPj0gc2l6ZW9mKG1md192ZXJfc3RyKSkKKwkJCURQX05PVElDRShwX2h3Zm4sCisJCQkJICAiVW5leHBlY3RlZCBkZWJ1ZyBlcnJvcjogaW52YWxpZCBNRlcgdmVyc2lvbiBzdHJpbmdcbiIpOworCX0KKworCXJldHVybiBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYsIGR1bXAsICJtZnctdmVyc2lvbiIsIG1md192ZXJfc3RyKTsKK30KKworLyogV3JpdGVzIGEgc2VjdGlvbiBoZWFkZXIgdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2R1bXBfc2VjdGlvbl9oZHIodTMyICpkdW1wX2J1ZiwKKwkJCQlib29sIGR1bXAsIGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBudW1fcGFyYW1zKQoreworCXJldHVybiBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYsIGR1bXAsIG5hbWUsIG51bV9wYXJhbXMpOworfQorCisvKiBXcml0ZXMgdGhlIGNvbW1vbiBnbG9iYWwgcGFyYW1zIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9kdW1wX2NvbW1vbl9nbG9iYWxfcGFyYW1zKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkgdTMyICpkdW1wX2J1ZiwKKwkJCQkJIGJvb2wgZHVtcCwKKwkJCQkJIHU4IG51bV9zcGVjaWZpY19nbG9iYWxfcGFyYW1zKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCS8qIEZpbmQgcGxhdGZvcm0gc3RyaW5nIGFuZCBkdW1wIGdsb2JhbCBwYXJhbXMgc2VjdGlvbiBoZWFkZXIgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsCisJCQkJICAgICAgICJnbG9iYWxfcGFyYW1zIiwKKwkJCQkgICAgICAgTlVNX0NPTU1PTl9HTE9CQUxfUEFSQU1TICsKKwkJCQkgICAgICAgbnVtX3NwZWNpZmljX2dsb2JhbF9wYXJhbXMpOworCisJLyogU3RvcmUgcGFyYW1zICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX2Z3X3Zlcl9wYXJhbShwX2h3Zm4sIHBfcHR0LCBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX21md192ZXJfcGFyYW0ocF9od2ZuLAorCQkJCQkgcF9wdHQsIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgInRvb2xzLXZlcnNpb24iLCBUT09MU19WRVJTSU9OKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwKKwkJCQkgICAgICJjaGlwIiwKKwkJCQkgICAgIHNfY2hpcF9kZWZzW2Rldl9kYXRhLT5jaGlwX2lkXS5uYW1lKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwKKwkJCQkgICAgICJwbGF0Zm9ybSIsCisJCQkJICAgICBzX3BsYXRmb3JtX2RlZnNbZGV2X2RhdGEtPnBsYXRmb3JtX2lkXS4KKwkJCQkgICAgIG5hbWUpOworCW9mZnNldCArPQorCSAgICBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJwY2ktZnVuYyIsCisJCQkgICAgICAgcF9od2ZuLT5hYnNfcGZfaWQpOworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIFdyaXRlcyB0aGUgbGFzdCBzZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGF0IHRoZSBnaXZlbiBvZmZzZXQuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2R1bXBfbGFzdF9zZWN0aW9uKHUzMiAqZHVtcF9idWYsIHUzMiBvZmZzZXQsIGJvb2wgZHVtcCkKK3sKKwl1MzIgc3RhcnRfb2Zmc2V0ID0gb2Zmc2V0LCBjcmMgPSB+MDsKKworCS8qIER1bXAgQ1JDIHNlY3Rpb24gaGVhZGVyICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAibGFzdCIsIDApOworCisJLyogQ2FsY3VsYXRlIENSQzMyIGFuZCBhZGQgaXQgdG8gdGhlIGR3b3JkIGZvbGxvd2luZyB0aGUgImxhc3QiIHNlY3Rpb24uCisJICovCisJaWYgKGR1bXApCisJCSooZHVtcF9idWYgKyBvZmZzZXQpID0gfmNyYzMyKGNyYywgKHU4ICopZHVtcF9idWYsCisJCQkJCSAgICAgIERXT1JEU19UT19CWVRFUyhvZmZzZXQpKTsKKwlvZmZzZXQrKzsKKwlyZXR1cm4gb2Zmc2V0IC0gc3RhcnRfb2Zmc2V0OworfQorCisvKiBVcGRhdGUgYmxvY2tzIHJlc2V0IHN0YXRlICAqLworc3RhdGljIHZvaWQgcWVkX3VwZGF0ZV9ibG9ja3NfcmVzZXRfc3RhdGUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1MzIgcmVnX3ZhbFtNQVhfREJHX1JFU0VUX1JFR1NdID0geyAwIH07CisJdTMyIGk7CisKKwkvKiBSZWFkIHJlc2V0IHJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfREJHX1JFU0VUX1JFR1M7IGkrKykKKwkJaWYgKHNfcmVzZXRfcmVnc19kZWZzW2ldLmV4aXN0c1tkZXZfZGF0YS0+Y2hpcF9pZF0pCisJCQlyZWdfdmFsW2ldID0gcWVkX3JkKHBfaHdmbiwKKwkJCQkJICAgIHBfcHR0LCBzX3Jlc2V0X3JlZ3NfZGVmc1tpXS5hZGRyKTsKKworCS8qIENoZWNrIGlmIGJsb2NrcyBhcmUgaW4gcmVzZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0JMT0NLX0lEOyBpKyspCisJCWRldl9kYXRhLT5ibG9ja19pbl9yZXNldFtpXSA9CisJCSAgICBzX2Jsb2NrX2RlZnNbaV0tPmhhc19yZXNldF9iaXQgJiYKKwkJICAgICEocmVnX3ZhbFtzX2Jsb2NrX2RlZnNbaV0tPnJlc2V0X3JlZ10gJgorCQkgICAgICBCSVQoc19ibG9ja19kZWZzW2ldLT5yZXNldF9iaXRfb2Zmc2V0KSk7Cit9CisKKy8qIEVuYWJsZSAvIGRpc2FibGUgdGhlIERlYnVnIGJsb2NrICovCitzdGF0aWMgdm9pZCBxZWRfYnVzX2VuYWJsZV9kYmdfYmxvY2soc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIGJvb2wgZW5hYmxlKQoreworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBEQkdfUkVHX0RCR19CTE9DS19PTiwgZW5hYmxlID8gMSA6IDApOworfQorCisvKiBSZXNldHMgdGhlIERlYnVnIGJsb2NrICovCitzdGF0aWMgdm9pZCBxZWRfYnVzX3Jlc2V0X2RiZ19ibG9jayhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoreworCXUzMiBkYmdfcmVzZXRfcmVnX2FkZHIsIG9sZF9yZXNldF9yZWdfdmFsLCBuZXdfcmVzZXRfcmVnX3ZhbDsKKworCWRiZ19yZXNldF9yZWdfYWRkciA9CisJCXNfcmVzZXRfcmVnc19kZWZzW3NfYmxvY2tfZGVmc1tCTE9DS19EQkddLT5yZXNldF9yZWddLmFkZHI7CisJb2xkX3Jlc2V0X3JlZ192YWwgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwgZGJnX3Jlc2V0X3JlZ19hZGRyKTsKKwluZXdfcmVzZXRfcmVnX3ZhbCA9IG9sZF9yZXNldF9yZWdfdmFsICYKKwkJCSAgICB+QklUKHNfYmxvY2tfZGVmc1tCTE9DS19EQkddLT5yZXNldF9iaXRfb2Zmc2V0KTsKKworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBkYmdfcmVzZXRfcmVnX2FkZHIsIG5ld19yZXNldF9yZWdfdmFsKTsKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgZGJnX3Jlc2V0X3JlZ19hZGRyLCBvbGRfcmVzZXRfcmVnX3ZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHFlZF9idXNfc2V0X2ZyYW1pbmdfbW9kZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgIGVudW0gZGJnX2J1c19mcmFtZV9tb2RlcyBtb2RlKQoreworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBEQkdfUkVHX0ZSQU1JTkdfTU9ERSwgKHU4KW1vZGUpOworfQorCisvKiBFbmFibGUgLyBkaXNhYmxlIERlYnVnIEJ1cyBjbGllbnRzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIG1hc2suCisgKiAoMSA9IGVuYWJsZSwgMCA9IGRpc2FibGUpCisgKi8KK3N0YXRpYyB2b2lkIHFlZF9idXNfZW5hYmxlX2NsaWVudHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgY2xpZW50X21hc2spCit7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIERCR19SRUdfQ0xJRU5UX0VOQUJMRSwgY2xpZW50X21hc2spOworfQorCitzdGF0aWMgYm9vbCBxZWRfaXNfbW9kZV9tYXRjaChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgdTE2ICptb2Rlc19idWZfb2Zmc2V0KQoreworCWNvbnN0IHUzMiAqcHRyID0gc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX01PREVfVFJFRV0ucHRyOworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1OCB0cmVlX3ZhbCA9ICgodTggKilwdHIpWygqbW9kZXNfYnVmX29mZnNldCkrK107CisJYm9vbCBhcmcxLCBhcmcyOworCisJc3dpdGNoICh0cmVlX3ZhbCkgeworCWNhc2UgSU5JVF9NT0RFX09QX05PVDoKKwkJcmV0dXJuICFxZWRfaXNfbW9kZV9tYXRjaChwX2h3Zm4sIG1vZGVzX2J1Zl9vZmZzZXQpOworCWNhc2UgSU5JVF9NT0RFX09QX09SOgorCWNhc2UgSU5JVF9NT0RFX09QX0FORDoKKwkJYXJnMSA9IHFlZF9pc19tb2RlX21hdGNoKHBfaHdmbiwgbW9kZXNfYnVmX29mZnNldCk7CisJCWFyZzIgPSBxZWRfaXNfbW9kZV9tYXRjaChwX2h3Zm4sIG1vZGVzX2J1Zl9vZmZzZXQpOworCQlyZXR1cm4gKHRyZWVfdmFsID09IElOSVRfTU9ERV9PUF9PUikgPyAoYXJnMSB8fAorCQkJCQkJCWFyZzIpIDogKGFyZzEgJiYgYXJnMik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGRldl9kYXRhLT5tb2RlX2VuYWJsZVt0cmVlX3ZhbCAtIE1BWF9JTklUX01PREVfT1BTXSA+IDA7CisJfQorfQorCisvKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIEdSQyBwYXJhbSAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2dldF9wYXJhbShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgZW51bSBkYmdfZ3JjX3BhcmFtcyBncmNfcGFyYW0pCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCisJcmV0dXJuIGRldl9kYXRhLT5ncmMucGFyYW1fdmFsW2dyY19wYXJhbV07Cit9CisKKy8qIENsZWFyIGFsbCBHUkMgcGFyYW1zICovCitzdGF0aWMgdm9pZCBxZWRfZGJnX2dyY19jbGVhcl9wYXJhbXMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9EQkdfR1JDX1BBUkFNUzsgaSsrKQorCQlkZXZfZGF0YS0+Z3JjLnBhcmFtX3NldF9ieV91c2VyW2ldID0gMDsKK30KKworLyogQXNzaWduIGRlZmF1bHQgR1JDIHBhcmFtIHZhbHVlcyAqLworc3RhdGljIHZvaWQgcWVkX2RiZ19ncmNfc2V0X3BhcmFtc19kZWZhdWx0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1MzIgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfREJHX0dSQ19QQVJBTVM7IGkrKykKKwkJaWYgKCFkZXZfZGF0YS0+Z3JjLnBhcmFtX3NldF9ieV91c2VyW2ldKQorCQkJZGV2X2RhdGEtPmdyYy5wYXJhbV92YWxbaV0gPQorCQkJICAgIHNfZ3JjX3BhcmFtX2RlZnNbaV0uZGVmYXVsdF92YWxbZGV2X2RhdGEtPmNoaXBfaWRdOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBlbnRpdHkgKGluZGljYXRlZCBieSBHUkMgcGFyYW0pIHNob3VsZCBiZQorICogaW5jbHVkZWQgaW4gdGhlIGR1bXAsIGZhbHNlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGJvb2wgcWVkX2dyY19pc19pbmNsdWRlZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQllbnVtIGRiZ19ncmNfcGFyYW1zIGdyY19wYXJhbSkKK3sKKwlyZXR1cm4gcWVkX2dyY19nZXRfcGFyYW0ocF9od2ZuLCBncmNfcGFyYW0pID4gMDsKK30KKworLyogUmV0dXJucyB0cnVlIG9mIHRoZSBzcGVjaWZpZWQgU3Rvcm0gc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBkdW1wLCBmYWxzZQorICogb3RoZXJ3aXNlLgorICovCitzdGF0aWMgYm9vbCBxZWRfZ3JjX2lzX3N0b3JtX2luY2x1ZGVkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIGVudW0gZGJnX3N0b3JtcyBzdG9ybSkKK3sKKwlyZXR1cm4gcWVkX2dyY19nZXRfcGFyYW0ocF9od2ZuLCAoZW51bSBkYmdfZ3JjX3BhcmFtcylzdG9ybSkgPiAwOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBtZW1vcnkgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBkdW1wLCBmYWxzZQorICogb3RoZXJ3aXNlLgorICovCitzdGF0aWMgYm9vbCBxZWRfZ3JjX2lzX21lbV9pbmNsdWRlZChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgZW51bSBibG9ja19pZCBibG9ja19pZCwgdTggbWVtX2dyb3VwX2lkKQoreworCXU4IGk7CisKKwkvKiBDaGVjayBTdG9ybSBtYXRjaCAqLworCWlmIChzX2Jsb2NrX2RlZnNbYmxvY2tfaWRdLT5hc3NvY2lhdGVkX3RvX3N0b3JtICYmCisJICAgICFxZWRfZ3JjX2lzX3N0b3JtX2luY2x1ZGVkKHBfaHdmbiwKKwkJCShlbnVtIGRiZ19zdG9ybXMpc19ibG9ja19kZWZzW2Jsb2NrX2lkXS0+c3Rvcm1faWQpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0JJR19SQU1fVFlQRVM7IGkrKykKKwkJaWYgKG1lbV9ncm91cF9pZCA9PSBzX2JpZ19yYW1fZGVmc1tpXS5tZW1fZ3JvdXBfaWQgfHwKKwkJICAgIG1lbV9ncm91cF9pZCA9PSBzX2JpZ19yYW1fZGVmc1tpXS5yYW1fbWVtX2dyb3VwX2lkKQorCQkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLAorCQkJCQkJICAgc19iaWdfcmFtX2RlZnNbaV0uZ3JjX3BhcmFtKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9QWFBfSUxUIHx8IG1lbV9ncm91cF9pZCA9PQorCSAgICBNRU1fR1JPVVBfUFhQX01FTSkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfUFhQKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9SQU0pCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1JBTSk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfUEJVRikKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfUEJVRik7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfQ0FVX01FTSB8fAorCSAgICBtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX0NBVV9TQiB8fAorCSAgICBtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX0NBVV9QSSkKKwkJcmV0dXJuIHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfQ0FVKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9RTV9NRU0pCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1FNKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9DT05OX0NGQ19NRU0gfHwKKwkgICAgbWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9UQVNLX0NGQ19NRU0pCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX0NGQyk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfSUdVX01FTSB8fCBtZW1fZ3JvdXBfaWQgPT0KKwkgICAgTUVNX0dST1VQX0lHVV9NU0lYKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9JR1UpOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX01VTERfTUVNKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9NVUxEKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9QUlNfTUVNKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9QUlMpOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX0RNQUVfTUVNKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9ETUFFKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9UTV9NRU0pCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1RNKTsKKwlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9TRE1fTUVNKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9TRE0pOworCWlmIChtZW1fZ3JvdXBfaWQgPT0gTUVNX0dST1VQX1RESUZfQ1RYIHx8IG1lbV9ncm91cF9pZCA9PQorCSAgICBNRU1fR1JPVVBfUkRJRl9DVFgpCisJCXJldHVybiBxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX0RJRik7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfQ01fTUVNKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9DTSk7CisJaWYgKG1lbV9ncm91cF9pZCA9PSBNRU1fR1JPVVBfSU9SKQorCQlyZXR1cm4gcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9JT1IpOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qIFN0YWxscyBhbGwgU3Rvcm1zICovCitzdGF0aWMgdm9pZCBxZWRfZ3JjX3N0YWxsX3N0b3JtcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCBib29sIHN0YWxsKQoreworCXU4IHJlZ192YWwgPSBzdGFsbCA/IDEgOiAwOworCXU4IHN0b3JtX2lkOworCisJZm9yIChzdG9ybV9pZCA9IDA7IHN0b3JtX2lkIDwgTUFYX0RCR19TVE9STVM7IHN0b3JtX2lkKyspIHsKKwkJaWYgKHFlZF9ncmNfaXNfc3Rvcm1faW5jbHVkZWQocF9od2ZuLAorCQkJCQkgICAgICAoZW51bSBkYmdfc3Rvcm1zKXN0b3JtX2lkKSkgeworCQkJdTMyIHJlZ19hZGRyID0KKwkJCSAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLnNlbV9mYXN0X21lbV9hZGRyICsKKwkJCSAgICBTRU1fRkFTVF9SRUdfU1RBTExfMDsKKworCQkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIHJlZ19hZGRyLCByZWdfdmFsKTsKKwkJfQorCX0KKworCW1zbGVlcChTVEFMTF9ERUxBWV9NUyk7Cit9CisKKy8qIFRha2VzIGFsbCBibG9ja3Mgb3V0IG9mIHJlc2V0ICovCitzdGF0aWMgdm9pZCBxZWRfZ3JjX3VucmVzZXRfYmxvY2tzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTMyIHJlZ192YWxbTUFYX0RCR19SRVNFVF9SRUdTXSA9IHsgMCB9OworCXUzMiBpOworCisJLyogRmlsbCByZXNldCByZWdzIHZhbHVlcyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQkxPQ0tfSUQ7IGkrKykKKwkJaWYgKHNfYmxvY2tfZGVmc1tpXS0+aGFzX3Jlc2V0X2JpdCAmJiBzX2Jsb2NrX2RlZnNbaV0tPnVucmVzZXQpCisJCQlyZWdfdmFsW3NfYmxvY2tfZGVmc1tpXS0+cmVzZXRfcmVnXSB8PQorCQkJICAgIEJJVChzX2Jsb2NrX2RlZnNbaV0tPnJlc2V0X2JpdF9vZmZzZXQpOworCisJLyogV3JpdGUgcmVzZXQgcmVnaXN0ZXJzICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9EQkdfUkVTRVRfUkVHUzsgaSsrKSB7CisJCWlmIChzX3Jlc2V0X3JlZ3NfZGVmc1tpXS5leGlzdHNbZGV2X2RhdGEtPmNoaXBfaWRdKSB7CisJCQlyZWdfdmFsW2ldIHw9IHNfcmVzZXRfcmVnc19kZWZzW2ldLnVucmVzZXRfdmFsOworCQkJaWYgKHJlZ192YWxbaV0pCisJCQkJcWVkX3dyKHBfaHdmbiwKKwkJCQkgICAgICAgcF9wdHQsCisJCQkJICAgICAgIHNfcmVzZXRfcmVnc19kZWZzW2ldLmFkZHIgKworCQkJCSAgICAgICBSRVNFVF9SRUdfVU5SRVNFVF9PRkZTRVQsIHJlZ192YWxbaV0pOworCQl9CisJfQorfQorCisvKiBSZXR1cm5zIHRoZSBhdHRlbnRpb24gbmFtZSBvZmZzZXRzIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGJnX2F0dG5fYmxvY2tfdHlwZV9kYXRhICoKK3FlZF9nZXRfYmxvY2tfYXR0bl9kYXRhKGVudW0gYmxvY2tfaWQgYmxvY2tfaWQsIGVudW0gZGJnX2F0dG5fdHlwZSBhdHRuX3R5cGUpCit7CisJY29uc3Qgc3RydWN0IGRiZ19hdHRuX2Jsb2NrICpiYXNlX2F0dG5fYmxvY2tfYXJyID0KKwkJKGNvbnN0IHN0cnVjdCBkYmdfYXR0bl9ibG9jayAqKQorCQlzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfQVRUTl9CTE9DS1NdLnB0cjsKKworCXJldHVybiAmYmFzZV9hdHRuX2Jsb2NrX2FycltibG9ja19pZF0ucGVyX3R5cGVfZGF0YVthdHRuX3R5cGVdOworfQorCisvKiBSZXR1cm5zIHRoZSBhdHRlbnRpb24gcmVnaXN0ZXJzIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGJnX2F0dG5fcmVnICoKK3FlZF9nZXRfYmxvY2tfYXR0bl9yZWdzKGVudW0gYmxvY2tfaWQgYmxvY2tfaWQsIGVudW0gZGJnX2F0dG5fdHlwZSBhdHRuX3R5cGUsCisJCQl1OCAqbnVtX2F0dG5fcmVncykKK3sKKwljb25zdCBzdHJ1Y3QgZGJnX2F0dG5fYmxvY2tfdHlwZV9kYXRhICpibG9ja190eXBlX2RhdGEgPQorCQlxZWRfZ2V0X2Jsb2NrX2F0dG5fZGF0YShibG9ja19pZCwgYXR0bl90eXBlKTsKKworCSpudW1fYXR0bl9yZWdzID0gYmxvY2tfdHlwZV9kYXRhLT5udW1fcmVnczsKKwlyZXR1cm4gJigoY29uc3Qgc3RydWN0IGRiZ19hdHRuX3JlZyAqKQorCQkgc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0FUVE5fUkVHU10ucHRyKVtibG9ja190eXBlX2RhdGEtPgorCQkJCQkJCSAgcmVnc19vZmZzZXRdOworfQorCisvKiBGb3IgZWFjaCBibG9jaywgY2xlYXIgdGhlIHN0YXR1cyBvZiBhbGwgcGFyaXRpZXMgKi8KK3N0YXRpYyB2b2lkIHFlZF9ncmNfY2xlYXJfYWxsX3BydHkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1OCByZWdfaWR4LCBudW1fYXR0bl9yZWdzOworCXUzMiBibG9ja19pZDsKKworCWZvciAoYmxvY2tfaWQgPSAwOyBibG9ja19pZCA8IE1BWF9CTE9DS19JRDsgYmxvY2tfaWQrKykgeworCQljb25zdCBzdHJ1Y3QgZGJnX2F0dG5fcmVnICphdHRuX3JlZ19hcnI7CisKKwkJaWYgKGRldl9kYXRhLT5ibG9ja19pbl9yZXNldFtibG9ja19pZF0pCisJCQljb250aW51ZTsKKworCQlhdHRuX3JlZ19hcnIgPSBxZWRfZ2V0X2Jsb2NrX2F0dG5fcmVncygoZW51bSBibG9ja19pZClibG9ja19pZCwKKwkJCQkJCSAgICAgICBBVFROX1RZUEVfUEFSSVRZLAorCQkJCQkJICAgICAgICZudW1fYXR0bl9yZWdzKTsKKwkJZm9yIChyZWdfaWR4ID0gMDsgcmVnX2lkeCA8IG51bV9hdHRuX3JlZ3M7IHJlZ19pZHgrKykgeworCQkJY29uc3Qgc3RydWN0IGRiZ19hdHRuX3JlZyAqcmVnX2RhdGEgPQorCQkJCSZhdHRuX3JlZ19hcnJbcmVnX2lkeF07CisKKwkJCS8qIENoZWNrIG1vZGUgKi8KKwkJCWJvb2wgZXZhbF9tb2RlID0gR0VUX0ZJRUxEKHJlZ19kYXRhLT5tb2RlLmRhdGEsCisJCQkJCQkgICBEQkdfTU9ERV9IRFJfRVZBTF9NT0RFKSA+IDA7CisJCQl1MTYgbW9kZXNfYnVmX29mZnNldCA9CisJCQkJR0VUX0ZJRUxEKHJlZ19kYXRhLT5tb2RlLmRhdGEsCisJCQkJCSAgREJHX01PREVfSERSX01PREVTX0JVRl9PRkZTRVQpOworCisJCQlpZiAoIWV2YWxfbW9kZSB8fAorCQkJICAgIHFlZF9pc19tb2RlX21hdGNoKHBfaHdmbiwgJm1vZGVzX2J1Zl9vZmZzZXQpKQorCQkJCS8qIE1vZGUgbWF0Y2ggLSByZWFkIHBhcml0eSBzdGF0dXMgcmVhZC1jbGVhcgorCQkJCSAqIHJlZ2lzdGVyLgorCQkJCSAqLworCQkJCXFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJCSAgICAgICBEV09SRFNfVE9fQllURVMocmVnX2RhdGEtPgorCQkJCQkJICAgICAgIHN0c19jbHJfYWRkcmVzcykpOworCQl9CisJfQorfQorCisvKiBEdW1wcyBHUkMgcmVnaXN0ZXJzIHNlY3Rpb24gaGVhZGVyLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIGR1bXBlZDoKKyAqIC0gJ2NvdW50JyA9IG51bV9kdW1wZWRfZW50cmllcworICogLSAnc3BsaXQnID0gc3BsaXRfdHlwZQorICogLSAnaWQnaSA9IHNwbGl0X2lkIChkdW1wZWQgb25seSBpZiBzcGxpdF9pZCA+PSAwKQorICogLSAncGFyYW1fbmFtZScgPSBwYXJhbV92YWwgKHVzZXIgcGFyYW0sIGR1bXBlZCBvbmx5IGlmIHBhcmFtX25hbWUgIT0gTlVMTCBhbmQKKyAqCXBhcmFtX3ZhbCAhPSBOVUxMKQorICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9yZWdzX2hkcih1MzIgKmR1bXBfYnVmLAorCQkJCSBib29sIGR1bXAsCisJCQkJIHUzMiBudW1fcmVnX2VudHJpZXMsCisJCQkJIGNvbnN0IGNoYXIgKnNwbGl0X3R5cGUsCisJCQkJIGludCBzcGxpdF9pZCwKKwkJCQkgY29uc3QgY2hhciAqcGFyYW1fbmFtZSwgY29uc3QgY2hhciAqcGFyYW1fdmFsKQoreworCXU4IG51bV9wYXJhbXMgPSAyICsgKHNwbGl0X2lkID49IDAgPyAxIDogMCkgKyAocGFyYW1fbmFtZSA/IDEgOiAwKTsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCW9mZnNldCArPSBxZWRfZHVtcF9zZWN0aW9uX2hkcihkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwgImdyY19yZWdzIiwgbnVtX3BhcmFtcyk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJjb3VudCIsIG51bV9yZWdfZW50cmllcyk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJzcGxpdCIsIHNwbGl0X3R5cGUpOworCWlmIChzcGxpdF9pZCA+PSAwKQorCQlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgIGR1bXAsICJpZCIsIHNwbGl0X2lkKTsKKwlpZiAocGFyYW1fbmFtZSAmJiBwYXJhbV92YWwpCisJCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgZHVtcCwgcGFyYW1fbmFtZSwgcGFyYW1fdmFsKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBHUkMgcmVnaXN0ZXIvbWVtb3J5LiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9yZWdfZW50cnkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqZHVtcF9idWYsCisJCQkJICBib29sIGR1bXAsIHUzMiBhZGRyLCB1MzIgbGVuKQoreworCXUzMiBvZmZzZXQgPSAwLCBpOworCisJaWYgKGR1bXApIHsKKwkJKihkdW1wX2J1ZiArIG9mZnNldCsrKSA9IGFkZHIgfCAobGVuIDw8IFJFR19EVU1QX0xFTl9TSElGVCk7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKywgYWRkcisrLCBvZmZzZXQrKykKKwkJCSooZHVtcF9idWYgKyBvZmZzZXQpID0gcWVkX3JkKHBfaHdmbiwKKwkJCQkJCSAgICAgIHBfcHR0LAorCQkJCQkJICAgICAgRFdPUkRTX1RPX0JZVEVTKGFkZHIpKTsKKwl9IGVsc2UgeworCQlvZmZzZXQgKz0gbGVuICsgMTsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBHUkMgcmVnaXN0ZXJzIGVudHJpZXMuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3JlZ3NfZW50cmllcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgIHN0cnVjdCBkYmdfYXJyYXkgaW5wdXRfcmVnc19hcnIsCisJCQkJICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgICAgYm9vbCBkdW1wLAorCQkJCSAgICAgYm9vbCBibG9ja19lbmFibGVbTUFYX0JMT0NLX0lEXSwKKwkJCQkgICAgIHUzMiAqbnVtX2R1bXBlZF9yZWdfZW50cmllcykKK3sKKwl1MzIgaSwgb2Zmc2V0ID0gMCwgaW5wdXRfb2Zmc2V0ID0gMDsKKwlib29sIG1vZGVfbWF0Y2ggPSB0cnVlOworCisJKm51bV9kdW1wZWRfcmVnX2VudHJpZXMgPSAwOworCXdoaWxlIChpbnB1dF9vZmZzZXQgPCBpbnB1dF9yZWdzX2Fyci5zaXplX2luX2R3b3JkcykgeworCQljb25zdCBzdHJ1Y3QgZGJnX2R1bXBfY29uZF9oZHIgKmNvbmRfaGRyID0KKwkJICAgIChjb25zdCBzdHJ1Y3QgZGJnX2R1bXBfY29uZF9oZHIgKikKKwkJICAgICZpbnB1dF9yZWdzX2Fyci5wdHJbaW5wdXRfb2Zmc2V0KytdOworCQlib29sIGV2YWxfbW9kZSA9IEdFVF9GSUVMRChjb25kX2hkci0+bW9kZS5kYXRhLAorCQkJCQkgICBEQkdfTU9ERV9IRFJfRVZBTF9NT0RFKSA+IDA7CisKKwkJLyogQ2hlY2sgbW9kZS9ibG9jayAqLworCQlpZiAoZXZhbF9tb2RlKSB7CisJCQl1MTYgbW9kZXNfYnVmX29mZnNldCA9CisJCQkJR0VUX0ZJRUxEKGNvbmRfaGRyLT5tb2RlLmRhdGEsCisJCQkJCSAgREJHX01PREVfSERSX01PREVTX0JVRl9PRkZTRVQpOworCQkJbW9kZV9tYXRjaCA9IHFlZF9pc19tb2RlX21hdGNoKHBfaHdmbiwKKwkJCQkJCSAgICAgICAmbW9kZXNfYnVmX29mZnNldCk7CisJCX0KKworCQlpZiAobW9kZV9tYXRjaCAmJiBibG9ja19lbmFibGVbY29uZF9oZHItPmJsb2NrX2lkXSkgeworCQkJZm9yIChpID0gMDsgaSA8IGNvbmRfaGRyLT5kYXRhX3NpemU7CisJCQkgICAgIGkrKywgaW5wdXRfb2Zmc2V0KyspIHsKKwkJCQljb25zdCBzdHJ1Y3QgZGJnX2R1bXBfcmVnICpyZWcgPQorCQkJCSAgICAoY29uc3Qgc3RydWN0IGRiZ19kdW1wX3JlZyAqKQorCQkJCSAgICAmaW5wdXRfcmVnc19hcnIucHRyW2lucHV0X29mZnNldF07CisKKwkJCQlvZmZzZXQgKz0KKwkJCQkJcWVkX2dyY19kdW1wX3JlZ19lbnRyeShwX2h3Zm4sIHBfcHR0LAorCQkJCQkJICAgIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLAorCQkJCQkJICAgIEdFVF9GSUVMRChyZWctPmRhdGEsCisJCQkJCQkJREJHX0RVTVBfUkVHX0FERFJFU1MpLAorCQkJCQkJICAgIEdFVF9GSUVMRChyZWctPmRhdGEsCisJCQkJCQkJREJHX0RVTVBfUkVHX0xFTkdUSCkpOworCQkJCSgqbnVtX2R1bXBlZF9yZWdfZW50cmllcykrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlucHV0X29mZnNldCArPSBjb25kX2hkci0+ZGF0YV9zaXplOworCQl9CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgR1JDIHJlZ2lzdGVycyBlbnRyaWVzLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9zcGxpdF9kYXRhKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICBzdHJ1Y3QgZGJnX2FycmF5IGlucHV0X3JlZ3NfYXJyLAorCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgYm9vbCBkdW1wLAorCQkJCSAgIGJvb2wgYmxvY2tfZW5hYmxlW01BWF9CTE9DS19JRF0sCisJCQkJICAgY29uc3QgY2hhciAqc3BsaXRfdHlwZV9uYW1lLAorCQkJCSAgIHUzMiBzcGxpdF9pZCwKKwkJCQkgICBjb25zdCBjaGFyICpwYXJhbV9uYW1lLAorCQkJCSAgIGNvbnN0IGNoYXIgKnBhcmFtX3ZhbCkKK3sKKwl1MzIgbnVtX2R1bXBlZF9yZWdfZW50cmllcywgb2Zmc2V0OworCisJLyogQ2FsY3VsYXRlIHJlZ2lzdGVyIGR1bXAgaGVhZGVyIHNpemUgKGFuZCBza2lwIGl0IGZvciBub3cpICovCisJb2Zmc2V0ID0gcWVkX2dyY19kdW1wX3JlZ3NfaGRyKGR1bXBfYnVmLAorCQkJCSAgICAgICBmYWxzZSwKKwkJCQkgICAgICAgMCwKKwkJCQkgICAgICAgc3BsaXRfdHlwZV9uYW1lLAorCQkJCSAgICAgICBzcGxpdF9pZCwgcGFyYW1fbmFtZSwgcGFyYW1fdmFsKTsKKworCS8qIER1bXAgcmVnaXN0ZXJzICovCisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZWdzX2VudHJpZXMocF9od2ZuLAorCQkJCQkgICAgcF9wdHQsCisJCQkJCSAgICBpbnB1dF9yZWdzX2FyciwKKwkJCQkJICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgZHVtcCwKKwkJCQkJICAgIGJsb2NrX2VuYWJsZSwKKwkJCQkJICAgICZudW1fZHVtcGVkX3JlZ19lbnRyaWVzKTsKKworCS8qIFdyaXRlIHJlZ2lzdGVyIGR1bXAgaGVhZGVyICovCisJaWYgKGR1bXAgJiYgbnVtX2R1bXBlZF9yZWdfZW50cmllcyA+IDApCisJCXFlZF9ncmNfZHVtcF9yZWdzX2hkcihkdW1wX2J1ZiwKKwkJCQkgICAgICBkdW1wLAorCQkJCSAgICAgIG51bV9kdW1wZWRfcmVnX2VudHJpZXMsCisJCQkJICAgICAgc3BsaXRfdHlwZV9uYW1lLAorCQkJCSAgICAgIHNwbGl0X2lkLCBwYXJhbV9uYW1lLCBwYXJhbV92YWwpOworCisJcmV0dXJuIG51bV9kdW1wZWRfcmVnX2VudHJpZXMgPiAwID8gb2Zmc2V0IDogMDsKK30KKworLyogRHVtcHMgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB0aGUgaW5wdXQgcmVnaXN0ZXJzIGFycmF5LgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9yZWdpc3RlcnMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgYm9vbCBkdW1wLAorCQkJCSAgYm9vbCBibG9ja19lbmFibGVbTUFYX0JMT0NLX0lEXSwKKwkJCQkgIGNvbnN0IGNoYXIgKnBhcmFtX25hbWUsIGNvbnN0IGNoYXIgKnBhcmFtX3ZhbCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTMyIG9mZnNldCA9IDAsIGlucHV0X29mZnNldCA9IDA7CisJdTggcG9ydF9pZCwgcGZfaWQ7CisKKwlpZiAoZHVtcCkKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIFFFRF9NU0dfREVCVUcsICJEdW1waW5nIHJlZ2lzdGVycy4uLlxuIik7CisJd2hpbGUgKGlucHV0X29mZnNldCA8CisJICAgICAgIHNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19EVU1QX1JFR10uc2l6ZV9pbl9kd29yZHMpIHsKKwkJY29uc3Qgc3RydWN0IGRiZ19kdW1wX3NwbGl0X2hkciAqc3BsaXRfaGRyID0KKwkJCShjb25zdCBzdHJ1Y3QgZGJnX2R1bXBfc3BsaXRfaGRyICopCisJCQkmc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0RVTVBfUkVHXS5wdHJbaW5wdXRfb2Zmc2V0KytdOworCQl1OCBzcGxpdF90eXBlX2lkID0gR0VUX0ZJRUxEKHNwbGl0X2hkci0+aGRyLAorCQkJCQkgICAgIERCR19EVU1QX1NQTElUX0hEUl9TUExJVF9UWVBFX0lEKTsKKwkJdTMyIHNwbGl0X2RhdGFfc2l6ZSA9IEdFVF9GSUVMRChzcGxpdF9oZHItPmhkciwKKwkJCQkJCURCR19EVU1QX1NQTElUX0hEUl9EQVRBX1NJWkUpOworCQlzdHJ1Y3QgZGJnX2FycmF5IGN1cnJfaW5wdXRfcmVnc19hcnIgPSB7CisJCQkmc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0RVTVBfUkVHXS5wdHJbaW5wdXRfb2Zmc2V0XSwKKwkJCXNwbGl0X2RhdGFfc2l6ZX07CisKKwkJc3dpdGNoIChzcGxpdF90eXBlX2lkKSB7CisJCWNhc2UgU1BMSVRfVFlQRV9OT05FOgorCQljYXNlIFNQTElUX1RZUEVfVkY6CisJCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3NwbGl0X2RhdGEocF9od2ZuLAorCQkJCQkJCSAgcF9wdHQsCisJCQkJCQkJICBjdXJyX2lucHV0X3JlZ3NfYXJyLAorCQkJCQkJCSAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCQkJICBkdW1wLAorCQkJCQkJCSAgYmxvY2tfZW5hYmxlLAorCQkJCQkJCSAgImVuZyIsCisJCQkJCQkJICAodTMyKSgtMSksCisJCQkJCQkJICBwYXJhbV9uYW1lLAorCQkJCQkJCSAgcGFyYW1fdmFsKTsKKwkJCWJyZWFrOworCQljYXNlIFNQTElUX1RZUEVfUE9SVDoKKwkJCWZvciAocG9ydF9pZCA9IDA7CisJCQkgICAgIHBvcnRfaWQgPAorCQkJICAgICBzX2NoaXBfZGVmc1tkZXZfZGF0YS0+Y2hpcF9pZF0uCisJCQkgICAgIHBlcl9wbGF0Zm9ybVtkZXZfZGF0YS0+cGxhdGZvcm1faWRdLm51bV9wb3J0czsKKwkJCSAgICAgcG9ydF9pZCsrKSB7CisJCQkJaWYgKGR1bXApCisJCQkJCXFlZF9wb3J0X3ByZXRlbmQocF9od2ZuLCBwX3B0dCwKKwkJCQkJCQkgcG9ydF9pZCk7CisJCQkJb2Zmc2V0ICs9CisJCQkJICAgIHFlZF9ncmNfZHVtcF9zcGxpdF9kYXRhKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkJICAgIGN1cnJfaW5wdXRfcmVnc19hcnIsCisJCQkJCQkJICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkJCSAgICBkdW1wLCBibG9ja19lbmFibGUsCisJCQkJCQkJICAgICJwb3J0IiwgcG9ydF9pZCwKKwkJCQkJCQkgICAgcGFyYW1fbmFtZSwKKwkJCQkJCQkgICAgcGFyYW1fdmFsKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNQTElUX1RZUEVfUEY6CisJCWNhc2UgU1BMSVRfVFlQRV9QT1JUX1BGOgorCQkJZm9yIChwZl9pZCA9IDA7CisJCQkgICAgIHBmX2lkIDwKKwkJCSAgICAgc19jaGlwX2RlZnNbZGV2X2RhdGEtPmNoaXBfaWRdLgorCQkJICAgICBwZXJfcGxhdGZvcm1bZGV2X2RhdGEtPnBsYXRmb3JtX2lkXS5udW1fcGZzOworCQkJICAgICBwZl9pZCsrKSB7CisJCQkJaWYgKGR1bXApCisJCQkJCXFlZF9maWRfcHJldGVuZChwX2h3Zm4sIHBfcHR0LCBwZl9pZCk7CisJCQkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9zcGxpdF9kYXRhKHBfaHdmbiwKKwkJCQkJCQlwX3B0dCwKKwkJCQkJCQljdXJyX2lucHV0X3JlZ3NfYXJyLAorCQkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkJCWR1bXAsIGJsb2NrX2VuYWJsZSwKKwkJCQkJCQkicGYiLCBwZl9pZCwgcGFyYW1fbmFtZSwKKwkJCQkJCQlwYXJhbV92YWwpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlucHV0X29mZnNldCArPSBzcGxpdF9kYXRhX3NpemU7CisJfQorCisJLyogUHJldGVuZCB0byBvcmlnaW5hbCBQRiAqLworCWlmIChkdW1wKQorCQlxZWRfZmlkX3ByZXRlbmQocF9od2ZuLCBwX3B0dCwgcF9od2ZuLT5yZWxfcGZfaWQpOworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXAgcmVzZXQgcmVnaXN0ZXJzLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9yZXNldF9yZWdzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXUzMiBpLCBvZmZzZXQgPSAwLCBudW1fcmVncyA9IDA7CisKKwkvKiBDYWxjdWxhdGUgaGVhZGVyIHNpemUgKi8KKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JlZ3NfaGRyKGR1bXBfYnVmLAorCQkJCQlmYWxzZSwgMCwgImVuZyIsIC0xLCBOVUxMLCBOVUxMKTsKKworCS8qIFdyaXRlIHJlc2V0IHJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfREJHX1JFU0VUX1JFR1M7IGkrKykgeworCQlpZiAoc19yZXNldF9yZWdzX2RlZnNbaV0uZXhpc3RzW2Rldl9kYXRhLT5jaGlwX2lkXSkgeworCQkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZWdfZW50cnkocF9od2ZuLAorCQkJCQkJCSBwX3B0dCwKKwkJCQkJCQkgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCQkJIGR1bXAsCisJCQkJCQkJIEJZVEVTX1RPX0RXT1JEUworCQkJCQkJCSAoc19yZXNldF9yZWdzX2RlZnMKKwkJCQkJCQkgIFtpXS5hZGRyKSwgMSk7CisJCQludW1fcmVncysrOworCQl9CisJfQorCisJLyogV3JpdGUgaGVhZGVyICovCisJaWYgKGR1bXApCisJCXFlZF9ncmNfZHVtcF9yZWdzX2hkcihkdW1wX2J1ZiwKKwkJCQkgICAgICB0cnVlLCBudW1fcmVncywgImVuZyIsIC0xLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wIHJlZ2lzdGVycyB0aGF0IGFyZSBtb2RpZmllZCBkdXJpbmcgR1JDIER1bXAgYW5kIHRoZXJlZm9yZSBtdXN0IGJlIGR1bXBlZAorICogZmlyc3QuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfbW9kaWZpZWRfcmVncyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICAgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1MzIgb2Zmc2V0ID0gMCwgbnVtX3JlZ19lbnRyaWVzID0gMCwgYmxvY2tfaWQ7CisJdTggc3Rvcm1faWQsIHJlZ19pZHgsIG51bV9hdHRuX3JlZ3M7CisKKwkvKiBDYWxjdWxhdGUgaGVhZGVyIHNpemUgKi8KKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JlZ3NfaGRyKGR1bXBfYnVmLAorCQkJCQlmYWxzZSwgMCwgImVuZyIsIC0xLCBOVUxMLCBOVUxMKTsKKworCS8qIFdyaXRlIHBhcml0eSByZWdpc3RlcnMgKi8KKwlmb3IgKGJsb2NrX2lkID0gMDsgYmxvY2tfaWQgPCBNQVhfQkxPQ0tfSUQ7IGJsb2NrX2lkKyspIHsKKwkJY29uc3Qgc3RydWN0IGRiZ19hdHRuX3JlZyAqYXR0bl9yZWdfYXJyOworCisJCWlmIChkZXZfZGF0YS0+YmxvY2tfaW5fcmVzZXRbYmxvY2tfaWRdICYmIGR1bXApCisJCQljb250aW51ZTsKKworCQlhdHRuX3JlZ19hcnIgPSBxZWRfZ2V0X2Jsb2NrX2F0dG5fcmVncygoZW51bSBibG9ja19pZClibG9ja19pZCwKKwkJCQkJCSAgICAgICBBVFROX1RZUEVfUEFSSVRZLAorCQkJCQkJICAgICAgICZudW1fYXR0bl9yZWdzKTsKKwkJZm9yIChyZWdfaWR4ID0gMDsgcmVnX2lkeCA8IG51bV9hdHRuX3JlZ3M7IHJlZ19pZHgrKykgeworCQkJY29uc3Qgc3RydWN0IGRiZ19hdHRuX3JlZyAqcmVnX2RhdGEgPQorCQkJCSZhdHRuX3JlZ19hcnJbcmVnX2lkeF07CisJCQl1MTYgbW9kZXNfYnVmX29mZnNldDsKKwkJCWJvb2wgZXZhbF9tb2RlOworCisJCQkvKiBDaGVjayBtb2RlICovCisJCQlldmFsX21vZGUgPSBHRVRfRklFTEQocmVnX2RhdGEtPm1vZGUuZGF0YSwKKwkJCQkJICAgICAgREJHX01PREVfSERSX0VWQUxfTU9ERSkgPiAwOworCQkJbW9kZXNfYnVmX29mZnNldCA9CisJCQkJR0VUX0ZJRUxEKHJlZ19kYXRhLT5tb2RlLmRhdGEsCisJCQkJCSAgREJHX01PREVfSERSX01PREVTX0JVRl9PRkZTRVQpOworCQkJaWYgKCFldmFsX21vZGUgfHwKKwkJCSAgICBxZWRfaXNfbW9kZV9tYXRjaChwX2h3Zm4sICZtb2Rlc19idWZfb2Zmc2V0KSkgeworCQkJCS8qIE1vZGUgbWF0Y2ggLSByZWFkIGFuZCBkdW1wIHJlZ2lzdGVycyAqLworCQkJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVnX2VudHJ5KHBfaHdmbiwKKwkJCQkJCQlwX3B0dCwKKwkJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJCQlkdW1wLAorCQkJCQkJCXJlZ19kYXRhLT5tYXNrX2FkZHJlc3MsCisJCQkJCQkJMSk7CisJCQkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZWdfZW50cnkocF9od2ZuLAorCQkJCQkJcF9wdHQsCisJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJCWR1bXAsCisJCQkJCQlHRVRfRklFTEQocmVnX2RhdGEtPmRhdGEsCisJCQkJCQkgICAgREJHX0FUVE5fUkVHX1NUU19BRERSRVNTKSwKKwkJCQkJCTEpOworCQkJCW51bV9yZWdfZW50cmllcyArPSAyOworCQkJfQorCQl9CisJfQorCisJLyogV3JpdGUgc3Rvcm0gc3RhbGwgc3RhdHVzIHJlZ2lzdGVycyAqLworCWZvciAoc3Rvcm1faWQgPSAwOyBzdG9ybV9pZCA8IE1BWF9EQkdfU1RPUk1TOyBzdG9ybV9pZCsrKSB7CisJCWlmIChkZXZfZGF0YS0+YmxvY2tfaW5fcmVzZXRbc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5ibG9ja19pZF0gJiYKKwkJICAgIGR1bXApCisJCQljb250aW51ZTsKKworCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JlZ19lbnRyeShwX2h3Zm4sCisJCQkJCXBfcHR0LAorCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJZHVtcCwKKwkJCQkJQllURVNfVE9fRFdPUkRTKHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uCisJCQkJCQkJc2VtX2Zhc3RfbWVtX2FkZHIgKworCQkJCQkJCVNFTV9GQVNUX1JFR19TVEFMTEVEKSwKKwkJCQkJMSk7CisJCW51bV9yZWdfZW50cmllcysrOworCX0KKworCS8qIFdyaXRlIGhlYWRlciAqLworCWlmIChkdW1wKQorCQlxZWRfZ3JjX2R1bXBfcmVnc19oZHIoZHVtcF9idWYsCisJCQkJICAgICAgdHJ1ZSwKKwkJCQkgICAgICBudW1fcmVnX2VudHJpZXMsICJlbmciLCAtMSwgTlVMTCwgTlVMTCk7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgYSBHUkMgbWVtb3J5IGhlYWRlciAoc2VjdGlvbiBhbmQgcGFyYW1zKS4KKyAqIFRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgZHVtcGVkOgorICogbmFtZSAtIG5hbWUgaXMgZHVtcGVkIG9ubHkgaWYgaXQncyBub3QgTlVMTC4KKyAqIGFkZHIgLSBieXRlX2FkZHIgaXMgZHVtcGVkIG9ubHkgaWYgbmFtZSBpcyBOVUxMLgorICogbGVuIC0gZHdvcmRfbGVuIGlzIGFsd2F5cyBkdW1wZWQuCisgKiB3aWR0aCAtIGJpdF93aWR0aCBpcyBkdW1wZWQgaWYgaXQncyBub3QgemVyby4KKyAqIHBhY2tlZCAtIHBhY2tlZD0xIGlzIGR1bXBlZCBpZiBpdCdzIG5vdCBmYWxzZS4KKyAqIG1lbV9ncm91cCAtIG1lbV9ncm91cCBpcyBhbHdheXMgZHVtcGVkLgorICogaXNfc3Rvcm0gLSB0cnVlIG9ubHkgaWYgdGhlIG1lbW9yeSBpcyByZWxhdGVkIHRvIGEgU3Rvcm0uCisgKiBzdG9ybV9sZXR0ZXIgLSBzdG9ybSBsZXR0ZXIgKHZhbGlkIG9ubHkgaWYgaXNfc3Rvcm0gaXMgdHJ1ZSkuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX21lbV9oZHIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJdTMyICpkdW1wX2J1ZiwKKwkJCQlib29sIGR1bXAsCisJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCQl1MzIgYnl0ZV9hZGRyLAorCQkJCXUzMiBkd29yZF9sZW4sCisJCQkJdTMyIGJpdF93aWR0aCwKKwkJCQlib29sIHBhY2tlZCwKKwkJCQljb25zdCBjaGFyICptZW1fZ3JvdXAsCisJCQkJYm9vbCBpc19zdG9ybSwgY2hhciBzdG9ybV9sZXR0ZXIpCit7CisJdTggbnVtX3BhcmFtcyA9IDM7CisJdTMyIG9mZnNldCA9IDA7CisJY2hhciBidWZbNjRdOworCisJaWYgKCFkd29yZF9sZW4pCisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJVbmV4cGVjdGVkIEdSQyBEdW1wIGVycm9yOiBkdW1wZWQgbWVtb3J5IHNpemUgbXVzdCBiZSBub24temVyb1xuIik7CisJaWYgKGJpdF93aWR0aCkKKwkJbnVtX3BhcmFtcysrOworCWlmIChwYWNrZWQpCisJCW51bV9wYXJhbXMrKzsKKworCS8qIER1bXAgc2VjdGlvbiBoZWFkZXIgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsICJncmNfbWVtIiwgbnVtX3BhcmFtcyk7CisJaWYgKG5hbWUpIHsKKwkJLyogRHVtcCBuYW1lICovCisJCWlmIChpc19zdG9ybSkgeworCQkJc3RyY3B5KGJ1ZiwgIj9TVE9STV8iKTsKKwkJCWJ1ZlswXSA9IHN0b3JtX2xldHRlcjsKKwkJCXN0cmNweShidWYgKyBzdHJsZW4oYnVmKSwgbmFtZSk7CisJCX0gZWxzZSB7CisJCQlzdHJjcHkoYnVmLCBuYW1lKTsKKwkJfQorCisJCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgZHVtcCwgIm5hbWUiLCBidWYpOworCQlpZiAoZHVtcCkKKwkJCURQX1ZFUkJPU0UocF9od2ZuLAorCQkJCSAgIFFFRF9NU0dfREVCVUcsCisJCQkJICAgIkR1bXBpbmcgJWQgcmVnaXN0ZXJzIGZyb20gJXMuLi5cbiIsCisJCQkJICAgZHdvcmRfbGVuLCBidWYpOworCX0gZWxzZSB7CisJCS8qIER1bXAgYWRkcmVzcyAqLworCQlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgIGR1bXAsICJhZGRyIiwgYnl0ZV9hZGRyKTsKKwkJaWYgKGR1bXAgJiYgZHdvcmRfbGVuID4gNjQpCisJCQlEUF9WRVJCT1NFKHBfaHdmbiwKKwkJCQkgICBRRURfTVNHX0RFQlVHLAorCQkJCSAgICJEdW1waW5nICVkIHJlZ2lzdGVycyBmcm9tIGFkZHJlc3MgMHgleC4uLlxuIiwKKwkJCQkgICBkd29yZF9sZW4sIGJ5dGVfYWRkcik7CisJfQorCisJLyogRHVtcCBsZW4gKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAibGVuIiwgZHdvcmRfbGVuKTsKKworCS8qIER1bXAgYml0IHdpZHRoICovCisJaWYgKGJpdF93aWR0aCkKKwkJb2Zmc2V0ICs9IHFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICBkdW1wLCAid2lkdGgiLCBiaXRfd2lkdGgpOworCisJLyogRHVtcCBwYWNrZWQgKi8KKwlpZiAocGFja2VkKQorCQlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgIGR1bXAsICJwYWNrZWQiLCAxKTsKKworCS8qIER1bXAgcmVnIHR5cGUgKi8KKwlpZiAoaXNfc3Rvcm0pIHsKKwkJc3RyY3B5KGJ1ZiwgIj9TVE9STV8iKTsKKwkJYnVmWzBdID0gc3Rvcm1fbGV0dGVyOworCQlzdHJjcHkoYnVmICsgc3RybGVuKGJ1ZiksIG1lbV9ncm91cCk7CisJfSBlbHNlIHsKKwkJc3RyY3B5KGJ1ZiwgbWVtX2dyb3VwKTsKKwl9CisKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAidHlwZSIsIGJ1Zik7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgYSBzaW5nbGUgR1JDIG1lbW9yeS4gSWYgbmFtZSBpcyBOVUxMLCB0aGUgbWVtb3J5IGlzIHN0b3JlZCBieSBhZGRyZXNzLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9tZW0oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJICAgIHUzMiAqZHVtcF9idWYsCisJCQkgICAgYm9vbCBkdW1wLAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgdTMyIGJ5dGVfYWRkciwKKwkJCSAgICB1MzIgZHdvcmRfbGVuLAorCQkJICAgIHUzMiBiaXRfd2lkdGgsCisJCQkgICAgYm9vbCBwYWNrZWQsCisJCQkgICAgY29uc3QgY2hhciAqbWVtX2dyb3VwLAorCQkJICAgIGJvb2wgaXNfc3Rvcm0sIGNoYXIgc3Rvcm1fbGV0dGVyKQoreworCXUzMiBvZmZzZXQgPSAwOworCisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW1faGRyKHBfaHdmbiwKKwkJCQkgICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsCisJCQkJICAgICAgIG5hbWUsCisJCQkJICAgICAgIGJ5dGVfYWRkciwKKwkJCQkgICAgICAgZHdvcmRfbGVuLAorCQkJCSAgICAgICBiaXRfd2lkdGgsCisJCQkJICAgICAgIHBhY2tlZCwKKwkJCQkgICAgICAgbWVtX2dyb3VwLCBpc19zdG9ybSwgc3Rvcm1fbGV0dGVyKTsKKwlpZiAoZHVtcCkgeworCQl1MzIgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgZHdvcmRfbGVuOworCQkgICAgIGkrKywgYnl0ZV9hZGRyICs9IEJZVEVTX0lOX0RXT1JELCBvZmZzZXQrKykKKwkJCSooZHVtcF9idWYgKyBvZmZzZXQpID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIGJ5dGVfYWRkcik7CisJfSBlbHNlIHsKKwkJb2Zmc2V0ICs9IGR3b3JkX2xlbjsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBHUkMgbWVtb3JpZXMgZW50cmllcy4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfbWVtX2VudHJpZXMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgc3RydWN0IGRiZ19hcnJheSBpbnB1dF9tZW1zX2FyciwKKwkJCQkgICAgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXUzMiBpLCBvZmZzZXQgPSAwLCBpbnB1dF9vZmZzZXQgPSAwOworCWJvb2wgbW9kZV9tYXRjaCA9IHRydWU7CisKKwl3aGlsZSAoaW5wdXRfb2Zmc2V0IDwgaW5wdXRfbWVtc19hcnIuc2l6ZV9pbl9kd29yZHMpIHsKKwkJY29uc3Qgc3RydWN0IGRiZ19kdW1wX2NvbmRfaGRyICpjb25kX2hkcjsKKwkJdTMyIG51bV9lbnRyaWVzOworCQlib29sIGV2YWxfbW9kZTsKKworCQljb25kX2hkciA9IChjb25zdCBzdHJ1Y3QgZGJnX2R1bXBfY29uZF9oZHIgKikKKwkJCSAgICZpbnB1dF9tZW1zX2Fyci5wdHJbaW5wdXRfb2Zmc2V0KytdOworCQlldmFsX21vZGUgPSBHRVRfRklFTEQoY29uZF9oZHItPm1vZGUuZGF0YSwKKwkJCQkgICAgICBEQkdfTU9ERV9IRFJfRVZBTF9NT0RFKSA+IDA7CisKKwkJLyogQ2hlY2sgcmVxdWlyZWQgbW9kZSAqLworCQlpZiAoZXZhbF9tb2RlKSB7CisJCQl1MTYgbW9kZXNfYnVmX29mZnNldCA9CisJCQkJR0VUX0ZJRUxEKGNvbmRfaGRyLT5tb2RlLmRhdGEsCisJCQkJCSAgREJHX01PREVfSERSX01PREVTX0JVRl9PRkZTRVQpOworCisJCQltb2RlX21hdGNoID0gcWVkX2lzX21vZGVfbWF0Y2gocF9od2ZuLAorCQkJCQkJICAgICAgICZtb2Rlc19idWZfb2Zmc2V0KTsKKwkJfQorCisJCWlmICghbW9kZV9tYXRjaCkgeworCQkJaW5wdXRfb2Zmc2V0ICs9IGNvbmRfaGRyLT5kYXRhX3NpemU7CisJCQljb250aW51ZTsKKwkJfQorCisJCW51bV9lbnRyaWVzID0gY29uZF9oZHItPmRhdGFfc2l6ZSAvIE1FTV9EVU1QX0VOVFJZX1NJWkVfRFdPUkRTOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7CisJCSAgICAgaSsrLCBpbnB1dF9vZmZzZXQgKz0gTUVNX0RVTVBfRU5UUllfU0laRV9EV09SRFMpIHsKKwkJCWNvbnN0IHN0cnVjdCBkYmdfZHVtcF9tZW0gKm1lbSA9CisJCQkJKGNvbnN0IHN0cnVjdCBkYmdfZHVtcF9tZW0gKikKKwkJCQkmaW5wdXRfbWVtc19hcnIucHRyW2lucHV0X29mZnNldF07CisJCQl1OCBtZW1fZ3JvdXBfaWQ7CisKKwkJCW1lbV9ncm91cF9pZCA9IEdFVF9GSUVMRChtZW0tPmR3b3JkMCwKKwkJCQkJCSBEQkdfRFVNUF9NRU1fTUVNX0dST1VQX0lEKTsKKwkJCWlmIChtZW1fZ3JvdXBfaWQgPj0gTUVNX0dST1VQU19OVU0pIHsKKwkJCQlEUF9OT1RJQ0UocF9od2ZuLCAiSW52YWxpZCBtZW1fZ3JvdXBfaWRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAocWVkX2dyY19pc19tZW1faW5jbHVkZWQocF9od2ZuLAorCQkJCQkoZW51bSBibG9ja19pZCljb25kX2hkci0+YmxvY2tfaWQsCisJCQkJCW1lbV9ncm91cF9pZCkpIHsKKwkJCQl1MzIgbWVtX2J5dGVfYWRkciA9CisJCQkJCURXT1JEU19UT19CWVRFUyhHRVRfRklFTEQobWVtLT5kd29yZDAsCisJCQkJCQkJREJHX0RVTVBfTUVNX0FERFJFU1MpKTsKKwkJCQl1MzIgbWVtX2xlbiA9IEdFVF9GSUVMRChtZW0tPmR3b3JkMSwKKwkJCQkJCQlEQkdfRFVNUF9NRU1fTEVOR1RIKTsKKwkJCQljaGFyIHN0b3JtX2xldHRlciA9ICdhJzsKKwkJCQlib29sIGlzX3N0b3JtID0gZmFsc2U7CisKKwkJCQkvKiBVcGRhdGUgbWVtb3J5IGxlbmd0aCBmb3IgQ0NGQy9UQ0ZDIG1lbW9yaWVzCisJCQkJICogYWNjb3JkaW5nIHRvIG51bWJlciBvZiBMQ0lEcy9MVElEcy4KKwkJCQkgKi8KKwkJCQlpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9DT05OX0NGQ19NRU0pCisJCQkJCW1lbV9sZW4gPSBxZWRfZ3JjX2dldF9wYXJhbShwX2h3Zm4sCisJCQkJCQkJREJHX0dSQ19QQVJBTV9OVU1fTENJRFMpCisJCQkJCQkJKiAobWVtX2xlbiAvIE1BWF9MQ0lEUyk7CisJCQkJZWxzZSBpZiAobWVtX2dyb3VwX2lkID09IE1FTV9HUk9VUF9UQVNLX0NGQ19NRU0pCisJCQkJCW1lbV9sZW4gPSBxZWRfZ3JjX2dldF9wYXJhbShwX2h3Zm4sCisJCQkJCQkJREJHX0dSQ19QQVJBTV9OVU1fTFRJRFMpCisJCQkJCQkJKiAobWVtX2xlbiAvIE1BWF9MVElEUyk7CisKKwkJCQkvKiBJZiBtZW1vcnkgaXMgYXNzb2NpYXRlZCB3aXRoIFN0b3JtLCB1cGRhdGUKKwkJCQkgKiBTdG9ybSBkZXRhaWxzLgorCQkJCSAqLworCQkJCWlmIChzX2Jsb2NrX2RlZnNbY29uZF9oZHItPmJsb2NrX2lkXS0+CisJCQkJCQkJYXNzb2NpYXRlZF90b19zdG9ybSkgeworCQkJCQlpc19zdG9ybSA9IHRydWU7CisJCQkJCXN0b3JtX2xldHRlciA9CisJCQkJCQlzX3N0b3JtX2RlZnNbc19ibG9ja19kZWZzWworCQkJCQkJY29uZF9oZHItPmJsb2NrX2lkXS0+CisJCQkJCQlzdG9ybV9pZF0ubGV0dGVyOworCQkJCX0KKworCQkJCS8qIER1bXAgbWVtb3J5ICovCisJCQkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW0ocF9od2ZuLCBwX3B0dCwKKwkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCBOVUxMLAorCQkJCQkJbWVtX2J5dGVfYWRkciwgbWVtX2xlbiwgMCwKKwkJCQkJCWZhbHNlLAorCQkJCQkJc19tZW1fZ3JvdXBfbmFtZXNbbWVtX2dyb3VwX2lkXSwKKwkJCQkJCWlzX3N0b3JtLCBzdG9ybV9sZXR0ZXIpOworCQkJCX0KKwkJCX0KKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBHUkMgbWVtb3JpZXMgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCBhcnJheSBkdW1wX21lbS4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfbWVtb3JpZXMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXUzMiBvZmZzZXQgPSAwLCBpbnB1dF9vZmZzZXQgPSAwOworCisJd2hpbGUgKGlucHV0X29mZnNldCA8CisJICAgICAgIHNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19EVU1QX01FTV0uc2l6ZV9pbl9kd29yZHMpIHsKKwkJY29uc3Qgc3RydWN0IGRiZ19kdW1wX3NwbGl0X2hkciAqc3BsaXRfaGRyID0KKwkJCShjb25zdCBzdHJ1Y3QgZGJnX2R1bXBfc3BsaXRfaGRyICopCisJCQkmc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0RVTVBfTUVNXS5wdHJbaW5wdXRfb2Zmc2V0KytdOworCQl1OCBzcGxpdF90eXBlX2lkID0gR0VUX0ZJRUxEKHNwbGl0X2hkci0+aGRyLAorCQkJCQkgICAgIERCR19EVU1QX1NQTElUX0hEUl9TUExJVF9UWVBFX0lEKTsKKwkJdTMyIHNwbGl0X2RhdGFfc2l6ZSA9IEdFVF9GSUVMRChzcGxpdF9oZHItPmhkciwKKwkJCQkJCURCR19EVU1QX1NQTElUX0hEUl9EQVRBX1NJWkUpOworCQlzdHJ1Y3QgZGJnX2FycmF5IGN1cnJfaW5wdXRfbWVtc19hcnIgPSB7CisJCQkmc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0RVTVBfTUVNXS5wdHJbaW5wdXRfb2Zmc2V0XSwKKwkJCXNwbGl0X2RhdGFfc2l6ZX07CisKKwkJc3dpdGNoIChzcGxpdF90eXBlX2lkKSB7CisJCWNhc2UgU1BMSVRfVFlQRV9OT05FOgorCQkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW1fZW50cmllcyhwX2h3Zm4sCisJCQkJCQkJICAgcF9wdHQsCisJCQkJCQkJICAgY3Vycl9pbnB1dF9tZW1zX2FyciwKKwkJCQkJCQkgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJCQkgICBkdW1wKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCQkgICJEdW1waW5nIHNwbGl0IG1lbW9yaWVzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaW5wdXRfb2Zmc2V0ICs9IHNwbGl0X2RhdGFfc2l6ZTsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBHUkMgY29udGV4dCBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIFN0b3JtLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9jdHhfZGF0YShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSB1MzIgKmR1bXBfYnVmLAorCQkJCSBib29sIGR1bXAsCisJCQkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIHUzMiBudW1fbGlkcywKKwkJCQkgdTMyIGxpZF9zaXplLAorCQkJCSB1MzIgcmRfcmVnX2FkZHIsCisJCQkJIHU4IHN0b3JtX2lkKQoreworCXUzMiBpLCBsaWQsIHRvdGFsX3NpemU7CisJdTMyIG9mZnNldCA9IDA7CisKKwlpZiAoIWxpZF9zaXplKQorCQlyZXR1cm4gMDsKKwlsaWRfc2l6ZSAqPSBCWVRFU19JTl9EV09SRDsKKwl0b3RhbF9zaXplID0gbnVtX2xpZHMgKiBsaWRfc2l6ZTsKKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbV9oZHIocF9od2ZuLAorCQkJCSAgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgICAgZHVtcCwKKwkJCQkgICAgICAgbmFtZSwKKwkJCQkgICAgICAgMCwKKwkJCQkgICAgICAgdG90YWxfc2l6ZSwKKwkJCQkgICAgICAgbGlkX3NpemUgKiAzMiwKKwkJCQkgICAgICAgZmFsc2UsCisJCQkJICAgICAgIG5hbWUsCisJCQkJICAgICAgIHRydWUsIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0ubGV0dGVyKTsKKworCS8qIER1bXAgY29udGV4dCBkYXRhICovCisJaWYgKGR1bXApIHsKKwkJZm9yIChsaWQgPSAwOyBsaWQgPCBudW1fbGlkczsgbGlkKyspIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBsaWRfc2l6ZTsgaSsrLCBvZmZzZXQrKykgeworCQkJCXFlZF93cihwX2h3Zm4sCisJCQkJICAgICAgIHBfcHR0LAorCQkJCSAgICAgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLmNtX2N0eF93cl9hZGRyLAorCQkJCSAgICAgICBCSVQoOSkgfCBsaWQpOworCQkJCSooZHVtcF9idWYgKyBvZmZzZXQpID0gcWVkX3JkKHBfaHdmbiwKKwkJCQkJCQkgICAgICBwX3B0dCwKKwkJCQkJCQkgICAgICByZF9yZWdfYWRkcik7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlvZmZzZXQgKz0gdG90YWxfc2l6ZTsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBHUkMgY29udGV4dHMuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX2N0eChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwl1MzIgb2Zmc2V0ID0gMDsKKwl1OCBzdG9ybV9pZDsKKworCWZvciAoc3Rvcm1faWQgPSAwOyBzdG9ybV9pZCA8IE1BWF9EQkdfU1RPUk1TOyBzdG9ybV9pZCsrKSB7CisJCWlmICghcWVkX2dyY19pc19zdG9ybV9pbmNsdWRlZChwX2h3Zm4sCisJCQkJCSAgICAgICAoZW51bSBkYmdfc3Rvcm1zKXN0b3JtX2lkKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIER1bXAgQ29ubiBBRyBjb250ZXh0IHNpemUgKi8KKwkJb2Zmc2V0ICs9CisJCQlxZWRfZ3JjX2R1bXBfY3R4X2RhdGEocF9od2ZuLAorCQkJCQkgICAgICBwX3B0dCwKKwkJCQkJICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgIGR1bXAsCisJCQkJCSAgICAgICJDT05OX0FHX0NUWCIsCisJCQkJCSAgICAgIHFlZF9ncmNfZ2V0X3BhcmFtKHBfaHdmbiwKKwkJCQkJCSAgICBEQkdfR1JDX1BBUkFNX05VTV9MQ0lEUyksCisJCQkJCSAgICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uCisJCQkJCQkgICAgY21fY29ubl9hZ19jdHhfbGlkX3NpemUsCisJCQkJCSAgICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uCisJCQkJCQkgICAgY21fY29ubl9hZ19jdHhfcmRfYWRkciwKKwkJCQkJICAgICAgc3Rvcm1faWQpOworCisJCS8qIER1bXAgQ29ubiBTVCBjb250ZXh0IHNpemUgKi8KKwkJb2Zmc2V0ICs9CisJCQlxZWRfZ3JjX2R1bXBfY3R4X2RhdGEocF9od2ZuLAorCQkJCQkgICAgICBwX3B0dCwKKwkJCQkJICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgIGR1bXAsCisJCQkJCSAgICAgICJDT05OX1NUX0NUWCIsCisJCQkJCSAgICAgIHFlZF9ncmNfZ2V0X3BhcmFtKHBfaHdmbiwKKwkJCQkJCSAgICBEQkdfR1JDX1BBUkFNX05VTV9MQ0lEUyksCisJCQkJCSAgICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uCisJCQkJCQkgICAgY21fY29ubl9zdF9jdHhfbGlkX3NpemUsCisJCQkJCSAgICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uCisJCQkJCQkgICAgY21fY29ubl9zdF9jdHhfcmRfYWRkciwKKwkJCQkJICAgICAgc3Rvcm1faWQpOworCisJCS8qIER1bXAgVGFzayBBRyBjb250ZXh0IHNpemUgKi8KKwkJb2Zmc2V0ICs9CisJCQlxZWRfZ3JjX2R1bXBfY3R4X2RhdGEocF9od2ZuLAorCQkJCQkgICAgICBwX3B0dCwKKwkJCQkJICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgIGR1bXAsCisJCQkJCSAgICAgICJUQVNLX0FHX0NUWCIsCisJCQkJCSAgICAgIHFlZF9ncmNfZ2V0X3BhcmFtKHBfaHdmbiwKKwkJCQkJCSAgICBEQkdfR1JDX1BBUkFNX05VTV9MVElEUyksCisJCQkJCSAgICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uCisJCQkJCQkgICAgY21fdGFza19hZ19jdHhfbGlkX3NpemUsCisJCQkJCSAgICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uCisJCQkJCQkgICAgY21fdGFza19hZ19jdHhfcmRfYWRkciwKKwkJCQkJICAgICAgc3Rvcm1faWQpOworCisJCS8qIER1bXAgVGFzayBTVCBjb250ZXh0IHNpemUgKi8KKwkJb2Zmc2V0ICs9CisJCQlxZWRfZ3JjX2R1bXBfY3R4X2RhdGEocF9od2ZuLAorCQkJCQkgICAgICBwX3B0dCwKKwkJCQkJICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCSAgICAgIGR1bXAsCisJCQkJCSAgICAgICJUQVNLX1NUX0NUWCIsCisJCQkJCSAgICAgIHFlZF9ncmNfZ2V0X3BhcmFtKHBfaHdmbiwKKwkJCQkJCSAgICBEQkdfR1JDX1BBUkFNX05VTV9MVElEUyksCisJCQkJCSAgICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uCisJCQkJCQkgICAgY21fdGFza19zdF9jdHhfbGlkX3NpemUsCisJCQkJCSAgICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uCisJCQkJCQkgICAgY21fdGFza19zdF9jdHhfcmRfYWRkciwKKwkJCQkJICAgICAgc3Rvcm1faWQpOworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIEdSQyBJT1JzIGRhdGEuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX2lvcnMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCWNoYXIgYnVmWzEwXSA9ICJJT1JfU0VUXz8iOworCXU4IHN0b3JtX2lkLCBzZXRfaWQ7CisJdTMyIG9mZnNldCA9IDA7CisKKwlmb3IgKHN0b3JtX2lkID0gMDsgc3Rvcm1faWQgPCBNQVhfREJHX1NUT1JNUzsgc3Rvcm1faWQrKykgeworCQlpZiAocWVkX2dyY19pc19zdG9ybV9pbmNsdWRlZChwX2h3Zm4sCisJCQkJCSAgICAgIChlbnVtIGRiZ19zdG9ybXMpc3Rvcm1faWQpKSB7CisJCQlmb3IgKHNldF9pZCA9IDA7IHNldF9pZCA8IE5VTV9JT1JfU0VUUzsgc2V0X2lkKyspIHsKKwkJCQl1MzIgYWRkciA9CisJCQkJICAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uc2VtX2Zhc3RfbWVtX2FkZHIgKworCQkJCSAgICBTRU1fRkFTVF9SRUdfU1RPUk1fUkVHX0ZJTEUgKworCQkJCSAgICBEV09SRFNfVE9fQllURVMoSU9SX1NFVF9PRkZTRVQoc2V0X2lkKSk7CisKKwkJCQlidWZbc3RybGVuKGJ1ZikgLSAxXSA9ICcwJyArIHNldF9pZDsKKwkJCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbShwX2h3Zm4sCisJCQkJCQkJICAgcF9wdHQsCisJCQkJCQkJICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCQkJICAgZHVtcCwKKwkJCQkJCQkgICBidWYsCisJCQkJCQkJICAgYWRkciwKKwkJCQkJCQkgICBJT1JTX1BFUl9TRVQsCisJCQkJCQkJICAgMzIsCisJCQkJCQkJICAgZmFsc2UsCisJCQkJCQkJICAgImlvciIsCisJCQkJCQkJICAgdHJ1ZSwKKwkJCQkJCQkgICBzX3N0b3JtX2RlZnMKKwkJCQkJCQkgICBbc3Rvcm1faWRdLmxldHRlcik7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wIFZGQyBDQU0uIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3ZmY19jYW0oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCXUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCwgdTggc3Rvcm1faWQpCit7CisJdTMyIHRvdGFsX3NpemUgPSBWRkNfQ0FNX05VTV9ST1dTICogVkZDX0NBTV9SRVNQX0RXT1JEUzsKKwl1MzIgY2FtX2FkZHJbVkZDX0NBTV9BRERSX0RXT1JEU10gPSB7IDAgfTsKKwl1MzIgY2FtX2NtZFtWRkNfQ0FNX0NNRF9EV09SRFNdID0geyAwIH07CisJdTMyIG9mZnNldCA9IDA7CisJdTMyIHJvdywgaTsKKworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtX2hkcihwX2h3Zm4sCisJCQkJICAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLAorCQkJCSAgICAgICAidmZjX2NhbSIsCisJCQkJICAgICAgIDAsCisJCQkJICAgICAgIHRvdGFsX3NpemUsCisJCQkJICAgICAgIDI1NiwKKwkJCQkgICAgICAgZmFsc2UsCisJCQkJICAgICAgICJ2ZmNfY2FtIiwKKwkJCQkgICAgICAgdHJ1ZSwgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5sZXR0ZXIpOworCWlmIChkdW1wKSB7CisJCS8qIFByZXBhcmUgQ0FNIGFkZHJlc3MgKi8KKwkJU0VUX1ZBUl9GSUVMRChjYW1fYWRkciwgVkZDX0NBTV9BRERSLCBPUCwgVkZDX09QQ09ERV9DQU1fUkQpOworCQlmb3IgKHJvdyA9IDA7IHJvdyA8IFZGQ19DQU1fTlVNX1JPV1M7CisJCSAgICAgcm93KyssIG9mZnNldCArPSBWRkNfQ0FNX1JFU1BfRFdPUkRTKSB7CisJCQkvKiBXcml0ZSBWRkMgQ0FNIGNvbW1hbmQgKi8KKwkJCVNFVF9WQVJfRklFTEQoY2FtX2NtZCwgVkZDX0NBTV9DTUQsIFJPVywgcm93KTsKKwkJCUFSUl9SRUdfV1IocF9od2ZuLAorCQkJCSAgIHBfcHR0LAorCQkJCSAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uc2VtX2Zhc3RfbWVtX2FkZHIgKworCQkJCSAgIFNFTV9GQVNUX1JFR19WRkNfREFUQV9XUiwKKwkJCQkgICBjYW1fY21kLCBWRkNfQ0FNX0NNRF9EV09SRFMpOworCisJCQkvKiBXcml0ZSBWRkMgQ0FNIGFkZHJlc3MgKi8KKwkJCUFSUl9SRUdfV1IocF9od2ZuLAorCQkJCSAgIHBfcHR0LAorCQkJCSAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uc2VtX2Zhc3RfbWVtX2FkZHIgKworCQkJCSAgIFNFTV9GQVNUX1JFR19WRkNfQUREUiwKKwkJCQkgICBjYW1fYWRkciwgVkZDX0NBTV9BRERSX0RXT1JEUyk7CisKKwkJCS8qIFJlYWQgVkZDIENBTSByZWFkIHJlc3BvbnNlICovCisJCQlBUlJfUkVHX1JEKHBfaHdmbiwKKwkJCQkgICBwX3B0dCwKKwkJCQkgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLnNlbV9mYXN0X21lbV9hZGRyICsKKwkJCQkgICBTRU1fRkFTVF9SRUdfVkZDX0RBVEFfUkQsCisJCQkJICAgZHVtcF9idWYgKyBvZmZzZXQsIFZGQ19DQU1fUkVTUF9EV09SRFMpOworCQl9CisJfSBlbHNlIHsKKwkJb2Zmc2V0ICs9IHRvdGFsX3NpemU7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcCBWRkMgUkFNLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF92ZmNfcmFtKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQl1MzIgKmR1bXBfYnVmLAorCQkJCWJvb2wgZHVtcCwKKwkJCQl1OCBzdG9ybV9pZCwgc3RydWN0IHZmY19yYW1fZGVmcyAqcmFtX2RlZnMpCit7CisJdTMyIHRvdGFsX3NpemUgPSByYW1fZGVmcy0+bnVtX3Jvd3MgKiBWRkNfUkFNX1JFU1BfRFdPUkRTOworCXUzMiByYW1fYWRkcltWRkNfUkFNX0FERFJfRFdPUkRTXSA9IHsgMCB9OworCXUzMiByYW1fY21kW1ZGQ19SQU1fQ01EX0RXT1JEU10gPSB7IDAgfTsKKwl1MzIgb2Zmc2V0ID0gMDsKKwl1MzIgcm93LCBpOworCisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW1faGRyKHBfaHdmbiwKKwkJCQkgICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsCisJCQkJICAgICAgIHJhbV9kZWZzLT5tZW1fbmFtZSwKKwkJCQkgICAgICAgMCwKKwkJCQkgICAgICAgdG90YWxfc2l6ZSwKKwkJCQkgICAgICAgMjU2LAorCQkJCSAgICAgICBmYWxzZSwKKwkJCQkgICAgICAgcmFtX2RlZnMtPnR5cGVfbmFtZSwKKwkJCQkgICAgICAgdHJ1ZSwgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5sZXR0ZXIpOworCisJLyogUHJlcGFyZSBSQU0gYWRkcmVzcyAqLworCVNFVF9WQVJfRklFTEQocmFtX2FkZHIsIFZGQ19SQU1fQUREUiwgT1AsIFZGQ19PUENPREVfUkFNX1JEKTsKKworCWlmICghZHVtcCkKKwkJcmV0dXJuIG9mZnNldCArIHRvdGFsX3NpemU7CisKKwlmb3IgKHJvdyA9IHJhbV9kZWZzLT5iYXNlX3JvdzsKKwkgICAgIHJvdyA8IHJhbV9kZWZzLT5iYXNlX3JvdyArIHJhbV9kZWZzLT5udW1fcm93czsKKwkgICAgIHJvdysrLCBvZmZzZXQgKz0gVkZDX1JBTV9SRVNQX0RXT1JEUykgeworCQkvKiBXcml0ZSBWRkMgUkFNIGNvbW1hbmQgKi8KKwkJQVJSX1JFR19XUihwX2h3Zm4sCisJCQkgICBwX3B0dCwKKwkJCSAgIHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uc2VtX2Zhc3RfbWVtX2FkZHIgKworCQkJICAgU0VNX0ZBU1RfUkVHX1ZGQ19EQVRBX1dSLAorCQkJICAgcmFtX2NtZCwgVkZDX1JBTV9DTURfRFdPUkRTKTsKKworCQkvKiBXcml0ZSBWRkMgUkFNIGFkZHJlc3MgKi8KKwkJU0VUX1ZBUl9GSUVMRChyYW1fYWRkciwgVkZDX1JBTV9BRERSLCBST1csIHJvdyk7CisJCUFSUl9SRUdfV1IocF9od2ZuLAorCQkJICAgcF9wdHQsCisJCQkgICBzX3N0b3JtX2RlZnNbc3Rvcm1faWRdLnNlbV9mYXN0X21lbV9hZGRyICsKKwkJCSAgIFNFTV9GQVNUX1JFR19WRkNfQUREUiwKKwkJCSAgIHJhbV9hZGRyLCBWRkNfUkFNX0FERFJfRFdPUkRTKTsKKworCQkvKiBSZWFkIFZGQyBSQU0gcmVhZCByZXNwb25zZSAqLworCQlBUlJfUkVHX1JEKHBfaHdmbiwKKwkJCSAgIHBfcHR0LAorCQkJICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5zZW1fZmFzdF9tZW1fYWRkciArCisJCQkgICBTRU1fRkFTVF9SRUdfVkZDX0RBVEFfUkQsCisJCQkgICBkdW1wX2J1ZiArIG9mZnNldCwgVkZDX1JBTV9SRVNQX0RXT1JEUyk7CisJfQorCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRHVtcHMgR1JDIFZGQyBkYXRhLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF92ZmMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXU4IHN0b3JtX2lkLCBpOworCXUzMiBvZmZzZXQgPSAwOworCisJZm9yIChzdG9ybV9pZCA9IDA7IHN0b3JtX2lkIDwgTUFYX0RCR19TVE9STVM7IHN0b3JtX2lkKyspIHsKKwkJaWYgKHFlZF9ncmNfaXNfc3Rvcm1faW5jbHVkZWQocF9od2ZuLAorCQkJCQkgICAgICAoZW51bSBkYmdfc3Rvcm1zKXN0b3JtX2lkKSAmJgorCQkgICAgc19zdG9ybV9kZWZzW3N0b3JtX2lkXS5oYXNfdmZjICYmCisJCSAgICAoc3Rvcm1faWQgIT0gREJHX1BTVE9STV9JRCB8fAorCQkgICAgIGRldl9kYXRhLT5wbGF0Zm9ybV9pZCA9PSBQTEFURk9STV9BU0lDKSkgeworCQkJLyogUmVhZCBDQU0gKi8KKwkJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfdmZjX2NhbShwX2h3Zm4sCisJCQkJCQkgICAgICAgcF9wdHQsCisJCQkJCQkgICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJCQkgICAgICAgZHVtcCwgc3Rvcm1faWQpOworCisJCQkvKiBSZWFkIFJBTSAqLworCQkJZm9yIChpID0gMDsgaSA8IE5VTV9WRkNfUkFNX1RZUEVTOyBpKyspCisJCQkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF92ZmNfcmFtKHBfaHdmbiwKKwkJCQkJCQkgICAgICAgcF9wdHQsCisJCQkJCQkJICAgICAgIGR1bXBfYnVmICsKKwkJCQkJCQkgICAgICAgb2Zmc2V0LAorCQkJCQkJCSAgICAgICBkdW1wLAorCQkJCQkJCSAgICAgICBzdG9ybV9pZCwKKwkJCQkJCQkgICAgICAgJnNfdmZjX3JhbV9kZWZzCisJCQkJCQkJICAgICAgIFtpXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBHUkMgUlNTIGRhdGEuIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4gKi8KK3N0YXRpYyB1MzIgcWVkX2dyY19kdW1wX3JzcyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHUzMiAqZHVtcF9idWYsIGJvb2wgZHVtcCkKK3sKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisJdTMyIG9mZnNldCA9IDA7CisJdTggcnNzX21lbV9pZDsKKworCWZvciAocnNzX21lbV9pZCA9IDA7IHJzc19tZW1faWQgPCBOVU1fUlNTX01FTV9UWVBFUzsgcnNzX21lbV9pZCsrKSB7CisJCXN0cnVjdCByc3NfbWVtX2RlZnMgKnJzc19kZWZzID0gJnNfcnNzX21lbV9kZWZzW3Jzc19tZW1faWRdOworCQl1MzIgbnVtX2VudHJpZXMgPSByc3NfZGVmcy0+bnVtX2VudHJpZXNbZGV2X2RhdGEtPmNoaXBfaWRdOworCQl1MzIgZW50cnlfd2lkdGggPSByc3NfZGVmcy0+ZW50cnlfd2lkdGhbZGV2X2RhdGEtPmNoaXBfaWRdOworCQl1MzIgdG90YWxfc2l6ZSA9IChudW1fZW50cmllcyAqIGVudHJ5X3dpZHRoKSAvIDMyOworCQlib29sIHBhY2tlZCA9IChlbnRyeV93aWR0aCA9PSAxNik7CisJCXUzMiBhZGRyID0gcnNzX2RlZnMtPmFkZHI7CisJCXUzMiBpLCBqOworCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtX2hkcihwX2h3Zm4sCisJCQkJCSAgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICAgIGR1bXAsCisJCQkJCSAgICAgICByc3NfZGVmcy0+bWVtX25hbWUsCisJCQkJCSAgICAgICBhZGRyLAorCQkJCQkgICAgICAgdG90YWxfc2l6ZSwKKwkJCQkJICAgICAgIGVudHJ5X3dpZHRoLAorCQkJCQkgICAgICAgcGFja2VkLAorCQkJCQkgICAgICAgcnNzX2RlZnMtPnR5cGVfbmFtZSwgZmFsc2UsIDApOworCisJCWlmICghZHVtcCkgeworCQkJb2Zmc2V0ICs9IHRvdGFsX3NpemU7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIER1bXAgUlNTIGRhdGEgKi8KKwkJZm9yIChpID0gMDsgaSA8IEJZVEVTX1RPX0RXT1JEUyh0b3RhbF9zaXplKTsgaSsrLCBhZGRyKyspIHsKKwkJCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBSU1NfUkVHX1JTU19SQU1fQUREUiwgYWRkcik7CisJCQlmb3IgKGogPSAwOyBqIDwgQllURVNfSU5fRFdPUkQ7IGorKywgb2Zmc2V0KyspCisJCQkJKihkdW1wX2J1ZiArIG9mZnNldCkgPQorCQkJCQlxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCQkJICAgICAgIFJTU19SRUdfUlNTX1JBTV9EQVRBICsKKwkJCQkJICAgICAgIERXT1JEU19UT19CWVRFUyhqKSk7CisJCX0KKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyBHUkMgQmlnIFJBTS4gUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfYmlnX3JhbShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQlzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wLCB1OCBiaWdfcmFtX2lkKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwljaGFyIG1lbV9uYW1lWzEyXSA9ICI/Pz9fQklHX1JBTSI7CisJY2hhciB0eXBlX25hbWVbOF0gPSAiPz8/X1JBTSI7CisJdTMyIHJhbV9zaXplLCB0b3RhbF9ibG9ja3M7CisJdTMyIG9mZnNldCA9IDAsIGksIGo7CisKKwl0b3RhbF9ibG9ja3MgPQorCQlzX2JpZ19yYW1fZGVmc1tiaWdfcmFtX2lkXS5udW1fb2ZfYmxvY2tzW2Rldl9kYXRhLT5jaGlwX2lkXTsKKwlyYW1fc2l6ZSA9IHRvdGFsX2Jsb2NrcyAqIEJJR19SQU1fQkxPQ0tfU0laRV9EV09SRFM7CisKKwlzdHJuY3B5KHR5cGVfbmFtZSwgc19iaWdfcmFtX2RlZnNbYmlnX3JhbV9pZF0uaW5zdGFuY2VfbmFtZSwKKwkJc3RybGVuKHNfYmlnX3JhbV9kZWZzW2JpZ19yYW1faWRdLmluc3RhbmNlX25hbWUpKTsKKwlzdHJuY3B5KG1lbV9uYW1lLCBzX2JpZ19yYW1fZGVmc1tiaWdfcmFtX2lkXS5pbnN0YW5jZV9uYW1lLAorCQlzdHJsZW4oc19iaWdfcmFtX2RlZnNbYmlnX3JhbV9pZF0uaW5zdGFuY2VfbmFtZSkpOworCisJLyogRHVtcCBtZW1vcnkgaGVhZGVyICovCisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW1faGRyKHBfaHdmbiwKKwkJCQkgICAgICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsCisJCQkJICAgICAgIG1lbV9uYW1lLAorCQkJCSAgICAgICAwLAorCQkJCSAgICAgICByYW1fc2l6ZSwKKwkJCQkgICAgICAgQklHX1JBTV9CTE9DS19TSVpFX0JZVEVTICogOCwKKwkJCQkgICAgICAgZmFsc2UsIHR5cGVfbmFtZSwgZmFsc2UsIDApOworCisJaWYgKCFkdW1wKQorCQlyZXR1cm4gb2Zmc2V0ICsgcmFtX3NpemU7CisKKwkvKiBSZWFkIGFuZCBkdW1wIEJpZyBSQU0gZGF0YSAqLworCWZvciAoaSA9IDA7IGkgPCB0b3RhbF9ibG9ja3MgLyAyOyBpKyspIHsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIHNfYmlnX3JhbV9kZWZzW2JpZ19yYW1faWRdLmFkZHJfcmVnX2FkZHIsCisJCSAgICAgICBpKTsKKwkJZm9yIChqID0gMDsgaiA8IDIgKiBCSUdfUkFNX0JMT0NLX1NJWkVfRFdPUkRTOyBqKyssIG9mZnNldCsrKQorCQkJKihkdW1wX2J1ZiArIG9mZnNldCkgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCQkJCXNfYmlnX3JhbV9kZWZzW2JpZ19yYW1faWRdLgorCQkJCQkJCWRhdGFfcmVnX2FkZHIgKworCQkJCQkJRFdPUkRTX1RPX0JZVEVTKGopKTsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9tY3Aoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJYm9vbCBibG9ja19lbmFibGVbTUFYX0JMT0NLX0lEXSA9IHsgMCB9OworCWJvb2wgaGFsdGVkID0gZmFsc2U7CisJdTMyIG9mZnNldCA9IDA7CisKKwkvKiBIYWx0IE1DUCAqLworCWlmIChkdW1wKSB7CisJCWhhbHRlZCA9ICFxZWRfbWNwX2hhbHQocF9od2ZuLCBwX3B0dCk7CisJCWlmICghaGFsdGVkKQorCQkJRFBfTk9USUNFKHBfaHdmbiwgIk1DUCBoYWx0IGZhaWxlZCFcbiIpOworCX0KKworCS8qIER1bXAgTUNQIHNjcmF0Y2hwYWQgKi8KKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbShwX2h3Zm4sCisJCQkJICAgcF9wdHQsCisJCQkJICAgZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgZHVtcCwKKwkJCQkgICBOVUxMLAorCQkJCSAgIE1DUF9SRUdfU0NSQVRDSCwKKwkJCQkgICBNQ1BfUkVHX1NDUkFUQ0hfU0laRSwKKwkJCQkgICAwLCBmYWxzZSwgIk1DUCIsIGZhbHNlLCAwKTsKKworCS8qIER1bXAgTUNQIGNwdV9yZWdfZmlsZSAqLworCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtKHBfaHdmbiwKKwkJCQkgICBwX3B0dCwKKwkJCQkgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICBkdW1wLAorCQkJCSAgIE5VTEwsCisJCQkJICAgTUNQX1JFR19DUFVfUkVHX0ZJTEUsCisJCQkJICAgTUNQX1JFR19DUFVfUkVHX0ZJTEVfU0laRSwKKwkJCQkgICAwLCBmYWxzZSwgIk1DUCIsIGZhbHNlLCAwKTsKKworCS8qIER1bXAgTUNQIHJlZ2lzdGVycyAqLworCWJsb2NrX2VuYWJsZVtCTE9DS19NQ1BdID0gdHJ1ZTsKKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JlZ2lzdGVycyhwX2h3Zm4sCisJCQkJCSBwX3B0dCwKKwkJCQkJIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgZHVtcCwgYmxvY2tfZW5hYmxlLCAiYmxvY2siLCAiTUNQIik7CisKKwkvKiBEdW1wIHJlcXVpcmVkIG5vbi1NQ1AgcmVnaXN0ZXJzICovCisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZWdzX2hkcihkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJZHVtcCwgMSwgImVuZyIsIC0xLCAiYmxvY2siLCAiTUNQIik7CisJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZWdfZW50cnkocF9od2ZuLAorCQkJCQkgcF9wdHQsCisJCQkJCSBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJIGR1bXAsCisJCQkJCSBCWVRFU19UT19EV09SRFMKKwkJCQkJIChNSVNDX1JFR19TSEFSRURfTUVNX0FERFIpLCAxKTsKKworCS8qIFJlbGVhc2UgTUNQICovCisJaWYgKGhhbHRlZCAmJiBxZWRfbWNwX3Jlc3VtZShwX2h3Zm4sIHBfcHR0KSkKKwkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byByZXN1bWUgTUNQIGFmdGVyIGhhbHQhXG4iKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKiBEdW1wcyB0aGUgdGJ1cyBpbmRpcmVjdCBtZW1vcnkgZm9yIGFsbCBQSFlzLiAqLworc3RhdGljIHUzMiBxZWRfZ3JjX2R1bXBfcGh5KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpkdW1wX2J1ZiwgYm9vbCBkdW1wKQoreworCXUzMiBvZmZzZXQgPSAwLCB0YnVzX2xvX29mZnNldCwgdGJ1c19oaV9vZmZzZXQ7CisJY2hhciBtZW1fbmFtZVszMl07CisJdTggcGh5X2lkOworCisJZm9yIChwaHlfaWQgPSAwOyBwaHlfaWQgPCBBUlJBWV9TSVpFKHNfcGh5X2RlZnMpOyBwaHlfaWQrKykgeworCQlzdHJ1Y3QgcGh5X2RlZnMgKnBoeV9kZWZzID0gJnNfcGh5X2RlZnNbcGh5X2lkXTsKKwkJaW50IHByaW50ZWRfY2hhcnM7CisKKwkJcHJpbnRlZF9jaGFycyA9IHNucHJpbnRmKG1lbV9uYW1lLCBzaXplb2YobWVtX25hbWUpLCAidGJ1c18lcyIsCisJCQkJCSBwaHlfZGVmcy0+cGh5X25hbWUpOworCQlpZiAocHJpbnRlZF9jaGFycyA8IDAgfHwgcHJpbnRlZF9jaGFycyA+PSBzaXplb2YobWVtX25hbWUpKQorCQkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCQkgICJVbmV4cGVjdGVkIGRlYnVnIGVycm9yOiBpbnZhbGlkIFBIWSBtZW1vcnkgbmFtZVxuIik7CisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfbWVtX2hkcihwX2h3Zm4sCisJCQkJCSAgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJICAgICAgIGR1bXAsCisJCQkJCSAgICAgICBtZW1fbmFtZSwKKwkJCQkJICAgICAgIDAsCisJCQkJCSAgICAgICBQSFlfRFVNUF9TSVpFX0RXT1JEUywKKwkJCQkJICAgICAgIDE2LCB0cnVlLCBtZW1fbmFtZSwgZmFsc2UsIDApOworCQlpZiAoZHVtcCkgeworCQkJdTMyIGFkZHJfbG9fYWRkciA9IHBoeV9kZWZzLT5iYXNlX2FkZHIgKworCQkJCQkgICBwaHlfZGVmcy0+dGJ1c19hZGRyX2xvX2FkZHI7CisJCQl1MzIgYWRkcl9oaV9hZGRyID0gcGh5X2RlZnMtPmJhc2VfYWRkciArCisJCQkJCSAgIHBoeV9kZWZzLT50YnVzX2FkZHJfaGlfYWRkcjsKKwkJCXUzMiBkYXRhX2xvX2FkZHIgPSBwaHlfZGVmcy0+YmFzZV9hZGRyICsKKwkJCQkJICAgcGh5X2RlZnMtPnRidXNfZGF0YV9sb19hZGRyOworCQkJdTMyIGRhdGFfaGlfYWRkciA9IHBoeV9kZWZzLT5iYXNlX2FkZHIgKworCQkJCQkgICBwaHlfZGVmcy0+dGJ1c19kYXRhX2hpX2FkZHI7CisJCQl1OCAqYnl0ZXNfYnVmID0gKHU4ICopKGR1bXBfYnVmICsgb2Zmc2V0KTsKKworCQkJZm9yICh0YnVzX2hpX29mZnNldCA9IDA7CisJCQkgICAgIHRidXNfaGlfb2Zmc2V0IDwgKE5VTV9QSFlfVEJVU19BRERSRVNTRVMgPj4gOCk7CisJCQkgICAgIHRidXNfaGlfb2Zmc2V0KyspIHsKKwkJCQlxZWRfd3IocF9od2ZuLAorCQkJCSAgICAgICBwX3B0dCwgYWRkcl9oaV9hZGRyLCB0YnVzX2hpX29mZnNldCk7CisJCQkJZm9yICh0YnVzX2xvX29mZnNldCA9IDA7IHRidXNfbG9fb2Zmc2V0IDwgMjU2OworCQkJCSAgICAgdGJ1c19sb19vZmZzZXQrKykgeworCQkJCQlxZWRfd3IocF9od2ZuLAorCQkJCQkgICAgICAgcF9wdHQsCisJCQkJCSAgICAgICBhZGRyX2xvX2FkZHIsIHRidXNfbG9fb2Zmc2V0KTsKKwkJCQkJKihieXRlc19idWYrKykgPQorCQkJCQkJKHU4KXFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJCQkJCSAgIGRhdGFfbG9fYWRkcik7CisJCQkJCSooYnl0ZXNfYnVmKyspID0KKwkJCQkJCSh1OClxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCQkJCQkgICBkYXRhX2hpX2FkZHIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCW9mZnNldCArPSBQSFlfRFVNUF9TSVpFX0RXT1JEUzsKKwl9CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgdm9pZCBxZWRfY29uZmlnX2RiZ19saW5lKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQllbnVtIGJsb2NrX2lkIGJsb2NrX2lkLAorCQkJCXU4IGxpbmVfaWQsCisJCQkJdTggY3ljbGVfZW4sCisJCQkJdTggcmlnaHRfc2hpZnQsIHU4IGZvcmNlX3ZhbGlkLCB1OCBmb3JjZV9mcmFtZSkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGVmcyAqcF9ibG9ja19kZWZzID0gc19ibG9ja19kZWZzW2Jsb2NrX2lkXTsKKworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBwX2Jsb2NrX2RlZnMtPmRiZ19zZWxlY3RfYWRkciwgbGluZV9pZCk7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIHBfYmxvY2tfZGVmcy0+ZGJnX2N5Y2xlX2VuYWJsZV9hZGRyLCBjeWNsZV9lbik7CisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIHBfYmxvY2tfZGVmcy0+ZGJnX3NoaWZ0X2FkZHIsIHJpZ2h0X3NoaWZ0KTsKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgcF9ibG9ja19kZWZzLT5kYmdfZm9yY2VfdmFsaWRfYWRkciwgZm9yY2VfdmFsaWQpOworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBwX2Jsb2NrX2RlZnMtPmRiZ19mb3JjZV9mcmFtZV9hZGRyLCBmb3JjZV9mcmFtZSk7Cit9CisKKy8qIER1bXBzIFN0YXRpYyBEZWJ1ZyBkYXRhLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyIHFlZF9ncmNfZHVtcF9zdGF0aWNfZGVidWcoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJdTMyIGJsb2NrX2R3b3JkcyA9IE5VTV9EQkdfQlVTX0xJTkVTICogU1RBVElDX0RFQlVHX0xJTkVfRFdPUkRTOworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1MzIgb2Zmc2V0ID0gMCwgYmxvY2tfaWQsIGxpbmVfaWQsIGFkZHIsIGk7CisJc3RydWN0IGJsb2NrX2RlZnMgKnBfYmxvY2tfZGVmczsKKworCWlmIChkdW1wKSB7CisJCURQX1ZFUkJPU0UocF9od2ZuLAorCQkJICAgUUVEX01TR19ERUJVRywgIkR1bXBpbmcgc3RhdGljIGRlYnVnIGRhdGEuLi5cbiIpOworCisJCS8qIERpc2FibGUgYWxsIGJsb2NrcyBkZWJ1ZyBvdXRwdXQgKi8KKwkJZm9yIChibG9ja19pZCA9IDA7IGJsb2NrX2lkIDwgTUFYX0JMT0NLX0lEOyBibG9ja19pZCsrKSB7CisJCQlwX2Jsb2NrX2RlZnMgPSBzX2Jsb2NrX2RlZnNbYmxvY2tfaWRdOworCisJCQlpZiAocF9ibG9ja19kZWZzLT5oYXNfZGJnX2J1c1tkZXZfZGF0YS0+Y2hpcF9pZF0pCisJCQkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsCisJCQkJICAgICAgIHBfYmxvY2tfZGVmcy0+ZGJnX2N5Y2xlX2VuYWJsZV9hZGRyLCAwKTsKKwkJfQorCisJCXFlZF9idXNfcmVzZXRfZGJnX2Jsb2NrKHBfaHdmbiwgcF9wdHQpOworCQlxZWRfYnVzX3NldF9mcmFtaW5nX21vZGUocF9od2ZuLAorCQkJCQkgcF9wdHQsIERCR19CVVNfRlJBTUVfTU9ERV84SFdfMFNUKTsKKwkJcWVkX3dyKHBfaHdmbiwKKwkJICAgICAgIHBfcHR0LCBEQkdfUkVHX0RFQlVHX1RBUkdFVCwgREJHX0JVU19UQVJHRVRfSURfSU5UX0JVRik7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBEQkdfUkVHX0ZVTExfTU9ERSwgMSk7CisJCXFlZF9idXNfZW5hYmxlX2RiZ19ibG9jayhwX2h3Zm4sIHBfcHR0LCB0cnVlKTsKKwl9CisKKwkvKiBEdW1wIGFsbCBzdGF0aWMgZGVidWcgbGluZXMgZm9yIGVhY2ggcmVsZXZhbnQgYmxvY2sgKi8KKwlmb3IgKGJsb2NrX2lkID0gMDsgYmxvY2tfaWQgPCBNQVhfQkxPQ0tfSUQ7IGJsb2NrX2lkKyspIHsKKwkJcF9ibG9ja19kZWZzID0gc19ibG9ja19kZWZzW2Jsb2NrX2lkXTsKKworCQlpZiAoIXBfYmxvY2tfZGVmcy0+aGFzX2RiZ19idXNbZGV2X2RhdGEtPmNoaXBfaWRdKQorCQkJY29udGludWU7CisKKwkJLyogRHVtcCBzdGF0aWMgc2VjdGlvbiBwYXJhbXMgKi8KKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tZW1faGRyKHBfaHdmbiwKKwkJCQkJICAgICAgIGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkgICAgICAgZHVtcCwKKwkJCQkJICAgICAgIHBfYmxvY2tfZGVmcy0+bmFtZSwgMCwKKwkJCQkJICAgICAgIGJsb2NrX2R3b3JkcywgMzIsIGZhbHNlLAorCQkJCQkgICAgICAgIlNUQVRJQyIsIGZhbHNlLCAwKTsKKworCQlpZiAoZHVtcCAmJiAhZGV2X2RhdGEtPmJsb2NrX2luX3Jlc2V0W2Jsb2NrX2lkXSkgeworCQkJdTggZGJnX2NsaWVudF9pZCA9CisJCQkJcF9ibG9ja19kZWZzLT5kYmdfY2xpZW50X2lkW2Rldl9kYXRhLT5jaGlwX2lkXTsKKworCQkJLyogRW5hYmxlIGJsb2NrJ3MgY2xpZW50ICovCisJCQlxZWRfYnVzX2VuYWJsZV9jbGllbnRzKHBfaHdmbiwgcF9wdHQsCisJCQkJCSAgICAgICBCSVQoZGJnX2NsaWVudF9pZCkpOworCisJCQlmb3IgKGxpbmVfaWQgPSAwOyBsaW5lX2lkIDwgTlVNX0RCR19CVVNfTElORVM7CisJCQkgICAgIGxpbmVfaWQrKykgeworCQkJCS8qIENvbmZpZ3VyZSBkZWJ1ZyBsaW5lIElEICovCisJCQkJcWVkX2NvbmZpZ19kYmdfbGluZShwX2h3Zm4sCisJCQkJCQkgICAgcF9wdHQsCisJCQkJCQkgICAgKGVudW0gYmxvY2tfaWQpYmxvY2tfaWQsCisJCQkJCQkgICAgKHU4KWxpbmVfaWQsCisJCQkJCQkgICAgMHhmLCAwLCAwLCAwKTsKKworCQkJCS8qIFJlYWQgZGVidWcgbGluZSBpbmZvICovCisJCQkJZm9yIChpID0gMCwgYWRkciA9IERCR19SRUdfQ0FMRU5EQVJfT1VUX0RBVEE7CisJCQkJICAgICBpIDwgU1RBVElDX0RFQlVHX0xJTkVfRFdPUkRTOworCQkJCSAgICAgaSsrLCBvZmZzZXQrKywgYWRkciArPSBCWVRFU19JTl9EV09SRCkKKwkJCQkJZHVtcF9idWZbb2Zmc2V0XSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJCQkJCQkgIGFkZHIpOworCQkJfQorCisJCQkvKiBEaXNhYmxlIGJsb2NrJ3MgY2xpZW50IGFuZCBkZWJ1ZyBvdXRwdXQgKi8KKwkJCXFlZF9idXNfZW5hYmxlX2NsaWVudHMocF9od2ZuLCBwX3B0dCwgMCk7CisJCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKKwkJCSAgICAgICBwX2Jsb2NrX2RlZnMtPmRiZ19jeWNsZV9lbmFibGVfYWRkciwgMCk7CisJCX0gZWxzZSB7CisJCQkvKiBBbGwgbGluZXMgYXJlIGludmFsaWQgLSBkdW1wIHplcm9zICovCisJCQlpZiAoZHVtcCkKKwkJCQltZW1zZXQoZHVtcF9idWYgKyBvZmZzZXQsIDAsCisJCQkJICAgICAgIERXT1JEU19UT19CWVRFUyhibG9ja19kd29yZHMpKTsKKwkJCW9mZnNldCArPSBibG9ja19kd29yZHM7CisJCX0KKwl9CisKKwlpZiAoZHVtcCkgeworCQlxZWRfYnVzX2VuYWJsZV9kYmdfYmxvY2socF9od2ZuLCBwX3B0dCwgZmFsc2UpOworCQlxZWRfYnVzX2VuYWJsZV9jbGllbnRzKHBfaHdmbiwgcF9wdHQsIDApOworCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIFBlcmZvcm1zIEdSQyBEdW1wIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9ncmNfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgICBib29sIGR1bXAsIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCWJvb2wgcGFyaXRpZXNfbWFza2VkID0gZmFsc2U7CisJdTggaSwgcG9ydF9tb2RlID0gMDsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCS8qIENoZWNrIGlmIGVtdWxhdGlvbiBwbGF0Zm9ybSAqLworCSpudW1fZHVtcGVkX2R3b3JkcyA9IDA7CisKKwkvKiBGaWxsIEdSQyBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBub3Qgc2V0IGJ5IHRoZSB1c2VyIHdpdGggdGhlaXIgZGVmYXVsdAorCSAqIHZhbHVlLgorCSAqLworCXFlZF9kYmdfZ3JjX3NldF9wYXJhbXNfZGVmYXVsdChwX2h3Zm4pOworCisJLyogRmluZCBwb3J0IG1vZGUgKi8KKwlpZiAoZHVtcCkgeworCQlzd2l0Y2ggKHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBNSVNDX1JFR19QT1JUX01PREUpKSB7CisJCWNhc2UgMDoKKwkJCXBvcnRfbW9kZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcG9ydF9tb2RlID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwb3J0X21vZGUgPSA0OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBVcGRhdGUgcmVzZXQgc3RhdGUgKi8KKwlpZiAoZHVtcCkKKwkJcWVkX3VwZGF0ZV9ibG9ja3NfcmVzZXRfc3RhdGUocF9od2ZuLCBwX3B0dCk7CisKKwkvKiBEdW1wIGdsb2JhbCBwYXJhbXMgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfY29tbW9uX2dsb2JhbF9wYXJhbXMocF9od2ZuLAorCQkJCQkJcF9wdHQsCisJCQkJCQlkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCwgNCk7CisJb2Zmc2V0ICs9IHFlZF9kdW1wX3N0cl9wYXJhbShkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkgICAgIGR1bXAsICJkdW1wLXR5cGUiLCAiZ3JjLWR1bXAiKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwKKwkJCQkgICAgICJudW0tbGNpZHMiLAorCQkJCSAgICAgcWVkX2dyY19nZXRfcGFyYW0ocF9od2ZuLAorCQkJCQkJREJHX0dSQ19QQVJBTV9OVU1fTENJRFMpKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwKKwkJCQkgICAgICJudW0tbHRpZHMiLAorCQkJCSAgICAgcWVkX2dyY19nZXRfcGFyYW0ocF9od2ZuLAorCQkJCQkJREJHX0dSQ19QQVJBTV9OVU1fTFRJRFMpKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgIm51bS1wb3J0cyIsIHBvcnRfbW9kZSk7CisKKwkvKiBEdW1wIHJlc2V0IHJlZ2lzdGVycyAoZHVtcGVkIGJlZm9yZSB0YWtpbmcgYmxvY2tzIG91dCBvZiByZXNldCApICovCisJaWYgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfUkVHUykpCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcmVzZXRfcmVncyhwX2h3Zm4sCisJCQkJCQkgIHBfcHR0LAorCQkJCQkJICBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisKKwkvKiBUYWtlIGFsbCBibG9ja3Mgb3V0IG9mIHJlc2V0ICh1c2luZyByZXNldCByZWdpc3RlcnMpICovCisJaWYgKGR1bXApIHsKKwkJcWVkX2dyY191bnJlc2V0X2Jsb2NrcyhwX2h3Zm4sIHBfcHR0KTsKKwkJcWVkX3VwZGF0ZV9ibG9ja3NfcmVzZXRfc3RhdGUocF9od2ZuLCBwX3B0dCk7CisJfQorCisJLyogRGlzYWJsZSBhbGwgcGFyaXRpZXMgdXNpbmcgTUZXIGNvbW1hbmQgKi8KKwlpZiAoZHVtcCkgeworCQlwYXJpdGllc19tYXNrZWQgPSAhcWVkX21jcF9tYXNrX3Bhcml0aWVzKHBfaHdmbiwgcF9wdHQsIDEpOworCQlpZiAoIXBhcml0aWVzX21hc2tlZCkgeworCQkJaWYgKHFlZF9ncmNfZ2V0X3BhcmFtCisJCQkgICAgKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9QQVJJVFlfU0FGRSkpCisJCQkJcmV0dXJuIERCR19TVEFUVVNfTUNQX0NPVUxEX05PVF9NQVNLX1BSVFk7CisJCQllbHNlCisJCQkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCQkJICAiRmFpbGVkIHRvIG1hc2sgcGFyaXRpZXMgdXNpbmcgTUZXXG4iKTsKKwkJfQorCX0KKworCS8qIER1bXAgbW9kaWZpZWQgcmVnaXN0ZXJzIChkdW1wZWQgYmVmb3JlIG1vZGlmeWluZyB0aGVtKSAqLworCWlmIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1JFR1MpKQorCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21vZGlmaWVkX3JlZ3MocF9od2ZuLAorCQkJCQkJICAgICBwX3B0dCwKKwkJCQkJCSAgICAgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCisJLyogU3RhbGwgc3Rvcm1zICovCisJaWYgKGR1bXAgJiYKKwkgICAgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLAorCQkJCSBEQkdfR1JDX1BBUkFNX0RVTVBfSU9SKSB8fAorCSAgICAgcWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9WRkMpKSkKKwkJcWVkX2dyY19zdGFsbF9zdG9ybXMocF9od2ZuLCBwX3B0dCwgdHJ1ZSk7CisKKwkvKiBEdW1wIGFsbCByZWdzICAqLworCWlmIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX1JFR1MpKSB7CisJCS8qIER1bXAgYWxsIGJsb2NrcyBleGNlcHQgTUNQICovCisJCWJvb2wgYmxvY2tfZW5hYmxlW01BWF9CTE9DS19JRF07CisKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9CTE9DS19JRDsgaSsrKQorCQkJYmxvY2tfZW5hYmxlW2ldID0gdHJ1ZTsKKwkJYmxvY2tfZW5hYmxlW0JMT0NLX01DUF0gPSBmYWxzZTsKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9yZWdpc3RlcnMocF9od2ZuLAorCQkJCQkJIHBfcHR0LAorCQkJCQkJIGR1bXBfYnVmICsKKwkJCQkJCSBvZmZzZXQsCisJCQkJCQkgZHVtcCwKKwkJCQkJCSBibG9ja19lbmFibGUsIE5VTEwsIE5VTEwpOworCX0KKworCS8qIER1bXAgbWVtb3JpZXMgKi8KKwlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX21lbW9yaWVzKHBfaHdmbiwgcF9wdHQsIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKworCS8qIER1bXAgTUNQICovCisJaWYgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfTUNQKSkKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9tY3AocF9od2ZuLAorCQkJCQkgICBwX3B0dCwgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCisJLyogRHVtcCBjb250ZXh0ICovCisJaWYgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBEQkdfR1JDX1BBUkFNX0RVTVBfQ01fQ1RYKSkKKwkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9jdHgocF9od2ZuLAorCQkJCQkgICBwX3B0dCwgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCisJLyogRHVtcCBSU1MgbWVtb3JpZXMgKi8KKwlpZiAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9SU1MpKQorCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3JzcyhwX2h3Zm4sCisJCQkJCSAgIHBfcHR0LCBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisKKwkvKiBEdW1wIEJpZyBSQU0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0JJR19SQU1fVFlQRVM7IGkrKykKKwkJaWYgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLCBzX2JpZ19yYW1fZGVmc1tpXS5ncmNfcGFyYW0pKQorCQkJb2Zmc2V0ICs9IHFlZF9ncmNfZHVtcF9iaWdfcmFtKHBfaHdmbiwKKwkJCQkJCSAgICAgICBwX3B0dCwKKwkJCQkJCSAgICAgICBkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQkJCSAgICAgICBkdW1wLCBpKTsKKworCS8qIER1bXAgSU9ScyAqLworCWlmIChxZWRfZ3JjX2lzX2luY2x1ZGVkKHBfaHdmbiwgREJHX0dSQ19QQVJBTV9EVU1QX0lPUikpCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfaW9ycyhwX2h3Zm4sCisJCQkJCSAgICBwX3B0dCwgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCisJLyogRHVtcCBWRkMgKi8KKwlpZiAocWVkX2dyY19pc19pbmNsdWRlZChwX2h3Zm4sIERCR19HUkNfUEFSQU1fRFVNUF9WRkMpKQorCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3ZmYyhwX2h3Zm4sCisJCQkJCSAgIHBfcHR0LCBkdW1wX2J1ZiArIG9mZnNldCwgZHVtcCk7CisKKwkvKiBEdW1wIFBIWSB0YnVzICovCisJaWYgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLAorCQkJCURCR19HUkNfUEFSQU1fRFVNUF9QSFkpICYmIGRldl9kYXRhLT5jaGlwX2lkID09CisJICAgIENISVBfSzIgJiYgZGV2X2RhdGEtPnBsYXRmb3JtX2lkID09IFBMQVRGT1JNX0FTSUMpCisJCW9mZnNldCArPSBxZWRfZ3JjX2R1bXBfcGh5KHBfaHdmbiwKKwkJCQkJICAgcF9wdHQsIGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wKTsKKworCS8qIER1bXAgc3RhdGljIGRlYnVnIGRhdGEgICovCisJaWYgKHFlZF9ncmNfaXNfaW5jbHVkZWQocF9od2ZuLAorCQkJCURCR19HUkNfUEFSQU1fRFVNUF9TVEFUSUMpICYmCisJICAgIGRldl9kYXRhLT5idXMuc3RhdGUgPT0gREJHX0JVU19TVEFURV9JRExFKQorCQlvZmZzZXQgKz0gcWVkX2dyY19kdW1wX3N0YXRpY19kZWJ1ZyhwX2h3Zm4sCisJCQkJCQkgICAgcF9wdHQsCisJCQkJCQkgICAgZHVtcF9idWYgKyBvZmZzZXQsIGR1bXApOworCisJLyogRHVtcCBsYXN0IHNlY3Rpb24gKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfbGFzdF9zZWN0aW9uKGR1bXBfYnVmLCBvZmZzZXQsIGR1bXApOworCWlmIChkdW1wKSB7CisJCS8qIFVuc3RhbGwgc3Rvcm1zICovCisJCWlmIChxZWRfZ3JjX2dldF9wYXJhbShwX2h3Zm4sIERCR19HUkNfUEFSQU1fVU5TVEFMTCkpCisJCQlxZWRfZ3JjX3N0YWxsX3N0b3JtcyhwX2h3Zm4sIHBfcHR0LCBmYWxzZSk7CisKKwkJLyogQ2xlYXIgcGFyaXR5IHN0YXR1cyAqLworCQlxZWRfZ3JjX2NsZWFyX2FsbF9wcnR5KHBfaHdmbiwgcF9wdHQpOworCisJCS8qIEVuYWJsZSBhbGwgcGFyaXRpZXMgdXNpbmcgTUZXIGNvbW1hbmQgKi8KKwkJaWYgKHBhcml0aWVzX21hc2tlZCkKKwkJCXFlZF9tY3BfbWFza19wYXJpdGllcyhwX2h3Zm4sIHBfcHR0LCAwKTsKKwl9CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSBvZmZzZXQ7CisKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworLyogV3JpdGVzIHRoZSBzcGVjaWZpZWQgZmFpbGluZyBJZGxlIENoZWNrIHJ1bGUgdG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuCisgKi8KK3N0YXRpYyB1MzIgcWVkX2lkbGVfY2hrX2R1bXBfZmFpbHVyZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgIHUzMiAqCisJCQkJICAgICBkdW1wX2J1ZiwKKwkJCQkgICAgIGJvb2wgZHVtcCwKKwkJCQkgICAgIHUxNiBydWxlX2lkLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19ydWxlICpydWxlLAorCQkJCSAgICAgdTE2IGZhaWxfZW50cnlfaWQsIHUzMiAqY29uZF9yZWdfdmFsdWVzKQoreworCWNvbnN0IHVuaW9uIGRiZ19pZGxlX2Noa19yZWcgKnJlZ3MgPSAmKChjb25zdCB1bmlvbiBkYmdfaWRsZV9jaGtfcmVnICopCisJCQkJCSAgICAgICBzX2RiZ19hcnJheXMKKwkJCQkJICAgICAgIFtCSU5fQlVGX0RCR19JRExFX0NIS19SRUdTXS4KKwkJCQkJICAgICAgIHB0cilbcnVsZS0+cmVnX29mZnNldF07CisJY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19jb25kX3JlZyAqY29uZF9yZWdzID0gJnJlZ3NbMF0uY29uZF9yZWc7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCXN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X2hkciAqaGRyID0KKwkJKHN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X2hkciAqKWR1bXBfYnVmOworCWNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfaW5mb19yZWcgKmluZm9fcmVncyA9CisJCSZyZWdzW3J1bGUtPm51bV9jb25kX3JlZ3NdLmluZm9fcmVnOworCXUzMiBuZXh0X3JlZ19vZmZzZXQgPSAwLCBpLCBvZmZzZXQgPSAwOworCXU4IHJlZ19pZDsKKworCS8qIER1bXAgcnVsZSBkYXRhICovCisJaWYgKGR1bXApIHsKKwkJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKCpoZHIpKTsKKwkJaGRyLT5ydWxlX2lkID0gcnVsZV9pZDsKKwkJaGRyLT5tZW1fZW50cnlfaWQgPSBmYWlsX2VudHJ5X2lkOworCQloZHItPnNldmVyaXR5ID0gcnVsZS0+c2V2ZXJpdHk7CisJCWhkci0+bnVtX2R1bXBlZF9jb25kX3JlZ3MgPSBydWxlLT5udW1fY29uZF9yZWdzOworCX0KKworCW9mZnNldCArPSBJRExFX0NIS19SRVNVTFRfSERSX0RXT1JEUzsKKworCS8qIER1bXAgY29uZGl0aW9uIHJlZ2lzdGVyIHZhbHVlcyAqLworCWZvciAocmVnX2lkID0gMDsgcmVnX2lkIDwgcnVsZS0+bnVtX2NvbmRfcmVnczsgcmVnX2lkKyspIHsKKwkJY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19jb25kX3JlZyAqcmVnID0gJmNvbmRfcmVnc1tyZWdfaWRdOworCisJCS8qIFdyaXRlIHJlZ2lzdGVyIGhlYWRlciAqLworCQlpZiAoZHVtcCkgeworCQkJc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfcmVnX2hkciAqcmVnX2hkciA9CisJCQkgICAgKHN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X3JlZ19oZHIgKikoZHVtcF9idWYKKwkJCQkJCQkJICAgKyBvZmZzZXQpOworCQkJb2Zmc2V0ICs9IElETEVfQ0hLX1JFU1VMVF9SRUdfSERSX0RXT1JEUzsKKwkJCW1lbXNldChyZWdfaGRyLCAwLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9yZWdfaGRyKSk7CisJCQlyZWdfaGRyLT5zdGFydF9lbnRyeSA9IHJlZy0+c3RhcnRfZW50cnk7CisJCQlyZWdfaGRyLT5zaXplID0gcmVnLT5lbnRyeV9zaXplOworCQkJU0VUX0ZJRUxEKHJlZ19oZHItPmRhdGEsCisJCQkJICBEQkdfSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfSVNfTUVNLAorCQkJCSAgcmVnLT5udW1fZW50cmllcyA+IDEgfHwgcmVnLT5zdGFydF9lbnRyeSA+IDAKKwkJCQkgID8gMSA6IDApOworCQkJU0VUX0ZJRUxEKHJlZ19oZHItPmRhdGEsCisJCQkJICBEQkdfSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfUkVHX0lELCByZWdfaWQpOworCisJCQkvKiBXcml0ZSByZWdpc3RlciB2YWx1ZXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCByZWdfaGRyLT5zaXplOworCQkJICAgICBpKyssIG5leHRfcmVnX29mZnNldCsrLCBvZmZzZXQrKykKKwkJCQlkdW1wX2J1ZltvZmZzZXRdID0KKwkJCQkgICAgY29uZF9yZWdfdmFsdWVzW25leHRfcmVnX29mZnNldF07CisJCX0gZWxzZSB7CisJCQlvZmZzZXQgKz0gSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfRFdPUkRTICsKKwkJCSAgICByZWctPmVudHJ5X3NpemU7CisJCX0KKwl9CisKKwkvKiBEdW1wIGluZm8gcmVnaXN0ZXIgdmFsdWVzICovCisJZm9yIChyZWdfaWQgPSAwOyByZWdfaWQgPCBydWxlLT5udW1faW5mb19yZWdzOyByZWdfaWQrKykgeworCQljb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX2luZm9fcmVnICpyZWcgPSAmaW5mb19yZWdzW3JlZ19pZF07CisJCXUzMiBibG9ja19pZDsKKworCQlpZiAoIWR1bXApIHsKKwkJCW9mZnNldCArPSBJRExFX0NIS19SRVNVTFRfUkVHX0hEUl9EV09SRFMgKyByZWctPnNpemU7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIENoZWNrIGlmIHJlZ2lzdGVyJ3MgYmxvY2sgaXMgaW4gcmVzZXQgKi8KKwkJYmxvY2tfaWQgPSBHRVRfRklFTEQocmVnLT5kYXRhLCBEQkdfSURMRV9DSEtfSU5GT19SRUdfQkxPQ0tfSUQpOworCQlpZiAoYmxvY2tfaWQgPj0gTUFYX0JMT0NLX0lEKSB7CisJCQlEUF9OT1RJQ0UocF9od2ZuLCAiSW52YWxpZCBibG9ja19pZFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghZGV2X2RhdGEtPmJsb2NrX2luX3Jlc2V0W2Jsb2NrX2lkXSkgeworCQkJYm9vbCBldmFsX21vZGUgPSBHRVRfRklFTEQocmVnLT5tb2RlLmRhdGEsCisJCQkJCQkgICBEQkdfTU9ERV9IRFJfRVZBTF9NT0RFKSA+IDA7CisJCQlib29sIG1vZGVfbWF0Y2ggPSB0cnVlOworCisJCQkvKiBDaGVjayBtb2RlICovCisJCQlpZiAoZXZhbF9tb2RlKSB7CisJCQkJdTE2IG1vZGVzX2J1Zl9vZmZzZXQgPQorCQkJCQlHRVRfRklFTEQocmVnLT5tb2RlLmRhdGEsCisJCQkJCQlEQkdfTU9ERV9IRFJfTU9ERVNfQlVGX09GRlNFVCk7CisJCQkJbW9kZV9tYXRjaCA9CisJCQkJCXFlZF9pc19tb2RlX21hdGNoKHBfaHdmbiwKKwkJCQkJCQkgICZtb2Rlc19idWZfb2Zmc2V0KTsKKwkJCX0KKworCQkJaWYgKG1vZGVfbWF0Y2gpIHsKKwkJCQl1MzIgZ3JjX2FkZHIgPQorCQkJCQlEV09SRFNfVE9fQllURVMoR0VUX0ZJRUxEKHJlZy0+ZGF0YSwKKwkJCQkJCURCR19JRExFX0NIS19JTkZPX1JFR19BRERSRVNTKSk7CisKKwkJCQkvKiBXcml0ZSByZWdpc3RlciBoZWFkZXIgKi8KKwkJCQlzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9yZWdfaGRyICpyZWdfaGRyID0KKwkJCQkJKHN0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X3JlZ19oZHIgKikKKwkJCQkJKGR1bXBfYnVmICsgb2Zmc2V0KTsKKworCQkJCW9mZnNldCArPSBJRExFX0NIS19SRVNVTFRfUkVHX0hEUl9EV09SRFM7CisJCQkJaGRyLT5udW1fZHVtcGVkX2luZm9fcmVncysrOworCQkJCW1lbXNldChyZWdfaGRyLCAwLCBzaXplb2YoKnJlZ19oZHIpKTsKKwkJCQlyZWdfaGRyLT5zaXplID0gcmVnLT5zaXplOworCQkJCVNFVF9GSUVMRChyZWdfaGRyLT5kYXRhLAorCQkJCQlEQkdfSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfUkVHX0lELAorCQkJCQlydWxlLT5udW1fY29uZF9yZWdzICsgcmVnX2lkKTsKKworCQkJCS8qIFdyaXRlIHJlZ2lzdGVyIHZhbHVlcyAqLworCQkJCWZvciAoaSA9IDA7IGkgPCByZWctPnNpemU7CisJCQkJICAgICBpKyssIG9mZnNldCsrLCBncmNfYWRkciArPSA0KQorCQkJCQlkdW1wX2J1ZltvZmZzZXRdID0KKwkJCQkJCXFlZF9yZChwX2h3Zm4sIHBfcHR0LCBncmNfYWRkcik7CisJCQkJfQorCQkJfQorCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIER1bXBzIGlkbGUgY2hlY2sgcnVsZSBlbnRyaWVzLiBSZXR1cm5zIHRoZSBkdW1wZWQgc2l6ZSBpbiBkd29yZHMuICovCitzdGF0aWMgdTMyCitxZWRfaWRsZV9jaGtfZHVtcF9ydWxlX2VudHJpZXMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCSAgICAgICB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXAsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19ydWxlICppbnB1dF9ydWxlcywKKwkJCSAgICAgICB1MzIgbnVtX2lucHV0X3J1bGVzLCB1MzIgKm51bV9mYWlsaW5nX3J1bGVzKQoreworCXN0cnVjdCBkYmdfdG9vbHNfZGF0YSAqZGV2X2RhdGEgPSAmcF9od2ZuLT5kYmdfaW5mbzsKKwl1MzIgY29uZF9yZWdfdmFsdWVzW0lETEVfQ0hLX01BWF9FTlRSSUVTX1NJWkVdOworCXUzMiBpLCBqLCBvZmZzZXQgPSAwOworCXUxNiBlbnRyeV9pZDsKKwl1OCByZWdfaWQ7CisKKwkqbnVtX2ZhaWxpbmdfcnVsZXMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1faW5wdXRfcnVsZXM7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX2NvbmRfcmVnICpjb25kX3JlZ3M7CisJCWNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfcnVsZSAqcnVsZTsKKwkJY29uc3QgdW5pb24gZGJnX2lkbGVfY2hrX3JlZyAqcmVnczsKKwkJdTE2IG51bV9yZWdfZW50cmllcyA9IDE7CisJCWJvb2wgY2hlY2tfcnVsZSA9IHRydWU7CisJCWNvbnN0IHUzMiAqaW1tX3ZhbHVlczsKKworCQlydWxlID0gJmlucHV0X3J1bGVzW2ldOworCQlyZWdzID0gJigoY29uc3QgdW5pb24gZGJnX2lkbGVfY2hrX3JlZyAqKQorCQkJIHNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19JRExFX0NIS19SRUdTXS5wdHIpCisJCQlbcnVsZS0+cmVnX29mZnNldF07CisJCWNvbmRfcmVncyA9ICZyZWdzWzBdLmNvbmRfcmVnOworCQlpbW1fdmFsdWVzID0gJnNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19JRExFX0NIS19JTU1TXS5wdHIKKwkJCSAgICAgW3J1bGUtPmltbV9vZmZzZXRdOworCisJCS8qIENoZWNrIGlmIGFsbCBjb25kaXRpb24gcmVnaXN0ZXIgYmxvY2tzIGFyZSBvdXQgb2YgcmVzZXQsIGFuZAorCQkgKiBmaW5kIG1heGltYWwgbnVtYmVyIG9mIGVudHJpZXMgKGFsbCBjb25kaXRpb24gcmVnaXN0ZXJzIHRoYXQKKwkJICogYXJlIG1lbW9yaWVzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplLCB3aGljaCBpcyA+IDEpLgorCQkgKi8KKwkJZm9yIChyZWdfaWQgPSAwOyByZWdfaWQgPCBydWxlLT5udW1fY29uZF9yZWdzICYmIGNoZWNrX3J1bGU7CisJCSAgICAgcmVnX2lkKyspIHsKKwkJCXUzMiBibG9ja19pZCA9IEdFVF9GSUVMRChjb25kX3JlZ3NbcmVnX2lkXS5kYXRhLAorCQkJCQkJREJHX0lETEVfQ0hLX0NPTkRfUkVHX0JMT0NLX0lEKTsKKworCQkJaWYgKGJsb2NrX2lkID49IE1BWF9CTE9DS19JRCkgeworCQkJCURQX05PVElDRShwX2h3Zm4sICJJbnZhbGlkIGJsb2NrX2lkXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJY2hlY2tfcnVsZSA9ICFkZXZfZGF0YS0+YmxvY2tfaW5fcmVzZXRbYmxvY2tfaWRdOworCQkJaWYgKGNvbmRfcmVnc1tyZWdfaWRdLm51bV9lbnRyaWVzID4gbnVtX3JlZ19lbnRyaWVzKQorCQkJCW51bV9yZWdfZW50cmllcyA9IGNvbmRfcmVnc1tyZWdfaWRdLm51bV9lbnRyaWVzOworCQl9CisKKwkJaWYgKCFjaGVja19ydWxlICYmIGR1bXApCisJCQljb250aW51ZTsKKworCQkvKiBHbyBvdmVyIGFsbCByZWdpc3RlciBlbnRyaWVzIChudW1iZXIgb2YgZW50cmllcyBpcyB0aGUgc2FtZQorCQkgKiBmb3IgYWxsIGNvbmRpdGlvbiByZWdpc3RlcnMpLgorCQkgKi8KKwkJZm9yIChlbnRyeV9pZCA9IDA7IGVudHJ5X2lkIDwgbnVtX3JlZ19lbnRyaWVzOyBlbnRyeV9pZCsrKSB7CisJCQkvKiBSZWFkIGN1cnJlbnQgZW50cnkgb2YgYWxsIGNvbmRpdGlvbiByZWdpc3RlcnMgKi8KKwkJCWlmIChkdW1wKSB7CisJCQkJdTMyIG5leHRfcmVnX29mZnNldCA9IDA7CisKKwkJCQlmb3IgKHJlZ19pZCA9IDA7CisJCQkJICAgICByZWdfaWQgPCBydWxlLT5udW1fY29uZF9yZWdzOworCQkJCSAgICAgcmVnX2lkKyspIHsKKwkJCQkJY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19jb25kX3JlZworCQkJCQkJKnJlZyA9ICZjb25kX3JlZ3NbcmVnX2lkXTsKKworCQkJCQkvKiBGaW5kIEdSQyBhZGRyZXNzIChpZiBpdCdzIGEgbWVtb3J5LAorCQkJCQkgKiB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWMgZW50cnkgaXMKKwkJCQkJICogY2FsY3VsYXRlZCkuCisJCQkJCSAqLworCQkJCQl1MzIgZ3JjX2FkZHIgPQorCQkJCQkgICBEV09SRFNfVE9fQllURVMoCisJCQkJCQlHRVRfRklFTEQocmVnLT5kYXRhLAorCQkJCQkJICAgIERCR19JRExFX0NIS19DT05EX1JFR19BRERSRVNTKSk7CisKKwkJCQkJaWYgKHJlZy0+bnVtX2VudHJpZXMgPiAxIHx8CisJCQkJCSAgICByZWctPnN0YXJ0X2VudHJ5ID4gMCkgeworCQkJCQkJdTMyIHBhZGRlZF9lbnRyeV9zaXplID0KKwkJCQkJCQlyZWctPmVudHJ5X3NpemUgPiAxID8KKwkJCQkJCQlyb3VuZHVwX3Bvd19vZl90d28KKwkJCQkJCQkocmVnLT5lbnRyeV9zaXplKSA6IDE7CisKKwkJCQkJCWdyY19hZGRyICs9CisJCQkJCQkJRFdPUkRTX1RPX0JZVEVTKAorCQkJCQkJCQkocmVnLT5zdGFydF9lbnRyeSArCisJCQkJCQkJCWVudHJ5X2lkKQorCQkJCQkJCQkqIHBhZGRlZF9lbnRyeV9zaXplKTsKKwkJCQkJfQorCisJCQkJCS8qIFJlYWQgcmVnaXN0ZXJzICovCisJCQkJCWlmIChuZXh0X3JlZ19vZmZzZXQgKyByZWctPmVudHJ5X3NpemUgPj0KKwkJCQkJICAgIElETEVfQ0hLX01BWF9FTlRSSUVTX1NJWkUpIHsKKwkJCQkJCURQX05PVElDRShwX2h3Zm4sCisJCQkJCQkJICAiaWRsZSBjaGVjayByZWdpc3RlcnMgZW50cnkgaXMgdG9vIGxhcmdlXG4iKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisKKwkJCQkJZm9yIChqID0gMDsgaiA8IHJlZy0+ZW50cnlfc2l6ZTsKKwkJCQkJICAgICBqKyssIG5leHRfcmVnX29mZnNldCsrLAorCQkJCQkgICAgIGdyY19hZGRyICs9IDQpCisJCQkJCSAgICAgY29uZF9yZWdfdmFsdWVzW25leHRfcmVnX29mZnNldF0gPQorCQkJCQkJcWVkX3JkKHBfaHdmbiwgcF9wdHQsIGdyY19hZGRyKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIENhbGwgcnVsZSdzIGNvbmRpdGlvbiBmdW5jdGlvbiAtIGEgcmV0dXJuIHZhbHVlIG9mCisJCQkgKiB0cnVlIGluZGljYXRlcyBmYWlsdXJlLgorCQkJICovCisJCQlpZiAoKCpjb25kX2FycltydWxlLT5jb25kX2lkXSkoY29uZF9yZWdfdmFsdWVzLAorCQkJCQkJICAgICAgIGltbV92YWx1ZXMpIHx8ICFkdW1wKSB7CisJCQkJb2Zmc2V0ICs9CisJCQkJCXFlZF9pZGxlX2Noa19kdW1wX2ZhaWx1cmUocF9od2ZuLAorCQkJCQkJCXBfcHR0LAorCQkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCQkJCWR1bXAsCisJCQkJCQkJcnVsZS0+cnVsZV9pZCwKKwkJCQkJCQlydWxlLAorCQkJCQkJCWVudHJ5X2lkLAorCQkJCQkJCWNvbmRfcmVnX3ZhbHVlcyk7CisJCQkJKCpudW1fZmFpbGluZ19ydWxlcykrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qIFBlcmZvcm1zIElkbGUgQ2hlY2sgRHVtcCB0byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFJldHVybnMgdGhlIGR1bXBlZCBzaXplIGluIGR3b3Jkcy4KKyAqLworc3RhdGljIHUzMiBxZWRfaWRsZV9jaGtfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJdTMyIG9mZnNldCA9IDAsIGlucHV0X29mZnNldCA9IDAsIG51bV9mYWlsaW5nX3J1bGVzID0gMDsKKwl1MzIgbnVtX2ZhaWxpbmdfcnVsZXNfb2Zmc2V0OworCisJLyogRHVtcCBnbG9iYWwgcGFyYW1zICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX2NvbW1vbl9nbG9iYWxfcGFyYW1zKHBfaHdmbiwKKwkJCQkJCXBfcHR0LAorCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsIDEpOworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAiZHVtcC10eXBlIiwgImlkbGUtY2hrIik7CisKKwkvKiBEdW1wIGlkbGUgY2hlY2sgc2VjdGlvbiBoZWFkZXIgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJpZGxlX2NoayIsIDEpOworCW51bV9mYWlsaW5nX3J1bGVzX29mZnNldCA9IG9mZnNldDsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAibnVtX3J1bGVzIiwgMCk7CisJd2hpbGUgKGlucHV0X29mZnNldCA8CisJICAgICAgIHNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19JRExFX0NIS19SVUxFU10uc2l6ZV9pbl9kd29yZHMpIHsKKwkJY29uc3Qgc3RydWN0IGRiZ19pZGxlX2Noa19jb25kX2hkciAqY29uZF9oZHIgPQorCQkJKGNvbnN0IHN0cnVjdCBkYmdfaWRsZV9jaGtfY29uZF9oZHIgKikKKwkJCSZzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfSURMRV9DSEtfUlVMRVNdLnB0cgorCQkJW2lucHV0X29mZnNldCsrXTsKKwkJYm9vbCBldmFsX21vZGUgPSBHRVRfRklFTEQoY29uZF9oZHItPm1vZGUuZGF0YSwKKwkJCQkJICAgREJHX01PREVfSERSX0VWQUxfTU9ERSkgPiAwOworCQlib29sIG1vZGVfbWF0Y2ggPSB0cnVlOworCisJCS8qIENoZWNrIG1vZGUgKi8KKwkJaWYgKGV2YWxfbW9kZSkgeworCQkJdTE2IG1vZGVzX2J1Zl9vZmZzZXQgPQorCQkJCUdFVF9GSUVMRChjb25kX2hkci0+bW9kZS5kYXRhLAorCQkJCQkgIERCR19NT0RFX0hEUl9NT0RFU19CVUZfT0ZGU0VUKTsKKworCQkJbW9kZV9tYXRjaCA9IHFlZF9pc19tb2RlX21hdGNoKHBfaHdmbiwKKwkJCQkJCSAgICAgICAmbW9kZXNfYnVmX29mZnNldCk7CisJCX0KKworCQlpZiAobW9kZV9tYXRjaCkgeworCQkJdTMyIGN1cnJfZmFpbGluZ19ydWxlczsKKworCQkJb2Zmc2V0ICs9CisJCQkgICAgcWVkX2lkbGVfY2hrX2R1bXBfcnVsZV9lbnRyaWVzKHBfaHdmbiwKKwkJCQlwX3B0dCwKKwkJCQlkdW1wX2J1ZiArIG9mZnNldCwKKwkJCQlkdW1wLAorCQkJCShjb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX3J1bGUgKikKKwkJCQkmc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0lETEVfQ0hLX1JVTEVTXS4KKwkJCQlwdHJbaW5wdXRfb2Zmc2V0XSwKKwkJCQljb25kX2hkci0+ZGF0YV9zaXplIC8gSURMRV9DSEtfUlVMRV9TSVpFX0RXT1JEUywKKwkJCQkmY3Vycl9mYWlsaW5nX3J1bGVzKTsKKwkJCW51bV9mYWlsaW5nX3J1bGVzICs9IGN1cnJfZmFpbGluZ19ydWxlczsKKwkJfQorCisJCWlucHV0X29mZnNldCArPSBjb25kX2hkci0+ZGF0YV9zaXplOworCX0KKworCS8qIE92ZXJ3cml0ZSBudW1fcnVsZXMgcGFyYW1ldGVyICovCisJaWYgKGR1bXApCisJCXFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIG51bV9mYWlsaW5nX3J1bGVzX29mZnNldCwKKwkJCQkgICBkdW1wLCAibnVtX3J1bGVzIiwgbnVtX2ZhaWxpbmdfcnVsZXMpOworCisJcmV0dXJuIG9mZnNldDsKK30KKworLyogRmluZHMgdGhlIG1ldGEgZGF0YSBpbWFnZSBpbiBOVlJBTS4gKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX2ZpbmRfbnZyYW1faW1hZ2Uoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCSAgICB1MzIgaW1hZ2VfdHlwZSwKKwkJCQkJICAgIHUzMiAqbnZyYW1fb2Zmc2V0X2J5dGVzLAorCQkJCQkgICAgdTMyICpudnJhbV9zaXplX2J5dGVzKQoreworCXUzMiByZXRfbWNwX3Jlc3AsIHJldF9tY3BfcGFyYW0sIHJldF90eG5fc2l6ZTsKKwlzdHJ1Y3QgbWNwX2ZpbGVfYXR0IGZpbGVfYXR0OworCisJLyogQ2FsbCBOVlJBTSBnZXQgZmlsZSBjb21tYW5kICovCisJaWYgKHFlZF9tY3BfbnZtX3JkX2NtZChwX2h3Zm4sIHBfcHR0LCBEUlZfTVNHX0NPREVfTlZNX0dFVF9GSUxFX0FUVCwKKwkJCSAgICAgICBpbWFnZV90eXBlLCAmcmV0X21jcF9yZXNwLCAmcmV0X21jcF9wYXJhbSwKKwkJCSAgICAgICAmcmV0X3R4bl9zaXplLCAodTMyICopJmZpbGVfYXR0KSAhPSAwKQorCQlyZXR1cm4gREJHX1NUQVRVU19OVlJBTV9HRVRfSU1BR0VfRkFJTEVEOworCisJLyogQ2hlY2sgcmVzcG9uc2UgKi8KKwlpZiAoKHJldF9tY3BfcmVzcCAmIEZXX01TR19DT0RFX01BU0spICE9IEZXX01TR19DT0RFX05WTV9PSykKKwkJcmV0dXJuIERCR19TVEFUVVNfTlZSQU1fR0VUX0lNQUdFX0ZBSUxFRDsKKworCS8qIFVwZGF0ZSByZXR1cm4gdmFsdWVzICovCisJKm52cmFtX29mZnNldF9ieXRlcyA9IGZpbGVfYXR0Lm52bV9zdGFydF9hZGRyOworCSpudnJhbV9zaXplX2J5dGVzID0gZmlsZV9hdHQubGVuOworCURQX1ZFUkJPU0UocF9od2ZuLAorCQkgICBRRURfTVNHX0RFQlVHLAorCQkgICAiZmluZF9udnJhbV9pbWFnZTogZm91bmQgTlZSQU0gaW1hZ2Ugb2YgdHlwZSAlZCBpbiBOVlJBTSBvZmZzZXQgJWQgYnl0ZXMgd2l0aCBzaXplICVkIGJ5dGVzXG4iLAorCQkgICBpbWFnZV90eXBlLCAqbnZyYW1fb2Zmc2V0X2J5dGVzLCAqbnZyYW1fc2l6ZV9ieXRlcyk7CisKKwkvKiBDaGVjayBhbGlnbm1lbnQgKi8KKwlpZiAoKm52cmFtX3NpemVfYnl0ZXMgJiAweDMpCisJCXJldHVybiBEQkdfU1RBVFVTX05PTl9BTElHTkVEX05WUkFNX0lNQUdFOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9udnJhbV9yZWFkKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgICB1MzIgbnZyYW1fb2Zmc2V0X2J5dGVzLAorCQkJCSAgICAgIHUzMiBudnJhbV9zaXplX2J5dGVzLCB1MzIgKnJldF9idWYpCit7CisJdTMyIHJldF9tY3BfcmVzcCwgcmV0X21jcF9wYXJhbSwgcmV0X3JlYWRfc2l6ZTsKKwl1MzIgYnl0ZXNfdG9fY29weSwgcmVhZF9vZmZzZXQgPSAwOworCXMzMiBieXRlc19sZWZ0ID0gbnZyYW1fc2l6ZV9ieXRlczsKKworCURQX1ZFUkJPU0UocF9od2ZuLAorCQkgICBRRURfTVNHX0RFQlVHLAorCQkgICAibnZyYW1fcmVhZDogcmVhZGluZyBpbWFnZSBvZiBzaXplICVkIGJ5dGVzIGZyb20gTlZSQU1cbiIsCisJCSAgIG52cmFtX3NpemVfYnl0ZXMpOworCWRvIHsKKwkJYnl0ZXNfdG9fY29weSA9CisJCSAgICAoYnl0ZXNfbGVmdCA+CisJCSAgICAgTUNQX0RSVl9OVk1fQlVGX0xFTikgPyBNQ1BfRFJWX05WTV9CVUZfTEVOIDogYnl0ZXNfbGVmdDsKKworCQkvKiBDYWxsIE5WUkFNIHJlYWQgY29tbWFuZCAqLworCQlpZiAocWVkX21jcF9udm1fcmRfY21kKHBfaHdmbiwgcF9wdHQsCisJCQkJICAgICAgIERSVl9NU0dfQ09ERV9OVk1fUkVBRF9OVlJBTSwKKwkJCQkgICAgICAgKG52cmFtX29mZnNldF9ieXRlcyArCisJCQkJCXJlYWRfb2Zmc2V0KSB8CisJCQkJICAgICAgIChieXRlc190b19jb3B5IDw8CisJCQkJCURSVl9NQl9QQVJBTV9OVk1fTEVOX1NISUZUKSwKKwkJCQkgICAgICAgJnJldF9tY3BfcmVzcCwgJnJldF9tY3BfcGFyYW0sCisJCQkJICAgICAgICZyZXRfcmVhZF9zaXplLAorCQkJCSAgICAgICAodTMyICopKCh1OCAqKXJldF9idWYgKworCQkJCQkgICAgICAgcmVhZF9vZmZzZXQpKSAhPSAwKQorCQkJcmV0dXJuIERCR19TVEFUVVNfTlZSQU1fUkVBRF9GQUlMRUQ7CisKKwkJLyogQ2hlY2sgcmVzcG9uc2UgKi8KKwkJaWYgKChyZXRfbWNwX3Jlc3AgJiBGV19NU0dfQ09ERV9NQVNLKSAhPSBGV19NU0dfQ09ERV9OVk1fT0spCisJCQlyZXR1cm4gREJHX1NUQVRVU19OVlJBTV9SRUFEX0ZBSUxFRDsKKworCQkvKiBVcGRhdGUgcmVhZCBvZmZzZXQgKi8KKwkJcmVhZF9vZmZzZXQgKz0gcmV0X3JlYWRfc2l6ZTsKKwkJYnl0ZXNfbGVmdCAtPSByZXRfcmVhZF9zaXplOworCX0gd2hpbGUgKGJ5dGVzX2xlZnQgPiAwKTsKKworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCisvKiBHZXQgaW5mbyBvbiB0aGUgTUNQIFRyYWNlIGRhdGEgaW4gdGhlIHNjcmF0Y2hwYWQ6CisgKiAtIHRyYWNlX2RhdGFfZ3JjX2FkZHIgLSB0aGUgR1JDIGFkZHJlc3Mgb2YgdGhlIHRyYWNlIGRhdGEKKyAqIC0gdHJhY2VfZGF0YV9zaXplX2J5dGVzIC0gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIE1DUCBUcmFjZSBkYXRhICh3aXRob3V0CisgKgl0aGUgaGVhZGVyKQorICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9tY3BfdHJhY2VfZ2V0X2RhdGFfaW5mbyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgIHUzMiAqdHJhY2VfZGF0YV9ncmNfYWRkciwKKwkJCQkJCSAgIHUzMiAqdHJhY2VfZGF0YV9zaXplX2J5dGVzKQoreworCS8qIFJlYWQgTUNQIHRyYWNlIHNlY3Rpb24gb2Zmc2l6ZSBzdHJ1Y3R1cmUgZnJvbSBNQ1Agc2NyYXRjaHBhZCAqLworCXUzMiBzcGFkX3RyYWNlX29mZnNpemUgPSBxZWRfcmQocF9od2ZuLAorCQkJCQlwX3B0dCwKKwkJCQkJTUNQX1NQQURfVFJBQ0VfT0ZGU0laRV9BRERSKTsKKwl1MzIgc2lnbmF0dXJlOworCisJLyogRXh0cmFjdCBNQ1AgdHJhY2Ugc2VjdGlvbiBHUkMgYWRkcmVzcyBmcm9tIG9mZnNpemUgc3RydWN0dXJlICh3aXRoaW4KKwkgKiBzY3JhdGNocGFkKS4KKwkgKi8KKwkqdHJhY2VfZGF0YV9ncmNfYWRkciA9CisJCU1DUF9SRUdfU0NSQVRDSCArIFNFQ1RJT05fT0ZGU0VUKHNwYWRfdHJhY2Vfb2Zmc2l6ZSk7CisKKwkvKiBSZWFkIHNpZ25hdHVyZSBmcm9tIE1DUCB0cmFjZSBzZWN0aW9uICovCisJc2lnbmF0dXJlID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkgICAqdHJhY2VfZGF0YV9ncmNfYWRkciArCisJCQkgICBvZmZzZXRvZihzdHJ1Y3QgbWNwX3RyYWNlLCBzaWduYXR1cmUpKTsKKwlpZiAoc2lnbmF0dXJlICE9IE1GV19UUkFDRV9TSUdOQVRVUkUpCisJCXJldHVybiBEQkdfU1RBVFVTX0lOVkFMSURfVFJBQ0VfU0lHTkFUVVJFOworCisJLyogUmVhZCB0cmFjZSBzaXplIGZyb20gTUNQIHRyYWNlIHNlY3Rpb24gKi8KKwkqdHJhY2VfZGF0YV9zaXplX2J5dGVzID0gcWVkX3JkKHBfaHdmbiwKKwkJCQkJcF9wdHQsCisJCQkJCSp0cmFjZV9kYXRhX2dyY19hZGRyICsKKwkJCQkJb2Zmc2V0b2Yoc3RydWN0IG1jcF90cmFjZSwgc2l6ZSkpOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCisvKiBSZWFkcyBNQ1AgdHJhY2UgbWV0YSBkYXRhIGltYWdlIGZyb20gTlZSQU0uCisgKiAtIHJ1bm5pbmdfYnVuZGxlX2lkIChPVVQpIC0gdGhlIHJ1bm5pbmcgYnVuZGxlIElEIChpbnZhbGlkIHdoZW4gbG9hZGVkIGZyb20KKyAqCWZpbGUpCisgKiAtIHRyYWNlX21ldGFfb2Zmc2V0X2J5dGVzIChPVVQpIC0gdGhlIE5WUkFNIG9mZnNldCBpbiBieXRlcyBpbiB3aGljaCB0aGUgTUNQCisgKglUcmFjZSBtZXRhIGRhdGEgc3RhcnRzIChpbnZhbGlkIHdoZW4gbG9hZGVkIGZyb20gZmlsZSkKKyAqIC0gdHJhY2VfbWV0YV9zaXplX2J5dGVzIChPVVQpIC0gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIE1DUCBUcmFjZSBtZXRhIGRhdGEKKyAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfbWNwX3RyYWNlX2dldF9tZXRhX2luZm8oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICB1MzIgdHJhY2VfZGF0YV9zaXplX2J5dGVzLAorCQkJCQkJICAgdTMyICpydW5uaW5nX2J1bmRsZV9pZCwKKwkJCQkJCSAgIHUzMiAqdHJhY2VfbWV0YV9vZmZzZXRfYnl0ZXMsCisJCQkJCQkgICB1MzIgKnRyYWNlX21ldGFfc2l6ZV9ieXRlcykKK3sKKwkvKiBSZWFkIE1DUCB0cmFjZSBzZWN0aW9uIG9mZnNpemUgc3RydWN0dXJlIGZyb20gTUNQIHNjcmF0Y2hwYWQgKi8KKwl1MzIgc3BhZF90cmFjZV9vZmZzaXplID0gcWVkX3JkKHBfaHdmbiwKKwkJCQkJcF9wdHQsCisJCQkJCU1DUF9TUEFEX1RSQUNFX09GRlNJWkVfQUREUik7CisKKwkvKiBGaW5kIHJ1bm5pbmcgYnVuZGxlIElEICovCisJdTMyIHJ1bm5pbmdfbWZ3X2FkZHIgPQorCQlNQ1BfUkVHX1NDUkFUQ0ggKyBTRUNUSU9OX09GRlNFVChzcGFkX3RyYWNlX29mZnNpemUpICsKKwkJUUVEX1NFQ1RJT05fU0laRShzcGFkX3RyYWNlX29mZnNpemUpICsgdHJhY2VfZGF0YV9zaXplX2J5dGVzOworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXM7CisJdTMyIG52cmFtX2ltYWdlX3R5cGU7CisKKwkqcnVubmluZ19idW5kbGVfaWQgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwgcnVubmluZ19tZndfYWRkcik7CisJaWYgKCpydW5uaW5nX2J1bmRsZV9pZCA+IDEpCisJCXJldHVybiBEQkdfU1RBVFVTX0lOVkFMSURfTlZSQU1fQlVORExFOworCisJLyogRmluZCBpbWFnZSBpbiBOVlJBTSAqLworCW52cmFtX2ltYWdlX3R5cGUgPQorCSAgICAoKnJ1bm5pbmdfYnVuZGxlX2lkID09CisJICAgICBESVJfSURfMSkgPyBOVk1fVFlQRV9NRldfVFJBQ0UxIDogTlZNX1RZUEVfTUZXX1RSQUNFMjsKKwlzdGF0dXMgPSBxZWRfZmluZF9udnJhbV9pbWFnZShwX2h3Zm4sCisJCQkJICAgICAgcF9wdHQsCisJCQkJICAgICAgbnZyYW1faW1hZ2VfdHlwZSwKKwkJCQkgICAgICB0cmFjZV9tZXRhX29mZnNldF9ieXRlcywKKwkJCQkgICAgICB0cmFjZV9tZXRhX3NpemVfYnl0ZXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogUmVhZHMgdGhlIE1DUCBUcmFjZSBkYXRhIGZyb20gdGhlIHNwZWNpZmllZCBHUkMgYWRkcmVzcyBpbnRvIHRoZSBzcGVjaWZpZWQKKyAqIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgcWVkX21jcF90cmFjZV9yZWFkX2RhdGEoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgdTMyIGdyY19hZGRyLCB1MzIgc2l6ZV9pbl9kd29yZHMsIHUzMiAqYnVmKQoreworCXUzMiBpOworCisJRFBfVkVSQk9TRShwX2h3Zm4sCisJCSAgIFFFRF9NU0dfREVCVUcsCisJCSAgICJtY3BfdHJhY2VfcmVhZF9kYXRhOiByZWFkaW5nIHRyYWNlIGRhdGEgb2Ygc2l6ZSAlZCBkd29yZHMgZnJvbSBHUkMgYWRkcmVzcyAweCV4XG4iLAorCQkgICBzaXplX2luX2R3b3JkcywgZ3JjX2FkZHIpOworCWZvciAoaSA9IDA7IGkgPCBzaXplX2luX2R3b3JkczsgaSsrLCBncmNfYWRkciArPSBCWVRFU19JTl9EV09SRCkKKwkJYnVmW2ldID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIGdyY19hZGRyKTsKK30KKworLyogUmVhZHMgdGhlIE1DUCBUcmFjZSBtZXRhIGRhdGEgKGZyb20gTlZSQU0gb3IgYnVmZmVyKSBpbnRvIHRoZSBzcGVjaWZpZWQKKyAqIGJ1ZmZlci4KKyAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfbWNwX3RyYWNlX3JlYWRfbWV0YShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJICAgICAgIHUzMiBudnJhbV9vZmZzZXRfaW5fYnl0ZXMsCisJCQkJCSAgICAgICB1MzIgc2l6ZV9pbl9ieXRlcywgdTMyICpidWYpCit7CisJdTggKmJ5dGVfYnVmID0gKHU4ICopYnVmOworCXU4IG1vZHVsZXNfbnVtLCBpOworCXUzMiBzaWduYXR1cmU7CisKKwkvKiBSZWFkIG1ldGEgZGF0YSBmcm9tIE5WUkFNICovCisJZW51bSBkYmdfc3RhdHVzIHN0YXR1cyA9IHFlZF9udnJhbV9yZWFkKHBfaHdmbiwKKwkJCQkJCXBfcHR0LAorCQkJCQkJbnZyYW1fb2Zmc2V0X2luX2J5dGVzLAorCQkJCQkJc2l6ZV9pbl9ieXRlcywKKwkJCQkJCWJ1Zik7CisKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBFeHRyYWN0IGFuZCBjaGVjayBmaXJzdCBzaWduYXR1cmUgKi8KKwlzaWduYXR1cmUgPSBxZWRfcmVhZF91bmFsaWduZWRfZHdvcmQoYnl0ZV9idWYpOworCWJ5dGVfYnVmICs9IHNpemVvZih1MzIpOworCWlmIChzaWduYXR1cmUgIT0gTUNQX1RSQUNFX01FVEFfSU1BR0VfU0lHTkFUVVJFKQorCQlyZXR1cm4gREJHX1NUQVRVU19JTlZBTElEX1RSQUNFX1NJR05BVFVSRTsKKworCS8qIEV4dHJhY3QgbnVtYmVyIG9mIG1vZHVsZXMgKi8KKwltb2R1bGVzX251bSA9ICooYnl0ZV9idWYrKyk7CisKKwkvKiBTa2lwIGFsbCBtb2R1bGVzICovCisJZm9yIChpID0gMDsgaSA8IG1vZHVsZXNfbnVtOyBpKyspIHsKKwkJdTggbW9kdWxlX2xlbiA9ICooYnl0ZV9idWYrKyk7CisKKwkJYnl0ZV9idWYgKz0gbW9kdWxlX2xlbjsKKwl9CisKKwkvKiBFeHRyYWN0IGFuZCBjaGVjayBzZWNvbmQgc2lnbmF0dXJlICovCisJc2lnbmF0dXJlID0gcWVkX3JlYWRfdW5hbGlnbmVkX2R3b3JkKGJ5dGVfYnVmKTsKKwlieXRlX2J1ZiArPSBzaXplb2YodTMyKTsKKwlpZiAoc2lnbmF0dXJlICE9IE1DUF9UUkFDRV9NRVRBX0lNQUdFX1NJR05BVFVSRSkKKwkJcmV0dXJuIERCR19TVEFUVVNfSU5WQUxJRF9UUkFDRV9TSUdOQVRVUkU7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKKy8qIER1bXAgTUNQIFRyYWNlICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX21jcF90cmFjZV9kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgIGJvb2wgZHVtcCwgdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwl1MzIgdHJhY2VfZGF0YV9ncmNfYWRkciwgdHJhY2VfZGF0YV9zaXplX2J5dGVzLCB0cmFjZV9kYXRhX3NpemVfZHdvcmRzOworCXUzMiB0cmFjZV9tZXRhX3NpemVfZHdvcmRzLCBydW5uaW5nX2J1bmRsZV9pZCwgb2Zmc2V0ID0gMDsKKwl1MzIgdHJhY2VfbWV0YV9vZmZzZXRfYnl0ZXMsIHRyYWNlX21ldGFfc2l6ZV9ieXRlczsKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzOworCWludCBoYWx0ZWQgPSAwOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gMDsKKworCS8qIEdldCB0cmFjZSBkYXRhIGluZm8gKi8KKwlzdGF0dXMgPSBxZWRfbWNwX3RyYWNlX2dldF9kYXRhX2luZm8ocF9od2ZuLAorCQkJCQkgICAgIHBfcHR0LAorCQkJCQkgICAgICZ0cmFjZV9kYXRhX2dyY19hZGRyLAorCQkJCQkgICAgICZ0cmFjZV9kYXRhX3NpemVfYnl0ZXMpOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIER1bXAgZ2xvYmFsIHBhcmFtcyAqLworCW9mZnNldCArPSBxZWRfZHVtcF9jb21tb25fZ2xvYmFsX3BhcmFtcyhwX2h3Zm4sCisJCQkJCQlwX3B0dCwKKwkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAxKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgImR1bXAtdHlwZSIsICJtY3AtdHJhY2UiKTsKKworCS8qIEhhbHQgTUNQIHdoaWxlIHJlYWRpbmcgZnJvbSBzY3JhdGNocGFkIHNvIHRoZSByZWFkIGRhdGEgd2lsbCBiZQorCSAqIGNvbnNpc3RlbnQgaWYgaGFsdCBmYWlscywgTUNQIHRyYWNlIGlzIHRha2VuIGFueXdheSwgd2l0aCBhIHNtYWxsCisJICogcmlzayB0aGF0IGl0IG1heSBiZSBjb3JydXB0LgorCSAqLworCWlmIChkdW1wKSB7CisJCWhhbHRlZCA9ICFxZWRfbWNwX2hhbHQocF9od2ZuLCBwX3B0dCk7CisJCWlmICghaGFsdGVkKQorCQkJRFBfTk9USUNFKHBfaHdmbiwgIk1DUCBoYWx0IGZhaWxlZCFcbiIpOworCX0KKworCS8qIEZpbmQgdHJhY2UgZGF0YSBzaXplICovCisJdHJhY2VfZGF0YV9zaXplX2R3b3JkcyA9CisJCURJVl9ST1VORF9VUCh0cmFjZV9kYXRhX3NpemVfYnl0ZXMgKyBzaXplb2Yoc3RydWN0IG1jcF90cmFjZSksCisJCQkgICAgIEJZVEVTX0lOX0RXT1JEKTsKKworCS8qIER1bXAgdHJhY2UgZGF0YSBzZWN0aW9uIGhlYWRlciBhbmQgcGFyYW0gKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsICJtY3BfdHJhY2VfZGF0YSIsIDEpOworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAic2l6ZSIsIHRyYWNlX2RhdGFfc2l6ZV9kd29yZHMpOworCisJLyogUmVhZCB0cmFjZSBkYXRhIGZyb20gc2NyYXRjaHBhZCBpbnRvIGR1bXAgYnVmZmVyICovCisJaWYgKGR1bXApCisJCXFlZF9tY3BfdHJhY2VfcmVhZF9kYXRhKHBfaHdmbiwKKwkJCQkJcF9wdHQsCisJCQkJCXRyYWNlX2RhdGFfZ3JjX2FkZHIsCisJCQkJCXRyYWNlX2RhdGFfc2l6ZV9kd29yZHMsCisJCQkJCWR1bXBfYnVmICsgb2Zmc2V0KTsKKwlvZmZzZXQgKz0gdHJhY2VfZGF0YV9zaXplX2R3b3JkczsKKworCS8qIFJlc3VtZSBNQ1AgKG9ubHkgaWYgaGFsdCBzdWNjZWVkZWQpICovCisJaWYgKGhhbHRlZCAmJiBxZWRfbWNwX3Jlc3VtZShwX2h3Zm4sIHBfcHR0KSAhPSAwKQorCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIHJlc3VtZSBNQ1AgYWZ0ZXIgaGFsdCFcbiIpOworCisJLyogRHVtcCB0cmFjZSBtZXRhIHNlY3Rpb24gaGVhZGVyICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLCAibWNwX3RyYWNlX21ldGEiLCAxKTsKKworCS8qIFJlYWQgdHJhY2UgbWV0YSBpbmZvICovCisJc3RhdHVzID0gcWVkX21jcF90cmFjZV9nZXRfbWV0YV9pbmZvKHBfaHdmbiwKKwkJCQkJICAgICBwX3B0dCwKKwkJCQkJICAgICB0cmFjZV9kYXRhX3NpemVfYnl0ZXMsCisJCQkJCSAgICAgJnJ1bm5pbmdfYnVuZGxlX2lkLAorCQkJCQkgICAgICZ0cmFjZV9tZXRhX29mZnNldF9ieXRlcywKKwkJCQkJICAgICAmdHJhY2VfbWV0YV9zaXplX2J5dGVzKTsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBEdW1wIHRyYWNlIG1ldGEgc2l6ZSBwYXJhbSAodHJhY2VfbWV0YV9zaXplX2J5dGVzIGlzIGFsd2F5cworCSAqIGR3b3JkLWFsaWduZWQpLgorCSAqLworCXRyYWNlX21ldGFfc2l6ZV9kd29yZHMgPSBCWVRFU19UT19EV09SRFModHJhY2VfbWV0YV9zaXplX2J5dGVzKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAlkdW1wLCAic2l6ZSIsCisJCQkJICAgICB0cmFjZV9tZXRhX3NpemVfZHdvcmRzKTsKKworCS8qIFJlYWQgdHJhY2UgbWV0YSBpbWFnZSBpbnRvIGR1bXAgYnVmZmVyICovCisJaWYgKGR1bXApIHsKKwkJc3RhdHVzID0gcWVkX21jcF90cmFjZV9yZWFkX21ldGEocF9od2ZuLAorCQkJCQkJcF9wdHQsCisJCQkJCQl0cmFjZV9tZXRhX29mZnNldF9ieXRlcywKKwkJCQkJCXRyYWNlX21ldGFfc2l6ZV9ieXRlcywKKwkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0KTsKKwkJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlvZmZzZXQgKz0gdHJhY2VfbWV0YV9zaXplX2R3b3JkczsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IG9mZnNldDsKKworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCisvKiBEdW1wIEdSQyBGSUZPICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX3JlZ19maWZvX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgYm9vbCBkdW1wLCB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXUzMiBvZmZzZXQgPSAwLCBkd29yZHNfcmVhZCwgc2l6ZV9wYXJhbV9vZmZzZXQ7CisJYm9vbCBmaWZvX2hhc19kYXRhOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gMDsKKworCS8qIER1bXAgZ2xvYmFsIHBhcmFtcyAqLworCW9mZnNldCArPSBxZWRfZHVtcF9jb21tb25fZ2xvYmFsX3BhcmFtcyhwX2h3Zm4sCisJCQkJCQlwX3B0dCwKKwkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAxKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgImR1bXAtdHlwZSIsICJyZWctZmlmbyIpOworCisJLyogRHVtcCBmaWZvIGRhdGEgc2VjdGlvbiBoZWFkZXIgYW5kIHBhcmFtLiBUaGUgc2l6ZSBwYXJhbSBpcyAwIGZvciBub3csCisJICogYW5kIGlzIG92ZXJ3cml0dGVuIGFmdGVyIHJlYWRpbmcgdGhlIEZJRk8uCisJICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLCAicmVnX2ZpZm9fZGF0YSIsIDEpOworCXNpemVfcGFyYW1fb2Zmc2V0ID0gb2Zmc2V0OworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJzaXplIiwgMCk7CisKKwlpZiAoIWR1bXApIHsKKwkJLyogRklGTyBtYXggc2l6ZSBpcyBSRUdfRklGT19ERVBUSF9EV09SRFMuIFRoZXJlIGlzIG5vIHdheSB0bworCQkgKiB0ZXN0IGhvdyBtdWNoIGRhdGEgaXMgYXZhaWxhYmxlLCBleGNlcHQgZm9yIHJlYWRpbmcgaXQuCisJCSAqLworCQlvZmZzZXQgKz0gUkVHX0ZJRk9fREVQVEhfRFdPUkRTOworCQkqbnVtX2R1bXBlZF9kd29yZHMgPSBvZmZzZXQ7CisJCXJldHVybiBEQkdfU1RBVFVTX09LOworCX0KKworCWZpZm9faGFzX2RhdGEgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCSAgICAgICBHUkNfUkVHX1RSQUNFX0ZJRk9fVkFMSURfREFUQSkgPiAwOworCisJLyogUHVsbCBhdmFpbGFibGUgZGF0YSBmcm9tIGZpZm8uIFVzZSBETUFFIHNpbmNlIHRoaXMgaXMgd2lkZWJ1cyBtZW1vcnkKKwkgKiBhbmQgbXVzdCBiZSBhY2Nlc3NlZCBhdG9taWNhbGx5LiBUZXN0IGZvciBkd29yZHNfcmVhZCBub3QgcGFzc2luZworCSAqIGJ1ZmZlciBzaXplIHNpbmNlIG1vcmUgZW50cmllcyBjb3VsZCBiZSBhZGRlZCB0byB0aGUgYnVmZmVyIGFzIHdlIGFyZQorCSAqIGVtcHR5aW5nIGl0LgorCSAqLworCWZvciAoZHdvcmRzX3JlYWQgPSAwOworCSAgICAgZmlmb19oYXNfZGF0YSAmJiBkd29yZHNfcmVhZCA8IFJFR19GSUZPX0RFUFRIX0RXT1JEUzsKKwkgICAgIGR3b3Jkc19yZWFkICs9IFJFR19GSUZPX0VMRU1FTlRfRFdPUkRTLCBvZmZzZXQgKz0KKwkgICAgIFJFR19GSUZPX0VMRU1FTlRfRFdPUkRTKSB7CisJCWlmIChxZWRfZG1hZV9ncmMyaG9zdChwX2h3Zm4sIHBfcHR0LCBHUkNfUkVHX1RSQUNFX0ZJRk8sCisJCQkJICAgICAgKHU2NCkodWludHB0cl90KSgmZHVtcF9idWZbb2Zmc2V0XSksCisJCQkJICAgICAgUkVHX0ZJRk9fRUxFTUVOVF9EV09SRFMsIDApKQorCQkJcmV0dXJuIERCR19TVEFUVVNfRE1BRV9GQUlMRUQ7CisJCWZpZm9faGFzX2RhdGEgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCQkgICAgICAgR1JDX1JFR19UUkFDRV9GSUZPX1ZBTElEX0RBVEEpID4gMDsKKwl9CisKKwlxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBzaXplX3BhcmFtX29mZnNldCwgZHVtcCwgInNpemUiLAorCQkJICAgZHdvcmRzX3JlYWQpOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gb2Zmc2V0OworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCisvKiBEdW1wIElHVSBGSUZPICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2lndV9maWZvX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgYm9vbCBkdW1wLCB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXUzMiBvZmZzZXQgPSAwLCBkd29yZHNfcmVhZCwgc2l6ZV9wYXJhbV9vZmZzZXQ7CisJYm9vbCBmaWZvX2hhc19kYXRhOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gMDsKKworCS8qIER1bXAgZ2xvYmFsIHBhcmFtcyAqLworCW9mZnNldCArPSBxZWRfZHVtcF9jb21tb25fZ2xvYmFsX3BhcmFtcyhwX2h3Zm4sCisJCQkJCQlwX3B0dCwKKwkJCQkJCWR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAxKTsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgZHVtcCwgImR1bXAtdHlwZSIsICJpZ3UtZmlmbyIpOworCisJLyogRHVtcCBmaWZvIGRhdGEgc2VjdGlvbiBoZWFkZXIgYW5kIHBhcmFtLiBUaGUgc2l6ZSBwYXJhbSBpcyAwIGZvciBub3csCisJICogYW5kIGlzIG92ZXJ3cml0dGVuIGFmdGVyIHJlYWRpbmcgdGhlIEZJRk8uCisJICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LAorCQkJCSAgICAgICBkdW1wLCAiaWd1X2ZpZm9fZGF0YSIsIDEpOworCXNpemVfcGFyYW1fb2Zmc2V0ID0gb2Zmc2V0OworCW9mZnNldCArPSBxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsICJzaXplIiwgMCk7CisKKwlpZiAoIWR1bXApIHsKKwkJLyogRklGTyBtYXggc2l6ZSBpcyBJR1VfRklGT19ERVBUSF9EV09SRFMuIFRoZXJlIGlzIG5vIHdheSB0bworCQkgKiB0ZXN0IGhvdyBtdWNoIGRhdGEgaXMgYXZhaWxhYmxlLCBleGNlcHQgZm9yIHJlYWRpbmcgaXQuCisJCSAqLworCQlvZmZzZXQgKz0gSUdVX0ZJRk9fREVQVEhfRFdPUkRTOworCQkqbnVtX2R1bXBlZF9kd29yZHMgPSBvZmZzZXQ7CisJCXJldHVybiBEQkdfU1RBVFVTX09LOworCX0KKworCWZpZm9faGFzX2RhdGEgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCSAgICAgICBJR1VfUkVHX0VSUk9SX0hBTkRMSU5HX0RBVEFfVkFMSUQpID4gMDsKKworCS8qIFB1bGwgYXZhaWxhYmxlIGRhdGEgZnJvbSBmaWZvLiBVc2UgRE1BRSBzaW5jZSB0aGlzIGlzIHdpZGVidXMgbWVtb3J5CisJICogYW5kIG11c3QgYmUgYWNjZXNzZWQgYXRvbWljYWxseS4gVGVzdCBmb3IgZHdvcmRzX3JlYWQgbm90IHBhc3NpbmcKKwkgKiBidWZmZXIgc2l6ZSBzaW5jZSBtb3JlIGVudHJpZXMgY291bGQgYmUgYWRkZWQgdG8gdGhlIGJ1ZmZlciBhcyB3ZSBhcmUKKwkgKiBlbXB0eWluZyBpdC4KKwkgKi8KKwlmb3IgKGR3b3Jkc19yZWFkID0gMDsKKwkgICAgIGZpZm9faGFzX2RhdGEgJiYgZHdvcmRzX3JlYWQgPCBJR1VfRklGT19ERVBUSF9EV09SRFM7CisJICAgICBkd29yZHNfcmVhZCArPSBJR1VfRklGT19FTEVNRU5UX0RXT1JEUywgb2Zmc2V0ICs9CisJICAgICBJR1VfRklGT19FTEVNRU5UX0RXT1JEUykgeworCQlpZiAocWVkX2RtYWVfZ3JjMmhvc3QocF9od2ZuLCBwX3B0dCwKKwkJCQkgICAgICBJR1VfUkVHX0VSUk9SX0hBTkRMSU5HX01FTU9SWSwKKwkJCQkgICAgICAodTY0KSh1aW50cHRyX3QpKCZkdW1wX2J1ZltvZmZzZXRdKSwKKwkJCQkgICAgICBJR1VfRklGT19FTEVNRU5UX0RXT1JEUywgMCkpCisJCQlyZXR1cm4gREJHX1NUQVRVU19ETUFFX0ZBSUxFRDsKKwkJZmlmb19oYXNfZGF0YSA9CXFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJCSAgICAgICBJR1VfUkVHX0VSUk9SX0hBTkRMSU5HX0RBVEFfVkFMSUQpID4gMDsKKwl9CisKKwlxZWRfZHVtcF9udW1fcGFyYW0oZHVtcF9idWYgKyBzaXplX3BhcmFtX29mZnNldCwgZHVtcCwgInNpemUiLAorCQkJICAgZHdvcmRzX3JlYWQpOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gb2Zmc2V0OworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCisvKiBQcm90ZWN0aW9uIE92ZXJyaWRlIGR1bXAgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJvdGVjdGlvbl9vdmVycmlkZV9kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICAgIGJvb2wgZHVtcCwgdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwl1MzIgb2Zmc2V0ID0gMCwgc2l6ZV9wYXJhbV9vZmZzZXQsIG92ZXJyaWRlX3dpbmRvd19kd29yZHM7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSAwOworCisJLyogRHVtcCBnbG9iYWwgcGFyYW1zICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX2NvbW1vbl9nbG9iYWxfcGFyYW1zKHBfaHdmbiwKKwkJCQkJCXBfcHR0LAorCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsIDEpOworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAiZHVtcC10eXBlIiwgInByb3RlY3Rpb24tb3ZlcnJpZGUiKTsKKworCS8qIER1bXAgZGF0YSBzZWN0aW9uIGhlYWRlciBhbmQgcGFyYW0uIFRoZSBzaXplIHBhcmFtIGlzIDAgZm9yIG5vdywgYW5kCisJICogaXMgb3ZlcndyaXR0ZW4gYWZ0ZXIgcmVhZGluZyB0aGUgZGF0YS4KKwkgKi8KKwlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICAgIGR1bXAsICJwcm90ZWN0aW9uX292ZXJyaWRlX2RhdGEiLCAxKTsKKwlzaXplX3BhcmFtX29mZnNldCA9IG9mZnNldDsKKwlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAic2l6ZSIsIDApOworCisJaWYgKCFkdW1wKSB7CisJCW9mZnNldCArPSBQUk9URUNUSU9OX09WRVJSSURFX0RFUFRIX0RXT1JEUzsKKwkJKm51bV9kdW1wZWRfZHdvcmRzID0gb2Zmc2V0OworCQlyZXR1cm4gREJHX1NUQVRVU19PSzsKKwl9CisKKwkvKiBBZGQgb3ZlcnJpZGUgd2luZG93IGluZm8gdG8gYnVmZmVyICovCisJb3ZlcnJpZGVfd2luZG93X2R3b3JkcyA9CisJCXFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkgICAgICAgR1JDX1JFR19OVU1CRVJfVkFMSURfT1ZFUlJJREVfV0lORE9XKSAqCisJCSAgICAgICBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfRFdPUkRTOworCWlmIChxZWRfZG1hZV9ncmMyaG9zdChwX2h3Zm4sIHBfcHR0LAorCQkJICAgICAgR1JDX1JFR19QUk9URUNUSU9OX09WRVJSSURFX1dJTkRPVywKKwkJCSAgICAgICh1NjQpKHVpbnRwdHJfdCkoZHVtcF9idWYgKyBvZmZzZXQpLAorCQkJICAgICAgb3ZlcnJpZGVfd2luZG93X2R3b3JkcywgMCkpCisJCXJldHVybiBEQkdfU1RBVFVTX0RNQUVfRkFJTEVEOworCW9mZnNldCArPSBvdmVycmlkZV93aW5kb3dfZHdvcmRzOworCXFlZF9kdW1wX251bV9wYXJhbShkdW1wX2J1ZiArIHNpemVfcGFyYW1fb2Zmc2V0LCBkdW1wLCAic2l6ZSIsCisJCQkgICBvdmVycmlkZV93aW5kb3dfZHdvcmRzKTsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IG9mZnNldDsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworLyogUGVyZm9ybXMgRlcgQXNzZXJ0cyBEdW1wIHRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogUmV0dXJucyB0aGUgZHVtcGVkIHNpemUgaW4gZHdvcmRzLgorICovCitzdGF0aWMgdTMyIHFlZF9md19hc3NlcnRzX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKmR1bXBfYnVmLCBib29sIGR1bXApCit7CisJc3RydWN0IGRiZ190b29sc19kYXRhICpkZXZfZGF0YSA9ICZwX2h3Zm4tPmRiZ19pbmZvOworCWNoYXIgc3Rvcm1fbGV0dGVyX3N0clsyXSA9ICI/IjsKKwlzdHJ1Y3QgZndfaW5mbyBmd19pbmZvOworCXUzMiBvZmZzZXQgPSAwLCBpOworCXU4IHN0b3JtX2lkOworCisJLyogRHVtcCBnbG9iYWwgcGFyYW1zICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX2NvbW1vbl9nbG9iYWxfcGFyYW1zKHBfaHdmbiwKKwkJCQkJCXBfcHR0LAorCQkJCQkJZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsIDEpOworCW9mZnNldCArPSBxZWRfZHVtcF9zdHJfcGFyYW0oZHVtcF9idWYgKyBvZmZzZXQsCisJCQkJICAgICBkdW1wLCAiZHVtcC10eXBlIiwgImZ3LWFzc2VydHMiKTsKKwlmb3IgKHN0b3JtX2lkID0gMDsgc3Rvcm1faWQgPCBNQVhfREJHX1NUT1JNUzsgc3Rvcm1faWQrKykgeworCQl1MzIgZndfYXNzZXJ0c19zZWN0aW9uX2FkZHIsIG5leHRfbGlzdF9pZHhfYWRkciwgbmV4dF9saXN0X2lkeCwKKwkJCWxhc3RfbGlzdF9pZHgsIGVsZW1lbnRfYWRkcjsKKworCQlpZiAoZGV2X2RhdGEtPmJsb2NrX2luX3Jlc2V0W3Nfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uYmxvY2tfaWRdKQorCQkJY29udGludWU7CisKKwkJLyogUmVhZCBGVyBpbmZvIGZvciB0aGUgY3VycmVudCBTdG9ybSAqLworCQlxZWRfcmVhZF9md19pbmZvKHBfaHdmbiwgcF9wdHQsIHN0b3JtX2lkLCAmZndfaW5mbyk7CisKKwkJLyogRHVtcCBGVyBBc3NlcnRzIHNlY3Rpb24gaGVhZGVyIGFuZCBwYXJhbXMgKi8KKwkJc3Rvcm1fbGV0dGVyX3N0clswXSA9IHNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0ubGV0dGVyOworCQlvZmZzZXQgKz0gcWVkX2R1bXBfc2VjdGlvbl9oZHIoZHVtcF9idWYgKyBvZmZzZXQsIGR1bXAsCisJCQkJCSAgICAgICAiZndfYXNzZXJ0cyIsIDIpOworCQlvZmZzZXQgKz0gcWVkX2R1bXBfc3RyX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAic3Rvcm0iLAorCQkJCQkgICAgIHN0b3JtX2xldHRlcl9zdHIpOworCQlvZmZzZXQgKz0gcWVkX2R1bXBfbnVtX3BhcmFtKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAic2l6ZSIsCisJCQkJCSAgICAgZndfaW5mby5md19hc3NlcnRzX3NlY3Rpb24uCisJCQkJCSAgICAgbGlzdF9lbGVtZW50X2R3b3JkX3NpemUpOworCisJCWlmICghZHVtcCkgeworCQkJb2Zmc2V0ICs9IGZ3X2luZm8uZndfYXNzZXJ0c19zZWN0aW9uLgorCQkJCSAgbGlzdF9lbGVtZW50X2R3b3JkX3NpemU7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFJlYWQgYW5kIGR1bXAgRlcgQXNzZXJ0cyBkYXRhICovCisJCWZ3X2Fzc2VydHNfc2VjdGlvbl9hZGRyID0KKwkJCXNfc3Rvcm1fZGVmc1tzdG9ybV9pZF0uc2VtX2Zhc3RfbWVtX2FkZHIgKworCQkJU0VNX0ZBU1RfUkVHX0lOVF9SQU0gKworCQkJUkFNX0xJTkVTX1RPX0JZVEVTKGZ3X2luZm8uZndfYXNzZXJ0c19zZWN0aW9uLgorCQkJCQkgICBzZWN0aW9uX3JhbV9saW5lX29mZnNldCk7CisJCW5leHRfbGlzdF9pZHhfYWRkciA9CisJCQlmd19hc3NlcnRzX3NlY3Rpb25fYWRkciArCisJCQlEV09SRFNfVE9fQllURVMoZndfaW5mby5md19hc3NlcnRzX3NlY3Rpb24uCisJCQkJCWxpc3RfbmV4dF9pbmRleF9kd29yZF9vZmZzZXQpOworCQluZXh0X2xpc3RfaWR4ID0gcWVkX3JkKHBfaHdmbiwgcF9wdHQsIG5leHRfbGlzdF9pZHhfYWRkcik7CisJCWxhc3RfbGlzdF9pZHggPSAobmV4dF9saXN0X2lkeCA+IDAKKwkJCQkgPyBuZXh0X2xpc3RfaWR4CisJCQkJIDogZndfaW5mby5md19hc3NlcnRzX3NlY3Rpb24ubGlzdF9udW1fZWxlbWVudHMpCisJCQkJLSAxOworCQllbGVtZW50X2FkZHIgPQorCQkJZndfYXNzZXJ0c19zZWN0aW9uX2FkZHIgKworCQkJRFdPUkRTX1RPX0JZVEVTKGZ3X2luZm8uZndfYXNzZXJ0c19zZWN0aW9uLgorCQkJCQlsaXN0X2R3b3JkX29mZnNldCkgKworCQkJbGFzdF9saXN0X2lkeCAqCisJCQlEV09SRFNfVE9fQllURVMoZndfaW5mby5md19hc3NlcnRzX3NlY3Rpb24uCisJCQkJCWxpc3RfZWxlbWVudF9kd29yZF9zaXplKTsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgZndfaW5mby5md19hc3NlcnRzX3NlY3Rpb24ubGlzdF9lbGVtZW50X2R3b3JkX3NpemU7CisJCSAgICAgaSsrLCBvZmZzZXQrKywgZWxlbWVudF9hZGRyICs9IEJZVEVTX0lOX0RXT1JEKQorCQkJZHVtcF9idWZbb2Zmc2V0XSA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LCBlbGVtZW50X2FkZHIpOworCX0KKworCS8qIER1bXAgbGFzdCBzZWN0aW9uICovCisJb2Zmc2V0ICs9IHFlZF9kdW1wX3NlY3Rpb25faGRyKGR1bXBfYnVmICsgb2Zmc2V0LCBkdW1wLCAibGFzdCIsIDApOworCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQdWJsaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX3NldF9iaW5fcHRyKGNvbnN0IHU4ICogY29uc3QgYmluX3B0cikKK3sKKwkvKiBDb252ZXJ0IGJpbmFyeSBkYXRhIHRvIGRlYnVnIGFycmF5cyAqLworCXUzMiBudW1fb2ZfYnVmZmVycyA9ICoodTMyICopYmluX3B0cjsKKwlzdHJ1Y3QgYmluX2J1ZmZlcl9oZHIgKmJ1Zl9hcnJheTsKKwl1OCBidWZfaWQ7CisKKwlidWZfYXJyYXkgPSAoc3RydWN0IGJpbl9idWZmZXJfaGRyICopKCh1MzIgKiliaW5fcHRyICsgMSk7CisKKwlmb3IgKGJ1Zl9pZCA9IDA7IGJ1Zl9pZCA8IG51bV9vZl9idWZmZXJzOyBidWZfaWQrKykgeworCQlzX2RiZ19hcnJheXNbYnVmX2lkXS5wdHIgPQorCQkgICAgKHUzMiAqKShiaW5fcHRyICsgYnVmX2FycmF5W2J1Zl9pZF0ub2Zmc2V0KTsKKwkJc19kYmdfYXJyYXlzW2J1Zl9pZF0uc2l6ZV9pbl9kd29yZHMgPQorCQkgICAgQllURVNfVE9fRFdPUkRTKGJ1Zl9hcnJheVtidWZfaWRdLmxlbmd0aCk7CisJfQorCisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2dyY19nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkgICAgICB1MzIgKmJ1Zl9zaXplKQoreworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXMgPSBxZWRfZGJnX2Rldl9pbml0KHBfaHdmbiwgcF9wdHQpOworCisJKmJ1Zl9zaXplID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJaWYgKCFzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfTU9ERV9UUkVFXS5wdHIgfHwKKwkgICAgIXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19EVU1QX1JFR10ucHRyIHx8CisJICAgICFzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfRFVNUF9NRU1dLnB0ciB8fAorCSAgICAhc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0FUVE5fQkxPQ0tTXS5wdHIgfHwKKwkgICAgIXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19BVFROX1JFR1NdLnB0cikKKwkJcmV0dXJuIERCR19TVEFUVVNfREJHX0FSUkFZX05PVF9TRVQ7CisJcmV0dXJuIHFlZF9ncmNfZHVtcChwX2h3Zm4sIHBfcHR0LCBOVUxMLCBmYWxzZSwgYnVmX3NpemUpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19ncmNfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSB1MzIgKmR1bXBfYnVmLAorCQkJCSB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCSB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXUzMiBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzOworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBxZWRfZGJnX2dyY19nZXRfZHVtcF9idWZfc2l6ZShwX2h3Zm4sIHBfcHR0LAorCQkJCQkgICAgICAgJm5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpOworCisJKm51bV9kdW1wZWRfZHdvcmRzID0gMDsKKwlpZiAoc3RhdHVzICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiBzdGF0dXM7CisJaWYgKGJ1Zl9zaXplX2luX2R3b3JkcyA8IG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHMpCisJCXJldHVybiBEQkdfU1RBVFVTX0RVTVBfQlVGX1RPT19TTUFMTDsKKworCS8qIEdSQyBEdW1wICovCisJc3RhdHVzID0gcWVkX2dyY19kdW1wKHBfaHdmbiwgcF9wdHQsIGR1bXBfYnVmLCB0cnVlLCBudW1fZHVtcGVkX2R3b3Jkcyk7CisKKwkvKiBDbGVhciBhbGwgR1JDIHBhcmFtcyAqLworCXFlZF9kYmdfZ3JjX2NsZWFyX3BhcmFtcyhwX2h3Zm4pOworCXJldHVybiBzdGF0dXM7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2lkbGVfY2hrX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgdTMyICpidWZfc2l6ZSkKK3sKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzID0gcWVkX2RiZ19kZXZfaW5pdChwX2h3Zm4sIHBfcHR0KTsKKwlzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgKmRldl9kYXRhID0gJnBfaHdmbi0+ZGJnX2luZm87CisKKwkqYnVmX3NpemUgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoIXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19NT0RFX1RSRUVdLnB0ciB8fAorCSAgICAhc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0lETEVfQ0hLX1JFR1NdLnB0ciB8fAorCSAgICAhc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0lETEVfQ0hLX0lNTVNdLnB0ciB8fAorCSAgICAhc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0lETEVfQ0hLX1JVTEVTXS5wdHIpCisJCXJldHVybiBEQkdfU1RBVFVTX0RCR19BUlJBWV9OT1RfU0VUOworCWlmICghZGV2X2RhdGEtPmlkbGVfY2hrLmJ1Zl9zaXplX3NldCkgeworCQlkZXZfZGF0YS0+aWRsZV9jaGsuYnVmX3NpemUgPSBxZWRfaWRsZV9jaGtfZHVtcChwX2h3Zm4sCisJCQkJCQkJCXBfcHR0LAorCQkJCQkJCQlOVUxMLCBmYWxzZSk7CisJCWRldl9kYXRhLT5pZGxlX2Noay5idWZfc2l6ZV9zZXQgPSB0cnVlOworCX0KKworCSpidWZfc2l6ZSA9IGRldl9kYXRhLT5pZGxlX2Noay5idWZfc2l6ZTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfaWRsZV9jaGtfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICAgICB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCSAgICAgIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJdTMyIG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHM7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHFlZF9kYmdfaWRsZV9jaGtfZ2V0X2R1bXBfYnVmX3NpemUocF9od2ZuLCBwX3B0dCwKKwkJCQkJCSAgICAmbmVlZGVkX2J1Zl9zaXplX2luX2R3b3Jkcyk7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoYnVmX3NpemVfaW5fZHdvcmRzIDwgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkcykKKwkJcmV0dXJuIERCR19TVEFUVVNfRFVNUF9CVUZfVE9PX1NNQUxMOworCisJLyogVXBkYXRlIHJlc2V0IHN0YXRlICovCisJcWVkX3VwZGF0ZV9ibG9ja3NfcmVzZXRfc3RhdGUocF9od2ZuLCBwX3B0dCk7CisKKwkvKiBJZGxlIENoZWNrIER1bXAgKi8KKwkqbnVtX2R1bXBlZF9kd29yZHMgPSBxZWRfaWRsZV9jaGtfZHVtcChwX2h3Zm4sIHBfcHR0LCBkdW1wX2J1ZiwgdHJ1ZSk7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX21jcF90cmFjZV9nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJCQkgICAgdTMyICpidWZfc2l6ZSkKK3sKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzID0gcWVkX2RiZ19kZXZfaW5pdChwX2h3Zm4sIHBfcHR0KTsKKworCSpidWZfc2l6ZSA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBxZWRfbWNwX3RyYWNlX2R1bXAocF9od2ZuLCBwX3B0dCwgTlVMTCwgZmFsc2UsIGJ1Zl9zaXplKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfbWNwX3RyYWNlX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJICAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICAgICAgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkgICAgICAgdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwl1MzIgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkczsKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gcWVkX2RiZ19tY3BfdHJhY2VfZ2V0X2R1bXBfYnVmX3NpemUocF9od2ZuLCBwX3B0dCwKKwkJCQkJCSZuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKTsKKworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoYnVmX3NpemVfaW5fZHdvcmRzIDwgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkcykKKwkJcmV0dXJuIERCR19TVEFUVVNfRFVNUF9CVUZfVE9PX1NNQUxMOworCisJLyogVXBkYXRlIHJlc2V0IHN0YXRlICovCisJcWVkX3VwZGF0ZV9ibG9ja3NfcmVzZXRfc3RhdGUocF9od2ZuLCBwX3B0dCk7CisKKwkvKiBQZXJmb3JtIGR1bXAgKi8KKwlyZXR1cm4gcWVkX21jcF90cmFjZV9kdW1wKHBfaHdmbiwKKwkJCQkgIHBfcHR0LCBkdW1wX2J1ZiwgdHJ1ZSwgbnVtX2R1bXBlZF9kd29yZHMpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19yZWdfZmlmb19nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgIHUzMiAqYnVmX3NpemUpCit7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1cyA9IHFlZF9kYmdfZGV2X2luaXQocF9od2ZuLCBwX3B0dCk7CisKKwkqYnVmX3NpemUgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gcWVkX3JlZ19maWZvX2R1bXAocF9od2ZuLCBwX3B0dCwgTlVMTCwgZmFsc2UsIGJ1Zl9zaXplKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfcmVnX2ZpZm9fZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICAgICB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCSAgICAgIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpCit7CisJdTMyIG5lZWRlZF9idWZfc2l6ZV9pbl9kd29yZHM7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IHFlZF9kYmdfcmVnX2ZpZm9fZ2V0X2R1bXBfYnVmX3NpemUocF9od2ZuLCBwX3B0dCwKKwkJCQkJCSAgICAmbmVlZGVkX2J1Zl9zaXplX2luX2R3b3Jkcyk7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSAwOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHN0YXR1czsKKwlpZiAoYnVmX3NpemVfaW5fZHdvcmRzIDwgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkcykKKwkJcmV0dXJuIERCR19TVEFUVVNfRFVNUF9CVUZfVE9PX1NNQUxMOworCisJLyogVXBkYXRlIHJlc2V0IHN0YXRlICovCisJcWVkX3VwZGF0ZV9ibG9ja3NfcmVzZXRfc3RhdGUocF9od2ZuLCBwX3B0dCk7CisJcmV0dXJuIHFlZF9yZWdfZmlmb19kdW1wKHBfaHdmbiwKKwkJCQkgcF9wdHQsIGR1bXBfYnVmLCB0cnVlLCBudW1fZHVtcGVkX2R3b3Jkcyk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2lndV9maWZvX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgdTMyICpidWZfc2l6ZSkKK3sKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzID0gcWVkX2RiZ19kZXZfaW5pdChwX2h3Zm4sIHBfcHR0KTsKKworCSpidWZfc2l6ZSA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBxZWRfaWd1X2ZpZm9fZHVtcChwX2h3Zm4sIHBfcHR0LCBOVUxMLCBmYWxzZSwgYnVmX3NpemUpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19pZ3VfZmlmb19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgICAgIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJICAgICAgdTMyICpudW1fZHVtcGVkX2R3b3JkcykKK3sKKwl1MzIgbmVlZGVkX2J1Zl9zaXplX2luX2R3b3JkczsKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzOworCisJc3RhdHVzID0gcWVkX2RiZ19pZ3VfZmlmb19nZXRfZHVtcF9idWZfc2l6ZShwX2h3Zm4sIHBfcHR0LAorCQkJCQkJICAgICZuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKTsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChidWZfc2l6ZV9pbl9kd29yZHMgPCBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKQorCQlyZXR1cm4gREJHX1NUQVRVU19EVU1QX0JVRl9UT09fU01BTEw7CisKKwkvKiBVcGRhdGUgcmVzZXQgc3RhdGUgKi8KKwlxZWRfdXBkYXRlX2Jsb2Nrc19yZXNldF9zdGF0ZShwX2h3Zm4sIHBfcHR0KTsKKwlyZXR1cm4gcWVkX2lndV9maWZvX2R1bXAocF9od2ZuLAorCQkJCSBwX3B0dCwgZHVtcF9idWYsIHRydWUsIG51bV9kdW1wZWRfZHdvcmRzKTsKK30KKworZW51bSBkYmdfc3RhdHVzCitxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJICAgICAgdTMyICpidWZfc2l6ZSkKK3sKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzID0gcWVkX2RiZ19kZXZfaW5pdChwX2h3Zm4sIHBfcHR0KTsKKworCSpidWZfc2l6ZSA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBxZWRfcHJvdGVjdGlvbl9vdmVycmlkZV9kdW1wKHBfaHdmbiwKKwkJCQkJICAgIHBfcHR0LCBOVUxMLCBmYWxzZSwgYnVmX3NpemUpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX2R1bXAoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgdTMyIGJ1Zl9zaXplX2luX2R3b3JkcywKKwkJCQkJCSB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXUzMiBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzOworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZ2V0X2R1bXBfYnVmX3NpemUocF9od2ZuLCBwX3B0dCwKKwkJCQkJCSZuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKTsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChidWZfc2l6ZV9pbl9kd29yZHMgPCBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKQorCQlyZXR1cm4gREJHX1NUQVRVU19EVU1QX0JVRl9UT09fU01BTEw7CisKKwkvKiBVcGRhdGUgcmVzZXQgc3RhdGUgKi8KKwlxZWRfdXBkYXRlX2Jsb2Nrc19yZXNldF9zdGF0ZShwX2h3Zm4sIHBfcHR0KTsKKwlyZXR1cm4gcWVkX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZHVtcChwX2h3Zm4sCisJCQkJCSAgICBwX3B0dCwKKwkJCQkJICAgIGR1bXBfYnVmLCB0cnVlLCBudW1fZHVtcGVkX2R3b3Jkcyk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2Z3X2Fzc2VydHNfZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgICAgdTMyICpidWZfc2l6ZSkKK3sKKwllbnVtIGRiZ19zdGF0dXMgc3RhdHVzID0gcWVkX2RiZ19kZXZfaW5pdChwX2h3Zm4sIHBfcHR0KTsKKworCSpidWZfc2l6ZSA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogVXBkYXRlIHJlc2V0IHN0YXRlICovCisJcWVkX3VwZGF0ZV9ibG9ja3NfcmVzZXRfc3RhdGUocF9od2ZuLCBwX3B0dCk7CisJKmJ1Zl9zaXplID0gcWVkX2Z3X2Fzc2VydHNfZHVtcChwX2h3Zm4sIHBfcHR0LCBOVUxMLCBmYWxzZSk7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2Z3X2Fzc2VydHNfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQl1MzIgKmR1bXBfYnVmLAorCQkJCQl1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCQl1MzIgKm51bV9kdW1wZWRfZHdvcmRzKQoreworCXUzMiBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzOworCWVudW0gZGJnX3N0YXR1cyBzdGF0dXM7CisKKwlzdGF0dXMgPSBxZWRfZGJnX2Z3X2Fzc2VydHNfZ2V0X2R1bXBfYnVmX3NpemUocF9od2ZuLCBwX3B0dCwKKwkJCQkJCSZuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKTsKKworCSpudW1fZHVtcGVkX2R3b3JkcyA9IDA7CisJaWYgKHN0YXR1cyAhPSBEQkdfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChidWZfc2l6ZV9pbl9kd29yZHMgPCBuZWVkZWRfYnVmX3NpemVfaW5fZHdvcmRzKQorCQlyZXR1cm4gREJHX1NUQVRVU19EVU1QX0JVRl9UT09fU01BTEw7CisKKwkqbnVtX2R1bXBlZF9kd29yZHMgPSBxZWRfZndfYXNzZXJ0c19kdW1wKHBfaHdmbiwgcF9wdHQsIGR1bXBfYnVmLCB0cnVlKTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRGF0YSBUeXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgbWNwX3RyYWNlX2Zvcm1hdCB7CisJdTMyIGRhdGE7CisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfTU9EVUxFX01BU0sJMHgwMDAwZmZmZgorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX01PRFVMRV9TSElGVAkwCisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfTEVWRUxfTUFTSwkweDAwMDMwMDAwCisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfTEVWRUxfU0hJRlQJMTYKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9QMV9TSVpFX01BU0sJMHgwMDBjMDAwMAorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX1AxX1NJWkVfU0hJRlQJMTgKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9QMl9TSVpFX01BU0sJMHgwMDMwMDAwMAorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX1AyX1NJWkVfU0hJRlQJMjAKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9QM19TSVpFX01BU0sJMHgwMGMwMDAwMAorI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX1AzX1NJWkVfU0hJRlQJMjIKKyNkZWZpbmUgTUNQX1RSQUNFX0ZPUk1BVF9MRU5fTUFTSwkweGZmMDAwMDAwCisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfTEVOX1NISUZUCTI0CisJY2hhciAqZm9ybWF0X3N0cjsKK307CisKK3N0cnVjdCBtY3BfdHJhY2VfbWV0YSB7CisJdTMyIG1vZHVsZXNfbnVtOworCWNoYXIgKiptb2R1bGVzOworCXUzMiBmb3JtYXRzX251bTsKKwlzdHJ1Y3QgbWNwX3RyYWNlX2Zvcm1hdCAqZm9ybWF0czsKK307CisKKy8qIFJlZyBmaWZvIGVsZW1lbnQgKi8KK3N0cnVjdCByZWdfZmlmb19lbGVtZW50IHsKKwl1NjQgZGF0YTsKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9BRERSRVNTX1NISUZUCQkwCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfQUREUkVTU19NQVNLCQkweDdmZmZmZgorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX0FDQ0VTU19TSElGVAkJMjMKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9BQ0NFU1NfTUFTSwkJMHgxCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfUEZfU0hJRlQJCTI0CisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfUEZfTUFTSwkJMHhmCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfVkZfU0hJRlQJCTI4CisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfVkZfTUFTSwkJMHhmZgorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX1BPUlRfU0hJRlQJCTM2CisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfUE9SVF9NQVNLCQkweDMKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9QUklWSUxFR0VfU0hJRlQJMzgKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9QUklWSUxFR0VfTUFTSwkJMHgzCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfUFJPVEVDVElPTl9TSElGVAk0MAorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX1BST1RFQ1RJT05fTUFTSwkweDcKKyNkZWZpbmUgUkVHX0ZJRk9fRUxFTUVOVF9NQVNURVJfU0hJRlQJCTQzCisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfTUFTVEVSX01BU0sJCTB4ZgorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX0VSUk9SX1NISUZUCQk0NworI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX0VSUk9SX01BU0sJCTB4MWYKK307CisKKy8qIElHVSBmaWZvIGVsZW1lbnQgKi8KK3N0cnVjdCBpZ3VfZmlmb19lbGVtZW50IHsKKwl1MzIgZHdvcmQwOworI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9GSURfU0hJRlQJCTAKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfRklEX01BU0sJCTB4ZmYKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfSVNfUEZfU0hJRlQJCTgKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfSVNfUEZfTUFTSwkJMHgxCisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX1NPVVJDRV9TSElGVAkJOQorI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9TT1VSQ0VfTUFTSwkJMHhmCisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0VSUl9UWVBFX1NISUZUCQkxMworI2RlZmluZSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9FUlJfVFlQRV9NQVNLCQkweGYKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfQ01EX0FERFJfU0hJRlQJCTE3CisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQwX0NNRF9BRERSX01BU0sJCTB4N2ZmZgorCXUzMiBkd29yZDE7CisJdTMyIGR3b3JkMjsKKyNkZWZpbmUgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDEyX0lTX1dSX0NNRF9TSElGVAkwCisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQxMl9JU19XUl9DTURfTUFTSwkJMHgxCisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQxMl9XUl9EQVRBX1NISUZUCQkxCisjZGVmaW5lIElHVV9GSUZPX0VMRU1FTlRfRFdPUkQxMl9XUl9EQVRBX01BU0sJCTB4ZmZmZmZmZmYKKwl1MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgaWd1X2ZpZm9fd3JfZGF0YSB7CisJdTMyIGRhdGE7CisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfUFJPRF9DT05TX1NISUZUCQkwCisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfUFJPRF9DT05TX01BU0sJCQkweGZmZmZmZgorI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX1VQREFURV9GTEFHX1NISUZUCQkyNAorI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX1VQREFURV9GTEFHX01BU0sJCTB4MQorI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX0VOX0RJU19JTlRfRk9SX1NCX1NISUZUCTI1CisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfRU5fRElTX0lOVF9GT1JfU0JfTUFTSwkJMHgzCisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfU0VHTUVOVF9TSElGVAkJCTI3CisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfU0VHTUVOVF9NQVNLCQkJMHgxCisjZGVmaW5lIElHVV9GSUZPX1dSX0RBVEFfVElNRVJfTUFTS19TSElGVAkJMjgKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9USU1FUl9NQVNLX01BU0sJCTB4MQorI2RlZmluZSBJR1VfRklGT19XUl9EQVRBX0NNRF9UWVBFX1NISUZUCQkJMzEKKyNkZWZpbmUgSUdVX0ZJRk9fV1JfREFUQV9DTURfVFlQRV9NQVNLCQkJMHgxCit9OworCitzdHJ1Y3QgaWd1X2ZpZm9fY2xlYW51cF93cl9kYXRhIHsKKwl1MzIgZGF0YTsKKyNkZWZpbmUgSUdVX0ZJRk9fQ0xFQU5VUF9XUl9EQVRBX1JFU0VSVkVEX1NISUZUCQkwCisjZGVmaW5lIElHVV9GSUZPX0NMRUFOVVBfV1JfREFUQV9SRVNFUlZFRF9NQVNLCQkweDdmZmZmZmYKKyNkZWZpbmUgSUdVX0ZJRk9fQ0xFQU5VUF9XUl9EQVRBX0NMRUFOVVBfVkFMX1NISUZUCTI3CisjZGVmaW5lIElHVV9GSUZPX0NMRUFOVVBfV1JfREFUQV9DTEVBTlVQX1ZBTF9NQVNLCTB4MQorI2RlZmluZSBJR1VfRklGT19DTEVBTlVQX1dSX0RBVEFfQ0xFQU5VUF9UWVBFX1NISUZUCTI4CisjZGVmaW5lIElHVV9GSUZPX0NMRUFOVVBfV1JfREFUQV9DTEVBTlVQX1RZUEVfTUFTSwkweDcKKyNkZWZpbmUgSUdVX0ZJRk9fQ0xFQU5VUF9XUl9EQVRBX0NNRF9UWVBFX1NISUZUCQkzMQorI2RlZmluZSBJR1VfRklGT19DTEVBTlVQX1dSX0RBVEFfQ01EX1RZUEVfTUFTSwkJMHgxCit9OworCisvKiBQcm90ZWN0aW9uIG92ZXJyaWRlIGVsZW1lbnQgKi8KK3N0cnVjdCBwcm90ZWN0aW9uX292ZXJyaWRlX2VsZW1lbnQgeworCXU2NCBkYXRhOworI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfQUREUkVTU19TSElGVAkJMAorI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfQUREUkVTU19NQVNLCQkweDdmZmZmZgorI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfV0lORE9XX1NJWkVfU0hJRlQJCTIzCisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9XSU5ET1dfU0laRV9NQVNLCQkweGZmZmZmZgorI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfUkVBRF9TSElGVAkJCTQ3CisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9SRUFEX01BU0sJCQkweDEKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1dSSVRFX1NISUZUCQkJNDgKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1dSSVRFX01BU0sJCQkweDEKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1JFQURfUFJPVEVDVElPTl9TSElGVAk0OQorI2RlZmluZSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfUkVBRF9QUk9URUNUSU9OX01BU0sJMHg3CisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9XUklURV9QUk9URUNUSU9OX1NISUZUCTUyCisjZGVmaW5lIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9XUklURV9QUk9URUNUSU9OX01BU0sJMHg3Cit9OworCitlbnVtIGlndV9maWZvX3NvdXJjZXMgeworCUlHVV9TUkNfUFhQMCwKKwlJR1VfU1JDX1BYUDEsCisJSUdVX1NSQ19QWFAyLAorCUlHVV9TUkNfUFhQMywKKwlJR1VfU1JDX1BYUDQsCisJSUdVX1NSQ19QWFA1LAorCUlHVV9TUkNfUFhQNiwKKwlJR1VfU1JDX1BYUDcsCisJSUdVX1NSQ19DQVUsCisJSUdVX1NSQ19BVFROLAorCUlHVV9TUkNfR1JDCit9OworCitlbnVtIGlndV9maWZvX2FkZHJfdHlwZXMgeworCUlHVV9BRERSX1RZUEVfTVNJWF9NRU0sCisJSUdVX0FERFJfVFlQRV9XUklURV9QQkEsCisJSUdVX0FERFJfVFlQRV9XUklURV9JTlRfQUNLLAorCUlHVV9BRERSX1RZUEVfV1JJVEVfQVRUTl9CSVRTLAorCUlHVV9BRERSX1RZUEVfUkVBRF9JTlQsCisJSUdVX0FERFJfVFlQRV9XUklURV9QUk9EX1VQREFURSwKKwlJR1VfQUREUl9UWVBFX1JFU0VSVkVECit9OworCitzdHJ1Y3QgaWd1X2ZpZm9fYWRkcl9kYXRhIHsKKwl1MTYgc3RhcnRfYWRkcjsKKwl1MTYgZW5kX2FkZHI7CisJY2hhciAqZGVzYzsKKwljaGFyICp2Zl9kZXNjOworCWVudW0gaWd1X2ZpZm9fYWRkcl90eXBlcyB0eXBlOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvbnN0YW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE1BWF9NU0dfTEVOCQkJCTEwMjQKKyNkZWZpbmUgTUNQX1RSQUNFX01BWF9NT0RVTEVfTEVOCQk4CisjZGVmaW5lIE1DUF9UUkFDRV9GT1JNQVRfTUFYX1BBUkFNUwkJMworI2RlZmluZSBNQ1BfVFJBQ0VfRk9STUFUX1BBUkFNX1dJRFRIIFwKKwkoTUNQX1RSQUNFX0ZPUk1BVF9QMl9TSVpFX1NISUZUIC0gTUNQX1RSQUNFX0ZPUk1BVF9QMV9TSVpFX1NISUZUKQorI2RlZmluZSBSRUdfRklGT19FTEVNRU5UX0FERFJfRkFDVE9SCQk0CisjZGVmaW5lIFJFR19GSUZPX0VMRU1FTlRfSVNfUEZfVkZfVkFMCQkxMjcKKyNkZWZpbmUgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX0FERFJfRkFDVE9SCTQKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNYWNyb3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEJZVEVTX1RPX0RXT1JEUyhieXRlcykJCQkoKGJ5dGVzKSAvIEJZVEVTX0lOX0RXT1JEKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ29uc3RhbnQgQXJyYXlzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFN0YXR1cyBzdHJpbmcgYXJyYXkgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc19zdGF0dXNfc3RyW10gPSB7CisJIk9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IiwKKwkiRGVidWcgYXBwbGljYXRpb24gdmVyc2lvbiB3YXNuJ3Qgc2V0IiwKKwkiVW5zdXBwb3J0ZWQgZGVidWcgYXBwbGljYXRpb24gdmVyc2lvbiIsCisJIlRoZSBkZWJ1ZyBibG9jayB3YXNuJ3QgcmVzZXQgc2luY2UgdGhlIGxhc3QgcmVjb3JkaW5nIiwKKwkiSW52YWxpZCBhcmd1bWVudHMiLAorCSJUaGUgZGVidWcgb3V0cHV0IHdhcyBhbHJlYWR5IHNldCIsCisJIkludmFsaWQgUENJIGJ1ZmZlciBzaXplIiwKKwkiUENJIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCIsCisJIkEgUENJIGJ1ZmZlciB3YXNuJ3QgYWxsb2NhdGVkIiwKKwkiVG9vIG1hbnkgaW5wdXRzIHdlcmUgZW5hYmxlZC4gRW5hYmxlZCBsZXNzIGlucHV0cywgb3Igc2V0ICd1bmlmeUlucHV0cycgdG8gdHJ1ZSIsCisJIkdSQy9UaW1lc3RhbXAgaW5wdXQgb3ZlcmxhcCBpbiBjeWNsZSBkd29yZCAwIiwKKwkiQ2Fubm90IHJlY29yZCBTdG9ybSBkYXRhIHNpbmNlIHRoZSBlbnRpcmUgcmVjb3JkaW5nIGN5Y2xlIGlzIHVzZWQgYnkgSFciLAorCSJUaGUgU3Rvcm0gd2FzIGFscmVhZHkgZW5hYmxlZCIsCisJIlRoZSBzcGVjaWZpZWQgU3Rvcm0gd2Fzbid0IGVuYWJsZWQiLAorCSJUaGUgYmxvY2sgd2FzIGFscmVhZHkgZW5hYmxlZCIsCisJIlRoZSBzcGVjaWZpZWQgYmxvY2sgd2Fzbid0IGVuYWJsZWQiLAorCSJObyBpbnB1dCB3YXMgZW5hYmxlZCBmb3IgcmVjb3JkaW5nIiwKKwkiRmlsdGVycyBhbmQgdHJpZ2dlcnMgYXJlIG5vdCBhbGxvd2VkIHdoZW4gcmVjb3JkaW5nIGluIDY0YiB1bml0cyIsCisJIlRoZSBmaWx0ZXIgd2FzIGFscmVhZHkgZW5hYmxlZCIsCisJIlRoZSB0cmlnZ2VyIHdhcyBhbHJlYWR5IGVuYWJsZWQiLAorCSJUaGUgdHJpZ2dlciB3YXNuJ3QgZW5hYmxlZCIsCisJIkEgY29uc3RyYWludCBjYW4gYmUgYWRkZWQgb25seSBhZnRlciBhIGZpbHRlciB3YXMgZW5hYmxlZCBvciBhIHRyaWdnZXIgc3RhdGUgd2FzIGFkZGVkIiwKKwkiQ2Fubm90IGFkZCBtb3JlIHRoYW4gMyB0cmlnZ2VyIHN0YXRlcyIsCisJIkNhbm5vdCBhZGQgbW9yZSB0aGFuIDQgY29uc3RyYWludHMgcGVyIGZpbHRlciBvciB0cmlnZ2VyIHN0YXRlIiwKKwkiVGhlIHJlY29yZGluZyB3YXNuJ3Qgc3RhcnRlZCIsCisJIkEgdHJpZ2dlciB3YXMgY29uZmlndXJlZCwgYnV0IGl0IGRpZG4ndCB0cmlnZ2VyIiwKKwkiTm8gZGF0YSB3YXMgcmVjb3JkZWQiLAorCSJEdW1wIGJ1ZmZlciBpcyB0b28gc21hbGwiLAorCSJEdW1wZWQgZGF0YSBpcyBub3QgYWxpZ25lZCB0byBjaHVua3MiLAorCSJVbmtub3duIGNoaXAiLAorCSJGYWlsZWQgYWxsb2NhdGluZyB2aXJ0dWFsIG1lbW9yeSIsCisJIlRoZSBpbnB1dCBibG9jayBpcyBpbiByZXNldCIsCisJIkludmFsaWQgTUNQIHRyYWNlIHNpZ25hdHVyZSBmb3VuZCBpbiBOVlJBTSIsCisJIkludmFsaWQgYnVuZGxlIElEIGZvdW5kIGluIE5WUkFNIiwKKwkiRmFpbGVkIGdldHRpbmcgTlZSQU0gaW1hZ2UiLAorCSJOVlJBTSBpbWFnZSBpcyBub3QgZHdvcmQtYWxpZ25lZCIsCisJIkZhaWxlZCByZWFkaW5nIGZyb20gTlZSQU0iLAorCSJJZGxlIGNoZWNrIHBhcnNpbmcgZmFpbGVkIiwKKwkiTUNQIFRyYWNlIGRhdGEgaXMgY29ycnVwdCIsCisJIkR1bXAgZG9lc24ndCBjb250YWluIG1ldGEgZGF0YSAtIGl0IG11c3QgYmUgcHJvdmlkZWQgaW4gYW4gaW1hZ2UgZmlsZSIsCisJIkZhaWxlZCB0byBoYWx0IE1DUCIsCisJIkZhaWxlZCB0byByZXN1bWUgTUNQIGFmdGVyIGhhbHQiLAorCSJETUFFIHRyYW5zYWN0aW9uIGZhaWxlZCIsCisJIkZhaWxlZCB0byBlbXB0eSBTRU1JIHN5bmMgRklGTyIsCisJIklHVSBGSUZPIGRhdGEgaXMgY29ycnVwdCIsCisJIk1DUCBmYWlsZWQgdG8gbWFzayBwYXJpdGllcyIsCisJIkZXIEFzc2VydHMgcGFyc2luZyBmYWlsZWQiLAorCSJHUkMgRklGTyBkYXRhIGlzIGNvcnJ1cHQiLAorCSJQcm90ZWN0aW9uIE92ZXJyaWRlIGRhdGEgaXMgY29ycnVwdCIsCisJIkRlYnVnIGFycmF5cyB3ZXJlIG5vdCBzZXQgKHdoZW4gdXNpbmcgYmluYXJ5IGZpbGVzLCBkYmdfc2V0X2Jpbl9wdHIgbXVzdCBiZSBjYWxsZWQpIiwKKwkiV2hlbiBhIGJsb2NrIGlzIGZpbHRlcmVkLCBubyBvdGhlciBibG9ja3MgY2FuIGJlIHJlY29yZGVkIHVubGVzcyBpbnB1dHMgYXJlIHVuaWZpZWQgKGR1ZSB0byBhIEhXIGJ1ZykiCit9OworCisvKiBJZGxlIGNoZWNrIHNldmVyaXR5IG5hbWVzIGFycmF5ICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNfaWRsZV9jaGtfc2V2ZXJpdHlfc3RyW10gPSB7CisJIkVycm9yIiwKKwkiRXJyb3IgaWYgbm8gdHJhZmZpYyIsCisJIldhcm5pbmciCit9OworCisvKiBNQ1AgVHJhY2UgbGV2ZWwgbmFtZXMgYXJyYXkgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc19tY3BfdHJhY2VfbGV2ZWxfc3RyW10gPSB7CisJIkVSUk9SIiwKKwkiVFJBQ0UiLAorCSJERUJVRyIKK307CisKKy8qIFBhcnNpbmcgc3RyaW5ncyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzX2FjY2Vzc19zdHJzW10gPSB7CisJInJlYWQiLAorCSJ3cml0ZSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc19wcml2aWxlZ2Vfc3Ryc1tdID0geworCSJWRiIsCisJIlBEQSIsCisJIkhWIiwKKwkiVUEiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNfcHJvdGVjdGlvbl9zdHJzW10gPSB7CisJIihkZWZhdWx0KSIsCisJIihkZWZhdWx0KSIsCisJIihkZWZhdWx0KSIsCisJIihkZWZhdWx0KSIsCisJIm92ZXJyaWRlIFZGIiwKKwkib3ZlcnJpZGUgUERBIiwKKwkib3ZlcnJpZGUgSFYiLAorCSJvdmVycmlkZSBVQSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc19tYXN0ZXJfc3Ryc1tdID0geworCSI/Pz8iLAorCSJweHAiLAorCSJtY3AiLAorCSJtc2RtIiwKKwkicHNkbSIsCisJInlzZG0iLAorCSJ1c2RtIiwKKwkidHNkbSIsCisJInhzZG0iLAorCSJkYnUiLAorCSJkbWFlIiwKKwkiPz8/IiwKKwkiPz8/IiwKKwkiPz8/IiwKKwkiPz8/IiwKKwkiPz8/IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzX3JlZ19maWZvX2Vycm9yX3N0cnNbXSA9IHsKKwkiZ3JjIHRpbWVvdXQiLAorCSJhZGRyZXNzIGRvZXNuJ3QgYmVsb25nIHRvIGFueSBibG9jayIsCisJInJlc2VydmVkIGFkZHJlc3MgaW4gYmxvY2sgb3Igd3JpdGUgdG8gcmVhZC1vbmx5IGFkZHJlc3MiLAorCSJwcml2aWxlZ2UvcHJvdGVjdGlvbiBtaXNtYXRjaCIsCisJInBhdGggaXNvbGF0aW9uIGVycm9yIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzX2lndV9maWZvX3NvdXJjZV9zdHJzW10gPSB7CisJIlRTVE9STSIsCisJIk1TVE9STSIsCisJIlVTVE9STSIsCisJIlhTVE9STSIsCisJIllTVE9STSIsCisJIlBTVE9STSIsCisJIlBDSUUiLAorCSJOSUdfUU1fUEJGIiwKKwkiQ0FVIiwKKwkiQVRUTiIsCisJIkdSQyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNfaWd1X2ZpZm9fZXJyb3Jfc3Ryc1tdID0geworCSJubyBlcnJvciIsCisJImxlbmd0aCBlcnJvciIsCisJImZ1bmN0aW9uIGRpc2FibGVkIiwKKwkiVkYgc2VudCBjb21tYW5kIHRvIGF0dG5ldGlvbiBhZGRyZXNzIiwKKwkiaG9zdCBzZW50IHByb2QgdXBkYXRlIGNvbW1hbmQiLAorCSJyZWFkIG9mIGR1cmluZyBpbnRlcnJ1cHQgcmVnaXN0ZXIgd2hpbGUgaW4gTUlNRCBtb2RlIiwKKwkiYWNjZXNzIHRvIFBYUCBCQVIgcmVzZXJ2ZWQgYWRkcmVzcyIsCisJInByb2R1Y2VyIHVwZGF0ZSBjb21tYW5kIHRvIGF0dGVudGlvbiBpbmRleCIsCisJInVua25vd24gZXJyb3IiLAorCSJTQiBpbmRleCBub3QgdmFsaWQiLAorCSJTQiByZWxhdGl2ZSBpbmRleCBhbmQgRklEIG5vdCBmb3VuZCIsCisJIkZJRCBub3QgbWF0Y2giLAorCSJjb21tYW5kIHdpdGggZXJyb3IgZmxhZyBhc3NlcnRlZCAoUENJIGVycm9yIG9yIENBVSBkaXNjYXJkKSIsCisJIlZGIHNlbnQgY2xlYW51cCBhbmQgUkYgY2xlYW51cCBpcyBkaXNhYmxlZCIsCisJImNsZWFudXAgY29tbWFuZCBvbiB0eXBlIGJpZ2dlciB0aGFuIDQiCit9OworCisvKiBJR1UgRklGTyBhZGRyZXNzIGRhdGEgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWd1X2ZpZm9fYWRkcl9kYXRhIHNfaWd1X2ZpZm9fYWRkcl9kYXRhW10gPSB7CisJezB4MCwgMHgxMDEsICJNU0ktWCBNZW1vcnkiLCBOVUxMLCBJR1VfQUREUl9UWVBFX01TSVhfTUVNfSwKKwl7MHgxMDIsIDB4MWZmLCAicmVzZXJ2ZWQiLCBOVUxMLCBJR1VfQUREUl9UWVBFX1JFU0VSVkVEfSwKKwl7MHgyMDAsIDB4MjAwLCAiV3JpdGUgUEJBWzA6NjNdIiwgTlVMTCwgSUdVX0FERFJfVFlQRV9XUklURV9QQkF9LAorCXsweDIwMSwgMHgyMDEsICJXcml0ZSBQQkFbNjQ6MTI3XSIsICJyZXNlcnZlZCIsCisJIElHVV9BRERSX1RZUEVfV1JJVEVfUEJBfSwKKwl7MHgyMDIsIDB4MjAyLCAiV3JpdGUgUEJBWzEyOF0iLCAicmVzZXJ2ZWQiLCBJR1VfQUREUl9UWVBFX1dSSVRFX1BCQX0sCisJezB4MjAzLCAweDNmZiwgInJlc2VydmVkIiwgTlVMTCwgSUdVX0FERFJfVFlQRV9SRVNFUlZFRH0sCisJezB4NDAwLCAweDVlZiwgIldyaXRlIGludGVycnVwdCBhY2tub3dsZWRnbWVudCIsIE5VTEwsCisJIElHVV9BRERSX1RZUEVfV1JJVEVfSU5UX0FDS30sCisJezB4NWYwLCAweDVmMCwgIkF0dGVudGlvbiBiaXRzIHVwZGF0ZSIsIE5VTEwsCisJIElHVV9BRERSX1RZUEVfV1JJVEVfQVRUTl9CSVRTfSwKKwl7MHg1ZjEsIDB4NWYxLCAiQXR0ZW50aW9uIGJpdHMgc2V0IiwgTlVMTCwKKwkgSUdVX0FERFJfVFlQRV9XUklURV9BVFROX0JJVFN9LAorCXsweDVmMiwgMHg1ZjIsICJBdHRlbnRpb24gYml0cyBjbGVhciIsIE5VTEwsCisJIElHVV9BRERSX1RZUEVfV1JJVEVfQVRUTl9CSVRTfSwKKwl7MHg1ZjMsIDB4NWYzLCAiUmVhZCBpbnRlcnJ1cHQgMDo2MyB3aXRoIG1hc2siLCBOVUxMLAorCSBJR1VfQUREUl9UWVBFX1JFQURfSU5UfSwKKwl7MHg1ZjQsIDB4NWY0LCAiUmVhZCBpbnRlcnJ1cHQgMDozMSB3aXRoIG1hc2siLCBOVUxMLAorCSBJR1VfQUREUl9UWVBFX1JFQURfSU5UfSwKKwl7MHg1ZjUsIDB4NWY1LCAiUmVhZCBpbnRlcnJ1cHQgMzI6NjMgd2l0aCBtYXNrIiwgTlVMTCwKKwkgSUdVX0FERFJfVFlQRV9SRUFEX0lOVH0sCisJezB4NWY2LCAweDVmNiwgIlJlYWQgaW50ZXJydXB0IDA6NjMgd2l0aG91dCBtYXNrIiwgTlVMTCwKKwkgSUdVX0FERFJfVFlQRV9SRUFEX0lOVH0sCisJezB4NWY3LCAweDVmZiwgInJlc2VydmVkIiwgTlVMTCwgSUdVX0FERFJfVFlQRV9SRVNFUlZFRH0sCisJezB4NjAwLCAweDdmZiwgIlByb2R1Y2VyIHVwZGF0ZSIsIE5VTEwsIElHVV9BRERSX1RZUEVfV1JJVEVfUFJPRF9VUERBVEV9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogVmFyaWFibGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1DUCBUcmFjZSBtZXRhIGRhdGEgLSB1c2VkIGluIGNhc2UgdGhlIGR1bXAgZG9lc24ndCBjb250YWluIHRoZSBtZXRhIGRhdGEKKyAqIChlLmcuIGR1ZSB0byBubyBOVlJBTSBhY2Nlc3MpLgorICovCitzdGF0aWMgc3RydWN0IGRiZ19hcnJheSBzX21jcF90cmFjZV9tZXRhID0geyBOVUxMLCAwIH07CisKKy8qIFRlbXBvcmFyeSBidWZmZXIsIHVzZWQgZm9yIHByaW50IHNpemUgY2FsY3VsYXRpb25zICovCitzdGF0aWMgY2hhciBzX3RlbXBfYnVmW01BWF9NU0dfTEVOXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFB1YmxpYyBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfdXNlcl9zZXRfYmluX3B0cihjb25zdCB1OCAqIGNvbnN0IGJpbl9wdHIpCit7CisJLyogQ29udmVydCBiaW5hcnkgZGF0YSB0byBkZWJ1ZyBhcnJheXMgKi8KKwl1MzIgbnVtX29mX2J1ZmZlcnMgPSAqKHUzMiAqKWJpbl9wdHI7CisJc3RydWN0IGJpbl9idWZmZXJfaGRyICpidWZfYXJyYXk7CisJdTggYnVmX2lkOworCisJYnVmX2FycmF5ID0gKHN0cnVjdCBiaW5fYnVmZmVyX2hkciAqKSgodTMyICopYmluX3B0ciArIDEpOworCisJZm9yIChidWZfaWQgPSAwOyBidWZfaWQgPCBudW1fb2ZfYnVmZmVyczsgYnVmX2lkKyspIHsKKwkJc19kYmdfYXJyYXlzW2J1Zl9pZF0ucHRyID0KKwkJICAgICh1MzIgKikoYmluX3B0ciArIGJ1Zl9hcnJheVtidWZfaWRdLm9mZnNldCk7CisJCXNfZGJnX2FycmF5c1tidWZfaWRdLnNpemVfaW5fZHdvcmRzID0KKwkJICAgIEJZVEVTX1RPX0RXT1JEUyhidWZfYXJyYXlbYnVmX2lkXS5sZW5ndGgpOworCX0KKworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCitzdGF0aWMgdTMyIHFlZF9jeWNsaWNfYWRkKHUzMiBhLCB1MzIgYiwgdTMyIHNpemUpCit7CisJcmV0dXJuIChhICsgYikgJSBzaXplOworfQorCitzdGF0aWMgdTMyIHFlZF9jeWNsaWNfc3ViKHUzMiBhLCB1MzIgYiwgdTMyIHNpemUpCit7CisJcmV0dXJuIChzaXplICsgYSAtIGIpICUgc2l6ZTsKK30KKworLyogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGN5Y2xpYyBidWZmZXIgKHVwIHRvIDQKKyAqIGJ5dGVzKSBhbmQgcmV0dXJucyB0aGVtIGFzIGEgZHdvcmQgdmFsdWUuIHRoZSBzcGVjaWZpZWQgYnVmZmVyIG9mZnNldCBpcworICogdXBkYXRlZC4KKyAqLworc3RhdGljIHUzMiBxZWRfcmVhZF9mcm9tX2N5Y2xpY19idWYodm9pZCAqYnVmLAorCQkJCSAgICB1MzIgKm9mZnNldCwKKwkJCQkgICAgdTMyIGJ1Zl9zaXplLCB1OCBudW1fYnl0ZXNfdG9fcmVhZCkKK3sKKwl1OCAqYnl0ZXNfYnVmID0gKHU4ICopYnVmOworCXU4ICp2YWxfcHRyOworCXUzMiB2YWwgPSAwOworCXU4IGk7CisKKwl2YWxfcHRyID0gKHU4ICopJnZhbDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fYnl0ZXNfdG9fcmVhZDsgaSsrKSB7CisJCXZhbF9wdHJbaV0gPSBieXRlc19idWZbKm9mZnNldF07CisJCSpvZmZzZXQgPSBxZWRfY3ljbGljX2FkZCgqb2Zmc2V0LCAxLCBidWZfc2l6ZSk7CisJfQorCisJcmV0dXJuIHZhbDsKK30KKworLyogUmVhZHMgYW5kIHJldHVybnMgdGhlIG5leHQgYnl0ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogVGhlIHNwZWNpZmllZCBidWZmZXIgb2Zmc2V0IGlzIHVwZGF0ZWQuCisgKi8KK3N0YXRpYyB1OCBxZWRfcmVhZF9ieXRlX2Zyb21fYnVmKHZvaWQgKmJ1ZiwgdTMyICpvZmZzZXQpCit7CisJcmV0dXJuICgodTggKilidWYpWygqb2Zmc2V0KSsrXTsKK30KKworLyogUmVhZHMgYW5kIHJldHVybnMgdGhlIG5leHQgZHdvcmQgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFRoZSBzcGVjaWZpZWQgYnVmZmVyIG9mZnNldCBpcyB1cGRhdGVkLgorICovCitzdGF0aWMgdTMyIHFlZF9yZWFkX2R3b3JkX2Zyb21fYnVmKHZvaWQgKmJ1ZiwgdTMyICpvZmZzZXQpCit7CisJdTMyIGR3b3JkX3ZhbCA9ICoodTMyICopJigodTggKilidWYpWypvZmZzZXRdOworCisJKm9mZnNldCArPSA0OworCXJldHVybiBkd29yZF92YWw7Cit9CisKKy8qIFJlYWRzIHRoZSBuZXh0IHN0cmluZyBmcm9tIHRoZSBzcGVjaWZpZWQgYnVmZmVyLCBhbmQgY29waWVzIGl0IHRvIHRoZQorICogc3BlY2lmaWVkIHBvaW50ZXIuIFRoZSBzcGVjaWZpZWQgYnVmZmVyIG9mZnNldCBpcyB1cGRhdGVkLgorICovCitzdGF0aWMgdm9pZCBxZWRfcmVhZF9zdHJfZnJvbV9idWYodm9pZCAqYnVmLCB1MzIgKm9mZnNldCwgdTMyIHNpemUsIGNoYXIgKmRlc3QpCit7CisJY29uc3QgY2hhciAqc291cmNlX3N0ciA9ICYoKGNvbnN0IGNoYXIgKilidWYpWypvZmZzZXRdOworCisJc3RybmNweShkZXN0LCBzb3VyY2Vfc3RyLCBzaXplKTsKKwlkZXN0W3NpemUgLSAxXSA9ICdcMCc7CisJKm9mZnNldCArPSBzaXplOworfQorCisvKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIG9mZnNldCAoaW4gYnl0ZXMpIG9mIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICogSWYgdGhlIHNwZWNpZmllZCBidWZmZXIgaW4gTlVMTCwgYSB0ZW1wb3JhcnkgYnVmZmVyIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBjaGFyICpxZWRfZ2V0X2J1Zl9wdHIodm9pZCAqYnVmLCB1MzIgb2Zmc2V0KQoreworCXJldHVybiBidWYgPyAoY2hhciAqKWJ1ZiArIG9mZnNldCA6IHNfdGVtcF9idWY7Cit9CisKKy8qIFJlYWRzIGEgcGFyYW0gZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGR3b3JkcyByZWFkLgorICogSWYgdGhlIHJldHVybmVkIHN0cl9wYXJhbSBpcyBOVUxMLCB0aGUgcGFyYW0gaXMgbnVtZXJpYyBhbmQgaXRzIHZhbHVlIGlzCisgKiByZXR1cm5lZCBpbiBudW1fcGFyYW0uCisgKiBPdGhlcml3aXNlLCB0aGUgcGFyYW0gaXMgYSBzdHJpbmcgYW5kIGl0cyBwb2ludGVyIGlzIHJldHVybmVkIGluIHN0cl9wYXJhbS4KKyAqLworc3RhdGljIHUzMiBxZWRfcmVhZF9wYXJhbSh1MzIgKmR1bXBfYnVmLAorCQkJICBjb25zdCBjaGFyICoqcGFyYW1fbmFtZSwKKwkJCSAgY29uc3QgY2hhciAqKnBhcmFtX3N0cl92YWwsIHUzMiAqcGFyYW1fbnVtX3ZhbCkKK3sKKwljaGFyICpjaGFyX2J1ZiA9IChjaGFyICopZHVtcF9idWY7CisJdTMyIG9mZnNldCA9IDA7IC8qIEluIGJ5dGVzICovCisKKwkvKiBFeHRyYWN0IHBhcmFtIG5hbWUgKi8KKwkqcGFyYW1fbmFtZSA9IGNoYXJfYnVmOworCW9mZnNldCArPSBzdHJsZW4oKnBhcmFtX25hbWUpICsgMTsKKworCS8qIENoZWNrIHBhcmFtIHR5cGUgKi8KKwlpZiAoKihjaGFyX2J1ZiArIG9mZnNldCsrKSkgeworCQkvKiBTdHJpbmcgcGFyYW0gKi8KKwkJKnBhcmFtX3N0cl92YWwgPSBjaGFyX2J1ZiArIG9mZnNldDsKKwkJb2Zmc2V0ICs9IHN0cmxlbigqcGFyYW1fc3RyX3ZhbCkgKyAxOworCQlpZiAob2Zmc2V0ICYgMHgzKQorCQkJb2Zmc2V0ICs9ICg0IC0gKG9mZnNldCAmIDB4MykpOworCX0gZWxzZSB7CisJCS8qIE51bWVyaWMgcGFyYW0gKi8KKwkJKnBhcmFtX3N0cl92YWwgPSBOVUxMOworCQlpZiAob2Zmc2V0ICYgMHgzKQorCQkJb2Zmc2V0ICs9ICg0IC0gKG9mZnNldCAmIDB4MykpOworCQkqcGFyYW1fbnVtX3ZhbCA9ICoodTMyICopKGNoYXJfYnVmICsgb2Zmc2V0KTsKKwkJb2Zmc2V0ICs9IDQ7CisJfQorCisJcmV0dXJuIG9mZnNldCAvIDQ7Cit9CisKKy8qIFJlYWRzIGEgc2VjdGlvbiBoZWFkZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkd29yZHMgcmVhZC4KKyAqLworc3RhdGljIHUzMiBxZWRfcmVhZF9zZWN0aW9uX2hkcih1MzIgKmR1bXBfYnVmLAorCQkJCWNvbnN0IGNoYXIgKipzZWN0aW9uX25hbWUsCisJCQkJdTMyICpudW1fc2VjdGlvbl9wYXJhbXMpCit7CisJY29uc3QgY2hhciAqcGFyYW1fc3RyX3ZhbDsKKworCXJldHVybiBxZWRfcmVhZF9wYXJhbShkdW1wX2J1ZiwKKwkJCSAgICAgIHNlY3Rpb25fbmFtZSwgJnBhcmFtX3N0cl92YWwsIG51bV9zZWN0aW9uX3BhcmFtcyk7Cit9CisKKy8qIFJlYWRzIHNlY3Rpb24gcGFyYW1zIGZyb20gdGhlIHNwZWNpZmllZCBidWZmZXIgYW5kIHByaW50cyB0aGVtIHRvIHRoZSByZXN1bHRzCisgKiBidWZmZXIuIFJldHVybnMgdGhlIG51bWJlciBvZiBkd29yZHMgcmVhZC4KKyAqLworc3RhdGljIHUzMiBxZWRfcHJpbnRfc2VjdGlvbl9wYXJhbXModTMyICpkdW1wX2J1ZiwKKwkJCQkgICAgdTMyIG51bV9zZWN0aW9uX3BhcmFtcywKKwkJCQkgICAgY2hhciAqcmVzdWx0c19idWYsIHUzMiAqbnVtX2NoYXJzX3ByaW50ZWQpCit7CisJdTMyIGksIGR1bXBfb2Zmc2V0ID0gMCwgcmVzdWx0c19vZmZzZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG51bV9zZWN0aW9uX3BhcmFtczsgaSsrKSB7CisJCWNvbnN0IGNoYXIgKnBhcmFtX25hbWU7CisJCWNvbnN0IGNoYXIgKnBhcmFtX3N0cl92YWw7CisJCXUzMiBwYXJhbV9udW1fdmFsID0gMDsKKworCQlkdW1wX29mZnNldCArPSBxZWRfcmVhZF9wYXJhbShkdW1wX2J1ZiArIGR1bXBfb2Zmc2V0LAorCQkJCQkgICAgICAmcGFyYW1fbmFtZSwKKwkJCQkJICAgICAgJnBhcmFtX3N0cl92YWwsICZwYXJhbV9udW1fdmFsKTsKKwkJaWYgKHBhcmFtX3N0cl92YWwpCisJCQkvKiBTdHJpbmcgcGFyYW0gKi8KKwkJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCQkJc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkJcmVzdWx0c19vZmZzZXQpLAorCQkJCQkiJXM6ICVzXG4iLCBwYXJhbV9uYW1lLCBwYXJhbV9zdHJfdmFsKTsKKwkJZWxzZSBpZiAoc3RyY21wKHBhcmFtX25hbWUsICJmdy10aW1lc3RhbXAiKSkKKwkJCS8qIE51bWVyaWMgcGFyYW0gKi8KKwkJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCQkJc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkJcmVzdWx0c19vZmZzZXQpLAorCQkJCQkiJXM6ICVkXG4iLCBwYXJhbV9uYW1lLCBwYXJhbV9udW1fdmFsKTsKKwl9CisKKwlyZXN1bHRzX29mZnNldCArPQorCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwgcmVzdWx0c19vZmZzZXQpLCAiXG4iKTsKKwkqbnVtX2NoYXJzX3ByaW50ZWQgPSByZXN1bHRzX29mZnNldDsKKwlyZXR1cm4gZHVtcF9vZmZzZXQ7Cit9CisKK2NvbnN0IGNoYXIgKnFlZF9kYmdfZ2V0X3N0YXR1c19zdHIoZW51bSBkYmdfc3RhdHVzIHN0YXR1cykKK3sKKwlyZXR1cm4gKHN0YXR1cyA8CisJCU1BWF9EQkdfU1RBVFVTKSA/IHNfc3RhdHVzX3N0cltzdGF0dXNdIDogIkludmFsaWQgZGVidWcgc3RhdHVzIjsKK30KKworLyogUGFyc2VzIHRoZSBpZGxlIGNoZWNrIHJ1bGVzIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBwcmludGVkLgorICogSW4gY2FzZSBvZiBwYXJzaW5nIGVycm9yLCByZXR1cm5zIDAuCisgKi8KK3N0YXRpYyB1MzIgcWVkX3BhcnNlX2lkbGVfY2hrX2R1bXBfcnVsZXMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSB1MzIgKmR1bXBfYnVmLAorCQkJCQkgdTMyICpkdW1wX2J1Zl9lbmQsCisJCQkJCSB1MzIgbnVtX3J1bGVzLAorCQkJCQkgYm9vbCBwcmludF9md19pZGxlX2NoaywKKwkJCQkJIGNoYXIgKnJlc3VsdHNfYnVmLAorCQkJCQkgdTMyICpudW1fZXJyb3JzLCB1MzIgKm51bV93YXJuaW5ncykKK3sKKwl1MzIgcnVsZV9pZHgsIHJlc3VsdHNfb2Zmc2V0ID0gMDsgLyogT2Zmc2V0IGluIHJlc3VsdHNfYnVmIGluIGJ5dGVzICovCisJdTE2IGksIGo7CisKKwkqbnVtX2Vycm9ycyA9IDA7CisJKm51bV93YXJuaW5ncyA9IDA7CisKKwkvKiBHbyBvdmVyIGR1bXBlZCByZXN1bHRzICovCisJZm9yIChydWxlX2lkeCA9IDA7IHJ1bGVfaWR4IDwgbnVtX3J1bGVzICYmIGR1bXBfYnVmIDwgZHVtcF9idWZfZW5kOworCSAgICAgcnVsZV9pZHgrKykgeworCQljb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX3J1bGVfcGFyc2luZ19kYXRhICpydWxlX3BhcnNpbmdfZGF0YTsKKwkJc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfaGRyICpoZHI7CisJCWNvbnN0IGNoYXIgKnBhcnNpbmdfc3RyOworCQl1MzIgcGFyc2luZ19zdHJfb2Zmc2V0OworCQljb25zdCBjaGFyICpsc2lfbXNnOworCQl1OCBjdXJyX3JlZ19pZCA9IDA7CisJCWJvb2wgaGFzX2Z3X21zZzsKKworCQloZHIgPSAoc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfaGRyICopZHVtcF9idWY7CisJCXJ1bGVfcGFyc2luZ19kYXRhID0KKwkJCShjb25zdCBzdHJ1Y3QgZGJnX2lkbGVfY2hrX3J1bGVfcGFyc2luZ19kYXRhICopCisJCQkmc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX0lETEVfQ0hLX1BBUlNJTkdfREFUQV0uCisJCQlwdHJbaGRyLT5ydWxlX2lkXTsKKwkJcGFyc2luZ19zdHJfb2Zmc2V0ID0KKwkJCUdFVF9GSUVMRChydWxlX3BhcnNpbmdfZGF0YS0+ZGF0YSwKKwkJCQkgIERCR19JRExFX0NIS19SVUxFX1BBUlNJTkdfREFUQV9TVFJfT0ZGU0VUKTsKKwkJaGFzX2Z3X21zZyA9CisJCQlHRVRfRklFTEQocnVsZV9wYXJzaW5nX2RhdGEtPmRhdGEsCisJCQkJREJHX0lETEVfQ0hLX1JVTEVfUEFSU0lOR19EQVRBX0hBU19GV19NU0cpID4gMDsKKwkJcGFyc2luZ19zdHIgPSAmKChjb25zdCBjaGFyICopCisJCQkJc19kYmdfYXJyYXlzW0JJTl9CVUZfREJHX1BBUlNJTkdfU1RSSU5HU10ucHRyKQorCQkJCVtwYXJzaW5nX3N0cl9vZmZzZXRdOworCQlsc2lfbXNnID0gcGFyc2luZ19zdHI7CisKKwkJaWYgKGhkci0+c2V2ZXJpdHkgPj0gTUFYX0RCR19JRExFX0NIS19TRVZFUklUWV9UWVBFUykKKwkJCXJldHVybiAwOworCisJCS8qIFNraXAgcnVsZSBoZWFkZXIgKi8KKwkJZHVtcF9idWYgKz0gKHNpemVvZihzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9oZHIpIC8gNCk7CisKKwkJLyogVXBkYXRlIGVycm9ycy93YXJuaW5ncyBjb3VudCAqLworCQlpZiAoaGRyLT5zZXZlcml0eSA9PSBJRExFX0NIS19TRVZFUklUWV9FUlJPUiB8fAorCQkgICAgaGRyLT5zZXZlcml0eSA9PSBJRExFX0NIS19TRVZFUklUWV9FUlJPUl9OT19UUkFGRklDKQorCQkJKCpudW1fZXJyb3JzKSsrOworCQllbHNlCisJCQkoKm51bV93YXJuaW5ncykrKzsKKworCQkvKiBQcmludCBydWxlIHNldmVyaXR5ICovCisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwgIiVzOiAiLAorCQkJICAgIHNfaWRsZV9jaGtfc2V2ZXJpdHlfc3RyW2hkci0+c2V2ZXJpdHldKTsKKworCQkvKiBQcmludCBydWxlIG1lc3NhZ2UgKi8KKwkJaWYgKGhhc19md19tc2cpCisJCQlwYXJzaW5nX3N0ciArPSBzdHJsZW4ocGFyc2luZ19zdHIpICsgMTsKKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLCAiJXMuIiwKKwkJCSAgICBoYXNfZndfbXNnICYmCisJCQkgICAgcHJpbnRfZndfaWRsZV9jaGsgPyBwYXJzaW5nX3N0ciA6IGxzaV9tc2cpOworCQlwYXJzaW5nX3N0ciArPSBzdHJsZW4ocGFyc2luZ19zdHIpICsgMTsKKworCQkvKiBQcmludCByZWdpc3RlciB2YWx1ZXMgKi8KKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLCAiIFJlZ2lzdGVyczoiKTsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgaGRyLT5udW1fZHVtcGVkX2NvbmRfcmVncyArIGhkci0+bnVtX2R1bXBlZF9pbmZvX3JlZ3M7CisJCSAgICAgaSsrKSB7CisJCQlzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9yZWdfaGRyICpyZWdfaGRyCisJCQkgICAgPSAoc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfcmVnX2hkciAqKQorCQkJICAgIGR1bXBfYnVmOworCQkJYm9vbCBpc19tZW0gPQorCQkJCUdFVF9GSUVMRChyZWdfaGRyLT5kYXRhLAorCQkJCQkgIERCR19JRExFX0NIS19SRVNVTFRfUkVHX0hEUl9JU19NRU0pOworCQkJdTggcmVnX2lkID0KKwkJCQlHRVRfRklFTEQocmVnX2hkci0+ZGF0YSwKKwkJCQkJICBEQkdfSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfUkVHX0lEKTsKKworCQkJLyogU2tpcCByZWcgaGVhZGVyICovCisJCQlkdW1wX2J1ZiArPQorCQkJICAgIChzaXplb2Yoc3RydWN0IGRiZ19pZGxlX2Noa19yZXN1bHRfcmVnX2hkcikgLyA0KTsKKworCQkJLyogU2tpcCByZWdpc3RlciBuYW1lcyB1bnRpbCB0aGUgcmVxdWlyZWQgcmVnX2lkIGlzCisJCQkgKiByZWFjaGVkLgorCQkJICovCisJCQlmb3IgKDsgcmVnX2lkID4gY3Vycl9yZWdfaWQ7CisJCQkgICAgIGN1cnJfcmVnX2lkKyssCisJCQkgICAgIHBhcnNpbmdfc3RyICs9IHN0cmxlbihwYXJzaW5nX3N0cikgKyAxKTsKKworCQkJcmVzdWx0c19vZmZzZXQgKz0KKwkJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCSAgICByZXN1bHRzX29mZnNldCksICIgJXMiLAorCQkJCSAgICBwYXJzaW5nX3N0cik7CisJCQlpZiAoaSA8IGhkci0+bnVtX2R1bXBlZF9jb25kX3JlZ3MgJiYgaXNfbWVtKQorCQkJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCQkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkJCSAgICAiWyVkXSIsIGhkci0+bWVtX2VudHJ5X2lkICsKKwkJCQkJICAgIHJlZ19oZHItPnN0YXJ0X2VudHJ5KTsKKwkJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLCAiPSIpOworCQkJZm9yIChqID0gMDsgaiA8IHJlZ19oZHItPnNpemU7IGorKywgZHVtcF9idWYrKykgeworCQkJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCQkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkJCSAgICAiMHgleCIsICpkdW1wX2J1Zik7CisJCQkJaWYgKGogPCByZWdfaGRyLT5zaXplIC0gMSkKKwkJCQkJcmVzdWx0c19vZmZzZXQgKz0KKwkJCQkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyCisJCQkJCQkgICAgKHJlc3VsdHNfYnVmLAorCQkJCQkJICAgICByZXN1bHRzX29mZnNldCksICIsIik7CisJCQl9CisJCX0KKworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsIHJlc3VsdHNfb2Zmc2V0KSwgIlxuIik7CisJfQorCisJLyogQ2hlY2sgaWYgZW5kIG9mIGR1bXAgYnVmZmVyIHdhcyBleGNlZWRlZCAqLworCWlmIChkdW1wX2J1ZiA+IGR1bXBfYnVmX2VuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHJlc3VsdHNfb2Zmc2V0OworfQorCisvKiBQYXJzZXMgYW4gaWRsZSBjaGVjayBkdW1wIGJ1ZmZlci4KKyAqIElmIHJlc3VsdF9idWYgaXMgbm90IE5VTEwsIHRoZSBpZGxlIGNoZWNrIHJlc3VsdHMgYXJlIHByaW50ZWQgdG8gaXQuCisgKiBJbiBhbnkgY2FzZSwgdGhlIHJlcXVpcmVkIHJlc3VsdHMgYnVmZmVyIHNpemUgaXMgYXNzaWduZWQgdG8KKyAqIHBhcnNlZF9yZXN1bHRzX2J5dGVzLgorICogVGhlIHBhcnNpbmcgc3RhdHVzIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9wYXJzZV9pZGxlX2Noa19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgICAgIGNoYXIgKnJlc3VsdHNfYnVmLAorCQkJCQkgICAgICAgdTMyICpwYXJzZWRfcmVzdWx0c19ieXRlcywKKwkJCQkJICAgICAgIHUzMiAqbnVtX2Vycm9ycywKKwkJCQkJICAgICAgIHUzMiAqbnVtX3dhcm5pbmdzKQoreworCWNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSwgKnBhcmFtX25hbWUsICpwYXJhbV9zdHJfdmFsOworCXUzMiAqZHVtcF9idWZfZW5kID0gZHVtcF9idWYgKyBudW1fZHVtcGVkX2R3b3JkczsKKwl1MzIgbnVtX3NlY3Rpb25fcGFyYW1zID0gMCwgbnVtX3J1bGVzOworCXUzMiByZXN1bHRzX29mZnNldCA9IDA7CS8qIE9mZnNldCBpbiByZXN1bHRzX2J1ZiBpbiBieXRlcyAqLworCisJKnBhcnNlZF9yZXN1bHRzX2J5dGVzID0gMDsKKwkqbnVtX2Vycm9ycyA9IDA7CisJKm51bV93YXJuaW5ncyA9IDA7CisJaWYgKCFzX2RiZ19hcnJheXNbQklOX0JVRl9EQkdfUEFSU0lOR19TVFJJTkdTXS5wdHIgfHwKKwkgICAgIXNfZGJnX2FycmF5c1tCSU5fQlVGX0RCR19JRExFX0NIS19QQVJTSU5HX0RBVEFdLnB0cikKKwkJcmV0dXJuIERCR19TVEFUVVNfREJHX0FSUkFZX05PVF9TRVQ7CisKKwkvKiBSZWFkIGdsb2JhbF9wYXJhbXMgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJnbG9iYWxfcGFyYW1zIikpCisJCXJldHVybiBEQkdfU1RBVFVTX0lETEVfQ0hLX1BBUlNFX0ZBSUxFRDsKKworCS8qIFByaW50IGdsb2JhbCBwYXJhbXMgKi8KKwlkdW1wX2J1ZiArPSBxZWRfcHJpbnRfc2VjdGlvbl9wYXJhbXMoZHVtcF9idWYsCisJCQkJCSAgICAgbnVtX3NlY3Rpb25fcGFyYW1zLAorCQkJCQkgICAgIHJlc3VsdHNfYnVmLCAmcmVzdWx0c19vZmZzZXQpOworCisJLyogUmVhZCBpZGxlX2NoayBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgImlkbGVfY2hrIikgfHwgbnVtX3NlY3Rpb25fcGFyYW1zICE9IDEpCisJCXJldHVybiBEQkdfU1RBVFVTX0lETEVfQ0hLX1BBUlNFX0ZBSUxFRDsKKworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3BhcmFtKGR1bXBfYnVmLAorCQkJCSAgICZwYXJhbV9uYW1lLCAmcGFyYW1fc3RyX3ZhbCwgJm51bV9ydWxlcyk7CisJaWYgKHN0cmNtcChwYXJhbV9uYW1lLCAibnVtX3J1bGVzIikgIT0gMCkKKwkJcmV0dXJuIERCR19TVEFUVVNfSURMRV9DSEtfUEFSU0VfRkFJTEVEOworCisJaWYgKG51bV9ydWxlcykgeworCQl1MzIgcnVsZXNfcHJpbnRfc2l6ZTsKKworCQkvKiBQcmludCBGVyBvdXRwdXQgKi8KKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJICAgICJGV19JRExFX0NIRUNLOlxuIik7CisJCXJ1bGVzX3ByaW50X3NpemUgPQorCQkJcWVkX3BhcnNlX2lkbGVfY2hrX2R1bXBfcnVsZXMocF9od2ZuLCBkdW1wX2J1ZiwKKwkJCQkJCSAgICAgIGR1bXBfYnVmX2VuZCwgbnVtX3J1bGVzLAorCQkJCQkJICAgICAgdHJ1ZSwKKwkJCQkJCSAgICAgIHJlc3VsdHNfYnVmID8KKwkJCQkJCSAgICAgIHJlc3VsdHNfYnVmICsKKwkJCQkJCSAgICAgIHJlc3VsdHNfb2Zmc2V0IDogTlVMTCwKKwkJCQkJCSAgICAgIG51bV9lcnJvcnMsIG51bV93YXJuaW5ncyk7CisJCXJlc3VsdHNfb2Zmc2V0ICs9IHJ1bGVzX3ByaW50X3NpemU7CisJCWlmIChydWxlc19wcmludF9zaXplID09IDApCisJCQlyZXR1cm4gREJHX1NUQVRVU19JRExFX0NIS19QQVJTRV9GQUlMRUQ7CisKKwkJLyogUHJpbnQgTFNJIG91dHB1dCAqLworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkgICAgIlxuTFNJX0lETEVfQ0hFQ0s6XG4iKTsKKwkJcnVsZXNfcHJpbnRfc2l6ZSA9CisJCQlxZWRfcGFyc2VfaWRsZV9jaGtfZHVtcF9ydWxlcyhwX2h3Zm4sIGR1bXBfYnVmLAorCQkJCQkJICAgICAgZHVtcF9idWZfZW5kLCBudW1fcnVsZXMsCisJCQkJCQkgICAgICBmYWxzZSwKKwkJCQkJCSAgICAgIHJlc3VsdHNfYnVmID8KKwkJCQkJCSAgICAgIHJlc3VsdHNfYnVmICsKKwkJCQkJCSAgICAgIHJlc3VsdHNfb2Zmc2V0IDogTlVMTCwKKwkJCQkJCSAgICAgIG51bV9lcnJvcnMsIG51bV93YXJuaW5ncyk7CisJCXJlc3VsdHNfb2Zmc2V0ICs9IHJ1bGVzX3ByaW50X3NpemU7CisJCWlmIChydWxlc19wcmludF9zaXplID09IDApCisJCQlyZXR1cm4gREJHX1NUQVRVU19JRExFX0NIS19QQVJTRV9GQUlMRUQ7CisJfQorCisJLyogUHJpbnQgZXJyb3JzL3dhcm5pbmdzIGNvdW50ICovCisJaWYgKCpudW1fZXJyb3JzKSB7CisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCSAgICAiXG5JZGxlIENoZWNrIGZhaWxlZCEhISAod2l0aCAlZCBlcnJvcnMgYW5kICVkIHdhcm5pbmdzKVxuIiwKKwkJCSAgICAqbnVtX2Vycm9ycywgKm51bV93YXJuaW5ncyk7CisJfSBlbHNlIGlmICgqbnVtX3dhcm5pbmdzKSB7CisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCSAgICAiXG5JZGxlIENoZWNrIGNvbXBsZXRlZCBzdWNjZXNzZnVseSAod2l0aCAlZCB3YXJuaW5ncylcbiIsCisJCQkgICAgKm51bV93YXJuaW5ncyk7CisJfSBlbHNlIHsKKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJICAgICJcbklkbGUgQ2hlY2sgY29tcGxldGVkIHN1Y2Nlc3NmdWx5XG4iKTsKKwl9CisKKwkvKiBBZGQgMSBmb3Igc3RyaW5nIE5VTEwgdGVybWluYXRpb24gKi8KKwkqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMgPSByZXN1bHRzX29mZnNldCArIDE7CisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZ2V0X2lkbGVfY2hrX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKQoreworCXUzMiBudW1fZXJyb3JzLCBudW1fd2FybmluZ3M7CisKKwlyZXR1cm4gcWVkX3BhcnNlX2lkbGVfY2hrX2R1bXAocF9od2ZuLAorCQkJCSAgICAgICBkdW1wX2J1ZiwKKwkJCQkgICAgICAgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJICAgICAgIE5VTEwsCisJCQkJICAgICAgIHJlc3VsdHNfYnVmX3NpemUsCisJCQkJICAgICAgICZudW1fZXJyb3JzLCAmbnVtX3dhcm5pbmdzKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9pZGxlX2Noa19yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgIGNoYXIgKnJlc3VsdHNfYnVmLAorCQkJCQkgICB1MzIgKm51bV9lcnJvcnMsIHUzMiAqbnVtX3dhcm5pbmdzKQoreworCXUzMiBwYXJzZWRfYnVmX3NpemU7CisKKwlyZXR1cm4gcWVkX3BhcnNlX2lkbGVfY2hrX2R1bXAocF9od2ZuLAorCQkJCSAgICAgICBkdW1wX2J1ZiwKKwkJCQkgICAgICAgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJICAgICAgIHJlc3VsdHNfYnVmLAorCQkJCSAgICAgICAmcGFyc2VkX2J1Zl9zaXplLAorCQkJCSAgICAgICBudW1fZXJyb3JzLCBudW1fd2FybmluZ3MpOworfQorCisvKiBGcmVlcyB0aGUgc3BlY2lmaWVkIE1DUCBUcmFjZSBtZXRhIGRhdGEgKi8KK3N0YXRpYyB2b2lkIHFlZF9tY3BfdHJhY2VfZnJlZV9tZXRhKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICBzdHJ1Y3QgbWNwX3RyYWNlX21ldGEgKm1ldGEpCit7CisJdTMyIGk7CisKKwkvKiBSZWxlYXNlIG1vZHVsZXMgKi8KKwlpZiAobWV0YS0+bW9kdWxlcykgeworCQlmb3IgKGkgPSAwOyBpIDwgbWV0YS0+bW9kdWxlc19udW07IGkrKykKKwkJCWtmcmVlKG1ldGEtPm1vZHVsZXNbaV0pOworCQlrZnJlZShtZXRhLT5tb2R1bGVzKTsKKwl9CisKKwkvKiBSZWxlYXNlIGZvcm1hdHMgKi8KKwlpZiAobWV0YS0+Zm9ybWF0cykgeworCQlmb3IgKGkgPSAwOyBpIDwgbWV0YS0+Zm9ybWF0c19udW07IGkrKykKKwkJCWtmcmVlKG1ldGEtPmZvcm1hdHNbaV0uZm9ybWF0X3N0cik7CisJCWtmcmVlKG1ldGEtPmZvcm1hdHMpOworCX0KK30KKworLyogQWxsb2NhdGVzIGFuZCBmaWxscyBNQ1AgVHJhY2UgbWV0YSBkYXRhIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbWV0YSBkYXRhCisgKiBkdW1wIGJ1ZmZlci4KKyAqIFJldHVybnMgZGVidWcgc3RhdHVzIGNvZGUuCisgKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX21jcF90cmFjZV9hbGxvY19tZXRhKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJY29uc3QgdTMyICptZXRhX2J1ZiwKKwkJCQkJCXN0cnVjdCBtY3BfdHJhY2VfbWV0YSAqbWV0YSkKK3sKKwl1OCAqbWV0YV9idWZfYnl0ZXMgPSAodTggKiltZXRhX2J1ZjsKKwl1MzIgb2Zmc2V0ID0gMCwgc2lnbmF0dXJlLCBpOworCisJbWVtc2V0KG1ldGEsIDAsIHNpemVvZigqbWV0YSkpOworCisJLyogUmVhZCBmaXJzdCBzaWduYXR1cmUgKi8KKwlzaWduYXR1cmUgPSBxZWRfcmVhZF9kd29yZF9mcm9tX2J1ZihtZXRhX2J1Zl9ieXRlcywgJm9mZnNldCk7CisJaWYgKHNpZ25hdHVyZSAhPSBNQ1BfVFJBQ0VfTUVUQV9JTUFHRV9TSUdOQVRVUkUpCisJCXJldHVybiBEQkdfU1RBVFVTX0lOVkFMSURfVFJBQ0VfU0lHTkFUVVJFOworCisJLyogUmVhZCBudW1iZXIgb2YgbW9kdWxlcyBhbmQgYWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgdGhlIG1vZHVsZXMKKwkgKiBwb2ludGVycy4KKwkgKi8KKwltZXRhLT5tb2R1bGVzX251bSA9IHFlZF9yZWFkX2J5dGVfZnJvbV9idWYobWV0YV9idWZfYnl0ZXMsICZvZmZzZXQpOworCW1ldGEtPm1vZHVsZXMgPSBremFsbG9jKG1ldGEtPm1vZHVsZXNfbnVtICogc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpOworCWlmICghbWV0YS0+bW9kdWxlcykKKwkJcmV0dXJuIERCR19TVEFUVVNfVklSVF9NRU1fQUxMT0NfRkFJTEVEOworCisJLyogQWxsb2NhdGUgYW5kIHJlYWQgYWxsIG1vZHVsZSBzdHJpbmdzICovCisJZm9yIChpID0gMDsgaSA8IG1ldGEtPm1vZHVsZXNfbnVtOyBpKyspIHsKKwkJdTggbW9kdWxlX2xlbiA9IHFlZF9yZWFkX2J5dGVfZnJvbV9idWYobWV0YV9idWZfYnl0ZXMsICZvZmZzZXQpOworCisJCSoobWV0YS0+bW9kdWxlcyArIGkpID0ga3phbGxvYyhtb2R1bGVfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCEoKihtZXRhLT5tb2R1bGVzICsgaSkpKSB7CisJCQkvKiBVcGRhdGUgbnVtYmVyIG9mIG1vZHVsZXMgdG8gYmUgcmVsZWFzZWQgKi8KKwkJCW1ldGEtPm1vZHVsZXNfbnVtID0gaSA/IGkgLSAxIDogMDsKKwkJCXJldHVybiBEQkdfU1RBVFVTX1ZJUlRfTUVNX0FMTE9DX0ZBSUxFRDsKKwkJfQorCisJCXFlZF9yZWFkX3N0cl9mcm9tX2J1ZihtZXRhX2J1Zl9ieXRlcywgJm9mZnNldCwgbW9kdWxlX2xlbiwKKwkJCQkgICAgICAqKG1ldGEtPm1vZHVsZXMgKyBpKSk7CisJCWlmIChtb2R1bGVfbGVuID4gTUNQX1RSQUNFX01BWF9NT0RVTEVfTEVOKQorCQkJKCoobWV0YS0+bW9kdWxlcyArIGkpKVtNQ1BfVFJBQ0VfTUFYX01PRFVMRV9MRU5dID0gJ1wwJzsKKwl9CisKKwkvKiBSZWFkIHNlY29uZCBzaWduYXR1cmUgKi8KKwlzaWduYXR1cmUgPSBxZWRfcmVhZF9kd29yZF9mcm9tX2J1ZihtZXRhX2J1Zl9ieXRlcywgJm9mZnNldCk7CisJaWYgKHNpZ25hdHVyZSAhPSBNQ1BfVFJBQ0VfTUVUQV9JTUFHRV9TSUdOQVRVUkUpCisJCXJldHVybiBEQkdfU1RBVFVTX0lOVkFMSURfVFJBQ0VfU0lHTkFUVVJFOworCisJLyogUmVhZCBudW1iZXIgb2YgZm9ybWF0cyBhbmQgYWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgZm9ybWF0cyAqLworCW1ldGEtPmZvcm1hdHNfbnVtID0gcWVkX3JlYWRfZHdvcmRfZnJvbV9idWYobWV0YV9idWZfYnl0ZXMsICZvZmZzZXQpOworCW1ldGEtPmZvcm1hdHMgPSBremFsbG9jKG1ldGEtPmZvcm1hdHNfbnVtICoKKwkJCQlzaXplb2Yoc3RydWN0IG1jcF90cmFjZV9mb3JtYXQpLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghbWV0YS0+Zm9ybWF0cykKKwkJcmV0dXJuIERCR19TVEFUVVNfVklSVF9NRU1fQUxMT0NfRkFJTEVEOworCisJLyogQWxsb2NhdGUgYW5kIHJlYWQgYWxsIHN0cmluZ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWV0YS0+Zm9ybWF0c19udW07IGkrKykgeworCQlzdHJ1Y3QgbWNwX3RyYWNlX2Zvcm1hdCAqZm9ybWF0X3B0ciA9ICZtZXRhLT5mb3JtYXRzW2ldOworCQl1OCBmb3JtYXRfbGVuOworCisJCWZvcm1hdF9wdHItPmRhdGEgPSBxZWRfcmVhZF9kd29yZF9mcm9tX2J1ZihtZXRhX2J1Zl9ieXRlcywKKwkJCQkJCQkgICAmb2Zmc2V0KTsKKwkJZm9ybWF0X2xlbiA9CisJCSAgICAoZm9ybWF0X3B0ci0+ZGF0YSAmCisJCSAgICAgTUNQX1RSQUNFX0ZPUk1BVF9MRU5fTUFTSykgPj4gTUNQX1RSQUNFX0ZPUk1BVF9MRU5fU0hJRlQ7CisJCWZvcm1hdF9wdHItPmZvcm1hdF9zdHIgPSBremFsbG9jKGZvcm1hdF9sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIWZvcm1hdF9wdHItPmZvcm1hdF9zdHIpIHsKKwkJCS8qIFVwZGF0ZSBudW1iZXIgb2YgbW9kdWxlcyB0byBiZSByZWxlYXNlZCAqLworCQkJbWV0YS0+Zm9ybWF0c19udW0gPSBpID8gaSAtIDEgOiAwOworCQkJcmV0dXJuIERCR19TVEFUVVNfVklSVF9NRU1fQUxMT0NfRkFJTEVEOworCQl9CisKKwkJcWVkX3JlYWRfc3RyX2Zyb21fYnVmKG1ldGFfYnVmX2J5dGVzLAorCQkJCSAgICAgICZvZmZzZXQsCisJCQkJICAgICAgZm9ybWF0X2xlbiwgZm9ybWF0X3B0ci0+Zm9ybWF0X3N0cik7CisJfQorCisJcmV0dXJuIERCR19TVEFUVVNfT0s7Cit9CisKKy8qIFBhcnNlcyBhbiBNQ1AgVHJhY2UgZHVtcCBidWZmZXIuCisgKiBJZiByZXN1bHRfYnVmIGlzIG5vdCBOVUxMLCB0aGUgTUNQIFRyYWNlIHJlc3VsdHMgYXJlIHByaW50ZWQgdG8gaXQuCisgKiBJbiBhbnkgY2FzZSwgdGhlIHJlcXVpcmVkIHJlc3VsdHMgYnVmZmVyIHNpemUgaXMgYXNzaWduZWQgdG8KKyAqIHBhcnNlZF9yZXN1bHRzX2J5dGVzLgorICogVGhlIHBhcnNpbmcgc3RhdHVzIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9wYXJzZV9tY3BfdHJhY2VfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCXUzMiAqZHVtcF9idWYsCisJCQkJCQl1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQljaGFyICpyZXN1bHRzX2J1ZiwKKwkJCQkJCXUzMiAqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMpCit7CisJdTMyIHJlc3VsdHNfb2Zmc2V0ID0gMCwgcGFyYW1fbWFzaywgcGFyYW1fc2hpZnQsIHBhcmFtX251bV92YWw7CisJdTMyIG51bV9zZWN0aW9uX3BhcmFtcywgb2Zmc2V0LCBlbmRfb2Zmc2V0LCBieXRlc19sZWZ0OworCWNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSwgKnBhcmFtX25hbWUsICpwYXJhbV9zdHJfdmFsOworCXUzMiB0cmFjZV9kYXRhX2R3b3JkcywgdHJhY2VfbWV0YV9kd29yZHM7CisJc3RydWN0IG1jcF90cmFjZV9tZXRhIG1ldGE7CisJc3RydWN0IG1jcF90cmFjZSAqdHJhY2U7CisJZW51bSBkYmdfc3RhdHVzIHN0YXR1czsKKwljb25zdCB1MzIgKm1ldGFfYnVmOworCXU4ICp0cmFjZV9idWY7CisKKwkqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMgPSAwOworCisJLyogUmVhZCBnbG9iYWxfcGFyYW1zIHNlY3Rpb24gKi8KKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJICZzZWN0aW9uX25hbWUsICZudW1fc2VjdGlvbl9wYXJhbXMpOworCWlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAiZ2xvYmFsX3BhcmFtcyIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19NQ1BfVFJBQ0VfQkFEX0RBVEE7CisKKwkvKiBQcmludCBnbG9iYWwgcGFyYW1zICovCisJZHVtcF9idWYgKz0gcWVkX3ByaW50X3NlY3Rpb25fcGFyYW1zKGR1bXBfYnVmLAorCQkJCQkgICAgIG51bV9zZWN0aW9uX3BhcmFtcywKKwkJCQkJICAgICByZXN1bHRzX2J1ZiwgJnJlc3VsdHNfb2Zmc2V0KTsKKworCS8qIFJlYWQgdHJhY2VfZGF0YSBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgIm1jcF90cmFjZV9kYXRhIikgfHwgbnVtX3NlY3Rpb25fcGFyYW1zICE9IDEpCisJCXJldHVybiBEQkdfU1RBVFVTX01DUF9UUkFDRV9CQURfREFUQTsKKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9wYXJhbShkdW1wX2J1ZiwKKwkJCQkgICAmcGFyYW1fbmFtZSwgJnBhcmFtX3N0cl92YWwsICZwYXJhbV9udW1fdmFsKTsKKwlpZiAoc3RyY21wKHBhcmFtX25hbWUsICJzaXplIikpCisJCXJldHVybiBEQkdfU1RBVFVTX01DUF9UUkFDRV9CQURfREFUQTsKKwl0cmFjZV9kYXRhX2R3b3JkcyA9IHBhcmFtX251bV92YWw7CisKKwkvKiBQcmVwYXJlIHRyYWNlIGluZm8gKi8KKwl0cmFjZSA9IChzdHJ1Y3QgbWNwX3RyYWNlICopZHVtcF9idWY7CisJdHJhY2VfYnVmID0gKHU4ICopZHVtcF9idWYgKyBzaXplb2Yoc3RydWN0IG1jcF90cmFjZSk7CisJb2Zmc2V0ID0gdHJhY2UtPnRyYWNlX29sZGVzdDsKKwllbmRfb2Zmc2V0ID0gdHJhY2UtPnRyYWNlX3Byb2Q7CisJYnl0ZXNfbGVmdCA9IHFlZF9jeWNsaWNfc3ViKGVuZF9vZmZzZXQsIG9mZnNldCwgdHJhY2UtPnNpemUpOworCWR1bXBfYnVmICs9IHRyYWNlX2RhdGFfZHdvcmRzOworCisJLyogUmVhZCBtZXRhX2RhdGEgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJtY3BfdHJhY2VfbWV0YSIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19NQ1BfVFJBQ0VfQkFEX0RBVEE7CisJZHVtcF9idWYgKz0gcWVkX3JlYWRfcGFyYW0oZHVtcF9idWYsCisJCQkJICAgJnBhcmFtX25hbWUsICZwYXJhbV9zdHJfdmFsLCAmcGFyYW1fbnVtX3ZhbCk7CisJaWYgKHN0cmNtcChwYXJhbV9uYW1lLCAic2l6ZSIpICE9IDApCisJCXJldHVybiBEQkdfU1RBVFVTX01DUF9UUkFDRV9CQURfREFUQTsKKwl0cmFjZV9tZXRhX2R3b3JkcyA9IHBhcmFtX251bV92YWw7CisKKwkvKiBDaG9vc2UgbWV0YSBkYXRhIGJ1ZmZlciAqLworCWlmICghdHJhY2VfbWV0YV9kd29yZHMpIHsKKwkJLyogRHVtcCBkb2Vzbid0IGluY2x1ZGUgbWV0YSBkYXRhICovCisJCWlmICghc19tY3BfdHJhY2VfbWV0YS5wdHIpCisJCQlyZXR1cm4gREJHX1NUQVRVU19NQ1BfVFJBQ0VfTk9fTUVUQTsKKwkJbWV0YV9idWYgPSBzX21jcF90cmFjZV9tZXRhLnB0cjsKKwl9IGVsc2UgeworCQkvKiBEdW1wIGluY2x1ZGVzIG1ldGEgZGF0YSAqLworCQltZXRhX2J1ZiA9IGR1bXBfYnVmOworCX0KKworCS8qIEFsbG9jYXRlIG1ldGEgZGF0YSBtZW1vcnkgKi8KKwlzdGF0dXMgPSBxZWRfbWNwX3RyYWNlX2FsbG9jX21ldGEocF9od2ZuLCBtZXRhX2J1ZiwgJm1ldGEpOworCWlmIChzdGF0dXMgIT0gREJHX1NUQVRVU19PSykKKwkJZ290byBmcmVlX21lbTsKKworCS8qIElnbm9yZSB0aGUgbGV2ZWwgYW5kIG1vZHVsZXMgbWFza3MgLSBqdXN0IHByaW50IGV2ZXJ5dGhpbmcgdGhhdCBpcworCSAqIGFscmVhZHkgaW4gdGhlIGJ1ZmZlci4KKwkgKi8KKwl3aGlsZSAoYnl0ZXNfbGVmdCkgeworCQlzdHJ1Y3QgbWNwX3RyYWNlX2Zvcm1hdCAqZm9ybWF0X3B0cjsKKwkJdTggZm9ybWF0X2xldmVsLCBmb3JtYXRfbW9kdWxlOworCQl1MzIgcGFyYW1zWzNdID0geyAwLCAwLCAwIH07CisJCXUzMiBoZWFkZXIsIGZvcm1hdF9pZHgsIGk7CisKKwkJaWYgKGJ5dGVzX2xlZnQgPCBNRldfVFJBQ0VfRU5UUllfU0laRSkgeworCQkJc3RhdHVzID0gREJHX1NUQVRVU19NQ1BfVFJBQ0VfQkFEX0RBVEE7CisJCQlnb3RvIGZyZWVfbWVtOworCQl9CisKKwkJaGVhZGVyID0gcWVkX3JlYWRfZnJvbV9jeWNsaWNfYnVmKHRyYWNlX2J1ZiwKKwkJCQkJCSAgJm9mZnNldCwKKwkJCQkJCSAgdHJhY2UtPnNpemUsCisJCQkJCQkgIE1GV19UUkFDRV9FTlRSWV9TSVpFKTsKKwkJYnl0ZXNfbGVmdCAtPSBNRldfVFJBQ0VfRU5UUllfU0laRTsKKwkJZm9ybWF0X2lkeCA9IGhlYWRlciAmIE1GV19UUkFDRV9FVkVOVElEX01BU0s7CisKKwkJLyogU2tpcCBtZXNzYWdlIGlmIGl0cyAgaW5kZXggZG9lc24ndCBleGlzdCBpbiB0aGUgbWV0YSBkYXRhICovCisJCWlmIChmb3JtYXRfaWR4ID4gbWV0YS5mb3JtYXRzX251bSkgeworCQkJdTggZm9ybWF0X3NpemUgPQorCQkJICAgICh1OCkoKGhlYWRlciAmCisJCQkJICBNRldfVFJBQ0VfUFJNX1NJWkVfTUFTSykgPj4KKwkJCQkgTUZXX1RSQUNFX1BSTV9TSVpFX1NISUZUKTsKKworCQkJaWYgKGJ5dGVzX2xlZnQgPCBmb3JtYXRfc2l6ZSkgeworCQkJCXN0YXR1cyA9IERCR19TVEFUVVNfTUNQX1RSQUNFX0JBRF9EQVRBOworCQkJCWdvdG8gZnJlZV9tZW07CisJCQl9CisKKwkJCW9mZnNldCA9IHFlZF9jeWNsaWNfYWRkKG9mZnNldCwKKwkJCQkJCWZvcm1hdF9zaXplLCB0cmFjZS0+c2l6ZSk7CisJCQlieXRlc19sZWZ0IC09IGZvcm1hdF9zaXplOworCQkJY29udGludWU7CisJCX0KKworCQlmb3JtYXRfcHRyID0gJm1ldGEuZm9ybWF0c1tmb3JtYXRfaWR4XTsKKwkJZm9yIChpID0gMCwKKwkJICAgICBwYXJhbV9tYXNrID0gTUNQX1RSQUNFX0ZPUk1BVF9QMV9TSVpFX01BU0ssIHBhcmFtX3NoaWZ0ID0KKwkJICAgICBNQ1BfVFJBQ0VfRk9STUFUX1AxX1NJWkVfU0hJRlQ7CisJCSAgICAgaSA8IE1DUF9UUkFDRV9GT1JNQVRfTUFYX1BBUkFNUzsKKwkJICAgICBpKyssIHBhcmFtX21hc2sgPDw9IE1DUF9UUkFDRV9GT1JNQVRfUEFSQU1fV0lEVEgsCisJCSAgICAgcGFyYW1fc2hpZnQgKz0gTUNQX1RSQUNFX0ZPUk1BVF9QQVJBTV9XSURUSCkgeworCQkJLyogRXh0cmFjdCBwYXJhbSBzaXplICgwLi4zKSAqLworCQkJdTggcGFyYW1fc2l6ZSA9CisJCQkgICAgKHU4KSgoZm9ybWF0X3B0ci0+ZGF0YSAmCisJCQkJICBwYXJhbV9tYXNrKSA+PiBwYXJhbV9zaGlmdCk7CisKKwkJCS8qIElmIHRoZSBwYXJhbSBzaXplIGlzIHplcm8sIHRoZXJlIGFyZSBubyBvdGhlcgorCQkJICogcGFyYW1ldGVycy4KKwkJCSAqLworCQkJaWYgKCFwYXJhbV9zaXplKQorCQkJCWJyZWFrOworCisJCQkvKiBTaXplIGlzIGVuY29kZWQgdXNpbmcgMiBiaXRzLCB3aGVyZSAzIGlzIHVzZWQgdG8KKwkJCSAqIGVuY29kZSA0LgorCQkJICovCisJCQlpZiAocGFyYW1fc2l6ZSA9PSAzKQorCQkJCXBhcmFtX3NpemUgPSA0OworCQkJaWYgKGJ5dGVzX2xlZnQgPCBwYXJhbV9zaXplKSB7CisJCQkJc3RhdHVzID0gREJHX1NUQVRVU19NQ1BfVFJBQ0VfQkFEX0RBVEE7CisJCQkJZ290byBmcmVlX21lbTsKKwkJCX0KKworCQkJcGFyYW1zW2ldID0gcWVkX3JlYWRfZnJvbV9jeWNsaWNfYnVmKHRyYWNlX2J1ZiwKKwkJCQkJCQkgICAgICZvZmZzZXQsCisJCQkJCQkJICAgICB0cmFjZS0+c2l6ZSwKKwkJCQkJCQkgICAgIHBhcmFtX3NpemUpOworCQkJYnl0ZXNfbGVmdCAtPSBwYXJhbV9zaXplOworCQl9CisKKwkJZm9ybWF0X2xldmVsID0KKwkJICAgICh1OCkoKGZvcm1hdF9wdHItPmRhdGEgJgorCQkJICBNQ1BfVFJBQ0VfRk9STUFUX0xFVkVMX01BU0spID4+CisJCQkgIE1DUF9UUkFDRV9GT1JNQVRfTEVWRUxfU0hJRlQpOworCQlmb3JtYXRfbW9kdWxlID0KKwkJICAgICh1OCkoKGZvcm1hdF9wdHItPmRhdGEgJgorCQkJICBNQ1BfVFJBQ0VfRk9STUFUX01PRFVMRV9NQVNLKSA+PgorCQkJIE1DUF9UUkFDRV9GT1JNQVRfTU9EVUxFX1NISUZUKTsKKwkJaWYgKGZvcm1hdF9sZXZlbCA+PSBBUlJBWV9TSVpFKHNfbWNwX3RyYWNlX2xldmVsX3N0cikpIHsKKwkJCXN0YXR1cyA9IERCR19TVEFUVVNfTUNQX1RSQUNFX0JBRF9EQVRBOworCQkJZ290byBmcmVlX21lbTsKKwkJfQorCisJCS8qIFByaW50IGN1cnJlbnQgbWVzc2FnZSB0byByZXN1bHRzIGJ1ZmZlciAqLworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksICIlcyAlLThzOiAiLAorCQkJICAgIHNfbWNwX3RyYWNlX2xldmVsX3N0cltmb3JtYXRfbGV2ZWxdLAorCQkJICAgIG1ldGEubW9kdWxlc1tmb3JtYXRfbW9kdWxlXSk7CisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCSAgICBmb3JtYXRfcHRyLT5mb3JtYXRfc3RyLCBwYXJhbXNbMF0sIHBhcmFtc1sxXSwKKwkJCSAgICBwYXJhbXNbMl0pOworCX0KKworZnJlZV9tZW06CisJKnBhcnNlZF9yZXN1bHRzX2J5dGVzID0gcmVzdWx0c19vZmZzZXQgKyAxOworCXFlZF9tY3BfdHJhY2VfZnJlZV9tZXRhKHBfaHdmbiwgJm1ldGEpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfZ2V0X21jcF90cmFjZV9yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSkKK3sKKwlyZXR1cm4gcWVkX3BhcnNlX21jcF90cmFjZV9kdW1wKHBfaHdmbiwKKwkJCQkJZHVtcF9idWYsCisJCQkJCW51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQlOVUxMLCByZXN1bHRzX2J1Zl9zaXplKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9tY3BfdHJhY2VfcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgICBjaGFyICpyZXN1bHRzX2J1ZikKK3sKKwl1MzIgcGFyc2VkX2J1Zl9zaXplOworCisJcmV0dXJuIHFlZF9wYXJzZV9tY3BfdHJhY2VfZHVtcChwX2h3Zm4sCisJCQkJCWR1bXBfYnVmLAorCQkJCQludW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJcmVzdWx0c19idWYsICZwYXJzZWRfYnVmX3NpemUpOworfQorCisvKiBQYXJzZXMgYSBSZWcgRklGTyBkdW1wIGJ1ZmZlci4KKyAqIElmIHJlc3VsdF9idWYgaXMgbm90IE5VTEwsIHRoZSBSZWcgRklGTyByZXN1bHRzIGFyZSBwcmludGVkIHRvIGl0LgorICogSW4gYW55IGNhc2UsIHRoZSByZXF1aXJlZCByZXN1bHRzIGJ1ZmZlciBzaXplIGlzIGFzc2lnbmVkIHRvCisgKiBwYXJzZWRfcmVzdWx0c19ieXRlcy4KKyAqIFRoZSBwYXJzaW5nIHN0YXR1cyBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGVudW0gZGJnX3N0YXR1cyBxZWRfcGFyc2VfcmVnX2ZpZm9fZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgICAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgICAgICBjaGFyICpyZXN1bHRzX2J1ZiwKKwkJCQkJICAgICAgIHUzMiAqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMpCit7CisJdTMyIHJlc3VsdHNfb2Zmc2V0ID0gMCwgcGFyYW1fbnVtX3ZhbCwgbnVtX3NlY3Rpb25fcGFyYW1zLCBudW1fZWxlbWVudHM7CisJY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lLCAqcGFyYW1fbmFtZSwgKnBhcmFtX3N0cl92YWw7CisJc3RydWN0IHJlZ19maWZvX2VsZW1lbnQgKmVsZW1lbnRzOworCXU4IGksIGosIGVycl92YWwsIHZmX3ZhbDsKKwljaGFyIHZmX3N0cls0XTsKKworCS8qIFJlYWQgZ2xvYmFsX3BhcmFtcyBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgImdsb2JhbF9wYXJhbXMiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfUkVHX0ZJRk9fQkFEX0RBVEE7CisKKwkvKiBQcmludCBnbG9iYWwgcGFyYW1zICovCisJZHVtcF9idWYgKz0gcWVkX3ByaW50X3NlY3Rpb25fcGFyYW1zKGR1bXBfYnVmLAorCQkJCQkgICAgIG51bV9zZWN0aW9uX3BhcmFtcywKKwkJCQkJICAgICByZXN1bHRzX2J1ZiwgJnJlc3VsdHNfb2Zmc2V0KTsKKworCS8qIFJlYWQgcmVnX2ZpZm9fZGF0YSBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgInJlZ19maWZvX2RhdGEiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfUkVHX0ZJRk9fQkFEX0RBVEE7CisJZHVtcF9idWYgKz0gcWVkX3JlYWRfcGFyYW0oZHVtcF9idWYsCisJCQkJICAgJnBhcmFtX25hbWUsICZwYXJhbV9zdHJfdmFsLCAmcGFyYW1fbnVtX3ZhbCk7CisJaWYgKHN0cmNtcChwYXJhbV9uYW1lLCAic2l6ZSIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19SRUdfRklGT19CQURfREFUQTsKKwlpZiAocGFyYW1fbnVtX3ZhbCAlIFJFR19GSUZPX0VMRU1FTlRfRFdPUkRTKQorCQlyZXR1cm4gREJHX1NUQVRVU19SRUdfRklGT19CQURfREFUQTsKKwludW1fZWxlbWVudHMgPSBwYXJhbV9udW1fdmFsIC8gUkVHX0ZJRk9fRUxFTUVOVF9EV09SRFM7CisJZWxlbWVudHMgPSAoc3RydWN0IHJlZ19maWZvX2VsZW1lbnQgKilkdW1wX2J1ZjsKKworCS8qIERlY29kZSBlbGVtZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fZWxlbWVudHM7IGkrKykgeworCQlib29sIGVycl9wcmludGVkID0gZmFsc2U7CisKKwkJLyogRGlzY292ZXIgaWYgZWxlbWVudCBiZWxvbmdzIHRvIGEgVkYgb3IgYSBQRiAqLworCQl2Zl92YWwgPSBHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwgUkVHX0ZJRk9fRUxFTUVOVF9WRik7CisJCWlmICh2Zl92YWwgPT0gUkVHX0ZJRk9fRUxFTUVOVF9JU19QRl9WRl9WQUwpCisJCQlzcHJpbnRmKHZmX3N0ciwgIiVzIiwgIk4vQSIpOworCQllbHNlCisJCQlzcHJpbnRmKHZmX3N0ciwgIiVkIiwgdmZfdmFsKTsKKworCQkvKiBBZGQgcGFyc2VkIGVsZW1lbnQgdG8gcGFyc2VkIGJ1ZmZlciAqLworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkgICAgInJhdzogMHglMDE2bGx4LCBhZGRyZXNzOiAweCUwN2xseCwgYWNjZXNzOiAlLTVzLCBwZjogJTJsbGQsIHZmOiAlcywgcG9ydDogJWxsZCwgcHJpdmlsZWdlOiAlLTNzLCBwcm90ZWN0aW9uOiAlLTEycywgbWFzdGVyOiAlLTRzLCBlcnJvcnM6ICIsCisJCQkgICAgZWxlbWVudHNbaV0uZGF0YSwKKwkJCSAgICBHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkgICAgICBSRUdfRklGT19FTEVNRU5UX0FERFJFU1MpICoKKwkJCQkgICAgICBSRUdfRklGT19FTEVNRU5UX0FERFJfRkFDVE9SLAorCQkJCSAgICAgIHNfYWNjZXNzX3N0cnNbR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJCQkgICAgUkVHX0ZJRk9fRUxFTUVOVF9BQ0NFU1MpXSwKKwkJCSAgICBHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkgICAgICBSRUdfRklGT19FTEVNRU5UX1BGKSwgdmZfc3RyLAorCQkJICAgIEdFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCSAgICAgIFJFR19GSUZPX0VMRU1FTlRfUE9SVCksCisJCQkJICAgICAgc19wcml2aWxlZ2Vfc3Ryc1tHRVRfRklFTEQoZWxlbWVudHNbaV0uCisJCQkJICAgICAgZGF0YSwKKwkJCQkgICAgICBSRUdfRklGT19FTEVNRU5UX1BSSVZJTEVHRSldLAorCQkJICAgIHNfcHJvdGVjdGlvbl9zdHJzW0dFVF9GSUVMRChlbGVtZW50c1tpXS5kYXRhLAorCQkJCQkJUkVHX0ZJRk9fRUxFTUVOVF9QUk9URUNUSU9OKV0sCisJCQkgICAgc19tYXN0ZXJfc3Ryc1tHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkJCVJFR19GSUZPX0VMRU1FTlRfTUFTVEVSKV0pOworCisJCS8qIFByaW50IGVycm9ycyAqLworCQlmb3IgKGogPSAwLAorCQkgICAgIGVycl92YWwgPSBHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkJIFJFR19GSUZPX0VMRU1FTlRfRVJST1IpOworCQkgICAgIGogPCBBUlJBWV9TSVpFKHNfcmVnX2ZpZm9fZXJyb3Jfc3Rycyk7CisJCSAgICAgaisrLCBlcnJfdmFsID4+PSAxKSB7CisJCQlpZiAoIShlcnJfdmFsICYgMHgxKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChlcnJfcHJpbnRlZCkKKwkJCQlyZXN1bHRzX29mZnNldCArPQorCQkJCQlzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCQkJcmVzdWx0c19vZmZzZXQpLAorCQkJCQkJIiwgIik7CisJCQlyZXN1bHRzX29mZnNldCArPQorCQkJCXNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJCXJlc3VsdHNfb2Zmc2V0KSwgIiVzIiwKKwkJCQkJc19yZWdfZmlmb19lcnJvcl9zdHJzW2pdKTsKKwkJCWVycl9wcmludGVkID0gdHJ1ZTsKKwkJfQorCisJCXJlc3VsdHNfb2Zmc2V0ICs9CisJCSAgICBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwgcmVzdWx0c19vZmZzZXQpLCAiXG4iKTsKKwl9CisKKwlyZXN1bHRzX29mZnNldCArPSBzcHJpbnRmKHFlZF9nZXRfYnVmX3B0cihyZXN1bHRzX2J1ZiwKKwkJCQkJCSAgcmVzdWx0c19vZmZzZXQpLAorCQkJCSAgImZpZm8gY29udGFpbmVkICVkIGVsZW1lbnRzIiwgbnVtX2VsZW1lbnRzKTsKKworCS8qIEFkZCAxIGZvciBzdHJpbmcgTlVMTCB0ZXJtaW5hdGlvbiAqLworCSpwYXJzZWRfcmVzdWx0c19ieXRlcyA9IHJlc3VsdHNfb2Zmc2V0ICsgMTsKKwlyZXR1cm4gREJHX1NUQVRVU19PSzsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9nZXRfcmVnX2ZpZm9fcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpCit7CisJcmV0dXJuIHFlZF9wYXJzZV9yZWdfZmlmb19kdW1wKHBfaHdmbiwKKwkJCQkgICAgICAgZHVtcF9idWYsCisJCQkJICAgICAgIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCSAgICAgICBOVUxMLCByZXN1bHRzX2J1Zl9zaXplKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9yZWdfZmlmb19yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgIGNoYXIgKnJlc3VsdHNfYnVmKQoreworCXUzMiBwYXJzZWRfYnVmX3NpemU7CisKKwlyZXR1cm4gcWVkX3BhcnNlX3JlZ19maWZvX2R1bXAocF9od2ZuLAorCQkJCSAgICAgICBkdW1wX2J1ZiwKKwkJCQkgICAgICAgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJICAgICAgIHJlc3VsdHNfYnVmLCAmcGFyc2VkX2J1Zl9zaXplKTsKK30KKworLyogUGFyc2VzIGFuIElHVSBGSUZPIGR1bXAgYnVmZmVyLgorICogSWYgcmVzdWx0X2J1ZiBpcyBub3QgTlVMTCwgdGhlIElHVSBGSUZPIHJlc3VsdHMgYXJlIHByaW50ZWQgdG8gaXQuCisgKiBJbiBhbnkgY2FzZSwgdGhlIHJlcXVpcmVkIHJlc3VsdHMgYnVmZmVyIHNpemUgaXMgYXNzaWduZWQgdG8KKyAqIHBhcnNlZF9yZXN1bHRzX2J5dGVzLgorICogVGhlIHBhcnNpbmcgc3RhdHVzIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzIHFlZF9wYXJzZV9pZ3VfZmlmb19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgICAgIGNoYXIgKnJlc3VsdHNfYnVmLAorCQkJCQkgICAgICAgdTMyICpwYXJzZWRfcmVzdWx0c19ieXRlcykKK3sKKwl1MzIgcmVzdWx0c19vZmZzZXQgPSAwLCBwYXJhbV9udW1fdmFsLCBudW1fc2VjdGlvbl9wYXJhbXMsIG51bV9lbGVtZW50czsKKwljb25zdCBjaGFyICpzZWN0aW9uX25hbWUsICpwYXJhbV9uYW1lLCAqcGFyYW1fc3RyX3ZhbDsKKwlzdHJ1Y3QgaWd1X2ZpZm9fZWxlbWVudCAqZWxlbWVudHM7CisJY2hhciBwYXJzZWRfYWRkcl9kYXRhWzMyXTsKKwljaGFyIHBhcnNlZF93cl9kYXRhWzI1Nl07CisJdTggaSwgajsKKworCS8qIFJlYWQgZ2xvYmFsX3BhcmFtcyBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgImdsb2JhbF9wYXJhbXMiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfSUdVX0ZJRk9fQkFEX0RBVEE7CisKKwkvKiBQcmludCBnbG9iYWwgcGFyYW1zICovCisJZHVtcF9idWYgKz0gcWVkX3ByaW50X3NlY3Rpb25fcGFyYW1zKGR1bXBfYnVmLAorCQkJCQkgICAgIG51bV9zZWN0aW9uX3BhcmFtcywKKwkJCQkJICAgICByZXN1bHRzX2J1ZiwgJnJlc3VsdHNfb2Zmc2V0KTsKKworCS8qIFJlYWQgaWd1X2ZpZm9fZGF0YSBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgImlndV9maWZvX2RhdGEiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfSUdVX0ZJRk9fQkFEX0RBVEE7CisJZHVtcF9idWYgKz0gcWVkX3JlYWRfcGFyYW0oZHVtcF9idWYsCisJCQkJICAgJnBhcmFtX25hbWUsICZwYXJhbV9zdHJfdmFsLCAmcGFyYW1fbnVtX3ZhbCk7CisJaWYgKHN0cmNtcChwYXJhbV9uYW1lLCAic2l6ZSIpKQorCQlyZXR1cm4gREJHX1NUQVRVU19JR1VfRklGT19CQURfREFUQTsKKwlpZiAocGFyYW1fbnVtX3ZhbCAlIElHVV9GSUZPX0VMRU1FTlRfRFdPUkRTKQorCQlyZXR1cm4gREJHX1NUQVRVU19JR1VfRklGT19CQURfREFUQTsKKwludW1fZWxlbWVudHMgPSBwYXJhbV9udW1fdmFsIC8gSUdVX0ZJRk9fRUxFTUVOVF9EV09SRFM7CisJZWxlbWVudHMgPSAoc3RydWN0IGlndV9maWZvX2VsZW1lbnQgKilkdW1wX2J1ZjsKKworCS8qIERlY29kZSBlbGVtZW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fZWxlbWVudHM7IGkrKykgeworCQkvKiBkd29yZDEyIChkd29yZCBpbmRleCAxIGFuZCAyKSBjb250YWlucyBiaXRzIDMyLi45NSBvZiB0aGUKKwkJICogRklGTyBlbGVtZW50LgorCQkgKi8KKwkJdTY0IGR3b3JkMTIgPQorCQkgICAgKCh1NjQpZWxlbWVudHNbaV0uZHdvcmQyIDw8IDMyKSB8IGVsZW1lbnRzW2ldLmR3b3JkMTsKKwkJYm9vbCBpc193cl9jbWQgPSBHRVRfRklFTEQoZHdvcmQxMiwKKwkJCQkJICAgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDEyX0lTX1dSX0NNRCk7CisJCWJvb2wgaXNfcGYgPSBHRVRfRklFTEQoZWxlbWVudHNbaV0uZHdvcmQwLAorCQkJCSAgICAgICBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9JU19QRik7CisJCXUxNiBjbWRfYWRkciA9IEdFVF9GSUVMRChlbGVtZW50c1tpXS5kd29yZDAsCisJCQkJCSBJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9DTURfQUREUik7CisJCXU4IHNvdXJjZSA9IEdFVF9GSUVMRChlbGVtZW50c1tpXS5kd29yZDAsCisJCQkJICAgICAgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfU09VUkNFKTsKKwkJdTggZXJyX3R5cGUgPSBHRVRfRklFTEQoZWxlbWVudHNbaV0uZHdvcmQwLAorCQkJCQlJR1VfRklGT19FTEVNRU5UX0RXT1JEMF9FUlJfVFlQRSk7CisJCWNvbnN0IHN0cnVjdCBpZ3VfZmlmb19hZGRyX2RhdGEgKmFkZHJfZGF0YSA9IE5VTEw7CisKKwkJaWYgKHNvdXJjZSA+PSBBUlJBWV9TSVpFKHNfaWd1X2ZpZm9fc291cmNlX3N0cnMpKQorCQkJcmV0dXJuIERCR19TVEFUVVNfSUdVX0ZJRk9fQkFEX0RBVEE7CisJCWlmIChlcnJfdHlwZSA+PSBBUlJBWV9TSVpFKHNfaWd1X2ZpZm9fZXJyb3Jfc3RycykpCisJCQlyZXR1cm4gREJHX1NUQVRVU19JR1VfRklGT19CQURfREFUQTsKKworCQkvKiBGaW5kIGFkZHJlc3MgZGF0YSAqLworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShzX2lndV9maWZvX2FkZHJfZGF0YSkgJiYgIWFkZHJfZGF0YTsKKwkJICAgICBqKyspCisJCQlpZiAoY21kX2FkZHIgPj0gc19pZ3VfZmlmb19hZGRyX2RhdGFbal0uc3RhcnRfYWRkciAmJgorCQkJICAgIGNtZF9hZGRyIDw9IHNfaWd1X2ZpZm9fYWRkcl9kYXRhW2pdLmVuZF9hZGRyKQorCQkJCWFkZHJfZGF0YSA9ICZzX2lndV9maWZvX2FkZHJfZGF0YVtqXTsKKwkJaWYgKCFhZGRyX2RhdGEpCisJCQlyZXR1cm4gREJHX1NUQVRVU19JR1VfRklGT19CQURfREFUQTsKKworCQkvKiBQcmVwYXJlIHBhcnNlZCBhZGRyZXNzIGRhdGEgKi8KKwkJc3dpdGNoIChhZGRyX2RhdGEtPnR5cGUpIHsKKwkJY2FzZSBJR1VfQUREUl9UWVBFX01TSVhfTUVNOgorCQkJc3ByaW50ZihwYXJzZWRfYWRkcl9kYXRhLAorCQkJCSIgdmVjdG9yX251bT0weCV4IiwgY21kX2FkZHIgLyAyKTsKKwkJCWJyZWFrOworCQljYXNlIElHVV9BRERSX1RZUEVfV1JJVEVfSU5UX0FDSzoKKwkJY2FzZSBJR1VfQUREUl9UWVBFX1dSSVRFX1BST0RfVVBEQVRFOgorCQkJc3ByaW50ZihwYXJzZWRfYWRkcl9kYXRhLAorCQkJCSIgU0I9MHgleCIsIGNtZF9hZGRyIC0gYWRkcl9kYXRhLT5zdGFydF9hZGRyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcGFyc2VkX2FkZHJfZGF0YVswXSA9ICdcMCc7CisJCX0KKworCQkvKiBQcmVwYXJlIHBhcnNlZCB3cml0ZSBkYXRhICovCisJCWlmIChpc193cl9jbWQpIHsKKwkJCXUzMiB3cl9kYXRhID0gR0VUX0ZJRUxEKGR3b3JkMTIsCisJCQkJCUlHVV9GSUZPX0VMRU1FTlRfRFdPUkQxMl9XUl9EQVRBKTsKKwkJCXUzMiBwcm9kX2NvbnMgPSBHRVRfRklFTEQod3JfZGF0YSwKKwkJCQkJCSAgSUdVX0ZJRk9fV1JfREFUQV9QUk9EX0NPTlMpOworCQkJdTggaXNfY2xlYW51cCA9IEdFVF9GSUVMRCh3cl9kYXRhLAorCQkJCQkJICBJR1VfRklGT19XUl9EQVRBX0NNRF9UWVBFKTsKKworCQkJaWYgKHNvdXJjZSA9PSBJR1VfU1JDX0FUVE4pIHsKKwkJCQlzcHJpbnRmKHBhcnNlZF93cl9kYXRhLAorCQkJCQkicHJvZDogMHgleCwgIiwgcHJvZF9jb25zKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlzX2NsZWFudXApIHsKKwkJCQkJdTggY2xlYW51cF92YWwgPSBHRVRfRklFTEQod3JfZGF0YSwKKwkJCQkJCQkJICAgSUdVX0ZJRk9fQ0xFQU5VUF9XUl9EQVRBX0NMRUFOVVBfVkFMKTsKKwkJCQkJdTggY2xlYW51cF90eXBlID0gR0VUX0ZJRUxEKHdyX2RhdGEsCisJCQkJCQkJCSAgICBJR1VfRklGT19DTEVBTlVQX1dSX0RBVEFfQ0xFQU5VUF9UWVBFKTsKKworCQkJCQlzcHJpbnRmKHBhcnNlZF93cl9kYXRhLAorCQkJCQkJImNtZF90eXBlOiBjbGVhbnVwLCBjbGVhbnVwX3ZhbDogJXMsIGNsZWFudXBfdHlwZTogJWQsICIsCisJCQkJCQljbGVhbnVwX3ZhbCA/ICJzZXQiIDogImNsZWFyIiwKKwkJCQkJCWNsZWFudXBfdHlwZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdTggdXBkYXRlX2ZsYWcgPSBHRVRfRklFTEQod3JfZGF0YSwKKwkJCQkJCQkJICAgSUdVX0ZJRk9fV1JfREFUQV9VUERBVEVfRkxBRyk7CisJCQkJCXU4IGVuX2Rpc19pbnRfZm9yX3NiID0KKwkJCQkJICAgIEdFVF9GSUVMRCh3cl9kYXRhLAorCQkJCQkJICAgICAgSUdVX0ZJRk9fV1JfREFUQV9FTl9ESVNfSU5UX0ZPUl9TQik7CisJCQkJCXU4IHNlZ21lbnQgPSBHRVRfRklFTEQod3JfZGF0YSwKKwkJCQkJCQkgICAgICAgSUdVX0ZJRk9fV1JfREFUQV9TRUdNRU5UKTsKKwkJCQkJdTggdGltZXJfbWFzayA9IEdFVF9GSUVMRCh3cl9kYXRhLAorCQkJCQkJCQkgIElHVV9GSUZPX1dSX0RBVEFfVElNRVJfTUFTSyk7CisKKwkJCQkJc3ByaW50ZihwYXJzZWRfd3JfZGF0YSwKKwkJCQkJCSJjbWRfdHlwZTogcHJvZC9jb25zIHVwZGF0ZSwgcHJvZC9jb25zOiAweCV4LCB1cGRhdGVfZmxhZzogJXMsIGVuX2Rpc19pbnRfZm9yX3NiOiAlcywgc2VnbWVudDogJXMsIHRpbWVyX21hc2s9JWQsICIsCisJCQkJCQlwcm9kX2NvbnMsCisJCQkJCQl1cGRhdGVfZmxhZyA/ICJ1cGRhdGUiIDogIm5vcCIsCisJCQkJCQllbl9kaXNfaW50X2Zvcl9zYgorCQkJCQkJPyAoZW5fZGlzX2ludF9mb3Jfc2IgPT0KKwkJCQkJCSAgIDEgPyAiZGlzYWJsZSIgOiAibm9wIikgOgorCQkJCQkJImVuYWJsZSIsCisJCQkJCQlzZWdtZW50ID8gImF0dG4iIDogInJlZ3VsYXIiLAorCQkJCQkJdGltZXJfbWFzayk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJcGFyc2VkX3dyX2RhdGFbMF0gPSAnXDAnOworCQl9CisKKwkJLyogQWRkIHBhcnNlZCBlbGVtZW50IHRvIHBhcnNlZCBidWZmZXIgKi8KKwkJcmVzdWx0c19vZmZzZXQgKz0KKwkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkgICAgcmVzdWx0c19vZmZzZXQpLAorCQkJICAgICJyYXc6IDB4JTAxeCUwOHglMDh4LCAlczogJWQsIHNvdXJjZTogJXMsIHR5cGU6ICVzLCBjbWRfYWRkcjogMHgleCAoJXMlcyksICVzZXJyb3I6ICVzXG4iLAorCQkJICAgIGVsZW1lbnRzW2ldLmR3b3JkMiwgZWxlbWVudHNbaV0uZHdvcmQxLAorCQkJICAgIGVsZW1lbnRzW2ldLmR3b3JkMCwKKwkJCSAgICBpc19wZiA/ICJwZiIgOiAidmYiLAorCQkJICAgIEdFVF9GSUVMRChlbGVtZW50c1tpXS5kd29yZDAsCisJCQkJICAgICAgSUdVX0ZJRk9fRUxFTUVOVF9EV09SRDBfRklEKSwKKwkJCSAgICBzX2lndV9maWZvX3NvdXJjZV9zdHJzW3NvdXJjZV0sCisJCQkgICAgaXNfd3JfY21kID8gIndyIiA6ICJyZCIsIGNtZF9hZGRyLAorCQkJICAgICghaXNfcGYgJiYgYWRkcl9kYXRhLT52Zl9kZXNjKQorCQkJICAgID8gYWRkcl9kYXRhLT52Zl9kZXNjIDogYWRkcl9kYXRhLT5kZXNjLAorCQkJICAgIHBhcnNlZF9hZGRyX2RhdGEsIHBhcnNlZF93cl9kYXRhLAorCQkJICAgIHNfaWd1X2ZpZm9fZXJyb3Jfc3Ryc1tlcnJfdHlwZV0pOworCX0KKworCXJlc3VsdHNfb2Zmc2V0ICs9IHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJICByZXN1bHRzX29mZnNldCksCisJCQkJICAiZmlmbyBjb250YWluZWQgJWQgZWxlbWVudHMiLCBudW1fZWxlbWVudHMpOworCisJLyogQWRkIDEgZm9yIHN0cmluZyBOVUxMIHRlcm1pbmF0aW9uICovCisJKnBhcnNlZF9yZXN1bHRzX2J5dGVzID0gcmVzdWx0c19vZmZzZXQgKyAxOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2dldF9pZ3VfZmlmb19yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSkKK3sKKwlyZXR1cm4gcWVkX3BhcnNlX2lndV9maWZvX2R1bXAocF9od2ZuLAorCQkJCSAgICAgICBkdW1wX2J1ZiwKKwkJCQkgICAgICAgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJICAgICAgIE5VTEwsIHJlc3VsdHNfYnVmX3NpemUpOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX3ByaW50X2lndV9maWZvX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgY2hhciAqcmVzdWx0c19idWYpCit7CisJdTMyIHBhcnNlZF9idWZfc2l6ZTsKKworCXJldHVybiBxZWRfcGFyc2VfaWd1X2ZpZm9fZHVtcChwX2h3Zm4sCisJCQkJICAgICAgIGR1bXBfYnVmLAorCQkJCSAgICAgICBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkgICAgICAgcmVzdWx0c19idWYsICZwYXJzZWRfYnVmX3NpemUpOworfQorCitzdGF0aWMgZW51bSBkYmdfc3RhdHVzCitxZWRfcGFyc2VfcHJvdGVjdGlvbl9vdmVycmlkZV9kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCSAgIGNoYXIgKnJlc3VsdHNfYnVmLAorCQkJCSAgIHUzMiAqcGFyc2VkX3Jlc3VsdHNfYnl0ZXMpCit7CisJdTMyIHJlc3VsdHNfb2Zmc2V0ID0gMCwgcGFyYW1fbnVtX3ZhbCwgbnVtX3NlY3Rpb25fcGFyYW1zLCBudW1fZWxlbWVudHM7CisJY29uc3QgY2hhciAqc2VjdGlvbl9uYW1lLCAqcGFyYW1fbmFtZSwgKnBhcmFtX3N0cl92YWw7CisJc3RydWN0IHByb3RlY3Rpb25fb3ZlcnJpZGVfZWxlbWVudCAqZWxlbWVudHM7CisJdTggaTsKKworCS8qIFJlYWQgZ2xvYmFsX3BhcmFtcyBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgImdsb2JhbF9wYXJhbXMiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfUFJPVEVDVElPTl9PVkVSUklERV9CQURfREFUQTsKKworCS8qIFByaW50IGdsb2JhbCBwYXJhbXMgKi8KKwlkdW1wX2J1ZiArPSBxZWRfcHJpbnRfc2VjdGlvbl9wYXJhbXMoZHVtcF9idWYsCisJCQkJCSAgICAgbnVtX3NlY3Rpb25fcGFyYW1zLAorCQkJCQkgICAgIHJlc3VsdHNfYnVmLCAmcmVzdWx0c19vZmZzZXQpOworCisJLyogUmVhZCBwcm90ZWN0aW9uX292ZXJyaWRlX2RhdGEgc2VjdGlvbiAqLworCWR1bXBfYnVmICs9IHFlZF9yZWFkX3NlY3Rpb25faGRyKGR1bXBfYnVmLAorCQkJCQkgJnNlY3Rpb25fbmFtZSwgJm51bV9zZWN0aW9uX3BhcmFtcyk7CisJaWYgKHN0cmNtcChzZWN0aW9uX25hbWUsICJwcm90ZWN0aW9uX292ZXJyaWRlX2RhdGEiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfUFJPVEVDVElPTl9PVkVSUklERV9CQURfREFUQTsKKwlkdW1wX2J1ZiArPSBxZWRfcmVhZF9wYXJhbShkdW1wX2J1ZiwKKwkJCQkgICAmcGFyYW1fbmFtZSwgJnBhcmFtX3N0cl92YWwsICZwYXJhbV9udW1fdmFsKTsKKwlpZiAoc3RyY21wKHBhcmFtX25hbWUsICJzaXplIikpCisJCXJldHVybiBEQkdfU1RBVFVTX1BST1RFQ1RJT05fT1ZFUlJJREVfQkFEX0RBVEE7CisJaWYgKHBhcmFtX251bV92YWwgJSBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfRFdPUkRTICE9IDApCisJCXJldHVybiBEQkdfU1RBVFVTX1BST1RFQ1RJT05fT1ZFUlJJREVfQkFEX0RBVEE7CisJbnVtX2VsZW1lbnRzID0gcGFyYW1fbnVtX3ZhbCAvIFBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9EV09SRFM7CisJZWxlbWVudHMgPSAoc3RydWN0IHByb3RlY3Rpb25fb3ZlcnJpZGVfZWxlbWVudCAqKWR1bXBfYnVmOworCisJLyogRGVjb2RlIGVsZW1lbnRzICovCisJZm9yIChpID0gMDsgaSA8IG51bV9lbGVtZW50czsgaSsrKSB7CisJCXUzMiBhZGRyZXNzID0gR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJCVBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9BRERSRVNTKSAqCisJCQkJCVBST1RFQ1RJT05fT1ZFUlJJREVfRUxFTUVOVF9BRERSX0ZBQ1RPUjsKKworCQlyZXN1bHRzX29mZnNldCArPQorCQkgICAgc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCSAgICByZXN1bHRzX29mZnNldCksCisJCQkgICAgIndpbmRvdyAlMmQsIGFkZHJlc3M6IDB4JTA3eCwgc2l6ZTogJTdsbGQgcmVncywgcmVhZDogJWxsZCwgd3JpdGU6ICVsbGQsIHJlYWQgcHJvdGVjdGlvbjogJS0xMnMsIHdyaXRlIHByb3RlY3Rpb246ICUtMTJzXG4iLAorCQkJICAgIGksIGFkZHJlc3MsCisJCQkgICAgR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJICAgICAgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1dJTkRPV19TSVpFKSwKKwkJCSAgICBHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQkgICAgICBQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfUkVBRCksCisJCQkgICAgR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJICAgICAgUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1dSSVRFKSwKKwkJCSAgICBzX3Byb3RlY3Rpb25fc3Ryc1tHRVRfRklFTEQoZWxlbWVudHNbaV0uZGF0YSwKKwkJCQlQUk9URUNUSU9OX09WRVJSSURFX0VMRU1FTlRfUkVBRF9QUk9URUNUSU9OKV0sCisJCQkgICAgc19wcm90ZWN0aW9uX3N0cnNbR0VUX0ZJRUxEKGVsZW1lbnRzW2ldLmRhdGEsCisJCQkJUFJPVEVDVElPTl9PVkVSUklERV9FTEVNRU5UX1dSSVRFX1BST1RFQ1RJT04pXSk7CisJfQorCisJcmVzdWx0c19vZmZzZXQgKz0gc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCQkgICJwcm90ZWN0aW9uIG92ZXJyaWRlIGNvbnRhaW5lZCAlZCBlbGVtZW50cyIsCisJCQkJICBudW1fZWxlbWVudHMpOworCisJLyogQWRkIDEgZm9yIHN0cmluZyBOVUxMIHRlcm1pbmF0aW9uICovCisJKnBhcnNlZF9yZXN1bHRzX2J5dGVzID0gcmVzdWx0c19vZmZzZXQgKyAxOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCitlbnVtIGRiZ19zdGF0dXMKK3FlZF9nZXRfcHJvdGVjdGlvbl9vdmVycmlkZV9yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICAgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSkKK3sKKwlyZXR1cm4gcWVkX3BhcnNlX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZHVtcChwX2h3Zm4sCisJCQkJCQkgIGR1bXBfYnVmLAorCQkJCQkJICBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgTlVMTCwgcmVzdWx0c19idWZfc2l6ZSk7Cit9CisKK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfcHJvdGVjdGlvbl9vdmVycmlkZV9yZXN1bHRzKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgICAgIGNoYXIgKnJlc3VsdHNfYnVmKQoreworCXUzMiBwYXJzZWRfYnVmX3NpemU7CisKKwlyZXR1cm4gcWVkX3BhcnNlX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZHVtcChwX2h3Zm4sCisJCQkJCQkgIGR1bXBfYnVmLAorCQkJCQkJICBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgcmVzdWx0c19idWYsCisJCQkJCQkgICZwYXJzZWRfYnVmX3NpemUpOworfQorCisvKiBQYXJzZXMgYSBGVyBBc3NlcnRzIGR1bXAgYnVmZmVyLgorICogSWYgcmVzdWx0X2J1ZiBpcyBub3QgTlVMTCwgdGhlIEZXIEFzc2VydHMgcmVzdWx0cyBhcmUgcHJpbnRlZCB0byBpdC4KKyAqIEluIGFueSBjYXNlLCB0aGUgcmVxdWlyZWQgcmVzdWx0cyBidWZmZXIgc2l6ZSBpcyBhc3NpZ25lZCB0bworICogcGFyc2VkX3Jlc3VsdHNfYnl0ZXMuCisgKiBUaGUgcGFyc2luZyBzdGF0dXMgaXMgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBlbnVtIGRiZ19zdGF0dXMgcWVkX3BhcnNlX2Z3X2Fzc2VydHNfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSB1MzIgKmR1bXBfYnVmLAorCQkJCQkJIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSBjaGFyICpyZXN1bHRzX2J1ZiwKKwkJCQkJCSB1MzIgKnBhcnNlZF9yZXN1bHRzX2J5dGVzKQoreworCXUzMiByZXN1bHRzX29mZnNldCA9IDAsIG51bV9zZWN0aW9uX3BhcmFtcywgcGFyYW1fbnVtX3ZhbCwgaTsKKwljb25zdCBjaGFyICpwYXJhbV9uYW1lLCAqcGFyYW1fc3RyX3ZhbCwgKnNlY3Rpb25fbmFtZTsKKwlib29sIGxhc3Rfc2VjdGlvbl9mb3VuZCA9IGZhbHNlOworCisJKnBhcnNlZF9yZXN1bHRzX2J5dGVzID0gMDsKKworCS8qIFJlYWQgZ2xvYmFsX3BhcmFtcyBzZWN0aW9uICovCisJZHVtcF9idWYgKz0gcWVkX3JlYWRfc2VjdGlvbl9oZHIoZHVtcF9idWYsCisJCQkJCSAmc2VjdGlvbl9uYW1lLCAmbnVtX3NlY3Rpb25fcGFyYW1zKTsKKwlpZiAoc3RyY21wKHNlY3Rpb25fbmFtZSwgImdsb2JhbF9wYXJhbXMiKSkKKwkJcmV0dXJuIERCR19TVEFUVVNfRldfQVNTRVJUU19QQVJTRV9GQUlMRUQ7CisKKwkvKiBQcmludCBnbG9iYWwgcGFyYW1zICovCisJZHVtcF9idWYgKz0gcWVkX3ByaW50X3NlY3Rpb25fcGFyYW1zKGR1bXBfYnVmLAorCQkJCQkgICAgIG51bV9zZWN0aW9uX3BhcmFtcywKKwkJCQkJICAgICByZXN1bHRzX2J1ZiwgJnJlc3VsdHNfb2Zmc2V0KTsKKwl3aGlsZSAoIWxhc3Rfc2VjdGlvbl9mb3VuZCkgeworCQljb25zdCBjaGFyICpzdG9ybV9sZXR0ZXIgPSBOVUxMOworCQl1MzIgc3Rvcm1fZHVtcF9zaXplID0gMDsKKworCQlkdW1wX2J1ZiArPSBxZWRfcmVhZF9zZWN0aW9uX2hkcihkdW1wX2J1ZiwKKwkJCQkJCSAmc2VjdGlvbl9uYW1lLAorCQkJCQkJICZudW1fc2VjdGlvbl9wYXJhbXMpOworCQlpZiAoIXN0cmNtcChzZWN0aW9uX25hbWUsICJsYXN0IikpIHsKKwkJCWxhc3Rfc2VjdGlvbl9mb3VuZCA9IHRydWU7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoc2VjdGlvbl9uYW1lLCAiZndfYXNzZXJ0cyIpKSB7CisJCQlyZXR1cm4gREJHX1NUQVRVU19GV19BU1NFUlRTX1BBUlNFX0ZBSUxFRDsKKwkJfQorCisJCS8qIEV4dHJhY3QgcGFyYW1zICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fc2VjdGlvbl9wYXJhbXM7IGkrKykgeworCQkJZHVtcF9idWYgKz0gcWVkX3JlYWRfcGFyYW0oZHVtcF9idWYsCisJCQkJCQkgICAmcGFyYW1fbmFtZSwKKwkJCQkJCSAgICZwYXJhbV9zdHJfdmFsLAorCQkJCQkJICAgJnBhcmFtX251bV92YWwpOworCQkJaWYgKCFzdHJjbXAocGFyYW1fbmFtZSwgInN0b3JtIikpCisJCQkJc3Rvcm1fbGV0dGVyID0gcGFyYW1fc3RyX3ZhbDsKKwkJCWVsc2UgaWYgKCFzdHJjbXAocGFyYW1fbmFtZSwgInNpemUiKSkKKwkJCQlzdG9ybV9kdW1wX3NpemUgPSBwYXJhbV9udW1fdmFsOworCQkJZWxzZQorCQkJCXJldHVybiBEQkdfU1RBVFVTX0ZXX0FTU0VSVFNfUEFSU0VfRkFJTEVEOworCQl9CisKKwkJaWYgKCFzdG9ybV9sZXR0ZXIgfHwgIXN0b3JtX2R1bXBfc2l6ZSkKKwkJCXJldHVybiBEQkdfU1RBVFVTX0ZXX0FTU0VSVFNfUEFSU0VfRkFJTEVEOworCisJCS8qIFByaW50IGRhdGEgKi8KKwkJcmVzdWx0c19vZmZzZXQgKz0gc3ByaW50ZihxZWRfZ2V0X2J1Zl9wdHIocmVzdWx0c19idWYsCisJCQkJCQkJICByZXN1bHRzX29mZnNldCksCisJCQkJCSAgIlxuJXNTVE9STV9BU1NFUlQ6IHNpemU9JWRcbiIsCisJCQkJCSAgc3Rvcm1fbGV0dGVyLCBzdG9ybV9kdW1wX3NpemUpOworCQlmb3IgKGkgPSAwOyBpIDwgc3Rvcm1fZHVtcF9zaXplOyBpKyssIGR1bXBfYnVmKyspCisJCQlyZXN1bHRzX29mZnNldCArPQorCQkJICAgIHNwcmludGYocWVkX2dldF9idWZfcHRyKHJlc3VsdHNfYnVmLAorCQkJCQkJICAgIHJlc3VsdHNfb2Zmc2V0KSwKKwkJCQkgICAgIiUwOHhcbiIsICpkdW1wX2J1Zik7CisJfQorCisJLyogQWRkIDEgZm9yIHN0cmluZyBOVUxMIHRlcm1pbmF0aW9uICovCisJKnBhcnNlZF9yZXN1bHRzX2J5dGVzID0gcmVzdWx0c19vZmZzZXQgKyAxOworCXJldHVybiBEQkdfU1RBVFVTX09LOworfQorCitlbnVtIGRiZ19zdGF0dXMgcWVkX2dldF9md19hc3NlcnRzX3Jlc3VsdHNfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgICAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKQoreworCXJldHVybiBxZWRfcGFyc2VfZndfYXNzZXJ0c19kdW1wKHBfaHdmbiwKKwkJCQkJIGR1bXBfYnVmLAorCQkJCQkgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSBOVUxMLCByZXN1bHRzX2J1Zl9zaXplKTsKK30KKworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9md19hc3NlcnRzX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgICAgY2hhciAqcmVzdWx0c19idWYpCit7CisJdTMyIHBhcnNlZF9idWZfc2l6ZTsKKworCXJldHVybiBxZWRfcGFyc2VfZndfYXNzZXJ0c19kdW1wKHBfaHdmbiwKKwkJCQkJIGR1bXBfYnVmLAorCQkJCQkgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSByZXN1bHRzX2J1ZiwgJnBhcnNlZF9idWZfc2l6ZSk7Cit9CisKKy8qIFdyYXBwZXIgZm9yIHVuaWZ5aW5nIHRoZSBpZGxlX2NoayBhbmQgbWNwX3RyYWNlIGFwaSAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9pZGxlX2Noa19yZXN1bHRzX3dyYXBwZXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICAgY2hhciAqcmVzdWx0c19idWYpCit7CisJdTMyIG51bV9lcnJvcnMsIG51bV93YXJubmluZ3M7CisKKwlyZXR1cm4gcWVkX3ByaW50X2lkbGVfY2hrX3Jlc3VsdHMocF9od2ZuLCBkdW1wX2J1ZiwgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgcmVzdWx0c19idWYsICZudW1fZXJyb3JzLAorCQkJCQkgICZudW1fd2Fybm5pbmdzKTsKK30KKworLyogRmVhdHVyZSBtZXRhIGRhdGEgbG9va3VwIHRhYmxlICovCitzdGF0aWMgc3RydWN0IHsKKwljaGFyICpuYW1lOworCWVudW0gZGJnX3N0YXR1cyAoKmdldF9zaXplKShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LCB1MzIgKnNpemUpOworCWVudW0gZGJnX3N0YXR1cyAoKnBlcmZvcm1fZHVtcCkoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCXN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyICpkdW1wX2J1ZiwKKwkJCQkJdTMyIGJ1Zl9zaXplLCB1MzIgKmR1bXBlZF9kd29yZHMpOworCWVudW0gZGJnX3N0YXR1cyAoKnByaW50X3Jlc3VsdHMpKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgdTMyICpkdW1wX2J1ZiwgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgY2hhciAqcmVzdWx0c19idWYpOworCWVudW0gZGJnX3N0YXR1cyAoKnJlc3VsdHNfYnVmX3NpemUpKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgIHUzMiBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJICAgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSk7Cit9IHFlZF9mZWF0dXJlc19sb29rdXBbXSA9IHsKKwl7CisJImdyYyIsIHFlZF9kYmdfZ3JjX2dldF9kdW1wX2J1Zl9zaXplLAorCQkgICAgcWVkX2RiZ19ncmNfZHVtcCwgTlVMTCwgTlVMTH0sIHsKKwkiaWRsZV9jaGsiLAorCQkgICAgcWVkX2RiZ19pZGxlX2Noa19nZXRfZHVtcF9idWZfc2l6ZSwKKwkJICAgIHFlZF9kYmdfaWRsZV9jaGtfZHVtcCwKKwkJICAgIHFlZF9wcmludF9pZGxlX2Noa19yZXN1bHRzX3dyYXBwZXIsCisJCSAgICBxZWRfZ2V0X2lkbGVfY2hrX3Jlc3VsdHNfYnVmX3NpemV9LCB7CisJIm1jcF90cmFjZSIsCisJCSAgICBxZWRfZGJnX21jcF90cmFjZV9nZXRfZHVtcF9idWZfc2l6ZSwKKwkJICAgIHFlZF9kYmdfbWNwX3RyYWNlX2R1bXAsIHFlZF9wcmludF9tY3BfdHJhY2VfcmVzdWx0cywKKwkJICAgIHFlZF9nZXRfbWNwX3RyYWNlX3Jlc3VsdHNfYnVmX3NpemV9LCB7CisJInJlZ19maWZvIiwKKwkJICAgIHFlZF9kYmdfcmVnX2ZpZm9fZ2V0X2R1bXBfYnVmX3NpemUsCisJCSAgICBxZWRfZGJnX3JlZ19maWZvX2R1bXAsIHFlZF9wcmludF9yZWdfZmlmb19yZXN1bHRzLAorCQkgICAgcWVkX2dldF9yZWdfZmlmb19yZXN1bHRzX2J1Zl9zaXplfSwgeworCSJpZ3VfZmlmbyIsCisJCSAgICBxZWRfZGJnX2lndV9maWZvX2dldF9kdW1wX2J1Zl9zaXplLAorCQkgICAgcWVkX2RiZ19pZ3VfZmlmb19kdW1wLCBxZWRfcHJpbnRfaWd1X2ZpZm9fcmVzdWx0cywKKwkJICAgIHFlZF9nZXRfaWd1X2ZpZm9fcmVzdWx0c19idWZfc2l6ZX0sIHsKKwkicHJvdGVjdGlvbl9vdmVycmlkZSIsCisJCSAgICBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZ2V0X2R1bXBfYnVmX3NpemUsCisJCSAgICBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZHVtcCwKKwkJICAgIHFlZF9wcmludF9wcm90ZWN0aW9uX292ZXJyaWRlX3Jlc3VsdHMsCisJCSAgICBxZWRfZ2V0X3Byb3RlY3Rpb25fb3ZlcnJpZGVfcmVzdWx0c19idWZfc2l6ZX0sIHsKKwkiZndfYXNzZXJ0cyIsCisJCSAgICBxZWRfZGJnX2Z3X2Fzc2VydHNfZ2V0X2R1bXBfYnVmX3NpemUsCisJCSAgICBxZWRfZGJnX2Z3X2Fzc2VydHNfZHVtcCwKKwkJICAgIHFlZF9wcmludF9md19hc3NlcnRzX3Jlc3VsdHMsCisJCSAgICBxZWRfZ2V0X2Z3X2Fzc2VydHNfcmVzdWx0c19idWZfc2l6ZX0sfTsKKworc3RhdGljIHZvaWQgcWVkX2RiZ19wcmludF9mZWF0dXJlKHU4ICpwX3RleHRfYnVmLCB1MzIgdGV4dF9zaXplKQoreworCXUzMiBpLCBwcmVjaXNpb24gPSA4MDsKKworCWlmICghcF90ZXh0X2J1ZikKKwkJcmV0dXJuOworCisJcHJfbm90aWNlKCJcbiUuKnMiLCBwcmVjaXNpb24sIHBfdGV4dF9idWYpOworCWZvciAoaSA9IHByZWNpc2lvbjsgaSA8IHRleHRfc2l6ZTsgaSArPSBwcmVjaXNpb24pCisJCXByX2NvbnQoIiUuKnMiLCBwcmVjaXNpb24sIHBfdGV4dF9idWYgKyBpKTsKKwlwcl9jb250KCJcbiIpOworfQorCisjZGVmaW5lIFFFRF9SRVNVTFRTX0JVRl9NSU5fU0laRSAxNgorLyogR2VuZXJpYyBmdW5jdGlvbiBmb3IgZGVjb2RpbmcgZGVidWcgZmVhdHVyZSBpbmZvICovCitlbnVtIGRiZ19zdGF0dXMgZm9ybWF0X2ZlYXR1cmUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgICAgICAgZW51bSBxZWRfZGJnX2ZlYXR1cmVzIGZlYXR1cmVfaWR4KQoreworCXN0cnVjdCBxZWRfZGJnX2ZlYXR1cmUgKmZlYXR1cmUgPQorCSAgICAmcF9od2ZuLT5jZGV2LT5kYmdfcGFyYW1zLmZlYXR1cmVzW2ZlYXR1cmVfaWR4XTsKKwl1MzIgdGV4dF9zaXplX2J5dGVzLCBudWxsX2NoYXJfcG9zLCBpOworCWVudW0gZGJnX3N0YXR1cyByYzsKKwljaGFyICp0ZXh0X2J1ZjsKKworCS8qIENoZWNrIGlmIGZlYXR1cmUgc3VwcG9ydHMgZm9ybWF0dGluZyBjYXBhYmlsaXR5ICovCisJaWYgKCFxZWRfZmVhdHVyZXNfbG9va3VwW2ZlYXR1cmVfaWR4XS5yZXN1bHRzX2J1Zl9zaXplKQorCQlyZXR1cm4gREJHX1NUQVRVU19PSzsKKworCS8qIE9idGFpbiBzaXplIG9mIGZvcm1hdHRlZCBvdXRwdXQgKi8KKwlyYyA9IHFlZF9mZWF0dXJlc19sb29rdXBbZmVhdHVyZV9pZHhdLgorCQlyZXN1bHRzX2J1Zl9zaXplKHBfaHdmbiwgKHUzMiAqKWZlYXR1cmUtPmR1bXBfYnVmLAorCQkJCSBmZWF0dXJlLT5kdW1wZWRfZHdvcmRzLCAmdGV4dF9zaXplX2J5dGVzKTsKKwlpZiAocmMgIT0gREJHX1NUQVRVU19PSykKKwkJcmV0dXJuIHJjOworCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlIGFsbG9jYXRlZCBzaXplIGlzIGEgbXVsdGlwbGUgb2YgZHdvcmQgKDQgYnl0ZXMpICovCisJbnVsbF9jaGFyX3BvcyA9IHRleHRfc2l6ZV9ieXRlcyAtIDE7CisJdGV4dF9zaXplX2J5dGVzID0gKHRleHRfc2l6ZV9ieXRlcyArIDMpICYgfjB4MzsKKworCWlmICh0ZXh0X3NpemVfYnl0ZXMgPCBRRURfUkVTVUxUU19CVUZfTUlOX1NJWkUpIHsKKwkJRFBfTk9USUNFKHBfaHdmbi0+Y2RldiwKKwkJCSAgImZvcm1hdHRlZCBzaXplIG9mIGZlYXR1cmUgd2FzIHRvbyBzbWFsbCAlZC4gQWJvcnRpbmdcbiIsCisJCQkgIHRleHRfc2l6ZV9ieXRlcyk7CisJCXJldHVybiBEQkdfU1RBVFVTX0lOVkFMSURfQVJHUzsKKwl9CisKKwkvKiBBbGxvY2F0ZSB0ZW1wIHRleHQgYnVmICovCisJdGV4dF9idWYgPSB2emFsbG9jKHRleHRfc2l6ZV9ieXRlcyk7CisJaWYgKCF0ZXh0X2J1ZikKKwkJcmV0dXJuIERCR19TVEFUVVNfVklSVF9NRU1fQUxMT0NfRkFJTEVEOworCisJLyogRGVjb2RlIGZlYXR1cmUgb3Bjb2RlcyB0byBzdHJpbmcgb24gdGVtcCBidWYgKi8KKwlyYyA9IHFlZF9mZWF0dXJlc19sb29rdXBbZmVhdHVyZV9pZHhdLgorCQlwcmludF9yZXN1bHRzKHBfaHdmbiwgKHUzMiAqKWZlYXR1cmUtPmR1bXBfYnVmLAorCQkJICAgICAgZmVhdHVyZS0+ZHVtcGVkX2R3b3JkcywgdGV4dF9idWYpOworCWlmIChyYyAhPSBEQkdfU1RBVFVTX09LKSB7CisJCXZmcmVlKHRleHRfYnVmKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIFJlcGxhY2UgdGhlIG9yaWdpbmFsIG51bGwgY2hhcmFjdGVyIHdpdGggYSAnXG4nIGNoYXJhY3Rlci4KKwkgKiBUaGUgYnl0ZXMgdGhhdCB3ZXJlIGFkZGVkIGFzIGEgcmVzdWx0IG9mIHRoZSBkd29yZCBhbGlnbm1lbnQgYXJlIGFsc28KKwkgKiBwYWRkZWQgd2l0aCAnXG4nIGNoYXJhY3RlcnMuCisJICovCisJZm9yIChpID0gbnVsbF9jaGFyX3BvczsgaSA8IHRleHRfc2l6ZV9ieXRlczsgaSsrKQorCQl0ZXh0X2J1ZltpXSA9ICdcbic7CisKKwkvKiBEdW1wIHByaW50YWJsZSBmZWF0dXJlIHRvIGxvZyAqLworCWlmIChwX2h3Zm4tPmNkZXYtPmRiZ19wYXJhbXMucHJpbnRfZGF0YSkKKwkJcWVkX2RiZ19wcmludF9mZWF0dXJlKHRleHRfYnVmLCB0ZXh0X3NpemVfYnl0ZXMpOworCisJLyogRnJlZSB0aGUgb2xkIGR1bXBfYnVmIGFuZCBwb2ludCB0aGUgZHVtcF9idWYgdG8gdGhlIG5ld2x5IGFsbG9jYWd0ZWQKKwkgKiBhbmQgZm9ybWF0dGVkIHRleHQgYnVmZmVyLgorCSAqLworCXZmcmVlKGZlYXR1cmUtPmR1bXBfYnVmKTsKKwlmZWF0dXJlLT5kdW1wX2J1ZiA9IHRleHRfYnVmOworCWZlYXR1cmUtPmJ1Zl9zaXplID0gdGV4dF9zaXplX2J5dGVzOworCWZlYXR1cmUtPmR1bXBlZF9kd29yZHMgPSB0ZXh0X3NpemVfYnl0ZXMgLyA0OworCXJldHVybiByYzsKK30KKworLyogR2VuZXJpYyBmdW5jdGlvbiBmb3IgcGVyZm9ybWluZyB0aGUgZHVtcCBvZiBhIGRlYnVnIGZlYXR1cmUuICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkgICAgIGVudW0gcWVkX2RiZ19mZWF0dXJlcyBmZWF0dXJlX2lkeCkKK3sKKwlzdHJ1Y3QgcWVkX2RiZ19mZWF0dXJlICpmZWF0dXJlID0KKwkgICAgJnBfaHdmbi0+Y2Rldi0+ZGJnX3BhcmFtcy5mZWF0dXJlc1tmZWF0dXJlX2lkeF07CisJdTMyIGJ1Zl9zaXplX2R3b3JkczsKKwllbnVtIGRiZ19zdGF0dXMgcmM7CisKKwlEUF9OT1RJQ0UocF9od2ZuLT5jZGV2LCAiQ29sbGVjdGluZyBhIGRlYnVnIGZlYXR1cmUgW1wiJXNcIl1cbiIsCisJCSAgcWVkX2ZlYXR1cmVzX2xvb2t1cFtmZWF0dXJlX2lkeF0ubmFtZSk7CisKKwkvKiBEdW1wX2J1ZiB3YXMgYWxyZWFkeSBhbGxvY2F0ZWQgbmVlZCB0byBmcmVlICh0aGlzIGNhbiBoYXBwZW4gaWYgZHVtcAorCSAqIHdhcyBjYWxsZWQgYnV0IGZpbGUgd2FzIG5ldmVyIHJlYWQpLgorCSAqIFdlIGNhbid0IHVzZSB0aGUgYnVmZmVyIGFzIGlzIHNpbmNlIHNpemUgbWF5IGhhdmUgY2hhbmdlZC4KKwkgKi8KKwlpZiAoZmVhdHVyZS0+ZHVtcF9idWYpIHsKKwkJdmZyZWUoZmVhdHVyZS0+ZHVtcF9idWYpOworCQlmZWF0dXJlLT5kdW1wX2J1ZiA9IE5VTEw7CisJfQorCisJLyogR2V0IGJ1ZmZlciBzaXplIGZyb20gaHNpLCBhbGxvY2F0ZSBhY2NvcmRpbmdseSwgYW5kIHBlcmZvcm0gdGhlCisJICogZHVtcC4KKwkgKi8KKwlyYyA9IHFlZF9mZWF0dXJlc19sb29rdXBbZmVhdHVyZV9pZHhdLmdldF9zaXplKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkgICAgICAgJmJ1Zl9zaXplX2R3b3Jkcyk7CisJaWYgKHJjICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiByYzsKKwlmZWF0dXJlLT5idWZfc2l6ZSA9IGJ1Zl9zaXplX2R3b3JkcyAqIHNpemVvZih1MzIpOworCWZlYXR1cmUtPmR1bXBfYnVmID0gdm1hbGxvYyhmZWF0dXJlLT5idWZfc2l6ZSk7CisJaWYgKCFmZWF0dXJlLT5kdW1wX2J1ZikKKwkJcmV0dXJuIERCR19TVEFUVVNfVklSVF9NRU1fQUxMT0NfRkFJTEVEOworCisJcmMgPSBxZWRfZmVhdHVyZXNfbG9va3VwW2ZlYXR1cmVfaWR4XS4KKwkJcGVyZm9ybV9kdW1wKHBfaHdmbiwgcF9wdHQsICh1MzIgKilmZWF0dXJlLT5kdW1wX2J1ZiwKKwkJCSAgICAgZmVhdHVyZS0+YnVmX3NpemUgLyBzaXplb2YodTMyKSwKKwkJCSAgICAgJmZlYXR1cmUtPmR1bXBlZF9kd29yZHMpOworCisJLyogSWYgbWNwIGlzIHN0dWNrIHdlIGdldCBEQkdfU1RBVFVTX05WUkFNX0dFVF9JTUFHRV9GQUlMRUQgZXJyb3IuCisJICogSW4gdGhpcyBjYXNlIHRoZSBidWZmZXIgaG9sZHMgdmFsaWQgYmluYXJ5IGRhdGEsIGJ1dCB3ZSB3b250IGFibGUKKwkgKiB0byBwYXJzZSBpdCAoc2luY2UgcGFyc2luZyByZWxpZXMgb24gZGF0YSBpbiBOVlJBTSB3aGljaCBpcyBvbmx5CisJICogYWNjZXNzaWJsZSB3aGVuIE1GVyBpcyByZXNwb25zaXZlKS4gc2tpcCB0aGUgZm9ybWF0dGluZyBidXQgcmV0dXJuCisJICogc3VjY2VzcyBzbyB0aGF0IGJpbmFyeSBkYXRhIGlzIHByb3ZpZGVkLgorCSAqLworCWlmIChyYyA9PSBEQkdfU1RBVFVTX05WUkFNX0dFVF9JTUFHRV9GQUlMRUQpCisJCXJldHVybiBEQkdfU1RBVFVTX09LOworCisJaWYgKHJjICE9IERCR19TVEFUVVNfT0spCisJCXJldHVybiByYzsKKworCS8qIEZvcm1hdCBvdXRwdXQgKi8KKwlyYyA9IGZvcm1hdF9mZWF0dXJlKHBfaHdmbiwgZmVhdHVyZV9pZHgpOworCXJldHVybiByYzsKK30KKworaW50IHFlZF9kYmdfZ3JjKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsIHUzMiAqbnVtX2R1bXBlZF9ieXRlcykKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlKGNkZXYsIGJ1ZmZlciwgREJHX0ZFQVRVUkVfR1JDLCBudW1fZHVtcGVkX2J5dGVzKTsKK30KKworaW50IHFlZF9kYmdfZ3JjX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZV9zaXplKGNkZXYsIERCR19GRUFUVVJFX0dSQyk7Cit9CisKK2ludCBxZWRfZGJnX2lkbGVfY2hrKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsIHUzMiAqbnVtX2R1bXBlZF9ieXRlcykKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlKGNkZXYsIGJ1ZmZlciwgREJHX0ZFQVRVUkVfSURMRV9DSEssCisJCQkgICAgICAgbnVtX2R1bXBlZF9ieXRlcyk7Cit9CisKK2ludCBxZWRfZGJnX2lkbGVfY2hrX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZV9zaXplKGNkZXYsIERCR19GRUFUVVJFX0lETEVfQ0hLKTsKK30KKworaW50IHFlZF9kYmdfcmVnX2ZpZm8oc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwgdTMyICpudW1fZHVtcGVkX2J5dGVzKQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmUoY2RldiwgYnVmZmVyLCBEQkdfRkVBVFVSRV9SRUdfRklGTywKKwkJCSAgICAgICBudW1fZHVtcGVkX2J5dGVzKTsKK30KKworaW50IHFlZF9kYmdfcmVnX2ZpZm9fc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlX3NpemUoY2RldiwgREJHX0ZFQVRVUkVfUkVHX0ZJRk8pOworfQorCitpbnQgcWVkX2RiZ19pZ3VfZmlmbyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLCB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZShjZGV2LCBidWZmZXIsIERCR19GRUFUVVJFX0lHVV9GSUZPLAorCQkJICAgICAgIG51bV9kdW1wZWRfYnl0ZXMpOworfQorCitpbnQgcWVkX2RiZ19pZ3VfZmlmb19zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmVfc2l6ZShjZGV2LCBEQkdfRkVBVFVSRV9JR1VfRklGTyk7Cit9CisKK2ludCBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJCQl1MzIgKm51bV9kdW1wZWRfYnl0ZXMpCit7CisJcmV0dXJuIHFlZF9kYmdfZmVhdHVyZShjZGV2LCBidWZmZXIsIERCR19GRUFUVVJFX1BST1RFQ1RJT05fT1ZFUlJJREUsCisJCQkgICAgICAgbnVtX2R1bXBlZF9ieXRlcyk7Cit9CisKK2ludCBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlX3NpemUoY2RldiwgREJHX0ZFQVRVUkVfUFJPVEVDVElPTl9PVkVSUklERSk7Cit9CisKK2ludCBxZWRfZGJnX2Z3X2Fzc2VydHMoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJICAgICAgIHUzMiAqbnVtX2R1bXBlZF9ieXRlcykKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlKGNkZXYsIGJ1ZmZlciwgREJHX0ZFQVRVUkVfRldfQVNTRVJUUywKKwkJCSAgICAgICBudW1fZHVtcGVkX2J5dGVzKTsKK30KKworaW50IHFlZF9kYmdfZndfYXNzZXJ0c19zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXJldHVybiBxZWRfZGJnX2ZlYXR1cmVfc2l6ZShjZGV2LCBEQkdfRkVBVFVSRV9GV19BU1NFUlRTKTsKK30KKworaW50IHFlZF9kYmdfbWNwX3RyYWNlKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsCisJCSAgICAgIHUzMiAqbnVtX2R1bXBlZF9ieXRlcykKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlKGNkZXYsIGJ1ZmZlciwgREJHX0ZFQVRVUkVfTUNQX1RSQUNFLAorCQkJICAgICAgIG51bV9kdW1wZWRfYnl0ZXMpOworfQorCitpbnQgcWVkX2RiZ19tY3BfdHJhY2Vfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlyZXR1cm4gcWVkX2RiZ19mZWF0dXJlX3NpemUoY2RldiwgREJHX0ZFQVRVUkVfTUNQX1RSQUNFKTsKK30KKworLyogRGVmaW5lcyB0aGUgYW1vdW50IG9mIGJ5dGVzIGFsbG9jYXRlZCBmb3IgcmVjb3JkaW5nIHRoZSBsZW5ndGggb2YgZGVidWdmcworICogZmVhdHVyZSBidWZmZXIuCisgKi8KKyNkZWZpbmUgUkVHRFVNUF9IRUFERVJfU0laRQkJCXNpemVvZih1MzIpCisjZGVmaW5lIFJFR0RVTVBfSEVBREVSX0ZFQVRVUkVfU0hJRlQJCTI0CisjZGVmaW5lIFJFR0RVTVBfSEVBREVSX0VOR0lORV9TSElGVAkJMzEKKyNkZWZpbmUgUkVHRFVNUF9IRUFERVJfT01JVF9FTkdJTkVfU0hJRlQJMzAKK2VudW0gZGVidWdfcHJpbnRfZmVhdHVyZXMgeworCU9MRF9NT0RFID0gMCwKKwlJRExFX0NISyA9IDEsCisJR1JDX0RVTVAgPSAyLAorCU1DUF9UUkFDRSA9IDMsCisJUkVHX0ZJRk8gPSA0LAorCVBST1RFQ1RJT05fT1ZFUlJJREUgPSA1LAorCUlHVV9GSUZPID0gNiwKKwlQSFkgPSA3LAorCUZXX0FTU0VSVFMgPSA4LAorfTsKKworc3RhdGljIHUzMiBxZWRfY2FsY19yZWdkdW1wX2hlYWRlcihlbnVtIGRlYnVnX3ByaW50X2ZlYXR1cmVzIGZlYXR1cmUsCisJCQkJICAgaW50IGVuZ2luZSwgdTMyIGZlYXR1cmVfc2l6ZSwgdTggb21pdF9lbmdpbmUpCit7CisJLyogSW5zZXJ0IHRoZSBlbmdpbmUsIGZlYXR1cmUgYW5kIG1vZGUgaW5zaWRlIHRoZSBoZWFkZXIgYW5kIGNvbWJpbmUgaXQKKwkgKiB3aXRoIGZlYXR1cmUgc2l6ZS4KKwkgKi8KKwlyZXR1cm4gZmVhdHVyZV9zaXplIHwgKGZlYXR1cmUgPDwgUkVHRFVNUF9IRUFERVJfRkVBVFVSRV9TSElGVCkgfAorCSAgICAgICAob21pdF9lbmdpbmUgPDwgUkVHRFVNUF9IRUFERVJfT01JVF9FTkdJTkVfU0hJRlQpIHwKKwkgICAgICAgKGVuZ2luZSA8PCBSRUdEVU1QX0hFQURFUl9FTkdJTkVfU0hJRlQpOworfQorCitpbnQgcWVkX2RiZ19hbGxfZGF0YShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyKQoreworCXU4IGN1cl9lbmdpbmUsIG9taXRfZW5naW5lID0gMCwgb3JnX2VuZ2luZTsKKwl1MzIgb2Zmc2V0ID0gMCwgZmVhdHVyZV9zaXplOworCWludCByYzsKKworCWlmIChjZGV2LT5udW1faHdmbnMgPT0gMSkKKwkJb21pdF9lbmdpbmUgPSAxOworCisJb3JnX2VuZ2luZSA9IHFlZF9nZXRfZGVidWdfZW5naW5lKGNkZXYpOworCWZvciAoY3VyX2VuZ2luZSA9IDA7IGN1cl9lbmdpbmUgPCBjZGV2LT5udW1faHdmbnM7IGN1cl9lbmdpbmUrKykgeworCQkvKiBDb2xsZWN0IGlkbGVfY2hrcyBhbmQgZ3JjRHVtcCBmb3IgZWFjaCBodyBmdW5jdGlvbiAqLworCQlEUF9WRVJCT1NFKGNkZXYsIFFFRF9NU0dfREVCVUcsCisJCQkgICAib2J0YWluaW5nIGlkbGVfY2hrIGFuZCBncmNkdW1wIGZvciBjdXJyZW50IGVuZ2luZVxuIik7CisJCXFlZF9zZXRfZGVidWdfZW5naW5lKGNkZXYsIGN1cl9lbmdpbmUpOworCisJCS8qIEZpcnN0IGlkbGVfY2hrICovCisJCXJjID0gcWVkX2RiZ19pZGxlX2NoayhjZGV2LCAodTggKilidWZmZXIgKyBvZmZzZXQgKworCQkJCSAgICAgIFJFR0RVTVBfSEVBREVSX1NJWkUsICZmZWF0dXJlX3NpemUpOworCQlpZiAoIXJjKSB7CisJCQkqKHUzMiAqKSgodTggKilidWZmZXIgKyBvZmZzZXQpID0KKwkJCSAgICBxZWRfY2FsY19yZWdkdW1wX2hlYWRlcihJRExFX0NISywgY3VyX2VuZ2luZSwKKwkJCQkJCSAgICBmZWF0dXJlX3NpemUsIG9taXRfZW5naW5lKTsKKwkJCW9mZnNldCArPSAoZmVhdHVyZV9zaXplICsgUkVHRFVNUF9IRUFERVJfU0laRSk7CisJCX0gZWxzZSB7CisJCQlEUF9FUlIoY2RldiwgInFlZF9kYmdfaWRsZV9jaGsgZmFpbGVkLiByYyA9ICVkXG4iLCByYyk7CisJCX0KKworCQkvKiBTZWNvbmQgaWRsZV9jaGsgKi8KKwkJcmMgPSBxZWRfZGJnX2lkbGVfY2hrKGNkZXYsICh1OCAqKWJ1ZmZlciArIG9mZnNldCArCisJCQkJICAgICAgUkVHRFVNUF9IRUFERVJfU0laRSwgJmZlYXR1cmVfc2l6ZSk7CisJCWlmICghcmMpIHsKKwkJCSoodTMyICopKCh1OCAqKWJ1ZmZlciArIG9mZnNldCkgPQorCQkJICAgIHFlZF9jYWxjX3JlZ2R1bXBfaGVhZGVyKElETEVfQ0hLLCBjdXJfZW5naW5lLAorCQkJCQkJICAgIGZlYXR1cmVfc2l6ZSwgb21pdF9lbmdpbmUpOworCQkJb2Zmc2V0ICs9IChmZWF0dXJlX3NpemUgKyBSRUdEVU1QX0hFQURFUl9TSVpFKTsKKwkJfSBlbHNlIHsKKwkJCURQX0VSUihjZGV2LCAicWVkX2RiZ19pZGxlX2NoayBmYWlsZWQuIHJjID0gJWRcbiIsIHJjKTsKKwkJfQorCisJCS8qIHJlZ19maWZvIGR1bXAgKi8KKwkJcmMgPSBxZWRfZGJnX3JlZ19maWZvKGNkZXYsICh1OCAqKWJ1ZmZlciArIG9mZnNldCArCisJCQkJICAgICAgUkVHRFVNUF9IRUFERVJfU0laRSwgJmZlYXR1cmVfc2l6ZSk7CisJCWlmICghcmMpIHsKKwkJCSoodTMyICopKCh1OCAqKWJ1ZmZlciArIG9mZnNldCkgPQorCQkJICAgIHFlZF9jYWxjX3JlZ2R1bXBfaGVhZGVyKFJFR19GSUZPLCBjdXJfZW5naW5lLAorCQkJCQkJICAgIGZlYXR1cmVfc2l6ZSwgb21pdF9lbmdpbmUpOworCQkJb2Zmc2V0ICs9IChmZWF0dXJlX3NpemUgKyBSRUdEVU1QX0hFQURFUl9TSVpFKTsKKwkJfSBlbHNlIHsKKwkJCURQX0VSUihjZGV2LCAicWVkX2RiZ19yZWdfZmlmbyBmYWlsZWQuIHJjID0gJWRcbiIsIHJjKTsKKwkJfQorCisJCS8qIGlndV9maWZvIGR1bXAgKi8KKwkJcmMgPSBxZWRfZGJnX2lndV9maWZvKGNkZXYsICh1OCAqKWJ1ZmZlciArIG9mZnNldCArCisJCQkJICAgICAgUkVHRFVNUF9IRUFERVJfU0laRSwgJmZlYXR1cmVfc2l6ZSk7CisJCWlmICghcmMpIHsKKwkJCSoodTMyICopKCh1OCAqKWJ1ZmZlciArIG9mZnNldCkgPQorCQkJICAgIHFlZF9jYWxjX3JlZ2R1bXBfaGVhZGVyKElHVV9GSUZPLCBjdXJfZW5naW5lLAorCQkJCQkJICAgIGZlYXR1cmVfc2l6ZSwgb21pdF9lbmdpbmUpOworCQkJb2Zmc2V0ICs9IChmZWF0dXJlX3NpemUgKyBSRUdEVU1QX0hFQURFUl9TSVpFKTsKKwkJfSBlbHNlIHsKKwkJCURQX0VSUihjZGV2LCAicWVkX2RiZ19pZ3VfZmlmbyBmYWlsZWQuIHJjID0gJWQiLCByYyk7CisJCX0KKworCQkvKiBwcm90ZWN0aW9uX292ZXJyaWRlIGR1bXAgKi8KKwkJcmMgPSBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGUoY2RldiwgKHU4ICopYnVmZmVyICsgb2Zmc2V0ICsKKwkJCQkJCSBSRUdEVU1QX0hFQURFUl9TSVpFLAorCQkJCQkJICZmZWF0dXJlX3NpemUpOworCQlpZiAoIXJjKSB7CisJCQkqKHUzMiAqKSgodTggKilidWZmZXIgKyBvZmZzZXQpID0KKwkJCSAgICBxZWRfY2FsY19yZWdkdW1wX2hlYWRlcihQUk9URUNUSU9OX09WRVJSSURFLAorCQkJCQkJICAgIGN1cl9lbmdpbmUsCisJCQkJCQkgICAgZmVhdHVyZV9zaXplLCBvbWl0X2VuZ2luZSk7CisJCQlvZmZzZXQgKz0gKGZlYXR1cmVfc2l6ZSArIFJFR0RVTVBfSEVBREVSX1NJWkUpOworCQl9IGVsc2UgeworCQkJRFBfRVJSKGNkZXYsCisJCQkgICAgICAgInFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZSBmYWlsZWQuIHJjID0gJWRcbiIsCisJCQkgICAgICAgcmMpOworCQl9CisKKwkJLyogZndfYXNzZXJ0cyBkdW1wICovCisJCXJjID0gcWVkX2RiZ19md19hc3NlcnRzKGNkZXYsICh1OCAqKWJ1ZmZlciArIG9mZnNldCArCisJCQkJCVJFR0RVTVBfSEVBREVSX1NJWkUsICZmZWF0dXJlX3NpemUpOworCQlpZiAoIXJjKSB7CisJCQkqKHUzMiAqKSgodTggKilidWZmZXIgKyBvZmZzZXQpID0KKwkJCSAgICBxZWRfY2FsY19yZWdkdW1wX2hlYWRlcihGV19BU1NFUlRTLCBjdXJfZW5naW5lLAorCQkJCQkJICAgIGZlYXR1cmVfc2l6ZSwgb21pdF9lbmdpbmUpOworCQkJb2Zmc2V0ICs9IChmZWF0dXJlX3NpemUgKyBSRUdEVU1QX0hFQURFUl9TSVpFKTsKKwkJfSBlbHNlIHsKKwkJCURQX0VSUihjZGV2LCAicWVkX2RiZ19md19hc3NlcnRzIGZhaWxlZC4gcmMgPSAlZFxuIiwKKwkJCSAgICAgICByYyk7CisJCX0KKworCQkvKiBHUkMgZHVtcCAtIG11c3QgYmUgbGFzdCBiZWNhdXNlIHdoZW4gbWNwIHN0dWNrIGl0IHdpbGwKKwkJICogY2x1dHRlciBpZGxlX2NoaywgcmVnX2ZpZm8sIC4uLgorCQkgKi8KKwkJcmMgPSBxZWRfZGJnX2dyYyhjZGV2LCAodTggKilidWZmZXIgKyBvZmZzZXQgKworCQkJCSBSRUdEVU1QX0hFQURFUl9TSVpFLCAmZmVhdHVyZV9zaXplKTsKKwkJaWYgKCFyYykgeworCQkJKih1MzIgKikoKHU4ICopYnVmZmVyICsgb2Zmc2V0KSA9CisJCQkgICAgcWVkX2NhbGNfcmVnZHVtcF9oZWFkZXIoR1JDX0RVTVAsIGN1cl9lbmdpbmUsCisJCQkJCQkgICAgZmVhdHVyZV9zaXplLCBvbWl0X2VuZ2luZSk7CisJCQlvZmZzZXQgKz0gKGZlYXR1cmVfc2l6ZSArIFJFR0RVTVBfSEVBREVSX1NJWkUpOworCQl9IGVsc2UgeworCQkJRFBfRVJSKGNkZXYsICJxZWRfZGJnX2dyYyBmYWlsZWQuIHJjID0gJWQiLCByYyk7CisJCX0KKwl9CisKKwkvKiBtY3BfdHJhY2UgKi8KKwlyYyA9IHFlZF9kYmdfbWNwX3RyYWNlKGNkZXYsICh1OCAqKWJ1ZmZlciArIG9mZnNldCArCisJCQkgICAgICAgUkVHRFVNUF9IRUFERVJfU0laRSwgJmZlYXR1cmVfc2l6ZSk7CisJaWYgKCFyYykgeworCQkqKHUzMiAqKSgodTggKilidWZmZXIgKyBvZmZzZXQpID0KKwkJICAgIHFlZF9jYWxjX3JlZ2R1bXBfaGVhZGVyKE1DUF9UUkFDRSwgY3VyX2VuZ2luZSwKKwkJCQkJICAgIGZlYXR1cmVfc2l6ZSwgb21pdF9lbmdpbmUpOworCQlvZmZzZXQgKz0gKGZlYXR1cmVfc2l6ZSArIFJFR0RVTVBfSEVBREVSX1NJWkUpOworCX0gZWxzZSB7CisJCURQX0VSUihjZGV2LCAicWVkX2RiZ19tY3BfdHJhY2UgZmFpbGVkLiByYyA9ICVkXG4iLCByYyk7CisJfQorCisJcWVkX3NldF9kZWJ1Z19lbmdpbmUoY2Rldiwgb3JnX2VuZ2luZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHFlZF9kYmdfYWxsX2RhdGFfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwl1OCBjdXJfZW5naW5lLCBvcmdfZW5naW5lOworCXUzMiByZWdzX2xlbiA9IDA7CisKKwlvcmdfZW5naW5lID0gcWVkX2dldF9kZWJ1Z19lbmdpbmUoY2Rldik7CisJZm9yIChjdXJfZW5naW5lID0gMDsgY3VyX2VuZ2luZSA8IGNkZXYtPm51bV9od2ZuczsgY3VyX2VuZ2luZSsrKSB7CisJCS8qIEVuZ2luZSBzcGVjaWZpYyAqLworCQlEUF9WRVJCT1NFKGNkZXYsIFFFRF9NU0dfREVCVUcsCisJCQkgICAiY2FsY3VsYXRpbmcgaWRsZV9jaGsgYW5kIGdyY2R1bXAgcmVnaXN0ZXIgbGVuZ3RoIGZvciBjdXJyZW50IGVuZ2luZVxuIik7CisJCXFlZF9zZXRfZGVidWdfZW5naW5lKGNkZXYsIGN1cl9lbmdpbmUpOworCQlyZWdzX2xlbiArPSBSRUdEVU1QX0hFQURFUl9TSVpFICsgcWVkX2RiZ19pZGxlX2Noa19zaXplKGNkZXYpICsKKwkJCSAgICBSRUdEVU1QX0hFQURFUl9TSVpFICsgcWVkX2RiZ19pZGxlX2Noa19zaXplKGNkZXYpICsKKwkJCSAgICBSRUdEVU1QX0hFQURFUl9TSVpFICsgcWVkX2RiZ19ncmNfc2l6ZShjZGV2KSArCisJCQkgICAgUkVHRFVNUF9IRUFERVJfU0laRSArIHFlZF9kYmdfcmVnX2ZpZm9fc2l6ZShjZGV2KSArCisJCQkgICAgUkVHRFVNUF9IRUFERVJfU0laRSArIHFlZF9kYmdfaWd1X2ZpZm9fc2l6ZShjZGV2KSArCisJCQkgICAgUkVHRFVNUF9IRUFERVJfU0laRSArCisJCQkgICAgcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX3NpemUoY2RldikgKworCQkJICAgIFJFR0RVTVBfSEVBREVSX1NJWkUgKyBxZWRfZGJnX2Z3X2Fzc2VydHNfc2l6ZShjZGV2KTsKKwl9CisKKwkvKiBFbmdpbmUgY29tbW9uICovCisJcmVnc19sZW4gKz0gUkVHRFVNUF9IRUFERVJfU0laRSArIHFlZF9kYmdfbWNwX3RyYWNlX3NpemUoY2Rldik7CisJcWVkX3NldF9kZWJ1Z19lbmdpbmUoY2Rldiwgb3JnX2VuZ2luZSk7CisKKwlyZXR1cm4gcmVnc19sZW47Cit9CisKK2ludCBxZWRfZGJnX2ZlYXR1cmUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJICAgIGVudW0gcWVkX2RiZ19mZWF0dXJlcyBmZWF0dXJlLCB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpCit7CisJc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4gPQorCQkmY2Rldi0+aHdmbnNbY2Rldi0+ZGJnX3BhcmFtcy5lbmdpbmVfZm9yX2RlYnVnXTsKKwlzdHJ1Y3QgcWVkX2RiZ19mZWF0dXJlICpxZWRfZmVhdHVyZSA9CisJCSZjZGV2LT5kYmdfcGFyYW1zLmZlYXR1cmVzW2ZlYXR1cmVdOworCWVudW0gZGJnX3N0YXR1cyBkYmdfcmM7CisJc3RydWN0IHFlZF9wdHQgKnBfcHR0OworCWludCByYyA9IDA7CisKKwkvKiBBY3F1aXJlIHB0dCAqLworCXBfcHR0ID0gcWVkX3B0dF9hY3F1aXJlKHBfaHdmbik7CisJaWYgKCFwX3B0dCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBHZXQgZHVtcCAqLworCWRiZ19yYyA9IHFlZF9kYmdfZHVtcChwX2h3Zm4sIHBfcHR0LCBmZWF0dXJlKTsKKwlpZiAoZGJnX3JjICE9IERCR19TVEFUVVNfT0spIHsKKwkJRFBfVkVSQk9TRShjZGV2LCBRRURfTVNHX0RFQlVHLCAiJXNcbiIsCisJCQkgICBxZWRfZGJnX2dldF9zdGF0dXNfc3RyKGRiZ19yYykpOworCQkqbnVtX2R1bXBlZF9ieXRlcyA9IDA7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJRFBfVkVSQk9TRShjZGV2LCBRRURfTVNHX0RFQlVHLAorCQkgICAiY29weWluZyBkZWJ1Z2ZzIGZlYXR1cmUgdG8gZXh0ZXJuYWwgYnVmZmVyXG4iKTsKKwltZW1jcHkoYnVmZmVyLCBxZWRfZmVhdHVyZS0+ZHVtcF9idWYsIHFlZF9mZWF0dXJlLT5idWZfc2l6ZSk7CisJKm51bV9kdW1wZWRfYnl0ZXMgPSBjZGV2LT5kYmdfcGFyYW1zLmZlYXR1cmVzW2ZlYXR1cmVdLmR1bXBlZF9kd29yZHMgKgorCQkJICAgIDQ7CisKK291dDoKKwlxZWRfcHR0X3JlbGVhc2UocF9od2ZuLCBwX3B0dCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgcWVkX2RiZ19mZWF0dXJlX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYsIGVudW0gcWVkX2RiZ19mZWF0dXJlcyBmZWF0dXJlKQoreworCXN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuID0KKwkJJmNkZXYtPmh3Zm5zW2NkZXYtPmRiZ19wYXJhbXMuZW5naW5lX2Zvcl9kZWJ1Z107CisJc3RydWN0IHFlZF9wdHQgKnBfcHR0ID0gcWVkX3B0dF9hY3F1aXJlKHBfaHdmbik7CisJc3RydWN0IHFlZF9kYmdfZmVhdHVyZSAqcWVkX2ZlYXR1cmUgPQorCQkmY2Rldi0+ZGJnX3BhcmFtcy5mZWF0dXJlc1tmZWF0dXJlXTsKKwl1MzIgYnVmX3NpemVfZHdvcmRzOworCWVudW0gZGJnX3N0YXR1cyByYzsKKworCWlmICghcF9wdHQpCisJCXJldHVybiAtRUlOVkFMOworCisJcmMgPSBxZWRfZmVhdHVyZXNfbG9va3VwW2ZlYXR1cmVdLmdldF9zaXplKHBfaHdmbiwgcF9wdHQsCisJCQkJCQkgICAmYnVmX3NpemVfZHdvcmRzKTsKKwlpZiAocmMgIT0gREJHX1NUQVRVU19PSykKKwkJYnVmX3NpemVfZHdvcmRzID0gMDsKKworCXFlZF9wdHRfcmVsZWFzZShwX2h3Zm4sIHBfcHR0KTsKKwlxZWRfZmVhdHVyZS0+YnVmX3NpemUgPSBidWZfc2l6ZV9kd29yZHMgKiBzaXplb2YodTMyKTsKKwlyZXR1cm4gcWVkX2ZlYXR1cmUtPmJ1Zl9zaXplOworfQorCit1OCBxZWRfZ2V0X2RlYnVnX2VuZ2luZShzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwlyZXR1cm4gY2Rldi0+ZGJnX3BhcmFtcy5lbmdpbmVfZm9yX2RlYnVnOworfQorCit2b2lkIHFlZF9zZXRfZGVidWdfZW5naW5lKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBpbnQgZW5naW5lX251bWJlcikKK3sKKwlEUF9WRVJCT1NFKGNkZXYsIFFFRF9NU0dfREVCVUcsICJzZXQgZGVidWcgZW5naW5lIHRvICVkXG4iLAorCQkgICBlbmdpbmVfbnVtYmVyKTsKKwljZGV2LT5kYmdfcGFyYW1zLmVuZ2luZV9mb3JfZGVidWcgPSBlbmdpbmVfbnVtYmVyOworfQorCit2b2lkIHFlZF9kYmdfcGZfaW5pdChzdHJ1Y3QgcWVkX2RldiAqY2RldikKK3sKKwljb25zdCB1OCAqZGJnX3ZhbHVlczsKKworCS8qIERlYnVnIHZhbHVlcyBhcmUgYWZ0ZXIgaW5pdCB2YWx1ZXMuCisJICogVGhlIG9mZnNldCBpcyB0aGUgZmlyc3QgZHdvcmQgb2YgdGhlIGZpbGUuCisJICovCisJZGJnX3ZhbHVlcyA9IGNkZXYtPmZpcm13YXJlLT5kYXRhICsgKih1MzIgKiljZGV2LT5maXJtd2FyZS0+ZGF0YTsKKwlxZWRfZGJnX3NldF9iaW5fcHRyKCh1OCAqKWRiZ192YWx1ZXMpOworCXFlZF9kYmdfdXNlcl9zZXRfYmluX3B0cigodTggKilkYmdfdmFsdWVzKTsKK30KKwordm9pZCBxZWRfZGJnX3BmX2V4aXQoc3RydWN0IHFlZF9kZXYgKmNkZXYpCit7CisJc3RydWN0IHFlZF9kYmdfZmVhdHVyZSAqZmVhdHVyZSA9IE5VTEw7CisJZW51bSBxZWRfZGJnX2ZlYXR1cmVzIGZlYXR1cmVfaWR4OworCisJLyogRGVidWcgZmVhdHVyZXMnIGJ1ZmZlcnMgbWF5IGJlIGFsbG9jYXRlZCBpZiBkZWJ1ZyBmZWF0dXJlIHdhcyB1c2VkCisJICogYnV0IGR1bXAgd2Fzbid0IGNhbGxlZC4KKwkgKi8KKwlmb3IgKGZlYXR1cmVfaWR4ID0gMDsgZmVhdHVyZV9pZHggPCBEQkdfRkVBVFVSRV9OVU07IGZlYXR1cmVfaWR4KyspIHsKKwkJZmVhdHVyZSA9ICZjZGV2LT5kYmdfcGFyYW1zLmZlYXR1cmVzW2ZlYXR1cmVfaWR4XTsKKwkJaWYgKGZlYXR1cmUtPmR1bXBfYnVmKSB7CisJCQl2ZnJlZShmZWF0dXJlLT5kdW1wX2J1Zik7CisJCQlmZWF0dXJlLT5kdW1wX2J1ZiA9IE5VTEw7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODcyZDczCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGVidWcuaApAQCAtMCwwICsxLDU0IEBACisvKiBRTG9naWMgcWVkIE5JQyBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCisgKiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpZm5kZWYgX1FFRF9ERUJVR0ZTX0gKKyNkZWZpbmUgX1FFRF9ERUJVR0ZTX0gKKworZW51bSBxZWRfZGJnX2ZlYXR1cmVzIHsKKwlEQkdfRkVBVFVSRV9HUkMsCisJREJHX0ZFQVRVUkVfSURMRV9DSEssCisJREJHX0ZFQVRVUkVfTUNQX1RSQUNFLAorCURCR19GRUFUVVJFX1JFR19GSUZPLAorCURCR19GRUFUVVJFX0lHVV9GSUZPLAorCURCR19GRUFUVVJFX1BST1RFQ1RJT05fT1ZFUlJJREUsCisJREJHX0ZFQVRVUkVfRldfQVNTRVJUUywKKwlEQkdfRkVBVFVSRV9OVU0KK307CisKK2ludCBxZWRfZGJnX2dyYyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLCB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpOworaW50IHFlZF9kYmdfZ3JjX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworaW50IHFlZF9kYmdfaWRsZV9jaGsoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJICAgICB1MzIgKm51bV9kdW1wZWRfYnl0ZXMpOworaW50IHFlZF9kYmdfaWRsZV9jaGtfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CitpbnQgcWVkX2RiZ19yZWdfZmlmbyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLAorCQkgICAgIHUzMiAqbnVtX2R1bXBlZF9ieXRlcyk7CitpbnQgcWVkX2RiZ19yZWdfZmlmb19zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKK2ludCBxZWRfZGJnX2lndV9maWZvKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsCisJCSAgICAgdTMyICpudW1fZHVtcGVkX2J5dGVzKTsKK2ludCBxZWRfZGJnX2lndV9maWZvX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworaW50IHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLAorCQkJCXUzMiAqbnVtX2R1bXBlZF9ieXRlcyk7CitpbnQgcWVkX2RiZ19wcm90ZWN0aW9uX292ZXJyaWRlX3NpemUoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworaW50IHFlZF9kYmdfZndfYXNzZXJ0cyhzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgdm9pZCAqYnVmZmVyLAorCQkgICAgICAgdTMyICpudW1fZHVtcGVkX2J5dGVzKTsKK2ludCBxZWRfZGJnX2Z3X2Fzc2VydHNfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CitpbnQgcWVkX2RiZ19tY3BfdHJhY2Uoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlciwKKwkJICAgICAgdTMyICpudW1fZHVtcGVkX2J5dGVzKTsKK2ludCBxZWRfZGJnX21jcF90cmFjZV9zaXplKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKK2ludCBxZWRfZGJnX2FsbF9kYXRhKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIpOworaW50IHFlZF9kYmdfYWxsX2RhdGFfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7Cit1OCBxZWRfZ2V0X2RlYnVnX2VuZ2luZShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7Cit2b2lkIHFlZF9zZXRfZGVidWdfZW5naW5lKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBpbnQgZW5naW5lX251bWJlcik7CitpbnQgcWVkX2RiZ19mZWF0dXJlKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCB2b2lkICpidWZmZXIsCisJCSAgICBlbnVtIHFlZF9kYmdfZmVhdHVyZXMgZmVhdHVyZSwgdTMyICpudW1fZHVtcGVkX2J5dGVzKTsKK2ludCBxZWRfZGJnX2ZlYXR1cmVfc2l6ZShzdHJ1Y3QgcWVkX2RldiAqY2RldiwgZW51bSBxZWRfZGJnX2ZlYXR1cmVzIGZlYXR1cmUpOworCit2b2lkIHFlZF9kYmdfcGZfaW5pdChzdHJ1Y3QgcWVkX2RldiAqY2Rldik7Cit2b2lkIHFlZF9kYmdfcGZfZXhpdChzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZXYuYwppbmRleCAwZTRmNGE5Li43NTRmNmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZXYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZXYuYwpAQCAtMjksMTQgKzI5LDE4IEBACiAjaW5jbHVkZSAicWVkX2h3LmgiCiAjaW5jbHVkZSAicWVkX2luaXRfb3BzLmgiCiAjaW5jbHVkZSAicWVkX2ludC5oIgorI2luY2x1ZGUgInFlZF9sbDIuaCIKICNpbmNsdWRlICJxZWRfbWNwLmgiCiAjaW5jbHVkZSAicWVkX3JlZ19hZGRyLmgiCiAjaW5jbHVkZSAicWVkX3NwLmgiCiAjaW5jbHVkZSAicWVkX3NyaW92LmgiCiAjaW5jbHVkZSAicWVkX3ZmLmgiCisjaW5jbHVkZSAicWVkX3JvY2UuaCIKIAotc3RhdGljIHNwaW5sb2NrX3QgcW1fbG9jazsKLXN0YXRpYyBib29sIHFtX2xvY2tfaW5pdCA9IGZhbHNlOworc3RhdGljIERFRklORV9TUElOTE9DSyhxbV9sb2NrKTsKKworI2RlZmluZSBRRURfTUlOX0RQSVMgICAgICAgICAgICAoNCkKKyNkZWZpbmUgUUVEX01JTl9QV01fUkVHSU9OICAgICAgKFFFRF9XSURfU0laRSAqIFFFRF9NSU5fRFBJUykKIAogLyogQVBJIGNvbW1vbiB0byBhbGwgcHJvdG9jb2xzICovCiBlbnVtIEJBUl9JRCB7CkBAIC00NCw4ICs0OCw3IEBACiAJQkFSX0lEXzEgICAgICAgIC8qIFVzZWQgZm9yIGRvb3JiZWxscyAqLwogfTsKIAotc3RhdGljIHUzMiBxZWRfaHdfYmFyX3NpemUoc3RydWN0IHFlZF9od2ZuCSpwX2h3Zm4sCi0JCQkgICBlbnVtIEJBUl9JRAkJYmFyX2lkKQorc3RhdGljIHUzMiBxZWRfaHdfYmFyX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIGVudW0gQkFSX0lEIGJhcl9pZCkKIHsKIAl1MzIgYmFyX3JlZyA9IChiYXJfaWQgPT0gQkFSX0lEXzAgPwogCQkgICAgICAgUEdMVUVfQl9SRUdfUEZfQkFSMF9TSVpFIDogUEdMVUVfQl9SRUdfUEZfQkFSMV9TSVpFKTsKQEAgLTcwLDggKzczLDcgQEAKIAl9CiB9CiAKLXZvaWQgcWVkX2luaXRfZHAoc3RydWN0IHFlZF9kZXYgKmNkZXYsCi0JCSB1MzIgZHBfbW9kdWxlLCB1OCBkcF9sZXZlbCkKK3ZvaWQgcWVkX2luaXRfZHAoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHUzMiBkcF9tb2R1bGUsIHU4IGRwX2xldmVsKQogewogCXUzMiBpOwogCkBAIC0xNTAsNiArMTUyLDkgQEAKIAkJcWVkX2VxX2ZyZWUocF9od2ZuLCBwX2h3Zm4tPnBfZXEpOwogCQlxZWRfY29uc3FfZnJlZShwX2h3Zm4sIHBfaHdmbi0+cF9jb25zcSk7CiAJCXFlZF9pbnRfZnJlZShwX2h3Zm4pOworI2lmZGVmIENPTkZJR19RRURfTEwyCisJCXFlZF9sbDJfZnJlZShwX2h3Zm4sIHBfaHdmbi0+cF9sbDJfaW5mbyk7CisjZW5kaWYKIAkJcWVkX2lvdl9mcmVlKHBfaHdmbik7CiAJCXFlZF9kbWFlX2luZm9fZnJlZShwX2h3Zm4pOwogCQlxZWRfZGNieF9pbmZvX2ZyZWUocF9od2ZuLCBwX2h3Zm4tPnBfZGNieF9pbmZvKTsKQEAgLTM0Myw3ICszNDgsNiBAQAogCXJldHVybiAwOwogCiBhbGxvY19lcnI6Ci0JRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFFNIHBhcmFtc1xuIik7CiAJcWVkX3FtX2luZm9fZnJlZShwX2h3Zm4pOwogCXJldHVybiAtRU5PTUVNOwogfQpAQCAtNDA3LDYgKzQxMSw5IEBACiAKIGludCBxZWRfcmVzY19hbGxvYyhzdHJ1Y3QgcWVkX2RldiAqY2RldikKIHsKKyNpZmRlZiBDT05GSUdfUUVEX0xMMgorCXN0cnVjdCBxZWRfbGwyX2luZm8gKnBfbGwyX2luZm87CisjZW5kaWYKIAlzdHJ1Y3QgcWVkX2NvbnNxICpwX2NvbnNxOwogCXN0cnVjdCBxZWRfZXEgKnBfZXE7CiAJaW50IGksIHJjID0gMDsKQEAgLTQyNywxOCArNDM0LDEyIEBACiAJCQkJICAgICBSRVNDX05VTShwX2h3Zm4sIFFFRF9MMl9RVUVVRSk7CiAKIAkJcF9od2ZuLT5wX3R4X2NpZHMgPSBremFsbG9jKHR4X3NpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIXBfaHdmbi0+cF90eF9jaWRzKSB7Ci0JCQlEUF9OT1RJQ0UocF9od2ZuLAotCQkJCSAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFR4IENpZHNcbiIpOworCQlpZiAoIXBfaHdmbi0+cF90eF9jaWRzKQogCQkJZ290byBhbGxvY19ub19tZW07Ci0JCX0KIAogCQlwX2h3Zm4tPnBfcnhfY2lkcyA9IGt6YWxsb2Mocnhfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcF9od2ZuLT5wX3J4X2NpZHMpIHsKLQkJCURQX05PVElDRShwX2h3Zm4sCi0JCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgUnggQ2lkc1xuIik7CisJCWlmICghcF9od2ZuLT5wX3J4X2NpZHMpCiAJCQlnb3RvIGFsbG9jX25vX21lbTsKLQkJfQogCX0KIAogCWZvcl9lYWNoX2h3Zm4oY2RldiwgaSkgewpAQCAtNTIzLDI5ICs1MjQsMjkgQEAKIAkJCWdvdG8gYWxsb2Nfbm9fbWVtOwogCQlwX2h3Zm4tPnBfY29uc3EgPSBwX2NvbnNxOwogCisjaWZkZWYgQ09ORklHX1FFRF9MTDIKKwkJaWYgKHBfaHdmbi0+dXNpbmdfbGwyKSB7CisJCQlwX2xsMl9pbmZvID0gcWVkX2xsMl9hbGxvYyhwX2h3Zm4pOworCQkJaWYgKCFwX2xsMl9pbmZvKQorCQkJCWdvdG8gYWxsb2Nfbm9fbWVtOworCQkJcF9od2ZuLT5wX2xsMl9pbmZvID0gcF9sbDJfaW5mbzsKKwkJfQorI2VuZGlmCisKIAkJLyogRE1BIGluZm8gaW5pdGlhbGl6YXRpb24gKi8KIAkJcmMgPSBxZWRfZG1hZV9pbmZvX2FsbG9jKHBfaHdmbik7Ci0JCWlmIChyYykgewotCQkJRFBfTk9USUNFKHBfaHdmbiwKLQkJCQkgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkbWFlX2luZm8gc3RydWN0dXJlXG4iKTsKKwkJaWYgKHJjKQogCQkJZ290byBhbGxvY19lcnI7Ci0JCX0KIAogCQkvKiBEQ0JYIGluaXRpYWxpemF0aW9uICovCiAJCXJjID0gcWVkX2RjYnhfaW5mb19hbGxvYyhwX2h3Zm4pOwotCQlpZiAocmMpIHsKLQkJCURQX05PVElDRShwX2h3Zm4sCi0JCQkJICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZGNieCBzdHJ1Y3R1cmVcbiIpOworCQlpZiAocmMpCiAJCQlnb3RvIGFsbG9jX2VycjsKLQkJfQogCX0KIAogCWNkZXYtPnJlc2V0X3N0YXRzID0ga3phbGxvYyhzaXplb2YoKmNkZXYtPnJlc2V0X3N0YXRzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjZGV2LT5yZXNldF9zdGF0cykgewotCQlEUF9OT1RJQ0UoY2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSByZXNldCBzdGF0aXN0aWNzXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGFsbG9jX2VycjsKLQl9CisJaWYgKCFjZGV2LT5yZXNldF9zdGF0cykKKwkJZ290byBhbGxvY19ub19tZW07CiAKIAlyZXR1cm4gMDsKIApAQCAtNTgwLDYgKzU4MSwxMCBAQAogCQlxZWRfaW50X3NldHVwKHBfaHdmbiwgcF9od2ZuLT5wX21haW5fcHR0KTsKIAogCQlxZWRfaW92X3NldHVwKHBfaHdmbiwgcF9od2ZuLT5wX21haW5fcHR0KTsKKyNpZmRlZiBDT05GSUdfUUVEX0xMMgorCQlpZiAocF9od2ZuLT51c2luZ19sbDIpCisJCQlxZWRfbGwyX3NldHVwKHBfaHdmbiwgcF9od2ZuLT5wX2xsMl9pbmZvKTsKKyNlbmRpZgogCX0KIH0KIApAQCAtNjA1LDkgKzYxMCw4IEBACiAKIAkvKiBNYWtlIHN1cmUgbm90aWZpY2F0aW9uIGlzIG5vdCBzZXQgYmVmb3JlIGluaXRpYXRpbmcgZmluYWwgY2xlYW51cCAqLwogCWlmIChSRUdfUkQocF9od2ZuLCBhZGRyKSkgewotCQlEUF9OT1RJQ0UoCi0JCQlwX2h3Zm4sCi0JCQkiVW5leHBlY3RlZDsgRm91bmQgZmluYWwgY2xlYW51cCBub3RpZmljYXRpb24gYmVmb3JlIGluaXRpYXRpbmcgZmluYWwgY2xlYW51cFxuIik7CisJCURQX05PVElDRShwX2h3Zm4sCisJCQkgICJVbmV4cGVjdGVkOyBGb3VuZCBmaW5hbCBjbGVhbnVwIG5vdGlmaWNhdGlvbiBiZWZvcmUgaW5pdGlhdGluZyBmaW5hbCBjbGVhbnVwXG4iKTsKIAkJUkVHX1dSKHBfaHdmbiwgYWRkciwgMCk7CiAJfQogCkBAIC03MDEsMTcgKzcwNSwxNCBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQlxZWRfaW5pdF9jYXVfc2JfZW50cnkocF9od2ZuLCAmc2JfZW50cnksCi0JCQkJCSAgICAgIHBfYmxvY2stPmZ1bmN0aW9uX2lkLAotCQkJCQkgICAgICAwLCAwKTsKLQkJCVNUT1JFX1JUX1JFR19BR0cocF9od2ZuLCBvZmZzZXQgKyBzYl9pZCAqIDIsCi0JCQkJCSBzYl9lbnRyeSk7CisJCQkJCSAgICAgIHBfYmxvY2stPmZ1bmN0aW9uX2lkLCAwLCAwKTsKKwkJCVNUT1JFX1JUX1JFR19BR0cocF9od2ZuLCBvZmZzZXQgKyBzYl9pZCAqIDIsIHNiX2VudHJ5KTsKIAkJfQogCX0KIH0KIAogc3RhdGljIGludCBxZWRfaHdfaW5pdF9jb21tb24oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCi0JCQkgICAgICBpbnQgaHdfbW9kZSkKKwkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgaW50IGh3X21vZGUpCiB7CiAJc3RydWN0IHFlZF9xbV9pbmZvICpxbV9pbmZvID0gJnBfaHdmbi0+cW1faW5mbzsKIAlzdHJ1Y3QgcWVkX3FtX2NvbW1vbl9ydF9pbml0X3BhcmFtcyBwYXJhbXM7CkBAIC03NTksNyArNzYwLDcgQEAKIAlxZWRfcG9ydF91bnByZXRlbmQocF9od2ZuLCBwX3B0dCk7CiAKIAlyYyA9IHFlZF9pbml0X3J1bihwX2h3Zm4sIHBfcHR0LCBQSEFTRV9FTkdJTkUsIEFOWV9QSEFTRV9JRCwgaHdfbW9kZSk7Ci0JaWYgKHJjICE9IDApCisJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKIAlxZWRfd3IocF9od2ZuLCBwX3B0dCwgUFNXUlEyX1JFR19MMlBfVkFMSURBVEVfVkZJRCwgMCk7CkBAIC03ODAsNiArNzgxLDkgQEAKIAkJY29uY3JldGVfZmlkID0gcWVkX3ZmaWRfdG9fY29uY3JldGUocF9od2ZuLCB2Zl9pZCk7CiAJCXFlZF9maWRfcHJldGVuZChwX2h3Zm4sIHBfcHR0LCAodTE2KSBjb25jcmV0ZV9maWQpOwogCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgQ0NGQ19SRUdfU1RST05HX0VOQUJMRV9WRiwgMHgxKTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIENDRkNfUkVHX1dFQUtfRU5BQkxFX1ZGLCAweDApOworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwgVENGQ19SRUdfU1RST05HX0VOQUJMRV9WRiwgMHgxKTsKKwkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIFRDRkNfUkVHX1dFQUtfRU5BQkxFX1ZGLCAweDApOwogCX0KIAkvKiBwcmV0ZW5kIHRvIG9yaWdpbmFsIFBGICovCiAJcWVkX2ZpZF9wcmV0ZW5kKHBfaHdmbiwgcF9wdHQsIHBfaHdmbi0+cmVsX3BmX2lkKTsKQEAgLTc4NywzOCArNzkxLDE0MSBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBxZWRfaHdfaW5pdF9wb3J0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKLQkJCSAgICBpbnQgaHdfbW9kZSkKK3N0YXRpYyBpbnQKK3FlZF9od19pbml0X2RwaV9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyIHB3bV9yZWdpb25fc2l6ZSwgdTMyIG5fY3B1cykKIHsKKwl1MzIgZHBpX3BhZ2Vfc2l6ZV8xLCBkcGlfcGFnZV9zaXplXzIsIGRwaV9wYWdlX3NpemU7CisJdTMyIGRwaV9iaXRfc2hpZnQsIGRwaV9jb3VudDsKKwl1MzIgbWluX2RwaXM7CisKKwkvKiBDYWxjdWxhdGUgRFBJIHNpemUgKi8KKwlkcGlfcGFnZV9zaXplXzEgPSBRRURfV0lEX1NJWkUgKiBuX2NwdXM7CisJZHBpX3BhZ2Vfc2l6ZV8yID0gbWF4X3QodTMyLCBRRURfV0lEX1NJWkUsIFBBR0VfU0laRSk7CisJZHBpX3BhZ2Vfc2l6ZSA9IG1heF90KHUzMiwgZHBpX3BhZ2Vfc2l6ZV8xLCBkcGlfcGFnZV9zaXplXzIpOworCWRwaV9wYWdlX3NpemUgPSByb3VuZHVwX3Bvd19vZl90d28oZHBpX3BhZ2Vfc2l6ZSk7CisJZHBpX2JpdF9zaGlmdCA9IGlsb2cyKGRwaV9wYWdlX3NpemUgLyA0MDk2KTsKKworCWRwaV9jb3VudCA9IHB3bV9yZWdpb25fc2l6ZSAvIGRwaV9wYWdlX3NpemU7CisKKwltaW5fZHBpcyA9IHBfaHdmbi0+cGZfcGFyYW1zLnJkbWFfcGZfcGFyYW1zLm1pbl9kcGlzOworCW1pbl9kcGlzID0gbWF4X3QodTMyLCBRRURfTUlOX0RQSVMsIG1pbl9kcGlzKTsKKworCXBfaHdmbi0+ZHBpX3NpemUgPSBkcGlfcGFnZV9zaXplOworCXBfaHdmbi0+ZHBpX2NvdW50ID0gZHBpX2NvdW50OworCisJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIERPUlFfUkVHX1BGX0RQSV9CSVRfU0hJRlQsIGRwaV9iaXRfc2hpZnQpOworCisJaWYgKGRwaV9jb3VudCA8IG1pbl9kcGlzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitlbnVtIFFFRF9ST0NFX0VEUE1fTU9ERSB7CisJUUVEX1JPQ0VfRURQTV9NT0RFX0VOQUJMRSA9IDAsCisJUUVEX1JPQ0VfRURQTV9NT0RFX0ZPUkNFX09OID0gMSwKKwlRRURfUk9DRV9FRFBNX01PREVfRElTQUJMRSA9IDIsCit9OworCitzdGF0aWMgaW50CitxZWRfaHdfaW5pdF9wZl9kb29yYmVsbF9iYXIoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3sKKwl1MzIgcHdtX3JlZ3NpemUsIG5vcm1fcmVnc2l6ZTsKKwl1MzIgbm9uX3B3bV9jb25uLCBtaW5fYWRkcl9yZWcxOworCXUzMiBkYl9iYXJfc2l6ZSwgbl9jcHVzOworCXUzMiByb2NlX2VkcG1fbW9kZTsKKwl1MzIgcGZfZGVtc19zaGlmdDsKIAlpbnQgcmMgPSAwOworCXU4IGNvbmQ7CiAKLQlyYyA9IHFlZF9pbml0X3J1bihwX2h3Zm4sIHBfcHR0LCBQSEFTRV9QT1JULCBwX2h3Zm4tPnBvcnRfaWQsIGh3X21vZGUpOwotCWlmIChyYyAhPSAwKQotCQlyZXR1cm4gcmM7CisJZGJfYmFyX3NpemUgPSBxZWRfaHdfYmFyX3NpemUocF9od2ZuLCBCQVJfSURfMSk7CisJaWYgKHBfaHdmbi0+Y2Rldi0+bnVtX2h3Zm5zID4gMSkKKwkJZGJfYmFyX3NpemUgLz0gMjsKIAotCWlmIChod19tb2RlICYgKDEgPDwgTU9ERV9NRl9TSSkpIHsKLQkJdTggcGZfaWQgPSAwOworCS8qIENhbGN1bGF0ZSBkb29yYmVsbCByZWdpb25zICovCisJbm9uX3B3bV9jb25uID0gcWVkX2N4dF9nZXRfcHJvdG9fY2lkX3N0YXJ0KHBfaHdmbiwgUFJPVE9DT0xJRF9DT1JFKSArCisJCSAgICAgICBxZWRfY3h0X2dldF9wcm90b19jaWRfY291bnQocF9od2ZuLCBQUk9UT0NPTElEX0NPUkUsCisJCQkJCQkgICBOVUxMKSArCisJCSAgICAgICBxZWRfY3h0X2dldF9wcm90b19jaWRfY291bnQocF9od2ZuLCBQUk9UT0NPTElEX0VUSCwKKwkJCQkJCSAgIE5VTEwpOworCW5vcm1fcmVnc2l6ZSA9IHJvdW5kdXAoUUVEX1BGX0RFTVNfU0laRSAqIG5vbl9wd21fY29ubiwgNDA5Nik7CisJbWluX2FkZHJfcmVnMSA9IG5vcm1fcmVnc2l6ZSAvIDQwOTY7CisJcHdtX3JlZ3NpemUgPSBkYl9iYXJfc2l6ZSAtIG5vcm1fcmVnc2l6ZTsKIAotCQlpZiAoIXFlZF9od19pbml0X2ZpcnN0X2V0aChwX2h3Zm4sIHBfcHR0LCAmcGZfaWQpKSB7Ci0JCQlEUF9WRVJCT1NFKHBfaHdmbiwgTkVUSUZfTVNHX0lGVVAsCi0JCQkJICAgIlBGWyUwOHhdIGlzIGZpcnN0IGV0aCBvbiBlbmdpbmVcbiIsIHBmX2lkKTsKLQotCQkJLyogV2Ugc2hvdWxkIGhhdmUgY29uZmlndXJlZCBCSVQgZm9yIHBwZmlkLCBpLmUuLCB0aGUKLQkJCSAqIHJlbGF0aXZlIGZ1bmN0aW9uIG51bWJlciBpbiB0aGUgcG9ydC4gQnV0IHRoZXJlJ3MgYQotCQkJICogYnVnIGluIExMSCBpbiBCQiB3aGVyZSB0aGUgcHBmaWQgaXMgYWN0dWFsbHkgZW5naW5lCi0JCQkgKiBiYXNlZCwgc28gd2UgbmVlZCB0byB0YWtlIHRoaXMgaW50byBhY2NvdW50LgotCQkJICovCi0JCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKLQkJCSAgICAgICBOSUdfUkVHX0xMSF9UQUdNQUNfREVGX1BGX1ZFQ1RPUiwgMSA8PCBwZl9pZCk7Ci0JCX0KLQotCQkvKiBUYWtlIHRoZSBwcm90b2NvbC1iYXNlZCBoaXQgdmVjdG9yIGlmIHRoZXJlIGlzIGEgaGl0LAotCQkgKiBvdGhlcndpc2UgdGFrZSB0aGUgb3RoZXIgdmVjdG9yLgotCQkgKi8KLQkJcWVkX3dyKHBfaHdmbiwgcF9wdHQsIE5JR19SRUdfTExIX0NMU19UWVBFX0RVQUxNT0RFLCAweDIpOworCS8qIENoZWNrIHRoYXQgdGhlIG5vcm1hbCBhbmQgUFdNIHNpemVzIGFyZSB2YWxpZCAqLworCWlmIChkYl9iYXJfc2l6ZSA8IG5vcm1fcmVnc2l6ZSkgeworCQlEUF9FUlIocF9od2ZuLT5jZGV2LAorCQkgICAgICAgIkRvb3JiZWxsIEJBUiBzaXplIDB4JXggaXMgdG9vIHNtYWxsIChub3JtYWwgcmVnaW9uIGlzIDB4JTB4IClcbiIsCisJCSAgICAgICBkYl9iYXJfc2l6ZSwgbm9ybV9yZWdzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXJldHVybiByYzsKKworCWlmIChwd21fcmVnc2l6ZSA8IFFFRF9NSU5fUFdNX1JFR0lPTikgeworCQlEUF9FUlIocF9od2ZuLT5jZGV2LAorCQkgICAgICAgIlBXTSByZWdpb24gc2l6ZSAweCUweCBpcyB0b28gc21hbGwuIFNob3VsZCBiZSBhdCBsZWFzdCAweCUweCAoRG9vcmJlbGwgQkFSIHNpemUgaXMgMHgleCBhbmQgbm9ybWFsIHJlZ2lvbiBzaXplIGlzIDB4JTB4KVxuIiwKKwkJICAgICAgIHB3bV9yZWdzaXplLAorCQkgICAgICAgUUVEX01JTl9QV01fUkVHSU9OLCBkYl9iYXJfc2l6ZSwgbm9ybV9yZWdzaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBEUElzICovCisJcm9jZV9lZHBtX21vZGUgPSBwX2h3Zm4tPnBmX3BhcmFtcy5yZG1hX3BmX3BhcmFtcy5yb2NlX2VkcG1fbW9kZTsKKwlpZiAoKHJvY2VfZWRwbV9tb2RlID09IFFFRF9ST0NFX0VEUE1fTU9ERV9FTkFCTEUpIHx8CisJICAgICgocm9jZV9lZHBtX21vZGUgPT0gUUVEX1JPQ0VfRURQTV9NT0RFX0ZPUkNFX09OKSkpIHsKKwkJLyogRWl0aGVyIEVEUE0gaXMgbWFuZGF0b3J5LCBvciB3ZSBhcmUgYXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBhCisJCSAqIFdJRCBwZXIgQ1BVLgorCQkgKi8KKwkJbl9jcHVzID0gbnVtX2FjdGl2ZV9jcHVzKCk7CisJCXJjID0gcWVkX2h3X2luaXRfZHBpX3NpemUocF9od2ZuLCBwX3B0dCwgcHdtX3JlZ3NpemUsIG5fY3B1cyk7CisJfQorCisJY29uZCA9IChyYyAmJiAocm9jZV9lZHBtX21vZGUgPT0gUUVEX1JPQ0VfRURQTV9NT0RFX0VOQUJMRSkpIHx8CisJICAgICAgIChyb2NlX2VkcG1fbW9kZSA9PSBRRURfUk9DRV9FRFBNX01PREVfRElTQUJMRSk7CisJaWYgKGNvbmQgfHwgcF9od2ZuLT5kY2J4X25vX2VkcG0pIHsKKwkJLyogRWl0aGVyIEVEUE0gaXMgZGlzYWJsZWQgZnJvbSB1c2VyIGNvbmZpZ3VyYXRpb24sIG9yIGl0IGlzCisJCSAqIGRpc2FibGVkIHZpYSBEQ0J4LCBvciBpdCBpcyBub3QgbWFuZGF0b3J5IGFuZCB3ZSBmYWlsZWQgdG8KKwkJICogYWxsb2NhdGVkIGEgV0lEIHBlciBDUFUuCisJCSAqLworCQluX2NwdXMgPSAxOworCQlyYyA9IHFlZF9od19pbml0X2RwaV9zaXplKHBfaHdmbiwgcF9wdHQsIHB3bV9yZWdzaXplLCBuX2NwdXMpOworCisJCWlmIChjb25kKQorCQkJcWVkX3JkbWFfZHBtX2JhcihwX2h3Zm4sIHBfcHR0KTsKKwl9CisKKwlEUF9JTkZPKHBfaHdmbiwKKwkJImRvb3JiZWxsIGJhcjogbm9ybWFsX3JlZ2lvbl9zaXplPSVkLCBwd21fcmVnaW9uX3NpemU9JWQsIGRwaV9zaXplPSVkLCBkcGlfY291bnQ9JWQsIHJvY2VfZWRwbT0lc1xuIiwKKwkJbm9ybV9yZWdzaXplLAorCQlwd21fcmVnc2l6ZSwKKwkJcF9od2ZuLT5kcGlfc2l6ZSwKKwkJcF9od2ZuLT5kcGlfY291bnQsCisJCSgocF9od2ZuLT5kY2J4X25vX2VkcG0pIHx8IChwX2h3Zm4tPmRiX2Jhcl9ub19lZHBtKSkgPworCQkiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKKworCWlmIChyYykgeworCQlEUF9FUlIocF9od2ZuLAorCQkgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBlbm91Z2ggRFBJcy4gQWxsb2NhdGVkICVkIGJ1dCB0aGUgY3VycmVudCBtaW5pbXVtIGlzICVkLlxuIiwKKwkJICAgICAgIHBfaHdmbi0+ZHBpX2NvdW50LAorCQkgICAgICAgcF9od2ZuLT5wZl9wYXJhbXMucmRtYV9wZl9wYXJhbXMubWluX2RwaXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwX2h3Zm4tPmRwaV9zdGFydF9vZmZzZXQgPSBub3JtX3JlZ3NpemU7CisKKwkvKiBERU1TIHNpemUgaXMgY29uZmlndXJlZCBsb2cyIG9mIERXT1JEcywgaGVuY2UgdGhlIGRpdmlzaW9uIGJ5IDQgKi8KKwlwZl9kZW1zX3NoaWZ0ID0gaWxvZzIoUUVEX1BGX0RFTVNfU0laRSAvIDQpOworCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBET1JRX1JFR19QRl9JQ0lEX0JJVF9TSElGVF9OT1JNLCBwZl9kZW1zX3NoaWZ0KTsKKwlxZWRfd3IocF9od2ZuLCBwX3B0dCwgRE9SUV9SRUdfUEZfTUlOX0FERFJfUkVHMSwgbWluX2FkZHJfcmVnMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxZWRfaHdfaW5pdF9wb3J0KHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgaW50IGh3X21vZGUpCit7CisJcmV0dXJuIHFlZF9pbml0X3J1bihwX2h3Zm4sIHBfcHR0LCBQSEFTRV9QT1JULAorCQkJICAgIHBfaHdmbi0+cG9ydF9pZCwgaHdfbW9kZSk7CiB9CiAKIHN0YXRpYyBpbnQgcWVkX2h3X2luaXRfcGYoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCkBAIC04NDgsNyArOTU1LDcgQEAKIAlxZWRfaW50X2lndV9pbml0X3J0KHBfaHdmbik7CiAKIAkvKiBTZXQgVkxBTiBpbiBOSUcgaWYgbmVlZGVkICovCi0JaWYgKGh3X21vZGUgJiAoMSA8PCBNT0RFX01GX1NEKSkgeworCWlmIChod19tb2RlICYgQklUKE1PREVfTUZfU0QpKSB7CiAJCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfSFcsICJDb25maWd1cmluZyBMTEhfRlVOQ19UQUdcbiIpOwogCQlTVE9SRV9SVF9SRUcocF9od2ZuLCBOSUdfUkVHX0xMSF9GVU5DX1RBR19FTl9SVF9PRkZTRVQsIDEpOwogCQlTVE9SRV9SVF9SRUcocF9od2ZuLCBOSUdfUkVHX0xMSF9GVU5DX1RBR19WQUxVRV9SVF9PRkZTRVQsCkBAIC04NTYsNyArOTYzLDcgQEAKIAl9CiAKIAkvKiBFbmFibGUgY2xhc3NpZmljYXRpb24gYnkgTUFDIGlmIG5lZWRlZCAqLwotCWlmIChod19tb2RlICYgKDEgPDwgTU9ERV9NRl9TSSkpIHsKKwlpZiAoaHdfbW9kZSAmIEJJVChNT0RFX01GX1NJKSkgewogCQlEUF9WRVJCT1NFKHBfaHdmbiwgTkVUSUZfTVNHX0hXLAogCQkJICAgIkNvbmZpZ3VyaW5nIFRBR01BQ19DTFNfVFlQRVxuIik7CiAJCVNUT1JFX1JUX1JFRyhwX2h3Zm4sCkBAIC04NzEsNyArOTc4LDcgQEAKIAogCS8qIENsZWFudXAgY2hpcCBmcm9tIHByZXZpb3VzIGRyaXZlciBpZiBzdWNoIHJlbWFpbnMgZXhpc3QgKi8KIAlyYyA9IHFlZF9maW5hbF9jbGVhbnVwKHBfaHdmbiwgcF9wdHQsIHJlbF9wZl9pZCwgZmFsc2UpOwotCWlmIChyYyAhPSAwKQorCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCiAJLyogUEYgSW5pdCBzZXF1ZW5jZSAqLwpAQCAtODg3LDIwICs5OTQsOSBAQAogCS8qIFB1cmUgcnVudGltZSBpbml0aWFsaXphdGlvbnMgLSBkaXJlY3RseSB0byB0aGUgSFcgICovCiAJcWVkX2ludF9pZ3VfaW5pdF9wdXJlX3J0KHBfaHdmbiwgcF9wdHQsIHRydWUsIHRydWUpOwogCi0JaWYgKGh3X21vZGUgJiAoMSA8PCBNT0RFX01GX1NJKSkgewotCQl1OCBwZl9pZCA9IDA7Ci0JCXUzMiB2YWwgPSAwOwotCi0JCWlmICghcWVkX2h3X2luaXRfZmlyc3RfZXRoKHBfaHdmbiwgcF9wdHQsICZwZl9pZCkpIHsKLQkJCWlmIChwX2h3Zm4tPnJlbF9wZl9pZCA9PSBwZl9pZCkgewotCQkJCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfSUZVUCwKLQkJCQkJICAgIlBGWyVkXSBpcyBmaXJzdCBFVEggb24gZW5naW5lXG4iLAotCQkJCQkgICBwZl9pZCk7Ci0JCQkJdmFsID0gMTsKLQkJCX0KLQkJCXFlZF93cihwX2h3Zm4sIHBfcHR0LCBQUlNfUkVHX01TR19JTkZPLCB2YWwpOwotCQl9Ci0JfQorCXJjID0gcWVkX2h3X2luaXRfcGZfZG9vcmJlbGxfYmFyKHBfaHdmbiwgcF9wdHQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJaWYgKGJfaHdfc3RhcnQpIHsKIAkJLyogZW5hYmxlIGludGVycnVwdHMgKi8KQEAgLTk1MCw4ICsxMDQ2LDcgQEAKIAkvKiBSZWFkIHNoYWRvdyBvZiBjdXJyZW50IE1GVyBtYWlsYm94ICovCiAJcWVkX21jcF9yZWFkX21iKHBfaHdmbiwgcF9tYWluX3B0dCk7CiAJbWVtY3B5KHBfaHdmbi0+bWNwX2luZm8tPm1md19tYl9zaGFkb3csCi0JICAgICAgIHBfaHdmbi0+bWNwX2luZm8tPm1md19tYl9jdXIsCi0JICAgICAgIHBfaHdmbi0+bWNwX2luZm8tPm1md19tYl9sZW5ndGgpOworCSAgICAgICBwX2h3Zm4tPm1jcF9pbmZvLT5tZndfbWJfY3VyLCBwX2h3Zm4tPm1jcF9pbmZvLT5tZndfbWJfbGVuZ3RoKTsKIH0KIAogaW50IHFlZF9od19pbml0KHN0cnVjdCBxZWRfZGV2ICpjZGV2LApAQCAtOTcxLDcgKzEwNjYsNyBAQAogCiAJaWYgKElTX1BGKGNkZXYpKSB7CiAJCXJjID0gcWVkX2luaXRfZndfZGF0YShjZGV2LCBiaW5fZndfZGF0YSk7Ci0JCWlmIChyYyAhPSAwKQorCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CiAJfQogCkBAIC05ODgsOCArMTA4Myw3IEBACiAKIAkJcWVkX2NhbGNfaHdfbW9kZShwX2h3Zm4pOwogCi0JCXJjID0gcWVkX21jcF9sb2FkX3JlcShwX2h3Zm4sIHBfaHdmbi0+cF9tYWluX3B0dCwKLQkJCQkgICAgICAmbG9hZF9jb2RlKTsKKwkJcmMgPSBxZWRfbWNwX2xvYWRfcmVxKHBfaHdmbiwgcF9od2ZuLT5wX21haW5fcHR0LCAmbG9hZF9jb2RlKTsKIAkJaWYgKHJjKSB7CiAJCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHNlbmRpbmcgTE9BRF9SRVEgY29tbWFuZFxuIik7CiAJCQlyZXR1cm4gcmM7CkBAIC0xMDA0LDExICsxMDk4LDYgQEAKIAkJcF9od2ZuLT5maXJzdF9vbl9lbmdpbmUgPSAobG9hZF9jb2RlID09CiAJCQkJCSAgIEZXX01TR19DT0RFX0RSVl9MT0FEX0VOR0lORSk7CiAKLQkJaWYgKCFxbV9sb2NrX2luaXQpIHsKLQkJCXNwaW5fbG9ja19pbml0KCZxbV9sb2NrKTsKLQkJCXFtX2xvY2tfaW5pdCA9IHRydWU7Ci0JCX0KLQogCQlzd2l0Y2ggKGxvYWRfY29kZSkgewogCQljYXNlIEZXX01TR19DT0RFX0RSVl9MT0FEX0VOR0lORToKIAkJCXJjID0gcWVkX2h3X2luaXRfY29tbW9uKHBfaHdmbiwgcF9od2ZuLT5wX21haW5fcHR0LApAQCAtMTA3MSw5ICsxMTYwLDggQEAKIH0KIAogI2RlZmluZSBRRURfSFdfU1RPUF9SRVRSWV9MSU1JVCAoMTApCi1zdGF0aWMgaW5saW5lIHZvaWQgcWVkX2h3X3RpbWVyc19zdG9wKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAotCQkJCSAgICAgIHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAotCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKK3N0YXRpYyB2b2lkIHFlZF9od190aW1lcnNfc3RvcChzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCSAgICAgICBzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQogewogCWludCBpOwogCkBAIC0xMDg0LDggKzExNzIsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBRRURfSFdfU1RPUF9SRVRSWV9MSU1JVDsgaSsrKSB7CiAJCWlmICgoIXFlZF9yZChwX2h3Zm4sIHBfcHR0LAogCQkJICAgICBUTV9SRUdfUEZfU0NBTl9BQ1RJVkVfQ09OTikpICYmCi0JCSAgICAoIXFlZF9yZChwX2h3Zm4sIHBfcHR0LAotCQkJICAgICBUTV9SRUdfUEZfU0NBTl9BQ1RJVkVfVEFTSykpKQorCQkgICAgKCFxZWRfcmQocF9od2ZuLCBwX3B0dCwgVE1fUkVHX1BGX1NDQU5fQUNUSVZFX1RBU0spKSkKIAkJCWJyZWFrOwogCiAJCS8qIERlcGVuZGVudCBvbiBudW1iZXIgb2YgY29ubmVjdGlvbi90YXNrcywgcG9zc2libHkKQEAgLTExOTAsOCArMTI3Nyw3IEBACiAJCX0KIAogCQlEUF9WRVJCT1NFKHBfaHdmbiwKLQkJCSAgIE5FVElGX01TR19JRkRPV04sCi0JCQkgICAiU2h1dHRpbmcgZG93biB0aGUgZmFzdHBhdGhcbiIpOworCQkJICAgTkVUSUZfTVNHX0lGRE9XTiwgIlNodXR0aW5nIGRvd24gdGhlIGZhc3RwYXRoXG4iKTsKIAogCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKIAkJICAgICAgIE5JR19SRUdfUlhfTExIX0JSQl9HQVRFX0ROVEZXRF9QRVJQRiwgMHgxKTsKQEAgLTEyMTksMTQgKzEzMDUsMTMgQEAKIAkgICAgICAgTklHX1JFR19SWF9MTEhfQlJCX0dBVEVfRE5URldEX1BFUlBGLCAweDApOwogfQogCi1zdGF0aWMgaW50IHFlZF9yZWdfYXNzZXJ0KHN0cnVjdCBxZWRfaHdmbiAqaHdmbiwKLQkJCSAgc3RydWN0IHFlZF9wdHQgKnB0dCwgdTMyIHJlZywKLQkJCSAgYm9vbCBleHBlY3RlZCkKK3N0YXRpYyBpbnQgcWVkX3JlZ19hc3NlcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTMyIHJlZywgYm9vbCBleHBlY3RlZCkKIHsKLQl1MzIgYXNzZXJ0X3ZhbCA9IHFlZF9yZChod2ZuLCBwdHQsIHJlZyk7CisJdTMyIGFzc2VydF92YWwgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwgcmVnKTsKIAogCWlmIChhc3NlcnRfdmFsICE9IGV4cGVjdGVkKSB7Ci0JCURQX05PVElDRShod2ZuLCAiVmFsdWUgYXQgYWRkcmVzcyAweCV4ICE9IDB4JTA4eFxuIiwKKwkJRFBfTk9USUNFKHBfaHdmbiwgIlZhbHVlIGF0IGFkZHJlc3MgMHglMDh4ICE9IDB4JTA4eFxuIiwKIAkJCSAgcmVnLCBleHBlY3RlZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEzMDYsOCArMTM5MSw3IEBACiAKIAkvKiBDbGVhbiBQcmV2aW91cyBlcnJvcnMgaWYgc3VjaCBleGlzdCAqLwogCXFlZF93cihwX2h3Zm4sIHBfaHdmbi0+cF9tYWluX3B0dCwKLQkgICAgICAgUEdMVUVfQl9SRUdfV0FTX0VSUk9SX1BGXzMxXzBfQ0xSLAotCSAgICAgICAxIDw8IHBfaHdmbi0+YWJzX3BmX2lkKTsKKwkgICAgICAgUEdMVUVfQl9SRUdfV0FTX0VSUk9SX1BGXzMxXzBfQ0xSLCAxIDw8IHBfaHdmbi0+YWJzX3BmX2lkKTsKIAogCS8qIGVuYWJsZSBpbnRlcm5hbCB0YXJnZXQtcmVhZCAqLwogCXFlZF93cihwX2h3Zm4sIHBfaHdmbi0+cF9tYWluX3B0dCwKQEAgLTEzMTcsNyArMTQwMSw4IEBACiBzdGF0aWMgdm9pZCBnZXRfZnVuY3Rpb25faWQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pCiB7CiAJLyogTUUgUmVnaXN0ZXIgKi8KLQlwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZCA9ICh1MTYpUkVHX1JEKHBfaHdmbiwgUFhQX1BGX01FX09QQVFVRV9BRERSKTsKKwlwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZCA9ICh1MTYpIFJFR19SRChwX2h3Zm4sCisJCQkJCQkgIFBYUF9QRl9NRV9PUEFRVUVfQUREUik7CiAKIAlwX2h3Zm4tPmh3X2luZm8uY29uY3JldGVfZmlkID0gUkVHX1JEKHBfaHdmbiwgUFhQX1BGX01FX0NPTkNSRVRFX0FERFIpOwogCkBAIC0xMzI2LDYgKzE0MTEsMTAgQEAKIAkJCQkgICAgICBQWFBfQ09OQ1JFVEVfRklEX1BGSUQpOwogCXBfaHdmbi0+cG9ydF9pZCA9IEdFVF9GSUVMRChwX2h3Zm4tPmh3X2luZm8uY29uY3JldGVfZmlkLAogCQkJCSAgICBQWFBfQ09OQ1JFVEVfRklEX1BPUlQpOworCisJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19QUk9CRSwKKwkJICAgIlJlYWQgTUUgcmVnaXN0ZXI6IENvbmNyZXRlIDB4JTA4eCBPcGFxdWUgMHglMDR4XG4iLAorCQkgICBwX2h3Zm4tPmh3X2luZm8uY29uY3JldGVfZmlkLCBwX2h3Zm4tPmh3X2luZm8ub3BhcXVlX2ZpZCk7CiB9CiAKIHN0YXRpYyB2b2lkIHFlZF9od19zZXRfZmVhdChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbikKQEAgLTEzMzMsNiArMTQyMiwxOSBAQAogCXUzMiAqZmVhdF9udW0gPSBwX2h3Zm4tPmh3X2luZm8uZmVhdF9udW07CiAJaW50IG51bV9mZWF0dXJlcyA9IDE7CiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTkZJTklCQU5EX1FFRFIpCisJLyogUm9jZSBDTlEgZWFjaCByZXF1aXJlczogMSBzdGF0dXMgYmxvY2sgKyAxIENOUS4gV2UgZGl2aWRlIHRoZQorCSAqIHN0YXR1cyBibG9ja3MgZXF1YWxseSBiZXR3ZWVuIEwyIC8gUm9DRSBidXQgd2l0aCBjb25zaWRlcmF0aW9uIGFzCisJICogdG8gaG93IG1hbnkgbDIgcXVldWVzIC8gY25xcyB3ZSBoYXZlCisJICovCisJaWYgKHBfaHdmbi0+aHdfaW5mby5wZXJzb25hbGl0eSA9PSBRRURfUENJX0VUSF9ST0NFKSB7CisJCW51bV9mZWF0dXJlcysrOworCisJCWZlYXRfbnVtW1FFRF9SRE1BX0NOUV0gPQorCQkJbWluX3QodTMyLCBSRVNDX05VTShwX2h3Zm4sIFFFRF9TQikgLyBudW1fZmVhdHVyZXMsCisJCQkgICAgICBSRVNDX05VTShwX2h3Zm4sIFFFRF9SRE1BX0NOUV9SQU0pKTsKKwl9CisjZW5kaWYKIAlmZWF0X251bVtRRURfUEZfTDJfUVVFXSA9IG1pbl90KHUzMiwgUkVTQ19OVU0ocF9od2ZuLCBRRURfU0IpIC8KIAkJCQkJCW51bV9mZWF0dXJlcywKIAkJCQkJUkVTQ19OVU0ocF9od2ZuLCBRRURfTDJfUVVFVUUpKTsKQEAgLTEzNzMsNiArMTQ3NSwxMCBAQAogCXJlc2NfbnVtW1FFRF9WTEFOXSA9IChFVEhfTlVNX1ZMQU5fRklMVEVSUyAtIDEgLypGb3IgdmxhbjAqLykgLwogCQkJICAgICBudW1fZnVuY3M7CiAJcmVzY19udW1bUUVEX0lMVF0gPSBQWFBfTlVNX0lMVF9SRUNPUkRTX0JCIC8gbnVtX2Z1bmNzOworCXJlc2NfbnVtW1FFRF9MTDJfUVVFVUVdID0gTUFYX05VTV9MTDJfUlhfUVVFVUVTIC8gbnVtX2Z1bmNzOworCXJlc2NfbnVtW1FFRF9SRE1BX0NOUV9SQU1dID0gTlVNX09GX0NNRFFTX0NRUyAvIG51bV9mdW5jczsKKwlyZXNjX251bVtRRURfUkRNQV9TVEFUU19RVUVVRV0gPSBSRE1BX05VTV9TVEFUSVNUSUNfQ09VTlRFUlNfQkIgLworCQkJCQkgbnVtX2Z1bmNzOwogCiAJZm9yIChpID0gMDsgaSA8IFFFRF9NQVhfUkVTQzsgaSsrKQogCQlyZXNjX3N0YXJ0W2ldID0gcmVzY19udW1baV0gKiBlbmFibGVkX2Z1bmNfaWR4OwpAQCAtMTM5Niw3ICsxNTAyLDggQEAKIAkJICAgIlJMID0gJWQgc3RhcnQgPSAlZFxuIgogCQkgICAiTUFDID0gJWQgc3RhcnQgPSAlZFxuIgogCQkgICAiVkxBTiA9ICVkIHN0YXJ0ID0gJWRcbiIKLQkJICAgIklMVCA9ICVkIHN0YXJ0ID0gJWRcbiIsCisJCSAgICJJTFQgPSAlZCBzdGFydCA9ICVkXG4iCisJCSAgICJMTDJfUVVFVUUgPSAlZCBzdGFydCA9ICVkXG4iLAogCQkgICBwX2h3Zm4tPmh3X2luZm8ucmVzY19udW1bUUVEX1NCXSwKIAkJICAgcF9od2ZuLT5od19pbmZvLnJlc2Nfc3RhcnRbUUVEX1NCXSwKIAkJICAgcF9od2ZuLT5od19pbmZvLnJlc2NfbnVtW1FFRF9MMl9RVUVVRV0sCkBAIC0xNDEyLDEzICsxNTE5LDE0IEBACiAJCSAgIHBfaHdmbi0+aHdfaW5mby5yZXNjX251bVtRRURfVkxBTl0sCiAJCSAgIHBfaHdmbi0+aHdfaW5mby5yZXNjX3N0YXJ0W1FFRF9WTEFOXSwKIAkJICAgcF9od2ZuLT5od19pbmZvLnJlc2NfbnVtW1FFRF9JTFRdLAotCQkgICBwX2h3Zm4tPmh3X2luZm8ucmVzY19zdGFydFtRRURfSUxUXSk7CisJCSAgIHBfaHdmbi0+aHdfaW5mby5yZXNjX3N0YXJ0W1FFRF9JTFRdLAorCQkgICBSRVNDX05VTShwX2h3Zm4sIFFFRF9MTDJfUVVFVUUpLAorCQkgICBSRVNDX1NUQVJUKHBfaHdmbiwgUUVEX0xMMl9RVUVVRSkpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcWVkX2h3X2dldF9udm1faW5mbyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQpCitzdGF0aWMgaW50IHFlZF9od19nZXRfbnZtX2luZm8oc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAl1MzIgbnZtX2NmZzFfb2Zmc2V0LCBtZl9tb2RlLCBhZGRyLCBnZW5lcmljX2NvbnQwLCBjb3JlX2NmZzsKIAl1MzIgcG9ydF9jZmdfYWRkciwgbGlua190ZW1wLCBudm1fY2ZnX2FkZHIsIGRldmljZV9jYXBhYmlsaXRpZXM7CkBAIC0xNDcyLDggKzE1ODAsNyBAQAogCQlwX2h3Zm4tPmh3X2luZm8ucG9ydF9tb2RlID0gUUVEX1BPUlRfTU9ERV9ERV8xWDI1RzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJRFBfTk9USUNFKHBfaHdmbiwgIlVua25vd24gcG9ydCBtb2RlIGluIDB4JTA4eFxuIiwKLQkJCSAgY29yZV9jZmcpOworCQlEUF9OT1RJQ0UocF9od2ZuLCAiVW5rbm93biBwb3J0IG1vZGUgaW4gMHglMDh4XG4iLCBjb3JlX2NmZyk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTQ4NCwxMSArMTU5MSwxMSBAQAogCWxpbmtfdGVtcCA9IHFlZF9yZChwX2h3Zm4sIHBfcHR0LAogCQkJICAgcG9ydF9jZmdfYWRkciArCiAJCQkgICBvZmZzZXRvZihzdHJ1Y3QgbnZtX2NmZzFfcG9ydCwgc3BlZWRfY2FwX21hc2spKTsKLQlsaW5rLT5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkcyA9Ci0JCWxpbmtfdGVtcCAmIE5WTV9DRkcxX1BPUlRfRFJWX1NQRUVEX0NBUEFCSUxJVFlfTUFTS19NQVNLOworCWxpbmtfdGVtcCAmPSBOVk1fQ0ZHMV9QT1JUX0RSVl9TUEVFRF9DQVBBQklMSVRZX01BU0tfTUFTSzsKKwlsaW5rLT5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkcyA9IGxpbmtfdGVtcDsKIAotCXBfaHdmbi0+bWNwX2luZm8tPmxpbmtfY2FwYWJpbGl0aWVzLnNwZWVkX2NhcGFiaWxpdGllcyA9Ci0JCQkJCQlsaW5rLT5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkczsKKwlsaW5rX3RlbXAgPSBsaW5rLT5zcGVlZC5hZHZlcnRpc2VkX3NwZWVkczsKKwlwX2h3Zm4tPm1jcF9pbmZvLT5saW5rX2NhcGFiaWxpdGllcy5zcGVlZF9jYXBhYmlsaXRpZXMgPSBsaW5rX3RlbXA7CiAKIAlsaW5rX3RlbXAgPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKIAkJCSAgIHBvcnRfY2ZnX2FkZHIgKwpAQCAtMTUxNyw4ICsxNjI0LDcgQEAKIAkJbGluay0+c3BlZWQuZm9yY2VkX3NwZWVkID0gMTAwMDAwOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlEUF9OT1RJQ0UocF9od2ZuLCAiVW5rbm93biBTcGVlZCBpbiAweCUwOHhcbiIsCi0JCQkgIGxpbmtfdGVtcCk7CisJCURQX05PVElDRShwX2h3Zm4sICJVbmtub3duIFNwZWVkIGluIDB4JTA4eFxuIiwgbGlua190ZW1wKTsKIAl9CiAKIAlsaW5rX3RlbXAgJj0gTlZNX0NGRzFfUE9SVF9EUlZfRkxPV19DT05UUk9MX01BU0s7CkBAIC0xNjI4LDEwICsxNzM0LDEwIEBACiAKIAlEUF9WRVJCT1NFKHBfaHdmbiwKIAkJICAgTkVUSUZfTVNHX1BST0JFLAotCQkgICAiUEYgW3JlbF9pZCAlZCwgYWJzX2lkICVkXSB3aXRoaW4gdGhlICVkIGVuYWJsZWQgZnVuY3Rpb25zIG9uIHRoZSBlbmdpbmVcbiIsCisJCSAgICJQRiBbcmVsX2lkICVkLCBhYnNfaWQgJWRdIG9jY3VwaWVzIGluZGV4ICVkIHdpdGhpbiB0aGUgJWQgZW5hYmxlZCBmdW5jdGlvbnMgb24gdGhlIGVuZ2luZVxuIiwKIAkJICAgcF9od2ZuLT5yZWxfcGZfaWQsCiAJCSAgIHBfaHdmbi0+YWJzX3BmX2lkLAotCQkgICBwX2h3Zm4tPm51bV9mdW5jc19vbl9lbmdpbmUpOworCQkgICBwX2h3Zm4tPmVuYWJsZWRfZnVuY19pZHgsIHBfaHdmbi0+bnVtX2Z1bmNzX29uX2VuZ2luZSk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTE3MDMsMTAgKzE4MDksOSBAQAogCXUzMiB0bXA7CiAKIAkvKiBSZWFkIFZlbmRvciBJZCAvIERldmljZSBJZCAqLwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNkZXYtPnBkZXYsIFBDSV9WRU5ET1JfSUQsCi0JCQkgICAgICZjZGV2LT52ZW5kb3JfaWQpOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNkZXYtPnBkZXYsIFBDSV9ERVZJQ0VfSUQsCi0JCQkgICAgICZjZGV2LT5kZXZpY2VfaWQpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNkZXYtPnBkZXYsIFBDSV9WRU5ET1JfSUQsICZjZGV2LT52ZW5kb3JfaWQpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGNkZXYtPnBkZXYsIFBDSV9ERVZJQ0VfSUQsICZjZGV2LT5kZXZpY2VfaWQpOworCiAJY2Rldi0+Y2hpcF9udW0gPSAodTE2KXFlZF9yZChwX2h3Zm4sIHBfaHdmbi0+cF9tYWluX3B0dCwKIAkJCQkgICAgIE1JU0NTX1JFR19DSElQX05VTSk7CiAJY2Rldi0+Y2hpcF9yZXYgPSAodTE2KXFlZF9yZChwX2h3Zm4sIHBfaHdmbi0+cF9tYWluX3B0dCwKQEAgLTE3NzEsMTAgKzE4NzYsOCBAQAogCiAJLyogQWxsb2NhdGUgUFRUIHBvb2wgKi8KIAlyYyA9IHFlZF9wdHRfcG9vbF9hbGxvYyhwX2h3Zm4pOwotCWlmIChyYykgewotCQlEUF9OT1RJQ0UocF9od2ZuLCAiRmFpbGVkIHRvIHByZXBhcmUgaHdmbidzIGh3XG4iKTsKKwlpZiAocmMpCiAJCWdvdG8gZXJyMDsKLQl9CiAKIAkvKiBBbGxvY2F0ZSB0aGUgbWFpbiBQVFQgKi8KIAlwX2h3Zm4tPnBfbWFpbl9wdHQgPSBxZWRfZ2V0X3Jlc2VydmVkX3B0dChwX2h3Zm4sIFJFU0VSVkVEX1BUVF9NQUlOKTsKQEAgLTE3ODIsNyArMTg4NSw3IEBACiAJLyogRmlyc3QgaHdmbiBsZWFybnMgYmFzaWMgaW5mb3JtYXRpb24sIGUuZy4sIG51bWJlciBvZiBod2ZucyAqLwogCWlmICghcF9od2ZuLT5teV9pZCkgewogCQlyYyA9IHFlZF9nZXRfZGV2X2luZm8ocF9od2ZuLT5jZGV2KTsKLQkJaWYgKHJjICE9IDApCisJCWlmIChyYykKIAkJCWdvdG8gZXJyMTsKIAl9CiAKQEAgLTE4MDQsMTAgKzE5MDcsOCBAQAogCiAJLyogQWxsb2NhdGUgdGhlIGluaXQgUlQgYXJyYXkgYW5kIGluaXRpYWxpemUgdGhlIGluaXQtb3BzIGVuZ2luZSAqLwogCXJjID0gcWVkX2luaXRfYWxsb2MocF9od2ZuKTsKLQlpZiAocmMpIHsKLQkJRFBfTk9USUNFKHBfaHdmbiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgaW5pdCBhcnJheVxuIik7CisJaWYgKHJjKQogCQlnb3RvIGVycjI7Ci0JfQogCiAJcmV0dXJuIHJjOwogZXJyMjoKQEAgLTIwMTUsMTAgKzIxMTYsOCBAQAogCQlwX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmNkZXYtPnBkZXYtPmRldiwKIAkJCQkJICAgIFFFRF9DSEFJTl9QQUdFX1NJWkUsCiAJCQkJCSAgICAmcF9waHlzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwX3ZpcnQpIHsKLQkJCURQX05PVElDRShjZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNoYWluIG1lbW9yeVxuIik7CisJCWlmICghcF92aXJ0KQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KIAogCQlpZiAoaSA9PSAwKSB7CiAJCQlxZWRfY2hhaW5faW5pdF9tZW0ocF9jaGFpbiwgcF92aXJ0LCBwX3BoeXMpOwpAQCAtMjA0OCwxMCArMjE0Nyw4IEBACiAKIAlwX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmNkZXYtPnBkZXYtPmRldiwKIAkJCQkgICAgUUVEX0NIQUlOX1BBR0VfU0laRSwgJnBfcGh5cywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwX3ZpcnQpIHsKLQkJRFBfTk9USUNFKGNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgY2hhaW4gbWVtb3J5XG4iKTsKKwlpZiAoIXBfdmlydCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcWVkX2NoYWluX2luaXRfbWVtKHBfY2hhaW4sIHBfdmlydCwgcF9waHlzKTsKIAlxZWRfY2hhaW5fcmVzZXQocF9jaGFpbik7CkBAIC0yMDY4LDEzICsyMTY1LDkgQEAKIAl2b2lkICpwX3ZpcnQgPSBOVUxMOwogCiAJc2l6ZSA9IHBhZ2VfY250ICogc2l6ZW9mKCpwcF92aXJ0X2FkZHJfdGJsKTsKLQlwcF92aXJ0X2FkZHJfdGJsID0gdm1hbGxvYyhzaXplKTsKLQlpZiAoIXBwX3ZpcnRfYWRkcl90YmwpIHsKLQkJRFBfTk9USUNFKGNkZXYsCi0JCQkgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgY2hhaW4gdmlydHVhbCBhZGRyZXNzZXMgdGFibGVcbiIpOworCXBwX3ZpcnRfYWRkcl90YmwgPSB2emFsbG9jKHNpemUpOworCWlmICghcHBfdmlydF9hZGRyX3RibCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1lbXNldChwcF92aXJ0X2FkZHJfdGJsLCAwLCBzaXplKTsKIAogCS8qIFRoZSBhbGxvY2F0aW9uIG9mIHRoZSBQQkwgdGFibGUgaXMgZG9uZSB3aXRoIGl0cyBmdWxsIHNpemUsIHNpbmNlIGl0CiAJICogaXMgZXhwZWN0ZWQgdG8gYmUgc3VjY2Vzc2l2ZS4KQEAgLTIwODcsMTkgKzIxODAsMTUgQEAKIAkJCQkJc2l6ZSwgJnBfcGJsX3BoeXMsIEdGUF9LRVJORUwpOwogCXFlZF9jaGFpbl9pbml0X3BibF9tZW0ocF9jaGFpbiwgcF9wYmxfdmlydCwgcF9wYmxfcGh5cywKIAkJCSAgICAgICBwcF92aXJ0X2FkZHJfdGJsKTsKLQlpZiAoIXBfcGJsX3ZpcnQpIHsKLQkJRFBfTk9USUNFKGNkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgY2hhaW4gcGJsIG1lbW9yeVxuIik7CisJaWYgKCFwX3BibF92aXJ0KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jbnQ7IGkrKykgewogCQlwX3ZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmNkZXYtPnBkZXYtPmRldiwKIAkJCQkJICAgIFFFRF9DSEFJTl9QQUdFX1NJWkUsCiAJCQkJCSAgICAmcF9waHlzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwX3ZpcnQpIHsKLQkJCURQX05PVElDRShjZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNoYWluIG1lbW9yeVxuIik7CisJCWlmICghcF92aXJ0KQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KIAogCQlpZiAoaSA9PSAwKSB7CiAJCQlxZWRfY2hhaW5faW5pdF9tZW0ocF9jaGFpbiwgcF92aXJ0LCBwX3BoeXMpOwpAQCAtMjEzNCw3ICsyMjIzLDggQEAKIAlyYyA9IHFlZF9jaGFpbl9hbGxvY19zYW5pdHlfY2hlY2soY2RldiwgY250X3R5cGUsIGVsZW1fc2l6ZSwgcGFnZV9jbnQpOwogCWlmIChyYykgewogCQlEUF9OT1RJQ0UoY2RldiwKLQkJCSAgIkNhbm5vdCBhbGxvY2F0ZSBhIGNoYWluIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50czpcbiIKKwkJCSAgIkNhbm5vdCBhbGxvY2F0ZSBhIGNoYWluIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50czpcbiIpOworCQlEUF9OT1RJQ0UoY2RldiwKIAkJCSAgIlt1c2VfbW9kZSAlZCwgbW9kZSAlZCwgY250X3R5cGUgJWQsIG51bV9lbGVtcyAlZCwgZWxlbV9zaXplICV6dV1cbiIsCiAJCQkgIGludGVuZGVkX3VzZSwgbW9kZSwgY250X3R5cGUsIG51bV9lbGVtcywgZWxlbV9zaXplKTsKIAkJcmV0dXJuIHJjOwpAQCAtMjE4Myw4ICsyMjczLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHFlZF9md192cG9ydChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJIHU4IHNyY19pZCwgdTggKmRzdF9pZCkKK2ludCBxZWRfZndfdnBvcnQoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHU4IHNyY19pZCwgdTggKmRzdF9pZCkKIHsKIAlpZiAoc3JjX2lkID49IFJFU0NfTlVNKHBfaHdmbiwgUUVEX1ZQT1JUKSkgewogCQl1OCBtaW4sIG1heDsKQEAgLTIyMDMsOCArMjI5Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBxZWRfZndfcnNzX2VuZyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJICAgdTggc3JjX2lkLCB1OCAqZHN0X2lkKQoraW50IHFlZF9md19yc3NfZW5nKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCB1OCBzcmNfaWQsIHU4ICpkc3RfaWQpCiB7CiAJaWYgKHNyY19pZCA+PSBSRVNDX05VTShwX2h3Zm4sIFFFRF9SU1NfRU5HKSkgewogCQl1OCBtaW4sIG1heDsKQEAgLTIyMjMsNiArMjMxMSw5OCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBxZWRfbGxoX21hY190b19maWx0ZXIodTMyICpwX2hpZ2gsIHUzMiAqcF9sb3csCisJCQkJICB1OCAqcF9maWx0ZXIpCit7CisJKnBfaGlnaCA9IHBfZmlsdGVyWzFdIHwgKHBfZmlsdGVyWzBdIDw8IDgpOworCSpwX2xvdyA9IHBfZmlsdGVyWzVdIHwgKHBfZmlsdGVyWzRdIDw8IDgpIHwKKwkJIChwX2ZpbHRlclszXSA8PCAxNikgfCAocF9maWx0ZXJbMl0gPDwgMjQpOworfQorCitpbnQgcWVkX2xsaF9hZGRfbWFjX2ZpbHRlcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTggKnBfZmlsdGVyKQoreworCXUzMiBoaWdoID0gMCwgbG93ID0gMCwgZW47CisJaW50IGk7CisKKwlpZiAoIShJU19NRl9TSShwX2h3Zm4pIHx8IElTX01GX0RFRkFVTFQocF9od2ZuKSkpCisJCXJldHVybiAwOworCisJcWVkX2xsaF9tYWNfdG9fZmlsdGVyKCZoaWdoLCAmbG93LCBwX2ZpbHRlcik7CisKKwkvKiBGaW5kIGEgZnJlZSBlbnRyeSBhbmQgdXRpbGl6ZSBpdCAqLworCWZvciAoaSA9IDA7IGkgPCBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTl9TSVpFOyBpKyspIHsKKwkJZW4gPSBxZWRfcmQocF9od2ZuLCBwX3B0dCwKKwkJCSAgICBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTiArIGkgKiBzaXplb2YodTMyKSk7CisJCWlmIChlbikKKwkJCWNvbnRpbnVlOworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKKwkJICAgICAgIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFICsKKwkJICAgICAgIDIgKiBpICogc2l6ZW9mKHUzMiksIGxvdyk7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAorCQkgICAgICAgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfVkFMVUUgKworCQkgICAgICAgKDIgKiBpICsgMSkgKiBzaXplb2YodTMyKSwgaGlnaCk7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAorCQkgICAgICAgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfTU9ERSArIGkgKiBzaXplb2YodTMyKSwgMCk7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAorCQkgICAgICAgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfUFJPVE9DT0xfVFlQRSArCisJCSAgICAgICBpICogc2l6ZW9mKHUzMiksIDApOworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKKwkJICAgICAgIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOICsgaSAqIHNpemVvZih1MzIpLCAxKTsKKwkJYnJlYWs7CisJfQorCWlmIChpID49IE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOX1NJWkUpIHsKKwkJRFBfTk9USUNFKHBfaHdmbiwKKwkJCSAgIkZhaWxlZCB0byBmaW5kIGFuIGVtcHR5IExMSCBmaWx0ZXIgdG8gdXRpbGl6ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCURQX1ZFUkJPU0UocF9od2ZuLCBORVRJRl9NU0dfSFcsCisJCSAgICJtYWM6ICVwTSBpcyBhZGRlZCBhdCAlZFxuIiwKKwkJICAgcF9maWx0ZXIsIGkpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcWVkX2xsaF9yZW1vdmVfbWFjX2ZpbHRlcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHU4ICpwX2ZpbHRlcikKK3sKKwl1MzIgaGlnaCA9IDAsIGxvdyA9IDA7CisJaW50IGk7CisKKwlpZiAoIShJU19NRl9TSShwX2h3Zm4pIHx8IElTX01GX0RFRkFVTFQocF9od2ZuKSkpCisJCXJldHVybjsKKworCXFlZF9sbGhfbWFjX3RvX2ZpbHRlcigmaGlnaCwgJmxvdywgcF9maWx0ZXIpOworCisJLyogRmluZCB0aGUgZW50cnkgYW5kIGNsZWFuIGl0ICovCisJZm9yIChpID0gMDsgaSA8IE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOX1NJWkU7IGkrKykgeworCQlpZiAocWVkX3JkKHBfaHdmbiwgcF9wdHQsCisJCQkgICBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRSArCisJCQkgICAyICogaSAqIHNpemVvZih1MzIpKSAhPSBsb3cpCisJCQljb250aW51ZTsKKwkJaWYgKHFlZF9yZChwX2h3Zm4sIHBfcHR0LAorCQkJICAgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfVkFMVUUgKworCQkJICAgKDIgKiBpICsgMSkgKiBzaXplb2YodTMyKSkgIT0gaGlnaCkKKwkJCWNvbnRpbnVlOworCisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAorCQkgICAgICAgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfRU4gKyBpICogc2l6ZW9mKHUzMiksIDApOworCQlxZWRfd3IocF9od2ZuLCBwX3B0dCwKKwkJICAgICAgIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFICsgMiAqIGkgKiBzaXplb2YodTMyKSwgMCk7CisJCXFlZF93cihwX2h3Zm4sIHBfcHR0LAorCQkgICAgICAgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfVkFMVUUgKworCQkgICAgICAgKDIgKiBpICsgMSkgKiBzaXplb2YodTMyKSwgMCk7CisKKwkJRFBfVkVSQk9TRShwX2h3Zm4sIE5FVElGX01TR19IVywKKwkJCSAgICJtYWM6ICVwTSBpcyByZW1vdmVkIGZyb20gJWRcbiIsCisJCQkgICBwX2ZpbHRlciwgaSk7CisJCWJyZWFrOworCX0KKwlpZiAoaSA+PSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTl9TSVpFKQorCQlEUF9OT1RJQ0UocF9od2ZuLCAiVHJpZWQgdG8gcmVtb3ZlIGEgbm9uLWNvbmZpZ3VyZWQgZmlsdGVyXG4iKTsKK30KKwogc3RhdGljIGludCBxZWRfc2V0X2NvYWxlc2NlKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLCBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCiAJCQkgICAgdTMyIGh3X2FkZHIsIHZvaWQgKnBfZXRoX3F6b25lLAogCQkJICAgIHNpemVfdCBldGhfcXpvbmVfc2l6ZSwgdTggdGltZXNldCkKQEAgLTIzODYsOCArMjU2Niw3IEBACiAgKiAzLiB0b3RhbF9yZXFfbWluX3JhdGUgW2FsbCB2cG9ydHMgbWluIHJhdGUgc3VtXSBzaG91bGRuJ3QgZXhjZWVkIG1pbl9wZl9yYXRlLgogICovCiBzdGF0aWMgaW50IHFlZF9pbml0X3dmcV9wYXJhbShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKLQkJCSAgICAgIHUxNiB2cG9ydF9pZCwgdTMyIHJlcV9yYXRlLAotCQkJICAgICAgdTMyIG1pbl9wZl9yYXRlKQorCQkJICAgICAgdTE2IHZwb3J0X2lkLCB1MzIgcmVxX3JhdGUsIHUzMiBtaW5fcGZfcmF0ZSkKIHsKIAl1MzIgdG90YWxfcmVxX21pbl9yYXRlID0gMCwgdG90YWxfbGVmdF9yYXRlID0gMCwgbGVmdF9yYXRlX3Blcl92cCA9IDA7CiAJaW50IG5vbl9yZXF1ZXN0ZWRfY291bnQgPSAwLCByZXFfY291bnQgPSAwLCBpLCBudW1fdnBvcnRzOwpAQCAtMjQ3MSw3ICsyNjUwLDcgQEAKIAogCXJjID0gcWVkX2luaXRfd2ZxX3BhcmFtKHBfaHdmbiwgdnBfaWQsIHJhdGUsIHBfbGluay0+bWluX3BmX3JhdGUpOwogCi0JaWYgKHJjID09IDApCisJaWYgKCFyYykKIAkJcWVkX2NvbmZpZ3VyZV93ZnFfZm9yX2FsbF92cG9ydHMocF9od2ZuLCBwX3B0dCwKIAkJCQkJCSBwX2xpbmstPm1pbl9wZl9yYXRlKTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZXZfYXBpLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9kZXZfYXBpLmgKaW5kZXggMzQzYmIwMy4uYjY3MTFjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfZGV2X2FwaS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2Rldl9hcGkuaApAQCAtMzEwLDYgKzMxMCwyNiBAQAogCQkgICB1OCAqZHN0X2lkKTsKIAogLyoqCisgKiBAYnJpZWYgcWVkX2xsaF9hZGRfbWFjX2ZpbHRlciAtIGNvbmZpZ3VyZXMgYSBNQUMgZmlsdGVyIGluIGxsaAorICoKKyAqIEBwYXJhbSBwX2h3Zm4KKyAqIEBwYXJhbSBwX3B0dAorICogQHBhcmFtIHBfZmlsdGVyIC0gTUFDIHRvIGFkZAorICovCitpbnQgcWVkX2xsaF9hZGRfbWFjX2ZpbHRlcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwgdTggKnBfZmlsdGVyKTsKKworLyoqCisgKiBAYnJpZWYgcWVkX2xsaF9yZW1vdmVfbWFjX2ZpbHRlciAtIHJlbW92ZXMgYSBNQUMgZmlsdGVyIGZyb20gbGxoCisgKgorICogQHBhcmFtIHBfaHdmbgorICogQHBhcmFtIHBfcHR0CisgKiBAcGFyYW0gcF9maWx0ZXIgLSBNQUMgdG8gcmVtb3ZlCisgKi8KK3ZvaWQgcWVkX2xsaF9yZW1vdmVfbWFjX2ZpbHRlcihzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCSAgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsIHU4ICpwX2ZpbHRlcik7CisKKy8qKgogICogKkBicmllZiBDbGVhbnVwIG9mIHByZXZpb3VzIGRyaXZlciByZW1haW5zIHByaW9yIHRvIGxvYWQKICAqCiAgKiBAcGFyYW0gcF9od2ZuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9oc2kuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2hzaS5oCmluZGV4IDZmOWQzYjguLjcyZWVlMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2hzaS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2hzaS5oCkBAIC01MzYsNiArNTM2LDI0NyBAQAogCXN0cnVjdCByZWdwYWlyIHVzdG9ybV9zdF9wYWRkaW5nWzJdOwogfTsKIAorZW51bSBjb3JlX2Vycm9yX2hhbmRsZSB7CisJTEwyX0RST1BfUEFDS0VULAorCUxMMl9ET19OT1RISU5HLAorCUxMMl9BU1NFUlQsCisJTUFYX0NPUkVfRVJST1JfSEFORExFCit9OworCitlbnVtIGNvcmVfZXZlbnRfb3Bjb2RlIHsKKwlDT1JFX0VWRU5UX1RYX1FVRVVFX1NUQVJULAorCUNPUkVfRVZFTlRfVFhfUVVFVUVfU1RPUCwKKwlDT1JFX0VWRU5UX1JYX1FVRVVFX1NUQVJULAorCUNPUkVfRVZFTlRfUlhfUVVFVUVfU1RPUCwKKwlNQVhfQ09SRV9FVkVOVF9PUENPREUKK307CisKK2VudW0gY29yZV9sNF9wc2V1ZG9fY2hlY2tzdW1fbW9kZSB7CisJQ09SRV9MNF9QU0VVRE9fQ1NVTV9DT1JSRUNUX0xFTkdUSCwKKwlDT1JFX0w0X1BTRVVET19DU1VNX1pFUk9fTEVOR1RILAorCU1BWF9DT1JFX0w0X1BTRVVET19DSEVDS1NVTV9NT0RFCit9OworCitzdHJ1Y3QgY29yZV9sbDJfcG9ydF9zdGF0cyB7CisJc3RydWN0IHJlZ3BhaXIgZ3NpX2ludmFsaWRfaGRyOworCXN0cnVjdCByZWdwYWlyIGdzaV9pbnZhbGlkX3BrdF9sZW5ndGg7CisJc3RydWN0IHJlZ3BhaXIgZ3NpX3Vuc3VwcG9ydGVkX3BrdF90eXA7CisJc3RydWN0IHJlZ3BhaXIgZ3NpX2NyY2Noa3NtX2Vycm9yOworfTsKKworc3RydWN0IGNvcmVfbGwyX3BzdG9ybV9wZXJfcXVldWVfc3RhdCB7CisJc3RydWN0IHJlZ3BhaXIgc2VudF91Y2FzdF9ieXRlczsKKwlzdHJ1Y3QgcmVncGFpciBzZW50X21jYXN0X2J5dGVzOworCXN0cnVjdCByZWdwYWlyIHNlbnRfYmNhc3RfYnl0ZXM7CisJc3RydWN0IHJlZ3BhaXIgc2VudF91Y2FzdF9wa3RzOworCXN0cnVjdCByZWdwYWlyIHNlbnRfbWNhc3RfcGt0czsKKwlzdHJ1Y3QgcmVncGFpciBzZW50X2JjYXN0X3BrdHM7Cit9OworCitzdHJ1Y3QgY29yZV9sbDJfcnhfcHJvZCB7CisJX19sZTE2IGJkX3Byb2Q7CisJX19sZTE2IGNxZV9wcm9kOworCV9fbGUzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBjb3JlX2xsMl90c3Rvcm1fcGVyX3F1ZXVlX3N0YXQgeworCXN0cnVjdCByZWdwYWlyIHBhY2tldF90b29fYmlnX2Rpc2NhcmQ7CisJc3RydWN0IHJlZ3BhaXIgbm9fYnVmZl9kaXNjYXJkOworfTsKKworc3RydWN0IGNvcmVfbGwyX3VzdG9ybV9wZXJfcXVldWVfc3RhdCB7CisJc3RydWN0IHJlZ3BhaXIgcmN2X3VjYXN0X2J5dGVzOworCXN0cnVjdCByZWdwYWlyIHJjdl9tY2FzdF9ieXRlczsKKwlzdHJ1Y3QgcmVncGFpciByY3ZfYmNhc3RfYnl0ZXM7CisJc3RydWN0IHJlZ3BhaXIgcmN2X3VjYXN0X3BrdHM7CisJc3RydWN0IHJlZ3BhaXIgcmN2X21jYXN0X3BrdHM7CisJc3RydWN0IHJlZ3BhaXIgcmN2X2JjYXN0X3BrdHM7Cit9OworCitlbnVtIGNvcmVfcmFtcm9kX2NtZF9pZCB7CisJQ09SRV9SQU1ST0RfVU5VU0VELAorCUNPUkVfUkFNUk9EX1JYX1FVRVVFX1NUQVJULAorCUNPUkVfUkFNUk9EX1RYX1FVRVVFX1NUQVJULAorCUNPUkVfUkFNUk9EX1JYX1FVRVVFX1NUT1AsCisJQ09SRV9SQU1ST0RfVFhfUVVFVUVfU1RPUCwKKwlNQVhfQ09SRV9SQU1ST0RfQ01EX0lECit9OworCitlbnVtIGNvcmVfcm9jZV9mbGF2b3JfdHlwZSB7CisJQ09SRV9ST0NFLAorCUNPUkVfUlJPQ0UsCisJTUFYX0NPUkVfUk9DRV9GTEFWT1JfVFlQRQorfTsKKworc3RydWN0IGNvcmVfcnhfYWN0aW9uX29uX2Vycm9yIHsKKwl1OCBlcnJvcl90eXBlOworI2RlZmluZSBDT1JFX1JYX0FDVElPTl9PTl9FUlJPUl9QQUNLRVRfVE9PX0JJR19NQVNLCTB4MworI2RlZmluZSBDT1JFX1JYX0FDVElPTl9PTl9FUlJPUl9QQUNLRVRfVE9PX0JJR19TSElGVCAwCisjZGVmaW5lIENPUkVfUlhfQUNUSU9OX09OX0VSUk9SX05PX0JVRkZfTUFTSwkweDMKKyNkZWZpbmUgQ09SRV9SWF9BQ1RJT05fT05fRVJST1JfTk9fQlVGRl9TSElGVAkyCisjZGVmaW5lIENPUkVfUlhfQUNUSU9OX09OX0VSUk9SX1JFU0VSVkVEX01BU0sJMHhGCisjZGVmaW5lIENPUkVfUlhfQUNUSU9OX09OX0VSUk9SX1JFU0VSVkVEX1NISUZUCTQKK307CisKK3N0cnVjdCBjb3JlX3J4X2JkIHsKKwlzdHJ1Y3QgcmVncGFpciBhZGRyOworCV9fbGUxNiByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCBjb3JlX3J4X2JkX3dpdGhfYnVmZl9sZW4geworCXN0cnVjdCByZWdwYWlyIGFkZHI7CisJX19sZTE2IGJ1ZmZfbGVuZ3RoOworCV9fbGUxNiByZXNlcnZlZFszXTsKK307CisKK3VuaW9uIGNvcmVfcnhfYmRfdW5pb24geworCXN0cnVjdCBjb3JlX3J4X2JkIHJ4X2JkOworCXN0cnVjdCBjb3JlX3J4X2JkX3dpdGhfYnVmZl9sZW4gcnhfYmRfd2l0aF9sZW47Cit9OworCitzdHJ1Y3QgY29yZV9yeF9jcWVfb3BhcXVlX2RhdGEgeworCV9fbGUzMiBkYXRhWzJdOworfTsKKworZW51bSBjb3JlX3J4X2NxZV90eXBlIHsKKwlDT1JFX1JYX0NRRV9JTExJR0FMX1RZUEUsCisJQ09SRV9SWF9DUUVfVFlQRV9SRUdVTEFSLAorCUNPUkVfUlhfQ1FFX1RZUEVfR1NJX09GRkxPQUQsCisJQ09SRV9SWF9DUUVfVFlQRV9TTE9XX1BBVEgsCisJTUFYX0NPUkVfUlhfQ1FFX1RZUEUKK307CisKK3N0cnVjdCBjb3JlX3J4X2Zhc3RfcGF0aF9jcWUgeworCXU4IHR5cGU7CisJdTggcGxhY2VtZW50X29mZnNldDsKKwlzdHJ1Y3QgcGFyc2luZ19hbmRfZXJyX2ZsYWdzIHBhcnNlX2ZsYWdzOworCV9fbGUxNiBwYWNrZXRfbGVuZ3RoOworCV9fbGUxNiB2bGFuOworCXN0cnVjdCBjb3JlX3J4X2NxZV9vcGFxdWVfZGF0YSBvcGFxdWVfZGF0YTsKKwlfX2xlMzIgcmVzZXJ2ZWRbNF07Cit9OworCitzdHJ1Y3QgY29yZV9yeF9nc2lfb2ZmbG9hZF9jcWUgeworCXU4IHR5cGU7CisJdTggZGF0YV9sZW5ndGhfZXJyb3I7CisJc3RydWN0IHBhcnNpbmdfYW5kX2Vycl9mbGFncyBwYXJzZV9mbGFnczsKKwlfX2xlMTYgZGF0YV9sZW5ndGg7CisJX19sZTE2IHZsYW47CisJX19sZTMyIHNyY19tYWNfYWRkcmhpOworCV9fbGUxNiBzcmNfbWFjX2FkZHJsbzsKKwl1OCByZXNlcnZlZDFbMl07CisJX19sZTMyIGdpZF9kc3RbNF07Cit9OworCitzdHJ1Y3QgY29yZV9yeF9zbG93X3BhdGhfY3FlIHsKKwl1OCB0eXBlOworCXU4IHJhbXJvZF9jbWRfaWQ7CisJX19sZTE2IGVjaG87CisJX19sZTMyIHJlc2VydmVkMVs3XTsKK307CisKK3VuaW9uIGNvcmVfcnhfY3FlX3VuaW9uIHsKKwlzdHJ1Y3QgY29yZV9yeF9mYXN0X3BhdGhfY3FlIHJ4X2NxZV9mcDsKKwlzdHJ1Y3QgY29yZV9yeF9nc2lfb2ZmbG9hZF9jcWUgcnhfY3FlX2dzaTsKKwlzdHJ1Y3QgY29yZV9yeF9zbG93X3BhdGhfY3FlIHJ4X2NxZV9zcDsKK307CisKK3N0cnVjdCBjb3JlX3J4X3N0YXJ0X3JhbXJvZF9kYXRhIHsKKwlzdHJ1Y3QgcmVncGFpciBiZF9iYXNlOworCXN0cnVjdCByZWdwYWlyIGNxZV9wYmxfYWRkcjsKKwlfX2xlMTYgbXR1OworCV9fbGUxNiBzYl9pZDsKKwl1OCBzYl9pbmRleDsKKwl1OCBjb21wbGV0ZV9jcWVfZmxnOworCXU4IGNvbXBsZXRlX2V2ZW50X2ZsZzsKKwl1OCBkcm9wX3R0bDBfZmxnOworCV9fbGUxNiBudW1fb2ZfcGJsX3BhZ2VzOworCXU4IGlubmVyX3ZsYW5fcmVtb3ZhbF9lbjsKKwl1OCBxdWV1ZV9pZDsKKwl1OCBtYWluX2Z1bmNfcXVldWU7CisJdTggbWZfc2lfYmNhc3RfYWNjZXB0X2FsbDsKKwl1OCBtZl9zaV9tY2FzdF9hY2NlcHRfYWxsOworCXN0cnVjdCBjb3JlX3J4X2FjdGlvbl9vbl9lcnJvciBhY3Rpb25fb25fZXJyb3I7CisJdTggZ3NpX29mZmxvYWRfZmxhZzsKKwl1OCByZXNlcnZlZFs3XTsKK307CisKK3N0cnVjdCBjb3JlX3J4X3N0b3BfcmFtcm9kX2RhdGEgeworCXU4IGNvbXBsZXRlX2NxZV9mbGc7CisJdTggY29tcGxldGVfZXZlbnRfZmxnOworCXU4IHF1ZXVlX2lkOworCXU4IHJlc2VydmVkMTsKKwlfX2xlMTYgcmVzZXJ2ZWQyWzJdOworfTsKKworc3RydWN0IGNvcmVfdHhfYmRfZmxhZ3MgeworCXU4IGFzX2JpdGZpZWxkOworI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0ZPUkNFX1ZMQU5fTU9ERV9NQVNLCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0ZPUkNFX1ZMQU5fTU9ERV9TSElGVAkwCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfVkxBTl9JTlNFUlRJT05fTUFTSwkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19WTEFOX0lOU0VSVElPTl9TSElGVAkxCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfU1RBUlRfQkRfTUFTSwkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19TVEFSVF9CRF9TSElGVAkyCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfSVBfQ1NVTV9NQVNLCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0lQX0NTVU1fU0hJRlQJMworI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0w0X0NTVU1fTUFTSwkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19MNF9DU1VNX1NISUZUCTQKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19JUFY2X0VYVF9NQVNLCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0lQVjZfRVhUX1NISUZUCTUKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19MNF9QUk9UT0NPTF9NQVNLCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX0w0X1BST1RPQ09MX1NISUZUCTYKKyNkZWZpbmUgQ09SRV9UWF9CRF9GTEFHU19MNF9QU0VVRE9fQ1NVTV9NT0RFX01BU0sJMHgxCisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfTDRfUFNFVURPX0NTVU1fTU9ERV9TSElGVCA3CisjZGVmaW5lIENPUkVfVFhfQkRfRkxBR1NfUk9DRV9GTEFWX01BU0sJCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX0ZMQUdTX1JPQ0VfRkxBVl9TSElGVAkxMgorCit9OworCitzdHJ1Y3QgY29yZV90eF9iZCB7CisJc3RydWN0IHJlZ3BhaXIgYWRkcjsKKwlfX2xlMTYgbmJ5dGVzOworCV9fbGUxNiBud192bGFuX29yX2xiX2VjaG87CisJdTggYml0ZmllbGQwOworI2RlZmluZSBDT1JFX1RYX0JEX05CRFNfTUFTSwkweEYKKyNkZWZpbmUgQ09SRV9UWF9CRF9OQkRTX1NISUZUCTAKKyNkZWZpbmUgQ09SRV9UWF9CRF9ST0NFX0ZMQVZfTUFTSwkweDEKKyNkZWZpbmUgQ09SRV9UWF9CRF9ST0NFX0ZMQVZfU0hJRlQJNAorI2RlZmluZSBDT1JFX1RYX0JEX1JFU0VSVkVEMF9NQVNLCTB4NworI2RlZmluZSBDT1JFX1RYX0JEX1JFU0VSVkVEMF9TSElGVAk1CisJc3RydWN0IGNvcmVfdHhfYmRfZmxhZ3MgYmRfZmxhZ3M7CisJX19sZTE2IGJpdGZpZWxkMTsKKyNkZWZpbmUgQ09SRV9UWF9CRF9MNF9IRFJfT0ZGU0VUX1dfTUFTSwkweDNGRkYKKyNkZWZpbmUgQ09SRV9UWF9CRF9MNF9IRFJfT0ZGU0VUX1dfU0hJRlQgMAorI2RlZmluZSBDT1JFX1RYX0JEX1RYX0RTVF9NQVNLCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX1RYX0RTVF9TSElGVAkxNAorI2RlZmluZSBDT1JFX1RYX0JEX1JFU0VSVkVEMV9NQVNLCTB4MQorI2RlZmluZSBDT1JFX1RYX0JEX1JFU0VSVkVEMV9TSElGVAkxNQorfTsKKworZW51bSBjb3JlX3R4X2Rlc3QgeworCUNPUkVfVFhfREVTVF9OVywKKwlDT1JFX1RYX0RFU1RfTEIsCisJTUFYX0NPUkVfVFhfREVTVAorfTsKKworc3RydWN0IGNvcmVfdHhfc3RhcnRfcmFtcm9kX2RhdGEgeworCXN0cnVjdCByZWdwYWlyIHBibF9iYXNlX2FkZHI7CisJX19sZTE2IG10dTsKKwlfX2xlMTYgc2JfaWQ7CisJdTggc2JfaW5kZXg7CisJdTggc3RhdHNfZW47CisJdTggc3RhdHNfaWQ7CisJdTggY29ubl90eXBlOworCV9fbGUxNiBwYmxfc2l6ZTsKKwlfX2xlMTYgcW1fcHFfaWQ7CisJdTggZ3NpX29mZmxvYWRfZmxhZzsKKwl1OCByZXNydmVkWzNdOworfTsKKworc3RydWN0IGNvcmVfdHhfc3RvcF9yYW1yb2RfZGF0YSB7CisJX19sZTMyIHJlc2VydmVkMFsyXTsKK307CisKIHN0cnVjdCBldGhfbXN0b3JtX3Blcl9wZl9zdGF0IHsKIAlzdHJ1Y3QgcmVncGFpciBncmVfZGlzY2FyZF9wa3RzOwogCXN0cnVjdCByZWdwYWlyIHZ4bGFuX2Rpc2NhcmRfcGt0czsKQEAgLTYzNiw5ICs4NzcsMzMgQEAKIH07CiAKIC8qIE1zdG9ybSBub24tdHJpZ2dlcmluZyBWRiB6b25lICovCitlbnVtIG1hbGljaW91c192Zl9lcnJvcl9pZCB7CisJTUFMSUNJT1VTX1ZGX05PX0VSUk9SLAorCVZGX1BGX0NIQU5ORUxfTk9UX1JFQURZLAorCVZGX1pPTkVfTVNHX05PVF9WQUxJRCwKKwlWRl9aT05FX0ZVTkNfTk9UX0VOQUJMRUQsCisJRVRIX1BBQ0tFVF9UT09fU01BTEwsCisJRVRIX0lMTEVHQUxfVkxBTl9NT0RFLAorCUVUSF9NVFVfVklPTEFUSU9OLAorCUVUSF9JTExFR0FMX0lOQkFORF9UQUdTLAorCUVUSF9WTEFOX0lOU0VSVF9BTkRfSU5CQU5EX1ZMQU4sCisJRVRIX0lMTEVHQUxfTkJEUywKKwlFVEhfRklSU1RfQkRfV09fU09QLAorCUVUSF9JTlNVRkZJQ0lFTlRfQkRTLAorCUVUSF9JTExFR0FMX0xTT19IRFJfTkJEUywKKwlFVEhfSUxMRUdBTF9MU09fTVNTLAorCUVUSF9aRVJPX1NJWkVfQkQsCisJRVRIX0lMTEVHQUxfTFNPX0hEUl9MRU4sCisJRVRIX0lOU1VGRklDSUVOVF9QQVlMT0FELAorCUVUSF9FRFBNX09VVF9PRl9TWU5DLAorCUVUSF9UVU5OX0lQVjZfRVhUX05CRF9FUlIsCisJRVRIX0NPTlRST0xfUEFDS0VUX1ZJT0xBVElPTiwKKwlNQVhfTUFMSUNJT1VTX1ZGX0VSUk9SX0lECit9OworCiBzdHJ1Y3QgbXN0b3JtX25vbl90cmlnZ2VyX3ZmX3pvbmUgewogCXN0cnVjdCBldGhfbXN0b3JtX3Blcl9xdWV1ZV9zdGF0IGV0aF9xdWV1ZV9zdGF0OwotCXN0cnVjdCBldGhfcnhfcHJvZF9kYXRhIGV0aF9yeF9xdWV1ZV9wcm9kdWNlcnNbRVRIX01BWF9OVU1fUlhfUVVFVUVTX1BFUl9WRl07CisJc3RydWN0IGV0aF9yeF9wcm9kX2RhdGEgZXRoX3J4X3F1ZXVlX3Byb2R1Y2Vyc1tFVEhfTUFYX05VTV9SWF9RVUVVRVNfUEVSX1ZGX1FVQURdOwogfTsKIAogLyogTXN0b3JtIFZGIHpvbmUgKi8KQEAgLTcwNSwxMyArOTcwLDE3IEBACiAKIHN0cnVjdCBwcm90b2NvbF9kY2JfZGF0YSB7CiAJdTggZGNiX2VuYWJsZV9mbGFnOworCXU4IHJlc2VydmVkX2E7CiAJdTggZGNiX3ByaW9yaXR5OwogCXU4IGRjYl90YzsKLQl1OCByZXNlcnZlZDsKKwl1OCByZXNlcnZlZF9iOworCXU4IHJlc2VydmVkMDsKIH07CiAKIHN0cnVjdCBwZl91cGRhdGVfdHVubmVsX2NvbmZpZyB7CiAJdTggdXBkYXRlX3J4X3BmX2Nsc3M7CisJdTggdXBkYXRlX3J4X2RlZl91Y2FzdF9jbHNzOworCXU4IHVwZGF0ZV9yeF9kZWZfbm9uX3VjYXN0X2Nsc3M7CiAJdTggdXBkYXRlX3R4X3BmX2Nsc3M7CiAJdTggc2V0X3Z4bGFuX3VkcF9wb3J0X2ZsZzsKIAl1OCBzZXRfZ2VuZXZlX3VkcF9wb3J0X2ZsZzsKQEAgLTcyNyw3ICs5OTYsNyBAQAogCXU4IHR1bm5lbF9jbHNzX2lwZ3JlOwogCV9fbGUxNiB2eGxhbl91ZHBfcG9ydDsKIAlfX2xlMTYgZ2VuZXZlX3VkcF9wb3J0OwotCV9fbGUxNiByZXNlcnZlZFszXTsKKwlfX2xlMTYgcmVzZXJ2ZWRbMl07CiB9OwogCiBzdHJ1Y3QgcGZfdXBkYXRlX3JhbXJvZF9kYXRhIHsKQEAgLTczNiwxNiArMTAwNSwxNyBAQAogCXU4IHVwZGF0ZV9mY29lX2RjYl9kYXRhX2ZsYWc7CiAJdTggdXBkYXRlX2lzY3NpX2RjYl9kYXRhX2ZsYWc7CiAJdTggdXBkYXRlX3JvY2VfZGNiX2RhdGFfZmxhZzsKKwl1OCB1cGRhdGVfcnJvY2VfZGNiX2RhdGFfZmxhZzsKIAl1OCB1cGRhdGVfaXdhcnBfZGNiX2RhdGFfZmxhZzsKIAl1OCB1cGRhdGVfbWZfdmxhbl9mbGFnOwotCXU4IHJlc2VydmVkOwogCXN0cnVjdCBwcm90b2NvbF9kY2JfZGF0YSBldGhfZGNiX2RhdGE7CiAJc3RydWN0IHByb3RvY29sX2RjYl9kYXRhIGZjb2VfZGNiX2RhdGE7CiAJc3RydWN0IHByb3RvY29sX2RjYl9kYXRhIGlzY3NpX2RjYl9kYXRhOwogCXN0cnVjdCBwcm90b2NvbF9kY2JfZGF0YSByb2NlX2RjYl9kYXRhOworCXN0cnVjdCBwcm90b2NvbF9kY2JfZGF0YSBycm9jZV9kY2JfZGF0YTsKIAlzdHJ1Y3QgcHJvdG9jb2xfZGNiX2RhdGEgaXdhcnBfZGNiX2RhdGE7CiAJX19sZTE2IG1mX3ZsYW47Ci0JX19sZTE2IHJlc2VydmVkMjsKKwlfX2xlMTYgcmVzZXJ2ZWQ7CiAJc3RydWN0IHBmX3VwZGF0ZV90dW5uZWxfY29uZmlnIHR1bm5lbF9jb25maWc7CiB9OwogCkBAIC03NjYsMTAgKzEwMzYsMTQgQEAKIAlNQVhfUFJPVE9DT0xfVkVSU0lPTl9BUlJBWV9LRVkKIH07CiAKLS8qIFBzdG9ybSBub24tdHJpZ2dlcmluZyBWRiB6b25lICovCitzdHJ1Y3QgcmRtYV9zZW50X3N0YXRzIHsKKwlzdHJ1Y3QgcmVncGFpciBzZW50X2J5dGVzOworCXN0cnVjdCByZWdwYWlyIHNlbnRfcGt0czsKK307CisKIHN0cnVjdCBwc3Rvcm1fbm9uX3RyaWdnZXJfdmZfem9uZSB7CiAJc3RydWN0IGV0aF9wc3Rvcm1fcGVyX3F1ZXVlX3N0YXQgZXRoX3F1ZXVlX3N0YXQ7Ci0Jc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWRbMl07CisJc3RydWN0IHJkbWFfc2VudF9zdGF0cyByZG1hX3N0YXRzOwogfTsKIAogLyogUHN0b3JtIFZGIHpvbmUgKi8KQEAgLTc4Niw3ICsxMDYwLDExIEBACiAJX19sZTE2IGVjaG87CiB9OwogCi0vKiBTbG93cGF0aCBFbGVtZW50IChTUFFFKSAqLworc3RydWN0IHJkbWFfcmN2X3N0YXRzIHsKKwlzdHJ1Y3QgcmVncGFpciByY3ZfYnl0ZXM7CisJc3RydWN0IHJlZ3BhaXIgcmN2X3BrdHM7Cit9OworCiBzdHJ1Y3Qgc2xvd19wYXRoX2VsZW1lbnQgewogCXN0cnVjdCByYW1yb2RfaGVhZGVyIGhkcjsKIAlzdHJ1Y3QgcmVncGFpciBkYXRhX3B0cjsKQEAgLTc5NCw3ICsxMDcyLDcgQEAKIAogLyogVHN0b3JtIG5vbi10cmlnZ2VyaW5nIFZGIHpvbmUgKi8KIHN0cnVjdCB0c3Rvcm1fbm9uX3RyaWdnZXJfdmZfem9uZSB7Ci0Jc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWRbMl07CisJc3RydWN0IHJkbWFfcmN2X3N0YXRzIHJkbWFfc3RhdHM7CiB9OwogCiBzdHJ1Y3QgdHN0b3JtX3Blcl9wb3J0X3N0YXQgewpAQCAtODAyLDkgKzEwODAsMTQgQEAKIAlzdHJ1Y3QgcmVncGFpciBtYWNfZXJyb3JfZGlzY2FyZDsKIAlzdHJ1Y3QgcmVncGFpciBtZnRhZ19maWx0ZXJfZGlzY2FyZDsKIAlzdHJ1Y3QgcmVncGFpciBldGhfbWFjX2ZpbHRlcl9kaXNjYXJkOwotCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkWzVdOworCXN0cnVjdCByZWdwYWlyIGxsMl9tYWNfZmlsdGVyX2Rpc2NhcmQ7CisJc3RydWN0IHJlZ3BhaXIgbGwyX2Nvbm5fZGlzYWJsZWRfZGlzY2FyZDsKKwlzdHJ1Y3QgcmVncGFpciBpc2NzaV9pcnJlZ3VsYXJfcGt0OworCXN0cnVjdCByZWdwYWlyIHJlc2VydmVkOworCXN0cnVjdCByZWdwYWlyIHJvY2VfaXJyZWd1bGFyX3BrdDsKIAlzdHJ1Y3QgcmVncGFpciBldGhfaXJyZWd1bGFyX3BrdDsKLQlzdHJ1Y3QgcmVncGFpciByZXNlcnZlZDFbMl07CisJc3RydWN0IHJlZ3BhaXIgcmVzZXJ2ZWQxOworCXN0cnVjdCByZWdwYWlyIHByZXJvY2VfaXJyZWd1bGFyX3BrdDsKIAlzdHJ1Y3QgcmVncGFpciBldGhfZ3JlX3R1bm5fZmlsdGVyX2Rpc2NhcmQ7CiAJc3RydWN0IHJlZ3BhaXIgZXRoX3Z4bGFuX3R1bm5fZmlsdGVyX2Rpc2NhcmQ7CiAJc3RydWN0IHJlZ3BhaXIgZXRoX2dlbmV2ZV90dW5uX2ZpbHRlcl9kaXNjYXJkOwpAQCAtODcwLDcgKzExNTMsMTMgQEAKIAlfX2xlMzIgcmVzZXJ2ZWQyOwogfTsKIAotLyogQXR0ZW50aW9ucyBzdGF0dXMgYmxvY2sgKi8KK2VudW0gdmZfem9uZV9zaXplX21vZGUgeworCVZGX1pPTkVfU0laRV9NT0RFX0RFRkFVTFQsCisJVkZfWk9ORV9TSVpFX01PREVfRE9VQkxFLAorCVZGX1pPTkVfU0laRV9NT0RFX1FVQUQsCisJTUFYX1ZGX1pPTkVfU0laRV9NT0RFCit9OworCiBzdHJ1Y3QgYXR0ZW5fc3RhdHVzX2Jsb2NrIHsKIAlfX2xlMzIgYXR0ZW5fYml0czsKIAlfX2xlMzIgYXR0ZW5fYWNrOwpAQCAtMTQ0MiwxMyArMTczMSw2IEBACiAJTUFYX0JJTl9EQkdfQlVGRkVSX1RZUEUKIH07CiAKLS8qIENoaXAgSURzICovCi1lbnVtIGNoaXBfaWRzIHsKLQlDSElQX1JFU0VSVkVELAotCUNISVBfQkJfQjAsCi0JQ0hJUF9SRVNFUlZFRDIsCi0JTUFYX0NISVBfSURTCi19OwogCiAvKiBBdHRlbnRpb24gYml0IG1hcHBpbmcgKi8KIHN0cnVjdCBkYmdfYXR0bl9iaXRfbWFwcGluZyB7CkBAIC0xNTI3LDYgKzE4MDksMzcxIEBACiAJTUFYX0RCR19BVFROX1RZUEUKIH07CiAKKy8qIGNvbmRpdGlvbiBoZWFkZXIgZm9yIHJlZ2lzdGVycyBkdW1wICovCitzdHJ1Y3QgZGJnX2R1bXBfY29uZF9oZHIgeworCXN0cnVjdCBkYmdfbW9kZV9oZHIgbW9kZTsgLyogTW9kZSBoZWFkZXIgKi8KKwl1OCBibG9ja19pZDsgLyogYmxvY2sgSUQgKi8KKwl1OCBkYXRhX3NpemU7IC8qIHNpemUgaW4gZHdvcmRzIG9mIHRoZSBkYXRhIGZvbGxvd2luZyB0aGlzIGhlYWRlciAqLworfTsKKworLyogbWVtb3J5IGRhdGEgZm9yIHJlZ2lzdGVycyBkdW1wICovCitzdHJ1Y3QgZGJnX2R1bXBfbWVtIHsKKwlfX2xlMzIgZHdvcmQwOworI2RlZmluZSBEQkdfRFVNUF9NRU1fQUREUkVTU19NQVNLICAgICAgIDB4RkZGRkZGCisjZGVmaW5lIERCR19EVU1QX01FTV9BRERSRVNTX1NISUZUICAgICAgMAorI2RlZmluZSBEQkdfRFVNUF9NRU1fTUVNX0dST1VQX0lEX01BU0sgIDB4RkYKKyNkZWZpbmUgREJHX0RVTVBfTUVNX01FTV9HUk9VUF9JRF9TSElGVCAyNAorCV9fbGUzMiBkd29yZDE7CisjZGVmaW5lIERCR19EVU1QX01FTV9MRU5HVEhfTUFTSyAgICAgICAgMHhGRkZGRkYKKyNkZWZpbmUgREJHX0RVTVBfTUVNX0xFTkdUSF9TSElGVCAgICAgICAwCisjZGVmaW5lIERCR19EVU1QX01FTV9SRVNFUlZFRF9NQVNLICAgICAgMHhGRgorI2RlZmluZSBEQkdfRFVNUF9NRU1fUkVTRVJWRURfU0hJRlQgICAgIDI0Cit9OworCisvKiByZWdpc3RlciBkYXRhIGZvciByZWdpc3RlcnMgZHVtcCAqLworc3RydWN0IGRiZ19kdW1wX3JlZyB7CisJX19sZTMyIGRhdGE7CisjZGVmaW5lIERCR19EVU1QX1JFR19BRERSRVNTX01BU0sgIDB4RkZGRkZGIC8qIHJlZ2lzdGVyIGFkZHJlc3MgKGluIGR3b3JkcykgKi8KKyNkZWZpbmUgREJHX0RVTVBfUkVHX0FERFJFU1NfU0hJRlQgMAorI2RlZmluZSBEQkdfRFVNUF9SRUdfTEVOR1RIX01BU0sgICAweEZGIC8qIHJlZ2lzdGVyIHNpemUgKGluIGR3b3JkcykgKi8KKyNkZWZpbmUgREJHX0RVTVBfUkVHX0xFTkdUSF9TSElGVCAgMjQKK307CisKKy8qIHNwbGl0IGhlYWRlciBmb3IgcmVnaXN0ZXJzIGR1bXAgKi8KK3N0cnVjdCBkYmdfZHVtcF9zcGxpdF9oZHIgeworCV9fbGUzMiBoZHI7CisjZGVmaW5lIERCR19EVU1QX1NQTElUX0hEUl9EQVRBX1NJWkVfTUFTSyAgICAgIDB4RkZGRkZGCisjZGVmaW5lIERCR19EVU1QX1NQTElUX0hEUl9EQVRBX1NJWkVfU0hJRlQgICAgIDAKKyNkZWZpbmUgREJHX0RVTVBfU1BMSVRfSERSX1NQTElUX1RZUEVfSURfTUFTSyAgMHhGRgorI2RlZmluZSBEQkdfRFVNUF9TUExJVF9IRFJfU1BMSVRfVFlQRV9JRF9TSElGVCAyNAorfTsKKworLyogY29uZGl0aW9uIGhlYWRlciBmb3IgaWRsZSBjaGVjayAqLworc3RydWN0IGRiZ19pZGxlX2Noa19jb25kX2hkciB7CisJc3RydWN0IGRiZ19tb2RlX2hkciBtb2RlOyAvKiBNb2RlIGhlYWRlciAqLworCV9fbGUxNiBkYXRhX3NpemU7IC8qIHNpemUgaW4gZHdvcmRzIG9mIHRoZSBkYXRhIGZvbGxvd2luZyB0aGlzIGhlYWRlciAqLworfTsKKworLyogSWRsZSBDaGVjayBjb25kaXRpb24gcmVnaXN0ZXIgKi8KK3N0cnVjdCBkYmdfaWRsZV9jaGtfY29uZF9yZWcgeworCV9fbGUzMiBkYXRhOworI2RlZmluZSBEQkdfSURMRV9DSEtfQ09ORF9SRUdfQUREUkVTU19NQVNLICAgMHhGRkZGRkYKKyNkZWZpbmUgREJHX0lETEVfQ0hLX0NPTkRfUkVHX0FERFJFU1NfU0hJRlQgIDAKKyNkZWZpbmUgREJHX0lETEVfQ0hLX0NPTkRfUkVHX0JMT0NLX0lEX01BU0sgIDB4RkYKKyNkZWZpbmUgREJHX0lETEVfQ0hLX0NPTkRfUkVHX0JMT0NLX0lEX1NISUZUIDI0CisJX19sZTE2IG51bV9lbnRyaWVzOyAvKiBudW1iZXIgb2YgcmVnaXN0ZXJzIGVudHJpZXMgdG8gY2hlY2sgKi8KKwl1OCBlbnRyeV9zaXplOyAvKiBzaXplIG9mIHJlZ2lzdGVycyBlbnRyeSAoaW4gZHdvcmRzKSAqLworCXU4IHN0YXJ0X2VudHJ5OyAvKiBpbmRleCBvZiB0aGUgZmlyc3QgZW50cnkgdG8gY2hlY2sgKi8KK307CisKKy8qIElkbGUgQ2hlY2sgaW5mbyByZWdpc3RlciAqLworc3RydWN0IGRiZ19pZGxlX2Noa19pbmZvX3JlZyB7CisJX19sZTMyIGRhdGE7CisjZGVmaW5lIERCR19JRExFX0NIS19JTkZPX1JFR19BRERSRVNTX01BU0sgICAweEZGRkZGRgorI2RlZmluZSBEQkdfSURMRV9DSEtfSU5GT19SRUdfQUREUkVTU19TSElGVCAgMAorI2RlZmluZSBEQkdfSURMRV9DSEtfSU5GT19SRUdfQkxPQ0tfSURfTUFTSyAgMHhGRgorI2RlZmluZSBEQkdfSURMRV9DSEtfSU5GT19SRUdfQkxPQ0tfSURfU0hJRlQgMjQKKwlfX2xlMTYgc2l6ZTsgLyogcmVnaXN0ZXIgc2l6ZSBpbiBkd29yZHMgKi8KKwlzdHJ1Y3QgZGJnX21vZGVfaGRyIG1vZGU7IC8qIE1vZGUgaGVhZGVyICovCit9OworCisvKiBJZGxlIENoZWNrIHJlZ2lzdGVyICovCit1bmlvbiBkYmdfaWRsZV9jaGtfcmVnIHsKKwlzdHJ1Y3QgZGJnX2lkbGVfY2hrX2NvbmRfcmVnIGNvbmRfcmVnOyAvKiBjb25kaXRpb24gcmVnaXN0ZXIgKi8KKwlzdHJ1Y3QgZGJnX2lkbGVfY2hrX2luZm9fcmVnIGluZm9fcmVnOyAvKiBpbmZvIHJlZ2lzdGVyICovCit9OworCisvKiBJZGxlIENoZWNrIHJlc3VsdCBoZWFkZXIgKi8KK3N0cnVjdCBkYmdfaWRsZV9jaGtfcmVzdWx0X2hkciB7CisJX19sZTE2IHJ1bGVfaWQ7IC8qIEZhaWxpbmcgcnVsZSBpbmRleCAqLworCV9fbGUxNiBtZW1fZW50cnlfaWQ7IC8qIEZhaWxpbmcgbWVtb3J5IGVudHJ5IGluZGV4ICovCisJdTggbnVtX2R1bXBlZF9jb25kX3JlZ3M7IC8qIG51bWJlciBvZiBkdW1wZWQgY29uZGl0aW9uIHJlZ2lzdGVycyAqLworCXU4IG51bV9kdW1wZWRfaW5mb19yZWdzOyAvKiBudW1iZXIgb2YgZHVtcGVkIGNvbmRpdGlvbiByZWdpc3RlcnMgKi8KKwl1OCBzZXZlcml0eTsgLyogZnJvbSBkYmdfaWRsZV9jaGtfc2V2ZXJpdHlfdHlwZXMgZW51bSAqLworCXU4IHJlc2VydmVkOworfTsKKworLyogSWRsZSBDaGVjayByZXN1bHQgcmVnaXN0ZXIgaGVhZGVyICovCitzdHJ1Y3QgZGJnX2lkbGVfY2hrX3Jlc3VsdF9yZWdfaGRyIHsKKwl1OCBkYXRhOworI2RlZmluZSBEQkdfSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfSVNfTUVNX01BU0sgIDB4MQorI2RlZmluZSBEQkdfSURMRV9DSEtfUkVTVUxUX1JFR19IRFJfSVNfTUVNX1NISUZUIDAKKyNkZWZpbmUgREJHX0lETEVfQ0hLX1JFU1VMVF9SRUdfSERSX1JFR19JRF9NQVNLICAweDdGCisjZGVmaW5lIERCR19JRExFX0NIS19SRVNVTFRfUkVHX0hEUl9SRUdfSURfU0hJRlQgMQorCXU4IHN0YXJ0X2VudHJ5OyAvKiBpbmRleCBvZiB0aGUgZmlyc3QgY2hlY2tlZCBlbnRyeSAqLworCV9fbGUxNiBzaXplOyAvKiByZWdpc3RlciBzaXplIGluIGR3b3JkcyAqLworfTsKKworLyogSWRsZSBDaGVjayBydWxlICovCitzdHJ1Y3QgZGJnX2lkbGVfY2hrX3J1bGUgeworCV9fbGUxNiBydWxlX2lkOyAvKiBJZGxlIENoZWNrIHJ1bGUgSUQgKi8KKwl1OCBzZXZlcml0eTsgLyogdmFsdWUgZnJvbSBkYmdfaWRsZV9jaGtfc2V2ZXJpdHlfdHlwZXMgZW51bSAqLworCXU4IGNvbmRfaWQ7IC8qIENvbmRpdGlvbiBJRCAqLworCXU4IG51bV9jb25kX3JlZ3M7IC8qIG51bWJlciBvZiBjb25kaXRpb24gcmVnaXN0ZXJzICovCisJdTggbnVtX2luZm9fcmVnczsgLyogbnVtYmVyIG9mIGluZm8gcmVnaXN0ZXJzICovCisJdTggbnVtX2ltbXM7IC8qIG51bWJlciBvZiBpbW1lZGlhdGVzIGluIHRoZSBjb25kaXRpb24gKi8KKwl1OCByZXNlcnZlZDE7CisJX19sZTE2IHJlZ19vZmZzZXQ7IC8qIG9mZnNldCBvZiB0aGlzIHJ1bGVzIHJlZ2lzdGVycyBpbiB0aGUgaWRsZSBjaGVjaworCQkJICAgICogcmVnaXN0ZXIgYXJyYXkgKGluIGRiZ19pZGxlX2Noa19yZWcgdW5pdHMpLgorCQkJICAgICovCisJX19sZTE2IGltbV9vZmZzZXQ7IC8qIG9mZnNldCBvZiB0aGlzIHJ1bGVzIGltbWVkaWF0ZSB2YWx1ZXMgaW4gdGhlCisJCQkgICAgKiBpbW1lZGlhdGUgdmFsdWVzIGFycmF5IChpbiBkd29yZHMpLgorCQkJICAgICovCit9OworCisvKiBJZGxlIENoZWNrIHJ1bGUgcGFyc2luZyBkYXRhICovCitzdHJ1Y3QgZGJnX2lkbGVfY2hrX3J1bGVfcGFyc2luZ19kYXRhIHsKKwlfX2xlMzIgZGF0YTsKKyNkZWZpbmUgREJHX0lETEVfQ0hLX1JVTEVfUEFSU0lOR19EQVRBX0hBU19GV19NU0dfTUFTSyAgMHgxCisjZGVmaW5lIERCR19JRExFX0NIS19SVUxFX1BBUlNJTkdfREFUQV9IQVNfRldfTVNHX1NISUZUIDAKKyNkZWZpbmUgREJHX0lETEVfQ0hLX1JVTEVfUEFSU0lOR19EQVRBX1NUUl9PRkZTRVRfTUFTSyAgMHg3RkZGRkZGRgorI2RlZmluZSBEQkdfSURMRV9DSEtfUlVMRV9QQVJTSU5HX0RBVEFfU1RSX09GRlNFVF9TSElGVCAxCit9OworCisvKiBpZGxlIGNoZWNrIHNldmVyaXR5IHR5cGVzICovCitlbnVtIGRiZ19pZGxlX2Noa19zZXZlcml0eV90eXBlcyB7CisJLyogaWRsZSBjaGVjayBmYWlsdXJlIHNob3VsZCBjYXVzZSBhbiBlcnJvciAqLworCUlETEVfQ0hLX1NFVkVSSVRZX0VSUk9SLAorCS8qIGlkbGUgY2hlY2sgZmFpbHVyZSBzaG91bGQgY2F1c2UgYW4gZXJyb3Igb25seSBpZiB0aGVyZXMgbm8gdHJhZmZpYyAqLworCUlETEVfQ0hLX1NFVkVSSVRZX0VSUk9SX05PX1RSQUZGSUMsCisJLyogaWRsZSBjaGVjayBmYWlsdXJlIHNob3VsZCBjYXVzZSBhIHdhcm5pbmcgKi8KKwlJRExFX0NIS19TRVZFUklUWV9XQVJOSU5HLAorCU1BWF9EQkdfSURMRV9DSEtfU0VWRVJJVFlfVFlQRVMKK307CisKKy8qIERlYnVnIEJ1cyBibG9jayBkYXRhICovCitzdHJ1Y3QgZGJnX2J1c19ibG9ja19kYXRhIHsKKwl1OCBlbmFibGVkOyAvKiBJbmRpY2F0ZXMgaWYgdGhlIGJsb2NrIGlzIGVuYWJsZWQgZm9yIHJlY29yZGluZyAoMC8xKSAqLworCXU4IGh3X2lkOyAvKiBIVyBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGJsb2NrICovCisJdTggbGluZV9udW07IC8qIERlYnVnIGxpbmUgbnVtYmVyIHRvIHNlbGVjdCAqLworCXU4IHJpZ2h0X3NoaWZ0OyAvKiBOdW1iZXIgb2YgdW5pdHMgdG8gIHJpZ2h0IHRoZSBkZWJ1ZyBkYXRhICgwLTMpICovCisJdTggY3ljbGVfZW47IC8qIDQtYml0IHZhbHVlOiBiaXQgaSBzZXQgLT4gdW5pdCBpIGlzIGVuYWJsZWQuICovCisJdTggZm9yY2VfdmFsaWQ7IC8qIDQtYml0IHZhbHVlOiBiaXQgaSBzZXQgLT4gdW5pdCBpIGlzIGZvcmNlZCB2YWxpZC4gKi8KKwl1OCBmb3JjZV9mcmFtZTsgLyogNC1iaXQgdmFsdWU6IGJpdCBpIHNldCAtPiB1bml0IGkgZnJhbWUgYml0IGlzIGZvcmNlZC4KKwkJCSAqLworCXU4IHJlc2VydmVkOworfTsKKworLyogRGVidWcgQnVzIENsaWVudHMgKi8KK2VudW0gZGJnX2J1c19jbGllbnRzIHsKKwlEQkdfQlVTX0NMSUVOVF9SQkNOLAorCURCR19CVVNfQ0xJRU5UX1JCQ1AsCisJREJHX0JVU19DTElFTlRfUkJDUiwKKwlEQkdfQlVTX0NMSUVOVF9SQkNULAorCURCR19CVVNfQ0xJRU5UX1JCQ1UsCisJREJHX0JVU19DTElFTlRfUkJDRiwKKwlEQkdfQlVTX0NMSUVOVF9SQkNYLAorCURCR19CVVNfQ0xJRU5UX1JCQ1MsCisJREJHX0JVU19DTElFTlRfUkJDSCwKKwlEQkdfQlVTX0NMSUVOVF9SQkNaLAorCURCR19CVVNfQ0xJRU5UX09USEVSX0VOR0lORSwKKwlEQkdfQlVTX0NMSUVOVF9USU1FU1RBTVAsCisJREJHX0JVU19DTElFTlRfQ1BVLAorCURCR19CVVNfQ0xJRU5UX1JCQ1ksCisJREJHX0JVU19DTElFTlRfUkJDUSwKKwlEQkdfQlVTX0NMSUVOVF9SQkNNLAorCURCR19CVVNfQ0xJRU5UX1JCQ0IsCisJREJHX0JVU19DTElFTlRfUkJDVywKKwlEQkdfQlVTX0NMSUVOVF9SQkNWLAorCU1BWF9EQkdfQlVTX0NMSUVOVFMKK307CisKKy8qIERlYnVnIEJ1cyBtZW1vcnkgYWRkcmVzcyAqLworc3RydWN0IGRiZ19idXNfbWVtX2FkZHIgeworCV9fbGUzMiBsbzsKKwlfX2xlMzIgaGk7Cit9OworCisvKiBEZWJ1ZyBCdXMgUENJIGJ1ZmZlciBkYXRhICovCitzdHJ1Y3QgZGJnX2J1c19wY2lfYnVmX2RhdGEgeworCXN0cnVjdCBkYmdfYnVzX21lbV9hZGRyIHBoeXNfYWRkcjsgLyogUENJIGJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzICovCisJc3RydWN0IGRiZ19idXNfbWVtX2FkZHIgdmlydF9hZGRyOyAvKiBQQ0kgYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyAqLworCV9fbGUzMiBzaXplOyAvKiBQQ0kgYnVmZmVyIHNpemUgaW4gYnl0ZXMgKi8KK307CisKKy8qIERlYnVnIEJ1cyBTdG9ybSBFSUQgcmFuZ2UgZmlsdGVyIHBhcmFtcyAqLworc3RydWN0IGRiZ19idXNfc3Rvcm1fZWlkX3JhbmdlX3BhcmFtcyB7CisJdTggbWluOyAvKiBNaW5pbWFsIGV2ZW50IElEIHRvIGZpbHRlciBvbiAqLworCXU4IG1heDsgLyogTWF4aW1hbCBldmVudCBJRCB0byBmaWx0ZXIgb24gKi8KK307CisKKy8qIERlYnVnIEJ1cyBTdG9ybSBFSUQgbWFzayBmaWx0ZXIgcGFyYW1zICovCitzdHJ1Y3QgZGJnX2J1c19zdG9ybV9laWRfbWFza19wYXJhbXMgeworCXU4IHZhbDsgLyogRXZlbnQgSUQgdmFsdWUgKi8KKwl1OCBtYXNrOyAvKiBFdmVudCBJRCBtYXNrLiAxcyBpbiB0aGUgbWFzayA9IGRvbnQgY2FyZSBiaXRzLiAqLworfTsKKworLyogRGVidWcgQnVzIFN0b3JtIEVJRCBmaWx0ZXIgcGFyYW1zICovCit1bmlvbiBkYmdfYnVzX3N0b3JtX2VpZF9wYXJhbXMgeworCXN0cnVjdCBkYmdfYnVzX3N0b3JtX2VpZF9yYW5nZV9wYXJhbXMgcmFuZ2U7CisJc3RydWN0IGRiZ19idXNfc3Rvcm1fZWlkX21hc2tfcGFyYW1zIG1hc2s7Cit9OworCisvKiBEZWJ1ZyBCdXMgU3Rvcm0gZGF0YSAqLworc3RydWN0IGRiZ19idXNfc3Rvcm1fZGF0YSB7CisJdTggZmFzdF9lbmFibGVkOworCXU4IGZhc3RfbW9kZTsKKwl1OCBzbG93X2VuYWJsZWQ7CisJdTggc2xvd19tb2RlOworCXU4IGh3X2lkOworCXU4IGVpZF9maWx0ZXJfZW47CisJdTggZWlkX3JhbmdlX25vdF9tYXNrOworCXU4IGNpZF9maWx0ZXJfZW47CisJdW5pb24gZGJnX2J1c19zdG9ybV9laWRfcGFyYW1zIGVpZF9maWx0ZXJfcGFyYW1zOworCV9fbGUxNiByZXNlcnZlZDsKKwlfX2xlMzIgY2lkOworfTsKKworLyogRGVidWcgQnVzIGRhdGEgKi8KK3N0cnVjdCBkYmdfYnVzX2RhdGEgeworCV9fbGUzMiBhcHBfdmVyc2lvbjsgLyogVGhlIHRvb2xzIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBhcHBsaWNhdGlvbiAqLworCXU4IHN0YXRlOyAvKiBUaGUgY3VycmVudCBkZWJ1ZyBidXMgc3RhdGUgKi8KKwl1OCBod19kd29yZHM7IC8qIEhXIGR3b3JkcyBwZXIgY3ljbGUgKi8KKwl1OCBuZXh0X2h3X2lkOyAvKiBOZXh0IEhXIElEIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBpbnB1dCAqLworCXU4IG51bV9lbmFibGVkX2Jsb2NrczsgLyogTnVtYmVyIG9mIGJsb2NrcyBlbmFibGVkIGZvciByZWNvcmRpbmcgKi8KKwl1OCBudW1fZW5hYmxlZF9zdG9ybXM7IC8qIE51bWJlciBvZiBTdG9ybXMgZW5hYmxlZCBmb3IgcmVjb3JkaW5nICovCisJdTggdGFyZ2V0OyAvKiBPdXRwdXQgdGFyZ2V0ICovCisJdTggbmV4dF90cmlnZ2VyX3N0YXRlOyAvKiBJRCBvZiBuZXh0IHRyaWdnZXIgc3RhdGUgdG8gYmUgYWRkZWQgKi8KKwl1OCBuZXh0X2NvbnN0cmFpbnRfaWQ7IC8qIElEIG9mIG5leHQgZmlsdGVyL3RyaWdnZXIgY29uc3RyYWludCB0byBiZQorCQkJCSogYWRkZWQuCisJCQkJKi8KKwl1OCBvbmVfc2hvdF9lbjsgLyogSW5kaWNhdGVzIGlmIG9uZS1zaG90IG1vZGUgaXMgZW5hYmxlZCAoMC8xKSAqLworCXU4IGdyY19pbnB1dF9lbjsgLyogSW5kaWNhdGVzIGlmIEdSQyByZWNvcmRpbmcgaXMgZW5hYmxlZCAoMC8xKSAqLworCXU4IHRpbWVzdGFtcF9pbnB1dF9lbjsgLyogSW5kaWNhdGVzIGlmIHRpbWVzdGFtcCByZWNvcmRpbmcgaXMgZW5hYmxlZAorCQkJCSogKDAvMSkuCisJCQkJKi8KKwl1OCBmaWx0ZXJfZW47IC8qIEluZGljYXRlcyBpZiB0aGUgcmVjb3JkaW5nIGZpbHRlciBpcyBlbmFibGVkICgwLzEpICovCisJdTggdHJpZ2dlcl9lbjsgLyogSW5kaWNhdGVzIGlmIHRoZSByZWNvcmRpbmcgdHJpZ2dlciBpcyBlbmFibGVkICgwLzEpICovCisJdTggYWRkaW5nX2ZpbHRlcjsgLyogSWYgdHJ1ZSwgdGhlIG5leHQgYWRkZWQgY29uc3RyYWludCBiZWxvbmcgdG8gdGhlCisJCQkgICAqIGZpbHRlci4gT3RoZXJ3aXNlLCBpdCBiZWxvbmdzIHRvIHRoZSBsYXN0IGFkZGVkCisJCQkgICAqIHRyaWdnZXIgc3RhdGUuIFZhbGlkIG9ubHkgaWYgZWl0aGVyIGZpbHRlciBvcgorCQkJICAgKiB0cmlnZ2VycyBhcmUgZW5hYmxlZC4KKwkJCSAgICovCisJdTggZmlsdGVyX3ByZV90cmlnZ2VyOyAvKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY29yZGluZyBmaWx0ZXIgc2hvdWxkIGJlCisJCQkJKiBhcHBsaWVkIGJlZm9yZSB0aGUgdHJpZ2dlci4gVmFsaWQgb25seSBpZiBib3RoCisJCQkJKiBmaWx0ZXIgYW5kIHRyaWdnZXIgYXJlIGVuYWJsZWQgKDAvMSkuCisJCQkJKi8KKwl1OCBmaWx0ZXJfcG9zdF90cmlnZ2VyOyAvKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY29yZGluZyBmaWx0ZXIgc2hvdWxkIGJlCisJCQkJICogYXBwbGllZCBhZnRlciB0aGUgdHJpZ2dlci4gVmFsaWQgb25seSBpZiBib3RoCisJCQkJICogZmlsdGVyIGFuZCB0cmlnZ2VyIGFyZSBlbmFibGVkICgwLzEpLgorCQkJCSAqLworCXU4IHVuaWZ5X2lucHV0czsgLyogSWYgdHJ1ZSwgYWxsIGlucHV0cyBhcmUgYXNzb2NpYXRlZCB3aXRoIEhXIElEIDAuCisJCQkgICogT3RoZXJ3aXNlLCBlYWNoIGlucHV0IGlzIGFzc2lnbmVkIGEgZGlmZmVyZW50IEhXIElECisJCQkgICogKDAvMSkuCisJCQkgICovCisJdTggcmN2X2Zyb21fb3RoZXJfZW5naW5lOyAvKiBJbmRpY2F0ZXMgaWYgdGhlIG90aGVyIGVuZ2luZSBzZW5kcyBpdCBOVworCQkJCSAgICogcmVjb3JkaW5nIHRvIHRoaXMgZW5naW5lICgwLzEpLgorCQkJCSAgICovCisJc3RydWN0IGRiZ19idXNfcGNpX2J1Zl9kYXRhIHBjaV9idWY7IC8qIERlYnVnIEJ1cyBQQ0kgYnVmZmVyIGRhdGEuIFZhbGlkCisJCQkJCSAgICAgICogb25seSB3aGVuIHRoZSB0YXJnZXQgaXMKKwkJCQkJICAgICAgKiBEQkdfQlVTX1RBUkdFVF9JRF9QQ0kuCisJCQkJCSAgICAgICovCisJX19sZTE2IHJlc2VydmVkOworCXN0cnVjdCBkYmdfYnVzX2Jsb2NrX2RhdGEgYmxvY2tzWzgwXTsvKiBEZWJ1ZyBCdXMgZGF0YSBmb3IgZWFjaCBibG9jayAqLworCXN0cnVjdCBkYmdfYnVzX3N0b3JtX2RhdGEgc3Rvcm1zWzZdOyAvKiBEZWJ1ZyBCdXMgZGF0YSBmb3IgZWFjaCBibG9jayAqLworfTsKKworLyogRGVidWcgYnVzIGZyYW1lIG1vZGVzICovCitlbnVtIGRiZ19idXNfZnJhbWVfbW9kZXMgeworCURCR19CVVNfRlJBTUVfTU9ERV8wSFdfNFNUID0gMCwgLyogMCBIVyBkd29yZHMsIDQgU3Rvcm0gZHdvcmRzICovCisJREJHX0JVU19GUkFNRV9NT0RFXzRIV18wU1QgPSAzLCAvKiA0IEhXIGR3b3JkcywgMCBTdG9ybSBkd29yZHMgKi8KKwlEQkdfQlVTX0ZSQU1FX01PREVfOEhXXzBTVCA9IDQsIC8qIDggSFcgZHdvcmRzLCAwIFN0b3JtIGR3b3JkcyAqLworCU1BWF9EQkdfQlVTX0ZSQU1FX01PREVTCit9OworCisvKiBEZWJ1ZyBidXMgc3RhdGVzICovCitlbnVtIGRiZ19idXNfc3RhdGVzIHsKKwlEQkdfQlVTX1NUQVRFX0lETEUsIC8qIGRlYnVnIGJ1cyBpZGxlIHN0YXRlIChub3QgcmVjb3JkaW5nKSAqLworCURCR19CVVNfU1RBVEVfUkVBRFksIC8qIGRlYnVnIGJ1cyBpcyByZWFkeSBmb3IgY29uZmlndXJhdGlvbiBhbmQKKwkJCSAgICAgICogcmVjb3JkaW5nLgorCQkJICAgICAgKi8KKwlEQkdfQlVTX1NUQVRFX1JFQ09SRElORywgLyogZGVidWcgYnVzIGlzIGN1cnJlbnRseSByZWNvcmRpbmcgKi8KKwlEQkdfQlVTX1NUQVRFX1NUT1BQRUQsIC8qIGRlYnVnIGJ1cyByZWNvcmRpbmcgaGFzIHN0b3BwZWQgKi8KKwlNQVhfREJHX0JVU19TVEFURVMKK307CisKKy8qIERlYnVnIGJ1cyB0YXJnZXQgSURzICovCitlbnVtIGRiZ19idXNfdGFyZ2V0cyB7CisJLyogcmVjb3JkcyBkZWJ1ZyBidXMgdG8gREJHIGJsb2NrIGludGVybmFsIGJ1ZmZlciAqLworCURCR19CVVNfVEFSR0VUX0lEX0lOVF9CVUYsCisJLyogcmVjb3JkcyBkZWJ1ZyBidXMgdG8gdGhlIE5XICovCisJREJHX0JVU19UQVJHRVRfSURfTklHLAorCS8qIHJlY29yZHMgZGVidWcgYnVzIHRvIGEgUENJIGJ1ZmZlciAqLworCURCR19CVVNfVEFSR0VUX0lEX1BDSSwKKwlNQVhfREJHX0JVU19UQVJHRVRTCit9OworCisvKiBHUkMgRHVtcCBkYXRhICovCitzdHJ1Y3QgZGJnX2dyY19kYXRhIHsKKwlfX2xlMzIgcGFyYW1fdmFsWzQwXTsgLyogVmFsdWUgb2YgZWFjaCBHUkMgcGFyYW1ldGVyLiBBcnJheSBzaXplIG11c3QKKwkJCSAgICAgICAqIG1hdGNoIHRoZSBlbnVtIGRiZ19ncmNfcGFyYW1zLgorCQkJICAgICAgICovCisJdTggcGFyYW1fc2V0X2J5X3VzZXJbNDBdOyAvKiBJbmRpY2F0ZXMgZm9yIGVhY2ggR1JDIHBhcmFtZXRlciBpZiBpdCB3YXMKKwkJCQkgICAqIHNldCBieSB0aGUgdXNlciAoMC8xKS4gQXJyYXkgc2l6ZSBtdXN0CisJCQkJICAgKiBtYXRjaCB0aGUgZW51bSBkYmdfZ3JjX3BhcmFtcy4KKwkJCQkgICAqLworfTsKKworLyogRGVidWcgR1JDIHBhcmFtcyAqLworZW51bSBkYmdfZ3JjX3BhcmFtcyB7CisJREJHX0dSQ19QQVJBTV9EVU1QX1RTVE9STSwgLyogZHVtcCBUc3Rvcm0gbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfTVNUT1JNLCAvKiBkdW1wIE1zdG9ybSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9VU1RPUk0sIC8qIGR1bXAgVXN0b3JtIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1hTVE9STSwgLyogZHVtcCBYc3Rvcm0gbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfWVNUT1JNLCAvKiBkdW1wIFlzdG9ybSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9QU1RPUk0sIC8qIGR1bXAgUHN0b3JtIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1JFR1MsIC8qIGR1bXAgbm9uLW1lbW9yeSByZWdpc3RlcnMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfUkFNLCAvKiBkdW1wIFN0b3JtIGludGVybmFsIFJBTXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfUEJVRiwgLyogZHVtcCBTdG9ybSBwYXNzaXZlIGJ1ZmZlciAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9JT1IsIC8qIGR1bXAgU3Rvcm0gSU9ScyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9WRkMsIC8qIGR1bXAgVkZDIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX0NNX0NUWCwgLyogZHVtcCBDTSBjb250ZXh0cyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9QWFAsIC8qIGR1bXAgUFhQIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1JTUywgLyogZHVtcCBSU1MgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfQ0FVLCAvKiBkdW1wIENBVSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9RTSwgLyogZHVtcCBRTSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9NQ1AsIC8qIGR1bXAgTUNQIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9SRVNFUlZFRCwgLyogcmVzZXJ2ZWQgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfQ0ZDLCAvKiBkdW1wIENGQyBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9JR1UsIC8qIGR1bXAgSUdVIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX0JSQiwgLyogZHVtcCBCUkIgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfQlRCLCAvKiBkdW1wIEJUQiBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9CTUIsIC8qIGR1bXAgQk1CIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX05JRywgLyogZHVtcCBOSUcgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfTVVMRCwgLyogZHVtcCBNVUxEIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1BSUywgLyogZHVtcCBQUlMgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfRE1BRSwgLyogZHVtcCBQUlMgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfVE0sIC8qIGR1bXAgVE0gKHRpbWVycykgbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfU0RNLCAvKiBkdW1wIFNETSBtZW1vcmllcyAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fRFVNUF9ESUYsIC8qIGR1bXAgRElGIG1lbW9yaWVzICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9EVU1QX1NUQVRJQywgLyogZHVtcCBzdGF0aWMgZGVidWcgZGF0YSAoMC8xKSAqLworCURCR19HUkNfUEFSQU1fVU5TVEFMTCwgLyogdW4tc3RhbGwgU3Rvcm1zIGFmdGVyIGR1bXAgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX05VTV9MQ0lEUywgLyogbnVtYmVyIG9mIExDSURzICgwLi4zMjApICovCisJREJHX0dSQ19QQVJBTV9OVU1fTFRJRFMsIC8qIG51bWJlciBvZiBMVElEcyAoMC4uMzIwKSAqLworCS8qIHByZXNldDogZXhjbHVkZSBhbGwgbWVtb3JpZXMgZnJvbSBkdW1wICgxIG9ubHkpICovCisJREJHX0dSQ19QQVJBTV9FWENMVURFX0FMTCwKKwkvKiBwcmVzZXQ6IGluY2x1ZGUgbWVtb3JpZXMgZm9yIGNyYXNoIGR1bXAgKDEgb25seSkgKi8KKwlEQkdfR1JDX1BBUkFNX0NSQVNILAorCS8qIHBlcmZvcm0gZHVtcCBvbmx5IGlmIE1GVyBpcyByZXNwb25kaW5nICgwLzEpICovCisJREJHX0dSQ19QQVJBTV9QQVJJVFlfU0FGRSwKKwlEQkdfR1JDX1BBUkFNX0RVTVBfQ00sIC8qIGR1bXAgQ00gbWVtb3JpZXMgKDAvMSkgKi8KKwlEQkdfR1JDX1BBUkFNX0RVTVBfUEhZLCAvKiBkdW1wIFBIWSBtZW1vcmllcyAoMC8xKSAqLworCU1BWF9EQkdfR1JDX1BBUkFNUworfTsKKworLyogRGVidWcgcmVzZXQgcmVnaXN0ZXJzICovCitlbnVtIGRiZ19yZXNldF9yZWdzIHsKKwlEQkdfUkVTRVRfUkVHX01JU0NTX1BMX1VBLAorCURCR19SRVNFVF9SRUdfTUlTQ1NfUExfSFYsCisJREJHX1JFU0VUX1JFR19NSVNDU19QTF9IVl8yLAorCURCR19SRVNFVF9SRUdfTUlTQ19QTF9VQSwKKwlEQkdfUkVTRVRfUkVHX01JU0NfUExfSFYsCisJREJHX1JFU0VUX1JFR19NSVNDX1BMX1BEQV9WTUFJTl8xLAorCURCR19SRVNFVF9SRUdfTUlTQ19QTF9QREFfVk1BSU5fMiwKKwlEQkdfUkVTRVRfUkVHX01JU0NfUExfUERBX1ZBVVgsCisJTUFYX0RCR19SRVNFVF9SRUdTCit9OworCiAvKiBEZWJ1ZyBzdGF0dXMgY29kZXMgKi8KIGVudW0gZGJnX3N0YXR1cyB7CiAJREJHX1NUQVRVU19PSywKQEAgLTE1NzksOSArMjIyNiw0NSBAQAogCURCR19TVEFUVVNfUkVHX0ZJRk9fQkFEX0RBVEEsCiAJREJHX1NUQVRVU19QUk9URUNUSU9OX09WRVJSSURFX0JBRF9EQVRBLAogCURCR19TVEFUVVNfREJHX0FSUkFZX05PVF9TRVQsCisJREJHX1NUQVRVU19NVUxUSV9CTE9DS1NfV0lUSF9GSUxURVIsCiAJTUFYX0RCR19TVEFUVVMKIH07CiAKKy8qIERlYnVnIFN0b3JtcyBJRHMgKi8KK2VudW0gZGJnX3N0b3JtcyB7CisJREJHX1RTVE9STV9JRCwKKwlEQkdfTVNUT1JNX0lELAorCURCR19VU1RPUk1fSUQsCisJREJHX1hTVE9STV9JRCwKKwlEQkdfWVNUT1JNX0lELAorCURCR19QU1RPUk1fSUQsCisJTUFYX0RCR19TVE9STVMKK307CisKKy8qIElkbGUgQ2hlY2sgZGF0YSAqLworc3RydWN0IGlkbGVfY2hrX2RhdGEgeworCV9fbGUzMiBidWZfc2l6ZTsgLyogSWRsZSBjaGVjayBidWZmZXIgc2l6ZSBpbiBkd29yZHMgKi8KKwl1OCBidWZfc2l6ZV9zZXQ7IC8qIEluZGljYXRlcyBpZiB0aGUgaWRsZSBjaGVjayBidWZmZXIgc2l6ZSB3YXMgc2V0CisJCQkgICogKDAvMSkuCisJCQkgICovCisJdTggcmVzZXJ2ZWQxOworCV9fbGUxNiByZXNlcnZlZDI7Cit9OworCisvKiBEZWJ1ZyBUb29scyBkYXRhIChwZXIgSFcgZnVuY3Rpb24pICovCitzdHJ1Y3QgZGJnX3Rvb2xzX2RhdGEgeworCXN0cnVjdCBkYmdfZ3JjX2RhdGEgZ3JjOyAvKiBHUkMgRHVtcCBkYXRhICovCisJc3RydWN0IGRiZ19idXNfZGF0YSBidXM7IC8qIERlYnVnIEJ1cyBkYXRhICovCisJc3RydWN0IGlkbGVfY2hrX2RhdGEgaWRsZV9jaGs7IC8qIElkbGUgQ2hlY2sgZGF0YSAqLworCXU4IG1vZGVfZW5hYmxlWzQwXTsgLyogSW5kaWNhdGVzIGlmIGEgbW9kZSBpcyBlbmFibGVkICgwLzEpICovCisJdTggYmxvY2tfaW5fcmVzZXRbODBdOyAvKiBJbmRpY2F0ZXMgaWYgYSBibG9jayBpcyBpbiByZXNldCBzdGF0ZSAoMC8xKS4KKwkJCQkqLworCXU4IGNoaXBfaWQ7IC8qIENoaXAgSUQgKGZyb20gZW51bSBjaGlwX2lkcykgKi8KKwl1OCBwbGF0Zm9ybV9pZDsgLyogUGxhdGZvcm0gSUQgKGZyb20gZW51bSBwbGF0Zm9ybV9pZHMpICovCisJdTggaW5pdGlhbGl6ZWQ7IC8qIEluZGljYXRlcyBpZiB0aGUgZGF0YSB3YXMgaW5pdGlhbGl6ZWQgKi8KKwl1OCByZXNlcnZlZDsKK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEhTSSBJbml0IEZ1bmN0aW9ucyBjb25zdGFudHMgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE1ODksNyArMjI3Miw0MSBAQAogLyogTnVtYmVyIG9mIFZMQU4gcHJpb3JpdGllcyAqLwogI2RlZmluZSBOVU1fT0ZfVkxBTl9QUklPUklUSUVTCTgKIAotLyogUU0gcGVyLXBvcnQgaW5pdCBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgaW5pdF9icmJfcmFtX3JlcSB7CisJX19sZTMyIGd1cmFudGVlZF9wZXJfdGM7CisJX19sZTMyIGhlYWRyb29tX3Blcl90YzsKKwlfX2xlMzIgbWluX3BrdF9zaXplOworCV9fbGUzMiBtYXhfcG9ydHNfcGVyX2VuZ2luZTsKKwl1OCBudW1fYWN0aXZlX3Rjc1tNQVhfTlVNX1BPUlRTXTsKK307CisKK3N0cnVjdCBpbml0X2V0c190Y19yZXEgeworCXU4IHVzZV9zcDsKKwl1OCB1c2Vfd2ZxOworCV9fbGUxNiB3ZWlnaHQ7Cit9OworCitzdHJ1Y3QgaW5pdF9ldHNfcmVxIHsKKwlfX2xlMzIgbXR1OworCXN0cnVjdCBpbml0X2V0c190Y19yZXEgdGNfcmVxW05VTV9PRl9UQ1NdOworfTsKKworc3RydWN0IGluaXRfbmlnX2xiX3JsX3JlcSB7CisJX19sZTE2IGxiX21hY19yYXRlOworCV9fbGUxNiBsYl9yYXRlOworCV9fbGUzMiBtdHU7CisJX19sZTE2IHRjX3JhdGVbTlVNX09GX1BIWVNfVENTXTsKK307CisKK3N0cnVjdCBpbml0X25pZ19wcmlfdGNfbWFwX2VudHJ5IHsKKwl1OCB0Y19pZDsKKwl1OCB2YWxpZDsKK307CisKK3N0cnVjdCBpbml0X25pZ19wcmlfdGNfbWFwX3JlcSB7CisJc3RydWN0IGluaXRfbmlnX3ByaV90Y19tYXBfZW50cnkgcHJpW05VTV9PRl9WTEFOX1BSSU9SSVRJRVNdOworfTsKKwogc3RydWN0IGluaXRfcW1fcG9ydF9wYXJhbXMgewogCXU4IGFjdGl2ZTsKIAl1OCBhY3RpdmVfcGh5c190Y3M7CkBAIC0xNjE5LDcgKzIzMzYsNyBAQAogCiAvKiBXaWR0aCBvZiBHUkMgYWRkcmVzcyBpbiBiaXRzIChhZGRyZXNzZXMgYXJlIHNwZWNpZmllZCBpbiBkd29yZHMpICovCiAjZGVmaW5lIEdSQ19BRERSX0JJVFMJMjMKLSNkZWZpbmUgTUFYX0dSQ19BRERSCSgoMSA8PCBHUkNfQUREUl9CSVRTKSAtIDEpCisjZGVmaW5lIE1BWF9HUkNfQUREUgkoQklUKEdSQ19BRERSX0JJVFMpIC0gMSkKIAogLyogaW5kaWNhdGVzIGFuIGluaXQgdGhhdCBzaG91bGQgYmUgYXBwbGllZCB0byBhbnkgcGhhc2UgSUQgKi8KICNkZWZpbmUgQU5ZX1BIQVNFX0lECTB4ZmZmZgpAQCAtMTYyNywxNSArMjM0NCw1MCBAQAogLyogTWF4IHNpemUgaW4gZHdvcmRzIG9mIGEgemlwcGVkIGFycmF5ICovCiAjZGVmaW5lIE1BWF9aSVBQRURfU0laRQk4MTkyCiAKK3N0cnVjdCBmd19hc3NlcnRzX3JhbV9zZWN0aW9uIHsKKwlfX2xlMTYgc2VjdGlvbl9yYW1fbGluZV9vZmZzZXQ7CisJX19sZTE2IHNlY3Rpb25fcmFtX2xpbmVfc2l6ZTsKKwl1OCBsaXN0X2R3b3JkX29mZnNldDsKKwl1OCBsaXN0X2VsZW1lbnRfZHdvcmRfc2l6ZTsKKwl1OCBsaXN0X251bV9lbGVtZW50czsKKwl1OCBsaXN0X25leHRfaW5kZXhfZHdvcmRfb2Zmc2V0OworfTsKKworc3RydWN0IGZ3X3Zlcl9udW0geworCXU4IG1ham9yOyAvKiBGaXJtd2FyZSBtYWpvciB2ZXJzaW9uIG51bWJlciAqLworCXU4IG1pbm9yOyAvKiBGaXJtd2FyZSBtaW5vciB2ZXJzaW9uIG51bWJlciAqLworCXU4IHJldjsgLyogRmlybXdhcmUgcmV2aXNpb24gdmVyc2lvbiBudW1iZXIgKi8KKwl1OCBlbmc7IC8qIEZpcm13YXJlIGVuZ2luZWVyaW5nIHZlcnNpb24gbnVtYmVyIChmb3IgYm9vdGxlZyB2ZXJzaW9ucykgKi8KK307CisKK3N0cnVjdCBmd192ZXJfaW5mbyB7CisJX19sZTE2IHRvb2xzX3ZlcjsgLyogVG9vbHMgdmVyc2lvbiBudW1iZXIgKi8KKwl1OCBpbWFnZV9pZDsgLyogRlcgaW1hZ2UgSUQgKGUuZy4gbWFpbikgKi8KKwl1OCByZXNlcnZlZDE7CisJc3RydWN0IGZ3X3Zlcl9udW0gbnVtOyAvKiBGVyB2ZXJzaW9uIG51bWJlciAqLworCV9fbGUzMiB0aW1lc3RhbXA7IC8qIEZXIFRpbWVzdGFtcCBpbiB1bml4IHRpbWUgIChzZWMuIHNpbmNlIDE5NzApICovCisJX19sZTMyIHJlc2VydmVkMjsKK307CisKK3N0cnVjdCBmd19pbmZvIHsKKwlzdHJ1Y3QgZndfdmVyX2luZm8gdmVyOworCXN0cnVjdCBmd19hc3NlcnRzX3JhbV9zZWN0aW9uIGZ3X2Fzc2VydHNfc2VjdGlvbjsKK307CisKK3N0cnVjdCBmd19pbmZvX2xvY2F0aW9uIHsKKwlfX2xlMzIgZ3JjX2FkZHI7CisJX19sZTMyIHNpemU7Cit9OworCiBlbnVtIGluaXRfbW9kZXMgewogCU1PREVfUkVTRVJWRUQsCiAJTU9ERV9CQl9CMCwKLQlNT0RFX1JFU0VSVkVEMiwKKwlNT0RFX0syLAogCU1PREVfQVNJQywKKwlNT0RFX1JFU0VSVkVEMiwKIAlNT0RFX1JFU0VSVkVEMywKIAlNT0RFX1JFU0VSVkVENCwKIAlNT0RFX1JFU0VSVkVENSwKLQlNT0RFX1JFU0VSVkVENiwKIAlNT0RFX1NGLAogCU1PREVfTUZfU0QsCiAJTU9ERV9NRl9TSSwKQEAgLTE2NDQsNyArMjM5Niw3IEBACiAJTU9ERV9QT1JUU19QRVJfRU5HXzQsCiAJTU9ERV8xMDBHLAogCU1PREVfNDBHLAotCU1PREVfUkVTRVJWRUQ3LAorCU1PREVfUkVTRVJWRUQ2LAogCU1BWF9JTklUX01PREVTCiB9OwogCkBAIC0xNjc0LDExICsyNDI2LDExIEBACiAKIC8qIGJpbmFyeSBpbml0IGJ1ZmZlciB0eXBlcyAqLwogZW51bSBiaW5faW5pdF9idWZmZXJfdHlwZSB7Ci0JQklOX0JVRl9GV19WRVJfSU5GTywKKwlCSU5fQlVGX0lOSVRfRldfVkVSX0lORk8sCiAJQklOX0JVRl9JTklUX0NNRCwKIAlCSU5fQlVGX0lOSVRfVkFMLAogCUJJTl9CVUZfSU5JVF9NT0RFX1RSRUUsCi0JQklOX0JVRl9JUk8sCisJQklOX0JVRl9JTklUX0lSTywKIAlNQVhfQklOX0lOSVRfQlVGRkVSX1RZUEUKIH07CiAKQEAgLTE5MDIsOCArMjY1NCwyNzYgQEAKIAlfX2xlMTYgc2l6ZTsKIH07CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQdWJsaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioKLSAqIEBicmllZiBxZWRfZGJnX3ByaW50X2F0dG4gLSBQcmludHMgYXR0ZW50aW9uIHJlZ2lzdGVycyB2YWx1ZXMgaW4gdGhlIHNwZWNpZmllZCByZXN1bHRzIHN0cnVjdC4KKyAqIEBicmllZiBxZWRfZGJnX3NldF9iaW5fcHRyIC0gU2V0cyBhIHBvaW50ZXIgdG8gdGhlIGJpbmFyeSBkYXRhIHdpdGggZGVidWcKKyAqCWFycmF5cy4KKyAqCisgKiBAcGFyYW0gYmluX3B0ciAtIGEgcG9pbnRlciB0byB0aGUgYmluYXJ5IGRhdGEgd2l0aCBkZWJ1ZyBhcnJheXMuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX3NldF9iaW5fcHRyKGNvbnN0IHU4ICogY29uc3QgYmluX3B0cik7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX2dyY19nZXRfZHVtcF9idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGZvcgorICoJR1JDIER1bXAuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBidWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGR3b3JkcykgZm9yIHRoZSBHUkMgRHVtcAorICoJZGF0YS4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2dyY19nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkgICAgICB1MzIgKmJ1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfZ3JjX2R1bXAgLSBEdW1wcyBHUkMgZGF0YSBpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gZHVtcF9idWYgLSBQb2ludGVyIHRvIHdyaXRlIHRoZSBjb2xsZWN0ZWQgR1JDIGRhdGEgaW50by4KKyAqIEBwYXJhbSBidWZfc2l6ZV9pbl9kd29yZHMgLSBTaXplIG9mIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGluIGR3b3Jkcy4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIE9VVDogbnVtYmVyIG9mIGR1bXBlZCBkd29yZHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICoJLSB0aGUgc3BlY2lmaWVkIGR1bXAgYnVmZmVyIGlzIHRvbyBzbWFsbAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19ncmNfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSB1MzIgKmR1bXBfYnVmLAorCQkJCSB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCSB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfaWRsZV9jaGtfZ2V0X2R1bXBfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZQorICoJZm9yIGlkbGUgY2hlY2sgcmVzdWx0cy4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGJ1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gZHdvcmRzKSBmb3IgdGhlIGlkbGUgY2hlY2sKKyAqCWRhdGEuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19pZGxlX2Noa19nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgIHUzMiAqYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19pZGxlX2Noa19kdW1wIC0gUGVyZm9ybXMgaWRsZSBjaGVjayBhbmQgd3JpdGVzIHRoZSByZXN1bHRzCisgKglpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gZHVtcF9idWYgLSBQb2ludGVyIHRvIHdyaXRlIHRoZSBpZGxlIGNoZWNrIGRhdGEgaW50by4KKyAqIEBwYXJhbSBidWZfc2l6ZV9pbl9kd29yZHMgLSBTaXplIG9mIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGluIGR3b3Jkcy4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIE9VVDogbnVtYmVyIG9mIGR1bXBlZCBkd29yZHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICoJLSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpcyB0b28gc21hbGwKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfaWRsZV9jaGtfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICAgICB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCSAgICAgIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19tY3BfdHJhY2VfZ2V0X2R1bXBfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZQorICoJZm9yIG1jcCB0cmFjZSByZXN1bHRzLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBkd29yZHMpIGZvciBtY3AgdHJhY2UgZGF0YS4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKgktIHRoZSB0cmFjZSBkYXRhIGluIE1DUCBzY3JhdGNocGFkIGNvbnRhaW4gYW4gaW52YWxpZCBzaWduYXR1cmUKKyAqCS0gdGhlIGJ1bmRsZSBJRCBpbiBOVlJBTSBpcyBpbnZhbGlkCisgKgktIHRoZSB0cmFjZSBtZXRhIGRhdGEgY2Fubm90IGJlIGZvdW5kIChpbiBOVlJBTSBvciBpbWFnZSBmaWxlKQorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19tY3BfdHJhY2VfZ2V0X2R1bXBfYnVmX3NpemUoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgIHUzMiAqYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19tY3BfdHJhY2VfZHVtcCAtIFBlcmZvcm1zIG1jcCB0cmFjZSBhbmQgd3JpdGVzIHRoZSByZXN1bHRzCisgKglpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gZHVtcF9idWYgLSBQb2ludGVyIHRvIHdyaXRlIHRoZSBtY3AgdHJhY2UgZGF0YSBpbnRvLgorICogQHBhcmFtIGJ1Zl9zaXplX2luX2R3b3JkcyAtIFNpemUgb2YgdGhlIHNwZWNpZmllZCBidWZmZXIgaW4gZHdvcmRzLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gT1VUOiBudW1iZXIgb2YgZHVtcGVkIGR3b3Jkcy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKgktIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGlzIHRvbyBzbWFsbAorICoJLSB0aGUgdHJhY2UgZGF0YSBpbiBNQ1Agc2NyYXRjaHBhZCBjb250YWluIGFuIGludmFsaWQgc2lnbmF0dXJlCisgKgktIHRoZSBidW5kbGUgSUQgaW4gTlZSQU0gaXMgaW52YWxpZAorICoJLSB0aGUgdHJhY2UgbWV0YSBkYXRhIGNhbm5vdCBiZSBmb3VuZCAoaW4gTlZSQU0gb3IgaW1hZ2UgZmlsZSkKKyAqCS0gdGhlIHRyYWNlIG1ldGEgZGF0YSBjYW5ub3QgYmUgcmVhZCAoZnJvbSBOVlJBTSBvciBpbWFnZSBmaWxlKQorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19tY3BfdHJhY2VfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCSAgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgICAgICB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCSAgICAgICB1MzIgKm51bV9kdW1wZWRfZHdvcmRzKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfcmVnX2ZpZm9fZ2V0X2R1bXBfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZQorICoJZm9yIGdyYyB0cmFjZSBmaWZvIHJlc3VsdHMuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBidWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGR3b3JkcykgZm9yIHJlZyBmaWZvIGRhdGEuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19yZWdfZmlmb19nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSAgIHUzMiAqYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19yZWdfZmlmb19kdW1wIC0gUmVhZHMgdGhlIHJlZyBmaWZvIGFuZCB3cml0ZXMgdGhlIHJlc3VsdHMgaW50bworICoJdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIFBvaW50ZXIgdG8gd3JpdGUgdGhlIHJlZyBmaWZvIGRhdGEgaW50by4KKyAqIEBwYXJhbSBidWZfc2l6ZV9pbl9kd29yZHMgLSBTaXplIG9mIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGluIGR3b3Jkcy4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIE9VVDogbnVtYmVyIG9mIGR1bXBlZCBkd29yZHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICoJLSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpcyB0b28gc21hbGwKKyAqCS0gRE1BRSB0cmFuc2FjdGlvbiBmYWlsZWQKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfcmVnX2ZpZm9fZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkgICAgICBzdHJ1Y3QgcWVkX3B0dCAqcF9wdHQsCisJCQkJICAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkgICAgICB1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCSAgICAgIHUzMiAqbnVtX2R1bXBlZF9kd29yZHMpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19pZ3VfZmlmb19nZXRfZHVtcF9idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplCisgKglmb3IgdGhlIElHVSBmaWZvIHJlc3VsdHMuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBidWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGR3b3JkcykgZm9yIHRoZSBJR1UgZmlmbworICoJZGF0YS4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2lndV9maWZvX2dldF9kdW1wX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgdTMyICpidWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX2lndV9maWZvX2R1bXAgLSBSZWFkcyB0aGUgSUdVIGZpZm8gYW5kIHdyaXRlcyB0aGUgcmVzdWx0cyBpbnRvCisgKgl0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGR1bXBfYnVmIC0gUG9pbnRlciB0byB3cml0ZSB0aGUgSUdVIGZpZm8gZGF0YSBpbnRvLgorICogQHBhcmFtIGJ1Zl9zaXplX2luX2R3b3JkcyAtIFNpemUgb2YgdGhlIHNwZWNpZmllZCBidWZmZXIgaW4gZHdvcmRzLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gT1VUOiBudW1iZXIgb2YgZHVtcGVkIGR3b3Jkcy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOgorICoJLSB0aGUgdmVyc2lvbiB3YXNuJ3Qgc2V0CisgKgktIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGlzIHRvbyBzbWFsbAorICoJLSBETUFFIHRyYW5zYWN0aW9uIGZhaWxlZAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19pZ3VfZmlmb19kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCSAgICAgIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCSAgICAgIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJICAgICAgdTMyICpudW1fZHVtcGVkX2R3b3Jkcyk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX3Byb3RlY3Rpb25fb3ZlcnJpZGVfZ2V0X2R1bXBfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZAorICoJYnVmZmVyIHNpemUgZm9yIHByb3RlY3Rpb24gb3ZlcnJpZGUgd2luZG93IHJlc3VsdHMuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gcF9wdHQgLSBQdHQgd2luZG93IHVzZWQgZm9yIHdyaXRpbmcgdGhlIHJlZ2lzdGVycy4KKyAqIEBwYXJhbSBidWZfc2l6ZSAtIE9VVDogcmVxdWlyZWQgYnVmZmVyIHNpemUgKGluIGR3b3JkcykgZm9yIHByb3RlY3Rpb24KKyAqCW92ZXJyaWRlIGRhdGEuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICogT3RoZXJ3aXNlLCByZXR1cm5zIG9rLgorICovCitlbnVtIGRiZ19zdGF0dXMKK3FlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkgICAgICB1MzIgKmJ1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9kdW1wIC0gUmVhZHMgcHJvdGVjdGlvbiBvdmVycmlkZSB3aW5kb3cKKyAqCWVudHJpZXMgYW5kIHdyaXRlcyB0aGUgcmVzdWx0cyBpbnRvIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIHBfcHR0IC0gUHR0IHdpbmRvdyB1c2VkIGZvciB3cml0aW5nIHRoZSByZWdpc3RlcnMuCisgKiBAcGFyYW0gZHVtcF9idWYgLSBQb2ludGVyIHRvIHdyaXRlIHRoZSBwcm90ZWN0aW9uIG92ZXJyaWRlIGRhdGEgaW50by4KKyAqIEBwYXJhbSBidWZfc2l6ZV9pbl9kd29yZHMgLSBTaXplIG9mIHRoZSBzcGVjaWZpZWQgYnVmZmVyIGluIGR3b3Jkcy4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIE9VVDogbnVtYmVyIG9mIGR1bXBlZCBkd29yZHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBob2xkczoKKyAqCS0gdGhlIHZlcnNpb24gd2Fzbid0IHNldAorICoJLSB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpcyB0b28gc21hbGwKKyAqCS0gRE1BRSB0cmFuc2FjdGlvbiBmYWlsZWQKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfcHJvdGVjdGlvbl9vdmVycmlkZV9kdW1wKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCwKKwkJCQkJCSB1MzIgKmR1bXBfYnVmLAorCQkJCQkJIHUzMiBidWZfc2l6ZV9pbl9kd29yZHMsCisJCQkJCQkgdTMyICpudW1fZHVtcGVkX2R3b3Jkcyk7CisvKioKKyAqIEBicmllZiBxZWRfZGJnX2Z3X2Fzc2VydHNfZ2V0X2R1bXBfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZCBidWZmZXIKKyAqCXNpemUgZm9yIEZXIEFzc2VydHMgcmVzdWx0cy4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGJ1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gZHdvcmRzKSBmb3IgRlcgQXNzZXJ0cyBkYXRhLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqIE90aGVyd2lzZSwgcmV0dXJucyBvay4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfZndfYXNzZXJ0c19nZXRfZHVtcF9idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQkJICAgICB1MzIgKmJ1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfZndfYXNzZXJ0c19kdW1wIC0gUmVhZHMgdGhlIEZXIEFzc2VydHMgYW5kIHdyaXRlcyB0aGUgcmVzdWx0cworICoJaW50byB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBwX3B0dCAtIFB0dCB3aW5kb3cgdXNlZCBmb3Igd3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorICogQHBhcmFtIGR1bXBfYnVmIC0gUG9pbnRlciB0byB3cml0ZSB0aGUgRlcgQXNzZXJ0cyBkYXRhIGludG8uCisgKiBAcGFyYW0gYnVmX3NpemVfaW5fZHdvcmRzIC0gU2l6ZSBvZiB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBpbiBkd29yZHMuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBPVVQ6IG51bWJlciBvZiBkdW1wZWQgZHdvcmRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgaG9sZHM6CisgKgktIHRoZSB2ZXJzaW9uIHdhc24ndCBzZXQKKyAqCS0gdGhlIHNwZWNpZmllZCBidWZmZXIgaXMgdG9vIHNtYWxsCisgKiBPdGhlcndpc2UsIHJldHVybnMgb2suCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfZGJnX2Z3X2Fzc2VydHNfZHVtcChzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJc3RydWN0IHFlZF9wdHQgKnBfcHR0LAorCQkJCQl1MzIgKmR1bXBfYnVmLAorCQkJCQl1MzIgYnVmX3NpemVfaW5fZHdvcmRzLAorCQkJCQl1MzIgKm51bV9kdW1wZWRfZHdvcmRzKTsKKy8qKgorICogQGJyaWVmIHFlZF9kYmdfcHJpbnRfYXR0biAtIFByaW50cyBhdHRlbnRpb24gcmVnaXN0ZXJzIHZhbHVlcyBpbiB0aGUKKyAqCXNwZWNpZmllZCByZXN1bHRzIHN0cnVjdC4KICAqCiAgKiBAcGFyYW0gcF9od2ZuCiAgKiBAcGFyYW0gcmVzdWx0cyAtIFBvaW50ZXIgdG8gdGhlIGF0dGVudGlvbiByZWFkIHJlc3VsdHMKQEAgLTE5MTUsNDcgKzI5MzUsMjQxIEBACiBlbnVtIGRiZ19zdGF0dXMgcWVkX2RiZ19wcmludF9hdHRuKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAogCQkJCSAgIHN0cnVjdCBkYmdfYXR0bl9ibG9ja19yZXN1bHQgKnJlc3VsdHMpOwogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ29uc3RhbnRzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNkZWZpbmUgTUFYX05BTUVfTEVOCTE2CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQdWJsaWMgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAqIEBicmllZiBxZWRfZGJnX3VzZXJfc2V0X2Jpbl9wdHIgLSBTZXRzIGEgcG9pbnRlciB0byB0aGUgYmluYXJ5IGRhdGEgd2l0aAorICoJZGVidWcgYXJyYXlzLgorICoKKyAqIEBwYXJhbSBiaW5fcHRyIC0gYSBwb2ludGVyIHRvIHRoZSBiaW5hcnkgZGF0YSB3aXRoIGRlYnVnIGFycmF5cy4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9kYmdfdXNlcl9zZXRfYmluX3B0cihjb25zdCB1OCAqIGNvbnN0IGJpbl9wdHIpOworLyoqCisgKiBAYnJpZWYgcWVkX2RiZ19nZXRfc3RhdHVzX3N0ciAtIFJldHVybnMgYSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgc3RhdHVzLgorICoKKyAqIEBwYXJhbSBzdGF0dXMgLSBhIGRlYnVnIHN0YXR1cyBjb2RlLgorICoKKyAqIEByZXR1cm4gYSBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgc3RhdHVzCisgKi8KK2NvbnN0IGNoYXIgKnFlZF9kYmdfZ2V0X3N0YXR1c19zdHIoZW51bSBkYmdfc3RhdHVzIHN0YXR1cyk7CisvKioKKyAqIEBicmllZiBxZWRfZ2V0X2lkbGVfY2hrX3Jlc3VsdHNfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZQorICoJZm9yIGlkbGUgY2hlY2sgcmVzdWx0cyAoaW4gYnl0ZXMpLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gaWRsZSBjaGVjayBkdW1wIGJ1ZmZlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIGZvciB0aGUgcGFyc2VkCisgKglyZXN1bHRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9nZXRfaWRsZV9jaGtfcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJCSAgdTMyICBudW1fZHVtcGVkX2R3b3JkcywKKwkJCQkJCSAgdTMyICpyZXN1bHRzX2J1Zl9zaXplKTsKKy8qKgorICogQGJyaWVmIHFlZF9wcmludF9pZGxlX2Noa19yZXN1bHRzIC0gUHJpbnRzIGlkbGUgY2hlY2sgcmVzdWx0cworICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gaWRsZSBjaGVjayBkdW1wIGJ1ZmZlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1ZiAtIGJ1ZmZlciBmb3IgcHJpbnRpbmcgdGhlIGlkbGUgY2hlY2sgcmVzdWx0cy4KKyAqIEBwYXJhbSBudW1fZXJyb3JzIC0gT1VUOiBudW1iZXIgb2YgZXJyb3JzIGZvdW5kIGluIGlkbGUgY2hlY2suCisgKiBAcGFyYW0gbnVtX3dhcm5pbmdzIC0gT1VUOiBudW1iZXIgb2Ygd2FybmluZ3MgZm91bmQgaW4gaWRsZSBjaGVjay4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfaWRsZV9jaGtfcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICBjaGFyICpyZXN1bHRzX2J1ZiwKKwkJCQkJICAgdTMyICpudW1fZXJyb3JzLAorCQkJCQkgICB1MzIgKm51bV93YXJuaW5ncyk7CisvKioKKyAqIEBicmllZiBxZWRfZ2V0X21jcF90cmFjZV9yZXN1bHRzX2J1Zl9zaXplIC0gUmV0dXJucyB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUKKyAqCWZvciBNQ1AgVHJhY2UgcmVzdWx0cyAoaW4gYnl0ZXMpLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gTUNQIFRyYWNlIGR1bXAgYnVmZmVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBieXRlcykgZm9yIHRoZSBwYXJzZWQKKyAqCXJlc3VsdHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2dldF9tY3BfdHJhY2VfcmVzdWx0c19idWZfc2l6ZShzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJCSAgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgICB1MzIgKnJlc3VsdHNfYnVmX3NpemUpOworLyoqCisgKiBAYnJpZWYgcWVkX3ByaW50X21jcF90cmFjZV9yZXN1bHRzIC0gUHJpbnRzIE1DUCBUcmFjZSByZXN1bHRzCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSBtY3AgdHJhY2UgZHVtcCBidWZmZXIsIHN0YXJ0aW5nIGZyb20gdGhlIGhlYWRlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1ZiAtIGJ1ZmZlciBmb3IgcHJpbnRpbmcgdGhlIG1jcCB0cmFjZSByZXN1bHRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9tY3BfdHJhY2VfcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgICBjaGFyICpyZXN1bHRzX2J1Zik7CisvKioKKyAqIEBicmllZiBxZWRfZ2V0X3JlZ19maWZvX3Jlc3VsdHNfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZQorICoJZm9yIHJlZ19maWZvIHJlc3VsdHMgKGluIGJ5dGVzKS4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIHJlZyBmaWZvIGR1bXAgYnVmZmVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBieXRlcykgZm9yIHRoZSBwYXJzZWQKKyAqCXJlc3VsdHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2dldF9yZWdfZmlmb19yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfcHJpbnRfcmVnX2ZpZm9fcmVzdWx0cyAtIFByaW50cyByZWcgZmlmbyByZXN1bHRzCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSByZWcgZmlmbyBkdW1wIGJ1ZmZlciwgc3RhcnRpbmcgZnJvbSB0aGUgaGVhZGVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmIC0gYnVmZmVyIGZvciBwcmludGluZyB0aGUgcmVnIGZpZm8gcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfcmVnX2ZpZm9fcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICBjaGFyICpyZXN1bHRzX2J1Zik7CisvKioKKyAqIEBicmllZiBxZWRfZ2V0X2lndV9maWZvX3Jlc3VsdHNfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZQorICoJZm9yIGlndV9maWZvIHJlc3VsdHMgKGluIGJ5dGVzKS4KKyAqCisgKiBAcGFyYW0gcF9od2ZuIC0gSFcgZGV2aWNlIGRhdGEKKyAqIEBwYXJhbSBkdW1wX2J1ZiAtIElHVSBmaWZvIGR1bXAgYnVmZmVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBieXRlcykgZm9yIHRoZSBwYXJzZWQKKyAqCXJlc3VsdHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMgcWVkX2dldF9pZ3VfZmlmb19yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCQkgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfcHJpbnRfaWd1X2ZpZm9fcmVzdWx0cyAtIFByaW50cyBJR1UgZmlmbyByZXN1bHRzCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSBJR1UgZmlmbyBkdW1wIGJ1ZmZlciwgc3RhcnRpbmcgZnJvbSB0aGUgaGVhZGVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmIC0gYnVmZmVyIGZvciBwcmludGluZyB0aGUgSUdVIGZpZm8gcmVzdWx0cy4KKyAqCisgKiBAcmV0dXJuIGVycm9yIGlmIHRoZSBwYXJzaW5nIGZhaWxzLCBvayBvdGhlcndpc2UuCisgKi8KK2VudW0gZGJnX3N0YXR1cyBxZWRfcHJpbnRfaWd1X2ZpZm9fcmVzdWx0cyhzdHJ1Y3QgcWVkX2h3Zm4gKnBfaHdmbiwKKwkJCQkJICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICBjaGFyICpyZXN1bHRzX2J1Zik7CisvKioKKyAqIEBicmllZiBxZWRfZ2V0X3Byb3RlY3Rpb25fb3ZlcnJpZGVfcmVzdWx0c19idWZfc2l6ZSAtIFJldHVybnMgdGhlIHJlcXVpcmVkCisgKglidWZmZXIgc2l6ZSBmb3IgcHJvdGVjdGlvbiBvdmVycmlkZSByZXN1bHRzIChpbiBieXRlcykuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSBwcm90ZWN0aW9uIG92ZXJyaWRlIGR1bXAgYnVmZmVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmX3NpemUgLSBPVVQ6IHJlcXVpcmVkIGJ1ZmZlciBzaXplIChpbiBieXRlcykgZm9yIHRoZSBwYXJzZWQKKyAqCXJlc3VsdHMuCisgKgorICogQHJldHVybiBlcnJvciBpZiB0aGUgcGFyc2luZyBmYWlscywgb2sgb3RoZXJ3aXNlLgorICovCitlbnVtIGRiZ19zdGF0dXMKK3FlZF9nZXRfcHJvdGVjdGlvbl9vdmVycmlkZV9yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkgICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCSAgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkgICAgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfcHJpbnRfcHJvdGVjdGlvbl9vdmVycmlkZV9yZXN1bHRzIC0gUHJpbnRzIHByb3RlY3Rpb24gb3ZlcnJpZGUKKyAqCXJlc3VsdHMuCisgKgorICogQHBhcmFtIHBfaHdmbiAtIEhXIGRldmljZSBkYXRhCisgKiBAcGFyYW0gZHVtcF9idWYgLSBwcm90ZWN0aW9uIG92ZXJyaWRlIGR1bXAgYnVmZmVyLCBzdGFydGluZyBmcm9tIHRoZSBoZWFkZXIuCisgKiBAcGFyYW0gbnVtX2R1bXBlZF9kd29yZHMgLSBudW1iZXIgb2YgZHdvcmRzIHRoYXQgd2VyZSBkdW1wZWQuCisgKiBAcGFyYW0gcmVzdWx0c19idWYgLSBidWZmZXIgZm9yIHByaW50aW5nIHRoZSByZWcgZmlmbyByZXN1bHRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9wcm90ZWN0aW9uX292ZXJyaWRlX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCQkgICAgICB1MzIgKmR1bXBfYnVmLAorCQkJCQkJICAgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICAgICAgY2hhciAqcmVzdWx0c19idWYpOworLyoqCisgKiBAYnJpZWYgcWVkX2dldF9md19hc3NlcnRzX3Jlc3VsdHNfYnVmX3NpemUgLSBSZXR1cm5zIHRoZSByZXF1aXJlZCBidWZmZXIgc2l6ZQorICoJZm9yIEZXIEFzc2VydHMgcmVzdWx0cyAoaW4gYnl0ZXMpLgorICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gRlcgQXNzZXJ0cyBkdW1wIGJ1ZmZlci4KKyAqIEBwYXJhbSBudW1fZHVtcGVkX2R3b3JkcyAtIG51bWJlciBvZiBkd29yZHMgdGhhdCB3ZXJlIGR1bXBlZC4KKyAqIEBwYXJhbSByZXN1bHRzX2J1Zl9zaXplIC0gT1VUOiByZXF1aXJlZCBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIGZvciB0aGUgcGFyc2VkCisgKglyZXN1bHRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9nZXRfZndfYXNzZXJ0c19yZXN1bHRzX2J1Zl9zaXplKHN0cnVjdCBxZWRfaHdmbiAqcF9od2ZuLAorCQkJCQkJICAgIHUzMiAqZHVtcF9idWYsCisJCQkJCQkgICAgdTMyIG51bV9kdW1wZWRfZHdvcmRzLAorCQkJCQkJICAgIHUzMiAqcmVzdWx0c19idWZfc2l6ZSk7CisvKioKKyAqIEBicmllZiBxZWRfcHJpbnRfZndfYXNzZXJ0c19yZXN1bHRzIC0gUHJpbnRzIEZXIEFzc2VydHMgcmVzdWx0cworICoKKyAqIEBwYXJhbSBwX2h3Zm4gLSBIVyBkZXZpY2UgZGF0YQorICogQHBhcmFtIGR1bXBfYnVmIC0gRlcgQXNzZXJ0cyBkdW1wIGJ1ZmZlciwgc3RhcnRpbmcgZnJvbSB0aGUgaGVhZGVyLgorICogQHBhcmFtIG51bV9kdW1wZWRfZHdvcmRzIC0gbnVtYmVyIG9mIGR3b3JkcyB0aGF0IHdlcmUgZHVtcGVkLgorICogQHBhcmFtIHJlc3VsdHNfYnVmIC0gYnVmZmVyIGZvciBwcmludGluZyB0aGUgRlcgQXNzZXJ0cyByZXN1bHRzLgorICoKKyAqIEByZXR1cm4gZXJyb3IgaWYgdGhlIHBhcnNpbmcgZmFpbHMsIG9rIG90aGVyd2lzZS4KKyAqLworZW51bSBkYmdfc3RhdHVzIHFlZF9wcmludF9md19hc3NlcnRzX3Jlc3VsdHMoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCisJCQkJCSAgICAgdTMyICpkdW1wX2J1ZiwKKwkJCQkJICAgICB1MzIgbnVtX2R1bXBlZF9kd29yZHMsCisJCQkJCSAgICAgY2hhciAqcmVzdWx0c19idWYpOwogLyogV2luIDIgKi8KLSNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19JR1VfQ01EIFwKLQkweDAwZjAwMFVMCisjZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfSUdVX0NNRAkweDAwZjAwMFVMCiAKIC8qIFdpbiAzICovCi0jZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfVFNETV9SQU0gXAotCTB4MDEwMDAwVUwKKyNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19UU0RNX1JBTQkweDAxMDAwMFVMCiAKIC8qIFdpbiA0ICovCi0jZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfTVNETV9SQU0gXAotCTB4MDExMDAwVUwKKyNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19NU0RNX1JBTQkweDAxMTAwMFVMCiAKIC8qIFdpbiA1ICovCi0jZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfTVNETV9SQU1fMTAyNCBcCi0JMHgwMTIwMDBVTAorI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX01TRE1fUkFNXzEwMjQJMHgwMTIwMDBVTAogCiAvKiBXaW4gNiAqLwotI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1VTRE1fUkFNIFwKLQkweDAxMzAwMFVMCisjZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfVVNETV9SQU0JMHgwMTMwMDBVTAogCiAvKiBXaW4gNyAqLwotI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1VTRE1fUkFNXzEwMjQgXAotCTB4MDE0MDAwVUwKKyNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19VU0RNX1JBTV8xMDI0CTB4MDE0MDAwVUwKIAogLyogV2luIDggKi8KLSNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19VU0RNX1JBTV8yMDQ4IFwKLQkweDAxNTAwMFVMCisjZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfVVNETV9SQU1fMjA0OAkweDAxNTAwMFVMCiAKIC8qIFdpbiA5ICovCi0jZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfWFNETV9SQU0gXAotCTB4MDE2MDAwVUwKKyNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19YU0RNX1JBTQkweDAxNjAwMFVMCiAKIC8qIFdpbiAxMCAqLwotI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1lTRE1fUkFNIFwKLQkweDAxNzAwMFVMCisjZGVmaW5lIEdUVF9CQVIwX01BUF9SRUdfWVNETV9SQU0JMHgwMTcwMDBVTAogCiAvKiBXaW4gMTEgKi8KLSNkZWZpbmUgR1RUX0JBUjBfTUFQX1JFR19QU0RNX1JBTSBcCi0JMHgwMTgwMDBVTAorI2RlZmluZSBHVFRfQkFSMF9NQVBfUkVHX1BTRE1fUkFNCTB4MDE4MDAwVUwKIAogLyoqCiAgKiBAYnJpZWYgcWVkX3FtX3BmX21lbV9zaXplIC0gcHJlcGFyZSBRTSBJTFQgc2l6ZXMKQEAgLTIwMDMsNyArMzIxNyw3IEBACiAJdTE2IG51bV92Zl9wcXM7CiAJdTggc3RhcnRfdnBvcnQ7CiAJdTggbnVtX3Zwb3J0czsKLQl1OCBwZl93ZnE7CisJdTE2IHBmX3dmcTsKIAl1MzIgcGZfcmw7CiAJc3RydWN0IGluaXRfcW1fcHFfcGFyYW1zICpwcV9wYXJhbXM7CiAJc3RydWN0IGluaXRfcW1fdnBvcnRfcGFyYW1zICp2cG9ydF9wYXJhbXM7CkBAIC0yMTM4LDYgKzMzNTIsOSBAQAogI2RlZmluZQlUU1RPUk1fUE9SVF9TVEFUX09GRlNFVChwb3J0X2lkKSBcCiAJKElST1sxXS5iYXNlICsgKChwb3J0X2lkKSAqIElST1sxXS5tMSkpCiAjZGVmaW5lCVRTVE9STV9QT1JUX1NUQVRfU0laRQkJCQkoSVJPWzFdLnNpemUpCisjZGVmaW5lIFRTVE9STV9MTDJfUE9SVF9TVEFUX09GRlNFVChwb3J0X2lkKSBcCisJKElST1syXS5iYXNlICsgKChwb3J0X2lkKSAqIElST1syXS5tMSkpCisjZGVmaW5lIFRTVE9STV9MTDJfUE9SVF9TVEFUX1NJWkUJCQkoSVJPWzJdLnNpemUpCiAjZGVmaW5lCVVTVE9STV9WRl9QRl9DSEFOTkVMX1JFQURZX09GRlNFVCh2Zl9pZCkgXAogCShJUk9bM10uYmFzZSArICgodmZfaWQpICogSVJPWzNdLm0xKSkKICNkZWZpbmUJVVNUT1JNX1ZGX1BGX0NIQU5ORUxfUkVBRFlfU0laRQkJCShJUk9bM10uc2l6ZSkKQEAgLTIxNTMsNDIgKzMzNzAsOTAgQEAKICNkZWZpbmUJVVNUT1JNX0NPTU1PTl9RVUVVRV9DT05TX09GRlNFVChxdWV1ZV96b25lX2lkKSBcCiAJKElST1s3XS5iYXNlICsgKChxdWV1ZV96b25lX2lkKSAqIElST1s3XS5tMSkpCiAjZGVmaW5lCVVTVE9STV9DT01NT05fUVVFVUVfQ09OU19TSVpFCQkJKElST1s3XS5zaXplKQorI2RlZmluZSBUU1RPUk1fTEwyX1JYX1BST0RTX09GRlNFVChjb3JlX3J4X3F1ZXVlX2lkKSBcCisJKElST1sxNF0uYmFzZSArCSgoY29yZV9yeF9xdWV1ZV9pZCkgKiBJUk9bMTRdLm0xKSkKKyNkZWZpbmUgVFNUT1JNX0xMMl9SWF9QUk9EU19TSVpFCQkJKElST1sxNF0uc2l6ZSkKKyNkZWZpbmUgQ09SRV9MTDJfVFNUT1JNX1BFUl9RVUVVRV9TVEFUX09GRlNFVChjb3JlX3J4X3F1ZXVlX2lkKSBcCisJKElST1sxNV0uYmFzZSArICgoY29yZV9yeF9xdWV1ZV9pZCkgKiBJUk9bMTVdLm0xKSkKKyNkZWZpbmUgQ09SRV9MTDJfVFNUT1JNX1BFUl9RVUVVRV9TVEFUX1NJWkUJCShJUk9bMTVdLnNpemUpCisjZGVmaW5lIENPUkVfTEwyX1VTVE9STV9QRVJfUVVFVUVfU1RBVF9PRkZTRVQoY29yZV9yeF9xdWV1ZV9pZCkgXAorCShJUk9bMTZdLmJhc2UgKwkoKGNvcmVfcnhfcXVldWVfaWQpICogSVJPWzE2XS5tMSkpCisjZGVmaW5lIENPUkVfTEwyX1VTVE9STV9QRVJfUVVFVUVfU1RBVF9TSVpFCQkoSVJPWzE2XS5zaXplKQorI2RlZmluZSBDT1JFX0xMMl9QU1RPUk1fUEVSX1FVRVVFX1NUQVRfT0ZGU0VUKGNvcmVfdHhfc3RhdHNfaWQpIFwKKwkoSVJPWzE3XS5iYXNlICsJKChjb3JlX3R4X3N0YXRzX2lkKSAqIElST1sxN10ubTEpKQorI2RlZmluZSBDT1JFX0xMMl9QU1RPUk1fUEVSX1FVRVVFX1NUQVRfU0laRQkoSVJPWzE3XS4Jc2l6ZSkKICNkZWZpbmUJTVNUT1JNX1FVRVVFX1NUQVRfT0ZGU0VUKHN0YXRfY291bnRlcl9pZCkgXAogCShJUk9bMThdLmJhc2UgKyAoKHN0YXRfY291bnRlcl9pZCkgKiBJUk9bMThdLm0xKSkKICNkZWZpbmUJTVNUT1JNX1FVRVVFX1NUQVRfU0laRQkJCQkoSVJPWzE4XS5zaXplKQogI2RlZmluZQlNU1RPUk1fRVRIX1BGX1BST0RTX09GRlNFVChxdWV1ZV9pZCkgXAogCShJUk9bMTldLmJhc2UgKyAoKHF1ZXVlX2lkKSAqIElST1sxOV0ubTEpKQogI2RlZmluZQlNU1RPUk1fRVRIX1BGX1BST0RTX1NJWkUJCQkoSVJPWzE5XS5zaXplKQotI2RlZmluZQlNU1RPUk1fVFBBX1RJTUVPVVRfVVNfT0ZGU0VUCQkJKElST1syMF0uYmFzZSkKLSNkZWZpbmUJTVNUT1JNX1RQQV9USU1FT1VUX1VTX1NJWkUJCQkoSVJPWzIwXS5zaXplKQorI2RlZmluZSBNU1RPUk1fRVRIX1ZGX1BST0RTX09GRlNFVCh2Zl9pZCwgdmZfcXVldWVfaWQpIFwKKwkoSVJPWzIwXS5iYXNlICsJKCh2Zl9pZCkgKiBJUk9bMjBdLm0xKSArICgodmZfcXVldWVfaWQpICogSVJPWzIwXS5tMikpCisjZGVmaW5lIE1TVE9STV9FVEhfVkZfUFJPRFNfU0laRQkJCShJUk9bMjBdLnNpemUpCisjZGVmaW5lCU1TVE9STV9UUEFfVElNRU9VVF9VU19PRkZTRVQJCQkoSVJPWzIxXS5iYXNlKQorI2RlZmluZQlNU1RPUk1fVFBBX1RJTUVPVVRfVVNfU0laRQkJCShJUk9bMjFdLnNpemUpCiAjZGVmaW5lCU1TVE9STV9FVEhfUEZfU1RBVF9PRkZTRVQocGZfaWQpIFwKLQkoSVJPWzIxXS5iYXNlICsgKChwZl9pZCkgKiBJUk9bMjFdLm0xKSkKKwkoSVJPWzIyXS5iYXNlICsgKChwZl9pZCkgKiBJUk9bMjJdLm0xKSkKICNkZWZpbmUJTVNUT1JNX0VUSF9QRl9TVEFUX1NJWkUJCQkJKElST1syMV0uc2l6ZSkKICNkZWZpbmUJVVNUT1JNX1FVRVVFX1NUQVRfT0ZGU0VUKHN0YXRfY291bnRlcl9pZCkgXAotCShJUk9bMjJdLmJhc2UgKyAoKHN0YXRfY291bnRlcl9pZCkgKiBJUk9bMjJdLm0xKSkKLSNkZWZpbmUJVVNUT1JNX1FVRVVFX1NUQVRfU0laRQkJCQkoSVJPWzIyXS5zaXplKQorCShJUk9bMjNdLmJhc2UgKyAoKHN0YXRfY291bnRlcl9pZCkgKiBJUk9bMjNdLm0xKSkKKyNkZWZpbmUJVVNUT1JNX1FVRVVFX1NUQVRfU0laRQkJCQkoSVJPWzIzXS5zaXplKQogI2RlZmluZQlVU1RPUk1fRVRIX1BGX1NUQVRfT0ZGU0VUKHBmX2lkKSBcCi0JKElST1syM10uYmFzZSArICgocGZfaWQpICogSVJPWzIzXS5tMSkpCi0jZGVmaW5lCVVTVE9STV9FVEhfUEZfU1RBVF9TSVpFCQkJCShJUk9bMjNdLnNpemUpCisJKElST1syNF0uYmFzZSArICgocGZfaWQpICogSVJPWzI0XS5tMSkpCisjZGVmaW5lCVVTVE9STV9FVEhfUEZfU1RBVF9TSVpFCQkJCShJUk9bMjRdLnNpemUpCiAjZGVmaW5lCVBTVE9STV9RVUVVRV9TVEFUX09GRlNFVChzdGF0X2NvdW50ZXJfaWQpIFwKLQkoSVJPWzI0XS5iYXNlICsgKChzdGF0X2NvdW50ZXJfaWQpICogSVJPWzI0XS5tMSkpCi0jZGVmaW5lCVBTVE9STV9RVUVVRV9TVEFUX1NJWkUJCQkJKElST1syNF0uc2l6ZSkKKwkoSVJPWzI1XS5iYXNlICsgKChzdGF0X2NvdW50ZXJfaWQpICogSVJPWzI1XS5tMSkpCisjZGVmaW5lCVBTVE9STV9RVUVVRV9TVEFUX1NJWkUJCQkJKElST1syNV0uc2l6ZSkKICNkZWZpbmUJUFNUT1JNX0VUSF9QRl9TVEFUX09GRlNFVChwZl9pZCkgXAotCShJUk9bMjVdLmJhc2UgKyAoKHBmX2lkKSAqIElST1syNV0ubTEpKQotI2RlZmluZQlQU1RPUk1fRVRIX1BGX1NUQVRfU0laRQkJCQkoSVJPWzI1XS5zaXplKQorCShJUk9bMjZdLmJhc2UgKyAoKHBmX2lkKSAqIElST1syNl0ubTEpKQorI2RlZmluZQlQU1RPUk1fRVRIX1BGX1NUQVRfU0laRQkJCQkoSVJPWzI2XS5zaXplKQogI2RlZmluZQlQU1RPUk1fQ1RMX0ZSQU1FX0VUSFRZUEVfT0ZGU0VUKGV0aHR5cGUpIFwKLQkoSVJPWzI2XS5iYXNlICsgKChldGh0eXBlKSAqIElST1syNl0ubTEpKQotI2RlZmluZQlQU1RPUk1fQ1RMX0ZSQU1FX0VUSFRZUEVfU0laRQkJCShJUk9bMjZdLnNpemUpCi0jZGVmaW5lCVRTVE9STV9FVEhfUFJTX0lOUFVUX09GRlNFVAkJCShJUk9bMjddLmJhc2UpCi0jZGVmaW5lCVRTVE9STV9FVEhfUFJTX0lOUFVUX1NJWkUJCQkoSVJPWzI3XS5zaXplKQorCShJUk9bMjddLmJhc2UgKyAoKGV0aHR5cGUpICogSVJPWzI3XS5tMSkpCisjZGVmaW5lCVBTVE9STV9DVExfRlJBTUVfRVRIVFlQRV9TSVpFCQkJKElST1syN10uc2l6ZSkKKyNkZWZpbmUJVFNUT1JNX0VUSF9QUlNfSU5QVVRfT0ZGU0VUCQkJKElST1syOF0uYmFzZSkKKyNkZWZpbmUJVFNUT1JNX0VUSF9QUlNfSU5QVVRfU0laRQkJCShJUk9bMjhdLnNpemUpCiAjZGVmaW5lCUVUSF9SWF9SQVRFX0xJTUlUX09GRlNFVChwZl9pZCkgXAotCShJUk9bMjhdLmJhc2UgKyAoKHBmX2lkKSAqIElST1syOF0ubTEpKQotI2RlZmluZQlFVEhfUlhfUkFURV9MSU1JVF9TSVpFCQkJCShJUk9bMjhdLnNpemUpCisJKElST1syOV0uYmFzZSArICgocGZfaWQpICogSVJPWzI5XS5tMSkpCisjZGVmaW5lCUVUSF9SWF9SQVRFX0xJTUlUX1NJWkUJCQkJKElST1syOV0uc2l6ZSkKICNkZWZpbmUJWFNUT1JNX0VUSF9RVUVVRV9aT05FX09GRlNFVChxdWV1ZV9pZCkgXAotCShJUk9bMjldLmJhc2UgKyAoKHF1ZXVlX2lkKSAqIElST1syOV0ubTEpKQotI2RlZmluZQlYU1RPUk1fRVRIX1FVRVVFX1pPTkVfU0laRQkJCShJUk9bMjldLnNpemUpCisJKElST1szMF0uYmFzZSArICgocXVldWVfaWQpICogSVJPWzMwXS5tMSkpCisjZGVmaW5lCVhTVE9STV9FVEhfUVVFVUVfWk9ORV9TSVpFCQkJKElST1szMF0uc2l6ZSkKKyNkZWZpbmUgVFNUT1JNX1NDU0lfQ01EUV9DT05TX09GRlNFVChjbWRxX3F1ZXVlX2lkKSBcCisJKElST1szNF0uYmFzZSArCSgoY21kcV9xdWV1ZV9pZCkgKiBJUk9bMzRdLm0xKSkKKyNkZWZpbmUgVFNUT1JNX1NDU0lfQ01EUV9DT05TX1NJWkUJCQkJKElST1szNF0uc2l6ZSkKKyNkZWZpbmUgVFNUT1JNX1NDU0lfQkRRX0VYVF9QUk9EX09GRlNFVChmdW5jX2lkLCBiZHFfaWQpIFwKKwkoSVJPWzM1XS5iYXNlICsJKChmdW5jX2lkKSAqIElST1szNV0ubTEpICsgKChiZHFfaWQpICogSVJPWzM1XS5tMikpCisjZGVmaW5lIFRTVE9STV9TQ1NJX0JEUV9FWFRfUFJPRF9TSVpFCQkJCShJUk9bMzVdLnNpemUpCisjZGVmaW5lIE1TVE9STV9TQ1NJX0JEUV9FWFRfUFJPRF9PRkZTRVQoZnVuY19pZCwgYmRxX2lkKSBcCisJKElST1szNl0uYmFzZSArCSgoZnVuY19pZCkgKiBJUk9bMzZdLm0xKSArICgoYmRxX2lkKSAqIElST1szNl0ubTIpKQorI2RlZmluZSBNU1RPUk1fU0NTSV9CRFFfRVhUX1BST0RfU0laRQkJCQkoSVJPWzM2XS5zaXplKQorI2RlZmluZSBUU1RPUk1fSVNDU0lfUlhfU1RBVFNfT0ZGU0VUKHBmX2lkKSBcCisJKElST1szN10uYmFzZSArCSgocGZfaWQpICogSVJPWzM3XS5tMSkpCisjZGVmaW5lIFRTVE9STV9JU0NTSV9SWF9TVEFUU19TSVpFCQkJCShJUk9bMzddLnNpemUpCisjZGVmaW5lIE1TVE9STV9JU0NTSV9SWF9TVEFUU19PRkZTRVQocGZfaWQpIFwKKwkoSVJPWzM4XS5iYXNlICsJKChwZl9pZCkgKiBJUk9bMzhdLm0xKSkKKyNkZWZpbmUgTVNUT1JNX0lTQ1NJX1JYX1NUQVRTX1NJWkUJCQkJKElST1szOF0uc2l6ZSkKKyNkZWZpbmUgVVNUT1JNX0lTQ1NJX1JYX1NUQVRTX09GRlNFVChwZl9pZCkgXAorCShJUk9bMzldLmJhc2UgKwkoKHBmX2lkKSAqIElST1szOV0ubTEpKQorI2RlZmluZSBVU1RPUk1fSVNDU0lfUlhfU1RBVFNfU0laRQkJCQkoSVJPWzM5XS5zaXplKQorI2RlZmluZSBYU1RPUk1fSVNDU0lfVFhfU1RBVFNfT0ZGU0VUKHBmX2lkKSBcCisJKElST1s0MF0uYmFzZSArCSgocGZfaWQpICogSVJPWzQwXS5tMSkpCisjZGVmaW5lIFhTVE9STV9JU0NTSV9UWF9TVEFUU19TSVpFCQkJCShJUk9bNDBdLnNpemUpCisjZGVmaW5lIFlTVE9STV9JU0NTSV9UWF9TVEFUU19PRkZTRVQocGZfaWQpIFwKKwkoSVJPWzQxXS5iYXNlICsJKChwZl9pZCkgKiBJUk9bNDFdLm0xKSkKKyNkZWZpbmUgWVNUT1JNX0lTQ1NJX1RYX1NUQVRTX1NJWkUJCQkJKElST1s0MV0uc2l6ZSkKKyNkZWZpbmUgUFNUT1JNX0lTQ1NJX1RYX1NUQVRTX09GRlNFVChwZl9pZCkgXAorCShJUk9bNDJdLmJhc2UgKwkoKHBmX2lkKSAqIElST1s0Ml0ubTEpKQorI2RlZmluZSBQU1RPUk1fSVNDU0lfVFhfU1RBVFNfU0laRQkJCQkoSVJPWzQyXS5zaXplKQorI2RlZmluZSBQU1RPUk1fUkRNQV9RVUVVRV9TVEFUX09GRlNFVChyZG1hX3N0YXRfY291bnRlcl9pZCkgXAorCShJUk9bNDVdLmJhc2UgKwkoKHJkbWFfc3RhdF9jb3VudGVyX2lkKSAqIElST1s0NV0ubTEpKQorI2RlZmluZSBQU1RPUk1fUkRNQV9RVUVVRV9TVEFUX1NJWkUJCQkJKElST1s0NV0uc2l6ZSkKKyNkZWZpbmUgVFNUT1JNX1JETUFfUVVFVUVfU1RBVF9PRkZTRVQocmRtYV9zdGF0X2NvdW50ZXJfaWQpIFwKKwkoSVJPWzQ2XS5iYXNlICsJKChyZG1hX3N0YXRfY291bnRlcl9pZCkgKiBJUk9bNDZdLm0xKSkKKyNkZWZpbmUgVFNUT1JNX1JETUFfUVVFVUVfU1RBVF9TSVpFCQkJCShJUk9bNDZdLnNpemUpCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXJvIGlyb19hcnJbNDZdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpcm8gaXJvX2Fycls0N10gPSB7CiAJezB4MCwgMHgwLCAweDAsIDB4MCwgMHg4fSwKIAl7MHg0Y2IwLCAweDc4LCAweDAsIDB4MCwgMHg3OH0sCiAJezB4NjMxOCwgMHgyMCwgMHgwLCAweDAsIDB4MjB9LApAQCAtMjIwMSwyMCArMzQ2NiwyMSBAQAogCXsweDNkZjAsIDB4MCwgMHgwLCAweDAsIDB4Nzh9LAogCXsweDI5YjAsIDB4MCwgMHgwLCAweDAsIDB4Nzh9LAogCXsweDRjMzgsIDB4MCwgMHgwLCAweDAsIDB4Nzh9LAotCXsweDRhNDgsIDB4MCwgMHgwLCAweDAsIDB4Nzh9LAorCXsweDQ5OTAsIDB4MCwgMHgwLCAweDAsIDB4Nzh9LAogCXsweDdlNDgsIDB4MCwgMHgwLCAweDAsIDB4Nzh9LAogCXsweGEyOCwgMHg4LCAweDAsIDB4MCwgMHg4fSwKIAl7MHg2MGY4LCAweDEwLCAweDAsIDB4MCwgMHgxMH0sCiAJezB4YjgyMCwgMHgzMCwgMHgwLCAweDAsIDB4MzB9LAogCXsweDk1YjgsIDB4MzAsIDB4MCwgMHgwLCAweDMwfSwKLQl7MHg0YzE4LCAweDgwLCAweDAsIDB4MCwgMHg0MH0sCisJezB4NGI2MCwgMHg4MCwgMHgwLCAweDAsIDB4NDB9LAogCXsweDFmOCwgMHg0LCAweDAsIDB4MCwgMHg0fSwKLQl7MHhjOWE4LCAweDAsIDB4MCwgMHgwLCAweDR9LAotCXsweDRjNTgsIDB4ODAsIDB4MCwgMHgwLCAweDIwfSwKKwl7MHg1M2EwLCAweDgwLCAweDQsIDB4MCwgMHg0fSwKKwl7MHhjOGYwLCAweDAsIDB4MCwgMHgwLCAweDR9LAorCXsweDRiYTAsIDB4ODAsIDB4MCwgMHgwLCAweDIwfSwKIAl7MHg4MDUwLCAweDQwLCAweDAsIDB4MCwgMHgzMH0sCiAJezB4ZTc3MCwgMHg2MCwgMHgwLCAweDAsIDB4NjB9LAogCXsweDJiNDgsIDB4ODAsIDB4MCwgMHgwLCAweDM4fSwKLQl7MHhkZjg4LCAweDc4LCAweDAsIDB4MCwgMHg3OH0sCisJezB4ZjE4OCwgMHg3OCwgMHgwLCAweDAsIDB4Nzh9LAogCXsweDFmOCwgMHg0LCAweDAsIDB4MCwgMHg0fSwKIAl7MHhhY2YwLCAweDAsIDB4MCwgMHgwLCAweGYwfSwKIAl7MHhhZGUwLCAweDgsIDB4MCwgMHgwLCAweDh9LApAQCAtMjIyNiw0NTUgKzM0OTIsNDU3IEBACiAJezB4MjAwLCAweDEwLCAweDgsIDB4MCwgMHg4fSwKIAl7MHhiNzgsIDB4MTAsIDB4OCwgMHgwLCAweDJ9LAogCXsweGQ4ODgsIDB4MzgsIDB4MCwgMHgwLCAweDI0fSwKLQl7MHgxMjEyMCwgMHgxMCwgMHgwLCAweDAsIDB4OH0sCi0JezB4MTFiMjAsIDB4MzgsIDB4MCwgMHgwLCAweDE4fSwKKwl7MHgxMmMzOCwgMHgxMCwgMHgwLCAweDAsIDB4OH0sCisJezB4MTFhYTAsIDB4MzgsIDB4MCwgMHgwLCAweDE4fSwKIAl7MHhhOGMwLCAweDMwLCAweDAsIDB4MCwgMHgxMH0sCiAJezB4ODZmOCwgMHgyOCwgMHgwLCAweDAsIDB4MTh9LAotCXsweGVmZjgsIDB4MTAsIDB4MCwgMHgwLCAweDEwfSwKKwl7MHgxMDFmOCwgMHgxMCwgMHgwLCAweDAsIDB4MTB9LAogCXsweGRkMDgsIDB4NDgsIDB4MCwgMHgwLCAweDM4fSwKLQl7MHhmNDYwLCAweDIwLCAweDAsIDB4MCwgMHgyMH0sCisJezB4MTA2NjAsIDB4MjAsIDB4MCwgMHgwLCAweDIwfSwKIAl7MHgyYjgwLCAweDgwLCAweDAsIDB4MCwgMHgxMH0sCiAJezB4NTAwMCwgMHgxMCwgMHgwLCAweDAsIDB4MTB9LAogfTsKIAogLyogUnVudGltZSBhcnJheSBvZmZzZXRzICovCi0jZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzBfUlRfT0ZGU0VUIDAKLSNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfMV9SVF9PRkZTRVQgMQotI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF8yX1JUX09GRlNFVCAyCi0jZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzNfUlRfT0ZGU0VUIDMKLSNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfNF9SVF9PRkZTRVQgNAotI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF81X1JUX09GRlNFVCA1Ci0jZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzZfUlRfT0ZGU0VUIDYKLSNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfN19SVF9PRkZTRVQgNwotI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF8wX1JUX09GRlNFVCA4Ci0jZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzFfUlRfT0ZGU0VUIDkKLSNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfMl9SVF9PRkZTRVQgMTAKLSNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfM19SVF9PRkZTRVQgMTEKLSNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfNF9SVF9PRkZTRVQgMTIKLSNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfNV9SVF9PRkZTRVQgMTMKLSNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfNl9SVF9PRkZTRVQgMTQKLSNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfN19SVF9PRkZTRVQgMTUKLSNkZWZpbmUgRE9SUV9SRUdfUEZfV0FLRV9BTExfUlRfT0ZGU0VUIDE2Ci0jZGVmaW5lIERPUlFfUkVHX1RBRzFfRVRIRVJUWVBFX1JUX09GRlNFVCAxNwotI2RlZmluZSBJR1VfUkVHX1BGX0NPTkZJR1VSQVRJT05fUlRfT0ZGU0VUIDE4Ci0jZGVmaW5lIElHVV9SRUdfVkZfQ09ORklHVVJBVElPTl9SVF9PRkZTRVQgMTkKLSNkZWZpbmUgSUdVX1JFR19BVFROX01TR19BRERSX0xfUlRfT0ZGU0VUIDIwCi0jZGVmaW5lIElHVV9SRUdfQVRUTl9NU0dfQUREUl9IX1JUX09GRlNFVCAyMQotI2RlZmluZSBJR1VfUkVHX0xFQURJTkdfRURHRV9MQVRDSF9SVF9PRkZTRVQgMjIKLSNkZWZpbmUgSUdVX1JFR19UUkFJTElOR19FREdFX0xBVENIX1JUX09GRlNFVCAyMwotI2RlZmluZSBDQVVfUkVHX0NRRV9BR0dfVU5JVF9TSVpFX1JUX09GRlNFVCAyNAotI2RlZmluZSBDQVVfUkVHX1NCX1ZBUl9NRU1PUllfUlRfT0ZGU0VUIDc2MQotI2RlZmluZSBDQVVfUkVHX1NCX1ZBUl9NRU1PUllfUlRfU0laRSA3MzYKLSNkZWZpbmUgQ0FVX1JFR19TQl9WQVJfTUVNT1JZX1JUX09GRlNFVCA3NjEKLSNkZWZpbmUgQ0FVX1JFR19TQl9WQVJfTUVNT1JZX1JUX1NJWkUgNzM2Ci0jZGVmaW5lIENBVV9SRUdfU0JfQUREUl9NRU1PUllfUlRfT0ZGU0VUIDE0OTcKLSNkZWZpbmUgQ0FVX1JFR19TQl9BRERSX01FTU9SWV9SVF9TSVpFIDczNgotI2RlZmluZSBDQVVfUkVHX1BJX01FTU9SWV9SVF9PRkZTRVQgMjIzMwotI2RlZmluZSBDQVVfUkVHX1BJX01FTU9SWV9SVF9TSVpFIDQ0MTYKLSNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfUkVTUF9JTklUSUFUT1JfVFlQRV9SVF9PRkZTRVQgNjY0OQotI2RlZmluZSBQUlNfUkVHX1RBU0tfSURfTUFYX0lOSVRJQVRPUl9QRl9SVF9PRkZTRVQgNjY1MAotI2RlZmluZSBQUlNfUkVHX1RBU0tfSURfTUFYX0lOSVRJQVRPUl9WRl9SVF9PRkZTRVQgNjY1MQotI2RlZmluZSBQUlNfUkVHX1RBU0tfSURfTUFYX1RBUkdFVF9QRl9SVF9PRkZTRVQgNjY1MgotI2RlZmluZSBQUlNfUkVHX1RBU0tfSURfTUFYX1RBUkdFVF9WRl9SVF9PRkZTRVQgNjY1MwotI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9UQ1BfUlRfT0ZGU0VUIDY2NTQKLSNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfRkNPRV9SVF9PRkZTRVQgNjY1NQotI2RlZmluZSBQUlNfUkVHX1NFQVJDSF9ST0NFX1JUX09GRlNFVCA2NjU2Ci0jZGVmaW5lIFBSU19SRUdfUk9DRV9ERVNUX1FQX01BWF9WRl9SVF9PRkZTRVQgNjY1NwotI2RlZmluZSBQUlNfUkVHX1JPQ0VfREVTVF9RUF9NQVhfUEZfUlRfT0ZGU0VUIDY2NTgKLSNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfT1BFTkZMT1dfUlRfT0ZGU0VUIDY2NTkKLSNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfTk9OX0lQX0FTX09QRU5GTE9XX1JUX09GRlNFVCA2NjYwCi0jZGVmaW5lIFBSU19SRUdfT1BFTkZMT1dfU1VQUE9SVF9PTkxZX0tOT1dOX09WRVJfSVBfUlRfT0ZGU0VUIDY2NjEKLSNkZWZpbmUgUFJTX1JFR19PUEVORkxPV19TRUFSQ0hfS0VZX01BU0tfUlRfT0ZGU0VUIDY2NjIKLSNkZWZpbmUgUFJTX1JFR19UQUdfRVRIRVJUWVBFXzBfUlRfT0ZGU0VUIDY2NjMKLSNkZWZpbmUgUFJTX1JFR19MSUdIVF9MMl9FVEhFUlRZUEVfRU5fUlRfT0ZGU0VUIDY2NjQKLSNkZWZpbmUgU1JDX1JFR19GSVJTVEZSRUVfUlRfT0ZGU0VUIDY2NjUKLSNkZWZpbmUgU1JDX1JFR19GSVJTVEZSRUVfUlRfU0laRSAyCi0jZGVmaW5lIFNSQ19SRUdfTEFTVEZSRUVfUlRfT0ZGU0VUIDY2NjcKLSNkZWZpbmUgU1JDX1JFR19MQVNURlJFRV9SVF9TSVpFIDIKLSNkZWZpbmUgU1JDX1JFR19DT1VOVEZSRUVfUlRfT0ZGU0VUIDY2NjkKLSNkZWZpbmUgU1JDX1JFR19OVU1CRVJfSEFTSF9CSVRTX1JUX09GRlNFVCA2NjcwCi0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9QX1NJWkVfUlRfT0ZGU0VUIDY2NzEKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX1BfU0laRV9SVF9PRkZTRVQgNjY3MgotI2RlZmluZSBQU1dSUTJfUkVHX1RNX1BfU0laRV9SVF9PRkZTRVQgNjY3MwotI2RlZmluZSBQU1dSUTJfUkVHX1FNX1BfU0laRV9SVF9PRkZTRVQgNjY3NAotI2RlZmluZSBQU1dSUTJfUkVHX1NSQ19QX1NJWkVfUlRfT0ZGU0VUIDY2NzUKLSNkZWZpbmUgUFNXUlEyX1JFR19UU0RNX1BfU0laRV9SVF9PRkZTRVQgNjY3NgotI2RlZmluZSBQU1dSUTJfUkVHX1RNX0ZJUlNUX0lMVF9SVF9PRkZTRVQgNjY3NwotI2RlZmluZSBQU1dSUTJfUkVHX1RNX0xBU1RfSUxUX1JUX09GRlNFVCA2Njc4Ci0jZGVmaW5lIFBTV1JRMl9SRUdfUU1fRklSU1RfSUxUX1JUX09GRlNFVCA2Njc5Ci0jZGVmaW5lIFBTV1JRMl9SRUdfUU1fTEFTVF9JTFRfUlRfT0ZGU0VUIDY2ODAKLSNkZWZpbmUgUFNXUlEyX1JFR19TUkNfRklSU1RfSUxUX1JUX09GRlNFVCA2NjgxCi0jZGVmaW5lIFBTV1JRMl9SRUdfU1JDX0xBU1RfSUxUX1JUX09GRlNFVCA2NjgyCi0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19GSVJTVF9JTFRfUlRfT0ZGU0VUIDY2ODMKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX0xBU1RfSUxUX1JUX09GRlNFVCA2Njg0Ci0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9GSVJTVF9JTFRfUlRfT0ZGU0VUIDY2ODUKLSNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX0xBU1RfSUxUX1JUX09GRlNFVCA2Njg2Ci0jZGVmaW5lIFBTV1JRMl9SRUdfVFNETV9GSVJTVF9JTFRfUlRfT0ZGU0VUIDY2ODcKLSNkZWZpbmUgUFNXUlEyX1JFR19UU0RNX0xBU1RfSUxUX1JUX09GRlNFVCA2Njg4Ci0jZGVmaW5lIFBTV1JRMl9SRUdfVE1fTlVNQkVSX09GX1BGX0JMT0NLU19SVF9PRkZTRVQgNjY4OQotI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfTlVNQkVSX09GX1BGX0JMT0NLU19SVF9PRkZTRVQgNjY5MAotI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfTlVNQkVSX09GX1BGX0JMT0NLU19SVF9PRkZTRVQgNjY5MQotI2RlZmluZSBQU1dSUTJfUkVHX1RNX1ZGX0JMT0NLU19SVF9PRkZTRVQgNjY5MgotI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfVkZfQkxPQ0tTX1JUX09GRlNFVCA2NjkzCi0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19WRl9CTE9DS1NfUlRfT0ZGU0VUIDY2OTQKLSNkZWZpbmUgUFNXUlEyX1JFR19UTV9CTE9DS1NfRkFDVE9SX1JUX09GRlNFVCA2Njk1Ci0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9CTE9DS1NfRkFDVE9SX1JUX09GRlNFVCA2Njk2Ci0jZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19CTE9DS1NfRkFDVE9SX1JUX09GRlNFVCA2Njk3Ci0jZGVmaW5lIFBTV1JRMl9SRUdfVkZfQkFTRV9SVF9PRkZTRVQgNjY5OAotI2RlZmluZSBQU1dSUTJfUkVHX1ZGX0xBU1RfSUxUX1JUX09GRlNFVCA2Njk5Ci0jZGVmaW5lIFBTV1JRMl9SRUdfV1JfTUJTMF9SVF9PRkZTRVQgNjcwMAotI2RlZmluZSBQU1dSUTJfUkVHX1JEX01CUzBfUlRfT0ZGU0VUIDY3MDEKLSNkZWZpbmUgUFNXUlEyX1JFR19EUkFNX0FMSUdOX1dSX1JUX09GRlNFVCA2NzAyCi0jZGVmaW5lIFBTV1JRMl9SRUdfRFJBTV9BTElHTl9SRF9SVF9PRkZTRVQgNjcwMwotI2RlZmluZSBQU1dSUTJfUkVHX0lMVF9NRU1PUllfUlRfT0ZGU0VUIDY3MDQKLSNkZWZpbmUgUFNXUlEyX1JFR19JTFRfTUVNT1JZX1JUX1NJWkUgMjIwMDAKLSNkZWZpbmUgUEdMVUVfUkVHX0JfVkZfQkFTRV9SVF9PRkZTRVQgMjg3MDQKLSNkZWZpbmUgUEdMVUVfUkVHX0JfQ0FDSEVfTElORV9TSVpFX1JUX09GRlNFVCAyODcwNQotI2RlZmluZSBQR0xVRV9SRUdfQl9QRl9CQVIwX1NJWkVfUlRfT0ZGU0VUIDI4NzA2Ci0jZGVmaW5lIFBHTFVFX1JFR19CX1BGX0JBUjFfU0laRV9SVF9PRkZTRVQgMjg3MDcKLSNkZWZpbmUgUEdMVUVfUkVHX0JfVkZfQkFSMV9TSVpFX1JUX09GRlNFVCAyODcwOAotI2RlZmluZSBUTV9SRUdfVkZfRU5BQkxFX0NPTk5fUlRfT0ZGU0VUIDI4NzA5Ci0jZGVmaW5lIFRNX1JFR19QRl9FTkFCTEVfQ09OTl9SVF9PRkZTRVQgMjg3MTAKLSNkZWZpbmUgVE1fUkVHX1BGX0VOQUJMRV9UQVNLX1JUX09GRlNFVCAyODcxMQotI2RlZmluZSBUTV9SRUdfR1JPVVBfU0laRV9SRVNPTFVUSU9OX0NPTk5fUlRfT0ZGU0VUIDI4NzEyCi0jZGVmaW5lIFRNX1JFR19HUk9VUF9TSVpFX1JFU09MVVRJT05fVEFTS19SVF9PRkZTRVQgMjg3MTMKLSNkZWZpbmUgVE1fUkVHX0NPTkZJR19DT05OX01FTV9SVF9PRkZTRVQgMjg3MTQKLSNkZWZpbmUgVE1fUkVHX0NPTkZJR19DT05OX01FTV9SVF9TSVpFIDQxNgotI2RlZmluZSBUTV9SRUdfQ09ORklHX1RBU0tfTUVNX1JUX09GRlNFVCAyOTEzMAotI2RlZmluZSBUTV9SRUdfQ09ORklHX1RBU0tfTUVNX1JUX1NJWkUgNTEyCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVfMF9SVF9PRkZTRVQgMjk2NDIKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRV8xX1JUX09GRlNFVCAyOTY0MwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFXzJfUlRfT0ZGU0VUIDI5NjQ0Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8wX1JUX09GRlNFVCAyOTY0NQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMV9SVF9PRkZTRVQgMjk2NDYKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzJfUlRfT0ZGU0VUIDI5NjQ3Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zX1JUX09GRlNFVCAyOTY0OAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNF9SVF9PRkZTRVQgMjk2NDkKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzVfUlRfT0ZGU0VUIDI5NjUwCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF82X1JUX09GRlNFVCAyOTY1MQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfN19SVF9PRkZTRVQgMjk2NTIKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzhfUlRfT0ZGU0VUIDI5NjUzCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF85X1JUX09GRlNFVCAyOTY1NAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTBfUlRfT0ZGU0VUIDI5NjU1Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xMV9SVF9PRkZTRVQgMjk2NTYKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzEyX1JUX09GRlNFVCAyOTY1NwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTNfUlRfT0ZGU0VUIDI5NjU4Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xNF9SVF9PRkZTRVQgMjk2NTkKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE1X1JUX09GRlNFVCAyOTY2MAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTZfUlRfT0ZGU0VUIDI5NjYxCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xN19SVF9PRkZTRVQgMjk2NjIKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE4X1JUX09GRlNFVCAyOTY2MwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTlfUlRfT0ZGU0VUIDI5NjY0Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yMF9SVF9PRkZTRVQgMjk2NjUKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzIxX1JUX09GRlNFVCAyOTY2NgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjJfUlRfT0ZGU0VUIDI5NjY3Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yM19SVF9PRkZTRVQgMjk2NjgKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI0X1JUX09GRlNFVCAyOTY2OQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjVfUlRfT0ZGU0VUIDI5NjcwCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yNl9SVF9PRkZTRVQgMjk2NzEKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI3X1JUX09GRlNFVCAyOTY3MgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjhfUlRfT0ZGU0VUIDI5NjczCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yOV9SVF9PRkZTRVQgMjk2NzQKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzMwX1JUX09GRlNFVCAyOTY3NQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzFfUlRfT0ZGU0VUIDI5Njc2Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zMl9SVF9PRkZTRVQgMjk2NzcKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzMzX1JUX09GRlNFVCAyOTY3OAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzRfUlRfT0ZGU0VUIDI5Njc5Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zNV9SVF9PRkZTRVQgMjk2ODAKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM2X1JUX09GRlNFVCAyOTY4MQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzdfUlRfT0ZGU0VUIDI5NjgyCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zOF9SVF9PRkZTRVQgMjk2ODMKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM5X1JUX09GRlNFVCAyOTY4NAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDBfUlRfT0ZGU0VUIDI5Njg1Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80MV9SVF9PRkZTRVQgMjk2ODYKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQyX1JUX09GRlNFVCAyOTY4NwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDNfUlRfT0ZGU0VUIDI5Njg4Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80NF9SVF9PRkZTRVQgMjk2ODkKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ1X1JUX09GRlNFVCAyOTY5MAotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDZfUlRfT0ZGU0VUIDI5NjkxCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80N19SVF9PRkZTRVQgMjk2OTIKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ4X1JUX09GRlNFVCAyOTY5MwotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDlfUlRfT0ZGU0VUIDI5Njk0Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81MF9SVF9PRkZTRVQgMjk2OTUKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzUxX1JUX09GRlNFVCAyOTY5NgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTJfUlRfT0ZGU0VUIDI5Njk3Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81M19SVF9PRkZTRVQgMjk2OTgKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU0X1JUX09GRlNFVCAyOTY5OQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTVfUlRfT0ZGU0VUIDI5NzAwCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81Nl9SVF9PRkZTRVQgMjk3MDEKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU3X1JUX09GRlNFVCAyOTcwMgotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNThfUlRfT0ZGU0VUIDI5NzAzCi0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81OV9SVF9PRkZTRVQgMjk3MDQKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzYwX1JUX09GRlNFVCAyOTcwNQotI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNjFfUlRfT0ZGU0VUIDI5NzA2Ci0jZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF82Ml9SVF9PRkZTRVQgMjk3MDcKLSNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzYzX1JUX09GRlNFVCAyOTcwOAotI2RlZmluZSBRTV9SRUdfQkFTRUFERFJPVEhFUlBRX1JUX09GRlNFVCAyOTcwOQotI2RlZmluZSBRTV9SRUdfQkFTRUFERFJPVEhFUlBRX1JUX1NJWkUgMTI4Ci0jZGVmaW5lIFFNX1JFR19WT1FDUkRMSU5FX1JUX09GRlNFVCAyOTgzNwotI2RlZmluZSBRTV9SRUdfVk9RQ1JETElORV9SVF9TSVpFIDIwCi0jZGVmaW5lIFFNX1JFR19WT1FJTklUQ1JETElORV9SVF9PRkZTRVQgMjk4NTcKLSNkZWZpbmUgUU1fUkVHX1ZPUUlOSVRDUkRMSU5FX1JUX1NJWkUgMjAKLSNkZWZpbmUgUU1fUkVHX0FGVUxMUU1CWVBUSFJQRldGUV9SVF9PRkZTRVQgMjk4NzcKLSNkZWZpbmUgUU1fUkVHX0FGVUxMUU1CWVBUSFJWUFdGUV9SVF9PRkZTRVQgMjk4NzgKLSNkZWZpbmUgUU1fUkVHX0FGVUxMUU1CWVBUSFJQRlJMX1JUX09GRlNFVCAyOTg3OQotI2RlZmluZSBRTV9SRUdfQUZVTExRTUJZUFRIUkdMQkxSTF9SVF9PRkZTRVQgMjk4ODAKLSNkZWZpbmUgUU1fUkVHX0FGVUxMT1BSVE5TVENDUkRNQVNLX1JUX09GRlNFVCAyOTg4MQotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8wX1JUX09GRlNFVCAyOTg4MgotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xX1JUX09GRlNFVCAyOTg4MwotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8yX1JUX09GRlNFVCAyOTg4NAotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8zX1JUX09GRlNFVCAyOTg4NQotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF80X1JUX09GRlNFVCAyOTg4NgotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF81X1JUX09GRlNFVCAyOTg4NwotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF82X1JUX09GRlNFVCAyOTg4OAotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF83X1JUX09GRlNFVCAyOTg4OQotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF84X1JUX09GRlNFVCAyOTg5MAotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF85X1JUX09GRlNFVCAyOTg5MQotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xMF9SVF9PRkZTRVQgMjk4OTIKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTFfUlRfT0ZGU0VUIDI5ODkzCi0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzEyX1JUX09GRlNFVCAyOTg5NAotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xM19SVF9PRkZTRVQgMjk4OTUKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTRfUlRfT0ZGU0VUIDI5ODk2Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzE1X1JUX09GRlNFVCAyOTg5NwotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJHUlBXRUlHSFRfMF9SVF9PRkZTRVQgMjk4OTgKLSNkZWZpbmUgUU1fUkVHX1dSUk9USEVSR1JQV0VJR0hUXzFfUlRfT0ZGU0VUIDI5ODk5Ci0jZGVmaW5lIFFNX1JFR19XUlJPVEhFUkdSUFdFSUdIVF8yX1JUX09GRlNFVCAyOTkwMAotI2RlZmluZSBRTV9SRUdfV1JST1RIRVJHUlBXRUlHSFRfM19SVF9PRkZTRVQgMjk5MDEKLSNkZWZpbmUgUU1fUkVHX1dSUlRYR1JQV0VJR0hUXzBfUlRfT0ZGU0VUIDI5OTAyCi0jZGVmaW5lIFFNX1JFR19XUlJUWEdSUFdFSUdIVF8xX1JUX09GRlNFVCAyOTkwMwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8wX1JUX09GRlNFVCAyOTkwNAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xX1JUX09GRlNFVCAyOTkwNQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yX1JUX09GRlNFVCAyOTkwNgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zX1JUX09GRlNFVCAyOTkwNwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80X1JUX09GRlNFVCAyOTkwOAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81X1JUX09GRlNFVCAyOTkwOQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl82X1JUX09GRlNFVCAyOTkxMAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl83X1JUX09GRlNFVCAyOTkxMQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl84X1JUX09GRlNFVCAyOTkxMgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl85X1JUX09GRlNFVCAyOTkxMwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xMF9SVF9PRkZTRVQgMjk5MTQKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTFfUlRfT0ZGU0VUIDI5OTE1Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzEyX1JUX09GRlNFVCAyOTkxNgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xM19SVF9PRkZTRVQgMjk5MTcKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTRfUlRfT0ZGU0VUIDI5OTE4Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE1X1JUX09GRlNFVCAyOTkxOQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xNl9SVF9PRkZTRVQgMjk5MjAKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTdfUlRfT0ZGU0VUIDI5OTIxCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE4X1JUX09GRlNFVCAyOTkyMgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xOV9SVF9PRkZTRVQgMjk5MjMKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjBfUlRfT0ZGU0VUIDI5OTI0Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzIxX1JUX09GRlNFVCAyOTkyNQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yMl9SVF9PRkZTRVQgMjk5MjYKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjNfUlRfT0ZGU0VUIDI5OTI3Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI0X1JUX09GRlNFVCAyOTkyOAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yNV9SVF9PRkZTRVQgMjk5MjkKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjZfUlRfT0ZGU0VUIDI5OTMwCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI3X1JUX09GRlNFVCAyOTkzMQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yOF9SVF9PRkZTRVQgMjk5MzIKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjlfUlRfT0ZGU0VUIDI5OTMzCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzMwX1JUX09GRlNFVCAyOTkzNAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zMV9SVF9PRkZTRVQgMjk5MzUKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzJfUlRfT0ZGU0VUIDI5OTM2Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzMzX1JUX09GRlNFVCAyOTkzNwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zNF9SVF9PRkZTRVQgMjk5MzgKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzVfUlRfT0ZGU0VUIDI5OTM5Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM2X1JUX09GRlNFVCAyOTk0MAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zN19SVF9PRkZTRVQgMjk5NDEKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzhfUlRfT0ZGU0VUIDI5OTQyCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM5X1JUX09GRlNFVCAyOTk0MwotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80MF9SVF9PRkZTRVQgMjk5NDQKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDFfUlRfT0ZGU0VUIDI5OTQ1Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQyX1JUX09GRlNFVCAyOTk0NgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80M19SVF9PRkZTRVQgMjk5NDcKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDRfUlRfT0ZGU0VUIDI5OTQ4Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ1X1JUX09GRlNFVCAyOTk0OQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80Nl9SVF9PRkZTRVQgMjk5NTAKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDdfUlRfT0ZGU0VUIDI5OTUxCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ4X1JUX09GRlNFVCAyOTk1MgotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80OV9SVF9PRkZTRVQgMjk5NTMKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTBfUlRfT0ZGU0VUIDI5OTU0Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzUxX1JUX09GRlNFVCAyOTk1NQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81Ml9SVF9PRkZTRVQgMjk5NTYKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTNfUlRfT0ZGU0VUIDI5OTU3Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU0X1JUX09GRlNFVCAyOTk1OAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81NV9SVF9PRkZTRVQgMjk5NTkKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTZfUlRfT0ZGU0VUIDI5OTYwCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU3X1JUX09GRlNFVCAyOTk2MQotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81OF9SVF9PRkZTRVQgMjk5NjIKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTlfUlRfT0ZGU0VUIDI5OTYzCi0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzYwX1JUX09GRlNFVCAyOTk2NAotI2RlZmluZSBRTV9SRUdfUFFUWDJQRl82MV9SVF9PRkZTRVQgMjk5NjUKLSNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNjJfUlRfT0ZGU0VUIDI5OTY2Ci0jZGVmaW5lIFFNX1JFR19QUVRYMlBGXzYzX1JUX09GRlNFVCAyOTk2NwotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8wX1JUX09GRlNFVCAyOTk2OAotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xX1JUX09GRlNFVCAyOTk2OQotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8yX1JUX09GRlNFVCAyOTk3MAotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8zX1JUX09GRlNFVCAyOTk3MQotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl80X1JUX09GRlNFVCAyOTk3MgotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl81X1JUX09GRlNFVCAyOTk3MwotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl82X1JUX09GRlNFVCAyOTk3NAotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl83X1JUX09GRlNFVCAyOTk3NQotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl84X1JUX09GRlNFVCAyOTk3NgotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl85X1JUX09GRlNFVCAyOTk3NwotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xMF9SVF9PRkZTRVQgMjk5NzgKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTFfUlRfT0ZGU0VUIDI5OTc5Ci0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzEyX1JUX09GRlNFVCAyOTk4MAotI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xM19SVF9PRkZTRVQgMjk5ODEKLSNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTRfUlRfT0ZGU0VUIDI5OTgyCi0jZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzE1X1JUX09GRlNFVCAyOTk4MwotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EXzBfUlRfT0ZGU0VUIDI5OTg0Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RfMV9SVF9PRkZTRVQgMjk5ODUKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFRJTUVSXzBfUlRfT0ZGU0VUIDI5OTg2Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RUSU1FUl8xX1JUX09GRlNFVCAyOTk4NwotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzBfUlRfT0ZGU0VUIDI5OTg4Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfMV9SVF9PRkZTRVQgMjk5ODkKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF8yX1JUX09GRlNFVCAyOTk5MAotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzNfUlRfT0ZGU0VUIDI5OTkxCi0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfNF9SVF9PRkZTRVQgMjk5OTIKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF81X1JUX09GRlNFVCAyOTk5MwotI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzZfUlRfT0ZGU0VUIDI5OTk0Ci0jZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfN19SVF9PRkZTRVQgMjk5OTUKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTElOQ1ZBTF9SVF9PRkZTRVQgMjk5OTYKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTElOQ1ZBTF9SVF9TSVpFIDI1NgotI2RlZmluZSBRTV9SRUdfUkxHTEJMVVBQRVJCT1VORF9SVF9PRkZTRVQgMzAyNTIKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTFVQUEVSQk9VTkRfUlRfU0laRSAyNTYKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTENSRF9SVF9PRkZTRVQgMzA1MDgKLSNkZWZpbmUgUU1fUkVHX1JMR0xCTENSRF9SVF9TSVpFIDI1NgotI2RlZmluZSBRTV9SRUdfUkxHTEJMRU5BQkxFX1JUX09GRlNFVCAzMDc2NAotI2RlZmluZSBRTV9SRUdfUkxQRlBFUklPRF9SVF9PRkZTRVQgMzA3NjUKLSNkZWZpbmUgUU1fUkVHX1JMUEZQRVJJT0RUSU1FUl9SVF9PRkZTRVQgMzA3NjYKLSNkZWZpbmUgUU1fUkVHX1JMUEZJTkNWQUxfUlRfT0ZGU0VUIDMwNzY3Ci0jZGVmaW5lIFFNX1JFR19STFBGSU5DVkFMX1JUX1NJWkUgMTYKLSNkZWZpbmUgUU1fUkVHX1JMUEZVUFBFUkJPVU5EX1JUX09GRlNFVCAzMDc4MwotI2RlZmluZSBRTV9SRUdfUkxQRlVQUEVSQk9VTkRfUlRfU0laRSAxNgotI2RlZmluZSBRTV9SRUdfUkxQRkNSRF9SVF9PRkZTRVQgMzA3OTkKLSNkZWZpbmUgUU1fUkVHX1JMUEZDUkRfUlRfU0laRSAxNgotI2RlZmluZSBRTV9SRUdfUkxQRkVOQUJMRV9SVF9PRkZTRVQgMzA4MTUKLSNkZWZpbmUgUU1fUkVHX1JMUEZWT1FFTkFCTEVfUlRfT0ZGU0VUIDMwODE2Ci0jZGVmaW5lIFFNX1JFR19XRlFQRldFSUdIVF9SVF9PRkZTRVQgMzA4MTcKLSNkZWZpbmUgUU1fUkVHX1dGUVBGV0VJR0hUX1JUX1NJWkUgMTYKLSNkZWZpbmUgUU1fUkVHX1dGUVBGVVBQRVJCT1VORF9SVF9PRkZTRVQgMzA4MzMKLSNkZWZpbmUgUU1fUkVHX1dGUVBGVVBQRVJCT1VORF9SVF9TSVpFIDE2Ci0jZGVmaW5lIFFNX1JFR19XRlFQRkNSRF9SVF9PRkZTRVQgMzA4NDkKLSNkZWZpbmUgUU1fUkVHX1dGUVBGQ1JEX1JUX1NJWkUgMTYwCi0jZGVmaW5lIFFNX1JFR19XRlFQRkVOQUJMRV9SVF9PRkZTRVQgMzEwMDkKLSNkZWZpbmUgUU1fUkVHX1dGUVZQRU5BQkxFX1JUX09GRlNFVCAzMTAxMAotI2RlZmluZSBRTV9SRUdfQkFTRUFERFJUWFBRX1JUX09GRlNFVCAzMTAxMQotI2RlZmluZSBRTV9SRUdfQkFTRUFERFJUWFBRX1JUX1NJWkUgNTEyCi0jZGVmaW5lIFFNX1JFR19UWFBRTUFQX1JUX09GRlNFVCAzMTUyMwotI2RlZmluZSBRTV9SRUdfVFhQUU1BUF9SVF9TSVpFIDUxMgotI2RlZmluZSBRTV9SRUdfV0ZRVlBXRUlHSFRfUlRfT0ZGU0VUIDMyMDM1Ci0jZGVmaW5lIFFNX1JFR19XRlFWUFdFSUdIVF9SVF9TSVpFIDUxMgotI2RlZmluZSBRTV9SRUdfV0ZRVlBDUkRfUlRfT0ZGU0VUIDMyNTQ3Ci0jZGVmaW5lIFFNX1JFR19XRlFWUENSRF9SVF9TSVpFIDUxMgotI2RlZmluZSBRTV9SRUdfV0ZRVlBNQVBfUlRfT0ZGU0VUIDMzMDU5Ci0jZGVmaW5lIFFNX1JFR19XRlFWUE1BUF9SVF9TSVpFIDUxMgotI2RlZmluZSBRTV9SRUdfV0ZRUEZDUkRfTVNCX1JUX09GRlNFVCAzMzU3MQotI2RlZmluZSBRTV9SRUdfV0ZRUEZDUkRfTVNCX1JUX1NJWkUgMTYwCi0jZGVmaW5lIE5JR19SRUdfVEFHX0VUSEVSVFlQRV8wX1JUX09GRlNFVCAzMzczMQotI2RlZmluZSBOSUdfUkVHX09VVEVSX1RBR19WQUxVRV9MSVNUMF9SVF9PRkZTRVQgMzM3MzIKLSNkZWZpbmUgTklHX1JFR19PVVRFUl9UQUdfVkFMVUVfTElTVDFfUlRfT0ZGU0VUIDMzNzMzCi0jZGVmaW5lIE5JR19SRUdfT1VURVJfVEFHX1ZBTFVFX0xJU1QyX1JUX09GRlNFVCAzMzczNAotI2RlZmluZSBOSUdfUkVHX09VVEVSX1RBR19WQUxVRV9MSVNUM19SVF9PRkZTRVQgMzM3MzUKLSNkZWZpbmUgTklHX1JFR19PVVRFUl9UQUdfVkFMVUVfTUFTS19SVF9PRkZTRVQgMzM3MzYKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdNQUNfQ0xTX1RZUEVfUlRfT0ZGU0VUIDMzNzM3Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX0VOX1JUX09GRlNFVCAzMzczOAotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19FTl9SVF9TSVpFIDQKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfSERSX1NFTF9SVF9PRkZTRVQgMzM3NDIKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfSERSX1NFTF9SVF9TSVpFIDQKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfVkFMVUVfUlRfT0ZGU0VUIDMzNzQ2Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX1ZBTFVFX1JUX1NJWkUgNAotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX05PX1RBR19SVF9PRkZTRVQgMzM3NTAKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfVkFMVUVfUlRfT0ZGU0VUIDMzNzUxCi0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1ZBTFVFX1JUX1NJWkUgMzIKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfRU5fUlRfT0ZGU0VUIDMzNzgzCi0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0VOX1JUX1NJWkUgMTYKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfTU9ERV9SVF9PRkZTRVQgMzM3OTkKLSNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfTU9ERV9SVF9TSVpFIDE2Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1BST1RPQ09MX1RZUEVfUlRfT0ZGU0VUIDMzODE1Ci0jZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX1BST1RPQ09MX1RZUEVfUlRfU0laRSAxNgotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9IRFJfU0VMX1JUX09GRlNFVCAzMzgzMQotI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9IRFJfU0VMX1JUX1NJWkUgMTYKLSNkZWZpbmUgTklHX1JFR19UWF9FRFBNX0NUUkxfUlRfT0ZGU0VUIDMzODQ3Ci0jZGVmaW5lIE5JR19SRUdfUk9DRV9EVVBMSUNBVEVfVE9fSE9TVF9SVF9PRkZTRVQgMzM4NDgKLSNkZWZpbmUgQ0RVX1JFR19DSURfQUREUl9QQVJBTVNfUlRfT0ZGU0VUIDMzODQ5Ci0jZGVmaW5lIENEVV9SRUdfU0VHTUVOVDBfUEFSQU1TX1JUX09GRlNFVCAzMzg1MAotI2RlZmluZSBDRFVfUkVHX1NFR01FTlQxX1BBUkFNU19SVF9PRkZTRVQgMzM4NTEKLSNkZWZpbmUgQ0RVX1JFR19QRl9TRUcwX1RZUEVfT0ZGU0VUX1JUX09GRlNFVCAzMzg1MgotI2RlZmluZSBDRFVfUkVHX1BGX1NFRzFfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUIDMzODUzCi0jZGVmaW5lIENEVV9SRUdfUEZfU0VHMl9UWVBFX09GRlNFVF9SVF9PRkZTRVQgMzM4NTQKLSNkZWZpbmUgQ0RVX1JFR19QRl9TRUczX1RZUEVfT0ZGU0VUX1JUX09GRlNFVCAzMzg1NQotI2RlZmluZSBDRFVfUkVHX1BGX0ZMX1NFRzBfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUIDMzODU2Ci0jZGVmaW5lIENEVV9SRUdfUEZfRkxfU0VHMV9UWVBFX09GRlNFVF9SVF9PRkZTRVQgMzM4NTcKLSNkZWZpbmUgQ0RVX1JFR19QRl9GTF9TRUcyX1RZUEVfT0ZGU0VUX1JUX09GRlNFVCAzMzg1OAotI2RlZmluZSBDRFVfUkVHX1BGX0ZMX1NFRzNfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUIDMzODU5Ci0jZGVmaW5lIENEVV9SRUdfVkZfU0VHX1RZUEVfT0ZGU0VUX1JUX09GRlNFVCAzMzg2MAotI2RlZmluZSBDRFVfUkVHX1ZGX0ZMX1NFR19UWVBFX09GRlNFVF9SVF9PRkZTRVQgMzM4NjEKLSNkZWZpbmUgUEJGX1JFR19UQUdfRVRIRVJUWVBFXzBfUlRfT0ZGU0VUIDMzODYyCi0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NJWkVfUlRfT0ZGU0VUIDMzODYzCi0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMF9SVF9PRkZTRVQgMzM4NjQKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1EwX1JUX09GRlNFVCAzMzg2NQotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1EwX1JUX09GRlNFVCAzMzg2NgotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTFfUlRfT0ZGU0VUIDMzODY3Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMV9SVF9PRkZTRVQgMzM4NjgKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMV9SVF9PRkZTRVQgMzM4NjkKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1EyX1JUX09GRlNFVCAzMzg3MAotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTJfUlRfT0ZGU0VUIDMzODcxCi0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTJfUlRfT0ZGU0VUIDMzODcyCi0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RM19SVF9PRkZTRVQgMzM4NzMKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1EzX1JUX09GRlNFVCAzMzg3NAotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1EzX1JUX09GRlNFVCAzMzg3NQotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTRfUlRfT0ZGU0VUIDMzODc2Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RNF9SVF9PRkZTRVQgMzM4NzcKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RNF9SVF9PRkZTRVQgMzM4NzgKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E1X1JUX09GRlNFVCAzMzg3OQotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTVfUlRfT0ZGU0VUIDMzODgwCi0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTVfUlRfT0ZGU0VUIDMzODgxCi0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RNl9SVF9PRkZTRVQgMzM4ODIKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E2X1JUX09GRlNFVCAzMzg4MwotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E2X1JUX09GRlNFVCAzMzg4NAotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTdfUlRfT0ZGU0VUIDMzODg1Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RN19SVF9PRkZTRVQgMzM4ODYKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RN19SVF9PRkZTRVQgMzM4ODcKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E4X1JUX09GRlNFVCAzMzg4OAotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUThfUlRfT0ZGU0VUIDMzODg5Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUThfUlRfT0ZGU0VUIDMzODkwCi0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9ROV9SVF9PRkZTRVQgMzM4OTEKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E5X1JUX09GRlNFVCAzMzg5MgotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E5X1JUX09GRlNFVCAzMzg5MwotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTEwX1JUX09GRlNFVCAzMzg5NAotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTEwX1JUX09GRlNFVCAzMzg5NQotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExMF9SVF9PRkZTRVQgMzM4OTYKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExMV9SVF9PRkZTRVQgMzM4OTcKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExMV9SVF9PRkZTRVQgMzM4OTgKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTFfUlRfT0ZGU0VUIDMzODk5Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTJfUlRfT0ZGU0VUIDMzOTAwCi0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTJfUlRfT0ZGU0VUIDMzOTAxCi0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTEyX1JUX09GRlNFVCAzMzkwMgotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTEzX1JUX09GRlNFVCAzMzkwMwotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTEzX1JUX09GRlNFVCAzMzkwNAotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExM19SVF9PRkZTRVQgMzM5MDUKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExNF9SVF9PRkZTRVQgMzM5MDYKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExNF9SVF9PRkZTRVQgMzM5MDcKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTRfUlRfT0ZGU0VUIDMzOTA4Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTVfUlRfT0ZGU0VUIDMzOTA5Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTVfUlRfT0ZGU0VUIDMzOTEwCi0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE1X1JUX09GRlNFVCAzMzkxMQotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE2X1JUX09GRlNFVCAzMzkxMgotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE2X1JUX09GRlNFVCAzMzkxMwotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExNl9SVF9PRkZTRVQgMzM5MTQKLSNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExN19SVF9PRkZTRVQgMzM5MTUKLSNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExN19SVF9PRkZTRVQgMzM5MTYKLSNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTdfUlRfT0ZGU0VUIDMzOTE3Ci0jZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMThfUlRfT0ZGU0VUIDMzOTE4Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMThfUlRfT0ZGU0VUIDMzOTE5Ci0jZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE4X1JUX09GRlNFVCAzMzkyMAotI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE5X1JUX09GRlNFVCAzMzkyMQotI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE5X1JUX09GRlNFVCAzMzkyMgotI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExOV9SVF9PRkZTRVQgMzM5MjMKLSNkZWZpbmUgWENNX1JFR19DT05fUEhZX1EzX1JUX09GRlNFVCAzMzkyNAorI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF8wX1JUX09GRlNFVAkwCisjZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzFfUlRfT0ZGU0VUCTEKKyNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfMl9SVF9PRkZTRVQJMgorI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF8zX1JUX09GRlNFVAkzCisjZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzRfUlRfT0ZGU0VUCTQKKyNkZWZpbmUgRE9SUV9SRUdfUEZfTUFYX0lDSURfNV9SVF9PRkZTRVQJNQorI2RlZmluZSBET1JRX1JFR19QRl9NQVhfSUNJRF82X1JUX09GRlNFVAk2CisjZGVmaW5lIERPUlFfUkVHX1BGX01BWF9JQ0lEXzdfUlRfT0ZGU0VUCTcKKyNkZWZpbmUgRE9SUV9SRUdfVkZfTUFYX0lDSURfMF9SVF9PRkZTRVQJOAorI2RlZmluZSBET1JRX1JFR19WRl9NQVhfSUNJRF8xX1JUX09GRlNFVAk5CisjZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzJfUlRfT0ZGU0VUCTEwCisjZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzNfUlRfT0ZGU0VUCTExCisjZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzRfUlRfT0ZGU0VUCTEyCisjZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzVfUlRfT0ZGU0VUCTEzCisjZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzZfUlRfT0ZGU0VUCTE0CisjZGVmaW5lIERPUlFfUkVHX1ZGX01BWF9JQ0lEXzdfUlRfT0ZGU0VUCTE1CisjZGVmaW5lIERPUlFfUkVHX1BGX1dBS0VfQUxMX1JUX09GRlNFVAkxNgorI2RlZmluZSBET1JRX1JFR19UQUcxX0VUSEVSVFlQRV9SVF9PRkZTRVQJMTcKKyNkZWZpbmUgSUdVX1JFR19QRl9DT05GSUdVUkFUSU9OX1JUX09GRlNFVAkxOAorI2RlZmluZSBJR1VfUkVHX1ZGX0NPTkZJR1VSQVRJT05fUlRfT0ZGU0VUCTE5CisjZGVmaW5lIElHVV9SRUdfQVRUTl9NU0dfQUREUl9MX1JUX09GRlNFVAkyMAorI2RlZmluZSBJR1VfUkVHX0FUVE5fTVNHX0FERFJfSF9SVF9PRkZTRVQJMjEKKyNkZWZpbmUgSUdVX1JFR19MRUFESU5HX0VER0VfTEFUQ0hfUlRfT0ZGU0VUCTIyCisjZGVmaW5lIElHVV9SRUdfVFJBSUxJTkdfRURHRV9MQVRDSF9SVF9PRkZTRVQJMjMKKyNkZWZpbmUgQ0FVX1JFR19DUUVfQUdHX1VOSVRfU0laRV9SVF9PRkZTRVQJMjQKKyNkZWZpbmUgQ0FVX1JFR19TQl9WQVJfTUVNT1JZX1JUX09GRlNFVAk3NjEKKyNkZWZpbmUgQ0FVX1JFR19TQl9WQVJfTUVNT1JZX1JUX1NJWkUJNzM2CisjZGVmaW5lIENBVV9SRUdfU0JfVkFSX01FTU9SWV9SVF9PRkZTRVQJNzYxCisjZGVmaW5lIENBVV9SRUdfU0JfVkFSX01FTU9SWV9SVF9TSVpFCTczNgorI2RlZmluZSBDQVVfUkVHX1NCX0FERFJfTUVNT1JZX1JUX09GRlNFVAkxNDk3CisjZGVmaW5lIENBVV9SRUdfU0JfQUREUl9NRU1PUllfUlRfU0laRQk3MzYKKyNkZWZpbmUgQ0FVX1JFR19QSV9NRU1PUllfUlRfT0ZGU0VUCTIyMzMKKyNkZWZpbmUgQ0FVX1JFR19QSV9NRU1PUllfUlRfU0laRQk0NDE2CisjZGVmaW5lIFBSU19SRUdfU0VBUkNIX1JFU1BfSU5JVElBVE9SX1RZUEVfUlRfT0ZGU0VUCTY2NDkKKyNkZWZpbmUgUFJTX1JFR19UQVNLX0lEX01BWF9JTklUSUFUT1JfUEZfUlRfT0ZGU0VUCTY2NTAKKyNkZWZpbmUgUFJTX1JFR19UQVNLX0lEX01BWF9JTklUSUFUT1JfVkZfUlRfT0ZGU0VUCTY2NTEKKyNkZWZpbmUgUFJTX1JFR19UQVNLX0lEX01BWF9UQVJHRVRfUEZfUlRfT0ZGU0VUCTY2NTIKKyNkZWZpbmUgUFJTX1JFR19UQVNLX0lEX01BWF9UQVJHRVRfVkZfUlRfT0ZGU0VUCTY2NTMKKyNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfVENQX1JUX09GRlNFVAk2NjU0CisjZGVmaW5lIFBSU19SRUdfU0VBUkNIX0ZDT0VfUlRfT0ZGU0VUCTY2NTUKKyNkZWZpbmUgUFJTX1JFR19TRUFSQ0hfUk9DRV9SVF9PRkZTRVQJNjY1NgorI2RlZmluZSBQUlNfUkVHX1JPQ0VfREVTVF9RUF9NQVhfVkZfUlRfT0ZGU0VUCTY2NTcKKyNkZWZpbmUgUFJTX1JFR19ST0NFX0RFU1RfUVBfTUFYX1BGX1JUX09GRlNFVAk2NjU4CisjZGVmaW5lIFBSU19SRUdfU0VBUkNIX09QRU5GTE9XX1JUX09GRlNFVAk2NjU5CisjZGVmaW5lIFBSU19SRUdfU0VBUkNIX05PTl9JUF9BU19PUEVORkxPV19SVF9PRkZTRVQJNjY2MAorI2RlZmluZSBQUlNfUkVHX09QRU5GTE9XX1NVUFBPUlRfT05MWV9LTk9XTl9PVkVSX0lQX1JUX09GRlNFVAk2NjYxCisjZGVmaW5lIFBSU19SRUdfT1BFTkZMT1dfU0VBUkNIX0tFWV9NQVNLX1JUX09GRlNFVAk2NjYyCisjZGVmaW5lIFBSU19SRUdfVEFHX0VUSEVSVFlQRV8wX1JUX09GRlNFVAk2NjYzCisjZGVmaW5lIFBSU19SRUdfTElHSFRfTDJfRVRIRVJUWVBFX0VOX1JUX09GRlNFVAk2NjY0CisjZGVmaW5lIFNSQ19SRUdfRklSU1RGUkVFX1JUX09GRlNFVAk2NjY1CisjZGVmaW5lIFNSQ19SRUdfRklSU1RGUkVFX1JUX1NJWkUJMgorI2RlZmluZSBTUkNfUkVHX0xBU1RGUkVFX1JUX09GRlNFVAk2NjY3CisjZGVmaW5lIFNSQ19SRUdfTEFTVEZSRUVfUlRfU0laRQkyCisjZGVmaW5lIFNSQ19SRUdfQ09VTlRGUkVFX1JUX09GRlNFVAk2NjY5CisjZGVmaW5lIFNSQ19SRUdfTlVNQkVSX0hBU0hfQklUU19SVF9PRkZTRVQJNjY3MAorI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfUF9TSVpFX1JUX09GRlNFVAk2NjcxCisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19QX1NJWkVfUlRfT0ZGU0VUCTY2NzIKKyNkZWZpbmUgUFNXUlEyX1JFR19UTV9QX1NJWkVfUlRfT0ZGU0VUCTY2NzMKKyNkZWZpbmUgUFNXUlEyX1JFR19RTV9QX1NJWkVfUlRfT0ZGU0VUCTY2NzQKKyNkZWZpbmUgUFNXUlEyX1JFR19TUkNfUF9TSVpFX1JUX09GRlNFVAk2Njc1CisjZGVmaW5lIFBTV1JRMl9SRUdfVFNETV9QX1NJWkVfUlRfT0ZGU0VUCTY2NzYKKyNkZWZpbmUgUFNXUlEyX1JFR19UTV9GSVJTVF9JTFRfUlRfT0ZGU0VUCTY2NzcKKyNkZWZpbmUgUFNXUlEyX1JFR19UTV9MQVNUX0lMVF9SVF9PRkZTRVQJNjY3OAorI2RlZmluZSBQU1dSUTJfUkVHX1FNX0ZJUlNUX0lMVF9SVF9PRkZTRVQJNjY3OQorI2RlZmluZSBQU1dSUTJfUkVHX1FNX0xBU1RfSUxUX1JUX09GRlNFVAk2NjgwCisjZGVmaW5lIFBTV1JRMl9SRUdfU1JDX0ZJUlNUX0lMVF9SVF9PRkZTRVQJNjY4MQorI2RlZmluZSBQU1dSUTJfUkVHX1NSQ19MQVNUX0lMVF9SVF9PRkZTRVQJNjY4MgorI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfRklSU1RfSUxUX1JUX09GRlNFVAk2NjgzCisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVQ19MQVNUX0lMVF9SVF9PRkZTRVQJNjY4NAorI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfRklSU1RfSUxUX1JUX09GRlNFVAk2Njg1CisjZGVmaW5lIFBTV1JRMl9SRUdfQ0RVVF9MQVNUX0lMVF9SVF9PRkZTRVQJNjY4NgorI2RlZmluZSBQU1dSUTJfUkVHX1RTRE1fRklSU1RfSUxUX1JUX09GRlNFVAk2Njg3CisjZGVmaW5lIFBTV1JRMl9SRUdfVFNETV9MQVNUX0lMVF9SVF9PRkZTRVQJNjY4OAorI2RlZmluZSBQU1dSUTJfUkVHX1RNX05VTUJFUl9PRl9QRl9CTE9DS1NfUlRfT0ZGU0VUCTY2ODkKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX05VTUJFUl9PRl9QRl9CTE9DS1NfUlRfT0ZGU0VUCTY2OTAKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVDX05VTUJFUl9PRl9QRl9CTE9DS1NfUlRfT0ZGU0VUCTY2OTEKKyNkZWZpbmUgUFNXUlEyX1JFR19UTV9WRl9CTE9DS1NfUlRfT0ZGU0VUCTY2OTIKKyNkZWZpbmUgUFNXUlEyX1JFR19DRFVUX1ZGX0JMT0NLU19SVF9PRkZTRVQJNjY5MworI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfVkZfQkxPQ0tTX1JUX09GRlNFVAk2Njk0CisjZGVmaW5lIFBTV1JRMl9SRUdfVE1fQkxPQ0tTX0ZBQ1RPUl9SVF9PRkZTRVQJNjY5NQorI2RlZmluZSBQU1dSUTJfUkVHX0NEVVRfQkxPQ0tTX0ZBQ1RPUl9SVF9PRkZTRVQJNjY5NgorI2RlZmluZSBQU1dSUTJfUkVHX0NEVUNfQkxPQ0tTX0ZBQ1RPUl9SVF9PRkZTRVQJNjY5NworI2RlZmluZSBQU1dSUTJfUkVHX1ZGX0JBU0VfUlRfT0ZGU0VUCTY2OTgKKyNkZWZpbmUgUFNXUlEyX1JFR19WRl9MQVNUX0lMVF9SVF9PRkZTRVQJNjY5OQorI2RlZmluZSBQU1dSUTJfUkVHX1dSX01CUzBfUlRfT0ZGU0VUCTY3MDAKKyNkZWZpbmUgUFNXUlEyX1JFR19SRF9NQlMwX1JUX09GRlNFVAk2NzAxCisjZGVmaW5lIFBTV1JRMl9SRUdfRFJBTV9BTElHTl9XUl9SVF9PRkZTRVQJNjcwMgorI2RlZmluZSBQU1dSUTJfUkVHX0RSQU1fQUxJR05fUkRfUlRfT0ZGU0VUCTY3MDMKKyNkZWZpbmUgUFNXUlEyX1JFR19JTFRfTUVNT1JZX1JUX09GRlNFVAk2NzA0CisjZGVmaW5lIFBTV1JRMl9SRUdfSUxUX01FTU9SWV9SVF9TSVpFCTIyMDAwCisjZGVmaW5lIFBHTFVFX1JFR19CX1ZGX0JBU0VfUlRfT0ZGU0VUCTI4NzA0CisjZGVmaW5lIFBHTFVFX1JFR19CX01TRE1fT0ZGU0VUX01BU0tfQl9SVF9PRkZTRVQJMjg3MDUKKyNkZWZpbmUgUEdMVUVfUkVHX0JfTVNETV9WRl9TSElGVF9CX1JUX09GRlNFVAkyODcwNgorI2RlZmluZSBQR0xVRV9SRUdfQl9DQUNIRV9MSU5FX1NJWkVfUlRfT0ZGU0VUCTI4NzA3CisjZGVmaW5lIFBHTFVFX1JFR19CX1BGX0JBUjBfU0laRV9SVF9PRkZTRVQJMjg3MDgKKyNkZWZpbmUgUEdMVUVfUkVHX0JfUEZfQkFSMV9TSVpFX1JUX09GRlNFVAkyODcwOQorI2RlZmluZSBQR0xVRV9SRUdfQl9WRl9CQVIxX1NJWkVfUlRfT0ZGU0VUCTI4NzEwCisjZGVmaW5lIFRNX1JFR19WRl9FTkFCTEVfQ09OTl9SVF9PRkZTRVQJMjg3MTEKKyNkZWZpbmUgVE1fUkVHX1BGX0VOQUJMRV9DT05OX1JUX09GRlNFVAkyODcxMgorI2RlZmluZSBUTV9SRUdfUEZfRU5BQkxFX1RBU0tfUlRfT0ZGU0VUCTI4NzEzCisjZGVmaW5lIFRNX1JFR19HUk9VUF9TSVpFX1JFU09MVVRJT05fQ09OTl9SVF9PRkZTRVQJMjg3MTQKKyNkZWZpbmUgVE1fUkVHX0dST1VQX1NJWkVfUkVTT0xVVElPTl9UQVNLX1JUX09GRlNFVAkyODcxNQorI2RlZmluZSBUTV9SRUdfQ09ORklHX0NPTk5fTUVNX1JUX09GRlNFVAkyODcxNgorI2RlZmluZSBUTV9SRUdfQ09ORklHX0NPTk5fTUVNX1JUX1NJWkUJNDE2CisjZGVmaW5lIFRNX1JFR19DT05GSUdfVEFTS19NRU1fUlRfT0ZGU0VUCTI5MTMyCisjZGVmaW5lIFRNX1JFR19DT05GSUdfVEFTS19NRU1fUlRfU0laRQk1MTIKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRV8wX1JUX09GRlNFVAkyOTY0NAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFXzFfUlRfT0ZGU0VUCTI5NjQ1CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVfMl9SVF9PRkZTRVQJMjk2NDYKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzBfUlRfT0ZGU0VUCTI5NjQ3CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xX1JUX09GRlNFVAkyOTY0OAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMl9SVF9PRkZTRVQJMjk2NDkKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzNfUlRfT0ZGU0VUCTI5NjUwCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80X1JUX09GRlNFVAkyOTY1MQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNV9SVF9PRkZTRVQJMjk2NTIKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzZfUlRfT0ZGU0VUCTI5NjUzCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF83X1JUX09GRlNFVAkyOTY1NAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfOF9SVF9PRkZTRVQJMjk2NTUKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzlfUlRfT0ZGU0VUCTI5NjU2CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xMF9SVF9PRkZTRVQJMjk2NTcKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzExX1JUX09GRlNFVAkyOTY1OAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTJfUlRfT0ZGU0VUCTI5NjU5CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xM19SVF9PRkZTRVQJMjk2NjAKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE0X1JUX09GRlNFVAkyOTY2MQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMTVfUlRfT0ZGU0VUCTI5NjYyCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xNl9SVF9PRkZTRVQJMjk2NjMKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzE3X1JUX09GRlNFVAkyOTY2NAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMThfUlRfT0ZGU0VUCTI5NjY1CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8xOV9SVF9PRkZTRVQJMjk2NjYKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzIwX1JUX09GRlNFVAkyOTY2NworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjFfUlRfT0ZGU0VUCTI5NjY4CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yMl9SVF9PRkZTRVQJMjk2NjkKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzIzX1JUX09GRlNFVAkyOTY3MAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjRfUlRfT0ZGU0VUCTI5NjcxCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yNV9SVF9PRkZTRVQJMjk2NzIKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI2X1JUX09GRlNFVAkyOTY3MworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMjdfUlRfT0ZGU0VUCTI5Njc0CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8yOF9SVF9PRkZTRVQJMjk2NzUKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzI5X1JUX09GRlNFVAkyOTY3NgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzBfUlRfT0ZGU0VUCTI5Njc3CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zMV9SVF9PRkZTRVQJMjk2NzgKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzMyX1JUX09GRlNFVAkyOTY3OQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzNfUlRfT0ZGU0VUCTI5NjgwCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zNF9SVF9PRkZTRVQJMjk2ODEKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM1X1JUX09GRlNFVAkyOTY4MgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzZfUlRfT0ZGU0VUCTI5NjgzCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF8zN19SVF9PRkZTRVQJMjk2ODQKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzM4X1JUX09GRlNFVAkyOTY4NQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfMzlfUlRfT0ZGU0VUCTI5Njg2CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80MF9SVF9PRkZTRVQJMjk2ODcKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQxX1JUX09GRlNFVAkyOTY4OAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDJfUlRfT0ZGU0VUCTI5Njg5CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80M19SVF9PRkZTRVQJMjk2OTAKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ0X1JUX09GRlNFVAkyOTY5MQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDVfUlRfT0ZGU0VUCTI5NjkyCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80Nl9SVF9PRkZTRVQJMjk2OTMKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzQ3X1JUX09GRlNFVAkyOTY5NAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNDhfUlRfT0ZGU0VUCTI5Njk1CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF80OV9SVF9PRkZTRVQJMjk2OTYKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzUwX1JUX09GRlNFVAkyOTY5NworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTFfUlRfT0ZGU0VUCTI5Njk4CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81Ml9SVF9PRkZTRVQJMjk2OTkKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzUzX1JUX09GRlNFVAkyOTcwMAorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTRfUlRfT0ZGU0VUCTI5NzAxCisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81NV9SVF9PRkZTRVQJMjk3MDIKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU2X1JUX09GRlNFVAkyOTcwMworI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNTdfUlRfT0ZGU0VUCTI5NzA0CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF81OF9SVF9PRkZTRVQJMjk3MDUKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzU5X1JUX09GRlNFVAkyOTcwNgorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNjBfUlRfT0ZGU0VUCTI5NzA3CisjZGVmaW5lIFFNX1JFR19NQVhQUVNJWkVUWFNFTF82MV9SVF9PRkZTRVQJMjk3MDgKKyNkZWZpbmUgUU1fUkVHX01BWFBRU0laRVRYU0VMXzYyX1JUX09GRlNFVAkyOTcwOQorI2RlZmluZSBRTV9SRUdfTUFYUFFTSVpFVFhTRUxfNjNfUlRfT0ZGU0VUCTI5NzEwCisjZGVmaW5lIFFNX1JFR19CQVNFQUREUk9USEVSUFFfUlRfT0ZGU0VUCTI5NzExCisjZGVmaW5lIFFNX1JFR19CQVNFQUREUk9USEVSUFFfUlRfU0laRQkxMjgKKyNkZWZpbmUgUU1fUkVHX1ZPUUNSRExJTkVfUlRfT0ZGU0VUCTI5ODM5CisjZGVmaW5lIFFNX1JFR19WT1FDUkRMSU5FX1JUX1NJWkUJMjAKKyNkZWZpbmUgUU1fUkVHX1ZPUUlOSVRDUkRMSU5FX1JUX09GRlNFVAkyOTg1OQorI2RlZmluZSBRTV9SRUdfVk9RSU5JVENSRExJTkVfUlRfU0laRQkyMAorI2RlZmluZSBRTV9SRUdfQUZVTExRTUJZUFRIUlBGV0ZRX1JUX09GRlNFVAkyOTg3OQorI2RlZmluZSBRTV9SRUdfQUZVTExRTUJZUFRIUlZQV0ZRX1JUX09GRlNFVAkyOTg4MAorI2RlZmluZSBRTV9SRUdfQUZVTExRTUJZUFRIUlBGUkxfUlRfT0ZGU0VUCTI5ODgxCisjZGVmaW5lIFFNX1JFR19BRlVMTFFNQllQVEhSR0xCTFJMX1JUX09GRlNFVAkyOTg4MgorI2RlZmluZSBRTV9SRUdfQUZVTExPUFJUTlNUQ0NSRE1BU0tfUlRfT0ZGU0VUCTI5ODgzCisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzBfUlRfT0ZGU0VUCTI5ODg0CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzFfUlRfT0ZGU0VUCTI5ODg1CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzJfUlRfT0ZGU0VUCTI5ODg2CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzNfUlRfT0ZGU0VUCTI5ODg3CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzRfUlRfT0ZGU0VUCTI5ODg4CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzVfUlRfT0ZGU0VUCTI5ODg5CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzZfUlRfT0ZGU0VUCTI5ODkwCisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzdfUlRfT0ZGU0VUCTI5ODkxCisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzhfUlRfT0ZGU0VUCTI5ODkyCisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzlfUlRfT0ZGU0VUCTI5ODkzCisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzEwX1JUX09GRlNFVAkyOTg5NAorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xMV9SVF9PRkZTRVQJMjk4OTUKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTJfUlRfT0ZGU0VUCTI5ODk2CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUlBRR1JQXzEzX1JUX09GRlNFVAkyOTg5NworI2RlZmluZSBRTV9SRUdfV1JST1RIRVJQUUdSUF8xNF9SVF9PRkZTRVQJMjk4OTgKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSUFFHUlBfMTVfUlRfT0ZGU0VUCTI5ODk5CisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUkdSUFdFSUdIVF8wX1JUX09GRlNFVAkyOTkwMAorI2RlZmluZSBRTV9SRUdfV1JST1RIRVJHUlBXRUlHSFRfMV9SVF9PRkZTRVQJMjk5MDEKKyNkZWZpbmUgUU1fUkVHX1dSUk9USEVSR1JQV0VJR0hUXzJfUlRfT0ZGU0VUCTI5OTAyCisjZGVmaW5lIFFNX1JFR19XUlJPVEhFUkdSUFdFSUdIVF8zX1JUX09GRlNFVAkyOTkwMworI2RlZmluZSBRTV9SRUdfV1JSVFhHUlBXRUlHSFRfMF9SVF9PRkZTRVQJMjk5MDQKKyNkZWZpbmUgUU1fUkVHX1dSUlRYR1JQV0VJR0hUXzFfUlRfT0ZGU0VUCTI5OTA1CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzBfUlRfT0ZGU0VUCTI5OTA2CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzFfUlRfT0ZGU0VUCTI5OTA3CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzJfUlRfT0ZGU0VUCTI5OTA4CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzNfUlRfT0ZGU0VUCTI5OTA5CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzRfUlRfT0ZGU0VUCTI5OTEwCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzVfUlRfT0ZGU0VUCTI5OTExCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzZfUlRfT0ZGU0VUCTI5OTEyCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzdfUlRfT0ZGU0VUCTI5OTEzCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzhfUlRfT0ZGU0VUCTI5OTE0CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzlfUlRfT0ZGU0VUCTI5OTE1CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzEwX1JUX09GRlNFVAkyOTkxNgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xMV9SVF9PRkZTRVQJMjk5MTcKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTJfUlRfT0ZGU0VUCTI5OTE4CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzEzX1JUX09GRlNFVAkyOTkxOQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xNF9SVF9PRkZTRVQJMjk5MjAKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMTVfUlRfT0ZGU0VUCTI5OTIxCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE2X1JUX09GRlNFVAkyOTkyMgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8xN19SVF9PRkZTRVQJMjk5MjMKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMThfUlRfT0ZGU0VUCTI5OTI0CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzE5X1JUX09GRlNFVAkyOTkyNQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yMF9SVF9PRkZTRVQJMjk5MjYKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjFfUlRfT0ZGU0VUCTI5OTI3CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzIyX1JUX09GRlNFVAkyOTkyOAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yM19SVF9PRkZTRVQJMjk5MjkKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjRfUlRfT0ZGU0VUCTI5OTMwCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI1X1JUX09GRlNFVAkyOTkzMQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yNl9SVF9PRkZTRVQJMjk5MzIKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMjdfUlRfT0ZGU0VUCTI5OTMzCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzI4X1JUX09GRlNFVAkyOTkzNAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8yOV9SVF9PRkZTRVQJMjk5MzUKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzBfUlRfT0ZGU0VUCTI5OTM2CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzMxX1JUX09GRlNFVAkyOTkzNworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zMl9SVF9PRkZTRVQJMjk5MzgKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzNfUlRfT0ZGU0VUCTI5OTM5CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM0X1JUX09GRlNFVAkyOTk0MAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zNV9SVF9PRkZTRVQJMjk5NDEKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzZfUlRfT0ZGU0VUCTI5OTQyCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzM3X1JUX09GRlNFVAkyOTk0MworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl8zOF9SVF9PRkZTRVQJMjk5NDQKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfMzlfUlRfT0ZGU0VUCTI5OTQ1CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQwX1JUX09GRlNFVAkyOTk0NgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80MV9SVF9PRkZTRVQJMjk5NDcKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDJfUlRfT0ZGU0VUCTI5OTQ4CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQzX1JUX09GRlNFVAkyOTk0OQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80NF9SVF9PRkZTRVQJMjk5NTAKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDVfUlRfT0ZGU0VUCTI5OTUxCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ2X1JUX09GRlNFVAkyOTk1MgorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl80N19SVF9PRkZTRVQJMjk5NTMKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNDhfUlRfT0ZGU0VUCTI5OTU0CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzQ5X1JUX09GRlNFVAkyOTk1NQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81MF9SVF9PRkZTRVQJMjk5NTYKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTFfUlRfT0ZGU0VUCTI5OTU3CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzUyX1JUX09GRlNFVAkyOTk1OAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81M19SVF9PRkZTRVQJMjk5NTkKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTRfUlRfT0ZGU0VUCTI5OTYwCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU1X1JUX09GRlNFVAkyOTk2MQorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81Nl9SVF9PRkZTRVQJMjk5NjIKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNTdfUlRfT0ZGU0VUCTI5OTYzCisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzU4X1JUX09GRlNFVAkyOTk2NAorI2RlZmluZSBRTV9SRUdfUFFUWDJQRl81OV9SVF9PRkZTRVQJMjk5NjUKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNjBfUlRfT0ZGU0VUCTI5OTY2CisjZGVmaW5lIFFNX1JFR19QUVRYMlBGXzYxX1JUX09GRlNFVAkyOTk2NworI2RlZmluZSBRTV9SRUdfUFFUWDJQRl82Ml9SVF9PRkZTRVQJMjk5NjgKKyNkZWZpbmUgUU1fUkVHX1BRVFgyUEZfNjNfUlRfT0ZGU0VUCTI5OTY5CisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzBfUlRfT0ZGU0VUCTI5OTcwCisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzFfUlRfT0ZGU0VUCTI5OTcxCisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzJfUlRfT0ZGU0VUCTI5OTcyCisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzNfUlRfT0ZGU0VUCTI5OTczCisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzRfUlRfT0ZGU0VUCTI5OTc0CisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzVfUlRfT0ZGU0VUCTI5OTc1CisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzZfUlRfT0ZGU0VUCTI5OTc2CisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzdfUlRfT0ZGU0VUCTI5OTc3CisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzhfUlRfT0ZGU0VUCTI5OTc4CisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzlfUlRfT0ZGU0VUCTI5OTc5CisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzEwX1JUX09GRlNFVAkyOTk4MAorI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xMV9SVF9PRkZTRVQJMjk5ODEKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTJfUlRfT0ZGU0VUCTI5OTgyCisjZGVmaW5lIFFNX1JFR19QUU9USEVSMlBGXzEzX1JUX09GRlNFVAkyOTk4MworI2RlZmluZSBRTV9SRUdfUFFPVEhFUjJQRl8xNF9SVF9PRkZTRVQJMjk5ODQKKyNkZWZpbmUgUU1fUkVHX1BRT1RIRVIyUEZfMTVfUlRfT0ZGU0VUCTI5OTg1CisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RfMF9SVF9PRkZTRVQJMjk5ODYKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRF8xX1JUX09GRlNFVAkyOTk4NworI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EVElNRVJfMF9SVF9PRkZTRVQJMjk5ODgKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFRJTUVSXzFfUlRfT0ZGU0VUCTI5OTg5CisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfMF9SVF9PRkZTRVQJMjk5OTAKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF8xX1JUX09GRlNFVAkyOTk5MQorI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzJfUlRfT0ZGU0VUCTI5OTkyCisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfM19SVF9PRkZTRVQJMjk5OTMKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF80X1JUX09GRlNFVAkyOTk5NAorI2RlZmluZSBRTV9SRUdfUkxHTEJMUEVSSU9EU0VMXzVfUlRfT0ZGU0VUCTI5OTk1CisjZGVmaW5lIFFNX1JFR19STEdMQkxQRVJJT0RTRUxfNl9SVF9PRkZTRVQJMjk5OTYKKyNkZWZpbmUgUU1fUkVHX1JMR0xCTFBFUklPRFNFTF83X1JUX09GRlNFVAkyOTk5NworI2RlZmluZSBRTV9SRUdfUkxHTEJMSU5DVkFMX1JUX09GRlNFVAkyOTk5OAorI2RlZmluZSBRTV9SRUdfUkxHTEJMSU5DVkFMX1JUX1NJWkUJMjU2CisjZGVmaW5lIFFNX1JFR19STEdMQkxVUFBFUkJPVU5EX1JUX09GRlNFVAkzMDI1NAorI2RlZmluZSBRTV9SRUdfUkxHTEJMVVBQRVJCT1VORF9SVF9TSVpFCTI1NgorI2RlZmluZSBRTV9SRUdfUkxHTEJMQ1JEX1JUX09GRlNFVAkzMDUxMAorI2RlZmluZSBRTV9SRUdfUkxHTEJMQ1JEX1JUX1NJWkUJMjU2CisjZGVmaW5lIFFNX1JFR19STEdMQkxFTkFCTEVfUlRfT0ZGU0VUCTMwNzY2CisjZGVmaW5lIFFNX1JFR19STFBGUEVSSU9EX1JUX09GRlNFVAkzMDc2NworI2RlZmluZSBRTV9SRUdfUkxQRlBFUklPRFRJTUVSX1JUX09GRlNFVAkzMDc2OAorI2RlZmluZSBRTV9SRUdfUkxQRklOQ1ZBTF9SVF9PRkZTRVQJMzA3NjkKKyNkZWZpbmUgUU1fUkVHX1JMUEZJTkNWQUxfUlRfU0laRQkxNgorI2RlZmluZSBRTV9SRUdfUkxQRlVQUEVSQk9VTkRfUlRfT0ZGU0VUCTMwNzg1CisjZGVmaW5lIFFNX1JFR19STFBGVVBQRVJCT1VORF9SVF9TSVpFCTE2CisjZGVmaW5lIFFNX1JFR19STFBGQ1JEX1JUX09GRlNFVAkzMDgwMQorI2RlZmluZSBRTV9SRUdfUkxQRkNSRF9SVF9TSVpFCTE2CisjZGVmaW5lIFFNX1JFR19STFBGRU5BQkxFX1JUX09GRlNFVAkzMDgxNworI2RlZmluZSBRTV9SRUdfUkxQRlZPUUVOQUJMRV9SVF9PRkZTRVQJMzA4MTgKKyNkZWZpbmUgUU1fUkVHX1dGUVBGV0VJR0hUX1JUX09GRlNFVAkzMDgxOQorI2RlZmluZSBRTV9SRUdfV0ZRUEZXRUlHSFRfUlRfU0laRQkxNgorI2RlZmluZSBRTV9SRUdfV0ZRUEZVUFBFUkJPVU5EX1JUX09GRlNFVAkzMDgzNQorI2RlZmluZSBRTV9SRUdfV0ZRUEZVUFBFUkJPVU5EX1JUX1NJWkUJMTYKKyNkZWZpbmUgUU1fUkVHX1dGUVBGQ1JEX1JUX09GRlNFVAkzMDg1MQorI2RlZmluZSBRTV9SRUdfV0ZRUEZDUkRfUlRfU0laRQkxNjAKKyNkZWZpbmUgUU1fUkVHX1dGUVBGRU5BQkxFX1JUX09GRlNFVAkzMTAxMQorI2RlZmluZSBRTV9SRUdfV0ZRVlBFTkFCTEVfUlRfT0ZGU0VUCTMxMDEyCisjZGVmaW5lIFFNX1JFR19CQVNFQUREUlRYUFFfUlRfT0ZGU0VUCTMxMDEzCisjZGVmaW5lIFFNX1JFR19CQVNFQUREUlRYUFFfUlRfU0laRQk1MTIKKyNkZWZpbmUgUU1fUkVHX1RYUFFNQVBfUlRfT0ZGU0VUCTMxNTI1CisjZGVmaW5lIFFNX1JFR19UWFBRTUFQX1JUX1NJWkUJNTEyCisjZGVmaW5lIFFNX1JFR19XRlFWUFdFSUdIVF9SVF9PRkZTRVQJMzIwMzcKKyNkZWZpbmUgUU1fUkVHX1dGUVZQV0VJR0hUX1JUX1NJWkUJNTEyCisjZGVmaW5lIFFNX1JFR19XRlFWUENSRF9SVF9PRkZTRVQJMzI1NDkKKyNkZWZpbmUgUU1fUkVHX1dGUVZQQ1JEX1JUX1NJWkUJNTEyCisjZGVmaW5lIFFNX1JFR19XRlFWUE1BUF9SVF9PRkZTRVQJMzMwNjEKKyNkZWZpbmUgUU1fUkVHX1dGUVZQTUFQX1JUX1NJWkUJNTEyCisjZGVmaW5lIFFNX1JFR19XRlFQRkNSRF9NU0JfUlRfT0ZGU0VUCTMzNTczCisjZGVmaW5lIFFNX1JFR19XRlFQRkNSRF9NU0JfUlRfU0laRQkxNjAKKyNkZWZpbmUgTklHX1JFR19UQUdfRVRIRVJUWVBFXzBfUlRfT0ZGU0VUCTMzNzMzCisjZGVmaW5lIE5JR19SRUdfT1VURVJfVEFHX1ZBTFVFX0xJU1QwX1JUX09GRlNFVAkzMzczNAorI2RlZmluZSBOSUdfUkVHX09VVEVSX1RBR19WQUxVRV9MSVNUMV9SVF9PRkZTRVQJMzM3MzUKKyNkZWZpbmUgTklHX1JFR19PVVRFUl9UQUdfVkFMVUVfTElTVDJfUlRfT0ZGU0VUCTMzNzM2CisjZGVmaW5lIE5JR19SRUdfT1VURVJfVEFHX1ZBTFVFX0xJU1QzX1JUX09GRlNFVAkzMzczNworI2RlZmluZSBOSUdfUkVHX09VVEVSX1RBR19WQUxVRV9NQVNLX1JUX09GRlNFVAkzMzczOAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR01BQ19DTFNfVFlQRV9SVF9PRkZTRVQJMzM3MzkKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfRU5fUlRfT0ZGU0VUCTMzNzQwCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfVEFHX0VOX1JUX1NJWkUJNAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19IRFJfU0VMX1JUX09GRlNFVAkzMzc0NAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19IRFJfU0VMX1JUX1NJWkUJNAorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX1RBR19WQUxVRV9SVF9PRkZTRVQJMzM3NDgKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19UQUdfVkFMVUVfUlRfU0laRQk0CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfTk9fVEFHX1JUX09GRlNFVAkzMzc1MgorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9WQUxVRV9SVF9PRkZTRVQJMzM3NTMKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfVkFMVUVfUlRfU0laRQkzMgorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9FTl9SVF9PRkZTRVQJMzM3ODUKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfRU5fUlRfU0laRQkxNgorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9NT0RFX1JUX09GRlNFVAkzMzgwMQorI2RlZmluZSBOSUdfUkVHX0xMSF9GVU5DX0ZJTFRFUl9NT0RFX1JUX1NJWkUJMTYKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfUFJPVE9DT0xfVFlQRV9SVF9PRkZTRVQJMzM4MTcKKyNkZWZpbmUgTklHX1JFR19MTEhfRlVOQ19GSUxURVJfUFJPVE9DT0xfVFlQRV9SVF9TSVpFCTE2CisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0hEUl9TRUxfUlRfT0ZGU0VUCTMzODMzCisjZGVmaW5lIE5JR19SRUdfTExIX0ZVTkNfRklMVEVSX0hEUl9TRUxfUlRfU0laRQkxNgorI2RlZmluZSBOSUdfUkVHX1RYX0VEUE1fQ1RSTF9SVF9PRkZTRVQJMzM4NDkKKyNkZWZpbmUgTklHX1JFR19ST0NFX0RVUExJQ0FURV9UT19IT1NUX1JUX09GRlNFVAkzMzg1MAorI2RlZmluZSBDRFVfUkVHX0NJRF9BRERSX1BBUkFNU19SVF9PRkZTRVQJMzM4NTEKKyNkZWZpbmUgQ0RVX1JFR19TRUdNRU5UMF9QQVJBTVNfUlRfT0ZGU0VUCTMzODUyCisjZGVmaW5lIENEVV9SRUdfU0VHTUVOVDFfUEFSQU1TX1JUX09GRlNFVAkzMzg1MworI2RlZmluZSBDRFVfUkVHX1BGX1NFRzBfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUCTMzODU0CisjZGVmaW5lIENEVV9SRUdfUEZfU0VHMV9UWVBFX09GRlNFVF9SVF9PRkZTRVQJMzM4NTUKKyNkZWZpbmUgQ0RVX1JFR19QRl9TRUcyX1RZUEVfT0ZGU0VUX1JUX09GRlNFVAkzMzg1NgorI2RlZmluZSBDRFVfUkVHX1BGX1NFRzNfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUCTMzODU3CisjZGVmaW5lIENEVV9SRUdfUEZfRkxfU0VHMF9UWVBFX09GRlNFVF9SVF9PRkZTRVQJMzM4NTgKKyNkZWZpbmUgQ0RVX1JFR19QRl9GTF9TRUcxX1RZUEVfT0ZGU0VUX1JUX09GRlNFVAkzMzg1OQorI2RlZmluZSBDRFVfUkVHX1BGX0ZMX1NFRzJfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUCTMzODYwCisjZGVmaW5lIENEVV9SRUdfUEZfRkxfU0VHM19UWVBFX09GRlNFVF9SVF9PRkZTRVQJMzM4NjEKKyNkZWZpbmUgQ0RVX1JFR19WRl9TRUdfVFlQRV9PRkZTRVRfUlRfT0ZGU0VUCTMzODYyCisjZGVmaW5lIENEVV9SRUdfVkZfRkxfU0VHX1RZUEVfT0ZGU0VUX1JUX09GRlNFVAkzMzg2MworI2RlZmluZSBQQkZfUkVHX1RBR19FVEhFUlRZUEVfMF9SVF9PRkZTRVQJMzM4NjQKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0laRV9SVF9PRkZTRVQJMzM4NjUKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1EwX1JUX09GRlNFVAkzMzg2NgorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTBfUlRfT0ZGU0VUCTMzODY3CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTBfUlRfT0ZGU0VUCTMzODY4CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMV9SVF9PRkZTRVQJMzM4NjkKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExX1JUX09GRlNFVAkzMzg3MAorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExX1JUX09GRlNFVAkzMzg3MQorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTJfUlRfT0ZGU0VUCTMzODcyCisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMl9SVF9PRkZTRVQJMzM4NzMKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMl9SVF9PRkZTRVQJMzM4NzQKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1EzX1JUX09GRlNFVAkzMzg3NQorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTNfUlRfT0ZGU0VUCTMzODc2CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTNfUlRfT0ZGU0VUCTMzODc3CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RNF9SVF9PRkZTRVQJMzM4NzgKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E0X1JUX09GRlNFVAkzMzg3OQorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E0X1JUX09GRlNFVAkzMzg4MAorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTVfUlRfT0ZGU0VUCTMzODgxCisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RNV9SVF9PRkZTRVQJMzM4ODIKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RNV9SVF9PRkZTRVQJMzM4ODMKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E2X1JUX09GRlNFVAkzMzg4NAorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTZfUlRfT0ZGU0VUCTMzODg1CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTZfUlRfT0ZGU0VUCTMzODg2CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RN19SVF9PRkZTRVQJMzM4ODcKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1E3X1JUX09GRlNFVAkzMzg4OAorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1E3X1JUX09GRlNFVAkzMzg4OQorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUThfUlRfT0ZGU0VUCTMzODkwCisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9ROF9SVF9PRkZTRVQJMzM4OTEKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9ROF9SVF9PRkZTRVQJMzM4OTIKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1E5X1JUX09GRlNFVAkzMzg5MworI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTlfUlRfT0ZGU0VUCTMzODk0CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTlfUlRfT0ZGU0VUCTMzODk1CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTBfUlRfT0ZGU0VUCTMzODk2CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTBfUlRfT0ZGU0VUCTMzODk3CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTEwX1JUX09GRlNFVAkzMzg5OAorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTExX1JUX09GRlNFVAkzMzg5OQorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTExX1JUX09GRlNFVAkzMzkwMAorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExMV9SVF9PRkZTRVQJMzM5MDEKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExMl9SVF9PRkZTRVQJMzM5MDIKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExMl9SVF9PRkZTRVQJMzM5MDMKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTJfUlRfT0ZGU0VUCTMzOTA0CisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTNfUlRfT0ZGU0VUCTMzOTA1CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTNfUlRfT0ZGU0VUCTMzOTA2CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTEzX1JUX09GRlNFVAkzMzkwNworI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE0X1JUX09GRlNFVAkzMzkwOAorI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE0X1JUX09GRlNFVAkzMzkwOQorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExNF9SVF9PRkZTRVQJMzM5MTAKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExNV9SVF9PRkZTRVQJMzM5MTEKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExNV9SVF9PRkZTRVQJMzM5MTIKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMTVfUlRfT0ZGU0VUCTMzOTEzCisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTZfUlRfT0ZGU0VUCTMzOTE0CisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTZfUlRfT0ZGU0VUCTMzOTE1CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE2X1JUX09GRlNFVAkzMzkxNgorI2RlZmluZSBQQkZfUkVHX1lDTURfUVNfTlVNX0xJTkVTX1ZPUTE3X1JUX09GRlNFVAkzMzkxNworI2RlZmluZSBQQkZfUkVHX0JUQl9HVUFSQU5URUVEX1ZPUTE3X1JUX09GRlNFVAkzMzkxOAorI2RlZmluZSBQQkZfUkVHX0JUQl9TSEFSRURfQVJFQV9TRVRVUF9WT1ExN19SVF9PRkZTRVQJMzM5MTkKKyNkZWZpbmUgUEJGX1JFR19ZQ01EX1FTX05VTV9MSU5FU19WT1ExOF9SVF9PRkZTRVQJMzM5MjAKKyNkZWZpbmUgUEJGX1JFR19CVEJfR1VBUkFOVEVFRF9WT1ExOF9SVF9PRkZTRVQJMzM5MjEKKyNkZWZpbmUgUEJGX1JFR19CVEJfU0hBUkVEX0FSRUFfU0VUVVBfVk9RMThfUlRfT0ZGU0VUCTMzOTIyCisjZGVmaW5lIFBCRl9SRUdfWUNNRF9RU19OVU1fTElORVNfVk9RMTlfUlRfT0ZGU0VUCTMzOTIzCisjZGVmaW5lIFBCRl9SRUdfQlRCX0dVQVJBTlRFRURfVk9RMTlfUlRfT0ZGU0VUCTMzOTI0CisjZGVmaW5lIFBCRl9SRUdfQlRCX1NIQVJFRF9BUkVBX1NFVFVQX1ZPUTE5X1JUX09GRlNFVAkzMzkyNQorI2RlZmluZSBYQ01fUkVHX0NPTl9QSFlfUTNfUlRfT0ZGU0VUCTMzOTI2CiAKLSNkZWZpbmUgUlVOVElNRV9BUlJBWV9TSVpFIDMzOTI1CisjZGVmaW5lIFJVTlRJTUVfQVJSQVlfU0laRSAzMzkyNwogCiAvKiBUaGUgZXRoIHN0b3JtIGNvbnRleHQgZm9yIHRoZSBUc3Rvcm0gKi8KIHN0cnVjdCB0c3Rvcm1fZXRoX2Nvbm5fc3RfY3R4IHsKQEAgLTMyMDEsNyArNDQ2OSwzMSBAQAogCXN0cnVjdCBtc3Rvcm1fZXRoX2Nvbm5fc3RfY3R4IG1zdG9ybV9zdF9jb250ZXh0OwogfTsKIAotLyogb3Bjb2RlcyBmb3IgdGhlIGV2ZW50IHJpbmcgKi8KK2VudW0gZXRoX2Vycm9yX2NvZGUgeworCUVUSF9PSyA9IDB4MDAsCisJRVRIX0ZJTFRFUlNfTUFDX0FERF9GQUlMX0ZVTEwsCisJRVRIX0ZJTFRFUlNfTUFDX0FERF9GQUlMX0ZVTExfTVRUMiwKKwlFVEhfRklMVEVSU19NQUNfQUREX0ZBSUxfRFVQX01UVDIsCisJRVRIX0ZJTFRFUlNfTUFDX0FERF9GQUlMX0RVUF9TVFQyLAorCUVUSF9GSUxURVJTX01BQ19ERUxfRkFJTF9OT0YsCisJRVRIX0ZJTFRFUlNfTUFDX0RFTF9GQUlMX05PRl9NVFQyLAorCUVUSF9GSUxURVJTX01BQ19ERUxfRkFJTF9OT0ZfU1RUMiwKKwlFVEhfRklMVEVSU19NQUNfQUREX0ZBSUxfWkVST19NQUMsCisJRVRIX0ZJTFRFUlNfVkxBTl9BRERfRkFJTF9GVUxMLAorCUVUSF9GSUxURVJTX1ZMQU5fQUREX0ZBSUxfRFVQLAorCUVUSF9GSUxURVJTX1ZMQU5fREVMX0ZBSUxfTk9GLAorCUVUSF9GSUxURVJTX1ZMQU5fREVMX0ZBSUxfTk9GX1RUMSwKKwlFVEhfRklMVEVSU19QQUlSX0FERF9GQUlMX0RVUCwKKwlFVEhfRklMVEVSU19QQUlSX0FERF9GQUlMX0ZVTEwsCisJRVRIX0ZJTFRFUlNfUEFJUl9BRERfRkFJTF9GVUxMX01BQywKKwlFVEhfRklMVEVSU19QQUlSX0RFTF9GQUlMX05PRiwKKwlFVEhfRklMVEVSU19QQUlSX0RFTF9GQUlMX05PRl9UVDEsCisJRVRIX0ZJTFRFUlNfUEFJUl9BRERfRkFJTF9aRVJPX01BQywKKwlFVEhfRklMVEVSU19WTklfQUREX0ZBSUxfRlVMTCwKKwlFVEhfRklMVEVSU19WTklfQUREX0ZBSUxfRFVQLAorCU1BWF9FVEhfRVJST1JfQ09ERQorfTsKKwogZW51bSBldGhfZXZlbnRfb3Bjb2RlIHsKIAlFVEhfRVZFTlRfVU5VU0VELAogCUVUSF9FVkVOVF9WUE9SVF9TVEFSVCwKQEAgLTMyNjksNyArNDU2MSwxMyBAQAogCU1BWF9FVEhfRklMVEVSX1RZUEUKIH07CiAKLS8qIEV0aGVybmV0IFJhbXJvZCBDb21tYW5kIElEcyAqLworZW51bSBldGhfaXB2NF9mcmFnX3R5cGUgeworCUVUSF9JUFY0X05PVF9GUkFHLAorCUVUSF9JUFY0X0ZJUlNUX0ZSQUcsCisJRVRIX0lQVjRfTk9OX0ZJUlNUX0ZSQUcsCisJTUFYX0VUSF9JUFY0X0ZSQUdfVFlQRQorfTsKKwogZW51bSBldGhfcmFtcm9kX2NtZF9pZCB7CiAJRVRIX1JBTVJPRF9VTlVTRUQsCiAJRVRIX1JBTVJPRF9WUE9SVF9TVEFSVCwKQEAgLTM0NTEsOCArNDc0OSw4IEBACiAJdTggdG9nZ2xlX3ZhbDsKIAogCXU4IHZmX3J4X3Byb2RfaW5kZXg7Ci0KLQl1OCByZXNlcnZlZFs2XTsKKwl1OCB2Zl9yeF9wcm9kX3VzZV96b25lX2E7CisJdTggcmVzZXJ2ZWRbNV07CiAJX19sZTE2IHJlc2VydmVkMTsKIAlzdHJ1Y3QgcmVncGFpciBjcWVfcGJsX2FkZHI7CiAJc3RydWN0IHJlZ3BhaXIgYmRfYmFzZTsKQEAgLTM1MjYsMTAgKzQ4MjQsMTEgQEAKIAlfX2xlMTYgcHhwX3N0X2luZGV4OwogCV9fbGUxNiBjb21wX2FnZ19zaXplOwogCV9fbGUxNiBxdWV1ZV96b25lX2lkOwotCV9fbGUxNiB0ZXN0X2R1cF9jb3VudDsKKwlfX2xlMTYgcmVzZXJ2ZWQyOwogCV9fbGUxNiBwYmxfc2l6ZTsKIAlfX2xlMTYgdHhfcXVldWVfaWQ7Ci0KKwlfX2xlMTYgc2FtZV9hc19sYXN0X2lkOworCV9fbGUxNiByZXNlcnZlZFszXTsKIAlzdHJ1Y3QgcmVncGFpciBwYmxfYmFzZV9hZGRyOwogCXN0cnVjdCByZWdwYWlyIGJkX2NvbnNfYWRkcmVzczsKIH07CkBAIC00OTI2LDggKzYyMjUsOCBAQAogI2RlZmluZSBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX1NSUV9GTEdfU0hJRlQgICAgICAgICAgICAgNQogI2RlZmluZSBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX0UyRV9GTE9XX0NPTlRST0xfRU5fTUFTSyAgMHgxCiAjZGVmaW5lIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfRTJFX0ZMT1dfQ09OVFJPTF9FTl9TSElGVCA2Ci0jZGVmaW5lIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfUkVTRVJWRUQwX01BU0sgICAgICAgICAgICAweDEKLSNkZWZpbmUgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9SRVNFUlZFRDBfU0hJRlQgICAgICAgICAgIDcKKyNkZWZpbmUgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9SRVNFUlZFRF9LRVlfRU5fTUFTSwkweDEKKyNkZWZpbmUgUk9DRV9DUkVBVEVfUVBfUkVTUF9SQU1ST0RfREFUQV9SRVNFUlZFRF9LRVlfRU5fU0hJRlQJNwogI2RlZmluZSBST0NFX0NSRUFURV9RUF9SRVNQX1JBTVJPRF9EQVRBX1BSSV9NQVNLICAgICAgICAgICAgICAgICAgMHg3CiAjZGVmaW5lIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfUFJJX1NISUZUICAgICAgICAgICAgICAgICA4CiAjZGVmaW5lIFJPQ0VfQ1JFQVRFX1FQX1JFU1BfUkFNUk9EX0RBVEFfTUlOX1JOUl9OQUtfVElNRVJfTUFTSyAgICAweDFGCkBAIC00OTg4LDYgKzYyODcsMTAgQEAKIAlNQVhfUk9DRV9FVkVOVF9PUENPREUKIH07CiAKK3N0cnVjdCByb2NlX2luaXRfZnVuY19yYW1yb2RfZGF0YSB7CisJc3RydWN0IHJkbWFfaW5pdF9mdW5jX3JhbXJvZF9kYXRhIHJkbWE7Cit9OworCiBzdHJ1Y3Qgcm9jZV9tb2RpZnlfcXBfcmVxX3JhbXJvZF9kYXRhIHsKIAlfX2xlMTYgZmxhZ3M7CiAjZGVmaW5lIFJPQ0VfTU9ESUZZX1FQX1JFUV9SQU1ST0RfREFUQV9NT1ZFX1RPX0VSUl9GTEdfTUFTSyAgICAgIDB4MQpAQCAtNjYzOSw2ICs3OTQyLDM1IEBACiAJX19sZTMyIHJlZzI7CiAJX19sZTMyIHJlZzM7CiB9OworCisjZGVmaW5lIE1GV19UUkFDRV9TSUdOQVRVUkUgICAgIDB4MjUwNzE5NDYKKworLyogVGhlIHRyYWNlIGluIHRoZSBidWZmZXIgKi8KKyNkZWZpbmUgTUZXX1RSQUNFX0VWRU5USURfTUFTSyAgICAgICAgICAweDAwZmZmZgorI2RlZmluZSBNRldfVFJBQ0VfUFJNX1NJWkVfTUFTSyAgICAgICAgIDB4MGYwMDAwCisjZGVmaW5lIE1GV19UUkFDRV9QUk1fU0laRV9TSElGVCAgICAgICAgMTYKKyNkZWZpbmUgTUZXX1RSQUNFX0VOVFJZX1NJWkUgICAgICAgICAgICAzCisKK3N0cnVjdCBtY3BfdHJhY2UgeworCXUzMiBzaWduYXR1cmU7CQkvKiBIZWxwIHRvIGlkZW50aWZ5IHRoYXQgdGhlIHRyYWNlIGlzIHZhbGlkICovCisJdTMyIHNpemU7CQkvKiB0aGUgc2l6ZSBvZiB0aGUgdHJhY2UgYnVmZmVyIGluIGJ5dGVzICovCisJdTMyIGN1cnJfbGV2ZWw7CQkvKiAyIC0gYWxsIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgYnVmZmVyCisJCQkJICogMSAtIGRlYnVnIHRyYWNlIHdpbGwgbm90IGJlIHdyaXR0ZW4KKwkJCQkgKiAwIC0ganVzdCBlcnJvcnMgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBidWZmZXIKKwkJCQkgKi8KKwl1MzIgbW9kdWxlc19tYXNrWzJdOwkvKiBhIGJpdCBwZXIgbW9kdWxlLCAxIG1lYW5zIHdyaXRlIGl0LCAwIG1lYW5zCisJCQkJICogbWFzayBpdC4KKwkJCQkgKi8KKworCS8qIFdhcm5pbmc6IHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIGFzc3VtZWQgdG8gYmUgMzJiaXRzIGFzIHRoZXkgYXJlCisJICogdXNlZCBvbmx5IGluIHRoZSBNRlcuCisJICovCisJdTMyIHRyYWNlX3Byb2Q7IC8qIFRoZSBuZXh0IHRyYWNlIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIG9mZnNldCAqLworCXUzMiB0cmFjZV9vbGRlc3Q7IC8qIFRoZSBvbGRlc3QgdmFsaWQgdHJhY2Ugc3RhcnRzIGF0IHRoaXMgb2Zmc2V0CisJCQkgICAqICh1c3VhbGx5IHZlcnkgY2xvc2UgYWZ0ZXIgdGhlIGN1cnJlbnQgcHJvZHVjZXIpLgorCQkJICAgKi8KK307CisKICNkZWZpbmUgVkZfTUFYX1NUQVRJQyAxOTIKIAogI2RlZmluZSBNQ1BfR0xPQl9QQVRIX01BWAkyCkBAIC02NjQ2LDYgKzc5NzgsNyBAQAogI2RlZmluZSBNQ1BfR0xPQl9QT1JUX01BWAk0CiAjZGVmaW5lIE1DUF9HTE9CX0ZVTkNfTUFYCTE2CiAKK3R5cGVkZWYgdTMyIG9mZnNpemVfdDsJCS8qIEluIERXT1JEUyAhISEgKi8KIC8qIE9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1DUCBzY3JhdGNocGFkICovCiAjZGVmaW5lIE9GRlNJWkVfT0ZGU0VUX1NISUZUCTAKICNkZWZpbmUgT0ZGU0laRV9PRkZTRVRfTUFTSwkweDAwMDBmZmZmCkBAIC03MjM2LDggKzg1NjksMTkgQEAKICNkZWZpbmUgRFJWX01TR19DT0RFX05JR19EUkFJTgkJCTB4MzAwMDAwMDAKICNkZWZpbmUgRFJWX01TR19DT0RFX1ZGX0RJU0FCTEVEX0RPTkUJCTB4YzAwMDAwMDAKICNkZWZpbmUgRFJWX01TR19DT0RFX0NGR19WRl9NU0lYCQkweGMwMDEwMDAwCisjZGVmaW5lIERSVl9NU0dfQ09ERV9OVk1fR0VUX0ZJTEVfQVRUCQkweDAwMDMwMDAwCisjZGVmaW5lIERSVl9NU0dfQ09ERV9OVk1fUkVBRF9OVlJBTQkJMHgwMDA1MDAwMAogI2RlZmluZSBEUlZfTVNHX0NPREVfTUNQX1JFU0VUCQkJMHgwMDA5MDAwMAogI2RlZmluZSBEUlZfTVNHX0NPREVfU0VUX1ZFUlNJT04JCTB4MDAwZjAwMDAKKyNkZWZpbmUgRFJWX01TR19DT0RFX01DUF9IQUxUICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKworI2RlZmluZSBEUlZfTVNHX0NPREVfR0VUX1NUQVRTICAgICAgICAgICAgICAgICAgMHgwMDEzMDAwMAorI2RlZmluZSBEUlZfTVNHX0NPREVfU1RBVFNfVFlQRV9MQU4gICAgICAgICAgICAgMQorI2RlZmluZSBEUlZfTVNHX0NPREVfU1RBVFNfVFlQRV9GQ09FICAgICAgICAgICAgMgorI2RlZmluZSBEUlZfTVNHX0NPREVfU1RBVFNfVFlQRV9JU0NTSSAgICAgICAgICAgMworI2RlZmluZSBEUlZfTVNHX0NPREVfU1RBVFNfVFlQRV9SRE1BICAgICAgICAgICAgNAorCisjZGVmaW5lIERSVl9NU0dfQ09ERV9NQVNLX1BBUklUSUVTICAgICAgICAgICAgICAweDAwMWEwMDAwCiAKICNkZWZpbmUgRFJWX01TR19DT0RFX0JJU1RfVEVTVAkJCTB4MDAxZTAwMDAKICNkZWZpbmUgRFJWX01TR19DT0RFX1NFVF9MRURfTU9ERQkJMHgwMDIwMDAwMApAQCAtNzI0OCw2ICs4NTkyLDkgQEAKICNkZWZpbmUgRFJWX01CX1BBUkFNX1VOTE9BRF9XT0xfTUNQCQkweDAwMDAwMDAxCiAjZGVmaW5lIERSVl9NQl9QQVJBTV9EQ0JYX05PVElGWV9NQVNLCQkweDAwMDAwMEZGCiAjZGVmaW5lIERSVl9NQl9QQVJBTV9EQ0JYX05PVElGWV9TSElGVAkJMworCisjZGVmaW5lIERSVl9NQl9QQVJBTV9OVk1fTEVOX1NISUZUCQkyNAorCiAjZGVmaW5lIERSVl9NQl9QQVJBTV9DRkdfVkZfTVNJWF9WRl9JRF9TSElGVAkwCiAjZGVmaW5lIERSVl9NQl9QQVJBTV9DRkdfVkZfTVNJWF9WRl9JRF9NQVNLCTB4MDAwMDAwRkYKICNkZWZpbmUgRFJWX01CX1BBUkFNX0NGR19WRl9NU0lYX1NCX05VTV9TSElGVAk4CkBAIC03Mjg1LDYgKzg2MzIsOCBAQAogI2RlZmluZSBGV19NU0dfQ09ERV9EUlZfVU5MT0FEX0ZVTkNUSU9OCQkweDIwMTMwMDAwCiAjZGVmaW5lIEZXX01TR19DT0RFX0RSVl9VTkxPQURfRE9ORQkJMHgyMTEwMDAwMAogI2RlZmluZSBGV19NU0dfQ09ERV9EUlZfQ0ZHX1ZGX01TSVhfRE9ORQkweGIwMDEwMDAwCisKKyNkZWZpbmUgRldfTVNHX0NPREVfTlZNX09LCQkJMHgwMDAxMDAwMAogI2RlZmluZSBGV19NU0dfQ09ERV9PSwkJCQkweDAwMTYwMDAwCiAKICNkZWZpbmUgRldfTVNHX1NFUV9OVU1CRVJfTUFTSwkJCTB4MDAwMGZmZmYKQEAgLTczMTUsMTAgKzg2NjQsMTAgQEAKIAlNRldfRFJWX01TR19SRVNFUlZFRDQsCiAJTUZXX0RSVl9NU0dfQldfVVBEQVRFLAogCU1GV19EUlZfTVNHX0JXX1VQREFURTUsCi0JTUZXX0RSVl9NU0dfQldfVVBEQVRFNiwKLQlNRldfRFJWX01TR19CV19VUERBVEU3LAotCU1GV19EUlZfTVNHX0JXX1VQREFURTgsCi0JTUZXX0RSVl9NU0dfQldfVVBEQVRFOSwKKwlNRldfRFJWX01TR19HRVRfTEFOX1NUQVRTLAorCU1GV19EUlZfTVNHX0dFVF9GQ09FX1NUQVRTLAorCU1GV19EUlZfTVNHX0dFVF9JU0NTSV9TVEFUUywKKwlNRldfRFJWX01TR19HRVRfUkRNQV9TVEFUUywKIAlNRldfRFJWX01TR19CV19VUERBVEUxMCwKIAlNRldfRFJWX01TR19UUkFOU0NFSVZFUl9TVEFURV9DSEFOR0UsCiAJTUZXX0RSVl9NU0dfQldfVVBEQVRFMTEsCkBAIC03NTIxLDQgKzg4NzAsMTAxIEBACiAJc3RydWN0IG52bV9jZmcxX3BvcnQgcG9ydFtNQ1BfR0xPQl9QT1JUX01BWF07CiAJc3RydWN0IG52bV9jZmcxX2Z1bmMgZnVuY1tNQ1BfR0xPQl9GVU5DX01BWF07CiB9OworCitlbnVtIHNwYWRfc2VjdGlvbnMgeworCVNQQURfU0VDVElPTl9UUkFDRSwKKwlTUEFEX1NFQ1RJT05fTlZNX0NGRywKKwlTUEFEX1NFQ1RJT05fUFVCTElDLAorCVNQQURfU0VDVElPTl9QUklWQVRFLAorCVNQQURfU0VDVElPTl9NQVgKK307CisKKyNkZWZpbmUgTUNQX1RSQUNFX1NJWkUgICAgICAgICAgMjA0OAkvKiAya2IgKi8KKworLyogVGhpcyBzZWN0aW9uIGlzIGxvY2F0ZWQgYXQgYSBmaXhlZCBsb2NhdGlvbiBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICogc2NyYXRjaHBhZCwgdG8gZW5zdXJlIHRoYXQgdGhlIE1DUCB0cmFjZSBpcyBub3QgcnVuIG92ZXIgZHVyaW5nIE1GVyB1cGdyYWRlLgorICogQWxsIHRoZSByZXN0IG9mIGRhdGEgaGFzIGEgZmxvYXRpbmcgbG9jYXRpb24gd2hpY2ggZGlmZmVycyBmcm9tIHZlcnNpb24gdG8KKyAqIHZlcnNpb24sIGFuZCBpcyBwb2ludGVkIGJ5IHRoZSBtY3BfbWV0YV9kYXRhIGJlbG93LgorICogTW9yZW92ZXIsIHRoZSBzcGFkX2xheW91dCBzZWN0aW9uIGlzIHBhcnQgb2YgdGhlIE1GVyBmaXJtd2FyZSwgYW5kIGlzIGxvYWRlZAorICogd2l0aCBpdCBmcm9tIG52cmFtIGluIG9yZGVyIHRvIGNsZWFyIHRoaXMgcG9ydGlvbi4KKyAqLworc3RydWN0IHN0YXRpY19pbml0IHsKKwl1MzIgbnVtX3NlY3Rpb25zOworCW9mZnNpemVfdCBzZWN0aW9uc1tTUEFEX1NFQ1RJT05fTUFYXTsKKyNkZWZpbmUgU0VDVElPTihfc2VjXykgKCooKG9mZnNpemVfdCAqKShTVFJVQ1RfT0ZGU0VUKHNlY3Rpb25zW19zZWNfXSkpKSkKKworCXN0cnVjdCBtY3BfdHJhY2UgdHJhY2U7CisjZGVmaW5lIE1DUF9UUkFDRV9QICgoc3RydWN0IG1jcF90cmFjZSAqKShTVFJVQ1RfT0ZGU0VUKHRyYWNlKSkpCisJdTggdHJhY2VfYnVmZmVyW01DUF9UUkFDRV9TSVpFXTsKKyNkZWZpbmUgTUNQX1RSQUNFX0JVRiAoKHU4ICopKFNUUlVDVF9PRkZTRVQodHJhY2VfYnVmZmVyKSkpCisJLyogcnVubmluZ19tZncgaGFzIHRoZSBzYW1lIGRlZmluaXRpb24gYXMgaW4gbnZtX21hcC5oLgorCSAqIFRoaXMgYml0IGluZGljYXRlIGJvdGggdGhlIHJ1bm5pbmcgZGlyLCBhbmQgdGhlIHJ1bm5pbmcgYnVuZGxlLgorCSAqIEl0IGlzIHNldCBvbmNlIHdoZW4gdGhlIExJTSBpcyBsb2FkZWQuCisJICovCisJdTMyIHJ1bm5pbmdfbWZ3OworI2RlZmluZSBSVU5OSU5HX01GVyAoKigodTMyICopKFNUUlVDVF9PRkZTRVQocnVubmluZ19tZncpKSkpCisJdTMyIGJ1aWxkX3RpbWU7CisjZGVmaW5lIE1GV19CVUlMRF9USU1FICgqKCh1MzIgKikoU1RSVUNUX09GRlNFVChidWlsZF90aW1lKSkpKQorCXUzMiByZXNldF90eXBlOworI2RlZmluZSBSRVNFVF9UWVBFICgqKCh1MzIgKikoU1RSVUNUX09GRlNFVChyZXNldF90eXBlKSkpKQorCXUzMiBtZndfc2VjdXJlX21vZGU7CisjZGVmaW5lIE1GV19TRUNVUkVfTU9ERSAoKigodTMyICopKFNUUlVDVF9PRkZTRVQobWZ3X3NlY3VyZV9tb2RlKSkpKQorCXUxNiBwbWVfc3RhdHVzX3BmX2JpdG1hcDsKKyNkZWZpbmUgUE1FX1NUQVRVU19QRl9CSVRNQVAgKCooKHUxNiAqKShTVFJVQ1RfT0ZGU0VUKHBtZV9zdGF0dXNfcGZfYml0bWFwKSkpKQorCXUxNiBwbWVfZW5hYmxlX3BmX2JpdG1hcDsKKyNkZWZpbmUgUE1FX0VOQUJMRV9QRl9CSVRNQVAgKCooKHUxNiAqKShTVFJVQ1RfT0ZGU0VUKHBtZV9lbmFibGVfcGZfYml0bWFwKSkpKQorCXUzMiBtaW1fbnZtX2FkZHI7CisJdTMyIG1pbV9zdGFydF9hZGRyOworCXUzMiBhaF9wY2llX2xpbmtfcGFyYW1zOworI2RlZmluZSBBSF9QQ0lFX0xJTktfUEFSQU1TX0xJTktfU1BFRURfTUFTSyAgICAgKDB4MDAwMDAwZmYpCisjZGVmaW5lIEFIX1BDSUVfTElOS19QQVJBTVNfTElOS19TUEVFRF9TSElGVCAgICAoMCkKKyNkZWZpbmUgQUhfUENJRV9MSU5LX1BBUkFNU19MSU5LX1dJRFRIX01BU0sgICAgICgweDAwMDBmZjAwKQorI2RlZmluZSBBSF9QQ0lFX0xJTktfUEFSQU1TX0xJTktfV0lEVEhfU0hJRlQgICAgKDgpCisjZGVmaW5lIEFIX1BDSUVfTElOS19QQVJBTVNfQVNQTV9NT0RFX01BU0sgICAgICAoMHgwMGZmMDAwMCkKKyNkZWZpbmUgQUhfUENJRV9MSU5LX1BBUkFNU19BU1BNX01PREVfU0hJRlQgICAgICgxNikKKyNkZWZpbmUgQUhfUENJRV9MSU5LX1BBUkFNU19BU1BNX0NBUF9NQVNLICAgICAgICgweGZmMDAwMDAwKQorI2RlZmluZSBBSF9QQ0lFX0xJTktfUEFSQU1TX0FTUE1fQ0FQX1NISUZUICAgICAgKDI0KQorI2RlZmluZSBBSF9QQ0lFX0xJTktfUEFSQU1TICgqKCh1MzIgKikoU1RSVUNUX09GRlNFVChhaF9wY2llX2xpbmtfcGFyYW1zKSkpKQorCisJdTMyIHJzcnZfcGVyc2lzdFs1XTsJLyogUGVyc2lzdCByZXNlcnZlZCBmb3IgTUZXIHVwZ3JhZGVzICovCit9OworCitlbnVtIG52bV9pbWFnZV90eXBlIHsKKwlOVk1fVFlQRV9USU0xID0gMHgwMSwKKwlOVk1fVFlQRV9USU0yID0gMHgwMiwKKwlOVk1fVFlQRV9NSU0xID0gMHgwMywKKwlOVk1fVFlQRV9NSU0yID0gMHgwNCwKKwlOVk1fVFlQRV9NQkEgPSAweDA1LAorCU5WTV9UWVBFX01PRFVMRVNfUE4gPSAweDA2LAorCU5WTV9UWVBFX1ZQRCA9IDB4MDcsCisJTlZNX1RZUEVfTUZXX1RSQUNFMSA9IDB4MDgsCisJTlZNX1RZUEVfTUZXX1RSQUNFMiA9IDB4MDksCisJTlZNX1RZUEVfTlZNX0NGRzEgPSAweDBhLAorCU5WTV9UWVBFX0wyQiA9IDB4MGIsCisJTlZNX1RZUEVfRElSMSA9IDB4MGMsCisJTlZNX1RZUEVfRUFHTEVfRlcxID0gMHgwZCwKKwlOVk1fVFlQRV9GQUxDT05fRlcxID0gMHgwZSwKKwlOVk1fVFlQRV9QQ0lFX0ZXMSA9IDB4MGYsCisJTlZNX1RZUEVfSFdfU0VUID0gMHgxMCwKKwlOVk1fVFlQRV9MSU0gPSAweDExLAorCU5WTV9UWVBFX0FWU19GVzEgPSAweDEyLAorCU5WTV9UWVBFX0RJUjIgPSAweDEzLAorCU5WTV9UWVBFX0NDTSA9IDB4MTQsCisJTlZNX1RZUEVfRUFHTEVfRlcyID0gMHgxNSwKKwlOVk1fVFlQRV9GQUxDT05fRlcyID0gMHgxNiwKKwlOVk1fVFlQRV9QQ0lFX0ZXMiA9IDB4MTcsCisJTlZNX1RZUEVfQVZTX0ZXMiA9IDB4MTgsCisJTlZNX1RZUEVfSU5JVF9IVyA9IDB4MTksCisJTlZNX1RZUEVfREVGQVVMVF9DRkcgPSAweDFhLAorCU5WTV9UWVBFX01EVU1QID0gMHgxYiwKKwlOVk1fVFlQRV9NRVRBID0gMHgxYywKKwlOVk1fVFlQRV9JU0NTSV9DRkcgPSAweDFkLAorCU5WTV9UWVBFX0ZDT0VfQ0ZHID0gMHgxZiwKKwlOVk1fVFlQRV9FVEhfUEhZX0ZXMSA9IDB4MjAsCisJTlZNX1RZUEVfRVRIX1BIWV9GVzIgPSAweDIxLAorCU5WTV9UWVBFX01BWCwKK307CisKKyNkZWZpbmUgRElSX0lEXzEgICAgKDApCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xZWQvcWVkX2h3LmMKaW5kZXggZTE3ODg1My4uNmU0ZmFlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FlZC9xZWRfaHcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWVkL3FlZF9ody5jCkBAIC00NCw4ICs0NCw3IEBACiAKIGludCBxZWRfcHR0X3Bvb2xfYWxsb2Moc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4pCiB7Ci0Jc3RydWN0IHFlZF9wdHRfcG9vbCAqcF9wb29sID0ga21hbGxvYyhzaXplb2YoKnBfcG9vbCksCi0JCQkJCSAgICAgIEdGUF9LRVJORUwpOworCXN0cnVjdCBxZWRfcHR0X3Bvb2wgKnBfcG9vbCA9IGttYWxsb2Moc2l6ZW9mKCpwX3Bvb2wpLCBHRlBfS0VSTkVMKTsKIAlpbnQgaTsKIAogCWlmICghcF9wb29sKQpAQCAtMTEzLDE2ICsxMTIsMTQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBxZWRfcHR0X3JlbGVhc2Uoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sCi0JCSAgICAgc3RydWN0IHFlZF9wdHQgKnBfcHR0KQordm9pZCBxZWRfcHR0X3JlbGVhc2Uoc3RydWN0IHFlZF9od2ZuICpwX2h3Zm4sIHN0cnVjdCBxZWRfcHR0ICpwX3B0dCkKIHsKIAlzcGluX2xvY2tfYmgoJnBfaHdmbi0+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+d29yaywgcWVkZV9yb2NlX2hhbmRsZV9ldmVudCk7CisJcXVldWVfd29yayhlZGV2LT5yZG1hX2luZm8ucm9jZV93cSwgJmV2ZW50X25vZGUtPndvcmspOworfQorCit2b2lkIHFlZGVfcm9jZV9kZXZfZXZlbnRfb3BlbihzdHJ1Y3QgcWVkZV9kZXYgKmVkZXYpCit7CisJcWVkZV9yb2NlX2FkZF9ldmVudChlZGV2LCBRRURFX1VQKTsKK30KKwordm9pZCBxZWRlX3JvY2VfZGV2X2V2ZW50X2Nsb3NlKHN0cnVjdCBxZWRlX2RldiAqZWRldikKK3sKKwlxZWRlX3JvY2VfYWRkX2V2ZW50KGVkZXYsIFFFREVfRE9XTik7Cit9CisKK3ZvaWQgcWVkZV9yb2NlX2V2ZW50X2NoYW5nZWFkZHIoc3RydWN0IHFlZGVfZGV2ICplZGV2KQoreworCXFlZGVfcm9jZV9hZGRfZXZlbnQoZWRldiwgUUVERV9DSEFOR0VfQUREUik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19tYWluLmMKaW5kZXggM2ViZWYyNy4uM2FlMzk2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21haW4uYwpAQCAtNDMyLDE4ICs0MzIsMTkgQEAKIAogc3RhdGljIGludCBxbGNuaWNfZmRiX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKm5jYiwKIAkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQlzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwgaW50IGlkeCkKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LCBpbnQgKmlkeCkKIHsKIAlzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnIgPSAwOwogCiAJaWYgKCFhZGFwdGVyLT5mZGJfbWFjX2xlYXJuKQogCQlyZXR1cm4gbmRvX2RmbHRfZmRiX2R1bXAoc2tiLCBuY2IsIG5ldGRldiwgZmlsdGVyX2RldiwgaWR4KTsKIAogCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBRTENOSUNfRVNXSVRDSF9FTkFCTEVEKSB8fAogCSAgICBxbGNuaWNfc3Jpb3ZfY2hlY2soYWRhcHRlcikpCi0JCWlkeCA9IG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgbmNiLCBuZXRkZXYsIGZpbHRlcl9kZXYsIGlkeCk7CisJCWVyciA9IG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgbmNiLCBuZXRkZXYsIGZpbHRlcl9kZXYsIGlkeCk7CiAKLQlyZXR1cm4gaWR4OworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIHFsY25pY184Mnh4X2NhbmNlbF9pZGNfd29yayhzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3YuaAppbmRleCAyNDA2MWI5Li41ZjMyNzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92LmgKQEAgLTIzOCw3ICsyMzgsNyBAQAogaW50IHFsY25pY19zcmlvdl9zZXRfdmZfdHhfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQsIGludCwgaW50KTsKIGludCBxbGNuaWNfc3Jpb3ZfZ2V0X3ZmX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQgLAogCQkJICAgICAgIHN0cnVjdCBpZmxhX3ZmX2luZm8gKik7Ci1pbnQgcWxjbmljX3NyaW92X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgdTE2LCB1OCk7CitpbnQgcWxjbmljX3NyaW92X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgdTE2LCB1OCwgX19iZTE2KTsKIGludCBxbGNuaWNfc3Jpb3Zfc2V0X3ZmX3Nwb29mY2hrKHN0cnVjdCBuZXRfZGV2aWNlICosIGludCwgYm9vbCk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHFsY25pY19zcmlvdl9wZl9kaXNhYmxlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlcikge30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92X3BmLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19zcmlvdl9wZi5jCmluZGV4IGFmZDY4N2UuLjUwZWFhZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX3NyaW92X3BmLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfc3Jpb3ZfcGYuYwpAQCAtMTkxNSw3ICsxOTE1LDcgQEAKIH0KIAogaW50IHFsY25pY19zcmlvdl9zZXRfdmZfdmxhbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsCi0JCQkgICAgIHUxNiB2bGFuLCB1OCBxb3MpCisJCQkgICAgIHUxNiB2bGFuLCB1OCBxb3MsIF9fYmUxNiB2bGFuX3Byb3RvKQogewogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHFsY25pY19zcmlvdiAqc3Jpb3YgPSBhZGFwdGVyLT5haHctPnNyaW92OwpAQCAtMTkyOCw2ICsxOTI4LDkgQEAKIAlpZiAodmYgPj0gc3Jpb3YtPm51bV92ZnMgfHwgcW9zID4gNykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAodmxhbl9wcm90byAhPSBodG9ucyhFVEhfUF84MDIxUSkpCisJCXJldHVybiAtRVBST1RPTk9TVVBQT1JUOworCiAJaWYgKHZsYW4gPiBNQVhfVkxBTl9JRCkgewogCQluZXRkZXZfZXJyKG5ldGRldiwKIAkJCSAgICJJbnZhbGlkIFZMQU4gSUQsIGFsbG93ZWQgcmFuZ2UgaXMgWzAgLSAlZF1cbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vS2NvbmZpZwppbmRleCBhNzZlMzgwLi45YmE1NjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL0tjb25maWcKQEAgLTI0LDQgKzI0LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBUaGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBxY2FzcGkuCiAKK2NvbmZpZyBRQ09NX0VNQUMKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIEVNQUMgR2lnYWJpdCBFdGhlcm5ldCBzdXBwb3J0IgorCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBQSFlMSUIKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIEdpZ2FiaXQKKwkgIEV0aGVybmV0IE1lZGlhIEFjY2VzcyBDb250cm9sbGVyIChFTUFDKS4gVGhlIGNvbnRyb2xsZXIKKwkgIHN1cHBvcnRzIElFRUUgODAyLjMtMjAwMiwgaGFsZi1kdXBsZXggbW9kZSBhdCAxMC8xMDAgTWIvcywKKwkgIGZ1bGwtZHVwbGV4IG1vZGUgYXQgMTAvMTAwLzEwMDBNYi9zLCBXYWtlIE9uIExBTiAoV09MKSBmb3IKKwkgIGxvdyBwb3dlciwgUmVjZWl2ZS1TaWRlIFNjYWxpbmcgKFJTUyksIGFuZCBJRUVFIDE1ODgtMjAwOAorCSAgUHJlY2lzaW9uIENsb2NrIFN5bmNocm9uaXphdGlvbiBQcm90b2NvbC4KKwogZW5kaWYgIyBORVRfVkVORE9SX1FVQUxDT01NCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL01ha2VmaWxlCmluZGV4IDlkYTJkNzUuLmFhY2IwYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL01ha2VmaWxlCkBAIC00LDMgKzQsNSBAQAogCiBvYmotJChDT05GSUdfUUNBNzAwMCkgKz0gcWNhc3BpLm8KIHFjYXNwaS1vYmpzIDo9IHFjYV9zcGkubyBxY2FfZnJhbWluZy5vIHFjYV83ay5vIHFjYV9kZWJ1Zy5vCisKK29iai15ICs9IGVtYWMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWVlMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gRU1BQyBHaWdhYml0IEV0aGVybmV0IGRyaXZlcgorIworCitvYmotJChDT05GSUdfUUNPTV9FTUFDKSArPSBxY29tLWVtYWMubworCitxY29tLWVtYWMtb2JqcyA6PSBlbWFjLm8gZW1hYy1tYWMubyBlbWFjLXBoeS5vIGVtYWMtc2dtaWkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLW1hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLW1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5Nzk2OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtbWFjLmMKQEAgLTAsMCArMSwxNTI4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gRU1BQyBFdGhlcm5ldCBDb250cm9sbGVyIE1BQyBsYXllciBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KKyNpbmNsdWRlICJlbWFjLmgiCisjaW5jbHVkZSAiZW1hYy1zZ21paS5oIgorCisvKiBFTUFDIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBFTUFDX01BQ19DVFJMCQkJMHgwMDE0ODAKKyNkZWZpbmUgRU1BQ19XT0xfQ1RSTDAJCQkweDAwMTRhMAorI2RlZmluZSBFTUFDX1JTU19LRVkwCQkJMHgwMDE0YjAKKyNkZWZpbmUgRU1BQ19IMVRQRF9CQVNFX0FERFJfTE8JCTB4MDAxNGUwCisjZGVmaW5lIEVNQUNfSDJUUERfQkFTRV9BRERSX0xPCQkweDAwMTRlNAorI2RlZmluZSBFTUFDX0gzVFBEX0JBU0VfQUREUl9MTwkJMHgwMDE0ZTgKKyNkZWZpbmUgRU1BQ19JTlRFUl9TUkFNX1BBUlQ5CQkweDAwMTUzNAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF8wCQkweDAwMTU0MAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF8xCQkweDAwMTU0NAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF8yCQkweDAwMTU1MAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF8xMAkJMHgwMDE1NTQKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfMTIJCTB4MDAxNTU4CisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzEzCQkweDAwMTU1YworI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF8zCQkweDAwMTU2MAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF80CQkweDAwMTU2NAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF81CQkweDAwMTU2OAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF8xNAkJMHgwMDE1NmMKKyNkZWZpbmUgRU1BQ19ERVNDX0NUUkxfMTUJCTB4MDAxNTcwCisjZGVmaW5lIEVNQUNfREVTQ19DVFJMXzE2CQkweDAwMTU3NAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF82CQkweDAwMTU3OAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF84CQkweDAwMTU4MAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF85CQkweDAwMTU4NAorI2RlZmluZSBFTUFDX0RFU0NfQ1RSTF8xMQkJMHgwMDE1ODgKKyNkZWZpbmUgRU1BQ19UWFFfQ1RSTF8wCQkJMHgwMDE1OTAKKyNkZWZpbmUgRU1BQ19UWFFfQ1RSTF8xCQkJMHgwMDE1OTQKKyNkZWZpbmUgRU1BQ19UWFFfQ1RSTF8yCQkJMHgwMDE1OTgKKyNkZWZpbmUgRU1BQ19SWFFfQ1RSTF8wCQkJMHgwMDE1YTAKKyNkZWZpbmUgRU1BQ19SWFFfQ1RSTF8xCQkJMHgwMDE1YTQKKyNkZWZpbmUgRU1BQ19SWFFfQ1RSTF8yCQkJMHgwMDE1YTgKKyNkZWZpbmUgRU1BQ19SWFFfQ1RSTF8zCQkJMHgwMDE1YWMKKyNkZWZpbmUgRU1BQ19CQVNFX0NQVV9OVU1CRVIJCTB4MDAxNWI4CisjZGVmaW5lIEVNQUNfRE1BX0NUUkwJCQkweDAwMTVjMAorI2RlZmluZSBFTUFDX01BSUxCT1hfMAkJCTB4MDAxNWUwCisjZGVmaW5lIEVNQUNfTUFJTEJPWF81CQkJMHgwMDE1ZTQKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzYJCQkweDAwMTVlOAorI2RlZmluZSBFTUFDX01BSUxCT1hfMTMJCQkweDAwMTVlYworI2RlZmluZSBFTUFDX01BSUxCT1hfMgkJCTB4MDAxNWY0CisjZGVmaW5lIEVNQUNfTUFJTEJPWF8zCQkJMHgwMDE1ZjgKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzExCQkJMHgwMDE2MGMKKyNkZWZpbmUgRU1BQ19BWElfTUFTVF9DVFJMCQkweDAwMTYxMAorI2RlZmluZSBFTUFDX01BSUxCT1hfMTIJCQkweDAwMTYxNAorI2RlZmluZSBFTUFDX01BSUxCT1hfOQkJCTB4MDAxNjE4CisjZGVmaW5lIEVNQUNfTUFJTEJPWF8xMAkJCTB4MDAxNjFjCisjZGVmaW5lIEVNQUNfQVRIUl9IRUFERVJfQ1RSTAkJMHgwMDE2MjAKKyNkZWZpbmUgRU1BQ19DTEtfR0FURV9DVFJMCQkweDAwMTgxNAorI2RlZmluZSBFTUFDX01JU0NfQ1RSTAkJCTB4MDAxOTkwCisjZGVmaW5lIEVNQUNfTUFJTEJPWF83CQkJMHgwMDE5ZTAKKyNkZWZpbmUgRU1BQ19NQUlMQk9YXzgJCQkweDAwMTllNAorI2RlZmluZSBFTUFDX01BSUxCT1hfMTUJCQkweDAwMWJkNAorI2RlZmluZSBFTUFDX01BSUxCT1hfMTYJCQkweDAwMWJkOAorCisvKiBFTUFDX01BQ19DVFJMICovCisjZGVmaW5lIFNJTkdMRV9QQVVTRV9NT0RFICAgICAgIAkweDEwMDAwMDAwCisjZGVmaW5lIERFQlVHX01PREUgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBCUk9BRF9FTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgTVVMVElfQUxMICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIFJYX0NIS1NVTV9FTiAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBIVUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgU1BFRUQoeCkJCQkoKCh4KSAmIDB4MykgPDwgMjApCisjZGVmaW5lIFNQRUVEX01BU0sJCQlTUEVFRCgweDMpCisjZGVmaW5lIFNJTVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBUUEFVU0UgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgUFJPTV9NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIFZMQU5fU1RSSVAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBQUkxFTl9CTVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDNjMDAKKyNkZWZpbmUgUFJMRU5fU0hGVCAgICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBIVUdFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRkxDSEsgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFBDUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBDUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRlVMTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIE1BQ19MUF9FTiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBSWEZDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgVFhGQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFJYRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBUWEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKworCisvKiBFTUFDX1dPTF9DVFJMMCAqLworI2RlZmluZSBMS19DSEdfUE1FCQkJMHgyMAorI2RlZmluZSBMS19DSEdfRU4JCQkweDEwCisjZGVmaW5lIE1HX0ZSQU1FX1BNRQkJCTB4OAorI2RlZmluZSBNR19GUkFNRV9FTgkJCTB4NAorI2RlZmluZSBXS19GUkFNRV9FTgkJCTB4MQorCisvKiBFTUFDX0RFU0NfQ1RSTF8zICovCisjZGVmaW5lIFJGRF9SSU5HX1NJWkVfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisKKy8qIEVNQUNfREVTQ19DVFJMXzQgKi8KKyNkZWZpbmUgUlhfQlVGRkVSX1NJWkVfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKworLyogRU1BQ19ERVNDX0NUUkxfNiAqLworI2RlZmluZSBSUkRfUklOR19TSVpFX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorCisvKiBFTUFDX0RFU0NfQ1RSTF85ICovCisjZGVmaW5lIFRQRF9SSU5HX1NJWkVfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmCisKKy8qIEVNQUNfVFhRX0NUUkxfMCAqLworI2RlZmluZSBOVU1fVFhGX0JVUlNUX1BSRUZfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBOVU1fVFhGX0JVUlNUX1BSRUZfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBMU184MDIzX1NQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBUWFFfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBUWFFfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBJUF9PUF9TUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBOVU1fVFBEX0JVUlNUX1BSRUZfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZgorI2RlZmluZSBOVU1fVFBEX0JVUlNUX1BSRUZfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX1RYUV9DVFJMXzEgKi8KKyNkZWZpbmUgSlVNQk9fVEFTS19PRkZMT0FEX1RIUkVTSE9MRF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZmYKKworLyogRU1BQ19UWFFfQ1RSTF8yICovCisjZGVmaW5lIFRYRl9IV01fQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYwMDAwCisjZGVmaW5lIFRYRl9MV01fQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisKKy8qIEVNQUNfUlhRX0NUUkxfMCAqLworI2RlZmluZSBSWFFfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMxKQorI2RlZmluZSBDVVRfVEhSVV9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMwKQorI2RlZmluZSBSU1NfSEFTSF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDI5KQorI2RlZmluZSBOVU1fUkZEX0JVUlNUX1BSRUZfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2YwMDAwMAorI2RlZmluZSBOVU1fUkZEX0JVUlNUX1BSRUZfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBJRFRfVEFCTEVfU0laRV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxZmYwMAorI2RlZmluZSBJRFRfVEFCTEVfU0laRV9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBTUF9JUFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MAorCisvKiBFTUFDX1JYUV9DVFJMXzEgKi8KKyNkZWZpbmUgSlVNQk9fMUtBSF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGYwMDAKKyNkZWZpbmUgSlVNQk9fMUtBSF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgUkZEX1BSRUZfTE9XX1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUkZEX1BSRUZfTE9XX1RIUkVTSE9MRF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmYzAKKyNkZWZpbmUgUkZEX1BSRUZfTE9XX1RIUkVTSE9MRF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUkZEX1BSRUZfVVBfVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUkZEX1BSRUZfVVBfVEhSRVNIT0xEX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M2YKKyNkZWZpbmUgUkZEX1BSRUZfVVBfVEhSRVNIT0xEX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19SWFFfQ1RSTF8yICovCisjZGVmaW5lIFJYRl9ET0ZfVEhSRVNGSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWEwCisjZGVmaW5lIFJYRl9ET0ZfVEhSRVNIT0xEX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYwMDAwCisjZGVmaW5lIFJYRl9ET0ZfVEhSRVNIT0xEX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJYRl9VT0ZfVEhSRVNGSE9MRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGJlCisjZGVmaW5lIFJYRl9VT0ZfVEhSRVNIT0xEX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisjZGVmaW5lIFJYRl9VT0ZfVEhSRVNIT0xEX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfUlhRX0NUUkxfMyAqLworI2RlZmluZSBSWERfVElNRVJfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBSWERfVEhSRVNIT0xEX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBSWERfVEhSRVNIT0xEX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX0RNQV9DVFJMICovCisjZGVmaW5lIERNQVdfRExZX0NOVF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGYwMDAwCisjZGVmaW5lIERNQVdfRExZX0NOVF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIERNQVJfRExZX0NOVF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmODAwCisjZGVmaW5lIERNQVJfRExZX0NOVF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIERNQVJfUkVRX1BSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIFJFR1dSQkxFTl9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwCisjZGVmaW5lIFJFR1dSQkxFTl9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFJFR1JEQkxFTl9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwCisjZGVmaW5lIFJFR1JEQkxFTl9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE9VVF9PUkRFUl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIEVOSF9PUkRFUl9NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIElOX09SREVSX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisKKy8qIEVNQUNfTUFJTEJPWF8xMyAqLworI2RlZmluZSBSRkQzX1BST0NfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmMDAwMAorI2RlZmluZSBSRkQzX1BST0NfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBSRkQzX1BST0RfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBSRkQzX1BST0RfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX01BSUxCT1hfMiAqLworI2RlZmluZSBOVFBEX0NPTlNfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBOVFBEX0NPTlNfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorCisvKiBFTUFDX01BSUxCT1hfMyAqLworI2RlZmluZSBSRkQwX0NPTlNfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZgorI2RlZmluZSBSRkQwX0NPTlNfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX01BSUxCT1hfMTEgKi8KKyNkZWZpbmUgSDNUUERfUFJPRF9JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSDNUUERfUFJPRF9JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKworLyogRU1BQ19BWElfTUFTVF9DVFJMICovCisjZGVmaW5lIERBVEFfQllURV9TV0FQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIE1BWF9CT1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIE1BWF9CVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisKKy8qIEVNQUNfTUFJTEJPWF8xMiAqLworI2RlZmluZSBIM1RQRF9DT05TX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBIM1RQRF9DT05TX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorCisvKiBFTUFDX01BSUxCT1hfOSAqLworI2RlZmluZSBIMlRQRF9QUk9EX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBIMlRQRF9QUk9EX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX01BSUxCT1hfMTAgKi8KKyNkZWZpbmUgSDFUUERfQ09OU19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgSDFUUERfQ09OU19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSDJUUERfQ09OU19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgSDJUUERfQ09OU19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19BVEhSX0hFQURFUl9DVFJMICovCisjZGVmaW5lIEhFQURFUl9DTlRfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIEhFQURFUl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisKKy8qIEVNQUNfTUFJTEJPWF8wICovCisjZGVmaW5lIFJGRDBfUFJPQ19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYwMDAwCisjZGVmaW5lIFJGRDBfUFJPQ19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJGRDBfUFJPRF9JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisjZGVmaW5lIFJGRDBfUFJPRF9JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfTUFJTEJPWF81ICovCisjZGVmaW5lIFJGRDFfUFJPQ19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYwMDAwCisjZGVmaW5lIFJGRDFfUFJPQ19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJGRDFfUFJPRF9JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisjZGVmaW5lIFJGRDFfUFJPRF9JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfTUlTQ19DVFJMICovCisjZGVmaW5lIFJYX1VOQ1BMX0lOVF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisKKy8qIEVNQUNfTUFJTEJPWF83ICovCisjZGVmaW5lIFJGRDJfQ09OU19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYwMDAwCisjZGVmaW5lIFJGRDJfQ09OU19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFJGRDFfQ09OU19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisjZGVmaW5lIFJGRDFfQ09OU19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfTUFJTEJPWF84ICovCisjZGVmaW5lIFJGRDNfQ09OU19JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmCisjZGVmaW5lIFJGRDNfQ09OU19JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qIEVNQUNfTUFJTEJPWF8xNSAqLworI2RlZmluZSBOVFBEX1BST0RfSURYX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBOVFBEX1BST0RfSURYX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX01BSUxCT1hfMTYgKi8KKyNkZWZpbmUgSDFUUERfUFJPRF9JRFhfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgSDFUUERfUFJPRF9JRFhfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBSWFEwX1JTU19IU1RZUF9JUFY2X1RDUF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBSWFEwX1JTU19IU1RZUF9JUFY2X0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSBSWFEwX1JTU19IU1RZUF9JUFY0X1RDUF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSBSWFEwX1JTU19IU1RZUF9JUFY0X0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorCisvKiBFTUFDX0VNQUNfV1JBUFBFUl9UWF9UU19JTlggKi8KKyNkZWZpbmUgRU1BQ19XUkFQUEVSX1RYX1RTX0VNUFRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgzMSkKKyNkZWZpbmUgRU1BQ19XUkFQUEVSX1RYX1RTX0lOWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKworc3RydWN0IGVtYWNfc2tiX2NiIHsKKwl1MzIgICAgICAgICAgIHRwZF9pZHg7CisJdW5zaWduZWQgbG9uZyBqaWZmaWVzOworfTsKKworI2RlZmluZSBFTUFDX1NLQl9DQihza2IpCSgoc3RydWN0IGVtYWNfc2tiX2NiICopKHNrYiktPmNiKQorI2RlZmluZSBFTUFDX1JTU19JRFRfU0laRQkyNTYKKyNkZWZpbmUgSlVNQk9fMUtBSAkJMHg0CisjZGVmaW5lIFJYRF9USAkJCTB4MTAwCisjZGVmaW5lIEVNQUNfVFBEX0xBU1RfRlJBR01FTlQJMHg4MDAwMDAwMAorI2RlZmluZSBFTUFDX1RQRF9UU1RBTVBfU0FWRQkweDgwMDAwMDAwCisKKy8qIEVNQUMgRXJyb3JzIGluIGVtYWNfcnJkLndvcmRbM10gKi8KKyNkZWZpbmUgRU1BQ19SUkRfTDRGCQlCSVQoMTQpCisjZGVmaW5lIEVNQUNfUlJEX0lQRgkJQklUKDE1KQorI2RlZmluZSBFTUFDX1JSRF9DUkMJCUJJVCgyMSkKKyNkZWZpbmUgRU1BQ19SUkRfRkFFCQlCSVQoMjIpCisjZGVmaW5lIEVNQUNfUlJEX1RSTgkJQklUKDIzKQorI2RlZmluZSBFTUFDX1JSRF9STlQJCUJJVCgyNCkKKyNkZWZpbmUgRU1BQ19SUkRfSU5DCQlCSVQoMjUpCisjZGVmaW5lIEVNQUNfUlJEX0ZPVgkJQklUKDI5KQorI2RlZmluZSBFTUFDX1JSRF9MRU4JCUJJVCgzMCkKKworLyogRXJyb3IgYml0cyB0aGF0IHdpbGwgcmVzdWx0IGluIGEgcmVjZWl2ZWQgZnJhbWUgYmVpbmcgZGlzY2FyZGVkICovCisjZGVmaW5lIEVNQUNfUlJEX0VSUk9SIChFTUFDX1JSRF9JUEYgfCBFTUFDX1JSRF9DUkMgfCBFTUFDX1JSRF9GQUUgfCBcCisJCQlFTUFDX1JSRF9UUk4gfCBFTUFDX1JSRF9STlQgfCBFTUFDX1JSRF9JTkMgfCBcCisJCQlFTUFDX1JSRF9GT1YgfCBFTUFDX1JSRF9MRU4pCisjZGVmaW5lIEVNQUNfUlJEX1NUQVRTX0RXX0lEWCAzCisKKyNkZWZpbmUgRU1BQ19SUkQoUlhRLCBTSVpFLCBJRFgpCSgoUlhRKS0+cnJkLnZfYWRkciArIChTSVpFICogKElEWCkpKQorI2RlZmluZSBFTUFDX1JGRChSWFEsIFNJWkUsIElEWCkJKChSWFEpLT5yZmQudl9hZGRyICsgKFNJWkUgKiAoSURYKSkpCisjZGVmaW5lIEVNQUNfVFBEKFRYUSwgU0laRSwgSURYKQkoKFRYUSktPnRwZC52X2FkZHIgKyAoU0laRSAqIChJRFgpKSkKKworI2RlZmluZSBHRVRfUkZEX0JVRkZFUihSWFEsIElEWCkJKCYoKFJYUSktPnJmZC5yZmJ1ZmZbKElEWCldKSkKKyNkZWZpbmUgR0VUX1RQRF9CVUZGRVIoUlRRLCBJRFgpCSgmKChSVFEpLT50cGQudHBidWZmWyhJRFgpXSkpCisKKyNkZWZpbmUgRU1BQ19UWF9QT0xMX0hXVFhUU1RBTVBfVEhSRVNIT0xECTgKKworI2RlZmluZSBJU1JfUlhfUEtUICAgICAgKFwKKwlSWF9QS1RfSU5UMCAgICAgfFwKKwlSWF9QS1RfSU5UMSAgICAgfFwKKwlSWF9QS1RfSU5UMiAgICAgfFwKKwlSWF9QS1RfSU5UMykKKworI2RlZmluZSBFTUFDX01BQ19JUlFfUkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSJjb3JlMCIKKwordm9pZCBlbWFjX21hY19tdWx0aWNhc3RfYWRkcl9zZXQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwgdTggKmFkZHIpCit7CisJdTMyIGNyYzMyLCBiaXQsIHJlZywgbXRhOworCisJLyogQ2FsY3VsYXRlIHRoZSBDUkMgb2YgdGhlIE1BQyBhZGRyZXNzICovCisJY3JjMzIgPSBldGhlcl9jcmMoRVRIX0FMRU4sIGFkZHIpOworCisJLyogVGhlIEhBU0ggVGFibGUgaXMgYW4gYXJyYXkgb2YgMiAzMi1iaXQgcmVnaXN0ZXJzLiBJdCBpcworCSAqIHRyZWF0ZWQgbGlrZSBhbiBhcnJheSBvZiA2NCBiaXRzIChCaXRBcnJheVtoYXNoX3ZhbHVlXSkuCisJICogVXNlIHRoZSB1cHBlciA2IGJpdHMgb2YgdGhlIGFib3ZlIENSQyBhcyB0aGUgaGFzaCB2YWx1ZS4KKwkgKi8KKwlyZWcgPSAoY3JjMzIgPj4gMzEpICYgMHgxOworCWJpdCA9IChjcmMzMiA+PiAyNikgJiAweDFGOworCisJbXRhID0gcmVhZGwoYWRwdC0+YmFzZSArIEVNQUNfSEFTSF9UQUJfUkVHMCArIChyZWcgPDwgMikpOworCW10YSB8PSBCSVQoYml0KTsKKwl3cml0ZWwobXRhLCBhZHB0LT5iYXNlICsgRU1BQ19IQVNIX1RBQl9SRUcwICsgKHJlZyA8PCAyKSk7Cit9CisKK3ZvaWQgZW1hY19tYWNfbXVsdGljYXN0X2FkZHJfY2xlYXIoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwl3cml0ZWwoMCwgYWRwdC0+YmFzZSArIEVNQUNfSEFTSF9UQUJfUkVHMCk7CisJd3JpdGVsKDAsIGFkcHQtPmJhc2UgKyBFTUFDX0hBU0hfVEFCX1JFRzEpOworfQorCisvKiBkZWZpbml0aW9ucyBmb3IgUlNTICovCisjZGVmaW5lIEVNQUNfUlNTX0tFWShfaSwgX3R5cGUpIFwKKwkJKEVNQUNfUlNTX0tFWTAgKyAoKF9pKSAqIHNpemVvZihfdHlwZSkpKQorI2RlZmluZSBFTUFDX1JTU19UQkwoX2ksIF90eXBlKSBcCisJCShFTUFDX0lEVF9UQUJMRTAgKyAoKF9pKSAqIHNpemVvZihfdHlwZSkpKQorCisvKiBDb25maWcgTUFDIG1vZGVzICovCit2b2lkIGVtYWNfbWFjX21vZGVfY29uZmlnKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkcHQtPm5ldGRldjsKKwl1MzIgbWFjOworCisJbWFjID0gcmVhZGwoYWRwdC0+YmFzZSArIEVNQUNfTUFDX0NUUkwpOworCW1hYyAmPSB+KFZMQU5fU1RSSVAgfCBQUk9NX01PREUgfCBNVUxUSV9BTEwgfCBNQUNfTFBfRU4pOworCisJaWYgKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCkKKwkJbWFjIHw9IFZMQU5fU1RSSVA7CisKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQltYWMgfD0gUFJPTV9NT0RFOworCisJaWYgKG5ldGRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCisJCW1hYyB8PSBNVUxUSV9BTEw7CisKKwl3cml0ZWwobWFjLCBhZHB0LT5iYXNlICsgRU1BQ19NQUNfQ1RSTCk7Cit9CisKKy8qIENvbmZpZyBkZXNjcmlwdG9yIHJpbmdzICovCitzdGF0aWMgdm9pZCBlbWFjX21hY19kbWFfcmluZ3NfY29uZmlnKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHRwZF9xX29mZnNldFtdID0geworCQlFTUFDX0RFU0NfQ1RSTF84LCAgICAgICAgRU1BQ19IMVRQRF9CQVNFX0FERFJfTE8sCisJCUVNQUNfSDJUUERfQkFTRV9BRERSX0xPLCBFTUFDX0gzVFBEX0JBU0VfQUREUl9MT307CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHJmZF9xX29mZnNldFtdID0geworCQlFTUFDX0RFU0NfQ1RSTF8yLCAgICAgICAgRU1BQ19ERVNDX0NUUkxfMTAsCisJCUVNQUNfREVTQ19DVFJMXzEyLCAgICAgICBFTUFDX0RFU0NfQ1RSTF8xM307CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHJyZF9xX29mZnNldFtdID0geworCQlFTUFDX0RFU0NfQ1RSTF81LCAgICAgICAgRU1BQ19ERVNDX0NUUkxfMTQsCisJCUVNQUNfREVTQ19DVFJMXzE1LCAgICAgICBFTUFDX0RFU0NfQ1RSTF8xNn07CisKKwkvKiBUUEQgKFRyYW5zbWl0IFBhY2tldCBEZXNjcmlwdG9yKSAqLworCXdyaXRlbCh1cHBlcl8zMl9iaXRzKGFkcHQtPnR4X3EudHBkLmRtYV9hZGRyKSwKKwkgICAgICAgYWRwdC0+YmFzZSArIEVNQUNfREVTQ19DVFJMXzEpOworCisJd3JpdGVsKGxvd2VyXzMyX2JpdHMoYWRwdC0+dHhfcS50cGQuZG1hX2FkZHIpLAorCSAgICAgICBhZHB0LT5iYXNlICsgdHBkX3Ffb2Zmc2V0WzBdKTsKKworCXdyaXRlbChhZHB0LT50eF9xLnRwZC5jb3VudCAmIFRQRF9SSU5HX1NJWkVfQk1TSywKKwkgICAgICAgYWRwdC0+YmFzZSArIEVNQUNfREVTQ19DVFJMXzkpOworCisJLyogUkZEIChSZWNlaXZlIEZyZWUgRGVzY3JpcHRvcikgJiBSUkQgKFJlY2VpdmUgUmV0dXJuIERlc2NyaXB0b3IpICovCisJd3JpdGVsKHVwcGVyXzMyX2JpdHMoYWRwdC0+cnhfcS5yZmQuZG1hX2FkZHIpLAorCSAgICAgICBhZHB0LT5iYXNlICsgRU1BQ19ERVNDX0NUUkxfMCk7CisKKwl3cml0ZWwobG93ZXJfMzJfYml0cyhhZHB0LT5yeF9xLnJmZC5kbWFfYWRkciksCisJICAgICAgIGFkcHQtPmJhc2UgKyByZmRfcV9vZmZzZXRbMF0pOworCXdyaXRlbChsb3dlcl8zMl9iaXRzKGFkcHQtPnJ4X3EucnJkLmRtYV9hZGRyKSwKKwkgICAgICAgYWRwdC0+YmFzZSArIHJyZF9xX29mZnNldFswXSk7CisKKwl3cml0ZWwoYWRwdC0+cnhfcS5yZmQuY291bnQgJiBSRkRfUklOR19TSVpFX0JNU0ssCisJICAgICAgIGFkcHQtPmJhc2UgKyBFTUFDX0RFU0NfQ1RSTF8zKTsKKwl3cml0ZWwoYWRwdC0+cnhfcS5ycmQuY291bnQgJiBSUkRfUklOR19TSVpFX0JNU0ssCisJICAgICAgIGFkcHQtPmJhc2UgKyBFTUFDX0RFU0NfQ1RSTF82KTsKKworCXdyaXRlbChhZHB0LT5yeGJ1Zl9zaXplICYgUlhfQlVGRkVSX1NJWkVfQk1TSywKKwkgICAgICAgYWRwdC0+YmFzZSArIEVNQUNfREVTQ19DVFJMXzQpOworCisJd3JpdGVsKDAsIGFkcHQtPmJhc2UgKyBFTUFDX0RFU0NfQ1RSTF8xMSk7CisKKwkvKiBMb2FkIGFsbCBvZiB0aGUgYmFzZSBhZGRyZXNzZXMgYWJvdmUgYW5kIGVuc3VyZSB0aGF0IHRyaWdnZXJpbmcgSFcgdG8KKwkgKiByZWFkIHJpbmcgcG9pbnRlcnMgaXMgZmx1c2hlZAorCSAqLworCXdyaXRlbCgxLCBhZHB0LT5iYXNlICsgRU1BQ19JTlRFUl9TUkFNX1BBUlQ5KTsKK30KKworLyogQ29uZmlnIHRyYW5zbWl0IHBhcmFtZXRlcnMgKi8KK3N0YXRpYyB2b2lkIGVtYWNfbWFjX3R4X2NvbmZpZyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXUzMiB2YWw7CisKKwl3cml0ZWwoKEVNQUNfTUFYX1RYX09GRkxPQURfVEhSRVNIID4+IDMpICYKKwkgICAgICAgSlVNQk9fVEFTS19PRkZMT0FEX1RIUkVTSE9MRF9CTVNLLCBhZHB0LT5iYXNlICsgRU1BQ19UWFFfQ1RSTF8xKTsKKworCXZhbCA9IChhZHB0LT50cGRfYnVyc3QgPDwgTlVNX1RQRF9CVVJTVF9QUkVGX1NIRlQpICYKKwkgICAgICAgTlVNX1RQRF9CVVJTVF9QUkVGX0JNU0s7CisKKwl2YWwgfD0gVFhRX01PREUgfCBMU184MDIzX1NQOworCXZhbCB8PSAoMHgwMTAwIDw8IE5VTV9UWEZfQlVSU1RfUFJFRl9TSEZUKSAmCisJCU5VTV9UWEZfQlVSU1RfUFJFRl9CTVNLOworCisJd3JpdGVsKHZhbCwgYWRwdC0+YmFzZSArIEVNQUNfVFhRX0NUUkxfMCk7CisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfVFhRX0NUUkxfMiwKKwkJCSAgKFRYRl9IV01fQk1TSyB8IFRYRl9MV01fQk1TSyksIDApOworfQorCisvKiBDb25maWcgcmVjZWl2ZSBwYXJhbWV0ZXJzICovCitzdGF0aWMgdm9pZCBlbWFjX21hY19yeF9jb25maWcoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gKGFkcHQtPnJmZF9idXJzdCA8PCBOVU1fUkZEX0JVUlNUX1BSRUZfU0hGVCkgJgorCSAgICAgICBOVU1fUkZEX0JVUlNUX1BSRUZfQk1TSzsKKwl2YWwgfD0gKFNQX0lQVjYgfCBDVVRfVEhSVV9FTik7CisKKwl3cml0ZWwodmFsLCBhZHB0LT5iYXNlICsgRU1BQ19SWFFfQ1RSTF8wKTsKKworCXZhbCA9IHJlYWRsKGFkcHQtPmJhc2UgKyBFTUFDX1JYUV9DVFJMXzEpOworCXZhbCAmPSB+KEpVTUJPXzFLQUhfQk1TSyB8IFJGRF9QUkVGX0xPV19USFJFU0hPTERfQk1TSyB8CisJCSBSRkRfUFJFRl9VUF9USFJFU0hPTERfQk1TSyk7CisJdmFsIHw9IChKVU1CT18xS0FIIDw8IEpVTUJPXzFLQUhfU0hGVCkgfAorCQkoUkZEX1BSRUZfTE9XX1RIIDw8IFJGRF9QUkVGX0xPV19USFJFU0hPTERfU0hGVCkgfAorCQkoUkZEX1BSRUZfVVBfVEggIDw8IFJGRF9QUkVGX1VQX1RIUkVTSE9MRF9TSEZUKTsKKwl3cml0ZWwodmFsLCBhZHB0LT5iYXNlICsgRU1BQ19SWFFfQ1RSTF8xKTsKKworCXZhbCA9IHJlYWRsKGFkcHQtPmJhc2UgKyBFTUFDX1JYUV9DVFJMXzIpOworCXZhbCAmPSB+KFJYRl9ET0ZfVEhSRVNIT0xEX0JNU0sgfCBSWEZfVU9GX1RIUkVTSE9MRF9CTVNLKTsKKwl2YWwgfD0gKFJYRl9ET0ZfVEhSRVNGSE9MRCAgPDwgUlhGX0RPRl9USFJFU0hPTERfU0hGVCkgfAorCQkoUlhGX1VPRl9USFJFU0ZIT0xEIDw8IFJYRl9VT0ZfVEhSRVNIT0xEX1NIRlQpOworCXdyaXRlbCh2YWwsIGFkcHQtPmJhc2UgKyBFTUFDX1JYUV9DVFJMXzIpOworCisJdmFsID0gcmVhZGwoYWRwdC0+YmFzZSArIEVNQUNfUlhRX0NUUkxfMyk7CisJdmFsICY9IH4oUlhEX1RJTUVSX0JNU0sgfCBSWERfVEhSRVNIT0xEX0JNU0spOworCXZhbCB8PSBSWERfVEggPDwgUlhEX1RIUkVTSE9MRF9TSEZUOworCXdyaXRlbCh2YWwsIGFkcHQtPmJhc2UgKyBFTUFDX1JYUV9DVFJMXzMpOworfQorCisvKiBDb25maWcgZG1hICovCitzdGF0aWMgdm9pZCBlbWFjX21hY19kbWFfY29uZmlnKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJdTMyIGRtYV9jdHJsID0gRE1BUl9SRVFfUFJJOworCisJc3dpdGNoIChhZHB0LT5kbWFfb3JkZXIpIHsKKwljYXNlIGVtYWNfZG1hX29yZF9pbjoKKwkJZG1hX2N0cmwgfD0gSU5fT1JERVJfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBlbWFjX2RtYV9vcmRfZW5oOgorCQlkbWFfY3RybCB8PSBFTkhfT1JERVJfTU9ERTsKKwkJYnJlYWs7CisJY2FzZSBlbWFjX2RtYV9vcmRfb3V0OgorCQlkbWFfY3RybCB8PSBPVVRfT1JERVJfTU9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJZG1hX2N0cmwgfD0gKCgodTMyKWFkcHQtPmRtYXJfYmxvY2spIDw8IFJFR1JEQkxFTl9TSEZUKSAmCisJCQkJCQlSRUdSREJMRU5fQk1TSzsKKwlkbWFfY3RybCB8PSAoKCh1MzIpYWRwdC0+ZG1hd19ibG9jaykgPDwgUkVHV1JCTEVOX1NIRlQpICYKKwkJCQkJCVJFR1dSQkxFTl9CTVNLOworCWRtYV9jdHJsIHw9ICgoKHUzMilhZHB0LT5kbWFyX2RseV9jbnQpIDw8IERNQVJfRExZX0NOVF9TSEZUKSAmCisJCQkJCQlETUFSX0RMWV9DTlRfQk1TSzsKKwlkbWFfY3RybCB8PSAoKCh1MzIpYWRwdC0+ZG1hd19kbHlfY250KSA8PCBETUFXX0RMWV9DTlRfU0hGVCkgJgorCQkJCQkJRE1BV19ETFlfQ05UX0JNU0s7CisKKwkvKiBjb25maWcgRE1BIGFuZCBlbnN1cmUgdGhhdCBjb25maWd1cmF0aW9uIGlzIGZsdXNoZWQgdG8gSFcgKi8KKwl3cml0ZWwoZG1hX2N0cmwsIGFkcHQtPmJhc2UgKyBFTUFDX0RNQV9DVFJMKTsKK30KKworLyogc2V0IE1BQyBhZGRyZXNzICovCitzdGF0aWMgdm9pZCBlbWFjX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LCB1OCAqYWRkcikKK3sKKwl1MzIgc3RhOworCisJLyogZm9yIGV4YW1wbGU6IDAwLUEwLUM2LTExLTIyLTMzCisJICogMDwtLT5DNjExMjIzMywgMTwtLT4wMEEwLgorCSAqLworCisJLyogbG93IDMyYml0IHdvcmQgKi8KKwlzdGEgPSAoKCh1MzIpYWRkclsyXSkgPDwgMjQpIHwgKCgodTMyKWFkZHJbM10pIDw8IDE2KSB8CisJICAgICAgKCgodTMyKWFkZHJbNF0pIDw8IDgpICB8ICgoKHUzMilhZGRyWzVdKSk7CisJd3JpdGVsKHN0YSwgYWRwdC0+YmFzZSArIEVNQUNfTUFDX1NUQV9BRERSMCk7CisKKwkvKiBoaWdodCAzMmJpdCB3b3JkICovCisJc3RhID0gKCgodTMyKWFkZHJbMF0pIDw8IDgpIHwgKHUzMilhZGRyWzFdOworCXdyaXRlbChzdGEsIGFkcHQtPmJhc2UgKyBFTUFDX01BQ19TVEFfQUREUjEpOworfQorCitzdGF0aWMgdm9pZCBlbWFjX21hY19jb25maWcoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRwdC0+bmV0ZGV2OworCXVuc2lnbmVkIGludCBtYXhfZnJhbWU7CisJdTMyIHZhbDsKKworCWVtYWNfc2V0X21hY19hZGRyZXNzKGFkcHQsIG5ldGRldi0+ZGV2X2FkZHIpOworCisJbWF4X2ZyYW1lID0gbmV0ZGV2LT5tdHUgKyBFVEhfSExFTiArIEVUSF9GQ1NfTEVOICsgVkxBTl9ITEVOOworCWFkcHQtPnJ4YnVmX3NpemUgPSBuZXRkZXYtPm10dSA+IEVNQUNfREVGX1JYX0JVRl9TSVpFID8KKwkJQUxJR04obWF4X2ZyYW1lLCA4KSA6IEVNQUNfREVGX1JYX0JVRl9TSVpFOworCisJZW1hY19tYWNfZG1hX3JpbmdzX2NvbmZpZyhhZHB0KTsKKworCXdyaXRlbChuZXRkZXYtPm10dSArIEVUSF9ITEVOICsgVkxBTl9ITEVOICsgRVRIX0ZDU19MRU4sCisJICAgICAgIGFkcHQtPmJhc2UgKyBFTUFDX01BWF9GUkFNX0xFTl9DVFJMKTsKKworCWVtYWNfbWFjX3R4X2NvbmZpZyhhZHB0KTsKKwllbWFjX21hY19yeF9jb25maWcoYWRwdCk7CisJZW1hY19tYWNfZG1hX2NvbmZpZyhhZHB0KTsKKworCXZhbCA9IHJlYWRsKGFkcHQtPmJhc2UgKyBFTUFDX0FYSV9NQVNUX0NUUkwpOworCXZhbCAmPSB+KERBVEFfQllURV9TV0FQIHwgTUFYX0JPVU5EKTsKKwl2YWwgfD0gTUFYX0JUWVBFOworCXdyaXRlbCh2YWwsIGFkcHQtPmJhc2UgKyBFTUFDX0FYSV9NQVNUX0NUUkwpOworCXdyaXRlbCgwLCBhZHB0LT5iYXNlICsgRU1BQ19DTEtfR0FURV9DVFJMKTsKKwl3cml0ZWwoUlhfVU5DUExfSU5UX0VOLCBhZHB0LT5iYXNlICsgRU1BQ19NSVNDX0NUUkwpOworfQorCit2b2lkIGVtYWNfbWFjX3Jlc2V0KHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJZW1hY19tYWNfc3RvcChhZHB0KTsKKworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX0RNQV9NQVNfQ1RSTCwgMCwgU09GVF9SU1QpOworCXVzbGVlcF9yYW5nZSgxMDAsIDE1MCk7IC8qIHJlc2V0IG1heSB0YWtlIHVwIHRvIDEwMHVzZWMgKi8KKworCS8qIGludGVycnVwdCBjbGVhci1vbi1yZWFkICovCisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfRE1BX01BU19DVFJMLCAwLCBJTlRfUkRfQ0xSX0VOKTsKK30KKwordm9pZCBlbWFjX21hY19zdGFydChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBhZHB0LT5waHlkZXY7CisJdTMyIG1hYywgY3NyMTsKKworCS8qIGVuYWJsZSB0eCBxdWV1ZSAqLworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX1RYUV9DVFJMXzAsIDAsIFRYUV9FTik7CisKKwkvKiBlbmFibGUgcnggcXVldWUgKi8KKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19SWFFfQ1RSTF8wLCAwLCBSWFFfRU4pOworCisJLyogZW5hYmxlIG1hYyBjb250cm9sICovCisJbWFjID0gcmVhZGwoYWRwdC0+YmFzZSArIEVNQUNfTUFDX0NUUkwpOworCWNzcjEgPSByZWFkbChhZHB0LT5jc3IgKyBFTUFDX0VNQUNfV1JBUFBFUl9DU1IxKTsKKworCW1hYyB8PSBUWEVOIHwgUlhFTjsgICAgIC8qIGVuYWJsZSBSWC9UWCAqLworCisJLyogV2UgZG9uJ3QgaGF2ZSBldGh0b29sIHN1cHBvcnQgeWV0LCBzbyBmb3JjZSBmbG93LWNvbnRyb2wgbW9kZQorCSAqIHRvICdmdWxsJyBhbHdheXMuCisJICovCisJbWFjIHw9IFRYRkMgfCBSWEZDOworCisJLyogc2V0dXAgbGluayBzcGVlZCAqLworCW1hYyAmPSB+U1BFRURfTUFTSzsKKwlpZiAocGh5ZGV2LT5zcGVlZCA9PSBTUEVFRF8xMDAwKSB7CisJCW1hYyB8PSBTUEVFRCgyKTsKKwkJY3NyMSB8PSBGUkVRX01PREU7CisJfSBlbHNlIHsKKwkJbWFjIHw9IFNQRUVEKDEpOworCQljc3IxICY9IH5GUkVRX01PREU7CisJfQorCisJaWYgKHBoeWRldi0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCQltYWMgfD0gRlVMTEQ7CisJZWxzZQorCQltYWMgJj0gfkZVTExEOworCisJLyogb3RoZXIgcGFyYW1ldGVycyAqLworCW1hYyB8PSAoQ1JDRSB8IFBDUkNFKTsKKwltYWMgfD0gKChhZHB0LT5wcmVhbWJsZSA8PCBQUkxFTl9TSEZUKSAmIFBSTEVOX0JNU0spOworCW1hYyB8PSBCUk9BRF9FTjsKKwltYWMgfD0gRkxDSEs7CisJbWFjICY9IH5SWF9DSEtTVU1fRU47CisJbWFjICY9IH4oSFVHRU4gfCBWTEFOX1NUUklQIHwgVFBBVVNFIHwgU0lNUiB8IEhVR0UgfCBNVUxUSV9BTEwgfAorCQkgREVCVUdfTU9ERSB8IFNJTkdMRV9QQVVTRV9NT0RFKTsKKworCXdyaXRlbF9yZWxheGVkKGNzcjEsIGFkcHQtPmNzciArIEVNQUNfRU1BQ19XUkFQUEVSX0NTUjEpOworCisJd3JpdGVsX3JlbGF4ZWQobWFjLCBhZHB0LT5iYXNlICsgRU1BQ19NQUNfQ1RSTCk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0IHJlYWQgY2xlYXIsIGxvdyBwb3dlciBzbGVlcCBtb2RlIGFuZAorCSAqIHRoZSBpcnEgbW9kZXJhdG9ycworCSAqLworCisJd3JpdGVsX3JlbGF4ZWQoYWRwdC0+aXJxX21vZCwgYWRwdC0+YmFzZSArIEVNQUNfSVJRX01PRF9USU1fSU5JVCk7CisJd3JpdGVsX3JlbGF4ZWQoSU5UX1JEX0NMUl9FTiB8IExQV19NT0RFIHwgSVJRX01PREVSQVRPUl9FTiB8CisJCQlJUlFfTU9ERVJBVE9SMl9FTiwgYWRwdC0+YmFzZSArIEVNQUNfRE1BX01BU19DVFJMKTsKKworCWVtYWNfbWFjX21vZGVfY29uZmlnKGFkcHQpOworCisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfQVRIUl9IRUFERVJfQ1RSTCwKKwkJCSAgKEhFQURFUl9FTkFCTEUgfCBIRUFERVJfQ05UX0VOKSwgMCk7CisKKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5jc3IgKyBFTUFDX0VNQUNfV1JBUFBFUl9DU1IyLCAwLCBXT0xfRU4pOworfQorCit2b2lkIGVtYWNfbWFjX3N0b3Aoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19SWFFfQ1RSTF8wLCBSWFFfRU4sIDApOworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX1RYUV9DVFJMXzAsIFRYUV9FTiwgMCk7CisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfTUFDX0NUUkwsIFRYRU4gfCBSWEVOLCAwKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTA1MCk7IC8qIHN0b3BwaW5nIG1hYyBtYXkgdGFrZSB1cHRvIDFtc2VjICovCit9CisKKy8qIEZyZWUgYWxsIGRlc2NyaXB0b3JzIG9mIGdpdmVuIHRyYW5zbWl0IHF1ZXVlICovCitzdGF0aWMgdm9pZCBlbWFjX3R4X3FfZGVzY3NfZnJlZShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xID0gJmFkcHQtPnR4X3E7CisJdW5zaWduZWQgaW50IGk7CisJc2l6ZV90IHNpemU7CisKKwkvKiByaW5nIGFscmVhZHkgY2xlYXJlZCwgbm90aGluZyB0byBkbyAqLworCWlmICghdHhfcS0+dHBkLnRwYnVmZikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHR4X3EtPnRwZC5jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBlbWFjX2J1ZmZlciAqdHBidWYgPSBHRVRfVFBEX0JVRkZFUih0eF9xLCBpKTsKKworCQlpZiAodHBidWYtPmRtYV9hZGRyKSB7CisJCQlkbWFfdW5tYXBfc2luZ2xlKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJIHRwYnVmLT5kbWFfYWRkciwgdHBidWYtPmxlbmd0aCwKKwkJCQkJIERNQV9UT19ERVZJQ0UpOworCQkJdHBidWYtPmRtYV9hZGRyID0gMDsKKwkJfQorCQlpZiAodHBidWYtPnNrYikgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkodHBidWYtPnNrYik7CisJCQl0cGJ1Zi0+c2tiID0gTlVMTDsKKwkJfQorCX0KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGVtYWNfYnVmZmVyKSAqIHR4X3EtPnRwZC5jb3VudDsKKwltZW1zZXQodHhfcS0+dHBkLnRwYnVmZiwgMCwgc2l6ZSk7CisKKwkvKiBjbGVhciB0aGUgZGVzY3JpcHRvciByaW5nICovCisJbWVtc2V0KHR4X3EtPnRwZC52X2FkZHIsIDAsIHR4X3EtPnRwZC5zaXplKTsKKworCXR4X3EtPnRwZC5jb25zdW1lX2lkeCA9IDA7CisJdHhfcS0+dHBkLnByb2R1Y2VfaWR4ID0gMDsKK30KKworLyogRnJlZSBhbGwgZGVzY3JpcHRvcnMgb2YgZ2l2ZW4gcmVjZWl2ZSBxdWV1ZSAqLworc3RhdGljIHZvaWQgZW1hY19yeF9xX2ZyZWVfZGVzY3Moc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQ7CisJc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EgPSAmYWRwdC0+cnhfcTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzaXplX3Qgc2l6ZTsKKworCS8qIHJpbmcgYWxyZWFkeSBjbGVhcmVkLCBub3RoaW5nIHRvIGRvICovCisJaWYgKCFyeF9xLT5yZmQucmZidWZmKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgcnhfcS0+cmZkLmNvdW50OyBpKyspIHsKKwkJc3RydWN0IGVtYWNfYnVmZmVyICpyZmJ1ZiA9IEdFVF9SRkRfQlVGRkVSKHJ4X3EsIGkpOworCisJCWlmIChyZmJ1Zi0+ZG1hX2FkZHIpIHsKKwkJCWRtYV91bm1hcF9zaW5nbGUoZGV2LCByZmJ1Zi0+ZG1hX2FkZHIsIHJmYnVmLT5sZW5ndGgsCisJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQkJcmZidWYtPmRtYV9hZGRyID0gMDsKKwkJfQorCQlpZiAocmZidWYtPnNrYikgeworCQkJZGV2X2tmcmVlX3NrYihyZmJ1Zi0+c2tiKTsKKwkJCXJmYnVmLT5za2IgPSBOVUxMOworCQl9CisJfQorCisJc2l6ZSA9ICBzaXplb2Yoc3RydWN0IGVtYWNfYnVmZmVyKSAqIHJ4X3EtPnJmZC5jb3VudDsKKwltZW1zZXQocnhfcS0+cmZkLnJmYnVmZiwgMCwgc2l6ZSk7CisKKwkvKiBjbGVhciB0aGUgZGVzY3JpcHRvciByaW5ncyAqLworCW1lbXNldChyeF9xLT5ycmQudl9hZGRyLCAwLCByeF9xLT5ycmQuc2l6ZSk7CisJcnhfcS0+cnJkLnByb2R1Y2VfaWR4ID0gMDsKKwlyeF9xLT5ycmQuY29uc3VtZV9pZHggPSAwOworCisJbWVtc2V0KHJ4X3EtPnJmZC52X2FkZHIsIDAsIHJ4X3EtPnJmZC5zaXplKTsKKwlyeF9xLT5yZmQucHJvZHVjZV9pZHggPSAwOworCXJ4X3EtPnJmZC5jb25zdW1lX2lkeCA9IDA7Cit9CisKKy8qIEZyZWUgYWxsIGJ1ZmZlcnMgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHRyYW5zbWl0IHF1ZXVlICovCitzdGF0aWMgdm9pZCBlbWFjX3R4X3FfYnVmc19mcmVlKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EgPSAmYWRwdC0+dHhfcTsKKworCWVtYWNfdHhfcV9kZXNjc19mcmVlKGFkcHQpOworCisJa2ZyZWUodHhfcS0+dHBkLnRwYnVmZik7CisJdHhfcS0+dHBkLnRwYnVmZiA9IE5VTEw7CisJdHhfcS0+dHBkLnZfYWRkciA9IE5VTEw7CisJdHhfcS0+dHBkLmRtYV9hZGRyID0gMDsKKwl0eF9xLT50cGQuc2l6ZSA9IDA7Cit9CisKKy8qIEFsbG9jYXRlIFRYIGRlc2NyaXB0b3IgcmluZyBmb3IgdGhlIGdpdmVuIHRyYW5zbWl0IHF1ZXVlICovCitzdGF0aWMgaW50IGVtYWNfdHhfcV9kZXNjX2FsbG9jKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsCisJCQkJc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EpCit7CisJc3RydWN0IGVtYWNfcmluZ19oZWFkZXIgKnJpbmdfaGVhZGVyID0gJmFkcHQtPnJpbmdfaGVhZGVyOworCXNpemVfdCBzaXplOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZW1hY19idWZmZXIpICogdHhfcS0+dHBkLmNvdW50OworCXR4X3EtPnRwZC50cGJ1ZmYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghdHhfcS0+dHBkLnRwYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0eF9xLT50cGQuc2l6ZSA9IHR4X3EtPnRwZC5jb3VudCAqIChhZHB0LT50cGRfc2l6ZSAqIDQpOworCXR4X3EtPnRwZC5kbWFfYWRkciA9IHJpbmdfaGVhZGVyLT5kbWFfYWRkciArIHJpbmdfaGVhZGVyLT51c2VkOworCXR4X3EtPnRwZC52X2FkZHIgPSByaW5nX2hlYWRlci0+dl9hZGRyICsgcmluZ19oZWFkZXItPnVzZWQ7CisJcmluZ19oZWFkZXItPnVzZWQgKz0gQUxJR04odHhfcS0+dHBkLnNpemUsIDgpOworCXR4X3EtPnRwZC5wcm9kdWNlX2lkeCA9IDA7CisJdHhfcS0+dHBkLmNvbnN1bWVfaWR4ID0gMDsKKworCXJldHVybiAwOworfQorCisvKiBGcmVlIGFsbCBidWZmZXJzIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB0cmFuc21pdCBxdWV1ZSAqLworc3RhdGljIHZvaWQgZW1hY19yeF9xX2J1ZnNfZnJlZShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xID0gJmFkcHQtPnJ4X3E7CisKKwllbWFjX3J4X3FfZnJlZV9kZXNjcyhhZHB0KTsKKworCWtmcmVlKHJ4X3EtPnJmZC5yZmJ1ZmYpOworCXJ4X3EtPnJmZC5yZmJ1ZmYgICA9IE5VTEw7CisKKwlyeF9xLT5yZmQudl9hZGRyICAgPSBOVUxMOworCXJ4X3EtPnJmZC5kbWFfYWRkciA9IDA7CisJcnhfcS0+cmZkLnNpemUgICAgID0gMDsKKworCXJ4X3EtPnJyZC52X2FkZHIgICA9IE5VTEw7CisJcnhfcS0+cnJkLmRtYV9hZGRyID0gMDsKKwlyeF9xLT5ycmQuc2l6ZSAgICAgPSAwOworfQorCisvKiBBbGxvY2F0ZSBSWCBkZXNjcmlwdG9yIHJpbmdzIGZvciB0aGUgZ2l2ZW4gcmVjZWl2ZSBxdWV1ZSAqLworc3RhdGljIGludCBlbWFjX3J4X2Rlc2NzX2FsbG9jKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IGVtYWNfcmluZ19oZWFkZXIgKnJpbmdfaGVhZGVyID0gJmFkcHQtPnJpbmdfaGVhZGVyOworCXN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xID0gJmFkcHQtPnJ4X3E7CisJc2l6ZV90IHNpemU7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlbWFjX2J1ZmZlcikgKiByeF9xLT5yZmQuY291bnQ7CisJcnhfcS0+cmZkLnJmYnVmZiA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeF9xLT5yZmQucmZidWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJ4X3EtPnJyZC5zaXplID0gcnhfcS0+cnJkLmNvdW50ICogKGFkcHQtPnJyZF9zaXplICogNCk7CisJcnhfcS0+cmZkLnNpemUgPSByeF9xLT5yZmQuY291bnQgKiAoYWRwdC0+cmZkX3NpemUgKiA0KTsKKworCXJ4X3EtPnJyZC5kbWFfYWRkciA9IHJpbmdfaGVhZGVyLT5kbWFfYWRkciArIHJpbmdfaGVhZGVyLT51c2VkOworCXJ4X3EtPnJyZC52X2FkZHIgICA9IHJpbmdfaGVhZGVyLT52X2FkZHIgKyByaW5nX2hlYWRlci0+dXNlZDsKKwlyaW5nX2hlYWRlci0+dXNlZCArPSBBTElHTihyeF9xLT5ycmQuc2l6ZSwgOCk7CisKKwlyeF9xLT5yZmQuZG1hX2FkZHIgPSByaW5nX2hlYWRlci0+ZG1hX2FkZHIgKyByaW5nX2hlYWRlci0+dXNlZDsKKwlyeF9xLT5yZmQudl9hZGRyICAgPSByaW5nX2hlYWRlci0+dl9hZGRyICsgcmluZ19oZWFkZXItPnVzZWQ7CisJcmluZ19oZWFkZXItPnVzZWQgKz0gQUxJR04ocnhfcS0+cmZkLnNpemUsIDgpOworCisJcnhfcS0+cnJkLnByb2R1Y2VfaWR4ID0gMDsKKwlyeF9xLT5ycmQuY29uc3VtZV9pZHggPSAwOworCisJcnhfcS0+cmZkLnByb2R1Y2VfaWR4ID0gMDsKKwlyeF9xLT5yZmQuY29uc3VtZV9pZHggPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEFsbG9jYXRlIGFsbCBUWCBhbmQgUlggZGVzY3JpcHRvciByaW5ncyAqLworaW50IGVtYWNfbWFjX3J4X3R4X3JpbmdzX2FsbG9jX2FsbChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBlbWFjX3JpbmdfaGVhZGVyICpyaW5nX2hlYWRlciA9ICZhZHB0LT5yaW5nX2hlYWRlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQ7CisJdW5zaWduZWQgaW50IG51bV90eF9kZXNjcyA9IGFkcHQtPnR4X2Rlc2NfY250OworCXVuc2lnbmVkIGludCBudW1fcnhfZGVzY3MgPSBhZHB0LT5yeF9kZXNjX2NudDsKKwlpbnQgcmV0OworCisJYWRwdC0+dHhfcS50cGQuY291bnQgPSBhZHB0LT50eF9kZXNjX2NudDsKKworCWFkcHQtPnJ4X3EucnJkLmNvdW50ID0gYWRwdC0+cnhfZGVzY19jbnQ7CisJYWRwdC0+cnhfcS5yZmQuY291bnQgPSBhZHB0LT5yeF9kZXNjX2NudDsKKworCS8qIFJpbmcgRE1BIGJ1ZmZlci4gRWFjaCByaW5nIG1heSBuZWVkIHVwIHRvIDggYnl0ZXMgZm9yIGFsaWdubWVudCwKKwkgKiBoZW5jZSB0aGUgYWRkaXRpb25hbCBwYWRkaW5nIGJ5dGVzIGFyZSBhbGxvY2F0ZWQuCisJICovCisJcmluZ19oZWFkZXItPnNpemUgPSBudW1fdHhfZGVzY3MgKiAoYWRwdC0+dHBkX3NpemUgKiA0KSArCisJCQkgICAgbnVtX3J4X2Rlc2NzICogKGFkcHQtPnJmZF9zaXplICogNCkgKworCQkJICAgIG51bV9yeF9kZXNjcyAqIChhZHB0LT5ycmRfc2l6ZSAqIDQpICsKKwkJCSAgICA4ICsgMiAqIDg7IC8qIDggYnl0ZSBwZXIgb25lIFR4IGFuZCB0d28gUnggcmluZ3MgKi8KKworCXJpbmdfaGVhZGVyLT51c2VkID0gMDsKKwlyaW5nX2hlYWRlci0+dl9hZGRyID0gZG1hX3phbGxvY19jb2hlcmVudChkZXYsIHJpbmdfaGVhZGVyLT5zaXplLAorCQkJCQkJICZyaW5nX2hlYWRlci0+ZG1hX2FkZHIsCisJCQkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFyaW5nX2hlYWRlci0+dl9hZGRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJpbmdfaGVhZGVyLT51c2VkID0gQUxJR04ocmluZ19oZWFkZXItPmRtYV9hZGRyLCA4KSAtCisJCQkJCQkJcmluZ19oZWFkZXItPmRtYV9hZGRyOworCisJcmV0ID0gZW1hY190eF9xX2Rlc2NfYWxsb2MoYWRwdCwgJmFkcHQtPnR4X3EpOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsICJlcnJvcjogVHggUXVldWUgYWxsb2MgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfYWxsb2NfdHg7CisJfQorCisJcmV0ID0gZW1hY19yeF9kZXNjc19hbGxvYyhhZHB0KTsKKwlpZiAocmV0KSB7CisJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LCAiZXJyb3I6IFJ4IFF1ZXVlIGFsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX2FsbG9jX3J4OworCX0KKworCXJldHVybiAwOworCitlcnJfYWxsb2Nfcng6CisJZW1hY190eF9xX2J1ZnNfZnJlZShhZHB0KTsKK2Vycl9hbGxvY190eDoKKwlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHJpbmdfaGVhZGVyLT5zaXplLAorCQkJICByaW5nX2hlYWRlci0+dl9hZGRyLCByaW5nX2hlYWRlci0+ZG1hX2FkZHIpOworCisJcmluZ19oZWFkZXItPnZfYWRkciAgID0gTlVMTDsKKwlyaW5nX2hlYWRlci0+ZG1hX2FkZHIgPSAwOworCXJpbmdfaGVhZGVyLT5zaXplICAgICA9IDA7CisJcmluZ19oZWFkZXItPnVzZWQgICAgID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIEZyZWUgYWxsIFRYIGFuZCBSWCBkZXNjcmlwdG9yIHJpbmdzICovCit2b2lkIGVtYWNfbWFjX3J4X3R4X3JpbmdzX2ZyZWVfYWxsKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IGVtYWNfcmluZ19oZWFkZXIgKnJpbmdfaGVhZGVyID0gJmFkcHQtPnJpbmdfaGVhZGVyOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudDsKKworCWVtYWNfdHhfcV9idWZzX2ZyZWUoYWRwdCk7CisJZW1hY19yeF9xX2J1ZnNfZnJlZShhZHB0KTsKKworCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgcmluZ19oZWFkZXItPnNpemUsCisJCQkgIHJpbmdfaGVhZGVyLT52X2FkZHIsIHJpbmdfaGVhZGVyLT5kbWFfYWRkcik7CisKKwlyaW5nX2hlYWRlci0+dl9hZGRyICAgPSBOVUxMOworCXJpbmdfaGVhZGVyLT5kbWFfYWRkciA9IDA7CisJcmluZ19oZWFkZXItPnNpemUgICAgID0gMDsKKwlyaW5nX2hlYWRlci0+dXNlZCAgICAgPSAwOworfQorCisvKiBJbml0aWFsaXplIGRlc2NyaXB0b3IgcmluZ3MgKi8KK3N0YXRpYyB2b2lkIGVtYWNfbWFjX3J4X3R4X3JpbmdfcmVzZXRfYWxsKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlhZHB0LT50eF9xLnRwZC5wcm9kdWNlX2lkeCA9IDA7CisJYWRwdC0+dHhfcS50cGQuY29uc3VtZV9pZHggPSAwOworCWZvciAoaSA9IDA7IGkgPCBhZHB0LT50eF9xLnRwZC5jb3VudDsgaSsrKQorCQlhZHB0LT50eF9xLnRwZC50cGJ1ZmZbaV0uZG1hX2FkZHIgPSAwOworCisJYWRwdC0+cnhfcS5ycmQucHJvZHVjZV9pZHggPSAwOworCWFkcHQtPnJ4X3EucnJkLmNvbnN1bWVfaWR4ID0gMDsKKwlhZHB0LT5yeF9xLnJmZC5wcm9kdWNlX2lkeCA9IDA7CisJYWRwdC0+cnhfcS5yZmQuY29uc3VtZV9pZHggPSAwOworCWZvciAoaSA9IDA7IGkgPCBhZHB0LT5yeF9xLnJmZC5jb3VudDsgaSsrKQorCQlhZHB0LT5yeF9xLnJmZC5yZmJ1ZmZbaV0uZG1hX2FkZHIgPSAwOworfQorCisvKiBQcm9kdWNlIG5ldyByZWNlaXZlIGZyZWUgZGVzY3JpcHRvciAqLworc3RhdGljIHZvaWQgZW1hY19tYWNfcnhfcmZkX2NyZWF0ZShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LAorCQkJCSAgIHN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xLAorCQkJCSAgIGRtYV9hZGRyX3QgYWRkcikKK3sKKwl1MzIgKmh3X3JmZCA9IEVNQUNfUkZEKHJ4X3EsIGFkcHQtPnJmZF9zaXplLCByeF9xLT5yZmQucHJvZHVjZV9pZHgpOworCisJKihod19yZmQrKykgPSBsb3dlcl8zMl9iaXRzKGFkZHIpOworCSpod19yZmQgPSB1cHBlcl8zMl9iaXRzKGFkZHIpOworCisJaWYgKCsrcnhfcS0+cmZkLnByb2R1Y2VfaWR4ID09IHJ4X3EtPnJmZC5jb3VudCkKKwkJcnhfcS0+cmZkLnByb2R1Y2VfaWR4ID0gMDsKK30KKworLyogRmlsbCB1cCByZWNlaXZlIHF1ZXVlJ3MgUkZEIHdpdGggcHJlYWxsb2NhdGVkIHJlY2VpdmUgYnVmZmVycyAqLworc3RhdGljIHZvaWQgZW1hY19tYWNfcnhfZGVzY3NfcmVmaWxsKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsCisJCQkJICAgIHN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xKQoreworCXN0cnVjdCBlbWFjX2J1ZmZlciAqY3Vycl9yeGJ1ZjsKKwlzdHJ1Y3QgZW1hY19idWZmZXIgKm5leHRfcnhidWY7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwl1MzIgbmV4dF9wcm9kdWNlX2lkeDsKKworCW5leHRfcHJvZHVjZV9pZHggPSByeF9xLT5yZmQucHJvZHVjZV9pZHggKyAxOworCWlmIChuZXh0X3Byb2R1Y2VfaWR4ID09IHJ4X3EtPnJmZC5jb3VudCkKKwkJbmV4dF9wcm9kdWNlX2lkeCA9IDA7CisKKwljdXJyX3J4YnVmID0gR0VUX1JGRF9CVUZGRVIocnhfcSwgcnhfcS0+cmZkLnByb2R1Y2VfaWR4KTsKKwluZXh0X3J4YnVmID0gR0VUX1JGRF9CVUZGRVIocnhfcSwgbmV4dF9wcm9kdWNlX2lkeCk7CisKKwkvKiB0aGlzIGFsd2F5cyBoYXMgYSBibGFuayByeF9idWZmZXIqLworCXdoaWxlICghbmV4dF9yeGJ1Zi0+ZG1hX2FkZHIpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJaW50IHJldDsKKworCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKGFkcHQtPm5ldGRldiwgYWRwdC0+cnhidWZfc2l6ZSk7CisJCWlmICghc2tiKQorCQkJYnJlYWs7CisKKwkJY3Vycl9yeGJ1Zi0+ZG1hX2FkZHIgPQorCQkJZG1hX21hcF9zaW5nbGUoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LCBza2ItPmRhdGEsCisJCQkJICAgICAgIGN1cnJfcnhidWYtPmxlbmd0aCwgRE1BX0ZST01fREVWSUNFKTsKKwkJcmV0ID0gZG1hX21hcHBpbmdfZXJyb3IoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCQljdXJyX3J4YnVmLT5kbWFfYWRkcik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWJyZWFrOworCQl9CisJCWN1cnJfcnhidWYtPnNrYiA9IHNrYjsKKwkJY3Vycl9yeGJ1Zi0+bGVuZ3RoID0gYWRwdC0+cnhidWZfc2l6ZTsKKworCQllbWFjX21hY19yeF9yZmRfY3JlYXRlKGFkcHQsIHJ4X3EsIGN1cnJfcnhidWYtPmRtYV9hZGRyKTsKKwkJbmV4dF9wcm9kdWNlX2lkeCA9IHJ4X3EtPnJmZC5wcm9kdWNlX2lkeCArIDE7CisJCWlmIChuZXh0X3Byb2R1Y2VfaWR4ID09IHJ4X3EtPnJmZC5jb3VudCkKKwkJCW5leHRfcHJvZHVjZV9pZHggPSAwOworCisJCWN1cnJfcnhidWYgPSBHRVRfUkZEX0JVRkZFUihyeF9xLCByeF9xLT5yZmQucHJvZHVjZV9pZHgpOworCQluZXh0X3J4YnVmID0gR0VUX1JGRF9CVUZGRVIocnhfcSwgbmV4dF9wcm9kdWNlX2lkeCk7CisJCWNvdW50Kys7CisJfQorCisJaWYgKGNvdW50KSB7CisJCXUzMiBwcm9kX2lkeCA9IChyeF9xLT5yZmQucHJvZHVjZV9pZHggPDwgcnhfcS0+cHJvZHVjZV9zaGlmdCkgJgorCQkJCXJ4X3EtPnByb2R1Y2VfbWFzazsKKwkJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIHJ4X3EtPnByb2R1Y2VfcmVnLAorCQkJCSAgcnhfcS0+cHJvZHVjZV9tYXNrLCBwcm9kX2lkeCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlbWFjX2FkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG5ldGRldi0+cGh5ZGV2OworCisJaWYgKHBoeWRldi0+bGluaykKKwkJZW1hY19tYWNfc3RhcnQoYWRwdCk7CisJZWxzZQorCQllbWFjX21hY19zdG9wKGFkcHQpOworCisJcGh5X3ByaW50X3N0YXR1cyhwaHlkZXYpOworfQorCisvKiBCcmluZ3VwIHRoZSBpbnRlcmZhY2UvSFcgKi8KK2ludCBlbWFjX21hY191cChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZHB0LT5uZXRkZXY7CisJc3RydWN0IGVtYWNfaXJxCSppcnEgPSAmYWRwdC0+aXJxOworCWludCByZXQ7CisKKwllbWFjX21hY19yeF90eF9yaW5nX3Jlc2V0X2FsbChhZHB0KTsKKwllbWFjX21hY19jb25maWcoYWRwdCk7CisKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEtPmlycSwgZW1hY19pc3IsIDAsIEVNQUNfTUFDX0lSUV9SRVMsIGlycSk7CisJaWYgKHJldCkgeworCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwgImNvdWxkIG5vdCByZXF1ZXN0ICVzIGlycVxuIiwKKwkJCSAgIEVNQUNfTUFDX0lSUV9SRVMpOworCQlyZXR1cm4gcmV0OworCX0KKworCWVtYWNfbWFjX3J4X2Rlc2NzX3JlZmlsbChhZHB0LCAmYWRwdC0+cnhfcSk7CisKKwlyZXQgPSBwaHlfY29ubmVjdF9kaXJlY3QobmV0ZGV2LCBhZHB0LT5waHlkZXYsIGVtYWNfYWRqdXN0X2xpbmssCisJCQkJIFBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSSk7CisJaWYgKHJldCkgeworCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwgImNvdWxkIG5vdCBjb25uZWN0IHBoeVxuIik7CisJCWZyZWVfaXJxKGlycS0+aXJxLCBpcnEpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGVuYWJsZSBtYWMgaXJxICovCisJd3JpdGVsKCh1MzIpfkRJU19JTlQsIGFkcHQtPmJhc2UgKyBFTUFDX0lOVF9TVEFUVVMpOworCXdyaXRlbChhZHB0LT5pcnEubWFzaywgYWRwdC0+YmFzZSArIEVNQUNfSU5UX01BU0spOworCisJYWRwdC0+cGh5ZGV2LT5pcnEgPSBQSFlfSUdOT1JFX0lOVEVSUlVQVDsKKwlwaHlfc3RhcnQoYWRwdC0+cGh5ZGV2KTsKKworCW5hcGlfZW5hYmxlKCZhZHB0LT5yeF9xLm5hcGkpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyogQnJpbmcgZG93biB0aGUgaW50ZXJmYWNlL0hXICovCit2b2lkIGVtYWNfbWFjX2Rvd24oc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRwdC0+bmV0ZGV2OworCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCW5hcGlfZGlzYWJsZSgmYWRwdC0+cnhfcS5uYXBpKTsKKworCXBoeV9zdG9wKGFkcHQtPnBoeWRldik7CisJcGh5X2Rpc2Nvbm5lY3QoYWRwdC0+cGh5ZGV2KTsKKworCS8qIGRpc2FibGUgbWFjIGlycSAqLworCXdyaXRlbChESVNfSU5ULCBhZHB0LT5iYXNlICsgRU1BQ19JTlRfU1RBVFVTKTsKKwl3cml0ZWwoMCwgYWRwdC0+YmFzZSArIEVNQUNfSU5UX01BU0spOworCXN5bmNocm9uaXplX2lycShhZHB0LT5pcnEuaXJxKTsKKwlmcmVlX2lycShhZHB0LT5pcnEuaXJxLCAmYWRwdC0+aXJxKTsKKworCWVtYWNfbWFjX3Jlc2V0KGFkcHQpOworCisJZW1hY190eF9xX2Rlc2NzX2ZyZWUoYWRwdCk7CisJbmV0ZGV2X3Jlc2V0X3F1ZXVlKGFkcHQtPm5ldGRldik7CisJZW1hY19yeF9xX2ZyZWVfZGVzY3MoYWRwdCk7Cit9CisKKy8qIENvbnN1bWUgbmV4dCByZWNlaXZlZCBwYWNrZXQgZGVzY3JpcHRvciAqLworc3RhdGljIGJvb2wgZW1hY19yeF9wcm9jZXNzX3JyZChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LAorCQkJCXN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xLAorCQkJCXN0cnVjdCBlbWFjX3JyZCAqcnJkKQoreworCXUzMiAqaHdfcnJkID0gRU1BQ19SUkQocnhfcSwgYWRwdC0+cnJkX3NpemUsIHJ4X3EtPnJyZC5jb25zdW1lX2lkeCk7CisKKwlycmQtPndvcmRbM10gPSAqKGh3X3JyZCArIDMpOworCisJaWYgKCFSUkRfVVBEVChycmQpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlycmQtPndvcmRbNF0gPSAwOworCXJyZC0+d29yZFs1XSA9IDA7CisKKwlycmQtPndvcmRbMF0gPSAqKGh3X3JyZCsrKTsKKwlycmQtPndvcmRbMV0gPSAqKGh3X3JyZCsrKTsKKwlycmQtPndvcmRbMl0gPSAqKGh3X3JyZCsrKTsKKworCWlmICh1bmxpa2VseShSUkRfTk9SKHJyZCkgIT0gMSkpIHsKKwkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsCisJCQkgICAiZXJyb3I6IG11bHRpLVJGRCBub3Qgc3VwcG9ydCB5ZXQhIG5vcjolbHVcbiIsCisJCQkgICBSUkRfTk9SKHJyZCkpOworCX0KKworCS8qIG1hcmsgcnJkIGFzIHByb2Nlc3NlZCAqLworCVJSRF9VUERUX1NFVChycmQsIDApOworCSpod19ycmQgPSBycmQtPndvcmRbM107CisKKwlpZiAoKytyeF9xLT5ycmQuY29uc3VtZV9pZHggPT0gcnhfcS0+cnJkLmNvdW50KQorCQlyeF9xLT5ycmQuY29uc3VtZV9pZHggPSAwOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qIFByb2R1Y2UgbmV3IHRyYW5zbWl0IGRlc2NyaXB0b3IgKi8KK3N0YXRpYyB2b2lkIGVtYWNfdHhfdHBkX2NyZWF0ZShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LAorCQkJICAgICAgIHN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xLCBzdHJ1Y3QgZW1hY190cGQgKnRwZCkKK3sKKwl1MzIgKmh3X3RwZDsKKworCXR4X3EtPnRwZC5sYXN0X3Byb2R1Y2VfaWR4ID0gdHhfcS0+dHBkLnByb2R1Y2VfaWR4OworCWh3X3RwZCA9IEVNQUNfVFBEKHR4X3EsIGFkcHQtPnRwZF9zaXplLCB0eF9xLT50cGQucHJvZHVjZV9pZHgpOworCisJaWYgKCsrdHhfcS0+dHBkLnByb2R1Y2VfaWR4ID09IHR4X3EtPnRwZC5jb3VudCkKKwkJdHhfcS0+dHBkLnByb2R1Y2VfaWR4ID0gMDsKKworCSooaHdfdHBkKyspID0gdHBkLT53b3JkWzBdOworCSooaHdfdHBkKyspID0gdHBkLT53b3JkWzFdOworCSooaHdfdHBkKyspID0gdHBkLT53b3JkWzJdOworCSpod190cGQgPSB0cGQtPndvcmRbM107Cit9CisKKy8qIE1hcmsgdGhlIGxhc3QgdHJhbnNtaXQgZGVzY3JpcHRvciBhcyBzdWNoIChmb3IgdGhlIHRyYW5zbWl0IHBhY2tldCkgKi8KK3N0YXRpYyB2b2lkIGVtYWNfdHhfdHBkX21hcmtfbGFzdChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LAorCQkJCSAgc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EpCit7CisJdTMyICpod190cGQgPQorCQlFTUFDX1RQRCh0eF9xLCBhZHB0LT50cGRfc2l6ZSwgdHhfcS0+dHBkLmxhc3RfcHJvZHVjZV9pZHgpOworCXUzMiB0bXBfdHBkOworCisJdG1wX3RwZCA9ICooaHdfdHBkICsgMSk7CisJdG1wX3RwZCB8PSBFTUFDX1RQRF9MQVNUX0ZSQUdNRU5UOworCSooaHdfdHBkICsgMSkgPSB0bXBfdHBkOworfQorCitzdGF0aWMgdm9pZCBlbWFjX3J4X3JmZF9jbGVhbihzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSwgc3RydWN0IGVtYWNfcnJkICpycmQpCit7CisJc3RydWN0IGVtYWNfYnVmZmVyICpyZmJ1ZiA9IHJ4X3EtPnJmZC5yZmJ1ZmY7CisJdTMyIGNvbnN1bWVfaWR4ID0gUlJEX1NJKHJyZCk7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlJEX05PUihycmQpOyBpKyspIHsKKwkJcmZidWZbY29uc3VtZV9pZHhdLnNrYiA9IE5VTEw7CisJCWlmICgrK2NvbnN1bWVfaWR4ID09IHJ4X3EtPnJmZC5jb3VudCkKKwkJCWNvbnN1bWVfaWR4ID0gMDsKKwl9CisKKwlyeF9xLT5yZmQuY29uc3VtZV9pZHggPSBjb25zdW1lX2lkeDsKKwlyeF9xLT5yZmQucHJvY2Vzc19pZHggPSBjb25zdW1lX2lkeDsKK30KKworLyogUHVzaCB0aGUgcmVjZWl2ZWQgc2tiIHRvIHVwcGVyIGxheWVycyAqLworc3RhdGljIHZvaWQgZW1hY19yZWNlaXZlX3NrYihzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgdTE2IHZsYW5fdGFnLCBib29sIHZsYW5fZmxhZykKK3sKKwlpZiAodmxhbl9mbGFnKSB7CisJCXUxNiB2bGFuOworCisJCUVNQUNfVEFHX1RPX1ZMQU4odmxhbl90YWcsIHZsYW4pOworCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgaHRvbnMoRVRIX1BfODAyMVEpLCB2bGFuKTsKKwl9CisKKwluYXBpX2dyb19yZWNlaXZlKCZyeF9xLT5uYXBpLCBza2IpOworfQorCisvKiBQcm9jZXNzIHJlY2VpdmUgZXZlbnQgKi8KK3ZvaWQgZW1hY19tYWNfcnhfcHJvY2VzcyhzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LCBzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSwKKwkJCSBpbnQgKm51bV9wa3RzLCBpbnQgbWF4X3BrdHMpCit7CisJdTMyIHByb2NfaWR4LCBod19jb25zdW1lX2lkeCwgbnVtX2NvbnN1bWVfcGt0czsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ICA9IGFkcHQtPm5ldGRldjsKKwlzdHJ1Y3QgZW1hY19idWZmZXIgKnJmYnVmOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJc3RydWN0IGVtYWNfcnJkIHJyZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiByZWc7CisKKwlyZWcgPSByZWFkbF9yZWxheGVkKGFkcHQtPmJhc2UgKyByeF9xLT5jb25zdW1lX3JlZyk7CisKKwlod19jb25zdW1lX2lkeCA9IChyZWcgJiByeF9xLT5jb25zdW1lX21hc2spID4+IHJ4X3EtPmNvbnN1bWVfc2hpZnQ7CisJbnVtX2NvbnN1bWVfcGt0cyA9IChod19jb25zdW1lX2lkeCA+PSByeF9xLT5ycmQuY29uc3VtZV9pZHgpID8KKwkJKGh3X2NvbnN1bWVfaWR4IC0gIHJ4X3EtPnJyZC5jb25zdW1lX2lkeCkgOgorCQkoaHdfY29uc3VtZV9pZHggKyByeF9xLT5ycmQuY291bnQgLSByeF9xLT5ycmQuY29uc3VtZV9pZHgpOworCisJZG8geworCQlpZiAoIW51bV9jb25zdW1lX3BrdHMpCisJCQlicmVhazsKKworCQlpZiAoIWVtYWNfcnhfcHJvY2Vzc19ycmQoYWRwdCwgcnhfcSwgJnJyZCkpCisJCQlicmVhazsKKworCQlpZiAobGlrZWx5KFJSRF9OT1IoJnJyZCkgPT0gMSkpIHsKKwkJCS8qIGdvb2QgcmVjZWl2ZSAqLworCQkJcmZidWYgPSBHRVRfUkZEX0JVRkZFUihyeF9xLCBSUkRfU0koJnJyZCkpOworCQkJZG1hX3VubWFwX3NpbmdsZShhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsCisJCQkJCSByZmJ1Zi0+ZG1hX2FkZHIsIHJmYnVmLT5sZW5ndGgsCisJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQkJcmZidWYtPmRtYV9hZGRyID0gMDsKKwkJCXNrYiA9IHJmYnVmLT5za2I7CisJCX0gZWxzZSB7CisJCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwKKwkJCQkgICAiZXJyb3I6IG11bHRpLVJGRCBub3Qgc3VwcG9ydCB5ZXQhXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWVtYWNfcnhfcmZkX2NsZWFuKHJ4X3EsICZycmQpOworCQludW1fY29uc3VtZV9wa3RzLS07CisJCWNvdW50Kys7CisKKwkJLyogRHVlIHRvIGEgSFcgaXNzdWUgaW4gTDQgY2hlY2sgc3VtIGRldGVjdGlvbiAoVURQL1RDUCBmcmFncworCQkgKiB3aXRoIERGIHNldCBhcmUgbWFya2VkIGFzIGVycm9yKSwgZHJvcCBwYWNrZXRzIGJhc2VkIG9uIHRoZQorCQkgKiBlcnJvciBtYXNrIHJhdGhlciB0aGFuIHRoZSBzdW1tYXJ5IGJpdCAoaWdub3JpbmcgTDRGIGVycm9ycykKKwkJICovCisJCWlmIChycmQud29yZFtFTUFDX1JSRF9TVEFUU19EV19JRFhdICYgRU1BQ19SUkRfRVJST1IpIHsKKwkJCW5ldGlmX2RiZyhhZHB0LCByeF9zdGF0dXMsIGFkcHQtPm5ldGRldiwKKwkJCQkgICJEcm9wIGVycm9yIHBhY2tldFtSUkQ6IDB4JXg6MHgleDoweCV4OjB4JXhdXG4iLAorCQkJCSAgcnJkLndvcmRbMF0sIHJyZC53b3JkWzFdLAorCQkJCSAgcnJkLndvcmRbMl0sIHJyZC53b3JkWzNdKTsKKworCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJY29udGludWU7CisJCX0KKworCQlza2JfcHV0KHNrYiwgUlJEX1BLVF9TSVpFKCZycmQpIC0gRVRIX0ZDU19MRU4pOworCQlza2ItPmRldiA9IG5ldGRldjsKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOworCQlpZiAobmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKQorCQkJc2tiLT5pcF9zdW1tZWQgPSBSUkRfTDRGKCZycmQpID8KKwkJCQkJICBDSEVDS1NVTV9OT05FIDogQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCWVsc2UKKwkJCXNrYl9jaGVja3N1bV9ub25lX2Fzc2VydChza2IpOworCisJCWVtYWNfcmVjZWl2ZV9za2IocnhfcSwgc2tiLCAodTE2KVJSRF9DVkFMTl9UQUcoJnJyZCksCisJCQkJIChib29sKVJSRF9DVlRBRygmcnJkKSk7CisKKwkJbmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJKCpudW1fcGt0cykrKzsKKwl9IHdoaWxlICgqbnVtX3BrdHMgPCBtYXhfcGt0cyk7CisKKwlpZiAoY291bnQpIHsKKwkJcHJvY19pZHggPSAocnhfcS0+cmZkLnByb2Nlc3NfaWR4IDw8IHJ4X3EtPnByb2Nlc3Nfc2hmdCkgJgorCQkJCXJ4X3EtPnByb2Nlc3NfbWFzazsKKwkJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIHJ4X3EtPnByb2Nlc3NfcmVnLAorCQkJCSAgcnhfcS0+cHJvY2Vzc19tYXNrLCBwcm9jX2lkeCk7CisJCWVtYWNfbWFjX3J4X2Rlc2NzX3JlZmlsbChhZHB0LCByeF9xKTsKKwl9Cit9CisKKy8qIGdldCB0aGUgbnVtYmVyIG9mIGZyZWUgdHJhbnNtaXQgZGVzY3JpcHRvcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZW1hY190cGRfbnVtX2ZyZWVfZGVzY3Moc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EpCit7CisJdTMyIHByb2R1Y2VfaWR4ID0gdHhfcS0+dHBkLnByb2R1Y2VfaWR4OworCXUzMiBjb25zdW1lX2lkeCA9IHR4X3EtPnRwZC5jb25zdW1lX2lkeDsKKworCXJldHVybiAoY29uc3VtZV9pZHggPiBwcm9kdWNlX2lkeCkgPworCQkoY29uc3VtZV9pZHggLSBwcm9kdWNlX2lkeCAtIDEpIDoKKwkJKHR4X3EtPnRwZC5jb3VudCArIGNvbnN1bWVfaWR4IC0gcHJvZHVjZV9pZHggLSAxKTsKK30KKworLyogUHJvY2VzcyB0cmFuc21pdCBldmVudCAqLwordm9pZCBlbWFjX21hY190eF9wcm9jZXNzKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsIHN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xKQoreworCXUzMiByZWcgPSByZWFkbF9yZWxheGVkKGFkcHQtPmJhc2UgKyB0eF9xLT5jb25zdW1lX3JlZyk7CisJdTMyIGh3X2NvbnN1bWVfaWR4LCBwa3RzX2NvbXBsID0gMCwgYnl0ZXNfY29tcGwgPSAwOworCXN0cnVjdCBlbWFjX2J1ZmZlciAqdHBidWY7CisKKwlod19jb25zdW1lX2lkeCA9IChyZWcgJiB0eF9xLT5jb25zdW1lX21hc2spID4+IHR4X3EtPmNvbnN1bWVfc2hpZnQ7CisKKwl3aGlsZSAodHhfcS0+dHBkLmNvbnN1bWVfaWR4ICE9IGh3X2NvbnN1bWVfaWR4KSB7CisJCXRwYnVmID0gR0VUX1RQRF9CVUZGRVIodHhfcSwgdHhfcS0+dHBkLmNvbnN1bWVfaWR4KTsKKwkJaWYgKHRwYnVmLT5kbWFfYWRkcikgeworCQkJZG1hX3VubWFwX3NpbmdsZShhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsCisJCQkJCSB0cGJ1Zi0+ZG1hX2FkZHIsIHRwYnVmLT5sZW5ndGgsCisJCQkJCSBETUFfVE9fREVWSUNFKTsKKwkJCXRwYnVmLT5kbWFfYWRkciA9IDA7CisJCX0KKworCQlpZiAodHBidWYtPnNrYikgeworCQkJcGt0c19jb21wbCsrOworCQkJYnl0ZXNfY29tcGwgKz0gdHBidWYtPnNrYi0+bGVuOworCQkJZGV2X2tmcmVlX3NrYl9pcnEodHBidWYtPnNrYik7CisJCQl0cGJ1Zi0+c2tiID0gTlVMTDsKKwkJfQorCisJCWlmICgrK3R4X3EtPnRwZC5jb25zdW1lX2lkeCA9PSB0eF9xLT50cGQuY291bnQpCisJCQl0eF9xLT50cGQuY29uc3VtZV9pZHggPSAwOworCX0KKworCW5ldGRldl9jb21wbGV0ZWRfcXVldWUoYWRwdC0+bmV0ZGV2LCBwa3RzX2NvbXBsLCBieXRlc19jb21wbCk7CisKKwlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChhZHB0LT5uZXRkZXYpKQorCQlpZiAoZW1hY190cGRfbnVtX2ZyZWVfZGVzY3ModHhfcSkgPiAoTUFYX1NLQl9GUkFHUyArIDEpKQorCQkJbmV0aWZfd2FrZV9xdWV1ZShhZHB0LT5uZXRkZXYpOworfQorCisvKiBJbml0aWFsaXplIGFsbCBxdWV1ZSBkYXRhIHN0cnVjdHVyZXMgKi8KK3ZvaWQgZW1hY19tYWNfcnhfdHhfcmluZ19pbml0X2FsbChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlhZHB0LT5yeF9xLm5ldGRldiA9IGFkcHQtPm5ldGRldjsKKworCWFkcHQtPnJ4X3EucHJvZHVjZV9yZWcgID0gRU1BQ19NQUlMQk9YXzA7CisJYWRwdC0+cnhfcS5wcm9kdWNlX21hc2sgPSBSRkQwX1BST0RfSURYX0JNU0s7CisJYWRwdC0+cnhfcS5wcm9kdWNlX3NoaWZ0ID0gUkZEMF9QUk9EX0lEWF9TSEZUOworCisJYWRwdC0+cnhfcS5wcm9jZXNzX3JlZyAgPSBFTUFDX01BSUxCT1hfMDsKKwlhZHB0LT5yeF9xLnByb2Nlc3NfbWFzayA9IFJGRDBfUFJPQ19JRFhfQk1TSzsKKwlhZHB0LT5yeF9xLnByb2Nlc3Nfc2hmdCA9IFJGRDBfUFJPQ19JRFhfU0hGVDsKKworCWFkcHQtPnJ4X3EuY29uc3VtZV9yZWcgID0gRU1BQ19NQUlMQk9YXzM7CisJYWRwdC0+cnhfcS5jb25zdW1lX21hc2sgPSBSRkQwX0NPTlNfSURYX0JNU0s7CisJYWRwdC0+cnhfcS5jb25zdW1lX3NoaWZ0ID0gUkZEMF9DT05TX0lEWF9TSEZUOworCisJYWRwdC0+cnhfcS5pcnEgICAgICAgICAgPSAmYWRwdC0+aXJxOworCWFkcHQtPnJ4X3EuaW50ciAgICAgICAgID0gYWRwdC0+aXJxLm1hc2sgJiBJU1JfUlhfUEtUOworCisJYWRwdC0+dHhfcS5wcm9kdWNlX3JlZyAgPSBFTUFDX01BSUxCT1hfMTU7CisJYWRwdC0+dHhfcS5wcm9kdWNlX21hc2sgPSBOVFBEX1BST0RfSURYX0JNU0s7CisJYWRwdC0+dHhfcS5wcm9kdWNlX3NoaWZ0ID0gTlRQRF9QUk9EX0lEWF9TSEZUOworCisJYWRwdC0+dHhfcS5jb25zdW1lX3JlZyAgPSBFTUFDX01BSUxCT1hfMjsKKwlhZHB0LT50eF9xLmNvbnN1bWVfbWFzayA9IE5UUERfQ09OU19JRFhfQk1TSzsKKwlhZHB0LT50eF9xLmNvbnN1bWVfc2hpZnQgPSBOVFBEX0NPTlNfSURYX1NIRlQ7Cit9CisKKy8qIEZpbGwgdXAgdHJhbnNtaXQgZGVzY3JpcHRvcnMgd2l0aCBUU08gYW5kIENoZWNrc3VtIG9mZmxvYWQgaW5mb3JtYXRpb24gKi8KK3N0YXRpYyBpbnQgZW1hY190c29fY3N1bShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LAorCQkJIHN0cnVjdCBlbWFjX3R4X3F1ZXVlICp0eF9xLAorCQkJIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IGVtYWNfdHBkICp0cGQpCit7CisJdW5zaWduZWQgaW50IGhkcl9sZW47CisJaW50IHJldDsKKworCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKKwkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikpIHsKKwkJCXJldCA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKTsKKwkJCWlmICh1bmxpa2VseShyZXQpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJCXUzMiBwa3RfbGVuID0gKCh1bnNpZ25lZCBjaGFyICopaXBfaGRyKHNrYikgLSBza2ItPmRhdGEpCisJCQkJICAgICAgICsgbnRvaHMoaXBfaGRyKHNrYiktPnRvdF9sZW4pOworCQkJaWYgKHNrYi0+bGVuID4gcGt0X2xlbikKKwkJCQlwc2tiX3RyaW0oc2tiLCBwa3RfbGVuKTsKKwkJfQorCisJCWhkcl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgdGNwX2hkcmxlbihza2IpOworCQlpZiAodW5saWtlbHkoc2tiLT5sZW4gPT0gaGRyX2xlbikpIHsKKwkJCS8qIHdlIG9ubHkgbmVlZCB0byBkbyBjc3VtICovCisJCQluZXRpZl93YXJuKGFkcHQsIHR4X2VyciwgYWRwdC0+bmV0ZGV2LAorCQkJCSAgICJ0c28gbm90IG5lZWRlZCBmb3IgcGFja2V0IHdpdGggMCBkYXRhXG4iKTsKKwkJCWdvdG8gZG9fY3N1bTsKKwkJfQorCisJCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19UQ1BWNCkgeworCQkJaXBfaGRyKHNrYiktPmNoZWNrID0gMDsKKwkJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPQorCQkJCX5jc3VtX3RjcHVkcF9tYWdpYyhpcF9oZHIoc2tiKS0+c2FkZHIsCisJCQkJCQkgICBpcF9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCQkgICAwLCBJUFBST1RPX1RDUCwgMCk7CisJCQlUUERfSVBWNF9TRVQodHBkLCAxKTsKKwkJfQorCisJCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19UQ1BWNikgeworCQkJLyogaXB2NiB0c28gbmVlZCBhbiBleHRyYSB0cGQgKi8KKwkJCXN0cnVjdCBlbWFjX3RwZCBleHRyYV90cGQ7CisKKwkJCW1lbXNldCh0cGQsIDAsIHNpemVvZigqdHBkKSk7CisJCQltZW1zZXQoJmV4dHJhX3RwZCwgMCwgc2l6ZW9mKGV4dHJhX3RwZCkpOworCisJCQlpcHY2X2hkcihza2IpLT5wYXlsb2FkX2xlbiA9IDA7CisJCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0KKwkJCQl+Y3N1bV9pcHY2X21hZ2ljKCZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCQkJCSAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCQkgMCwgSVBQUk9UT19UQ1AsIDApOworCQkJVFBEX1BLVF9MRU5fU0VUKCZleHRyYV90cGQsIHNrYi0+bGVuKTsKKwkJCVRQRF9MU09fU0VUKCZleHRyYV90cGQsIDEpOworCQkJVFBEX0xTT1ZfU0VUKCZleHRyYV90cGQsIDEpOworCQkJZW1hY190eF90cGRfY3JlYXRlKGFkcHQsIHR4X3EsICZleHRyYV90cGQpOworCQkJVFBEX0xTT1ZfU0VUKHRwZCwgMSk7CisJCX0KKworCQlUUERfTFNPX1NFVCh0cGQsIDEpOworCQlUUERfVENQSERSX09GRlNFVF9TRVQodHBkLCBza2JfdHJhbnNwb3J0X29mZnNldChza2IpKTsKKwkJVFBEX01TU19TRVQodHBkLCBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKTsKKwkJcmV0dXJuIDA7CisJfQorCitkb19jc3VtOgorCWlmIChsaWtlbHkoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkpIHsKKwkJdW5zaWduZWQgaW50IGNzcywgY3NvOworCisJCWNzbyA9IHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJCWlmICh1bmxpa2VseShjc28gJiAweDEpKSB7CisJCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwKKwkJCQkgICAiZXJyb3I6IHBheWxvYWQgb2Zmc2V0IHNob3VsZCBiZSBldmVuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWNzcyA9IGNzbyArIHNrYi0+Y3N1bV9vZmZzZXQ7CisKKwkJVFBEX1BBWUxPQURfT0ZGU0VUX1NFVCh0cGQsIGNzbyA+PiAxKTsKKwkJVFBEX0NYU1VNX09GRlNFVF9TRVQodHBkLCBjc3MgPj4gMSk7CisJCVRQRF9DU1hfU0VUKHRwZCwgMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEZpbGwgdXAgdHJhbnNtaXQgZGVzY3JpcHRvcnMgKi8KK3N0YXRpYyB2b2lkIGVtYWNfdHhfZmlsbF90cGQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwKKwkJCSAgICAgc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHN0cnVjdCBlbWFjX3RwZCAqdHBkKQoreworCXVuc2lnbmVkIGludCBucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJdW5zaWduZWQgaW50IGZpcnN0ID0gdHhfcS0+dHBkLnByb2R1Y2VfaWR4OworCXVuc2lnbmVkIGludCBsZW4gPSBza2JfaGVhZGxlbihza2IpOworCXN0cnVjdCBlbWFjX2J1ZmZlciAqdHBidWYgPSBOVUxMOworCXVuc2lnbmVkIGludCBtYXBwZWRfbGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgY291bnQgPSAwOworCWludCByZXQ7CisKKwkvKiBpZiBMYXJnZSBTZWdtZW50IE9mZmxvYWQgaXMgKGluIFRDUCBTZWdtZW50YXRpb24gT2ZmbG9hZCBzdHJ1Y3QpICovCisJaWYgKFRQRF9MU08odHBkKSkgeworCQltYXBwZWRfbGVuID0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArIHRjcF9oZHJsZW4oc2tiKTsKKworCQl0cGJ1ZiA9IEdFVF9UUERfQlVGRkVSKHR4X3EsIHR4X3EtPnRwZC5wcm9kdWNlX2lkeCk7CisJCXRwYnVmLT5sZW5ndGggPSBtYXBwZWRfbGVuOworCQl0cGJ1Zi0+ZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsCisJCQkJCQkgc2tiLT5kYXRhLCB0cGJ1Zi0+bGVuZ3RoLAorCQkJCQkJIERNQV9UT19ERVZJQ0UpOworCQlyZXQgPSBkbWFfbWFwcGluZ19lcnJvcihhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsCisJCQkJCXRwYnVmLT5kbWFfYWRkcik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCisJCVRQRF9CVUZGRVJfQUREUl9MX1NFVCh0cGQsIGxvd2VyXzMyX2JpdHModHBidWYtPmRtYV9hZGRyKSk7CisJCVRQRF9CVUZGRVJfQUREUl9IX1NFVCh0cGQsIHVwcGVyXzMyX2JpdHModHBidWYtPmRtYV9hZGRyKSk7CisJCVRQRF9CVUZfTEVOX1NFVCh0cGQsIHRwYnVmLT5sZW5ndGgpOworCQllbWFjX3R4X3RwZF9jcmVhdGUoYWRwdCwgdHhfcSwgdHBkKTsKKwkJY291bnQrKzsKKwl9CisKKwlpZiAobWFwcGVkX2xlbiA8IGxlbikgeworCQl0cGJ1ZiA9IEdFVF9UUERfQlVGRkVSKHR4X3EsIHR4X3EtPnRwZC5wcm9kdWNlX2lkeCk7CisJCXRwYnVmLT5sZW5ndGggPSBsZW4gLSBtYXBwZWRfbGVuOworCQl0cGJ1Zi0+ZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShhZHB0LT5uZXRkZXYtPmRldi5wYXJlbnQsCisJCQkJCQkgc2tiLT5kYXRhICsgbWFwcGVkX2xlbiwKKwkJCQkJCSB0cGJ1Zi0+bGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKwkJcmV0ID0gZG1hX21hcHBpbmdfZXJyb3IoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCQl0cGJ1Zi0+ZG1hX2FkZHIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQlUUERfQlVGRkVSX0FERFJfTF9TRVQodHBkLCBsb3dlcl8zMl9iaXRzKHRwYnVmLT5kbWFfYWRkcikpOworCQlUUERfQlVGRkVSX0FERFJfSF9TRVQodHBkLCB1cHBlcl8zMl9iaXRzKHRwYnVmLT5kbWFfYWRkcikpOworCQlUUERfQlVGX0xFTl9TRVQodHBkLCB0cGJ1Zi0+bGVuZ3RoKTsKKwkJZW1hY190eF90cGRfY3JlYXRlKGFkcHQsIHR4X3EsIHRwZCk7CisJCWNvdW50Kys7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKKwkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZzsKKworCQlmcmFnID0gJnNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV07CisKKwkJdHBidWYgPSBHRVRfVFBEX0JVRkZFUih0eF9xLCB0eF9xLT50cGQucHJvZHVjZV9pZHgpOworCQl0cGJ1Zi0+bGVuZ3RoID0gZnJhZy0+c2l6ZTsKKwkJdHBidWYtPmRtYV9hZGRyID0gZG1hX21hcF9wYWdlKGFkcHQtPm5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJICAgICAgIGZyYWctPnBhZ2UucCwgZnJhZy0+cGFnZV9vZmZzZXQsCisJCQkJCSAgICAgICB0cGJ1Zi0+bGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKwkJcmV0ID0gZG1hX21hcHBpbmdfZXJyb3IoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LAorCQkJCQl0cGJ1Zi0+ZG1hX2FkZHIpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcjsKKworCQlUUERfQlVGRkVSX0FERFJfTF9TRVQodHBkLCBsb3dlcl8zMl9iaXRzKHRwYnVmLT5kbWFfYWRkcikpOworCQlUUERfQlVGRkVSX0FERFJfSF9TRVQodHBkLCB1cHBlcl8zMl9iaXRzKHRwYnVmLT5kbWFfYWRkcikpOworCQlUUERfQlVGX0xFTl9TRVQodHBkLCB0cGJ1Zi0+bGVuZ3RoKTsKKwkJZW1hY190eF90cGRfY3JlYXRlKGFkcHQsIHR4X3EsIHRwZCk7CisJCWNvdW50Kys7CisJfQorCisJLyogVGhlIGxhc3QgdHBkICovCisJd21iKCk7CisJZW1hY190eF90cGRfbWFya19sYXN0KGFkcHQsIHR4X3EpOworCisJLyogVGhlIGxhc3QgYnVmZmVyIGluZm8gY29udGFpbiB0aGUgc2tiIGFkZHJlc3MsCisJICogc28gaXQgd2lsbCBiZSBmcmVlZCBhZnRlciB1bm1hcAorCSAqLworCXRwYnVmLT5za2IgPSBza2I7CisKKwlyZXR1cm47CisKK2Vycm9yOgorCS8qIE9uZSBvZiB0aGUgbWVtb3J5IG1hcHBpbmdzIGZhaWxlZCwgc28gdW5kbyBldmVyeXRoaW5nICovCisJdHhfcS0+dHBkLnByb2R1Y2VfaWR4ID0gZmlyc3Q7CisKKwl3aGlsZSAoY291bnQtLSkgeworCQl0cGJ1ZiA9IEdFVF9UUERfQlVGRkVSKHR4X3EsIGZpcnN0KTsKKwkJZG1hX3VubWFwX3BhZ2UoYWRwdC0+bmV0ZGV2LT5kZXYucGFyZW50LCB0cGJ1Zi0+ZG1hX2FkZHIsCisJCQkgICAgICAgdHBidWYtPmxlbmd0aCwgRE1BX1RPX0RFVklDRSk7CisJCXRwYnVmLT5kbWFfYWRkciA9IDA7CisJCXRwYnVmLT5sZW5ndGggPSAwOworCisJCWlmICgrK2ZpcnN0ID09IHR4X3EtPnRwZC5jb3VudCkKKwkJCWZpcnN0ID0gMDsKKwl9CisKKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qIFRyYW5zbWl0IHRoZSBwYWNrZXQgdXNpbmcgc3BlY2lmaWVkIHRyYW5zbWl0IHF1ZXVlICovCitpbnQgZW1hY19tYWNfdHhfYnVmX3NlbmQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwgc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZW1hY190cGQgdHBkOworCXUzMiBwcm9kX2lkeDsKKworCW1lbXNldCgmdHBkLCAwLCBzaXplb2YodHBkKSk7CisKKwlpZiAoZW1hY190c29fY3N1bShhZHB0LCB0eF9xLCBza2IsICZ0cGQpICE9IDApIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwl9CisKKwlpZiAoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkgeworCQl1MTYgdGFnOworCisJCUVNQUNfVkxBTl9UT19UQUcoc2tiX3ZsYW5fdGFnX2dldChza2IpLCB0YWcpOworCQlUUERfQ1ZMQU5fVEFHX1NFVCgmdHBkLCB0YWcpOworCQlUUERfSU5TVENfU0VUKCZ0cGQsIDEpOworCX0KKworCWlmIChza2JfbmV0d29ya19vZmZzZXQoc2tiKSAhPSBFVEhfSExFTikKKwkJVFBEX1RZUF9TRVQoJnRwZCwgMSk7CisKKwllbWFjX3R4X2ZpbGxfdHBkKGFkcHQsIHR4X3EsIHNrYiwgJnRwZCk7CisKKwluZXRkZXZfc2VudF9xdWV1ZShhZHB0LT5uZXRkZXYsIHNrYi0+bGVuKTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgYXJlIGVub3VnaCBmcmVlIGRlc2NyaXB0b3JzIHRvIGhvbGQgb25lCisJICogbWF4aW11bS1zaXplZCBTS0IuICBXZSBuZWVkIG9uZSBkZXNjIGZvciBlYWNoIGZyYWdtZW50LAorCSAqIG9uZSBmb3IgdGhlIGNoZWNrc3VtIChlbWFjX3Rzb19jc3VtKSwgb25lIGZvciBUU08sIGFuZAorCSAqIGFuZCBvbmUgZm9yIHRoZSBTS0IgaGVhZGVyLgorCSAqLworCWlmIChlbWFjX3RwZF9udW1fZnJlZV9kZXNjcyh0eF9xKSA8IChNQVhfU0tCX0ZSQUdTICsgMykpCisJCW5ldGlmX3N0b3BfcXVldWUoYWRwdC0+bmV0ZGV2KTsKKworCS8qIHVwZGF0ZSBwcm9kdWNlIGlkeCAqLworCXByb2RfaWR4ID0gKHR4X3EtPnRwZC5wcm9kdWNlX2lkeCA8PCB0eF9xLT5wcm9kdWNlX3NoaWZ0KSAmCisJCSAgICB0eF9xLT5wcm9kdWNlX21hc2s7CisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIHR4X3EtPnByb2R1Y2VfcmVnLAorCQkJICB0eF9xLT5wcm9kdWNlX21hc2ssIHByb2RfaWR4KTsKKworCXJldHVybiBORVRERVZfVFhfT0s7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtbWFjLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtbWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhYTI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1tYWMuaApAQCAtMCwwICsxLDI0OCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogRU1BQyBETUEgSFcgZW5naW5lIHVzZXMgdGhyZWUgcmluZ3M6CisgKiBUeDoKKyAqICAgVFBEOiBUcmFuc21pdCBQYWNrZXQgRGVzY3JpcHRvciByaW5nLgorICogUng6CisgKiAgIFJGRDogUmVjZWl2ZSBGcmVlIERlc2NyaXB0b3IgcmluZy4KKyAqICAgICBSaW5nIG9mIGRlc2NyaXB0b3JzIHdpdGggZW1wdHkgYnVmZmVycyB0byBiZSBmaWxsZWQgYnkgUnggSFcuCisgKiAgIFJSRDogUmVjZWl2ZSBSZXR1cm4gRGVzY3JpcHRvciByaW5nLgorICogICAgIFJpbmcgb2YgZGVzY3JpcHRvcnMgd2l0aCBidWZmZXJzIGZpbGxlZCB3aXRoIHJlY2VpdmVkIGRhdGEuCisgKi8KKworI2lmbmRlZiBfRU1BQ19IV19IXworI2RlZmluZSBfRU1BQ19IV19IXworCisvKiBFTUFDX0NTUiByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIEVNQUNfRU1BQ19XUkFQUEVSX0NTUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwCisjZGVmaW5lIEVNQUNfRU1BQ19XUkFQUEVSX0NTUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0CisjZGVmaW5lIEVNQUNfRU1BQ19XUkFQUEVSX1RYX1RTX0xPICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA0CisjZGVmaW5lIEVNQUNfRU1BQ19XUkFQUEVSX1RYX1RTX0hJICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTA4CisjZGVmaW5lIEVNQUNfRU1BQ19XUkFQUEVSX1RYX1RTX0lOWCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTBjCisKKy8qIERNQSBPcmRlciBTZXR0aW5ncyAqLworZW51bSBlbWFjX2RtYV9vcmRlciB7CisJZW1hY19kbWFfb3JkX2luID0gMSwKKwllbWFjX2RtYV9vcmRfZW5oID0gMiwKKwllbWFjX2RtYV9vcmRfb3V0ID0gNAorfTsKKworZW51bSBlbWFjX2RtYV9yZXFfYmxvY2sgeworCWVtYWNfZG1hX3JlcV8xMjggPSAwLAorCWVtYWNfZG1hX3JlcV8yNTYgPSAxLAorCWVtYWNfZG1hX3JlcV81MTIgPSAyLAorCWVtYWNfZG1hX3JlcV8xMDI0ID0gMywKKwllbWFjX2RtYV9yZXFfMjA0OCA9IDQsCisJZW1hY19kbWFfcmVxXzQwOTYgPSA1Cit9OworCisvKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBiaXRzIGlkeC4uLmlkeCtuX2JpdHMgKi8KKyNkZWZpbmUgQklUU19HRVQodmFsLCBsbywgaGkpICgobGUzMl90b19jcHUodmFsKSAmIEdFTk1BU0soKGhpKSwgKGxvKSkpID4+IGxvKQorI2RlZmluZSBCSVRTX1NFVCh2YWwsIGxvLCBoaSwgbmV3X3ZhbCkgXAorCXZhbCA9IGNwdV90b19sZTMyKChsZTMyX3RvX2NwdSh2YWwpICYgKH5HRU5NQVNLKChoaSksIChsbykpKSkgfAlcCisJCSgoKG5ld192YWwpIDw8IChsbykpICYgR0VOTUFTSygoaGkpLCAobG8pKSkpCisKKy8qIFJSRCAoUmVjZWl2ZSBSZXR1cm4gRGVzY3JpcHRvcikgKi8KK3N0cnVjdCBlbWFjX3JyZCB7CisJdTMyCXdvcmRbNl07CisKKy8qIG51bWJlciBvZiBSRkQgKi8KKyNkZWZpbmUgUlJEX05PUihycmQpCQkJQklUU19HRVQoKHJyZCktPndvcmRbMF0sIDE2LCAxOSkKKy8qIHN0YXJ0IGNvbnN1bWVyIGluZGV4IG9mIHJmZC1yaW5nICovCisjZGVmaW5lIFJSRF9TSShycmQpCQkJQklUU19HRVQoKHJyZCktPndvcmRbMF0sIDIwLCAzMSkKKy8qIHZsYW4tdGFnIChDVklELCBDRkkgYW5kIFBSSSkgKi8KKyNkZWZpbmUgUlJEX0NWQUxOX1RBRyhycmQpCQlCSVRTX0dFVCgocnJkKS0+d29yZFsyXSwgMCwgMTUpCisvKiBsZW5ndGggb2YgdGhlIHBhY2tldCAqLworI2RlZmluZSBSUkRfUEtUX1NJWkUocnJkKQkJQklUU19HRVQoKHJyZCktPndvcmRbM10sIDAsIDEzKQorLyogTDQoVENQL1VEUCkgY2hlY2tzdW0gZmFpbGVkICovCisjZGVmaW5lIFJSRF9MNEYocnJkKQkJCUJJVFNfR0VUKChycmQpLT53b3JkWzNdLCAxNCwgMTQpCisvKiB2bGFuIHRhZ2dlZCAqLworI2RlZmluZSBSUkRfQ1ZUQUcocnJkKQkJCUJJVFNfR0VUKChycmQpLT53b3JkWzNdLCAxNiwgMTYpCisvKiBXaGVuIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIGRlc2NyaXB0b3IgaXMgdXBkYXRlZCBieSB0aGUgSVAgY29yZS4KKyAqIFdoZW4gY2xlYXJlZCwgaW5kaWNhdGVzIHRoYXQgdGhlIGRlc2NyaXB0b3IgaXMgaW52YWxpZC4KKyAqLworI2RlZmluZSBSUkRfVVBEVChycmQpCQkJQklUU19HRVQoKHJyZCktPndvcmRbM10sIDMxLCAzMSkKKyNkZWZpbmUgUlJEX1VQRFRfU0VUKHJyZCwgdmFsKQkJQklUU19TRVQoKHJyZCktPndvcmRbM10sIDMxLCAzMSwgdmFsKQorLyogdGltZXN0YW1wIGxvdyAqLworI2RlZmluZSBSUkRfVFNfTE9XKHJyZCkJCQlCSVRTX0dFVCgocnJkKS0+d29yZFs0XSwgMCwgMjkpCisvKiB0aW1lc3RhbXAgaGlnaCAqLworI2RlZmluZSBSUkRfVFNfSEkocnJkKQkJCWxlMzJfdG9fY3B1KChycmQpLT53b3JkWzVdKQorfTsKKworLyogVFBEIChUcmFuc21pdCBQYWNrZXQgRGVzY3JpcHRvcikgKi8KK3N0cnVjdCBlbWFjX3RwZCB7CisJdTMyCQkJCXdvcmRbNF07CisKKy8qIE51bWJlciBvZiBieXRlcyBvZiB0aGUgdHJhbnNtaXQgcGFja2V0LiAoaW5jbHVkZSA0LWJ5dGUgQ1JDKSAqLworI2RlZmluZSBUUERfQlVGX0xFTl9TRVQodHBkLCB2YWwpCUJJVFNfU0VUKCh0cGQpLT53b3JkWzBdLCAwLCAxNSwgdmFsKQorLyogQ3VzdG9tIENoZWNrc3VtIE9mZmxvYWQ6IFdoZW4gc2V0LCBhc2sgSVAgY29yZSB0byBvZmZsb2FkIGN1c3RvbSBjaGVja3N1bSAqLworI2RlZmluZSBUUERfQ1NYX1NFVCh0cGQsIHZhbCkJCUJJVFNfU0VUKCh0cGQpLT53b3JkWzFdLCA4LCA4LCB2YWwpCisvKiBUQ1AgTGFyZ2UgU2VuZCBPZmZsb2FkOiBXaGVuIHNldCwgYXNrIElQIGNvcmUgdG8gZG8gb2ZmbG9hZCBUQ1AgTGFyZ2UgU2VuZCAqLworI2RlZmluZSBUUERfTFNPKHRwZCkJCQlCSVRTX0dFVCgodHBkKS0+d29yZFsxXSwgMTIsIDEyKQorI2RlZmluZSBUUERfTFNPX1NFVCh0cGQsIHZhbCkJCUJJVFNfU0VUKCh0cGQpLT53b3JkWzFdLCAxMiwgMTIsIHZhbCkKKy8qICBMYXJnZSBTZW5kIE9mZmxvYWQgVmVyc2lvbjogV2hlbiBzZXQsIGluZGljYXRlcyB0aGlzIGlzIGFuIExTT3YyCisgKiAoZm9yIGJvdGggSVB2NCBhbmQgSVB2NikuIFdoZW4gY2xlYXJlZCwgaW5kaWNhdGVzIHRoaXMgaXMgYW4gTFNPdjEKKyAqIChvbmx5IGZvciBJUHY0KS4KKyAqLworI2RlZmluZSBUUERfTFNPVl9TRVQodHBkLCB2YWwpCQlCSVRTX1NFVCgodHBkKS0+d29yZFsxXSwgMTMsIDEzLCB2YWwpCisvKiBJUHY0IHBhY2tldDogV2hlbiBzZXQsIGluZGljYXRlcyB0aGlzIGlzIGFuICBJUHY0IHBhY2tldCwgdGhpcyBiaXQgaXMgb25seQorICogZm9yIExTT1YyIGZvcm1hdC4KKyAqLworI2RlZmluZSBUUERfSVBWNF9TRVQodHBkLCB2YWwpCQlCSVRTX1NFVCgodHBkKS0+d29yZFsxXSwgMTYsIDE2LCB2YWwpCisvKiAwOiBFdGhlcm5ldCAgIGZyYW1lIChEQStTQStUWVBFK0RBVEErQ1JDKQorICogMTogSUVFRSA4MDIuMyBmcmFtZSAoREErU0ErTEVOK0RTQVArU1NBUCtDVEwrT1JHK1RZUEUrREFUQStDUkMpCisgKi8KKyNkZWZpbmUgVFBEX1RZUF9TRVQodHBkLCB2YWwpCQlCSVRTX1NFVCgodHBkKS0+d29yZFsxXSwgMTcsIDE3LCB2YWwpCisvKiBMb3ctMzJiaXQgQnVmZmVyIEFkZHJlc3MgKi8KKyNkZWZpbmUgVFBEX0JVRkZFUl9BRERSX0xfU0VUKHRwZCwgdmFsKQkoKHRwZCktPndvcmRbMl0gPSBjcHVfdG9fbGUzMih2YWwpKQorLyogQ1ZMQU4gVGFnIHRvIGJlIGluc2VydGVkIGlmIElOU19WTEFOX1RBRyBpcyBzZXQsIENWTEFOIFRQSUQgYmFzZWQgb24gZ2xvYmFsCisgKiByZWdpc3RlciBjb25maWd1cmF0aW9uLgorICovCisjZGVmaW5lIFRQRF9DVkxBTl9UQUdfU0VUKHRwZCwgdmFsKQlCSVRTX1NFVCgodHBkKS0+d29yZFszXSwgMCwgMTUsIHZhbCkKKy8qICBJbnNlcnQgQ1ZsYW4gVGFnOiBXaGVuIHNldCwgYXNrIE1BQyB0byBpbnNlcnQgQ1ZMQU4gVEFHIHRvIG91dGdvaW5nIHBhY2tldAorICovCisjZGVmaW5lIFRQRF9JTlNUQ19TRVQodHBkLCB2YWwpCQlCSVRTX1NFVCgodHBkKS0+d29yZFszXSwgMTcsIDE3LCB2YWwpCisvKiBIaWdoLTE0Yml0IEJ1ZmZlciBBZGRyZXNzLCBTbywgdGhlIDY0Yi1iaXQgYWRkcmVzcyBpcworICoge0RFU0NfQ1RSTF8xMV9UWF9EQVRBX0hJQUREUlsxNzowXSwocmVnaXN0ZXIpIEJVRkZFUl9BRERSX0gsIEJVRkZFUl9BRERSX0x9CisgKi8KKyNkZWZpbmUgVFBEX0JVRkZFUl9BRERSX0hfU0VUKHRwZCwgdmFsKQlCSVRTX1NFVCgodHBkKS0+d29yZFszXSwgMTgsIDMwLCB2YWwpCisvKiBGb3JtYXQgRC4gV29yZCBvZmZzZXQgZnJvbSB0aGUgMXN0IGJ5dGUgb2YgdGhpcyBwYWNrZXQgdG8gc3RhcnQgdG8gY2FsY3VsYXRlCisgKiB0aGUgY3VzdG9tIGNoZWNrc3VtLgorICovCisjZGVmaW5lIFRQRF9QQVlMT0FEX09GRlNFVF9TRVQodHBkLCB2YWwpIEJJVFNfU0VUKCh0cGQpLT53b3JkWzFdLCAwLCA3LCB2YWwpCisvKiAgRm9ybWF0IEQuIFdvcmQgb2Zmc2V0IGZyb20gdGhlIDFzdCBieXRlIG9mIHRoaXMgcGFja2V0IHRvIGZpbGwgdGhlIGN1c3RvbQorICogY2hlY2tzdW0gdG8KKyAqLworI2RlZmluZSBUUERfQ1hTVU1fT0ZGU0VUX1NFVCh0cGQsIHZhbCkJQklUU19TRVQoKHRwZCktPndvcmRbMV0sIDE4LCAyNSwgdmFsKQorCisvKiBGb3JtYXQgQy4gVENQIEhlYWRlciBvZmZzZXQgZnJvbSB0aGUgMXN0IGJ5dGUgb2YgdGhpcyBwYWNrZXQuIChieXRlIHVuaXQpICovCisjZGVmaW5lIFRQRF9UQ1BIRFJfT0ZGU0VUX1NFVCh0cGQsIHZhbCkJQklUU19TRVQoKHRwZCktPndvcmRbMV0sIDAsIDcsIHZhbCkKKy8qIEZvcm1hdCBDLiBNU1MgKE1heGltdW0gU2VnbWVudCBTaXplKSBnb3QgZnJvbSB0aGUgcHJvdG9jb2wgbGF5ZXIuIChieXRlIHVuaXQpCisgKi8KKyNkZWZpbmUgVFBEX01TU19TRVQodHBkLCB2YWwpCQlCSVRTX1NFVCgodHBkKS0+d29yZFsxXSwgMTgsIDMwLCB2YWwpCisvKiBwYWNrZXQgbGVuZ3RoIGluIGV4dCB0cGQgKi8KKyNkZWZpbmUgVFBEX1BLVF9MRU5fU0VUKHRwZCwgdmFsKQkoKHRwZCktPndvcmRbMl0gPSBjcHVfdG9fbGUzMih2YWwpKQorfTsKKworLyogZW1hY19yaW5nX2hlYWRlciByZXByZXNlbnRzIGEgc2luZ2xlLCBjb250aWd1b3VzIGJsb2NrIG9mIERNQSBzcGFjZQorICogbWFwcGVkIGZvciB0aGUgdGhyZWUgZGVzY3JpcHRvciByaW5ncyAodHBkLCByZmQsIHJyZCkKKyAqLworc3RydWN0IGVtYWNfcmluZ19oZWFkZXIgeworCXZvaWQJCQkqdl9hZGRyOwkvKiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90CQlkbWFfYWRkcjsJLyogZG1hIGFkZHJlc3MgKi8KKwlzaXplX3QJCQlzaXplOwkJLyogbGVuZ3RoIGluIGJ5dGVzICovCisJc2l6ZV90CQkJdXNlZDsKK307CisKKy8qIGVtYWNfYnVmZmVyIGlzIHdyYXBwZXIgYXJvdW5kIGEgcG9pbnRlciB0byBhIHNvY2tldCBidWZmZXIKKyAqIHNvIGEgRE1BIGhhbmRsZSBjYW4gYmUgc3RvcmVkIGFsb25nIHdpdGggdGhlIHNrYgorICovCitzdHJ1Y3QgZW1hY19idWZmZXIgeworCXN0cnVjdCBza19idWZmCQkqc2tiOwkJLyogc29ja2V0IGJ1ZmZlciAqLworCXUxNgkJCWxlbmd0aDsJCS8qIHJ4IGJ1ZmZlciBsZW5ndGggKi8KKwlkbWFfYWRkcl90CQlkbWFfYWRkcjsJLyogZG1hIGFkZHJlc3MgKi8KK307CisKKy8qIHJlY2VpdmUgZnJlZSBkZXNjcmlwdG9yIChyZmQpIHJpbmcgKi8KK3N0cnVjdCBlbWFjX3JmZF9yaW5nIHsKKwlzdHJ1Y3QgZW1hY19idWZmZXIJKnJmYnVmZjsKKwl1MzIJCQkqdl9hZGRyOwkvKiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90CQlkbWFfYWRkcjsJLyogZG1hIGFkZHJlc3MgKi8KKwlzaXplX3QJCQlzaXplOwkJLyogbGVuZ3RoIGluIGJ5dGVzICovCisJdW5zaWduZWQgaW50CQljb3VudDsJCS8qIG51bWJlciBvZiBkZXNjIGluIHRoZSByaW5nICovCisJdW5zaWduZWQgaW50CQlwcm9kdWNlX2lkeDsKKwl1bnNpZ25lZCBpbnQJCXByb2Nlc3NfaWR4OworCXVuc2lnbmVkIGludAkJY29uc3VtZV9pZHg7CS8qIHVudXNlZCAqLworfTsKKworLyogUmVjZWl2ZSBSZXR1cm4gRGVzY2lwdG9yIChSUkQpIHJpbmcgKi8KK3N0cnVjdCBlbWFjX3JyZF9yaW5nIHsKKwl1MzIJCQkqdl9hZGRyOwkvKiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90CQlkbWFfYWRkcjsJLyogcGh5c2ljYWwgYWRkcmVzcyAqLworCXNpemVfdAkJCXNpemU7CQkvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQJCWNvdW50OwkJLyogbnVtYmVyIG9mIGRlc2MgaW4gdGhlIHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQJCXByb2R1Y2VfaWR4OwkvKiB1bnVzZWQgKi8KKwl1bnNpZ25lZCBpbnQJCWNvbnN1bWVfaWR4OworfTsKKworLyogUnggcXVldWUgKi8KK3N0cnVjdCBlbWFjX3J4X3F1ZXVlIHsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0ZGV2OwkvKiBuZXRkZXYgcmluZyBiZWxvbmdzIHRvICovCisJc3RydWN0IGVtYWNfcnJkX3JpbmcJcnJkOworCXN0cnVjdCBlbWFjX3JmZF9yaW5nCXJmZDsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJbmFwaTsKKwlzdHJ1Y3QgZW1hY19pcnEJCSppcnE7CisKKwl1MzIJCQlpbnRyOworCXUzMgkJCXByb2R1Y2VfbWFzazsKKwl1MzIJCQlwcm9jZXNzX21hc2s7CisJdTMyCQkJY29uc3VtZV9tYXNrOworCisJdTE2CQkJcHJvZHVjZV9yZWc7CisJdTE2CQkJcHJvY2Vzc19yZWc7CisJdTE2CQkJY29uc3VtZV9yZWc7CisKKwl1OAkJCXByb2R1Y2Vfc2hpZnQ7CisJdTgJCQlwcm9jZXNzX3NoZnQ7CisJdTgJCQljb25zdW1lX3NoaWZ0OworfTsKKworLyogVHJhbnNpbWl0IFBhY2tldCBEZXNjcmlwdG9yICh0cGQpIHJpbmcgKi8KK3N0cnVjdCBlbWFjX3RwZF9yaW5nIHsKKwlzdHJ1Y3QgZW1hY19idWZmZXIJKnRwYnVmZjsKKwl1MzIJCQkqdl9hZGRyOwkvKiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwlkbWFfYWRkcl90CQlkbWFfYWRkcjsJLyogZG1hIGFkZHJlc3MgKi8KKworCXNpemVfdAkJCXNpemU7CQkvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBpbnQJCWNvdW50OwkJLyogbnVtYmVyIG9mIGRlc2MgaW4gdGhlIHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQJCXByb2R1Y2VfaWR4OworCXVuc2lnbmVkIGludAkJY29uc3VtZV9pZHg7CisJdW5zaWduZWQgaW50CQlsYXN0X3Byb2R1Y2VfaWR4OworfTsKKworLyogVHggcXVldWUgKi8KK3N0cnVjdCBlbWFjX3R4X3F1ZXVlIHsKKwlzdHJ1Y3QgZW1hY190cGRfcmluZwl0cGQ7CisKKwl1MzIJCQlwcm9kdWNlX21hc2s7CisJdTMyCQkJY29uc3VtZV9tYXNrOworCisJdTE2CQkJbWF4X3BhY2tldHM7CS8qIG1heCBwYWNrZXRzIHBlciBpbnRlcnJ1cHQgKi8KKwl1MTYJCQlwcm9kdWNlX3JlZzsKKwl1MTYJCQljb25zdW1lX3JlZzsKKworCXU4CQkJcHJvZHVjZV9zaGlmdDsKKwl1OAkJCWNvbnN1bWVfc2hpZnQ7Cit9OworCitzdHJ1Y3QgZW1hY19hZGFwdGVyOworCitpbnQgIGVtYWNfbWFjX3VwKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOwordm9pZCBlbWFjX21hY19kb3duKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOwordm9pZCBlbWFjX21hY19yZXNldChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK3ZvaWQgZW1hY19tYWNfc3RhcnQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7Cit2b2lkIGVtYWNfbWFjX3N0b3Aoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7Cit2b2lkIGVtYWNfbWFjX21vZGVfY29uZmlnKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOwordm9pZCBlbWFjX21hY19yeF9wcm9jZXNzKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsIHN0cnVjdCBlbWFjX3J4X3F1ZXVlICpyeF9xLAorCQkJIGludCAqbnVtX3BrdHMsIGludCBtYXhfcGt0cyk7CitpbnQgZW1hY19tYWNfdHhfYnVmX3NlbmQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwgc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit2b2lkIGVtYWNfbWFjX3R4X3Byb2Nlc3Moc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCwgc3RydWN0IGVtYWNfdHhfcXVldWUgKnR4X3EpOwordm9pZCBlbWFjX21hY19yeF90eF9yaW5nX2luaXRfYWxsKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICBzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK2ludCAgZW1hY19tYWNfcnhfdHhfcmluZ3NfYWxsb2NfYWxsKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOwordm9pZCBlbWFjX21hY19yeF90eF9yaW5nc19mcmVlX2FsbChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK3ZvaWQgZW1hY19tYWNfbXVsdGljYXN0X2FkZHJfY2xlYXIoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7Cit2b2lkIGVtYWNfbWFjX211bHRpY2FzdF9hZGRyX3NldChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0LCB1OCAqYWRkcik7CisKKyNlbmRpZiAvKl9FTUFDX0hXX0hfKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1waHkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1waHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTRlOTBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXBoeS5jCkBAIC0wLDAgKzEsMjI3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gRU1BQyBQSFkgQ29udHJvbGxlciBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlICJlbWFjLmgiCisjaW5jbHVkZSAiZW1hYy1tYWMuaCIKKyNpbmNsdWRlICJlbWFjLXBoeS5oIgorI2luY2x1ZGUgImVtYWMtc2dtaWkuaCIKKworLyogRU1BQyBiYXNlIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgRU1BQ19NRElPX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0MTQKKyNkZWZpbmUgRU1BQ19QSFlfU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0MTgKKyNkZWZpbmUgRU1BQ19NRElPX0VYX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDE0NDAKKworLyogRU1BQ19NRElPX0NUUkwgKi8KKyNkZWZpbmUgTURJT19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgzMCkKKyNkZWZpbmUgTURJT19QUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyOSkKKyNkZWZpbmUgTURJT19BUF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyOCkKKyNkZWZpbmUgTURJT19CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyNykKKyNkZWZpbmUgTURJT19DTEtfU0VMX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcwMDAwMDAKKyNkZWZpbmUgTURJT19DTEtfU0VMX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgTURJT19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyMykKKyNkZWZpbmUgU1VQX1BSRUFNQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyMikKKyNkZWZpbmUgTURJT19SRF9OV1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyMSkKKyNkZWZpbmUgTURJT19SRUdfQUREUl9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxZjAwMDAKKyNkZWZpbmUgTURJT19SRUdfQUREUl9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgTURJT19EQVRBX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgTURJT19EQVRBX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19QSFlfU1RTICovCisjZGVmaW5lIFBIWV9BRERSX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWYwMDAwCisjZGVmaW5lIFBIWV9BRERSX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisKKyNkZWZpbmUgTURJT19DTEtfMjVfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTURJT19DTEtfMjVfMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKworI2RlZmluZSBNRElPX1dBSVRfVElNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAorCisjZGVmaW5lIEVNQUNfTElOS19TUEVFRF9ERUZBVUxUIChcCisJCUVNQUNfTElOS19TUEVFRF8xMF9IQUxGICB8XAorCQlFTUFDX0xJTktfU1BFRURfMTBfRlVMTCAgfFwKKwkJRU1BQ19MSU5LX1NQRUVEXzEwMF9IQUxGIHxcCisJCUVNQUNfTElOS19TUEVFRF8xMDBfRlVMTCB8XAorCQlFTUFDX0xJTktfU1BFRURfMUdCX0ZVTEwpCisKKy8qKgorICogZW1hY19waHlfbWRpb19hdXRvcG9sbF9kaXNhYmxlKCkgLSBkaXNhYmxlIG1kaW8gYXV0b3BvbGwKKyAqIEBhZHB0OiB0aGUgZW1hYyBhZGFwdGVyCisgKgorICogVGhlIGF1dG9wb2xsIGZlYXR1cmUgdGFrZXMgb3ZlciB0aGUgTURJTyBidXMuICBJbiBvcmRlciBmb3IKKyAqIHRoZSBQSFkgZHJpdmVyIHRvIGJlIGFibGUgdG8gdGFsayB0byB0aGUgUEhZIG92ZXIgdGhlIE1ESU8KKyAqIGJ1cywgd2UgbmVlZCB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHRoZSBhdXRvcG9sbCBmZWF0dXJlLgorICovCitzdGF0aWMgaW50IGVtYWNfcGh5X21kaW9fYXV0b3BvbGxfZGlzYWJsZShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXUzMiB2YWw7CisKKwkvKiBkaXNhYmxlIGF1dG9wb2xsICovCisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfTURJT19DVFJMLCBNRElPX0FQX0VOLCAwKTsKKworCS8qIHdhaXQgZm9yIGFueSBtZGlvIHBvbGxpbmcgdG8gY29tcGxldGUgKi8KKwlpZiAoIXJlYWRsX3BvbGxfdGltZW91dChhZHB0LT5iYXNlICsgRU1BQ19NRElPX0NUUkwsIHZhbCwKKwkJCQkhKHZhbCAmIE1ESU9fQlVTWSksIDEwMCwgTURJT19XQUlUX1RJTUVTICogMTAwKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBmYWlsZWQgdG8gZGlzYWJsZTsgZW5zdXJlIGl0IGlzIGVuYWJsZWQgYmVmb3JlIHJldHVybmluZyAqLworCWVtYWNfcmVnX3VwZGF0ZTMyKGFkcHQtPmJhc2UgKyBFTUFDX01ESU9fQ1RSTCwgMCwgTURJT19BUF9FTik7CisKKwlyZXR1cm4gLUVCVVNZOworfQorCisvKioKKyAqIGVtYWNfcGh5X21kaW9fYXV0b3BvbGxfZGlzYWJsZSgpIC0gZGlzYWJsZSBtZGlvIGF1dG9wb2xsCisgKiBAYWRwdDogdGhlIGVtYWMgYWRhcHRlcgorICoKKyAqIFRoZSBFTUFDIGhhcyB0aGUgYWJpbGl0eSB0byBwb2xsIHRoZSBleHRlcm5hbCBQSFkgb24gdGhlIE1ESU8KKyAqIGJ1cyBmb3IgbGluayBzdGF0ZSBjaGFuZ2VzLiAgVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciB0aGUKKyAqIGRyaXZlciB0byBwb2xsIHRoZSBwaHkuICBJZiBpZiB0aGUgbGluayBzdGF0ZSBkb2VzIGNoYW5nZSwKKyAqIHRoZSBFTUFDIGlzc3VlcyBhbiBpbnRlcnJ1cHQgb24gYmVoYWxmIG9mIHRoZSBQSFkuCisgKi8KK3N0YXRpYyB2b2lkIGVtYWNfcGh5X21kaW9fYXV0b3BvbGxfZW5hYmxlKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfTURJT19DVFJMLCAwLCBNRElPX0FQX0VOKTsKK30KKworc3RhdGljIGludCBlbWFjX21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgYWRkciwgaW50IHJlZ251bSkKK3sKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gYnVzLT5wcml2OworCXUzMiByZWc7CisJaW50IHJldDsKKworCXJldCA9IGVtYWNfcGh5X21kaW9fYXV0b3BvbGxfZGlzYWJsZShhZHB0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZW1hY19yZWdfdXBkYXRlMzIoYWRwdC0+YmFzZSArIEVNQUNfUEhZX1NUUywgUEhZX0FERFJfQk1TSywKKwkJCSAgKGFkZHIgPDwgUEhZX0FERFJfU0hGVCkpOworCisJcmVnID0gU1VQX1BSRUFNQkxFIHwKKwkgICAgICAoKE1ESU9fQ0xLXzI1XzQgPDwgTURJT19DTEtfU0VMX1NIRlQpICYgTURJT19DTEtfU0VMX0JNU0spIHwKKwkgICAgICAoKHJlZ251bSA8PCBNRElPX1JFR19BRERSX1NIRlQpICYgTURJT19SRUdfQUREUl9CTVNLKSB8CisJICAgICAgTURJT19TVEFSVCB8IE1ESU9fUkRfTldSOworCisJd3JpdGVsKHJlZywgYWRwdC0+YmFzZSArIEVNQUNfTURJT19DVFJMKTsKKworCWlmIChyZWFkbF9wb2xsX3RpbWVvdXQoYWRwdC0+YmFzZSArIEVNQUNfTURJT19DVFJMLCByZWcsCisJCQkgICAgICAgIShyZWcgJiAoTURJT19TVEFSVCB8IE1ESU9fQlVTWSkpLAorCQkJICAgICAgIDEwMCwgTURJT19XQUlUX1RJTUVTICogMTAwKSkKKwkJcmV0ID0gLUVJTzsKKwllbHNlCisJCXJldCA9IChyZWcgPj4gTURJT19EQVRBX1NIRlQpICYgTURJT19EQVRBX0JNU0s7CisKKwllbWFjX3BoeV9tZGlvX2F1dG9wb2xsX2VuYWJsZShhZHB0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZW1hY19tZGlvX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBhZGRyLCBpbnQgcmVnbnVtLCB1MTYgdmFsKQoreworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBidXMtPnByaXY7CisJdTMyIHJlZzsKKwlpbnQgcmV0OworCisJcmV0ID0gZW1hY19waHlfbWRpb19hdXRvcG9sbF9kaXNhYmxlKGFkcHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwllbWFjX3JlZ191cGRhdGUzMihhZHB0LT5iYXNlICsgRU1BQ19QSFlfU1RTLCBQSFlfQUREUl9CTVNLLAorCQkJICAoYWRkciA8PCBQSFlfQUREUl9TSEZUKSk7CisKKwlyZWcgPSBTVVBfUFJFQU1CTEUgfAorCQkoKE1ESU9fQ0xLXzI1XzQgPDwgTURJT19DTEtfU0VMX1NIRlQpICYgTURJT19DTEtfU0VMX0JNU0spIHwKKwkJKChyZWdudW0gPDwgTURJT19SRUdfQUREUl9TSEZUKSAmIE1ESU9fUkVHX0FERFJfQk1TSykgfAorCQkoKHZhbCA8PCBNRElPX0RBVEFfU0hGVCkgJiBNRElPX0RBVEFfQk1TSykgfAorCQlNRElPX1NUQVJUOworCisJd3JpdGVsKHJlZywgYWRwdC0+YmFzZSArIEVNQUNfTURJT19DVFJMKTsKKworCWlmIChyZWFkbF9wb2xsX3RpbWVvdXQoYWRwdC0+YmFzZSArIEVNQUNfTURJT19DVFJMLCByZWcsCisJCQkgICAgICAgIShyZWcgJiAoTURJT19TVEFSVCB8IE1ESU9fQlVTWSkpLCAxMDAsCisJCQkgICAgICAgTURJT19XQUlUX1RJTUVTICogMTAwKSkKKwkJcmV0ID0gLUVJTzsKKworCWVtYWNfcGh5X21kaW9fYXV0b3BvbGxfZW5hYmxlKGFkcHQpOworCisJcmV0dXJuIHJldDsKK30KKworLyogQ29uZmlndXJlIHRoZSBNRElPIGJ1cyBhbmQgY29ubmVjdCB0aGUgZXh0ZXJuYWwgUEhZICovCitpbnQgZW1hY19waHlfY29uZmlnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBtaWlfYnVzICptaWlfYnVzOworCWludCByZXQ7CisKKwkvKiBDcmVhdGUgdGhlIG1paV9idXMgb2JqZWN0IGZvciB0YWxraW5nIHRvIHRoZSBNRElPIGJ1cyAqLworCWFkcHQtPm1paV9idXMgPSBtaWlfYnVzID0gZGV2bV9tZGlvYnVzX2FsbG9jKCZwZGV2LT5kZXYpOworCWlmICghbWlpX2J1cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltaWlfYnVzLT5uYW1lID0gImVtYWMtbWRpbyI7CisJc25wcmludGYobWlpX2J1cy0+aWQsIE1JSV9CVVNfSURfU0laRSwgIiVzIiwgcGRldi0+bmFtZSk7CisJbWlpX2J1cy0+cmVhZCA9IGVtYWNfbWRpb19yZWFkOworCW1paV9idXMtPndyaXRlID0gZW1hY19tZGlvX3dyaXRlOworCW1paV9idXMtPnBhcmVudCA9ICZwZGV2LT5kZXY7CisJbWlpX2J1cy0+cHJpdiA9IGFkcHQ7CisKKwlpZiAoaGFzX2FjcGlfY29tcGFuaW9uKCZwZGV2LT5kZXYpKSB7CisJCXUzMiBwaHlfYWRkcjsKKworCQlyZXQgPSBtZGlvYnVzX3JlZ2lzdGVyKG1paV9idXMpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgbWRpbyBidXNcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoJnBkZXYtPmRldiwgInBoeS1jaGFubmVsIiwKKwkJCQkJICAgICAgICZwaHlfYWRkcik7CisJCWlmIChyZXQpCisJCQkvKiBJZiB3ZSBjYW4ndCByZWFkIGEgdmFsaWQgcGh5IGFkZHJlc3MsIHRoZW4gYXNzdW1lCisJCQkgKiB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHBoeSBvbiB0aGlzIG1kaW8gYnVzLgorCQkJICovCisJCQlhZHB0LT5waHlkZXYgPSBwaHlfZmluZF9maXJzdChtaWlfYnVzKTsKKwkJZWxzZQorCQkJYWRwdC0+cGh5ZGV2ID0gbWRpb2J1c19nZXRfcGh5KG1paV9idXMsIHBoeV9hZGRyKTsKKworCX0gZWxzZSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5X25wOworCisJCXJldCA9IG9mX21kaW9idXNfcmVnaXN0ZXIobWlpX2J1cywgbnApOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgbWRpbyBidXNcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXBoeV9ucCA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJwaHktaGFuZGxlIiwgMCk7CisJCWFkcHQtPnBoeWRldiA9IG9mX3BoeV9maW5kX2RldmljZShwaHlfbnApOworCX0KKworCWlmICghYWRwdC0+cGh5ZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBmaW5kIGV4dGVybmFsIHBoeVxuIik7CisJCW1kaW9idXNfdW5yZWdpc3RlcihtaWlfYnVzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGFkcHQtPnBoeWRldi0+ZHJ2KQorCQlwaHlfYXR0YWNoZWRfcHJpbnQoYWRwdC0+cGh5ZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXBoeS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXBoeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjM3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtcGh5LmgKQEAgLTAsMCArMSwzMyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqLworCisjaWZuZGVmIF9FTUFDX1BIWV9IXworI2RlZmluZSBfRU1BQ19QSFlfSF8KKwordHlwZWRlZiBpbnQgKCplbWFjX3NnbWlpX2luaXRpYWxpemUpKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOworCisvKiogZW1hY19waHkgLSBpbnRlcm5hbCBlbWFjIHBoeQorICogQGJhc2UgYmFzZSBhZGRyZXNzCisgKiBAZGlnaXRhbCBwZXItbGFuZSBkaWdpdGFsIGJsb2NrCisgKiBAaW5pdGlhbGl6ZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICovCitzdHJ1Y3QgZW1hY19waHkgeworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJdm9pZCBfX2lvbWVtCQkqZGlnaXRhbDsKKwllbWFjX3NnbWlpX2luaXRpYWxpemUJaW5pdGlhbGl6ZTsKK307CisKK3N0cnVjdCBlbWFjX2FkYXB0ZXI7CisKK2ludCBlbWFjX3BoeV9jb25maWcoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCk7CisKKyNlbmRpZiAvKiBfRU1BQ19QSFlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1zZ21paS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLXNnbWlpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjMWI1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1zZ21paS5jCkBAIC0wLDAgKzEsNzg0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBRdWFsY29tbSBUZWNobm9sb2dpZXMsIEluYy4gRU1BQyBTR01JSSBDb250cm9sbGVyIGRyaXZlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgImVtYWMuaCIKKyNpbmNsdWRlICJlbWFjLW1hYy5oIgorI2luY2x1ZGUgImVtYWMtc2dtaWkuaCIKKworLyogRU1BQ19RU0VSREVTIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9TWVNfQ0xLX0NUUkwJCTB4MDAwMDAwCisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUExMX0NOVFJMCQkweDAwMDAxNAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1BMTF9JUF9TRVRJCQkweDAwMDAxOAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1BMTF9DUF9TRVRJCQkweDAwMDAyNAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1BMTF9JUF9TRVRQCQkweDAwMDAyOAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1BMTF9DUF9TRVRQCQkweDAwMDAyYworI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1NZU0NMS19FTl9TRUwJCTB4MDAwMDM4CisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUkVTRVRTTV9DTlRSTAkJMHgwMDAwNDAKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9QTExMT0NLX0NNUDEJCTB4MDAwMDQ0CisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUExMTE9DS19DTVAyCQkweDAwMDA0OAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX1BMTExPQ0tfQ01QMwkJMHgwMDAwNGMKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9QTExMT0NLX0NNUF9FTgkJMHgwMDAwNTAKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9ERUNfU1RBUlQxCQkweDAwMDA2NAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX0RJVl9GUkFDX1NUQVJUMQkweDAwMDA5OAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX0RJVl9GUkFDX1NUQVJUMgkweDAwMDA5YworI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX0RJVl9GUkFDX1NUQVJUMwkweDAwMDBhMAorI2RlZmluZSBFTUFDX1FTRVJERVNfQ09NX0RFQ19TVEFSVDIJCTB4MDAwMGE0CisjZGVmaW5lIEVNQUNfUVNFUkRFU19DT01fUExMX0NSQ1RSTAkJMHgwMDAwYWMKKyNkZWZpbmUgRU1BQ19RU0VSREVTX0NPTV9SRVNFVF9TTQkJMHgwMDAwYmMKKyNkZWZpbmUgRU1BQ19RU0VSREVTX1RYX0JJU1RfTU9ERV9MQU5FTk8JMHgwMDAxMDAKKyNkZWZpbmUgRU1BQ19RU0VSREVTX1RYX1RYX0VNUF9QT1NUMV9MVkwJMHgwMDAxMDgKKyNkZWZpbmUgRU1BQ19RU0VSREVTX1RYX1RYX0RSVl9MVkwJCTB4MDAwMTBjCisjZGVmaW5lIEVNQUNfUVNFUkRFU19UWF9MQU5FX01PREUJCTB4MDAwMTUwCisjZGVmaW5lIEVNQUNfUVNFUkRFU19UWF9UUkFOX0RSVlJfRU1QX0VOCTB4MDAwMTcwCisjZGVmaW5lIEVNQUNfUVNFUkRFU19SWF9DRFJfQ09OVFJPTAkJMHgwMDAyMDAKKyNkZWZpbmUgRU1BQ19RU0VSREVTX1JYX0NEUl9DT05UUk9MMgkJMHgwMDAyMTAKKyNkZWZpbmUgRU1BQ19RU0VSREVTX1JYX1JYX0VRX0dBSU4xMgkJMHgwMDAyMzAKKworLyogRU1BQ19TR01JSSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX1NFUkRFU19TVEFSVAkJMHgwMDAwMDAKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfQ01OX1BXUl9DVFJMCQkweDAwMDAwNAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9SWF9QV1JfQ1RSTAkJMHgwMDAwMDgKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfVFhfUFdSX0NUUkwJCTB4MDAwMDBDCisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX0xBTkVfQ1RSTDEJCTB4MDAwMDE4CisjZGVmaW5lIEVNQUNfU0dNSUlfUEhZX0FVVE9ORUdfQ0ZHMgkJMHgwMDAwNDgKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfQ0RSX0NUUkwwCQkweDAwMDA1OAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9TUEVFRF9DRkcxCQkweDAwMDA3NAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9QT1dfRFdOX0NUUkwwCQkweDAwMDA4MAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9SRVNFVF9DVFJMCQkweDAwMDBhOAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9JUlFfQ01ECQkJMHgwMDAwYWMKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfSU5URVJSVVBUX0NMRUFSCQkweDAwMDBiMAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9JTlRFUlJVUFRfTUFTSwkJMHgwMDAwYjQKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfSU5URVJSVVBUX1NUQVRVUwkJMHgwMDAwYjgKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfUlhfQ0hLX1NUQVRVUwkJMHgwMDAwZDQKKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfQVVUT05FRzBfU1RBVFVTCQkweDAwMDBlMAorI2RlZmluZSBFTUFDX1NHTUlJX1BIWV9BVVRPTkVHMV9TVEFUVVMJCTB4MDAwMGU0CisKKy8qIEVNQUNfUVNFUkRFU19DT01fUExMX0lQX1NFVEkgKi8KKyNkZWZpbmUgUExMX0lQU0VUSSh4KQkJCQkoKHgpICYgMHgzZikKKworLyogRU1BQ19RU0VSREVTX0NPTV9QTExfQ1BfU0VUSSAqLworI2RlZmluZSBQTExfQ1BTRVRJKHgpCQkJCSgoeCkgJiAweGZmKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX1BMTF9JUF9TRVRQICovCisjZGVmaW5lIFBMTF9JUFNFVFAoeCkJCQkJKCh4KSAmIDB4M2YpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fUExMX0NQX1NFVFAgKi8KKyNkZWZpbmUgUExMX0NQU0VUUCh4KQkJCQkoKHgpICYgMHgxZikKKworLyogRU1BQ19RU0VSREVTX0NPTV9QTExfQ1JDVFJMICovCisjZGVmaW5lIFBMTF9SQ1RSTCh4KQkJCQkoKCh4KSAmIDB4ZikgPDwgNCkKKyNkZWZpbmUgUExMX0NDVFJMKHgpCQkJCSgoeCkgJiAweGYpCisKKy8qIFNHTUlJIHYyIFBIWSByZWdpc3RlcnMgcGVyIGxhbmUgKi8KKyNkZWZpbmUgRU1BQ19TR01JSV9QSFlfTE5fT0ZGU0VUCQkweDA0MDAKKworLyogU0dNSUkgdjIgZGlnaXRhbCBsYW5lIHJlZ2lzdGVycyAqLworI2RlZmluZSBFTUFDX1NHTUlJX0xOX0RSVlJfQ1RSTDAJCTB4MDBDCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fRFJWUl9UQVBfRU4JCTB4MDE4CisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fVFhfTUFSR0lOSU5HCQkweDAxQworI2RlZmluZSBFTUFDX1NHTUlJX0xOX1RYX1BSRQkJCTB4MDIwCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fVFhfUE9TVAkJCTB4MDI0CisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fVFhfQkFORF9NT0RFCQkweDA2MAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX0xBTkVfTU9ERQkJCTB4MDY0CisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fUEFSQUxMRUxfUkFURQkJMHgwNzgKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9DTUxfQ1RSTF9NT0RFMAkJMHgwQjgKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9NSVhFUl9DVFJMX01PREUwCQkweDBEMAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1ZHQV9JTklUVkFMCQkweDEzNAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1VDRFJfRk9fR0FJTl9NT0RFMAkweDE3QworI2RlZmluZSBFTUFDX1NHTUlJX0xOX1VDRFJfU09fR0FJTl9NT0RFMAkweDE4OAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1VDRFJfU09fQ09ORklHCQkweDE5NAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1JYX0JBTkQJCQkweDE5QworI2RlZmluZSBFTUFDX1NHTUlJX0xOX1JYX1JDVlJfUEFUSDFfTU9ERTAJMHgxQjgKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9SU01fQ09ORklHCQkweDFGMAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1NJR0RFVF9FTkFCTEVTCQkweDIyNAorI2RlZmluZSBFTUFDX1NHTUlJX0xOX1NJR0RFVF9DTlRSTAkJMHgyMjgKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9TSUdERVRfREVHTElUQ0hfQ05UUkwJMHgyMkMKKyNkZWZpbmUgRU1BQ19TR01JSV9MTl9SWF9FTl9TSUdOQUwJCTB4MkEwCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fUlhfTUlTQ19DTlRSTDAJCTB4MkFDCisjZGVmaW5lIEVNQUNfU0dNSUlfTE5fRFJWUl9MT0dJQ19DTEtESVYJCTB4MkJDCisKKy8qIFNHTUlJIHYyIGRpZ2l0YWwgbGFuZSByZWdpc3RlciB2YWx1ZXMgKi8KKyNkZWZpbmUgVUNEUl9TVEVQX0JZX1RXT19NT0RFMAkJCUJJVCg3KQorI2RlZmluZSBVQ0RSX3hPX0dBSU5fTU9ERSh4KQkJCSgoeCkgJiAweDdmKQorI2RlZmluZSBVQ0RSX0VOQUJMRQkJCQlCSVQoNikKKyNkZWZpbmUgVUNEUl9TT19TQVRVUkFUSU9OKHgpCQkJKCh4KSAmIDB4M2YpCisjZGVmaW5lIFNJR0RFVF9MUF9CWVBfUFM0CQkJQklUKDcpCisjZGVmaW5lIFNJR0RFVF9FTl9QUzBfVE9fUFMyCQkJQklUKDYpCisjZGVmaW5lIEVOX0FDQ09VUExFVkNNX1NXX01VWAkJCUJJVCg1KQorI2RlZmluZSBFTl9BQ0NPVVBMRVZDTV9TVwkJCUJJVCg0KQorI2RlZmluZSBSWF9TWU5DX0VOCQkJCUJJVCgzKQorI2RlZmluZSBSWFRFUk1fSElHSFpfUFM1CQkJQklUKDIpCisjZGVmaW5lIFNJR0RFVF9FTl9QUzMJCQkJQklUKDEpCisjZGVmaW5lIEVOX0FDQ09VUExFX1ZDTV9QUzMJCQlCSVQoMCkKKyNkZWZpbmUgVUZTX01PREUJCQkJQklUKDUpCisjZGVmaW5lIFRYVkFMX1ZBTElEX0lOSVQJCQlCSVQoNCkKKyNkZWZpbmUgVFhWQUxfVkFMSURfTVVYCQkJCUJJVCgzKQorI2RlZmluZSBUWFZBTF9WQUxJRAkJCQlCSVQoMikKKyNkZWZpbmUgVVNCM1AxX01PREUJCQkJQklUKDEpCisjZGVmaW5lIEtSX1BDSUdFTjNfTU9ERQkJCQlCSVQoMCkKKyNkZWZpbmUgUFJFX0VOCQkJCQlCSVQoMykKKyNkZWZpbmUgUE9TVF9FTgkJCQkJQklUKDIpCisjZGVmaW5lIE1BSU5fRU5fTVVYCQkJCUJJVCgxKQorI2RlZmluZSBNQUlOX0VOCQkJCQlCSVQoMCkKKyNkZWZpbmUgVFhfTUFSR0lOSU5HX01VWAkJCUJJVCg2KQorI2RlZmluZSBUWF9NQVJHSU5JTkcoeCkJCQkJKCh4KSAmIDB4M2YpCisjZGVmaW5lIFRYX1BSRV9NVVgJCQkJQklUKDYpCisjZGVmaW5lIFRYX1BSRSh4KQkJCQkoKHgpICYgMHgzZikKKyNkZWZpbmUgVFhfUE9TVF9NVVgJCQkJQklUKDYpCisjZGVmaW5lIFRYX1BPU1QoeCkJCQkJKCh4KSAmIDB4M2YpCisjZGVmaW5lIENNTF9HRUFSX01PREUoeCkJCQkoKCh4KSAmIDcpIDw8IDMpCisjZGVmaW5lIENNTDJDTU9TX0lCT09TVF9NT0RFKHgpCQkJKCh4KSAmIDcpCisjZGVmaW5lIE1JWEVSX0xPQURCX01PREUoeCkJCQkoKCh4KSAmIDB4ZikgPDwgMikKKyNkZWZpbmUgTUlYRVJfREFUQVJBVEVfTU9ERSh4KQkJCSgoeCkgJiAzKQorI2RlZmluZSBWR0FfVEhSRVNIX0RGRSh4KQkJCSgoeCkgJiAweDNmKQorI2RlZmluZSBTSUdERVRfTFBfQllQX1BTMF9UT19QUzIJCUJJVCg1KQorI2RlZmluZSBTSUdERVRfTFBfQllQX01VWAkJCUJJVCg0KQorI2RlZmluZSBTSUdERVRfTFBfQllQCQkJCUJJVCgzKQorI2RlZmluZSBTSUdERVRfRU5fTVVYCQkJCUJJVCgyKQorI2RlZmluZSBTSUdERVRfRU4JCQkJQklUKDEpCisjZGVmaW5lIFNJR0RFVF9GTFRfQllQCQkJCUJJVCgwKQorI2RlZmluZSBTSUdERVRfTFZMKHgpCQkJCSgoKHgpICYgMHhmKSA8PCA0KQorI2RlZmluZSBTSUdERVRfQldfQ1RSTCh4KQkJCSgoeCkgJiAweGYpCisjZGVmaW5lIFNJR0RFVF9ERUdMSVRDSF9DVFJMKHgpCQkJKCgoeCkgJiAweGYpIDw8IDEpCisjZGVmaW5lIFNJR0RFVF9ERUdMSVRDSF9CWVAJCQlCSVQoMCkKKyNkZWZpbmUgSU5WRVJUX1BDU19SWF9DTEsJCQlCSVQoNykKKyNkZWZpbmUgUFdNX0VOCQkJCQlCSVQoNikKKyNkZWZpbmUgUlhCSUFTX1NFTCh4KQkJCQkoKCh4KSAmIDB4MykgPDwgNCkKKyNkZWZpbmUgRUJEQUNfU0lHTgkJCQlCSVQoMykKKyNkZWZpbmUgRURBQ19TSUdOCQkJCUJJVCgyKQorI2RlZmluZSBFTl9BVVhUQVAxU0lHTl9JTlZFUlQJCQlCSVQoMSkKKyNkZWZpbmUgRU5fREFDX0NIT1BQSU5HCQkJCUJJVCgwKQorI2RlZmluZSBEUlZSX0xPR0lDX0NMS19FTgkJCUJJVCg0KQorI2RlZmluZSBEUlZSX0xPR0lDX0NMS19ESVYoeCkJCQkoKHgpICYgMHhmKQorI2RlZmluZSBQQVJBTExFTF9SQVRFX01PREUyKHgpCQkJKCgoeCkgJiAweDMpIDw8IDQpCisjZGVmaW5lIFBBUkFMTEVMX1JBVEVfTU9ERTEoeCkJCQkoKCh4KSAmIDB4MykgPDwgMikKKyNkZWZpbmUgUEFSQUxMRUxfUkFURV9NT0RFMCh4KQkJCSgoeCkgJiAweDMpCisjZGVmaW5lIEJBTkRfTU9ERTIoeCkJCQkJKCgoeCkgJiAweDMpIDw8IDQpCisjZGVmaW5lIEJBTkRfTU9ERTEoeCkJCQkJKCgoeCkgJiAweDMpIDw8IDIpCisjZGVmaW5lIEJBTkRfTU9ERTAoeCkJCQkJKCh4KSAmIDB4MykKKyNkZWZpbmUgTEFORV9TWU5DX01PREUJCQkJQklUKDUpCisjZGVmaW5lIExBTkVfTU9ERSh4KQkJCQkoKHgpICYgMHgxZikKKyNkZWZpbmUgQ0RSX1BEX1NFTF9NT0RFMCh4KQkJCSgoKHgpICYgMHgzKSA8PCA1KQorI2RlZmluZSBFTl9ETExfTU9ERTAJCQkJQklUKDQpCisjZGVmaW5lIEVOX0lRX0RDQ19NT0RFMAkJCQlCSVQoMykKKyNkZWZpbmUgRU5fSVFDQUxfTU9ERTAJCQkJQklUKDIpCisjZGVmaW5lIEVOX1FQQVRIX01PREUwCQkJCUJJVCgxKQorI2RlZmluZSBFTl9FUEFUSF9NT0RFMAkJCQlCSVQoMCkKKyNkZWZpbmUgRk9SQ0VfVFNZTkNfQUNLCQkJCUJJVCg3KQorI2RlZmluZSBGT1JDRV9DTU5fQUNLCQkJCUJJVCg2KQorI2RlZmluZSBGT1JDRV9DTU5fUkVBRFkJCQkJQklUKDUpCisjZGVmaW5lIEVOX1JDTEtfREVHTElUQ0gJCQlCSVQoNCkKKyNkZWZpbmUgQllQQVNTX1JTTV9DRFJfUkVTRVQJCQlCSVQoMykKKyNkZWZpbmUgQllQQVNTX1JTTV9UU1lOQwkJCUJJVCgyKQorI2RlZmluZSBCWVBBU1NfUlNNX1NBTVBfQ0FMCQkJQklUKDEpCisjZGVmaW5lIEJZUEFTU19SU01fRExMX0NBTAkJCUJJVCgwKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX1NZU19DTEtfQ1RSTCAqLworI2RlZmluZSBTWVNDTEtfQ00JCQkJQklUKDQpCisjZGVmaW5lIFNZU0NMS19BQ19DT1VQTEUJCQlCSVQoMykKKworLyogRU1BQ19RU0VSREVTX0NPTV9QTExfQ05UUkwgKi8KKyNkZWZpbmUgT0NQX0VOCQkJCQlCSVQoNSkKKyNkZWZpbmUgUExMX0RJVl9GRkVOCQkJCUJJVCgyKQorI2RlZmluZSBQTExfRElWX09SRAkJCQlCSVQoMSkKKworLyogRU1BQ19RU0VSREVTX0NPTV9TWVNDTEtfRU5fU0VMICovCisjZGVmaW5lIFNZU0NMS19TRUxfQ01PUwkJCQlCSVQoMykKKworLyogRU1BQ19RU0VSREVTX0NPTV9SRVNFVFNNX0NOVFJMICovCisjZGVmaW5lIEZSUV9UVU5FX01PREUJCQkJQklUKDQpCisKKy8qIEVNQUNfUVNFUkRFU19DT01fUExMTE9DS19DTVBfRU4gKi8KKyNkZWZpbmUgUExMTE9DS19DTVBfRU4JCQkJQklUKDApCisKKy8qIEVNQUNfUVNFUkRFU19DT01fREVDX1NUQVJUMSAqLworI2RlZmluZSBERUNfU1RBUlQxX01VWAkJCQlCSVQoNykKKyNkZWZpbmUgREVDX1NUQVJUMSh4KQkJCQkoKHgpICYgMHg3ZikKKworLyogRU1BQ19RU0VSREVTX0NPTV9ESVZfRlJBQ19TVEFSVDEgKiBFTUFDX1FTRVJERVNfQ09NX0RJVl9GUkFDX1NUQVJUMiAqLworI2RlZmluZSBESVZfRlJBQ19TVEFSVF9NVVgJCQlCSVQoNykKKyNkZWZpbmUgRElWX0ZSQUNfU1RBUlQoeCkJCQkoKHgpICYgMHg3ZikKKworLyogRU1BQ19RU0VSREVTX0NPTV9ESVZfRlJBQ19TVEFSVDMgKi8KKyNkZWZpbmUgRElWX0ZSQUNfU1RBUlQzX01VWAkJCUJJVCg0KQorI2RlZmluZSBESVZfRlJBQ19TVEFSVDMoeCkJCQkoKHgpICYgMHhmKQorCisvKiBFTUFDX1FTRVJERVNfQ09NX0RFQ19TVEFSVDIgKi8KKyNkZWZpbmUgREVDX1NUQVJUMl9NVVgJCQkJQklUKDEpCisjZGVmaW5lIERFQ19TVEFSVDIJCQkJQklUKDApCisKKy8qIEVNQUNfUVNFUkRFU19DT01fUkVTRVRfU00gKi8KKyNkZWZpbmUgUkVBRFkJCQkJCUJJVCg1KQorCisvKiBFTUFDX1FTRVJERVNfVFhfVFhfRU1QX1BPU1QxX0xWTCAqLworI2RlZmluZSBUWF9FTVBfUE9TVDFfTFZMX01VWAkJCUJJVCg1KQorI2RlZmluZSBUWF9FTVBfUE9TVDFfTFZMKHgpCQkJKCh4KSAmIDB4MWYpCisjZGVmaW5lIFRYX0VNUF9QT1NUMV9MVkxfQk1TSwkJCTB4MWYKKyNkZWZpbmUgVFhfRU1QX1BPU1QxX0xWTF9TSEZUCQkJMAorCisvKiBFTUFDX1FTRVJERVNfVFhfVFhfRFJWX0xWTCAqLworI2RlZmluZSBUWF9EUlZfTFZMX01VWAkJCQlCSVQoNCkKKyNkZWZpbmUgVFhfRFJWX0xWTCh4KQkJCQkoKHgpICYgMHhmKQorCisvKiBFTUFDX1FTRVJERVNfVFhfVFJBTl9EUlZSX0VNUF9FTiAqLworI2RlZmluZSBFTVBfRU5fTVVYCQkJCUJJVCgxKQorI2RlZmluZSBFTVBfRU4JCQkJCUJJVCgwKQorCisvKiBFTUFDX1FTRVJERVNfUlhfQ0RSX0NPTlRST0wgJiBFTUFDX1FTRVJERVNfUlhfQ0RSX0NPTlRST0wyICovCisjZGVmaW5lIEhCV19QRF9FTgkJCQlCSVQoNykKKyNkZWZpbmUgU0VDT05ET1JERVJFTkFCTEUJCQlCSVQoNikKKyNkZWZpbmUgRklSU1RPUkRFUl9USFJFU0goeCkJCQkoKCh4KSAmIDB4NykgPDwgMykKKyNkZWZpbmUgU0VDT05ET1JERVJHQUlOKHgpCQkJKCh4KSAmIDB4NykKKworLyogRU1BQ19RU0VSREVTX1JYX1JYX0VRX0dBSU4xMiAqLworI2RlZmluZSBSWF9FUV9HQUlOMih4KQkJCQkoKCh4KSAmIDB4ZikgPDwgNCkKKyNkZWZpbmUgUlhfRVFfR0FJTjEoeCkJCQkJKCh4KSAmIDB4ZikKKworLyogRU1BQ19TR01JSV9QSFlfU0VSREVTX1NUQVJUICovCisjZGVmaW5lIFNFUkRFU19TVEFSVAkJCQlCSVQoMCkKKworLyogRU1BQ19TR01JSV9QSFlfQ01OX1BXUl9DVFJMICovCisjZGVmaW5lIEJJQVNfRU4JCQkJCUJJVCg2KQorI2RlZmluZSBQTExfRU4JCQkJCUJJVCg1KQorI2RlZmluZSBTWVNDTEtfRU4JCQkJQklUKDQpCisjZGVmaW5lIENMS0JVRl9MX0VOCQkJCUJJVCgzKQorI2RlZmluZSBQTExfVFhDTEtfRU4JCQkJQklUKDEpCisjZGVmaW5lIFBMTF9SWENMS19FTgkJCQlCSVQoMCkKKworLyogRU1BQ19TR01JSV9QSFlfUlhfUFdSX0NUUkwgKi8KKyNkZWZpbmUgTDBfUlhfU0lHREVUX0VOCQkJCUJJVCg3KQorI2RlZmluZSBMMF9SWF9URVJNX01PREUoeCkJCQkoKCh4KSAmIDMpIDw8IDQpCisjZGVmaW5lIEwwX1JYX0lfRU4JCQkJQklUKDEpCisKKy8qIEVNQUNfU0dNSUlfUEhZX1RYX1BXUl9DVFJMICovCisjZGVmaW5lIEwwX1RYX0VOCQkJCUJJVCg1KQorI2RlZmluZSBMMF9DTEtCVUZfRU4JCQkJQklUKDQpCisjZGVmaW5lIEwwX1RSQU5fQklBU19FTgkJCQlCSVQoMSkKKworLyogRU1BQ19TR01JSV9QSFlfTEFORV9DVFJMMSAqLworI2RlZmluZSBMMF9SWF9FUVVBTElaRV9FTkFCTEUJCQlCSVQoNikKKyNkZWZpbmUgTDBfUkVTRVRfVFNZTkNfRU4JCQlCSVQoNCkKKyNkZWZpbmUgTDBfRFJWX0xWTCh4KQkJCQkoKHgpICYgMHhmKQorCisvKiBFTUFDX1NHTUlJX1BIWV9BVVRPTkVHX0NGRzIgKi8KKyNkZWZpbmUgRk9SQ0VfQU5fVFhfQ0ZHCQkJCUJJVCg1KQorI2RlZmluZSBGT1JDRV9BTl9SWF9DRkcJCQkJQklUKDQpCisjZGVmaW5lIEFOX0VOQUJMRQkJCQlCSVQoMCkKKworLyogRU1BQ19TR01JSV9QSFlfU1BFRURfQ0ZHMSAqLworI2RlZmluZSBEVVBMRVhfTU9ERQkJCQlCSVQoNCkKKyNkZWZpbmUgU1BETU9ERV8xMDAwCQkJCUJJVCgxKQorI2RlZmluZSBTUERNT0RFXzEwMAkJCQlCSVQoMCkKKyNkZWZpbmUgU1BETU9ERV8xMAkJCQkwCisjZGVmaW5lIFNQRE1PREVfQk1TSwkJCQkzCisjZGVmaW5lIFNQRE1PREVfU0hGVAkJCQkwCisKKy8qIEVNQUNfU0dNSUlfUEhZX1BPV19EV05fQ1RSTDAgKi8KKyNkZWZpbmUgUFdSRE5fQgkJCQkJQklUKDApCisjZGVmaW5lIENEUl9NQVhfQ05UKHgpCQkJCSgoeCkgJiAweGZmKQorCisvKiBFTUFDX1FTRVJERVNfVFhfQklTVF9NT0RFX0xBTkVOTyAqLworI2RlZmluZSBCSVNUX0xBTkVfTlVNQkVSKHgpCQkJKCgoeCkgJiAzKSA8PCA1KQorI2RlZmluZSBCSVNUTU9ERSh4KQkJCQkoKHgpICYgMHgxZikKKworLyogRU1BQ19RU0VSREVTX0NPTV9QTExMT0NLX0NNUHggKi8KKyNkZWZpbmUgUExMTE9DS19DTVAoeCkJCQkJKCh4KSAmIDB4ZmYpCisKKy8qIEVNQUNfU0dNSUlfUEhZX1JFU0VUX0NUUkwgKi8KKyNkZWZpbmUgUEhZX1NXX1JFU0VUCQkJCUJJVCgwKQorCisvKiBFTUFDX1NHTUlJX1BIWV9JUlFfQ01EICovCisjZGVmaW5lIElSUV9HTE9CQUxfQ0xFQVIJCQlCSVQoMCkKKworLyogRU1BQ19TR01JSV9QSFlfSU5URVJSVVBUX01BU0sgKi8KKyNkZWZpbmUgREVDT0RFX0NPREVfRVJSCQkJCUJJVCg3KQorI2RlZmluZSBERUNPREVfRElTUF9FUlIJCQkJQklUKDYpCisjZGVmaW5lIFBMTF9VTkxPQ0sJCQkJQklUKDUpCisjZGVmaW5lIEFOX0lMTEVHQUxfVEVSTQkJCQlCSVQoNCkKKyNkZWZpbmUgU1lOQ19GQUlMCQkJCUJJVCgzKQorI2RlZmluZSBBTl9TVEFSVAkJCQlCSVQoMikKKyNkZWZpbmUgQU5fRU5ECQkJCQlCSVQoMSkKKyNkZWZpbmUgQU5fUkVRVUVTVAkJCQlCSVQoMCkKKworI2RlZmluZSBTR01JSV9QSFlfSVJRX0NMUl9XQUlUX1RJTUUJCTEwCisKKyNkZWZpbmUgU0dNSUlfUEhZX0lOVEVSUlVQVF9FUlIgKFwKKwlERUNPREVfQ09ERV9FUlIgICAgICAgICB8XAorCURFQ09ERV9ESVNQX0VSUikKKworI2RlZmluZSBTR01JSV9JU1JfQU5fTUFTSyAgICAgICAoXAorCUFOX1JFUVVFU1QgICAgICAgICAgICAgIHxcCisJQU5fU1RBUlQgICAgICAgICAgICAgICAgfFwKKwlBTl9FTkQgICAgICAgICAgICAgICAgICB8XAorCUFOX0lMTEVHQUxfVEVSTSAgICAgICAgIHxcCisJUExMX1VOTE9DSyAgICAgICAgICAgICAgfFwKKwlTWU5DX0ZBSUwpCisKKyNkZWZpbmUgU0dNSUlfSVNSX01BU0sgICAgICAgICAgKFwKKwlTR01JSV9QSFlfSU5URVJSVVBUX0VSUiB8XAorCVNHTUlJX0lTUl9BTl9NQVNLKQorCisvKiBTR01JSSBUWF9DT05GSUcgKi8KKyNkZWZpbmUgVFhDRkdfTElOSwkJCQkweDgwMDAKKyNkZWZpbmUgVFhDRkdfTU9ERV9CTVNLCQkJCTB4MWMwMAorI2RlZmluZSBUWENGR18xMDAwX0ZVTEwJCQkJMHgxODAwCisjZGVmaW5lIFRYQ0ZHXzEwMF9GVUxMCQkJCTB4MTQwMAorI2RlZmluZSBUWENGR18xMDBfSEFMRgkJCQkweDA0MDAKKyNkZWZpbmUgVFhDRkdfMTBfRlVMTAkJCQkweDEwMDAKKyNkZWZpbmUgVFhDRkdfMTBfSEFMRgkJCQkweDAwMDAKKworI2RlZmluZSBTRVJERVNfU1RBUlRfV0FJVF9USU1FUwkJCTEwMAorCitzdHJ1Y3QgZW1hY19yZWdfd3JpdGUgeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdTMyIHZhbDsKK307CisKK3N0YXRpYyB2b2lkIGVtYWNfcmVnX3dyaXRlX2FsbCh2b2lkIF9faW9tZW0gKmJhc2UsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGVtYWNfcmVnX3dyaXRlICppdHIsIHNpemVfdCBzaXplKQoreworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7ICsraXRyLCArK2kpCisJCXdyaXRlbChpdHItPnZhbCwgYmFzZSArIGl0ci0+b2Zmc2V0KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbWFjX3JlZ193cml0ZSBwaHlzaWNhbF9jb2Rpbmdfc3VibGF5ZXJfcHJvZ3JhbW1pbmdfdjFbXSA9IHsKKwl7RU1BQ19TR01JSV9QSFlfQ0RSX0NUUkwwLCBDRFJfTUFYX0NOVCgxNSl9LAorCXtFTUFDX1NHTUlJX1BIWV9QT1dfRFdOX0NUUkwwLCBQV1JETl9CfSwKKwl7RU1BQ19TR01JSV9QSFlfQ01OX1BXUl9DVFJMLAorCQlCSUFTX0VOIHwgU1lTQ0xLX0VOIHwgQ0xLQlVGX0xfRU4gfCBQTExfVFhDTEtfRU4gfCBQTExfUlhDTEtfRU59LAorCXtFTUFDX1NHTUlJX1BIWV9UWF9QV1JfQ1RSTCwgTDBfVFhfRU4gfCBMMF9DTEtCVUZfRU4gfCBMMF9UUkFOX0JJQVNfRU59LAorCXtFTUFDX1NHTUlJX1BIWV9SWF9QV1JfQ1RSTCwKKwkJTDBfUlhfU0lHREVUX0VOIHwgTDBfUlhfVEVSTV9NT0RFKDEpIHwgTDBfUlhfSV9FTn0sCisJe0VNQUNfU0dNSUlfUEhZX0NNTl9QV1JfQ1RSTCwKKwkJQklBU19FTiB8IFBMTF9FTiB8IFNZU0NMS19FTiB8IENMS0JVRl9MX0VOIHwgUExMX1RYQ0xLX0VOIHwKKwkJUExMX1JYQ0xLX0VOfSwKKwl7RU1BQ19TR01JSV9QSFlfTEFORV9DVFJMMSwKKwkJTDBfUlhfRVFVQUxJWkVfRU5BQkxFIHwgTDBfUkVTRVRfVFNZTkNfRU4gfCBMMF9EUlZfTFZMKDE1KX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVtYWNfcmVnX3dyaXRlIHN5c2Nsa19yZWZjbGtfc2V0dGluZ1tdID0geworCXtFTUFDX1FTRVJERVNfQ09NX1NZU0NMS19FTl9TRUwsIFNZU0NMS19TRUxfQ01PU30sCisJe0VNQUNfUVNFUkRFU19DT01fU1lTX0NMS19DVFJMLAlTWVNDTEtfQ00gfCBTWVNDTEtfQUNfQ09VUExFfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW1hY19yZWdfd3JpdGUgcGxsX3NldHRpbmdbXSA9IHsKKwl7RU1BQ19RU0VSREVTX0NPTV9QTExfSVBfU0VUSSwgUExMX0lQU0VUSSgxKX0sCisJe0VNQUNfUVNFUkRFU19DT01fUExMX0NQX1NFVEksIFBMTF9DUFNFVEkoNTkpfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9QTExfSVBfU0VUUCwgUExMX0lQU0VUUCgxMCl9LAorCXtFTUFDX1FTRVJERVNfQ09NX1BMTF9DUF9TRVRQLCBQTExfQ1BTRVRQKDkpfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9QTExfQ1JDVFJMLCBQTExfUkNUUkwoMTUpIHwgUExMX0NDVFJMKDExKX0sCisJe0VNQUNfUVNFUkRFU19DT01fUExMX0NOVFJMLCBPQ1BfRU4gfCBQTExfRElWX0ZGRU4gfCBQTExfRElWX09SRH0sCisJe0VNQUNfUVNFUkRFU19DT01fREVDX1NUQVJUMSwgREVDX1NUQVJUMV9NVVggfCBERUNfU1RBUlQxKDIpfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9ERUNfU1RBUlQyLCBERUNfU1RBUlQyX01VWCB8IERFQ19TVEFSVDJ9LAorCXtFTUFDX1FTRVJERVNfQ09NX0RJVl9GUkFDX1NUQVJUMSwKKwkJRElWX0ZSQUNfU1RBUlRfTVVYIHwgRElWX0ZSQUNfU1RBUlQoODUpfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9ESVZfRlJBQ19TVEFSVDIsCisJCURJVl9GUkFDX1NUQVJUX01VWCB8IERJVl9GUkFDX1NUQVJUKDQyKX0sCisJe0VNQUNfUVNFUkRFU19DT01fRElWX0ZSQUNfU1RBUlQzLAorCQlESVZfRlJBQ19TVEFSVDNfTVVYIHwgRElWX0ZSQUNfU1RBUlQzKDMpfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9QTExMT0NLX0NNUDEsIFBMTExPQ0tfQ01QKDQzKX0sCisJe0VNQUNfUVNFUkRFU19DT01fUExMTE9DS19DTVAyLCBQTExMT0NLX0NNUCgxMDQpfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9QTExMT0NLX0NNUDMsIFBMTExPQ0tfQ01QKDApfSwKKwl7RU1BQ19RU0VSREVTX0NPTV9QTExMT0NLX0NNUF9FTiwgUExMTE9DS19DTVBfRU59LAorCXtFTUFDX1FTRVJERVNfQ09NX1JFU0VUU01fQ05UUkwsIEZSUV9UVU5FX01PREV9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbWFjX3JlZ193cml0ZSBjZHJfc2V0dGluZ1tdID0geworCXtFTUFDX1FTRVJERVNfUlhfQ0RSX0NPTlRST0wsCisJCVNFQ09ORE9SREVSRU5BQkxFIHwgRklSU1RPUkRFUl9USFJFU0goMykgfCBTRUNPTkRPUkRFUkdBSU4oMil9LAorCXtFTUFDX1FTRVJERVNfUlhfQ0RSX0NPTlRST0wyLAorCQlTRUNPTkRPUkRFUkVOQUJMRSB8IEZJUlNUT1JERVJfVEhSRVNIKDMpIHwgU0VDT05ET1JERVJHQUlOKDQpfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW1hY19yZWdfd3JpdGUgdHhfcnhfc2V0dGluZ1tdID0geworCXtFTUFDX1FTRVJERVNfVFhfQklTVF9NT0RFX0xBTkVOTywgMH0sCisJe0VNQUNfUVNFUkRFU19UWF9UWF9EUlZfTFZMLCBUWF9EUlZfTFZMX01VWCB8IFRYX0RSVl9MVkwoMTUpfSwKKwl7RU1BQ19RU0VSREVTX1RYX1RSQU5fRFJWUl9FTVBfRU4sIEVNUF9FTl9NVVggfCBFTVBfRU59LAorCXtFTUFDX1FTRVJERVNfVFhfVFhfRU1QX1BPU1QxX0xWTCwKKwkJVFhfRU1QX1BPU1QxX0xWTF9NVVggfCBUWF9FTVBfUE9TVDFfTFZMKDEpfSwKKwl7RU1BQ19RU0VSREVTX1JYX1JYX0VRX0dBSU4xMiwgUlhfRVFfR0FJTjIoMTUpIHwgUlhfRVFfR0FJTjEoMTUpfSwKKwl7RU1BQ19RU0VSREVTX1RYX0xBTkVfTU9ERSwgTEFORV9NT0RFKDgpfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW1hY19yZWdfd3JpdGUgc2dtaWlfdjJfbGFuZWRbXSA9IHsKKwkvKiBDRFIgU2V0dGluZ3MgKi8KKwl7RU1BQ19TR01JSV9MTl9VQ0RSX0ZPX0dBSU5fTU9ERTAsCisJCVVDRFJfU1RFUF9CWV9UV09fTU9ERTAgfCBVQ0RSX3hPX0dBSU5fTU9ERSgxMCl9LAorCXtFTUFDX1NHTUlJX0xOX1VDRFJfU09fR0FJTl9NT0RFMCwgVUNEUl94T19HQUlOX01PREUoNil9LAorCXtFTUFDX1NHTUlJX0xOX1VDRFJfU09fQ09ORklHLCBVQ0RSX0VOQUJMRSB8IFVDRFJfU09fU0FUVVJBVElPTigxMil9LAorCisJLyogVFgvUlggU2V0dGluZ3MgKi8KKwl7RU1BQ19TR01JSV9MTl9SWF9FTl9TSUdOQUwsIFNJR0RFVF9MUF9CWVBfUFM0IHwgU0lHREVUX0VOX1BTMF9UT19QUzJ9LAorCisJe0VNQUNfU0dNSUlfTE5fRFJWUl9DVFJMMCwgVFhWQUxfVkFMSURfSU5JVCB8IEtSX1BDSUdFTjNfTU9ERX0sCisJe0VNQUNfU0dNSUlfTE5fRFJWUl9UQVBfRU4sIE1BSU5fRU59LAorCXtFTUFDX1NHTUlJX0xOX1RYX01BUkdJTklORywgVFhfTUFSR0lOSU5HX01VWCB8IFRYX01BUkdJTklORygyNSl9LAorCXtFTUFDX1NHTUlJX0xOX1RYX1BSRSwgVFhfUFJFX01VWH0sCisJe0VNQUNfU0dNSUlfTE5fVFhfUE9TVCwgVFhfUE9TVF9NVVh9LAorCisJe0VNQUNfU0dNSUlfTE5fQ01MX0NUUkxfTU9ERTAsCisJCUNNTF9HRUFSX01PREUoMSkgfCBDTUwyQ01PU19JQk9PU1RfTU9ERSgxKX0sCisJe0VNQUNfU0dNSUlfTE5fTUlYRVJfQ1RSTF9NT0RFMCwKKwkJTUlYRVJfTE9BREJfTU9ERSgxMikgfCBNSVhFUl9EQVRBUkFURV9NT0RFKDEpfSwKKwl7RU1BQ19TR01JSV9MTl9WR0FfSU5JVFZBTCwgVkdBX1RIUkVTSF9ERkUoMzEpfSwKKwl7RU1BQ19TR01JSV9MTl9TSUdERVRfRU5BQkxFUywKKwkJU0lHREVUX0xQX0JZUF9QUzBfVE9fUFMyIHwgU0lHREVUX0ZMVF9CWVB9LAorCXtFTUFDX1NHTUlJX0xOX1NJR0RFVF9DTlRSTCwgU0lHREVUX0xWTCg4KX0sCisKKwl7RU1BQ19TR01JSV9MTl9TSUdERVRfREVHTElUQ0hfQ05UUkwsIFNJR0RFVF9ERUdMSVRDSF9DVFJMKDQpfSwKKwl7RU1BQ19TR01JSV9MTl9SWF9NSVNDX0NOVFJMMCwgMH0sCisJe0VNQUNfU0dNSUlfTE5fRFJWUl9MT0dJQ19DTEtESVYsCisJCURSVlJfTE9HSUNfQ0xLX0VOIHwgRFJWUl9MT0dJQ19DTEtfRElWKDQpfSwKKworCXtFTUFDX1NHTUlJX0xOX1BBUkFMTEVMX1JBVEUsIFBBUkFMTEVMX1JBVEVfTU9ERTAoMSl9LAorCXtFTUFDX1NHTUlJX0xOX1RYX0JBTkRfTU9ERSwgQkFORF9NT0RFMCgyKX0sCisJe0VNQUNfU0dNSUlfTE5fUlhfQkFORCwgQkFORF9NT0RFMCgzKX0sCisJe0VNQUNfU0dNSUlfTE5fTEFORV9NT0RFLCBMQU5FX01PREUoMjYpfSwKKwl7RU1BQ19TR01JSV9MTl9SWF9SQ1ZSX1BBVEgxX01PREUwLCBDRFJfUERfU0VMX01PREUwKDMpfSwKKwl7RU1BQ19TR01JSV9MTl9SU01fQ09ORklHLCBCWVBBU1NfUlNNX1NBTVBfQ0FMIHwgQllQQVNTX1JTTV9ETExfQ0FMfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZW1hY19yZWdfd3JpdGUgcGh5c2ljYWxfY29kaW5nX3N1YmxheWVyX3Byb2dyYW1taW5nX3YyW10gPSB7CisJe0VNQUNfU0dNSUlfUEhZX1BPV19EV05fQ1RSTDAsIFBXUkROX0J9LAorCXtFTUFDX1NHTUlJX1BIWV9DRFJfQ1RSTDAsIENEUl9NQVhfQ05UKDE1KX0sCisJe0VNQUNfU0dNSUlfUEhZX1RYX1BXUl9DVFJMLCAwfSwKKwl7RU1BQ19TR01JSV9QSFlfTEFORV9DVFJMMSwgTDBfUlhfRVFVQUxJWkVfRU5BQkxFfSwKK307CisKK3N0YXRpYyBpbnQgZW1hY19zZ21paV9saW5rX2luaXQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYWRwdC0+cGh5ZGV2OworCXN0cnVjdCBlbWFjX3BoeSAqcGh5ID0gJmFkcHQtPnBoeTsKKwl1MzIgdmFsOworCisJdmFsID0gcmVhZGwocGh5LT5iYXNlICsgRU1BQ19TR01JSV9QSFlfQVVUT05FR19DRkcyKTsKKworCWlmIChwaHlkZXYtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKKwkJdmFsICY9IH4oRk9SQ0VfQU5fUlhfQ0ZHIHwgRk9SQ0VfQU5fVFhfQ0ZHKTsKKwkJdmFsIHw9IEFOX0VOQUJMRTsKKwkJd3JpdGVsKHZhbCwgcGh5LT5iYXNlICsgRU1BQ19TR01JSV9QSFlfQVVUT05FR19DRkcyKTsKKwl9IGVsc2UgeworCQl1MzIgc3BlZWRfY2ZnOworCisJCXN3aXRjaCAocGh5ZGV2LT5zcGVlZCkgeworCQljYXNlIFNQRUVEXzEwOgorCQkJc3BlZWRfY2ZnID0gU1BETU9ERV8xMDsKKwkJCWJyZWFrOworCQljYXNlIFNQRUVEXzEwMDoKKwkJCXNwZWVkX2NmZyA9IFNQRE1PREVfMTAwOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwMDoKKwkJCXNwZWVkX2NmZyA9IFNQRE1PREVfMTAwMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAocGh5ZGV2LT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCQlzcGVlZF9jZmcgfD0gRFVQTEVYX01PREU7CisKKwkJdmFsICY9IH5BTl9FTkFCTEU7CisJCXdyaXRlbChzcGVlZF9jZmcsIHBoeS0+YmFzZSArIEVNQUNfU0dNSUlfUEhZX1NQRUVEX0NGRzEpOworCQl3cml0ZWwodmFsLCBwaHktPmJhc2UgKyBFTUFDX1NHTUlJX1BIWV9BVVRPTkVHX0NGRzIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtYWNfc2dtaWlfaXJxX2NsZWFyKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQsIHUzMiBpcnFfYml0cykKK3sKKwlzdHJ1Y3QgZW1hY19waHkgKnBoeSA9ICZhZHB0LT5waHk7CisJdTMyIHN0YXR1czsKKworCXdyaXRlbF9yZWxheGVkKGlycV9iaXRzLCBwaHktPmJhc2UgKyBFTUFDX1NHTUlJX1BIWV9JTlRFUlJVUFRfQ0xFQVIpOworCXdyaXRlbF9yZWxheGVkKElSUV9HTE9CQUxfQ0xFQVIsIHBoeS0+YmFzZSArIEVNQUNfU0dNSUlfUEhZX0lSUV9DTUQpOworCS8qIEVuc3VyZSBpbnRlcnJ1cHQgY2xlYXIgY29tbWFuZCBpcyB3cml0dGVuIHRvIEhXICovCisJd21iKCk7CisKKwkvKiBBZnRlciBzZXQgdGhlIElSUV9HTE9CQUxfQ0xFQVIgYml0LCB0aGUgc3RhdHVzIGNsZWFyaW5nIG11c3QKKwkgKiBiZSBjb25maXJtZWQgYmVmb3JlIGNsZWFyaW5nIHRoZSBiaXRzIGluIG90aGVyIHJlZ2lzdGVycy4KKwkgKiBJdCB0YWtlcyBhIGZldyBjeWNsZXMgZm9yIGh3IHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgc3RhdHVzLgorCSAqLworCWlmIChyZWFkbF9wb2xsX3RpbWVvdXRfYXRvbWljKHBoeS0+YmFzZSArCisJCQkJICAgICAgRU1BQ19TR01JSV9QSFlfSU5URVJSVVBUX1NUQVRVUywKKwkJCQkgICAgICBzdGF0dXMsICEoc3RhdHVzICYgaXJxX2JpdHMpLCAxLAorCQkJCSAgICAgIFNHTUlJX1BIWV9JUlFfQ0xSX1dBSVRfVElNRSkpIHsKKwkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsCisJCQkgICAiZXJyb3I6IGZhaWxlZCBjbGVhciBTR01JSSBpcnE6IHN0YXR1czoweCV4IGJpdHM6MHgleFxuIiwKKwkJCSAgIHN0YXR1cywgaXJxX2JpdHMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBGaW5hbGl6ZSBjbGVhcmluZyBwcm9jZWR1cmUgKi8KKwl3cml0ZWxfcmVsYXhlZCgwLCBwaHktPmJhc2UgKyBFTUFDX1NHTUlJX1BIWV9JUlFfQ01EKTsKKwl3cml0ZWxfcmVsYXhlZCgwLCBwaHktPmJhc2UgKyBFTUFDX1NHTUlJX1BIWV9JTlRFUlJVUFRfQ0xFQVIpOworCisJLyogRW5zdXJlIHRoYXQgY2xlYXJpbmcgcHJvY2VkdXJlIGZpbmFsaXphdGlvbiBpcyB3cml0dGVuIHRvIEhXICovCisJd21iKCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVtYWNfc2dtaWlfaW5pdF92MShzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBlbWFjX3BoeSAqcGh5ID0gJmFkcHQtPnBoeTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJcmV0ID0gZW1hY19zZ21paV9saW5rX2luaXQoYWRwdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWVtYWNfcmVnX3dyaXRlX2FsbChwaHktPmJhc2UsIHBoeXNpY2FsX2NvZGluZ19zdWJsYXllcl9wcm9ncmFtbWluZ192MSwKKwkJCSAgIEFSUkFZX1NJWkUocGh5c2ljYWxfY29kaW5nX3N1YmxheWVyX3Byb2dyYW1taW5nX3YxKSk7CisJZW1hY19yZWdfd3JpdGVfYWxsKHBoeS0+YmFzZSwgc3lzY2xrX3JlZmNsa19zZXR0aW5nLAorCQkJICAgQVJSQVlfU0laRShzeXNjbGtfcmVmY2xrX3NldHRpbmcpKTsKKwllbWFjX3JlZ193cml0ZV9hbGwocGh5LT5iYXNlLCBwbGxfc2V0dGluZywgQVJSQVlfU0laRShwbGxfc2V0dGluZykpOworCWVtYWNfcmVnX3dyaXRlX2FsbChwaHktPmJhc2UsIGNkcl9zZXR0aW5nLCBBUlJBWV9TSVpFKGNkcl9zZXR0aW5nKSk7CisJZW1hY19yZWdfd3JpdGVfYWxsKHBoeS0+YmFzZSwgdHhfcnhfc2V0dGluZywKKwkJCSAgIEFSUkFZX1NJWkUodHhfcnhfc2V0dGluZykpOworCisJLyogUG93ZXIgdXAgdGhlIFNlci9EZXMgZW5naW5lICovCisJd3JpdGVsKFNFUkRFU19TVEFSVCwgcGh5LT5iYXNlICsgRU1BQ19TR01JSV9QSFlfU0VSREVTX1NUQVJUKTsKKworCWZvciAoaSA9IDA7IGkgPCBTRVJERVNfU1RBUlRfV0FJVF9USU1FUzsgaSsrKSB7CisJCWlmIChyZWFkbChwaHktPmJhc2UgKyBFTUFDX1FTRVJERVNfQ09NX1JFU0VUX1NNKSAmIFJFQURZKQorCQkJYnJlYWs7CisJCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisJfQorCisJaWYgKGkgPT0gU0VSREVTX1NUQVJUX1dBSVRfVElNRVMpIHsKKwkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsICJlcnJvcjogc2VyL2RlcyBmYWlsZWQgdG8gc3RhcnRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLyogTWFzayBvdXQgYWxsIHRoZSBTR01JSSBJbnRlcnJ1cHQgKi8KKwl3cml0ZWwoMCwgcGh5LT5iYXNlICsgRU1BQ19TR01JSV9QSFlfSU5URVJSVVBUX01BU0spOworCisJZW1hY19zZ21paV9pcnFfY2xlYXIoYWRwdCwgU0dNSUlfUEhZX0lOVEVSUlVQVF9FUlIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbWFjX3NnbWlpX2luaXRfdjIoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgZW1hY19waHkgKnBoeSA9ICZhZHB0LT5waHk7CisJdm9pZCBfX2lvbWVtICpwaHlfcmVncyA9IHBoeS0+YmFzZTsKKwl2b2lkIF9faW9tZW0gKmxhbmVkID0gcGh5LT5kaWdpdGFsOworCXVuc2lnbmVkIGludCBpOworCXUzMiBsbnN0YXR1czsKKwlpbnQgcmV0OworCisJcmV0ID0gZW1hY19zZ21paV9saW5rX2luaXQoYWRwdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFBDUyBsYW5lLXggaW5pdCAqLworCWVtYWNfcmVnX3dyaXRlX2FsbChwaHktPmJhc2UsIHBoeXNpY2FsX2NvZGluZ19zdWJsYXllcl9wcm9ncmFtbWluZ192MiwKKwkJCSAgIEFSUkFZX1NJWkUocGh5c2ljYWxfY29kaW5nX3N1YmxheWVyX3Byb2dyYW1taW5nX3YyKSk7CisKKwkvKiBTR01JSSBsYW5lLXggaW5pdCAqLworCWVtYWNfcmVnX3dyaXRlX2FsbChwaHktPmRpZ2l0YWwsCisJCQkgICBzZ21paV92Ml9sYW5lZCwgQVJSQVlfU0laRShzZ21paV92Ml9sYW5lZCkpOworCisJLyogUG93ZXIgdXAgUENTIGFuZCBzdGFydCByZXNldCBsYW5lIHN0YXRlIG1hY2hpbmUgKi8KKworCXdyaXRlbCgwLCBwaHlfcmVncyArIEVNQUNfU0dNSUlfUEhZX1JFU0VUX0NUUkwpOworCXdyaXRlbCgxLCBsYW5lZCArIFNHTUlJX0xOX1JTTV9TVEFSVCk7CisKKwkvKiBXYWl0IGZvciBjX3JlYWR5IGFzc2VydGlvbiAqLworCWZvciAoaSA9IDA7IGkgPCBTRVJERVNfU1RBUlRfV0FJVF9USU1FUzsgaSsrKSB7CisJCWxuc3RhdHVzID0gcmVhZGwocGh5X3JlZ3MgKyBTR01JSV9QSFlfTE5fTEFORV9TVEFUVVMpOworCQlpZiAobG5zdGF0dXMgJiBCSVQoMSkpCisJCQlicmVhazsKKwkJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKKwl9CisKKwlpZiAoaSA9PSBTRVJERVNfU1RBUlRfV0FJVF9USU1FUykgeworCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwgIlNHTUlJIGZhaWxlZCB0byBzdGFydFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIERpc2FibGUgZGlnaXRhbCBhbmQgU0VSREVTIGxvb3BiYWNrICovCisJd3JpdGVsKDAsIHBoeV9yZWdzICsgU0dNSUlfUEhZX0xOX0JJU1RfR0VOMCk7CisJd3JpdGVsKDAsIHBoeV9yZWdzICsgU0dNSUlfUEhZX0xOX0JJU1RfR0VOMik7CisJd3JpdGVsKDAsIHBoeV9yZWdzICsgU0dNSUlfUEhZX0xOX0NEUl9DVFJMMSk7CisKKwkvKiBNYXNrIG91dCBhbGwgdGhlIFNHTUlJIEludGVycnVwdCAqLworCXdyaXRlbCgwLCBwaHlfcmVncyArIEVNQUNfU0dNSUlfUEhZX0lOVEVSUlVQVF9NQVNLKTsKKworCWVtYWNfc2dtaWlfaXJxX2NsZWFyKGFkcHQsIFNHTUlJX1BIWV9JTlRFUlJVUFRfRVJSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbWFjX3NnbWlpX3Jlc2V0X3ByZXBhcmUoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlzdHJ1Y3QgZW1hY19waHkgKnBoeSA9ICZhZHB0LT5waHk7CisJdTMyIHZhbDsKKworCS8qIFJlc2V0IFBIWSAqLworCXZhbCA9IHJlYWRsKHBoeS0+YmFzZSArIEVNQUNfRU1BQ19XUkFQUEVSX0NTUjIpOworCXdyaXRlbCgoKHZhbCAmIH5QSFlfUkVTRVQpIHwgUEhZX1JFU0VUKSwgcGh5LT5iYXNlICsKKwkgICAgICAgRU1BQ19FTUFDX1dSQVBQRVJfQ1NSMik7CisJLyogRW5zdXJlIHBoeS1yZXNldCBjb21tYW5kIGlzIHdyaXR0ZW4gdG8gSFcgYmVmb3JlIHRoZSByZWxlYXNlIGNtZCAqLworCW1zbGVlcCg1MCk7CisJdmFsID0gcmVhZGwocGh5LT5iYXNlICsgRU1BQ19FTUFDX1dSQVBQRVJfQ1NSMik7CisJd3JpdGVsKCh2YWwgJiB+UEhZX1JFU0VUKSwgcGh5LT5iYXNlICsgRU1BQ19FTUFDX1dSQVBQRVJfQ1NSMik7CisJLyogRW5zdXJlIHBoeS1yZXNldCByZWxlYXNlIGNvbW1hbmQgaXMgd3JpdHRlbiB0byBIVyBiZWZvcmUgaW5pdGlhbGl6aW5nCisJICogU0dNSUkKKwkgKi8KKwltc2xlZXAoNTApOworfQorCit2b2lkIGVtYWNfc2dtaWlfcmVzZXQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlpbnQgcmV0OworCisJY2xrX3NldF9yYXRlKGFkcHQtPmNsa1tFTUFDX0NMS19ISUdIX1NQRUVEXSwgMTkyMDAwMDApOworCWVtYWNfc2dtaWlfcmVzZXRfcHJlcGFyZShhZHB0KTsKKworCXJldCA9IGFkcHQtPnBoeS5pbml0aWFsaXplKGFkcHQpOworCWlmIChyZXQpCisJCW5ldGRldl9lcnIoYWRwdC0+bmV0ZGV2LAorCQkJICAgImNvdWxkIG5vdCByZWluaXRpYWxpemUgaW50ZXJuYWwgUEhZIChlcnJvcj0laSlcbiIsCisJCQkgICByZXQpOworCisJY2xrX3NldF9yYXRlKGFkcHQtPmNsa1tFTUFDX0NMS19ISUdIX1NQRUVEXSwgMTI1MDAwMDAwKTsKK30KKworc3RhdGljIGludCBlbWFjX3NnbWlpX2FjcGlfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgbWF0Y2hfdGFibGVbXSA9IHsKKwkJeworCQkJLmlkID0gIlFDT004MDcxIiwKKwkJCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCllbWFjX3NnbWlpX2luaXRfdjIsCisJCX0sCisJCXt9CisJfTsKKwljb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmlkID0gYWNwaV9tYXRjaF9kZXZpY2UobWF0Y2hfdGFibGUsIGRldik7CisJZW1hY19zZ21paV9pbml0aWFsaXplICppbml0aWFsaXplID0gZGF0YTsKKworCWlmIChpZCkKKwkJKmluaXRpYWxpemUgPSAoZW1hY19zZ21paV9pbml0aWFsaXplKWlkLT5kcml2ZXJfZGF0YTsKKworCXJldHVybiAhIWlkOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBlbWFjX3NnbWlpX2R0X21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJxY29tLGZzbTk5MDAtZW1hYy1zZ21paSIsCisJCS5kYXRhID0gZW1hY19zZ21paV9pbml0X3YxLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJxY29tLHFkZjI0MzItZW1hYy1zZ21paSIsCisJCS5kYXRhID0gZW1hY19zZ21paV9pbml0X3YyLAorCX0sCisJe30KK307CisKK2ludCBlbWFjX3NnbWlpX2NvbmZpZyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNnbWlpX3BkZXYgPSBOVUxMOworCXN0cnVjdCBlbWFjX3BoeSAqcGh5ID0gJmFkcHQtPnBoeTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJaWYgKGhhc19hY3BpX2NvbXBhbmlvbigmcGRldi0+ZGV2KSkgeworCQlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwkJZGV2ID0gZGV2aWNlX2ZpbmRfY2hpbGQoJnBkZXYtPmRldiwgJnBoeS0+aW5pdGlhbGl6ZSwKKwkJCQkJZW1hY19zZ21paV9hY3BpX21hdGNoKTsKKworCQlpZiAoIWRldikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGZpbmQgaW50ZXJuYWwgcGh5IG5vZGVcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlzZ21paV9wZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwkJbnAgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAiaW50ZXJuYWwtcGh5IiwgMCk7CisJCWlmICghbnApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIm1pc3NpbmcgaW50ZXJuYWwtcGh5IHByb3BlcnR5XG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJc2dtaWlfcGRldiA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUobnApOworCQlpZiAoIXNnbWlpX3BkZXYpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgaW50ZXJuYWwtcGh5IHByb3BlcnR5XG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UoZW1hY19zZ21paV9kdF9tYXRjaCwgJnNnbWlpX3BkZXYtPmRldik7CisJCWlmICghbWF0Y2gpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgInVucmVjb2duaXplZCBpbnRlcm5hbCBwaHkgbm9kZVxuIik7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBlcnJvcl9wdXRfZGV2aWNlOworCQl9CisKKwkJcGh5LT5pbml0aWFsaXplID0gKGVtYWNfc2dtaWlfaW5pdGlhbGl6ZSltYXRjaC0+ZGF0YTsKKwl9CisKKwkvKiBCYXNlIGFkZHJlc3MgaXMgdGhlIGZpcnN0IGFkZHJlc3MgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2Uoc2dtaWlfcGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3JfcHV0X2RldmljZTsKKwl9CisKKwlwaHktPmJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFwaHktPmJhc2UpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9wdXRfZGV2aWNlOworCX0KKworCS8qIHYyIFNHTUlJIGhhcyBhIHBlci1sYW5lIGRpZ2l0YWwgZGlnaXRhbCwgc28gcGFyc2UgaXQgaWYgaXQgZXhpc3RzICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHNnbWlpX3BkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlpZiAocmVzKSB7CisJCXBoeS0+ZGlnaXRhbCA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwkJaWYgKCFwaHktPmRpZ2l0YWwpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yX3VubWFwX2Jhc2U7CisJCX0KKwl9CisKKwlyZXQgPSBwaHktPmluaXRpYWxpemUoYWRwdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCS8qIFdlJ3ZlIHJlbWFwcGVkIHRoZSBhZGRyZXNzZXMsIHNvIHdlIGRvbid0IG5lZWQgdGhlIGRldmljZSBhbnkKKwkgKiBtb3JlLiAgb2ZfZmluZF9kZXZpY2VfYnlfbm9kZSgpIHNheXMgd2Ugc2hvdWxkIHJlbGVhc2UgaXQuCisJICovCisJcHV0X2RldmljZSgmc2dtaWlfcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlpZiAocGh5LT5kaWdpdGFsKQorCQlpb3VubWFwKHBoeS0+ZGlnaXRhbCk7CitlcnJvcl91bm1hcF9iYXNlOgorCWlvdW5tYXAocGh5LT5iYXNlKTsKK2Vycm9yX3B1dF9kZXZpY2U6CisJcHV0X2RldmljZSgmc2dtaWlfcGRldi0+ZGV2KTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtc2dtaWkuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy1zZ21paS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNzkyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMtc2dtaWkuaApAQCAtMCwwICsxLDI0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9FTUFDX1NHTUlJX0hfCisjZGVmaW5lIF9FTUFDX1NHTUlJX0hfCisKK3N0cnVjdCBlbWFjX2FkYXB0ZXI7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOworCitpbnQgZW1hY19zZ21paV9pbml0X3YxKHN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQpOworaW50IGVtYWNfc2dtaWlfaW5pdF92MihzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK2ludCBlbWFjX3NnbWlpX2NvbmZpZyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK3ZvaWQgZW1hY19zZ21paV9yZXNldChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjNiMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9lbWFjL2VtYWMuYwpAQCAtMCwwICsxLDc1NSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyogUXVhbGNvbW0gVGVjaG5vbG9naWVzLCBJbmMuIEVNQUMgR2lnYWJpdCBFdGhlcm5ldCBEcml2ZXIgKi8KKworI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSAiZW1hYy5oIgorI2luY2x1ZGUgImVtYWMtbWFjLmgiCisjaW5jbHVkZSAiZW1hYy1waHkuaCIKKyNpbmNsdWRlICJlbWFjLXNnbWlpLmgiCisKKyNkZWZpbmUgRU1BQ19NU0dfREVGQVVMVCAoTkVUSUZfTVNHX0RSViB8IE5FVElGX01TR19QUk9CRSB8IE5FVElGX01TR19MSU5LIHwgIFwKKwkJTkVUSUZfTVNHX1RJTUVSIHwgTkVUSUZfTVNHX0lGRE9XTiB8IE5FVElGX01TR19JRlVQKQorCisjZGVmaW5lIEVNQUNfUlJEX1NJWkUJCQkJCSAgICAgNAorLyogVGhlIFJSRCBzaXplIGlmIHRpbWVzdGFtcGluZyBpcyBlbmFibGVkOiAqLworI2RlZmluZSBFTUFDX1RTX1JSRF9TSVpFCQkJCSAgICAgNgorI2RlZmluZSBFTUFDX1RQRF9TSVpFCQkJCQkgICAgIDQKKyNkZWZpbmUgRU1BQ19SRkRfU0laRQkJCQkJICAgICAyCisKKyNkZWZpbmUgUkVHX01BQ19SWF9TVEFUVVNfQklOCQkgRU1BQ19SWE1BQ19TVEFUQ19SRUcwCisjZGVmaW5lIFJFR19NQUNfUlhfU1RBVFVTX0VORAkJRU1BQ19SWE1BQ19TVEFUQ19SRUcyMgorI2RlZmluZSBSRUdfTUFDX1RYX1NUQVRVU19CSU4JCSBFTUFDX1RYTUFDX1NUQVRDX1JFRzAKKyNkZWZpbmUgUkVHX01BQ19UWF9TVEFUVVNfRU5ECQlFTUFDX1RYTUFDX1NUQVRDX1JFRzI0CisKKyNkZWZpbmUgUlhRMF9OVU1fUkZEX1BSRUZfREVGCQkJCSAgICAgOAorI2RlZmluZSBUWFEwX05VTV9UUERfUFJFRl9ERUYJCQkJICAgICA1CisKKyNkZWZpbmUgRU1BQ19QUkVBTUJMRV9ERUYJCQkJICAgICA3CisKKyNkZWZpbmUgRE1BUl9ETFlfQ05UX0RFRgkJCQkgICAgMTUKKyNkZWZpbmUgRE1BV19ETFlfQ05UX0RFRgkJCQkgICAgIDQKKworI2RlZmluZSBJTVJfTk9STUFMX01BU0sgICAgICAgICAoXAorCQlJU1JfRVJST1IgICAgICAgfFwKKwkJSVNSX0dQSFlfTElOSyAgIHxcCisJCUlTUl9UWF9QS1QgICAgICB8XAorCQlHUEhZX1dBS0VVUF9JTlQpCisKKyNkZWZpbmUgSU1SX0VYVEVOREVEX01BU0sgICAgICAgKFwKKwkJU1dfTUFOX0lOVCAgICAgIHxcCisJCUlTUl9PVkVSICAgICAgICB8XAorCQlJU1JfRVJST1IgICAgICAgfFwKKwkJSVNSX0dQSFlfTElOSyAgIHxcCisJCUlTUl9UWF9QS1QgICAgICB8XAorCQlHUEhZX1dBS0VVUF9JTlQpCisKKyNkZWZpbmUgSVNSX1RYX1BLVCAgICAgIChcCisJVFhfUEtUX0lOVCAgICAgIHxcCisJVFhfUEtUX0lOVDEgICAgIHxcCisJVFhfUEtUX0lOVDIgICAgIHxcCisJVFhfUEtUX0lOVDMpCisKKyNkZWZpbmUgSVNSX0dQSFlfTElOSyAgICAgICAgKFwKKwlHUEhZX0xJTktfVVBfSU5UICAgICB8XAorCUdQSFlfTElOS19ET1dOX0lOVCkKKworI2RlZmluZSBJU1JfT1ZFUiAgICAgICAgKFwKKwlSRkQwX1VSX0lOVCAgICAgfFwKKwlSRkQxX1VSX0lOVCAgICAgfFwKKwlSRkQyX1VSX0lOVCAgICAgfFwKKwlSRkQzX1VSX0lOVCAgICAgfFwKKwlSRkQ0X1VSX0lOVCAgICAgfFwKKwlSWEZfT0ZfSU5UICAgICAgfFwKKwlUWEZfVVJfSU5UKQorCisjZGVmaW5lIElTUl9FUlJPUiAgICAgICAoXAorCURNQVJfVE9fSU5UICAgICB8XAorCURNQVdfVE9fSU5UICAgICB8XAorCVRYUV9UT19JTlQpCisKKy8qIGluIHN5bmMgd2l0aCBlbnVtIGVtYWNfY2xrX2lkICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVtYWNfY2xrX25hbWVbXSA9IHsKKwkiYXhpX2NsayIsICJjZmdfYWhiX2NsayIsICJoaWdoX3NwZWVkX2NsayIsICJtZGlvX2NsayIsICJ0eF9jbGsiLAorCSJyeF9jbGsiLCAic3lzX2NsayIKK307CisKK3ZvaWQgZW1hY19yZWdfdXBkYXRlMzIodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgbWFzaywgdTMyIHZhbCkKK3sKKwl1MzIgZGF0YSA9IHJlYWRsKGFkZHIpOworCisJd3JpdGVsKCgoZGF0YSAmIH5tYXNrKSB8IHZhbCksIGFkZHIpOworfQorCisvKiByZWluaXRpYWxpemUgKi8KK2ludCBlbWFjX3JlaW5pdF9sb2NrZWQoc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmYWRwdC0+cmVzZXRfbG9jayk7CisKKwllbWFjX21hY19kb3duKGFkcHQpOworCWVtYWNfc2dtaWlfcmVzZXQoYWRwdCk7CisJcmV0ID0gZW1hY19tYWNfdXAoYWRwdCk7CisKKwltdXRleF91bmxvY2soJmFkcHQtPnJlc2V0X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyogTkFQSSAqLworc3RhdGljIGludCBlbWFjX25hcGlfcnR4KHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3QgZW1hY19yeF9xdWV1ZSAqcnhfcSA9CisJCWNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgZW1hY19yeF9xdWV1ZSwgbmFwaSk7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IG5ldGRldl9wcml2KHJ4X3EtPm5ldGRldik7CisJc3RydWN0IGVtYWNfaXJxICppcnEgPSByeF9xLT5pcnE7CisJaW50IHdvcmtfZG9uZSA9IDA7CisKKwllbWFjX21hY19yeF9wcm9jZXNzKGFkcHQsIHJ4X3EsICZ3b3JrX2RvbmUsIGJ1ZGdldCk7CisKKwlpZiAod29ya19kb25lIDwgYnVkZ2V0KSB7CisJCW5hcGlfY29tcGxldGUobmFwaSk7CisKKwkJaXJxLT5tYXNrIHw9IHJ4X3EtPmludHI7CisJCXdyaXRlbChpcnEtPm1hc2ssIGFkcHQtPmJhc2UgKyBFTUFDX0lOVF9NQVNLKTsKKwl9CisKKwlyZXR1cm4gd29ya19kb25lOworfQorCisvKiBUcmFuc21pdCB0aGUgcGFja2V0ICovCitzdGF0aWMgaW50IGVtYWNfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJcmV0dXJuIGVtYWNfbWFjX3R4X2J1Zl9zZW5kKGFkcHQsICZhZHB0LT50eF9xLCBza2IpOworfQorCitpcnFyZXR1cm5fdCBlbWFjX2lzcihpbnQgX2lycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZW1hY19pcnEgKmlycSA9IGRhdGE7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9CisJCWNvbnRhaW5lcl9vZihpcnEsIHN0cnVjdCBlbWFjX2FkYXB0ZXIsIGlycSk7CisJc3RydWN0IGVtYWNfcnhfcXVldWUgKnJ4X3EgPSAmYWRwdC0+cnhfcTsKKwl1MzIgaXNyLCBzdGF0dXM7CisKKwkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KKwl3cml0ZWwoMCwgYWRwdC0+YmFzZSArIEVNQUNfSU5UX01BU0spOworCisJaXNyID0gcmVhZGxfcmVsYXhlZChhZHB0LT5iYXNlICsgRU1BQ19JTlRfU1RBVFVTKTsKKworCXN0YXR1cyA9IGlzciAmIGlycS0+bWFzazsKKwlpZiAoc3RhdHVzID09IDApCisJCWdvdG8gZXhpdDsKKworCWlmIChzdGF0dXMgJiBJU1JfRVJST1IpIHsKKwkJbmV0aWZfd2FybihhZHB0LCAgaW50ciwgYWRwdC0+bmV0ZGV2LAorCQkJICAgIndhcm5pbmc6IGVycm9yIGlycSBzdGF0dXMgMHglbHhcbiIsCisJCQkgICBzdGF0dXMgJiBJU1JfRVJST1IpOworCQkvKiByZXNldCBNQUMgKi8KKwkJc2NoZWR1bGVfd29yaygmYWRwdC0+d29ya190aHJlYWQpOworCX0KKworCS8qIFNjaGVkdWxlIHRoZSBuYXBpIGZvciByZWNlaXZlIHF1ZXVlIHdpdGggaW50ZXJydXB0CisJICogc3RhdHVzIGJpdCBzZXQKKwkgKi8KKwlpZiAoc3RhdHVzICYgcnhfcS0+aW50cikgeworCQlpZiAobmFwaV9zY2hlZHVsZV9wcmVwKCZyeF9xLT5uYXBpKSkgeworCQkJaXJxLT5tYXNrICY9IH5yeF9xLT5pbnRyOworCQkJX19uYXBpX3NjaGVkdWxlKCZyeF9xLT5uYXBpKTsKKwkJfQorCX0KKworCWlmIChzdGF0dXMgJiBUWF9QS1RfSU5UKQorCQllbWFjX21hY190eF9wcm9jZXNzKGFkcHQsICZhZHB0LT50eF9xKTsKKworCWlmIChzdGF0dXMgJiBJU1JfT1ZFUikKKwkJbmV0X3dhcm5fcmF0ZWxpbWl0ZWQoIndhcm5pbmc6IFRYL1JYIG92ZXJmbG93XG4iKTsKKworCS8qIGxpbmsgZXZlbnQgKi8KKwlpZiAoc3RhdHVzICYgSVNSX0dQSFlfTElOSykKKwkJcGh5X21hY19pbnRlcnJ1cHQoYWRwdC0+cGh5ZGV2LCAhIShzdGF0dXMgJiBHUEhZX0xJTktfVVBfSU5UKSk7CisKK2V4aXQ6CisJLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgKi8KKwl3cml0ZWwoaXJxLT5tYXNrLCBhZHB0LT5iYXNlICsgRU1BQ19JTlRfTUFTSyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIENvbmZpZ3VyZSBWTEFOIHRhZyBzdHJpcC9pbnNlcnQgZmVhdHVyZSAqLworc3RhdGljIGludCBlbWFjX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKK3sKKwluZXRkZXZfZmVhdHVyZXNfdCBjaGFuZ2VkID0gZmVhdHVyZXMgXiBuZXRkZXYtPmZlYXR1cmVzOworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogV2Ugb25seSBuZWVkIHRvIHJlcHJvZ3JhbSB0aGUgaGFyZHdhcmUgaWYgdGhlIFZMQU4gdGFnIGZlYXR1cmVzCisJICogaGF2ZSBjaGFuZ2VkLCBhbmQgaWYgaXQncyBhbHJlYWR5IHJ1bm5pbmcuCisJICovCisJaWYgKCEoY2hhbmdlZCAmIChORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWCB8IE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKSkpCisJCXJldHVybiAwOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCXJldHVybiAwOworCisJLyogZW1hY19tYWNfbW9kZV9jb25maWcoKSB1c2VzIG5ldGRldi0+ZmVhdHVyZXMgdG8gY29uZmlndXJlIHRoZSBFTUFDLAorCSAqIHNvIG1ha2Ugc3VyZSBpdCdzIHNldCBmaXJzdC4KKwkgKi8KKwluZXRkZXYtPmZlYXR1cmVzID0gZmVhdHVyZXM7CisKKwlyZXR1cm4gZW1hY19yZWluaXRfbG9ja2VkKGFkcHQpOworfQorCisvKiBDb25maWd1cmUgTXVsdGljYXN0IGFuZCBQcm9taXNjdW91cyBtb2RlcyAqLworc3RhdGljIHZvaWQgZW1hY19yeF9tb2RlX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisKKwllbWFjX21hY19tb2RlX2NvbmZpZyhhZHB0KTsKKworCS8qIHVwZGF0ZSBtdWx0aWNhc3QgYWRkcmVzcyBmaWx0ZXJpbmcgKi8KKwllbWFjX21hY19tdWx0aWNhc3RfYWRkcl9jbGVhcihhZHB0KTsKKwluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgbmV0ZGV2KQorCQllbWFjX21hY19tdWx0aWNhc3RfYWRkcl9zZXQoYWRwdCwgaGEtPmFkZHIpOworfQorCisvKiBDaGFuZ2UgdGhlIE1heGltdW0gVHJhbnNmZXIgVW5pdCAoTVRVKSAqLworc3RhdGljIGludCBlbWFjX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCit7CisJdW5zaWduZWQgaW50IG1heF9mcmFtZSA9IG5ld19tdHUgKyBFVEhfSExFTiArIEVUSF9GQ1NfTEVOICsgVkxBTl9ITEVOOworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKChtYXhfZnJhbWUgPCBFTUFDX01JTl9FVEhfRlJBTUVfU0laRSkgfHwKKwkgICAgKG1heF9mcmFtZSA+IEVNQUNfTUFYX0VUSF9GUkFNRV9TSVpFKSkgeworCQluZXRkZXZfZXJyKGFkcHQtPm5ldGRldiwgImVycm9yOiBpbnZhbGlkIE1UVSBzZXR0aW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbmV0aWZfaW5mbyhhZHB0LCBodywgYWRwdC0+bmV0ZGV2LAorCQkgICAiY2hhbmdpbmcgTVRVIGZyb20gJWQgdG8gJWRcbiIsIG5ldGRldi0+bXR1LAorCQkgICBuZXdfbXR1KTsKKwluZXRkZXYtPm10dSA9IG5ld19tdHU7CisKKwlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlyZXR1cm4gZW1hY19yZWluaXRfbG9ja2VkKGFkcHQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpcyBtYWRlIGFjdGl2ZSAqLworc3RhdGljIGludCBlbWFjX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmV0OworCisJLyogYWxsb2NhdGUgcngvdHggZG1hIGJ1ZmZlciAmIGRlc2NyaXB0b3JzICovCisJcmV0ID0gZW1hY19tYWNfcnhfdHhfcmluZ3NfYWxsb2NfYWxsKGFkcHQpOworCWlmIChyZXQpIHsKKwkJbmV0ZGV2X2VycihhZHB0LT5uZXRkZXYsICJlcnJvciBhbGxvY2F0aW5nIHJ4L3R4IHJpbmdzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBlbWFjX21hY191cChhZHB0KTsKKwlpZiAocmV0KSB7CisJCWVtYWNfbWFjX3J4X3R4X3JpbmdzX2ZyZWVfYWxsKGFkcHQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWVtYWNfbWFjX3N0YXJ0KGFkcHQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuIHRoZSBuZXR3b3JrIGludGVyZmFjZSBpcyBkaXNhYmxlZCAqLworc3RhdGljIGludCBlbWFjX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwltdXRleF9sb2NrKCZhZHB0LT5yZXNldF9sb2NrKTsKKworCWVtYWNfbWFjX2Rvd24oYWRwdCk7CisJZW1hY19tYWNfcnhfdHhfcmluZ3NfZnJlZV9hbGwoYWRwdCk7CisKKwltdXRleF91bmxvY2soJmFkcHQtPnJlc2V0X2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlc3BvbmQgdG8gYSBUWCBoYW5nICovCitzdGF0aWMgdm9pZCBlbWFjX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXNjaGVkdWxlX3dvcmsoJmFkcHQtPndvcmtfdGhyZWFkKTsKK30KKworLyogSU9DVEwgc3VwcG9ydCBmb3IgdGhlIGludGVyZmFjZSAqLworc3RhdGljIGludCBlbWFjX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKQoreworCWlmICghbmV0aWZfcnVubmluZyhuZXRkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbmV0ZGV2LT5waHlkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHBoeV9taWlfaW9jdGwobmV0ZGV2LT5waHlkZXYsIGlmciwgY21kKTsKK30KKworLyogUHJvdmlkZSBuZXR3b3JrIHN0YXRpc3RpY3MgaW5mbyBmb3IgdGhlIGludGVyZmFjZSAqLworc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqZW1hY19nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCQkJICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKm5ldF9zdGF0cykKK3sKKwlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwl1bnNpZ25lZCBpbnQgYWRkciA9IFJFR19NQUNfUlhfU1RBVFVTX0JJTjsKKwlzdHJ1Y3QgZW1hY19zdGF0cyAqc3RhdHMgPSAmYWRwdC0+c3RhdHM7CisJdTY0ICpzdGF0c19pdHIgPSAmYWRwdC0+c3RhdHMucnhfb2s7CisJdTMyIHZhbDsKKworCXNwaW5fbG9jaygmc3RhdHMtPmxvY2spOworCisJd2hpbGUgKGFkZHIgPD0gUkVHX01BQ19SWF9TVEFUVVNfRU5EKSB7CisJCXZhbCA9IHJlYWRsX3JlbGF4ZWQoYWRwdC0+YmFzZSArIGFkZHIpOworCQkqc3RhdHNfaXRyICs9IHZhbDsKKwkJc3RhdHNfaXRyKys7CisJCWFkZHIgKz0gc2l6ZW9mKHUzMik7CisJfQorCisJLyogYWRkaXRpb25hbCByeCBzdGF0dXMgKi8KKwl2YWwgPSByZWFkbF9yZWxheGVkKGFkcHQtPmJhc2UgKyBFTUFDX1JYTUFDX1NUQVRDX1JFRzIzKTsKKwlhZHB0LT5zdGF0cy5yeF9jcmNfYWxpZ24gKz0gdmFsOworCXZhbCA9IHJlYWRsX3JlbGF4ZWQoYWRwdC0+YmFzZSArIEVNQUNfUlhNQUNfU1RBVENfUkVHMjQpOworCWFkcHQtPnN0YXRzLnJ4X2phYmJlcnMgKz0gdmFsOworCisJLyogdXBkYXRlIHR4IHN0YXR1cyAqLworCWFkZHIgPSBSRUdfTUFDX1RYX1NUQVRVU19CSU47CisJc3RhdHNfaXRyID0gJmFkcHQtPnN0YXRzLnR4X29rOworCisJd2hpbGUgKGFkZHIgPD0gUkVHX01BQ19UWF9TVEFUVVNfRU5EKSB7CisJCXZhbCA9IHJlYWRsX3JlbGF4ZWQoYWRwdC0+YmFzZSArIGFkZHIpOworCQkqc3RhdHNfaXRyICs9IHZhbDsKKwkJKytzdGF0c19pdHI7CisJCWFkZHIgKz0gc2l6ZW9mKHUzMik7CisJfQorCisJLyogYWRkaXRpb25hbCB0eCBzdGF0dXMgKi8KKwl2YWwgPSByZWFkbF9yZWxheGVkKGFkcHQtPmJhc2UgKyBFTUFDX1RYTUFDX1NUQVRDX1JFRzI1KTsKKwlhZHB0LT5zdGF0cy50eF9jb2wgKz0gdmFsOworCisJLyogcmV0dXJuIHBhcnNlZCBzdGF0aXN0aWNzICovCisJbmV0X3N0YXRzLT5yeF9wYWNrZXRzID0gc3RhdHMtPnJ4X29rOworCW5ldF9zdGF0cy0+dHhfcGFja2V0cyA9IHN0YXRzLT50eF9vazsKKwluZXRfc3RhdHMtPnJ4X2J5dGVzID0gc3RhdHMtPnJ4X2J5dGVfY250OworCW5ldF9zdGF0cy0+dHhfYnl0ZXMgPSBzdGF0cy0+dHhfYnl0ZV9jbnQ7CisJbmV0X3N0YXRzLT5tdWx0aWNhc3QgPSBzdGF0cy0+cnhfbWNhc3Q7CisJbmV0X3N0YXRzLT5jb2xsaXNpb25zID0gc3RhdHMtPnR4XzFfY29sICsgc3RhdHMtPnR4XzJfY29sICogMiArCisJCQkJc3RhdHMtPnR4X2xhdGVfY29sICsgc3RhdHMtPnR4X2Fib3J0X2NvbDsKKworCW5ldF9zdGF0cy0+cnhfZXJyb3JzID0gc3RhdHMtPnJ4X2ZyYWcgKyBzdGF0cy0+cnhfZmNzX2VyciArCisJCQkgICAgICAgc3RhdHMtPnJ4X2xlbl9lcnIgKyBzdGF0cy0+cnhfc3pfb3YgKworCQkJICAgICAgIHN0YXRzLT5yeF9hbGlnbl9lcnI7CisJbmV0X3N0YXRzLT5yeF9maWZvX2Vycm9ycyA9IHN0YXRzLT5yeF9yeGZfb3Y7CisJbmV0X3N0YXRzLT5yeF9sZW5ndGhfZXJyb3JzID0gc3RhdHMtPnJ4X2xlbl9lcnI7CisJbmV0X3N0YXRzLT5yeF9jcmNfZXJyb3JzID0gc3RhdHMtPnJ4X2Zjc19lcnI7CisJbmV0X3N0YXRzLT5yeF9mcmFtZV9lcnJvcnMgPSBzdGF0cy0+cnhfYWxpZ25fZXJyOworCW5ldF9zdGF0cy0+cnhfb3Zlcl9lcnJvcnMgPSBzdGF0cy0+cnhfcnhmX292OworCW5ldF9zdGF0cy0+cnhfbWlzc2VkX2Vycm9ycyA9IHN0YXRzLT5yeF9yeGZfb3Y7CisKKwluZXRfc3RhdHMtPnR4X2Vycm9ycyA9IHN0YXRzLT50eF9sYXRlX2NvbCArIHN0YXRzLT50eF9hYm9ydF9jb2wgKworCQkJICAgICAgIHN0YXRzLT50eF91bmRlcnJ1biArIHN0YXRzLT50eF90cnVuYzsKKwluZXRfc3RhdHMtPnR4X2ZpZm9fZXJyb3JzID0gc3RhdHMtPnR4X3VuZGVycnVuOworCW5ldF9zdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgPSBzdGF0cy0+dHhfYWJvcnRfY29sOworCW5ldF9zdGF0cy0+dHhfd2luZG93X2Vycm9ycyA9IHN0YXRzLT50eF9sYXRlX2NvbDsKKworCXNwaW5fdW5sb2NrKCZzdGF0cy0+bG9jayk7CisKKwlyZXR1cm4gbmV0X3N0YXRzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGVtYWNfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZW1hY19vcGVuLAorCS5uZG9fc3RvcAkJPSBlbWFjX2Nsb3NlLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBlbWFjX3N0YXJ0X3htaXQsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb19jaGFuZ2VfbXR1CQk9IGVtYWNfY2hhbmdlX210dSwKKwkubmRvX2RvX2lvY3RsCQk9IGVtYWNfaW9jdGwsCisJLm5kb190eF90aW1lb3V0CQk9IGVtYWNfdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0czY0CT0gZW1hY19nZXRfc3RhdHM2NCwKKwkubmRvX3NldF9mZWF0dXJlcyAgICAgICA9IGVtYWNfc2V0X2ZlYXR1cmVzLAorCS5uZG9fc2V0X3J4X21vZGUgICAgICAgID0gZW1hY19yeF9tb2RlX3NldCwKK307CisKKy8qIFdhdGNoZG9nIHRhc2sgcm91dGluZSwgY2FsbGVkIHRvIHJlaW5pdGlhbGl6ZSB0aGUgRU1BQyAqLworc3RhdGljIHZvaWQgZW1hY193b3JrX3RocmVhZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZW1hY19hZGFwdGVyLCB3b3JrX3RocmVhZCk7CisKKwllbWFjX3JlaW5pdF9sb2NrZWQoYWRwdCk7Cit9CisKKy8qIEluaXRpYWxpemUgdmFyaW91cyBkYXRhIHN0cnVjdHVyZXMgICovCitzdGF0aWMgdm9pZCBlbWFjX2luaXRfYWRhcHRlcihzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXUzMiByZWc7CisKKwkvKiBkZXNjcmlwdG9ycyAqLworCWFkcHQtPnR4X2Rlc2NfY250ID0gRU1BQ19ERUZfVFhfREVTQ1M7CisJYWRwdC0+cnhfZGVzY19jbnQgPSBFTUFDX0RFRl9SWF9ERVNDUzsKKworCS8qIGRtYSAqLworCWFkcHQtPmRtYV9vcmRlciA9IGVtYWNfZG1hX29yZF9vdXQ7CisJYWRwdC0+ZG1hcl9ibG9jayA9IGVtYWNfZG1hX3JlcV80MDk2OworCWFkcHQtPmRtYXdfYmxvY2sgPSBlbWFjX2RtYV9yZXFfMTI4OworCWFkcHQtPmRtYXJfZGx5X2NudCA9IERNQVJfRExZX0NOVF9ERUY7CisJYWRwdC0+ZG1hd19kbHlfY250ID0gRE1BV19ETFlfQ05UX0RFRjsKKwlhZHB0LT50cGRfYnVyc3QgPSBUWFEwX05VTV9UUERfUFJFRl9ERUY7CisJYWRwdC0+cmZkX2J1cnN0ID0gUlhRMF9OVU1fUkZEX1BSRUZfREVGOworCisJLyogaXJxIG1vZGVyYXRvciAqLworCXJlZyA9ICgoRU1BQ19ERUZfUlhfSVJRX01PRCA+PiAxKSA8PCBJUlFfTU9ERVJBVE9SMl9JTklUX1NIRlQpIHwKKwkgICAgICAoKEVNQUNfREVGX1RYX0lSUV9NT0QgPj4gMSkgPDwgSVJRX01PREVSQVRPUl9JTklUX1NIRlQpOworCWFkcHQtPmlycV9tb2QgPSByZWc7CisKKwkvKiBvdGhlcnMgKi8KKwlhZHB0LT5wcmVhbWJsZSA9IEVNQUNfUFJFQU1CTEVfREVGOworfQorCisvKiBHZXQgdGhlIGNsb2NrICovCitzdGF0aWMgaW50IGVtYWNfY2xrc19nZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSBzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVNQUNfQ0xLX0NOVDsgaSsrKSB7CisJCXN0cnVjdCBjbGsgKmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBlbWFjX2Nsa19uYW1lW2ldKTsKKworCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiY291bGQgbm90IGNsYWltIGNsb2NrICVzIChlcnJvcj0lbGkpXG4iLAorCQkJCWVtYWNfY2xrX25hbWVbaV0sIFBUUl9FUlIoY2xrKSk7CisKKwkJCXJldHVybiBQVFJfRVJSKGNsayk7CisJCX0KKworCQlhZHB0LT5jbGtbaV0gPSBjbGs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEluaXRpYWxpemUgY2xvY2tzICovCitzdGF0aWMgaW50IGVtYWNfY2xrc19waGFzZTFfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSBzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBlbWFjX2Nsa3NfZ2V0KHBkZXYsIGFkcHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX0FYSV0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX0NGR19BSEJdKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3NldF9yYXRlKGFkcHQtPmNsa1tFTUFDX0NMS19ISUdIX1NQRUVEXSwgMTkyMDAwMDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY2xrX3ByZXBhcmVfZW5hYmxlKGFkcHQtPmNsa1tFTUFDX0NMS19ISUdIX1NQRUVEXSk7Cit9CisKKy8qIEVuYWJsZSBjbG9ja3M7IG5lZWRzIGVtYWNfY2xrc19waGFzZTFfaW5pdCB0byBiZSBjYWxsZWQgYmVmb3JlICovCitzdGF0aWMgaW50IGVtYWNfY2xrc19waGFzZTJfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSBzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfc2V0X3JhdGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX1RYXSwgMTI1MDAwMDAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGFkcHQtPmNsa1tFTUFDX0NMS19UWF0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfc2V0X3JhdGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX0hJR0hfU1BFRURdLCAxMjUwMDAwMDApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfc2V0X3JhdGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX01ESU9dLCAyNTAwMDAwMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShhZHB0LT5jbGtbRU1BQ19DTEtfTURJT10pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX1JYXSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjbGtfcHJlcGFyZV9lbmFibGUoYWRwdC0+Y2xrW0VNQUNfQ0xLX1NZU10pOworfQorCitzdGF0aWMgdm9pZCBlbWFjX2Nsa3NfdGVhcmRvd24oc3RydWN0IGVtYWNfYWRhcHRlciAqYWRwdCkKK3sKKworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEVNQUNfQ0xLX0NOVDsgaSsrKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYWRwdC0+Y2xrW2ldKTsKK30KKworLyogR2V0IHRoZSByZXNvdXJjZXMgKi8KK3N0YXRpYyBpbnQgZW1hY19wcm9iZV9yZXNvdXJjZXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQlzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZHB0LT5uZXRkZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJY2hhciBtYWRkcltFVEhfQUxFTl07CisJaW50IHJldCA9IDA7CisKKwkvKiBnZXQgbWFjIGFkZHJlc3MgKi8KKwlpZiAoZGV2aWNlX2dldF9tYWNfYWRkcmVzcygmcGRldi0+ZGV2LCBtYWRkciwgRVRIX0FMRU4pKQorCQlldGhlcl9hZGRyX2NvcHkobmV0ZGV2LT5kZXZfYWRkciwgbWFkZHIpOworCWVsc2UKKwkJZXRoX2h3X2FkZHJfcmFuZG9tKG5ldGRldik7CisKKwkvKiBDb3JlIDAgaW50ZXJydXB0ICovCisJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiZXJyb3I6IG1pc3NpbmcgY29yZTAgaXJxIHJlc291cmNlIChlcnJvcj0laSlcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWFkcHQtPmlycS5pcnEgPSByZXQ7CisKKwkvKiBiYXNlIHJlZ2lzdGVyIGFkZHJlc3MgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWFkcHQtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGFkcHQtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihhZHB0LT5iYXNlKTsKKworCS8qIENTUiByZWdpc3RlciBhZGRyZXNzICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlhZHB0LT5jc3IgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGFkcHQtPmNzcikpCisJCXJldHVybiBQVFJfRVJSKGFkcHQtPmNzcik7CisKKwluZXRkZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWFkcHQtPmJhc2U7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZW1hY19kdF9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAicWNvbSxmc205OTAwLWVtYWMiLAorCX0sCisJe30KK307CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19BQ1BJKQorc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBlbWFjX2FjcGlfbWF0Y2hbXSA9IHsKKwl7CisJCS5pZCA9ICJRQ09NODA3MCIsCisJfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgZW1hY19hY3BpX21hdGNoKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGVtYWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQ7CisJc3RydWN0IGVtYWNfcGh5ICpwaHk7CisJdTE2IGRldmlkLCByZXZpZDsKKwl1MzIgcmVnOworCWludCByZXQ7CisKKwkvKiBUaGUgRU1BQyBpdHNlbGYgaXMgY2FwYWJsZSBvZiA2NC1iaXQgRE1BLCBzbyB0cnkgdGhhdCBmaXJzdC4gKi8KKwlyZXQgPSBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCWlmIChyZXQpIHsKKwkJLyogU29tZSBwbGF0Zm9ybXMgbWF5IHJlc3RyaWN0IHRoZSBFTUFDJ3MgYWRkcmVzcyBidXMgdG8gbGVzcworCQkgKiB0aGVuIHRoZSBzaXplIG9mIEREUi4gSW4gdGhpcyBjYXNlLCB3ZSBuZWVkIHRvIHRyeSBhCisJCSAqIHNtYWxsZXIgbWFzay4gIFdlIGNvdWxkIHRyeSBldmVyeSBwb3NzaWJsZSBzbWFsbGVyIG1hc2ssCisJCSAqIGJ1dCB0aGF0J3Mgb3ZlcmtpbGwuICBJbnN0ZWFkLCBqdXN0IGZhbGwgdG8gMzItYml0LCB3aGljaAorCQkgKiBzaG91bGQgYWx3YXlzIHdvcmsuCisJCSAqLworCQlyZXQgPSBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3Qgc2V0IERNQSBtYXNrXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGVtYWNfYWRhcHRlcikpOworCWlmICghbmV0ZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBuZXRkZXYpOworCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7CisKKwlhZHB0ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlhZHB0LT5uZXRkZXYgPSBuZXRkZXY7CisJYWRwdC0+bXNnX2VuYWJsZSA9IEVNQUNfTVNHX0RFRkFVTFQ7CisKKwlwaHkgPSAmYWRwdC0+cGh5OworCisJbXV0ZXhfaW5pdCgmYWRwdC0+cmVzZXRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkcHQtPnN0YXRzLmxvY2spOworCisJYWRwdC0+aXJxLm1hc2sgPSBSWF9QS1RfSU5UMCB8IElNUl9OT1JNQUxfTUFTSzsKKworCXJldCA9IGVtYWNfcHJvYmVfcmVzb3VyY2VzKHBkZXYsIGFkcHQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VuZG9fbmV0ZGV2OworCisJLyogaW5pdGlhbGl6ZSBjbG9ja3MgKi8KKwlyZXQgPSBlbWFjX2Nsa3NfcGhhc2UxX2luaXQocGRldiwgYWRwdCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgaW5pdGlhbGl6ZSBjbG9ja3NcbiIpOworCQlnb3RvIGVycl91bmRvX25ldGRldjsKKwl9CisKKwluZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gRU1BQ19XQVRDSERPR19USU1FOworCW5ldGRldi0+aXJxID0gYWRwdC0+aXJxLmlycTsKKworCWFkcHQtPnJyZF9zaXplID0gRU1BQ19SUkRfU0laRTsKKwlhZHB0LT50cGRfc2l6ZSA9IEVNQUNfVFBEX1NJWkU7CisJYWRwdC0+cmZkX3NpemUgPSBFTUFDX1JGRF9TSVpFOworCisJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmVtYWNfbmV0ZGV2X29wczsKKworCWVtYWNfaW5pdF9hZGFwdGVyKGFkcHQpOworCisJLyogaW5pdCBleHRlcm5hbCBwaHkgKi8KKwlyZXQgPSBlbWFjX3BoeV9jb25maWcocGRldiwgYWRwdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdW5kb19jbG9ja3M7CisKKwkvKiBpbml0IGludGVybmFsIHNnbWlpIHBoeSAqLworCXJldCA9IGVtYWNfc2dtaWlfY29uZmlnKHBkZXYsIGFkcHQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3VuZG9fbWRpb2J1czsKKworCS8qIGVuYWJsZSBjbG9ja3MgKi8KKwlyZXQgPSBlbWFjX2Nsa3NfcGhhc2UyX2luaXQocGRldiwgYWRwdCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgaW5pdGlhbGl6ZSBjbG9ja3NcbiIpOworCQlnb3RvIGVycl91bmRvX21kaW9idXM7CisJfQorCisJZW1hY19tYWNfcmVzZXQoYWRwdCk7CisKKwkvKiBzZXQgaHcgZmVhdHVyZXMgKi8KKwluZXRkZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfUlhDU1VNIHwKKwkJCU5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082IHwgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlggfAorCQkJTkVUSUZfRl9IV19WTEFOX0NUQUdfVFg7CisJbmV0ZGV2LT5od19mZWF0dXJlcyA9IG5ldGRldi0+ZmVhdHVyZXM7CisKKwluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTSB8CisJCQkJIE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082OworCisJSU5JVF9XT1JLKCZhZHB0LT53b3JrX3RocmVhZCwgZW1hY193b3JrX3RocmVhZCk7CisKKwkvKiBJbml0aWFsaXplIHF1ZXVlcyAqLworCWVtYWNfbWFjX3J4X3R4X3JpbmdfaW5pdF9hbGwocGRldiwgYWRwdCk7CisKKwluZXRpZl9uYXBpX2FkZChuZXRkZXYsICZhZHB0LT5yeF9xLm5hcGksIGVtYWNfbmFwaV9ydHgsCisJCSAgICAgICBOQVBJX1BPTExfV0VJR0hUKTsKKworCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZXRkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IHJlZ2lzdGVyIG5ldCBkZXZpY2VcbiIpOworCQlnb3RvIGVycl91bmRvX25hcGk7CisJfQorCisJcmVnID0gIHJlYWRsX3JlbGF4ZWQoYWRwdC0+YmFzZSArIEVNQUNfRE1BX01BU19DVFJMKTsKKwlkZXZpZCA9IChyZWcgJiBERVZfSURfTlVNX0JNU0spICA+PiBERVZfSURfTlVNX1NIRlQ7CisJcmV2aWQgPSAocmVnICYgREVWX1JFVl9OVU1fQk1TSykgPj4gREVWX1JFVl9OVU1fU0hGVDsKKwlyZWcgPSByZWFkbF9yZWxheGVkKGFkcHQtPmJhc2UgKyBFTUFDX0NPUkVfSFdfVkVSU0lPTik7CisKKwluZXRpZl9pbmZvKGFkcHQsIHByb2JlLCBuZXRkZXYsCisJCSAgICJoYXJkd2FyZSBpZCAlZC4lZCwgaGFyZHdhcmUgdmVyc2lvbiAlZC4lZC4lZFxuIiwKKwkJICAgZGV2aWQsIHJldmlkLAorCQkgICAocmVnICYgTUFKT1JfQk1TSykgPj4gTUFKT1JfU0hGVCwKKwkJICAgKHJlZyAmIE1JTk9SX0JNU0spID4+IE1JTk9SX1NIRlQsCisJCSAgIChyZWcgJiBTVEVQX0JNU0spICA+PiBTVEVQX1NIRlQpOworCisJcmV0dXJuIDA7CisKK2Vycl91bmRvX25hcGk6CisJbmV0aWZfbmFwaV9kZWwoJmFkcHQtPnJ4X3EubmFwaSk7CitlcnJfdW5kb19tZGlvYnVzOgorCW1kaW9idXNfdW5yZWdpc3RlcihhZHB0LT5taWlfYnVzKTsKK2Vycl91bmRvX2Nsb2NrczoKKwllbWFjX2Nsa3NfdGVhcmRvd24oYWRwdCk7CitlcnJfdW5kb19uZXRkZXY6CisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZW1hY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBlbWFjX2FkYXB0ZXIgKmFkcHQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwluZXRpZl9uYXBpX2RlbCgmYWRwdC0+cnhfcS5uYXBpKTsKKworCWVtYWNfY2xrc190ZWFyZG93bihhZHB0KTsKKworCW1kaW9idXNfdW5yZWdpc3RlcihhZHB0LT5taWlfYnVzKTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworCisJaWYgKGFkcHQtPnBoeS5kaWdpdGFsKQorCQlpb3VubWFwKGFkcHQtPnBoeS5kaWdpdGFsKTsKKwlpb3VubWFwKGFkcHQtPnBoeS5iYXNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBlbWFjX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkucHJvYmUJPSBlbWFjX3Byb2JlLAorCS5yZW1vdmUJPSBlbWFjX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAicWNvbS1lbWFjIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gZW1hY19kdF9tYXRjaCwKKwkJLmFjcGlfbWF0Y2hfdGFibGUgPSBBQ1BJX1BUUihlbWFjX2FjcGlfbWF0Y2gpLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGVtYWNfcGxhdGZvcm1fZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpxY29tLWVtYWMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vZW1hYy9lbWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3NmU2YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL2VtYWMvZW1hYy5oCkBAIC0wLDAgKzEsMzM1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9FTUFDX0hfCisjZGVmaW5lIF9FTUFDX0hfCisKKyNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlICJlbWFjLW1hYy5oIgorI2luY2x1ZGUgImVtYWMtcGh5LmgiCisKKy8qIEVNQUMgYmFzZSByZWdpc3RlciBvZmZzZXRzICovCisjZGVmaW5lIEVNQUNfRE1BX01BU19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDAwCisjZGVmaW5lIEVNQUNfSVJRX01PRF9USU1fSU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDA4CisjZGVmaW5lIEVNQUNfQkxLX0lETEVfU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDBjCisjZGVmaW5lIEVNQUNfUEhZX0xJTktfREVMQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDFjCisjZGVmaW5lIEVNQUNfU1lTX0FMSVZfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDM0CisjZGVmaW5lIEVNQUNfTUFDX0lQR0lGR19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDg0CisjZGVmaW5lIEVNQUNfTUFDX1NUQV9BRERSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDg4CisjZGVmaW5lIEVNQUNfTUFDX1NUQV9BRERSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDhjCisjZGVmaW5lIEVNQUNfSEFTSF9UQUJfUkVHMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDkwCisjZGVmaW5lIEVNQUNfSEFTSF9UQUJfUkVHMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDk0CisjZGVmaW5lIEVNQUNfTUFDX0hBTEZfRFBMWF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDk4CisjZGVmaW5lIEVNQUNfTUFYX0ZSQU1fTEVOX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNDljCisjZGVmaW5lIEVNQUNfSU5UX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNjAwCisjZGVmaW5lIEVNQUNfSU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNjA0CisjZGVmaW5lIEVNQUNfUlhNQUNfU1RBVENfUkVHMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNzAwCisjZGVmaW5lIEVNQUNfUlhNQUNfU1RBVENfUkVHMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNzU4CisjZGVmaW5lIEVNQUNfVFhNQUNfU1RBVENfUkVHMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxNzYwCisjZGVmaW5lIEVNQUNfVFhNQUNfU1RBVENfUkVHMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxN2MwCisjZGVmaW5lIEVNQUNfQ09SRV9IV19WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxOTc0CisjZGVmaW5lIEVNQUNfSURUX1RBQkxFMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxYjAwCisjZGVmaW5lIEVNQUNfUlhNQUNfU1RBVENfUkVHMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxYmM4CisjZGVmaW5lIEVNQUNfUlhNQUNfU1RBVENfUkVHMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxYmNjCisjZGVmaW5lIEVNQUNfVFhNQUNfU1RBVENfUkVHMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxYmQwCisjZGVmaW5lIEVNQUNfSU5UMV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxYmYwCisjZGVmaW5lIEVNQUNfSU5UMV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxYmY0CisjZGVmaW5lIEVNQUNfSU5UMl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxYmY4CisjZGVmaW5lIEVNQUNfSU5UMl9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxYmZjCisjZGVmaW5lIEVNQUNfSU5UM19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxYzAwCisjZGVmaW5lIEVNQUNfSU5UM19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxYzA0CisKKy8qIEVNQUNfRE1BX01BU19DVFJMICovCisjZGVmaW5lIERFVl9JRF9OVU1fQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdmMDAwMDAwCisjZGVmaW5lIERFVl9JRF9OVU1fU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIERFVl9SRVZfTlVNX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmYwMDAwCisjZGVmaW5lIERFVl9SRVZfTlVNX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIElOVF9SRF9DTFJfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwCisjZGVmaW5lIElSUV9NT0RFUkFUT1IyX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lIElSUV9NT0RFUkFUT1JfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIExQV19DTEtfU0VMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIExQV19TVEFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIExQV19NT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIFNPRlRfUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisKKy8qIEVNQUNfSVJRX01PRF9USU1fSU5JVCAqLworI2RlZmluZSBJUlFfTU9ERVJBVE9SMl9JTklUX0JNU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBJUlFfTU9ERVJBVE9SMl9JTklUX1NIRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBJUlFfTU9ERVJBVE9SX0lOSVRfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBJUlFfTU9ERVJBVE9SX0lOSVRfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKiBFTUFDX0lOVF9TVEFUVVMgKi8KKyNkZWZpbmUgRElTX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgzMSkKKyNkZWZpbmUgUFRQX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgzMCkKKyNkZWZpbmUgUkZENF9VUl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyOSkKKyNkZWZpbmUgVFhfUEtUX0lOVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyNikKKyNkZWZpbmUgVFhfUEtUX0lOVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyNSkKKyNkZWZpbmUgVFhfUEtUX0lOVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgyNCkKKyNkZWZpbmUgUlhfUEtUX0lOVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxOSkKKyNkZWZpbmUgUlhfUEtUX0lOVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxOCkKKyNkZWZpbmUgUlhfUEtUX0lOVDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxNykKKyNkZWZpbmUgUlhfUEtUX0lOVDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxNikKKyNkZWZpbmUgVFhfUEtUX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxNSkKKyNkZWZpbmUgVFhRX1RPX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxNCkKKyNkZWZpbmUgR1BIWV9XQUtFVVBfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxMykKKyNkZWZpbmUgR1BIWV9MSU5LX0RPV05fSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxMikKKyNkZWZpbmUgR1BIWV9MSU5LX1VQX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxMSkKKyNkZWZpbmUgRE1BV19UT19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgxMCkKKyNkZWZpbmUgRE1BUl9UT19JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoOSkKKyNkZWZpbmUgVFhGX1VSX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoOCkKKyNkZWZpbmUgUkZEM19VUl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgUkZEMl9VUl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoNikKKyNkZWZpbmUgUkZEMV9VUl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoNSkKKyNkZWZpbmUgUkZEMF9VUl9JTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoNCkKKyNkZWZpbmUgUlhGX09GX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMykKKyNkZWZpbmUgU1dfTUFOX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSVQoMikKKworLyogRU1BQ19NQUlMQk9YXzYgKi8KKyNkZWZpbmUgUkZEMl9QUk9DX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZjAwMDAKKyNkZWZpbmUgUkZEMl9QUk9DX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgUkZEMl9QUk9EX0lEWF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgUkZEMl9QUk9EX0lEWF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19DT1JFX0hXX1ZFUlNJT04gKi8KKyNkZWZpbmUgTUFKT1JfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZjAwMDAwMDAKKyNkZWZpbmUgTUFKT1JfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgTUlOT1JfQk1TSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZjAwMDAKKyNkZWZpbmUgTUlOT1JfU0hGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgU1RFUF9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgU1RFUF9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyogRU1BQ19FTUFDX1dSQVBQRVJfQ1NSMSAqLworI2RlZmluZSBUWF9JTkRYX0ZJRk9fU1lOQ19SU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDIzKQorI2RlZmluZSBUWF9UU19GSUZPX1NZTkNfUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDIyKQorI2RlZmluZSBSWF9UU19GSUZPMl9TWU5DX1JTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDIxKQorI2RlZmluZSBSWF9UU19GSUZPMV9TWU5DX1JTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDIwKQorI2RlZmluZSBUWF9UU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDE2KQorI2RlZmluZSBESVNfMTU4OF9DTEtTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDExKQorI2RlZmluZSBGUkVRX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCg5KQorI2RlZmluZSBFTkFCTEVfUlJEX1RJTUVTVEFNUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJJVCgzKQorCisvKiBFTUFDX0VNQUNfV1JBUFBFUl9DU1IyICovCisjZGVmaW5lIEhEUklWRV9CTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIEhEUklWRV9TSEZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFNMQl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDkpCisjZGVmaW5lIFBMQl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDgpCisjZGVmaW5lIFdPTF9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMpCisjZGVmaW5lIFBIWV9SRVNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDApCisKKyNkZWZpbmUgRU1BQ19ERVZfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAKKworLyogU0dNSUkgdjIgcGVyIGxhbmUgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNHTUlJX0xOX1JTTV9TVEFSVCAgICAgICAgICAgICAweDAyOUMKKworLyogU0dNSUkgdjIgUEhZIGNvbW1vbiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0dNSUlfUEhZX0NNTl9DVFJMICAgICAgICAgICAgMHgwNDA4CisjZGVmaW5lIFNHTUlJX1BIWV9DTU5fUkVTRVRfQ1RSTCAgICAgIDB4MDQxMAorCisvKiBTR01JSSB2MiBQSFkgcmVnaXN0ZXJzIHBlciBsYW5lICovCisjZGVmaW5lIFNHTUlJX1BIWV9MTl9PRkZTRVQgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIFNHTUlJX1BIWV9MTl9MQU5FX1NUQVRVUyAgICAgMHgwMERDCisjZGVmaW5lIFNHTUlJX1BIWV9MTl9CSVNUX0dFTjAgICAgICAgMHgwMDhDCisjZGVmaW5lIFNHTUlJX1BIWV9MTl9CSVNUX0dFTjEgICAgICAgMHgwMDkwCisjZGVmaW5lIFNHTUlJX1BIWV9MTl9CSVNUX0dFTjIgICAgICAgMHgwMDk0CisjZGVmaW5lIFNHTUlJX1BIWV9MTl9CSVNUX0dFTjMgICAgICAgMHgwMDk4CisjZGVmaW5lIFNHTUlJX1BIWV9MTl9DRFJfQ1RSTDEgICAgICAgMHgwMDVDCisKK2VudW0gZW1hY19jbGtfaWQgeworCUVNQUNfQ0xLX0FYSSwKKwlFTUFDX0NMS19DRkdfQUhCLAorCUVNQUNfQ0xLX0hJR0hfU1BFRUQsCisJRU1BQ19DTEtfTURJTywKKwlFTUFDX0NMS19UWCwKKwlFTUFDX0NMS19SWCwKKwlFTUFDX0NMS19TWVMsCisJRU1BQ19DTEtfQ05UCit9OworCisjZGVmaW5lIEVNQUNfTElOS19TUEVFRF9VTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIEVNQUNfTElOS19TUEVFRF8xMF9IQUxGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDApCisjZGVmaW5lIEVNQUNfTElOS19TUEVFRF8xMF9GVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDEpCisjZGVmaW5lIEVNQUNfTElOS19TUEVFRF8xMDBfSEFMRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDIpCisjZGVmaW5lIEVNQUNfTElOS19TUEVFRF8xMDBfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDMpCisjZGVmaW5lIEVNQUNfTElOS19TUEVFRF8xR0JfRlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDUpCisKKyNkZWZpbmUgRU1BQ19NQVhfU0VUVVBfTE5LX0NZQ0xFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAKKworLyogV2FrZSBPbiBMYW4gKi8KKyNkZWZpbmUgRU1BQ19XT0xfUEhZICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAvKiBQSFkgU3RhdHVzIENoYW5nZSAqLworI2RlZmluZSBFTUFDX1dPTF9NQUdJQyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyIC8qIE1hZ2ljIFBhY2tldCAqLworCitzdHJ1Y3QgZW1hY19zdGF0cyB7CisJLyogcnggKi8KKwl1NjQgcnhfb2s7ICAgICAgICAgICAgICAvKiBnb29kIHBhY2tldHMgKi8KKwl1NjQgcnhfYmNhc3Q7ICAgICAgICAgICAvKiBnb29kIGJyb2FkY2FzdCBwYWNrZXRzICovCisJdTY0IHJ4X21jYXN0OyAgICAgICAgICAgLyogZ29vZCBtdWx0aWNhc3QgcGFja2V0cyAqLworCXU2NCByeF9wYXVzZTsgICAgICAgICAgIC8qIHBhdXNlIHBhY2tldCAqLworCXU2NCByeF9jdHJsOyAgICAgICAgICAgIC8qIGNvbnRyb2wgcGFja2V0cyBvdGhlciB0aGFuIHBhdXNlIGZyYW1lLiAqLworCXU2NCByeF9mY3NfZXJyOyAgICAgICAgIC8qIHBhY2tldHMgd2l0aCBiYWQgRkNTLiAqLworCXU2NCByeF9sZW5fZXJyOyAgICAgICAgIC8qIHBhY2tldHMgd2l0aCBsZW5ndGggbWlzbWF0Y2ggKi8KKwl1NjQgcnhfYnl0ZV9jbnQ7ICAgICAgICAvKiBnb29kIGJ5dGVzIGNvdW50ICh3aXRob3V0IEZDUykgKi8KKwl1NjQgcnhfcnVudDsgICAgICAgICAgICAvKiBydW50IHBhY2tldHMgKi8KKwl1NjQgcnhfZnJhZzsgICAgICAgICAgICAvKiBmcmFnbWVudCBjb3VudCAqLworCXU2NCByeF9zel82NDsJICAgICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDY0IGJ5dGVzICovCisJdTY0IHJ4X3N6XzY1XzEyNzsgICAgICAgLyogcGFja2V0cyB0aGF0IGFyZSA2NS0xMjcgYnl0ZXMgKi8KKwl1NjQgcnhfc3pfMTI4XzI1NTsgICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDEyOC0yNTUgYnl0ZXMgKi8KKwl1NjQgcnhfc3pfMjU2XzUxMTsgICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDI1Ni01MTEgYnl0ZXMgKi8KKwl1NjQgcnhfc3pfNTEyXzEwMjM7ICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDUxMi0xMDIzIGJ5dGVzICovCisJdTY0IHJ4X3N6XzEwMjRfMTUxODsgICAgLyogcGFja2V0cyB0aGF0IGFyZSAxMDI0LTE1MTggYnl0ZXMgKi8KKwl1NjQgcnhfc3pfMTUxOV9tYXg7ICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlIDE1MTktTVRVIGJ5dGVzKi8KKwl1NjQgcnhfc3pfb3Y7ICAgICAgICAgICAvKiBwYWNrZXRzIHRoYXQgYXJlID5NVFUgYnl0ZXMgKHRydW5jYXRlZCkgKi8KKwl1NjQgcnhfcnhmX292OyAgICAgICAgICAvKiBwYWNrZXRzIGRyb3BwZWQgZHVlIHRvIFJYIEZJRk8gb3ZlcmZsb3cgKi8KKwl1NjQgcnhfYWxpZ25fZXJyOyAgICAgICAvKiBhbGlnbm1lbnQgZXJyb3JzICovCisJdTY0IHJ4X2JjYXN0X2J5dGVfY250OyAgLyogYnJvYWRjYXN0IHBhY2tldHMgYnl0ZSBjb3VudCAod2l0aG91dCBGQ1MpICovCisJdTY0IHJ4X21jYXN0X2J5dGVfY250OyAgLyogbXVsdGljYXN0IHBhY2tldHMgYnl0ZSBjb3VudCAod2l0aG91dCBGQ1MpICovCisJdTY0IHJ4X2Vycl9hZGRyOyAgICAgICAgLyogcGFja2V0cyBkcm9wcGVkIGR1ZSB0byBhZGRyZXNzIGZpbHRlcmluZyAqLworCXU2NCByeF9jcmNfYWxpZ247ICAgICAgIC8qIENSQyBhbGlnbiBlcnJvcnMgKi8KKwl1NjQgcnhfamFiYmVyczsgICAgICAgICAvKiBqYWJiZXJzICovCisKKwkvKiB0eCAqLworCXU2NCB0eF9vazsgICAgICAgICAgICAgIC8qIGdvb2QgcGFja2V0cyAqLworCXU2NCB0eF9iY2FzdDsgICAgICAgICAgIC8qIGdvb2QgYnJvYWRjYXN0IHBhY2tldHMgKi8KKwl1NjQgdHhfbWNhc3Q7ICAgICAgICAgICAvKiBnb29kIG11bHRpY2FzdCBwYWNrZXRzICovCisJdTY0IHR4X3BhdXNlOyAgICAgICAgICAgLyogcGF1c2UgcGFja2V0cyAqLworCXU2NCB0eF9leGNfZGVmZXI7ICAgICAgIC8qIHBhY2tldHMgd2l0aCBleGNlc3NpdmUgZGVmZXJyYWwgKi8KKwl1NjQgdHhfY3RybDsgICAgICAgICAgICAvKiBjb250cm9sIHBhY2tldHMgb3RoZXIgdGhhbiBwYXVzZSBmcmFtZSAqLworCXU2NCB0eF9kZWZlcjsgICAgICAgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgZGVmZXJyZWQuICovCisJdTY0IHR4X2J5dGVfY250OyAgICAgICAgLyogZ29vZCBieXRlcyBjb3VudCAod2l0aG91dCBGQ1MpICovCisJdTY0IHR4X3N6XzY0OyAgICAgICAgICAgLyogcGFja2V0cyB0aGF0IGFyZSA2NCBieXRlcyAqLworCXU2NCB0eF9zel82NV8xMjc7ICAgICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgNjUtMTI3IGJ5dGVzICovCisJdTY0IHR4X3N6XzEyOF8yNTU7ICAgICAgLyogcGFja2V0cyB0aGF0IGFyZSAxMjgtMjU1IGJ5dGVzICovCisJdTY0IHR4X3N6XzI1Nl81MTE7ICAgICAgLyogcGFja2V0cyB0aGF0IGFyZSAyNTYtNTExIGJ5dGVzICovCisJdTY0IHR4X3N6XzUxMl8xMDIzOyAgICAgLyogcGFja2V0cyB0aGF0IGFyZSA1MTItMTAyMyBieXRlcyAqLworCXU2NCB0eF9zel8xMDI0XzE1MTg7ICAgIC8qIHBhY2tldHMgdGhhdCBhcmUgMTAyNC0xNTE4IGJ5dGVzICovCisJdTY0IHR4X3N6XzE1MTlfbWF4OyAgICAgLyogcGFja2V0cyB0aGF0IGFyZSAxNTE5LU1UVSBieXRlcyAqLworCXU2NCB0eF8xX2NvbDsgICAgICAgICAgIC8qIHBhY2tldHMgc2luZ2xlIHByaW9yIGNvbGxpc2lvbiAqLworCXU2NCB0eF8yX2NvbDsgICAgICAgICAgIC8qIHBhY2tldHMgd2l0aCBtdWx0aXBsZSBwcmlvciBjb2xsaXNpb25zICovCisJdTY0IHR4X2xhdGVfY29sOyAgICAgICAgLyogcGFja2V0cyB3aXRoIGxhdGUgY29sbGlzaW9ucyAqLworCXU2NCB0eF9hYm9ydF9jb2w7ICAgICAgIC8qIHBhY2tldHMgYWJvcnRlZCBkdWUgdG8gZXhjZXNzIGNvbGxpc2lvbnMgKi8KKwl1NjQgdHhfdW5kZXJydW47ICAgICAgICAvKiBwYWNrZXRzIGFib3J0ZWQgZHVlIHRvIEZJRk8gdW5kZXJydW4gKi8KKwl1NjQgdHhfcmRfZW9wOyAgICAgICAgICAvKiBjb3VudCBvZiByZWFkcyBiZXlvbmQgRU9QICovCisJdTY0IHR4X2xlbl9lcnI7ICAgICAgICAgLyogcGFja2V0cyB3aXRoIGxlbmd0aCBtaXNtYXRjaCAqLworCXU2NCB0eF90cnVuYzsgICAgICAgICAgIC8qIHBhY2tldHMgdHJ1bmNhdGVkIGR1ZSB0byBzaXplID5NVFUgKi8KKwl1NjQgdHhfYmNhc3RfYnl0ZTsgICAgICAvKiBicm9hZGNhc3QgcGFja2V0cyBieXRlIGNvdW50ICh3aXRob3V0IEZDUykgKi8KKwl1NjQgdHhfbWNhc3RfYnl0ZTsgICAgICAvKiBtdWx0aWNhc3QgcGFja2V0cyBieXRlIGNvdW50ICh3aXRob3V0IEZDUykgKi8KKwl1NjQgdHhfY29sOyAgICAgICAgICAgICAvKiBjb2xsaXNpb25zICovCisKKwlzcGlubG9ja190IGxvY2s7CS8qIHByZXZlbnQgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIHJlYWRlcnMgKi8KK307CisKKy8qIFJTUyBoc3R5cGUgRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRU1BQ19SU1NfSFNUWVBfSVBWNF9FTgkJCQkgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFTUFDX1JTU19IU1RZUF9UQ1A0X0VOCQkJCSAgICAweDAwMDAwMDAyCisjZGVmaW5lIEVNQUNfUlNTX0hTVFlQX0lQVjZfRU4JCQkJICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRU1BQ19SU1NfSFNUWVBfVENQNl9FTgkJCQkgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFTUFDX1JTU19IU1RZUF9BTExfRU4gKFwKKwkJRU1BQ19SU1NfSFNUWVBfSVBWNF9FTiAgIHxcCisJCUVNQUNfUlNTX0hTVFlQX1RDUDRfRU4gICB8XAorCQlFTUFDX1JTU19IU1RZUF9JUFY2X0VOICAgfFwKKwkJRU1BQ19SU1NfSFNUWVBfVENQNl9FTikKKworI2RlZmluZSBFTUFDX1ZMQU5fVE9fVEFHKF92bGFuLCBfdGFnKSBcCisJCShfdGFnID0gICgoKChfdmxhbikgPj4gOCkgJiAweEZGKSB8ICgoKF92bGFuKSAmIDB4RkYpIDw8IDgpKSkKKworI2RlZmluZSBFTUFDX1RBR19UT19WTEFOKF90YWcsIF92bGFuKSBcCisJCShfdmxhbiA9ICgoKChfdGFnKSA+PiA4KSAmIDB4RkYpIHwgKCgoX3RhZykgJiAweEZGKSA8PCA4KSkpCisKKyNkZWZpbmUgRU1BQ19ERUZfUlhfQlVGX1NJWkUJCQkJCSAgMTUzNgorI2RlZmluZSBFTUFDX01BWF9KVU1CT19QS1RfU0laRQkJCQkgICAgKDkgKiAxMDI0KQorI2RlZmluZSBFTUFDX01BWF9UWF9PRkZMT0FEX1RIUkVTSAkJCSAgICAoOSAqIDEwMjQpCisKKyNkZWZpbmUgRU1BQ19NQVhfRVRIX0ZSQU1FX1NJWkUJCSAgICAgICBFTUFDX01BWF9KVU1CT19QS1RfU0laRQorI2RlZmluZSBFTUFDX01JTl9FVEhfRlJBTUVfU0laRQkJCQkJICAgIDY4CisKKyNkZWZpbmUgRU1BQ19ERUZfVFhfUVVFVUVTCQkJCQkgICAgIDEKKyNkZWZpbmUgRU1BQ19ERUZfUlhfUVVFVUVTCQkJCQkgICAgIDEKKworI2RlZmluZSBFTUFDX01JTl9UWF9ERVNDUwkJCQkJICAgMTI4CisjZGVmaW5lIEVNQUNfTUlOX1JYX0RFU0NTCQkJCQkgICAxMjgKKworI2RlZmluZSBFTUFDX01BWF9UWF9ERVNDUwkJCQkJIDE2MzgzCisjZGVmaW5lIEVNQUNfTUFYX1JYX0RFU0NTCQkJCQkgIDIwNDcKKworI2RlZmluZSBFTUFDX0RFRl9UWF9ERVNDUwkJCQkJICAgNTEyCisjZGVmaW5lIEVNQUNfREVGX1JYX0RFU0NTCQkJCQkgICAyNTYKKworI2RlZmluZSBFTUFDX0RFRl9SWF9JUlFfTU9ECQkJCQkgICAyNTAKKyNkZWZpbmUgRU1BQ19ERUZfVFhfSVJRX01PRAkJCQkJICAgMjUwCisKKyNkZWZpbmUgRU1BQ19XQVRDSERPR19USU1FCQkJCSAgICAgICg1ICogSFopCisKKy8qIGJ5IGRlZmF1bHQgY2hlY2sgbGluayBldmVyeSA0IHNlY29uZHMgKi8KKyNkZWZpbmUgRU1BQ19UUllfTElOS19USU1FT1VUCQkJCSAgICAgICg0ICogSFopCisKKy8qIGVtYWNfaXJxIHBlci1kZXZpY2UgKHBlci1hZGFwdGVyKSBpcnEgcHJvcGVydGllcy4KKyAqIEBpcnE6CWlycSBudW1iZXIuCisgKiBAbWFzawltYXNrIHRvIHVzZSBvdmVyIHN0YXR1cyByZWdpc3Rlci4KKyAqLworc3RydWN0IGVtYWNfaXJxIHsKKwl1bnNpZ25lZCBpbnQJaXJxOworCXUzMgkJbWFzazsKK307CisKKy8qIFRoZSBkZXZpY2UncyBtYWluIGRhdGEgc3RydWN0dXJlICovCitzdHJ1Y3QgZW1hY19hZGFwdGVyIHsKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKm5ldGRldjsKKwlzdHJ1Y3QgbWlpX2J1cwkJCSptaWlfYnVzOworCXN0cnVjdCBwaHlfZGV2aWNlCQkqcGh5ZGV2OworCisJdm9pZCBfX2lvbWVtCQkJKmJhc2U7CisJdm9pZCBfX2lvbWVtCQkJKmNzcjsKKworCXN0cnVjdCBlbWFjX3BoeQkJCXBoeTsKKwlzdHJ1Y3QgZW1hY19zdGF0cwkJc3RhdHM7CisKKwlzdHJ1Y3QgZW1hY19pcnEJCQlpcnE7CisJc3RydWN0IGNsawkJCSpjbGtbRU1BQ19DTEtfQ05UXTsKKworCS8qIEFsbCBEZXNjcmlwdG9yIG1lbW9yeSAqLworCXN0cnVjdCBlbWFjX3JpbmdfaGVhZGVyCQlyaW5nX2hlYWRlcjsKKwlzdHJ1Y3QgZW1hY190eF9xdWV1ZQkJdHhfcTsKKwlzdHJ1Y3QgZW1hY19yeF9xdWV1ZQkJcnhfcTsKKwl1bnNpZ25lZCBpbnQJCQl0eF9kZXNjX2NudDsKKwl1bnNpZ25lZCBpbnQJCQlyeF9kZXNjX2NudDsKKwl1bnNpZ25lZCBpbnQJCQlycmRfc2l6ZTsgLyogaW4gcXVhZCB3b3JkcyAqLworCXVuc2lnbmVkIGludAkJCXJmZF9zaXplOyAvKiBpbiBxdWFkIHdvcmRzICovCisJdW5zaWduZWQgaW50CQkJdHBkX3NpemU7IC8qIGluIHF1YWQgd29yZHMgKi8KKworCXVuc2lnbmVkIGludAkJCXJ4YnVmX3NpemU7CisKKwkvKiBSaW5nIHBhcmFtZXRlciAqLworCXU4CQkJCXRwZF9idXJzdDsKKwl1OAkJCQlyZmRfYnVyc3Q7CisJdW5zaWduZWQgaW50CQkJZG1hd19kbHlfY250OworCXVuc2lnbmVkIGludAkJCWRtYXJfZGx5X2NudDsKKwllbnVtIGVtYWNfZG1hX3JlcV9ibG9jawkJZG1hcl9ibG9jazsKKwllbnVtIGVtYWNfZG1hX3JlcV9ibG9jawkJZG1hd19ibG9jazsKKwllbnVtIGVtYWNfZG1hX29yZGVyCQlkbWFfb3JkZXI7CisKKwl1MzIJCQkJaXJxX21vZDsKKwl1MzIJCQkJcHJlYW1ibGU7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcmtfdGhyZWFkOworCisJdTE2CQkJCW1zZ19lbmFibGU7CisKKwlzdHJ1Y3QgbXV0ZXgJCQlyZXNldF9sb2NrOworfTsKKworaW50IGVtYWNfcmVpbml0X2xvY2tlZChzdHJ1Y3QgZW1hY19hZGFwdGVyICphZHB0KTsKK3ZvaWQgZW1hY19yZWdfdXBkYXRlMzIodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgbWFzaywgdTMyIHZhbCk7CitpcnFyZXR1cm5fdCBlbWFjX2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKTsKKworI2VuZGlmIC8qIF9FTUFDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZGMvcjYwNDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JkYy9yNjA0MC5jCmluZGV4IGNiMjllZTIuLjVlZjVkNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JkYy9yNjA0MC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JkYy9yNjA0MC5jCkBAIC0xMDYyLDE0ICsxMDYyLDEyIEBACiAJLyogdGhpcyBzaG91bGQgYWx3YXlzIGJlIHN1cHBvcnRlZCAqLwogCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJaWYgKGVycikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMiCi0JCQkJIm5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNhcmRcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIzMi1iaXQgUENJIERNQSBhZGRyZXNzZXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY2FyZFxuIik7CiAJCWdvdG8gZXJyX291dF9kaXNhYmxlX2RldjsKIAl9CiAJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwogCWlmIChlcnIpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiMzItYml0IFBDSSBETUEgYWRkcmVzc2VzIgotCQkJCSJub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYXJkXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiMzItYml0IFBDSSBETUEgYWRkcmVzc2VzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNhcmRcbiIpOwogCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9kZXY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrLzgxMzljcC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay84MTM5Y3AuYwppbmRleCBkZWFlMTBkLi41Mjk3YmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrLzgxMzljcC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvODEzOWNwLmMKQEAgLTQ2Nyw4ICs0NjcsOCBAQAogCXVuc2lnbmVkIGludCByeF90YWlsID0gY3AtPnJ4X3RhaWw7CiAJaW50IHJ4OwogCi1yeF9zdGF0dXNfbG9vcDoKIAlyeCA9IDA7CityeF9zdGF0dXNfbG9vcDoKIAljcHcxNihJbnRyU3RhdHVzLCBjcF9yeF9pbnRyX21hc2spOwogCiAJd2hpbGUgKHJ4IDwgYnVkZ2V0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL0tjb25maWcKaW5kZXggNGYxMzJjZi4uODVlYzQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvS2NvbmZpZwpAQCAtMjcsNyArMjcsNyBAQAogCSAgUmVuZXNhcyBTdXBlckggRXRoZXJuZXQgZGV2aWNlIGRyaXZlci4KIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRpbmcgQ1BVcyBhcmU6CiAJCS0gU0g3NjE5LCBTSDc3MTAsIFNINzcxMiwgU0g3NzI0LCBTSDc3MzQsIFNINzc2MywgU0g3NzU3LAotCQkgIFI4QTc3NDAsIFI4QTc3N3ggYW5kIFI4QTc3OXguCisJCSAgUjhBNzc0MCwgUjhBNzc0eCwgUjhBNzc3eCBhbmQgUjhBNzc5eC4KIAogY29uZmlnIFJBVkIKIAl0cmlzdGF0ZSAiUmVuZXNhcyBFdGhlcm5ldCBBVkIgc3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvcmF2Yi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9yYXZiLmgKaW5kZXggNGU1ZDVlOS4uZjExMDk2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9yYXZiLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9yYXZiLmgKQEAgLTEwMTEsNyArMTAxMSw2IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJLyogTUlJIHRyYW5zY2VpdmVyIHNlY3Rpb24uICovCiAJc3RydWN0IG1paV9idXMgKm1paV9idXM7CS8qIE1ESU8gYnVzIGNvbnRyb2wgKi8KLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwkvKiBQSFkgZGV2aWNlIGNvbnRyb2wgKi8KIAlpbnQgbGluazsKIAlwaHlfaW50ZXJmYWNlX3QgcGh5X2ludGVyZmFjZTsKIAlpbnQgbXNnX2VuYWJsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvcmF2Yl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3JhdmJfbWFpbi5jCmluZGV4IDFlMWNjMGYuLjYzMDUzNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvcmF2Yl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9yYXZiX21haW4uYwpAQCAtOTQyLDcgKzk0Miw3IEBACiBzdGF0aWMgdm9pZCByYXZiX2FkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCByYXZiX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gcHJpdi0+cGh5ZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBuZGV2LT5waHlkZXY7CiAJYm9vbCBuZXdfc3RhdGUgPSBmYWxzZTsKIAogCWlmIChwaHlkZXYtPmxpbmspIHsKQEAgLTEwMzIsNDggKzEwMzIsNDcgQEAKIAogCXBoeV9hdHRhY2hlZF9pbmZvKHBoeWRldik7CiAKLQlwcml2LT5waHlkZXYgPSBwaHlkZXY7Ci0KIAlyZXR1cm4gMDsKIH0KIAogLyogUEhZIGNvbnRyb2wgc3RhcnQgZnVuY3Rpb24gKi8KIHN0YXRpYyBpbnQgcmF2Yl9waHlfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IHJhdmJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCWludCBlcnJvcjsKIAogCWVycm9yID0gcmF2Yl9waHlfaW5pdChuZGV2KTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAotCXBoeV9zdGFydChwcml2LT5waHlkZXYpOworCXBoeV9zdGFydChuZGV2LT5waHlkZXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmF2Yl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3N0YXRpYyBpbnQgcmF2Yl9nZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgcmF2Yl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJaW50IGVycm9yID0gLUVOT0RFVjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKHByaXYtPnBoeWRldikgeworCWlmIChuZGV2LT5waHlkZXYpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJZXJyb3IgPSBwaHlfZXRodG9vbF9nc2V0KHByaXYtPnBoeWRldiwgZWNtZCk7CisJCWVycm9yID0gcGh5X2V0aHRvb2xfa3NldHRpbmdzX2dldChuZGV2LT5waHlkZXYsIGNtZCk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAl9CiAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgcmF2Yl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3N0YXRpYyBpbnQgcmF2Yl9zZXRfbGlua19rc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3QgcmF2Yl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyb3I7CiAKLQlpZiAoIXByaXYtPnBoeWRldikKKwlpZiAoIW5kZXYtPnBoeWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMTA4MSwxMSArMTA4MCwxMSBAQAogCS8qIERpc2FibGUgVFggYW5kIFJYICovCiAJcmF2Yl9yY3Zfc25kX2Rpc2FibGUobmRldik7CiAKLQllcnJvciA9IHBoeV9ldGh0b29sX3NzZXQocHJpdi0+cGh5ZGV2LCBlY21kKTsKKwllcnJvciA9IHBoeV9ldGh0b29sX2tzZXR0aW5nc19zZXQobmRldi0+cGh5ZGV2LCBjbWQpOwogCWlmIChlcnJvcikKIAkJZ290byBlcnJvcl9leGl0OwogCi0JaWYgKGVjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwlpZiAoY21kLT5iYXNlLmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKIAkJcHJpdi0+ZHVwbGV4ID0gMTsKIAllbHNlCiAJCXByaXYtPmR1cGxleCA9IDA7CkBAIC0xMTEwLDkgKzExMDksOSBAQAogCWludCBlcnJvciA9IC1FTk9ERVY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmIChwcml2LT5waHlkZXYpIHsKKwlpZiAobmRldi0+cGh5ZGV2KSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCWVycm9yID0gcGh5X3N0YXJ0X2FuZWcocHJpdi0+cGh5ZGV2KTsKKwkJZXJyb3IgPSBwaHlfc3RhcnRfYW5lZyhuZGV2LT5waHlkZXYpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJfQogCkBAIC0xMzA5LDggKzEzMDgsNiBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHJhdmJfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncwkJPSByYXZiX2dldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzCQk9IHJhdmJfc2V0X3NldHRpbmdzLAogCS5ud2F5X3Jlc2V0CQk9IHJhdmJfbndheV9yZXNldCwKIAkuZ2V0X21zZ2xldmVsCQk9IHJhdmJfZ2V0X21zZ2xldmVsLAogCS5zZXRfbXNnbGV2ZWwJCT0gcmF2Yl9zZXRfbXNnbGV2ZWwsCkBAIC0xMzIxLDYgKzEzMTgsOCBAQAogCS5nZXRfcmluZ3BhcmFtCQk9IHJhdmJfZ2V0X3JpbmdwYXJhbSwKIAkuc2V0X3JpbmdwYXJhbQkJPSByYXZiX3NldF9yaW5ncGFyYW0sCiAJLmdldF90c19pbmZvCQk9IHJhdmJfZ2V0X3RzX2luZm8sCisJLmdldF9saW5rX2tzZXR0aW5ncwk9IHJhdmJfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MJPSByYXZiX3NldF9saW5rX2tzZXR0aW5ncywKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJhdmJfaG9va19pcnEodW5zaWduZWQgaW50IGlycSwgaXJxX2hhbmRsZXJfdCBoYW5kbGVyLApAQCAtMTY2MSwxMCArMTY2MCw5IEBACiAJfQogCiAJLyogUEhZIGRpc2Nvbm5lY3QgKi8KLQlpZiAocHJpdi0+cGh5ZGV2KSB7Ci0JCXBoeV9zdG9wKHByaXYtPnBoeWRldik7Ci0JCXBoeV9kaXNjb25uZWN0KHByaXYtPnBoeWRldik7Ci0JCXByaXYtPnBoeWRldiA9IE5VTEw7CisJaWYgKG5kZXYtPnBoeWRldikgeworCQlwaHlfc3RvcChuZGV2LT5waHlkZXYpOworCQlwaHlfZGlzY29ubmVjdChuZGV2LT5waHlkZXYpOwogCX0KIAogCWlmIChwcml2LT5jaGlwX2lkICE9IFJDQVJfR0VOMikgewpAQCAtMTc1Myw4ICsxNzUxLDcgQEAKIC8qIGlvY3RsIHRvIGRldmljZSBmdW5jdGlvbiAqLwogc3RhdGljIGludCByYXZiX2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKnJlcSwgaW50IGNtZCkKIHsKLQlzdHJ1Y3QgcmF2Yl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHByaXYtPnBoeWRldjsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbmRldi0+cGh5ZGV2OwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKG5kZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE4NzYsNiArMTg3MywyMCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCByYXZiX3NldF9jb25maWdfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgcmF2Yl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlpZiAocHJpdi0+Y2hpcF9pZCA9PSBSQ0FSX0dFTjIpIHsKKwkJcmF2Yl9tb2RpZnkobmRldiwgQ0NDLCBDQ0NfT1BDLCBDQ0NfT1BDX0NPTkZJRyk7CisJCS8qIFNldCBDU0VMIHZhbHVlICovCisJCXJhdmJfbW9kaWZ5KG5kZXYsIENDQywgQ0NDX0NTRUwsIENDQ19DU0VMX0hQQik7CisJfSBlbHNlIHsKKwkJcmF2Yl9tb2RpZnkobmRldiwgQ0NDLCBDQ0NfT1BDLCBDQ0NfT1BDX0NPTkZJRyB8CisJCQkgICAgQ0NDX0dBQyB8IENDQ19DU0VMX0hQQik7CisJfQorfQorCiBzdGF0aWMgaW50IHJhdmJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CkBAIC0xOTc4LDE0ICsxOTg5LDcgQEAKIAluZGV2LT5ldGh0b29sX29wcyA9ICZyYXZiX2V0aHRvb2xfb3BzOwogCiAJLyogU2V0IEFWQiBjb25maWcgbW9kZSAqLwotCWlmIChjaGlwX2lkID09IFJDQVJfR0VOMikgewotCQlyYXZiX21vZGlmeShuZGV2LCBDQ0MsIENDQ19PUEMsIENDQ19PUENfQ09ORklHKTsKLQkJLyogU2V0IENTRUwgdmFsdWUgKi8KLQkJcmF2Yl9tb2RpZnkobmRldiwgQ0NDLCBDQ0NfQ1NFTCwgQ0NDX0NTRUxfSFBCKTsKLQl9IGVsc2UgewotCQlyYXZiX21vZGlmeShuZGV2LCBDQ0MsIENDQ19PUEMsIENDQ19PUENfQ09ORklHIHwKLQkJCSAgICBDQ0NfR0FDIHwgQ0NDX0NTRUxfSFBCKTsKLQl9CisJcmF2Yl9zZXRfY29uZmlnX21vZGUobmRldik7CiAKIAkvKiBTZXQgR1RJIHZhbHVlICovCiAJZXJyb3IgPSByYXZiX3NldF9ndGkobmRldik7CkBAIC0yMDk2LDggKzIxMDAsNTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCByYXZiX3J1bnRpbWVfbm9wKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcmF2Yl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSAwOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChuZGV2KTsKKwkJcmV0ID0gcmF2Yl9jbG9zZShuZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHJhdmJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCByYXZiX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIEFsbCByZWdpc3RlciBoYXZlIGJlZW4gcmVzZXQgdG8gZGVmYXVsdCB2YWx1ZXMuCisJICogUmVzdG9yZSBhbGwgcmVnaXN0ZXJzIHdoaWNoIHdoZXJlIHNldHVwIGF0IHByb2JlIHRpbWUgYW5kCisJICogcmVvcGVuIGRldmljZSBpZiBpdCB3YXMgcnVubmluZyBiZWZvcmUgc3lzdGVtIHN1c3BlbmRlZC4KKwkgKi8KKworCS8qIFNldCBBVkIgY29uZmlnIG1vZGUgKi8KKwlyYXZiX3NldF9jb25maWdfbW9kZShuZGV2KTsKKworCS8qIFNldCBHVEkgdmFsdWUgKi8KKwlyZXQgPSByYXZiX3NldF9ndGkobmRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFJlcXVlc3QgR1RJIGxvYWRpbmcgKi8KKwlyYXZiX21vZGlmeShuZGV2LCBHQ0NSLCBHQ0NSX0xUSSwgR0NDUl9MVEkpOworCisJLyogUmVzdG9yZSBkZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyB0YWJsZSAqLworCXJhdmJfd3JpdGUobmRldiwgcHJpdi0+ZGVzY19iYXRfZG1hLCBEQkFUKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKSB7CisJCXJldCA9IHJhdmJfb3BlbihuZGV2KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5kZXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcmF2Yl9ydW50aW1lX25vcChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJLyogUnVudGltZSBQTSBjYWxsYmFjayBzaGFyZWQgYmV0d2VlbiAtPnJ1bnRpbWVfc3VzcGVuZCgpCiAJICogYW5kIC0+cnVudGltZV9yZXN1bWUoKS4gU2ltcGx5IHJldHVybnMgc3VjY2Vzcy4KQEAgLTIxMTAsMjAgKzIxNjEsMTYgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHJhdmJfZGV2X3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhyYXZiX3N1c3BlbmQsIHJhdmJfcmVzdW1lKQogCVNFVF9SVU5USU1FX1BNX09QUyhyYXZiX3J1bnRpbWVfbm9wLCByYXZiX3J1bnRpbWVfbm9wLCBOVUxMKQogfTsKIAotI2RlZmluZSBSQVZCX1BNX09QUyAoJnJhdmJfZGV2X3BtX29wcykKLSNlbHNlCi0jZGVmaW5lIFJBVkJfUE1fT1BTIE5VTEwKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByYXZiX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gcmF2Yl9wcm9iZSwKIAkucmVtb3ZlCQk9IHJhdmJfcmVtb3ZlLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gInJhdmIiLAotCQkucG0JPSBSQVZCX1BNX09QUywKKwkJLnBtCT0gJnJhdmJfZGV2X3BtX29wcywKIAkJLm9mX21hdGNoX3RhYmxlID0gcmF2Yl9tYXRjaF90YWJsZSwKIAl9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5jCmluZGV4IDc5OWQ1OGQuLjA1YjBkYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguYwpAQCAtMjAxLDkgKzIwMSwxNCBAQAogCiAJW0FSU1RSXQkJPSAweDAwMDAsCiAJW1RTVV9DVFJTVF0JPSAweDAwMDQsCisJW1RTVV9GV1NMQ10JPSAweDAwMzgsCiAJW1RTVV9WVEFHMF0JPSAweDAwNTgsCiAJW1RTVV9BRFNCU1ldCT0gMHgwMDYwLAogCVtUU1VfVEVOXQk9IDB4MDA2NCwKKwlbVFNVX1BPU1QxXQk9IDB4MDA3MCwKKwlbVFNVX1BPU1QyXQk9IDB4MDA3NCwKKwlbVFNVX1BPU1QzXQk9IDB4MDA3OCwKKwlbVFNVX1BPU1Q0XQk9IDB4MDA3YywKIAlbVFNVX0FEUkgwXQk9IDB4MDEwMCwKIAogCVtUWE5MQ1IwXQk9IDB4MDA4MCwKQEAgLTE3MjMsNyArMTcyOCw3IEBACiBzdGF0aWMgdm9pZCBzaF9ldGhfYWRqdXN0X2xpbmsoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IHNoX2V0aF9wcml2YXRlICptZHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gbWRwLT5waHlkZXY7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG5kZXYtPnBoeWRldjsKIAlpbnQgbmV3X3N0YXRlID0gMDsKIAogCWlmIChwaHlkZXYtPmxpbmspIHsKQEAgLTE4MDAsNTEgKzE4MDUsNDggQEAKIAogCXBoeV9hdHRhY2hlZF9pbmZvKHBoeWRldik7CiAKLQltZHAtPnBoeWRldiA9IHBoeWRldjsKLQogCXJldHVybiAwOwogfQogCiAvKiBQSFkgY29udHJvbCBzdGFydCBmdW5jdGlvbiAqLwogc3RhdGljIGludCBzaF9ldGhfcGh5X3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewotCXN0cnVjdCBzaF9ldGhfcHJpdmF0ZSAqbWRwID0gbmV0ZGV2X3ByaXYobmRldik7CiAJaW50IHJldDsKIAogCXJldCA9IHNoX2V0aF9waHlfaW5pdChuZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcGh5X3N0YXJ0KG1kcC0+cGh5ZGV2KTsKKwlwaHlfc3RhcnQobmRldi0+cGh5ZGV2KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNoX2V0aF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkgICAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQorc3RhdGljIGludCBzaF9ldGhfZ2V0X2xpbmtfa3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJCSAgICAgc3RydWN0IGV0aHRvb2xfbGlua19rc2V0dGluZ3MgKmNtZCkKIHsKIAlzdHJ1Y3Qgc2hfZXRoX3ByaXZhdGUgKm1kcCA9IG5ldGRldl9wcml2KG5kZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCWlmICghbWRwLT5waHlkZXYpCisJaWYgKCFuZGV2LT5waHlkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1kcC0+bG9jaywgZmxhZ3MpOwotCXJldCA9IHBoeV9ldGh0b29sX2dzZXQobWRwLT5waHlkZXYsIGVjbWQpOworCXJldCA9IHBoeV9ldGh0b29sX2tzZXR0aW5nc19nZXQobmRldi0+cGh5ZGV2LCBjbWQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kcC0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzaF9ldGhfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3N0YXRpYyBpbnQgc2hfZXRoX3NldF9saW5rX2tzZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBldGh0b29sX2xpbmtfa3NldHRpbmdzICpjbWQpCiB7CiAJc3RydWN0IHNoX2V0aF9wcml2YXRlICptZHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQ7CiAKLQlpZiAoIW1kcC0+cGh5ZGV2KQorCWlmICghbmRldi0+cGh5ZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZtZHAtPmxvY2ssIGZsYWdzKTsKQEAgLTE4NTIsMTEgKzE4NTQsMTEgQEAKIAkvKiBkaXNhYmxlIHR4IGFuZCByeCAqLwogCXNoX2V0aF9yY3Zfc25kX2Rpc2FibGUobmRldik7CiAKLQlyZXQgPSBwaHlfZXRodG9vbF9zc2V0KG1kcC0+cGh5ZGV2LCBlY21kKTsKKwlyZXQgPSBwaHlfZXRodG9vbF9rc2V0dGluZ3Nfc2V0KG5kZXYtPnBoeWRldiwgY21kKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2V4aXQ7CiAKLQlpZiAoZWNtZC0+ZHVwbGV4ID09IERVUExFWF9GVUxMKQorCWlmIChjbWQtPmJhc2UuZHVwbGV4ID09IERVUExFWF9GVUxMKQogCQltZHAtPmR1cGxleCA9IDE7CiAJZWxzZQogCQltZHAtPmR1cGxleCA9IDA7CkBAIC0yMDY3LDExICsyMDY5LDExIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCi0JaWYgKCFtZHAtPnBoeWRldikKKwlpZiAoIW5kZXYtPnBoeWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbWRwLT5sb2NrLCBmbGFncyk7Ci0JcmV0ID0gcGh5X3N0YXJ0X2FuZWcobWRwLT5waHlkZXYpOworCXJldCA9IHBoeV9zdGFydF9hbmVnKG5kZXYtPnBoeWRldik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRwLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjE5OCw4ICsyMjAwLDYgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBzaF9ldGhfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9zZXR0aW5ncwk9IHNoX2V0aF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncwk9IHNoX2V0aF9zZXRfc2V0dGluZ3MsCiAJLmdldF9yZWdzX2xlbgk9IHNoX2V0aF9nZXRfcmVnc19sZW4sCiAJLmdldF9yZWdzCT0gc2hfZXRoX2dldF9yZWdzLAogCS5ud2F5X3Jlc2V0CT0gc2hfZXRoX253YXlfcmVzZXQsCkBAIC0yMjExLDYgKzIyMTEsOCBAQAogCS5nZXRfc3NldF9jb3VudCAgICAgPSBzaF9ldGhfZ2V0X3NzZXRfY291bnQsCiAJLmdldF9yaW5ncGFyYW0JPSBzaF9ldGhfZ2V0X3JpbmdwYXJhbSwKIAkuc2V0X3JpbmdwYXJhbQk9IHNoX2V0aF9zZXRfcmluZ3BhcmFtLAorCS5nZXRfbGlua19rc2V0dGluZ3MgPSBzaF9ldGhfZ2V0X2xpbmtfa3NldHRpbmdzLAorCS5zZXRfbGlua19rc2V0dGluZ3MgPSBzaF9ldGhfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogLyogbmV0d29yayBkZXZpY2Ugb3BlbiBmdW5jdGlvbiAqLwpAQCAtMjQwOCwxMCArMjQxMCw5IEBACiAJc2hfZXRoX2Rldl9leGl0KG5kZXYpOwogCiAJLyogUEhZIERpc2Nvbm5lY3QgKi8KLQlpZiAobWRwLT5waHlkZXYpIHsKLQkJcGh5X3N0b3AobWRwLT5waHlkZXYpOwotCQlwaHlfZGlzY29ubmVjdChtZHAtPnBoeWRldik7Ci0JCW1kcC0+cGh5ZGV2ID0gTlVMTDsKKwlpZiAobmRldi0+cGh5ZGV2KSB7CisJCXBoeV9zdG9wKG5kZXYtPnBoeWRldik7CisJCXBoeV9kaXNjb25uZWN0KG5kZXYtPnBoeWRldik7CiAJfQogCiAJZnJlZV9pcnEobmRldi0+aXJxLCBuZGV2KTsKQEAgLTI0MjksOCArMjQzMCw3IEBACiAvKiBpb2N0bCB0byBkZXZpY2UgZnVuY3Rpb24gKi8KIHN0YXRpYyBpbnQgc2hfZXRoX2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQogewotCXN0cnVjdCBzaF9ldGhfcHJpdmF0ZSAqbWRwID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IG1kcC0+cGh5ZGV2OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBuZGV2LT5waHlkZXY7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcobmRldikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjc4Niw2ICsyNzg2LDggQEAKIHsKIAlpZiAoc2hfZXRoX2lzX3J6X2Zhc3RfZXRoZXIobWRwKSkgewogCQlzaF9ldGhfdHN1X3dyaXRlKG1kcCwgMCwgVFNVX1RFTik7IC8qIERpc2FibGUgYWxsIENBTSBlbnRyeSAqLworCQlzaF9ldGhfdHN1X3dyaXRlKG1kcCwgVFNVX0ZXU0xDX1BPU1RFTlUgfCBUU1VfRldTTENfUE9TVEVOTCwKKwkJCQkgVFNVX0ZXU0xDKTsJLyogRW5hYmxlIFBPU1QgcmVnaXN0ZXJzICovCiAJCXJldHVybjsKIAl9CiAKQEAgLTI5NTcsNiArMjk1OSw4IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNoX2V0aF9tYXRjaF90YWJsZVtdID0gewogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxnZXRoZXItcjhhNzc0MCIsIC5kYXRhID0gJnI4YTc3NDBfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxldGhlci1yOGE3NzQzIiwgLmRhdGEgPSAmcjhhNzc5eF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLGV0aGVyLXI4YTc3NDUiLCAuZGF0YSA9ICZyOGE3Nzl4X2RhdGEgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsZXRoZXItcjhhNzc3OCIsIC5kYXRhID0gJnI4YTc3N3hfZGF0YSB9LAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxldGhlci1yOGE3Nzc5IiwgLmRhdGEgPSAmcjhhNzc3eF9kYXRhIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLGV0aGVyLXI4YTc3OTAiLCAuZGF0YSA9ICZyOGE3Nzl4X2RhdGEgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5oCmluZGV4IGM2MjM4MGUuLmQwNTBmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguaApAQCAtNTE4LDcgKzUxOCw2IEBACiAJLyogTUlJIHRyYW5zY2VpdmVyIHNlY3Rpb24uICovCiAJdTMyIHBoeV9pZDsJCQkvKiBQSFkgSUQgKi8KIAlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsJLyogTURJTyBidXMgY29udHJvbCAqLwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CS8qIFBIWSBkZXZpY2UgY29udHJvbCAqLwogCWludCBsaW5rOwogCXBoeV9pbnRlcmZhY2VfdCBwaHlfaW50ZXJmYWNlOwogCWludCBtc2dfZW5hYmxlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlci5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlci5oCmluZGV4IDFhYjk5NWYuLjJlYjliNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXIuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgogI2luY2x1ZGUgPG5ldC9zd2l0Y2hkZXYuaD4KIApAQCAtNTIsNiArNTMsOSBAQAogCXN0cnVjdCByb2NrZXJfZG1hX3JpbmdfaW5mbyByeF9yaW5nOwogfTsKIAorc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydF9kZXZfbG93ZXJfZmluZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgICAgc3RydWN0IHJvY2tlciAqcm9ja2VyKTsKKwogc3RydWN0IHJvY2tlcl93b3JsZF9vcHM7CiAKIHN0cnVjdCByb2NrZXIgewpAQCAtNjYsNiArNzAsNyBAQAogCXNwaW5sb2NrX3QgY21kX3JpbmdfbG9jazsJCS8qIGZvciBjbWQgcmluZyBhY2Nlc3NlcyAqLwogCXN0cnVjdCByb2NrZXJfZG1hX3JpbmdfaW5mbyBjbWRfcmluZzsKIAlzdHJ1Y3Qgcm9ja2VyX2RtYV9yaW5nX2luZm8gZXZlbnRfcmluZzsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZmliX25iOwogCXN0cnVjdCByb2NrZXJfd29ybGRfb3BzICp3b3BzOwogCXZvaWQgKndwcml2OwogfTsKQEAgLTExNywxMSArMTIyLDYgQEAKIAlpbnQgKCpwb3J0X29ial92bGFuX2R1bXApKGNvbnN0IHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCiAJCQkJICBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW4gKnZsYW4sCiAJCQkJICBzd2l0Y2hkZXZfb2JqX2R1bXBfY2JfdCAqY2IpOwotCWludCAoKnBvcnRfb2JqX2ZpYjRfYWRkKShzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAotCQkJCSBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiAqZmliNCwKLQkJCQkgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpOwotCWludCAoKnBvcnRfb2JqX2ZpYjRfZGVsKShzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAotCQkJCSBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiAqZmliNCk7CiAJaW50ICgqcG9ydF9vYmpfZmRiX2FkZCkoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKIAkJCQljb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAogCQkJCXN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKTsKQEAgLTE0MSw2ICsxNDEsMTEgQEAKIAlpbnQgKCpwb3J0X2V2X21hY192bGFuX3NlZW4pKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCiAJCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLAogCQkJCSAgICAgX19iZTE2IHZsYW5faWQpOworCWludCAoKmZpYjRfYWRkKShzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsCisJCQljb25zdCBzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvKTsKKwlpbnQgKCpmaWI0X2RlbCkoc3RydWN0IHJvY2tlciAqcm9ja2VyLAorCQkJY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbyk7CisJdm9pZCAoKmZpYjRfYWJvcnQpKHN0cnVjdCByb2NrZXIgKnJvY2tlcik7CiB9OwogCiBleHRlcm4gc3RydWN0IHJvY2tlcl93b3JsZF9vcHMgcm9ja2VyX29mZHBhX29wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXJfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlcl9tYWluLmMKaW5kZXggZjBiMDliMC4uNTQyNGZiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlcl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlcl9tYWluLmMKQEAgLTE2MjUsMjkgKzE2MjUsNiBAQAogfQogCiBzdGF0aWMgaW50Ci1yb2NrZXJfd29ybGRfcG9ydF9vYmpfZmliNF9hZGQoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiAqZmliNCwKLQkJCSAgICAgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucykKLXsKLQlzdHJ1Y3Qgcm9ja2VyX3dvcmxkX29wcyAqd29wcyA9IHJvY2tlcl9wb3J0LT5yb2NrZXItPndvcHM7Ci0KLQlpZiAoIXdvcHMtPnBvcnRfb2JqX2ZpYjRfYWRkKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JcmV0dXJuIHdvcHMtPnBvcnRfb2JqX2ZpYjRfYWRkKHJvY2tlcl9wb3J0LCBmaWI0LCB0cmFucyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXJvY2tlcl93b3JsZF9wb3J0X29ial9maWI0X2RlbChzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliICpmaWI0KQotewotCXN0cnVjdCByb2NrZXJfd29ybGRfb3BzICp3b3BzID0gcm9ja2VyX3BvcnQtPnJvY2tlci0+d29wczsKLQotCWlmICghd29wcy0+cG9ydF9vYmpfZmliNF9kZWwpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQlyZXR1cm4gd29wcy0+cG9ydF9vYmpfZmliNF9kZWwocm9ja2VyX3BvcnQsIGZpYjQpOwotfQotCi1zdGF0aWMgaW50CiByb2NrZXJfd29ybGRfcG9ydF9vYmpfZmRiX2FkZChzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAogCQkJICAgICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgKmZkYiwKIAkJCSAgICAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQpAQCAtMTczMyw2ICsxNzEwLDM0IEBACiAJcmV0dXJuIHdvcHMtPnBvcnRfZXZfbWFjX3ZsYW5fc2Vlbihyb2NrZXJfcG9ydCwgYWRkciwgdmxhbl9pZCk7CiB9CiAKK3N0YXRpYyBpbnQgcm9ja2VyX3dvcmxkX2ZpYjRfYWRkKHN0cnVjdCByb2NrZXIgKnJvY2tlciwKKwkJCQkgY29uc3Qgc3RydWN0IGZpYl9lbnRyeV9ub3RpZmllcl9pbmZvICpmZW5faW5mbykKK3sKKwlzdHJ1Y3Qgcm9ja2VyX3dvcmxkX29wcyAqd29wcyA9IHJvY2tlci0+d29wczsKKworCWlmICghd29wcy0+ZmliNF9hZGQpCisJCXJldHVybiAwOworCXJldHVybiB3b3BzLT5maWI0X2FkZChyb2NrZXIsIGZlbl9pbmZvKTsKK30KKworc3RhdGljIGludCByb2NrZXJfd29ybGRfZmliNF9kZWwoc3RydWN0IHJvY2tlciAqcm9ja2VyLAorCQkJCSBjb25zdCBzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvKQoreworCXN0cnVjdCByb2NrZXJfd29ybGRfb3BzICp3b3BzID0gcm9ja2VyLT53b3BzOworCisJaWYgKCF3b3BzLT5maWI0X2RlbCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHdvcHMtPmZpYjRfZGVsKHJvY2tlciwgZmVuX2luZm8pOworfQorCitzdGF0aWMgdm9pZCByb2NrZXJfd29ybGRfZmliNF9hYm9ydChzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIpCit7CisJc3RydWN0IHJvY2tlcl93b3JsZF9vcHMgKndvcHMgPSByb2NrZXItPndvcHM7CisKKwlpZiAod29wcy0+ZmliNF9hYm9ydCkKKwkJd29wcy0+ZmliNF9hYm9ydChyb2NrZXIpOworfQorCiAvKioqKioqKioqKioqKioqKioKICAqIE5ldCBkZXZpY2Ugb3BzCiAgKioqKioqKioqKioqKioqKiovCkBAIC0yMDk2LDExICsyMTAxLDYgQEAKIAkJCQkJCSAgICAgU1dJVENIREVWX09CSl9QT1JUX1ZMQU4ob2JqKSwKIAkJCQkJCSAgICAgdHJhbnMpOwogCQlicmVhazsKLQljYXNlIFNXSVRDSERFVl9PQkpfSURfSVBWNF9GSUI6Ci0JCWVyciA9IHJvY2tlcl93b3JsZF9wb3J0X29ial9maWI0X2FkZChyb2NrZXJfcG9ydCwKLQkJCQkJCSAgICAgU1dJVENIREVWX09CSl9JUFY0X0ZJQihvYmopLAotCQkJCQkJICAgICB0cmFucyk7Ci0JCWJyZWFrOwogCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX0ZEQjoKIAkJZXJyID0gcm9ja2VyX3dvcmxkX3BvcnRfb2JqX2ZkYl9hZGQocm9ja2VyX3BvcnQsCiAJCQkJCQkgICAgU1dJVENIREVWX09CSl9QT1JUX0ZEQihvYmopLApAQCAtMjEyNSwxMCArMjEyNSw2IEBACiAJCWVyciA9IHJvY2tlcl93b3JsZF9wb3J0X29ial92bGFuX2RlbChyb2NrZXJfcG9ydCwKIAkJCQkJCSAgICAgU1dJVENIREVWX09CSl9QT1JUX1ZMQU4ob2JqKSk7CiAJCWJyZWFrOwotCWNhc2UgU1dJVENIREVWX09CSl9JRF9JUFY0X0ZJQjoKLQkJZXJyID0gcm9ja2VyX3dvcmxkX3BvcnRfb2JqX2ZpYjRfZGVsKHJvY2tlcl9wb3J0LAotCQkJCQkJICAgICBTV0lUQ0hERVZfT0JKX0lQVjRfRklCKG9iaikpOwotCQlicmVhazsKIAljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9GREI6CiAJCWVyciA9IHJvY2tlcl93b3JsZF9wb3J0X29ial9mZGJfZGVsKHJvY2tlcl9wb3J0LAogCQkJCQkJICAgIFNXSVRDSERFVl9PQkpfUE9SVF9GREIob2JqKSk7CkBAIC0yMTc1LDYgKzIxNzEsMzEgQEAKIAkuc3dpdGNoZGV2X3BvcnRfb2JqX2R1bXAJPSByb2NrZXJfcG9ydF9vYmpfZHVtcCwKIH07CiAKK3N0YXRpYyBpbnQgcm9ja2VyX3JvdXRlcl9maWJfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IHJvY2tlciAqcm9ja2VyID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3Qgcm9ja2VyLCBmaWJfbmIpOworCXN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyAqZmVuX2luZm8gPSBwdHI7CisJaW50IGVycjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEZJQl9FVkVOVF9FTlRSWV9BREQ6CisJCWVyciA9IHJvY2tlcl93b3JsZF9maWI0X2FkZChyb2NrZXIsIGZlbl9pbmZvKTsKKwkJaWYgKGVycikKKwkJCXJvY2tlcl93b3JsZF9maWI0X2Fib3J0KHJvY2tlcik7CisJCWVsc2UKKwkJYnJlYWs7CisJY2FzZSBGSUJfRVZFTlRfRU5UUllfREVMOgorCQlyb2NrZXJfd29ybGRfZmliNF9kZWwocm9ja2VyLCBmZW5faW5mbyk7CisJCWJyZWFrOworCWNhc2UgRklCX0VWRU5UX1JVTEVfQUREOiAvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEZJQl9FVkVOVF9SVUxFX0RFTDoKKwkJcm9ja2VyX3dvcmxkX2ZpYjRfYWJvcnQocm9ja2VyKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqCiAgKiBldGh0b29sIGludGVyZmFjZQogICoqKioqKioqKioqKioqKioqKioqLwpAQCAtMjQxMiw3ICsyNDMzLDcgQEAKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCByb2NrZXJfcG9ydC0+ZGV2KTsKIAogCWlmIChyeF9mbGFncyAmIFJPQ0tFUl9SWF9GTEFHU19GV0RfT0ZGTE9BRCkKLQkJc2tiLT5vZmZsb2FkX2Z3ZF9tYXJrID0gcm9ja2VyX3BvcnQtPmRldi0+b2ZmbG9hZF9md2RfbWFyazsKKwkJc2tiLT5vZmZsb2FkX2Z3ZF9tYXJrID0gMTsKIAogCXJvY2tlcl9wb3J0LT5kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAlyb2NrZXJfcG9ydC0+ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKQEAgLTI3NDAsNiArMjc2MSw5IEBACiAJCWdvdG8gZXJyX3Byb2JlX3BvcnRzOwogCX0KIAorCXJvY2tlci0+ZmliX25iLm5vdGlmaWVyX2NhbGwgPSByb2NrZXJfcm91dGVyX2ZpYl9ldmVudDsKKwlyZWdpc3Rlcl9maWJfbm90aWZpZXIoJnJvY2tlci0+ZmliX25iKTsKKwogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJSb2NrZXIgc3dpdGNoIHdpdGggaWQgJSpwaE5cbiIsCiAJCSAoaW50KXNpemVvZihyb2NrZXItPmh3LmlkKSwgJnJvY2tlci0+aHcuaWQpOwogCkBAIC0yNzcxLDYgKzI3OTUsNyBAQAogewogCXN0cnVjdCByb2NrZXIgKnJvY2tlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAorCXVucmVnaXN0ZXJfZmliX25vdGlmaWVyKCZyb2NrZXItPmZpYl9uYik7CiAJcm9ja2VyX3dyaXRlMzIocm9ja2VyLCBDT05UUk9MLCBST0NLRVJfQ09OVFJPTF9SRVNFVCk7CiAJcm9ja2VyX3JlbW92ZV9wb3J0cyhyb2NrZXIpOwogCWZyZWVfaXJxKHJvY2tlcl9tc2l4X3ZlY3Rvcihyb2NrZXIsIFJPQ0tFUl9NU0lYX1ZFQ19FVkVOVCksIHJvY2tlcik7CkBAIC0yNzk5LDYgKzI4MjQsMzcgQEAKIAlyZXR1cm4gZGV2LT5uZXRkZXZfb3BzID09ICZyb2NrZXJfcG9ydF9uZXRkZXZfb3BzOwogfQogCitzdGF0aWMgYm9vbCByb2NrZXJfcG9ydF9kZXZfY2hlY2tfdW5kZXIoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IHJvY2tlciAqcm9ja2VyKQoreworCXN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQ7CisKKwlpZiAoIXJvY2tlcl9wb3J0X2Rldl9jaGVjayhkZXYpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyb2NrZXJfcG9ydCA9IG5ldGRldl9wcml2KGRldik7CisJaWYgKHJvY2tlcl9wb3J0LT5yb2NrZXIgIT0gcm9ja2VyKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydF9kZXZfbG93ZXJfZmluZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgICAgc3RydWN0IHJvY2tlciAqcm9ja2VyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpsb3dlcl9kZXY7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKKworCWlmIChyb2NrZXJfcG9ydF9kZXZfY2hlY2tfdW5kZXIoZGV2LCByb2NrZXIpKQorCQlyZXR1cm4gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5ldGRldl9mb3JfZWFjaF9hbGxfbG93ZXJfZGV2KGRldiwgbG93ZXJfZGV2LCBpdGVyKSB7CisJCWlmIChyb2NrZXJfcG9ydF9kZXZfY2hlY2tfdW5kZXIobG93ZXJfZGV2LCByb2NrZXIpKQorCQkJcmV0dXJuIG5ldGRldl9wcml2KGxvd2VyX2Rldik7CisJfQorCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgaW50IHJvY2tlcl9uZXRkZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQsCiAJCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyX29mZHBhLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyX29mZHBhLmMKaW5kZXggMWNhNzk2My4uNDMxYTYwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlcl9vZmRwYS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXJfb2ZkcGEuYwpAQCAtOTksNiArOTksNyBAQAogCXN0cnVjdCBvZmRwYV9mbG93X3RibF9rZXkga2V5OwogCXNpemVfdCBrZXlfbGVuOwogCXUzMiBrZXlfY3JjMzI7IC8qIGtleSAqLworCXN0cnVjdCBmaWJfaW5mbyAqZmk7CiB9OwogCiBzdHJ1Y3Qgb2ZkcGFfZ3JvdXBfdGJsX2VudHJ5IHsKQEAgLTE4OSw2ICsxOTAsNyBAQAogCXNwaW5sb2NrX3QgbmVpZ2hfdGJsX2xvY2s7CQkvKiBmb3IgbmVpZ2ggdGJsIGFjY2Vzc2VzICovCiAJdTMyIG5laWdoX3RibF9uZXh0X2luZGV4OwogCXVuc2lnbmVkIGxvbmcgYWdlaW5nX3RpbWU7CisJYm9vbCBmaWJfYWJvcnRlZDsKIH07CiAKIHN0cnVjdCBvZmRwYV9wb3J0IHsKQEAgLTEwNDMsNyArMTA0NSw4IEBACiAJCQkJCSBfX2JlMTYgZXRoX3R5cGUsIF9fYmUzMiBkc3QsCiAJCQkJCSBfX2JlMzIgZHN0X21hc2ssIHUzMiBwcmlvcml0eSwKIAkJCQkJIGVudW0gcm9ja2VyX29mX2RwYV90YWJsZV9pZCBnb3RvX3RibCwKLQkJCQkJIHUzMiBncm91cF9pZCwgaW50IGZsYWdzKQorCQkJCQkgdTMyIGdyb3VwX2lkLCBzdHJ1Y3QgZmliX2luZm8gKmZpLAorCQkJCQkgaW50IGZsYWdzKQogewogCXN0cnVjdCBvZmRwYV9mbG93X3RibF9lbnRyeSAqZW50cnk7CiAKQEAgLTEwNjAsNiArMTA2Myw3IEBACiAJZW50cnktPmtleS51Y2FzdF9yb3V0aW5nLmdyb3VwX2lkID0gZ3JvdXBfaWQ7CiAJZW50cnktPmtleV9sZW4gPSBvZmZzZXRvZihzdHJ1Y3Qgb2ZkcGFfZmxvd190Ymxfa2V5LAogCQkJCSAgdWNhc3Rfcm91dGluZy5ncm91cF9pZCk7CisJZW50cnktPmZpID0gZmk7CiAKIAlyZXR1cm4gb2ZkcGFfZmxvd190YmxfZG8ob2ZkcGFfcG9ydCwgdHJhbnMsIGZsYWdzLCBlbnRyeSk7CiB9CkBAIC0xNDI1LDcgKzE0MjksNyBAQAogCQkJCQkJICAgIGV0aF90eXBlLCBpcF9hZGRyLAogCQkJCQkJICAgIGluZXRfbWFrZV9tYXNrKDMyKSwKIAkJCQkJCSAgICBwcmlvcml0eSwgZ290b190YmwsCi0JCQkJCQkgICAgZ3JvdXBfaWQsIGZsYWdzKTsKKwkJCQkJCSAgICBncm91cF9pZCwgTlVMTCwgZmxhZ3MpOwogCiAJCWlmIChlcnIpCiAJCQluZXRkZXZfZXJyKG9mZHBhX3BvcnQtPmRldiwgIkVycm9yICglZCkgLzMyIHVuaWNhc3Qgcm91dGUgJXBJNCBncm91cCAweCUwOHhcbiIsCkBAIC0yMzkwLDcgKzIzOTQsNyBAQAogCiBzdGF0aWMgaW50IG9mZHBhX3BvcnRfZmliX2lwdjQoc3RydWN0IG9mZHBhX3BvcnQgKm9mZHBhX3BvcnQsCiAJCQkgICAgICAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMsIF9fYmUzMiBkc3QsCi0JCQkgICAgICAgaW50IGRzdF9sZW4sIGNvbnN0IHN0cnVjdCBmaWJfaW5mbyAqZmksCisJCQkgICAgICAgaW50IGRzdF9sZW4sIHN0cnVjdCBmaWJfaW5mbyAqZmksCiAJCQkgICAgICAgdTMyIHRiX2lkLCBpbnQgZmxhZ3MpCiB7CiAJY29uc3Qgc3RydWN0IGZpYl9uaCAqbmg7CkBAIC0yNDI2LDcgKzI0MzAsNyBAQAogCiAJZXJyID0gb2ZkcGFfZmxvd190YmxfdWNhc3Q0X3JvdXRpbmcob2ZkcGFfcG9ydCwgdHJhbnMsIGV0aF90eXBlLCBkc3QsCiAJCQkJCSAgICBkc3RfbWFzaywgcHJpb3JpdHksIGdvdG9fdGJsLAotCQkJCQkgICAgZ3JvdXBfaWQsIGZsYWdzKTsKKwkJCQkJICAgIGdyb3VwX2lkLCBmaSwgZmxhZ3MpOwogCWlmIChlcnIpCiAJCW5ldGRldl9lcnIob2ZkcGFfcG9ydC0+ZGV2LCAiRXJyb3IgKCVkKSBJUHY0IHJvdXRlICVwSTRcbiIsCiAJCQkgICBlcnIsICZkc3QpOwpAQCAtMjU1OCw3ICsyNTYyLDYgQEAKIAlzdHJ1Y3Qgb2ZkcGFfcG9ydCAqb2ZkcGFfcG9ydCA9IHJvY2tlcl9wb3J0LT53cHJpdjsKIAlpbnQgZXJyOwogCi0Jc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfc2V0KG9mZHBhX3BvcnQtPmRldiwgTlVMTCwgZmFsc2UpOwogCXJvY2tlcl9wb3J0X3NldF9sZWFybmluZyhyb2NrZXJfcG9ydCwKIAkJCQkgISEob2ZkcGFfcG9ydC0+YnJwb3J0X2ZsYWdzICYgQlJfTEVBUk5JTkcpKTsKIApAQCAtMjcxOSwyOCArMjcyMiw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBvZmRwYV9wb3J0X29ial9maWI0X2FkZChzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX2lwdjRfZmliICpmaWI0LAotCQkJCSAgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQotewotCXN0cnVjdCBvZmRwYV9wb3J0ICpvZmRwYV9wb3J0ID0gcm9ja2VyX3BvcnQtPndwcml2OwotCi0JcmV0dXJuIG9mZHBhX3BvcnRfZmliX2lwdjQob2ZkcGFfcG9ydCwgdHJhbnMsCi0JCQkJICAgaHRvbmwoZmliNC0+ZHN0KSwgZmliNC0+ZHN0X2xlbiwKLQkJCQkgICBmaWI0LT5maSwgZmliNC0+dGJfaWQsIDApOwotfQotCi1zdGF0aWMgaW50IG9mZHBhX3BvcnRfb2JqX2ZpYjRfZGVsKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCi0JCQkJICAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgKmZpYjQpCi17Ci0Jc3RydWN0IG9mZHBhX3BvcnQgKm9mZHBhX3BvcnQgPSByb2NrZXJfcG9ydC0+d3ByaXY7Ci0KLQlyZXR1cm4gb2ZkcGFfcG9ydF9maWJfaXB2NChvZmRwYV9wb3J0LCBOVUxMLAotCQkJCSAgIGh0b25sKGZpYjQtPmRzdCksIGZpYjQtPmRzdF9sZW4sCi0JCQkJICAgZmliNC0+ZmksIGZpYjQtPnRiX2lkLAotCQkJCSAgIE9GRFBBX09QX0ZMQUdfUkVNT1ZFKTsKLX0KLQogc3RhdGljIGludCBvZmRwYV9wb3J0X29ial9mZGJfYWRkKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCiAJCQkJICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAogCQkJCSAgc3RydWN0IHN3aXRjaGRldl90cmFucyAqdHJhbnMpCkBAIC0yODE3LDcgKzI3OTgsNiBAQAogCQlvZmRwYV9wb3J0X2ludGVybmFsX3ZsYW5faWRfZ2V0KG9mZHBhX3BvcnQsIGJyaWRnZS0+aWZpbmRleCk7CiAKIAlvZmRwYV9wb3J0LT5icmlkZ2VfZGV2ID0gYnJpZGdlOwotCXN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX3NldChvZmRwYV9wb3J0LT5kZXYsIGJyaWRnZSwgdHJ1ZSk7CiAKIAlyZXR1cm4gb2ZkcGFfcG9ydF92bGFuX2FkZChvZmRwYV9wb3J0LCBOVUxMLCBPRkRQQV9VTlRBR0dFRF9WSUQsIDApOwogfQpAQCAtMjgzNiw4ICsyODE2LDYgQEAKIAkJb2ZkcGFfcG9ydF9pbnRlcm5hbF92bGFuX2lkX2dldChvZmRwYV9wb3J0LAogCQkJCQkJb2ZkcGFfcG9ydC0+ZGV2LT5pZmluZGV4KTsKIAotCXN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX3NldChvZmRwYV9wb3J0LT5kZXYsIG9mZHBhX3BvcnQtPmJyaWRnZV9kZXYsCi0JCQkJICAgIGZhbHNlKTsKIAlvZmRwYV9wb3J0LT5icmlkZ2VfZGV2ID0gTlVMTDsKIAogCWVyciA9IG9mZHBhX3BvcnRfdmxhbl9hZGQob2ZkcGFfcG9ydCwgTlVMTCwgT0ZEUEFfVU5UQUdHRURfVklELCAwKTsKQEAgLTI5MjYsNiArMjkwNCw4MiBAQAogCXJldHVybiBvZmRwYV9wb3J0X2ZkYihvZmRwYV9wb3J0LCBOVUxMLCBhZGRyLCB2bGFuX2lkLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgb2ZkcGFfcG9ydCAqb2ZkcGFfcG9ydF9kZXZfbG93ZXJfZmluZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICAgIHN0cnVjdCByb2NrZXIgKnJvY2tlcikKK3sKKwlzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0OworCisJcm9ja2VyX3BvcnQgPSByb2NrZXJfcG9ydF9kZXZfbG93ZXJfZmluZChkZXYsIHJvY2tlcik7CisJcmV0dXJuIHJvY2tlcl9wb3J0ID8gcm9ja2VyX3BvcnQtPndwcml2IDogTlVMTDsKK30KKworc3RhdGljIGludCBvZmRwYV9maWI0X2FkZChzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsCisJCQkgIGNvbnN0IHN0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyAqZmVuX2luZm8pCit7CisJc3RydWN0IG9mZHBhICpvZmRwYSA9IHJvY2tlci0+d3ByaXY7CisJc3RydWN0IG9mZHBhX3BvcnQgKm9mZHBhX3BvcnQ7CisJaW50IGVycjsKKworCWlmIChvZmRwYS0+ZmliX2Fib3J0ZWQpCisJCXJldHVybiAwOworCW9mZHBhX3BvcnQgPSBvZmRwYV9wb3J0X2Rldl9sb3dlcl9maW5kKGZlbl9pbmZvLT5maS0+ZmliX2Rldiwgcm9ja2VyKTsKKwlpZiAoIW9mZHBhX3BvcnQpCisJCXJldHVybiAwOworCWVyciA9IG9mZHBhX3BvcnRfZmliX2lwdjQob2ZkcGFfcG9ydCwgTlVMTCwgaHRvbmwoZmVuX2luZm8tPmRzdCksCisJCQkJICBmZW5faW5mby0+ZHN0X2xlbiwgZmVuX2luZm8tPmZpLAorCQkJCSAgZmVuX2luZm8tPnRiX2lkLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWZpYl9pbmZvX29mZmxvYWRfaW5jKGZlbl9pbmZvLT5maSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2ZkcGFfZmliNF9kZWwoc3RydWN0IHJvY2tlciAqcm9ja2VyLAorCQkJICBjb25zdCBzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gKmZlbl9pbmZvKQoreworCXN0cnVjdCBvZmRwYSAqb2ZkcGEgPSByb2NrZXItPndwcml2OworCXN0cnVjdCBvZmRwYV9wb3J0ICpvZmRwYV9wb3J0OworCisJaWYgKG9mZHBhLT5maWJfYWJvcnRlZCkKKwkJcmV0dXJuIDA7CisJb2ZkcGFfcG9ydCA9IG9mZHBhX3BvcnRfZGV2X2xvd2VyX2ZpbmQoZmVuX2luZm8tPmZpLT5maWJfZGV2LCByb2NrZXIpOworCWlmICghb2ZkcGFfcG9ydCkKKwkJcmV0dXJuIDA7CisJZmliX2luZm9fb2ZmbG9hZF9kZWMoZmVuX2luZm8tPmZpKTsKKwlyZXR1cm4gb2ZkcGFfcG9ydF9maWJfaXB2NChvZmRwYV9wb3J0LCBOVUxMLCBodG9ubChmZW5faW5mby0+ZHN0KSwKKwkJCQkgICBmZW5faW5mby0+ZHN0X2xlbiwgZmVuX2luZm8tPmZpLAorCQkJCSAgIGZlbl9pbmZvLT50Yl9pZCwgT0ZEUEFfT1BfRkxBR19SRU1PVkUpOworfQorCitzdGF0aWMgdm9pZCBvZmRwYV9maWI0X2Fib3J0KHN0cnVjdCByb2NrZXIgKnJvY2tlcikKK3sKKwlzdHJ1Y3Qgb2ZkcGEgKm9mZHBhID0gcm9ja2VyLT53cHJpdjsKKwlzdHJ1Y3Qgb2ZkcGFfcG9ydCAqb2ZkcGFfcG9ydDsKKwlzdHJ1Y3Qgb2ZkcGFfZmxvd190YmxfZW50cnkgKmZsb3dfZW50cnk7CisJc3RydWN0IGhsaXN0X25vZGUgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBia3Q7CisKKwlpZiAob2ZkcGEtPmZpYl9hYm9ydGVkKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2ZkcGEtPmZsb3dfdGJsX2xvY2ssIGZsYWdzKTsKKwloYXNoX2Zvcl9lYWNoX3NhZmUob2ZkcGEtPmZsb3dfdGJsLCBia3QsIHRtcCwgZmxvd19lbnRyeSwgZW50cnkpIHsKKwkJaWYgKGZsb3dfZW50cnktPmtleS50YmxfaWQgIT0KKwkJICAgIFJPQ0tFUl9PRl9EUEFfVEFCTEVfSURfVU5JQ0FTVF9ST1VUSU5HKQorCQkJY29udGludWU7CisJCW9mZHBhX3BvcnQgPSBvZmRwYV9wb3J0X2Rldl9sb3dlcl9maW5kKGZsb3dfZW50cnktPmZpLT5maWJfZGV2LAorCQkJCQkJICAgICAgIHJvY2tlcik7CisJCWlmICghb2ZkcGFfcG9ydCkKKwkJCWNvbnRpbnVlOworCQlmaWJfaW5mb19vZmZsb2FkX2RlYyhmbG93X2VudHJ5LT5maSk7CisJCW9mZHBhX2Zsb3dfdGJsX2RlbChvZmRwYV9wb3J0LCBOVUxMLCBPRkRQQV9PUF9GTEFHX1JFTU9WRSwKKwkJCQkgICBmbG93X2VudHJ5KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2ZkcGEtPmZsb3dfdGJsX2xvY2ssIGZsYWdzKTsKKwlvZmRwYS0+ZmliX2Fib3J0ZWQgPSB0cnVlOworfQorCiBzdHJ1Y3Qgcm9ja2VyX3dvcmxkX29wcyByb2NrZXJfb2ZkcGFfb3BzID0gewogCS5raW5kID0gIm9mZHBhIiwKIAkucHJpdl9zaXplID0gc2l6ZW9mKHN0cnVjdCBvZmRwYSksCkBAIC0yOTQ1LDggKzI5OTksNiBAQAogCS5wb3J0X29ial92bGFuX2FkZCA9IG9mZHBhX3BvcnRfb2JqX3ZsYW5fYWRkLAogCS5wb3J0X29ial92bGFuX2RlbCA9IG9mZHBhX3BvcnRfb2JqX3ZsYW5fZGVsLAogCS5wb3J0X29ial92bGFuX2R1bXAgPSBvZmRwYV9wb3J0X29ial92bGFuX2R1bXAsCi0JLnBvcnRfb2JqX2ZpYjRfYWRkID0gb2ZkcGFfcG9ydF9vYmpfZmliNF9hZGQsCi0JLnBvcnRfb2JqX2ZpYjRfZGVsID0gb2ZkcGFfcG9ydF9vYmpfZmliNF9kZWwsCiAJLnBvcnRfb2JqX2ZkYl9hZGQgPSBvZmRwYV9wb3J0X29ial9mZGJfYWRkLAogCS5wb3J0X29ial9mZGJfZGVsID0gb2ZkcGFfcG9ydF9vYmpfZmRiX2RlbCwKIAkucG9ydF9vYmpfZmRiX2R1bXAgPSBvZmRwYV9wb3J0X29ial9mZGJfZHVtcCwKQEAgLTI5NTUsNCArMzAwNyw3IEBACiAJLnBvcnRfbmVpZ2hfdXBkYXRlID0gb2ZkcGFfcG9ydF9uZWlnaF91cGRhdGUsCiAJLnBvcnRfbmVpZ2hfZGVzdHJveSA9IG9mZHBhX3BvcnRfbmVpZ2hfZGVzdHJveSwKIAkucG9ydF9ldl9tYWNfdmxhbl9zZWVuID0gb2ZkcGFfcG9ydF9ldl9tYWNfdmxhbl9zZWVuLAorCS5maWI0X2FkZCA9IG9mZHBhX2ZpYjRfYWRkLAorCS5maWI0X2RlbCA9IG9mZHBhX2ZpYjRfZGVsLAorCS5maWI0X2Fib3J0ID0gb2ZkcGFfZmliNF9hYm9ydCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWYxMC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmMTAuYwppbmRleCBmNjU4ZmVlLi4wMDI3OWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWYxMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZjEwLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiBzdGF0aWMgaW50IGVmeF9lZjEwX2luaXRfZGF0YXBhdGhfY2FwcyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewotCU1DRElfREVDTEFSRV9CVUYob3V0YnVmLCBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19PVVRfTEVOKTsKKwlNQ0RJX0RFQ0xBUkVfQlVGKG91dGJ1ZiwgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX0xFTik7CiAJc3RydWN0IGVmeF9lZjEwX25pY19kYXRhICpuaWNfZGF0YSA9IGVmeC0+bmljX2RhdGE7CiAJc2l6ZV90IG91dGxlbjsKIAlpbnQgcmM7CkBAIC0xODgsNyArMTg4LDcgQEAKIAkJCSAgb3V0YnVmLCBzaXplb2Yob3V0YnVmKSwgJm91dGxlbik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JaWYgKG91dGxlbiA8IHNpemVvZihvdXRidWYpKSB7CisJaWYgKG91dGxlbiA8IE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX09VVF9MRU4pIHsKIAkJbmV0aWZfZXJyKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsCiAJCQkgICJ1bmFibGUgdG8gcmVhZCBkYXRhcGF0aCBmaXJtd2FyZSBjYXBhYmlsaXRpZXNcbiIpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTE5Nyw2ICsxOTcsMTIgQEAKIAluaWNfZGF0YS0+ZGF0YXBhdGhfY2FwcyA9CiAJCU1DRElfRFdPUkQob3V0YnVmLCBHRVRfQ0FQQUJJTElUSUVTX09VVF9GTEFHUzEpOwogCisJaWYgKG91dGxlbiA+PSBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfTEVOKQorCQluaWNfZGF0YS0+ZGF0YXBhdGhfY2FwczIgPSBNQ0RJX0RXT1JEKG91dGJ1ZiwKKwkJCQlHRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9GTEFHUzIpOworCWVsc2UKKwkJbmljX2RhdGEtPmRhdGFwYXRoX2NhcHMyID0gMDsKKwogCS8qIHJlY29yZCB0aGUgRFBDUFUgZmlybXdhcmUgSURzIHRvIGRldGVybWluZSBWRUIgdnN3aXRjaGluZyBzdXBwb3J0LgogCSAqLwogCW5pY19kYXRhLT5yeF9kcGNwdV9md19pZCA9CkBAIC0yMjcsNiArMjMzLDExNiBAQAogCXJldHVybiByYyA+IDAgPyByYyA6IC1FUkFOR0U7CiB9CiAKK3N0YXRpYyBpbnQgZWZ4X2VmMTBfZ2V0X3RpbWVyX3dvcmthcm91bmRzKHN0cnVjdCBlZnhfbmljICplZngpCit7CisJc3RydWN0IGVmeF9lZjEwX25pY19kYXRhICpuaWNfZGF0YSA9IGVmeC0+bmljX2RhdGE7CisJdW5zaWduZWQgaW50IGltcGxlbWVudGVkOworCXVuc2lnbmVkIGludCBlbmFibGVkOworCWludCByYzsKKworCW5pY19kYXRhLT53b3JrYXJvdW5kXzM1Mzg4ID0gZmFsc2U7CisJbmljX2RhdGEtPndvcmthcm91bmRfNjEyNjUgPSBmYWxzZTsKKworCXJjID0gZWZ4X21jZGlfZ2V0X3dvcmthcm91bmRzKGVmeCwgJmltcGxlbWVudGVkLCAmZW5hYmxlZCk7CisKKwlpZiAocmMgPT0gLUVOT1NZUykgeworCQkvKiBGaXJtd2FyZSB3aXRob3V0IEdFVF9XT1JLQVJPVU5EUyAtIG5vdCBhIHByb2JsZW0uICovCisJCXJjID0gMDsKKwl9IGVsc2UgaWYgKHJjID09IDApIHsKKwkJLyogQnVnNjEyNjUgd29ya2Fyb3VuZCBpcyBhbHdheXMgZW5hYmxlZCBpZiBpbXBsZW1lbnRlZC4gKi8KKwkJaWYgKGVuYWJsZWQgJiBNQ19DTURfR0VUX1dPUktBUk9VTkRTX09VVF9CVUc2MTI2NSkKKwkJCW5pY19kYXRhLT53b3JrYXJvdW5kXzYxMjY1ID0gdHJ1ZTsKKworCQlpZiAoZW5hYmxlZCAmIE1DX0NNRF9HRVRfV09SS0FST1VORFNfT1VUX0JVRzM1Mzg4KSB7CisJCQluaWNfZGF0YS0+d29ya2Fyb3VuZF8zNTM4OCA9IHRydWU7CisJCX0gZWxzZSBpZiAoaW1wbGVtZW50ZWQgJiBNQ19DTURfR0VUX1dPUktBUk9VTkRTX09VVF9CVUczNTM4OCkgeworCQkJLyogV29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZCBidXQgbm90IGVuYWJsZWQuCisJCQkgKiBUcnkgdG8gZW5hYmxlIGl0LgorCQkJICovCisJCQlyYyA9IGVmeF9tY2RpX3NldF93b3JrYXJvdW5kKGVmeCwKKwkJCQkJCSAgICAgTUNfQ01EX1dPUktBUk9VTkRfQlVHMzUzODgsCisJCQkJCQkgICAgIHRydWUsIE5VTEwpOworCQkJaWYgKHJjID09IDApCisJCQkJbmljX2RhdGEtPndvcmthcm91bmRfMzUzODggPSB0cnVlOworCQkJLyogSWYgd2UgZmFpbGVkIHRvIHNldCB0aGUgd29ya2Fyb3VuZCBqdXN0IGNhcnJ5IG9uLiAqLworCQkJcmMgPSAwOworCQl9CisJfQorCisJbmV0aWZfZGJnKGVmeCwgcHJvYmUsIGVmeC0+bmV0X2RldiwKKwkJICAid29ya2Fyb3VuZCBmb3IgYnVnIDM1Mzg4IGlzICVzYWJsZWRcbiIsCisJCSAgbmljX2RhdGEtPndvcmthcm91bmRfMzUzODggPyAiZW4iIDogImRpcyIpOworCW5ldGlmX2RiZyhlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsCisJCSAgIndvcmthcm91bmQgZm9yIGJ1ZyA2MTI2NSBpcyAlc2FibGVkXG4iLAorCQkgIG5pY19kYXRhLT53b3JrYXJvdW5kXzYxMjY1ID8gImVuIiA6ICJkaXMiKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgZWZ4X2VmMTBfcHJvY2Vzc190aW1lcl9jb25maWcoc3RydWN0IGVmeF9uaWMgKmVmeCwKKwkJCQkJICBjb25zdCBlZnhfZHdvcmRfdCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgbWF4X2NvdW50OworCisJaWYgKEVGWF9FRjEwX1dPUktBUk9VTkRfNjEyNjUoZWZ4KSkgeworCQllZngtPnRpbWVyX3F1YW50dW1fbnMgPSBNQ0RJX0RXT1JEKGRhdGEsCisJCQlHRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9NQ0RJX1RNUl9TVEVQX05TKTsKKwkJZWZ4LT50aW1lcl9tYXhfbnMgPSBNQ0RJX0RXT1JEKGRhdGEsCisJCQlHRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9NQ0RJX1RNUl9NQVhfTlMpOworCX0gZWxzZSBpZiAoRUZYX0VGMTBfV09SS0FST1VORF8zNTM4OChlZngpKSB7CisJCWVmeC0+dGltZXJfcXVhbnR1bV9ucyA9IE1DRElfRFdPUkQoZGF0YSwKKwkJCUdFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX0JVRzM1Mzg4X1RNUl9OU19QRVJfQ09VTlQpOworCQltYXhfY291bnQgPSBNQ0RJX0RXT1JEKGRhdGEsCisJCQlHRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9CVUczNTM4OF9UTVJfTUFYX0NPVU5UKTsKKwkJZWZ4LT50aW1lcl9tYXhfbnMgPSBtYXhfY291bnQgKiBlZngtPnRpbWVyX3F1YW50dW1fbnM7CisJfSBlbHNlIHsKKwkJZWZ4LT50aW1lcl9xdWFudHVtX25zID0gTUNESV9EV09SRChkYXRhLAorCQkJR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfVE1SX1JFR19OU19QRVJfQ09VTlQpOworCQltYXhfY291bnQgPSBNQ0RJX0RXT1JEKGRhdGEsCisJCQlHRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9UTVJfUkVHX01BWF9DT1VOVCk7CisJCWVmeC0+dGltZXJfbWF4X25zID0gbWF4X2NvdW50ICogZWZ4LT50aW1lcl9xdWFudHVtX25zOworCX0KKworCW5ldGlmX2RiZyhlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsCisJCSAgImdvdCB0aW1lciBwcm9wZXJ0aWVzIGZyb20gTUM6IHF1YW50dW0gJXUgbnM7IG1heCAldSBuc1xuIiwKKwkJICBlZngtPnRpbWVyX3F1YW50dW1fbnMsIGVmeC0+dGltZXJfbWF4X25zKTsKK30KKworc3RhdGljIGludCBlZnhfZWYxMF9nZXRfdGltZXJfY29uZmlnKHN0cnVjdCBlZnhfbmljICplZngpCit7CisJTUNESV9ERUNMQVJFX0JVRihvdXRidWYsIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9MRU4pOworCWludCByYzsKKworCXJjID0gZWZ4X2VmMTBfZ2V0X3RpbWVyX3dvcmthcm91bmRzKGVmeCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGVmeF9tY2RpX3JwY19xdWlldChlZngsIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTLCBOVUxMLCAwLAorCQkJCW91dGJ1Ziwgc2l6ZW9mKG91dGJ1ZiksIE5VTEwpOworCisJaWYgKHJjID09IDApIHsKKwkJZWZ4X2VmMTBfcHJvY2Vzc190aW1lcl9jb25maWcoZWZ4LCBvdXRidWYpOworCX0gZWxzZSBpZiAocmMgPT0gLUVOT1NZUyB8fCByYyA9PSAtRVBFUk0pIHsKKwkJLyogTm90IGF2YWlsYWJsZSAtIGZhbGwgYmFjayB0byBIdW50aW5ndG9uIGRlZmF1bHRzLiAqLworCQl1bnNpZ25lZCBpbnQgcXVhbnR1bTsKKworCQlyYyA9IGVmeF9lZjEwX2dldF9zeXNjbGtfZnJlcShlZngpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCisJCXF1YW50dW0gPSAxNTM2MDAwIC8gcmM7IC8qIDE1MzYgY3ljbGVzICovCisJCWVmeC0+dGltZXJfcXVhbnR1bV9ucyA9IHF1YW50dW07CisJCWVmeC0+dGltZXJfbWF4X25zID0gZWZ4LT50eXBlLT50aW1lcl9wZXJpb2RfbWF4ICogcXVhbnR1bTsKKwkJcmMgPSAwOworCX0gZWxzZSB7CisJCWVmeF9tY2RpX2Rpc3BsYXlfZXJyb3IoZWZ4LCBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFUywKKwkJCQkgICAgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX0xFTiwKKwkJCQkgICAgICAgTlVMTCwgMCwgcmMpOworCX0KKworCXJldHVybiByYzsKK30KKwogc3RhdGljIGludCBlZnhfZWYxMF9nZXRfbWFjX2FkZHJlc3NfcGYoc3RydWN0IGVmeF9uaWMgKmVmeCwgdTggKm1hY19hZGRyZXNzKQogewogCU1DRElfREVDTEFSRV9CVUYob3V0YnVmLCBNQ19DTURfR0VUX01BQ19BRERSRVNTRVNfT1VUX0xFTik7CkBAIC01MjcsMzIgKzY0Myw5IEBACiAJaWYgKHJjKQogCQlnb3RvIGZhaWw1OwogCi0JcmMgPSBlZnhfZWYxMF9nZXRfc3lzY2xrX2ZyZXEoZWZ4KTsKKwlyYyA9IGVmeF9lZjEwX2dldF90aW1lcl9jb25maWcoZWZ4KTsKIAlpZiAocmMgPCAwKQogCQlnb3RvIGZhaWw1OwotCWVmeC0+dGltZXJfcXVhbnR1bV9ucyA9IDE1MzYwMDAgLyByYzsgLyogMTUzNiBjeWNsZXMgKi8KLQotCS8qIENoZWNrIHdoZXRoZXIgZmlybXdhcmUgc3VwcG9ydHMgYnVnIDM1Mzg4IHdvcmthcm91bmQuCi0JICogRmlyc3QgdHJ5IHRvIGVuYWJsZSBpdCwgdGhlbiBpZiB3ZSBnZXQgRVBFUk0sIGp1c3QKLQkgKiBhc2sgaWYgaXQncyBhbHJlYWR5IGVuYWJsZWQKLQkgKi8KLQlyYyA9IGVmeF9tY2RpX3NldF93b3JrYXJvdW5kKGVmeCwgTUNfQ01EX1dPUktBUk9VTkRfQlVHMzUzODgsIHRydWUsIE5VTEwpOwotCWlmIChyYyA9PSAwKSB7Ci0JCW5pY19kYXRhLT53b3JrYXJvdW5kXzM1Mzg4ID0gdHJ1ZTsKLQl9IGVsc2UgaWYgKHJjID09IC1FUEVSTSkgewotCQl1bnNpZ25lZCBpbnQgZW5hYmxlZDsKLQotCQlyYyA9IGVmeF9tY2RpX2dldF93b3JrYXJvdW5kcyhlZngsIE5VTEwsICZlbmFibGVkKTsKLQkJaWYgKHJjKQotCQkJZ290byBmYWlsMzsKLQkJbmljX2RhdGEtPndvcmthcm91bmRfMzUzODggPSBlbmFibGVkICYKLQkJCU1DX0NNRF9HRVRfV09SS0FST1VORFNfT1VUX0JVRzM1Mzg4OwotCX0gZWxzZSBpZiAocmMgIT0gLUVOT1NZUyAmJiByYyAhPSAtRU5PRU5UKSB7Ci0JCWdvdG8gZmFpbDU7Ci0JfQotCW5ldGlmX2RiZyhlZngsIHByb2JlLCBlZngtPm5ldF9kZXYsCi0JCSAgIndvcmthcm91bmQgZm9yIGJ1ZyAzNTM4OCBpcyAlc2FibGVkXG4iLAotCQkgIG5pY19kYXRhLT53b3JrYXJvdW5kXzM1Mzg4ID8gImVuIiA6ICJkaXMiKTsKIAogCXJjID0gZWZ4X21jZGlfbW9uX3Byb2JlKGVmeCk7CiAJaWYgKHJjICYmIHJjICE9IC1FUEVSTSkKQEAgLTE0NDAsOSArMTUzMywxMCBAQAogCQkJICAgICAgICgxVUxMIDw8IEdFTkVSSUNfU1RBVF9yeF9ub2Rlc2NfdHJ1bmMpIHwJXAogCQkJICAgICAgICgxVUxMIDw8IEdFTkVSSUNfU1RBVF9yeF9ub3NrYl9kcm9wcykpCiAKLS8qIFRoZXNlIHN0YXRpc3RpY3MgYXJlIG9ubHkgcHJvdmlkZWQgYnkgdGhlIDEwRyBNQUMuICBGb3IgYSAxMEcvNDBHCi0gKiBzd2l0Y2hhYmxlIHBvcnQgd2UgZG8gbm90IGV4cG9zZSB0aGVzZSBiZWNhdXNlIHRoZXkgbWlnaHQgbm90Ci0gKiBpbmNsdWRlIGFsbCB0aGUgcGFja2V0cyB0aGV5IHNob3VsZC4KKy8qIE9uIDcwMDAgc2VyaWVzIE5JQ3MsIHRoZXNlIHN0YXRpc3RpY3MgYXJlIG9ubHkgcHJvdmlkZWQgYnkgdGhlIDEwRyBNQUMuCisgKiBGb3IgYSAxMEcvNDBHIHN3aXRjaGFibGUgcG9ydCB3ZSBkbyBub3QgZXhwb3NlIHRoZXNlIGJlY2F1c2UgdGhleSBtaWdodAorICogbm90IGluY2x1ZGUgYWxsIHRoZSBwYWNrZXRzIHRoZXkgc2hvdWxkLgorICogT24gODAwMCBzZXJpZXMgTklDcyB0aGVzZSBzdGF0aXN0aWNzIGFyZSBhbHdheXMgcHJvdmlkZWQuCiAgKi8KICNkZWZpbmUgSFVOVF8xMEdfT05MWV9TVEFUX01BU0sgKCgxVUxMIDw8IEVGMTBfU1RBVF9wb3J0X3R4X2NvbnRyb2wpIHwJXAogCQkJCSAoMVVMTCA8PCBFRjEwX1NUQVRfcG9ydF90eF9sdDY0KSB8CVwKQEAgLTE0ODgsMTAgKzE1ODIsMTUgQEAKIAkgICAgICAxIDw8IE1DX0NNRF9EUlZfQVRUQUNIX0VYVF9PVVRfRkxBR19MSU5LQ1RSTCkpCiAJCXJldHVybiAwOwogCi0JaWYgKHBvcnRfY2FwcyAmICgxIDw8IE1DX0NNRF9QSFlfQ0FQXzQwMDAwRkRYX0xCTikpCisJaWYgKHBvcnRfY2FwcyAmICgxIDw8IE1DX0NNRF9QSFlfQ0FQXzQwMDAwRkRYX0xCTikpIHsKIAkJcmF3X21hc2sgfD0gSFVOVF80MEdfRVhUUkFfU1RBVF9NQVNLOwotCWVsc2UKKwkJLyogODAwMCBzZXJpZXMgaGF2ZSBldmVyeXRoaW5nIGV2ZW4gYXQgNDBHICovCisJCWlmIChuaWNfZGF0YS0+ZGF0YXBhdGhfY2FwczIgJgorCQkgICAgKDEgPDwgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX01BQ19TVEFUU180MEdfVFhfU0laRV9CSU5TX0xCTikpCisJCQlyYXdfbWFzayB8PSBIVU5UXzEwR19PTkxZX1NUQVRfTUFTSzsKKwl9IGVsc2UgewogCQlyYXdfbWFzayB8PSBIVU5UXzEwR19PTkxZX1NUQVRfTUFTSzsKKwl9CiAKIAlpZiAobmljX2RhdGEtPmRhdGFwYXRoX2NhcHMgJgogCSAgICAoMSA8PCBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19PVVRfUE1fQU5EX1JYRFBfQ09VTlRFUlNfTEJOKSkKQEAgLTE1MTcsMTMgKzE2MTYsMTQgQEAKIAl9CiAKICNpZiBCSVRTX1BFUl9MT05HID09IDY0CisJQlVJTERfQlVHX09OKEJJVFNfVE9fTE9OR1MoRUYxMF9TVEFUX0NPVU5UKSAhPSAyKTsKIAltYXNrWzBdID0gcmF3X21hc2tbMF07CiAJbWFza1sxXSA9IHJhd19tYXNrWzFdOwogI2Vsc2UKKwlCVUlMRF9CVUdfT04oQklUU19UT19MT05HUyhFRjEwX1NUQVRfQ09VTlQpICE9IDMpOwogCW1hc2tbMF0gPSByYXdfbWFza1swXSAmIDB4ZmZmZmZmZmY7CiAJbWFza1sxXSA9IHJhd19tYXNrWzBdID4+IDMyOwogCW1hc2tbMl0gPSByYXdfbWFza1sxXSAmIDB4ZmZmZmZmZmY7Ci0JbWFza1szXSA9IHJhd19tYXNrWzFdID4+IDMyOwogI2VuZGlmCiB9CiAKQEAgLTE2MTYsNyArMTcxNiw2IEBACiAJZWZ4X2VmMTBfZ2V0X3N0YXRfbWFzayhlZngsIG1hc2spOwogCiAJZG1hX3N0YXRzID0gZWZ4LT5zdGF0c19idWZmZXIuYWRkcjsKLQluaWNfZGF0YSA9IGVmeC0+bmljX2RhdGE7CiAKIAlnZW5lcmF0aW9uX2VuZCA9IGRtYV9zdGF0c1tNQ19DTURfTUFDX0dFTkVSQVRJT05fRU5EXTsKIAlpZiAoZ2VuZXJhdGlvbl9lbmQgPT0gRUZYX01DX1NUQVRTX0dFTkVSQVRJT05fSU5WQUxJRCkKQEAgLTE3NDMsMjcgKzE4NDIsNDMgQEAKIHN0YXRpYyB2b2lkIGVmeF9lZjEwX3B1c2hfaXJxX21vZGVyYXRpb24oc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBjaGFubmVsLT5lZng7Ci0JdW5zaWduZWQgaW50IG1vZGUsIHZhbHVlOworCXVuc2lnbmVkIGludCBtb2RlLCB1c2VjczsKIAllZnhfZHdvcmRfdCB0aW1lcl9jbWQ7CiAKLQlpZiAoY2hhbm5lbC0+aXJxX21vZGVyYXRpb24pIHsKKwlpZiAoY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMpIHsKIAkJbW9kZSA9IDM7Ci0JCXZhbHVlID0gY2hhbm5lbC0+aXJxX21vZGVyYXRpb24gLSAxOworCQl1c2VjcyA9IGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzOwogCX0gZWxzZSB7CiAJCW1vZGUgPSAwOwotCQl2YWx1ZSA9IDA7CisJCXVzZWNzID0gMDsKIAl9CiAKLQlpZiAoRUZYX0VGMTBfV09SS0FST1VORF8zNTM4OChlZngpKSB7CisJaWYgKEVGWF9FRjEwX1dPUktBUk9VTkRfNjEyNjUoZWZ4KSkgeworCQlNQ0RJX0RFQ0xBUkVfQlVGKGluYnVmLCBNQ19DTURfU0VUX0VWUV9UTVJfSU5fTEVOKTsKKwkJdW5zaWduZWQgaW50IG5zID0gdXNlY3MgKiAxMDAwOworCisJCU1DRElfU0VUX0RXT1JEKGluYnVmLCBTRVRfRVZRX1RNUl9JTl9JTlNUQU5DRSwKKwkJCSAgICAgICBjaGFubmVsLT5jaGFubmVsKTsKKwkJTUNESV9TRVRfRFdPUkQoaW5idWYsIFNFVF9FVlFfVE1SX0lOX1RNUl9MT0FEX1JFUV9OUywgbnMpOworCQlNQ0RJX1NFVF9EV09SRChpbmJ1ZiwgU0VUX0VWUV9UTVJfSU5fVE1SX1JFTE9BRF9SRVFfTlMsIG5zKTsKKwkJTUNESV9TRVRfRFdPUkQoaW5idWYsIFNFVF9FVlFfVE1SX0lOX1RNUl9NT0RFLCBtb2RlKTsKKworCQllZnhfbWNkaV9ycGNfYXN5bmMoZWZ4LCBNQ19DTURfU0VUX0VWUV9UTVIsCisJCQkJICAgaW5idWYsIHNpemVvZihpbmJ1ZiksIDAsIE5VTEwsIDApOworCX0gZWxzZSBpZiAoRUZYX0VGMTBfV09SS0FST1VORF8zNTM4OChlZngpKSB7CisJCXVuc2lnbmVkIGludCB0aWNrcyA9IGVmeF91c2Vjc190b190aWNrcyhlZngsIHVzZWNzKTsKKwogCQlFRlhfUE9QVUxBVEVfRFdPUkRfMyh0aW1lcl9jbWQsIEVSRl9ERF9FVlFfSU5EX1RJTUVSX0ZMQUdTLAogCQkJCSAgICAgRUZFX0REX0VWUV9JTkRfVElNRVJfRkxBR1MsCiAJCQkJICAgICBFUkZfRERfRVZRX0lORF9USU1FUl9NT0RFLCBtb2RlLAotCQkJCSAgICAgRVJGX0REX0VWUV9JTkRfVElNRVJfVkFMLCB2YWx1ZSk7CisJCQkJICAgICBFUkZfRERfRVZRX0lORF9USU1FUl9WQUwsIHRpY2tzKTsKIAkJZWZ4X3dyaXRlZF9wYWdlKGVmeCwgJnRpbWVyX2NtZCwgRVJfRERfRVZRX0lORElSRUNULAogCQkJCWNoYW5uZWwtPmNoYW5uZWwpOwogCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCB0aWNrcyA9IGVmeF91c2Vjc190b190aWNrcyhlZngsIHVzZWNzKTsKKwogCQlFRlhfUE9QVUxBVEVfRFdPUkRfMih0aW1lcl9jbWQsIEVSRl9EWl9UQ19USU1FUl9NT0RFLCBtb2RlLAotCQkJCSAgICAgRVJGX0RaX1RDX1RJTUVSX1ZBTCwgdmFsdWUpOworCQkJCSAgICAgRVJGX0RaX1RDX1RJTUVSX1ZBTCwgdGlja3MpOwogCQllZnhfd3JpdGVkX3BhZ2UoZWZ4LCAmdGltZXJfY21kLCBFUl9EWl9FVlFfVE1SLAogCQkJCWNoYW5uZWwtPmNoYW5uZWwpOwogCX0KQEAgLTE5MzQsMTQgKzIwNDksMTggQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIGVmeF9lZjEwX2lycV90ZXN0X2dlbmVyYXRlKHN0cnVjdCBlZnhfbmljICplZngpCitzdGF0aWMgaW50IGVmeF9lZjEwX2lycV90ZXN0X2dlbmVyYXRlKHN0cnVjdCBlZnhfbmljICplZngpCiB7CiAJTUNESV9ERUNMQVJFX0JVRihpbmJ1ZiwgTUNfQ01EX1RSSUdHRVJfSU5URVJSVVBUX0lOX0xFTik7CiAKKwlpZiAoZWZ4X21jZGlfc2V0X3dvcmthcm91bmQoZWZ4LCBNQ19DTURfV09SS0FST1VORF9CVUc0MTc1MCwgdHJ1ZSwKKwkJCQkgICAgTlVMTCkgPT0gMCkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwogCUJVSUxEX0JVR19PTihNQ19DTURfVFJJR0dFUl9JTlRFUlJVUFRfT1VUX0xFTiAhPSAwKTsKIAogCU1DRElfU0VUX0RXT1JEKGluYnVmLCBUUklHR0VSX0lOVEVSUlVQVF9JTl9JTlRSX0xFVkVMLCBlZngtPmlycV9sZXZlbCk7Ci0JKHZvaWQpIGVmeF9tY2RpX3JwYyhlZngsIE1DX0NNRF9UUklHR0VSX0lOVEVSUlVQVCwKKwlyZXR1cm4gZWZ4X21jZGlfcnBjKGVmeCwgTUNfQ01EX1RSSUdHRVJfSU5URVJSVVBULAogCQkJICAgIGluYnVmLCBzaXplb2YoaW5idWYpLCBOVUxMLCAwLCBOVUxMKTsKIH0KIApAQCAtMjUzNSwxMyArMjY1NCwxMiBAQAogc3RhdGljIGludCBlZnhfZWYxMF9ldl9pbml0KHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAlNQ0RJX0RFQ0xBUkVfQlVGKGluYnVmLAotCQkJIE1DX0NNRF9JTklUX0VWUV9JTl9MRU4oRUZYX01BWF9FVlFfU0laRSAqIDggLwotCQkJCQkJRUZYX0JVRl9TSVpFKSk7Ci0JTUNESV9ERUNMQVJFX0JVRihvdXRidWYsIE1DX0NNRF9JTklUX0VWUV9PVVRfTEVOKTsKKwkJCSBNQ19DTURfSU5JVF9FVlFfVjJfSU5fTEVOKEVGWF9NQVhfRVZRX1NJWkUgKiA4IC8KKwkJCQkJCSAgIEVGWF9CVUZfU0laRSkpOworCU1DRElfREVDTEFSRV9CVUYob3V0YnVmLCBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0xFTik7CiAJc2l6ZV90IGVudHJpZXMgPSBjaGFubmVsLT5ldmVudHEuYnVmLmxlbiAvIEVGWF9CVUZfU0laRTsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gY2hhbm5lbC0+ZWZ4OwogCXN0cnVjdCBlZnhfZWYxMF9uaWNfZGF0YSAqbmljX2RhdGE7Ci0JYm9vbCBzdXBwb3J0c19yeF9tZXJnZTsKIAlzaXplX3QgaW5sZW4sIG91dGxlbjsKIAl1bnNpZ25lZCBpbnQgZW5hYmxlZCwgaW1wbGVtZW50ZWQ7CiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsKQEAgLTI1NDksOSArMjY2Nyw2IEBACiAJaW50IGk7CiAKIAluaWNfZGF0YSA9IGVmeC0+bmljX2RhdGE7Ci0Jc3VwcG9ydHNfcnhfbWVyZ2UgPQotCQkhIShuaWNfZGF0YS0+ZGF0YXBhdGhfY2FwcyAmCi0JCSAgIDEgPDwgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfT1VUX1JYX0JBVENISU5HX0xCTik7CiAKIAkvKiBGaWxsIGV2ZW50IHF1ZXVlIHdpdGggYWxsIG9uZXMgKGkuZS4gZW1wdHkgZXZlbnRzKSAqLwogCW1lbXNldChjaGFubmVsLT5ldmVudHEuYnVmLmFkZHIsIDB4ZmYsIGNoYW5uZWwtPmV2ZW50cS5idWYubGVuKTsKQEAgLTI1NjAsMTEgKzI2NzUsNiBAQAogCU1DRElfU0VUX0RXT1JEKGluYnVmLCBJTklUX0VWUV9JTl9JTlNUQU5DRSwgY2hhbm5lbC0+Y2hhbm5lbCk7CiAJLyogSU5JVF9FVlEgZXhwZWN0cyBpbmRleCBpbiB2ZWN0b3IgdGFibGUsIG5vdCBhYnNvbHV0ZSAqLwogCU1DRElfU0VUX0RXT1JEKGluYnVmLCBJTklUX0VWUV9JTl9JUlFfTlVNLCBjaGFubmVsLT5jaGFubmVsKTsKLQlNQ0RJX1BPUFVMQVRFX0RXT1JEXzQoaW5idWYsIElOSVRfRVZRX0lOX0ZMQUdTLAotCQkJICAgICAgSU5JVF9FVlFfSU5fRkxBR19JTlRFUlJVUFRJTkcsIDEsCi0JCQkgICAgICBJTklUX0VWUV9JTl9GTEFHX1JYX01FUkdFLCAxLAotCQkJICAgICAgSU5JVF9FVlFfSU5fRkxBR19UWF9NRVJHRSwgMSwKLQkJCSAgICAgIElOSVRfRVZRX0lOX0ZMQUdfQ1VUX1RIUlUsICFzdXBwb3J0c19yeF9tZXJnZSk7CiAJTUNESV9TRVRfRFdPUkQoaW5idWYsIElOSVRfRVZRX0lOX1RNUl9NT0RFLAogCQkgICAgICAgTUNfQ01EX0lOSVRfRVZRX0lOX1RNUl9NT0RFX0RJUyk7CiAJTUNESV9TRVRfRFdPUkQoaW5idWYsIElOSVRfRVZRX0lOX1RNUl9MT0FELCAwKTsKQEAgLTI1NzMsNiArMjY4MywyNyBAQAogCQkgICAgICAgTUNfQ01EX0lOSVRfRVZRX0lOX0NPVU5UX01PREVfRElTKTsKIAlNQ0RJX1NFVF9EV09SRChpbmJ1ZiwgSU5JVF9FVlFfSU5fQ09VTlRfVEhSU0hMRCwgMCk7CiAKKwlpZiAobmljX2RhdGEtPmRhdGFwYXRoX2NhcHMyICYKKwkgICAgMSA8PCBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfSU5JVF9FVlFfVjJfTEJOKSB7CisJCS8qIFVzZSB0aGUgbmV3IGdlbmVyaWMgYXBwcm9hY2ggdG8gc3BlY2lmeWluZyBldmVudCBxdWV1ZQorCQkgKiBjb25maWd1cmF0aW9uLCByZXF1ZXN0aW5nIGxvd2VyIGxhdGVuY3kgb3IgaGlnaGVyIHRocm91Z2hwdXQuCisJCSAqIFRoZSBvcHRpb25zIHRoYXQgYWN0dWFsbHkgZ2V0IHVzZWQgYXBwZWFyIGluIHRoZSBvdXRwdXQuCisJCSAqLworCQlNQ0RJX1BPUFVMQVRFX0RXT1JEXzIoaW5idWYsIElOSVRfRVZRX1YyX0lOX0ZMQUdTLAorCQkJCSAgICAgIElOSVRfRVZRX1YyX0lOX0ZMQUdfSU5URVJSVVBUSU5HLCAxLAorCQkJCSAgICAgIElOSVRfRVZRX1YyX0lOX0ZMQUdfVFlQRSwKKwkJCQkgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19UWVBFX0FVVE8pOworCX0gZWxzZSB7CisJCWJvb2wgY3V0X3RocnUgPSAhKG5pY19kYXRhLT5kYXRhcGF0aF9jYXBzICYKKwkJCTEgPDwgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfT1VUX1JYX0JBVENISU5HX0xCTik7CisKKwkJTUNESV9QT1BVTEFURV9EV09SRF80KGluYnVmLCBJTklUX0VWUV9JTl9GTEFHUywKKwkJCQkgICAgICBJTklUX0VWUV9JTl9GTEFHX0lOVEVSUlVQVElORywgMSwKKwkJCQkgICAgICBJTklUX0VWUV9JTl9GTEFHX1JYX01FUkdFLCAxLAorCQkJCSAgICAgIElOSVRfRVZRX0lOX0ZMQUdfVFhfTUVSR0UsIDEsCisJCQkJICAgICAgSU5JVF9FVlFfSU5fRkxBR19DVVRfVEhSVSwgY3V0X3RocnUpOworCX0KKwogCWRtYV9hZGRyID0gY2hhbm5lbC0+ZXZlbnRxLmJ1Zi5kbWFfYWRkcjsKIAlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgKytpKSB7CiAJCU1DRElfU0VUX0FSUkFZX1FXT1JEKGluYnVmLCBJTklUX0VWUV9JTl9ETUFfQUREUiwgaSwgZG1hX2FkZHIpOwpAQCAtMjU4Myw2ICsyNzE0LDEzIEBACiAKIAlyYyA9IGVmeF9tY2RpX3JwYyhlZngsIE1DX0NNRF9JTklUX0VWUSwgaW5idWYsIGlubGVuLAogCQkJICBvdXRidWYsIHNpemVvZihvdXRidWYpLCAmb3V0bGVuKTsKKworCWlmIChvdXRsZW4gPj0gTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9MRU4pCisJCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkJICAiQ2hhbm5lbCAlZCB1c2luZyBldmVudCBxdWV1ZSBmbGFncyAlMDh4XG4iLAorCQkJICBjaGFubmVsLT5jaGFubmVsLAorCQkJICBNQ0RJX0RXT1JEKG91dGJ1ZiwgSU5JVF9FVlFfVjJfT1VUX0ZMQUdTKSk7CisKIAkvKiBJUlEgcmV0dXJuIGlzIGlnbm9yZWQgKi8KIAlpZiAoY2hhbm5lbC0+Y2hhbm5lbCB8fCByYykKIAkJcmV0dXJuIHJjOwpAQCAtMjU5MCw4ICsyNzI4LDggQEAKIAkvKiBTdWNjZXNzZnVsbHkgY3JlYXRlZCBldmVudCBxdWV1ZSBvbiBjaGFubmVsIDAgKi8KIAlyYyA9IGVmeF9tY2RpX2dldF93b3JrYXJvdW5kcyhlZngsICZpbXBsZW1lbnRlZCwgJmVuYWJsZWQpOwogCWlmIChyYyA9PSAtRU5PU1lTKSB7Ci0JCS8qIEdFVF9XT1JLQVJPVU5EUyB3YXMgaW1wbGVtZW50ZWQgYmVmb3JlIHRoZSBidWcyNjgwNwotCQkgKiB3b3JrYXJvdW5kLCB0aHVzIHRoZSBsYXR0ZXIgbXVzdCBiZSB1bmF2YWlsYWJsZSBpbiB0aGlzIGZ3CisJCS8qIEdFVF9XT1JLQVJPVU5EUyB3YXMgaW1wbGVtZW50ZWQgYmVmb3JlIHRoaXMgd29ya2Fyb3VuZCwKKwkJICogdGh1cyBpdCBtdXN0IGJlIHVuYXZhaWxhYmxlIGluIHRoaXMgZmlybXdhcmUuCiAJCSAqLwogCQluaWNfZGF0YS0+d29ya2Fyb3VuZF8yNjgwNyA9IGZhbHNlOwogCQlyYyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmMKaW5kZXggMTRiODIxYi4uM2NmMzU1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYwpAQCAtMjgxLDYgKzI4MSwyNyBAQAogICogTkFQSSBndWFyYW50ZWVzIHNlcmlhbGlzYXRpb24gb2YgcG9sbHMgb2YgdGhlIHNhbWUgZGV2aWNlLCB3aGljaAogICogcHJvdmlkZXMgdGhlIGd1YXJhbnRlZSByZXF1aXJlZCBieSBlZnhfcHJvY2Vzc19jaGFubmVsKCkuCiAgKi8KK3N0YXRpYyB2b2lkIGVmeF91cGRhdGVfaXJxX21vZChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBzdHJ1Y3QgZWZ4X2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaW50IHN0ZXAgPSBlZngtPmlycV9tb2Rfc3RlcF91czsKKworCWlmIChjaGFubmVsLT5pcnFfbW9kX3Njb3JlIDwgaXJxX2FkYXB0X2xvd190aHJlc2gpIHsKKwkJaWYgKGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzID4gc3RlcCkgeworCQkJY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMgLT0gc3RlcDsKKwkJCWVmeC0+dHlwZS0+cHVzaF9pcnFfbW9kZXJhdGlvbihjaGFubmVsKTsKKwkJfQorCX0gZWxzZSBpZiAoY2hhbm5lbC0+aXJxX21vZF9zY29yZSA+IGlycV9hZGFwdF9oaWdoX3RocmVzaCkgeworCQlpZiAoY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMgPAorCQkgICAgZWZ4LT5pcnFfcnhfbW9kZXJhdGlvbl91cykgeworCQkJY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMgKz0gc3RlcDsKKwkJCWVmeC0+dHlwZS0+cHVzaF9pcnFfbW9kZXJhdGlvbihjaGFubmVsKTsKKwkJfQorCX0KKworCWNoYW5uZWwtPmlycV9jb3VudCA9IDA7CisJY2hhbm5lbC0+aXJxX21vZF9zY29yZSA9IDA7Cit9CisKIHN0YXRpYyBpbnQgZWZ4X3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQogewogCXN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCA9CkBAIC0zMDEsMjIgKzMyMiw3IEBACiAJCWlmIChlZnhfY2hhbm5lbF9oYXNfcnhfcXVldWUoY2hhbm5lbCkgJiYKIAkJICAgIGVmeC0+aXJxX3J4X2FkYXB0aXZlICYmCiAJCSAgICB1bmxpa2VseSgrK2NoYW5uZWwtPmlycV9jb3VudCA9PSAxMDAwKSkgewotCQkJaWYgKHVubGlrZWx5KGNoYW5uZWwtPmlycV9tb2Rfc2NvcmUgPAotCQkJCSAgICAgaXJxX2FkYXB0X2xvd190aHJlc2gpKSB7Ci0JCQkJaWYgKGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uID4gMSkgewotCQkJCQljaGFubmVsLT5pcnFfbW9kZXJhdGlvbiAtPSAxOwotCQkJCQllZngtPnR5cGUtPnB1c2hfaXJxX21vZGVyYXRpb24oY2hhbm5lbCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh1bmxpa2VseShjaGFubmVsLT5pcnFfbW9kX3Njb3JlID4KLQkJCQkJICAgIGlycV9hZGFwdF9oaWdoX3RocmVzaCkpIHsKLQkJCQlpZiAoY2hhbm5lbC0+aXJxX21vZGVyYXRpb24gPAotCQkJCSAgICBlZngtPmlycV9yeF9tb2RlcmF0aW9uKSB7Ci0JCQkJCWNoYW5uZWwtPmlycV9tb2RlcmF0aW9uICs9IDE7Ci0JCQkJCWVmeC0+dHlwZS0+cHVzaF9pcnFfbW9kZXJhdGlvbihjaGFubmVsKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGFubmVsLT5pcnFfY291bnQgPSAwOwotCQkJY2hhbm5lbC0+aXJxX21vZF9zY29yZSA9IDA7CisJCQllZnhfdXBkYXRlX2lycV9tb2QoZWZ4LCBjaGFubmVsKTsKIAkJfQogCiAJCWVmeF9maWx0ZXJfcmZzX2V4cGlyZShjaGFubmVsKTsKQEAgLTE3MDMsNiArMTcwOSw3IEBACiAJbmV0aWZfc2V0X3JlYWxfbnVtX3J4X3F1ZXVlcyhlZngtPm5ldF9kZXYsIGVmeC0+bl9yeF9jaGFubmVscyk7CiAKIAkvKiBJbml0aWFsaXNlIHRoZSBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBzZXR0aW5ncyAqLworCWVmeC0+aXJxX21vZF9zdGVwX3VzID0gRElWX1JPVU5EX1VQKGVmeC0+dGltZXJfcXVhbnR1bV9ucywgMTAwMCk7CiAJZWZ4X2luaXRfaXJxX21vZGVyYXRpb24oZWZ4LCB0eF9pcnFfbW9kX3VzZWMsIHJ4X2lycV9tb2RfdXNlYywgdHJ1ZSwKIAkJCQl0cnVlKTsKIApAQCAtMTk0OSwxNCArMTk1NiwyMSBAQAogICogSW50ZXJydXB0IG1vZGVyYXRpb24KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX21vZF90aWNrcyh1bnNpZ25lZCBpbnQgdXNlY3MsIHVuc2lnbmVkIGludCBxdWFudHVtX25zKQordW5zaWduZWQgaW50IGVmeF91c2Vjc190b190aWNrcyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCB1bnNpZ25lZCBpbnQgdXNlY3MpCiB7CiAJaWYgKHVzZWNzID09IDApCiAJCXJldHVybiAwOwotCWlmICh1c2VjcyAqIDEwMDAgPCBxdWFudHVtX25zKQorCWlmICh1c2VjcyAqIDEwMDAgPCBlZngtPnRpbWVyX3F1YW50dW1fbnMpCiAJCXJldHVybiAxOyAvKiBuZXZlciByb3VuZCBkb3duIHRvIDAgKi8KLQlyZXR1cm4gdXNlY3MgKiAxMDAwIC8gcXVhbnR1bV9uczsKKwlyZXR1cm4gdXNlY3MgKiAxMDAwIC8gZWZ4LT50aW1lcl9xdWFudHVtX25zOworfQorCit1bnNpZ25lZCBpbnQgZWZ4X3RpY2tzX3RvX3VzZWNzKHN0cnVjdCBlZnhfbmljICplZngsIHVuc2lnbmVkIGludCB0aWNrcykKK3sKKwkvKiBXZSBtdXN0IHJvdW5kIHVwIHdoZW4gY29udmVydGluZyB0aWNrcyB0byBtaWNyb3NlY29uZHMKKwkgKiBiZWNhdXNlIHdlIHJvdW5kIGRvd24gd2hlbiBjb252ZXJ0aW5nIHRoZSBvdGhlciB3YXkuCisJICovCisJcmV0dXJuIERJVl9ST1VORF9VUCh0aWNrcyAqIGVmeC0+dGltZXJfcXVhbnR1bV9ucywgMTAwMCk7CiB9CiAKIC8qIFNldCBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBwYXJhbWV0ZXJzICovCkBAIC0xOTY1LDIxICsxOTc5LDE2IEBACiAJCQkgICAgYm9vbCByeF9tYXlfb3ZlcnJpZGVfdHgpCiB7CiAJc3RydWN0IGVmeF9jaGFubmVsICpjaGFubmVsOwotCXVuc2lnbmVkIGludCBpcnFfbW9kX21heCA9IERJVl9ST1VORF9VUChlZngtPnR5cGUtPnRpbWVyX3BlcmlvZF9tYXggKgotCQkJCQkJZWZ4LT50aW1lcl9xdWFudHVtX25zLAotCQkJCQkJMTAwMCk7Ci0JdW5zaWduZWQgaW50IHR4X3RpY2tzOwotCXVuc2lnbmVkIGludCByeF90aWNrczsKKwl1bnNpZ25lZCBpbnQgdGltZXJfbWF4X3VzOwogCiAJRUZYX0FTU0VSVF9SRVNFVF9TRVJJQUxJU0VEKGVmeCk7CiAKLQlpZiAodHhfdXNlY3MgPiBpcnFfbW9kX21heCB8fCByeF91c2VjcyA+IGlycV9tb2RfbWF4KQorCXRpbWVyX21heF91cyA9IGVmeC0+dGltZXJfbWF4X25zIC8gMTAwMDsKKworCWlmICh0eF91c2VjcyA+IHRpbWVyX21heF91cyB8fCByeF91c2VjcyA+IHRpbWVyX21heF91cykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0eF90aWNrcyA9IGlycV9tb2RfdGlja3ModHhfdXNlY3MsIGVmeC0+dGltZXJfcXVhbnR1bV9ucyk7Ci0JcnhfdGlja3MgPSBpcnFfbW9kX3RpY2tzKHJ4X3VzZWNzLCBlZngtPnRpbWVyX3F1YW50dW1fbnMpOwotCi0JaWYgKHR4X3RpY2tzICE9IHJ4X3RpY2tzICYmIGVmeC0+dHhfY2hhbm5lbF9vZmZzZXQgPT0gMCAmJgorCWlmICh0eF91c2VjcyAhPSByeF91c2VjcyAmJiBlZngtPnR4X2NoYW5uZWxfb2Zmc2V0ID09IDAgJiYKIAkgICAgIXJ4X21heV9vdmVycmlkZV90eCkgewogCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgIkNoYW5uZWxzIGFyZSBzaGFyZWQuICIKIAkJCSAgIlJYIGFuZCBUWCBJUlEgbW9kZXJhdGlvbiBtdXN0IGJlIGVxdWFsXG4iKTsKQEAgLTE5ODcsMTIgKzE5OTYsMTIgQEAKIAl9CiAKIAllZngtPmlycV9yeF9hZGFwdGl2ZSA9IHJ4X2FkYXB0aXZlOwotCWVmeC0+aXJxX3J4X21vZGVyYXRpb24gPSByeF90aWNrczsKKwllZngtPmlycV9yeF9tb2RlcmF0aW9uX3VzID0gcnhfdXNlY3M7CiAJZWZ4X2Zvcl9lYWNoX2NoYW5uZWwoY2hhbm5lbCwgZWZ4KSB7CiAJCWlmIChlZnhfY2hhbm5lbF9oYXNfcnhfcXVldWUoY2hhbm5lbCkpCi0JCQljaGFubmVsLT5pcnFfbW9kZXJhdGlvbiA9IHJ4X3RpY2tzOworCQkJY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMgPSByeF91c2VjczsKIAkJZWxzZSBpZiAoZWZ4X2NoYW5uZWxfaGFzX3R4X3F1ZXVlcyhjaGFubmVsKSkKLQkJCWNoYW5uZWwtPmlycV9tb2RlcmF0aW9uID0gdHhfdGlja3M7CisJCQljaGFubmVsLT5pcnFfbW9kZXJhdGlvbl91cyA9IHR4X3VzZWNzOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjAwMSwyNiArMjAxMCwyMSBAQAogdm9pZCBlZnhfZ2V0X2lycV9tb2RlcmF0aW9uKHN0cnVjdCBlZnhfbmljICplZngsIHVuc2lnbmVkIGludCAqdHhfdXNlY3MsCiAJCQkgICAgdW5zaWduZWQgaW50ICpyeF91c2VjcywgYm9vbCAqcnhfYWRhcHRpdmUpCiB7Ci0JLyogV2UgbXVzdCByb3VuZCB1cCB3aGVuIGNvbnZlcnRpbmcgdGlja3MgdG8gbWljcm9zZWNvbmRzCi0JICogYmVjYXVzZSB3ZSByb3VuZCBkb3duIHdoZW4gY29udmVydGluZyB0aGUgb3RoZXIgd2F5LgotCSAqLwotCiAJKnJ4X2FkYXB0aXZlID0gZWZ4LT5pcnFfcnhfYWRhcHRpdmU7Ci0JKnJ4X3VzZWNzID0gRElWX1JPVU5EX1VQKGVmeC0+aXJxX3J4X21vZGVyYXRpb24gKgotCQkJCSBlZngtPnRpbWVyX3F1YW50dW1fbnMsCi0JCQkJIDEwMDApOworCSpyeF91c2VjcyA9IGVmeC0+aXJxX3J4X21vZGVyYXRpb25fdXM7CiAKIAkvKiBJZiBjaGFubmVscyBhcmUgc2hhcmVkIGJldHdlZW4gUlggYW5kIFRYLCBzbyBpcyBJUlEKIAkgKiBtb2RlcmF0aW9uLiAgT3RoZXJ3aXNlLCBJUlEgbW9kZXJhdGlvbiBpcyB0aGUgc2FtZSBmb3IgYWxsCiAJICogVFggY2hhbm5lbHMgYW5kIGlzIG5vdCBhZGFwdGl2ZS4KIAkgKi8KLQlpZiAoZWZ4LT50eF9jaGFubmVsX29mZnNldCA9PSAwKQorCWlmIChlZngtPnR4X2NoYW5uZWxfb2Zmc2V0ID09IDApIHsKIAkJKnR4X3VzZWNzID0gKnJ4X3VzZWNzOwotCWVsc2UKLQkJKnR4X3VzZWNzID0gRElWX1JPVU5EX1VQKAotCQkJZWZ4LT5jaGFubmVsW2VmeC0+dHhfY2hhbm5lbF9vZmZzZXRdLT5pcnFfbW9kZXJhdGlvbiAqCi0JCQllZngtPnRpbWVyX3F1YW50dW1fbnMsCi0JCQkxMDAwKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZWZ4X2NoYW5uZWwgKnR4X2NoYW5uZWw7CisKKwkJdHhfY2hhbm5lbCA9IGVmeC0+Y2hhbm5lbFtlZngtPnR4X2NoYW5uZWxfb2Zmc2V0XTsKKwkJKnR4X3VzZWNzID0gdHhfY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXM7CisJfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTIyNTksOCArMjI2MywxOCBAQAogCXJjID0gZWZ4X2NoZWNrX2Rpc2FibGVkKGVmeCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JaWYgKG5ld19tdHUgPiBFRlhfTUFYX01UVSkKKwlpZiAobmV3X210dSA+IEVGWF9NQVhfTVRVKSB7CisJCW5ldGlmX2VycihlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkJICAiUmVxdWVzdGVkIE1UVSBvZiAlZCB0b28gYmlnIChtYXg6ICVkKVxuIiwKKwkJCSAgbmV3X210dSwgRUZYX01BWF9NVFUpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG5ld19tdHUgPCBFRlhfTUlOX01UVSkgeworCQluZXRpZl9lcnIoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwKKwkJCSAgIlJlcXVlc3RlZCBNVFUgb2YgJWQgdG9vIHNtYWxsIChtaW46ICVkKVxuIiwKKwkJCSAgbmV3X210dSwgRUZYX01JTl9NVFUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAluZXRpZl9kYmcoZWZ4LCBkcnYsIGVmeC0+bmV0X2RldiwgImNoYW5naW5nIE1UVSB0byAlZFxuIiwgbmV3X210dSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguaAppbmRleCBjM2FlNzM5Li4zNDJhZTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5oCkBAIC0yMDQsNiArMjA0LDggQEAKIAogLyogR2xvYmFsICovCiB2b2lkIGVmeF9zY2hlZHVsZV9yZXNldChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBlbnVtIHJlc2V0X3R5cGUgdHlwZSk7Cit1bnNpZ25lZCBpbnQgZWZ4X3VzZWNzX3RvX3RpY2tzKHN0cnVjdCBlZnhfbmljICplZngsIHVuc2lnbmVkIGludCB1c2Vjcyk7Cit1bnNpZ25lZCBpbnQgZWZ4X3RpY2tzX3RvX3VzZWNzKHN0cnVjdCBlZnhfbmljICplZngsIHVuc2lnbmVkIGludCB0aWNrcyk7CiBpbnQgZWZ4X2luaXRfaXJxX21vZGVyYXRpb24oc3RydWN0IGVmeF9uaWMgKmVmeCwgdW5zaWduZWQgaW50IHR4X3VzZWNzLAogCQkJICAgIHVuc2lnbmVkIGludCByeF91c2VjcywgYm9vbCByeF9hZGFwdGl2ZSwKIAkJCSAgICBib29sIHJ4X21heV9vdmVycmlkZV90eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uLmMKaW5kZXggZDc5MGNiOC4uMWE3MDkyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb24uYwpAQCAtMzc4LDEyICszNzgsMTUgQEAKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gY2hhbm5lbC0+ZWZ4OwogCiAJLyogU2V0IHRpbWVyIHJlZ2lzdGVyICovCi0JaWYgKGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uKSB7CisJaWYgKGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzKSB7CisJCXVuc2lnbmVkIGludCB0aWNrczsKKworCQl0aWNrcyA9IGVmeF91c2Vjc190b190aWNrcyhlZngsIGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uX3VzKTsKIAkJRUZYX1BPUFVMQVRFX0RXT1JEXzIodGltZXJfY21kLAogCQkJCSAgICAgRlJGX0FCX1RDX1RJTUVSX01PREUsCiAJCQkJICAgICBGRkVfQkJfVElNRVJfTU9ERV9JTlRfSExET0ZGLAogCQkJCSAgICAgRlJGX0FCX1RDX1RJTUVSX1ZBTCwKLQkJCQkgICAgIGNoYW5uZWwtPmlycV9tb2RlcmF0aW9uIC0gMSk7CisJCQkJICAgICB0aWNrcyAtIDEpOwogCX0gZWxzZSB7CiAJCUVGWF9QT1BVTEFURV9EV09SRF8yKHRpbWVyX2NtZCwKIAkJCQkgICAgIEZSRl9BQl9UQ19USU1FUl9NT0RFLApAQCAtMjM3Myw2ICsyMzc2LDggQEAKIAkJCSAgICAgRUZYX01BWF9DSEFOTkVMUyk7CiAJZWZ4LT5tYXhfdHhfY2hhbm5lbHMgPSBlZngtPm1heF9jaGFubmVsczsKIAllZngtPnRpbWVyX3F1YW50dW1fbnMgPSA0OTY4OyAvKiA2MjEgY3ljbGVzICovCisJZWZ4LT50aW1lcl9tYXhfbnMgPSBlZngtPnR5cGUtPnRpbWVyX3BlcmlvZF9tYXggKgorCQkJICAgIGVmeC0+dGltZXJfcXVhbnR1bV9uczsKIAogCS8qIEluaXRpYWxpc2UgSTJDIGFkYXB0ZXIgKi8KIAlib2FyZCA9IGZhbGNvbl9ib2FyZChlZngpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbl9ib2FyZHMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb25fYm9hcmRzLmMKaW5kZXggMTczNmY0Yi4uZjY4ODNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbl9ib2FyZHMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uX2JvYXJkcy5jCkBAIC02NCw3ICs2NCw3IEBACiAjZGVmaW5lIExNODdfQUxBUk1fVEVNUF9JTlQJCTB4MTAKICNkZWZpbmUgTE04N19BTEFSTV9URU1QX0VYVDEJCTB4MjAKIAotI2lmIGRlZmluZWQoQ09ORklHX1NFTlNPUlNfTE04NykgfHwgZGVmaW5lZChDT05GSUdfU0VOU09SU19MTTg3X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TRU5TT1JTX0xNODcpCiAKIHN0YXRpYyBpbnQgZWZ4X3Bva2VfbG04NyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCB1OCAqcmVnX3ZhbHVlcykKIHsKQEAgLTQ1NSw3ICs0NTUsNyBAQAogCXN0cnVjdCBmYWxjb25fYm9hcmQgKmJvYXJkID0gZmFsY29uX2JvYXJkKGVmeCk7CiAJaW50IHJjOwogCi0jaWYgZGVmaW5lZChDT05GSUdfU0VOU09SU19MTTkwKSB8fCBkZWZpbmVkKENPTkZJR19TRU5TT1JTX0xNOTBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1NFTlNPUlNfTE05MCkKIAlib2FyZC0+aHdtb25fY2xpZW50ID0KIAkJaTJjX25ld19kZXZpY2UoJmJvYXJkLT5pMmNfYWRhcCwgJnNmZTQwMDFfaHdtb25faW5mbyk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhcmNoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFyY2guYwppbmRleCA0YzgzNzM5Li40NzYyZWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFyY2guYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFyY2guYwpAQCAtMTQ3Nyw5ICsxNDc3LDEwIEBACiAgKiBJbnRlcnJ1cHQgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBlbmFibGVkLCBvdGhlcndpc2UgbmFzdHkgdGhpbmdzCiAgKiBtYXkgaGFwcGVuLgogICovCi12b2lkIGVmeF9mYXJjaF9pcnFfdGVzdF9nZW5lcmF0ZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQoraW50IGVmeF9mYXJjaF9pcnFfdGVzdF9nZW5lcmF0ZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewogCWVmeF9mYXJjaF9pbnRlcnJ1cHRzKGVmeCwgdHJ1ZSwgdHJ1ZSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIFByb2Nlc3MgYSBmYXRhbCBpbnRlcnJ1cHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9tY2RpLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbWNkaS5jCmluZGV4IGQyOGU3ZGQuLjI0MTUyMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9tY2RpLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL21jZGkuYwpAQCAtNTQ4LDcgKzU0OCwxMCBAQAogCQllZnhfbWNkaV9kaXNwbGF5X2Vycm9yKGVmeCwgYXN5bmMtPmNtZCwgYXN5bmMtPmlubGVuLCBlcnJidWYsCiAJCQkJICAgICAgIGVycl9sZW4sIHJjKTsKIAl9Ci0JYXN5bmMtPmNvbXBsZXRlKGVmeCwgYXN5bmMtPmNvb2tpZSwgcmMsIG91dGJ1ZiwgZGF0YV9sZW4pOworCisJaWYgKGFzeW5jLT5jb21wbGV0ZSkKKwkJYXN5bmMtPmNvbXBsZXRlKGVmeCwgYXN5bmMtPmNvb2tpZSwgcmMsIG91dGJ1ZiwKKwkJCQltaW4oYXN5bmMtPm91dGxlbiwgZGF0YV9sZW4pKTsKIAlrZnJlZShhc3luYyk7CiAKIAllZnhfbWNkaV9yZWxlYXNlKG1jZGkpOwpAQCAtMTE1Myw3ICsxMTU2LDggQEAKIAkgKiBhY3F1aXJlZCBsb2NrcyBpbiB0aGUgd3Jvbmcgb3JkZXIuCiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFzeW5jLCBuZXh0LCAmbWNkaS0+YXN5bmNfbGlzdCwgbGlzdCkgewotCQlhc3luYy0+Y29tcGxldGUoZWZ4LCBhc3luYy0+Y29va2llLCAtRU5FVERPV04sIE5VTEwsIDApOworCQlpZiAoYXN5bmMtPmNvbXBsZXRlKQorCQkJYXN5bmMtPmNvbXBsZXRlKGVmeCwgYXN5bmMtPmNvb2tpZSwgLUVORVRET1dOLCBOVUxMLCAwKTsKIAkJbGlzdF9kZWwoJmFzeW5jLT5saXN0KTsKIAkJa2ZyZWUoYXN5bmMpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9tY2RpX3Bjb2wuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9tY2RpX3Bjb2wuaAppbmRleCBjOWE1YjAwLi5jY2NlYWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbWNkaV9wY29sLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL21jZGlfcGNvbC5oCkBAIC0yNjQ1LDE2ICsyNjQ1LDIwIEBACiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9QT0xMX0JJU1RfTUVNX0JVU19NQyAweDAKIC8qIGVudW06IENTUiBJUkVHIGJ1cy4gKi8KICNkZWZpbmUgICAgICAgICAgTUNfQ01EX1BPTExfQklTVF9NRU1fQlVTX0NTUiAweDEKLS8qIGVudW06IFJYIERQQ1BVIGJ1cy4gKi8KKy8qIGVudW06IFJYMCBEUENQVSBidXMuICovCiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9QT0xMX0JJU1RfTUVNX0JVU19EUENQVV9SWCAweDIKIC8qIGVudW06IFRYMCBEUENQVSBidXMuICovCiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9QT0xMX0JJU1RfTUVNX0JVU19EUENQVV9UWDAgMHgzCiAvKiBlbnVtOiBUWDEgRFBDUFUgYnVzLiAqLwogI2RlZmluZSAgICAgICAgICBNQ19DTURfUE9MTF9CSVNUX01FTV9CVVNfRFBDUFVfVFgxIDB4NAotLyogZW51bTogUlggRElDUFUgYnVzLiAqLworLyogZW51bTogUlgwIERJQ1BVIGJ1cy4gKi8KICNkZWZpbmUgICAgICAgICAgTUNfQ01EX1BPTExfQklTVF9NRU1fQlVTX0RJQ1BVX1JYIDB4NQogLyogZW51bTogVFggRElDUFUgYnVzLiAqLwogI2RlZmluZSAgICAgICAgICBNQ19DTURfUE9MTF9CSVNUX01FTV9CVVNfRElDUFVfVFggMHg2CisvKiBlbnVtOiBSWDEgRFBDUFUgYnVzLiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfUE9MTF9CSVNUX01FTV9CVVNfRFBDUFVfUlgxIDB4NworLyogZW51bTogUlgxIERJQ1BVIGJ1cy4gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX1BPTExfQklTVF9NRU1fQlVTX0RJQ1BVX1JYMSAweDgKIC8qIFBhdHRlcm4gd3JpdHRlbiB0byBSQU0gLyByZWdpc3RlciAqLwogI2RlZmluZSAgICAgICBNQ19DTURfUE9MTF9CSVNUX09VVF9NRU1fRVhQRUNUX09GU1QgMTYKIC8qIEFjdHVhbCB2YWx1ZSByZWFkIGZyb20gUkFNIC8gcmVnaXN0ZXIgKi8KQEAgLTM2MTIsNiArMzYxNiw4IEBACiAjZGVmaW5lICAgICAgICBNQ19DTURfTlZSQU1fSU5GT19PVVRfUFJPVEVDVEVEX1dJRFRIIDEKICNkZWZpbmUgICAgICAgIE1DX0NNRF9OVlJBTV9JTkZPX09VVF9UTFZfTEJOIDEKICNkZWZpbmUgICAgICAgIE1DX0NNRF9OVlJBTV9JTkZPX09VVF9UTFZfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX05WUkFNX0lORk9fT1VUX0NNQUNfTEJOIDYKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9OVlJBTV9JTkZPX09VVF9DTUFDX1dJRFRIIDEKICNkZWZpbmUgICAgICAgIE1DX0NNRF9OVlJBTV9JTkZPX09VVF9BX0JfTEJOIDcKICNkZWZpbmUgICAgICAgIE1DX0NNRF9OVlJBTV9JTkZPX09VVF9BX0JfV0lEVEggMQogI2RlZmluZSAgICAgICBNQ19DTURfTlZSQU1fSU5GT19PVVRfUEhZU0RFVl9PRlNUIDE2CkBAIC00Mzg5LDYgKzQzOTUsOCBAQAogICogdGhlIGNvbW1hbmQgd2lsbCBmYWlsIHdpdGggTUNfQ01EX0VSUl9GSUxURVJTX1BSRVNFTlQuCiAgKi8KICNkZWZpbmUgICAgICAgICAgTUNfQ01EX1dPUktBUk9VTkRfQlVHMjY4MDcgMHg2CisvKiBlbnVtOiBCdWcgNjEyNjUgd29yayBhcm91bmQgKGJyb2tlbiBFVlEgVE1SIHdyaXRlcykuICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9XT1JLQVJPVU5EX0JVRzYxMjY1IDB4NwogLyogMCA9IGRpc2FibGUgdGhlIHdvcmthcm91bmQgaW5kaWNhdGVkIGJ5IFRZUEU7IGFueSBub24temVybyB2YWx1ZSA9IGVuYWJsZQogICogdGhlIHdvcmthcm91bmQKICAqLwpAQCAtNDQxMyw3ICs0NDIxLDYgQEAKICAqIChHRVRfUEhZX0NGR19PVVRfTUVESUFfVFlQRSk7IHRoZSB2YWxpZCAncGFnZSBudW1iZXInIGlucHV0IHZhbHVlcywgYW5kIHRoZQogICogb3V0cHV0IGRhdGEsIGFyZSBpbnRlcnByZXRlZCBvbiBhIHBlci10eXBlIGJhc2lzLiBGb3IgU0ZQKzogUEFHRT0wIG9yIDEKICAqIHJldHVybnMgYSAxMjgtYnl0ZSBibG9jayByZWFkIGZyb20gbW9kdWxlIEkyQyBhZGRyZXNzIDB4QTAgb2Zmc2V0IDAgb3IgMHg4MC4KLSAqIEFueXRoaW5nIGVsc2U6IGN1cnJlbnRseSB1bmRlZmluZWQuIExvY2tzIHJlcXVpcmVkOiBOb25lLiBSZXR1cm4gY29kZTogMC4KICAqLwogI2RlZmluZSBNQ19DTURfR0VUX1BIWV9NRURJQV9JTkZPIDB4NGIKIApAQCAtNTQ3OSw2ICs1NDg2LDggQEAKICNkZWZpbmUgICAgICAgIExJQ0VOU0VEX1YzX0ZFQVRVUkVTX1RYX1NOSUZGX1dJRFRIIDEKICNkZWZpbmUgICAgICAgIExJQ0VOU0VEX1YzX0ZFQVRVUkVTX1BST1hZX0ZJTFRFUl9PUFNfTEJOIDgKICNkZWZpbmUgICAgICAgIExJQ0VOU0VEX1YzX0ZFQVRVUkVTX1BST1hZX0ZJTFRFUl9PUFNfV0lEVEggMQorI2RlZmluZSAgICAgICAgTElDRU5TRURfVjNfRkVBVFVSRVNfRVZFTlRfQ1VUX1RIUk9VR0hfTEJOIDkKKyNkZWZpbmUgICAgICAgIExJQ0VOU0VEX1YzX0ZFQVRVUkVTX0VWRU5UX0NVVF9USFJPVUdIX1dJRFRIIDEKICNkZWZpbmUgICAgICAgTElDRU5TRURfVjNfRkVBVFVSRVNfTUFTS19MQk4gMAogI2RlZmluZSAgICAgICBMSUNFTlNFRF9WM19GRUFUVVJFU19NQVNLX1dJRFRIIDY0CiAKQEAgLTU2MzQsNiArNTY0MywxMDkgQEAKIC8qIE9ubHkgdmFsaWQgaWYgSU5UUkZMQUcgd2FzIHRydWUgKi8KICNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX09VVF9JUlFfT0ZTVCAwCiAKKy8qIE1DX0NNRF9JTklUX0VWUV9WMl9JTiBtc2dyZXF1ZXN0ICovCisjZGVmaW5lICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9MRU5NSU4gNDQKKyNkZWZpbmUgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0xFTk1BWCA1NDgKKyNkZWZpbmUgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0xFTihudW0pICgzNis4KihudW0pKQorLyogU2l6ZSwgaW4gZW50cmllcyAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fU0laRV9PRlNUIDAKKy8qIERlc2lyZWQgaW5zdGFuY2UuIE11c3QgYmUgc2V0IHRvIGEgc3BlY2lmaWMgaW5zdGFuY2UsIHdoaWNoIGlzIGEgZnVuY3Rpb24KKyAqIGxvY2FsIHF1ZXVlIGluZGV4LgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9JTlNUQU5DRV9PRlNUIDQKKy8qIFRoZSBpbml0aWFsIHRpbWVyIHZhbHVlLiBUaGUgbG9hZCB2YWx1ZSBpcyBpZ25vcmVkIGlmIHRoZSB0aW1lciBtb2RlIGlzIERJUy4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fVE1SX0xPQURfT0ZTVCA4CisvKiBUaGUgcmVsb2FkIHZhbHVlIGlzIGlnbm9yZWQgaW4gb25lLXNob3QgbW9kZXMgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX1RNUl9SRUxPQURfT0ZTVCAxMgorLyogdGJkICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHU19PRlNUIDE2CisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19JTlRFUlJVUFRJTkdfTEJOIDAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX0lOVEVSUlVQVElOR19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19SUFRSX0RPU19MQk4gMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfUlBUUl9ET1NfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfSU5UX0FSTURfTEJOIDIKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX0lOVF9BUk1EX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX0NVVF9USFJVX0xCTiAzCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19DVVRfVEhSVV9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19SWF9NRVJHRV9MQk4gNAorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfUlhfTUVSR0VfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfVFhfTUVSR0VfTEJOIDUKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1RYX01FUkdFX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1VTRV9USU1FUl9MQk4gNgorI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfVVNFX1RJTUVSX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1RZUEVfTEJOIDcKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1RZUEVfV0lEVEggNAorLyogZW51bTogQWxsIGluaXRpYWxpc2F0aW9uIGZsYWdzIHNwZWNpZmllZCBieSBob3N0LiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRkxBR19UWVBFX01BTlVBTCAweDAKKy8qIGVudW06IE1FREZPUkQgb25seS4gQ2VydGFpbiBpbml0aWFsaXNhdGlvbiBmbGFncyBzcGVjaWZpZWQgYnkgaG9zdCBtYXkgYmUKKyAqIG92ZXItcmlkZGVuIGJ5IGZpcm13YXJlIGJhc2VkIG9uIGxpY2Vuc2VzIGFuZCBmaXJtd2FyZSB2YXJpYW50IGluIG9yZGVyIHRvCisgKiBwcm92aWRlIHRoZSBsb3dlc3QgbGF0ZW5jeSBhY2hpZXZhYmxlLiBTZWUKKyAqIE1DX0NNRF9JTklUX0VWUV9WMi9NQ19DTURfSU5JVF9FVlFfVjJfT1VUL0ZMQUdTIGZvciBsaXN0IG9mIGFmZmVjdGVkIGZsYWdzLgorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9GTEFHX1RZUEVfTE9XX0xBVEVOQ1kgMHgxCisvKiBlbnVtOiBNRURGT1JEIG9ubHkuIENlcnRhaW4gaW5pdGlhbGlzYXRpb24gZmxhZ3Mgc3BlY2lmaWVkIGJ5IGhvc3QgbWF5IGJlCisgKiBvdmVyLXJpZGRlbiBieSBmaXJtd2FyZSBiYXNlZCBvbiBsaWNlbnNlcyBhbmQgZmlybXdhcmUgdmFyaWFudCBpbiBvcmRlciB0bworICogcHJvdmlkZSB0aGUgYmVzdCB0aHJvdWdocHV0IGFjaGlldmFibGUuIFNlZQorICogTUNfQ01EX0lOSVRfRVZRX1YyL01DX0NNRF9JTklUX0VWUV9WMl9PVVQvRkxBR1MgZm9yIGxpc3Qgb2YgYWZmZWN0ZWQgZmxhZ3MuCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfVFlQRV9USFJPVUdIUFVUIDB4MgorLyogZW51bTogTUVERk9SRCBvbmx5LiBDZXJ0YWluIGluaXRpYWxpc2F0aW9uIGZsYWdzIG1heSBiZSBvdmVyLXJpZGRlbiBieQorICogZmlybXdhcmUgYmFzZWQgb24gbGljZW5zZXMgYW5kIGZpcm13YXJlIHZhcmlhbnQuIFNlZQorICogTUNfQ01EX0lOSVRfRVZRX1YyL01DX0NNRF9JTklUX0VWUV9WMl9PVVQvRkxBR1MgZm9yIGxpc3Qgb2YgYWZmZWN0ZWQgZmxhZ3MuCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0ZMQUdfVFlQRV9BVVRPIDB4MworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fVE1SX01PREVfT0ZTVCAyMAorLyogZW51bTogRGlzYWJsZWQgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX1RNUl9NT0RFX0RJUyAweDAKKy8qIGVudW06IEltbWVkaWF0ZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fVE1SX0lNTUVEX1NUQVJUIDB4MQorLyogZW51bTogVHJpZ2dlcmVkICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9UTVJfVFJJR19TVEFSVCAweDIKKy8qIGVudW06IEhvbGQtb2ZmICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9UTVJfSU5UX0hMRE9GRiAweDMKKy8qIFRhcmdldCBFVlEgZm9yIHdha2V1cHMgaWYgaW4gd2FrZXVwIG1vZGUuICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9UQVJHRVRfRVZRX09GU1QgMjQKKy8qIFRhcmdldCBpbnRlcnJ1cHQgaWYgaW4gaW50ZXJydXB0aW5nIG1vZGUgKG5vdGUgdW5pb24gd2l0aCB0YXJnZXQgRVZRKS4gVXNlCisgKiBNQ19DTURfUkVTT1VSQ0VfSU5TVEFOQ0VfQU5ZIHVubGVzcyBhIHNwZWNpZmljIG9uZSByZXF1aXJlZCBmb3IgdGVzdAorICogcHVycG9zZXMuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0lSUV9OVU1fT0ZTVCAyNAorLyogRXZlbnQgQ291bnRlciBNb2RlLiAqLworI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fQ09VTlRfTU9ERV9PRlNUIDI4CisvKiBlbnVtOiBEaXNhYmxlZCAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fQ09VTlRfTU9ERV9ESVMgMHgwCisvKiBlbnVtOiBEaXNhYmxlZCAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fQ09VTlRfTU9ERV9SWCAweDEKKy8qIGVudW06IERpc2FibGVkICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9DT1VOVF9NT0RFX1RYIDB4MgorLyogZW51bTogRGlzYWJsZWQgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0NPVU5UX01PREVfUlhUWCAweDMKKy8qIEV2ZW50IHF1ZXVlIHBhY2tldCBjb3VudCB0aHJlc2hvbGQuICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9DT1VOVF9USFJTSExEX09GU1QgMzIKKy8qIDY0LWJpdCBhZGRyZXNzIG9mIDRrIG9mIDRrLWFsaWduZWQgaG9zdCBtZW1vcnkgYnVmZmVyICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9ETUFfQUREUl9PRlNUIDM2CisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9JTl9ETUFfQUREUl9MRU4gOAorI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRE1BX0FERFJfTE9fT0ZTVCAzNgorI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRE1BX0FERFJfSElfT0ZTVCA0MAorI2RlZmluZSAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfSU5fRE1BX0FERFJfTUlOTlVNIDEKKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX0lOX0RNQV9BRERSX01BWE5VTSA2NAorCisvKiBNQ19DTURfSU5JVF9FVlFfVjJfT1VUIG1zZ3Jlc3BvbnNlICovCisjZGVmaW5lICAgIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfTEVOIDgKKy8qIE9ubHkgdmFsaWQgaWYgSU5UUkZMQUcgd2FzIHRydWUgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfRVZRX1YyX09VVF9JUlFfT0ZTVCAwCisvKiBBY3R1YWwgY29uZmlndXJhdGlvbiBhcHBsaWVkIG9uIHRoZSBjYXJkICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfRkxBR1NfT0ZTVCA0CisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0ZMQUdfQ1VUX1RIUlVfTEJOIDAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfRkxBR19DVVRfVEhSVV9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0ZMQUdfUlhfTUVSR0VfTEJOIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfRkxBR19SWF9NRVJHRV9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0ZMQUdfVFhfTUVSR0VfTEJOIDIKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfRkxBR19UWF9NRVJHRV9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9FVlFfVjJfT1VUX0ZMQUdfUlhRX0ZPUkNFX0VWX01FUkdJTkdfTEJOIDMKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX0VWUV9WMl9PVVRfRkxBR19SWFFfRk9SQ0VfRVZfTUVSR0lOR19XSURUSCAxCisKIC8qIFFVRVVFX0NSQ19NT0RFIHN0cnVjdHVyZWRlZiAqLwogI2RlZmluZSAgICBRVUVVRV9DUkNfTU9ERV9MRU4gMQogI2RlZmluZSAgICAgICBRVUVVRV9DUkNfTU9ERV9NT0RFX0xCTiAwCkBAIC01Njk3LDggKzU4MDksOCBAQAogI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfUlhRX0lOX0ZMQUdfUFJFRklYX1dJRFRIIDEKICNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX1JYUV9JTl9GTEFHX0RJU0FCTEVfU0NBVFRFUl9MQk4gOQogI2RlZmluZSAgICAgICAgTUNfQ01EX0lOSVRfUlhRX0lOX0ZMQUdfRElTQUJMRV9TQ0FUVEVSX1dJRFRIIDEKLSNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX1JYUV9JTl9GTEFHX0ZPUkNFX0VWX01FUkdJTkdfTEJOIDEwCi0jZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9SWFFfSU5fRkxBR19GT1JDRV9FVl9NRVJHSU5HX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9JTklUX1JYUV9JTl9VTlVTRURfTEJOIDEwCisjZGVmaW5lICAgICAgICBNQ19DTURfSU5JVF9SWFFfSU5fVU5VU0VEX1dJRFRIIDEKIC8qIE93bmVyIElEIHRvIHVzZSBpZiBpbiBidWZmZXIgbW9kZSAoemVybyBpZiBwaHlzaWNhbCkgKi8KICNkZWZpbmUgICAgICAgTUNfQ01EX0lOSVRfUlhRX0lOX09XTkVSX0lEX09GU1QgMjAKIC8qIFRoZSBwb3J0IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdi1hZGFwdG9yIHdoaWNoIHNob3VsZCBjb250YWluIHRoaXMgRE1BUS4gKi8KQEAgLTc4NTQsNiArNzk2NiwyMCBAQAogI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX0VWRU5UX0NVVF9USFJPVUdIX1dJRFRIIDEKICNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9SWF9DVVRfVEhST1VHSF9MQk4gNAogI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1JYX0NVVF9USFJPVUdIX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9UWF9WRklGT19VTExfTU9ERV9MQk4gNQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX1RYX1ZGSUZPX1VMTF9NT0RFX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9NQUNfU1RBVFNfNDBHX1RYX1NJWkVfQklOU19MQk4gNgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX01BQ19TVEFUU180MEdfVFhfU0laRV9CSU5TX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9JTklUX0VWUV9WMl9MQk4gNworI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjJfT1VUX0lOSVRfRVZRX1YyX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9UWF9NQUNfVElNRVNUQU1QSU5HX0xCTiA4CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfVFhfTUFDX1RJTUVTVEFNUElOR19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfVFhfVElNRVNUQU1QX0xCTiA5CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfVFhfVElNRVNUQU1QX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9SWF9TTklGRl9MQk4gMTAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9SWF9TTklGRl9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfVFhfU05JRkZfTEJOIDExCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfVFhfU05JRkZfV0lEVEggMQogLyogTnVtYmVyIG9mIEZBVFNPdjIgY29udGV4dHMgcGVyIGRhdGFwYXRoIHN1cHBvcnRlZCBieSB0aGlzIE5JQy4gTm90IHByZXNlbnQKICAqIG9uIG9sZGVyIGZpcm13YXJlIChjaGVjayB0aGUgbGVuZ3RoKS4KICAqLwpAQCAtNzkxMCw2ICs4MDM2LDI4OCBAQAogI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WMl9PVVRfU0laRV9QSU9fQlVGRl9PRlNUIDcwCiAjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YyX09VVF9TSVpFX1BJT19CVUZGX0xFTiAyCiAKKy8qIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVCBtc2dyZXNwb25zZSAqLworI2RlZmluZSAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTEVOIDczCisvKiBGaXJzdCB3b3JkIG9mIGZsYWdzLiAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRkxBR1MxX09GU1QgMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZQT1JUX1JFQ09ORklHVVJFX0xCTiAzCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVlBPUlRfUkVDT05GSUdVUkVfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1NUUklQSU5HX0xCTiA0CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfU1RSSVBJTkdfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZBREFQVE9SX1FVRVJZX0xCTiA1CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVkFEQVBUT1JfUVVFUllfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0VWQl9QT1JUX1ZMQU5fUkVTVFJJQ1RfTEJOIDYKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9FVkJfUE9SVF9WTEFOX1JFU1RSSUNUX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9EUlZfQVRUQUNIX1BSRUJPT1RfTEJOIDcKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9EUlZfQVRUQUNIX1BSRUJPT1RfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0ZPUkNFX0VWRU5UX01FUkdJTkdfTEJOIDgKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9GT1JDRV9FVkVOVF9NRVJHSU5HX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9TRVRfTUFDX0VOSEFOQ0VEX0xCTiA5CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfU0VUX01BQ19FTkhBTkNFRF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVU5LTk9XTl9VQ0FTVF9EU1RfRklMVEVSX0FMV0FZU19NVUxUSV9SRUNJUElFTlRfTEJOIDEwCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVU5LTk9XTl9VQ0FTVF9EU1RfRklMVEVSX0FMV0FZU19NVUxUSV9SRUNJUElFTlRfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1ZBREFQVE9SX1BFUk1JVF9TRVRfTUFDX1dIRU5fRklMVEVSU19JTlNUQUxMRURfTEJOIDExCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVkFEQVBUT1JfUEVSTUlUX1NFVF9NQUNfV0hFTl9GSUxURVJTX0lOU1RBTExFRF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfTUFDX1NFQ1VSSVRZX0ZJTFRFUklOR19MQk4gMTIKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9NQUNfU0VDVVJJVFlfRklMVEVSSU5HX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9BRERJVElPTkFMX1JTU19NT0RFU19MQk4gMTMKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9BRERJVElPTkFMX1JTU19NT0RFU19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUUJCX0xCTiAxNAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1FCQl9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfUEFDS0VEX1NUUkVBTV9WQVJfQlVGRkVSU19MQk4gMTUKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9QQUNLRURfU1RSRUFNX1ZBUl9CVUZGRVJTX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9SU1NfTElNSVRFRF9MQk4gMTYKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9SU1NfTElNSVRFRF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfUEFDS0VEX1NUUkVBTV9MQk4gMTcKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9QQUNLRURfU1RSRUFNX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9JTkNMVURFX0ZDU19MQk4gMTgKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9JTkNMVURFX0ZDU19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVkxBTl9JTlNFUlRJT05fTEJOIDE5CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVkxBTl9JTlNFUlRJT05fV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1ZMQU5fU1RSSVBQSU5HX0xCTiAyMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1ZMQU5fU1RSSVBQSU5HX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9UU09fTEJOIDIxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVFNPX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9QUkVGSVhfTEVOXzBfTEJOIDIyCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfUFJFRklYX0xFTl8wX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9QUkVGSVhfTEVOXzE0X0xCTiAyMworI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1BSRUZJWF9MRU5fMTRfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX1RJTUVTVEFNUF9MQk4gMjQKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9USU1FU1RBTVBfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0JBVENISU5HX0xCTiAyNQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0JBVENISU5HX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9NQ0FTVF9GSUxURVJfQ0hBSU5JTkdfTEJOIDI2CisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTUNBU1RfRklMVEVSX0NIQUlOSU5HX1dJRFRIIDEKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9QTV9BTkRfUlhEUF9DT1VOVEVSU19MQk4gMjcKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9QTV9BTkRfUlhEUF9DT1VOVEVSU19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfRElTQUJMRV9TQ0FUVEVSX0xCTiAyOAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0RJU0FCTEVfU0NBVFRFUl9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfTUNBU1RfVURQX0xPT1BCQUNLX0xCTiAyOQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX01DQVNUX1VEUF9MT09QQkFDS19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRVZCX0xCTiAzMAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX0VWQl9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVlhMQU5fTlZHUkVfTEJOIDMxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVlhMQU5fTlZHUkVfV0lEVEggMQorLyogUnhEUENQVSBmaXJtd2FyZSBpZC4gKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0RQQ1BVX0ZXX0lEX09GU1QgNAorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfRFBDUFVfRldfSURfTEVOIDIKKy8qIGVudW06IFN0YW5kYXJkIFJYRFAgZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFAgIDB4MAorLyogZW51bTogTG93IGxhdGVuY3kgUlhEUCBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9MT1dfTEFURU5DWSAgMHgxCisvKiBlbnVtOiBQYWNrZWQgc3RyZWFtIFJYRFAgZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfUEFDS0VEX1NUUkVBTSAgMHgyCisvKiBlbnVtOiBCSVNUIFJYRFAgZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfQklTVCAgMHgxMGEKKy8qIGVudW06IFJYRFAgVGVzdCBmaXJtd2FyZSBpbWFnZSAxICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX1RFU1RfRldfVE9fTUNfQ1VUX1RIUk9VR0ggIDB4MTAxCisvKiBlbnVtOiBSWERQIFRlc3QgZmlybXdhcmUgaW1hZ2UgMiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9URVNUX0ZXX1RPX01DX1NUT1JFX0ZPUldBUkQgIDB4MTAyCisvKiBlbnVtOiBSWERQIFRlc3QgZmlybXdhcmUgaW1hZ2UgMyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9URVNUX0ZXX1RPX01DX1NUT1JFX0ZPUldBUkRfRklSU1QgIDB4MTAzCisvKiBlbnVtOiBSWERQIFRlc3QgZmlybXdhcmUgaW1hZ2UgNCAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9URVNUX0VWRVJZX0VWRU5UX0JBVENIQUJMRSAgMHgxMDQKKy8qIGVudW06IFJYRFAgVGVzdCBmaXJtd2FyZSBpbWFnZSA1ICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX1RFU1RfQkFDS1BSRVNTVVJFICAweDEwNQorLyogZW51bTogUlhEUCBUZXN0IGZpcm13YXJlIGltYWdlIDYgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYRFBfVEVTVF9GV19QQUNLRVRfRURJVFMgIDB4MTA2CisvKiBlbnVtOiBSWERQIFRlc3QgZmlybXdhcmUgaW1hZ2UgNyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhEUF9URVNUX0ZXX1JYX0hEUl9TUExJVCAgMHgxMDcKKy8qIGVudW06IFJYRFAgVGVzdCBmaXJtd2FyZSBpbWFnZSA4ICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX1RFU1RfRldfRElTQUJMRV9ETCAgMHgxMDgKKy8qIGVudW06IFJYRFAgVGVzdCBmaXJtd2FyZSBpbWFnZSA5ICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWERQX1RFU1RfRldfRE9PUkJFTExfREVMQVkgIDB4MTBiCisvKiBUeERQQ1BVIGZpcm13YXJlIGlkLiAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfRFBDUFVfRldfSURfT0ZTVCA2CisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9EUENQVV9GV19JRF9MRU4gMgorLyogZW51bTogU3RhbmRhcmQgVFhEUCBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhEUCAgMHgwCisvKiBlbnVtOiBMb3cgbGF0ZW5jeSBUWERQIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWERQX0xPV19MQVRFTkNZICAweDEKKy8qIGVudW06IEhpZ2ggcGFja2V0IHJhdGUgVFhEUCBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhEUF9ISUdIX1BBQ0tFVF9SQVRFICAweDMKKy8qIGVudW06IEJJU1QgVFhEUCBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhEUF9CSVNUICAweDEyZAorLyogZW51bTogVFhEUCBUZXN0IGZpcm13YXJlIGltYWdlIDEgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYRFBfVEVTVF9GV19UU09fRURJVCAgMHgxMDEKKy8qIGVudW06IFRYRFAgVGVzdCBmaXJtd2FyZSBpbWFnZSAyICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWERQX1RFU1RfRldfUEFDS0VUX0VESVRTICAweDEwMgorLyogZW51bTogVFhEUCBDU1IgYnVzIHRlc3QgZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYRFBfVEVTVF9GV19DU1IgIDB4MTAzCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1ZFUlNJT05fT0ZTVCA4CisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1ZFUlNJT05fTEVOIDIKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1ZFUlNJT05fUkVWX0xCTiAwCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19WRVJTSU9OX1JFVl9XSURUSCAxMgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVkVSU0lPTl9UWVBFX0xCTiAxMgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVkVSU0lPTl9UWVBFX1dJRFRIIDQKKy8qIGVudW06IHJlc2VydmVkIHZhbHVlIC0gZG8gbm90IHVzZSAobWF5IGluZGljYXRlIGFsdGVybmF0aXZlIGludGVycHJldGF0aW9uCisgKiBvZiBSRVYgZmllbGQgaW4gZnV0dXJlKQorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1RZUEVfUkVTRVJWRUQgIDB4MAorLyogZW51bTogVHJpdmlhbCBSWCBQRCBmaXJtd2FyZSBmb3IgZWFybHkgSHVudGluZ3RvbiBkZXZlbG9wbWVudCAoSHVudGluZ3RvbgorICogZGV2ZWxvcG1lbnQgb25seSkKKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19UWVBFX0ZJUlNUX1BLVCAgMHgxCisvKiBlbnVtOiBSWCBQRCBmaXJtd2FyZSB3aXRoIGFwcHJveGltYXRlbHkgU2llbmEtY29tcGF0aWJsZSBiZWhhdmlvdXIKKyAqIChIdW50aW5ndG9uIGRldmVsb3BtZW50IG9ubHkpCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVFlQRV9TSUVOQV9DT01QQVQgIDB4MgorLyogZW51bTogVmlydHVhbCBzd2l0Y2hpbmcgKGZ1bGwgZmVhdHVyZSkgUlggUEQgcHJvZHVjdGlvbiBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19UWVBFX1ZTV0lUQ0ggIDB4MworLyogZW51bTogc2llbmFfY29tcGF0IHZhcmlhbnQgUlggUEQgZmlybXdhcmUgdXNpbmcgUE0gcmF0aGVyIHRoYW4gTUFDCisgKiAoSHVudGluZ3RvbiBkZXZlbG9wbWVudCBvbmx5KQorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1RZUEVfU0lFTkFfQ09NUEFUX1BNICAweDQKKy8qIGVudW06IExvdyBsYXRlbmN5IFJYIFBEIHByb2R1Y3Rpb24gZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVFlQRV9MT1dfTEFURU5DWSAgMHg1CisvKiBlbnVtOiBQYWNrZWQgc3RyZWFtIFJYIFBEIHByb2R1Y3Rpb24gZmlybXdhcmUgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVFlQRV9QQUNLRURfU1RSRUFNICAweDYKKy8qIGVudW06IFJYIFBEIGZpcm13YXJlIGhhbmRsaW5nIGxheWVyIDIgb25seSBmb3IgaGlnaCBwYWNrZXQgcmF0ZSBwZXJmb3JtYW5jZQorICogdGVzdHMgKE1lZGZvcmQgZGV2ZWxvcG1lbnQgb25seSkKKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhQRF9GV19UWVBFX0xBWUVSMl9QRVJGICAweDcKKy8qIGVudW06IFJ1bGVzIGVuZ2luZSBSWCBQRCBwcm9kdWN0aW9uIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWFBEX0ZXX1RZUEVfUlVMRVNfRU5HSU5FICAweDgKKy8qIGVudW06IFJYIFBEIGZpcm13YXJlIGZvciBHVUUgcGFyc2luZyBwcm90b3R5cGUgKE1lZGZvcmQgZGV2ZWxvcG1lbnQgb25seSkgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVFlQRV9URVNURldfR1VFX1BST1RPVFlQRSAgMHhlCisvKiBlbnVtOiBSWCBQRCBmaXJtd2FyZSBwYXJzaW5nIGJ1dCBub3QgZmlsdGVyaW5nIG5ldHdvcmsgb3ZlcmxheSB0dW5uZWwKKyAqIGVuY2Fwc3VsYXRpb25zIChNZWRmb3JkIGRldmVsb3BtZW50IG9ubHkpCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYUERfRldfVFlQRV9URVNURldfRU5DQVBfUEFSU0lOR19PTkxZICAweGYKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVkVSU0lPTl9PRlNUIDEwCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1ZFUlNJT05fTEVOIDIKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1ZFUlNJT05fUkVWX0xCTiAwCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19WRVJTSU9OX1JFVl9XSURUSCAxMgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVkVSU0lPTl9UWVBFX0xCTiAxMgorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVkVSU0lPTl9UWVBFX1dJRFRIIDQKKy8qIGVudW06IHJlc2VydmVkIHZhbHVlIC0gZG8gbm90IHVzZSAobWF5IGluZGljYXRlIGFsdGVybmF0aXZlIGludGVycHJldGF0aW9uCisgKiBvZiBSRVYgZmllbGQgaW4gZnV0dXJlKQorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1RZUEVfUkVTRVJWRUQgIDB4MAorLyogZW51bTogVHJpdmlhbCBUWCBQRCBmaXJtd2FyZSBmb3IgZWFybHkgSHVudGluZ3RvbiBkZXZlbG9wbWVudCAoSHVudGluZ3RvbgorICogZGV2ZWxvcG1lbnQgb25seSkKKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19UWVBFX0ZJUlNUX1BLVCAgMHgxCisvKiBlbnVtOiBUWCBQRCBmaXJtd2FyZSB3aXRoIGFwcHJveGltYXRlbHkgU2llbmEtY29tcGF0aWJsZSBiZWhhdmlvdXIKKyAqIChIdW50aW5ndG9uIGRldmVsb3BtZW50IG9ubHkpCisgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVFlQRV9TSUVOQV9DT01QQVQgIDB4MgorLyogZW51bTogVmlydHVhbCBzd2l0Y2hpbmcgKGZ1bGwgZmVhdHVyZSkgVFggUEQgcHJvZHVjdGlvbiBmaXJtd2FyZSAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19UWVBFX1ZTV0lUQ0ggIDB4MworLyogZW51bTogc2llbmFfY29tcGF0IHZhcmlhbnQgVFggUEQgZmlybXdhcmUgdXNpbmcgUE0gcmF0aGVyIHRoYW4gTUFDCisgKiAoSHVudGluZ3RvbiBkZXZlbG9wbWVudCBvbmx5KQorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1RZUEVfU0lFTkFfQ09NUEFUX1BNICAweDQKKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVFlQRV9MT1dfTEFURU5DWSAgMHg1IC8qIGVudW0gKi8KKy8qIGVudW06IFRYIFBEIGZpcm13YXJlIGhhbmRsaW5nIGxheWVyIDIgb25seSBmb3IgaGlnaCBwYWNrZXQgcmF0ZSBwZXJmb3JtYW5jZQorICogdGVzdHMgKE1lZGZvcmQgZGV2ZWxvcG1lbnQgb25seSkKKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhQRF9GV19UWVBFX0xBWUVSMl9QRVJGICAweDcKKy8qIGVudW06IFJ1bGVzIGVuZ2luZSBUWCBQRCBwcm9kdWN0aW9uIGZpcm13YXJlICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWFBEX0ZXX1RZUEVfUlVMRVNfRU5HSU5FICAweDgKKy8qIGVudW06IFJYIFBEIGZpcm13YXJlIGZvciBHVUUgcGFyc2luZyBwcm90b3R5cGUgKE1lZGZvcmQgZGV2ZWxvcG1lbnQgb25seSkgKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYUERfRldfVFlQRV9URVNURldfR1VFX1BST1RPVFlQRSAgMHhlCisvKiBIYXJkd2FyZSBjYXBhYmlsaXRpZXMgb2YgTklDICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9IV19DQVBBQklMSVRJRVNfT0ZTVCAxMgorLyogTGljZW5zZWQgY2FwYWJpbGl0aWVzICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9MSUNFTlNFX0NBUEFCSUxJVElFU19PRlNUIDE2CisvKiBTZWNvbmQgd29yZCBvZiBmbGFncy4gTm90IHByZXNlbnQgb24gb2xkZXIgZmlybXdhcmUgKGNoZWNrIHRoZSBsZW5ndGgpLiAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRkxBR1MyX09GU1QgMjAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9UU09fVjJfTEJOIDAKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9UU09fVjJfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1RTT19WMl9FTkNBUF9MQk4gMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1RTT19WMl9FTkNBUF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRVZRX1RJTUVSX0NUUkxfTEJOIDIKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9FVlFfVElNRVJfQ1RSTF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfRVZFTlRfQ1VUX1RIUk9VR0hfTEJOIDMKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9FVkVOVF9DVVRfVEhST1VHSF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfQ1VUX1RIUk9VR0hfTEJOIDQKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9DVVRfVEhST1VHSF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfVkZJRk9fVUxMX01PREVfTEJOIDUKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9UWF9WRklGT19VTExfTU9ERV9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTUFDX1NUQVRTXzQwR19UWF9TSVpFX0JJTlNfTEJOIDYKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9NQUNfU1RBVFNfNDBHX1RYX1NJWkVfQklOU19XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfSU5JVF9FVlFfVjJfTEJOIDcKKyNkZWZpbmUgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9JTklUX0VWUV9WMl9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfTUFDX1RJTUVTVEFNUElOR19MQk4gOAorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX01BQ19USU1FU1RBTVBJTkdfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1RJTUVTVEFNUF9MQk4gOQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1RJTUVTVEFNUF9XSURUSCAxCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfU05JRkZfTEJOIDEwCisjZGVmaW5lICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUlhfU05JRkZfV0lEVEggMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1NOSUZGX0xCTiAxMQorI2RlZmluZSAgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1NOSUZGX1dJRFRIIDEKKy8qIE51bWJlciBvZiBGQVRTT3YyIGNvbnRleHRzIHBlciBkYXRhcGF0aCBzdXBwb3J0ZWQgYnkgdGhpcyBOSUMuIE5vdCBwcmVzZW50CisgKiBvbiBvbGRlciBmaXJtd2FyZSAoY2hlY2sgdGhlIGxlbmd0aCkuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1RTT19WMl9OX0NPTlRFWFRTX09GU1QgMjQKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX1RTT19WMl9OX0NPTlRFWFRTX0xFTiAyCisvKiBPbmUgYnl0ZSBwZXIgUEYgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHRoZSBleHRlcm5hbCBwb3J0IGFzc2lnbmVkIHRvIHRoaXMKKyAqIFBGLCBpbmRleGVkIGJ5IFBGIG51bWJlci4gU3BlY2lhbCB2YWx1ZXMgaW5kaWNhdGUgdGhhdCBhIFBGIGlzIGVpdGhlciBub3QKKyAqIHByZXNlbnQgb3Igbm90IGFzc2lnbmVkLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9QRlNfVE9fUE9SVFNfQVNTSUdOTUVOVF9PRlNUIDI2CisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9QRlNfVE9fUE9SVFNfQVNTSUdOTUVOVF9MRU4gMQorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUEZTX1RPX1BPUlRTX0FTU0lHTk1FTlRfTlVNIDE2CisvKiBlbnVtOiBUaGUgY2FsbGVyIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYWNjZXNzIGluZm9ybWF0aW9uIG9uIHRoaXMgUEYuICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9BQ0NFU1NfTk9UX1BFUk1JVFRFRCAgMHhmZgorLyogZW51bTogUEYgZG9lcyBub3QgZXhpc3QuICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9QRl9OT1RfUFJFU0VOVCAgMHhmZQorLyogZW51bTogUEYgZG9lcyBleGlzdCBidXQgaXMgbm90IGFzc2lnbmVkIHRvIGFueSBleHRlcm5hbCBwb3J0LiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfUEZfTk9UX0FTU0lHTkVEICAweGZkCisvKiBlbnVtOiBUaGlzIHZhbHVlIGluZGljYXRlcyB0aGF0IFBGIGlzIGFzc2lnbmVkLCBidXQgaXQgY2Fubm90IGJlIGV4cHJlc3NlZAorICogaW4gdGhpcyBmaWVsZC4gSXQgaXMgaW50ZW5kZWQgZm9yIGEgcG9zc2libGUgZnV0dXJlIHNpdHVhdGlvbiB3aGVyZSBhIG1vcmUKKyAqIGNvbXBsZXggc2NoZW1lIG9mIFBGcyB0byBwb3J0cyBtYXBwaW5nIGlzIGJlaW5nIHVzZWQuIFRoZSBmdXR1cmUgZHJpdmVyCisgKiBzaG91bGQgbG9vayBmb3IgYSBuZXcgZmllbGQgc3VwcG9ydGluZyB0aGUgbmV3IHNjaGVtZS4gVGhlIGN1cnJlbnQvb2xkCisgKiBkcml2ZXIgc2hvdWxkIHRyZWF0IHRoaXMgdmFsdWUgYXMgUEZfTk9UX0FTU0lHTkVELgorICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9JTkNPTVBBVElCTEVfQVNTSUdOTUVOVCAgMHhmYworLyogT25lIGJ5dGUgcGVyIFBGIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBpdHMgVkZzLCBpbmRleGVkIGJ5IFBGIG51bWJlci4gQQorICogc3BlY2lhbCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBhIFBGIGlzIG5vdCBwcmVzZW50LgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9OVU1fVkZTX1BFUl9QRl9PRlNUIDQyCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9OVU1fVkZTX1BFUl9QRl9MRU4gMQorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTlVNX1ZGU19QRVJfUEZfTlVNIDE2CisvKiBlbnVtOiBUaGUgY2FsbGVyIGlzIG5vdCBwZXJtaXR0ZWQgdG8gYWNjZXNzIGluZm9ybWF0aW9uIG9uIHRoaXMgUEYuICovCisvKiAgICAgICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9BQ0NFU1NfTk9UX1BFUk1JVFRFRCAgMHhmZiAqLworLyogZW51bTogUEYgZG9lcyBub3QgZXhpc3QuICovCisvKiAgICAgICAgICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9QRl9OT1RfUFJFU0VOVCAgMHhmZSAqLworLyogTnVtYmVyIG9mIFZJcyBhdmFpbGFibGUgZm9yIGVhY2ggZXh0ZXJuYWwgcG9ydCAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTlVNX1ZJU19QRVJfUE9SVF9PRlNUIDU4CisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9OVU1fVklTX1BFUl9QT1JUX0xFTiAyCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9OVU1fVklTX1BFUl9QT1JUX05VTSA0CisvKiBTaXplIG9mIFJYIGRlc2NyaXB0b3IgY2FjaGUgZXhwcmVzc2VkIGFzIGJpbmFyeSBsb2dhcml0aG0gVGhlIGFjdHVhbCBzaXplCisgKiBlcXVhbHMgKDIgXiBSWF9ERVNDX0NBQ0hFX1NJWkUpCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1JYX0RFU0NfQ0FDSEVfU0laRV9PRlNUIDY2CisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9SWF9ERVNDX0NBQ0hFX1NJWkVfTEVOIDEKKy8qIFNpemUgb2YgVFggZGVzY3JpcHRvciBjYWNoZSBleHByZXNzZWQgYXMgYmluYXJ5IGxvZ2FyaXRobSBUaGUgYWN0dWFsIHNpemUKKyAqIGVxdWFscyAoMiBeIFRYX0RFU0NfQ0FDSEVfU0laRSkKKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVFhfREVTQ19DQUNIRV9TSVpFX09GU1QgNjcKKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1RYX0RFU0NfQ0FDSEVfU0laRV9MRU4gMQorLyogVG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSBQSU8gYnVmZmVycyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfTlVNX1BJT19CVUZGU19PRlNUIDY4CisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9OVU1fUElPX0JVRkZTX0xFTiAyCisvKiBTaXplIG9mIGEgc2luZ2xlIFBJTyBidWZmZXIgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9DQVBBQklMSVRJRVNfVjNfT1VUX1NJWkVfUElPX0JVRkZfT0ZTVCA3MAorI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfU0laRV9QSU9fQlVGRl9MRU4gMgorLyogT24gY2hpcHMgbGF0ZXIgdGhhbiBNZWRmb3JkIHRoZSBhbW91bnQgb2YgYWRkcmVzcyBzcGFjZSBhc3NpZ25lZCB0byBlYWNoIFZJCisgKiBpcyBjb25maWd1cmFibGUuIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZyB0aGF0IHRoZSBkcml2ZXIgbXVzdCBxdWVyeSB0bworICogZGlzY292ZXIgdGhlIFZJIHRvIGFkZHJlc3MgbWFwcGluZy4gQ3V0LXRocm91Z2ggUElPIChDVFBJTykgaW4gbm90IGF2YWlsYWJsZQorICogd2l0aCA4ayBWSSB3aW5kb3dzLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WSV9XSU5ET1dfTU9ERV9PRlNUIDcyCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTX1YzX09VVF9WSV9XSU5ET1dfTU9ERV9MRU4gMQorLyogZW51bTogRWFjaCBWSSBvY2N1cGllcyA4ayBhcyBvbiBIdW50aW5ndG9uIGFuZCBNZWRmb3JkLiBQSU8gaXMgYXQgb2Zmc2V0IDRrLgorICogQ1RQSU8gaXMgbm90IG1hcHBlZC4KKyAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVklfV0lORE9XX01PREVfOEsgICAweDAKKy8qIGVudW06IEVhY2ggVkkgb2NjdXBpZXMgMTZrLiBQSU8gaXMgYXQgb2Zmc2V0IDRrLiBDVFBJTyBpcyBhdCBvZmZzZXQgMTJrLiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVklfV0lORE9XX01PREVfMTZLICAweDEKKy8qIGVudW06IEVhY2ggVkkgb2NjdXBpZXMgNjRrLiBQSU8gaXMgYXQgb2Zmc2V0IDRrLiBDVFBJTyBpcyBhdCBvZmZzZXQgMTJrLiAqLworI2RlZmluZSAgICAgICAgICBNQ19DTURfR0VUX0NBUEFCSUxJVElFU19WM19PVVRfVklfV0lORE9XX01PREVfNjRLICAweDIKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBNQ19DTURfVjJfRVhUTgpAQCAtOTAyNiw3ICs5NDM0LDcgQEAKICAqLwogI2RlZmluZSBNQ19DTURfR0VUX1JYRFBfQ09ORklHIDB4YzIKIAotI2RlZmluZSBNQ19DTURfMHhjMl9QUklWSUxFR0VfQ1RHIFNSSU9WX0NUR19BRE1JTgorI2RlZmluZSBNQ19DTURfMHhjMl9QUklWSUxFR0VfQ1RHIFNSSU9WX0NUR19HRU5FUkFMCiAKIC8qIE1DX0NNRF9HRVRfUlhEUF9DT05GSUdfSU4gbXNncmVxdWVzdCAqLwogI2RlZmluZSAgICBNQ19DTURfR0VUX1JYRFBfQ09ORklHX0lOX0xFTiAwCkBAIC0xMDEyNSw3ICsxMDUzMyw5IEBACiAgKiB0aGF0IHRoaXMgb3BlcmF0aW9uIHJldHVybnMgYSB6ZXJvLWxlbmd0aCByZXNwb25zZQogICovCiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9MSUNFTlNJTkdfVjNfSU5fT1BfVVBEQVRFX0xJQ0VOU0UgIDB4MAotLyogZW51bTogcmVwb3J0IGNvdW50cyBvZiBpbnN0YWxsZWQgbGljZW5zZXMgKi8KKy8qIGVudW06IHJlcG9ydCBjb3VudHMgb2YgaW5zdGFsbGVkIGxpY2Vuc2VzIFJldHVybnMgRUFHQUlOIGlmIGxpY2Vuc2UKKyAqIHByb2Nlc3NpbmcgKHVwZGF0aW5nKSBoYXMgYmVlbiBzdGFydGVkIGJ1dCBub3QgeWV0IGNvbXBsZXRlZC4KKyAqLwogI2RlZmluZSAgICAgICAgICBNQ19DTURfTElDRU5TSU5HX1YzX0lOX09QX1JFUE9SVF9MSUNFTlNFICAweDEKIAogLyogTUNfQ01EX0xJQ0VOU0lOR19WM19PVVQgbXNncmVzcG9uc2UgKi8KQEAgLTEwNzYzLDYgKzExMTczLDggQEAKICNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9XT1JLQVJPVU5EU19PVVRfQlVHNDIwMDggMHgyMAogLyogZW51bTogQnVnIDI2ODA3IGZlYXR1cmVzIHByZXNlbnQgaW4gZmlybXdhcmUgKG11bHRpY2FzdCBmaWx0ZXIgY2hhaW5pbmcpICovCiAjZGVmaW5lICAgICAgICAgIE1DX0NNRF9HRVRfV09SS0FST1VORFNfT1VUX0JVRzI2ODA3IDB4NDAKKy8qIGVudW06IEJ1ZyA2MTI2NSB3b3JrIGFyb3VuZCAoYnJva2VuIEVWUSBUTVIgd3JpdGVzKS4gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX0dFVF9XT1JLQVJPVU5EU19PVVRfQlVHNjEyNjUgMHg4MAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTExMjgwLDIyICsxMTY5MiwxMTAgQEAKICNkZWZpbmUgTUNfQ01EXzB4MTE4X1BSSVZJTEVHRV9DVEcgU1JJT1ZfQ1RHX0FETUlOCiAKIC8qIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU4gbXNncmVxdWVzdCAqLwotI2RlZmluZSAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX0xFTiA0CisjZGVmaW5lICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fTEVOIDE2CiAvKiBUaGUgUlggcG9ydCB3aG9zZSB1cGNvbnZlcnRlciB0YWJsZSB3aWxsIGJlIG1vZGlmaWVkICovCiAjZGVmaW5lICAgICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fUE9SVF9PRlNUIDAKLSNkZWZpbmUgICAgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9QT1JUX0xFTiAxCiAvKiBUaGUgVkxBTiBwcmlvcml0eSBhc3NvY2lhdGVkIHRvIHRoZSB0YWJsZSBpbmRleCBhbmQgdkZJRk8gKi8KLSNkZWZpbmUgICAgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9QUklPUklUWV9PRlNUIDEKLSNkZWZpbmUgICAgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9QUklPUklUWV9MRU4gMQorI2RlZmluZSAgICAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX1BSSU9SSVRZX09GU1QgNAogLyogVGhlIHJlc3VsdGluZyBiaXQgb2YgU1JDXkRTVCBmb3IgaW5kZXhpbmcgdGhlIHRhYmxlICovCi0jZGVmaW5lICAgICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fU1JDX0RTVF9PRlNUIDIKLSNkZWZpbmUgICAgICAgTUNfQ01EX1JYX0JBTEFOQ0lOR19JTl9TUkNfRFNUX0xFTiAxCisjZGVmaW5lICAgICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fU1JDX0RTVF9PRlNUIDgKIC8qIFRoZSBSWCBlbmdpbmUgdG8gd2hpY2ggdGhlIHZGSUZPIGluIHRoZSB0YWJsZSBlbnRyeSB3aWxsIHBvaW50IHRvICovCi0jZGVmaW5lICAgICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfSU5fRU5HX09GU1QgMwotI2RlZmluZSAgICAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX0VOR19MRU4gMQorI2RlZmluZSAgICAgICBNQ19DTURfUlhfQkFMQU5DSU5HX0lOX0VOR19PRlNUIDEyCiAKIC8qIE1DX0NNRF9SWF9CQUxBTkNJTkdfT1VUIG1zZ3Jlc3BvbnNlICovCiAjZGVmaW5lICAgIE1DX0NNRF9SWF9CQUxBTkNJTkdfT1VUX0xFTiAwCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE1DX0NNRF9TRVRfRVZRX1RNUgorICogVXBkYXRlIHRoZSB0aW1lciBsb2FkLCB0aW1lciByZWxvYWQgYW5kIHRpbWVyIG1vZGUgdmFsdWVzIGZvciBhIGdpdmVuIEVWUS4KKyAqIFRoZSByZXF1ZXN0ZWQgdGltZXIgdmFsdWVzIChpbiBUTVJfTE9BRF9SRVFfTlMgYW5kIFRNUl9SRUxPQURfUkVRX05TKSB3aWxsCisgKiBiZSByb3VuZGVkIHVwIHRvIHRoZSBncmFudWxhcml0eSBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLCB0aGVuIHRydW5jYXRlZAorICogdG8gdGhlIHJhbmdlIHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUuIFRoZSByZXN1bHRpbmcgdmFsdWUgYWZ0ZXIgdGhlCisgKiByb3VuZGluZyBhbmQgdHJ1bmNhdGlvbiB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgKGluIFRNUl9MT0FEX0FDVF9OUworICogYW5kIFRNUl9SRUxPQURfQUNUX05TKS4KKyAqLworI2RlZmluZSBNQ19DTURfU0VUX0VWUV9UTVIgMHgxMjAKKworI2RlZmluZSBNQ19DTURfMHgxMjBfUFJJVklMRUdFX0NURyBTUklPVl9DVEdfR0VORVJBTAorCisvKiBNQ19DTURfU0VUX0VWUV9UTVJfSU4gbXNncmVxdWVzdCAqLworI2RlZmluZSAgICBNQ19DTURfU0VUX0VWUV9UTVJfSU5fTEVOIDE2CisvKiBGdW5jdGlvbi1yZWxhdGl2ZSBxdWV1ZSBpbnN0YW5jZSAqLworI2RlZmluZSAgICAgICBNQ19DTURfU0VUX0VWUV9UTVJfSU5fSU5TVEFOQ0VfT0ZTVCAwCisvKiBSZXF1ZXN0ZWQgdmFsdWUgZm9yIHRpbWVyIGxvYWQgKGluIG5hbm9zZWNvbmRzKSAqLworI2RlZmluZSAgICAgICBNQ19DTURfU0VUX0VWUV9UTVJfSU5fVE1SX0xPQURfUkVRX05TX09GU1QgNAorLyogUmVxdWVzdGVkIHZhbHVlIGZvciB0aW1lciByZWxvYWQgKGluIG5hbm9zZWNvbmRzKSAqLworI2RlZmluZSAgICAgICBNQ19DTURfU0VUX0VWUV9UTVJfSU5fVE1SX1JFTE9BRF9SRVFfTlNfT0ZTVCA4CisvKiBUaW1lciBtb2RlLiBNZWFuaW5ncyBhcyBwZXIgRVZRX1RNUl9SRUcuVENfVElNRVJfVkFMICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9JTl9UTVJfTU9ERV9PRlNUIDEyCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9JTl9USU1FUl9NT0RFX0RJUyAgMHgwIC8qIGVudW0gKi8KKyNkZWZpbmUgICAgICAgICAgTUNfQ01EX1NFVF9FVlFfVE1SX0lOX1RJTUVSX01PREVfSU1NRURfU1RBUlQgIDB4MSAvKiBlbnVtICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9JTl9USU1FUl9NT0RFX1RSSUdfU1RBUlQgIDB4MiAvKiBlbnVtICovCisjZGVmaW5lICAgICAgICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9JTl9USU1FUl9NT0RFX0lOVF9ITERPRkYgIDB4MyAvKiBlbnVtICovCisKKy8qIE1DX0NNRF9TRVRfRVZRX1RNUl9PVVQgbXNncmVzcG9uc2UgKi8KKyNkZWZpbmUgICAgTUNfQ01EX1NFVF9FVlFfVE1SX09VVF9MRU4gOAorLyogQWN0dWFsIHZhbHVlIGZvciB0aW1lciBsb2FkIChpbiBuYW5vc2Vjb25kcykgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX1NFVF9FVlFfVE1SX09VVF9UTVJfTE9BRF9BQ1RfTlNfT0ZTVCAwCisvKiBBY3R1YWwgdmFsdWUgZm9yIHRpbWVyIHJlbG9hZCAoaW4gbmFub3NlY29uZHMpICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9TRVRfRVZRX1RNUl9PVVRfVE1SX1JFTE9BRF9BQ1RfTlNfT0ZTVCA0CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVMKKyAqIFF1ZXJ5IHByb3BlcnRpZXMgYWJvdXQgdGhlIGV2ZW50IHF1ZXVlIHRpbWVycy4KKyAqLworI2RlZmluZSBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFUyAweDEyMgorCisjZGVmaW5lIE1DX0NNRF8weDEyMl9QUklWSUxFR0VfQ1RHIFNSSU9WX0NUR19HRU5FUkFMCisKKy8qIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX0lOIG1zZ3JlcXVlc3QgKi8KKyNkZWZpbmUgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfSU5fTEVOIDAKKworLyogTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUIG1zZ3Jlc3BvbnNlICovCisjZGVmaW5lICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9MRU4gMzYKKy8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfRkxBR1NfT0ZTVCAwCisvKiBGb3IgdGltZXJzIHVwZGF0ZWQgdmlhIHdyaXRlcyB0byBFVlFfVE1SX1JFRywgdGhpcyBpcyB0aGUgdGltZSBpbnRlcnZhbCAoaW4KKyAqIG5hbm9zZWNvbmRzKSBmb3IgZWFjaCBpbmNyZW1lbnQgb2YgdGhlIHRpbWVyIGxvYWQvcmVsb2FkIGNvdW50LiBUaGUKKyAqIHJlcXVlc3RlZCBkdXJhdGlvbiBvZiBhIHRpbWVyIGlzIHRoaXMgdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgdGltZXIKKyAqIGxvYWQvcmVsb2FkIGNvdW50LgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9UTVJfUkVHX05TX1BFUl9DT1VOVF9PRlNUIDQKKy8qIEZvciB0aW1lcnMgdXBkYXRlZCB2aWEgd3JpdGVzIHRvIEVWUV9UTVJfUkVHLCB0aGlzIGlzIHRoZSBtYXhpbXVtIHZhbHVlCisgKiBhbGxvd2VkIGZvciB0aW1lciBsb2FkL3JlbG9hZCBjb3VudHMuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX1RNUl9SRUdfTUFYX0NPVU5UX09GU1QgOAorLyogRm9yIHRpbWVycyB1cGRhdGVkIHZpYSB3cml0ZXMgdG8gRVZRX1RNUl9SRUcsIHRpbWVyIGxvYWQvcmVsb2FkIGNvdW50cyBub3QgYQorICogbXVsdGlwbGUgb2YgdGhpcyBzdGVwIHNpemUgd2lsbCBiZSByb3VuZGVkIGluIGFuIGltcGxlbWVudGF0aW9uIGRlZmluZWQKKyAqIG1hbm5lci4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfVE1SX1JFR19TVEVQX09GU1QgMTIKKy8qIE1heGltdW0gdGltZXIgZHVyYXRpb24gKGluIG5hbm9zZWNvbmRzKSBmb3IgdGltZXJzIHVwZGF0ZWQgdmlhIE1DREkuIE9ubHkKKyAqIG1lYW5pbmdmdWwgaWYgTUNfQ01EX1NFVF9FVlFfVE1SIGlzIGltcGxlbWVudGVkLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9NQ0RJX1RNUl9NQVhfTlNfT0ZTVCAxNgorLyogVGltZXIgZHVyYXRpb25zIHJlcXVlc3RlZCB2aWEgTUNESSB0aGF0IGFyZSBub3QgYSBtdWx0aXBsZSBvZiB0aGlzIHN0ZXAgc2l6ZQorICogd2lsbCBiZSByb3VuZGVkIHVwLiBPbmx5IG1lYW5pbmdmdWwgaWYgTUNfQ01EX1NFVF9FVlFfVE1SIGlzIGltcGxlbWVudGVkLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9NQ0RJX1RNUl9TVEVQX05TX09GU1QgMjAKKy8qIEZvciB0aW1lcnMgdXBkYXRlZCB1c2luZyB0aGUgYnVnMzUzODggd29ya2Fyb3VuZCwgdGhpcyBpcyB0aGUgdGltZSBpbnRlcnZhbAorICogKGluIG5hbm9zZWNvbmRzKSBmb3IgZWFjaCBpbmNyZW1lbnQgb2YgdGhlIHRpbWVyIGxvYWQvcmVsb2FkIGNvdW50LiBUaGUKKyAqIHJlcXVlc3RlZCBkdXJhdGlvbiBvZiBhIHRpbWVyIGlzIHRoaXMgdmFsdWUgbXVsdGlwbGllZCBieSB0aGUgdGltZXIKKyAqIGxvYWQvcmVsb2FkIGNvdW50LiBUaGlzIGZpZWxkIGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiB0aGUgYnVnMzUzODggd29ya2Fyb3VuZAorICogaXMgZW5hYmxlZC4KKyAqLworI2RlZmluZSAgICAgICBNQ19DTURfR0VUX0VWUV9UTVJfUFJPUEVSVElFU19PVVRfQlVHMzUzODhfVE1SX05TX1BFUl9DT1VOVF9PRlNUIDI0CisvKiBGb3IgdGltZXJzIHVwZGF0ZWQgdXNpbmcgdGhlIGJ1ZzM1Mzg4IHdvcmthcm91bmQsIHRoaXMgaXMgdGhlIG1heGltdW0gdmFsdWUKKyAqIGFsbG93ZWQgZm9yIHRpbWVyIGxvYWQvcmVsb2FkIGNvdW50cy4gVGhpcyBmaWVsZCBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlCisgKiBidWczNTM4OCB3b3JrYXJvdW5kIGlzIGVuYWJsZWQuCisgKi8KKyNkZWZpbmUgICAgICAgTUNfQ01EX0dFVF9FVlFfVE1SX1BST1BFUlRJRVNfT1VUX0JVRzM1Mzg4X1RNUl9NQVhfQ09VTlRfT0ZTVCAyOAorLyogRm9yIHRpbWVycyB1cGRhdGVkIHVzaW5nIHRoZSBidWczNTM4OCB3b3JrYXJvdW5kLCB0aW1lciBsb2FkL3JlbG9hZCBjb3VudHMKKyAqIG5vdCBhIG11bHRpcGxlIG9mIHRoaXMgc3RlcCBzaXplIHdpbGwgYmUgcm91bmRlZCBpbiBhbiBpbXBsZW1lbnRhdGlvbgorICogZGVmaW5lZCBtYW5uZXIuIFRoaXMgZmllbGQgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBidWczNTM4OCB3b3JrYXJvdW5kIGlzCisgKiBlbmFibGVkLgorICovCisjZGVmaW5lICAgICAgIE1DX0NNRF9HRVRfRVZRX1RNUl9QUk9QRVJUSUVTX09VVF9CVUczNTM4OF9UTVJfU1RFUF9PRlNUIDMyCiAKICNlbmRpZiAvKiBNQ0RJX1BDT0xfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25ldF9kcml2ZXIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uZXRfZHJpdmVyLmgKaW5kZXggOWZmMDYyYS4uOTlkOGM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25ldF9kcml2ZXIuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmV0X2RyaXZlci5oCkBAIC03Niw2ICs3Niw5IEBACiAvKiBNYXhpbXVtIHBvc3NpYmxlIE1UVSB0aGUgZHJpdmVyIHN1cHBvcnRzICovCiAjZGVmaW5lIEVGWF9NQVhfTVRVICg5ICogMTAyNCkKIAorLyogTWluaW11bSBNVFUsIGZyb20gUkZDNzkxIChJUCkgKi8KKyNkZWZpbmUgRUZYX01JTl9NVFUgNjgKKwogLyogU2l6ZSBvZiBhbiBSWCBzY2F0dGVyIGJ1ZmZlci4gIFNtYWxsIGVub3VnaCB0byBwYWNrIDIgaW50byBhIDRLIHBhZ2UsCiAgKiBhbmQgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNhY2hlIGxpbmUgc2l6ZS4KICAqLwpAQCAtMzkyLDcgKzM5NSw3IEBACiAgKiBAZXZlbnRxX2luaXQ6IEV2ZW50IHF1ZXVlIGluaXRpYWxpc2VkIGZsYWcKICAqIEBlbmFibGVkOiBDaGFubmVsIGVuYWJsZWQgaW5kaWNhdG9yCiAgKiBAaXJxOiBJUlEgbnVtYmVyIChNU0kgYW5kIE1TSS1YIG9ubHkpCi0gKiBAaXJxX21vZGVyYXRpb246IElSUSBtb2RlcmF0aW9uIHZhbHVlIChpbiBoYXJkd2FyZSB0aWNrcykKKyAqIEBpcnFfbW9kZXJhdGlvbl91czogSVJRIG1vZGVyYXRpb24gdmFsdWUgKGluIG1pY3Jvc2Vjb25kcykKICAqIEBuYXBpX2RldjogTmV0IGRldmljZSB1c2VkIHdpdGggTkFQSQogICogQG5hcGlfc3RyOiBOQVBJIGNvbnRyb2wgc3RydWN0dXJlCiAgKiBAc3RhdGU6IHN0YXRlIGZvciBOQVBJIHZzIGJ1c3kgcG9sbGluZwpAQCAtNDMzLDcgKzQzNiw3IEBACiAJYm9vbCBldmVudHFfaW5pdDsKIAlib29sIGVuYWJsZWQ7CiAJaW50IGlycTsKLQl1bnNpZ25lZCBpbnQgaXJxX21vZGVyYXRpb247CisJdW5zaWduZWQgaW50IGlycV9tb2RlcmF0aW9uX3VzOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuYXBpX2RldjsKIAlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaV9zdHI7CiAjaWZkZWYgQ09ORklHX05FVF9SWF9CVVNZX1BPTEwKQEAgLTgxMCw4ICs4MTMsMTAgQEAKICAqIEBtZW1iYXNlOiBNZW1vcnkgQkFSIHZhbHVlCiAgKiBAaW50ZXJydXB0X21vZGU6IEludGVycnVwdCBtb2RlCiAgKiBAdGltZXJfcXVhbnR1bV9uczogSW50ZXJydXB0IHRpbWVyIHF1YW50dW0sIGluIG5hbm9zZWNvbmRzCisgKiBAdGltZXJfbWF4X25zOiBJbnRlcnJ1cHQgdGltZXIgbWF4aW11bSB2YWx1ZSwgaW4gbmFub3NlY29uZHMKICAqIEBpcnFfcnhfYWRhcHRpdmU6IEFkYXB0aXZlIElSUSBtb2RlcmF0aW9uIGVuYWJsZWQgZm9yIFJYIGV2ZW50IHF1ZXVlcwotICogQGlycV9yeF9tb2RlcmF0aW9uOiBJUlEgbW9kZXJhdGlvbiB0aW1lIGZvciBSWCBldmVudCBxdWV1ZXMKKyAqIEBpcnFfcnhfbW9kX3N0ZXBfdXM6IFN0ZXAgc2l6ZSBmb3IgSVJRIG1vZGVyYXRpb24gZm9yIFJYIGV2ZW50IHF1ZXVlcworICogQGlycV9yeF9tb2RlcmF0aW9uX3VzOiBJUlEgbW9kZXJhdGlvbiB0aW1lIGZvciBSWCBldmVudCBxdWV1ZXMKICAqIEBtc2dfZW5hYmxlOiBMb2cgbWVzc2FnZSBlbmFibGUgZmxhZ3MKICAqIEBzdGF0ZTogRGV2aWNlIHN0YXRlIG51bWJlciAoJVNUQVRFXyopLiBTZXJpYWxpc2VkIGJ5IHRoZSBydG5sX2xvY2suCiAgKiBAcmVzZXRfcGVuZGluZzogQml0bWFzayBmb3IgcGVuZGluZyByZXNldHMKQEAgLTk0MCw4ICs5NDUsMTAgQEAKIAogCWVudW0gZWZ4X2ludF9tb2RlIGludGVycnVwdF9tb2RlOwogCXVuc2lnbmVkIGludCB0aW1lcl9xdWFudHVtX25zOworCXVuc2lnbmVkIGludCB0aW1lcl9tYXhfbnM7CiAJYm9vbCBpcnFfcnhfYWRhcHRpdmU7Ci0JdW5zaWduZWQgaW50IGlycV9yeF9tb2RlcmF0aW9uOworCXVuc2lnbmVkIGludCBpcnFfbW9kX3N0ZXBfdXM7CisJdW5zaWduZWQgaW50IGlycV9yeF9tb2RlcmF0aW9uX3VzOwogCXUzMiBtc2dfZW5hYmxlOwogCiAJZW51bSBuaWNfc3RhdGUgc3RhdGU7CkBAIC0xMjcxLDcgKzEyNzgsNyBAQAogCWludCAoKm1jZGlfcG9sbF9yZWJvb3QpKHN0cnVjdCBlZnhfbmljICplZngpOwogCXZvaWQgKCptY2RpX3JlYm9vdF9kZXRlY3RlZCkoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiAJdm9pZCAoKmlycV9lbmFibGVfbWFzdGVyKShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKLQl2b2lkICgqaXJxX3Rlc3RfZ2VuZXJhdGUpKHN0cnVjdCBlZnhfbmljICplZngpOworCWludCAoKmlycV90ZXN0X2dlbmVyYXRlKShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIAl2b2lkICgqaXJxX2Rpc2FibGVfbm9uX2V2KShzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIAlpcnFyZXR1cm5fdCAoKmlycV9oYW5kbGVfbXNpKShpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogCWlycXJldHVybl90ICgqaXJxX2hhbmRsZV9sZWdhY3kpKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmljLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmljLmMKaW5kZXggODliODNlNS4uYWExOTQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uaWMuYwpAQCAtNjYsMTEgKzY2LDExIEBACiAJY2hhbm5lbC0+ZWZ4LT50eXBlLT5ldl90ZXN0X2dlbmVyYXRlKGNoYW5uZWwpOwogfQogCi12b2lkIGVmeF9uaWNfaXJxX3Rlc3Rfc3RhcnQoc3RydWN0IGVmeF9uaWMgKmVmeCkKK2ludCBlZnhfbmljX2lycV90ZXN0X3N0YXJ0KHN0cnVjdCBlZnhfbmljICplZngpCiB7CiAJZWZ4LT5sYXN0X2lycV9jcHUgPSAtMTsKIAlzbXBfd21iKCk7Ci0JZWZ4LT50eXBlLT5pcnFfdGVzdF9nZW5lcmF0ZShlZngpOworCXJldHVybiBlZngtPnR5cGUtPmlycV90ZXN0X2dlbmVyYXRlKGVmeCk7CiB9CiAKIC8qIEhvb2sgaW50ZXJydXB0IGhhbmRsZXIocykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uaWMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uaWMuaAppbmRleCA5Njk0NGMzLi43M2JlZTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmljLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25pYy5oCkBAIC01MDcsMTAgKzUwNywxMyBAQAogICogQHN0YXRzOiBIYXJkd2FyZSBzdGF0aXN0aWNzCiAgKiBAd29ya2Fyb3VuZF8zNTM4ODogRmxhZzogZmlybXdhcmUgc3VwcG9ydHMgd29ya2Fyb3VuZCBmb3IgYnVnIDM1Mzg4CiAgKiBAd29ya2Fyb3VuZF8yNjgwNzogRmxhZzogZmlybXdhcmUgc3VwcG9ydHMgd29ya2Fyb3VuZCBmb3IgYnVnIDI2ODA3CisgKiBAd29ya2Fyb3VuZF82MTI2NTogRmxhZzogZmlybXdhcmUgc3VwcG9ydHMgd29ya2Fyb3VuZCBmb3IgYnVnIDYxMjY1CiAgKiBAbXVzdF9jaGVja19kYXRhcGF0aF9jYXBzOiBGbGFnOiBAZGF0YXBhdGhfY2FwcyBuZWVkcyB0byBiZSByZXZhbGlkYXRlZAogICoJYWZ0ZXIgTUMgcmVib290CiAgKiBAZGF0YXBhdGhfY2FwczogQ2FwYWJpbGl0aWVzIG9mIGRhdGFwYXRoIGZpcm13YXJlIChGTEFHUzEgZmllbGQgb2YKICAqCSVNQ19DTURfR0VUX0NBUEFCSUxJVElFUyByZXNwb25zZSkKKyAqIEBkYXRhcGF0aF9jYXBzMjogRnVydGhlciBDYXBhYmlsaXRpZXMgb2YgZGF0YXBhdGggZmlybXdhcmUgKEZMQUdTMiBmaWVsZCBvZgorICogJU1DX0NNRF9HRVRfQ0FQQUJJTElUSUVTIHJlc3BvbnNlKQogICogQHJ4X2RwY3B1X2Z3X2lkOiBGaXJtd2FyZSBJRCBvZiB0aGUgUnhEUENQVQogICogQHR4X2RwY3B1X2Z3X2lkOiBGaXJtd2FyZSBJRCBvZiB0aGUgVHhEUENQVQogICogQHZwb3J0X2lkOiBUaGUgZnVuY3Rpb24ncyB2cG9ydCBJRCwgb25seSByZWxldmFudCBmb3IgUEZzCkBAIC01NDAsOCArNTQzLDEwIEBACiAJdTY0IHN0YXRzW0VGMTBfU1RBVF9DT1VOVF07CiAJYm9vbCB3b3JrYXJvdW5kXzM1Mzg4OwogCWJvb2wgd29ya2Fyb3VuZF8yNjgwNzsKKwlib29sIHdvcmthcm91bmRfNjEyNjU7CiAJYm9vbCBtdXN0X2NoZWNrX2RhdGFwYXRoX2NhcHM7CiAJdTMyIGRhdGFwYXRoX2NhcHM7CisJdTMyIGRhdGFwYXRoX2NhcHMyOwogCXVuc2lnbmVkIGludCByeF9kcGNwdV9md19pZDsKIAl1bnNpZ25lZCBpbnQgdHhfZHBjcHVfZndfaWQ7CiAJdW5zaWduZWQgaW50IHZwb3J0X2lkOwpAQCAtNzQxLDEyICs3NDYsMTIgQEAKIAogLyogSW50ZXJydXB0cyAqLwogaW50IGVmeF9uaWNfaW5pdF9pbnRlcnJ1cHQoc3RydWN0IGVmeF9uaWMgKmVmeCk7Ci12b2lkIGVmeF9uaWNfaXJxX3Rlc3Rfc3RhcnQoc3RydWN0IGVmeF9uaWMgKmVmeCk7CitpbnQgZWZ4X25pY19pcnFfdGVzdF9zdGFydChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIHZvaWQgZWZ4X25pY19maW5pX2ludGVycnVwdChzdHJ1Y3QgZWZ4X25pYyAqZWZ4KTsKIAogLyogRmFsY29uL1NpZW5hIGludGVycnVwdHMgKi8KIHZvaWQgZWZ4X2ZhcmNoX2lycV9lbmFibGVfbWFzdGVyKHN0cnVjdCBlZnhfbmljICplZngpOwotdm9pZCBlZnhfZmFyY2hfaXJxX3Rlc3RfZ2VuZXJhdGUoc3RydWN0IGVmeF9uaWMgKmVmeCk7CitpbnQgZWZ4X2ZhcmNoX2lycV90ZXN0X2dlbmVyYXRlKHN0cnVjdCBlZnhfbmljICplZngpOwogdm9pZCBlZnhfZmFyY2hfaXJxX2Rpc2FibGVfbWFzdGVyKHN0cnVjdCBlZnhfbmljICplZngpOwogaXJxcmV0dXJuX3QgZWZ4X2ZhcmNoX21zaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIGlycXJldHVybl90IGVmeF9mYXJjaF9sZWdhY3lfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvcHRwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvcHRwLmMKaW5kZXggYzc3MWUwYS4uNzdhNTM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3B0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9wdHAuYwpAQCAtMTI2OSwxMyArMTI2OSwxMyBAQAogCQlpZiAoSVNfRVJSKHB0cC0+cGhjX2Nsb2NrKSkgewogCQkJcmMgPSBQVFJfRVJSKHB0cC0+cGhjX2Nsb2NrKTsKIAkJCWdvdG8gZmFpbDM7Ci0JCX0KLQotCQlJTklUX1dPUksoJnB0cC0+cHBzX3dvcmssIGVmeF9wdHBfcHBzX3dvcmtlcik7Ci0JCXB0cC0+cHBzX3dvcmt3cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJzZmNfcHBzIik7Ci0JCWlmICghcHRwLT5wcHNfd29ya3dxKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGZhaWw0OworCQl9IGVsc2UgaWYgKHB0cC0+cGhjX2Nsb2NrKSB7CisJCQlJTklUX1dPUksoJnB0cC0+cHBzX3dvcmssIGVmeF9wdHBfcHBzX3dvcmtlcik7CisJCQlwdHAtPnBwc193b3Jrd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgic2ZjX3BwcyIpOworCQkJaWYgKCFwdHAtPnBwc193b3Jrd3EpIHsKKwkJCQlyYyA9IC1FTk9NRU07CisJCQkJZ290byBmYWlsNDsKKwkJCX0KIAkJfQogCX0KIAlwdHAtPm5pY190c19lbmFibGVkID0gZmFsc2U7CkBAIC0xMzA2LDcgKzEzMDYsNyBAQAogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBjaGFubmVsLT5lZng7CiAKLQljaGFubmVsLT5pcnFfbW9kZXJhdGlvbiA9IDA7CisJY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMgPSAwOwogCWNoYW5uZWwtPnJ4X3F1ZXVlLmNvcmVfaW5kZXggPSAwOwogCiAJcmV0dXJuIGVmeF9wdHBfcHJvYmUoZWZ4LCBjaGFubmVsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zZWxmdGVzdC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NlbGZ0ZXN0LmMKaW5kZXggOWQ3ODgzMC4uY2QzOGI0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NlbGZ0ZXN0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NlbGZ0ZXN0LmMKQEAgLTEzNSwxMSArMTM1LDE5IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0LCB3YWl0OwogCWludCBjcHU7CisJaW50IHJjOwogCiAJbmV0aWZfZGJnKGVmeCwgZHJ2LCBlZngtPm5ldF9kZXYsICJ0ZXN0aW5nIGludGVycnVwdHNcbiIpOwogCXRlc3RzLT5pbnRlcnJ1cHQgPSAtMTsKIAotCWVmeF9uaWNfaXJxX3Rlc3Rfc3RhcnQoZWZ4KTsKKwlyYyA9IGVmeF9uaWNfaXJxX3Rlc3Rfc3RhcnQoZWZ4KTsKKwlpZiAocmMgPT0gLUVOT1RTVVBQKSB7CisJCW5ldGlmX2RiZyhlZngsIGRydiwgZWZ4LT5uZXRfZGV2LAorCQkJICAiZGlyZWN0IGludGVycnVwdCB0ZXN0aW5nIG5vdCBzdXBwb3J0ZWRcbiIpOworCQl0ZXN0cy0+aW50ZXJydXB0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCiAJdGltZW91dCA9IGppZmZpZXMgKyBJUlFfVElNRU9VVDsKIAl3YWl0ID0gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NlbGZ0ZXN0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2VsZnRlc3QuaAppbmRleCAwMDlkYmU4Li4zMmE0MjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2VsZnRlc3QuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2VsZnRlc3QuaApAQCAtMjgsNyArMjgsNyBAQAogCiAvKiBFZnggc2VsZiB0ZXN0IHJlc3VsdHMKICAqIEZvciBmaWVsZHMgd2hpY2ggYXJlIG5vdCBjb3VudGVycywgMSBpbmRpY2F0ZXMgc3VjY2VzcyBhbmQgLTEKLSAqIGluZGljYXRlcyBmYWlsdXJlLgorICogaW5kaWNhdGVzIGZhaWx1cmU7IDAgaW5kaWNhdGVzIHRlc3QgY291bGQgbm90IGJlIHJ1bi4KICAqLwogc3RydWN0IGVmeF9zZWxmX3Rlc3RzIHsKIAkvKiBvbmxpbmUgdGVzdHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zaWVuYS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NpZW5hLmMKaW5kZXggMjIxOWI1NC4uMDRlZDFiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NpZW5hLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NpZW5hLmMKQEAgLTM0LDE5ICszNCwyNCBAQAogCiBzdGF0aWMgdm9pZCBzaWVuYV9wdXNoX2lycV9tb2RlcmF0aW9uKHN0cnVjdCBlZnhfY2hhbm5lbCAqY2hhbm5lbCkKIHsKKwlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gY2hhbm5lbC0+ZWZ4OwogCWVmeF9kd29yZF90IHRpbWVyX2NtZDsKIAotCWlmIChjaGFubmVsLT5pcnFfbW9kZXJhdGlvbikKKwlpZiAoY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMpIHsKKwkJdW5zaWduZWQgaW50IHRpY2tzOworCisJCXRpY2tzID0gZWZ4X3VzZWNzX3RvX3RpY2tzKGVmeCwgY2hhbm5lbC0+aXJxX21vZGVyYXRpb25fdXMpOwogCQlFRlhfUE9QVUxBVEVfRFdPUkRfMih0aW1lcl9jbWQsCiAJCQkJICAgICBGUkZfQ1pfVENfVElNRVJfTU9ERSwKIAkJCQkgICAgIEZGRV9DWl9USU1FUl9NT0RFX0lOVF9ITERPRkYsCiAJCQkJICAgICBGUkZfQ1pfVENfVElNRVJfVkFMLAotCQkJCSAgICAgY2hhbm5lbC0+aXJxX21vZGVyYXRpb24gLSAxKTsKLQllbHNlCisJCQkJICAgICB0aWNrcyAtIDEpOworCX0gZWxzZSB7CiAJCUVGWF9QT1BVTEFURV9EV09SRF8yKHRpbWVyX2NtZCwKIAkJCQkgICAgIEZSRl9DWl9UQ19USU1FUl9NT0RFLAogCQkJCSAgICAgRkZFX0NaX1RJTUVSX01PREVfRElTLAogCQkJCSAgICAgRlJGX0NaX1RDX1RJTUVSX1ZBTCwgMCk7CisJfQogCWVmeF93cml0ZWRfcGFnZV9sb2NrZWQoY2hhbm5lbC0+ZWZ4LCAmdGltZXJfY21kLCBGUl9CWl9USU1FUl9DT01NQU5EX1AwLAogCQkJICAgICAgIGNoYW5uZWwtPmNoYW5uZWwpOwogfQpAQCAtMjIyLDYgKzIyNyw5IEBACiAJZWZ4LT50aW1lcl9xdWFudHVtX25zID0KIAkJKGNhcHMgJiAoMSA8PCBNQ19DTURfQ0FQQUJJTElUSUVTX1RVUkJPX0FDVElWRV9MQk4pKSA/CiAJCTMwNzIgOiA2MTQ0OyAvKiA3NjggY3ljbGVzICovCisJZWZ4LT50aW1lcl9tYXhfbnMgPSBlZngtPnR5cGUtPnRpbWVyX3BlcmlvZF9tYXggKgorCQkJICAgIGVmeC0+dGltZXJfcXVhbnR1bV9uczsKKwogCXJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NyaW92LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc3Jpb3YuYwppbmRleCA4MTZjNDQ2Li45YWJjZjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc3Jpb3YuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc3Jpb3YuYwpAQCAtMjIsNyArMjIsNyBAQAogfQogCiBpbnQgZWZ4X3NyaW92X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgdmZfaSwgdTE2IHZsYW4sCi0JCQkgIHU4IHFvcykKKwkJCSAgdTggcW9zLCBfX2JlMTYgdmxhbl9wcm90bykKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAKQEAgLTMxLDYgKzMxLDkgQEAKIAkJICAgIChxb3MgJiB+KFZMQU5fUFJJT19NQVNLID4+IFZMQU5fUFJJT19TSElGVCkpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKKwkJaWYgKHZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCQkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisKIAkJcmV0dXJuIGVmeC0+dHlwZS0+c3Jpb3Zfc2V0X3ZmX3ZsYW4oZWZ4LCB2Zl9pLCB2bGFuLCBxb3MpOwogCX0gZWxzZSB7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zcmlvdi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NyaW92LmgKaW5kZXggNDAwZGY1Mi4uYmExNzYyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NyaW92LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NyaW92LmgKQEAgLTE2LDcgKzE2LDcgQEAKIAogaW50IGVmeF9zcmlvdl9zZXRfdmZfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgdmZfaSwgdTggKm1hYyk7CiBpbnQgZWZ4X3NyaW92X3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBpbnQgdmZfaSwgdTE2IHZsYW4sCi0JCQkgIHU4IHFvcyk7CisJCQkgIHU4IHFvcywgX19iZTE2IHZsYW5fcHJvdG8pOwogaW50IGVmeF9zcmlvdl9zZXRfdmZfc3Bvb2ZjaGsoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCB2Zl9pLAogCQkJICAgICAgYm9vbCBzcG9vZmNoayk7CiBpbnQgZWZ4X3NyaW92X2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGludCB2Zl9pLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3dvcmthcm91bmRzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvd29ya2Fyb3VuZHMuaAppbmRleCAyMzEwYjc1Li4zNTFjZDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvd29ya2Fyb3VuZHMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvd29ya2Fyb3VuZHMuaApAQCAtNTAsNCArNTAsOCBAQAogI2RlZmluZSBFRlhfV09SS0FST1VORF8zNTM4OChlZngpCQkJCQlcCiAJKGVmeF9uaWNfcmV2KGVmeCkgPT0gRUZYX1JFVl9IVU5UX0EwICYmIEVGWF9FRjEwX1dPUktBUk9VTkRfMzUzODgoZWZ4KSkKIAorLyogTW9kZXJhdGlvbiB0aW1lciBhY2Nlc3MgbXVzdCBnbyB0aHJvdWdoIE1DREkgKi8KKyNkZWZpbmUgRUZYX0VGMTBfV09SS0FST1VORF82MTI2NShlZngpCQkJCQlcCisJKCgoc3RydWN0IGVmeF9lZjEwX25pY19kYXRhICopZWZ4LT5uaWNfZGF0YSktPndvcmthcm91bmRfNjEyNjUpCisKICNlbmRpZiAvKiBFRlhfV09SS0FST1VORFNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczkwMC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczkwMC5jCmluZGV4IDk1MDAxZWU0Li42Zjg1Mjc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzOTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczkwMC5jCkBAIC0xNDI2LDcgKzE0MjYsNyBAQAogCQlyeF9mbGFncyB8PSBSeEFUWDsKIAl9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTEFOXzgwMjFRKQogCS8qIENhbiBhY2NlcHQgSnVtYm8gcGFja2V0ICovCiAJcnhfZmxhZ3MgfD0gUnhBSkFCOwogI2VuZGlmCkBAIC0xNzUwLDcgKzE3NTAsNyBAQAogCQlkYXRhX3NpemUgPSByeF9zdGF0dXMgJiBEU0laRTsKIAkJcnhfc2l6ZSA9IGRhdGFfc2l6ZSAtIENSQ19TSVpFOwogCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVkxBTl84MDIxUSkKIAkJLyogYGBUT09MT05HJycgZmxhZyBtZWFucyBqdW1ibyBwYWNrZXQgcmVjZWl2ZWQuICovCiAJCWlmICgocnhfc3RhdHVzICYgVE9PTE9ORykgJiYgZGF0YV9zaXplIDw9IE1BWF9GUkFNRV9TSVpFKQogCQkJcnhfc3RhdHVzICY9ICh+ICgodW5zaWduZWQgaW50KVRPT0xPTkcpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Npcy9zaXM5MDAuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Npcy9zaXM5MDAuaAppbmRleCA3ZDQzMGQzLi5mMGRhM2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzOTAwLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczkwMC5oCkBAIC0zMTAsNyArMzEwLDcgQEAKICNkZWZpbmUgQ1JDX1NJWkUgICAgICAgICAgICAgICAgNAogI2RlZmluZSBNQUNfSEVBREVSX1NJWkUgICAgICAgICAxNAogCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfVkxBTl84MDIxUSkKICNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgICgxNTE4ICsgNCkKICNlbHNlCiAjZGVmaW5lIE1BWF9GUkFNRV9TSVpFICAxNTE4CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MXguYwppbmRleCA3MjZiODBmLi43MzIxMjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTF4LmMKQEAgLTIyNzUsNiArMjI3NSwxMyBAQAogCWlmIChwZCkgewogCQltZW1jcHkoJmxwLT5jZmcsIHBkLCBzaXplb2YobHAtPmNmZykpOwogCQlscC0+aW9fc2hpZnQgPSBTTUM5MVhfSU9fU0hJRlQobHAtPmNmZy5mbGFncyk7CisKKwkJaWYgKCFTTUNfOEJJVChscCkgJiYgIVNNQ18xNkJJVChscCkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiYXQgbGVhc3Qgb25lIG9mIDgtYml0IG9yIDE2LWJpdCBhY2Nlc3Mgc3VwcG9ydCBpcyByZXF1aXJlZC5cbiIpOworCQkJcmV0ID0gLUVOWElPOworCQkJZ290byBvdXRfZnJlZV9uZXRkZXY7CisJCX0KIAl9CiAKICNpZiBJU19CVUlMVElOKENPTkZJR19PRikKQEAgLTIzMTYsNiArMjMyMyw5IEBACiAJCX0gZWxzZSB7CiAJCQlscC0+Y2ZnLmZsYWdzIHw9IFNNQzkxWF9VU0VfMTZCSVQ7CiAJCX0KKwkJaWYgKCFkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoJnBkZXYtPmRldiwgInJlZy1zaGlmdCIsCisJCQkJCSAgICAgICZ2YWwpKQorCQkJbHAtPmlvX3NoaWZ0ID0gdmFsOwogCX0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxeC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MXguaAppbmRleCAxYTU1Yzc5Li5lYTg0NjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxeC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTF4LmgKQEAgLTM3LDYgKzM3LDI3IEBACiAjaW5jbHVkZSA8bGludXgvc21jOTF4Lmg+CiAKIC8qCisgKiBBbnkgMTYtYml0IGFjY2VzcyBpcyBwZXJmb3JtZWQgd2l0aCB0d28gOC1iaXQgYWNjZXNzZXMgaWYgdGhlIGhhcmR3YXJlCisgKiBjYW4ndCBkbyBpdCBkaXJlY3RseS4gTW9zdCByZWdpc3RlcnMgYXJlIDE2LWJpdCBzbyB0aG9zZSBhcmUgbWFuZGF0b3J5LgorICovCisjZGVmaW5lIFNNQ19vdXR3X2IoeCwgYSwgcikJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQl1bnNpZ25lZCBpbnQgX192YWwxNiA9ICh4KTsJCQkJXAorCQl1bnNpZ25lZCBpbnQgX19yZWcgPSAocik7CQkJCVwKKwkJU01DX291dGIoX192YWwxNiwgYSwgX19yZWcpOwkJCQlcCisJCVNNQ19vdXRiKF9fdmFsMTYgPj4gOCwgYSwgX19yZWcgKyAoMSA8PCBTTUNfSU9fU0hJRlQpKTsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgU01DX2lud19iKGEsIHIpCQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCQl1bnNpZ25lZCBpbnQgX192YWwxNjsJCQkJCVwKKwkJdW5zaWduZWQgaW50IF9fcmVnID0gcjsJCQkJCVwKKwkJX192YWwxNiAgPSBTTUNfaW5iKGEsIF9fcmVnKTsJCQkJXAorCQlfX3ZhbDE2IHw9IFNNQ19pbmIoYSwgX19yZWcgKyAoMSA8PCBTTUNfSU9fU0hJRlQpKSA8PCA4OyBcCisJCV9fdmFsMTY7CQkJCQkJXAorCX0pCisKKy8qCiAgKiBEZWZpbmUgeW91ciBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgYnVzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBoZXJlLgogICovCiAKQEAgLTU1LDEwICs3NiwzMCBAQAogI2RlZmluZSBTTUNfSU9fU0hJRlQJCShscC0+aW9fc2hpZnQpCiAKICNkZWZpbmUgU01DX2luYihhLCByKQkJcmVhZGIoKGEpICsgKHIpKQotI2RlZmluZSBTTUNfaW53KGEsIHIpCQlyZWFkdygoYSkgKyAocikpCisjZGVmaW5lIFNNQ19pbncoYSwgcikJCQkJCQkJXAorCSh7CQkJCQkJCQlcCisJCXVuc2lnbmVkIGludCBfX3NtY19yID0gcjsJCQkJXAorCQlTTUNfMTZCSVQobHApID8gcmVhZHcoKGEpICsgX19zbWNfcikgOgkJCVwKKwkJU01DXzhCSVQobHApID8gU01DX2lud19iKGEsIF9fc21jX3IpIDoJCQlcCisJCSh7IEJVRygpOyAwOyB9KTsJCQkJCVwKKwl9KQorCiAjZGVmaW5lIFNNQ19pbmwoYSwgcikJCXJlYWRsKChhKSArIChyKSkKICNkZWZpbmUgU01DX291dGIodiwgYSwgcikJd3JpdGViKHYsIChhKSArIChyKSkKKyNkZWZpbmUgU01DX291dHcodiwgYSwgcikJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQl1bnNpZ25lZCBpbnQgX192ID0gdiwgX19zbWNfciA9IHI7CQkJXAorCQlpZiAoU01DXzE2QklUKGxwKSkJCQkJCVwKKwkJCV9fU01DX291dHcoX192LCBhLCBfX3NtY19yKTsJCQlcCisJCWVsc2UgaWYgKFNNQ184QklUKGxwKSkJCQkJCVwKKwkJCVNNQ19vdXR3X2IoX192LCBhLCBfX3NtY19yKTsJCQlcCisJCWVsc2UJCQkJCQkJXAorCQkJQlVHKCk7CQkJCQkJXAorCX0gd2hpbGUgKDApCisKICNkZWZpbmUgU01DX291dGwodiwgYSwgcikJd3JpdGVsKHYsIChhKSArIChyKSkKKyNkZWZpbmUgU01DX2luc2IoYSwgciwgcCwgbCkJcmVhZHNiKChhKSArIChyKSwgcCwgbCkKKyNkZWZpbmUgU01DX291dHNiKGEsIHIsIHAsIGwpCXdyaXRlc2IoKGEpICsgKHIpLCBwLCBsKQogI2RlZmluZSBTTUNfaW5zdyhhLCByLCBwLCBsKQlyZWFkc3coKGEpICsgKHIpLCBwLCBsKQogI2RlZmluZSBTTUNfb3V0c3coYSwgciwgcCwgbCkJd3JpdGVzdygoYSkgKyAociksIHAsIGwpCiAjZGVmaW5lIFNNQ19pbnNsKGEsIHIsIHAsIGwpCXJlYWRzbCgoYSkgKyAociksIHAsIGwpCkBAIC02Niw3ICsxMDcsNyBAQAogI2RlZmluZSBTTUNfSVJRX0ZMQUdTCQkoLTEpCS8qIGZyb20gcmVzb3VyY2UgKi8KIAogLyogV2UgYWN0dWFsbHkgY2FuJ3Qgd3JpdGUgaGFsZndvcmRzIHByb3Blcmx5IGlmIG5vdCB3b3JkIGFsaWduZWQgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBTTUNfb3V0dyh1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IHJlZykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX1NNQ19vdXR3KHUxNiB2YWwsIHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgcmVnKQogewogCWlmICgobWFjaGluZV9pc19tYWluc3RvbmUoKSB8fCBtYWNoaW5lX2lzX3N0YXJnYXRlMigpIHx8CiAJICAgICBtYWNoaW5lX2lzX3B4YV9pZHAoKSkgJiYgcmVnICYgMikgewpAQCAtNDE2LDI0ICs0NTcsOCBAQAogCiAjaWYgISBTTUNfQ0FOX1VTRV8xNkJJVAogCi0vKgotICogQW55IDE2LWJpdCBhY2Nlc3MgaXMgcGVyZm9ybWVkIHdpdGggdHdvIDgtYml0IGFjY2Vzc2VzIGlmIHRoZSBoYXJkd2FyZQotICogY2FuJ3QgZG8gaXQgZGlyZWN0bHkuIE1vc3QgcmVnaXN0ZXJzIGFyZSAxNi1iaXQgc28gdGhvc2UgYXJlIG1hbmRhdG9yeS4KLSAqLwotI2RlZmluZSBTTUNfb3V0dyh4LCBpb2FkZHIsIHJlZykJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCXVuc2lnbmVkIGludCBfX3ZhbDE2ID0gKHgpOwkJCQlcCi0JCVNNQ19vdXRiKCBfX3ZhbDE2LCBpb2FkZHIsIHJlZyApOwkJCVwKLQkJU01DX291dGIoIF9fdmFsMTYgPj4gOCwgaW9hZGRyLCByZWcgKyAoMSA8PCBTTUNfSU9fU0hJRlQpKTtcCi0JfSB3aGlsZSAoMCkKLSNkZWZpbmUgU01DX2ludyhpb2FkZHIsIHJlZykJCQkJCQlcCi0JKHsJCQkJCQkJCVwKLQkJdW5zaWduZWQgaW50IF9fdmFsMTY7CQkJCQlcCi0JCV9fdmFsMTYgPSAgU01DX2luYiggaW9hZGRyLCByZWcgKTsJCQlcCi0JCV9fdmFsMTYgfD0gU01DX2luYiggaW9hZGRyLCByZWcgKyAoMSA8PCBTTUNfSU9fU0hJRlQpKSA8PCA4OyBcCi0JCV9fdmFsMTY7CQkJCQkJXAotCX0pCi0KKyNkZWZpbmUgU01DX291dHcoeCwgaW9hZGRyLCByZWcpCVNNQ19vdXR3X2IoeCwgaW9hZGRyLCByZWcpCisjZGVmaW5lIFNNQ19pbncoaW9hZGRyLCByZWcpCQlTTUNfaW53X2IoaW9hZGRyLCByZWcpCiAjZGVmaW5lIFNNQ19pbnN3KGEsIHIsIHAsIGwpCQlCVUcoKQogI2RlZmluZSBTTUNfb3V0c3coYSwgciwgcCwgbCkJCUJVRygpCiAKQEAgLTQ0NSw3ICs0NzAsOSBAQAogI2VuZGlmCiAKICNpZiAhIFNNQ19DQU5fVVNFXzhCSVQKKyN1bmRlZiBTTUNfaW5iCiAjZGVmaW5lIFNNQ19pbmIoaW9hZGRyLCByZWcpCQkoeyBCVUcoKTsgMDsgfSkKKyN1bmRlZiBTTUNfb3V0YgogI2RlZmluZSBTTUNfb3V0Yih4LCBpb2FkZHIsIHJlZykJQlVHKCkKICNkZWZpbmUgU01DX2luc2IoYSwgciwgcCwgbCkJCUJVRygpCiAjZGVmaW5lIFNNQ19vdXRzYihhLCByLCBwLCBsKQkJQlVHKCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzkxMXguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzkxMXguYwppbmRleCBjYTMxMzQ1Li5lOWI4NTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5MTF4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTExeC5jCkBAIC02Miw2ICs2Miw3IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9wZXJ0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KIAogI2luY2x1ZGUgInNtc2M5MTF4LmgiCiAKQEAgLTE0Nyw2ICsxNDgsOSBAQAogCS8qIHJlZ3VsYXRvcnMgKi8KIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tTTVNDOTExWF9OVU1fU1VQUExJRVNdOwogCisJLyogUmVzZXQgR1BJTyAqLworCXN0cnVjdCBncGlvX2Rlc2MgKnJlc2V0X2dwaW9kOworCiAJLyogY2xvY2sgKi8KIAlzdHJ1Y3QgY2xrICpjbGs7CiB9OwpAQCAtNDM4LDYgKzQ0MiwxMSBAQAogCQluZXRkZXZfZXJyKG5kZXYsICJjb3VsZG4ndCBnZXQgcmVndWxhdG9ycyAlZFxuIiwKIAkJCQlyZXQpOwogCisJLyogUmVxdWVzdCBvcHRpb25hbCBSRVNFVCBHUElPICovCisJcGRhdGEtPnJlc2V0X2dwaW9kID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoJnBkZXYtPmRldiwKKwkJCQkJCSAgICAgInJlc2V0IiwKKwkJCQkJCSAgICAgR1BJT0RfT1VUX0xPVyk7CisKIAkvKiBSZXF1ZXN0IGNsb2NrICovCiAJcGRhdGEtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihwZGF0YS0+Y2xrKSkKQEAgLTEwOTksMTUgKzExMDgsOCBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9idXNfMjsKIAl9CiAKLQlpZiAoc21zYzkxMXhfbWlpX3Byb2JlKGRldikgPCAwKSB7Ci0JCVNNU0NfV0FSTihwZGF0YSwgcHJvYmUsICJFcnJvciByZWdpc3RlcmluZyBtaWkgYnVzIik7Ci0JCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX2J1c18zOwotCX0KLQogCXJldHVybiAwOwogCi1lcnJfb3V0X3VucmVnaXN0ZXJfYnVzXzM6Ci0JbWRpb2J1c191bnJlZ2lzdGVyKHBkYXRhLT5taWlfYnVzKTsKIGVycl9vdXRfZnJlZV9idXNfMjoKIAltZGlvYnVzX2ZyZWUocGRhdGEtPm1paV9idXMpOwogZXJyX291dF8xOgpAQCAtMTUxNCwyMyArMTUxNiw5MCBAQAogCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX1NUUywgMHhGRkZGRkZGRik7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBzbXNjOTExeF9pcnFoYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2lkOworCXN0cnVjdCBzbXNjOTExeF9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KGRldik7CisJdTMyIGludHN0cyA9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBJTlRfU1RTKTsKKwl1MzIgaW50ZW4gPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgSU5UX0VOKTsKKwlpbnQgc2VydmljZWQgPSBJUlFfTk9ORTsKKwl1MzIgdGVtcDsKKworCWlmICh1bmxpa2VseShpbnRzdHMgJiBpbnRlbiAmIElOVF9TVFNfU1dfSU5UXykpIHsKKwkJdGVtcCA9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBJTlRfRU4pOworCQl0ZW1wICY9ICh+SU5UX0VOX1NXX0lOVF9FTl8pOworCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9FTiwgdGVtcCk7CisJCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX1NUUywgSU5UX1NUU19TV19JTlRfKTsKKwkJcGRhdGEtPnNvZnR3YXJlX2lycV9zaWduYWwgPSAxOworCQlzbXBfd21iKCk7CisJCXNlcnZpY2VkID0gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKHVubGlrZWx5KGludHN0cyAmIGludGVuICYgSU5UX1NUU19SWFNUT1BfSU5UXykpIHsKKwkJLyogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBtdWx0aWNhc3QgdXBkYXRlIHNjaGVkdWxlZCBhbmQKKwkJICogaXQgaXMgbm93IHNhZmUgdG8gY29tcGxldGUgdGhlIHVwZGF0ZSAqLworCQlTTVNDX1RSQUNFKHBkYXRhLCBpbnRyLCAiUlggU3RvcCBpbnRlcnJ1cHQiKTsKKwkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfU1RTLCBJTlRfU1RTX1JYU1RPUF9JTlRfKTsKKwkJaWYgKHBkYXRhLT5tdWx0aWNhc3RfdXBkYXRlX3BlbmRpbmcpCisJCQlzbXNjOTExeF9yeF9tdWx0aWNhc3RfdXBkYXRlX3dvcmthcm91bmQocGRhdGEpOworCQlzZXJ2aWNlZCA9IElSUV9IQU5ETEVEOworCX0KKworCWlmIChpbnRzdHMgJiBpbnRlbiAmIElOVF9TVFNfVERGQV8pIHsKKwkJdGVtcCA9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBGSUZPX0lOVCk7CisJCXRlbXAgfD0gRklGT19JTlRfVFhfQVZBSUxfTEVWRUxfOworCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIEZJRk9fSU5ULCB0ZW1wKTsKKwkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfU1RTLCBJTlRfU1RTX1RERkFfKTsKKwkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworCQlzZXJ2aWNlZCA9IElSUV9IQU5ETEVEOworCX0KKworCWlmICh1bmxpa2VseShpbnRzdHMgJiBpbnRlbiAmIElOVF9TVFNfUlhFXykpIHsKKwkJU01TQ19UUkFDRShwZGF0YSwgaW50ciwgIlJYIEVycm9yIGludGVycnVwdCIpOworCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9TVFMsIElOVF9TVFNfUlhFXyk7CisJCXNlcnZpY2VkID0gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGxpa2VseShpbnRzdHMgJiBpbnRlbiAmIElOVF9TVFNfUlNGTF8pKSB7CisJCWlmIChsaWtlbHkobmFwaV9zY2hlZHVsZV9wcmVwKCZwZGF0YS0+bmFwaSkpKSB7CisJCQkvKiBEaXNhYmxlIFJ4IGludGVycnVwdHMgKi8KKwkJCXRlbXAgPSBzbXNjOTExeF9yZWdfcmVhZChwZGF0YSwgSU5UX0VOKTsKKwkJCXRlbXAgJj0gKH5JTlRfRU5fUlNGTF9FTl8pOworCQkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfRU4sIHRlbXApOworCQkJLyogU2NoZWR1bGUgYSBOQVBJIHBvbGwgKi8KKwkJCV9fbmFwaV9zY2hlZHVsZSgmcGRhdGEtPm5hcGkpOworCQl9IGVsc2UgeworCQkJU01TQ19XQVJOKHBkYXRhLCByeF9lcnIsICJuYXBpX3NjaGVkdWxlX3ByZXAgZmFpbGVkIik7CisJCX0KKwkJc2VydmljZWQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gc2VydmljZWQ7Cit9CisKIHN0YXRpYyBpbnQgc21zYzkxMXhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBzbXNjOTExeF9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KGRldik7CiAJdW5zaWduZWQgaW50IHRpbWVvdXQ7CiAJdW5zaWduZWQgaW50IHRlbXA7CiAJdW5zaWduZWQgaW50IGludGNmZzsKKwlpbnQgcmV0dmFsOworCWludCBpcnFfZmxhZ3M7CiAKLQkvKiBpZiB0aGUgcGh5IGlzIG5vdCB5ZXQgcmVnaXN0ZXJlZCwgcmV0cnkgbGF0ZXIqLworCS8qIGZpbmQgYW5kIHN0YXJ0IHRoZSBnaXZlbiBwaHkgKi8KIAlpZiAoIWRldi0+cGh5ZGV2KSB7Ci0JCVNNU0NfV0FSTihwZGF0YSwgaHcsICJwaHlfZGV2IGlzIE5VTEwiKTsKLQkJcmV0dXJuIC1FQUdBSU47CisJCXJldHZhbCA9IHNtc2M5MTF4X21paV9wcm9iZShkZXYpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJU01TQ19XQVJOKHBkYXRhLCBwcm9iZSwgIkVycm9yIHN0YXJ0aW5nIHBoeSIpOworCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKIAkvKiBSZXNldCB0aGUgTEFOOTExeCAqLwotCWlmIChzbXNjOTExeF9zb2Z0X3Jlc2V0KHBkYXRhKSkgeworCXJldHZhbCA9IHNtc2M5MTF4X3NvZnRfcmVzZXQocGRhdGEpOworCWlmIChyZXR2YWwpIHsKIAkJU01TQ19XQVJOKHBkYXRhLCBodywgInNvZnQgcmVzZXQgZmFpbGVkIik7Ci0JCXJldHVybiAtRUlPOworCQlnb3RvIG1paV9mcmVlX291dDsKIAl9CiAKIAlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIEhXX0NGRywgMHgwMDA1MDAwMCk7CkBAIC0xNTg2LDYgKzE2NTUsMTUgQEAKIAlwZGF0YS0+c29mdHdhcmVfaXJxX3NpZ25hbCA9IDA7CiAJc21wX3dtYigpOwogCisJaXJxX2ZsYWdzID0gaXJxX2dldF90cmlnZ2VyX3R5cGUoZGV2LT5pcnEpOworCXJldHZhbCA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBzbXNjOTExeF9pcnFoYW5kbGVyLAorCQkJICAgICBpcnFfZmxhZ3MgfCBJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJU01TQ19XQVJOKHBkYXRhLCBwcm9iZSwKKwkJCSAgIlVuYWJsZSB0byBjbGFpbSByZXF1ZXN0ZWQgaXJxOiAlZCIsIGRldi0+aXJxKTsKKwkJZ290byBtaWlfZnJlZV9vdXQ7CisJfQorCiAJdGVtcCA9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBJTlRfRU4pOwogCXRlbXAgfD0gSU5UX0VOX1NXX0lOVF9FTl87CiAJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfRU4sIHRlbXApOwpAQCAtMTYwMCw3ICsxNjc4LDggQEAKIAlpZiAoIXBkYXRhLT5zb2Z0d2FyZV9pcnFfc2lnbmFsKSB7CiAJCW5ldGRldl93YXJuKGRldiwgIklTUiBmYWlsZWQgc2lnbmFsaW5nIHRlc3QgKElSUSAlZClcbiIsCiAJCQkgICAgZGV2LT5pcnEpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBpcnFfc3RvcF9vdXQ7CiAJfQogCVNNU0NfVFJBQ0UocGRhdGEsIGlmdXAsICJJUlEgaGFuZGxlciBwYXNzZWQgdGVzdCB1c2luZyBJUlEgJWQiLAogCQkgICBkZXYtPmlycSk7CkBAIC0xNjQ2LDYgKzE3MjUsMTQgQEAKIAogCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CiAJcmV0dXJuIDA7CisKK2lycV9zdG9wX291dDoKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKK21paV9mcmVlX291dDoKKwlwaHlfZGlzY29ubmVjdChkZXYtPnBoeWRldik7CisJZGV2LT5waHlkZXYgPSBOVUxMOworb3V0OgorCXJldHVybiByZXR2YWw7CiB9CiAKIC8qIEVudHJ5IHBvaW50IGZvciBzdG9wcGluZyB0aGUgaW50ZXJmYWNlICovCkBAIC0xNjY3LDkgKzE3NTQsMTUgQEAKIAlkZXYtPnN0YXRzLnJ4X2Ryb3BwZWQgKz0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIFJYX0RST1ApOwogCXNtc2M5MTF4X3R4X3VwZGF0ZV90eGNvdW50ZXJzKGRldik7CiAKKwlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwogCS8qIEJyaW5nIHRoZSBQSFkgZG93biAqLwotCWlmIChkZXYtPnBoeWRldikKKwlpZiAoZGV2LT5waHlkZXYpIHsKIAkJcGh5X3N0b3AoZGV2LT5waHlkZXYpOworCQlwaHlfZGlzY29ubmVjdChkZXYtPnBoeWRldik7CisJCWRldi0+cGh5ZGV2ID0gTlVMTDsKKwl9CisJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAogCVNNU0NfVFJBQ0UocGRhdGEsIGlmZG93biwgIkludGVyZmFjZSBzdG9wcGVkIik7CiAJcmV0dXJuIDA7CkBAIC0xODExLDY3ICsxOTA0LDYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGF0YS0+bWFjX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHNtc2M5MTF4X2lycWhhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7Ci0Jc3RydWN0IHNtc2M5MTF4X2RhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1MzIgaW50c3RzID0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIElOVF9TVFMpOwotCXUzMiBpbnRlbiA9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBJTlRfRU4pOwotCWludCBzZXJ2aWNlZCA9IElSUV9OT05FOwotCXUzMiB0ZW1wOwotCi0JaWYgKHVubGlrZWx5KGludHN0cyAmIGludGVuICYgSU5UX1NUU19TV19JTlRfKSkgewotCQl0ZW1wID0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIElOVF9FTik7Ci0JCXRlbXAgJj0gKH5JTlRfRU5fU1dfSU5UX0VOXyk7Ci0JCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX0VOLCB0ZW1wKTsKLQkJc21zYzkxMXhfcmVnX3dyaXRlKHBkYXRhLCBJTlRfU1RTLCBJTlRfU1RTX1NXX0lOVF8pOwotCQlwZGF0YS0+c29mdHdhcmVfaXJxX3NpZ25hbCA9IDE7Ci0JCXNtcF93bWIoKTsKLQkJc2VydmljZWQgPSBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAodW5saWtlbHkoaW50c3RzICYgaW50ZW4gJiBJTlRfU1RTX1JYU1RPUF9JTlRfKSkgewotCQkvKiBDYWxsZWQgd2hlbiB0aGVyZSBpcyBhIG11bHRpY2FzdCB1cGRhdGUgc2NoZWR1bGVkIGFuZAotCQkgKiBpdCBpcyBub3cgc2FmZSB0byBjb21wbGV0ZSB0aGUgdXBkYXRlICovCi0JCVNNU0NfVFJBQ0UocGRhdGEsIGludHIsICJSWCBTdG9wIGludGVycnVwdCIpOwotCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9TVFMsIElOVF9TVFNfUlhTVE9QX0lOVF8pOwotCQlpZiAocGRhdGEtPm11bHRpY2FzdF91cGRhdGVfcGVuZGluZykKLQkJCXNtc2M5MTF4X3J4X211bHRpY2FzdF91cGRhdGVfd29ya2Fyb3VuZChwZGF0YSk7Ci0JCXNlcnZpY2VkID0gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKGludHN0cyAmIGludGVuICYgSU5UX1NUU19UREZBXykgewotCQl0ZW1wID0gc21zYzkxMXhfcmVnX3JlYWQocGRhdGEsIEZJRk9fSU5UKTsKLQkJdGVtcCB8PSBGSUZPX0lOVF9UWF9BVkFJTF9MRVZFTF87Ci0JCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgRklGT19JTlQsIHRlbXApOwotCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9TVFMsIElOVF9TVFNfVERGQV8pOwotCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci0JCXNlcnZpY2VkID0gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JaWYgKHVubGlrZWx5KGludHN0cyAmIGludGVuICYgSU5UX1NUU19SWEVfKSkgewotCQlTTVNDX1RSQUNFKHBkYXRhLCBpbnRyLCAiUlggRXJyb3IgaW50ZXJydXB0Iik7Ci0JCXNtc2M5MTF4X3JlZ193cml0ZShwZGF0YSwgSU5UX1NUUywgSU5UX1NUU19SWEVfKTsKLQkJc2VydmljZWQgPSBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAobGlrZWx5KGludHN0cyAmIGludGVuICYgSU5UX1NUU19SU0ZMXykpIHsKLQkJaWYgKGxpa2VseShuYXBpX3NjaGVkdWxlX3ByZXAoJnBkYXRhLT5uYXBpKSkpIHsKLQkJCS8qIERpc2FibGUgUnggaW50ZXJydXB0cyAqLwotCQkJdGVtcCA9IHNtc2M5MTF4X3JlZ19yZWFkKHBkYXRhLCBJTlRfRU4pOwotCQkJdGVtcCAmPSAofklOVF9FTl9SU0ZMX0VOXyk7Ci0JCQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9FTiwgdGVtcCk7Ci0JCQkvKiBTY2hlZHVsZSBhIE5BUEkgcG9sbCAqLwotCQkJX19uYXBpX3NjaGVkdWxlKCZwZGF0YS0+bmFwaSk7Ci0JCX0gZWxzZSB7Ci0JCQlTTVNDX1dBUk4ocGRhdGEsIHJ4X2VyciwgIm5hcGlfc2NoZWR1bGVfcHJlcCBmYWlsZWQiKTsKLQkJfQotCQlzZXJ2aWNlZCA9IElSUV9IQU5ETEVEOwotCX0KLQotCXJldHVybiBzZXJ2aWNlZDsKLX0KLQogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiBzdGF0aWMgdm9pZCBzbXNjOTExeF9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTIyOTEsMTYgKzIzMjMsMTQgQEAKIAlwZGF0YSA9IG5ldGRldl9wcml2KGRldik7CiAJQlVHX09OKCFwZGF0YSk7CiAJQlVHX09OKCFwZGF0YS0+aW9hZGRyKTsKLQlCVUdfT04oIWRldi0+cGh5ZGV2KTsKKwlXQVJOX09OKGRldi0+cGh5ZGV2KTsKIAogCVNNU0NfVFJBQ0UocGRhdGEsIGlmZG93biwgIlN0b3BwaW5nIGRyaXZlciIpOwogCi0JcGh5X2Rpc2Nvbm5lY3QoZGV2LT5waHlkZXYpOwogCW1kaW9idXNfdW5yZWdpc3RlcihwZGF0YS0+bWlpX2J1cyk7CiAJbWRpb2J1c19mcmVlKHBkYXRhLT5taWlfYnVzKTsKIAogCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKIAkJCQkJICAgInNtc2M5MTF4LW1lbW9yeSIpOwogCWlmICghcmVzKQpAQCAtMjM4NSw4ICsyNDE1LDcgQEAKIAlzdHJ1Y3Qgc21zYzkxMXhfZGF0YSAqcGRhdGE7CiAJc3RydWN0IHNtc2M5MTF4X3BsYXRmb3JtX2NvbmZpZyAqY29uZmlnID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQl1bnNpZ25lZCBpbnQgaW50Y2ZnID0gMDsKLQlpbnQgcmVzX3NpemUsIGlycSwgaXJxX2ZsYWdzOworCWludCByZXNfc2l6ZSwgaXJxOwogCWludCByZXR2YWw7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLApAQCAtMjQyNSw3ICsyNDU0LDYgQEAKIAogCXBkYXRhID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlkZXYtPmlycSA9IGlycTsKLQlpcnFfZmxhZ3MgPSBpcnFfZ2V0X3RyaWdnZXJfdHlwZShpcnEpOwogCXBkYXRhLT5pb2FkZHIgPSBpb3JlbWFwX25vY2FjaGUocmVzLT5zdGFydCwgcmVzX3NpemUpOwogCiAJcGRhdGEtPmRldiA9IGRldjsKQEAgLTI0NzIsNDEgKzI1MDAsMjEgQEAKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBvdXRfZGlzYWJsZV9yZXNvdXJjZXM7CiAKLQkvKiBjb25maWd1cmUgaXJxIHBvbGFyaXR5IGFuZCB0eXBlIGJlZm9yZSBjb25uZWN0aW5nIGlzciAqLwotCWlmIChwZGF0YS0+Y29uZmlnLmlycV9wb2xhcml0eSA9PSBTTVNDOTExWF9JUlFfUE9MQVJJVFlfQUNUSVZFX0hJR0gpCi0JCWludGNmZyB8PSBJTlRfQ0ZHX0lSUV9QT0xfOwotCi0JaWYgKHBkYXRhLT5jb25maWcuaXJxX3R5cGUgPT0gU01TQzkxMVhfSVJRX1RZUEVfUFVTSF9QVUxMKQotCQlpbnRjZmcgfD0gSU5UX0NGR19JUlFfVFlQRV87Ci0KLQlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIElOVF9DRkcsIGludGNmZyk7Ci0KLQkvKiBFbnN1cmUgaW50ZXJydXB0cyBhcmUgZ2xvYmFsbHkgZGlzYWJsZWQgYmVmb3JlIGNvbm5lY3RpbmcgSVNSICovCi0Jc21zYzkxMXhfZGlzYWJsZV9pcnFfY2hpcChkZXYpOwotCi0JcmV0dmFsID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIHNtc2M5MTF4X2lycWhhbmRsZXIsCi0JCQkgICAgIGlycV9mbGFncyB8IElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIGRldik7Ci0JaWYgKHJldHZhbCkgewotCQlTTVNDX1dBUk4ocGRhdGEsIHByb2JlLAotCQkJICAiVW5hYmxlIHRvIGNsYWltIHJlcXVlc3RlZCBpcnE6ICVkIiwgZGV2LT5pcnEpOwotCQlnb3RvIG91dF9kaXNhYmxlX3Jlc291cmNlczsKLQl9Ci0KIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCi0JcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKHJldHZhbCkgewotCQlTTVNDX1dBUk4ocGRhdGEsIHByb2JlLCAiRXJyb3IgJWkgcmVnaXN0ZXJpbmcgZGV2aWNlIiwgcmV0dmFsKTsKLQkJZ290byBvdXRfZnJlZV9pcnE7Ci0JfSBlbHNlIHsKLQkJU01TQ19UUkFDRShwZGF0YSwgcHJvYmUsCi0JCQkgICAiTmV0d29yayBpbnRlcmZhY2U6IFwiJXNcIiIsIGRldi0+bmFtZSk7Ci0JfQotCiAJcmV0dmFsID0gc21zYzkxMXhfbWlpX2luaXQocGRldiwgZGV2KTsKIAlpZiAocmV0dmFsKSB7CiAJCVNNU0NfV0FSTihwZGF0YSwgcHJvYmUsICJFcnJvciAlaSBpbml0aWFsaXNpbmcgbWlpIiwgcmV0dmFsKTsKLQkJZ290byBvdXRfdW5yZWdpc3Rlcl9uZXRkZXZfNTsKKwkJZ290byBvdXRfZGlzYWJsZV9yZXNvdXJjZXM7CisJfQorCisJcmV0dmFsID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJaWYgKHJldHZhbCkgeworCQlTTVNDX1dBUk4ocGRhdGEsIHByb2JlLCAiRXJyb3IgJWkgcmVnaXN0ZXJpbmcgZGV2aWNlIiwgcmV0dmFsKTsKKwkJZ290byBvdXRfZGlzYWJsZV9yZXNvdXJjZXM7CisJfSBlbHNlIHsKKwkJU01TQ19UUkFDRShwZGF0YSwgcHJvYmUsCisJCQkgICAiTmV0d29yayBpbnRlcmZhY2U6IFwiJXNcIiIsIGRldi0+bmFtZSk7CiAJfQogCiAJc3Bpbl9sb2NrX2lycSgmcGRhdGEtPm1hY19sb2NrKTsKQEAgLTI1NDQsMTAgKzI1NTIsNiBAQAogCiAJcmV0dXJuIDA7CiAKLW91dF91bnJlZ2lzdGVyX25ldGRldl81OgotCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci1vdXRfZnJlZV9pcnE6Ci0JZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiBvdXRfZGlzYWJsZV9yZXNvdXJjZXM6CiAJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL0tjb25maWcKaW5kZXggOGYwNmE2Ni4uYzczMmI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9LY29uZmlnCkBAIC0xMDQsNiArMTA0LDE4IEBACiAJICBkZXZpY2UgZHJpdmVyLiBUaGlzIGRyaXZlciBpcyB1c2VkIG9uIGZvciB0aGUgU1RpIHNlcmllcwogCSAgU09DcyBHTUFDIGV0aGVybmV0IGNvbnRyb2xsZXIuCiAKK2NvbmZpZyBEV01BQ19TVE0zMgorCXRyaXN0YXRlICJTVE0zMiBEV01BQyBzdXBwb3J0IgorCWRlZmF1bHQgQVJDSF9TVE0zMgorCWRlcGVuZHMgb24gT0YgJiYgSEFTX0lPTUVNCisJc2VsZWN0IE1GRF9TWVNDT04KKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciBldGhlcm5ldCBjb250cm9sbGVyIG9uIFNUTTMyIFNPQ3MuCisKKwkgIFRoaXMgc2VsZWN0cyBTVE0zMiBTb0MgZ2x1ZSBsYXllciBzdXBwb3J0IGZvciB0aGUgc3RtbWFjCisJICBkZXZpY2UgZHJpdmVyLiBUaGlzIGRyaXZlciBpcyB1c2VkIG9uIGZvciB0aGUgU1RNMzIgc2VyaWVzCisJICBTT0NzIEdNQUMgZXRoZXJuZXQgY29udHJvbGxlci4KKwogY29uZmlnIERXTUFDX1NVTlhJCiAJdHJpc3RhdGUgIkFsbHdpbm5lciBHTUFDIHN1cHBvcnQiCiAJZGVmYXVsdCBBUkNIX1NVTlhJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL01ha2VmaWxlCmluZGV4IDQ0YjYzMGMuLmYwYzkzOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL01ha2VmaWxlCkBAIC0xMyw2ICsxMyw3IEBACiBvYmotJChDT05GSUdfRFdNQUNfUk9DS0NISVApCSs9IGR3bWFjLXJrLm8KIG9iai0kKENPTkZJR19EV01BQ19TT0NGUEdBKQkrPSBkd21hYy1hbHRyLXNvY2ZwZ2Eubwogb2JqLSQoQ09ORklHX0RXTUFDX1NUSSkJCSs9IGR3bWFjLXN0aS5vCitvYmotJChDT05GSUdfRFdNQUNfU1RNMzIpCSs9IGR3bWFjLXN0bTMyLm8KIG9iai0kKENPTkZJR19EV01BQ19TVU5YSSkJKz0gZHdtYWMtc3VueGkubwogb2JqLSQoQ09ORklHX0RXTUFDX0dFTkVSSUMpCSs9IGR3bWFjLWdlbmVyaWMubwogc3RtbWFjLXBsYXRmb3JtLW9ianM6PSBzdG1tYWNfcGxhdGZvcm0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvY29tbW9uLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9jb21tb24uaAppbmRleCAyNTMzYjkxLi5kMzI5MmM0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvY29tbW9uLmgKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdG1tYWMuaD4KICNpbmNsdWRlIDxsaW51eC9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTEFOXzgwMjFRKQogI2RlZmluZSBTVE1NQUNfVkxBTl9UQUdfVVNFRAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMtcmsuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjLXJrLmMKaW5kZXggOTIxMDU5MS4uMzc0MGE0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMtcmsuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYy1yay5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjaW5jbHVkZSAic3RtbWFjX3BsYXRmb3JtLmgiCiAKQEAgLTMwMSw2ICszMDIsMTE4IEBACiAJLnNldF9ybWlpX3NwZWVkID0gcmszMjg4X3NldF9ybWlpX3NwZWVkLAogfTsKIAorI2RlZmluZSBSSzMzNjZfR1JGX1NPQ19DT042CTB4MDQxOAorI2RlZmluZSBSSzMzNjZfR1JGX1NPQ19DT043CTB4MDQxYworCisvKiBSSzMzNjZfR1JGX1NPQ19DT042ICovCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1BIWV9JTlRGX1NFTF9SR01JSQkoR1JGX0JJVCg5KSB8IEdSRl9DTFJfQklUKDEwKSB8IFwKKwkJCQkJIEdSRl9DTFJfQklUKDExKSkKKyNkZWZpbmUgUkszMzY2X0dNQUNfUEhZX0lOVEZfU0VMX1JNSUkJKEdSRl9DTFJfQklUKDkpIHwgR1JGX0NMUl9CSVQoMTApIHwgXAorCQkJCQkgR1JGX0JJVCgxMSkpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX0ZMT1dfQ1RSTAkJR1JGX0JJVCg4KQorI2RlZmluZSBSSzMzNjZfR01BQ19GTE9XX0NUUkxfQ0xSCUdSRl9DTFJfQklUKDgpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1NQRUVEXzEwTQkJR1JGX0NMUl9CSVQoNykKKyNkZWZpbmUgUkszMzY2X0dNQUNfU1BFRURfMTAwTQkJR1JGX0JJVCg3KQorI2RlZmluZSBSSzMzNjZfR01BQ19STUlJX0NMS18yNU0JR1JGX0JJVCgzKQorI2RlZmluZSBSSzMzNjZfR01BQ19STUlJX0NMS18yXzVNCUdSRl9DTFJfQklUKDMpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX0NMS18xMjVNCQkoR1JGX0NMUl9CSVQoNCkgfCBHUkZfQ0xSX0JJVCg1KSkKKyNkZWZpbmUgUkszMzY2X0dNQUNfQ0xLXzI1TQkJKEdSRl9CSVQoNCkgfCBHUkZfQklUKDUpKQorI2RlZmluZSBSSzMzNjZfR01BQ19DTEtfMl81TQkJKEdSRl9DTFJfQklUKDQpIHwgR1JGX0JJVCg1KSkKKyNkZWZpbmUgUkszMzY2X0dNQUNfUk1JSV9NT0RFCQlHUkZfQklUKDYpCisjZGVmaW5lIFJLMzM2Nl9HTUFDX1JNSUlfTU9ERV9DTFIJR1JGX0NMUl9CSVQoNikKKworLyogUkszMzY2X0dSRl9TT0NfQ09ONyAqLworI2RlZmluZSBSSzMzNjZfR01BQ19UWENMS19ETFlfRU5BQkxFCUdSRl9CSVQoNykKKyNkZWZpbmUgUkszMzY2X0dNQUNfVFhDTEtfRExZX0RJU0FCTEUJR1JGX0NMUl9CSVQoNykKKyNkZWZpbmUgUkszMzY2X0dNQUNfUlhDTEtfRExZX0VOQUJMRQlHUkZfQklUKDE1KQorI2RlZmluZSBSSzMzNjZfR01BQ19SWENMS19ETFlfRElTQUJMRQlHUkZfQ0xSX0JJVCgxNSkKKyNkZWZpbmUgUkszMzY2X0dNQUNfQ0xLX1JYX0RMX0NGRyh2YWwpCUhJV09SRF9VUERBVEUodmFsLCAweDdGLCA4KQorI2RlZmluZSBSSzMzNjZfR01BQ19DTEtfVFhfRExfQ0ZHKHZhbCkJSElXT1JEX1VQREFURSh2YWwsIDB4N0YsIDApCisKK3N0YXRpYyB2b2lkIHJrMzM2Nl9zZXRfdG9fcmdtaWkoc3RydWN0IHJrX3ByaXZfZGF0YSAqYnNwX3ByaXYsCisJCQkJaW50IHR4X2RlbGF5LCBpbnQgcnhfZGVsYXkpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmJzcF9wcml2LT5wZGV2LT5kZXY7CisKKwlpZiAoSVNfRVJSKGJzcF9wcml2LT5ncmYpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IE1pc3Npbmcgcm9ja2NoaXAsZ3JmIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzY2X0dSRl9TT0NfQ09ONiwKKwkJICAgICBSSzMzNjZfR01BQ19QSFlfSU5URl9TRUxfUkdNSUkgfAorCQkgICAgIFJLMzM2Nl9HTUFDX1JNSUlfTU9ERV9DTFIpOworCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzNjZfR1JGX1NPQ19DT043LAorCQkgICAgIFJLMzM2Nl9HTUFDX1JYQ0xLX0RMWV9FTkFCTEUgfAorCQkgICAgIFJLMzM2Nl9HTUFDX1RYQ0xLX0RMWV9FTkFCTEUgfAorCQkgICAgIFJLMzM2Nl9HTUFDX0NMS19SWF9ETF9DRkcocnhfZGVsYXkpIHwKKwkJICAgICBSSzMzNjZfR01BQ19DTEtfVFhfRExfQ0ZHKHR4X2RlbGF5KSk7Cit9CisKK3N0YXRpYyB2b2lkIHJrMzM2Nl9zZXRfdG9fcm1paShzdHJ1Y3QgcmtfcHJpdl9kYXRhICpic3BfcHJpdikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYnNwX3ByaXYtPnBkZXYtPmRldjsKKworCWlmIChJU19FUlIoYnNwX3ByaXYtPmdyZikpIHsKKwkJZGV2X2VycihkZXYsICIlczogTWlzc2luZyByb2NrY2hpcCxncmYgcHJvcGVydHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzNjZfR1JGX1NPQ19DT042LAorCQkgICAgIFJLMzM2Nl9HTUFDX1BIWV9JTlRGX1NFTF9STUlJIHwgUkszMzY2X0dNQUNfUk1JSV9NT0RFKTsKK30KKworc3RhdGljIHZvaWQgcmszMzY2X3NldF9yZ21paV9zcGVlZChzdHJ1Y3QgcmtfcHJpdl9kYXRhICpic3BfcHJpdiwgaW50IHNwZWVkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZic3BfcHJpdi0+cGRldi0+ZGV2OworCisJaWYgKElTX0VSUihic3BfcHJpdi0+Z3JmKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBNaXNzaW5nIHJvY2tjaGlwLGdyZiBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJaWYgKHNwZWVkID09IDEwKQorCQlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzY2X0dSRl9TT0NfQ09ONiwKKwkJCSAgICAgUkszMzY2X0dNQUNfQ0xLXzJfNU0pOworCWVsc2UgaWYgKHNwZWVkID09IDEwMCkKKwkJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM2Nl9HUkZfU09DX0NPTjYsCisJCQkgICAgIFJLMzM2Nl9HTUFDX0NMS18yNU0pOworCWVsc2UgaWYgKHNwZWVkID09IDEwMDApCisJCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzNjZfR1JGX1NPQ19DT042LAorCQkJICAgICBSSzMzNjZfR01BQ19DTEtfMTI1TSk7CisJZWxzZQorCQlkZXZfZXJyKGRldiwgInVua25vd24gc3BlZWQgdmFsdWUgZm9yIFJHTUlJISBzcGVlZD0lZCIsIHNwZWVkKTsKK30KKworc3RhdGljIHZvaWQgcmszMzY2X3NldF9ybWlpX3NwZWVkKHN0cnVjdCBya19wcml2X2RhdGEgKmJzcF9wcml2LCBpbnQgc3BlZWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmJzcF9wcml2LT5wZGV2LT5kZXY7CisKKwlpZiAoSVNfRVJSKGJzcF9wcml2LT5ncmYpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IE1pc3Npbmcgcm9ja2NoaXAsZ3JmIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3BlZWQgPT0gMTApIHsKKwkJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM2Nl9HUkZfU09DX0NPTjYsCisJCQkgICAgIFJLMzM2Nl9HTUFDX1JNSUlfQ0xLXzJfNU0gfAorCQkJICAgICBSSzMzNjZfR01BQ19TUEVFRF8xME0pOworCX0gZWxzZSBpZiAoc3BlZWQgPT0gMTAwKSB7CisJCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzNjZfR1JGX1NPQ19DT042LAorCQkJICAgICBSSzMzNjZfR01BQ19STUlJX0NMS18yNU0gfAorCQkJICAgICBSSzMzNjZfR01BQ19TUEVFRF8xMDBNKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGRldiwgInVua25vd24gc3BlZWQgdmFsdWUgZm9yIFJNSUkhIHNwZWVkPSVkIiwgc3BlZWQpOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBya19nbWFjX29wcyByazMzNjZfb3BzID0geworCS5zZXRfdG9fcmdtaWkgPSByazMzNjZfc2V0X3RvX3JnbWlpLAorCS5zZXRfdG9fcm1paSA9IHJrMzM2Nl9zZXRfdG9fcm1paSwKKwkuc2V0X3JnbWlpX3NwZWVkID0gcmszMzY2X3NldF9yZ21paV9zcGVlZCwKKwkuc2V0X3JtaWlfc3BlZWQgPSByazMzNjZfc2V0X3JtaWlfc3BlZWQsCit9OworCiAjZGVmaW5lIFJLMzM2OF9HUkZfU09DX0NPTjE1CTB4MDQzYwogI2RlZmluZSBSSzMzNjhfR1JGX1NPQ19DT04xNgkweDA0NDAKIApAQCAtNDEzLDYgKzUyNiwxMTggQEAKIAkuc2V0X3JtaWlfc3BlZWQgPSByazMzNjhfc2V0X3JtaWlfc3BlZWQsCiB9OwogCisjZGVmaW5lIFJLMzM5OV9HUkZfU09DX0NPTjUJMHhjMjE0CisjZGVmaW5lIFJLMzM5OV9HUkZfU09DX0NPTjYJMHhjMjE4CisKKy8qIFJLMzM5OV9HUkZfU09DX0NPTjUgKi8KKyNkZWZpbmUgUkszMzk5X0dNQUNfUEhZX0lOVEZfU0VMX1JHTUlJCShHUkZfQklUKDkpIHwgR1JGX0NMUl9CSVQoMTApIHwgXAorCQkJCQkgR1JGX0NMUl9CSVQoMTEpKQorI2RlZmluZSBSSzMzOTlfR01BQ19QSFlfSU5URl9TRUxfUk1JSQkoR1JGX0NMUl9CSVQoOSkgfCBHUkZfQ0xSX0JJVCgxMCkgfCBcCisJCQkJCSBHUkZfQklUKDExKSkKKyNkZWZpbmUgUkszMzk5X0dNQUNfRkxPV19DVFJMCQlHUkZfQklUKDgpCisjZGVmaW5lIFJLMzM5OV9HTUFDX0ZMT1dfQ1RSTF9DTFIJR1JGX0NMUl9CSVQoOCkKKyNkZWZpbmUgUkszMzk5X0dNQUNfU1BFRURfMTBNCQlHUkZfQ0xSX0JJVCg3KQorI2RlZmluZSBSSzMzOTlfR01BQ19TUEVFRF8xMDBNCQlHUkZfQklUKDcpCisjZGVmaW5lIFJLMzM5OV9HTUFDX1JNSUlfQ0xLXzI1TQlHUkZfQklUKDMpCisjZGVmaW5lIFJLMzM5OV9HTUFDX1JNSUlfQ0xLXzJfNU0JR1JGX0NMUl9CSVQoMykKKyNkZWZpbmUgUkszMzk5X0dNQUNfQ0xLXzEyNU0JCShHUkZfQ0xSX0JJVCg0KSB8IEdSRl9DTFJfQklUKDUpKQorI2RlZmluZSBSSzMzOTlfR01BQ19DTEtfMjVNCQkoR1JGX0JJVCg0KSB8IEdSRl9CSVQoNSkpCisjZGVmaW5lIFJLMzM5OV9HTUFDX0NMS18yXzVNCQkoR1JGX0NMUl9CSVQoNCkgfCBHUkZfQklUKDUpKQorI2RlZmluZSBSSzMzOTlfR01BQ19STUlJX01PREUJCUdSRl9CSVQoNikKKyNkZWZpbmUgUkszMzk5X0dNQUNfUk1JSV9NT0RFX0NMUglHUkZfQ0xSX0JJVCg2KQorCisvKiBSSzMzOTlfR1JGX1NPQ19DT042ICovCisjZGVmaW5lIFJLMzM5OV9HTUFDX1RYQ0xLX0RMWV9FTkFCTEUJR1JGX0JJVCg3KQorI2RlZmluZSBSSzMzOTlfR01BQ19UWENMS19ETFlfRElTQUJMRQlHUkZfQ0xSX0JJVCg3KQorI2RlZmluZSBSSzMzOTlfR01BQ19SWENMS19ETFlfRU5BQkxFCUdSRl9CSVQoMTUpCisjZGVmaW5lIFJLMzM5OV9HTUFDX1JYQ0xLX0RMWV9ESVNBQkxFCUdSRl9DTFJfQklUKDE1KQorI2RlZmluZSBSSzMzOTlfR01BQ19DTEtfUlhfRExfQ0ZHKHZhbCkJSElXT1JEX1VQREFURSh2YWwsIDB4N0YsIDgpCisjZGVmaW5lIFJLMzM5OV9HTUFDX0NMS19UWF9ETF9DRkcodmFsKQlISVdPUkRfVVBEQVRFKHZhbCwgMHg3RiwgMCkKKworc3RhdGljIHZvaWQgcmszMzk5X3NldF90b19yZ21paShzdHJ1Y3QgcmtfcHJpdl9kYXRhICpic3BfcHJpdiwKKwkJCQlpbnQgdHhfZGVsYXksIGludCByeF9kZWxheSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYnNwX3ByaXYtPnBkZXYtPmRldjsKKworCWlmIChJU19FUlIoYnNwX3ByaXYtPmdyZikpIHsKKwkJZGV2X2VycihkZXYsICIlczogTWlzc2luZyByb2NrY2hpcCxncmYgcHJvcGVydHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzOTlfR1JGX1NPQ19DT041LAorCQkgICAgIFJLMzM5OV9HTUFDX1BIWV9JTlRGX1NFTF9SR01JSSB8CisJCSAgICAgUkszMzk5X0dNQUNfUk1JSV9NT0RFX0NMUik7CisJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM5OV9HUkZfU09DX0NPTjYsCisJCSAgICAgUkszMzk5X0dNQUNfUlhDTEtfRExZX0VOQUJMRSB8CisJCSAgICAgUkszMzk5X0dNQUNfVFhDTEtfRExZX0VOQUJMRSB8CisJCSAgICAgUkszMzk5X0dNQUNfQ0xLX1JYX0RMX0NGRyhyeF9kZWxheSkgfAorCQkgICAgIFJLMzM5OV9HTUFDX0NMS19UWF9ETF9DRkcodHhfZGVsYXkpKTsKK30KKworc3RhdGljIHZvaWQgcmszMzk5X3NldF90b19ybWlpKHN0cnVjdCBya19wcml2X2RhdGEgKmJzcF9wcml2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZic3BfcHJpdi0+cGRldi0+ZGV2OworCisJaWYgKElTX0VSUihic3BfcHJpdi0+Z3JmKSkgeworCQlkZXZfZXJyKGRldiwgIiVzOiBNaXNzaW5nIHJvY2tjaGlwLGdyZiBwcm9wZXJ0eVxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM5OV9HUkZfU09DX0NPTjUsCisJCSAgICAgUkszMzk5X0dNQUNfUEhZX0lOVEZfU0VMX1JNSUkgfCBSSzMzOTlfR01BQ19STUlJX01PREUpOworfQorCitzdGF0aWMgdm9pZCByazMzOTlfc2V0X3JnbWlpX3NwZWVkKHN0cnVjdCBya19wcml2X2RhdGEgKmJzcF9wcml2LCBpbnQgc3BlZWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmJzcF9wcml2LT5wZGV2LT5kZXY7CisKKwlpZiAoSVNfRVJSKGJzcF9wcml2LT5ncmYpKSB7CisJCWRldl9lcnIoZGV2LCAiJXM6IE1pc3Npbmcgcm9ja2NoaXAsZ3JmIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3BlZWQgPT0gMTApCisJCXJlZ21hcF93cml0ZShic3BfcHJpdi0+Z3JmLCBSSzMzOTlfR1JGX1NPQ19DT041LAorCQkJICAgICBSSzMzOTlfR01BQ19DTEtfMl81TSk7CisJZWxzZSBpZiAoc3BlZWQgPT0gMTAwKQorCQlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzk5X0dSRl9TT0NfQ09ONSwKKwkJCSAgICAgUkszMzk5X0dNQUNfQ0xLXzI1TSk7CisJZWxzZSBpZiAoc3BlZWQgPT0gMTAwMCkKKwkJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM5OV9HUkZfU09DX0NPTjUsCisJCQkgICAgIFJLMzM5OV9HTUFDX0NMS18xMjVNKTsKKwllbHNlCisJCWRldl9lcnIoZGV2LCAidW5rbm93biBzcGVlZCB2YWx1ZSBmb3IgUkdNSUkhIHNwZWVkPSVkIiwgc3BlZWQpOworfQorCitzdGF0aWMgdm9pZCByazMzOTlfc2V0X3JtaWlfc3BlZWQoc3RydWN0IHJrX3ByaXZfZGF0YSAqYnNwX3ByaXYsIGludCBzcGVlZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYnNwX3ByaXYtPnBkZXYtPmRldjsKKworCWlmIChJU19FUlIoYnNwX3ByaXYtPmdyZikpIHsKKwkJZGV2X2VycihkZXYsICIlczogTWlzc2luZyByb2NrY2hpcCxncmYgcHJvcGVydHlcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzcGVlZCA9PSAxMCkgeworCQlyZWdtYXBfd3JpdGUoYnNwX3ByaXYtPmdyZiwgUkszMzk5X0dSRl9TT0NfQ09ONSwKKwkJCSAgICAgUkszMzk5X0dNQUNfUk1JSV9DTEtfMl81TSB8CisJCQkgICAgIFJLMzM5OV9HTUFDX1NQRUVEXzEwTSk7CisJfSBlbHNlIGlmIChzcGVlZCA9PSAxMDApIHsKKwkJcmVnbWFwX3dyaXRlKGJzcF9wcml2LT5ncmYsIFJLMzM5OV9HUkZfU09DX0NPTjUsCisJCQkgICAgIFJLMzM5OV9HTUFDX1JNSUlfQ0xLXzI1TSB8CisJCQkgICAgIFJLMzM5OV9HTUFDX1NQRUVEXzEwME0pOworCX0gZWxzZSB7CisJCWRldl9lcnIoZGV2LCAidW5rbm93biBzcGVlZCB2YWx1ZSBmb3IgUk1JSSEgc3BlZWQ9JWQiLCBzcGVlZCk7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJrX2dtYWNfb3BzIHJrMzM5OV9vcHMgPSB7CisJLnNldF90b19yZ21paSA9IHJrMzM5OV9zZXRfdG9fcmdtaWksCisJLnNldF90b19ybWlpID0gcmszMzk5X3NldF90b19ybWlpLAorCS5zZXRfcmdtaWlfc3BlZWQgPSByazMzOTlfc2V0X3JnbWlpX3NwZWVkLAorCS5zZXRfcm1paV9zcGVlZCA9IHJrMzM5OV9zZXRfcm1paV9zcGVlZCwKK307CisKIHN0YXRpYyBpbnQgZ21hY19jbGtfaW5pdChzdHJ1Y3QgcmtfcHJpdl9kYXRhICpic3BfcHJpdikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYnNwX3ByaXYtPnBkZXYtPmRldjsKQEAgLTYyOSw2ICs4NTQsMTYgQEAKIAkJCQkJCQkicm9ja2NoaXAsZ3JmIik7CiAJYnNwX3ByaXYtPnBkZXYgPSBwZGV2OwogCisJZ21hY19jbGtfaW5pdChic3BfcHJpdik7CisKKwlyZXR1cm4gYnNwX3ByaXY7Cit9CisKK3N0YXRpYyBpbnQgcmtfZ21hY19wb3dlcnVwKHN0cnVjdCBya19wcml2X2RhdGEgKmJzcF9wcml2KQoreworCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmJzcF9wcml2LT5wZGV2LT5kZXY7CisKIAkvKnJtaWkgb3IgcmdtaWkqLwogCWlmIChic3BfcHJpdi0+cGh5X2lmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSSkgewogCQlkZXZfaW5mbyhkZXYsICJpbml0IGZvciBSR01JSVxuIik7CkBAIC02NDEsMTUgKzg3Niw2IEBACiAJCWRldl9lcnIoZGV2LCAiTk8gaW50ZXJmYWNlIGRlZmluZWQhXG4iKTsKIAl9CiAKLQlnbWFjX2Nsa19pbml0KGJzcF9wcml2KTsKLQotCXJldHVybiBic3BfcHJpdjsKLX0KLQotc3RhdGljIGludCBya19nbWFjX3Bvd2VydXAoc3RydWN0IHJrX3ByaXZfZGF0YSAqYnNwX3ByaXYpCi17Ci0JaW50IHJldDsKLQogCXJldCA9IHBoeV9wb3dlcl9vbihic3BfcHJpdiwgdHJ1ZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTY1OCwxMSArODg0LDE5IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisJcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHJrX2dtYWNfcG93ZXJkb3duKHN0cnVjdCBya19wcml2X2RhdGEgKmdtYWMpCiB7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmdtYWMtPnBkZXYtPmRldjsKKworCXBtX3J1bnRpbWVfcHV0X3N5bmMoZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwogCXBoeV9wb3dlcl9vbihnbWFjLCBmYWxzZSk7CiAJZ21hY19jbGtfZW5hYmxlKGdtYWMsIGZhbHNlKTsKIH0KQEAgLTc2MCw3ICs5OTQsOSBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcmtfZ21hY19kd21hY19tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMjI4LWdtYWMiLCAuZGF0YSA9ICZyazMyMjhfb3BzIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMyODgtZ21hYyIsIC5kYXRhID0gJnJrMzI4OF9vcHMgfSwKKwl7IC5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM2Ni1nbWFjIiwgLmRhdGEgPSAmcmszMzY2X29wcyB9LAogCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzY4LWdtYWMiLCAuZGF0YSA9ICZyazMzNjhfb3BzIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZ21hYyIsIC5kYXRhID0gJnJrMzM5OV9vcHMgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBya19nbWFjX2R3bWFjX21hdGNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjLXN0bTMyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYy1zdG0zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTkyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYy1zdG0zMi5jCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogZHdtYWMtc3RtMzIuYyAtIERXTUFDIFNwZWNpZmljIEdsdWUgbGF5ZXIgZm9yIFNUTTMyIE1DVQorICoKKyAqIENvcHlyaWdodCAoQykgQWxleGFuZHJlIFRvcmd1ZSAyMDE1CisgKiBBdXRob3I6ICBBbGV4YW5kcmUgVG9yZ3VlIDxhbGV4YW5kcmUudG9yZ3VlQGdtYWlsLmNvbT4KKyAqIExpY2Vuc2UgdGVybXM6ICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgdmVyc2lvbiAyCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RtbWFjLmg+CisKKyNpbmNsdWRlICJzdG1tYWNfcGxhdGZvcm0uaCIKKworI2RlZmluZSBNSUlfUEhZX1NFTF9NQVNLCUJJVCgyMykKKworc3RydWN0IHN0bTMyX2R3bWFjIHsKKwlzdHJ1Y3QgY2xrICpjbGtfdHg7CisJc3RydWN0IGNsayAqY2xrX3J4OworCXUzMiBtb2RlX3JlZzsJCS8qIE1BQyBnbHVlLWxvZ2ljIG1vZGUgcmVnaXN0ZXIgKi8KKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJdTMyIHNwZWVkOworfTsKKworc3RhdGljIGludCBzdG0zMl9kd21hY19pbml0KHN0cnVjdCBwbGF0X3N0bW1hY2VuZXRfZGF0YSAqcGxhdF9kYXQpCit7CisJc3RydWN0IHN0bTMyX2R3bWFjICpkd21hYyA9IHBsYXRfZGF0LT5ic3BfcHJpdjsKKwl1MzIgcmVnID0gZHdtYWMtPm1vZGVfcmVnOworCXUzMiB2YWw7CisJaW50IHJldDsKKworCXZhbCA9IChwbGF0X2RhdC0+aW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUkpID8gMCA6IDE7CisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGR3bWFjLT5yZWdtYXAsIHJlZywgTUlJX1BIWV9TRUxfTUFTSywgdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGR3bWFjLT5jbGtfdHgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZHdtYWMtPmNsa19yeCk7CisJaWYgKHJldCkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGR3bWFjLT5jbGtfdHgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc3RtMzJfZHdtYWNfY2xrX2Rpc2FibGUoc3RydWN0IHN0bTMyX2R3bWFjICpkd21hYykKK3sKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZHdtYWMtPmNsa190eCk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGR3bWFjLT5jbGtfcngpOworfQorCitzdGF0aWMgaW50IHN0bTMyX2R3bWFjX3BhcnNlX2RhdGEoc3RydWN0IHN0bTMyX2R3bWFjICpkd21hYywKKwkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCWludCBlcnI7CisKKwkvKiAgR2V0IFRYL1JYIGNsb2NrcyAqLworCWR3bWFjLT5jbGtfdHggPSBkZXZtX2Nsa19nZXQoZGV2LCAibWFjLWNsay10eCIpOworCWlmIChJU19FUlIoZHdtYWMtPmNsa190eCkpIHsKKwkJZGV2X2VycihkZXYsICJObyB0eCBjbG9jayBwcm92aWRlZC4uLlxuIik7CisJCXJldHVybiBQVFJfRVJSKGR3bWFjLT5jbGtfdHgpOworCX0KKwlkd21hYy0+Y2xrX3J4ID0gZGV2bV9jbGtfZ2V0KGRldiwgIm1hYy1jbGstcngiKTsKKwlpZiAoSVNfRVJSKGR3bWFjLT5jbGtfcngpKSB7CisJCWRldl9lcnIoZGV2LCAiTm8gcnggY2xvY2sgcHJvdmlkZWQuLi5cbiIpOworCQlyZXR1cm4gUFRSX0VSUihkd21hYy0+Y2xrX3J4KTsKKwl9CisKKwkvKiBHZXQgbW9kZSByZWdpc3RlciAqLworCWR3bWFjLT5yZWdtYXAgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKG5wLCAic3Qsc3lzY29uIik7CisJaWYgKElTX0VSUihkd21hYy0+cmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIoZHdtYWMtPnJlZ21hcCk7CisKKwllcnIgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChucCwgInN0LHN5c2NvbiIsIDEsICZkd21hYy0+bW9kZV9yZWcpOworCWlmIChlcnIpCisJCWRldl9lcnIoZGV2LCAiQ2FuJ3QgZ2V0IHN5c2NvbmZpZyBtb2RlIG9mZnNldCAoJWQpXG4iLCBlcnIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzdG0zMl9kd21hY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbGF0X3N0bW1hY2VuZXRfZGF0YSAqcGxhdF9kYXQ7CisJc3RydWN0IHN0bW1hY19yZXNvdXJjZXMgc3RtbWFjX3JlczsKKwlzdHJ1Y3Qgc3RtMzJfZHdtYWMgKmR3bWFjOworCWludCByZXQ7CisKKwlyZXQgPSBzdG1tYWNfZ2V0X3BsYXRmb3JtX3Jlc291cmNlcyhwZGV2LCAmc3RtbWFjX3Jlcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBsYXRfZGF0ID0gc3RtbWFjX3Byb2JlX2NvbmZpZ19kdChwZGV2LCAmc3RtbWFjX3Jlcy5tYWMpOworCWlmIChJU19FUlIocGxhdF9kYXQpKQorCQlyZXR1cm4gUFRSX0VSUihwbGF0X2RhdCk7CisKKwlkd21hYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmR3bWFjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkd21hYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBzdG0zMl9kd21hY19wYXJzZV9kYXRhKGR3bWFjLCAmcGRldi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBwYXJzZSBPRiBkYXRhXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwbGF0X2RhdC0+YnNwX3ByaXYgPSBkd21hYzsKKworCXJldCA9IHN0bTMyX2R3bWFjX2luaXQocGxhdF9kYXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBzdG1tYWNfZHZyX3Byb2JlKCZwZGV2LT5kZXYsIHBsYXRfZGF0LCAmc3RtbWFjX3Jlcyk7CisJaWYgKHJldCkKKwkJc3RtMzJfZHdtYWNfY2xrX2Rpc2FibGUoZHdtYWMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzdG0zMl9kd21hY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCByZXQgPSBzdG1tYWNfZHZyX3JlbW92ZSgmcGRldi0+ZGV2KTsKKworCXN0bTMyX2R3bWFjX2Nsa19kaXNhYmxlKHByaXYtPnBsYXQtPmJzcF9wcml2KTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgc3RtMzJfZHdtYWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RtbWFjX3N1c3BlbmQoZGV2KTsKKwlzdG0zMl9kd21hY19jbGtfZGlzYWJsZShwcml2LT5wbGF0LT5ic3BfcHJpdik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN0bTMyX2R3bWFjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RtMzJfZHdtYWNfaW5pdChwcml2LT5wbGF0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3RtbWFjX3Jlc3VtZShkZXYpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHN0bTMyX2R3bWFjX3BtX29wcywKKwlzdG0zMl9kd21hY19zdXNwZW5kLCBzdG0zMl9kd21hY19yZXN1bWUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdG0zMl9kd21hY19tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtMzItZHdtYWMifSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdG0zMl9kd21hY19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN0bTMyX2R3bWFjX2RyaXZlciA9IHsKKwkucHJvYmUgID0gc3RtMzJfZHdtYWNfcHJvYmUsCisJLnJlbW92ZSA9IHN0bTMyX2R3bWFjX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSAgICAgICAgICAgPSAic3RtMzItZHdtYWMiLAorCQkucG0JCT0gJnN0bTMyX2R3bWFjX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gc3RtMzJfZHdtYWNfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN0bTMyX2R3bWFjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkFsZXhhbmRyZSBUb3JndWUgPGFsZXhhbmRyZS50b3JndWVAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTVE1pY3JvZWxlY3Ryb25pY3MgTUNVIERXTUFDIFNwZWNpZmljIEdsdWUgbGF5ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjMTAwMF9jb3JlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYzEwMDBfY29yZS5jCmluZGV4IGNiZWZlOWUuLjdkZjRmZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjMTAwMF9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMxMDAwX2NvcmUuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJCW51bWhhc2hyZWdzID0gODsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJfZGVidWcoIlNUTU1BQzogZXJyIGluIHNldHRpbmcgbXVsaXRjYXN0IGZpbHRlclxuIik7CisJCXByX2RlYnVnKCJTVE1NQUM6IGVyciBpbiBzZXR0aW5nIG11bHRpY2FzdCBmaWx0ZXJcbiIpOwogCQlyZXR1cm47CiAJCWJyZWFrOwogCX0KQEAgLTI2MSw3ICsyNjEsNyBAQAogCX0KIAlpZiAobW9kZSAmIFdBS0VfVUNBU1QpIHsKIAkJcHJfZGVidWcoIkdNQUM6IFdPTCBvbiBnbG9iYWwgdW5pY2FzdFxuIik7Ci0JCXBtdCB8PSBnbG9iYWxfdW5pY2FzdDsKKwkJcG10IHw9IHBvd2VyX2Rvd24gfCBnbG9iYWxfdW5pY2FzdCB8IHdha2VfdXBfZnJhbWVfZW47CiAJfQogCiAJd3JpdGVsKHBtdCwgaW9hZGRyICsgR01BQ19QTVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWM0X2NvcmUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjNF9jb3JlLmMKaW5kZXggZGY1NTgwZC4uNTEwMTliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWM0X2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYzRfY29yZS5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAl9CiAJaWYgKG1vZGUgJiBXQUtFX1VDQVNUKSB7CiAJCXByX2RlYnVnKCJHTUFDOiBXT0wgb24gZ2xvYmFsIHVuaWNhc3RcbiIpOwotCQlwbXQgfD0gZ2xvYmFsX3VuaWNhc3Q7CisJCXBtdCB8PSBwb3dlcl9kb3duIHwgZ2xvYmFsX3VuaWNhc3QgfCB3YWtlX3VwX2ZyYW1lX2VuOwogCX0KIAogCXdyaXRlbChwbXQsIGlvYWRkciArIEdNQUNfUE1UKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wbGF0Zm9ybS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3BsYXRmb3JtLmMKaW5kZXggNzU2YmI1NC4uMGEwZDZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3BsYXRmb3JtLmMKQEAgLTI2NSw2ICsyNjUsNyBAQAogCSAqIG9uY2UgbmVlZGVkIG9uIG90aGVyIHBsYXRmb3Jtcy4KIAkgKi8KIAlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJzdCxzcGVhcjYwMC1nbWFjIikgfHwKKwkJb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJzbnBzLGR3bWFjLTMuNTBhIikgfHwKIAkJb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJzbnBzLGR3bWFjLTMuNzBhIikgfHwKIAkJb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJzbnBzLGR3bWFjIikpIHsKIAkJLyogTm90ZSB0aGF0IHRoZSBtYXgtZnJhbWUtc2l6ZSBwYXJhbWV0ZXIgYXMgZGVmaW5lZCBpbiB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wdHAuYwppbmRleCAxNzBhMThiLi42ZTNiODI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcHRwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3B0cC5jCkBAIC0xODcsNyArMTg3LDcgQEAKIAlpZiAoSVNfRVJSKHByaXYtPnB0cF9jbG9jaykpIHsKIAkJcHJpdi0+cHRwX2Nsb2NrID0gTlVMTDsKIAkJcHJfZXJyKCJwdHBfY2xvY2tfcmVnaXN0ZXIoKSBmYWlsZWQgb24gJXNcbiIsIHByaXYtPmRldi0+bmFtZSk7Ci0JfSBlbHNlCisJfSBlbHNlIGlmIChwcml2LT5wdHBfY2xvY2spCiAJCXByX2RlYnVnKCJBZGRlZCBQVFAgSFcgY2xvY2sgc3VjY2Vzc2Z1bGx5IG9uICVzXG4iLAogCQkJIHByaXYtPmRldi0+bmFtZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N5bm9wc3lzL2R3Y19ldGhfcW9zLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zeW5vcHN5cy9kd2NfZXRoX3Fvcy5jCmluZGV4IDlmMTU5YTcuLjBkMDA1MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N5bm9wc3lzL2R3Y19ldGhfcW9zLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3lub3BzeXMvZHdjX2V0aF9xb3MuYwpAQCAtMTI0Niw3ICsxMjQ2LDcgQEAKIAlscC0+bWlpX2J1cy0+cmVhZCAgPSAmZHdjZXFvc19tZGlvX3JlYWQ7CiAJbHAtPm1paV9idXMtPndyaXRlID0gJmR3Y2Vxb3NfbWRpb193cml0ZTsKIAlscC0+bWlpX2J1cy0+cHJpdiA9IGxwOwotCWxwLT5taWlfYnVzLT5wYXJlbnQgPSAmbHAtPm5kZXYtPmRldjsKKwlscC0+bWlpX2J1cy0+cGFyZW50ID0gJmxwLT5wZGV2LT5kZXY7CiAKIAlvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGxwLT5wZGV2LT5kZXYub2Zfbm9kZSwgMCwgJnJlcyk7CiAJc25wcmludGYobHAtPm1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIlLjhsbHgiLApAQCAtMTYyMiwxMyArMTYyMiw3IEBACiAJCURXQ0VRT1NfTU1DX0NUUkxfUlNUT05SRCk7CiAJZHdjZXFvc19lbmFibGVfbW1jX2ludGVycnVwdChscCk7CiAKLQkvKiBFbmFibGUgSW50ZXJydXB0cyAqLwotCWR3Y2Vxb3Nfd3JpdGUobHAsIFJFR19EV0NFUU9TX0RNQV9DSDBfSUUsCi0JCSAgICAgIERXQ0VRT1NfRE1BX0NIMF9JRV9OSUUgfAotCQkgICAgICBEV0NFUU9TX0RNQV9DSDBfSUVfUklFIHwgRFdDRVFPU19ETUFfQ0gwX0lFX1RJRSB8Ci0JCSAgICAgIERXQ0VRT1NfRE1BX0NIMF9JRV9BSUUgfAotCQkgICAgICBEV0NFUU9TX0RNQV9DSDBfSUVfRkJFRSk7Ci0KKwlkd2NlcW9zX3dyaXRlKGxwLCBSRUdfRFdDRVFPU19ETUFfQ0gwX0lFLCAwKTsKIAlkd2NlcW9zX3dyaXRlKGxwLCBSRUdfRFdDRVFPU19NQUNfSUUsIDApOwogCiAJZHdjZXFvc193cml0ZShscCwgUkVHX0RXQ0VRT1NfTUFDX0NGRywgRFdDRVFPU19NQUNfQ0ZHX0lQQyB8CkBAIC0xOTA1LDYgKzE4OTksMTUgQEAKIAluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKIAl0YXNrbGV0X2VuYWJsZSgmbHAtPnR4X2JkcmVjbGFpbV90YXNrbGV0KTsKIAorCS8qIEVuYWJsZSBJbnRlcnJ1cHRzIC0tIGRvIHRoaXMgb25seSBhZnRlciB3ZSBlbmFibGUgTkFQSSBhbmQgdGhlCisJICogdGFza2xldC4KKwkgKi8KKwlkd2NlcW9zX3dyaXRlKGxwLCBSRUdfRFdDRVFPU19ETUFfQ0gwX0lFLAorCQkgICAgICBEV0NFUU9TX0RNQV9DSDBfSUVfTklFIHwKKwkJICAgICAgRFdDRVFPU19ETUFfQ0gwX0lFX1JJRSB8IERXQ0VRT1NfRE1BX0NIMF9JRV9USUUgfAorCQkgICAgICBEV0NFUU9TX0RNQV9DSDBfSUVfQUlFIHwKKwkJICAgICAgRFdDRVFPU19ETUFfQ0gwX0lFX0ZCRUUpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI3NDAsNyArMjc0Myw3IEBACiAJbHAtPm1zZ19lbmFibGUgPSBtc2dsZXZlbDsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBkd2NlcW9zX2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBkd2NlcW9zX2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbyAgICA9IGR3Y2Vxb3NfZ2V0X2RydmluZm8sCiAJLmdldF9saW5rICAgICAgID0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X3BhdXNlcGFyYW0gPSBkd2NlcW9zX2dldF9wYXVzZXBhcmFtLApAQCAtMjc1OCw3ICsyNzYxLDcgQEAKIAkuc2V0X2xpbmtfa3NldHRpbmdzID0gcGh5X2V0aHRvb2xfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBuZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbgkJPSBkd2NlcW9zX29wZW4sCiAJLm5kb19zdG9wCQk9IGR3Y2Vxb3Nfc3RvcCwKIAkubmRvX3N0YXJ0X3htaXQJCT0gZHdjZXFvc19zdGFydF94bWl0LApAQCAtMjg1MCwyNSArMjg1MywxNyBAQAogCiAJbmRldi0+ZmVhdHVyZXMgPSBuZGV2LT5od19mZWF0dXJlczsKIAotCW5ldGlmX25hcGlfYWRkKG5kZXYsICZscC0+bmFwaSwgZHdjZXFvc19yeF9wb2xsLCBOQVBJX1BPTExfV0VJR0hUKTsKLQotCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlLCBhYm9ydGluZy5cbiIpOwotCQlnb3RvIGVycl9vdXRfY2xrX2Rpc19hcGVyOwotCX0KLQogCWxwLT5waHlfcmVmX2NsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAicGh5X3JlZl9jbGsiKTsKIAlpZiAoSVNfRVJSKGxwLT5waHlfcmVmX2NsaykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicGh5X3JlZl9jbGsgY2xvY2sgbm90IGZvdW5kLlxuIik7CiAJCXJldCA9IFBUUl9FUlIobHAtPnBoeV9yZWZfY2xrKTsKLQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfbmV0ZGV2OworCQlnb3RvIGVycl9vdXRfY2xrX2Rpc19hcGVyOwogCX0KIAogCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShscC0+cGh5X3JlZl9jbGspOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5hYmxlIHRvIGVuYWJsZSBkZXZpY2UgY2xvY2suXG4iKTsKLQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfbmV0ZGV2OworCQlnb3RvIGVycl9vdXRfY2xrX2Rpc19hcGVyOwogCX0KIAogCWxwLT5waHlfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobHAtPnBkZXYtPmRldi5vZl9ub2RlLApAQCAtMjg3Nyw3ICsyODcyLDcgQEAKIAkJcmV0ID0gb2ZfcGh5X3JlZ2lzdGVyX2ZpeGVkX2xpbmsobHAtPnBkZXYtPmRldi5vZl9ub2RlKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgZml4ZWQtbGluayIpOwotCQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfY2xrX25vdGlmaWVyOworCQkJZ290byBlcnJfb3V0X2Nsa19kaXNfcGh5OwogCQl9CiAKIAkJbHAtPnBoeV9ub2RlID0gb2Zfbm9kZV9nZXQobHAtPnBkZXYtPmRldi5vZl9ub2RlKTsKQEAgLTI4ODYsNyArMjg4MSw3IEBACiAJcmV0ID0gb2ZfZ2V0X3BoeV9tb2RlKGxwLT5wZGV2LT5kZXYub2Zfbm9kZSk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmbHAtPnBkZXYtPmRldiwgImVycm9yIGluIGdldHRpbmcgcGh5IGkvZlxuIik7Ci0JCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX2Nsa19ub3RpZmllcjsKKwkJZ290byBlcnJfb3V0X2Nsa19kaXNfcGh5OwogCX0KIAogCWxwLT5waHlfaW50ZXJmYWNlID0gcmV0OwpAQCAtMjg5NCwxNCArMjg4OSwxNCBAQAogCXJldCA9IGR3Y2Vxb3NfbWlpX2luaXQobHApOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmbHAtPnBkZXYtPmRldiwgImVycm9yIGluIGR3Y2Vxb3NfbWlpX2luaXRcbiIpOwotCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9jbGtfbm90aWZpZXI7CisJCWdvdG8gZXJyX291dF9jbGtfZGlzX3BoeTsKIAl9CiAKIAlyZXQgPSBkd2NlcW9zX21paV9wcm9iZShuZGV2KTsKIAlpZiAocmV0ICE9IDApIHsKIAkJbmV0ZGV2X2VycihuZGV2LCAibWlpX3Byb2JlIGZhaWwuXG4iKTsKIAkJcmV0ID0gLUVOWElPOwotCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9jbGtfbm90aWZpZXI7CisJCWdvdG8gZXJyX291dF9jbGtfZGlzX3BoeTsKIAl9CiAKIAlkd2NlcW9zX3NldF91bWFjX2FkZHIobHAsIGxwLT5uZGV2LT5kZXZfYWRkciwgMCk7CkBAIC0yOTE5LDcgKzI5MTQsNyBAQAogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmbHAtPnBkZXYtPmRldiwgIlVuYWJsZSB0byByZXRyaWV2ZSBEVCwgZXJyb3IgJWRcbiIsCiAJCQlyZXQpOwotCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9jbGtfbm90aWZpZXI7CisJCWdvdG8gZXJyX291dF9jbGtfZGlzX3BoeTsKIAl9CiAJZGV2X2luZm8oJmxwLT5wZGV2LT5kZXYsICJwZGV2LT5pZCAlZCwgYmFzZWFkZHIgMHglMDhseCwgaXJxICVkXG4iLAogCQkgcGRldi0+aWQsIG5kZXYtPmJhc2VfYWRkciwgbmRldi0+aXJxKTsKQEAgLTI5MjksMTggKzI5MjQsMjQgQEAKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmxwLT5wZGV2LT5kZXYsICJVbmFibGUgdG8gcmVxdWVzdCBJUlEgJWQsIGVycm9yICVkXG4iLAogCQkJbmRldi0+aXJxLCByZXQpOwotCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9jbGtfbm90aWZpZXI7CisJCWdvdG8gZXJyX291dF9jbGtfZGlzX3BoeTsKIAl9CiAKIAlpZiAobmV0aWZfbXNnX3Byb2JlKGxwKSkKIAkJbmV0ZGV2X2RiZyhuZGV2LCAibmV0X2xvY2FsQCVwXG4iLCBscCk7CiAKKwluZXRpZl9uYXBpX2FkZChuZGV2LCAmbHAtPm5hcGksIGR3Y2Vxb3NfcnhfcG9sbCwgTkFQSV9QT0xMX1dFSUdIVCk7CisKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVnaXN0ZXIgbmV0IGRldmljZSwgYWJvcnRpbmcuXG4iKTsKKwkJCWdvdG8gZXJyX291dF9jbGtfZGlzX3BoeTsKKwl9CisKIAlyZXR1cm4gMDsKIAotZXJyX291dF91bnJlZ2lzdGVyX2Nsa19ub3RpZmllcjoKK2Vycl9vdXRfY2xrX2Rpc19waHk6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGxwLT5waHlfcmVmX2Nsayk7Ci1lcnJfb3V0X3VucmVnaXN0ZXJfbmV0ZGV2OgotCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogZXJyX291dF9jbGtfZGlzX2FwZXI6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGxwLT5hcGJfcGNsayk7CiBlcnJfb3V0X2ZyZWVfbmV0ZGV2OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGVodXRpL3RlaHV0aS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGVodXRpL3RlaHV0aS5jCmluZGV4IDc0NTJiNWYuLjcxMDhjNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RlaHV0aS90ZWh1dGkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90ZWh1dGkvdGVodXRpLmMKQEAgLTE5ODcsNyArMTk4Nyw3IEBACiAJaWYgKChyZWFkbChuaWMtPnJlZ3MgKyBGUEdBX1ZFUikgJiAweEZGRikgPj0gMzc4KSB7CiAJCWVyciA9IHBjaV9lbmFibGVfbXNpKHBkZXYpOwogCQlpZiAoZXJyKQotCQkJcHJfZXJyKCJDYW4ndCBlbmVibGUgbXNpLiBlcnJvciBpcyAlZFxuIiwgZXJyKTsKKwkJCXByX2VycigiQ2FuJ3QgZW5hYmxlIG1zaS4gZXJyb3IgaXMgJWRcbiIsIGVycik7CiAJCWVsc2UKIAkJCW5pYy0+aXJxX3R5cGUgPSBJUlFfTVNJOwogCX0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3BtYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2NwbWFjLmMKaW5kZXggZDMwMGQ1My4uZmEwY2ZkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3BtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcG1hYy5jCkBAIC01NDYsNyArNTQ2LDggQEAKIAogc3RhdGljIGludCBjcG1hY19zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JaW50IHF1ZXVlLCBsZW47CisJaW50IHF1ZXVlOworCXVuc2lnbmVkIGludCBsZW47CiAJc3RydWN0IGNwbWFjX2Rlc2MgKmRlc2M7CiAJc3RydWN0IGNwbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC01NTYsNyArNTU3LDcgQEAKIAlpZiAodW5saWtlbHkoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKSkKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAotCWxlbiA9IG1heChza2ItPmxlbiwgRVRIX1pMRU4pOworCWxlbiA9IG1heF90KHVuc2lnbmVkIGludCwgc2tiLT5sZW4sIEVUSF9aTEVOKTsKIAlxdWV1ZSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOwogCW5ldGlmX3N0b3Bfc3VicXVldWUoZGV2LCBxdWV1ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYwppbmRleCBmODVkNjA1Li5jNmNmZjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3Bzdy5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAogI2RlZmluZSBSWF9QUklPUklUWV9NQVBQSU5HCTB4NzY1NDMyMTAKICNkZWZpbmUgVFhfUFJJT1JJVFlfTUFQUElORwkweDMzMjIxMTAwCi0jZGVmaW5lIENQRE1BX1RYX1BSSU9SSVRZX01BUAkweDc2NTQzMjEwCisjZGVmaW5lIENQRE1BX1RYX1BSSU9SSVRZX01BUAkweDAxMjM0NTY3CiAKICNkZWZpbmUgQ1BTV19WTEFOX0FXQVJFCQlCSVQoMSkKICNkZWZpbmUgQ1BTV19BTEVfVkxBTl9BV0FSRQkxCkBAIC0xNDAsOSArMTQwLDExIEBACiAjZGVmaW5lIENQU1dfQ01JTlRNQVhfSU5UVkwJKDEwMDAgLyBDUFNXX0NNSU5UTUlOX0NOVCkKICNkZWZpbmUgQ1BTV19DTUlOVE1JTl9JTlRWTAkoKDEwMDAgLyBDUFNXX0NNSU5UTUFYX0NOVCkgKyAxKQogCi0jZGVmaW5lIGNwc3dfc2xhdmVfaW5kZXgocHJpdikJCQkJXAotCQkoKHByaXYtPmRhdGEuZHVhbF9lbWFjKSA/IHByaXYtPmVtYWNfcG9ydCA6CVwKLQkJcHJpdi0+ZGF0YS5hY3RpdmVfc2xhdmUpCisjZGVmaW5lIGNwc3dfc2xhdmVfaW5kZXgoY3BzdywgcHJpdikJCQkJXAorCQkoKGNwc3ctPmRhdGEuZHVhbF9lbWFjKSA/IHByaXYtPmVtYWNfcG9ydCA6CVwKKwkJY3Bzdy0+ZGF0YS5hY3RpdmVfc2xhdmUpCisjZGVmaW5lIElSUV9OVU0JCQkyCisjZGVmaW5lIENQU1dfTUFYX1FVRVVFUwkJOAogCiBzdGF0aWMgaW50IGRlYnVnX2xldmVsOwogbW9kdWxlX3BhcmFtKGRlYnVnX2xldmVsLCBpbnQsIDApOwpAQCAtMzYzLDM4ICszNjUsNDEgQEAKIAlfX3Jhd193cml0ZWwodmFsLCBzbGF2ZS0+cmVncyArIG9mZnNldCk7CiB9CiAKLXN0cnVjdCBjcHN3X3ByaXYgewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlCQkqbmRldjsKLQlzdHJ1Y3QgbmFwaV9zdHJ1Y3QJCW5hcGlfcng7Ci0Jc3RydWN0IG5hcGlfc3RydWN0CQluYXBpX3R4Oworc3RydWN0IGNwc3dfY29tbW9uIHsKIAlzdHJ1Y3QgZGV2aWNlCQkJKmRldjsKIAlzdHJ1Y3QgY3Bzd19wbGF0Zm9ybV9kYXRhCWRhdGE7CisJc3RydWN0IG5hcGlfc3RydWN0CQluYXBpX3J4OworCXN0cnVjdCBuYXBpX3N0cnVjdAkJbmFwaV90eDsKIAlzdHJ1Y3QgY3Bzd19zc19yZWdzIF9faW9tZW0JKnJlZ3M7CiAJc3RydWN0IGNwc3dfd3JfcmVncyBfX2lvbWVtCSp3cl9yZWdzOwogCXU4IF9faW9tZW0JCQkqaHdfc3RhdHM7CiAJc3RydWN0IGNwc3dfaG9zdF9yZWdzIF9faW9tZW0JKmhvc3RfcG9ydF9yZWdzOwotCXUzMgkJCQltc2dfZW5hYmxlOwogCXUzMgkJCQl2ZXJzaW9uOwogCXUzMgkJCQljb2FsX2ludHZsOwogCXUzMgkJCQlidXNfZnJlcV9taHo7CiAJaW50CQkJCXJ4X3BhY2tldF9tYXg7Ci0Jc3RydWN0IGNsawkJCSpjbGs7Ci0JdTgJCQkJbWFjX2FkZHJbRVRIX0FMRU5dOwogCXN0cnVjdCBjcHN3X3NsYXZlCQkqc2xhdmVzOwogCXN0cnVjdCBjcGRtYV9jdGxyCQkqZG1hOwotCXN0cnVjdCBjcGRtYV9jaGFuCQkqdHhjaCwgKnJ4Y2g7CisJc3RydWN0IGNwZG1hX2NoYW4JCSp0eGNoW0NQU1dfTUFYX1FVRVVFU107CisJc3RydWN0IGNwZG1hX2NoYW4JCSpyeGNoW0NQU1dfTUFYX1FVRVVFU107CiAJc3RydWN0IGNwc3dfYWxlCQkJKmFsZTsKLQlib29sCQkJCXJ4X3BhdXNlOwotCWJvb2wJCQkJdHhfcGF1c2U7CiAJYm9vbAkJCQlxdWlya19pcnE7CiAJYm9vbAkJCQlyeF9pcnFfZGlzYWJsZWQ7CiAJYm9vbAkJCQl0eF9pcnFfZGlzYWJsZWQ7Ci0JLyogc25hcHNob3Qgb2YgSVJRIG51bWJlcnMgKi8KLQl1MzIgaXJxc190YWJsZVs0XTsKLQl1MzIgbnVtX2lycXM7Ci0Jc3RydWN0IGNwdHMgKmNwdHM7CisJdTMyIGlycXNfdGFibGVbSVJRX05VTV07CisJc3RydWN0IGNwdHMJCQkqY3B0czsKKwlpbnQJCQkJcnhfY2hfbnVtLCB0eF9jaF9udW07Cit9OworCitzdHJ1Y3QgY3Bzd19wcml2IHsKKwlzdHJ1Y3QgbmV0X2RldmljZQkJKm5kZXY7CisJc3RydWN0IGRldmljZQkJCSpkZXY7CisJdTMyCQkJCW1zZ19lbmFibGU7CisJdTgJCQkJbWFjX2FkZHJbRVRIX0FMRU5dOworCWJvb2wJCQkJcnhfcGF1c2U7CisJYm9vbAkJCQl0eF9wYXVzZTsKIAl1MzIgZW1hY19wb3J0OworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdzsKIH07CiAKIHN0cnVjdCBjcHN3X3N0YXRzIHsKQEAgLTQ1NSwxMDggKzQ2MCw5MiBAQAogCXsgIlJ4IFN0YXJ0IG9mIEZyYW1lIE92ZXJydW5zIiwgQ1BTV19TVEFUKHJ4c29mb3ZlcnJ1bnMpIH0sCiAJeyAiUnggTWlkZGxlIG9mIEZyYW1lIE92ZXJydW5zIiwgQ1BTV19TVEFUKHJ4bW9mb3ZlcnJ1bnMpIH0sCiAJeyAiUnggRE1BIE92ZXJydW5zIiwgQ1BTV19TVEFUKHJ4ZG1hb3ZlcnJ1bnMpIH0sCi0JeyAiUnggRE1BIGNoYW46IGhlYWRfZW5xdWV1ZSIsIENQRE1BX1JYX1NUQVQoaGVhZF9lbnF1ZXVlKSB9LAotCXsgIlJ4IERNQSBjaGFuOiB0YWlsX2VucXVldWUiLCBDUERNQV9SWF9TVEFUKHRhaWxfZW5xdWV1ZSkgfSwKLQl7ICJSeCBETUEgY2hhbjogcGFkX2VucXVldWUiLCBDUERNQV9SWF9TVEFUKHBhZF9lbnF1ZXVlKSB9LAotCXsgIlJ4IERNQSBjaGFuOiBtaXNxdWV1ZWQiLCBDUERNQV9SWF9TVEFUKG1pc3F1ZXVlZCkgfSwKLQl7ICJSeCBETUEgY2hhbjogZGVzY19hbGxvY19mYWlsIiwgQ1BETUFfUlhfU1RBVChkZXNjX2FsbG9jX2ZhaWwpIH0sCi0JeyAiUnggRE1BIGNoYW46IHBhZF9hbGxvY19mYWlsIiwgQ1BETUFfUlhfU1RBVChwYWRfYWxsb2NfZmFpbCkgfSwKLQl7ICJSeCBETUEgY2hhbjogcnVudF9yZWNlaXZlX2J1ZiIsIENQRE1BX1JYX1NUQVQocnVudF9yZWNlaXZlX2J1ZmYpIH0sCi0JeyAiUnggRE1BIGNoYW46IHJ1bnRfdHJhbnNtaXRfYnVmIiwgQ1BETUFfUlhfU1RBVChydW50X3RyYW5zbWl0X2J1ZmYpIH0sCi0JeyAiUnggRE1BIGNoYW46IGVtcHR5X2RlcXVldWUiLCBDUERNQV9SWF9TVEFUKGVtcHR5X2RlcXVldWUpIH0sCi0JeyAiUnggRE1BIGNoYW46IGJ1c3lfZGVxdWV1ZSIsIENQRE1BX1JYX1NUQVQoYnVzeV9kZXF1ZXVlKSB9LAotCXsgIlJ4IERNQSBjaGFuOiBnb29kX2RlcXVldWUiLCBDUERNQV9SWF9TVEFUKGdvb2RfZGVxdWV1ZSkgfSwKLQl7ICJSeCBETUEgY2hhbjogcmVxdWV1ZSIsIENQRE1BX1JYX1NUQVQocmVxdWV1ZSkgfSwKLQl7ICJSeCBETUEgY2hhbjogdGVhcmRvd25fZGVxdWV1ZSIsIENQRE1BX1JYX1NUQVQodGVhcmRvd25fZGVxdWV1ZSkgfSwKLQl7ICJUeCBETUEgY2hhbjogaGVhZF9lbnF1ZXVlIiwgQ1BETUFfVFhfU1RBVChoZWFkX2VucXVldWUpIH0sCi0JeyAiVHggRE1BIGNoYW46IHRhaWxfZW5xdWV1ZSIsIENQRE1BX1RYX1NUQVQodGFpbF9lbnF1ZXVlKSB9LAotCXsgIlR4IERNQSBjaGFuOiBwYWRfZW5xdWV1ZSIsIENQRE1BX1RYX1NUQVQocGFkX2VucXVldWUpIH0sCi0JeyAiVHggRE1BIGNoYW46IG1pc3F1ZXVlZCIsIENQRE1BX1RYX1NUQVQobWlzcXVldWVkKSB9LAotCXsgIlR4IERNQSBjaGFuOiBkZXNjX2FsbG9jX2ZhaWwiLCBDUERNQV9UWF9TVEFUKGRlc2NfYWxsb2NfZmFpbCkgfSwKLQl7ICJUeCBETUEgY2hhbjogcGFkX2FsbG9jX2ZhaWwiLCBDUERNQV9UWF9TVEFUKHBhZF9hbGxvY19mYWlsKSB9LAotCXsgIlR4IERNQSBjaGFuOiBydW50X3JlY2VpdmVfYnVmIiwgQ1BETUFfVFhfU1RBVChydW50X3JlY2VpdmVfYnVmZikgfSwKLQl7ICJUeCBETUEgY2hhbjogcnVudF90cmFuc21pdF9idWYiLCBDUERNQV9UWF9TVEFUKHJ1bnRfdHJhbnNtaXRfYnVmZikgfSwKLQl7ICJUeCBETUEgY2hhbjogZW1wdHlfZGVxdWV1ZSIsIENQRE1BX1RYX1NUQVQoZW1wdHlfZGVxdWV1ZSkgfSwKLQl7ICJUeCBETUEgY2hhbjogYnVzeV9kZXF1ZXVlIiwgQ1BETUFfVFhfU1RBVChidXN5X2RlcXVldWUpIH0sCi0JeyAiVHggRE1BIGNoYW46IGdvb2RfZGVxdWV1ZSIsIENQRE1BX1RYX1NUQVQoZ29vZF9kZXF1ZXVlKSB9LAotCXsgIlR4IERNQSBjaGFuOiByZXF1ZXVlIiwgQ1BETUFfVFhfU1RBVChyZXF1ZXVlKSB9LAotCXsgIlR4IERNQSBjaGFuOiB0ZWFyZG93bl9kZXF1ZXVlIiwgQ1BETUFfVFhfU1RBVCh0ZWFyZG93bl9kZXF1ZXVlKSB9LAogfTsKIAotI2RlZmluZSBDUFNXX1NUQVRTX0xFTglBUlJBWV9TSVpFKGNwc3dfZ3N0cmluZ3Nfc3RhdHMpCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwc3dfc3RhdHMgY3Bzd19nc3RyaW5nc19jaF9zdGF0c1tdID0geworCXsgImhlYWRfZW5xdWV1ZSIsIENQRE1BX1JYX1NUQVQoaGVhZF9lbnF1ZXVlKSB9LAorCXsgInRhaWxfZW5xdWV1ZSIsIENQRE1BX1JYX1NUQVQodGFpbF9lbnF1ZXVlKSB9LAorCXsgInBhZF9lbnF1ZXVlIiwgQ1BETUFfUlhfU1RBVChwYWRfZW5xdWV1ZSkgfSwKKwl7ICJtaXNxdWV1ZWQiLCBDUERNQV9SWF9TVEFUKG1pc3F1ZXVlZCkgfSwKKwl7ICJkZXNjX2FsbG9jX2ZhaWwiLCBDUERNQV9SWF9TVEFUKGRlc2NfYWxsb2NfZmFpbCkgfSwKKwl7ICJwYWRfYWxsb2NfZmFpbCIsIENQRE1BX1JYX1NUQVQocGFkX2FsbG9jX2ZhaWwpIH0sCisJeyAicnVudF9yZWNlaXZlX2J1ZiIsIENQRE1BX1JYX1NUQVQocnVudF9yZWNlaXZlX2J1ZmYpIH0sCisJeyAicnVudF90cmFuc21pdF9idWYiLCBDUERNQV9SWF9TVEFUKHJ1bnRfdHJhbnNtaXRfYnVmZikgfSwKKwl7ICJlbXB0eV9kZXF1ZXVlIiwgQ1BETUFfUlhfU1RBVChlbXB0eV9kZXF1ZXVlKSB9LAorCXsgImJ1c3lfZGVxdWV1ZSIsIENQRE1BX1JYX1NUQVQoYnVzeV9kZXF1ZXVlKSB9LAorCXsgImdvb2RfZGVxdWV1ZSIsIENQRE1BX1JYX1NUQVQoZ29vZF9kZXF1ZXVlKSB9LAorCXsgInJlcXVldWUiLCBDUERNQV9SWF9TVEFUKHJlcXVldWUpIH0sCisJeyAidGVhcmRvd25fZGVxdWV1ZSIsIENQRE1BX1JYX1NUQVQodGVhcmRvd25fZGVxdWV1ZSkgfSwKK307CiAKLSNkZWZpbmUgbmFwaV90b19wcml2KG5hcGkpCWNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgY3Bzd19wcml2LCBuYXBpKQorI2RlZmluZSBDUFNXX1NUQVRTX0NPTU1PTl9MRU4JQVJSQVlfU0laRShjcHN3X2dzdHJpbmdzX3N0YXRzKQorI2RlZmluZSBDUFNXX1NUQVRTX0NIX0xFTglBUlJBWV9TSVpFKGNwc3dfZ3N0cmluZ3NfY2hfc3RhdHMpCisKKyNkZWZpbmUgbmRldl90b19jcHN3KG5kZXYpICgoKHN0cnVjdCBjcHN3X3ByaXYgKiluZXRkZXZfcHJpdihuZGV2KSktPmNwc3cpCisjZGVmaW5lIG5hcGlfdG9fY3BzdyhuYXBpKQljb250YWluZXJfb2YobmFwaSwgc3RydWN0IGNwc3dfY29tbW9uLCBuYXBpKQogI2RlZmluZSBmb3JfZWFjaF9zbGF2ZShwcml2LCBmdW5jLCBhcmcuLi4pCQkJCVwKIAlkbyB7CQkJCQkJCQlcCiAJCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZTsJCQkJXAorCQlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSAocHJpdiktPmNwc3c7CQlcCiAJCWludCBuOwkJCQkJCQlcCi0JCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykJCQkJXAotCQkJKGZ1bmMpKChwcml2KS0+c2xhdmVzICsgcHJpdi0+ZW1hY19wb3J0LCAjI2FyZyk7XAorCQlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpCQkJCVwKKwkJCShmdW5jKSgoY3BzdyktPnNsYXZlcyArIHByaXYtPmVtYWNfcG9ydCwgIyNhcmcpO1wKIAkJZWxzZQkJCQkJCQlcCi0JCQlmb3IgKG4gPSAocHJpdiktPmRhdGEuc2xhdmVzLAkJCVwKLQkJCQkJc2xhdmUgPSAocHJpdiktPnNsYXZlczsJCVwKKwkJCWZvciAobiA9IGNwc3ctPmRhdGEuc2xhdmVzLAkJCVwKKwkJCQkJc2xhdmUgPSBjcHN3LT5zbGF2ZXM7CQlcCiAJCQkJCW47IG4tLSkJCQkJXAogCQkJCShmdW5jKShzbGF2ZSsrLCAjI2FyZyk7CQkJXAogCX0gd2hpbGUgKDApCi0jZGVmaW5lIGNwc3dfZ2V0X3NsYXZlX25kZXYocHJpdiwgX19zbGF2ZV9ub19fKQkJCQlcCi0JKChfX3NsYXZlX25vX18gPCBwcml2LT5kYXRhLnNsYXZlcykgPwkJCQlcCi0JCXByaXYtPnNsYXZlc1tfX3NsYXZlX25vX19dLm5kZXYgOiBOVUxMKQotI2RlZmluZSBjcHN3X2dldF9zbGF2ZV9wcml2KHByaXYsIF9fc2xhdmVfbm9fXykJCQkJXAotCSgoKF9fc2xhdmVfbm9fXyA8IHByaXYtPmRhdGEuc2xhdmVzKSAmJgkJCQlcCi0JCShwcml2LT5zbGF2ZXNbX19zbGF2ZV9ub19fXS5uZGV2KSkgPwkJCVwKLQkJbmV0ZGV2X3ByaXYocHJpdi0+c2xhdmVzW19fc2xhdmVfbm9fX10ubmRldikgOiBOVUxMKQlcCiAKLSNkZWZpbmUgY3Bzd19kdWFsX2VtYWNfc3JjX3BvcnRfZGV0ZWN0KHN0YXR1cywgcHJpdiwgbmRldiwgc2tiKQkJXAorI2RlZmluZSBjcHN3X2R1YWxfZW1hY19zcmNfcG9ydF9kZXRlY3QoY3Bzdywgc3RhdHVzLCBuZGV2LCBza2IpCQlcCiAJZG8gewkJCQkJCQkJXAotCQlpZiAoIXByaXYtPmRhdGEuZHVhbF9lbWFjKQkJCQlcCisJCWlmICghY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpCQkJCVwKIAkJCWJyZWFrOwkJCQkJCVwKIAkJaWYgKENQRE1BX1JYX1NPVVJDRV9QT1JUKHN0YXR1cykgPT0gMSkgewkJXAotCQkJbmRldiA9IGNwc3dfZ2V0X3NsYXZlX25kZXYocHJpdiwgMCk7CQlcCi0JCQlwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CQkJXAorCQkJbmRldiA9IGNwc3ctPnNsYXZlc1swXS5uZGV2OwkJCVwKIAkJCXNrYi0+ZGV2ID0gbmRldjsJCQkJXAogCQl9IGVsc2UgaWYgKENQRE1BX1JYX1NPVVJDRV9QT1JUKHN0YXR1cykgPT0gMikgewkJXAotCQkJbmRldiA9IGNwc3dfZ2V0X3NsYXZlX25kZXYocHJpdiwgMSk7CQlcCi0JCQlwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CQkJXAorCQkJbmRldiA9IGNwc3ctPnNsYXZlc1sxXS5uZGV2OwkJCVwKIAkJCXNrYi0+ZGV2ID0gbmRldjsJCQkJXAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQotI2RlZmluZSBjcHN3X2FkZF9tY2FzdChwcml2LCBhZGRyKQkJCQkJXAorI2RlZmluZSBjcHN3X2FkZF9tY2FzdChjcHN3LCBwcml2LCBhZGRyKQkJCQlcCiAJZG8gewkJCQkJCQkJXAotCQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsJCQkJXAotCQkJc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlID0gcHJpdi0+c2xhdmVzICsJXAorCQlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpIHsJCQkJXAorCQkJc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlID0gY3Bzdy0+c2xhdmVzICsJXAogCQkJCQkJcHJpdi0+ZW1hY19wb3J0OwlcCi0JCQlpbnQgc2xhdmVfcG9ydCA9IGNwc3dfZ2V0X3NsYXZlX3BvcnQocHJpdiwJXAorCQkJaW50IHNsYXZlX3BvcnQgPSBjcHN3X2dldF9zbGF2ZV9wb3J0KAkJXAogCQkJCQkJc2xhdmUtPnNsYXZlX251bSk7CVwKLQkJCWNwc3dfYWxlX2FkZF9tY2FzdChwcml2LT5hbGUsIGFkZHIsCQlcCisJCQljcHN3X2FsZV9hZGRfbWNhc3QoY3Bzdy0+YWxlLCBhZGRyLAkJXAogCQkJCTEgPDwgc2xhdmVfcG9ydCB8IEFMRV9QT1JUX0hPU1QsCVwKIAkJCQlBTEVfVkxBTiwgc2xhdmUtPnBvcnRfdmxhbiwgMCk7CQlcCiAJCX0gZWxzZSB7CQkJCQkJXAotCQkJY3Bzd19hbGVfYWRkX21jYXN0KHByaXYtPmFsZSwgYWRkciwJCVwKKwkJCWNwc3dfYWxlX2FkZF9tY2FzdChjcHN3LT5hbGUsIGFkZHIsCQlcCiAJCQkJQUxFX0FMTF9QT1JUUywJCQkJXAogCQkJCTAsIDAsIDApOwkJCQlcCiAJCX0JCQkJCQkJXAogCX0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbmxpbmUgaW50IGNwc3dfZ2V0X3NsYXZlX3BvcnQoc3RydWN0IGNwc3dfcHJpdiAqcHJpdiwgdTMyIHNsYXZlX251bSkKK3N0YXRpYyBpbmxpbmUgaW50IGNwc3dfZ2V0X3NsYXZlX3BvcnQodTMyIHNsYXZlX251bSkKIHsKIAlyZXR1cm4gc2xhdmVfbnVtICsgMTsKIH0KIAogc3RhdGljIHZvaWQgY3Bzd19zZXRfcHJvbWlzY2lvdXMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGJvb2wgZW5hYmxlKQogewotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgY3Bzd19hbGUgKmFsZSA9IHByaXYtPmFsZTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CisJc3RydWN0IGNwc3dfYWxlICphbGUgPSBjcHN3LT5hbGU7CiAJaW50IGk7CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpIHsKIAkJYm9vbCBmbGFnID0gZmFsc2U7CiAKIAkJLyogRW5hYmxpbmcgcHJvbWlzY3VvdXMgbW9kZSBmb3Igb25lIGludGVyZmFjZSB3aWxsIGJlCiAJCSAqIGNvbW1vbiBmb3IgYm90aCB0aGUgaW50ZXJmYWNlIGFzIHRoZSBpbnRlcmZhY2Ugc2hhcmVzCiAJCSAqIHRoZSBzYW1lIGhhcmR3YXJlIHJlc291cmNlLgogCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspCi0JCQlpZiAocHJpdi0+c2xhdmVzW2ldLm5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCisJCWZvciAoaSA9IDA7IGkgPCBjcHN3LT5kYXRhLnNsYXZlczsgaSsrKQorCQkJaWYgKGNwc3ctPnNsYXZlc1tpXS5uZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQogCQkJCWZsYWcgPSB0cnVlOwogCiAJCWlmICghZW5hYmxlICYmIGZsYWcpIHsKQEAgLTU3OSw3ICs1NjgsNyBAQAogCQkJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaOwogCiAJCQkvKiBEaXNhYmxlIExlYXJuIGZvciBhbGwgcG9ydHMgKGhvc3QgaXMgcG9ydCAwIGFuZCBzbGF2ZXMgYXJlIHBvcnQgMSBhbmQgdXAgKi8KLQkJCWZvciAoaSA9IDA7IGkgPD0gcHJpdi0+ZGF0YS5zbGF2ZXM7IGkrKykgeworCQkJZm9yIChpID0gMDsgaSA8PSBjcHN3LT5kYXRhLnNsYXZlczsgaSsrKSB7CiAJCQkJY3Bzd19hbGVfY29udHJvbF9zZXQoYWxlLCBpLAogCQkJCQkJICAgICBBTEVfUE9SVF9OT0xFQVJOLCAxKTsKIAkJCQljcHN3X2FsZV9jb250cm9sX3NldChhbGUsIGksCkBAIC02MDYsNyArNTk1LDcgQEAKIAkJCWNwc3dfYWxlX2NvbnRyb2xfc2V0KGFsZSwgMCwgQUxFX1AwX1VOSV9GTE9PRCwgMCk7CiAKIAkJCS8qIEVuYWJsZSBMZWFybiBmb3IgYWxsIHBvcnRzIChob3N0IGlzIHBvcnQgMCBhbmQgc2xhdmVzIGFyZSBwb3J0IDEgYW5kIHVwICovCi0JCQlmb3IgKGkgPSAwOyBpIDw9IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspIHsKKwkJCWZvciAoaSA9IDA7IGkgPD0gY3Bzdy0+ZGF0YS5zbGF2ZXM7IGkrKykgewogCQkJCWNwc3dfYWxlX2NvbnRyb2xfc2V0KGFsZSwgaSwKIAkJCQkJCSAgICAgQUxFX1BPUlRfTk9MRUFSTiwgMCk7CiAJCQkJY3Bzd19hbGVfY29udHJvbF9zZXQoYWxlLCBpLApAQCAtNjIwLDE3ICs2MDksMTggQEAKIHN0YXRpYyB2b2lkIGNwc3dfbmRvX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OwogCWludCB2aWQ7CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpCi0JCXZpZCA9IHByaXYtPnNsYXZlc1twcml2LT5lbWFjX3BvcnRdLnBvcnRfdmxhbjsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpCisJCXZpZCA9IGNwc3ctPnNsYXZlc1twcml2LT5lbWFjX3BvcnRdLnBvcnRfdmxhbjsKIAllbHNlCi0JCXZpZCA9IHByaXYtPmRhdGEuZGVmYXVsdF92bGFuOworCQl2aWQgPSBjcHN3LT5kYXRhLmRlZmF1bHRfdmxhbjsKIAogCWlmIChuZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CiAJCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlICovCiAJCWNwc3dfc2V0X3Byb21pc2Npb3VzKG5kZXYsIHRydWUpOwotCQljcHN3X2FsZV9zZXRfYWxsbXVsdGkocHJpdi0+YWxlLCBJRkZfQUxMTVVMVEkpOworCQljcHN3X2FsZV9zZXRfYWxsbXVsdGkoY3Bzdy0+YWxlLCBJRkZfQUxMTVVMVEkpOwogCQlyZXR1cm47CiAJfSBlbHNlIHsKIAkJLyogRGlzYWJsZSBwcm9taXNjdW91cyBtb2RlICovCkBAIC02MzgsNTEgKzYyOCw1NCBAQAogCX0KIAogCS8qIFJlc3RvcmUgYWxsbXVsdGkgb24gdmxhbnMgaWYgbmVjZXNzYXJ5ICovCi0JY3Bzd19hbGVfc2V0X2FsbG11bHRpKHByaXYtPmFsZSwgcHJpdi0+bmRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpOworCWNwc3dfYWxlX3NldF9hbGxtdWx0aShjcHN3LT5hbGUsIHByaXYtPm5kZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKTsKIAogCS8qIENsZWFyIGFsbCBtY2FzdCBmcm9tIEFMRSAqLwotCWNwc3dfYWxlX2ZsdXNoX211bHRpY2FzdChwcml2LT5hbGUsIEFMRV9BTExfUE9SVFMsIHZpZCk7CisJY3Bzd19hbGVfZmx1c2hfbXVsdGljYXN0KGNwc3ctPmFsZSwgQUxFX0FMTF9QT1JUUywgdmlkKTsKIAogCWlmICghbmV0ZGV2X21jX2VtcHR5KG5kZXYpKSB7CiAJCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CiAKIAkJLyogcHJvZ3JhbSBtdWx0aWNhc3QgYWRkcmVzcyBsaXN0IGludG8gQUxFIHJlZ2lzdGVyICovCiAJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBuZGV2KSB7Ci0JCQljcHN3X2FkZF9tY2FzdChwcml2LCAodTggKiloYS0+YWRkcik7CisJCQljcHN3X2FkZF9tY2FzdChjcHN3LCBwcml2LCAodTggKiloYS0+YWRkcik7CiAJCX0KIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGNwc3dfaW50cl9lbmFibGUoc3RydWN0IGNwc3dfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGNwc3dfaW50cl9lbmFibGUoc3RydWN0IGNwc3dfY29tbW9uICpjcHN3KQogewotCV9fcmF3X3dyaXRlbCgweEZGLCAmcHJpdi0+d3JfcmVncy0+dHhfZW4pOwotCV9fcmF3X3dyaXRlbCgweEZGLCAmcHJpdi0+d3JfcmVncy0+cnhfZW4pOworCV9fcmF3X3dyaXRlbCgweEZGLCAmY3Bzdy0+d3JfcmVncy0+dHhfZW4pOworCV9fcmF3X3dyaXRlbCgweEZGLCAmY3Bzdy0+d3JfcmVncy0+cnhfZW4pOwogCi0JY3BkbWFfY3Rscl9pbnRfY3RybChwcml2LT5kbWEsIHRydWUpOworCWNwZG1hX2N0bHJfaW50X2N0cmwoY3Bzdy0+ZG1hLCB0cnVlKTsKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGNwc3dfaW50cl9kaXNhYmxlKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCitzdGF0aWMgdm9pZCBjcHN3X2ludHJfZGlzYWJsZShzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cpCiB7Ci0JX19yYXdfd3JpdGVsKDAsICZwcml2LT53cl9yZWdzLT50eF9lbik7Ci0JX19yYXdfd3JpdGVsKDAsICZwcml2LT53cl9yZWdzLT5yeF9lbik7CisJX19yYXdfd3JpdGVsKDAsICZjcHN3LT53cl9yZWdzLT50eF9lbik7CisJX19yYXdfd3JpdGVsKDAsICZjcHN3LT53cl9yZWdzLT5yeF9lbik7CiAKLQljcGRtYV9jdGxyX2ludF9jdHJsKHByaXYtPmRtYSwgZmFsc2UpOworCWNwZG1hX2N0bHJfaW50X2N0cmwoY3Bzdy0+ZG1hLCBmYWxzZSk7CiAJcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCBjcHN3X3R4X2hhbmRsZXIodm9pZCAqdG9rZW4sIGludCBsZW4sIGludCBzdGF0dXMpCiB7CisJc3RydWN0IG5ldGRldl9xdWV1ZQkqdHhxOwogCXN0cnVjdCBza19idWZmCQkqc2tiID0gdG9rZW47CiAJc3RydWN0IG5ldF9kZXZpY2UJKm5kZXYgPSBza2ItPmRldjsKLQlzdHJ1Y3QgY3Bzd19wcml2CSpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uCSpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOwogCiAJLyogQ2hlY2sgd2hldGhlciB0aGUgcXVldWUgaXMgc3RvcHBlZCBkdWUgdG8gc3RhbGxlZCB0eCBkbWEsIGlmIHRoZQogCSAqIHF1ZXVlIGlzIHN0b3BwZWQgdGhlbiBzdGFydCB0aGUgcXVldWUgYXMgd2UgaGF2ZSBmcmVlIGRlc2MgZm9yIHR4CiAJICovCi0JaWYgKHVubGlrZWx5KG5ldGlmX3F1ZXVlX3N0b3BwZWQobmRldikpKQotCQluZXRpZl93YWtlX3F1ZXVlKG5kZXYpOwotCWNwdHNfdHhfdGltZXN0YW1wKHByaXYtPmNwdHMsIHNrYik7CisJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShuZGV2LCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CisJaWYgKHVubGlrZWx5KG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQodHhxKSkpCisJCW5ldGlmX3R4X3dha2VfcXVldWUodHhxKTsKKworCWNwdHNfdHhfdGltZXN0YW1wKGNwc3ctPmNwdHMsIHNrYik7CiAJbmRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCW5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtNjkwLDIyICs2ODMsMjMgQEAKIAogc3RhdGljIHZvaWQgY3Bzd19yeF9oYW5kbGVyKHZvaWQgKnRva2VuLCBpbnQgbGVuLCBpbnQgc3RhdHVzKQogeworCXN0cnVjdCBjcGRtYV9jaGFuCSpjaDsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYiA9IHRva2VuOwogCXN0cnVjdCBza19idWZmCQkqbmV3X3NrYjsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmRldiA9IHNrYi0+ZGV2OwotCXN0cnVjdCBjcHN3X3ByaXYJKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlpbnQJCQlyZXQgPSAwOworCXN0cnVjdCBjcHN3X2NvbW1vbgkqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAotCWNwc3dfZHVhbF9lbWFjX3NyY19wb3J0X2RldGVjdChzdGF0dXMsIHByaXYsIG5kZXYsIHNrYik7CisJY3Bzd19kdWFsX2VtYWNfc3JjX3BvcnRfZGV0ZWN0KGNwc3csIHN0YXR1cywgbmRldiwgc2tiKTsKIAogCWlmICh1bmxpa2VseShzdGF0dXMgPCAwKSB8fCB1bmxpa2VseSghbmV0aWZfcnVubmluZyhuZGV2KSkpIHsKIAkJYm9vbCBuZGV2X3N0YXR1cyA9IGZhbHNlOwotCQlzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUgPSBwcml2LT5zbGF2ZXM7CisJCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSA9IGNwc3ctPnNsYXZlczsKIAkJaW50IG47CiAKLQkJaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKSB7CisJCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykgewogCQkJLyogSW4gZHVhbCBlbWFjIG1vZGUgY2hlY2sgZm9yIGFsbCBpbnRlcmZhY2VzICovCi0JCQlmb3IgKG4gPSBwcml2LT5kYXRhLnNsYXZlczsgbjsgbi0tLCBzbGF2ZSsrKQorCQkJZm9yIChuID0gY3Bzdy0+ZGF0YS5zbGF2ZXM7IG47IG4tLSwgc2xhdmUrKykKIAkJCQlpZiAobmV0aWZfcnVubmluZyhzbGF2ZS0+bmRldikpCiAJCQkJCW5kZXZfc3RhdHVzID0gdHJ1ZTsKIAkJfQpAQCAtNzI2LDEwICs3MjAsMTEgQEAKIAkJcmV0dXJuOwogCX0KIAotCW5ld19za2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5kZXYsIHByaXYtPnJ4X3BhY2tldF9tYXgpOworCW5ld19za2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKG5kZXYsIGNwc3ctPnJ4X3BhY2tldF9tYXgpOwogCWlmIChuZXdfc2tiKSB7CisJCXNrYl9jb3B5X3F1ZXVlX21hcHBpbmcobmV3X3NrYiwgc2tiKTsKIAkJc2tiX3B1dChza2IsIGxlbik7Ci0JCWNwdHNfcnhfdGltZXN0YW1wKHByaXYtPmNwdHMsIHNrYik7CisJCWNwdHNfcnhfdGltZXN0YW1wKGNwc3ctPmNwdHMsIHNrYik7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOwogCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwogCQluZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CkBAIC03NDEsODIgKzczNiwxMTYgQEAKIAl9CiAKIHJlcXVldWU6Ci0JcmV0ID0gY3BkbWFfY2hhbl9zdWJtaXQocHJpdi0+cnhjaCwgbmV3X3NrYiwgbmV3X3NrYi0+ZGF0YSwKLQkJCXNrYl90YWlscm9vbShuZXdfc2tiKSwgMCk7CisJaWYgKG5ldGlmX2Rvcm1hbnQobmRldikpIHsKKwkJZGV2X2tmcmVlX3NrYl9hbnkobmV3X3NrYik7CisJCXJldHVybjsKKwl9CisKKwljaCA9IGNwc3ctPnJ4Y2hbc2tiX2dldF9xdWV1ZV9tYXBwaW5nKG5ld19za2IpXTsKKwlyZXQgPSBjcGRtYV9jaGFuX3N1Ym1pdChjaCwgbmV3X3NrYiwgbmV3X3NrYi0+ZGF0YSwKKwkJCQlza2JfdGFpbHJvb20obmV3X3NrYiksIDApOwogCWlmIChXQVJOX09OKHJldCA8IDApKQogCQlkZXZfa2ZyZWVfc2tiX2FueShuZXdfc2tiKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGNwc3dfdHhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gZGV2X2lkOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IGRldl9pZDsKIAotCXdyaXRlbCgwLCAmcHJpdi0+d3JfcmVncy0+dHhfZW4pOwotCWNwZG1hX2N0bHJfZW9pKHByaXYtPmRtYSwgQ1BETUFfRU9JX1RYKTsKKwl3cml0ZWwoMCwgJmNwc3ctPndyX3JlZ3MtPnR4X2VuKTsKKwljcGRtYV9jdGxyX2VvaShjcHN3LT5kbWEsIENQRE1BX0VPSV9UWCk7CiAKLQlpZiAocHJpdi0+cXVpcmtfaXJxKSB7Ci0JCWRpc2FibGVfaXJxX25vc3luYyhwcml2LT5pcnFzX3RhYmxlWzFdKTsKLQkJcHJpdi0+dHhfaXJxX2Rpc2FibGVkID0gdHJ1ZTsKKwlpZiAoY3Bzdy0+cXVpcmtfaXJxKSB7CisJCWRpc2FibGVfaXJxX25vc3luYyhjcHN3LT5pcnFzX3RhYmxlWzFdKTsKKwkJY3Bzdy0+dHhfaXJxX2Rpc2FibGVkID0gdHJ1ZTsKIAl9CiAKLQluYXBpX3NjaGVkdWxlKCZwcml2LT5uYXBpX3R4KTsKKwluYXBpX3NjaGVkdWxlKCZjcHN3LT5uYXBpX3R4KTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBjcHN3X3J4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IGRldl9pZDsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBkZXZfaWQ7CiAKLQljcGRtYV9jdGxyX2VvaShwcml2LT5kbWEsIENQRE1BX0VPSV9SWCk7Ci0Jd3JpdGVsKDAsICZwcml2LT53cl9yZWdzLT5yeF9lbik7CisJY3BkbWFfY3Rscl9lb2koY3Bzdy0+ZG1hLCBDUERNQV9FT0lfUlgpOworCXdyaXRlbCgwLCAmY3Bzdy0+d3JfcmVncy0+cnhfZW4pOwogCi0JaWYgKHByaXYtPnF1aXJrX2lycSkgewotCQlkaXNhYmxlX2lycV9ub3N5bmMocHJpdi0+aXJxc190YWJsZVswXSk7Ci0JCXByaXYtPnJ4X2lycV9kaXNhYmxlZCA9IHRydWU7CisJaWYgKGNwc3ctPnF1aXJrX2lycSkgeworCQlkaXNhYmxlX2lycV9ub3N5bmMoY3Bzdy0+aXJxc190YWJsZVswXSk7CisJCWNwc3ctPnJ4X2lycV9kaXNhYmxlZCA9IHRydWU7CiAJfQogCi0JbmFwaV9zY2hlZHVsZSgmcHJpdi0+bmFwaV9yeCk7CisJbmFwaV9zY2hlZHVsZSgmY3Bzdy0+bmFwaV9yeCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiBzdGF0aWMgaW50IGNwc3dfdHhfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGlfdHgsIGludCBidWRnZXQpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdgkqcHJpdiA9IG5hcGlfdG9fcHJpdihuYXBpX3R4KTsKLQlpbnQJCQludW1fdHg7CisJdTMyCQkJY2hfbWFwOworCWludAkJCW51bV90eCwgY2g7CisJc3RydWN0IGNwc3dfY29tbW9uCSpjcHN3ID0gbmFwaV90b19jcHN3KG5hcGlfdHgpOwogCi0JbnVtX3R4ID0gY3BkbWFfY2hhbl9wcm9jZXNzKHByaXYtPnR4Y2gsIGJ1ZGdldCk7Ci0JaWYgKG51bV90eCA8IGJ1ZGdldCkgewotCQluYXBpX2NvbXBsZXRlKG5hcGlfdHgpOwotCQl3cml0ZWwoMHhmZiwgJnByaXYtPndyX3JlZ3MtPnR4X2VuKTsKLQkJaWYgKHByaXYtPnF1aXJrX2lycSAmJiBwcml2LT50eF9pcnFfZGlzYWJsZWQpIHsKLQkJCXByaXYtPnR4X2lycV9kaXNhYmxlZCA9IGZhbHNlOwotCQkJZW5hYmxlX2lycShwcml2LT5pcnFzX3RhYmxlWzFdKTsKKwkvKiBwcm9jZXNzIGV2ZXJ5IHVucHJvY2Vzc2VkIGNoYW5uZWwgKi8KKwljaF9tYXAgPSBjcGRtYV9jdHJsX3R4Y2hzX3N0YXRlKGNwc3ctPmRtYSk7CisJZm9yIChjaCA9IDAsIG51bV90eCA9IDA7IG51bV90eCA8IGJ1ZGdldDsgY2hfbWFwID4+PSAxLCBjaCsrKSB7CisJCWlmICghY2hfbWFwKSB7CisJCQljaF9tYXAgPSBjcGRtYV9jdHJsX3R4Y2hzX3N0YXRlKGNwc3ctPmRtYSk7CisJCQlpZiAoIWNoX21hcCkKKwkJCQlicmVhazsKKworCQkJY2ggPSAwOwogCQl9CisKKwkJaWYgKCEoY2hfbWFwICYgMHgwMSkpCisJCQljb250aW51ZTsKKworCQludW1fdHggKz0gY3BkbWFfY2hhbl9wcm9jZXNzKGNwc3ctPnR4Y2hbY2hdLCBidWRnZXQgLSBudW1fdHgpOwogCX0KIAotCWlmIChudW1fdHgpCi0JCWNwc3dfZGJnKHByaXYsIGludHIsICJwb2xsICVkIHR4IHBrdHNcbiIsIG51bV90eCk7CisJaWYgKG51bV90eCA8IGJ1ZGdldCkgeworCQluYXBpX2NvbXBsZXRlKG5hcGlfdHgpOworCQl3cml0ZWwoMHhmZiwgJmNwc3ctPndyX3JlZ3MtPnR4X2VuKTsKKwkJaWYgKGNwc3ctPnF1aXJrX2lycSAmJiBjcHN3LT50eF9pcnFfZGlzYWJsZWQpIHsKKwkJCWNwc3ctPnR4X2lycV9kaXNhYmxlZCA9IGZhbHNlOworCQkJZW5hYmxlX2lycShjcHN3LT5pcnFzX3RhYmxlWzFdKTsKKwkJfQorCX0KIAogCXJldHVybiBudW1fdHg7CiB9CiAKIHN0YXRpYyBpbnQgY3Bzd19yeF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaV9yeCwgaW50IGJ1ZGdldCkKIHsKLQlzdHJ1Y3QgY3Bzd19wcml2CSpwcml2ID0gbmFwaV90b19wcml2KG5hcGlfcngpOwotCWludAkJCW51bV9yeDsKKwl1MzIJCQljaF9tYXA7CisJaW50CQkJbnVtX3J4LCBjaDsKKwlzdHJ1Y3QgY3Bzd19jb21tb24JKmNwc3cgPSBuYXBpX3RvX2Nwc3cobmFwaV9yeCk7CiAKLQludW1fcnggPSBjcGRtYV9jaGFuX3Byb2Nlc3MocHJpdi0+cnhjaCwgYnVkZ2V0KTsKLQlpZiAobnVtX3J4IDwgYnVkZ2V0KSB7Ci0JCW5hcGlfY29tcGxldGUobmFwaV9yeCk7Ci0JCXdyaXRlbCgweGZmLCAmcHJpdi0+d3JfcmVncy0+cnhfZW4pOwotCQlpZiAocHJpdi0+cXVpcmtfaXJxICYmIHByaXYtPnJ4X2lycV9kaXNhYmxlZCkgewotCQkJcHJpdi0+cnhfaXJxX2Rpc2FibGVkID0gZmFsc2U7Ci0JCQllbmFibGVfaXJxKHByaXYtPmlycXNfdGFibGVbMF0pOworCS8qIHByb2Nlc3MgZXZlcnkgdW5wcm9jZXNzZWQgY2hhbm5lbCAqLworCWNoX21hcCA9IGNwZG1hX2N0cmxfcnhjaHNfc3RhdGUoY3Bzdy0+ZG1hKTsKKwlmb3IgKGNoID0gMCwgbnVtX3J4ID0gMDsgbnVtX3J4IDwgYnVkZ2V0OyBjaF9tYXAgPj49IDEsIGNoKyspIHsKKwkJaWYgKCFjaF9tYXApIHsKKwkJCWNoX21hcCA9IGNwZG1hX2N0cmxfcnhjaHNfc3RhdGUoY3Bzdy0+ZG1hKTsKKwkJCWlmICghY2hfbWFwKQorCQkJCWJyZWFrOworCisJCQljaCA9IDA7CiAJCX0KKworCQlpZiAoIShjaF9tYXAgJiAweDAxKSkKKwkJCWNvbnRpbnVlOworCisJCW51bV9yeCArPSBjcGRtYV9jaGFuX3Byb2Nlc3MoY3Bzdy0+cnhjaFtjaF0sIGJ1ZGdldCAtIG51bV9yeCk7CiAJfQogCi0JaWYgKG51bV9yeCkKLQkJY3Bzd19kYmcocHJpdiwgaW50ciwgInBvbGwgJWQgcnggcGt0c1xuIiwgbnVtX3J4KTsKKwlpZiAobnVtX3J4IDwgYnVkZ2V0KSB7CisJCW5hcGlfY29tcGxldGUobmFwaV9yeCk7CisJCXdyaXRlbCgweGZmLCAmY3Bzdy0+d3JfcmVncy0+cnhfZW4pOworCQlpZiAoY3Bzdy0+cXVpcmtfaXJxICYmIGNwc3ctPnJ4X2lycV9kaXNhYmxlZCkgeworCQkJY3Bzdy0+cnhfaXJxX2Rpc2FibGVkID0gZmFsc2U7CisJCQllbmFibGVfaXJxKGNwc3ctPmlycXNfdGFibGVbMF0pOworCQl9CisJfQogCiAJcmV0dXJuIG51bV9yeDsKIH0KQEAgLTg1MCwxNyArODc5LDE4IEBACiAJc3RydWN0IHBoeV9kZXZpY2UJKnBoeSA9IHNsYXZlLT5waHk7CiAJdTMyCQkJbWFjX2NvbnRyb2wgPSAwOwogCXUzMgkJCXNsYXZlX3BvcnQ7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAogCWlmICghcGh5KQogCQlyZXR1cm47CiAKLQlzbGF2ZV9wb3J0ID0gY3Bzd19nZXRfc2xhdmVfcG9ydChwcml2LCBzbGF2ZS0+c2xhdmVfbnVtKTsKKwlzbGF2ZV9wb3J0ID0gY3Bzd19nZXRfc2xhdmVfcG9ydChzbGF2ZS0+c2xhdmVfbnVtKTsKIAogCWlmIChwaHktPmxpbmspIHsKLQkJbWFjX2NvbnRyb2wgPSBwcml2LT5kYXRhLm1hY19jb250cm9sOworCQltYWNfY29udHJvbCA9IGNwc3ctPmRhdGEubWFjX2NvbnRyb2w7CiAKIAkJLyogZW5hYmxlIGZvcndhcmRpbmcgKi8KLQkJY3Bzd19hbGVfY29udHJvbF9zZXQocHJpdi0+YWxlLCBzbGF2ZV9wb3J0LAorCQljcHN3X2FsZV9jb250cm9sX3NldChjcHN3LT5hbGUsIHNsYXZlX3BvcnQsCiAJCQkJICAgICBBTEVfUE9SVF9TVEFURSwgQUxFX1BPUlRfU1RBVEVfRk9SV0FSRCk7CiAKIAkJaWYgKHBoeS0+c3BlZWQgPT0gMTAwMCkKQEAgLTg4NCw3ICs5MTQsNyBAQAogCX0gZWxzZSB7CiAJCW1hY19jb250cm9sID0gMDsKIAkJLyogZGlzYWJsZSBmb3J3YXJkaW5nICovCi0JCWNwc3dfYWxlX2NvbnRyb2xfc2V0KHByaXYtPmFsZSwgc2xhdmVfcG9ydCwKKwkJY3Bzd19hbGVfY29udHJvbF9zZXQoY3Bzdy0+YWxlLCBzbGF2ZV9wb3J0LAogCQkJCSAgICAgQUxFX1BPUlRfU1RBVEUsIEFMRV9QT1JUX1NUQVRFX0RJU0FCTEUpOwogCX0KIApAQCAtOTA2LDE5ICs5MzYsMTkgQEAKIAlpZiAobGluaykgewogCQluZXRpZl9jYXJyaWVyX29uKG5kZXYpOwogCQlpZiAobmV0aWZfcnVubmluZyhuZGV2KSkKLQkJCW5ldGlmX3dha2VfcXVldWUobmRldik7CisJCQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMobmRldik7CiAJfSBlbHNlIHsKIAkJbmV0aWZfY2Fycmllcl9vZmYobmRldik7Ci0JCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZGV2KTsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgY3Bzd19nZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJCQkJc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmNvYWwpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAotCWNvYWwtPnJ4X2NvYWxlc2NlX3VzZWNzID0gcHJpdi0+Y29hbF9pbnR2bDsKKwljb2FsLT5yeF9jb2FsZXNjZV91c2VjcyA9IGNwc3ctPmNvYWxfaW50dmw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkzMSwxMSArOTYxLDEyIEBACiAJdTMyIHByZXNjYWxlID0gMDsKIAl1MzIgYWRkbmxfZHZkciA9IDE7CiAJdTMyIGNvYWxfaW50dmwgPSAwOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAKIAljb2FsX2ludHZsID0gY29hbC0+cnhfY29hbGVzY2VfdXNlY3M7CiAKLQlpbnRfY3RybCA9ICByZWFkbCgmcHJpdi0+d3JfcmVncy0+aW50X2NvbnRyb2wpOwotCXByZXNjYWxlID0gcHJpdi0+YnVzX2ZyZXFfbWh6ICogNDsKKwlpbnRfY3RybCA9ICByZWFkbCgmY3Bzdy0+d3JfcmVncy0+aW50X2NvbnRyb2wpOworCXByZXNjYWxlID0gY3Bzdy0+YnVzX2ZyZXFfbWh6ICogNDsKIAogCWlmICghY29hbC0+cnhfY29hbGVzY2VfdXNlY3MpIHsKIAkJaW50X2N0cmwgJj0gfihDUFNXX0lOVFBSRVNDQUxFX01BU0sgfCBDUFNXX0lOVFBBQ0VFTik7CkBAIC05NjMsNTMgKzk5NCw2OSBAQAogCX0KIAogCW51bV9pbnRlcnJ1cHRzID0gKDEwMDAgKiBhZGRubF9kdmRyKSAvIGNvYWxfaW50dmw7Ci0Jd3JpdGVsKG51bV9pbnRlcnJ1cHRzLCAmcHJpdi0+d3JfcmVncy0+cnhfaW1heCk7Ci0Jd3JpdGVsKG51bV9pbnRlcnJ1cHRzLCAmcHJpdi0+d3JfcmVncy0+dHhfaW1heCk7CisJd3JpdGVsKG51bV9pbnRlcnJ1cHRzLCAmY3Bzdy0+d3JfcmVncy0+cnhfaW1heCk7CisJd3JpdGVsKG51bV9pbnRlcnJ1cHRzLCAmY3Bzdy0+d3JfcmVncy0+dHhfaW1heCk7CiAKIAlpbnRfY3RybCB8PSBDUFNXX0lOVFBBQ0VFTjsKIAlpbnRfY3RybCAmPSAofkNQU1dfSU5UUFJFU0NBTEVfTUFTSyk7CiAJaW50X2N0cmwgfD0gKHByZXNjYWxlICYgQ1BTV19JTlRQUkVTQ0FMRV9NQVNLKTsKIAogdXBkYXRlX3JldHVybjoKLQl3cml0ZWwoaW50X2N0cmwsICZwcml2LT53cl9yZWdzLT5pbnRfY29udHJvbCk7CisJd3JpdGVsKGludF9jdHJsLCAmY3Bzdy0+d3JfcmVncy0+aW50X2NvbnRyb2wpOwogCiAJY3Bzd19ub3RpY2UocHJpdiwgdGltZXIsICJTZXQgY29hbGVzY2UgdG8gJWQgdXNlY3MuXG4iLCBjb2FsX2ludHZsKTsKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspIHsKLQkJCXByaXYgPSBuZXRkZXZfcHJpdihwcml2LT5zbGF2ZXNbaV0ubmRldik7Ci0JCQlwcml2LT5jb2FsX2ludHZsID0gY29hbF9pbnR2bDsKLQkJfQotCX0gZWxzZSB7Ci0JCXByaXYtPmNvYWxfaW50dmwgPSBjb2FsX2ludHZsOwotCX0KKwljcHN3LT5jb2FsX2ludHZsID0gY29hbF9pbnR2bDsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGNwc3dfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBzc2V0KQogeworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKKwogCXN3aXRjaCAoc3NldCkgewogCWNhc2UgRVRIX1NTX1NUQVRTOgotCQlyZXR1cm4gQ1BTV19TVEFUU19MRU47CisJCXJldHVybiAoQ1BTV19TVEFUU19DT01NT05fTEVOICsKKwkJICAgICAgIChjcHN3LT5yeF9jaF9udW0gKyBjcHN3LT50eF9jaF9udW0pICoKKwkJICAgICAgIENQU1dfU1RBVFNfQ0hfTEVOKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogfQogCitzdGF0aWMgdm9pZCBjcHN3X2FkZF9jaF9zdHJpbmdzKHU4ICoqcCwgaW50IGNoX251bSwgaW50IHJ4X2RpcikKK3sKKwlpbnQgY2hfc3RhdHNfbGVuOworCWludCBsaW5lOworCWludCBpOworCisJY2hfc3RhdHNfbGVuID0gQ1BTV19TVEFUU19DSF9MRU4gKiBjaF9udW07CisJZm9yIChpID0gMDsgaSA8IGNoX3N0YXRzX2xlbjsgaSsrKSB7CisJCWxpbmUgPSBpICUgQ1BTV19TVEFUU19DSF9MRU47CisJCXNucHJpbnRmKCpwLCBFVEhfR1NUUklOR19MRU4sCisJCQkgIiVzIERNQSBjaGFuICVkOiAlcyIsIHJ4X2RpciA/ICJSeCIgOiAiVHgiLAorCQkJIGkgLyBDUFNXX1NUQVRTX0NIX0xFTiwKKwkJCSBjcHN3X2dzdHJpbmdzX2NoX3N0YXRzW2xpbmVdLnN0YXRfc3RyaW5nKTsKKwkJKnAgKz0gRVRIX0dTVFJJTkdfTEVOOworCX0KK30KKwogc3RhdGljIHZvaWQgY3Bzd19nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIHN0cmluZ3NldCwgdTggKmRhdGEpCiB7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOwogCXU4ICpwID0gZGF0YTsKIAlpbnQgaTsKIAogCXN3aXRjaCAoc3RyaW5nc2V0KSB7CiAJY2FzZSBFVEhfU1NfU1RBVFM6Ci0JCWZvciAoaSA9IDA7IGkgPCBDUFNXX1NUQVRTX0xFTjsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBDUFNXX1NUQVRTX0NPTU1PTl9MRU47IGkrKykgewogCQkJbWVtY3B5KHAsIGNwc3dfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9zdHJpbmcsCiAJCQkgICAgICAgRVRIX0dTVFJJTkdfTEVOKTsKIAkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQl9CisKKwkJY3Bzd19hZGRfY2hfc3RyaW5ncygmcCwgY3Bzdy0+cnhfY2hfbnVtLCAxKTsKKwkJY3Bzd19hZGRfY2hfc3RyaW5ncygmcCwgY3Bzdy0+dHhfY2hfbnVtLCAwKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTAxNyw4NiArMTA2NCw3OCBAQAogc3RhdGljIHZvaWQgY3Bzd19nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKIAkJCQkgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLCB1NjQgKmRhdGEpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBjcGRtYV9jaGFuX3N0YXRzIHJ4X3N0YXRzOwotCXN0cnVjdCBjcGRtYV9jaGFuX3N0YXRzIHR4X3N0YXRzOwotCXUzMiB2YWw7CiAJdTggKnA7Ci0JaW50IGk7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOworCXN0cnVjdCBjcGRtYV9jaGFuX3N0YXRzIGNoX3N0YXRzOworCWludCBpLCBsLCBjaDsKIAogCS8qIENvbGxlY3QgRGF2aW5jaSBDUERNQSBzdGF0cyBmb3IgUnggYW5kIFR4IENoYW5uZWwgKi8KLQljcGRtYV9jaGFuX2dldF9zdGF0cyhwcml2LT5yeGNoLCAmcnhfc3RhdHMpOwotCWNwZG1hX2NoYW5fZ2V0X3N0YXRzKHByaXYtPnR4Y2gsICZ0eF9zdGF0cyk7CisJZm9yIChsID0gMDsgbCA8IENQU1dfU1RBVFNfQ09NTU9OX0xFTjsgbCsrKQorCQlkYXRhW2xdID0gcmVhZGwoY3Bzdy0+aHdfc3RhdHMgKworCQkJCWNwc3dfZ3N0cmluZ3Nfc3RhdHNbbF0uc3RhdF9vZmZzZXQpOwogCi0JZm9yIChpID0gMDsgaSA8IENQU1dfU1RBVFNfTEVOOyBpKyspIHsKLQkJc3dpdGNoIChjcHN3X2dzdHJpbmdzX3N0YXRzW2ldLnR5cGUpIHsKLQkJY2FzZSBDUFNXX1NUQVRTOgotCQkJdmFsID0gcmVhZGwocHJpdi0+aHdfc3RhdHMgKwotCQkJCSAgICBjcHN3X2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfb2Zmc2V0KTsKLQkJCWRhdGFbaV0gPSB2YWw7Ci0JCQlicmVhazsKKwlmb3IgKGNoID0gMDsgY2ggPCBjcHN3LT5yeF9jaF9udW07IGNoKyspIHsKKwkJY3BkbWFfY2hhbl9nZXRfc3RhdHMoY3Bzdy0+cnhjaFtjaF0sICZjaF9zdGF0cyk7CisJCWZvciAoaSA9IDA7IGkgPCBDUFNXX1NUQVRTX0NIX0xFTjsgaSsrLCBsKyspIHsKKwkJCXAgPSAodTggKikmY2hfc3RhdHMgKworCQkJCWNwc3dfZ3N0cmluZ3NfY2hfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7CisJCQlkYXRhW2xdID0gKih1MzIgKilwOworCQl9CisJfQogCi0JCWNhc2UgQ1BETUFfUlhfU1RBVFM6Ci0JCQlwID0gKHU4ICopJnJ4X3N0YXRzICsKLQkJCQljcHN3X2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfb2Zmc2V0OwotCQkJZGF0YVtpXSA9ICoodTMyICopcDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQ1BETUFfVFhfU1RBVFM6Ci0JCQlwID0gKHU4ICopJnR4X3N0YXRzICsKLQkJCQljcHN3X2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfb2Zmc2V0OwotCQkJZGF0YVtpXSA9ICoodTMyICopcDsKLQkJCWJyZWFrOworCWZvciAoY2ggPSAwOyBjaCA8IGNwc3ctPnR4X2NoX251bTsgY2grKykgeworCQljcGRtYV9jaGFuX2dldF9zdGF0cyhjcHN3LT50eGNoW2NoXSwgJmNoX3N0YXRzKTsKKwkJZm9yIChpID0gMDsgaSA8IENQU1dfU1RBVFNfQ0hfTEVOOyBpKyssIGwrKykgeworCQkJcCA9ICh1OCAqKSZjaF9zdGF0cyArCisJCQkJY3Bzd19nc3RyaW5nc19jaF9zdGF0c1tpXS5zdGF0X29mZnNldDsKKwkJCWRhdGFbbF0gPSAqKHUzMiAqKXA7CiAJCX0KIAl9CiB9CiAKLXN0YXRpYyBpbnQgY3Bzd19jb21tb25fcmVzX3VzYWdlX3N0YXRlKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCitzdGF0aWMgaW50IGNwc3dfY29tbW9uX3Jlc191c2FnZV9zdGF0ZShzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cpCiB7CiAJdTMyIGk7CiAJdTMyIHVzYWdlX2NvdW50ID0gMDsKIAotCWlmICghcHJpdi0+ZGF0YS5kdWFsX2VtYWMpCisJaWYgKCFjcHN3LT5kYXRhLmR1YWxfZW1hYykKIAkJcmV0dXJuIDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZGF0YS5zbGF2ZXM7IGkrKykKLQkJaWYgKHByaXYtPnNsYXZlc1tpXS5vcGVuX3N0YXQpCisJZm9yIChpID0gMDsgaSA8IGNwc3ctPmRhdGEuc2xhdmVzOyBpKyspCisJCWlmIChjcHN3LT5zbGF2ZXNbaV0ub3Blbl9zdGF0KQogCQkJdXNhZ2VfY291bnQrKzsKIAogCXJldHVybiB1c2FnZV9jb3VudDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgY3Bzd190eF9wYWNrZXRfc3VibWl0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgaW50IGNwc3dfdHhfcGFja2V0X3N1Ym1pdChzdHJ1Y3QgY3Bzd19wcml2ICpwcml2LAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQlzdHJ1Y3QgY3BkbWFfY2hhbiAqdHhjaCkKIHsKLQlpZiAoIXByaXYtPmRhdGEuZHVhbF9lbWFjKQotCQlyZXR1cm4gY3BkbWFfY2hhbl9zdWJtaXQocHJpdi0+dHhjaCwgc2tiLCBza2ItPmRhdGEsCi0JCQkJICBza2ItPmxlbiwgMCk7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAotCWlmIChuZGV2ID09IGNwc3dfZ2V0X3NsYXZlX25kZXYocHJpdiwgMCkpCi0JCXJldHVybiBjcGRtYV9jaGFuX3N1Ym1pdChwcml2LT50eGNoLCBza2IsIHNrYi0+ZGF0YSwKLQkJCQkgIHNrYi0+bGVuLCAxKTsKLQllbHNlCi0JCXJldHVybiBjcGRtYV9jaGFuX3N1Ym1pdChwcml2LT50eGNoLCBza2IsIHNrYi0+ZGF0YSwKLQkJCQkgIHNrYi0+bGVuLCAyKTsKKwlyZXR1cm4gY3BkbWFfY2hhbl9zdWJtaXQodHhjaCwgc2tiLCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSBwcml2LT5lbWFjX3BvcnQgKyBjcHN3LT5kYXRhLmR1YWxfZW1hYyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHN3X2FkZF9kdWFsX2VtYWNfZGVmX2FsZV9lbnRyaWVzKAogCQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2LCBzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUsCiAJCXUzMiBzbGF2ZV9wb3J0KQogeworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAJdTMyIHBvcnRfbWFzayA9IDEgPDwgc2xhdmVfcG9ydCB8IEFMRV9QT1JUX0hPU1Q7CiAKLQlpZiAocHJpdi0+dmVyc2lvbiA9PSBDUFNXX1ZFUlNJT05fMSkKKwlpZiAoY3Bzdy0+dmVyc2lvbiA9PSBDUFNXX1ZFUlNJT05fMSkKIAkJc2xhdmVfd3JpdGUoc2xhdmUsIHNsYXZlLT5wb3J0X3ZsYW4sIENQU1cxX1BPUlRfVkxBTik7CiAJZWxzZQogCQlzbGF2ZV93cml0ZShzbGF2ZSwgc2xhdmUtPnBvcnRfdmxhbiwgQ1BTVzJfUE9SVF9WTEFOKTsKLQljcHN3X2FsZV9hZGRfdmxhbihwcml2LT5hbGUsIHNsYXZlLT5wb3J0X3ZsYW4sIHBvcnRfbWFzaywKKwljcHN3X2FsZV9hZGRfdmxhbihjcHN3LT5hbGUsIHNsYXZlLT5wb3J0X3ZsYW4sIHBvcnRfbWFzaywKIAkJCSAgcG9ydF9tYXNrLCBwb3J0X21hc2ssIDApOwotCWNwc3dfYWxlX2FkZF9tY2FzdChwcml2LT5hbGUsIHByaXYtPm5kZXYtPmJyb2FkY2FzdCwKKwljcHN3X2FsZV9hZGRfbWNhc3QoY3Bzdy0+YWxlLCBwcml2LT5uZGV2LT5icm9hZGNhc3QsCiAJCQkgICBwb3J0X21hc2ssIEFMRV9WTEFOLCBzbGF2ZS0+cG9ydF92bGFuLCAwKTsKLQljcHN3X2FsZV9hZGRfdWNhc3QocHJpdi0+YWxlLCBwcml2LT5tYWNfYWRkciwKLQkJSE9TVF9QT1JUX05VTSwgQUxFX1ZMQU4gfCBBTEVfU0VDVVJFLCBzbGF2ZS0+cG9ydF92bGFuKTsKKwljcHN3X2FsZV9hZGRfdWNhc3QoY3Bzdy0+YWxlLCBwcml2LT5tYWNfYWRkciwKKwkJCSAgIEhPU1RfUE9SVF9OVU0sIEFMRV9WTEFOIHwKKwkJCSAgIEFMRV9TRUNVUkUsIHNsYXZlLT5wb3J0X3ZsYW4pOwogfQogCiBzdGF0aWMgdm9pZCBzb2Z0X3Jlc2V0X3NsYXZlKHN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSkKQEAgLTExMTAsMTMgKzExNDksMTQgQEAKIHN0YXRpYyB2b2lkIGNwc3dfc2xhdmVfb3BlbihzdHJ1Y3QgY3Bzd19zbGF2ZSAqc2xhdmUsIHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCiB7CiAJdTMyIHNsYXZlX3BvcnQ7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAogCXNvZnRfcmVzZXRfc2xhdmUoc2xhdmUpOwogCiAJLyogc2V0dXAgcHJpb3JpdHkgbWFwcGluZyAqLwogCV9fcmF3X3dyaXRlbChSWF9QUklPUklUWV9NQVBQSU5HLCAmc2xhdmUtPnNsaXZlci0+cnhfcHJpX21hcCk7CiAKLQlzd2l0Y2ggKHByaXYtPnZlcnNpb24pIHsKKwlzd2l0Y2ggKGNwc3ctPnZlcnNpb24pIHsKIAljYXNlIENQU1dfVkVSU0lPTl8xOgogCQlzbGF2ZV93cml0ZShzbGF2ZSwgVFhfUFJJT1JJVFlfTUFQUElORywgQ1BTVzFfVFhfUFJJX01BUCk7CiAJCWJyZWFrOwpAQCAtMTEyOCwxNyArMTE2OCwxNyBAQAogCX0KIAogCS8qIHNldHVwIG1heCBwYWNrZXQgc2l6ZSwgYW5kIG1hYyBhZGRyZXNzICovCi0JX19yYXdfd3JpdGVsKHByaXYtPnJ4X3BhY2tldF9tYXgsICZzbGF2ZS0+c2xpdmVyLT5yeF9tYXhsZW4pOworCV9fcmF3X3dyaXRlbChjcHN3LT5yeF9wYWNrZXRfbWF4LCAmc2xhdmUtPnNsaXZlci0+cnhfbWF4bGVuKTsKIAljcHN3X3NldF9zbGF2ZV9tYWMoc2xhdmUsIHByaXYpOwogCiAJc2xhdmUtPm1hY19jb250cm9sID0gMDsJLyogbm8gbGluayB5ZXQgKi8KIAotCXNsYXZlX3BvcnQgPSBjcHN3X2dldF9zbGF2ZV9wb3J0KHByaXYsIHNsYXZlLT5zbGF2ZV9udW0pOworCXNsYXZlX3BvcnQgPSBjcHN3X2dldF9zbGF2ZV9wb3J0KHNsYXZlLT5zbGF2ZV9udW0pOwogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKQorCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykKIAkJY3Bzd19hZGRfZHVhbF9lbWFjX2RlZl9hbGVfZW50cmllcyhwcml2LCBzbGF2ZSwgc2xhdmVfcG9ydCk7CiAJZWxzZQotCQljcHN3X2FsZV9hZGRfbWNhc3QocHJpdi0+YWxlLCBwcml2LT5uZGV2LT5icm9hZGNhc3QsCisJCWNwc3dfYWxlX2FkZF9tY2FzdChjcHN3LT5hbGUsIHByaXYtPm5kZXYtPmJyb2FkY2FzdCwKIAkJCQkgICAxIDw8IHNsYXZlX3BvcnQsIDAsIDAsIEFMRV9NQ0FTVF9GV0RfMik7CiAKIAlpZiAoc2xhdmUtPmRhdGEtPnBoeV9ub2RlKSB7CkBAIC0xMTY4LDgxICsxMjA4LDEyMSBAQAogCXBoeV9zdGFydChzbGF2ZS0+cGh5KTsKIAogCS8qIENvbmZpZ3VyZSBHTUlJX1NFTCByZWdpc3RlciAqLwotCWNwc3dfcGh5X3NlbCgmcHJpdi0+cGRldi0+ZGV2LCBzbGF2ZS0+cGh5LT5pbnRlcmZhY2UsIHNsYXZlLT5zbGF2ZV9udW0pOworCWNwc3dfcGh5X3NlbChjcHN3LT5kZXYsIHNsYXZlLT5waHktPmludGVyZmFjZSwgc2xhdmUtPnNsYXZlX251bSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHN3X2FkZF9kZWZhdWx0X3ZsYW4oc3RydWN0IGNwc3dfcHJpdiAqcHJpdikKIHsKLQljb25zdCBpbnQgdmxhbiA9IHByaXYtPmRhdGEuZGVmYXVsdF92bGFuOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CisJY29uc3QgaW50IHZsYW4gPSBjcHN3LT5kYXRhLmRlZmF1bHRfdmxhbjsKIAl1MzIgcmVnOwogCWludCBpOwogCWludCB1bnJlZ19tY2FzdF9tYXNrOwogCi0JcmVnID0gKHByaXYtPnZlcnNpb24gPT0gQ1BTV19WRVJTSU9OXzEpID8gQ1BTVzFfUE9SVF9WTEFOIDoKKwlyZWcgPSAoY3Bzdy0+dmVyc2lvbiA9PSBDUFNXX1ZFUlNJT05fMSkgPyBDUFNXMV9QT1JUX1ZMQU4gOgogCSAgICAgICBDUFNXMl9QT1JUX1ZMQU47CiAKLQl3cml0ZWwodmxhbiwgJnByaXYtPmhvc3RfcG9ydF9yZWdzLT5wb3J0X3ZsYW4pOworCXdyaXRlbCh2bGFuLCAmY3Bzdy0+aG9zdF9wb3J0X3JlZ3MtPnBvcnRfdmxhbik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZGF0YS5zbGF2ZXM7IGkrKykKLQkJc2xhdmVfd3JpdGUocHJpdi0+c2xhdmVzICsgaSwgdmxhbiwgcmVnKTsKKwlmb3IgKGkgPSAwOyBpIDwgY3Bzdy0+ZGF0YS5zbGF2ZXM7IGkrKykKKwkJc2xhdmVfd3JpdGUoY3Bzdy0+c2xhdmVzICsgaSwgdmxhbiwgcmVnKTsKIAogCWlmIChwcml2LT5uZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKIAkJdW5yZWdfbWNhc3RfbWFzayA9IEFMRV9BTExfUE9SVFM7CiAJZWxzZQogCQl1bnJlZ19tY2FzdF9tYXNrID0gQUxFX1BPUlRfMSB8IEFMRV9QT1JUXzI7CiAKLQljcHN3X2FsZV9hZGRfdmxhbihwcml2LT5hbGUsIHZsYW4sIEFMRV9BTExfUE9SVFMsCisJY3Bzd19hbGVfYWRkX3ZsYW4oY3Bzdy0+YWxlLCB2bGFuLCBBTEVfQUxMX1BPUlRTLAogCQkJICBBTEVfQUxMX1BPUlRTLCBBTEVfQUxMX1BPUlRTLAogCQkJICB1bnJlZ19tY2FzdF9tYXNrKTsKIH0KIAogc3RhdGljIHZvaWQgY3Bzd19pbml0X2hvc3RfcG9ydChzdHJ1Y3QgY3Bzd19wcml2ICpwcml2KQogewotCXUzMiBjb250cm9sX3JlZzsKIAl1MzIgZmlmb19tb2RlOworCXUzMiBjb250cm9sX3JlZzsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OwogCiAJLyogc29mdCByZXNldCB0aGUgY29udHJvbGxlciBhbmQgaW5pdGlhbGl6ZSBhbGUgKi8KLQlzb2Z0X3Jlc2V0KCJjcHN3IiwgJnByaXYtPnJlZ3MtPnNvZnRfcmVzZXQpOwotCWNwc3dfYWxlX3N0YXJ0KHByaXYtPmFsZSk7CisJc29mdF9yZXNldCgiY3BzdyIsICZjcHN3LT5yZWdzLT5zb2Z0X3Jlc2V0KTsKKwljcHN3X2FsZV9zdGFydChjcHN3LT5hbGUpOwogCiAJLyogc3dpdGNoIHRvIHZsYW4gdW5hd2FyZSBtb2RlICovCi0JY3Bzd19hbGVfY29udHJvbF9zZXQocHJpdi0+YWxlLCBIT1NUX1BPUlRfTlVNLCBBTEVfVkxBTl9BV0FSRSwKKwljcHN3X2FsZV9jb250cm9sX3NldChjcHN3LT5hbGUsIEhPU1RfUE9SVF9OVU0sIEFMRV9WTEFOX0FXQVJFLAogCQkJICAgICBDUFNXX0FMRV9WTEFOX0FXQVJFKTsKLQljb250cm9sX3JlZyA9IHJlYWRsKCZwcml2LT5yZWdzLT5jb250cm9sKTsKKwljb250cm9sX3JlZyA9IHJlYWRsKCZjcHN3LT5yZWdzLT5jb250cm9sKTsKIAljb250cm9sX3JlZyB8PSBDUFNXX1ZMQU5fQVdBUkU7Ci0Jd3JpdGVsKGNvbnRyb2xfcmVnLCAmcHJpdi0+cmVncy0+Y29udHJvbCk7Ci0JZmlmb19tb2RlID0gKHByaXYtPmRhdGEuZHVhbF9lbWFjKSA/IENQU1dfRklGT19EVUFMX01BQ19NT0RFIDoKKwl3cml0ZWwoY29udHJvbF9yZWcsICZjcHN3LT5yZWdzLT5jb250cm9sKTsKKwlmaWZvX21vZGUgPSAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpID8gQ1BTV19GSUZPX0RVQUxfTUFDX01PREUgOgogCQkgICAgIENQU1dfRklGT19OT1JNQUxfTU9ERTsKLQl3cml0ZWwoZmlmb19tb2RlLCAmcHJpdi0+aG9zdF9wb3J0X3JlZ3MtPnR4X2luX2N0bCk7CisJd3JpdGVsKGZpZm9fbW9kZSwgJmNwc3ctPmhvc3RfcG9ydF9yZWdzLT50eF9pbl9jdGwpOwogCiAJLyogc2V0dXAgaG9zdCBwb3J0IHByaW9yaXR5IG1hcHBpbmcgKi8KIAlfX3Jhd193cml0ZWwoQ1BETUFfVFhfUFJJT1JJVFlfTUFQLAotCQkgICAgICZwcml2LT5ob3N0X3BvcnRfcmVncy0+Y3BkbWFfdHhfcHJpX21hcCk7Ci0JX19yYXdfd3JpdGVsKDAsICZwcml2LT5ob3N0X3BvcnRfcmVncy0+Y3BkbWFfcnhfY2hhbl9tYXApOworCQkgICAgICZjcHN3LT5ob3N0X3BvcnRfcmVncy0+Y3BkbWFfdHhfcHJpX21hcCk7CisJX19yYXdfd3JpdGVsKDAsICZjcHN3LT5ob3N0X3BvcnRfcmVncy0+Y3BkbWFfcnhfY2hhbl9tYXApOwogCi0JY3Bzd19hbGVfY29udHJvbF9zZXQocHJpdi0+YWxlLCBIT1NUX1BPUlRfTlVNLAorCWNwc3dfYWxlX2NvbnRyb2xfc2V0KGNwc3ctPmFsZSwgSE9TVF9QT1JUX05VTSwKIAkJCSAgICAgQUxFX1BPUlRfU1RBVEUsIEFMRV9QT1JUX1NUQVRFX0ZPUldBUkQpOwogCi0JaWYgKCFwcml2LT5kYXRhLmR1YWxfZW1hYykgewotCQljcHN3X2FsZV9hZGRfdWNhc3QocHJpdi0+YWxlLCBwcml2LT5tYWNfYWRkciwgSE9TVF9QT1JUX05VTSwKKwlpZiAoIWNwc3ctPmRhdGEuZHVhbF9lbWFjKSB7CisJCWNwc3dfYWxlX2FkZF91Y2FzdChjcHN3LT5hbGUsIHByaXYtPm1hY19hZGRyLCBIT1NUX1BPUlRfTlVNLAogCQkJCSAgIDAsIDApOwotCQljcHN3X2FsZV9hZGRfbWNhc3QocHJpdi0+YWxlLCBwcml2LT5uZGV2LT5icm9hZGNhc3QsCisJCWNwc3dfYWxlX2FkZF9tY2FzdChjcHN3LT5hbGUsIHByaXYtPm5kZXYtPmJyb2FkY2FzdCwKIAkJCQkgICBBTEVfUE9SVF9IT1NULCAwLCAwLCBBTEVfTUNBU1RfRldEXzIpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgY3Bzd19zbGF2ZV9zdG9wKHN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSwgc3RydWN0IGNwc3dfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgY3Bzd19maWxsX3J4X2NoYW5uZWxzKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCit7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBjaF9idWZfbnVtOworCWludCBjaCwgaSwgcmV0OworCisJZm9yIChjaCA9IDA7IGNoIDwgY3Bzdy0+cnhfY2hfbnVtOyBjaCsrKSB7CisJCWNoX2J1Zl9udW0gPSBjcGRtYV9jaGFuX2dldF9yeF9idWZfbnVtKGNwc3ctPnJ4Y2hbY2hdKTsKKwkJZm9yIChpID0gMDsgaSA8IGNoX2J1Zl9udW07IGkrKykgeworCQkJc2tiID0gX19uZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKHByaXYtPm5kZXYsCisJCQkJCQkJICBjcHN3LT5yeF9wYWNrZXRfbWF4LAorCQkJCQkJCSAgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXNrYikgeworCQkJCWNwc3dfZXJyKHByaXYsIGlmdXAsICJjYW5ub3QgYWxsb2NhdGUgc2tiXG4iKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgY2gpOworCQkJcmV0ID0gY3BkbWFfY2hhbl9zdWJtaXQoY3Bzdy0+cnhjaFtjaF0sIHNrYiwgc2tiLT5kYXRhLAorCQkJCQkJc2tiX3RhaWxyb29tKHNrYiksIDApOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQljcHN3X2Vycihwcml2LCBpZnVwLAorCQkJCQkgImNhbm5vdCBzdWJtaXQgc2tiIHRvIGNoYW5uZWwgJWQgcngsIGVycm9yICVkXG4iLAorCQkJCQkgY2gsIHJldCk7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWttZW1sZWFrX25vdF9sZWFrKHNrYik7CisJCX0KKworCQljcHN3X2luZm8ocHJpdiwgaWZ1cCwgImNoICVkIHJ4LCBzdWJtaXR0ZWQgJWQgZGVzY3JpcHRvcnNcbiIsCisJCQkgIGNoLCBjaF9idWZfbnVtKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3Bzd19zbGF2ZV9zdG9wKHN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSwgc3RydWN0IGNwc3dfY29tbW9uICpjcHN3KQogewogCXUzMiBzbGF2ZV9wb3J0OwogCi0Jc2xhdmVfcG9ydCA9IGNwc3dfZ2V0X3NsYXZlX3BvcnQocHJpdiwgc2xhdmUtPnNsYXZlX251bSk7CisJc2xhdmVfcG9ydCA9IGNwc3dfZ2V0X3NsYXZlX3BvcnQoc2xhdmUtPnNsYXZlX251bSk7CiAKIAlpZiAoIXNsYXZlLT5waHkpCiAJCXJldHVybjsKIAlwaHlfc3RvcChzbGF2ZS0+cGh5KTsKIAlwaHlfZGlzY29ubmVjdChzbGF2ZS0+cGh5KTsKIAlzbGF2ZS0+cGh5ID0gTlVMTDsKLQljcHN3X2FsZV9jb250cm9sX3NldChwcml2LT5hbGUsIHNsYXZlX3BvcnQsCisJY3Bzd19hbGVfY29udHJvbF9zZXQoY3Bzdy0+YWxlLCBzbGF2ZV9wb3J0LAogCQkJICAgICBBTEVfUE9SVF9TVEFURSwgQUxFX1BPUlRfU1RBVEVfRElTQUJMRSk7CiAJc29mdF9yZXNldF9zbGF2ZShzbGF2ZSk7CiB9CkBAIC0xMjUwLDExNSArMTMzMCwxMTEgQEAKIHN0YXRpYyBpbnQgY3Bzd19uZG9fb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JaW50IGksIHJldDsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCWludCByZXQ7CiAJdTMyIHJlZzsKIAotCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnByaXYtPnBkZXYtPmRldik7CisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhjcHN3LT5kZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcHJpdi0+cGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGNwc3ctPmRldik7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKCFjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUocHJpdikpCi0JCWNwc3dfaW50cl9kaXNhYmxlKHByaXYpOworCWlmICghY3Bzd19jb21tb25fcmVzX3VzYWdlX3N0YXRlKGNwc3cpKQorCQljcHN3X2ludHJfZGlzYWJsZShjcHN3KTsKIAluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKIAotCXJlZyA9IHByaXYtPnZlcnNpb247CisJLyogTm90aWZ5IHRoZSBzdGFjayBvZiB0aGUgYWN0dWFsIHF1ZXVlIGNvdW50cy4gKi8KKwlyZXQgPSBuZXRpZl9zZXRfcmVhbF9udW1fdHhfcXVldWVzKG5kZXYsIGNwc3ctPnR4X2NoX251bSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHByaXYtPmRldiwgImNhbm5vdCBzZXQgcmVhbCBudW1iZXIgb2YgdHggcXVldWVzXG4iKTsKKwkJZ290byBlcnJfY2xlYW51cDsKKwl9CisKKwlyZXQgPSBuZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKG5kZXYsIGNwc3ctPnJ4X2NoX251bSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHByaXYtPmRldiwgImNhbm5vdCBzZXQgcmVhbCBudW1iZXIgb2YgcnggcXVldWVzXG4iKTsKKwkJZ290byBlcnJfY2xlYW51cDsKKwl9CisKKwlyZWcgPSBjcHN3LT52ZXJzaW9uOwogCiAJZGV2X2luZm8ocHJpdi0+ZGV2LCAiaW5pdGlhbGl6aW5nIGNwc3cgdmVyc2lvbiAlZC4lZCAoJWQpXG4iLAogCQkgQ1BTV19NQUpPUl9WRVJTSU9OKHJlZyksIENQU1dfTUlOT1JfVkVSU0lPTihyZWcpLAogCQkgQ1BTV19SVExfVkVSU0lPTihyZWcpKTsKIAogCS8qIGluaXRpYWxpemUgaG9zdCBhbmQgc2xhdmUgcG9ydHMgKi8KLQlpZiAoIWNwc3dfY29tbW9uX3Jlc191c2FnZV9zdGF0ZShwcml2KSkKKwlpZiAoIWNwc3dfY29tbW9uX3Jlc191c2FnZV9zdGF0ZShjcHN3KSkKIAkJY3Bzd19pbml0X2hvc3RfcG9ydChwcml2KTsKIAlmb3JfZWFjaF9zbGF2ZShwcml2LCBjcHN3X3NsYXZlX29wZW4sIHByaXYpOwogCiAJLyogQWRkIGRlZmF1bHQgVkxBTiAqLwotCWlmICghcHJpdi0+ZGF0YS5kdWFsX2VtYWMpCisJaWYgKCFjcHN3LT5kYXRhLmR1YWxfZW1hYykKIAkJY3Bzd19hZGRfZGVmYXVsdF92bGFuKHByaXYpOwogCWVsc2UKLQkJY3Bzd19hbGVfYWRkX3ZsYW4ocHJpdi0+YWxlLCBwcml2LT5kYXRhLmRlZmF1bHRfdmxhbiwKKwkJY3Bzd19hbGVfYWRkX3ZsYW4oY3Bzdy0+YWxlLCBjcHN3LT5kYXRhLmRlZmF1bHRfdmxhbiwKIAkJCQkgIEFMRV9BTExfUE9SVFMsIEFMRV9BTExfUE9SVFMsIDAsIDApOwogCi0JaWYgKCFjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUocHJpdikpIHsKLQkJc3RydWN0IGNwc3dfcHJpdiAqcHJpdl9zbDAgPSBjcHN3X2dldF9zbGF2ZV9wcml2KHByaXYsIDApOwotCQlpbnQgYnVmX251bTsKLQorCWlmICghY3Bzd19jb21tb25fcmVzX3VzYWdlX3N0YXRlKGNwc3cpKSB7CiAJCS8qIHNldHVwIHR4IGRtYSB0byBmaXhlZCBwcmlvIGFuZCB6ZXJvIG9mZnNldCAqLwotCQljcGRtYV9jb250cm9sX3NldChwcml2LT5kbWEsIENQRE1BX1RYX1BSSU9fRklYRUQsIDEpOwotCQljcGRtYV9jb250cm9sX3NldChwcml2LT5kbWEsIENQRE1BX1JYX0JVRkZFUl9PRkZTRVQsIDApOworCQljcGRtYV9jb250cm9sX3NldChjcHN3LT5kbWEsIENQRE1BX1RYX1BSSU9fRklYRUQsIDEpOworCQljcGRtYV9jb250cm9sX3NldChjcHN3LT5kbWEsIENQRE1BX1JYX0JVRkZFUl9PRkZTRVQsIDApOwogCiAJCS8qIGRpc2FibGUgcHJpb3JpdHkgZWxldmF0aW9uICovCi0JCV9fcmF3X3dyaXRlbCgwLCAmcHJpdi0+cmVncy0+cHR5cGUpOworCQlfX3Jhd193cml0ZWwoMCwgJmNwc3ctPnJlZ3MtPnB0eXBlKTsKIAogCQkvKiBlbmFibGUgc3RhdGlzdGljcyBjb2xsZWN0aW9uIG9ubHkgb24gYWxsIHBvcnRzICovCi0JCV9fcmF3X3dyaXRlbCgweDcsICZwcml2LT5yZWdzLT5zdGF0X3BvcnRfZW4pOworCQlfX3Jhd193cml0ZWwoMHg3LCAmY3Bzdy0+cmVncy0+c3RhdF9wb3J0X2VuKTsKIAogCQkvKiBFbmFibGUgaW50ZXJuYWwgZmlmbyBmbG93IGNvbnRyb2wgKi8KLQkJd3JpdGVsKDB4NywgJnByaXYtPnJlZ3MtPmZsb3dfY29udHJvbCk7CisJCXdyaXRlbCgweDcsICZjcHN3LT5yZWdzLT5mbG93X2NvbnRyb2wpOwogCi0JCW5hcGlfZW5hYmxlKCZwcml2X3NsMC0+bmFwaV9yeCk7Ci0JCW5hcGlfZW5hYmxlKCZwcml2X3NsMC0+bmFwaV90eCk7CisJCW5hcGlfZW5hYmxlKCZjcHN3LT5uYXBpX3J4KTsKKwkJbmFwaV9lbmFibGUoJmNwc3ctPm5hcGlfdHgpOwogCi0JCWlmIChwcml2X3NsMC0+dHhfaXJxX2Rpc2FibGVkKSB7Ci0JCQlwcml2X3NsMC0+dHhfaXJxX2Rpc2FibGVkID0gZmFsc2U7Ci0JCQllbmFibGVfaXJxKHByaXYtPmlycXNfdGFibGVbMV0pOworCQlpZiAoY3Bzdy0+dHhfaXJxX2Rpc2FibGVkKSB7CisJCQljcHN3LT50eF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKKwkJCWVuYWJsZV9pcnEoY3Bzdy0+aXJxc190YWJsZVsxXSk7CiAJCX0KIAotCQlpZiAocHJpdl9zbDAtPnJ4X2lycV9kaXNhYmxlZCkgewotCQkJcHJpdl9zbDAtPnJ4X2lycV9kaXNhYmxlZCA9IGZhbHNlOwotCQkJZW5hYmxlX2lycShwcml2LT5pcnFzX3RhYmxlWzBdKTsKKwkJaWYgKGNwc3ctPnJ4X2lycV9kaXNhYmxlZCkgeworCQkJY3Bzdy0+cnhfaXJxX2Rpc2FibGVkID0gZmFsc2U7CisJCQllbmFibGVfaXJxKGNwc3ctPmlycXNfdGFibGVbMF0pOwogCQl9CiAKLQkJYnVmX251bSA9IGNwZG1hX2NoYW5fZ2V0X3J4X2J1Zl9udW0ocHJpdi0+ZG1hKTsKLQkJZm9yIChpID0gMDsgaSA8IGJ1Zl9udW07IGkrKykgewotCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJcmV0ID0gY3Bzd19maWxsX3J4X2NoYW5uZWxzKHByaXYpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyX2NsZWFudXA7CiAKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlza2IgPSBfX25ldGRldl9hbGxvY19za2JfaXBfYWxpZ24ocHJpdi0+bmRldiwKLQkJCQkJcHJpdi0+cnhfcGFja2V0X21heCwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXNrYikKLQkJCQlnb3RvIGVycl9jbGVhbnVwOwotCQkJcmV0ID0gY3BkbWFfY2hhbl9zdWJtaXQocHJpdi0+cnhjaCwgc2tiLCBza2ItPmRhdGEsCi0JCQkJCXNrYl90YWlscm9vbShza2IpLCAwKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCQkJZ290byBlcnJfY2xlYW51cDsKLQkJCX0KLQkJCWttZW1sZWFrX25vdF9sZWFrKHNrYik7Ci0JCX0KLQkJLyogY29udGludWUgZXZlbiBpZiB3ZSBkaWRuJ3QgbWFuYWdlIHRvIHN1Ym1pdCBhbGwKLQkJICogcmVjZWl2ZSBkZXNjcwotCQkgKi8KLQkJY3Bzd19pbmZvKHByaXYsIGlmdXAsICJzdWJtaXR0ZWQgJWQgcnggZGVzY3JpcHRvcnNcbiIsIGkpOwotCi0JCWlmIChjcHRzX3JlZ2lzdGVyKCZwcml2LT5wZGV2LT5kZXYsIHByaXYtPmNwdHMsCi0JCQkJICBwcml2LT5kYXRhLmNwdHNfY2xvY2tfbXVsdCwKLQkJCQkgIHByaXYtPmRhdGEuY3B0c19jbG9ja19zaGlmdCkpCisJCWlmIChjcHRzX3JlZ2lzdGVyKGNwc3ctPmRldiwgY3Bzdy0+Y3B0cywKKwkJCQkgIGNwc3ctPmRhdGEuY3B0c19jbG9ja19tdWx0LAorCQkJCSAgY3Bzdy0+ZGF0YS5jcHRzX2Nsb2NrX3NoaWZ0KSkKIAkJCWRldl9lcnIocHJpdi0+ZGV2LCAiZXJyb3IgcmVnaXN0ZXJpbmcgY3B0cyBkZXZpY2VcbiIpOwogCiAJfQogCiAJLyogRW5hYmxlIEludGVycnVwdCBwYWNpbmcgaWYgY29uZmlndXJlZCAqLwotCWlmIChwcml2LT5jb2FsX2ludHZsICE9IDApIHsKKwlpZiAoY3Bzdy0+Y29hbF9pbnR2bCAhPSAwKSB7CiAJCXN0cnVjdCBldGh0b29sX2NvYWxlc2NlIGNvYWw7CiAKLQkJY29hbC5yeF9jb2FsZXNjZV91c2VjcyA9IHByaXYtPmNvYWxfaW50dmw7CisJCWNvYWwucnhfY29hbGVzY2VfdXNlY3MgPSBjcHN3LT5jb2FsX2ludHZsOwogCQljcHN3X3NldF9jb2FsZXNjZShuZGV2LCAmY29hbCk7CiAJfQogCi0JY3BkbWFfY3Rscl9zdGFydChwcml2LT5kbWEpOwotCWNwc3dfaW50cl9lbmFibGUocHJpdik7CisJY3BkbWFfY3Rscl9zdGFydChjcHN3LT5kbWEpOworCWNwc3dfaW50cl9lbmFibGUoY3Bzdyk7CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpCi0JCXByaXYtPnNsYXZlc1twcml2LT5lbWFjX3BvcnRdLm9wZW5fc3RhdCA9IHRydWU7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKQorCQljcHN3LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XS5vcGVuX3N0YXQgPSB0cnVlOworCisJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhuZGV2KTsKKwogCXJldHVybiAwOwogCiBlcnJfY2xlYW51cDoKLQljcGRtYV9jdGxyX3N0b3AocHJpdi0+ZG1hKTsKLQlmb3JfZWFjaF9zbGF2ZShwcml2LCBjcHN3X3NsYXZlX3N0b3AsIHByaXYpOwotCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnByaXYtPnBkZXYtPmRldik7CisJY3BkbWFfY3Rscl9zdG9wKGNwc3ctPmRtYSk7CisJZm9yX2VhY2hfc2xhdmUocHJpdiwgY3Bzd19zbGF2ZV9zdG9wLCBjcHN3KTsKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGNwc3ctPmRldik7CiAJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmRldik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzNjYsMjUgKzE0NDIsMjQgQEAKIHN0YXRpYyBpbnQgY3Bzd19uZG9fc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAogCWNwc3dfaW5mbyhwcml2LCBpZmRvd24sICJzaHV0dGluZyBkb3duIGNwc3cgZGV2aWNlXG4iKTsKLQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5kZXYpOworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhwcml2LT5uZGV2KTsKIAluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZGV2KTsKIAotCWlmIChjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUocHJpdikgPD0gMSkgewotCQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2X3NsMCA9IGNwc3dfZ2V0X3NsYXZlX3ByaXYocHJpdiwgMCk7Ci0KLQkJbmFwaV9kaXNhYmxlKCZwcml2X3NsMC0+bmFwaV9yeCk7Ci0JCW5hcGlfZGlzYWJsZSgmcHJpdl9zbDAtPm5hcGlfdHgpOwotCQljcHRzX3VucmVnaXN0ZXIocHJpdi0+Y3B0cyk7Ci0JCWNwc3dfaW50cl9kaXNhYmxlKHByaXYpOwotCQljcGRtYV9jdGxyX3N0b3AocHJpdi0+ZG1hKTsKLQkJY3Bzd19hbGVfc3RvcChwcml2LT5hbGUpOworCWlmIChjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUoY3BzdykgPD0gMSkgeworCQluYXBpX2Rpc2FibGUoJmNwc3ctPm5hcGlfcngpOworCQluYXBpX2Rpc2FibGUoJmNwc3ctPm5hcGlfdHgpOworCQljcHRzX3VucmVnaXN0ZXIoY3Bzdy0+Y3B0cyk7CisJCWNwc3dfaW50cl9kaXNhYmxlKGNwc3cpOworCQljcGRtYV9jdGxyX3N0b3AoY3Bzdy0+ZG1hKTsKKwkJY3Bzd19hbGVfc3RvcChjcHN3LT5hbGUpOwogCX0KLQlmb3JfZWFjaF9zbGF2ZShwcml2LCBjcHN3X3NsYXZlX3N0b3AsIHByaXYpOwotCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnByaXYtPnBkZXYtPmRldik7Ci0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKQotCQlwcml2LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XS5vcGVuX3N0YXQgPSBmYWxzZTsKKwlmb3JfZWFjaF9zbGF2ZShwcml2LCBjcHN3X3NsYXZlX3N0b3AsIGNwc3cpOworCXBtX3J1bnRpbWVfcHV0X3N5bmMoY3Bzdy0+ZGV2KTsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpCisJCWNwc3ctPnNsYXZlc1twcml2LT5lbWFjX3BvcnRdLm9wZW5fc3RhdCA9IGZhbHNlOwogCXJldHVybiAwOwogfQogCkBAIC0xMzkyLDcgKzE0NjcsMTAgQEAKIAkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCWludCByZXQ7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CisJc3RydWN0IGNwZG1hX2NoYW4gKnR4Y2g7CisJaW50IHJldCwgcV9pZHg7CiAKIAluZXRpZl90cmFuc191cGRhdGUobmRldik7CiAKQEAgLTE0MDMsMTIgKzE0ODEsMTcgQEAKIAl9CiAKIAlpZiAoc2tiX3NoaW5mbyhza2IpLT50eF9mbGFncyAmIFNLQlRYX0hXX1RTVEFNUCAmJgotCQkJCXByaXYtPmNwdHMtPnR4X2VuYWJsZSkKKwkJCQljcHN3LT5jcHRzLT50eF9lbmFibGUpCiAJCXNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgfD0gU0tCVFhfSU5fUFJPR1JFU1M7CiAKIAlza2JfdHhfdGltZXN0YW1wKHNrYik7CiAKLQlyZXQgPSBjcHN3X3R4X3BhY2tldF9zdWJtaXQobmRldiwgcHJpdiwgc2tiKTsKKwlxX2lkeCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCWlmIChxX2lkeCA+PSBjcHN3LT50eF9jaF9udW0pCisJCXFfaWR4ID0gcV9pZHggJSBjcHN3LT50eF9jaF9udW07CisKKwl0eGNoID0gY3Bzdy0+dHhjaFtxX2lkeF07CisJcmV0ID0gY3Bzd190eF9wYWNrZXRfc3VibWl0KHByaXYsIHNrYiwgdHhjaCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewogCQljcHN3X2Vycihwcml2LCB0eF9lcnIsICJkZXNjIHN1Ym1pdCBmYWlsZWRcbiIpOwogCQlnb3RvIGZhaWw7CkBAIC0xNDE3LDI0ICsxNTAwLDI3IEBACiAJLyogSWYgdGhlcmUgaXMgbm8gbW9yZSB0eCBkZXNjIGxlZnQgZnJlZSB0aGVuIHdlIG5lZWQgdG8KIAkgKiB0ZWxsIHRoZSBrZXJuZWwgdG8gc3RvcCBzZW5kaW5nIHVzIHR4IGZyYW1lcy4KIAkgKi8KLQlpZiAodW5saWtlbHkoIWNwZG1hX2NoZWNrX2ZyZWVfdHhfZGVzYyhwcml2LT50eGNoKSkpCi0JCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJaWYgKHVubGlrZWx5KCFjcGRtYV9jaGVja19mcmVlX3R4X2Rlc2ModHhjaCkpKSB7CisJCXR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUobmRldiwgcV9pZHgpOworCQluZXRpZl90eF9zdG9wX3F1ZXVlKHR4cSk7CisJfQogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIGZhaWw6CiAJbmRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwotCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShuZGV2LCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CisJbmV0aWZfdHhfc3RvcF9xdWV1ZSh0eHEpOwogCXJldHVybiBORVRERVZfVFhfQlVTWTsKIH0KIAogI2lmZGVmIENPTkZJR19USV9DUFRTCiAKLXN0YXRpYyB2b2lkIGNwc3dfaHd0c3RhbXBfdjEoc3RydWN0IGNwc3dfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGNwc3dfaHd0c3RhbXBfdjEoc3RydWN0IGNwc3dfY29tbW9uICpjcHN3KQogewotCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSA9ICZwcml2LT5zbGF2ZXNbcHJpdi0+ZGF0YS5hY3RpdmVfc2xhdmVdOworCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSA9ICZjcHN3LT5zbGF2ZXNbY3Bzdy0+ZGF0YS5hY3RpdmVfc2xhdmVdOwogCXUzMiB0c19lbiwgc2VxX2lkOwogCi0JaWYgKCFwcml2LT5jcHRzLT50eF9lbmFibGUgJiYgIXByaXYtPmNwdHMtPnJ4X2VuYWJsZSkgeworCWlmICghY3Bzdy0+Y3B0cy0+dHhfZW5hYmxlICYmICFjcHN3LT5jcHRzLT5yeF9lbmFibGUpIHsKIAkJc2xhdmVfd3JpdGUoc2xhdmUsIDAsIENQU1cxX1RTX0NUTCk7CiAJCXJldHVybjsKIAl9CkBAIC0xNDQyLDEwICsxNTI4LDEwIEBACiAJc2VxX2lkID0gKDMwIDw8IENQU1dfVjFfU0VRX0lEX09GU19TSElGVCkgfCBFVEhfUF8xNTg4OwogCXRzX2VuID0gRVZFTlRfTVNHX0JJVFMgPDwgQ1BTV19WMV9NU0dfVFlQRV9PRlM7CiAKLQlpZiAocHJpdi0+Y3B0cy0+dHhfZW5hYmxlKQorCWlmIChjcHN3LT5jcHRzLT50eF9lbmFibGUpCiAJCXRzX2VuIHw9IENQU1dfVjFfVFNfVFhfRU47CiAKLQlpZiAocHJpdi0+Y3B0cy0+cnhfZW5hYmxlKQorCWlmIChjcHN3LT5jcHRzLT5yeF9lbmFibGUpCiAJCXRzX2VuIHw9IENQU1dfVjFfVFNfUlhfRU47CiAKIAlzbGF2ZV93cml0ZShzbGF2ZSwgdHNfZW4sIENQU1cxX1RTX0NUTCk7CkBAIC0xNDU1LDMyICsxNTQxLDMzIEBACiBzdGF0aWMgdm9pZCBjcHN3X2h3dHN0YW1wX3YyKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAJdTMyIGN0cmwsIG10eXBlOwogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKQotCQlzbGF2ZSA9ICZwcml2LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XTsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpCisJCXNsYXZlID0gJmNwc3ctPnNsYXZlc1twcml2LT5lbWFjX3BvcnRdOwogCWVsc2UKLQkJc2xhdmUgPSAmcHJpdi0+c2xhdmVzW3ByaXYtPmRhdGEuYWN0aXZlX3NsYXZlXTsKKwkJc2xhdmUgPSAmY3Bzdy0+c2xhdmVzW2Nwc3ctPmRhdGEuYWN0aXZlX3NsYXZlXTsKIAogCWN0cmwgPSBzbGF2ZV9yZWFkKHNsYXZlLCBDUFNXMl9DT05UUk9MKTsKLQlzd2l0Y2ggKHByaXYtPnZlcnNpb24pIHsKKwlzd2l0Y2ggKGNwc3ctPnZlcnNpb24pIHsKIAljYXNlIENQU1dfVkVSU0lPTl8yOgogCQljdHJsICY9IH5DVFJMX1YyX0FMTF9UU19NQVNLOwogCi0JCWlmIChwcml2LT5jcHRzLT50eF9lbmFibGUpCisJCWlmIChjcHN3LT5jcHRzLT50eF9lbmFibGUpCiAJCQljdHJsIHw9IENUUkxfVjJfVFhfVFNfQklUUzsKIAotCQlpZiAocHJpdi0+Y3B0cy0+cnhfZW5hYmxlKQorCQlpZiAoY3Bzdy0+Y3B0cy0+cnhfZW5hYmxlKQogCQkJY3RybCB8PSBDVFJMX1YyX1JYX1RTX0JJVFM7CiAJCWJyZWFrOwogCWNhc2UgQ1BTV19WRVJTSU9OXzM6CiAJZGVmYXVsdDoKIAkJY3RybCAmPSB+Q1RSTF9WM19BTExfVFNfTUFTSzsKIAotCQlpZiAocHJpdi0+Y3B0cy0+dHhfZW5hYmxlKQorCQlpZiAoY3Bzdy0+Y3B0cy0+dHhfZW5hYmxlKQogCQkJY3RybCB8PSBDVFJMX1YzX1RYX1RTX0JJVFM7CiAKLQkJaWYgKHByaXYtPmNwdHMtPnJ4X2VuYWJsZSkKKwkJaWYgKGNwc3ctPmNwdHMtPnJ4X2VuYWJsZSkKIAkJCWN0cmwgfD0gQ1RSTF9WM19SWF9UU19CSVRTOwogCQlicmVhazsKIAl9CkBAIC0xNDg5LDE4ICsxNTc2LDE5IEBACiAKIAlzbGF2ZV93cml0ZShzbGF2ZSwgbXR5cGUsIENQU1cyX1RTX1NFUV9NVFlQRSk7CiAJc2xhdmVfd3JpdGUoc2xhdmUsIGN0cmwsIENQU1cyX0NPTlRST0wpOwotCV9fcmF3X3dyaXRlbChFVEhfUF8xNTg4LCAmcHJpdi0+cmVncy0+dHNfbHR5cGUpOworCV9fcmF3X3dyaXRlbChFVEhfUF8xNTg4LCAmY3Bzdy0+cmVncy0+dHNfbHR5cGUpOwogfQogCiBzdGF0aWMgaW50IGNwc3dfaHd0c3RhbXBfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyKQogewogCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBjcHRzICpjcHRzID0gcHJpdi0+Y3B0czsKIAlzdHJ1Y3QgaHd0c3RhbXBfY29uZmlnIGNmZzsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCXN0cnVjdCBjcHRzICpjcHRzID0gY3Bzdy0+Y3B0czsKIAotCWlmIChwcml2LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8xICYmCi0JICAgIHByaXYtPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzIgJiYKLQkgICAgcHJpdi0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMykKKwlpZiAoY3Bzdy0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMSAmJgorCSAgICBjcHN3LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8yICYmCisJICAgIGNwc3ctPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzMpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmY2ZnLCBpZnItPmlmcl9kYXRhLCBzaXplb2YoY2ZnKSkpCkBAIC0xNTQwLDkgKzE2MjgsOSBAQAogCiAJY3B0cy0+dHhfZW5hYmxlID0gY2ZnLnR4X3R5cGUgPT0gSFdUU1RBTVBfVFhfT047CiAKLQlzd2l0Y2ggKHByaXYtPnZlcnNpb24pIHsKKwlzd2l0Y2ggKGNwc3ctPnZlcnNpb24pIHsKIAljYXNlIENQU1dfVkVSU0lPTl8xOgotCQljcHN3X2h3dHN0YW1wX3YxKHByaXYpOworCQljcHN3X2h3dHN0YW1wX3YxKGNwc3cpOwogCQlicmVhazsKIAljYXNlIENQU1dfVkVSU0lPTl8yOgogCWNhc2UgQ1BTV19WRVJTSU9OXzM6CkBAIC0xNTU3LDEzICsxNjQ1LDEzIEBACiAKIHN0YXRpYyBpbnQgY3Bzd19od3RzdGFtcF9nZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGNwdHMgKmNwdHMgPSBwcml2LT5jcHRzOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhkZXYpOworCXN0cnVjdCBjcHRzICpjcHRzID0gY3Bzdy0+Y3B0czsKIAlzdHJ1Y3QgaHd0c3RhbXBfY29uZmlnIGNmZzsKIAotCWlmIChwcml2LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8xICYmCi0JICAgIHByaXYtPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzIgJiYKLQkgICAgcHJpdi0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMykKKwlpZiAoY3Bzdy0+dmVyc2lvbiAhPSBDUFNXX1ZFUlNJT05fMSAmJgorCSAgICBjcHN3LT52ZXJzaW9uICE9IENQU1dfVkVSU0lPTl8yICYmCisJICAgIGNwc3ctPnZlcnNpb24gIT0gQ1BTV19WRVJTSU9OXzMpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWNmZy5mbGFncyA9IDA7CkBAIC0xNTc5LDcgKzE2NjcsOCBAQAogc3RhdGljIGludCBjcHN3X25kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJlcSwgaW50IGNtZCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgc2xhdmVfbm8gPSBjcHN3X3NsYXZlX2luZGV4KHByaXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CisJaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChjcHN3LCBwcml2KTsKIAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1OTMsMjcgKzE2ODIsMzMgQEAKICNlbmRpZgogCX0KIAotCWlmICghcHJpdi0+c2xhdmVzW3NsYXZlX25vXS5waHkpCisJaWYgKCFjcHN3LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCXJldHVybiBwaHlfbWlpX2lvY3RsKHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCByZXEsIGNtZCk7CisJcmV0dXJuIHBoeV9taWlfaW9jdGwoY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHksIHJlcSwgY21kKTsKIH0KIAogc3RhdGljIHZvaWQgY3Bzd19uZG9fdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKKwlpbnQgY2g7CiAKIAljcHN3X2Vycihwcml2LCB0eF9lcnIsICJ0cmFuc21pdCB0aW1lb3V0LCByZXN0YXJ0aW5nIGRtYVxuIik7CiAJbmRldi0+c3RhdHMudHhfZXJyb3JzKys7Ci0JY3Bzd19pbnRyX2Rpc2FibGUocHJpdik7Ci0JY3BkbWFfY2hhbl9zdG9wKHByaXYtPnR4Y2gpOwotCWNwZG1hX2NoYW5fc3RhcnQocHJpdi0+dHhjaCk7Ci0JY3Bzd19pbnRyX2VuYWJsZShwcml2KTsKKwljcHN3X2ludHJfZGlzYWJsZShjcHN3KTsKKwlmb3IgKGNoID0gMDsgY2ggPCBjcHN3LT50eF9jaF9udW07IGNoKyspIHsKKwkJY3BkbWFfY2hhbl9zdG9wKGNwc3ctPnR4Y2hbY2hdKTsKKwkJY3BkbWFfY2hhbl9zdGFydChjcHN3LT50eGNoW2NoXSk7CisJfQorCisJY3Bzd19pbnRyX2VuYWJsZShjcHN3KTsKIH0KIAogc3RhdGljIGludCBjcHN3X25kb19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKnApCiB7CiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilwOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CiAJaW50IGZsYWdzID0gMDsKIAl1MTYgdmlkID0gMDsKIAlpbnQgcmV0OwpAQCAtMTYyMSwyNyArMTcxNiwyNyBAQAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCi0JcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcHJpdi0+cGRldi0+ZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGNwc3ctPmRldik7CiAJaWYgKHJldCA8IDApIHsKLQkJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZwcml2LT5wZGV2LT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoY3Bzdy0+ZGV2KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKLQkJdmlkID0gcHJpdi0+c2xhdmVzW3ByaXYtPmVtYWNfcG9ydF0ucG9ydF92bGFuOworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykgeworCQl2aWQgPSBjcHN3LT5zbGF2ZXNbcHJpdi0+ZW1hY19wb3J0XS5wb3J0X3ZsYW47CiAJCWZsYWdzID0gQUxFX1ZMQU47CiAJfQogCi0JY3Bzd19hbGVfZGVsX3VjYXN0KHByaXYtPmFsZSwgcHJpdi0+bWFjX2FkZHIsIEhPU1RfUE9SVF9OVU0sCisJY3Bzd19hbGVfZGVsX3VjYXN0KGNwc3ctPmFsZSwgcHJpdi0+bWFjX2FkZHIsIEhPU1RfUE9SVF9OVU0sCiAJCQkgICBmbGFncywgdmlkKTsKLQljcHN3X2FsZV9hZGRfdWNhc3QocHJpdi0+YWxlLCBhZGRyLT5zYV9kYXRhLCBIT1NUX1BPUlRfTlVNLAorCWNwc3dfYWxlX2FkZF91Y2FzdChjcHN3LT5hbGUsIGFkZHItPnNhX2RhdGEsIEhPU1RfUE9SVF9OVU0sCiAJCQkgICBmbGFncywgdmlkKTsKIAogCW1lbWNweShwcml2LT5tYWNfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOwogCW1lbWNweShuZGV2LT5kZXZfYWRkciwgcHJpdi0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKIAlmb3JfZWFjaF9zbGF2ZShwcml2LCBjcHN3X3NldF9zbGF2ZV9tYWMsIHByaXYpOwogCi0JcG1fcnVudGltZV9wdXQoJnByaXYtPnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXQoY3Bzdy0+ZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTY0OSwxMiArMTc0NCwxMiBAQAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiBzdGF0aWMgdm9pZCBjcHN3X25kb19wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAotCWNwc3dfaW50cl9kaXNhYmxlKHByaXYpOwotCWNwc3dfcnhfaW50ZXJydXB0KHByaXYtPmlycXNfdGFibGVbMF0sIHByaXYpOwotCWNwc3dfdHhfaW50ZXJydXB0KHByaXYtPmlycXNfdGFibGVbMV0sIHByaXYpOwotCWNwc3dfaW50cl9lbmFibGUocHJpdik7CisJY3Bzd19pbnRyX2Rpc2FibGUoY3Bzdyk7CisJY3Bzd19yeF9pbnRlcnJ1cHQoY3Bzdy0+aXJxc190YWJsZVswXSwgY3Bzdyk7CisJY3Bzd190eF9pbnRlcnJ1cHQoY3Bzdy0+aXJxc190YWJsZVsxXSwgY3Bzdyk7CisJY3Bzd19pbnRyX2VuYWJsZShjcHN3KTsKIH0KICNlbmRpZgogCkBAIC0xNjY0LDggKzE3NTksOSBAQAogCWludCByZXQ7CiAJaW50IHVucmVnX21jYXN0X21hc2sgPSAwOwogCXUzMiBwb3J0X21hc2s7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykgeworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykgewogCQlwb3J0X21hc2sgPSAoMSA8PCAocHJpdi0+ZW1hY19wb3J0ICsgMSkpIHwgQUxFX1BPUlRfSE9TVDsKIAogCQlpZiAocHJpdi0+bmRldi0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkpCkBAIC0xNjc5LDI3ICsxNzc1LDI3IEBACiAJCQl1bnJlZ19tY2FzdF9tYXNrID0gQUxFX1BPUlRfMSB8IEFMRV9QT1JUXzI7CiAJfQogCi0JcmV0ID0gY3Bzd19hbGVfYWRkX3ZsYW4ocHJpdi0+YWxlLCB2aWQsIHBvcnRfbWFzaywgMCwgcG9ydF9tYXNrLAorCXJldCA9IGNwc3dfYWxlX2FkZF92bGFuKGNwc3ctPmFsZSwgdmlkLCBwb3J0X21hc2ssIDAsIHBvcnRfbWFzaywKIAkJCQl1bnJlZ19tY2FzdF9tYXNrKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBjcHN3X2FsZV9hZGRfdWNhc3QocHJpdi0+YWxlLCBwcml2LT5tYWNfYWRkciwKKwlyZXQgPSBjcHN3X2FsZV9hZGRfdWNhc3QoY3Bzdy0+YWxlLCBwcml2LT5tYWNfYWRkciwKIAkJCQkgSE9TVF9QT1JUX05VTSwgQUxFX1ZMQU4sIHZpZCk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGNsZWFuX3ZpZDsKIAotCXJldCA9IGNwc3dfYWxlX2FkZF9tY2FzdChwcml2LT5hbGUsIHByaXYtPm5kZXYtPmJyb2FkY2FzdCwKKwlyZXQgPSBjcHN3X2FsZV9hZGRfbWNhc3QoY3Bzdy0+YWxlLCBwcml2LT5uZGV2LT5icm9hZGNhc3QsCiAJCQkJIHBvcnRfbWFzaywgQUxFX1ZMQU4sIHZpZCwgMCk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGNsZWFuX3ZsYW5fdWNhc3Q7CiAJcmV0dXJuIDA7CiAKIGNsZWFuX3ZsYW5fdWNhc3Q6Ci0JY3Bzd19hbGVfZGVsX3VjYXN0KHByaXYtPmFsZSwgcHJpdi0+bWFjX2FkZHIsCisJY3Bzd19hbGVfZGVsX3VjYXN0KGNwc3ctPmFsZSwgcHJpdi0+bWFjX2FkZHIsCiAJCQkgICBIT1NUX1BPUlRfTlVNLCBBTEVfVkxBTiwgdmlkKTsKIGNsZWFuX3ZpZDoKLQljcHN3X2FsZV9kZWxfdmxhbihwcml2LT5hbGUsIHZpZCwgMCk7CisJY3Bzd19hbGVfZGVsX3ZsYW4oY3Bzdy0+YWxlLCB2aWQsIDApOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3MDcsMjYgKzE4MDMsMjcgQEAKIAkJCQkgICAgX19iZTE2IHByb3RvLCB1MTYgdmlkKQogewogCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OwogCWludCByZXQ7CiAKLQlpZiAodmlkID09IHByaXYtPmRhdGEuZGVmYXVsdF92bGFuKQorCWlmICh2aWQgPT0gY3Bzdy0+ZGF0YS5kZWZhdWx0X3ZsYW4pCiAJCXJldHVybiAwOwogCi0JcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcHJpdi0+cGRldi0+ZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGNwc3ctPmRldik7CiAJaWYgKHJldCA8IDApIHsKLQkJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZwcml2LT5wZGV2LT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoY3Bzdy0+ZGV2KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpIHsKIAkJLyogSW4gZHVhbCBFTUFDLCByZXNlcnZlZCBWTEFOIGlkIHNob3VsZCBub3QgYmUgdXNlZCBmb3IKIAkJICogY3JlYXRpbmcgVkxBTiBpbnRlcmZhY2VzIGFzIHRoaXMgY2FuIGJyZWFrIHRoZSBkdWFsCiAJCSAqIEVNQUMgcG9ydCBzZXBhcmF0aW9uCiAJCSAqLwogCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZGF0YS5zbGF2ZXM7IGkrKykgewotCQkJaWYgKHZpZCA9PSBwcml2LT5zbGF2ZXNbaV0ucG9ydF92bGFuKQorCQlmb3IgKGkgPSAwOyBpIDwgY3Bzdy0+ZGF0YS5zbGF2ZXM7IGkrKykgeworCQkJaWYgKHZpZCA9PSBjcHN3LT5zbGF2ZXNbaV0ucG9ydF92bGFuKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQpAQCAtMTczNCw3ICsxODMxLDcgQEAKIAlkZXZfaW5mbyhwcml2LT5kZXYsICJBZGRpbmcgdmxhbmlkICVkIHRvIHZsYW4gZmlsdGVyXG4iLCB2aWQpOwogCXJldCA9IGNwc3dfYWRkX3ZsYW5fYWxlX2VudHJ5KHByaXYsIHZpZCk7CiAKLQlwbV9ydW50aW1lX3B1dCgmcHJpdi0+cGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dChjcHN3LT5kZXYpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3NDIsMzkgKzE4MzksNDAgQEAKIAkJCQkgICAgIF9fYmUxNiBwcm90bywgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAlpbnQgcmV0OwogCi0JaWYgKHZpZCA9PSBwcml2LT5kYXRhLmRlZmF1bHRfdmxhbikKKwlpZiAodmlkID09IGNwc3ctPmRhdGEuZGVmYXVsdF92bGFuKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnByaXYtPnBkZXYtPmRldik7CisJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhjcHN3LT5kZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcHJpdi0+cGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGNwc3ctPmRldik7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHByaXYtPmRhdGEuZHVhbF9lbWFjKSB7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKSB7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5kYXRhLnNsYXZlczsgaSsrKSB7Ci0JCQlpZiAodmlkID09IHByaXYtPnNsYXZlc1tpXS5wb3J0X3ZsYW4pCisJCWZvciAoaSA9IDA7IGkgPCBjcHN3LT5kYXRhLnNsYXZlczsgaSsrKSB7CisJCQlpZiAodmlkID09IGNwc3ctPnNsYXZlc1tpXS5wb3J0X3ZsYW4pCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKIAlkZXZfaW5mbyhwcml2LT5kZXYsICJyZW1vdmluZyB2bGFuaWQgJWQgZnJvbSB2bGFuIGZpbHRlclxuIiwgdmlkKTsKLQlyZXQgPSBjcHN3X2FsZV9kZWxfdmxhbihwcml2LT5hbGUsIHZpZCwgMCk7CisJcmV0ID0gY3Bzd19hbGVfZGVsX3ZsYW4oY3Bzdy0+YWxlLCB2aWQsIDApOwogCWlmIChyZXQgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IGNwc3dfYWxlX2RlbF91Y2FzdChwcml2LT5hbGUsIHByaXYtPm1hY19hZGRyLAorCXJldCA9IGNwc3dfYWxlX2RlbF91Y2FzdChjcHN3LT5hbGUsIHByaXYtPm1hY19hZGRyLAogCQkJCSBIT1NUX1BPUlRfTlVNLCBBTEVfVkxBTiwgdmlkKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBjcHN3X2FsZV9kZWxfbWNhc3QocHJpdi0+YWxlLCBwcml2LT5uZGV2LT5icm9hZGNhc3QsCisJcmV0ID0gY3Bzd19hbGVfZGVsX21jYXN0KGNwc3ctPmFsZSwgcHJpdi0+bmRldi0+YnJvYWRjYXN0LAogCQkJCSAwLCBBTEVfVkxBTiwgdmlkKTsKLQlwbV9ydW50aW1lX3B1dCgmcHJpdi0+cGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dChjcHN3LT5kZXYpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3OTcsMzEgKzE4OTUsMzIgQEAKIAogc3RhdGljIGludCBjcHN3X2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOwogCi0JcmV0dXJuIHByaXYtPmRhdGEuYWxlX2VudHJpZXMgKiBBTEVfRU5UUllfV09SRFMgKiBzaXplb2YodTMyKTsKKwlyZXR1cm4gY3Bzdy0+ZGF0YS5hbGVfZW50cmllcyAqIEFMRV9FTlRSWV9XT1JEUyAqIHNpemVvZih1MzIpOwogfQogCiBzdGF0aWMgdm9pZCBjcHN3X2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAogCQkJICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpwKQogewotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAl1MzIgKnJlZyA9IHA7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOwogCiAJLyogdXBkYXRlIENQU1cgSVAgdmVyc2lvbiAqLwotCXJlZ3MtPnZlcnNpb24gPSBwcml2LT52ZXJzaW9uOworCXJlZ3MtPnZlcnNpb24gPSBjcHN3LT52ZXJzaW9uOwogCi0JY3Bzd19hbGVfZHVtcChwcml2LT5hbGUsIHJlZyk7CisJY3Bzd19hbGVfZHVtcChjcHN3LT5hbGUsIHJlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIGNwc3dfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJCQkgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGNwc3ctPmRldik7CiAKIAlzdHJsY3B5KGluZm8tPmRyaXZlciwgImNwc3ciLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CiAJc3RybGNweShpbmZvLT52ZXJzaW9uLCAiMS4wIiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKLQlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwcml2LT5wZGV2LT5uYW1lLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwZGV2LT5uYW1lLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIHUzMiBjcHN3X2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKQEAgLTE4NDAsNyArMTkzOSw3IEBACiAJCQkgICAgc3RydWN0IGV0aHRvb2xfdHNfaW5mbyAqaW5mbykKIHsKICNpZmRlZiBDT05GSUdfVElfQ1BUUwotCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBuZGV2X3RvX2Nwc3cobmRldik7CiAKIAlpbmZvLT5zb190aW1lc3RhbXBpbmcgPQogCQlTT0ZfVElNRVNUQU1QSU5HX1RYX0hBUkRXQVJFIHwKQEAgLTE4NDksNyArMTk0OCw3IEBACiAJCVNPRl9USU1FU1RBTVBJTkdfUlhfU09GVFdBUkUgfAogCQlTT0ZfVElNRVNUQU1QSU5HX1NPRlRXQVJFIHwKIAkJU09GX1RJTUVTVEFNUElOR19SQVdfSEFSRFdBUkU7Ci0JaW5mby0+cGhjX2luZGV4ID0gcHJpdi0+Y3B0cy0+cGhjX2luZGV4OworCWluZm8tPnBoY19pbmRleCA9IGNwc3ctPmNwdHMtPnBoY19pbmRleDsKIAlpbmZvLT50eF90eXBlcyA9CiAJCSgxIDw8IEhXVFNUQU1QX1RYX09GRikgfAogCQkoMSA8PCBIV1RTVEFNUF9UWF9PTik7CkBAIC0xODcyLDEwICsxOTcxLDExIEBACiAJCQkgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChwcml2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCWludCBzbGF2ZV9ubyA9IGNwc3dfc2xhdmVfaW5kZXgoY3BzdywgcHJpdik7CiAKLQlpZiAocHJpdi0+c2xhdmVzW3NsYXZlX25vXS5waHkpCi0JCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCBlY21kKTsKKwlpZiAoY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHkpCisJCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KGNwc3ctPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCBlY21kKTsKIAllbHNlCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTE4ODMsMTAgKzE5ODMsMTEgQEAKIHN0YXRpYyBpbnQgY3Bzd19zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChwcml2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCWludCBzbGF2ZV9ubyA9IGNwc3dfc2xhdmVfaW5kZXgoY3BzdywgcHJpdik7CiAKLQlpZiAocHJpdi0+c2xhdmVzW3NsYXZlX25vXS5waHkpCi0JCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCBlY21kKTsKKwlpZiAoY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHkpCisJCXJldHVybiBwaHlfZXRodG9vbF9zc2V0KGNwc3ctPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCBlY21kKTsKIAllbHNlCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTE4OTQsMjIgKzE5OTUsMjQgQEAKIHN0YXRpYyB2b2lkIGNwc3dfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQogewogCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlpbnQgc2xhdmVfbm8gPSBjcHN3X3NsYXZlX2luZGV4KHByaXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IHByaXYtPmNwc3c7CisJaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChjcHN3LCBwcml2KTsKIAogCXdvbC0+c3VwcG9ydGVkID0gMDsKIAl3b2wtPndvbG9wdHMgPSAwOwogCi0JaWYgKHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5KQotCQlwaHlfZXRodG9vbF9nZXRfd29sKHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCB3b2wpOworCWlmIChjcHN3LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSkKKwkJcGh5X2V0aHRvb2xfZ2V0X3dvbChjcHN3LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSwgd29sKTsKIH0KIAogc3RhdGljIGludCBjcHN3X3NldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JaW50IHNsYXZlX25vID0gY3Bzd19zbGF2ZV9pbmRleChwcml2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCWludCBzbGF2ZV9ubyA9IGNwc3dfc2xhdmVfaW5kZXgoY3BzdywgcHJpdik7CiAKLQlpZiAocHJpdi0+c2xhdmVzW3NsYXZlX25vXS5waHkpCi0JCXJldHVybiBwaHlfZXRodG9vbF9zZXRfd29sKHByaXYtPnNsYXZlc1tzbGF2ZV9ub10ucGh5LCB3b2wpOworCWlmIChjcHN3LT5zbGF2ZXNbc2xhdmVfbm9dLnBoeSkKKwkJcmV0dXJuIHBoeV9ldGh0b29sX3NldF93b2woY3Bzdy0+c2xhdmVzW3NsYXZlX25vXS5waHksIHdvbCk7CiAJZWxzZQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CkBAIC0xOTQwLDEyICsyMDQzLDEzIEBACiBzdGF0aWMgaW50IGNwc3dfZXRodG9vbF9vcF9iZWdpbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3QgY3Bzd19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gcHJpdi0+Y3BzdzsKIAlpbnQgcmV0OwogCi0JcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcHJpdi0+cGRldi0+ZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGNwc3ctPmRldik7CiAJaWYgKHJldCA8IDApIHsKIAkJY3Bzd19lcnIocHJpdiwgZHJ2LCAiZXRodG9vbCBiZWdpbiBmYWlsZWQgJWRcbiIsIHJldCk7Ci0JCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcHJpdi0+cGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGNwc3ctPmRldik7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTE5NTYsMTEgKzIwNjAsMTg1IEBACiAJc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCWludCByZXQ7CiAKLQlyZXQgPSBwbV9ydW50aW1lX3B1dCgmcHJpdi0+cGRldi0+ZGV2KTsKKwlyZXQgPSBwbV9ydW50aW1lX3B1dChwcml2LT5jcHN3LT5kZXYpOwogCWlmIChyZXQgPCAwKQogCQljcHN3X2Vycihwcml2LCBkcnYsICJldGh0b29sIGNvbXBsZXRlIGZhaWxlZCAlZFxuIiwgcmV0KTsKIH0KIAorc3RhdGljIHZvaWQgY3Bzd19nZXRfY2hhbm5lbHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCisJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqY2gpCit7CisJc3RydWN0IGNwc3dfY29tbW9uICpjcHN3ID0gbmRldl90b19jcHN3KG5kZXYpOworCisJY2gtPm1heF9jb21iaW5lZCA9IDA7CisJY2gtPm1heF9yeCA9IENQU1dfTUFYX1FVRVVFUzsKKwljaC0+bWF4X3R4ID0gQ1BTV19NQVhfUVVFVUVTOworCWNoLT5tYXhfb3RoZXIgPSAwOworCWNoLT5vdGhlcl9jb3VudCA9IDA7CisJY2gtPnJ4X2NvdW50ID0gY3Bzdy0+cnhfY2hfbnVtOworCWNoLT50eF9jb3VudCA9IGNwc3ctPnR4X2NoX251bTsKKwljaC0+Y29tYmluZWRfY291bnQgPSAwOworfQorCitzdGF0aWMgaW50IGNwc3dfY2hlY2tfY2hfc2V0dGluZ3Moc3RydWN0IGNwc3dfY29tbW9uICpjcHN3LAorCQkJCSAgc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNoKQoreworCWlmIChjaC0+Y29tYmluZWRfY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogdmVyaWZ5IHdlIGhhdmUgYXQgbGVhc3Qgb25lIGNoYW5uZWwgaW4gZWFjaCBkaXJlY3Rpb24gKi8KKwlpZiAoIWNoLT5yeF9jb3VudCB8fCAhY2gtPnR4X2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjaC0+cnhfY291bnQgPiBjcHN3LT5kYXRhLmNoYW5uZWxzIHx8CisJICAgIGNoLT50eF9jb3VudCA+IGNwc3ctPmRhdGEuY2hhbm5lbHMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3Bzd191cGRhdGVfY2hhbm5lbHNfcmVzKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYsIGludCBjaF9udW0sIGludCByeCkKK3sKKwlpbnQgKCpwb2xsKShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCXZvaWQgKCpoYW5kbGVyKSh2b2lkICosIGludCwgaW50KTsKKwlzdHJ1Y3QgY3BkbWFfY2hhbiAqKmNoYW47CisJaW50IHJldCwgKmNoOworCisJaWYgKHJ4KSB7CisJCWNoID0gJmNwc3ctPnJ4X2NoX251bTsKKwkJY2hhbiA9IGNwc3ctPnJ4Y2g7CisJCWhhbmRsZXIgPSBjcHN3X3J4X2hhbmRsZXI7CisJCXBvbGwgPSBjcHN3X3J4X3BvbGw7CisJfSBlbHNlIHsKKwkJY2ggPSAmY3Bzdy0+dHhfY2hfbnVtOworCQljaGFuID0gY3Bzdy0+dHhjaDsKKwkJaGFuZGxlciA9IGNwc3dfdHhfaGFuZGxlcjsKKwkJcG9sbCA9IGNwc3dfdHhfcG9sbDsKKwl9CisKKwl3aGlsZSAoKmNoIDwgY2hfbnVtKSB7CisJCWNoYW5bKmNoXSA9IGNwZG1hX2NoYW5fY3JlYXRlKGNwc3ctPmRtYSwgKmNoLCBoYW5kbGVyLCByeCk7CisKKwkJaWYgKElTX0VSUihjaGFuWypjaF0pKQorCQkJcmV0dXJuIFBUUl9FUlIoY2hhblsqY2hdKTsKKworCQlpZiAoIWNoYW5bKmNoXSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNwc3dfaW5mbyhwcml2LCBpZnVwLCAiY3JlYXRlZCBuZXcgJWQgJXMgY2hhbm5lbFxuIiwgKmNoLAorCQkJICAocnggPyAicngiIDogInR4IikpOworCQkoKmNoKSsrOworCX0KKworCXdoaWxlICgqY2ggPiBjaF9udW0pIHsKKwkJKCpjaCktLTsKKworCQlyZXQgPSBjcGRtYV9jaGFuX2Rlc3Ryb3koY2hhblsqY2hdKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJY3Bzd19pbmZvKHByaXYsIGlmdXAsICJkZXN0cm95ZWQgJWQgJXMgY2hhbm5lbFxuIiwgKmNoLAorCQkJICAocnggPyAicngiIDogInR4IikpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwc3dfdXBkYXRlX2NoYW5uZWxzKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYsCisJCQkJc3RydWN0IGV0aHRvb2xfY2hhbm5lbHMgKmNoKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcHN3X3VwZGF0ZV9jaGFubmVsc19yZXMocHJpdiwgY2gtPnJ4X2NvdW50LCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY3Bzd191cGRhdGVfY2hhbm5lbHNfcmVzKHByaXYsIGNoLT50eF9jb3VudCwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwc3dfc2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAorCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqY2hzKQoreworCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgY3Bzd19jb21tb24gKmNwc3cgPSBwcml2LT5jcHN3OworCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZTsKKwlpbnQgaSwgcmV0OworCisJcmV0ID0gY3Bzd19jaGVja19jaF9zZXR0aW5ncyhjcHN3LCBjaHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogRGlzYWJsZSBOQVBJIHNjaGVkdWxpbmcgKi8KKwljcHN3X2ludHJfZGlzYWJsZShjcHN3KTsKKworCS8qIFN0b3AgYWxsIHRyYW5zbWl0IHF1ZXVlcyBmb3IgZXZlcnkgbmV0d29yayBkZXZpY2UuCisJICogRGlzYWJsZSByZS11c2luZyByeCBkZXNjcmlwdG9ycyB3aXRoIGRvcm1hbnRfb24uCisJICovCisJZm9yIChpID0gY3Bzdy0+ZGF0YS5zbGF2ZXMsIHNsYXZlID0gY3Bzdy0+c2xhdmVzOyBpOyBpLS0sIHNsYXZlKyspIHsKKwkJaWYgKCEoc2xhdmUtPm5kZXYgJiYgbmV0aWZfcnVubmluZyhzbGF2ZS0+bmRldikpKQorCQkJY29udGludWU7CisKKwkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHNsYXZlLT5uZGV2KTsKKwkJbmV0aWZfZG9ybWFudF9vbihzbGF2ZS0+bmRldik7CisJfQorCisJLyogSGFuZGxlIHJlc3Qgb2YgdHggcGFja2V0cyBhbmQgc3RvcCBjcGRtYSBjaGFubmVscyAqLworCWNwZG1hX2N0bHJfc3RvcChjcHN3LT5kbWEpOworCXJldCA9IGNwc3dfdXBkYXRlX2NoYW5uZWxzKHByaXYsIGNocyk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwlmb3IgKGkgPSBjcHN3LT5kYXRhLnNsYXZlcywgc2xhdmUgPSBjcHN3LT5zbGF2ZXM7IGk7IGktLSwgc2xhdmUrKykgeworCQlpZiAoIShzbGF2ZS0+bmRldiAmJiBuZXRpZl9ydW5uaW5nKHNsYXZlLT5uZGV2KSkpCisJCQljb250aW51ZTsKKworCQkvKiBJbmZvcm0gc3RhY2sgYWJvdXQgbmV3IGNvdW50IG9mIHF1ZXVlcyAqLworCQlyZXQgPSBuZXRpZl9zZXRfcmVhbF9udW1fdHhfcXVldWVzKHNsYXZlLT5uZGV2LAorCQkJCQkJICAgY3Bzdy0+dHhfY2hfbnVtKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihwcml2LT5kZXYsICJjYW5ub3Qgc2V0IHJlYWwgbnVtYmVyIG9mIHR4IHF1ZXVlc1xuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCXJldCA9IG5ldGlmX3NldF9yZWFsX251bV9yeF9xdWV1ZXMoc2xhdmUtPm5kZXYsCisJCQkJCQkgICBjcHN3LT5yeF9jaF9udW0pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHByaXYtPmRldiwgImNhbm5vdCBzZXQgcmVhbCBudW1iZXIgb2YgcnggcXVldWVzXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogRW5hYmxlIHJ4IHBhY2tldHMgaGFuZGxpbmcgKi8KKwkJbmV0aWZfZG9ybWFudF9vZmYoc2xhdmUtPm5kZXYpOworCX0KKworCWlmIChjcHN3X2NvbW1vbl9yZXNfdXNhZ2Vfc3RhdGUoY3BzdykpIHsKKwkJcmV0ID0gY3Bzd19maWxsX3J4X2NoYW5uZWxzKHByaXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnI7CisKKwkJLyogQWZ0ZXIgdGhpcyByZWNlaXZlIGlzIHN0YXJ0ZWQgKi8KKwkJY3BkbWFfY3Rscl9zdGFydChjcHN3LT5kbWEpOworCQljcHN3X2ludHJfZW5hYmxlKGNwc3cpOworCX0KKworCS8qIFJlc3VtZSB0cmFuc21pdCBmb3IgZXZlcnkgYWZmZWN0ZWQgaW50ZXJmYWNlICovCisJZm9yIChpID0gY3Bzdy0+ZGF0YS5zbGF2ZXMsIHNsYXZlID0gY3Bzdy0+c2xhdmVzOyBpOyBpLS0sIHNsYXZlKyspIHsKKwkJaWYgKCEoc2xhdmUtPm5kZXYgJiYgbmV0aWZfcnVubmluZyhzbGF2ZS0+bmRldikpKQorCQkJY29udGludWU7CisJCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoc2xhdmUtPm5kZXYpOworCX0KKwlyZXR1cm4gMDsKK2VycjoKKwlkZXZfZXJyKHByaXYtPmRldiwgImNhbm5vdCB1cGRhdGUgY2hhbm5lbHMgbnVtYmVyLCBjbG9zaW5nIGRldmljZVxuIik7CisJZGV2X2Nsb3NlKG5kZXYpOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgY3Bzd19ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8JPSBjcHN3X2dldF9kcnZpbmZvLAogCS5nZXRfbXNnbGV2ZWwJPSBjcHN3X2dldF9tc2dsZXZlbCwKQEAgLTE5ODIsMTQgKzIyNjAsMTYgQEAKIAkuZ2V0X3JlZ3MJPSBjcHN3X2dldF9yZWdzLAogCS5iZWdpbgkJPSBjcHN3X2V0aHRvb2xfb3BfYmVnaW4sCiAJLmNvbXBsZXRlCT0gY3Bzd19ldGh0b29sX29wX2NvbXBsZXRlLAorCS5nZXRfY2hhbm5lbHMJPSBjcHN3X2dldF9jaGFubmVscywKKwkuc2V0X2NoYW5uZWxzCT0gY3Bzd19zZXRfY2hhbm5lbHMsCiB9OwogCi1zdGF0aWMgdm9pZCBjcHN3X3NsYXZlX2luaXQoc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlLCBzdHJ1Y3QgY3Bzd19wcml2ICpwcml2LAorc3RhdGljIHZvaWQgY3Bzd19zbGF2ZV9pbml0KHN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSwgc3RydWN0IGNwc3dfY29tbW9uICpjcHN3LAogCQkJICAgIHUzMiBzbGF2ZV9yZWdfb2ZzLCB1MzIgc2xpdmVyX3JlZ19vZnMpCiB7Ci0Jdm9pZCBfX2lvbWVtCQkqcmVncyA9IHByaXYtPnJlZ3M7CisJdm9pZCBfX2lvbWVtCQkqcmVncyA9IGNwc3ctPnJlZ3M7CiAJaW50CQkJc2xhdmVfbnVtID0gc2xhdmUtPnNsYXZlX251bTsKLQlzdHJ1Y3QgY3Bzd19zbGF2ZV9kYXRhCSpkYXRhID0gcHJpdi0+ZGF0YS5zbGF2ZV9kYXRhICsgc2xhdmVfbnVtOworCXN0cnVjdCBjcHN3X3NsYXZlX2RhdGEJKmRhdGEgPSBjcHN3LT5kYXRhLnNsYXZlX2RhdGEgKyBzbGF2ZV9udW07CiAKIAlzbGF2ZS0+ZGF0YQk9IGRhdGE7CiAJc2xhdmUtPnJlZ3MJPSByZWdzICsgc2xhdmVfcmVnX29mczsKQEAgLTIxNjAsNzEgKzI0NDAsNTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjcHN3X3Byb2JlX2R1YWxfZW1hYyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAotCQkJCXN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCitzdGF0aWMgaW50IGNwc3dfcHJvYmVfZHVhbF9lbWFjKHN0cnVjdCBjcHN3X3ByaXYgKnByaXYpCiB7Ci0Jc3RydWN0IGNwc3dfcGxhdGZvcm1fZGF0YQkqZGF0YSA9ICZwcml2LT5kYXRhOworCXN0cnVjdCBjcHN3X2NvbW1vbgkJKmNwc3cgPSBwcml2LT5jcHN3OworCXN0cnVjdCBjcHN3X3BsYXRmb3JtX2RhdGEJKmRhdGEgPSAmY3Bzdy0+ZGF0YTsKIAlzdHJ1Y3QgbmV0X2RldmljZQkJKm5kZXY7CiAJc3RydWN0IGNwc3dfcHJpdgkJKnByaXZfc2wyOwotCWludCByZXQgPSAwLCBpOworCWludCByZXQgPSAwOwogCi0JbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgY3Bzd19wcml2KSk7CisJbmRldiA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3QgY3Bzd19wcml2KSwgQ1BTV19NQVhfUVVFVUVTKTsKIAlpZiAoIW5kZXYpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY3BzdzogZXJyb3IgYWxsb2NhdGluZyBuZXRfZGV2aWNlXG4iKTsKKwkJZGV2X2VycihjcHN3LT5kZXYsICJjcHN3OiBlcnJvciBhbGxvY2F0aW5nIG5ldF9kZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAlwcml2X3NsMiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXByaXZfc2wyLT5kYXRhID0gKmRhdGE7Ci0JcHJpdl9zbDItPnBkZXYgPSBwZGV2OworCXByaXZfc2wyLT5jcHN3ID0gY3BzdzsKIAlwcml2X3NsMi0+bmRldiA9IG5kZXY7CiAJcHJpdl9zbDItPmRldiAgPSAmbmRldi0+ZGV2OwogCXByaXZfc2wyLT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWdfbGV2ZWwsIENQU1dfREVCVUcpOwotCXByaXZfc2wyLT5yeF9wYWNrZXRfbWF4ID0gbWF4KHJ4X3BhY2tldF9tYXgsIDEyOCk7CiAKIAlpZiAoaXNfdmFsaWRfZXRoZXJfYWRkcihkYXRhLT5zbGF2ZV9kYXRhWzFdLm1hY19hZGRyKSkgewogCQltZW1jcHkocHJpdl9zbDItPm1hY19hZGRyLCBkYXRhLT5zbGF2ZV9kYXRhWzFdLm1hY19hZGRyLAogCQkJRVRIX0FMRU4pOwotCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiY3BzdzogRGV0ZWN0ZWQgTUFDSUQgPSAlcE1cbiIsIHByaXZfc2wyLT5tYWNfYWRkcik7CisJCWRldl9pbmZvKGNwc3ctPmRldiwgImNwc3c6IERldGVjdGVkIE1BQ0lEID0gJXBNXG4iLAorCQkJIHByaXZfc2wyLT5tYWNfYWRkcik7CiAJfSBlbHNlIHsKIAkJcmFuZG9tX2V0aGVyX2FkZHIocHJpdl9zbDItPm1hY19hZGRyKTsKLQkJZGV2X2luZm8oJnBkZXYtPmRldiwgImNwc3c6IFJhbmRvbSBNQUNJRCA9ICVwTVxuIiwgcHJpdl9zbDItPm1hY19hZGRyKTsKKwkJZGV2X2luZm8oY3Bzdy0+ZGV2LCAiY3BzdzogUmFuZG9tIE1BQ0lEID0gJXBNXG4iLAorCQkJIHByaXZfc2wyLT5tYWNfYWRkcik7CiAJfQogCW1lbWNweShuZGV2LT5kZXZfYWRkciwgcHJpdl9zbDItPm1hY19hZGRyLCBFVEhfQUxFTik7CiAKLQlwcml2X3NsMi0+c2xhdmVzID0gcHJpdi0+c2xhdmVzOwotCXByaXZfc2wyLT5jbGsgPSBwcml2LT5jbGs7Ci0KLQlwcml2X3NsMi0+Y29hbF9pbnR2bCA9IDA7Ci0JcHJpdl9zbDItPmJ1c19mcmVxX21oeiA9IHByaXYtPmJ1c19mcmVxX21oejsKLQotCXByaXZfc2wyLT5yZWdzID0gcHJpdi0+cmVnczsKLQlwcml2X3NsMi0+aG9zdF9wb3J0X3JlZ3MgPSBwcml2LT5ob3N0X3BvcnRfcmVnczsKLQlwcml2X3NsMi0+d3JfcmVncyA9IHByaXYtPndyX3JlZ3M7Ci0JcHJpdl9zbDItPmh3X3N0YXRzID0gcHJpdi0+aHdfc3RhdHM7Ci0JcHJpdl9zbDItPmRtYSA9IHByaXYtPmRtYTsKLQlwcml2X3NsMi0+dHhjaCA9IHByaXYtPnR4Y2g7Ci0JcHJpdl9zbDItPnJ4Y2ggPSBwcml2LT5yeGNoOwotCXByaXZfc2wyLT5hbGUgPSBwcml2LT5hbGU7CiAJcHJpdl9zbDItPmVtYWNfcG9ydCA9IDE7Ci0JcHJpdi0+c2xhdmVzWzFdLm5kZXYgPSBuZGV2OwotCXByaXZfc2wyLT5jcHRzID0gcHJpdi0+Y3B0czsKLQlwcml2X3NsMi0+dmVyc2lvbiA9IHByaXYtPnZlcnNpb247Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnVtX2lycXM7IGkrKykgewotCQlwcml2X3NsMi0+aXJxc190YWJsZVtpXSA9IHByaXYtPmlycXNfdGFibGVbaV07Ci0JCXByaXZfc2wyLT5udW1faXJxcyA9IHByaXYtPm51bV9pcnFzOwotCX0KKwljcHN3LT5zbGF2ZXNbMV0ubmRldiA9IG5kZXY7CiAJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX0NUQUdfRklMVEVSOwogCiAJbmRldi0+bmV0ZGV2X29wcyA9ICZjcHN3X25ldGRldl9vcHM7CiAJbmRldi0+ZXRodG9vbF9vcHMgPSAmY3Bzd19ldGh0b29sX29wczsKIAogCS8qIHJlZ2lzdGVyIHRoZSBuZXR3b3JrIGRldmljZSAqLwotCVNFVF9ORVRERVZfREVWKG5kZXYsICZwZGV2LT5kZXYpOworCVNFVF9ORVRERVZfREVWKG5kZXYsIGNwc3ctPmRldik7CiAJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY3BzdzogZXJyb3IgcmVnaXN0ZXJpbmcgbmV0IGRldmljZVxuIik7CisJCWRldl9lcnIoY3Bzdy0+ZGV2LCAiY3BzdzogZXJyb3IgcmVnaXN0ZXJpbmcgbmV0IGRldmljZVxuIik7CiAJCWZyZWVfbmV0ZGV2KG5kZXYpOwogCQlyZXQgPSAtRU5PREVWOwogCX0KQEAgLTIyNzIsNiArMjUzMSw3IEBACiAKIHN0YXRpYyBpbnQgY3Bzd19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBjbGsJCQkqY2xrOwogCXN0cnVjdCBjcHN3X3BsYXRmb3JtX2RhdGEJKmRhdGE7CiAJc3RydWN0IG5ldF9kZXZpY2UJCSpuZGV2OwogCXN0cnVjdCBjcHN3X3ByaXYJCSpwcml2OwpAQCAtMjI4MiwxMCArMjU0MiwxNCBAQAogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQJKm9mX2lkOwogCXN0cnVjdCBncGlvX2Rlc2NzCQkqbW9kZTsKIAl1MzIgc2xhdmVfb2Zmc2V0LCBzbGl2ZXJfb2Zmc2V0LCBzbGF2ZV9zaXplOworCXN0cnVjdCBjcHN3X2NvbW1vbgkJKmNwc3c7CiAJaW50IHJldCA9IDAsIGk7CiAJaW50IGlycTsKIAotCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGNwc3dfcHJpdikpOworCWNwc3cgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBjcHN3X2NvbW1vbiksIEdGUF9LRVJORUwpOworCWNwc3ctPmRldiA9ICZwZGV2LT5kZXY7CisKKwluZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCBjcHN3X3ByaXYpLCBDUFNXX01BWF9RVUVVRVMpOwogCWlmICghbmRldikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlcnJvciBhbGxvY2F0aW5nIG5ldF9kZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIyOTMsMTMgKzI1NTcsMTMgQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG5kZXYpOwogCXByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlwcml2LT5wZGV2ID0gcGRldjsKKwlwcml2LT5jcHN3ID0gY3BzdzsKIAlwcml2LT5uZGV2ID0gbmRldjsKIAlwcml2LT5kZXYgID0gJm5kZXYtPmRldjsKIAlwcml2LT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWdfbGV2ZWwsIENQU1dfREVCVUcpOwotCXByaXYtPnJ4X3BhY2tldF9tYXggPSBtYXgocnhfcGFja2V0X21heCwgMTI4KTsKLQlwcml2LT5jcHRzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgY3B0cyksIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+Y3B0cykgeworCWNwc3ctPnJ4X3BhY2tldF9tYXggPSBtYXgocnhfcGFja2V0X21heCwgMTI4KTsKKwljcHN3LT5jcHRzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgY3B0cyksIEdGUF9LRVJORUwpOworCWlmICghY3Bzdy0+Y3B0cykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJlcnJvciBhbGxvY2F0aW5nIGNwdHNcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGNsZWFuX25kZXZfcmV0OwpAQCAtMjMyMCwxMiArMjU4NCwxNCBAQAogCS8qIFNlbGVjdCBkZWZhdWx0IHBpbiBzdGF0ZSAqLwogCXBpbmN0cmxfcG1fc2VsZWN0X2RlZmF1bHRfc3RhdGUoJnBkZXYtPmRldik7CiAKLQlpZiAoY3Bzd19wcm9iZV9kdCgmcHJpdi0+ZGF0YSwgcGRldikpIHsKKwlpZiAoY3Bzd19wcm9iZV9kdCgmY3Bzdy0+ZGF0YSwgcGRldikpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY3BzdzogcGxhdGZvcm0gZGF0YSBtaXNzaW5nXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBjbGVhbl9ydW50aW1lX2Rpc2FibGVfcmV0OwogCX0KLQlkYXRhID0gJnByaXYtPmRhdGE7CisJZGF0YSA9ICZjcHN3LT5kYXRhOworCWNwc3ctPnJ4X2NoX251bSA9IDE7CisJY3Bzdy0+dHhfY2hfbnVtID0gMTsKIAogCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGRhdGEtPnNsYXZlX2RhdGFbMF0ubWFjX2FkZHIpKSB7CiAJCW1lbWNweShwcml2LT5tYWNfYWRkciwgZGF0YS0+c2xhdmVfZGF0YVswXS5tYWNfYWRkciwgRVRIX0FMRU4pOwpAQCAtMjMzNywyNyArMjYwMywyNiBAQAogCiAJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCBwcml2LT5tYWNfYWRkciwgRVRIX0FMRU4pOwogCi0JcHJpdi0+c2xhdmVzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCisJY3Bzdy0+c2xhdmVzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCiAJCQkJICAgIHNpemVvZihzdHJ1Y3QgY3Bzd19zbGF2ZSkgKiBkYXRhLT5zbGF2ZXMsCiAJCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+c2xhdmVzKSB7CisJaWYgKCFjcHN3LT5zbGF2ZXMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBjbGVhbl9ydW50aW1lX2Rpc2FibGVfcmV0OwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+c2xhdmVzOyBpKyspCi0JCXByaXYtPnNsYXZlc1tpXS5zbGF2ZV9udW0gPSBpOworCQljcHN3LT5zbGF2ZXNbaV0uc2xhdmVfbnVtID0gaTsKIAotCXByaXYtPnNsYXZlc1swXS5uZGV2ID0gbmRldjsKKwljcHN3LT5zbGF2ZXNbMF0ubmRldiA9IG5kZXY7CiAJcHJpdi0+ZW1hY19wb3J0ID0gMDsKIAotCXByaXYtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiZmNrIik7Ci0JaWYgKElTX0VSUihwcml2LT5jbGspKSB7CisJY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJmY2siKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKIAkJZGV2X2Vycihwcml2LT5kZXYsICJmY2sgaXMgbm90IGZvdW5kXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBjbGVhbl9ydW50aW1lX2Rpc2FibGVfcmV0OwogCX0KLQlwcml2LT5jb2FsX2ludHZsID0gMDsKLQlwcml2LT5idXNfZnJlcV9taHogPSBjbGtfZ2V0X3JhdGUocHJpdi0+Y2xrKSAvIDEwMDAwMDA7CisJY3Bzdy0+YnVzX2ZyZXFfbWh6ID0gY2xrX2dldF9yYXRlKGNsaykgLyAxMDAwMDAwOwogCiAJc3NfcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlzc19yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHNzX3Jlcyk7CkBAIC0yMzY1LDcgKzI2MzAsNyBAQAogCQlyZXQgPSBQVFJfRVJSKHNzX3JlZ3MpOwogCQlnb3RvIGNsZWFuX3J1bnRpbWVfZGlzYWJsZV9yZXQ7CiAJfQotCXByaXYtPnJlZ3MgPSBzc19yZWdzOworCWNwc3ctPnJlZ3MgPSBzc19yZWdzOwogCiAJLyogTmVlZCB0byBlbmFibGUgY2xvY2tzIHdpdGggcnVudGltZSBQTSBhcGkgdG8gYWNjZXNzIG1vZHVsZQogCSAqIHJlZ2lzdGVycwpAQCAtMjM3NSwyNCArMjY0MCwyNCBAQAogCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnBkZXYtPmRldik7CiAJCWdvdG8gY2xlYW5fcnVudGltZV9kaXNhYmxlX3JldDsKIAl9Ci0JcHJpdi0+dmVyc2lvbiA9IHJlYWRsKCZwcml2LT5yZWdzLT5pZF92ZXIpOworCWNwc3ctPnZlcnNpb24gPSByZWFkbCgmY3Bzdy0+cmVncy0+aWRfdmVyKTsKIAlwbV9ydW50aW1lX3B1dF9zeW5jKCZwZGV2LT5kZXYpOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKLQlwcml2LT53cl9yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihwcml2LT53cl9yZWdzKSkgewotCQlyZXQgPSBQVFJfRVJSKHByaXYtPndyX3JlZ3MpOworCWNwc3ctPndyX3JlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGNwc3ctPndyX3JlZ3MpKSB7CisJCXJldCA9IFBUUl9FUlIoY3Bzdy0+d3JfcmVncyk7CiAJCWdvdG8gY2xlYW5fcnVudGltZV9kaXNhYmxlX3JldDsKIAl9CiAKIAltZW1zZXQoJmRtYV9wYXJhbXMsIDAsIHNpemVvZihkbWFfcGFyYW1zKSk7CiAJbWVtc2V0KCZhbGVfcGFyYW1zLCAwLCBzaXplb2YoYWxlX3BhcmFtcykpOwogCi0Jc3dpdGNoIChwcml2LT52ZXJzaW9uKSB7CisJc3dpdGNoIChjcHN3LT52ZXJzaW9uKSB7CiAJY2FzZSBDUFNXX1ZFUlNJT05fMToKLQkJcHJpdi0+aG9zdF9wb3J0X3JlZ3MgPSBzc19yZWdzICsgQ1BTVzFfSE9TVF9QT1JUX09GRlNFVDsKLQkJcHJpdi0+Y3B0cy0+cmVnICAgICAgPSBzc19yZWdzICsgQ1BTVzFfQ1BUU19PRkZTRVQ7Ci0JCXByaXYtPmh3X3N0YXRzCSAgICAgPSBzc19yZWdzICsgQ1BTVzFfSFdfU1RBVFM7CisJCWNwc3ctPmhvc3RfcG9ydF9yZWdzID0gc3NfcmVncyArIENQU1cxX0hPU1RfUE9SVF9PRkZTRVQ7CisJCWNwc3ctPmNwdHMtPnJlZyAgICAgID0gc3NfcmVncyArIENQU1cxX0NQVFNfT0ZGU0VUOworCQljcHN3LT5od19zdGF0cwkgICAgID0gc3NfcmVncyArIENQU1cxX0hXX1NUQVRTOwogCQlkbWFfcGFyYW1zLmRtYXJlZ3MgICA9IHNzX3JlZ3MgKyBDUFNXMV9DUERNQV9PRkZTRVQ7CiAJCWRtYV9wYXJhbXMudHhoZHAgICAgID0gc3NfcmVncyArIENQU1cxX1NUQVRFUkFNX09GRlNFVDsKIAkJYWxlX3BhcmFtcy5hbGVfcmVncyAgPSBzc19yZWdzICsgQ1BTVzFfQUxFX09GRlNFVDsKQEAgLTI0MDQsOSArMjY2OSw5IEBACiAJY2FzZSBDUFNXX1ZFUlNJT05fMjoKIAljYXNlIENQU1dfVkVSU0lPTl8zOgogCWNhc2UgQ1BTV19WRVJTSU9OXzQ6Ci0JCXByaXYtPmhvc3RfcG9ydF9yZWdzID0gc3NfcmVncyArIENQU1cyX0hPU1RfUE9SVF9PRkZTRVQ7Ci0JCXByaXYtPmNwdHMtPnJlZyAgICAgID0gc3NfcmVncyArIENQU1cyX0NQVFNfT0ZGU0VUOwotCQlwcml2LT5od19zdGF0cwkgICAgID0gc3NfcmVncyArIENQU1cyX0hXX1NUQVRTOworCQljcHN3LT5ob3N0X3BvcnRfcmVncyA9IHNzX3JlZ3MgKyBDUFNXMl9IT1NUX1BPUlRfT0ZGU0VUOworCQljcHN3LT5jcHRzLT5yZWcgICAgICA9IHNzX3JlZ3MgKyBDUFNXMl9DUFRTX09GRlNFVDsKKwkJY3Bzdy0+aHdfc3RhdHMJICAgICA9IHNzX3JlZ3MgKyBDUFNXMl9IV19TVEFUUzsKIAkJZG1hX3BhcmFtcy5kbWFyZWdzICAgPSBzc19yZWdzICsgQ1BTVzJfQ1BETUFfT0ZGU0VUOwogCQlkbWFfcGFyYW1zLnR4aGRwICAgICA9IHNzX3JlZ3MgKyBDUFNXMl9TVEFURVJBTV9PRkZTRVQ7CiAJCWFsZV9wYXJhbXMuYWxlX3JlZ3MgID0gc3NfcmVncyArIENQU1cyX0FMRV9PRkZTRVQ7CkBAIC0yNDE3LDEzICsyNjgyLDE0IEBACiAJCQkodTMyIF9fZm9yY2UpIHNzX3Jlcy0+c3RhcnQgKyBDUFNXMl9CRF9PRkZTRVQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9lcnIocHJpdi0+ZGV2LCAidW5rbm93biB2ZXJzaW9uIDB4JTA4eFxuIiwgcHJpdi0+dmVyc2lvbik7CisJCWRldl9lcnIocHJpdi0+ZGV2LCAidW5rbm93biB2ZXJzaW9uIDB4JTA4eFxuIiwgY3Bzdy0+dmVyc2lvbik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gY2xlYW5fcnVudGltZV9kaXNhYmxlX3JldDsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspIHsKLQkJc3RydWN0IGNwc3dfc2xhdmUgKnNsYXZlID0gJnByaXYtPnNsYXZlc1tpXTsKLQkJY3Bzd19zbGF2ZV9pbml0KHNsYXZlLCBwcml2LCBzbGF2ZV9vZmZzZXQsIHNsaXZlcl9vZmZzZXQpOworCWZvciAoaSA9IDA7IGkgPCBjcHN3LT5kYXRhLnNsYXZlczsgaSsrKSB7CisJCXN0cnVjdCBjcHN3X3NsYXZlICpzbGF2ZSA9ICZjcHN3LT5zbGF2ZXNbaV07CisKKwkJY3Bzd19zbGF2ZV9pbml0KHNsYXZlLCBjcHN3LCBzbGF2ZV9vZmZzZXQsIHNsaXZlcl9vZmZzZXQpOwogCQlzbGF2ZV9vZmZzZXQgICs9IHNsYXZlX3NpemU7CiAJCXNsaXZlcl9vZmZzZXQgKz0gU0xJVkVSX1NJWkU7CiAJfQpAQCAtMjQ0MywxOSArMjcwOSwxNiBAQAogCWRtYV9wYXJhbXMuaGFzX2V4dF9yZWdzCQk9IHRydWU7CiAJZG1hX3BhcmFtcy5kZXNjX2h3X2FkZHIgICAgICAgICA9IGRtYV9wYXJhbXMuZGVzY19tZW1fcGh5czsKIAotCXByaXYtPmRtYSA9IGNwZG1hX2N0bHJfY3JlYXRlKCZkbWFfcGFyYW1zKTsKLQlpZiAoIXByaXYtPmRtYSkgeworCWNwc3ctPmRtYSA9IGNwZG1hX2N0bHJfY3JlYXRlKCZkbWFfcGFyYW1zKTsKKwlpZiAoIWNwc3ctPmRtYSkgewogCQlkZXZfZXJyKHByaXYtPmRldiwgImVycm9yIGluaXRpYWxpemluZyBkbWFcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGNsZWFuX3J1bnRpbWVfZGlzYWJsZV9yZXQ7CiAJfQogCi0JcHJpdi0+dHhjaCA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgdHhfY2hhbl9udW0oMCksCi0JCQkJICAgICAgIGNwc3dfdHhfaGFuZGxlcik7Ci0JcHJpdi0+cnhjaCA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgcnhfY2hhbl9udW0oMCksCi0JCQkJICAgICAgIGNwc3dfcnhfaGFuZGxlcik7Ci0KLQlpZiAoV0FSTl9PTighcHJpdi0+dHhjaCB8fCAhcHJpdi0+cnhjaCkpIHsKKwljcHN3LT50eGNoWzBdID0gY3BkbWFfY2hhbl9jcmVhdGUoY3Bzdy0+ZG1hLCAwLCBjcHN3X3R4X2hhbmRsZXIsIDApOworCWNwc3ctPnJ4Y2hbMF0gPSBjcGRtYV9jaGFuX2NyZWF0ZShjcHN3LT5kbWEsIDAsIGNwc3dfcnhfaGFuZGxlciwgMSk7CisJaWYgKFdBUk5fT04oIWNwc3ctPnJ4Y2hbMF0gfHwgIWNwc3ctPnR4Y2hbMF0pKSB7CiAJCWRldl9lcnIocHJpdi0+ZGV2LCAiZXJyb3IgaW5pdGlhbGl6aW5nIGRtYSBjaGFubmVsc1xuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gY2xlYW5fZG1hX3JldDsKQEAgLTI0NjYsOCArMjcyOSw4IEBACiAJYWxlX3BhcmFtcy5hbGVfZW50cmllcwkJPSBkYXRhLT5hbGVfZW50cmllczsKIAlhbGVfcGFyYW1zLmFsZV9wb3J0cwkJPSBkYXRhLT5zbGF2ZXM7CiAKLQlwcml2LT5hbGUgPSBjcHN3X2FsZV9jcmVhdGUoJmFsZV9wYXJhbXMpOwotCWlmICghcHJpdi0+YWxlKSB7CisJY3Bzdy0+YWxlID0gY3Bzd19hbGVfY3JlYXRlKCZhbGVfcGFyYW1zKTsKKwlpZiAoIWNwc3ctPmFsZSkgewogCQlkZXZfZXJyKHByaXYtPmRldiwgImVycm9yIGluaXRpYWxpemluZyBhbGUgZW5naW5lXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBjbGVhbl9kbWFfcmV0OwpAQCAtMjQ4NCw3ICsyNzQ3LDcgQEAKIAlpZiAob2ZfaWQpIHsKIAkJcGRldi0+aWRfZW50cnkgPSBvZl9pZC0+ZGF0YTsKIAkJaWYgKHBkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YSkKLQkJCXByaXYtPnF1aXJrX2lycSA9IHRydWU7CisJCQljcHN3LT5xdWlya19pcnEgPSB0cnVlOwogCX0KIAogCS8qIEdyYWIgUlggYW5kIFRYIElSUXMuIE5vdGUgdGhhdCB3ZSBhbHNvIGhhdmUgUlhfVEhSRVNIT0xEIGFuZApAQCAtMjUwMiw5ICsyNzY1LDkgQEAKIAkJZ290byBjbGVhbl9hbGVfcmV0OwogCX0KIAotCXByaXYtPmlycXNfdGFibGVbMF0gPSBpcnE7CisJY3Bzdy0+aXJxc190YWJsZVswXSA9IGlycTsKIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgY3Bzd19yeF9pbnRlcnJ1cHQsCi0JCQkgICAgICAgMCwgZGV2X25hbWUoJnBkZXYtPmRldiksIHByaXYpOworCQkJICAgICAgIDAsIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBjcHN3KTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHByaXYtPmRldiwgImVycm9yIGF0dGFjaGluZyBpcnEgKCVkKVxuIiwgcmV0KTsKIAkJZ290byBjbGVhbl9hbGVfcmV0OwpAQCAtMjUxNywyMSArMjc4MCwyMCBAQAogCQlnb3RvIGNsZWFuX2FsZV9yZXQ7CiAJfQogCi0JcHJpdi0+aXJxc190YWJsZVsxXSA9IGlycTsKKwljcHN3LT5pcnFzX3RhYmxlWzFdID0gaXJxOwogCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBjcHN3X3R4X2ludGVycnVwdCwKLQkJCSAgICAgICAwLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgcHJpdik7CisJCQkgICAgICAgMCwgZGV2X25hbWUoJnBkZXYtPmRldiksIGNwc3cpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIocHJpdi0+ZGV2LCAiZXJyb3IgYXR0YWNoaW5nIGlycSAoJWQpXG4iLCByZXQpOwogCQlnb3RvIGNsZWFuX2FsZV9yZXQ7CiAJfQotCXByaXYtPm51bV9pcnFzID0gMjsKIAogCW5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUjsKIAogCW5kZXYtPm5ldGRldl9vcHMgPSAmY3Bzd19uZXRkZXZfb3BzOwogCW5kZXYtPmV0aHRvb2xfb3BzID0gJmNwc3dfZXRodG9vbF9vcHM7Ci0JbmV0aWZfbmFwaV9hZGQobmRldiwgJnByaXYtPm5hcGlfcngsIGNwc3dfcnhfcG9sbCwgQ1BTV19QT0xMX1dFSUdIVCk7Ci0JbmV0aWZfdHhfbmFwaV9hZGQobmRldiwgJnByaXYtPm5hcGlfdHgsIGNwc3dfdHhfcG9sbCwgQ1BTV19QT0xMX1dFSUdIVCk7CisJbmV0aWZfbmFwaV9hZGQobmRldiwgJmNwc3ctPm5hcGlfcngsIGNwc3dfcnhfcG9sbCwgQ1BTV19QT0xMX1dFSUdIVCk7CisJbmV0aWZfdHhfbmFwaV9hZGQobmRldiwgJmNwc3ctPm5hcGlfdHgsIGNwc3dfdHhfcG9sbCwgQ1BTV19QT0xMX1dFSUdIVCk7CiAKIAkvKiByZWdpc3RlciB0aGUgbmV0d29yayBkZXZpY2UgKi8KIAlTRVRfTkVUREVWX0RFVihuZGV2LCAmcGRldi0+ZGV2KTsKQEAgLTI1NDUsOCArMjgwNyw4IEBACiAJY3Bzd19ub3RpY2UocHJpdiwgcHJvYmUsICJpbml0aWFsaXplZCBkZXZpY2UgKHJlZ3MgJXBhLCBpcnEgJWQpXG4iLAogCQkgICAgJnNzX3Jlcy0+c3RhcnQsIG5kZXYtPmlycSk7CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKLQkJcmV0ID0gY3Bzd19wcm9iZV9kdWFsX2VtYWMocGRldiwgcHJpdik7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKSB7CisJCXJldCA9IGNwc3dfcHJvYmVfZHVhbF9lbWFjKHByaXYpOwogCQlpZiAocmV0KSB7CiAJCQljcHN3X2Vycihwcml2LCBwcm9iZSwgImVycm9yIHByb2JlIHNsYXZlIDIgZW1hYyBpbnRlcmZhY2VcbiIpOwogCQkJZ290byBjbGVhbl9hbGVfcmV0OwpAQCAtMjU1Niw5ICsyODE4LDkgQEAKIAlyZXR1cm4gMDsKIAogY2xlYW5fYWxlX3JldDoKLQljcHN3X2FsZV9kZXN0cm95KHByaXYtPmFsZSk7CisJY3Bzd19hbGVfZGVzdHJveShjcHN3LT5hbGUpOwogY2xlYW5fZG1hX3JldDoKLQljcGRtYV9jdGxyX2Rlc3Ryb3kocHJpdi0+ZG1hKTsKKwljcGRtYV9jdGxyX2Rlc3Ryb3koY3Bzdy0+ZG1hKTsKIGNsZWFuX3J1bnRpbWVfZGlzYWJsZV9yZXQ6CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogY2xlYW5fbmRldl9yZXQ6CkBAIC0yNTY5LDcgKzI4MzEsNyBAQAogc3RhdGljIGludCBjcHN3X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGNwc3dfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbiAqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKQEAgLTI1NzgsMTcgKzI4NDAsMTcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KGNwc3dfZ2V0X3NsYXZlX25kZXYocHJpdiwgMSkpOworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoY3Bzdy0+c2xhdmVzWzFdLm5kZXYpOwogCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogCi0JY3Bzd19hbGVfZGVzdHJveShwcml2LT5hbGUpOwotCWNwZG1hX2N0bHJfZGVzdHJveShwcml2LT5kbWEpOworCWNwc3dfYWxlX2Rlc3Ryb3koY3Bzdy0+YWxlKTsKKwljcGRtYV9jdGxyX2Rlc3Ryb3koY3Bzdy0+ZG1hKTsKIAlvZl9wbGF0Zm9ybV9kZXBvcHVsYXRlKCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykKLQkJZnJlZV9uZXRkZXYoY3Bzd19nZXRfc2xhdmVfbmRldihwcml2LCAxKSk7CisJaWYgKGNwc3ctPmRhdGEuZHVhbF9lbWFjKQorCQlmcmVlX25ldGRldihjcHN3LT5zbGF2ZXNbMV0ubmRldik7CiAJZnJlZV9uZXRkZXYobmRldik7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNTk4LDE0ICsyODYwLDE0IEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlCSpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGNwc3dfcHJpdgkqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbgkqY3BzdyA9IG5kZXZfdG9fY3BzdyhuZGV2KTsKIAotCWlmIChwcml2LT5kYXRhLmR1YWxfZW1hYykgeworCWlmIChjcHN3LT5kYXRhLmR1YWxfZW1hYykgewogCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZGF0YS5zbGF2ZXM7IGkrKykgewotCQkJaWYgKG5ldGlmX3J1bm5pbmcocHJpdi0+c2xhdmVzW2ldLm5kZXYpKQotCQkJCWNwc3dfbmRvX3N0b3AocHJpdi0+c2xhdmVzW2ldLm5kZXYpOworCQlmb3IgKGkgPSAwOyBpIDwgY3Bzdy0+ZGF0YS5zbGF2ZXM7IGkrKykgeworCQkJaWYgKG5ldGlmX3J1bm5pbmcoY3Bzdy0+c2xhdmVzW2ldLm5kZXYpKQorCQkJCWNwc3dfbmRvX3N0b3AoY3Bzdy0+c2xhdmVzW2ldLm5kZXYpOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKG5ldGlmX3J1bm5pbmcobmRldikpCkBAIC0yNjEzLDcgKzI4NzUsNyBAQAogCX0KIAogCS8qIFNlbGVjdCBzbGVlcCBwaW4gc3RhdGUgKi8KLQlwaW5jdHJsX3BtX3NlbGVjdF9zbGVlcF9zdGF0ZSgmcGRldi0+ZGV2KTsKKwlwaW5jdHJsX3BtX3NlbGVjdF9zbGVlcF9zdGF0ZShkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNjIyLDE3ICsyODg0LDE3IEBACiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlCSpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGNwc3dfcHJpdgkqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBjcHN3X2NvbW1vbgkqY3BzdyA9IG5ldGRldl9wcml2KG5kZXYpOwogCiAJLyogU2VsZWN0IGRlZmF1bHQgcGluIHN0YXRlICovCi0JcGluY3RybF9wbV9zZWxlY3RfZGVmYXVsdF9zdGF0ZSgmcGRldi0+ZGV2KTsKKwlwaW5jdHJsX3BtX3NlbGVjdF9kZWZhdWx0X3N0YXRlKGRldik7CiAKLQlpZiAocHJpdi0+ZGF0YS5kdWFsX2VtYWMpIHsKKwlpZiAoY3Bzdy0+ZGF0YS5kdWFsX2VtYWMpIHsKIAkJaW50IGk7CiAKLQkJZm9yIChpID0gMDsgaSA8IHByaXYtPmRhdGEuc2xhdmVzOyBpKyspIHsKLQkJCWlmIChuZXRpZl9ydW5uaW5nKHByaXYtPnNsYXZlc1tpXS5uZGV2KSkKLQkJCQljcHN3X25kb19vcGVuKHByaXYtPnNsYXZlc1tpXS5uZGV2KTsKKwkJZm9yIChpID0gMDsgaSA8IGNwc3ctPmRhdGEuc2xhdmVzOyBpKyspIHsKKwkJCWlmIChuZXRpZl9ydW5uaW5nKGNwc3ctPnNsYXZlc1tpXS5uZGV2KSkKKwkJCQljcHN3X25kb19vcGVuKGNwc3ctPnNsYXZlc1tpXS5uZGV2KTsKIAkJfQogCX0gZWxzZSB7CiAJCWlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5jCmluZGV4IDE5ZTVmMzIuLmMzZjM1ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAl2b2lkIF9faW9tZW0JCSppb21hcDsJCS8qIGlvcmVtYXAgbWFwICovCiAJdm9pZAkJCSpjcHVtYXA7CS8qIGRtYV9hbGxvYyBtYXAgKi8KIAlpbnQJCQlkZXNjX3NpemUsIG1lbV9zaXplOwotCWludAkJCW51bV9kZXNjLCB1c2VkX2Rlc2M7CisJaW50CQkJbnVtX2Rlc2M7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgZ2VuX3Bvb2wJCSpnZW5fcG9vbDsKIH07CkBAIC0xMDQsNiArMTA0LDcgQEAKIAlzdHJ1Y3QgY3BkbWFfZGVzY19wb29sCSpwb29sOwogCXNwaW5sb2NrX3QJCWxvY2s7CiAJc3RydWN0IGNwZG1hX2NoYW4JKmNoYW5uZWxzWzIgKiBDUERNQV9NQVhfQ0hBTk5FTFNdOworCWludCBjaGFuX251bTsKIH07CiAKIHN0cnVjdCBjcGRtYV9jaGFuIHsKQEAgLTEyMyw2ICsxMjQsMTMgQEAKIAlpbnQJaW50X3NldCwgaW50X2NsZWFyLCB0ZDsKIH07CiAKKyNkZWZpbmUgdHhfY2hhbl9udW0oY2hhbikJKGNoYW4pCisjZGVmaW5lIHJ4X2NoYW5fbnVtKGNoYW4pCSgoY2hhbikgKyBDUERNQV9NQVhfQ0hBTk5FTFMpCisjZGVmaW5lIGlzX3J4X2NoYW4oY2hhbikJKChjaGFuKS0+Y2hhbl9udW0gPj0gQ1BETUFfTUFYX0NIQU5ORUxTKQorI2RlZmluZSBpc190eF9jaGFuKGNoYW4pCSghaXNfcnhfY2hhbihjaGFuKSkKKyNkZWZpbmUgX19jaGFuX2xpbmVhcihjaGFuX251bSkJKChjaGFuX251bSkgJiAoQ1BETUFfTUFYX0NIQU5ORUxTIC0gMSkpCisjZGVmaW5lIGNoYW5fbGluZWFyKGNoYW4pCV9fY2hhbl9saW5lYXIoKGNoYW4pLT5jaGFuX251bSkKKwogLyogVGhlIGZvbGxvd2luZyBtYWtlIGFjY2VzcyB0byBjb21tb24gY3BkbWFfY3RsciBwYXJhbXMgbW9yZSByZWFkYWJsZSAqLwogI2RlZmluZSBkbWFyZWdzCQlwYXJhbXMuZG1hcmVncwogI2RlZmluZSBudW1fY2hhbglwYXJhbXMubnVtX2NoYW4KQEAgLTE0OCw3ICsxNTYsMTAgQEAKIAlpZiAoIXBvb2wpCiAJCXJldHVybjsKIAotCVdBUk5fT04ocG9vbC0+dXNlZF9kZXNjKTsKKwlXQVJOKGdlbl9wb29sX3NpemUocG9vbC0+Z2VuX3Bvb2wpICE9IGdlbl9wb29sX2F2YWlsKHBvb2wtPmdlbl9wb29sKSwKKwkgICAgICJjcGRtYV9kZXNjX3Bvb2wgc2l6ZSAlZCAhPSBhdmFpbCAlZCIsCisJICAgICBnZW5fcG9vbF9zaXplKHBvb2wtPmdlbl9wb29sKSwKKwkgICAgIGdlbl9wb29sX2F2YWlsKHBvb2wtPmdlbl9wb29sKSk7CiAJaWYgKHBvb2wtPmNwdW1hcCkKIAkJZG1hX2ZyZWVfY29oZXJlbnQocG9vbC0+ZGV2LCBwb29sLT5tZW1fc2l6ZSwgcG9vbC0+Y3B1bWFwLAogCQkJCSAgcG9vbC0+cGh5cyk7CkBAIC0yMzIsMjEgKzI0MywxNCBAQAogc3RhdGljIHN0cnVjdCBjcGRtYV9kZXNjIF9faW9tZW0gKgogY3BkbWFfZGVzY19hbGxvYyhzdHJ1Y3QgY3BkbWFfZGVzY19wb29sICpwb29sKQogewotCXN0cnVjdCBjcGRtYV9kZXNjIF9faW9tZW0gKmRlc2MgPSBOVUxMOwotCi0JZGVzYyA9IChzdHJ1Y3QgY3BkbWFfZGVzYyBfX2lvbWVtICopZ2VuX3Bvb2xfYWxsb2MocG9vbC0+Z2VuX3Bvb2wsCi0JCQkJCQkJICAgcG9vbC0+ZGVzY19zaXplKTsKLQlpZiAoZGVzYykKLQkJcG9vbC0+dXNlZF9kZXNjKys7Ci0KLQlyZXR1cm4gZGVzYzsKKwlyZXR1cm4gKHN0cnVjdCBjcGRtYV9kZXNjIF9faW9tZW0gKikKKwkJZ2VuX3Bvb2xfYWxsb2MocG9vbC0+Z2VuX3Bvb2wsIHBvb2wtPmRlc2Nfc2l6ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNwZG1hX2Rlc2NfZnJlZShzdHJ1Y3QgY3BkbWFfZGVzY19wb29sICpwb29sLAogCQkJICAgIHN0cnVjdCBjcGRtYV9kZXNjIF9faW9tZW0gKmRlc2MsIGludCBudW1fZGVzYykKIHsKIAlnZW5fcG9vbF9mcmVlKHBvb2wtPmdlbl9wb29sLCAodW5zaWduZWQgbG9uZylkZXNjLCBwb29sLT5kZXNjX3NpemUpOwotCXBvb2wtPnVzZWRfZGVzYy0tOwogfQogCiBzdHJ1Y3QgY3BkbWFfY3RsciAqY3BkbWFfY3Rscl9jcmVhdGUoc3RydWN0IGNwZG1hX3BhcmFtcyAqcGFyYW1zKQpAQCAtMjYwLDYgKzI2NCw3IEBACiAJY3Rsci0+c3RhdGUgPSBDUERNQV9TVEFURV9JRExFOwogCWN0bHItPnBhcmFtcyA9ICpwYXJhbXM7CiAJY3Rsci0+ZGV2ID0gcGFyYW1zLT5kZXY7CisJY3Rsci0+Y2hhbl9udW0gPSAwOwogCXNwaW5fbG9ja19pbml0KCZjdGxyLT5sb2NrKTsKIAogCWN0bHItPnBvb2wgPSBjcGRtYV9kZXNjX3Bvb2xfY3JlYXRlKGN0bHItPmRldiwKQEAgLTMzNiwxMiArMzQxLDE0IEBACiAJfQogCiAJY3Rsci0+c3RhdGUgPSBDUERNQV9TVEFURV9URUFSRE9XTjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdGxyLT5sb2NrLCBmbGFncyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjdGxyLT5jaGFubmVscyk7IGkrKykgewogCQlpZiAoY3Rsci0+Y2hhbm5lbHNbaV0pCiAJCQljcGRtYV9jaGFuX3N0b3AoY3Rsci0+Y2hhbm5lbHNbaV0pOwogCX0KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZjdGxyLT5sb2NrLCBmbGFncyk7CiAJZG1hX3JlZ193cml0ZShjdGxyLCBDUERNQV9SWElOVE1BU0tDTEVBUiwgMHhmZmZmZmZmZik7CiAJZG1hX3JlZ193cml0ZShjdGxyLCBDUERNQV9UWElOVE1BU0tDTEVBUiwgMHhmZmZmZmZmZik7CiAKQEAgLTQwMywxMyArNDEwLDUyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcGRtYV9jdGxyX2VvaSk7CiAKLXN0cnVjdCBjcGRtYV9jaGFuICpjcGRtYV9jaGFuX2NyZWF0ZShzdHJ1Y3QgY3BkbWFfY3RsciAqY3RsciwgaW50IGNoYW5fbnVtLAotCQkJCSAgICAgY3BkbWFfaGFuZGxlcl9mbiBoYW5kbGVyKQordTMyIGNwZG1hX2N0cmxfcnhjaHNfc3RhdGUoc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIpCiB7CisJcmV0dXJuIGRtYV9yZWdfcmVhZChjdGxyLCBDUERNQV9SWElOVFNUQVRNQVNLRUQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3BkbWFfY3RybF9yeGNoc19zdGF0ZSk7CisKK3UzMiBjcGRtYV9jdHJsX3R4Y2hzX3N0YXRlKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyKQoreworCXJldHVybiBkbWFfcmVnX3JlYWQoY3RsciwgQ1BETUFfVFhJTlRTVEFUTUFTS0VEKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNwZG1hX2N0cmxfdHhjaHNfc3RhdGUpOworCisvKioKKyAqIGNwZG1hX2NoYW5fc3BsaXRfcG9vbCAtIFNwbGl0cyBjdHJsIHBvb2wgYmV0d2VlbiBhbGwgY2hhbm5lbHMuCisgKiBIYXMgdG8gYmUgY2FsbGVkIHVuZGVyIGN0bHIgbG9jaworICovCitzdGF0aWMgdm9pZCBjcGRtYV9jaGFuX3NwbGl0X3Bvb2woc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIpCit7CisJc3RydWN0IGNwZG1hX2Rlc2NfcG9vbCAqcG9vbCA9IGN0bHItPnBvb2w7CiAJc3RydWN0IGNwZG1hX2NoYW4gKmNoYW47Ci0JaW50IG9mZnNldCA9IChjaGFuX251bSAlIENQRE1BX01BWF9DSEFOTkVMUykgKiA0OworCWludCBjaF9kZXNjX251bTsKKwlpbnQgaTsKKworCWlmICghY3Rsci0+Y2hhbl9udW0pCisJCXJldHVybjsKKworCS8qIGNhbGN1bGF0ZSBhdmVyYWdlIHNpemUgb2YgcG9vbCBzbGljZSAqLworCWNoX2Rlc2NfbnVtID0gcG9vbC0+bnVtX2Rlc2MgLyBjdGxyLT5jaGFuX251bTsKKworCS8qIHNwbGl0IGN0bHIgcG9vbCAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0bHItPmNoYW5uZWxzKTsgaSsrKSB7CisJCWNoYW4gPSBjdGxyLT5jaGFubmVsc1tpXTsKKwkJaWYgKGNoYW4pCisJCQljaGFuLT5kZXNjX251bSA9IGNoX2Rlc2NfbnVtOworCX0KK30KKworc3RydWN0IGNwZG1hX2NoYW4gKmNwZG1hX2NoYW5fY3JlYXRlKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyLCBpbnQgY2hhbl9udW0sCisJCQkJICAgICBjcGRtYV9oYW5kbGVyX2ZuIGhhbmRsZXIsIGludCByeF90eXBlKQoreworCWludCBvZmZzZXQgPSBjaGFuX251bSAqIDQ7CisJc3RydWN0IGNwZG1hX2NoYW4gKmNoYW47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWNoYW5fbnVtID0gcnhfdHlwZSA/IHJ4X2NoYW5fbnVtKGNoYW5fbnVtKSA6IHR4X2NoYW5fbnVtKGNoYW5fbnVtKTsKKwogCWlmIChfX2NoYW5fbGluZWFyKGNoYW5fbnVtKSA+PSBjdGxyLT5udW1fY2hhbikKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTQ1MSwxNCArNDk3LDI1IEBACiAJc3Bpbl9sb2NrX2luaXQoJmNoYW4tPmxvY2spOwogCiAJY3Rsci0+Y2hhbm5lbHNbY2hhbl9udW1dID0gY2hhbjsKKwljdGxyLT5jaGFuX251bSsrOworCisJY3BkbWFfY2hhbl9zcGxpdF9wb29sKGN0bHIpOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3Rsci0+bG9jaywgZmxhZ3MpOwogCXJldHVybiBjaGFuOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3BkbWFfY2hhbl9jcmVhdGUpOwogCi1pbnQgY3BkbWFfY2hhbl9nZXRfcnhfYnVmX251bShzdHJ1Y3QgY3BkbWFfY3RsciAqY3RscikKK2ludCBjcGRtYV9jaGFuX2dldF9yeF9idWZfbnVtKHN0cnVjdCBjcGRtYV9jaGFuICpjaGFuKQogewotCXJldHVybiBjdGxyLT5wb29sLT5udW1fZGVzYyAvIDI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZGVzY19udW07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+bG9jaywgZmxhZ3MpOworCWRlc2NfbnVtID0gY2hhbi0+ZGVzY19udW07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGRlc2NfbnVtOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3BkbWFfY2hhbl9nZXRfcnhfYnVmX251bSk7CiAKQEAgLTQ3NSw2ICs1MzIsMTAgQEAKIAlpZiAoY2hhbi0+c3RhdGUgIT0gQ1BETUFfU1RBVEVfSURMRSkKIAkJY3BkbWFfY2hhbl9zdG9wKGNoYW4pOwogCWN0bHItPmNoYW5uZWxzW2NoYW4tPmNoYW5fbnVtXSA9IE5VTEw7CisJY3Rsci0+Y2hhbl9udW0tLTsKKworCWNwZG1hX2NoYW5fc3BsaXRfcG9vbChjdGxyKTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0bHItPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuaAppbmRleCA0YjQ2Y2Q2Li5hMDdiMjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5oCkBAIC0xNywxMyArMTcsNiBAQAogCiAjZGVmaW5lIENQRE1BX01BWF9DSEFOTkVMUwlCSVRTX1BFUl9MT05HCiAKLSNkZWZpbmUgdHhfY2hhbl9udW0oY2hhbikJKGNoYW4pCi0jZGVmaW5lIHJ4X2NoYW5fbnVtKGNoYW4pCSgoY2hhbikgKyBDUERNQV9NQVhfQ0hBTk5FTFMpCi0jZGVmaW5lIGlzX3J4X2NoYW4oY2hhbikJKChjaGFuKS0+Y2hhbl9udW0gPj0gQ1BETUFfTUFYX0NIQU5ORUxTKQotI2RlZmluZSBpc190eF9jaGFuKGNoYW4pCSghaXNfcnhfY2hhbihjaGFuKSkKLSNkZWZpbmUgX19jaGFuX2xpbmVhcihjaGFuX251bSkJKChjaGFuX251bSkgJiAoQ1BETUFfTUFYX0NIQU5ORUxTIC0gMSkpCi0jZGVmaW5lIGNoYW5fbGluZWFyKGNoYW4pCV9fY2hhbl9saW5lYXIoKGNoYW4pLT5jaGFuX251bSkKLQogI2RlZmluZSBDUERNQV9SWF9TT1VSQ0VfUE9SVChfX3N0YXR1c19fKQkoKF9fc3RhdHVzX18gPj4gMTYpICYgMHg3KQogCiAjZGVmaW5lIENQRE1BX0VPSV9SWF9USFJFU0gJMHgwCkBAIC03OSw4ICs3Miw4IEBACiBpbnQgY3BkbWFfY3Rscl9zdG9wKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyKTsKIAogc3RydWN0IGNwZG1hX2NoYW4gKmNwZG1hX2NoYW5fY3JlYXRlKHN0cnVjdCBjcGRtYV9jdGxyICpjdGxyLCBpbnQgY2hhbl9udW0sCi0JCQkJICAgICBjcGRtYV9oYW5kbGVyX2ZuIGhhbmRsZXIpOwotaW50IGNwZG1hX2NoYW5fZ2V0X3J4X2J1Zl9udW0oc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIpOworCQkJCSAgICAgY3BkbWFfaGFuZGxlcl9mbiBoYW5kbGVyLCBpbnQgcnhfdHlwZSk7CitpbnQgY3BkbWFfY2hhbl9nZXRfcnhfYnVmX251bShzdHJ1Y3QgY3BkbWFfY2hhbiAqY2hhbik7CiBpbnQgY3BkbWFfY2hhbl9kZXN0cm95KHN0cnVjdCBjcGRtYV9jaGFuICpjaGFuKTsKIGludCBjcGRtYV9jaGFuX3N0YXJ0KHN0cnVjdCBjcGRtYV9jaGFuICpjaGFuKTsKIGludCBjcGRtYV9jaGFuX3N0b3Aoc3RydWN0IGNwZG1hX2NoYW4gKmNoYW4pOwpAQCAtOTQsNiArODcsOCBAQAogaW50IGNwZG1hX2N0bHJfaW50X2N0cmwoc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIsIGJvb2wgZW5hYmxlKTsKIHZvaWQgY3BkbWFfY3Rscl9lb2koc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIsIHUzMiB2YWx1ZSk7CiBpbnQgY3BkbWFfY2hhbl9pbnRfY3RybChzdHJ1Y3QgY3BkbWFfY2hhbiAqY2hhbiwgYm9vbCBlbmFibGUpOwordTMyIGNwZG1hX2N0cmxfcnhjaHNfc3RhdGUoc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIpOwordTMyIGNwZG1hX2N0cmxfdHhjaHNfc3RhdGUoc3RydWN0IGNwZG1hX2N0bHIgKmN0bHIpOwogYm9vbCBjcGRtYV9jaGVja19mcmVlX3R4X2Rlc2Moc3RydWN0IGNwZG1hX2NoYW4gKmNoYW4pOwogCiBlbnVtIGNwZG1hX2NvbnRyb2wgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9lbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYwppbmRleCA3MjdhNzlmLi4yZmQ5NGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYwpAQCAtNTk3LDE0ICs1OTcsMTQgQEAKIH0KIAogLyoqCi0gKiBoYXNoX2FkZCAtIEhhc2ggZnVuY3Rpb24gdG8gYWRkIG1hYyBhZGRyIGZyb20gaGFzaCB0YWJsZQorICogZW1hY19oYXNoX2FkZCAtIEhhc2ggZnVuY3Rpb24gdG8gYWRkIG1hYyBhZGRyIGZyb20gaGFzaCB0YWJsZQogICogQHByaXY6IFRoZSBEYVZpbmNpIEVNQUMgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQogICogQG1hY19hZGRyOiBtYWMgYWRkcmVzcyB0byBkZWxldGUgZnJvbSBoYXNoIHRhYmxlCiAgKgogICogQWRkcyBtYWMgYWRkcmVzcyB0byB0aGUgaW50ZXJuYWwgaGFzaCB0YWJsZQogICoKICAqLwotc3RhdGljIGludCBoYXNoX2FkZChzdHJ1Y3QgZW1hY19wcml2ICpwcml2LCB1OCAqbWFjX2FkZHIpCitzdGF0aWMgaW50IGVtYWNfaGFzaF9hZGQoc3RydWN0IGVtYWNfcHJpdiAqcHJpdiwgdTggKm1hY19hZGRyKQogewogCXN0cnVjdCBkZXZpY2UgKmVtYWNfZGV2ID0gJnByaXYtPm5kZXYtPmRldjsKIAl1MzIgcmMgPSAwOwpAQCAtNjEzLDcgKzYxMyw3IEBACiAKIAlpZiAoaGFzaF92YWx1ZSA+PSBFTUFDX05VTV9NVUxUSUNBU1RfQklUUykgewogCQlpZiAobmV0aWZfbXNnX2Rydihwcml2KSkgewotCQkJZGV2X2VycihlbWFjX2RldiwgIkRhVmluY2kgRU1BQzogaGFzaF9hZGQoKTogSW52YWxpZCAiXAorCQkJZGV2X2VycihlbWFjX2RldiwgIkRhVmluY2kgRU1BQzogZW1hY19oYXNoX2FkZCgpOiBJbnZhbGlkICJcCiAJCQkJIkhhc2ggJTA4eCwgc2hvdWxkIG5vdCBiZSBncmVhdGVyIHRoYW4gJTA4eCIsCiAJCQkJaGFzaF92YWx1ZSwgKEVNQUNfTlVNX01VTFRJQ0FTVF9CSVRTIC0gMSkpOwogCQl9CkBAIC02MzksMTQgKzYzOSwxNCBAQAogfQogCiAvKioKLSAqIGhhc2hfZGVsIC0gSGFzaCBmdW5jdGlvbiB0byBkZWxldGUgbWFjIGFkZHIgZnJvbSBoYXNoIHRhYmxlCisgKiBlbWFjX2hhc2hfZGVsIC0gSGFzaCBmdW5jdGlvbiB0byBkZWxldGUgbWFjIGFkZHIgZnJvbSBoYXNoIHRhYmxlCiAgKiBAcHJpdjogVGhlIERhVmluY2kgRU1BQyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCiAgKiBAbWFjX2FkZHI6IG1hYyBhZGRyZXNzIHRvIGRlbGV0ZSBmcm9tIGhhc2ggdGFibGUKICAqCiAgKiBSZW1vdmVzIG1hYyBhZGRyZXNzIGZyb20gdGhlIGludGVybmFsIGhhc2ggdGFibGUKICAqCiAgKi8KLXN0YXRpYyBpbnQgaGFzaF9kZWwoc3RydWN0IGVtYWNfcHJpdiAqcHJpdiwgdTggKm1hY19hZGRyKQorc3RhdGljIGludCBlbWFjX2hhc2hfZGVsKHN0cnVjdCBlbWFjX3ByaXYgKnByaXYsIHU4ICptYWNfYWRkcikKIHsKIAl1MzIgaGFzaF92YWx1ZTsKIAl1MzIgaGFzaF9iaXQ7CkBAIC02OTYsMTAgKzY5NiwxMCBAQAogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIEVNQUNfTVVMVElDQVNUX0FERDoKLQkJdXBkYXRlID0gaGFzaF9hZGQocHJpdiwgbWFjX2FkZHIpOworCQl1cGRhdGUgPSBlbWFjX2hhc2hfYWRkKHByaXYsIG1hY19hZGRyKTsKIAkJYnJlYWs7CiAJY2FzZSBFTUFDX01VTFRJQ0FTVF9ERUw6Ci0JCXVwZGF0ZSA9IGhhc2hfZGVsKHByaXYsIG1hY19hZGRyKTsKKwkJdXBkYXRlID0gZW1hY19oYXNoX2RlbChwcml2LCBtYWNfYWRkcik7CiAJCWJyZWFrOwogCWNhc2UgRU1BQ19BTExfTVVMVElfU0VUOgogCQl1cGRhdGUgPSAxOwpAQCAtMTg3MCwxMCArMTg3MCwxMCBAQAogCQlnb3RvIG5vX3BkYXRhOwogCX0KIAotCXByaXYtPnR4Y2hhbiA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgdHhfY2hhbl9udW0oRU1BQ19ERUZfVFhfQ0gpLAotCQkJCSAgICAgICBlbWFjX3R4X2hhbmRsZXIpOwotCXByaXYtPnJ4Y2hhbiA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgcnhfY2hhbl9udW0oRU1BQ19ERUZfUlhfQ0gpLAotCQkJCSAgICAgICBlbWFjX3J4X2hhbmRsZXIpOworCXByaXYtPnR4Y2hhbiA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgRU1BQ19ERUZfVFhfQ0gsCisJCQkJCSBlbWFjX3R4X2hhbmRsZXIsIDApOworCXByaXYtPnJ4Y2hhbiA9IGNwZG1hX2NoYW5fY3JlYXRlKHByaXYtPmRtYSwgRU1BQ19ERUZfUlhfQ0gsCisJCQkJCSBlbWFjX3J4X2hhbmRsZXIsIDEpOwogCWlmIChXQVJOX09OKCFwcml2LT50eGNoYW4gfHwgIXByaXYtPnJ4Y2hhbikpIHsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG5vX2NwZG1hX2NoYW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90b3NoaWJhL3BzM19nZWxpY19uZXQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCmluZGV4IDc5ZjBlYzQuLmJjMjU4ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jCkBAIC0xNzkxLDcgKzE3OTEsNyBAQAogCWdlbGljX2NhcmRfZnJlZV9jaGFpbihjYXJkLCBjYXJkLT50eF9jaGFpbi5oZWFkKTsKIGZhaWxfYWxsb2NfdHg6CiAJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKLQluZXRkZXYtPmlycSA9IE5PX0lSUTsKKwluZXRkZXYtPmlycSA9IDA7CiBmYWlsX3JlcXVlc3RfaXJxOgogCXBzM19zYl9ldmVudF9yZWNlaXZlX3BvcnRfZGVzdHJveShkZXYsIGNhcmQtPmlycSk7CiBmYWlsX2FsbG9jX2lycToKQEAgLTE4NDMsNyArMTg0Myw3IEBACiAJbmV0ZGV2MCA9IGNhcmQtPm5ldGRldltHRUxJQ19QT1JUX0VUSEVSTkVUXzBdOwogCS8qIGRpc2Nvbm5lY3QgZXZlbnQgcG9ydCAqLwogCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7Ci0JbmV0ZGV2MC0+aXJxID0gTk9fSVJROworCW5ldGRldjAtPmlycSA9IDA7CiAJcHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KGNhcmQtPmRldiwgY2FyZC0+aXJxKTsKIAogCXdhaXRfZXZlbnQoY2FyZC0+d2FpdHEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXZlbG9jaXR5LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXZlbG9jaXR5LmMKaW5kZXggZjM4Njk2Yy4uOTA4ZTcyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS12ZWxvY2l0eS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3ZpYS92aWEtdmVsb2NpdHkuYwpAQCAtMTcyNCwyNCArMTcyNCwyMSBAQAogCQlzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyAqdGRpbmZvLCBzdHJ1Y3QgdHhfZGVzYyAqdGQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHRkaW5mby0+c2tiOworCWludCBpOwogCiAJLyoKIAkgKglEb24ndCB1bm1hcCB0aGUgcHJlLWFsbG9jYXRlZCB0eF9idWZzCiAJICovCi0JaWYgKHRkaW5mby0+c2tiX2RtYSkgewotCQlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgdGRpbmZvLT5uc2tiX2RtYTsgaSsrKSB7CisJCXNpemVfdCBwa3RsZW4gPSBtYXhfdChzaXplX3QsIHNrYi0+bGVuLCBFVEhfWkxFTik7CiAKLQkJZm9yIChpID0gMDsgaSA8IHRkaW5mby0+bnNrYl9kbWE7IGkrKykgewotCQkJc2l6ZV90IHBrdGxlbiA9IG1heF90KHNpemVfdCwgc2tiLT5sZW4sIEVUSF9aTEVOKTsKKwkJLyogRm9yIHNjYXR0ZXItZ2F0aGVyICovCisJCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID4gMCkKKwkJCXBrdGxlbiA9IG1heF90KHNpemVfdCwgcGt0bGVuLAorCQkJCSAgICAgICB0ZC0+dGRfYnVmW2ldLnNpemUgJiB+VERfUVVFVUUpOwogCi0JCQkvKiBGb3Igc2NhdHRlci1nYXRoZXIgKi8KLQkJCWlmIChza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzID4gMCkKLQkJCQlwa3RsZW4gPSBtYXhfdChzaXplX3QsIHBrdGxlbiwKLQkJCQkJCXRkLT50ZF9idWZbaV0uc2l6ZSAmIH5URF9RVUVVRSk7Ci0KLQkJCWRtYV91bm1hcF9zaW5nbGUodnB0ci0+ZGV2LCB0ZGluZm8tPnNrYl9kbWFbaV0sCi0JCQkJCWxlMTZfdG9fY3B1KHBrdGxlbiksIERNQV9UT19ERVZJQ0UpOwotCQl9CisJCWRtYV91bm1hcF9zaW5nbGUodnB0ci0+ZGV2LCB0ZGluZm8tPnNrYl9kbWFbaV0sCisJCQkJIGxlMTZfdG9fY3B1KHBrdGxlbiksIERNQV9UT19ERVZJQ0UpOwogCX0KIAlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogCXRkaW5mby0+c2tiID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L0tjb25maWcKaW5kZXggNGY1YzAyNC4uNmQ2OGM4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L0tjb25maWcKQEAgLTUsNyArNSw3IEBACiBjb25maWcgTkVUX1ZFTkRPUl9YSUxJTlgKIAlib29sICJYaWxpbnggZGV2aWNlcyIKIAlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIFBQQyB8fCBQUEMzMiB8fCBNSUNST0JMQVpFIHx8IEFSQ0hfWllOUQorCWRlcGVuZHMgb24gUFBDIHx8IFBQQzMyIHx8IE1JQ1JPQkxBWkUgfHwgQVJDSF9aWU5RIHx8IE1JUFMKIAktLS1oZWxwLS0tCiAJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIGJlbG9uZ2luZyB0byB0aGlzIGNsYXNzLCBzYXkgWS4KIApAQCAtMTgsNyArMTgsNyBAQAogCiBjb25maWcgWElMSU5YX0VNQUNMSVRFCiAJdHJpc3RhdGUgIlhpbGlueCAxMC8xMDAgRXRoZXJuZXQgTGl0ZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gKFBQQzMyIHx8IE1JQ1JPQkxBWkUgfHwgQVJDSF9aWU5RKQorCWRlcGVuZHMgb24gUFBDMzIgfHwgTUlDUk9CTEFaRSB8fCBBUkNIX1pZTlEgfHwgTUlQUwogCXNlbGVjdCBQSFlMSUIKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgMTAvMTAwIEV0aGVybmV0IExpdGUgZnJvbSBYaWxpbnguCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2F4aWVuZXRfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9heGllbmV0X21haW4uYwppbmRleCAzNmVlN2FiLi42OWUyYTgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2F4aWVuZXRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfYXhpZW5ldF9tYWluLmMKQEAgLTEyOTcsNyArMTI5Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYXhpZW5ldF9ldGh0b29sX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgYXhpZW5ldF9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8gICAgPSBheGllbmV0X2V0aHRvb2xzX2dldF9kcnZpbmZvLAogCS5nZXRfcmVnc19sZW4gICA9IGF4aWVuZXRfZXRodG9vbHNfZ2V0X3JlZ3NfbGVuLAogCS5nZXRfcmVncyAgICAgICA9IGF4aWVuZXRfZXRodG9vbHNfZ2V0X3JlZ3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2VtYWNsaXRlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2VtYWNsaXRlLmMKaW5kZXggM2NlZTg0YS4uOTNkYzEwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9lbWFjbGl0ZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfZW1hY2xpdGUuYwpAQCAtMTEzMSwxMSArMTEzMSwxMyBAQAogCWxwLT5yeF9waW5nX3BvbmcgPSBnZXRfYm9vbChvZmRldiwgInhsbngscngtcGluZy1wb25nIik7CiAJbWFjX2FkZHJlc3MgPSBvZl9nZXRfbWFjX2FkZHJlc3Mob2ZkZXYtPmRldi5vZl9ub2RlKTsKIAotCWlmIChtYWNfYWRkcmVzcykKKwlpZiAobWFjX2FkZHJlc3MpIHsKIAkJLyogU2V0IHRoZSBNQUMgYWRkcmVzcy4gKi8KIAkJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCBtYWNfYWRkcmVzcywgRVRIX0FMRU4pOwotCWVsc2UKLQkJZGV2X3dhcm4oZGV2LCAiTm8gTUFDIGFkZHJlc3MgZm91bmRcbiIpOworCX0gZWxzZSB7CisJCWRldl93YXJuKGRldiwgIk5vIE1BQyBhZGRyZXNzIGZvdW5kLCB1c2luZyByYW5kb21cbiIpOworCQlldGhfaHdfYWRkcl9yYW5kb20obmRldik7CisJfQogCiAJLyogQ2xlYXIgdGhlIFR4IENTUidzIGluIGNhc2UgdGhpcyBpcyBhIHJlc3RhcnQgKi8KIAlfX3Jhd193cml0ZWwoMCwgbHAtPmJhc2VfYWRkciArIFhFTF9UU1JfT0ZGU0VUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZqZXMvZmplc19tYWluLmMgYi9kcml2ZXJzL25ldC9mamVzL2ZqZXNfbWFpbi5jCmluZGV4IDkwMDY4NzcuLmU0NmIxZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2ZqZXMvZmplc19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZmplcy9mamVzX21haW4uYwpAQCAtOTcsNyArOTcsNiBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZmplc19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSBEUlZfTkFNRSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIAkucHJvYmUgPSBmamVzX3Byb2JlLAogCS5yZW1vdmUgPSBmamVzX3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCmluZGV4IDVhMWU5ODUuLjQ3MGIzZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYwpAQCAtMTI3LDcgKzEyNyw3IEBACiAKICNkZWZpbmUgQVgyNV82UEFDS19IRUFERVJfTEVOIDAKIAotc3RhdGljIHZvaWQgc2l4cGFja19kZWNvZGUoc3RydWN0IHNpeHBhY2sgKiwgdW5zaWduZWQgY2hhcltdLCBpbnQpOworc3RhdGljIHZvaWQgc2l4cGFja19kZWNvZGUoc3RydWN0IHNpeHBhY2sgKiwgY29uc3QgdW5zaWduZWQgY2hhcltdLCBpbnQpOwogc3RhdGljIGludCBlbmNvZGVfc2l4cGFjayh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgaW50LCB1bnNpZ25lZCBjaGFyKTsKIAogLyoKQEAgLTQyOCw3ICs0MjgsNyBAQAogCiAvKgogICogSGFuZGxlIHRoZSAncmVjZWl2ZXIgZGF0YSByZWFkeScgaW50ZXJydXB0LgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlICd0dHlfaW8nIG1vZHVsZSBpbiB0aGUga2VybmVsIHdoZW4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB0dHkgbW9kdWxlIGluIHRoZSBrZXJuZWwgd2hlbgogICogYSBibG9jayBvZiA2cGFjayBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCB3aGljaCBjYW4gbm93IGJlIGRlY2Fwc3VsYXRlZAogICogYW5kIHNlbnQgb24gdG8gc29tZSBJUCBsYXllciBmb3IgZnVydGhlciBwcm9jZXNzaW5nLgogICovCkBAIC00MzYsNyArNDM2LDYgQEAKIAljb25zdCB1bnNpZ25lZCBjaGFyICpjcCwgY2hhciAqZnAsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc2l4cGFjayAqc3A7Ci0JdW5zaWduZWQgY2hhciBidWZbNTEyXTsKIAlpbnQgY291bnQxOwogCiAJaWYgKCFjb3VudCkKQEAgLTQ0NiwxMCArNDQ1LDcgQEAKIAlpZiAoIXNwKQogCQlyZXR1cm47CiAKLQltZW1jcHkoYnVmLCBjcCwgY291bnQgPCBzaXplb2YoYnVmKSA/IGNvdW50IDogc2l6ZW9mKGJ1ZikpOwotCiAJLyogUmVhZCB0aGUgY2hhcmFjdGVycyBvdXQgb2YgdGhlIGJ1ZmZlciAqLwotCiAJY291bnQxID0gY291bnQ7CiAJd2hpbGUgKGNvdW50KSB7CiAJCWNvdW50LS07CkBAIC00NTksNyArNDU1LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJfQotCXNpeHBhY2tfZGVjb2RlKHNwLCBidWYsIGNvdW50MSk7CisJc2l4cGFja19kZWNvZGUoc3AsIGNwLCBjb3VudDEpOwogCiAJc3BfcHV0KHNwKTsKIAl0dHlfdW50aHJvdHRsZSh0dHkpOwpAQCAtOTkyLDcgKzk4OCw3IEBACiAvKiBkZWNvZGUgYSA2cGFjayBwYWNrZXQgKi8KIAogc3RhdGljIHZvaWQKLXNpeHBhY2tfZGVjb2RlKHN0cnVjdCBzaXhwYWNrICpzcCwgdW5zaWduZWQgY2hhciAqcHJlX3JidWZmLCBpbnQgY291bnQpCitzaXhwYWNrX2RlY29kZShzdHJ1Y3Qgc2l4cGFjayAqc3AsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnByZV9yYnVmZiwgaW50IGNvdW50KQogewogCXVuc2lnbmVkIGNoYXIgaW5ieXRlOwogCWludCBjb3VudDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYwppbmRleCBkOTVhNTBhLi42MjJhYjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMKQEAgLTQ4NCw3ICs0ODQsNyBAQAogCWRldi0+ZmxhZ3MgICAgICA9IDA7CiAJZGV2LT5mZWF0dXJlcwk9IE5FVElGX0ZfTExUWDsJLyogQWxsb3cgcmVjdXJzaW9uICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19BWDI1KQogCWRldi0+aGVhZGVyX29wcyAgICAgID0gJmF4MjVfaGVhZGVyX29wczsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeXBlcnYvaHlwZXJ2X25ldC5oIGIvZHJpdmVycy9uZXQvaHlwZXJ2L2h5cGVydl9uZXQuaAppbmRleCA1OTFhZjcxLi5mNGZiY2I1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oeXBlcnYvaHlwZXJ2X25ldC5oCisrKyBiL2RyaXZlcnMvbmV0L2h5cGVydi9oeXBlcnZfbmV0LmgKQEAgLTg0LDggKzg0LDYgQEAKICNkZWZpbmUgTkRJU19SU1NfSEFTSF9TRUNSRVRfS0VZX01BWF9TSVpFX1JFVklTSU9OXzIgICA0MAogCiAjZGVmaW5lIElUQUJfTlVNIDEyOAotI2RlZmluZSBIQVNIX0tFWUxFTiBORElTX1JTU19IQVNIX1NFQ1JFVF9LRVlfTUFYX1NJWkVfUkVWSVNJT05fMgotZXh0ZXJuIHU4IG5ldHZzY19oYXNoX2tleVtdOwogCiBzdHJ1Y3QgbmRpc19yZWN2X3NjYWxlX3BhcmFtIHsgLyogTkRJU19SRUNFSVZFX1NDQUxFX1BBUkFNRVRFUlMgKi8KIAlzdHJ1Y3QgbmRpc19vYmpfaGVhZGVyIGhkcjsKQEAgLTE3NSw3ICsxNzMsNyBAQAogc3RydWN0IHJuZGlzX21lc3NhZ2U7CiBzdHJ1Y3QgbmV0dnNjX2RldmljZTsKIGludCBuZXR2c2NfZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsIHZvaWQgKmFkZGl0aW9uYWxfaW5mbyk7Ci1pbnQgbmV0dnNjX2RldmljZV9yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKTsKK3ZvaWQgbmV0dnNjX2RldmljZV9yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKTsKIGludCBuZXR2c2Nfc2VuZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCiAJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQsCiAJCXN0cnVjdCBybmRpc19tZXNzYWdlICpybmRpc19tc2csCkBAIC00MzUsNyArNDMzLDcgQEAKICAqLwogc3RydWN0IG52c3BfMV9tZXNzYWdlX3NlbmRfcm5kaXNfcGFja2V0IHsKIAkvKgotCSAqIFRoaXMgZmllbGQgaXMgc3BlY2lmaWVkIGJ5IFJOSURTLiBUaGV5IGFzc3VtZSB0aGVyZSdzIHR3byBkaWZmZXJlbnQKKwkgKiBUaGlzIGZpZWxkIGlzIHNwZWNpZmllZCBieSBSTkRJUy4gVGhleSBhc3N1bWUgdGhlcmUncyB0d28gZGlmZmVyZW50CiAJICogY2hhbm5lbHMgb2YgY29tbXVuaWNhdGlvbi4gSG93ZXZlciwgdGhlIE5ldHdvcmsgVlNQIG9ubHkgaGFzIG9uZS4KIAkgKiBUaGVyZWZvcmUsIHRoZSBjaGFubmVsIHRyYXZlbHMgd2l0aCB0aGUgUk5ESVMgcGFja2V0LgogCSAqLwpAQCAtNDkwLDYgKzQ4OCw3IEBACiAJCQl1NjQgc3Jpb3Y6MTsKIAkJCXU2NCBpZWVlODAyMXE6MTsKIAkJCXU2NCBjb3JyZWxhdGlvbl9pZDoxOworCQkJdTY0IHRlYW1pbmc6MTsKIAkJfTsKIAl9OwogfSBfX3BhY2tlZDsKQEAgLTU3OSw3ICs1NzgsNyBAQAogCS8qIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2VuZCBpbmRpcmVjdGlvbiB0YWJsZSAqLwogCXUzMiBjb3VudDsKIAotCS8qIFRoZSBvZmZzZXQgb2YgdGhlIHNlbmQgaW5kaXJlY2l0b24gdGFibGUgZnJvbSB0b3Agb2YgdGhpcyBzdHJ1Y3QuCisJLyogVGhlIG9mZnNldCBvZiB0aGUgc2VuZCBpbmRpcmVjdGlvbiB0YWJsZSBmcm9tIHRvcCBvZiB0aGlzIHN0cnVjdC4KIAkgKiBUaGUgc2VuZCBpbmRpcmVjdGlvbiB0YWJsZSB0ZWxscyB3aGljaCBjaGFubmVsIHRvIHB1dCB0aGUgc2VuZAogCSAqIHRyYWZmaWMgb24uIEVhY2ggZW50cnkgaXMgYSBjaGFubmVsIG51bWJlci4KIAkgKi8KQEAgLTYzMywxMiArNjMyLDM2IEBACiAJdTMyIGNvdW50OyAvKiBjb3VudGVyIG9mIGJhdGNoZWQgcGFja2V0cyAqLwogfTsKIAorc3RydWN0IHJlY3ZfY29tcF9kYXRhIHsKKwl1NjQgdGlkOyAvKiB0cmFuc2FjdGlvbiBpZCAqLworCXUzMiBzdGF0dXM7Cit9OworCisvKiBOZXR2c2MgUmVjZWl2ZSBTbG90cyBNYXggKi8KKyNkZWZpbmUgTkVUVlNDX1JFQ1ZTTE9UX01BWCAoTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX1NJWkUgLyBFVEhfREFUQV9MRU4gKyAxKQorCitzdHJ1Y3QgbXVsdGlfcmVjdl9jb21wIHsKKwl2b2lkICpidWY7IC8qIHF1ZXVlZCByZWNlaXZlIGNvbXBsZXRpb25zICovCisJdTMyIGZpcnN0OyAvKiBmaXJzdCBkYXRhIGVudHJ5ICovCisJdTMyIG5leHQ7IC8qIG5leHQgZW50cnkgZm9yIHdyaXRpbmcgKi8KK307CisKIHN0cnVjdCBuZXR2c2Nfc3RhdHMgewogCXU2NCBwYWNrZXRzOwogCXU2NCBieXRlczsKKwl1NjQgYnJvYWRjYXN0OworCXU2NCBtdWx0aWNhc3Q7CiAJc3RydWN0IHU2NF9zdGF0c19zeW5jIHN5bmNwOwogfTsKIAorc3RydWN0IG5ldHZzY19ldGh0b29sX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIHR4X3NjYXR0ZXJlZDsKKwl1bnNpZ25lZCBsb25nIHR4X25vX21lbW9yeTsKKwl1bnNpZ25lZCBsb25nIHR4X25vX3NwYWNlOworCXVuc2lnbmVkIGxvbmcgdHhfdG9vX2JpZzsKKwl1bnNpZ25lZCBsb25nIHR4X2J1c3k7Cit9OworCiBzdHJ1Y3QgbmV0dnNjX3JlY29uZmlnIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJdTMyIGV2ZW50OwpAQCAtNjY4LDE0ICs2OTEsMTQgQEAKIAkvKiBFdGh0b29sIHNldHRpbmdzICovCiAJdTggZHVwbGV4OwogCXUzMiBzcGVlZDsKKwlzdHJ1Y3QgbmV0dnNjX2V0aHRvb2xfc3RhdHMgZXRoX3N0YXRzOwogCiAJLyogdGhlIGRldmljZSBpcyBnb2luZyBhd2F5ICovCiAJYm9vbCBzdGFydF9yZW1vdmU7CiAKIAkvKiBTdGF0ZSB0byBtYW5hZ2UgdGhlIGFzc29jaWF0ZWQgVkYgaW50ZXJmYWNlLiAqLwotCXN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXY7Ci0JYm9vbCB2Zl9pbmplY3Q7Ci0JYXRvbWljX3QgdmZfdXNlX2NudDsKKwlzdHJ1Y3QgbmV0X2RldmljZSBfX3JjdSAqdmZfbmV0ZGV2OworCiAJLyogMTogYWxsb2NhdGVkLCBzZXJpYWwgbnVtYmVyIGlzIHZhbGlkLiAwOiBub3QgYWxsb2NhdGVkICovCiAJdTMyIHZmX2FsbG9jOwogCS8qIFNlcmlhbCBudW1iZXIgb2YgdGhlIFZGIHRvIHRlYW0gd2l0aCAqLwpAQCAtNzExLDcgKzczNCw2IEBACiAJc3RydWN0IG52c3BfbWVzc2FnZSBjaGFubmVsX2luaXRfcGt0OwogCiAJc3RydWN0IG52c3BfbWVzc2FnZSByZXZva2VfcGFja2V0OwotCS8qIHVuc2lnbmVkIGNoYXIgSHdNYWNBZGRyW0hXX01BQ0FERFJfTEVOXTsgKi8KIAogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaG5fdGFibGVbVlJTU19DSEFOTkVMX01BWF07CiAJdTMyIHNlbmRfdGFibGVbVlJTU19TRU5EX1RBQl9TSVpFXTsKQEAgLTczNSw2ICs3NTcsOSBAQAogCXUzMiBtYXhfcGt0OyAvKiBtYXggbnVtYmVyIG9mIHBrdCBpbiBvbmUgc2VuZCwgZS5nLiA4ICovCiAJdTMyIHBrdF9hbGlnbjsgLyogYWxpZ25tZW50IGJ5dGVzLCBlLmcuIDggKi8KIAorCXN0cnVjdCBtdWx0aV9yZWN2X2NvbXAgbXJjW1ZSU1NfQ0hBTk5FTF9NQVhdOworCWF0b21pY190IG51bV9vdXRzdGFuZGluZ19yZWN2czsKKwogCWF0b21pY190IG9wZW5fY250OwogfTsKIApAQCAtMTIxMyw3ICsxMjM4LDcgQEAKIAl1MzIgbmRpc19tc2dfdHlwZTsKIAogCS8qIFRvdGFsIGxlbmd0aCBvZiB0aGlzIG1lc3NhZ2UsIGZyb20gdGhlIGJlZ2lubmluZyAqLwotCS8qIG9mIHRoZSBzcnVjdCBybmRpc19tZXNzYWdlLCBpbiBieXRlcy4gKi8KKwkvKiBvZiB0aGUgc3RydWN0IHJuZGlzX21lc3NhZ2UsIGluIGJ5dGVzLiAqLwogCXUzMiBtc2dfbGVuOwogCiAJLyogQWN0dWFsIG1lc3NhZ2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2MuYyBiL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2MuYwppbmRleCA0MTBmYjhlOC4uNzIwYjVmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzYy5jCisrKyBiL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2MuYwpAQCAtNTksNyArNTksNiBAQAogCQkJICAgICAgIFZNX1BLVF9EQVRBX0lOQkFORCwgMCk7CiB9CiAKLQogc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICphbGxvY19uZXRfZGV2aWNlKHZvaWQpCiB7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CkBAIC03NCwxNyArNzMsMjYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCisJbmV0X2RldmljZS0+bXJjWzBdLmJ1ZiA9IHZ6YWxsb2MoTkVUVlNDX1JFQ1ZTTE9UX01BWCAqCisJCQkJCSBzaXplb2Yoc3RydWN0IHJlY3ZfY29tcF9kYXRhKSk7CisKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZuZXRfZGV2aWNlLT53YWl0X2RyYWluKTsKIAluZXRfZGV2aWNlLT5kZXN0cm95ID0gZmFsc2U7CiAJYXRvbWljX3NldCgmbmV0X2RldmljZS0+b3Blbl9jbnQsIDApOwogCW5ldF9kZXZpY2UtPm1heF9wa3QgPSBSTkRJU19NQVhfUEtUX0RFRkFVTFQ7CiAJbmV0X2RldmljZS0+cGt0X2FsaWduID0gUk5ESVNfUEtUX0FMSUdOX0RFRkFVTFQ7CisJaW5pdF9jb21wbGV0aW9uKCZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfd2FpdCk7CiAKIAlyZXR1cm4gbmV0X2RldmljZTsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9uZXR2c2NfZGV2aWNlKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpudmRldikKIHsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBWUlNTX0NIQU5ORUxfTUFYOyBpKyspCisJCXZmcmVlKG52ZGV2LT5tcmNbaV0uYnVmKTsKKwogCWtmcmVlKG52ZGV2LT5jYl9idWZmZXIpOwogCWtmcmVlKG52ZGV2KTsKIH0KQEAgLTEwNywyMCArMTE1LDIwIEBACiAJCWdvdG8gZ2V0X2luX2VycjsKIAogCWlmIChuZXRfZGV2aWNlLT5kZXN0cm95ICYmCi0JCWF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpID09IDApCisJICAgIGF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpID09IDAgJiYKKwkgICAgYXRvbWljX3JlYWQoJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19yZWN2cykgPT0gMCkKIAkJbmV0X2RldmljZSA9IE5VTEw7CiAKIGdldF9pbl9lcnI6CiAJcmV0dXJuIG5ldF9kZXZpY2U7CiB9CiAKLQotc3RhdGljIGludCBuZXR2c2NfZGVzdHJveV9idWYoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQorc3RhdGljIHZvaWQgbmV0dnNjX2Rlc3Ryb3lfYnVmKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpyZXZva2VfcGFja2V0OwotCWludCByZXQgPSAwOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSA9IG5ldF9kZXZpY2VfdG9fbmV0dnNjX2RldmljZShuZGV2KTsKKwlpbnQgcmV0OwogCiAJLyoKIAkgKiBJZiB3ZSBnb3QgYSBzZWN0aW9uIGNvdW50LCBpdCBtZWFucyB3ZSByZWNlaXZlZCBhCkBAIC0xNTAsNyArMTU4LDcgQEAKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQluZXRkZXZfZXJyKG5kZXYsICJ1bmFibGUgdG8gc2VuZCAiCiAJCQkJInJldm9rZSByZWNlaXZlIGJ1ZmZlciB0byBuZXR2c3BcbiIpOwotCQkJcmV0dXJuIHJldDsKKwkJCXJldHVybjsKIAkJfQogCX0KIApAQCAtMTY1LDcgKzE3Myw3IEBACiAJCWlmIChyZXQgIT0gMCkgewogCQkJbmV0ZGV2X2VycihuZGV2LAogCQkJCSAgICJ1bmFibGUgdG8gdGVhcmRvd24gcmVjZWl2ZSBidWZmZXIncyBncGFkbFxuIik7Ci0JCQlyZXR1cm4gcmV0OworCQkJcmV0dXJuOwogCQl9CiAJCW5ldF9kZXZpY2UtPnJlY3ZfYnVmX2dwYWRsX2hhbmRsZSA9IDA7CiAJfQpAQCAtMjA5LDcgKzIxNyw3IEBACiAJCWlmIChyZXQgIT0gMCkgewogCQkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIHNlbmQgIgogCQkJCSAgICJyZXZva2Ugc2VuZCBidWZmZXIgdG8gbmV0dnNwXG4iKTsKLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm47CiAJCX0KIAl9CiAJLyogVGVhcmRvd24gdGhlIGdwYWRsIG9uIHRoZSB2c3AgZW5kICovCkBAIC0yMjMsNyArMjMxLDcgQEAKIAkJaWYgKHJldCAhPSAwKSB7CiAJCQluZXRkZXZfZXJyKG5kZXYsCiAJCQkJICAgInVuYWJsZSB0byB0ZWFyZG93biBzZW5kIGJ1ZmZlcidzIGdwYWRsXG4iKTsKLQkJCXJldHVybiByZXQ7CisJCQlyZXR1cm47CiAJCX0KIAkJbmV0X2RldmljZS0+c2VuZF9idWZfZ3BhZGxfaGFuZGxlID0gMDsKIAl9CkBAIC0yMzMsOCArMjQxLDYgQEAKIAkJbmV0X2RldmljZS0+c2VuZF9idWYgPSBOVUxMOwogCX0KIAlrZnJlZShuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fbWFwKTsKLQotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbmV0dnNjX2luaXRfYnVmKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKQEAgLTI3Niw3ICsyODIsNiBAQAogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0KIAkvKiBOb3RpZnkgdGhlIE5ldFZzcCBvZiB0aGUgZ3BhZGwgaGFuZGxlICovCiAJaW5pdF9wYWNrZXQgPSAmbmV0X2RldmljZS0+Y2hhbm5lbF9pbml0X3BrdDsKIApAQCAtNDAzLDcgKzQwOCw3IEBACiAJLyogU2VjdGlvbiBjb3VudCBpcyBzaW1wbHkgdGhlIHNpemUgZGl2aWRlZCBieSB0aGUgc2VjdGlvbiBzaXplLgogCSAqLwogCW5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9jbnQgPQotCQluZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplL25ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9zaXplOworCQluZXRfZGV2aWNlLT5zZW5kX2J1Zl9zaXplIC8gbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX3NpemU7CiAKIAlkZXZfaW5mbygmZGV2aWNlLT5kZXZpY2UsICJTZW5kIHNlY3Rpb24gc2l6ZTogJWQsIFNlY3Rpb24gY291bnQ6JWRcbiIsCiAJCSBuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fc2l6ZSwgbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX2NudCk7CkBAIC00MTIsOCArNDE3LDggQEAKIAluZXRfZGV2aWNlLT5tYXBfd29yZHMgPSBESVZfUk9VTkRfVVAobmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX2NudCwKIAkJCQkJICAgICBCSVRTX1BFUl9MT05HKTsKIAotCW5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9tYXAgPQotCQlremFsbG9jKG5ldF9kZXZpY2UtPm1hcF93b3JkcyAqIHNpemVvZih1bG9uZyksIEdGUF9LRVJORUwpOworCW5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9tYXAgPSBrY2FsbG9jKG5ldF9kZXZpY2UtPm1hcF93b3JkcywKKwkJCQkJICAgICAgIHNpemVvZih1bG9uZyksIEdGUF9LRVJORUwpOwogCWlmIChuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fbWFwID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBjbGVhbnVwOwpAQCAtNDI4LDcgKzQzMyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCiAvKiBOZWdvdGlhdGUgTlZTUCBwcm90b2NvbCB2ZXJzaW9uICovCiBzdGF0aWMgaW50IG5lZ290aWF0ZV9udnNwX3ZlcihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCiAJCQkgICAgICBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKQEAgLTQ2OCw5ICs0NzIsMTMgQEAKIAlpbml0X3BhY2tldC0+bXNnLnYyX21zZy5zZW5kX25kaXNfY29uZmlnLm10dSA9IG5kZXYtPm10dSArIEVUSF9ITEVOOwogCWluaXRfcGFja2V0LT5tc2cudjJfbXNnLnNlbmRfbmRpc19jb25maWcuY2FwYWJpbGl0eS5pZWVlODAyMXEgPSAxOwogCi0JaWYgKG52c3BfdmVyID49IE5WU1BfUFJPVE9DT0xfVkVSU0lPTl81KQorCWlmIChudnNwX3ZlciA+PSBOVlNQX1BST1RPQ09MX1ZFUlNJT05fNSkgewogCQlpbml0X3BhY2tldC0+bXNnLnYyX21zZy5zZW5kX25kaXNfY29uZmlnLmNhcGFiaWxpdHkuc3Jpb3YgPSAxOwogCisJCS8qIFRlYW1pbmcgYml0IGlzIG5lZWRlZCB0byByZWNlaXZlIGxpbmsgc3BlZWQgdXBkYXRlcyAqLworCQlpbml0X3BhY2tldC0+bXNnLnYyX21zZy5zZW5kX25kaXNfY29uZmlnLmNhcGFiaWxpdHkudGVhbWluZyA9IDE7CisJfQorCiAJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIGluaXRfcGFja2V0LAogCQkJCXNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKIAkJCQkodW5zaWduZWQgbG9uZylpbml0X3BhY2tldCwKQEAgLTQ4NSw5ICs0OTMsMTAgQEAKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICppbml0X3BhY2tldDsKIAlpbnQgbmRpc192ZXJzaW9uOwotCXUzMiB2ZXJfbGlzdFtdID0geyBOVlNQX1BST1RPQ09MX1ZFUlNJT05fMSwgTlZTUF9QUk9UT0NPTF9WRVJTSU9OXzIsCisJY29uc3QgdTMyIHZlcl9saXN0W10gPSB7CisJCU5WU1BfUFJPVE9DT0xfVkVSU0lPTl8xLCBOVlNQX1BST1RPQ09MX1ZFUlNJT05fMiwKIAkJTlZTUF9QUk9UT0NPTF9WRVJTSU9OXzQsIE5WU1BfUFJPVE9DT0xfVkVSU0lPTl81IH07Ci0JaW50IGksIG51bV92ZXIgPSA0OyAvKiBudW1iZXIgb2YgZGlmZmVyZW50IE5WU1AgdmVyc2lvbnMgKi8KKwlpbnQgaTsKIAogCW5ldF9kZXZpY2UgPSBnZXRfb3V0Ym91bmRfbmV0X2RldmljZShkZXZpY2UpOwogCWlmICghbmV0X2RldmljZSkKQEAgLTQ5Niw3ICs1MDUsNyBAQAogCWluaXRfcGFja2V0ID0gJm5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF9wa3Q7CiAKIAkvKiBOZWdvdGlhdGUgdGhlIGxhdGVzdCBOVlNQIHByb3RvY29sIHN1cHBvcnRlZCAqLwotCWZvciAoaSA9IG51bV92ZXIgLSAxOyBpID49IDA7IGktLSkKKwlmb3IgKGkgPSBBUlJBWV9TSVpFKHZlcl9saXN0KSAtIDE7IGkgPj0gMDsgaS0tKQogCQlpZiAobmVnb3RpYXRlX252c3BfdmVyKGRldmljZSwgbmV0X2RldmljZSwgaW5pdF9wYWNrZXQsCiAJCQkJICAgICAgIHZlcl9saXN0W2ldKSAgPT0gMCkgewogCQkJbmV0X2RldmljZS0+bnZzcF92ZXJzaW9uID0gdmVyX2xpc3RbaV07CkBAIC01NTUsNyArNTY0LDcgQEAKIC8qCiAgKiBuZXR2c2NfZGV2aWNlX3JlbW92ZSAtIENhbGxiYWNrIHdoZW4gdGhlIHJvb3QgYnVzIGRldmljZSBpcyByZW1vdmVkCiAgKi8KLWludCBuZXR2c2NfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCit2b2lkIG5ldHZzY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGh2X2dldF9kcnZkYXRhKGRldmljZSk7CiAJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZGV2KTsKQEAgLTU3NywxMCArNTg2LDggQEAKIAkvKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMgKi8KIAl2ZnJlZShuZXRfZGV2aWNlLT5zdWJfY2JfYnVmKTsKIAlmcmVlX25ldHZzY19kZXZpY2UobmV0X2RldmljZSk7Ci0JcmV0dXJuIDA7CiB9CiAKLQogI2RlZmluZSBSSU5HX0FWQUlMX1BFUkNFTlRfSElXQVRFUiAyMAogI2RlZmluZSBSSU5HX0FWQUlMX1BFUkNFTlRfTE9XQVRFUiAxMAogCkBAIC02MDQsNzIgKzYxMSw3OSBAQAogCXN5bmNfY2hhbmdlX2JpdChpbmRleCwgbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX21hcCk7CiB9CiAKK3N0YXRpYyB2b2lkIG5ldHZzY19zZW5kX3R4X2NvbXBsZXRlKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqaW5jb21pbmdfY2hhbm5lbCwKKwkJCQkgICAgc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJCSAgICBzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvciAqcGFja2V0KQoreworCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikodW5zaWduZWQgbG9uZylwYWNrZXQtPnRyYW5zX2lkOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eCA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gZGV2aWNlLT5jaGFubmVsOworCWludCBudW1fb3V0c3RhbmRpbmdfc2VuZHM7CisJdTE2IHFfaWR4ID0gMDsKKwlpbnQgcXVldWVfc2VuZHM7CisKKwkvKiBOb3RpZnkgdGhlIGxheWVyIGFib3ZlIHVzICovCisJaWYgKGxpa2VseShza2IpKSB7CisJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpudnNjX3BhY2tldAorCQkJPSAoc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKilza2ItPmNiOworCQl1MzIgc2VuZF9pbmRleCA9IG52c2NfcGFja2V0LT5zZW5kX2J1Zl9pbmRleDsKKworCQlpZiAoc2VuZF9pbmRleCAhPSBORVRWU0NfSU5WQUxJRF9JTkRFWCkKKwkJCW5ldHZzY19mcmVlX3NlbmRfc2xvdChuZXRfZGV2aWNlLCBzZW5kX2luZGV4KTsKKwkJcV9pZHggPSBudnNjX3BhY2tldC0+cV9pZHg7CisJCWNoYW5uZWwgPSBpbmNvbWluZ19jaGFubmVsOworCisJCWRldl9jb25zdW1lX3NrYl9hbnkoc2tiKTsKKwl9CisKKwludW1fb3V0c3RhbmRpbmdfc2VuZHMgPQorCQlhdG9taWNfZGVjX3JldHVybigmbmV0X2RldmljZS0+bnVtX291dHN0YW5kaW5nX3NlbmRzKTsKKwlxdWV1ZV9zZW5kcyA9IGF0b21pY19kZWNfcmV0dXJuKCZuZXRfZGV2aWNlLT5xdWV1ZV9zZW5kc1txX2lkeF0pOworCisJaWYgKG5ldF9kZXZpY2UtPmRlc3Ryb3kgJiYgbnVtX291dHN0YW5kaW5nX3NlbmRzID09IDApCisJCXdha2VfdXAoJm5ldF9kZXZpY2UtPndhaXRfZHJhaW4pOworCisJaWYgKG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQobmV0ZGV2X2dldF90eF9xdWV1ZShuZGV2LCBxX2lkeCkpICYmCisJICAgICFuZXRfZGV2aWNlX2N0eC0+c3RhcnRfcmVtb3ZlICYmCisJICAgIChodl9yaW5nYnVmX2F2YWlsX3BlcmNlbnQoJmNoYW5uZWwtPm91dGJvdW5kKSA+IFJJTkdfQVZBSUxfUEVSQ0VOVF9ISVdBVEVSIHx8CisJICAgICBxdWV1ZV9zZW5kcyA8IDEpKQorCQluZXRpZl90eF93YWtlX3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUobmRldiwgcV9pZHgpKTsKK30KKwogc3RhdGljIHZvaWQgbmV0dnNjX3NlbmRfY29tcGxldGlvbihzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKIAkJCQkgICBzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqaW5jb21pbmdfY2hhbm5lbCwKIAkJCQkgICBzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCiAJCQkJICAgc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKnBhY2tldCkKIHsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudnNwX3BhY2tldDsKLQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbnZzY19wYWNrZXQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwotCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0JdTMyIHNlbmRfaW5kZXg7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCW52c3BfcGFja2V0ID0gKHN0cnVjdCBudnNwX21lc3NhZ2UgKikoKHVuc2lnbmVkIGxvbmcpcGFja2V0ICsKLQkJCShwYWNrZXQtPm9mZnNldDggPDwgMykpOworCQkJCQkgICAgICAocGFja2V0LT5vZmZzZXQ4IDw8IDMpKTsKIAotCWlmICgobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PSBOVlNQX01TR19UWVBFX0lOSVRfQ09NUExFVEUpIHx8Ci0JICAgIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlID09Ci0JICAgICBOVlNQX01TRzFfVFlQRV9TRU5EX1JFQ1ZfQlVGX0NPTVBMRVRFKSB8fAotCSAgICAobnZzcF9wYWNrZXQtPmhkci5tc2dfdHlwZSA9PQotCSAgICAgTlZTUF9NU0cxX1RZUEVfU0VORF9TRU5EX0JVRl9DT01QTEVURSkgfHwKLQkgICAgKG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUgPT0KLQkgICAgIE5WU1BfTVNHNV9UWVBFX1NVQkNIQU5ORUwpKSB7CisJc3dpdGNoIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKSB7CisJY2FzZSBOVlNQX01TR19UWVBFX0lOSVRfQ09NUExFVEU6CisJY2FzZSBOVlNQX01TRzFfVFlQRV9TRU5EX1JFQ1ZfQlVGX0NPTVBMRVRFOgorCWNhc2UgTlZTUF9NU0cxX1RZUEVfU0VORF9TRU5EX0JVRl9DT01QTEVURToKKwljYXNlIE5WU1BfTVNHNV9UWVBFX1NVQkNIQU5ORUw6CiAJCS8qIENvcHkgdGhlIHJlc3BvbnNlIGJhY2sgKi8KIAkJbWVtY3B5KCZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0LCBudnNwX3BhY2tldCwKIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSk7CiAJCWNvbXBsZXRlKCZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfd2FpdCk7Ci0JfSBlbHNlIGlmIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlID09Ci0JCSAgIE5WU1BfTVNHMV9UWVBFX1NFTkRfUk5ESVNfUEtUX0NPTVBMRVRFKSB7Ci0JCWludCBudW1fb3V0c3RhbmRpbmdfc2VuZHM7Ci0JCXUxNiBxX2lkeCA9IDA7Ci0JCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsID0gZGV2aWNlLT5jaGFubmVsOwotCQlpbnQgcXVldWVfc2VuZHM7CisJCWJyZWFrOwogCi0JCS8qIEdldCB0aGUgc2VuZCBjb250ZXh0ICovCi0JCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSh1bnNpZ25lZCBsb25nKXBhY2tldC0+dHJhbnNfaWQ7CisJY2FzZSBOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVF9DT01QTEVURToKKwkJbmV0dnNjX3NlbmRfdHhfY29tcGxldGUobmV0X2RldmljZSwgaW5jb21pbmdfY2hhbm5lbCwKKwkJCQkJZGV2aWNlLCBwYWNrZXQpOworCQlicmVhazsKIAotCQkvKiBOb3RpZnkgdGhlIGxheWVyIGFib3ZlIHVzICovCi0JCWlmIChza2IpIHsKLQkJCW52c2NfcGFja2V0ID0gKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICopIHNrYi0+Y2I7Ci0JCQlzZW5kX2luZGV4ID0gbnZzY19wYWNrZXQtPnNlbmRfYnVmX2luZGV4OwotCQkJaWYgKHNlbmRfaW5kZXggIT0gTkVUVlNDX0lOVkFMSURfSU5ERVgpCi0JCQkJbmV0dnNjX2ZyZWVfc2VuZF9zbG90KG5ldF9kZXZpY2UsIHNlbmRfaW5kZXgpOwotCQkJcV9pZHggPSBudnNjX3BhY2tldC0+cV9pZHg7Ci0JCQljaGFubmVsID0gaW5jb21pbmdfY2hhbm5lbDsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCX0KLQotCQludW1fb3V0c3RhbmRpbmdfc2VuZHMgPQotCQkJYXRvbWljX2RlY19yZXR1cm4oJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcyk7Ci0JCXF1ZXVlX3NlbmRzID0gYXRvbWljX2RlY19yZXR1cm4oJm5ldF9kZXZpY2UtPgotCQkJCQkJcXVldWVfc2VuZHNbcV9pZHhdKTsKLQotCQlpZiAobmV0X2RldmljZS0+ZGVzdHJveSAmJiBudW1fb3V0c3RhbmRpbmdfc2VuZHMgPT0gMCkKLQkJCXdha2VfdXAoJm5ldF9kZXZpY2UtPndhaXRfZHJhaW4pOwotCi0JCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKG5ldGRldl9nZXRfdHhfcXVldWUobmRldiwgcV9pZHgpKSAmJgotCQkgICAgIW5ldF9kZXZpY2VfY3R4LT5zdGFydF9yZW1vdmUgJiYKLQkJICAgIChodl9yaW5nYnVmX2F2YWlsX3BlcmNlbnQoJmNoYW5uZWwtPm91dGJvdW5kKSA+Ci0JCSAgICAgUklOR19BVkFJTF9QRVJDRU5UX0hJV0FURVIgfHwgcXVldWVfc2VuZHMgPCAxKSkKLQkJCQluZXRpZl90eF93YWtlX3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUoCi0JCQkJCQkgICAgbmRldiwgcV9pZHgpKTsKLQl9IGVsc2UgewotCQluZXRkZXZfZXJyKG5kZXYsICJVbmtub3duIHNlbmQgY29tcGxldGlvbiBwYWNrZXQgdHlwZS0gIgotCQkJICAgIiVkIHJlY2VpdmVkISFcbiIsIG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUpOworCWRlZmF1bHQ6CisJCW5ldGRldl9lcnIobmRldiwKKwkJCSAgICJVbmtub3duIHNlbmQgY29tcGxldGlvbiB0eXBlICVkIHJlY2VpdmVkISFcbiIsCisJCQkgICBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKIAl9Ci0KIH0KIAogc3RhdGljIHUzMiBuZXR2c2NfZ2V0X25leHRfc2VuZF9zZWN0aW9uKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlKQpAQCAtODU5LDcgKzg3Myw3IEBACiAJCXN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7Ci0JaW50IHJldCA9IDAsIG1fcmV0ID0gMDsKKwlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqb3V0X2NoYW5uZWw7CiAJdTE2IHFfaWR4ID0gcGFja2V0LT5xX2lkeDsKIAl1MzIgcGt0bGVuID0gcGFja2V0LT50b3RhbF9kYXRhX2J1ZmxlbiwgbXNkX2xlbiA9IDA7CkBAIC05MzAsNyArOTQ0LDcgQEAKIAkJfQogCiAJCWlmIChtc2RwLT5za2IpCi0JCQlkZXZfa2ZyZWVfc2tiX2FueShtc2RwLT5za2IpOworCQkJZGV2X2NvbnN1bWVfc2tiX2FueShtc2RwLT5za2IpOwogCiAJCWlmICh4bWl0X21vcmUgJiYgIXBhY2tldC0+Y3BfcGFydGlhbCkgewogCQkJbXNkcC0+c2tiID0gc2tiOwpAQCAtOTQ4LDggKzk2Miw4IEBACiAJfQogCiAJaWYgKG1zZF9zZW5kKSB7Ci0JCW1fcmV0ID0gbmV0dnNjX3NlbmRfcGt0KGRldmljZSwgbXNkX3NlbmQsIG5ldF9kZXZpY2UsCi0JCQkJCU5VTEwsIG1zZF9za2IpOworCQlpbnQgbV9yZXQgPSBuZXR2c2Nfc2VuZF9wa3QoZGV2aWNlLCBtc2Rfc2VuZCwgbmV0X2RldmljZSwKKwkJCQkJICAgIE5VTEwsIG1zZF9za2IpOwogCiAJCWlmIChtX3JldCAhPSAwKSB7CiAJCQluZXR2c2NfZnJlZV9zZW5kX3Nsb3QobmV0X2RldmljZSwKQEAgLTk2OCw0OSArOTgyLDEyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIG5ldHZzY19zZW5kX3JlY3ZfY29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCi0JCQkJCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLAotCQkJCQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKLQkJCQkJdTY0IHRyYW5zYWN0aW9uX2lkLCB1MzIgc3RhdHVzKQorc3RhdGljIGludCBuZXR2c2Nfc2VuZF9yZWN2X2NvbXBsZXRpb24oc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJICAgICAgIHU2NCB0cmFuc2FjdGlvbl9pZCwgdTMyIHN0YXR1cykKIHsKIAlzdHJ1Y3QgbnZzcF9tZXNzYWdlIHJlY3Zjb21wTWVzc2FnZTsKLQlpbnQgcmV0cmllcyA9IDA7CiAJaW50IHJldDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGh2X2dldF9kcnZkYXRhKGRldmljZSk7CiAKIAlyZWN2Y29tcE1lc3NhZ2UuaGRyLm1zZ190eXBlID0KIAkJCQlOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVF9DT01QTEVURTsKIAogCXJlY3Zjb21wTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0X2NvbXBsZXRlLnN0YXR1cyA9IHN0YXR1czsKIAotcmV0cnlfc2VuZF9jbXBsdDoKIAkvKiBTZW5kIHRoZSBjb21wbGV0aW9uICovCiAJcmV0ID0gdm1idXNfc2VuZHBhY2tldChjaGFubmVsLCAmcmVjdmNvbXBNZXNzYWdlLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwgdHJhbnNhY3Rpb25faWQsCi0JCQkgICAgICAgVk1fUEtUX0NPTVAsIDApOwotCWlmIChyZXQgPT0gMCkgewotCQkvKiBzdWNjZXNzICovCi0JCS8qIG5vLW9wICovCi0JfSBlbHNlIGlmIChyZXQgPT0gLUVBR0FJTikgewotCQkvKiBubyBtb3JlIHJvb20uLi53YWl0IGEgYml0IGFuZCBhdHRlbXB0IHRvIHJldHJ5IDMgdGltZXMgKi8KLQkJcmV0cmllcysrOwotCQluZXRkZXZfZXJyKG5kZXYsICJ1bmFibGUgdG8gc2VuZCByZWNlaXZlIGNvbXBsZXRpb24gcGt0IgotCQkJIiAodGlkICVsbHgpLi4ucmV0cnlpbmcgJWRcbiIsIHRyYW5zYWN0aW9uX2lkLCByZXRyaWVzKTsKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZV9oZWFkZXIpICsgc2l6ZW9mKHUzMiksCisJCQkgICAgICAgdHJhbnNhY3Rpb25faWQsIFZNX1BLVF9DT01QLCAwKTsKIAotCQlpZiAocmV0cmllcyA8IDQpIHsKLQkJCXVkZWxheSgxMDApOwotCQkJZ290byByZXRyeV9zZW5kX2NtcGx0OwotCQl9IGVsc2UgewotCQkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIHNlbmQgcmVjZWl2ZSAiCi0JCQkJImNvbXBsZXRpb24gcGt0ICh0aWQgJWxseCkuLi5naXZlIHVwIHJldHJ5aW5nXG4iLAotCQkJCXRyYW5zYWN0aW9uX2lkKTsKLQkJfQotCX0gZWxzZSB7Ci0JCW5ldGRldl9lcnIobmRldiwgInVuYWJsZSB0byBzZW5kIHJlY2VpdmUgIgotCQkJImNvbXBsZXRpb24gcGt0IC0gJWxseFxuIiwgdHJhbnNhY3Rpb25faWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3VudF9yZWN2X2NvbXBfc2xvdChzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZkZXYsIHUxNiBxX2lkeCwKKwkJCQkJdTMyICpmaWxsZWQsIHUzMiAqYXZhaWwpCit7CisJdTMyIGZpcnN0ID0gbnZkZXYtPm1yY1txX2lkeF0uZmlyc3Q7CisJdTMyIG5leHQgPSBudmRldi0+bXJjW3FfaWR4XS5uZXh0OworCisJKmZpbGxlZCA9IChmaXJzdCA+IG5leHQpID8gTkVUVlNDX1JFQ1ZTTE9UX01BWCAtIGZpcnN0ICsgbmV4dCA6CisJCSAgbmV4dCAtIGZpcnN0OworCisJKmF2YWlsID0gTkVUVlNDX1JFQ1ZTTE9UX01BWCAtICpmaWxsZWQgLSAxOworfQorCisvKiBSZWFkIHRoZSBmaXJzdCBmaWxsZWQgc2xvdCwgbm8gY2hhbmdlIHRvIGluZGV4ICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZWN2X2NvbXBfZGF0YSAqcmVhZF9yZWN2X2NvbXBfc2xvdChzdHJ1Y3QgbmV0dnNjX2RldmljZQorCQkJCQkJCSAqbnZkZXYsIHUxNiBxX2lkeCkKK3sKKwl1MzIgZmlsbGVkLCBhdmFpbDsKKworCWlmICghbnZkZXYtPm1yY1txX2lkeF0uYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCWNvdW50X3JlY3ZfY29tcF9zbG90KG52ZGV2LCBxX2lkeCwgJmZpbGxlZCwgJmF2YWlsKTsKKwlpZiAoIWZpbGxlZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gbnZkZXYtPm1yY1txX2lkeF0uYnVmICsgbnZkZXYtPm1yY1txX2lkeF0uZmlyc3QgKgorCSAgICAgICBzaXplb2Yoc3RydWN0IHJlY3ZfY29tcF9kYXRhKTsKK30KKworLyogUHV0IHRoZSBmaXJzdCBmaWxsZWQgc2xvdCBiYWNrIHRvIGF2YWlsYWJsZSBwb29sICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3JlY3ZfY29tcF9zbG90KHN0cnVjdCBuZXR2c2NfZGV2aWNlICpudmRldiwgdTE2IHFfaWR4KQoreworCWludCBudW1fcmVjdjsKKworCW52ZGV2LT5tcmNbcV9pZHhdLmZpcnN0ID0gKG52ZGV2LT5tcmNbcV9pZHhdLmZpcnN0ICsgMSkgJQorCQkJCSAgTkVUVlNDX1JFQ1ZTTE9UX01BWDsKKworCW51bV9yZWN2ID0gYXRvbWljX2RlY19yZXR1cm4oJm52ZGV2LT5udW1fb3V0c3RhbmRpbmdfcmVjdnMpOworCisJaWYgKG52ZGV2LT5kZXN0cm95ICYmIG51bV9yZWN2ID09IDApCisJCXdha2VfdXAoJm52ZGV2LT53YWl0X2RyYWluKTsKK30KKworLyogQ2hlY2sgYW5kIHNlbmQgcGVuZGluZyByZWN2IGNvbXBsZXRpb25zICovCitzdGF0aWMgdm9pZCBuZXR2c2NfY2hrX3JlY3ZfY29tcChzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZkZXYsCisJCQkJIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLCB1MTYgcV9pZHgpCit7CisJc3RydWN0IHJlY3ZfY29tcF9kYXRhICpyY2Q7CisJaW50IHJldDsKKworCXdoaWxlICh0cnVlKSB7CisJCXJjZCA9IHJlYWRfcmVjdl9jb21wX3Nsb3QobnZkZXYsIHFfaWR4KTsKKwkJaWYgKCFyY2QpCisJCQlicmVhazsKKworCQlyZXQgPSBuZXR2c2Nfc2VuZF9yZWN2X2NvbXBsZXRpb24oY2hhbm5lbCwgcmNkLT50aWQsCisJCQkJCQkgIHJjZC0+c3RhdHVzKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCXB1dF9yZWN2X2NvbXBfc2xvdChudmRldiwgcV9pZHgpOwogCX0KIH0KIAorI2RlZmluZSBORVRWU0NfUkNEX1dBVEVSTUFSSyA4MAorCisvKiBHZXQgbmV4dCBhdmFpbGFibGUgc2xvdCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVjdl9jb21wX2RhdGEgKmdldF9yZWN2X2NvbXBfc2xvdCgKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZkZXYsIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLCB1MTYgcV9pZHgpCit7CisJdTMyIGZpbGxlZCwgYXZhaWwsIG5leHQ7CisJc3RydWN0IHJlY3ZfY29tcF9kYXRhICpyY2Q7CisKKwlpZiAoIW52ZGV2LT5yZWN2X3NlY3Rpb24pCisJCXJldHVybiBOVUxMOworCisJaWYgKCFudmRldi0+bXJjW3FfaWR4XS5idWYpCisJCXJldHVybiBOVUxMOworCisJaWYgKGF0b21pY19yZWFkKCZudmRldi0+bnVtX291dHN0YW5kaW5nX3JlY3ZzKSA+CisJICAgIG52ZGV2LT5yZWN2X3NlY3Rpb24tPm51bV9zdWJfYWxsb2NzICogTkVUVlNDX1JDRF9XQVRFUk1BUksgLyAxMDApCisJCW5ldHZzY19jaGtfcmVjdl9jb21wKG52ZGV2LCBjaGFubmVsLCBxX2lkeCk7CisKKwljb3VudF9yZWN2X2NvbXBfc2xvdChudmRldiwgcV9pZHgsICZmaWxsZWQsICZhdmFpbCk7CisJaWYgKCFhdmFpbCkKKwkJcmV0dXJuIE5VTEw7CisKKwluZXh0ID0gbnZkZXYtPm1yY1txX2lkeF0ubmV4dDsKKwlyY2QgPSBudmRldi0+bXJjW3FfaWR4XS5idWYgKyBuZXh0ICogc2l6ZW9mKHN0cnVjdCByZWN2X2NvbXBfZGF0YSk7CisJbnZkZXYtPm1yY1txX2lkeF0ubmV4dCA9IChuZXh0ICsgMSkgJSBORVRWU0NfUkVDVlNMT1RfTUFYOworCisJYXRvbWljX2luYygmbnZkZXYtPm51bV9vdXRzdGFuZGluZ19yZWN2cyk7CisKKwlyZXR1cm4gcmNkOworfQorCiBzdGF0aWMgdm9pZCBuZXR2c2NfcmVjZWl2ZShzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSwKIAkJCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLAogCQkJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLApAQCAtMTAyNSw2ICsxMTExLDkgQEAKIAlpbnQgY291bnQgPSAwOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKIAl2b2lkICpkYXRhOworCWludCByZXQ7CisJc3RydWN0IHJlY3ZfY29tcF9kYXRhICpyY2Q7CisJdTE2IHFfaWR4ID0gY2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuc3ViX2NoYW5uZWxfaW5kZXg7CiAKIAkvKgogCSAqIEFsbCBpbmJvdW5kIHBhY2tldHMgb3RoZXIgdGhhbiBzZW5kIGNvbXBsZXRpb24gc2hvdWxkIGJlIHhmZXIgcGFnZQpAQCAtMTA2OSwxMyArMTE1OCwyOSBAQAogCQkvKiBQYXNzIGl0IHRvIHRoZSB1cHBlciBsYXllciAqLwogCQlzdGF0dXMgPSBybmRpc19maWx0ZXJfcmVjZWl2ZShkZXZpY2UsIG5ldHZzY19wYWNrZXQsICZkYXRhLAogCQkJCQkgICAgICBjaGFubmVsKTsKLQogCX0KIAotCW5ldHZzY19zZW5kX3JlY3ZfY29tcGxldGlvbihkZXZpY2UsIGNoYW5uZWwsIG5ldF9kZXZpY2UsCi0JCQkJICAgIHZteGZlcnBhZ2VfcGFja2V0LT5kLnRyYW5zX2lkLCBzdGF0dXMpOwotfQorCWlmICghbmV0X2RldmljZS0+bXJjW3FfaWR4XS5idWYpIHsKKwkJcmV0ID0gbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKGNoYW5uZWwsCisJCQkJCQkgIHZteGZlcnBhZ2VfcGFja2V0LT5kLnRyYW5zX2lkLAorCQkJCQkJICBzdGF0dXMpOworCQlpZiAocmV0KQorCQkJbmV0ZGV2X2VycihuZGV2LCAiUmVjdl9jb21wIHE6JWhkLCB0aWQ6JWxseCwgZXJyOiVkXG4iLAorCQkJCSAgIHFfaWR4LCB2bXhmZXJwYWdlX3BhY2tldC0+ZC50cmFuc19pZCwgcmV0KTsKKwkJcmV0dXJuOworCX0KIAorCXJjZCA9IGdldF9yZWN2X2NvbXBfc2xvdChuZXRfZGV2aWNlLCBjaGFubmVsLCBxX2lkeCk7CisKKwlpZiAoIXJjZCkgeworCQluZXRkZXZfZXJyKG5kZXYsICJSZWN2X2NvbXAgZnVsbCBidWYgcTolaGQsIHRpZDolbGx4XG4iLAorCQkJICAgcV9pZHgsIHZteGZlcnBhZ2VfcGFja2V0LT5kLnRyYW5zX2lkKTsKKwkJcmV0dXJuOworCX0KKworCXJjZC0+dGlkID0gdm14ZmVycGFnZV9wYWNrZXQtPmQudHJhbnNfaWQ7CisJcmNkLT5zdGF0dXMgPSBzdGF0dXM7Cit9CiAKIHN0YXRpYyB2b2lkIG5ldHZzY19zZW5kX3RhYmxlKHN0cnVjdCBodl9kZXZpY2UgKmhkZXYsCiAJCQkgICAgICBzdHJ1Y3QgbnZzcF9tZXNzYWdlICpudm1zZykKQEAgLTExNTcsMTEgKzEyNjIsMTEgQEAKIAl9CiB9CiAKLQogdm9pZCBuZXR2c2NfY2hhbm5lbF9jYih2b2lkICpjb250ZXh0KQogewogCWludCByZXQ7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWwgKiljb250ZXh0OworCXUxNiBxX2lkeCA9IGNoYW5uZWwtPm9mZmVybXNnLm9mZmVyLnN1Yl9jaGFubmVsX2luZGV4OwogCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAl1MzIgYnl0ZXNfcmVjdmQ7CkBAIC0xMjEzLDggKzEzMTgsNiBAQAogCQkJCQkJICAgICAgIG5kZXYsCiAJCQkJCQkgICAgICAgcmVxdWVzdF9pZCwKIAkJCQkJCSAgICAgICBkZXNjKTsKLQotCiAJCQl9IGVsc2UgewogCQkJCS8qCiAJCQkJICogV2UgYXJlIGRvbmUgZm9yIHRoaXMgcGFzcy4KQEAgLTEyNDEsNyArMTM0NCw4IEBACiAKIAlpZiAoYnVmZmVybGVuID4gTkVUVlNDX1BBQ0tFVF9TSVpFKQogCQlrZnJlZShidWZmZXIpOwotCXJldHVybjsKKworCW5ldHZzY19jaGtfcmVjdl9jb21wKG5ldF9kZXZpY2UsIGNoYW5uZWwsIHFfaWR4KTsKIH0KIAogLyoKQEAgLTEyNjMsOSArMTM2Nyw2IEBACiAKIAluZXRfZGV2aWNlLT5yaW5nX3NpemUgPSByaW5nX3NpemU7CiAKLQkvKiBJbml0aWFsaXplIHRoZSBOZXRWU0MgY2hhbm5lbCBleHRlbnNpb24gKi8KLQlpbml0X2NvbXBsZXRpb24oJm5ldF9kZXZpY2UtPmNoYW5uZWxfaW5pdF93YWl0KTsKLQogCXNldF9wZXJfY2hhbm5lbF9zdGF0ZShkZXZpY2UtPmNoYW5uZWwsIG5ldF9kZXZpY2UtPmNiX2J1ZmZlcik7CiAKIAkvKiBPcGVuIHRoZSBjaGFubmVsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjX2Rydi5jIGIvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzY19kcnYuYwppbmRleCAzYmEyOWZjLi41MmVlYjJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjX2Rydi5jCisrKyBiL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2NfZHJ2LmMKQEAgLTQwLDcgKzQwLDYgQEAKIAogI2luY2x1ZGUgImh5cGVydl9uZXQuaCIKIAotCiAjZGVmaW5lIFJJTkdfU0laRV9NSU4gNjQKICNkZWZpbmUgTElOS0NIQU5HRV9JTlQgKDIgKiBIWikKICNkZWZpbmUgTkVUVlNDX0hXX0ZFQVRVUkVTCShORVRJRl9GX1JYQ1NVTSB8IFwKQEAgLTM1OCwxOCArMzU3LDE0IEBACiAJc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzX21zZzsKIAlzdHJ1Y3Qgcm5kaXNfcGFja2V0ICpybmRpc19wa3Q7CiAJdTMyIHJuZGlzX21zZ19zaXplOwotCWJvb2wgaXN2bGFuOwotCWJvb2wgbGluZWFyID0gZmFsc2U7CiAJc3RydWN0IHJuZGlzX3Blcl9wYWNrZXRfaW5mbyAqcHBpOwogCXN0cnVjdCBuZGlzX3RjcF9pcF9jaGVja3N1bV9pbmZvICpjc3VtX2luZm87Ci0Jc3RydWN0IG5kaXNfdGNwX2xzb19pbmZvICpsc29faW5mbzsKIAlpbnQgIGhkcl9vZmZzZXQ7CiAJdTMyIG5ldF90cmFuc19pbmZvOwogCXUzMiBoYXNoOwogCXUzMiBza2JfbGVuZ3RoOwogCXN0cnVjdCBodl9wYWdlX2J1ZmZlciBwYWdlX2J1ZltNQVhfUEFHRV9CVUZGRVJfQ09VTlRdOwogCXN0cnVjdCBodl9wYWdlX2J1ZmZlciAqcGIgPSBwYWdlX2J1ZjsKLQlzdHJ1Y3QgbmV0dnNjX3N0YXRzICp0eF9zdGF0cyA9IHRoaXNfY3B1X3B0cihuZXRfZGV2aWNlX2N0eC0+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+cmVnX3N0YXRlICE9IE5FVFJFR19SRUdJU1RFUkVEKQogCQlyZXR1cm47CiAKLQluZGV2X2N0eCA9IG5ldGRldl9wcml2KG5ldCk7Ci0KIAlldmVudCA9IGt6YWxsb2Moc2l6ZW9mKCpldmVudCksIEdGUF9BVE9NSUMpOwogCWlmICghZXZlbnQpCiAJCXJldHVybjsKQEAgLTYwNCw3ICs2MTcsNiBAQAogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmRldl9jdHgtPmR3b3JrLCAwKTsKIH0KIAotCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKm5ldHZzY19hbGxvY19yZWN2X3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAogCQkJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQsCiAJCQkJc3RydWN0IG5kaXNfdGNwX2lwX2NoZWNrc3VtX2luZm8gKmNzdW1faW5mbywKQEAgLTY1NSw1MSArNjY3LDIzIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IGh2X2dldF9kcnZkYXRhKGRldmljZV9vYmopOwogCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqdmZfbmV0ZGV2OwogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IHNrX2J1ZmYgKnZmX3NrYjsKIAlzdHJ1Y3QgbmV0dnNjX3N0YXRzICpyeF9zdGF0czsKLQl1MzIgYnl0ZXNfcmVjdmQgPSBwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuOwotCWludCByZXQgPSAwOwogCi0JaWYgKCFuZXQgfHwgbmV0LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1JFR0lTVEVSRUQpCisJaWYgKG5ldC0+cmVnX3N0YXRlICE9IE5FVFJFR19SRUdJU1RFUkVEKQogCQlyZXR1cm4gTlZTUF9TVEFUX0ZBSUw7CiAKLQlpZiAoUkVBRF9PTkNFKG5ldF9kZXZpY2VfY3R4LT52Zl9pbmplY3QpKSB7Ci0JCWF0b21pY19pbmMoJm5ldF9kZXZpY2VfY3R4LT52Zl91c2VfY250KTsKLQkJaWYgKCFSRUFEX09OQ0UobmV0X2RldmljZV9jdHgtPnZmX2luamVjdCkpIHsKLQkJCS8qCi0JCQkgKiBXZSByYWNlZDsganVzdCBtb3ZlIG9uLgotCQkJICovCi0JCQlhdG9taWNfZGVjKCZuZXRfZGV2aWNlX2N0eC0+dmZfdXNlX2NudCk7Ci0JCQlnb3RvIHZmX2luamVjdGlvbl9kb25lOwotCQl9Ci0KLQkJLyoKLQkJICogSW5qZWN0IHRoaXMgcGFja2V0IGludG8gdGhlIFZGIGluZXJmYWNlLgotCQkgKiBPbiBIeXBlci1WLCBtdWx0aWNhc3QgYW5kIGJyb2RjYXN0IHBhY2tldHMKLQkJICogYXJlIG9ubHkgZGVsaXZlcmVkIG9uIHRoZSBzeW50aGV0aWMgaW50ZXJmYWNlCi0JCSAqIChhZnRlciBzdWJqZWN0aW5nIHRoZXNlIHRvIHBvbGljeSBmaWx0ZXJzIG9uCi0JCSAqIHRoZSBob3N0KS4gRGVsaXZlciB0aGVzZSB2aWEgdGhlIFZGIGludGVyZmFjZQotCQkgKiBpbiB0aGUgZ3Vlc3QuCi0JCSAqLwotCQl2Zl9za2IgPSBuZXR2c2NfYWxsb2NfcmVjdl9za2IobmV0X2RldmljZV9jdHgtPnZmX25ldGRldiwKLQkJCQkJICAgICAgIHBhY2tldCwgY3N1bV9pbmZvLCAqZGF0YSwKLQkJCQkJICAgICAgIHZsYW5fdGNpKTsKLQkJaWYgKHZmX3NrYiAhPSBOVUxMKSB7Ci0JCQkrK25ldF9kZXZpY2VfY3R4LT52Zl9uZXRkZXYtPnN0YXRzLnJ4X3BhY2tldHM7Ci0JCQluZXRfZGV2aWNlX2N0eC0+dmZfbmV0ZGV2LT5zdGF0cy5yeF9ieXRlcyArPQotCQkJCWJ5dGVzX3JlY3ZkOwotCQkJbmV0aWZfcmVjZWl2ZV9za2IodmZfc2tiKTsKLQkJfSBlbHNlIHsKLQkJCSsrbmV0LT5zdGF0cy5yeF9kcm9wcGVkOwotCQkJcmV0ID0gTlZTUF9TVEFUX0ZBSUw7Ci0JCX0KLQkJYXRvbWljX2RlYygmbmV0X2RldmljZV9jdHgtPnZmX3VzZV9jbnQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotdmZfaW5qZWN0aW9uX2RvbmU6Ci0Jcnhfc3RhdHMgPSB0aGlzX2NwdV9wdHIobmV0X2RldmljZV9jdHgtPnJ4X3N0YXRzKTsKKwkvKgorCSAqIElmIG5lY2Vzc2FyeSwgaW5qZWN0IHRoaXMgcGFja2V0IGludG8gdGhlIFZGIGludGVyZmFjZS4KKwkgKiBPbiBIeXBlci1WLCBtdWx0aWNhc3QgYW5kIGJyb2RjYXN0IHBhY2tldHMgYXJlIG9ubHkgZGVsaXZlcmVkCisJICogdG8gdGhlIHN5bnRoZXRpYyBpbnRlcmZhY2UgKGFmdGVyIHN1YmplY3RpbmcgdGhlc2UgdG8KKwkgKiBwb2xpY3kgZmlsdGVycyBvbiB0aGUgaG9zdCkuIERlbGl2ZXIgdGhlc2UgdmlhIHRoZSBWRgorCSAqIGludGVyZmFjZSBpbiB0aGUgZ3Vlc3QuCisJICovCisJdmZfbmV0ZGV2ID0gcmN1X2RlcmVmZXJlbmNlKG5ldF9kZXZpY2VfY3R4LT52Zl9uZXRkZXYpOworCWlmICh2Zl9uZXRkZXYgJiYgKHZmX25ldGRldi0+ZmxhZ3MgJiBJRkZfVVApKQorCQluZXQgPSB2Zl9uZXRkZXY7CiAKIAkvKiBBbGxvY2F0ZSBhIHNrYiAtIFRPRE8gZGlyZWN0IEkvTyB0byBwYWdlcz8gKi8KIAlza2IgPSBuZXR2c2NfYWxsb2NfcmVjdl9za2IobmV0LCBwYWNrZXQsIGNzdW1faW5mbywgKmRhdGEsIHZsYW5fdGNpKTsKQEAgLTcwNywxMiArNjkxLDI1IEBACiAJCSsrbmV0LT5zdGF0cy5yeF9kcm9wcGVkOwogCQlyZXR1cm4gTlZTUF9TVEFUX0ZBSUw7CiAJfQotCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCBjaGFubmVsLT4KLQkJCSAgICBvZmZlcm1zZy5vZmZlci5zdWJfY2hhbm5lbF9pbmRleCk7CiAKKwlpZiAobmV0ICE9IHZmX25ldGRldikKKwkJc2tiX3JlY29yZF9yeF9xdWV1ZShza2IsCisJCQkJICAgIGNoYW5uZWwtPm9mZmVybXNnLm9mZmVyLnN1Yl9jaGFubmVsX2luZGV4KTsKKworCS8qCisJICogRXZlbiBpZiBpbmplY3RpbmcgdGhlIHBhY2tldCwgcmVjb3JkIHRoZSBzdGF0aXN0aWNzCisJICogb24gdGhlIHN5bnRoZXRpYyBkZXZpY2UgYmVjYXVzZSBtb2RpZnlpbmcgdGhlIFZGIGRldmljZQorCSAqIHN0YXRpc3RpY3Mgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkuCisJICovCisJcnhfc3RhdHMgPSB0aGlzX2NwdV9wdHIobmV0X2RldmljZV9jdHgtPnJ4X3N0YXRzKTsKIAl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9zdGF0cy0+c3luY3ApOwogCXJ4X3N0YXRzLT5wYWNrZXRzKys7CiAJcnhfc3RhdHMtPmJ5dGVzICs9IHBhY2tldC0+dG90YWxfZGF0YV9idWZsZW47CisKKwlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfQlJPQURDQVNUKQorCQkrK3J4X3N0YXRzLT5icm9hZGNhc3Q7CisJZWxzZSBpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTVVMVElDQVNUKQorCQkrK3J4X3N0YXRzLT5tdWx0aWNhc3Q7CiAJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnJ4X3N0YXRzLT5zeW5jcCk7CiAKIAkvKgpAQCAtNzI4LDggKzcyNSwxMiBAQAogc3RhdGljIHZvaWQgbmV0dnNjX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsCiAJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eCA9IG5ldGRldl9wcml2KG5ldCk7CisJc3RydWN0IGh2X2RldmljZSAqZGV2ID0gbmV0X2RldmljZV9jdHgtPmRldmljZV9jdHg7CisKIAlzdHJsY3B5KGluZm8tPmRyaXZlciwgS0JVSUxEX01PRE5BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKIAlzdHJsY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJOL0EiLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHZtYnVzX2Rldl9uYW1lKGRldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiBzdGF0aWMgdm9pZCBuZXR2c2NfZ2V0X2NoYW5uZWxzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsCkBAIC05NTEsNyArOTUyLDcgQEAKIAkJCQkJCQkgICAgY3B1KTsKIAkJc3RydWN0IG5ldHZzY19zdGF0cyAqcnhfc3RhdHMgPSBwZXJfY3B1X3B0cihuZGV2X2N0eC0+cnhfc3RhdHMsCiAJCQkJCQkJICAgIGNwdSk7Ci0JCXU2NCB0eF9wYWNrZXRzLCB0eF9ieXRlcywgcnhfcGFja2V0cywgcnhfYnl0ZXM7CisJCXU2NCB0eF9wYWNrZXRzLCB0eF9ieXRlcywgcnhfcGFja2V0cywgcnhfYnl0ZXMsIHJ4X211bHRpY2FzdDsKIAkJdW5zaWduZWQgaW50IHN0YXJ0OwogCiAJCWRvIHsKQEAgLTk2NCwxMiArOTY1LDE0IEBACiAJCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9pcnEoJnJ4X3N0YXRzLT5zeW5jcCk7CiAJCQlyeF9wYWNrZXRzID0gcnhfc3RhdHMtPnBhY2tldHM7CiAJCQlyeF9ieXRlcyA9IHJ4X3N0YXRzLT5ieXRlczsKKwkJCXJ4X211bHRpY2FzdCA9IHJ4X3N0YXRzLT5tdWx0aWNhc3QgKyByeF9zdGF0cy0+YnJvYWRjYXN0OwogCQl9IHdoaWxlICh1NjRfc3RhdHNfZmV0Y2hfcmV0cnlfaXJxKCZyeF9zdGF0cy0+c3luY3AsIHN0YXJ0KSk7CiAKIAkJdC0+dHhfYnl0ZXMJKz0gdHhfYnl0ZXM7CiAJCXQtPnR4X3BhY2tldHMJKz0gdHhfcGFja2V0czsKIAkJdC0+cnhfYnl0ZXMJKz0gcnhfYnl0ZXM7CiAJCXQtPnJ4X3BhY2tldHMJKz0gcnhfcGFja2V0czsKKwkJdC0+bXVsdGljYXN0CSs9IHJ4X211bHRpY2FzdDsKIAl9CiAKIAl0LT50eF9kcm9wcGVkCT0gbmV0LT5zdGF0cy50eF9kcm9wcGVkOwpAQCAtMTAwNSw2ICsxMDA4LDUxIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJY2hhciBuYW1lW0VUSF9HU1RSSU5HX0xFTl07CisJdTE2IG9mZnNldDsKK30gbmV0dnNjX3N0YXRzW10gPSB7CisJeyAidHhfc2NhdHRlcmVkIiwgb2Zmc2V0b2Yoc3RydWN0IG5ldHZzY19ldGh0b29sX3N0YXRzLCB0eF9zY2F0dGVyZWQpIH0sCisJeyAidHhfbm9fbWVtb3J5IiwgIG9mZnNldG9mKHN0cnVjdCBuZXR2c2NfZXRodG9vbF9zdGF0cywgdHhfbm9fbWVtb3J5KSB9LAorCXsgInR4X25vX3NwYWNlIiwgIG9mZnNldG9mKHN0cnVjdCBuZXR2c2NfZXRodG9vbF9zdGF0cywgdHhfbm9fc3BhY2UpIH0sCisJeyAidHhfdG9vX2JpZyIsCSAgb2Zmc2V0b2Yoc3RydWN0IG5ldHZzY19ldGh0b29sX3N0YXRzLCB0eF90b29fYmlnKSB9LAorCXsgInR4X2J1c3kiLAkgIG9mZnNldG9mKHN0cnVjdCBuZXR2c2NfZXRodG9vbF9zdGF0cywgdHhfYnVzeSkgfSwKK307CisKK3N0YXRpYyBpbnQgbmV0dnNjX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzdHJpbmdfc2V0KQoreworCXN3aXRjaCAoc3RyaW5nX3NldCkgeworCWNhc2UgRVRIX1NTX1NUQVRTOgorCQlyZXR1cm4gQVJSQVlfU0laRShuZXR2c2Nfc3RhdHMpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIHZvaWQgbmV0dnNjX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZGMgPSBuZXRkZXZfcHJpdihkZXYpOworCWNvbnN0IHZvaWQgKm5kcyA9ICZuZGMtPmV0aF9zdGF0czsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5ldHZzY19zdGF0cyk7IGkrKykKKwkJZGF0YVtpXSA9ICoodW5zaWduZWQgbG9uZyAqKShuZHMgKyBuZXR2c2Nfc3RhdHNbaV0ub2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgbmV0dnNjX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQoreworCWludCBpOworCisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19TVEFUUzoKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmV0dnNjX3N0YXRzKTsgaSsrKQorCQkJbWVtY3B5KGRhdGEgKyBpICogRVRIX0dTVFJJTkdfTEVOLAorCQkJICAgICAgIG5ldHZzY19zdGF0c1tpXS5uYW1lLCBFVEhfR1NUUklOR19MRU4pOworCQlicmVhazsKKwl9Cit9CisKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgbmV0dnNjX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewpAQCAtMTAxNyw2ICsxMDY1LDkgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCT0gbmV0dnNjX2dldF9kcnZpbmZvLAogCS5nZXRfbGluawk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9ldGh0b29sX3N0YXRzID0gbmV0dnNjX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfc3NldF9jb3VudCA9IG5ldHZzY19nZXRfc3NldF9jb3VudCwKKwkuZ2V0X3N0cmluZ3MJPSBuZXR2c2NfZ2V0X3N0cmluZ3MsCiAJLmdldF9jaGFubmVscyAgID0gbmV0dnNjX2dldF9jaGFubmVscywKIAkuc2V0X2NoYW5uZWxzICAgPSBuZXR2c2Nfc2V0X2NoYW5uZWxzLAogCS5nZXRfdHNfaW5mbwk9IGV0aHRvb2xfb3BfZ2V0X3RzX2luZm8sCkBAIC0xMTUxLDI1ICsxMjAyLDQ0IEBACiAJZnJlZV9uZXRkZXYobmV0ZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpnZXRfbmV0dnNjX25ldF9kZXZpY2UoY2hhciAqbWFjKQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpnZXRfbmV0dnNjX2J5bWFjKGNvbnN0IHU4ICptYWMpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgKmZvdW5kID0gTlVMTDsKLQlpbnQgcnRubF9sb2NrZWQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAotCXJ0bmxfbG9ja2VkID0gcnRubF90cnlsb2NrKCk7CisJQVNTRVJUX1JUTkwoKTsKIAogCWZvcl9lYWNoX25ldGRldigmaW5pdF9uZXQsIGRldikgewotCQlpZiAobWVtY21wKGRldi0+ZGV2X2FkZHIsIG1hYywgRVRIX0FMRU4pID09IDApIHsKLQkJCWlmIChkZXYtPm5ldGRldl9vcHMgIT0gJmRldmljZV9vcHMpCi0JCQkJY29udGludWU7Ci0JCQlmb3VuZCA9IGRldjsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChydG5sX2xvY2tlZCkKLQkJcnRubF91bmxvY2soKTsKKwkJaWYgKGRldi0+bmV0ZGV2X29wcyAhPSAmZGV2aWNlX29wcykKKwkJCWNvbnRpbnVlOwkvKiBub3QgYSBuZXR2c2MgZGV2aWNlICovCiAKLQlyZXR1cm4gZm91bmQ7CisJCWlmIChldGhlcl9hZGRyX2VxdWFsKG1hYywgZGV2LT5wZXJtX2FkZHIpKQorCQkJcmV0dXJuIGRldjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpnZXRfbmV0dnNjX2J5cmVmKHN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlmb3JfZWFjaF9uZXRkZXYoJmluaXRfbmV0LCBkZXYpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHg7CisKKwkJaWYgKGRldi0+bmV0ZGV2X29wcyAhPSAmZGV2aWNlX29wcykKKwkJCWNvbnRpbnVlOwkvKiBub3QgYSBuZXR2c2MgZGV2aWNlICovCisKKwkJbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihkZXYpOworCQlpZiAobmV0X2RldmljZV9jdHgtPm52ZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsJLyogZGV2aWNlIGlzIHJlbW92ZWQgKi8KKworCQlpZiAocnRubF9kZXJlZmVyZW5jZShuZXRfZGV2aWNlX2N0eC0+dmZfbmV0ZGV2KSA9PSB2Zl9uZXRkZXYpCisJCQlyZXR1cm4gZGV2OwkvKiBhIG1hdGNoICovCisJfQorCisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgbmV0dnNjX3JlZ2lzdGVyX3ZmKHN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXYpCkBAIC0xMTc3LDkgKzEyNDcsOCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4OwogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXR2c2NfZGV2OwotCWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqZXRoX29wcyA9IHZmX25ldGRldi0+ZXRodG9vbF9vcHM7CiAKLQlpZiAoZXRoX29wcyA9PSBOVUxMIHx8IGV0aF9vcHMgPT0gJmV0aHRvb2xfb3BzKQorCWlmICh2Zl9uZXRkZXYtPmFkZHJfbGVuICE9IEVUSF9BTEVOKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAkvKgpAQCAtMTE4NywxMyArMTI1NiwxMyBAQAogCSAqIGFzc29jaWF0ZSB3aXRoIHRoZSBWRiBpbnRlcmZhY2UuIElmIHdlIGRvbid0IGZpbmQgYSBtYXRjaGluZwogCSAqIHN5bnRoZXRpYyBpbnRlcmZhY2UsIG1vdmUgb24uCiAJICovCi0JbmRldiA9IGdldF9uZXR2c2NfbmV0X2RldmljZSh2Zl9uZXRkZXYtPmRldl9hZGRyKTsKKwluZGV2ID0gZ2V0X25ldHZzY19ieW1hYyh2Zl9uZXRkZXYtPnBlcm1fYWRkcik7CiAJaWYgKCFuZGV2KQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKIAluZXRfZGV2aWNlX2N0eCA9IG5ldGRldl9wcml2KG5kZXYpOwogCW5ldHZzY19kZXYgPSBuZXRfZGV2aWNlX2N0eC0+bnZkZXY7Ci0JaWYgKCFuZXR2c2NfZGV2IHx8IG5ldF9kZXZpY2VfY3R4LT52Zl9uZXRkZXYpCisJaWYgKCFuZXR2c2NfZGV2IHx8IHJ0bmxfZGVyZWZlcmVuY2UobmV0X2RldmljZV9jdHgtPnZmX25ldGRldikpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCW5ldGRldl9pbmZvKG5kZXYsICJWRiByZWdpc3RlcmluZzogJXNcbiIsIHZmX25ldGRldi0+bmFtZSk7CkBAIC0xMjAxLDQ2ICsxMjcwLDI2IEBACiAJICogVGFrZSBhIHJlZmVyZW5jZSBvbiB0aGUgbW9kdWxlLgogCSAqLwogCXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKLQluZXRfZGV2aWNlX2N0eC0+dmZfbmV0ZGV2ID0gdmZfbmV0ZGV2OworCisJZGV2X2hvbGQodmZfbmV0ZGV2KTsKKwlyY3VfYXNzaWduX3BvaW50ZXIobmV0X2RldmljZV9jdHgtPnZmX25ldGRldiwgdmZfbmV0ZGV2KTsKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi1zdGF0aWMgdm9pZCBuZXR2c2NfaW5qZWN0X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eCkKLXsKLQluZXRfZGV2aWNlX2N0eC0+dmZfaW5qZWN0ID0gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgbmV0dnNjX2luamVjdF9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4KQotewotCW5ldF9kZXZpY2VfY3R4LT52Zl9pbmplY3QgPSBmYWxzZTsKLQotCS8qIFdhaXQgZm9yIGN1cnJlbnRseSBhY3RpdmUgdXNlcnMgdG8gZHJhaW4gb3V0LiAqLwotCXdoaWxlIChhdG9taWNfcmVhZCgmbmV0X2RldmljZV9jdHgtPnZmX3VzZV9jbnQpICE9IDApCi0JCXVkZWxheSg1MCk7Ci19Ci0KIHN0YXRpYyBpbnQgbmV0dnNjX3ZmX3VwKHN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldHZzY19kZXY7Ci0JY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzICpldGhfb3BzID0gdmZfbmV0ZGV2LT5ldGh0b29sX29wczsKIAlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eDsKIAotCWlmIChldGhfb3BzID09ICZldGh0b29sX29wcykKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0JbmRldiA9IGdldF9uZXR2c2NfbmV0X2RldmljZSh2Zl9uZXRkZXYtPmRldl9hZGRyKTsKKwluZGV2ID0gZ2V0X25ldHZzY19ieXJlZih2Zl9uZXRkZXYpOwogCWlmICghbmRldikKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZGV2KTsKIAluZXR2c2NfZGV2ID0gbmV0X2RldmljZV9jdHgtPm52ZGV2OwogCi0JaWYgKCFuZXR2c2NfZGV2IHx8ICFuZXRfZGV2aWNlX2N0eC0+dmZfbmV0ZGV2KQotCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0KIAluZXRkZXZfaW5mbyhuZGV2LCAiVkYgdXA6ICVzXG4iLCB2Zl9uZXRkZXYtPm5hbWUpOwotCW5ldHZzY19pbmplY3RfZW5hYmxlKG5ldF9kZXZpY2VfY3R4KTsKIAogCS8qCiAJICogT3BlbiB0aGUgZGV2aWNlIGJlZm9yZSBzd2l0Y2hpbmcgZGF0YSBwYXRoLgpAQCAtMTI2MSwyOSArMTMxMCwyMCBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLQogc3RhdGljIGludCBuZXR2c2NfdmZfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqdmZfbmV0ZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXR2c2NfZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4OwotCWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqZXRoX29wcyA9IHZmX25ldGRldi0+ZXRodG9vbF9vcHM7CiAKLQlpZiAoZXRoX29wcyA9PSAmZXRodG9vbF9vcHMpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQotCW5kZXYgPSBnZXRfbmV0dnNjX25ldF9kZXZpY2UodmZfbmV0ZGV2LT5kZXZfYWRkcik7CisJbmRldiA9IGdldF9uZXR2c2NfYnlyZWYodmZfbmV0ZGV2KTsKIAlpZiAoIW5kZXYpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCW5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJbmV0dnNjX2RldiA9IG5ldF9kZXZpY2VfY3R4LT5udmRldjsKIAotCWlmICghbmV0dnNjX2RldiB8fCAhbmV0X2RldmljZV9jdHgtPnZmX25ldGRldikKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCiAJbmV0ZGV2X2luZm8obmRldiwgIlZGIGRvd246ICVzXG4iLCB2Zl9uZXRkZXYtPm5hbWUpOwotCW5ldHZzY19pbmplY3RfZGlzYWJsZShuZXRfZGV2aWNlX2N0eCk7CiAJbmV0dnNjX3N3aXRjaF9kYXRhcGF0aChuZGV2LCBmYWxzZSk7CiAJbmV0ZGV2X2luZm8obmRldiwgIkRhdGEgcGF0aCBzd2l0Y2hlZCBmcm9tIFZGOiAlc1xuIiwgdmZfbmV0ZGV2LT5uYW1lKTsKIAlybmRpc19maWx0ZXJfY2xvc2UobmV0dnNjX2Rldik7CkBAIC0xMjk1LDI4ICsxMzM1LDIzIEBACiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAotCiBzdGF0aWMgaW50IG5ldHZzY191bnJlZ2lzdGVyX3ZmKHN0cnVjdCBuZXRfZGV2aWNlICp2Zl9uZXRkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldHZzY19kZXY7Ci0JY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzICpldGhfb3BzID0gdmZfbmV0ZGV2LT5ldGh0b29sX29wczsKIAlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZXRfZGV2aWNlX2N0eDsKIAotCWlmIChldGhfb3BzID09ICZldGh0b29sX29wcykKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCi0JbmRldiA9IGdldF9uZXR2c2NfbmV0X2RldmljZSh2Zl9uZXRkZXYtPmRldl9hZGRyKTsKKwluZGV2ID0gZ2V0X25ldHZzY19ieXJlZih2Zl9uZXRkZXYpOwogCWlmICghbmRldikKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZGV2KTsKIAluZXR2c2NfZGV2ID0gbmV0X2RldmljZV9jdHgtPm52ZGV2OwotCWlmICghbmV0dnNjX2RldiB8fCAhbmV0X2RldmljZV9jdHgtPnZmX25ldGRldikKLQkJcmV0dXJuIE5PVElGWV9ET05FOworCiAJbmV0ZGV2X2luZm8obmRldiwgIlZGIHVucmVnaXN0ZXJpbmc6ICVzXG4iLCB2Zl9uZXRkZXYtPm5hbWUpOwotCW5ldHZzY19pbmplY3RfZGlzYWJsZShuZXRfZGV2aWNlX2N0eCk7Ci0JbmV0X2RldmljZV9jdHgtPnZmX25ldGRldiA9IE5VTEw7CisKKwlSQ1VfSU5JVF9QT0lOVEVSKG5ldF9kZXZpY2VfY3R4LT52Zl9uZXRkZXYsIE5VTEwpOworCWRldl9wdXQodmZfbmV0ZGV2KTsKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAlyZXR1cm4gTk9USUZZX09LOwogfQpAQCAtMTMzNyw2ICsxMzcyLDggQEAKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldCk7CiAKKwluZXR2c2NfaW5pdF9zZXR0aW5ncyhuZXQpOworCiAJbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZXQpOwogCW5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4ID0gZGV2OwogCW5ldF9kZXZpY2VfY3R4LT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWcsIGRlZmF1bHRfbXNnKTsKQEAgLTEzNjYsMTAgKzE0MDMsNiBAQAogCXNwaW5fbG9ja19pbml0KCZuZXRfZGV2aWNlX2N0eC0+bG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJm5ldF9kZXZpY2VfY3R4LT5yZWNvbmZpZ19ldmVudHMpOwogCi0JYXRvbWljX3NldCgmbmV0X2RldmljZV9jdHgtPnZmX3VzZV9jbnQsIDApOwotCW5ldF9kZXZpY2VfY3R4LT52Zl9uZXRkZXYgPSBOVUxMOwotCW5ldF9kZXZpY2VfY3R4LT52Zl9pbmplY3QgPSBmYWxzZTsKLQogCW5ldC0+bmV0ZGV2X29wcyA9ICZkZXZpY2Vfb3BzOwogCiAJbmV0LT5od19mZWF0dXJlcyA9IE5FVFZTQ19IV19GRUFUVVJFUzsKQEAgLTEzOTgsOCArMTQzMSw2IEBACiAJbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhuZXQsIG52ZGV2LT5udW1fY2huKTsKIAluZXRpZl9zZXRfcmVhbF9udW1fcnhfcXVldWVzKG5ldCwgbnZkZXYtPm51bV9jaG4pOwogCi0JbmV0dnNjX2luaXRfc2V0dGluZ3MobmV0KTsKLQogCXJldCA9IHJlZ2lzdGVyX25ldGRldihuZXQpOwogCWlmIChyZXQgIT0gMCkgewogCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciBuZXRkZXYuXG4iKTsKQEAgLTE0MjMsNyArMTQ1NCw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCiAJbmRldl9jdHggPSBuZXRkZXZfcHJpdihuZXQpOwogCW5ldF9kZXZpY2UgPSBuZGV2X2N0eC0+bnZkZXY7CiAKQEAgLTE0NzAsNyArMTUwMCw2IEBACiAJLnJlbW92ZSA9IG5ldHZzY19yZW1vdmUsCiB9OwogCi0KIC8qCiAgKiBPbiBIeXBlci1WLCBldmVyeSBWRiBpbnRlcmZhY2UgaXMgbWF0Y2hlZCB3aXRoIGEgY29ycmVzcG9uZGluZwogICogc3ludGhldGljIGludGVyZmFjZS4gVGhlIHN5bnRoZXRpYyBpbnRlcmZhY2UgaXMgcHJlc2VudGVkIGZpcnN0CkBAIC0xNDgyLDEzICsxNTExLDIxIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmV2ZW50X2RldiA9IG5ldGRldl9ub3RpZmllcl9pbmZvX3RvX2RldihwdHIpOwogCisJLyogU2tpcCBvdXIgb3duIGV2ZW50cyAqLworCWlmIChldmVudF9kZXYtPm5ldGRldl9vcHMgPT0gJmRldmljZV9vcHMpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCS8qIEF2b2lkIG5vbi1FdGhlcm5ldCB0eXBlIGRldmljZXMgKi8KKwlpZiAoZXZlbnRfZGV2LT50eXBlICE9IEFSUEhSRF9FVEhFUikKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCiAJLyogQXZvaWQgVmxhbiBkZXYgd2l0aCBzYW1lIE1BQyByZWdpc3RlcmluZyBhcyBWRiAqLwogCWlmIChldmVudF9kZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCS8qIEF2b2lkIEJvbmRpbmcgbWFzdGVyIGRldiB3aXRoIHNhbWUgTUFDIHJlZ2lzdGVyaW5nIGFzIFZGICovCi0JaWYgKGV2ZW50X2Rldi0+cHJpdl9mbGFncyAmIElGRl9CT05ESU5HICYmCi0JICAgIGV2ZW50X2Rldi0+ZmxhZ3MgJiBJRkZfTUFTVEVSKQorCWlmICgoZXZlbnRfZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JPTkRJTkcpICYmCisJICAgIChldmVudF9kZXYtPmZsYWdzICYgSUZGX01BU1RFUikpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2h5cGVydi9ybmRpc19maWx0ZXIuYyBiL2RyaXZlcnMvbmV0L2h5cGVydi9ybmRpc19maWx0ZXIuYwppbmRleCA4ZTgzMGY3Li45MTk1ZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oeXBlcnYvcm5kaXNfZmlsdGVyLmMKKysrIGIvZHJpdmVycy9uZXQvaHlwZXJ2L3JuZGlzX2ZpbHRlci5jCkBAIC02NjMsMTMgKzY2MywxNCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXU4IG5ldHZzY19oYXNoX2tleVtIQVNIX0tFWUxFTl0gPSB7CitzdGF0aWMgY29uc3QgdTggbmV0dnNjX2hhc2hfa2V5W10gPSB7CiAJMHg2ZCwgMHg1YSwgMHg1NiwgMHhkYSwgMHgyNSwgMHg1YiwgMHgwZSwgMHhjMiwKIAkweDQxLCAweDY3LCAweDI1LCAweDNkLCAweDQzLCAweGEzLCAweDhmLCAweGIwLAogCTB4ZDAsIDB4Y2EsIDB4MmIsIDB4Y2IsIDB4YWUsIDB4N2IsIDB4MzAsIDB4YjQsCiAJMHg3NywgMHhjYiwgMHgyZCwgMHhhMywgMHg4MCwgMHgzMCwgMHhmMiwgMHgwYywKIAkweDZhLCAweDQyLCAweGI3LCAweDNiLCAweGJlLCAweGFjLCAweDAxLCAweGZhCiB9OworI2RlZmluZSBIQVNIX0tFWUxFTiBBUlJBWV9TSVpFKG5ldHZzY19oYXNoX2tleSkKIAogc3RhdGljIGludCBybmRpc19maWx0ZXJfc2V0X3Jzc19wYXJhbShzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpyZGV2LCBpbnQgbnVtX3F1ZXVlKQogewpAQCAtNzIwLDcgKzcyMSw2IEBACiAJZm9yIChpID0gMDsgaSA8IEhBU0hfS0VZTEVOOyBpKyspCiAJCWtleXBbaV0gPSBuZXR2c2NfaGFzaF9rZXlbaV07CiAKLQogCXJldCA9IHJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3QocmRldiwgcmVxdWVzdCk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGNsZWFudXA7CkBAIC03MzgsNyArNzM4LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KIHN0YXRpYyBpbnQgcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9saW5rX3N0YXR1cyhzdHJ1Y3Qgcm5kaXNfZGV2aWNlICpkZXYpCiB7CiAJdTMyIHNpemUgPSBzaXplb2YodTMyKTsKQEAgLTc1Miw2ICs3NTEsMjggQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IHJuZGlzX2ZpbHRlcl9xdWVyeV9saW5rX3NwZWVkKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldikKK3sKKwl1MzIgc2l6ZSA9IHNpemVvZih1MzIpOworCXUzMiBsaW5rX3NwZWVkOworCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5kYzsKKwlpbnQgcmV0OworCisJcmV0ID0gcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZShkZXYsIFJORElTX09JRF9HRU5fTElOS19TUEVFRCwKKwkJCQkJJmxpbmtfc3BlZWQsICZzaXplKTsKKworCWlmICghcmV0KSB7CisJCW5kYyA9IG5ldGRldl9wcml2KGRldi0+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+aXB2bGFucyk7Ci0JaXB2bGFuX3NldF9wb3J0X21vZGUocG9ydCwgbW9kZSk7Ci0KIAluZXRpZl9zdGFja2VkX3RyYW5zZmVyX29wZXJzdGF0ZShwaHlfZGV2LCBkZXYpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjc2VjLmMgYi9kcml2ZXJzL25ldC9tYWNzZWMuYwppbmRleCAzNTFlNzAxLi4zZWE0N2YyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWNzZWMuYworKysgYi9kcml2ZXJzL25ldC9tYWNzZWMuYwpAQCAtMjk3Myw2ICsyOTczLDcgQEAKIAlkZXYtPnByaXZfZmxhZ3MgfD0gSUZGX05PX1FVRVVFOwogCWRldi0+bmV0ZGV2X29wcyA9ICZtYWNzZWNfbmV0ZGV2X29wczsKIAlkZXYtPmRlc3RydWN0b3IgPSBtYWNzZWNfZnJlZV9uZXRkZXY7CisJU0VUX05FVERFVl9ERVZUWVBFKGRldiwgJm1hY3NlY190eXBlKTsKIAogCWV0aF96ZXJvX2FkZHIoZGV2LT5icm9hZGNhc3QpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L0tjb25maWcgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwppbmRleCA0N2E2NDM0Li41MDc4YTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9waHkvS2NvbmZpZwpAQCAtMTUsMTYyICsxNSwyNyBAQAogY29uZmlnIFNXUEhZCiAJYm9vbAogCi1jb21tZW50ICJNSUkgUEhZIGRldmljZSBkcml2ZXJzIgorY29tbWVudCAiTURJTyBidXMgZGV2aWNlIGRyaXZlcnMiCiAKLWNvbmZpZyBBUVVBTlRJQV9QSFkKLSAgICAgICAgdHJpc3RhdGUgIkRyaXZlcnMgZm9yIHRoZSBBcXVhbnRpYSBQSFlzIgotICAgICAgICAtLS1oZWxwLS0tCi0gICAgICAgICAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBBcXVhbnRpYSBBUTEyMDIsIEFRMjEwNCwgQVFSMTA1LCBBUVI0MDUKLQotY29uZmlnIEFUODAzWF9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgQXRoZXJvcyBBVDgwM1ggUEhZcyIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEFUODAzMCBhbmQgQVQ4MDM1IG1vZGVsCi0KLWNvbmZpZyBBTURfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIHRoZSBBTUQgUEhZcyIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIGFtNzljODc0Ci0KLWNvbmZpZyBNQVJWRUxMX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBNYXJ2ZWxsIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IGhhcyBhIGRyaXZlciBmb3IgdGhlIDg4RTEwMTFTCi0JCi1jb25maWcgREFWSUNPTV9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgRGF2aWNvbSBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyBkbTkxNjFlIGFuZCBkbTkxMzEKLQotY29uZmlnIFFTRU1JX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBRdWFsaXR5IFNlbWljb25kdWN0b3IgUEhZcyIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIHFzNjYxMgotCi1jb25maWcgTFhUX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciB0aGUgSW50ZWwgTFhUIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBseHQ5NzAsIGx4dDk3MQotCi1jb25maWcgQ0lDQURBX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciB0aGUgQ2ljYWRhIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBjaXM4MjA0Ci0KLWNvbmZpZyBWSVRFU1NFX1BIWQotICAgICAgICB0cmlzdGF0ZSAiRHJpdmVycyBmb3IgdGhlIFZpdGVzc2UgUEhZcyIKLSAgICAgICAgLS0taGVscC0tLQotICAgICAgICAgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgdnNjODI0NAotCi1jb25maWcgVEVSQU5FVElDU19QSFkKLSAgICAgICAgdHJpc3RhdGUgIkRyaXZlcnMgZm9yIHRoZSBUZXJhbmV0aWNzIFBIWXMiCi0gICAgICAgIC0tLWhlbHAtLS0KLSAgICAgICAgICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIFRlcmFuZXRpY3MgVE4yMDIwCi0KLWNvbmZpZyBTTVNDX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBTTVNDIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBMQU44M0MxODUsIExBTjgxODcgYW5kIExBTjg3MDAgUEhZcwotCi1jb25maWcgQkNNX05FVF9QSFlMSUIKLQl0cmlzdGF0ZQotCi1jb25maWcgQlJPQURDT01fUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIEJyb2FkY29tIFBIWXMiCi0Jc2VsZWN0IEJDTV9ORVRfUEhZTElCCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBCQ001NDExLCBCQ001NDIxLCBCQ001NDYxLCBCQ001NDYxNlMsIEJDTTU0NjQsCi0JICBCQ001NDgxIGFuZCBCQ001NDgyIFBIWXMuCi0KLWNvbmZpZyBCQ01fQ1lHTlVTX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBCcm9hZGNvbSBDeWdudXMgU29DIGludGVybmFsIFBIWSIKLQlkZXBlbmRzIG9uIEFSQ0hfQkNNX0NZR05VUyB8fCBDT01QSUxFX1RFU1QKLQlkZXBlbmRzIG9uIE1ESU9fQkNNX0lQUk9DCi0Jc2VsZWN0IEJDTV9ORVRfUEhZTElCCi0JLS0taGVscC0tLQotCSAgVGhpcyBQSFkgZHJpdmVyIGlzIGZvciB0aGUgMUcgaW50ZXJuYWwgUEhZcyBvZiB0aGUgQnJvYWRjb20KLQkgIEN5Z251cyBGYW1pbHkgU29DLgotCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgaW50ZXJuYWwgUEhZJ3MgdXNlZCBpbiB0aGUgQkNNMTEzMDAsCi0JICBCQ00xMTMyMCwgQkNNMTEzNTAsIEJDTTExMzYwLCBCQ001ODMwMCwgQkNNNTgzMDIsCi0JICBCQ001ODMwMyAmIEJDTTU4MzA1IEJyb2FkY29tIEN5Z251cyBTb0NzLgotCi1jb25maWcgQkNNNjNYWF9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgQnJvYWRjb20gNjN4eCBTT0NzIGludGVybmFsIFBIWSIKLQlkZXBlbmRzIG9uIEJDTTYzWFgKLQlzZWxlY3QgQkNNX05FVF9QSFlMSUIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIDYzNDggYW5kIDYzNTggUEhZcy4KLQotY29uZmlnIEJDTTdYWFhfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIEJyb2FkY29tIDd4eHggU09DcyBpbnRlcm5hbCBQSFlzIgotCXNlbGVjdCBCQ01fTkVUX1BIWUxJQgotCS0tLWhlbHAtLS0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgQkNNNzM2NiwgQkNNNzQzOSwgQkNNNzQ0NSwgYW5kCi0JICA0MG5tIGFuZCA2NW5tIGdlbmVyYXRpb24gb2YgQkNNN3h4eCBTZXQgVG9wIEJveCBTb0NzLgotCi1jb25maWcgQkNNODdYWF9QSFkKLQl0cmlzdGF0ZSAiRHJpdmVyIGZvciBCcm9hZGNvbSBCQ004NzA2IGFuZCBCQ004NzI3IFBIWXMiCitjb25maWcgTURJT19CQ01fSVBST0MKKwl0cmlzdGF0ZSAiQnJvYWRjb20gaVByb2MgTURJTyBidXMgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEFSQ0hfQkNNX0lQUk9DIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gSEFTX0lPTUVNICYmIE9GX01ESU8KIAloZWxwCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEJDTTg3MDYgYW5kIEJDTTg3MjcgMTBHIEV0aGVybmV0IFBIWXMuCisJICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIE1ESU8gYnVzc2VzIGZvdW5kIGluIHRoZQorCSAgQnJvYWRjb20gaVByb2MgU29DJ3MuCiAKLWNvbmZpZyBJQ1BMVVNfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIElDUGx1cyBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgSVAxNzVDIGFuZCBJUDEwMDEgUEhZcy4KLQotY29uZmlnIFJFQUxURUtfUEhZCi0JdHJpc3RhdGUgIkRyaXZlcnMgZm9yIFJlYWx0ZWsgUEhZcyIKLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0cyB0aGUgUmVhbHRlayA4MjF4IFBIWS4KLQotY29uZmlnIE5BVElPTkFMX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBIWXMiCi0JLS0taGVscC0tLQotCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBEUDgzODY1IFBIWS4KLQotY29uZmlnIFNURTEwWFAKLQl0cmlzdGF0ZSAiRHJpdmVyIGZvciBTVE1pY3JvZWxlY3Ryb25pY3MgU1RlMTBYcCBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIFNUZTEwMHAgYW5kIFNUZTEwMXAgUEhZcy4KLQotY29uZmlnIExTSV9FVDEwMTFDX1BIWQotCXRyaXN0YXRlICJEcml2ZXIgZm9yIExTSSBFVDEwMTFDIFBIWSIKLQktLS1oZWxwLS0tCi0JICBTdXBwb3J0cyB0aGUgTFNJIEVUMTAxMUMgUEhZLgotCi1jb25maWcgTUlDUkVMX1BIWQotCXRyaXN0YXRlICJEcml2ZXIgZm9yIE1pY3JlbCBQSFlzIgotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnRzIHRoZSBLU1o5MDIxLCBWU0M4MjAxLCBLUzgwMDEgUEhZcy4KLQotY29uZmlnIERQODM4NDhfUEhZCi0JdHJpc3RhdGUgIkRyaXZlciBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgRFA4Mzg0OCBQSFkiCi0JLS0taGVscC0tLQotCSAgU3VwcG9ydHMgdGhlIERQODM4NDggUEhZLgotCi1jb25maWcgRFA4Mzg2N19QSFkKLQl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgVGV4YXMgSW5zdHJ1bWVudHMgRFA4Mzg2NyBHaWdhYml0IFBIWSIKLQktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIERQODM4NjcgUEhZLgotCi1jb25maWcgTUlDUk9DSElQX1BIWQotCXRyaXN0YXRlICJEcml2ZXJzIGZvciBNaWNyb2NoaXAgUEhZcyIKK2NvbmZpZyBNRElPX0JDTV9VTklNQUMKKwl0cmlzdGF0ZSAiQnJvYWRjb20gVW5pTUFDIE1ESU8gYnVzIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAloZWxwCi0JICBTdXBwb3J0cyB0aGUgTEFOODhYWCBQSFlzLgotCi1jb25maWcgRklYRURfUEhZCi0JdHJpc3RhdGUgIkRyaXZlciBmb3IgTURJTyBCdXMvUEhZIGVtdWxhdGlvbiB3aXRoIGZpeGVkIHNwZWVkL2xpbmsgUEhZcyIKLQlkZXBlbmRzIG9uIFBIWUxJQgotCXNlbGVjdCBTV1BIWQotCS0tLWhlbHAtLS0KLQkgIEFkZHMgdGhlIHBsYXRmb3JtICJmaXhlZCIgTURJTyBCdXMgdG8gY292ZXIgdGhlIGJvYXJkcyB0aGF0IHVzZQotCSAgUEhZcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIHRoZSByZWFsIE1ESU8gYnVzLgotCi0JICBDdXJyZW50bHkgdGVzdGVkIHdpdGggbXBjODY2YWRzIGFuZCBtcGM4MzQ5ZS1taXR4LgorCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBCcm9hZGNvbSBVbmlNQUMgTURJTyBidXNzZXMuCisJICBUaGlzIGhhcmR3YXJlIGNhbiBiZSBmb3VuZCBpbiB0aGUgQnJvYWRjb20gR0VORVQgRXRoZXJuZXQgTUFDCisJICBjb250cm9sbGVycyBhcyB3ZWxsIGFzIHNvbWUgQnJvYWRjb20gRXRoZXJuZXQgc3dpdGNoZXMgc3VjaCBhcyB0aGUKKwkgIFN0YXJmaWdodGVyIDIgc3dpdGNoZXMuCiAKIGNvbmZpZyBNRElPX0JJVEJBTkcKLQl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgYml0YmFuZ2VkIE1ESU8gYnVzZXMiCisJdHJpc3RhdGUgIkJpdGJhbmdlZCBNRElPIGJ1c2VzIgogCWhlbHAKIAkgIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIE1ESU8gYnVzIHByb3RvY29sIGluIHNvZnR3YXJlLAogCSAgZm9yIHVzZSBieSBsb3cgbGV2ZWwgZHJpdmVycyB0aGF0IGV4cG9ydCB0aGUgYWJpbGl0eSB0bwpAQCAtMTc4LDU0ICs0Myw2IEBACiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIAotY29uZmlnIE1ESU9fR1BJTwotCXRyaXN0YXRlICJTdXBwb3J0IGZvciBHUElPIGxpYi1iYXNlZCBiaXRiYW5nZWQgTURJTyBidXNlcyIKLQlkZXBlbmRzIG9uIE1ESU9fQklUQkFORyAmJiBHUElPTElCCi0JLS0taGVscC0tLQotCSAgU3VwcG9ydHMgR1BJTyBsaWItYmFzZWQgTURJTyBidXNzZXMuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG1kaW8tZ3Bpby4KLQotY29uZmlnIE1ESU9fQ0FWSVVNCi0JdHJpc3RhdGUKLQotY29uZmlnIE1ESU9fT0NURU9OCi0JdHJpc3RhdGUgIlN1cHBvcnQgZm9yIE1ESU8gYnVzZXMgb24gT2N0ZW9uIGFuZCBzb21lIFRodW5kZXJYIFNPQ3MiCi0JZGVwZW5kcyBvbiA2NEJJVAotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0Jc2VsZWN0IE1ESU9fQ0FWSVVNCi0JaGVscAotCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBPY3Rlb24gYW5kIFRodW5kZXJYIE1ESU8KLQkgIGJ1c2VzLiBJdCBpcyByZXF1aXJlZCBieSB0aGUgT2N0ZW9uIGFuZCBUaHVuZGVyWCBldGhlcm5ldCBkZXZpY2UKLQkgIGRyaXZlcnMgb24gc29tZSBzeXN0ZW1zLgotCi1jb25maWcgTURJT19USFVOREVSCi0JdHJpc3RhdGUgIlN1cHBvcnQgZm9yIE1ESU8gYnVzZXMgb24gVGh1bmRlclggU09DcyIKLQlkZXBlbmRzIG9uIDY0QklUCi0JZGVwZW5kcyBvbiBQQ0kKLQlzZWxlY3QgTURJT19DQVZJVU0KLQloZWxwCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTURJTyBpbnRlcmZhY2VzIGZvdW5kIG9uIENhdml1bQotCSAgVGh1bmRlclggU29DcyB3aGVuIHRoZSBNRElPIGJ1cyBkZXZpY2UgYXBwZWFycyBhcyBhIFBDSQotCSAgZGV2aWNlLgotCi0KLWNvbmZpZyBNRElPX1NVTjRJCi0JdHJpc3RhdGUgIkFsbHdpbm5lciBzdW40aSBNRElPIGludGVyZmFjZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQVJDSF9TVU5YSQotCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBNRElPIGludGVyZmFjZSBmb3VuZCBpbiB0aGUgbmV0d29yawotCSAgaW50ZXJmYWNlIHVuaXRzIG9mIHRoZSBBbGx3aW5uZXIgU29DIHRoYXQgaGF2ZSBhbiBFTUFDIChBMTAsCi0JICBBMTIsIEExMHMsIGV0Yy4pCi0KLWNvbmZpZyBNRElPX01PWEFSVAotICAgICAgICB0cmlzdGF0ZSAiTU9YQSBBUlQgTURJTyBpbnRlcmZhY2Ugc3VwcG9ydCIKLSAgICAgICAgZGVwZW5kcyBvbiBBUkNIX01PWEFSVAotICAgICAgICBoZWxwCi0gICAgICAgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1ESU8gaW50ZXJmYWNlIGZvdW5kIGluIHRoZSBuZXR3b3JrCi0gICAgICAgICAgaW50ZXJmYWNlIHVuaXRzIG9mIHRoZSBNT1hBIEFSVCBTb0MKLQogY29uZmlnIE1ESU9fQlVTX01VWAogCXRyaXN0YXRlCiAJZGVwZW5kcyBvbiBPRl9NRElPCkBAIC0yMzUsOCArNTIsMTkgQEAKIAkgIHRvIGEgcGFyZW50IGJ1cy4gIFN3aXRjaGluZyBiZXR3ZWVuIGNoaWxkIGJ1c3NlcyBpcyBkb25lIGJ5CiAJICBkZXZpY2Ugc3BlY2lmaWMgZHJpdmVycy4KIAorY29uZmlnIE1ESU9fQlVTX01VWF9CQ01fSVBST0MKKwl0cmlzdGF0ZSAiQnJvYWRjb20gaVByb2MgYmFzZWQgTURJTyBidXMgbXVsdGlwbGV4ZXJzIgorCWRlcGVuZHMgb24gT0YgJiYgT0ZfTURJTyAmJiAoQVJDSF9CQ01fSVBST0MgfHwgQ09NUElMRV9URVNUKQorCXNlbGVjdCBNRElPX0JVU19NVVgKKwlkZWZhdWx0IEFSQ0hfQkNNX0lQUk9DCisJaGVscAorCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIE1ESU8gYnVzIG11bHRpcGxleGVycyBmb3VuZCBpbgorCSAgaVByb2MgYmFzZWQgQnJvYWRjb20gU29Dcy4gVGhpcyBtdWx0aXBsZXhlciBjb25uZWN0cyBvbmUgb2Ygc2V2ZXJhbAorCSAgY2hpbGQgTURJTyBidXMgdG8gYSBwYXJlbnQgYnVzLiBCdXNlcyBjb3VsZCBiZSBpbnRlcm5hbCBhcyB3ZWxsIGFzCisJICBleHRlcm5hbCBhbmQgc2VsZWN0aW9uIGxvZ2ljIGxpZXMgaW5zaWRlIHRoZSBzYW1lIG11bHRpcGxleGVyLgorCiBjb25maWcgTURJT19CVVNfTVVYX0dQSU8KLQl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgR1BJTyBjb250cm9sbGVkIE1ESU8gYnVzIG11bHRpcGxleGVycyIKKwl0cmlzdGF0ZSAiR1BJTyBjb250cm9sbGVkIE1ESU8gYnVzIG11bHRpcGxleGVycyIKIAlkZXBlbmRzIG9uIE9GX0dQSU8gJiYgT0ZfTURJTwogCXNlbGVjdCBNRElPX0JVU19NVVgKIAloZWxwCkBAIC0yNDYsNyArNzQsNyBAQAogCSAgc2VsZWN0aW9uIGlzIHVuZGVyIHRoZSBjb250cm9sIG9mIEdQSU8gbGluZXMuCiAKIGNvbmZpZyBNRElPX0JVU19NVVhfTU1JT1JFRwotCXRyaXN0YXRlICJTdXBwb3J0IGZvciBNTUlPIGRldmljZS1jb250cm9sbGVkIE1ESU8gYnVzIG11bHRpcGxleGVycyIKKwl0cmlzdGF0ZSAiTU1JTyBkZXZpY2UtY29udHJvbGxlZCBNRElPIGJ1cyBtdWx0aXBsZXhlcnMiCiAJZGVwZW5kcyBvbiBPRl9NRElPICYmIEhBU19JT01FTQogCXNlbGVjdCBNRElPX0JVU19NVVgKIAloZWxwCkBAIC0yNTgsNDEgKzg2LDE3IEBACiAKIAkgIEN1cnJlbnRseSwgb25seSA4LWJpdCByZWdpc3RlcnMgYXJlIHN1cHBvcnRlZC4KIAotY29uZmlnIE1ESU9fQlVTX01VWF9CQ01fSVBST0MKLQl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgaVByb2MgYmFzZWQgTURJTyBidXMgbXVsdGlwbGV4ZXJzIgotCWRlcGVuZHMgb24gT0YgJiYgT0ZfTURJTyAmJiAoQVJDSF9CQ01fSVBST0MgfHwgQ09NUElMRV9URVNUKQotCXNlbGVjdCBNRElPX0JVU19NVVgKLQlkZWZhdWx0IEFSQ0hfQkNNX0lQUk9DCi0JaGVscAotCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIE1ESU8gYnVzIG11bHRpcGxleGVycyBmb3VuZCBpbgotCSAgaVByb2MgYmFzZWQgQnJvYWRjb20gU29Dcy4gVGhpcyBtdWx0aXBsZXhlciBjb25uZWN0cyBvbmUgb2Ygc2V2ZXJhbAotCSAgY2hpbGQgTURJTyBidXMgdG8gYSBwYXJlbnQgYnVzLiBCdXNlcyBjb3VsZCBiZSBpbnRlcm5hbCBhcyB3ZWxsIGFzCi0JICBleHRlcm5hbCBhbmQgc2VsZWN0aW9uIGxvZ2ljIGxpZXMgaW5zaWRlIHRoZSBzYW1lIG11bHRpcGxleGVyLgorY29uZmlnIE1ESU9fQ0FWSVVNCisJdHJpc3RhdGUKIAotY29uZmlnIE1ESU9fQkNNX1VOSU1BQwotCXRyaXN0YXRlICJCcm9hZGNvbSBVbmlNQUMgTURJTyBidXMgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEhBU19JT01FTQotCWhlbHAKLQkgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZHJpdmVyIGZvciB0aGUgQnJvYWRjb20gVW5pTUFDIE1ESU8gYnVzc2VzLgotCSAgVGhpcyBoYXJkd2FyZSBjYW4gYmUgZm91bmQgaW4gdGhlIEJyb2FkY29tIEdFTkVUIEV0aGVybmV0IE1BQwotCSAgY29udHJvbGxlcnMgYXMgd2VsbCBhcyBzb21lIEJyb2FkY29tIEV0aGVybmV0IHN3aXRjaGVzIHN1Y2ggYXMgdGhlCi0JICBTdGFyZmlnaHRlciAyIHN3aXRjaGVzLgotCi1jb25maWcgTURJT19CQ01fSVBST0MKLQl0cmlzdGF0ZSAiQnJvYWRjb20gaVByb2MgTURJTyBidXMgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEFSQ0hfQkNNX0lQUk9DIHx8IENPTVBJTEVfVEVTVAotCWRlcGVuZHMgb24gSEFTX0lPTUVNICYmIE9GX01ESU8KLQloZWxwCi0JICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIE1ESU8gYnVzc2VzIGZvdW5kIGluIHRoZQotCSAgQnJvYWRjb20gaVByb2MgU29DJ3MuCi0KLWNvbmZpZyBJTlRFTF9YV0FZX1BIWQotCXRyaXN0YXRlICJEcml2ZXIgZm9yIEludGVsIFhXQVkgUEhZcyIKK2NvbmZpZyBNRElPX0dQSU8KKwl0cmlzdGF0ZSAiR1BJTyBsaWItYmFzZWQgYml0YmFuZ2VkIE1ESU8gYnVzZXMiCisJZGVwZW5kcyBvbiBNRElPX0JJVEJBTkcgJiYgR1BJT0xJQgogCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnRzIHRoZSBJbnRlbCBYV0FZIChmb3JtZXIgTGFudGlxKSAxMUcgYW5kIDIyRSBQSFlzLgotCSAgVGhlc2UgUEhZcyBhcmUgbWFya2VkIGFzIHN0YW5kYWxvbmUgY2hpcHMgdW5kZXIgdGhlIG5hbWVzCi0JICBQRUYgNzA2MSwgUEVGIDcwNzEgYW5kIFBFRiA3MDcyIG9yIGludGVncmF0ZWQgaW50byB0aGUgSW50ZWwKLQkgIFNvQ3MgeFJYMjAwLCB4UlgzMDAsIHhSWDMzMCwgeFJYMzUwIGFuZCB4Ulg1NTAuCisJICBTdXBwb3J0cyBHUElPIGxpYi1iYXNlZCBNRElPIGJ1c3Nlcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWRpby1ncGlvLgogCiBjb25maWcgTURJT19ISVNJX0ZFTUFDCiAJdHJpc3RhdGUgIkhpc2lsaWNvbiBGRU1BQyBNRElPIGJ1cyBjb250cm9sbGVyIgpAQCAtMzAxLDEyICsxMDUsMjI4IEBACiAJICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIGRyaXZlciBmb3IgdGhlIE1ESU8gYnVzc2VzIGZvdW5kIGluIHRoZQogCSAgSGlzaWxpY29uIFNvQyB0aGF0IGhhdmUgYW4gRmFzdCBFdGhlcm5ldCBNQUMuCiAKK2NvbmZpZyBNRElPX01PWEFSVAorICAgICAgICB0cmlzdGF0ZSAiTU9YQSBBUlQgTURJTyBpbnRlcmZhY2Ugc3VwcG9ydCIKKyAgICAgICAgZGVwZW5kcyBvbiBBUkNIX01PWEFSVAorICAgICAgICBoZWxwCisgICAgICAgICAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1ESU8gaW50ZXJmYWNlIGZvdW5kIGluIHRoZSBuZXR3b3JrCisgICAgICAgICAgaW50ZXJmYWNlIHVuaXRzIG9mIHRoZSBNT1hBIEFSVCBTb0MKKworY29uZmlnIE1ESU9fT0NURU9OCisJdHJpc3RhdGUgIk9jdGVvbiBhbmQgc29tZSBUaHVuZGVyWCBTT0NzIE1ESU8gYnVzZXMiCisJZGVwZW5kcyBvbiA2NEJJVAorCWRlcGVuZHMgb24gSEFTX0lPTUVNCisJc2VsZWN0IE1ESU9fQ0FWSVVNCisJaGVscAorCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBPY3Rlb24gYW5kIFRodW5kZXJYIE1ESU8KKwkgIGJ1c2VzLiBJdCBpcyByZXF1aXJlZCBieSB0aGUgT2N0ZW9uIGFuZCBUaHVuZGVyWCBldGhlcm5ldCBkZXZpY2UKKwkgIGRyaXZlcnMgb24gc29tZSBzeXN0ZW1zLgorCitjb25maWcgTURJT19TVU40SQorCXRyaXN0YXRlICJBbGx3aW5uZXIgc3VuNGkgTURJTyBpbnRlcmZhY2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfU1VOWEkKKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTURJTyBpbnRlcmZhY2UgZm91bmQgaW4gdGhlIG5ldHdvcmsKKwkgIGludGVyZmFjZSB1bml0cyBvZiB0aGUgQWxsd2lubmVyIFNvQyB0aGF0IGhhdmUgYW4gRU1BQyAoQTEwLAorCSAgQTEyLCBBMTBzLCBldGMuKQorCitjb25maWcgTURJT19USFVOREVSCisJdHJpc3RhdGUgIlRodW5kZXJYIFNPQ3MgTURJTyBidXNlcyIKKwlkZXBlbmRzIG9uIDY0QklUCisJZGVwZW5kcyBvbiBQQ0kKKwlzZWxlY3QgTURJT19DQVZJVU0KKwloZWxwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgTURJTyBpbnRlcmZhY2VzIGZvdW5kIG9uIENhdml1bQorCSAgVGh1bmRlclggU29DcyB3aGVuIHRoZSBNRElPIGJ1cyBkZXZpY2UgYXBwZWFycyBhcyBhIFBDSQorCSAgZGV2aWNlLgorCiBjb25maWcgTURJT19YR0VORQogCXRyaXN0YXRlICJBUE0gWC1HZW5lIFNvQyBNRElPIGJ1cyBjb250cm9sbGVyIgogCWhlbHAKIAkgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgZHJpdmVyIGZvciB0aGUgTURJTyBidXNzZXMgZm91bmQgaW4gdGhlCiAJICBBUE0gWC1HZW5lIFNvQydzLgogCitjb21tZW50ICJNSUkgUEhZIGRldmljZSBkcml2ZXJzIgorCitjb25maWcgQU1EX1BIWQorCXRyaXN0YXRlICJBTUQgUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIGFtNzljODc0CisKK2NvbmZpZyBBUVVBTlRJQV9QSFkKKyAgICAgICAgdHJpc3RhdGUgIkFxdWFudGlhIFBIWXMiCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEFxdWFudGlhIEFRMTIwMiwgQVEyMTA0LCBBUVIxMDUsIEFRUjQwNQorCitjb25maWcgQVQ4MDNYX1BIWQorCXRyaXN0YXRlICJBVDgwM1ggUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEFUODAzMCBhbmQgQVQ4MDM1IG1vZGVsCisKK2NvbmZpZyBCQ002M1hYX1BIWQorCXRyaXN0YXRlICJCcm9hZGNvbSA2M3h4IFNPQ3MgaW50ZXJuYWwgUEhZIgorCWRlcGVuZHMgb24gQkNNNjNYWAorCXNlbGVjdCBCQ01fTkVUX1BIWUxJQgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgNjM0OCBhbmQgNjM1OCBQSFlzLgorCitjb25maWcgQkNNN1hYWF9QSFkKKwl0cmlzdGF0ZSAiQnJvYWRjb20gN3h4eCBTT0NzIGludGVybmFsIFBIWXMiCisJc2VsZWN0IEJDTV9ORVRfUEhZTElCCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBCQ003MzY2LCBCQ003NDM5LCBCQ003NDQ1LCBhbmQKKwkgIDQwbm0gYW5kIDY1bm0gZ2VuZXJhdGlvbiBvZiBCQ003eHh4IFNldCBUb3AgQm94IFNvQ3MuCisKK2NvbmZpZyBCQ004N1hYX1BIWQorCXRyaXN0YXRlICJCcm9hZGNvbSBCQ004NzA2IGFuZCBCQ004NzI3IFBIWXMiCisJaGVscAorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBCQ004NzA2IGFuZCBCQ004NzI3IDEwRyBFdGhlcm5ldCBQSFlzLgorCitjb25maWcgQkNNX0NZR05VU19QSFkKKwl0cmlzdGF0ZSAiQnJvYWRjb20gQ3lnbnVzIFNvQyBpbnRlcm5hbCBQSFkiCisJZGVwZW5kcyBvbiBBUkNIX0JDTV9DWUdOVVMgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBNRElPX0JDTV9JUFJPQworCXNlbGVjdCBCQ01fTkVUX1BIWUxJQgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgUEhZIGRyaXZlciBpcyBmb3IgdGhlIDFHIGludGVybmFsIFBIWXMgb2YgdGhlIEJyb2FkY29tCisJICBDeWdudXMgRmFtaWx5IFNvQy4KKworCSAgQ3VycmVudGx5IHN1cHBvcnRzIGludGVybmFsIFBIWSdzIHVzZWQgaW4gdGhlIEJDTTExMzAwLAorCSAgQkNNMTEzMjAsIEJDTTExMzUwLCBCQ00xMTM2MCwgQkNNNTgzMDAsIEJDTTU4MzAyLAorCSAgQkNNNTgzMDMgJiBCQ001ODMwNSBCcm9hZGNvbSBDeWdudXMgU29Dcy4KKworY29uZmlnIEJDTV9ORVRfUEhZTElCCisJdHJpc3RhdGUKKworY29uZmlnIEJST0FEQ09NX1BIWQorCXRyaXN0YXRlICJCcm9hZGNvbSBQSFlzIgorCXNlbGVjdCBCQ01fTkVUX1BIWUxJQgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgQkNNNTQxMSwgQkNNNTQyMSwgQkNNNTQ2MSwgQkNNNTQ2MTZTLCBCQ001NDY0LAorCSAgQkNNNTQ4MSBhbmQgQkNNNTQ4MiBQSFlzLgorCitjb25maWcgQ0lDQURBX1BIWQorCXRyaXN0YXRlICJDaWNhZGEgUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIGNpczgyMDQKKworY29uZmlnIERBVklDT01fUEhZCisJdHJpc3RhdGUgIkRhdmljb20gUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgZG05MTYxZSBhbmQgZG05MTMxCisKK2NvbmZpZyBEUDgzODQ4X1BIWQorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBEUDgzODQ4IFBIWSIKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0cyB0aGUgRFA4Mzg0OCBQSFkuCisKK2NvbmZpZyBEUDgzODY3X1BIWQorCXRyaXN0YXRlICJUZXhhcyBJbnN0cnVtZW50cyBEUDgzODY3IEdpZ2FiaXQgUEhZIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgRFA4Mzg2NyBQSFkuCisKK2NvbmZpZyBGSVhFRF9QSFkKKwl0cmlzdGF0ZSAiTURJTyBCdXMvUEhZIGVtdWxhdGlvbiB3aXRoIGZpeGVkIHNwZWVkL2xpbmsgUEhZcyIKKwlkZXBlbmRzIG9uIFBIWUxJQgorCXNlbGVjdCBTV1BIWQorCS0tLWhlbHAtLS0KKwkgIEFkZHMgdGhlIHBsYXRmb3JtICJmaXhlZCIgTURJTyBCdXMgdG8gY292ZXIgdGhlIGJvYXJkcyB0aGF0IHVzZQorCSAgUEhZcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIHRoZSByZWFsIE1ESU8gYnVzLgorCisJICBDdXJyZW50bHkgdGVzdGVkIHdpdGggbXBjODY2YWRzIGFuZCBtcGM4MzQ5ZS1taXR4LgorCitjb25maWcgSUNQTFVTX1BIWQorCXRyaXN0YXRlICJJQ1BsdXMgUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIElQMTc1QyBhbmQgSVAxMDAxIFBIWXMuCisKK2NvbmZpZyBJTlRFTF9YV0FZX1BIWQorCXRyaXN0YXRlICJJbnRlbCBYV0FZIFBIWXMiCisJLS0taGVscC0tLQorCSAgU3VwcG9ydHMgdGhlIEludGVsIFhXQVkgKGZvcm1lciBMYW50aXEpIDExRyBhbmQgMjJFIFBIWXMuCisJICBUaGVzZSBQSFlzIGFyZSBtYXJrZWQgYXMgc3RhbmRhbG9uZSBjaGlwcyB1bmRlciB0aGUgbmFtZXMKKwkgIFBFRiA3MDYxLCBQRUYgNzA3MSBhbmQgUEVGIDcwNzIgb3IgaW50ZWdyYXRlZCBpbnRvIHRoZSBJbnRlbAorCSAgU29DcyB4UlgyMDAsIHhSWDMwMCwgeFJYMzMwLCB4UlgzNTAgYW5kIHhSWDU1MC4KKworY29uZmlnIExTSV9FVDEwMTFDX1BIWQorCXRyaXN0YXRlICJMU0kgRVQxMDExQyBQSFkiCisJLS0taGVscC0tLQorCSAgU3VwcG9ydHMgdGhlIExTSSBFVDEwMTFDIFBIWS4KKworY29uZmlnIExYVF9QSFkKKwl0cmlzdGF0ZSAiSW50ZWwgTFhUIFBIWXMiCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBseHQ5NzAsIGx4dDk3MQorCitjb25maWcgTUFSVkVMTF9QSFkKKwl0cmlzdGF0ZSAiTWFydmVsbCBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBoYXMgYSBkcml2ZXIgZm9yIHRoZSA4OEUxMDExUworCitjb25maWcgTUlDUkVMX1BIWQorCXRyaXN0YXRlICJNaWNyZWwgUEhZcyIKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0cyB0aGUgS1NaOTAyMSwgVlNDODIwMSwgS1M4MDAxIFBIWXMuCisKK2NvbmZpZyBNSUNST0NISVBfUEhZCisJdHJpc3RhdGUgIk1pY3JvY2hpcCBQSFlzIgorCWhlbHAKKwkgIFN1cHBvcnRzIHRoZSBMQU44OFhYIFBIWXMuCisKK2NvbmZpZyBNSUNST1NFTUlfUEhZCisJdHJpc3RhdGUgIk1pY3Jvc2VtaSBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgVlNDODUzMSBhbmQgVlNDODU0MSBQSFlzCisKK2NvbmZpZyBOQVRJT05BTF9QSFkKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBQSFlzIgorCS0tLWhlbHAtLS0KKwkgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgRFA4Mzg2NSBQSFkuCisKK2NvbmZpZyBRU0VNSV9QSFkKKwl0cmlzdGF0ZSAiUXVhbGl0eSBTZW1pY29uZHVjdG9yIFBIWXMiCisJLS0taGVscC0tLQorCSAgQ3VycmVudGx5IHN1cHBvcnRzIHRoZSBxczY2MTIKKworY29uZmlnIFJFQUxURUtfUEhZCisJdHJpc3RhdGUgIlJlYWx0ZWsgUEhZcyIKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0cyB0aGUgUmVhbHRlayA4MjF4IFBIWS4KKworY29uZmlnIFNNU0NfUEhZCisJdHJpc3RhdGUgIlNNU0MgUEhZcyIKKwktLS1oZWxwLS0tCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIExBTjgzQzE4NSwgTEFOODE4NyBhbmQgTEFOODcwMCBQSFlzCisKK2NvbmZpZyBTVEUxMFhQCisJdHJpc3RhdGUgIlNUTWljcm9lbGVjdHJvbmljcyBTVGUxMFhwIFBIWXMiCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgU1RlMTAwcCBhbmQgU1RlMTAxcCBQSFlzLgorCitjb25maWcgVEVSQU5FVElDU19QSFkKKyAgICAgICAgdHJpc3RhdGUgIlRlcmFuZXRpY3MgUEhZcyIKKyAgICAgICAgLS0taGVscC0tLQorICAgICAgICAgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgVGVyYW5ldGljcyBUTjIwMjAKKworY29uZmlnIFZJVEVTU0VfUEhZCisgICAgICAgIHRyaXN0YXRlICJWaXRlc3NlIFBIWXMiCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIHZzYzgyNDQKKworY29uZmlnIFhJTElOWF9HTUlJMlJHTUlJCisgICAgICAgdHJpc3RhdGUgIlhpbGlueCBHTUlJMlJHTUlJIGNvbnZlcnRlciBkcml2ZXIiCisgICAgICAgLS0taGVscC0tLQorICAgICAgICAgVGhpcyBkcml2ZXIgc3VwcG9ydCB4aWxpbnggR01JSSB0byBSR01JSSBJUCBjb3JlIGl0IHByb3ZpZGVzCisgICAgICAgICB0aGUgUmVkdWNlZCBHaWdhYml0IE1lZGlhIEluZGVwZW5kZW50IEludGVyZmFjZShSR01JSSkgYmV0d2VlbgorICAgICAgICAgRXRoZXJuZXQgcGh5c2ljYWwgbWVkaWEgZGV2aWNlcyBhbmQgdGhlIEdpZ2FiaXQgRXRoZXJuZXQgY29udHJvbGxlci4KKworY29uZmlnIE1ESU9fWEdFTkUKKwl0cmlzdGF0ZSAiQVBNIFgtR2VuZSBTb0MgTURJTyBidXMgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEFSQ0hfWEdFTkUgfHwgQ09NUElMRV9URVNUCisJaGVscAorCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBkcml2ZXIgZm9yIHRoZSBNRElPIGJ1c3NlcyBmb3VuZCBpbiB0aGUKKwkgIEFQTSBYLUdlbmUgU29DJ3MuCisKIGVuZGlmICMgUEhZTElCCiAKIGNvbmZpZyBNSUNSRUxfS1M4OTk1TUEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZQppbmRleCA1MzRkZmE3Li5lNTg2NjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlCkBAIC0xLDUxICsxLDU1IEBACi0jIE1ha2VmaWxlIGZvciBMaW51eCBQSFkgZHJpdmVycworIyBNYWtlZmlsZSBmb3IgTGludXggUEhZIGRyaXZlcnMgYW5kIE1ESU8gYnVzIGRyaXZlcnMKIAogbGlicGh5LXkJCQk6PSBwaHkubyBwaHlfZGV2aWNlLm8gbWRpb19idXMubyBtZGlvX2RldmljZS5vCiBsaWJwaHktJChDT05GSUdfU1dQSFkpCQkrPSBzd3BoeS5vCiAKIG9iai0kKENPTkZJR19QSFlMSUIpCQkrPSBsaWJwaHkubworCitvYmotJChDT05GSUdfTURJT19CQ01fSVBST0MpCSs9IG1kaW8tYmNtLWlwcm9jLm8KK29iai0kKENPTkZJR19NRElPX0JDTV9VTklNQUMpCSs9IG1kaW8tYmNtLXVuaW1hYy5vCitvYmotJChDT05GSUdfTURJT19CSVRCQU5HKQkrPSBtZGlvLWJpdGJhbmcubworb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWCkJKz0gbWRpby1tdXgubworb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWF9CQ01fSVBST0MpCSs9IG1kaW8tbXV4LWJjbS1pcHJvYy5vCitvYmotJChDT05GSUdfTURJT19CVVNfTVVYX0dQSU8pCSs9IG1kaW8tbXV4LWdwaW8ubworb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWF9NTUlPUkVHKSArPSBtZGlvLW11eC1tbWlvcmVnLm8KK29iai0kKENPTkZJR19NRElPX0NBVklVTSkJKz0gbWRpby1jYXZpdW0ubworb2JqLSQoQ09ORklHX01ESU9fR1BJTykJCSs9IG1kaW8tZ3Bpby5vCitvYmotJChDT05GSUdfTURJT19ISVNJX0ZFTUFDKQkrPSBtZGlvLWhpc2ktZmVtYWMubworb2JqLSQoQ09ORklHX01ESU9fTU9YQVJUKQkrPSBtZGlvLW1veGFydC5vCitvYmotJChDT05GSUdfTURJT19PQ1RFT04pCSs9IG1kaW8tb2N0ZW9uLm8KK29iai0kKENPTkZJR19NRElPX1NVTjRJKQkrPSBtZGlvLXN1bjRpLm8KK29iai0kKENPTkZJR19NRElPX1RIVU5ERVIpCSs9IG1kaW8tdGh1bmRlci5vCitvYmotJChDT05GSUdfTURJT19YR0VORSkJKz0gbWRpby14Z2VuZS5vCisKK29iai0kKENPTkZJR19BTURfUEhZKQkJKz0gYW1kLm8KIG9iai0kKENPTkZJR19BUVVBTlRJQV9QSFkpCSs9IGFxdWFudGlhLm8KLW9iai0kKENPTkZJR19NQVJWRUxMX1BIWSkJKz0gbWFydmVsbC5vCi1vYmotJChDT05GSUdfREFWSUNPTV9QSFkpCSs9IGRhdmljb20ubwotb2JqLSQoQ09ORklHX0NJQ0FEQV9QSFkpCSs9IGNpY2FkYS5vCi1vYmotJChDT05GSUdfTFhUX1BIWSkJCSs9IGx4dC5vCi1vYmotJChDT05GSUdfUVNFTUlfUEhZKQkJKz0gcXNlbWkubwotb2JqLSQoQ09ORklHX1NNU0NfUEhZKQkJKz0gc21zYy5vCi1vYmotJChDT05GSUdfVEVSQU5FVElDU19QSFkpCSs9IHRlcmFuZXRpY3Mubwotb2JqLSQoQ09ORklHX1ZJVEVTU0VfUEhZKQkrPSB2aXRlc3NlLm8KLW9iai0kKENPTkZJR19CQ01fTkVUX1BIWUxJQikJKz0gYmNtLXBoeS1saWIubwotb2JqLSQoQ09ORklHX0JST0FEQ09NX1BIWSkJKz0gYnJvYWRjb20ubworb2JqLSQoQ09ORklHX0FUODAzWF9QSFkpCSs9IGF0ODAzeC5vCiBvYmotJChDT05GSUdfQkNNNjNYWF9QSFkpCSs9IGJjbTYzeHgubwogb2JqLSQoQ09ORklHX0JDTTdYWFhfUEhZKQkrPSBiY203eHh4Lm8KIG9iai0kKENPTkZJR19CQ004N1hYX1BIWSkJKz0gYmNtODd4eC5vCiBvYmotJChDT05GSUdfQkNNX0NZR05VU19QSFkpCSs9IGJjbS1jeWdudXMubwotb2JqLSQoQ09ORklHX0lDUExVU19QSFkpCSs9IGljcGx1cy5vCi1vYmotJChDT05GSUdfUkVBTFRFS19QSFkpCSs9IHJlYWx0ZWsubwotb2JqLSQoQ09ORklHX0xTSV9FVDEwMTFDX1BIWSkJKz0gZXQxMDExYy5vCi1vYmotJChDT05GSUdfRklYRURfUEhZKQkJKz0gZml4ZWRfcGh5Lm8KLW9iai0kKENPTkZJR19NRElPX0JJVEJBTkcpCSs9IG1kaW8tYml0YmFuZy5vCi1vYmotJChDT05GSUdfTURJT19HUElPKQkJKz0gbWRpby1ncGlvLm8KLW9iai0kKENPTkZJR19OQVRJT05BTF9QSFkpCSs9IG5hdGlvbmFsLm8KK29iai0kKENPTkZJR19CQ01fTkVUX1BIWUxJQikJKz0gYmNtLXBoeS1saWIubworb2JqLSQoQ09ORklHX0JST0FEQ09NX1BIWSkJKz0gYnJvYWRjb20ubworb2JqLSQoQ09ORklHX0NJQ0FEQV9QSFkpCSs9IGNpY2FkYS5vCitvYmotJChDT05GSUdfREFWSUNPTV9QSFkpCSs9IGRhdmljb20ubwogb2JqLSQoQ09ORklHX0RQODM2NDBfUEhZKQkrPSBkcDgzNjQwLm8KIG9iai0kKENPTkZJR19EUDgzODQ4X1BIWSkJKz0gZHA4Mzg0OC5vCiBvYmotJChDT05GSUdfRFA4Mzg2N19QSFkpCSs9IGRwODM4Njcubwotb2JqLSQoQ09ORklHX1NURTEwWFApCQkrPSBzdGUxMFhwLm8KLW9iai0kKENPTkZJR19NSUNSRUxfUEhZKQkrPSBtaWNyZWwubwotb2JqLSQoQ09ORklHX01ESU9fT0NURU9OKQkrPSBtZGlvLW9jdGVvbi5vCi1vYmotJChDT05GSUdfTURJT19USFVOREVSKQkrPSBtZGlvLXRodW5kZXIubwotb2JqLSQoQ09ORklHX01ESU9fQ0FWSVVNKQkrPSBtZGlvLWNhdml1bS5vCi1vYmotJChDT05GSUdfTUlDUkVMX0tTODk5NU1BKQkrPSBzcGlfa3M4OTk1Lm8KLW9iai0kKENPTkZJR19BVDgwM1hfUEhZKQkrPSBhdDgwM3gubwotb2JqLSQoQ09ORklHX0FNRF9QSFkpCQkrPSBhbWQubwotb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWCkJKz0gbWRpby1tdXgubwotb2JqLSQoQ09ORklHX01ESU9fQlVTX01VWF9HUElPKQkrPSBtZGlvLW11eC1ncGlvLm8KLW9iai0kKENPTkZJR19NRElPX0JVU19NVVhfTU1JT1JFRykgKz0gbWRpby1tdXgtbW1pb3JlZy5vCi1vYmotJChDT05GSUdfTURJT19CVVNfTVVYX0JDTV9JUFJPQykJKz0gbWRpby1tdXgtYmNtLWlwcm9jLm8KLW9iai0kKENPTkZJR19NRElPX1NVTjRJKQkrPSBtZGlvLXN1bjRpLm8KLW9iai0kKENPTkZJR19NRElPX01PWEFSVCkJKz0gbWRpby1tb3hhcnQubwotb2JqLSQoQ09ORklHX01ESU9fQkNNX1VOSU1BQykJKz0gbWRpby1iY20tdW5pbWFjLm8KLW9iai0kKENPTkZJR19NSUNST0NISVBfUEhZKQkrPSBtaWNyb2NoaXAubwotb2JqLSQoQ09ORklHX01ESU9fQkNNX0lQUk9DKQkrPSBtZGlvLWJjbS1pcHJvYy5vCitvYmotJChDT05GSUdfRklYRURfUEhZKQkJKz0gZml4ZWRfcGh5Lm8KK29iai0kKENPTkZJR19JQ1BMVVNfUEhZKQkrPSBpY3BsdXMubwogb2JqLSQoQ09ORklHX0lOVEVMX1hXQVlfUEhZKQkrPSBpbnRlbC14d2F5Lm8KLW9iai0kKENPTkZJR19NRElPX0hJU0lfRkVNQUMpCSs9IG1kaW8taGlzaS1mZW1hYy5vCi1vYmotJChDT05GSUdfTURJT19YR0VORSkJKz0gbWRpby14Z2VuZS5vCitvYmotJChDT05GSUdfTFNJX0VUMTAxMUNfUEhZKQkrPSBldDEwMTFjLm8KK29iai0kKENPTkZJR19MWFRfUEhZKQkJKz0gbHh0Lm8KK29iai0kKENPTkZJR19NQVJWRUxMX1BIWSkJKz0gbWFydmVsbC5vCitvYmotJChDT05GSUdfTUlDUkVMX0tTODk5NU1BKQkrPSBzcGlfa3M4OTk1Lm8KK29iai0kKENPTkZJR19NSUNSRUxfUEhZKQkrPSBtaWNyZWwubworb2JqLSQoQ09ORklHX01JQ1JPQ0hJUF9QSFkpCSs9IG1pY3JvY2hpcC5vCitvYmotJChDT05GSUdfTUlDUk9TRU1JX1BIWSkJKz0gbXNjYy5vCitvYmotJChDT05GSUdfTkFUSU9OQUxfUEhZKQkrPSBuYXRpb25hbC5vCitvYmotJChDT05GSUdfUVNFTUlfUEhZKQkJKz0gcXNlbWkubworb2JqLSQoQ09ORklHX1JFQUxURUtfUEhZKQkrPSByZWFsdGVrLm8KK29iai0kKENPTkZJR19TTVNDX1BIWSkJCSs9IHNtc2Mubworb2JqLSQoQ09ORklHX1NURTEwWFApCQkrPSBzdGUxMFhwLm8KK29iai0kKENPTkZJR19URVJBTkVUSUNTX1BIWSkJKz0gdGVyYW5ldGljcy5vCitvYmotJChDT05GSUdfVklURVNTRV9QSFkpCSs9IHZpdGVzc2Uubworb2JqLSQoQ09ORklHX1hJTElOWF9HTUlJMlJHTUlJKSArPSB4aWxpbnhfZ21paTJyZ21paS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWRpby14Z2VuZS5jIGIvZHJpdmVycy9uZXQvcGh5L21kaW8teGdlbmUuYwppbmRleCA3NzU2NzQ4Li45MmFmMTgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpby14Z2VuZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLXhnZW5lLmMKQEAgLTQyNCwxMCArNDI0LDggQEAKIAltZGlvYnVzX3VucmVnaXN0ZXIobWRpb19idXMpOwogCW1kaW9idXNfZnJlZShtZGlvX2J1cyk7CiAKLQlpZiAoZGV2LT5vZl9ub2RlKSB7Ci0JCWlmIChJU19FUlIocGRhdGEtPmNsaykpCi0JCQljbGtfZGlzYWJsZV91bnByZXBhcmUocGRhdGEtPmNsayk7Ci0JfQorCWlmIChkZXYtPm9mX25vZGUpCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwZGF0YS0+Y2xrKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21pY3JlbC5jIGIvZHJpdmVycy9uZXQvcGh5L21pY3JlbC5jCmluZGV4IDA1M2U4NzkuLjA4MWRmNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9taWNyZWwuYworKysgYi9kcml2ZXJzL25ldC9waHkvbWljcmVsLmMKQEAgLTQzOSw2ICs0MzksMTAgQEAKICNkZWZpbmUgTUlJX0tTWjkwMzFSTl9UWF9EQVRBX1BBRF9TS0VXCTYKICNkZWZpbmUgTUlJX0tTWjkwMzFSTl9DTEtfUEFEX1NLRVcJOAogCisvKiBNTUQgQWRkcmVzcyAweDFDICovCisjZGVmaW5lIE1JSV9LU1o5MDMxUk5fRURQRAkJMHgyMworI2RlZmluZSBNSUlfS1NaOTAzMVJOX0VEUERfRU5BQkxFCUJJVCgwKQorCiBzdGF0aWMgaW50IGtzejkwMzFfZXh0ZW5kZWRfd3JpdGUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKIAkJCQkgIHU4IG1vZGUsIHUzMiBkZXZfYWRkciwgdTMyIHJlZ251bSwgdTE2IHZhbCkKIHsKQEAgLTUxMCw2ICs1MTQsMTggQEAKIAlyZXR1cm4gZ2VucGh5X3Jlc3RhcnRfYW5lZyhwaHlkZXYpOwogfQogCisvKiBFbmFibGUgZW5lcmd5LWRldGVjdCBwb3dlci1kb3duIG1vZGUgKi8KK3N0YXRpYyBpbnQga3N6OTAzMV9lbmFibGVfZWRwZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByZWc7CisKKwlyZWcgPSBrc3o5MDMxX2V4dGVuZGVkX3JlYWQocGh5ZGV2LCBPUF9EQVRBLCAweDFDLCBNSUlfS1NaOTAzMVJOX0VEUEQpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCXJldHVybiBrc3o5MDMxX2V4dGVuZGVkX3dyaXRlKHBoeWRldiwgT1BfREFUQSwgMHgxQywgTUlJX0tTWjkwMzFSTl9FRFBELAorCQkJCSAgICAgIHJlZyB8IE1JSV9LU1o5MDMxUk5fRURQRF9FTkFCTEUpOworfQorCiBzdGF0aWMgaW50IGtzejkwMzFfY29uZmlnX2luaXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKIAljb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGh5ZGV2LT5tZGlvLmRldjsKQEAgLTUyNSw2ICs1NDEsMTEgQEAKIAl9OwogCXN0YXRpYyBjb25zdCBjaGFyICpjb250cm9sX3NrZXdzWzJdID0geyJ0eGVuLXNrZXctcHMiLCAicnhkdi1za2V3LXBzIn07CiAJY29uc3Qgc3RydWN0IGRldmljZSAqZGV2X3dhbGtlcjsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0ga3N6OTAzMV9lbmFibGVfZWRwZChwaHlkZXYpOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gcmVzdWx0OwogCiAJLyogVGhlIE1pY3JlbCBkcml2ZXIgaGFzIGEgZGVwcmVjYXRlZCBvcHRpb24gdG8gcGxhY2UgcGh5IE9GCiAJICogcHJvcGVydGllcyBpbiB0aGUgTUFDIG5vZGUuIFdhbGsgdXAgdGhlIHRyZWUgb2YgZGV2aWNlcyB0bwpAQCAtOTY0LDcgKzk4NSw3IEBACiAJLmdldF9zdHJpbmdzCT0ga3N6cGh5X2dldF9zdHJpbmdzLAogCS5nZXRfc3RhdHMJPSBrc3pwaHlfZ2V0X3N0YXRzLAogCS5zdXNwZW5kCT0gZ2VucGh5X3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBnZW5waHlfcmVzdW1lLAorCS5yZXN1bWUJCT0ga3N6cGh5X3Jlc3VtZSwKIH0sIHsKIAkucGh5X2lkCQk9IFBIWV9JRF9LU1o4ODczTUxMLAogCS5waHlfaWRfbWFzawk9IE1JQ1JFTF9QSFlfSURfTUFTSywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9taWNyb2NoaXAuYyBiL2RyaXZlcnMvbmV0L3BoeS9taWNyb2NoaXAuYwppbmRleCAxNWY4MjA2Li43YzAwZTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWljcm9jaGlwLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L21pY3JvY2hpcC5jCkBAIC01NSw3ICs1NSw3IEBACiAJcmV0dXJuIHJjIDwgMCA/IHJjIDogMDsKIH0KIAotaW50IGxhbjg4eHhfc3VzcGVuZChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQorc3RhdGljIGludCBsYW44OHh4X3N1c3BlbmQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKIAlzdHJ1Y3QgbGFuODh4eF9wcml2ICpwcml2ID0gcGh5ZGV2LT5wcml2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbXNjYy5jIGIvZHJpdmVycy9uZXQvcGh5L21zY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTc1NzNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvcGh5L21zY2MuYwpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIERyaXZlciBmb3IgTWljcm9zZW1pIFZTQzg1eHggUEhZcworICoKKyAqIEF1dGhvcjogTmFnYXJhanUgTGFra2FyYWp1CisgKiBMaWNlbnNlOiBEdWFsIE1JVC9HUEwKKyAqIENvcHlyaWdodCAoYykgMjAxNiBNaWNyb3NlbWkgQ29ycG9yYXRpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvbmV0L21zY2MtcGh5LXZzYzg1MzEuaD4KKworZW51bSByZ21paV9yeF9jbG9ja19kZWxheSB7CisJUkdNSUlfUlhfQ0xLX0RFTEFZXzBfMl9OUyA9IDAsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzBfOF9OUyA9IDEsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzFfMV9OUyA9IDIsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzFfN19OUyA9IDMsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzJfMF9OUyA9IDQsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzJfM19OUyA9IDUsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzJfNl9OUyA9IDYsCisJUkdNSUlfUlhfQ0xLX0RFTEFZXzNfNF9OUyA9IDcKK307CisKKy8qIE1pY3Jvc2VtaSBWU0M4NXh4IFBIWSByZWdpc3RlcnMgKi8KKy8qIElFRUUgODAyLiBTdGQgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1TQ0NfUEhZX0VYVF9QSFlfQ05UTF8xICAgICAgICAgICAyMworI2RlZmluZSBNQUNfSUZfU0VMRUNUSU9OX01BU0sgICAgICAgICAgICAgMHgxODAwCisjZGVmaW5lIE1BQ19JRl9TRUxFQ1RJT05fR01JSSAgICAgICAgICAgICAwCisjZGVmaW5lIE1BQ19JRl9TRUxFQ1RJT05fUk1JSSAgICAgICAgICAgICAxCisjZGVmaW5lIE1BQ19JRl9TRUxFQ1RJT05fUkdNSUkgICAgICAgICAgICAyCisjZGVmaW5lIE1BQ19JRl9TRUxFQ1RJT05fUE9TICAgICAgICAgICAgICAxMQorI2RlZmluZSBGQVJfRU5EX0xPT1BCQUNLX01PREVfTUFTSyAgICAgICAgMHgwMDA4CisKKyNkZWZpbmUgTUlJX1ZTQzg1WFhfSU5UX01BU0sJCSAgMjUKKyNkZWZpbmUgTUlJX1ZTQzg1WFhfSU5UX01BU0tfTUFTSwkgIDB4YTAwMAorI2RlZmluZSBNSUlfVlNDODVYWF9JTlRfU1RBVFVTCQkgIDI2CisKKyNkZWZpbmUgTVNDQ19QSFlfV09MX01BQ19DT05UUk9MICAgICAgICAgIDI3CisjZGVmaW5lIEVER0VfUkFURV9DTlRMX1BPUyAgICAgICAgICAgICAgICA1CisjZGVmaW5lIEVER0VfUkFURV9DTlRMX01BU0sgICAgICAgICAgICAgICAweDAwRTAKKworI2RlZmluZSBNU0NDX0VYVF9QQUdFX0FDQ0VTUwkJICAzMQorI2RlZmluZSBNU0NDX1BIWV9QQUdFX1NUQU5EQVJECQkgIDB4MDAwMCAvKiBTdGFuZGFyZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVNDQ19QSFlfUEFHRV9FWFRFTkRFRF8yCSAgMHgwMDAyIC8qIEV4dGVuZGVkIHJlZyAtIHBhZ2UgMiAqLworCisvKiBFeHRlbmRlZCBQYWdlIDIgUmVnaXN0ZXJzICovCisjZGVmaW5lIE1TQ0NfUEhZX1JHTUlJX0NOVEwJCSAgMjAKKyNkZWZpbmUgUkdNSUlfUlhfQ0xLX0RFTEFZX01BU0sJCSAgMHgwMDcwCisjZGVmaW5lIFJHTUlJX1JYX0NMS19ERUxBWV9QT1MJCSAgNAorCisvKiBNaWNyb3NlbWkgUEhZIElEJ3MgKi8KKyNkZWZpbmUgUEhZX0lEX1ZTQzg1MzEJCQkgIDB4MDAwNzA1NzAKKyNkZWZpbmUgUEhZX0lEX1ZTQzg1NDEJCQkgIDB4MDAwNzA3NzAKKworc3RydWN0IGVkZ2VfcmF0ZV90YWJsZSB7CisJdTE2IHZkZG1hYzsKKwlpbnQgc2xvd2Rvd25bTVNDQ19TTE9XRE9XTl9NQVhdOworfTsKKworc3RydWN0IGVkZ2VfcmF0ZV90YWJsZSBlZGdlX3RhYmxlW01TQ0NfVkRETUFDX01BWF0gPSB7CisJezMzMDAsIHsgMCwgLTIsIC00LCAgLTcsICAtMTAsIC0xNywgLTI5LCAtNTN9IH0sCisJezI1MDAsIHsgMCwgLTMsIC02LCAgLTEwLCAtMTQsIC0yMywgLTM3LCAtNjN9IH0sCisJezE4MDAsIHsgMCwgLTUsIC05LCAgLTE2LCAtMjMsIC0zNSwgLTUyLCAtNzZ9IH0sCisJezE1MDAsIHsgMCwgLTYsIC0xNCwgLTIxLCAtMjksIC00MiwgLTU4LCAtNzd9IH0sCit9OworCitzdHJ1Y3QgdnNjODUzMV9wcml2YXRlIHsKKwl1OCBlZGdlX3Nsb3dkb3duOworCXUxNiB2ZGRtYWM7Cit9OworCitzdGF0aWMgaW50IHZzYzg1eHhfcGh5X3BhZ2Vfc2V0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsIHU4IHBhZ2UpCit7CisJaW50IHJjOworCisJcmMgPSBwaHlfd3JpdGUocGh5ZGV2LCBNU0NDX0VYVF9QQUdFX0FDQ0VTUywgcGFnZSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdTggZWRnZV9yYXRlX21hZ2ljX2dldCh1MTYgdmRkbWFjLAorCQkJICAgICAgaW50IHNsb3dkb3duKQoreworCWludCByYyA9IChNU0NDX1NMT1dET1dOX01BWCAtIDEpOworCXU4IHZkZDsKKwl1OCBzZDsKKworCWZvciAodmRkID0gMDsgdmRkIDwgTVNDQ19WRERNQUNfTUFYOyB2ZGQrKykgeworCQlpZiAoZWRnZV90YWJsZVt2ZGRdLnZkZG1hYyA9PSB2ZGRtYWMpIHsKKwkJCWZvciAoc2QgPSAwOyBzZCA8IE1TQ0NfU0xPV0RPV05fTUFYOyBzZCsrKSB7CisJCQkJaWYgKGVkZ2VfdGFibGVbdmRkXS5zbG93ZG93bltzZF0gPD0gc2xvd2Rvd24pIHsKKwkJCQkJcmMgPSAoTVNDQ19TTE9XRE9XTl9NQVggLSBzZCAtIDEpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdnNjODV4eF9lZGdlX3JhdGVfY250bF9zZXQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKKwkJCQkgICAgICB1OCBlZGdlX3JhdGUpCit7CisJaW50IHJjOworCXUxNiByZWdfdmFsOworCisJbXV0ZXhfbG9jaygmcGh5ZGV2LT5sb2NrKTsKKwlyYyA9IHZzYzg1eHhfcGh5X3BhZ2Vfc2V0KHBoeWRldiwgTVNDQ19QSFlfUEFHRV9FWFRFTkRFRF8yKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXRfdW5sb2NrOworCXJlZ192YWwgPSBwaHlfcmVhZChwaHlkZXYsIE1TQ0NfUEhZX1dPTF9NQUNfQ09OVFJPTCk7CisJcmVnX3ZhbCAmPSB+KEVER0VfUkFURV9DTlRMX01BU0spOworCXJlZ192YWwgfD0gKGVkZ2VfcmF0ZSA8PCBFREdFX1JBVEVfQ05UTF9QT1MpOworCXJjID0gcGh5X3dyaXRlKHBoeWRldiwgTVNDQ19QSFlfV09MX01BQ19DT05UUk9MLCByZWdfdmFsKTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBvdXRfdW5sb2NrOworCXJjID0gdnNjODV4eF9waHlfcGFnZV9zZXQocGh5ZGV2LCBNU0NDX1BIWV9QQUdFX1NUQU5EQVJEKTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJnBoeWRldi0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdnNjODV4eF9tYWNfaWZfc2V0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsCisJCQkgICAgICBwaHlfaW50ZXJmYWNlX3QgaW50ZXJmYWNlKQoreworCWludCByYzsKKwl1MTYgcmVnX3ZhbDsKKworCW11dGV4X2xvY2soJnBoeWRldi0+bG9jayk7CisJcmVnX3ZhbCA9IHBoeV9yZWFkKHBoeWRldiwgTVNDQ19QSFlfRVhUX1BIWV9DTlRMXzEpOworCXJlZ192YWwgJj0gfihNQUNfSUZfU0VMRUNUSU9OX01BU0spOworCXN3aXRjaCAoaW50ZXJmYWNlKSB7CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUk6CisJCXJlZ192YWwgfD0gKE1BQ19JRl9TRUxFQ1RJT05fUkdNSUkgPDwgTUFDX0lGX1NFTEVDVElPTl9QT1MpOworCQlicmVhazsKKwljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJOgorCQlyZWdfdmFsIHw9IChNQUNfSUZfU0VMRUNUSU9OX1JNSUkgPDwgTUFDX0lGX1NFTEVDVElPTl9QT1MpOworCQlicmVhazsKKwljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9NSUk6CisJY2FzZSBQSFlfSU5URVJGQUNFX01PREVfR01JSToKKwkJcmVnX3ZhbCB8PSAoTUFDX0lGX1NFTEVDVElPTl9HTUlJIDw8IE1BQ19JRl9TRUxFQ1RJT05fUE9TKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXJjID0gcGh5X3dyaXRlKHBoeWRldiwgTVNDQ19QSFlfRVhUX1BIWV9DTlRMXzEsIHJlZ192YWwpOworCWlmIChyYyAhPSAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlyYyA9IGdlbnBoeV9zb2Z0X3Jlc2V0KHBoeWRldik7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZwaHlkZXYtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZzYzg1eHhfZGVmYXVsdF9jb25maWcoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgcmM7CisJdTE2IHJlZ192YWw7CisKKwltdXRleF9sb2NrKCZwaHlkZXYtPmxvY2spOworCXJjID0gdnNjODV4eF9waHlfcGFnZV9zZXQocGh5ZGV2LCBNU0NDX1BIWV9QQUdFX0VYVEVOREVEXzIpOworCWlmIChyYyAhPSAwKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlyZWdfdmFsID0gcGh5X3JlYWQocGh5ZGV2LCBNU0NDX1BIWV9SR01JSV9DTlRMKTsKKwlyZWdfdmFsICY9IH4oUkdNSUlfUlhfQ0xLX0RFTEFZX01BU0spOworCXJlZ192YWwgfD0gKFJHTUlJX1JYX0NMS19ERUxBWV8xXzFfTlMgPDwgUkdNSUlfUlhfQ0xLX0RFTEFZX1BPUyk7CisJcGh5X3dyaXRlKHBoeWRldiwgTVNDQ19QSFlfUkdNSUlfQ05UTCwgcmVnX3ZhbCk7CisJcmMgPSB2c2M4NXh4X3BoeV9wYWdlX3NldChwaHlkZXYsIE1TQ0NfUEhZX1BBR0VfU1RBTkRBUkQpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmcGh5ZGV2LT5sb2NrKTsKKworCXJldHVybiByYzsKK30KKworI2lmZGVmIENPTkZJR19PRl9NRElPCitzdGF0aWMgaW50IHZzYzg1MzFfb2ZfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByYzsKKwlzdHJ1Y3QgdnNjODUzMV9wcml2YXRlICp2c2M4NTMxID0gcGh5ZGV2LT5wcml2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwaHlkZXYtPm1kaW8uZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IGRldi0+b2Zfbm9kZTsKKworCWlmICghb2Zfbm9kZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTE2KG9mX25vZGUsICJ2c2M4NTMxLHZkZG1hYyIsCisJCQkJICAmdnNjODUzMS0+dmRkbWFjKTsKKwlpZiAocmMgPT0gLUVJTlZBTCkKKwkJdnNjODUzMS0+dmRkbWFjID0gTVNDQ19WRERNQUNfMzMwMDsKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTgob2Zfbm9kZSwgInZzYzg1MzEsZWRnZS1zbG93ZG93biIsCisJCQkJICZ2c2M4NTMxLT5lZGdlX3Nsb3dkb3duKTsKKwlpZiAocmMgPT0gLUVJTlZBTCkKKwkJdnNjODUzMS0+ZWRnZV9zbG93ZG93biA9IDA7CisKKwlyYyA9IDA7CisJcmV0dXJuIHJjOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgdnNjODUzMV9vZl9pbml0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX09GX01ESU8gKi8KKworc3RhdGljIGludCB2c2M4NXh4X2NvbmZpZ19pbml0KHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJaW50IHJjOworCXN0cnVjdCB2c2M4NTMxX3ByaXZhdGUgKnZzYzg1MzEgPSBwaHlkZXYtPnByaXY7CisJdTggZWRnZV9yYXRlOworCisJcmMgPSB2c2M4NTMxX29mX2luaXQocGh5ZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gdnNjODV4eF9kZWZhdWx0X2NvbmZpZyhwaHlkZXYpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSB2c2M4NXh4X21hY19pZl9zZXQocGh5ZGV2LCBwaHlkZXYtPmludGVyZmFjZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwllZGdlX3JhdGUgPSBlZGdlX3JhdGVfbWFnaWNfZ2V0KHZzYzg1MzEtPnZkZG1hYywKKwkJCQkJLShpbnQpdnNjODUzMS0+ZWRnZV9zbG93ZG93bik7CisJcmMgPSB2c2M4NXh4X2VkZ2VfcmF0ZV9jbnRsX3NldChwaHlkZXYsIGVkZ2VfcmF0ZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGdlbnBoeV9jb25maWdfaW5pdChwaHlkZXYpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZzYzg1eHhfYWNrX2ludGVycnVwdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCByYyA9IDA7CisKKwlpZiAocGh5ZGV2LT5pbnRlcnJ1cHRzID09IFBIWV9JTlRFUlJVUFRfRU5BQkxFRCkKKwkJcmMgPSBwaHlfcmVhZChwaHlkZXYsIE1JSV9WU0M4NVhYX0lOVF9TVEFUVVMpOworCisJcmV0dXJuIChyYyA8IDApID8gcmMgOiAwOworfQorCitzdGF0aWMgaW50IHZzYzg1eHhfY29uZmlnX2ludHIoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgcmM7CisKKwlpZiAocGh5ZGV2LT5pbnRlcnJ1cHRzID09IFBIWV9JTlRFUlJVUFRfRU5BQkxFRCkgeworCQlyYyA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV9WU0M4NVhYX0lOVF9NQVNLLAorCQkJICAgICAgIE1JSV9WU0M4NVhYX0lOVF9NQVNLX01BU0spOworCX0gZWxzZSB7CisJCXJjID0gcGh5X3dyaXRlKHBoeWRldiwgTUlJX1ZTQzg1WFhfSU5UX01BU0ssIDApOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCQlyYyA9IHBoeV9yZWFkKHBoeWRldiwgTUlJX1ZTQzg1WFhfSU5UX1NUQVRVUyk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHZzYzg1eHhfcHJvYmUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlzdHJ1Y3QgdnNjODUzMV9wcml2YXRlICp2c2M4NTMxOworCisJdnNjODUzMSA9IGRldm1fa3phbGxvYygmcGh5ZGV2LT5tZGlvLmRldiwgc2l6ZW9mKCp2c2M4NTMxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2c2M4NTMxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBoeWRldi0+cHJpdiA9IHZzYzg1MzE7CisKKwlyZXR1cm4gMDsKK30KKworLyogTWljcm9zZW1pIFZTQzg1eHggUEhZcyAqLworc3RhdGljIHN0cnVjdCBwaHlfZHJpdmVyIHZzYzg1eHhfZHJpdmVyW10gPSB7Cit7CisJLnBoeV9pZAkJPSBQSFlfSURfVlNDODUzMSwKKwkubmFtZQkJPSAiTWljcm9zZW1pIFZTQzg1MzEiLAorCS5waHlfaWRfbWFzayAgICA9IDB4ZmZmZmZmZjAsCisJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMsCisJLmZsYWdzCQk9IFBIWV9IQVNfSU5URVJSVVBULAorCS5zb2Z0X3Jlc2V0CT0gJmdlbnBoeV9zb2Z0X3Jlc2V0LAorCS5jb25maWdfaW5pdCAgICA9ICZ2c2M4NXh4X2NvbmZpZ19pbml0LAorCS5jb25maWdfYW5lZyAgICA9ICZnZW5waHlfY29uZmlnX2FuZWcsCisJLmFuZWdfZG9uZQk9ICZnZW5waHlfYW5lZ19kb25lLAorCS5yZWFkX3N0YXR1cyAgICA9ICZnZW5waHlfcmVhZF9zdGF0dXMsCisJLmFja19pbnRlcnJ1cHQgID0gJnZzYzg1eHhfYWNrX2ludGVycnVwdCwKKwkuY29uZmlnX2ludHIgICAgPSAmdnNjODV4eF9jb25maWdfaW50ciwKKwkuc3VzcGVuZAk9ICZnZW5waHlfc3VzcGVuZCwKKwkucmVzdW1lCQk9ICZnZW5waHlfcmVzdW1lLAorCS5wcm9iZSAgICAgICAgICA9ICZ2c2M4NXh4X3Byb2JlLAorfSwKK3sKKwkucGh5X2lkCQk9IFBIWV9JRF9WU0M4NTQxLAorCS5uYW1lCQk9ICJNaWNyb3NlbWkgVlNDODU0MSBTeW5jRSIsCisJLnBoeV9pZF9tYXNrICAgID0gMHhmZmZmZmZmMCwKKwkuZmVhdHVyZXMJPSBQSFlfR0JJVF9GRUFUVVJFUywKKwkuZmxhZ3MJCT0gUEhZX0hBU19JTlRFUlJVUFQsCisJLnNvZnRfcmVzZXQJPSAmZ2VucGh5X3NvZnRfcmVzZXQsCisJLmNvbmZpZ19pbml0ICAgID0gJnZzYzg1eHhfY29uZmlnX2luaXQsCisJLmNvbmZpZ19hbmVnICAgID0gJmdlbnBoeV9jb25maWdfYW5lZywKKwkuYW5lZ19kb25lCT0gJmdlbnBoeV9hbmVnX2RvbmUsCisJLnJlYWRfc3RhdHVzICAgID0gJmdlbnBoeV9yZWFkX3N0YXR1cywKKwkuYWNrX2ludGVycnVwdCAgPSAmdnNjODV4eF9hY2tfaW50ZXJydXB0LAorCS5jb25maWdfaW50ciAgICA9ICZ2c2M4NXh4X2NvbmZpZ19pbnRyLAorCS5zdXNwZW5kCT0gJmdlbnBoeV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gJmdlbnBoeV9yZXN1bWUsCisJLnByb2JlICAgICAgICAgID0gJnZzYzg1eHhfcHJvYmUsCit9CisKK307CisKK21vZHVsZV9waHlfZHJpdmVyKHZzYzg1eHhfZHJpdmVyKTsKKworc3RhdGljIHN0cnVjdCBtZGlvX2RldmljZV9pZCBfX21heWJlX3VudXNlZCB2c2M4NXh4X3RibFtdID0geworCXsgUEhZX0lEX1ZTQzg1MzEsIDB4ZmZmZmZmZjAsIH0sCisJeyBQSFlfSURfVlNDODU0MSwgMHhmZmZmZmZmMCwgfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUobWRpbywgdnNjODV4eF90YmwpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk1pY3Jvc2VtaSBWU0M4NXh4IFBIWSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk5hZ2FyYWp1IExha2thcmFqdSIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgTUlUL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3BoeS5jIGIvZHJpdmVycy9uZXQvcGh5L3BoeS5jCmluZGV4IGM1ZGMyYzM2Li5jNmY2NjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L3BoeS5jCkBAIC03MjIsOCArNzIyLDEwIEBACiBpbnQgcGh5X3N0YXJ0X2ludGVycnVwdHMoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKIAlhdG9taWNfc2V0KCZwaHlkZXYtPmlycV9kaXNhYmxlLCAwKTsKLQlpZiAocmVxdWVzdF9pcnEocGh5ZGV2LT5pcnEsIHBoeV9pbnRlcnJ1cHQsIDAsICJwaHlfaW50ZXJydXB0IiwKLQkJCXBoeWRldikgPCAwKSB7CisJaWYgKHJlcXVlc3RfaXJxKHBoeWRldi0+aXJxLCBwaHlfaW50ZXJydXB0LAorCQkJCUlSUUZfU0hBUkVELAorCQkJCSJwaHlfaW50ZXJydXB0IiwKKwkJCQlwaHlkZXYpIDwgMCkgewogCQlwcl93YXJuKCIlczogQ2FuJ3QgZ2V0IElSUSAlZCAoUEhZKVxuIiwKIAkJCXBoeWRldi0+bWRpby5idXMtPm5hbWUsIHBoeWRldi0+aXJxKTsKIAkJcGh5ZGV2LT5pcnEgPSBQSFlfUE9MTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS94aWxpbnhfZ21paTJyZ21paS5jIGIvZHJpdmVycy9uZXQvcGh5L3hpbGlueF9nbWlpMnJnbWlpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1ZGQzOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BoeS94aWxpbnhfZ21paTJyZ21paS5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiBYaWxpbnggR01JSTJSR01JSSBDb252ZXJ0ZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFhpbGlueCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDE2IEFuZHJldyBMdW5uIDxhbmRyZXdAbHVubi5jaD4KKyAqCisgKiBBdXRob3I6IEFuZHJldyBMdW5uIDxhbmRyZXdAbHVubi5jaD4KKyAqIEF1dGhvcjogS2VkYXJlc3dhcmEgcmFvIEFwcGFuYSA8YXBwYW5hZEB4aWxpbnguY29tPgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBkcml2ZXIgaXMgZGV2ZWxvcGVkIGZvciBYaWxpbnggR01JSTJSR01JSSBDb252ZXJ0ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgorCisjZGVmaW5lIFhJTElOWF9HTUlJMlJHTUlJX1JFRwkJMHgxMAorI2RlZmluZSBYSUxJTlhfR01JSTJSR01JSV9TUEVFRF9NQVNLCShCTUNSX1NQRUVEMTAwMCB8IEJNQ1JfU1BFRUQxMDApCisKK3N0cnVjdCBnbWlpMnJnbWlpIHsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5X2RldjsKKwlzdHJ1Y3QgcGh5X2RyaXZlciAqcGh5X2RydjsKKwlzdHJ1Y3QgcGh5X2RyaXZlciBjb252X3BoeV9kcnY7CisJaW50IGFkZHI7Cit9OworCitzdGF0aWMgaW50IHhnbWlpdG9yZ21paV9yZWFkX3N0YXR1cyhzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCXN0cnVjdCBnbWlpMnJnbWlpICpwcml2ID0gcGh5ZGV2LT5wcml2OworCXUxNiB2YWwgPSAwOworCisJcHJpdi0+cGh5X2Rydi0+cmVhZF9zdGF0dXMocGh5ZGV2KTsKKworCXZhbCA9IG1kaW9idXNfcmVhZChwaHlkZXYtPm1kaW8uYnVzLCBwcml2LT5hZGRyLCBYSUxJTlhfR01JSTJSR01JSV9SRUcpOworCXZhbCAmPSBYSUxJTlhfR01JSTJSR01JSV9TUEVFRF9NQVNLOworCisJaWYgKHBoeWRldi0+c3BlZWQgPT0gU1BFRURfMTAwMCkKKwkJdmFsIHw9IEJNQ1JfU1BFRUQxMDAwOworCWVsc2UgaWYgKHBoeWRldi0+c3BlZWQgPT0gU1BFRURfMTAwKQorCQl2YWwgfD0gQk1DUl9TUEVFRDEwMDsKKwllbHNlCisJCXZhbCB8PSBCTUNSX1NQRUVEMTA7CisKKwltZGlvYnVzX3dyaXRlKHBoeWRldi0+bWRpby5idXMsIHByaXYtPmFkZHIsIFhJTElOWF9HTUlJMlJHTUlJX1JFRywgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhnbWlpdG9yZ21paV9wcm9iZShzdHJ1Y3QgbWRpb19kZXZpY2UgKm1kaW9kZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJm1kaW9kZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlLCAqcGh5X25vZGU7CisJc3RydWN0IGdtaWkycmdtaWkgKnByaXY7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBoeV9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInBoeS1oYW5kbGUiLCAwKTsKKwlpZiAoIXBoeV9ub2RlKSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGRuJ3QgcGFyc2UgcGh5LWhhbmRsZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXByaXYtPnBoeV9kZXYgPSBvZl9waHlfZmluZF9kZXZpY2UocGh5X25vZGUpOworCW9mX25vZGVfcHV0KHBoeV9ub2RlKTsKKwlpZiAoIXByaXYtPnBoeV9kZXYpIHsKKwkJZGV2X2luZm8oZGV2LCAiQ291bGRuJ3QgZmluZCBwaHlkZXZcbiIpOworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwl9CisKKwlwcml2LT5hZGRyID0gbWRpb2Rldi0+YWRkcjsKKwlwcml2LT5waHlfZHJ2ID0gcHJpdi0+cGh5X2Rldi0+ZHJ2OworCW1lbWNweSgmcHJpdi0+Y29udl9waHlfZHJ2LCBwcml2LT5waHlfZGV2LT5kcnYsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgcGh5X2RyaXZlcikpOworCXByaXYtPmNvbnZfcGh5X2Rydi5yZWFkX3N0YXR1cyA9IHhnbWlpdG9yZ21paV9yZWFkX3N0YXR1czsKKwlwcml2LT5waHlfZGV2LT5wcml2ID0gcHJpdjsKKwlwcml2LT5waHlfZGV2LT5kcnYgPSAmcHJpdi0+Y29udl9waHlfZHJ2OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhnbWlpdG9yZ21paV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAieGxueCxnbWlpLXRvLXJnbWlpLTEuMCIgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4Z21paXRvcmdtaWlfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IG1kaW9fZHJpdmVyIHhnbWlpdG9yZ21paV9kcml2ZXIgPSB7CisJLnByb2JlCT0geGdtaWl0b3JnbWlpX3Byb2JlLAorCS5tZGlvZHJ2LmRyaXZlciA9IHsKKwkJLm5hbWUgPSAieGdtaWl0b3JnbWlpIiwKKwkJLm9mX21hdGNoX3RhYmxlID0geGdtaWl0b3JnbWlpX29mX21hdGNoLAorCX0sCit9OworCittZGlvX21vZHVsZV9kcml2ZXIoeGdtaWl0b3JnbWlpX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IEdNSUkyUkdNSUkgY29udmVydGVyIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwL3BwcF9nZW5lcmljLmMgYi9kcml2ZXJzL25ldC9wcHAvcHBwX2dlbmVyaWMuYwppbmRleCBmMjI2ZGI0Li41NDg5YzBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHAvcHBwX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL25ldC9wcHAvcHBwX2dlbmVyaWMuYwpAQCAtMTEwMyw2ICsxMTAzLDE1IEBACiAJfQogCiAJY29uZi5maWxlID0gZmlsZTsKKworCS8qIERvbid0IHVzZSBkZXZpY2UgbmFtZSBnZW5lcmF0ZWQgYnkgdGhlIHJ0bmV0bGluayBsYXllciB3aGVuIGlmbmFtZQorCSAqIGlzbid0IHNwZWNpZmllZC4gTGV0IHBwcF9kZXZfY29uZmlndXJlKCkgc2V0IHRoZSBkZXZpY2UgbmFtZSB1c2luZworCSAqIHRoZSBQUFAgdW5pdCBpZGVudGlmZXIgYXMgc3VmZml4IChpLmUuIHBwcDx1bml0X2lkPikuIFRoaXMgYWxsb3dzCisJICogdXNlcnNwYWNlIHRvIGluZmVyIHRoZSBkZXZpY2UgbmFtZSB1c2luZyB0byB0aGUgUFBQSU9DR1VOSVQgaW9jdGwuCisJICovCisJaWYgKCF0YltJRkxBX0lGTkFNRV0pCisJCWNvbmYuaWZuYW1lX2lzX3NldCA9IGZhbHNlOworCiAJZXJyID0gcHBwX2Rldl9jb25maWd1cmUoc3JjX25ldCwgZGV2LCAmY29uZik7CiAKIG91dF91bmxvY2s6CkBAIC0xMzU0LDYgKzEzNjMsOCBAQAogCWRldi0+bmV0ZGV2X29wcyA9ICZwcHBfbmV0ZGV2X29wczsKIAlTRVRfTkVUREVWX0RFVlRZUEUoZGV2LCAmcHBwX3R5cGUpOwogCisJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7CisKIAlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IFBQUF9IRFJMRU47CiAJZGV2LT5tdHUgPSBQUFBfTVJVOwogCWRldi0+YWRkcl9sZW4gPSAwOwpAQCAtMTM2NywxMiArMTM3OCw4IEBACiAgKiBUcmFuc21pdC1zaWRlIHJvdXRpbmVzLgogICovCiAKLS8qCi0gKiBDYWxsZWQgdG8gZG8gYW55IHdvcmsgcXVldWVkIHVwIG9uIHRoZSB0cmFuc21pdCBzaWRlCi0gKiB0aGF0IGNhbiBub3cgYmUgZG9uZS4KLSAqLwotc3RhdGljIHZvaWQKLXBwcF94bWl0X3Byb2Nlc3Moc3RydWN0IHBwcCAqcHBwKQorLyogQ2FsbGVkIHRvIGRvIGFueSB3b3JrIHF1ZXVlZCB1cCBvbiB0aGUgdHJhbnNtaXQgc2lkZSB0aGF0IGNhbiBub3cgYmUgZG9uZSAqLworc3RhdGljIHZvaWQgX19wcHBfeG1pdF9wcm9jZXNzKHN0cnVjdCBwcHAgKnBwcCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC0xMzkyLDYgKzEzOTksMzAgQEAKIAlwcHBfeG1pdF91bmxvY2socHBwKTsKIH0KIAorc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgcHBwX3htaXRfcmVjdXJzaW9uKTsKKworc3RhdGljIHZvaWQgcHBwX3htaXRfcHJvY2VzcyhzdHJ1Y3QgcHBwICpwcHApCit7CisJbG9jYWxfYmhfZGlzYWJsZSgpOworCisJaWYgKHVubGlrZWx5KF9fdGhpc19jcHVfcmVhZChwcHBfeG1pdF9yZWN1cnNpb24pKSkKKwkJZ290byBlcnI7CisKKwlfX3RoaXNfY3B1X2luYyhwcHBfeG1pdF9yZWN1cnNpb24pOworCV9fcHBwX3htaXRfcHJvY2VzcyhwcHApOworCV9fdGhpc19jcHVfZGVjKHBwcF94bWl0X3JlY3Vyc2lvbik7CisKKwlsb2NhbF9iaF9lbmFibGUoKTsKKworCXJldHVybjsKKworZXJyOgorCWxvY2FsX2JoX2VuYWJsZSgpOworCisJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJbmV0ZGV2X2VycihwcHAtPmRldiwgInJlY3Vyc2lvbiBkZXRlY3RlZFxuIik7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgogcGFkX2NvbXByZXNzX3NrYihzdHJ1Y3QgcHBwICpwcHAsIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0xODQ3LDExICsxODc4LDggQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUFBQX01VTFRJTElOSyAqLwogCi0vKgotICogVHJ5IHRvIHNlbmQgZGF0YSBvdXQgb24gYSBjaGFubmVsLgotICovCi1zdGF0aWMgdm9pZAotcHBwX2NoYW5uZWxfcHVzaChzdHJ1Y3QgY2hhbm5lbCAqcGNoKQorLyogVHJ5IHRvIHNlbmQgZGF0YSBvdXQgb24gYSBjaGFubmVsICovCitzdGF0aWMgdm9pZCBfX3BwcF9jaGFubmVsX3B1c2goc3RydWN0IGNoYW5uZWwgKnBjaCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBwcHAgKnBwcDsKQEAgLTE4NzYsMTEgKzE5MDQsMjIgQEAKIAkJcmVhZF9sb2NrX2JoKCZwY2gtPnVwbCk7CiAJCXBwcCA9IHBjaC0+cHBwOwogCQlpZiAocHBwKQotCQkJcHBwX3htaXRfcHJvY2VzcyhwcHApOworCQkJX19wcHBfeG1pdF9wcm9jZXNzKHBwcCk7CiAJCXJlYWRfdW5sb2NrX2JoKCZwY2gtPnVwbCk7CiAJfQogfQogCitzdGF0aWMgdm9pZCBwcHBfY2hhbm5lbF9wdXNoKHN0cnVjdCBjaGFubmVsICpwY2gpCit7CisJbG9jYWxfYmhfZGlzYWJsZSgpOworCisJX190aGlzX2NwdV9pbmMocHBwX3htaXRfcmVjdXJzaW9uKTsKKwlfX3BwcF9jaGFubmVsX3B1c2gocGNoKTsKKwlfX3RoaXNfY3B1X2RlYyhwcHBfeG1pdF9yZWN1cnNpb24pOworCisJbG9jYWxfYmhfZW5hYmxlKCk7Cit9CisKIC8qCiAgKiBSZWNlaXZlLXNpZGUgcm91dGluZXMuCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcC9wcHRwLmMgYi9kcml2ZXJzL25ldC9wcHAvcHB0cC5jCmluZGV4IGFlMDkwNWUuLjE5NTFiMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcC9wcHRwLmMKKysrIGIvZHJpdmVycy9uZXQvcHBwL3BwdHAuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPG5ldC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L2dyZS5oPgorI2luY2x1ZGUgPG5ldC9wcHRwLmg+CiAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKQEAgLTUzLDQxICs1NCw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHBwcF9jaGFubmVsX29wcyBwcHRwX2NoYW5fb3BzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgcHB0cF9vcHM7CiAKLSNkZWZpbmUgUFBQX0xDUF9FQ0hPUkVRIDB4MDkKLSNkZWZpbmUgUFBQX0xDUF9FQ0hPUkVQIDB4MEEKLSNkZWZpbmUgU0NfUkNWX0JJVFMJKFNDX1JDVl9CN18xfFNDX1JDVl9CN18wfFNDX1JDVl9PRERQfFNDX1JDVl9FVk5QKQotCi0jZGVmaW5lIE1JU1NJTkdfV0lORE9XIDIwCi0jZGVmaW5lIFdSQVBQRUQoY3Vyc2VxLCBsYXN0c2VxKVwKLQkoKCgoY3Vyc2VxKSAmIDB4ZmZmZmZmMDApID09IDApICYmXAotCSgoKGxhc3RzZXEpICYgMHhmZmZmZmYwMCkgPT0gMHhmZmZmZmYwMCkpCi0KLSNkZWZpbmUgUFBUUF9HUkVfUFJPVE8gIDB4ODgwQgotI2RlZmluZSBQUFRQX0dSRV9WRVIgICAgMHgxCi0KLSNkZWZpbmUgUFBUUF9HUkVfRkxBR19DCTB4ODAKLSNkZWZpbmUgUFBUUF9HUkVfRkxBR19SCTB4NDAKLSNkZWZpbmUgUFBUUF9HUkVfRkxBR19LCTB4MjAKLSNkZWZpbmUgUFBUUF9HUkVfRkxBR19TCTB4MTAKLSNkZWZpbmUgUFBUUF9HUkVfRkxBR19BCTB4ODAKLQotI2RlZmluZSBQUFRQX0dSRV9JU19DKGYpICgoZikmUFBUUF9HUkVfRkxBR19DKQotI2RlZmluZSBQUFRQX0dSRV9JU19SKGYpICgoZikmUFBUUF9HUkVfRkxBR19SKQotI2RlZmluZSBQUFRQX0dSRV9JU19LKGYpICgoZikmUFBUUF9HUkVfRkxBR19LKQotI2RlZmluZSBQUFRQX0dSRV9JU19TKGYpICgoZikmUFBUUF9HUkVfRkxBR19TKQotI2RlZmluZSBQUFRQX0dSRV9JU19BKGYpICgoZikmUFBUUF9HUkVfRkxBR19BKQotCi0jZGVmaW5lIFBQVFBfSEVBREVSX09WRVJIRUFEICgyK3NpemVvZihzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyKSkKLXN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgewotCXU4ICBmbGFnczsKLQl1OCAgdmVyOwotCV9fYmUxNiBwcm90b2NvbDsKLQlfX2JlMTYgcGF5bG9hZF9sZW47Ci0JX19iZTE2IGNhbGxfaWQ7Ci0JX19iZTMyIHNlcTsKLQlfX2JlMzIgYWNrOwotfSBfX3BhY2tlZDsKLQogc3RhdGljIHN0cnVjdCBwcHBveF9zb2NrICpsb29rdXBfY2hhbih1MTYgY2FsbF9pZCwgX19iZTMyIHNfYWRkcikKIHsKIAlzdHJ1Y3QgcHBwb3hfc29jayAqc29jazsKQEAgLTI0MCwxNiArMjA2LDE0IEBACiAJc2tiX3B1c2goc2tiLCBoZWFkZXJfbGVuKTsKIAloZHIgPSAoc3RydWN0IHBwdHBfZ3JlX2hlYWRlciAqKShza2ItPmRhdGEpOwogCi0JaGRyLT5mbGFncyAgICAgICA9IFBQVFBfR1JFX0ZMQUdfSzsKLQloZHItPnZlciAgICAgICAgID0gUFBUUF9HUkVfVkVSOwotCWhkci0+cHJvdG9jb2wgICAgPSBodG9ucyhQUFRQX0dSRV9QUk9UTyk7Ci0JaGRyLT5jYWxsX2lkICAgICA9IGh0b25zKG9wdC0+ZHN0X2FkZHIuY2FsbF9pZCk7CisJaGRyLT5ncmVfaGQuZmxhZ3MgPSBHUkVfS0VZIHwgR1JFX1ZFUlNJT05fMSB8IEdSRV9TRVE7CisJaGRyLT5ncmVfaGQucHJvdG9jb2wgPSBHUkVfUFJPVE9fUFBQOworCWhkci0+Y2FsbF9pZCA9IGh0b25zKG9wdC0+ZHN0X2FkZHIuY2FsbF9pZCk7CiAKLQloZHItPmZsYWdzICAgICAgfD0gUFBUUF9HUkVfRkxBR19TOwotCWhkci0+c2VxICAgICAgICAgPSBodG9ubCgrK29wdC0+c2VxX3NlbnQpOworCWhkci0+c2VxID0gaHRvbmwoKytvcHQtPnNlcV9zZW50KTsKIAlpZiAob3B0LT5hY2tfc2VudCAhPSBzZXFfcmVjdikJewogCQkvKiBzZW5kIGFjayB3aXRoIHRoaXMgbWVzc2FnZSAqLwotCQloZHItPnZlciB8PSBQUFRQX0dSRV9GTEFHX0E7CisJCWhkci0+Z3JlX2hkLmZsYWdzIHw9IEdSRV9BQ0s7CiAJCWhkci0+YWNrICA9IGh0b25sKHNlcV9yZWN2KTsKIAkJb3B0LT5hY2tfc2VudCA9IHNlcV9yZWN2OwogCX0KQEAgLTMxMiw3ICsyNzYsNyBAQAogCWhlYWRlcnNpemUgID0gc2l6ZW9mKCpoZWFkZXIpOwogCiAJLyogdGVzdCBpZiBhY2tub3dsZWRnZW1lbnQgcHJlc2VudCAqLwotCWlmIChQUFRQX0dSRV9JU19BKGhlYWRlci0+dmVyKSkgeworCWlmIChHUkVfSVNfQUNLKGhlYWRlci0+Z3JlX2hkLmZsYWdzKSkgewogCQlfX3UzMiBhY2s7CiAKIAkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaGVhZGVyc2l6ZSkpCkBAIC0zMjAsNyArMjg0LDcgQEAKIAkJaGVhZGVyID0gKHN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgKikoc2tiLT5kYXRhKTsKIAogCQkvKiBhY2sgaW4gZGlmZmVyZW50IHBsYWNlIGlmIFMgPSAwICovCi0JCWFjayA9IFBQVFBfR1JFX0lTX1MoaGVhZGVyLT5mbGFncykgPyBoZWFkZXItPmFjayA6IGhlYWRlci0+c2VxOworCQlhY2sgPSBHUkVfSVNfU0VRKGhlYWRlci0+Z3JlX2hkLmZsYWdzKSA/IGhlYWRlci0+YWNrIDogaGVhZGVyLT5zZXE7CiAKIAkJYWNrID0gbnRvaGwoYWNrKTsKIApAQCAtMzMzLDcgKzI5Nyw3IEBACiAJCWhlYWRlcnNpemUgLT0gc2l6ZW9mKGhlYWRlci0+YWNrKTsKIAl9CiAJLyogdGVzdCBpZiBwYXlsb2FkIHByZXNlbnQgKi8KLQlpZiAoIVBQVFBfR1JFX0lTX1MoaGVhZGVyLT5mbGFncykpCisJaWYgKCFHUkVfSVNfU0VRKGhlYWRlci0+Z3JlX2hkLmZsYWdzKSkKIAkJZ290byBkcm9wOwogCiAJcGF5bG9hZF9sZW4gPSBudG9ocyhoZWFkZXItPnBheWxvYWRfbGVuKTsKQEAgLTM5NCwxMSArMzU4LDExIEBACiAKIAloZWFkZXIgPSAoc3RydWN0IHBwdHBfZ3JlX2hlYWRlciAqKXNrYi0+ZGF0YTsKIAotCWlmIChudG9ocyhoZWFkZXItPnByb3RvY29sKSAhPSBQUFRQX0dSRV9QUk9UTyB8fCAvKiBQUFRQLUdSRSBwcm90b2NvbCBmb3IgUFBUUCAqLwotCQlQUFRQX0dSRV9JU19DKGhlYWRlci0+ZmxhZ3MpIHx8ICAgICAgICAgICAgICAgIC8qIGZsYWcgQyBzaG91bGQgYmUgY2xlYXIgKi8KLQkJUFBUUF9HUkVfSVNfUihoZWFkZXItPmZsYWdzKSB8fCAgICAgICAgICAgICAgICAvKiBmbGFnIFIgc2hvdWxkIGJlIGNsZWFyICovCi0JCSFQUFRQX0dSRV9JU19LKGhlYWRlci0+ZmxhZ3MpIHx8ICAgICAgICAgICAgICAgLyogZmxhZyBLIHNob3VsZCBiZSBzZXQgKi8KLQkJKGhlYWRlci0+ZmxhZ3MmMHhGKSAhPSAwKSAgICAgICAgICAgICAgICAgICAgICAvKiByb3V0aW5nIGFuZCByZWN1cnNpb24gY3RybCA9IDAgKi8KKwlpZiAoaGVhZGVyLT5ncmVfaGQucHJvdG9jb2wgIT0gR1JFX1BST1RPX1BQUCB8fCAvKiBQUFRQLUdSRSBwcm90b2NvbCBmb3IgUFBUUCAqLworCQlHUkVfSVNfQ1NVTShoZWFkZXItPmdyZV9oZC5mbGFncykgfHwgICAgLyogZmxhZyBDU1VNIHNob3VsZCBiZSBjbGVhciAqLworCQlHUkVfSVNfUk9VVElORyhoZWFkZXItPmdyZV9oZC5mbGFncykgfHwgLyogZmxhZyBST1VUSU5HIHNob3VsZCBiZSBjbGVhciAqLworCQkhR1JFX0lTX0tFWShoZWFkZXItPmdyZV9oZC5mbGFncykgfHwgICAgLyogZmxhZyBLRVkgc2hvdWxkIGJlIHNldCAqLworCQkoaGVhZGVyLT5ncmVfaGQuZmxhZ3MgJiBHUkVfRkxBR1MpKSAgICAgLyogZmxhZyBSZWN1cnNpb24gQ3RybCBzaG91bGQgYmUgY2xlYXIgKi8KIAkJLyogaWYgaW52YWxpZCwgZGlzY2FyZCB0aGlzIHBhY2tldCAqLwogCQlnb3RvIGRyb3A7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RlYW0vdGVhbV9tb2RlX2xvYWRiYWxhbmNlLmMgYi9kcml2ZXJzL25ldC90ZWFtL3RlYW1fbW9kZV9sb2FkYmFsYW5jZS5jCmluZGV4IGNkYjE5YjMuLmIyMjhiZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RlYW0vdGVhbV9tb2RlX2xvYWRiYWxhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvdGVhbS90ZWFtX21vZGVfbG9hZGJhbGFuY2UuYwpAQCAtMTQsOSArMTQsMjMgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3RlYW0uaD4KIAorc3RhdGljIHJ4X2hhbmRsZXJfcmVzdWx0X3QgbGJfcmVjZWl2ZShzdHJ1Y3QgdGVhbSAqdGVhbSwgc3RydWN0IHRlYW1fcG9ydCAqcG9ydCwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmICh1bmxpa2VseShza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX1NMT1cpKSkgeworCQkvKiBMQUNQRFUgcGFja2V0cyBzaG91bGQgZ28gdG8gZXhhY3QgZGVsaXZlcnkgKi8KKwkJY29uc3QgdW5zaWduZWQgY2hhciAqZGVzdCA9IGV0aF9oZHIoc2tiKS0+aF9kZXN0OworCisJCWlmIChpc19saW5rX2xvY2FsX2V0aGVyX2FkZHIoZGVzdCkgJiYgZGVzdFs1XSA9PSAweDAyKQorCQkJcmV0dXJuIFJYX0hBTkRMRVJfRVhBQ1Q7CisJfQorCXJldHVybiBSWF9IQU5ETEVSX0FOT1RIRVI7Cit9CisKIHN0cnVjdCBsYl9wcml2OwogCiB0eXBlZGVmIHN0cnVjdCB0ZWFtX3BvcnQgKmxiX3NlbGVjdF90eF9wb3J0X2Z1bmNfdChzdHJ1Y3QgdGVhbSAqLApAQCAtNjUyLDYgKzY2Niw3IEBACiAJLnBvcnRfZW50ZXIJCT0gbGJfcG9ydF9lbnRlciwKIAkucG9ydF9sZWF2ZQkJPSBsYl9wb3J0X2xlYXZlLAogCS5wb3J0X2Rpc2FibGVkCQk9IGxiX3BvcnRfZGlzYWJsZWQsCisJLnJlY2VpdmUJCT0gbGJfcmVjZWl2ZSwKIAkudHJhbnNtaXQJCT0gbGJfdHJhbnNtaXQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dW4uYyBiL2RyaXZlcnMvbmV0L3R1bi5jCmluZGV4IDljOGI1YmMuLjgwOTNlMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bi5jCkBAIC03MzEsMTQgKzczMSw5IEBACiAJfQogCiAJYWxlbiA9IEVUSF9BTEVOICogdWYuY291bnQ7Ci0JYWRkciA9IGttYWxsb2MoYWxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZGRyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihhZGRyLCBhcmcgKyBzaXplb2YodWYpLCBhbGVuKSkgewotCQllcnIgPSAtRUZBVUxUOwotCQlnb3RvIGRvbmU7Ci0JfQorCWFkZHIgPSBtZW1kdXBfdXNlcihhcmcgKyBzaXplb2YodWYpLCBhbGVuKTsKKwlpZiAoSVNfRVJSKGFkZHIpKQorCQlyZXR1cm4gUFRSX0VSUihhZGRyKTsKIAogCS8qIFRoZSBmaWx0ZXIgaXMgdXBkYXRlZCB3aXRob3V0IGhvbGRpbmcgYW55IGxvY2tzLiBXaGljaCBpcwogCSAqIHBlcmZlY3RseSBzYWZlLiBXZSBkaXNhYmxlIGl0IGZpcnN0IGFuZCBpbiB0aGUgd29yc3QKQEAgLTc1OCw3ICs3NTMsNyBAQAogCWZvciAoOyBuIDwgdWYuY291bnQ7IG4rKykgewogCQlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGFkZHJbbl0udSkpIHsKIAkJCWVyciA9IDA7IC8qIG5vIGZpbHRlciAqLwotCQkJZ290byBkb25lOworCQkJZ290byBmcmVlX2FkZHI7CiAJCX0KIAkJYWRkcl9oYXNoX3NldChmaWx0ZXItPm1hc2ssIGFkZHJbbl0udSk7CiAJfQpAQCAtNzc0LDggKzc2OSw3IEBACiAKIAkvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBleGFjdCBmaWx0ZXJzICovCiAJZXJyID0gbmV4YWN0OwotCi1kb25lOgorZnJlZV9hZGRyOgogCWtmcmVlKGFkZHIpOwogCXJldHVybiBlcnI7CiB9CkBAIC04OTQsMTEgKzg4OCw3IEBACiAJaWYgKHVubGlrZWx5KHNrYl9vcnBoYW5fZnJhZ3Moc2tiLCBHRlBfQVRPTUlDKSkpCiAJCWdvdG8gZHJvcDsKIAotCWlmIChza2ItPnNrICYmIHNrX2Z1bGxzb2NrKHNrYi0+c2spKSB7Ci0JCXNvY2tfdHhfdGltZXN0YW1wKHNrYi0+c2ssIHNrYi0+c2stPnNrX3RzZmxhZ3MsCi0JCQkJICAmc2tiX3NoaW5mbyhza2IpLT50eF9mbGFncyk7Ci0JCXN3X3R4X3RpbWVzdGFtcChza2IpOwotCX0KKwlza2JfdHhfdGltZXN0YW1wKHNrYik7CiAKIAkvKiBPcnBoYW4gdGhlIHNrYiAtIHJlcXVpcmVkIGFzIHdlIG1pZ2h0IGhhbmcgb24gdG8gaXQKIAkgKiBmb3IgaW5kZWZpbml0ZSB0aW1lLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2FzaXguaCBiL2RyaXZlcnMvbmV0L3VzYi9hc2l4LmgKaW5kZXggYTJkM2VhNi4uZDEwOTI0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2FzaXguaAorKysgYi9kcml2ZXJzL25ldC91c2IvYXNpeC5oCkBAIC00Niw2ICs0Niw3IEBACiAjZGVmaW5lIEFYX0NNRF9TRVRfU1dfTUlJCQkweDA2CiAjZGVmaW5lIEFYX0NNRF9SRUFEX01JSV9SRUcJCTB4MDcKICNkZWZpbmUgQVhfQ01EX1dSSVRFX01JSV9SRUcJCTB4MDgKKyNkZWZpbmUgQVhfQ01EX1NUQVRNTkdTVFNfUkVHCQkweDA5CiAjZGVmaW5lIEFYX0NNRF9TRVRfSFdfTUlJCQkweDBhCiAjZGVmaW5lIEFYX0NNRF9SRUFEX0VFUFJPTQkJMHgwYgogI2RlZmluZSBBWF9DTURfV1JJVEVfRUVQUk9NCQkweDBjCkBAIC03MSw2ICs3MiwxNyBAQAogI2RlZmluZSBBWF9DTURfU1dfUkVTRVQJCQkweDIwCiAjZGVmaW5lIEFYX0NNRF9TV19QSFlfU1RBVFVTCQkweDIxCiAjZGVmaW5lIEFYX0NNRF9TV19QSFlfU0VMRUNUCQkweDIyCisjZGVmaW5lIEFYX1FDVENUUkwJCQkweDJBCisKKyNkZWZpbmUgQVhfQ0hJUENPREVfTUFTSwkJMHg3MAorI2RlZmluZSBBWF9BWDg4NzcyX0NISVBDT0RFCQkweDAwCisjZGVmaW5lIEFYX0FYODg3NzJBX0NISVBDT0RFCQkweDEwCisjZGVmaW5lIEFYX0FYODg3NzJCX0NISVBDT0RFCQkweDIwCisjZGVmaW5lIEFYX0hPU1RfRU4JCQkweDAxCisKKyNkZWZpbmUgQVhfUEhZU0VMX1BTRUwJCQkweDAxCisjZGVmaW5lIEFYX1BIWVNFTF9TU01JSQkJCTAKKyNkZWZpbmUgQVhfUEhZU0VMX1NTRU4JCQkweDEwCiAKICNkZWZpbmUgQVhfUEhZX1NFTEVDVF9NQVNLCQkoQklUKDMpIHwgQklUKDIpKQogI2RlZmluZSBBWF9QSFlfU0VMRUNUX0lOVEVSTkFMCQkwCkBAIC0xNzMsNiArMTg1LDEwIEBACiB9OwogCiBzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSB7CisJdm9pZCAoKnJlc3VtZSkoc3RydWN0IHVzYm5ldCAqZGV2KTsKKwl2b2lkICgqc3VzcGVuZCkoc3RydWN0IHVzYm5ldCAqZGV2KTsKKwl1MTYgcHJlc3ZkX3BoeV9hZHZlcnRpc2U7CisJdTE2IHByZXN2ZF9waHlfYm1jcjsKIAlzdHJ1Y3QgYXNpeF9yeF9maXh1cF9pbmZvIHJ4X2ZpeHVwX2luZm87CiB9OwogCkBAIC0xODIsMTAgKzE5OCwxMCBAQAogI2RlZmluZSBGTEFHX0VFUFJPTV9NQUMJCSgxVUwgPDwgMCkgIC8qIGluaXQgZGV2aWNlIE1BQyBmcm9tIGVlcHJvbSAqLwogCiBpbnQgYXNpeF9yZWFkX2NtZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCi0JCSAgdTE2IHNpemUsIHZvaWQgKmRhdGEpOworCQkgIHUxNiBzaXplLCB2b2lkICpkYXRhLCBpbnQgaW5fcG0pOwogCiBpbnQgYXNpeF93cml0ZV9jbWQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBjbWQsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAotCQkgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSk7CisJCSAgIHUxNiBzaXplLCB2b2lkICpkYXRhLCBpbnQgaW5fcG0pOwogCiB2b2lkIGFzaXhfd3JpdGVfY21kX2FzeW5jKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsCiAJCQkgIHUxNiBpbmRleCwgdTE2IHNpemUsIHZvaWQgKmRhdGEpOwpAQCAtMTk3LDI3ICsyMTMsMzEgQEAKIHN0cnVjdCBza19idWZmICphc2l4X3R4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIGdmcF90IGZsYWdzKTsKIAotaW50IGFzaXhfc2V0X3N3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYpOwotaW50IGFzaXhfc2V0X2h3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYpOworaW50IGFzaXhfc2V0X3N3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCBpbl9wbSk7CitpbnQgYXNpeF9zZXRfaHdfbWlpKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGluX3BtKTsKIAogaW50IGFzaXhfcmVhZF9waHlfYWRkcihzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCBpbnRlcm5hbCk7CiBpbnQgYXNpeF9nZXRfcGh5X2FkZHIoc3RydWN0IHVzYm5ldCAqZGV2KTsKIAotaW50IGFzaXhfc3dfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBmbGFncyk7CitpbnQgYXNpeF9zd19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGZsYWdzLCBpbnQgaW5fcG0pOwogCi11MTYgYXNpeF9yZWFkX3J4X2N0bChzdHJ1Y3QgdXNibmV0ICpkZXYpOwotaW50IGFzaXhfd3JpdGVfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUpOwordTE2IGFzaXhfcmVhZF9yeF9jdGwoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pOworaW50IGFzaXhfd3JpdGVfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUsIGludCBpbl9wbSk7CiAKLXUxNiBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhzdHJ1Y3QgdXNibmV0ICpkZXYpOwotaW50IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgbW9kZSk7Cit1MTYgYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pOworaW50IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgbW9kZSwgaW50IGluX3BtKTsKIAotaW50IGFzaXhfd3JpdGVfZ3BpbyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiB2YWx1ZSwgaW50IHNsZWVwKTsKK2ludCBhc2l4X3dyaXRlX2dwaW8oc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgdmFsdWUsIGludCBzbGVlcCwgaW50IGluX3BtKTsKIAogdm9pZCBhc2l4X3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCk7CiAKIGludCBhc2l4X21kaW9fcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jKTsKIHZvaWQgYXNpeF9tZGlvX3dyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWwpOwogCitpbnQgYXNpeF9tZGlvX3JlYWRfbm9wbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jKTsKK3ZvaWQgYXNpeF9tZGlvX3dyaXRlX25vcG0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IGxvYywKKwkJCSAgaW50IHZhbCk7CisKIHZvaWQgYXNpeF9nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbGluZm8pOwogaW50IGFzaXhfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2xpbmZvKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2FzaXhfY29tbW9uLmMgYi9kcml2ZXJzL25ldC91c2IvYXNpeF9jb21tb24uYwppbmRleCA3ZGU1YWI1Li5mNzllYjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvYXNpeF9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC91c2IvYXNpeF9jb21tb24uYwpAQCAtMjIsMjQgKzIyLDQ5IEBACiAjaW5jbHVkZSAiYXNpeC5oIgogCiBpbnQgYXNpeF9yZWFkX2NtZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCi0JCSAgdTE2IHNpemUsIHZvaWQgKmRhdGEpCisJCSAgdTE2IHNpemUsIHZvaWQgKmRhdGEsIGludCBpbl9wbSkKIHsKIAlpbnQgcmV0OwotCXJldCA9IHVzYm5ldF9yZWFkX2NtZChkZXYsIGNtZCwKLQkJCSAgICAgICBVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCSAgICAgICB2YWx1ZSwgaW5kZXgsIGRhdGEsIHNpemUpOworCWludCAoKmZuKShzdHJ1Y3QgdXNibmV0ICosIHU4LCB1OCwgdTE2LCB1MTYsIHZvaWQgKiwgdTE2KTsKIAotCWlmIChyZXQgIT0gc2l6ZSAmJiByZXQgPj0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJQlVHX09OKCFkZXYpOworCisJaWYgKCFpbl9wbSkKKwkJZm4gPSB1c2JuZXRfcmVhZF9jbWQ7CisJZWxzZQorCQlmbiA9IHVzYm5ldF9yZWFkX2NtZF9ub3BtOworCisJcmV0ID0gZm4oZGV2LCBjbWQsIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkgdmFsdWUsIGluZGV4LCBkYXRhLCBzaXplKTsKKworCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJbmV0ZGV2X3dhcm4oZGV2LT5uZXQsICJGYWlsZWQgdG8gcmVhZCByZWcgaW5kZXggMHglMDR4OiAlZFxuIiwKKwkJCSAgICBpbmRleCwgcmV0KTsKKwogCXJldHVybiByZXQ7CiB9CiAKIGludCBhc2l4X3dyaXRlX2NtZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCi0JCSAgIHUxNiBzaXplLCB2b2lkICpkYXRhKQorCQkgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSwgaW50IGluX3BtKQogewotCXJldHVybiB1c2JuZXRfd3JpdGVfY21kKGRldiwgY21kLAotCQkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCQl2YWx1ZSwgaW5kZXgsIGRhdGEsIHNpemUpOworCWludCByZXQ7CisJaW50ICgqZm4pKHN0cnVjdCB1c2JuZXQgKiwgdTgsIHU4LCB1MTYsIHUxNiwgY29uc3Qgdm9pZCAqLCB1MTYpOworCisJQlVHX09OKCFkZXYpOworCisJaWYgKCFpbl9wbSkKKwkJZm4gPSB1c2JuZXRfd3JpdGVfY21kOworCWVsc2UKKwkJZm4gPSB1c2JuZXRfd3JpdGVfY21kX25vcG07CisKKwlyZXQgPSBmbihkZXYsIGNtZCwgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkgdmFsdWUsIGluZGV4LCBkYXRhLCBzaXplKTsKKworCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJbmV0ZGV2X3dhcm4oZGV2LT5uZXQsICJGYWlsZWQgdG8gd3JpdGUgcmVnIGluZGV4IDB4JTA0eDogJWRcbiIsCisJCQkgICAgaW5kZXgsIHJldCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGFzaXhfd3JpdGVfY21kX2FzeW5jKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKQEAgLTIyNSwxOSArMjUwLDIwIEBACiAJcmV0dXJuIHNrYjsKIH0KIAotaW50IGFzaXhfc2V0X3N3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYpCitpbnQgYXNpeF9zZXRfc3dfbWlpKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGluX3BtKQogewogCWludCByZXQ7Ci0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU0VUX1NXX01JSSwgMHgwMDAwLCAwLCAwLCBOVUxMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfU1dfTUlJLCAweDAwMDAsIDAsIDAsIE5VTEwsIGluX3BtKTsKKwogCWlmIChyZXQgPCAwKQogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIGVuYWJsZSBzb2Z0d2FyZSBNSUkgYWNjZXNzXG4iKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXNpeF9zZXRfaHdfbWlpKHN0cnVjdCB1c2JuZXQgKmRldikKK2ludCBhc2l4X3NldF9od19taWkoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pCiB7CiAJaW50IHJldDsKLQlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAweDAwMDAsIDAsIDAsIE5VTEwpOworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9IV19NSUksIDB4MDAwMCwgMCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKQogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIGVuYWJsZSBoYXJkd2FyZSBNSUkgYWNjZXNzXG4iKTsKIAlyZXR1cm4gcmV0OwpAQCAtMjQ3LDcgKzI3Myw3IEBACiB7CiAJaW50IG9mZnNldCA9IChpbnRlcm5hbCA/IDEgOiAwKTsKIAl1OCBidWZbMl07Ci0JaW50IHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9QSFlfSUQsIDAsIDAsIDIsIGJ1Zik7CisJaW50IHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9QSFlfSUQsIDAsIDAsIDIsIGJ1ZiwgMCk7CiAKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXNpeF9nZXRfcGh5X2FkZHIoKVxuIik7CiAKQEAgLTI3MCwyMSArMjk2LDIxIEBACiB9CiAKIAotaW50IGFzaXhfc3dfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBmbGFncykKK2ludCBhc2l4X3N3X3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldiwgdTggZmxhZ3MsIGludCBpbl9wbSkKIHsKIAlpbnQgcmV0OwogCi0gICAgICAgIHJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1JFU0VULCBmbGFncywgMCwgMCwgTlVMTCk7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUkVTRVQsIGZsYWdzLCAwLCAwLCBOVUxMLCBpbl9wbSk7CiAJaWYgKHJldCA8IDApCiAJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJGYWlsZWQgdG8gc2VuZCBzb2Z0d2FyZSByZXNldDogJTAyeFxuIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXUxNiBhc2l4X3JlYWRfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldikKK3UxNiBhc2l4X3JlYWRfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldiwgaW50IGluX3BtKQogewogCV9fbGUxNiB2OwotCWludCByZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfUlhfQ1RMLCAwLCAwLCAyLCAmdik7CisJaW50IHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9SWF9DVEwsIDAsIDAsIDIsICZ2LCBpbl9wbSk7CiAKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRXJyb3IgcmVhZGluZyBSWF9DVEwgcmVnaXN0ZXI6ICUwMnhcbiIsIHJldCk7CkBAIC0yOTUsMTIgKzMyMSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhc2l4X3dyaXRlX3J4X2N0bChzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiBtb2RlKQoraW50IGFzaXhfd3JpdGVfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUsIGludCBpbl9wbSkKIHsKIAlpbnQgcmV0OwogCiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImFzaXhfd3JpdGVfcnhfY3RsKCkgLSBtb2RlID0gMHglMDR4XG4iLCBtb2RlKTsKLQlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9SWF9DVEwsIG1vZGUsIDAsIDAsIE5VTEwpOworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX1JYX0NUTCwgbW9kZSwgMCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKQogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIHdyaXRlIFJYX0NUTCBtb2RlIHRvIDB4JTA0eDogJTAyeFxuIiwKIAkJCSAgIG1vZGUsIHJldCk7CkBAIC0zMDgsMTAgKzMzNCwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXUxNiBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhzdHJ1Y3QgdXNibmV0ICpkZXYpCit1MTYgYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pCiB7CiAJX19sZTE2IHY7Ci0JaW50IHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9NRURJVU1fU1RBVFVTLCAwLCAwLCAyLCAmdik7CisJaW50IHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9NRURJVU1fU1RBVFVTLAorCQkJCTAsIDAsIDIsICZ2LCBpbl9wbSk7CiAKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRXJyb3IgcmVhZGluZyBNZWRpdW0gU3RhdHVzIHJlZ2lzdGVyOiAlMDJ4XG4iLApAQCAtMzIzLDEyICszNTAsMTMgQEAKIAogfQogCi1pbnQgYXNpeF93cml0ZV9tZWRpdW1fbW9kZShzdHJ1Y3QgdXNibmV0ICpkZXYsIHUxNiBtb2RlKQoraW50IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgbW9kZSwgaW50IGluX3BtKQogewogCWludCByZXQ7CiAKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXNpeF93cml0ZV9tZWRpdW1fbW9kZSgpIC0gbW9kZSA9IDB4JTA0eFxuIiwgbW9kZSk7Ci0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTUVESVVNX01PREUsIG1vZGUsIDAsIDAsIE5VTEwpOworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01FRElVTV9NT0RFLAorCQkJICAgICBtb2RlLCAwLCAwLCBOVUxMLCBpbl9wbSk7CiAJaWYgKHJldCA8IDApCiAJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJGYWlsZWQgdG8gd3JpdGUgTWVkaXVtIE1vZGUgbW9kZSB0byAweCUwNHg6ICUwMnhcbiIsCiAJCQkgICBtb2RlLCByZXQpOwpAQCAtMzM2LDEyICszNjQsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXNpeF93cml0ZV9ncGlvKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IHZhbHVlLCBpbnQgc2xlZXApCitpbnQgYXNpeF93cml0ZV9ncGlvKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IHZhbHVlLCBpbnQgc2xlZXAsIGludCBpbl9wbSkKIHsKIAlpbnQgcmV0OwogCiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImFzaXhfd3JpdGVfZ3BpbygpIC0gdmFsdWUgPSAweCUwNHhcbiIsIHZhbHVlKTsKLQlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9HUElPUywgdmFsdWUsIDAsIDAsIE5VTEwpOworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0dQSU9TLCB2YWx1ZSwgMCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKQogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRmFpbGVkIHRvIHdyaXRlIEdQSU8gdmFsdWUgMHglMDR4OiAlMDJ4XG4iLAogCQkJICAgdmFsdWUsIHJldCk7CkBAIC0zOTgsMTYgKzQyNiwzMSBAQAogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJX19sZTE2IHJlczsKKwl1OCBzbXNyOworCWludCBpID0gMDsKKwlpbnQgcmV0OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5waHlfbXV0ZXgpOwotCWFzaXhfc2V0X3N3X21paShkZXYpOworCWRvIHsKKwkJcmV0ID0gYXNpeF9zZXRfc3dfbWlpKGRldiwgMCk7CisJCWlmIChyZXQgPT0gLUVOT0RFVikKKwkJCWJyZWFrOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1RBVE1OR1NUU19SRUcsCisJCQkJICAgIDAsIDAsIDEsICZzbXNyLCAwKTsKKwl9IHdoaWxlICghKHNtc3IgJiBBWF9IT1NUX0VOKSAmJiAoaSsrIDwgMzApICYmIChyZXQgIT0gLUVOT0RFVikpOworCWlmIChyZXQgPT0gLUVOT0RFVikgeworCQltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTUlJX1JFRywgcGh5X2lkLAotCQkJCShfX3UxNilsb2MsIDIsICZyZXMpOwotCWFzaXhfc2V0X2h3X21paShkZXYpOworCQkJCShfX3UxNilsb2MsIDIsICZyZXMsIDApOworCWFzaXhfc2V0X2h3X21paShkZXYsIDApOwogCW11dGV4X3VubG9jaygmZGV2LT5waHlfbXV0ZXgpOwogCiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImFzaXhfbWRpb19yZWFkKCkgcGh5X2lkPTB4JTAyeCwgbG9jPTB4JTAyeCwgcmV0dXJucz0weCUwNHhcbiIsCi0JCSAgIHBoeV9pZCwgbG9jLCBsZTE2X3RvX2NwdShyZXMpKTsKKwkJCXBoeV9pZCwgbG9jLCBsZTE2X3RvX2NwdShyZXMpKTsKIAogCXJldHVybiBsZTE2X3RvX2NwdShyZXMpOwogfQpAQCAtNDE2LDEzICs0NTksOTUgQEAKIHsKIAlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCV9fbGUxNiByZXMgPSBjcHVfdG9fbGUxNih2YWwpOworCXU4IHNtc3I7CisJaW50IGkgPSAwOworCWludCByZXQ7CiAKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXNpeF9tZGlvX3dyaXRlKCkgcGh5X2lkPTB4JTAyeCwgbG9jPTB4JTAyeCwgdmFsPTB4JTA0eFxuIiwKLQkJICAgcGh5X2lkLCBsb2MsIHZhbCk7CisJCQlwaHlfaWQsIGxvYywgdmFsKTsKKwogCW11dGV4X2xvY2soJmRldi0+cGh5X211dGV4KTsKLQlhc2l4X3NldF9zd19taWkoZGV2KTsKLQlhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NSUlfUkVHLCBwaHlfaWQsIChfX3UxNilsb2MsIDIsICZyZXMpOwotCWFzaXhfc2V0X2h3X21paShkZXYpOworCWRvIHsKKwkJcmV0ID0gYXNpeF9zZXRfc3dfbWlpKGRldiwgMCk7CisJCWlmIChyZXQgPT0gLUVOT0RFVikKKwkJCWJyZWFrOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1RBVE1OR1NUU19SRUcsCisJCQkJICAgIDAsIDAsIDEsICZzbXNyLCAwKTsKKwl9IHdoaWxlICghKHNtc3IgJiBBWF9IT1NUX0VOKSAmJiAoaSsrIDwgMzApICYmIChyZXQgIT0gLUVOT0RFVikpOworCWlmIChyZXQgPT0gLUVOT0RFVikgeworCQltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKwkJcmV0dXJuOworCX0KKworCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01JSV9SRUcsIHBoeV9pZCwKKwkJICAgICAgIChfX3UxNilsb2MsIDIsICZyZXMsIDApOworCWFzaXhfc2V0X2h3X21paShkZXYsIDApOworCW11dGV4X3VubG9jaygmZGV2LT5waHlfbXV0ZXgpOworfQorCitpbnQgYXNpeF9tZGlvX3JlYWRfbm9wbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgcGh5X2lkLCBpbnQgbG9jKQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CisJX19sZTE2IHJlczsKKwl1OCBzbXNyOworCWludCBpID0gMDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZGV2LT5waHlfbXV0ZXgpOworCWRvIHsKKwkJcmV0ID0gYXNpeF9zZXRfc3dfbWlpKGRldiwgMSk7CisJCWlmIChyZXQgPT0gLUVOT0RFVikKKwkJCWJyZWFrOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1RBVE1OR1NUU19SRUcsCisJCQkJICAgIDAsIDAsIDEsICZzbXNyLCAxKTsKKwl9IHdoaWxlICghKHNtc3IgJiBBWF9IT1NUX0VOKSAmJiAoaSsrIDwgMzApICYmIChyZXQgIT0gLUVOT0RFVikpOworCWlmIChyZXQgPT0gLUVOT0RFVikgeworCQltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTUlJX1JFRywgcGh5X2lkLAorCQkgICAgICAoX191MTYpbG9jLCAyLCAmcmVzLCAxKTsKKwlhc2l4X3NldF9od19taWkoZGV2LCAxKTsKKwltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKworCW5ldGRldl9kYmcoZGV2LT5uZXQsICJhc2l4X21kaW9fcmVhZF9ub3BtKCkgcGh5X2lkPTB4JTAyeCwgbG9jPTB4JTAyeCwgcmV0dXJucz0weCUwNHhcbiIsCisJCQlwaHlfaWQsIGxvYywgbGUxNl90b19jcHUocmVzKSk7CisKKwlyZXR1cm4gbGUxNl90b19jcHUocmVzKTsKK30KKwordm9pZAorYXNpeF9tZGlvX3dyaXRlX25vcG0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IGxvYywgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCV9fbGUxNiByZXMgPSBjcHVfdG9fbGUxNih2YWwpOworCXU4IHNtc3I7CisJaW50IGkgPSAwOworCWludCByZXQ7CisKKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXNpeF9tZGlvX3dyaXRlKCkgcGh5X2lkPTB4JTAyeCwgbG9jPTB4JTAyeCwgdmFsPTB4JTA0eFxuIiwKKwkJCXBoeV9pZCwgbG9jLCB2YWwpOworCisJbXV0ZXhfbG9jaygmZGV2LT5waHlfbXV0ZXgpOworCWRvIHsKKwkJcmV0ID0gYXNpeF9zZXRfc3dfbWlpKGRldiwgMSk7CisJCWlmIChyZXQgPT0gLUVOT0RFVikKKwkJCWJyZWFrOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTEwMCk7CisJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1RBVE1OR1NUU19SRUcsCisJCQkJICAgIDAsIDAsIDEsICZzbXNyLCAxKTsKKwl9IHdoaWxlICghKHNtc3IgJiBBWF9IT1NUX0VOKSAmJiAoaSsrIDwgMzApICYmIChyZXQgIT0gLUVOT0RFVikpOworCWlmIChyZXQgPT0gLUVOT0RFVikgeworCQltdXRleF91bmxvY2soJmRldi0+cGh5X211dGV4KTsKKwkJcmV0dXJuOworCX0KKworCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01JSV9SRUcsIHBoeV9pZCwKKwkJICAgICAgIChfX3UxNilsb2MsIDIsICZyZXMsIDEpOworCWFzaXhfc2V0X2h3X21paShkZXYsIDEpOwogCW11dGV4X3VubG9jaygmZGV2LT5waHlfbXV0ZXgpOwogfQogCkBAIC00MzEsNyArNTU2LDggQEAKIAlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwogCXU4IG9wdDsKIAotCWlmIChhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTU9OSVRPUl9NT0RFLCAwLCAwLCAxLCAmb3B0KSA8IDApIHsKKwlpZiAoYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX01PTklUT1JfTU9ERSwKKwkJCSAgMCwgMCwgMSwgJm9wdCwgMCkgPCAwKSB7CiAJCXdvbGluZm8tPnN1cHBvcnRlZCA9IDA7CiAJCXdvbGluZm8tPndvbG9wdHMgPSAwOwogCQlyZXR1cm47CkBAIC00NTUsNyArNTgxLDcgQEAKIAkJb3B0IHw9IEFYX01PTklUT1JfTUFHSUM7CiAKIAlpZiAoYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTU9OSVRPUl9NT0RFLAotCQkJICAgICAgb3B0LCAwLCAwLCBOVUxMKSA8IDApCisJCQkgICAgICBvcHQsIDAsIDAsIE5VTEwsIDApIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gMDsKQEAgLTQ5MCw3ICs2MTYsNyBAQAogCS8qIGF4ODgxN3ggcmV0dXJucyAyIGJ5dGVzIGZyb20gZWVwcm9tIG9uIHJlYWQgKi8KIAlmb3IgKGkgPSBmaXJzdF93b3JkOyBpIDw9IGxhc3Rfd29yZDsgaSsrKSB7CiAJCWlmIChhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfRUVQUk9NLCBpLCAwLCAyLAotCQkJCSAgJihlZXByb21fYnVmZltpIC0gZmlyc3Rfd29yZF0pKSA8IDApIHsKKwkJCQkgICZlZXByb21fYnVmZltpIC0gZmlyc3Rfd29yZF0sIDApIDwgMCkgewogCQkJa2ZyZWUoZWVwcm9tX2J1ZmYpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KQEAgLTUzMSw3ICs2NTcsNyBAQAogCSAgIHRoZSBFRVBST00gKi8KIAlpZiAoZWVwcm9tLT5vZmZzZXQgJiAxKSB7CiAJCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9FRVBST00sIGZpcnN0X3dvcmQsIDAsIDIsCi0JCQkJICAgICYoZWVwcm9tX2J1ZmZbMF0pKTsKKwkJCQkgICAgJmVlcHJvbV9idWZmWzBdLCAwKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW5ldGRldl9lcnIobmV0LCAiRmFpbGVkIHRvIHJlYWQgRUVQUk9NIGF0IG9mZnNldCAweCUwMnguXG4iLCBmaXJzdF93b3JkKTsKIAkJCWdvdG8gZnJlZTsKQEAgLTU0MCw3ICs2NjYsNyBAQAogCiAJaWYgKChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuKSAmIDEpIHsKIAkJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX0VFUFJPTSwgbGFzdF93b3JkLCAwLCAyLAotCQkJCSAgICAmKGVlcHJvbV9idWZmW2xhc3Rfd29yZCAtIGZpcnN0X3dvcmRdKSk7CisJCQkJICAgICZlZXByb21fYnVmZltsYXN0X3dvcmQgLSBmaXJzdF93b3JkXSwgMCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQluZXRkZXZfZXJyKG5ldCwgIkZhaWxlZCB0byByZWFkIEVFUFJPTSBhdCBvZmZzZXQgMHglMDJ4LlxuIiwgbGFzdF93b3JkKTsKIAkJCWdvdG8gZnJlZTsKQEAgLTU1MCw3ICs2NzYsNyBAQAogCW1lbWNweSgodTggKillZXByb21fYnVmZiArIChlZXByb20tPm9mZnNldCAmIDEpLCBkYXRhLCBlZXByb20tPmxlbik7CiAKIAkvKiB3cml0ZSBkYXRhIHRvIEVFUFJPTSAqLwotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0VOQUJMRSwgMHgwMDAwLCAwLCAwLCBOVUxMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9FTkFCTEUsIDB4MDAwMCwgMCwgMCwgTlVMTCwgMCk7CiAJaWYgKHJldCA8IDApIHsKIAkJbmV0ZGV2X2VycihuZXQsICJGYWlsZWQgdG8gZW5hYmxlIEVFUFJPTSB3cml0ZVxuIik7CiAJCWdvdG8gZnJlZTsKQEAgLTU2MSw3ICs2ODcsNyBAQAogCQluZXRkZXZfZGJnKG5ldCwgIndyaXRlIHRvIEVFUFJPTSBhdCBvZmZzZXQgMHglMDJ4LCBkYXRhIDB4JTA0eFxuIiwKIAkJCSAgIGksIGVlcHJvbV9idWZmW2kgLSBmaXJzdF93b3JkXSk7CiAJCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0VFUFJPTSwgaSwKLQkJCQkgICAgIGVlcHJvbV9idWZmW2kgLSBmaXJzdF93b3JkXSwgMCwgTlVMTCk7CisJCQkJICAgICBlZXByb21fYnVmZltpIC0gZmlyc3Rfd29yZF0sIDAsIE5VTEwsIDApOwogCQlpZiAocmV0IDwgMCkgewogCQkJbmV0ZGV2X2VycihuZXQsICJGYWlsZWQgdG8gd3JpdGUgRUVQUk9NIGF0IG9mZnNldCAweCUwMnguXG4iLAogCQkJCSAgIGkpOwpAQCAtNTcwLDcgKzY5Niw3IEBACiAJCW1zbGVlcCgyMCk7CiAJfQogCi0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfRElTQUJMRSwgMHgwMDAwLCAwLCAwLCBOVUxMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9ESVNBQkxFLCAweDAwMDAsIDAsIDAsIE5VTEwsIDApOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9lcnIobmV0LCAiRmFpbGVkIHRvIGRpc2FibGUgRUVQUk9NIHdyaXRlXG4iKTsKIAkJZ290byBmcmVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2FzaXhfZGV2aWNlcy5jIGIvZHJpdmVycy9uZXQvdXNiL2FzaXhfZGV2aWNlcy5jCmluZGV4IDVjYWJlZmMuLmNjZTI0OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9hc2l4X2RldmljZXMuYworKysgYi9kcml2ZXJzL25ldC91c2IvYXNpeF9kZXZpY2VzLmMKQEAgLTM1LDYgKzM1LDE1IEBACiAKICNkZWZpbmUJUEhZX01PREVfUlRMODIxMUNMCTB4MDAwQwogCisjZGVmaW5lIEFYODg3NzJBX1BIWTE0SAkJMHgxNAorI2RlZmluZSBBWDg4NzcyQV9QSFkxNEhfREVGQVVMVCAweDQ0MkMKKworI2RlZmluZSBBWDg4NzcyQV9QSFkxNUgJCTB4MTUKKyNkZWZpbmUgQVg4ODc3MkFfUEhZMTVIX0RFRkFVTFQgMHgwM0M4CisKKyNkZWZpbmUgQVg4ODc3MkFfUEhZMTZICQkweDE2CisjZGVmaW5lIEFYODg3NzJBX1BIWTE2SF9ERUZBVUxUIDB4NDA0NAorCiBzdHJ1Y3QgYXg4ODE3Ml9pbnRfZGF0YSB7CiAJX19sZTE2IHJlczE7CiAJdTggbGluazsKQEAgLTc5LDYgKzg4LDggQEAKIAkvKiBQb2xsIGZvciB0aGUgcmFyZSBjYXNlIHRoZSBGVyBvciBwaHkgaXNuJ3QgcmVhZHkgeWV0LiAgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKIAkJcGh5X3JlZyA9IGFzaXhfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9QSFlTSUQxKTsKKwkJaWYgKHBoeV9yZWcgPCAwKQorCQkJcmV0dXJuIDA7CiAJCWlmIChwaHlfcmVnICE9IDAgJiYgcGh5X3JlZyAhPSAweEZGRkYpCiAJCQlicmVhazsKIAkJbWRlbGF5KDEpOwpAQCAtMTg0LDcgKzE5NSw3IEBACiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImF4ODgxNzJfbGlua19yZXNldCgpIHNwZWVkOiAldSBkdXBsZXg6ICVkIHNldHRpbmcgbW9kZSB0byAweCUwNHhcbiIsCiAJCSAgIGV0aHRvb2xfY21kX3NwZWVkKCZlY21kKSwgZWNtZC5kdXBsZXgsIG1vZGUpOwogCi0JYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1vZGUpOworCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjAxLDYgKzIxMiwyOCBAQAogCS5uZG9fc2V0X3J4X21vZGUJPSBheDg4MTcyX3NldF9tdWx0aWNhc3QsCiB9OwogCitzdGF0aWMgdm9pZCBhc2l4X3BoeV9yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYsIHVuc2lnbmVkIGludCByZXNldF9iaXRzKQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gNTAwMDsKKworCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwgcmVzZXRfYml0cyk7CisKKwkvKiBnaXZlIHBoeV9pZCBhIGNoYW5jZSB0byBwcm9jZXNzIHJlc2V0ICovCisJdWRlbGF5KDUwMCk7CisKKwkvKiBTZWUgSUVFRSA4MDIuMyAiMjIuMi40LjEuMSBSZXNldCI6IDUwMG1zIG1heCAqLworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJaWYgKGFzaXhfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9CTUNSKQorCQkJCQkJCSYgQk1DUl9SRVNFVCkKKwkJCXVkZWxheSgxMDApOworCQllbHNlCisJCQlyZXR1cm47CisJfQorCisJbmV0ZGV2X2VycihkZXYtPm5ldCwgIkJNQ1JfUkVTRVQgdGltZW91dCBvbiBwaHlfaWQgJWRcbiIsCisJCSAgIGRldi0+bWlpLnBoeV9pZCk7Cit9CisKIHN0YXRpYyBpbnQgYXg4ODE3Ml9iaW5kKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJaW50IHJldCA9IDA7CkBAIC0yMTMsMTggKzI0NiwxOSBAQAogCS8qIFRvZ2dsZSB0aGUgR1BJT3MgaW4gYSBtYW51ZmFjdHVyZXIvbW9kZWwgc3BlY2lmaWMgd2F5ICovCiAJZm9yIChpID0gMjsgaSA+PSAwOyBpLS0pIHsKIAkJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfR1BJT1MsCi0JCQkJKGdwaW9fYml0cyA+PiAoaSAqIDgpKSAmIDB4ZmYsIDAsIDAsIE5VTEwpOworCQkJCShncGlvX2JpdHMgPj4gKGkgKiA4KSkgJiAweGZmLCAwLCAwLCBOVUxMLCAwKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAkJbXNsZWVwKDUpOwogCX0KIAotCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgMHg4MCk7CisJcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCAweDgwLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKIAkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCi0JcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYODgxNzJfQ01EX1JFQURfTk9ERV9JRCwgMCwgMCwgRVRIX0FMRU4sIGJ1Zik7CisJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYODgxNzJfQ01EX1JFQURfTk9ERV9JRCwKKwkJCSAgICAwLCAwLCBFVEhfQUxFTiwgYnVmLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZGJnKGRldi0+bmV0LCAicmVhZCBBWF9DTURfUkVBRF9OT0RFX0lEIGZhaWxlZDogJWRcbiIsCiAJCQkgICByZXQpOwpAQCAtMjQ2LDcgKzI4MCw3IEBACiAJZGV2LT5uZXQtPm5lZWRlZF9oZWFkcm9vbSA9IDQ7IC8qIGNmIGFzaXhfdHhfZml4dXAoKSAqLwogCWRldi0+bmV0LT5uZWVkZWRfdGFpbHJvb20gPSA0OyAvKiBjZiBhc2l4X3R4X2ZpeHVwKCkgKi8KIAotCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJYXNpeF9waHlfcmVzZXQoZGV2LCBCTUNSX1JFU0VUKTsKIAlhc2l4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKIAkJQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX1BBVVNFX0NBUCk7CiAJbWlpX253YXlfcmVzdGFydCgmZGV2LT5taWkpOwpAQCAtMjkwLDcgKzMyNCw3IEBACiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgImF4ODg3NzJfbGlua19yZXNldCgpIHNwZWVkOiAldSBkdXBsZXg6ICVkIHNldHRpbmcgbW9kZSB0byAweCUwNHhcbiIsCiAJCSAgIGV0aHRvb2xfY21kX3NwZWVkKCZlY21kKSwgZWNtZC5kdXBsZXgsIG1vZGUpOwogCi0JYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1vZGUpOworCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlLCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjk4LDEwMCArMzMyLDExNSBAQAogc3RhdGljIGludCBheDg4NzcyX3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldikKIHsKIAlzdHJ1Y3QgYXNpeF9kYXRhICpkYXRhID0gKHN0cnVjdCBhc2l4X2RhdGEgKikmZGV2LT5kYXRhOwotCWludCByZXQsIGVtYmRfcGh5OwotCXUxNiByeF9jdGw7CisJaW50IHJldDsKIAotCXJldCA9IGFzaXhfd3JpdGVfZ3BpbyhkZXYsCi0JCQlBWF9HUElPX1JTRSB8IEFYX0dQSU9fR1BPXzIgfCBBWF9HUElPX0dQTzJFTiwgNSk7CisJLyogUmV3cml0ZSBNQUMgYWRkcmVzcyAqLworCWV0aGVyX2FkZHJfY29weShkYXRhLT5tYWNfYWRkciwgZGV2LT5uZXQtPmRldl9hZGRyKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9OT0RFX0lELCAwLCAwLAorCQkJICAgICBFVEhfQUxFTiwgZGF0YS0+bWFjX2FkZHIsIDApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCWVtYmRfcGh5ID0gKChhc2l4X2dldF9waHlfYWRkcihkZXYpICYgMHgxZikgPT0gMHgxMCA/IDEgOiAwKTsKKwkvKiBTZXQgUlhfQ1RMIHRvIGRlZmF1bHQgdmFsdWVzIHdpdGggMmsgYnVmZmVyLCBhbmQgZW5hYmxlIGNhY3R1cyAqLworCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgQVhfREVGQVVMVF9SWF9DVEwsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKIAotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1BIWV9TRUxFQ1QsIGVtYmRfcGh5LCAwLCAwLCBOVUxMKTsKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgQVg4ODc3Ml9NRURJVU1fREVGQVVMVCwgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0dXJuIDA7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF4ODg3NzJfaHdfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2LCBpbnQgaW5fcG0pCit7CisJc3RydWN0IGFzaXhfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgYXNpeF9kYXRhICopJmRldi0+ZGF0YTsKKwlpbnQgcmV0LCBlbWJkX3BoeTsKKwl1MTYgcnhfY3RsOworCisJcmV0ID0gYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19SU0UgfCBBWF9HUElPX0dQT18yIHwKKwkJCSAgICAgIEFYX0dQSU9fR1BPMkVOLCA1LCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJZW1iZF9waHkgPSAoKGRldi0+bWlpLnBoeV9pZCAmIDB4MWYpID09IDB4MTAgPyAxIDogMCk7CisKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19QSFlfU0VMRUNULCBlbWJkX3BoeSwKKwkJCSAgICAgMCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJTZWxlY3QgUEhZICMxIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUEQgfCBBWF9TV1JFU0VUX1BSTCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JbXNsZWVwKDE1MCk7Ci0KLQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9DTEVBUik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JbXNsZWVwKDE1MCk7Ci0KIAlpZiAoZW1iZF9waHkpIHsKLQkJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfSVBSTCk7CisJCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUEQsIGluX3BtKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQl1c2xlZXBfcmFuZ2UoMTAwMDAsIDExMDAwKTsKKworCQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9DTEVBUiwgaW5fcG0pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCW1zbGVlcCg2MCk7CisKKwkJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfSVBSTCB8IEFYX1NXUkVTRVRfUFJMLAorCQkJCSAgICBpbl9wbSk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJfSBlbHNlIHsKLQkJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfUFJURSk7CisJCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUEQgfCBBWF9TV1JFU0VUX1BSTCwKKwkJCQkgICAgaW5fcG0pOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OwogCX0KIAogCW1zbGVlcCgxNTApOwotCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2KTsKLQluZXRkZXZfZGJnKGRldi0+bmV0LCAiUlhfQ1RMIGlzIDB4JTA0eCBhZnRlciBzb2Z0d2FyZSByZXNldFxuIiwgcnhfY3RsKTsKLQlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIDB4MDAwMCk7CisKKwlpZiAoaW5fcG0gJiYgKCFhc2l4X21kaW9fcmVhZF9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgIE1JSV9QSFlTSUQxKSkpeworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIEFYX0RFRkFVTFRfUlhfQ1RMLCBpbl9wbSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOwotCW5ldGRldl9kYmcoZGV2LT5uZXQsICJSWF9DVEwgaXMgMHglMDR4IHNldHRpbmcgdG8gMHgwMDAwXG4iLCByeF9jdGwpOwotCi0JcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfUFJMKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXQ7Ci0KLQltc2xlZXAoMTUwKTsKLQotCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUkwgfCBBWF9TV1JFU0VUX1BSTCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JbXNsZWVwKDE1MCk7Ci0KLQlhc2l4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOwotCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAotCQkJQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV9DU01BKTsKLQltaWlfbndheV9yZXN0YXJ0KCZkZXYtPm1paSk7Ci0KLQlyZXQgPSBhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgQVg4ODc3Ml9NRURJVU1fREVGQVVMVCk7CisJcmV0ID0gYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIEFYODg3NzJfTUVESVVNX0RFRkFVTFQsIGluX3BtKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9JUEcwLAotCQkJCUFYODg3NzJfSVBHMF9ERUZBVUxUIHwgQVg4ODc3Ml9JUEcxX0RFRkFVTFQsCi0JCQkJQVg4ODc3Ml9JUEcyX0RFRkFVTFQsIDAsIE5VTEwpOworCQkJICAgICBBWDg4NzcyX0lQRzBfREVGQVVMVCB8IEFYODg3NzJfSVBHMV9ERUZBVUxULAorCQkJICAgICBBWDg4NzcyX0lQRzJfREVGQVVMVCwgMCwgTlVMTCwgaW5fcG0pOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJXcml0ZSBJUEcsSVBHMSxJUEcyIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCWdvdG8gb3V0OwogCX0KIAogCS8qIFJld3JpdGUgTUFDIGFkZHJlc3MgKi8KLQltZW1jcHkoZGF0YS0+bWFjX2FkZHIsIGRldi0+bmV0LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX05PREVfSUQsIDAsIDAsIEVUSF9BTEVOLAotCQkJCQkJCWRhdGEtPm1hY19hZGRyKTsKKwlldGhlcl9hZGRyX2NvcHkoZGF0YS0+bWFjX2FkZHIsIGRldi0+bmV0LT5kZXZfYWRkcik7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTk9ERV9JRCwgMCwgMCwKKwkJCSAgICAgRVRIX0FMRU4sIGRhdGEtPm1hY19hZGRyLCBpbl9wbSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCiAJLyogU2V0IFJYX0NUTCB0byBkZWZhdWx0IHZhbHVlcyB3aXRoIDJrIGJ1ZmZlciwgYW5kIGVuYWJsZSBjYWN0dXMgKi8KLQlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIEFYX0RFRkFVTFRfUlhfQ1RMKTsKKwlyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIEFYX0RFRkFVTFRfUlhfQ1RMLCBpbl9wbSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOworCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2LCBpbl9wbSk7CiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlJYX0NUTCBpcyAweCUwNHggYWZ0ZXIgYWxsIGluaXRpYWxpemF0aW9uc1xuIiwKIAkJICAgcnhfY3RsKTsKIAotCXJ4X2N0bCA9IGFzaXhfcmVhZF9tZWRpdW1fc3RhdHVzKGRldik7CisJcnhfY3RsID0gYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoZGV2LCBpbl9wbSk7CiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwKIAkJICAgIk1lZGl1bSBTdGF0dXMgaXMgMHglMDR4IGFmdGVyIGFsbCBpbml0aWFsaXphdGlvbnNcbiIsCiAJCSAgIHJ4X2N0bCk7CkBAIC00MDAsNyArNDQ5LDE0MCBAQAogCiBvdXQ6CiAJcmV0dXJuIHJldDsKK30KIAorc3RhdGljIGludCBheDg4NzcyYV9od19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYsIGludCBpbl9wbSkKK3sKKwlzdHJ1Y3QgYXNpeF9kYXRhICpkYXRhID0gKHN0cnVjdCBhc2l4X2RhdGEgKikmZGV2LT5kYXRhOworCWludCByZXQsIGVtYmRfcGh5OworCXUxNiByeF9jdGwsIHBoeTE0aCwgcGh5MTVoLCBwaHkxNmg7CisJdTggY2hpcGNvZGUgPSAwOworCisJcmV0ID0gYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19SU0UsIDUsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwllbWJkX3BoeSA9ICgoZGV2LT5taWkucGh5X2lkICYgMHgxZikgPT0gMHgxMCA/IDEgOiAwKTsKKworCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NXX1BIWV9TRUxFQ1QsIGVtYmRfcGh5IHwKKwkJCSAgICAgQVhfUEhZU0VMX1NTRU4sIDAsIDAsIE5VTEwsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkgeworCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiU2VsZWN0IFBIWSAjMSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7CisKKwlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFBEIHwgQVhfU1dSRVNFVF9JUFJMLCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7CisKKwlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFJMLCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJbXNsZWVwKDE2MCk7CisKKwlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9DTEVBUiwgaW5fcG0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IGFzaXhfc3dfcmVzZXQoZGV2LCBBWF9TV1JFU0VUX0lQUkwsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwltc2xlZXAoMjAwKTsKKworCWlmIChpbl9wbSAmJiAoIWFzaXhfbWRpb19yZWFkX25vcG0oZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJICAgTUlJX1BIWVNJRDEpKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9TVEFUTU5HU1RTX1JFRywgMCwKKwkJCSAgICAwLCAxLCAmY2hpcGNvZGUsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoKGNoaXBjb2RlICYgQVhfQ0hJUENPREVfTUFTSykgPT0gQVhfQVg4ODc3MkJfQ0hJUENPREUpIHsKKwkJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9RQ1RDVFJMLCAweDgwMDAsIDB4ODAwMSwKKwkJCQkgICAgIDAsIE5VTEwsIGluX3BtKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJXcml0ZSBCUSBzZXR0aW5nIGZhaWxlZDogJWRcbiIsCisJCQkJICAgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIGlmICgoY2hpcGNvZGUgJiBBWF9DSElQQ09ERV9NQVNLKSA9PSBBWF9BWDg4NzcyQV9DSElQQ09ERSkgeworCQkvKiBDaGVjayBpZiB0aGUgUEhZIHJlZ2lzdGVycyBoYXZlIGRlZmF1bHQgc2V0dGluZ3MgKi8KKwkJcGh5MTRoID0gYXNpeF9tZGlvX3JlYWRfbm9wbShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE0SCk7CisJCXBoeTE1aCA9IGFzaXhfbWRpb19yZWFkX25vcG0oZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJICAgICBBWDg4NzcyQV9QSFkxNUgpOworCQlwaHkxNmggPSBhc2l4X21kaW9fcmVhZF9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgICAgQVg4ODc3MkFfUEhZMTZIKTsKKworCQluZXRkZXZfZGJnKGRldi0+bmV0LAorCQkJICAgIjc3MmFfaHdfcmVzZXQ6IE1SMjA9MHgleCBNUjIxPTB4JXggTVIyMj0weCV4XG4iLAorCQkJICAgcGh5MTRoLCBwaHkxNWgsIHBoeTE2aCk7CisKKwkJLyogUmVzdG9yZSBQSFkgcmVnaXN0ZXJzIGRlZmF1bHQgc2V0dGluZyBpZiBub3QgKi8KKwkJaWYgKHBoeTE0aCAhPSBBWDg4NzcyQV9QSFkxNEhfREVGQVVMVCkKKwkJCWFzaXhfbWRpb193cml0ZV9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgICAgQVg4ODc3MkFfUEhZMTRILAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE0SF9ERUZBVUxUKTsKKwkJaWYgKHBoeTE1aCAhPSBBWDg4NzcyQV9QSFkxNUhfREVGQVVMVCkKKwkJCWFzaXhfbWRpb193cml0ZV9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgICAgQVg4ODc3MkFfUEhZMTVILAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE1SF9ERUZBVUxUKTsKKwkJaWYgKHBoeTE2aCAhPSBBWDg4NzcyQV9QSFkxNkhfREVGQVVMVCkKKwkJCWFzaXhfbWRpb193cml0ZV9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJCSAgICAgQVg4ODc3MkFfUEhZMTZILAorCQkJCQkgICAgIEFYODg3NzJBX1BIWTE2SF9ERUZBVUxUKTsKKwl9CisKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9JUEcwLAorCQkJCUFYODg3NzJfSVBHMF9ERUZBVUxUIHwgQVg4ODc3Ml9JUEcxX0RFRkFVTFQsCisJCQkJQVg4ODc3Ml9JUEcyX0RFRkFVTFQsIDAsIE5VTEwsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkgeworCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiV3JpdGUgSVBHLElQRzEsSVBHMiBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBSZXdyaXRlIE1BQyBhZGRyZXNzICovCisJbWVtY3B5KGRhdGEtPm1hY19hZGRyLCBkZXYtPm5ldC0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9OT0RFX0lELCAwLCAwLCBFVEhfQUxFTiwKKwkJCQkJCQlkYXRhLT5tYWNfYWRkciwgaW5fcG0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIFNldCBSWF9DVEwgdG8gZGVmYXVsdCB2YWx1ZXMgd2l0aCAyayBidWZmZXIsIGFuZCBlbmFibGUgY2FjdHVzICovCisJcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCBBWF9ERUZBVUxUX1JYX0NUTCwgaW5fcG0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBBWDg4NzcyX01FRElVTV9ERUZBVUxULCBpbl9wbSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBTZXQgUlhfQ1RMIHRvIGRlZmF1bHQgdmFsdWVzIHdpdGggMmsgYnVmZmVyLCBhbmQgZW5hYmxlIGNhY3R1cyAqLworCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgQVhfREVGQVVMVF9SWF9DVEwsIGluX3BtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyeF9jdGwgPSBhc2l4X3JlYWRfcnhfY3RsKGRldiwgaW5fcG0pOworCW5ldGRldl9kYmcoZGV2LT5uZXQsICJSWF9DVEwgaXMgMHglMDR4IGFmdGVyIGFsbCBpbml0aWFsaXphdGlvbnNcbiIsCisJCSAgIHJ4X2N0bCk7CisKKwlyeF9jdGwgPSBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYsIGluX3BtKTsKKwluZXRkZXZfZGJnKGRldi0+bmV0LAorCQkgICAiTWVkaXVtIFN0YXR1cyBpcyAweCUwNHggYWZ0ZXIgYWxsIGluaXRpYWxpemF0aW9uc1xuIiwKKwkJICAgcnhfY3RsKTsKKworCXJldHVybiAwOworCitvdXQ6CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBheDg4NzcyX25ldGRldl9vcHMgPSB7CkBAIC00MTUsMTEgKzU5Nyw5NyBAQAogCS5uZG9fc2V0X3J4X21vZGUgICAgICAgID0gYXNpeF9zZXRfbXVsdGljYXN0LAogfTsKIAorc3RhdGljIHZvaWQgYXg4ODc3Ml9zdXNwZW5kKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZHJpdmVyX3ByaXY7CisJdTE2IG1lZGl1bTsKKworCS8qIFN0b3AgTUFDIG9wZXJhdGlvbiAqLworCW1lZGl1bSA9IGFzaXhfcmVhZF9tZWRpdW1fc3RhdHVzKGRldiwgMCk7CisJbWVkaXVtICY9IH5BWF9NRURJVU1fUkU7CisJYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1lZGl1bSwgMCk7CisKKwluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXg4ODc3Ml9zdXNwZW5kOiBtZWRpdW09MHglMDR4XG4iLAorCQkgICBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYsIDApKTsKKworCS8qIFByZXNlcnZlIEJNQ1IgZm9yIHJlc3RvcmluZyAqLworCXByaXYtPnByZXN2ZF9waHlfYm1jciA9CisJCWFzaXhfbWRpb19yZWFkX25vcG0oZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IpOworCisJLyogUHJlc2VydmUgQU5BUiBmb3IgcmVzdG9yaW5nICovCisJcHJpdi0+cHJlc3ZkX3BoeV9hZHZlcnRpc2UgPQorCQlhc2l4X21kaW9fcmVhZF9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOworfQorCitzdGF0aWMgaW50IGFzaXhfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZHJpdmVyX3ByaXY7CisKKwlpZiAocHJpdi0+c3VzcGVuZCkKKwkJcHJpdi0+c3VzcGVuZChkZXYpOworCisJcmV0dXJuIHVzYm5ldF9zdXNwZW5kKGludGYsIG1lc3NhZ2UpOworfQorCitzdGF0aWMgdm9pZCBheDg4NzcyX3Jlc3RvcmVfcGh5KHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZHJpdmVyX3ByaXY7CisKKwlpZiAocHJpdi0+cHJlc3ZkX3BoeV9hZHZlcnRpc2UpIHsKKwkJLyogUmVzdG9yZSBBZHZlcnRpc2VtZW50IGNvbnRyb2wgcmVnICovCisJCWFzaXhfbWRpb193cml0ZV9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UsCisJCQkJICAgICBwcml2LT5wcmVzdmRfcGh5X2FkdmVydGlzZSk7CisKKwkJLyogUmVzdG9yZSBCTUNSICovCisJCWFzaXhfbWRpb193cml0ZV9ub3BtKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9CTUNSLAorCQkJCSAgICAgcHJpdi0+cHJlc3ZkX3BoeV9ibWNyKTsKKworCQltaWlfbndheV9yZXN0YXJ0KCZkZXYtPm1paSk7CisJCXByaXYtPnByZXN2ZF9waHlfYWR2ZXJ0aXNlID0gMDsKKwkJcHJpdi0+cHJlc3ZkX3BoeV9ibWNyID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGF4ODg3NzJfcmVzdW1lKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCWlmICghYXg4ODc3Ml9od19yZXNldChkZXYsIDEpKQorCQkJYnJlYWs7CisJYXg4ODc3Ml9yZXN0b3JlX3BoeShkZXYpOworfQorCitzdGF0aWMgdm9pZCBheDg4NzcyYV9yZXN1bWUoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAoIWF4ODg3NzJhX2h3X3Jlc2V0KGRldiwgMSkpCisJCQlicmVhazsKKwl9CisKKwlheDg4NzcyX3Jlc3RvcmVfcGh5KGRldik7Cit9CisKK3N0YXRpYyBpbnQgYXNpeF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgYXNpeF9jb21tb25fcHJpdmF0ZSAqcHJpdiA9IGRldi0+ZHJpdmVyX3ByaXY7CisKKwlpZiAocHJpdi0+cmVzdW1lKQorCQlwcml2LT5yZXN1bWUoZGV2KTsKKworCXJldHVybiB1c2JuZXRfcmVzdW1lKGludGYpOworfQorCiBzdGF0aWMgaW50IGF4ODg3NzJfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewotCWludCByZXQsIGVtYmRfcGh5LCBpOwotCXU4IGJ1ZltFVEhfQUxFTl07CisJaW50IHJldCwgaTsKKwl1OCBidWZbRVRIX0FMRU5dLCBjaGlwY29kZSA9IDA7CiAJdTMyIHBoeWlkOworCXN0cnVjdCBhc2l4X2NvbW1vbl9wcml2YXRlICpwcml2OwogCiAJdXNibmV0X2dldF9lbmRwb2ludHMoZGV2LGludGYpOwogCkBAIC00MjcsMTMgKzY5NSwxMyBAQAogCWlmIChkZXYtPmRyaXZlcl9pbmZvLT5kYXRhICYgRkxBR19FRVBST01fTUFDKSB7CiAJCWZvciAoaSA9IDA7IGkgPCAoRVRIX0FMRU4gPj4gMSk7IGkrKykgewogCQkJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX0VFUFJPTSwgMHgwNCArIGksCi0JCQkJCTAsIDIsIGJ1ZiArIGkgKiAyKTsKKwkJCQkJICAgIDAsIDIsIGJ1ZiArIGkgKiAyLCAwKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIHsKIAkJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX05PREVfSUQsCi0JCQkJMCwgMCwgRVRIX0FMRU4sIGJ1Zik7CisJCQkJMCwgMCwgRVRIX0FMRU4sIGJ1ZiwgMCk7CiAJfQogCiAJaWYgKHJldCA8IDApIHsKQEAgLTQ1NiwxNiArNzI0LDExIEBACiAJZGV2LT5uZXQtPm5lZWRlZF9oZWFkcm9vbSA9IDQ7IC8qIGNmIGFzaXhfdHhfZml4dXAoKSAqLwogCWRldi0+bmV0LT5uZWVkZWRfdGFpbHJvb20gPSA0OyAvKiBjZiBhc2l4X3R4X2ZpeHVwKCkgKi8KIAotCWVtYmRfcGh5ID0gKChkZXYtPm1paS5waHlfaWQgJiAweDFmKSA9PSAweDEwID8gMSA6IDApOworCWFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfU1RBVE1OR1NUU19SRUcsIDAsIDAsIDEsICZjaGlwY29kZSwgMCk7CisJY2hpcGNvZGUgJj0gQVhfQ0hJUENPREVfTUFTSzsKIAotCS8qIFJlc2V0IHRoZSBQSFkgdG8gbm9ybWFsIG9wZXJhdGlvbiBtb2RlICovCi0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUEhZX1NFTEVDVCwgZW1iZF9waHksIDAsIDAsIE5VTEwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCW5ldGRldl9kYmcoZGV2LT5uZXQsICJTZWxlY3QgUEhZICMxIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JYXg4ODc3Ml9yZXNldChkZXYpOworCShjaGlwY29kZSA9PSBBWF9BWDg4NzcyX0NISVBDT0RFKSA/IGF4ODg3NzJfaHdfcmVzZXQoZGV2LCAwKSA6CisJCQkJCSAgICBheDg4NzcyYV9od19yZXNldChkZXYsIDApOwogCiAJLyogUmVhZCBQSFlJRCByZWdpc3RlciAqQUZURVIqIHRoZSBQSFkgd2FzIHJlc2V0IHByb3Blcmx5ICovCiAJcGh5aWQgPSBhc2l4X2dldF9waHlpZChkZXYpOwpAQCAtNDgyLDYgKzc0NSwxOCBAQAogCWlmICghZGV2LT5kcml2ZXJfcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlwcml2ID0gZGV2LT5kcml2ZXJfcHJpdjsKKworCXByaXYtPnByZXN2ZF9waHlfYm1jciA9IDA7CisJcHJpdi0+cHJlc3ZkX3BoeV9hZHZlcnRpc2UgPSAwOworCWlmIChjaGlwY29kZSA9PSBBWF9BWDg4NzcyX0NISVBDT0RFKSB7CisJCXByaXYtPnJlc3VtZSA9IGF4ODg3NzJfcmVzdW1lOworCQlwcml2LT5zdXNwZW5kID0gYXg4ODc3Ml9zdXNwZW5kOworCX0gZWxzZSB7CisJCXByaXYtPnJlc3VtZSA9IGF4ODg3NzJhX3Jlc3VtZTsKKwkJcHJpdi0+c3VzcGVuZCA9IGF4ODg3NzJfc3VzcGVuZDsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTkzLDEyICs4NjgsMTIgQEAKIAlpbnQgZ3BpbzAgPSAwOwogCXUzMiBwaHlpZDsKIAotCWFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9HUElPUywgMCwgMCwgMSwgJnN0YXR1cyk7CisJYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX0dQSU9TLCAwLCAwLCAxLCAmc3RhdHVzLCAwKTsKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiR1BJTyBTdGF0dXM6IDB4JTA0eFxuIiwgc3RhdHVzKTsKIAotCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0VOQUJMRSwgMCwgMCwgMCwgTlVMTCk7Ci0JYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX0VFUFJPTSwgMHgwMDE3LCAwLCAyLCAmZWVwcm9tKTsKLQlhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9ESVNBQkxFLCAwLCAwLCAwLCBOVUxMKTsKKwlhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9FTkFCTEUsIDAsIDAsIDAsIE5VTEwsIDApOworCWFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9FRVBST00sIDB4MDAxNywgMCwgMiwgJmVlcHJvbSwgMCk7CisJYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfRElTQUJMRSwgMCwgMCwgMCwgTlVMTCwgMCk7CiAKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiRUVQUk9NIGluZGV4IDB4MTcgaXMgMHglMDR4XG4iLCBlZXByb20pOwogCkBAIC02MTQsMTUgKzg4OSwxNiBAQAogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJHUElPMDogJWQsIFBoeU1vZGU6ICVkXG4iLCBncGlvMCwgZGF0YS0+cGh5bW9kZSk7CiAKIAkvKiBQb3dlciB1cCBleHRlcm5hbCBHaWdhUEhZIHRocm91Z2ggQVg4ODE3OCBHUElPIHBpbiAqLwotCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fUlNFIHwgQVhfR1BJT19HUE9fMSB8IEFYX0dQSU9fR1BPMUVOLCA0MCk7CisJYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19SU0UgfCBBWF9HUElPX0dQT18xIHwKKwkJCUFYX0dQSU9fR1BPMUVOLCA0MCwgMCk7CiAJaWYgKChsZTE2X3RvX2NwdShlZXByb20pID4+IDgpICE9IDEpIHsKLQkJYXNpeF93cml0ZV9ncGlvKGRldiwgMHgwMDNjLCAzMCk7Ci0JCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIDB4MDAxYywgMzAwKTsKLQkJYXNpeF93cml0ZV9ncGlvKGRldiwgMHgwMDNjLCAzMCk7CisJCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIDB4MDAzYywgMzAsIDApOworCQlhc2l4X3dyaXRlX2dwaW8oZGV2LCAweDAwMWMsIDMwMCwgMCk7CisJCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIDB4MDAzYywgMzAsIDApOwogCX0gZWxzZSB7CiAJCW5ldGRldl9kYmcoZGV2LT5uZXQsICJncGlvIHBoeW1vZGUgPT0gMSBwYXRoXG4iKTsKLQkJYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19HUE8xRU4sIDMwKTsKLQkJYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19HUE8xRU4gfCBBWF9HUElPX0dQT18xLCAzMCk7CisJCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fR1BPMUVOLCAzMCwgMCk7CisJCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fR1BPMUVOIHwgQVhfR1BJT19HUE9fMSwgMzAsIDApOwogCX0KIAogCS8qIFJlYWQgUEhZSUQgcmVnaXN0ZXIgKkFGVEVSKiBwb3dlcmluZyB1cCBQSFkgKi8KQEAgLTYzMCwxNSArOTA2LDE1IEBACiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlBIWUlEPTB4JTA4eFxuIiwgcGh5aWQpOwogCiAJLyogU2V0IEFYODgxNzggdG8gZW5hYmxlIE1JSS9HTUlJL1JHTUlJIGludGVyZmFjZSBmb3IgZXh0ZXJuYWwgUEhZICovCi0JYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUEhZX1NFTEVDVCwgMCwgMCwgMCwgTlVMTCk7CisJYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUEhZX1NFTEVDVCwgMCwgMCwgMCwgTlVMTCwgMCk7CiAKLQlhc2l4X3N3X3Jlc2V0KGRldiwgMCk7CisJYXNpeF9zd19yZXNldChkZXYsIDAsIDApOwogCW1zbGVlcCgxNTApOwogCi0JYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfUFJMIHwgQVhfU1dSRVNFVF9JUFBEKTsKKwlhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9QUkwgfCBBWF9TV1JFU0VUX0lQUEQsIDApOwogCW1zbGVlcCgxNTApOwogCi0JYXNpeF93cml0ZV9yeF9jdGwoZGV2LCAwKTsKKwlhc2l4X3dyaXRlX3J4X2N0bChkZXYsIDAsIDApOwogCiAJaWYgKGRhdGEtPnBoeW1vZGUgPT0gUEhZX01PREVfTUFSVkVMTCkgewogCQltYXJ2ZWxsX3BoeV9pbml0KGRldik7CkBAIC02NDYsMjcgKzkyMiwyMyBAQAogCX0gZWxzZSBpZiAoZGF0YS0+cGh5bW9kZSA9PSBQSFlfTU9ERV9SVEw4MjExQ0wpCiAJCXJ0bDgyMTFjbF9waHlfaW5pdChkZXYpOwogCi0JYXNpeF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9CTUNSLAotCQkJQk1DUl9SRVNFVCB8IEJNQ1JfQU5FTkFCTEUpOworCWFzaXhfcGh5X3Jlc2V0KGRldiwgQk1DUl9SRVNFVCB8IEJNQ1JfQU5FTkFCTEUpOwogCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAogCQkJQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV9DU01BIHwgQURWRVJUSVNFX1BBVVNFX0NBUCk7CiAJYXNpeF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9DVFJMMTAwMCwKIAkJCUFEVkVSVElTRV8xMDAwRlVMTCk7CiAKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgQVg4ODE3OF9NRURJVU1fREVGQVVMVCwgMCk7CiAJbWlpX253YXlfcmVzdGFydCgmZGV2LT5taWkpOwogCi0JcmV0ID0gYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIEFYODgxNzhfTUVESVVNX0RFRkFVTFQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCiAJLyogUmV3cml0ZSBNQUMgYWRkcmVzcyAqLwogCW1lbWNweShkYXRhLT5tYWNfYWRkciwgZGV2LT5uZXQtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTk9ERV9JRCwgMCwgMCwgRVRIX0FMRU4sCi0JCQkJCQkJZGF0YS0+bWFjX2FkZHIpOworCQkJCQkJCWRhdGEtPm1hY19hZGRyLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgQVhfREVGQVVMVF9SWF9DVEwpOworCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgQVhfREVGQVVMVF9SWF9DVEwsIDApOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC03MDQsNyArOTc2LDcgQEAKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiYXg4ODE3OF9saW5rX3Jlc2V0KCkgc3BlZWQ6ICV1IGR1cGxleDogJWQgc2V0dGluZyBtb2RlIHRvIDB4JTA0eFxuIiwKIAkJICAgc3BlZWQsIGVjbWQuZHVwbGV4LCBtb2RlKTsKIAotCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlKTsKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbW9kZSwgMCk7CiAKIAlpZiAoZGF0YS0+cGh5bW9kZSA9PSBQSFlfTU9ERV9NQVJWRUxMICYmIGRhdGEtPmxlZG1vZGUpCiAJCW1hcnZlbGxfbGVkX3N0YXR1cyhkZXYsIHNwZWVkKTsKQEAgLTczMywxNSArMTAwNSwxNSBAQAogCQltZmIgPSBBWF9SWF9DVExfTUZCXzE2Mzg0OwogCX0KIAotCXJ4Y3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOwotCWFzaXhfd3JpdGVfcnhfY3RsKGRldiwgKHJ4Y3RsICYgfkFYX1JYX0NUTF9NRkJfMTYzODQpIHwgbWZiKTsKKwlyeGN0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2LCAwKTsKKwlhc2l4X3dyaXRlX3J4X2N0bChkZXYsIChyeGN0bCAmIH5BWF9SWF9DVExfTUZCXzE2Mzg0KSB8IG1mYiwgMCk7CiAKLQltZWRpdW0gPSBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYpOworCW1lZGl1bSA9IGFzaXhfcmVhZF9tZWRpdW1fc3RhdHVzKGRldiwgMCk7CiAJaWYgKGRldi0+bmV0LT5tdHUgPiAxNTAwKQogCQltZWRpdW0gfD0gQVhfTUVESVVNX0pGRTsKIAllbHNlCiAJCW1lZGl1bSAmPSB+QVhfTUVESVVNX0pGRTsKLQlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbWVkaXVtKTsKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbWVkaXVtLCAwKTsKIAogCWlmIChkZXYtPnJ4X3VyYl9zaXplID4gb2xkX3J4X3VyYl9zaXplKQogCQl1c2JuZXRfdW5saW5rX3J4X3VyYnMoZGV2KTsKQEAgLTc5MCw3ICsxMDYyLDcgQEAKIAl1c2JuZXRfZ2V0X2VuZHBvaW50cyhkZXYsaW50Zik7CiAKIAkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCi0JcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX05PREVfSUQsIDAsIDAsIEVUSF9BTEVOLCBidWYpOworCXJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9OT0RFX0lELCAwLCAwLCBFVEhfQUxFTiwgYnVmLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZGJnKGRldi0+bmV0LCAiRmFpbGVkIHRvIHJlYWQgTUFDIGFkZHJlc3M6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpAQCAtODExLDEwICsxMDgzLDEwIEBACiAJZGV2LT5uZXQtPmV0aHRvb2xfb3BzID0gJmF4ODgxNzhfZXRodG9vbF9vcHM7CiAKIAkvKiBCbGluayBMRURTIHNvIHVzZXJzIGtub3cgZHJpdmVyIHNhdyBkb25nbGUgKi8KLQlhc2l4X3N3X3Jlc2V0KGRldiwgMCk7CisJYXNpeF9zd19yZXNldChkZXYsIDAsIDApOwogCW1zbGVlcCgxNTApOwogCi0JYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfUFJMIHwgQVhfU1dSRVNFVF9JUFBEKTsKKwlhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9QUkwgfCBBWF9TV1JFU0VUX0lQUEQsIDApOwogCW1zbGVlcCgxNTApOwogCiAJLyogQXNpeCBmcmFtaW5nIHBhY2tzIG11bHRpcGxlIGV0aCBmcmFtZXMgaW50byBhIDJLIHVzYiBidWxrIHRyYW5zZmVyICovCkBAIC04NzcsNyArMTE0OSw3IEBACiAJLnVuYmluZCA9IGF4ODg3NzJfdW5iaW5kLAogCS5zdGF0dXMgPSBhc2l4X3N0YXR1cywKIAkubGlua19yZXNldCA9IGF4ODg3NzJfbGlua19yZXNldCwKLQkucmVzZXQgPSBheDg4NzcyX2xpbmtfcmVzZXQsCisJLnJlc2V0ID0gYXg4ODc3Ml9yZXNldCwKIAkuZmxhZ3MgPSBGTEFHX0VUSEVSIHwgRkxBR19GUkFNSU5HX0FYIHwgRkxBR19MSU5LX0lOVFIgfCBGTEFHX01VTFRJX1BBQ0tFVCwKIAkucnhfZml4dXAgPSBhc2l4X3J4X2ZpeHVwX2NvbW1vbiwKIAkudHhfZml4dXAgPSBhc2l4X3R4X2ZpeHVwLApAQCAtMTAwNSw3ICsxMjc3LDcgQEAKIH0sIHsKIAkvLyBMZW5vdm8gVTJMMTAwUCAxMC8xMDAKIAlVU0JfREVWSUNFICgweDE3ZWYsIDB4NzIwMyksCi0JLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZheDg4NzcyX2luZm8sCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJmF4ODg3NzJiX2luZm8sCiB9LCB7CiAJLy8gQVNJWCBBWDg4NzcyQiAxMC8xMDAKIAlVU0JfREVWSUNFICgweDBiOTUsIDB4NzcyYiksCkBAIC0xMDczLDcgKzEzNDUsNyBAQAogfSwgewogCS8vIEFzdXMgVVNCIEV0aGVybmV0IEFkYXB0ZXIKIAlVU0JfREVWSUNFICgweDBiOTUsIDB4N2UyYiksCi0JLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZheDg4NzcyX2luZm8sCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJmF4ODg3NzJiX2luZm8sCiB9LCB7CiAJLyogQVNJWCA4ODE3MmEgZGVtbyBib2FyZCAqLwogCVVTQl9ERVZJQ0UoMHgwYjk1LCAweDE3MmEpLApAQCAtMTA5NSw4ICsxMzY3LDggQEAKIAkubmFtZSA9CQlEUklWRVJfTkFNRSwKIAkuaWRfdGFibGUgPQlwcm9kdWN0cywKIAkucHJvYmUgPQl1c2JuZXRfcHJvYmUsCi0JLnN1c3BlbmQgPQl1c2JuZXRfc3VzcGVuZCwKLQkucmVzdW1lID0JdXNibmV0X3Jlc3VtZSwKKwkuc3VzcGVuZCA9CWFzaXhfc3VzcGVuZCwKKwkucmVzdW1lID0JYXNpeF9yZXN1bWUsCiAJLmRpc2Nvbm5lY3QgPQl1c2JuZXRfZGlzY29ubmVjdCwKIAkuc3VwcG9ydHNfYXV0b3N1c3BlbmQgPSAxLAogCS5kaXNhYmxlX2h1Yl9pbml0aWF0ZWRfbHBtID0gMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9heDg4MTcyYS5jIGIvZHJpdmVycy9uZXQvdXNiL2F4ODgxNzJhLmMKaW5kZXggMTYzYTJjNS4uNDlhM2JjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2F4ODgxNzJhLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2F4ODgxNzJhLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAl9CiAKIAlpZiAobW9kZSAhPSBwcml2LT5vbGRtb2RlKSB7Ci0JCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlKTsKKwkJYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1vZGUsIDApOwogCQlwcml2LT5vbGRtb2RlID0gbW9kZTsKIAkJbmV0ZGV2X2RiZyhuZXRkZXYsICJzcGVlZCAldSBkdXBsZXggJWQsIHNldHRpbmcgbW9kZSB0byAweCUwNHhcbiIsCiAJCQkgICBwaHlkZXYtPnNwZWVkLCBwaHlkZXYtPmR1cGxleCwgbW9kZSk7CkBAIC0xNzYsMTggKzE3NiwxOSBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFBEKTsKKwlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9JUFBELCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7CiAKIAltc2xlZXAoMTUwKTsKLQlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9DTEVBUik7CisJcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfQ0xFQVIsIDApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycjsKIAogCW1zbGVlcCgxNTApOwogCi0JcmV0ID0gYXNpeF9zd19yZXNldChkZXYsIGVtYmRfcGh5ID8gQVhfU1dSRVNFVF9JUFJMIDogQVhfU1dSRVNFVF9JUFBEKTsKKwlyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgZW1iZF9waHkgPyBBWF9TV1JFU0VUX0lQUkwgOiBBWF9TV1JFU0VUX0lQUEQsCisJCQkgICAgMCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyOwogCkBAIC0yMTMsNyArMjE0LDcgQEAKIAlkZXYtPmRyaXZlcl9wcml2ID0gcHJpdjsKIAogCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8KLQlyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTk9ERV9JRCwgMCwgMCwgRVRIX0FMRU4sIGJ1Zik7CisJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX05PREVfSUQsIDAsIDAsIEVUSF9BTEVOLCBidWYsIDApOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJGYWlsZWQgdG8gcmVhZCBNQUMgYWRkcmVzczogJWRcbiIsIHJldCk7CiAJCWdvdG8gZnJlZTsKQEAgLTIyNCw3ICsyMjUsNyBAQAogCWRldi0+bmV0LT5ldGh0b29sX29wcyA9ICZheDg4MTcyYV9ldGh0b29sX29wczsKIAogCS8qIGFyZSB3ZSB1c2luZyB0aGUgaW50ZXJuYWwgb3IgdGhlIGV4dGVybmFsIHBoeT8gKi8KLQlyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1NXX1BIWV9TVEFUVVMsIDAsIDAsIDEsIGJ1Zik7CisJcmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9TV19QSFlfU1RBVFVTLCAwLCAwLCAxLCBidWYsIDApOwogCWlmIChyZXQgPCAwKSB7CiAJCW5ldGRldl9lcnIoZGV2LT5uZXQsICJGYWlsZWQgdG8gcmVhZCBzb2Z0d2FyZSBpbnRlcmZhY2Ugc2VsZWN0aW9uIHJlZ2lzdGVyOiAlZFxuIiwKIAkJCSAgIHJldCk7CkBAIC0zMDMsMjAgKzMwNCwyMCBAQAogCWF4ODgxNzJhX3Jlc2V0X3BoeShkZXYsIHByaXYtPnVzZV9lbWJkcGh5KTsKIAogCW1zbGVlcCgxNTApOwotCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2KTsKKwlyeF9jdGwgPSBhc2l4X3JlYWRfcnhfY3RsKGRldiwgMCk7CiAJbmV0ZGV2X2RiZyhkZXYtPm5ldCwgIlJYX0NUTCBpcyAweCUwNHggYWZ0ZXIgc29mdHdhcmUgcmVzZXRcbiIsIHJ4X2N0bCk7Ci0JcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCAweDAwMDApOworCXJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgMHgwMDAwLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlyeF9jdGwgPSBhc2l4X3JlYWRfcnhfY3RsKGRldik7CisJcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYsIDApOwogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJSWF9DVEwgaXMgMHglMDR4IHNldHRpbmcgdG8gMHgwMDAwXG4iLCByeF9jdGwpOwogCiAJbXNsZWVwKDE1MCk7CiAKIAlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9JUEcwLAogCQkJICAgICBBWDg4NzcyX0lQRzBfREVGQVVMVCB8IEFYODg3NzJfSVBHMV9ERUZBVUxULAotCQkJICAgICBBWDg4NzcyX0lQRzJfREVGQVVMVCwgMCwgTlVMTCk7CisJCQkgICAgIEFYODg3NzJfSVBHMl9ERUZBVUxULCAwLCBOVUxMLCAwKTsKIAlpZiAocmV0IDwgMCkgewogCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiV3JpdGUgSVBHLElQRzEsSVBHMiBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIG91dDsKQEAgLTMyNSwyMCArMzI2LDIwIEBACiAJLyogUmV3cml0ZSBNQUMgYWRkcmVzcyAqLwogCW1lbWNweShkYXRhLT5tYWNfYWRkciwgZGV2LT5uZXQtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTk9ERV9JRCwgMCwgMCwgRVRIX0FMRU4sCi0JCQkgICAgIGRhdGEtPm1hY19hZGRyKTsKKwkJCSAgICAgZGF0YS0+bWFjX2FkZHIsIDApOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAogCS8qIFNldCBSWF9DVEwgdG8gZGVmYXVsdCB2YWx1ZXMgd2l0aCAyayBidWZmZXIsIGFuZCBlbmFibGUgY2FjdHVzICovCi0JcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCBBWF9ERUZBVUxUX1JYX0NUTCk7CisJcmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCBBWF9ERUZBVUxUX1JYX0NUTCwgMCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOworCXJ4X2N0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2LCAwKTsKIAluZXRkZXZfZGJnKGRldi0+bmV0LCAiUlhfQ1RMIGlzIDB4JTA0eCBhZnRlciBhbGwgaW5pdGlhbGl6YXRpb25zXG4iLAogCQkgICByeF9jdGwpOwogCi0JcnhfY3RsID0gYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoZGV2KTsKKwlyeF9jdGwgPSBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYsIDApOwogCW5ldGRldl9kYmcoZGV2LT5uZXQsICJNZWRpdW0gU3RhdHVzIGlzIDB4JTA0eCBhZnRlciBhbGwgaW5pdGlhbGl6YXRpb25zXG4iLAogCQkgICByeF9jdGwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvaHNvLmMgYi9kcml2ZXJzL25ldC91c2IvaHNvLmMKaW5kZXggNGI0NDU4Ni4uZTdiNTE2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2hzby5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9oc28uYwpAQCAtNTAsNiArNTAsOCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTA4LDIzICsxMTAsMTIgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIERlYnVnZ2luZyBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgRF9fKGx2bF8sIGZtdCwgYXJnLi4uKQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJcHJpbnRrKGx2bF8gIlslZDolc106ICIgZm10ICJcbiIsCVwKLQkJICAgICAgIF9fTElORV9fLCBfX2Z1bmNfXywgIyMgYXJnKTsJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRF8obHZsLCBhcmdzLi4uKQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJaWYgKGx2bCAmIGRlYnVnKQkJCVwKLQkJCURfXyhLRVJOX0lORk8sIGFyZ3MpOwkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRDEoYXJncy4uLikJRF8oMHgwMSwgIyNhcmdzKQotI2RlZmluZSBEMihhcmdzLi4uKQlEXygweDAyLCAjI2FyZ3MpCi0jZGVmaW5lIEQzKGFyZ3MuLi4pCURfKDB4MDQsICMjYXJncykKLSNkZWZpbmUgRDQoYXJncy4uLikJRF8oMHgwOCwgIyNhcmdzKQotI2RlZmluZSBENShhcmdzLi4uKQlEXygweDEwLCAjI2FyZ3MpCisjZGVmaW5lIGhzb19kYmcobHZsLCBmbXQsIC4uLikJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICgobHZsKSAmIGRlYnVnKQkJCQkJCVwKKwkJcHJfaW5mbygiWyVkOiVzXSAiIGZtdCwJCQkJCVwKKwkJCV9fTElORV9fLCBfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXyk7CQlcCit9IHdoaWxlICgwKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBFbnVtZXJhdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02NDksNyArNjQwLDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2VyaWFsX3RhYmxlX2xvY2ssIGZsYWdzKTsKIAotCXByaW50ayhLRVJOX0VSUiAiJXM6IG5vIGZyZWUgc2VyaWFsIGRldmljZXMgaW4gdGFibGVcbiIsIF9fZnVuY19fKTsKKwlwcl9lcnIoIiVzOiBubyBmcmVlIHNlcmlhbCBkZXZpY2VzIGluIHRhYmxlXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC03MDksNyArNzAwLDggQEAKIAl9CiAKIAkvKiBsb2cgYSBtZWFuaW5nZnVsIGV4cGxhbmF0aW9uIG9mIGFuIFVTQiBzdGF0dXMgKi8KLQlEMSgiJXM6IHJlY2VpdmVkIFVTQiBzdGF0dXMgLSAlcyAoJWQpIiwgZnVuY3Rpb24sIGV4cGxhbmF0aW9uLCBzdGF0dXMpOworCWhzb19kYmcoMHgxLCAiJXM6IHJlY2VpdmVkIFVTQiBzdGF0dXMgLSAlcyAoJWQpXG4iLAorCQlmdW5jdGlvbiwgZXhwbGFuYXRpb24sIHN0YXR1cyk7CiB9CiAKIC8qIE5ldHdvcmsgaW50ZXJmYWNlIGZ1bmN0aW9ucyAqLwpAQCAtODA4LDcgKzgwMCw3IEBACiAJRFVNUDEoc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJLyogQ29weSBpdCBmcm9tIGtlcm5lbCBtZW1vcnkgdG8gT1VSIG1lbW9yeSAqLwogCW1lbWNweShvZGV2LT5tdXhfYnVsa190eF9idWYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCUQxKCJsZW46ICVkLyVkIiwgc2tiLT5sZW4sIE1VWF9CVUxLX1RYX0JVRl9TSVpFKTsKKwloc29fZGJnKDB4MSwgImxlbjogJWQvJWRcbiIsIHNrYi0+bGVuLCBNVVhfQlVMS19UWF9CVUZfU0laRSk7CiAKIAkvKiBGaWxsIGluIHRoZSBVUkIgZm9yIHNoaXBwaW5nIGl0IG91dC4gKi8KIAl1c2JfZmlsbF9idWxrX3VyYihvZGV2LT5tdXhfYnVsa190eF91cmIsCkBAIC04NzIsNyArODY0LDcgQEAKIAl1bnNpZ25lZCBjaGFyICp0bXBfcnhfYnVmOwogCiAJLyogbG9nIGlmIG5lZWRlZCAqLwotCUQxKCJSeCAlZCBieXRlcyIsIGNvdW50KTsKKwloc29fZGJnKDB4MSwgIlJ4ICVkIGJ5dGVzXG4iLCBjb3VudCk7CiAJRFVNUChpcF9wa3QsIG1pbigxMjgsIChpbnQpY291bnQpKTsKIAogCXdoaWxlIChjb3VudCkgewpAQCAtOTEyLDcgKzkwNCw3IEBACiAJCQkJCQkJCSAgICBmcmFtZV9sZW4pOwogCQkJCWlmICghb2Rldi0+c2tiX3J4X2J1ZikgewogCQkJCQkvKiBXZSBnb3Qgbm8gcmVjZWl2ZSBidWZmZXIuICovCi0JCQkJCUQxKCJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5Iik7CisJCQkJCWhzb19kYmcoMHgxLCAiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CiAJCQkJCW9kZXYtPnJ4X3BhcnNlX3N0YXRlID0gV0FJVF9TWU5DOwogCQkJCQljb250aW51ZTsKIAkJCQl9CkBAIC05NzIsMTEgKzk2NCwxMSBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBXQUlUX1NZTkM6Ci0JCQlEMSgiIFdfUyIpOworCQkJaHNvX2RiZygweDEsICIgV19TXG4iKTsKIAkJCWNvdW50ID0gMDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJRDEoIiAiKTsKKwkJCWhzb19kYmcoMHgxLCAiXG4iKTsKIAkJCWNvdW50LS07CiAJCQlicmVhazsKIAkJfQpAQCAtMTAyMCw3ICsxMDEyLDcgQEAKIAogCS8qIFNhbml0eSBjaGVjayAqLwogCWlmICghb2RldiB8fCAhdGVzdF9iaXQoSFNPX05FVF9SVU5OSU5HLCAmb2Rldi0+ZmxhZ3MpKSB7Ci0JCUQxKCJCVUxLIElOIGNhbGxiYWNrIGJ1dCBkcml2ZXIgaXMgbm90IGFjdGl2ZSEiKTsKKwkJaHNvX2RiZygweDEsICJCVUxLIElOIGNhbGxiYWNrIGJ1dCBkcml2ZXIgaXMgbm90IGFjdGl2ZSFcbiIpOwogCQlyZXR1cm47CiAJfQogCXVzYl9tYXJrX2xhc3RfYnVzeSh1cmItPmRldik7CkBAIC0xMTEyLDExICsxMTA0LDExIEBACiAJc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAlpZiAoIXNlcmlhbCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBubyB0dHkgc3RydWN0dXJlcyIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlczogbm8gdHR5IHN0cnVjdHVyZXMiLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKLQlENCgicG9ydCAlZCIsIHNlcmlhbC0+bWlub3IpOworCWhzb19kYmcoMHg4LCAicG9ydCAlZFxuIiwgc2VyaWFsLT5taW5vcik7CiAKIAkvKgogCSAqCUZpeCB1cCB1bnN1cHBvcnRlZCBiaXRzCkBAIC0xMjA1LDExICsxMTk3LDExIEBACiAJc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCA9IHVyYi0+Y29udGV4dDsKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQlENCgiXG4tLS0gR290IHNlcmlhbF9yZWFkX2J1bGsgY2FsbGJhY2sgJTAyeCAtLS0iLCBzdGF0dXMpOworCWhzb19kYmcoMHg4LCAiLS0tIEdvdCBzZXJpYWxfcmVhZF9idWxrIGNhbGxiYWNrICUwMnggLS0tXG4iLCBzdGF0dXMpOwogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKCFzZXJpYWwpIHsKLQkJRDEoInNlcmlhbCA9PSBOVUxMIik7CisJCWhzb19kYmcoMHgxLCAic2VyaWFsID09IE5VTExcbiIpOwogCQlyZXR1cm47CiAJfQogCWlmIChzdGF0dXMpIHsKQEAgLTEyMTcsNyArMTIwOSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlEMSgiQWN0dWFsIGxlbmd0aCA9ICVkXG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCWhzb19kYmcoMHgxLCAiQWN0dWFsIGxlbmd0aCA9ICVkXG4iLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCURVTVAxKHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOwogCiAJLyogQW55b25lIGxpc3RlbmluZz8gKi8KQEAgLTEyNjYsNyArMTI1OCw3IEBACiAJaWYgKHNlcmlhbCA9PSBOVUxMIHx8IHNlcmlhbC0+bWFnaWMgIT0gSFNPX1NFUklBTF9NQUdJQykgewogCQlXQVJOX09OKDEpOwogCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJRDEoIkZhaWxlZCB0byBvcGVuIHBvcnQiKTsKKwkJaHNvX2RiZygweDEsICJGYWlsZWQgdG8gb3BlbiBwb3J0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMjc1LDcgKzEyNjcsNyBAQAogCWlmIChyZXN1bHQgPCAwKQogCQlnb3RvIGVycl9vdXQ7CiAKLQlEMSgiT3BlbmluZyAlZCIsIHNlcmlhbC0+bWlub3IpOworCWhzb19kYmcoMHgxLCAiT3BlbmluZyAlZFxuIiwgc2VyaWFsLT5taW5vcik7CiAKIAkvKiBzZXR1cCAqLwogCXR0eS0+ZHJpdmVyX2RhdGEgPSBzZXJpYWw7CkBAIC0xMjk4LDcgKzEyOTAsNyBAQAogCQkJa3JlZl9nZXQoJnNlcmlhbC0+cGFyZW50LT5yZWYpOwogCQl9CiAJfSBlbHNlIHsKLQkJRDEoIlBvcnQgd2FzIGFscmVhZHkgb3BlbiIpOworCQloc29fZGJnKDB4MSwgIlBvcnQgd2FzIGFscmVhZHkgb3BlblxuIik7CiAJfQogCiAJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHNlcmlhbC0+cGFyZW50LT5pbnRlcmZhY2UpOwpAQCAtMTMxNyw3ICsxMzA5LDcgQEAKIAlzdHJ1Y3QgaHNvX3NlcmlhbCAqc2VyaWFsID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1OCB1c2JfZ29uZTsKIAotCUQxKCJDbG9zaW5nIHNlcmlhbCBwb3J0Iik7CisJaHNvX2RiZygweDEsICJDbG9zaW5nIHNlcmlhbCBwb3J0XG4iKTsKIAogCS8qIE9wZW4gZmFpbGVkLCBubyBjbG9zZSBjbGVhbnVwIHJlcXVpcmVkICovCiAJaWYgKHNlcmlhbCA9PSBOVUxMKQpAQCAtMTM1Nyw3ICsxMzQ5LDcgQEAKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmIChzZXJpYWwgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBzZXJpYWwgaXMgTlVMTFxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzOiBzZXJpYWwgaXMgTlVMTFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKQEAgLTE0MTIsOCArMTQwNCw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChvbGQpCi0JCUQ1KCJUZXJtaW9zIGNhbGxlZCB3aXRoOiBjZmxhZ3MgbmV3WyVkXSAtIG9sZFslZF0iLAotCQkgICB0dHktPnRlcm1pb3MuY19jZmxhZywgb2xkLT5jX2NmbGFnKTsKKwkJaHNvX2RiZygweDE2LCAiVGVybWlvcyBjYWxsZWQgd2l0aDogY2ZsYWdzIG5ld1slZF0gLSBvbGRbJWRdXG4iLAorCQkJdHR5LT50ZXJtaW9zLmNfY2ZsYWcsIG9sZC0+Y19jZmxhZyk7CiAKIAkvKiB0aGUgYWN0dWFsIHNldHVwICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNlcmlhbC0+c2VyaWFsX2xvY2ssIGZsYWdzKTsKQEAgLTE2NDksNyArMTY0MSw3IEBACiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoIXNlcmlhbCkgewotCQlEMSgibm8gdHR5IHN0cnVjdHVyZXMiKTsKKwkJaHNvX2RiZygweDEsICJubyB0dHkgc3RydWN0dXJlc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzcGluX2xvY2tfaXJxKCZzZXJpYWwtPnNlcmlhbF9sb2NrKTsKQEAgLTE2ODIsNyArMTY3NCw3IEBACiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoIXNlcmlhbCkgewotCQlEMSgibm8gdHR5IHN0cnVjdHVyZXMiKTsKKwkJaHNvX2RiZygweDEsICJubyB0dHkgc3RydWN0dXJlc1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTcyMSw3ICsxNzEzLDcgQEAKIHsKIAlzdHJ1Y3QgaHNvX3NlcmlhbCAqc2VyaWFsID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlpbnQgcmV0ID0gMDsKLQlENCgiSU9DVEwgY21kOiAlZCwgYXJnOiAlbGQiLCBjbWQsIGFyZyk7CisJaHNvX2RiZygweDgsICJJT0NUTCBjbWQ6ICVkLCBhcmc6ICVsZFxuIiwgY21kLCBhcmcpOwogCiAJaWYgKCFzZXJpYWwpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTc4Myw3ICsxNzc1LDcgQEAKIAogCS8qIFNhbml0eSBjaGVjayAqLwogCWlmICghc2VyaWFsIHx8ICFjdHJsX3VyYiB8fCAhY3RybF9yZXEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogV3JvbmcgYXJndW1lbnRzXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IFdyb25nIGFyZ3VtZW50c1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE4MDgsOSArMTgwMCw5IEBACiAJCXBpcGUgPSB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5wYXJlbnQtPnVzYiwgMCk7CiAJfQogCS8qIHN5c2xvZyAqLwotCUQyKCIlcyBjb21tYW5kICglMDJ4KSBsZW46ICVkLCBwb3J0OiAlZCIsCi0JICAgdHlwZSA9PSBVU0JfQ0RDX0dFVF9FTkNBUFNVTEFURURfUkVTUE9OU0UgPyAiUmVhZCIgOiAiV3JpdGUiLAotCSAgIGN0cmxfcmVxLT5iUmVxdWVzdFR5cGUsIGN0cmxfcmVxLT53TGVuZ3RoLCBwb3J0KTsKKwloc29fZGJnKDB4MiwgIiVzIGNvbW1hbmQgKCUwMngpIGxlbjogJWQsIHBvcnQ6ICVkXG4iLAorCQl0eXBlID09IFVTQl9DRENfR0VUX0VOQ0FQU1VMQVRFRF9SRVNQT05TRSA/ICJSZWFkIiA6ICJXcml0ZSIsCisJCWN0cmxfcmVxLT5iUmVxdWVzdFR5cGUsIGN0cmxfcmVxLT53TGVuZ3RoLCBwb3J0KTsKIAogCS8qIExvYWQgY3RybCB1cmIgKi8KIAljdHJsX3VyYi0+dHJhbnNmZXJfZmxhZ3MgPSAwOwpAQCAtMTg3NiwxMSArMTg2OCwxMSBAQAogCQloYW5kbGVfdXNiX2Vycm9yKHN0YXR1cywgX19mdW5jX18sIE5VTEwpOwogCQlyZXR1cm47CiAJfQotCUQ0KCJcbi0tLSBHb3QgaW50ciBjYWxsYmFjayAweCUwMlggLS0tIiwgc3RhdHVzKTsKKwloc29fZGJnKDB4OCwgIi0tLSBHb3QgaW50ciBjYWxsYmFjayAweCUwMlggLS0tXG4iLCBzdGF0dXMpOwogCiAJLyogd2hhdCByZXF1ZXN0PyAqLwogCXBvcnRfcmVxID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7Ci0JRDQoIiBwb3J0X3JlcSA9IDB4JS4yWFxuIiwgKnBvcnRfcmVxKTsKKwloc29fZGJnKDB4OCwgInBvcnRfcmVxID0gMHglLjJYXG4iLCAqcG9ydF9yZXEpOwogCS8qIGxvb3Agb3ZlciBhbGwgbXV4ZWQgcG9ydHMgdG8gZmluZCB0aGUgb25lIHNlbmRpbmcgdGhpcyAqLwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJLyogbWF4IDggY2hhbm5lbHMgb24gTVVYICovCkBAIC0xODg4LDcgKzE4ODAsOCBAQAogCQkJc2VyaWFsID0gZ2V0X3NlcmlhbF9ieV9zaGFyZWRfaW50X2FuZF90eXBlKHNoYXJlZF9pbnQsCiAJCQkJCQkJCSAgICgxIDw8IGkpKTsKIAkJCWlmIChzZXJpYWwgIT0gTlVMTCkgewotCQkJCUQxKCJQZW5kaW5nIHJlYWQgaW50ZXJydXB0IG9uIHBvcnQgJWRcbiIsIGkpOworCQkJCWhzb19kYmcoMHgxLCAiUGVuZGluZyByZWFkIGludGVycnVwdCBvbiBwb3J0ICVkXG4iLAorCQkJCQlpKTsKIAkJCQlzcGluX2xvY2soJnNlcmlhbC0+c2VyaWFsX2xvY2spOwogCQkJCWlmIChzZXJpYWwtPnJ4X3N0YXRlID09IFJYX0lETEUgJiYKIAkJCQkJc2VyaWFsLT5wb3J0LmNvdW50ID4gMCkgewpAQCAtMTkwMCw4ICsxODkzLDggQEAKIAkJCQkJfSBlbHNlCiAJCQkJCQlzZXJpYWwtPnJ4X3N0YXRlID0gUlhfUEVORElORzsKIAkJCQl9IGVsc2UgewotCQkJCQlEMSgiQWxyZWFkeSBhIHJlYWQgcGVuZGluZyBvbiAiCi0JCQkJCSAgICJwb3J0ICVkIG9yIHBvcnQgbm90IG9wZW5cbiIsIGkpOworCQkJCQloc29fZGJnKDB4MSwgIkFscmVhZHkgYSByZWFkIHBlbmRpbmcgb24gcG9ydCAlZCBvciBwb3J0IG5vdCBvcGVuXG4iLAorCQkJCQkJaSk7CiAJCQkJfQogCQkJCXNwaW5fdW5sb2NrKCZzZXJpYWwtPnNlcmlhbF9sb2NrKTsKIAkJCX0KQEAgLTE5MzMsNyArMTkyNiw3IEBACiAKIAkvKiBzYW5pdHkgY2hlY2sgKi8KIAlpZiAoIXNlcmlhbCkgewotCQlEMSgic2VyaWFsID09IE5VTEwiKTsKKwkJaHNvX2RiZygweDEsICJzZXJpYWwgPT0gTlVMTFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE5NDgsNyArMTk0MSw3IEBACiAJdHR5X3BvcnRfdHR5X3dha2V1cCgmc2VyaWFsLT5wb3J0KTsKIAloc29fa2lja190cmFuc21pdChzZXJpYWwpOwogCi0JRDEoIiAiKTsKKwloc29fZGJnKDB4MSwgIlxuIik7CiB9CiAKIC8qIGNhbGxlZCBmb3Igd3JpdGluZyBkaWFnIG9yIENTIHNlcmlhbCBwb3J0ICovCkBAIC0xOTk2LDggKzE5ODksOCBAQAogCiAJLyogd2hhdCByZXF1ZXN0PyAqLwogCXJlcSA9IChzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICopKHVyYi0+c2V0dXBfcGFja2V0KTsKLQlENCgiXG4tLS0gR290IG11eGVkIGN0cmwgY2FsbGJhY2sgMHglMDJYIC0tLSIsIHN0YXR1cyk7Ci0JRDQoIkFjdHVhbCBsZW5ndGggb2YgdXJiID0gJWRcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJaHNvX2RiZygweDgsICItLS0gR290IG11eGVkIGN0cmwgY2FsbGJhY2sgMHglMDJYIC0tLVxuIiwgc3RhdHVzKTsKKwloc29fZGJnKDB4OCwgIkFjdHVhbCBsZW5ndGggb2YgdXJiID0gJWRcbiIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJRFVNUDEodXJiLT50cmFuc2Zlcl9idWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKIAlpZiAocmVxLT5iUmVxdWVzdFR5cGUgPT0KQEAgLTIwMjMsNyArMjAxNiw3IEBACiAKIAkvKiBTYW5pdHkgY2hlY2sgKi8KIAlpZiAodXJiID09IE5VTEwgfHwgc2VyaWFsID09IE5VTEwpIHsKLQkJRDEoInNlcmlhbCA9IE5VTEwiKTsKKwkJaHNvX2RiZygweDEsICJzZXJpYWwgPSBOVUxMXG4iKTsKIAkJcmV0dXJuIC0yOwogCX0KIApAQCAtMjAzNSw3ICsyMDI4LDcgQEAKIAl9CiAKIAkvKiBQdXNoIGRhdGEgdG8gdHR5ICovCi0JRDEoImRhdGEgdG8gcHVzaCB0byB0dHkiKTsKKwloc29fZGJnKDB4MSwgImRhdGEgdG8gcHVzaCB0byB0dHlcbiIpOwogCWNvdW50ID0gdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20oJnNlcmlhbC0+cG9ydCwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAlpZiAoY291bnQgPj0gdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CiAJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcoJnNlcmlhbC0+cG9ydCwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCkBAIC0yMzAwLDEwICsyMjkzLDggQEAKIAlzZXJpYWwtPnJ4X2RhdGFfbGVuZ3RoID0gcnhfc2l6ZTsKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcnhfdXJiczsgaSsrKSB7CiAJCXNlcmlhbC0+cnhfdXJiW2ldID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFzZXJpYWwtPnJ4X3VyYltpXSkgewotCQkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgdXJiP1xuIik7CisJCWlmICghc2VyaWFsLT5yeF91cmJbaV0pCiAJCQlnb3RvIGV4aXQ7Ci0JCX0KIAkJc2VyaWFsLT5yeF91cmJbaV0tPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CiAJCXNlcmlhbC0+cnhfdXJiW2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMDsKIAkJc2VyaWFsLT5yeF9kYXRhW2ldID0ga3phbGxvYyhzZXJpYWwtPnJ4X2RhdGFfbGVuZ3RoLApAQCAtMjMxNCwxMCArMjMwNSw4IEBACiAKIAkvKiBUWCwgYWxsb2NhdGUgdXJiIGFuZCBpbml0aWFsaXplICovCiAJc2VyaWFsLT50eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghc2VyaWFsLT50eF91cmIpIHsKLQkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgdXJiP1xuIik7CisJaWYgKCFzZXJpYWwtPnR4X3VyYikKIAkJZ290byBleGl0OwotCX0KIAlzZXJpYWwtPnR4X3VyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKIAlzZXJpYWwtPnR4X3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDA7CiAJLyogcHJlcGFyZSBvdXIgVFggYnVmZmVyICovCkBAIC0yNDE5LDcgKzI0MDgsNyBAQAogewogCXN0cnVjdCBoc29fbmV0ICpoc29fbmV0ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAotCUQxKCJzaXplb2YgaHNvX25ldCBpcyAlZCIsIChpbnQpc2l6ZW9mKCpoc29fbmV0KSk7CisJaHNvX2RiZygweDEsICJzaXplb2YgaHNvX25ldCBpcyAlenVcbiIsIHNpemVvZigqaHNvX25ldCkpOwogCiAJLyogZmlsbCBpbiB0aGUgb3RoZXIgZmllbGRzICovCiAJbmV0LT5uZXRkZXZfb3BzID0gJmhzb19uZXRkZXZfb3BzOwpAQCAtMjU1NSwyMCArMjU0NCwxNiBAQAogCS8qIHN0YXJ0IGFsbG9jYXRpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTVVYX0JVTEtfUlhfQlVGX0NPVU5UOyBpKyspIHsKIAkJaHNvX25ldC0+bXV4X2J1bGtfcnhfdXJiX3Bvb2xbaV0gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIWhzb19uZXQtPm11eF9idWxrX3J4X3VyYl9wb29sW2ldKSB7Ci0JCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSByeCB1cmJcbiIpOworCQlpZiAoIWhzb19uZXQtPm11eF9idWxrX3J4X3VyYl9wb29sW2ldKQogCQkJZ290byBleGl0OwotCQl9CiAJCWhzb19uZXQtPm11eF9idWxrX3J4X2J1Zl9wb29sW2ldID0ga3phbGxvYyhNVVhfQlVMS19SWF9CVUZfU0laRSwKIAkJCQkJCQkgICBHRlBfS0VSTkVMKTsKIAkJaWYgKCFoc29fbmV0LT5tdXhfYnVsa19yeF9idWZfcG9vbFtpXSkKIAkJCWdvdG8gZXhpdDsKIAl9CiAJaHNvX25ldC0+bXV4X2J1bGtfdHhfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWhzb19uZXQtPm11eF9idWxrX3R4X3VyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSB0eCB1cmJcbiIpOworCWlmICghaHNvX25ldC0+bXV4X2J1bGtfdHhfdXJiKQogCQlnb3RvIGV4aXQ7Ci0JfQogCWhzb19uZXQtPm11eF9idWxrX3R4X2J1ZiA9IGt6YWxsb2MoTVVYX0JVTEtfVFhfQlVGX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghaHNvX25ldC0+bXV4X2J1bGtfdHhfYnVmKQogCQlnb3RvIGV4aXQ7CkBAIC0yNzg3LDEwICsyNzcyLDggQEAKIAl9CiAKIAltdXgtPnNoYXJlZF9pbnRyX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtdXgtPnNoYXJlZF9pbnRyX3VyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBpbnRyIHVyYj9cbiIpOworCWlmICghbXV4LT5zaGFyZWRfaW50cl91cmIpCiAJCWdvdG8gZXhpdDsKLQl9CiAJbXV4LT5zaGFyZWRfaW50cl9idWYgPQogCQlremFsbG9jKGxlMTZfdG9fY3B1KG11eC0+aW50cl9lbmRwLT53TWF4UGFja2V0U2l6ZSksCiAJCQlHRlBfS0VSTkVMKTsKQEAgLTMyMzksNyArMzIyMiw3IEBACiAJaW50IHJlc3VsdDsKIAogCS8qIHB1dCBpdCBpbiB0aGUgbG9nICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiaHNvOiAlc1xuIiwgdmVyc2lvbik7CisJcHJfaW5mbygiJXNcbiIsIHZlcnNpb24pOwogCiAJLyogSW5pdGlhbGlzZSB0aGUgc2VyaWFsIHRhYmxlIHNlbWFwaG9yZSBhbmQgdGFibGUgKi8KIAlzcGluX2xvY2tfaW5pdCgmc2VyaWFsX3RhYmxlX2xvY2spOwpAQCAtMzI3MCwxNiArMzI1MywxNSBAQAogCS8qIHJlZ2lzdGVyIHRoZSB0dHkgZHJpdmVyICovCiAJcmVzdWx0ID0gdHR5X3JlZ2lzdGVyX2RyaXZlcih0dHlfZHJ2KTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXMgLSB0dHlfcmVnaXN0ZXJfZHJpdmVyIGZhaWxlZCglZClcbiIsCi0JCQlfX2Z1bmNfXywgcmVzdWx0KTsKKwkJcHJfZXJyKCIlcyAtIHR0eV9yZWdpc3Rlcl9kcml2ZXIgZmFpbGVkKCVkKVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXN1bHQpOwogCQlnb3RvIGVycl9mcmVlX3R0eTsKIAl9CiAKIAkvKiByZWdpc3RlciB0aGlzIG1vZHVsZSBhcyBhbiB1c2IgZHJpdmVyICovCiAJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZoc29fZHJpdmVyKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIGhzbyBkcml2ZXI/IGVycm9yOiAlZFxuIiwKLQkJCXJlc3VsdCk7CisJCXByX2VycigiQ291bGQgbm90IHJlZ2lzdGVyIGhzbyBkcml2ZXIgLSBlcnJvcjogJWRcbiIsIHJlc3VsdCk7CiAJCWdvdG8gZXJyX3VucmVnX3R0eTsKIAl9CiAKQEAgLTMyOTQsNyArMzI3Niw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBoc29fZXhpdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gImhzbzogdW5sb2FkZWRcbiIpOworCXByX2luZm8oInVubG9hZGVkXG4iKTsKIAogCXR0eV91bnJlZ2lzdGVyX2RyaXZlcih0dHlfZHJ2KTsKIAlwdXRfdHR5X2RyaXZlcih0dHlfZHJ2KTsKQEAgLTMzMTEsNyArMzI5Myw3IEBACiBNT0RVTEVfTElDRU5TRShNT0RfTElDRU5TRSk7CiAKIC8qIGNoYW5nZSB0aGUgZGVidWcgbGV2ZWwgKGVnOiBpbnNtb2QgaHNvLmtvIGRlYnVnPTB4MDQpICovCi1NT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiTGV2ZWwgb2YgZGVidWcgWzB4MDEgfCAweDAyIHwgMHgwNCB8IDB4MDggfCAweDEwXSIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIGxldmVsIG1hc2sgWzB4MDEgfCAweDAyIHwgMHgwNCB8IDB4MDggfCAweDEwXSIpOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIAogLyogc2V0IHRoZSBtYWpvciB0dHkgbnVtYmVyIChlZzogaW5zbW9kIGhzby5rbyB0dHlfbWFqb3I9MjQ1KSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jIGIvZHJpdmVycy9uZXQvdXNiL2thd2V0aC5jCmluZGV4IDc3MDIxMmIuLjY2YjM0ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9rYXdldGguYworKysgYi9kcml2ZXJzL25ldC91c2Iva2F3ZXRoLmMKQEAgLTI2NSw4ICsyNjUsNiBAQAogCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyOwogCWludCByZXR2YWw7CiAKLQluZXRkZXZfZGJnKGthd2V0aC0+bmV0LCAia2F3ZXRoX2NvbnRyb2woKVxuIik7Ci0KIAlpZihpbl9pbnRlcnJ1cHQoKSkgewogCQluZXRkZXZfZGJnKGthd2V0aC0+bmV0LCAiaW5faW50ZXJydXB0KClcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMzAwLDggKzI5OCw2IEBACiB7CiAJaW50IHJldHZhbDsKIAotCW5ldGRldl9kYmcoa2F3ZXRoLT5uZXQsICJSZWFkaW5nIGthd2V0aCBjb25maWd1cmF0aW9uXG4iKTsKLQogCXJldHZhbCA9IGthd2V0aF9jb250cm9sKGthd2V0aCwKIAkJCQl1c2JfcmN2Y3RybHBpcGUoa2F3ZXRoLT5kZXYsIDApLAogCQkJCUtBV0VUSF9DT01NQU5EX0dFVF9FVEhFUk5FVF9ERVNDLApAQCAtNDUxLDggKzQ0Nyw2IEBACiAJa2F3ZXRoLT5maXJtd2FyZV9idWZbNl0gPSAweDAwOwogCWthd2V0aC0+ZmlybXdhcmVfYnVmWzddID0gMHgwMDsKIAotCW5ldGRldl9kYmcoa2F3ZXRoLT5uZXQsICJUcmlnZ2VyaW5nIGZpcm13YXJlXG4iKTsKLQogCXJldHVybiBrYXdldGhfY29udHJvbChrYXdldGgsCiAJCQkgICAgICB1c2Jfc25kY3RybHBpcGUoa2F3ZXRoLT5kZXYsIDApLAogCQkJICAgICAgS0FXRVRIX0NPTU1BTkRfU0NBTiwKQEAgLTQ3MSw3ICs0NjUsNiBAQAogewogCWludCByZXN1bHQ7CiAKLQluZXRkZXZfZGJnKGthd2V0aC0+bmV0LCAia2F3ZXRoX3Jlc2V0KCVwKVxuIiwga2F3ZXRoKTsKIAlyZXN1bHQgPSB1c2JfcmVzZXRfY29uZmlndXJhdGlvbihrYXdldGgtPmRldik7CiAJbWRlbGF5KDEwKTsKIApAQCAtNjg1LDggKzY3OCw2IEBACiAJc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCA9IG5ldGRldl9wcml2KG5ldCk7CiAJaW50IHJlczsKIAotCW5ldGRldl9kYmcoa2F3ZXRoLT5uZXQsICJPcGVuaW5nIG5ldHdvcmsgZGV2aWNlLlxuIik7Ci0KIAlyZXMgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2Uoa2F3ZXRoLT5pbnRmKTsKIAlpZiAocmVzKSB7CiAJCWRldl9lcnIoJmthd2V0aC0+aW50Zi0+ZGV2LCAiSW50ZXJmYWNlIGNhbm5vdCBiZSByZXN1bWVkLlxuIik7CkBAIC05NTEsNyArOTQyLDYgQEAKIAlzdHJ1Y3Qga2F3ZXRoX2RldmljZSAqa2F3ZXRoID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGV2X2RiZygmaW50Zi0+ZGV2LCAiU3VzcGVuZGluZyBkZXZpY2VcbiIpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZrYXdldGgtPmRldmljZV9sb2NrLCBmbGFncyk7CiAJa2F3ZXRoLT5zdGF0dXMgfD0gS0FXRVRIX1NUQVRVU19TVVNQRU5ESU5HOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmthd2V0aC0+ZGV2aWNlX2xvY2ssIGZsYWdzKTsKQEAgLTk2OCw3ICs5NTgsNiBAQAogCXN0cnVjdCBrYXdldGhfZGV2aWNlICprYXdldGggPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkZXZfZGJnKCZpbnRmLT5kZXYsICJSZXN1bWluZyBkZXZpY2VcbiIpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZrYXdldGgtPmRldmljZV9sb2NrLCBmbGFncyk7CiAJa2F3ZXRoLT5zdGF0dXMgJj0gfktBV0VUSF9TVEFUVVNfU1VTUEVORElORzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrYXdldGgtPmRldmljZV9sb2NrLCBmbGFncyk7CkBAIC0xMDA5LDYgKzk5OCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAljb25zdCBldGhfYWRkcl90IGJjYXN0X2FkZHIgPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKIAlpbnQgcmVzdWx0ID0gMDsKKwlpbnQgcnYgPSAtRUlPOwogCiAJZGV2X2RiZyhkZXYsCiAJCSJLYXdhc2FraSBEZXZpY2UgUHJvYmUgKERldmljZSBudW1iZXI6JWQpOiAweCU0LjR4OjB4JTQuNHg6MHglNC40eFxuIiwKQEAgLTEwMjksNiArMTAxOSw3IEBACiAJa2F3ZXRoID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlrYXdldGgtPmRldiA9IHVkZXY7CiAJa2F3ZXRoLT5uZXQgPSBuZXRkZXY7CisJa2F3ZXRoLT5pbnRmID0gaW50ZjsKIAogCXNwaW5fbG9ja19pbml0KCZrYXdldGgtPmRldmljZV9sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZrYXdldGgtPnRlcm1fd2FpdCk7CkBAIC0xMDQ4LDYgKzEwMzksMTAgQEAKIAkJLyogRG93bmxvYWQgdGhlIGZpcm13YXJlICovCiAJCWRldl9pbmZvKGRldiwgIkRvd25sb2FkaW5nIGZpcm13YXJlLi4uXG4iKTsKIAkJa2F3ZXRoLT5maXJtd2FyZV9idWYgPSAoX191OCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFrYXdldGgtPmZpcm13YXJlX2J1ZikgeworCQkJcnYgPSAtRU5PTUVNOworCQkJZ290byBlcnJfZnJlZV9uZXRkZXY7CisJCX0KIAkJaWYgKChyZXN1bHQgPSBrYXdldGhfZG93bmxvYWRfZmlybXdhcmUoa2F3ZXRoLAogCQkJCQkJICAgICAgImthd2V0aC9uZXdfY29kZS5iaW4iLAogCQkJCQkJICAgICAgMTAwLApAQCAtMTEzOSw4ICsxMTM0LDYgQEAKIAogCWRldl9kYmcoZGV2LCAiSW5pdGlhbGl6aW5nIG5ldCBkZXZpY2UuXG4iKTsKIAotCWthd2V0aC0+aW50ZiA9IGludGY7Ci0KIAlrYXdldGgtPnR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFrYXdldGgtPnR4X3VyYikKIAkJZ290byBlcnJfZnJlZV9uZXRkZXY7CkBAIC0xMTg2LDggKzExNzksNiBAQAogCWRldl9pbmZvKGRldiwgImthd2V0aCBpbnRlcmZhY2UgY3JlYXRlZCBhdCAlc1xuIiwKIAkJIGthd2V0aC0+bmV0LT5uYW1lKTsKIAotCWRldl9kYmcoZGV2LCAiS2F3ZXRoIHByb2JlIHJldHVybmluZy5cbiIpOwotCiAJcmV0dXJuIDA7CiAKIGVycl9pbnRmZGF0YToKQEAgLTEyMDQsNyArMTE5NSw3IEBACiBlcnJfZnJlZV9uZXRkZXY6CiAJZnJlZV9uZXRkZXYobmV0ZGV2KTsKIAotCXJldHVybiAtRUlPOworCXJldHVybiBydjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEyMTUsOCArMTIwNiw2IEBACiAJc3RydWN0IGthd2V0aF9kZXZpY2UgKmthd2V0aCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAotCWRldl9pbmZvKCZpbnRmLT5kZXYsICJVbnJlZ2lzdGVyaW5nXG4iKTsKLQogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJaWYgKCFrYXdldGgpIHsKIAkJZGV2X3dhcm4oJmludGYtPmRldiwgInVucmVnaXN0ZXJpbmcgbm9uLWV4aXN0ZW50IGRldmljZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvbGFuNzh4eC5jIGIvZHJpdmVycy9uZXQvdXNiL2xhbjc4eHguYwppbmRleCA2YTlkNDc0Li5kYjU1OGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvbGFuNzh4eC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9sYW43OHh4LmMKQEAgLTExNzksNyArMTE3OSw3IEBACiAgKiBOT1RFOiAgYW5ub3lpbmcgYXN5bW1ldHJ5OiAgaWYgaXQncyBhY3RpdmUsIHNjaGVkdWxlX3dvcmsoKSBmYWlscywKICAqIGJ1dCB0YXNrbGV0X3NjaGVkdWxlKCkgZG9lc24ndC4JaG9wZSB0aGUgZmFpbHVyZSBpcyByYXJlLgogICovCi12b2lkIGxhbjc4eHhfZGVmZXJfa2V2ZW50KHN0cnVjdCBsYW43OHh4X25ldCAqZGV2LCBpbnQgd29yaykKK3N0YXRpYyB2b2lkIGxhbjc4eHhfZGVmZXJfa2V2ZW50KHN0cnVjdCBsYW43OHh4X25ldCAqZGV2LCBpbnQgd29yaykKIHsKIAlzZXRfYml0KHdvcmssICZkZXYtPmZsYWdzKTsKIAlpZiAoIXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT53cSwgMCkpCkBAIC0xNDA2LDcgKzE0MDYsNyBAQAogCXJldHVybiBuZXQtPnBoeWRldi0+bGluazsKIH0KIAotaW50IGxhbjc4eHhfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQorc3RhdGljIGludCBsYW43OHh4X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKIHsKIAlyZXR1cm4gcGh5X3N0YXJ0X2FuZWcobmV0LT5waHlkZXYpOwogfQpAQCAtMTk5Nyw3ICsxOTk3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGxhbjc4eHhfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApCitzdGF0aWMgaW50IGxhbjc4eHhfc2V0X21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHZvaWQgKnApCiB7CiAJc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CkBAIC0yMzcxLDcgKzIzNzEsNyBAQAogCXJlbW92ZV93YWl0X3F1ZXVlKCZ1bmxpbmtfd2FrZXVwLCAmd2FpdCk7CiB9CiAKLWludCBsYW43OHh4X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3N0YXRpYyBpbnQgbGFuNzh4eF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiAJc3RydWN0IGxhbjc4eHhfbmV0CQkqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKIApAQCAtMjUzMyw3ICsyNTMzLDggQEAKIAllbnRyeS0+c3RhdGUgPSBzdGF0ZTsKIH0KIAotbmV0ZGV2X3R4X3QgbGFuNzh4eF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCitzdGF0aWMgbmV0ZGV2X3R4X3QKK2xhbjc4eHhfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCBsYW43OHh4X25ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IE5VTEw7CkBAIC0yNTYyLDcgKzI1NjMsOCBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKLWludCBsYW43OHh4X2dldF9lbmRwb2ludHMoc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGludAorbGFuNzh4eF9nZXRfZW5kcG9pbnRzKHN0cnVjdCBsYW43OHh4X25ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlpbnQgdG1wOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCA9IE5VTEw7CkBAIC0yNzAwLDcgKzI3MDIsNyBAQAogCX0KIH0KIAotdm9pZCBsYW43OHh4X3NrYl9yZXR1cm4oc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBsYW43OHh4X3NrYl9yZXR1cm4oc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50CQlzdGF0dXM7CiAKQEAgLTMwMDIsMTAgKzMwMDQsOCBAQAogCiBnc29fc2tiOgogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF1cmIpIHsKLQkJbmV0aWZfZGJnKGRldiwgdHhfZXJyLCBkZXYtPm5ldCwgIm5vIHVyYlxuIik7CisJaWYgKCF1cmIpCiAJCWdvdG8gZHJvcDsKLQl9CiAKIAllbnRyeSA9IChzdHJ1Y3Qgc2tiX2RhdGEgKilza2ItPmNiOwogCWVudHJ5LT51cmIgPSB1cmI7CkBAIC0zMjg1LDcgKzMyODUsNyBAQAogCXVzYl9wdXRfZGV2KHVkZXYpOwogfQogCi12b2lkIGxhbjc4eHhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQorc3RhdGljIHZvaWQgbGFuNzh4eF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCiB7CiAJc3RydWN0IGxhbjc4eHhfbmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwogCkBAIC0zNjA1LDcgKzM2MDUsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbGFuNzh4eF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3N0YXRpYyBpbnQgbGFuNzh4eF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKIHsKIAlzdHJ1Y3QgbGFuNzh4eF9uZXQgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IGxhbjc4eHhfcHJpdiAqcGRhdGEgPSAoc3RydWN0IGxhbjc4eHhfcHJpdiAqKShkZXYtPmRhdGFbMF0pOwpAQCAtMzcwMSw3ICszNzAxLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgbGFuNzh4eF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgaW50IGxhbjc4eHhfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCXN0cnVjdCBsYW43OHh4X25ldCAqZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMzc2OCw3ICszNzY4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGxhbjc4eHhfcmVzZXRfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQorc3RhdGljIGludCBsYW43OHh4X3Jlc2V0X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgbGFuNzh4eF9uZXQgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMgYi9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCmluZGV4IDliYmUwMTYxLi4xNDM0ZTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKQEAgLTExMjksNyArMTEyOSw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKHBlZ2FzdXNfY291bnQgPT0gMCkgewotCQlwZWdhc3VzX3dvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJwZWdhc3VzIik7CisJCXBlZ2FzdXNfd29ya3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKCJwZWdhc3VzIiwgV1FfTUVNX1JFQ0xBSU0sCisJCQkJCQkgICAgMCk7CiAJCWlmICghcGVnYXN1c193b3JrcXVldWUpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvcjgxNTIuYyBiL2RyaXZlcnMvbmV0L3VzYi9yODE1Mi5jCmluZGV4IGY0MWE4YWQuLjQ0ZDQzOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9yODE1Mi5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9yODE1Mi5jCkBAIC0zMiw3ICszMiw3IEBACiAjZGVmaW5lIE5FVE5FWFRfVkVSU0lPTgkJIjA4IgogCiAvKiBJbmZvcm1hdGlvbiBmb3IgbmV0ICovCi0jZGVmaW5lIE5FVF9WRVJTSU9OCQkiNSIKKyNkZWZpbmUgTkVUX1ZFUlNJT04JCSI2IgogCiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkidjEuIiBORVRORVhUX1ZFUlNJT04gIi4iIE5FVF9WRVJTSU9OCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIlJlYWx0ZWsgbGludXggbmljIG1haW50YWluZXJzIDxuaWNfc3dzZEByZWFsdGVrLmNvbT4iCkBAIC0xMDc2LDggKzEwNzYsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9CVUZGRVIgfHwgb2JqLT5zdHJpbmcubGVuZ3RoICE9IDB4MTcpIHsKIAkJbmV0aWZfd2Fybih0cCwgcHJvYmUsIHRwLT5uZXRkZXYsCi0JCQkgICAiSW52YWxpZCBidWZmZXIgd2hlbiByZWFkaW5nIHBhc3MtdGhydSBNQUMgYWRkcjogIgotCQkJICAgIiglZCwgJWQpXG4iLAorCQkJICAgIkludmFsaWQgYnVmZmVyIGZvciBwYXNzLXRocnUgTUFDIGFkZHI6ICglZCwgJWQpXG4iLAogCQkJICAgb2JqLT50eXBlLCBvYmotPnN0cmluZy5sZW5ndGgpOwogCQlnb3RvIGFtYWNvdXQ7CiAJfQpAQCAtMTA5MCw4ICsxMDg5LDggQEAKIAlyZXQgPSBoZXgyYmluKGJ1Ziwgb2JqLT5zdHJpbmcucG9pbnRlciArIDksIDYpOwogCWlmICghKHJldCA9PSAwICYmIGlzX3ZhbGlkX2V0aGVyX2FkZHIoYnVmKSkpIHsKIAkJbmV0aWZfd2Fybih0cCwgcHJvYmUsIHRwLT5uZXRkZXYsCi0JCQkgICAiSW52YWxpZCBNQUMgd2hlbiByZWFkaW5nIHBhc3MtdGhydSBNQUMgYWRkcjogIgotCQkJICAgIiVkLCAlcE1cbiIsIHJldCwgYnVmKTsKKwkJCSAgICJJbnZhbGlkIE1BQyBmb3IgcGFzcy10aHJ1IE1BQyBhZGRyOiAlZCwgJXBNXG4iLAorCQkJICAgcmV0LCBidWYpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGFtYWNvdXQ7CiAJfQpAQCAtMTExMSw5ICsxMTEwLDkgQEAKIAlzdHJ1Y3Qgc29ja2FkZHIgc2E7CiAJaW50IHJldDsKIAotCWlmICh0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzAxKQorCWlmICh0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzAxKSB7CiAJCXJldCA9IHBsYV9vY3BfcmVhZCh0cCwgUExBX0lEUiwgOCwgc2Euc2FfZGF0YSk7Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogaWYgdGhpcyBpcyBub3QgYW4gUlRMODE1My1BRCwgbm8gZUZ1c2UgbWFjIHBhc3MgdGhydSBzZXQsCiAJCSAqIG9yIHN5c3RlbSBkb2Vzbid0IHByb3ZpZGUgdmFsaWQgX1NCLkFNQUMgdGhpcyB3aWxsIGJlCiAJCSAqIGJlIGV4cGVjdGVkIHRvIG5vbi16ZXJvCkBAIC0yNTUyLDYgKzI1NTEsNzcgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByODE1Ml9tbWRfaW5kaXJlY3Qoc3RydWN0IHI4MTUyICp0cCwgdTE2IGRldiwgdTE2IHJlZykKK3sKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FSLCBGVU5fQUREUiB8IGRldik7CisJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9EQVRBLCByZWcpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQVIsIEZVTl9EQVRBIHwgZGV2KTsKK30KKworc3RhdGljIHUxNiByODE1Ml9tbWRfcmVhZChzdHJ1Y3QgcjgxNTIgKnRwLCB1MTYgZGV2LCB1MTYgcmVnKQoreworCXUxNiBkYXRhOworCisJcjgxNTJfbW1kX2luZGlyZWN0KHRwLCBkZXYsIHJlZyk7CisJZGF0YSA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9EQVRBKTsKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FSLCAweDAwMDApOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB2b2lkIHI4MTUyX21tZF93cml0ZShzdHJ1Y3QgcjgxNTIgKnRwLCB1MTYgZGV2LCB1MTYgcmVnLCB1MTYgZGF0YSkKK3sKKwlyODE1Ml9tbWRfaW5kaXJlY3QodHAsIGRldiwgcmVnKTsKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0RBVEEsIGRhdGEpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQVIsIDB4MDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkIHI4MTUyX2VlZV9lbihzdHJ1Y3QgcjgxNTIgKnRwLCBib29sIGVuYWJsZSkKK3sKKwl1MTYgY29uZmlnMSwgY29uZmlnMiwgY29uZmlnMzsKKwl1MzIgb2NwX2RhdGE7CisKKwlvY3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0VFRV9DUik7CisJY29uZmlnMSA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9DT05GSUcxKSAmIH5zZF9yaXNlX3RpbWVfbWFzazsKKwljb25maWcyID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0NPTkZJRzIpOworCWNvbmZpZzMgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQ09ORklHMykgJiB+ZmFzdF9zbnJfbWFzazsKKworCWlmIChlbmFibGUpIHsKKwkJb2NwX2RhdGEgfD0gRUVFX1JYX0VOIHwgRUVFX1RYX0VOOworCQljb25maWcxIHw9IEVFRV8xMF9DQVAgfCBFRUVfTldBWV9FTiB8IFRYX1FVSUVUX0VOIHwgUlhfUVVJRVRfRU47CisJCWNvbmZpZzEgfD0gc2RfcmlzZV90aW1lKDEpOworCQljb25maWcyIHw9IFJHX0RBQ1FVSUVUX0VOIHwgUkdfTERWUVVJRVRfRU47CisJCWNvbmZpZzMgfD0gZmFzdF9zbnIoNDIpOworCX0gZWxzZSB7CisJCW9jcF9kYXRhICY9IH4oRUVFX1JYX0VOIHwgRUVFX1RYX0VOKTsKKwkJY29uZmlnMSAmPSB+KEVFRV8xMF9DQVAgfCBFRUVfTldBWV9FTiB8IFRYX1FVSUVUX0VOIHwKKwkJCSAgICAgUlhfUVVJRVRfRU4pOworCQljb25maWcxIHw9IHNkX3Jpc2VfdGltZSg3KTsKKwkJY29uZmlnMiAmPSB+KFJHX0RBQ1FVSUVUX0VOIHwgUkdfTERWUVVJRVRfRU4pOworCQljb25maWczIHw9IGZhc3Rfc25yKDUxMSk7CisJfQorCisJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0VFRV9DUiwgb2NwX2RhdGEpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQ09ORklHMSwgY29uZmlnMSk7CisJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9DT05GSUcyLCBjb25maWcyKTsKKwlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0NPTkZJRzMsIGNvbmZpZzMpOworfQorCitzdGF0aWMgdm9pZCByODE1MmJfZW5hYmxlX2VlZShzdHJ1Y3QgcjgxNTIgKnRwKQoreworCXI4MTUyX2VlZV9lbih0cCwgdHJ1ZSk7CisJcjgxNTJfbW1kX3dyaXRlKHRwLCBNRElPX01NRF9BTiwgTURJT19BTl9FRUVfQURWLCBNRElPX0VFRV8xMDBUWCk7Cit9CisKK3N0YXRpYyB2b2lkIHI4MTUyYl9lbmFibGVfZmMoc3RydWN0IHI4MTUyICp0cCkKK3sKKwl1MTYgYW5hcjsKKworCWFuYXIgPSByODE1Ml9tZGlvX3JlYWQodHAsIE1JSV9BRFZFUlRJU0UpOworCWFuYXIgfD0gQURWRVJUSVNFX1BBVVNFX0NBUCB8IEFEVkVSVElTRV9QQVVTRV9BU1lNOworCXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9BRFZFUlRJU0UsIGFuYXIpOworfQorCiBzdGF0aWMgdm9pZCBydGw4MTUyX2Rpc2FibGUoc3RydWN0IHI4MTUyICp0cCkKIHsKIAlyODE1Ml9hbGRwc19lbih0cCwgZmFsc2UpOwpAQCAtMjU2MSwxMyArMjYzMSw5IEBACiAKIHN0YXRpYyB2b2lkIHI4MTUyYl9od19waHlfY2ZnKHN0cnVjdCByODE1MiAqdHApCiB7Ci0JdTE2IGRhdGE7Ci0KLQlkYXRhID0gcjgxNTJfbWRpb19yZWFkKHRwLCBNSUlfQk1DUik7Ci0JaWYgKGRhdGEgJiBCTUNSX1BET1dOKSB7Ci0JCWRhdGEgJj0gfkJNQ1JfUERPV047Ci0JCXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9CTUNSLCBkYXRhKTsKLQl9CisJcjgxNTJiX2VuYWJsZV9lZWUodHApOworCXI4MTUyX2FsZHBzX2VuKHRwLCB0cnVlKTsKKwlyODE1MmJfZW5hYmxlX2ZjKHRwKTsKIAogCXNldF9iaXQoUEhZX1JFU0VULCAmdHAtPmZsYWdzKTsKIH0KQEAgLTI3MDEsMjAgKzI3NjcsNTIgQEAKIAlvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JDUiwgb2NwX2RhdGEpOwogfQogCitzdGF0aWMgdm9pZCByODE1M19hbGRwc19lbihzdHJ1Y3QgcjgxNTIgKnRwLCBib29sIGVuYWJsZSkKK3sKKwl1MTYgZGF0YTsKKworCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9QT1dFUl9DRkcpOworCWlmIChlbmFibGUpIHsKKwkJZGF0YSB8PSBFTl9BTERQUzsKKwkJb2NwX3JlZ193cml0ZSh0cCwgT0NQX1BPV0VSX0NGRywgZGF0YSk7CisJfSBlbHNlIHsKKwkJZGF0YSAmPSB+RU5fQUxEUFM7CisJCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9QT1dFUl9DRkcsIGRhdGEpOworCQltc2xlZXAoMjApOworCX0KK30KKworc3RhdGljIHZvaWQgcjgxNTNfZWVlX2VuKHN0cnVjdCByODE1MiAqdHAsIGJvb2wgZW5hYmxlKQoreworCXUzMiBvY3BfZGF0YTsKKwl1MTYgY29uZmlnOworCisJb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVfQ1IpOworCWNvbmZpZyA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9DRkcpOworCisJaWYgKGVuYWJsZSkgeworCQlvY3BfZGF0YSB8PSBFRUVfUlhfRU4gfCBFRUVfVFhfRU47CisJCWNvbmZpZyB8PSBFRUUxMF9FTjsKKwl9IGVsc2UgeworCQlvY3BfZGF0YSAmPSB+KEVFRV9SWF9FTiB8IEVFRV9UWF9FTik7CisJCWNvbmZpZyAmPSB+RUVFMTBfRU47CisJfQorCisJb2NwX3dyaXRlX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0VFRV9DUiwgb2NwX2RhdGEpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQ0ZHLCBjb25maWcpOworfQorCiBzdGF0aWMgdm9pZCByODE1M19od19waHlfY2ZnKHN0cnVjdCByODE1MiAqdHApCiB7CiAJdTMyIG9jcF9kYXRhOwogCXUxNiBkYXRhOwogCi0JaWYgKHRwLT52ZXJzaW9uID09IFJUTF9WRVJfMDMgfHwgdHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wNCB8fAotCSAgICB0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzA1KQotCQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfQURDX0NGRywgQ0tBRFNFTF9MIHwgQURDX0VOIHwgRU5fRU1JX0wpOworCS8qIGRpc2FibGUgQUxEUFMgYmVmb3JlIHVwZGF0aW5nIHRoZSBQSFkgcGFyYW1ldGVycyAqLworCXI4MTUzX2FsZHBzX2VuKHRwLCBmYWxzZSk7CiAKLQlkYXRhID0gcjgxNTJfbWRpb19yZWFkKHRwLCBNSUlfQk1DUik7Ci0JaWYgKGRhdGEgJiBCTUNSX1BET1dOKSB7Ci0JCWRhdGEgJj0gfkJNQ1JfUERPV047Ci0JCXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9CTUNSLCBkYXRhKTsKLQl9CisJLyogZGlzYWJsZSBFRUUgYmVmb3JlIHVwZGF0aW5nIHRoZSBQSFkgcGFyYW1ldGVycyAqLworCXI4MTUzX2VlZV9lbih0cCwgZmFsc2UpOworCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQURWLCAwKTsKIAogCWlmICh0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzAzKSB7CiAJCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQ0ZHKTsKQEAgLTI3NDUsNiArMjg0MywxMiBAQAogCXNyYW1fd3JpdGUodHAsIFNSQU1fMTBNX0FNUDEsIDB4MDBhZik7CiAJc3JhbV93cml0ZSh0cCwgU1JBTV8xME1fQU1QMiwgMHgwMjA4KTsKIAorCXI4MTUzX2VlZV9lbih0cCwgdHJ1ZSk7CisJb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BRFYsIE1ESU9fRUVFXzEwMDBUIHwgTURJT19FRUVfMTAwVFgpOworCisJcjgxNTNfYWxkcHNfZW4odHAsIHRydWUpOworCXI4MTUyYl9lbmFibGVfZmModHApOworCiAJc2V0X2JpdChQSFlfUkVTRVQsICZ0cC0+ZmxhZ3MpOwogfQogCkBAIC0yODY2LDIxICsyOTcwLDYgQEAKIAlvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX1JDUiwgb2NwX2RhdGEpOwogfQogCi1zdGF0aWMgdm9pZCByODE1M19hbGRwc19lbihzdHJ1Y3QgcjgxNTIgKnRwLCBib29sIGVuYWJsZSkKLXsKLQl1MTYgZGF0YTsKLQotCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9QT1dFUl9DRkcpOwotCWlmIChlbmFibGUpIHsKLQkJZGF0YSB8PSBFTl9BTERQUzsKLQkJb2NwX3JlZ193cml0ZSh0cCwgT0NQX1BPV0VSX0NGRywgZGF0YSk7Ci0JfSBlbHNlIHsKLQkJZGF0YSAmPSB+RU5fQUxEUFM7Ci0JCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9QT1dFUl9DRkcsIGRhdGEpOwotCQltc2xlZXAoMjApOwotCX0KLX0KLQogc3RhdGljIHZvaWQgcnRsODE1M19kaXNhYmxlKHN0cnVjdCByODE1MiAqdHApCiB7CiAJcjgxNTNfYWxkcHNfZW4odHAsIGZhbHNlKTsKQEAgLTMyNDYsMTAzICszMzM1LDYgQEAKIAlyZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcjgxNTJfbW1kX2luZGlyZWN0KHN0cnVjdCByODE1MiAqdHAsIHUxNiBkZXYsIHUxNiByZWcpCi17Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BUiwgRlVOX0FERFIgfCBkZXYpOwotCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfREFUQSwgcmVnKTsKLQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FSLCBGVU5fREFUQSB8IGRldik7Ci19Ci0KLXN0YXRpYyB1MTYgcjgxNTJfbW1kX3JlYWQoc3RydWN0IHI4MTUyICp0cCwgdTE2IGRldiwgdTE2IHJlZykKLXsKLQl1MTYgZGF0YTsKLQotCXI4MTUyX21tZF9pbmRpcmVjdCh0cCwgZGV2LCByZWcpOwotCWRhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfREFUQSk7Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9BUiwgMHgwMDAwKTsKLQotCXJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgdm9pZCByODE1Ml9tbWRfd3JpdGUoc3RydWN0IHI4MTUyICp0cCwgdTE2IGRldiwgdTE2IHJlZywgdTE2IGRhdGEpCi17Ci0JcjgxNTJfbW1kX2luZGlyZWN0KHRwLCBkZXYsIHJlZyk7Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9EQVRBLCBkYXRhKTsKLQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0FSLCAweDAwMDApOwotfQotCi1zdGF0aWMgdm9pZCByODE1Ml9lZWVfZW4oc3RydWN0IHI4MTUyICp0cCwgYm9vbCBlbmFibGUpCi17Ci0JdTE2IGNvbmZpZzEsIGNvbmZpZzIsIGNvbmZpZzM7Ci0JdTMyIG9jcF9kYXRhOwotCi0Jb2NwX2RhdGEgPSBvY3BfcmVhZF93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVfQ1IpOwotCWNvbmZpZzEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9FRUVfQ09ORklHMSkgJiB+c2RfcmlzZV90aW1lX21hc2s7Ci0JY29uZmlnMiA9IG9jcF9yZWdfcmVhZCh0cCwgT0NQX0VFRV9DT05GSUcyKTsKLQljb25maWczID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0NPTkZJRzMpICYgfmZhc3Rfc25yX21hc2s7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCW9jcF9kYXRhIHw9IEVFRV9SWF9FTiB8IEVFRV9UWF9FTjsKLQkJY29uZmlnMSB8PSBFRUVfMTBfQ0FQIHwgRUVFX05XQVlfRU4gfCBUWF9RVUlFVF9FTiB8IFJYX1FVSUVUX0VOOwotCQljb25maWcxIHw9IHNkX3Jpc2VfdGltZSgxKTsKLQkJY29uZmlnMiB8PSBSR19EQUNRVUlFVF9FTiB8IFJHX0xEVlFVSUVUX0VOOwotCQljb25maWczIHw9IGZhc3Rfc25yKDQyKTsKLQl9IGVsc2UgewotCQlvY3BfZGF0YSAmPSB+KEVFRV9SWF9FTiB8IEVFRV9UWF9FTik7Ci0JCWNvbmZpZzEgJj0gfihFRUVfMTBfQ0FQIHwgRUVFX05XQVlfRU4gfCBUWF9RVUlFVF9FTiB8Ci0JCQkgICAgIFJYX1FVSUVUX0VOKTsKLQkJY29uZmlnMSB8PSBzZF9yaXNlX3RpbWUoNyk7Ci0JCWNvbmZpZzIgJj0gfihSR19EQUNRVUlFVF9FTiB8IFJHX0xEVlFVSUVUX0VOKTsKLQkJY29uZmlnMyB8PSBmYXN0X3Nucig1MTEpOwotCX0KLQotCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9FRUVfQ1IsIG9jcF9kYXRhKTsKLQlvY3BfcmVnX3dyaXRlKHRwLCBPQ1BfRUVFX0NPTkZJRzEsIGNvbmZpZzEpOwotCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQ09ORklHMiwgY29uZmlnMik7Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9DT05GSUczLCBjb25maWczKTsKLX0KLQotc3RhdGljIHZvaWQgcjgxNTJiX2VuYWJsZV9lZWUoc3RydWN0IHI4MTUyICp0cCkKLXsKLQlyODE1Ml9lZWVfZW4odHAsIHRydWUpOwotCXI4MTUyX21tZF93cml0ZSh0cCwgTURJT19NTURfQU4sIE1ESU9fQU5fRUVFX0FEViwgTURJT19FRUVfMTAwVFgpOwotfQotCi1zdGF0aWMgdm9pZCByODE1M19lZWVfZW4oc3RydWN0IHI4MTUyICp0cCwgYm9vbCBlbmFibGUpCi17Ci0JdTMyIG9jcF9kYXRhOwotCXUxNiBjb25maWc7Ci0KLQlvY3BfZGF0YSA9IG9jcF9yZWFkX3dvcmQodHAsIE1DVV9UWVBFX1BMQSwgUExBX0VFRV9DUik7Ci0JY29uZmlnID0gb2NwX3JlZ19yZWFkKHRwLCBPQ1BfRUVFX0NGRyk7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCW9jcF9kYXRhIHw9IEVFRV9SWF9FTiB8IEVFRV9UWF9FTjsKLQkJY29uZmlnIHw9IEVFRTEwX0VOOwotCX0gZWxzZSB7Ci0JCW9jcF9kYXRhICY9IH4oRUVFX1JYX0VOIHwgRUVFX1RYX0VOKTsKLQkJY29uZmlnICY9IH5FRUUxMF9FTjsKLQl9Ci0KLQlvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfRUVFX0NSLCBvY3BfZGF0YSk7Ci0Jb2NwX3JlZ193cml0ZSh0cCwgT0NQX0VFRV9DRkcsIGNvbmZpZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHI4MTUzX2VuYWJsZV9lZWUoc3RydWN0IHI4MTUyICp0cCkKLXsKLQlyODE1M19lZWVfZW4odHAsIHRydWUpOwotCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9FRUVfQURWLCBNRElPX0VFRV8xMDAwVCB8IE1ESU9fRUVFXzEwMFRYKTsKLX0KLQotc3RhdGljIHZvaWQgcjgxNTJiX2VuYWJsZV9mYyhzdHJ1Y3QgcjgxNTIgKnRwKQotewotCXUxNiBhbmFyOwotCi0JYW5hciA9IHI4MTUyX21kaW9fcmVhZCh0cCwgTUlJX0FEVkVSVElTRSk7Ci0JYW5hciB8PSBBRFZFUlRJU0VfUEFVU0VfQ0FQIHwgQURWRVJUSVNFX1BBVVNFX0FTWU07Ci0JcjgxNTJfbWRpb193cml0ZSh0cCwgTUlJX0FEVkVSVElTRSwgYW5hcik7Ci19Ci0KIHN0YXRpYyB2b2lkIHJ0bF90YWxseV9yZXNldChzdHJ1Y3QgcjgxNTIgKnRwKQogewogCXUzMiBvY3BfZGF0YTsKQEAgLTMzNTUsMTAgKzMzNDcsMTcgQEAKIHN0YXRpYyB2b2lkIHI4MTUyYl9pbml0KHN0cnVjdCByODE1MiAqdHApCiB7CiAJdTMyIG9jcF9kYXRhOworCXUxNiBkYXRhOwogCiAJaWYgKHRlc3RfYml0KFJUTDgxNTJfVU5QTFVHLCAmdHAtPmZsYWdzKSkKIAkJcmV0dXJuOwogCisJZGF0YSA9IHI4MTUyX21kaW9fcmVhZCh0cCwgTUlJX0JNQ1IpOworCWlmIChkYXRhICYgQk1DUl9QRE9XTikgeworCQlkYXRhICY9IH5CTUNSX1BET1dOOworCQlyODE1Ml9tZGlvX3dyaXRlKHRwLCBNSUlfQk1DUiwgZGF0YSk7CisJfQorCiAJcjgxNTJfYWxkcHNfZW4odHAsIGZhbHNlKTsKIAogCWlmICh0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzAxKSB7CkBAIC0zMzgwLDkgKzMzNzksNiBAQAogCQkgICBTUERXTl9SWERWX01TSyB8IFNQRFdOX0xJTktDSEdfTVNLOwogCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9HUEhZX0lOVFJfSU1SLCBvY3BfZGF0YSk7CiAKLQlyODE1MmJfZW5hYmxlX2VlZSh0cCk7Ci0JcjgxNTJfYWxkcHNfZW4odHAsIHRydWUpOwotCXI4MTUyYl9lbmFibGVfZmModHApOwogCXJ0bF90YWxseV9yZXNldCh0cCk7CiAKIAkvKiBlbmFibGUgcnggYWdncmVnYXRpb24gKi8KQEAgLTMzOTQsMTIgKzMzOTAsMTIgQEAKIHN0YXRpYyB2b2lkIHI4MTUzX2luaXQoc3RydWN0IHI4MTUyICp0cCkKIHsKIAl1MzIgb2NwX2RhdGE7CisJdTE2IGRhdGE7CiAJaW50IGk7CiAKIAlpZiAodGVzdF9iaXQoUlRMODE1Ml9VTlBMVUcsICZ0cC0+ZmxhZ3MpKQogCQlyZXR1cm47CiAKLQlyODE1M19hbGRwc19lbih0cCwgZmFsc2UpOwogCXI4MTUzX3UxdTJlbih0cCwgZmFsc2UpOwogCiAJZm9yIChpID0gMDsgaSA8IDUwMDsgaSsrKSB7CkBAIC0zNDE2LDYgKzM0MTIsMjMgQEAKIAkJbXNsZWVwKDIwKTsKIAl9CiAKKwlpZiAodHAtPnZlcnNpb24gPT0gUlRMX1ZFUl8wMyB8fCB0cC0+dmVyc2lvbiA9PSBSVExfVkVSXzA0IHx8CisJICAgIHRwLT52ZXJzaW9uID09IFJUTF9WRVJfMDUpCisJCW9jcF9yZWdfd3JpdGUodHAsIE9DUF9BRENfQ0ZHLCBDS0FEU0VMX0wgfCBBRENfRU4gfCBFTl9FTUlfTCk7CisKKwlkYXRhID0gcjgxNTJfbWRpb19yZWFkKHRwLCBNSUlfQk1DUik7CisJaWYgKGRhdGEgJiBCTUNSX1BET1dOKSB7CisJCWRhdGEgJj0gfkJNQ1JfUERPV047CisJCXI4MTUyX21kaW9fd3JpdGUodHAsIE1JSV9CTUNSLCBkYXRhKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKKwkJb2NwX2RhdGEgPSBvY3BfcmVnX3JlYWQodHAsIE9DUF9QSFlfU1RBVFVTKSAmIFBIWV9TVEFUX01BU0s7CisJCWlmIChvY3BfZGF0YSA9PSBQSFlfU1RBVF9MQU5fT04pCisJCQlicmVhazsKKwkJbXNsZWVwKDIwKTsKKwl9CisKIAl1c2JfZGlzYWJsZV9scG0odHAtPnVkZXYpOwogCXI4MTUzX3UycDNlbih0cCwgZmFsc2UpOwogCkBAIC0zNDgzLDkgKzM0OTYsNiBAQAogCW9jcF93cml0ZV93b3JkKHRwLCBNQ1VfVFlQRV9QTEEsIFBMQV9NQUNfUFdSX0NUUkwzLCAwKTsKIAlvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfUExBLCBQTEFfTUFDX1BXUl9DVFJMNCwgMCk7CiAKLQlyODE1M19lbmFibGVfZWVlKHRwKTsKLQlyODE1M19hbGRwc19lbih0cCwgdHJ1ZSk7Ci0JcjgxNTJiX2VuYWJsZV9mYyh0cCk7CiAJcnRsX3RhbGx5X3Jlc2V0KHRwKTsKIAlyODE1M191MnAzZW4odHAsIHRydWUpOwogfQpAQCAtNDAzMiw3ICs0MDQyLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgb3BzID0gewogCS5nZXRfZHJ2aW5mbyA9IHJ0bDgxNTJfZ2V0X2RydmluZm8sCiAJLmdldF9zZXR0aW5ncyA9IHJ0bDgxNTJfZ2V0X3NldHRpbmdzLAogCS5zZXRfc2V0dGluZ3MgPSBydGw4MTUyX3NldF9zZXR0aW5ncywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jIGIvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmMKaW5kZXggZGM5ODlhOC4uODMxYWEzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3Ntc2M5NXh4LmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlICJzbXNjOTV4eC5oIgogCiAjZGVmaW5lIFNNU0NfQ0hJUE5BTUUJCQkic21zYzk1eHgiCi0jZGVmaW5lIFNNU0NfRFJJVkVSX1ZFUlNJT04JCSIxLjAuNCIKKyNkZWZpbmUgU01TQ19EUklWRVJfVkVSU0lPTgkJIjEuMC41IgogI2RlZmluZSBIU19VU0JfUEtUX1NJWkUJCQkoNTEyKQogI2RlZmluZSBGU19VU0JfUEtUX1NJWkUJCQkoNjQpCiAjZGVmaW5lIERFRkFVTFRfSFNfQlVSU1RfQ0FQX1NJWkUJKDE2ICogMTAyNCArIDUgKiBIU19VU0JfUEtUX1NJWkUpCkBAIC02NCw2ICs2NCw3IEBACiAjZGVmaW5lIENBUlJJRVJfQ0hFQ0tfREVMQVkgKDIgKiBIWikKIAogc3RydWN0IHNtc2M5NXh4X3ByaXYgeworCXUzMiBjaGlwX2lkOwogCXUzMiBtYWNfY3I7CiAJdTMyIGhhc2hfaGk7CiAJdTMyIGhhc2hfbG87CkBAIC03MSw2ICs3Miw3IEBACiAJc3BpbmxvY2tfdCBtYWNfY3JfbG9jazsKIAl1OCBmZWF0dXJlczsKIAl1OCBzdXNwZW5kX2ZsYWdzOworCXU4IG1kaXhfY3RybDsKIAlib29sIGxpbmtfb2s7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBjYXJyaWVyX2NoZWNrOwogCXN0cnVjdCB1c2JuZXQgKmRldjsKQEAgLTc4MiwxNCArNzg0LDExMyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgZ2V0X21kaXhfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwl1MzIgdmFsOworCWludCBidWY7CisKKwlidWYgPSBzbXNjOTV4eF9tZGlvX3JlYWQoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgU1BFQ0lBTF9DVFJMX1NUUyk7CisJaWYgKGJ1ZiAmIFNQRUNJQUxfQ1RSTF9TVFNfT1ZSUkRfQU1ESVhfKSB7CisJCWlmIChidWYgJiBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX0VOQUJMRV8pCisJCQlyZXR1cm4gRVRIX1RQX01ESV9BVVRPOworCQllbHNlIGlmIChidWYgJiBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX1NUQVRFXykKKwkJCXJldHVybiBFVEhfVFBfTURJX1g7CisJfSBlbHNlIHsKKwkJYnVmID0gc21zYzk1eHhfcmVhZF9yZWcoZGV2LCBTVFJBUF9TVEFUVVMsICZ2YWwpOworCQlpZiAodmFsICYgU1RSQVBfU1RBVFVTX0FNRElYX0VOXykKKwkJCXJldHVybiBFVEhfVFBfTURJX0FVVE87CisJfQorCisJcmV0dXJuIEVUSF9UUF9NREk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tZGl4X3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LCBfX3U4IG1kaXhfY3RybCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBzbXNjOTV4eF9wcml2ICpwZGF0YSA9IChzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqKShkZXYtPmRhdGFbMF0pOworCWludCBidWY7CisKKwlpZiAoKHBkYXRhLT5jaGlwX2lkID09IElEX1JFVl9DSElQX0lEXzk1MDBBXykgfHwKKwkgICAgKHBkYXRhLT5jaGlwX2lkID09IElEX1JFVl9DSElQX0lEXzk1MzBfKSB8fAorCSAgICAocGRhdGEtPmNoaXBfaWQgPT0gSURfUkVWX0NISVBfSURfODk1MzBfKSB8fAorCSAgICAocGRhdGEtPmNoaXBfaWQgPT0gSURfUkVWX0NISVBfSURfOTczMF8pKSB7CisJCS8qIEV4dGVuZCBNYW51YWwgQXV0b01ESVggdGltZXIgZm9yIDk1MDBBLzk1MDBBaSAqLworCQlidWYgPSBzbXNjOTV4eF9tZGlvX3JlYWQoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJIFBIWV9FRFBEX0NPTkZJRyk7CisJCWJ1ZiB8PSBQSFlfRURQRF9DT05GSUdfRVhUX0NST1NTT1ZFUl87CisJCXNtc2M5NXh4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkgICAgUEhZX0VEUERfQ09ORklHLCBidWYpOworCX0KKworCWlmIChtZGl4X2N0cmwgPT0gRVRIX1RQX01ESSkgeworCQlidWYgPSBzbXNjOTV4eF9tZGlvX3JlYWQoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJIFNQRUNJQUxfQ1RSTF9TVFMpOworCQlidWYgfD0gU1BFQ0lBTF9DVFJMX1NUU19PVlJSRF9BTURJWF87CisJCWJ1ZiAmPSB+KFNQRUNJQUxfQ1RSTF9TVFNfQU1ESVhfRU5BQkxFXyB8CisJCQkgU1BFQ0lBTF9DVFJMX1NUU19BTURJWF9TVEFURV8pOworCQlzbXNjOTV4eF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQkJICAgIFNQRUNJQUxfQ1RSTF9TVFMsIGJ1Zik7CisJfSBlbHNlIGlmIChtZGl4X2N0cmwgPT0gRVRIX1RQX01ESV9YKSB7CisJCWJ1ZiA9IHNtc2M5NXh4X21kaW9fcmVhZChkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCQkgU1BFQ0lBTF9DVFJMX1NUUyk7CisJCWJ1ZiB8PSBTUEVDSUFMX0NUUkxfU1RTX09WUlJEX0FNRElYXzsKKwkJYnVmICY9IH4oU1BFQ0lBTF9DVFJMX1NUU19BTURJWF9FTkFCTEVfIHwKKwkJCSBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX1NUQVRFXyk7CisJCWJ1ZiB8PSBTUEVDSUFMX0NUUkxfU1RTX0FNRElYX1NUQVRFXzsKKwkJc21zYzk1eHhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCSAgICBTUEVDSUFMX0NUUkxfU1RTLCBidWYpOworCX0gZWxzZSBpZiAobWRpeF9jdHJsID09IEVUSF9UUF9NRElfQVVUTykgeworCQlidWYgPSBzbXNjOTV4eF9tZGlvX3JlYWQoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwKKwkJCQkJIFNQRUNJQUxfQ1RSTF9TVFMpOworCQlidWYgJj0gflNQRUNJQUxfQ1RSTF9TVFNfT1ZSUkRfQU1ESVhfOworCQlidWYgJj0gfihTUEVDSUFMX0NUUkxfU1RTX0FNRElYX0VOQUJMRV8gfAorCQkJIFNQRUNJQUxfQ1RSTF9TVFNfQU1ESVhfU1RBVEVfKTsKKwkJYnVmIHw9IFNQRUNJQUxfQ1RSTF9TVFNfQU1ESVhfRU5BQkxFXzsKKwkJc21zYzk1eHhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJCSAgICBTUEVDSUFMX0NUUkxfU1RTLCBidWYpOworCX0KKwlwZGF0YS0+bWRpeF9jdHJsID0gbWRpeF9jdHJsOworfQorCitzdGF0aWMgaW50IHNtc2M5NXh4X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAorCQkJCSBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBzbXNjOTV4eF9wcml2ICpwZGF0YSA9IChzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqKShkZXYtPmRhdGFbMF0pOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSB1c2JuZXRfZ2V0X3NldHRpbmdzKG5ldCwgY21kKTsKKworCWNtZC0+ZXRoX3RwX21kaXggPSBwZGF0YS0+bWRpeF9jdHJsOworCWNtZC0+ZXRoX3RwX21kaXhfY3RybCA9IHBkYXRhLT5tZGl4X2N0cmw7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHNtc2M5NXh4X3NldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAorCQkJCSBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBzbXNjOTV4eF9wcml2ICpwZGF0YSA9IChzdHJ1Y3Qgc21zYzk1eHhfcHJpdiAqKShkZXYtPmRhdGFbMF0pOworCWludCByZXR2YWw7CisKKwlpZiAocGRhdGEtPm1kaXhfY3RybCAhPSBjbWQtPmV0aF90cF9tZGl4X2N0cmwpCisJCXNldF9tZGl4X3N0YXR1cyhuZXQsIGNtZC0+ZXRoX3RwX21kaXhfY3RybCk7CisKKwlyZXR2YWwgPSB1c2JuZXRfc2V0X3NldHRpbmdzKG5ldCwgY21kKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgc21zYzk1eHhfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9saW5rCT0gdXNibmV0X2dldF9saW5rLAogCS5ud2F5X3Jlc2V0CT0gdXNibmV0X253YXlfcmVzZXQsCiAJLmdldF9kcnZpbmZvCT0gdXNibmV0X2dldF9kcnZpbmZvLAogCS5nZXRfbXNnbGV2ZWwJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAogCS5zZXRfbXNnbGV2ZWwJPSB1c2JuZXRfc2V0X21zZ2xldmVsLAotCS5nZXRfc2V0dGluZ3MJPSB1c2JuZXRfZ2V0X3NldHRpbmdzLAotCS5zZXRfc2V0dGluZ3MJPSB1c2JuZXRfc2V0X3NldHRpbmdzLAorCS5nZXRfc2V0dGluZ3MJPSBzbXNjOTV4eF9nZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncwk9IHNtc2M5NXh4X3NldF9zZXR0aW5ncywKIAkuZ2V0X2VlcHJvbV9sZW4JPSBzbXNjOTV4eF9ldGh0b29sX2dldF9lZXByb21fbGVuLAogCS5nZXRfZWVwcm9tCT0gc21zYzk1eHhfZXRodG9vbF9nZXRfZWVwcm9tLAogCS5zZXRfZWVwcm9tCT0gc21zYzk1eHhfZXRodG9vbF9zZXRfZWVwcm9tLApAQCAtMTE5NCw2ICsxMjk1LDggQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAl2YWwgPj49IDE2OworCXBkYXRhLT5jaGlwX2lkID0gdmFsOworCXBkYXRhLT5tZGl4X2N0cmwgPSBnZXRfbWRpeF9zdGF0dXMoZGV2LT5uZXQpOwogCiAJaWYgKCh2YWwgPT0gSURfUkVWX0NISVBfSURfOTUwMEFfKSB8fCAodmFsID09IElEX1JFVl9DSElQX0lEXzk1MzBfKSB8fAogCSAgICAodmFsID09IElEX1JFVl9DSElQX0lEXzg5NTMwXykgfHwgKHZhbCA9PSBJRF9SRVZfQ0hJUF9JRF85NzMwXykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Ivc21zYzk1eHguaCBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5oCmluZGV4IDUyNmZhYTAuLjI5YTRkOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5oCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5oCkBAIC0xNDQsNiArMTQ0LDE0IEBACiAKICNkZWZpbmUgQlVSU1RfQ0FQCQkJKDB4MzgpCiAKKyNkZWZpbmUJU1RSQVBfU1RBVFVTCQkJKDB4M0MpCisjZGVmaW5lCVNUUkFQX1NUQVRVU19QV1JfU0VMXwkJKDB4MDAwMDAwMjApCisjZGVmaW5lCVNUUkFQX1NUQVRVU19BTURJWF9FTl8JCSgweDAwMDAwMDEwKQorI2RlZmluZQlTVFJBUF9TVEFUVVNfUE9SVF9TV0FQXwkJKDB4MDAwMDAwMDgpCisjZGVmaW5lCVNUUkFQX1NUQVRVU19FRVBfU0laRV8JCSgweDAwMDAwMDA0KQorI2RlZmluZQlTVFJBUF9TVEFUVVNfUk1UX1dLUF8JCSgweDAwMDAwMDAyKQorI2RlZmluZQlTVFJBUF9TVEFUVVNfRUVQX0RJU0FCTEVfCSgweDAwMDAwMDAxKQorCiAjZGVmaW5lIEdQSU9fV0FLRQkJCSgweDY0KQogCiAjZGVmaW5lIElOVF9FUF9DVEwJCQkoMHg2OCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYyBiL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYwppbmRleCAzYmZiNTkyLi5kNTA3MWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jCkBAIC0yMDYyLDExICsyMDYyLDggQEAKIAkJICAgY21kLCByZXF0eXBlLCB2YWx1ZSwgaW5kZXgsIHNpemUpOwogCiAJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXVyYikgewotCQluZXRkZXZfZXJyKGRldi0+bmV0LCAiRXJyb3IgYWxsb2NhdGluZyBVUkIgaW4iCi0JCQkgICAiICVzIVxuIiwgX19mdW5jX18pOworCWlmICghdXJiKQogCQlnb3RvIGZhaWw7Ci0JfQogCiAJaWYgKGRhdGEpIHsKIAkJYnVmID0ga21lbWR1cChkYXRhLCBzaXplLCBHRlBfQVRPTUlDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZldGguYyBiL2RyaXZlcnMvbmV0L3ZldGguYwppbmRleCBmMzdhNmU2Li5mYmM4NTNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdmV0aC5jCkBAIC0zMTMsNyArMzEzLDcgQEAKIH07CiAKICNkZWZpbmUgVkVUSF9GRUFUVVJFUyAoTkVUSUZfRl9TRyB8IE5FVElGX0ZfRlJBR0xJU1QgfCBORVRJRl9GX0hXX0NTVU0gfCBcCi0JCSAgICAgICBORVRJRl9GX1JYQ1NVTSB8IE5FVElGX0ZfSElHSERNQSB8IFwKKwkJICAgICAgIE5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9TQ1RQX0NSQyB8IE5FVElGX0ZfSElHSERNQSB8IFwKIAkJICAgICAgIE5FVElGX0ZfR1NPX1NPRlRXQVJFIHwgTkVUSUZfRl9HU09fRU5DQVBfQUxMIHwgXAogCQkgICAgICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfCBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCB8IFwKIAkJICAgICAgIE5FVElGX0ZfSFdfVkxBTl9TVEFHX1RYIHwgTkVUSUZfRl9IV19WTEFOX1NUQUdfUlggKQpAQCAtMzQwLDYgKzM0MCw3IEBACiAKIAlkZXYtPmh3X2ZlYXR1cmVzID0gVkVUSF9GRUFUVVJFUzsKIAlkZXYtPmh3X2VuY19mZWF0dXJlcyA9IFZFVEhfRkVBVFVSRVM7CisJZGV2LT5tcGxzX2ZlYXR1cmVzID0gTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9HU09fU09GVFdBUkU7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMgYi9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKaW5kZXggMWI1ZjUzMS4uZmFkODRmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwpAQCAtMTM4LDggKzEzOCw5IEBACiAJLyogRG9lcyB0aGUgYWZmaW5pdHkgaGludCBpcyBzZXQgZm9yIHZpcnRxdWV1ZXM/ICovCiAJYm9vbCBhZmZpbml0eV9oaW50X3NldDsKIAotCS8qIENQVSBob3QgcGx1ZyBub3RpZmllciAqLwotCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKwkvKiBDUFUgaG90cGx1ZyBpbnN0YW5jZXMgZm9yIG9ubGluZSAmIGRlYWQgKi8KKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGVfZGVhZDsKIAogCS8qIENvbnRyb2wgVlEgYnVmZmVyczogcHJvdGVjdGVkIGJ5IHRoZSBydG5sIGxvY2sgKi8KIAlzdHJ1Y3QgdmlydGlvX25ldF9jdHJsX2hkciBjdHJsX2hkcjsKQEAgLTEyMzcsMjUgKzEyMzgsNTMgQEAKIAl2aS0+YWZmaW5pdHlfaGludF9zZXQgPSB0cnVlOwogfQogCi1zdGF0aWMgaW50IHZpcnRuZXRfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQkJICAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgdmlydG5ldF9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQogewotCXN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpID0gY29udGFpbmVyX29mKG5mYiwgc3RydWN0IHZpcnRuZXRfaW5mbywgbmIpOworCXN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgdmlydG5ldF9pbmZvLAorCQkJCQkJICAgbm9kZSk7CisJdmlydG5ldF9zZXRfYWZmaW5pdHkodmkpOworCXJldHVybiAwOworfQogCi0Jc3dpdGNoKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotCWNhc2UgQ1BVX0RFQUQ6Ci0JCXZpcnRuZXRfc2V0X2FmZmluaXR5KHZpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQl2aXJ0bmV0X2NsZWFuX2FmZmluaXR5KHZpLCAobG9uZyloY3B1KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQorc3RhdGljIGludCB2aXJ0bmV0X2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgdmlydG5ldF9pbmZvLAorCQkJCQkJICAgbm9kZV9kZWFkKTsKKwl2aXJ0bmV0X3NldF9hZmZpbml0eSh2aSk7CisJcmV0dXJuIDA7Cit9CiAKLQlyZXR1cm4gTk9USUZZX09LOworc3RhdGljIGludCB2aXJ0bmV0X2NwdV9kb3duX3ByZXAodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCit7CisJc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkgPSBobGlzdF9lbnRyeV9zYWZlKG5vZGUsIHN0cnVjdCB2aXJ0bmV0X2luZm8sCisJCQkJCQkgICBub2RlKTsKKworCXZpcnRuZXRfY2xlYW5fYWZmaW5pdHkodmksIGNwdSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIHZpcnRpb25ldF9vbmxpbmU7CisKK3N0YXRpYyBpbnQgdmlydG5ldF9jcHVfbm90aWZfYWRkKHN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Vfbm9jYWxscyh2aXJ0aW9uZXRfb25saW5lLCAmdmktPm5vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfVklSVF9ORVRfREVBRCwKKwkJCQkJICAgICAgICZ2aS0+bm9kZV9kZWFkKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIHJldDsKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyh2aXJ0aW9uZXRfb25saW5lLCAmdmktPm5vZGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZpcnRuZXRfY3B1X25vdGlmX3JlbW92ZShzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSkKK3sKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyh2aXJ0aW9uZXRfb25saW5lLCAmdmktPm5vZGUpOworCWNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKENQVUhQX1ZJUlRfTkVUX0RFQUQsCisJCQkJCSAgICAmdmktPm5vZGVfZGVhZCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZpcnRuZXRfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTg3OSw4ICsxOTA4LDcgQEAKIAogCXZpcnRpb19kZXZpY2VfcmVhZHkodmRldik7CiAKLQl2aS0+bmIubm90aWZpZXJfY2FsbCA9ICZ2aXJ0bmV0X2NwdV9jYWxsYmFjazsKLQllcnIgPSByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnZpLT5uYik7CisJZXJyID0gdmlydG5ldF9jcHVfbm90aWZfYWRkKHZpKTsKIAlpZiAoZXJyKSB7CiAJCXByX2RlYnVnKCJ2aXJ0aW9fbmV0OiByZWdpc3RlcmluZyBjcHUgbm90aWZpZXIgZmFpbGVkXG4iKTsKIAkJZ290byBmcmVlX3VucmVnaXN0ZXJfbmV0ZGV2OwpAQCAtMTkzNCw3ICsxOTYyLDcgQEAKIHsKIAlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IHZkZXYtPnByaXY7CiAKLQl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmdmktPm5iKTsKKwl2aXJ0bmV0X2NwdV9ub3RpZl9yZW1vdmUodmkpOwogCiAJLyogTWFrZSBzdXJlIG5vIHdvcmsgaGFuZGxlciBpcyBhY2Nlc3NpbmcgdGhlIGRldmljZS4gKi8KIAlmbHVzaF93b3JrKCZ2aS0+Y29uZmlnX3dvcmspOwpAQCAtMTk1Myw3ICsxOTgxLDcgQEAKIAlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IHZkZXYtPnByaXY7CiAJaW50IGk7CiAKLQl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmdmktPm5iKTsKKwl2aXJ0bmV0X2NwdV9ub3RpZl9yZW1vdmUodmkpOwogCiAJLyogTWFrZSBzdXJlIG5vIHdvcmsgaGFuZGxlciBpcyBhY2Nlc3NpbmcgdGhlIGRldmljZSAqLwogCWZsdXNoX3dvcmsoJnZpLT5jb25maWdfd29yayk7CkBAIC0xOTk3LDcgKzIwMjUsNyBAQAogCXZpcnRuZXRfc2V0X3F1ZXVlcyh2aSwgdmktPmN1cnJfcXVldWVfcGFpcnMpOwogCXJ0bmxfdW5sb2NrKCk7CiAKLQllcnIgPSByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJnZpLT5uYik7CisJZXJyID0gdmlydG5ldF9jcHVfbm90aWZfYWRkKHZpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0yMDM5LDcgKzIwNjcsNDEgQEAKICNlbmRpZgogfTsKIAotbW9kdWxlX3ZpcnRpb19kcml2ZXIodmlydGlvX25ldF9kcml2ZXIpOworc3RhdGljIF9faW5pdCBpbnQgdmlydGlvX25ldF9kcml2ZXJfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9BUF9PTkxJTkVfRFlOLCAiQVBfVklSVF9ORVRfT05MSU5FIiwKKwkJCQkgICAgICB2aXJ0bmV0X2NwdV9vbmxpbmUsCisJCQkJICAgICAgdmlydG5ldF9jcHVfZG93bl9wcmVwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJdmlydGlvbmV0X29ubGluZSA9IHJldDsKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9WSVJUX05FVF9ERUFELCAiVklSVF9ORVRfREVBRCIsCisJCQkJICAgICAgTlVMTCwgdmlydG5ldF9jcHVfZGVhZCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfZGVhZDsKKworICAgICAgICByZXQgPSByZWdpc3Rlcl92aXJ0aW9fZHJpdmVyKCZ2aXJ0aW9fbmV0X2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdmlydGlvOworCXJldHVybiAwOworZXJyX3ZpcnRpbzoKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoQ1BVSFBfVklSVF9ORVRfREVBRCk7CitlcnJfZGVhZDoKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUodmlydGlvbmV0X29ubGluZSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KHZpcnRpb19uZXRfZHJpdmVyX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgdmlydGlvX25ldF9kcml2ZXJfZXhpdCh2b2lkKQoreworCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZShDUFVIUF9WSVJUX05FVF9ERUFEKTsKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUodmlydGlvbmV0X29ubGluZSk7CisJdW5yZWdpc3Rlcl92aXJ0aW9fZHJpdmVyKCZ2aXJ0aW9fbmV0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh2aXJ0aW9fbmV0X2RyaXZlcl9leGl0KTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRSh2aXJ0aW8sIGlkX3RhYmxlKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVmlydGlvIG5ldHdvcmsgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKaW5kZXggYzY4ZmU0OS4uYjU1NTRmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jCisrKyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYwpAQCAtOTE0LDcgKzkxNCw5IEBACiB7CiAJc3RydWN0IFZteG5ldDNfVHhEYXRhRGVzYyAqdGRkOwogCi0JdGRkID0gdHEtPmRhdGFfcmluZy5iYXNlICsgdHEtPnR4X3JpbmcubmV4dDJmaWxsOworCXRkZCA9IChzdHJ1Y3QgVm14bmV0M19UeERhdGFEZXNjICopKCh1OCAqKXRxLT5kYXRhX3JpbmcuYmFzZSArCisJCQkJCSAgICB0cS0+dHhfcmluZy5uZXh0MmZpbGwgKgorCQkJCQkgICAgdHEtPnR4ZGF0YV9kZXNjX3NpemUpOwogCiAJbWVtY3B5KHRkZC0+ZGF0YSwgc2tiLT5kYXRhLCBjdHgtPmNvcHlfc2l6ZSk7CiAJbmV0ZGV2X2RiZyhhZGFwdGVyLT5uZXRkZXYsCkBAIC0xNjM5LDcgKzE2NDEsNyBAQAogCX0KIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIHZteG5ldDNfcnFfZGVzdHJveV9hbGxfcnhkYXRhcmluZyhzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyKQogewogCWludCBpOwpAQCAtMzE4NCw3ICszMTg2LDYgQEAKIAogCW5ldGRldl9lcnIoYWRhcHRlci0+bmV0ZGV2LCAidHggaGFuZ1xuIik7CiAJc2NoZWR1bGVfd29yaygmYWRhcHRlci0+d29yayk7Ci0JbmV0aWZfd2FrZV9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOwogfQogCiAKQEAgLTMyMTEsNiArMzIxMiw3IEBACiAJfQogCXJ0bmxfdW5sb2NrKCk7CiAKKwluZXRpZl93YWtlX3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7CiAJY2xlYXJfYml0KFZNWE5FVDNfU1RBVEVfQklUX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oCmluZGV4IDc0ZmMwMzAuLjdkYzM3YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaAorKysgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmgKQEAgLTY5LDEwICs2OSwxMCBAQAogLyoKICAqIFZlcnNpb24gbnVtYmVycwogICovCi0jZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuNC45LjAtayIKKyNkZWZpbmUgVk1YTkVUM19EUklWRVJfVkVSU0lPTl9TVFJJTkcgICAiMS40LmEuMC1rIgogCiAvKiBhIDMyLWJpdCBpbnQsIGVhY2ggYnl0ZSBlbmNvZGUgYSB2ZXJpb24gbnVtYmVyIGluIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT04gKi8KLSNkZWZpbmUgVk1YTkVUM19EUklWRVJfVkVSU0lPTl9OVU0gICAgICAweDAxMDQwOTAwCisjZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fTlVNICAgICAgMHgwMTA0MGEwMAogCiAjaWYgZGVmaW5lZChDT05GSUdfUENJX01TSSkKIAkvKiBSU1Mgb25seSBtYWtlcyBzZW5zZSBpZiBNU0ktWCBpcyBzdXBwb3J0ZWQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92cmYuYyBiL2RyaXZlcnMvbmV0L3ZyZi5jCmluZGV4IDFjZTc0MjAuLjg1YzI3MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZyZi5jCisrKyBiL2RyaXZlcnMvbmV0L3ZyZi5jCkBAIC0zNyw5ICszNyw2IEBACiAjaW5jbHVkZSA8bmV0L2wzbWRldi5oPgogI2luY2x1ZGUgPG5ldC9maWJfcnVsZXMuaD4KIAotI2RlZmluZSBSVF9GTF9UT1Mob2xkZmxwNCkgXAotCSgob2xkZmxwNCktPmZsb3dpNF90b3MgJiAoSVBUT1NfUlRfTUFTSyB8IFJUT19PTkxJTkspKQotCiAjZGVmaW5lIERSVl9OQU1FCSJ2cmYiCiAjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjAiCiAKQEAgLTEzNyw2ICsxMzQsMjAgQEAKIH0KIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCitzdGF0aWMgaW50IHZyZl9pcDZfbG9jYWxfb3V0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2sgKnNrLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBlcnI7CisKKwllcnIgPSBuZl9ob29rKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9MT0NBTF9PVVQsIG5ldCwKKwkJICAgICAgc2ssIHNrYiwgTlVMTCwgc2tiX2RzdChza2IpLT5kZXYsIGRzdF9vdXRwdXQpOworCisJaWYgKGxpa2VseShlcnIgPT0gMSkpCisJCWVyciA9IGRzdF9vdXRwdXQobmV0LCBzaywgc2tiKTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBuZXRkZXZfdHhfdCB2cmZfcHJvY2Vzc192Nl9vdXRib3VuZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMTUxLDcgKzE2Miw3IEBACiAJCS5mbG93bGFiZWwgPSBpcDZfZmxvd2luZm8oaXBoKSwKIAkJLmZsb3dpNl9tYXJrID0gc2tiLT5tYXJrLAogCQkuZmxvd2k2X3Byb3RvID0gaXBoLT5uZXh0aGRyLAotCQkuZmxvd2k2X2ZsYWdzID0gRkxPV0lfRkxBR19MM01ERVZfU1JDIHwgRkxPV0lfRkxBR19TS0lQX05IX09JRiwKKwkJLmZsb3dpNl9mbGFncyA9IEZMT1dJX0ZMQUdfU0tJUF9OSF9PSUYsCiAJfTsKIAlpbnQgcmV0ID0gTkVUX1hNSVRfRFJPUDsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CkBAIC0yMDcsNyArMjE4LDcgQEAKIAkvKiBzdHJpcCB0aGUgZXRoZXJuZXQgaGVhZGVyIGFkZGVkIGZvciBwYXNzIHRocm91Z2ggVlJGIGRldmljZSAqLwogCV9fc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSk7CiAKLQlyZXQgPSBpcDZfbG9jYWxfb3V0KG5ldCwgc2tiLT5zaywgc2tiKTsKKwlyZXQgPSB2cmZfaXA2X2xvY2FsX291dChuZXQsIHNrYi0+c2ssIHNrYik7CiAJaWYgKHVubGlrZWx5KG5ldF94bWl0X2V2YWwocmV0KSkpCiAJCWRldi0+c3RhdHMudHhfZXJyb3JzKys7CiAJZWxzZQpAQCAtMjI3LDYgKzIzOCwyMCBAQAogfQogI2VuZGlmCiAKKy8qIGJhc2VkIG9uIGlwX2xvY2FsX291dDsgY2FuJ3QgdXNlIGl0IGIvYyB0aGUgZHN0IGlzIHN3aXRjaGVkIHBvaW50aW5nIHRvIHVzICovCitzdGF0aWMgaW50IHZyZl9pcF9sb2NhbF9vdXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbmZfaG9vayhORlBST1RPX0lQVjQsIE5GX0lORVRfTE9DQUxfT1VULCBuZXQsIHNrLAorCQkgICAgICBza2IsIE5VTEwsIHNrYl9kc3Qoc2tiKS0+ZGV2LCBkc3Rfb3V0cHV0KTsKKwlpZiAobGlrZWx5KGVyciA9PSAxKSkKKwkJZXJyID0gZHN0X291dHB1dChuZXQsIHNrLCBza2IpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIG5ldGRldl90eF90IHZyZl9wcm9jZXNzX3Y0X291dGJvdW5kKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICp2cmZfZGV2KQogewpAQCAtMjM3LDggKzI2Miw3IEBACiAJCS5mbG93aTRfb2lmID0gdnJmX2Rldi0+aWZpbmRleCwKIAkJLmZsb3dpNF9paWYgPSBMT09QQkFDS19JRklOREVYLAogCQkuZmxvd2k0X3RvcyA9IFJUX1RPUyhpcDRoLT50b3MpLAotCQkuZmxvd2k0X2ZsYWdzID0gRkxPV0lfRkxBR19BTllTUkMgfCBGTE9XSV9GTEFHX0wzTURFVl9TUkMgfAotCQkJCUZMT1dJX0ZMQUdfU0tJUF9OSF9PSUYsCisJCS5mbG93aTRfZmxhZ3MgPSBGTE9XSV9GTEFHX0FOWVNSQyB8IEZMT1dJX0ZMQUdfU0tJUF9OSF9PSUYsCiAJCS5kYWRkciA9IGlwNGgtPmRhZGRyLAogCX07CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldCh2cmZfZGV2KTsKQEAgLTI5Miw3ICszMTYsNyBAQAogCQkJCQkgICAgICAgUlRfU0NPUEVfTElOSyk7CiAJfQogCi0JcmV0ID0gaXBfbG9jYWxfb3V0KGRldl9uZXQoc2tiX2RzdChza2IpLT5kZXYpLCBza2ItPnNrLCBza2IpOworCXJldCA9IHZyZl9pcF9sb2NhbF9vdXQoZGV2X25ldChza2JfZHN0KHNrYiktPmRldiksIHNrYi0+c2ssIHNrYik7CiAJaWYgKHVubGlrZWx5KG5ldF94bWl0X2V2YWwocmV0KSkpCiAJCXZyZl9kZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCWVsc2UKQEAgLTM3Nyw2ICs0MDEsNDMgQEAKIAkJCSAgICAhKElQNkNCKHNrYiktPmZsYWdzICYgSVA2U0tCX1JFUk9VVEVEKSk7CiB9CiAKKy8qIHNldCBkc3Qgb24gc2tiIHRvIHNlbmQgcGFja2V0IHRvIHVzIHZpYSBkZXZfeG1pdCBwYXRoLiBBbGxvd3MKKyAqIHBhY2tldCB0byBnbyB0aHJvdWdoIGRldmljZSBiYXNlZCBmZWF0dXJlcyBzdWNoIGFzIHFkaXNjLCBuZXRmaWx0ZXIKKyAqIGhvb2tzIGFuZCBwYWNrZXQgc29ja2V0cyB3aXRoIHNrYi0+ZGV2IHNldCB0byB2cmYgZGV2aWNlLgorICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnZyZl9pcDZfb3V0KHN0cnVjdCBuZXRfZGV2aWNlICp2cmZfZGV2LAorCQkJCSAgIHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfdnJmICp2cmYgPSBuZXRkZXZfcHJpdih2cmZfZGV2KTsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBOVUxMOworCXN0cnVjdCBydDZfaW5mbyAqcnQ2OworCisJLyogZG9uJ3QgZGl2ZXJ0IGxpbmsgc2NvcGUgcGFja2V0cyAqLworCWlmIChydDZfbmVlZF9zdHJpY3QoJmlwdjZfaGRyKHNrYiktPmRhZGRyKSkKKwkJcmV0dXJuIHNrYjsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXJ0NiA9IHJjdV9kZXJlZmVyZW5jZSh2cmYtPnJ0Nik7CisJaWYgKGxpa2VseShydDYpKSB7CisJCWRzdCA9ICZydDYtPmRzdDsKKwkJZHN0X2hvbGQoZHN0KTsKKwl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmICh1bmxpa2VseSghZHN0KSkgeworCQl2cmZfdHhfZXJyb3IodnJmX2Rldiwgc2tiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2tiX2RzdF9kcm9wKHNrYik7CisJc2tiX2RzdF9zZXQoc2tiLCBkc3QpOworCisJcmV0dXJuIHNrYjsKK30KKwogLyogaG9sZGluZyBydG5sICovCiBzdGF0aWMgdm9pZCB2cmZfcnQ2X3JlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF92cmYgKnZyZikKIHsKQEAgLTQ2Myw2ICs1MjQsMTMgQEAKIAlyZXR1cm4gcmM7CiB9CiAjZWxzZQorc3RhdGljIHN0cnVjdCBza19idWZmICp2cmZfaXA2X291dChzdHJ1Y3QgbmV0X2RldmljZSAqdnJmX2RldiwKKwkJCQkgICBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gc2tiOworfQorCiBzdGF0aWMgdm9pZCB2cmZfcnQ2X3JlbGVhc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF92cmYgKnZyZikKIHsKIH0KQEAgLTUzMSw2ICs1OTksNTUgQEAKIAkJCSAgICAhKElQQ0Ioc2tiKS0+ZmxhZ3MgJiBJUFNLQl9SRVJPVVRFRCkpOwogfQogCisvKiBzZXQgZHN0IG9uIHNrYiB0byBzZW5kIHBhY2tldCB0byB1cyB2aWEgZGV2X3htaXQgcGF0aC4gQWxsb3dzCisgKiBwYWNrZXQgdG8gZ28gdGhyb3VnaCBkZXZpY2UgYmFzZWQgZmVhdHVyZXMgc3VjaCBhcyBxZGlzYywgbmV0ZmlsdGVyCisgKiBob29rcyBhbmQgcGFja2V0IHNvY2tldHMgd2l0aCBza2ItPmRldiBzZXQgdG8gdnJmIGRldmljZS4KKyAqLworc3RhdGljIHN0cnVjdCBza19idWZmICp2cmZfaXBfb3V0KHN0cnVjdCBuZXRfZGV2aWNlICp2cmZfZGV2LAorCQkJCSAgc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X3ZyZiAqdnJmID0gbmV0ZGV2X3ByaXYodnJmX2Rldik7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKKwlzdHJ1Y3QgcnRhYmxlICpydGg7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlydGggPSByY3VfZGVyZWZlcmVuY2UodnJmLT5ydGgpOworCWlmIChsaWtlbHkocnRoKSkgeworCQlkc3QgPSAmcnRoLT5kc3Q7CisJCWRzdF9ob2xkKGRzdCk7CisJfQorCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAodW5saWtlbHkoIWRzdCkpIHsKKwkJdnJmX3R4X2Vycm9yKHZyZl9kZXYsIHNrYik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNrYl9kc3RfZHJvcChza2IpOworCXNrYl9kc3Rfc2V0KHNrYiwgZHN0KTsKKworCXJldHVybiBza2I7Cit9CisKKy8qIGNhbGxlZCB3aXRoIHJjdSBsb2NrIGhlbGQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdnJmX2wzX291dChzdHJ1Y3QgbmV0X2RldmljZSAqdnJmX2RldiwKKwkJCQkgIHN0cnVjdCBzb2NrICpzaywKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICB1MTYgcHJvdG8pCit7CisJc3dpdGNoIChwcm90bykgeworCWNhc2UgQUZfSU5FVDoKKwkJcmV0dXJuIHZyZl9pcF9vdXQodnJmX2Rldiwgc2ssIHNrYik7CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIHZyZl9pcDZfb3V0KHZyZl9kZXYsIHNrLCBza2IpOworCX0KKworCXJldHVybiBza2I7Cit9CisKIC8qIGhvbGRpbmcgcnRubCAqLwogc3RhdGljIHZvaWQgdnJmX3J0YWJsZV9yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRfdnJmICp2cmYpCiB7CkBAIC03MjIsNjMgKzgzOSw2IEBACiAJcmV0dXJuIHZyZi0+dGJfaWQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcnRhYmxlICp2cmZfZ2V0X3J0YWJsZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgY29uc3Qgc3RydWN0IGZsb3dpNCAqZmw0KQotewotCXN0cnVjdCBydGFibGUgKnJ0aCA9IE5VTEw7Ci0KLQlpZiAoIShmbDQtPmZsb3dpNF9mbGFncyAmIEZMT1dJX0ZMQUdfTDNNREVWX1NSQykpIHsKLQkJc3RydWN0IG5ldF92cmYgKnZyZiA9IG5ldGRldl9wcml2KGRldik7Ci0KLQkJcmN1X3JlYWRfbG9jaygpOwotCi0JCXJ0aCA9IHJjdV9kZXJlZmVyZW5jZSh2cmYtPnJ0aCk7Ci0JCWlmIChsaWtlbHkocnRoKSkKLQkJCWRzdF9ob2xkKCZydGgtPmRzdCk7Ci0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JfQotCi0JcmV0dXJuIHJ0aDsKLX0KLQotLyogY2FsbGVkIHVuZGVyIHJjdV9yZWFkX2xvY2sgKi8KLXN0YXRpYyBpbnQgdnJmX2dldF9zYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZmxvd2k0ICpmbDQpCi17Ci0Jc3RydWN0IGZpYl9yZXN1bHQgcmVzID0geyAudGNsYXNzaWQgPSAwIH07Ci0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOwotCXUzMiBvcmlnX3RvcyA9IGZsNC0+Zmxvd2k0X3RvczsKLQl1OCBmbGFncyA9IGZsNC0+Zmxvd2k0X2ZsYWdzOwotCXU4IHNjb3BlID0gZmw0LT5mbG93aTRfc2NvcGU7Ci0JdTggdG9zID0gUlRfRkxfVE9TKGZsNCk7Ci0JaW50IHJjOwotCi0JaWYgKHVubGlrZWx5KCFmbDQtPmRhZGRyKSkKLQkJcmV0dXJuIDA7Ci0KLQlmbDQtPmZsb3dpNF9mbGFncyB8PSBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGOwotCWZsNC0+Zmxvd2k0X2lpZiA9IExPT1BCQUNLX0lGSU5ERVg7Ci0JLyogbWFrZSBzdXJlIG9pZiBpcyBzZXQgdG8gVlJGIGRldmljZSBmb3IgbG9va3VwICovCi0JZmw0LT5mbG93aTRfb2lmID0gZGV2LT5pZmluZGV4OwotCWZsNC0+Zmxvd2k0X3RvcyA9IHRvcyAmIElQVE9TX1JUX01BU0s7Ci0JZmw0LT5mbG93aTRfc2NvcGUgPSAoKHRvcyAmIFJUT19PTkxJTkspID8KLQkJCSAgICAgUlRfU0NPUEVfTElOSyA6IFJUX1NDT1BFX1VOSVZFUlNFKTsKLQotCXJjID0gZmliX2xvb2t1cChuZXQsIGZsNCwgJnJlcywgMCk7Ci0JaWYgKCFyYykgewotCQlpZiAocmVzLnR5cGUgPT0gUlROX0xPQ0FMKQotCQkJZmw0LT5zYWRkciA9IHJlcy5maS0+ZmliX3ByZWZzcmMgPyA6IGZsNC0+ZGFkZHI7Ci0JCWVsc2UKLQkJCWZpYl9zZWxlY3RfcGF0aChuZXQsICZyZXMsIGZsNCwgLTEpOwotCX0KLQotCWZsNC0+Zmxvd2k0X2ZsYWdzID0gZmxhZ3M7Ci0JZmw0LT5mbG93aTRfdG9zID0gb3JpZ190b3M7Ci0JZmw0LT5mbG93aTRfc2NvcGUgPSBzY29wZTsKLQotCXJldHVybiByYzsKLX0KLQogc3RhdGljIGludCB2cmZfcmN2X2ZpbmlzaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gMDsKQEAgLTk3MCwxMDYgKzEwMzAsNDQgQEAKIH0KIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi1zdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqdnJmX2dldF9ydDZfZHN0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSBzdHJ1Y3QgZmxvd2k2ICpmbDYpCisvKiBzZW5kIHRvIGxpbmstbG9jYWwgb3IgbXVsdGljYXN0IGFkZHJlc3MgdmlhIGludGVyZmFjZSBlbnNsYXZlZCB0bworICogVlJGIGRldmljZS4gRm9yY2UgbG9va3VwIHRvIFZSRiB0YWJsZSB3aXRob3V0IGNoYW5naW5nIGZsb3cgc3RydWN0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICp2cmZfbGlua19zY29wZV9sb29rdXAoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGZsb3dpNiAqZmw2KQogewotCWJvb2wgbmVlZF9zdHJpY3QgPSBydDZfbmVlZF9zdHJpY3QoJmZsNi0+ZGFkZHIpOwotCXN0cnVjdCBuZXRfdnJmICp2cmYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKwlpbnQgZmxhZ3MgPSBSVDZfTE9PS1VQX0ZfSUZBQ0U7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwogCi0JLyogc2VuZCB0byBsaW5rLWxvY2FsIG9yIG11bHRpY2FzdCBhZGRyZXNzICovCi0JaWYgKG5lZWRfc3RyaWN0KSB7Ci0JCWludCBmbGFncyA9IFJUNl9MT09LVVBfRl9JRkFDRTsKLQotCQkvKiBWUkYgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBsaW5rLWxvY2FsIGFkZHJlc3MgYW5kCi0JCSAqIHNlbmRpbmcgcGFja2V0cyB0byBsaW5rLWxvY2FsIG9yIG1jYXN0IGFkZHJlc3NlcyBvdmVyCi0JCSAqIGEgVlJGIGRldmljZSBkb2VzIG5vdCBtYWtlIHNlbnNlCi0JCSAqLwotCQlpZiAoZmw2LT5mbG93aTZfb2lmID09IGRldi0+aWZpbmRleCkgewotCQkJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gJm5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeS0+ZHN0OwotCi0JCQlkc3RfaG9sZChkc3QpOwotCQkJcmV0dXJuIGRzdDsKLQkJfQotCi0JCWlmICghaXB2Nl9hZGRyX2FueSgmZmw2LT5zYWRkcikpCi0JCQlmbGFncyB8PSBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSOwotCi0JCXJ0ID0gdnJmX2lwNl9yb3V0ZV9sb29rdXAobmV0LCBkZXYsIGZsNiwgZmw2LT5mbG93aTZfb2lmLCBmbGFncyk7Ci0JCWlmIChydCkKLQkJCWRzdCA9ICZydC0+ZHN0OwotCi0JfSBlbHNlIGlmICghKGZsNi0+Zmxvd2k2X2ZsYWdzICYgRkxPV0lfRkxBR19MM01ERVZfU1JDKSkgewotCi0JCXJjdV9yZWFkX2xvY2soKTsKLQotCQlydCA9IHJjdV9kZXJlZmVyZW5jZSh2cmYtPnJ0Nik7Ci0JCWlmIChsaWtlbHkocnQpKSB7Ci0JCQlkc3QgPSAmcnQtPmRzdDsKLQkJCWRzdF9ob2xkKGRzdCk7Ci0JCX0KLQotCQlyY3VfcmVhZF91bmxvY2soKTsKKwkvKiBWUkYgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBsaW5rLWxvY2FsIGFkZHJlc3MgYW5kCisJICogc2VuZGluZyBwYWNrZXRzIHRvIGxpbmstbG9jYWwgb3IgbWNhc3QgYWRkcmVzc2VzIG92ZXIKKwkgKiBhIFZSRiBkZXZpY2UgZG9lcyBub3QgbWFrZSBzZW5zZQorCSAqLworCWlmIChmbDYtPmZsb3dpNl9vaWYgPT0gZGV2LT5pZmluZGV4KSB7CisJCWRzdCA9ICZuZXQtPmlwdjYuaXA2X251bGxfZW50cnktPmRzdDsKKwkJZHN0X2hvbGQoZHN0KTsKKwkJcmV0dXJuIGRzdDsKIAl9CiAKLQkvKiBtYWtlIHN1cmUgb2lmIGlzIHNldCB0byBWUkYgZGV2aWNlIGZvciBsb29rdXAgKi8KLQlpZiAoIW5lZWRfc3RyaWN0KQotCQlmbDYtPmZsb3dpNl9vaWYgPSBkZXYtPmlmaW5kZXg7CisJaWYgKCFpcHY2X2FkZHJfYW55KCZmbDYtPnNhZGRyKSkKKwkJZmxhZ3MgfD0gUlQ2X0xPT0tVUF9GX0hBU19TQUREUjsKKworCXJ0ID0gdnJmX2lwNl9yb3V0ZV9sb29rdXAobmV0LCBkZXYsIGZsNiwgZmw2LT5mbG93aTZfb2lmLCBmbGFncyk7CisJaWYgKHJ0KQorCQlkc3QgPSAmcnQtPmRzdDsKIAogCXJldHVybiBkc3Q7CiB9Ci0KLS8qIGNhbGxlZCB1bmRlciByY3VfcmVhZF9sb2NrICovCi1zdGF0aWMgaW50IHZyZl9nZXRfc2FkZHI2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCSAgc3RydWN0IGZsb3dpNiAqZmw2KQotewotCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKLQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7Ci0Jc3RydWN0IHJ0Nl9pbmZvICpydDsKLQlpbnQgZXJyOwotCi0JaWYgKHJ0Nl9uZWVkX3N0cmljdCgmZmw2LT5kYWRkcikpIHsKLQkJcnQgPSB2cmZfaXA2X3JvdXRlX2xvb2t1cChuZXQsIGRldiwgZmw2LCBmbDYtPmZsb3dpNl9vaWYsCi0JCQkJCSAgUlQ2X0xPT0tVUF9GX0lGQUNFKTsKLQkJaWYgKHVubGlrZWx5KCFydCkpCi0JCQlyZXR1cm4gMDsKLQotCQlkc3QgPSAmcnQtPmRzdDsKLQl9IGVsc2UgewotCQlfX3U4IGZsYWdzID0gZmw2LT5mbG93aTZfZmxhZ3M7Ci0KLQkJZmw2LT5mbG93aTZfZmxhZ3MgfD0gRkxPV0lfRkxBR19MM01ERVZfU1JDOwotCQlmbDYtPmZsb3dpNl9mbGFncyB8PSBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGOwotCi0JCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQobmV0LCBzaywgZmw2KTsKLQkJcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopZHN0OwotCi0JCWZsNi0+Zmxvd2k2X2ZsYWdzID0gZmxhZ3M7Ci0JfQotCi0JZXJyID0gZHN0LT5lcnJvcjsKLQlpZiAoIWVycikgewotCQllcnIgPSBpcDZfcm91dGVfZ2V0X3NhZGRyKG5ldCwgcnQsICZmbDYtPmRhZGRyLAotCQkJCQkgIHNrID8gaW5ldDZfc2soc2spLT5zcmNwcmVmcyA6IDAsCi0JCQkJCSAgJmZsNi0+c2FkZHIpOwotCX0KLQotCWRzdF9yZWxlYXNlKGRzdCk7Ci0KLQlyZXR1cm4gZXJyOwotfQogI2VuZGlmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbDNtZGV2X29wcyB2cmZfbDNtZGV2X29wcyA9IHsKIAkubDNtZGV2X2ZpYl90YWJsZQk9IHZyZl9maWJfdGFibGUsCi0JLmwzbWRldl9nZXRfcnRhYmxlCT0gdnJmX2dldF9ydGFibGUsCi0JLmwzbWRldl9nZXRfc2FkZHIJPSB2cmZfZ2V0X3NhZGRyLAogCS5sM21kZXZfbDNfcmN2CQk9IHZyZl9sM19yY3YsCisJLmwzbWRldl9sM19vdXQJCT0gdnJmX2wzX291dCwKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCS5sM21kZXZfZ2V0X3J0Nl9kc3QJPSB2cmZfZ2V0X3J0Nl9kc3QsCi0JLmwzbWRldl9nZXRfc2FkZHI2CT0gdnJmX2dldF9zYWRkcjYsCisJLmwzbWRldl9saW5rX3Njb3BlX2xvb2t1cCA9IHZyZl9saW5rX3Njb3BlX2xvb2t1cCwKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdnhsYW4uYyBiL2RyaXZlcnMvbmV0L3Z4bGFuLmMKaW5kZXggYzBkZGE2Zi4uZTdkMTY2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdnhsYW4uYworKysgYi9kcml2ZXJzL25ldC92eGxhbi5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgogI2luY2x1ZGUgPG5ldC92eGxhbi5oPgotI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKICNpbmNsdWRlIDxuZXQvaXA2X3R1bm5lbC5oPgpAQCAtMjg4LDcgKzI4Nyw3IEBACiAKIAlpZiAoIW5ldF9lcShkZXZfbmV0KHZ4bGFuLT5kZXYpLCB2eGxhbi0+bmV0KSAmJgogCSAgICBubGFfcHV0X3MzMihza2IsIE5EQV9MSU5LX05FVE5TSUQsCi0JCQlwZWVybmV0MmlkX2FsbG9jKGRldl9uZXQodnhsYW4tPmRldiksIHZ4bGFuLT5uZXQpKSkKKwkJCXBlZXJuZXQyaWQoZGV2X25ldCh2eGxhbi0+ZGV2KSwgdnhsYW4tPm5ldCkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCWlmIChzZW5kX2V0aCAmJiBubGFfcHV0KHNrYiwgTkRBX0xMQUREUiwgRVRIX0FMRU4sICZmZGItPmV0aF9hZGRyKSkKQEAgLTg2MSwyMCArODYwLDIwIEBACiAvKiBEdW1wIGZvcndhcmRpbmcgdGFibGUgKi8KIHN0YXRpYyBpbnQgdnhsYW5fZmRiX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwgaW50IGlkeCkKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsIGludCAqaWR4KQogewogCXN0cnVjdCB2eGxhbl9kZXYgKnZ4bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBpbnQgaDsKKwlpbnQgZXJyID0gMDsKIAogCWZvciAoaCA9IDA7IGggPCBGREJfSEFTSF9TSVpFOyArK2gpIHsKIAkJc3RydWN0IHZ4bGFuX2ZkYiAqZjsKLQkJaW50IGVycjsKIAogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZiwgJnZ4bGFuLT5mZGJfaGVhZFtoXSwgaGxpc3QpIHsKIAkJCXN0cnVjdCB2eGxhbl9yZHN0ICpyZDsKIAogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocmQsICZmLT5yZW1vdGVzLCBsaXN0KSB7Ci0JCQkJaWYgKGlkeCA8IGNiLT5hcmdzWzBdKQorCQkJCWlmICgqaWR4IDwgY2ItPmFyZ3NbMl0pCiAJCQkJCWdvdG8gc2tpcDsKIAogCQkJCWVyciA9IHZ4bGFuX2ZkYl9pbmZvKHNrYiwgdnhsYW4sIGYsCkBAIC04ODIsMTcgKzg4MSwxNSBAQAogCQkJCQkJICAgICBjYi0+bmxoLT5ubG1zZ19zZXEsCiAJCQkJCQkgICAgIFJUTV9ORVdORUlHSCwKIAkJCQkJCSAgICAgTkxNX0ZfTVVMVEksIHJkKTsKLQkJCQlpZiAoZXJyIDwgMCkgewotCQkJCQljYi0+YXJnc1sxXSA9IGVycjsKKwkJCQlpZiAoZXJyIDwgMCkKIAkJCQkJZ290byBvdXQ7Ci0JCQkJfQogc2tpcDoKLQkJCQkrK2lkeDsKKwkJCQkqaWR4ICs9IDE7CiAJCQl9CiAJCX0KIAl9CiBvdXQ6Ci0JcmV0dXJuIGlkeDsKKwlyZXR1cm4gZXJyOwogfQogCiAvKiBXYXRjaCBpbmNvbWluZyBwYWNrZXRzIHRvIGxlYXJuIG1hcHBpbmcgYmV0d2VlbiBFdGhlcm5ldCBhZGRyZXNzCkBAIC0xMjk0LDcgKzEyOTEsNyBAQAogCQlzdHJ1Y3QgbWV0YWRhdGFfZHN0ICp0dW5fZHN0OwogCiAJCXR1bl9kc3QgPSB1ZHBfdHVuX3J4X2RzdChza2IsIHZ4bGFuX2dldF9za19mYW1pbHkodnMpLCBUVU5ORUxfS0VZLAotCQkJCQkgdnhsYW5fdm5pX3RvX3R1bl9pZCh2bmkpLCBzaXplb2YoKm1kKSk7CisJCQkJCSBrZXkzMl90b190dW5uZWxfaWQodm5pKSwgc2l6ZW9mKCptZCkpOwogCiAJCWlmICghdHVuX2RzdCkKIAkJCWdvdG8gZHJvcDsKQEAgLTE5NDgsNyArMTk0NSw3IEBACiAJCQlnb3RvIGRyb3A7CiAJCX0KIAkJZHN0X3BvcnQgPSBpbmZvLT5rZXkudHBfZHN0ID8gOiB2eGxhbi0+Y2ZnLmRzdF9wb3J0OwotCQl2bmkgPSB2eGxhbl90dW5faWRfdG9fdm5pKGluZm8tPmtleS50dW5faWQpOworCQl2bmkgPSB0dW5uZWxfaWRfdG9fa2V5MzIoaW5mby0+a2V5LnR1bl9pZCk7CiAJCXJlbW90ZV9pcC5zYS5zYV9mYW1pbHkgPSBpcF90dW5uZWxfaW5mb19hZihpbmZvKTsKIAkJaWYgKHJlbW90ZV9pcC5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgewogCQkJcmVtb3RlX2lwLnNpbi5zaW5fYWRkci5zX2FkZHIgPSBpbmZvLT5rZXkudS5pcHY0LmRzdDsKQEAgLTIxMDYsNiArMjEwMyw3IEBACiAJCQkJICAgICAgdm5pLCBtZCwgZmxhZ3MsIHVkcF9zdW0pOwogCQlpZiAoZXJyIDwgMCkgewogCQkJZHN0X3JlbGVhc2UobmRzdCk7CisJCQlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCQkJcmV0dXJuOwogCQl9CiAJCXVkcF90dW5uZWw2X3htaXRfc2tiKG5kc3QsIHNrLCBza2IsIGRldiwKQEAgLTI3ODIsMTQgKzI3ODAsMTUgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbG93ZXJkZXYgPSBOVUxMOwogCiAJaWYgKGNvbmYtPmZsYWdzICYgVlhMQU5fRl9HUEUpIHsKLQkJaWYgKGNvbmYtPmZsYWdzICYgflZYTEFOX0ZfQUxMT1dFRF9HUEUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKIAkJLyogRm9yIG5vdywgYWxsb3cgR1BFIG9ubHkgdG9nZXRoZXIgd2l0aCBDT0xMRUNUX01FVEFEQVRBLgogCQkgKiBUaGlzIGNhbiBiZSByZWxheGVkIGxhdGVyOyBpbiBzdWNoIGNhc2UsIHRoZSBvdGhlciBzaWRlCiAJCSAqIG9mIHRoZSBQdFAgbGluayB3aWxsIGhhdmUgdG8gYmUgcHJvdmlkZWQuCiAJCSAqLwotCQlpZiAoIShjb25mLT5mbGFncyAmIFZYTEFOX0ZfQ09MTEVDVF9NRVRBREFUQSkpCisJCWlmICgoY29uZi0+ZmxhZ3MgJiB+VlhMQU5fRl9BTExPV0VEX0dQRSkgfHwKKwkJICAgICEoY29uZi0+ZmxhZ3MgJiBWWExBTl9GX0NPTExFQ1RfTUVUQURBVEEpKSB7CisJCQlwcl9pbmZvKCJ1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBleHRlbnNpb25zXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOworCQl9CiAKIAkJdnhsYW5fcmF3X3NldHVwKGRldik7CiAJfSBlbHNlIHsKQEAgLTI4NDIsNiArMjg0MSw5IEBACiAJCQlkZXYtPm10dSA9IGxvd2VyZGV2LT5tdHUgLSAodXNlX2lwdjYgPyBWWExBTjZfSEVBRFJPT00gOiBWWExBTl9IRUFEUk9PTSk7CiAKIAkJbmVlZGVkX2hlYWRyb29tID0gbG93ZXJkZXYtPmhhcmRfaGVhZGVyX2xlbjsKKwl9IGVsc2UgaWYgKHZ4bGFuX2FkZHJfbXVsdGljYXN0KCZkc3QtPnJlbW90ZV9pcCkpIHsKKwkJcHJfaW5mbygibXVsdGljYXN0IGRlc3RpbmF0aW9uIHJlcXVpcmVzIGludGVyZmFjZSB0byBiZSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoY29uZi0+bXR1KSB7CkBAIC0yODc0LDggKzI4NzYsMTAgQEAKIAkJICAgICB0bXAtPmNmZy5zYWRkci5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpID09IHVzZV9pcHY2ICYmCiAJCSAgICB0bXAtPmNmZy5kc3RfcG9ydCA9PSB2eGxhbi0+Y2ZnLmRzdF9wb3J0ICYmCiAJCSAgICAodG1wLT5mbGFncyAmIFZYTEFOX0ZfUkNWX0ZMQUdTKSA9PQotCQkgICAgKHZ4bGFuLT5mbGFncyAmIFZYTEFOX0ZfUkNWX0ZMQUdTKSkKLQkJcmV0dXJuIC1FRVhJU1Q7CisJCSAgICAodnhsYW4tPmZsYWdzICYgVlhMQU5fRl9SQ1ZfRkxBR1MpKSB7CisJCQlwcl9pbmZvKCJkdXBsaWNhdGUgVk5JICV1XG4iLCBiZTMyX3RvX2NwdShjb25mLT52bmkpKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CiAJfQogCiAJZGV2LT5ldGh0b29sX29wcyA9ICZ2eGxhbl9ldGh0b29sX29wczsKQEAgLTI5MDksNyArMjkxMyw2IEBACiAJCQkgc3RydWN0IG5sYXR0ciAqdGJbXSwgc3RydWN0IG5sYXR0ciAqZGF0YVtdKQogewogCXN0cnVjdCB2eGxhbl9jb25maWcgY29uZjsKLQlpbnQgZXJyOwogCiAJbWVtc2V0KCZjb25mLCAwLCBzaXplb2YoY29uZikpOwogCkBAIC0zMDE4LDI2ICszMDIxLDcgQEAKIAlpZiAodGJbSUZMQV9NVFVdKQogCQljb25mLm10dSA9IG5sYV9nZXRfdTMyKHRiW0lGTEFfTVRVXSk7CiAKLQllcnIgPSB2eGxhbl9kZXZfY29uZmlndXJlKHNyY19uZXQsIGRldiwgJmNvbmYpOwotCXN3aXRjaCAoZXJyKSB7Ci0JY2FzZSAtRU5PREVWOgotCQlwcl9pbmZvKCJpZmluZGV4ICVkIGRvZXMgbm90IGV4aXN0XG4iLCBjb25mLnJlbW90ZV9pZmluZGV4KTsKLQkJYnJlYWs7Ci0KLQljYXNlIC1FUEVSTToKLQkJcHJfaW5mbygiSVB2NiBpcyBkaXNhYmxlZCB2aWEgc3lzY3RsXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIC1FRVhJU1Q6Ci0JCXByX2luZm8oImR1cGxpY2F0ZSBWTkkgJXVcbiIsIGJlMzJfdG9fY3B1KGNvbmYudm5pKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSAtRUlOVkFMOgotCQlwcl9pbmZvKCJ1bnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBleHRlbnNpb25zXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gdnhsYW5fZGV2X2NvbmZpZ3VyZShzcmNfbmV0LCBkZXYsICZjb25mKTsKIH0KIAogc3RhdGljIHZvaWQgdnhsYW5fZGVsbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2ZzbF91Y2NfaGRsYy5jIGIvZHJpdmVycy9uZXQvd2FuL2ZzbF91Y2NfaGRsYy5jCmluZGV4IDZmMDQ0NDUuLjVmYmY4M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9mc2xfdWNjX2hkbGMuYworKysgYi9kcml2ZXJzL25ldC93YW4vZnNsX3VjY19oZGxjLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCQkJCUFMSUdOTUVOVF9PRl9VQ0NfSERMQ19QUkFNKTsKIAogCWlmIChwcml2LT51Y2NfcHJhbV9vZmZzZXQgPCAwKSB7Ci0JCWRldl9lcnIocHJpdi0+ZGV2LCAiQ2FuIG5vdCBhbGxvY2F0ZSBNVVJBTSBmb3IgaGRsYyBwcmFtZXRlci5cbiIpOworCQlkZXZfZXJyKHByaXYtPmRldiwgIkNhbiBub3QgYWxsb2NhdGUgTVVSQU0gZm9yIGhkbGMgcGFyYW1ldGVyLlxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZnJlZV90eF9iZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2JuaS5jIGIvZHJpdmVycy9uZXQvd2FuL3NibmkuYwppbmRleCBkOThjN2U1Li4zYTQyMWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vc2JuaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMKQEAgLTU4Miw4ICs1ODIsOCBAQAogCiAKIC8qCi0gKiBSb3V0aW5lIHJldHVybnMgMSBpZiBpdCBuZWVkIHRvIGFja25vd2VsZWRnZSByZWNlaXZlZCBmcmFtZS4KLSAqIEVtcHR5IGZyYW1lIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3JzIHdvbid0IGJlIGFja25vd2VsZWRnZWQuCisgKiBSb3V0aW5lIHJldHVybnMgMSBpZiBpdCBuZWVkcyB0byBhY2tub3dsZWRnZSByZWNlaXZlZCBmcmFtZS4KKyAqIEVtcHR5IGZyYW1lIHJlY2VpdmVkIHdpdGhvdXQgZXJyb3JzIHdvbid0IGJlIGFja25vd2xlZGdlZC4KICAqLwogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLW5vdGlmLmMgYi9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLW5vdGlmLmMKaW5kZXggZmMxMzU1ZC4uNWQ0MjlmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi1ub3RpZi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2Itbm90aWYuYwpAQCAtMjA2LDcgKzIwNiw2IEBACiAJaTI0MDBtdS0+bm90aWZfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWkyNDAwbXUtPm5vdGlmX3VyYikgewogCQlyZXQgPSAtRU5PTUVNOwotCQlkZXZfZXJyKGRldiwgIm5vdGlmaWNhdGlvbjogY2Fubm90IGFsbG9jYXRlIFVSQlxuIik7CiAJCWdvdG8gZXJyb3JfYWxsb2NfdXJiOwogCX0KIAllcGQgPSB1c2JfZ2V0X2VwZChpMjQwMG11LT51c2JfaWZhY2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI1NTIzL2FyNTUyMy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyNTUyMy9hcjU1MjMuYwppbmRleCA4YWRlZDI0Li43YTYwZDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI1NTIzL2FyNTUyMy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjU1MjMvYXI1NTIzLmMKQEAgLTcwNiwxMCArNzA2LDggQEAKIAogCQlkYXRhLT5hciA9IGFyOwogCQlkYXRhLT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIWRhdGEtPnVyYikgewotCQkJYXI1NTIzX2VycihhciwgImNvdWxkIG5vdCBhbGxvY2F0ZSByeCBkYXRhIHVyYlxuIik7CisJCWlmICghZGF0YS0+dXJiKQogCQkJZ290byBlcnI7Ci0JCX0KIAkJbGlzdF9hZGRfdGFpbCgmZGF0YS0+bGlzdCwgJmFyLT5yeF9kYXRhX2ZyZWUpOwogCQlhdG9taWNfaW5jKCZhci0+cnhfZGF0YV9mcmVlX2NudCk7CiAJfQpAQCAtODI0LDcgKzgyMiw2IEBACiAKIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWFyNTUyM19lcnIoYXIsICJGYWlsZWQgdG8gYWxsb2NhdGUgVFggdXJiXG4iKTsKIAkJCWllZWU4MDIxMV9mcmVlX3R4c2tiKGFyLT5odywgc2tiKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC05NDksMTAgKzk0Niw4IEBACiAJaW5pdF9jb21wbGV0aW9uKCZjbWQtPmRvbmUpOwogCiAJY21kLT51cmJfdHggPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghY21kLT51cmJfdHgpIHsKLQkJYXI1NTIzX2VycihhciwgImNvdWxkIG5vdCBhbGxvY2F0ZSB1cmJcbiIpOworCWlmICghY21kLT51cmJfdHgpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAljbWQtPmJ1Zl90eCA9IHVzYl9hbGxvY19jb2hlcmVudChhci0+ZGV2LCBBUjU1MjNfTUFYX1RYQ01EU1osCiAJCQkJCSBHRlBfS0VSTkVMLAogCQkJCQkgJmNtZC0+dXJiX3R4LT50cmFuc2Zlcl9kbWEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9haGIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvYWhiLmMKaW5kZXggYWNlYzE2Yi4uNzY2YzYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9haGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2FoYi5jCkBAIC05MSw1OSArOTEsMzcgQEAKIHsKIAlzdHJ1Y3QgYXRoMTBrX2FoYiAqYXJfYWhiID0gYXRoMTBrX2FoYl9wcml2KGFyKTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IHJldDsKIAogCWRldiA9ICZhcl9haGItPnBkZXYtPmRldjsKIAotCWFyX2FoYi0+Y21kX2NsayA9IGNsa19nZXQoZGV2LCAid2lmaV93Y3NzX2NtZCIpOworCWFyX2FoYi0+Y21kX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJ3aWZpX3djc3NfY21kIik7CiAJaWYgKElTX0VSUl9PUl9OVUxMKGFyX2FoYi0+Y21kX2NsaykpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBnZXQgY21kIGNsazogJWxkXG4iLAogCQkJICAgUFRSX0VSUihhcl9haGItPmNtZF9jbGspKTsKLQkJcmV0ID0gYXJfYWhiLT5jbWRfY2xrID8gUFRSX0VSUihhcl9haGItPmNtZF9jbGspIDogLUVOT0RFVjsKLQkJZ290byBvdXQ7CisJCXJldHVybiBhcl9haGItPmNtZF9jbGsgPyBQVFJfRVJSKGFyX2FoYi0+Y21kX2NsaykgOiAtRU5PREVWOwogCX0KIAotCWFyX2FoYi0+cmVmX2NsayA9IGNsa19nZXQoZGV2LCAid2lmaV93Y3NzX3JlZiIpOworCWFyX2FoYi0+cmVmX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJ3aWZpX3djc3NfcmVmIik7CiAJaWYgKElTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cmVmX2NsaykpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBnZXQgcmVmIGNsazogJWxkXG4iLAogCQkJICAgUFRSX0VSUihhcl9haGItPnJlZl9jbGspKTsKLQkJcmV0ID0gYXJfYWhiLT5yZWZfY2xrID8gUFRSX0VSUihhcl9haGItPnJlZl9jbGspIDogLUVOT0RFVjsKLQkJZ290byBlcnJfY21kX2Nsa19wdXQ7CisJCXJldHVybiBhcl9haGItPnJlZl9jbGsgPyBQVFJfRVJSKGFyX2FoYi0+cmVmX2NsaykgOiAtRU5PREVWOwogCX0KIAotCWFyX2FoYi0+cnRjX2NsayA9IGNsa19nZXQoZGV2LCAid2lmaV93Y3NzX3J0YyIpOworCWFyX2FoYi0+cnRjX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJ3aWZpX3djc3NfcnRjIik7CiAJaWYgKElTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cnRjX2NsaykpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBnZXQgcnRjIGNsazogJWxkXG4iLAogCQkJICAgUFRSX0VSUihhcl9haGItPnJ0Y19jbGspKTsKLQkJcmV0ID0gYXJfYWhiLT5ydGNfY2xrID8gUFRSX0VSUihhcl9haGItPnJ0Y19jbGspIDogLUVOT0RFVjsKLQkJZ290byBlcnJfcmVmX2Nsa19wdXQ7CisJCXJldHVybiBhcl9haGItPnJ0Y19jbGsgPyBQVFJfRVJSKGFyX2FoYi0+cnRjX2NsaykgOiAtRU5PREVWOwogCX0KIAogCXJldHVybiAwOwotCi1lcnJfcmVmX2Nsa19wdXQ6Ci0JY2xrX3B1dChhcl9haGItPnJlZl9jbGspOwotCi1lcnJfY21kX2Nsa19wdXQ6Ci0JY2xrX3B1dChhcl9haGItPmNtZF9jbGspOwotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgYXRoMTBrX2FoYl9jbG9ja19kZWluaXQoc3RydWN0IGF0aDEwayAqYXIpCiB7CiAJc3RydWN0IGF0aDEwa19haGIgKmFyX2FoYiA9IGF0aDEwa19haGJfcHJpdihhcik7CiAKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGFyX2FoYi0+Y21kX2NsaykpCi0JCWNsa19wdXQoYXJfYWhiLT5jbWRfY2xrKTsKLQotCWlmICghSVNfRVJSX09SX05VTEwoYXJfYWhiLT5yZWZfY2xrKSkKLQkJY2xrX3B1dChhcl9haGItPnJlZl9jbGspOwotCi0JaWYgKCFJU19FUlJfT1JfTlVMTChhcl9haGItPnJ0Y19jbGspKQotCQljbGtfcHV0KGFyX2FoYi0+cnRjX2Nsayk7Ci0KIAlhcl9haGItPmNtZF9jbGsgPSBOVUxMOwogCWFyX2FoYi0+cmVmX2NsayA9IE5VTEw7CiAJYXJfYWhiLT5ydGNfY2xrID0gTlVMTDsKQEAgLTIxMyw5MiArMTkxLDUxIEBACiB7CiAJc3RydWN0IGF0aDEwa19haGIgKmFyX2FoYiA9IGF0aDEwa19haGJfcHJpdihhcik7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCWludCByZXQ7CiAKIAlkZXYgPSAmYXJfYWhiLT5wZGV2LT5kZXY7CiAKLQlhcl9haGItPmNvcmVfY29sZF9yc3QgPSByZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX2NvcmVfY29sZCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChhcl9haGItPmNvcmVfY29sZF9yc3QpKSB7CisJYXJfYWhiLT5jb3JlX2NvbGRfcnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX2NvcmVfY29sZCIpOworCWlmIChJU19FUlIoYXJfYWhiLT5jb3JlX2NvbGRfcnN0KSkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGdldCBjb3JlIGNvbGQgcnN0IGN0cmw6ICVsZFxuIiwKIAkJCSAgIFBUUl9FUlIoYXJfYWhiLT5jb3JlX2NvbGRfcnN0KSk7Ci0JCXJldCA9IGFyX2FoYi0+Y29yZV9jb2xkX3JzdCA/Ci0JCQlQVFJfRVJSKGFyX2FoYi0+Y29yZV9jb2xkX3JzdCkgOiAtRU5PREVWOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIFBUUl9FUlIoYXJfYWhiLT5jb3JlX2NvbGRfcnN0KTsKIAl9CiAKLQlhcl9haGItPnJhZGlvX2NvbGRfcnN0ID0gcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9yYWRpb19jb2xkIik7Ci0JaWYgKElTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cmFkaW9fY29sZF9yc3QpKSB7CisJYXJfYWhiLT5yYWRpb19jb2xkX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9yYWRpb19jb2xkIik7CisJaWYgKElTX0VSUihhcl9haGItPnJhZGlvX2NvbGRfcnN0KSkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGdldCByYWRpbyBjb2xkIHJzdCBjdHJsOiAlbGRcbiIsCiAJCQkgICBQVFJfRVJSKGFyX2FoYi0+cmFkaW9fY29sZF9yc3QpKTsKLQkJcmV0ID0gYXJfYWhiLT5yYWRpb19jb2xkX3JzdCA/Ci0JCQlQVFJfRVJSKGFyX2FoYi0+cmFkaW9fY29sZF9yc3QpIDogLUVOT0RFVjsKLQkJZ290byBlcnJfY29yZV9jb2xkX3JzdF9wdXQ7CisJCXJldHVybiBQVFJfRVJSKGFyX2FoYi0+cmFkaW9fY29sZF9yc3QpOwogCX0KIAotCWFyX2FoYi0+cmFkaW9fd2FybV9yc3QgPSByZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX3JhZGlvX3dhcm0iKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoYXJfYWhiLT5yYWRpb193YXJtX3JzdCkpIHsKKwlhcl9haGItPnJhZGlvX3dhcm1fcnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX3JhZGlvX3dhcm0iKTsKKwlpZiAoSVNfRVJSKGFyX2FoYi0+cmFkaW9fd2FybV9yc3QpKSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gZ2V0IHJhZGlvIHdhcm0gcnN0IGN0cmw6ICVsZFxuIiwKIAkJCSAgIFBUUl9FUlIoYXJfYWhiLT5yYWRpb193YXJtX3JzdCkpOwotCQlyZXQgPSBhcl9haGItPnJhZGlvX3dhcm1fcnN0ID8KLQkJCVBUUl9FUlIoYXJfYWhiLT5yYWRpb193YXJtX3JzdCkgOiAtRU5PREVWOwotCQlnb3RvIGVycl9yYWRpb19jb2xkX3JzdF9wdXQ7CisJCXJldHVybiBQVFJfRVJSKGFyX2FoYi0+cmFkaW9fd2FybV9yc3QpOwogCX0KIAotCWFyX2FoYi0+cmFkaW9fc3JpZl9yc3QgPSByZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX3JhZGlvX3NyaWYiKTsKLQlpZiAoSVNfRVJSX09SX05VTEwoYXJfYWhiLT5yYWRpb19zcmlmX3JzdCkpIHsKKwlhcl9haGItPnJhZGlvX3NyaWZfcnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChkZXYsICJ3aWZpX3JhZGlvX3NyaWYiKTsKKwlpZiAoSVNfRVJSKGFyX2FoYi0+cmFkaW9fc3JpZl9yc3QpKSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gZ2V0IHJhZGlvIHNyaWYgcnN0IGN0cmw6ICVsZFxuIiwKIAkJCSAgIFBUUl9FUlIoYXJfYWhiLT5yYWRpb19zcmlmX3JzdCkpOwotCQlyZXQgPSBhcl9haGItPnJhZGlvX3NyaWZfcnN0ID8KLQkJCVBUUl9FUlIoYXJfYWhiLT5yYWRpb19zcmlmX3JzdCkgOiAtRU5PREVWOwotCQlnb3RvIGVycl9yYWRpb193YXJtX3JzdF9wdXQ7CisJCXJldHVybiBQVFJfRVJSKGFyX2FoYi0+cmFkaW9fc3JpZl9yc3QpOwogCX0KIAotCWFyX2FoYi0+Y3B1X2luaXRfcnN0ID0gcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9jcHVfaW5pdCIpOwotCWlmIChJU19FUlJfT1JfTlVMTChhcl9haGItPmNwdV9pbml0X3JzdCkpIHsKKwlhcl9haGItPmNwdV9pbml0X3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAid2lmaV9jcHVfaW5pdCIpOworCWlmIChJU19FUlIoYXJfYWhiLT5jcHVfaW5pdF9yc3QpKSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gZ2V0IGNwdSBpbml0IHJzdCBjdHJsOiAlbGRcbiIsCiAJCQkgICBQVFJfRVJSKGFyX2FoYi0+Y3B1X2luaXRfcnN0KSk7Ci0JCXJldCA9IGFyX2FoYi0+Y3B1X2luaXRfcnN0ID8KLQkJCVBUUl9FUlIoYXJfYWhiLT5jcHVfaW5pdF9yc3QpIDogLUVOT0RFVjsKLQkJZ290byBlcnJfcmFkaW9fc3JpZl9yc3RfcHV0OworCQlyZXR1cm4gUFRSX0VSUihhcl9haGItPmNwdV9pbml0X3JzdCk7CiAJfQogCiAJcmV0dXJuIDA7Ci0KLWVycl9yYWRpb19zcmlmX3JzdF9wdXQ6Ci0JcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5yYWRpb19zcmlmX3JzdCk7Ci0KLWVycl9yYWRpb193YXJtX3JzdF9wdXQ6Ci0JcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5yYWRpb193YXJtX3JzdCk7Ci0KLWVycl9yYWRpb19jb2xkX3JzdF9wdXQ6Ci0JcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5yYWRpb19jb2xkX3JzdCk7Ci0KLWVycl9jb3JlX2NvbGRfcnN0X3B1dDoKLQlyZXNldF9jb250cm9sX3B1dChhcl9haGItPmNvcmVfY29sZF9yc3QpOwotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgYXRoMTBrX2FoYl9yc3RfY3RybF9kZWluaXQoc3RydWN0IGF0aDEwayAqYXIpCiB7CiAJc3RydWN0IGF0aDEwa19haGIgKmFyX2FoYiA9IGF0aDEwa19haGJfcHJpdihhcik7CiAKLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGFyX2FoYi0+Y29yZV9jb2xkX3JzdCkpCi0JCXJlc2V0X2NvbnRyb2xfcHV0KGFyX2FoYi0+Y29yZV9jb2xkX3JzdCk7Ci0KLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGFyX2FoYi0+cmFkaW9fY29sZF9yc3QpKQotCQlyZXNldF9jb250cm9sX3B1dChhcl9haGItPnJhZGlvX2NvbGRfcnN0KTsKLQotCWlmICghSVNfRVJSX09SX05VTEwoYXJfYWhiLT5yYWRpb193YXJtX3JzdCkpCi0JCXJlc2V0X2NvbnRyb2xfcHV0KGFyX2FoYi0+cmFkaW9fd2FybV9yc3QpOwotCi0JaWYgKCFJU19FUlJfT1JfTlVMTChhcl9haGItPnJhZGlvX3NyaWZfcnN0KSkKLQkJcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5yYWRpb19zcmlmX3JzdCk7Ci0KLQlpZiAoIUlTX0VSUl9PUl9OVUxMKGFyX2FoYi0+Y3B1X2luaXRfcnN0KSkKLQkJcmVzZXRfY29udHJvbF9wdXQoYXJfYWhiLT5jcHVfaW5pdF9yc3QpOwotCiAJYXJfYWhiLT5jb3JlX2NvbGRfcnN0ID0gTlVMTDsKIAlhcl9haGItPnJhZGlvX2NvbGRfcnN0ID0gTlVMTDsKIAlhcl9haGItPnJhZGlvX3dhcm1fcnN0ID0gTlVMTDsKQEAgLTQ2MiwxMyArMzk5LDEzIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgYXRoMTBrX2FoYl9pbnRlcnJ1cHRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGF0aDEwayAqYXIgPSBhcmc7Ci0Jc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7CiAKIAlpZiAoIWF0aDEwa19wY2lfaXJxX3BlbmRpbmcoYXIpKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlhdGgxMGtfcGNpX2Rpc2FibGVfYW5kX2NsZWFyX2xlZ2FjeV9pcnEoYXIpOwotCXRhc2tsZXRfc2NoZWR1bGUoJmFyX3BjaS0+aW50cl90cSk7CisJYXRoMTBrX3BjaV9pcnFfbXNpX2Z3X21hc2soYXIpOworCW5hcGlfc2NoZWR1bGUoJmFyLT5uYXBpKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTU3MiwxMiArNTA5LDEzIEBACiAJYXJfYWhiLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAibGVnYWN5Iik7CiAJaWYgKGFyX2FoYi0+aXJxIDwgMCkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGdldCBpcnEgbnVtYmVyOiAlZFxuIiwgYXJfYWhiLT5pcnEpOworCQlyZXQgPSBhcl9haGItPmlycTsKIAkJZ290byBlcnJfY2xvY2tfZGVpbml0OwogCX0KIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwgImlycTogJWRcbiIsIGFyX2FoYi0+aXJxKTsKIAotCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwgIm1lbTogMHglcCBtZW1fbGVuOiAlbHUgZ2NjIG1lbTogMHglcCB0Y3NyX21lbTogMHglcFxuIiwKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JPT1QsICJtZW06IDB4JXBLIG1lbV9sZW46ICVsdSBnY2MgbWVtOiAweCVwSyB0Y3NyX21lbTogMHglcEtcbiIsCiAJCSAgIGFyX2FoYi0+bWVtLCBhcl9haGItPm1lbV9sZW4sCiAJCSAgIGFyX2FoYi0+Z2NjX21lbSwgYXJfYWhiLT50Y3NyX21lbSk7CiAJcmV0dXJuIDA7CkBAIC03MTcsNiArNjU1LDkgQEAKIAlzeW5jaHJvbml6ZV9pcnEoYXJfYWhiLT5pcnEpOwogCiAJYXRoMTBrX3BjaV9mbHVzaChhcik7CisKKwluYXBpX3N5bmNocm9uaXplKCZhci0+bmFwaSk7CisJbmFwaV9kaXNhYmxlKCZhci0+bmFwaSk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoMTBrX2FoYl9oaWZfcG93ZXJfdXAoc3RydWN0IGF0aDEwayAqYXIpCkBAIC03NDgsNiArNjg5LDcgQEAKIAkJYXRoMTBrX2VycihhciwgImNvdWxkIG5vdCB3YWtlIHVwIHRhcmdldCBDUFU6ICVkXG4iLCByZXQpOwogCQlnb3RvIGVycl9jZV9kZWluaXQ7CiAJfQorCW5hcGlfZW5hYmxlKCZhci0+bmFwaSk7CiAKIAlyZXR1cm4gMDsKIApAQCAtODMxLDcgKzc3Myw3IEBACiAJCWdvdG8gZXJyX3Jlc291cmNlX2RlaW5pdDsKIAl9CiAKLQlhdGgxMGtfcGNpX2luaXRfaXJxX3Rhc2tsZXRzKGFyKTsKKwlhdGgxMGtfcGNpX2luaXRfbmFwaShhcik7CiAKIAlyZXQgPSBhdGgxMGtfYWhiX3JlcXVlc3RfaXJxX2xlZ2FjeShhcik7CiAJaWYgKHJldCkKQEAgLTg0Niw2ICs3ODgsNyBAQAogCWNoaXBfaWQgPSBhdGgxMGtfYWhiX3NvY19yZWFkMzIoYXIsIFNPQ19DSElQX0lEX0FERFJFU1MpOwogCWlmIChjaGlwX2lkID09IDB4ZmZmZmZmZmYpIHsKIAkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBnZXQgY2hpcCBpZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX2hhbHRfZGV2aWNlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ibWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvYm1pLmMKaW5kZXggM2QyOWIwOC4uMjg3MmQzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ibWkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2JtaS5jCkBAIC0yMjEsNyArMjIxLDcgQEAKIAl1MzIgdHhsZW47CiAJaW50IHJldDsKIAotCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk1JLCAiYm1pIGx6IGRhdGEgYnVmZmVyIDB4JXAgbGVuZ3RoICVkXG4iLAorCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk1JLCAiYm1pIGx6IGRhdGEgYnVmZmVyIDB4JXBLIGxlbmd0aCAlZFxuIiwKIAkJICAgYnVmZmVyLCBsZW5ndGgpOwogCiAJaWYgKGFyLT5ibWkuZG9uZV9zZW50KSB7CkBAIC0yODcsNyArMjg3LDcgQEAKIAlpbnQgcmV0OwogCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19CTUksCi0JCSAgICJibWkgZmFzdCBkb3dubG9hZCBhZGRyZXNzIDB4JXggYnVmZmVyIDB4JXAgbGVuZ3RoICVkXG4iLAorCQkgICAiYm1pIGZhc3QgZG93bmxvYWQgYWRkcmVzcyAweCV4IGJ1ZmZlciAweCVwSyBsZW5ndGggJWRcbiIsCiAJCSAgIGFkZHJlc3MsIGJ1ZmZlciwgbGVuZ3RoKTsKIAogCXJldCA9IGF0aDEwa19ibWlfbHpfc3RyZWFtX3N0YXJ0KGFyLCBhZGRyZXNzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY2UuYwppbmRleCA5ZmI4ZDc0Li4wYjRkNzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jZS5jCkBAIC0zOSw3ICszOSw3IEBACiAgKiBjaG9vc2VzIHdoYXQgdG8gc2VuZCAoYnVmZmVyIGFkZHJlc3MsIGxlbmd0aCkuIFRoZSBkZXN0aW5hdGlvbgogICogc2lkZSBrZWVwcyBhIHN1cHBseSBvZiAiYW5vbnltb3VzIHJlY2VpdmUgYnVmZmVycyIgYXZhaWxhYmxlIGFuZAogICogaXQgaGFuZGxlcyBpbmNvbWluZyBkYXRhIGFzIGl0IGFycml2ZXMgKHdoZW4gdGhlIGRlc3RpbmF0aW9uCi0gKiByZWNpZXZlcyBhbiBpbnRlcnJ1cHQpLgorICogcmVjZWl2ZXMgYW4gaW50ZXJydXB0KS4KICAqCiAgKiBUaGUgc2VuZGVyIG1heSBzZW5kIGEgc2ltcGxlIGJ1ZmZlciAoYWRkcmVzcy9sZW5ndGgpIG9yIGl0IG1heQogICogc2VuZCBhIHNtYWxsIGxpc3Qgb2YgYnVmZmVycy4gIFdoZW4gYSBzbWFsbCBsaXN0IGlzIHNlbnQsIGhhcmR3YXJlCkBAIC00MzMsNiArNDMzLDEzIEBACiAJdW5zaWduZWQgaW50IG5lbnRyaWVzX21hc2sgPSBkZXN0X3JpbmctPm5lbnRyaWVzX21hc2s7CiAJdW5zaWduZWQgaW50IHdyaXRlX2luZGV4ID0gZGVzdF9yaW5nLT53cml0ZV9pbmRleDsKIAl1MzIgY3RybF9hZGRyID0gcGlwZS0+Y3RybF9hZGRyOworCXUzMiBjdXJfd3JpdGVfaWR4ID0gYXRoMTBrX2NlX2Rlc3RfcmluZ193cml0ZV9pbmRleF9nZXQoYXIsIGN0cmxfYWRkcik7CisKKwkvKiBQcmV2ZW50IENFIHJpbmcgc3R1Y2sgaXNzdWUgdGhhdCB3aWxsIG9jY3VyIHdoZW4gcmluZyBpcyBmdWxsLgorCSAqIE1ha2Ugc3VyZSB0aGF0IHdyaXRlIGluZGV4IGlzIDEgbGVzcyB0aGFuIHJlYWQgaW5kZXguCisJICovCisJaWYgKChjdXJfd3JpdGVfaWR4ICsgbmVudHJpZXMpICA9PSBkZXN0X3JpbmctPnN3X2luZGV4KQorCQluZW50cmllcyAtPSAxOwogCiAJd3JpdGVfaW5kZXggPSBDRV9SSU5HX0lEWF9BREQobmVudHJpZXNfbWFzaywgd3JpdGVfaW5kZXgsIG5lbnRyaWVzKTsKIAlhdGgxMGtfY2VfZGVzdF9yaW5nX3dyaXRlX2luZGV4X3NldChhciwgY3RybF9hZGRyLCB3cml0ZV9pbmRleCk7CkBAIC04NDAsNyArODQ3LDcgQEAKIAlhdGgxMGtfY2Vfc3JjX3JpbmdfaGlnaG1hcmtfc2V0KGFyLCBjdHJsX2FkZHIsIG5lbnRyaWVzKTsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwKLQkJICAgImJvb3QgaW5pdCBjZSBzcmMgcmluZyBpZCAlZCBlbnRyaWVzICVkIGJhc2VfYWRkciAlcFxuIiwKKwkJICAgImJvb3QgaW5pdCBjZSBzcmMgcmluZyBpZCAlZCBlbnRyaWVzICVkIGJhc2VfYWRkciAlcEtcbiIsCiAJCSAgIGNlX2lkLCBuZW50cmllcywgc3JjX3JpbmctPmJhc2VfYWRkcl9vd25lcl9zcGFjZSk7CiAKIAlyZXR1cm4gMDsKQEAgLTg3NCw3ICs4ODEsNyBAQAogCWF0aDEwa19jZV9kZXN0X3JpbmdfaGlnaG1hcmtfc2V0KGFyLCBjdHJsX2FkZHIsIG5lbnRyaWVzKTsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwKLQkJICAgImJvb3QgY2UgZGVzdCByaW5nIGlkICVkIGVudHJpZXMgJWQgYmFzZV9hZGRyICVwXG4iLAorCQkgICAiYm9vdCBjZSBkZXN0IHJpbmcgaWQgJWQgZW50cmllcyAlZCBiYXNlX2FkZHIgJXBLXG4iLAogCQkgICBjZV9pZCwgbmVudHJpZXMsIGRlc3RfcmluZy0+YmFzZV9hZGRyX293bmVyX3NwYWNlKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuYwppbmRleCBlODg5ODI5Li4yMWFlOGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuYwpAQCAtNjAsNyArNjAsNiBAQAogCQkub3RwX2V4ZV9wYXJhbSA9IDAsCiAJCS5jaGFubmVsX2NvdW50ZXJzX2ZyZXFfaHogPSA4ODAwMCwKIAkJLm1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXMgPSAwLAotCQkuaHdfNGFkZHJfcGFkID0gQVRIMTBLX0hXXzRBRERSX1BBRF9BRlRFUiwKIAkJLmNhbF9kYXRhX2xlbiA9IDIxMTYsCiAJCS5mdyA9IHsKIAkJCS5kaXIgPSBRQ0E5ODhYX0hXXzJfMF9GV19ESVIsCkBAIC02OCw2ICs2Nyw4IEBACiAJCQkuYm9hcmRfc2l6ZSA9IFFDQTk4OFhfQk9BUkRfREFUQV9TWiwKIAkJCS5ib2FyZF9leHRfc2l6ZSA9IFFDQTk4OFhfQk9BUkRfRVhUX0RBVEFfU1osCiAJCX0sCisJCS5od19vcHMgPSAmcWNhOTg4eF9vcHMsCisJCS5kZWNhcF9hbGlnbl9ieXRlcyA9IDQsCiAJfSwKIAl7CiAJCS5pZCA9IFFDQTk4ODdfSFdfMV8wX1ZFUlNJT04sCkBAIC03OSw3ICs4MCw2IEBACiAJCS5vdHBfZXhlX3BhcmFtID0gMCwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDg4MDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDAsCi0JCS5od180YWRkcl9wYWQgPSBBVEgxMEtfSFdfNEFERFJfUEFEX0FGVEVSLAogCQkuY2FsX2RhdGFfbGVuID0gMjExNiwKIAkJLmZ3ID0gewogCQkJLmRpciA9IFFDQTk4ODdfSFdfMV8wX0ZXX0RJUiwKQEAgLTg3LDYgKzg3LDggQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBOTg4N19CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBOTg4N19CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLmh3X29wcyA9ICZxY2E5ODh4X29wcywKKwkJLmRlY2FwX2FsaWduX2J5dGVzID0gNCwKIAl9LAogCXsKIAkJLmlkID0gUUNBNjE3NF9IV18yXzFfVkVSU0lPTiwKQEAgLTEwNCw2ICsxMDYsOCBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E2MTc0X0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E2MTc0X0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuaHdfb3BzID0gJnFjYTk4OHhfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSA0LAogCX0sCiAJewogCQkuaWQgPSBRQ0E2MTc0X0hXXzJfMV9WRVJTSU9OLApAQCAtMTE0LDcgKzExOCw2IEBACiAJCS5vdHBfZXhlX3BhcmFtID0gMCwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDg4MDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDAsCi0JCS5od180YWRkcl9wYWQgPSBBVEgxMEtfSFdfNEFERFJfUEFEX0FGVEVSLAogCQkuY2FsX2RhdGFfbGVuID0gODEyNCwKIAkJLmZ3ID0gewogCQkJLmRpciA9IFFDQTYxNzRfSFdfMl8xX0ZXX0RJUiwKQEAgLTEyMiw2ICsxMjUsOCBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E2MTc0X0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E2MTc0X0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuaHdfb3BzID0gJnFjYTk4OHhfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSA0LAogCX0sCiAJewogCQkuaWQgPSBRQ0E2MTc0X0hXXzNfMF9WRVJTSU9OLApAQCAtMTMyLDcgKzEzNyw2IEBACiAJCS5vdHBfZXhlX3BhcmFtID0gMCwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDg4MDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDAsCi0JCS5od180YWRkcl9wYWQgPSBBVEgxMEtfSFdfNEFERFJfUEFEX0FGVEVSLAogCQkuY2FsX2RhdGFfbGVuID0gODEyNCwKIAkJLmZ3ID0gewogCQkJLmRpciA9IFFDQTYxNzRfSFdfM18wX0ZXX0RJUiwKQEAgLTE0MCw2ICsxNDQsOCBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E2MTc0X0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E2MTc0X0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuaHdfb3BzID0gJnFjYTk4OHhfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSA0LAogCX0sCiAJewogCQkuaWQgPSBRQ0E2MTc0X0hXXzNfMl9WRVJTSU9OLApAQCAtMTUwLDcgKzE1Niw2IEBACiAJCS5vdHBfZXhlX3BhcmFtID0gMCwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDg4MDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDAsCi0JCS5od180YWRkcl9wYWQgPSBBVEgxMEtfSFdfNEFERFJfUEFEX0FGVEVSLAogCQkuY2FsX2RhdGFfbGVuID0gODEyNCwKIAkJLmZ3ID0gewogCQkJLyogdXNlcyBzYW1lIGJpbmFyaWVzIGFzIGh3My4wICovCkBAIC0xNTksNiArMTY0LDggQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBNjE3NF9CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBNjE3NF9CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLmh3X29wcyA9ICZxY2E5ODh4X29wcywKKwkJLmRlY2FwX2FsaWduX2J5dGVzID0gNCwKIAl9LAogCXsKIAkJLmlkID0gUUNBOTlYMF9IV18yXzBfREVWX1ZFUlNJT04sCkBAIC0xNzEsNyArMTc4LDYgQEAKIAkJLmNja19yYXRlX21hcF9yZXYyID0gdHJ1ZSwKIAkJLmNoYW5uZWxfY291bnRlcnNfZnJlcV9oeiA9IDE1MDAwMCwKIAkJLm1heF9wcm9iZV9yZXNwX2Rlc2NfdGhyZXMgPSAyNCwKLQkJLmh3XzRhZGRyX3BhZCA9IEFUSDEwS19IV180QUREUl9QQURfQkVGT1JFLAogCQkudHhfY2hhaW5fbWFzayA9IDB4ZiwKIAkJLnJ4X2NoYWluX21hc2sgPSAweGYsCiAJCS5tYXhfc3BhdGlhbF9zdHJlYW0gPSA0LApAQCAtMTgyLDYgKzE4OCw5IEBACiAJCQkuYm9hcmRfc2l6ZSA9IFFDQTk5WDBfQk9BUkRfREFUQV9TWiwKIAkJCS5ib2FyZF9leHRfc2l6ZSA9IFFDQTk5WDBfQk9BUkRfRVhUX0RBVEFfU1osCiAJCX0sCisJCS5zd19kZWNyeXB0X21jYXN0X21nbXQgPSB0cnVlLAorCQkuaHdfb3BzID0gJnFjYTk5eDBfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSAxLAogCX0sCiAJewogCQkuaWQgPSBRQ0E5OTg0X0hXXzFfMF9ERVZfVkVSU0lPTiwKQEAgLTE5NCw3ICsyMDMsNiBAQAogCQkuY2NrX3JhdGVfbWFwX3JldjIgPSB0cnVlLAogCQkuY2hhbm5lbF9jb3VudGVyc19mcmVxX2h6ID0gMTUwMDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDI0LAotCQkuaHdfNGFkZHJfcGFkID0gQVRIMTBLX0hXXzRBRERSX1BBRF9CRUZPUkUsCiAJCS50eF9jaGFpbl9tYXNrID0gMHhmLAogCQkucnhfY2hhaW5fbWFzayA9IDB4ZiwKIAkJLm1heF9zcGF0aWFsX3N0cmVhbSA9IDQsCkBAIC0yMDUsNiArMjEzLDkgQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBOTlYMF9CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBOTlYMF9CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLnN3X2RlY3J5cHRfbWNhc3RfbWdtdCA9IHRydWUsCisJCS5od19vcHMgPSAmcWNhOTl4MF9vcHMsCisJCS5kZWNhcF9hbGlnbl9ieXRlcyA9IDEsCiAJfSwKIAl7CiAJCS5pZCA9IFFDQTk4ODhfSFdfMl8wX0RFVl9WRVJTSU9OLApAQCAtMjE2LDcgKzIyNyw2IEBACiAJCS5jb250aW51b3VzX2ZyYWdfZGVzYyA9IHRydWUsCiAJCS5jaGFubmVsX2NvdW50ZXJzX2ZyZXFfaHogPSAxNTAwMDAsCiAJCS5tYXhfcHJvYmVfcmVzcF9kZXNjX3RocmVzID0gMjQsCi0JCS5od180YWRkcl9wYWQgPSBBVEgxMEtfSFdfNEFERFJfUEFEX0JFRk9SRSwKIAkJLnR4X2NoYWluX21hc2sgPSAzLAogCQkucnhfY2hhaW5fbWFzayA9IDMsCiAJCS5tYXhfc3BhdGlhbF9zdHJlYW0gPSAyLApAQCAtMjI3LDYgKzIzNyw5IEBACiAJCQkuYm9hcmRfc2l6ZSA9IFFDQTk5WDBfQk9BUkRfREFUQV9TWiwKIAkJCS5ib2FyZF9leHRfc2l6ZSA9IFFDQTk5WDBfQk9BUkRfRVhUX0RBVEFfU1osCiAJCX0sCisJCS5zd19kZWNyeXB0X21jYXN0X21nbXQgPSB0cnVlLAorCQkuaHdfb3BzID0gJnFjYTk5eDBfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSAxLAogCX0sCiAJewogCQkuaWQgPSBRQ0E5Mzc3X0hXXzFfMF9ERVZfVkVSU0lPTiwKQEAgLTI0NCw2ICsyNTcsOCBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E5Mzc3X0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E5Mzc3X0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuaHdfb3BzID0gJnFjYTk4OHhfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSA0LAogCX0sCiAJewogCQkuaWQgPSBRQ0E5Mzc3X0hXXzFfMV9ERVZfVkVSU0lPTiwKQEAgLTI2MSw2ICsyNzYsOCBAQAogCQkJLmJvYXJkX3NpemUgPSBRQ0E5Mzc3X0JPQVJEX0RBVEFfU1osCiAJCQkuYm9hcmRfZXh0X3NpemUgPSBRQ0E5Mzc3X0JPQVJEX0VYVF9EQVRBX1NaLAogCQl9LAorCQkuaHdfb3BzID0gJnFjYTk4OHhfb3BzLAorCQkuZGVjYXBfYWxpZ25fYnl0ZXMgPSA0LAogCX0sCiAJewogCQkuaWQgPSBRQ0E0MDE5X0hXXzFfMF9ERVZfVkVSU0lPTiwKQEAgLTI3NCw3ICsyOTEsNiBAQAogCQkuY2NrX3JhdGVfbWFwX3JldjIgPSB0cnVlLAogCQkuY2hhbm5lbF9jb3VudGVyc19mcmVxX2h6ID0gMTI1MDAwLAogCQkubWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlcyA9IDI0LAotCQkuaHdfNGFkZHJfcGFkID0gQVRIMTBLX0hXXzRBRERSX1BBRF9CRUZPUkUsCiAJCS50eF9jaGFpbl9tYXNrID0gMHgzLAogCQkucnhfY2hhaW5fbWFzayA9IDB4MywKIAkJLm1heF9zcGF0aWFsX3N0cmVhbSA9IDIsCkBAIC0yODUsNiArMzAxLDkgQEAKIAkJCS5ib2FyZF9zaXplID0gUUNBNDAxOV9CT0FSRF9EQVRBX1NaLAogCQkJLmJvYXJkX2V4dF9zaXplID0gUUNBNDAxOV9CT0FSRF9FWFRfREFUQV9TWiwKIAkJfSwKKwkJLnN3X2RlY3J5cHRfbWNhc3RfbWdtdCA9IHRydWUsCisJCS5od19vcHMgPSAmcWNhOTl4MF9vcHMsCisJCS5kZWNhcF9hbGlnbl9ieXRlcyA9IDEsCiAJfSwKIH07CiAKQEAgLTMwNCw2ICszMjMsNyBAQAogCVtBVEgxMEtfRldfRkVBVFVSRV9NRlBfU1VQUE9SVF0gPSAibWZwIiwKIAlbQVRIMTBLX0ZXX0ZFQVRVUkVfUEVFUl9GTE9XX0NPTlRST0xdID0gInBlZXItZmxvdy1jdHJsIiwKIAlbQVRIMTBLX0ZXX0ZFQVRVUkVfQlRDT0VYX1BBUkFNXSA9ICJidGNvZXgtcGFyYW0iLAorCVtBVEgxMEtfRldfRkVBVFVSRV9TS0lQX05VTExfRlVOQ19XQVJdID0gInNraXAtbnVsbC1mdW5jLXdhciIsCiB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGF0aDEwa19jb3JlX2dldF9md19mZWF0dXJlX3N0cihjaGFyICpidWYsCkBAIC02OTksNyArNzE5LDcgQEAKIAogCWlmICghYXItPnJ1bm5pbmdfZnctPmZ3X2ZpbGUub3RwX2RhdGEgfHwKIAkgICAgIWFyLT5ydW5uaW5nX2Z3LT5md19maWxlLm90cF9sZW4pIHsKLQkJYXRoMTBrX3dhcm4oYXIsICJOb3QgcnVubmluZyBvdHAsIGNhbGlicmF0aW9uIHdpbGwgYmUgaW5jb3JyZWN0IChvdHAtZGF0YSAlcCBvdHBfbGVuICV6ZCkhXG4iLAorCQlhdGgxMGtfd2FybihhciwgIk5vdCBydW5uaW5nIG90cCwgY2FsaWJyYXRpb24gd2lsbCBiZSBpbmNvcnJlY3QgKG90cC1kYXRhICVwSyBvdHBfbGVuICV6ZCkhXG4iLAogCQkJICAgIGFyLT5ydW5uaW5nX2Z3LT5md19maWxlLm90cF9kYXRhLAogCQkJICAgIGFyLT5ydW5uaW5nX2Z3LT5md19maWxlLm90cF9sZW4pOwogCQlyZXR1cm4gMDsKQEAgLTc0NSw3ICs3NjUsNyBAQAogCWRhdGEgPSBhci0+cnVubmluZ19mdy0+ZndfZmlsZS5maXJtd2FyZV9kYXRhOwogCWRhdGFfbGVuID0gYXItPnJ1bm5pbmdfZnctPmZ3X2ZpbGUuZmlybXdhcmVfbGVuOwogCi0JcmV0ID0gYXRoMTBrX3N3YXBfY29kZV9zZWdfY29uZmlndXJlKGFyKTsKKwlyZXQgPSBhdGgxMGtfc3dhcF9jb2RlX3NlZ19jb25maWd1cmUoYXIsICZhci0+cnVubmluZ19mdy0+ZndfZmlsZSk7CiAJaWYgKHJldCkgewogCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGNvbmZpZ3VyZSBmdyBjb2RlIHN3YXA6ICVkXG4iLAogCQkJICAgcmV0KTsKQEAgLTc1Myw3ICs3NzMsNyBAQAogCX0KIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwKLQkJICAgImJvb3QgdXBsb2FkaW5nIGZpcm13YXJlIGltYWdlICVwIGxlbiAlZFxuIiwKKwkJICAgImJvb3QgdXBsb2FkaW5nIGZpcm13YXJlIGltYWdlICVwSyBsZW4gJWRcbiIsCiAJCSAgIGRhdGEsIGRhdGFfbGVuKTsKIAogCXJldCA9IGF0aDEwa19ibWlfZmFzdF9kb3dubG9hZChhciwgYWRkcmVzcywgZGF0YSwgZGF0YV9sZW4pOwpAQCAtNzg3LDcgKzgwNyw3IEBACiAJaWYgKCFJU19FUlIoYXItPnByZV9jYWxfZmlsZSkpCiAJCXJlbGVhc2VfZmlybXdhcmUoYXItPnByZV9jYWxfZmlsZSk7CiAKLQlhdGgxMGtfc3dhcF9jb2RlX3NlZ19yZWxlYXNlKGFyKTsKKwlhdGgxMGtfc3dhcF9jb2RlX3NlZ19yZWxlYXNlKGFyLCAmYXItPm5vcm1hbF9tb2RlX2Z3LmZ3X2ZpbGUpOwogCiAJYXItPm5vcm1hbF9tb2RlX2Z3LmZ3X2ZpbGUub3RwX2RhdGEgPSBOVUxMOwogCWFyLT5ub3JtYWxfbW9kZV9mdy5md19maWxlLm90cF9sZW4gPSAwOwpAQCAtMTQ5NywxNCArMTUxNywxNCBAQAogCiAJaWVlZTgwMjExX3N0b3BfcXVldWVzKGFyLT5odyk7CiAJYXRoMTBrX2RyYWluX3R4KGFyKTsKLQljb21wbGV0ZV9hbGwoJmFyLT5zY2FuLnN0YXJ0ZWQpOwotCWNvbXBsZXRlX2FsbCgmYXItPnNjYW4uY29tcGxldGVkKTsKLQljb21wbGV0ZV9hbGwoJmFyLT5zY2FuLm9uX2NoYW5uZWwpOwotCWNvbXBsZXRlX2FsbCgmYXItPm9mZmNoYW5fdHhfY29tcGxldGVkKTsKLQljb21wbGV0ZV9hbGwoJmFyLT5pbnN0YWxsX2tleV9kb25lKTsKLQljb21wbGV0ZV9hbGwoJmFyLT52ZGV2X3NldHVwX2RvbmUpOwotCWNvbXBsZXRlX2FsbCgmYXItPnRoZXJtYWwud21pX3N5bmMpOwotCWNvbXBsZXRlX2FsbCgmYXItPmJzc19zdXJ2ZXlfZG9uZSk7CisJY29tcGxldGUoJmFyLT5zY2FuLnN0YXJ0ZWQpOworCWNvbXBsZXRlKCZhci0+c2Nhbi5jb21wbGV0ZWQpOworCWNvbXBsZXRlKCZhci0+c2Nhbi5vbl9jaGFubmVsKTsKKwljb21wbGV0ZSgmYXItPm9mZmNoYW5fdHhfY29tcGxldGVkKTsKKwljb21wbGV0ZSgmYXItPmluc3RhbGxfa2V5X2RvbmUpOworCWNvbXBsZXRlKCZhci0+dmRldl9zZXR1cF9kb25lKTsKKwljb21wbGV0ZSgmYXItPnRoZXJtYWwud21pX3N5bmMpOworCWNvbXBsZXRlKCZhci0+YnNzX3N1cnZleV9kb25lKTsKIAl3YWtlX3VwKCZhci0+aHR0LmVtcHR5X3R4X3dxKTsKIAl3YWtlX3VwKCZhci0+d21pLnR4X2NyZWRpdHNfd3EpOwogCXdha2VfdXAoJmFyLT5wZWVyX21hcHBpbmdfd3EpOwpAQCAtMTcwNSw2ICsxNzI1LDU1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXRoMTBrX2NvcmVfcmVzZXRfcnhfZmlsdGVyKHN0cnVjdCBhdGgxMGsgKmFyKQoreworCWludCByZXQ7CisJaW50IHZkZXZfaWQ7CisJaW50IHZkZXZfdHlwZTsKKwlpbnQgdmRldl9zdWJ0eXBlOworCWNvbnN0IHU4ICp2ZGV2X2FkZHI7CisKKwl2ZGV2X2lkID0gMDsKKwl2ZGV2X3R5cGUgPSBXTUlfVkRFVl9UWVBFX1NUQTsKKwl2ZGV2X3N1YnR5cGUgPSBhdGgxMGtfd21pX2dldF92ZGV2X3N1YnR5cGUoYXIsIFdNSV9WREVWX1NVQlRZUEVfTk9ORSk7CisJdmRldl9hZGRyID0gYXItPm1hY19hZGRyOworCisJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X2NyZWF0ZShhciwgdmRldl9pZCwgdmRldl90eXBlLCB2ZGV2X3N1YnR5cGUsCisJCQkJICAgICB2ZGV2X2FkZHIpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX2VycihhciwgImZhaWxlZCB0byBjcmVhdGUgZHVtbXkgdmRldjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gYXRoMTBrX3dtaV92ZGV2X2RlbGV0ZShhciwgdmRldl9pZCk7CisJaWYgKHJldCkgeworCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIGRlbGV0ZSBkdW1teSB2ZGV2OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBXTUkgYW5kIEhUVCBtYXkgdXNlIHNlcGFyYXRlIEhJRiBwaXBlcyBhbmQgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlCisJICogc2VyaWFsaXplZCBwcm9wZXJseSBpbXBsaWNpdGx5LgorCSAqCisJICogTW9yZW92ZXIgKG1vc3QpIFdNSSBjb21tYW5kcyBoYXZlIG5vIGV4cGxpY2l0IGFja25vd2xlZGdlcy4gSXQgaXMKKwkgKiBwb3NzaWJsZSB0byBpbmZlciBpdCBpbXBsaWNpdGx5IGJ5IHBva2luZyBmaXJtd2FyZSB3aXRoIGVjaG8KKwkgKiBjb21tYW5kIC0gZ2V0dGluZyBhIHJlcGx5IG1lYW5zIGFsbCBwcmVjZWRpbmcgY29tbWVudHMgaGF2ZSBiZWVuCisJICogKG1vc3RseSkgcHJvY2Vzc2VkLgorCSAqCisJICogSW4gY2FzZSBvZiB2ZGV2IGNyZWF0ZS9kZWxldGUgdGhpcyBpcyBzdWZmaWNpZW50LgorCSAqCisJICogV2l0aG91dCB0aGlzIGl0J3MgcG9zc2libGUgdG8gZW5kIHVwIHdpdGggYSByYWNlIHdoZW4gSFRUIFJ4IHJpbmcgaXMKKwkgKiBzdGFydGVkIGJlZm9yZSB2ZGV2IGNyZWF0ZS9kZWxldGUgaGFjayBpcyBjb21wbGV0ZSBhbGxvd2luZyBhIHNob3J0CisJICogd2luZG93IG9mIG9wcG9ydHVuaXR5IHRvIHJlY2VpdmUgKGFuZCBUeCBBQ0spIGEgYnVuY2ggb2YgZnJhbWVzLgorCSAqLworCXJldCA9IGF0aDEwa193bWlfYmFycmllcihhcik7CisJaWYgKHJldCkgeworCQlhdGgxMGtfZXJyKGFyLCAiZmFpbGVkIHRvIHBpbmcgZmlybXdhcmU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCiBpbnQgYXRoMTBrX2NvcmVfc3RhcnQoc3RydWN0IGF0aDEwayAqYXIsIGVudW0gYXRoMTBrX2Zpcm13YXJlX21vZGUgbW9kZSwKIAkJICAgICAgY29uc3Qgc3RydWN0IGF0aDEwa19md19jb21wb25lbnRzICpmdykKIHsKQEAgLTE4NzIsNiArMTk0MSwyNSBAQAogCQlnb3RvIGVycl9oaWZfc3RvcDsKIAl9CiAKKwkvKiBTb21lIGZpcm13YXJlIHJldmlzaW9ucyBkbyBub3QgcHJvcGVybHkgc2V0IHVwIGhhcmR3YXJlIHJ4IGZpbHRlcgorCSAqIHJlZ2lzdGVycy4KKwkgKgorCSAqIEEga25vd24gZXhhbXBsZSBmcm9tIFFDQTk4ODAgYW5kIDEwLjIuNCBpcyB0aGF0IE1BQ19QQ1VfQUREUjFfTUFTSworCSAqIGlzIGZpbGxlZCB3aXRoIDBzIGluc3RlYWQgb2YgMXMgYWxsb3dpbmcgSFcgdG8gcmVzcG9uZCB3aXRoIEFDS3MgdG8KKwkgKiBhbnkgZnJhbWVzIHRoYXQgbWF0Y2hlcyBNQUNfUENVX1JYX0ZJTFRFUiB3aGljaCBpcyBhbHNvCisJICogbWlzY29uZmlndXJlZCB0byBhY2NlcHQgYW55dGhpbmcuCisJICoKKwkgKiBUaGUgQUREUjEgaXMgcHJvZ3JhbW1lZCB1c2luZyBpbnRlcm5hbCBmaXJtd2FyZSBzdHJ1Y3R1cmUgZmllbGQgYW5kCisJICogY2FuJ3QgYmUgKGVhc2lseS9zYW5lbHkpIHJlYWNoZWQgZnJvbSB0aGUgZHJpdmVyIGV4cGxpY2l0bHkuIEl0IGlzCisJICogcG9zc2libGUgdG8gaW1wbGljaXRseSBtYWtlIGl0IGNvcnJlY3QgYnkgY3JlYXRpbmcgYSBkdW1teSB2ZGV2IGFuZAorCSAqIHRoZW4gZGVsZXRpbmcgaXQuCisJICovCisJc3RhdHVzID0gYXRoMTBrX2NvcmVfcmVzZXRfcnhfZmlsdGVyKGFyKTsKKwlpZiAoc3RhdHVzKSB7CisJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gcmVzZXQgcnggZmlsdGVyOiAlZFxuIiwgc3RhdHVzKTsKKwkJZ290byBlcnJfaGlmX3N0b3A7CisJfQorCiAJLyogSWYgZmlybXdhcmUgaW5kaWNhdGVzIEZ1bGwgUnggUmVvcmRlciBzdXBwb3J0IGl0IG11c3QgYmUgdXNlZCBpbiBhCiAJICogc2xpZ2h0bHkgZGlmZmVyZW50IG1hbm5lci4gTGV0IEhUVCBjb2RlIGtub3cuCiAJICovCkBAIC0xODg0LDcgKzE5NzIsMTAgQEAKIAkJZ290byBlcnJfaGlmX3N0b3A7CiAJfQogCi0JYXItPmZyZWVfdmRldl9tYXAgPSAoMUxMIDw8IGFyLT5tYXhfbnVtX3ZkZXZzKSAtIDE7CisJaWYgKGFyLT5tYXhfbnVtX3ZkZXZzID49IDY0KQorCQlhci0+ZnJlZV92ZGV2X21hcCA9IDB4RkZGRkZGRkZGRkZGRkZGRkxMOworCWVsc2UKKwkJYXItPmZyZWVfdmRldl9tYXAgPSAoMUxMIDw8IGFyLT5tYXhfbnVtX3ZkZXZzKSAtIDE7CiAKIAlJTklUX0xJU1RfSEVBRCgmYXItPmFydmlmcyk7CiAKQEAgLTIwMzEsNyArMjEyMiw3IEBACiAJCWdvdG8gZXJyX2ZyZWVfZmlybXdhcmVfZmlsZXM7CiAJfQogCi0JcmV0ID0gYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5pdChhcik7CisJcmV0ID0gYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5pdChhciwgJmFyLT5ub3JtYWxfbW9kZV9mdy5md19maWxlKTsKIAlpZiAocmV0KSB7CiAJCWF0aDEwa19lcnIoYXIsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb2RlIHN3YXAgc2VnbWVudDogJWRcbiIsCiAJCQkgICByZXQpOwpAQCAtMjA3Miw2ICsyMTYzLDkgQEAKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRoMTBrLCByZWdpc3Rlcl93b3JrKTsKIAlpbnQgc3RhdHVzOwogCisJLyogcGVlciBzdGF0cyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0ICovCisJc2V0X2JpdChBVEgxMEtfRkxBR19QRUVSX1NUQVRTLCAmYXItPmRldl9mbGFncyk7CisKIAlzdGF0dXMgPSBhdGgxMGtfY29yZV9wcm9iZV9mdyhhcik7CiAJaWYgKHN0YXR1cykgewogCQlhdGgxMGtfZXJyKGFyLCAiY291bGQgbm90IHByb2JlIGZ3ICglZClcbiIsIHN0YXR1cyk7CkBAIC0yMjQ5LDYgKzIzNDMsOCBAQAogCUlOSVRfV09SSygmYXItPnJlZ2lzdGVyX3dvcmssIGF0aDEwa19jb3JlX3JlZ2lzdGVyX3dvcmspOwogCUlOSVRfV09SSygmYXItPnJlc3RhcnRfd29yaywgYXRoMTBrX2NvcmVfcmVzdGFydCk7CiAKKwlpbml0X2R1bW15X25ldGRldigmYXItPm5hcGlfZGV2KTsKKwogCXJldCA9IGF0aDEwa19kZWJ1Z19jcmVhdGUoYXIpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2ZyZWVfYXV4X3dxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuaAppbmRleCAzMGFlNWJmLi5kZGE0OWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuaApAQCAtNjUsNiArNjUsMTAgQEAKICNkZWZpbmUgQVRIMTBLX0tFRVBBTElWRV9NQVhfSURMRSAzODk1CiAjZGVmaW5lIEFUSDEwS19LRUVQQUxJVkVfTUFYX1VOUkVTUE9OU0lWRSAzOTAwCiAKKy8qIE5BUEkgcG9sbCBidWRnZXQgKi8KKyNkZWZpbmUgQVRIMTBLX05BUElfQlVER0VUICAgICAgNjQKKyNkZWZpbmUgQVRIMTBLX05BUElfUVVPVEFfTElNSVQgNjAKKwogc3RydWN0IGF0aDEwazsKIAogZW51bSBhdGgxMGtfYnVzIHsKQEAgLTE0Miw2ICsxNDYsNyBAQAogCWVudW0gYXRoMTBrX2h0Y19lcF9pZCBlaWQ7CiAJc3RydWN0IGNvbXBsZXRpb24gc2VydmljZV9yZWFkeTsKIAlzdHJ1Y3QgY29tcGxldGlvbiB1bmlmaWVkX3JlYWR5OworCXN0cnVjdCBjb21wbGV0aW9uIGJhcnJpZXI7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgdHhfY3JlZGl0c193cTsKIAlERUNMQVJFX0JJVE1BUChzdmNfbWFwLCBXTUlfU0VSVklDRV9NQVgpOwogCXN0cnVjdCB3bWlfY21kX21hcCAqY21kOwpAQCAtMTk2LDEwICsyMDEsMTAgQEAKIAogCS8qIFBERVYgc3RhdHMgKi8KIAlzMzIgY2hfbm9pc2VfZmxvb3I7Ci0JdTMyIHR4X2ZyYW1lX2NvdW50OwotCXUzMiByeF9mcmFtZV9jb3VudDsKLQl1MzIgcnhfY2xlYXJfY291bnQ7Ci0JdTMyIGN5Y2xlX2NvdW50OworCXUzMiB0eF9mcmFtZV9jb3VudDsgLyogQ3ljbGVzIHNwZW50IHRyYW5zbWl0dGluZyBmcmFtZXMgKi8KKwl1MzIgcnhfZnJhbWVfY291bnQ7IC8qIEN5Y2xlcyBzcGVudCByZWNlaXZpbmcgZnJhbWVzICovCisJdTMyIHJ4X2NsZWFyX2NvdW50OyAvKiBUb3RhbCBjaGFubmVsIGJ1c3kgdGltZSwgZXZpZGVudGx5ICovCisJdTMyIGN5Y2xlX2NvdW50OyAvKiBUb3RhbCBvbi1jaGFubmVsIHRpbWUgKi8KIAl1MzIgcGh5X2Vycl9jb3VudDsKIAl1MzIgY2hhbl90eF9wb3dlcjsKIAl1MzIgYWNrX3J4X2JhZDsKQEAgLTQ0MCw3ICs0NDUsNyBAQAogCXN0cnVjdCBjb21wbGV0aW9uIHRwY19jb21wbGV0ZTsKIAogCS8qIHByb3RlY3RlZCBieSBjb25mX211dGV4ICovCi0JdTMyIGZ3X2RiZ2xvZ19tYXNrOworCXU2NCBmd19kYmdsb2dfbWFzazsKIAl1MzIgZndfZGJnbG9nX2xldmVsOwogCXUzMiBwa3Rsb2dfZmlsdGVyOwogCXUzMiByZWdfYWRkcjsKQEAgLTU1MSw2ICs1NTYsMTMgQEAKIAkgKi8KIAlBVEgxMEtfRldfRkVBVFVSRV9CVENPRVhfUEFSQU0gPSAxNCwKIAorCS8qIE9sZGVyIGZpcm13YXJlIHdpdGggSFRUIGRlbGl2ZXJzIGluY29ycmVjdCB0eCBzdGF0dXMgZm9yIG51bGwgZnVuYworCSAqIGZyYW1lcyB0byBkcml2ZXIsIGJ1dCB0aGlzIGZpeGVkIGluIDEwLjIgYW5kIDEwLjQgZmlybXdhcmUgdmVyc2lvbnMuCisJICogQWxzbyB0aGlzIHdvcmthcm91bmQgcmVzdWx0cyBpbiByZXBvcnRpbmcgb2YgaW5jb3JyZWN0IG51bGwgZnVuYworCSAqIHN0YXR1cyBmb3IgMTAuNC4gVGhpcyBmbGFnIGlzIHVzZWQgdG8gc2tpcCB0aGUgd29ya2Fyb3VuZC4KKwkgKi8KKwlBVEgxMEtfRldfRkVBVFVSRV9TS0lQX05VTExfRlVOQ19XQVIgPSAxNSwKKwogCS8qIGtlZXAgbGFzdCAqLwogCUFUSDEwS19GV19GRUFUVVJFX0NPVU5ULAogfTsKQEAgLTY2Myw2ICs2NzUsMTUgQEAKIAogCWNvbnN0IHZvaWQgKmNvZGVzd2FwX2RhdGE7CiAJc2l6ZV90IGNvZGVzd2FwX2xlbjsKKworCS8qIFRoZSBvcmlnaW5hbCBpZGVhIG9mIHN0cnVjdCBhdGgxMGtfZndfZmlsZSB3YXMgdGhhdCBpdCBvbmx5CisJICogY29udGFpbnMgc3RydWN0IGZpcm13YXJlIGFuZCBwb2ludGVycyB0byB2YXJpb3VzIHBhcnRzIChhY3R1YWwKKwkgKiBmaXJtd2FyZSBiaW5hcnksIG90cCwgbWV0YWRhdGEgZXRjKSBvZiB0aGUgZmlsZS4gVGhpcyBzZWdfaW5mbworCSAqIGlzIGFjdHVhbGx5IGNyZWF0ZWQgc2VwYXJhdGUgYnV0IGFzIHRoaXMgaXMgdXNlZCBzaW1pbGFybHkgYXMKKwkgKiB0aGUgb3RoZXIgZmlybXdhcmUgY29tcG9uZW50cyBpdCdzIG1vcmUgY29udmVuaWVudCB0byBoYXZlIGl0CisJICogaGVyZS4KKwkgKi8KKwlzdHJ1Y3QgYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5mbyAqZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvOwogfTsKIAogc3RydWN0IGF0aDEwa19md19jb21wb25lbnRzIHsKQEAgLTcxNSw1MyArNzM2LDcgQEAKIAlzdHJ1Y3QgYXRoMTBrX2h0YyBodGM7CiAJc3RydWN0IGF0aDEwa19odHQgaHR0OwogCi0Jc3RydWN0IGF0aDEwa19od19wYXJhbXMgewotCQl1MzIgaWQ7Ci0JCXUxNiBkZXZfaWQ7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0JCXUzMiBwYXRjaF9sb2FkX2FkZHI7Ci0JCWludCB1YXJ0X3BpbjsKLQkJdTMyIG90cF9leGVfcGFyYW07Ci0KLQkJLyogVHlwZSBvZiBodyBjeWNsZSBjb3VudGVyIHdyYXBhcm91bmQgbG9naWMsIGZvciBtb3JlIGluZm8KLQkJICogcmVmZXIgZW51bSBhdGgxMGtfaHdfY2Nfd3JhcGFyb3VuZF90eXBlLgotCQkgKi8KLQkJZW51bSBhdGgxMGtfaHdfY2Nfd3JhcGFyb3VuZF90eXBlIGNjX3dyYXBhcm91bmRfdHlwZTsKLQotCQkvKiBTb21lIG9mIGNoaXAgZXhwZWN0cyBmcmFnbWVudCBkZXNjcmlwdG9yIHRvIGJlIGNvbnRpbnVvdXMKLQkJICogbWVtb3J5IGZvciBhbnkgVFggb3BlcmF0aW9uLiBTZXQgY29udGludW91c19mcmFnX2Rlc2MgZmxhZwotCQkgKiBmb3IgdGhlIGhhcmR3YXJlIHdoaWNoIGhhdmUgc3VjaCByZXF1aXJlbWVudC4KLQkJICovCi0JCWJvb2wgY29udGludW91c19mcmFnX2Rlc2M7Ci0KLQkJLyogQ0NLIGhhcmR3YXJlIHJhdGUgdGFibGUgbWFwcGluZyBmb3IgdGhlIG5ld2VyIGNoaXBzZXRzCi0JCSAqIGxpa2UgUUNBOTlYMCwgUUNBNDAxOSBnb3QgcmV2aXNlZC4gVGhlIENDSyBoL3cgcmF0ZSB2YWx1ZXMKLQkJICogYXJlIGluIGEgcHJvcGVyIG9yZGVyIHdpdGggcmVzcGVjdCB0byB0aGUgcmF0ZS9wcmVhbWJsZQotCQkgKi8KLQkJYm9vbCBjY2tfcmF0ZV9tYXBfcmV2MjsKLQotCQl1MzIgY2hhbm5lbF9jb3VudGVyc19mcmVxX2h6OwotCi0JCS8qIE1nbXQgdHggZGVzY3JpcHRvcnMgdGhyZXNob2xkIGZvciBsaW1pdGluZyBwcm9iZSByZXNwb25zZQotCQkgKiBmcmFtZXMuCi0JCSAqLwotCQl1MzIgbWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlczsKLQotCQkvKiBUaGUgcGFkZGluZyBieXRlcydzIGxvY2F0aW9uIGlzIGRpZmZlcmVudCBvbiB2YXJpb3VzIGNoaXBzICovCi0JCWVudW0gYXRoMTBrX2h3XzRhZGRyX3BhZCBod180YWRkcl9wYWQ7Ci0KLQkJdTMyIHR4X2NoYWluX21hc2s7Ci0JCXUzMiByeF9jaGFpbl9tYXNrOwotCQl1MzIgbWF4X3NwYXRpYWxfc3RyZWFtOwotCQl1MzIgY2FsX2RhdGFfbGVuOwotCi0JCXN0cnVjdCBhdGgxMGtfaHdfcGFyYW1zX2Z3IHsKLQkJCWNvbnN0IGNoYXIgKmRpcjsKLQkJCWNvbnN0IGNoYXIgKmJvYXJkOwotCQkJc2l6ZV90IGJvYXJkX3NpemU7Ci0JCQlzaXplX3QgYm9hcmRfZXh0X3NpemU7Ci0JCX0gZnc7Ci0JfSBod19wYXJhbXM7CisJc3RydWN0IGF0aDEwa19od19wYXJhbXMgaHdfcGFyYW1zOwogCiAJLyogY29udGFpbnMgdGhlIGZpcm13YXJlIGltYWdlcyB1c2VkIHdpdGggQVRIMTBLX0ZJUk1XQVJFX01PREVfTk9STUFMICovCiAJc3RydWN0IGF0aDEwa19md19jb21wb25lbnRzIG5vcm1hbF9tb2RlX2Z3OwpAQCAtNzc1LDEwICs3NTAsNiBAQAogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqY2FsX2ZpbGU7CiAKIAlzdHJ1Y3QgewotCQlzdHJ1Y3QgYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5mbyAqZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvOwotCX0gc3dhcDsKLQotCXN0cnVjdCB7CiAJCXUzMiB2ZW5kb3I7CiAJCXUzMiBkZXZpY2U7CiAJCXUzMiBzdWJzeXN0ZW1fdmVuZG9yOwpAQCAtOTM2LDYgKzkwNywxMCBAQAogCXN0cnVjdCBhdGgxMGtfdGhlcm1hbCB0aGVybWFsOwogCXN0cnVjdCBhdGgxMGtfd293IHdvdzsKIAorCS8qIE5BUEkgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSBuYXBpX2RldjsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKKwogCS8qIG11c3QgYmUgbGFzdCAqLwogCXU4IGRydl9wcml2WzBdIF9fYWxpZ25lZChzaXplb2Yodm9pZCAqKSk7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9kZWJ1Zy5jCmluZGV4IDhmMGZkNDEuLjgzMmRhNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2RlYnVnLmMKQEAgLTEyMjgsOSArMTIyOCw5IEBACiB7CiAJc3RydWN0IGF0aDEwayAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJdW5zaWduZWQgaW50IGxlbjsKLQljaGFyIGJ1Zls2NF07CisJY2hhciBidWZbOTZdOwogCi0JbGVuID0gc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIweCUwOHggJXVcbiIsCisJbGVuID0gc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIweCUxNmxseCAldVxuIiwKIAkJCWFyLT5kZWJ1Zy5md19kYmdsb2dfbWFzaywgYXItPmRlYnVnLmZ3X2RiZ2xvZ19sZXZlbCk7CiAKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7CkBAIC0xMjQyLDE1ICsxMjQyLDE2IEBACiB7CiAJc3RydWN0IGF0aDEwayAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IHJldDsKLQljaGFyIGJ1Zls2NF07Ci0JdW5zaWduZWQgaW50IGxvZ19sZXZlbCwgbWFzazsKKwljaGFyIGJ1Zls5Nl07CisJdW5zaWduZWQgaW50IGxvZ19sZXZlbDsKKwl1NjQgbWFzazsKIAogCXNpbXBsZV93cml0ZV90b19idWZmZXIoYnVmLCBzaXplb2YoYnVmKSAtIDEsIHBwb3MsIHVzZXJfYnVmLCBjb3VudCk7CiAKIAkvKiBtYWtlIHN1cmUgdGhhdCBidWYgaXMgbnVsbCB0ZXJtaW5hdGVkICovCiAJYnVmW3NpemVvZihidWYpIC0gMV0gPSAwOwogCi0JcmV0ID0gc3NjYW5mKGJ1ZiwgIiV4ICV1IiwgJm1hc2ssICZsb2dfbGV2ZWwpOworCXJldCA9IHNzY2FuZihidWYsICIlbGx4ICV1IiwgJm1hc2ssICZsb2dfbGV2ZWwpOwogCiAJaWYgKCFyZXQpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odGMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHRjLmMKaW5kZXggNWIzYzZiYy4uMTc1YWFlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odGMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0Yy5jCkBAIC00NCw3ICs0NCw3IEBACiAJc2tiX2NiID0gQVRIMTBLX1NLQl9DQihza2IpOwogCW1lbXNldChza2JfY2IsIDAsIHNpemVvZigqc2tiX2NiKSk7CiAKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUQywgIiVzOiBza2IgJXBcbiIsIF9fZnVuY19fLCBza2IpOworCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfSFRDLCAiJXM6IHNrYiAlcEtcbiIsIF9fZnVuY19fLCBza2IpOwogCXJldHVybiBza2I7CiB9CiAKQEAgLTYyLDcgKzYyLDcgQEAKIHsKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGVwLT5odGMtPmFyOwogCi0JYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19IVEMsICIlczogZXAgJWQgc2tiICVwXG4iLCBfX2Z1bmNfXywKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUQywgIiVzOiBlcCAlZCBza2IgJXBLXG4iLCBfX2Z1bmNfXywKIAkJICAgZXAtPmVpZCwgc2tiKTsKIAogCWF0aDEwa19odGNfcmVzdG9yZV90eF9za2IoZXAtPmh0Yywgc2tiKTsKQEAgLTQwNCw3ICs0MDQsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUQywgImh0YyByeCBjb21wbGV0aW9uIGVwICVkIHNrYiAlcFxuIiwKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUQywgImh0YyByeCBjb21wbGV0aW9uIGVwICVkIHNrYiAlcEtcbiIsCiAJCSAgIGVpZCwgc2tiKTsKIAllcC0+ZXBfb3BzLmVwX3J4X2NvbXBsZXRlKGFyLCBza2IpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHQuaAppbmRleCA0MzBhODNlLi4wZDJlZDA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0LmgKQEAgLTU5NSw3ICs1OTUsNyBAQAogCS8qIG9ubHkgYWNjZXB0IEVBUE9MIGZyYW1lcyAqLwogCUhUVF9SWF9JTkRfTVBEVV9TVEFUVVNfVU5BVVRIX1BFRVIsCiAJSFRUX1JYX0lORF9NUERVX1NUQVRVU19PVVRfT0ZfU1lOQywKLQkvKiBOb24tZGF0YSBpbiBwcm9taXNjb3VzIG1vZGUgKi8KKwkvKiBOb24tZGF0YSBpbiBwcm9taXNjdW91cyBtb2RlICovCiAJSFRUX1JYX0lORF9NUERVX1NUQVRVU19NR01UX0NUUkwsCiAJSFRUX1JYX0lORF9NUERVX1NUQVRVU19US0lQX01JQ19FUlIsCiAJSFRUX1JYX0lORF9NUERVX1NUQVRVU19ERUNSWVBUX0VSUiwKQEAgLTkwMCw3ICs5MDAsNyBAQAogICogICAgIFB1cnBvc2U6IGluZGljYXRlIGhvdyBtYW55IDMyLWJpdCBpbnRlZ2VycyBmb2xsb3cgdGhlIG1lc3NhZ2UgaGVhZGVyCiAgKiAgIC0gTlVNX0NIQVJTCiAgKiAgICAgQml0cyAzMToxNgotICogICAgIFB1cnBvc2U6IGluZGljYXRlIGhvdyBtYW55IDgtYml0IGNoYXJhdGVycyBmb2xsb3cgdGhlIHNlcmllcyBvZiBpbnRlZ2VycworICogICAgIFB1cnBvc2U6IGluZGljYXRlIGhvdyBtYW55IDgtYml0IGNoYXJhY3RlcnMgZm9sbG93IHRoZSBzZXJpZXMgb2YgaW50ZWdlcnMKICAqLwogc3RydWN0IGh0dF9yeF90ZXN0IHsKIAl1OCBudW1faW50czsKQEAgLTEwNDIsMTAgKzEwNDIsMTAgQEAKIAkvKiBpbGxlZ2FsIHJhdGUgcGh5IGVycm9ycyAgKi8KIAlfX2xlMzIgaWxsZ2xfcmF0ZV9waHlfZXJyOwogCi0JLyogd2FsIHBkZXYgY29udGlub3VzIHhyZXRyeSAqLworCS8qIHdhbCBwZGV2IGNvbnRpbnVvdXMgeHJldHJ5ICovCiAJX19sZTMyIHBkZXZfY29udF94cmV0cnk7CiAKLQkvKiB3YWwgcGRldiBjb250aW5vdXMgeHJldHJ5ICovCisJLyogd2FsIHBkZXYgY29udGludW91cyB4cmV0cnkgKi8KIAlfX2xlMzIgcGRldl90eF90aW1lb3V0OwogCiAJLyogd2FsIHBkZXYgcmVzZXRzICAqLwpAQCAtMTY2NSw3ICsxNjY1LDYgQEAKIAogCS8qIFRoaXMgaXMgdXNlZCB0byBncm91cCB0eC9yeCBjb21wbGV0aW9ucyBzZXBhcmF0ZWx5IGFuZCBwcm9jZXNzIHRoZW0KIAkgKiBpbiBiYXRjaGVzIHRvIHJlZHVjZSBjYWNoZSBzdGFsbHMgKi8KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdHhyeF9jb21wbF90YXNrOwogCXN0cnVjdCBza19idWZmX2hlYWQgcnhfY29tcGxfcTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X2luX29yZF9jb21wbF9xOwogCXN0cnVjdCBza19idWZmX2hlYWQgdHhfZmV0Y2hfaW5kX3E7CkBAIC0xNzk4LDUgKzE3OTcsNiBAQAogCQkgIHN0cnVjdCBza19idWZmICptc2R1KTsKIHZvaWQgYXRoMTBrX2h0dF9yeF9wa3Rsb2dfY29tcGxldGlvbl9oYW5kbGVyKHN0cnVjdCBhdGgxMGsgKmFyLAogCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpOworaW50IGF0aDEwa19odHRfdHhyeF9jb21wbF90YXNrKHN0cnVjdCBhdGgxMGsgKmFyLCBpbnQgYnVkZ2V0KTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHRfcnguYwppbmRleCA3OGRiNWQ2Li4wYjRjMTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0X3J4LmMKQEAgLTM0LDcgKzM0LDYgQEAKICNkZWZpbmUgSFRUX1JYX1JJTkdfUkVGSUxMX1JFU0NIRURfTVMgNQogCiBzdGF0aWMgaW50IGF0aDEwa19odHRfcnhfZ2V0X2NzdW1fc3RhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1zdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3R4cnhfY29tcGxfdGFzayh1bnNpZ25lZCBsb25nIHB0cik7CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCiBhdGgxMGtfaHR0X3J4X2ZpbmRfc2tiX3BhZGRyKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgcGFkZHIpCkBAIC0yMjYsNyArMjI1LDYgQEAKIHZvaWQgYXRoMTBrX2h0dF9yeF9mcmVlKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQpCiB7CiAJZGVsX3RpbWVyX3N5bmMoJmh0dC0+cnhfcmluZy5yZWZpbGxfcmV0cnlfdGltZXIpOwotCXRhc2tsZXRfa2lsbCgmaHR0LT50eHJ4X2NvbXBsX3Rhc2spOwogCiAJc2tiX3F1ZXVlX3B1cmdlKCZodHQtPnJ4X2NvbXBsX3EpOwogCXNrYl9xdWV1ZV9wdXJnZSgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcSk7CkBAIC01MjAsOSArNTE4LDYgQEAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZodHQtPnR4X2ZldGNoX2luZF9xKTsKIAlhdG9taWNfc2V0KCZodHQtPm51bV9tcGR1c19yZWFkeSwgMCk7CiAKLQl0YXNrbGV0X2luaXQoJmh0dC0+dHhyeF9jb21wbF90YXNrLCBhdGgxMGtfaHR0X3R4cnhfY29tcGxfdGFzaywKLQkJICAgICAodW5zaWduZWQgbG9uZylodHQpOwotCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19CT09ULCAiaHR0IHJ4IHJpbmcgc2l6ZSAlZCBmaWxsX2xldmVsICVkXG4iLAogCQkgICBodHQtPnJ4X3Jpbmcuc2l6ZSwgaHR0LT5yeF9yaW5nLmZpbGxfbGV2ZWwpOwogCXJldHVybiAwOwpAQCAtOTMxLDcgKzkyNiw3IEBACiAJKnN0YXR1cyA9ICpyeF9zdGF0dXM7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0RBVEEsCi0JCSAgICJyeCBza2IgJXAgbGVuICV1IHBlZXIgJXBNICVzICVzIHNuICV1ICVzJXMlcyVzJXMgJXNyYXRlX2lkeCAldSB2aHRfbnNzICV1IGZyZXEgJXUgYmFuZCAldSBmbGFnIDB4JWxseCBmY3MtZXJyICVpIG1pYy1lcnIgJWkgYW1zZHUtbW9yZSAlaVxuIiwKKwkJICAgInJ4IHNrYiAlcEsgbGVuICV1IHBlZXIgJXBNICVzICVzIHNuICV1ICVzJXMlcyVzJXMgJXNyYXRlX2lkeCAldSB2aHRfbnNzICV1IGZyZXEgJXUgYmFuZCAldSBmbGFnIDB4JWxseCBmY3MtZXJyICVpIG1pYy1lcnIgJWkgYW1zZHUtbW9yZSAlaVxuIiwKIAkJICAgc2tiLAogCQkgICBza2ItPmxlbiwKIAkJICAgaWVlZTgwMjExX2dldF9TQShoZHIpLApAQCAtOTU4LDcgKzk1Myw3IEBACiAJdHJhY2VfYXRoMTBrX3J4X2hkcihhciwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAJdHJhY2VfYXRoMTBrX3J4X3BheWxvYWQoYXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCi0JaWVlZTgwMjExX3J4KGFyLT5odywgc2tiKTsKKwlpZWVlODAyMTFfcnhfbmFwaShhci0+aHcsIE5VTEwsIHNrYiwgJmFyLT5uYXBpKTsKIH0KIAogc3RhdGljIGludCBhdGgxMGtfaHR0X3J4X253aWZpX2hkcmxlbihzdHJ1Y3QgYXRoMTBrICphciwKQEAgLTEwNTYsOSArMTA1MSwxMSBAQAogCQkJCQkgIGNvbnN0IHU4IGZpcnN0X2hkcls2NF0pCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZDsKIAlzaXplX3QgaGRyX2xlbjsKIAl1OCBkYVtFVEhfQUxFTl07CiAJdTggc2FbRVRIX0FMRU5dOworCWludCBsM19wYWRfYnl0ZXM7CiAKIAkvKiBEZWxpdmVyZWQgZGVjYXBwZWQgZnJhbWU6CiAJICogW253aWZpIDgwMi4xMSBoZWFkZXJdIDwtLSByZXBsYWNlZCB3aXRoIDgwMi4xMSBoZHIKQEAgLTEwNzIsMTkgKzEwNjksMTIgQEAKIAkgKi8KIAogCS8qIHB1bGwgZGVjYXBwZWQgaGVhZGVyIGFuZCBjb3B5IFNBICYgREEgKi8KLQlpZiAoKGFyLT5od19wYXJhbXMuaHdfNGFkZHJfcGFkID09IEFUSDEwS19IV180QUREUl9QQURfQkVGT1JFKSAmJgotCSAgICBpZWVlODAyMTFfaGFzX2E0KCgoc3RydWN0IGllZWU4MDIxMV9oZHIgKilmaXJzdF9oZHIpLT5mcmFtZV9jb250cm9sKSkgewotCQkvKiBUaGUgUUNBOTlYMCA0IGFkZHJlc3MgbW9kZSBwYWQgMiBieXRlcyBhdCB0aGUKLQkJICogYmVnaW5uaW5nIG9mIE1TRFUKLQkJICovCi0JCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShtc2R1LT5kYXRhICsgMik7Ci0JCS8qIFRoZSBza2IgbGVuZ3RoIG5lZWQgYmUgZXh0ZW5kZWQgMiBhcyB0aGUgMiBieXRlcyBhdCB0aGUgdGFpbAotCQkgKiBiZSBleGNsdWRlZCBkdWUgdG8gdGhlIHBhZGRpbmcKLQkJICovCi0JCXNrYl9wdXQobXNkdSwgMik7Ci0JfSBlbHNlIHsKLQkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopKG1zZHUtPmRhdGEpOwotCX0KKwlyeGQgPSAodm9pZCAqKW1zZHUtPmRhdGEgLSBzaXplb2YoKnJ4ZCk7CisKKwlsM19wYWRfYnl0ZXMgPSBhdGgxMGtfcnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKCZhci0+aHdfcGFyYW1zLCByeGQpOworCXNrYl9wdXQobXNkdSwgbDNfcGFkX2J5dGVzKTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShtc2R1LT5kYXRhICsgbDNfcGFkX2J5dGVzKTsKIAogCWhkcl9sZW4gPSBhdGgxMGtfaHR0X3J4X253aWZpX2hkcmxlbihhciwgaGRyKTsKIAlldGhlcl9hZGRyX2NvcHkoZGEsIGllZWU4MDIxMV9nZXRfREEoaGRyKSk7CkBAIC0xMTEzLDYgKzExMDMsNyBAQAogCXNpemVfdCBoZHJfbGVuLCBjcnlwdG9fbGVuOwogCXZvaWQgKnJmYzEwNDI7CiAJYm9vbCBpc19maXJzdCwgaXNfbGFzdCwgaXNfYW1zZHU7CisJaW50IGJ5dGVzX2FsaWduZWQgPSBhci0+aHdfcGFyYW1zLmRlY2FwX2FsaWduX2J5dGVzOwogCiAJcnhkID0gKHZvaWQgKiltc2R1LT5kYXRhIC0gc2l6ZW9mKCpyeGQpOwogCWhkciA9ICh2b2lkICopcnhkLT5yeF9oZHJfc3RhdHVzOwpAQCAtMTEyOSw4ICsxMTIwLDggQEAKIAkJaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKTsKIAkJY3J5cHRvX2xlbiA9IGF0aDEwa19odHRfcnhfY3J5cHRvX3BhcmFtX2xlbihhciwgZW5jdHlwZSk7CiAKLQkJcmZjMTA0MiArPSByb3VuZF91cChoZHJfbGVuLCA0KSArCi0JCQkgICByb3VuZF91cChjcnlwdG9fbGVuLCA0KTsKKwkJcmZjMTA0MiArPSByb3VuZF91cChoZHJfbGVuLCBieXRlc19hbGlnbmVkKSArCisJCQkgICByb3VuZF91cChjcnlwdG9fbGVuLCBieXRlc19hbGlnbmVkKTsKIAl9CiAKIAlpZiAoaXNfYW1zZHUpCkBAIC0xMTUxLDYgKzExNDIsOCBAQAogCXZvaWQgKnJmYzEwNDI7CiAJdTggZGFbRVRIX0FMRU5dOwogCXU4IHNhW0VUSF9BTEVOXTsKKwlpbnQgbDNfcGFkX2J5dGVzOworCXN0cnVjdCBodHRfcnhfZGVzYyAqcnhkOwogCiAJLyogRGVsaXZlcmVkIGRlY2FwcGVkIGZyYW1lOgogCSAqIFtldGggaGVhZGVyXSA8LS0gcmVwbGFjZWQgd2l0aCA4MDIuMTEgaGRyICYgcmZjMTA0Mi9sbGMKQEAgLTExNjEsNiArMTE1NCwxMSBAQAogCWlmIChXQVJOX09OX09OQ0UoIXJmYzEwNDIpKQogCQlyZXR1cm47CiAKKwlyeGQgPSAodm9pZCAqKW1zZHUtPmRhdGEgLSBzaXplb2YoKnJ4ZCk7CisJbDNfcGFkX2J5dGVzID0gYXRoMTBrX3J4X2Rlc2NfZ2V0X2wzX3BhZF9ieXRlcygmYXItPmh3X3BhcmFtcywgcnhkKTsKKwlza2JfcHV0KG1zZHUsIGwzX3BhZF9ieXRlcyk7CisJc2tiX3B1bGwobXNkdSwgbDNfcGFkX2J5dGVzKTsKKwogCS8qIHB1bGwgZGVjYXBwZWQgaGVhZGVyIGFuZCBjb3B5IFNBICYgREEgKi8KIAlldGggPSAoc3RydWN0IGV0aGhkciAqKW1zZHUtPmRhdGE7CiAJZXRoZXJfYWRkcl9jb3B5KGRhLCBldGgtPmhfZGVzdCk7CkBAIC0xMTkxLDYgKzExODksOCBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJc2l6ZV90IGhkcl9sZW47CisJaW50IGwzX3BhZF9ieXRlczsKKwlzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZDsKIAogCS8qIERlbGl2ZXJlZCBkZWNhcHBlZCBmcmFtZToKIAkgKiBbYW1zZHUgaGVhZGVyXSA8LS0gcmVwbGFjZWQgd2l0aCA4MDIuMTEgaGRyCkBAIC0xMTk4LDcgKzExOTgsMTEgQEAKIAkgKiBbcGF5bG9hZF0KIAkgKi8KIAotCXNrYl9wdWxsKG1zZHUsIHNpemVvZihzdHJ1Y3QgYW1zZHVfc3ViZnJhbWVfaGRyKSk7CisJcnhkID0gKHZvaWQgKiltc2R1LT5kYXRhIC0gc2l6ZW9mKCpyeGQpOworCWwzX3BhZF9ieXRlcyA9IGF0aDEwa19yeF9kZXNjX2dldF9sM19wYWRfYnl0ZXMoJmFyLT5od19wYXJhbXMsIHJ4ZCk7CisKKwlza2JfcHV0KG1zZHUsIGwzX3BhZF9ieXRlcyk7CisJc2tiX3B1bGwobXNkdSwgc2l6ZW9mKHN0cnVjdCBhbXNkdV9zdWJmcmFtZV9oZHIpICsgbDNfcGFkX2J5dGVzKTsKIAogCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWZpcnN0X2hkcjsKIAloZHJfbGVuID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwpAQCAtMTUyNSw5ICsxNTI5LDkgQEAKIHN0YXRpYyBpbnQgYXRoMTBrX2h0dF9yeF9oYW5kbGVfYW1zZHUoc3RydWN0IGF0aDEwa19odHQgKmh0dCkKIHsKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGh0dC0+YXI7Ci0Jc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXR1czsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzID0gJmh0dC0+cnhfc3RhdHVzOwogCXN0cnVjdCBza19idWZmX2hlYWQgYW1zZHU7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBudW1fbXNkdXM7CiAKIAlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJmFtc2R1KTsKIApAQCAtMTU0OSwxMyArMTU1MywxNCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWF0aDEwa19odHRfcnhfaF9wcGR1KGFyLCAmYW1zZHUsICZyeF9zdGF0dXMsIDB4ZmZmZik7CisJbnVtX21zZHVzID0gc2tiX3F1ZXVlX2xlbigmYW1zZHUpOworCWF0aDEwa19odHRfcnhfaF9wcGR1KGFyLCAmYW1zZHUsIHJ4X3N0YXR1cywgMHhmZmZmKTsKIAlhdGgxMGtfaHR0X3J4X2hfdW5jaGFpbihhciwgJmFtc2R1LCByZXQgPiAwKTsKLQlhdGgxMGtfaHR0X3J4X2hfZmlsdGVyKGFyLCAmYW1zZHUsICZyeF9zdGF0dXMpOwotCWF0aDEwa19odHRfcnhfaF9tcGR1KGFyLCAmYW1zZHUsICZyeF9zdGF0dXMpOwotCWF0aDEwa19odHRfcnhfaF9kZWxpdmVyKGFyLCAmYW1zZHUsICZyeF9zdGF0dXMpOworCWF0aDEwa19odHRfcnhfaF9maWx0ZXIoYXIsICZhbXNkdSwgcnhfc3RhdHVzKTsKKwlhdGgxMGtfaHR0X3J4X2hfbXBkdShhciwgJmFtc2R1LCByeF9zdGF0dXMpOworCWF0aDEwa19odHRfcnhfaF9kZWxpdmVyKGFyLCAmYW1zZHUsIHJ4X3N0YXR1cyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbnVtX21zZHVzOwogfQogCiBzdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3J4X3Byb2NfcnhfaW5kKHN0cnVjdCBhdGgxMGtfaHR0ICpodHQsCkBAIC0xNTc5LDE1ICsxNTg0LDYgQEAKIAkJbXBkdV9jb3VudCArPSBtcGR1X3Jhbmdlc1tpXS5tcGR1X2NvdW50OwogCiAJYXRvbWljX2FkZChtcGR1X2NvdW50LCAmaHR0LT5udW1fbXBkdXNfcmVhZHkpOwotCi0JdGFza2xldF9zY2hlZHVsZSgmaHR0LT50eHJ4X2NvbXBsX3Rhc2spOwotfQotCi1zdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3J4X2ZyYWdfaGFuZGxlcihzdHJ1Y3QgYXRoMTBrX2h0dCAqaHR0KQotewotCWF0b21pY19pbmMoJmh0dC0+bnVtX21wZHVzX3JlYWR5KTsKLQotCXRhc2tsZXRfc2NoZWR1bGUoJmh0dC0+dHhyeF9jb21wbF90YXNrKTsKIH0KIAogc3RhdGljIHZvaWQgYXRoMTBrX2h0dF9yeF90eF9jb21wbF9pbmQoc3RydWN0IGF0aDEwayAqYXIsCkBAIC0xNzcyLDE0ICsxNzY4LDE1IEBACiAJCQlSWF9GTEFHX01NSUNfU1RSSVBQRUQ7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDEwa19odHRfcnhfaF9yeF9vZmZsb2FkKHN0cnVjdCBhdGgxMGsgKmFyLAotCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQorc3RhdGljIGludCBhdGgxMGtfaHR0X3J4X2hfcnhfb2ZmbG9hZChzdHJ1Y3QgYXRoMTBrICphciwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQogewogCXN0cnVjdCBhdGgxMGtfaHR0ICpodHQgPSAmYXItPmh0dDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzID0gJmh0dC0+cnhfc3RhdHVzOwogCXN0cnVjdCBodHRfcnhfb2ZmbG9hZF9tc2R1ICpyeDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNkdTsKIAlzaXplX3Qgb2Zmc2V0OworCWludCBudW1fbXNkdSA9IDA7CiAKIAl3aGlsZSAoKG1zZHUgPSBfX3NrYl9kZXF1ZXVlKGxpc3QpKSkgewogCQkvKiBPZmZsb2FkZWQgZnJhbWVzIGRvbid0IGhhdmUgUnggZGVzY3JpcHRvci4gSW5zdGVhZCB0aGV5IGhhdmUKQEAgLTE4MTksMTAgKzE4MTYsMTIgQEAKIAkJYXRoMTBrX2h0dF9yeF9oX3J4X29mZmxvYWRfcHJvdChzdGF0dXMsIG1zZHUpOwogCQlhdGgxMGtfaHR0X3J4X2hfY2hhbm5lbChhciwgc3RhdHVzLCBOVUxMLCByeC0+dmRldl9pZCk7CiAJCWF0aDEwa19wcm9jZXNzX3J4KGFyLCBzdGF0dXMsIG1zZHUpOworCQludW1fbXNkdSsrOwogCX0KKwlyZXR1cm4gbnVtX21zZHU7CiB9CiAKLXN0YXRpYyB2b2lkIGF0aDEwa19odHRfcnhfaW5fb3JkX2luZChzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgYXRoMTBrX2h0dF9yeF9pbl9vcmRfaW5kKHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBhdGgxMGtfaHR0ICpodHQgPSAmYXItPmh0dDsKIAlzdHJ1Y3QgaHR0X3Jlc3AgKnJlc3AgPSAodm9pZCAqKXNrYi0+ZGF0YTsKQEAgLTE4MzUsMTIgKzE4MzQsMTIgQEAKIAl1OCB0aWQ7CiAJYm9vbCBvZmZsb2FkOwogCWJvb2wgZnJhZzsKLQlpbnQgcmV0OworCWludCByZXQsIG51bV9tc2R1cyA9IDA7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZodHQtPnJ4X3JpbmcubG9jayk7CiAKIAlpZiAoaHR0LT5yeF9jb25mdXNlZCkKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTzsKIAogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHJlc3AtPmhkcikpOwogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHJlc3AtPnJ4X2luX29yZF9pbmQpKTsKQEAgLTE4NTksNyArMTg1OCw3IEBACiAKIAlpZiAoc2tiLT5sZW4gPCBtc2R1X2NvdW50ICogc2l6ZW9mKCpyZXNwLT5yeF9pbl9vcmRfaW5kLm1zZHVfZGVzY3MpKSB7CiAJCWF0aDEwa193YXJuKGFyLCAiZHJvcHBpbmcgaW52YWxpZCBpbiBvcmRlciByeCBpbmRpY2F0aW9uXG4iKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBUaGUgZXZlbnQgY2FuIGRlbGl2ZXIgbW9yZSB0aGFuIDEgQS1NU0RVLiBFYWNoIEEtTVNEVSBpcyBsYXRlcgpAQCAtMTg3MCwxNCArMTg2OSwxNCBAQAogCWlmIChyZXQgPCAwKSB7CiAJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIHBvcCBwYWRkciBsaXN0OiAlZFxuIiwgcmV0KTsKIAkJaHR0LT5yeF9jb25mdXNlZCA9IHRydWU7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAJLyogT2ZmbG9hZGVkIGZyYW1lcyBhcmUgdmVyeSBkaWZmZXJlbnQgYW5kIG5lZWQgdG8gYmUgaGFuZGxlZAogCSAqIHNlcGFyYXRlbHkuCiAJICovCiAJaWYgKG9mZmxvYWQpCi0JCWF0aDEwa19odHRfcnhfaF9yeF9vZmZsb2FkKGFyLCAmbGlzdCk7CisJCW51bV9tc2R1cyA9IGF0aDEwa19odHRfcnhfaF9yeF9vZmZsb2FkKGFyLCAmbGlzdCk7CiAKIAl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmbGlzdCkpIHsKIAkJX19za2JfcXVldWVfaGVhZF9pbml0KCZhbXNkdSk7CkBAIC0xODkwLDYgKzE4ODksNyBAQAogCQkJICogYmV0dGVyIHRvIHJlcG9ydCBzb21ldGhpbmcgdGhhbiBub3RoaW5nIHRob3VnaC4gVGhpcwogCQkJICogc2hvdWxkIHN0aWxsIGdpdmUgYW4gaWRlYSBhYm91dCByeCByYXRlIHRvIHRoZSB1c2VyLgogCQkJICovCisJCQludW1fbXNkdXMgKz0gc2tiX3F1ZXVlX2xlbigmYW1zZHUpOwogCQkJYXRoMTBrX2h0dF9yeF9oX3BwZHUoYXIsICZhbXNkdSwgc3RhdHVzLCB2ZGV2X2lkKTsKIAkJCWF0aDEwa19odHRfcnhfaF9maWx0ZXIoYXIsICZhbXNkdSwgc3RhdHVzKTsKIAkJCWF0aDEwa19odHRfcnhfaF9tcGR1KGFyLCAmYW1zZHUsIHN0YXR1cyk7CkBAIC0xOTAyLDkgKzE5MDIsMTAgQEAKIAkJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIGV4dHJhY3QgYW1zZHU6ICVkXG4iLCByZXQpOwogCQkJaHR0LT5yeF9jb25mdXNlZCA9IHRydWU7CiAJCQlfX3NrYl9xdWV1ZV9wdXJnZSgmbGlzdCk7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KKwlyZXR1cm4gbnVtX21zZHVzOwogfQogCiBzdGF0aWMgdm9pZCBhdGgxMGtfaHR0X3J4X3R4X2ZldGNoX3Jlc3BfaWRfY29uZmlybShzdHJ1Y3QgYXRoMTBrICphciwKQEAgLTIyNjcsNyArMjI2OCw2IEBACiAJfQogCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9UWF9DT01QTF9JTkQ6CiAJCWF0aDEwa19odHRfcnhfdHhfY29tcGxfaW5kKGh0dC0+YXIsIHNrYik7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJmh0dC0+dHhyeF9jb21wbF90YXNrKTsKIAkJYnJlYWs7CiAJY2FzZSBIVFRfVDJIX01TR19UWVBFX1NFQ19JTkQ6IHsKIAkJc3RydWN0IGF0aDEwayAqYXIgPSBodHQtPmFyOwpAQCAtMjI4NCw3ICsyMjg0LDcgQEAKIAljYXNlIEhUVF9UMkhfTVNHX1RZUEVfUlhfRlJBR19JTkQ6IHsKIAkJYXRoMTBrX2RiZ19kdW1wKGFyLCBBVEgxMEtfREJHX0hUVF9EVU1QLCBOVUxMLCAiaHR0IGV2ZW50OiAiLAogCQkJCXNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCQlhdGgxMGtfaHR0X3J4X2ZyYWdfaGFuZGxlcihodHQpOworCQlhdG9taWNfaW5jKCZodHQtPm51bV9tcGR1c19yZWFkeSk7CiAJCWJyZWFrOwogCX0KIAljYXNlIEhUVF9UMkhfTVNHX1RZUEVfVEVTVDoKQEAgLTIzMjAsOCArMjMyMCw3IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIEhUVF9UMkhfTVNHX1RZUEVfUlhfSU5fT1JEX1BBRERSX0lORDogewotCQlza2JfcXVldWVfdGFpbCgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcSwgc2tiKTsKLQkJdGFza2xldF9zY2hlZHVsZSgmaHR0LT50eHJ4X2NvbXBsX3Rhc2spOworCQlfX3NrYl9xdWV1ZV90YWlsKCZodHQtPnJ4X2luX29yZF9jb21wbF9xLCBza2IpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCWNhc2UgSFRUX1QySF9NU0dfVFlQRV9UWF9DUkVESVRfVVBEQVRFX0lORDoKQEAgLTIzNDcsNyArMjM0Niw2IEBACiAJCQlicmVhazsKIAkJfQogCQlza2JfcXVldWVfdGFpbCgmaHR0LT50eF9mZXRjaF9pbmRfcSwgdHhfZmV0Y2hfaW5kKTsKLQkJdGFza2xldF9zY2hlZHVsZSgmaHR0LT50eHJ4X2NvbXBsX3Rhc2spOwogCQlicmVhazsKIAl9CiAJY2FzZSBIVFRfVDJIX01TR19UWVBFX1RYX0ZFVENIX0NPTkZJUk06CkBAIC0yMzc2LDI3ICsyMzc0LDc3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGF0aDEwa19odHRfcnhfcGt0bG9nX2NvbXBsZXRpb25faGFuZGxlcik7CiAKLXN0YXRpYyB2b2lkIGF0aDEwa19odHRfdHhyeF9jb21wbF90YXNrKHVuc2lnbmVkIGxvbmcgcHRyKQoraW50IGF0aDEwa19odHRfdHhyeF9jb21wbF90YXNrKHN0cnVjdCBhdGgxMGsgKmFyLCBpbnQgYnVkZ2V0KQogewotCXN0cnVjdCBhdGgxMGtfaHR0ICpodHQgPSAoc3RydWN0IGF0aDEwa19odHQgKilwdHI7Ci0Jc3RydWN0IGF0aDEwayAqYXIgPSBodHQtPmFyOworCXN0cnVjdCBhdGgxMGtfaHR0ICpodHQgPSAmYXItPmh0dDsKIAlzdHJ1Y3QgaHR0X3R4X2RvbmUgdHhfZG9uZSA9IHt9OwotCXN0cnVjdCBza19idWZmX2hlYWQgcnhfaW5kX3E7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eF9pbmRfcTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IG51bV9tcGR1czsKKwlpbnQgcXVvdGEgPSAwLCBkb25lLCBudW1fcnhfbXNkdXM7CisJYm9vbCByZXNjaGVkX25hcGkgPSBmYWxzZTsKIAotCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcnhfaW5kX3EpOwogCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHhfaW5kX3EpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh0dC0+cnhfaW5fb3JkX2NvbXBsX3EubG9jaywgZmxhZ3MpOwotCXNrYl9xdWV1ZV9zcGxpY2VfaW5pdCgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcSwgJnJ4X2luZF9xKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodHQtPnJ4X2luX29yZF9jb21wbF9xLmxvY2ssIGZsYWdzKTsKKwkvKiBTaW5jZSBpbi1vcmQtaW5kIGNhbiBkZWxpdmVyIG1vcmUgdGhhbiAxIEEtTVNEVSBpbiBzaW5nbGUgZXZlbnQsCisJICogcHJvY2VzcyBpdCBmaXJzdCB0byB1dGlsaXplIGZ1bGwgYXZhaWxhYmxlIHF1b3RhLgorCSAqLworCXdoaWxlIChxdW90YSA8IGJ1ZGdldCkgeworCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZodHQtPnJ4X2luX29yZF9jb21wbF9xKSkKKwkJCWJyZWFrOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmh0dC0+dHhfZmV0Y2hfaW5kX3EubG9jaywgZmxhZ3MpOwotCXNrYl9xdWV1ZV9zcGxpY2VfaW5pdCgmaHR0LT50eF9mZXRjaF9pbmRfcSwgJnR4X2luZF9xKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZodHQtPnR4X2ZldGNoX2luZF9xLmxvY2ssIGZsYWdzKTsKKwkJc2tiID0gX19za2JfZGVxdWV1ZSgmaHR0LT5yeF9pbl9vcmRfY29tcGxfcSk7CisJCWlmICghc2tiKSB7CisJCQlyZXNjaGVkX25hcGkgPSB0cnVlOworCQkJZ290byBleGl0OworCQl9CisKKwkJc3Bpbl9sb2NrX2JoKCZodHQtPnJ4X3JpbmcubG9jayk7CisJCW51bV9yeF9tc2R1cyA9IGF0aDEwa19odHRfcnhfaW5fb3JkX2luZChhciwgc2tiKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmh0dC0+cnhfcmluZy5sb2NrKTsKKwkJaWYgKG51bV9yeF9tc2R1cyA8IDApIHsKKwkJCXJlc2NoZWRfbmFwaSA9IHRydWU7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlpZiAobnVtX3J4X21zZHVzID4gMCkKKwkJCXF1b3RhICs9IG51bV9yeF9tc2R1czsKKworCQlpZiAoKHF1b3RhID4gQVRIMTBLX05BUElfUVVPVEFfTElNSVQpICYmCisJCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZodHQtPnJ4X2luX29yZF9jb21wbF9xKSkgeworCQkJcmVzY2hlZF9uYXBpID0gdHJ1ZTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCXdoaWxlIChxdW90YSA8IGJ1ZGdldCkgeworCQkvKiBubyBtb3JlIGRhdGEgdG8gcmVjZWl2ZSAqLworCQlpZiAoIWF0b21pY19yZWFkKCZodHQtPm51bV9tcGR1c19yZWFkeSkpCisJCQlicmVhazsKKworCQludW1fcnhfbXNkdXMgPSBhdGgxMGtfaHR0X3J4X2hhbmRsZV9hbXNkdShodHQpOworCQlpZiAobnVtX3J4X21zZHVzIDwgMCkgeworCQkJcmVzY2hlZF9uYXBpID0gdHJ1ZTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCXF1b3RhICs9IG51bV9yeF9tc2R1czsKKwkJYXRvbWljX2RlYygmaHR0LT5udW1fbXBkdXNfcmVhZHkpOworCQlpZiAoKHF1b3RhID4gQVRIMTBLX05BUElfUVVPVEFfTElNSVQpICYmCisJCSAgICBhdG9taWNfcmVhZCgmaHR0LT5udW1fbXBkdXNfcmVhZHkpKSB7CisJCQlyZXNjaGVkX25hcGkgPSB0cnVlOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJLyogRnJvbSBOQVBJIGRvY3VtZW50YXRpb246CisJICogIFRoZSBuYXBpIHBvbGwoKSBmdW5jdGlvbiBtYXkgYWxzbyBwcm9jZXNzIFRYIGNvbXBsZXRpb25zLCBpbiB3aGljaAorCSAqICBjYXNlIGlmIGl0IHByb2Nlc3NlcyB0aGUgZW50aXJlIFRYIHJpbmcgdGhlbiBpdCBzaG91bGQgY291bnQgdGhhdAorCSAqICB3b3JrIGFzIHRoZSByZXN0IG9mIHRoZSBidWRnZXQuCisJICovCisJaWYgKChxdW90YSA8IGJ1ZGdldCkgJiYgIWtmaWZvX2lzX2VtcHR5KCZodHQtPnR4ZG9uZV9maWZvKSkKKwkJcXVvdGEgPSBidWRnZXQ7CiAKIAkvKiBrZmlmb19nZXQ6IGNhbGxlZCBvbmx5IHdpdGhpbiB0eHJ4X3Rhc2tsZXQgc28gaXQncyBuZWF0bHkgc2VyaWFsaXplZC4KIAkgKiBGcm9tIGtmaWZvX2dldCgpIGRvY3VtZW50YXRpb246CkBAIC0yNDA2LDI3ICsyNDU0LDI0IEBACiAJd2hpbGUgKGtmaWZvX2dldCgmaHR0LT50eGRvbmVfZmlmbywgJnR4X2RvbmUpKQogCQlhdGgxMGtfdHhyeF90eF91bnJlZihodHQsICZ0eF9kb25lKTsKIAorCWF0aDEwa19tYWNfdHhfcHVzaF9wZW5kaW5nKGFyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZodHQtPnR4X2ZldGNoX2luZF9xLmxvY2ssIGZsYWdzKTsKKwlza2JfcXVldWVfc3BsaWNlX2luaXQoJmh0dC0+dHhfZmV0Y2hfaW5kX3EsICZ0eF9pbmRfcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHR0LT50eF9mZXRjaF9pbmRfcS5sb2NrLCBmbGFncyk7CisKIAl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnR4X2luZF9xKSkpIHsKIAkJYXRoMTBrX2h0dF9yeF90eF9mZXRjaF9pbmQoYXIsIHNrYik7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQogCi0JbnVtX21wZHVzID0gYXRvbWljX3JlYWQoJmh0dC0+bnVtX21wZHVzX3JlYWR5KTsKLQotCXdoaWxlIChudW1fbXBkdXMpIHsKLQkJaWYgKGF0aDEwa19odHRfcnhfaGFuZGxlX2Ftc2R1KGh0dCkpCi0JCQlicmVhazsKLQotCQludW1fbXBkdXMtLTsKLQkJYXRvbWljX2RlYygmaHR0LT5udW1fbXBkdXNfcmVhZHkpOwotCX0KLQotCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmcnhfaW5kX3EpKSkgewotCQlzcGluX2xvY2tfYmgoJmh0dC0+cnhfcmluZy5sb2NrKTsKLQkJYXRoMTBrX2h0dF9yeF9pbl9vcmRfaW5kKGFyLCBza2IpOwotCQlzcGluX3VubG9ja19iaCgmaHR0LT5yeF9yaW5nLmxvY2spOwotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCX0KLQorZXhpdDoKIAlhdGgxMGtfaHR0X3J4X21zZHVfYnVmZl9yZXBsZW5pc2goaHR0KTsKKwkvKiBJbiBjYXNlIG9mIHJ4IGZhaWx1cmUgb3IgbW9yZSBkYXRhIHRvIHJlYWQsIHJlcG9ydCBidWRnZXQKKwkgKiB0byByZXNjaGVkdWxlIE5BUEkgcG9sbAorCSAqLworCWRvbmUgPSByZXNjaGVkX25hcGkgPyBidWRnZXQgOiBxdW90YTsKKworCXJldHVybiBkb25lOwogfQorRVhQT1JUX1NZTUJPTChhdGgxMGtfaHR0X3R4cnhfY29tcGxfdGFzayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHRfdHguYwppbmRleCA3YzA3MmI2Li5hZTViMzNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0X3R4LmMKQEAgLTM5MCw4ICszOTAsNiBAQAogewogCWludCBzaXplOwogCi0JdGFza2xldF9raWxsKCZodHQtPnR4cnhfY29tcGxfdGFzayk7Ci0KIAlpZHJfZm9yX2VhY2goJmh0dC0+cGVuZGluZ190eCwgYXRoMTBrX2h0dF90eF9jbGVhbl91cF9wZW5kaW5nLCBodHQtPmFyKTsKIAlpZHJfZGVzdHJveSgmaHR0LT5wZW5kaW5nX3R4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ody5jCmluZGV4IGY5MDNkNDYuLjY3NWU3NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h3LmMKQEAgLTg1LDcgKzg1LDcgQEAKIAkuY2U3X2Jhc2VfYWRkcmVzcwkJCT0gMHgwMDA0YmMwMCwKIAkvKiBOb3RlOiBxY2E5OXgwIHN1cHBvcnRzIHVwdG8gMTIgQ29weSBFbmdpbmVzLiBPdGhlciB0aGFuIGFkZHJlc3Mgb2YKIAkgKiBDRTAgYW5kIENFMSBubyBvdGhlciBjb3B5IGVuZ2luZSBpcyBkaXJlY3RseSByZWZlcnJlZCBpbiB0aGUgY29kZS4KLQkgKiBJdCBpcyBub3QgcmVhbGx5IG5lY2Nlc3NhcnkgdG8gYXNzaWduIGFkZHJlc3MgZm9yIG5ld2x5IHN1cHBvcnRlZAorCSAqIEl0IGlzIG5vdCByZWFsbHkgbmVjZXNzYXJ5IHRvIGFzc2lnbiBhZGRyZXNzIGZvciBuZXdseSBzdXBwb3J0ZWQKIAkgKiBDRXMgaW4gdGhpcyBhZGRyZXNzIHRhYmxlLgogCSAqCUNvcHkgRW5naW5lCQlBZGRyZXNzCiAJICoJQ0U4CQkJMHgwMDA0YzAwMApAQCAtMjE5LDMgKzIxOSwxNiBAQAogCXN1cnZleS0+dGltZSA9IENDTlRfVE9fTVNFQyhhciwgY2MpOwogCXN1cnZleS0+dGltZV9idXN5ID0gQ0NOVF9UT19NU0VDKGFyLCByY2MpOwogfQorCitjb25zdCBzdHJ1Y3QgYXRoMTBrX2h3X29wcyBxY2E5ODh4X29wcyA9IHsKK307CisKK3N0YXRpYyBpbnQgYXRoMTBrX3FjYTk5eDBfcnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKHN0cnVjdCBodHRfcnhfZGVzYyAqcnhkKQoreworCXJldHVybiBNUyhfX2xlMzJfdG9fY3B1KHJ4ZC0+bXNkdV9lbmQucWNhOTl4MC5pbmZvMSksCisJCSAgUlhfTVNEVV9FTkRfSU5GTzFfTDNfSERSX1BBRCk7Cit9CisKK2NvbnN0IHN0cnVjdCBhdGgxMGtfaHdfb3BzIHFjYTk5eDBfb3BzID0geworCS5yeF9kZXNjX2dldF9sM19wYWRfYnl0ZXMgPSBhdGgxMGtfcWNhOTl4MF9yeF9kZXNjX2dldF9sM19wYWRfYnl0ZXMsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9ody5oCmluZGV4IGUwMTRjZDcuLjYwMzhiNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h3LmgKQEAgLTI4NCw3ICsyODQsNyBAQAogI2RlZmluZSBRQ0FfUkVWXzkzNzcoYXIpICgoYXIpLT5od19yZXYgPT0gQVRIMTBLX0hXX1FDQTkzNzcpCiAjZGVmaW5lIFFDQV9SRVZfNDBYWChhcikgKChhciktPmh3X3JldiA9PSBBVEgxMEtfSFdfUUNBNDAxOSkKIAotLyogS25vd24gcGVjdWxhcml0aWVzOgorLyogS25vd24gcGVjdWxpYXJpdGllczoKICAqICAtIHJhdyBhcHBlYXJzIGluIG53aWZpIGRlY2FwLCByYXcgYW5kIG53aWZpIGFwcGVhciBpbiBldGhlcm5ldCBkZWNhcAogICogIC0gcmF3IGhhdmUgRkNTLCBud2lmaSBkb2Vzbid0CiAgKiAgLSBldGhlcm5ldCBmcmFtZXMgaGF2ZSA4MDIuMTEgaGVhZGVyIGRlY2FwcGVkIGFuZCBwYXJ0cyAoYmFzZSBoZHIsIGNpcGhlcgpAQCAtMzM4LDExICszMzgsNiBAQAogCUFUSDEwS19IV19SQVRFX1JFVjJfQ0NLX1NQXzExTSwKIH07CiAKLWVudW0gYXRoMTBrX2h3XzRhZGRyX3BhZCB7Ci0JQVRIMTBLX0hXXzRBRERSX1BBRF9BRlRFUiwKLQlBVEgxMEtfSFdfNEFERFJfUEFEX0JFRk9SRSwKLX07Ci0KIGVudW0gYXRoMTBrX2h3X2NjX3dyYXBhcm91bmRfdHlwZSB7CiAJQVRIMTBLX0hXX0NDX1dSQVBfRElTQUJMRUQgPSAwLAogCkBAIC0zNjMsNiArMzU4LDgwIEBACiAJQVRIMTBLX0hXX0NDX1dSQVBfU0hJRlRFRF9FQUNIID0gMiwKIH07CiAKK3N0cnVjdCBhdGgxMGtfaHdfcGFyYW1zIHsKKwl1MzIgaWQ7CisJdTE2IGRldl9pZDsKKwljb25zdCBjaGFyICpuYW1lOworCXUzMiBwYXRjaF9sb2FkX2FkZHI7CisJaW50IHVhcnRfcGluOworCXUzMiBvdHBfZXhlX3BhcmFtOworCisJLyogVHlwZSBvZiBodyBjeWNsZSBjb3VudGVyIHdyYXBhcm91bmQgbG9naWMsIGZvciBtb3JlIGluZm8KKwkgKiByZWZlciBlbnVtIGF0aDEwa19od19jY193cmFwYXJvdW5kX3R5cGUuCisJICovCisJZW51bSBhdGgxMGtfaHdfY2Nfd3JhcGFyb3VuZF90eXBlIGNjX3dyYXBhcm91bmRfdHlwZTsKKworCS8qIFNvbWUgb2YgY2hpcCBleHBlY3RzIGZyYWdtZW50IGRlc2NyaXB0b3IgdG8gYmUgY29udGludW91cworCSAqIG1lbW9yeSBmb3IgYW55IFRYIG9wZXJhdGlvbi4gU2V0IGNvbnRpbnVvdXNfZnJhZ19kZXNjIGZsYWcKKwkgKiBmb3IgdGhlIGhhcmR3YXJlIHdoaWNoIGhhdmUgc3VjaCByZXF1aXJlbWVudC4KKwkgKi8KKwlib29sIGNvbnRpbnVvdXNfZnJhZ19kZXNjOworCisJLyogQ0NLIGhhcmR3YXJlIHJhdGUgdGFibGUgbWFwcGluZyBmb3IgdGhlIG5ld2VyIGNoaXBzZXRzCisJICogbGlrZSBRQ0E5OVgwLCBRQ0E0MDE5IGdvdCByZXZpc2VkLiBUaGUgQ0NLIGgvdyByYXRlIHZhbHVlcworCSAqIGFyZSBpbiBhIHByb3BlciBvcmRlciB3aXRoIHJlc3BlY3QgdG8gdGhlIHJhdGUvcHJlYW1ibGUKKwkgKi8KKwlib29sIGNja19yYXRlX21hcF9yZXYyOworCisJdTMyIGNoYW5uZWxfY291bnRlcnNfZnJlcV9oejsKKworCS8qIE1nbXQgdHggZGVzY3JpcHRvcnMgdGhyZXNob2xkIGZvciBsaW1pdGluZyBwcm9iZSByZXNwb25zZQorCSAqIGZyYW1lcy4KKwkgKi8KKwl1MzIgbWF4X3Byb2JlX3Jlc3BfZGVzY190aHJlczsKKworCXUzMiB0eF9jaGFpbl9tYXNrOworCXUzMiByeF9jaGFpbl9tYXNrOworCXUzMiBtYXhfc3BhdGlhbF9zdHJlYW07CisJdTMyIGNhbF9kYXRhX2xlbjsKKworCXN0cnVjdCBhdGgxMGtfaHdfcGFyYW1zX2Z3IHsKKwkJY29uc3QgY2hhciAqZGlyOworCQljb25zdCBjaGFyICpib2FyZDsKKwkJc2l6ZV90IGJvYXJkX3NpemU7CisJCXNpemVfdCBib2FyZF9leHRfc2l6ZTsKKwl9IGZ3OworCisJLyogcWNhOTl4MCBmYW1pbHkgY2hpcHMgZGVsaXZlciBicm9hZGNhc3QvbXVsdGljYXN0IG1hbmFnZW1lbnQKKwkgKiBmcmFtZXMgZW5jcnlwdGVkIGFuZCBleHBlY3Qgc29mdHdhcmUgZG8gZGVjcnlwdGlvbi4KKwkgKi8KKwlib29sIHN3X2RlY3J5cHRfbWNhc3RfbWdtdDsKKworCWNvbnN0IHN0cnVjdCBhdGgxMGtfaHdfb3BzICpod19vcHM7CisKKwkvKiBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3IgYWxpZ25tZW50IGluIHJ4X2hkcl9zdGF0dXMgb2YgcnggZGVzYy4gKi8KKwlpbnQgZGVjYXBfYWxpZ25fYnl0ZXM7Cit9OworCitzdHJ1Y3QgaHR0X3J4X2Rlc2M7CisKKy8qIERlZmluZXMgbmVlZGVkIGZvciBSeCBkZXNjcmlwdG9yIGFic3RyYWN0aW9uICovCitzdHJ1Y3QgYXRoMTBrX2h3X29wcyB7CisJaW50ICgqcnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKShzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZCk7Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IGF0aDEwa19od19vcHMgcWNhOTg4eF9vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IGF0aDEwa19od19vcHMgcWNhOTl4MF9vcHM7CisKK3N0YXRpYyBpbmxpbmUgaW50CithdGgxMGtfcnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKHN0cnVjdCBhdGgxMGtfaHdfcGFyYW1zICpodywKKwkJCQlzdHJ1Y3QgaHR0X3J4X2Rlc2MgKnJ4ZCkKK3sKKwlpZiAoaHctPmh3X29wcy0+cnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKQorCQlyZXR1cm4gaHctPmh3X29wcy0+cnhfZGVzY19nZXRfbDNfcGFkX2J5dGVzKHJ4ZCk7CisJcmV0dXJuIDA7Cit9CisKIC8qIFRhcmdldCBzcGVjaWZpYyBkZWZpbmVzIGZvciBNQUlOIGZpcm13YXJlICovCiAjZGVmaW5lIFRBUkdFVF9OVU1fVkRFVlMJCQk4CiAjZGVmaW5lIFRBUkdFVF9OVU1fUEVFUl9BU1QJCQkyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9tYWMuYwppbmRleCAwYmJkMGEwLi43NjI5N2Q2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvbWFjLmMKQEAgLTgyNCw3ICs4MjQsNyBAQAogCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXItPnBlZXJfbWFwKTsgaSsrKSB7CiAJCQlpZiAoYXItPnBlZXJfbWFwW2ldID09IHBlZXIpIHsKLQkJCQlhdGgxMGtfd2FybihhciwgInJlbW92aW5nIHN0YWxlIHBlZXJfbWFwIGVudHJ5IGZvciAlcE0gKHB0ciAlcCBpZHggJWQpXG4iLAorCQkJCWF0aDEwa193YXJuKGFyLCAicmVtb3Zpbmcgc3RhbGUgcGVlcl9tYXAgZW50cnkgZm9yICVwTSAocHRyICVwSyBpZHggJWQpXG4iLAogCQkJCQkgICAgcGVlci0+YWRkciwgcGVlciwgaSk7CiAJCQkJYXItPnBlZXJfbWFwW2ldID0gTlVMTDsKIAkJCX0KQEAgLTI3OTMsNyArMjc5Myw3IEBACiAKIAlyZXQgPSBhdGgxMGtfd21pX3ZkZXZfZG93bihhciwgYXJ2aWYtPnZkZXZfaWQpOwogCWlmIChyZXQpCi0JCWF0aDEwa193YXJuKGFyLCAiZmFpZWxkIHRvIGRvd24gdmRldiAlaTogJWRcbiIsCisJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIGRvd24gdmRldiAlaTogJWRcbiIsCiAJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAKIAlhcnZpZi0+ZGVmX3dlcF9rZXlfaWR4ID0gLTE7CkBAIC0zMjU1LDYgKzMyNTUsOCBAQAogCWlmIChhci0+aHR0LnRhcmdldF92ZXJzaW9uX21ham9yIDwgMyAmJgogCSAgICAoaWVlZTgwMjExX2lzX251bGxmdW5jKGZjKSB8fCBpZWVlODAyMTFfaXNfcW9zX251bGxmdW5jKGZjKSkgJiYKIAkgICAgIXRlc3RfYml0KEFUSDEwS19GV19GRUFUVVJFX0hBU19XTUlfTUdNVF9UWCwKKwkJICAgICAgYXItPnJ1bm5pbmdfZnctPmZ3X2ZpbGUuZndfZmVhdHVyZXMpICYmCisJICAgICF0ZXN0X2JpdChBVEgxMEtfRldfRkVBVFVSRV9TS0lQX05VTExfRlVOQ19XQVIsCiAJCSAgICAgIGFyLT5ydW5uaW5nX2Z3LT5md19maWxlLmZ3X2ZlYXR1cmVzKSkKIAkJcmV0dXJuIEFUSDEwS19IV19UWFJYX01HTVQ7CiAKQEAgLTM1MjQsNyArMzUyNiw3IEBACiAKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1RYX09GRkNIQU4pIHsKIAkJaWYgKCFhdGgxMGtfbWFjX3R4X2ZybV9oYXNfZnJlcShhcikpIHsKLQkJCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUFDLCAicXVldWVkIG9mZmNoYW5uZWwgc2tiICVwXG4iLAorCQkJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsICJxdWV1ZWQgb2ZmY2hhbm5lbCBza2IgJXBLXG4iLAogCQkJCSAgIHNrYik7CiAKIAkJCXNrYl9xdWV1ZV90YWlsKCZhci0+b2ZmY2hhbl90eF9xdWV1ZSwgc2tiKTsKQEAgLTM1ODYsNyArMzU4OCw3IEBACiAKIAkJbXV0ZXhfbG9jaygmYXItPmNvbmZfbXV0ZXgpOwogCi0JCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUFDLCAibWFjIG9mZmNoYW5uZWwgc2tiICVwXG4iLAorCQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX01BQywgIm1hYyBvZmZjaGFubmVsIHNrYiAlcEtcbiIsCiAJCQkgICBza2IpOwogCiAJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKQEAgLTM2NDMsNyArMzY0NSw3IEBACiAJCXRpbWVfbGVmdCA9CiAJCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYXItPm9mZmNoYW5fdHhfY29tcGxldGVkLCAzICogSFopOwogCQlpZiAodGltZV9sZWZ0ID09IDApCi0JCQlhdGgxMGtfd2FybihhciwgInRpbWVkIG91dCB3YWl0aW5nIGZvciBvZmZjaGFubmVsIHNrYiAlcFxuIiwKKwkJCWF0aDEwa193YXJuKGFyLCAidGltZWQgb3V0IHdhaXRpbmcgZm9yIG9mZmNoYW5uZWwgc2tiICVwS1xuIiwKIAkJCQkgICAgc2tiKTsKIAogCQlpZiAoIXBlZXIgJiYgdG1wX3BlZXJfY3JlYXRlZCkgewpAQCAtMzc3Nyw3ICszNzc5LDkgQEAKIAllbnVtIGF0aDEwa19od190eHJ4X21vZGUgdHhtb2RlOwogCWVudW0gYXRoMTBrX21hY190eF9wYXRoIHR4cGF0aDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAJc2l6ZV90IHNrYl9sZW47CisJYm9vbCBpc19tZ210LCBpc19wcmVzcDsKIAlpbnQgcmV0OwogCiAJc3Bpbl9sb2NrX2JoKCZhci0+aHR0LnR4X2xvY2spOwpAQCAtMzgwMSw2ICszODA1LDIyIEBACiAJc2tiX2xlbiA9IHNrYi0+bGVuOwogCXR4bW9kZSA9IGF0aDEwa19tYWNfdHhfaF9nZXRfdHhtb2RlKGFyLCB2aWYsIHN0YSwgc2tiKTsKIAl0eHBhdGggPSBhdGgxMGtfbWFjX3R4X2hfZ2V0X3R4cGF0aChhciwgc2tiLCB0eG1vZGUpOworCWlzX21nbXQgPSAodHhwYXRoID09IEFUSDEwS19NQUNfVFhfSFRUX01HTVQpOworCisJaWYgKGlzX21nbXQpIHsKKwkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCQlpc19wcmVzcCA9IGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGhkci0+ZnJhbWVfY29udHJvbCk7CisKKwkJc3Bpbl9sb2NrX2JoKCZhci0+aHR0LnR4X2xvY2spOworCQlyZXQgPSBhdGgxMGtfaHR0X3R4X21nbXRfaW5jX3BlbmRpbmcoaHR0LCBpc19tZ210LCBpc19wcmVzcCk7CisKKwkJaWYgKHJldCkgeworCQkJYXRoMTBrX2h0dF90eF9kZWNfcGVuZGluZyhodHQpOworCQkJc3Bpbl91bmxvY2tfYmgoJmFyLT5odHQudHhfbG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXNwaW5fdW5sb2NrX2JoKCZhci0+aHR0LnR4X2xvY2spOworCX0KIAogCXJldCA9IGF0aDEwa19tYWNfdHgoYXIsIHZpZiwgc3RhLCB0eG1vZGUsIHR4cGF0aCwgc2tiKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewpAQCAtMzgwOCw2ICszODI4LDggQEAKIAogCQlzcGluX2xvY2tfYmgoJmFyLT5odHQudHhfbG9jayk7CiAJCWF0aDEwa19odHRfdHhfZGVjX3BlbmRpbmcoaHR0KTsKKwkJaWYgKGlzX21nbXQpCisJCQlhdGgxMGtfaHR0X3R4X21nbXRfZGVjX3BlbmRpbmcoaHR0KTsKIAkJc3Bpbl91bmxvY2tfYmgoJmFyLT5odHQudHhfbG9jayk7CiAKIAkJcmV0dXJuIHJldDsKQEAgLTM4OTQsNyArMzkxNiw3IEBACiAJCWFyLT5zY2FuLnJvY19mcmVxID0gMDsKIAkJYXRoMTBrX29mZmNoYW5fdHhfcHVyZ2UoYXIpOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZhci0+c2Nhbi50aW1lb3V0KTsKLQkJY29tcGxldGVfYWxsKCZhci0+c2Nhbi5jb21wbGV0ZWQpOworCQljb21wbGV0ZSgmYXItPnNjYW4uY29tcGxldGVkKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtNDEwMCwxMyArNDEyMiwyOSBAQAogewogCXN0cnVjdCBhdGgxMGsgKmFyID0gaHctPnByaXY7CiAJc3RydWN0IGF0aDEwa190eHEgKmFydHhxID0gKHZvaWQgKil0eHEtPmRydl9wcml2OworCXN0cnVjdCBpZWVlODAyMTFfdHhxICpmX3R4cTsKKwlzdHJ1Y3QgYXRoMTBrX3R4cSAqZl9hcnR4cTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgbWF4ID0gMTY7CiAKIAlzcGluX2xvY2tfYmgoJmFyLT50eHFzX2xvY2spOwogCWlmIChsaXN0X2VtcHR5KCZhcnR4cS0+bGlzdCkpCiAJCWxpc3RfYWRkX3RhaWwoJmFydHhxLT5saXN0LCAmYXItPnR4cXMpOworCisJZl9hcnR4cSA9IGxpc3RfZmlyc3RfZW50cnkoJmFyLT50eHFzLCBzdHJ1Y3QgYXRoMTBrX3R4cSwgbGlzdCk7CisJZl90eHEgPSBjb250YWluZXJfb2YoKHZvaWQgKilmX2FydHhxLCBzdHJ1Y3QgaWVlZTgwMjExX3R4cSwgZHJ2X3ByaXYpOworCWxpc3RfZGVsX2luaXQoJmZfYXJ0eHEtPmxpc3QpOworCisJd2hpbGUgKGF0aDEwa19tYWNfdHhfY2FuX3B1c2goaHcsIGZfdHhxKSAmJiBtYXgtLSkgeworCQlyZXQgPSBhdGgxMGtfbWFjX3R4X3B1c2hfdHhxKGh3LCBmX3R4cSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisJaWYgKHJldCAhPSAtRU5PRU5UKQorCQlsaXN0X2FkZF90YWlsKCZmX2FydHhxLT5saXN0LCAmYXItPnR4cXMpOwogCXNwaW5fdW5sb2NrX2JoKCZhci0+dHhxc19sb2NrKTsKIAotCWF0aDEwa19tYWNfdHhfcHVzaF9wZW5kaW5nKGFyKTsKKwlhdGgxMGtfaHR0X3R4X3R4cV91cGRhdGUoaHcsIGZfdHhxKTsKIAlhdGgxMGtfaHR0X3R4X3R4cV91cGRhdGUoaHcsIHR4cSk7CiB9CiAKQEAgLTUxODYsNyArNTIyNCw3IEBACiAKIAlyZXQgPSBhdGgxMGtfbW9uaXRvcl9yZWNhbGMoYXIpOwogCWlmIChyZXQpCi0JCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIHJlY2FsYyBtb250aW9yOiAlZFxuIiwgcmV0KTsKKwkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gcmVjYWxjIG1vbml0b3I6ICVkXG4iLCByZXQpOwogCiAJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CiB9CkBAIC01OTg0LDggKzYwMjIsOCBAQAogCQkgKiBFeGlzdGluZyBzdGF0aW9uIGRlbGV0aW9uLgogCQkgKi8KIAkJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsCi0JCQkgICAibWFjIHZkZXYgJWQgcGVlciBkZWxldGUgJXBNIChzdGEgZ29uZSlcbiIsCi0JCQkgICBhcnZpZi0+dmRldl9pZCwgc3RhLT5hZGRyKTsKKwkJCSAgICJtYWMgdmRldiAlZCBwZWVyIGRlbGV0ZSAlcE0gc3RhICVwSyAoc3RhIGdvbmUpXG4iLAorCQkJICAgYXJ2aWYtPnZkZXZfaWQsIHN0YS0+YWRkciwgc3RhKTsKIAogCQlyZXQgPSBhdGgxMGtfcGVlcl9kZWxldGUoYXIsIGFydmlmLT52ZGV2X2lkLCBzdGEtPmFkZHIpOwogCQlpZiAocmV0KQpAQCAtNjAwMSw3ICs2MDM5LDcgQEAKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKHBlZXItPnN0YSA9PSBzdGEpIHsKLQkJCQlhdGgxMGtfd2FybihhciwgImZvdW5kIHN0YSBwZWVyICVwTSAocHRyICVwIGlkICVkKSBlbnRyeSBvbiB2ZGV2ICVpIGFmdGVyIGl0IHdhcyBzdXBwb3NlZGx5IHJlbW92ZWRcbiIsCisJCQkJYXRoMTBrX3dhcm4oYXIsICJmb3VuZCBzdGEgcGVlciAlcE0gKHB0ciAlcEsgaWQgJWQpIGVudHJ5IG9uIHZkZXYgJWkgYWZ0ZXIgaXQgd2FzIHN1cHBvc2VkbHkgcmVtb3ZlZFxuIiwKIAkJCQkJICAgIHN0YS0+YWRkciwgcGVlciwgaSwgYXJ2aWYtPnZkZXZfaWQpOwogCQkJCXBlZXItPnN0YSA9IE5VTEw7CiAKQEAgLTY1MzgsNyArNjU3Niw3IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlhdGgxMGtfbWFjX3VwZGF0ZV9ic3NfY2hhbl9zdXJ2ZXkoYXIsIHN1cnZleS0+Y2hhbm5lbCk7CisJYXRoMTBrX21hY191cGRhdGVfYnNzX2NoYW5fc3VydmV5KGFyLCAmc2JhbmQtPmNoYW5uZWxzW2lkeF0pOwogCiAJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKIAltZW1jcHkoc3VydmV5LCBhcl9zdXJ2ZXksIHNpemVvZigqc3VydmV5KSk7CkBAIC03MTM0LDcgKzcxNzIsNyBAQAogCXN0cnVjdCBhdGgxMGsgKmFyID0gaHctPnByaXY7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX01BQywKLQkJICAgIm1hYyBjaGFuY3R4IGFkZCBmcmVxICVodSB3aWR0aCAlZCBwdHIgJXBcbiIsCisJCSAgICJtYWMgY2hhbmN0eCBhZGQgZnJlcSAlaHUgd2lkdGggJWQgcHRyICVwS1xuIiwKIAkJICAgY3R4LT5kZWYuY2hhbi0+Y2VudGVyX2ZyZXEsIGN0eC0+ZGVmLndpZHRoLCBjdHgpOwogCiAJbXV0ZXhfbG9jaygmYXItPmNvbmZfbXV0ZXgpOwpAQCAtNzE1OCw3ICs3MTk2LDcgQEAKIAlzdHJ1Y3QgYXRoMTBrICphciA9IGh3LT5wcml2OwogCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsCi0JCSAgICJtYWMgY2hhbmN0eCByZW1vdmUgZnJlcSAlaHUgd2lkdGggJWQgcHRyICVwXG4iLAorCQkgICAibWFjIGNoYW5jdHggcmVtb3ZlIGZyZXEgJWh1IHdpZHRoICVkIHB0ciAlcEtcbiIsCiAJCSAgIGN0eC0+ZGVmLmNoYW4tPmNlbnRlcl9mcmVxLCBjdHgtPmRlZi53aWR0aCwgY3R4KTsKIAogCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKQEAgLTcyMjMsNyArNzI2MSw3IEBACiAJbXV0ZXhfbG9jaygmYXItPmNvbmZfbXV0ZXgpOwogCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsCi0JCSAgICJtYWMgY2hhbmN0eCBjaGFuZ2UgZnJlcSAlaHUgd2lkdGggJWQgcHRyICVwIGNoYW5nZWQgJXhcbiIsCisJCSAgICJtYWMgY2hhbmN0eCBjaGFuZ2UgZnJlcSAlaHUgd2lkdGggJWQgcHRyICVwSyBjaGFuZ2VkICV4XG4iLAogCQkgICBjdHgtPmRlZi5jaGFuLT5jZW50ZXJfZnJlcSwgY3R4LT5kZWYud2lkdGgsIGN0eCwgY2hhbmdlZCk7CiAKIAkvKiBUaGlzIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuIGJlY2F1c2UgY2hhbm5lbCBzd2l0Y2hpbmcgc2hvdWxkIHVzZQpAQCAtNzI4MSw3ICs3MzE5LDcgQEAKIAltdXRleF9sb2NrKCZhci0+Y29uZl9tdXRleCk7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX01BQywKLQkJICAgIm1hYyBjaGFuY3R4IGFzc2lnbiBwdHIgJXAgdmRldl9pZCAlaVxuIiwKKwkJICAgIm1hYyBjaGFuY3R4IGFzc2lnbiBwdHIgJXBLIHZkZXZfaWQgJWlcbiIsCiAJCSAgIGN0eCwgYXJ2aWYtPnZkZXZfaWQpOwogCiAJaWYgKFdBUk5fT04oYXJ2aWYtPmlzX3N0YXJ0ZWQpKSB7CkBAIC03MzQyLDcgKzczODAsNyBAQAogCW11dGV4X2xvY2soJmFyLT5jb25mX211dGV4KTsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUFDLAotCQkgICAibWFjIGNoYW5jdHggdW5hc3NpZ24gcHRyICVwIHZkZXZfaWQgJWlcbiIsCisJCSAgICJtYWMgY2hhbmN0eCB1bmFzc2lnbiBwdHIgJXBLIHZkZXZfaWQgJWlcbiIsCiAJCSAgIGN0eCwgYXJ2aWYtPnZkZXZfaWQpOwogCiAJV0FSTl9PTighYXJ2aWYtPmlzX3N0YXJ0ZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmMKaW5kZXggOWEyMmM0Ny4uMDQ1N2UzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3BjaS5jCkBAIC0xNTA2LDEyICsxNTA2LDEwIEBACiAJYXRoMTBrX2NlX3Blcl9lbmdpbmVfc2VydmljZShhciwgcGlwZSk7CiB9CiAKLXZvaWQgYXRoMTBrX3BjaV9raWxsX3Rhc2tsZXQoc3RydWN0IGF0aDEwayAqYXIpCitzdGF0aWMgdm9pZCBhdGgxMGtfcGNpX3J4X3JldHJ5X3N5bmMoc3RydWN0IGF0aDEwayAqYXIpCiB7CiAJc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7CiAKLQl0YXNrbGV0X2tpbGwoJmFyX3BjaS0+aW50cl90cSk7Ci0KIAlkZWxfdGltZXJfc3luYygmYXJfcGNpLT5yeF9wb3N0X3JldHJ5KTsKIH0KIApAQCAtMTU3MCw3ICsxNTY4LDcgQEAKIAkJCQkJCSB1bF9waXBlLCBkbF9waXBlKTsKIH0KIAotc3RhdGljIHZvaWQgYXRoMTBrX3BjaV9pcnFfbXNpX2Z3X21hc2soc3RydWN0IGF0aDEwayAqYXIpCit2b2lkIGF0aDEwa19wY2lfaXJxX21zaV9md19tYXNrKHN0cnVjdCBhdGgxMGsgKmFyKQogewogCXUzMiB2YWw7CiAKQEAgLTE2OTMsMTQgKzE2OTEsMTIgQEAKIHN0YXRpYyB2b2lkIGF0aDEwa19wY2lfdHhfcGlwZV9jbGVhbnVwKHN0cnVjdCBhdGgxMGtfcGNpX3BpcGUgKnBjaV9waXBlKQogewogCXN0cnVjdCBhdGgxMGsgKmFyOwotCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2k7CiAJc3RydWN0IGF0aDEwa19jZV9waXBlICpjZV9waXBlOwogCXN0cnVjdCBhdGgxMGtfY2VfcmluZyAqY2VfcmluZzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBpOwogCiAJYXIgPSBwY2lfcGlwZS0+aGlmX2NlX3N0YXRlOwotCWFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7CiAJY2VfcGlwZSA9IHBjaV9waXBlLT5jZV9oZGw7CiAJY2VfcmluZyA9IGNlX3BpcGUtPnNyY19yaW5nOwogCkBAIC0xNzUzLDcgKzE3NDksNyBAQAogCiB2b2lkIGF0aDEwa19wY2lfZmx1c2goc3RydWN0IGF0aDEwayAqYXIpCiB7Ci0JYXRoMTBrX3BjaV9raWxsX3Rhc2tsZXQoYXIpOworCWF0aDEwa19wY2lfcnhfcmV0cnlfc3luYyhhcik7CiAJYXRoMTBrX3BjaV9idWZmZXJfY2xlYW51cChhcik7CiB9CiAKQEAgLTE3ODAsNiArMTc3Niw4IEBACiAJYXRoMTBrX3BjaV9pcnFfZGlzYWJsZShhcik7CiAJYXRoMTBrX3BjaV9pcnFfc3luYyhhcik7CiAJYXRoMTBrX3BjaV9mbHVzaChhcik7CisJbmFwaV9zeW5jaHJvbml6ZSgmYXItPm5hcGkpOworCW5hcGlfZGlzYWJsZSgmYXItPm5hcGkpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFyX3BjaS0+cHNfbG9jaywgZmxhZ3MpOwogCVdBUk5fT04oYXJfcGNpLT5wc193YWtlX3JlZmNvdW50ID4gMCk7CkBAIC0yNTMzLDYgKzI1MzEsNyBAQAogCQlhdGgxMGtfZXJyKGFyLCAiY291bGQgbm90IHdha2UgdXAgdGFyZ2V0IENQVTogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXJyX2NlOwogCX0KKwluYXBpX2VuYWJsZSgmYXItPm5hcGkpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTI3MjUsNyArMjcyNCw3IEBACiAJcmV0dXJuIDA7CiAKIGVycl9mcmVlOgotCWtmcmVlKGRhdGEpOworCWtmcmVlKGNhbGRhdGEpOwogCiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0yNzcyLDM1ICsyNzcxLDUzIEBACiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKLQlpZiAoYXJfcGNpLT5vcGVyX2lycV9tb2RlID09IEFUSDEwS19QQ0lfSVJRX0xFR0FDWSkgewotCQlpZiAoIWF0aDEwa19wY2lfaXJxX3BlbmRpbmcoYXIpKQotCQkJcmV0dXJuIElSUV9OT05FOworCWlmICgoYXJfcGNpLT5vcGVyX2lycV9tb2RlID09IEFUSDEwS19QQ0lfSVJRX0xFR0FDWSkgJiYKKwkgICAgIWF0aDEwa19wY2lfaXJxX3BlbmRpbmcoYXIpKQorCQlyZXR1cm4gSVJRX05PTkU7CiAKLQkJYXRoMTBrX3BjaV9kaXNhYmxlX2FuZF9jbGVhcl9sZWdhY3lfaXJxKGFyKTsKLQl9Ci0KLQl0YXNrbGV0X3NjaGVkdWxlKCZhcl9wY2ktPmludHJfdHEpOworCWF0aDEwa19wY2lfZGlzYWJsZV9hbmRfY2xlYXJfbGVnYWN5X2lycShhcik7CisJYXRoMTBrX3BjaV9pcnFfbXNpX2Z3X21hc2soYXIpOworCW5hcGlfc2NoZWR1bGUoJmFyLT5uYXBpKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZvaWQgYXRoMTBrX3BjaV90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyBpbnQgYXRoMTBrX3BjaV9uYXBpX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpjdHgsIGludCBidWRnZXQpCiB7Ci0Jc3RydWN0IGF0aDEwayAqYXIgPSAoc3RydWN0IGF0aDEwayAqKWRhdGE7Ci0Jc3RydWN0IGF0aDEwa19wY2kgKmFyX3BjaSA9IGF0aDEwa19wY2lfcHJpdihhcik7CisJc3RydWN0IGF0aDEwayAqYXIgPSBjb250YWluZXJfb2YoY3R4LCBzdHJ1Y3QgYXRoMTBrLCBuYXBpKTsKKwlpbnQgZG9uZSA9IDA7CiAKIAlpZiAoYXRoMTBrX3BjaV9oYXNfZndfY3Jhc2hlZChhcikpIHsKLQkJYXRoMTBrX3BjaV9pcnFfZGlzYWJsZShhcik7CiAJCWF0aDEwa19wY2lfZndfY3Jhc2hlZF9jbGVhcihhcik7CiAJCWF0aDEwa19wY2lfZndfY3Jhc2hlZF9kdW1wKGFyKTsKLQkJcmV0dXJuOworCQluYXBpX2NvbXBsZXRlKGN0eCk7CisJCXJldHVybiBkb25lOwogCX0KIAogCWF0aDEwa19jZV9wZXJfZW5naW5lX3NlcnZpY2VfYW55KGFyKTsKIAotCS8qIFJlLWVuYWJsZSBsZWdhY3kgaXJxIHRoYXQgd2FzIGRpc2FibGVkIGluIHRoZSBpcnEgaGFuZGxlciAqLwotCWlmIChhcl9wY2ktPm9wZXJfaXJxX21vZGUgPT0gQVRIMTBLX1BDSV9JUlFfTEVHQUNZKQorCWRvbmUgPSBhdGgxMGtfaHR0X3R4cnhfY29tcGxfdGFzayhhciwgYnVkZ2V0KTsKKworCWlmIChkb25lIDwgYnVkZ2V0KSB7CisJCW5hcGlfY29tcGxldGUoY3R4KTsKKwkJLyogSW4gY2FzZSBvZiBNU0ksIGl0IGlzIHBvc3NpYmxlIHRoYXQgaW50ZXJydXB0cyBhcmUgcmVjZWl2ZWQKKwkJICogd2hpbGUgTkFQSSBwb2xsIGlzIGlucHJvZ3Jlc3MuIFNvIHBlbmRpbmcgaW50ZXJydXB0cyB0aGF0IGFyZQorCQkgKiByZWNlaXZlZCBhZnRlciBwcm9jZXNzaW5nIGFsbCBjb3B5IGVuZ2luZSBwaXBlcyBieSBOQVBJIHBvbGwKKwkJICogd2lsbCBub3QgYmUgaGFuZGxlZCBhZ2Fpbi4gVGhpcyBpcyBjYXVzaW5nIGZhaWx1cmUgdG8KKwkJICogY29tcGxldGUgYm9vdCBzZXF1ZW5jZSBpbiB4ODYgcGxhdGZvcm0uIFNvIGJlZm9yZSBlbmFibGluZworCQkgKiBpbnRlcnJ1cHRzIHNhZmVyIHRvIGNoZWNrIGZvciBwZW5kaW5nIGludGVycnVwdHMgZm9yCisJCSAqIGltbWVkaWF0ZSBzZXJ2aWNpbmcuCisJCSAqLworCQlpZiAoQ0VfSU5URVJSVVBUX1NVTU1BUlkoYXIpKSB7CisJCQluYXBpX3Jlc2NoZWR1bGUoY3R4KTsKKwkJCWdvdG8gb3V0OworCQl9CiAJCWF0aDEwa19wY2lfZW5hYmxlX2xlZ2FjeV9pcnEoYXIpOworCQlhdGgxMGtfcGNpX2lycV9tc2lfZndfdW5tYXNrKGFyKTsKKwl9CisKK291dDoKKwlyZXR1cm4gZG9uZTsKIH0KIAogc3RhdGljIGludCBhdGgxMGtfcGNpX3JlcXVlc3RfaXJxX21zaShzdHJ1Y3QgYXRoMTBrICphcikKQEAgLTI4NTgsMTEgKzI4NzUsMTAgQEAKIAlmcmVlX2lycShhcl9wY2ktPnBkZXYtPmlycSwgYXIpOwogfQogCi12b2lkIGF0aDEwa19wY2lfaW5pdF9pcnFfdGFza2xldHMoc3RydWN0IGF0aDEwayAqYXIpCit2b2lkIGF0aDEwa19wY2lfaW5pdF9uYXBpKHN0cnVjdCBhdGgxMGsgKmFyKQogewotCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOwotCi0JdGFza2xldF9pbml0KCZhcl9wY2ktPmludHJfdHEsIGF0aDEwa19wY2lfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpYXIpOworCW5ldGlmX25hcGlfYWRkKCZhci0+bmFwaV9kZXYsICZhci0+bmFwaSwgYXRoMTBrX3BjaV9uYXBpX3BvbGwsCisJCSAgICAgICBBVEgxMEtfTkFQSV9CVURHRVQpOwogfQogCiBzdGF0aWMgaW50IGF0aDEwa19wY2lfaW5pdF9pcnEoc3RydWN0IGF0aDEwayAqYXIpCkBAIC0yODcwLDcgKzI4ODYsNyBAQAogCXN0cnVjdCBhdGgxMGtfcGNpICphcl9wY2kgPSBhdGgxMGtfcGNpX3ByaXYoYXIpOwogCWludCByZXQ7CiAKLQlhdGgxMGtfcGNpX2luaXRfaXJxX3Rhc2tsZXRzKGFyKTsKKwlhdGgxMGtfcGNpX2luaXRfbmFwaShhcik7CiAKIAlpZiAoYXRoMTBrX3BjaV9pcnFfbW9kZSAhPSBBVEgxMEtfUENJX0lSUV9BVVRPKQogCQlhdGgxMGtfaW5mbyhhciwgImxpbWl0aW5nIGlycSBtb2RlIHRvOiAlZFxuIiwKQEAgLTMwNjIsNyArMzA3OCw3IEBACiAJCWdvdG8gZXJyX21hc3RlcjsKIAl9CiAKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0JPT1QsICJib290IHBjaV9tZW0gMHglcFxuIiwgYXJfcGNpLT5tZW0pOworCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwgImJvb3QgcGNpX21lbSAweCVwS1xuIiwgYXJfcGNpLT5tZW0pOwogCXJldHVybiAwOwogCiBlcnJfbWFzdGVyOgpAQCAtMzEzMSw3ICszMTQ3LDggQEAKIAogdm9pZCBhdGgxMGtfcGNpX3JlbGVhc2VfcmVzb3VyY2Uoc3RydWN0IGF0aDEwayAqYXIpCiB7Ci0JYXRoMTBrX3BjaV9raWxsX3Rhc2tsZXQoYXIpOworCWF0aDEwa19wY2lfcnhfcmV0cnlfc3luYyhhcik7CisJbmV0aWZfbmFwaV9kZWwoJmFyLT5uYXBpKTsKIAlhdGgxMGtfcGNpX2NlX2RlaW5pdChhcik7CiAJYXRoMTBrX3BjaV9mcmVlX3BpcGVzKGFyKTsKIH0KQEAgLTMxNjIsNyArMzE3OSw2IEBACiAJCXBjaV9oYXJkX3Jlc2V0ID0gYXRoMTBrX3BjaV9xY2E5ODh4X2NoaXBfcmVzZXQ7CiAJCWJyZWFrOwogCWNhc2UgUUNBOTg4N18xXzBfREVWSUNFX0lEOgotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiUUNBOTg4NyBzdXBwb3J0IGlzIHN0aWxsIGV4cGVyaW1lbnRhbCwgdGhlcmUgYXJlIGxpa2VseSBidWdzLiBZb3UgaGF2ZSBiZWVuIHdhcm5lZC5cbiIpOwogCQlod19yZXYgPSBBVEgxMEtfSFdfUUNBOTg4NzsKIAkJcGNpX3BzID0gZmFsc2U7CiAJCXBjaV9zb2Z0X3Jlc2V0ID0gYXRoMTBrX3BjaV93YXJtX3Jlc2V0OwpAQCAtMzI5OCw3ICszMzE0LDcgQEAKIAogZXJyX2ZyZWVfaXJxOgogCWF0aDEwa19wY2lfZnJlZV9pcnEoYXIpOwotCWF0aDEwa19wY2lfa2lsbF90YXNrbGV0KGFyKTsKKwlhdGgxMGtfcGNpX3J4X3JldHJ5X3N5bmMoYXIpOwogCiBlcnJfZGVpbml0X2lycToKIAlhdGgxMGtfcGNpX2RlaW5pdF9pcnEoYXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmgKaW5kZXggNmVjYTFkZi4uOTg1NGFkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3BjaS5oCkBAIC0xNzcsOCArMTc3LDYgQEAKIAkvKiBPcGVyYXRpbmcgaW50ZXJydXB0IG1vZGUgKi8KIAllbnVtIGF0aDEwa19wY2lfaXJxX21vZGUgb3Blcl9pcnFfbW9kZTsKIAotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpbnRyX3RxOwotCiAJc3RydWN0IGF0aDEwa19wY2lfcGlwZSBwaXBlX2luZm9bQ0VfQ09VTlRfTUFYXTsKIAogCS8qIENvcHkgRW5naW5lIHVzZWQgZm9yIERpYWdub3N0aWMgQWNjZXNzZXMgKi8KQEAgLTI5NCw4ICsyOTIsNyBAQAogdm9pZCBhdGgxMGtfcGNpX2ZyZWVfcGlwZXMoc3RydWN0IGF0aDEwayAqYXIpOwogdm9pZCBhdGgxMGtfcGNpX3J4X3JlcGxlbmlzaF9yZXRyeSh1bnNpZ25lZCBsb25nIHB0cik7CiB2b2lkIGF0aDEwa19wY2lfY2VfZGVpbml0KHN0cnVjdCBhdGgxMGsgKmFyKTsKLXZvaWQgYXRoMTBrX3BjaV9pbml0X2lycV90YXNrbGV0cyhzdHJ1Y3QgYXRoMTBrICphcik7Ci12b2lkIGF0aDEwa19wY2lfa2lsbF90YXNrbGV0KHN0cnVjdCBhdGgxMGsgKmFyKTsKK3ZvaWQgYXRoMTBrX3BjaV9pbml0X25hcGkoc3RydWN0IGF0aDEwayAqYXIpOwogaW50IGF0aDEwa19wY2lfaW5pdF9waXBlcyhzdHJ1Y3QgYXRoMTBrICphcik7CiBpbnQgYXRoMTBrX3BjaV9pbml0X2NvbmZpZyhzdHJ1Y3QgYXRoMTBrICphcik7CiB2b2lkIGF0aDEwa19wY2lfcnhfcG9zdChzdHJ1Y3QgYXRoMTBrICphcik7CkBAIC0zMDMsNiArMzAwLDcgQEAKIHZvaWQgYXRoMTBrX3BjaV9lbmFibGVfbGVnYWN5X2lycShzdHJ1Y3QgYXRoMTBrICphcik7CiBib29sIGF0aDEwa19wY2lfaXJxX3BlbmRpbmcoc3RydWN0IGF0aDEwayAqYXIpOwogdm9pZCBhdGgxMGtfcGNpX2Rpc2FibGVfYW5kX2NsZWFyX2xlZ2FjeV9pcnEoc3RydWN0IGF0aDEwayAqYXIpOwordm9pZCBhdGgxMGtfcGNpX2lycV9tc2lfZndfbWFzayhzdHJ1Y3QgYXRoMTBrICphcik7CiBpbnQgYXRoMTBrX3BjaV93YWl0X2Zvcl90YXJnZXRfaW5pdChzdHJ1Y3QgYXRoMTBrICphcik7CiBpbnQgYXRoMTBrX3BjaV9zZXR1cF9yZXNvdXJjZShzdHJ1Y3QgYXRoMTBrICphcik7CiB2b2lkIGF0aDEwa19wY2lfcmVsZWFzZV9yZXNvdXJjZShzdHJ1Y3QgYXRoMTBrICphcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3N3YXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvc3dhcC5jCmluZGV4IDBjNWY1ODYuLmFkZjQ1OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvc3dhcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvc3dhcC5jCkBAIC0xMzQsMTcgKzEzNCwxOCBAQAogCXJldHVybiBzZWdfaW5mbzsKIH0KIAotaW50IGF0aDEwa19zd2FwX2NvZGVfc2VnX2NvbmZpZ3VyZShzdHJ1Y3QgYXRoMTBrICphcikKK2ludCBhdGgxMGtfc3dhcF9jb2RlX3NlZ19jb25maWd1cmUoc3RydWN0IGF0aDEwayAqYXIsCisJCQkJICAgY29uc3Qgc3RydWN0IGF0aDEwa19md19maWxlICpmd19maWxlKQogewogCWludCByZXQ7CiAJc3RydWN0IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luZm8gKnNlZ19pbmZvID0gTlVMTDsKIAotCWlmICghYXItPnN3YXAuZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvKQorCWlmICghZndfZmlsZS0+ZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvKQogCQlyZXR1cm4gMDsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfQk9PVCwgImJvb3QgZm91bmQgZmlybXdhcmUgY29kZSBzd2FwIGJpbmFyeVxuIik7CiAKLQlzZWdfaW5mbyA9IGFyLT5zd2FwLmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbzsKKwlzZWdfaW5mbyA9IGZ3X2ZpbGUtPmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbzsKIAogCXJldCA9IGF0aDEwa19ibWlfd3JpdGVfbWVtb3J5KGFyLCBzZWdfaW5mby0+dGFyZ2V0X2FkZHIsCiAJCQkJICAgICAgJnNlZ19pbmZvLT5zZWdfaHdfaW5mbywKQEAgLTE1OCwyOCArMTU5LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYXRoMTBrX3N3YXBfY29kZV9zZWdfcmVsZWFzZShzdHJ1Y3QgYXRoMTBrICphcikKK3ZvaWQgYXRoMTBrX3N3YXBfY29kZV9zZWdfcmVsZWFzZShzdHJ1Y3QgYXRoMTBrICphciwKKwkJCQkgIHN0cnVjdCBhdGgxMGtfZndfZmlsZSAqZndfZmlsZSkKIHsKLQlhdGgxMGtfc3dhcF9jb2RlX3NlZ19mcmVlKGFyLCBhci0+c3dhcC5maXJtd2FyZV9zd2FwX2NvZGVfc2VnX2luZm8pOworCWF0aDEwa19zd2FwX2NvZGVfc2VnX2ZyZWUoYXIsIGZ3X2ZpbGUtPmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbyk7CiAKIAkvKiBGSVhNRTogdGhlc2UgdHdvIGFzc2lnbm1lbnRzIGxvb2sgdG8gYmVpbiB3cm9uZyBwbGFjZSEgU2hvdWxkbid0CiAJICogdGhleSBiZSBpbiBhdGgxMGtfY29yZV9mcmVlX2Zpcm13YXJlX2ZpbGVzKCkgbGlrZSB0aGUgcmVzdD8KIAkgKi8KLQlhci0+bm9ybWFsX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9kYXRhID0gTlVMTDsKLQlhci0+bm9ybWFsX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9sZW4gPSAwOworCWZ3X2ZpbGUtPmNvZGVzd2FwX2RhdGEgPSBOVUxMOworCWZ3X2ZpbGUtPmNvZGVzd2FwX2xlbiA9IDA7CiAKLQlhci0+c3dhcC5maXJtd2FyZV9zd2FwX2NvZGVfc2VnX2luZm8gPSBOVUxMOworCWZ3X2ZpbGUtPmZpcm13YXJlX3N3YXBfY29kZV9zZWdfaW5mbyA9IE5VTEw7CiB9CiAKLWludCBhdGgxMGtfc3dhcF9jb2RlX3NlZ19pbml0KHN0cnVjdCBhdGgxMGsgKmFyKQoraW50IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luaXQoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBhdGgxMGtfZndfZmlsZSAqZndfZmlsZSkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBhdGgxMGtfc3dhcF9jb2RlX3NlZ19pbmZvICpzZWdfaW5mbzsKIAljb25zdCB2b2lkICpjb2Rlc3dhcF9kYXRhOwogCXNpemVfdCBjb2Rlc3dhcF9sZW47CiAKLQljb2Rlc3dhcF9kYXRhID0gYXItPm5vcm1hbF9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfZGF0YTsKLQljb2Rlc3dhcF9sZW4gPSBhci0+bm9ybWFsX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9sZW47CisJY29kZXN3YXBfZGF0YSA9IGZ3X2ZpbGUtPmNvZGVzd2FwX2RhdGE7CisJY29kZXN3YXBfbGVuID0gZndfZmlsZS0+Y29kZXN3YXBfbGVuOwogCiAJaWYgKCFjb2Rlc3dhcF9sZW4gfHwgIWNvZGVzd2FwX2RhdGEpCiAJCXJldHVybiAwOwpAQCAtMjAwLDcgKzIwMiw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JYXItPnN3YXAuZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvID0gc2VnX2luZm87CisJZndfZmlsZS0+ZmlybXdhcmVfc3dhcF9jb2RlX3NlZ19pbmZvID0gc2VnX2luZm87CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvc3dhcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9zd2FwLmgKaW5kZXggMzY5OTFjNy4uZjVkYzA0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9zd2FwLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9zd2FwLmgKQEAgLTIzLDYgKzIzLDggQEAKIC8qIEN1cnJlbnRseSBvbmx5IG9uZSBzd2FwIHNlZ21lbnQgaXMgc3VwcG9ydGVkICovCiAjZGVmaW5lIEFUSDEwS19TV0FQX0NPREVfU0VHX05VTV9TVVBQT1JURUQJMQogCitzdHJ1Y3QgYXRoMTBrX2Z3X2ZpbGU7CisKIHN0cnVjdCBhdGgxMGtfc3dhcF9jb2RlX3NlZ190bHYgewogCV9fbGUzMiBhZGRyZXNzOwogCV9fbGUzMiBsZW5ndGg7CkBAIC01OCw4ICs2MCwxMSBAQAogCWRtYV9hZGRyX3QgcGFkZHJbQVRIMTBLX1NXQVBfQ09ERV9TRUdfTlVNX1NVUFBPUlRFRF07CiB9OwogCi1pbnQgYXRoMTBrX3N3YXBfY29kZV9zZWdfY29uZmlndXJlKHN0cnVjdCBhdGgxMGsgKmFyKTsKLXZvaWQgYXRoMTBrX3N3YXBfY29kZV9zZWdfcmVsZWFzZShzdHJ1Y3QgYXRoMTBrICphcik7Ci1pbnQgYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5pdChzdHJ1Y3QgYXRoMTBrICphcik7CitpbnQgYXRoMTBrX3N3YXBfY29kZV9zZWdfY29uZmlndXJlKHN0cnVjdCBhdGgxMGsgKmFyLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBhdGgxMGtfZndfZmlsZSAqZndfZmlsZSk7Cit2b2lkIGF0aDEwa19zd2FwX2NvZGVfc2VnX3JlbGVhc2Uoc3RydWN0IGF0aDEwayAqYXIsCisJCQkJICBzdHJ1Y3QgYXRoMTBrX2Z3X2ZpbGUgKmZ3X2ZpbGUpOworaW50IGF0aDEwa19zd2FwX2NvZGVfc2VnX2luaXQoc3RydWN0IGF0aDEwayAqYXIsCisJCQkgICAgICBzdHJ1Y3QgYXRoMTBrX2Z3X2ZpbGUgKmZ3X2ZpbGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGFyZ2FkZHJzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3RhcmdhZGRycy5oCmluZGV4IGFhZjUzYTguLmE0N2NhYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGFyZ2FkZHJzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90YXJnYWRkcnMuaApAQCAtNDA1LDcgKzQwNSw3IEBACiAgKiAxLiB0YXJnZXQgZmlybXdhcmUgd291bGQgY2hlY2sgbWFnaWMgbnVtYmVyIGFuZCBpZiBpdCdzIGEgbWF0Y2gsIGZpcm13YXJlCiAgKiAgICB3b3VsZCBjb25zaWRlciB0aGUgYml0c1swOjE1XSBhcmUgdmFsaWQgYW5kIGJhc2Ugb24gdGhhdCB0byBjYWxjdWxhdGUKICAqICAgIHRoZSBlbmQgb2YgRFJBTS4gRWFybHkgYWxsb2NhdGlvbiB3b3VsZCBiZSBsb2NhdGVkIGF0IHRoYXQgYXJlYSBhbmQKLSAqICAgIG1heSBiZSByZWNsYWltZWQgd2hlbiBuZWNlc2FyeQorICogICAgbWF5IGJlIHJlY2xhaW1lZCB3aGVuIG5lY2Vzc2FyeQogICogMi4gaWYgbm8gbWFnaWMgbnVtYmVyIGlzIGZvdW5kLCBlYXJseSBhbGxvY2F0aW9uIHdvdWxkIGhhcHBlbiBhdCAiX2VuZCIKICAqICAgIHN5bWJvbCBvZiBST00gd2hpY2ggaXMgbG9jYXRlZCBiZWZvcmUgdGhlIGFwcC1kYXRhIGFuZCBtaWdodCBOT1QgYmUKICAqICAgIHJlLWNsYWltYWJsZS4gSWYgdGhpcyBpcyBhZG9wdGVkLCBsaW5rIHNjcmlwdCBzaG91bGQga2VlcCB0aGlzIGluCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3Rlc3Rtb2RlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3Rlc3Rtb2RlLmMKaW5kZXggMTIwZjQyMy4uZWQ4NWY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway90ZXN0bW9kZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGVzdG1vZGUuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgIndtaS5oIgogI2luY2x1ZGUgImhpZi5oIgogI2luY2x1ZGUgImh3LmgiCisjaW5jbHVkZSAiY29yZS5oIgogCiAjaW5jbHVkZSAidGVzdG1vZGVfaS5oIgogCkBAIC00NSw3ICs0Niw3IEBACiAJaW50IHJldDsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfVEVTVE1PREUsCi0JCSAgICJ0ZXN0bW9kZSBldmVudCB3bWkgY21kX2lkICVkIHNrYiAlcCBza2ItPmxlbiAlZFxuIiwKKwkJICAgInRlc3Rtb2RlIGV2ZW50IHdtaSBjbWRfaWQgJWQgc2tiICVwSyBza2ItPmxlbiAlZFxuIiwKIAkJICAgY21kX2lkLCBza2IsIHNrYi0+bGVuKTsKIAogCWF0aDEwa19kYmdfZHVtcChhciwgQVRIMTBLX0RCR19URVNUTU9ERSwgTlVMTCwgIiIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwpAQCAtMjQwLDYgKzI0MSwxOCBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwlpZiAoYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfZGF0YSAmJgorCSAgICBhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9sZW4pIHsKKwkJcmV0ID0gYXRoMTBrX3N3YXBfY29kZV9zZWdfaW5pdChhciwKKwkJCQkJCSZhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZSk7CisJCWlmIChyZXQpIHsKKwkJCWF0aDEwa193YXJuKGFyLAorCQkJCSAgICAiZmFpbGVkIHRvIGluaXQgdXRmIGNvZGUgc3dhcCBzZWdtZW50OiAlZFxuIiwKKwkJCQkgICAgcmV0KTsKKwkJCWdvdG8gZXJyX3JlbGVhc2VfdXRmX21vZGVfZnc7CisJCX0KKwl9CisKIAlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwogCWFyLT50ZXN0bW9kZS51dGZfbW9uaXRvciA9IHRydWU7CiAJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwpAQCAtMjc5LDYgKzI5MiwxMSBAQAogCWF0aDEwa19oaWZfcG93ZXJfZG93bihhcik7CiAKIGVycl9yZWxlYXNlX3V0Zl9tb2RlX2Z3OgorCWlmIChhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9kYXRhICYmCisJICAgIGFyLT50ZXN0bW9kZS51dGZfbW9kZV9mdy5md19maWxlLmNvZGVzd2FwX2xlbikKKwkJYXRoMTBrX3N3YXBfY29kZV9zZWdfcmVsZWFzZShhciwKKwkJCQkJICAgICAmYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUpOworCiAJcmVsZWFzZV9maXJtd2FyZShhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZS5maXJtd2FyZSk7CiAJYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuZmlybXdhcmUgPSBOVUxMOwogCkBAIC0zMDEsNiArMzE5LDExIEBACiAKIAlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CiAKKwlpZiAoYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuY29kZXN3YXBfZGF0YSAmJgorCSAgICBhci0+dGVzdG1vZGUudXRmX21vZGVfZncuZndfZmlsZS5jb2Rlc3dhcF9sZW4pCisJCWF0aDEwa19zd2FwX2NvZGVfc2VnX3JlbGVhc2UoYXIsCisJCQkJCSAgICAgJmFyLT50ZXN0bW9kZS51dGZfbW9kZV9mdy5md19maWxlKTsKKwogCXJlbGVhc2VfZmlybXdhcmUoYXItPnRlc3Rtb2RlLnV0Zl9tb2RlX2Z3LmZ3X2ZpbGUuZmlybXdhcmUpOwogCWFyLT50ZXN0bW9kZS51dGZfbW9kZV9mdy5md19maWxlLmZpcm13YXJlID0gTlVMTDsKIApAQCAtMzYwLDcgKzM4Myw3IEBACiAJY21kX2lkID0gbmxhX2dldF91MzIodGJbQVRIMTBLX1RNX0FUVFJfV01JX0NNRElEXSk7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1RFU1RNT0RFLAotCQkgICAidGVzdG1vZGUgY21kIHdtaSBjbWRfaWQgJWQgYnVmICVwIGJ1Zl9sZW4gJWRcbiIsCisJCSAgICJ0ZXN0bW9kZSBjbWQgd21pIGNtZF9pZCAlZCBidWYgJXBLIGJ1Zl9sZW4gJWRcbiIsCiAJCSAgIGNtZF9pZCwgYnVmLCBidWZfbGVuKTsKIAogCWF0aDEwa19kYmdfZHVtcChhciwgQVRIMTBLX0RCR19URVNUTU9ERSwgTlVMTCwgIiIsIGJ1ZiwgYnVmX2xlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3RoZXJtYWwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGhlcm1hbC5jCmluZGV4IDQ0NGI1MmMuLjBhNDcyNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdGhlcm1hbC5jCkBAIC0xOTIsNyArMTkyLDcgQEAKIAogCS8qIEF2b2lkIGxpbmtpbmcgZXJyb3Igb24gZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMsIEkKIAkgKiBndWVzcyBsaW51eC9od21vbi5oIGlzIG1pc3NpbmcgcHJvcGVyIHN0dWJzLiAqLwotCWlmICghY29uZmlnX2VuYWJsZWQoQ09ORklHX0hXTU9OKSkKKwlpZiAoIUlTX1JFQUNIQUJMRShDT05GSUdfSFdNT04pKQogCQlyZXR1cm4gMDsKIAogCWh3bW9uX2RldiA9IGRldm1faHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKGFyLT5kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3R4cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdHhyeC5jCmluZGV4IGIyOWE4NmEuLjk4NTJjNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvdHhyeC5jCkBAIC00NCw3ICs0NCw3IEBACiAJY29tcGxldGUoJmFyLT5vZmZjaGFuX3R4X2NvbXBsZXRlZCk7CiAJYXItPm9mZmNoYW5fdHhfc2tiID0gTlVMTDsgLyoganVzdCBmb3Igc2FuaXR5ICovCiAKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUVCwgImNvbXBsZXRlZCBvZmZjaGFubmVsIHNrYiAlcFxuIiwgc2tiKTsKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX0hUVCwgImNvbXBsZXRlZCBvZmZjaGFubmVsIHNrYiAlcEtcbiIsIHNrYik7CiBvdXQ6CiAJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwogfQpAQCAtMTE5LDggKzExOSw2IEBACiAJaWVlZTgwMjExX3R4X3N0YXR1cyhodHQtPmFyLT5odywgbXNkdSk7CiAJLyogd2UgZG8gbm90IG93biB0aGUgbXNkdSBhbnltb3JlICovCiAKLQlhdGgxMGtfbWFjX3R4X3B1c2hfcGVuZGluZyhhcik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktb3BzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaAppbmRleCA2NGViZDMwLi5jOWE4YmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaApAQCAtNTEsNiArNTEsOCBAQAogCQkJICAgIHN0cnVjdCB3bWlfcm9hbV9ldl9hcmcgKmFyZyk7CiAJaW50ICgqcHVsbF93b3dfZXZlbnQpKHN0cnVjdCBhdGgxMGsgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgc3RydWN0IHdtaV93b3dfZXZfYXJnICphcmcpOworCWludCAoKnB1bGxfZWNob19ldikoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgc3RydWN0IHdtaV9lY2hvX2V2X2FyZyAqYXJnKTsKIAllbnVtIHdtaV90eGJmX2NvbmYgKCpnZXRfdHhiZl9jb25mX3NjaGVtZSkoc3RydWN0IGF0aDEwayAqYXIpOwogCiAJc3RydWN0IHNrX2J1ZmYgKigqZ2VuX3BkZXZfc3VzcGVuZCkoc3RydWN0IGF0aDEwayAqYXIsIHUzMiBzdXNwZW5kX29wdCk7CkBAIC0xMjMsNyArMTI1LDcgQEAKIAkJCQkJICAgICBlbnVtIHdtaV9mb3JjZV9md19oYW5nX3R5cGUgdHlwZSwKIAkJCQkJICAgICB1MzIgZGVsYXlfbXMpOwogCXN0cnVjdCBza19idWZmICooKmdlbl9tZ210X3R4KShzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0Jc3RydWN0IHNrX2J1ZmYgKigqZ2VuX2RiZ2xvZ19jZmcpKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgbW9kdWxlX2VuYWJsZSwKKwlzdHJ1Y3Qgc2tfYnVmZiAqKCpnZW5fZGJnbG9nX2NmZykoc3RydWN0IGF0aDEwayAqYXIsIHU2NCBtb2R1bGVfZW5hYmxlLAogCQkJCQkgIHUzMiBsb2dfbGV2ZWwpOwogCXN0cnVjdCBza19idWZmICooKmdlbl9wa3Rsb2dfZW5hYmxlKShzdHJ1Y3QgYXRoMTBrICphciwgdTMyIGZpbHRlcik7CiAJc3RydWN0IHNrX2J1ZmYgKigqZ2VuX3BrdGxvZ19kaXNhYmxlKShzdHJ1Y3QgYXRoMTBrICphcik7CkBAIC0xOTQsNiArMTk2LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqKCpnZW5fcGRldl9ic3NfY2hhbl9pbmZvX3JlcSkKIAkJCQkJKHN0cnVjdCBhdGgxMGsgKmFyLAogCQkJCQkgZW51bSB3bWlfYnNzX3N1cnZleV9yZXFfdHlwZSB0eXBlKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqKCpnZW5fZWNobykoc3RydWN0IGF0aDEwayAqYXIsIHUzMiB2YWx1ZSk7CiB9OwogCiBpbnQgYXRoMTBrX3dtaV9jbWRfc2VuZChzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGNtZF9pZCk7CkBAIC0zNDksNiArMzUyLDE2IEBACiAJcmV0dXJuIGFyLT53bWkub3BzLT5wdWxsX3dvd19ldmVudChhciwgc2tiLCBhcmcpOwogfQogCitzdGF0aWMgaW5saW5lIGludAorYXRoMTBrX3dtaV9wdWxsX2VjaG9fZXYoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3Qgd21pX2VjaG9fZXZfYXJnICphcmcpCit7CisJaWYgKCFhci0+d21pLm9wcy0+cHVsbF9lY2hvX2V2KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXR1cm4gYXItPndtaS5vcHMtPnB1bGxfZWNob19ldihhciwgc2tiLCBhcmcpOworfQorCiBzdGF0aWMgaW5saW5lIGVudW0gd21pX3R4YmZfY29uZgogYXRoMTBrX3dtaV9nZXRfdHhiZl9jb25mX3NjaGVtZShzdHJ1Y3QgYXRoMTBrICphcikKIHsKQEAgLTkzMiw3ICs5NDUsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotYXRoMTBrX3dtaV9kYmdsb2dfY2ZnKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgbW9kdWxlX2VuYWJsZSwgdTMyIGxvZ19sZXZlbCkKK2F0aDEwa193bWlfZGJnbG9nX2NmZyhzdHJ1Y3QgYXRoMTBrICphciwgdTY0IG1vZHVsZV9lbmFibGUsIHUzMiBsb2dfbGV2ZWwpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtMTM4Miw0ICsxMzk1LDIwIEBACiAJCQkJICAgd21pLT5jbWQtPnBkZXZfYnNzX2NoYW5faW5mb19yZXF1ZXN0X2NtZGlkKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK2F0aDEwa193bWlfZWNobyhzdHJ1Y3QgYXRoMTBrICphciwgdTMyIHZhbHVlKQoreworCXN0cnVjdCBhdGgxMGtfd21pICp3bWkgPSAmYXItPndtaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKCF3bWktPm9wcy0+Z2VuX2VjaG8pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXNrYiA9IHdtaS0+b3BzLT5nZW5fZWNobyhhciwgdmFsdWUpOworCWlmIChJU19FUlIoc2tiKSkKKwkJcmV0dXJuIFBUUl9FUlIoc2tiKTsKKworCXJldHVybiBhdGgxMGtfd21pX2NtZF9zZW5kKGFyLCBza2IsIHdtaS0+Y21kLT5lY2hvX2NtZGlkKTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS10bHYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLXRsdi5jCmluZGV4IGUwOTMzN2UuLmU2NGY1OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLXRsdi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLXRsdi5jCkBAIC0xMjIzLDYgKzEyMjMsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhdGgxMGtfd21pX3Rsdl9vcF9wdWxsX2VjaG9fZXYoc3RydWN0IGF0aDEwayAqYXIsCisJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICBzdHJ1Y3Qgd21pX2VjaG9fZXZfYXJnICphcmcpCit7CisJY29uc3Qgdm9pZCAqKnRiOworCWNvbnN0IHN0cnVjdCB3bWlfZWNob19ldmVudCAqZXY7CisJaW50IHJldDsKKworCXRiID0gYXRoMTBrX3dtaV90bHZfcGFyc2VfYWxsb2MoYXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIEdGUF9BVE9NSUMpOworCWlmIChJU19FUlIodGIpKSB7CisJCXJldCA9IFBUUl9FUlIodGIpOworCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byBwYXJzZSB0bHY6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWV2ID0gdGJbV01JX1RMVl9UQUdfU1RSVUNUX0VDSE9fRVZFTlRdOworCWlmICghZXYpIHsKKwkJa2ZyZWUodGIpOworCQlyZXR1cm4gLUVQUk9UTzsKKwl9CisKKwlhcmctPnZhbHVlID0gZXYtPnZhbHVlOworCisJa2ZyZWUodGIpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgogYXRoMTBrX3dtaV90bHZfb3BfZ2VuX3BkZXZfc3VzcGVuZChzdHJ1Y3QgYXRoMTBrICphciwgdTMyIG9wdCkKIHsKQEAgLTI0NDEsNyArMjQ2OCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCi1hdGgxMGtfd21pX3Rsdl9vcF9nZW5fZGJnbG9nX2NmZyhzdHJ1Y3QgYXRoMTBrICphciwgdTMyIG1vZHVsZV9lbmFibGUsCithdGgxMGtfd21pX3Rsdl9vcF9nZW5fZGJnbG9nX2NmZyhzdHJ1Y3QgYXRoMTBrICphciwgdTY0IG1vZHVsZV9lbmFibGUsCiAJCQkJIHUzMiBsb2dfbGV2ZWwpIHsKIAlzdHJ1Y3Qgd21pX3Rsdl9kYmdsb2dfY21kICpjbWQ7CiAJc3RydWN0IHdtaV90bHYgKnRsdjsKQEAgLTMwODEsNiArMzEwOCwzNCBAQAogCXJldHVybiBza2I7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCithdGgxMGtfd21pX3Rsdl9vcF9nZW5fZWNobyhzdHJ1Y3QgYXRoMTBrICphciwgdTMyIHZhbHVlKQoreworCXN0cnVjdCB3bWlfZWNob19jbWQgKmNtZDsKKwlzdHJ1Y3Qgd21pX3RsdiAqdGx2OworCXN0cnVjdCBza19idWZmICpza2I7CisJdm9pZCAqcHRyOworCXNpemVfdCBsZW47CisKKwlsZW4gPSBzaXplb2YoKnRsdikgKyBzaXplb2YoKmNtZCk7CisJc2tiID0gYXRoMTBrX3dtaV9hbGxvY19za2IoYXIsIGxlbik7CisJaWYgKCFza2IpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcHRyID0gKHZvaWQgKilza2ItPmRhdGE7CisJdGx2ID0gcHRyOworCXRsdi0+dGFnID0gX19jcHVfdG9fbGUxNihXTUlfVExWX1RBR19TVFJVQ1RfRUNIT19DTUQpOworCXRsdi0+bGVuID0gX19jcHVfdG9fbGUxNihzaXplb2YoKmNtZCkpOworCWNtZCA9ICh2b2lkICopdGx2LT52YWx1ZTsKKwljbWQtPnZhbHVlID0gY3B1X3RvX2xlMzIodmFsdWUpOworCisJcHRyICs9IHNpemVvZigqdGx2KTsKKwlwdHIgKz0gc2l6ZW9mKCpjbWQpOworCisJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksICJ3bWkgdGx2IGVjaG8gdmFsdWUgMHglMDh4XG4iLCB2YWx1ZSk7CisJcmV0dXJuIHNrYjsKK30KKwogLyoqKioqKioqKioqKioqKiovCiAvKiBUTFYgbWFwcGluZ3MgKi8KIC8qKioqKioqKioqKioqKioqLwpAQCAtMzQyOSw2ICszNDg0LDcgQEAKIAkucHVsbF9md19zdGF0cyA9IGF0aDEwa193bWlfdGx2X29wX3B1bGxfZndfc3RhdHMsCiAJLnB1bGxfcm9hbV9ldiA9IGF0aDEwa193bWlfdGx2X29wX3B1bGxfcm9hbV9ldiwKIAkucHVsbF93b3dfZXZlbnQgPSBhdGgxMGtfd21pX3Rsdl9vcF9wdWxsX3dvd19ldiwKKwkucHVsbF9lY2hvX2V2ID0gYXRoMTBrX3dtaV90bHZfb3BfcHVsbF9lY2hvX2V2LAogCS5nZXRfdHhiZl9jb25mX3NjaGVtZSA9IGF0aDEwa193bWlfdGx2X3R4YmZfY29uZl9zY2hlbWUsCiAKIAkuZ2VuX3BkZXZfc3VzcGVuZCA9IGF0aDEwa193bWlfdGx2X29wX2dlbl9wZGV2X3N1c3BlbmQsCkBAIC0zNDg1LDYgKzM1NDEsNyBAQAogCS5nZW5fYWRhcHRpdmVfcWNzID0gYXRoMTBrX3dtaV90bHZfb3BfZ2VuX2FkYXB0aXZlX3FjcywKIAkuZndfc3RhdHNfZmlsbCA9IGF0aDEwa193bWlfbWFpbl9vcF9md19zdGF0c19maWxsLAogCS5nZXRfdmRldl9zdWJ0eXBlID0gYXRoMTBrX3dtaV9vcF9nZXRfdmRldl9zdWJ0eXBlLAorCS5nZW5fZWNobyA9IGF0aDEwa193bWlfdGx2X29wX2dlbl9lY2hvLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB3bWlfcGVlcl9mbGFnc19tYXAgd21pX3Rsdl9wZWVyX2ZsYWdzX21hcCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5jCmluZGV4IGQyNDYyODguLjU0ZGY0MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWkuYwpAQCAtMjksNiArMjksOSBAQAogI2luY2x1ZGUgInAycC5oIgogI2luY2x1ZGUgImh3LmgiCiAKKyNkZWZpbmUgQVRIMTBLX1dNSV9CQVJSSUVSX0VDSE9fSUQgMHhCQTk5MUU5CisjZGVmaW5lIEFUSDEwS19XTUlfQkFSUklFUl9USU1FT1VUX0haICgzICogSFopCisKIC8qIE1BSU4gV01JIGNtZCB0cmFjayAqLwogc3RhdGljIHN0cnVjdCB3bWlfY21kX21hcCB3bWlfY21kX21hcCA9IHsKIAkuaW5pdF9jbWRpZCA9IFdNSV9JTklUX0NNRElELApAQCAtMTg3NCw3ICsxODc3LDcgQEAKIAlldGhlcl9hZGRyX2NvcHkoY21kLT5oZHIucGVlcl9tYWNhZGRyLmFkZHIsIGllZWU4MDIxMV9nZXRfREEoaGRyKSk7CiAJbWVtY3B5KGNtZC0+YnVmLCBtc2R1LT5kYXRhLCBtc2R1LT5sZW4pOwogCi0JYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksICJ3bWkgbWdtdCB0eCBza2IgJXAgbGVuICVkIGZ0eXBlICUwMnggc3R5cGUgJTAyeFxuIiwKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwgIndtaSBtZ210IHR4IHNrYiAlcEsgbGVuICVkIGZ0eXBlICUwMnggc3R5cGUgJTAyeFxuIiwKIAkJICAgbXNkdSwgc2tiLT5sZW4sIGZjICYgSUVFRTgwMjExX0ZDVExfRlRZUEUsCiAJCSAgIGZjICYgSUVFRTgwMjExX0ZDVExfU1RZUEUpOwogCXRyYWNlX2F0aDEwa190eF9oZHIoYXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwpAQCAtMjI0MCw2ICsyMjQzLDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBib29sIGF0aDEwa193bWlfcnhfaXNfZGVjcnlwdGVkKHN0cnVjdCBhdGgxMGsgKmFyLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQoreworCWlmICghaWVlZTgwMjExX2hhc19wcm90ZWN0ZWQoaGRyLT5mcmFtZV9jb250cm9sKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogRlcgZGVsaXZlcnMgV0VQIFNoYXJlZCBBdXRoIGZyYW1lIHdpdGggUHJvdGVjdGVkIEJpdCBzZXQgYW5kCisJICogZW5jcnlwdGVkIHBheWxvYWQuIEhvd2V2ZXIgaW4gY2FzZSBvZiBQTUYgaXQgZGVsaXZlcnMgZGVjcnlwdGVkCisJICogZnJhbWVzIHdpdGggUHJvdGVjdGVkIEJpdCBzZXQuCisJICovCisJaWYgKGllZWU4MDIxMV9pc19hdXRoKGhkci0+ZnJhbWVfY29udHJvbCkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIHFjYTk5eDAgYmFzZWQgRlcgZGVsaXZlcnMgYnJvYWRjYXN0IG9yIG11bHRpY2FzdCBtYW5hZ2VtZW50IGZyYW1lcworCSAqIChleDogZ3JvdXAgcHJpdmFjeSBhY3Rpb24gZnJhbWVzIGluIG1lc2gpIGFzIGVuY3J5cHRlZCBwYXlsb2FkLgorCSAqLworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihpZWVlODAyMTFfZ2V0X0RBKGhkcikpICYmCisJICAgIGFyLT5od19wYXJhbXMuc3dfZGVjcnlwdF9tY2FzdF9tZ210KQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogaW50IGF0aDEwa193bWlfZXZlbnRfbWdtdF9yeChzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgd21pX21nbXRfcnhfZXZfYXJnIGFyZyA9IHt9OwpAQCAtMjMyNiwxMSArMjM1Miw3IEBACiAKIAlhdGgxMGtfd21pX2hhbmRsZV93ZXBfcmVhdXRoKGFyLCBza2IsIHN0YXR1cyk7CiAKLQkvKiBGVyBkZWxpdmVycyBXRVAgU2hhcmVkIEF1dGggZnJhbWUgd2l0aCBQcm90ZWN0ZWQgQml0IHNldCBhbmQKLQkgKiBlbmNyeXB0ZWQgcGF5bG9hZC4gSG93ZXZlciBpbiBjYXNlIG9mIFBNRiBpdCBkZWxpdmVycyBkZWNyeXB0ZWQKLQkgKiBmcmFtZXMgd2l0aCBQcm90ZWN0ZWQgQml0IHNldC4gKi8KLQlpZiAoaWVlZTgwMjExX2hhc19wcm90ZWN0ZWQoaGRyLT5mcmFtZV9jb250cm9sKSAmJgotCSAgICAhaWVlZTgwMjExX2lzX2F1dGgoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCWlmIChhdGgxMGtfd21pX3J4X2lzX2RlY3J5cHRlZChhciwgaGRyKSkgewogCQlzdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19ERUNSWVBURUQ7CiAKIAkJaWYgKCFpZWVlODAyMTFfaXNfYWN0aW9uKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKQEAgLTIzNDcsNyArMjM2OSw3IEBACiAJCWF0aDEwa19tYWNfaGFuZGxlX2JlYWNvbihhciwgc2tiKTsKIAogCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfTUdNVCwKLQkJICAgImV2ZW50IG1nbXQgcnggc2tiICVwIGxlbiAlZCBmdHlwZSAlMDJ4IHN0eXBlICUwMnhcbiIsCisJCSAgICJldmVudCBtZ210IHJ4IHNrYiAlcEsgbGVuICVkIGZ0eXBlICUwMnggc3R5cGUgJTAyeFxuIiwKIAkJICAgc2tiLCBza2ItPmxlbiwKIAkJICAgZmMgJiBJRUVFODAyMTFfRkNUTF9GVFlQRSwgZmMgJiBJRUVFODAyMTFfRkNUTF9TVFlQRSk7CiAKQEAgLTI0OTUsNyArMjUxNywyMSBAQAogCiB2b2lkIGF0aDEwa193bWlfZXZlbnRfZWNobyhzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwgIldNSV9FQ0hPX0VWRU5USURcbiIpOworCXN0cnVjdCB3bWlfZWNob19ldl9hcmcgYXJnID0ge307CisJaW50IHJldDsKKworCXJldCA9IGF0aDEwa193bWlfcHVsbF9lY2hvX2V2KGFyLCBza2IsICZhcmcpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gcGFyc2UgZWNobzogJWRcbiIsIHJldCk7CisJCXJldHVybjsKKwl9CisKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwKKwkJICAgIndtaSBldmVudCBlY2hvIHZhbHVlIDB4JTA4eFxuIiwKKwkJICAgbGUzMl90b19jcHUoYXJnLnZhbHVlKSk7CisKKwlpZiAobGUzMl90b19jcHUoYXJnLnZhbHVlKSA9PSBBVEgxMEtfV01JX0JBUlJJRVJfRUNIT19JRCkKKwkJY29tcGxldGUoJmFyLT53bWkuYmFycmllcik7CiB9CiAKIGludCBhdGgxMGtfd21pX2V2ZW50X2RlYnVnX21lc2coc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0zNDc4LDYgKzM1MTQsMTIgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJLyogbWFjODAyMTEgd291bGQgaGF2ZSBhbHJlYWR5IGFza2VkIHVzIHRvIHN0b3AgYmVhY29uaW5nIGFuZAorCQkgKiBicmluZyB0aGUgdmRldiBkb3duLCBzbyBjb250aW51ZSBpbiB0aGF0IGNhc2UKKwkJICovCisJCWlmICghYXJ2aWYtPmlzX3VwKQorCQkJY29udGludWU7CisKIAkJLyogVGhlcmUgYXJlIG5vIGNvbXBsZXRpb25zIGZvciBiZWFjb25zIHNvIHdhaXQgZm9yIG5leHQgU1dCQQogCQkgKiBiZWZvcmUgdGVsbGluZyBtYWM4MDIxMSB0byBkZWNyZW1lbnQgQ1NBIGNvdW50ZXIKIAkJICoKQEAgLTM1MjcsNyArMzU2OSw2IEBACiAJCQkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gbWFwIGJlYWNvbjogJWRcbiIsCiAJCQkJCSAgICByZXQpOwogCQkJCWRldl9rZnJlZV9za2JfYW55KGJjbik7Ci0JCQkJcmV0ID0gLUVJTzsKIAkJCQlnb3RvIHNraXA7CiAJCQl9CiAKQEAgLTQ3OTIsNiArNDgzMywxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF0aDEwa193bWlfb3BfcHVsbF9lY2hvX2V2KHN0cnVjdCBhdGgxMGsgKmFyLAorCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgc3RydWN0IHdtaV9lY2hvX2V2X2FyZyAqYXJnKQoreworCXN0cnVjdCB3bWlfZWNob19ldmVudCAqZXYgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKworCWFyZy0+dmFsdWUgPSBldi0+dmFsdWU7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGF0aDEwa193bWlfZXZlbnRfcmVhZHkoc3RydWN0IGF0aDEwayAqYXIsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHdtaV9yZHlfZXZfYXJnIGFyZyA9IHt9OwpAQCAtNTEyNCw2ICs1MTc2LDcgQEAKIHsKIAlzdHJ1Y3Qgd21pX2NtZF9oZHIgKmNtZF9oZHI7CiAJZW51bSB3bWlfMTBfMl9ldmVudF9pZCBpZDsKKwlib29sIGNvbnN1bWVkOwogCiAJY21kX2hkciA9IChzdHJ1Y3Qgd21pX2NtZF9oZHIgKilza2ItPmRhdGE7CiAJaWQgPSBNUyhfX2xlMzJfdG9fY3B1KGNtZF9oZHItPmNtZF9pZCksIFdNSV9DTURfSERSX0NNRF9JRCk7CkBAIC01MTMzLDYgKzUxODYsMTggQEAKIAogCXRyYWNlX2F0aDEwa193bWlfZXZlbnQoYXIsIGlkLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAorCWNvbnN1bWVkID0gYXRoMTBrX3RtX2V2ZW50X3dtaShhciwgaWQsIHNrYik7CisKKwkvKiBSZWFkeSBldmVudCBtdXN0IGJlIGhhbmRsZWQgbm9ybWFsbHkgYWxzbyBpbiBVVEYgbW9kZSBzbyB0aGF0IHdlCisJICoga25vdyB0aGUgVVRGIGZpcm13YXJlIGhhcyBib290ZWQsIG90aGVycyB3ZSBhcmUganVzdCBieXBhc3MgV01JCisJICogZXZlbnRzIHRvIHRlc3Rtb2RlLgorCSAqLworCWlmIChjb25zdW1lZCAmJiBpZCAhPSBXTUlfMTBfMl9SRUFEWV9FVkVOVElEKSB7CisJCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfV01JLAorCQkJICAgIndtaSB0ZXN0bW9kZSBjb25zdW1lZCAweCV4XG4iLCBpZCk7CisJCWdvdG8gb3V0OworCX0KKwogCXN3aXRjaCAoaWQpIHsKIAljYXNlIFdNSV8xMF8yX01HTVRfUlhfRVZFTlRJRDoKIAkJYXRoMTBrX3dtaV9ldmVudF9tZ210X3J4KGFyLCBza2IpOwpAQCAtNTI0OCw2ICs1MzEzLDcgQEAKIHsKIAlzdHJ1Y3Qgd21pX2NtZF9oZHIgKmNtZF9oZHI7CiAJZW51bSB3bWlfMTBfNF9ldmVudF9pZCBpZDsKKwlib29sIGNvbnN1bWVkOwogCiAJY21kX2hkciA9IChzdHJ1Y3Qgd21pX2NtZF9oZHIgKilza2ItPmRhdGE7CiAJaWQgPSBNUyhfX2xlMzJfdG9fY3B1KGNtZF9oZHItPmNtZF9pZCksIFdNSV9DTURfSERSX0NNRF9JRCk7CkBAIC01MjU3LDYgKzUzMjMsMTggQEAKIAogCXRyYWNlX2F0aDEwa193bWlfZXZlbnQoYXIsIGlkLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAorCWNvbnN1bWVkID0gYXRoMTBrX3RtX2V2ZW50X3dtaShhciwgaWQsIHNrYik7CisKKwkvKiBSZWFkeSBldmVudCBtdXN0IGJlIGhhbmRsZWQgbm9ybWFsbHkgYWxzbyBpbiBVVEYgbW9kZSBzbyB0aGF0IHdlCisJICoga25vdyB0aGUgVVRGIGZpcm13YXJlIGhhcyBib290ZWQsIG90aGVycyB3ZSBhcmUganVzdCBieXBhc3MgV01JCisJICogZXZlbnRzIHRvIHRlc3Rtb2RlLgorCSAqLworCWlmIChjb25zdW1lZCAmJiBpZCAhPSBXTUlfMTBfNF9SRUFEWV9FVkVOVElEKSB7CisJCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfV01JLAorCQkJICAgIndtaSB0ZXN0bW9kZSBjb25zdW1lZCAweCV4XG4iLCBpZCk7CisJCWdvdG8gb3V0OworCX0KKwogCXN3aXRjaCAoaWQpIHsKIAljYXNlIFdNSV8xMF80X01HTVRfUlhfRVZFTlRJRDoKIAkJYXRoMTBrX3dtaV9ldmVudF9tZ210X3J4KGFyLCBza2IpOwpAQCAtNTMwNiw2ICs1Mzg0LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfMTBfNF9XT1dfV0FLRVVQX0hPU1RfRVZFTlRJRDoKIAljYXNlIFdNSV8xMF80X1BFRVJfUkFURUNPREVfTElTVF9FVkVOVElEOgorCWNhc2UgV01JXzEwXzRfV0RTX1BFRVJfRVZFTlRJRDoKIAkJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksCiAJCQkgICAicmVjZWl2ZWQgZXZlbnQgaWQgJWQgbm90IGltcGxlbWVudGVkXG4iLCBpZCk7CiAJCWJyZWFrOwpAQCAtNjg2Myw3ICs2OTQyLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBza19idWZmICoKLWF0aDEwa193bWlfb3BfZ2VuX2RiZ2xvZ19jZmcoc3RydWN0IGF0aDEwayAqYXIsIHUzMiBtb2R1bGVfZW5hYmxlLAorYXRoMTBrX3dtaV9vcF9nZW5fZGJnbG9nX2NmZyhzdHJ1Y3QgYXRoMTBrICphciwgdTY0IG1vZHVsZV9lbmFibGUsCiAJCQkgICAgIHUzMiBsb2dfbGV2ZWwpCiB7CiAJc3RydWN0IHdtaV9kYmdsb2dfY2ZnX2NtZCAqY21kOwpAQCAtNjkwMSw2ICs2OTgwLDQ0IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCithdGgxMGtfd21pXzEwXzRfb3BfZ2VuX2RiZ2xvZ19jZmcoc3RydWN0IGF0aDEwayAqYXIsIHU2NCBtb2R1bGVfZW5hYmxlLAorCQkJCSAgdTMyIGxvZ19sZXZlbCkKK3sKKwlzdHJ1Y3Qgd21pXzEwXzRfZGJnbG9nX2NmZ19jbWQgKmNtZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBjZmc7CisKKwlza2IgPSBhdGgxMGtfd21pX2FsbG9jX3NrYihhciwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwljbWQgPSAoc3RydWN0IHdtaV8xMF80X2RiZ2xvZ19jZmdfY21kICopc2tiLT5kYXRhOworCisJaWYgKG1vZHVsZV9lbmFibGUpIHsKKwkJY2ZnID0gU00obG9nX2xldmVsLAorCQkJIEFUSDEwS19EQkdMT0dfQ0ZHX0xPR19MVkwpOworCX0gZWxzZSB7CisJCS8qIHNldCBiYWNrIGRlZmF1bHRzLCBhbGwgbW9kdWxlcyB3aXRoIFdBUk4gbGV2ZWwgKi8KKwkJY2ZnID0gU00oQVRIMTBLX0RCR0xPR19MRVZFTF9XQVJOLAorCQkJIEFUSDEwS19EQkdMT0dfQ0ZHX0xPR19MVkwpOworCQltb2R1bGVfZW5hYmxlID0gfjA7CisJfQorCisJY21kLT5tb2R1bGVfZW5hYmxlID0gX19jcHVfdG9fbGU2NChtb2R1bGVfZW5hYmxlKTsKKwljbWQtPm1vZHVsZV92YWxpZCA9IF9fY3B1X3RvX2xlNjQofjApOworCWNtZC0+Y29uZmlnX2VuYWJsZSA9IF9fY3B1X3RvX2xlMzIoY2ZnKTsKKwljbWQtPmNvbmZpZ192YWxpZCA9IF9fY3B1X3RvX2xlMzIoQVRIMTBLX0RCR0xPR19DRkdfTE9HX0xWTF9NQVNLKTsKKworCWF0aDEwa19kYmcoYXIsIEFUSDEwS19EQkdfV01JLAorCQkgICAid21pIGRiZ2xvZyBjZmcgbW9kdWxlcyAweCUwMTZsbHggMHglMDE2bGx4IGNvbmZpZyAlMDh4ICUwOHhcbiIsCisJCSAgIF9fbGU2NF90b19jcHUoY21kLT5tb2R1bGVfZW5hYmxlKSwKKwkJICAgX19sZTY0X3RvX2NwdShjbWQtPm1vZHVsZV92YWxpZCksCisJCSAgIF9fbGUzMl90b19jcHUoY21kLT5jb25maWdfZW5hYmxlKSwKKwkJICAgX19sZTMyX3RvX2NwdShjbWQtPmNvbmZpZ192YWxpZCkpOworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCiBhdGgxMGtfd21pX29wX2dlbl9wa3Rsb2dfZW5hYmxlKHN0cnVjdCBhdGgxMGsgKmFyLCB1MzIgZXZfYml0bWFwKQogewogCXN0cnVjdCB3bWlfcGRldl9wa3Rsb2dfZW5hYmxlX2NtZCAqY21kOwpAQCAtNzY0OSw2ICs3NzY2LDQ4IEBACiAJcmV0dXJuIHNrYjsKIH0KIAorc3RhdGljIHN0cnVjdCBza19idWZmICoKK2F0aDEwa193bWlfb3BfZ2VuX2VjaG8oc3RydWN0IGF0aDEwayAqYXIsIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgd21pX2VjaG9fY21kICpjbWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IGF0aDEwa193bWlfYWxsb2Nfc2tiKGFyLCBzaXplb2YoKmNtZCkpOworCWlmICghc2tiKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWNtZCA9IChzdHJ1Y3Qgd21pX2VjaG9fY21kICopc2tiLT5kYXRhOworCWNtZC0+dmFsdWUgPSBjcHVfdG9fbGUzMih2YWx1ZSk7CisKKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwKKwkJICAgIndtaSBlY2hvIHZhbHVlIDB4JTA4eFxuIiwgdmFsdWUpOworCXJldHVybiBza2I7Cit9CisKK2ludAorYXRoMTBrX3dtaV9iYXJyaWVyKHN0cnVjdCBhdGgxMGsgKmFyKQoreworCWludCByZXQ7CisJaW50IHRpbWVfbGVmdDsKKworCXNwaW5fbG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisJcmVpbml0X2NvbXBsZXRpb24oJmFyLT53bWkuYmFycmllcik7CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCisJcmV0ID0gYXRoMTBrX3dtaV9lY2hvKGFyLCBBVEgxMEtfV01JX0JBUlJJRVJfRUNIT19JRCk7CisJaWYgKHJldCkgeworCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byBzdWJtaXQgd21pIGVjaG86ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXRpbWVfbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmYXItPndtaS5iYXJyaWVyLAorCQkJCQkJQVRIMTBLX1dNSV9CQVJSSUVSX1RJTUVPVVRfSFopOworCWlmICghdGltZV9sZWZ0KQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHdtaV9vcHMgd21pX29wcyA9IHsKIAkucnggPSBhdGgxMGtfd21pX29wX3J4LAogCS5tYXBfc3ZjID0gd21pX21haW5fc3ZjX21hcCwKQEAgLTc2NjUsNiArNzgyNCw3IEBACiAJLnB1bGxfcmR5ID0gYXRoMTBrX3dtaV9vcF9wdWxsX3JkeV9ldiwKIAkucHVsbF9md19zdGF0cyA9IGF0aDEwa193bWlfbWFpbl9vcF9wdWxsX2Z3X3N0YXRzLAogCS5wdWxsX3JvYW1fZXYgPSBhdGgxMGtfd21pX29wX3B1bGxfcm9hbV9ldiwKKwkucHVsbF9lY2hvX2V2ID0gYXRoMTBrX3dtaV9vcF9wdWxsX2VjaG9fZXYsCiAKIAkuZ2VuX3BkZXZfc3VzcGVuZCA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfc3VzcGVuZCwKIAkuZ2VuX3BkZXZfcmVzdW1lID0gYXRoMTBrX3dtaV9vcF9nZW5fcGRldl9yZXN1bWUsCkBAIC03NzA5LDYgKzc4NjksNyBAQAogCS5nZW5fZGVsYmFfc2VuZCA9IGF0aDEwa193bWlfb3BfZ2VuX2RlbGJhX3NlbmQsCiAJLmZ3X3N0YXRzX2ZpbGwgPSBhdGgxMGtfd21pX21haW5fb3BfZndfc3RhdHNfZmlsbCwKIAkuZ2V0X3ZkZXZfc3VidHlwZSA9IGF0aDEwa193bWlfb3BfZ2V0X3ZkZXZfc3VidHlwZSwKKwkuZ2VuX2VjaG8gPSBhdGgxMGtfd21pX29wX2dlbl9lY2hvLAogCS8qIC5nZW5fYmNuX3RtcGwgbm90IGltcGxlbWVudGVkICovCiAJLyogLmdlbl9wcmJfdG1wbCBub3QgaW1wbGVtZW50ZWQgKi8KIAkvKiAuZ2VuX3AycF9nb19iY25faWUgbm90IGltcGxlbWVudGVkICovCkBAIC03NzM4LDYgKzc4OTksNyBAQAogCS5wdWxsX3BoeWVyciA9IGF0aDEwa193bWlfb3BfcHVsbF9waHllcnJfZXYsCiAJLnB1bGxfcmR5ID0gYXRoMTBrX3dtaV9vcF9wdWxsX3JkeV9ldiwKIAkucHVsbF9yb2FtX2V2ID0gYXRoMTBrX3dtaV9vcF9wdWxsX3JvYW1fZXYsCisJLnB1bGxfZWNob19ldiA9IGF0aDEwa193bWlfb3BfcHVsbF9lY2hvX2V2LAogCiAJLmdlbl9wZGV2X3N1c3BlbmQgPSBhdGgxMGtfd21pX29wX2dlbl9wZGV2X3N1c3BlbmQsCiAJLmdlbl9wZGV2X3Jlc3VtZSA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfcmVzdW1lLApAQCAtNzc3Nyw2ICs3OTM5LDcgQEAKIAkuZ2VuX2RlbGJhX3NlbmQgPSBhdGgxMGtfd21pX29wX2dlbl9kZWxiYV9zZW5kLAogCS5md19zdGF0c19maWxsID0gYXRoMTBrX3dtaV8xMHhfb3BfZndfc3RhdHNfZmlsbCwKIAkuZ2V0X3ZkZXZfc3VidHlwZSA9IGF0aDEwa193bWlfb3BfZ2V0X3ZkZXZfc3VidHlwZSwKKwkuZ2VuX2VjaG8gPSBhdGgxMGtfd21pX29wX2dlbl9lY2hvLAogCS8qIC5nZW5fYmNuX3RtcGwgbm90IGltcGxlbWVudGVkICovCiAJLyogLmdlbl9wcmJfdG1wbCBub3QgaW1wbGVtZW50ZWQgKi8KIAkvKiAuZ2VuX3AycF9nb19iY25faWUgbm90IGltcGxlbWVudGVkICovCkBAIC03Nzk2LDYgKzc5NTksNyBAQAogCS5wdWxsX3N2Y19yZHkgPSBhdGgxMGtfd21pXzEweF9vcF9wdWxsX3N2Y19yZHlfZXYsCiAJLmdlbl9wZGV2X3NldF9yZCA9IGF0aDEwa193bWlfMTB4X29wX2dlbl9wZGV2X3NldF9yZCwKIAkuZ2VuX3N0YXJ0X3NjYW4gPSBhdGgxMGtfd21pXzEweF9vcF9nZW5fc3RhcnRfc2NhbiwKKwkuZ2VuX2VjaG8gPSBhdGgxMGtfd21pX29wX2dlbl9lY2hvLAogCiAJLnB1bGxfc2NhbiA9IGF0aDEwa193bWlfb3BfcHVsbF9zY2FuX2V2LAogCS5wdWxsX21nbXRfcnggPSBhdGgxMGtfd21pX29wX3B1bGxfbWdtdF9yeF9ldiwKQEAgLTc4MDcsNiArNzk3MSw3IEBACiAJLnB1bGxfcGh5ZXJyID0gYXRoMTBrX3dtaV9vcF9wdWxsX3BoeWVycl9ldiwKIAkucHVsbF9yZHkgPSBhdGgxMGtfd21pX29wX3B1bGxfcmR5X2V2LAogCS5wdWxsX3JvYW1fZXYgPSBhdGgxMGtfd21pX29wX3B1bGxfcm9hbV9ldiwKKwkucHVsbF9lY2hvX2V2ID0gYXRoMTBrX3dtaV9vcF9wdWxsX2VjaG9fZXYsCiAKIAkuZ2VuX3BkZXZfc3VzcGVuZCA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfc3VzcGVuZCwKIAkuZ2VuX3BkZXZfcmVzdW1lID0gYXRoMTBrX3dtaV9vcF9nZW5fcGRldl9yZXN1bWUsCkBAIC03ODYyLDYgKzgwMjcsNyBAQAogCS5wdWxsX3N2Y19yZHkgPSBhdGgxMGtfd21pXzEweF9vcF9wdWxsX3N2Y19yZHlfZXYsCiAJLmdlbl9wZGV2X3NldF9yZCA9IGF0aDEwa193bWlfMTB4X29wX2dlbl9wZGV2X3NldF9yZCwKIAkuZ2VuX3N0YXJ0X3NjYW4gPSBhdGgxMGtfd21pXzEweF9vcF9nZW5fc3RhcnRfc2NhbiwKKwkuZ2VuX2VjaG8gPSBhdGgxMGtfd21pX29wX2dlbl9lY2hvLAogCiAJLnB1bGxfc2NhbiA9IGF0aDEwa193bWlfb3BfcHVsbF9zY2FuX2V2LAogCS5wdWxsX21nbXRfcnggPSBhdGgxMGtfd21pX29wX3B1bGxfbWdtdF9yeF9ldiwKQEAgLTc4NzMsNiArODAzOSw3IEBACiAJLnB1bGxfcGh5ZXJyID0gYXRoMTBrX3dtaV9vcF9wdWxsX3BoeWVycl9ldiwKIAkucHVsbF9yZHkgPSBhdGgxMGtfd21pX29wX3B1bGxfcmR5X2V2LAogCS5wdWxsX3JvYW1fZXYgPSBhdGgxMGtfd21pX29wX3B1bGxfcm9hbV9ldiwKKwkucHVsbF9lY2hvX2V2ID0gYXRoMTBrX3dtaV9vcF9wdWxsX2VjaG9fZXYsCiAKIAkuZ2VuX3BkZXZfc3VzcGVuZCA9IGF0aDEwa193bWlfb3BfZ2VuX3BkZXZfc3VzcGVuZCwKIAkuZ2VuX3BkZXZfcmVzdW1lID0gYXRoMTBrX3dtaV9vcF9nZW5fcGRldl9yZXN1bWUsCkBAIC03OTY4LDcgKzgxMzUsNyBAQAogCS5nZW5fcGRldl9zZXRfd21tID0gYXRoMTBrX3dtaV9vcF9nZW5fcGRldl9zZXRfd21tLAogCS5nZW5fZm9yY2VfZndfaGFuZyA9IGF0aDEwa193bWlfb3BfZ2VuX2ZvcmNlX2Z3X2hhbmcsCiAJLmdlbl9tZ210X3R4ID0gYXRoMTBrX3dtaV9vcF9nZW5fbWdtdF90eCwKLQkuZ2VuX2RiZ2xvZ19jZmcgPSBhdGgxMGtfd21pX29wX2dlbl9kYmdsb2dfY2ZnLAorCS5nZW5fZGJnbG9nX2NmZyA9IGF0aDEwa193bWlfMTBfNF9vcF9nZW5fZGJnbG9nX2NmZywKIAkuZ2VuX3BrdGxvZ19lbmFibGUgPSBhdGgxMGtfd21pX29wX2dlbl9wa3Rsb2dfZW5hYmxlLAogCS5nZW5fcGt0bG9nX2Rpc2FibGUgPSBhdGgxMGtfd21pX29wX2dlbl9wa3Rsb2dfZGlzYWJsZSwKIAkuZ2VuX3BkZXZfc2V0X3F1aWV0X21vZGUgPSBhdGgxMGtfd21pX29wX2dlbl9wZGV2X3NldF9xdWlldF9tb2RlLApAQCAtNzk4MCwxMCArODE0NywxMiBAQAogCS5leHRfcmVzb3VyY2VfY29uZmlnID0gYXRoMTBrX3dtaV8xMF80X2V4dF9yZXNvdXJjZV9jb25maWcsCiAKIAkvKiBzaGFyZWQgd2l0aCAxMC4yICovCisJLnB1bGxfZWNob19ldiA9IGF0aDEwa193bWlfb3BfcHVsbF9lY2hvX2V2LAogCS5nZW5fcmVxdWVzdF9zdGF0cyA9IGF0aDEwa193bWlfb3BfZ2VuX3JlcXVlc3Rfc3RhdHMsCiAJLmdlbl9wZGV2X2dldF90ZW1wZXJhdHVyZSA9IGF0aDEwa193bWlfMTBfMl9vcF9nZW5fcGRldl9nZXRfdGVtcGVyYXR1cmUsCiAJLmdldF92ZGV2X3N1YnR5cGUgPSBhdGgxMGtfd21pXzEwXzRfb3BfZ2V0X3ZkZXZfc3VidHlwZSwKIAkuZ2VuX3BkZXZfYnNzX2NoYW5faW5mb19yZXEgPSBhdGgxMGtfd21pXzEwXzJfb3BfZ2VuX3BkZXZfYnNzX2NoYW5faW5mbywKKwkuZ2VuX2VjaG8gPSBhdGgxMGtfd21pX29wX2dlbl9lY2hvLAogfTsKIAogaW50IGF0aDEwa193bWlfYXR0YWNoKHN0cnVjdCBhdGgxMGsgKmFyKQpAQCAtODAzNiw2ICs4MjA1LDcgQEAKIAogCWluaXRfY29tcGxldGlvbigmYXItPndtaS5zZXJ2aWNlX3JlYWR5KTsKIAlpbml0X2NvbXBsZXRpb24oJmFyLT53bWkudW5pZmllZF9yZWFkeSk7CisJaW5pdF9jb21wbGV0aW9uKCZhci0+d21pLmJhcnJpZXIpOwogCiAJSU5JVF9XT1JLKCZhci0+c3ZjX3JkeV93b3JrLCBhdGgxMGtfd21pX2V2ZW50X3NlcnZpY2VfcmVhZHlfd29yayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5oCmluZGV4IDNlZjQ2ODguLjFiMjQzYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWkuaApAQCAtNTUsNyArNTUsNyBAQAogICogICAgdHlwZS4KICAqCiAgKiA2LiBDb21tZW50IGVhY2ggcGFyYW1ldGVyIHBhcnQgb2YgdGhlIFdNSSBjb21tYW5kL2V2ZW50IHN0cnVjdHVyZSBieQotICogICAgdXNpbmcgdGhlIDIgc3RhcnMgYXQgdGhlIGJlZ2luaW5nIG9mIEMgY29tbWVudCBpbnN0ZWFkIG9mIG9uZSBzdGFyIHRvCisgKiAgICB1c2luZyB0aGUgMiBzdGFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIEMgY29tbWVudCBpbnN0ZWFkIG9mIG9uZSBzdGFyIHRvCiAgKiAgICBlbmFibGUgSFRNTCBkb2N1bWVudCBnZW5lcmF0aW9uIHVzaW5nIERveHlnZW4uCiAgKgogICovCkBAIC0xODAsNiArMTgwLDcgQEAKIAlXTUlfU0VSVklDRV9NRVNIX05PTl8xMVMsCiAJV01JX1NFUlZJQ0VfUEVFUl9TVEFUUywKIAlXTUlfU0VSVklDRV9SRVNUUlRfQ0hOTF9TVVBQT1JULAorCVdNSV9TRVJWSUNFX1BFUklPRElDX0NIQU5fU1RBVF9TVVBQT1JULAogCVdNSV9TRVJWSUNFX1RYX01PREVfUFVTSF9PTkxZLAogCVdNSV9TRVJWSUNFX1RYX01PREVfUFVTSF9QVUxMLAogCVdNSV9TRVJWSUNFX1RYX01PREVfRFlOQU1JQywKQEAgLTMwNSw2ICszMDYsNyBAQAogCVdNSV8xMF80X1NFUlZJQ0VfUkVTVFJUX0NITkxfU1VQUE9SVCwKIAlXTUlfMTBfNF9TRVJWSUNFX1BFRVJfU1RBVFMsCiAJV01JXzEwXzRfU0VSVklDRV9NRVNIXzExUywKKwlXTUlfMTBfNF9TRVJWSUNFX1BFUklPRElDX0NIQU5fU1RBVF9TVVBQT1JULAogCVdNSV8xMF80X1NFUlZJQ0VfVFhfTU9ERV9QVVNIX09OTFksCiAJV01JXzEwXzRfU0VSVklDRV9UWF9NT0RFX1BVU0hfUFVMTCwKIAlXTUlfMTBfNF9TRVJWSUNFX1RYX01PREVfRFlOQU1JQywKQEAgLTQwMiw2ICs0MDQsNyBAQAogCVNWQ1NUUihXTUlfU0VSVklDRV9NRVNIX05PTl8xMVMpOwogCVNWQ1NUUihXTUlfU0VSVklDRV9QRUVSX1NUQVRTKTsKIAlTVkNTVFIoV01JX1NFUlZJQ0VfUkVTVFJUX0NITkxfU1VQUE9SVCk7CisJU1ZDU1RSKFdNSV9TRVJWSUNFX1BFUklPRElDX0NIQU5fU1RBVF9TVVBQT1JUKTsKIAlTVkNTVFIoV01JX1NFUlZJQ0VfVFhfTU9ERV9QVVNIX09OTFkpOwogCVNWQ1NUUihXTUlfU0VSVklDRV9UWF9NT0RFX1BVU0hfUFVMTCk7CiAJU1ZDU1RSKFdNSV9TRVJWSUNFX1RYX01PREVfRFlOQU1JQyk7CkBAIC02NTIsNiArNjU1LDggQEAKIAkgICAgICAgV01JX1NFUlZJQ0VfUEVFUl9TVEFUUywgbGVuKTsKIAlTVkNNQVAoV01JXzEwXzRfU0VSVklDRV9NRVNIXzExUywKIAkgICAgICAgV01JX1NFUlZJQ0VfTUVTSF8xMVMsIGxlbik7CisJU1ZDTUFQKFdNSV8xMF80X1NFUlZJQ0VfUEVSSU9ESUNfQ0hBTl9TVEFUX1NVUFBPUlQsCisJICAgICAgIFdNSV9TRVJWSUNFX1BFUklPRElDX0NIQU5fU1RBVF9TVVBQT1JULCBsZW4pOwogCVNWQ01BUChXTUlfMTBfNF9TRVJWSUNFX1RYX01PREVfUFVTSF9PTkxZLAogCSAgICAgICBXTUlfU0VSVklDRV9UWF9NT0RFX1BVU0hfT05MWSwgbGVuKTsKIAlTVkNNQVAoV01JXzEwXzRfU0VSVklDRV9UWF9NT0RFX1BVU0hfUFVMTCwKQEAgLTIwODIsNyArMjA4Nyw3IEBACiAJICogSW4gb2ZmbG9hZCBtb2RlIHRhcmdldCBzdXBwb3J0cyBmZWF0dXJlcyBsaWtlIFdPVywgY2hhdHRlciBhbmQKIAkgKiBvdGhlciBwcm90b2NvbCBvZmZsb2Fkcy4gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGVtIHNvbWUKIAkgKiBmdW5jdGlvbmFsaXRpZXMgbGlrZSByZW9yZGVyIGJ1ZmZlcmluZywgUE4gY2hlY2tpbmcgbmVlZCB0byBiZQotCSAqIGRvbmUgaW4gdGFyZ2V0LiBUaGlzIGRldGVybWluZXMgbWF4aW11bSBudW1iZXIgb2YgcGVlcnMgc3Vwb3J0ZWQKKwkgKiBkb25lIGluIHRhcmdldC4gVGhpcyBkZXRlcm1pbmVzIG1heGltdW0gbnVtYmVyIG9mIHBlZXJzIHN1cHBvcnRlZAogCSAqIGJ5IHRhcmdldCBpbiBvZmZsb2FkIG1vZGUKIAkgKi8KIAlfX2xlMzIgbnVtX29mZmxvYWRfcGVlcnM7CkBAIC0yMjYzLDcgKzIyNjgsNyBAQAogCSAqIE1heC4gbnVtYmVyIG9mIFR4IGZyYWdtZW50cyBwZXIgTVNEVQogCSAqICBUaGlzIHBhcmFtZXRlciBjb250cm9scyB0aGUgbWF4IG51bWJlciBvZiBUeCBmcmFnbWVudHMgcGVyIE1TRFUuCiAJICogIFRoaXMgaXMgc2VudCBieSB0aGUgdGFyZ2V0IGFzIHBhcnQgb2YgdGhlIFdNSV9TRVJWSUNFX1JFQURZIGV2ZW50Ci0JICogIGFuZCBpcyBvdmVycmlkZW4gYnkgdGhlIE9TIHNoaW0gYXMgcmVxdWlyZWQuCisJICogIGFuZCBpcyBvdmVycmlkZGVuIGJ5IHRoZSBPUyBzaGltIGFzIHJlcXVpcmVkLgogCSAqLwogCV9fbGUzMiBtYXhfZnJhZ19lbnRyaWVzOwogfSBfX3BhY2tlZDsKQEAgLTI0NDUsNyArMjQ1MCw3IEBACiAJICogTWF4LiBudW1iZXIgb2YgVHggZnJhZ21lbnRzIHBlciBNU0RVCiAJICogIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZSBtYXggbnVtYmVyIG9mIFR4IGZyYWdtZW50cyBwZXIgTVNEVS4KIAkgKiAgVGhpcyBpcyBzZW50IGJ5IHRoZSB0YXJnZXQgYXMgcGFydCBvZiB0aGUgV01JX1NFUlZJQ0VfUkVBRFkgZXZlbnQKLQkgKiAgYW5kIGlzIG92ZXJyaWRlbiBieSB0aGUgT1Mgc2hpbSBhcyByZXF1aXJlZC4KKwkgKiAgYW5kIGlzIG92ZXJyaWRkZW4gYnkgdGhlIE9TIHNoaW0gYXMgcmVxdWlyZWQuCiAJICovCiAJX19sZTMyIG1heF9mcmFnX2VudHJpZXM7CiB9IF9fcGFja2VkOwpAQCAtMjczOSw3ICsyNzQ0LDcgQEAKIAlzdHJ1Y3Qgd21pX2hvc3RfbWVtX2NodW5rcyBtZW1fY2h1bmtzOwogfSBfX3BhY2tlZDsKIAotLyogXzEweCBzdHVjdHVyZSBpcyBmcm9tIDEwLlggRlcgQVBJICovCisvKiBfMTB4IHN0cnVjdHVyZSBpcyBmcm9tIDEwLlggRlcgQVBJICovCiBzdHJ1Y3Qgd21pX2luaXRfY21kXzEweCB7CiAJc3RydWN0IHdtaV9yZXNvdXJjZV9jb25maWdfMTB4IHJlc291cmNlX2NvbmZpZzsKIAlzdHJ1Y3Qgd21pX2hvc3RfbWVtX2NodW5rcyBtZW1fY2h1bmtzOwpAQCAtMzk2Miw3ICszOTY3LDcgQEAKIAkvKiBpbGxlZ2FsIHJhdGUgcGh5IGVycm9ycyAgKi8KIAlfX2xlMzIgaWxsZ2xfcmF0ZV9waHlfZXJyOwogCi0JLyogd2FsIHBkZXYgY29udGlub3VzIHhyZXRyeSAqLworCS8qIHdhbCBwZGV2IGNvbnRpbnVvdXMgeHJldHJ5ICovCiAJX19sZTMyIHBkZXZfY29udF94cmV0cnk7CiAKIAkvKiB3YWwgcGRldiBjb250aW5vdXMgeHJldHJ5ICovCkBAIC00MjE3LDEwICs0MjIyLDEwIEBACiAgKi8KIHN0cnVjdCB3bWlfcGRldl9zdGF0c19iYXNlIHsKIAlfX2xlMzIgY2hhbl9uZjsKLQlfX2xlMzIgdHhfZnJhbWVfY291bnQ7Ci0JX19sZTMyIHJ4X2ZyYW1lX2NvdW50OwotCV9fbGUzMiByeF9jbGVhcl9jb3VudDsKLQlfX2xlMzIgY3ljbGVfY291bnQ7CisJX19sZTMyIHR4X2ZyYW1lX2NvdW50OyAvKiBDeWNsZXMgc3BlbnQgdHJhbnNtaXR0aW5nIGZyYW1lcyAqLworCV9fbGUzMiByeF9mcmFtZV9jb3VudDsgLyogQ3ljbGVzIHNwZW50IHJlY2VpdmluZyBmcmFtZXMgKi8KKwlfX2xlMzIgcnhfY2xlYXJfY291bnQ7IC8qIFRvdGFsIGNoYW5uZWwgYnVzeSB0aW1lLCBldmlkZW50bHkgKi8KKwlfX2xlMzIgY3ljbGVfY291bnQ7IC8qIFRvdGFsIG9uLWNoYW5uZWwgdGltZSAqLwogCV9fbGUzMiBwaHlfZXJyX2NvdW50OwogCV9fbGUzMiBjaGFuX3R4X3B3cjsKIH0gX19wYWNrZWQ7CkBAIC00NDU2LDkgKzQ0NjEsOSBAQAogCV9fbGUzMiBmbGFnczsKIAkvKiBzc2lkIGZpZWxkLiBPbmx5IHZhbGlkIGZvciBBUC9HTy9JQlNTL0JUQW1wIFZERVYgdHlwZS4gKi8KIAlzdHJ1Y3Qgd21pX3NzaWQgc3NpZDsKLQkvKiBiZWFjb24vcHJvYmUgcmVwb25zZSB4bWl0IHJhdGUuIEFwcGxpY2FibGUgZm9yIFNvZnRBUC4gKi8KKwkvKiBiZWFjb24vcHJvYmUgcmVzcG9uc2UgeG1pdCByYXRlLiBBcHBsaWNhYmxlIGZvciBTb2Z0QVAuICovCiAJX19sZTMyIGJjbl90eF9yYXRlOwotCS8qIGJlYWNvbi9wcm9iZSByZXBvbnNlIHhtaXQgcG93ZXIuIEFwcGxpY2FibGUgZm9yIFNvZnRBUC4gKi8KKwkvKiBiZWFjb24vcHJvYmUgcmVzcG9uc2UgeG1pdCBwb3dlci4gQXBwbGljYWJsZSBmb3IgU29mdEFQLiAqLwogCV9fbGUzMiBiY25fdHhfcG93ZXI7CiAJLyogbnVtYmVyIG9mIHAycCBOT0EgZGVzY3JpcHRvcihzKSBmcm9tIHNjYW4gZW50cnkgKi8KIAlfX2xlMzIgbnVtX25vYV9kZXNjcmlwdG9yczsKQEAgLTQ2ODYsNyArNDY5MSw3IEBACiAJV01JX1ZERVZfUEFSQU1fQkVBQ09OX0lOVEVSVkFMLAogCS8qIExpc3RlbiBpbnRlcnZhbCBpbiBUVXMgKi8KIAlXTUlfVkRFVl9QQVJBTV9MSVNURU5fSU5URVJWQUwsCi0JLyogbXV0aWNhc3QgcmF0ZSBpbiBNYnBzICovCisJLyogbXVsdGljYXN0IHJhdGUgaW4gTWJwcyAqLwogCVdNSV9WREVWX1BBUkFNX01VTFRJQ0FTVF9SQVRFLAogCS8qIG1hbmFnZW1lbnQgZnJhbWUgcmF0ZSBpbiBNYnBzICovCiAJV01JX1ZERVZfUEFSQU1fTUdNVF9UWF9SQVRFLApAQCAtNDgxNyw3ICs0ODIyLDcgQEAKIAlXTUlfMTBYX1ZERVZfUEFSQU1fQkVBQ09OX0lOVEVSVkFMLAogCS8qIExpc3RlbiBpbnRlcnZhbCBpbiBUVXMgKi8KIAlXTUlfMTBYX1ZERVZfUEFSQU1fTElTVEVOX0lOVEVSVkFMLAotCS8qIG11dGljYXN0IHJhdGUgaW4gTWJwcyAqLworCS8qIG11bHRpY2FzdCByYXRlIGluIE1icHMgKi8KIAlXTUlfMTBYX1ZERVZfUEFSQU1fTVVMVElDQVNUX1JBVEUsCiAJLyogbWFuYWdlbWVudCBmcmFtZSByYXRlIGluIE1icHMgKi8KIAlXTUlfMTBYX1ZERVZfUEFSQU1fTUdNVF9UWF9SQVRFLApAQCAtNTA2Miw3ICs1MDY3LDcgQEAKIH0gX19wYWNrZWQ7CiAKIC8qIFZERVYgc3RhcnQgcmVzcG9uc2Ugc3RhdHVzIGNvZGVzICovCi0vKiBWREVWIHN1Y2Nlc2Z1bGx5IHN0YXJ0ZWQgKi8KKy8qIFZERVYgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgKi8KICNkZWZpbmUgV01JX0lOSUZJRURfVkRFVl9TVEFSVF9SRVNQT05TRV9TVEFUVVNfU1VDQ0VTUwkweDAKIAogLyogcmVxdWVzdGVkIFZERVYgbm90IGZvdW5kICovCkBAIC01Mzc4LDcgKzUzODMsNyBAQAogI2RlZmluZSBXTUlfVUFQU0RfQUNfVFlQRV9UUklHIDEKIAogI2RlZmluZSBXTUlfVUFQU0RfQUNfQklUX01BU0soYWMsIHR5cGUpIFwKLQkoKHR5cGUgPT0gIFdNSV9VQVBTRF9BQ19UWVBFX0RFTEkpID8gKDEgPDwgKGFjIDw8IDEpKSA6ICgxIDw8ICgoYWMgPDwgMSkgKyAxKSkpCisJKHR5cGUgPT0gV01JX1VBUFNEX0FDX1RZUEVfREVMSSA/IDEgPDwgKGFjIDw8IDEpIDogMSA8PCAoKGFjIDw8IDEpICsgMSkpCiAKIGVudW0gd21pX3N0YV9wc19wYXJhbV91YXBzZCB7CiAJV01JX1NUQV9QU19VQVBTRF9BQzBfREVMSVZFUllfRU4gPSAoMSA8PCAwKSwKQEAgLTYxNjksNiArNjE3NCwyMCBAQAogCV9fbGUzMiBjb25maWdfdmFsaWQ7CiB9IF9fcGFja2VkOwogCitzdHJ1Y3Qgd21pXzEwXzRfZGJnbG9nX2NmZ19jbWQgeworCS8qIGJpdG1hc2sgdG8gaG9sZCBtb2QgaWQgY29uZmlnKi8KKwlfX2xlNjQgbW9kdWxlX2VuYWJsZTsKKworCS8qIHNlZSBBVEgxMEtfREJHTE9HX0NGR18gKi8KKwlfX2xlMzIgY29uZmlnX2VuYWJsZTsKKworCS8qIG1hc2sgb2YgbW9kdWxlIGlkIGJpdHMgdG8gYmUgY2hhbmdlZCAqLworCV9fbGU2NCBtb2R1bGVfdmFsaWQ7CisKKwkvKiBtYXNrIG9mIGNvbmZpZyBiaXRzIHRvIGJlIGNoYW5nZWQsIHNlZSBBVEgxMEtfREJHTE9HX0NGR18gKi8KKwlfX2xlMzIgY29uZmlnX3ZhbGlkOworfSBfX3BhY2tlZDsKKwogZW51bSB3bWlfcm9hbV9yZWFzb24gewogCVdNSV9ST0FNX1JFQVNPTl9CRVRURVJfQVAgPSAxLAogCVdNSV9ST0FNX1JFQVNPTl9CRUFDT05fTUlTUyA9IDIsCkBAIC02Mjk2LDYgKzYzMTUsMTAgQEAKIAlfX2xlMzIgcnNzaTsKIH07CiAKK3N0cnVjdCB3bWlfZWNob19ldl9hcmcgeworCV9fbGUzMiB2YWx1ZTsKK307CisKIHN0cnVjdCB3bWlfcGRldl90ZW1wZXJhdHVyZV9ldmVudCB7CiAJLyogdGVtcGVyYXR1cmUgdmFsdWUgaW4gQ2VsY2l1cyBkZWdyZWUgKi8KIAlfX2xlMzIgdGVtcGVyYXR1cmU7CkBAIC02NjI0LDUgKzY2NDcsNiBAQAogCQkJCSAgICAgIGNoYXIgKmJ1Zik7CiBpbnQgYXRoMTBrX3dtaV9vcF9nZXRfdmRldl9zdWJ0eXBlKHN0cnVjdCBhdGgxMGsgKmFyLAogCQkJCSAgIGVudW0gd21pX3ZkZXZfc3VidHlwZSBzdWJ0eXBlKTsKK2ludCBhdGgxMGtfd21pX2JhcnJpZXIoc3RydWN0IGF0aDEwayAqYXIpOwogCiAjZW5kaWYgLyogX1dNSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVidWcuYwppbmRleCA5MjlkN2NjLi40ZjhkOWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVidWcuYwpAQCAtOTA5LDcgKzkwOSw3IEBACiAJc3RydWN0IGF0aDVrX2h3ICphaCA9IGlub2RlLT5pX3ByaXZhdGU7CiAJYm9vbCByZXM7CiAJaW50IGksIHJldDsKLQl1MzIgZWVzaXplOworCXUzMiBlZXNpemU7CS8qIE5COiBpbiAxNi1iaXQgd29yZHMgKi8KIAl1MTYgdmFsLCAqYnVmOwogCiAJLyogR2V0IGVlcHJvbSBzaXplICovCkBAIC05MzIsNyArOTMyLDcgQEAKIAogCS8qIENyZWF0ZSBidWZmZXIgYW5kIHJlYWQgaW4gZWVwcm9tICovCiAKLQlidWYgPSB2bWFsbG9jKGVlc2l6ZSk7CisJYnVmID0gdm1hbGxvYyhlZXNpemUgKiAyKTsKIAlpZiAoIWJ1ZikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKQEAgLTk1Miw3ICs5NTIsNyBAQAogCX0KIAogCWVwLT5idWYgPSBidWY7Ci0JZXAtPmxlbiA9IGk7CisJZXAtPmxlbiA9IGVlc2l6ZSAqIDI7CiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKWVwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMKaW5kZXggNzJlMmVjNi4uYjdmZTBhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuYwpAQCAtMTQ0OSwxNCArMTQ0OSwxNCBAQAogCQlyZXR1cm4gLUVJTzsKIAogCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkgewotCQlhci0+dHhfcHdyID0gMDsKKwkJYXItPnR4X3B3ciA9IDI1NTsKIAogCQlpZiAoYXRoNmtsX3dtaV9nZXRfdHhfcHdyX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgpICE9IDApIHsKIAkJCWF0aDZrbF9lcnIoImF0aDZrbF93bWlfZ2V0X3R4X3B3cl9jbWQgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXItPmV2ZW50X3dxLCBhci0+dHhfcHdyICE9IDAsCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGFyLT5ldmVudF93cSwgYXItPnR4X3B3ciAhPSAyNTUsCiAJCQkJCQkgNSAqIEhaKTsKIAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi5jCmluZGV4IDE4YzA3MDguLmQxOTQyNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuYwpAQCAtNjQsNyArNjQsNyBAQAogfQogRVhQT1JUX1NZTUJPTChhdGg2a2xfaGlmX3J3X2NvbXBfaGFuZGxlcik7CiAKLSNkZWZpbmUgUkVHX0RVTVBfQ09VTlRfQVI2MDAzICAgNjAKKyNkZWZpbmUgUkVHSVNURVJfRFVNUF9DT1VOVCAgICAgNjAKICNkZWZpbmUgUkVHSVNURVJfRFVNUF9MRU5fTUFYICAgNjAKIAogc3RhdGljIHZvaWQgYXRoNmtsX2hpZl9kdW1wX2Z3X2NyYXNoKHN0cnVjdCBhdGg2a2wgKmFyKQpAQCAtNzMsOSArNzMsNiBAQAogCXUzMiBpLCBhZGRyZXNzLCByZWdkdW1wX2FkZHIgPSAwOwogCWludCByZXQ7CiAKLQlpZiAoYXItPnRhcmdldF90eXBlICE9IFRBUkdFVF9UWVBFX0FSNjAwMykKLQkJcmV0dXJuOwotCiAJLyogdGhlIHJlZyBkdW1wIHBvaW50ZXIgaXMgY29waWVkIHRvIHRoZSBob3N0IGludGVyZXN0IGFyZWEgKi8KIAlhZGRyZXNzID0gYXRoNmtsX2dldF9oaV9pdGVtX2FkZHIoYXIsIEhJX0lURU0oaGlfZmFpbHVyZV9zdGF0ZSkpOwogCWFkZHJlc3MgPSBUQVJHX1ZUT1AoYXItPnRhcmdldF90eXBlLCBhZGRyZXNzKTsKQEAgLTk1LDcgKzkyLDcgQEAKIAogCS8qIGZldGNoIHJlZ2lzdGVyIGR1bXAgZGF0YSAqLwogCXJldCA9IGF0aDZrbF9kaWFnX3JlYWQoYXIsIHJlZ2R1bXBfYWRkciwgKHU4ICopJnJlZ2R1bXBfdmFsWzBdLAotCQkJCSAgUkVHX0RVTVBfQ09VTlRfQVI2MDAzICogKHNpemVvZih1MzIpKSk7CisJCQkJICBSRUdJU1RFUl9EVU1QX0NPVU5UICogKHNpemVvZih1MzIpKSk7CiAJaWYgKHJldCkgewogCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIGdldCByZWdpc3RlciBkdW1wOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuOwpAQCAtMTA1LDkgKzEwMiw5IEBACiAJYXRoNmtsX2luZm8oImh3IDB4JXggZncgJXNcbiIsIGFyLT53aXBoeS0+aHdfdmVyc2lvbiwKIAkJICAgIGFyLT53aXBoeS0+ZndfdmVyc2lvbik7CiAKLQlCVUlMRF9CVUdfT04oUkVHX0RVTVBfQ09VTlRfQVI2MDAzICUgNCk7CisJQlVJTERfQlVHX09OKFJFR0lTVEVSX0RVTVBfQ09VTlQgJSA0KTsKIAotCWZvciAoaSA9IDA7IGkgPCBSRUdfRFVNUF9DT1VOVF9BUjYwMDM7IGkgKz0gNCkgeworCWZvciAoaSA9IDA7IGkgPCBSRUdJU1RFUl9EVU1QX0NPVU5UOyBpICs9IDQpIHsKIAkJYXRoNmtsX2luZm8oIiVkOiAweCU4Ljh4IDB4JTguOHggMHglOC44eCAweCU4Ljh4XG4iLAogCQkJICAgIGksCiAJCQkgICAgbGUzMl90b19jcHUocmVnZHVtcF92YWxbaV0pLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmMKaW5kZXggYjhjZjA0ZC4uM2ZkMWNjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5jCkBAIC0zNTIwLDcgKzM1MjAsNyBAQAogCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0FQX1NFVF9QVkJfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogaW50IGF0aDZrbF93bWlfc2V0X3J4X2ZyYW1lX2Zvcm1hdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCmluZGV4IGY2OGNiMDAuLjhmMjMxYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9LY29uZmlnCkBAIC0xODAsNyArMTgwLDcgQEAKIGNvbmZpZyBBVEg5S19IV1JORwogCWJvb2wgIlJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBVEg5SyAmJiAoSFdfUkFORE9NID0geSB8fCBIV19SQU5ET00gPSBBVEg5SykKLQlkZWZhdWx0IHkKKwlkZWZhdWx0IG4KIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBpbmNvcnBvcmF0ZXMgdGhlIEFEQyByZWdpc3RlciBvdXRwdXQgYXMgYSBzb3VyY2Ugb2YKIAkgIHJhbmRvbW5lc3MgaW50byBMaW51eCBlbnRyb3B5IHBvb2wgKC9kZXYvdXJhbmRvbSBhbmQgL2Rldi9yYW5kb20pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyNTAwOF9waHkuYwppbmRleCAxYjI3MWI5Li44ZWVhOGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjUwMDhfcGh5LmMKQEAgLTI2MCw4ICsyNjAsOCBAQAogCWludCBjdXJfYmluOwogCWludCB1cHBlciwgbG93ZXIsIGN1cl92aXRfbWFzazsKIAlpbnQgaTsKLQlpbnQ4X3QgbWFza19tWzEyM107Ci0JaW50OF90IG1hc2tfcFsxMjNdOworCWludDhfdCBtYXNrX21bMTIzXSA9IHswfTsKKwlpbnQ4X3QgbWFza19wWzEyM10gPSB7MH07CiAJaW50OF90IG1hc2tfYW10OwogCWludCB0bXBfbWFzazsKIAlzdGF0aWMgY29uc3QgaW50IHBpbG90X21hc2tfcmVnWzRdID0gewpAQCAtMjc0LDkgKzI3NCw2IEBACiAJfTsKIAlzdGF0aWMgY29uc3QgaW50IGluY1s0XSA9IHsgMCwgMTAwLCAwLCAwIH07CiAKLQltZW1zZXQoJm1hc2tfbSwgMCwgc2l6ZW9mKGludDhfdCkgKiAxMjMpOwotCW1lbXNldCgmbWFza19wLCAwLCBzaXplb2YoaW50OF90KSAqIDEyMyk7Ci0KIAljdXJfYmluID0gLTYwMDA7CiAJdXBwZXIgPSBiaW4gKyAxMDA7CiAJbG93ZXIgPSBiaW4gLSAxMDA7CkBAIC0zMDIsNyArMjk5LDcgQEAKIAl1cHBlciA9IGJpbiArIDEyMDsKIAlsb3dlciA9IGJpbiAtIDEyMDsKIAotCWZvciAoaSA9IDA7IGkgPCAxMjM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1hc2tfbSk7IGkrKykgewogCQlpZiAoKGN1cl92aXRfbWFzayA+IGxvd2VyKSAmJiAoY3VyX3ZpdF9tYXNrIDwgdXBwZXIpKSB7CiAJCQkvKiB3b3JrYXJvdW5kIGZvciBnY2MgYnVnICMzNzAxNCAqLwogCQkJdm9sYXRpbGUgaW50IHRtcF92ID0gYWJzKGN1cl92aXRfbWFzayAtIGJpbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYwppbmRleCA1YmQyY2JhLi4wODYwN2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKQEAgLTMyNTIsNyArMzI1Miw4IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbWRhdGFfc2l6ZSAvIDI7IGkrKywgZGF0YSsrKQotCQlhdGg5a19od19udnJhbV9yZWFkKGFoLCBpLCBkYXRhKTsKKwkJaWYgKCFhdGg5a19od19udnJhbV9yZWFkKGFoLCBpLCBkYXRhKSkKKwkJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMjgyLDcgKzMyODMsOCBAQAogCWlmIChhdGg5a19od191c2VfZmxhc2goYWgpKSB7CiAJCXU4IHR4cng7CiAKLQkJYXI5MzAwX2VlcHJvbV9yZXN0b3JlX2ZsYXNoKGFoLCBtcHRyLCBtZGF0YV9zaXplKTsKKwkJaWYgKGFyOTMwMF9lZXByb21fcmVzdG9yZV9mbGFzaChhaCwgbXB0ciwgbWRhdGFfc2l6ZSkpCisJCQlyZXR1cm4gLUVJTzsKIAogCQkvKiBjaGVjayBpZiBlZXByb20gY29udGFpbnMgdmFsaWQgZGF0YSAqLwogCQllZXAgPSAoc3RydWN0IGFyOTMwMF9lZXByb20gKikgbXB0cjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ncGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jCmluZGV4IDQ5MGY3NGQuLmRkYjI4ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ncGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2dwaW8uYwpAQCAtMjIsNyArMjIsNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0xFRFMKIAotdm9pZCBhdGhfZmlsbF9sZWRfcGluKHN0cnVjdCBhdGhfc29mdGMgKnNjKQorc3RhdGljIHZvaWQgYXRoX2ZpbGxfbGVkX3BpbihzdHJ1Y3QgYXRoX3NvZnRjICpzYykKIHsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwppbmRleCBkMWQwYzA2Li4xNGIxM2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYwpAQCAtMjQ4Miw2ICsyNDgyLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJYXRoOWtfZ3Bpb19jYXBfaW5pdChhaCk7CisKIAlpZiAoQVJfU1JFVl85NDg1KGFoKSB8fAogCSAgICBBUl9TUkVWXzkyODUoYWgpIHx8CiAJICAgIEFSX1NSRVZfOTMzMChhaCkgfHwKQEAgLTI1MzEsOCArMjUzMyw2IEBACiAJZWxzZQogCQlwQ2FwLT5od19jYXBzICY9IH5BVEg5S19IV19DQVBfSFQ7CiAKLQlhdGg5a19ncGlvX2NhcF9pbml0KGFoKTsKLQogCWlmIChBUl9TUkVWXzkxNjBfMTBfT1JfTEFURVIoYWgpIHx8IEFSX1NSRVZfOTEwMChhaCkpCiAJCXBDYXAtPnJ0c19hZ2dyX2xpbWl0ID0gQVRIX0FNUERVX0xJTUlUX01BWDsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYwppbmRleCBhMzk0NjIyLi5lOWYzMmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKQEAgLTcxOCw5ICs3MTgsMTIgQEAKIAlpZiAoIWF0aF9jb21wbGV0ZV9yZXNldChzYywgZmFsc2UpKQogCQlhaC0+cmVzZXRfcG93ZXJfb24gPSBmYWxzZTsKIAotCWlmIChhaC0+bGVkX3BpbiA+PSAwKQorCWlmIChhaC0+bGVkX3BpbiA+PSAwKSB7CiAJCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBhaC0+bGVkX3BpbiwKIAkJCQkgIChhaC0+Y29uZmlnLmxlZF9hY3RpdmVfaGlnaCkgPyAxIDogMCk7CisJCWF0aDlrX2h3X2dwaW9fcmVxdWVzdF9vdXQoYWgsIGFoLT5sZWRfcGluLCBOVUxMLAorCQkJCQkgIEFSX0dQSU9fT1VUUFVUX01VWF9BU19PVVRQVVQpOworCX0KIAogCS8qCiAJICogUmVzZXQga2V5IGNhY2hlIHRvIHNhbmUgZGVmYXVsdHMgKGFsbCBlbnRyaWVzIGNsZWFyZWQpIGluc3RlYWQgb2YKQEAgLTg2NCw5ICs4NjcsMTEgQEAKIAogCXNwaW5fbG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKIAotCWlmIChhaC0+bGVkX3BpbiA+PSAwKQorCWlmIChhaC0+bGVkX3BpbiA+PSAwKSB7CiAJCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBhaC0+bGVkX3BpbiwKIAkJCQkgIChhaC0+Y29uZmlnLmxlZF9hY3RpdmVfaGlnaCkgPyAwIDogMSk7CisJCWF0aDlrX2h3X2dwaW9fcmVxdWVzdF9pbihhaCwgYWgtPmxlZF9waW4sIE5VTEwpOworCX0KIAogCWF0aF9wcmVwYXJlX3Jlc2V0KHNjKTsKIApAQCAtOTE5LDcgKzkyNCw3IEBACiAJfSBlbHNlIHsKIAkJaWYgKGl0ZXJfZGF0YS0+cHJpbWFyeV9iZWFjb25fdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCiAJCSAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCi0JCWl0ZXJfZGF0YS0+cHJpbWFyeV9iZWFjb25fdmlmID0gdmlmOworCQkJaXRlcl9kYXRhLT5wcmltYXJ5X2JlYWNvbl92aWYgPSB2aWY7CiAJfQogCiAJaXRlcl9kYXRhLT5iZWFjb25zID0gdHJ1ZTsKQEAgLTExNTQsNiArMTE1OSw3IEBACiAJCWJvb2wgY2hhbmdlZCA9IChpdGVyX2RhdGEucHJpbWFyeV9zdGEgIT0gY3R4LT5wcmltYXJ5X3N0YSk7CiAKIAkJaWYgKGl0ZXJfZGF0YS5wcmltYXJ5X3N0YSkgeworCQkJaXRlcl9kYXRhLnByaW1hcnlfYmVhY29uX3ZpZiA9IGl0ZXJfZGF0YS5wcmltYXJ5X3N0YTsKIAkJCWl0ZXJfZGF0YS5iZWFjb25zID0gdHJ1ZTsKIAkJCWF0aDlrX3NldF9hc3NvY19zdGF0ZShzYywgaXRlcl9kYXRhLnByaW1hcnlfc3RhLAogCQkJCQkgICAgICBjaGFuZ2VkKTsKQEAgLTE1NjMsMTMgKzE1NjksMTMgQEAKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAob2xkX3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVVUSCAmJgotCSAgICBuZXdfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9BU1NPQykgeworCWlmIChvbGRfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9OT1RFWElTVCAmJgorCSAgICBuZXdfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9OT05FKSB7CiAJCXJldCA9IGF0aDlrX3N0YV9hZGQoaHcsIHZpZiwgc3RhKTsKIAkJYXRoX2RiZyhjb21tb24sIENPTkZJRywKIAkJCSJBZGQgc3RhdGlvbjogJXBNXG4iLCBzdGEtPmFkZHIpOwotCX0gZWxzZSBpZiAob2xkX3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVNTT0MgJiYKLQkJICAgbmV3X3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVVUSCkgeworCX0gZWxzZSBpZiAob2xkX3N0YXRlID09IElFRUU4MDIxMV9TVEFfTk9ORSAmJgorCQkgICBuZXdfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9OT1RFWElTVCkgewogCQlyZXQgPSBhdGg5a19zdGFfcmVtb3ZlKGh3LCB2aWYsIHN0YSk7CiAJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCiAJCQkiUmVtb3ZlIHN0YXRpb246ICVwTVxuIiwgc3RhLT5hZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCmluZGV4IDhkZGQ2MDQuLjUyYmZiYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwpAQCAtNTAsOSArNTAsMTEgQEAKIHN0YXRpYyB2b2lkIGF0aF90eF9zZW5kX25vcm1hbChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwKIAkJCSAgICAgICBzdHJ1Y3QgYXRoX2F0eF90aWQgKnRpZCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgaW50IHR4X2ZsYWdzLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxKTsKKwkJCSAgICBpbnQgdHhfZmxhZ3MsIHN0cnVjdCBhdGhfdHhxICp0eHEsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGVfYnVmKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX2J1ZiAqYmYsCiAJCQkJc3RydWN0IGF0aF90eHEgKnR4cSwgc3RydWN0IGxpc3RfaGVhZCAqYmZfcSwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAogCQkJCXN0cnVjdCBhdGhfdHhfc3RhdHVzICp0cywgaW50IHR4b2spOwogc3RhdGljIHZvaWQgYXRoX3R4X3R4cWFkZGJ1ZihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwKIAkJCSAgICAgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgYm9vbCBpbnRlcm5hbCk7CkBAIC03Nyw2ICs3OSwyMiBAQAogLyogQWdncmVnYXRpb24gbG9naWMgKi8KIC8qKioqKioqKioqKioqKioqKioqKiovCiAKK3N0YXRpYyB2b2lkIGF0aF90eF9zdGF0dXMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEgPSBpbmZvLT5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzBdOworCisJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9SRVFfVFhfU1RBVFVTKSB7CisJCWllZWU4MDIxMV90eF9zdGF0dXMoaHcsIHNrYik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RhKQorCQlpZWVlODAyMTFfdHhfc3RhdHVzX25vc2tiKGh3LCBzdGEsIGluZm8pOworCisJZGV2X2tmcmVlX3NrYihza2IpOworfQorCiB2b2lkIGF0aF90eHFfbG9jayhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSkKIAlfX2FjcXVpcmVzKCZ0eHEtPmF4cV9sb2NrKQogewpAQCAtOTIsNiArMTEwLDcgQEAKIHZvaWQgYXRoX3R4cV91bmxvY2tfY29tcGxldGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEpCiAJX19yZWxlYXNlcygmdHhxLT5heHFfbG9jaykKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHNjLT5odzsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHE7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtMTAwLDcgKzExOSw3IEBACiAJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCiAJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZxKSkpCi0JCWllZWU4MDIxMV90eF9zdGF0dXMoc2MtPmh3LCBza2IpOworCQlhdGhfdHhfc3RhdHVzKGh3LCBza2IpOwogfQogCiBzdGF0aWMgdm9pZCBhdGhfdHhfcXVldWVfdGlkKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxLApAQCAtMjUzLDcgKzI3Miw3IEBACiAJCX0KIAogCQlsaXN0X2FkZF90YWlsKCZiZi0+bGlzdCwgJmJmX2hlYWQpOwotCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgJnRzLCAwKTsKKwkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIE5VTEwsICZ0cywgMCk7CiAJfQogCiAJaWYgKHNlbmRiYXIpIHsKQEAgLTMxOCwxMiArMzM3LDEyIEBACiAJCWJmID0gZmktPmJmOwogCiAJCWlmICghYmYpIHsKLQkJCWF0aF90eF9jb21wbGV0ZShzYywgc2tiLCBBVEhfVFhfRVJST1IsIHR4cSk7CisJCQlhdGhfdHhfY29tcGxldGUoc2MsIHNrYiwgQVRIX1RYX0VSUk9SLCB0eHEsIE5VTEwpOwogCQkJY29udGludWU7CiAJCX0KIAogCQlsaXN0X2FkZF90YWlsKCZiZi0+bGlzdCwgJmJmX2hlYWQpOwotCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgJnRzLCAwKTsKKwkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIE5VTEwsICZ0cywgMCk7CiAJfQogfQogCkBAIC00MjYsMTUgKzQ0NSwxNCBAQAogCiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGVfYWdncihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSwKIAkJCQkgc3RydWN0IGF0aF9idWYgKmJmLCBzdHJ1Y3QgbGlzdF9oZWFkICpiZl9xLAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSBzdHJ1Y3QgYXRoX2F0eF90aWQgKnRpZCwKIAkJCQkgc3RydWN0IGF0aF90eF9zdGF0dXMgKnRzLCBpbnQgdHhvaykKIHsKIAlzdHJ1Y3QgYXRoX25vZGUgKmFuID0gTlVMTDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBzYy0+aHc7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm87Ci0Jc3RydWN0IGF0aF9hdHhfdGlkICp0aWQgPSBOVUxMOwogCXN0cnVjdCBhdGhfYnVmICpiZl9uZXh0LCAqYmZfbGFzdCA9IGJmLT5iZl9sYXN0YmY7CiAJc3RydWN0IGxpc3RfaGVhZCBiZl9oZWFkOwogCXN0cnVjdCBza19idWZmX2hlYWQgYmZfcGVuZGluZzsKQEAgLTQ2MCwxMiArNDc4LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgdHMtPnRzX3JhdGVpbmRleDsgaSsrKQogCQlyZXRyaWVzICs9IHJhdGVzW2ldLmNvdW50OwogCi0JcmN1X3JlYWRfbG9jaygpOwotCi0Jc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhX2J5X2lmYWRkcihodywgaGRyLT5hZGRyMSwgaGRyLT5hZGRyMik7CiAJaWYgKCFzdGEpIHsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0KIAkJSU5JVF9MSVNUX0hFQUQoJmJmX2hlYWQpOwogCQl3aGlsZSAoYmYpIHsKIAkJCWJmX25leHQgPSBiZi0+YmZfbmV4dDsKQEAgLTQ3Myw3ICs0ODYsNyBAQAogCQkJaWYgKCFiZi0+YmZfc3RhdGUuc3RhbGUgfHwgYmZfbmV4dCAhPSBOVUxMKQogCQkJCWxpc3RfbW92ZV90YWlsKCZiZi0+bGlzdCwgJmJmX2hlYWQpOwogCi0JCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgdHMsIDApOworCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIE5VTEwsIHRzLCAwKTsKIAogCQkJYmYgPSBiZl9uZXh0OwogCQl9CkBAIC00ODEsNyArNDk0LDYgQEAKIAl9CiAKIAlhbiA9IChzdHJ1Y3QgYXRoX25vZGUgKilzdGEtPmRydl9wcml2OwotCXRpZCA9IGF0aF9nZXRfc2tiX3RpZChzYywgYW4sIHNrYik7CiAJc2VxX2ZpcnN0ID0gdGlkLT5zZXFfc3RhcnQ7CiAJaXNiYSA9IHRzLT50c19mbGFncyAmIEFUSDlLX1RYX0JBOwogCkBAIC01ODMsNyArNTk1LDcgQEAKIAkJCQkJCQkJdHMpOwogCQkJfQogCi0JCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgdHMsCisJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgc3RhLCB0cywKIAkJCQkhdHhmYWlsKTsKIAkJfSBlbHNlIHsKIAkJCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUVVNfRU9TUCkgewpAQCAtNjA0LDcgKzYxNiw4IEBACiAJCQkJCWF0aF90eF91cGRhdGVfYmF3KHNjLCB0aWQsIHNlcW5vKTsKIAogCQkJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLAotCQkJCQkJCSAgICAmYmZfaGVhZCwgdHMsIDApOworCQkJCQkJCSAgICAmYmZfaGVhZCwgTlVMTCwgdHMsCisJCQkJCQkJICAgIDApOwogCQkJCQliYXJfaW5kZXggPSBtYXhfdChpbnQsIGJhcl9pbmRleCwKIAkJCQkJCUFUSF9CQV9JTkRFWChzZXFfZmlyc3QsIHNlcW5vKSk7CiAJCQkJCWJyZWFrOwpAQCAtNjQ4LDggKzY2MSw2IEBACiAJCWF0aF90eHFfbG9jayhzYywgdHhxKTsKIAl9CiAKLQlyY3VfcmVhZF91bmxvY2soKTsKLQogCWlmIChuZWVkcmVzZXQpCiAJCWF0aDlrX3F1ZXVlX3Jlc2V0KHNjLCBSRVNFVF9UWVBFX1RYX0VSUk9SKTsKIH0KQEAgLTY2NCw3ICs2NzUsMTEgQEAKIAkJCQkgIHN0cnVjdCBhdGhfdHhfc3RhdHVzICp0cywgc3RydWN0IGF0aF9idWYgKmJmLAogCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqYmZfaGVhZCkKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHNjLT5odzsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOworCXN0cnVjdCBhdGhfYXR4X3RpZCAqdGlkID0gTlVMTDsKIAlib29sIHR4b2ssIGZsdXNoOwogCiAJdHhvayA9ICEodHMtPnRzX3N0YXR1cyAmIEFUSDlLX1RYRVJSX01BU0spOwpAQCAtNjc3LDYgKzY5MiwxNiBAQAogCiAJdHMtPmR1cmF0aW9uID0gYXRoOWtfaHdfZ2V0X2R1cmF0aW9uKHNjLT5zY19haCwgYmYtPmJmX2Rlc2MsCiAJCQkJCSAgICAgdHMtPnRzX3JhdGVpbmRleCk7CisKKwloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgYmYtPmJmX21wZHUtPmRhdGE7CisJc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhX2J5X2lmYWRkcihodywgaGRyLT5hZGRyMSwgaGRyLT5hZGRyMik7CisJaWYgKHN0YSkgeworCQlzdHJ1Y3QgYXRoX25vZGUgKmFuID0gKHN0cnVjdCBhdGhfbm9kZSAqKXN0YS0+ZHJ2X3ByaXY7CisJCXRpZCA9IGF0aF9nZXRfc2tiX3RpZChzYywgYW4sIGJmLT5iZl9tcGR1KTsKKwkJaWYgKHRzLT50c19zdGF0dXMgJiAoQVRIOUtfVFhFUlJfRklMVCB8IEFUSDlLX1RYRVJSX1hSRVRSWSkpCisJCQl0aWQtPmNsZWFyX3BzX2ZpbHRlciA9IHRydWU7CisJfQorCiAJaWYgKCFiZl9pc2FtcGR1KGJmKSkgewogCQlpZiAoIWZsdXNoKSB7CiAJCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihiZi0+YmZfbXBkdSk7CkBAIC02ODUsOSArNzEwLDkgQEAKIAkJCWF0aF90eF9yY19zdGF0dXMoc2MsIGJmLCB0cywgMSwgdHhvayA/IDAgOiAxLCB0eG9rKTsKIAkJCWF0aF9keW5hY2tfc2FtcGxlX3R4X3RzKHNjLT5zY19haCwgYmYtPmJmX21wZHUsIHRzKTsKIAkJfQotCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCBiZl9oZWFkLCB0cywgdHhvayk7CisJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsIGJmX2hlYWQsIHN0YSwgdHMsIHR4b2spOwogCX0gZWxzZQotCQlhdGhfdHhfY29tcGxldGVfYWdncihzYywgdHhxLCBiZiwgYmZfaGVhZCwgdHMsIHR4b2spOworCQlhdGhfdHhfY29tcGxldGVfYWdncihzYywgdHhxLCBiZiwgYmZfaGVhZCwgc3RhLCB0aWQsIHRzLCB0eG9rKTsKIAogCWlmICghZmx1c2gpCiAJCWF0aF90eHFfc2NoZWR1bGUoc2MsIHR4cSk7CkBAIC05MjMsNyArOTQ4LDcgQEAKIAkJCWxpc3RfYWRkKCZiZi0+bGlzdCwgJmJmX2hlYWQpOwogCQkJX19za2JfdW5saW5rKHNrYiwgKnEpOwogCQkJYXRoX3R4X3VwZGF0ZV9iYXcoc2MsIHRpZCwgc2Vxbm8pOwotCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsICZ0cywgMCk7CisJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgTlVMTCwgJnRzLCAwKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTE4MzIsNiArMTg1Nyw3IEBACiAgKi8KIHZvaWQgYXRoX2RyYWludHhxKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxKQogeworCXJjdV9yZWFkX2xvY2soKTsKIAlhdGhfdHhxX2xvY2soc2MsIHR4cSk7CiAKIAlpZiAoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkgewpAQCAtMTg1MCw2ICsxODc2LDcgQEAKIAlhdGhfZHJhaW5fdHhxX2xpc3Qoc2MsIHR4cSwgJnR4cS0+YXhxX3EpOwogCiAJYXRoX3R4cV91bmxvY2tfY29tcGxldGUoc2MsIHR4cSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIGJvb2wgYXRoX2RyYWluX2FsbF90eHEoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCkBAIC0yNDcyLDcgKzI0OTksOCBAQAogLyoqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgaW50IHR4X2ZsYWdzLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxKQorCQkJICAgIGludCB0eF9mbGFncywgc3RydWN0IGF0aF90eHEgKnR4cSwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CkBAIC0yNDkyLDE1ICsyNTIwLDE3IEBACiAJCQl0eF9pbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7CiAJfQogCi0JcGFkcG9zID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwotCXBhZHNpemUgPSBwYWRwb3MgJiAzOwotCWlmIChwYWRzaXplICYmIHNrYi0+bGVuPnBhZHBvcytwYWRzaXplKSB7Ci0JCS8qCi0JCSAqIFJlbW92ZSBNQUMgaGVhZGVyIHBhZGRpbmcgYmVmb3JlIGdpdmluZyB0aGUgZnJhbWUgYmFjayB0bwotCQkgKiBtYWM4MDIxMS4KLQkJICovCi0JCW1lbW1vdmUoc2tiLT5kYXRhICsgcGFkc2l6ZSwgc2tiLT5kYXRhLCBwYWRwb3MpOwotCQlza2JfcHVsbChza2IsIHBhZHNpemUpOworCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUykgeworCQlwYWRwb3MgPSBpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCk7CisJCXBhZHNpemUgPSBwYWRwb3MgJiAzOworCQlpZiAocGFkc2l6ZSAmJiBza2ItPmxlbj5wYWRwb3MrcGFkc2l6ZSkgeworCQkJLyoKKwkJCSAqIFJlbW92ZSBNQUMgaGVhZGVyIHBhZGRpbmcgYmVmb3JlIGdpdmluZyB0aGUgZnJhbWUgYmFjayB0bworCQkJICogbWFjODAyMTEuCisJCQkgKi8KKwkJCW1lbW1vdmUoc2tiLT5kYXRhICsgcGFkc2l6ZSwgc2tiLT5kYXRhLCBwYWRwb3MpOworCQkJc2tiX3B1bGwoc2tiLCBwYWRzaXplKTsKKwkJfQogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+c2NfcG1fbG9jaywgZmxhZ3MpOwpAQCAtMjUxNSwxMiArMjU0NSwxNCBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+c2NfcG1fbG9jaywgZmxhZ3MpOwogCi0JX19za2JfcXVldWVfdGFpbCgmdHhxLT5jb21wbGV0ZV9xLCBza2IpOwogCWF0aF90eHFfc2tiX2RvbmUoc2MsIHR4cSwgc2tiKTsKKwl0eF9pbmZvLT5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzBdID0gc3RhOworCV9fc2tiX3F1ZXVlX3RhaWwoJnR4cS0+Y29tcGxldGVfcSwgc2tiKTsKIH0KIAogc3RhdGljIHZvaWQgYXRoX3R4X2NvbXBsZXRlX2J1ZihzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9idWYgKmJmLAogCQkJCXN0cnVjdCBhdGhfdHhxICp0eHEsIHN0cnVjdCBsaXN0X2hlYWQgKmJmX3EsCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKIAkJCQlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMsIGludCB0eG9rKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBiZi0+YmZfbXBkdTsKQEAgLTI1NDgsNyArMjU4MCw3IEBACiAJCQljb21wbGV0ZSgmc2MtPnBhcHJkX2NvbXBsZXRlKTsKIAl9IGVsc2UgewogCQlhdGhfZGVidWdfc3RhdF90eChzYywgYmYsIHRzLCB0eHEsIHR4X2ZsYWdzKTsKLQkJYXRoX3R4X2NvbXBsZXRlKHNjLCBza2IsIHR4X2ZsYWdzLCB0eHEpOworCQlhdGhfdHhfY29tcGxldGUoc2MsIHNrYiwgdHhfZmxhZ3MsIHR4cSwgc3RhKTsKIAl9CiBza2lwX3R4X2NvbXBsZXRlOgogCS8qIEF0IHRoaXMgcG9pbnQsIHNrYiAoYmYtPmJmX21wZHUpIGlzIGNvbnN1bWVkLi4ubWFrZSBzdXJlIHdlIGRvbid0CkBAIC0yNzAwLDEwICsyNzMyLDEyIEBACiAJdTMyIHFjdW1hc2sgPSAoKDEgPDwgQVRIOUtfTlVNX1RYX1FVRVVFUykgLSAxKSAmIGFoLT5pbnRyX3R4cXM7CiAJaW50IGk7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yIChpID0gMDsgaSA8IEFUSDlLX05VTV9UWF9RVUVVRVM7IGkrKykgewogCQlpZiAoQVRIX1RYUV9TRVRVUChzYywgaSkgJiYgKHFjdW1hc2sgJiAoMSA8PCBpKSkpCiAJCQlhdGhfdHhfcHJvY2Vzc3Eoc2MsICZzYy0+dHgudHhxW2ldKTsKIAl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHZvaWQgYXRoX3R4X2VkbWFfdGFza2xldChzdHJ1Y3QgYXRoX3NvZnRjICpzYykKQEAgLTI3MTcsNiArMjc1MSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqZmlmb19saXN0OwogCWludCBzdGF0dXM7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CiAJZm9yICg7OykgewogCQlpZiAodGVzdF9iaXQoQVRIX09QX0hXX1JFU0VULCAmY29tbW9uLT5vcF9mbGFncykpCiAJCQlicmVhazsKQEAgLTI3ODcsNiArMjgyMiw3IEBACiAJCWF0aF90eF9wcm9jZXNzX2J1ZmZlcihzYywgdHhxLCAmdHMsIGJmLCAmYmZfaGVhZCk7CiAJCWF0aF90eHFfdW5sb2NrX2NvbXBsZXRlKHNjLCB0eHEpOwogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZGVidWcuYwppbmRleCA2ODA4ZGI0Li5lYzNhNjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZGVidWcuYwpAQCAtNzUsNyArNzUsOCBAQAogCiAJaWYgKCFhcikKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JZGZvcHMgPSBjb250YWluZXJfb2YoZmlsZS0+Zl9vcCwgc3RydWN0IGNhcmw5MTcwX2RlYnVnZnNfZm9wcywgZm9wcyk7CisJZGZvcHMgPSBjb250YWluZXJfb2YoZGVidWdmc19yZWFsX2ZvcHMoZmlsZSksCisJCQkgICAgIHN0cnVjdCBjYXJsOTE3MF9kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOwogCiAJaWYgKCFkZm9wcy0+cmVhZCkKIAkJcmV0dXJuIC1FTk9TWVM7CkBAIC0xMjcsNyArMTI4LDggQEAKIAogCWlmICghYXIpCiAJCXJldHVybiAtRU5PREVWOwotCWRmb3BzID0gY29udGFpbmVyX29mKGZpbGUtPmZfb3AsIHN0cnVjdCBjYXJsOTE3MF9kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOworCWRmb3BzID0gY29udGFpbmVyX29mKGRlYnVnZnNfcmVhbF9mb3BzKGZpbGUpLAorCQkJICAgICBzdHJ1Y3QgY2FybDkxNzBfZGVidWdmc19mb3BzLCBmb3BzKTsKIAogCWlmICghZGZvcHMtPndyaXRlKQogCQlyZXR1cm4gLUVOT1NZUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC91c2IuYwppbmRleCA3Njg0MmU2Li45OWFiMjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3VzYi5jCkBAIC02NzAsNiArNjcwLDcgQEAKIAlhci0+cmVhZGxlbiA9IG91dGxlbjsKIAlzcGluX3VubG9ja19iaCgmYXItPmNtZF9sb2NrKTsKIAorCXJlaW5pdF9jb21wbGV0aW9uKCZhci0+Y21kX3dhaXQpOwogCWVyciA9IF9fY2FybDkxNzBfZXhlY19jbWQoYXIsICZhci0+Y21kLCBmYWxzZSk7CiAKIAlpZiAoIShjbWQgJiBDQVJMOTE3MF9DTURfQVNZTkNfRkxBRykpIHsKQEAgLTc3OCwxMCArNzc5LDcgQEAKIAlzcGluX2xvY2tfYmgoJmFyLT5jbWRfbG9jayk7CiAJYXItPnJlYWRsZW4gPSAwOwogCXNwaW5fdW5sb2NrX2JoKCZhci0+Y21kX2xvY2spOwotCWNvbXBsZXRlX2FsbCgmYXItPmNtZF93YWl0KTsKLQotCS8qIFRoaXMgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBhbiBlYXJseSBjb21wbGV0aW9uIG9uIF9zdGFydCAqLwotCXJlaW5pdF9jb21wbGV0aW9uKCZhci0+Y21kX3dhaXQpOworCWNvbXBsZXRlKCZhci0+Y21kX3dhaXQpOwogCiAJLyoKIAkgKiBOb3RlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Rmc19wYXR0ZXJuX2RldGVjdG9yLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGZzX3BhdHRlcm5fZGV0ZWN0b3IuYwppbmRleCAyZjgxMzZkLi40MTAwZmZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGZzX3BhdHRlcm5fZGV0ZWN0b3IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvZGZzX3BhdHRlcm5fZGV0ZWN0b3IuYwpAQCAtMzM4LDcgKzMzOCw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGZzX3BhdHRlcm5fZGV0ZWN0b3IgZGVmYXVsdF9kcGQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGRmc19wYXR0ZXJuX2RldGVjdG9yIGRlZmF1bHRfZHBkID0gewogCS5leGl0CQk9IGRwZF9leGl0LAogCS5zZXRfZGZzX2RvbWFpbgk9IGRwZF9zZXRfZG9tYWluLAogCS5hZGRfcHVsc2UJPSBkcGRfYWRkX3B1bHNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2NmZzgwMjExLmMKaW5kZXggZjBlMTE3NS4uZDExNzI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9jZmc4MDIxMS5jCkBAIC0zNTQsMTAgKzM1NCwxMyBAQAogCXdpbF9kYmdfbWlzYyh3aWwsICIlcygpLCB3ZGV2PTB4JXAgaWZ0eXBlPSVkXG4iLAogCQkgICAgIF9fZnVuY19fLCB3ZGV2LCB3ZGV2LT5pZnR5cGUpOwogCisJbXV0ZXhfbG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJaWYgKHdpbC0+c2Nhbl9yZXF1ZXN0KSB7CiAJCXdpbF9lcnIod2lsLCAiQWxyZWFkeSBzY2FubmluZ1xuIik7CisJCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJCXJldHVybiAtRUFHQUlOOwogCX0KKwltdXRleF91bmxvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCiAJLyogY2hlY2sgd2UgYXJlIGNsaWVudCBzaWRlICovCiAJc3dpdGNoICh3ZGV2LT5pZnR5cGUpIHsKQEAgLTc2MCwxNCArNzYzLDExIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc3RydWN0IHdpbF90aWRfY3J5cHRvX3J4X3NpbmdsZSAqCi13aWxfZmluZF9jcnlwdG9fY3R4KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgdTgga2V5X2luZGV4LAotCQkgICAgZW51bSB3bWlfa2V5X3VzYWdlIGtleV91c2FnZSwgY29uc3QgdTggKm1hY19hZGRyKQorc3RhdGljIHN0cnVjdCB3aWxfc3RhX2luZm8gKgord2lsX2ZpbmRfc3RhX2J5X2tleV91c2FnZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsCisJCQkgIGVudW0gd21pX2tleV91c2FnZSBrZXlfdXNhZ2UsIGNvbnN0IHU4ICptYWNfYWRkcikKIHsKIAlpbnQgY2lkID0gLUVJTlZBTDsKLQlpbnQgdGlkID0gMDsKLQlzdHJ1Y3Qgd2lsX3N0YV9pbmZvICpzOwotCXN0cnVjdCB3aWxfdGlkX2NyeXB0b19yeCAqYzsKIAogCWlmIChrZXlfdXNhZ2UgPT0gV01JX0tFWV9VU0VfVFhfR1JPVVApCiAJCXJldHVybiBOVUxMOyAvKiBub3QgbmVlZGVkICovCkBAIC03NzgsMTggKzc3OCw3MiBAQAogCWVsc2UgaWYgKGtleV91c2FnZSA9PSBXTUlfS0VZX1VTRV9SWF9HUk9VUCkKIAkJY2lkID0gd2lsX2ZpbmRfY2lkX2J5X2lkeCh3aWwsIDApOwogCWlmIChjaWQgPCAwKSB7Ci0JCXdpbF9lcnIod2lsLCAiTm8gQ0lEIGZvciAlcE0gJXNbJWRdXG4iLCBtYWNfYWRkciwKLQkJCWtleV91c2FnZV9zdHJba2V5X3VzYWdlXSwga2V5X2luZGV4KTsKKwkJd2lsX2Vycih3aWwsICJObyBDSUQgZm9yICVwTSAlc1xuIiwgbWFjX2FkZHIsCisJCQlrZXlfdXNhZ2Vfc3RyW2tleV91c2FnZV0pOwogCQlyZXR1cm4gRVJSX1BUUihjaWQpOwogCX0KIAotCXMgPSAmd2lsLT5zdGFbY2lkXTsKLQlpZiAoa2V5X3VzYWdlID09IFdNSV9LRVlfVVNFX1BBSVJXSVNFKQotCQljID0gJnMtPnRpZF9jcnlwdG9fcnhbdGlkXTsKLQllbHNlCi0JCWMgPSAmcy0+Z3JvdXBfY3J5cHRvX3J4OworCXJldHVybiAmd2lsLT5zdGFbY2lkXTsKK30KIAotCXJldHVybiAmYy0+a2V5X2lkW2tleV9pbmRleF07CitzdGF0aWMgdm9pZCB3aWxfc2V0X2NyeXB0b19yeCh1OCBrZXlfaW5kZXgsIGVudW0gd21pX2tleV91c2FnZSBrZXlfdXNhZ2UsCisJCQkgICAgICBzdHJ1Y3Qgd2lsX3N0YV9pbmZvICpjcywKKwkJCSAgICAgIHN0cnVjdCBrZXlfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHdpbF90aWRfY3J5cHRvX3J4X3NpbmdsZSAqY2M7CisJaW50IHRpZDsKKworCWlmICghY3MpCisJCXJldHVybjsKKworCXN3aXRjaCAoa2V5X3VzYWdlKSB7CisJY2FzZSBXTUlfS0VZX1VTRV9QQUlSV0lTRToKKwkJZm9yICh0aWQgPSAwOyB0aWQgPCBXSUxfU1RBX1RJRF9OVU07IHRpZCsrKSB7CisJCQljYyA9ICZjcy0+dGlkX2NyeXB0b19yeFt0aWRdLmtleV9pZFtrZXlfaW5kZXhdOworCQkJaWYgKHBhcmFtcy0+c2VxKQorCQkJCW1lbWNweShjYy0+cG4sIHBhcmFtcy0+c2VxLAorCQkJCSAgICAgICBJRUVFODAyMTFfR0NNUF9QTl9MRU4pOworCQkJZWxzZQorCQkJCW1lbXNldChjYy0+cG4sIDAsIElFRUU4MDIxMV9HQ01QX1BOX0xFTik7CisJCQljYy0+a2V5X3NldCA9IHRydWU7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXTUlfS0VZX1VTRV9SWF9HUk9VUDoKKwkJY2MgPSAmY3MtPmdyb3VwX2NyeXB0b19yeC5rZXlfaWRba2V5X2luZGV4XTsKKwkJaWYgKHBhcmFtcy0+c2VxKQorCQkJbWVtY3B5KGNjLT5wbiwgcGFyYW1zLT5zZXEsIElFRUU4MDIxMV9HQ01QX1BOX0xFTik7CisJCWVsc2UKKwkJCW1lbXNldChjYy0+cG4sIDAsIElFRUU4MDIxMV9HQ01QX1BOX0xFTik7CisJCWNjLT5rZXlfc2V0ID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCB3aWxfZGVsX3J4X2tleSh1OCBrZXlfaW5kZXgsIGVudW0gd21pX2tleV91c2FnZSBrZXlfdXNhZ2UsCisJCQkgICBzdHJ1Y3Qgd2lsX3N0YV9pbmZvICpjcykKK3sKKwlzdHJ1Y3Qgd2lsX3RpZF9jcnlwdG9fcnhfc2luZ2xlICpjYzsKKwlpbnQgdGlkOworCisJaWYgKCFjcykKKwkJcmV0dXJuOworCisJc3dpdGNoIChrZXlfdXNhZ2UpIHsKKwljYXNlIFdNSV9LRVlfVVNFX1BBSVJXSVNFOgorCQlmb3IgKHRpZCA9IDA7IHRpZCA8IFdJTF9TVEFfVElEX05VTTsgdGlkKyspIHsKKwkJCWNjID0gJmNzLT50aWRfY3J5cHRvX3J4W3RpZF0ua2V5X2lkW2tleV9pbmRleF07CisJCQljYy0+a2V5X3NldCA9IGZhbHNlOworCQl9CisJCWJyZWFrOworCWNhc2UgV01JX0tFWV9VU0VfUlhfR1JPVVA6CisJCWNjID0gJmNzLT5ncm91cF9jcnlwdG9fcngua2V5X2lkW2tleV9pbmRleF07CisJCWNjLT5rZXlfc2V0ID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KIH0KIAogc3RhdGljIGludCB3aWxfY2ZnODAyMTFfYWRkX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LApAQCAtODAxLDI0ICs4NTUsMjYgQEAKIAlpbnQgcmM7CiAJc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsID0gd2lwaHlfdG9fd2lsKHdpcGh5KTsKIAllbnVtIHdtaV9rZXlfdXNhZ2Uga2V5X3VzYWdlID0gd2lsX2RldGVjdF9rZXlfdXNhZ2Uod2lsLCBwYWlyd2lzZSk7Ci0Jc3RydWN0IHdpbF90aWRfY3J5cHRvX3J4X3NpbmdsZSAqY2MgPSB3aWxfZmluZF9jcnlwdG9fY3R4KHdpbCwKLQkJCQkJCQkJICBrZXlfaW5kZXgsCi0JCQkJCQkJCSAga2V5X3VzYWdlLAotCQkJCQkJCQkgIG1hY19hZGRyKTsKKwlzdHJ1Y3Qgd2lsX3N0YV9pbmZvICpjcyA9IHdpbF9maW5kX3N0YV9ieV9rZXlfdXNhZ2Uod2lsLCBrZXlfdXNhZ2UsCisJCQkJCQkJICAgIG1hY19hZGRyKTsKKworCWlmICghcGFyYW1zKSB7CisJCXdpbF9lcnIod2lsLCAiTlVMTCBwYXJhbXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAl3aWxfZGJnX21pc2Mod2lsLCAiJXMoJXBNICVzWyVkXSBQTiAlKnBoTilcbiIsIF9fZnVuY19fLAogCQkgICAgIG1hY19hZGRyLCBrZXlfdXNhZ2Vfc3RyW2tleV91c2FnZV0sIGtleV9pbmRleCwKIAkJICAgICBwYXJhbXMtPnNlcV9sZW4sIHBhcmFtcy0+c2VxKTsKIAotCWlmIChJU19FUlIoY2MpKSB7CisJaWYgKElTX0VSUihjcykpIHsKIAkJd2lsX2Vycih3aWwsICJOb3QgY29ubmVjdGVkLCAlcyglcE0gJXNbJWRdIFBOICUqcGhOKVxuIiwKIAkJCV9fZnVuY19fLCBtYWNfYWRkciwga2V5X3VzYWdlX3N0cltrZXlfdXNhZ2VdLCBrZXlfaW5kZXgsCiAJCQlwYXJhbXMtPnNlcV9sZW4sIHBhcmFtcy0+c2VxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGNjKQotCQljYy0+a2V5X3NldCA9IGZhbHNlOworCXdpbF9kZWxfcnhfa2V5KGtleV9pbmRleCwga2V5X3VzYWdlLCBjcyk7CiAKIAlpZiAocGFyYW1zLT5zZXEgJiYgcGFyYW1zLT5zZXFfbGVuICE9IElFRUU4MDIxMV9HQ01QX1BOX0xFTikgewogCQl3aWxfZXJyKHdpbCwKQEAgLTgzMSwxMyArODg3LDggQEAKIAogCXJjID0gd21pX2FkZF9jaXBoZXJfa2V5KHdpbCwga2V5X2luZGV4LCBtYWNfYWRkciwgcGFyYW1zLT5rZXlfbGVuLAogCQkJCXBhcmFtcy0+a2V5LCBrZXlfdXNhZ2UpOwotCWlmICgocmMgPT0gMCkgJiYgY2MpIHsKLQkJaWYgKHBhcmFtcy0+c2VxKQotCQkJbWVtY3B5KGNjLT5wbiwgcGFyYW1zLT5zZXEsIElFRUU4MDIxMV9HQ01QX1BOX0xFTik7Ci0JCWVsc2UKLQkJCW1lbXNldChjYy0+cG4sIDAsIElFRUU4MDIxMV9HQ01QX1BOX0xFTik7Ci0JCWNjLT5rZXlfc2V0ID0gdHJ1ZTsKLQl9CisJaWYgKCFyYykKKwkJd2lsX3NldF9jcnlwdG9fcngoa2V5X2luZGV4LCBrZXlfdXNhZ2UsIGNzLCBwYXJhbXMpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtODQ5LDIwICs5MDAsMTggQEAKIHsKIAlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSB3aXBoeV90b193aWwod2lwaHkpOwogCWVudW0gd21pX2tleV91c2FnZSBrZXlfdXNhZ2UgPSB3aWxfZGV0ZWN0X2tleV91c2FnZSh3aWwsIHBhaXJ3aXNlKTsKLQlzdHJ1Y3Qgd2lsX3RpZF9jcnlwdG9fcnhfc2luZ2xlICpjYyA9IHdpbF9maW5kX2NyeXB0b19jdHgod2lsLAotCQkJCQkJCQkgIGtleV9pbmRleCwKLQkJCQkJCQkJICBrZXlfdXNhZ2UsCi0JCQkJCQkJCSAgbWFjX2FkZHIpOworCXN0cnVjdCB3aWxfc3RhX2luZm8gKmNzID0gd2lsX2ZpbmRfc3RhX2J5X2tleV91c2FnZSh3aWwsIGtleV91c2FnZSwKKwkJCQkJCQkgICAgbWFjX2FkZHIpOwogCiAJd2lsX2RiZ19taXNjKHdpbCwgIiVzKCVwTSAlc1slZF0pXG4iLCBfX2Z1bmNfXywgbWFjX2FkZHIsCiAJCSAgICAga2V5X3VzYWdlX3N0cltrZXlfdXNhZ2VdLCBrZXlfaW5kZXgpOwogCi0JaWYgKElTX0VSUihjYykpCisJaWYgKElTX0VSUihjcykpCiAJCXdpbF9pbmZvKHdpbCwgIk5vdCBjb25uZWN0ZWQsICVzKCVwTSAlc1slZF0pXG4iLCBfX2Z1bmNfXywKIAkJCSBtYWNfYWRkciwga2V5X3VzYWdlX3N0cltrZXlfdXNhZ2VdLCBrZXlfaW5kZXgpOwogCi0JaWYgKCFJU19FUlJfT1JfTlVMTChjYykpCi0JCWNjLT5rZXlfc2V0ID0gZmFsc2U7CisJaWYgKCFJU19FUlJfT1JfTlVMTChjcykpCisJCXdpbF9kZWxfcnhfa2V5KGtleV9pbmRleCwga2V5X3VzYWdlLCBjcyk7CiAKIAlyZXR1cm4gd21pX2RlbF9jaXBoZXJfa2V5KHdpbCwga2V5X2luZGV4LCBtYWNfYWRkciwga2V5X3VzYWdlKTsKIH0KQEAgLTEzNjMsMjMgKzE0MTIsMTYgQEAKIAkJCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCiB7CiAJc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsID0gd2lwaHlfdG9fd2lsKHdpcGh5KTsKLQl1OCBzdGFydGVkOworCXN0cnVjdCB3aWxfcDJwX2luZm8gKnAycCA9ICZ3aWwtPnAycDsKKworCWlmICghcDJwLT5wMnBfZGV2X3N0YXJ0ZWQpCisJCXJldHVybjsKIAogCXdpbF9kYmdfbWlzYyh3aWwsICIlczogZW50ZXJlZFxuIiwgX19mdW5jX18pOwogCW11dGV4X2xvY2soJndpbC0+bXV0ZXgpOwotCXN0YXJ0ZWQgPSB3aWxfcDJwX3N0b3BfZGlzY292ZXJ5KHdpbCk7Ci0JaWYgKHN0YXJ0ZWQgJiYgd2lsLT5zY2FuX3JlcXVlc3QpIHsKLQkJc3RydWN0IGNmZzgwMjExX3NjYW5faW5mbyBpbmZvID0gewotCQkJLmFib3J0ZWQgPSB0cnVlLAotCQl9OwotCi0JCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgJmluZm8pOwotCQl3aWwtPnNjYW5fcmVxdWVzdCA9IE5VTEw7Ci0JCXdpbC0+cmFkaW9fd2RldiA9IHdpbC0+d2RldjsKLQl9CisJd2lsX3AycF9zdG9wX3JhZGlvX29wZXJhdGlvbnMod2lsKTsKKwlwMnAtPnAycF9kZXZfc3RhcnRlZCA9IDA7CiAJbXV0ZXhfdW5sb2NrKCZ3aWwtPm11dGV4KTsKLQotCXdpbC0+cDJwLnAycF9kZXZfc3RhcnRlZCA9IDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfb3BzIHdpbF9jZmc4MDIxMV9vcHMgPSB7CkBAIC0xNDY0LDE0ICsxNTA2LDggQEAKIAlzZXRfd2lwaHlfZGV2KHdkZXYtPndpcGh5LCBkZXYpOwogCXdpbF93aXBoeV9pbml0KHdkZXYtPndpcGh5KTsKIAotCXJjID0gd2lwaHlfcmVnaXN0ZXIod2Rldi0+d2lwaHkpOwotCWlmIChyYyA8IDApCi0JCWdvdG8gb3V0X2ZhaWxlZF9yZWc7Ci0KIAlyZXR1cm4gd2RldjsKIAotb3V0X2ZhaWxlZF9yZWc6Ci0Jd2lwaHlfZnJlZSh3ZGV2LT53aXBoeSk7CiBvdXQ6CiAJa2ZyZWUod2Rldik7CiAKQEAgLTE0ODcsNyArMTUyMyw2IEBACiAJaWYgKCF3ZGV2KQogCQlyZXR1cm47CiAKLQl3aXBoeV91bnJlZ2lzdGVyKHdkZXYtPndpcGh5KTsKIAl3aXBoeV9mcmVlKHdkZXYtPndpcGh5KTsKIAlrZnJlZSh3ZGV2KTsKIH0KQEAgLTE0OTgsMTEgKzE1MzMsMTEgQEAKIAogCW11dGV4X2xvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCXAycF93ZGV2ID0gd2lsLT5wMnBfd2RldjsKKwl3aWwtPnAycF93ZGV2ID0gTlVMTDsKKwl3aWwtPnJhZGlvX3dkZXYgPSB3aWxfdG9fd2Rldih3aWwpOworCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJaWYgKHAycF93ZGV2KSB7Ci0JCXdpbC0+cDJwX3dkZXYgPSBOVUxMOwotCQl3aWwtPnJhZGlvX3dkZXYgPSB3aWxfdG9fd2Rldih3aWwpOwogCQljZmc4MDIxMV91bnJlZ2lzdGVyX3dkZXYocDJwX3dkZXYpOwogCQlrZnJlZShwMnBfd2Rldik7CiAJfQotCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9kZWJ1Z2ZzLmMKaW5kZXggYTgwOThiNC4uNWU0MDU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2RlYnVnZnMuYwpAQCAtMTU1Myw2ICsxNTUzLDU2IEBACiAJLm9wZW4gID0gc2ltcGxlX29wZW4sCiB9OwogCisvKi0tLS0tLS0tLUZXIGNhcGFiaWxpdGllcy0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IHdpbF9md19jYXBhYmlsaXRpZXNfZGVidWdmc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSBzLT5wcml2YXRlOworCisJc2VxX3ByaW50ZihzLCAiZndfY2FwYWJpbGl0aWVzIDogJSpwYlxuIiwgV01JX0ZXX0NBUEFCSUxJVFlfTUFYLAorCQkgICB3aWwtPmZ3X2NhcGFiaWxpdGllcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3aWxfZndfY2FwYWJpbGl0aWVzX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB3aWxfZndfY2FwYWJpbGl0aWVzX2RlYnVnZnNfc2hvdywKKwkJCSAgIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX2Z3X2NhcGFiaWxpdGllcyA9IHsKKwkub3BlbgkJPSB3aWxfZndfY2FwYWJpbGl0aWVzX3NlcV9vcGVuLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCit9OworCisvKi0tLS0tLS0tLUZXIHZlcnNpb24tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCB3aWxfZndfdmVyc2lvbl9kZWJ1Z2ZzX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IHMtPnByaXZhdGU7CisKKwlpZiAod2lsLT5md192ZXJzaW9uWzBdKQorCQlzZXFfcHJpbnRmKHMsICIlc1xuIiwgd2lsLT5md192ZXJzaW9uKTsKKwllbHNlCisJCXNlcV9wdXRzKHMsICJOL0FcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2lsX2Z3X3ZlcnNpb25fc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHdpbF9md192ZXJzaW9uX2RlYnVnZnNfc2hvdywKKwkJCSAgIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX2Z3X3ZlcnNpb24gPSB7CisJLm9wZW4JCT0gd2lsX2Z3X3ZlcnNpb25fc2VxX29wZW4sCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKK307CisKIC8qLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCB3aWw2MjEwX2RlYnVnZnNfaW5pdF9ibG9icyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsCiAJCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRiZykKQEAgLTE2MDMsNiArMTY1Myw4IEBACiAJeyJyZWNvdmVyeSIsCVNfSVJVR08gfCBTX0lXVVNSLAkmZm9wc19yZWNvdmVyeX0sCiAJeyJsZWRfY2ZnIiwJU19JUlVHTyB8IFNfSVdVU1IsCSZmb3BzX2xlZF9jZmd9LAogCXsibGVkX2JsaW5rX3RpbWUiLAlTX0lSVUdPIHwgU19JV1VTUiwJJmZvcHNfbGVkX2JsaW5rX3RpbWV9LAorCXsiZndfY2FwYWJpbGl0aWVzIiwJU19JUlVHTywJJmZvcHNfZndfY2FwYWJpbGl0aWVzfSwKKwl7ImZ3X3ZlcnNpb24iLAlTX0lSVUdPLAkJJmZvcHNfZndfdmVyc2lvbn0sCiB9OwogCiBzdGF0aWMgdm9pZCB3aWw2MjEwX2RlYnVnZnNfaW5pdF9maWxlcyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsCkBAIC0xNjQzLDcgKzE2OTUsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBkYmdfb2ZmIGRiZ193aWxfb2ZmW10gPSB7CiAJV0lMX0ZJRUxEKHByaXZhY3ksCVNfSVJVR08sCQlkb2ZmX3UzMiksCiAJV0lMX0ZJRUxEKHN0YXR1c1swXSwJU19JUlVHTyB8IFNfSVdVU1IsCWRvZmZfdWxvbmcpLAotCVdJTF9GSUVMRChmd192ZXJzaW9uLAlTX0lSVUdPLAkJZG9mZl91MzIpLAogCVdJTF9GSUVMRChod192ZXJzaW9uLAlTX0lSVUdPLAkJZG9mZl94MzIpLAogCVdJTF9GSUVMRChyZWNvdmVyeV9jb3VudCwgU19JUlVHTywJCWRvZmZfdTMyKSwKIAlXSUxfRklFTEQoYXBfaXNvbGF0ZSwJU19JUlVHTywJCWRvZmZfdTMyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9mdy5oCmluZGV4IDdhMmM2YzEuLjJmMmI5MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZncuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LDIwMTYgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogICoKICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQpAQCAtNTgsNiArNTgsMTUgQEAKIAl1OCBkYXRhWzBdOyAvKiBmcmVlLWZvcm0gZGF0YSBbZGF0YV9zaXplXSwgc2VlIGFib3ZlICovCiB9IF9fcGFja2VkOwogCisvKiBGVyBjYXBhYmlsaXRpZXMgZW5jb2RlZCBpbnNpZGUgYSBjb21tZW50IHJlY29yZCAqLworI2RlZmluZSBXSUxfRldfQ0FQQUJJTElUSUVTX01BR0lDICgweGFiY2RkY2JhKQorc3RydWN0IHdpbF9md19yZWNvcmRfY2FwYWJpbGl0aWVzIHsgLyogdHlwZSA9PSB3aWxfZndfdHlwZV9jb21tZW50ICovCisJLyogaWRlbnRpZmllcyBjYXBhYmlsaXRpZXMgcmVjb3JkICovCisJX19sZTMyIG1hZ2ljOworCS8qIGNhcGFiaWxpdGllcyAodmFyaWFibGUgc2l6ZSksIHNlZSBlbnVtIHdtaV9md19jYXBhYmlsaXR5ICovCisJdTggY2FwYWJpbGl0aWVzWzBdOworfTsKKwogLyogcGVyZm9ybSBhY3Rpb24KICAqIGRhdGFfc2l6ZSA9IEBoZWFkLnNpemUgLSBvZmZzZXRvZihzdHJ1Y3Qgd2lsX2Z3X3JlY29yZF9hY3Rpb24sIGRhdGEpCiAgKi8KQEAgLTkzLDYgKzEwMiw5IEBACiAvKiBmaWxlIGhlYWRlcgogICogRmlyc3QgcmVjb3JkIG9mIGV2ZXJ5IGZpbGUKICAqLworLyogdGhlIEZXIHZlcnNpb24gcHJlZml4IGluIHRoZSBjb21tZW50ICovCisjZGVmaW5lIFdJTF9GV19WRVJTSU9OX1BSRUZJWCAiRlcgdmVyc2lvbjogIgorI2RlZmluZSBXSUxfRldfVkVSU0lPTl9QUkVGSVhfTEVOIChzaXplb2YoV0lMX0ZXX1ZFUlNJT05fUFJFRklYKSAtIDEpCiBzdHJ1Y3Qgd2lsX2Z3X3JlY29yZF9maWxlX2hlYWRlciB7CiAJX19sZTMyIHNpZ25hdHVyZSA7IC8qIFdpbG9jaXR5IHNpZ25hdHVyZSAqLwogCV9fbGUzMiByZXNlcnZlZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3X2luYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZndfaW5jLmMKaW5kZXggZDMwNjU3ZS4uOGY0MGViMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZndfaW5jLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZndfaW5jLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogICoKICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQpAQCAtMTE4LDYgKzExOCwxMiBAQAogCXJldHVybiAoaW50KWRsZW47CiB9CiAKK3N0YXRpYyBpbnQgZndfaWdub3JlX3NlY3Rpb24oc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgICBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmd19oYW5kbGVfY29tbWVudChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsCiAJCQkgICAgIHNpemVfdCBzaXplKQogewpAQCAtMTI2LDYgKzEzMiwyNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50Citmd19oYW5kbGVfY2FwYWJpbGl0aWVzKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJICAgICAgIHNpemVfdCBzaXplKQoreworCWNvbnN0IHN0cnVjdCB3aWxfZndfcmVjb3JkX2NhcGFiaWxpdGllcyAqcmVjID0gZGF0YTsKKwlzaXplX3QgY2FwYV9zaXplOworCisJaWYgKHNpemUgPCBzaXplb2YoKnJlYykgfHwKKwkgICAgbGUzMl90b19jcHUocmVjLT5tYWdpYykgIT0gV0lMX0ZXX0NBUEFCSUxJVElFU19NQUdJQykKKwkJcmV0dXJuIDA7CisKKwljYXBhX3NpemUgPSBzaXplIC0gb2Zmc2V0b2Yoc3RydWN0IHdpbF9md19yZWNvcmRfY2FwYWJpbGl0aWVzLAorCQkJCSAgICBjYXBhYmlsaXRpZXMpOworCWJpdG1hcF96ZXJvKHdpbC0+ZndfY2FwYWJpbGl0aWVzLCBXTUlfRldfQ0FQQUJJTElUWV9NQVgpOworCW1lbWNweSh3aWwtPmZ3X2NhcGFiaWxpdGllcywgcmVjLT5jYXBhYmlsaXRpZXMsCisJICAgICAgIG1pbihzaXplb2Yod2lsLT5md19jYXBhYmlsaXRpZXMpLCBjYXBhX3NpemUpKTsKKwl3aWxfaGV4X2R1bXBfZncoIkNBUEEiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLAorCQkJcmVjLT5jYXBhYmlsaXRpZXMsIGNhcGFfc2l6ZSwgZmFsc2UpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGZ3X2hhbmRsZV9kYXRhKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3Qgdm9pZCAqZGF0YSwKIAkJCSAgc2l6ZV90IHNpemUpCiB7CkBAIC0xOTYsNiArMjIzLDEzIEBACiAJd2lsX2hleF9kdW1wX2Z3KCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLCBkLT5jb21tZW50LAogCQkJc2l6ZW9mKGQtPmNvbW1lbnQpLCB0cnVlKTsKIAorCWlmICghbWVtY21wKGQtPmNvbW1lbnQsIFdJTF9GV19WRVJTSU9OX1BSRUZJWCwKKwkJICAgIFdJTF9GV19WRVJTSU9OX1BSRUZJWF9MRU4pKQorCQltZW1jcHkod2lsLT5md192ZXJzaW9uLAorCQkgICAgICAgZC0+Y29tbWVudCArIFdJTF9GV19WRVJTSU9OX1BSRUZJWF9MRU4sCisJCSAgICAgICBtaW4oc2l6ZW9mKGQtPmNvbW1lbnQpIC0gV0lMX0ZXX1ZFUlNJT05fUFJFRklYX0xFTiwKKwkJCSAgIHNpemVvZih3aWwtPmZ3X3ZlcnNpb24pIC0gMSkpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM4Myw0MiArNDE3LDUxIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCWludCB0eXBlOwotCWludCAoKmhhbmRsZXIpKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCWludCAoKmxvYWRfaGFuZGxlcikoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBjb25zdCB2b2lkICpkYXRhLAorCQkJICAgIHNpemVfdCBzaXplKTsKKwlpbnQgKCpwYXJzZV9oYW5kbGVyKShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICAgIHNpemVfdCBzaXplKTsKIH0gd2lsX2Z3X2hhbmRsZXJzW10gPSB7Ci0Je3dpbF9md190eXBlX2NvbW1lbnQsIGZ3X2hhbmRsZV9jb21tZW50fSwKLQl7d2lsX2Z3X3R5cGVfZGF0YSwgZndfaGFuZGxlX2RhdGF9LAotCXt3aWxfZndfdHlwZV9maWxsLCBmd19oYW5kbGVfZmlsbH0sCisJe3dpbF9md190eXBlX2NvbW1lbnQsIGZ3X2hhbmRsZV9jb21tZW50LCBmd19oYW5kbGVfY2FwYWJpbGl0aWVzfSwKKwl7d2lsX2Z3X3R5cGVfZGF0YSwgZndfaGFuZGxlX2RhdGEsIGZ3X2lnbm9yZV9zZWN0aW9ufSwKKwl7d2lsX2Z3X3R5cGVfZmlsbCwgZndfaGFuZGxlX2ZpbGwsIGZ3X2lnbm9yZV9zZWN0aW9ufSwKIAkvKiB3aWxfZndfdHlwZV9hY3Rpb24gKi8KIAkvKiB3aWxfZndfdHlwZV92ZXJpZnkgKi8KLQl7d2lsX2Z3X3R5cGVfZmlsZV9oZWFkZXIsIGZ3X2hhbmRsZV9maWxlX2hlYWRlcn0sCi0Je3dpbF9md190eXBlX2RpcmVjdF93cml0ZSwgZndfaGFuZGxlX2RpcmVjdF93cml0ZX0sCi0Je3dpbF9md190eXBlX2dhdGV3YXlfZGF0YSwgZndfaGFuZGxlX2dhdGV3YXlfZGF0YX0sCi0Je3dpbF9md190eXBlX2dhdGV3YXlfZGF0YTQsIGZ3X2hhbmRsZV9nYXRld2F5X2RhdGE0fSwKKwl7d2lsX2Z3X3R5cGVfZmlsZV9oZWFkZXIsIGZ3X2hhbmRsZV9maWxlX2hlYWRlciwKKwkJZndfaGFuZGxlX2ZpbGVfaGVhZGVyfSwKKwl7d2lsX2Z3X3R5cGVfZGlyZWN0X3dyaXRlLCBmd19oYW5kbGVfZGlyZWN0X3dyaXRlLCBmd19pZ25vcmVfc2VjdGlvbn0sCisJe3dpbF9md190eXBlX2dhdGV3YXlfZGF0YSwgZndfaGFuZGxlX2dhdGV3YXlfZGF0YSwgZndfaWdub3JlX3NlY3Rpb259LAorCXt3aWxfZndfdHlwZV9nYXRld2F5X2RhdGE0LCBmd19oYW5kbGVfZ2F0ZXdheV9kYXRhNCwKKwkJZndfaWdub3JlX3NlY3Rpb259LAogfTsKIAogc3RhdGljIGludCB3aWxfZndfaGFuZGxlX3JlY29yZChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGludCB0eXBlLAotCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQorCQkJCWNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIGxvYWQpCiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3aWxfZndfaGFuZGxlcnMpOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3aWxfZndfaGFuZGxlcnMpOyBpKyspCiAJCWlmICh3aWxfZndfaGFuZGxlcnNbaV0udHlwZSA9PSB0eXBlKQotCQkJcmV0dXJuIHdpbF9md19oYW5kbGVyc1tpXS5oYW5kbGVyKHdpbCwgZGF0YSwgc2l6ZSk7Ci0JfQorCQkJcmV0dXJuIGxvYWQgPworCQkJCXdpbF9md19oYW5kbGVyc1tpXS5sb2FkX2hhbmRsZXIoCisJCQkJCXdpbCwgZGF0YSwgc2l6ZSkgOgorCQkJCXdpbF9md19oYW5kbGVyc1tpXS5wYXJzZV9oYW5kbGVyKAorCQkJCQl3aWwsIGRhdGEsIHNpemUpOwogCiAJd2lsX2Vycl9mdyh3aWwsICJ1bmtub3duIHJlY29yZCB0eXBlOiAlZFxuIiwgdHlwZSk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIC8qKgotICogd2lsX2Z3X2xvYWQgLSBsb2FkIEZXIGludG8gZGV2aWNlCi0gKgotICogTG9hZCB0aGUgRlcgYW5kIHVDb2RlIGNvZGUgYW5kIGRhdGEgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlCi0gKiBtZW1vcnkgcmVnaW9ucworICogd2lsX2Z3X3Byb2Nlc3MgLSBwcm9jZXNzIHNlY3Rpb24gZnJvbSBGVyBmaWxlCisgKiBpZiBsb2FkIGlzIHRydWU6IExvYWQgdGhlIEZXIGFuZCB1Q29kZSBjb2RlIGFuZCBkYXRhIHRvIHRoZQorICogY29ycmVzcG9uZGluZyBkZXZpY2UgbWVtb3J5IHJlZ2lvbnMsCisgKiBvdGhlcndpc2Ugb25seSBwYXJzZSBhbmQgbG9vayBmb3IgY2FwYWJpbGl0aWVzCiAgKgogICogUmV0dXJuIGVycm9yIGNvZGUKICAqLwotc3RhdGljIGludCB3aWxfZndfbG9hZChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQorc3RhdGljIGludCB3aWxfZndfcHJvY2VzcyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgIHNpemVfdCBzaXplLCBib29sIGxvYWQpCiB7CiAJaW50IHJjID0gMDsKIAljb25zdCBzdHJ1Y3Qgd2lsX2Z3X3JlY29yZF9oZWFkICpoZHI7CkBAIC00MzcsNyArNDgwLDcgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXJjID0gd2lsX2Z3X2hhbmRsZV9yZWNvcmQod2lsLCBsZTE2X3RvX2NwdShoZHItPnR5cGUpLAotCQkJCQkgICZoZHJbMV0sIGhkcl9zeik7CisJCQkJCSAgJmhkclsxXSwgaGRyX3N6LCBsb2FkKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCX0KQEAgLTQ1NiwxMyArNDk5LDE2IEBACiB9CiAKIC8qKgotICogd2lsX3JlcXVlc3RfZmlybXdhcmUgLSBSZXF1ZXN0IGZpcm13YXJlIGFuZCBsb2FkIHRvIGRldmljZQorICogd2lsX3JlcXVlc3RfZmlybXdhcmUgLSBSZXF1ZXN0IGZpcm13YXJlCiAgKgotICogUmVxdWVzdCBmaXJtd2FyZSBpbWFnZSBmcm9tIHRoZSBmaWxlIGFuZCBsb2FkIGl0IHRvIGRldmljZQorICogUmVxdWVzdCBmaXJtd2FyZSBpbWFnZSBmcm9tIHRoZSBmaWxlCisgKiBJZiBsb2FkIGlzIHRydWUsIGxvYWQgZmlybXdhcmUgdG8gZGV2aWNlLCBvdGhlcndpc2UKKyAqIG9ubHkgcGFyc2UgYW5kIGV4dHJhY3QgY2FwYWJpbGl0aWVzCiAgKgogICogUmV0dXJuIGVycm9yIGNvZGUKICAqLwotaW50IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3QgY2hhciAqbmFtZSkKK2ludCB3aWxfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgYm9vbCBsb2FkKQogewogCWludCByYywgcmMxOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CkBAIC00ODIsNyArNTI4LDcgQEAKIAkJCXJjID0gcmMxOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJcmMgPSB3aWxfZndfbG9hZCh3aWwsIGQsIHJjMSk7CisJCXJjID0gd2lsX2Z3X3Byb2Nlc3Mod2lsLCBkLCByYzEsIGxvYWQpOwogCQlpZiAocmMgPCAwKQogCQkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvaW50ZXJydXB0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9pbnRlcnJ1cHQuYwppbmRleCAwMTFlNzQxLi42NDA0NmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9pbnRlcnJ1cHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9pbnRlcnJ1cHQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiAgKgogICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCkBAIC0xMDEsNyArMTAxLDcgQEAKIAkgICAgICBtYXNrX2hhbHAgPyBXSUw2MjEwX0lSUV9ESVNBQkxFIDogV0lMNjIxMF9JUlFfRElTQUJMRV9OT19IQUxQKTsKIH0KIAotc3RhdGljIHZvaWQgd2lsNjIxMF9tYXNrX2hhbHAoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQordm9pZCB3aWw2MjEwX21hc2tfaGFscChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpCiB7CiAJd2lsX2RiZ19pcnEod2lsLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCkBAIC01MDMsNiArNTAzLDEzIEBACiAJCQkJb2Zmc2V0b2Yoc3RydWN0IFJHRl9JQ1IsIElDUikpOwogCQl1MzIgaW12X21pc2MgPSB3aWxfcih3aWwsIFJHRl9ETUFfRVBfTUlTQ19JQ1IgKwogCQkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IFJHRl9JQ1IsIElNVikpOworCisJCS8qIEhBTFAgaW50ZXJydXB0IGNhbiBiZSB1bm1hc2tlZCB3aGVuIG1pc2MgaW50ZXJydXB0cyBhcmUKKwkJICogbWFza2VkCisJCSAqLworCQlpZiAoaWNyX21pc2MgJiBCSVRfRE1BX0VQX01JU0NfSUNSX0hBTFApCisJCQlyZXR1cm4gMDsKKwogCQl3aWxfZXJyKHdpbCwgIklSUSB3aGVuIGl0IHNob3VsZCBiZSBtYXNrZWQ6IHBzZXVkbyAweCUwOHhcbiIKIAkJCQkiUnggICBpY206aWNyOmltdiAweCUwOHggMHglMDh4IDB4JTA4eFxuIgogCQkJCSJUeCAgIGljbTppY3I6aW12IDB4JTA4eCAweCUwOHggMHglMDh4XG4iCkBAIC01OTIsNyArNTk5LDcgQEAKIAogdm9pZCB3aWw2MjEwX3NldF9oYWxwKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKLQl3aWxfZGJnX21pc2Mod2lsLCAiJXMoKVxuIiwgX19mdW5jX18pOworCXdpbF9kYmdfaXJxKHdpbCwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAogCXdpbF93KHdpbCwgUkdGX0RNQV9FUF9NSVNDX0lDUiArIG9mZnNldG9mKHN0cnVjdCBSR0ZfSUNSLCBJQ1MpLAogCSAgICAgIEJJVF9ETUFfRVBfTUlTQ19JQ1JfSEFMUCk7CkBAIC02MDAsNyArNjA3LDcgQEAKIAogdm9pZCB3aWw2MjEwX2NsZWFyX2hhbHAoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQogewotCXdpbF9kYmdfbWlzYyh3aWwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJd2lsX2RiZ19pcnEod2lsLCAiJXMoKVxuIiwgX19mdW5jX18pOwogCiAJd2lsX3cod2lsLCBSR0ZfRE1BX0VQX01JU0NfSUNSICsgb2Zmc2V0b2Yoc3RydWN0IFJHRl9JQ1IsIElDUiksCiAJICAgICAgQklUX0RNQV9FUF9NSVNDX0lDUl9IQUxQKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL21haW4uYwppbmRleCA0YmM5MmU1Li5lNzEzMGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvbWFpbi5jCkBAIC0yMzIsNiArMjMyLDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHdpbF90b19uZGV2KHdpbCk7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IHdpbC0+d2RldjsKIAorCWlmICh1bmxpa2VseSghbmRldikpCisJCXJldHVybjsKKwogCW1pZ2h0X3NsZWVwKCk7CiAJd2lsX2luZm8od2lsLCAiJXMoYnNzaWQ9JXBNLCByZWFzb249JWQsIGV2JXMpXG4iLCBfX2Z1bmNfXywgYnNzaWQsCiAJCSByZWFzb25fY29kZSwgZnJvbV9ldmVudCA/ICIrIiA6ICItIik7CkBAIC04NDksNiArODUyLDcgQEAKIAliaXRtYXBfemVybyh3aWwtPnN0YXR1cywgd2lsX3N0YXR1c19sYXN0KTsKIAltdXRleF91bmxvY2soJndpbC0+d21pX211dGV4KTsKIAorCW11dGV4X2xvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogCWlmICh3aWwtPnNjYW5fcmVxdWVzdCkgewogCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9pbmZvIGluZm8gPSB7CiAJCQkuYWJvcnRlZCA9IHRydWUsCkBAIC04NjAsNiArODY0LDcgQEAKIAkJY2ZnODAyMTFfc2Nhbl9kb25lKHdpbC0+c2Nhbl9yZXF1ZXN0LCAmaW5mbyk7CiAJCXdpbC0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKIAl9CisJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAogCXdpbF9tYXNrX2lycSh3aWwpOwogCkBAIC04ODgsMTEgKzg5MywxMiBAQAogCQkJIFdJTF9GVzJfTkFNRSk7CiAKIAkJd2lsX2hhbHRfY3B1KHdpbCk7CisJCW1lbXNldCh3aWwtPmZ3X3ZlcnNpb24sIDAsIHNpemVvZih3aWwtPmZ3X3ZlcnNpb24pKTsKIAkJLyogTG9hZGluZyBmL3cgZnJvbSB0aGUgZmlsZSAqLwotCQlyYyA9IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHdpbCwgV0lMX0ZXX05BTUUpOworCQlyYyA9IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHdpbCwgV0lMX0ZXX05BTUUsIHRydWUpOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7Ci0JCXJjID0gd2lsX3JlcXVlc3RfZmlybXdhcmUod2lsLCBXSUxfRlcyX05BTUUpOworCQlyYyA9IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHdpbCwgV0lMX0ZXMl9OQU1FLCB0cnVlKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCkBAIC0xMDM1LDEwICsxMDQxLDEwIEBACiAKIGludCBfX3dpbF9kb3duKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKLQlpbnQgcmM7Ci0KIAlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJndpbC0+bXV0ZXgpKTsKIAorCXNldF9iaXQod2lsX3N0YXR1c19yZXNldHRpbmcsIHdpbC0+c3RhdHVzKTsKKwogCWlmICh3aWwtPnBsYXRmb3JtX29wcy5idXNfcmVxdWVzdCkKIAkJd2lsLT5wbGF0Zm9ybV9vcHMuYnVzX3JlcXVlc3Qod2lsLT5wbGF0Zm9ybV9oYW5kbGUsIDApOwogCkBAIC0xMDUwLDggKzEwNTYsOSBAQAogCX0KIAl3aWxfZW5hYmxlX2lycSh3aWwpOwogCi0JKHZvaWQpd2lsX3AycF9zdG9wX2Rpc2NvdmVyeSh3aWwpOworCXdpbF9wMnBfc3RvcF9yYWRpb19vcGVyYXRpb25zKHdpbCk7CiAKKwltdXRleF9sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAlpZiAod2lsLT5zY2FuX3JlcXVlc3QpIHsKIAkJc3RydWN0IGNmZzgwMjExX3NjYW5faW5mbyBpbmZvID0gewogCQkJLmFib3J0ZWQgPSB0cnVlLApAQCAtMTA2MywxOCArMTA3MCw3IEBACiAJCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgJmluZm8pOwogCQl3aWwtPnNjYW5fcmVxdWVzdCA9IE5VTEw7CiAJfQotCi0JaWYgKHRlc3RfYml0KHdpbF9zdGF0dXNfZndjb25uZWN0ZWQsIHdpbC0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdCh3aWxfc3RhdHVzX2Z3Y29ubmVjdGluZywgd2lsLT5zdGF0dXMpKSB7Ci0KLQkJbXV0ZXhfdW5sb2NrKCZ3aWwtPm11dGV4KTsKLQkJcmMgPSB3bWlfY2FsbCh3aWwsIFdNSV9ESVNDT05ORUNUX0NNRElELCBOVUxMLCAwLAotCQkJICAgICAgV01JX0RJU0NPTk5FQ1RfRVZFTlRJRCwgTlVMTCwgMCwKLQkJCSAgICAgIFdJTDYyMTBfRElTQ09OTkVDVF9UT19NUyk7Ci0JCW11dGV4X2xvY2soJndpbC0+bXV0ZXgpOwotCQlpZiAocmMpCi0JCQl3aWxfZXJyKHdpbCwgInRpbWVvdXQgd2FpdGluZyBmb3IgZGlzY29ubmVjdFxuIik7Ci0JfQorCW11dGV4X3VubG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAKIAl3aWxfcmVzZXQod2lsLCBmYWxzZSk7CiAKQEAgLTExMTgsMjMgKzExMTQsMjYgQEAKIAogCW11dGV4X2xvY2soJndpbC0+aGFscC5sb2NrKTsKIAotCXdpbF9kYmdfbWlzYyh3aWwsICIlczogc3RhcnQsIEhBTFAgcmVmX2NudCAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJICAgICB3aWwtPmhhbHAucmVmX2NudCk7CisJd2lsX2RiZ19pcnEod2lsLCAiJXM6IHN0YXJ0LCBIQUxQIHJlZl9jbnQgKCVkKVxuIiwgX19mdW5jX18sCisJCSAgICB3aWwtPmhhbHAucmVmX2NudCk7CiAKIAlpZiAoKyt3aWwtPmhhbHAucmVmX2NudCA9PSAxKSB7CiAJCXdpbDYyMTBfc2V0X2hhbHAod2lsKTsKIAkJcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJndpbC0+aGFscC5jb21wLCB0b19qaWZmaWVzKTsKLQkJaWYgKCFyYykKKwkJaWYgKCFyYykgewogCQkJd2lsX2Vycih3aWwsICIlczogSEFMUCB2b3RlIHRpbWVkIG91dFxuIiwgX19mdW5jX18pOwotCQllbHNlCi0JCQl3aWxfZGJnX21pc2Mod2lsLAotCQkJCSAgICAgIiVzOiBIQUxQIHZvdGUgY29tcGxldGVkIGFmdGVyICVkIG1zXG4iLAotCQkJCSAgICAgX19mdW5jX18sCi0JCQkJICAgICBqaWZmaWVzX3RvX21zZWNzKHRvX2ppZmZpZXMgLSByYykpOworCQkJLyogTWFzayBIQUxQIGFzIGRvbmUgaW4gY2FzZSB0aGUgaW50ZXJydXB0IGlzIHJhaXNlZCAqLworCQkJd2lsNjIxMF9tYXNrX2hhbHAod2lsKTsKKwkJfSBlbHNlIHsKKwkJCXdpbF9kYmdfaXJxKHdpbCwKKwkJCQkgICAgIiVzOiBIQUxQIHZvdGUgY29tcGxldGVkIGFmdGVyICVkIG1zXG4iLAorCQkJCSAgICBfX2Z1bmNfXywKKwkJCQkgICAgamlmZmllc190b19tc2Vjcyh0b19qaWZmaWVzIC0gcmMpKTsKKwkJfQogCX0KIAotCXdpbF9kYmdfbWlzYyh3aWwsICIlczogZW5kLCBIQUxQIHJlZl9jbnQgKCVkKVxuIiwgX19mdW5jX18sCi0JCSAgICAgd2lsLT5oYWxwLnJlZl9jbnQpOworCXdpbF9kYmdfaXJxKHdpbCwgIiVzOiBlbmQsIEhBTFAgcmVmX2NudCAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJICAgIHdpbC0+aGFscC5yZWZfY250KTsKIAogCW11dGV4X3VubG9jaygmd2lsLT5oYWxwLmxvY2spOwogfQpAQCAtMTE0NSwxNiArMTE0NCwxNiBAQAogCiAJbXV0ZXhfbG9jaygmd2lsLT5oYWxwLmxvY2spOwogCi0Jd2lsX2RiZ19taXNjKHdpbCwgIiVzOiBzdGFydCwgSEFMUCByZWZfY250ICglZClcbiIsIF9fZnVuY19fLAotCQkgICAgIHdpbC0+aGFscC5yZWZfY250KTsKKwl3aWxfZGJnX2lycSh3aWwsICIlczogc3RhcnQsIEhBTFAgcmVmX2NudCAoJWQpXG4iLCBfX2Z1bmNfXywKKwkJICAgIHdpbC0+aGFscC5yZWZfY250KTsKIAogCWlmICgtLXdpbC0+aGFscC5yZWZfY250ID09IDApIHsKIAkJd2lsNjIxMF9jbGVhcl9oYWxwKHdpbCk7Ci0JCXdpbF9kYmdfbWlzYyh3aWwsICIlczogSEFMUCB1bnZvdGVcbiIsIF9fZnVuY19fKTsKKwkJd2lsX2RiZ19pcnEod2lsLCAiJXM6IEhBTFAgdW52b3RlXG4iLCBfX2Z1bmNfXyk7CiAJfQogCi0Jd2lsX2RiZ19taXNjKHdpbCwgIiVzOiBlbmQsIEhBTFAgcmVmX2NudCAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJICAgICB3aWwtPmhhbHAucmVmX2NudCk7CisJd2lsX2RiZ19pcnEod2lsLCAiJXM6IGVuZCwgSEFMUCByZWZfY250ICglZClcbiIsIF9fZnVuY19fLAorCQkgICAgd2lsLT5oYWxwLnJlZl9jbnQpOwogCiAJbXV0ZXhfdW5sb2NrKCZ3aWwtPmhhbHAubG9jayk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL25ldGRldi5jCmluZGV4IDA5ODQwOTc1Li42MWRlNWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYwpAQCAtMTc5LDEzICsxNzksNiBAQAogCVNFVF9ORVRERVZfREVWKG5kZXYsIHdpcGh5X2Rldih3ZGV2LT53aXBoeSkpOwogCXdkZXYtPm5ldGRldiA9IG5kZXY7CiAKLQluZXRpZl9uYXBpX2FkZChuZGV2LCAmd2lsLT5uYXBpX3J4LCB3aWw2MjEwX25ldGRldl9wb2xsX3J4LAotCQkgICAgICAgV0lMNjIxMF9OQVBJX0JVREdFVCk7Ci0JbmV0aWZfdHhfbmFwaV9hZGQobmRldiwgJndpbC0+bmFwaV90eCwgd2lsNjIxMF9uZXRkZXZfcG9sbF90eCwKLQkJICAgICAgIFdJTDYyMTBfTkFQSV9CVURHRVQpOwotCi0JbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5kZXYpOwotCiAJcmV0dXJuIHdpbDsKIAogIG91dF9wcml2OgpAQCAtMjE2LDI1ICsyMDksNDggQEAKIAogaW50IHdpbF9pZl9hZGQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQogeworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSB3aWxfdG9fd2Rldih3aWwpOworCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3ZGV2LT53aXBoeTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHdpbF90b19uZGV2KHdpbCk7CiAJaW50IHJjOwogCi0Jd2lsX2RiZ19taXNjKHdpbCwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwl3aWxfZGJnX21pc2Mod2lsLCAiZW50ZXJlZCIpOworCisJc3RybGNweSh3aXBoeS0+ZndfdmVyc2lvbiwgd2lsLT5md192ZXJzaW9uLCBzaXplb2Yod2lwaHktPmZ3X3ZlcnNpb24pKTsKKworCXJjID0gd2lwaHlfcmVnaXN0ZXIod2lwaHkpOworCWlmIChyYyA8IDApIHsKKwkJd2lsX2Vycih3aWwsICJmYWlsZWQgdG8gcmVnaXN0ZXIgd2lwaHksIGVyciAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJbmV0aWZfbmFwaV9hZGQobmRldiwgJndpbC0+bmFwaV9yeCwgd2lsNjIxMF9uZXRkZXZfcG9sbF9yeCwKKwkJICAgICAgIFdJTDYyMTBfTkFQSV9CVURHRVQpOworCW5ldGlmX3R4X25hcGlfYWRkKG5kZXYsICZ3aWwtPm5hcGlfdHgsIHdpbDYyMTBfbmV0ZGV2X3BvbGxfdHgsCisJCQkgIFdJTDYyMTBfTkFQSV9CVURHRVQpOworCisJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5kZXYpOwogCiAJcmMgPSByZWdpc3Rlcl9uZXRkZXYobmRldik7CiAJaWYgKHJjIDwgMCkgewogCQlkZXZfZXJyKCZuZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgbmV0ZGV2OiAlZFxuIiwgcmMpOwotCQlyZXR1cm4gcmM7CisJCWdvdG8gb3V0X3dpcGh5OwogCX0KIAogCXJldHVybiAwOworCitvdXRfd2lwaHk6CisJd2lwaHlfdW5yZWdpc3Rlcih3ZGV2LT53aXBoeSk7CisJcmV0dXJuIHJjOwogfQogCiB2b2lkIHdpbF9pZl9yZW1vdmUoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gd2lsX3RvX25kZXYod2lsKTsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gd2lsX3RvX3dkZXYod2lsKTsKIAogCXdpbF9kYmdfbWlzYyh3aWwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwl3aXBoeV91bnJlZ2lzdGVyKHdkZXYtPndpcGh5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3AycC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcDJwLmMKaW5kZXggZTBmOGFhMC4uNDA4Nzc4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcDJwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcDJwLmMKQEAgLTI2MywzICsyNjMsNDkgQEAKIAkJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAl9CiB9CisKK3ZvaWQgd2lsX3AycF9zdG9wX3JhZGlvX29wZXJhdGlvbnMoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQoreworCXN0cnVjdCB3aWxfcDJwX2luZm8gKnAycCA9ICZ3aWwtPnAycDsKKwlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9pbmZvIGluZm8gPSB7CisJCS5hYm9ydGVkID0gdHJ1ZSwKKwl9OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmd2lsLT5tdXRleCk7CisKKwltdXRleF9sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKKworCWlmICh3aWwtPnJhZGlvX3dkZXYgIT0gd2lsLT5wMnBfd2RldikKKwkJZ290byBvdXQ7CisKKwlpZiAoIXAycC0+ZGlzY292ZXJ5X3N0YXJ0ZWQpIHsKKwkJLyogUmVndWxhciBzY2FuIG9uIHRoZSBwMnAgZGV2aWNlICovCisJCWlmICh3aWwtPnNjYW5fcmVxdWVzdCAmJgorCQkgICAgd2lsLT5zY2FuX3JlcXVlc3QtPndkZXYgPT0gd2lsLT5wMnBfd2RldikgeworCQkJY2ZnODAyMTFfc2Nhbl9kb25lKHdpbC0+c2Nhbl9yZXF1ZXN0LCAmaW5mbyk7CisJCQl3aWwtPnNjYW5fcmVxdWVzdCA9IE5VTEw7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJLyogU2VhcmNoIG9yIGxpc3RlbiBvbiBwMnAgZGV2aWNlICovCisJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKKwl3aWxfcDJwX3N0b3BfZGlzY292ZXJ5KHdpbCk7CisJbXV0ZXhfbG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CisKKwlpZiAod2lsLT5zY2FuX3JlcXVlc3QpIHsKKwkJLyogc2VhcmNoICovCisJCWNmZzgwMjExX3NjYW5fZG9uZSh3aWwtPnNjYW5fcmVxdWVzdCwgJmluZm8pOworCQl3aWwtPnNjYW5fcmVxdWVzdCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogbGlzdGVuICovCisJCWNmZzgwMjExX3JlbWFpbl9vbl9jaGFubmVsX2V4cGlyZWQod2lsLT5yYWRpb193ZGV2LAorCQkJCQkJICAgcDJwLT5jb29raWUsCisJCQkJCQkgICAmcDJwLT5saXN0ZW5fY2hhbiwKKwkJCQkJCSAgIEdGUF9LRVJORUwpOworCX0KKworb3V0OgorCXdpbC0+cmFkaW9fd2RldiA9IHdpbC0+d2RldjsKKwltdXRleF91bmxvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcGNpZV9idXMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3BjaWVfYnVzLmMKaW5kZXggN2I1YzQyMi4uNDQ3NDZjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcGNpZV9idXMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9wY2llX2J1cy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgIndpbDYyMTAuaCIKKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KIAogc3RhdGljIGJvb2wgdXNlX21zaSA9IHRydWU7CiBtb2R1bGVfcGFyYW0odXNlX21zaSwgYm9vbCwgU19JUlVHTyk7CkBAIC0zOCw2ICszOSw3IEBACiAJdTMyIHJldl9pZCA9IHdpbF9yKHdpbCwgUkdGX1VTRVJfSlRBR19ERVZfSUQpOwogCiAJYml0bWFwX3plcm8od2lsLT5od19jYXBhYmlsaXRpZXMsIGh3X2NhcGFiaWxpdHlfbGFzdCk7CisJYml0bWFwX3plcm8od2lsLT5md19jYXBhYmlsaXRpZXMsIFdNSV9GV19DQVBBQklMSVRZX01BWCk7CiAKIAlzd2l0Y2ggKHJldl9pZCkgewogCWNhc2UgSlRBR19ERVZfSURfU1BBUlJPV19CMDoKQEAgLTUxLDYgKzUzLDkgQEAKIAl9CiAKIAl3aWxfaW5mbyh3aWwsICJCb2FyZCBoYXJkd2FyZSBpcyAlc1xuIiwgd2lsLT5od19uYW1lKTsKKworCS8qIGV4dHJhY3QgRlcgY2FwYWJpbGl0aWVzIGZyb20gZmlsZSB3aXRob3V0IGxvYWRpbmcgdGhlIEZXICovCisJd2lsX3JlcXVlc3RfZmlybXdhcmUod2lsLCBXSUxfRldfTkFNRSwgZmFsc2UpOwogfQogCiB2b2lkIHdpbF9kaXNhYmxlX2lycShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpCkBAIC0yOTMsNiArMjk4LDkgQEAKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAogCXdpbDYyMTBfZGVidWdmc19yZW1vdmUod2lsKTsKKwlydG5sX2xvY2soKTsKKwl3aWxfcDJwX3dkZXZfZnJlZSh3aWwpOworCXJ0bmxfdW5sb2NrKCk7CiAJd2lsX2lmX3JlbW92ZSh3aWwpOwogCXdpbF9pZl9wY2llX2Rpc2FibGUod2lsKTsKIAlwY2lfaW91bm1hcChwZGV2LCBjc3IpOwpAQCAtMzAwLDcgKzMwOCw2IEBACiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCWlmICh3aWwtPnBsYXRmb3JtX29wcy51bmluaXQpCiAJCXdpbC0+cGxhdGZvcm1fb3BzLnVuaW5pdCh3aWwtPnBsYXRmb3JtX2hhbmRsZSk7Ci0Jd2lsX3AycF93ZGV2X2ZyZWUod2lsKTsKIAl3aWxfaWZfZnJlZSh3aWwpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC90eHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC90eHJ4LmMKaW5kZXggZjJmNmE0MC4uNGMzODUyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3R4cnguYwpAQCAtODczLDkgKzg3MywxMiBAQAogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQotCXZyaW5nLT5od3RhaWwgPSBsZTMyX3RvX2NwdShyZXBseS5jbWQudHhfdnJpbmdfdGFpbF9wdHIpOwogCisJc3Bpbl9sb2NrX2JoKCZ0eGRhdGEtPmxvY2spOworCXZyaW5nLT5od3RhaWwgPSBsZTMyX3RvX2NwdShyZXBseS5jbWQudHhfdnJpbmdfdGFpbF9wdHIpOwogCXR4ZGF0YS0+ZW5hYmxlZCA9IDE7CisJc3Bpbl91bmxvY2tfYmgoJnR4ZGF0YS0+bG9jayk7CisKIAlpZiAodHhkYXRhLT5kb3QxeF9vcGVuICYmIChhZ2dfd3NpemUgPj0gMCkpCiAJCXdpbF9hZGRiYV90eF9yZXF1ZXN0KHdpbCwgaWQsIGFnZ193c2l6ZSk7CiAKQEAgLTk1MCw5ICs5NTMsMTEgQEAKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9mcmVlOwogCX0KLQl2cmluZy0+aHd0YWlsID0gbGUzMl90b19jcHUocmVwbHkuY21kLnR4X3ZyaW5nX3RhaWxfcHRyKTsKIAorCXNwaW5fbG9ja19iaCgmdHhkYXRhLT5sb2NrKTsKKwl2cmluZy0+aHd0YWlsID0gbGUzMl90b19jcHUocmVwbHkuY21kLnR4X3ZyaW5nX3RhaWxfcHRyKTsKIAl0eGRhdGEtPmVuYWJsZWQgPSAxOworCXNwaW5fdW5sb2NrX2JoKCZ0eGRhdGEtPmxvY2spOwogCiAJcmV0dXJuIDA7CiAgb3V0X2ZyZWU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93aWw2MjEwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93aWw2MjEwLmgKaW5kZXggZWNhYjRhZi4uYTk0OWNkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd2lsNjIxMC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dpbDYyMTAuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBfX1dJTDYyMTBfSF9fCiAjZGVmaW5lIF9fV0lMNjIxMF9IX18KIAorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KQEAgLTU3NiwxMCArNTc3LDExIEBACiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKIAl2b2lkIF9faW9tZW0gKmNzcjsKIAlERUNMQVJFX0JJVE1BUChzdGF0dXMsIHdpbF9zdGF0dXNfbGFzdCk7Ci0JdTMyIGZ3X3ZlcnNpb247CisJdTggZndfdmVyc2lvbltFVEhUT09MX0ZXVkVSU19MRU5dOwogCXUzMiBod192ZXJzaW9uOwogCWNvbnN0IGNoYXIgKmh3X25hbWU7CiAJREVDTEFSRV9CSVRNQVAoaHdfY2FwYWJpbGl0aWVzLCBod19jYXBhYmlsaXR5X2xhc3QpOworCURFQ0xBUkVfQklUTUFQKGZ3X2NhcGFiaWxpdGllcywgV01JX0ZXX0NBUEFCSUxJVFlfTUFYKTsKIAl1OCBuX21pZHM7IC8qIG51bWJlciBvZiBhZGRpdGlvbmFsIE1JRHMgYXMgcmVwb3J0ZWQgYnkgRlcgKi8KIAl1MzIgcmVjb3ZlcnlfY291bnQ7IC8qIG51bSBvZiBGVyByZWNvdmVyeSBhdHRlbXB0cyBpbiBhIHNob3J0IHRpbWUgKi8KIAl1MzIgcmVjb3Zlcnlfc3RhdGU7IC8qIEZXIHJlY292ZXJ5IHN0YXRlIG1hY2hpbmUgKi8KQEAgLTY1Nyw3ICs2NTksNyBAQAogCiAJLyogUDJQX0RFVklDRSB2aWYgKi8KIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpwMnBfd2RldjsKLQlzdHJ1Y3QgbXV0ZXggcDJwX3dkZXZfbXV0ZXg7IC8qIHByb3RlY3QgQHAycF93ZGV2ICovCisJc3RydWN0IG11dGV4IHAycF93ZGV2X211dGV4OyAvKiBwcm90ZWN0IEBwMnBfd2RldiBhbmQgQHNjYW5fcmVxdWVzdCAqLwogCXN0cnVjdCB3aXJlbGVzc19kZXYgKnJhZGlvX3dkZXY7CiAKIAkvKiBIaWdoIEFjY2VzcyBMYXRlbmN5IFBvbGljeSB2b3RpbmcgKi8KQEAgLTgyOCw2ICs4MzAsNyBAQAogdm9pZCB3aWxfY29uZmlndXJlX2ludGVycnVwdF9tb2RlcmF0aW9uKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7CiB2b2lkIHdpbF9kaXNhYmxlX2lycShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOwogdm9pZCB3aWxfZW5hYmxlX2lycShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOwordm9pZCB3aWw2MjEwX21hc2tfaGFscChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOwogCiAvKiBQMlAgKi8KIGJvb2wgd2lsX3AycF9pc19zb2NpYWxfc2NhbihzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXF1ZXN0KTsKQEAgLTg0MCw2ICs4NDMsNyBAQAogaW50IHdpbF9wMnBfY2FuY2VsX2xpc3RlbihzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIHU2NCBjb29raWUpOwogdm9pZCB3aWxfcDJwX2xpc3Rlbl9leHBpcmVkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiB2b2lkIHdpbF9wMnBfc2VhcmNoX2V4cGlyZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgd2lsX3AycF9zdG9wX3JhZGlvX29wZXJhdGlvbnMoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKIAogLyogV01JIGZvciBQMlAgKi8KIGludCB3bWlfcDJwX2NmZyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGludCBjaGFubmVsLCBpbnQgYmkpOwpAQCAtODkzLDcgKzg5Nyw4IEBACiBpbnQgd2lsX2lmdHlwZV9ubDJ3bWkoZW51bSBubDgwMjExX2lmdHlwZSB0eXBlKTsKIAogaW50IHdpbF9pb2N0bChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIHZvaWQgX191c2VyICpkYXRhLCBpbnQgY21kKTsKLWludCB3aWxfcmVxdWVzdF9maXJtd2FyZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGNvbnN0IGNoYXIgKm5hbWUpOworaW50IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSBib29sIGxvYWQpOwogCiBpbnQgd2lsX2Nhbl9zdXNwZW5kKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgYm9vbCBpc19ydW50aW1lKTsKIGludCB3aWxfc3VzcGVuZChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGJvb2wgaXNfcnVudGltZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCmluZGV4IDRkOTI1NDEuLmZhZTRmMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jCkBAIC0zMTIsMTQgKzMxMiwxNCBAQAogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSB3aWwtPndkZXY7CiAJc3RydWN0IHdtaV9yZWFkeV9ldmVudCAqZXZ0ID0gZDsKIAotCXdpbC0+ZndfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KGV2dC0+c3dfdmVyc2lvbik7CiAJd2lsLT5uX21pZHMgPSBldnQtPm51bW9mX2FkZGl0aW9uYWxfbWlkczsKIAotCXdpbF9pbmZvKHdpbCwgIkZXIHZlci4gJWQ7IE1BQyAlcE07ICVkIE1JRCdzXG4iLCB3aWwtPmZ3X3ZlcnNpb24sCisJd2lsX2luZm8od2lsLCAiRlcgdmVyLiAlcyhTVyAlZCk7IE1BQyAlcE07ICVkIE1JRCdzXG4iLAorCQkgd2lsLT5md192ZXJzaW9uLCBsZTMyX3RvX2NwdShldnQtPnN3X3ZlcnNpb24pLAogCQkgZXZ0LT5tYWMsIHdpbC0+bl9taWRzKTsKIAkvKiBpZ25vcmUgTUFDIGFkZHJlc3MsIHdlIGFscmVhZHkgaGF2ZSBpdCBmcm9tIHRoZSBib290IGxvYWRlciAqLwotCXNucHJpbnRmKHdkZXYtPndpcGh5LT5md192ZXJzaW9uLCBzaXplb2Yod2Rldi0+d2lwaHktPmZ3X3ZlcnNpb24pLAotCQkgIiVkIiwgd2lsLT5md192ZXJzaW9uKTsKKwlzdHJsY3B5KHdkZXYtPndpcGh5LT5md192ZXJzaW9uLCB3aWwtPmZ3X3ZlcnNpb24sCisJCXNpemVvZih3ZGV2LT53aXBoeS0+ZndfdmVyc2lvbikpOwogCiAJd2lsX3NldF9yZWNvdmVyeV9zdGF0ZSh3aWwsIGZ3X3JlY292ZXJ5X2lkbGUpOwogCXNldF9iaXQod2lsX3N0YXR1c19md3JlYWR5LCB3aWwtPnN0YXR1cyk7CkBAIC00MjQsNiArNDI0LDcgQEAKIHN0YXRpYyB2b2lkIHdtaV9ldnRfc2Nhbl9jb21wbGV0ZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGludCBpZCwKIAkJCQkgIHZvaWQgKmQsIGludCBsZW4pCiB7CisJbXV0ZXhfbG9jaygmd2lsLT5wMnBfd2Rldl9tdXRleCk7CiAJaWYgKHdpbC0+c2Nhbl9yZXF1ZXN0KSB7CiAJCXN0cnVjdCB3bWlfc2Nhbl9jb21wbGV0ZV9ldmVudCAqZGF0YSA9IGQ7CiAJCXN0cnVjdCBjZmc4MDIxMV9zY2FuX2luZm8gaW5mbyA9IHsKQEAgLTQzNSwxNCArNDM2LDEzIEBACiAJCQkgICAgIHdpbC0+c2Nhbl9yZXF1ZXN0LCBpbmZvLmFib3J0ZWQpOwogCiAJCWRlbF90aW1lcl9zeW5jKCZ3aWwtPnNjYW5fdGltZXIpOwotCQltdXRleF9sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAkJY2ZnODAyMTFfc2Nhbl9kb25lKHdpbC0+c2Nhbl9yZXF1ZXN0LCAmaW5mbyk7CiAJCXdpbC0+cmFkaW9fd2RldiA9IHdpbC0+d2RldjsKLQkJbXV0ZXhfdW5sb2NrKCZ3aWwtPnAycF93ZGV2X211dGV4KTsKIAkJd2lsLT5zY2FuX3JlcXVlc3QgPSBOVUxMOwogCX0gZWxzZSB7CiAJCXdpbF9lcnIod2lsLCAiU0NBTl9DT01QTEVURSB3aGlsZSBub3Qgc2Nhbm5pbmdcbiIpOwogCX0KKwltdXRleF91bmxvY2soJndpbC0+cDJwX3dkZXZfbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCB3bWlfZXZ0X2Nvbm5lY3Qoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBpbnQgaWQsIHZvaWQgKmQsIGludCBsZW4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5oCmluZGV4IDY4NWZlMGQuLmY0MzBlOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5oCkBAIC00Niw2ICs0NiwxNiBAQAogCU1JRF9CUk9BRENBU1QJCT0gMHhGRiwKIH07CiAKKy8qIEZXIGNhcGFiaWxpdHkgSURzCisgKiBFYWNoIElEIG1hcHMgdG8gYSBiaXQgaW4gYSAzMi1iaXQgYml0bWFzayB2YWx1ZSBwcm92aWRlZCBieSB0aGUgRlcgdG8KKyAqIHRoZSBob3N0CisgKi8KK2VudW0gd21pX2Z3X2NhcGFiaWxpdHkgeworCVdNSV9GV19DQVBBQklMSVRZX0ZUTQkJPSAwLAorCVdNSV9GV19DQVBBQklMSVRZX1BTX0NPTkZJRwk9IDEsCisJV01JX0ZXX0NBUEFCSUxJVFlfTUFYLAorfTsKKwogLyogV01JX0NNRF9IRFIgKi8KIHN0cnVjdCB3bWlfY21kX2hkciB7CiAJdTggbWlkOwpAQCAtMTIwLDYgKzEzMCw4IEBACiAJV01JX0JGX1NNX01HTVRfQ01ESUQJCQk9IDB4ODM4LAogCVdNSV9CRl9SWFNTX01HTVRfQ01ESUQJCQk9IDB4ODM5LAogCVdNSV9CRl9UUklHX0NNRElECQkJPSAweDgzQSwKKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfV1JJVEVfQ01ESUQJPSAweDg0MiwKKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfUkVBRF9DTURJRAk9IDB4ODQzLAogCVdNSV9TRVRfU0VDVE9SU19DTURJRAkJCT0gMHg4NDksCiAJV01JX01BSU5UQUlOX1BBVVNFX0NNRElECQk9IDB4ODUwLAogCVdNSV9NQUlOVEFJTl9SRVNVTUVfQ01ESUQJCT0gMHg4NTEsCkBAIC0xMzQsMTAgKzE0NiwxNSBAQAogCVdNSV9CRl9DVFJMX0NNRElECQkJPSAweDg2MiwKIAlXTUlfTk9USUZZX1JFUV9DTURJRAkJCT0gMHg4NjMsCiAJV01JX0dFVF9TVEFUVVNfQ01ESUQJCQk9IDB4ODY0LAorCVdNSV9HRVRfUkZfU1RBVFVTX0NNRElECQkJPSAweDg2NiwKKwlXTUlfR0VUX0JBU0VCQU5EX1RZUEVfQ01ESUQJCT0gMHg4NjcsCiAJV01JX1VOSVRfVEVTVF9DTURJRAkJCT0gMHg5MDAsCiAJV01JX0hJQ0NVUF9DTURJRAkJCT0gMHg5MDEsCiAJV01JX0ZMQVNIX1JFQURfQ01ESUQJCQk9IDB4OTAyLAogCVdNSV9GTEFTSF9XUklURV9DTURJRAkJCT0gMHg5MDMsCisJLyogUG93ZXIgbWFuYWdlbWVudCAqLworCVdNSV9UUkFGRklDX0RFRkVSUkFMX0NNRElECQk9IDB4OTA0LAorCVdNSV9UUkFGRklDX1JFU1VNRV9DTURJRAkJPSAweDkwNSwKIAkvKiBQMlAgKi8KIAlXTUlfUDJQX0NGR19DTURJRAkJCT0gMHg5MTAsCiAJV01JX1BPUlRfQUxMT0NBVEVfQ01ESUQJCQk9IDB4OTExLApAQCAtMTUwLDYgKzE2NywyNiBAQAogCVdNSV9QQ1BfU1RBUlRfQ01ESUQJCQk9IDB4OTE4LAogCVdNSV9QQ1BfU1RPUF9DTURJRAkJCT0gMHg5MTksCiAJV01JX0dFVF9QQ1BfRkFDVE9SX0NNRElECQk9IDB4OTFCLAorCS8qIFBvd2VyIFNhdmUgQ29uZmlndXJhdGlvbiBDb21tYW5kcyAqLworCVdNSV9QU19ERVZfUFJPRklMRV9DRkdfQ01ESUQJCT0gMHg5MUMsCisJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlXTUlfUFNfREVWX0NGR19DTURJRAkJCT0gMHg5MUQsCisJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlXTUlfUFNfREVWX0NGR19SRUFEX0NNRElECQk9IDB4OTFFLAorCS8qIFBlciBNQUMgUG93ZXIgU2F2ZSBDb25maWd1cmF0aW9uIGNvbW1hbmRzCisJICogTm90IHN1cHBvcnRlZCB5ZXQKKwkgKi8KKwlXTUlfUFNfTUlEX0NGR19DTURJRAkJCT0gMHg5MUYsCisJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlXTUlfUFNfTUlEX0NGR19SRUFEX0NNRElECQk9IDB4OTIwLAorCVdNSV9SU19DRkdfQ01ESUQJCQk9IDB4OTIxLAorCVdNSV9HRVRfREVUQUlMRURfUlNfUkVTX0NNRElECQk9IDB4OTIyLAorCVdNSV9BT0FfTUVBU19DTURJRAkJCT0gMHg5MjMsCisJV01JX1RPRl9TRVNTSU9OX1NUQVJUX0NNRElECQk9IDB4OTkxLAorCVdNSV9UT0ZfR0VUX0NBUEFCSUxJVElFU19DTURJRAkJPSAweDk5MiwKKwlXTUlfVE9GX1NFVF9MQ1JfQ01ESUQJCQk9IDB4OTkzLAorCVdNSV9UT0ZfU0VUX0xDSV9DTURJRAkJCT0gMHg5OTQsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fQ01ESUQJCT0gMHg5OTUsCiAJV01JX1NFVF9NQUNfQUREUkVTU19DTURJRAkJPSAweEYwMDMsCiAJV01JX0FCT1JUX1NDQU5fQ01ESUQJCQk9IDB4RjAwNywKIAlXTUlfU0VUX1BST01JU0NVT1VTX01PREVfQ01ESUQJCT0gMHhGMDQxLApAQCAtMjkxLDkgKzMyOCw4IEBACiAvKiBXTUlfU1RBUlRfU0NBTl9DTURJRCAqLwogc3RydWN0IHdtaV9zdGFydF9zY2FuX2NtZCB7CiAJdTggZGlyZWN0X3NjYW5fbWFjX2FkZHJbV01JX01BQ19MRU5dOwotCS8qIERNRyBCZWFjb24gZnJhbWUgaXMgdHJhbnNtaXR0ZWQgZHVyaW5nIGFjdGl2ZSBzY2FubmluZyAqLworCS8qIHJ1biBzY2FuIHdpdGggZGlzY292ZXJ5IGJlYWNvbi4gUmVsZXZhbnQgZm9yIEFDVElWRSBzY2FuIG9ubHkuICovCiAJdTggZGlzY292ZXJ5X21vZGU7Ci0JLyogcmVzZXJ2ZWQgKi8KIAl1OCByZXNlcnZlZDsKIAkvKiBNYXggZHVyYXRpb24gaW4gdGhlIGhvbWUgY2hhbm5lbChtcykgKi8KIAlfX2xlMzIgZHdlbGxfdGltZTsKQEAgLTQ1Myw2ICs0ODksMTIgQEAKIAl1OCByZXNlcnZlZFszXTsKIH0gX19wYWNrZWQ7CiAKKy8qIFdNSV9UUkFGRklDX0RFRkVSUkFMX0NNRElEICovCitzdHJ1Y3Qgd21pX3RyYWZmaWNfZGVmZXJyYWxfY21kIHsKKwkvKiBCaXQgdmVjdG9yOiBiaXRbMF0gLSB3YWtlIG9uIFVuaWNhc3QsIGJpdFsxXSAtIHdha2Ugb24gQnJvYWRjYXN0ICovCisJdTggd2FrZXVwX3RyaWdnZXI7Cit9IF9fcGFja2VkOworCiAvKiBXTUlfUDJQX0NGR19DTURJRCAqLwogZW51bSB3bWlfZGlzY292ZXJ5X21vZGUgewogCVdNSV9ESVNDT1ZFUllfTU9ERV9OT05fT0ZGTE9BRAk9IDB4MDAsCkBAIC04MTgsODUgKzg2MCwxOTMgQEAKIAlfX2xlNjQgbWVtX2Jhc2U7CiB9IF9fcGFja2VkOwogCitlbnVtIHdtaV9hb2FfbWVhc190eXBlIHsKKwlXTUlfQU9BX1BIQVNFX01FQVMJPSAweDAwLAorCVdNSV9BT0FfUEhBU0VfQU1QX01FQVMJPSAweDAxLAorfTsKKworLyogV01JX0FPQV9NRUFTX0NNRElEICovCitzdHJ1Y3Qgd21pX2FvYV9tZWFzX2NtZCB7CisJdTggbWFjX2FkZHJbV01JX01BQ19MRU5dOworCS8qIGNoYW5uZWxzIElEczoKKwkgKiAwIC0gNTgzMjAgTUh6CisJICogMSAtIDYwNDgwIE1IegorCSAqIDIgLSA2MjY0MCBNSHoKKwkgKi8KKwl1OCBjaGFubmVsOworCS8qIGVudW0gd21pX2FvYV9tZWFzX3R5cGUgKi8KKwl1OCBhb2FfbWVhc190eXBlOworCV9fbGUzMiBtZWFzX3JmX21hc2s7Cit9IF9fcGFja2VkOworCitlbnVtIHdtaV90b2ZfYnVyc3RfZHVyYXRpb24geworCVdNSV9UT0ZfQlVSU1RfRFVSQVRJT05fMjUwX1VTRUMJCT0gMiwKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzUwMF9VU0VDCQk9IDMsCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl8xX01TRUMJCT0gNCwKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzJfTVNFQwkJPSA1LAorCVdNSV9UT0ZfQlVSU1RfRFVSQVRJT05fNF9NU0VDCQk9IDYsCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl84X01TRUMJCT0gNywKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzE2X01TRUMJCT0gOCwKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzMyX01TRUMJCT0gOSwKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OXzY0X01TRUMJCT0gMTAsCisJV01JX1RPRl9CVVJTVF9EVVJBVElPTl8xMjhfTVNFQwkJPSAxMSwKKwlXTUlfVE9GX0JVUlNUX0RVUkFUSU9OX05PX1BSRUZFUkVOQ0VTCT0gMTUsCit9OworCitlbnVtIHdtaV90b2Zfc2Vzc2lvbl9zdGFydF9mbGFncyB7CisJV01JX1RPRl9TRVNTSU9OX1NUQVJUX0ZMQUdfU0VDVVJFRAk9IDB4MSwKKwlXTUlfVE9GX1NFU1NJT05fU1RBUlRfRkxBR19BU0FQCQk9IDB4MiwKKwlXTUlfVE9GX1NFU1NJT05fU1RBUlRfRkxBR19MQ0lfUkVRCT0gMHg0LAorCVdNSV9UT0ZfU0VTU0lPTl9TVEFSVF9GTEFHX0xDUl9SRVEJPSAweDgsCit9OworCisvKiBXTUlfVE9GX1NFU1NJT05fU1RBUlRfQ01ESUQgKi8KK3N0cnVjdCB3bWlfZnRtX2Rlc3RfaW5mbyB7CisJdTggY2hhbm5lbDsKKwkvKiB3bWlfdG9mX3Nlc3Npb25fc3RhcnRfZmxhZ3NfZSAqLworCXU4IGZsYWdzOworCXU4IGluaXRpYWxfdG9rZW47CisJdTggbnVtX29mX2Z0bV9wZXJfYnVyc3Q7CisJdTggbnVtX29mX2J1cnN0c19leHA7CisJLyogd21pX3RvZl9idXJzdF9kdXJhdGlvbl9lICovCisJdTggYnVyc3RfZHVyYXRpb247CisJLyogQnVyc3QgUGVyaW9kIGluZGljYXRlIGludGVydmFsIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGJ1cnN0CisJICogaW5zdGFuY2VzLCBpbiB1bml0cyBvZiAxMDAgbXMKKwkgKi8KKwlfX2xlMTYgYnVyc3RfcGVyaW9kOworCXU4IGRzdF9tYWNbV01JX01BQ19MRU5dOworCV9fbGUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9UT0ZfU0VTU0lPTl9TVEFSVF9DTURJRCAqLworc3RydWN0IHdtaV90b2Zfc2Vzc2lvbl9zdGFydF9jbWQgeworCV9fbGUzMiBzZXNzaW9uX2lkOworCXU4IG51bV9vZl9hb2FfbWVhc3VyZXM7CisJdTggYW9hX3R5cGU7CisJX19sZTE2IG51bV9vZl9kZXN0OworCXU4IHJlc2VydmVkWzRdOworCXN0cnVjdCB3bWlfZnRtX2Rlc3RfaW5mbyBmdG1fZGVzdF9pbmZvWzBdOworfSBfX3BhY2tlZDsKKworZW51bSB3bWlfdG9mX2NoYW5uZWxfaW5mb19yZXBvcnRfdHlwZSB7CisJV01JX1RPRl9DSEFOTkVMX0lORk9fVFlQRV9DSVIJCQk9IDB4MSwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19UWVBFX1JTU0kJCQk9IDB4MiwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19UWVBFX1NOUgkJCT0gMHg0LAorCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX1RZUEVfREVCVUdfREFUQQkJPSAweDgsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fVFlQRV9WRU5ET1JfU1BFQ0lGSUMJPSAweDEwLAorfTsKKworLyogV01JX1RPRl9DSEFOTkVMX0lORk9fQ01ESUQgKi8KK3N0cnVjdCB3bWlfdG9mX2NoYW5uZWxfaW5mb19jbWQgeworCS8qIHdtaV90b2ZfY2hhbm5lbF9pbmZvX3JlcG9ydF90eXBlX2UgKi8KKwlfX2xlMzIgY2hhbm5lbF9pbmZvX3JlcG9ydF9yZXF1ZXN0OworfSBfX3BhY2tlZDsKKwogLyogV01JIEV2ZW50cwogICogTGlzdCBvZiBFdmVudHMgKHRhcmdldCB0byBob3N0KQogICovCiBlbnVtIHdtaV9ldmVudF9pZCB7Ci0JV01JX1JFQURZX0VWRU5USUQJCQk9IDB4MTAwMSwKLQlXTUlfQ09OTkVDVF9FVkVOVElECQkJPSAweDEwMDIsCi0JV01JX0RJU0NPTk5FQ1RfRVZFTlRJRAkJCT0gMHgxMDAzLAotCVdNSV9TQ0FOX0NPTVBMRVRFX0VWRU5USUQJCT0gMHgxMDBBLAotCVdNSV9SRVBPUlRfU1RBVElTVElDU19FVkVOVElECQk9IDB4MTAwQiwKLQlXTUlfUkRfTUVNX1JTUF9FVkVOVElECQkJPSAweDE4MDAsCi0JV01JX0ZXX1JFQURZX0VWRU5USUQJCQk9IDB4MTgwMSwKLQlXTUlfRVhJVF9GQVNUX01FTV9BQ0NfTU9ERV9FVkVOVElECT0gMHgyMDAsCi0JV01JX0VDSE9fUlNQX0VWRU5USUQJCQk9IDB4MTgwMywKLQlXTUlfRlNfVFVORV9ET05FX0VWRU5USUQJCT0gMHgxODBBLAotCVdNSV9DT1JSX01FQVNVUkVfRVZFTlRJRAkJPSAweDE4MEIsCi0JV01JX1JFQURfUlNTSV9FVkVOVElECQkJPSAweDE4MEMsCi0JV01JX1RFTVBfU0VOU0VfRE9ORV9FVkVOVElECQk9IDB4MTgwRSwKLQlXTUlfRENfQ0FMSUJfRE9ORV9FVkVOVElECQk9IDB4MTgwRiwKLQlXTUlfSVFfVFhfQ0FMSUJfRE9ORV9FVkVOVElECQk9IDB4MTgxMSwKLQlXTUlfSVFfUlhfQ0FMSUJfRE9ORV9FVkVOVElECQk9IDB4MTgxMiwKLQlXTUlfU0VUX1dPUktfTU9ERV9ET05FX0VWRU5USUQJCT0gMHgxODE1LAotCVdNSV9MT19MRUFLQUdFX0NBTElCX0RPTkVfRVZFTlRJRAk9IDB4MTgxNiwKLQlXTUlfTUFSTE9OX1JfUkVBRF9ET05FX0VWRU5USUQJCT0gMHgxODE4LAotCVdNSV9NQVJMT05fUl9XUklURV9ET05FX0VWRU5USUQJCT0gMHgxODE5LAotCVdNSV9NQVJMT05fUl9UWFJYX1NFTF9ET05FX0VWRU5USUQJPSAweDE4MUEsCi0JV01JX1NJTEVOVF9SU1NJX0NBTElCX0RPTkVfRVZFTlRJRAk9IDB4MTgxRCwKLQlXTUlfUkZfUlhfVEVTVF9ET05FX0VWRU5USUQJCT0gMHgxODFFLAotCVdNSV9DRkdfUlhfQ0hBSU5fRE9ORV9FVkVOVElECQk9IDB4MTgyMCwKLQlXTUlfVlJJTkdfQ0ZHX0RPTkVfRVZFTlRJRAkJPSAweDE4MjEsCi0JV01JX0JBX1NUQVRVU19FVkVOVElECQkJPSAweDE4MjMsCi0JV01JX1JDUF9BRERCQV9SRVFfRVZFTlRJRAkJPSAweDE4MjQsCi0JV01JX1JDUF9BRERCQV9SRVNQX1NFTlRfRVZFTlRJRAkJPSAweDE4MjUsCi0JV01JX0RFTEJBX0VWRU5USUQJCQk9IDB4MTgyNiwKLQlXTUlfR0VUX1NTSURfRVZFTlRJRAkJCT0gMHgxODI4LAotCVdNSV9HRVRfUENQX0NIQU5ORUxfRVZFTlRJRAkJPSAweDE4MkEsCi0JV01JX1NXX1RYX0NPTVBMRVRFX0VWRU5USUQJCT0gMHgxODJCLAotCVdNSV9SRUFEX01BQ19SWFFfRVZFTlRJRAkJPSAweDE4MzAsCi0JV01JX1JFQURfTUFDX1RYUV9FVkVOVElECQk9IDB4MTgzMSwKLQlXTUlfV1JJVEVfTUFDX1JYUV9FVkVOVElECQk9IDB4MTgzMiwKLQlXTUlfV1JJVEVfTUFDX1RYUV9FVkVOVElECQk9IDB4MTgzMywKLQlXTUlfV1JJVEVfTUFDX1hRX0ZJRUxEX0VWRU5USUQJCT0gMHgxODM0LAotCVdNSV9CRUFNRk9STUlOR19NR01UX0RPTkVfRVZFTlRJRAk9IDB4MTgzNiwKLQlXTUlfQkZfVFhTU19NR01UX0RPTkVfRVZFTlRJRAkJPSAweDE4MzcsCi0JV01JX0JGX1JYU1NfTUdNVF9ET05FX0VWRU5USUQJCT0gMHgxODM5LAotCVdNSV9SU19NR01UX0RPTkVfRVZFTlRJRAkJPSAweDE4NTIsCi0JV01JX1JGX01HTVRfU1RBVFVTX0VWRU5USUQJCT0gMHgxODUzLAotCVdNSV9USEVSTUFMX1RIUk9UVExJTkdfU1RBVFVTX0VWRU5USUQJPSAweDE4NTUsCi0JV01JX0JGX1NNX01HTVRfRE9ORV9FVkVOVElECQk9IDB4MTgzOCwKLQlXTUlfUlhfTUdNVF9QQUNLRVRfRVZFTlRJRAkJPSAweDE4NDAsCi0JV01JX1RYX01HTVRfUEFDS0VUX0VWRU5USUQJCT0gMHgxODQxLAotCVdNSV9PVFBfUkVBRF9SRVNVTFRfRVZFTlRJRAkJPSAweDE4NTYsCi0JV01JX0xFRF9DRkdfRE9ORV9FVkVOVElECQk9IDB4MTg1OCwKKwlXTUlfUkVBRFlfRVZFTlRJRAkJCQk9IDB4MTAwMSwKKwlXTUlfQ09OTkVDVF9FVkVOVElECQkJCT0gMHgxMDAyLAorCVdNSV9ESVNDT05ORUNUX0VWRU5USUQJCQkJPSAweDEwMDMsCisJV01JX1NDQU5fQ09NUExFVEVfRVZFTlRJRAkJCT0gMHgxMDBBLAorCVdNSV9SRVBPUlRfU1RBVElTVElDU19FVkVOVElECQkJPSAweDEwMEIsCisJV01JX1JEX01FTV9SU1BfRVZFTlRJRAkJCQk9IDB4MTgwMCwKKwlXTUlfRldfUkVBRFlfRVZFTlRJRAkJCQk9IDB4MTgwMSwKKwlXTUlfRVhJVF9GQVNUX01FTV9BQ0NfTU9ERV9FVkVOVElECQk9IDB4MjAwLAorCVdNSV9FQ0hPX1JTUF9FVkVOVElECQkJCT0gMHgxODAzLAorCVdNSV9GU19UVU5FX0RPTkVfRVZFTlRJRAkJCT0gMHgxODBBLAorCVdNSV9DT1JSX01FQVNVUkVfRVZFTlRJRAkJCT0gMHgxODBCLAorCVdNSV9SRUFEX1JTU0lfRVZFTlRJRAkJCQk9IDB4MTgwQywKKwlXTUlfVEVNUF9TRU5TRV9ET05FX0VWRU5USUQJCQk9IDB4MTgwRSwKKwlXTUlfRENfQ0FMSUJfRE9ORV9FVkVOVElECQkJPSAweDE4MEYsCisJV01JX0lRX1RYX0NBTElCX0RPTkVfRVZFTlRJRAkJCT0gMHgxODExLAorCVdNSV9JUV9SWF9DQUxJQl9ET05FX0VWRU5USUQJCQk9IDB4MTgxMiwKKwlXTUlfU0VUX1dPUktfTU9ERV9ET05FX0VWRU5USUQJCQk9IDB4MTgxNSwKKwlXTUlfTE9fTEVBS0FHRV9DQUxJQl9ET05FX0VWRU5USUQJCT0gMHgxODE2LAorCVdNSV9NQVJMT05fUl9SRUFEX0RPTkVfRVZFTlRJRAkJCT0gMHgxODE4LAorCVdNSV9NQVJMT05fUl9XUklURV9ET05FX0VWRU5USUQJCQk9IDB4MTgxOSwKKwlXTUlfTUFSTE9OX1JfVFhSWF9TRUxfRE9ORV9FVkVOVElECQk9IDB4MTgxQSwKKwlXTUlfU0lMRU5UX1JTU0lfQ0FMSUJfRE9ORV9FVkVOVElECQk9IDB4MTgxRCwKKwlXTUlfUkZfUlhfVEVTVF9ET05FX0VWRU5USUQJCQk9IDB4MTgxRSwKKwlXTUlfQ0ZHX1JYX0NIQUlOX0RPTkVfRVZFTlRJRAkJCT0gMHgxODIwLAorCVdNSV9WUklOR19DRkdfRE9ORV9FVkVOVElECQkJPSAweDE4MjEsCisJV01JX0JBX1NUQVRVU19FVkVOVElECQkJCT0gMHgxODIzLAorCVdNSV9SQ1BfQUREQkFfUkVRX0VWRU5USUQJCQk9IDB4MTgyNCwKKwlXTUlfUkNQX0FEREJBX1JFU1BfU0VOVF9FVkVOVElECQkJPSAweDE4MjUsCisJV01JX0RFTEJBX0VWRU5USUQJCQkJPSAweDE4MjYsCisJV01JX0dFVF9TU0lEX0VWRU5USUQJCQkJPSAweDE4MjgsCisJV01JX0dFVF9QQ1BfQ0hBTk5FTF9FVkVOVElECQkJPSAweDE4MkEsCisJV01JX1NXX1RYX0NPTVBMRVRFX0VWRU5USUQJCQk9IDB4MTgyQiwKKwlXTUlfUkVBRF9NQUNfUlhRX0VWRU5USUQJCQk9IDB4MTgzMCwKKwlXTUlfUkVBRF9NQUNfVFhRX0VWRU5USUQJCQk9IDB4MTgzMSwKKwlXTUlfV1JJVEVfTUFDX1JYUV9FVkVOVElECQkJPSAweDE4MzIsCisJV01JX1dSSVRFX01BQ19UWFFfRVZFTlRJRAkJCT0gMHgxODMzLAorCVdNSV9XUklURV9NQUNfWFFfRklFTERfRVZFTlRJRAkJCT0gMHgxODM0LAorCVdNSV9CRUFNRk9STUlOR19NR01UX0RPTkVfRVZFTlRJRAkJPSAweDE4MzYsCisJV01JX0JGX1RYU1NfTUdNVF9ET05FX0VWRU5USUQJCQk9IDB4MTgzNywKKwlXTUlfQkZfUlhTU19NR01UX0RPTkVfRVZFTlRJRAkJCT0gMHgxODM5LAorCVdNSV9SU19NR01UX0RPTkVfRVZFTlRJRAkJCT0gMHgxODUyLAorCVdNSV9SRl9NR01UX1NUQVRVU19FVkVOVElECQkJPSAweDE4NTMsCisJV01JX1RIRVJNQUxfVEhST1RUTElOR19TVEFUVVNfRVZFTlRJRAkJPSAweDE4NTUsCisJV01JX0JGX1NNX01HTVRfRE9ORV9FVkVOVElECQkJPSAweDE4MzgsCisJV01JX1JYX01HTVRfUEFDS0VUX0VWRU5USUQJCQk9IDB4MTg0MCwKKwlXTUlfVFhfTUdNVF9QQUNLRVRfRVZFTlRJRAkJCT0gMHgxODQxLAorCVdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURV9ET05FX0VWRU5USUQJPSAweDE4NDIsCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1JFQURfRE9ORV9FVkVOVElECQk9IDB4MTg0MywKKwlXTUlfT1RQX1JFQURfUkVTVUxUX0VWRU5USUQJCQk9IDB4MTg1NiwKKwlXTUlfTEVEX0NGR19ET05FX0VWRU5USUQJCQk9IDB4MTg1OCwKIAkvKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGV2ZW50cyAqLwotCVdNSV9EQVRBX1BPUlRfT1BFTl9FVkVOVElECQk9IDB4MTg2MCwKLQlXTUlfV0JFX0xJTktfRE9XTl9FVkVOVElECQk9IDB4MTg2MSwKLQlXTUlfQkZfQ1RSTF9ET05FX0VWRU5USUQJCT0gMHgxODYyLAotCVdNSV9OT1RJRllfUkVRX0RPTkVfRVZFTlRJRAkJPSAweDE4NjMsCi0JV01JX0dFVF9TVEFUVVNfRE9ORV9FVkVOVElECQk9IDB4MTg2NCwKLQlXTUlfVlJJTkdfRU5fRVZFTlRJRAkJCT0gMHgxODY1LAotCVdNSV9VTklUX1RFU1RfRVZFTlRJRAkJCT0gMHgxOTAwLAotCVdNSV9GTEFTSF9SRUFEX0RPTkVfRVZFTlRJRAkJPSAweDE5MDIsCi0JV01JX0ZMQVNIX1dSSVRFX0RPTkVfRVZFTlRJRAkJPSAweDE5MDMsCisJV01JX0RBVEFfUE9SVF9PUEVOX0VWRU5USUQJCQk9IDB4MTg2MCwKKwlXTUlfV0JFX0xJTktfRE9XTl9FVkVOVElECQkJPSAweDE4NjEsCisJV01JX0JGX0NUUkxfRE9ORV9FVkVOVElECQkJPSAweDE4NjIsCisJV01JX05PVElGWV9SRVFfRE9ORV9FVkVOVElECQkJPSAweDE4NjMsCisJV01JX0dFVF9TVEFUVVNfRE9ORV9FVkVOVElECQkJPSAweDE4NjQsCisJV01JX1ZSSU5HX0VOX0VWRU5USUQJCQkJPSAweDE4NjUsCisJV01JX0dFVF9SRl9TVEFUVVNfRVZFTlRJRAkJCT0gMHgxODY2LAorCVdNSV9HRVRfQkFTRUJBTkRfVFlQRV9FVkVOVElECQkJPSAweDE4NjcsCisJV01JX1VOSVRfVEVTVF9FVkVOVElECQkJCT0gMHgxOTAwLAorCVdNSV9GTEFTSF9SRUFEX0RPTkVfRVZFTlRJRAkJCT0gMHgxOTAyLAorCVdNSV9GTEFTSF9XUklURV9ET05FX0VWRU5USUQJCQk9IDB4MTkwMywKKwkvKiBQb3dlciBtYW5hZ2VtZW50ICovCisJV01JX1RSQUZGSUNfREVGRVJSQUxfRVZFTlRJRAkJCT0gMHgxOTA0LAorCVdNSV9UUkFGRklDX1JFU1VNRV9FVkVOVElECQkJPSAweDE5MDUsCiAJLyogUDJQICovCi0JV01JX1AyUF9DRkdfRE9ORV9FVkVOVElECQk9IDB4MTkxMCwKLQlXTUlfUE9SVF9BTExPQ0FURURfRVZFTlRJRAkJPSAweDE5MTEsCi0JV01JX1BPUlRfREVMRVRFRF9FVkVOVElECQk9IDB4MTkxMiwKLQlXTUlfTElTVEVOX1NUQVJURURfRVZFTlRJRAkJPSAweDE5MTQsCi0JV01JX1NFQVJDSF9TVEFSVEVEX0VWRU5USUQJCT0gMHgxOTE1LAotCVdNSV9ESVNDT1ZFUllfU1RBUlRFRF9FVkVOVElECQk9IDB4MTkxNiwKLQlXTUlfRElTQ09WRVJZX1NUT1BQRURfRVZFTlRJRAkJPSAweDE5MTcsCi0JV01JX1BDUF9TVEFSVEVEX0VWRU5USUQJCQk9IDB4MTkxOCwKLQlXTUlfUENQX1NUT1BQRURfRVZFTlRJRAkJCT0gMHgxOTE5LAotCVdNSV9QQ1BfRkFDVE9SX0VWRU5USUQJCQk9IDB4MTkxQSwKLQlXTUlfU0VUX0NIQU5ORUxfRVZFTlRJRAkJCT0gMHg5MDAwLAotCVdNSV9BU1NPQ19SRVFfRVZFTlRJRAkJCT0gMHg5MDAxLAotCVdNSV9FQVBPTF9SWF9FVkVOVElECQkJPSAweDkwMDIsCi0JV01JX01BQ19BRERSX1JFU1BfRVZFTlRJRAkJPSAweDkwMDMsCi0JV01JX0ZXX1ZFUl9FVkVOVElECQkJPSAweDkwMDQsCi0JV01JX0FDU19QQVNTSVZFX1NDQU5fQ09NUExFVEVfRVZFTlRJRAk9IDB4OTAwNSwKKwlXTUlfUDJQX0NGR19ET05FX0VWRU5USUQJCQk9IDB4MTkxMCwKKwlXTUlfUE9SVF9BTExPQ0FURURfRVZFTlRJRAkJCT0gMHgxOTExLAorCVdNSV9QT1JUX0RFTEVURURfRVZFTlRJRAkJCT0gMHgxOTEyLAorCVdNSV9MSVNURU5fU1RBUlRFRF9FVkVOVElECQkJPSAweDE5MTQsCisJV01JX1NFQVJDSF9TVEFSVEVEX0VWRU5USUQJCQk9IDB4MTkxNSwKKwlXTUlfRElTQ09WRVJZX1NUQVJURURfRVZFTlRJRAkJCT0gMHgxOTE2LAorCVdNSV9ESVNDT1ZFUllfU1RPUFBFRF9FVkVOVElECQkJPSAweDE5MTcsCisJV01JX1BDUF9TVEFSVEVEX0VWRU5USUQJCQkJPSAweDE5MTgsCisJV01JX1BDUF9TVE9QUEVEX0VWRU5USUQJCQkJPSAweDE5MTksCisJV01JX1BDUF9GQUNUT1JfRVZFTlRJRAkJCQk9IDB4MTkxQSwKKwkvKiBQb3dlciBTYXZlIENvbmZpZ3VyYXRpb24gRXZlbnRzICovCisJV01JX1BTX0RFVl9QUk9GSUxFX0NGR19FVkVOVElECQkJPSAweDE5MUMsCisJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlXTUlfUFNfREVWX0NGR19FVkVOVElECQkJCT0gMHgxOTFELAorCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCisJV01JX1BTX0RFVl9DRkdfUkVBRF9FVkVOVElECQkJPSAweDE5MUUsCisJLyogTm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlXTUlfUFNfTUlEX0NGR19FVkVOVElECQkJCT0gMHgxOTFGLAorCS8qIE5vdCBzdXBwb3J0ZWQgeWV0ICovCisJV01JX1BTX01JRF9DRkdfUkVBRF9FVkVOVElECQkJPSAweDE5MjAsCisJV01JX1JTX0NGR19ET05FX0VWRU5USUQJCQkJPSAweDE5MjEsCisJV01JX0dFVF9ERVRBSUxFRF9SU19SRVNfRVZFTlRJRAkJCT0gMHgxOTIyLAorCVdNSV9BT0FfTUVBU19FVkVOVElECQkJCT0gMHgxOTIzLAorCVdNSV9UT0ZfU0VTU0lPTl9FTkRfRVZFTlRJRAkJCT0gMHgxOTkxLAorCVdNSV9UT0ZfR0VUX0NBUEFCSUxJVElFU19FVkVOVElECQk9IDB4MTk5MiwKKwlXTUlfVE9GX1NFVF9MQ1JfRVZFTlRJRAkJCQk9IDB4MTk5MywKKwlXTUlfVE9GX1NFVF9MQ0lfRVZFTlRJRAkJCQk9IDB4MTk5NCwKKwlXTUlfVE9GX0ZUTV9QRVJfREVTVF9SRVNfRVZFTlRJRAkJPSAweDE5OTUsCisJV01JX1RPRl9DSEFOTkVMX0lORk9fRVZFTlRJRAkJCT0gMHgxOTk2LAorCVdNSV9TRVRfQ0hBTk5FTF9FVkVOVElECQkJCT0gMHg5MDAwLAorCVdNSV9BU1NPQ19SRVFfRVZFTlRJRAkJCQk9IDB4OTAwMSwKKwlXTUlfRUFQT0xfUlhfRVZFTlRJRAkJCQk9IDB4OTAwMiwKKwlXTUlfTUFDX0FERFJfUkVTUF9FVkVOVElECQkJPSAweDkwMDMsCisJV01JX0ZXX1ZFUl9FVkVOVElECQkJCT0gMHg5MDA0LAorCVdNSV9BQ1NfUEFTU0lWRV9TQ0FOX0NPTVBMRVRFX0VWRU5USUQJCT0gMHg5MDA1LAogfTsKIAogLyogRXZlbnRzIGRhdGEgc3RydWN0dXJlcyAqLwpAQCAtOTQzLDEwICsxMDkzLDg1IEBACiAKIC8qIFdNSV9GV19WRVJfRVZFTlRJRCAqLwogc3RydWN0IHdtaV9md192ZXJfZXZlbnQgewotCXU4IG1ham9yOwotCXU4IG1pbm9yOwotCV9fbGUxNiBzdWJtaW5vcjsKLQlfX2xlMTYgYnVpbGQ7CisJLyogRlcgaW1hZ2UgdmVyc2lvbiAqLworCV9fbGUzMiBmd19tYWpvcjsKKwlfX2xlMzIgZndfbWlub3I7CisJX19sZTMyIGZ3X3N1Ym1pbm9yOworCV9fbGUzMiBmd19idWlsZDsKKwkvKiBGVyBpbWFnZSBidWlsZCB0aW1lIHN0YW1wICovCisJX19sZTMyIGhvdXI7CisJX19sZTMyIG1pbnV0ZTsKKwlfX2xlMzIgc2Vjb25kOworCV9fbGUzMiBkYXk7CisJX19sZTMyIG1vbnRoOworCV9fbGUzMiB5ZWFyOworCS8qIEJvb3QgTG9hZGVyIGltYWdlIHZlcnNpb24gKi8KKwlfX2xlMzIgYmxfbWFqb3I7CisJX19sZTMyIGJsX21pbm9yOworCV9fbGUzMiBibF9zdWJtaW5vcjsKKwlfX2xlMzIgYmxfYnVpbGQ7CisJLyogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBGVyBjYXBhYmlsaWVzIGFycmF5ICovCisJdTggZndfY2FwYWJpbGl0aWVzX2xlbjsKKwl1OCByZXNlcnZlZFszXTsKKwkvKiBGVyBjYXBhYmlsaXRpZXMgaW5mbworCSAqIE11c3QgYmUgdGhlIGxhc3QgbWVtYmVyIG9mIHRoZSBzdHJ1Y3QKKwkgKi8KKwlfX2xlMzIgZndfY2FwYWJpbGl0aWVzWzBdOworfSBfX3BhY2tlZDsKKworLyogV01JX0dFVF9SRl9TVEFUVVNfRVZFTlRJRCAqLworZW51bSByZl90eXBlIHsKKwlSRl9VTktOT1dOCT0gMHgwMCwKKwlSRl9NQVJMT04JPSAweDAxLAorCVJGX1NQQVJST1cJPSAweDAyLAorfTsKKworLyogV01JX0dFVF9SRl9TVEFUVVNfRVZFTlRJRCAqLworZW51bSBib2FyZF9maWxlX3JmX3R5cGUgeworCUJGX1JGX01BUkxPTgk9IDB4MDAsCisJQkZfUkZfU1BBUlJPVwk9IDB4MDEsCit9OworCisvKiBXTUlfR0VUX1JGX1NUQVRVU19FVkVOVElEICovCitlbnVtIHJmX3N0YXR1cyB7CisJUkZfT0sJCQk9IDB4MDAsCisJUkZfTk9fQ09NTQkJPSAweDAxLAorCVJGX1dST05HX0JPQVJEX0ZJTEUJPSAweDAyLAorfTsKKworLyogV01JX0dFVF9SRl9TVEFUVVNfRVZFTlRJRCAqLworc3RydWN0IHdtaV9nZXRfcmZfc3RhdHVzX2V2ZW50IHsKKwkvKiBlbnVtIHJmX3R5cGUgKi8KKwlfX2xlMzIgcmZfdHlwZTsKKwkvKiBhdHRhY2hlZCBSRnMgYml0IHZlY3RvciAqLworCV9fbGUzMiBhdHRhY2hlZF9yZl92ZWN0b3I7CisJLyogZW5hYmxlZCBSRnMgYml0IHZlY3RvciAqLworCV9fbGUzMiBlbmFibGVkX3JmX3ZlY3RvcjsKKwkvKiBlbnVtIHJmX3N0YXR1cywgcmVmZXJzIHRvIGVuYWJsZWQgUkZzICovCisJdTggcmZfc3RhdHVzWzMyXTsKKwkvKiBlbnVtIGJvYXJkIGZpbGUgUkYgdHlwZSAqLworCV9fbGUzMiBib2FyZF9maWxlX3JmX3R5cGU7CisJLyogYm9hcmQgZmlsZSBwbGF0Zm9ybSB0eXBlICovCisJX19sZTMyIGJvYXJkX2ZpbGVfcGxhdGZvcm1fdHlwZTsKKwkvKiBib2FyZCBmaWxlIHZlcnNpb24gKi8KKwlfX2xlMzIgYm9hcmRfZmlsZV92ZXJzaW9uOworCV9fbGUzMiByZXNlcnZlZFsyXTsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9HRVRfQkFTRUJBTkRfVFlQRV9FVkVOVElEICovCitlbnVtIGJhc2ViYW5kX3R5cGUgeworCUJBU0VCQU5EX1VOS05PV04JPSAweDAwLAorCUJBU0VCQU5EX1NQQVJST1dfTV9BMAk9IDB4MDMsCisJQkFTRUJBTkRfU1BBUlJPV19NX0ExCT0gMHgwNCwKKwlCQVNFQkFORF9TUEFSUk9XX01fQjAJPSAweDA1LAorCUJBU0VCQU5EX1NQQVJST1dfTV9DMAk9IDB4MDYsCisJQkFTRUJBTkRfU1BBUlJPV19NX0QwCT0gMHgwNywKK307CisKKy8qIFdNSV9HRVRfQkFTRUJBTkRfVFlQRV9FVkVOVElEICovCitzdHJ1Y3Qgd21pX2dldF9iYXNlYmFuZF90eXBlX2V2ZW50IHsKKwkvKiBlbnVtIGJhc2ViYW5kX3R5cGUgKi8KKwlfX2xlMzIgYmFzZWJhbmRfdHlwZTsKIH0gX19wYWNrZWQ7CiAKIC8qIFdNSV9NQUNfQUREUl9SRVNQX0VWRU5USUQgKi8KQEAgLTE0MTAsNCArMTYzNSw1NTMgQEAKIAlfX2xlMzIgc3RhdHVzOwogfSBfX3BhY2tlZDsKIAorI2RlZmluZSBXTUlfTlVNX01DUwkoMTMpCisKKy8qIFJhdGUgc2VhcmNoIHBhcmFtZXRlcnMgY29uZmlndXJhdGlvbiBwZXIgY29ubmVjdGlvbiAqLworc3RydWN0IHdtaV9yc19jZmcgeworCS8qIFRoZSBtYXhpbWFsIGFsbG93ZWQgUEVSIGZvciBlYWNoIE1DUworCSAqIE1DUyB3aWxsIGJlIGNvbnNpZGVyZWQgYXMgZmFpbGVkIGlmIFBFUiBkdXJpbmcgUlMgaXMgaGlnaGVyCisJICovCisJdTggcGVyX3RocmVzaG9sZFtXTUlfTlVNX01DU107CisJLyogTnVtYmVyIG9mIE1QRFVzIGZvciBlYWNoIE1DUworCSAqIHRoaXMgaXMgdGhlIG1pbmltYWwgc3RhdGlzdGljIHJlcXVpcmVkIHRvIG1ha2UgYW4gZWR1Y2F0ZWQKKwkgKiBkZWNpc2lvbgorCSAqLworCXU4IG1pbl9mcmFtZV9jbnRbV01JX05VTV9NQ1NdOworCS8qIHN0b3AgdGhyZXNob2xkIFswLTEwMF0gKi8KKwl1OCBzdG9wX3RoOworCS8qIE1DUzEgc3RvcCB0aHJlc2hvbGQgWzAtMTAwXSAqLworCXU4IG1jczFfZmFpbF90aDsKKwl1OCBtYXhfYmFja19mYWlsdXJlX3RoOworCS8qIERlYnVnIGZlYXR1cmUgZm9yIGRpc2FibGluZyBpbnRlcm5hbCBSUyB0cmlnZ2VyICh3aGljaCBpcworCSAqIGN1cnJlbnRseSB0cmlnZ2VyZWQgYnkgQkYgRG9uZSkKKwkgKi8KKwl1OCBkYmdfZGlzYWJsZV9pbnRlcm5hbF90cmlnZ2VyOworCV9fbGUzMiBiYWNrX2ZhaWx1cmVfbWFzazsKKwlfX2xlMzIgbWNzX2VuX3ZlYzsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9SU19DRkdfQ01ESUQgKi8KK3N0cnVjdCB3bWlfcnNfY2ZnX2NtZCB7CisJLyogY29ubmVjdGlvbiBpZCAqLworCXU4IGNpZDsKKwkvKiBlbmFibGUgb3IgZGlzYWJsZSByYXRlIHNlYXJjaCAqLworCXU4IHJzX2VuYWJsZTsKKwkvKiByYXRlIHNlYXJjaCBjb25maWd1cmF0aW9uICovCisJc3RydWN0IHdtaV9yc19jZmcgcnNfY2ZnOworfSBfX3BhY2tlZDsKKworLyogV01JX1JTX0NGR19ET05FX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfcnNfY2ZnX2RvbmVfZXZlbnQgeworCXU4IGNpZDsKKwkvKiBlbnVtIHdtaV9md19zdGF0dXMgKi8KKwl1OCBzdGF0dXM7CisJdTggcmVzZXJ2ZWRbMl07Cit9IF9fcGFja2VkOworCisvKiBXTUlfR0VUX0RFVEFJTEVEX1JTX1JFU19DTURJRCAqLworc3RydWN0IHdtaV9nZXRfZGV0YWlsZWRfcnNfcmVzX2NtZCB7CisJLyogY29ubmVjdGlvbiBpZCAqLworCXU4IGNpZDsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKKy8qIFJTIHJlc3VsdHMgc3RhdHVzICovCitlbnVtIHdtaV9yc19yZXN1bHRzX3N0YXR1cyB7CisJV01JX1JTX1JFU19WQUxJRAk9IDB4MDAsCisJV01JX1JTX1JFU19JTlZBTElECT0gMHgwMSwKK307CisKKy8qIFJhdGUgc2VhcmNoIHJlc3VsdHMgKi8KK3N0cnVjdCB3bWlfcnNfcmVzdWx0cyB7CisJLyogbnVtYmVyIG9mIHNlbnQgTVBEVXMgKi8KKwl1OCBudW1fb2ZfdHhfcGt0W1dNSV9OVU1fTUNTXTsKKwkvKiBudW1iZXIgb2Ygbm9uLWFja2VkIE1QRFVzICovCisJdTggbnVtX29mX25vbl9hY2tlZF9wa3RbV01JX05VTV9NQ1NdOworCS8qIFJTIHRpbWVzdGFtcCAqLworCV9fbGUzMiB0c2Y7CisJLyogUlMgc2VsZWN0ZWQgTUNTICovCisJdTggbWNzOworfSBfX3BhY2tlZDsKKworLyogV01JX0dFVF9ERVRBSUxFRF9SU19SRVNfRVZFTlRJRCAqLworc3RydWN0IHdtaV9nZXRfZGV0YWlsZWRfcnNfcmVzX2V2ZW50IHsKKwl1OCBjaWQ7CisJLyogZW51bSB3bWlfcnNfcmVzdWx0c19zdGF0dXMgKi8KKwl1OCBzdGF0dXM7CisJLyogZGV0YWlsZWQgcnMgcmVzdWx0cyAqLworCXN0cnVjdCB3bWlfcnNfcmVzdWx0cyByc19yZXN1bHRzOworCXU4IHJlc2VydmVkWzNdOworfSBfX3BhY2tlZDsKKworLyogYnJvYWRjYXN0IGNvbm5lY3Rpb24gSUQgKi8KKyNkZWZpbmUgV01JX0xJTktfTUFJTlRBSU5fQ0ZHX0NJRF9CUk9BRENBU1QJKDB4RkZGRkZGRkYpCisKKy8qIFR5cGVzIHdtaV9saW5rX21haW50YWluX2NmZyBwcmVzZXRzIGZvciBXTUlfTElOS19NQUlOVEFJTl9DRkdfV1JJVEVfQ01EICovCitlbnVtIHdtaV9saW5rX21haW50YWluX2NmZ190eXBlIHsKKwkvKiBBUC9QQ1AgZGVmYXVsdCBub3JtYWwgKG5vbi1GU1QpIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfVFlQRV9ERUZBVUxUX05PUk1BTF9BUAk9IDB4MDAsCisJLyogQVAvUENQICBkZWZhdWx0IEZTVCBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1RZUEVfREVGQVVMVF9GU1RfQVAJPSAweDAxLAorCS8qIFNUQSBkZWZhdWx0IG5vcm1hbCAobm9uLUZTVCkgY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLworCVdNSV9MSU5LX01BSU5UQUlOX0NGR19UWVBFX0RFRkFVTFRfTk9STUFMX1NUQQk9IDB4MDIsCisJLyogU1RBIGRlZmF1bHQgRlNUIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwlXTUlfTElOS19NQUlOVEFJTl9DRkdfVFlQRV9ERUZBVUxUX0ZTVF9TVEEJPSAweDAzLAorCS8qIGN1c3RvbSBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1RZUEVfQ1VTVE9NCQk9IDB4MDQsCisJLyogbnVtYmVyIG9mIGRlZmluZWQgY29uZmlndXJhdGlvbiB0eXBlcyAqLworCVdNSV9MSU5LX01BSU5UQUlOX0NGR19UWVBFU19OVU0JCQk9IDB4MDUsCit9OworCisvKiBSZXNwb25zZSBzdGF0dXMgY29kZXMgZm9yIFdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURS9SRUFEIGNvbW1hbmRzICovCitlbnVtIHdtaV9saW5rX21haW50YWluX2NmZ19yZXNwb25zZV9zdGF0dXMgeworCS8qIFdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURS9SRUFEIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGFjY29tcGxpc2hlZAorCSAqLworCVdNSV9MSU5LX01BSU5UQUlOX0NGR19SRVNQT05TRV9TVEFUVVNfT0sJCT0gMHgwMCwKKwkvKiBFUlJPUiBkdWUgdG8gYmFkIGFyZ3VtZW50IGluIFdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURS9SRUFECisJICogY29tbWFuZCByZXF1ZXN0CisJICovCisJV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1JFU1BPTlNFX1NUQVRVU19CQURfQVJHVU1FTlQJPSAweDAxLAorfTsKKworLyogTGluayBMb3NzIGFuZCBLZWVwIEFsaXZlIGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdCB3bWlfbGlua19tYWludGFpbl9jZmcgeworCS8qIGxpbmtfbG9zc19lbmFibGVfZGV0ZWN0b3JzX3ZlYyAqLworCV9fbGUzMiBsaW5rX2xvc3NfZW5hYmxlX2RldGVjdG9yc192ZWM7CisJLyogZGV0ZWN0b3JzIGNoZWNrIHBlcmlvZCB1c2VjICovCisJX19sZTMyIGNoZWNrX2xpbmtfbG9zc19wZXJpb2RfdXNlYzsKKwkvKiBtYXggYWxsb3dlZCB0eCBhZ2VpbmcgKi8KKwlfX2xlMzIgdHhfYWdlaW5nX3RocmVzaG9sZF91c2VjOworCS8qIGtlZXAgYWxpdmUgcGVyaW9kIGZvciBoaWdoIFNOUiAqLworCV9fbGUzMiBrZWVwX2FsaXZlX3BlcmlvZF91c2VjX2hpZ2hfc25yOworCS8qIGtlZXAgYWxpdmUgcGVyaW9kIGZvciBsb3cgU05SICovCisJX19sZTMyIGtlZXBfYWxpdmVfcGVyaW9kX3VzZWNfbG93X3NucjsKKwkvKiBsb3dlciBzbnIgbGltaXQgZm9yIGtlZXAgYWxpdmUgcGVyaW9kIHVwZGF0ZSAqLworCV9fbGUzMiBrZWVwX2FsaXZlX3Nucl90aHJlc2hvbGRfbG93X2RiOworCS8qIHVwcGVyIHNuciBsaW1pdCBmb3Iga2VlcCBhbGl2ZSBwZXJpb2QgdXBkYXRlICovCisJX19sZTMyIGtlZXBfYWxpdmVfc25yX3RocmVzaG9sZF9oaWdoX2RiOworCS8qIG51bSBvZiBzdWNjZXNzaXZlIGJhZCBiY29ucyBjYXVzaW5nIGxpbmstbG9zcyAqLworCV9fbGUzMiBiYWRfYmVhY29uc19udW1fdGhyZXNob2xkOworCS8qIFNOUiBsaW1pdCBmb3IgYmFkX2JlYWNvbnNfZGV0ZWN0b3IgKi8KKwlfX2xlMzIgYmFkX2JlYWNvbnNfc25yX3RocmVzaG9sZF9kYjsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURV9DTURJRCAqLworc3RydWN0IHdtaV9saW5rX21haW50YWluX2NmZ193cml0ZV9jbWQgeworCS8qIGVudW0gd21pX2xpbmtfbWFpbnRhaW5fY2ZnX3R5cGVfZSAtIHR5cGUgb2YgcmVxdWVzdGVkIGRlZmF1bHQKKwkgKiBjb25maWd1cmF0aW9uIHRvIGJlIGFwcGxpZWQKKwkgKi8KKwlfX2xlMzIgY2ZnX3R5cGU7CisJLyogcmVxdWVzdGVkIGNvbm5lY3Rpb24gSUQgb3IgV01JX0xJTktfTUFJTlRBSU5fQ0ZHX0NJRF9CUk9BRENBU1QgKi8KKwlfX2xlMzIgY2lkOworCS8qIGN1c3RvbSBjb25maWd1cmF0aW9uIHNldHRpbmdzIHRvIGJlIGFwcGxpZWQgKHJlbGV2YW50IG9ubHkgaWYKKwkgKiBjZmdfdHlwZT09V01JX0xJTktfTUFJTlRBSU5fQ0ZHX1RZUEVfQ1VTVE9NKQorCSAqLworCXN0cnVjdCB3bWlfbGlua19tYWludGFpbl9jZmcgbG1fY2ZnOworfSBfX3BhY2tlZDsKKworLyogV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1JFQURfQ01ESUQgKi8KK3N0cnVjdCB3bWlfbGlua19tYWludGFpbl9jZmdfcmVhZF9jbWQgeworCS8qIGNvbm5lY3Rpb24gSUQgd2hpY2ggY29uZmlndXJhdGlvbiBzZXR0aW5ncyBhcmUgcmVxdWVzdGVkICovCisJX19sZTMyIGNpZDsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9MSU5LX01BSU5UQUlOX0NGR19XUklURV9ET05FX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfbGlua19tYWludGFpbl9jZmdfd3JpdGVfZG9uZV9ldmVudCB7CisJLyogcmVxdWVzdGVkIGNvbm5lY3Rpb24gSUQgKi8KKwlfX2xlMzIgY2lkOworCS8qIHdtaV9saW5rX21haW50YWluX2NmZ19yZXNwb25zZV9zdGF0dXNfZSAtIHdyaXRlIHN0YXR1cyAqLworCV9fbGUzMiBzdGF0dXM7Cit9IF9fcGFja2VkOworCisvKiBcV01JX0xJTktfTUFJTlRBSU5fQ0ZHX1JFQURfRE9ORV9FVkVOVCAqLworc3RydWN0IHdtaV9saW5rX21haW50YWluX2NmZ19yZWFkX2RvbmVfZXZlbnQgeworCS8qIHJlcXVlc3RlZCBjb25uZWN0aW9uIElEICovCisJX19sZTMyIGNpZDsKKwkvKiB3bWlfbGlua19tYWludGFpbl9jZmdfcmVzcG9uc2Vfc3RhdHVzX2UgLSByZWFkIHN0YXR1cyAqLworCV9fbGUzMiBzdGF0dXM7CisJLyogUmV0cmlldmVkIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KKwlzdHJ1Y3Qgd21pX2xpbmtfbWFpbnRhaW5fY2ZnIGxtX2NmZzsKK30gX19wYWNrZWQ7CisKK2VudW0gd21pX3RyYWZmaWNfZGVmZXJyYWxfc3RhdHVzIHsKKwlXTUlfVFJBRkZJQ19ERUZFUlJBTF9BUFBST1ZFRAk9IDB4MCwKKwlXTUlfVFJBRkZJQ19ERUZFUlJBTF9SRUpFQ1RFRAk9IDB4MSwKK307CisKKy8qIFdNSV9UUkFGRklDX0RFRkVSUkFMX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfdHJhZmZpY19kZWZlcnJhbF9ldmVudCB7CisJLyogZW51bSB3bWlfdHJhZmZpY19kZWZlcnJhbF9zdGF0dXNfZSAqLworCXU4IHN0YXR1czsKK30gX19wYWNrZWQ7CisKK2VudW0gd21pX3RyYWZmaWNfcmVzdW1lX3N0YXR1cyB7CisJV01JX1RSQUZGSUNfUkVTVU1FX1NVQ0NFU1MJPSAweDAsCisJV01JX1RSQUZGSUNfUkVTVU1FX0ZBSUxFRAk9IDB4MSwKK307CisKKy8qIFdNSV9UUkFGRklDX1JFU1VNRV9FVkVOVElEICovCitzdHJ1Y3Qgd21pX3RyYWZmaWNfcmVzdW1lX2V2ZW50IHsKKwkvKiBlbnVtIHdtaV90cmFmZmljX3Jlc3VtZV9zdGF0dXNfZSAqLworCXU4IHN0YXR1czsKK30gX19wYWNrZWQ7CisKKy8qIFBvd2VyIFNhdmUgY29tbWFuZCBjb21wbGV0aW9uIHN0YXR1cyBjb2RlcyAqLworZW51bSB3bWlfcHNfY2ZnX2NtZF9zdGF0dXMgeworCVdNSV9QU19DRkdfQ01EX1NUQVRVU19TVUNDRVNTCT0gMHgwMCwKKwlXTUlfUFNfQ0ZHX0NNRF9TVEFUVVNfQkFEX1BBUkFNCT0gMHgwMSwKKwkvKiBvdGhlciBlcnJvciAqLworCVdNSV9QU19DRkdfQ01EX1NUQVRVU19FUlJPUgk9IDB4MDIsCit9OworCisvKiBEZXZpY2UgUG93ZXIgU2F2ZSBQcm9maWxlcyAqLworZW51bSB3bWlfcHNfcHJvZmlsZV90eXBlIHsKKwlXTUlfUFNfUFJPRklMRV9UWVBFX0RFRkFVTFQJCT0gMHgwMCwKKwlXTUlfUFNfUFJPRklMRV9UWVBFX1BTX0RJU0FCTEVECQk9IDB4MDEsCisJV01JX1BTX1BST0ZJTEVfVFlQRV9NQVhfUFMJCT0gMHgwMiwKKwlXTUlfUFNfUFJPRklMRV9UWVBFX0xPV19MQVRFTkNZX1BTCT0gMHgwMywKK307CisKKy8qIFdNSV9QU19ERVZfUFJPRklMRV9DRkdfQ01ESUQKKyAqCisgKiBQb3dlciBzYXZlIHByb2ZpbGUgdG8gYmUgdXNlZCBieSB0aGUgZGV2aWNlCisgKgorICogUmV0dXJuZWQgZXZlbnQ6CisgKiAtIFdNSV9QU19ERVZfUFJPRklMRV9DRkdfRVZFTlRJRAorICovCitzdHJ1Y3Qgd21pX3BzX2Rldl9wcm9maWxlX2NmZ19jbWQgeworCS8qIHdtaV9wc19wcm9maWxlX3R5cGVfZSAqLworCXU4IHBzX3Byb2ZpbGU7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfREVWX1BST0ZJTEVfQ0ZHX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfcHNfZGV2X3Byb2ZpbGVfY2ZnX2V2ZW50IHsKKwkvKiB3bWlfcHNfY2ZnX2NtZF9zdGF0dXNfZSAqLworCV9fbGUzMiBzdGF0dXM7Cit9IF9fcGFja2VkOworCitlbnVtIHdtaV9wc19sZXZlbCB7CisJV01JX1BTX0xFVkVMX0RFRVBfU0xFRVAJCT0gMHgwMCwKKwlXTUlfUFNfTEVWRUxfU0hBTExPV19TTEVFUAk9IDB4MDEsCisJLyogYXdha2UgPSBhbGwgUFMgbWVjaGFuaXNtcyBhcmUgZGlzYWJsZWQgKi8KKwlXTUlfUFNfTEVWRUxfQVdBS0UJCT0gMHgwMiwKK307CisKK2VudW0gd21pX3BzX2RlZXBfc2xlZXBfY2xrX2xldmVsIHsKKwkvKiAzM2sgKi8KKwlXTUlfUFNfREVFUF9TTEVFUF9DTEtfTEVWRUxfUlRDCQk9IDB4MDAsCisJLyogMTBrICovCisJV01JX1BTX0RFRVBfU0xFRVBfQ0xLX0xFVkVMX09TQwkJPSAweDAxLAorCS8qIEBSVEMgTG93IGxhdGVuY3kgKi8KKwlXTUlfUFNfREVFUF9TTEVFUF9DTEtfTEVWRUxfUlRDX0xUCT0gMHgwMiwKKwlXTUlfUFNfREVFUF9TTEVFUF9DTEtfTEVWRUxfWFRBTAk9IDB4MDMsCisJV01JX1BTX0RFRVBfU0xFRVBfQ0xLX0xFVkVMX1NZU0NMSwk9IDB4MDQsCisJLyogTm90IEFwcGxpY2FibGUgKi8KKwlXTUlfUFNfREVFUF9TTEVFUF9DTEtfTEVWRUxfTl9BCQk9IDB4RkYsCit9OworCisvKiBSZXNwb25zZSBieSB0aGUgRlcgdG8gYSBEMyBlbnRyeSByZXF1ZXN0ICovCitlbnVtIHdtaV9wc19kM19yZXNwX3BvbGljeSB7CisJV01JX1BTX0QzX1JFU1BfUE9MSUNZX0RFRkFVTFQJPSAweDAwLAorCS8qIGRlYnVnIC1EMyByZXEgaXMgYWx3YXlzIGRlbmllZCAqLworCVdNSV9QU19EM19SRVNQX1BPTElDWV9ERU5JRUQJPSAweDAxLAorCS8qIGRlYnVnIC1EMyByZXEgaXMgYWx3YXlzIGFwcHJvdmVkICovCisJV01JX1BTX0QzX1JFU1BfUE9MSUNZX0FQUFJPVkVECT0gMHgwMiwKK307CisKKy8qIERldmljZSBjb21tb24gcG93ZXIgc2F2ZSBjb25maWd1cmF0aW9ucyAqLworc3RydWN0IHdtaV9wc19kZXZfY2ZnIHsKKwkvKiBsb3dlc3QgbGV2ZWwgb2YgUFMgYWxsb3dlZCB3aGlsZSB1bmFzc29jaWF0ZWQsIGVudW0gd21pX3BzX2xldmVsX2UKKwkgKi8KKwl1OCBwc191bmFzc29jX21pbl9sZXZlbDsKKwkvKiBsb3dlc3QgZGVlcCBzbGVlcCBjbG9jayBsZXZlbCB3aGlsZSBub25hc3NvYywgZW51bQorCSAqIHdtaV9wc19kZWVwX3NsZWVwX2Nsa19sZXZlbF9lCisJICovCisJdTggcHNfdW5hc3NvY19kZWVwX3NsZWVwX21pbl9sZXZlbDsKKwkvKiBsb3dlc3QgbGV2ZWwgb2YgUFMgYWxsb3dlZCB3aGlsZSBhc3NvY2lhdGVkLCBlbnVtIHdtaV9wc19sZXZlbF9lICovCisJdTggcHNfYXNzb2NfbWluX2xldmVsOworCS8qIGxvd2VzdCBkZWVwIHNsZWVwIGNsb2NrIGxldmVsIHdoaWxlIGFzc29jLCBlbnVtCisJICogd21pX3BzX2RlZXBfc2xlZXBfY2xrX2xldmVsX2UKKwkgKi8KKwl1OCBwc19hc3NvY19kZWVwX3NsZWVwX21pbl9sZXZlbDsKKwkvKiBlbnVtIHdtaV9wc19kZWVwX3NsZWVwX2Nsa19sZXZlbF9lICovCisJdTggcHNfYXNzb2NfbG93X2xhdGVuY3lfZHNfbWluX2xldmVsOworCS8qIGVudW0gd21pX3BzX2QzX3Jlc3BfcG9saWN5X2UgKi8KKwl1OCBwc19EM19yZXNwb25zZV9wb2xpY3k7CisJLyogQk9PTCAqLworCXU4IHBzX0QzX3BtX3BtZV9lbmFibGVkOworCS8qIEJPT0wgKi8KKwl1OCBwc19oYWxwX2VuYWJsZTsKKwl1OCBwc19kZWVwX3NsZWVwX2VudGVyX3RocmVzaF9tc2VjOworCS8qIEJPT0wgKi8KKwl1OCBwc192b2x0YWdlX3NjYWxpbmdfZW47Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfREVWX0NGR19DTURJRAorICoKKyAqIENvbmZpZ3VyZSBjb21tb24gUG93ZXIgU2F2ZSBwYXJhbWV0ZXJzIG9mIHRoZSBkZXZpY2UgYW5kIGFsbCBNSURzLgorICoKKyAqIFJldHVybmVkIGV2ZW50OgorICogLSBXTUlfUFNfREVWX0NGR19FVkVOVElECisgKi8KK3N0cnVjdCB3bWlfcHNfZGV2X2NmZ19jbWQgeworCS8qIERldmljZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24gdG8gYmUgYXBwbGllZCAqLworCXN0cnVjdCB3bWlfcHNfZGV2X2NmZyBwc19kZXZfY2ZnOworCS8qIGFsaWdubWVudCB0byAzMmIgKi8KKwl1OCByZXNlcnZlZFsyXTsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9QU19ERVZfQ0ZHX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfcHNfZGV2X2NmZ19ldmVudCB7CisJLyogd21pX3BzX2NmZ19jbWRfc3RhdHVzX2UgKi8KKwlfX2xlMzIgc3RhdHVzOworfSBfX3BhY2tlZDsKKworLyogV01JX1BTX0RFVl9DRkdfUkVBRF9DTURJRAorICoKKyAqIHJlcXVlc3QgdG8gcmV0cmlldmUgIGRldmljZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24KKyAqIChXTUlfUFNfREVWX0NGR19DTUQgcGFyYW1zKQorICoKKyAqIFJldHVybmVkIGV2ZW50OgorICogLSBXTUlfUFNfREVWX0NGR19SRUFEX0VWRU5USUQKKyAqLworc3RydWN0IHdtaV9wc19kZXZfY2ZnX3JlYWRfY21kIHsKKwlfX2xlMzIgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfREVWX0NGR19SRUFEX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfcHNfZGV2X2NmZ19yZWFkX2V2ZW50IHsKKwkvKiB3bWlfcHNfY2ZnX2NtZF9zdGF0dXNfZSAqLworCV9fbGUzMiBzdGF0dXM7CisJLyogUmV0cmlldmVkIGRldmljZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24gKFdNSV9QU19ERVZfQ0ZHX0NNRAorCSAqIHBhcmFtcykKKwkgKi8KKwlzdHJ1Y3Qgd21pX3BzX2Rldl9jZmcgZGV2X3BzX2NmZzsKKwkvKiBhbGlnbm1lbnQgdG8gMzJiICovCisJdTggcmVzZXJ2ZWRbMl07Cit9IF9fcGFja2VkOworCisvKiBQZXIgTWFjIFBvd2VyIFNhdmUgY29uZmlndXJhdGlvbnMgKi8KK3N0cnVjdCB3bWlfcHNfbWlkX2NmZyB7CisJLyogTG93IHBvd2VyIFJYIGluIEJUSSBpcyBlbmFibGVkLCBCT09MICovCisJdTggYmVhY29uX2xwcnhfZW5hYmxlOworCS8qIFN5bmMgdG8gc2VjdG9yIElEIGVuYWJsZWQsIEJPT0wgKi8KKwl1OCBiZWFjb25fc3luY190b19zZWN0b3JJZF9lbmFibGU7CisJLyogTG93IHBvd2VyIFJYIGluIERUSSBpcyBlbmFibGVkLCBCT09MICovCisJdTggZnJhbWVfZXhjaGFuZ2VfbHByeF9lbmFibGU7CisJLyogU2xlZXAgQ3ljbGUgd2hpbGUgaW4gc2NoZWR1bGVkIFBTLCAxLTMxICovCisJdTggc2NoZWR1bGVkX3NsZWVwX2N5Y2xlX3BvdzI7CisJLyogU3RheSBBd2FrZSBmb3IgayBCSXMgZXZlcnkgKHNsZWVwX2N5Y2xlIC0gaykgQklzLCAxLTMxICovCisJdTggc2NoZWR1bGVkX251bV9vZl9hd2FrZV9iaXM7CisJdTggYW1fdG9fdHJhZmZpY19sb2FkX3RocmVzaF9tYnA7CisJdTggdHJhZmZpY190b19hbV9sb2FkX3RocmVzaF9tYnBzOworCXU4IHRyYWZmaWNfdG9fYW1fbnVtX29mX25vX3RyYWZmaWNfYmlzOworCS8qIEJPT0wgKi8KKwl1OCBjb250aW51b3VzX3RyYWZmaWNfcHNtOworCV9fbGUxNiBub190cmFmZmljX3RvX21pbl91c2VjOworCV9fbGUxNiBub190cmFmZmljX3RvX21heF91c2VjOworCV9fbGUxNiBzbm9vemluZ19zbGVlcF9pbnRlcnZhbF9taWxpc2VjOworCXU4IG1heF9ub19kYXRhX2F3YWtlX2V2ZW50czsKKwkvKiBUcmlnZ2VyIFdFQiBhZnRlciBrIGZhaWxlZCBiZWFjb25zICovCisJdTggbnVtX29mX2ZhaWxlZF9iZWFjb25zX3J4X3RvX3RyaWdnZXJfd2ViOworCS8qIFRyaWdnZXIgQkYgYWZ0ZXIgayBmYWlsZWQgYmVhY29ucyAqLworCXU4IG51bV9vZl9mYWlsZWRfYmVhY29uc19yeF90b190cmlnZ2VyX2JmOworCS8qIFRyaWdnZXIgU09CIGFmdGVyIGsgc3VjY2Vzc2Z1bCBiZWFjb25zICovCisJdTggbnVtX29mX3N1Y2Nlc3NmdWxfYmVhY29uc19yeF90b190cmlnZ2VyX3NvYjsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9QU19NSURfQ0ZHX0NNRElECisgKgorICogQ29uZmlndXJlIFBvd2VyIFNhdmUgcGFyYW1ldGVycyBvZiBhIHNwZWNpZmljIE1JRC4KKyAqIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHJlbGV2YW50IGZvciB0aGUgc3BlY2lmaWMgQlNTIHRoaXMgTUlEIGJlbG9uZ3MgdG8uCisgKgorICogUmV0dXJuZWQgZXZlbnQ6CisgKiAtIFdNSV9QU19NSURfQ0ZHX0VWRU5USUQKKyAqLworc3RydWN0IHdtaV9wc19taWRfY2ZnX2NtZCB7CisJLyogTUFDIElEICovCisJdTggbWlkOworCS8qIG1pZCBQUyBjb25maWd1cmF0aW9uIHRvIGJlIGFwcGxpZWQgKi8KKwlzdHJ1Y3Qgd21pX3BzX21pZF9jZmcgcHNfbWlkX2NmZzsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9QU19NSURfQ0ZHX0VWRU5USUQgKi8KK3N0cnVjdCB3bWlfcHNfbWlkX2NmZ19ldmVudCB7CisJLyogTUFDIElEICovCisJdTggbWlkOworCS8qIGFsaWdubWVudCB0byAzMmIgKi8KKwl1OCByZXNlcnZlZFszXTsKKwkvKiB3bWlfcHNfY2ZnX2NtZF9zdGF0dXNfZSAqLworCV9fbGUzMiBzdGF0dXM7Cit9IF9fcGFja2VkOworCisvKiBXTUlfUFNfTUlEX0NGR19SRUFEX0NNRElECisgKgorICogcmVxdWVzdCB0byByZXRyaWV2ZSBQb3dlciBTYXZlIGNvbmZpZ3VyYXRpb24gb2YgbWlkCisgKiAoV01JX1BTX01JRF9DRkdfQ01EIHBhcmFtcykKKyAqCisgKiBSZXR1cm5lZCBldmVudDoKKyAqIC0gV01JX1BTX01JRF9DRkdfUkVBRF9FVkVOVElECisgKi8KK3N0cnVjdCB3bWlfcHNfbWlkX2NmZ19yZWFkX2NtZCB7CisJLyogTUFDIElEICovCisJdTggbWlkOworCS8qIGFsaWdubWVudCB0byAzMmIgKi8KKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKKy8qIFdNSV9QU19NSURfQ0ZHX1JFQURfRVZFTlRJRCAqLworc3RydWN0IHdtaV9wc19taWRfY2ZnX3JlYWRfZXZlbnQgeworCS8qIE1BQyBJRCAqLworCXU4IG1pZDsKKwkvKiBSZXRyaWV2ZWQgTUlEIFBvd2VyIFNhdmUgY29uZmlndXJhdGlvbihXTUlfUFNfTUlEX0NGR19DTUQgcGFyYW1zKSAqLworCXN0cnVjdCB3bWlfcHNfbWlkX2NmZyBtaWRfcHNfY2ZnOworCS8qIHdtaV9wc19jZmdfY21kX3N0YXR1c19lICovCisJX19sZTMyIHN0YXR1czsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgV01JX0FPQV9NQVhfREFUQV9TSVpFCSgxMjgpCisKK2VudW0gd21pX2FvYV9tZWFzX3N0YXR1cyB7CisJV01JX0FPQV9NRUFTX1NVQ0NFU1MJCT0gMHgwMCwKKwlXTUlfQU9BX01FQVNfUEVFUl9JTkNBUEFCTEUJPSAweDAxLAorCVdNSV9BT0FfTUVBU19GQUlMVVJFCQk9IDB4MDIsCit9OworCisvKiBXTUlfQU9BX01FQVNfRVZFTlRJRCAqLworc3RydWN0IHdtaV9hb2FfbWVhc19ldmVudCB7CisJdTggbWFjX2FkZHJbV01JX01BQ19MRU5dOworCS8qIGNoYW5uZWxzIElEczoKKwkgKiAwIC0gNTgzMjAgTUh6CisJICogMSAtIDYwNDgwIE1IegorCSAqIDIgLSA2MjY0MCBNSHoKKwkgKi8KKwl1OCBjaGFubmVsOworCS8qIGVudW0gd21pX2FvYV9tZWFzX3R5cGUgKi8KKwl1OCBhb2FfbWVhc190eXBlOworCS8qIE1lYXN1cm1lbnRzIGFyZSBmcm9tIFJGcywgZGVmaW5lZCBieSB0aGUgbWFzayAqLworCV9fbGUzMiBtZWFzX3JmX21hc2s7CisJLyogZW51bSB3bWlfYW9hX21lYXNfc3RhdHVzICovCisJdTggbWVhc19zdGF0dXM7CisJdTggcmVzZXJ2ZWQ7CisJLyogTGVuZ3RoIG9mIG1lYXNfZGF0YSBpbiBieXRlcyAqLworCV9fbGUxNiBsZW5ndGg7CisJdTggbWVhc19kYXRhW1dNSV9BT0FfTUFYX0RBVEFfU0laRV07Cit9IF9fcGFja2VkOworCisvKiBXTUlfVE9GX0dFVF9DQVBBQklMSVRJRVNfRVZFTlRJRCAqLworc3RydWN0IHdtaV90b2ZfZ2V0X2NhcGFiaWxpdGllc19ldmVudCB7CisJdTggZnRtX2NhcGFiaWxpdHk7CisJLyogbWF4aW11bSBzdXBwb3J0ZWQgbnVtYmVyIG9mIGRlc3RpbmF0aW9uIHRvIHN0YXJ0IFRPRiAqLworCXU4IG1heF9udW1fb2ZfZGVzdDsKKwkvKiBtYXhpbXVtIHN1cHBvcnRlZCBudW1iZXIgb2YgbWVhc3VyZW1lbnRzIHBlciBidXJzdCAqLworCXU4IG1heF9udW1fb2ZfbWVhc19wZXJfYnVyc3Q7CisJdTggcmVzZXJ2ZWQ7CisJLyogbWF4aW11bSBzdXBwb3J0ZWQgbXVsdGkgYnVyc3RzICovCisJX19sZTE2IG1heF9tdWx0aV9idXJzdHNfc2Vzc2lvbnM7CisJLyogbWF4aW11bSBzdXBwb3J0ZWQgRlRNIGJ1cnN0IGR1cmF0aW9uICwgd21pX3RvZl9idXJzdF9kdXJhdGlvbl9lICovCisJX19sZTE2IG1heF9mdG1fYnVyc3RfZHVyYXRpb247CisJLyogQU9BIHN1cHBvcnRlZCB0eXBlcyAqLworCV9fbGUzMiBhb2Ffc3VwcG9ydGVkX3R5cGVzOworfSBfX3BhY2tlZDsKKworZW51bSB3bWlfdG9mX3Nlc3Npb25fZW5kX3N0YXR1cyB7CisJV01JX1RPRl9TRVNTSU9OX0VORF9OT19FUlJPUgkJPSAweDAwLAorCVdNSV9UT0ZfU0VTU0lPTl9FTkRfRkFJTAkJPSAweDAxLAorCVdNSV9UT0ZfU0VTU0lPTl9FTkRfUEFSQU1TX0VSUk9SCT0gMHgwMiwKKwlXTUlfVE9GX1NFU1NJT05fRU5EX0FCT1JURUQJCT0gMHgwMywKK307CisKKy8qIFdNSV9UT0ZfU0VTU0lPTl9FTkRfRVZFTlRJRCAqLworc3RydWN0IHdtaV90b2Zfc2Vzc2lvbl9lbmRfZXZlbnQgeworCS8qIEZUTSBzZXNzaW9uIElEICovCisJX19sZTMyIHNlc3Npb25faWQ7CisJLyogd21pX3RvZl9zZXNzaW9uX2VuZF9zdGF0dXNfZSAqLworCXU4IHN0YXR1czsKKwl1OCByZXNlcnZlZFszXTsKK30gX19wYWNrZWQ7CisKKy8qIFJlc3BvbmRlciBGVE0gUmVzdWx0cyAqLworc3RydWN0IHdtaV9yZXNwb25kZXJfZnRtX3JlcyB7CisJdTggdDFbNl07CisJdTggdDJbNl07CisJdTggdDNbNl07CisJdTggdDRbNl07CisJX19sZTE2IHRvZF9lcnI7CisJX19sZTE2IHRvYV9lcnI7CisJX19sZTE2IHRvZF9lcnJfaW5pdGlhdG9yOworCV9fbGUxNiB0b2FfZXJyX2luaXRpYXRvcjsKK30gX19wYWNrZWQ7CisKK2VudW0gd21pX3RvZl9mdG1fcGVyX2Rlc3RfcmVzX3N0YXR1cyB7CisJV01JX1BFUl9ERVNUX1JFU19OT19FUlJPUgkJPSAweDAwLAorCVdNSV9QRVJfREVTVF9SRVNfVFhfUlhfRkFJTAkJPSAweDAxLAorCVdNSV9QRVJfREVTVF9SRVNfUEFSQU1fRE9OVF9NQVRDSAk9IDB4MDIsCit9OworCitlbnVtIHdtaV90b2ZfZnRtX3Blcl9kZXN0X3Jlc19mbGFncyB7CisJV01JX1BFUl9ERVNUX1JFU19SRVFfU1RBUlQJCT0gMHgwMSwKKwlXTUlfUEVSX0RFU1RfUkVTX0JVUlNUX1JFUE9SVF9FTkQJPSAweDAyLAorCVdNSV9QRVJfREVTVF9SRVNfUkVRX0VORAkJPSAweDA0LAorCVdNSV9QRVJfREVTVF9SRVNfUEFSQU1fVVBEQVRFCQk9IDB4MDgsCit9OworCisvKiBXTUlfVE9GX0ZUTV9QRVJfREVTVF9SRVNfRVZFTlRJRCAqLworc3RydWN0IHdtaV90b2ZfZnRtX3Blcl9kZXN0X3Jlc19ldmVudCB7CisJLyogRlRNIHNlc3Npb24gSUQgKi8KKwlfX2xlMzIgc2Vzc2lvbl9pZDsKKwkvKiBkZXN0aW5hdGlvbiBNQUMgYWRkcmVzcyAqLworCXU4IGRzdF9tYWNbV01JX01BQ19MRU5dOworCS8qIHdtaV90b2ZfZnRtX3Blcl9kZXN0X3Jlc19mbGFnc19lICovCisJdTggZmxhZ3M7CisJLyogd21pX3RvZl9mdG1fcGVyX2Rlc3RfcmVzX3N0YXR1c19lICovCisJdTggc3RhdHVzOworCS8qIHJlc3BvbmRlciBBU0FQICovCisJdTggcmVzcG9uZGVyX2FzYXA7CisJLyogcmVzcG9uZGVyIG51bWJlciBvZiBGVE0gcGVyIGJ1cnN0ICovCisJdTggcmVzcG9uZGVyX251bV9mdG1fcGVyX2J1cnN0OworCS8qIHJlc3BvbmRlciBudW1iZXIgb2YgRlRNIGJ1cnN0IGV4cG9uZW50ICovCisJdTggcmVzcG9uZGVyX251bV9mdG1fYnVyc3RzX2V4cDsKKwkvKiByZXNwb25kZXIgYnVyc3QgZHVyYXRpb24gLHdtaV90b2ZfYnVyc3RfZHVyYXRpb25fZSAqLworCXU4IHJlc3BvbmRlcl9idXJzdF9kdXJhdGlvbjsKKwkvKiByZXNwb25kZXIgYnVyc3QgcGVyaW9kLCBpbmRpY2F0ZSBpbnRlcnZhbCBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZQorCSAqIGJ1cnN0IGluc3RhbmNlcywgaW4gdW5pdHMgb2YgMTAwIG1zCisJICovCisJX19sZTE2IHJlc3BvbmRlcl9idXJzdF9wZXJpb2Q7CisJLyogcmVjZWl2ZSBidXJzdCBjb3VudGVyICovCisJX19sZTE2IGJ1cnN0c19jbnQ7CisJLyogdHNmIG9mIHJlc3BvbmRlciBzdGFydCBidXJzdCAqLworCV9fbGUzMiB0c2Zfc3luYzsKKwkvKiBhY3R1YWwgcmVjZWl2ZWQgZnRtIHBlciBidXJzdCAqLworCXU4IGFjdHVhbF9mdG1fcGVyX2J1cnN0OworCXU4IHJlc2VydmVkMFs3XTsKKwlzdHJ1Y3Qgd21pX3Jlc3BvbmRlcl9mdG1fcmVzIHJlc3BvbmRlcl9mdG1fcmVzWzBdOworfSBfX3BhY2tlZDsKKworZW51bSB3bWlfdG9mX2NoYW5uZWxfaW5mb190eXBlIHsKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19BT0EJCT0gMHgwMCwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19MQ0kJCT0gMHgwMSwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19MQ1IJCT0gMHgwMiwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19WRU5ET1JfU1BFQ0lGSUMJPSAweDAzLAorCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX0NJUgkJPSAweDA0LAorCVdNSV9UT0ZfQ0hBTk5FTF9JTkZPX1JTU0kJCT0gMHgwNSwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19TTlIJCT0gMHgwNiwKKwlXTUlfVE9GX0NIQU5ORUxfSU5GT19ERUJVRwkJPSAweDA3LAorfTsKKworLyogV01JX1RPRl9DSEFOTkVMX0lORk9fRVZFTlRJRCAqLworc3RydWN0IHdtaV90b2ZfY2hhbm5lbF9pbmZvX2V2ZW50IHsKKwkvKiBGVE0gc2Vzc2lvbiBJRCAqLworCV9fbGUzMiBzZXNzaW9uX2lkOworCS8qIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzICovCisJdTggZHN0X21hY1tXTUlfTUFDX0xFTl07CisJLyogd21pX3RvZl9jaGFubmVsX2luZm9fdHlwZV9lICovCisJdTggdHlwZTsKKwkvKiBkYXRhIHJlcG9ydCBsZW5ndGggKi8KKwl1OCBsZW47CisJLyogZGF0YSByZXBvcnQgcGF5bG9hZCAqLworCXU4IHJlcG9ydFswXTsKK30gX19wYWNrZWQ7CisKICNlbmRpZiAvKiBfX1dJTE9DSVRZX1dNSV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2I0My9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9iNDMvZGVidWdmcy5jCmluZGV4IGI0YmNkOTQuLjc3MDQ2MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2I0My9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYjQzL2RlYnVnZnMuYwpAQCAtNTI0LDcgKzUyNCw4IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlkZm9wcyA9IGNvbnRhaW5lcl9vZihmaWxlLT5mX29wLCBzdHJ1Y3QgYjQzX2RlYnVnZnNfZm9wcywgZm9wcyk7CisJZGZvcHMgPSBjb250YWluZXJfb2YoZGVidWdmc19yZWFsX2ZvcHMoZmlsZSksCisJCQkgICAgIHN0cnVjdCBiNDNfZGVidWdmc19mb3BzLCBmb3BzKTsKIAlpZiAoIWRmb3BzLT5yZWFkKSB7CiAJCWVyciA9IC1FTk9TWVM7CiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTU4NSw3ICs1ODYsOCBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCi0JZGZvcHMgPSBjb250YWluZXJfb2YoZmlsZS0+Zl9vcCwgc3RydWN0IGI0M19kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOworCWRmb3BzID0gY29udGFpbmVyX29mKGRlYnVnZnNfcmVhbF9mb3BzKGZpbGUpLAorCQkJICAgICBzdHJ1Y3QgYjQzX2RlYnVnZnNfZm9wcywgZm9wcyk7CiAJaWYgKCFkZm9wcy0+d3JpdGUpIHsKIAkJZXJyID0gLUVOT1NZUzsKIAkJZ290byBvdXRfdW5sb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYjQzbGVnYWN5L2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2I0M2xlZ2FjeS9kZWJ1Z2ZzLmMKaW5kZXggMDkwOTEwZS4uODJlZjU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYjQzbGVnYWN5L2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9iNDNsZWdhY3kvZGVidWdmcy5jCkBAIC0yMjEsNyArMjIxLDggQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCWRmb3BzID0gY29udGFpbmVyX29mKGZpbGUtPmZfb3AsIHN0cnVjdCBiNDNsZWdhY3lfZGVidWdmc19mb3BzLCBmb3BzKTsKKwlkZm9wcyA9IGNvbnRhaW5lcl9vZihkZWJ1Z2ZzX3JlYWxfZm9wcyhmaWxlKSwKKwkJCSAgICAgc3RydWN0IGI0M2xlZ2FjeV9kZWJ1Z2ZzX2ZvcHMsIGZvcHMpOwogCWlmICghZGZvcHMtPnJlYWQpIHsKIAkJZXJyID0gLUVOT1NZUzsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMjg3LDcgKzI4OCw4IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlkZm9wcyA9IGNvbnRhaW5lcl9vZihmaWxlLT5mX29wLCBzdHJ1Y3QgYjQzbGVnYWN5X2RlYnVnZnNfZm9wcywgZm9wcyk7CisJZGZvcHMgPSBjb250YWluZXJfb2YoZGVidWdmc19yZWFsX2ZvcHMoZmlsZSksCisJCQkgICAgIHN0cnVjdCBiNDNsZWdhY3lfZGVidWdmc19mb3BzLCBmb3BzKTsKIAlpZiAoIWRmb3BzLT53cml0ZSkgewogCQllcnIgPSAtRU5PU1lTOwogCQlnb3RvIG91dF91bmxvY2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvYmNkYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2JjZGMuYwppbmRleCBkMWJjNTFmLi4wMzhhOTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvYmNkYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9iY2RjLmMKQEAgLTE5NCw3ICsxOTQsNyBAQAogCX0KIAogCS8qIENoZWNrIGluZm8gYnVmZmVyICovCi0JaW5mbyA9ICh2b2lkICopJm1zZ1sxXTsKKwlpbmZvID0gKHZvaWQgKikmYmNkYy0+YnVmWzBdOwogCiAJLyogQ29weSBpbmZvIGJ1ZmZlciAqLwogCWlmIChidWYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYwppbmRleCBmNTQ5YzI1Li43MjEzOWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jCkBAIC00MjAsNyArNDIwLDcgQEAKIAogdTMyIGJyY21mX3NkaW9kX3JlZ3JsKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIGludCAqcmV0KQogewotCXUzMiBkYXRhOworCXUzMiBkYXRhID0gMDsKIAlpbnQgcmV0dmFsOwogCiAJYnJjbWZfZGJnKFNESU8sICJhZGRyOjB4JTA4eFxuIiwgYWRkcik7CkBAIC0xMTAxLDYgKzExMDEsNyBAQAogCUJSQ01GX1NESU9fREVWSUNFKFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzQxKSwKIAlCUkNNRl9TRElPX0RFVklDRShTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM2MiksCiAJQlJDTUZfU0RJT19ERVZJQ0UoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNV80MzM5KSwKKwlCUkNNRl9TRElPX0RFVklDRShTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM5KSwKIAlCUkNNRl9TRElPX0RFVklDRShTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzQzMCksCiAJQlJDTUZfU0RJT19ERVZJQ0UoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDM0NSksCiAJQlJDTUZfU0RJT19ERVZJQ0UoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDM1NCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5jCmluZGV4IDI2MjhkNWUuLmI3NzdlMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5jCkBAIC0xNTk1LDE1ICsxNTk1LDkgQEAKIAkJdmFsID0gMTsKIAkJYnJjbWZfZGJnKENPTk4sICJzaGFyZWQga2V5XG4iKTsKIAkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0FVVEhUWVBFX0FVVE9NQVRJQzoKLQkJdmFsID0gMjsKLQkJYnJjbWZfZGJnKENPTk4sICJhdXRvbWF0aWNcbiIpOwotCQlicmVhazsKLQljYXNlIE5MODAyMTFfQVVUSFRZUEVfTkVUV09SS19FQVA6Ci0JCWJyY21mX2RiZyhDT05OLCAibmV0d29yayBlYXBcbiIpOwogCWRlZmF1bHQ6CiAJCXZhbCA9IDI7Ci0JCWJyY21mX2VycigiaW52YWxpZCBhdXRoIHR5cGUgKCVkKVxuIiwgc21lLT5hdXRoX3R5cGUpOworCQlicmNtZl9kYmcoQ09OTiwgImF1dG9tYXRpYywgYXV0aCB0eXBlICglZClcbiIsIHNtZS0+YXV0aF90eXBlKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yNTMzLDcgKzI1MjcsNyBAQAogCQkJCSAgICAgV0xfQlNTX0lORk9fTUFYKTsKIAlpZiAoZXJyKSB7CiAJCWJyY21mX2VycigiRmFpbGVkIHRvIGdldCBic3MgaW5mbyAoJWQpXG4iLCBlcnIpOwotCQlyZXR1cm47CisJCWdvdG8gb3V0X2tmcmVlOwogCX0KIAlzaS0+ZmlsbGVkIHw9IEJJVChOTDgwMjExX1NUQV9JTkZPX0JTU19QQVJBTSk7CiAJc2ktPmJzc19wYXJhbS5iZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShidWYtPmJzc19sZS5iZWFjb25fcGVyaW9kKTsKQEAgLTI1NDUsNiArMjUzOSw5IEBACiAJCXNpLT5ic3NfcGFyYW0uZmxhZ3MgfD0gQlNTX1BBUkFNX0ZMQUdTX1NIT1JUX1BSRUFNQkxFOwogCWlmIChjYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRSkKIAkJc2ktPmJzc19wYXJhbS5mbGFncyB8PSBCU1NfUEFSQU1fRkxBR1NfU0hPUlRfU0xPVF9USU1FOworCitvdXRfa2ZyZWU6CisJa2ZyZWUoYnVmKTsKIH0KIAogc3RhdGljIHMzMgpAQCAtMzcwMyw2ICszNzAwLDcgQEAKIAkJCQkgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bCkKIHsKIAl1MzIgd293bF9jb25maWc7CisJc3RydWN0IGJyY21mX3dvd2xfd2FrZWluZF9sZSB3b3dsX3dha2VpbmQ7CiAJdTMyIGk7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJTdXNwZW5kLCB3b3dsIGNvbmZpZy5cbiIpOwpAQCAtMzc0NCw4ICszNzQyLDkgQEAKIAlpZiAoIXRlc3RfYml0KEJSQ01GX1ZJRl9TVEFUVVNfQ09OTkVDVEVELCAmaWZwLT52aWYtPnNtZV9zdGF0ZSkpCiAJCXdvd2xfY29uZmlnIHw9IEJSQ01GX1dPV0xfVU5BU1NPQzsKIAotCWJyY21mX2ZpbF9pb3Zhcl9kYXRhX3NldChpZnAsICJ3b3dsX3dha2VpbmQiLCAiY2xlYXIiLAotCQkJCSBzaXplb2Yoc3RydWN0IGJyY21mX3dvd2xfd2FrZWluZF9sZSkpOworCW1lbWNweSgmd293bF93YWtlaW5kLCAiY2xlYXIiLCA2KTsKKwlicmNtZl9maWxfaW92YXJfZGF0YV9zZXQoaWZwLCAid293bF93YWtlaW5kIiwgJndvd2xfd2FrZWluZCwKKwkJCQkgc2l6ZW9mKHdvd2xfd2FrZWluZCkpOwogCWJyY21mX2ZpbF9pb3Zhcl9pbnRfc2V0KGlmcCwgIndvd2wiLCB3b3dsX2NvbmZpZyk7CiAJYnJjbWZfZmlsX2lvdmFyX2ludF9zZXQoaWZwLCAid293bF9hY3RpdmF0ZSIsIDEpOwogCWJyY21mX2J1c193b3dsX2NvbmZpZyhjZmctPnB1Yi0+YnVzX2lmLCB0cnVlKTsKQEAgLTM4ODQsMTEgKzM4ODMsMTEgQEAKIAlpZiAoIWNoZWNrX3ZpZl91cChpZnAtPnZpZikpCiAJCXJldHVybiAtRUlPOwogCi0JYnJjbWZfZGJnKENPTk4sICJkZWxfcG1rc2EgLSBQTUsgYnNzaWQgPSAlcE1cbiIsICZwbWtzYS0+YnNzaWQpOworCWJyY21mX2RiZyhDT05OLCAiZGVsX3Bta3NhIC0gUE1LIGJzc2lkID0gJXBNXG4iLCBwbWtzYS0+YnNzaWQpOwogCiAJbnBtayA9IGxlMzJfdG9fY3B1KGNmZy0+cG1rX2xpc3QubnBtayk7CiAJZm9yIChpID0gMDsgaSA8IG5wbWs7IGkrKykKLQkJaWYgKCFtZW1jbXAoJnBta3NhLT5ic3NpZCwgJnBta1tpXS5ic3NpZCwgRVRIX0FMRU4pKQorCQlpZiAoIW1lbWNtcChwbWtzYS0+YnNzaWQsIHBta1tpXS5ic3NpZCwgRVRIX0FMRU4pKQogCQkJYnJlYWs7CiAKIAlpZiAoKG5wbWsgPiAwKSAmJiAoaSA8IG5wbWspKSB7CkBAIC00NTAyLDYgKzQ1MDEsNyBAQAogCXUxNiBjaGFuc3BlYyA9IGNoYW5kZWZfdG9fY2hhbnNwZWMoJmNmZy0+ZDExaW5mLCAmc2V0dGluZ3MtPmNoYW5kZWYpOwogCWJvb2wgbWJzczsKIAlpbnQgaXNfMTFkOworCWJvb2wgc3VwcG9ydHNfMTFkOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiY3RybGNobj0lZCwgY2VudGVyPSVkLCBidz0lZCwgYmVhY29uX2ludGVydmFsPSVkLCBkdGltX3BlcmlvZD0lZCxcbiIsCiAJCSAgc2V0dGluZ3MtPmNoYW5kZWYuY2hhbi0+aHdfdmFsdWUsCkBAIC00NTE0LDExICs0NTE0LDE2IEBACiAJbWJzcyA9IGlmcC0+dmlmLT5tYnNzOwogCiAJLyogc3RvcmUgY3VycmVudCAxMWQgc2V0dGluZyAqLwotCWJyY21mX2ZpbF9jbWRfaW50X2dldChpZnAsIEJSQ01GX0NfR0VUX1JFR1VMQVRPUlksICZpZnAtPnZpZi0+aXNfMTFkKTsKLQljb3VudHJ5X2llID0gYnJjbWZfcGFyc2VfdGx2cygodTggKilzZXR0aW5ncy0+YmVhY29uLnRhaWwsCi0JCQkJICAgICAgc2V0dGluZ3MtPmJlYWNvbi50YWlsX2xlbiwKLQkJCQkgICAgICBXTEFOX0VJRF9DT1VOVFJZKTsKLQlpc18xMWQgPSBjb3VudHJ5X2llID8gMSA6IDA7CisJaWYgKGJyY21mX2ZpbF9jbWRfaW50X2dldChpZnAsIEJSQ01GX0NfR0VUX1JFR1VMQVRPUlksCisJCQkJICAmaWZwLT52aWYtPmlzXzExZCkpIHsKKwkJc3VwcG9ydHNfMTFkID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJY291bnRyeV9pZSA9IGJyY21mX3BhcnNlX3RsdnMoKHU4ICopc2V0dGluZ3MtPmJlYWNvbi50YWlsLAorCQkJCQkgICAgICBzZXR0aW5ncy0+YmVhY29uLnRhaWxfbGVuLAorCQkJCQkgICAgICBXTEFOX0VJRF9DT1VOVFJZKTsKKwkJaXNfMTFkID0gY291bnRyeV9pZSA/IDEgOiAwOworCQlzdXBwb3J0c18xMWQgPSB0cnVlOworCX0KIAogCW1lbXNldCgmc3NpZF9sZSwgMCwgc2l6ZW9mKHNzaWRfbGUpKTsKIAlpZiAoc2V0dGluZ3MtPnNzaWQgPT0gTlVMTCB8fCBzZXR0aW5ncy0+c3NpZF9sZW4gPT0gMCkgewpAQCAtNDUyNyw3ICs0NTMyLDcgQEAKIAkJCQkodTggKikmc2V0dGluZ3MtPmJlYWNvbi5oZWFkW2llX29mZnNldF0sCiAJCQkJc2V0dGluZ3MtPmJlYWNvbi5oZWFkX2xlbiAtIGllX29mZnNldCwKIAkJCQlXTEFOX0VJRF9TU0lEKTsKLQkJaWYgKCFzc2lkX2llKQorCQlpZiAoIXNzaWRfaWUgfHwgc3NpZF9pZS0+bGVuID4gSUVFRTgwMjExX01BWF9TU0lEX0xFTikKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCW1lbWNweShzc2lkX2xlLlNTSUQsIHNzaWRfaWUtPmRhdGEsIHNzaWRfaWUtPmxlbik7CkBAIC00NTc3LDcgKzQ1ODIsNyBAQAogCiAJLyogUGFyYW1ldGVycyBzaGFyZWQgYnkgYWxsIHJhZGlvIGludGVyZmFjZXMgKi8KIAlpZiAoIW1ic3MpIHsKLQkJaWYgKGlzXzExZCAhPSBpZnAtPnZpZi0+aXNfMTFkKSB7CisJCWlmICgoc3VwcG9ydHNfMTFkKSAmJiAoaXNfMTFkICE9IGlmcC0+dmlmLT5pc18xMWQpKSB7CiAJCQllcnIgPSBicmNtZl9maWxfY21kX2ludF9zZXQoaWZwLCBCUkNNRl9DX1NFVF9SRUdVTEFUT1JZLAogCQkJCQkJICAgIGlzXzExZCk7CiAJCQlpZiAoZXJyIDwgMCkgewpAQCAtNDYxOSw3ICs0NjI0LDcgQEAKIAkJCWJyY21mX2VycigiU0VUIElORlJBIGVycm9yICVkXG4iLCBlcnIpOwogCQkJZ290byBleGl0OwogCQl9Ci0JfSBlbHNlIGlmIChXQVJOX09OKGlzXzExZCAhPSBpZnAtPnZpZi0+aXNfMTFkKSkgeworCX0gZWxzZSBpZiAoV0FSTl9PTihzdXBwb3J0c18xMWQgJiYgKGlzXzExZCAhPSBpZnAtPnZpZi0+aXNfMTFkKSkpIHsKIAkJLyogTXVsdGlwbGUtQlNTIHNob3VsZCB1c2Ugc2FtZSAxMWQgY29uZmlndXJhdGlvbiAqLwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXQ7CkBAIC00NzUzLDExICs0NzU4LDggQEAKIAkJCWJyY21mX2Vycigic2V0dGluZyBJTkZSQSBtb2RlIGZhaWxlZCAlZFxuIiwgZXJyKTsKIAkJaWYgKGJyY21mX2ZlYXRfaXNfZW5hYmxlZChpZnAsIEJSQ01GX0ZFQVRfTUJTUykpCiAJCQlicmNtZl9maWxfaW92YXJfaW50X3NldChpZnAsICJtYnNzIiwgMCk7Ci0JCWVyciA9IGJyY21mX2ZpbF9jbWRfaW50X3NldChpZnAsIEJSQ01GX0NfU0VUX1JFR1VMQVRPUlksCi0JCQkJCSAgICBpZnAtPnZpZi0+aXNfMTFkKTsKLQkJaWYgKGVyciA8IDApCi0JCQlicmNtZl9lcnIoInJlc3RvcmluZyBSRUdVTEFUT1JZIHNldHRpbmcgZmFpbGVkICVkXG4iLAotCQkJCSAgZXJyKTsKKwkJYnJjbWZfZmlsX2NtZF9pbnRfc2V0KGlmcCwgQlJDTUZfQ19TRVRfUkVHVUxBVE9SWSwKKwkJCQkgICAgICBpZnAtPnZpZi0+aXNfMTFkKTsKIAkJLyogQnJpbmcgZGV2aWNlIGJhY2sgdXAgc28gaXQgY2FuIGJlIHVzZWQgYWdhaW4gKi8KIAkJZXJyID0gYnJjbWZfZmlsX2NtZF9pbnRfc2V0KGlmcCwgQlJDTUZfQ19VUCwgMSk7CiAJCWlmIChlcnIgPCAwKQpAQCAtNTYzNSw3ICs1NjM3LDcgQEAKIAkJICBpZmV2ZW50LT5hY3Rpb24sIGlmZXZlbnQtPmZsYWdzLCBpZmV2ZW50LT5pZmlkeCwKIAkJICBpZmV2ZW50LT5ic3NjZmdpZHgpOwogCi0JbXV0ZXhfbG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwlzcGluX2xvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJZXZlbnQtPmFjdGlvbiA9IGlmZXZlbnQtPmFjdGlvbjsKIAl2aWYgPSBldmVudC0+dmlmOwogCkBAIC01NjQzLDcgKzU2NDUsNyBAQAogCWNhc2UgQlJDTUZfRV9JRl9BREQ6CiAJCS8qIHdhaXRpbmcgcHJvY2VzcyBtYXkgaGF2ZSB0aW1lZCBvdXQgKi8KIAkJaWYgKCFjZmctPnZpZl9ldmVudC52aWYpIHsKLQkJCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOwogCQkJcmV0dXJuIC1FQkFERjsKIAkJfQogCkBAIC01NjU0LDI0ICs1NjU2LDI0IEBACiAJCQlpZnAtPm5kZXYtPmllZWU4MDIxMV9wdHIgPSAmdmlmLT53ZGV2OwogCQkJU0VUX05FVERFVl9ERVYoaWZwLT5uZGV2LCB3aXBoeV9kZXYoY2ZnLT53aXBoeSkpOwogCQl9Ci0JCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJCXdha2VfdXAoJmV2ZW50LT52aWZfd3EpOwogCQlyZXR1cm4gMDsKIAogCWNhc2UgQlJDTUZfRV9JRl9ERUw6Ci0JCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJCS8qIGV2ZW50IG1heSBub3QgYmUgdXBvbiB1c2VyIHJlcXVlc3QgKi8KIAkJaWYgKGJyY21mX2NmZzgwMjExX3ZpZl9ldmVudF9hcm1lZChjZmcpKQogCQkJd2FrZV91cCgmZXZlbnQtPnZpZl93cSk7CiAJCXJldHVybiAwOwogCiAJY2FzZSBCUkNNRl9FX0lGX0NIQU5HRToKLQkJbXV0ZXhfdW5sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOworCQlzcGluX3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAkJd2FrZV91cCgmZXZlbnQtPnZpZl93cSk7CiAJCXJldHVybiAwOwogCiAJZGVmYXVsdDoKLQkJbXV0ZXhfdW5sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOworCQlzcGluX3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAtRUlOVkFMOwpAQCAtNTc5Miw3ICs1Nzk0LDcgQEAKIHN0YXRpYyB2b2lkIGluaXRfdmlmX2V2ZW50KHN0cnVjdCBicmNtZl9jZmc4MDIxMV92aWZfZXZlbnQgKmV2ZW50KQogewogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmV2ZW50LT52aWZfd3EpOwotCW11dGV4X2luaXQoJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiB9CiAKIHN0YXRpYyBzMzIgYnJjbWZfZG9uZ2xlX3JvYW0oc3RydWN0IGJyY21mX2lmICppZnApCkBAIC02NjkxLDkgKzY2OTMsOSBAQAogewogCXU4IGV2dF9hY3Rpb247CiAKLQltdXRleF9sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOworCXNwaW5fbG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAlldnRfYWN0aW9uID0gZXZlbnQtPmFjdGlvbjsKLQltdXRleF91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJc3Bpbl91bmxvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CiAJcmV0dXJuIGV2dF9hY3Rpb24gPT0gYWN0aW9uOwogfQogCkBAIC02NzAyLDEwICs2NzA0LDEwIEBACiB7CiAJc3RydWN0IGJyY21mX2NmZzgwMjExX3ZpZl9ldmVudCAqZXZlbnQgPSAmY2ZnLT52aWZfZXZlbnQ7CiAKLQltdXRleF9sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOworCXNwaW5fbG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAlldmVudC0+dmlmID0gdmlmOwogCWV2ZW50LT5hY3Rpb24gPSAwOwotCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwlzcGluX3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIH0KIAogYm9vbCBicmNtZl9jZmc4MDIxMV92aWZfZXZlbnRfYXJtZWQoc3RydWN0IGJyY21mX2NmZzgwMjExX2luZm8gKmNmZykKQEAgLTY3MTMsOSArNjcxNSw5IEBACiAJc3RydWN0IGJyY21mX2NmZzgwMjExX3ZpZl9ldmVudCAqZXZlbnQgPSAmY2ZnLT52aWZfZXZlbnQ7CiAJYm9vbCBhcm1lZDsKIAotCW11dGV4X2xvY2soJmV2ZW50LT52aWZfZXZlbnRfbG9jayk7CisJc3Bpbl9sb2NrKCZldmVudC0+dmlmX2V2ZW50X2xvY2spOwogCWFybWVkID0gZXZlbnQtPnZpZiAhPSBOVUxMOwotCW11dGV4X3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKKwlzcGluX3VubG9jaygmZXZlbnQtPnZpZl9ldmVudF9sb2NrKTsKIAogCXJldHVybiBhcm1lZDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NmZzgwMjExLmgKaW5kZXggN2Q3N2Y4Ni4uODg4OTgzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NmZzgwMjExLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NmZzgwMjExLmgKQEAgLTIyNyw3ICsyMjcsNyBAQAogICovCiBzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfdmlmX2V2ZW50IHsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB2aWZfd3E7Ci0Jc3RydWN0IG11dGV4IHZpZl9ldmVudF9sb2NrOworCXNwaW5sb2NrX3QgdmlmX2V2ZW50X2xvY2s7CiAJdTggYWN0aW9uOwogCXN0cnVjdCBicmNtZl9jZmc4MDIxMV92aWYgKnZpZjsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY29yZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NvcmUuYwppbmRleCA4ZDE2ZjAyLi41ZWFhYzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jb3JlLmMKQEAgLTEzNiwyNyArMTM2LDYgQEAKIAkJCSAgZXJyKTsKIH0KIAotc3RhdGljIHZvaWQKLV9icmNtZl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBicmNtZl9pZiAqaWZwOwotCXMzMiBlcnI7Ci0KLQlpZnAgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJyY21mX2lmLCBzZXRtYWNhZGRyX3dvcmspOwotCi0JYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXIsIGJzc2NmZ2lkeD0lZFxuIiwgaWZwLT5ic3NjZmdpZHgpOwotCi0JZXJyID0gYnJjbWZfZmlsX2lvdmFyX2RhdGFfc2V0KGlmcCwgImN1cl9ldGhlcmFkZHIiLCBpZnAtPm1hY19hZGRyLAotCQkJCSAgICAgICBFVEhfQUxFTik7Ci0JaWYgKGVyciA8IDApIHsKLQkJYnJjbWZfZXJyKCJTZXR0aW5nIGN1cl9ldGhlcmFkZHIgZmFpbGVkLCAlZFxuIiwgZXJyKTsKLQl9IGVsc2UgewotCQlicmNtZl9kYmcoVFJBQ0UsICJNQUMgYWRkcmVzcyB1cGRhdGVkIHRvICVwTVxuIiwKLQkJCSAgaWZwLT5tYWNfYWRkcik7Ci0JCW1lbWNweShpZnAtPm5kZXYtPmRldl9hZGRyLCBpZnAtPm1hY19hZGRyLCBFVEhfQUxFTik7Ci0JfQotfQotCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIHN0YXRpYyB2b2lkIF9icmNtZl91cGRhdGVfbmR0YWJsZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CkBAIC0xOTAsMTAgKzE2OSwyMCBAQAogewogCXN0cnVjdCBicmNtZl9pZiAqaWZwID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyOworCWludCBlcnI7CiAKLQltZW1jcHkoJmlmcC0+bWFjX2FkZHIsIHNhLT5zYV9kYXRhLCBFVEhfQUxFTik7Ci0Jc2NoZWR1bGVfd29yaygmaWZwLT5zZXRtYWNhZGRyX3dvcmspOwotCXJldHVybiAwOworCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyLCBic3NjZmdpZHg9JWRcbiIsIGlmcC0+YnNzY2ZnaWR4KTsKKworCWVyciA9IGJyY21mX2ZpbF9pb3Zhcl9kYXRhX3NldChpZnAsICJjdXJfZXRoZXJhZGRyIiwgc2EtPnNhX2RhdGEsCisJCQkJICAgICAgIEVUSF9BTEVOKTsKKwlpZiAoZXJyIDwgMCkgeworCQlicmNtZl9lcnIoIlNldHRpbmcgY3VyX2V0aGVyYWRkciBmYWlsZWQsICVkXG4iLCBlcnIpOworCX0gZWxzZSB7CisJCWJyY21mX2RiZyhUUkFDRSwgInVwZGF0ZWQgdG8gJXBNXG4iLCBzYS0+c2FfZGF0YSk7CisJCW1lbWNweShpZnAtPm1hY19hZGRyLCBzYS0+c2FfZGF0YSwgRVRIX0FMRU4pOworCQltZW1jcHkoaWZwLT5uZGV2LT5kZXZfYWRkciwgaWZwLT5tYWNfYWRkciwgRVRIX0FMRU4pOworCX0KKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBicmNtZl9uZXRkZXZfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQpAQCAtNTE5LDEzICs1MDgsOSBAQAogCW5kZXYtPm5lZWRlZF9oZWFkcm9vbSArPSBkcnZyLT5oZHJsZW47CiAJbmRldi0+ZXRodG9vbF9vcHMgPSAmYnJjbWZfZXRodG9vbF9vcHM7CiAKLQlkcnZyLT5yeHN6ID0gbmRldi0+bXR1ICsgbmRldi0+aGFyZF9oZWFkZXJfbGVuICsKLQkJCSAgICAgIGRydnItPmhkcmxlbjsKLQogCS8qIHNldCB0aGUgbWFjIGFkZHJlc3MgKi8KIAltZW1jcHkobmRldi0+ZGV2X2FkZHIsIGlmcC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKIAotCUlOSVRfV09SSygmaWZwLT5zZXRtYWNhZGRyX3dvcmssIF9icmNtZl9zZXRfbWFjX2FkZHJlc3MpOwogCUlOSVRfV09SSygmaWZwLT5tdWx0aWNhc3Rfd29yaywgX2JyY21mX3NldF9tdWx0aWNhc3RfbGlzdCk7CiAJSU5JVF9XT1JLKCZpZnAtPm5kb2ZmbG9hZF93b3JrLCBfYnJjbWZfdXBkYXRlX25kdGFibGUpOwogCkBAIC03MzAsNyArNzE1LDYgQEAKIAkJfQogCiAJCWlmIChpZnAtPm5kZXYtPm5ldGRldl9vcHMgPT0gJmJyY21mX25ldGRldl9vcHNfcHJpKSB7Ci0JCQljYW5jZWxfd29ya19zeW5jKCZpZnAtPnNldG1hY2FkZHJfd29yayk7CiAJCQljYW5jZWxfd29ya19zeW5jKCZpZnAtPm11bHRpY2FzdF93b3JrKTsKIAkJCWNhbmNlbF93b3JrX3N5bmMoJmlmcC0+bmRvZmZsb2FkX3dvcmspOwogCQl9CkBAIC03NDMsNyArNzI3LDcgQEAKIAkJICogc2VyaW91cyB0cm91Ymxlc29tZSBzaWRlIGVmZmVjdHMuIFRoZSBwMnAgbW9kdWxlIHdpbGwgY2xlYW4KIAkJICogdXAgdGhlIGlmcCBpZiBuZWVkZWQuCiAJCSAqLwotCQlicmNtZl9wMnBfaWZwX3JlbW92ZWQoaWZwKTsKKwkJYnJjbWZfcDJwX2lmcF9yZW1vdmVkKGlmcCwgcnRubF9sb2NrZWQpOwogCQlrZnJlZShpZnApOwogCX0KIH0KQEAgLTg4Niw5ICs4NzAsMTIgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIE5FVERFVl9ET1dOOgotCQlpZiAoaSA8IE5ET0xfTUFYX0VOVFJJRVMpCi0JCQlmb3IgKDsgaSA8IGlmcC0+aXB2NmFkZHJfaWR4OyBpKyspCisJCWlmIChpIDwgTkRPTF9NQVhfRU5UUklFUykgeworCQkJZm9yICg7IGkgPCBpZnAtPmlwdjZhZGRyX2lkeCAtIDE7IGkrKykKIAkJCQl0YWJsZVtpXSA9IHRhYmxlW2kgKyAxXTsKKwkJCW1lbXNldCgmdGFibGVbaV0sIDAsIHNpemVvZih0YWJsZVtpXSkpOworCQkJaWZwLT5pcHY2YWRkcl9pZHgtLTsKKwkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTEwNjEsOCArMTA0OCw3IEBACiAJCWJyY21mX2Z3c19kZWxfaW50ZXJmYWNlKGlmcCk7CiAJCWJyY21mX2Z3c19kZWluaXQoZHJ2cik7CiAJfQotCWlmIChpZnApCi0JCWJyY21mX25ldF9kZXRhY2goaWZwLT5uZGV2LCBmYWxzZSk7CisJYnJjbWZfbmV0X2RldGFjaChpZnAtPm5kZXYsIGZhbHNlKTsKIAlpZiAocDJwX2lmcCkKIAkJYnJjbWZfbmV0X2RldGFjaChwMnBfaWZwLT5uZGV2LCBmYWxzZSk7CiAJZHJ2ci0+aWZsaXN0WzBdID0gTlVMTDsKQEAgLTExNjksNyArMTE1NSw4IEBACiAJCQkJICFicmNtZl9nZXRfcGVuZF84MDIxeF9jbnQoaWZwKSwKIAkJCQkgTUFYX1dBSVRfRk9SXzgwMjFYX1RYKTsKIAotCVdBUk5fT04oIWVycik7CisJaWYgKCFlcnIpCisJCWJyY21mX2VycigiVGltZWQgb3V0IHdhaXRpbmcgZm9yIG5vIHBlbmRpbmcgODAyLjF4IHBhY2tldHNcbiIpOwogCiAJcmV0dXJuICFlcnI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2NvcmUuaAppbmRleCA4ZmEzNGNhLi5jOTRkY2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9jb3JlLmgKQEAgLTExMiwxNSArMTEyLDExIEBACiAKIAkvKiBJbnRlcm5hbCBicmNtZiBpdGVtcyAqLwogCXVpbnQgaGRybGVuOwkJLyogVG90YWwgQlJDTUYgaGVhZGVyIGxlbmd0aCAocHJvdG8gKyBidXMpICovCi0JdWludCByeHN6OwkJLyogUnggYnVmZmVyIHNpemUgYnVzIG1vZHVsZSBzaG91bGQgdXNlICovCiAKIAkvKiBEb25nbGUgbWVkaWEgaW5mbyAqLwogCWNoYXIgZnd2ZXJbQlJDTUZfRFJJVkVSX0ZJUk1XQVJFX1ZFUlNJT05fTEVOXTsKIAl1OCBtYWNbRVRIX0FMRU5dOwkJLyogTUFDIGFkZHJlc3Mgb2J0YWluZWQgZnJvbSBkb25nbGUgKi8KIAotCS8qIE11bHRpY2FzdCBkYXRhIHBhY2tldHMgc2VudCB0byBkb25nbGUgKi8KLQl1bnNpZ25lZCBsb25nIHR4X211bHRpY2FzdDsKLQogCXN0cnVjdCBtYWNfYWRkcmVzcyBhZGRyZXNzZXNbQlJDTUZfTUFYX0lGU107CiAKIAlzdHJ1Y3QgYnJjbWZfaWYgKmlmbGlzdFtCUkNNRl9NQVhfSUZTXTsKQEAgLTE3Niw3ICsxNzIsNiBAQAogICogQHZpZjogcG9pbnRzIHRvIGNmZzgwMjExIHNwZWNpZmljIGludGVyZmFjZSBpbmZvcm1hdGlvbi4KICAqIEBuZGV2OiBhc3NvY2lhdGVkIG5ldHdvcmsgZGV2aWNlLgogICogQHN0YXRzOiBpbnRlcmZhY2Ugc3BlY2lmaWMgbmV0d29yayBzdGF0aXN0aWNzLgotICogQHNldG1hY2FkZHJfd29yazogd29ya2VyIG9iamVjdCBmb3Igc2V0dGluZyBtYWMgYWRkcmVzcy4KICAqIEBtdWx0aWNhc3Rfd29yazogd29ya2VyIG9iamVjdCBmb3IgbXVsdGljYXN0IHByb3Zpc2lvbmluZy4KICAqIEBuZG9mZmxvYWRfd29yazogd29ya2VyIG9iamVjdCBmb3IgbmVpZ2hib3IgZGlzY292ZXJ5IG9mZmxvYWQgY29uZmlndXJhdGlvbi4KICAqIEBmd3NfZGVzYzogaW50ZXJmYWNlIHNwZWNpZmljIGZpcm13YXJlLXNpZ25hbGxpbmcgZGVzY3JpcHRvci4KQEAgLTE5Myw3ICsxODgsNiBAQAogCXN0cnVjdCBicmNtZl9jZmc4MDIxMV92aWYgKnZpZjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2V0bWFjYWRkcl93b3JrOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBtdWx0aWNhc3Rfd29yazsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbmRvZmZsb2FkX3dvcms7CiAJc3RydWN0IGJyY21mX2Z3c19tYWNfZGVzY3JpcHRvciAqZndzX2Rlc2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvZmxvd3JpbmcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9mbG93cmluZy5jCmluZGV4IDdlMjY5ZjkuLmQwYjczOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9mbG93cmluZy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9mbG93cmluZy5jCkBAIC0yMzQsMTMgKzIzNCwyMCBAQAogCiB2b2lkIGJyY21mX2Zsb3dyaW5nX2RlbGV0ZShzdHJ1Y3QgYnJjbWZfZmxvd3JpbmcgKmZsb3csIHUxNiBmbG93aWQpCiB7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKGZsb3ctPmRldik7CiAJc3RydWN0IGJyY21mX2Zsb3dyaW5nX3JpbmcgKnJpbmc7CisJc3RydWN0IGJyY21mX2lmICppZnA7CiAJdTE2IGhhc2hfaWR4OworCXU4IGlmaWR4OwogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlyaW5nID0gZmxvdy0+cmluZ3NbZmxvd2lkXTsKIAlpZiAoIXJpbmcpCiAJCXJldHVybjsKKworCWlmaWR4ID0gYnJjbWZfZmxvd3JpbmdfaWZpZHhfZ2V0KGZsb3csIGZsb3dpZCk7CisJaWZwID0gYnJjbWZfZ2V0X2lmcChidXNfaWYtPmRydnIsIGlmaWR4KTsKKwogCWJyY21mX2Zsb3dyaW5nX2Jsb2NrKGZsb3csIGZsb3dpZCwgZmFsc2UpOwogCWhhc2hfaWR4ID0gcmluZy0+aGFzaF9pZDsKIAlmbG93LT5oYXNoW2hhc2hfaWR4XS5pZmlkeCA9IEJSQ01GX0ZMT1dSSU5HX0lOVkFMSURfSUZJRFg7CkBAIC0yNDksNyArMjU2LDcgQEAKIAogCXNrYiA9IHNrYl9kZXF1ZXVlKCZyaW5nLT5za2JsaXN0KTsKIAl3aGlsZSAoc2tiKSB7Ci0JCWJyY211X3BrdF9idWZfZnJlZV9za2Ioc2tiKTsKKwkJYnJjbWZfdHhmaW5hbGl6ZShpZnAsIHNrYiwgZmFsc2UpOwogCQlza2IgPSBza2JfZGVxdWV1ZSgmcmluZy0+c2tibGlzdCk7CiAJfQogCkBAIC00OTUsMTQgKzUwMiwxOCBAQAogCX0gZWxzZSB7CiAJCXNlYXJjaCA9IGZsb3ctPnRkbHNfZW50cnk7CiAJCWlmIChtZW1jbXAoc2VhcmNoLT5tYWMsIHBlZXIsIEVUSF9BTEVOKSA9PSAwKQotCQkJcmV0dXJuOworCQkJZ290byBmcmVlX2VudHJ5OwogCQl3aGlsZSAoc2VhcmNoLT5uZXh0KSB7CiAJCQlzZWFyY2ggPSBzZWFyY2gtPm5leHQ7CiAJCQlpZiAobWVtY21wKHNlYXJjaC0+bWFjLCBwZWVyLCBFVEhfQUxFTikgPT0gMCkKLQkJCQlyZXR1cm47CisJCQkJZ290byBmcmVlX2VudHJ5OwogCQl9CiAJCXNlYXJjaC0+bmV4dCA9IHRkbHNfZW50cnk7CiAJfQogCiAJZmxvdy0+dGRsc19hY3RpdmUgPSB0cnVlOworCXJldHVybjsKKworZnJlZV9lbnRyeToKKwlrZnJlZSh0ZGxzX2VudHJ5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9md3NpZ25hbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2Z3c2lnbmFsLmMKaW5kZXggOWY5MDI0YS4uYTE5MGY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2Z3c2lnbmFsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL2Z3c2lnbmFsLmMKQEAgLTIxMDQsOCArMjEwNCw2IEBACiAJaWYgKChza2ItPnByaW9yaXR5ID09IDApIHx8IChza2ItPnByaW9yaXR5ID4gNykpCiAJCXNrYi0+cHJpb3JpdHkgPSBjZmc4MDIxMV9jbGFzc2lmeTgwMjFkKHNrYiwgTlVMTCk7CiAKLQlkcnZyLT50eF9tdWx0aWNhc3QgKz0gISFtdWx0aWNhc3Q7Ci0KIAlpZiAoZndzLT5hdm9pZF9xdWV1ZWluZykgewogCQlyYyA9IGJyY21mX3Byb3RvX3R4ZGF0YShkcnZyLCBpZnAtPmlmaWR4LCAwLCBza2IpOwogCQlpZiAocmMgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3AycC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3AycC5jCmluZGV4IDY2Zjk0MmYuLmRlMTljN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9wMnAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvcDJwLmMKQEAgLTIyOTcsNyArMjI5Nyw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotdm9pZCBicmNtZl9wMnBfaWZwX3JlbW92ZWQoc3RydWN0IGJyY21mX2lmICppZnApCit2b2lkIGJyY21mX3AycF9pZnBfcmVtb3ZlZChzdHJ1Y3QgYnJjbWZfaWYgKmlmcCwgYm9vbCBydG5sX2xvY2tlZCkKIHsKIAlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaW5mbyAqY2ZnOwogCXN0cnVjdCBicmNtZl9jZmc4MDIxMV92aWYgKnZpZjsKQEAgLTIzMDYsOSArMjMwNiwxMSBAQAogCXZpZiA9IGlmcC0+dmlmOwogCWNmZyA9IHdkZXZfdG9fY2ZnKCZ2aWYtPndkZXYpOwogCWNmZy0+cDJwLmJzc19pZHhbUDJQQVBJX0JTU0NGR19ERVZJQ0VdLnZpZiA9IE5VTEw7Ci0JcnRubF9sb2NrKCk7CisJaWYgKCFydG5sX2xvY2tlZCkKKwkJcnRubF9sb2NrKCk7CiAJY2ZnODAyMTFfdW5yZWdpc3Rlcl93ZGV2KCZ2aWYtPndkZXYpOwotCXJ0bmxfdW5sb2NrKCk7CisJaWYgKCFydG5sX2xvY2tlZCkKKwkJcnRubF91bmxvY2soKTsKIAlicmNtZl9mcmVlX3ZpZih2aWYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvcDJwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvcDJwLmgKaW5kZXggYTNiZDE4Yy4uOGNlOTQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3AycC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9wMnAuaApAQCAtMTU1LDcgKzE1NSw3IEBACiBpbnQgYnJjbWZfcDJwX2RlbF92aWYoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2Rldik7CiBpbnQgYnJjbWZfcDJwX2lmY2hhbmdlKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9pbmZvICpjZmcsCiAJCSAgICAgICBlbnVtIGJyY21mX2ZpbF9wMnBfaWZfdHlwZXMgaWZfdHlwZSk7Ci12b2lkIGJyY21mX3AycF9pZnBfcmVtb3ZlZChzdHJ1Y3QgYnJjbWZfaWYgKmlmcCk7Cit2b2lkIGJyY21mX3AycF9pZnBfcmVtb3ZlZChzdHJ1Y3QgYnJjbWZfaWYgKmlmcCwgYm9vbCBydG5sX2xvY2tlZCk7CiBpbnQgYnJjbWZfcDJwX3N0YXJ0X2RldmljZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKIHZvaWQgYnJjbWZfcDJwX3N0b3BfZGV2aWNlKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwogaW50IGJyY21mX3AycF9zY2FuX3ByZXAoc3RydWN0IHdpcGh5ICp3aXBoeSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvc2Rpby5jCmluZGV4IDY4YWIzYWMuLmI4OTJkYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3NkaW8uYwpAQCAtMzEzLDYgKzMxMyw3IEBACiAKICNkZWZpbmUgS1NPX1dBSVRfVVMgNTAKICNkZWZpbmUgTUFYX0tTT19BVFRFTVBUUyAoUE1VX01BWF9UUkFOU0lUSU9OX0RMWS9LU09fV0FJVF9VUykKKyNkZWZpbmUgQlJDTUZfU0RJT19NQVhfQUNDRVNTX0VSUk9SUwk1CiAKIC8qCiAgKiBDb252ZXJzaW9uIG9mIDgwMi4xRCBwcmlvcml0eSB0byBwcmVjZWRlbmNlIGxldmVsCkBAIC02NzcsNiArNjc4LDcgQEAKIHsKIAl1OCB3cl92YWwgPSAwLCByZF92YWwsIGNtcF92YWwsIGJtYXNrOwogCWludCBlcnIgPSAwOworCWludCBlcnJfY250ID0gMDsKIAlpbnQgdHJ5X2NudCA9IDA7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlcjogb249JWRcbiIsIG9uKTsKQEAgLTcxMiw5ICs3MTQsMTQgQEAKIAkJICovCiAJCXJkX3ZhbCA9IGJyY21mX3NkaW9kX3JlZ3JiKGJ1cy0+c2Rpb2RldiwgU0JTRElPX0ZVTkMxX1NMRUVQQ1NSLAogCQkJCQkgICAmZXJyKTsKLQkJaWYgKCgocmRfdmFsICYgYm1hc2spID09IGNtcF92YWwpICYmICFlcnIpCisJCWlmICghZXJyKSB7CisJCQlpZiAoKHJkX3ZhbCAmIGJtYXNrKSA9PSBjbXBfdmFsKQorCQkJCWJyZWFrOworCQkJZXJyX2NudCA9IDA7CisJCX0KKwkJLyogYmFpbCBvdXQgdXBvbiBzdWJzZXF1ZW50IGFjY2VzcyBlcnJvcnMgKi8KKwkJaWYgKGVyciAmJiAoZXJyX2NudCsrID4gQlJDTUZfU0RJT19NQVhfQUNDRVNTX0VSUk9SUykpCiAJCQlicmVhazsKLQogCQl1ZGVsYXkoS1NPX1dBSVRfVVMpOwogCQlicmNtZl9zZGlvZF9yZWd3YihidXMtPnNkaW9kZXYsIFNCU0RJT19GVU5DMV9TTEVFUENTUiwKIAkJCQkgIHdyX3ZhbCwgJmVycik7CkBAIC0zNzU3LDcgKzM3NjQsOCBAQAogCXUzMiB2YWwsIHJldjsKIAogCXZhbCA9IGJyY21mX3NkaW9kX3JlZ3JsKHNkaW9kZXYsIGFkZHIsIE5VTEwpOwotCWlmIChzZGlvZGV2LT5mdW5jWzBdLT5kZXZpY2UgPT0gU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNV80MzM5ICYmCisJaWYgKChzZGlvZGV2LT5mdW5jWzBdLT5kZXZpY2UgPT0gU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNV80MzM5IHx8CisJICAgICBzZGlvZGV2LT5mdW5jWzBdLT5kZXZpY2UgPT0gU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzOSkgJiYKIAkgICAgYWRkciA9PSBDT1JFX0NDX1JFRyhTSV9FTlVNX0JBU0UsIGNoaXBpZCkpIHsKIAkJcmV2ID0gKHZhbCAmIENJRF9SRVZfTUFTSykgPj4gQ0lEX1JFVl9TSElGVDsKIAkJaWYgKHJldiA+PSAyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvdHJhY2Vwb2ludC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3RyYWNlcG9pbnQuYwppbmRleCBhMTBmMzVjLi5mZTY3NTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvdHJhY2Vwb2ludC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy90cmFjZXBvaW50LmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpZm5kZWYgX19DSEVDS0VSX18KICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgInRyYWNlcG9pbnQuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiB2b2lkIF9fYnJjbWZfZXJyKGNvbnN0IGNoYXIgKmZ1bmMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2JyY21mbWFjL3VzYi5jCmluZGV4IDk4YjE1YTkuLjJmOTc4YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9icmNtZm1hYy91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvYnJjbWZtYWMvdXNiLmMKQEAgLTEwOTksMTUgKzEwOTksMTEgQEAKIAlkZXZpbmZvLT50eF9mcmVlY291bnQgPSBudHhxOwogCiAJZGV2aW5mby0+Y3RsX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFkZXZpbmZvLT5jdGxfdXJiKSB7Ci0JCWJyY21mX2VycigidXNiX2FsbG9jX3VyYiAoY3RsKSBmYWlsZWRcbiIpOworCWlmICghZGV2aW5mby0+Y3RsX3VyYikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2aW5mby0+YnVsa191cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwotCWlmICghZGV2aW5mby0+YnVsa191cmIpIHsKLQkJYnJjbWZfZXJyKCJ1c2JfYWxsb2NfdXJiIChidWxrKSBmYWlsZWRcbiIpOworCWlmICghZGV2aW5mby0+YnVsa191cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJcmV0dXJuICZkZXZpbmZvLT5idXNfcHViOwogCkBAIC0xNDYyLDExICsxNDU4LDE1IEBACiAjZGVmaW5lIEJSQ01GX1VTQl9ERVZJQ0UoZGV2X2lkKQlcCiAJeyBVU0JfREVWSUNFKEJSQ01fVVNCX1ZFTkRPUl9JRF9CUk9BRENPTSwgZGV2X2lkKSB9CiAKKyNkZWZpbmUgTElOS1NZU19VU0JfREVWSUNFKGRldl9pZCkJXAorCXsgVVNCX0RFVklDRShCUkNNX1VTQl9WRU5ET1JfSURfTElOS1NZUywgZGV2X2lkKSB9CisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBicmNtZl91c2JfZGV2aWRfdGFibGVbXSA9IHsKIAlCUkNNRl9VU0JfREVWSUNFKEJSQ01fVVNCXzQzMTQzX0RFVklDRV9JRCksCiAJQlJDTUZfVVNCX0RFVklDRShCUkNNX1VTQl80MzIzNl9ERVZJQ0VfSUQpLAogCUJSQ01GX1VTQl9ERVZJQ0UoQlJDTV9VU0JfNDMyNDJfREVWSUNFX0lEKSwKIAlCUkNNRl9VU0JfREVWSUNFKEJSQ01fVVNCXzQzNTY5X0RFVklDRV9JRCksCisJTElOS1NZU19VU0JfREVWSUNFKEJSQ01fVVNCXzQzMjM1X0xJTktTWVNfREVWSUNFX0lEKSwKIAl7IFVTQl9ERVZJQ0UoQlJDTV9VU0JfVkVORE9SX0lEX0xHLCBCUkNNX1VTQl80MzI0Ml9MR19ERVZJQ0VfSUQpIH0sCiAJLyogc3BlY2lhbCBlbnRyeSBmb3IgZGV2aWNlIHdpdGggZmlybXdhcmUgbG9hZGVkIGFuZCBydW5uaW5nICovCiAJQlJDTUZfVVNCX0RFVklDRShCUkNNX1VTQl9CQ01GV19ERVZJQ0VfSUQpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2luY2x1ZGUvYnJjbV9od19pZHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Jyb2FkY29tL2JyY204MDIxMS9pbmNsdWRlL2JyY21faHdfaWRzLmgKaW5kZXggM2NjNDJiZS4uZDA0MDdkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJvYWRjb20vYnJjbTgwMjExL2luY2x1ZGUvYnJjbV9od19pZHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icm9hZGNvbS9icmNtODAyMTEvaW5jbHVkZS9icmNtX2h3X2lkcy5oCkBAIC0yMiw2ICsyMiw3IEBACiAKICNkZWZpbmUgQlJDTV9VU0JfVkVORE9SX0lEX0JST0FEQ09NCTB4MGE1YwogI2RlZmluZSBCUkNNX1VTQl9WRU5ET1JfSURfTEcJCTB4MDQzZQorI2RlZmluZSBCUkNNX1VTQl9WRU5ET1JfSURfTElOS1NZUwkweDEzYjEKICNkZWZpbmUgQlJDTV9QQ0lFX1ZFTkRPUl9JRF9CUk9BRENPTQlQQ0lfVkVORE9SX0lEX0JST0FEQ09NCiAKIC8qIENoaXBjb21tb24gQ29yZSBDaGlwIElEcyAqLwpAQCAtNTgsNiArNTksNyBAQAogCiAvKiBVU0IgRGV2aWNlIElEcyAqLwogI2RlZmluZSBCUkNNX1VTQl80MzE0M19ERVZJQ0VfSUQJMHhiZDFlCisjZGVmaW5lIEJSQ01fVVNCXzQzMjM1X0xJTktTWVNfREVWSUNFX0lECTB4MDAzOQogI2RlZmluZSBCUkNNX1VTQl80MzIzNl9ERVZJQ0VfSUQJMHhiZDE3CiAjZGVmaW5lIEJSQ01fVVNCXzQzMjQyX0RFVklDRV9JRAkweGJkMWYKICNkZWZpbmUgQlJDTV9VU0JfNDMyNDJfTEdfREVWSUNFX0lECTB4MzEwMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsZWdhY3kvMzk0NS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsZWdhY3kvMzk0NS5jCmluZGV4IDIwOWRjOTkuLjRkYjMyN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bGVnYWN5LzM5NDUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2xlZ2FjeS8zOTQ1LmMKQEAgLTI2NzEsNyArMjY3MSw3IEBACiAJLnNlbmRfbGVkX2NtZCA9IGlsMzk0NV9zZW5kX2xlZF9jbWQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGlsX2NmZyBpbDM5NDVfYmdfY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9jZmcgaWwzOTQ1X2JnX2NmZyA9IHsKIAkubmFtZSA9ICIzOTQ1QkciLAogCS5md19uYW1lX3ByZSA9IElMMzk0NV9GV19QUkUsCiAJLnVjb2RlX2FwaV9tYXggPSBJTDM5NDVfVUNPREVfQVBJX01BWCwKQEAgLTI3MDAsNyArMjcwMCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaWxfY2ZnIGlsMzk0NV9hYmdfY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9jZmcgaWwzOTQ1X2FiZ19jZmcgPSB7CiAJLm5hbWUgPSAiMzk0NUFCRyIsCiAJLmZ3X25hbWVfcHJlID0gSUwzOTQ1X0ZXX1BSRSwKIAkudWNvZGVfYXBpX21heCA9IElMMzk0NV9VQ09ERV9BUElfTUFYLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsZWdhY3kvY29tbW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2xlZ2FjeS9jb21tb24uaAppbmRleCA3MjZlZGUzLi4zYmJhNTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2xlZ2FjeS9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2xlZ2FjeS9jb21tb24uaApAQCAtMTMyMCw3ICsxMzIwLDcgQEAKIAl1NjQgdGltZXN0YW1wOwogCiAJdW5pb24gewotI2lmIGRlZmluZWQoQ09ORklHX0lXTDM5NDUpIHx8IGRlZmluZWQoQ09ORklHX0lXTDM5NDVfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lXTDM5NDUpCiAJCXN0cnVjdCB7CiAJCQl2b2lkICpzaGFyZWRfdmlydDsKIAkJCWRtYV9hZGRyX3Qgc2hhcmVkX3BoeXM7CkBAIC0xMzUxLDcgKzEzNTEsNyBAQAogCiAJCX0gXzM5NDU7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19JV0w0OTY1KSB8fCBkZWZpbmVkKENPTkZJR19JV0w0OTY1X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JV0w0OTY1KQogCQlzdHJ1Y3QgewogCQkJc3RydWN0IGlsX3J4X3BoeV9yZXMgbGFzdF9waHlfcmVzOwogCQkJYm9vbCBsYXN0X3BoeV9yZXNfdmFsaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2R2bS91Y29kZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9kdm0vdWNvZGUuYwppbmRleCBiNjYyY2YzLi5jNzUwOWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2R2bS91Y29kZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvZHZtL3Vjb2RlLmMKQEAgLTQ2LDE1ICs0Niw2IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgZndfaW1nICoKLWl3bF9nZXRfdWNvZGVfaW1hZ2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LCBlbnVtIGl3bF91Y29kZV90eXBlIHVjb2RlX3R5cGUpCi17Ci0JaWYgKHVjb2RlX3R5cGUgPj0gSVdMX1VDT0RFX1RZUEVfTUFYKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiAmcHJpdi0+ZnctPmltZ1t1Y29kZV90eXBlXTsKLX0KLQogLyoKICAqICBDYWxpYnJhdGlvbgogICovCkBAIC0zMzAsNyArMzIxLDcgQEAKIAllbnVtIGl3bF91Y29kZV90eXBlIG9sZF90eXBlOwogCXN0YXRpYyBjb25zdCB1MTYgYWxpdmVfY21kW10gPSB7IFJFUExZX0FMSVZFIH07CiAKLQlmdyA9IGl3bF9nZXRfdWNvZGVfaW1hZ2UocHJpdiwgdWNvZGVfdHlwZSk7CisJZncgPSBpd2xfZ2V0X3Vjb2RlX2ltYWdlKHByaXYtPmZ3LCB1Y29kZV90eXBlKTsKIAlpZiAoV0FSTl9PTighZncpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtNzAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtNzAwMC5jCmluZGV4IDY0NjkwYzE0Li5kNGI3M2RlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC03MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtNzAwMC5jCkBAIC03MywxMyArNzMsMTMgQEAKIC8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCiAjZGVmaW5lIElXTDcyNjBfVUNPREVfQVBJX01BWAkxNwogI2RlZmluZSBJV0w3MjY1X1VDT0RFX0FQSV9NQVgJMTcKLSNkZWZpbmUgSVdMNzI2NURfVUNPREVfQVBJX01BWAkyNAotI2RlZmluZSBJV0wzMTY4X1VDT0RFX0FQSV9NQVgJMjQKKyNkZWZpbmUgSVdMNzI2NURfVUNPREVfQVBJX01BWAkyNgorI2RlZmluZSBJV0wzMTY4X1VDT0RFX0FQSV9NQVgJMjYKIAogLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w3MjYwX1VDT0RFX0FQSV9NSU4JMTYKLSNkZWZpbmUgSVdMNzI2NV9VQ09ERV9BUElfTUlOCTE2Ci0jZGVmaW5lIElXTDcyNjVEX1VDT0RFX0FQSV9NSU4JMTYKKyNkZWZpbmUgSVdMNzI2MF9VQ09ERV9BUElfTUlOCTE3CisjZGVmaW5lIElXTDcyNjVfVUNPREVfQVBJX01JTgkxNworI2RlZmluZSBJV0w3MjY1RF9VQ09ERV9BUElfTUlOCTE3CiAjZGVmaW5lIElXTDMxNjhfVUNPREVfQVBJX01JTgkyMAogCiAvKiBOVk0gdmVyc2lvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTgwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTgwMDAuYwppbmRleCA2YzY3MjVlLi5kMDJjYTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC04MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtODAwMC5jCkBAIC03MCwxMSArNzAsMTEgQEAKICNpbmNsdWRlICJpd2wtYWduLWh3LmgiCiAKIC8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDgwMDBfVUNPREVfQVBJX01BWAkyNAotI2RlZmluZSBJV0w4MjY1X1VDT0RFX0FQSV9NQVgJMjQKKyNkZWZpbmUgSVdMODAwMF9VQ09ERV9BUElfTUFYCTI2CisjZGVmaW5lIElXTDgyNjVfVUNPREVfQVBJX01BWAkyNgogCiAvKiBMb3dlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDgwMDBfVUNPREVfQVBJX01JTgkxNgorI2RlZmluZSBJV0w4MDAwX1VDT0RFX0FQSV9NSU4JMTcKICNkZWZpbmUgSVdMODI2NV9VQ09ERV9BUElfTUlOCTIwCiAKIC8qIE5WTSB2ZXJzaW9ucyAqLwpAQCAtMjEyLDYgKzIxMiwxNyBAQAogCS52aHRfbXVfbWltb19zdXBwb3J0ZWQgPSB0cnVlLAogfTsKIAorY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsODI3NV8yYWNfY2ZnID0geworCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA4Mjc1IiwKKwkuZndfbmFtZV9wcmUgPSBJV0w4MjY1X0ZXX1BSRSwKKwlJV0xfREVWSUNFXzgyNjUsCisJLmh0X3BhcmFtcyA9ICZpd2w4MDAwX2h0X3BhcmFtcywKKwkubnZtX3ZlciA9IElXTDgwMDBfTlZNX1ZFUlNJT04sCisJLm52bV9jYWxpYl92ZXIgPSBJV0w4MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorCS52aHRfbXVfbWltb19zdXBwb3J0ZWQgPSB0cnVlLAorfTsKKwogY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNDE2NV8yYWNfY2ZnID0gewogCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA0MTY1IiwKIAkuZndfbmFtZV9wcmUgPSBJV0w4MDAwX0ZXX1BSRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTkwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLTkwMDAuYwppbmRleCBmYmFmNzA1Li5mZjg1MDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC05MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtOTAwMC5jCkBAIC01NSwxMCArNTUsMTAgQEAKICNpbmNsdWRlICJpd2wtYWduLWh3LmgiCiAKIC8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDkwMDBfVUNPREVfQVBJX01BWAkyNAorI2RlZmluZSBJV0w5MDAwX1VDT0RFX0FQSV9NQVgJMjYKIAogLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w5MDAwX1VDT0RFX0FQSV9NSU4JMTYKKyNkZWZpbmUgSVdMOTAwMF9VQ09ERV9BUElfTUlOCTE3CiAKIC8qIE5WTSB2ZXJzaW9ucyAqLwogI2RlZmluZSBJV0w5MDAwX05WTV9WRVJTSU9OCQkweDBhMWQKQEAgLTcyLDE1ICs3MiwxNSBAQAogI2RlZmluZSBJV0w5MDAwX1NNRU1fT0ZGU0VUCQkweDQwMDAwMAogI2RlZmluZSBJV0w5MDAwX1NNRU1fTEVOCQkweDY4MDAwCiAKLSNkZWZpbmUgIElXTDkwMDBfRldfUFJFICJpd2x3aWZpLTkwMDAtcHUtYTAtbGMtYTAtIgorI2RlZmluZSAgSVdMOTAwMF9GV19QUkUgIml3bHdpZmktOTAwMC1wdS1hMC1qZi1hMC0iCiAjZGVmaW5lICBJV0w5MjYwX0ZXX1BSRSAiaXdsd2lmaS05MjYwLXRoLWEwLWpmLWEwLSIKLSNkZWZpbmUgIElXTDkyNjBMQ19GV19QUkUgIml3bHdpZmktOTI2MC10aC1hMC1sYy1hMC0iCisjZGVmaW5lICBJV0w5MDAwTENfRldfUFJFICJpd2x3aWZpLTkwMDAtcHUtYTAtbGMtYTAtIgogI2RlZmluZSBJV0w5MDAwX01PRFVMRV9GSVJNV0FSRShhcGkpIFwKIAlJV0w5MDAwX0ZXX1BSRSAiLSIgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgogI2RlZmluZSBJV0w5MjYwX01PRFVMRV9GSVJNV0FSRShhcGkpIFwKIAlJV0w5MjYwX0ZXX1BSRSAiLSIgX19zdHJpbmdpZnkoYXBpKSAiLnVjb2RlIgotI2RlZmluZSBJV0w5MjYwTENfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgXAotCUlXTDkyNjBMQ19GV19QUkUgIi0iIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKKyNkZWZpbmUgSVdMOTAwMExDX01PRFVMRV9GSVJNV0FSRShhcGkpIFwKKwlJV0w5MDAwTENfRldfUFJFICItIiBfX3N0cmluZ2lmeShhcGkpICIudWNvZGUiCiAKICNkZWZpbmUgTlZNX0hXX1NFQ1RJT05fTlVNX0ZBTUlMWV85MDAwCQkxMAogCkBAIC0xNDYsNDEgKzE0Niw3MyBAQAogCS5tYWNfYWRkcl9mcm9tX2NzciA9IHRydWUsCQkJCQlcCiAJLnJmX2lkID0gdHJ1ZQogCitjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5MTYwXzJhY19jZmcgPSB7CisJLm5hbWUgPSAiSW50ZWwoUikgRHVhbCBCYW5kIFdpcmVsZXNzIEFDIDkxNjAiLAorCS5md19uYW1lX3ByZSA9IElXTDkyNjBfRldfUFJFLAorCUlXTF9ERVZJQ0VfOTAwMCwKKwkuaHRfcGFyYW1zID0gJml3bDkwMDBfaHRfcGFyYW1zLAorCS5udm1fdmVyID0gSVdMOTAwMF9OVk1fVkVSU0lPTiwKKwkubnZtX2NhbGliX3ZlciA9IElXTDkwMDBfVFhfUE9XRVJfVkVSU0lPTiwKKwkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEssCit9OworCiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5MjYwXzJhY19jZmcgPSB7Ci0JCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA5MjYwIiwKLQkJLmZ3X25hbWVfcHJlID0gSVdMOTI2MF9GV19QUkUsCi0JCUlXTF9ERVZJQ0VfOTAwMCwKLQkJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKLQkJLm52bV92ZXIgPSBJV0w5MDAwX05WTV9WRVJTSU9OLAotCQkubnZtX2NhbGliX3ZlciA9IElXTDkwMDBfVFhfUE9XRVJfVkVSU0lPTiwKLQkJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA5MjYwIiwKKwkuZndfbmFtZV9wcmUgPSBJV0w5MjYwX0ZXX1BSRSwKKwlJV0xfREVWSUNFXzkwMDAsCisJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKKwkubnZtX3ZlciA9IElXTDkwMDBfTlZNX1ZFUlNJT04sCisJLm52bV9jYWxpYl92ZXIgPSBJV0w5MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorfTsKKworY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTI3MF8yYWNfY2ZnID0geworCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA5MjcwIiwKKwkuZndfbmFtZV9wcmUgPSBJV0w5MjYwX0ZXX1BSRSwKKwlJV0xfREVWSUNFXzkwMDAsCisJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKKwkubnZtX3ZlciA9IElXTDkwMDBfTlZNX1ZFUlNJT04sCisJLm52bV9jYWxpYl92ZXIgPSBJV0w5MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorfTsKKworY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTQ2MF8yYWNfY2ZnID0geworCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA5NDYwIiwKKwkuZndfbmFtZV9wcmUgPSBJV0w5MDAwX0ZXX1BSRSwKKwlJV0xfREVWSUNFXzkwMDAsCisJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKKwkubnZtX3ZlciA9IElXTDkwMDBfTlZNX1ZFUlNJT04sCisJLm52bV9jYWxpYl92ZXIgPSBJV0w5MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorCS5pbnRlZ3JhdGVkID0gdHJ1ZSwKK307CisKK2NvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDk1NjBfMmFjX2NmZyA9IHsKKwkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgOTU2MCIsCisJLmZ3X25hbWVfcHJlID0gSVdMOTAwMF9GV19QUkUsCisJSVdMX0RFVklDRV85MDAwLAorCS5odF9wYXJhbXMgPSAmaXdsOTAwMF9odF9wYXJhbXMsCisJLm52bV92ZXIgPSBJV0w5MDAwX05WTV9WRVJTSU9OLAorCS5udm1fY2FsaWJfdmVyID0gSVdMOTAwMF9UWF9QT1dFUl9WRVJTSU9OLAorCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKKwkuaW50ZWdyYXRlZCA9IHRydWUsCiB9OwogCiAvKgogICogVE9ETyB0aGUgc3RydWN0IGJlbG93IGlzIGZvciBpbnRlcm5hbCB0ZXN0aW5nIG9ubHkgdGhpcyBzaG91bGQgYmUKICAqIHJlbW92ZWQgYnkgRU8gMjAxNn4KICAqLwotY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTI2MGxjXzJhY19jZmcgPSB7Ci0JCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA5MjYwIiwKLQkJLmZ3X25hbWVfcHJlID0gSVdMOTI2MExDX0ZXX1BSRSwKLQkJSVdMX0RFVklDRV85MDAwLAotCQkuaHRfcGFyYW1zID0gJml3bDkwMDBfaHRfcGFyYW1zLAotCQkubnZtX3ZlciA9IElXTDkwMDBfTlZNX1ZFUlNJT04sCi0JCS5udm1fY2FsaWJfdmVyID0gSVdMOTAwMF9UWF9QT1dFUl9WRVJTSU9OLAotCQkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEssCi19OwotCi1jb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w1MTY1XzJhY19jZmcgPSB7Ci0JCS5uYW1lID0gIkludGVsKFIpIER1YWwgQmFuZCBXaXJlbGVzcyBBQyA1MTY1IiwKLQkJLmZ3X25hbWVfcHJlID0gSVdMOTAwMF9GV19QUkUsCi0JCUlXTF9ERVZJQ0VfOTAwMCwKLQkJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKLQkJLm52bV92ZXIgPSBJV0w5MDAwX05WTV9WRVJTSU9OLAotCQkubnZtX2NhbGliX3ZlciA9IElXTDkwMDBfVFhfUE9XRVJfVkVSU0lPTiwKLQkJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAotCQkuaW50ZWdyYXRlZCA9IHRydWUsCitjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5MDAwbGNfMmFjX2NmZyA9IHsKKwkubmFtZSA9ICJJbnRlbChSKSBEdWFsIEJhbmQgV2lyZWxlc3MgQUMgOTAwMCIsCisJLmZ3X25hbWVfcHJlID0gSVdMOTAwMExDX0ZXX1BSRSwKKwlJV0xfREVWSUNFXzkwMDAsCisJLmh0X3BhcmFtcyA9ICZpd2w5MDAwX2h0X3BhcmFtcywKKwkubnZtX3ZlciA9IElXTDkwMDBfTlZNX1ZFUlNJT04sCisJLm52bV9jYWxpYl92ZXIgPSBJV0w5MDAwX1RYX1BPV0VSX1ZFUlNJT04sCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAorCS5pbnRlZ3JhdGVkID0gdHJ1ZSwKIH07CiAKIE1PRFVMRV9GSVJNV0FSRShJV0w5MDAwX01PRFVMRV9GSVJNV0FSRShJV0w5MDAwX1VDT0RFX0FQSV9NQVgpKTsKIE1PRFVMRV9GSVJNV0FSRShJV0w5MjYwX01PRFVMRV9GSVJNV0FSRShJV0w5MDAwX1VDT0RFX0FQSV9NQVgpKTsKLU1PRFVMRV9GSVJNV0FSRShJV0w5MjYwTENfTU9EVUxFX0ZJUk1XQVJFKElXTDkwMDBfVUNPREVfQVBJX01BWCkpOworTU9EVUxFX0ZJUk1XQVJFKElXTDkwMDBMQ19NT0RVTEVfRklSTVdBUkUoSVdMOTAwMF9VQ09ERV9BUElfTUFYKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1hMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1hMDAwLmMKaW5kZXggNGQ3ODIzMi4uZWExNjE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtYTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWEwMDAuYwpAQCAtNTUsNyArNTUsNyBAQAogI2luY2x1ZGUgIml3bC1hZ24taHcuaCIKIAogLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgSVdMX0EwMDBfVUNPREVfQVBJX01BWAkyNAorI2RlZmluZSBJV0xfQTAwMF9VQ09ERV9BUElfTUFYCTI2CiAKIC8qIExvd2VzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KICNkZWZpbmUgSVdMX0EwMDBfVUNPREVfQVBJX01JTgkyNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtY29uZmlnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jb25maWcuaAppbmRleCA0MjNiMjMzLi4yNjYwY2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jb25maWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jb25maWcuaApAQCAtMzU5LDcgKzM1OSw2IEBACiAJICAgIGhpZ2hfdGVtcDoxLAogCSAgICBtYWNfYWRkcl9mcm9tX2NzcjoxLAogCSAgICBscF94dGFsX3dvcmthcm91bmQ6MSwKLQkgICAgbm9fcG93ZXJfdXBfbmljX2luX2luaXQ6MSwKIAkgICAgZGlzYWJsZV9kdW1teV9ub3RpZmljYXRpb246MSwKIAkgICAgYXBtZ19ub3Rfc3VwcG9ydGVkOjEsCiAJICAgIG1xX3J4X3N1cHBvcnRlZDoxLApAQCAtNDQ1LDEzICs0NDQsMTcgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w4MjYwXzJuX2NmZzsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w4MjYwXzJhY19jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsODI2NV8yYWNfY2ZnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDgyNzVfMmFjX2NmZzsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w0MTY1XzJhY19jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsODI2MF8yYWNfc2Rpb19jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsODI2NV8yYWNfc2Rpb19jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNDE2NV8yYWNfc2Rpb19jZmc7CitleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTAwMGxjXzJhY19jZmc7CitleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTE2MF8yYWNfY2ZnOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDkyNjBfMmFjX2NmZzsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5MjYwbGNfMmFjX2NmZzsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w1MTY1XzJhY19jZmc7CitleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsOTI3MF8yYWNfY2ZnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDk0NjBfMmFjX2NmZzsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w5NTYwXzJhY19jZmc7CiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsYTAwMF8yYWNfY2ZnOwogI2VuZGlmIC8qIENPTkZJR19JV0xNVk0gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtY3NyLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jc3IuaAppbmRleCA4NzFhZDAyLi5kNzNlOWQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jc3IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1jc3IuaApAQCAtNTg5LDYgKzU4OSw4IEBACiAgKiBDYXVzZXMgZm9yIHRoZSBGSCByZWdpc3RlciBpbnRlcnJ1cHRzCiAgKi8KIGVudW0gbXNpeF9maF9pbnRfY2F1c2VzIHsKKwlNU0lYX0ZIX0lOVF9DQVVTRVNfUTAJCQk9IEJJVCgwKSwKKwlNU0lYX0ZIX0lOVF9DQVVTRVNfUTEJCQk9IEJJVCgxKSwKIAlNU0lYX0ZIX0lOVF9DQVVTRVNfRDJTX0NIMF9OVU0JCT0gQklUKDE2KSwKIAlNU0lYX0ZIX0lOVF9DQVVTRVNfRDJTX0NIMV9OVU0JCT0gQklUKDE3KSwKIAlNU0lYX0ZIX0lOVF9DQVVTRVNfUzJECQkJPSBCSVQoMTkpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZGV2dHJhY2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWRldnRyYWNlLmMKaW5kZXggMWQ5ZGQxNTMuLjUwNTEwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWRldnRyYWNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZGV2dHJhY2UuYwpAQCAtMzMsOSArMzMsNiBAQAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSAiaXdsLWRldnRyYWNlLmgiCiAKLUVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2Rldl9pb3dyaXRlOCk7Ci1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9kZXZfaW9yZWFkMzIpOwotRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfZGV2X2lvd3JpdGUzMik7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9kZXZfdWNvZGVfZXZlbnQpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfZGV2X3Vjb2RlX2Vycm9yKTsKIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2Rldl91Y29kZV9jb250X2V2ZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1maC5oCmluZGV4IDFkNmY1ZDIuLjMzZWY1MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZoLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZmguaApAQCAtNzcsNyArNzcsNiBAQAogICovCiAjZGVmaW5lIEZIX01FTV9MT1dFUl9CT1VORCAgICAgICAgICAgICAgICAgICAoMHgxMDAwKQogI2RlZmluZSBGSF9NRU1fVVBQRVJfQk9VTkQgICAgICAgICAgICAgICAgICAgKDB4MjAwMCkKLSNkZWZpbmUgVEZIX01FTV9MT1dFUl9CT1VORCAgICAgICAgICAgICAgICAgICgweEEwNjAwMCkKIAogLyoqCiAgKiBLZWVwLVdhcm0gKEtXKSBidWZmZXIgYmFzZSBhZGRyZXNzLgpAQCAtMTIwLDcgKzExOSw3IEBACiAjZGVmaW5lIEZIX01FTV9DQkJDXzIwXzMxX0xPV0VSX0JPVU5ECQkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhCMjApCiAjZGVmaW5lIEZIX01FTV9DQkJDXzIwXzMxX1VQUEVSX0JPVU5ECQkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhCODApCiAvKiBhMDAwIFRGRCB0YWJsZSBhZGRyZXNzLCA2NCBiaXQgKi8KLSNkZWZpbmUgVEZIX1RGRFFfQ0JCX1RBQkxFCQkJKFRGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDFDMDApCisjZGVmaW5lIFRGSF9URkRRX0NCQl9UQUJMRQkJCSgweDFDMDApCiAKIC8qIEZpbmQgVEZEIENCIGJhc2UgcG9pbnRlciBmb3IgZ2l2ZW4gcXVldWUgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IEZIX01FTV9DQkJDX1FVRVVFKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLApAQCAtMTU2LDcgKzE1NSw3IEBACiAgKiBJbiBjYXNlIG9mIERSQU0gcmVhZCBhZGRyZXNzIHdoaWNoIGlzIG5vdCBhbGlnbmVkIHRvIDEyOEIsIHRoZSBURkggd2lsbAogICogZW5hYmxlIHRyYW5zZmVyIHNpemUgd2hpY2ggZG9lc24ndCBjcm9zcyA2NEIgRFJBTSBhZGRyZXNzIGJvdW5kYXJ5LgogKi8KLSNkZWZpbmUgVEZIX1RSQU5TRkVSX01PREUJCShURkhfTUVNX0xPV0VSX0JPVU5EICsgMHgxRjQwKQorI2RlZmluZSBURkhfVFJBTlNGRVJfTU9ERQkJKDB4MUY0MCkKICNkZWZpbmUgVEZIX1RSQU5TRkVSX01BWF9QRU5ESU5HX1JFUQkweGMKICNkZWZpbmUgVEZIX0NIVU5LX1NJWkVfMTI4CQkJQklUKDgpCiAjZGVmaW5lIFRGSF9DSFVOS19TUExJVF9NT0RFCQlCSVQoMTApCkBAIC0xNjcsNyArMTY2LDcgQEAKICAqIHRoZSBzdGFydCBvZiB0aGUgVEZEIGZpcnN0IFRCLgogICogSW4gY2FzZSBvZiBhIERSQU0gVHggQ01EIHVwZGF0ZSB0aGUgVEZIIHdpbGwgdXBkYXRlIFBOIGFuZCBLZXkgSUQKICAqLwotI2RlZmluZSBURkhfVFhDTURfVVBEQVRFX0NGRwkJKFRGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDFGNDgpCisjZGVmaW5lIFRGSF9UWENNRF9VUERBVEVfQ0ZHCQkoMHgxRjQ4KQogLyoKICAqIENvbnRyb2xzIFRYIERNQSBvcGVyYXRpb24KICAqCkBAIC0xODEsMjIgKzE4MCwyMiBAQAogICogc2V0IHRvIDEgLSBpbnRlcnJ1cHQgaXMgc2VudCB0byB0aGUgZHJpdmVyCiAgKiBCaXQgMDogSW5kaWNhdGVzIHRoZSBzbm9vcCBjb25maWd1cmF0aW9uCiAqLwotI2RlZmluZSBURkhfU1JWX0RNQV9DSE5MMF9DVFJMCShURkhfTUVNX0xPV0VSX0JPVU5EICsgMHgxRjYwKQorI2RlZmluZSBURkhfU1JWX0RNQV9DSE5MMF9DVFJMCSgweDFGNjApCiAjZGVmaW5lIFRGSF9TUlZfRE1BX1NOT09QCUJJVCgwKQogI2RlZmluZSBURkhfU1JWX0RNQV9UT19EUklWRVIJQklUKDI0KQogI2RlZmluZSBURkhfU1JWX0RNQV9TVEFSVAlCSVQoMzEpCiAKIC8qIERlZmluZXMgdGhlIERNQSBTUkFNIHdyaXRlIHN0YXJ0IGFkZHJlc3MgdG8gdHJhbnNmZXIgYSBkYXRhIGJsb2NrICovCi0jZGVmaW5lIFRGSF9TUlZfRE1BX0NITkwwX1NSQU1fQUREUgkoVEZIX01FTV9MT1dFUl9CT1VORCArIDB4MUY2NCkKKyNkZWZpbmUgVEZIX1NSVl9ETUFfQ0hOTDBfU1JBTV9BRERSCSgweDFGNjQpCiAKIC8qIERlZmluZXMgdGhlIDY0Yml0cyBEUkFNIHN0YXJ0IGFkZHJlc3MgdG8gcmVhZCB0aGUgRE1BIGRhdGEgYmxvY2sgZnJvbSAqLwotI2RlZmluZSBURkhfU1JWX0RNQV9DSE5MMF9EUkFNX0FERFIJKFRGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDFGNjgpCisjZGVmaW5lIFRGSF9TUlZfRE1BX0NITkwwX0RSQU1fQUREUgkoMHgxRjY4KQogCiAvKgogICogRGVmaW5lcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHRyYW5zZmVyIGZyb20gRFJBTSB0byBTUkFNLgogICogTm90ZSB0aGF0IHRoaXMgcmVnaXN0ZXIgbWF5IGJlIGNvbmZpZ3VyZWQgd2l0aCBub24tZHdvcmQgYWxpZ25lZCBzaXplLgogICovCi0jZGVmaW5lIFRGSF9TUlZfRE1BX0NITkwwX0JDCShURkhfTUVNX0xPV0VSX0JPVU5EICsgMHgxRjcwKQorI2RlZmluZSBURkhfU1JWX0RNQV9DSE5MMF9CQwkoMHgxRjcwKQogCiAvKioKICAqIFJ4IFNSQU0gQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVycyAoUlNDU1IpCkBAIC02NDQsNiArNjQzLDcgQEAKICNkZWZpbmUgVEZEX1FVRVVFX0JDX1NJWkUJKFRGRF9RVUVVRV9TSVpFX01BWCArIFRGRF9RVUVVRV9TSVpFX0JDX0RVUCkKICNkZWZpbmUgSVdMX1RYX0RNQV9NQVNLICAgICAgICBETUFfQklUX01BU0soMzYpCiAjZGVmaW5lIElXTF9OVU1fT0ZfVEJTCQkyMAorI2RlZmluZSBJV0xfVEZIX05VTV9UQlMJCTI1CiAKIHN0YXRpYyBpbmxpbmUgdTggaXdsX2dldF9kbWFfaGlfYWRkcihkbWFfYWRkcl90IGFkZHIpCiB7CkBAIC02NjUsMjUgKzY2NSwyOSBAQAogfSBfX3BhY2tlZDsKIAogLyoqCi0gKiBzdHJ1Y3QgaXdsX3RmZAorICogc3RydWN0IGl3bF90ZmhfdGIgdHJhbnNtaXQgYnVmZmVyIGRlc2NyaXB0b3Igd2l0aGluIHRyYW5zbWl0IGZyYW1lIGRlc2NyaXB0b3IKICAqCi0gKiBUcmFuc21pdCBGcmFtZSBEZXNjcmlwdG9yIChURkQpCisgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBkbWEgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRyYW5zbWlzc2lvbiBhZGRyZXNzCiAgKgotICogQCBfX3Jlc2VydmVkMVszXSByZXNlcnZlZAotICogQCBudW1fdGJzIDAtNCBudW1iZXIgb2YgYWN0aXZlIHRicwotICoJICAgICA1ICAgcmVzZXJ2ZWQKLSAqIAkgICAgIDYtNyBwYWRkaW5nIChub3QgdXNlZCkKLSAqIEAgdGJzWzIwXQl0cmFuc21pdCBmcmFtZSBidWZmZXIgZGVzY3JpcHRvcnMKLSAqIEAgX19wYWQgCXBhZGRpbmcKLSAqCisgKiBAdGJfbGVuIGxlbmd0aCBvZiB0aGUgdHggYnVmZmVyCisgKiBAYWRkciA2NCBiaXRzIGRtYSBhZGRyZXNzCisgKi8KK3N0cnVjdCBpd2xfdGZoX3RiIHsKKwlfX2xlMTYgdGJfbGVuOworCV9fbGU2NCBhZGRyOworfSBfX3BhY2tlZDsKKworLyoqCiAgKiBFYWNoIFR4IHF1ZXVlIHVzZXMgYSBjaXJjdWxhciBidWZmZXIgb2YgMjU2IFRGRHMgc3RvcmVkIGluIGhvc3QgRFJBTS4KICAqIEJvdGggZHJpdmVyIGFuZCBkZXZpY2Ugc2hhcmUgdGhlc2UgY2lyY3VsYXIgYnVmZmVycywgZWFjaCBvZiB3aGljaCBtdXN0IGJlCi0gKiBjb250aWd1b3VzIDI1NiBURkRzIHggMTI4IGJ5dGVzLXBlci1URkQgPSAzMiBLQnl0ZXMKKyAqIGNvbnRpZ3VvdXMgMjU2IFRGRHMuCisgKiBGb3IgcHJlIGEwMDAgSFcgaXQgaXMgMjU2IHggMTI4IGJ5dGVzLXBlci1URkQgPSAzMiBLQnl0ZXMKKyAqIEZvciBhMDAwIEhXIGFuZCBvbiBpdCBpcyAyNTYgeCAyNTYgYnl0ZXMtcGVyLVRGRCA9IDY1IEtCeXRlcwogICoKICAqIERyaXZlciBtdXN0IGluZGljYXRlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBiYXNlIG9mIGVhY2gKICAqIGNpcmN1bGFyIGJ1ZmZlciB2aWEgdGhlIEZIX01FTV9DQkJDX1FVRVVFIHJlZ2lzdGVycy4KICAqCi0gKiBFYWNoIFRGRCBjb250YWlucyBwb2ludGVyL3NpemUgaW5mb3JtYXRpb24gZm9yIHVwIHRvIDIwIGRhdGEgYnVmZmVycworICogRWFjaCBURkQgY29udGFpbnMgcG9pbnRlci9zaXplIGluZm9ybWF0aW9uIGZvciB1cCB0byAyMCAvIDI1IGRhdGEgYnVmZmVycwogICogaW4gaG9zdCBEUkFNLiAgVGhlc2UgYnVmZmVycyBjb2xsZWN0aXZlbHkgY29udGFpbiB0aGUgKG9uZSkgZnJhbWUgZGVzY3JpYmVkCiAgKiBieSB0aGUgVEZELiAgRWFjaCBidWZmZXIgbXVzdCBiZSBhIHNpbmdsZSBjb250aWd1b3VzIGJsb2NrIG9mIG1lbW9yeSB3aXRoaW4KICAqIGl0c2VsZiwgYnV0IGJ1ZmZlcnMgbWF5IGJlIHNjYXR0ZXJlZCBpbiBob3N0IERSQU0uICBFYWNoIGJ1ZmZlciBoYXMgbWF4IHNpemUKQEAgLTY5Miw2ICs2OTYsMTYgQEAKICAqCiAgKiBBIG1heGltdW0gb2YgMjU1IChub3QgMjU2ISkgVEZEcyBtYXkgYmUgb24gYSBxdWV1ZSB3YWl0aW5nIGZvciBUeC4KICAqLworCisvKioKKyAqIHN0cnVjdCBpd2xfdGZkIC0gVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAoVEZEKQorICogQCBfX3Jlc2VydmVkMVszXSByZXNlcnZlZAorICogQCBudW1fdGJzIDAtNCBudW1iZXIgb2YgYWN0aXZlIHRicworICoJICAgICA1ICAgcmVzZXJ2ZWQKKyAqCSAgICAgNi03IHBhZGRpbmcgKG5vdCB1c2VkKQorICogQCB0YnNbMjBdCXRyYW5zbWl0IGZyYW1lIGJ1ZmZlciBkZXNjcmlwdG9ycworICogQCBfX3BhZAlwYWRkaW5nCisgKi8KIHN0cnVjdCBpd2xfdGZkIHsKIAl1OCBfX3Jlc2VydmVkMVszXTsKIAl1OCBudW1fdGJzOwpAQCAtNjk5LDYgKzcxMywxOSBAQAogCV9fbGUzMiBfX3BhZDsKIH0gX19wYWNrZWQ7CiAKKy8qKgorICogc3RydWN0IGl3bF90ZmhfdGZkIC0gVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAoVEZEKQorICogQCBudW1fdGJzIDAtNCBudW1iZXIgb2YgYWN0aXZlIHRicworICoJICAgICA1IC0xNSAgIHJlc2VydmVkCisgKiBAIHRic1syNV0JdHJhbnNtaXQgZnJhbWUgYnVmZmVyIGRlc2NyaXB0b3JzCisgKiBAIF9fcGFkCXBhZGRpbmcKKyAqLworc3RydWN0IGl3bF90ZmhfdGZkIHsKKwlfX2xlMTYgbnVtX3RiczsKKwlzdHJ1Y3QgaXdsX3RmaF90YiB0YnNbSVdMX1RGSF9OVU1fVEJTXTsKKwlfX2xlMzIgX19wYWQ7Cit9IF9fcGFja2VkOworCiAvKiBLZWVwIFdhcm0gU2l6ZSAqLwogI2RlZmluZSBJV0xfS1dfU0laRSAweDEwMDAJLyogNGsgKi8KIApAQCAtNzA3LDggKzczNCwxMyBAQAogLyoqCiAgKiBzdHJ1Y3QgaXdsYWduX3NjaGVkcV9iY190Ymwgc2NoZWR1bGVyIGJ5dGUgY291bnQgdGFibGUKICAqCWJhc2UgcGh5c2ljYWwgYWRkcmVzcyBwcm92aWRlZCBieSBTQ0RfRFJBTV9CQVNFX0FERFIKKyAqIEZvciBkZXZpY2VzIHVwIHRvIGEwMDA6CiAgKiBAdGZkX29mZnNldCAgMC0xMiAtIHR4IGNvbW1hbmQgYnl0ZSBjb3VudAotICoJICAgICAgIDEyLTE2IC0gc3RhdGlvbiBpbmRleAorICoJCTEyLTE2IC0gc3RhdGlvbiBpbmRleAorICogRm9yIGEwMDAgYW5kIG9uOgorICogQHRmZF9vZmZzZXQgIDAtMTIgLSB0eCBjb21tYW5kIGJ5dGUgY291bnQKKyAqCQkxMi0xMyAtIG51bWJlciBvZiA2NCBieXRlIGNodW5rcworICoJCTE0LTE2IC0gcmVzZXJ2ZWQKICAqLwogc3RydWN0IGl3bGFnbl9zY2RfYmNfdGJsIHsKIAlfX2xlMTYgdGZkX29mZnNldFtURkRfUVVFVUVfQkNfU0laRV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1mdy1maWxlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1mdy1maWxlLmgKaW5kZXggMWIxZTA0NS4uY2VlYzVjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZnctZmlsZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZ3LWZpbGUuaApAQCAtMTk5LDggKzE5OSw2IEBACiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19ORVdTQ0FOOiBuZXcgdUNvZGUgc2NhbiBiZWhhdmlvciBvbiBoaWRkZW4gU1NJRCwKICAqCXRyZWF0cyBnb29kIENSQyB0aHJlc2hvbGQgYXMgYSBib29sZWFuCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19NRlA6IFRoaXMgdUNvZGUgaW1hZ2Ugc3VwcG9ydHMgTUZQICg4MDIuMTF3KS4KLSAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX1AyUDogVGhpcyB1Q29kZSBpbWFnZSBzdXBwb3J0cyBQMlAuCi0gKiBASVdMX1VDT0RFX1RMVl9GTEFHU19EV19CQ19UQUJMRTogVGhlIFNDRCBieXRlIGNvdW50IHRhYmxlIGlzIGluIERXT1JEUwogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfVUFQU0RfU1VQUE9SVDogVGhpcyB1Q29kZSBpbWFnZSBzdXBwb3J0cyB1QVBTRAogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfU0hPUlRfQkw6IDE2IGVudHJpZXMgb2YgYmxhY2sgbGlzdCBpbnN0ZWFkIG9mIDY0IGluIHNjYW4KICAqCW9mZmxvYWQgcHJvZmlsZSBjb25maWcgY29tbWFuZC4KQEAgLTIxMCwzNiArMjA4LDI0IEBACiAgKglmcm9tIHRoZSBwcm9iZSByZXF1ZXN0IHRlbXBsYXRlLgogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfTkVXX05TT0ZGTF9TTUFMTDogbmV3IE5TIG9mZmxvYWQgKHNtYWxsIHZlcnNpb24pCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19ORVdfTlNPRkZMX0xBUkdFOiBuZXcgTlMgb2ZmbG9hZCAobGFyZ2UgdmVyc2lvbikKLSAqIEBJV0xfVUNPREVfVExWX0ZMQUdTX1AyUF9QTTogUDJQIGNsaWVudCBzdXBwb3J0cyBQTSBhcyBhIHN0YW5kIGFsb25lIE1BQwotICogQElXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX0JTU19QU19EQ006IHN1cHBvcnQgcG93ZXIgc2F2ZSBvbiBCU1Mgc3RhdGlvbiBhbmQKLSAqCVAyUCBjbGllbnQgaW50ZXJmYWNlcyBzaW11bHRhbmVvdXNseSBpZiB0aGV5IGFyZSBpbiBkaWZmZXJlbnQgYmluZGluZ3MuCi0gKiBASVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfQlNTX1BTX1NDTTogc3VwcG9ydCBwb3dlciBzYXZlIG9uIEJTUyBzdGF0aW9uIGFuZAotICoJUDJQIGNsaWVudCBpbnRlcmZhY2VzIHNpbXVsdGFuZW91c2x5IGlmIHRoZXkgYXJlIGluIHNhbWUgYmluZGluZ3MuCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19VQVBTRF9TVVBQT1JUOiBHZW5lcmFsIHN1cHBvcnQgZm9yIHVBUFNECiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUFNfVUFQU0Q6IFAyUCBjbGllbnQgc3VwcG9ydHMgdUFQU0QgcG93ZXIgc2F2ZQogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfQkNBU1RfRklMVEVSSU5HOiB1Q29kZSBzdXBwb3J0cyBicm9hZGNhc3QgZmlsdGVyaW5nLgotICogQElXTF9VQ09ERV9UTFZfRkxBR1NfR09fVUFQU0Q6IEFQL0dPIGludGVyZmFjZXMgc3VwcG9ydCB1QVBTRCBjbGllbnRzCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19FQlNfU1VQUE9SVDogdGhpcyB1Q29kZSBpbWFnZSBzdXBwb3J0cyBFQlMuCiAgKi8KIGVudW0gaXdsX3Vjb2RlX3Rsdl9mbGFnIHsKIAlJV0xfVUNPREVfVExWX0ZMQUdTX1BBTgkJCT0gQklUKDApLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfTkVXU0NBTgkJPSBCSVQoMSksCiAJSVdMX1VDT0RFX1RMVl9GTEFHU19NRlAJCQk9IEJJVCgyKSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX1AyUAkJCT0gQklUKDMpLAotCUlXTF9VQ09ERV9UTFZfRkxBR1NfRFdfQkNfVEFCTEUJCT0gQklUKDQpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfU0hPUlRfQkwJCT0gQklUKDcpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfRDNfNl9JUFY2X0FERFJTCT0gQklUKDEwKSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX05PX0JBU0lDX1NTSUQJPSBCSVQoMTIpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfTkVXX05TT0ZGTF9TTUFMTAk9IEJJVCgxNSksCiAJSVdMX1VDT0RFX1RMVl9GTEFHU19ORVdfTlNPRkZMX0xBUkdFCT0gQklUKDE2KSwKLQlJV0xfVUNPREVfVExWX0ZMQUdTX1AyUF9QTQkJPSBCSVQoMjEpLAotCUlXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19EQ00JPSBCSVQoMjIpLAotCUlXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19TQ00JPSBCSVQoMjMpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfVUFQU0RfU1VQUE9SVAk9IEJJVCgyNCksCiAJSVdMX1VDT0RFX1RMVl9GTEFHU19FQlNfU1VQUE9SVAkJPSBCSVQoMjUpLAogCUlXTF9VQ09ERV9UTFZfRkxBR1NfUDJQX1BTX1VBUFNECT0gQklUKDI2KSwKIAlJV0xfVUNPREVfVExWX0ZMQUdTX0JDQVNUX0ZJTFRFUklORwk9IEJJVCgyOSksCi0JSVdMX1VDT0RFX1RMVl9GTEFHU19HT19VQVBTRAkJPSBCSVQoMzApLAogfTsKIAogdHlwZWRlZiB1bnNpZ25lZCBpbnQgX19iaXR3aXNlX18gaXdsX3Vjb2RlX3Rsdl9hcGlfdDsKQEAgLTI0OSwyNCArMjM1LDIxIEBACiAgKiBASVdMX1VDT0RFX1RMVl9BUElfRlJBR01FTlRFRF9TQ0FOOiBUaGlzIHVjb2RlIHN1cHBvcnRzIGFjdGl2ZSBkd2VsbCB0aW1lCiAgKglsb25nZXIgdGhhbiB0aGUgcGFzc2l2ZSBvbmUsIHdoaWNoIGlzIGVzc2VudGlhbCBmb3IgZnJhZ21lbnRlZCBzY2FuLgogICogQElXTF9VQ09ERV9UTFZfQVBJX1dJRklfTUNDX1VQREFURTogdWNvZGUgc3VwcG9ydHMgTUNDIHVwZGF0ZXMgd2l0aCBzb3VyY2UuCi0gKiBASVdMX1VDT0RFX1RMVl9BUElfV0lERV9DTURfSERSOiB1Y29kZSBzdXBwb3J0cyB3aWRlIGNvbW1hbmQgaGVhZGVyCiAgKiBASVdMX1VDT0RFX1RMVl9BUElfTFFfU1NfUEFSQU1TOiBDb25maWd1cmUgU1RCQy9CRkVSIHZpYSBMUSBDTUQgc3NfcGFyYW1zCiAgKiBASVdMX1VDT0RFX1RMVl9BUElfTkVXX1ZFUlNJT046IG5ldyB2ZXJzaW9uaW5nIGZvcm1hdAotICogQElXTF9VQ09ERV9UTFZfQVBJX0VYVF9TQ0FOX1BSSU9SSVRZOiBzY2FuIEFQSXMgdXNlIDgtbGV2ZWwgcHJpb3JpdHkKLSAqCWluc3RlYWQgb2YgMy4KLSAqIEBJV0xfVUNPREVfVExWX0FQSV9UWF9QT1dFUl9DSEFJTjogVFggcG93ZXIgQVBJIGhhcyBsYXJnZXIgY29tbWFuZCBzaXplCi0gKgkoY29tbWFuZCB2ZXJzaW9uIDMpIHRoYXQgc3VwcG9ydHMgcGVyLWNoYWluIGxpbWl0cworICogQElXTF9VQ09ERV9UTFZfQVBJX1NDQU5fVFNGX1JFUE9SVDogU2NhbiBzdGFydCB0aW1lIHJlcG9ydGVkIGluIHNjYW4KKyAqCWl0ZXJhdGlvbiBjb21wbGV0ZSBub3RpZmljYXRpb24sIGFuZCB0aGUgdGltZXN0YW1wIHJlcG9ydGVkIGZvciBSWAorICoJcmVjZWl2ZWQgZHVyaW5nIHNjYW4sIGFyZSByZXBvcnRlZCBpbiBUU0Ygb2YgdGhlIG1hYyBzcGVjaWZpZWQgaW4gdGhlCisgKglzY2FuIHJlcXVlc3QuCiAgKgogICogQE5VTV9JV0xfVUNPREVfVExWX0FQSTogbnVtYmVyIG9mIGJpdHMgdXNlZAogICovCiBlbnVtIGl3bF91Y29kZV90bHZfYXBpIHsKIAlJV0xfVUNPREVfVExWX0FQSV9GUkFHTUVOVEVEX1NDQU4JPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTgsCiAJSVdMX1VDT0RFX1RMVl9BUElfV0lGSV9NQ0NfVVBEQVRFCT0gKF9fZm9yY2UgaXdsX3Vjb2RlX3Rsdl9hcGlfdCk5LAotCUlXTF9VQ09ERV9UTFZfQVBJX1dJREVfQ01EX0hEUgkJPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTE0LAogCUlXTF9VQ09ERV9UTFZfQVBJX0xRX1NTX1BBUkFNUwkJPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTE4LAotCUlXTF9VQ09ERV9UTFZfQVBJX05FV19WRVJTSU9OICAgICAgICAgICA9IChfX2ZvcmNlIGl3bF91Y29kZV90bHZfYXBpX3QpMjAsCi0JSVdMX1VDT0RFX1RMVl9BUElfRVhUX1NDQU5fUFJJT1JJVFkJPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTI0LAotCUlXTF9VQ09ERV9UTFZfQVBJX1RYX1BPV0VSX0NIQUlOCT0gKF9fZm9yY2UgaXdsX3Vjb2RlX3Rsdl9hcGlfdCkyNywKKwlJV0xfVUNPREVfVExWX0FQSV9ORVdfVkVSU0lPTgkJPSAoX19mb3JjZSBpd2xfdWNvZGVfdGx2X2FwaV90KTIwLAorCUlXTF9VQ09ERV9UTFZfQVBJX1NDQU5fVFNGX1JFUE9SVAk9IChfX2ZvcmNlIGl3bF91Y29kZV90bHZfYXBpX3QpMjgsCiAKIAlOVU1fSVdMX1VDT0RFX1RMVl9BUEkKICNpZmRlZiBfX0NIRUNLRVJfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZncuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWZ3LmgKaW5kZXggNzRlYTY4ZC4uNWYyMjk1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtZncuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1mdy5oCkBAIC0zMjksNCArMzI5LDEzIEBACiAJcmV0dXJuIGNvbmZfdGx2LT51c25pZmZlcjsKIH0KIAorc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgZndfaW1nICoKK2l3bF9nZXRfdWNvZGVfaW1hZ2UoY29uc3Qgc3RydWN0IGl3bF9mdyAqZncsIGVudW0gaXdsX3Vjb2RlX3R5cGUgdWNvZGVfdHlwZSkKK3sKKwlpZiAodWNvZGVfdHlwZSA+PSBJV0xfVUNPREVfVFlQRV9NQVgpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZmdy0+aW1nW3Vjb2RlX3R5cGVdOworfQorCiAjZW5kaWYgIC8qIF9faXdsX2Z3X2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLWlvLmMKaW5kZXggOTJjOGI1Zi4uYTlmNjlmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1pby5jCkBAIC0yNjcsNyArMjY3LDcgQEAKIAkJSVdMX0NNRF9NUShjbWQsIFJGSF9RX0ZSQkRDQl9XSURYLCBpKTsKIAkJSVdMX0NNRF9NUShjbWQsIFJGSF9RX0ZSQkRDQl9SSURYLCBpKTsKIAkJSVdMX0NNRF9NUShjbWQsIFJGSF9RX1VSQkRfU1RUU19XUFRSX0xTQiwgaSk7Ci0JfTsKKwl9CiAKIAlzd2l0Y2ggKGNtZCkgewogCUlXTF9DTUQoUkZIX1JYRl9ETUFfQ0ZHKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLW5vdGlmLXdhaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLW5vdGlmLXdhaXQuYwppbmRleCA4YWExZjJiLi44OGYyNjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1ub3RpZi13YWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbm90aWYtd2FpdC5jCkBAIC05OSw4ICs5OSwxMiBAQAogCQkJCWNvbnRpbnVlOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgdy0+bl9jbWRzOyBpKyspIHsKLQkJCQlpZiAody0+Y21kc1tpXSA9PQotCQkJCSAgICBXSURFX0lEKHBrdC0+aGRyLmdyb3VwX2lkLCBwa3QtPmhkci5jbWQpKSB7CisJCQkJdTE2IHJlY19pZCA9IFdJREVfSUQocGt0LT5oZHIuZ3JvdXBfaWQsCisJCQkJCQkgICAgIHBrdC0+aGRyLmNtZCk7CisKKwkJCQlpZiAody0+Y21kc1tpXSA9PSByZWNfaWQgfHwKKwkJCQkgICAgKCFpd2xfY21kX2dyb3VwaWQody0+Y21kc1tpXSkgJiYKKwkJCQkgICAgIERFRl9JRCh3LT5jbWRzW2ldKSA9PSByZWNfaWQpKSB7CiAJCQkJCWZvdW5kID0gdHJ1ZTsKIAkJCQkJYnJlYWs7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1udm0tcGFyc2UuYwppbmRleCA0M2Y4ZjdkLi4zYmQ2ZmMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1udm0tcGFyc2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1udm0tcGFyc2UuYwpAQCAtNjcsNiArNjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgIml3bC1kcnYuaCIKICNpbmNsdWRlICJpd2wtbW9kcGFyYW1zLmgiCiAjaW5jbHVkZSAiaXdsLW52bS1wYXJzZS5oIgpAQCAtNTY0LDExICs1NjUsMTYgQEAKIAlfX2xlMzIgbWFjX2FkZHIwID0gY3B1X3RvX2xlMzIoaXdsX3JlYWQzMih0cmFucywgQ1NSX01BQ19BRERSMF9TVFJBUCkpOwogCV9fbGUzMiBtYWNfYWRkcjEgPSBjcHVfdG9fbGUzMihpd2xfcmVhZDMyKHRyYW5zLCBDU1JfTUFDX0FERFIxX1NUUkFQKSk7CiAKLQkvKiBJZiBPRU0gZGlkIG5vdCBmdXNlIGFkZHJlc3MgLSBnZXQgaXQgZnJvbSBPVFAgKi8KLQlpZiAoIW1hY19hZGRyMCAmJiAhbWFjX2FkZHIxKSB7Ci0JCW1hY19hZGRyMCA9IGNwdV90b19sZTMyKGl3bF9yZWFkMzIodHJhbnMsIENTUl9NQUNfQUREUjBfT1RQKSk7Ci0JCW1hY19hZGRyMSA9IGNwdV90b19sZTMyKGl3bF9yZWFkMzIodHJhbnMsIENTUl9NQUNfQUREUjFfT1RQKSk7Ci0JfQorCWl3bF9mbGlwX2h3X2FkZHJlc3MobWFjX2FkZHIwLCBtYWNfYWRkcjEsIGRhdGEtPmh3X2FkZHIpOworCS8qCisJICogSWYgdGhlIE9FTSBmdXNlZCBhIHZhbGlkIGFkZHJlc3MsIHVzZSBpdCBpbnN0ZWFkIG9mIHRoZSBvbmUgaW4gdGhlCisJICogT1RQCisJICovCisJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoZGF0YS0+aHdfYWRkcikpCisJCXJldHVybjsKKworCW1hY19hZGRyMCA9IGNwdV90b19sZTMyKGl3bF9yZWFkMzIodHJhbnMsIENTUl9NQUNfQUREUjBfT1RQKSk7CisJbWFjX2FkZHIxID0gY3B1X3RvX2xlMzIoaXdsX3JlYWQzMih0cmFucywgQ1NSX01BQ19BRERSMV9PVFApKTsKIAogCWl3bF9mbGlwX2h3X2FkZHJlc3MobWFjX2FkZHIwLCBtYWNfYWRkcjEsIGRhdGEtPmh3X2FkZHIpOwogfQpAQCAtODk5LDMgKzkwNSw5MSBAQAogCXJldHVybiByZWdkOwogfQogSVdMX0VYUE9SVF9TWU1CT0woaXdsX3BhcnNlX252bV9tY2NfaW5mbyk7CisKKyNpZmRlZiBDT05GSUdfQUNQSQorI2RlZmluZSBXUkREX01FVEhPRAkJIldSREQiCisjZGVmaW5lIFdSRERfV0lGSQkJKDB4MDcpCisjZGVmaW5lIFdSRERfV0lHSUcJCSgweDEwKQorCitzdGF0aWMgdTMyIGl3bF93cmRkX2dldF9tY2Moc3RydWN0IGRldmljZSAqZGV2LCB1bmlvbiBhY3BpX29iamVjdCAqd3JkZCkKK3sKKwl1bmlvbiBhY3BpX29iamVjdCAqbWNjX3BrZywgKmRvbWFpbl90eXBlLCAqbWNjX3ZhbHVlOworCXUzMiBpOworCisJaWYgKHdyZGQtPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UgfHwKKwkgICAgd3JkZC0+cGFja2FnZS5jb3VudCA8IDIgfHwKKwkgICAgd3JkZC0+cGFja2FnZS5lbGVtZW50c1swXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSIHx8CisJICAgIHdyZGQtPnBhY2thZ2UuZWxlbWVudHNbMF0uaW50ZWdlci52YWx1ZSAhPSAwKSB7CisJCUlXTF9ERUJVR19FRVBST00oZGV2LCAiVW5zdXBwb3J0ZWQgd3JkZCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAxIDsgaSA8IHdyZGQtPnBhY2thZ2UuY291bnQgOyArK2kpIHsKKwkJbWNjX3BrZyA9ICZ3cmRkLT5wYWNrYWdlLmVsZW1lbnRzW2ldOworCisJCWlmIChtY2NfcGtnLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFIHx8CisJCSAgICBtY2NfcGtnLT5wYWNrYWdlLmNvdW50IDwgMiB8fAorCQkgICAgbWNjX3BrZy0+cGFja2FnZS5lbGVtZW50c1swXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSIHx8CisJCSAgICBtY2NfcGtnLT5wYWNrYWdlLmVsZW1lbnRzWzFdLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwkJCW1jY19wa2cgPSBOVUxMOworCQkJY29udGludWU7CisJCX0KKworCQlkb21haW5fdHlwZSA9ICZtY2NfcGtnLT5wYWNrYWdlLmVsZW1lbnRzWzBdOworCQlpZiAoZG9tYWluX3R5cGUtPmludGVnZXIudmFsdWUgPT0gV1JERF9XSUZJKQorCQkJYnJlYWs7CisKKwkJbWNjX3BrZyA9IE5VTEw7CisJfQorCisJaWYgKG1jY19wa2cpIHsKKwkJbWNjX3ZhbHVlID0gJm1jY19wa2ctPnBhY2thZ2UuZWxlbWVudHNbMV07CisJCXJldHVybiBtY2NfdmFsdWUtPmludGVnZXIudmFsdWU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBpd2xfZ2V0X2Jpb3NfbWNjKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqbWNjKQoreworCWFjcGlfaGFuZGxlIHJvb3RfaGFuZGxlOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgd3JkZCA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCXUzMiBtY2NfdmFsOworCisJcm9vdF9oYW5kbGUgPSBBQ1BJX0hBTkRMRShkZXYpOworCWlmICghcm9vdF9oYW5kbGUpIHsKKwkJSVdMX0RFQlVHX0VFUFJPTShkZXYsCisJCQkJICJDb3VsZCBub3QgcmV0cmlldmUgcm9vdCBwb3J0IEFDUEkgaGFuZGxlXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJLyogR2V0IHRoZSBtZXRob2QncyBoYW5kbGUgKi8KKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocm9vdF9oYW5kbGUsIChhY3BpX3N0cmluZylXUkREX01FVEhPRCwKKwkJCQkgJmhhbmRsZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUlXTF9ERUJVR19FRVBST00oZGV2LCAiV1JEIG1ldGhvZCBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKiBDYWxsIFdSREQgd2l0aCBubyBhcmd1bWVudHMgKi8KKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE5VTEwsIE5VTEwsICZ3cmRkKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJSVdMX0RFQlVHX0VFUFJPTShkZXYsICJXUkRDIGludm9jYXRpb24gZmFpbGVkICgweCV4KVxuIiwKKwkJCQkgc3RhdHVzKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJbWNjX3ZhbCA9IGl3bF93cmRkX2dldF9tY2MoZGV2LCB3cmRkLnBvaW50ZXIpOworCWtmcmVlKHdyZGQucG9pbnRlcik7CisJaWYgKCFtY2NfdmFsKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW1jY1swXSA9IChtY2NfdmFsID4+IDgpICYgMHhmZjsKKwltY2NbMV0gPSBtY2NfdmFsICYgMHhmZjsKKwltY2NbMl0gPSAnXDAnOworCXJldHVybiAwOworfQorSVdMX0VYUE9SVF9TWU1CT0woaXdsX2dldF9iaW9zX21jYyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLW52bS1wYXJzZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmgKaW5kZXggZDcwNGQ1Mi4uNzI0OWU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmgKQEAgLTUsNyArNSw4IEBACiAgKgogICogR1BMIExJQ0VOU0UgU1VNTUFSWQogICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodChjKSAyMDE2ICAgICAgICBJbnRlbCBEZXV0c2NobGFuZCBHbWJICiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC05Myw0ICs5NCwyMSBAQAogaXdsX3BhcnNlX252bV9tY2NfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmcsCiAJCSAgICAgICBpbnQgbnVtX29mX2NoLCBfX2xlMzIgKmNoYW5uZWxzLCB1MTYgZndfbWNjKTsKIAorI2lmZGVmIENPTkZJR19BQ1BJCisvKioKKyAqIGl3bF9nZXRfYmlvc19tY2MgLSByZWFkIE1DQyBmcm9tIEJJT1MsIGlmIGF2YWlsYWJsZQorICoKKyAqIEBkZXY6IHRoZSBzdHJ1Y3QgZGV2aWNlCisgKiBAbWNjOiBvdXRwdXQgYnVmZmVyICgzIGJ5dGVzKSB0aGF0IHdpbGwgZ2V0IHRoZSBNQ0MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHJlYWQgdGhlIGN1cnJlbnQgTUNDIGZyb20gQUNQSSBpZiBhdmFpbGFibGUuCisgKi8KK2ludCBpd2xfZ2V0X2Jpb3NfbWNjKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqbWNjKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBpd2xfZ2V0X2Jpb3NfbWNjKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqbWNjKQoreworCXJldHVybiAtRU5PRU5UOworfQorI2VuZGlmCisKICNlbmRpZiAvKiBfX2l3bF9udm1fcGFyc2VfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1waHktZGIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXBoeS1kYi5jCmluZGV4IDdiZWJhOWEuLjI4OTM4MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXBoeS1kYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXBoeS1kYi5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAlJV0xfUEhZX0RCX01BWAogfTsKIAotI2RlZmluZSBQSFlfREJfQ01EIDB4NmMgLyogVEVNUCBBUEkgLSBUaGUgYWN0dWFsIGlzIDB4OGMgKi8KKyNkZWZpbmUgUEhZX0RCX0NNRCAweDZjCiAKIC8qCiAgKiBwaHkgZGIgLSBjb25maWd1cmUgb3BlcmF0aW9uYWwgdWNvZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXBycGguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXBycGguaAppbmRleCA0NTliZjczLi40MDZlZjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC1wcnBoLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtcHJwaC5oCkBAIC0zMDIsMjIgKzMwMiwxNyBAQAogI2RlZmluZSBPU0NfQ0xLX0ZPUkNFX0NPTlRST0wJCSgweDgpCiAKICNkZWZpbmUgRkhfVUNPREVfTE9BRF9TVEFUVVMJCSgweDFBRjApCi0jZGVmaW5lIENTUl9VQ09ERV9MT0FEX1NUQVRVU19BRERSCSgweDFFNzApCi1lbnVtIHNlY3VyZV9sb2FkX3N0YXR1c19yZWcgewotCUxNUE1fQ1BVX1VDT0RFX0xPQURJTkdfU1RBUlRFRAkJCT0gMHgwMDAwMDAwMSwKLQlMTVBNX0NQVV9IRFJTX0xPQURJTkdfQ09NUExFVEVECQkJPSAweDAwMDAwMDAzLAotCUxNUE1fQ1BVX1VDT0RFX0xPQURJTkdfQ09NUExFVEVECQk9IDB4MDAwMDAwMDcsCi0JTE1QTV9DUFVfU1RBVFVTX05VTV9PRl9MQVNUX0NPTVBMRVRFRAkJPSAweDAwMDAwMEY4LAotCUxNUE1fQ1BVX1NUQVRVU19OVU1fT0ZfTEFTVF9MT0FERURfQkxPQ0sJPSAweDAwMDBGRjAwLAotfTsKIAotI2RlZmluZSBMTVBNX1NFQ1VSRV9JTlNQRUNUT1JfQ09ERV9BRERSCSgweDFFMzgpCi0jZGVmaW5lIExNUE1fU0VDVVJFX0lOU1BFQ1RPUl9EQVRBX0FERFIJKDB4MUUzQykKKy8qCisgKiBSZXBsYWNpbmcgRkhfVUNPREVfTE9BRF9TVEFUVVMKKyAqIFRoaXMgcmVnaXN0ZXIgaXMgd3JpdGVuIGJ5IGRyaXZlciBhbmQgaXMgcmVhZCBieSB1Q29kZSBkdXJpbmcgYm9vdCBmbG93LgorICogTm90ZSB0aGlzIGFkZHJlc3MgaXMgY2xlYXJlZCBhZnRlciBNQUMgcmVzZXQuCisgKi8KKyNkZWZpbmUgVVJFR19VQ09ERV9MT0FEX1NUQVRVUwkJKDB4YTA1YzQwKQorCiAjZGVmaW5lIExNUE1fU0VDVVJFX1VDT0RFX0xPQURfQ1BVMV9IRFJfQUREUgkoMHgxRTc4KQogI2RlZmluZSBMTVBNX1NFQ1VSRV9VQ09ERV9MT0FEX0NQVTJfSERSX0FERFIJKDB4MUU3QykKIAotI2RlZmluZSBMTVBNX1NFQ1VSRV9JTlNQRUNUT1JfQ09ERV9NRU1fU1BBQ0UJKDB4NDAwMDAwKQotI2RlZmluZSBMTVBNX1NFQ1VSRV9JTlNQRUNUT1JfREFUQV9NRU1fU1BBQ0UJKDB4NDAyMDAwKQogI2RlZmluZSBMTVBNX1NFQ1VSRV9DUFUxX0hEUl9NRU1fU1BBQ0UJCSgweDQyMDAwMCkKICNkZWZpbmUgTE1QTV9TRUNVUkVfQ1BVMl9IRFJfTUVNX1NQQUNFCQkoMHg0MjA0MDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXRyYW5zLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC10cmFucy5jCmluZGV4IDYwNjlhOWYuLmQ0MmNhYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXRyYW5zLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtdHJhbnMuYwpAQCAtNjUsNiArNjUsNyBAQAogCiAjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCiAjaW5jbHVkZSAiaXdsLWRydi5oIgorI2luY2x1ZGUgIml3bC1maC5oIgogCiBzdHJ1Y3QgaXdsX3RyYW5zICppd2xfdHJhbnNfYWxsb2ModW5zaWduZWQgaW50IHByaXZfc2l6ZSwKIAkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTc3LDcgKzc4LDcgQEAKIAlzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IF9fa2V5OwogI2VuZGlmCiAKLQl0cmFucyA9IGt6YWxsb2Moc2l6ZW9mKCp0cmFucykgKyBwcml2X3NpemUsIEdGUF9LRVJORUwpOworCXRyYW5zID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCp0cmFucykgKyBwcml2X3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghdHJhbnMpCiAJCXJldHVybiBOVUxMOwogCkBAIC0xMDIsMTggKzEwMywxNCBAQAogCQkJCSAgU0xBQl9IV0NBQ0hFX0FMSUdOLAogCQkJCSAgTlVMTCk7CiAJaWYgKCF0cmFucy0+ZGV2X2NtZF9wb29sKQotCQlnb3RvIGZyZWU7CisJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIHRyYW5zOwotIGZyZWU6Ci0Ja2ZyZWUodHJhbnMpOwotCXJldHVybiBOVUxMOwogfQogCiB2b2lkIGl3bF90cmFuc19mcmVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQogewogCWttZW1fY2FjaGVfZGVzdHJveSh0cmFucy0+ZGV2X2NtZF9wb29sKTsKLQlrZnJlZSh0cmFucyk7CiB9CiAKIGludCBpd2xfdHJhbnNfc2VuZF9jbWQoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCkKQEAgLTEzOSw2ICsxMzYsOSBAQAogCWlmICghKGNtZC0+ZmxhZ3MgJiBDTURfQVNZTkMpKQogCQlsb2NrX21hcF9hY3F1aXJlX3JlYWQoJnRyYW5zLT5zeW5jX2NtZF9sb2NrZGVwX21hcCk7CiAKKwlpZiAodHJhbnMtPndpZGVfY21kX2hlYWRlciAmJiAhaXdsX2NtZF9ncm91cGlkKGNtZC0+aWQpKQorCQljbWQtPmlkID0gREVGX0lEKGNtZC0+aWQpOworCiAJcmV0ID0gdHJhbnMtPm9wcy0+c2VuZF9jbWQodHJhbnMsIGNtZCk7CiAKIAlpZiAoIShjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXRyYW5zLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL2l3bC10cmFucy5oCmluZGV4IDU1MzVlMjIuLjAyOTYxMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvaXdsLXRyYW5zLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9pd2wtdHJhbnMuaApAQCAtMTUzLDYgKzE1Myw3IEBACiAKIC8qIG1ha2UgdTE2IHdpZGUgaWQgb3V0IG9mIHU4IGdyb3VwIGFuZCBvcGNvZGUgKi8KICNkZWZpbmUgV0lERV9JRChncnAsIG9wY29kZSkgKChncnAgPDwgOCkgfCBvcGNvZGUpCisjZGVmaW5lIERFRl9JRChvcGNvZGUpICgoMSA8PCA4KSB8IChvcGNvZGUpKQogCiAvKiBkdWUgdG8gdGhlIGNvbnZlcnNpb24sIHRoaXMgZ3JvdXAgaXMgc3BlY2lhbDsgbmV3IGdyb3VwcwogICogc2hvdWxkIGJlIGRlZmluZWQgaW4gdGhlIGFwcHJvcHJpYXRlIGZ3LWFwaSBoZWFkZXIgZmlsZXMKQEAgLTI2Miw4ICsyNjMsNiBAQAogICoJKGkuZS4gbWFyayBpdCBhcyBub24taWRsZSkuCiAgKiBAQ01EX1dBTlRfQVNZTkNfQ0FMTEJBQ0s6IHRoZSBvcF9tb2RlJ3MgYXN5bmMgY2FsbGJhY2sgZnVuY3Rpb24gbXVzdCBiZQogICoJY2FsbGVkIGFmdGVyIHRoaXMgY29tbWFuZCBjb21wbGV0ZXMuIFZhbGlkIG9ubHkgd2l0aCBDTURfQVNZTkMuCi0gKiBAQ01EX1RCX0JJVE1BUF9QT1M6IFBvc2l0aW9uIG9mIHRoZSBmaXJzdCBiaXQgZm9yIHRoZSBUQiBiaXRtYXAuIFdlIG5lZWQgdG8KLSAqCWNoZWNrIHRoYXQgd2UgbGVhdmUgZW5vdWdoIHJvb20gZm9yIHRoZSBUQnMgYml0bWFwIHdoaWNoIG5lZWRzIDIwIGJpdHMuCiAgKi8KIGVudW0gQ01EX01PREUgewogCUNNRF9BU1lOQwkJPSBCSVQoMCksCkBAIC0yNzQsOCArMjczLDYgQEAKIAlDTURfTUFLRV9UUkFOU19JRExFCT0gQklUKDUpLAogCUNNRF9XQUtFX1VQX1RSQU5TCT0gQklUKDYpLAogCUNNRF9XQU5UX0FTWU5DX0NBTExCQUNLCT0gQklUKDcpLAotCi0JQ01EX1RCX0JJVE1BUF9QT1MJPSAxMSwKIH07CiAKICNkZWZpbmUgREVGX0NNRF9QQVlMT0FEX1NJWkUgMzIwCkBAIC00ODgsNyArNDg1LDYgQEAKICAqIEBiY190YWJsZV9kd29yZDogc2V0IHRvIHRydWUgaWYgdGhlIEJDIHRhYmxlIGV4cGVjdHMgdGhlIGJ5dGUgY291bnQgdG8gYmUKICAqCWluIERXT1JEIChhcyBvcHBvc2VkIHRvIGJ5dGVzKQogICogQHNjZF9zZXRfYWN0aXZlOiBzaG91bGQgdGhlIHRyYW5zcG9ydCBjb25maWd1cmUgdGhlIFNDRCBmb3IgSENNRCBxdWV1ZQotICogQHdpZGVfY21kX2hlYWRlcjogZmlybXdhcmUgc3VwcG9ydHMgd2lkZSBob3N0IGNvbW1hbmQgaGVhZGVyCiAgKiBAc3dfY3N1bV90eDogdHJhbnNwb3J0IHNob3VsZCBjb21wdXRlIHRoZSBUQ1AgY2hlY2tzdW0KICAqIEBjb21tYW5kX2dyb3VwczogYXJyYXkgb2YgY29tbWFuZCBncm91cHMsIGVhY2ggbWVtYmVyIGlzIGFuIGFycmF5IG9mIHRoZQogICoJY29tbWFuZHMgaW4gdGhlIGdyb3VwOyBmb3IgZGVidWdnaW5nIG9ubHkKQEAgLTUxMCw3ICs1MDYsNiBAQAogCWVudW0gaXdsX2Ftc2R1X3NpemUgcnhfYnVmX3NpemU7CiAJYm9vbCBiY190YWJsZV9kd29yZDsKIAlib29sIHNjZF9zZXRfYWN0aXZlOwotCWJvb2wgd2lkZV9jbWRfaGVhZGVyOwogCWJvb2wgc3dfY3N1bV90eDsKIAljb25zdCBzdHJ1Y3QgaXdsX2hjbWRfYXJyICpjb21tYW5kX2dyb3VwczsKIAlpbnQgY29tbWFuZF9ncm91cHNfc2l6ZTsKQEAgLTY0OSw2ICs2NDQsOCBAQAogCXZvaWQgKCp0eHFfc2V0X3NoYXJlZF9tb2RlKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdTMyIHR4cV9pZCwKIAkJCQkgICAgYm9vbCBzaGFyZWQpOwogCisJZG1hX2FkZHJfdCAoKmdldF90eHFfYnl0ZV90YWJsZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCB0eHFfaWQpOworCiAJaW50ICgqd2FpdF90eF9xdWV1ZV9lbXB0eSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHUzMiB0eHFfYm0pOwogCXZvaWQgKCpmcmVlemVfdHhxX3RpbWVyKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdW5zaWduZWQgbG9uZyB0eHFzLAogCQkJCSBib29sIGZyZWV6ZSk7CkBAIC03NzIsNiArNzY5LDcgQEAKICAqIEBod19pZF9zdHI6IGEgc3RyaW5nIHdpdGggaW5mbyBhYm91dCBIVyBJRC4gU2V0IGR1cmluZyB0cmFuc3BvcnQgYWxsb2NhdGlvbi4KICAqIEBwbV9zdXBwb3J0OiBzZXQgdG8gdHJ1ZSBpbiBzdGFydF9odyBpZiBsaW5rIHBtIGlzIHN1cHBvcnRlZAogICogQGx0cl9lbmFibGVkOiBzZXQgdG8gdHJ1ZSBpZiB0aGUgTFRSIGlzIGVuYWJsZWQKKyAqIEB3aWRlX2NtZF9oZWFkZXI6IHRydWUgd2hlbiB1Y29kZSBzdXBwb3J0cyB3aWRlIGNvbW1hbmQgaGVhZGVyIGZvcm1hdAogICogQG51bV9yeF9xdWV1ZXM6IG51bWJlciBvZiBSWCBxdWV1ZXMgYWxsb2NhdGVkIGJ5IHRoZSB0cmFuc3BvcnQ7CiAgKgl0aGUgdHJhbnNwb3J0IG11c3Qgc2V0IHRoaXMgYmVmb3JlIGNhbGxpbmcgaXdsX2Rydl9zdGFydCgpCiAgKiBAZGV2X2NtZF9wb29sOiBwb29sIGZvciBUeCBjbWQgYWxsb2NhdGlvbiAtIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KQEAgLTgyMyw2ICs4MjEsNyBAQAogCiAJY29uc3Qgc3RydWN0IGl3bF9oY21kX2FyciAqY29tbWFuZF9ncm91cHM7CiAJaW50IGNvbW1hbmRfZ3JvdXBzX3NpemU7CisJYm9vbCB3aWRlX2NtZF9oZWFkZXI7CiAKIAl1OCBudW1fcnhfcXVldWVzOwogCkBAIC0xMDczLDYgKzEwNzIsMTUgQEAKIAkJdHJhbnMtPm9wcy0+dHhxX3NldF9zaGFyZWRfbW9kZSh0cmFucywgcXVldWUsIHNoYXJlZF9tb2RlKTsKIH0KIAorc3RhdGljIGlubGluZSBkbWFfYWRkcl90IGl3bF90cmFuc19nZXRfdHhxX2J5dGVfdGFibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkJCQkgICAgICBpbnQgcXVldWUpCit7CisJLyogd2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBpZiB0aGUgdHJhbnMgZG9lc24ndCBzdXBwb3J0IGl0ICovCisJQlVHX09OKCF0cmFucy0+b3BzLT5nZXRfdHhxX2J5dGVfdGFibGUpOworCisJcmV0dXJuIHRyYW5zLT5vcHMtPmdldF90eHFfYnl0ZV90YWJsZSh0cmFucywgcXVldWUpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgaXdsX3RyYW5zX3R4cV9lbmFibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBxdWV1ZSwKIAkJCQkJaW50IGZpZm8sIGludCBzdGFfaWQsIGludCB0aWQsCiAJCQkJCWludCBmcmFtZV9saW1pdCwgdTE2IHNzbiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2RlYnVnZnMtdmlmLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9kZWJ1Z2ZzLXZpZi5jCmluZGV4IGIyMzI3MTcuLjJkNmY0NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2RlYnVnZnMtdmlmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZGVidWdmcy12aWYuYwpAQCAtNTA0LDYgKzUwNCwyOCBAQAogCXJldHVybiAhc3RybmNtcChuYW1lLCBidWYsIGxlbikgPyBidWYgKyBsZW4gOiBOVUxMOwogfQogCitzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfb3NfZGV2aWNlX3RpbWVkaWZmX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CisJc3RydWN0IGl3bF9tdm0gKm12bSA9IG12bXZpZi0+bXZtOworCXUzMiBjdXJyX2dwMjsKKwl1NjQgY3Vycl9vczsKKwlzNjQgZGlmZjsKKwljaGFyIGJ1Zls2NF07CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisJaW50IHBvcyA9IDA7CisKKwlpd2xfbXZtX2dldF9zeW5jX3RpbWUobXZtLCAmY3Vycl9ncDIsICZjdXJyX29zKTsKKwlkb19kaXYoY3Vycl9vcywgTlNFQ19QRVJfVVNFQyk7CisJZGlmZiA9IGN1cnJfb3MgLSBjdXJyX2dwMjsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJkaWZmPSVsbGRcbiIsIGRpZmYpOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworfQorCiBzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfdG9mX2VuYWJsZV93cml0ZShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJCQkgIGNoYXIgKmJ1ZiwKIAkJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTE1MzAsNiArMTU1Miw4IEBACiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHRvZl9yZXNwb25kZXJfcGFyYW1zLCAzMik7CiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHF1b3RhX21pbiwgMzIpOwogTVZNX0RFQlVHRlNfV1JJVEVfRklMRV9PUFMobHFtX3NlbmRfY21kLCA2NCk7CitNVk1fREVCVUdGU19SRUFEX0ZJTEVfT1BTKG9zX2RldmljZV90aW1lZGlmZik7CisKIAogdm9pZCBpd2xfbXZtX3ZpZl9kYmdmc19yZWdpc3RlcihzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewpAQCAtMTU1NCw4ICsxNTc4LDcgQEAKIAogCWlmIChpd2xtdm1fbW9kX3BhcmFtcy5wb3dlcl9zY2hlbWUgIT0gSVdMX1BPV0VSX1NDSEVNRV9DQU0gJiYKIAkgICAgKCh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJiAhdmlmLT5wMnApIHx8Ci0JICAgICAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYgdmlmLT5wMnAgJiYKLQkgICAgICBtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19CU1NfUDJQX1BTX0RDTSkpKQorCSAgICAgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmIHZpZi0+cDJwKSkpCiAJCU1WTV9ERUJVR0ZTX0FERF9GSUxFX1ZJRihwbV9wYXJhbXMsIG12bXZpZi0+ZGJnZnNfZGlyLCBTX0lXVVNSIHwKIAkJCQkJIFNfSVJVU1IpOwogCkBAIC0xNTcwLDYgKzE1OTMsOCBAQAogCU1WTV9ERUJVR0ZTX0FERF9GSUxFX1ZJRihxdW90YV9taW4sIG12bXZpZi0+ZGJnZnNfZGlyLAogCQkJCSBTX0lSVVNSIHwgU19JV1VTUik7CiAJTVZNX0RFQlVHRlNfQUREX0ZJTEVfVklGKGxxbV9zZW5kX2NtZCwgbXZtdmlmLT5kYmdmc19kaXIsIFNfSVdVU1IpOworCU1WTV9ERUJVR0ZTX0FERF9GSUxFX1ZJRihvc19kZXZpY2VfdGltZWRpZmYsCisJCQkJIG12bXZpZi0+ZGJnZnNfZGlyLCBTX0lSVVNSKTsKIAogCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJiAhdmlmLT5wMnAgJiYKIAkgICAgbXZtdmlmID09IG12bS0+YmZfYWxsb3dlZF92aWYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9kZWJ1Z2ZzLmMKaW5kZXggYjM0NDg5OC4uNTM5ZDcxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2RlYnVnZnMuYwpAQCAtOTE3LDYgKzkxNyw1OSBAQAogCXJldHVybiByZXQgPzogY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc19pbmplY3RfcGFja2V0X3dyaXRlKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJCSAgICAgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkJCSAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciByeGIgPSB7CisJCS5fcnhfcGFnZV9vcmRlciA9IDAsCisJCS50cnVlc2l6ZSA9IDAsIC8qIG5vdCB1c2VkICovCisJCS5fb2Zmc2V0ID0gMCwKKwl9OworCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3Q7CisJc3RydWN0IGl3bF9yeF9tcGR1X2Rlc2MgKmRlc2M7CisJaW50IGJpbl9sZW4gPSBjb3VudCAvIDI7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwkvKiBzdXBwb3J0aW5nIG9ubHkgOTAwMCBkZXNjcmlwdG9yICovCisJaWYgKCFtdm0tPnRyYW5zLT5jZmctPm1xX3J4X3N1cHBvcnRlZCkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXJ4Yi5fcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9BVE9NSUMsIDApOworCWlmICghcnhiLl9wYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwa3QgPSByeGJfYWRkcigmcnhiKTsKKworCXJldCA9IGhleDJiaW4ocGFnZV9hZGRyZXNzKHJ4Yi5fcGFnZSksIGJ1ZiwgYmluX2xlbik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBhdm9pZCBpbnZhbGlkIG1lbW9yeSBhY2Nlc3MgKi8KKwlpZiAoYmluX2xlbiA8IHNpemVvZigqcGt0KSArIHNpemVvZigqZGVzYykpCisJCWdvdG8gb3V0OworCisJLyogY2hlY2sgdGhpcyBpcyBSWCBwYWNrZXQgKi8KKwlpZiAoV0lERV9JRChwa3QtPmhkci5ncm91cF9pZCwgcGt0LT5oZHIuY21kKSAhPQorCSAgICBXSURFX0lEKExFR0FDWV9HUk9VUCwgUkVQTFlfUlhfTVBEVV9DTUQpKQorCQlnb3RvIG91dDsKKworCS8qIGNoZWNrIHRoZSBsZW5ndGggaW4gbWV0YWRhdGEgbWF0Y2hlcyBhY3R1YWwgcmVjZWl2ZWQgbGVuZ3RoICovCisJZGVzYyA9ICh2b2lkICopcGt0LT5kYXRhOworCWlmIChsZTE2X3RvX2NwdShkZXNjLT5tcGR1X2xlbikgIT0KKwkgICAgKGJpbl9sZW4gLSBzaXplb2YoKmRlc2MpIC0gc2l6ZW9mKCpwa3QpKSkKKwkJZ290byBvdXQ7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJaXdsX212bV9yeF9tcGR1X21xKG12bSwgTlVMTCwgJnJ4YiwgMCk7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisJcmV0ID0gMDsKKworb3V0OgorCWl3bF9mcmVlX3J4YigmcnhiKTsKKworCXJldHVybiByZXQgPzogY291bnQ7Cit9CisKIHN0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc19md19kYmdfY29uZl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCQkgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTE0NTQsNiArMTUwNyw3IEBACiBNVk1fREVCVUdGU19XUklURV9GSUxFX09QUyhtYXhfYW1zZHVfbGVuLCA4KTsKIE1WTV9ERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKGluZGlyZWN0aW9uX3RibCwKIAkJCSAgIChJV0xfUlNTX0lORElSRUNUSU9OX1RBQkxFX1NJWkUgKiAyKSk7CitNVk1fREVCVUdGU19XUklURV9GSUxFX09QUyhpbmplY3RfcGFja2V0LCA1MTIpOwogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfQkNBU1RfRklMVEVSSU5HCiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGJjYXN0X2ZpbHRlcnMsIDI1Nik7CkBAIC0xNDY0LDYgKzE1MTgsMTMyIEBACiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGQzX3NyYW0sIDgpOwogI2VuZGlmCiAKK3N0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc19tZW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGl3bF9tdm0gKm12bSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaXdsX2RiZ19tZW1fYWNjZXNzX2NtZCBjbWQgPSB7fTsKKwlzdHJ1Y3QgaXdsX2RiZ19tZW1fYWNjZXNzX3JzcCAqcnNwOworCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHsKKwkJLmZsYWdzID0gQ01EX1dBTlRfU0tCIHwgQ01EX1NFTkRfSU5fUkZLSUxMLAorCQkuZGF0YSA9IHsgJmNtZCwgfSwKKwkJLmxlbiA9IHsgc2l6ZW9mKGNtZCkgfSwKKwl9OworCXNpemVfdCBkZWx0YSwgbGVuOworCXNzaXplX3QgcmV0OworCisJaGNtZC5pZCA9IGl3bF9jbWRfaWQoKnBwb3MgPj4gMjQgPyBVTUFDX1JEX1dSIDogTE1BQ19SRF9XUiwKKwkJCSAgICAgREVCVUdfR1JPVVAsIDApOworCWNtZC5vcCA9IGNwdV90b19sZTMyKERFQlVHX01FTV9PUF9SRUFEKTsKKworCS8qIFRha2UgY2FyZSBvZiBhbGlnbm1lbnQgb2YgYm90aCB0aGUgcG9zaXRpb24gYW5kIHRoZSBsZW5ndGggKi8KKwlkZWx0YSA9ICpwcG9zICYgMHgzOworCWNtZC5hZGRyID0gY3B1X3RvX2xlMzIoKnBwb3MgLSBkZWx0YSk7CisJY21kLmxlbiA9IGNwdV90b19sZTMyKG1pbihBTElHTihjb3VudCArIGRlbHRhLCA0KSAvIDQsCisJCQkJICAoc2l6ZV90KURFQlVHX01FTV9NQVhfU0laRV9EV09SRFMpKTsKKworCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOworCXJldCA9IGl3bF9tdm1fc2VuZF9jbWQobXZtLCAmaGNtZCk7CisJbXV0ZXhfdW5sb2NrKCZtdm0tPm11dGV4KTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcnNwID0gKHZvaWQgKiloY21kLnJlc3BfcGt0LT5kYXRhOworCWlmIChsZTMyX3RvX2NwdShyc3AtPnN0YXR1cykgIT0gREVCVUdfTUVNX1NUQVRVU19TVUNDRVNTKSB7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXQ7CisJfQorCisJbGVuID0gbWluKChzaXplX3QpbGUzMl90b19jcHUocnNwLT5sZW4pIDw8IDIsCisJCSAgaXdsX3J4X3BhY2tldF9wYXlsb2FkX2xlbihoY21kLnJlc3BfcGt0KSAtIHNpemVvZigqcnNwKSk7CisJbGVuID0gbWluKGxlbiAtIGRlbHRhLCBjb3VudCk7CisJaWYgKGxlbiA8IDApIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gbGVuIC0gY29weV90b191c2VyKHVzZXJfYnVmLCAodm9pZCAqKXJzcC0+ZGF0YSArIGRlbHRhLCBsZW4pOworCSpwcG9zICs9IHJldDsKKworb3V0OgorCWl3bF9mcmVlX3Jlc3AoJmhjbWQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc19tZW1fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQkJICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpd2xfbXZtICptdm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl3bF9kYmdfbWVtX2FjY2Vzc19jbWQgKmNtZDsKKwlzdHJ1Y3QgaXdsX2RiZ19tZW1fYWNjZXNzX3JzcCAqcnNwOworCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHt9OworCXNpemVfdCBjbWRfc2l6ZTsKKwlzaXplX3QgZGF0YV9zaXplOworCXUzMiBvcCwgbGVuOworCXNzaXplX3QgcmV0OworCisJaGNtZC5pZCA9IGl3bF9jbWRfaWQoKnBwb3MgPj4gMjQgPyBVTUFDX1JEX1dSIDogTE1BQ19SRF9XUiwKKwkJCSAgICAgREVCVUdfR1JPVVAsIDApOworCisJaWYgKCpwcG9zICYgMHgzIHx8IGNvdW50IDwgNCkgeworCQlvcCA9IERFQlVHX01FTV9PUF9XUklURV9CWVRFUzsKKwkJbGVuID0gbWluKGNvdW50LCAoc2l6ZV90KSg0IC0gKCpwcG9zICYgMHgzKSkpOworCQlkYXRhX3NpemUgPSBsZW47CisJfSBlbHNlIHsKKwkJb3AgPSBERUJVR19NRU1fT1BfV1JJVEU7CisJCWxlbiA9IG1pbihjb3VudCA+PiAyLCAoc2l6ZV90KURFQlVHX01FTV9NQVhfU0laRV9EV09SRFMpOworCQlkYXRhX3NpemUgPSBsZW4gPDwgMjsKKwl9CisKKwljbWRfc2l6ZSA9IHNpemVvZigqY21kKSArIEFMSUdOKGRhdGFfc2l6ZSwgNCk7CisJY21kID0ga3phbGxvYyhjbWRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbWQpCisJCXJldHVybiAtRU5PTUVNOworCisJY21kLT5vcCA9IGNwdV90b19sZTMyKG9wKTsKKwljbWQtPmxlbiA9IGNwdV90b19sZTMyKGxlbik7CisJY21kLT5hZGRyID0gY3B1X3RvX2xlMzIoKnBwb3MpOworCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKWNtZC0+ZGF0YSwgdXNlcl9idWYsIGRhdGFfc2l6ZSkpIHsKKwkJa2ZyZWUoY21kKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaGNtZC5mbGFncyA9IENNRF9XQU5UX1NLQiB8IENNRF9TRU5EX0lOX1JGS0lMTCwKKwloY21kLmRhdGFbMF0gPSAodm9pZCAqKWNtZDsKKwloY21kLmxlblswXSA9IGNtZF9zaXplOworCisJbXV0ZXhfbG9jaygmbXZtLT5tdXRleCk7CisJcmV0ID0gaXdsX212bV9zZW5kX2NtZChtdm0sICZoY21kKTsKKwltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOworCisJa2ZyZWUoY21kKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcnNwID0gKHZvaWQgKiloY21kLnJlc3BfcGt0LT5kYXRhOworCWlmIChyc3AtPnN0YXR1cyAhPSBERUJVR19NRU1fU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBkYXRhX3NpemU7CisJKnBwb3MgKz0gcmV0OworCitvdXQ6CisJaXdsX2ZyZWVfcmVzcCgmaGNtZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXdsX2RiZ2ZzX21lbV9vcHMgPSB7CisJLnJlYWQgPSBpd2xfZGJnZnNfbWVtX3JlYWQsCisJLndyaXRlID0gaXdsX2RiZ2ZzX21lbV93cml0ZSwKKwkub3BlbiA9IHNpbXBsZV9vcGVuLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKIGludCBpd2xfbXZtX2RiZ2ZzX3JlZ2lzdGVyKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBkZW50cnkgKmRiZ2ZzX2RpcikKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpiY2FzdF9kaXIgX19tYXliZV91bnVzZWQ7CkBAIC0xNTAyLDYgKzE2ODIsNyBAQAogCU1WTV9ERUJVR0ZTX0FERF9GSUxFKHNlbmRfZWNob19jbWQsIG12bS0+ZGVidWdmc19kaXIsIFNfSVdVU1IpOwogCU1WTV9ERUJVR0ZTX0FERF9GSUxFKGNvbnRfcmVjb3JkaW5nLCBtdm0tPmRlYnVnZnNfZGlyLCBTX0lXVVNSKTsKIAlNVk1fREVCVUdGU19BRERfRklMRShpbmRpcmVjdGlvbl90YmwsIG12bS0+ZGVidWdmc19kaXIsIFNfSVdVU1IpOworCU1WTV9ERUJVR0ZTX0FERF9GSUxFKGluamVjdF9wYWNrZXQsIG12bS0+ZGVidWdmc19kaXIsIFNfSVdVU1IpOwogCWlmICghZGVidWdmc19jcmVhdGVfYm9vbCgiZW5hYmxlX3NjYW5faXRlcmF0aW9uX25vdGlmIiwKIAkJCQkgU19JUlVTUiB8IFNfSVdVU1IsCiAJCQkJIG12bS0+ZGVidWdmc19kaXIsCkBAIC0xNTYwLDYgKzE3NDEsOSBAQAogCQkJCSBtdm0tPmRlYnVnZnNfZGlyLCAmbXZtLT5udm1fcGh5X3NrdV9ibG9iKSkKIAkJZ290byBlcnI7CiAKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJtZW0iLCBTX0lSVVNSIHwgU19JV1VTUiwgZGJnZnNfZGlyLCBtdm0sCisJCQkgICAgJml3bF9kYmdmc19tZW1fb3BzKTsKKwogCS8qCiAJICogQ3JlYXRlIGEgc3ltbGluayB3aXRoIG1hYzgwMjExLiBJdCB3aWxsIGJlIHJlbW92ZWQgd2hlbiBtYWM4MDIxMQogCSAqIGV4aXN0cyAoYmVmb3JlIHRoZSBvcG1vZGUgZXhpc3RzIHdoaWNoIHJlbW92ZXMgdGhlIHRhcmdldC4pCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktcG93ZXIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1wb3dlci5oCmluZGV4IDQwNGIwZGUuLjNmYTQzZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1wb3dlci5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1wb3dlci5oCkBAIC0zMTMsMzUgKzMxMywyNiBAQAogCUlXTF9UWF9QT1dFUl9NT0RFX1NFVF9BQ0sgPSAzLAogfTsgLyogVFhfUE9XRVJfUkVEVUNFRF9GTEFHU19UWVBFX0FQSV9FX1ZFUl80ICovOwogCisjZGVmaW5lIElXTF9OVU1fQ0hBSU5fTElNSVRTCTIKKyNkZWZpbmUgSVdMX05VTV9TVUJfQkFORFMJNQorCiAvKioKLSAqIHN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZF92MiAtIFRYIHBvd2VyIHJlZHVjdGlvbiBjb21tYW5kCisgKiBzdHJ1Y3QgaXdsX2Rldl90eF9wb3dlcl9jbWQgLSBUWCBwb3dlciByZWR1Y3Rpb24gY29tbWFuZAogICogQHNldF9tb2RlOiBzZWUgJmVudW0gaXdsX2Rldl90eF9wb3dlcl9jbWRfbW9kZQogICogQG1hY19jb250ZXh0X2lkOiBpZCBvZiB0aGUgbWFjIGN0eCBmb3Igd2hpY2ggd2UgYXJlIHJlZHVjaW5nIFRYIHBvd2VyLgogICogQHB3cl9yZXN0cmljdGlvbjogVFggcG93ZXIgcmVzdHJpY3Rpb24gaW4gMS84IGRCbXMuCiAgKiBAZGV2XzI0OiBkZXZpY2UgVFggcG93ZXIgcmVzdHJpY3Rpb24gaW4gMS84IGRCbXMKICAqIEBkZXZfNTJfbG93OiBkZXZpY2UgVFggcG93ZXIgcmVzdHJpY3Rpb24gdXBwZXIgYmFuZCAtIGxvdwogICogQGRldl81Ml9oaWdoOiBkZXZpY2UgVFggcG93ZXIgcmVzdHJpY3Rpb24gdXBwZXIgYmFuZCAtIGhpZ2gKKyAqIEBwZXJfY2hhaW5fcmVzdHJpY3Rpb246IHBlciBjaGFpbiByZXN0cmljdGlvbnMKICAqLwotc3RydWN0IGl3bF9kZXZfdHhfcG93ZXJfY21kX3YyIHsKK3N0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZF92MyB7CiAJX19sZTMyIHNldF9tb2RlOwogCV9fbGUzMiBtYWNfY29udGV4dF9pZDsKIAlfX2xlMTYgcHdyX3Jlc3RyaWN0aW9uOwogCV9fbGUxNiBkZXZfMjQ7CiAJX19sZTE2IGRldl81Ml9sb3c7CiAJX19sZTE2IGRldl81Ml9oaWdoOwotfSBfX3BhY2tlZDsgLyogVFhfUkVEVUNFRF9QT1dFUl9BUElfU19WRVJfMiAqLwotCi0jZGVmaW5lIElXTF9OVU1fQ0hBSU5fTElNSVRTCTIKLSNkZWZpbmUgSVdMX05VTV9TVUJfQkFORFMJNQotCi0vKioKLSAqIHN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZCAtIFRYIHBvd2VyIHJlZHVjdGlvbiBjb21tYW5kCi0gKiBAdjI6IHZlcnNpb24gMiBvZiB0aGUgY29tbWFuZCwgZW1iZWRkZWQgaGVyZSBmb3IgZWFzaWVyIHNvZnR3YXJlIGhhbmRsaW5nCi0gKiBAcGVyX2NoYWluX3Jlc3RyaWN0aW9uOiBwZXIgY2hhaW4gcmVzdHJpY3Rpb25zCi0gKi8KLXN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZF92MyB7Ci0JLyogdjMgaXMganVzdCBhbiBleHRlbnNpb24gb2YgdjIgLSBrZWVwIHRoaXMgaGVyZSAqLwotCXN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZF92MiB2MjsKIAlfX2xlMTYgcGVyX2NoYWluX3Jlc3RyaWN0aW9uW0lXTF9OVU1fQ0hBSU5fTElNSVRTXVtJV0xfTlVNX1NVQl9CQU5EU107CiB9IF9fcGFja2VkOyAvKiBUWF9SRURVQ0VEX1BPV0VSX0FQSV9TX1ZFUl8zICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1zY2FuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktc2Nhbi5oCmluZGV4IGYwMWRhYjAuLjBjMjk0YzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktc2Nhbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1zY2FuLmgKQEAgLTcsNiArNyw3IEBACiAgKgogICogQ29weXJpZ2h0KGMpIDIwMTIgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE1IEludGVsIE1vYmlsZSBDb21tdW5pY2F0aW9ucyBHbWJICisgKiBDb3B5cmlnaHQoYykgMjAxNiBJbnRlbCBEZXV0c2NobGFuZCBHbWJICiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC02MDMsNiArNjA0LDggQEAKICAqIEB1aWQ6IHNjYW4gaWQsICZlbnVtIGl3bF91bWFjX3NjYW5fdWlkX29mZnNldHMKICAqIEBvb2NfcHJpb3JpdHk6IG91dCBvZiBjaGFubmVsIHByaW9yaXR5IC0gJmVudW0gaXdsX3NjYW5fcHJpb3JpdHkKICAqIEBnZW5lcmFsX2ZsYWdzOiAmZW51bSBpd2xfdW1hY19zY2FuX2dlbmVyYWxfZmxhZ3MKKyAqIEByZXNlcnZlZDI6IGZvciBmdXR1cmUgdXNlIGFuZCBhbGlnbm1lbnQKKyAqIEBzY2FuX3N0YXJ0X21hY19pZDogcmVwb3J0IHRoZSBzY2FuIHN0YXJ0IFRTRiB0aW1lIGFjY29yZGluZyB0byB0aGlzIG1hYyBUU0YKICAqIEBleHRlbmRlZF9kd2VsbDogZHdlbGwgdGltZSBmb3IgY2hhbm5lbHMgMSwgNiBhbmQgMTEKICAqIEBhY3RpdmVfZHdlbGw6IGR3ZWxsIHRpbWUgZm9yIGFjdGl2ZSBzY2FuCiAgKiBAcGFzc2l2ZV9kd2VsbDogZHdlbGwgdGltZSBmb3IgcGFzc2l2ZSBzY2FuCkBAIC02MjAsOCArNjIzLDEwIEBACiAJX19sZTMyIGZsYWdzOwogCV9fbGUzMiB1aWQ7CiAJX19sZTMyIG9vY19wcmlvcml0eTsKLQkvKiBTQ0FOX0dFTkVSQUxfUEFSQU1TX0FQSV9TX1ZFUl8xICovCi0JX19sZTMyIGdlbmVyYWxfZmxhZ3M7CisJLyogU0NBTl9HRU5FUkFMX1BBUkFNU19BUElfU19WRVJfNCAqLworCV9fbGUxNiBnZW5lcmFsX2ZsYWdzOworCXU4IHJlc2VydmVkMjsKKwl1OCBzY2FuX3N0YXJ0X21hY19pZDsKIAl1OCBleHRlbmRlZF9kd2VsbDsKIAl1OCBhY3RpdmVfZHdlbGw7CiAJdTggcGFzc2l2ZV9kd2VsbDsKQEAgLTYyOSw3ICs2MzQsNyBAQAogCV9fbGUzMiBtYXhfb3V0X3RpbWU7CiAJX19sZTMyIHN1c3BlbmRfdGltZTsKIAlfX2xlMzIgc2Nhbl9wcmlvcml0eTsKLQkvKiBTQ0FOX0NIQU5ORUxfUEFSQU1TX0FQSV9TX1ZFUl8xICovCisJLyogU0NBTl9DSEFOTkVMX1BBUkFNU19BUElfU19WRVJfNCAqLwogCXU4IGNoYW5uZWxfZmxhZ3M7CiAJdTggbl9jaGFubmVsczsKIAlfX2xlMTYgcmVzZXJ2ZWQ7CkBAIC03MTgsOCArNzIzLDggQEAKICAqIEBzdGF0dXM6IG9uZSBvZiBTQ0FOX0NPTVBfU1RBVFVTXyoKICAqIEBidF9zdGF0dXM6IEJUIG9uL29mZiBzdGF0dXMKICAqIEBsYXN0X2NoYW5uZWw6IGxhc3QgY2hhbm5lbCB0aGF0IHdhcyBzY2FubmVkCi0gKiBAdHNmX2xvdzogVFNGIHRpbWVyIChsb3dlciBoYWxmKSBpbiB1c2VjcwotICogQHRzZl9oaWdoOiBUU0YgdGltZXIgKGhpZ2hlciBoYWxmKSBpbiB1c2VjcworICogQHN0YXJ0X3RzZjogVFNGIHRpbWVyIGluIHVzZWNzIG9mIHRoZSBzY2FuIHN0YXJ0IHRpbWUgZm9yIHRoZSBtYWMgc3BlY2lmaWVkCisgKglpbiAmc3RydWN0IGl3bF9zY2FuX3JlcV91bWFjLgogICogQHJlc3VsdHM6IGFycmF5IG9mIHNjYW4gcmVzdWx0cywgb25seSAic2Nhbm5lZF9jaGFubmVscyIgb2YgdGhlbSBhcmUgdmFsaWQKICAqLwogc3RydWN0IGl3bF91bWFjX3NjYW5faXRlcl9jb21wbGV0ZV9ub3RpZiB7CkBAIC03MjgsOSArNzMzLDggQEAKIAl1OCBzdGF0dXM7CiAJdTggYnRfc3RhdHVzOwogCXU4IGxhc3RfY2hhbm5lbDsKLQlfX2xlMzIgdHNmX2xvdzsKLQlfX2xlMzIgdHNmX2hpZ2g7CisJX19sZTY0IHN0YXJ0X3RzZjsKIAlzdHJ1Y3QgaXdsX3NjYW5fcmVzdWx0c19ub3RpZiByZXN1bHRzW107Ci19IF9fcGFja2VkOyAvKiBTQ0FOX0lURVJfQ09NUExFVEVfTlRGX1VNQUNfQVBJX1NfVkVSXzEgKi8KK30gX19wYWNrZWQ7IC8qIFNDQU5fSVRFUl9DT01QTEVURV9OVEZfVU1BQ19BUElfU19WRVJfMiAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1zdGEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS1zdGEuaAppbmRleCBkMWM0ZmI4Li42YzhlM2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktc3RhLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLXN0YS5oCkBAIC00MzMsMjUgKzQzMyw0MiBAQAogfSBfX3BhY2tlZDsgLyogUkVNT1ZFX1NUQV9DTURfQVBJX1NfVkVSXzIgKi8KIAogLyoqCisgKiBzdHJ1Y3QgaXdsX212bV9tZ210X21jYXN0X2tleV9jbWRfdjEKKyAqICggTUdNVF9NQ0FTVF9LRVkgPSAweDFmICkKKyAqIEBjdHJsX2ZsYWdzOiAlaXdsX3N0YV9rZXlfZmxhZworICogQGlndGs6CisgKiBAazE6IHVudXNlZAorICogQGsyOiB1bnVzZWQKKyAqIEBzdGFfaWQ6IHN0YXRpb24gSUQgdGhhdCBzdXBwb3J0IElHVEsKKyAqIEBrZXlfaWQ6CisgKiBAcmVjZWl2ZV9zZXFfY250OiBpbml0aWFsIFJTQy9QTiBuZWVkZWQgZm9yIHJlcGxheSBjaGVjaworICovCitzdHJ1Y3QgaXdsX212bV9tZ210X21jYXN0X2tleV9jbWRfdjEgeworCV9fbGUzMiBjdHJsX2ZsYWdzOworCXU4IGlndGtbMTZdOworCXU4IGsxWzE2XTsKKwl1OCBrMlsxNl07CisJX19sZTMyIGtleV9pZDsKKwlfX2xlMzIgc3RhX2lkOworCV9fbGU2NCByZWNlaXZlX3NlcV9jbnQ7Cit9IF9fcGFja2VkOyAvKiBTRUNfTUdNVF9NVUxUSUNBU1RfS0VZX0NNRF9BUElfU19WRVJfMSAqLworCisvKioKICAqIHN0cnVjdCBpd2xfbXZtX21nbXRfbWNhc3Rfa2V5X2NtZAogICogKCBNR01UX01DQVNUX0tFWSA9IDB4MWYgKQogICogQGN0cmxfZmxhZ3M6ICVpd2xfc3RhX2tleV9mbGFnCi0gKiBASUdUSzoKLSAqIEBLMTogdW51c2VkCi0gKiBASzI6IHVudXNlZAorICogQGlndGs6IElHVEsgbWFzdGVyIGtleQogICogQHN0YV9pZDogc3RhdGlvbiBJRCB0aGF0IHN1cHBvcnQgSUdUSwogICogQGtleV9pZDoKICAqIEByZWNlaXZlX3NlcV9jbnQ6IGluaXRpYWwgUlNDL1BOIG5lZWRlZCBmb3IgcmVwbGF5IGNoZWNrCiAgKi8KIHN0cnVjdCBpd2xfbXZtX21nbXRfbWNhc3Rfa2V5X2NtZCB7CiAJX19sZTMyIGN0cmxfZmxhZ3M7Ci0JdTggSUdUS1sxNl07Ci0JdTggSzFbMTZdOwotCXU4IEsyWzE2XTsKKwl1OCBpZ3RrWzMyXTsKIAlfX2xlMzIga2V5X2lkOwogCV9fbGUzMiBzdGFfaWQ7CiAJX19sZTY0IHJlY2VpdmVfc2VxX2NudDsKLX0gX19wYWNrZWQ7IC8qIFNFQ19NR01UX01VTFRJQ0FTVF9LRVlfQ01EX0FQSV9TX1ZFUl8xICovCit9IF9fcGFja2VkOyAvKiBTRUNfTUdNVF9NVUxUSUNBU1RfS0VZX0NNRF9BUElfU19WRVJfMiAqLwogCiBzdHJ1Y3QgaXdsX212bV93ZXBfa2V5IHsKIAl1OCBrZXlfaW5kZXg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGktdHguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS10eC5oCmluZGV4IDQxNDQ2MjMuLjU5Y2E5N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS10eC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWFwaS10eC5oCkBAIC04OSw3ICs4OSw2IEBACiAgKiBAVFhfQ01EX0ZMR19NSF9QQUQ6IGRyaXZlciBpbnNlcnRlZCAyIGJ5dGUgcGFkZGluZyBhZnRlciBNQUMgaGVhZGVyLgogICoJU2hvdWxkIGJlIHNldCBmb3IgMjYvMzAgbGVuZ3RoIE1BQyBoZWFkZXJzCiAgKiBAVFhfQ01EX0ZMR19SRVNQX1RPX0RSVjogemVybyB0aGlzIGlmIHRoZSByZXNwb25zZSBzaG91bGQgZ28gb25seSB0byBGVwotICogQFRYX0NNRF9GTEdfQ0NNUF9BR0c6IHRoaXMgZnJhbWUgdXNlcyBDQ01QIGZvciBhZ2dyZWdhdGlvbiBhY2NlbGVyYXRpb24KICAqIEBUWF9DTURfRkxHX1RLSVBfTUlDX0RPTkU6IEZXIGFscmVhZHkgcGVyZm9ybWVkIFRLSVAgTUlDIGNhbGN1bGF0aW9uCiAgKiBAVFhfQ01EX0ZMR19EVVI6IGRpc2FibGUgZHVyYXRpb24gb3ZlcndyaXRpbmcgdXNlZCBpbiBQUy1Qb2xsIEFzc29jLWlkCiAgKiBAVFhfQ01EX0ZMR19GV19EUk9QOiBGVyBzaG91bGQgbWFyayBmcmFtZSB0byBiZSBkcm9wcGVkCkBAIC0xMTYsNyArMTE1LDYgQEAKIAlUWF9DTURfRkxHX0tFRVBfU0VRX0NUTAkJPSBCSVQoMTgpLAogCVRYX0NNRF9GTEdfTUhfUEFECQk9IEJJVCgyMCksCiAJVFhfQ01EX0ZMR19SRVNQX1RPX0RSVgkJPSBCSVQoMjEpLAotCVRYX0NNRF9GTEdfQ0NNUF9BR0cJCT0gQklUKDIyKSwKIAlUWF9DTURfRkxHX1RLSVBfTUlDX0RPTkUJPSBCSVQoMjMpLAogCVRYX0NNRF9GTEdfRFVSCQkJPSBCSVQoMjUpLAogCVRYX0NNRF9GTEdfRldfRFJPUAkJPSBCSVQoMjYpLApAQCAtMTQ5LDcgKzE0Nyw3IEBACiAgKiBAVFhfQ01EX1NFQ19FWFQ6IGV4dGVuZGVkIGNpcGhlciBhbGdvcml0aG0uCiAgKiBAVFhfQ01EX1NFQ19HQ01QOiBHQ01QIGVuY3J5cHRpb24gYWxnb3JpdGhtLgogICogQFRYX0NNRF9TRUNfS0VZMTI4OiBzZXQgZm9yIDEwNCBiaXRzIFdFUCBrZXkuCi0gKiBAVENfQ01EX1NFQ19LRVlfRlJPTV9UQUJMRTogZm9yIGEgbm9uLVdFUCBrZXksIHNldCBpZiB0aGUga2V5IHNob3VsZCBiZSB0YWtlbgorICogQFRYX0NNRF9TRUNfS0VZX0ZST01fVEFCTEU6IGZvciBhIG5vbi1XRVAga2V5LCBzZXQgaWYgdGhlIGtleSBzaG91bGQgYmUgdGFrZW4KICAqCWZyb20gdGhlIHRhYmxlIGluc3RlYWQgb2YgZnJvbSB0aGUgVFggY29tbWFuZC4KICAqCUlmIHRoZSBrZXkgaXMgdGFrZW4gZnJvbSB0aGUga2V5IHRhYmxlIGl0cyBpbmRleCBzaG91bGQgYmUgZ2l2ZW4gYnkgdGhlCiAgKglmaXJzdCBieXRlIG9mIHRoZSBUWCBjb21tYW5kIGtleSBmaWVsZC4KQEAgLTE2MSw3ICsxNTksNyBAQAogCVRYX0NNRF9TRUNfRVhUCQkJPSAweDA0LAogCVRYX0NNRF9TRUNfR0NNUAkJCT0gMHgwNSwKIAlUWF9DTURfU0VDX0tFWTEyOAkJPSAweDA4LAotCVRDX0NNRF9TRUNfS0VZX0ZST01fVEFCTEUJPSAweDA4LAorCVRYX0NNRF9TRUNfS0VZX0ZST01fVEFCTEUJPSAweDA4LAogfTsKIAogLyogVE9ETzogaG93IGRvZXMgdGhlc2UgdmFsdWVzIGFyZSBPSyB3aXRoIG9ubHkgMTYgYml0IHZhcmlhYmxlPz8/ICovCkBAIC01NzgsNiArNTc2LDg1IEBACiB9IF9fcGFja2VkOwogCiAvKioKKyAqIHN0cnVjdCBpd2xfbXZtX2NvbXByZXNzZWRfYmFfdGZkIC0gcHJvZ3Jlc3Mgb2YgYSBURkQgcXVldWUKKyAqIEBxX251bTogVEZEIHF1ZXVlIG51bWJlcgorICogQHRmZF9pbmRleDogSW5kZXggb2YgZmlyc3QgdW4tYWNrZWQgZnJhbWUgaW4gdGhlICBURkQgcXVldWUKKyAqLworc3RydWN0IGl3bF9tdm1fY29tcHJlc3NlZF9iYV90ZmQgeworCXU4IHFfbnVtOworCXU4IHJlc2VydmVkOworCV9fbGUxNiB0ZmRfaW5kZXg7Cit9IF9fcGFja2VkOyAvKiBDT01QUkVTU0VEX0JBX1RGRF9BUElfU19WRVJfMSAqLworCisvKioKKyAqIHN0cnVjdCBpd2xfbXZtX2NvbXByZXNzZWRfYmFfcmF0aWQgLSBwcm9ncmVzcyBvZiBhIFJBIFRJRCBxdWV1ZQorICogQHFfbnVtOiBSQSBUSUQgcXVldWUgbnVtYmVyCisgKiBAdGlkOiBUSUQgb2YgdGhlIHF1ZXVlCisgKiBAc3NuOiBCQSB3aW5kb3cgY3VycmVudCBTU04KKyAqLworc3RydWN0IGl3bF9tdm1fY29tcHJlc3NlZF9iYV9yYXRpZCB7CisJdTggcV9udW07CisJdTggdGlkOworCV9fbGUxNiBzc247Cit9IF9fcGFja2VkOyAvKiBDT01QUkVTU0VEX0JBX1JBVElEX0FQSV9TX1ZFUl8xICovCisKKy8qCisgKiBlbnVtIGl3bF9tdm1fYmFfcmVzcF9mbGFncyAtIFRYIGFnZ3JlZ2F0aW9uIHN0YXR1cworICogQElXTF9NVk1fQkFfUkVTUF9UWF9BR0c6IGdlbmVyYXRlZCBkdWUgdG8gQkEKKyAqIEBJV0xfTVZNX0JBX1JFU1BfVFhfQkFSOiBnZW5lcmF0ZWQgZHVlIHRvIEJBIGFmdGVyIEJBUgorICogQElXTF9NVk1fQkFfUkVTUF9UWF9BR0dfRkFJTDogYWdncmVnYXRpb24gZGlkbid0IHJlY2VpdmUgQkEKKyAqIEBJV0xfTVZNX0JBX1JFU1BfVFhfVU5ERVJSVU46IGFnZ3JlZ2F0aW9uIGdvdCB1bmRlcnJ1bgorICogQElXTF9NVk1fQkFfUkVTUF9UWF9CVF9LSUxMOiBhZ2dyZWdhdGlvbiBnb3QgQlQta2lsbAorICogQElXTF9NVk1fQkFfUkVTUF9UWF9EU1BfVElNRU9VVDogYWdncmVnYXRpb24gZGlkbid0IGZpbmlzaCB3aXRoaW4gdGhlCisgKglleHBlY3RlZCB0aW1lCisgKi8KK2VudW0gaXdsX212bV9iYV9yZXNwX2ZsYWdzIHsKKwlJV0xfTVZNX0JBX1JFU1BfVFhfQUdHLAorCUlXTF9NVk1fQkFfUkVTUF9UWF9CQVIsCisJSVdMX01WTV9CQV9SRVNQX1RYX0FHR19GQUlMLAorCUlXTF9NVk1fQkFfUkVTUF9UWF9VTkRFUlJVTiwKKwlJV0xfTVZNX0JBX1JFU1BfVFhfQlRfS0lMTCwKKwlJV0xfTVZNX0JBX1JFU1BfVFhfRFNQX1RJTUVPVVQKK307CisKKy8qKgorICogc3RydWN0IGl3bF9tdm1fY29tcHJlc3NlZF9iYV9ub3RpZiAtIG5vdGlmaWVzIGFib3V0IHJlY2VwdGlvbiBvZiBCQQorICogKCBCQV9OT1RJRiA9IDB4YzUgKQorICogQGZsYWdzOiBzdGF0dXMgZmxhZywgc2VlIHRoZSAmaXdsX212bV9iYV9yZXNwX2ZsYWdzCisgKiBAc3RhX2lkOiBJbmRleCBvZiByZWNpcGllbnQgKEJBLXNlbmRpbmcpIHN0YXRpb24gaW4gZncncyBzdGF0aW9uIHRhYmxlCisgKiBAcmVkdWNlZF90eHA6IHBvd2VyIHJlZHVjZWQgYWNjb3JkaW5nIHRvIFRQQy4gVGhpcyBpcyB0aGUgYWN0dWFsIHZhbHVlIGFuZAorICoJbm90IGEgY29weSBmcm9tIHRoZSBMUSBjb21tYW5kLiBUaHVzLCBpZiBub3QgdGhlIGZpcnN0IHJhdGUgd2FzIHVzZWQKKyAqCWZvciBUeC1pbmcgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgc2V0IHRvIDAgYnkgRlcuCisgKiBAaW5pdGlhbF9yYXRlOiBUTEMgcmF0ZSBpbmZvLCBpbml0aWFsIHJhdGUgaW5kZXgsIFRMQyB0YWJsZSBjb2xvcgorICogQHJldHJ5X2NudDogcmV0cnkgY291bnQKKyAqIEBxdWVyeV9ieXRlX2NudDogU0NEIHF1ZXJ5IGJ5dGUgY291bnQKKyAqIEBxdWVyeV9mcmFtZV9jbnQ6IFNDRCBxdWVyeSBmcmFtZSBjb3VudAorICogQHR4ZWQ6IG51bWJlciBvZiBmcmFtZXMgc2VudCBpbiB0aGUgYWdncmVnYXRpb24gKGFsbC1USURzKQorICogQGRvbmU6IG51bWJlciBvZiBmcmFtZXMgdGhhdCB3ZXJlIEFja2VkIGJ5IHRoZSBCQSAoYWxsLVRJRHMpCisgKiBAd2lyZWxlc3NfdGltZTogV2lyZWxlc3MtbWVkaWEgdGltZQorICogQHR4X3JhdGU6IHRoZSByYXRlIHRoZSBhZ2dyZWdhdGlvbiB3YXMgc2VudCBhdAorICogQHRmZF9jbnQ6IG51bWJlciBvZiBURkQtUSBlbGVtZW50cworICogQHJhX3RpZF9jbnQ6IG51bWJlciBvZiBSQVRJRC1RIGVsZW1lbnRzCisgKi8KK3N0cnVjdCBpd2xfbXZtX2NvbXByZXNzZWRfYmFfbm90aWYgeworCV9fbGUzMiBmbGFnczsKKwl1OCBzdGFfaWQ7CisJdTggcmVkdWNlZF90eHA7CisJdTggaW5pdGlhbF9yYXRlOworCXU4IHJldHJ5X2NudDsKKwlfX2xlMzIgcXVlcnlfYnl0ZV9jbnQ7CisJX19sZTE2IHF1ZXJ5X2ZyYW1lX2NudDsKKwlfX2xlMTYgdHhlZDsKKwlfX2xlMTYgZG9uZTsKKwlfX2xlMzIgd2lyZWxlc3NfdGltZTsKKwlfX2xlMzIgdHhfcmF0ZTsKKwlfX2xlMTYgdGZkX2NudDsKKwlfX2xlMTYgcmFfdGlkX2NudDsKKwlzdHJ1Y3QgaXdsX212bV9jb21wcmVzc2VkX2JhX3RmZCB0ZmRbMV07CisJc3RydWN0IGl3bF9tdm1fY29tcHJlc3NlZF9iYV9yYXRpZCByYV90aWRbMF07Cit9IF9fcGFja2VkOyAvKiBDT01QUkVTU0VEX0JBX1JFU19BUElfU19WRVJfNCAqLworCisvKioKICAqIHN0cnVjdCBpd2xfbWFjX2JlYWNvbl9jbWRfdjYgLSBiZWFjb24gdGVtcGxhdGUgY29tbWFuZAogICogQHR4OiB0aGUgdHggY29tbWFuZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBiZWFjb24gZnJhbWUKICAqIEB0ZW1wbGF0ZV9pZDogY3VycmVudGx5IGVxdWFsIHRvIHRoZSBtYWMgY29udGV4dCBpZCBvZiB0aGUgY29yZXNwb25kaW5nCkBAIC02NzUsMTMgKzc1MiwyMSBAQAogCQkJICAgIHR4X3Jlc3AtPmZyYW1lX2NvdW50KSAmIDB4ZmZmOwogfQogCisvKiBBdmFpbGFibGUgb3B0aW9ucyBmb3IgdGhlIFNDRF9RVUVVRV9DRkcgSENNRCAqLworZW51bSBpd2xfc2NkX2NmZ19hY3Rpb25zIHsKKwlTQ0RfQ0ZHX0RJU0FCTEVfUVVFVUUJCT0gMHgwLAorCVNDRF9DRkdfRU5BQkxFX1FVRVVFCQk9IDB4MSwKKwlTQ0RfQ0ZHX1VQREFURV9RVUVVRV9USUQJPSAweDIsCit9OworCiAvKioKICAqIHN0cnVjdCBpd2xfc2NkX3R4cV9jZmdfY21kIC0gTmV3IHR4cSBodyBzY2hlZHVsZXIgY29uZmlnIGNvbW1hbmQKICAqIEB0b2tlbjoKICAqIEBzdGFfaWQ6IHN0YXRpb24gaWQKICAqIEB0aWQ6CiAgKiBAc2NkX3F1ZXVlOiBzY2hlZHVsZXIgcXVldWUgdG8gY29uZml1ZwotICogQGVuYWJsZTogMSBxdWV1ZSBlbmFibGUsIDAgcXVldWUgZGlzYWJsZQorICogQGFjdGlvbjogMSBxdWV1ZSBlbmFibGUsIDAgcXVldWUgZGlzYWJsZSwgMiBjaGFuZ2UgdHhxJ3MgdGlkIG93bmVyCisgKglWYWx1ZSBpcyBvbmUgb2YgJWl3bF9zY2RfY2ZnX2FjdGlvbnMgb3B0aW9ucwogICogQGFnZ3JlZ2F0ZTogMSBhZ2dyZWdhdGVkIHF1ZXVlLCAwIG90aGVyd2lzZQogICogQHR4X2ZpZm86ICVlbnVtIGl3bF9tdm1fdHhfZmlmbwogICogQHdpbmRvdzogQkEgd2luZG93IHNpemUKQEAgLTY5Miw3ICs3NzcsNyBAQAogCXU4IHN0YV9pZDsKIAl1OCB0aWQ7CiAJdTggc2NkX3F1ZXVlOwotCXU4IGVuYWJsZTsKKwl1OCBhY3Rpb247CiAJdTggYWdncmVnYXRlOwogCXU4IHR4X2ZpZm87CiAJdTggd2luZG93OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZnctYXBpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGkuaAppbmRleCA3MTA3NmYwLi45NzYzMzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1hcGkuaApAQCAtMjA1LDcgKzIwNSw3IEBACiAJLyogUGh5ICovCiAJUEhZX0NPTkZJR1VSQVRJT05fQ01EID0gMHg2YSwKIAlDQUxJQl9SRVNfTk9USUZfUEhZX0RCID0gMHg2YiwKLQkvKiBQSFlfREJfQ01EID0gMHg2YywgKi8KKwlQSFlfREJfQ01EID0gMHg2YywKIAogCS8qIFRvRiAtIDgwMi4xMW1jIEZUTSAqLwogCVRPRl9DTUQgPSAweDEwLApAQCAtMzQwLDYgKzM0MCwxMSBAQAogCVNUT1JFRF9CRUFDT05fTlRGID0gMHhGRiwKIH07CiAKK2VudW0gaXdsX2ZtYWNfZGVidWdfY21kcyB7CisJTE1BQ19SRF9XUiA9IDB4MCwKKwlVTUFDX1JEX1dSID0gMHgxLAorfTsKKwogLyogY29tbWFuZCBncm91cHMgKi8KIGVudW0gewogCUxFR0FDWV9HUk9VUCA9IDB4MCwKQEAgLTM0OSw2ICszNTQsNyBAQAogCVBIWV9PUFNfR1JPVVAgPSAweDQsCiAJREFUQV9QQVRIX0dST1VQID0gMHg1LAogCVBST1RfT0ZGTE9BRF9HUk9VUCA9IDB4YiwKKwlERUJVR19HUk9VUCA9IDB4ZiwKIH07CiAKIC8qKgpAQCAtNDgyLDEzICs0ODgsMTcgQEAKICAqIEBibG9ja19zaXplOiB0aGUgYmxvY2sgc2l6ZSBpbiBwb3dlcnMgb2YgMgogICogQGJsb2NrX251bTogbnVtYmVyIG9mIGJsb2NrcyBzcGVjaWZpZWQgaW4gdGhlIGNvbW1hbmQuCiAgKiBAZGV2aWNlX3BoeV9hZGRyOiB2aXJ0dWFsIGFkZHJlc3NlcyBmcm9tIGRldmljZSBzaWRlCisgKgkzMiBiaXQgYWRkcmVzcyBmb3IgQVBJIHZlcnNpb24gMSwgNjQgYml0IGFkZHJlc3MgZm9yIEFQSSB2ZXJzaW9uIDIuCiAqLwogc3RydWN0IGl3bF9md19wYWdpbmdfY21kIHsKIAlfX2xlMzIgZmxhZ3M7CiAJX19sZTMyIGJsb2NrX3NpemU7CiAJX19sZTMyIGJsb2NrX251bTsKLQlfX2xlMzIgZGV2aWNlX3BoeV9hZGRyW05VTV9PRl9GV19QQUdJTkdfQkxPQ0tTXTsKLX0gX19wYWNrZWQ7IC8qIEZXX1BBR0lOR19CTE9DS19DTURfQVBJX1NfVkVSXzEgKi8KKwl1bmlvbiB7CisJCV9fbGUzMiBhZGRyMzJbTlVNX09GX0ZXX1BBR0lOR19CTE9DS1NdOworCQlfX2xlNjQgYWRkcjY0W05VTV9PRl9GV19QQUdJTkdfQkxPQ0tTXTsKKwl9IGRldmljZV9waHlfYWRkcjsKK30gX19wYWNrZWQ7IC8qIEZXX1BBR0lOR19CTE9DS19DTURfQVBJX1NfVkVSXzIgKi8KIAogLyoKICAqIEZ3IGl0ZW1zIElEJ3MKQEAgLTE5NzMsOCArMTk4Myw5IEBACiAJc3RydWN0IGl3bF90ZGxzX2NvbmZpZ19zdGFfaW5mb19yZXMgc3RhX2luZm9bSVdMX01WTV9URExTX1NUQV9DT1VOVF07CiB9IF9fcGFja2VkOyAvKiBURExTX0NPTkZJR19SU1BfQVBJX1NfVkVSXzEgKi8KIAotI2RlZmluZSBUWF9GSUZPX01BWF9OVU0JCTgKLSNkZWZpbmUgUlhfRklGT19NQVhfTlVNCQkyCisjZGVmaW5lIFRYX0ZJRk9fTUFYX05VTV85MDAwCQk4CisjZGVmaW5lIFRYX0ZJRk9fTUFYX05VTQkJCTE1CisjZGVmaW5lIFJYX0ZJRk9fTUFYX05VTQkJCTIKICNkZWZpbmUgVFhfRklGT19JTlRFUk5BTF9NQVhfTlVNCTYKIAogLyoqCkBAIC0yMDAwLDYgKzIwMTEsMjEgQEAKICAqIE5PVEU6IG9uIGZpcm13YXJlIHRoYXQgZG9uJ3QgaGF2ZSBJV0xfVUNPREVfVExWX0NBUEFfRVhURU5EX1NIQVJFRF9NRU1fQ0ZHCiAgKgkgc2V0LCB0aGUgbGFzdCAzIG1lbWJlcnMgZG9uJ3QgZXhpc3QuCiAgKi8KK3N0cnVjdCBpd2xfc2hhcmVkX21lbV9jZmdfdjEgeworCV9fbGUzMiBzaGFyZWRfbWVtX2FkZHI7CisJX19sZTMyIHNoYXJlZF9tZW1fc2l6ZTsKKwlfX2xlMzIgc2FtcGxlX2J1ZmZfYWRkcjsKKwlfX2xlMzIgc2FtcGxlX2J1ZmZfc2l6ZTsKKwlfX2xlMzIgdHhmaWZvX2FkZHI7CisJX19sZTMyIHR4Zmlmb19zaXplW1RYX0ZJRk9fTUFYX05VTV85MDAwXTsKKwlfX2xlMzIgcnhmaWZvX3NpemVbUlhfRklGT19NQVhfTlVNXTsKKwlfX2xlMzIgcGFnZV9idWZmX2FkZHI7CisJX19sZTMyIHBhZ2VfYnVmZl9zaXplOworCV9fbGUzMiByeGZpZm9fYWRkcjsKKwlfX2xlMzIgaW50ZXJuYWxfdHhmaWZvX2FkZHI7CisJX19sZTMyIGludGVybmFsX3R4Zmlmb19zaXplW1RYX0ZJRk9fSU5URVJOQUxfTUFYX05VTV07Cit9IF9fcGFja2VkOyAvKiBTSEFSRURfTUVNX0FMTE9DX0FQSV9TX1ZFUl8yICovCisKIHN0cnVjdCBpd2xfc2hhcmVkX21lbV9jZmcgewogCV9fbGUzMiBzaGFyZWRfbWVtX2FkZHI7CiAJX19sZTMyIHNoYXJlZF9tZW1fc2l6ZTsKQEAgLTIwMTMsNyArMjAzOSw3IEBACiAJX19sZTMyIHJ4Zmlmb19hZGRyOwogCV9fbGUzMiBpbnRlcm5hbF90eGZpZm9fYWRkcjsKIAlfX2xlMzIgaW50ZXJuYWxfdHhmaWZvX3NpemVbVFhfRklGT19JTlRFUk5BTF9NQVhfTlVNXTsKLX0gX19wYWNrZWQ7IC8qIFNIQVJFRF9NRU1fQUxMT0NfQVBJX1NfVkVSXzIgKi8KK30gX19wYWNrZWQ7IC8qIFNIQVJFRF9NRU1fQUxMT0NfQVBJX1NfVkVSXzMgKi8KIAogLyoqCiAgKiBWSFQgTVUtTUlNTyBncm91cCBjb25maWd1cmF0aW9uCkBAIC0yMTI5LDQgKzIxNTUsNDggQEAKIAlfX2xlMzIgaWRfYW5kX2NvbG9yOwogfSBfX3BhY2tlZDsgLyogQ0hBTk5FTF9TV0lUQ0hfU1RBUlRfTlRGWV9BUElfU19WRVJfMSAqLwogCisvKiBPcGVyYXRpb24gdHlwZXMgZm9yIHRoZSBkZWJ1ZyBtZW0gYWNjZXNzICovCitlbnVtIHsKKwlERUJVR19NRU1fT1BfUkVBRCA9IDAsCisJREVCVUdfTUVNX09QX1dSSVRFID0gMSwKKwlERUJVR19NRU1fT1BfV1JJVEVfQllURVMgPSAyLAorfTsKKworI2RlZmluZSBERUJVR19NRU1fTUFYX1NJWkVfRFdPUkRTIDMyCisKKy8qKgorICogc3RydWN0IGl3bF9kYmdfbWVtX2FjY2Vzc19jbWQgLSBSZXF1ZXN0IHRoZSBkZXZpY2UgdG8gcmVhZC93cml0ZSBtZW1vcnkKKyAqIEBvcDogREVCVUdfTUVNX09QXyoKKyAqIEBhZGRyOiBhZGRyZXNzIHRvIHJlYWQvd3JpdGUgZnJvbS90bworICogQGxlbjogaW4gZHdvcmRzLCB0byByZWFkL3dyaXRlCisgKiBAZGF0YTogZm9yIHdyaXRlIG9wZWF0aW9ucywgY29udGFpbnMgdGhlIHNvdXJjZSBidWZmZXIKKyAqLworc3RydWN0IGl3bF9kYmdfbWVtX2FjY2Vzc19jbWQgeworCV9fbGUzMiBvcDsKKwlfX2xlMzIgYWRkcjsKKwlfX2xlMzIgbGVuOworCV9fbGUzMiBkYXRhW107Cit9IF9fcGFja2VkOyAvKiBERUJVR18oVXxMKU1BQ19SRF9XUl9DTURfQVBJX1NfVkVSXzEgKi8KKworLyogU3RhdHVzIHJlc3BvbnNlcyBmb3IgdGhlIGRlYnVnIG1lbSBhY2Nlc3MgKi8KK2VudW0geworCURFQlVHX01FTV9TVEFUVVNfU1VDQ0VTUyA9IDB4MCwKKwlERUJVR19NRU1fU1RBVFVTX0ZBSUxFRCA9IDB4MSwKKwlERUJVR19NRU1fU1RBVFVTX0xPQ0tFRCA9IDB4MiwKKwlERUJVR19NRU1fU1RBVFVTX0hJRERFTiA9IDB4MywKKwlERUJVR19NRU1fU1RBVFVTX0xFTkdUSCA9IDB4NCwKK307CisKKy8qKgorICogc3RydWN0IGl3bF9kYmdfbWVtX2FjY2Vzc19yc3AgLSBSZXNwb25zZSB0byBkZWJ1ZyBtZW0gY29tbWFuZHMKKyAqIEBzdGF0dXM6IERFQlVHX01FTV9TVEFUVVNfKgorICogQGxlbjogcmVhZCBkd29yZHMgKDAgZm9yIHdyaXRlIG9wZXJhdGlvbnMpCisgKiBAZGF0YTogY29udGFpbnMgdGhlIHJlYWQgRFdzCisgKi8KK3N0cnVjdCBpd2xfZGJnX21lbV9hY2Nlc3NfcnNwIHsKKwlfX2xlMzIgc3RhdHVzOworCV9fbGUzMiBsZW47CisJX19sZTMyIGRhdGFbXTsKK30gX19wYWNrZWQ7IC8qIERFQlVHXyhVfEwpTUFDX1JEX1dSX1JTUF9BUElfU19WRVJfMSAqLworCiAjZW5kaWYgLyogX19md19hcGlfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1kYmcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5jCmluZGV4IDFhYmNhYmIuLmQ4OWQwYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5jCkBAIC00NDAsMTQgKzQ0MCwxMiBAQAogCXsgLnN0YXJ0ID0gMHgwMGEwNDU2MCwgLmVuZCA9IDB4MDBhMDQ1N2MgfSwKIAl7IC5zdGFydCA9IDB4MDBhMDQ1OTAsIC5lbmQgPSAweDAwYTA0NTk4IH0sCiAJeyAuc3RhcnQgPSAweDAwYTA0NWMwLCAuZW5kID0gMHgwMGEwNDVmNCB9LAotCXsgLnN0YXJ0ID0gMHgwMGE0NDAwMCwgLmVuZCA9IDB4MDBhN2JmODAgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX3BycGhfcmFuZ2UgaXdsX3BycGhfZHVtcF9hZGRyXzkwMDBbXSA9IHsKIAl7IC5zdGFydCA9IDB4MDBhMDVjMDAsIC5lbmQgPSAweDAwYTA1YzE4IH0sCiAJeyAuc3RhcnQgPSAweDAwYTA1NDAwLCAuZW5kID0gMHgwMGEwNTZlOCB9LAogCXsgLnN0YXJ0ID0gMHgwMGEwODAwMCwgLmVuZCA9IDB4MDBhMDk4YmMgfSwKLQl7IC5zdGFydCA9IDB4MDBhZGZjMDAsIC5lbmQgPSAweDAwYWRmZDFjIH0sCiAJeyAuc3RhcnQgPSAweDAwYTAyNDAwLCAuZW5kID0gMHgwMGEwMjc1OCB9LAogfTsKIApAQCAtNTU5LDcgKzU1Nyw3IEBACiAJCQkJCSBzaXplb2Yoc3RydWN0IGl3bF9md19lcnJvcl9kdW1wX2ZpZm8pOwogCQl9CiAKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWVtX2NmZy0+dHhmaWZvX3NpemUpOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IG1lbV9jZmctPm51bV90eGZpZm9fZW50cmllczsgaSsrKSB7CiAJCQlpZiAoIW1lbV9jZmctPnR4Zmlmb19zaXplW2ldKQogCQkJCWNvbnRpbnVlOwogCkBAIC05NjAsNSArOTU4LDYgQEAKIAl9CiAKIAltdm0tPmZ3X2RiZ19jb25mID0gY29uZl9pZDsKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy1kYmcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5oCmluZGV4IGY3ZGZmNzYuLmU5ZjFiZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LWRiZy5oCkBAIC0xMDUsNyArMTA1LDggQEAKIHsKIAl1MzIgdHJpZ192aWYgPSBsZTMyX3RvX2NwdSh0cmlnLT52aWZfdHlwZSk7CiAKLQlyZXR1cm4gdHJpZ192aWYgPT0gSVdMX0ZXX0RCR19DT05GX1ZJRl9BTlkgfHwgdmlmLT50eXBlID09IHRyaWdfdmlmOworCXJldHVybiB0cmlnX3ZpZiA9PSBJV0xfRldfREJHX0NPTkZfVklGX0FOWSB8fAorCSAgICAgICBpZWVlODAyMTFfdmlmX3R5cGVfcDJwKHZpZikgPT0gdHJpZ192aWY7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL2Z3LmMKaW5kZXggN2UwY2RiZi4uODcyMDY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vZncuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9mdy5jCkBAIC05MCwxNSArOTAsNiBAQAogCXUzMiBzY2RfYmFzZV9hZGRyOwogfTsKIAotc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgZndfaW1nICoKLWl3bF9nZXRfdWNvZGVfaW1hZ2Uoc3RydWN0IGl3bF9tdm0gKm12bSwgZW51bSBpd2xfdWNvZGVfdHlwZSB1Y29kZV90eXBlKQotewotCWlmICh1Y29kZV90eXBlID49IElXTF9VQ09ERV9UWVBFX01BWCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gJm12bS0+ZnctPmltZ1t1Y29kZV90eXBlXTsKLX0KLQogc3RhdGljIGludCBpd2xfc2VuZF90eF9hbnRfY2ZnKHN0cnVjdCBpd2xfbXZtICptdm0sIHU4IHZhbGlkX3R4X2FudCkKIHsKIAlzdHJ1Y3QgaXdsX3R4X2FudF9jZmdfY21kIHR4X2FudF9jbWQgPSB7CkBAIC0zODUsOSArMzc2LDcgQEAKIC8qIHNlbmQgcGFnaW5nIGNtZCB0byBGVyBpbiBjYXNlIENQVTIgaGFzIHBhZ2luZyBpbWFnZSAqLwogc3RhdGljIGludCBpd2xfc2VuZF9wYWdpbmdfY21kKHN0cnVjdCBpd2xfbXZtICptdm0sIGNvbnN0IHN0cnVjdCBmd19pbWcgKmZ3KQogewotCWludCBibGtfaWR4OwotCV9fbGUzMiBkZXZfcGh5X2FkZHI7Ci0Jc3RydWN0IGl3bF9md19wYWdpbmdfY21kIGZ3X3BhZ2luZ19jbWQgPSB7CisJc3RydWN0IGl3bF9md19wYWdpbmdfY21kIHBhZ2luZ19jbWQgPSB7CiAJCS5mbGFncyA9CiAJCQljcHVfdG9fbGUzMihQQUdJTkdfQ01EX0lTX1NFQ1VSRUQgfAogCQkJCSAgICBQQUdJTkdfQ01EX0lTX0VOQUJMRUQgfApAQCAtMzk2LDE4ICszODUsMzIgQEAKIAkJLmJsb2NrX3NpemUgPSBjcHVfdG9fbGUzMihCTE9DS18yX0VYUF9TSVpFKSwKIAkJLmJsb2NrX251bSA9IGNwdV90b19sZTMyKG12bS0+bnVtX29mX3BhZ2luZ19ibGspLAogCX07CisJaW50IGJsa19pZHgsIHNpemUgPSBzaXplb2YocGFnaW5nX2NtZCk7CisKKwkvKiBBIGJpdCBoYXJkIGNvZGVkIC0gYnV0IHRoaXMgaXMgdGhlIG9sZCBBUEkgYW5kIHdpbGwgYmUgZGVwcmVjYXRlZCAqLworCWlmICghaXdsX212bV9oYXNfbmV3X3R4X2FwaShtdm0pKQorCQlzaXplIC09IE5VTV9PRl9GV19QQUdJTkdfQkxPQ0tTICogNDsKIAogCS8qIGxvb3AgZm9yIGZvciBhbGwgcGFnaW5nIGJsb2NrcyArIENTUyBibG9jayAqLwogCWZvciAoYmxrX2lkeCA9IDA7IGJsa19pZHggPCBtdm0tPm51bV9vZl9wYWdpbmdfYmxrICsgMTsgYmxrX2lkeCsrKSB7Ci0JCWRldl9waHlfYWRkciA9Ci0JCQljcHVfdG9fbGUzMihtdm0tPmZ3X3BhZ2luZ19kYltibGtfaWR4XS5md19wYWdpbmdfcGh5cyA+PgotCQkJCSAgICBQQUdFXzJfRVhQX1NJWkUpOwotCQlmd19wYWdpbmdfY21kLmRldmljZV9waHlfYWRkcltibGtfaWR4XSA9IGRldl9waHlfYWRkcjsKKwkJZG1hX2FkZHJfdCBhZGRyID0gbXZtLT5md19wYWdpbmdfZGJbYmxrX2lkeF0uZndfcGFnaW5nX3BoeXM7CisKKwkJYWRkciA9IGFkZHIgPj4gUEFHRV8yX0VYUF9TSVpFOworCisJCWlmIChpd2xfbXZtX2hhc19uZXdfdHhfYXBpKG12bSkpIHsKKwkJCV9fbGU2NCBwaHlfYWRkciA9IGNwdV90b19sZTY0KGFkZHIpOworCisJCQlwYWdpbmdfY21kLmRldmljZV9waHlfYWRkci5hZGRyNjRbYmxrX2lkeF0gPSBwaHlfYWRkcjsKKwkJfSBlbHNlIHsKKwkJCV9fbGUzMiBwaHlfYWRkciA9IGNwdV90b19sZTMyKGFkZHIpOworCisJCQlwYWdpbmdfY21kLmRldmljZV9waHlfYWRkci5hZGRyMzJbYmxrX2lkeF0gPSBwaHlfYWRkcjsKKwkJfQogCX0KIAogCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIGl3bF9jbWRfaWQoRldfUEFHSU5HX0JMT0NLX0NNRCwKIAkJCQkJCSAgICBJV0xfQUxXQVlTX0xPTkdfR1JPVVAsIDApLAotCQkJCSAgICAwLCBzaXplb2YoZndfcGFnaW5nX2NtZCksICZmd19wYWdpbmdfY21kKTsKKwkJCQkgICAgMCwgc2l6ZSwgJnBhZ2luZ19jbWQpOwogfQogCiAvKgpAQCAtNTgwLDkgKzU4Myw5IEBACiAJICAgIGl3bF9md19kYmdfY29uZl91c25pZmZlcihtdm0tPmZ3LCBGV19EQkdfU1RBUlRfRlJPTV9BTElWRSkgJiYKIAkgICAgIShmd19oYXNfY2FwYSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKIAkJCSAgSVdMX1VDT0RFX1RMVl9DQVBBX1VTTklGRkVSX1VOSUZJRUQpKSkKLQkJZncgPSBpd2xfZ2V0X3Vjb2RlX2ltYWdlKG12bSwgSVdMX1VDT0RFX1JFR1VMQVJfVVNOSUZGRVIpOworCQlmdyA9IGl3bF9nZXRfdWNvZGVfaW1hZ2UobXZtLT5mdywgSVdMX1VDT0RFX1JFR1VMQVJfVVNOSUZGRVIpOwogCWVsc2UKLQkJZncgPSBpd2xfZ2V0X3Vjb2RlX2ltYWdlKG12bSwgdWNvZGVfdHlwZSk7CisJCWZ3ID0gaXdsX2dldF91Y29kZV9pbWFnZShtdm0tPmZ3LCB1Y29kZV90eXBlKTsKIAlpZiAoV0FSTl9PTighZncpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAltdm0tPmN1cl91Y29kZSA9IHVjb2RlX3R5cGU7CkBAIC04MjYsNiArODI5LDU5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgaXdsX212bV9wYXJzZV9zaGFyZWRfbWVtX2EwMDAoc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQkJICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KQoreworCXN0cnVjdCBpd2xfc2hhcmVkX21lbV9jZmcgKm1lbV9jZmcgPSAodm9pZCAqKXBrdC0+ZGF0YTsKKwlpbnQgaTsKKworCW12bS0+c2hhcmVkX21lbV9jZmcubnVtX3R4Zmlmb19lbnRyaWVzID0KKwkJQVJSQVlfU0laRShtdm0tPnNoYXJlZF9tZW1fY2ZnLnR4Zmlmb19zaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZW1fY2ZnLT50eGZpZm9fc2l6ZSk7IGkrKykKKwkJbXZtLT5zaGFyZWRfbWVtX2NmZy50eGZpZm9fc2l6ZVtpXSA9CisJCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT50eGZpZm9fc2l6ZVtpXSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXZtLT5zaGFyZWRfbWVtX2NmZy5yeGZpZm9fc2l6ZSk7IGkrKykKKwkJbXZtLT5zaGFyZWRfbWVtX2NmZy5yeGZpZm9fc2l6ZVtpXSA9CisJCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5yeGZpZm9fc2l6ZVtpXSk7CisKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKG12bS0+c2hhcmVkX21lbV9jZmcuaW50ZXJuYWxfdHhmaWZvX3NpemUpICE9CisJCSAgICAgc2l6ZW9mKG1lbV9jZmctPmludGVybmFsX3R4Zmlmb19zaXplKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdm0tPnNoYXJlZF9tZW1fY2ZnLmludGVybmFsX3R4Zmlmb19zaXplKTsKKwkgICAgIGkrKykKKwkJbXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fc2l6ZVtpXSA9CisJCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5pbnRlcm5hbF90eGZpZm9fc2l6ZVtpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGl3bF9tdm1fcGFyc2Vfc2hhcmVkX21lbShzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJCSAgICAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkKK3sKKwlzdHJ1Y3QgaXdsX3NoYXJlZF9tZW1fY2ZnX3YxICptZW1fY2ZnID0gKHZvaWQgKilwa3QtPmRhdGE7CisJaW50IGk7CisKKwltdm0tPnNoYXJlZF9tZW1fY2ZnLm51bV90eGZpZm9fZW50cmllcyA9CisJCUFSUkFZX1NJWkUobXZtLT5zaGFyZWRfbWVtX2NmZy50eGZpZm9fc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWVtX2NmZy0+dHhmaWZvX3NpemUpOyBpKyspCisJCW12bS0+c2hhcmVkX21lbV9jZmcudHhmaWZvX3NpemVbaV0gPQorCQkJbGUzMl90b19jcHUobWVtX2NmZy0+dHhmaWZvX3NpemVbaV0pOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX3NpemUpOyBpKyspCisJCW12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX3NpemVbaV0gPQorCQkJbGUzMl90b19jcHUobWVtX2NmZy0+cnhmaWZvX3NpemVbaV0pOworCisJLyogbmV3IEFQSSBoYXMgbW9yZSBkYXRhLCBmcm9tIHJ4Zmlmb19hZGRyIGZpZWxkIGFuZCBvbiAqLworCWlmIChmd19oYXNfY2FwYSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKKwkJCUlXTF9VQ09ERV9UTFZfQ0FQQV9FWFRFTkRfU0hBUkVEX01FTV9DRkcpKSB7CisJCUJVSUxEX0JVR19PTihzaXplb2YobXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fc2l6ZSkgIT0KKwkJCSAgICAgc2l6ZW9mKG1lbV9jZmctPmludGVybmFsX3R4Zmlmb19zaXplKSk7CisKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgQVJSQVlfU0laRShtdm0tPnNoYXJlZF9tZW1fY2ZnLmludGVybmFsX3R4Zmlmb19zaXplKTsKKwkJICAgICBpKyspCisJCQltdm0tPnNoYXJlZF9tZW1fY2ZnLmludGVybmFsX3R4Zmlmb19zaXplW2ldID0KKwkJCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5pbnRlcm5hbF90eGZpZm9fc2l6ZVtpXSk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBpd2xfbXZtX2dldF9zaGFyZWRfbWVtX2NvbmYoc3RydWN0IGl3bF9tdm0gKm12bSkKIHsKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKQEAgLTgzMyw5ICs4ODksNyBAQAogCQkuZGF0YSA9IHsgTlVMTCwgfSwKIAkJLmxlbiA9IHsgMCwgfSwKIAl9OwotCXN0cnVjdCBpd2xfc2hhcmVkX21lbV9jZmcgKm1lbV9jZmc7CiAJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdDsKLQl1MzIgaTsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwogCkBAIC04NDksNDUgKzkwMywxMCBAQAogCQlyZXR1cm47CiAKIAlwa3QgPSBjbWQucmVzcF9wa3Q7Ci0JbWVtX2NmZyA9ICh2b2lkICopcGt0LT5kYXRhOwotCi0JbXZtLT5zaGFyZWRfbWVtX2NmZy5zaGFyZWRfbWVtX2FkZHIgPQotCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5zaGFyZWRfbWVtX2FkZHIpOwotCW12bS0+c2hhcmVkX21lbV9jZmcuc2hhcmVkX21lbV9zaXplID0KLQkJbGUzMl90b19jcHUobWVtX2NmZy0+c2hhcmVkX21lbV9zaXplKTsKLQltdm0tPnNoYXJlZF9tZW1fY2ZnLnNhbXBsZV9idWZmX2FkZHIgPQotCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5zYW1wbGVfYnVmZl9hZGRyKTsKLQltdm0tPnNoYXJlZF9tZW1fY2ZnLnNhbXBsZV9idWZmX3NpemUgPQotCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5zYW1wbGVfYnVmZl9zaXplKTsKLQltdm0tPnNoYXJlZF9tZW1fY2ZnLnR4Zmlmb19hZGRyID0gbGUzMl90b19jcHUobWVtX2NmZy0+dHhmaWZvX2FkZHIpOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG12bS0+c2hhcmVkX21lbV9jZmcudHhmaWZvX3NpemUpOyBpKyspCi0JCW12bS0+c2hhcmVkX21lbV9jZmcudHhmaWZvX3NpemVbaV0gPQotCQkJbGUzMl90b19jcHUobWVtX2NmZy0+dHhmaWZvX3NpemVbaV0pOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX3NpemUpOyBpKyspCi0JCW12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX3NpemVbaV0gPQotCQkJbGUzMl90b19jcHUobWVtX2NmZy0+cnhmaWZvX3NpemVbaV0pOwotCW12bS0+c2hhcmVkX21lbV9jZmcucGFnZV9idWZmX2FkZHIgPQotCQlsZTMyX3RvX2NwdShtZW1fY2ZnLT5wYWdlX2J1ZmZfYWRkcik7Ci0JbXZtLT5zaGFyZWRfbWVtX2NmZy5wYWdlX2J1ZmZfc2l6ZSA9Ci0JCWxlMzJfdG9fY3B1KG1lbV9jZmctPnBhZ2VfYnVmZl9zaXplKTsKLQotCS8qIG5ldyBBUEkgaGFzIG1vcmUgZGF0YSAqLwotCWlmIChmd19oYXNfY2FwYSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKLQkJCUlXTF9VQ09ERV9UTFZfQ0FQQV9FWFRFTkRfU0hBUkVEX01FTV9DRkcpKSB7Ci0JCW12bS0+c2hhcmVkX21lbV9jZmcucnhmaWZvX2FkZHIgPQotCQkJbGUzMl90b19jcHUobWVtX2NmZy0+cnhmaWZvX2FkZHIpOwotCQltdm0tPnNoYXJlZF9tZW1fY2ZnLmludGVybmFsX3R4Zmlmb19hZGRyID0KLQkJCWxlMzJfdG9fY3B1KG1lbV9jZmctPmludGVybmFsX3R4Zmlmb19hZGRyKTsKLQotCQlCVUlMRF9CVUdfT04oc2l6ZW9mKG12bS0+c2hhcmVkX21lbV9jZmcuaW50ZXJuYWxfdHhmaWZvX3NpemUpICE9Ci0JCQkgICAgIHNpemVvZihtZW1fY2ZnLT5pbnRlcm5hbF90eGZpZm9fc2l6ZSkpOwotCi0JCWZvciAoaSA9IDA7Ci0JCSAgICAgaSA8IEFSUkFZX1NJWkUobXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fc2l6ZSk7Ci0JCSAgICAgaSsrKQotCQkJbXZtLT5zaGFyZWRfbWVtX2NmZy5pbnRlcm5hbF90eGZpZm9fc2l6ZVtpXSA9Ci0JCQkJbGUzMl90b19jcHUobWVtX2NmZy0+aW50ZXJuYWxfdHhmaWZvX3NpemVbaV0pOwotCX0KKwlpZiAoaXdsX212bV9oYXNfbmV3X3R4X2FwaShtdm0pKQorCQlpd2xfbXZtX3BhcnNlX3NoYXJlZF9tZW1fYTAwMChtdm0sIHBrdCk7CisJZWxzZQorCQlpd2xfbXZtX3BhcnNlX3NoYXJlZF9tZW0obXZtLCBwa3QpOwogCiAJSVdMX0RFQlVHX0lORk8obXZtLCAiU0hBUkVEIE1FTSBDRkc6IGdvdCBtZW1vcnkgb2Zmc2V0cy9zaXplc1xuIik7CiAKQEAgLTEwMjcsMTkgKzEwNDYsMTEgQEAKIHsKIAlzdHJ1Y3QgaXdsX212bV9zYXJfdGFibGUgc2FyX3RhYmxlOwogCXN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZCBjbWQgPSB7Ci0JCS52My52Mi5zZXRfbW9kZSA9IGNwdV90b19sZTMyKElXTF9UWF9QT1dFUl9NT0RFX1NFVF9DSEFJTlMpLAorCQkudjMuc2V0X21vZGUgPSBjcHVfdG9fbGUzMihJV0xfVFhfUE9XRVJfTU9ERV9TRVRfQ0hBSU5TKSwKIAl9OwogCWludCByZXQsIGksIGosIGlkeDsKIAlpbnQgbGVuID0gc2l6ZW9mKGNtZCk7CiAKLQkvKiB3ZSBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSB0YWJsZSBpZiB0aGUgRlcgZG9lc24ndCBzdXBwb3J0IGl0ICovCi0JaWYgKCFmd19oYXNfYXBpKCZtdm0tPmZ3LT51Y29kZV9jYXBhLAotCQkJSVdMX1VDT0RFX1RMVl9BUElfVFhfUE9XRVJfQ0hBSU4pKSB7Ci0JCUlXTF9ERUJVR19SQURJTyhtdm0sCi0JCQkJIkZXIGRvZXNuJ3Qgc3VwcG9ydCBwZXItY2hhaW4gVFggcG93ZXIgc2V0dGluZ3MuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCiAJaWYgKCFmd19oYXNfY2FwYSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwgSVdMX1VDT0RFX1RMVl9DQVBBX1RYX1BPV0VSX0FDSykpCiAJCWxlbiA9IHNpemVvZihjbWQudjMpOwogCkBAIC0xMDk2LDI3ICsxMTA3LDI3IEBACiAJICogKGZvciBleGFtcGxlLCBpZiB3ZSB3ZXJlIGluIFJGS0lMTCkKIAkgKi8KIAlyZXQgPSBpd2xfcnVuX2luaXRfbXZtX3Vjb2RlKG12bSwgZmFsc2UpOwotCWlmIChyZXQgJiYgIWl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKSB7CisKKwlpZiAoaXdsbXZtX21vZF9wYXJhbXMuaW5pdF9kYmcpCisJCXJldHVybiAwOworCisJaWYgKHJldCkgewogCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byBydW4gSU5JVCB1Y29kZTogJWRcbiIsIHJldCk7CiAJCS8qIHRoaXMgY2FuJ3QgaGFwcGVuICovCiAJCWlmIChXQVJOX09OKHJldCA+IDApKQogCQkJcmV0ID0gLUVSRktJTEw7CiAJCWdvdG8gZXJyb3I7CiAJfQotCWlmICghaXdsbXZtX21vZF9wYXJhbXMuaW5pdF9kYmcpIHsKLQkJLyoKLQkJICogU3RvcCBhbmQgc3RhcnQgdGhlIHRyYW5zcG9ydCB3aXRob3V0IGVudGVyaW5nIGxvdyBwb3dlcgotCQkgKiBtb2RlLiBUaGlzIHdpbGwgc2F2ZSB0aGUgc3RhdGUgb2Ygb3RoZXIgY29tcG9uZW50cyBvbiB0aGUKLQkJICogZGV2aWNlIHRoYXQgYXJlIHRyaWdnZXJlZCBieSB0aGUgSU5JVCBmaXJ3bWFyZSAoTUZVQVJUKS4KLQkJICovCi0JCV9pd2xfdHJhbnNfc3RvcF9kZXZpY2UobXZtLT50cmFucywgZmFsc2UpOwotCQlyZXQgPSBfaXdsX3RyYW5zX3N0YXJ0X2h3KG12bS0+dHJhbnMsIGZhbHNlKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3I7Ci0JfQogCi0JaWYgKGl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKQotCQlyZXR1cm4gMDsKKwkvKgorCSAqIFN0b3AgYW5kIHN0YXJ0IHRoZSB0cmFuc3BvcnQgd2l0aG91dCBlbnRlcmluZyBsb3cgcG93ZXIKKwkgKiBtb2RlLiBUaGlzIHdpbGwgc2F2ZSB0aGUgc3RhdGUgb2Ygb3RoZXIgY29tcG9uZW50cyBvbiB0aGUKKwkgKiBkZXZpY2UgdGhhdCBhcmUgdHJpZ2dlcmVkIGJ5IHRoZSBJTklUIGZpcndtYXJlIChNRlVBUlQpLgorCSAqLworCV9pd2xfdHJhbnNfc3RvcF9kZXZpY2UobXZtLT50cmFucywgZmFsc2UpOworCXJldCA9IF9pd2xfdHJhbnNfc3RhcnRfaHcobXZtLT50cmFucywgZmFsc2UpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CiAKIAlyZXQgPSBpd2xfbXZtX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShtdm0sIElXTF9VQ09ERV9SRUdVTEFSKTsKIAlpZiAocmV0KSB7CkBAIC0xMjE0LDkgKzEyMjUsMTIgQEAKIAl9CiAKIAkvKiBUT0RPOiByZWFkIHRoZSBidWRnZXQgZnJvbSBCSU9TIC8gUGxhdGZvcm0gTlZNICovCi0JaWYgKGl3bF9tdm1faXNfY3RkcF9zdXBwb3J0ZWQobXZtKSAmJiBtdm0tPmNvb2xpbmdfZGV2LmN1cl9zdGF0ZSA+IDApCisJaWYgKGl3bF9tdm1faXNfY3RkcF9zdXBwb3J0ZWQobXZtKSAmJiBtdm0tPmNvb2xpbmdfZGV2LmN1cl9zdGF0ZSA+IDApIHsKIAkJcmV0ID0gaXdsX212bV9jdGRwX2NvbW1hbmQobXZtLCBDVERQX0NNRF9PUEVSQVRJT05fU1RBUlQsCiAJCQkJCSAgIG12bS0+Y29vbGluZ19kZXYuY3VyX3N0YXRlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJfQogI2Vsc2UKIAkvKiBJbml0aWFsaXplIHR4IGJhY2tvZmZzIHRvIHRoZSBtaW5pbWFsIHBvc3NpYmxlICovCiAJaXdsX212bV90dF90eF9iYWNrb2ZmKG12bSwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tYWMtY3R4dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbWFjLWN0eHQuYwppbmRleCA2OWM0MmNlLi42Yjk2MmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tYWMtY3R4dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL21hYy1jdHh0LmMKQEAgLTUzOSw2ICs1MzksMTEgQEAKIAkJCWl3bF9tdm1fZGlzYWJsZV90eHEobXZtLCBJV0xfTVZNX09GRkNIQU5ORUxfUVVFVUUsCiAJCQkJCSAgICBJV0xfTVZNX09GRkNIQU5ORUxfUVVFVUUsCiAJCQkJCSAgICBJV0xfTUFYX1RJRF9DT1VOVCwgMCk7CisJCWVsc2UKKwkJCWl3bF9tdm1fZGlzYWJsZV90eHEobXZtLAorCQkJCQkgICAgSVdMX01WTV9EUUFfUDJQX0RFVklDRV9RVUVVRSwKKwkJCQkJICAgIHZpZi0+aHdfcXVldWVbMF0sIElXTF9NQVhfVElEX0NPVU5ULAorCQkJCQkgICAgMCk7CiAKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKQEAgLTc2OSwyNiArNzc0LDYgQEAKIAkJY21kLT5hY1t0eGZdLmZpZm9zX21hc2sgPSBCSVQodHhmKTsKIAl9CiAKLQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7Ci0JCS8qIGluIEFQIG1vZGUsIHRoZSBNQ0FTVCBGSUZPIHRha2VzIHRoZSBFRENBIHBhcmFtcyBmcm9tIFZPICovCi0JCWNtZC0+YWNbSVdMX01WTV9UWF9GSUZPX1ZPXS5maWZvc19tYXNrIHw9Ci0JCQlCSVQoSVdMX01WTV9UWF9GSUZPX01DQVNUKTsKLQotCQkvKgotCQkgKiBpbiBBUCBtb2RlLCBwYXNzIHByb2JlIHJlcXVlc3RzIGFuZCBiZWFjb25zIGZyb20gb3RoZXIgQVBzCi0JCSAqIChuZWVkZWQgZm9yIGh0IHByb3RlY3Rpb24pOyB3aGVuIHRoZXJlJ3JlIG5vIGFueSBhc3NvY2lhdGVkCi0JCSAqIHN0YXRpb24gZG9uJ3QgYXNrIEZXIHRvIHBhc3MgYmVhY29ucyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5Ci0JCSAqIHdha2UtdXBzLgotCQkgKi8KLQkJY21kLT5maWx0ZXJfZmxhZ3MgfD0gY3B1X3RvX2xlMzIoTUFDX0ZJTFRFUl9JTl9QUk9CRV9SRVFVRVNUKTsKLQkJaWYgKG12bXZpZi0+YXBfYXNzb2Nfc3RhX2NvdW50IHx8ICFtdm0tPmRyb3BfYmNuX2FwX21vZGUpIHsKLQkJCWNtZC0+ZmlsdGVyX2ZsYWdzIHw9IGNwdV90b19sZTMyKE1BQ19GSUxURVJfSU5fQkVBQ09OKTsKLQkJCUlXTF9ERUJVR19IQyhtdm0sICJBc2tpbmcgRlcgdG8gcGFzcyBiZWFjb25zXG4iKTsKLQkJfSBlbHNlIHsKLQkJCUlXTF9ERUJVR19IQyhtdm0sICJObyBuZWVkIHRvIHJlY2VpdmUgYmVhY29uc1xuIik7Ci0JCX0KLQl9Ci0KIAlpZiAodmlmLT5ic3NfY29uZi5xb3MpCiAJCWNtZC0+cW9zX2ZsYWdzIHw9IGNwdV90b19sZTMyKE1BQ19RT1NfRkxHX1VQREFURV9FRENBKTsKIApAQCAtMTE4Niw2ICsxMTcxLDcgQEAKICAqLwogc3RhdGljIHZvaWQgaXdsX212bV9tYWNfY3R4dF9jbWRfZmlsbF9hcChzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkJCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkJIHN0cnVjdCBpd2xfbWFjX2N0eF9jbWQgKmNtZCwKIAkJCQkJIHN0cnVjdCBpd2xfbWFjX2RhdGFfYXAgKmN0eHRfYXAsCiAJCQkJCSBib29sIGFkZCkKIHsKQEAgLTExOTYsNiArMTE4MiwyMyBAQAogCQkuYmVhY29uX2RldmljZV90cyA9IDAKIAl9OwogCisJLyogaW4gQVAgbW9kZSwgdGhlIE1DQVNUIEZJRk8gdGFrZXMgdGhlIEVEQ0EgcGFyYW1zIGZyb20gVk8gKi8KKwljbWQtPmFjW0lXTF9NVk1fVFhfRklGT19WT10uZmlmb3NfbWFzayB8PSBCSVQoSVdMX01WTV9UWF9GSUZPX01DQVNUKTsKKworCS8qCisJICogaW4gQVAgbW9kZSwgcGFzcyBwcm9iZSByZXF1ZXN0cyBhbmQgYmVhY29ucyBmcm9tIG90aGVyIEFQcworCSAqIChuZWVkZWQgZm9yIGh0IHByb3RlY3Rpb24pOyB3aGVuIHRoZXJlJ3JlIG5vIGFueSBhc3NvY2lhdGVkCisJICogc3RhdGlvbiBkb24ndCBhc2sgRlcgdG8gcGFzcyBiZWFjb25zIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkKKwkgKiB3YWtlLXVwcy4KKwkgKi8KKwljbWQtPmZpbHRlcl9mbGFncyB8PSBjcHVfdG9fbGUzMihNQUNfRklMVEVSX0lOX1BST0JFX1JFUVVFU1QpOworCWlmIChtdm12aWYtPmFwX2Fzc29jX3N0YV9jb3VudCB8fCAhbXZtLT5kcm9wX2Jjbl9hcF9tb2RlKSB7CisJCWNtZC0+ZmlsdGVyX2ZsYWdzIHw9IGNwdV90b19sZTMyKE1BQ19GSUxURVJfSU5fQkVBQ09OKTsKKwkJSVdMX0RFQlVHX0hDKG12bSwgIkFza2luZyBGVyB0byBwYXNzIGJlYWNvbnNcbiIpOworCX0gZWxzZSB7CisJCUlXTF9ERUJVR19IQyhtdm0sICJObyBuZWVkIHRvIHJlY2VpdmUgYmVhY29uc1xuIik7CisJfQorCiAJY3R4dF9hcC0+YmkgPSBjcHVfdG9fbGUzMih2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQpOwogCWN0eHRfYXAtPmJpX3JlY2lwcm9jYWwgPQogCQljcHVfdG9fbGUzMihpd2xfbXZtX3JlY2lwcm9jYWwodmlmLT5ic3NfY29uZi5iZWFjb25faW50KSk7CkBAIC0xMjUzLDcgKzEyNTYsNyBAQAogCWl3bF9tdm1fbWFjX2N0eHRfY21kX2NvbW1vbihtdm0sIHZpZiwgJmNtZCwgTlVMTCwgYWN0aW9uKTsKIAogCS8qIEZpbGwgdGhlIGRhdGEgc3BlY2lmaWMgZm9yIGFwIG1vZGUgKi8KLQlpd2xfbXZtX21hY19jdHh0X2NtZF9maWxsX2FwKG12bSwgdmlmLCAmY21kLmFwLAorCWl3bF9tdm1fbWFjX2N0eHRfY21kX2ZpbGxfYXAobXZtLCB2aWYsICZjbWQsICZjbWQuYXAsCiAJCQkJICAgICBhY3Rpb24gPT0gRldfQ1RYVF9BQ1RJT05fQUREKTsKIAogCXJldHVybiBpd2xfbXZtX21hY19jdHh0X3NlbmRfY21kKG12bSwgJmNtZCk7CkBAIC0xMjcyLDcgKzEyNzUsNyBAQAogCWl3bF9tdm1fbWFjX2N0eHRfY21kX2NvbW1vbihtdm0sIHZpZiwgJmNtZCwgTlVMTCwgYWN0aW9uKTsKIAogCS8qIEZpbGwgdGhlIGRhdGEgc3BlY2lmaWMgZm9yIEdPIG1vZGUgKi8KLQlpd2xfbXZtX21hY19jdHh0X2NtZF9maWxsX2FwKG12bSwgdmlmLCAmY21kLmdvLmFwLAorCWl3bF9tdm1fbWFjX2N0eHRfY21kX2ZpbGxfYXAobXZtLCB2aWYsICZjbWQsICZjbWQuZ28uYXAsCiAJCQkJICAgICBhY3Rpb24gPT0gRldfQ1RYVF9BQ1RJT05fQUREKTsKIAogCWNtZC5nby5jdHdpbiA9IGNwdV90b19sZTMyKG5vYS0+b3BwcHNfY3R3aW5kb3cgJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbWFjODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL21hYzgwMjExLmMKaW5kZXggNmQ2MDY0NS4uMzE4ZWZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbWFjODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tYWM4MDIxMS5jCkBAIC00NjUsNyArNDY1LDcgQEAKIAlody0+dWFwc2RfcXVldWVzID0gSVdMX01WTV9VQVBTRF9RVUVVRVM7CiAJaHctPnVhcHNkX21heF9zcF9sZW4gPSBJV0xfVUFQU0RfTUFYX1NQOwogCi0JQlVJTERfQlVHX09OKEFSUkFZX1NJWkUobXZtLT5jaXBoZXJzKSA8IEFSUkFZX1NJWkUobXZtX2NpcGhlcnMpICsgNCk7CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUobXZtLT5jaXBoZXJzKSA8IEFSUkFZX1NJWkUobXZtX2NpcGhlcnMpICsgNik7CiAJbWVtY3B5KG12bS0+Y2lwaGVycywgbXZtX2NpcGhlcnMsIHNpemVvZihtdm1fY2lwaGVycykpOwogCWh3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzID0gQVJSQVlfU0laRShtdm1fY2lwaGVycyk7CiAJaHctPndpcGh5LT5jaXBoZXJfc3VpdGVzID0gbXZtLT5jaXBoZXJzOwpAQCAtNDc5LDE3ICs0NzksMjMgQEAKIAkJaHctPndpcGh5LT5uX2NpcGhlcl9zdWl0ZXMrKzsKIAl9CiAKLQkvKgotCSAqIEVuYWJsZSAxMXcgaWYgYWR2ZXJ0aXNlZCBieSBmaXJtd2FyZSBhbmQgc29mdHdhcmUgY3J5cHRvCi0JICogaXMgbm90IGVuYWJsZWQgKGFzIHRoZSBmaXJtd2FyZSB3aWxsIGludGVycHJldCBzb21lIG1nbXQKLQkgKiBwYWNrZXRzLCBzbyBlbmFibGluZyBpdCB3aXRoIHNvZnR3YXJlIGNyeXB0byBpc24ndCBzYWZlKQorCS8qIEVuYWJsZSAxMXcgaWYgc29mdHdhcmUgY3J5cHRvIGlzIG5vdCBlbmFibGVkIChhcyB0aGUKKwkgKiBmaXJtd2FyZSB3aWxsIGludGVycHJldCBzb21lIG1nbXQgcGFja2V0cywgc28gZW5hYmxpbmcgaXQKKwkgKiB3aXRoIHNvZnR3YXJlIGNyeXB0byBpc24ndCBzYWZlKS4KIAkgKi8KLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfTUZQICYmCi0JICAgICFpd2x3aWZpX21vZF9wYXJhbXMuc3dfY3J5cHRvKSB7CisJaWYgKCFpd2x3aWZpX21vZF9wYXJhbXMuc3dfY3J5cHRvKSB7CiAJCWllZWU4MDIxMV9od19zZXQoaHcsIE1GUF9DQVBBQkxFKTsKIAkJbXZtLT5jaXBoZXJzW2h3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzXSA9CiAJCQlXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzsKIAkJaHctPndpcGh5LT5uX2NpcGhlcl9zdWl0ZXMrKzsKKwkJaWYgKGl3bF9tdm1faGFzX25ld19yeF9hcGkobXZtKSkgeworCQkJbXZtLT5jaXBoZXJzW2h3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzXSA9CisJCQkJV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMTI4OworCQkJaHctPndpcGh5LT5uX2NpcGhlcl9zdWl0ZXMrKzsKKwkJCW12bS0+Y2lwaGVyc1tody0+d2lwaHktPm5fY2lwaGVyX3N1aXRlc10gPQorCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzI1NjsKKwkJCWh3LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzKys7CisJCX0KIAl9CiAKIAkvKiBjdXJyZW50bHkgRlcgQVBJIHN1cHBvcnRzIG9ubHkgb25lIG9wdGlvbmFsIGNpcGhlciBzY2hlbWUgKi8KQEAgLTUzOSw5ICs1NDUsNyBAQAogCQlody0+d2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0gUkVHVUxBVE9SWV9DVVNUT01fUkVHIHwKIAkJCQkJICAgICAgIFJFR1VMQVRPUllfRElTQUJMRV9CRUFDT05fSElOVFM7CiAKLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfR09fVUFQU0QpCi0JCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19BUF9VQVBTRDsKLQorCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19BUF9VQVBTRDsKIAlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfSEFTX0NIQU5ORUxfU1dJVENIOwogCiAJaHctPndpcGh5LT5pZmFjZV9jb21iaW5hdGlvbnMgPSBpd2xfbXZtX2lmYWNlX2NvbWJpbmF0aW9uczsKQEAgLTYyNCw2ICs2MjgsNyBAQAogCWh3LT53aXBoeS0+ZmVhdHVyZXMgfD0gTkw4MDIxMV9GRUFUVVJFX1AyUF9HT19DVFdJTiB8CiAJCQkgICAgICAgTkw4MDIxMV9GRUFUVVJFX0xPV19QUklPUklUWV9TQ0FOIHwKIAkJCSAgICAgICBOTDgwMjExX0ZFQVRVUkVfUDJQX0dPX09QUFBTIHwKKwkJCSAgICAgICBOTDgwMjExX0ZFQVRVUkVfQVBfTU9ERV9DSEFOX1dJRFRIX0NIQU5HRSB8CiAJCQkgICAgICAgTkw4MDIxMV9GRUFUVVJFX0RZTkFNSUNfU01QUyB8CiAJCQkgICAgICAgTkw4MDIxMV9GRUFUVVJFX1NUQVRJQ19TTVBTIHwKIAkJCSAgICAgICBOTDgwMjExX0ZFQVRVUkVfU1VQUE9SVFNfV01NX0FETUlTU0lPTjsKQEAgLTY0NCw2ICs2NDksMTYgQEAKIAkJCUlXTF9VQ09ERV9UTFZfQ0FQQV9XRkFfVFBDX1JFUF9JRV9TVVBQT1JUKSkKIAkJaHctPndpcGh5LT5mZWF0dXJlcyB8PSBOTDgwMjExX0ZFQVRVUkVfV0ZBX1RQQ19JRV9JTl9QUk9CRVM7CiAKKwlpZiAoZndfaGFzX2FwaSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKKwkJICAgICAgIElXTF9VQ09ERV9UTFZfQVBJX1NDQU5fVFNGX1JFUE9SVCkpIHsKKwkJd2lwaHlfZXh0X2ZlYXR1cmVfc2V0KGh3LT53aXBoeSwKKwkJCQkgICAgICBOTDgwMjExX0VYVF9GRUFUVVJFX1NDQU5fU1RBUlRfVElNRSk7CisJCXdpcGh5X2V4dF9mZWF0dXJlX3NldChody0+d2lwaHksCisJCQkJICAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9CU1NfUEFSRU5UX1RTRik7CisJCXdpcGh5X2V4dF9mZWF0dXJlX3NldChody0+d2lwaHksCisJCQkJICAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9TRVRfU0NBTl9EV0VMTCk7CisJfQorCiAJbXZtLT5ydHNfdGhyZXNob2xkID0gSUVFRTgwMjExX01BWF9SVFNfVEhSRVNIT0xEOwogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCkBAIC03MTEsNiArNzI2LDEwIEBACiAJaWYgKHJldCkKIAkJaXdsX212bV9sZWRzX2V4aXQobXZtKTsKIAorCWlmIChtdm0tPmNmZy0+dmh0X211X21pbW9fc3VwcG9ydGVkKQorCQl3aXBoeV9leHRfZmVhdHVyZV9zZXQoaHctPndpcGh5LAorCQkJCSAgICAgIE5MODAyMTFfRVhUX0ZFQVRVUkVfTVVfTUlNT19BSVJfU05JRkZFUik7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMjUwLDIwICsxMjY5LDE4IEBACiAJCQkJczE2IHR4X3Bvd2VyKQogewogCXN0cnVjdCBpd2xfZGV2X3R4X3Bvd2VyX2NtZCBjbWQgPSB7Ci0JCS52My52Mi5zZXRfbW9kZSA9IGNwdV90b19sZTMyKElXTF9UWF9QT1dFUl9NT0RFX1NFVF9NQUMpLAotCQkudjMudjIubWFjX2NvbnRleHRfaWQgPQorCQkudjMuc2V0X21vZGUgPSBjcHVfdG9fbGUzMihJV0xfVFhfUE9XRVJfTU9ERV9TRVRfTUFDKSwKKwkJLnYzLm1hY19jb250ZXh0X2lkID0KIAkJCWNwdV90b19sZTMyKGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKS0+aWQpLAotCQkudjMudjIucHdyX3Jlc3RyaWN0aW9uID0gY3B1X3RvX2xlMTYoOCAqIHR4X3Bvd2VyKSwKKwkJLnYzLnB3cl9yZXN0cmljdGlvbiA9IGNwdV90b19sZTE2KDggKiB0eF9wb3dlciksCiAJfTsKIAlpbnQgbGVuID0gc2l6ZW9mKGNtZCk7CiAKIAlpZiAodHhfcG93ZXIgPT0gSVdMX0RFRkFVTFRfTUFYX1RYX1BPV0VSKQotCQljbWQudjMudjIucHdyX3Jlc3RyaWN0aW9uID0gY3B1X3RvX2xlMTYoSVdMX0RFVl9NQVhfVFhfUE9XRVIpOworCQljbWQudjMucHdyX3Jlc3RyaWN0aW9uID0gY3B1X3RvX2xlMTYoSVdMX0RFVl9NQVhfVFhfUE9XRVIpOwogCiAJaWYgKCFmd19oYXNfY2FwYSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwgSVdMX1VDT0RFX1RMVl9DQVBBX1RYX1BPV0VSX0FDSykpCiAJCWxlbiA9IHNpemVvZihjbWQudjMpOwotCWlmICghZndfaGFzX2FwaSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwgSVdMX1VDT0RFX1RMVl9BUElfVFhfUE9XRVJfQ0hBSU4pKQotCQlsZW4gPSBzaXplb2YoY21kLnYzLnYyKTsKIAogCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFJFRFVDRV9UWF9QT1dFUl9DTUQsIDAsIGxlbiwgJmNtZCk7CiB9CkBAIC0yMjIwLDYgKzIyMzcsMTAgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQlpd2xfbXZtX2Jzc19pbmZvX2NoYW5nZWRfYXBfaWJzcyhtdm0sIHZpZiwgYnNzX2NvbmYsIGNoYW5nZXMpOwogCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CisJCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfTVVfR1JPVVBTKQorCQkJaXdsX212bV91cGRhdGVfbXVfZ3JvdXBzKG12bSwgdmlmKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogc2hvdWxkbid0IGhhcHBlbiAqLwogCQlXQVJOX09OX09OQ0UoMSk7CkBAIC0yNzQ2LDYgKzI3NjcsOCBAQAogCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19QVVRfSVZfU1BBQ0U7CiAJCWJyZWFrOwogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUM6CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18xMjg6CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18yNTY6CiAJCVdBUk5fT05fT05DRSghaWVlZTgwMjExX2h3X2NoZWNrKGh3LCBNRlBfQ0FQQUJMRSkpOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgpAQCAtMjc3OSw5ICsyODAyLDExIEBACiAJCQkgKiBHVEsgb24gQVAgaW50ZXJmYWNlIGlzIGEgVFgtb25seSBrZXksIHJldHVybiAwOwogCQkJICogb24gSUJTUyB0aGV5J3JlIHBlci1zdGF0aW9uIGFuZCBiZWNhdXNlIHdlJ3JlIGxhenkKIAkJCSAqIHdlIGRvbid0IHN1cHBvcnQgdGhlbSBmb3IgUlgsIHNvIGRvIHRoZSBzYW1lLgotCQkJICogQ01BQyBpbiBBUC9JQlNTIG1vZGVzIG11c3QgYmUgZG9uZSBpbiBzb2Z0d2FyZS4KKwkJCSAqIENNQUMvR01BQyBpbiBBUC9JQlNTIG1vZGVzIG11c3QgYmUgZG9uZSBpbiBzb2Z0d2FyZS4KIAkJCSAqLwotCQkJaWYgKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDKQorCQkJaWYgKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDIHx8CisJCQkgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMTI4IHx8CisJCQkgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMjU2KQogCQkJCXJldCA9IC1FT1BOT1RTVVBQOwogCQkJZWxzZQogCQkJCXJldCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9tdm0uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL212bS5oCmluZGV4IGI0ZmM4NmQuLmQxN2NiZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL212bS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL212bS5oCkBAIC00NjcsNiArNDY3LDggQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGl3bF9tdm1fdmlmICoKIGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKKwlpZiAoIXZpZikKKwkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuICh2b2lkICopdmlmLT5kcnZfcHJpdjsKIH0KIApAQCAtNjAyLDE2ICs2MDQsOSBAQAogfTsKIAogc3RydWN0IGl3bF9tdm1fc2hhcmVkX21lbV9jZmcgewotCXUzMiBzaGFyZWRfbWVtX2FkZHI7Ci0JdTMyIHNoYXJlZF9tZW1fc2l6ZTsKLQl1MzIgc2FtcGxlX2J1ZmZfYWRkcjsKLQl1MzIgc2FtcGxlX2J1ZmZfc2l6ZTsKLQl1MzIgdHhmaWZvX2FkZHI7CisJaW50IG51bV90eGZpZm9fZW50cmllczsKIAl1MzIgdHhmaWZvX3NpemVbVFhfRklGT19NQVhfTlVNXTsKIAl1MzIgcnhmaWZvX3NpemVbUlhfRklGT19NQVhfTlVNXTsKLQl1MzIgcGFnZV9idWZmX2FkZHI7Ci0JdTMyIHBhZ2VfYnVmZl9zaXplOwotCXUzMiByeGZpZm9fYWRkcjsKIAl1MzIgaW50ZXJuYWxfdHhmaWZvX2FkZHI7CiAJdTMyIGludGVybmFsX3R4Zmlmb19zaXplW1RYX0ZJRk9fSU5URVJOQUxfTUFYX05VTV07CiB9OwpAQCAtNjk3LDYgKzY5MiwxMCBAQAogICoJaXQuIEluIHRoaXMgc3RhdGUsIHdoZW4gYSBuZXcgcXVldWUgaXMgbmVlZGVkIHRvIGJlIGFsbG9jYXRlZCBidXQgbm8KICAqCXN1Y2ggZnJlZSBxdWV1ZSBleGlzdHMsIGFuIGluYWN0aXZlIHF1ZXVlIG1pZ2h0IGJlIGZyZWVkIGFuZCBnaXZlbiB0bwogICoJdGhlIG5ldyBSQS9USUQuCisgKiBASVdMX01WTV9RVUVVRV9SRUNPTkZJR1VSSU5HOiBxdWV1ZSBpcyBiZWluZyByZWNvbmZpZ3VyZWQKKyAqCVRoaXMgaXMgdGhlIHN0YXRlIG9mIGEgcXVldWUgdGhhdCBoYXMgaGFkIHRyYWZmaWMgcGFzcyB0aHJvdWdoIGl0LCBidXQKKyAqCW5lZWRzIHRvIGJlIHJlY29uZmlndXJlZCBmb3Igc29tZSByZWFzb24sIGUuZy4gdGhlIHF1ZXVlIG5lZWRzIHRvCisgKgliZWNvbWUgdW5zaGFyZWQgYW5kIGFnZ3JlZ2F0aW9ucyByZS1lbmFibGVkIG9uLgogICovCiBlbnVtIGl3bF9tdm1fcXVldWVfc3RhdHVzIHsKIAlJV0xfTVZNX1FVRVVFX0ZSRUUsCkBAIC03MDQsMTAgKzcwMywxMSBAQAogCUlXTF9NVk1fUVVFVUVfUkVBRFksCiAJSVdMX01WTV9RVUVVRV9TSEFSRUQsCiAJSVdMX01WTV9RVUVVRV9JTkFDVElWRSwKKwlJV0xfTVZNX1FVRVVFX1JFQ09ORklHVVJJTkcsCiB9OwogCiAjZGVmaW5lIElXTF9NVk1fRFFBX1FVRVVFX1RJTUVPVVQJKDUgKiBIWikKLSNkZWZpbmUgSVdMX01WTV9OVU1fQ0lQSEVSUyAgICAgICAgICAgICA4CisjZGVmaW5lIElXTF9NVk1fTlVNX0NJUEhFUlMgICAgICAgICAgICAgMTAKIAogc3RydWN0IGl3bF9tdm0gewogCS8qIGZvciBsb2dnZXIgYWNjZXNzICovCkBAIC03NjcsNiArNzY3LDcgQEAKIAkJdTggcmFfc3RhX2lkOyAvKiBUaGUgUkEgdGhpcyBxdWV1ZSBpcyBtYXBwZWQgdG8sIGlmIGV4aXN0cyAqLwogCQlib29sIHJlc2VydmVkOyAvKiBJcyB0aGlzIHRoZSBUWFEgcmVzZXJ2ZWQgZm9yIGEgU1RBICovCiAJCXU4IG1hYzgwMjExX2FjOyAvKiBUaGUgbWFjODAyMTEgQUMgdGhpcyBxdWV1ZSBpcyBtYXBwZWQgdG8gKi8KKwkJdTggdHhxX3RpZDsgLyogVGhlIFRJRCAib3duZXIiIG9mIHRoaXMgcXVldWUqLwogCQl1MTYgdGlkX2JpdG1hcDsgLyogQml0bWFwIG9mIHRoZSBUSURzIG1hcHBlZCB0byB0aGlzIHF1ZXVlICovCiAJCS8qIFRpbWVzdGFtcCBmb3IgaW5hY3RpdmF0aW9uIHBlciBUSUQgb2YgdGhpcyBxdWV1ZSAqLwogCQl1bnNpZ25lZCBsb25nIGxhc3RfZnJhbWVfdGltZVtJV0xfTUFYX1RJRF9DT1VOVCArIDFdOwpAQCAtODIwLDYgKzgyMSwxMiBAQAogCS8qIFVNQUMgc2NhbiB0cmFja2luZyAqLwogCXUzMiBzY2FuX3VpZF9zdGF0dXNbSVdMX01WTV9NQVhfVU1BQ19TQ0FOU107CiAKKwkvKiBzdGFydCB0aW1lIG9mIGxhc3Qgc2NhbiBpbiBUU0Ygb2YgdGhlIG1hYyB0aGF0IHJlcXVlc3RlZCB0aGUgc2NhbiAqLworCXU2NCBzY2FuX3N0YXJ0OworCisJLyogdGhlIHZpZiB0aGF0IHJlcXVlc3RlZCB0aGUgY3VycmVudCBzY2FuICovCisJc3RydWN0IGl3bF9tdm1fdmlmICpzY2FuX3ZpZjsKKwogCS8qIHJ4IGNoYWluIGFudGVubmFzIHNldCB0aHJvdWdoIGRlYnVnZnMgZm9yIHRoZSBzY2FuIGNvbW1hbmQgKi8KIAl1OCBzY2FuX3J4X2FudDsKIApAQCAtMTEyMiw2ICsxMTI5LDE4IEBACiAJCShtdm0tPnRyYW5zLT5ydW50aW1lX3BtX21vZGUgIT0gSVdMX1BMQVRfUE1fTU9ERV9EMEkzKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGl3bF9tdm1faXNfZHFhX2RhdGFfcXVldWUoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggcXVldWUpCit7CisJcmV0dXJuIChxdWV1ZSA+PSBJV0xfTVZNX0RRQV9NSU5fREFUQV9RVUVVRSkgJiYKKwkgICAgICAgKHF1ZXVlIDw9IElXTF9NVk1fRFFBX01BWF9EQVRBX1FVRVVFKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGl3bF9tdm1faXNfZHFhX21nbXRfcXVldWUoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggcXVldWUpCit7CisJcmV0dXJuIChxdWV1ZSA+PSBJV0xfTVZNX0RRQV9NSU5fTUdNVF9RVUVVRSkgJiYKKwkgICAgICAgKHF1ZXVlIDw9IElXTF9NVk1fRFFBX01BWF9NR01UX1FVRVVFKTsKK30KKwogc3RhdGljIGlubGluZSBib29sIGl3bF9tdm1faXNfbGFyX3N1cHBvcnRlZChzdHJ1Y3QgaXdsX212bSAqbXZtKQogewogCWJvb2wgbnZtX2xhciA9IG12bS0+bnZtX2RhdGEtPmxhcl9lbmFibGVkOwpAQCAtMTE5Miw2ICsxMjExLDEyIEBACiAJCQkgICBJV0xfVUNPREVfVExWX0NBUEFfTVVMVElfUVVFVUVfUlhfU1VQUE9SVCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpd2xfbXZtX2hhc19uZXdfdHhfYXBpKHN0cnVjdCBpd2xfbXZtICptdm0pCit7CisJLyogVE9ETyAtIHJlcGxhY2Ugd2l0aCBUTFYgb25jZSBkZWZpbmVkICovCisJcmV0dXJuIG12bS0+dHJhbnMtPmNmZy0+dXNlX3RmaDsKK30KKwogc3RhdGljIGlubGluZSBib29sIGl3bF9tdm1faXNfdHRfaW5fZncoc3RydWN0IGl3bF9tdm0gKm12bSkKIHsKICNpZmRlZiBDT05GSUdfVEhFUk1BTApAQCAtMTI0Myw2ICsxMjY4LDcgQEAKIHZvaWQgaXdsX212bV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9tdm0gKm12bSk7CiB1OCBmaXJzdF9hbnRlbm5hKHU4IG1hc2spOwogdTggaXdsX212bV9uZXh0X2FudGVubmEoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggdmFsaWQsIHU4IGxhc3RfaWR4KTsKK3ZvaWQgaXdsX212bV9nZXRfc3luY190aW1lKHN0cnVjdCBpd2xfbXZtICptdm0sIHUzMiAqZ3AyLCB1NjQgKmJvb3R0aW1lKTsKIAogLyogVHggLyBIb3N0IENvbW1hbmRzICovCiBpbnQgX19tdXN0X2NoZWNrIGl3bF9tdm1fc2VuZF9jbWQoc3RydWN0IGl3bF9tdm0gKm12bSwKQEAgLTEyNzksOCArMTMwNSw2IEBACiAKIAl0eF9jbWQtPnNlY19jdGwgPSBUWF9DTURfU0VDX0NDTTsKIAltZW1jcHkodHhfY21kLT5rZXksIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKLQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKQotCQl0eF9jbWQtPnR4X2ZsYWdzIHw9IGNwdV90b19sZTMyKFRYX0NNRF9GTEdfQ0NNUF9BR0cpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXdsX212bV93YWl0X2Zvcl9hc3luY19oYW5kbGVycyhzdHJ1Y3QgaXdsX212bSAqbXZtKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vbnZtLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9udm0uYwppbmRleCA3YTY4NmY2Li5lYWRlMDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9udm0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9udm0uYwpAQCAtNjYsNyArNjYsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgIml3bC10cmFucy5oIgogI2luY2x1ZGUgIml3bC1jc3IuaCIKICNpbmNsdWRlICJtdm0uaCIKQEAgLTc1MSw5NiArNzUwLDYgQEAKIAlyZXR1cm4gcmVzcF9jcDsKIH0KIAotI2lmZGVmIENPTkZJR19BQ1BJCi0jZGVmaW5lIFdSRF9NRVRIT0QJCSJXUkREIgotI2RlZmluZSBXUkREX1dJRkkJCSgweDA3KQotI2RlZmluZSBXUkREX1dJR0lHCQkoMHgxMCkKLQotc3RhdGljIHUzMiBpd2xfbXZtX3dyZGRfZ2V0X21jYyhzdHJ1Y3QgaXdsX212bSAqbXZtLCB1bmlvbiBhY3BpX29iamVjdCAqd3JkZCkKLXsKLQl1bmlvbiBhY3BpX29iamVjdCAqbWNjX3BrZywgKmRvbWFpbl90eXBlLCAqbWNjX3ZhbHVlOwotCXUzMiBpOwotCi0JaWYgKHdyZGQtPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UgfHwKLQkgICAgd3JkZC0+cGFja2FnZS5jb3VudCA8IDIgfHwKLQkgICAgd3JkZC0+cGFja2FnZS5lbGVtZW50c1swXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSIHx8Ci0JICAgIHdyZGQtPnBhY2thZ2UuZWxlbWVudHNbMF0uaW50ZWdlci52YWx1ZSAhPSAwKSB7Ci0JCUlXTF9ERUJVR19MQVIobXZtLCAiVW5zdXBwb3J0ZWQgd3JkZCBzdHJ1Y3R1cmVcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlmb3IgKGkgPSAxIDsgaSA8IHdyZGQtPnBhY2thZ2UuY291bnQgOyArK2kpIHsKLQkJbWNjX3BrZyA9ICZ3cmRkLT5wYWNrYWdlLmVsZW1lbnRzW2ldOwotCi0JCWlmIChtY2NfcGtnLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFIHx8Ci0JCSAgICBtY2NfcGtnLT5wYWNrYWdlLmNvdW50IDwgMiB8fAotCQkgICAgbWNjX3BrZy0+cGFja2FnZS5lbGVtZW50c1swXS50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSIHx8Ci0JCSAgICBtY2NfcGtnLT5wYWNrYWdlLmVsZW1lbnRzWzFdLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKLQkJCW1jY19wa2cgPSBOVUxMOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlkb21haW5fdHlwZSA9ICZtY2NfcGtnLT5wYWNrYWdlLmVsZW1lbnRzWzBdOwotCQlpZiAoZG9tYWluX3R5cGUtPmludGVnZXIudmFsdWUgPT0gV1JERF9XSUZJKQotCQkJYnJlYWs7Ci0KLQkJbWNjX3BrZyA9IE5VTEw7Ci0JfQotCi0JaWYgKG1jY19wa2cpIHsKLQkJbWNjX3ZhbHVlID0gJm1jY19wa2ctPnBhY2thZ2UuZWxlbWVudHNbMV07Ci0JCXJldHVybiBtY2NfdmFsdWUtPmludGVnZXIudmFsdWU7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX212bV9nZXRfYmlvc19tY2Moc3RydWN0IGl3bF9tdm0gKm12bSwgY2hhciAqbWNjKQotewotCWFjcGlfaGFuZGxlIHJvb3RfaGFuZGxlOwotCWFjcGlfaGFuZGxlIGhhbmRsZTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgd3JkZCA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCXUzMiBtY2NfdmFsOwotCi0Jcm9vdF9oYW5kbGUgPSBBQ1BJX0hBTkRMRShtdm0tPmRldik7Ci0JaWYgKCFyb290X2hhbmRsZSkgewotCQlJV0xfREVCVUdfTEFSKG12bSwKLQkJCSAgICAgICJDb3VsZCBub3QgcmV0cmlldmUgcm9vdCBwb3J0IEFDUEkgaGFuZGxlXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0JLyogR2V0IHRoZSBtZXRob2QncyBoYW5kbGUgKi8KLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocm9vdF9oYW5kbGUsIChhY3BpX3N0cmluZylXUkRfTUVUSE9ELCAmaGFuZGxlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJSVdMX0RFQlVHX0xBUihtdm0sICJXUkQgbWV0aG9kIG5vdCBmb3VuZFxuIik7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KLQotCS8qIENhbGwgV1JERCB3aXRoIG5vIGFyZ3VtZW50cyAqLwotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgTlVMTCwgTlVMTCwgJndyZGQpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlJV0xfREVCVUdfTEFSKG12bSwgIldSREMgaW52b2NhdGlvbiBmYWlsZWQgKDB4JXgpXG4iLCBzdGF0dXMpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9Ci0KLQltY2NfdmFsID0gaXdsX212bV93cmRkX2dldF9tY2MobXZtLCB3cmRkLnBvaW50ZXIpOwotCWtmcmVlKHdyZGQucG9pbnRlcik7Ci0JaWYgKCFtY2NfdmFsKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCW1jY1swXSA9IChtY2NfdmFsID4+IDgpICYgMHhmZjsKLQltY2NbMV0gPSBtY2NfdmFsICYgMHhmZjsKLQltY2NbMl0gPSAnXDAnOwotCXJldHVybiAwOwotfQotI2Vsc2UgLyogQ09ORklHX0FDUEkgKi8KLXN0YXRpYyBpbnQgaXdsX212bV9nZXRfYmlvc19tY2Moc3RydWN0IGl3bF9tdm0gKm12bSwgY2hhciAqbWNjKQotewotCXJldHVybiAtRU5PRU5UOwotfQotI2VuZGlmCi0KIGludCBpd2xfbXZtX2luaXRfbWNjKHN0cnVjdCBpd2xfbXZtICptdm0pCiB7CiAJYm9vbCB0bHZfbGFyOwpAQCAtODg0LDcgKzc5Myw3IEBACiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGl3bF9tdm1faXNfd2lmaV9tY2Nfc3VwcG9ydGVkKG12bSkgJiYKLQkgICAgIWl3bF9tdm1fZ2V0X2Jpb3NfbWNjKG12bSwgbWNjKSkgeworCSAgICAhaXdsX2dldF9iaW9zX21jYyhtdm0tPmRldiwgbWNjKSkgewogCQlrZnJlZShyZWdkKTsKIAkJcmVnZCA9IGl3bF9tdm1fZ2V0X3JlZ2RvbWFpbihtdm0tPmh3LT53aXBoeSwgbWNjLAogCQkJCQkgICAgIE1DQ19TT1VSQ0VfQklPUywgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9vcHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL29wcy5jCmluZGV4IDU1ZDkwOTYuLjA1ZmU2ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL29wcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL29wcy5jCkBAIC0zNTksNiArMzU5LDcgQEAKIAlIQ01EX05BTUUoQlRfQ09FWF9DSSksCiAJSENNRF9OQU1FKFBIWV9DT05GSUdVUkFUSU9OX0NNRCksCiAJSENNRF9OQU1FKENBTElCX1JFU19OT1RJRl9QSFlfREIpLAorCUhDTURfTkFNRShQSFlfREJfQ01EKSwKIAlIQ01EX05BTUUoU0NBTl9PRkZMT0FEX0NPTVBMRVRFKSwKIAlIQ01EX05BTUUoU0NBTl9PRkZMT0FEX1VQREFURV9QUk9GSUxFU19DTUQpLAogCUhDTURfTkFNRShTQ0FOX09GRkxPQURfQ09ORklHX0NNRCksCkBAIC02NTIsMTEgKzY1Myw5IEBACiAJLyogdGhlIGhhcmR3YXJlIHNwbGl0cyB0aGUgQS1NU0RVICovCiAJaWYgKG12bS0+Y2ZnLT5tcV9yeF9zdXBwb3J0ZWQpCiAJCXRyYW5zX2NmZy5yeF9idWZfc2l6ZSA9IElXTF9BTVNEVV80SzsKLQl0cmFuc19jZmcud2lkZV9jbWRfaGVhZGVyID0gZndfaGFzX2FwaSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwKLQkJCQkJICAgICAgIElXTF9VQ09ERV9UTFZfQVBJX1dJREVfQ01EX0hEUik7CiAKLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfRFdfQkNfVEFCTEUpCi0JCXRyYW5zX2NmZy5iY190YWJsZV9kd29yZCA9IHRydWU7CisJdHJhbnMtPndpZGVfY21kX2hlYWRlciA9IHRydWU7CisJdHJhbnNfY2ZnLmJjX3RhYmxlX2R3b3JkID0gdHJ1ZTsKIAogCXRyYW5zX2NmZy5jb21tYW5kX2dyb3VwcyA9IGl3bF9tdm1fZ3JvdXBzOwogCXRyYW5zX2NmZy5jb21tYW5kX2dyb3Vwc19zaXplID0gQVJSQVlfU0laRShpd2xfbXZtX2dyb3Vwcyk7CkBAIC03MTEsMzcgKzcxMCwyMSBAQAogCQlJV0xfREVCVUdfRUVQUk9NKG12bS0+dHJhbnMtPmRldiwKIAkJCQkgIndvcmtpbmcgd2l0aG91dCBleHRlcm5hbCBudm0gZmlsZVxuIik7CiAKLQlpZiAoV0FSTihjZmctPm5vX3Bvd2VyX3VwX25pY19pbl9pbml0ICYmICFtdm0tPm52bV9maWxlX25hbWUsCi0JCSAibm90IGFsbG93aW5nIHBvd2VyLXVwIGFuZCBub3QgaGF2aW5nIG52bV9maWxlXG4iKSkKKwllcnIgPSBpd2xfdHJhbnNfc3RhcnRfaHcobXZtLT50cmFucyk7CisJaWYgKGVycikKIAkJZ290byBvdXRfZnJlZTsKIAotCS8qCi0JICogRXZlbiBpZiBudm0gZXhpc3RzIGluIHRoZSBudm1fZmlsZSBkcml2ZXIgc2hvdWxkIHJlYWQgYWdhaW4gdGhlIG52bQotCSAqIGZyb20gdGhlIG5pYyBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIGVudHJpZXMgdGhhdCBleGlzdCBpbiB0aGUgT1RQCi0JICogYW5kIG5vdCBpbiB0aGUgZmlsZS4KLQkgKiBmb3IgbmljcyB3aXRoIG5vX3Bvd2VyX3VwX25pY19pbl9pbml0OiByZWx5IGNvbXBsZXRsZXkgb24gbnZtX2ZpbGUKLQkgKi8KLQlpZiAoY2ZnLT5ub19wb3dlcl91cF9uaWNfaW5faW5pdCAmJiBtdm0tPm52bV9maWxlX25hbWUpIHsKLQkJZXJyID0gaXdsX252bV9pbml0KG12bSwgZmFsc2UpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXRfZnJlZTsKLQl9IGVsc2UgewotCQllcnIgPSBpd2xfdHJhbnNfc3RhcnRfaHcobXZtLT50cmFucyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dF9mcmVlOwotCi0JCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwotCQlpd2xfbXZtX3JlZihtdm0sIElXTF9NVk1fUkVGX0lOSVRfVUNPREUpOwotCQllcnIgPSBpd2xfcnVuX2luaXRfbXZtX3Vjb2RlKG12bSwgdHJ1ZSk7Ci0JCWlmICghZXJyIHx8ICFpd2xtdm1fbW9kX3BhcmFtcy5pbml0X2RiZykKLQkJCWl3bF9tdm1fc3RvcF9kZXZpY2UobXZtKTsKLQkJaXdsX212bV91bnJlZihtdm0sIElXTF9NVk1fUkVGX0lOSVRfVUNPREUpOwotCQltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOwotCQkvKiByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgMSBpZiBzdWNjZXNzIGJ1dCBpbiByZmtpbGwgKi8KLQkJaWYgKGVyciA8IDAgJiYgIWl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKSB7Ci0JCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byBydW4gSU5JVCB1Y29kZTogJWRcbiIsIGVycik7Ci0JCQlnb3RvIG91dF9mcmVlOwotCQl9CisJbXV0ZXhfbG9jaygmbXZtLT5tdXRleCk7CisJaXdsX212bV9yZWYobXZtLCBJV0xfTVZNX1JFRl9JTklUX1VDT0RFKTsKKwllcnIgPSBpd2xfcnVuX2luaXRfbXZtX3Vjb2RlKG12bSwgdHJ1ZSk7CisJaWYgKCFlcnIgfHwgIWl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKQorCQlpd2xfbXZtX3N0b3BfZGV2aWNlKG12bSk7CisJaXdsX212bV91bnJlZihtdm0sIElXTF9NVk1fUkVGX0lOSVRfVUNPREUpOworCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7CisJLyogcmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIDEgaWYgc3VjY2VzcyBidXQgaW4gcmZraWxsICovCisJaWYgKGVyciA8IDAgJiYgIWl3bG12bV9tb2RfcGFyYW1zLmluaXRfZGJnKSB7CisJCUlXTF9FUlIobXZtLCAiRmFpbGVkIHRvIHJ1biBJTklUIHVjb2RlOiAlZFxuIiwgZXJyKTsKKwkJZ290byBvdXRfZnJlZTsKIAl9CiAKIAlzY2FuX3NpemUgPSBpd2xfbXZtX3NjYW5fc2l6ZShtdm0pOwpAQCAtNzgzLDggKzc2Niw4IEBACiAJZmx1c2hfZGVsYXllZF93b3JrKCZtdm0tPmZ3X2R1bXBfd2spOwogCWl3bF9waHlfZGJfZnJlZShtdm0tPnBoeV9kYik7CiAJa2ZyZWUobXZtLT5zY2FuX2NtZCk7Ci0JaWYgKCFjZmctPm5vX3Bvd2VyX3VwX25pY19pbl9pbml0IHx8ICFtdm0tPm52bV9maWxlX25hbWUpCi0JCWl3bF90cmFuc19vcF9tb2RlX2xlYXZlKHRyYW5zKTsKKwlpd2xfdHJhbnNfb3BfbW9kZV9sZWF2ZSh0cmFucyk7CisKIAlpZWVlODAyMTFfZnJlZV9odyhtdm0tPmh3KTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTg1Nyw5ICs4NDAsNyBAQAogCXN0cnVjdCBpd2xfbXZtICptdm0gPQogCQljb250YWluZXJfb2Yod2ssIHN0cnVjdCBpd2xfbXZtLCBhc3luY19oYW5kbGVyc193ayk7CiAJc3RydWN0IGl3bF9hc3luY19oYW5kbGVyX2VudHJ5ICplbnRyeSwgKnRtcDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxvY2FsX2xpc3Q7Ci0KLQlJTklUX0xJU1RfSEVBRCgmbG9jYWxfbGlzdCk7CisJTElTVF9IRUFEKGxvY2FsX2xpc3QpOwogCiAJLyogRW5zdXJlIHRoYXQgd2UgYXJlIG5vdCBpbiBzdG9wIGZsb3cgKGNoZWNrIGl3bF9tdm1fbWFjX3N0b3ApICovCiAKQEAgLTk2NiwxMCArOTQ3LDExIEBACiB7CiAJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CiAJc3RydWN0IGl3bF9tdm0gKm12bSA9IElXTF9PUF9NT0RFX0dFVF9NVk0ob3BfbW9kZSk7CisJdTE2IGNtZCA9IFdJREVfSUQocGt0LT5oZHIuZ3JvdXBfaWQsIHBrdC0+aGRyLmNtZCk7CiAKLQlpZiAobGlrZWx5KHBrdC0+aGRyLmNtZCA9PSBSRVBMWV9SWF9NUERVX0NNRCkpCisJaWYgKGxpa2VseShjbWQgPT0gV0lERV9JRChMRUdBQ1lfR1JPVVAsIFJFUExZX1JYX01QRFVfQ01EKSkpCiAJCWl3bF9tdm1fcnhfcnhfbXBkdShtdm0sIG5hcGksIHJ4Yik7Ci0JZWxzZSBpZiAocGt0LT5oZHIuY21kID09IFJFUExZX1JYX1BIWV9DTUQpCisJZWxzZSBpZiAoY21kID09IFdJREVfSUQoTEVHQUNZX0dST1VQLCBSRVBMWV9SWF9QSFlfQ01EKSkKIAkJaXdsX212bV9yeF9yeF9waHlfY21kKG12bSwgcnhiKTsKIAllbHNlCiAJCWl3bF9tdm1fcnhfY29tbW9uKG12bSwgcnhiLCBwa3QpOwpAQCAtOTgxLDEzICs5NjMsMTQgQEAKIHsKIAlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKIAlzdHJ1Y3QgaXdsX212bSAqbXZtID0gSVdMX09QX01PREVfR0VUX01WTShvcF9tb2RlKTsKKwl1MTYgY21kID0gV0lERV9JRChwa3QtPmhkci5ncm91cF9pZCwgcGt0LT5oZHIuY21kKTsKIAotCWlmIChsaWtlbHkocGt0LT5oZHIuY21kID09IFJFUExZX1JYX01QRFVfQ01EKSkKKwlpZiAobGlrZWx5KGNtZCA9PSBXSURFX0lEKExFR0FDWV9HUk9VUCwgUkVQTFlfUlhfTVBEVV9DTUQpKSkKIAkJaXdsX212bV9yeF9tcGR1X21xKG12bSwgbmFwaSwgcnhiLCAwKTsKLQllbHNlIGlmICh1bmxpa2VseShwa3QtPmhkci5ncm91cF9pZCA9PSBEQVRBX1BBVEhfR1JPVVAgJiYKLQkJCSAgcGt0LT5oZHIuY21kID09IFJYX1FVRVVFU19OT1RJRklDQVRJT04pKQorCWVsc2UgaWYgKHVubGlrZWx5KGNtZCA9PSBXSURFX0lEKERBVEFfUEFUSF9HUk9VUCwKKwkJCQkJIFJYX1FVRVVFU19OT1RJRklDQVRJT04pKSkKIAkJaXdsX212bV9yeF9xdWV1ZV9ub3RpZihtdm0sIHJ4YiwgMCk7Ci0JZWxzZSBpZiAocGt0LT5oZHIuY21kID09IEZSQU1FX1JFTEVBU0UpCisJZWxzZSBpZiAoY21kID09IFdJREVfSUQoTEVHQUNZX0dST1VQLCBGUkFNRV9SRUxFQVNFKSkKIAkJaXdsX212bV9yeF9mcmFtZV9yZWxlYXNlKG12bSwgbmFwaSwgcnhiLCAwKTsKIAllbHNlCiAJCWl3bF9tdm1fcnhfY29tbW9uKG12bSwgcnhiLCBwa3QpOwpAQCAtMTY2NiwxMyArMTY0OSwxNCBAQAogewogCXN0cnVjdCBpd2xfbXZtICptdm0gPSBJV0xfT1BfTU9ERV9HRVRfTVZNKG9wX21vZGUpOwogCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXUxNiBjbWQgPSBXSURFX0lEKHBrdC0+aGRyLmdyb3VwX2lkLCBwa3QtPmhkci5jbWQpOwogCi0JaWYgKHVubGlrZWx5KHBrdC0+aGRyLmNtZCA9PSBGUkFNRV9SRUxFQVNFKSkKKwlpZiAodW5saWtlbHkoY21kID09IFdJREVfSUQoTEVHQUNZX0dST1VQLCBGUkFNRV9SRUxFQVNFKSkpCiAJCWl3bF9tdm1fcnhfZnJhbWVfcmVsZWFzZShtdm0sIG5hcGksIHJ4YiwgcXVldWUpOwotCWVsc2UgaWYgKHVubGlrZWx5KHBrdC0+aGRyLmNtZCA9PSBSWF9RVUVVRVNfTk9USUZJQ0FUSU9OICYmCi0JCQkgIHBrdC0+aGRyLmdyb3VwX2lkID09IERBVEFfUEFUSF9HUk9VUCkpCisJZWxzZSBpZiAodW5saWtlbHkoY21kID09IFdJREVfSUQoREFUQV9QQVRIX0dST1VQLAorCQkJCQkgUlhfUVVFVUVTX05PVElGSUNBVElPTikpKQogCQlpd2xfbXZtX3J4X3F1ZXVlX25vdGlmKG12bSwgcnhiLCBxdWV1ZSk7Ci0JZWxzZQorCWVsc2UgaWYgKGxpa2VseShjbWQgPT0gV0lERV9JRChMRUdBQ1lfR1JPVVAsIFJFUExZX1JYX01QRFVfQ01EKSkpCiAJCWl3bF9tdm1fcnhfbXBkdV9tcShtdm0sIG5hcGksIHJ4YiwgcXVldWUpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9wb3dlci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vcG93ZXIuYwppbmRleCBmZjg1ODY1Li5hZjZkMTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9wb3dlci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3Bvd2VyLmMKQEAgLTY5NCw4ICs2OTQsNyBAQAogCiAJLyogZW5hYmxlIFBNIG9uIHAycCBpZiBwMnAgc3RhbmQgYWxvbmUgKi8KIAlpZiAodmlmcy0+cDJwX2FjdGl2ZSAmJiAhdmlmcy0+YnNzX2FjdGl2ZSAmJiAhdmlmcy0+YXBfYWN0aXZlKSB7Ci0JCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUE0pCi0JCQlwMnBfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKKwkJcDJwX212bXZpZi0+cG1fZW5hYmxlZCA9IHRydWU7CiAJCXJldHVybjsKIAl9CiAKQEAgLTcwNywxMiArNzA2LDEwIEBACiAJCQkJICAgYXBfbXZtdmlmLT5waHlfY3R4dC0+aWQpOwogCiAJLyogY2xpZW50cyBhcmUgbm90IHN0YW5kIGFsb25lOiBlbmFibGUgUE0gaWYgRENNICovCi0JaWYgKCEoY2xpZW50X3NhbWVfY2hhbm5lbCB8fCBhcF9zYW1lX2NoYW5uZWwpICYmCi0JICAgIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19CU1NfUDJQX1BTX0RDTSkpIHsKKwlpZiAoIShjbGllbnRfc2FtZV9jaGFubmVsIHx8IGFwX3NhbWVfY2hhbm5lbCkpIHsKIAkJaWYgKHZpZnMtPmJzc19hY3RpdmUpCiAJCQlic3NfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKLQkJaWYgKHZpZnMtPnAycF9hY3RpdmUgJiYKLQkJICAgIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19QMlBfUE0pKQorCQlpZiAodmlmcy0+cDJwX2FjdGl2ZSkKIAkJCXAycF9tdm12aWYtPnBtX2VuYWJsZWQgPSB0cnVlOwogCQlyZXR1cm47CiAJfQpAQCAtNzIxLDEyICs3MTgsMTAgQEAKIAkgKiBUaGVyZSBpcyBvbmx5IG9uZSBjaGFubmVsIGluIHRoZSBzeXN0ZW0gYW5kIHRoZXJlIGFyZSBvbmx5CiAJICogYnNzIGFuZCBwMnAgY2xpZW50cyB0aGF0IHNoYXJlIGl0CiAJICovCi0JaWYgKGNsaWVudF9zYW1lX2NoYW5uZWwgJiYgIXZpZnMtPmFwX2FjdGl2ZSAmJgotCSAgICAobXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfQlNTX1AyUF9QU19TQ00pKSB7CisJaWYgKGNsaWVudF9zYW1lX2NoYW5uZWwgJiYgIXZpZnMtPmFwX2FjdGl2ZSkgewogCQkvKiBzaGFyZSBzYW1lIGNoYW5uZWwqLwogCQlic3NfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKLQkJaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX1AyUF9QTSkKLQkJCXAycF9tdm12aWYtPnBtX2VuYWJsZWQgPSB0cnVlOworCQlwMnBfbXZtdmlmLT5wbV9lbmFibGVkID0gdHJ1ZTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3J4bXEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3J4bXEuYwppbmRleCBkZjZjMzJjLi5hNTdjNmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9yeG1xLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vcnhtcS5jCkBAIC0xMzIsNyArMTMyLDggQEAKIAkJICAgSUVFRTgwMjExX0NDTVBfUE5fTEVOKSA8PSAwKQogCQlyZXR1cm4gLTE7CiAKLQltZW1jcHkocHRrX3BuLT5xW3F1ZXVlXS5wblt0aWRdLCBwbiwgSUVFRTgwMjExX0NDTVBfUE5fTEVOKTsKKwlpZiAoIShzdGF0cy0+ZmxhZyAmIFJYX0ZMQUdfQU1TRFVfTU9SRSkpCisJCW1lbWNweShwdGtfcG4tPnFbcXVldWVdLnBuW3RpZF0sIHBuLCBJRUVFODAyMTFfQ0NNUF9QTl9MRU4pOwogCXN0YXRzLT5mbGFnIHw9IFJYX0ZMQUdfUE5fVkFMSURBVEVEOwogCiAJcmV0dXJuIDA7CkBAIC00MTcsMTAgKzQxOCwxMSBAQAogCiAJCXNzbiA9IGllZWU4MDIxMV9zbl9pbmMoc3NuKTsKIAotCQkvKiBob2xlcyBhcmUgdmFsaWQgc2luY2UgbnNzbiBpbmRpY2F0ZXMgZnJhbWVzIHdlcmUgcmVjZWl2ZWQuICovCi0JCWlmIChza2JfcXVldWVfZW1wdHkoc2tiX2xpc3QpIHx8ICFza2JfcGVla190YWlsKHNrYl9saXN0KSkKLQkJCWNvbnRpbnVlOwotCQkvKiBFbXB0eSB0aGUgbGlzdC4gV2lsbCBoYXZlIG1vcmUgdGhhbiBvbmUgZnJhbWUgZm9yIEEtTVNEVSAqLworCQkvKgorCQkgKiBFbXB0eSB0aGUgbGlzdC4gV2lsbCBoYXZlIG1vcmUgdGhhbiBvbmUgZnJhbWUgZm9yIEEtTVNEVS4KKwkJICogRW1wdHkgbGlzdCBpcyB2YWxpZCBhcyB3ZWxsIHNpbmNlIG5zc24gaW5kaWNhdGVzIGZyYW1lcyB3ZXJlCisJCSAqIHJlY2VpdmVkLgorCQkgKi8KIAkJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKHNrYl9saXN0KSkpIHsKIAkJCWl3bF9tdm1fcGFzc19wYWNrZXRfdG9fbWFjODAyMTEobXZtLCBuYXBpLCBza2IsCiAJCQkJCQkJcmVvcmRlcl9idWYtPnF1ZXVlLApAQCAtNDMzLDcgKzQzNSw3IEBACiAJaWYgKHJlb3JkZXJfYnVmLT5udW1fc3RvcmVkICYmICFyZW9yZGVyX2J1Zi0+cmVtb3ZlZCkgewogCQl1MTYgaW5kZXggPSByZW9yZGVyX2J1Zi0+aGVhZF9zbiAlIHJlb3JkZXJfYnVmLT5idWZfc2l6ZTsKIAotCQl3aGlsZSAoIXNrYl9wZWVrX3RhaWwoJnJlb3JkZXJfYnVmLT5lbnRyaWVzW2luZGV4XSkpCisJCXdoaWxlIChza2JfcXVldWVfZW1wdHkoJnJlb3JkZXJfYnVmLT5lbnRyaWVzW2luZGV4XSkpCiAJCQlpbmRleCA9IChpbmRleCArIDEpICUgcmVvcmRlcl9idWYtPmJ1Zl9zaXplOwogCQkvKiBtb2RpZnkgdGltZXIgdG8gbWF0Y2ggbmV4dCBmcmFtZSdzIGV4cGlyYXRpb24gdGltZSAqLwogCQltb2RfdGltZXIoJnJlb3JkZXJfYnVmLT5yZW9yZGVyX3RpbWVyLApAQCAtNDUxLDE3ICs0NTMsMTcgQEAKIAl1MTYgc24gPSAwLCBpbmRleCA9IDA7CiAJYm9vbCBleHBpcmVkID0gZmFsc2U7CiAKLQlzcGluX2xvY2tfYmgoJmJ1Zi0+bG9jayk7CisJc3Bpbl9sb2NrKCZidWYtPmxvY2spOwogCiAJaWYgKCFidWYtPm51bV9zdG9yZWQgfHwgYnVmLT5yZW1vdmVkKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZidWYtPmxvY2spOworCQlzcGluX3VubG9jaygmYnVmLT5sb2NrKTsKIAkJcmV0dXJuOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBidWYtPmJ1Zl9zaXplIDsgaSsrKSB7CiAJCWluZGV4ID0gKGJ1Zi0+aGVhZF9zbiArIGkpICUgYnVmLT5idWZfc2l6ZTsKIAotCQlpZiAoIXNrYl9wZWVrX3RhaWwoJmJ1Zi0+ZW50cmllc1tpbmRleF0pKQorCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZidWYtPmVudHJpZXNbaW5kZXhdKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgYnVmLT5yZW9yZGVyX3RpbWVbaW5kZXhdICsKIAkJCQlSWF9SRU9SREVSX0JVRl9USU1FT1VUX01RKSkKQEAgLTQ5MSw3ICs0OTMsNyBAQAogCQkJICBidWYtPnJlb3JkZXJfdGltZVtpbmRleF0gKwogCQkJICAxICsgUlhfUkVPUkRFUl9CVUZfVElNRU9VVF9NUSk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZidWYtPmxvY2spOworCXNwaW5fdW5sb2NrKCZidWYtPmxvY2spOwogfQogCiBzdGF0aWMgdm9pZCBpd2xfbXZtX2RlbF9iYShzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgcXVldWUsCkBAIC01MDIsNyArNTA0LDcgQEAKIAlzdHJ1Y3QgaXdsX212bV9yZW9yZGVyX2J1ZmZlciAqcmVvcmRlcl9idWY7CiAJdTggYmFpZCA9IGRhdGEtPmJhaWQ7CiAKLQlpZiAoV0FSTl9PTl9PTkNFKGJhaWQgPj0gSVdMX1JYX1JFT1JERVJfREFUQV9JTlZBTElEX0JBSUQpKQorCWlmIChXQVJOX09OQ0UoYmFpZCA+PSBJV0xfTUFYX0JBSUQsICJpbnZhbGlkIEJBSUQ6ICV4XG4iLCBiYWlkKSkKIAkJcmV0dXJuOwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtNTg5LDYgKzU5MSwxMSBAQAogCWJhaWQgPSAocmVvcmRlciAmIElXTF9SWF9NUERVX1JFT1JERVJfQkFJRF9NQVNLKSA+PgogCQlJV0xfUlhfTVBEVV9SRU9SREVSX0JBSURfU0hJRlQ7CiAKKwkvKgorCSAqIFRoaXMgYWxzbyBjb3ZlcnMgdGhlIGNhc2Ugb2YgcmVjZWl2aW5nIGEgQmxvY2sgQWNrIFJlcXVlc3QKKwkgKiBvdXRzaWRlIGEgQkEgc2Vzc2lvbjsgd2UnbGwgcGFzcyBpdCB0byBtYWM4MDIxMSBhbmQgdGhhdAorCSAqIHRoZW4gc2VuZHMgYSBkZWxCQSBhY3Rpb24gZnJhbWUuCisJICovCiAJaWYgKGJhaWQgPT0gSVdMX1JYX1JFT1JERVJfREFUQV9JTlZBTElEX0JBSUQpCiAJCXJldHVybiBmYWxzZTsKIApAQCAtNTk4LDkgKzYwNSwxMCBAQAogCiAJbXZtX3N0YSA9IGl3bF9tdm1fc3RhX2Zyb21fbWFjODAyMTEoc3RhKTsKIAotCS8qIG5vdCBhIGRhdGEgcGFja2V0ICovCi0JaWYgKCFpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSB8fAotCSAgICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKKwkvKiBub3QgYSBkYXRhIHBhY2tldCBvciBhIGJhciAqLworCWlmICghaWVlZTgwMjExX2lzX2JhY2tfcmVxKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKKwkgICAgKCFpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSB8fAorCSAgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAodW5saWtlbHkoIWllZWU4MDIxMV9pc19kYXRhX3ByZXNlbnQoaGRyLT5mcmFtZV9jb250cm9sKSkpCkBAIC02MjQsNiArNjMyLDExIEBACiAKIAlzcGluX2xvY2tfYmgoJmJ1ZmZlci0+bG9jayk7CiAKKwlpZiAoaWVlZTgwMjExX2lzX2JhY2tfcmVxKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJaXdsX212bV9yZWxlYXNlX2ZyYW1lcyhtdm0sIHN0YSwgbmFwaSwgYnVmZmVyLCBuc3NuKTsKKwkJZ290byBkcm9wOworCX0KKwogCS8qCiAJICogSWYgdGhlcmUgd2FzIGEgc2lnbmlmaWNhbnQganVtcCBpbiB0aGUgbnNzbiAtIGFkanVzdC4KIAkgKiBJZiB0aGUgU04gaXMgc21hbGxlciB0aGFuIHRoZSBOU1NOIGl0IG1pZ2h0IG5lZWQgdG8gZmlyc3QgZ28gaW50bwpAQCAtODgzLDYgKzg5Niw5IEBACiAJCQl1OCAqcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKIAogCQkJKnFjICY9IH5JRUVFODAyMTFfUU9TX0NUTF9BX01TRFVfUFJFU0VOVDsKKwkJCWlmICghKGRlc2MtPmFtc2R1X2luZm8gJgorCQkJICAgICAgSVdMX1JYX01QRFVfQU1TRFVfTEFTVF9TVUJGUkFNRSkpCisJCQkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfQU1TRFVfTU9SRTsKIAkJfQogCQlpZiAoYmFpZCAhPSBJV0xfUlhfUkVPUkRFUl9EQVRBX0lOVkFMSURfQkFJRCkKIAkJCWl3bF9tdm1fYWdnX3J4X3JlY2VpdmVkKG12bSwgYmFpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zY2FuLmMKaW5kZXggZGFjMTIwZi4uZjI3OWZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3NjYW4uYwpAQCAtMTQxLDYgKzE0MSw3IEBACiAJc3RydWN0IGNmZzgwMjExX21hdGNoX3NldCAqbWF0Y2hfc2V0czsKIAlpbnQgbl9zY2FuX3BsYW5zOwogCXN0cnVjdCBjZmc4MDIxMV9zY2hlZF9zY2FuX3BsYW4gKnNjYW5fcGxhbnM7CisJdTMyIG1lYXN1cmVtZW50X2R3ZWxsOwogfTsKIAogc3RhdGljIHU4IGl3bF9tdm1fc2Nhbl9yeF9hbnQoc3RydWN0IGl3bF9tdm0gKm12bSkKQEAgLTIzMiw2ICsyMzMsMjcgQEAKIAlyZXR1cm4gSVdMX1NDQU5fVFlQRV9XSUxEOwogfQogCitzdGF0aWMgaW50Citpd2xfbXZtX2dldF9tZWFzdXJlbWVudF9kd2VsbChzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJICAgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxLAorCQkJICAgICAgc3RydWN0IGl3bF9tdm1fc2Nhbl9wYXJhbXMgKnBhcmFtcykKK3sKKwlpZiAoIXJlcS0+ZHVyYXRpb24pCisJCXJldHVybiAwOworCisJaWYgKHJlcS0+ZHVyYXRpb25fbWFuZGF0b3J5ICYmCisJICAgIHJlcS0+ZHVyYXRpb24gPiBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLm1heF9vdXRfdGltZSkgeworCQlJV0xfREVCVUdfU0NBTihtdm0sCisJCQkgICAgICAgIk1lYXN1cmVtZW50IHNjYW4gLSB0b28gbG9uZyBkd2VsbCAlaHUgKG1heCBvdXQgdGltZSAldSlcbiIsCisJCQkgICAgICAgcmVxLT5kdXJhdGlvbiwKKwkJCSAgICAgICBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLm1heF9vdXRfdGltZSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gbWluX3QodTMyLCAodTMyKXJlcS0+ZHVyYXRpb24sCisJCSAgICAgc2Nhbl90aW1pbmdbcGFyYW1zLT50eXBlXS5tYXhfb3V0X3RpbWUpOworfQorCiBzdGF0aWMgaW5saW5lIGJvb2wgaXdsX212bV9ycm1fc2Nhbl9uZWVkZWQoc3RydWN0IGl3bF9tdm0gKm12bSkKIHsKIAkvKiByZXF1aXJlIHJybSBzY2FuIHdoZW5ldmVyIHRoZSBmdyBzdXBwb3J0cyBpdCAqLwpAQCAtNzE3LDIyICs3MzksNiBAQAogCXBhcmFtcy0+cHJlcS5jb21tb25fZGF0YS5sZW4gPSBjcHVfdG9fbGUxNihpZXMtPmNvbW1vbl9pZV9sZW4pOwogfQogCi1zdGF0aWMgX19sZTMyIGl3bF9tdm1fc2Nhbl9wcmlvcml0eShzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJCSAgICBlbnVtIGl3bF9zY2FuX3ByaW9yaXR5X2V4dCBwcmlvKQotewotCWlmIChmd19oYXNfYXBpKCZtdm0tPmZ3LT51Y29kZV9jYXBhLAotCQkgICAgICAgSVdMX1VDT0RFX1RMVl9BUElfRVhUX1NDQU5fUFJJT1JJVFkpKQotCQlyZXR1cm4gY3B1X3RvX2xlMzIocHJpbyk7Ci0KLQlpZiAocHJpbyA8PSBJV0xfU0NBTl9QUklPUklUWV9FWFRfMikKLQkJcmV0dXJuIGNwdV90b19sZTMyKElXTF9TQ0FOX1BSSU9SSVRZX0xPVyk7Ci0KLQlpZiAocHJpbyA8PSBJV0xfU0NBTl9QUklPUklUWV9FWFRfNCkKLQkJcmV0dXJuIGNwdV90b19sZTMyKElXTF9TQ0FOX1BSSU9SSVRZX01FRElVTSk7Ci0KLQlyZXR1cm4gY3B1X3RvX2xlMzIoSVdMX1NDQU5fUFJJT1JJVFlfSElHSCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGl3bF9tdm1fc2Nhbl9sbWFjX2R3ZWxsKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJICAgIHN0cnVjdCBpd2xfc2Nhbl9yZXFfbG1hYyAqY21kLAogCQkJCSAgICBzdHJ1Y3QgaXdsX212bV9zY2FuX3BhcmFtcyAqcGFyYW1zKQpAQCAtNzQzLDcgKzc0OSw3IEBACiAJY21kLT5leHRlbmRlZF9kd2VsbCA9IHNjYW5fdGltaW5nW3BhcmFtcy0+dHlwZV0uZHdlbGxfZXh0ZW5kZWQ7CiAJY21kLT5tYXhfb3V0X3RpbWUgPSBjcHVfdG9fbGUzMihzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLm1heF9vdXRfdGltZSk7CiAJY21kLT5zdXNwZW5kX3RpbWUgPSBjcHVfdG9fbGUzMihzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLnN1c3BlbmRfdGltZSk7Ci0JY21kLT5zY2FuX3ByaW8gPSBpd2xfbXZtX3NjYW5fcHJpb3JpdHkobXZtLCBJV0xfU0NBTl9QUklPUklUWV9FWFRfNik7CisJY21kLT5zY2FuX3ByaW8gPSBjcHVfdG9fbGUzMihJV0xfU0NBTl9QUklPUklUWV9FWFRfNik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpd2xfbXZtX3NjYW5fZml0cyhzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgbl9zc2lkcywKQEAgLTEwMzMsMjEgKzEwMzksMjQgQEAKIAkJCQkgICAgc3RydWN0IGl3bF9zY2FuX3JlcV91bWFjICpjbWQsCiAJCQkJICAgIHN0cnVjdCBpd2xfbXZtX3NjYW5fcGFyYW1zICpwYXJhbXMpCiB7Ci0JY21kLT5leHRlbmRlZF9kd2VsbCA9IHNjYW5fdGltaW5nW3BhcmFtcy0+dHlwZV0uZHdlbGxfZXh0ZW5kZWQ7Ci0JY21kLT5hY3RpdmVfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX2FjdGl2ZTsKLQljbWQtPnBhc3NpdmVfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX3Bhc3NpdmU7CisJaWYgKHBhcmFtcy0+bWVhc3VyZW1lbnRfZHdlbGwpIHsKKwkJY21kLT5hY3RpdmVfZHdlbGwgPSBwYXJhbXMtPm1lYXN1cmVtZW50X2R3ZWxsOworCQljbWQtPnBhc3NpdmVfZHdlbGwgPSBwYXJhbXMtPm1lYXN1cmVtZW50X2R3ZWxsOworCQljbWQtPmV4dGVuZGVkX2R3ZWxsID0gcGFyYW1zLT5tZWFzdXJlbWVudF9kd2VsbDsKKwl9IGVsc2UgeworCQljbWQtPmFjdGl2ZV9kd2VsbCA9IHNjYW5fdGltaW5nW3BhcmFtcy0+dHlwZV0uZHdlbGxfYWN0aXZlOworCQljbWQtPnBhc3NpdmVfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX3Bhc3NpdmU7CisJCWNtZC0+ZXh0ZW5kZWRfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX2V4dGVuZGVkOworCX0KIAljbWQtPmZyYWdtZW50ZWRfZHdlbGwgPSBzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLmR3ZWxsX2ZyYWdtZW50ZWQ7CiAJY21kLT5tYXhfb3V0X3RpbWUgPSBjcHVfdG9fbGUzMihzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLm1heF9vdXRfdGltZSk7CiAJY21kLT5zdXNwZW5kX3RpbWUgPSBjcHVfdG9fbGUzMihzY2FuX3RpbWluZ1twYXJhbXMtPnR5cGVdLnN1c3BlbmRfdGltZSk7Ci0JY21kLT5zY2FuX3ByaW9yaXR5ID0KLQkJaXdsX212bV9zY2FuX3ByaW9yaXR5KG12bSwgSVdMX1NDQU5fUFJJT1JJVFlfRVhUXzYpOworCWNtZC0+c2Nhbl9wcmlvcml0eSA9IGNwdV90b19sZTMyKElXTF9TQ0FOX1BSSU9SSVRZX0VYVF82KTsKIAogCWlmIChpd2xfbXZtX2lzX3JlZ3VsYXJfc2NhbihwYXJhbXMpKQotCQljbWQtPm9vY19wcmlvcml0eSA9Ci0JCQlpd2xfbXZtX3NjYW5fcHJpb3JpdHkobXZtLCBJV0xfU0NBTl9QUklPUklUWV9FWFRfNik7CisJCWNtZC0+b29jX3ByaW9yaXR5ID0gY3B1X3RvX2xlMzIoSVdMX1NDQU5fUFJJT1JJVFlfRVhUXzYpOwogCWVsc2UKLQkJY21kLT5vb2NfcHJpb3JpdHkgPQotCQkJaXdsX212bV9zY2FuX3ByaW9yaXR5KG12bSwgSVdMX1NDQU5fUFJJT1JJVFlfRVhUXzIpOworCQljbWQtPm9vY19wcmlvcml0eSA9IGNwdV90b19sZTMyKElXTF9TQ0FOX1BSSU9SSVRZX0VYVF8yKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEwNjcsMTEgKzEwNzYsMTEgQEAKIAl9CiB9CiAKLXN0YXRpYyB1MzIgaXdsX212bV9zY2FuX3VtYWNfZmxhZ3Moc3RydWN0IGl3bF9tdm0gKm12bSwKK3N0YXRpYyB1MTYgaXdsX212bV9zY2FuX3VtYWNfZmxhZ3Moc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCQkgICBzdHJ1Y3QgaXdsX212bV9zY2FuX3BhcmFtcyAqcGFyYW1zLAogCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7Ci0JaW50IGZsYWdzID0gMDsKKwl1MTYgZmxhZ3MgPSAwOwogCiAJaWYgKHBhcmFtcy0+bl9zc2lkcyA9PSAwKQogCQlmbGFncyA9IElXTF9VTUFDX1NDQU5fR0VOX0ZMQUdTX1BBU1NJVkU7CkBAIC0xMDkzLDYgKzExMDIsOSBAQAogCWlmICghaXdsX212bV9pc19yZWd1bGFyX3NjYW4ocGFyYW1zKSkKIAkJZmxhZ3MgfD0gSVdMX1VNQUNfU0NBTl9HRU5fRkxBR1NfUEVSSU9ESUM7CiAKKwlpZiAocGFyYW1zLT5tZWFzdXJlbWVudF9kd2VsbCkKKwkJZmxhZ3MgfD0gSVdMX1VNQUNfU0NBTl9HRU5fRkxBR1NfSVRFUl9DT01QTEVURTsKKwogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKIAlpZiAobXZtLT5zY2FuX2l0ZXJfbm90aWZfZW5hYmxlZCkKIAkJZmxhZ3MgfD0gSVdMX1VNQUNfU0NBTl9HRU5fRkxBR1NfSVRFUl9DT01QTEVURTsKQEAgLTExMTksNiArMTEzMSw3IEBACiAJCQltdm0tPmZ3LT51Y29kZV9jYXBhLm5fc2Nhbl9jaGFubmVsczsKIAlpbnQgdWlkLCBpOwogCXUzMiBzc2lkX2JpdG1hcCA9IDA7CisJc3RydWN0IGl3bF9tdm1fdmlmICpzY2FuX3ZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwogCkBAIC0xMTM2LDggKzExNDksOSBAQAogCW12bS0+c2Nhbl91aWRfc3RhdHVzW3VpZF0gPSB0eXBlOwogCiAJY21kLT51aWQgPSBjcHVfdG9fbGUzMih1aWQpOwotCWNtZC0+Z2VuZXJhbF9mbGFncyA9IGNwdV90b19sZTMyKGl3bF9tdm1fc2Nhbl91bWFjX2ZsYWdzKG12bSwgcGFyYW1zLAorCWNtZC0+Z2VuZXJhbF9mbGFncyA9IGNwdV90b19sZTE2KGl3bF9tdm1fc2Nhbl91bWFjX2ZsYWdzKG12bSwgcGFyYW1zLAogCQkJCQkJCQkgdmlmKSk7CisJY21kLT5zY2FuX3N0YXJ0X21hY19pZCA9IHNjYW5fdmlmLT5pZDsKIAogCWlmICh0eXBlID09IElXTF9NVk1fU0NBTl9TQ0hFRCB8fCB0eXBlID09IElXTF9NVk1fU0NBTl9ORVRERVRFQ1QpCiAJCWNtZC0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihJV0xfVU1BQ19TQ0FOX0ZMQUdfUFJFRU1QVElWRSk7CkBAIC0xMjg5LDYgKzEzMDMsMTIgQEAKIAkJaXdsX212bV9nZXRfc2Nhbl90eXBlKG12bSwKIAkJCQkgICAgICB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSk7CiAKKwlyZXQgPSBpd2xfbXZtX2dldF9tZWFzdXJlbWVudF9kd2VsbChtdm0sIHJlcSwgJnBhcmFtcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlwYXJhbXMubWVhc3VyZW1lbnRfZHdlbGwgPSByZXQ7CisKIAlpd2xfbXZtX2J1aWxkX3NjYW5fcHJvYmUobXZtLCB2aWYsIGllcywgJnBhcmFtcyk7CiAKIAlpZiAoZndfaGFzX2NhcGEoJm12bS0+ZnctPnVjb2RlX2NhcGEsIElXTF9VQ09ERV9UTFZfQ0FQQV9VTUFDX1NDQU4pKSB7CkBAIC0xMzE1LDYgKzEzMzUsNyBAQAogCiAJSVdMX0RFQlVHX1NDQU4obXZtLCAiU2NhbiByZXF1ZXN0IHdhcyBzZW50IHN1Y2Nlc3NmdWxseVxuIik7CiAJbXZtLT5zY2FuX3N0YXR1cyB8PSBJV0xfTVZNX1NDQU5fUkVHVUxBUjsKKwltdm0tPnNjYW5fdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh2aWYpOwogCWl3bF9tdm1fcmVmKG12bSwgSVdMX01WTV9SRUZfU0NBTik7CiAKIAlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3dxLCAmbXZtLT5zY2FuX3RpbWVvdXRfZHdvcmssCkBAIC0xNDM3LDkgKzE0NTgsMTIgQEAKIAlpZiAobXZtLT5zY2FuX3VpZF9zdGF0dXNbdWlkXSA9PSBJV0xfTVZNX1NDQU5fUkVHVUxBUikgewogCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9pbmZvIGluZm8gPSB7CiAJCQkuYWJvcnRlZCA9IGFib3J0ZWQsCisJCQkuc2Nhbl9zdGFydF90c2YgPSBtdm0tPnNjYW5fc3RhcnQsCiAJCX07CiAKKwkJbWVtY3B5KGluZm8udHNmX2Jzc2lkLCBtdm0tPnNjYW5fdmlmLT5ic3NpZCwgRVRIX0FMRU4pOwogCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQobXZtLT5odywgJmluZm8pOworCQltdm0tPnNjYW5fdmlmID0gTlVMTDsKIAkJaXdsX212bV91bnJlZihtdm0sIElXTF9NVk1fUkVGX1NDQU4pOwogCQljYW5jZWxfZGVsYXllZF93b3JrKCZtdm0tPnNjYW5fdGltZW91dF9kd29yayk7CiAJfSBlbHNlIGlmIChtdm0tPnNjYW5fdWlkX3N0YXR1c1t1aWRdID09IElXTF9NVk1fU0NBTl9TQ0hFRCkgewpAQCAtMTQ3Myw2ICsxNDk3LDggQEAKIAlzdHJ1Y3QgaXdsX3VtYWNfc2Nhbl9pdGVyX2NvbXBsZXRlX25vdGlmICpub3RpZiA9ICh2b2lkICopcGt0LT5kYXRhOwogCXU4IGJ1ZlsyNTZdOwogCisJbXZtLT5zY2FuX3N0YXJ0ID0gbGU2NF90b19jcHUobm90aWYtPnN0YXJ0X3RzZik7CisKIAlJV0xfREVCVUdfU0NBTihtdm0sCiAJCSAgICAgICAiVU1BQyBTY2FuIGl0ZXJhdGlvbiBjb21wbGV0ZTogc3RhdHVzPTB4JXggc2Nhbm5lZF9jaGFubmVscz0lZCBjaGFubmVscyBsaXN0OiAlc1xuIiwKIAkJICAgICAgIG5vdGlmLT5zdGF0dXMsIG5vdGlmLT5zY2FubmVkX2NoYW5uZWxzLApAQCAtMTQ4NSw2ICsxNTExLDEwIEBACiAJCWllZWU4MDIxMV9zY2hlZF9zY2FuX3Jlc3VsdHMobXZtLT5odyk7CiAJCW12bS0+c2NoZWRfc2Nhbl9wYXNzX2FsbCA9IFNDSEVEX1NDQU5fUEFTU19BTExfRU5BQkxFRDsKIAl9CisKKwlJV0xfREVCVUdfU0NBTihtdm0sCisJCSAgICAgICAiVU1BQyBTY2FuIGl0ZXJhdGlvbiBjb21wbGV0ZTogc2NhbiBzdGFydGVkIGF0ICVsbHUgKFRTRilcbiIsCisJCSAgICAgICBtdm0tPnNjYW5fc3RhcnQpOwogfQogCiBzdGF0aWMgaW50IGl3bF9tdm1fdW1hY19zY2FuX2Fib3J0KHN0cnVjdCBpd2xfbXZtICptdm0sIGludCB0eXBlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc3RhLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuYwppbmRleCAzMTMwYjljLi5mYzc3MTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuYwpAQCAtNDY4LDYgKzQ2OCwxMSBAQAogCQkgICAgaSAhPSBJV0xfTVZNX0RRQV9CU1NfQ0xJRU5UX1FVRVVFKQogCQkJY29udGludWU7CiAKKwkJLyogRG9uJ3QgdHJ5IGFuZCB0YWtlIHF1ZXVlcyBiZWluZyByZWNvbmZpZ3VyZWQgKi8KKwkJaWYgKG12bS0+cXVldWVfaW5mb1txdWV1ZV0uc3RhdHVzID09CisJCSAgICBJV0xfTVZNX1FVRVVFX1JFQ09ORklHVVJJTkcpCisJCQljb250aW51ZTsKKwogCQlhY190b19xdWV1ZVttdm0tPnF1ZXVlX2luZm9baV0ubWFjODAyMTFfYWNdID0gaTsKIAl9CiAKQEAgLTUwMSwzMSArNTA2LDM3IEBACiAJCXF1ZXVlID0gYWNfdG9fcXVldWVbSUVFRTgwMjExX0FDX1ZPXTsKIAogCS8qIE1ha2Ugc3VyZSBxdWV1ZSBmb3VuZCAob3Igbm90KSBpcyBsZWdhbCAqLwotCWlmICghKChxdWV1ZSA+PSBJV0xfTVZNX0RRQV9NSU5fTUdNVF9RVUVVRSAmJgotCSAgICAgICBxdWV1ZSA8PSBJV0xfTVZNX0RRQV9NQVhfTUdNVF9RVUVVRSkgfHwKLQkgICAgICAocXVldWUgPj0gSVdMX01WTV9EUUFfTUlOX0RBVEFfUVVFVUUgJiYKLQkgICAgICAgcXVldWUgPD0gSVdMX01WTV9EUUFfTUFYX0RBVEFfUVVFVUUpIHx8Ci0JICAgICAgKHF1ZXVlID09IElXTF9NVk1fRFFBX0JTU19DTElFTlRfUVVFVUUpKSkgeworCWlmICghaXdsX212bV9pc19kcWFfZGF0YV9xdWV1ZShtdm0sIHF1ZXVlKSAmJgorCSAgICAhaXdsX212bV9pc19kcWFfbWdtdF9xdWV1ZShtdm0sIHF1ZXVlKSAmJgorCSAgICAocXVldWUgIT0gSVdMX01WTV9EUUFfQlNTX0NMSUVOVF9RVUVVRSkpIHsKIAkJSVdMX0VSUihtdm0sICJObyBEQVRBIHF1ZXVlcyBhdmFpbGFibGUgdG8gc2hhcmVcbiIpOwotCQlxdWV1ZSA9IC1FTk9TUEM7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgcXVldWUgaXNuJ3QgaW4gdGhlIG1pZGRsZSBvZiBiZWluZyByZWNvbmZpZ3VyZWQgKi8KKwlpZiAobXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXMgPT0gSVdMX01WTV9RVUVVRV9SRUNPTkZJR1VSSU5HKSB7CisJCUlXTF9FUlIobXZtLAorCQkJIlRYUSAlZCBpcyBpbiB0aGUgbWlkZGxlIG9mIHJlLWNvbmZpZyAtIHRyeSBhZ2FpblxuIiwKKwkJCXF1ZXVlKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlyZXR1cm4gcXVldWU7CiB9CiAKIC8qCi0gKiBJZiBhIGdpdmVuIHF1ZXVlIGhhcyBhIGhpZ2hlciBBQyB0aGFuIHRoZSBUSUQgc3RyZWFtIHRoYXQgaXMgYmVpbmcgYWRkZWQgdG8KLSAqIGl0LCB0aGUgcXVldWUgbmVlZHMgdG8gYmUgcmVkaXJlY3RlZCB0byB0aGUgbG93ZXIgQUMuIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGF0CisgKiBJZiBhIGdpdmVuIHF1ZXVlIGhhcyBhIGhpZ2hlciBBQyB0aGFuIHRoZSBUSUQgc3RyZWFtIHRoYXQgaXMgYmVpbmcgY29tcGFyZWQKKyAqIHRvLCB0aGUgcXVldWUgbmVlZHMgdG8gYmUgcmVkaXJlY3RlZCB0byB0aGUgbG93ZXIgQUMuIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGF0CiAgKiBpbiBzdWNoIGEgY2FzZSwgb3RoZXJ3aXNlIC0gaWYgbm8gcmVkaXJlY3Rpb24gcmVxdWlyZWQgLSBpdCBkb2VzIG5vdGhpbmcsCiAgKiB1bmxlc3MgdGhlICVmb3JjZSBwYXJhbSBpcyB0cnVlLgogICovCi1zdGF0aWMgaW50IGl3bF9tdm1fc2NkX3F1ZXVlX3JlZGlyZWN0KHN0cnVjdCBpd2xfbXZtICptdm0sIGludCBxdWV1ZSwgaW50IHRpZCwKLQkJCQkgICAgICBpbnQgYWMsIGludCBzc24sIHVuc2lnbmVkIGludCB3ZGdfdGltZW91dCwKLQkJCQkgICAgICBib29sIGZvcmNlKQoraW50IGl3bF9tdm1fc2NkX3F1ZXVlX3JlZGlyZWN0KHN0cnVjdCBpd2xfbXZtICptdm0sIGludCBxdWV1ZSwgaW50IHRpZCwKKwkJCSAgICAgICBpbnQgYWMsIGludCBzc24sIHVuc2lnbmVkIGludCB3ZGdfdGltZW91dCwKKwkJCSAgICAgICBib29sIGZvcmNlKQogewogCXN0cnVjdCBpd2xfc2NkX3R4cV9jZmdfY21kIGNtZCA9IHsKIAkJLnNjZF9xdWV1ZSA9IHF1ZXVlLAotCQkuZW5hYmxlID0gMCwKKwkJLmFjdGlvbiA9IFNDRF9DRkdfRElTQUJMRV9RVUVVRSwKIAl9OwogCWJvb2wgc2hhcmVkX3F1ZXVlOwogCXVuc2lnbmVkIGxvbmcgbXE7CkBAIC01NTEsMTEgKzU2MiwxMiBAQAogCiAJY21kLnN0YV9pZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0ucmFfc3RhX2lkOwogCWNtZC50eF9maWZvID0gaXdsX212bV9hY190b190eF9maWZvW212bS0+cXVldWVfaW5mb1txdWV1ZV0ubWFjODAyMTFfYWNdOworCWNtZC50aWQgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnR4cV90aWQ7CiAJbXEgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLmh3X3F1ZXVlX3RvX21hYzgwMjExOwogCXNoYXJlZF9xdWV1ZSA9IChtdm0tPnF1ZXVlX2luZm9bcXVldWVdLmh3X3F1ZXVlX3JlZmNvdW50ID4gMSk7CiAJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKIAotCUlXTF9ERUJVR19UWF9RVUVVRVMobXZtLCAiUmVkaXJlY3Rpbmcgc2hhcmVkIFRYUSAjJWQgdG8gRklGTyAjJWRcbiIsCisJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sICJSZWRpcmVjdGluZyBUWFEgIyVkIHRvIEZJRk8gIyVkXG4iLAogCQkJICAgIHF1ZXVlLCBpd2xfbXZtX2FjX3RvX3R4X2ZpZm9bYWNdKTsKIAogCS8qIFN0b3AgTUFDIHF1ZXVlcyBhbmQgd2FpdCBmb3IgdGhpcyBxdWV1ZSB0byBlbXB0eSAqLwpAQCAtNTc2LDkgKzU4OCwxMiBAQAogCQkJcmV0KTsKIAogCS8qIE1ha2Ugc3VyZSB0aGUgU0NEIHdycHRyIGlzIGNvcnJlY3RseSBzZXQgYmVmb3JlIHJlY29uZmlndXJpbmcgKi8KLQlpd2xfdHJhbnNfdHhxX2VuYWJsZShtdm0tPnRyYW5zLCBxdWV1ZSwgaXdsX212bV9hY190b190eF9maWZvW2FjXSwKLQkJCSAgICAgY21kLnN0YV9pZCwgdGlkLCBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRiwKLQkJCSAgICAgc3NuLCB3ZGdfdGltZW91dCk7CisJaXdsX3RyYW5zX3R4cV9lbmFibGVfY2ZnKG12bS0+dHJhbnMsIHF1ZXVlLCBzc24sIE5VTEwsIHdkZ190aW1lb3V0KTsKKworCS8qIFVwZGF0ZSB0aGUgVElEICJvd25lciIgb2YgdGhlIHF1ZXVlICovCisJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS50eHFfdGlkID0gdGlkOworCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAKIAkvKiBUT0RPOiBXb3JrLWFyb3VuZCBTQ0QgYnVnIHdoZW4gbW92aW5nIGJhY2sgYnkgbXVsdGlwbGVzIG9mIDB4NDAgKi8KIApAQCAtNzA5LDcgKzcyNCw3IEBACiAJaWYgKFdBUk5fT04ocXVldWUgPD0gMCkpIHsKIAkJSVdMX0VSUihtdm0sICJObyBhdmFpbGFibGUgcXVldWVzIGZvciB0aWQgJWQgb24gc3RhX2lkICVkXG4iLAogCQkJdGlkLCBjZmcuc3RhX2lkKTsKLQkJcmV0dXJuIC1FTk9TUEM7CisJCXJldHVybiBxdWV1ZTsKIAl9CiAKIAkvKgpAQCAtNzI4LDIxICs3NDMsMjMgQEAKIAlpZiAodXNpbmdfaW5hY3RpdmVfcXVldWUpIHsKIAkJc3RydWN0IGl3bF9zY2RfdHhxX2NmZ19jbWQgY21kID0gewogCQkJLnNjZF9xdWV1ZSA9IHF1ZXVlLAotCQkJLmVuYWJsZSA9IDAsCisJCQkuYWN0aW9uID0gU0NEX0NGR19ESVNBQkxFX1FVRVVFLAogCQl9OwotCQl1OCBhYzsKKwkJdTggdHhxX2N1cnJfYWM7CiAKIAkJZGlzYWJsZV9hZ2dfdGlkcyA9IGl3bF9tdm1fcmVtb3ZlX3N0YV9xdWV1ZV9tYXJraW5nKG12bSwgcXVldWUpOwogCiAJCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOwotCQlhYyA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0ubWFjODAyMTFfYWM7CisJCXR4cV9jdXJyX2FjID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5tYWM4MDIxMV9hYzsKIAkJY21kLnN0YV9pZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0ucmFfc3RhX2lkOwotCQljbWQudHhfZmlmbyA9IGl3bF9tdm1fYWNfdG9fdHhfZmlmb1thY107CisJCWNtZC50eF9maWZvID0gaXdsX212bV9hY190b190eF9maWZvW3R4cV9jdXJyX2FjXTsKKwkJY21kLnRpZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0udHhxX3RpZDsKIAkJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKIAogCQkvKiBEaXNhYmxlIHRoZSBxdWV1ZSAqLwotCQlpd2xfbXZtX2ludmFsaWRhdGVfc3RhX3F1ZXVlKG12bSwgcXVldWUsIGRpc2FibGVfYWdnX3RpZHMsCi0JCQkJCSAgICAgdHJ1ZSk7CisJCWlmIChkaXNhYmxlX2FnZ190aWRzKQorCQkJaXdsX212bV9pbnZhbGlkYXRlX3N0YV9xdWV1ZShtdm0sIHF1ZXVlLAorCQkJCQkJICAgICBkaXNhYmxlX2FnZ190aWRzLCBmYWxzZSk7CiAJCWl3bF90cmFuc190eHFfZGlzYWJsZShtdm0tPnRyYW5zLCBxdWV1ZSwgZmFsc2UpOwogCQlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIFNDRF9RVUVVRV9DRkcsIDAsIHNpemVvZihjbWQpLAogCQkJCQkgICAmY21kKTsKQEAgLTc1OCw2ICs3NzUsMTAgQEAKIAogCQkJcmV0dXJuIHJldDsKIAkJfQorCisJCS8qIElmIFRYUSBpcyBhbGxvY2F0ZWQgdG8gYW5vdGhlciBTVEEsIHVwZGF0ZSByZW1vdmFsIGluIEZXICovCisJCWlmIChjbWQuc3RhX2lkICE9IG12bXN0YS0+c3RhX2lkKQorCQkJaXdsX212bV9pbnZhbGlkYXRlX3N0YV9xdWV1ZShtdm0sIHF1ZXVlLCAwLCB0cnVlKTsKIAl9CiAKIAlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwKQEAgLTgyNyw2ICs4NDgsMTE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgaXdsX212bV9jaGFuZ2VfcXVldWVfb3duZXIoc3RydWN0IGl3bF9tdm0gKm12bSwgaW50IHF1ZXVlKQoreworCXN0cnVjdCBpd2xfc2NkX3R4cV9jZmdfY21kIGNtZCA9IHsKKwkJLnNjZF9xdWV1ZSA9IHF1ZXVlLAorCQkuYWN0aW9uID0gU0NEX0NGR19VUERBVEVfUVVFVUVfVElELAorCX07CisJczggc3RhX2lkOworCWludCB0aWQ7CisJdW5zaWduZWQgbG9uZyB0aWRfYml0bWFwOworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKKworCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCXN0YV9pZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0ucmFfc3RhX2lkOworCXRpZF9iaXRtYXAgPSBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnRpZF9iaXRtYXA7CisJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKworCWlmIChXQVJOKCF0aWRfYml0bWFwLCAiVFhRICVkIGhhcyBubyB0aWRzIGFzc2lnbmVkIHRvIGl0XG4iLCBxdWV1ZSkpCisJCXJldHVybjsKKworCS8qIEZpbmQgYW55IFRJRCBmb3IgcXVldWUgKi8KKwl0aWQgPSBmaW5kX2ZpcnN0X2JpdCgmdGlkX2JpdG1hcCwgSVdMX01BWF9USURfQ09VTlQgKyAxKTsKKwljbWQudGlkID0gdGlkOworCWNtZC50eF9maWZvID0gaXdsX212bV9hY190b190eF9maWZvW3RpZF90b19tYWM4MDIxMV9hY1t0aWRdXTsKKworCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgU0NEX1FVRVVFX0NGRywgMCwgc2l6ZW9mKGNtZCksICZjbWQpOworCWlmIChyZXQpCisJCUlXTF9FUlIobXZtLCAiRmFpbGVkIHRvIHVwZGF0ZSBvd25lciBvZiBUWFEgJWQgKHJldD0lZClcbiIsCisJCQlxdWV1ZSwgcmV0KTsKKwllbHNlCisJCUlXTF9ERUJVR19UWF9RVUVVRVMobXZtLCAiQ2hhbmdlZCBUWFEgJWQgb3duZXJzaGlwIHRvIHRpZCAlZFxuIiwKKwkJCQkgICAgcXVldWUsIHRpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGl3bF9tdm1fdW5zaGFyZV9xdWV1ZShzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgcXVldWUpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKKwlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKKwlzOCBzdGFfaWQ7CisJaW50IHRpZCA9IC0xOworCXVuc2lnbmVkIGxvbmcgdGlkX2JpdG1hcDsKKwl1bnNpZ25lZCBpbnQgd2RnX3RpbWVvdXQ7CisJaW50IHNzbjsKKwlpbnQgcmV0ID0gdHJ1ZTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOworCisJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJc3RhX2lkID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5yYV9zdGFfaWQ7CisJdGlkX2JpdG1hcCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0udGlkX2JpdG1hcDsKKwlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCisJLyogRmluZCBUSUQgZm9yIHF1ZXVlLCBhbmQgbWFrZSBzdXJlIGl0IGlzIHRoZSBvbmx5IG9uZSBvbiB0aGUgcXVldWUgKi8KKwl0aWQgPSBmaW5kX2ZpcnN0X2JpdCgmdGlkX2JpdG1hcCwgSVdMX01BWF9USURfQ09VTlQgKyAxKTsKKwlpZiAodGlkX2JpdG1hcCAhPSBCSVQodGlkKSkgeworCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byB1bnNoYXJlIHEgJWQsIGFjdGl2ZSB0aWRzPTB4JWx4XG4iLAorCQkJcXVldWUsIHRpZF9iaXRtYXApOworCQlyZXR1cm47CisJfQorCisJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sICJVbnNoYXJpbmcgVFhRICVkLCBrZWVwaW5nIHRpZCAlZFxuIiwgcXVldWUsCisJCQkgICAgdGlkKTsKKworCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobXZtLT5md19pZF90b19tYWNfaWRbc3RhX2lkXSwKKwkJCQkJbG9ja2RlcF9pc19oZWxkKCZtdm0tPm11dGV4KSk7CisKKwlpZiAoV0FSTl9PTl9PTkNFKElTX0VSUl9PUl9OVUxMKHN0YSkpKQorCQlyZXR1cm47CisKKwltdm1zdGEgPSBpd2xfbXZtX3N0YV9mcm9tX21hYzgwMjExKHN0YSk7CisJd2RnX3RpbWVvdXQgPSBpd2xfbXZtX2dldF93ZF90aW1lb3V0KG12bSwgbXZtc3RhLT52aWYsIGZhbHNlLCBmYWxzZSk7CisKKwlzc24gPSBJRUVFODAyMTFfU0VRX1RPX1NOKG12bXN0YS0+dGlkX2RhdGFbdGlkXS5zZXFfbnVtYmVyKTsKKworCXJldCA9IGl3bF9tdm1fc2NkX3F1ZXVlX3JlZGlyZWN0KG12bSwgcXVldWUsIHRpZCwKKwkJCQkJIHRpZF90b19tYWM4MDIxMV9hY1t0aWRdLCBzc24sCisJCQkJCSB3ZGdfdGltZW91dCwgdHJ1ZSk7CisJaWYgKHJldCkgeworCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byByZWRpcmVjdCBUWFEgJWRcbiIsIHF1ZXVlKTsKKwkJcmV0dXJuOworCX0KKworCS8qIElmIGFnZ3Mgc2hvdWxkIGJlIHR1cm5lZCBiYWNrIG9uIC0gZG8gaXQgKi8KKwlpZiAobXZtc3RhLT50aWRfZGF0YVt0aWRdLnN0YXRlID09IElXTF9BR0dfT04pIHsKKwkJc3RydWN0IGl3bF9tdm1fYWRkX3N0YV9jbWQgY21kID0gezB9OworCisJCW12bXN0YS0+dGlkX2Rpc2FibGVfYWdnICY9IH5CSVQodGlkKTsKKworCQljbWQubWFjX2lkX25fY29sb3IgPSBjcHVfdG9fbGUzMihtdm1zdGEtPm1hY19pZF9uX2NvbG9yKTsKKwkJY21kLnN0YV9pZCA9IG12bXN0YS0+c3RhX2lkOworCQljbWQuYWRkX21vZGlmeSA9IFNUQV9NT0RFX01PRElGWTsKKwkJY21kLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9USURfRElTQUJMRV9UWDsKKwkJY21kLnRmZF9xdWV1ZV9tc2sgPSBjcHVfdG9fbGUzMihtdm1zdGEtPnRmZF9xdWV1ZV9tc2spOworCQljbWQudGlkX2Rpc2FibGVfdHggPSBjcHVfdG9fbGUxNihtdm1zdGEtPnRpZF9kaXNhYmxlX2FnZyk7CisKKwkJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBBRERfU1RBLCBDTURfQVNZTkMsCisJCQkJCSAgIGl3bF9tdm1fYWRkX3N0YV9jbWRfc2l6ZShtdm0pLCAmY21kKTsKKwkJaWYgKCFyZXQpIHsKKwkJCUlXTF9ERUJVR19UWF9RVUVVRVMobXZtLAorCQkJCQkgICAgIlRYUSAjJWQgaXMgbm93IGFnZ3JlZ2F0ZWQgYWdhaW5cbiIsCisJCQkJCSAgICBxdWV1ZSk7CisKKwkJCS8qIE1hcmsgcXVldWUgaW50ZW5hbGx5IGFzIGFnZ3JlZ2F0aW5nIGFnYWluICovCisJCQlpd2xfdHJhbnNfdHhxX3NldF9zaGFyZWRfbW9kZShtdm0tPnRyYW5zLCBxdWV1ZSwgZmFsc2UpOworCQl9CisJfQorCisJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXMgPSBJV0xfTVZNX1FVRVVFX1JFQURZOworCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTggaXdsX212bV90aWRfdG9fYWNfcXVldWUoaW50IHRpZCkKIHsKIAlpZiAodGlkID09IElXTF9NQVhfVElEX0NPVU5UKQpAQCAtODk0LDEzICsxMDI4LDQyIEBACiAJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKIAlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKIAl1bnNpZ25lZCBsb25nIGRlZmVycmVkX3RpZF90cmFmZmljOwotCWludCBzdGFfaWQsIHRpZDsKKwlpbnQgcXVldWUsIHN0YV9pZCwgdGlkOwogCiAJLyogQ2hlY2sgaW5hY3Rpdml0eSBvZiBxdWV1ZXMgKi8KIAlpd2xfbXZtX2luYWN0aXZpdHlfY2hlY2sobXZtKTsKIAogCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwogCisJLyogUmVjb25maWd1cmUgcXVldWVzIHJlcXVpcmluZyByZWNvbmZpZ3VhdGlvbiAqLworCWZvciAocXVldWUgPSAwOyBxdWV1ZSA8IElXTF9NQVhfSFdfUVVFVUVTOyBxdWV1ZSsrKSB7CisJCWJvb2wgcmVjb25maWc7CisJCWJvb2wgY2hhbmdlX293bmVyOworCisJCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCQlyZWNvbmZpZyA9IChtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnN0YXR1cyA9PQorCQkJICAgIElXTF9NVk1fUVVFVUVfUkVDT05GSUdVUklORyk7CisKKwkJLyoKKwkJICogV2UgbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCBhIHNpdHVhdGlvbiBpbiB3aGljaCBhIFRYUSB3YXMKKwkJICogYWxsb2NhdGVkIHRvIFRJRCB4LCBhbmQgdGhlbiB0dXJuZWQgc2hhcmVkIGJ5IGFkZGluZyBUSURzIHkKKwkJICogYW5kIHouIElmIFRJRCB4IGJlY29tZXMgaW5hY3RpdmUgYW5kIGlzIHJlbW92ZWQgZnJvbSB0aGUgVFhRLAorCQkgKiBvd25lcnNoaXAgbXVzdCBiZSBnaXZlbiB0byBvbmUgb2YgdGhlIHJlbWFpbmluZyBUSURzLgorCQkgKiBUaGlzIGlzIG1haW5seSBiZWNhdXNlIGlmIFRJRCB4IGNvbnRpbnVlcyAtIGEgbmV3IHF1ZXVlIGNhbid0CisJCSAqIGJlIGFsbG9jYXRlZCBmb3IgaXQgYXMgbG9uZyBhcyBpdCBpcyBhbiBvd25lciBvZiBhbm90aGVyIFRYUS4KKwkJICovCisJCWNoYW5nZV9vd25lciA9ICEobXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS50aWRfYml0bWFwICYKKwkJCQkgQklUKG12bS0+cXVldWVfaW5mb1txdWV1ZV0udHhxX3RpZCkpICYmCisJCQkgICAgICAgKG12bS0+cXVldWVfaW5mb1txdWV1ZV0uc3RhdHVzID09CisJCQkJSVdMX01WTV9RVUVVRV9TSEFSRUQpOworCQlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCisJCWlmIChyZWNvbmZpZykKKwkJCWl3bF9tdm1fdW5zaGFyZV9xdWV1ZShtdm0sIHF1ZXVlKTsKKwkJZWxzZSBpZiAoY2hhbmdlX293bmVyKQorCQkJaXdsX212bV9jaGFuZ2VfcXVldWVfb3duZXIobXZtLCBxdWV1ZSk7CisJfQorCiAJLyogR28gb3ZlciBhbGwgc3RhdGlvbnMgd2l0aCBkZWZlcnJlZCB0cmFmZmljICovCiAJZm9yX2VhY2hfc2V0X2JpdChzdGFfaWQsIG12bS0+c3RhX2RlZmVycmVkX2ZyYW1lcywKIAkJCSBJV0xfTVZNX1NUQVRJT05fQ09VTlQpIHsKQEAgLTk2Myw2ICsxMTI2LDYxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBJbiBEUUEgbW9kZSwgYWZ0ZXIgYSBIVyByZXN0YXJ0IHRoZSBxdWV1ZXMgc2hvdWxkIGJlIGFsbG9jYXRlZCBhcyBiZWZvcmUsIGluCisgKiBvcmRlciB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2hlbiB0aGVyZSBhcmUgc2hhcmVkIHF1ZXVlcy4gVGhpcyBmdW5jdGlvbgorICogZG9lcyB0aGUgcmUtbWFwcGluZyBhbmQgcXVldWUgYWxsb2NhdGlvbi4KKyAqCisgKiBOb3RlIHRoYXQgcmUtZW5hYmxpbmcgYWdncmVnYXRpb25zIGlzbid0IGRvbmUgaW4gdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgaXdsX212bV9yZWFsbG9jX3F1ZXVlc19hZnRlcl9yZXN0YXJ0KHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJCQkgc3RydWN0IGl3bF9tdm1fc3RhICptdm1fc3RhKQoreworCXVuc2lnbmVkIGludCB3ZGdfdGltZW91dCA9CisJCQlpd2xfbXZtX2dldF93ZF90aW1lb3V0KG12bSwgbXZtX3N0YS0+dmlmLCBmYWxzZSwgZmFsc2UpOworCWludCBpOworCXN0cnVjdCBpd2xfdHJhbnNfdHhxX3NjZF9jZmcgY2ZnID0geworCQkuc3RhX2lkID0gbXZtX3N0YS0+c3RhX2lkLAorCQkuZnJhbWVfbGltaXQgPSBJV0xfRlJBTUVfTElNSVQsCisJfTsKKworCS8qIE1ha2Ugc3VyZSByZXNlcnZlZCBxdWV1ZSBpcyBzdGlsbCBtYXJrZWQgYXMgc3VjaCAob3IgYWxsb2NhdGVkKSAqLworCW12bS0+cXVldWVfaW5mb1ttdm1fc3RhLT5yZXNlcnZlZF9xdWV1ZV0uc3RhdHVzID0KKwkJSVdMX01WTV9RVUVVRV9SRVNFUlZFRDsKKworCWZvciAoaSA9IDA7IGkgPD0gSVdMX01BWF9USURfQ09VTlQ7IGkrKykgeworCQlzdHJ1Y3QgaXdsX212bV90aWRfZGF0YSAqdGlkX2RhdGEgPSAmbXZtX3N0YS0+dGlkX2RhdGFbaV07CisJCWludCB0eHFfaWQgPSB0aWRfZGF0YS0+dHhxX2lkOworCQlpbnQgYWM7CisJCXU4IG1hY19xdWV1ZTsKKworCQlpZiAodHhxX2lkID09IElFRUU4MDIxMV9JTlZBTF9IV19RVUVVRSkKKwkJCWNvbnRpbnVlOworCisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnRpZF9kYXRhLT5kZWZlcnJlZF90eF9mcmFtZXMpOworCisJCWFjID0gdGlkX3RvX21hYzgwMjExX2FjW2ldOworCQltYWNfcXVldWUgPSBtdm1fc3RhLT52aWYtPmh3X3F1ZXVlW2FjXTsKKworCQljZmcudGlkID0gaTsKKwkJY2ZnLmZpZm8gPSBpd2xfbXZtX2FjX3RvX3R4X2ZpZm9bYWNdOworCQljZmcuYWdncmVnYXRlID0gKHR4cV9pZCA+PSBJV0xfTVZNX0RRQV9NSU5fREFUQV9RVUVVRSB8fAorCQkJCSB0eHFfaWQgPT0gSVdMX01WTV9EUUFfQlNTX0NMSUVOVF9RVUVVRSk7CisKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sCisJCQkJICAgICJSZS1tYXBwaW5nIHN0YSAlZCB0aWQgJWQgdG8gcXVldWUgJWRcbiIsCisJCQkJICAgIG12bV9zdGEtPnN0YV9pZCwgaSwgdHhxX2lkKTsKKworCQlpd2xfbXZtX2VuYWJsZV90eHEobXZtLCB0eHFfaWQsIG1hY19xdWV1ZSwKKwkJCQkgICBJRUVFODAyMTFfU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKSwKKwkJCQkgICAmY2ZnLCB3ZGdfdGltZW91dCk7CisKKwkJbXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0uc3RhdHVzID0gSVdMX01WTV9RVUVVRV9SRUFEWTsKKwl9CisKKwlhdG9taWNfc2V0KCZtdm0tPnBlbmRpbmdfZnJhbWVzW212bV9zdGEtPnN0YV9pZF0sIDApOworfQorCiBpbnQgaXdsX212bV9hZGRfc3RhKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKQEAgLTk4NSw2ICsxMjAzLDEzIEBACiAKIAlzcGluX2xvY2tfaW5pdCgmbXZtX3N0YS0+bG9jayk7CiAKKwkvKiBJbiBEUUEgbW9kZSwgaWYgdGhpcyBpcyBhIEhXIHJlc3RhcnQsIHJlLWFsbG9jIGV4aXN0aW5nIHF1ZXVlcyAqLworCWlmIChpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSAmJgorCSAgICB0ZXN0X2JpdChJV0xfTVZNX1NUQVRVU19JTl9IV19SRVNUQVJULCAmbXZtLT5zdGF0dXMpKSB7CisJCWl3bF9tdm1fcmVhbGxvY19xdWV1ZXNfYWZ0ZXJfcmVzdGFydChtdm0sIG12bV9zdGEpOworCQlnb3RvIHVwZGF0ZV9mdzsKKwl9CisKIAltdm1fc3RhLT5zdGFfaWQgPSBzdGFfaWQ7CiAJbXZtX3N0YS0+bWFjX2lkX25fY29sb3IgPSBGV19DTURfSURfQU5EX0NPTE9SKG12bXZpZi0+aWQsCiAJCQkJCQkgICAgICBtdm12aWYtPmNvbG9yKTsKQEAgLTEwNDgsNiArMTI3Myw3IEBACiAJCQlnb3RvIGVycjsKIAl9CiAKK3VwZGF0ZV9mdzoKIAlyZXQgPSBpd2xfbXZtX3N0YV9zZW5kX3RvX2Z3KG12bSwgc3RhLCBmYWxzZSwgMCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnI7CkBAIC0xMDcxLDEzICsxMjk3LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgaXdsX212bV91cGRhdGVfc3RhKHN0cnVjdCBpd2xfbXZtICptdm0sCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlyZXR1cm4gaXdsX212bV9zdGFfc2VuZF90b19mdyhtdm0sIHN0YSwgdHJ1ZSwgMCk7Ci19Ci0KIGludCBpd2xfbXZtX2RyYWluX3N0YShzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YSwKIAkJICAgICAgYm9vbCBkcmFpbikKIHsKQEAgLTEyNzAsOSArMTQ4OSwzMSBAQAogCQlyZXQgPSBpd2xfbXZtX2RyYWluX3N0YShtdm0sIG12bV9zdGEsIGZhbHNlKTsKIAogCQkvKiBJZiBEUUEgaXMgc3VwcG9ydGVkIC0gdGhlIHF1ZXVlcyBjYW4gYmUgZGlzYWJsZWQgbm93ICovCi0JCWlmIChpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSkKKwkJaWYgKGl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pKSB7CisJCQl1OCByZXNlcnZlZF90eHEgPSBtdm1fc3RhLT5yZXNlcnZlZF9xdWV1ZTsKKwkJCWVudW0gaXdsX212bV9xdWV1ZV9zdGF0dXMgKnN0YXR1czsKKwogCQkJaXdsX212bV9kaXNhYmxlX3N0YV9xdWV1ZXMobXZtLCB2aWYsIG12bV9zdGEpOwogCisJCQkvKgorCQkJICogSWYgbm8gdHJhZmZpYyBoYXMgZ29uZSB0aHJvdWdoIHRoZSByZXNlcnZlZCBUWFEgLSBpdAorCQkJICogaXMgc3RpbGwgbWFya2VkIGFzIElXTF9NVk1fUVVFVUVfUkVTRVJWRUQsIGFuZAorCQkJICogc2hvdWxkIGJlIG1hbnVhbGx5IG1hcmtlZCBhcyBmcmVlIGFnYWluCisJCQkgKi8KKwkJCXNwaW5fbG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCQkJc3RhdHVzID0gJm12bS0+cXVldWVfaW5mb1tyZXNlcnZlZF90eHFdLnN0YXR1czsKKwkJCWlmIChXQVJOKCgqc3RhdHVzICE9IElXTF9NVk1fUVVFVUVfUkVTRVJWRUQpICYmCisJCQkJICgqc3RhdHVzICE9IElXTF9NVk1fUVVFVUVfRlJFRSksCisJCQkJICJzdGFfaWQgJWQgcmVzZXJ2ZWQgdHhxICVkIHN0YXR1cyAlZCIsCisJCQkJIG12bV9zdGEtPnN0YV9pZCwgcmVzZXJ2ZWRfdHhxLCAqc3RhdHVzKSkgeworCQkJCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCSpzdGF0dXMgPSBJV0xfTVZNX1FVRVVFX0ZSRUU7CisJCQlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOworCQl9CisKIAkJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCiAJCSAgICBtdm12aWYtPmFwX3N0YV9pZCA9PSBtdm1fc3RhLT5zdGFfaWQpIHsKIAkJCS8qIGlmIGFzc29jaWF0ZWQgLSB3ZSBjYW4ndCByZW1vdmUgdGhlIEFQIFNUQSBub3cgKi8KQEAgLTE4MDIsMTEgKzIwNDMsOSBAQAogCQliYWlkX2RhdGEtPmJhaWQgPSBiYWlkOwogCQliYWlkX2RhdGEtPnRpbWVvdXQgPSB0aW1lb3V0OwogCQliYWlkX2RhdGEtPmxhc3RfcnggPSBqaWZmaWVzOwotCQlpbml0X3RpbWVyKCZiYWlkX2RhdGEtPnNlc3Npb25fdGltZXIpOwotCQliYWlkX2RhdGEtPnNlc3Npb25fdGltZXIuZnVuY3Rpb24gPQotCQkJaXdsX212bV9yeF9hZ2dfc2Vzc2lvbl9leHBpcmVkOwotCQliYWlkX2RhdGEtPnNlc3Npb25fdGltZXIuZGF0YSA9Ci0JCQkodW5zaWduZWQgbG9uZykmbXZtLT5iYWlkX21hcFtiYWlkXTsKKwkJc2V0dXBfdGltZXIoJmJhaWRfZGF0YS0+c2Vzc2lvbl90aW1lciwKKwkJCSAgICBpd2xfbXZtX3J4X2FnZ19zZXNzaW9uX2V4cGlyZWQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpJm12bS0+YmFpZF9tYXBbYmFpZF0pOwogCQliYWlkX2RhdGEtPm12bSA9IG12bTsKIAkJYmFpZF9kYXRhLT50aWQgPSB0aWQ7CiAJCWJhaWRfZGF0YS0+c3RhX2lkID0gbXZtX3N0YS0+c3RhX2lkOwpAQCAtMTk1Niw3ICsyMTk1LDcgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJc3Bpbl9sb2NrKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAKIAkvKgogCSAqIE5vdGUgdGhlIHBvc3NpYmxlIGNhc2VzOgpAQCAtMTk2NywxNCArMjIwNiwyMCBAQAogCSAqCW5vbi1EUUEgbW9kZSwgc2luY2UgdGhlIFRYUSBoYXNuJ3QgeWV0IGJlZW4gYWxsb2NhdGVkCiAJICovCiAJdHhxX2lkID0gbXZtc3RhLT50aWRfZGF0YVt0aWRdLnR4cV9pZDsKLQlpZiAoIWl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pIHx8CisJaWYgKGl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pICYmCisJICAgIHVubGlrZWx5KG12bS0+cXVldWVfaW5mb1t0eHFfaWRdLnN0YXR1cyA9PSBJV0xfTVZNX1FVRVVFX1NIQVJFRCkpIHsKKwkJcmV0ID0gLUVOWElPOworCQlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwKKwkJCQkgICAgIkNhbid0IHN0YXJ0IHRpZCAlZCBhZ2cgb24gc2hhcmVkIHF1ZXVlIVxuIiwKKwkJCQkgICAgdGlkKTsKKwkJZ290byByZWxlYXNlX2xvY2tzOworCX0gZWxzZSBpZiAoIWl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pIHx8CiAJICAgIG12bS0+cXVldWVfaW5mb1t0eHFfaWRdLnN0YXR1cyAhPSBJV0xfTVZNX1FVRVVFX1JFQURZKSB7CiAJCXR4cV9pZCA9IGl3bF9tdm1fZmluZF9mcmVlX3F1ZXVlKG12bSwgbXZtc3RhLT5zdGFfaWQsCiAJCQkJCQkgbXZtLT5maXJzdF9hZ2dfcXVldWUsCiAJCQkJCQkgbXZtLT5sYXN0X2FnZ19xdWV1ZSk7CiAJCWlmICh0eHFfaWQgPCAwKSB7CiAJCQlyZXQgPSB0eHFfaWQ7Ci0JCQlzcGluX3VubG9ja19iaCgmbXZtLT5xdWV1ZV9pbmZvX2xvY2spOwogCQkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gYWxsb2NhdGUgYWdnIHF1ZXVlXG4iKTsKIAkJCWdvdG8gcmVsZWFzZV9sb2NrczsKIAkJfQpAQCAtMTk4Miw3ICsyMjI3LDggQEAKIAkJLyogVFhRIGhhc24ndCB5ZXQgYmVlbiBlbmFibGVkLCBzbyBtYXJrIGl0IG9ubHkgYXMgcmVzZXJ2ZWQgKi8KIAkJbXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0uc3RhdHVzID0gSVdMX01WTV9RVUVVRV9SRVNFUlZFRDsKIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKworCXNwaW5fdW5sb2NrKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAKIAlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwKIAkJCSAgICAiQUdHIGZvciB0aWQgJWQgd2lsbCBiZSBvbiBxdWV1ZSAjJWRcbiIsCkBAIC0yMDA2LDggKzIyNTIsMTEgQEAKIAl9CiAKIAlyZXQgPSAwOworCWdvdG8gb3V0OwogCiByZWxlYXNlX2xvY2tzOgorCXNwaW5fdW5sb2NrKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CitvdXQ6CiAJc3Bpbl91bmxvY2tfYmgoJm12bXN0YS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjAyMyw2ICsyMjcyLDcgQEAKIAkJaXdsX212bV9nZXRfd2RfdGltZW91dChtdm0sIHZpZiwgc3RhLT50ZGxzLCBmYWxzZSk7CiAJaW50IHF1ZXVlLCByZXQ7CiAJYm9vbCBhbGxvY19xdWV1ZSA9IHRydWU7CisJZW51bSBpd2xfbXZtX3F1ZXVlX3N0YXR1cyBxdWV1ZV9zdGF0dXM7CiAJdTE2IHNzbjsKIAogCXN0cnVjdCBpd2xfdHJhbnNfdHhxX3NjZF9jZmcgY2ZnID0gewpAQCAtMjA0OCwxMyArMjI5OCwxNSBAQAogCiAJY2ZnLmZpZm8gPSBpd2xfbXZtX2FjX3RvX3R4X2ZpZm9bdGlkX3RvX21hYzgwMjExX2FjW3RpZF1dOwogCisJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CisJcXVldWVfc3RhdHVzID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXM7CisJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKKwogCS8qIEluIERRQSBtb2RlLCB0aGUgZXhpc3RpbmcgcXVldWUgbWlnaHQgbmVlZCB0byBiZSByZWNvbmZpZ3VyZWQgKi8KIAlpZiAoaXdsX212bV9pc19kcWFfc3VwcG9ydGVkKG12bSkpIHsKLQkJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAJCS8qIE1heWJlIHRoZXJlIGlzIG5vIG5lZWQgdG8gZXZlbiBhbGxvYyBhIHF1ZXVlLi4uICovCiAJCWlmIChtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnN0YXR1cyA9PSBJV0xfTVZNX1FVRVVFX1JFQURZKQogCQkJYWxsb2NfcXVldWUgPSBmYWxzZTsKLQkJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKIAogCQkvKgogCQkgKiBPbmx5IHJlY29uZmlnIHRoZSBTQ0QgZm9yIHRoZSBxdWV1ZSBpZiB0aGUgd2luZG93IHNpemUgaGFzCkBAIC0yMDg5LDkgKzIzNDEsMTIgQEAKIAkJCQkgICB2aWYtPmh3X3F1ZXVlW3RpZF90b19tYWM4MDIxMV9hY1t0aWRdXSwgc3NuLAogCQkJCSAgICZjZmcsIHdkZ190aW1lb3V0KTsKIAotCXJldCA9IGl3bF9tdm1fc3RhX3R4X2FnZyhtdm0sIHN0YSwgdGlkLCBxdWV1ZSwgdHJ1ZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87CisJLyogU2VuZCBBRERfU1RBIGNvbW1hbmQgdG8gZW5hYmxlIGFnZ3Mgb25seSBpZiB0aGUgcXVldWUgaXNuJ3Qgc2hhcmVkICovCisJaWYgKHF1ZXVlX3N0YXR1cyAhPSBJV0xfTVZNX1FVRVVFX1NIQVJFRCkgeworCQlyZXQgPSBpd2xfbXZtX3N0YV90eF9hZ2cobXZtLCBzdGEsIHRpZCwgcXVldWUsIHRydWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC1FSU87CisJfQogCiAJLyogTm8gbmVlZCB0byBtYXJrIGFzIHJlc2VydmVkICovCiAJc3Bpbl9sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CkBAIC0yMTIzLDcgKzIzNzgsNiBAQAogCXUxNiB0eHFfaWQ7CiAJaW50IGVycjsKIAotCiAJLyoKIAkgKiBJZiBtYWM4MDIxMSBpcyBjbGVhbmluZyBpdHMgc3RhdGUsIHRoZW4gc2F5IHRoYXQgd2UgZmluaXNoZWQgc2luY2UKIAkgKiBvdXIgc3RhdGUgaGFzIGJlZW4gY2xlYXJlZCBhbnl3YXkuCkBAIC0yMTUyLDYgKzI0MDYsNyBAQAogCSAqLwogCWlmIChtdm0tPnF1ZXVlX2luZm9bdHhxX2lkXS5zdGF0dXMgPT0gSVdMX01WTV9RVUVVRV9SRVNFUlZFRCkKIAkJbXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0uc3RhdHVzID0gSVdMX01WTV9RVUVVRV9GUkVFOworCiAJc3Bpbl91bmxvY2tfYmgoJm12bS0+cXVldWVfaW5mb19sb2NrKTsKIAogCXN3aXRjaCAodGlkX2RhdGEtPnN0YXRlKSB7CkBAIC0yNDEyLDkgKzI2NjcsMTUgQEAKIAlzdHJ1Y3QgaXdsX212bV9tZ210X21jYXN0X2tleV9jbWQgaWd0a19jbWQgPSB7fTsKIAogCS8qIHZlcmlmeSB0aGUga2V5IGRldGFpbHMgbWF0Y2ggdGhlIHJlcXVpcmVkIGNvbW1hbmQncyBleHBlY3RhdGlvbnMgKi8KLQlpZiAoV0FSTl9PTigoa2V5Y29uZi0+Y2lwaGVyICE9IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDKSB8fAotCQkgICAgKGtleWNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKSB8fAotCQkgICAgKGtleWNvbmYtPmtleWlkeCAhPSA0ICYmIGtleWNvbmYtPmtleWlkeCAhPSA1KSkpCisJaWYgKFdBUk5fT04oKGtleWNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKSB8fAorCQkgICAgKGtleWNvbmYtPmtleWlkeCAhPSA0ICYmIGtleWNvbmYtPmtleWlkeCAhPSA1KSB8fAorCQkgICAgKGtleWNvbmYtPmNpcGhlciAhPSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQyAmJgorCQkgICAgIGtleWNvbmYtPmNpcGhlciAhPSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18xMjggJiYKKwkJICAgICBrZXljb25mLT5jaXBoZXIgIT0gV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMjU2KSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKFdBUk5fT04oIWl3bF9tdm1faGFzX25ld19yeF9hcGkobXZtKSAmJgorCQkgICAga2V5Y29uZi0+Y2lwaGVyICE9IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZ3RrX2NtZC5rZXlfaWQgPSBjcHVfdG9fbGUzMihrZXljb25mLT5rZXlpZHgpOwpAQCAtMjQzMCwxMSArMjY5MSwxOCBAQAogCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDOgogCQkJaWd0a19jbWQuY3RybF9mbGFncyB8PSBjcHVfdG9fbGUzMihTVEFfS0VZX0ZMR19DQ00pOwogCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMTI4OgorCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzI1NjoKKwkJCWlndGtfY21kLmN0cmxfZmxhZ3MgfD0gY3B1X3RvX2xlMzIoU1RBX0tFWV9GTEdfR0NNUCk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJbWVtY3B5KGlndGtfY21kLklHVEssIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKKwkJbWVtY3B5KGlndGtfY21kLmlndGssIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKKwkJaWYgKGtleWNvbmYtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18yNTYpCisJCQlpZ3RrX2NtZC5jdHJsX2ZsYWdzIHw9CisJCQkJY3B1X3RvX2xlMzIoU1RBX0tFWV9GTEdfS0VZXzMyQllURVMpOwogCQlpZWVlODAyMTFfZ2V0X2tleV9yeF9zZXEoa2V5Y29uZiwgMCwgJnNlcSk7CiAJCXBuID0gc2VxLmFlc19jbWFjLnBuOwogCQlpZ3RrX2NtZC5yZWNlaXZlX3NlcV9jbnQgPSBjcHVfdG9fbGU2NCgoKHU2NCkgcG5bNV0gPDwgMCkgfApAQCAtMjQ0OSw2ICsyNzE3LDE5IEBACiAJCSAgICAgICByZW1vdmVfa2V5ID8gInJlbW92aW5nIiA6ICJpbnN0YWxsaW5nIiwKIAkJICAgICAgIGlndGtfY21kLnN0YV9pZCk7CiAKKwlpZiAoIWl3bF9tdm1faGFzX25ld19yeF9hcGkobXZtKSkgeworCQlzdHJ1Y3QgaXdsX212bV9tZ210X21jYXN0X2tleV9jbWRfdjEgaWd0a19jbWRfdjEgPSB7CisJCQkuY3RybF9mbGFncyA9IGlndGtfY21kLmN0cmxfZmxhZ3MsCisJCQkua2V5X2lkID0gaWd0a19jbWQua2V5X2lkLAorCQkJLnN0YV9pZCA9IGlndGtfY21kLnN0YV9pZCwKKwkJCS5yZWNlaXZlX3NlcV9jbnQgPSBpZ3RrX2NtZC5yZWNlaXZlX3NlcV9jbnQKKwkJfTsKKworCQltZW1jcHkoaWd0a19jbWRfdjEuaWd0aywgaWd0a19jbWQuaWd0aywKKwkJICAgICAgIEFSUkFZX1NJWkUoaWd0a19jbWRfdjEuaWd0aykpOworCQlyZXR1cm4gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBNR01UX01DQVNUX0tFWSwgMCwKKwkJCQkJICAgIHNpemVvZihpZ3RrX2NtZF92MSksICZpZ3RrX2NtZF92MSk7CisJfQogCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIE1HTVRfTUNBU1RfS0VZLCAwLAogCQkJCSAgICBzaXplb2YoaWd0a19jbWQpLCAmaWd0a19jbWQpOwogfQpAQCAtMjU3Myw3ICsyODU0LDkgQEAKIAl9CiAJc3RhX2lkID0gbXZtX3N0YS0+c3RhX2lkOwogCi0JaWYgKGtleWNvbmYtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQykgeworCWlmIChrZXljb25mLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUMgfHwKKwkgICAga2V5Y29uZi0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzEyOCB8fAorCSAgICBrZXljb25mLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQklQX0dNQUNfMjU2KSB7CiAJCXJldCA9IGl3bF9tdm1fc2VuZF9zdGFfaWd0ayhtdm0sIGtleWNvbmYsIHN0YV9pZCwgZmFsc2UpOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0yNjU5LDcgKzI5NDIsOSBAQAogCUlXTF9ERUJVR19XRVAobXZtLCAibXZtIHJlbW92ZSBkeW5hbWljIGtleTogaWR4PSVkIHN0YT0lZFxuIiwKIAkJICAgICAga2V5Y29uZi0+a2V5aWR4LCBzdGFfaWQpOwogCi0JaWYgKGtleWNvbmYtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQykKKwlpZiAoa2V5Y29uZi0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDIHx8CisJICAgIGtleWNvbmYtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9CSVBfR01BQ18xMjggfHwKKwkgICAga2V5Y29uZi0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX0JJUF9HTUFDXzI1NikKIAkJcmV0dXJuIGl3bF9tdm1fc2VuZF9zdGFfaWd0ayhtdm0sIGtleWNvbmYsIHN0YV9pZCwgdHJ1ZSk7CiAKIAlpZiAoIV9fdGVzdF9hbmRfY2xlYXJfYml0KGtleWNvbmYtPmh3X2tleV9pZHgsIG12bS0+Zndfa2V5X3RhYmxlKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vc3RhLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuaAppbmRleCBiYmMxY2FiLi5lMDY4ZDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS9zdGEuaApAQCAtNDczLDkgKzQ3MywxNCBAQAogaW50IGl3bF9tdm1fYWRkX3N0YShzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwotaW50IGl3bF9tdm1fdXBkYXRlX3N0YShzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOworCitzdGF0aWMgaW5saW5lIGludCBpd2xfbXZtX3VwZGF0ZV9zdGEoc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXJldHVybiBpd2xfbXZtX3N0YV9zZW5kX3RvX2Z3KG12bSwgc3RhLCB0cnVlLCAwKTsKK30KKwogaW50IGl3bF9tdm1fcm1fc3RhKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwpAQCAtNTU0LDQgKzU1OSw4IEBACiB2b2lkIGl3bF9tdm1fY3NhX2NsaWVudF9hYnNlbnQoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CiB2b2lkIGl3bF9tdm1fYWRkX25ld19kcWFfc3RyZWFtX3drKHN0cnVjdCB3b3JrX3N0cnVjdCAqd2spOwogCitpbnQgaXdsX212bV9zY2RfcXVldWVfcmVkaXJlY3Qoc3RydWN0IGl3bF9tdm0gKm12bSwgaW50IHF1ZXVlLCBpbnQgdGlkLAorCQkJICAgICAgIGludCBhYywgaW50IHNzbiwgdW5zaWduZWQgaW50IHdkZ190aW1lb3V0LAorCQkJICAgICAgIGJvb2wgZm9yY2UpOworCiAjZW5kaWYgLyogX19zdGFfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS90dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vdHQuYwppbmRleCA1OGZjN2IzLi42M2EwNTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS90dC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3R0LmMKQEAgLTI0MSwxMSArMjQxLDggQEAKIAl9OwogCXUzMiBjbWRpZDsKIAotCWlmIChmd19oYXNfYXBpKCZtdm0tPmZ3LT51Y29kZV9jYXBhLCBJV0xfVUNPREVfVExWX0FQSV9XSURFX0NNRF9IRFIpKQotCQljbWRpZCA9IGl3bF9jbWRfaWQoQ01EX0RUU19NRUFTVVJFTUVOVF9UUklHR0VSX1dJREUsCi0JCQkJICAgUEhZX09QU19HUk9VUCwgMCk7Ci0JZWxzZQotCQljbWRpZCA9IENNRF9EVFNfTUVBU1VSRU1FTlRfVFJJR0dFUjsKKwljbWRpZCA9IGl3bF9jbWRfaWQoQ01EX0RUU19NRUFTVVJFTUVOVF9UUklHR0VSX1dJREUsCisJCQkgICBQSFlfT1BTX0dST1VQLCAwKTsKIAogCWlmICghZndfaGFzX2NhcGEoJm12bS0+ZnctPnVjb2RlX2NhcGEsCiAJCQkgSVdMX1VDT0RFX1RMVl9DQVBBX0VYVEVOREVEX0RUU19NRUFTVVJFKSkKQEAgLTI2MSw5ICsyNTgsNiBAQAogCQkJCQkgICAgRFRTX01FQVNVUkVNRU5UX05PVElGX1dJREUpIH07CiAJaW50IHJldDsKIAotCWlmICghZndfaGFzX2FwaSgmbXZtLT5mdy0+dWNvZGVfY2FwYSwgSVdMX1VDT0RFX1RMVl9BUElfV0lERV9DTURfSERSKSkKLQkJdGVtcF9ub3RpZlswXSA9IERUU19NRUFTVVJFTUVOVF9OT1RJRklDQVRJT047Ci0KIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKIAogCWl3bF9pbml0X25vdGlmaWNhdGlvbl93YWl0KCZtdm0tPm5vdGlmX3dhaXQsICZ3YWl0X3RlbXBfbm90aWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vdHguYwppbmRleCBjNjU4NWFiLi42Njk1N2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3R4LmMKQEAgLTM0Niw3ICszNDYsNyBAQAogCiAJcmF0ZV9pZHggPSBpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeDsKIAkvKiBpZiB0aGUgcmF0ZSBpc24ndCBhIHdlbGwga25vd24gbGVnYWN5IHJhdGUsIHRha2UgdGhlIGxvd2VzdCBvbmUgKi8KLQlpZiAocmF0ZV9pZHggPCAwIHx8IHJhdGVfaWR4ID4gSVdMX1JBVEVfQ09VTlRfTEVHQUNZKQorCWlmIChyYXRlX2lkeCA8IDAgfHwgcmF0ZV9pZHggPj0gSVdMX1JBVEVfQ09VTlRfTEVHQUNZKQogCQlyYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KAogCQkJCSZtdm0tPm52bV9kYXRhLT5iYW5kc1tpbmZvLT5iYW5kXSwgc3RhKTsKIApAQCAtNDQxLDcgKzQ0MSw3IEBACiAJCSAqIG9uZS4KIAkJICogTmVlZCB0byBoYW5kbGUgdGhpcy4KIAkJICovCi0JCXR4X2NtZC0+c2VjX2N0bCB8PSBUWF9DTURfU0VDX0dDTVAgfCBUQ19DTURfU0VDX0tFWV9GUk9NX1RBQkxFOworCQl0eF9jbWQtPnNlY19jdGwgfD0gVFhfQ01EX1NFQ19HQ01QIHwgVFhfQ01EX1NFQ19LRVlfRlJPTV9UQUJMRTsKIAkJdHhfY21kLT5rZXlbMF0gPSBrZXljb25mLT5od19rZXlfaWR4OwogCQlpd2xfbXZtX3NldF90eF9jbWRfcG4oaW5mbywgY3J5cHRvX2hkcik7CiAJCWJyZWFrOwpAQCAtNDkwLDE2ICs0OTAsMzQgQEAKIHN0YXRpYyBpbnQgaXdsX212bV9nZXRfY3RybF92aWZfcXVldWUoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sIF9fbGUxNiBmYykKIHsKLQlpZiAoaXdsX212bV9pc19kcWFfc3VwcG9ydGVkKG12bSkpIHsKLQkJaWYgKGluZm8tPmNvbnRyb2wudmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQICYmCi0JCSAgICBpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpCi0JCQlyZXR1cm4gSVdMX01WTV9EUUFfQVBfUFJPQkVfUkVTUF9RVUVVRTsKLQkJZWxzZSBpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpICYmCi0JCQkgaW5mby0+Y29udHJvbC52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSkKLQkJCXJldHVybiBJV0xfTVZNX0RRQV9QMlBfREVWSUNFX1FVRVVFOwotCX0KKwlpZiAoIWl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pKQorCQlyZXR1cm4gaW5mby0+aHdfcXVldWU7CiAKLQlyZXR1cm4gaW5mby0+aHdfcXVldWU7CisJc3dpdGNoIChpbmZvLT5jb250cm9sLnZpZi0+dHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CisJCS8qCisJCSAqIGhhbmRsZSBsZWdhY3kgaG9zdGFwZCBhcyB3ZWxsLCB3aGVyZSBzdGF0aW9uIG1heSBiZSBhZGRlZAorCQkgKiBvbmx5IGFmdGVyIGFzc29jLgorCQkgKi8KKwkJaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSB8fCBpZWVlODAyMTFfaXNfYXV0aChmYykpCisJCQlyZXR1cm4gSVdMX01WTV9EUUFfQVBfUFJPQkVfUkVTUF9RVUVVRTsKKwkJaWYgKGluZm8tPmh3X3F1ZXVlID09IGluZm8tPmNvbnRyb2wudmlmLT5jYWJfcXVldWUpCisJCQlyZXR1cm4gaW5mby0+aHdfcXVldWU7CisKKwkJV0FSTl9PTl9PTkNFKDEpOworCQlyZXR1cm4gSVdMX01WTV9EUUFfQVBfUFJPQkVfUkVTUF9RVUVVRTsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CisJCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpCisJCQlyZXR1cm4gSVdMX01WTV9EUUFfUDJQX0RFVklDRV9RVUVVRTsKKwkJaWYgKGluZm8tPmh3X3F1ZXVlID09IGluZm8tPmNvbnRyb2wudmlmLT5jYWJfcXVldWUpCisJCQlyZXR1cm4gaW5mby0+aHdfcXVldWU7CisKKwkJV0FSTl9PTl9PTkNFKDEpOworCQlyZXR1cm4gSVdMX01WTV9EUUFfUDJQX0RFVklDRV9RVUVVRTsKKwlkZWZhdWx0OgorCQlXQVJOX09OQ0UoMSwgIk5vdCBhIGN0cmwgdmlmLCBubyBhdmFpbGFibGUgcXVldWVcbiIpOworCQlyZXR1cm4gLTE7CisJfQogfQogCiBpbnQgaXdsX212bV90eF9za2Jfbm9uX3N0YShzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtNTEzLDYgKzUzMSwxNSBAQAogCWludCBoZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCk7CiAJaW50IHF1ZXVlOwogCisJLyogSVdMX01WTV9PRkZDSEFOTkVMX1FVRVVFIGlzIHVzZWQgZm9yIFJPQyBwYWNrZXRzIHRoYXQgY2FuIGJlIHVzZWQKKwkgKiBpbiAyIGRpZmZlcmVudCB0eXBlcyBvZiB2aWZzLCBQMlAgJiBTVEFUSU9OLiBQMlAgdXNlcyB0aGUgb2ZmY2hhbm5lbAorCSAqIHF1ZXVlLiBTVEFUSU9OIChIUzIuMCkgdXNlcyB0aGUgYXV4aWxpYXJ5IGNvbnRleHQgb2YgdGhlIEZXLAorCSAqIGFuZCBoZW5jZSBuZWVkcyB0byBiZSBzZW50IG9uIHRoZSBhdXggcXVldWUKKwkgKi8KKwlpZiAoSUVFRTgwMjExX1NLQl9DQihza2IpLT5od19xdWV1ZSA9PSBJV0xfTVZNX09GRkNIQU5ORUxfUVVFVUUgJiYKKwkgICAgc2tiX2luZm8tPmNvbnRyb2wudmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCUlFRUU4MDIxMV9TS0JfQ0Ioc2tiKS0+aHdfcXVldWUgPSBtdm0tPmF1eF9xdWV1ZTsKKwogCW1lbWNweSgmaW5mbywgc2tiLT5jYiwgc2l6ZW9mKGluZm8pKTsKIAogCWlmIChXQVJOX09OX09OQ0UoaW5mby5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpKQpAQCAtNTI2LDE2ICs1NTMsNiBAQAogCS8qIFRoaXMgaG9sZHMgdGhlIGFtc2R1IGhlYWRlcnMgbGVuZ3RoICovCiAJc2tiX2luZm8tPmRyaXZlcl9kYXRhWzBdID0gKHZvaWQgKikodWludHB0cl90KTA7CiAKLQkvKgotCSAqIElXTF9NVk1fT0ZGQ0hBTk5FTF9RVUVVRSBpcyB1c2VkIGZvciBST0MgcGFja2V0cyB0aGF0IGNhbiBiZSB1c2VkCi0JICogaW4gMiBkaWZmZXJlbnQgdHlwZXMgb2YgdmlmcywgUDJQICYgU1RBVElPTi4gUDJQIHVzZXMgdGhlIG9mZmNoYW5uZWwKLQkgKiBxdWV1ZS4gU1RBVElPTiAoSFMyLjApIHVzZXMgdGhlIGF1eGlsaWFyeSBjb250ZXh0IG9mIHRoZSBGVywKLQkgKiBhbmQgaGVuY2UgbmVlZHMgdG8gYmUgc2VudCBvbiB0aGUgYXV4IHF1ZXVlCi0JICovCi0JaWYgKElFRUU4MDIxMV9TS0JfQ0Ioc2tiKS0+aHdfcXVldWUgPT0gSVdMX01WTV9PRkZDSEFOTkVMX1FVRVVFICYmCi0JICAgIGluZm8uY29udHJvbC52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKLQkJSUVFRTgwMjExX1NLQl9DQihza2IpLT5od19xdWV1ZSA9IG12bS0+YXV4X3F1ZXVlOwotCiAJcXVldWUgPSBpbmZvLmh3X3F1ZXVlOwogCiAJLyoKQEAgLTU2MCw2ICs1NzcsOSBAQAogCQkJc3RhX2lkID0gbXZtdmlmLT5iY2FzdF9zdGEuc3RhX2lkOwogCQkJcXVldWUgPSBpd2xfbXZtX2dldF9jdHJsX3ZpZl9xdWV1ZShtdm0sICZpbmZvLAogCQkJCQkJCSAgIGhkci0+ZnJhbWVfY29udHJvbCk7CisJCQlpZiAocXVldWUgPCAwKQorCQkJCXJldHVybiAtMTsKKwogCQl9IGVsc2UgaWYgKGluZm8uY29udHJvbC52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgogCQkJICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpIHsKIAkJCXU4IGFwX3N0YV9pZCA9IEFDQ0VTU19PTkNFKG12bXZpZi0+YXBfc3RhX2lkKTsKQEAgLTgzOCw2ICs4NTgsMjIgQEAKIAl9CiB9CiAKKy8qIENoZWNrIGlmIHRoZXJlIGFyZSBhbnkgdGltZWQtb3V0IFRJRHMgb24gYSBnaXZlbiBzaGFyZWQgVFhRICovCitzdGF0aWMgYm9vbCBpd2xfbXZtX3R4cV9zaG91bGRfdXBkYXRlKHN0cnVjdCBpd2xfbXZtICptdm0sIGludCB0eHFfaWQpCit7CisJdW5zaWduZWQgbG9uZyBxdWV1ZV90aWRfYml0bWFwID0gbXZtLT5xdWV1ZV9pbmZvW3R4cV9pZF0udGlkX2JpdG1hcDsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJaW50IHRpZDsKKworCWZvcl9lYWNoX3NldF9iaXQodGlkLCAmcXVldWVfdGlkX2JpdG1hcCwgSVdMX01BWF9USURfQ09VTlQgKyAxKSB7CisJCWlmICh0aW1lX2JlZm9yZShtdm0tPnF1ZXVlX2luZm9bdHhxX2lkXS5sYXN0X2ZyYW1lX3RpbWVbdGlkXSArCisJCQkJSVdMX01WTV9EUUFfUVVFVUVfVElNRU9VVCwgbm93KSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKwogLyoKICAqIFNldHMgdGhlIGZpZWxkcyBpbiB0aGUgVHggY21kIHRoYXQgYXJlIGNyeXB0byByZWxhdGVkCiAgKi8KQEAgLTkwNCw5ICs5NDAsMTMgQEAKIAkJdGlkID0gSVdMX01BWF9USURfQ09VTlQ7CiAJfQogCi0JaWYgKGl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pKQorCWlmIChpd2xfbXZtX2lzX2RxYV9zdXBwb3J0ZWQobXZtKSkgewogCQl0eHFfaWQgPSBtdm1zdGEtPnRpZF9kYXRhW3RpZF0udHhxX2lkOwogCisJCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpCisJCQl0eF9jbWQtPnRpZF90c3BlYyA9IElXTF9USURfTk9OX1FPUzsKKwl9CisKIAkvKiBDb3B5IE1BQyBoZWFkZXIgZnJvbSBza2IgaW50byBjb21tYW5kIGJ1ZmZlciAqLwogCW1lbWNweSh0eF9jbWQtPmhkciwgaGRyLCBoZHJsZW4pOwogCkBAIC05NDAsNyArOTgwLDYgQEAKIAkJCWl3bF90cmFuc19mcmVlX3R4X2NtZChtdm0tPnRyYW5zLCBkZXZfY21kKTsKIAkJCXNwaW5fdW5sb2NrKCZtdm1zdGEtPmxvY2spOwogCQkJcmV0dXJuIDA7Ci0KIAkJfQogCiAJCS8qIElmIHdlIGFyZSBoZXJlIC0gVFhRIGV4aXN0cyBhbmQgbmVlZHMgdG8gYmUgcmUtYWN0aXZhdGVkICovCkBAIC05NTMsOCArOTkyLDI1IEBACiAJCQkJICAgIHR4cV9pZCk7CiAJfQogCi0JLyogS2VlcCB0cmFjayBvZiB0aGUgdGltZSBvZiB0aGUgbGFzdCBmcmFtZSBmb3IgdGhpcyBSQS9USUQgKi8KLQltdm0tPnF1ZXVlX2luZm9bdHhxX2lkXS5sYXN0X2ZyYW1lX3RpbWVbdGlkXSA9IGppZmZpZXM7CisJaWYgKGl3bF9tdm1faXNfZHFhX3N1cHBvcnRlZChtdm0pKSB7CisJCS8qIEtlZXAgdHJhY2sgb2YgdGhlIHRpbWUgb2YgdGhlIGxhc3QgZnJhbWUgZm9yIHRoaXMgUkEvVElEICovCisJCW12bS0+cXVldWVfaW5mb1t0eHFfaWRdLmxhc3RfZnJhbWVfdGltZVt0aWRdID0gamlmZmllczsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIHRpbWVkLW91dCBUSURzIC0gc2NoZWR1bGUgdGhlIHdvcmtlciB0aGF0IHdpbGwKKwkJICogcmVjb25maWcgdGhlIHF1ZXVlcyBhbmQgdXBkYXRlIHRoZW0KKwkJICoKKwkJICogTm90ZSB0aGF0IHRoZSBtdm0tPnF1ZXVlX2luZm9fbG9jayBpc24ndCBiZWluZyB0YWtlbiBoZXJlIGluCisJCSAqIG9yZGVyIHRvIG5vdCBzZXJpYWxpemUgdGhlIFRYIGZsb3cuIFRoaXMgaXNuJ3QgZGFuZ2Vyb3VzCisJCSAqIGJlY2F1c2Ugc2NoZWR1bGluZyBtdm0tPmFkZF9zdHJlYW1fd2sgY2FuJ3QgcnVpbiB0aGUgc3RhdGUsCisJCSAqIGFuZCBpZiB3ZSBET04nVCBzY2hlZHVsZSBpdCBkdWUgdG8gc29tZSByYWNlIGNvbmRpdGlvbiB0aGVuCisJCSAqIG5leHQgVFggd2UgZ2V0IGhlcmUgd2Ugd2lsbC4KKwkJICovCisJCWlmICh1bmxpa2VseShtdm0tPnF1ZXVlX2luZm9bdHhxX2lkXS5zdGF0dXMgPT0KKwkJCSAgICAgSVdMX01WTV9RVUVVRV9TSEFSRUQgJiYKKwkJCSAgICAgaXdsX212bV90eHFfc2hvdWxkX3VwZGF0ZShtdm0sIHR4cV9pZCkpKQorCQkJc2NoZWR1bGVfd29yaygmbXZtLT5hZGRfc3RyZWFtX3drKTsKKwl9CiAKIAlJV0xfREVCVUdfVFgobXZtLCAiVFggdG8gWyVkfCVkXSBROiVkIC0gc2VxOiAweCV4XG4iLCBtdm1zdGEtPnN0YV9pZCwKIAkJICAgICB0aWQsIHR4cV9pZCwgSUVFRTgwMjExX1NFUV9UT19TTihzZXFfbnVtYmVyKSk7CkBAIC0xMDY4LDkgKzExMjQsMTMgQEAKIAkJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sCiAJCQkJICAgICJDYW4gY29udGludWUgREVMQkEgZmxvdyBzc24gPSBuZXh0X3JlY2wgPSAlZFxuIiwKIAkJCQkgICAgdGlkX2RhdGEtPm5leHRfcmVjbGFpbWVkKTsKLQkJaXdsX212bV9kaXNhYmxlX3R4cShtdm0sIHRpZF9kYXRhLT50eHFfaWQsCi0JCQkJICAgIHZpZi0+aHdfcXVldWVbdGlkX3RvX21hYzgwMjExX2FjW3RpZF1dLCB0aWQsCi0JCQkJICAgIENNRF9BU1lOQyk7CisJCWlmICghaXdsX212bV9pc19kcWFfc3VwcG9ydGVkKG12bSkpIHsKKwkJCXU4IG1hYzgwMjExX2FjID0gdGlkX3RvX21hYzgwMjExX2FjW3RpZF07CisKKwkJCWl3bF9tdm1fZGlzYWJsZV90eHEobXZtLCB0aWRfZGF0YS0+dHhxX2lkLAorCQkJCQkgICAgdmlmLT5od19xdWV1ZVttYWM4MDIxMV9hY10sIHRpZCwKKwkJCQkJICAgIENNRF9BU1lOQyk7CisJCX0KIAkJdGlkX2RhdGEtPnN0YXRlID0gSVdMX0FHR19PRkY7CiAJCWllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUodmlmLCBzdGEtPmFkZHIsIHRpZCk7CiAJCWJyZWFrOwpAQCAtMTU0OCw0MSArMTYwOCwxNiBAQAogCQlpd2xfbXZtX3J4X3R4X2NtZF9hZ2cobXZtLCBwa3QpOwogfQogCi1zdGF0aWMgdm9pZCBpd2xfbXZtX3R4X2luZm9fZnJvbV9iYV9ub3RpZihzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJCSAgc3RydWN0IGl3bF9tdm1fYmFfbm90aWYgKmJhX25vdGlmLAotCQkJCQkgIHN0cnVjdCBpd2xfbXZtX3RpZF9kYXRhICp0aWRfZGF0YSkKK3N0YXRpYyB2b2lkIGl3bF9tdm1fdHhfcmVjbGFpbShzdHJ1Y3QgaXdsX212bSAqbXZtLCBpbnQgc3RhX2lkLCBpbnQgdGlkLAorCQkJICAgICAgIGludCB0eHEsIGludCBpbmRleCwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmJhX2luZm8sIHUzMiByYXRlKQogewotCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FNUERVOwotCWluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuID0gYmFfbm90aWYtPnR4ZWRfMl9kb25lOwotCWluZm8tPnN0YXR1cy5hbXBkdV9sZW4gPSBiYV9ub3RpZi0+dHhlZDsKLQlpd2xfbXZtX2h3cmF0ZV90b190eF9zdGF0dXModGlkX2RhdGEtPnJhdGVfbl9mbGFncywKLQkJCQkgICAgaW5mbyk7Ci0JLyogVE9ETzogbm90IGFjY291bnRlZCBpZiB0aGUgd2hvbGUgQS1NUERVIGZhaWxlZCAqLwotCWluZm8tPnN0YXR1cy50eF90aW1lID0gdGlkX2RhdGEtPnR4X3RpbWU7Ci0JaW5mby0+c3RhdHVzLnN0YXR1c19kcml2ZXJfZGF0YVswXSA9Ci0JCSh2b2lkICopKHVpbnRwdHJfdCliYV9ub3RpZi0+cmVkdWNlZF90eHA7Ci0JaW5mby0+c3RhdHVzLnN0YXR1c19kcml2ZXJfZGF0YVsxXSA9Ci0JCSh2b2lkICopKHVpbnRwdHJfdCl0aWRfZGF0YS0+cmF0ZV9uX2ZsYWdzOwotfQotCi12b2lkIGl3bF9tdm1fcnhfYmFfbm90aWYoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9tdm1fYmFfbm90aWYgKmJhX25vdGlmID0gKHZvaWQgKilwa3QtPmRhdGE7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCByZWNsYWltZWRfc2ticzsKIAlzdHJ1Y3QgaXdsX212bV90aWRfZGF0YSAqdGlkX2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKIAlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCBzdGFfaWQsIHRpZCwgZnJlZWQ7Ci0JLyogImZsb3ciIGNvcnJlc3BvbmRzIHRvIFR4IHF1ZXVlICovCi0JdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfbm90aWYtPnNjZF9mbG93KTsKLQkvKiAic3NuIiBpcyBzdGFydCBvZiBibG9jay1hY2sgVHggd2luZG93LCBjb3JyZXNwb25kcyB0byBpbmRleAotCSAqIChpbiBUeCBxdWV1ZSdzIGNpcmN1bGFyIGJ1ZmZlcikgb2YgZmlyc3QgVEZEL2ZyYW1lIGluIHdpbmRvdyAqLwotCXUxNiBiYV9yZXNwX3NjZF9zc24gPSBsZTE2X3RvX2NwdShiYV9ub3RpZi0+c2NkX3Nzbik7Ci0KLQlzdGFfaWQgPSBiYV9ub3RpZi0+c3RhX2lkOwotCXRpZCA9IGJhX25vdGlmLT50aWQ7CisJaW50IGZyZWVkOwogCiAJaWYgKFdBUk5fT05DRShzdGFfaWQgPj0gSVdMX01WTV9TVEFUSU9OX0NPVU5UIHx8CiAJCSAgICAgIHRpZCA+PSBJV0xfTUFYX1RJRF9DT1VOVCwKQEAgLTE2MDIsMTAgKzE2MzcsMTAgQEAKIAltdm1zdGEgPSBpd2xfbXZtX3N0YV9mcm9tX21hYzgwMjExKHN0YSk7CiAJdGlkX2RhdGEgPSAmbXZtc3RhLT50aWRfZGF0YVt0aWRdOwogCi0JaWYgKHRpZF9kYXRhLT50eHFfaWQgIT0gc2NkX2Zsb3cpIHsKKwlpZiAodGlkX2RhdGEtPnR4cV9pZCAhPSB0eHEpIHsKIAkJSVdMX0VSUihtdm0sCi0JCQkiaW52YWxpZCBCQSBub3RpZmljYXRpb246IFEgJWQsIHRpZCAlZCwgZmxvdyAlZFxuIiwKLQkJCXRpZF9kYXRhLT50eHFfaWQsIHRpZCwgc2NkX2Zsb3cpOworCQkJImludmFsaWQgQkEgbm90aWZpY2F0aW9uOiBRICVkLCB0aWQgJWRcbiIsCisJCQl0aWRfZGF0YS0+dHhxX2lkLCB0aWQpOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE2MTksMjcgKzE2NTQsMTQgQEAKIAkgKiBibG9jay1hY2sgd2luZG93ICh3ZSBhc3N1bWUgdGhhdCB0aGV5J3ZlIGJlZW4gc3VjY2Vzc2Z1bGx5CiAJICogdHJhbnNtaXR0ZWQgLi4uIGlmIG5vdCwgaXQncyB0b28gbGF0ZSBhbnl3YXkpLgogCSAqLwotCWl3bF90cmFuc19yZWNsYWltKG12bS0+dHJhbnMsIHNjZF9mbG93LCBiYV9yZXNwX3NjZF9zc24sCi0JCQkgICZyZWNsYWltZWRfc2ticyk7CisJaXdsX3RyYW5zX3JlY2xhaW0obXZtLT50cmFucywgdHhxLCBpbmRleCwgJnJlY2xhaW1lZF9za2JzKTsKIAotCUlXTF9ERUJVR19UWF9SRVBMWShtdm0sCi0JCQkgICAiQkFfTk9USUZJQ0FUSU9OIFJlY2VpdmVkIGZyb20gJXBNLCBzdGFfaWQgPSAlZFxuIiwKLQkJCSAgICh1OCAqKSZiYV9ub3RpZi0+c3RhX2FkZHJfbG8zMiwKLQkJCSAgIGJhX25vdGlmLT5zdGFfaWQpOwotCUlXTF9ERUJVR19UWF9SRVBMWShtdm0sCi0JCQkgICAiVElEID0gJWQsIFNlcUN0bCA9ICVkLCBiaXRtYXAgPSAweCVsbHgsIHNjZF9mbG93ID0gJWQsIHNjZF9zc24gPSAlZCBzZW50OiVkLCBhY2tlZDolZFxuIiwKLQkJCSAgIGJhX25vdGlmLT50aWQsIGxlMTZfdG9fY3B1KGJhX25vdGlmLT5zZXFfY3RsKSwKLQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoYmFfbm90aWYtPmJpdG1hcCksCi0JCQkgICBzY2RfZmxvdywgYmFfcmVzcF9zY2Rfc3NuLCBiYV9ub3RpZi0+dHhlZCwKLQkJCSAgIGJhX25vdGlmLT50eGVkXzJfZG9uZSk7Ci0KLQlJV0xfREVCVUdfVFhfUkVQTFkobXZtLCAicmVkdWNlZCB0eHAgZnJvbSBiYSBub3RpZiAlZFxuIiwKLQkJCSAgIGJhX25vdGlmLT5yZWR1Y2VkX3R4cCk7Ci0JdGlkX2RhdGEtPm5leHRfcmVjbGFpbWVkID0gYmFfcmVzcF9zY2Rfc3NuOworCXRpZF9kYXRhLT5uZXh0X3JlY2xhaW1lZCA9IGluZGV4OwogCiAJaXdsX212bV9jaGVja19yYXRpZF9lbXB0eShtdm0sIHN0YSwgdGlkKTsKIAogCWZyZWVkID0gMDsKKwliYV9pbmZvLT5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzFdID0gKHZvaWQgKikodWludHB0cl90KXJhdGU7CiAKIAlza2JfcXVldWVfd2FsaygmcmVjbGFpbWVkX3NrYnMsIHNrYikgewogCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHZvaWQgKilza2ItPmRhdGE7CkBAIC0xNjYxLDggKzE2ODMsMTIgQEAKIAogCQkvKiB0aGlzIGlzIHRoZSBmaXJzdCBza2Igd2UgZGVsaXZlciBpbiB0aGlzIGJhdGNoICovCiAJCS8qIHB1dCB0aGUgcmF0ZSBzY2FsaW5nIGRhdGEgdGhlcmUgKi8KLQkJaWYgKGZyZWVkID09IDEpCi0JCQlpd2xfbXZtX3R4X2luZm9fZnJvbV9iYV9ub3RpZihpbmZvLCBiYV9ub3RpZiwgdGlkX2RhdGEpOworCQlpZiAoZnJlZWQgPT0gMSkgeworCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQU1QRFU7CisJCQltZW1jcHkoJmluZm8tPnN0YXR1cywgJmJhX2luZm8tPnN0YXR1cywKKwkJCSAgICAgICBzaXplb2YoYmFfaW5mby0+c3RhdHVzKSk7CisJCQlpd2xfbXZtX2h3cmF0ZV90b190eF9zdGF0dXMocmF0ZSwgaW5mbyk7CisJCX0KIAl9CiAKIAlzcGluX3VubG9ja19iaCgmbXZtc3RhLT5sb2NrKTsKQEAgLTE2NzIsNyArMTY5OCw2IEBACiAJICogU3RpbGwgaXQncyBpbXBvcnRhbnQgdG8gdXBkYXRlIFJTIGFib3V0IHNlbnQgdnMuIGFja2VkLgogCSAqLwogCWlmIChza2JfcXVldWVfZW1wdHkoJnJlY2xhaW1lZF9za2JzKSkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gYmFfaW5mbyA9IHt9OwogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY2hhbmN0eF9jb25mID0gTlVMTDsKIAogCQlpZiAobXZtc3RhLT52aWYpCkBAIC0xNjgyLDExICsxNzA3LDExIEBACiAJCWlmIChXQVJOX09OX09OQ0UoIWNoYW5jdHhfY29uZikpCiAJCQlnb3RvIG91dDsKIAotCQliYV9pbmZvLmJhbmQgPSBjaGFuY3R4X2NvbmYtPmRlZi5jaGFuLT5iYW5kOwotCQlpd2xfbXZtX3R4X2luZm9fZnJvbV9iYV9ub3RpZigmYmFfaW5mbywgYmFfbm90aWYsIHRpZF9kYXRhKTsKKwkJYmFfaW5mby0+YmFuZCA9IGNoYW5jdHhfY29uZi0+ZGVmLmNoYW4tPmJhbmQ7CisJCWl3bF9tdm1faHdyYXRlX3RvX3R4X3N0YXR1cyhyYXRlLCBiYV9pbmZvKTsKIAogCQlJV0xfREVCVUdfVFhfUkVQTFkobXZtLCAiTm8gcmVjbGFpbS4gVXBkYXRlIHJzIGRpcmVjdGx5XG4iKTsKLQkJaXdsX212bV9yc190eF9zdGF0dXMobXZtLCBzdGEsIHRpZCwgJmJhX2luZm8sIGZhbHNlKTsKKwkJaXdsX212bV9yc190eF9zdGF0dXMobXZtLCBzdGEsIHRpZCwgYmFfaW5mbywgZmFsc2UpOwogCX0KIAogb3V0OgpAQCAtMTY5OCw2ICsxNzIzLDkyIEBACiAJfQogfQogCit2b2lkIGl3bF9tdm1fcnhfYmFfbm90aWYoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIpCit7CisJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJaW50IHN0YV9pZCwgdGlkLCB0eHEsIGluZGV4OworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyBiYV9pbmZvID0ge307CisJc3RydWN0IGl3bF9tdm1fYmFfbm90aWYgKmJhX25vdGlmOworCXN0cnVjdCBpd2xfbXZtX3RpZF9kYXRhICp0aWRfZGF0YTsKKwlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKKworCWlmIChpd2xfbXZtX2hhc19uZXdfdHhfYXBpKG12bSkpIHsKKwkJc3RydWN0IGl3bF9tdm1fY29tcHJlc3NlZF9iYV9ub3RpZiAqYmFfcmVzID0KKwkJCSh2b2lkICopcGt0LT5kYXRhOworCisJCXN0YV9pZCA9IGJhX3Jlcy0+c3RhX2lkOworCQliYV9pbmZvLnN0YXR1cy5hbXBkdV9hY2tfbGVuID0gKHU4KWxlMTZfdG9fY3B1KGJhX3Jlcy0+ZG9uZSk7CisJCWJhX2luZm8uc3RhdHVzLmFtcGR1X2xlbiA9ICh1OClsZTE2X3RvX2NwdShiYV9yZXMtPnR4ZWQpOworCQliYV9pbmZvLnN0YXR1cy50eF90aW1lID0KKwkJCSh1MTYpbGUzMl90b19jcHUoYmFfcmVzLT53aXJlbGVzc190aW1lKTsKKwkJYmFfaW5mby5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzBdID0KKwkJCSh2b2lkICopKHVpbnRwdHJfdCliYV9yZXMtPnJlZHVjZWRfdHhwOworCisJCS8qCisJCSAqIFRPRE86CisJCSAqIFdoZW4gc3VwcG9ydGluZyBtdWx0aSBUSUQgYWdncmVnYXRpb25zIC0gd2UgbmVlZCB0byBtb3ZlCisJCSAqIG5leHRfcmVjbGFpbWVkIHRvIGJlIHBlciBUWFEgYW5kIG5vdCBwZXIgVElEIG9yIGhhbmRsZSBpdAorCQkgKiBpbiBhIGRpZmZlcmVudCB3YXkuCisJCSAqIFRoaXMgd2lsbCBnbyB0b2dldGhlciB3aXRoIFNOIGFuZCBBZGRCQSBvZmZsb2FkIGFuZCBjYW5ub3QKKwkJICogYmUgaGFuZGxlZCBwcm9wZXJseSBmb3Igbm93LgorCQkgKi8KKwkJV0FSTl9PTihsZTE2X3RvX2NwdShiYV9yZXMtPnRmZF9jbnQpICE9IDEpOworCQlpd2xfbXZtX3R4X3JlY2xhaW0obXZtLCBzdGFfaWQsIGJhX3Jlcy0+cmFfdGlkWzBdLnRpZCwKKwkJCQkgICAoaW50KWJhX3Jlcy0+dGZkWzBdLnFfbnVtLAorCQkJCSAgIGxlMTZfdG9fY3B1KGJhX3Jlcy0+dGZkWzBdLnRmZF9pbmRleCksCisJCQkJICAgJmJhX2luZm8sIGxlMzJfdG9fY3B1KGJhX3Jlcy0+dHhfcmF0ZSkpOworCisJCUlXTF9ERUJVR19UWF9SRVBMWShtdm0sCisJCQkJICAgIkJBX05PVElGSUNBVElPTiBSZWNlaXZlZCBmcm9tIHN0YV9pZCA9ICVkLCBmbGFncyAleCwgc2VudDolZCwgYWNrZWQ6JWRcbiIsCisJCQkJICAgc3RhX2lkLCBsZTMyX3RvX2NwdShiYV9yZXMtPmZsYWdzKSwKKwkJCQkgICBsZTE2X3RvX2NwdShiYV9yZXMtPnR4ZWQpLAorCQkJCSAgIGxlMTZfdG9fY3B1KGJhX3Jlcy0+ZG9uZSkpOworCQlyZXR1cm47CisJfQorCisJYmFfbm90aWYgPSAodm9pZCAqKXBrdC0+ZGF0YTsKKwlzdGFfaWQgPSBiYV9ub3RpZi0+c3RhX2lkOworCXRpZCA9IGJhX25vdGlmLT50aWQ7CisJLyogImZsb3ciIGNvcnJlc3BvbmRzIHRvIFR4IHF1ZXVlICovCisJdHhxID0gbGUxNl90b19jcHUoYmFfbm90aWYtPnNjZF9mbG93KTsKKwkvKiAic3NuIiBpcyBzdGFydCBvZiBibG9jay1hY2sgVHggd2luZG93LCBjb3JyZXNwb25kcyB0byBpbmRleAorCSAqIChpbiBUeCBxdWV1ZSdzIGNpcmN1bGFyIGJ1ZmZlcikgb2YgZmlyc3QgVEZEL2ZyYW1lIGluIHdpbmRvdyAqLworCWluZGV4ID0gbGUxNl90b19jcHUoYmFfbm90aWYtPnNjZF9zc24pOworCisJcmN1X3JlYWRfbG9jaygpOworCW12bXN0YSA9IGl3bF9tdm1fc3RhX2Zyb21fc3RhaWRfcmN1KG12bSwgc3RhX2lkKTsKKwlpZiAoV0FSTl9PTl9PTkNFKCFtdm1zdGEpKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm47CisJfQorCisJdGlkX2RhdGEgPSAmbXZtc3RhLT50aWRfZGF0YVt0aWRdOworCisJYmFfaW5mby5zdGF0dXMuYW1wZHVfYWNrX2xlbiA9IGJhX25vdGlmLT50eGVkXzJfZG9uZTsKKwliYV9pbmZvLnN0YXR1cy5hbXBkdV9sZW4gPSBiYV9ub3RpZi0+dHhlZDsKKwliYV9pbmZvLnN0YXR1cy50eF90aW1lID0gdGlkX2RhdGEtPnR4X3RpbWU7CisJYmFfaW5mby5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzBdID0KKwkJKHZvaWQgKikodWludHB0cl90KWJhX25vdGlmLT5yZWR1Y2VkX3R4cDsKKworCXJjdV9yZWFkX3VubG9jaygpOworCisJaXdsX212bV90eF9yZWNsYWltKG12bSwgc3RhX2lkLCB0aWQsIHR4cSwgaW5kZXgsICZiYV9pbmZvLAorCQkJICAgdGlkX2RhdGEtPnJhdGVfbl9mbGFncyk7CisKKwlJV0xfREVCVUdfVFhfUkVQTFkobXZtLAorCQkJICAgIkJBX05PVElGSUNBVElPTiBSZWNlaXZlZCBmcm9tICVwTSwgc3RhX2lkID0gJWRcbiIsCisJCQkgICAodTggKikmYmFfbm90aWYtPnN0YV9hZGRyX2xvMzIsIGJhX25vdGlmLT5zdGFfaWQpOworCisJSVdMX0RFQlVHX1RYX1JFUExZKG12bSwKKwkJCSAgICJUSUQgPSAlZCwgU2VxQ3RsID0gJWQsIGJpdG1hcCA9IDB4JWxseCwgc2NkX2Zsb3cgPSAlZCwgc2NkX3NzbiA9ICVkIHNlbnQ6JWQsIGFja2VkOiVkXG4iLAorCQkJICAgYmFfbm90aWYtPnRpZCwgbGUxNl90b19jcHUoYmFfbm90aWYtPnNlcV9jdGwpLAorCQkJICAgbGU2NF90b19jcHUoYmFfbm90aWYtPmJpdG1hcCksIHR4cSwgaW5kZXgsCisJCQkgICBiYV9ub3RpZi0+dHhlZCwgYmFfbm90aWYtPnR4ZWRfMl9kb25lKTsKKworCUlXTF9ERUJVR19UWF9SRVBMWShtdm0sICJyZWR1Y2VkIHR4cCBmcm9tIGJhIG5vdGlmICVkXG4iLAorCQkJICAgYmFfbm90aWYtPnJlZHVjZWRfdHhwKTsKK30KKwogLyoKICAqIE5vdGUgdGhhdCB0aGVyZSBhcmUgdHJhbnNwb3J0cyB0aGF0IGJ1ZmZlciBmcmFtZXMgYmVmb3JlIHRoZXkgcmVhY2gKICAqIHRoZSBmaXJtd2FyZS4gVGhpcyBtZWFucyB0aGF0IGFmdGVyIGZsdXNoX3R4X3BhdGggaXMgY2FsbGVkLCB0aGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3V0aWxzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL212bS91dGlscy5jCmluZGV4IDY4ZjRlN2YuLmQwNGJhYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvbXZtL3V0aWxzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9tdm0vdXRpbHMuYwpAQCAtNTEyLDcgKzUxMiw3IEBACiAJCQliYXNlID0gbXZtLT5mdy0+aW5zdF9lcnJsb2dfcHRyOwogCX0KIAotCWlmIChiYXNlIDwgMHg4MDAwMDApIHsKKwlpZiAoYmFzZSA8IDB4NDAwMDAwKSB7CiAJCUlXTF9FUlIobXZtLAogCQkJIk5vdCB2YWxpZCBlcnJvciBsb2cgcG9pbnRlciAweCUwOFggZm9yICVzIHVDb2RlXG4iLAogCQkJYmFzZSwKQEAgLTYxMCw3ICs2MTAsNyBAQAogewogCXN0cnVjdCBpd2xfc2NkX3R4cV9jZmdfY21kIGNtZCA9IHsKIAkJLnNjZF9xdWV1ZSA9IHF1ZXVlLAotCQkuZW5hYmxlID0gMSwKKwkJLmFjdGlvbiA9IFNDRF9DRkdfRU5BQkxFX1FVRVVFLAogCQkud2luZG93ID0gZnJhbWVfbGltaXQsCiAJCS5zdGFfaWQgPSBzdGFfaWQsCiAJCS5zc24gPSBjcHVfdG9fbGUxNihzc24pLApAQCAtNjY5LDYgKzY2OSw4IEBACiAJCQkJdGlkX3RvX21hYzgwMjExX2FjW2NmZy0+dGlkXTsKIAkJZWxzZQogCQkJbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5tYWM4MDIxMV9hYyA9IElFRUU4MDIxMV9BQ19WTzsKKworCQltdm0tPnF1ZXVlX2luZm9bcXVldWVdLnR4cV90aWQgPSBjZmctPnRpZDsKIAl9CiAKIAlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwKQEAgLTY4Miw3ICs2ODQsNyBAQAogCWlmIChlbmFibGVfcXVldWUpIHsKIAkJc3RydWN0IGl3bF9zY2RfdHhxX2NmZ19jbWQgY21kID0gewogCQkJLnNjZF9xdWV1ZSA9IHF1ZXVlLAotCQkJLmVuYWJsZSA9IDEsCisJCQkuYWN0aW9uID0gU0NEX0NGR19FTkFCTEVfUVVFVUUsCiAJCQkud2luZG93ID0gY2ZnLT5mcmFtZV9saW1pdCwKIAkJCS5zdGFfaWQgPSBjZmctPnN0YV9pZCwKIAkJCS5zc24gPSBjcHVfdG9fbGUxNihzc24pLApAQCAtNzA5LDcgKzcxMSw3IEBACiB7CiAJc3RydWN0IGl3bF9zY2RfdHhxX2NmZ19jbWQgY21kID0gewogCQkuc2NkX3F1ZXVlID0gcXVldWUsCi0JCS5lbmFibGUgPSAwLAorCQkuYWN0aW9uID0gU0NEX0NGR19ESVNBQkxFX1FVRVVFLAogCX07CiAJYm9vbCByZW1vdmVfbWFjX3F1ZXVlID0gdHJ1ZTsKIAlpbnQgcmV0OwpAQCAtNzQ0LDggKzc0Niw5IEBACiAJCQl+QklUKG1hYzgwMjExX3F1ZXVlKTsKIAltdm0tPnF1ZXVlX2luZm9bcXVldWVdLmh3X3F1ZXVlX3JlZmNvdW50LS07CiAKLQljbWQuZW5hYmxlID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5od19xdWV1ZV9yZWZjb3VudCA/IDEgOiAwOwotCWlmICghY21kLmVuYWJsZSkKKwljbWQuYWN0aW9uID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5od19xdWV1ZV9yZWZjb3VudCA/CisJCVNDRF9DRkdfRU5BQkxFX1FVRVVFIDogU0NEX0NGR19ESVNBQkxFX1FVRVVFOworCWlmIChjbWQuYWN0aW9uID09IFNDRF9DRkdfRElTQUJMRV9RVUVVRSkKIAkJbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5zdGF0dXMgPSBJV0xfTVZNX1FVRVVFX0ZSRUU7CiAKIAlJV0xfREVCVUdfVFhfUVVFVUVTKG12bSwKQEAgLTc1NSwxMiArNzU4LDEzIEBACiAJCQkgICAgbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5od19xdWV1ZV90b19tYWM4MDIxMSk7CiAKIAkvKiBJZiB0aGUgcXVldWUgaXMgc3RpbGwgZW5hYmxlZCAtIG5vdGhpbmcgbGVmdCB0byBkbyBpbiB0aGlzIGZ1bmMgKi8KLQlpZiAoY21kLmVuYWJsZSkgeworCWlmIChjbWQuYWN0aW9uID09IFNDRF9DRkdfRU5BQkxFX1FVRVVFKSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZtdm0tPnF1ZXVlX2luZm9fbG9jayk7CiAJCXJldHVybjsKIAl9CiAKIAljbWQuc3RhX2lkID0gbXZtLT5xdWV1ZV9pbmZvW3F1ZXVlXS5yYV9zdGFfaWQ7CisJY21kLnRpZCA9IG12bS0+cXVldWVfaW5mb1txdWV1ZV0udHhxX3RpZDsKIAogCS8qIE1ha2Ugc3VyZSBxdWV1ZSBpbmZvIGlzIGNvcnJlY3QgZXZlbiB0aG91Z2ggd2Ugb3ZlcndyaXRlIGl0ICovCiAJV0FSTihtdm0tPnF1ZXVlX2luZm9bcXVldWVdLmh3X3F1ZXVlX3JlZmNvdW50IHx8CkBAIC0xMTMxLDcgKzExMzUsMTMgQEAKIAkJCUJJVChtdm1zdGEtPnZpZi0+aHdfcXVldWVbdGlkX3RvX21hYzgwMjExX2FjW3RpZF1dKTsKIAl9CiAKLQkvKiBUT0RPOiBpZiBxdWV1ZSB3YXMgc2hhcmVkIC0gbmVlZCB0byByZS1lbmFibGUgQUdHcyAqLworCS8qIElmIHRoZSBxdWV1ZSBpcyBtYXJrZWQgYXMgc2hhcmVkIC0gInVuc2hhcmUiIGl0ICovCisJaWYgKG12bS0+cXVldWVfaW5mb1txdWV1ZV0uaHdfcXVldWVfcmVmY291bnQgPT0gMSAmJgorCSAgICBtdm0tPnF1ZXVlX2luZm9bcXVldWVdLnN0YXR1cyA9PSBJV0xfTVZNX1FVRVVFX1NIQVJFRCkgeworCQltdm0tPnF1ZXVlX2luZm9bcXVldWVdLnN0YXR1cyA9IElXTF9NVk1fUVVFVUVfUkVDT05GSUdVUklORzsKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyhtdm0sICJNYXJraW5nIFE6JWQgZm9yIHJlY29uZmlnXG4iLAorCQkJCSAgICBxdWV1ZSk7CisJfQogfQogCiB2b2lkIGl3bF9tdm1faW5hY3Rpdml0eV9jaGVjayhzdHJ1Y3QgaXdsX212bSAqbXZtKQpAQCAtMTIxNSw2ICsxMjI1LDI4IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKK3ZvaWQgaXdsX212bV9nZXRfc3luY190aW1lKHN0cnVjdCBpd2xfbXZtICptdm0sIHUzMiAqZ3AyLCB1NjQgKmJvb3R0aW1lKQoreworCWJvb2wgcHNfZGlzYWJsZWQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKKworCS8qIERpc2FibGUgcG93ZXIgc2F2ZSB3aGVuIHJlYWRpbmcgR1AyICovCisJcHNfZGlzYWJsZWQgPSBtdm0tPnBzX2Rpc2FibGVkOworCWlmICghcHNfZGlzYWJsZWQpIHsKKwkJbXZtLT5wc19kaXNhYmxlZCA9IHRydWU7CisJCWl3bF9tdm1fcG93ZXJfdXBkYXRlX2RldmljZShtdm0pOworCX0KKworCSpncDIgPSBpd2xfcmVhZF9wcnBoKG12bS0+dHJhbnMsIERFVklDRV9TWVNURU1fVElNRV9SRUcpOworCSpib290dGltZSA9IGt0aW1lX2dldF9ib290X25zKCk7CisKKwlpZiAoIXBzX2Rpc2FibGVkKSB7CisJCW12bS0+cHNfZGlzYWJsZWQgPSBwc19kaXNhYmxlZDsKKwkJaXdsX212bV9wb3dlcl91cGRhdGVfZGV2aWNlKG12bSk7CisJfQorfQorCiBpbnQgaXdsX212bV9zZW5kX2xxbV9jbWQoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCSBlbnVtIGl3bF9scW1fY21kX29wZXJhdHJpb25zIG9wZXJhdGlvbiwKIAkJCSB1MzIgZHVyYXRpb24sIHUzMiB0aW1lb3V0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL2Rydi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL2Rydi5jCmluZGV4IDc4Y2Y5YTcuLjAwMWJlNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9kcnYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvZHJ2LmMKQEAgLTQ4Nyw2ICs0ODcsNyBAQAogCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4MTEzMCwgaXdsODI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjRGRCwgMHgwMTMwLCBpd2w4MjY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNEZELCAweDEwMTAsIGl3bDgyNjVfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4MTBEMCwgaXdsODI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjRGRCwgMHgwMDUwLCBpd2w4MjY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNEZELCAweDAxNTAsIGl3bDgyNjVfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4OTAxMCwgaXdsODI2NV8yYWNfY2ZnKX0sCkBAIC01MDAsMjIgKzUwMSwzNiBAQAogCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4MDkzMCwgaXdsODI2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjRGRCwgMHgwOTUwLCBpd2w4MjY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNEZELCAweDA4NTAsIGl3bDgyNjVfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RkQsIDB4MDAxMiwgaXdsODI3NV8yYWNfY2ZnKX0sCiAKIC8qIDkwMDAgU2VyaWVzICovCisJe0lXTF9QQ0lfREVWSUNFKDB4MjcxQiwgMHgwMDEwLCBpd2w5MTYwXzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNTI2LCAweDAwMDAsIGl3bDkyNjBfMmFjX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDI1MjYsIDB4MDAxMCwgaXdsOTI2MF8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwQTEwLCBpd2w5MjYwXzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDAwMTAsIGl3bDkyNjBfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDIxMCwgaXdsOTI2MF8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwNDEwLCBpd2w5MjYwXzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDA2MTAsIGl3bDkyNjBfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDMxMCwgaXdsNTE2NV8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwMDAwLCBpd2w1MTY1XzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDA1MTAsIGl3bDUxNjVfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MjAxMCwgaXdsNTE2NV8yYWNfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MjUyNiwgMHgxNDIwLCBpd2w1MTY1XzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDA3MTAsIGl3bDUxNjVfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MkExMCwgaXdsNTE2NV8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjUyNiwgMHgxNDEwLCBpd2w5MjcwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDBBMTAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDAxMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwMjEwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDA0MTAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDYxMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwMzEwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDAwMDAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDUxMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgyMDEwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNTI2LCAweDE0MjAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDlERjAsIDB4MDcxMCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgyQTEwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgzMERDLCAweDAwNjAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI1MjYsIDB4MDA2MCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4OURGMCwgMHgwMDYwLCBpd2w5NDYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHhBMzcwLCAweDAwNjAsIGl3bDk0NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDMxREMsIDB4MDA2MCwgaXdsOTQ2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjUyNiwgMHgwMDMwLCBpd2w5NTYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHg5REYwLCAweDAwMzAsIGl3bDk1NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweEEzNzAsIDB4MDAzMCwgaXdsOTU2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MzFEQywgMHgwMDMwLCBpd2w5NTYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNTI2LCAweDEwMzAsIGl3bDk1NjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweEEzNzAsIDB4MTAzMCwgaXdsOTU2MF8yYWNfY2ZnKX0sCiAKIC8qIGEwMDAgU2VyaWVzICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjcyMCwgMHgwQTEwLCBpd2xhMDAwXzJhY19jZmcpfSwKQEAgLTYwOCw3ICs2MjMsNiBAQAogewogCWNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmcgPSAoc3RydWN0IGl3bF9jZmcgKikoZW50LT5kcml2ZXJfZGF0YSk7CiAJY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZ183MjY1ZCBfX21heWJlX3VudXNlZCA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZ185MjYwbGMgX19tYXliZV91bnVzZWQgPSBOVUxMOwogCXN0cnVjdCBpd2xfdHJhbnMgKml3bF90cmFuczsKIAlpbnQgcmV0OwogCkBAIC02MzcsMTEgKzY1MSwxMCBAQAogCX0KIAogCWlmIChpd2xfdHJhbnMtPmNmZy0+cmZfaWQpIHsKLQkJaWYgKGNmZyA9PSAmaXdsOTI2MF8yYWNfY2ZnKQotCQkJY2ZnXzkyNjBsYyA9ICZpd2w5MjYwbGNfMmFjX2NmZzsKLQkJaWYgKGNmZ185MjYwbGMgJiYgaXdsX3RyYW5zLT5od19yZl9pZCA9PSBDU1JfSFdfUkZfSURfVFlQRV9MQykgewotCQkJY2ZnID0gY2ZnXzkyNjBsYzsKLQkJCWl3bF90cmFucy0+Y2ZnID0gY2ZnXzkyNjBsYzsKKwkJaWYgKGNmZyA9PSAmaXdsOTQ2MF8yYWNfY2ZnICYmCisJCSAgICBpd2xfdHJhbnMtPmh3X3JmX2lkID09IENTUl9IV19SRl9JRF9UWVBFX0xDKSB7CisJCQljZmcgPSAmaXdsOTAwMGxjXzJhY19jZmc7CisJCQlpd2xfdHJhbnMtPmNmZyA9IGNmZzsKIAkJfQogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL2ludGVybmFsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvaW50ZXJuYWwuaAppbmRleCAxMWUzNDdkLi5jYWM2ZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvaW50ZXJuYWwuaApAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogCiAjaW5jbHVkZSAiaXdsLWZoLmgiCiAjaW5jbHVkZSAiaXdsLWNzci5oIgpAQCAtNDksNyArNTAsNyBAQAogICogYmUgbmVlZGVkIGZvciBwb3RlbnRpYWwgZGF0YSBpbiB0aGUgU0tCJ3MgaGVhZC4gVGhlIHJlbWFpbmluZyBvbmVzIGNhbgogICogYmUgdXNlZCBmb3IgZnJhZ3MuCiAgKi8KLSNkZWZpbmUgSVdMX1BDSUVfTUFYX0ZSQUdTIChJV0xfTlVNX09GX1RCUyAtIDMpCisjZGVmaW5lIElXTF9QQ0lFX01BWF9GUkFHUyh4KSAoeC0+bWF4X3RicyAtIDMpCiAKIC8qCiAgKiBSWCByZWxhdGVkIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucwpAQCAtMTkyLDQxICsxOTMsOSBAQAogCS8qIG9ubHkgZm9yIFNZTkMgY29tbWFuZHMsIGlmZiB0aGUgcmVwbHkgc2tiIGlzIHdhbnRlZCAqLwogCXN0cnVjdCBpd2xfaG9zdF9jbWQgKnNvdXJjZTsKIAl1MzIgZmxhZ3M7CisJdTMyIHRiczsKIH07CiAKLS8qCi0gKiBHZW5lcmljIHF1ZXVlIHN0cnVjdHVyZQotICoKLSAqIENvbnRhaW5zIGNvbW1vbiBkYXRhIGZvciBSeCBhbmQgVHggcXVldWVzLgotICoKLSAqIE5vdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBURkRfUVVFVUVfU0laRV9NQVggYW5kIG5fd2luZG93OiB0aGUgaGFyZHdhcmUKLSAqIGFsd2F5cyBhc3N1bWVzIDI1NiBkZXNjcmlwdG9ycywgc28gVEZEX1FVRVVFX1NJWkVfTUFYIGlzIGFsd2F5cyAyNTYgKHVubGVzcwotICogdGhlcmUgbWlnaHQgYmUgSFcgY2hhbmdlcyBpbiB0aGUgZnV0dXJlKS4gRm9yIHRoZSBub3JtYWwgVFgKLSAqIHF1ZXVlcywgbl93aW5kb3csIHdoaWNoIGlzIHRoZSBzaXplIG9mIHRoZSBzb2Z0d2FyZSBxdWV1ZSBkYXRhCi0gKiBpcyBhbHNvIDI1NjsgaG93ZXZlciwgZm9yIHRoZSBjb21tYW5kIHF1ZXVlLCBuX3dpbmRvdyBpcyBvbmx5Ci0gKiAzMiBzaW5jZSB3ZSBkb24ndCBuZWVkIHNvIG1hbnkgY29tbWFuZHMgcGVuZGluZy4gU2luY2UgdGhlIEhXCi0gKiBzdGlsbCB1c2VzIDI1NiBCRHMgZm9yIERNQSB0aG91Z2gsIFRGRF9RVUVVRV9TSVpFX01BWCBzdGF5cyAyNTYuIEFzIGEgcmVzdWx0LAotICogdGhlIHNvZnR3YXJlIGJ1ZmZlcnMgKGluIHRoZSB2YXJpYWJsZXMgQG1ldGEsIEB0eGIgaW4gc3RydWN0Ci0gKiBpd2xfdHhxKSBvbmx5IGhhdmUgMzIgZW50cmllcywgd2hpbGUgdGhlIEhXIGJ1ZmZlcnMgKEB0ZmRzIGluCi0gKiB0aGUgc2FtZSBzdHJ1Y3QpIGhhdmUgMjU2LgotICogVGhpcyBtZWFucyB0aGF0IHdlIGVuZCB1cCB3aXRoIHRoZSBmb2xsb3dpbmc6Ci0gKiAgSFcgZW50cmllczogfCAwIHwgLi4uIHwgTiAqIDMyIHwgLi4uIHwgTiAqIDMyICsgMzEgfCAuLi4gfCAyNTUgfAotICogIFNXIGVudHJpZXM6ICAgICAgICAgICB8IDAgICAgICB8IC4uLiB8IDMxICAgICAgICAgIHwKLSAqIHdoZXJlIE4gaXMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA3LiBUaGlzIG1lYW5zIHRoYXQgdGhlIFNXCi0gKiBkYXRhIGlzIGEgd2luZG93IG92ZXJsYXllZCBvdmVyIHRoZSBIVyBxdWV1ZS4KLSAqLwotc3RydWN0IGl3bF9xdWV1ZSB7Ci0JaW50IHdyaXRlX3B0cjsgICAgICAgLyogMS1zdCBlbXB0eSBlbnRyeSAoaW5kZXgpIGhvc3RfdyovCi0JaW50IHJlYWRfcHRyOyAgICAgICAgIC8qIGxhc3QgdXNlZCBlbnRyeSAoaW5kZXgpIGhvc3RfciovCi0JLyogdXNlIGZvciBtb25pdG9yaW5nIGFuZCByZWNvdmVyaW5nIHRoZSBzdHVjayBxdWV1ZSAqLwotCWRtYV9hZGRyX3QgZG1hX2FkZHI7ICAgLyogcGh5c2ljYWwgYWRkciBmb3IgQkQncyAqLwotCWludCBuX3dpbmRvdzsJICAgICAgIC8qIHNhZmUgcXVldWUgd2luZG93ICovCi0JdTMyIGlkOwotCWludCBsb3dfbWFyazsJICAgICAgIC8qIGxvdyB3YXRlcm1hcmssIHJlc3VtZSBxdWV1ZSBpZiBmcmVlCi0JCQkJKiBzcGFjZSBtb3JlIHRoYW4gdGhpcyAqLwotCWludCBoaWdoX21hcms7ICAgICAgICAgLyogaGlnaCB3YXRlcm1hcmssIHN0b3AgcXVldWUgaWYgZnJlZQotCQkJCSogc3BhY2UgbGVzcyB0aGFuIHRoaXMgKi8KLX07CiAKICNkZWZpbmUgVEZEX1RYX0NNRF9TTE9UUyAyNTYKICNkZWZpbmUgVEZEX0NNRF9TTE9UUyAzMgpAQCAtMjczLDEzICsyNDIsMzIgQEAKICAqIEB3ZF90aW1lb3V0OiBxdWV1ZSB3YXRjaGRvZyB0aW1lb3V0IChqaWZmaWVzKSAtIHBlciBxdWV1ZQogICogQGZyb3plbjogdHggc3R1Y2sgcXVldWUgdGltZXIgaXMgZnJvemVuCiAgKiBAZnJvemVuX2V4cGlyeV9yZW1haW5kZXI6IHJlbWVtYmVyIGhvdyBsb25nIHVudGlsIHRoZSB0aW1lciBmaXJlcworICogQHdyaXRlX3B0cjogMS1zdCBlbXB0eSBlbnRyeSAoaW5kZXgpIGhvc3RfdworICogQHJlYWRfcHRyOiBsYXN0IHVzZWQgZW50cnkgKGluZGV4KSBob3N0X3IKKyAqIEBkbWFfYWRkcjogIHBoeXNpY2FsIGFkZHIgZm9yIEJEJ3MKKyAqIEBuX3dpbmRvdzogc2FmZSBxdWV1ZSB3aW5kb3cKKyAqIEBpZDogcXVldWUgaWQKKyAqIEBsb3dfbWFyazogbG93IHdhdGVybWFyaywgcmVzdW1lIHF1ZXVlIGlmIGZyZWUgc3BhY2UgbW9yZSB0aGFuIHRoaXMKKyAqIEBoaWdoX21hcms6IGhpZ2ggd2F0ZXJtYXJrLCBzdG9wIHF1ZXVlIGlmIGZyZWUgc3BhY2UgbGVzcyB0aGFuIHRoaXMKICAqCiAgKiBBIFR4IHF1ZXVlIGNvbnNpc3RzIG9mIGNpcmN1bGFyIGJ1ZmZlciBvZiBCRHMgKGEuay5hLiBURkRzLCB0cmFuc21pdCBmcmFtZQogICogZGVzY3JpcHRvcnMpIGFuZCByZXF1aXJlZCBsb2NraW5nIHN0cnVjdHVyZXMuCisgKgorICogTm90ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIFRGRF9RVUVVRV9TSVpFX01BWCBhbmQgbl93aW5kb3c6IHRoZSBoYXJkd2FyZQorICogYWx3YXlzIGFzc3VtZXMgMjU2IGRlc2NyaXB0b3JzLCBzbyBURkRfUVVFVUVfU0laRV9NQVggaXMgYWx3YXlzIDI1NiAodW5sZXNzCisgKiB0aGVyZSBtaWdodCBiZSBIVyBjaGFuZ2VzIGluIHRoZSBmdXR1cmUpLiBGb3IgdGhlIG5vcm1hbCBUWAorICogcXVldWVzLCBuX3dpbmRvdywgd2hpY2ggaXMgdGhlIHNpemUgb2YgdGhlIHNvZnR3YXJlIHF1ZXVlIGRhdGEKKyAqIGlzIGFsc28gMjU2OyBob3dldmVyLCBmb3IgdGhlIGNvbW1hbmQgcXVldWUsIG5fd2luZG93IGlzIG9ubHkKKyAqIDMyIHNpbmNlIHdlIGRvbid0IG5lZWQgc28gbWFueSBjb21tYW5kcyBwZW5kaW5nLiBTaW5jZSB0aGUgSFcKKyAqIHN0aWxsIHVzZXMgMjU2IEJEcyBmb3IgRE1BIHRob3VnaCwgVEZEX1FVRVVFX1NJWkVfTUFYIHN0YXlzIDI1Ni4KKyAqIFRoaXMgbWVhbnMgdGhhdCB3ZSBlbmQgdXAgd2l0aCB0aGUgZm9sbG93aW5nOgorICogIEhXIGVudHJpZXM6IHwgMCB8IC4uLiB8IE4gKiAzMiB8IC4uLiB8IE4gKiAzMiArIDMxIHwgLi4uIHwgMjU1IHwKKyAqICBTVyBlbnRyaWVzOiAgICAgICAgICAgfCAwICAgICAgfCAuLi4gfCAzMSAgICAgICAgICB8CisgKiB3aGVyZSBOIGlzIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgNy4gVGhpcyBtZWFucyB0aGF0IHRoZSBTVworICogZGF0YSBpcyBhIHdpbmRvdyBvdmVybGF5ZWQgb3ZlciB0aGUgSFcgcXVldWUuCiAgKi8KIHN0cnVjdCBpd2xfdHhxIHsKLQlzdHJ1Y3QgaXdsX3F1ZXVlIHE7Ci0Jc3RydWN0IGl3bF90ZmQgKnRmZHM7CisJdm9pZCAqdGZkczsKIAlzdHJ1Y3QgaXdsX3BjaWVfZmlyc3RfdGJfYnVmICpmaXJzdF90Yl9idWZzOwogCWRtYV9hZGRyX3QgZmlyc3RfdGJfZG1hOwogCXN0cnVjdCBpd2xfcGNpZV90eHFfZW50cnkgKmVudHJpZXM7CkBAIC0yOTQsNiArMjgyLDE0IEBACiAJYm9vbCBibG9jazsKIAl1bnNpZ25lZCBsb25nIHdkX3RpbWVvdXQ7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBvdmVyZmxvd19xOworCisJaW50IHdyaXRlX3B0cjsKKwlpbnQgcmVhZF9wdHI7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwlpbnQgbl93aW5kb3c7CisJdTMyIGlkOworCWludCBsb3dfbWFyazsKKwlpbnQgaGlnaF9tYXJrOwogfTsKIAogc3RhdGljIGlubGluZSBkbWFfYWRkcl90CkBAIC0zMDksNiArMzA1LDE2IEBACiB9OwogCiAvKioKKyAqIGVudW0gaXdsX3NoYXJlZF9pcnFfZmxhZ3MgLSBsZXZlbCBvZiBzaGFyaW5nIGZvciBpcnEKKyAqIEBJV0xfU0hBUkVEX0lSUV9OT05fUlg6IGludGVycnVwdCB2ZWN0b3Igc2VydmVzIG5vbiByeCBjYXVzZXMuCisgKiBASVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTOiBpbnRlcnJ1cHQgdmVjdG9yIHNlcnZlcyBmaXJzdCBSU1MgcXVldWUuCisgKi8KK2VudW0gaXdsX3NoYXJlZF9pcnFfZmxhZ3MgeworCUlXTF9TSEFSRURfSVJRX05PTl9SWAkJPSBCSVQoMCksCisJSVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTCT0gQklUKDEpLAorfTsKKworLyoqCiAgKiBzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgLSBQQ0llIHRyYW5zcG9ydCBzcGVjaWZpYyBkYXRhCiAgKiBAcnhxOiBhbGwgdGhlIFJYIHF1ZXVlIGRhdGEKICAqIEByeF9wb29sOiBpbml0aWFsIHBvb2wgb2YgaXdsX3J4X21lbV9idWZmZXIgZm9yIGFsbCB0aGUgcXVldWVzCkBAIC0zMjYsNyArMzMyLDYgQEAKICAqIEByeF9idWZfc2l6ZTogUnggYnVmZmVyIHNpemUKICAqIEBiY190YWJsZV9kd29yZDogdHJ1ZSBpZiB0aGUgQkMgdGFibGUgZXhwZWN0cyBEV09SRCAoYXMgb3Bwb3NlZCB0byBieXRlcykKICAqIEBzY2Rfc2V0X2FjdGl2ZTogc2hvdWxkIHRoZSB0cmFuc3BvcnQgY29uZmlndXJlIHRoZSBTQ0QgZm9yIEhDTUQgcXVldWUKLSAqIEB3aWRlX2NtZF9oZWFkZXI6IHRydWUgd2hlbiB1Y29kZSBzdXBwb3J0cyB3aWRlIGNvbW1hbmQgaGVhZGVyIGZvcm1hdAogICogQHN3X2NzdW1fdHg6IGlmIHRydWUsIHRoZW4gdGhlIHRyYW5zcG9ydCB3aWxsIGNvbXB1dGUgdGhlIGNzdW0gb2YgdGhlIFRYZWQKICAqCWZyYW1lLgogICogQHJ4X3BhZ2Vfb3JkZXI6IHBhZ2Ugb3JkZXIgZm9yIHJlY2VpdmUgYnVmZmVyIHNpemUKQEAgLTMzOCw4ICszNDMsMTAgQEAKICAqIEBmd19tb25fc2l6ZTogc2l6ZSBvZiB0aGUgYnVmZmVyIGZvciB0aGUgZmlybXdhcmUgbW9uaXRvcgogICogQG1zaXhfZW50cmllczogYXJyYXkgb2YgTVNJLVggZW50cmllcwogICogQG1zaXhfZW5hYmxlZDogdHJ1ZSBpZiBtYW5hZ2VkIHRvIGVuYWJsZSBNU0ktWAotICogQGFsbG9jYXRlZF92ZWN0b3I6IHRoZSBudW1iZXIgb2YgaW50ZXJydXB0IHZlY3RvciBhbGxvY2F0ZWQgYnkgdGhlIE9TCi0gKiBAZGVmYXVsdF9pcnFfbnVtOiBkZWZhdWx0IGlycSBmb3Igbm9uIHJ4IGludGVycnVwdAorICogQHNoYXJlZF92ZWNfbWFzazogdGhlIHR5cGUgb2YgY2F1c2VzIHRoZSBzaGFyZWQgdmVjdG9yIGhhbmRsZXMKKyAqCShzZWUgaXdsX3NoYXJlZF9pcnFfZmxhZ3MpLgorICogQGFsbG9jX3ZlY3M6IHRoZSBudW1iZXIgb2YgaW50ZXJydXB0IHZlY3RvcnMgYWxsb2NhdGVkIGJ5IHRoZSBPUworICogQGRlZl9pcnE6IGRlZmF1bHQgaXJxIGZvciBub24gcnggY2F1c2VzCiAgKiBAZmhfaW5pdF9tYXNrOiBpbml0aWFsIHVubWFza2VkIGZoIGNhdXNlcwogICogQGh3X2luaXRfbWFzazogaW5pdGlhbCB1bm1hc2tlZCBodyBjYXVzZXMKICAqIEBmaF9tYXNrOiBjdXJyZW50IHVubWFza2VkIGZoIGNhdXNlcwpAQCAtMzkxLDExICszOTgsMTIgQEAKIAl1bnNpZ25lZCBpbnQgY21kX3Ffd2RnX3RpbWVvdXQ7CiAJdTggbl9ub19yZWNsYWltX2NtZHM7CiAJdTggbm9fcmVjbGFpbV9jbWRzW01BWF9OT19SRUNMQUlNX0NNRFNdOworCXU4IG1heF90YnM7CisJdTE2IHRmZF9zaXplOwogCiAJZW51bSBpd2xfYW1zZHVfc2l6ZSByeF9idWZfc2l6ZTsKIAlib29sIGJjX3RhYmxlX2R3b3JkOwogCWJvb2wgc2NkX3NldF9hY3RpdmU7Ci0JYm9vbCB3aWRlX2NtZF9oZWFkZXI7CiAJYm9vbCBzd19jc3VtX3R4OwogCXUzMiByeF9wYWdlX29yZGVyOwogCkBAIC00MTAsMTIgKzQxOCwxNCBAQAogCiAJc3RydWN0IG1zaXhfZW50cnkgbXNpeF9lbnRyaWVzW0lXTF9NQVhfUlhfSFdfUVVFVUVTXTsKIAlib29sIG1zaXhfZW5hYmxlZDsKLQl1MzIgYWxsb2NhdGVkX3ZlY3RvcjsKLQl1MzIgZGVmYXVsdF9pcnFfbnVtOworCXU4IHNoYXJlZF92ZWNfbWFzazsKKwl1MzIgYWxsb2NfdmVjczsKKwl1MzIgZGVmX2lycTsKIAl1MzIgZmhfaW5pdF9tYXNrOwogCXUzMiBod19pbml0X21hc2s7CiAJdTMyIGZoX21hc2s7CiAJdTMyIGh3X21hc2s7CisJY3B1bWFza190IGFmZmluaXR5X21hc2tbSVdMX01BWF9SWF9IV19RVUVVRVNdOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKgpAQCAtNDc0LDYgKzQ4NCw3IEBACiAJCQkJYm9vbCBjb25maWd1cmVfc2NkKTsKIHZvaWQgaXdsX3RyYW5zX3BjaWVfdHhxX3NldF9zaGFyZWRfbW9kZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdTMyIHR4cV9pZCwKIAkJCQkJYm9vbCBzaGFyZWRfbW9kZSk7CitkbWFfYWRkcl90IGl3bF90cmFuc19wY2llX2dldF90eHFfYnl0ZV90YWJsZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHR4cSk7CiB2b2lkIGl3bF90cmFuc19wY2llX2xvZ19zY2RfZXJyb3Ioc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCiAJCQkJICBzdHJ1Y3QgaXdsX3R4cSAqdHhxKTsKIGludCBpd2xfdHJhbnNfcGNpZV90eChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTQ4NiwxMSArNDk3LDIwIEBACiAJCQkgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqc2ticyk7CiB2b2lkIGl3bF90cmFuc19wY2llX3R4X3Jlc2V0KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKIAotc3RhdGljIGlubGluZSB1MTYgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4oc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4KQorc3RhdGljIGlubGluZSB1MTYgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4oc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHZvaWQgKl90ZmQsCisJCQkJCSAgdTggaWR4KQogewotCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOworCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKSB7CisJCXN0cnVjdCBpd2xfdGZoX3RmZCAqdGZkID0gX3RmZDsKKwkJc3RydWN0IGl3bF90ZmhfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07CiAKLQlyZXR1cm4gbGUxNl90b19jcHUodGItPmhpX25fbGVuKSA+PiA0OworCQlyZXR1cm4gbGUxNl90b19jcHUodGItPnRiX2xlbik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGl3bF90ZmQgKnRmZCA9IF90ZmQ7CisJCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOworCisJCXJldHVybiBsZTE2X3RvX2NwdSh0Yi0+aGlfbl9sZW4pID4+IDQ7CisJfQogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTYxNyw5ICs2MzcsOSBAQAogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KHR4cS0+cS5pZCwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpIHsKLQkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgIldha2UgaHdxICVkXG4iLCB0eHEtPnEuaWQpOwotCQlpd2xfb3BfbW9kZV9xdWV1ZV9ub3RfZnVsbCh0cmFucy0+b3BfbW9kZSwgdHhxLT5xLmlkKTsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KHR4cS0+aWQsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpKSB7CisJCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJXYWtlIGh3cSAlZFxuIiwgdHhxLT5pZCk7CisJCWl3bF9vcF9tb2RlX3F1ZXVlX25vdF9mdWxsKHRyYW5zLT5vcF9tb2RlLCB0eHEtPmlkKTsKIAl9CiB9CiAKQEAgLTYyOCwyMiArNjQ4LDIyIEBACiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAotCWlmICghdGVzdF9hbmRfc2V0X2JpdCh0eHEtPnEuaWQsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpKSB7Ci0JCWl3bF9vcF9tb2RlX3F1ZXVlX2Z1bGwodHJhbnMtPm9wX21vZGUsIHR4cS0+cS5pZCk7Ci0JCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJTdG9wIGh3cSAlZFxuIiwgdHhxLT5xLmlkKTsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQodHhxLT5pZCwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpIHsKKwkJaXdsX29wX21vZGVfcXVldWVfZnVsbCh0cmFucy0+b3BfbW9kZSwgdHhxLT5pZCk7CisJCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJTdG9wIGh3cSAlZFxuIiwgdHhxLT5pZCk7CiAJfSBlbHNlCiAJCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJod3EgJWQgYWxyZWFkeSBzdG9wcGVkXG4iLAotCQkJCSAgICB0eHEtPnEuaWQpOworCQkJCSAgICB0eHEtPmlkKTsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGl3bF9xdWV1ZV91c2VkKGNvbnN0IHN0cnVjdCBpd2xfcXVldWUgKnEsIGludCBpKQorc3RhdGljIGlubGluZSBib29sIGl3bF9xdWV1ZV91c2VkKGNvbnN0IHN0cnVjdCBpd2xfdHhxICpxLCBpbnQgaSkKIHsKIAlyZXR1cm4gcS0+d3JpdGVfcHRyID49IHEtPnJlYWRfcHRyID8KIAkJKGkgPj0gcS0+cmVhZF9wdHIgJiYgaSA8IHEtPndyaXRlX3B0cikgOgogCQkhKGkgPCBxLT5yZWFkX3B0ciAmJiBpID49IHEtPndyaXRlX3B0cik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggZ2V0X2NtZF9pbmRleChzdHJ1Y3QgaXdsX3F1ZXVlICpxLCB1MzIgaW5kZXgpCitzdGF0aWMgaW5saW5lIHU4IGdldF9jbWRfaW5kZXgoc3RydWN0IGl3bF90eHEgKnEsIHUzMiBpbmRleCkKIHsKIAlyZXR1cm4gaW5kZXggJiAocS0+bl93aW5kb3cgLSAxKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3J4LmMKaW5kZXggNWMzNmU2ZC4uNmZlNTU0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3J4LmMKQEAgLTQ4NywxNSArNDg3LDEzIEBACiAKIAl3aGlsZSAocGVuZGluZykgewogCQlpbnQgaTsKLQkJc3RydWN0IGxpc3RfaGVhZCBsb2NhbF9hbGxvY2F0ZWQ7CisJCUxJU1RfSEVBRChsb2NhbF9hbGxvY2F0ZWQpOwogCQlnZnBfdCBnZnBfbWFzayA9IEdGUF9LRVJORUw7CiAKIAkJLyogRG8gbm90IHBvc3QgYSB3YXJuaW5nIGlmIHRoZXJlIGFyZSBvbmx5IGEgZmV3IHJlcXVlc3RzICovCiAJCWlmIChwZW5kaW5nIDwgUlhfUEVORElOR19XQVRFUk1BUkspCiAJCQlnZnBfbWFzayB8PSBfX0dGUF9OT1dBUk47CiAKLQkJSU5JVF9MSVNUX0hFQUQoJmxvY2FsX2FsbG9jYXRlZCk7Ci0KIAkJZm9yIChpID0gMDsgaSA8IFJYX0NMQUlNX1JFUV9BTExPQzspIHsKIAkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwogCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC0xMTA4LDEzICsxMTA2LDE0IEBACiAJCQlGSF9SU0NTUl9SWFFfUE9TICE9IHJ4cS0+aWQpOwogCiAJCUlXTF9ERUJVR19SWCh0cmFucywKLQkJCSAgICAgImNtZCBhdCBvZmZzZXQgJWQ6ICVzICgweCUuMngsIHNlcSAweCV4KVxuIiwKKwkJCSAgICAgImNtZCBhdCBvZmZzZXQgJWQ6ICVzICglLjJ4LiUyeCwgc2VxIDB4JXgpXG4iLAogCQkJICAgICByeGNiLl9vZmZzZXQsCiAJCQkgICAgIGl3bF9nZXRfY21kX3N0cmluZyh0cmFucywKIAkJCQkJCWl3bF9jbWRfaWQocGt0LT5oZHIuY21kLAogCQkJCQkJCSAgIHBrdC0+aGRyLmdyb3VwX2lkLAogCQkJCQkJCSAgIDApKSwKLQkJCSAgICAgcGt0LT5oZHIuY21kLCBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSkpOworCQkJICAgICBwa3QtPmhkci5ncm91cF9pZCwgcGt0LT5oZHIuY21kLAorCQkJICAgICBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSkpOwogCiAJCWxlbiA9IGl3bF9yeF9wYWNrZXRfbGVuKHBrdCk7CiAJCWxlbiArPSBzaXplb2YodTMyKTsgLyogYWNjb3VudCBmb3Igc3RhdHVzIHdvcmQgKi8KQEAgLTExNDIsNyArMTE0MSw3IEBACiAKIAkJc2VxdWVuY2UgPSBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSk7CiAJCWluZGV4ID0gU0VRX1RPX0lOREVYKHNlcXVlbmNlKTsKLQkJY21kX2luZGV4ID0gZ2V0X2NtZF9pbmRleCgmdHhxLT5xLCBpbmRleCk7CisJCWNtZF9pbmRleCA9IGdldF9jbWRfaW5kZXgodHhxLCBpbmRleCk7CiAKIAkJaWYgKHJ4cS0+aWQgPT0gMCkKIAkJCWl3bF9vcF9tb2RlX3J4KHRyYW5zLT5vcF9tb2RlLCAmcnhxLT5uYXBpLApAQCAtMTg4NSw2ICsxODg0LDIwIEBACiAJCQkgICAgICBpbnRhX2ZoLAogCQkJICAgICAgaXdsX3JlYWQzMih0cmFucywgQ1NSX01TSVhfRkhfSU5UX01BU0tfQUQpKTsKIAorCWlmICgodHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrICYgSVdMX1NIQVJFRF9JUlFfTk9OX1JYKSAmJgorCSAgICBpbnRhX2ZoICYgTVNJWF9GSF9JTlRfQ0FVU0VTX1EwKSB7CisJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJaXdsX3BjaWVfcnhfaGFuZGxlKHRyYW5zLCAwKTsKKwkJbG9jYWxfYmhfZW5hYmxlKCk7CisJfQorCisJaWYgKCh0cmFuc19wY2llLT5zaGFyZWRfdmVjX21hc2sgJiBJV0xfU0hBUkVEX0lSUV9GSVJTVF9SU1MpICYmCisJICAgIGludGFfZmggJiBNU0lYX0ZIX0lOVF9DQVVTRVNfUTEpIHsKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOworCQlpd2xfcGNpZV9yeF9oYW5kbGUodHJhbnMsIDEpOworCQlsb2NhbF9iaF9lbmFibGUoKTsKKwl9CisKIAkvKiBUaGlzICJUeCIgRE1BIGNoYW5uZWwgaXMgdXNlZCBvbmx5IGZvciBsb2FkaW5nIHVDb2RlICovCiAJaWYgKGludGFfZmggJiBNU0lYX0ZIX0lOVF9DQVVTRVNfRDJTX0NIMF9OVU0pIHsKIAkJSVdMX0RFQlVHX0lTUih0cmFucywgInVDb2RlIGxvYWQgaW50ZXJydXB0XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVsL2l3bHdpZmkvcGNpZS90cmFucy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3RyYW5zLmMKaW5kZXggNzRmMmYwMy4uYWU5NTUzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3RyYW5zLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3RyYW5zLmMKQEAgLTgyNywxMCArODI3LDE2IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCS8qIE5vdGlmeSB0aGUgdWNvZGUgb2YgdGhlIGxvYWRlZCBzZWN0aW9uIG51bWJlciBhbmQgc3RhdHVzICovCi0JCXZhbCA9IGl3bF9yZWFkX2RpcmVjdDMyKHRyYW5zLCBGSF9VQ09ERV9MT0FEX1NUQVRVUyk7Ci0JCXZhbCA9IHZhbCB8IChzZWNfbnVtIDw8IHNoaWZ0X3BhcmFtKTsKLQkJaXdsX3dyaXRlX2RpcmVjdDMyKHRyYW5zLCBGSF9VQ09ERV9MT0FEX1NUQVRVUywgdmFsKTsKKwkJLyogTm90aWZ5IHVjb2RlIG9mIGxvYWRlZCBzZWN0aW9uIG51bWJlciBhbmQgc3RhdHVzICovCisJCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKSB7CisJCQl2YWwgPSBpd2xfcmVhZF9wcnBoKHRyYW5zLCBVUkVHX1VDT0RFX0xPQURfU1RBVFVTKTsKKwkJCXZhbCA9IHZhbCB8IChzZWNfbnVtIDw8IHNoaWZ0X3BhcmFtKTsKKwkJCWl3bF93cml0ZV9wcnBoKHRyYW5zLCBVUkVHX1VDT0RFX0xPQURfU1RBVFVTLCB2YWwpOworCQl9IGVsc2UgeworCQkJdmFsID0gaXdsX3JlYWRfZGlyZWN0MzIodHJhbnMsIEZIX1VDT0RFX0xPQURfU1RBVFVTKTsKKwkJCXZhbCA9IHZhbCB8IChzZWNfbnVtIDw8IHNoaWZ0X3BhcmFtKTsKKwkJCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgRkhfVUNPREVfTE9BRF9TVEFUVVMsIHZhbCk7CisJCX0KIAkJc2VjX251bSA9IChzZWNfbnVtIDw8IDEpIHwgMHgxOwogCX0KIApAQCAtODM4LDEwICs4NDQsMjEgQEAKIAogCWl3bF9lbmFibGVfaW50ZXJydXB0cyh0cmFucyk7CiAKLQlpZiAoY3B1ID09IDEpCi0JCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgRkhfVUNPREVfTE9BRF9TVEFUVVMsIDB4RkZGRik7Ci0JZWxzZQotCQlpd2xfd3JpdGVfZGlyZWN0MzIodHJhbnMsIEZIX1VDT0RFX0xPQURfU1RBVFVTLCAweEZGRkZGRkZGKTsKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkgeworCQlpZiAoY3B1ID09IDEpCisJCQlpd2xfd3JpdGVfcHJwaCh0cmFucywgVVJFR19VQ09ERV9MT0FEX1NUQVRVUywKKwkJCQkgICAgICAgMHhGRkZGKTsKKwkJZWxzZQorCQkJaXdsX3dyaXRlX3BycGgodHJhbnMsIFVSRUdfVUNPREVfTE9BRF9TVEFUVVMsCisJCQkJICAgICAgIDB4RkZGRkZGRkYpOworCX0gZWxzZSB7CisJCWlmIChjcHUgPT0gMSkKKwkJCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgRkhfVUNPREVfTE9BRF9TVEFUVVMsCisJCQkJCSAgIDB4RkZGRik7CisJCWVsc2UKKwkJCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgRkhfVUNPREVfTE9BRF9TVEFUVVMsCisJCQkJCSAgIDB4RkZGRkZGRkYpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtODg2LDE0ICs5MDMsNiBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAodHJhbnMtPmNmZy0+ZGV2aWNlX2ZhbWlseSA9PSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKQotCQlpd2xfc2V0X2JpdHNfcHJwaCh0cmFucywKLQkJCQkgIENTUl9VQ09ERV9MT0FEX1NUQVRVU19BRERSLAotCQkJCSAgKExNUE1fQ1BVX1VDT0RFX0xPQURJTkdfQ09NUExFVEVEIHwKLQkJCQkgICBMTVBNX0NQVV9IRFJTX0xPQURJTkdfQ09NUExFVEVEIHwKLQkJCQkgICBMTVBNX0NQVV9VQ09ERV9MT0FESU5HX1NUQVJURUQpIDw8Ci0JCQkJCXNoaWZ0X3BhcmFtKTsKLQogCSpmaXJzdF91Y29kZV9zZWN0aW9uID0gbGFzdF9yZWFkX2lkeDsKIAogCXJldHVybiAwOwpAQCAtMTE2MSw3ICsxMTcwLDcgQEAKIAlpZiAodHJhbnNfcGNpZS0+bXNpeF9lbmFibGVkKSB7CiAJCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCB0cmFuc19wY2llLT5hbGxvY2F0ZWRfdmVjdG9yOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCB0cmFuc19wY2llLT5hbGxvY192ZWNzOyBpKyspCiAJCQlzeW5jaHJvbml6ZV9pcnEodHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldLnZlY3Rvcik7CiAJfSBlbHNlIHsKIAkJc3luY2hyb25pemVfaXJxKHRyYW5zX3BjaWUtPnBjaV9kZXYtPmlycSk7CkBAIC0xNDIwLDEzICsxNDI5LDU4IEBACiAJe01TSVhfSFdfSU5UX0NBVVNFU19SRUdfSEFQLAkJQ1NSX01TSVhfSFdfSU5UX01BU0tfQUQsIDB4MkV9LAogfTsKIAorc3RhdGljIHZvaWQgaXdsX3BjaWVfbWFwX25vbl9yeF9jYXVzZXMoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gIElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisJaW50IHZhbCA9IHRyYW5zX3BjaWUtPmRlZl9pcnEgfCBNU0lYX05PTl9BVVRPX0NMRUFSX0NBVVNFOworCWludCBpOworCisJLyoKKwkgKiBBY2Nlc3MgYWxsIG5vbiBSWCBjYXVzZXMgYW5kIG1hcCB0aGVtIHRvIHRoZSBkZWZhdWx0IGlycS4KKwkgKiBJbiBjYXNlIHdlIGFyZSBtaXNzaW5nIGF0IGxlYXN0IG9uZSBpbnRlcnJ1cHQgdmVjdG9yLAorCSAqIHRoZSBmaXJzdCBpbnRlcnJ1cHQgdmVjdG9yIHdpbGwgc2VydmUgbm9uLVJYIGFuZCBGQlEgY2F1c2VzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNhdXNlc19saXN0KTsgaSsrKSB7CisJCWl3bF93cml0ZTgodHJhbnMsIENTUl9NU0lYX0lWQVIoY2F1c2VzX2xpc3RbaV0uYWRkciksIHZhbCk7CisJCWl3bF9jbGVhcl9iaXQodHJhbnMsIGNhdXNlc19saXN0W2ldLm1hc2tfcmVnLAorCQkJICAgICAgY2F1c2VzX2xpc3RbaV0uY2F1c2VfbnVtKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGl3bF9wY2llX21hcF9yeF9jYXVzZXMoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKKwl1MzIgb2Zmc2V0ID0KKwkJdHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrICYgSVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTID8gMSA6IDA7CisJdTMyIHZhbCwgaWR4OworCisJLyoKKwkgKiBUaGUgZmlyc3QgUlggcXVldWUgLSBmYWxsYmFjayBxdWV1ZSwgd2hpY2ggaXMgZGVzaWduYXRlZCBmb3IKKwkgKiBtYW5hZ2VtZW50IGZyYW1lLCBjb21tYW5kIHJlc3BvbnNlcyBldGMsIGlzIGFsd2F5cyBtYXBwZWQgdG8gdGhlCisJICogZmlyc3QgaW50ZXJydXB0IHZlY3Rvci4gVGhlIG90aGVyIFJYIHF1ZXVlcyBhcmUgbWFwcGVkIHRvCisJICogdGhlIG90aGVyIChOIC0gMikgaW50ZXJydXB0IHZlY3RvcnMuCisJICovCisJdmFsID0gQklUKE1TSVhfRkhfSU5UX0NBVVNFU19RKDApKTsKKwlmb3IgKGlkeCA9IDE7IGlkeCA8IHRyYW5zLT5udW1fcnhfcXVldWVzOyBpZHgrKykgeworCQlpd2xfd3JpdGU4KHRyYW5zLCBDU1JfTVNJWF9SWF9JVkFSKGlkeCksCisJCQkgICBNU0lYX0ZIX0lOVF9DQVVTRVNfUShpZHggLSBvZmZzZXQpKTsKKwkJdmFsIHw9IEJJVChNU0lYX0ZIX0lOVF9DQVVTRVNfUShpZHgpKTsKKwl9CisJaXdsX3dyaXRlMzIodHJhbnMsIENTUl9NU0lYX0ZIX0lOVF9NQVNLX0FELCB+dmFsKTsKKworCXZhbCA9IE1TSVhfRkhfSU5UX0NBVVNFU19RKDApOworCWlmICh0cmFuc19wY2llLT5zaGFyZWRfdmVjX21hc2sgJiBJV0xfU0hBUkVEX0lSUV9OT05fUlgpCisJCXZhbCB8PSBNU0lYX05PTl9BVVRPX0NMRUFSX0NBVVNFOworCWl3bF93cml0ZTgodHJhbnMsIENTUl9NU0lYX1JYX0lWQVIoMCksIHZhbCk7CisKKwlpZiAodHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrICYgSVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTKQorCQlpd2xfd3JpdGU4KHRyYW5zLCBDU1JfTVNJWF9SWF9JVkFSKDEpLCB2YWwpOworfQorCiBzdGF0aWMgdm9pZCBpd2xfcGNpZV9pbml0X21zaXgoc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llKQogewotCXUzMiB2YWwsIG1heF9yeF92ZWN0b3IsIGk7CiAJc3RydWN0IGl3bF90cmFucyAqdHJhbnMgPSB0cmFuc19wY2llLT50cmFuczsKIAotCW1heF9yeF92ZWN0b3IgPSB0cmFuc19wY2llLT5hbGxvY2F0ZWRfdmVjdG9yIC0gMTsKLQogCWlmICghdHJhbnNfcGNpZS0+bXNpeF9lbmFibGVkKSB7CiAJCWlmICh0cmFucy0+Y2ZnLT5tcV9yeF9zdXBwb3J0ZWQpCiAJCQlpd2xfd3JpdGVfcHJwaCh0cmFucywgVVJFR19DSElDSywKQEAgLTE0MzcsMjUgKzE0OTEsMTYgQEAKIAlpd2xfd3JpdGVfcHJwaCh0cmFucywgVVJFR19DSElDSywgVVJFR19DSElDS19NU0lYX0VOQUJMRSk7CiAKIAkvKgotCSAqIEVhY2ggY2F1c2UgZnJvbSB0aGUgbGlzdCBhYm92ZSBhbmQgdGhlIFJYIGNhdXNlcyBpcyByZXByZXNlbnRlZCBhcwotCSAqIGEgYnl0ZSBpbiB0aGUgSVZBUiB0YWJsZS4gV2UgYWNjZXNzIHRoZSBmaXJzdCAoTiAtIDEpIGJ5dGVzIGFuZCBtYXAKLQkgKiB0aGVtIHRvIHRoZSAoTiAtIDEpIHZlY3RvcnMgc28gdGhlc2UgdmVjdG9ycyB3aWxsIGJlIHVzZWQgYXMgcngKLQkgKiB2ZWN0b3JzLiBUaGVuIGFjY2VzcyBhbGwgbm9uIHJ4IGNhdXNlcyBhbmQgbWFwIHRoZW0gdG8gdGhlCi0JICogZGVmYXVsdCBxdWV1ZSAoTid0aCBxdWV1ZSkuCisJICogRWFjaCBjYXVzZSBmcm9tIHRoZSBjYXVzZXMgbGlzdCBhYm92ZSBhbmQgdGhlIFJYIGNhdXNlcyBpcworCSAqIHJlcHJlc2VudGVkIGFzIGEgYnl0ZSBpbiB0aGUgSVZBUiB0YWJsZS4gVGhlIGZpcnN0IG5pYmJsZQorCSAqIHJlcHJlc2VudHMgdGhlIGJvdW5kIGludGVycnVwdCB2ZWN0b3Igb2YgdGhlIGNhdXNlLCB0aGUgc2Vjb25kCisJICogcmVwcmVzZW50cyBubyBhdXRvIGNsZWFyIGZvciB0aGlzIGNhdXNlLiBUaGlzIHdpbGwgYmUgc2V0IGlmIGl0cworCSAqIGludGVycnVwdCB2ZWN0b3IgaXMgYm91bmQgdG8gc2VydmUgb3RoZXIgY2F1c2VzLgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBtYXhfcnhfdmVjdG9yOyBpKyspIHsKLQkJaXdsX3dyaXRlOCh0cmFucywgQ1NSX01TSVhfUlhfSVZBUihpKSwgTVNJWF9GSF9JTlRfQ0FVU0VTX1EoaSkpOwotCQlpd2xfY2xlYXJfYml0KHRyYW5zLCBDU1JfTVNJWF9GSF9JTlRfTUFTS19BRCwKLQkJCSAgICAgIEJJVChNU0lYX0ZIX0lOVF9DQVVTRVNfUShpKSkpOwotCX0KKwlpd2xfcGNpZV9tYXBfcnhfY2F1c2VzKHRyYW5zKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNhdXNlc19saXN0KTsgaSsrKSB7Ci0JCXZhbCA9IHRyYW5zX3BjaWUtPmRlZmF1bHRfaXJxX251bSB8Ci0JCQlNU0lYX05PTl9BVVRPX0NMRUFSX0NBVVNFOwotCQlpd2xfd3JpdGU4KHRyYW5zLCBDU1JfTVNJWF9JVkFSKGNhdXNlc19saXN0W2ldLmFkZHIpLCB2YWwpOwotCQlpd2xfY2xlYXJfYml0KHRyYW5zLCBjYXVzZXNfbGlzdFtpXS5tYXNrX3JlZywKLQkJCSAgICAgIGNhdXNlc19saXN0W2ldLmNhdXNlX251bSk7Ci0JfQorCWl3bF9wY2llX21hcF9ub25fcnhfY2F1c2VzKHRyYW5zKTsKKwogCXRyYW5zX3BjaWUtPmZoX2luaXRfbWFzayA9CiAJCX5pd2xfcmVhZDMyKHRyYW5zLCBDU1JfTVNJWF9GSF9JTlRfTUFTS19BRCk7CiAJdHJhbnNfcGNpZS0+ZmhfbWFzayA9IHRyYW5zX3BjaWUtPmZoX2luaXRfbWFzazsKQEAgLTE0NjgsNDAgKzE1MTMsNTUgQEAKIAkJCQkJc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKKwlpbnQgbWF4X2lycXMsIG51bV9pcnFzLCBpLCByZXQsIG5yX29ubGluZV9jcHVzOwogCXUxNiBwY2lfY21kOwotCWludCBtYXhfdmVjdG9yOwotCWludCByZXQsIGk7CiAKLQlpZiAodHJhbnMtPmNmZy0+bXFfcnhfc3VwcG9ydGVkKSB7Ci0JCW1heF92ZWN0b3IgPSBtaW5fdCh1MzIsIChudW1fcG9zc2libGVfY3B1cygpICsgMiksCi0JCQkJICAgSVdMX01BWF9SWF9IV19RVUVVRVMpOwotCQlmb3IgKGkgPSAwOyBpIDwgbWF4X3ZlY3RvcjsgaSsrKQotCQkJdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKKwlpZiAoIXRyYW5zLT5jZmctPm1xX3J4X3N1cHBvcnRlZCkKKwkJZ290byBlbmFibGVfbXNpOwogCi0JCXJldCA9IHBjaV9lbmFibGVfbXNpeF9yYW5nZShwZGV2LCB0cmFuc19wY2llLT5tc2l4X2VudHJpZXMsCi0JCQkJCSAgICBNU0lYX01JTl9JTlRFUlJVUFRfVkVDVE9SUywKLQkJCQkJICAgIG1heF92ZWN0b3IpOwotCQlpZiAocmV0ID4gMSkgewotCQkJSVdMX0RFQlVHX0lORk8odHJhbnMsCi0JCQkJICAgICAgICJFbmFibGUgTVNJLVggYWxsb2NhdGUgJWQgaW50ZXJydXB0IHZlY3RvclxuIiwKLQkJCQkgICAgICAgcmV0KTsKLQkJCXRyYW5zX3BjaWUtPmFsbG9jYXRlZF92ZWN0b3IgPSByZXQ7Ci0JCQl0cmFuc19wY2llLT5kZWZhdWx0X2lycV9udW0gPQotCQkJCXRyYW5zX3BjaWUtPmFsbG9jYXRlZF92ZWN0b3IgLSAxOwotCQkJdHJhbnNfcGNpZS0+dHJhbnMtPm51bV9yeF9xdWV1ZXMgPQotCQkJCXRyYW5zX3BjaWUtPmFsbG9jYXRlZF92ZWN0b3IgLSAxOwotCQkJdHJhbnNfcGNpZS0+bXNpeF9lbmFibGVkID0gdHJ1ZTsKKwlucl9vbmxpbmVfY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpOworCW1heF9pcnFzID0gbWluX3QodTMyLCBucl9vbmxpbmVfY3B1cyArIDIsIElXTF9NQVhfUlhfSFdfUVVFVUVTKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2lycXM7IGkrKykKKwkJdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKIAotCQkJcmV0dXJuOwotCQl9CisJbnVtX2lycXMgPSBwY2lfZW5hYmxlX21zaXhfcmFuZ2UocGRldiwgdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzLAorCQkJCQkgTVNJWF9NSU5fSU5URVJSVVBUX1ZFQ1RPUlMsCisJCQkJCSBtYXhfaXJxcyk7CisJaWYgKG51bV9pcnFzIDwgMCkgewogCQlJV0xfREVCVUdfSU5GTyh0cmFucywKLQkJCSAgICAgICAicmV0ID0gJWQgJXMgbW92ZSB0byBtc2kgbW9kZVxuIiwgcmV0LAotCQkJICAgICAgIChyZXQgPT0gMSkgPwotCQkJICAgICAgICJjYW4ndCBhbGxvY2F0ZSBtb3JlIHRoYW4gMSBpbnRlcnJ1cHQgdmVjdG9yIiA6Ci0JCQkgICAgICAgImZhaWxlZCB0byBlbmFibGUgbXNpLXggbW9kZSIpOwotCQlwY2lfZGlzYWJsZV9tc2l4KHBkZXYpOworCQkJICAgICAgICJGYWlsZWQgdG8gZW5hYmxlIG1zaS14IG1vZGUgKHJldCAlZCkuIE1vdmluZyB0byBtc2kgbW9kZS5cbiIsCisJCQkgICAgICAgbnVtX2lycXMpOworCQlnb3RvIGVuYWJsZV9tc2k7CisJfQorCXRyYW5zX3BjaWUtPmRlZl9pcnEgPSAobnVtX2lycXMgPT0gbWF4X2lycXMpID8gbnVtX2lycXMgLSAxIDogMDsKKworCUlXTF9ERUJVR19JTkZPKHRyYW5zLAorCQkgICAgICAgIk1TSS1YIGVuYWJsZWQuICVkIGludGVycnVwdCB2ZWN0b3JzIHdlcmUgYWxsb2NhdGVkXG4iLAorCQkgICAgICAgbnVtX2lycXMpOworCisJLyoKKwkgKiBJbiBjYXNlIHRoZSBPUyBwcm92aWRlcyBmZXdlciBpbnRlcnJ1cHRzIHRoYW4gcmVxdWVzdGVkLCBkaWZmZXJlbnQKKwkgKiBjYXVzZXMgd2lsbCBzaGFyZSB0aGUgc2FtZSBpbnRlcnJ1cHQgdmVjdG9yIGFzIGZvbGxvd3M6CisJICogT25lIGludGVycnVwdCBsZXNzOiBub24gcnggY2F1c2VzIHNoYXJlZCB3aXRoIEZCUS4KKwkgKiBUd28gaW50ZXJydXB0cyBsZXNzOiBub24gcnggY2F1c2VzIHNoYXJlZCB3aXRoIEZCUSBhbmQgUlNTLgorCSAqIE1vcmUgdGhhbiB0d28gaW50ZXJydXB0czogd2Ugd2lsbCB1c2UgZmV3ZXIgUlNTIHF1ZXVlcy4KKwkgKi8KKwlpZiAobnVtX2lycXMgPD0gbnJfb25saW5lX2NwdXMpIHsKKwkJdHJhbnNfcGNpZS0+dHJhbnMtPm51bV9yeF9xdWV1ZXMgPSBudW1faXJxcyArIDE7CisJCXRyYW5zX3BjaWUtPnNoYXJlZF92ZWNfbWFzayA9IElXTF9TSEFSRURfSVJRX05PTl9SWCB8CisJCQlJV0xfU0hBUkVEX0lSUV9GSVJTVF9SU1M7CisJfSBlbHNlIGlmIChudW1faXJxcyA9PSBucl9vbmxpbmVfY3B1cyArIDEpIHsKKwkJdHJhbnNfcGNpZS0+dHJhbnMtPm51bV9yeF9xdWV1ZXMgPSBudW1faXJxczsKKwkJdHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrID0gSVdMX1NIQVJFRF9JUlFfTk9OX1JYOworCX0gZWxzZSB7CisJCXRyYW5zX3BjaWUtPnRyYW5zLT5udW1fcnhfcXVldWVzID0gbnVtX2lycXMgLSAxOwogCX0KIAorCXRyYW5zX3BjaWUtPmFsbG9jX3ZlY3MgPSBudW1faXJxczsKKwl0cmFuc19wY2llLT5tc2l4X2VuYWJsZWQgPSB0cnVlOworCXJldHVybjsKKworZW5hYmxlX21zaToKIAlyZXQgPSBwY2lfZW5hYmxlX21zaShwZGV2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaV9lbmFibGVfbXNpIGZhaWxlZCAtICVkXG4iLCByZXQpOwpAQCAtMTUxNCwzNiArMTU3NCw1NyBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgaXdsX3BjaWVfaXJxX3NldF9hZmZpbml0eShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlpbnQgaXRlcl9yeF9xLCBpLCByZXQsIGNwdSwgb2Zmc2V0OworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisKKwlpID0gdHJhbnNfcGNpZS0+c2hhcmVkX3ZlY19tYXNrICYgSVdMX1NIQVJFRF9JUlFfRklSU1RfUlNTID8gMCA6IDE7CisJaXRlcl9yeF9xID0gdHJhbnNfcGNpZS0+dHJhbnMtPm51bV9yeF9xdWV1ZXMgLSAxICsgaTsKKwlvZmZzZXQgPSAxICsgaTsKKwlmb3IgKDsgaSA8IGl0ZXJfcnhfcSA7IGkrKykgeworCQkvKgorCQkgKiBHZXQgdGhlIGNwdSBwcmlvciB0byB0aGUgcGxhY2UgdG8gc2VhcmNoCisJCSAqIChpLmUuIHJldHVybiB3aWxsIGJlID4gaSAtIDEpLgorCQkgKi8KKwkJY3B1ID0gY3B1bWFza19uZXh0KGkgLSBvZmZzZXQsIGNwdV9vbmxpbmVfbWFzayk7CisJCWNwdW1hc2tfc2V0X2NwdShjcHUsICZ0cmFuc19wY2llLT5hZmZpbml0eV9tYXNrW2ldKTsKKwkJcmV0ID0gaXJxX3NldF9hZmZpbml0eV9oaW50KHRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IsCisJCQkJCSAgICAmdHJhbnNfcGNpZS0+YWZmaW5pdHlfbWFza1tpXSk7CisJCWlmIChyZXQpCisJCQlJV0xfRVJSKHRyYW5zX3BjaWUtPnRyYW5zLAorCQkJCSJGYWlsZWQgdG8gc2V0IGFmZmluaXR5IG1hc2sgZm9yIElSUSAlZFxuIiwKKwkJCQlpKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgaXdsX3BjaWVfaW5pdF9tc2l4X2hhbmRsZXIoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgICAgc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llKQogewotCWludCBpLCBsYXN0X3ZlY3RvcjsKKwlpbnQgaTsKIAotCWxhc3RfdmVjdG9yID0gdHJhbnNfcGNpZS0+dHJhbnMtPm51bV9yeF9xdWV1ZXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdHJhbnNfcGNpZS0+YWxsb2NhdGVkX3ZlY3RvcjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHRyYW5zX3BjaWUtPmFsbG9jX3ZlY3M7IGkrKykgewogCQlpbnQgcmV0OworCQlzdHJ1Y3QgbXNpeF9lbnRyeSAqbXNpeF9lbnRyeTsKIAotCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh0cmFuc19wY2llLT5tc2l4X2VudHJpZXNbaV0udmVjdG9yLAotCQkJCQkgICBpd2xfcGNpZV9tc2l4X2lzciwKLQkJCQkJICAgKGkgPT0gbGFzdF92ZWN0b3IpID8KLQkJCQkJICAgaXdsX3BjaWVfaXJxX21zaXhfaGFuZGxlciA6Ci0JCQkJCSAgIGl3bF9wY2llX2lycV9yeF9tc2l4X2hhbmRsZXIsCi0JCQkJCSAgIElSUUZfU0hBUkVELAotCQkJCQkgICBEUlZfTkFNRSwKLQkJCQkJICAgJnRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tpXSk7CisJCW1zaXhfZW50cnkgPSAmdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldOworCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZwZGV2LT5kZXYsCisJCQkJCQltc2l4X2VudHJ5LT52ZWN0b3IsCisJCQkJCQlpd2xfcGNpZV9tc2l4X2lzciwKKwkJCQkJCShpID09IHRyYW5zX3BjaWUtPmRlZl9pcnEpID8KKwkJCQkJCWl3bF9wY2llX2lycV9tc2l4X2hhbmRsZXIgOgorCQkJCQkJaXdsX3BjaWVfaXJxX3J4X21zaXhfaGFuZGxlciwKKwkJCQkJCUlSUUZfU0hBUkVELAorCQkJCQkJRFJWX05BTUUsCisJCQkJCQltc2l4X2VudHJ5KTsKIAkJaWYgKHJldCkgewotCQkJaW50IGo7Ci0KIAkJCUlXTF9FUlIodHJhbnNfcGNpZS0+dHJhbnMsCiAJCQkJIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkXG4iLCBpKTsKLQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCQkJZnJlZV9pcnEodHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2pdLnZlY3RvciwKLQkJCQkJICZ0cmFuc19wY2llLT5tc2l4X2VudHJpZXNbal0pOwotCQkJcGNpX2Rpc2FibGVfbXNpeChwZGV2KTsKKwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KKwlpd2xfcGNpZV9pcnFfc2V0X2FmZmluaXR5KHRyYW5zX3BjaWUtPnRyYW5zKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTY3Miw3ICsxNzUzLDYgQEAKIAl0cmFuc19wY2llLT5yeF9wYWdlX29yZGVyID0KIAkJaXdsX3RyYW5zX2dldF9yYl9zaXplX29yZGVyKHRyYW5zX3BjaWUtPnJ4X2J1Zl9zaXplKTsKIAotCXRyYW5zX3BjaWUtPndpZGVfY21kX2hlYWRlciA9IHRyYW5zX2NmZy0+d2lkZV9jbWRfaGVhZGVyOwogCXRyYW5zX3BjaWUtPmJjX3RhYmxlX2R3b3JkID0gdHJhbnNfY2ZnLT5iY190YWJsZV9kd29yZDsKIAl0cmFuc19wY2llLT5zY2Rfc2V0X2FjdGl2ZSA9IHRyYW5zX2NmZy0+c2NkX3NldF9hY3RpdmU7CiAJdHJhbnNfcGNpZS0+c3dfY3N1bV90eCA9IHRyYW5zX2NmZy0+c3dfY3N1bV90eDsKQEAgLTE3MDMsMjIgKzE3ODMsMTYgQEAKIAlpd2xfcGNpZV9yeF9mcmVlKHRyYW5zKTsKIAogCWlmICh0cmFuc19wY2llLT5tc2l4X2VuYWJsZWQpIHsKLQkJZm9yIChpID0gMDsgaSA8IHRyYW5zX3BjaWUtPmFsbG9jYXRlZF92ZWN0b3I7IGkrKykKLQkJCWZyZWVfaXJxKHRyYW5zX3BjaWUtPm1zaXhfZW50cmllc1tpXS52ZWN0b3IsCi0JCQkJICZ0cmFuc19wY2llLT5tc2l4X2VudHJpZXNbaV0pOworCQlmb3IgKGkgPSAwOyBpIDwgdHJhbnNfcGNpZS0+YWxsb2NfdmVjczsgaSsrKSB7CisJCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoCisJCQkJdHJhbnNfcGNpZS0+bXNpeF9lbnRyaWVzW2ldLnZlY3RvciwKKwkJCQlOVUxMKTsKKwkJfQogCi0JCXBjaV9kaXNhYmxlX21zaXgodHJhbnNfcGNpZS0+cGNpX2Rldik7CiAJCXRyYW5zX3BjaWUtPm1zaXhfZW5hYmxlZCA9IGZhbHNlOwogCX0gZWxzZSB7Ci0JCWZyZWVfaXJxKHRyYW5zX3BjaWUtPnBjaV9kZXYtPmlycSwgdHJhbnMpOwotCiAJCWl3bF9wY2llX2ZyZWVfaWN0KHRyYW5zKTsKLQotCQlwY2lfZGlzYWJsZV9tc2kodHJhbnNfcGNpZS0+cGNpX2Rldik7CiAJfQotCWlvdW5tYXAodHJhbnNfcGNpZS0+aHdfYmFzZSk7Ci0JcGNpX3JlbGVhc2VfcmVnaW9ucyh0cmFuc19wY2llLT5wY2lfZGV2KTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UodHJhbnNfcGNpZS0+cGNpX2Rldik7CiAKIAlpd2xfcGNpZV9mcmVlX2Z3X21vbml0b3IodHJhbnMpOwogCkBAIC0xODkwLDcgKzE5NjQsNyBAQAogCiAJCXR4cS0+ZnJvemVuID0gZnJlZXplOwogCi0JCWlmICh0eHEtPnEucmVhZF9wdHIgPT0gdHhxLT5xLndyaXRlX3B0cikKKwkJaWYgKHR4cS0+cmVhZF9wdHIgPT0gdHhxLT53cml0ZV9wdHIpCiAJCQlnb3RvIG5leHRfcXVldWU7CiAKIAkJaWYgKGZyZWV6ZSkgewpAQCAtMTkzOCw3ICsyMDEyLDcgQEAKIAkJCXR4cS0+YmxvY2stLTsKIAkJCWlmICghdHhxLT5ibG9jaykgewogCQkJCWl3bF93cml0ZTMyKHRyYW5zLCBIQlVTX1RBUkdfV1JQVFIsCi0JCQkJCSAgICB0eHEtPnEud3JpdGVfcHRyIHwgKGkgPDwgOCkpOworCQkJCQkgICAgdHhxLT53cml0ZV9wdHIgfCAoaSA8PCA4KSk7CiAJCQl9CiAJCX0gZWxzZSBpZiAoYmxvY2spIHsKIAkJCXR4cS0+YmxvY2srKzsKQEAgLTE5NTgsMTAgKzIwMzIsMTQgQEAKIAlpbnQgY250OwogCiAJSVdMX0VSUih0cmFucywgIkN1cnJlbnQgU1cgcmVhZF9wdHIgJWQgd3JpdGVfcHRyICVkXG4iLAotCQl0eHEtPnEucmVhZF9wdHIsIHR4cS0+cS53cml0ZV9wdHIpOworCQl0eHEtPnJlYWRfcHRyLCB0eHEtPndyaXRlX3B0cik7CisKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkKKwkJLyogVE9ETzogYWNjZXNzIG5ldyBTQ0QgcmVnaXN0ZXJzIGFuZCBkdW1wIHRoZW0gKi8KKwkJcmV0dXJuOwogCiAJc2NkX3NyYW1fYWRkciA9IHRyYW5zX3BjaWUtPnNjZF9iYXNlX2FkZHIgKwotCQkJU0NEX1RYX1NUVFNfUVVFVUVfT0ZGU0VUKHR4cS0+cS5pZCk7CisJCQlTQ0RfVFhfU1RUU19RVUVVRV9PRkZTRVQodHhxLT5pZCk7CiAJaXdsX3RyYW5zX3JlYWRfbWVtX2J5dGVzKHRyYW5zLCBzY2Rfc3JhbV9hZGRyLCBidWYsIHNpemVvZihidWYpKTsKIAogCWl3bF9wcmludF9oZXhfZXJyb3IodHJhbnMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwpAQCAtMTk5Niw3ICsyMDc0LDYgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHE7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcTsKIAlpbnQgY250OwogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAlpbnQgcmV0ID0gMDsKQEAgLTIwMTQsMTMgKzIwOTEsMTIgQEAKIAogCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiRW1wdHlpbmcgcXVldWUgJWQuLi5cbiIsIGNudCk7CiAJCXR4cSA9ICZ0cmFuc19wY2llLT50eHFbY250XTsKLQkJcSA9ICZ0eHEtPnE7Ci0JCXdyX3B0ciA9IEFDQ0VTU19PTkNFKHEtPndyaXRlX3B0cik7CisJCXdyX3B0ciA9IEFDQ0VTU19PTkNFKHR4cS0+d3JpdGVfcHRyKTsKIAotCQl3aGlsZSAocS0+cmVhZF9wdHIgIT0gQUNDRVNTX09OQ0UocS0+d3JpdGVfcHRyKSAmJgorCQl3aGlsZSAodHhxLT5yZWFkX3B0ciAhPSBBQ0NFU1NfT05DRSh0eHEtPndyaXRlX3B0cikgJiYKIAkJICAgICAgICF0aW1lX2FmdGVyKGppZmZpZXMsCiAJCQkJICAgbm93ICsgbXNlY3NfdG9famlmZmllcyhJV0xfRkxVU0hfV0FJVF9NUykpKSB7Ci0JCQl1OCB3cml0ZV9wdHIgPSBBQ0NFU1NfT05DRShxLT53cml0ZV9wdHIpOworCQkJdTggd3JpdGVfcHRyID0gQUNDRVNTX09OQ0UodHhxLT53cml0ZV9wdHIpOwogCiAJCQlpZiAoV0FSTl9PTkNFKHdyX3B0ciAhPSB3cml0ZV9wdHIsCiAJCQkJICAgICAgIldSIHBvaW50ZXIgbW92ZWQgd2hpbGUgZmx1c2hpbmcgJWQgLT4gJWRcbiIsCkBAIC0yMDI5LDcgKzIxMDUsNyBAQAogCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogCQl9CiAKLQkJaWYgKHEtPnJlYWRfcHRyICE9IHEtPndyaXRlX3B0cikgeworCQlpZiAodHhxLT5yZWFkX3B0ciAhPSB0eHEtPndyaXRlX3B0cikgewogCQkJSVdMX0VSUih0cmFucywKIAkJCQkiZmFpbCB0byBmbHVzaCBhbGwgdHggZmlmbyBxdWV1ZXMgUSAlZFxuIiwgY250KTsKIAkJCXJldCA9IC1FVElNRURPVVQ7CkBAIC0yMTk3LDcgKzIyNzMsNiBAQAogCXN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAJc3RydWN0IGl3bF90eHEgKnR4cTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxOwogCWNoYXIgKmJ1ZjsKIAlpbnQgcG9zID0gMDsKIAlpbnQgY250OwpAQCAtMjIxNSwxMCArMjI5MCw5IEBACiAKIAlmb3IgKGNudCA9IDA7IGNudCA8IHRyYW5zLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOyBjbnQrKykgewogCQl0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW2NudF07Ci0JCXEgPSAmdHhxLT5xOwogCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCiAJCQkJImh3cSAlLjJkOiByZWFkPSV1IHdyaXRlPSV1IHVzZT0lZCBzdG9wPSVkIG5lZWRfdXBkYXRlPSVkIGZyb3plbj0lZCVzXG4iLAotCQkJCWNudCwgcS0+cmVhZF9wdHIsIHEtPndyaXRlX3B0ciwKKwkJCQljbnQsIHR4cS0+cmVhZF9wdHIsIHR4cS0+d3JpdGVfcHRyLAogCQkJCSEhdGVzdF9iaXQoY250LCB0cmFuc19wY2llLT5xdWV1ZV91c2VkKSwKIAkJCQkgISF0ZXN0X2JpdChjbnQsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpLAogCQkJCSB0eHEtPm5lZWRfdXBkYXRlLCB0eHEtPmZyb3plbiwKQEAgLTI0MjQsMTMgKzI0OTgsMTQgQEAKIH0KICNlbmRpZiAvKkNPTkZJR19JV0xXSUZJX0RFQlVHRlMgKi8KIAotc3RhdGljIHUzMiBpd2xfdHJhbnNfcGNpZV9nZXRfY21kbGVuKHN0cnVjdCBpd2xfdGZkICp0ZmQpCitzdGF0aWMgdTMyIGl3bF90cmFuc19wY2llX2dldF9jbWRsZW4oc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHZvaWQgKnRmZCkKIHsKKwlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXUzMiBjbWRsZW4gPSAwOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IElXTF9OVU1fT0ZfVEJTOyBpKyspCi0JCWNtZGxlbiArPSBpd2xfcGNpZV90ZmRfdGJfZ2V0X2xlbih0ZmQsIGkpOworCWZvciAoaSA9IDA7IGkgPCB0cmFuc19wY2llLT5tYXhfdGJzOyBpKyspCisJCWNtZGxlbiArPSBpd2xfcGNpZV90ZmRfdGJfZ2V0X2xlbih0cmFucywgdGZkLCBpKTsKIAogCXJldHVybiBjbWRsZW47CiB9CkBAIC0yNjQ1LDcgKzI3MjAsNyBAQAogCiAJLyogaG9zdCBjb21tYW5kcyAqLwogCWxlbiArPSBzaXplb2YoKmRhdGEpICsKLQkJY21kcS0+cS5uX3dpbmRvdyAqIChzaXplb2YoKnR4Y21kKSArIFRGRF9NQVhfUEFZTE9BRF9TSVpFKTsKKwkJY21kcS0+bl93aW5kb3cgKiAoc2l6ZW9mKCp0eGNtZCkgKyBURkRfTUFYX1BBWUxPQURfU0laRSk7CiAKIAkvKiBGVyBtb25pdG9yICovCiAJaWYgKHRyYW5zX3BjaWUtPmZ3X21vbl9wYWdlKSB7CkBAIC0yNzEzLDEyICsyNzg4LDEzIEBACiAJZGF0YS0+dHlwZSA9IGNwdV90b19sZTMyKElXTF9GV19FUlJPUl9EVU1QX1RYQ01EKTsKIAl0eGNtZCA9ICh2b2lkICopZGF0YS0+ZGF0YTsKIAlzcGluX2xvY2tfYmgoJmNtZHEtPmxvY2spOwotCXB0ciA9IGNtZHEtPnEud3JpdGVfcHRyOwotCWZvciAoaSA9IDA7IGkgPCBjbWRxLT5xLm5fd2luZG93OyBpKyspIHsKLQkJdTggaWR4ID0gZ2V0X2NtZF9pbmRleCgmY21kcS0+cSwgcHRyKTsKKwlwdHIgPSBjbWRxLT53cml0ZV9wdHI7CisJZm9yIChpID0gMDsgaSA8IGNtZHEtPm5fd2luZG93OyBpKyspIHsKKwkJdTggaWR4ID0gZ2V0X2NtZF9pbmRleChjbWRxLCBwdHIpOwogCQl1MzIgY2FwbGVuLCBjbWRsZW47CiAKLQkJY21kbGVuID0gaXdsX3RyYW5zX3BjaWVfZ2V0X2NtZGxlbigmY21kcS0+dGZkc1twdHJdKTsKKwkJY21kbGVuID0gaXdsX3RyYW5zX3BjaWVfZ2V0X2NtZGxlbih0cmFucywgY21kcS0+dGZkcyArCisJCQkJCQkgICB0cmFuc19wY2llLT50ZmRfc2l6ZSAqIHB0cik7CiAJCWNhcGxlbiA9IG1pbl90KHUzMiwgVEZEX01BWF9QQVlMT0FEX1NJWkUsIGNtZGxlbik7CiAKIAkJaWYgKGNtZGxlbikgewpAQCAtMjc4OCw2ICsyODY0LDggQEAKIAkudHhxX2Rpc2FibGUgPSBpd2xfdHJhbnNfcGNpZV90eHFfZGlzYWJsZSwKIAkudHhxX2VuYWJsZSA9IGl3bF90cmFuc19wY2llX3R4cV9lbmFibGUsCiAKKwkuZ2V0X3R4cV9ieXRlX3RhYmxlID0gaXdsX3RyYW5zX3BjaWVfZ2V0X3R4cV9ieXRlX3RhYmxlLAorCiAJLnR4cV9zZXRfc2hhcmVkX21vZGUgPSBpd2xfdHJhbnNfcGNpZV90eHFfc2V0X3NoYXJlZF9tb2RlLAogCiAJLndhaXRfdHhfcXVldWVfZW1wdHkgPSBpd2xfdHJhbnNfcGNpZV93YWl0X3R4cV9lbXB0eSwKQEAgLTI4MjEsMTMgKzI4OTksMTUgQEAKIAlzdHJ1Y3QgaXdsX3RyYW5zICp0cmFuczsKIAlpbnQgcmV0LCBhZGRyX3NpemU7CiAKKwlyZXQgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwogCXRyYW5zID0gaXdsX3RyYW5zX2FsbG9jKHNpemVvZihzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUpLAogCQkJCSZwZGV2LT5kZXYsIGNmZywgJnRyYW5zX29wc19wY2llLCAwKTsKIAlpZiAoIXRyYW5zKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCXRyYW5zLT5tYXhfc2tiX2ZyYWdzID0gSVdMX1BDSUVfTUFYX0ZSQUdTOwotCiAJdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKIAl0cmFuc19wY2llLT50cmFucyA9IHRyYW5zOwpAQCAtMjg0MSw5ICsyOTIxLDYgQEAKIAkJZ290byBvdXRfbm9fcGNpOwogCX0KIAotCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X25vX3BjaTsKIAogCWlmICghY2ZnLT5iYXNlX3BhcmFtcy0+cGNpZV9sMV9hbGxvd2VkKSB7CiAJCS8qCkBAIC0yODYxLDYgKzI5MzgsMTYgQEAKIAllbHNlCiAJCWFkZHJfc2l6ZSA9IDM2OwogCisJaWYgKGNmZy0+dXNlX3RmaCkgeworCQl0cmFuc19wY2llLT5tYXhfdGJzID0gSVdMX1RGSF9OVU1fVEJTOworCQl0cmFuc19wY2llLT50ZmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3RmaF90ZmQpOworCisJfSBlbHNlIHsKKwkJdHJhbnNfcGNpZS0+bWF4X3RicyA9IElXTF9OVU1fT0ZfVEJTOworCQl0cmFuc19wY2llLT50ZmRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3RmZCk7CisJfQorCXRyYW5zLT5tYXhfc2tiX2ZyYWdzID0gSVdMX1BDSUVfTUFYX0ZSQUdTKHRyYW5zX3BjaWUpOworCiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAKIAlyZXQgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyhhZGRyX3NpemUpKTsKQEAgLTI4NzUsMjEgKzI5NjIsMjEgQEAKIAkJLyogYm90aCBhdHRlbXB0cyBmYWlsZWQ6ICovCiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGVcbiIpOwotCQkJZ290byBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOworCQkJZ290byBvdXRfbm9fcGNpOwogCQl9CiAJfQogCi0JcmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7CisJcmV0ID0gcGNpbV9pb21hcF9yZWdpb25zX3JlcXVlc3RfYWxsKHBkZXYsIEJJVCgwKSwgRFJWX05BTUUpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX3JlcXVlc3RfcmVnaW9ucyBmYWlsZWRcbiIpOwotCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaW1faW9tYXBfcmVnaW9uc19yZXF1ZXN0X2FsbCBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9ub19wY2k7CiAJfQogCi0JdHJhbnNfcGNpZS0+aHdfYmFzZSA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKKwl0cmFuc19wY2llLT5od19iYXNlID0gcGNpbV9pb21hcF90YWJsZShwZGV2KVswXTsKIAlpZiAoIXRyYW5zX3BjaWUtPmh3X2Jhc2UpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX2lvcmVtYXBfYmFyIGZhaWxlZFxuIik7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBjaW1faW9tYXBfdGFibGUgZmFpbGVkXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczsKKwkJZ290byBvdXRfbm9fcGNpOwogCX0KIAogCS8qIFdlIGRpc2FibGUgdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgKDB4NDEpIHRvIGtlZXAKQEAgLTI5MTYsNyArMzAwMyw3IEBACiAJCXJldCA9IGl3bF9wY2llX3ByZXBhcmVfY2FyZF9odyh0cmFucyk7CiAJCWlmIChyZXQpIHsKIAkJCUlXTF9XQVJOKHRyYW5zLCAiRXhpdCBIVyBub3QgcmVhZHlcbiIpOwotCQkJZ290byBvdXRfcGNpX2Rpc2FibGVfbXNpOworCQkJZ290byBvdXRfbm9fcGNpOwogCQl9CiAKIAkJLyoKQEAgLTI5MzMsNyArMzAyMCw3IEBACiAJCQkJICAgMjUwMDApOwogCQlpZiAocmV0IDwgMCkgewogCQkJSVdMX0RFQlVHX0lORk8odHJhbnMsICJGYWlsZWQgdG8gd2FrZSB1cCB0aGUgbmljXG4iKTsKLQkJCWdvdG8gb3V0X3BjaV9kaXNhYmxlX21zaTsKKwkJCWdvdG8gb3V0X25vX3BjaTsKIAkJfQogCiAJCWlmIChpd2xfdHJhbnNfZ3JhYl9uaWNfYWNjZXNzKHRyYW5zLCAmZmxhZ3MpKSB7CkBAIC0yOTY1LDE1ICszMDUyLDE2IEBACiAKIAlpZiAodHJhbnNfcGNpZS0+bXNpeF9lbmFibGVkKSB7CiAJCWlmIChpd2xfcGNpZV9pbml0X21zaXhfaGFuZGxlcihwZGV2LCB0cmFuc19wY2llKSkKLQkJCWdvdG8gb3V0X3BjaV9yZWxlYXNlX3JlZ2lvbnM7CisJCQlnb3RvIG91dF9ub19wY2k7CiAJIH0gZWxzZSB7CiAJCXJldCA9IGl3bF9wY2llX2FsbG9jX2ljdCh0cmFucyk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9tc2k7CisJCQlnb3RvIG91dF9ub19wY2k7CiAKLQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocGRldi0+aXJxLCBpd2xfcGNpZV9pc3IsCi0JCQkJCSAgIGl3bF9wY2llX2lycV9oYW5kbGVyLAotCQkJCQkgICBJUlFGX1NIQVJFRCwgRFJWX05BTUUsIHRyYW5zKTsKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmcGRldi0+ZGV2LCBwZGV2LT5pcnEsCisJCQkJCQlpd2xfcGNpZV9pc3IsCisJCQkJCQlpd2xfcGNpZV9pcnFfaGFuZGxlciwKKwkJCQkJCUlSUUZfU0hBUkVELCBEUlZfTkFNRSwgdHJhbnMpOwogCQlpZiAocmV0KSB7CiAJCQlJV0xfRVJSKHRyYW5zLCAiRXJyb3IgYWxsb2NhdGluZyBJUlEgJWRcbiIsIHBkZXYtPmlycSk7CiAJCQlnb3RvIG91dF9mcmVlX2ljdDsKQEAgLTI5OTEsMTIgKzMwNzksNiBAQAogCiBvdXRfZnJlZV9pY3Q6CiAJaXdsX3BjaWVfZnJlZV9pY3QodHJhbnMpOwotb3V0X3BjaV9kaXNhYmxlX21zaToKLQlwY2lfZGlzYWJsZV9tc2kocGRldik7Ci1vdXRfcGNpX3JlbGVhc2VfcmVnaW9uczoKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotb3V0X3BjaV9kaXNhYmxlX2RldmljZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiBvdXRfbm9fcGNpOgogCWZyZWVfcGVyY3B1KHRyYW5zX3BjaWUtPnRzb19oZHJfcGFnZSk7CiAJaXdsX3RyYW5zX2ZyZWUodHJhbnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZWwvaXdsd2lmaS9wY2llL3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvdHguYwppbmRleCAxODY1MGRjLi5lOWEyNzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlbC9pd2x3aWZpL3BjaWUvdHguYwpAQCAtNzEsNyArNzEsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQgaXdsX3F1ZXVlX3NwYWNlKGNvbnN0IHN0cnVjdCBpd2xfcXVldWUgKnEpCitzdGF0aWMgaW50IGl3bF9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaXdsX3R4cSAqcSkKIHsKIAl1bnNpZ25lZCBpbnQgbWF4OwogCXVuc2lnbmVkIGludCB1c2VkOwpAQCAtMTAyLDcgKzEwMiw3IEBACiAvKgogICogaXdsX3F1ZXVlX2luaXQgLSBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgYW5kIHJlYWQvd3JpdGUgaW5kZXhlcwogICovCi1zdGF0aWMgaW50IGl3bF9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfcXVldWUgKnEsIGludCBzbG90c19udW0sIHUzMiBpZCkKK3N0YXRpYyBpbnQgaXdsX3F1ZXVlX2luaXQoc3RydWN0IGl3bF90eHEgKnEsIGludCBzbG90c19udW0sIHUzMiBpZCkKIHsKIAlxLT5uX3dpbmRvdyA9IHNsb3RzX251bTsKIAlxLT5pZCA9IGlkOwpAQCAtMTU4LDEzICsxNTgsMTMgQEAKIAogCXNwaW5fbG9jaygmdHhxLT5sb2NrKTsKIAkvKiBjaGVjayBpZiB0cmlnZ2VyZWQgZXJyb25lb3VzbHkgKi8KLQlpZiAodHhxLT5xLnJlYWRfcHRyID09IHR4cS0+cS53cml0ZV9wdHIpIHsKKwlpZiAodHhxLT5yZWFkX3B0ciA9PSB0eHEtPndyaXRlX3B0cikgewogCQlzcGluX3VubG9jaygmdHhxLT5sb2NrKTsKIAkJcmV0dXJuOwogCX0KIAlzcGluX3VubG9jaygmdHhxLT5sb2NrKTsKIAotCUlXTF9FUlIodHJhbnMsICJRdWV1ZSAlZCBzdHVjayBmb3IgJXUgbXMuXG4iLCB0eHEtPnEuaWQsCisJSVdMX0VSUih0cmFucywgIlF1ZXVlICVkIHN0dWNrIGZvciAldSBtcy5cbiIsIHR4cS0+aWQsCiAJCWppZmZpZXNfdG9fbXNlY3ModHhxLT53ZF90aW1lb3V0KSk7CiAKIAlpd2xfdHJhbnNfcGNpZV9sb2dfc2NkX2Vycm9yKHRyYW5zLCB0eHEpOwpAQCAtMTc2LDIyICsxNzYsMjEgQEAKICAqIGl3bF9wY2llX3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsIC0gU2V0IHVwIGVudHJ5IGluIFR4IGJ5dGUtY291bnQgYXJyYXkKICAqLwogc3RhdGljIHZvaWQgaXdsX3BjaWVfdHhxX3VwZGF0ZV9ieXRlX2NudF90Ymwoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkJCSAgICAgc3RydWN0IGl3bF90eHEgKnR4cSwgdTE2IGJ5dGVfY250KQorCQkJCQkgICAgIHN0cnVjdCBpd2xfdHhxICp0eHEsIHUxNiBieXRlX2NudCwKKwkJCQkJICAgICBpbnQgbnVtX3RicykKIHsKIAlzdHJ1Y3QgaXdsYWduX3NjZF9iY190YmwgKnNjZF9iY190Ymw7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKLQlpbnQgd3JpdGVfcHRyID0gdHhxLT5xLndyaXRlX3B0cjsKLQlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOworCWludCB3cml0ZV9wdHIgPSB0eHEtPndyaXRlX3B0cjsKKwlpbnQgdHhxX2lkID0gdHhxLT5pZDsKIAl1OCBzZWNfY3RsID0gMDsKLQl1OCBzdGFfaWQgPSAwOwogCXUxNiBsZW4gPSBieXRlX2NudCArIElXTF9UWF9DUkNfU0laRSArIElXTF9UWF9ERUxJTUlURVJfU0laRTsKIAlfX2xlMTYgYmNfZW50OwogCXN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQgPQotCQkodm9pZCAqKSB0eHEtPmVudHJpZXNbdHhxLT5xLndyaXRlX3B0cl0uY21kLT5wYXlsb2FkOworCQkodm9pZCAqKXR4cS0+ZW50cmllc1t0eHEtPndyaXRlX3B0cl0uY21kLT5wYXlsb2FkOwogCiAJc2NkX2JjX3RibCA9IHRyYW5zX3BjaWUtPnNjZF9iY190YmxzLmFkZHI7CiAKLQlzdGFfaWQgPSB0eF9jbWQtPnN0YV9pZDsKIAlzZWNfY3RsID0gdHhfY21kLT5zZWNfY3RsOwogCiAJc3dpdGNoIChzZWNfY3RsICYgVFhfQ01EX1NFQ19NU0spIHsKQEAgLTIwNSwxNCArMjA0LDMyIEBACiAJCWxlbiArPSBJRUVFODAyMTFfV0VQX0lWX0xFTiArIElFRUU4MDIxMV9XRVBfSUNWX0xFTjsKIAkJYnJlYWs7CiAJfQotCiAJaWYgKHRyYW5zX3BjaWUtPmJjX3RhYmxlX2R3b3JkKQogCQlsZW4gPSBESVZfUk9VTkRfVVAobGVuLCA0KTsKIAogCWlmIChXQVJOX09OKGxlbiA+IDB4RkZGIHx8IHdyaXRlX3B0ciA+PSBURkRfUVVFVUVfU0laRV9NQVgpKQogCQlyZXR1cm47CiAKLQliY19lbnQgPSBjcHVfdG9fbGUxNihsZW4gfCAoc3RhX2lkIDw8IDEyKSk7CisJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpIHsKKwkJdTggZmlsbGVkX3RmZF9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IGl3bF90ZmhfdGZkLCB0YnMpICsKKwkJCQkgICAgIG51bV90YnMgKiBzaXplb2Yoc3RydWN0IGl3bF90ZmhfdGIpOworCQkvKgorCQkgKiBmaWxsZWRfdGZkX3NpemUgY29udGFpbnMgdGhlIG51bWJlciBvZiBmaWxsZWQgYnl0ZXMgaW4gdGhlCisJCSAqIFRGRC4KKwkJICogRGl2aWRpbmcgaXQgYnkgNjQgd2lsbCBnaXZlIHRoZSBudW1iZXIgb2YgY2h1bmtzIHRvIGZldGNoCisJCSAqIHRvIFNSQU0tIDAgZm9yIG9uZSBjaHVuaywgMSBmb3IgMiBhbmQgc28gb24uCisJCSAqIElmLCBmb3IgZXhhbXBsZSwgVEZEIGNvbnRhaW5zIG9ubHkgMyBUQnMgdGhlbiAzMiBieXRlcworCQkgKiBvZiB0aGUgVEZEIGFyZSB1c2VkLCBhbmQgb25seSBvbmUgY2h1bmsgb2YgNjQgYnl0ZXMgc2hvdWxkCisJCSAqIGJlIGZldGNoZWQKKwkJICovCisJCXU4IG51bV9mZXRjaF9jaHVua3MgPSBESVZfUk9VTkRfVVAoZmlsbGVkX3RmZF9zaXplLCA2NCkgLSAxOworCisJCWJjX2VudCA9IGNwdV90b19sZTE2KGxlbiB8IChudW1fZmV0Y2hfY2h1bmtzIDw8IDEyKSk7CisJfSBlbHNlIHsKKwkJdTggc3RhX2lkID0gdHhfY21kLT5zdGFfaWQ7CisKKwkJYmNfZW50ID0gY3B1X3RvX2xlMTYobGVuIHwgKHN0YV9pZCA8PCAxMikpOworCX0KIAogCXNjZF9iY190YmxbdHhxX2lkXS50ZmRfb2Zmc2V0W3dyaXRlX3B0cl0gPSBiY19lbnQ7CiAKQEAgLTIyNywxMiArMjQ0LDEyIEBACiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0KIAkJSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAlzdHJ1Y3QgaXdsYWduX3NjZF9iY190YmwgKnNjZF9iY190YmwgPSB0cmFuc19wY2llLT5zY2RfYmNfdGJscy5hZGRyOwotCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7Ci0JaW50IHJlYWRfcHRyID0gdHhxLT5xLnJlYWRfcHRyOworCWludCB0eHFfaWQgPSB0eHEtPmlkOworCWludCByZWFkX3B0ciA9IHR4cS0+cmVhZF9wdHI7CiAJdTggc3RhX2lkID0gMDsKIAlfX2xlMTYgYmNfZW50OwogCXN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQgPQotCQkodm9pZCAqKXR4cS0+ZW50cmllc1t0eHEtPnEucmVhZF9wdHJdLmNtZC0+cGF5bG9hZDsKKwkJKHZvaWQgKil0eHEtPmVudHJpZXNbcmVhZF9wdHJdLmNtZC0+cGF5bG9hZDsKIAogCVdBUk5fT04ocmVhZF9wdHIgPj0gVEZEX1FVRVVFX1NJWkVfTUFYKTsKIApAQCAtMjQwLDYgKzI1Nyw3IEBACiAJCXN0YV9pZCA9IHR4X2NtZC0+c3RhX2lkOwogCiAJYmNfZW50ID0gY3B1X3RvX2xlMTYoMSB8IChzdGFfaWQgPDwgMTIpKTsKKwogCXNjZF9iY190YmxbdHhxX2lkXS50ZmRfb2Zmc2V0W3JlYWRfcHRyXSA9IGJjX2VudDsKIAogCWlmIChyZWFkX3B0ciA8IFRGRF9RVUVVRV9TSVpFX0JDX0RVUCkKQEAgLTI1NSw3ICsyNzMsNyBAQAogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAJdTMyIHJlZyA9IDA7Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKKwlpbnQgdHhxX2lkID0gdHhxLT5pZDsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnR4cS0+bG9jayk7CiAKQEAgLTI4OSwxMCArMzA3LDEwIEBACiAJICogaWYgbm90IGluIHBvd2VyLXNhdmUgbW9kZSwgdUNvZGUgd2lsbCBuZXZlciBzbGVlcCB3aGVuIHdlJ3JlCiAJICogdHJ5aW5nIHRvIHR4IChkdXJpbmcgUkZLSUxMLCB3ZSdyZSBub3QgdHJ5aW5nIHRvIHR4KS4KIAkgKi8KLQlJV0xfREVCVUdfVFgodHJhbnMsICJROiVkIFdSOiAweCV4XG4iLCB0eHFfaWQsIHR4cS0+cS53cml0ZV9wdHIpOworCUlXTF9ERUJVR19UWCh0cmFucywgIlE6JWQgV1I6IDB4JXhcbiIsIHR4cV9pZCwgdHhxLT53cml0ZV9wdHIpOwogCWlmICghdHhxLT5ibG9jaykKIAkJaXdsX3dyaXRlMzIodHJhbnMsIEhCVVNfVEFSR19XUlBUUiwKLQkJCSAgICB0eHEtPnEud3JpdGVfcHRyIHwgKHR4cV9pZCA8PCA4KSk7CisJCQkgICAgdHhxLT53cml0ZV9wdHIgfCAodHhxX2lkIDw8IDgpKTsKIH0KIAogdm9pZCBpd2xfcGNpZV90eHFfY2hlY2tfd3JwdHJzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQpAQCAtMzEyLDQ5ICszMzAsOTMgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBpd2xfcGNpZV90ZmRfdGJfZ2V0X2FkZHIoc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4KQorc3RhdGljIGlubGluZSB2b2lkICppd2xfcGNpZV9nZXRfdGZkKHN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSwKKwkJCQkgICAgIHN0cnVjdCBpd2xfdHhxICp0eHEsIGludCBpZHgpCiB7Ci0Jc3RydWN0IGl3bF90ZmRfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07Ci0KLQlkbWFfYWRkcl90IGFkZHIgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJnRiLT5sbyk7Ci0JaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IHNpemVvZih1MzIpKQotCQlhZGRyIHw9Ci0JCSgoZG1hX2FkZHJfdCkobGUxNl90b19jcHUodGItPmhpX25fbGVuKSAmIDB4RikgPDwgMTYpIDw8IDE2OwotCi0JcmV0dXJuIGFkZHI7CisJcmV0dXJuIHR4cS0+dGZkcyArIHRyYW5zX3BjaWUtPnRmZF9zaXplICogaWR4OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX3BjaWVfdGZkX3NldF90YihzdHJ1Y3QgaXdsX3RmZCAqdGZkLCB1OCBpZHgsCi0JCQkJICAgICAgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbikKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBpd2xfcGNpZV90ZmRfdGJfZ2V0X2FkZHIoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkJCQkgIHZvaWQgKl90ZmQsIHU4IGlkeCkKIHsKLQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKLQl1MTYgaGlfbl9sZW4gPSBsZW4gPDwgNDsKIAotCXB1dF91bmFsaWduZWRfbGUzMihhZGRyLCAmdGItPmxvKTsKLQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCi0JCWhpX25fbGVuIHw9ICgoYWRkciA+PiAxNikgPj4gMTYpICYgMHhGOworCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKSB7CisJCXN0cnVjdCBpd2xfdGZoX3RmZCAqdGZkID0gX3RmZDsKKwkJc3RydWN0IGl3bF90ZmhfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07CiAKLQl0Yi0+aGlfbl9sZW4gPSBjcHVfdG9fbGUxNihoaV9uX2xlbik7CisJCXJldHVybiAoZG1hX2FkZHJfdCkobGU2NF90b19jcHUodGItPmFkZHIpKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgaXdsX3RmZCAqdGZkID0gX3RmZDsKKwkJc3RydWN0IGl3bF90ZmRfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07CisJCWRtYV9hZGRyX3QgYWRkciA9IGdldF91bmFsaWduZWRfbGUzMigmdGItPmxvKTsKKwkJZG1hX2FkZHJfdCBoaV9sZW47CiAKLQl0ZmQtPm51bV90YnMgPSBpZHggKyAxOworCQlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpIDw9IHNpemVvZih1MzIpKQorCQkJcmV0dXJuIGFkZHI7CisKKwkJaGlfbGVuID0gbGUxNl90b19jcHUodGItPmhpX25fbGVuKSAmIDB4RjsKKworCQkvKgorCQkgKiBzaGlmdCBieSAxNiB0d2ljZSB0byBhdm9pZCB3YXJuaW5ncyBvbiAzMi1iaXQKKwkJICogKHdoZXJlIHRoaXMgY29kZSBuZXZlciBydW5zIGFueXdheSBkdWUgdG8gdGhlCisJCSAqIGlmIHN0YXRlbWVudCBhYm92ZSkKKwkJICovCisJCXJldHVybiBhZGRyIHwgKChoaV9sZW4gPDwgMTYpIDw8IDE2KTsKKwl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTggaXdsX3BjaWVfdGZkX2dldF9udW1fdGJzKHN0cnVjdCBpd2xfdGZkICp0ZmQpCitzdGF0aWMgaW5saW5lIHZvaWQgaXdsX3BjaWVfdGZkX3NldF90YihzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdm9pZCAqdGZkLAorCQkJCSAgICAgICB1OCBpZHgsIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbikKIHsKLQlyZXR1cm4gdGZkLT5udW1fdGJzICYgMHgxZjsKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkgeworCQlzdHJ1Y3QgaXdsX3RmaF90ZmQgKnRmZF9maCA9ICh2b2lkICopdGZkOworCQlzdHJ1Y3QgaXdsX3RmaF90YiAqdGIgPSAmdGZkX2ZoLT50YnNbaWR4XTsKKworCQlwdXRfdW5hbGlnbmVkX2xlNjQoYWRkciwgJnRiLT5hZGRyKTsKKwkJdGItPnRiX2xlbiA9IGNwdV90b19sZTE2KGxlbik7CisKKwkJdGZkX2ZoLT5udW1fdGJzID0gY3B1X3RvX2xlMTYoaWR4ICsgMSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGl3bF90ZmQgKnRmZF9maCA9ICh2b2lkICopdGZkOworCQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkX2ZoLT50YnNbaWR4XTsKKworCQl1MTYgaGlfbl9sZW4gPSBsZW4gPDwgNDsKKworCQlwdXRfdW5hbGlnbmVkX2xlMzIoYWRkciwgJnRiLT5sbyk7CisJCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiBzaXplb2YodTMyKSkKKwkJCWhpX25fbGVuIHw9ICgoYWRkciA+PiAxNikgPj4gMTYpICYgMHhGOworCisJCXRiLT5oaV9uX2xlbiA9IGNwdV90b19sZTE2KGhpX25fbGVuKTsKKworCQl0ZmRfZmgtPm51bV90YnMgPSBpZHggKyAxOworCX0KK30KKworc3RhdGljIGlubGluZSB1OCBpd2xfcGNpZV90ZmRfZ2V0X251bV90YnMoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHZvaWQgKl90ZmQpCit7CisJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpIHsKKwkJc3RydWN0IGl3bF90ZmhfdGZkICp0ZmQgPSBfdGZkOworCisJCXJldHVybiBsZTE2X3RvX2NwdSh0ZmQtPm51bV90YnMpICYgMHgxZjsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgaXdsX3RmZCAqdGZkID0gX3RmZDsKKworCQlyZXR1cm4gdGZkLT5udW1fdGJzICYgMHgxZjsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGl3bF9wY2llX3RmZF91bm1hcChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKIAkJCSAgICAgICBzdHJ1Y3QgaXdsX2NtZF9tZXRhICptZXRhLAotCQkJICAgICAgIHN0cnVjdCBpd2xfdGZkICp0ZmQpCisJCQkgICAgICAgc3RydWN0IGl3bF90eHEgKnR4cSwgaW50IGluZGV4KQogewotCWludCBpOwotCWludCBudW1fdGJzOworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisJaW50IGksIG51bV90YnM7CisJdm9pZCAqdGZkID0gaXdsX3BjaWVfZ2V0X3RmZCh0cmFuc19wY2llLCB0eHEsIGluZGV4KTsKIAogCS8qIFNhbml0eSBjaGVjayBvbiBudW1iZXIgb2YgY2h1bmtzICovCi0JbnVtX3RicyA9IGl3bF9wY2llX3RmZF9nZXRfbnVtX3Ricyh0ZmQpOworCW51bV90YnMgPSBpd2xfcGNpZV90ZmRfZ2V0X251bV90YnModHJhbnMsIHRmZCk7CiAKLQlpZiAobnVtX3RicyA+PSBJV0xfTlVNX09GX1RCUykgeworCWlmIChudW1fdGJzID49IHRyYW5zX3BjaWUtPm1heF90YnMpIHsKIAkJSVdMX0VSUih0cmFucywgIlRvbyBtYW55IGNodW5rczogJWlcbiIsIG51bV90YnMpOwogCQkvKiBAdG9kbyBpc3N1ZSBmYXRhbCBlcnJvciwgaXQgaXMgcXVpdGUgc2VyaW91cyBzaXR1YXRpb24gKi8KIAkJcmV0dXJuOwpAQCAtMzYzLDE4ICs0MjUsMzAgQEAKIAkvKiBmaXJzdCBUQiBpcyBuZXZlciBmcmVlZCAtIGl0J3MgdGhlIGJpZGlyZWN0aW9uYWwgRE1BIGRhdGEgKi8KIAogCWZvciAoaSA9IDE7IGkgPCBudW1fdGJzOyBpKyspIHsKLQkJaWYgKG1ldGEtPmZsYWdzICYgQklUKGkgKyBDTURfVEJfQklUTUFQX1BPUykpCisJCWlmIChtZXRhLT50YnMgJiBCSVQoaSkpCiAJCQlkbWFfdW5tYXBfcGFnZSh0cmFucy0+ZGV2LAotCQkJCSAgICAgICBpd2xfcGNpZV90ZmRfdGJfZ2V0X2FkZHIodGZkLCBpKSwKLQkJCQkgICAgICAgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4odGZkLCBpKSwKKwkJCQkgICAgICAgaXdsX3BjaWVfdGZkX3RiX2dldF9hZGRyKHRyYW5zLCB0ZmQsIGkpLAorCQkJCSAgICAgICBpd2xfcGNpZV90ZmRfdGJfZ2V0X2xlbih0cmFucywgdGZkLCBpKSwKIAkJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CiAJCWVsc2UKIAkJCWRtYV91bm1hcF9zaW5nbGUodHJhbnMtPmRldiwKLQkJCQkJIGl3bF9wY2llX3RmZF90Yl9nZXRfYWRkcih0ZmQsIGkpLAotCQkJCQkgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4odGZkLCBpKSwKKwkJCQkJIGl3bF9wY2llX3RmZF90Yl9nZXRfYWRkcih0cmFucywgdGZkLAorCQkJCQkJCQkgIGkpLAorCQkJCQkgaXdsX3BjaWVfdGZkX3RiX2dldF9sZW4odHJhbnMsIHRmZCwKKwkJCQkJCQkJIGkpLAogCQkJCQkgRE1BX1RPX0RFVklDRSk7CiAJfQotCXRmZC0+bnVtX3RicyA9IDA7CisKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkgeworCQlzdHJ1Y3QgaXdsX3RmaF90ZmQgKnRmZF9maCA9ICh2b2lkICopdGZkOworCisJCXRmZF9maC0+bnVtX3RicyA9IDA7CisJfSBlbHNlIHsKKwkJc3RydWN0IGl3bF90ZmQgKnRmZF9maCA9ICh2b2lkICopdGZkOworCisJCXRmZF9maC0+bnVtX3RicyA9IDA7CisJfQorCiB9CiAKIC8qCkBAIC0zODgsMjAgKzQ2MiwxOCBAQAogICovCiBzdGF0aWMgdm9pZCBpd2xfcGNpZV90eHFfZnJlZV90ZmQoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBpd2xfdHhxICp0eHEpCiB7Ci0Jc3RydWN0IGl3bF90ZmQgKnRmZF90bXAgPSB0eHEtPnRmZHM7Ci0KIAkvKiByZF9wdHIgaXMgYm91bmRlZCBieSBURkRfUVVFVUVfU0laRV9NQVggYW5kCiAJICogaWR4IGlzIGJvdW5kZWQgYnkgbl93aW5kb3cKIAkgKi8KLQlpbnQgcmRfcHRyID0gdHhxLT5xLnJlYWRfcHRyOwotCWludCBpZHggPSBnZXRfY21kX2luZGV4KCZ0eHEtPnEsIHJkX3B0cik7CisJaW50IHJkX3B0ciA9IHR4cS0+cmVhZF9wdHI7CisJaW50IGlkeCA9IGdldF9jbWRfaW5kZXgodHhxLCByZF9wdHIpOwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmdHhxLT5sb2NrKTsKIAogCS8qIFdlIGhhdmUgb25seSBxLT5uX3dpbmRvdyB0eHEtPmVudHJpZXMsIGJ1dCB3ZSB1c2UKIAkgKiBURkRfUVVFVUVfU0laRV9NQVggdGZkcwogCSAqLwotCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgJnR4cS0+ZW50cmllc1tpZHhdLm1ldGEsICZ0ZmRfdG1wW3JkX3B0cl0pOworCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgJnR4cS0+ZW50cmllc1tpZHhdLm1ldGEsIHR4cSwgcmRfcHRyKTsKIAogCS8qIGZyZWUgU0tCICovCiAJaWYgKHR4cS0+ZW50cmllcykgewpAQCAtNDIzLDIzICs0OTUsMjEgQEAKIHN0YXRpYyBpbnQgaXdsX3BjaWVfdHhxX2J1aWxkX3RmZChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IGl3bF90eHEgKnR4cSwKIAkJCQkgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwgYm9vbCByZXNldCkKIHsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxOwotCXN0cnVjdCBpd2xfdGZkICp0ZmQsICp0ZmRfdG1wOworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisJdm9pZCAqdGZkOwogCXUzMiBudW1fdGJzOwogCi0JcSA9ICZ0eHEtPnE7Ci0JdGZkX3RtcCA9IHR4cS0+dGZkczsKLQl0ZmQgPSAmdGZkX3RtcFtxLT53cml0ZV9wdHJdOworCXRmZCA9IHR4cS0+dGZkcyArIHRyYW5zX3BjaWUtPnRmZF9zaXplICogdHhxLT53cml0ZV9wdHI7CiAKIAlpZiAocmVzZXQpCi0JCW1lbXNldCh0ZmQsIDAsIHNpemVvZigqdGZkKSk7CisJCW1lbXNldCh0ZmQsIDAsIHRyYW5zX3BjaWUtPnRmZF9zaXplKTsKIAotCW51bV90YnMgPSBpd2xfcGNpZV90ZmRfZ2V0X251bV90YnModGZkKTsKKwludW1fdGJzID0gaXdsX3BjaWVfdGZkX2dldF9udW1fdGJzKHRyYW5zLCB0ZmQpOwogCi0JLyogRWFjaCBURkQgY2FuIHBvaW50IHRvIGEgbWF4aW11bSAyMCBUeCBidWZmZXJzICovCi0JaWYgKG51bV90YnMgPj0gSVdMX05VTV9PRl9UQlMpIHsKKwkvKiBFYWNoIFRGRCBjYW4gcG9pbnQgdG8gYSBtYXhpbXVtIG1heF90YnMgVHggYnVmZmVycyAqLworCWlmIChudW1fdGJzID49IHRyYW5zX3BjaWUtPm1heF90YnMpIHsKIAkJSVdMX0VSUih0cmFucywgIkVycm9yIGNhbiBub3Qgc2VuZCBtb3JlIHRoYW4gJWQgY2h1bmtzXG4iLAotCQkJSVdMX05VTV9PRl9UQlMpOworCQkJdHJhbnNfcGNpZS0+bWF4X3Ricyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDQ3LDcgKzUxNyw3IEBACiAJCSAiVW5hbGlnbmVkIGFkZHJlc3MgPSAlbGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWFkZHIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWl3bF9wY2llX3RmZF9zZXRfdGIodGZkLCBudW1fdGJzLCBhZGRyLCBsZW4pOworCWl3bF9wY2llX3RmZF9zZXRfdGIodHJhbnMsIHRmZCwgbnVtX3RicywgYWRkciwgbGVuKTsKIAogCXJldHVybiBudW1fdGJzOwogfQpAQCAtNDU3LDcgKzUyNyw3IEBACiAJCQkgICAgICAgdTMyIHR4cV9pZCkKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwotCXNpemVfdCB0ZmRfc3ogPSBzaXplb2Yoc3RydWN0IGl3bF90ZmQpICogVEZEX1FVRVVFX1NJWkVfTUFYOworCXNpemVfdCB0ZmRfc3ogPSB0cmFuc19wY2llLT50ZmRfc2l6ZSAqIFRGRF9RVUVVRV9TSVpFX01BWDsKIAlzaXplX3QgdGIwX2J1Zl9zejsKIAlpbnQgaTsKIApAQCAtNDY4LDcgKzUzOCw3IEBACiAJCSAgICAodW5zaWduZWQgbG9uZyl0eHEpOwogCXR4cS0+dHJhbnNfcGNpZSA9IHRyYW5zX3BjaWU7CiAKLQl0eHEtPnEubl93aW5kb3cgPSBzbG90c19udW07CisJdHhxLT5uX3dpbmRvdyA9IHNsb3RzX251bTsKIAogCXR4cS0+ZW50cmllcyA9IGtjYWxsb2Moc2xvdHNfbnVtLAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX3BjaWVfdHhxX2VudHJ5KSwKQEAgLTQ4OSw3ICs1NTksNyBAQAogCS8qIENpcmN1bGFyIGJ1ZmZlciBvZiB0cmFuc21pdCBmcmFtZSBkZXNjcmlwdG9ycyAoVEZEcyksCiAJICogc2hhcmVkIHdpdGggZGV2aWNlICovCiAJdHhxLT50ZmRzID0gZG1hX2FsbG9jX2NvaGVyZW50KHRyYW5zLT5kZXYsIHRmZF9zeiwKLQkJCQkgICAgICAgJnR4cS0+cS5kbWFfYWRkciwgR0ZQX0tFUk5FTCk7CisJCQkJICAgICAgICZ0eHEtPmRtYV9hZGRyLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXR4cS0+dGZkcykKIAkJZ290byBlcnJvcjsKIApAQCAtNTAzLDExICs1NzMsMTEgQEAKIAlpZiAoIXR4cS0+Zmlyc3RfdGJfYnVmcykKIAkJZ290byBlcnJfZnJlZV90ZmRzOwogCi0JdHhxLT5xLmlkID0gdHhxX2lkOworCXR4cS0+aWQgPSB0eHFfaWQ7CiAKIAlyZXR1cm4gMDsKIGVycl9mcmVlX3RmZHM6Ci0JZG1hX2ZyZWVfY29oZXJlbnQodHJhbnMtPmRldiwgdGZkX3N6LCB0eHEtPnRmZHMsIHR4cS0+cS5kbWFfYWRkcik7CisJZG1hX2ZyZWVfY29oZXJlbnQodHJhbnMtPmRldiwgdGZkX3N6LCB0eHEtPnRmZHMsIHR4cS0+ZG1hX2FkZHIpOwogZXJyb3I6CiAJaWYgKHR4cS0+ZW50cmllcyAmJiB0eHFfaWQgPT0gdHJhbnNfcGNpZS0+Y21kX3F1ZXVlKQogCQlmb3IgKGkgPSAwOyBpIDwgc2xvdHNfbnVtOyBpKyspCkBAIC01MzEsNyArNjAxLDcgQEAKIAlCVUlMRF9CVUdfT04oVEZEX1FVRVVFX1NJWkVfTUFYICYgKFRGRF9RVUVVRV9TSVpFX01BWCAtIDEpKTsKIAogCS8qIEluaXRpYWxpemUgcXVldWUncyBoaWdoL2xvdy13YXRlciBtYXJrcywgYW5kIGhlYWQvdGFpbCBpbmRleGVzICovCi0JcmV0ID0gaXdsX3F1ZXVlX2luaXQoJnR4cS0+cSwgc2xvdHNfbnVtLCB0eHFfaWQpOworCXJldCA9IGl3bF9xdWV1ZV9pbml0KHR4cSwgc2xvdHNfbnVtLCB0eHFfaWQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTU0NSwxMCArNjE1LDEwIEBACiAJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpCiAJCWl3bF93cml0ZV9kaXJlY3Q2NCh0cmFucywKIAkJCQkgICBGSF9NRU1fQ0JCQ19RVUVVRSh0cmFucywgdHhxX2lkKSwKLQkJCQkgICB0eHEtPnEuZG1hX2FkZHIpOworCQkJCSAgIHR4cS0+ZG1hX2FkZHIpOwogCWVsc2UKIAkJaXdsX3dyaXRlX2RpcmVjdDMyKHRyYW5zLCBGSF9NRU1fQ0JCQ19RVUVVRSh0cmFucywgdHhxX2lkKSwKLQkJCQkgICB0eHEtPnEuZG1hX2FkZHIgPj4gOCk7CisJCQkJICAgdHhxLT5kbWFfYWRkciA+PiA4KTsKIAogCXJldHVybiAwOwogfQpAQCAtNTk1LDE1ICs2NjUsMTQgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAKIAlzcGluX2xvY2tfYmgoJnR4cS0+bG9jayk7Ci0Jd2hpbGUgKHEtPndyaXRlX3B0ciAhPSBxLT5yZWFkX3B0cikgeworCXdoaWxlICh0eHEtPndyaXRlX3B0ciAhPSB0eHEtPnJlYWRfcHRyKSB7CiAJCUlXTF9ERUJVR19UWF9SRVBMWSh0cmFucywgIlEgJWQgRnJlZSAlZFxuIiwKLQkJCQkgICB0eHFfaWQsIHEtPnJlYWRfcHRyKTsKKwkJCQkgICB0eHFfaWQsIHR4cS0+cmVhZF9wdHIpOwogCiAJCWlmICh0eHFfaWQgIT0gdHJhbnNfcGNpZS0+Y21kX3F1ZXVlKSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhxLT5lbnRyaWVzW3EtPnJlYWRfcHRyXS5za2I7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHhxLT5lbnRyaWVzW3R4cS0+cmVhZF9wdHJdLnNrYjsKIAogCQkJaWYgKFdBUk5fT05fT05DRSghc2tiKSkKIAkJCQljb250aW51ZTsKQEAgLTYxMSwxNSArNjgwLDE1IEBACiAJCQlpd2xfcGNpZV9mcmVlX3Rzb19wYWdlKHRyYW5zX3BjaWUsIHNrYik7CiAJCX0KIAkJaXdsX3BjaWVfdHhxX2ZyZWVfdGZkKHRyYW5zLCB0eHEpOwotCQlxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0cik7CisJCXR4cS0+cmVhZF9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAodHhxLT5yZWFkX3B0cik7CiAKLQkJaWYgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikgeworCQlpZiAodHhxLT5yZWFkX3B0ciA9PSB0eHEtPndyaXRlX3B0cikgewogCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnRyYW5zX3BjaWUtPnJlZ19sb2NrLCBmbGFncyk7CiAJCQlpZiAodHhxX2lkICE9IHRyYW5zX3BjaWUtPmNtZF9xdWV1ZSkgewogCQkJCUlXTF9ERUJVR19SUE0odHJhbnMsICJRICVkIC0gbGFzdCB0eCBmcmVlZFxuIiwKLQkJCQkJICAgICAgcS0+aWQpOworCQkJCQkgICAgICB0eHEtPmlkKTsKIAkJCQlpd2xfdHJhbnNfdW5yZWYodHJhbnMpOwogCQkJfSBlbHNlIHsKIAkJCQlpd2xfcGNpZV9jbGVhcl9jbWRfaW5fZmxpZ2h0KHRyYW5zKTsKQEAgLTY2Myw3ICs3MzIsNyBAQAogCiAJLyogRGUtYWxsb2MgYXJyYXkgb2YgY29tbWFuZC90eCBidWZmZXJzICovCiAJaWYgKHR4cV9pZCA9PSB0cmFuc19wY2llLT5jbWRfcXVldWUpCi0JCWZvciAoaSA9IDA7IGkgPCB0eHEtPnEubl93aW5kb3c7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgdHhxLT5uX3dpbmRvdzsgaSsrKSB7CiAJCQlremZyZWUodHhxLT5lbnRyaWVzW2ldLmNtZCk7CiAJCQlremZyZWUodHhxLT5lbnRyaWVzW2ldLmZyZWVfYnVmKTsKIAkJfQpAQCAtNjcxLDEzICs3NDAsMTMgQEAKIAkvKiBEZS1hbGxvYyBjaXJjdWxhciBidWZmZXIgb2YgVEZEcyAqLwogCWlmICh0eHEtPnRmZHMpIHsKIAkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LAotCQkJCSAgc2l6ZW9mKHN0cnVjdCBpd2xfdGZkKSAqIFRGRF9RVUVVRV9TSVpFX01BWCwKLQkJCQkgIHR4cS0+dGZkcywgdHhxLT5xLmRtYV9hZGRyKTsKLQkJdHhxLT5xLmRtYV9hZGRyID0gMDsKKwkJCQkgIHRyYW5zX3BjaWUtPnRmZF9zaXplICogVEZEX1FVRVVFX1NJWkVfTUFYLAorCQkJCSAgdHhxLT50ZmRzLCB0eHEtPmRtYV9hZGRyKTsKKwkJdHhxLT5kbWFfYWRkciA9IDA7CiAJCXR4cS0+dGZkcyA9IE5VTEw7CiAKIAkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LAotCQkJCSAgc2l6ZW9mKCp0eHEtPmZpcnN0X3RiX2J1ZnMpICogdHhxLT5xLm5fd2luZG93LAorCQkJCSAgc2l6ZW9mKCp0eHEtPmZpcnN0X3RiX2J1ZnMpICogdHhxLT5uX3dpbmRvdywKIAkJCQkgIHR4cS0+Zmlyc3RfdGJfYnVmcywgdHhxLT5maXJzdF90Yl9kbWEpOwogCX0KIApAQCAtNzAzLDYgKzc3Miw5IEBACiAJbWVtc2V0KHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQsIDAsIHNpemVvZih0cmFuc19wY2llLT5xdWV1ZV9zdG9wcGVkKSk7CiAJbWVtc2V0KHRyYW5zX3BjaWUtPnF1ZXVlX3VzZWQsIDAsIHNpemVvZih0cmFuc19wY2llLT5xdWV1ZV91c2VkKSk7CiAKKwlpZiAodHJhbnMtPmNmZy0+dXNlX3RmaCkKKwkJcmV0dXJuOworCiAJdHJhbnNfcGNpZS0+c2NkX2Jhc2VfYWRkciA9CiAJCWl3bF9yZWFkX3BycGgodHJhbnMsIFNDRF9TUkFNX0JBU0VfQUREUik7CiAKQEAgLTc1OCwxNCArODMwLDE0IEBACiAJCWlmICh0cmFucy0+Y2ZnLT51c2VfdGZoKQogCQkJaXdsX3dyaXRlX2RpcmVjdDY0KHRyYW5zLAogCQkJCQkgICBGSF9NRU1fQ0JCQ19RVUVVRSh0cmFucywgdHhxX2lkKSwKLQkJCQkJICAgdHhxLT5xLmRtYV9hZGRyKTsKKwkJCQkJICAgdHhxLT5kbWFfYWRkcik7CiAJCWVsc2UKIAkJCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywKIAkJCQkJICAgRkhfTUVNX0NCQkNfUVVFVUUodHJhbnMsIHR4cV9pZCksCi0JCQkJCSAgIHR4cS0+cS5kbWFfYWRkciA+PiA4KTsKKwkJCQkJICAgdHhxLT5kbWFfYWRkciA+PiA4KTsKIAkJaXdsX3BjaWVfdHhxX3VubWFwKHRyYW5zLCB0eHFfaWQpOwotCQl0eHEtPnEucmVhZF9wdHIgPSAwOwotCQl0eHEtPnEud3JpdGVfcHRyID0gMDsKKwkJdHhxLT5yZWFkX3B0ciA9IDA7CisJCXR4cS0+d3JpdGVfcHRyID0gMDsKIAl9CiAKIAkvKiBUZWxsIE5JQyB3aGVyZSB0byBmaW5kIHRoZSAia2VlcCB3YXJtIiBidWZmZXIgKi8KQEAgLTk3MCwxMSArMTA0MiwxMyBAQAogCQl9CiAJfQogCi0JaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpCisJaWYgKHRyYW5zLT5jZmctPnVzZV90ZmgpIHsKIAkJaXdsX3dyaXRlX2RpcmVjdDMyKHRyYW5zLCBURkhfVFJBTlNGRVJfTU9ERSwKIAkJCQkgICBURkhfVFJBTlNGRVJfTUFYX1BFTkRJTkdfUkVRIHwKIAkJCQkgICBURkhfQ0hVTktfU0laRV8xMjggfAogCQkJCSAgIFRGSF9DSFVOS19TUExJVF9NT0RFKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJaXdsX3NldF9iaXRzX3BycGgodHJhbnMsIFNDRF9HUF9DVFJMLCBTQ0RfR1BfQ1RSTF9BVVRPX0FDVElWRV9NT0RFKTsKIAlpZiAodHJhbnMtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPiAyMCkKQEAgLTEwMDcsNyArMTA4MSw3IEBACiAJICogaWYgZW1wdHkgZGVsZXRlIHRpbWVyLCBvdGhlcndpc2UgbW92ZSB0aW1lciBmb3J3YXJkCiAJICogc2luY2Ugd2UncmUgbWFraW5nIHByb2dyZXNzIG9uIHRoaXMgcXVldWUKIAkgKi8KLQlpZiAodHhxLT5xLnJlYWRfcHRyID09IHR4cS0+cS53cml0ZV9wdHIpCisJaWYgKHR4cS0+cmVhZF9wdHIgPT0gdHhxLT53cml0ZV9wdHIpCiAJCWRlbF90aW1lcigmdHhxLT5zdHVja190aW1lcik7CiAJZWxzZQogCQltb2RfdGltZXIoJnR4cS0+c3R1Y2tfdGltZXIsIGppZmZpZXMgKyB0eHEtPndkX3RpbWVvdXQpOwpAQCAtMTAyMCw3ICsxMDk0LDYgQEAKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF07CiAJaW50IHRmZF9udW0gPSBzc24gJiAoVEZEX1FVRVVFX1NJWkVfTUFYIC0gMSk7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAJaW50IGxhc3RfdG9fZnJlZTsKIAogCS8qIFRoaXMgZnVuY3Rpb24gaXMgbm90IG1lYW50IHRvIHJlbGVhc2UgY21kIHF1ZXVlKi8KQEAgLTEwMzUsMjEgKzExMDgsMjEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHR4cS0+cS5yZWFkX3B0ciA9PSB0ZmRfbnVtKQorCWlmICh0eHEtPnJlYWRfcHRyID09IHRmZF9udW0pCiAJCWdvdG8gb3V0OwogCiAJSVdMX0RFQlVHX1RYX1JFUExZKHRyYW5zLCAiW1EgJWRdICVkIC0+ICVkICglZClcbiIsCi0JCQkgICB0eHFfaWQsIHR4cS0+cS5yZWFkX3B0ciwgdGZkX251bSwgc3NuKTsKKwkJCSAgIHR4cV9pZCwgdHhxLT5yZWFkX3B0ciwgdGZkX251bSwgc3NuKTsKIAogCS8qU2luY2Ugd2UgZnJlZSB1bnRpbCBpbmRleCBfbm90XyBpbmNsdXNpdmUsIHRoZSBvbmUgYmVmb3JlIGluZGV4IGlzCiAJICogdGhlIGxhc3Qgd2Ugd2lsbCBmcmVlLiBUaGlzIG9uZSBtdXN0IGJlIHVzZWQgKi8KIAlsYXN0X3RvX2ZyZWUgPSBpd2xfcXVldWVfZGVjX3dyYXAodGZkX251bSk7CiAKLQlpZiAoIWl3bF9xdWV1ZV91c2VkKHEsIGxhc3RfdG9fZnJlZSkpIHsKKwlpZiAoIWl3bF9xdWV1ZV91c2VkKHR4cSwgbGFzdF90b19mcmVlKSkgewogCQlJV0xfRVJSKHRyYW5zLAogCQkJIiVzOiBSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGxhc3RfdG9fZnJlZSAlZCBpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwKIAkJCV9fZnVuY19fLCB0eHFfaWQsIGxhc3RfdG9fZnJlZSwgVEZEX1FVRVVFX1NJWkVfTUFYLAotCQkJcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7CisJCQl0eHEtPndyaXRlX3B0ciwgdHhxLT5yZWFkX3B0cik7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTA1Nyw5ICsxMTMwLDkgQEAKIAkJZ290byBvdXQ7CiAKIAlmb3IgKDsKLQkgICAgIHEtPnJlYWRfcHRyICE9IHRmZF9udW07Ci0JICAgICBxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0cikpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4cS0+ZW50cmllc1t0eHEtPnEucmVhZF9wdHJdLnNrYjsKKwkgICAgIHR4cS0+cmVhZF9wdHIgIT0gdGZkX251bTsKKwkgICAgIHR4cS0+cmVhZF9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAodHhxLT5yZWFkX3B0cikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4cS0+ZW50cmllc1t0eHEtPnJlYWRfcHRyXS5za2I7CiAKIAkJaWYgKFdBUk5fT05fT05DRSghc2tiKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTA2OCwxNiArMTE0MSwxNyBAQAogCiAJCV9fc2tiX3F1ZXVlX3RhaWwoc2ticywgc2tiKTsKIAotCQl0eHEtPmVudHJpZXNbdHhxLT5xLnJlYWRfcHRyXS5za2IgPSBOVUxMOworCQl0eHEtPmVudHJpZXNbdHhxLT5yZWFkX3B0cl0uc2tiID0gTlVMTDsKIAotCQlpd2xfcGNpZV90eHFfaW52YWxfYnl0ZV9jbnRfdGJsKHRyYW5zLCB0eHEpOworCQlpZiAoIXRyYW5zLT5jZmctPnVzZV90ZmgpCisJCQlpd2xfcGNpZV90eHFfaW52YWxfYnl0ZV9jbnRfdGJsKHRyYW5zLCB0eHEpOwogCiAJCWl3bF9wY2llX3R4cV9mcmVlX3RmZCh0cmFucywgdHhxKTsKIAl9CiAKIAlpd2xfcGNpZV90eHFfcHJvZ3Jlc3ModHhxKTsKIAotCWlmIChpd2xfcXVldWVfc3BhY2UoJnR4cS0+cSkgPiB0eHEtPnEubG93X21hcmsgJiYKKwlpZiAoaXdsX3F1ZXVlX3NwYWNlKHR4cSkgPiB0eHEtPmxvd19tYXJrICYmCiAJICAgIHRlc3RfYml0KHR4cV9pZCwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpIHsKIAkJc3RydWN0IHNrX2J1ZmZfaGVhZCBvdmVyZmxvd19za2JzOwogCkBAIC0xMTA5LDEyICsxMTgzLDEyIEBACiAJCX0KIAkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmxvY2spOwogCi0JCWlmIChpd2xfcXVldWVfc3BhY2UoJnR4cS0+cSkgPiB0eHEtPnEubG93X21hcmspCisJCWlmIChpd2xfcXVldWVfc3BhY2UodHhxKSA+IHR4cS0+bG93X21hcmspCiAJCQlpd2xfd2FrZV9xdWV1ZSh0cmFucywgdHhxKTsKIAl9CiAKLQlpZiAocS0+cmVhZF9wdHIgPT0gcS0+d3JpdGVfcHRyKSB7Ci0JCUlXTF9ERUJVR19SUE0odHJhbnMsICJRICVkIC0gbGFzdCB0eCByZWNsYWltZWRcbiIsIHEtPmlkKTsKKwlpZiAodHhxLT5yZWFkX3B0ciA9PSB0eHEtPndyaXRlX3B0cikgeworCQlJV0xfREVCVUdfUlBNKHRyYW5zLCAiUSAlZCAtIGxhc3QgdHggcmVjbGFpbWVkXG4iLCB0eHEtPmlkKTsKIAkJaXdsX3RyYW5zX3VucmVmKHRyYW5zKTsKIAl9CiAKQEAgLTExNzYsMzEgKzEyNTAsMzAgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbmZyZWVkID0gMDsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnR4cS0+bG9jayk7CiAKLQlpZiAoKGlkeCA+PSBURkRfUVVFVUVfU0laRV9NQVgpIHx8ICghaXdsX3F1ZXVlX3VzZWQocSwgaWR4KSkpIHsKKwlpZiAoKGlkeCA+PSBURkRfUVVFVUVfU0laRV9NQVgpIHx8ICghaXdsX3F1ZXVlX3VzZWQodHhxLCBpZHgpKSkgewogCQlJV0xfRVJSKHRyYW5zLAogCQkJIiVzOiBSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGluZGV4ICVkIGlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWQuXG4iLAogCQkJX19mdW5jX18sIHR4cV9pZCwgaWR4LCBURkRfUVVFVUVfU0laRV9NQVgsCi0JCQlxLT53cml0ZV9wdHIsIHEtPnJlYWRfcHRyKTsKKwkJCXR4cS0+d3JpdGVfcHRyLCB0eHEtPnJlYWRfcHRyKTsKIAkJcmV0dXJuOwogCX0KIAotCWZvciAoaWR4ID0gaXdsX3F1ZXVlX2luY193cmFwKGlkeCk7IHEtPnJlYWRfcHRyICE9IGlkeDsKLQkgICAgIHEtPnJlYWRfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyKSkgeworCWZvciAoaWR4ID0gaXdsX3F1ZXVlX2luY193cmFwKGlkeCk7IHR4cS0+cmVhZF9wdHIgIT0gaWR4OworCSAgICAgdHhxLT5yZWFkX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcCh0eHEtPnJlYWRfcHRyKSkgewogCiAJCWlmIChuZnJlZWQrKyA+IDApIHsKIAkJCUlXTF9FUlIodHJhbnMsICJIQ01EIHNraXBwZWQ6IGluZGV4ICglZCkgJWQgJWRcbiIsCi0JCQkJaWR4LCBxLT53cml0ZV9wdHIsIHEtPnJlYWRfcHRyKTsKKwkJCQlpZHgsIHR4cS0+d3JpdGVfcHRyLCB0eHEtPnJlYWRfcHRyKTsKIAkJCWl3bF9mb3JjZV9ubWkodHJhbnMpOwogCQl9CiAJfQogCi0JaWYgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikgeworCWlmICh0eHEtPnJlYWRfcHRyID09IHR4cS0+d3JpdGVfcHRyKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmFuc19wY2llLT5yZWdfbG9jaywgZmxhZ3MpOwogCQlpd2xfcGNpZV9jbGVhcl9jbWRfaW5fZmxpZ2h0KHRyYW5zKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJhbnNfcGNpZS0+cmVnX2xvY2ssIGZsYWdzKTsKQEAgLTEyNDksNiArMTMyMiw5IEBACiAJaWYgKHRlc3RfYW5kX3NldF9iaXQodHhxX2lkLCB0cmFuc19wY2llLT5xdWV1ZV91c2VkKSkKIAkJV0FSTl9PTkNFKDEsICJxdWV1ZSAlZCBhbHJlYWR5IHVzZWQgLSBleHBlY3QgaXNzdWVzIiwgdHhxX2lkKTsKIAorCWlmIChjZmcgJiYgdHJhbnMtPmNmZy0+dXNlX3RmaCkKKwkJV0FSTl9PTkNFKDEsICJFeHBlY3RlZCBubyBjYWxscyB0byBTQ0QgY29uZmlndXJhdGlvbiIpOworCiAJdHhxLT53ZF90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyh3ZGdfdGltZW91dCk7CiAKIAlpZiAoY2ZnKSB7CkBAIC0xMjgzLDE0ICsxMzU5LDE0IEBACiAJCQkgKi8KIAkJCWl3bF9zY2RfdHhxX2Rpc2FibGVfYWdnKHRyYW5zLCB0eHFfaWQpOwogCi0JCQlzc24gPSB0eHEtPnEucmVhZF9wdHI7CisJCQlzc24gPSB0eHEtPnJlYWRfcHRyOwogCQl9CiAJfQogCiAJLyogUGxhY2UgZmlyc3QgVEZEIGF0IGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gc3RhcnQgc2VxdWVuY2UgbnVtYmVyLgogCSAqIEFzc3VtZXMgdGhhdCBzc25faWR4IGlzIHZhbGlkICghPSAweEZGRikgKi8KLQl0eHEtPnEucmVhZF9wdHIgPSAoc3NuICYgMHhmZik7Ci0JdHhxLT5xLndyaXRlX3B0ciA9IChzc24gJiAweGZmKTsKKwl0eHEtPnJlYWRfcHRyID0gKHNzbiAmIDB4ZmYpOworCXR4cS0+d3JpdGVfcHRyID0gKHNzbiAmIDB4ZmYpOwogCWl3bF93cml0ZV9kaXJlY3QzMih0cmFucywgSEJVU19UQVJHX1dSUFRSLAogCQkJICAgKHNzbiAmIDB4ZmYpIHwgKHR4cV9pZCA8PCA4KSk7CiAKQEAgLTEzNDMsNiArMTQxOSwxNCBAQAogCXR4cS0+YW1wZHUgPSAhc2hhcmVkX21vZGU7CiB9CiAKK2RtYV9hZGRyX3QgaXdsX3RyYW5zX3BjaWVfZ2V0X3R4cV9ieXRlX3RhYmxlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgdHhxKQoreworCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CisKKwlyZXR1cm4gdHJhbnNfcGNpZS0+c2NkX2JjX3RibHMuZG1hICsKKwkgICAgICAgdHhxICogc2l6ZW9mKHN0cnVjdCBpd2xhZ25fc2NkX2JjX3RibCk7Cit9CisKIHZvaWQgaXdsX3RyYW5zX3BjaWVfdHhxX2Rpc2FibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCB0eHFfaWQsCiAJCQkJYm9vbCBjb25maWd1cmVfc2NkKQogewpAQCAtMTM2Niw2ICsxNDUwLDkgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlmIChjb25maWd1cmVfc2NkICYmIHRyYW5zLT5jZmctPnVzZV90ZmgpCisJCVdBUk5fT05DRSgxLCAiRXhwZWN0ZWQgbm8gY2FsbHMgdG8gU0NEIGNvbmZpZ3VyYXRpb24iKTsKKwogCWlmIChjb25maWd1cmVfc2NkKSB7CiAJCWl3bF9zY2RfdHhxX3NldF9pbmFjdGl2ZSh0cmFucywgdHhxX2lkKTsKIApAQCAtMTM5NSw3ICsxNDgyLDYgQEAKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpd2xfdHhxICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3RyYW5zX3BjaWUtPmNtZF9xdWV1ZV07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAJc3RydWN0IGl3bF9kZXZpY2VfY21kICpvdXRfY21kOwogCXN0cnVjdCBpd2xfY21kX21ldGEgKm91dF9tZXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xNDEwLDcgKzE0OTYsNyBAQAogCWNvbnN0IHU4ICpjbWRkYXRhW0lXTF9NQVhfQ01EX1RCU19QRVJfVEZEXTsKIAl1MTYgY21kbGVuW0lXTF9NQVhfQ01EX1RCU19QRVJfVEZEXTsKIAotCWlmIChXQVJOKCF0cmFuc19wY2llLT53aWRlX2NtZF9oZWFkZXIgJiYKKwlpZiAoV0FSTighdHJhbnMtPndpZGVfY21kX2hlYWRlciAmJgogCQkgZ3JvdXBfaWQgPiBJV0xfQUxXQVlTX0xPTkdfR1JPVVAsCiAJCSAidW5zdXBwb3J0ZWQgd2lkZSBjb21tYW5kICUjeFxuIiwgY21kLT5pZCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQ5NCw3ICsxNTgwLDcgQEAKIAogCXNwaW5fbG9ja19iaCgmdHhxLT5sb2NrKTsKIAotCWlmIChpd2xfcXVldWVfc3BhY2UocSkgPCAoKGNtZC0+ZmxhZ3MgJiBDTURfQVNZTkMpID8gMiA6IDEpKSB7CisJaWYgKGl3bF9xdWV1ZV9zcGFjZSh0eHEpIDwgKChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSA/IDIgOiAxKSkgewogCQlzcGluX3VubG9ja19iaCgmdHhxLT5sb2NrKTsKIAogCQlJV0xfRVJSKHRyYW5zLCAiTm8gc3BhY2UgaW4gY29tbWFuZCBxdWV1ZVxuIik7CkBAIC0xNTAzLDcgKzE1ODksNyBAQAogCQlnb3RvIGZyZWVfZHVwX2J1ZjsKIAl9CiAKLQlpZHggPSBnZXRfY21kX2luZGV4KHEsIHEtPndyaXRlX3B0cik7CisJaWR4ID0gZ2V0X2NtZF9pbmRleCh0eHEsIHR4cS0+d3JpdGVfcHRyKTsKIAlvdXRfY21kID0gdHhxLT5lbnRyaWVzW2lkeF0uY21kOwogCW91dF9tZXRhID0gJnR4cS0+ZW50cmllc1tpZHhdLm1ldGE7CiAKQEAgLTE1MjIsNyArMTYwOCw3IEBACiAJCW91dF9jbWQtPmhkcl93aWRlLnJlc2VydmVkID0gMDsKIAkJb3V0X2NtZC0+aGRyX3dpZGUuc2VxdWVuY2UgPQogCQkJY3B1X3RvX2xlMTYoUVVFVUVfVE9fU0VRKHRyYW5zX3BjaWUtPmNtZF9xdWV1ZSkgfAotCQkJCQkJIElOREVYX1RPX1NFUShxLT53cml0ZV9wdHIpKTsKKwkJCQkJCSBJTkRFWF9UT19TRVEodHhxLT53cml0ZV9wdHIpKTsKIAogCQljbWRfcG9zID0gc2l6ZW9mKHN0cnVjdCBpd2xfY21kX2hlYWRlcl93aWRlKTsKIAkJY29weV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfY21kX2hlYWRlcl93aWRlKTsKQEAgLTE1MzAsNyArMTYxNiw3IEBACiAJCW91dF9jbWQtPmhkci5jbWQgPSBpd2xfY21kX29wY29kZShjbWQtPmlkKTsKIAkJb3V0X2NtZC0+aGRyLnNlcXVlbmNlID0KIAkJCWNwdV90b19sZTE2KFFVRVVFX1RPX1NFUSh0cmFuc19wY2llLT5jbWRfcXVldWUpIHwKLQkJCQkJCSBJTkRFWF9UT19TRVEocS0+d3JpdGVfcHRyKSk7CisJCQkJCQkgSU5ERVhfVE9fU0VRKHR4cS0+d3JpdGVfcHRyKSk7CiAJCW91dF9jbWQtPmhkci5ncm91cF9pZCA9IDA7CiAKIAkJY21kX3BvcyA9IHNpemVvZihzdHJ1Y3QgaXdsX2NtZF9oZWFkZXIpOwpAQCAtMTU4MCw3ICsxNjY2LDcgQEAKIAkJICAgICBpd2xfZ2V0X2NtZF9zdHJpbmcodHJhbnMsIGNtZC0+aWQpLAogCQkgICAgIGdyb3VwX2lkLCBvdXRfY21kLT5oZHIuY21kLAogCQkgICAgIGxlMTZfdG9fY3B1KG91dF9jbWQtPmhkci5zZXF1ZW5jZSksCi0JCSAgICAgY21kX3NpemUsIHEtPndyaXRlX3B0ciwgaWR4LCB0cmFuc19wY2llLT5jbWRfcXVldWUpOworCQkgICAgIGNtZF9zaXplLCB0eHEtPndyaXRlX3B0ciwgaWR4LCB0cmFuc19wY2llLT5jbWRfcXVldWUpOwogCiAJLyogc3RhcnQgdGhlIFRGRCB3aXRoIHRoZSBtaW5pbXVtIGNvcHkgYnl0ZXMgKi8KIAl0YjBfc2l6ZSA9IG1pbl90KGludCwgY29weV9zaXplLCBJV0xfRklSU1RfVEJfU0laRSk7CkBAIC0xNTk2LDggKzE2ODIsOCBAQAogCQkJCQkgICBjb3B5X3NpemUgLSB0YjBfc2l6ZSwKIAkJCQkJICAgRE1BX1RPX0RFVklDRSk7CiAJCWlmIChkbWFfbWFwcGluZ19lcnJvcih0cmFucy0+ZGV2LCBwaHlzX2FkZHIpKSB7Ci0JCQlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLAotCQkJCQkgICAmdHhxLT50ZmRzW3EtPndyaXRlX3B0cl0pOworCQkJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBvdXRfbWV0YSwgdHhxLAorCQkJCQkgICB0eHEtPndyaXRlX3B0cik7CiAJCQlpZHggPSAtRU5PTUVNOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTE2MjAsOCArMTcwNiw4IEBACiAJCXBoeXNfYWRkciA9IGRtYV9tYXBfc2luZ2xlKHRyYW5zLT5kZXYsICh2b2lkICopZGF0YSwKIAkJCQkJICAgY21kbGVuW2ldLCBETUFfVE9fREVWSUNFKTsKIAkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHRyYW5zLT5kZXYsIHBoeXNfYWRkcikpIHsKLQkJCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgb3V0X21ldGEsCi0JCQkJCSAgICZ0eHEtPnRmZHNbcS0+d3JpdGVfcHRyXSk7CisJCQlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLCB0eHEsCisJCQkJCSAgIHR4cS0+d3JpdGVfcHRyKTsKIAkJCWlkeCA9IC1FTk9NRU07CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTYyOSw4ICsxNzE1LDcgQEAKIAkJaXdsX3BjaWVfdHhxX2J1aWxkX3RmZCh0cmFucywgdHhxLCBwaHlzX2FkZHIsIGNtZGxlbltpXSwgZmFsc2UpOwogCX0KIAotCUJVSUxEX0JVR19PTihJV0xfTlVNX09GX1RCUyArIENNRF9UQl9CSVRNQVBfUE9TID4KLQkJICAgICBzaXplb2Yob3V0X21ldGEtPmZsYWdzKSAqIEJJVFNfUEVSX0JZVEUpOworCUJVSUxEX0JVR19PTihJV0xfVEZIX05VTV9UQlMgPiBzaXplb2Yob3V0X21ldGEtPnRicykgKiBCSVRTX1BFUl9CWVRFKTsKIAlvdXRfbWV0YS0+ZmxhZ3MgPSBjbWQtPmZsYWdzOwogCWlmIChXQVJOX09OX09OQ0UodHhxLT5lbnRyaWVzW2lkeF0uZnJlZV9idWYpKQogCQlremZyZWUodHhxLT5lbnRyaWVzW2lkeF0uZnJlZV9idWYpOwpAQCAtMTYzOSw3ICsxNzI0LDcgQEAKIAl0cmFjZV9pd2x3aWZpX2Rldl9oY21kKHRyYW5zLT5kZXYsIGNtZCwgY21kX3NpemUsICZvdXRfY21kLT5oZHJfd2lkZSk7CiAKIAkvKiBzdGFydCB0aW1lciBpZiBxdWV1ZSBjdXJyZW50bHkgZW1wdHkgKi8KLQlpZiAocS0+cmVhZF9wdHIgPT0gcS0+d3JpdGVfcHRyICYmIHR4cS0+d2RfdGltZW91dCkKKwlpZiAodHhxLT5yZWFkX3B0ciA9PSB0eHEtPndyaXRlX3B0ciAmJiB0eHEtPndkX3RpbWVvdXQpCiAJCW1vZF90aW1lcigmdHhxLT5zdHVja190aW1lciwgamlmZmllcyArIHR4cS0+d2RfdGltZW91dCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHJhbnNfcGNpZS0+cmVnX2xvY2ssIGZsYWdzKTsKQEAgLTE2NTEsNyArMTczNiw3IEBACiAJfQogCiAJLyogSW5jcmVtZW50IGFuZCB1cGRhdGUgcXVldWUncyB3cml0ZSBpbmRleCAqLwotCXEtPndyaXRlX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIpOworCXR4cS0+d3JpdGVfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHR4cS0+d3JpdGVfcHRyKTsKIAlpd2xfcGNpZV90eHFfaW5jX3dyX3B0cih0cmFucywgdHhxKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyYW5zX3BjaWUtPnJlZ19sb2NrLCBmbGFncyk7CkBAIC0xNjg5LDIwICsxNzc0LDIwIEBACiAJaWYgKFdBUk4odHhxX2lkICE9IHRyYW5zX3BjaWUtPmNtZF9xdWV1ZSwKIAkJICJ3cm9uZyBjb21tYW5kIHF1ZXVlICVkIChzaG91bGQgYmUgJWQpLCBzZXF1ZW5jZSAweCVYIHJlYWRwPSVkIHdyaXRlcD0lZFxuIiwKIAkJIHR4cV9pZCwgdHJhbnNfcGNpZS0+Y21kX3F1ZXVlLCBzZXF1ZW5jZSwKLQkJIHRyYW5zX3BjaWUtPnR4cVt0cmFuc19wY2llLT5jbWRfcXVldWVdLnEucmVhZF9wdHIsCi0JCSB0cmFuc19wY2llLT50eHFbdHJhbnNfcGNpZS0+Y21kX3F1ZXVlXS5xLndyaXRlX3B0cikpIHsKKwkJIHRyYW5zX3BjaWUtPnR4cVt0cmFuc19wY2llLT5jbWRfcXVldWVdLnJlYWRfcHRyLAorCQkgdHJhbnNfcGNpZS0+dHhxW3RyYW5zX3BjaWUtPmNtZF9xdWV1ZV0ud3JpdGVfcHRyKSkgewogCQlpd2xfcHJpbnRfaGV4X2Vycm9yKHRyYW5zLCBwa3QsIDMyKTsKIAkJcmV0dXJuOwogCX0KIAogCXNwaW5fbG9ja19iaCgmdHhxLT5sb2NrKTsKIAotCWNtZF9pbmRleCA9IGdldF9jbWRfaW5kZXgoJnR4cS0+cSwgaW5kZXgpOworCWNtZF9pbmRleCA9IGdldF9jbWRfaW5kZXgodHhxLCBpbmRleCk7CiAJY21kID0gdHhxLT5lbnRyaWVzW2NtZF9pbmRleF0uY21kOwogCW1ldGEgPSAmdHhxLT5lbnRyaWVzW2NtZF9pbmRleF0ubWV0YTsKIAljbWRfaWQgPSBpd2xfY21kX2lkKGNtZC0+aGRyLmNtZCwgZ3JvdXBfaWQsIDApOwogCi0JaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBtZXRhLCAmdHhxLT50ZmRzW2luZGV4XSk7CisJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBtZXRhLCB0eHEsIGluZGV4KTsKIAogCS8qIElucHV0IGVycm9yIGNoZWNraW5nIGlzIGRvbmUgd2hlbiBjb21tYW5kcyBhcmUgYWRkZWQgdG8gcXVldWUuICovCiAJaWYgKG1ldGEtPmZsYWdzICYgQ01EX1dBTlRfU0tCKSB7CkBAIC0xODE1LDE0ICsxOTAwLDEzIEBACiAJCQkJIEhPU1RfQ09NUExFVEVfVElNRU9VVCk7CiAJaWYgKCFyZXQpIHsKIAkJc3RydWN0IGl3bF90eHEgKnR4cSA9ICZ0cmFuc19wY2llLT50eHFbdHJhbnNfcGNpZS0+Y21kX3F1ZXVlXTsKLQkJc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAKIAkJSVdMX0VSUih0cmFucywgIkVycm9yIHNlbmRpbmcgJXM6IHRpbWUgb3V0IGFmdGVyICVkbXMuXG4iLAogCQkJaXdsX2dldF9jbWRfc3RyaW5nKHRyYW5zLCBjbWQtPmlkKSwKIAkJCWppZmZpZXNfdG9fbXNlY3MoSE9TVF9DT01QTEVURV9USU1FT1VUKSk7CiAKIAkJSVdMX0VSUih0cmFucywgIkN1cnJlbnQgQ01EIHF1ZXVlIHJlYWRfcHRyICVkIHdyaXRlX3B0ciAlZFxuIiwKLQkJCXEtPnJlYWRfcHRyLCBxLT53cml0ZV9wdHIpOworCQkJdHhxLT5yZWFkX3B0ciwgdHhxLT53cml0ZV9wdHIpOwogCiAJCWNsZWFyX2JpdChTVEFUVVNfU1lOQ19IQ01EX0FDVElWRSwgJnRyYW5zLT5zdGF0dXMpOwogCQlJV0xfREVCVUdfSU5GTyh0cmFucywgIkNsZWFyaW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLApAQCAtMTkwMCw3ICsxOTg0LDcgQEAKIAkJCSAgICAgc3RydWN0IGl3bF9jbWRfbWV0YSAqb3V0X21ldGEsCiAJCQkgICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqZGV2X2NtZCwgdTE2IHRiMV9sZW4pCiB7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CisJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAl1MTYgdGIyX2xlbjsKIAlpbnQgaTsKIApAQCAtMTkxNSw4ICsxOTk5LDggQEAKIAkJCQkJCSAgICAgc2tiLT5kYXRhICsgaGRyX2xlbiwKIAkJCQkJCSAgICAgdGIyX2xlbiwgRE1BX1RPX0RFVklDRSk7CiAJCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcih0cmFucy0+ZGV2LCB0YjJfcGh5cykpKSB7Ci0JCQlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLAotCQkJCQkgICAmdHhxLT50ZmRzW3EtPndyaXRlX3B0cl0pOworCQkJaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBvdXRfbWV0YSwgdHhxLAorCQkJCQkgICB0eHEtPndyaXRlX3B0cik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpd2xfcGNpZV90eHFfYnVpbGRfdGZkKHRyYW5zLCB0eHEsIHRiMl9waHlzLCB0YjJfbGVuLCBmYWxzZSk7CkBAIC0xOTM1LDE5ICsyMDE5LDE5IEBACiAJCQkJCSAgIHNrYl9mcmFnX3NpemUoZnJhZyksIERNQV9UT19ERVZJQ0UpOwogCiAJCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcih0cmFucy0+ZGV2LCB0Yl9waHlzKSkpIHsKLQkJCWl3bF9wY2llX3RmZF91bm1hcCh0cmFucywgb3V0X21ldGEsCi0JCQkJCSAgICZ0eHEtPnRmZHNbcS0+d3JpdGVfcHRyXSk7CisJCQlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLCB0eHEsCisJCQkJCSAgIHR4cS0+d3JpdGVfcHRyKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXRiX2lkeCA9IGl3bF9wY2llX3R4cV9idWlsZF90ZmQodHJhbnMsIHR4cSwgdGJfcGh5cywKIAkJCQkJCXNrYl9mcmFnX3NpemUoZnJhZyksIGZhbHNlKTsKIAotCQlvdXRfbWV0YS0+ZmxhZ3MgfD0gQklUKHRiX2lkeCArIENNRF9UQl9CSVRNQVBfUE9TKTsKKwkJb3V0X21ldGEtPnRicyB8PSBCSVQodGJfaWR4KTsKIAl9CiAKIAl0cmFjZV9pd2x3aWZpX2Rldl90eCh0cmFucy0+ZGV2LCBza2IsCi0JCQkgICAgICZ0eHEtPnRmZHNbdHhxLT5xLndyaXRlX3B0cl0sCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgaXdsX3RmZCksCisJCQkgICAgIGl3bF9wY2llX2dldF90ZmQodHJhbnNfcGNpZSwgdHhxLCB0eHEtPndyaXRlX3B0ciksCisJCQkgICAgIHRyYW5zX3BjaWUtPnRmZF9zaXplLAogCQkJICAgICAmZGV2X2NtZC0+aGRyLCBJV0xfRklSU1RfVEJfU0laRSArIHRiMV9sZW4sCiAJCQkgICAgIHNrYi0+ZGF0YSArIGhkcl9sZW4sIHRiMl9sZW4pOwogCXRyYWNlX2l3bHdpZmlfZGV2X3R4X2RhdGEodHJhbnMtPmRldiwgc2tiLApAQCAtMjAwOCw3ICsyMDkyLDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHZvaWQgKilza2ItPmRhdGE7CiAJdW5zaWduZWQgaW50IHNuYXBfaXBfdGNwX2hkcmxlbiwgaXBfaGRybGVuLCB0b3RhbF9sZW4sIGhkcl9yb29tOwogCXVuc2lnbmVkIGludCBtc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwogCXUxNiBsZW5ndGgsIGl2X2xlbiwgYW1zZHVfcGFkOwogCXU4ICpzdGFydF9oZHI7CiAJc3RydWN0IGl3bF90c29faGRyX3BhZ2UgKmhkcl9wYWdlOwpAQCAtMjAyMiw4ICsyMTA1LDggQEAKIAkJSUVFRTgwMjExX0NDTVBfSERSX0xFTiA6IDA7CiAKIAl0cmFjZV9pd2x3aWZpX2Rldl90eCh0cmFucy0+ZGV2LCBza2IsCi0JCQkgICAgICZ0eHEtPnRmZHNbdHhxLT5xLndyaXRlX3B0cl0sCi0JCQkgICAgIHNpemVvZihzdHJ1Y3QgaXdsX3RmZCksCisJCQkgICAgIGl3bF9wY2llX2dldF90ZmQodHJhbnNfcGNpZSwgdHhxLCB0eHEtPndyaXRlX3B0ciksCisJCQkgICAgIHRyYW5zX3BjaWUtPnRmZF9zaXplLAogCQkJICAgICAmZGV2X2NtZC0+aGRyLCBJV0xfRklSU1RfVEJfU0laRSArIHRiMV9sZW4sCiAJCQkgICAgIE5VTEwsIDApOwogCkBAIC0yMTc5LDcgKzIyNjIsNyBAQAogCXJldHVybiAwOwogCiBvdXRfdW5tYXA6Ci0JaXdsX3BjaWVfdGZkX3VubWFwKHRyYW5zLCBvdXRfbWV0YSwgJnR4cS0+dGZkc1txLT53cml0ZV9wdHJdKTsKKwlpd2xfcGNpZV90ZmRfdW5tYXAodHJhbnMsIG91dF9tZXRhLCB0eHEsIHR4cS0+d3JpdGVfcHRyKTsKIAlyZXR1cm4gcmV0OwogfQogI2Vsc2UgLyogQ09ORklHX0lORVQgKi8KQEAgLTIyMDMsOSArMjI4Niw5IEBACiAJc3RydWN0IGl3bF90eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgaXdsX3R4X2NtZCAqKWRldl9jbWQtPnBheWxvYWQ7CiAJc3RydWN0IGl3bF9jbWRfbWV0YSAqb3V0X21ldGE7CiAJc3RydWN0IGl3bF90eHEgKnR4cTsKLQlzdHJ1Y3QgaXdsX3F1ZXVlICpxOwogCWRtYV9hZGRyX3QgdGIwX3BoeXMsIHRiMV9waHlzLCBzY3JhdGNoX3BoeXM7CiAJdm9pZCAqdGIxX2FkZHI7CisJdm9pZCAqdGZkOwogCXUxNiBsZW4sIHRiMV9sZW47CiAJYm9vbCB3YWl0X3dyaXRlX3B0cjsKIAlfX2xlMTYgZmM7CkBAIC0yMjE0LDcgKzIyOTcsNiBAQAogCWJvb2wgYW1zZHU7CiAKIAl0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF07Ci0JcSA9ICZ0eHEtPnE7CiAKIAlpZiAoV0FSTl9PTkNFKCF0ZXN0X2JpdCh0eHFfaWQsIHRyYW5zX3BjaWUtPnF1ZXVlX3VzZWQpLAogCQkgICAgICAiVFggb24gdW51c2VkIHF1ZXVlICVkXG4iLCB0eHFfaWQpKQpAQCAtMjIzNiw3ICsyMzE4LDcgQEAKIAl9CiAKIAlpZiAoc2tiX2lzX25vbmxpbmVhcihza2IpICYmCi0JICAgIHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPiBJV0xfUENJRV9NQVhfRlJBR1MgJiYKKwkgICAgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA+IElXTF9QQ0lFX01BWF9GUkFHUyh0cmFuc19wY2llKSAmJgogCSAgICBfX3NrYl9saW5lYXJpemUoc2tiKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTIyNDksMTEgKzIzMzEsMTEgQEAKIAogCXNwaW5fbG9jaygmdHhxLT5sb2NrKTsKIAotCWlmIChpd2xfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspIHsKKwlpZiAoaXdsX3F1ZXVlX3NwYWNlKHR4cSkgPCB0eHEtPmhpZ2hfbWFyaykgewogCQlpd2xfc3RvcF9xdWV1ZSh0cmFucywgdHhxKTsKIAogCQkvKiBkb24ndCBwdXQgdGhlIHBhY2tldCBvbiB0aGUgcmluZywgaWYgdGhlcmUgaXMgbm8gcm9vbSAqLwotCQlpZiAodW5saWtlbHkoaXdsX3F1ZXVlX3NwYWNlKHEpIDwgMykpIHsKKwkJaWYgKHVubGlrZWx5KGl3bF9xdWV1ZV9zcGFjZSh0eHEpIDwgMykpIHsKIAkJCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqKmRldl9jbWRfcHRyOwogCiAJCQlkZXZfY21kX3B0ciA9ICh2b2lkICopKCh1OCAqKXNrYi0+Y2IgKwpAQCAtMjI3NCwxOSArMjM1NiwxOSBAQAogCSAqLwogCXdpZmlfc2VxID0gSUVFRTgwMjExX1NFUV9UT19TTihsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSk7CiAJV0FSTl9PTkNFKHR4cS0+YW1wZHUgJiYKLQkJICAod2lmaV9zZXEgJiAweGZmKSAhPSBxLT53cml0ZV9wdHIsCisJCSAgKHdpZmlfc2VxICYgMHhmZikgIT0gdHhxLT53cml0ZV9wdHIsCiAJCSAgIlE6ICVkIFdpRmkgU2VxICVkIHRmZE51bSAlZCIsCi0JCSAgdHhxX2lkLCB3aWZpX3NlcSwgcS0+d3JpdGVfcHRyKTsKKwkJICB0eHFfaWQsIHdpZmlfc2VxLCB0eHEtPndyaXRlX3B0cik7CiAKIAkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCi0JdHhxLT5lbnRyaWVzW3EtPndyaXRlX3B0cl0uc2tiID0gc2tiOwotCXR4cS0+ZW50cmllc1txLT53cml0ZV9wdHJdLmNtZCA9IGRldl9jbWQ7CisJdHhxLT5lbnRyaWVzW3R4cS0+d3JpdGVfcHRyXS5za2IgPSBza2I7CisJdHhxLT5lbnRyaWVzW3R4cS0+d3JpdGVfcHRyXS5jbWQgPSBkZXZfY21kOwogCiAJZGV2X2NtZC0+aGRyLnNlcXVlbmNlID0KIAkJY3B1X3RvX2xlMTYoKHUxNikoUVVFVUVfVE9fU0VRKHR4cV9pZCkgfAotCQkJICAgIElOREVYX1RPX1NFUShxLT53cml0ZV9wdHIpKSk7CisJCQkgICAgSU5ERVhfVE9fU0VRKHR4cS0+d3JpdGVfcHRyKSkpOwogCi0JdGIwX3BoeXMgPSBpd2xfcGNpZV9nZXRfZmlyc3RfdGJfZG1hKHR4cSwgcS0+d3JpdGVfcHRyKTsKKwl0YjBfcGh5cyA9IGl3bF9wY2llX2dldF9maXJzdF90Yl9kbWEodHhxLCB0eHEtPndyaXRlX3B0cik7CiAJc2NyYXRjaF9waHlzID0gdGIwX3BoeXMgKyBzaXplb2Yoc3RydWN0IGl3bF9jbWRfaGVhZGVyKSArCiAJCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgaXdsX3R4X2NtZCwgc2NyYXRjaCk7CiAKQEAgLTIyOTQsNyArMjM3Niw3IEBACiAJdHhfY21kLT5kcmFtX21zYl9wdHIgPSBpd2xfZ2V0X2RtYV9oaV9hZGRyKHNjcmF0Y2hfcGh5cyk7CiAKIAkvKiBTZXQgdXAgZmlyc3QgZW1wdHkgZW50cnkgaW4gcXVldWUncyBhcnJheSBvZiBUeC9jbWQgYnVmZmVycyAqLwotCW91dF9tZXRhID0gJnR4cS0+ZW50cmllc1txLT53cml0ZV9wdHJdLm1ldGE7CisJb3V0X21ldGEgPSAmdHhxLT5lbnRyaWVzW3R4cS0+d3JpdGVfcHRyXS5tZXRhOwogCW91dF9tZXRhLT5mbGFncyA9IDA7CiAKIAkvKgpAQCAtMjMxOSw3ICsyNDAxLDcgQEAKIAl9CiAKIAkvKiBUaGUgZmlyc3QgVEIgcG9pbnRzIHRvIGJpLWRpcmVjdGlvbmFsIERNQSBkYXRhICovCi0JbWVtY3B5KCZ0eHEtPmZpcnN0X3RiX2J1ZnNbcS0+d3JpdGVfcHRyXSwgJmRldl9jbWQtPmhkciwKKwltZW1jcHkoJnR4cS0+Zmlyc3RfdGJfYnVmc1t0eHEtPndyaXRlX3B0cl0sICZkZXZfY21kLT5oZHIsCiAJICAgICAgIElXTF9GSVJTVF9UQl9TSVpFKTsKIAlpd2xfcGNpZV90eHFfYnVpbGRfdGZkKHRyYW5zLCB0eHEsIHRiMF9waHlzLAogCQkJICAgICAgIElXTF9GSVJTVF9UQl9TSVpFLCB0cnVlKTsKQEAgLTIzNDQsMTMgKzI0MjYsMTUgQEAKIAkJZ290byBvdXRfZXJyOwogCX0KIAorCXRmZCA9IGl3bF9wY2llX2dldF90ZmQodHJhbnNfcGNpZSwgdHhxLCB0eHEtPndyaXRlX3B0cik7CiAJLyogU2V0IHVwIGVudHJ5IGZvciB0aGlzIFRGRCBpbiBUeCBieXRlLWNvdW50IGFycmF5ICovCi0JaXdsX3BjaWVfdHhxX3VwZGF0ZV9ieXRlX2NudF90YmwodHJhbnMsIHR4cSwgbGUxNl90b19jcHUodHhfY21kLT5sZW4pKTsKKwlpd2xfcGNpZV90eHFfdXBkYXRlX2J5dGVfY250X3RibCh0cmFucywgdHhxLCBsZTE2X3RvX2NwdSh0eF9jbWQtPmxlbiksCisJCQkJCSBpd2xfcGNpZV90ZmRfZ2V0X251bV90YnModHJhbnMsIHRmZCkpOwogCiAJd2FpdF93cml0ZV9wdHIgPSBpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYyk7CiAKIAkvKiBzdGFydCB0aW1lciBpZiBxdWV1ZSBjdXJyZW50bHkgZW1wdHkgKi8KLQlpZiAocS0+cmVhZF9wdHIgPT0gcS0+d3JpdGVfcHRyKSB7CisJaWYgKHR4cS0+cmVhZF9wdHIgPT0gdHhxLT53cml0ZV9wdHIpIHsKIAkJaWYgKHR4cS0+d2RfdGltZW91dCkgewogCQkJLyoKIAkJCSAqIElmIHRoZSBUWFEgaXMgYWN0aXZlLCB0aGVuIHNldCB0aGUgdGltZXIsIGlmIG5vdCwKQEAgLTIzNjQsMTIgKzI0NDgsMTIgQEAKIAkJCWVsc2UKIAkJCQl0eHEtPmZyb3plbl9leHBpcnlfcmVtYWluZGVyID0gdHhxLT53ZF90aW1lb3V0OwogCQl9Ci0JCUlXTF9ERUJVR19SUE0odHJhbnMsICJROiAlZCBmaXJzdCB0eCAtIHRha2UgcmVmXG4iLCBxLT5pZCk7CisJCUlXTF9ERUJVR19SUE0odHJhbnMsICJROiAlZCBmaXJzdCB0eCAtIHRha2UgcmVmXG4iLCB0eHEtPmlkKTsKIAkJaXdsX3RyYW5zX3JlZih0cmFucyk7CiAJfQogCiAJLyogVGVsbCBkZXZpY2UgdGhlIHdyaXRlIGluZGV4ICpqdXN0IHBhc3QqIHRoaXMgbGF0ZXN0IGZpbGxlZCBURkQgKi8KLQlxLT53cml0ZV9wdHIgPSBpd2xfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyKTsKKwl0eHEtPndyaXRlX3B0ciA9IGl3bF9xdWV1ZV9pbmNfd3JhcCh0eHEtPndyaXRlX3B0cik7CiAJaWYgKCF3YWl0X3dyaXRlX3B0cikKIAkJaXdsX3BjaWVfdHhxX2luY193cl9wdHIodHJhbnMsIHR4cSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVyc2lsL2hvc3RhcC9ob3N0YXBfaW9jdGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVyc2lsL2hvc3RhcC9ob3N0YXBfaW9jdGwuYwppbmRleCAzZTVmYTc4Li5hNTY1NmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9ob3N0YXAvaG9zdGFwX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZXJzaWwvaG9zdGFwL2hvc3RhcF9pb2N0bC5jCkBAIC0zMDQxLDEzICszMDQxLDkgQEAKIAkgICAgcC0+bGVuZ3RoID4gMTAyNCB8fCAhcC0+cG9pbnRlcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwYXJhbSA9IGttYWxsb2MocC0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQlpZiAocGFyYW0gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIocGFyYW0sIHAtPnBvaW50ZXIsIHAtPmxlbmd0aCkpIHsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBvdXQ7CisJcGFyYW0gPSBtZW1kdXBfdXNlcihwLT5wb2ludGVyLCBwLT5sZW5ndGgpOworCWlmIChJU19FUlIocGFyYW0pKSB7CisJCXJldHVybiBQVFJfRVJSKHBhcmFtKTsKIAl9CiAKIAlpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBwcmlzbTJfZG93bmxvYWRfcGFyYW0pICsKQEAgLTM4MDMsMTMgKzM3OTksOSBAQAogCSAgICBwLT5sZW5ndGggPiBQUklTTTJfSE9TVEFQRF9NQVhfQlVGX1NJWkUgfHwgIXAtPnBvaW50ZXIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcGFyYW0gPSBrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBhcmFtID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7Ci0JCXJldCA9IC1FRkFVTFQ7Ci0JCWdvdG8gb3V0OworCXBhcmFtID0gbWVtZHVwX3VzZXIocC0+cG9pbnRlciwgcC0+bGVuZ3RoKTsKKwlpZiAoSVNfRVJSKHBhcmFtKSkgeworCQlyZXR1cm4gUFRSX0VSUihwYXJhbSk7CiAJfQogCiAJc3dpdGNoIChwYXJhbS0+Y21kKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9vcmlub2NvL29yaW5vY29fdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pbnRlcnNpbC9vcmlub2NvL29yaW5vY29fdXNiLmMKaW5kZXggNTZmMTA5Yi4uYmNhNjkzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaW50ZXJzaWwvb3Jpbm9jby9vcmlub2NvX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2ludGVyc2lsL29yaW5vY28vb3Jpbm9jb191c2IuYwpAQCAtMTYxMywxMCArMTYxMyw4IEBACiAJCQl9CiAKIAkJCXVwcml2LT5yZWFkX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXVwcml2LT5yZWFkX3VyYikgewotCQkJCWVycigiTm8gZnJlZSB1cmJzIGF2YWlsYWJsZSIpOworCQkJaWYgKCF1cHJpdi0+cmVhZF91cmIpCiAJCQkJZ290byBlcnJvcjsKLQkJCX0KIAkJCWlmIChsZTE2X3RvX2NwdShlcC0+d01heFBhY2tldFNpemUpICE9IDY0KQogCQkJCXByX3dhcm4oImJ1bGsgaW46IHdNYXhQYWNrZXRTaXplIT0gNjRcbiIpOwogCQkJaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICE9ICgyIHwgVVNCX0RJUl9JTikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYwppbmRleCA4YzM1YWM4Li40MzFmMTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogfTsKIAogc3RhdGljIHNwaW5sb2NrX3QgaHdzaW1fcmFkaW9fbG9jazsKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGh3c2ltX3JhZGlvczsKK3N0YXRpYyBMSVNUX0hFQUQoaHdzaW1fcmFkaW9zKTsKIHN0YXRpYyBpbnQgaHdzaW1fcmFkaW9faWR4OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtYWM4MDIxMV9od3NpbV9kcml2ZXIgPSB7CkBAIC0zMzc2LDcgKzMzNzYsNiBAQAogCQltYWM4MDIxMV9od3NpbV91bmFzc2lnbl92aWZfY2hhbmN0eDsKIAogCXNwaW5fbG9ja19pbml0KCZod3NpbV9yYWRpb19sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmaHdzaW1fcmFkaW9zKTsKIAogCWVyciA9IHJlZ2lzdGVyX3Blcm5ldF9kZXZpY2UoJmh3c2ltX25ldF9vcHMpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL2xpYmVydGFzX3RmL2lmX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9saWJlcnRhc190Zi9pZl91c2IuYwppbmRleCA3OTlhMmVmLi5lMGFkZTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL2xpYmVydGFzX3RmL2lmX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbGliZXJ0YXNfdGYvaWZfdXNiLmMKQEAgLTE5OCwyMiArMTk4LDE2IEBACiAJfQogCiAJY2FyZHAtPnJ4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjYXJkcC0+cnhfdXJiKSB7Ci0JCWxidGZfZGViX3VzYmQoJnVkZXYtPmRldiwgIlJ4IFVSQiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFjYXJkcC0+cnhfdXJiKQogCQlnb3RvIGRlYWxsb2M7Ci0JfQogCiAJY2FyZHAtPnR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjYXJkcC0+dHhfdXJiKSB7Ci0JCWxidGZfZGViX3VzYmQoJnVkZXYtPmRldiwgIlR4IFVSQiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFjYXJkcC0+dHhfdXJiKQogCQlnb3RvIGRlYWxsb2M7Ci0JfQogCiAJY2FyZHAtPmNtZF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghY2FyZHAtPmNtZF91cmIpIHsKLQkJbGJ0Zl9kZWJfdXNiZCgmdWRldi0+ZGV2LCAiQ21kIFVSQiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFjYXJkcC0+Y21kX3VyYikKIAkJZ290byBkZWFsbG9jOwotCX0KIAogCWNhcmRwLT5lcF9vdXRfYnVmID0ga21hbGxvYyhNUlZEUlZfRVRIX1RYX1BBQ0tFVF9CVUZGRVJfU0laRSwKIAkJCQkgICAgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFoLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFoLmMKaW5kZXggODFjNjBkMC4uNDNkY2NkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExaC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMWguYwpAQCAtMjYwLDIyICsyNjAsMTcgQEAKIAogCXJkcl9ldmVudCA9ICh2b2lkICopKHNrYi0+ZGF0YSArIHNpemVvZih1MzIpKTsKIAotCWlmIChsZTMyX3RvX2NwdShyZHJfZXZlbnQtPnBhc3NlZCkpIHsKLQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgTVNHLAotCQkJICAgICJyYWRhciBkZXRlY3RlZDsgaW5kaWNhdGluZyBrZXJuZWxcbiIpOwotCQlpZiAobXdpZmlleF9zdG9wX3JhZGFyX2RldGVjdGlvbihwcml2LCAmcHJpdi0+ZGZzX2NoYW5kZWYpKQotCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgRVJST1IsCi0JCQkJICAgICJGYWlsZWQgdG8gc3RvcCBDQUMgaW4gRldcbiIpOwotCQljZmc4MDIxMV9yYWRhcl9ldmVudChwcml2LT5hZGFwdGVyLT53aXBoeSwgJnByaXYtPmRmc19jaGFuZGVmLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywgInJlZ2RvbWFpbjogJWRcbiIsCi0JCQkgICAgcmRyX2V2ZW50LT5yZWdfZG9tYWluKTsKLQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgTVNHLCAicmFkYXIgZGV0ZWN0aW9uIHR5cGU6ICVkXG4iLAotCQkJICAgIHJkcl9ldmVudC0+ZGV0X3R5cGUpOwotCX0gZWxzZSB7Ci0JCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywKLQkJCSAgICAiZmFsc2UgcmFkYXIgZGV0ZWN0aW9uIGV2ZW50IVxuIik7Ci0JfQorCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywKKwkJICAgICJyYWRhciBkZXRlY3RlZDsgaW5kaWNhdGluZyBrZXJuZWxcbiIpOworCWlmIChtd2lmaWV4X3N0b3BfcmFkYXJfZGV0ZWN0aW9uKHByaXYsICZwcml2LT5kZnNfY2hhbmRlZikpCisJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIEVSUk9SLAorCQkJICAgICJGYWlsZWQgdG8gc3RvcCBDQUMgaW4gRldcbiIpOworCWNmZzgwMjExX3JhZGFyX2V2ZW50KHByaXYtPmFkYXB0ZXItPndpcGh5LCAmcHJpdi0+ZGZzX2NoYW5kZWYsCisJCQkgICAgIEdGUF9LRVJORUwpOworCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywgInJlZ2RvbWFpbjogJWRcbiIsCisJCSAgICByZHJfZXZlbnQtPnJlZ19kb21haW4pOworCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIE1TRywgInJhZGFyIGRldGVjdGlvbiB0eXBlOiAlZFxuIiwKKwkJICAgIHJkcl9ldmVudC0+ZGV0X3R5cGUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuLmgKaW5kZXggYWZkZDU4YS4uZWEwZmE2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW4uaApAQCAtMTcxLDkgKzE3MSwxMCBAQAogc3RhdGljIGlubGluZSBpbnQgbXdpZmlleF9pc19zdGFfMTFuX2VuYWJsZWQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJICAgICBzdHJ1Y3QgbXdpZmlleF9zdGFfbm9kZSAqbm9kZSkKIHsKLQotCWlmICghbm9kZSB8fCAocHJpdi0+YnNzX3JvbGUgIT0gTVdJRklFWF9CU1NfUk9MRV9VQVApIHx8Ci0JICAgICFwcml2LT5hcF8xMW5fZW5hYmxlZCkKKwlpZiAoIW5vZGUgfHwgKChwcml2LT5ic3Nfcm9sZSA9PSBNV0lGSUVYX0JTU19ST0xFX1VBUCkgJiYKKwkJICAgICAgIXByaXYtPmFwXzExbl9lbmFibGVkKSB8fAorCSAgICAoKHByaXYtPmJzc19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSAmJgorCSAgICAgIXByaXYtPmFkYXB0ZXItPmFkaG9jXzExbl9lbmFibGVkKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gbm9kZS0+aXNfMTFuX2VuYWJsZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX2FnZ3IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fYWdnci5jCmluZGV4IGRjNDljM2QuLmM0N2Q2MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fYWdnci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fYWdnci5jCkBAIC0yMDUsNyArMjA1LDggQEAKIAogCWRvIHsKIAkJLyogQ2hlY2sgaWYgQU1TRFUgY2FuIGFjY29tbW9kYXRlIHRoaXMgTVNEVSAqLwotCQlpZiAoc2tiX3RhaWxyb29tKHNrYl9hZ2dyKSA8IChza2Jfc3JjLT5sZW4gKyBMTENfU05BUF9MRU4pKQorCQlpZiAoKHNrYl9hZ2dyLT5sZW4gKyBza2Jfc3JjLT5sZW4gKyBMTENfU05BUF9MRU4pID4KKwkJICAgIGFkYXB0ZXItPnR4X2J1Zl9zaXplKQogCQkJYnJlYWs7CiAKIAkJc2tiX3NyYyA9IHNrYl9kZXF1ZXVlKCZwcmFfbGlzdC0+c2tiX2hlYWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbl9yeHJlb3JkZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmMKaW5kZXggYTc0Y2M0My4uOTQ0ODAxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbl9yeHJlb3JkZXIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCkBAIC03OCw4ICs3OCwxNSBAQAogICovCiBzdGF0aWMgaW50IG13aWZpZXhfMTFuX2Rpc3BhdGNoX3BrdChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB2b2lkICpwYXlsb2FkKQogewotCWludCByZXQgPSBtd2lmaWV4XzExbl9kaXNwYXRjaF9hbXNkdV9wa3QocHJpdiwgcGF5bG9hZCk7CiAKKwlpbnQgcmV0OworCisJaWYgKCFwYXlsb2FkKSB7CisJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIElORk8sICJpbmZvOiBmdyBkcm9wIGRhdGFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBtd2lmaWV4XzExbl9kaXNwYXRjaF9hbXNkdV9wa3QocHJpdiwgcGF5bG9hZCk7CiAJaWYgKCFyZXQpCiAJCXJldHVybiAwOwogCkBAIC05MjEsMyArOTI4LDcyIEBACiAJZWxzZQogCQltd2lmaWV4X3VwZGF0ZV9hbXBkdV9yeHdpbnNpemUoYWRhcHRlciwgZmFsc2UpOwogfQorCisvKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgcnhiYV9zeW5jIGV2ZW50CisgKi8KK3ZvaWQgbXdpZmlleF8xMW5fcnhiYV9zeW5jX2V2ZW50KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCisJCQkJIHU4ICpldmVudF9idWYsIHUxNiBsZW4pCit7CisJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfcnhiYV9zeW5jICp0bHZfcnhiYSA9ICh2b2lkICopZXZlbnRfYnVmOworCXUxNiB0bHZfdHlwZSwgdGx2X2xlbjsKKwlzdHJ1Y3QgbXdpZmlleF9yeF9yZW9yZGVyX3RibCAqcnhfcmVvcl90YmxfcHRyOworCXU4IGksIGo7CisJdTE2IHNlcV9udW0sIHRsdl9zZXFfbnVtLCB0bHZfYml0bWFwX2xlbjsKKwlpbnQgdGx2X2J1Zl9sZWZ0ID0gbGVuOworCWludCByZXQ7CisJdTggKnRtcDsKKworCW13aWZpZXhfZGJnX2R1bXAocHJpdi0+YWRhcHRlciwgRVZUX0QsICJSWEJBX1NZTkMgZXZlbnQ6IiwKKwkJCSBldmVudF9idWYsIGxlbik7CisJd2hpbGUgKHRsdl9idWZfbGVmdCA+PSBzaXplb2YoKnRsdl9yeGJhKSkgeworCQl0bHZfdHlwZSA9IGxlMTZfdG9fY3B1KHRsdl9yeGJhLT5oZWFkZXIudHlwZSk7CisJCXRsdl9sZW4gID0gbGUxNl90b19jcHUodGx2X3J4YmEtPmhlYWRlci5sZW4pOworCQlpZiAodGx2X3R5cGUgIT0gVExWX1RZUEVfUlhCQV9TWU5DKSB7CisJCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBFUlJPUiwKKwkJCQkgICAgIldyb25nIFRMViBpZD0weCV4XG4iLCB0bHZfdHlwZSk7CisJCQlyZXR1cm47CisJCX0KKworCQl0bHZfc2VxX251bSA9IGxlMTZfdG9fY3B1KHRsdl9yeGJhLT5zZXFfbnVtKTsKKwkJdGx2X2JpdG1hcF9sZW4gPSBsZTE2X3RvX2NwdSh0bHZfcnhiYS0+Yml0bWFwX2xlbik7CisJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIElORk8sCisJCQkgICAgIiVwTSB0aWQ9JWQgc2VxX251bT0lZCBiaXRtYXBfbGVuPSVkXG4iLAorCQkJICAgIHRsdl9yeGJhLT5tYWMsIHRsdl9yeGJhLT50aWQsIHRsdl9zZXFfbnVtLAorCQkJICAgIHRsdl9iaXRtYXBfbGVuKTsKKworCQlyeF9yZW9yX3RibF9wdHIgPQorCQkJbXdpZmlleF8xMW5fZ2V0X3J4X3Jlb3JkZXJfdGJsKHByaXYsIHRsdl9yeGJhLT50aWQsCisJCQkJCQkgICAgICAgdGx2X3J4YmEtPm1hYyk7CisJCWlmICghcnhfcmVvcl90YmxfcHRyKSB7CisJCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBFUlJPUiwKKwkJCQkgICAgIkNhbiBub3QgZmluZCByeF9yZW9yZGVyX3RibCEiKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCB0bHZfYml0bWFwX2xlbjsgaSsrKSB7CisJCQlmb3IgKGogPSAwIDsgaiA8IDg7IGorKykgeworCQkJCWlmICh0bHZfcnhiYS0+Yml0bWFwW2ldICYgKDEgPDwgaikpIHsKKwkJCQkJc2VxX251bSA9IChNQVhfVElEX1ZBTFVFIC0gMSkgJgorCQkJCQkJKHRsdl9zZXFfbnVtICsgaSAqIDggKyBqKTsKKworCQkJCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBFUlJPUiwKKwkJCQkJCSAgICAiZHJvcCBwYWNrZXQsc2VxPSVkXG4iLAorCQkJCQkJICAgIHNlcV9udW0pOworCisJCQkJCXJldCA9IG13aWZpZXhfMTFuX3J4X3Jlb3JkZXJfcGt0CisJCQkJCShwcml2LCBzZXFfbnVtLCB0bHZfcnhiYS0+dGlkLAorCQkJCQkgdGx2X3J4YmEtPm1hYywgMCwgTlVMTCk7CisKKwkJCQkJaWYgKHJldCkKKwkJCQkJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsCisJCQkJCQkJICAgIEVSUk9SLAorCQkJCQkJCSAgICAiRmFpbCB0byBkcm9wIHBhY2tldCIpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXRsdl9idWZfbGVmdCAtPSAoc2l6ZW9mKCp0bHZfcnhiYSkgKyB0bHZfbGVuKTsKKwkJdG1wID0gKHU4ICopdGx2X3J4YmEgKyB0bHZfbGVuICsgc2l6ZW9mKCp0bHZfcnhiYSk7CisJCXRsdl9yeGJhID0gKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3J4YmFfc3luYyAqKXRtcDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX3J4cmVvcmRlci5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4LzExbl9yeHJlb3JkZXIuaAppbmRleCA2M2VjZWE4Li4yMmQ5OTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvMTFuX3J4cmVvcmRlci5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC8xMW5fcnhyZW9yZGVyLmgKQEAgLTgxLDUgKzgxLDYgQEAKIG13aWZpZXhfMTFuX2dldF9yeF9yZW9yZGVyX3RibChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCBpbnQgdGlkLCB1OCAqdGEpOwogdm9pZCBtd2lmaWV4XzExbl9kZWxfcnhfcmVvcmRlcl90YmxfYnlfdGEoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggKnRhKTsKIHZvaWQgbXdpZmlleF91cGRhdGVfcnhyZW9yX2ZsYWdzKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGZsYWdzKTsKLQordm9pZCBtd2lmaWV4XzExbl9yeGJhX3N5bmNfZXZlbnQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgdTggKmV2ZW50X2J1ZiwgdTE2IGxlbik7CiAjZW5kaWYgLyogX01XSUZJRVhfMTFOX1JYUkVPUkRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY2ZnODAyMTEuYwppbmRleCBhOGZmOTY5Li4zOWNlNzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY2ZnODAyMTEuYwpAQCAtNDg0LDYgKzQ4NCwyOSBAQAogfQogCiAvKgorICogQ0ZHODAyLjExIG9wZXJhdGlvbiBoYW5kbGVyIHRvIHNldCBkZWZhdWx0IG1nbXQga2V5LgorICovCitzdGF0aWMgaW50Cittd2lmaWV4X2NmZzgwMjExX3NldF9kZWZhdWx0X21nbXRfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgICAgICB1OCBrZXlfaW5kZXgpCit7CisJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiA9IG13aWZpZXhfbmV0ZGV2X2dldF9wcml2KG5ldGRldik7CisJc3RydWN0IG13aWZpZXhfZHNfZW5jcnlwdF9rZXkgZW5jcnlwdF9rZXk7CisKKwl3aXBoeV9kYmcod2lwaHksICJzZXQgZGVmYXVsdCBtZ210IGtleSwga2V5IGluZGV4PSVkXG4iLCBrZXlfaW5kZXgpOworCisJbWVtc2V0KCZlbmNyeXB0X2tleSwgMCwgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2RzX2VuY3J5cHRfa2V5KSk7CisJZW5jcnlwdF9rZXkua2V5X2xlbiA9IFdMQU5fS0VZX0xFTl9DQ01QOworCWVuY3J5cHRfa2V5LmtleV9pbmRleCA9IGtleV9pbmRleDsKKwllbmNyeXB0X2tleS5pc19pZ3RrX2RlZl9rZXkgPSB0cnVlOworCWV0aF9icm9hZGNhc3RfYWRkcihlbmNyeXB0X2tleS5tYWNfYWRkcik7CisKKwlyZXR1cm4gbXdpZmlleF9zZW5kX2NtZChwcml2LCBIb3N0Q21kX0NNRF84MDJfMTFfS0VZX01BVEVSSUFMLAorCQkJCUhvc3RDbWRfQUNUX0dFTl9TRVQsIHRydWUsICZlbmNyeXB0X2tleSwgdHJ1ZSk7Cit9CisKKy8qCiAgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGRvbWFpbiBpbmZvcm1hdGlvbiB0byB0aGUgZmlybXdhcmUuCiAgKgogICogVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhcmUgcGFzc2VkIHRvIHRoZSBmaXJtd2FyZSAtCkBAIC0yMDEyLDEwICsyMDM1LDYgQEAKIAlpZiAobXdpZmlleF9kZWF1dGhlbnRpY2F0ZShwcml2LCBOVUxMKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBNU0csCi0JCSAgICAiaW5mbzogc3VjY2Vzc2Z1bGx5IGRpc2Nvbm5lY3RlZCBmcm9tICVwTTpcdCIKLQkJICAgICJyZWFzb24gY29kZSAlZFxuIiwgcHJpdi0+Y2ZnX2Jzc2lkLCByZWFzb25fY29kZSk7Ci0KIAlldGhfemVyb19hZGRyKHByaXYtPmNmZ19ic3NpZCk7CiAJcHJpdi0+aHMyX2VuYWJsZWQgPSBmYWxzZTsKIApAQCAtMjQ4NSw2ICsyNTA0LDE2IEBACiAKIAlwcml2LT5zY2FuX3JlcXVlc3QgPSByZXF1ZXN0OwogCisJaWYgKHJlcXVlc3QtPmZsYWdzICYgTkw4MDIxMV9TQ0FOX0ZMQUdfUkFORE9NX0FERFIpIHsKKwkJZXRoZXJfYWRkcl9jb3B5KHByaXYtPnJhbmRvbV9tYWMsIHJlcXVlc3QtPm1hY19hZGRyKTsKKwkJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJCXByaXYtPnJhbmRvbV9tYWNbaV0gJj0gcmVxdWVzdC0+bWFjX2FkZHJfbWFza1tpXTsKKwkJCXByaXYtPnJhbmRvbV9tYWNbaV0gfD0gZ2V0X3JhbmRvbV9pbnQoKSAmCisJCQkJCSAgICAgICB+KHJlcXVlc3QtPm1hY19hZGRyX21hc2tbaV0pOworCQl9CisJfQorCisJZXRoZXJfYWRkcl9jb3B5KHVzZXJfc2Nhbl9jZmctPnJhbmRvbV9tYWMsIHByaXYtPnJhbmRvbV9tYWMpOwogCXVzZXJfc2Nhbl9jZmctPm51bV9zc2lkcyA9IHJlcXVlc3QtPm5fc3NpZHM7CiAJdXNlcl9zY2FuX2NmZy0+c3NpZF9saXN0ID0gcmVxdWVzdC0+c3NpZHM7CiAKQEAgLTI3MjYsNyArMjc1NSw3IEBACiAJCWh0X2luZm8tPmNhcCAmPSB+SUVFRTgwMjExX0hUX0NBUF9TR0lfNDA7CiAKIAlpZiAoYWRhcHRlci0+dXNlcl9kZXZfbWNzX3N1cHBvcnQgPT0gSFRfU1RSRUFNXzJYMikKLQkJaHRfaW5mby0+Y2FwIHw9IDMgPDwgSUVFRTgwMjExX0hUX0NBUF9SWF9TVEJDX1NISUZUOworCQlodF9pbmZvLT5jYXAgfD0gMiA8PCBJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQ7CiAJZWxzZQogCQlodF9pbmZvLT5jYXAgfD0gMSA8PCBJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQ7CiAKQEAgLTM5MTMsNiArMzk0Miw4OCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkw4MDIxMV9URVNUTU9ERQorCitlbnVtIG13aWZpZXhfdG1fYXR0ciB7CisJX19NV0lGSUVYX1RNX0FUVFJfSU5WQUxJRAk9IDAsCisJTVdJRklFWF9UTV9BVFRSX0NNRAkJPSAxLAorCU1XSUZJRVhfVE1fQVRUUl9EQVRBCQk9IDIsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlfX01XSUZJRVhfVE1fQVRUUl9BRlRFUl9MQVNULAorCU1XSUZJRVhfVE1fQVRUUl9NQVgJCT0gX19NV0lGSUVYX1RNX0FUVFJfQUZURVJfTEFTVCAtIDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbXdpZmlleF90bV9wb2xpY3lbTVdJRklFWF9UTV9BVFRSX01BWCArIDFdID0geworCVtNV0lGSUVYX1RNX0FUVFJfQ01EXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtNV0lGSUVYX1RNX0FUVFJfREFUQV0JCT0geyAudHlwZSA9IE5MQV9CSU5BUlksCisJCQkJCSAgICAubGVuID0gTVdJRklFWF9TSVpFX09GX0NNRF9CVUZGRVIgfSwKK307CisKK2VudW0gbXdpZmlleF90bV9jb21tYW5kIHsKKwlNV0lGSUVYX1RNX0NNRF9IT1NUQ01ECT0gMCwKK307CisKK3N0YXRpYyBpbnQgbXdpZmlleF90bV9jbWQoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCSAgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gbXdpZmlleF9uZXRkZXZfZ2V0X3ByaXYod2Rldi0+bmV0ZGV2KTsKKwlzdHJ1Y3QgbXdpZmlleF9kc19taXNjX2NtZCAqaG9zdGNtZDsKKwlzdHJ1Y3QgbmxhdHRyICp0YltNV0lGSUVYX1RNX0FUVFJfTUFYICsgMV07CisJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRUlOVkFMOworCWFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCisJZXJyID0gbmxhX3BhcnNlKHRiLCBNV0lGSUVYX1RNX0FUVFJfTUFYLCBkYXRhLCBsZW4sCisJCQltd2lmaWV4X3RtX3BvbGljeSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmICghdGJbTVdJRklFWF9UTV9BVFRSX0NNRF0pCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChubGFfZ2V0X3UzMih0YltNV0lGSUVYX1RNX0FUVFJfQ01EXSkpIHsKKwljYXNlIE1XSUZJRVhfVE1fQ01EX0hPU1RDTUQ6CisJCWlmICghdGJbTVdJRklFWF9UTV9BVFRSX0RBVEFdKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaG9zdGNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpob3N0Y21kKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaG9zdGNtZCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWhvc3RjbWQtPmxlbiA9IG5sYV9sZW4odGJbTVdJRklFWF9UTV9BVFRSX0RBVEFdKTsKKwkJbWVtY3B5KGhvc3RjbWQtPmNtZCwgbmxhX2RhdGEodGJbTVdJRklFWF9UTV9BVFRSX0RBVEFdKSwKKwkJICAgICAgIGhvc3RjbWQtPmxlbik7CisKKwkJaWYgKG13aWZpZXhfc2VuZF9jbWQocHJpdiwgMCwgMCwgMCwgaG9zdGNtZCwgdHJ1ZSkpIHsKKwkJCWRldl9lcnIocHJpdi0+YWRhcHRlci0+ZGV2LCAiRmFpbGVkIHRvIHByb2Nlc3MgaG9zdGNtZFxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCS8qIHByb2Nlc3MgaG9zdGNtZCByZXNwb25zZSovCisJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYih3aXBoeSwgaG9zdGNtZC0+bGVuKTsKKwkJaWYgKCFza2IpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZXJyID0gbmxhX3B1dChza2IsIE1XSUZJRVhfVE1fQVRUUl9EQVRBLAorCQkJICAgICAgaG9zdGNtZC0+bGVuLCBob3N0Y21kLT5jbWQpOworCQlpZiAoZXJyKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKworCQllcnIgPSBjZmc4MDIxMV90ZXN0bW9kZV9yZXBseShza2IpOworCQlrZnJlZShob3N0Y21kKTsKKwkJcmV0dXJuIGVycjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorI2VuZGlmCisKIHN0YXRpYyBpbnQKIG13aWZpZXhfY2ZnODAyMTFfc3RhcnRfcmFkYXJfZGV0ZWN0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0zOTk0LDYgKzQxMDUsNyBAQAogCS5sZWF2ZV9pYnNzID0gbXdpZmlleF9jZmc4MDIxMV9sZWF2ZV9pYnNzLAogCS5hZGRfa2V5ID0gbXdpZmlleF9jZmc4MDIxMV9hZGRfa2V5LAogCS5kZWxfa2V5ID0gbXdpZmlleF9jZmc4MDIxMV9kZWxfa2V5LAorCS5zZXRfZGVmYXVsdF9tZ210X2tleSA9IG13aWZpZXhfY2ZnODAyMTFfc2V0X2RlZmF1bHRfbWdtdF9rZXksCiAJLm1nbXRfdHggPSBtd2lmaWV4X2NmZzgwMjExX21nbXRfdHgsCiAJLm1nbXRfZnJhbWVfcmVnaXN0ZXIgPSBtd2lmaWV4X2NmZzgwMjExX21nbXRfZnJhbWVfcmVnaXN0ZXIsCiAJLnJlbWFpbl9vbl9jaGFubmVsID0gbXdpZmlleF9jZmc4MDIxMV9yZW1haW5fb25fY2hhbm5lbCwKQEAgLTQwMjUsNiArNDEzNyw3IEBACiAJLnRkbHNfY2FuY2VsX2NoYW5uZWxfc3dpdGNoID0gbXdpZmlleF9jZmc4MDIxMV90ZGxzX2NhbmNlbF9jaGFuX3N3aXRjaCwKIAkuYWRkX3N0YXRpb24gPSBtd2lmaWV4X2NmZzgwMjExX2FkZF9zdGF0aW9uLAogCS5jaGFuZ2Vfc3RhdGlvbiA9IG13aWZpZXhfY2ZnODAyMTFfY2hhbmdlX3N0YXRpb24sCisJQ0ZHODAyMTFfVEVTVE1PREVfQ01EKG13aWZpZXhfdG1fY21kKQogCS5nZXRfY2hhbm5lbCA9IG13aWZpZXhfY2ZnODAyMTFfZ2V0X2NoYW5uZWwsCiAJLnN0YXJ0X3JhZGFyX2RldGVjdGlvbiA9IG13aWZpZXhfY2ZnODAyMTFfc3RhcnRfcmFkYXJfZGV0ZWN0aW9uLAogCS5jaGFubmVsX3N3aXRjaCA9IG13aWZpZXhfY2ZnODAyMTFfY2hhbm5lbF9zd2l0Y2gsCkBAIC00MTM1LDkgKzQyNDgsMTIgQEAKIAl3aXBoeS0+Y2lwaGVyX3N1aXRlcyA9IG13aWZpZXhfY2lwaGVyX3N1aXRlczsKIAl3aXBoeS0+bl9jaXBoZXJfc3VpdGVzID0gQVJSQVlfU0laRShtd2lmaWV4X2NpcGhlcl9zdWl0ZXMpOwogCi0JaWYgKGFkYXB0ZXItPnJlZ2lvbl9jb2RlKQotCQl3aXBoeS0+cmVndWxhdG9yeV9mbGFncyB8PSBSRUdVTEFUT1JZX0RJU0FCTEVfQkVBQ09OX0hJTlRTIHwKKwlpZiAoYWRhcHRlci0+cmVnZCkgeworCQl3aXBoeS0+cmVndWxhdG9yeV9mbGFncyB8PSBSRUdVTEFUT1JZX0NVU1RPTV9SRUcgfAorCQkJCQkgICBSRUdVTEFUT1JZX0RJU0FCTEVfQkVBQ09OX0hJTlRTIHwKIAkJCQkJICAgUkVHVUxBVE9SWV9DT1VOVFJZX0lFX0lHTk9SRTsKKwkJd2lwaHlfYXBwbHlfY3VzdG9tX3JlZ3VsYXRvcnkod2lwaHksIGFkYXB0ZXItPnJlZ2QpOworCX0KIAogCWV0aGVyX2FkZHJfY29weSh3aXBoeS0+cGVybV9hZGRyLCBhZGFwdGVyLT5wZXJtX2FkZHIpOwogCXdpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX01CTTsKQEAgLTQxNzMsNyArNDI4OSwxMCBAQAogCXdpcGh5LT5mZWF0dXJlcyB8PSBOTDgwMjExX0ZFQVRVUkVfSFRfSUJTUyB8CiAJCQkgICBOTDgwMjExX0ZFQVRVUkVfSU5BQ1RJVklUWV9USU1FUiB8CiAJCQkgICBOTDgwMjExX0ZFQVRVUkVfTE9XX1BSSU9SSVRZX1NDQU4gfAotCQkJICAgTkw4MDIxMV9GRUFUVVJFX05FRURfT0JTU19TQ0FOOworCQkJICAgTkw4MDIxMV9GRUFUVVJFX05FRURfT0JTU19TQ0FOIHwKKwkJCSAgIE5MODAyMTFfRkVBVFVSRV9TQ0FOX1JBTkRPTV9NQUNfQUREUiB8CisJCQkgICBOTDgwMjExX0ZFQVRVUkVfU0NIRURfU0NBTl9SQU5ET01fTUFDX0FERFIgfAorCQkJICAgTkw4MDIxMV9GRUFUVVJFX05EX1JBTkRPTV9NQUNfQUREUjsKIAogCWlmIChJU1NVUFBfVERMU19FTkFCTEVEKGFkYXB0ZXItPmZ3X2NhcF9pbmZvKSkKIAkJd2lwaHktPmZlYXR1cmVzIHw9IE5MODAyMTFfRkVBVFVSRV9URExTX0NIQU5ORUxfU1dJVENIOwpAQCAtNDIwMCwxOSArNDMxOSwyNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChyZWdfYWxwaGEyICYmIG13aWZpZXhfaXNfdmFsaWRfYWxwaGEyKHJlZ19hbHBoYTIpKSB7Ci0JCW13aWZpZXhfZGJnKGFkYXB0ZXIsIElORk8sCi0JCQkgICAgImRyaXZlciBoaW50IGFscGhhMjogJTIuMnNcbiIsIHJlZ19hbHBoYTIpOwotCQlyZWd1bGF0b3J5X2hpbnQod2lwaHksIHJlZ19hbHBoYTIpOwotCX0gZWxzZSB7Ci0JCWlmIChhZGFwdGVyLT5yZWdpb25fY29kZSA9PSAweDAwKSB7Ci0JCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBXQVJOLCAiSWdub3JlIHdvcmxkIHJlZ3VsYXRvcnkgZG9tYWluXG4iKTsKKwlpZiAoIWFkYXB0ZXItPnJlZ2QpIHsKKwkJaWYgKHJlZ19hbHBoYTIgJiYgbXdpZmlleF9pc192YWxpZF9hbHBoYTIocmVnX2FscGhhMikpIHsKKwkJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIElORk8sCisJCQkJICAgICJkcml2ZXIgaGludCBhbHBoYTI6ICUyLjJzXG4iLCByZWdfYWxwaGEyKTsKKwkJCXJlZ3VsYXRvcnlfaGludCh3aXBoeSwgcmVnX2FscGhhMik7CiAJCX0gZWxzZSB7Ci0JCQljb3VudHJ5X2NvZGUgPQotCQkJCW13aWZpZXhfMTFkX2NvZGVfMl9yZWdpb24oYWRhcHRlci0+cmVnaW9uX2NvZGUpOwotCQkJaWYgKGNvdW50cnlfY29kZSAmJgotCQkJICAgIHJlZ3VsYXRvcnlfaGludCh3aXBoeSwgY291bnRyeV9jb2RlKSkKLQkJCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBFUlJPUiwgInJlZ3VsYXRvcnlfaGludCgpIGZhaWxlZFxuIik7CisJCQlpZiAoYWRhcHRlci0+cmVnaW9uX2NvZGUgPT0gMHgwMCkgeworCQkJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIFdBUk4sCisJCQkJCSAgICAiSWdub3JlIHdvcmxkIHJlZ3VsYXRvcnkgZG9tYWluXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJd2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0KKwkJCQkJUkVHVUxBVE9SWV9ESVNBQkxFX0JFQUNPTl9ISU5UUyB8CisJCQkJCVJFR1VMQVRPUllfQ09VTlRSWV9JRV9JR05PUkU7CisJCQkJY291bnRyeV9jb2RlID0KKwkJCQkJbXdpZmlleF8xMWRfY29kZV8yX3JlZ2lvbigKKwkJCQkJCWFkYXB0ZXItPnJlZ2lvbl9jb2RlKTsKKwkJCQlpZiAoY291bnRyeV9jb2RlICYmCisJCQkJICAgIHJlZ3VsYXRvcnlfaGludCh3aXBoeSwgY291bnRyeV9jb2RlKSkKKwkJCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgRVJST1IsCisJCQkJCQkgICAgInJlZ3VsYXRvcnlfaGludCgpIGZhaWxlZFxuIik7CisJCQl9CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9jbWRldnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9jbWRldnQuYwppbmRleCBjMjlmMjZkLi41MzQ3NzI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvY21kZXZ0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2NtZGV2dC5jCkBAIC00ODAsMTMgKzQ4MCwyNyBAQAogICovCiBpbnQgbXdpZmlleF9wcm9jZXNzX2V2ZW50KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBpOwogCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPQogCQltd2lmaWV4X2dldF9wcml2KGFkYXB0ZXIsIE1XSUZJRVhfQlNTX1JPTEVfQU5ZKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gYWRhcHRlci0+ZXZlbnRfc2tiOwotCXUzMiBldmVudGNhdXNlID0gYWRhcHRlci0+ZXZlbnRfY2F1c2U7CisJdTMyIGV2ZW50Y2F1c2U7CiAJc3RydWN0IG13aWZpZXhfcnhpbmZvICpyeF9pbmZvOwogCisJaWYgKChhZGFwdGVyLT5ldmVudF9jYXVzZSAmIEVWRU5UX0lEX01BU0spID09IEVWRU5UX1JBREFSX0RFVEVDVEVEKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5wcml2X251bTsgaSsrKSB7CisJCQlwcml2ID0gYWRhcHRlci0+cHJpdltpXTsKKwkJCWlmIChwcml2ICYmIG13aWZpZXhfaXNfMTFoX2FjdGl2ZShwcml2KSkgeworCQkJCWFkYXB0ZXItPmV2ZW50X2NhdXNlIHw9CisJCQkJCSgocHJpdi0+YnNzX251bSAmIDB4ZmYpIDw8IDE2KSB8CisJCQkJCSgocHJpdi0+YnNzX3R5cGUgJiAweGZmKSA8PCAyNCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlldmVudGNhdXNlID0gYWRhcHRlci0+ZXZlbnRfY2F1c2U7CisKIAkvKiBTYXZlIHRoZSBsYXN0IGV2ZW50IHRvIGRlYnVnIGxvZyAqLwogCWFkYXB0ZXItPmRiZy5sYXN0X2V2ZW50X2luZGV4ID0KIAkJCShhZGFwdGVyLT5kYmcubGFzdF9ldmVudF9pbmRleCArIDEpICUgREJHX0NNRF9OVU07CkBAIC01ODEsNiArNTk1LDE0IEBACiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CisJLyogV2UgZG9uJ3QgZXhwZWN0IGNvbW1hbmRzIGluIG1hbnVmYWN0dXJpbmcgbW9kZS4gVGhleSBhcmUgY29va2VkCisJICogaW4gYXBwbGljYXRpb24gYW5kIHJlYWR5IHRvIGRvd25sb2FkIGJ1ZmZlciBpcyBwYXNzZWQgdG8gdGhlIGRyaXZlcgorCSAqLworCWlmIChhZGFwdGVyLT5tZmdfbW9kZSAmJiBjbWRfbm8pIHsKKwkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJJZ25vcmluZyBjb21tYW5kcyBpbiBtYW51ZmFjdHVyaW5nIG1vZGVcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCiAKIAkvKiBHZXQgYSBuZXcgY29tbWFuZCBub2RlICovCiAJY21kX25vZGUgPSBtd2lmaWV4X2dldF9jbWRfbm9kZShhZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZGVidWdmcy5jCmluZGV4IGJjY2YxN2EuLmI5Mjg0YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2RlYnVnZnMuYwpAQCAtMTE4LDYgKzExOCw4IEBACiAJCXAgKz0gc3ByaW50ZihwLCAiYnNzaWQ9XCIlcE1cIlxuIiwgaW5mby5ic3NpZCk7CiAJCXAgKz0gc3ByaW50ZihwLCAiY2hhbm5lbD1cIiVkXCJcbiIsIChpbnQpIGluZm8uYnNzX2NoYW4pOwogCQlwICs9IHNwcmludGYocCwgImNvdW50cnlfY29kZSA9IFwiJXNcIlxuIiwgaW5mby5jb3VudHJ5X2NvZGUpOworCQlwICs9IHNwcmludGYocCwgInJlZ2lvbl9jb2RlPVwiMHgleFwiXG4iLAorCQkJICAgICBwcml2LT5hZGFwdGVyLT5yZWdpb25fY29kZSk7CiAKIAkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIG5ldGRldikKIAkJCXAgKz0gc3ByaW50ZihwLCAibXVsdGljYXN0X2FkZHJlc3NbJWRdPVwiJXBNXCJcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvZncuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9mdy5oCmluZGV4IDU1OTZiNmIuLjRiMTg5NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9mdy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9mdy5oCkBAIC03OCw2ICs3OCw3IEBACiAJS0VZX1RZUEVfSURfQUVTLAogCUtFWV9UWVBFX0lEX1dBUEksCiAJS0VZX1RZUEVfSURfQUVTX0NNQUMsCisJS0VZX1RZUEVfSURfQUVTX0NNQUNfREVGLAogfTsKIAogI2RlZmluZSBXUEFfUE5fU0laRQkJOApAQCAtMTc2LDYgKzE3Nyw3IEBACiAjZGVmaW5lIFRMVl9UWVBFX1BXS19DSVBIRVIgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNDUpCiAjZGVmaW5lIFRMVl9UWVBFX0dXS19DSVBIRVIgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNDYpCiAjZGVmaW5lIFRMVl9UWVBFX1RYX1BBVVNFICAgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNDgpCisjZGVmaW5lIFRMVl9UWVBFX1JYQkFfU1lOQyAgICAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNTMpCiAjZGVmaW5lIFRMVl9UWVBFX0NPQUxFU0NFX1JVTEUgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNTQpCiAjZGVmaW5lIFRMVl9UWVBFX0tFWV9QQVJBTV9WMiAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNTYpCiAjZGVmaW5lIFRMVl9UWVBFX1JFUEVBVF9DT1VOVCAgICAgICAoUFJPUFJJRVRBUllfVExWX0JBU0VfSUQgKyAxNzYpCkBAIC0xODgsNiArMTkwLDggQEAKICNkZWZpbmUgVExWX0JUQ09FWF9XTF9BR0dSX1dJTlNJWkUgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIwMikKICNkZWZpbmUgVExWX0JUQ09FWF9XTF9TQ0FOVElNRSAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIwMykKICNkZWZpbmUgVExWX1RZUEVfQlNTX01PREUgICAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIwNikKKyNkZWZpbmUgVExWX1RZUEVfUkFORE9NX01BQyAgICAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIzNikKKyNkZWZpbmUgVExWX1RZUEVfQ0hBTl9BVFRSX0NGRyAgICAgIChQUk9QUklFVEFSWV9UTFZfQkFTRV9JRCArIDIzNykKIAogI2RlZmluZSBNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfMksgICAgICAgIDIwNDgKIApAQCAtMjA4LDYgKzIxMiw3IEBACiAKICNkZWZpbmUgTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzRLICAgICAgICA0MDk2CiAjZGVmaW5lIE1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV84SyAgICAgICAgODE5MgorI2RlZmluZSBNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfMTJLICAgICAgIDEyMjg4CiAKICNkZWZpbmUgSVNTVVBQXzExTkVOQUJMRUQoRndDYXBJbmZvKSAoRndDYXBJbmZvICYgQklUKDExKSkKICNkZWZpbmUgSVNTVVBQX1RETFNfRU5BQkxFRChGd0NhcEluZm8pIChGd0NhcEluZm8gJiBCSVQoMTQpKQpAQCAtMzc5LDYgKzM4NCw3IEBACiAjZGVmaW5lIEhvc3RDbWRfQ01EX01DX1BPTElDWSAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMjEKICNkZWZpbmUgSG9zdENtZF9DTURfVERMU19PUEVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyMgogI2RlZmluZSBIb3N0Q21kX0NNRF9TRElPX1NQX1JYX0FHR1JfQ0ZHICAgICAgICAgICAgICAgMHgwMjIzCisjZGVmaW5lIEhvc3RDbWRfQ01EX0NIQU5fUkVHSU9OX0NGRwkJICAgICAgMHgwMjQyCiAKICNkZWZpbmUgUFJPVE9DT0xfTk9fU0VDVVJJVFkgICAgICAgIDB4MDEKICNkZWZpbmUgUFJPVE9DT0xfU1RBVElDX1dFUCAgICAgICAgIDB4MDIKQEAgLTQxMSw2ICs0MTcsMTQgQEAKIAlQMlBfTU9ERV9DTElFTlQgPSAzLAogfTsKIAorZW51bSBtd2lmaWV4X2NoYW5uZWxfZmxhZ3MgeworCU1XSUZJRVhfQ0hBTk5FTF9QQVNTSVZFID0gQklUKDApLAorCU1XSUZJRVhfQ0hBTk5FTF9ERlMgPSBCSVQoMSksCisJTVdJRklFWF9DSEFOTkVMX05PSFQ0MCA9IEJJVCgyKSwKKwlNV0lGSUVYX0NIQU5ORUxfTk9IVDgwID0gQklUKDMpLAorCU1XSUZJRVhfQ0hBTk5FTF9ESVNBQkxFRCA9IEJJVCg3KSwKK307CisKICNkZWZpbmUgSG9zdENtZF9SRVRfQklUICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAKICNkZWZpbmUgSG9zdENtZF9BQ1RfR0VOX0dFVCAgICAgICAgICAgICAgICAgICAweDAwMDAKICNkZWZpbmUgSG9zdENtZF9BQ1RfR0VOX1NFVCAgICAgICAgICAgICAgICAgICAweDAwMDEKQEAgLTUwNCw2ICs1MTgsOCBAQAogI2RlZmluZSBFVkVOVF9SU1NJX0hJR0ggICAgICAgICAgICAgICAgIDB4MDAwMDAwMWMKICNkZWZpbmUgRVZFTlRfU05SX0hJR0ggICAgICAgICAgICAgICAgICAweDAwMDAwMDFkCiAjZGVmaW5lIEVWRU5UX0lCU1NfQ09BTEVTQ0VEICAgICAgICAgICAgMHgwMDAwMDAxZQorI2RlZmluZSBFVkVOVF9JQlNTX1NUQV9DT05ORUNUICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRVZFTlRfSUJTU19TVEFfRElTQ09OTkVDVCAgICAgICAweDAwMDAwMDIxCiAjZGVmaW5lIEVWRU5UX0RBVEFfUlNTSV9MT1cgICAgICAgICAgICAgMHgwMDAwMDAyNAogI2RlZmluZSBFVkVOVF9EQVRBX1NOUl9MT1cgICAgICAgICAgICAgIDB4MDAwMDAwMjUKICNkZWZpbmUgRVZFTlRfREFUQV9SU1NJX0hJR0ggICAgICAgICAgICAweDAwMDAwMDI2CkBAIC01MzEsNiArNTQ3LDcgQEAKICNkZWZpbmUgRVZFTlRfQ0hBTk5FTF9SRVBPUlRfUkRZICAgICAgICAweDAwMDAwMDU0CiAjZGVmaW5lIEVWRU5UX1RYX0RBVEFfUEFVU0UgICAgICAgICAgICAgMHgwMDAwMDA1NQogI2RlZmluZSBFVkVOVF9FWFRfU0NBTl9SRVBPUlQgICAgICAgICAgIDB4MDAwMDAwNTgKKyNkZWZpbmUgRVZFTlRfUlhCQV9TWU5DICAgICAgICAgICAgICAgICAweDAwMDAwMDU5CiAjZGVmaW5lIEVWRU5UX0JHX1NDQU5fU1RPUFBFRCAgICAgICAgICAgMHgwMDAwMDA2NQogI2RlZmluZSBFVkVOVF9SRU1BSU5fT05fQ0hBTl9FWFBJUkVEICAgIDB4MDAwMDAwNWYKICNkZWZpbmUgRVZFTlRfTVVMVElfQ0hBTl9JTkZPICAgICAgICAgICAweDAwMDAwMDZhCkBAIC03MzQsNiArNzUxLDE2IEBACiAJc3RydWN0IG13aWZpZXhfY2hhbl9zY2FuX3BhcmFtX3NldCBjaGFuX3NjYW5fcGFyYW1bMV07CiB9IF9fcGFja2VkOwogCitzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19yeGJhX3N5bmMgeworCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2hlYWRlciBoZWFkZXI7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1OCB0aWQ7CisJdTggcmVzZXJ2ZWQ7CisJX19sZTE2IHNlcV9udW07CisJX19sZTE2IGJpdG1hcF9sZW47CisJdTggYml0bWFwWzFdOworfSBfX3BhY2tlZDsKKwogc3RydWN0IGNoYW5fYmFuZF9wYXJhbV9zZXQgewogCXU4IHJhZGlvX3R5cGU7CiAJdTggY2hhbl9udW1iZXI7CkBAIC03ODAsNiArODA3LDExIEBACiAJX19sZTE2IGNoYW5fZ2FwOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfcmFuZG9tX21hYyB7CisJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaGVhZGVyIGhlYWRlcjsKKwl1OCBtYWNbRVRIX0FMRU5dOworfSBfX3BhY2tlZDsKKwogc3RydWN0IG13aWZpZXhfaWV0eXBlc19jaGFuc3RhdHMgewogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2hlYWRlciBoZWFkZXI7CiAJc3RydWN0IG13aWZpZXhfZndfY2hhbl9zdGF0cyBjaGFuc3RhdHNbMF07CkBAIC0xNDY0LDYgKzE0OTYsNyBAQAogCS8qIFZhcmlhYmxlIG51bWJlciAoZml4ZWQgbWF4aW11bSkgb2YgY2hhbm5lbHMgdG8gc2NhbiB1cCAqLwogCXN0cnVjdCBtd2lmaWV4X3VzZXJfc2Nhbl9jaGFuIGNoYW5fbGlzdFtNV0lGSUVYX1VTRVJfU0NBTl9DSEFOX01BWF07CiAJdTE2IHNjYW5fY2hhbl9nYXA7CisJdTggcmFuZG9tX21hY1tFVEhfQUxFTl07CiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIE1XSUZJRVhfQkdfU0NBTl9DSEFOX01BWCAzOApAQCAtMTY0Niw3ICsxNjc5LDcgQEAKIH07CiAKIHN0cnVjdCBob3N0X2NtZF9kc19zdGFfbGlzdCB7Ci0JdTE2IHN0YV9jb3VudDsKKwlfX2xlMTYgc3RhX2NvdW50OwogCXU4IHRsdlswXTsKIH0gX19wYWNrZWQ7CiAKQEAgLTE2NjcsNiArMTcwMCwxMiBAQAogCXU4IHdtbV9pZVsxXTsKIH07CiAKK3N0cnVjdCBtd2lmaWV4X2llX3R5cGVzX21nbXRfZnJhbWUgeworCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2hlYWRlciBoZWFkZXI7CisJX19sZTE2IGZyYW1lX2NvbnRyb2w7CisJdTggZnJhbWVfY29udGVudHNbMF07Cit9OworCiBzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc193bW1fcXVldWVfc3RhdHVzIHsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19oZWFkZXIgaGVhZGVyOwogCXU4IHF1ZXVlX2luZGV4OwpAQCAtMjAzNCwyNiArMjA3MywyNiBAQAogCiBzdHJ1Y3QgaG9zdF9jbWRfZHNfcGNpZV9kZXRhaWxzIHsKIAkvKiBUWCBidWZmZXIgZGVzY3JpcHRvciByaW5nIGFkZHJlc3MgKi8KLQl1MzIgdHhiZF9hZGRyX2xvOwotCXUzMiB0eGJkX2FkZHJfaGk7CisJX19sZTMyIHR4YmRfYWRkcl9sbzsKKwlfX2xlMzIgdHhiZF9hZGRyX2hpOwogCS8qIFRYIGJ1ZmZlciBkZXNjcmlwdG9yIHJpbmcgY291bnQgKi8KLQl1MzIgdHhiZF9jb3VudDsKKwlfX2xlMzIgdHhiZF9jb3VudDsKIAogCS8qIFJYIGJ1ZmZlciBkZXNjcmlwdG9yIHJpbmcgYWRkcmVzcyAqLwotCXUzMiByeGJkX2FkZHJfbG87Ci0JdTMyIHJ4YmRfYWRkcl9oaTsKKwlfX2xlMzIgcnhiZF9hZGRyX2xvOworCV9fbGUzMiByeGJkX2FkZHJfaGk7CiAJLyogUlggYnVmZmVyIGRlc2NyaXB0b3IgcmluZyBjb3VudCAqLwotCXUzMiByeGJkX2NvdW50OworCV9fbGUzMiByeGJkX2NvdW50OwogCiAJLyogRXZlbnQgYnVmZmVyIGRlc2NyaXB0b3IgcmluZyBhZGRyZXNzICovCi0JdTMyIGV2dGJkX2FkZHJfbG87Ci0JdTMyIGV2dGJkX2FkZHJfaGk7CisJX19sZTMyIGV2dGJkX2FkZHJfbG87CisJX19sZTMyIGV2dGJkX2FkZHJfaGk7CiAJLyogRXZlbnQgYnVmZmVyIGRlc2NyaXB0b3IgcmluZyBjb3VudCAqLwotCXUzMiBldnRiZF9jb3VudDsKKwlfX2xlMzIgZXZ0YmRfY291bnQ7CiAKIAkvKiBTbGVlcCBjb29raWUgYnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MgKi8KLQl1MzIgc2xlZXBfY29va2llX2FkZHJfbG87Ci0JdTMyIHNsZWVwX2Nvb2tpZV9hZGRyX2hpOworCV9fbGUzMiBzbGVlcF9jb29raWVfYWRkcl9sbzsKKwlfX2xlMzIgc2xlZXBfY29va2llX2FkZHJfaGk7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19yc3NpX3RocmVzaG9sZCB7CkBAIC0yMDkzLDggKzIxMzIsOCBAQAogCXU4IGNoYW5fYnVmX3dlaWdodDsKIAl1OCBiYW5kX2NvbmZpZzsKIAl1OCBjaGFuX251bTsKLQl1MzIgY2hhbl90aW1lOwotCXUzMiByZXNlcnZlZDsKKwlfX2xlMzIgY2hhbl90aW1lOworCV9fbGUzMiByZXNlcnZlZDsKIAl1bmlvbiB7CiAJCXU4IHNkaW9fZnVuY19udW07CiAJCXU4IHVzYl9lcF9udW07CkBAIC0yMTg1LDcgKzIyMjQsNyBAQAogfSBfX3BhY2tlZDsKIAogc3RydWN0IGhvc3RfY21kX2RzX3dha2V1cF9yZWFzb24gewotCXUxNiAgd2FrZXVwX3JlYXNvbjsKKwlfX2xlMTYgIHdha2V1cF9yZWFzb247CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdF9jbWRfZHNfZ3RrX3Jla2V5X3BhcmFtcyB7CkBAIC0yMTk2LDYgKzIyMzUsMTAgQEAKIAlfX2xlMzIgcmVwbGF5X2N0cl9oaWdoOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IGhvc3RfY21kX2RzX2NoYW5fcmVnaW9uX2NmZyB7CisJX19sZTE2IGFjdGlvbjsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kIHsKIAlfX2xlMTYgY29tbWFuZDsKIAlfX2xlMTYgc2l6ZTsKQEAgLTIyNzAsNiArMjMxMyw3IEBACiAJCXN0cnVjdCBob3N0X2NtZF9kc19yb2J1c3RfY29leCBjb2V4OwogCQlzdHJ1Y3QgaG9zdF9jbWRfZHNfd2FrZXVwX3JlYXNvbiBoc193YWtldXBfcmVhc29uOwogCQlzdHJ1Y3QgaG9zdF9jbWRfZHNfZ3RrX3Jla2V5X3BhcmFtcyByZWtleTsKKwkJc3RydWN0IGhvc3RfY21kX2RzX2NoYW5fcmVnaW9uX2NmZyByZWdfY2ZnOwogCX0gcGFyYW1zOwogfSBfX3BhY2tlZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pbml0LmMKaW5kZXggMTQ4OWM5MC4uODI4MzlkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2luaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvaW5pdC5jCkBAIC0yOTgsNiArMjk4LDcgQEAKIAltZW1zZXQoJmFkYXB0ZXItPmFycF9maWx0ZXIsIDAsIHNpemVvZihhZGFwdGVyLT5hcnBfZmlsdGVyKSk7CiAJYWRhcHRlci0+YXJwX2ZpbHRlcl9zaXplID0gMDsKIAlhZGFwdGVyLT5tYXhfbWdtdF9pZV9pbmRleCA9IE1BWF9NR01UX0lFX0lOREVYOworCWFkYXB0ZXItPm1mZ19tb2RlID0gbWZnX21vZGU7CiAJYWRhcHRlci0+a2V5X2FwaV9tYWpvcl92ZXIgPSAwOwogCWFkYXB0ZXItPmtleV9hcGlfbWlub3JfdmVyID0gMDsKIAlldGhfYnJvYWRjYXN0X2FkZHIoYWRhcHRlci0+cGVybV9hZGRyKTsKQEAgLTU1MywxNSArNTU0LDIyIEBACiAJCQkJcmV0dXJuIC0xOwogCQl9CiAJfQorCWlmIChhZGFwdGVyLT5tZmdfbW9kZSkgeworCQlhZGFwdGVyLT5od19zdGF0dXMgPSBNV0lGSUVYX0hXX1NUQVRVU19SRUFEWTsKKwkJcmV0ID0gLUVJTlBST0dSRVNTOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5wcml2X251bTsgaSsrKSB7CisJCQlpZiAoYWRhcHRlci0+cHJpdltpXSkgeworCQkJCXJldCA9IG13aWZpZXhfc3RhX2luaXRfY21kKGFkYXB0ZXItPnByaXZbaV0sCisJCQkJCQkJICAgZmlyc3Rfc3RhLCB0cnVlKTsKKwkJCQlpZiAocmV0ID09IC0xKQorCQkJCQlyZXR1cm4gLTE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cHJpdl9udW07IGkrKykgewotCQlpZiAoYWRhcHRlci0+cHJpdltpXSkgewotCQkJcmV0ID0gbXdpZmlleF9zdGFfaW5pdF9jbWQoYWRhcHRlci0+cHJpdltpXSwgZmlyc3Rfc3RhLAotCQkJCQkJICAgdHJ1ZSk7Ci0JCQlpZiAocmV0ID09IC0xKQotCQkJCXJldHVybiAtMTsKKwkJCQlmaXJzdF9zdGEgPSBmYWxzZTsKKwkJCX0KIAotCQkJZmlyc3Rfc3RhID0gZmFsc2U7CisKKwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvaW9jdGwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pb2N0bC5oCmluZGV4IDcwNDI5ODEuLjUzNmFiODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pb2N0bC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9pb2N0bC5oCkBAIC0yNjAsNiArMjYwLDcgQEAKIAl1OCBpc19pZ3RrX2tleTsKIAl1OCBpc19jdXJyZW50X3dlcF9rZXk7CiAJdTggaXNfcnhfc2VxX3ZhbGlkOworCXU4IGlzX2lndGtfZGVmX2tleTsKIH07CiAKIHN0cnVjdCBtd2lmaWV4X3Bvd2VyX2NmZyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvam9pbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L2pvaW4uYwppbmRleCAxYzdiMDA2Li5iODk1OTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvam9pbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9qb2luLmMKQEAgLTY2OSw5ICs2NjksOCBAQAogCXByaXYtPmFzc29jX3JzcF9zaXplID0gbWluKGxlMTZfdG9fY3B1KHJlc3AtPnNpemUpIC0gU19EU19HRU4sCiAJCQkJICAgc2l6ZW9mKHByaXYtPmFzc29jX3JzcF9idWYpKTsKIAotCW1lbWNweShwcml2LT5hc3NvY19yc3BfYnVmLCAmcmVzcC0+cGFyYW1zLCBwcml2LT5hc3NvY19yc3Bfc2l6ZSk7Ci0KIAlhc3NvY19yc3AtPmFfaWQgPSBjcHVfdG9fbGUxNihhaWQpOworCW1lbWNweShwcml2LT5hc3NvY19yc3BfYnVmLCAmcmVzcC0+cGFyYW1zLCBwcml2LT5hc3NvY19yc3Bfc2l6ZSk7CiAKIAlpZiAoc3RhdHVzX2NvZGUpIHsKIAkJcHJpdi0+YWRhcHRlci0+ZGJnLm51bV9jbWRfYXNzb2NfZmFpbHVyZSsrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmMKaW5kZXggZGI0OTI1ZC4uMjQ3OGNjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvbWFpbi5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAiMTFuLmgiCiAKICNkZWZpbmUgVkVSU0lPTgkiMS4wIgorI2RlZmluZSBNRkdfRklSTVdBUkUJIm13aWZpZXhfbWZnLmJpbiIKIAogc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1Z19tYXNrID0gTVdJRklFWF9ERUZBVUxUX0RFQlVHX01BU0s7CiBtb2R1bGVfcGFyYW0oZGVidWdfbWFzaywgdWludCwgMCk7CkBAIC0zNyw2ICszOCwxMCBAQAogTU9EVUxFX1BBUk1fREVTQyhkcml2ZXJfbW9kZSwKIAkJICJzdGF0aW9uPTB4MShkZWZhdWx0KSwgYXAtc3RhPTB4Mywgc3RhdGlvbi1wMnA9MHg1LCBhcC1zdGEtcDJwPTB4NyIpOwogCitib29sIG1mZ19tb2RlOworbW9kdWxlX3BhcmFtKG1mZ19tb2RlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobWZnX21vZGUsICJtYW51ZmFjdHVyaW5nIG1vZGUgZW5hYmxlOjEsIGRpc2FibGU6MCIpOworCiAvKgogICogVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgdGhlIGRldmljZSBhbmQgcGVyZm9ybXMgYWxsIHRoZSBuZWNlc3NhcnkKICAqIGluaXRpYWxpemF0aW9ucy4KQEAgLTEzOSw2ICsxNDQsOCBAQAogCQlhZGFwdGVyLT5uZF9pbmZvID0gTlVMTDsKIAl9CiAKKwlrZnJlZShhZGFwdGVyLT5yZWdkKTsKKwogCXZmcmVlKGFkYXB0ZXItPmNoYW5fc3RhdHMpOwogCWtmcmVlKGFkYXB0ZXIpOwogCXJldHVybiAwOwpAQCAtNDg2LDkgKzQ5MywxMSBAQAogICovCiBzdGF0aWMgdm9pZCBtd2lmaWV4X3Rlcm1pbmF0ZV93b3JrcXVldWUoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlmbHVzaF93b3JrcXVldWUoYWRhcHRlci0+d29ya3F1ZXVlKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShhZGFwdGVyLT53b3JrcXVldWUpOwotCWFkYXB0ZXItPndvcmtxdWV1ZSA9IE5VTEw7CisJaWYgKGFkYXB0ZXItPndvcmtxdWV1ZSkgeworCQlmbHVzaF93b3JrcXVldWUoYWRhcHRlci0+d29ya3F1ZXVlKTsKKwkJZGVzdHJveV93b3JrcXVldWUoYWRhcHRlci0+d29ya3F1ZXVlKTsKKwkJYWRhcHRlci0+d29ya3F1ZXVlID0gTlVMTDsKKwl9CiAKIAlpZiAoYWRhcHRlci0+cnhfd29ya3F1ZXVlKSB7CiAJCWZsdXNoX3dvcmtxdWV1ZShhZGFwdGVyLT5yeF93b3JrcXVldWUpOwpAQCAtNTU5LDE2ICs1NjgsMjEgQEAKIAkJZ290byBkb25lOwogCX0KIAkvKiBXYWl0IGZvciBtd2lmaWV4X2luaXQgdG8gY29tcGxldGUgKi8KLQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYWRhcHRlci0+aW5pdF93YWl0X3EsCi0JCQkJIGFkYXB0ZXItPmluaXRfd2FpdF9xX3dva2VuKTsKLQlpZiAoYWRhcHRlci0+aHdfc3RhdHVzICE9IE1XSUZJRVhfSFdfU1RBVFVTX1JFQURZKQotCQlnb3RvIGVycl9pbml0X2Z3OworCWlmICghYWRhcHRlci0+bWZnX21vZGUpIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGFkYXB0ZXItPmluaXRfd2FpdF9xLAorCQkJCQkgYWRhcHRlci0+aW5pdF93YWl0X3Ffd29rZW4pOworCQlpZiAoYWRhcHRlci0+aHdfc3RhdHVzICE9IE1XSUZJRVhfSFdfU1RBVFVTX1JFQURZKQorCQkJZ290byBlcnJfaW5pdF9mdzsKKwl9CiAKIAlwcml2ID0gYWRhcHRlci0+cHJpdltNV0lGSUVYX0JTU19ST0xFX1NUQV07Ci0JaWYgKG13aWZpZXhfcmVnaXN0ZXJfY2ZnODAyMTEoYWRhcHRlcikpIHsKLQkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCi0JCQkgICAgImNhbm5vdCByZWdpc3RlciB3aXRoIGNmZzgwMjExXG4iKTsKLQkJZ290byBlcnJfaW5pdF9mdzsKKworCWlmICghYWRhcHRlci0+d2lwaHkpIHsKKwkJaWYgKG13aWZpZXhfcmVnaXN0ZXJfY2ZnODAyMTEoYWRhcHRlcikpIHsKKwkJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAorCQkJCSAgICAiY2Fubm90IHJlZ2lzdGVyIHdpdGggY2ZnODAyMTFcbiIpOworCQkJZ290byBlcnJfaW5pdF9mdzsKKwkJfQogCX0KIAogCWlmIChtd2lmaWV4X2luaXRfY2hhbm5lbF9zY2FuX2dhcChhZGFwdGVyKSkgewpAQCAtNjYyLDE2ICs2NzYsNDEgQEAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBoYXJkd2FyZSBhbmQgZ2V0cyBmaXJtd2FyZS4KICAqLwotc3RhdGljIGludCBtd2lmaWV4X2luaXRfaHdfZncoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKK3N0YXRpYyBpbnQgbXdpZmlleF9pbml0X2h3X2Z3KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgICBib29sIHJlcV9md19ub3dhaXQpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCAxLCBhZGFwdGVyLT5md19uYW1lLAotCQkJCSAgICAgIGFkYXB0ZXItPmRldiwgR0ZQX0tFUk5FTCwgYWRhcHRlciwKLQkJCQkgICAgICBtd2lmaWV4X2Z3X2RwYyk7Ci0JaWYgKHJldCA8IDApCi0JCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAotCQkJICAgICJyZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCBlcnJvciAlZFxuIiwgcmV0KTsKKwkvKiBPdmVycmlkZSBkZWZhdWx0IGZpcm13YXJlIHdpdGggbWFudWZhY3R1cmluZyBvbmUgaWYKKwkgKiBtYW51ZmFjdHVyaW5nIG1vZGUgaXMgZW5hYmxlZAorCSAqLworCWlmIChtZmdfbW9kZSkgeworCQlpZiAoc3RybGNweShhZGFwdGVyLT5md19uYW1lLCBNRkdfRklSTVdBUkUsCisJCQkgICAgc2l6ZW9mKGFkYXB0ZXItPmZ3X25hbWUpKSA+PQorCQkJICAgIHNpemVvZihhZGFwdGVyLT5md19uYW1lKSkgeworCQkJcHJfZXJyKCIlczogZndfbmFtZSB0b28gbG9uZyFcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChyZXFfZndfbm93YWl0KSB7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLCAxLCBhZGFwdGVyLT5md19uYW1lLAorCQkJCQkgICAgICBhZGFwdGVyLT5kZXYsIEdGUF9LRVJORUwsIGFkYXB0ZXIsCisJCQkJCSAgICAgIG13aWZpZXhfZndfZHBjKTsKKwkJaWYgKHJldCA8IDApCisJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKKwkJCQkgICAgInJlcXVlc3RfZmlybXdhcmVfbm93YWl0IGVycm9yICVkXG4iLCByZXQpOworCX0gZWxzZSB7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmFkYXB0ZXItPmZpcm13YXJlLAorCQkJCSAgICAgICBhZGFwdGVyLT5md19uYW1lLAorCQkJCSAgICAgICBhZGFwdGVyLT5kZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAorCQkJCSAgICAicmVxdWVzdF9maXJtd2FyZSBlcnJvciAlZFxuIiwgcmV0KTsKKwkJZWxzZQorCQkJbXdpZmlleF9md19kcGMoYWRhcHRlci0+ZmlybXdhcmUsICh2b2lkICopYWRhcHRlcik7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTMyMSw2ICsxMzYwLDE5OSBAQAogfQogCiAvKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBkdXJpbmcgUENJZSBmdW5jdGlvbiBsZXZlbCByZXNldC4gUmVxdWlyZWQKKyAqIGNvZGUgaXMgZXh0cmFjdGVkIGZyb20gbXdpZmlleF9yZW1vdmVfY2FyZCgpCisgKi8KK3N0YXRpYyBpbnQKK213aWZpZXhfc2h1dGRvd25fc3coc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHNlbWFwaG9yZSAqc2VtKQoreworCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXY7CisJaW50IGk7CisKKwlpZiAoIWFkYXB0ZXIpCisJCWdvdG8gZXhpdF9yZXR1cm47CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKHNlbSkpCisJCWdvdG8gZXhpdF9zZW1fZXJyOworCisJcHJpdiA9IG13aWZpZXhfZ2V0X3ByaXYoYWRhcHRlciwgTVdJRklFWF9CU1NfUk9MRV9BTlkpOworCW13aWZpZXhfZGVhdXRoZW50aWNhdGUocHJpdiwgTlVMTCk7CisKKwkvKiBXZSBjYW4gbm8gbG9uZ2VyIGhhbmRsZSBpbnRlcnJ1cHRzIG9uY2Ugd2Ugc3RhcnQgZG9pbmcgdGhlIHRlYXJkb3duCisJICogYmVsb3cuCisJICovCisJaWYgKGFkYXB0ZXItPmlmX29wcy5kaXNhYmxlX2ludCkKKwkJYWRhcHRlci0+aWZfb3BzLmRpc2FibGVfaW50KGFkYXB0ZXIpOworCisJYWRhcHRlci0+c3VycHJpc2VfcmVtb3ZlZCA9IHRydWU7CisJbXdpZmlleF90ZXJtaW5hdGVfd29ya3F1ZXVlKGFkYXB0ZXIpOworCisJLyogU3RvcCBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnByaXZfbnVtOyBpKyspIHsKKwkJcHJpdiA9IGFkYXB0ZXItPnByaXZbaV07CisJCWlmIChwcml2ICYmIHByaXYtPm5ldGRldikgeworCQkJbXdpZmlleF9zdG9wX25ldF9kZXZfcXVldWUocHJpdi0+bmV0ZGV2LCBhZGFwdGVyKTsKKwkJCWlmIChuZXRpZl9jYXJyaWVyX29rKHByaXYtPm5ldGRldikpCisJCQkJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmV0ZGV2KTsKKwkJCW5ldGlmX2RldmljZV9kZXRhY2gocHJpdi0+bmV0ZGV2KTsKKwkJfQorCX0KKworCW13aWZpZXhfZGJnKGFkYXB0ZXIsIENNRCwgImNtZDogY2FsbGluZyBtd2lmaWV4X3NodXRkb3duX2Rydi4uLlxuIik7CisJYWRhcHRlci0+aW5pdF93YWl0X3Ffd29rZW4gPSBmYWxzZTsKKworCWlmIChtd2lmaWV4X3NodXRkb3duX2RydihhZGFwdGVyKSA9PSAtRUlOUFJPR1JFU1MpCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhZGFwdGVyLT5pbml0X3dhaXRfcSwKKwkJCQkJIGFkYXB0ZXItPmluaXRfd2FpdF9xX3dva2VuKTsKKwlpZiAoYWRhcHRlci0+aWZfb3BzLmRvd25fZGV2KQorCQlhZGFwdGVyLT5pZl9vcHMuZG93bl9kZXYoYWRhcHRlcik7CisKKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBDTUQsICJjbWQ6IG13aWZpZXhfc2h1dGRvd25fZHJ2IGRvbmVcbiIpOworCWlmIChhdG9taWNfcmVhZCgmYWRhcHRlci0+cnhfcGVuZGluZykgfHwKKwkgICAgYXRvbWljX3JlYWQoJmFkYXB0ZXItPnR4X3BlbmRpbmcpIHx8CisJICAgIGF0b21pY19yZWFkKCZhZGFwdGVyLT5jbWRfcGVuZGluZykpIHsKKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCisJCQkgICAgInJ4X3BlbmRpbmc9JWQsIHR4X3BlbmRpbmc9JWQsXHQiCisJCQkgICAgImNtZF9wZW5kaW5nPSVkXG4iLAorCQkJICAgIGF0b21pY19yZWFkKCZhZGFwdGVyLT5yeF9wZW5kaW5nKSwKKwkJCSAgICBhdG9taWNfcmVhZCgmYWRhcHRlci0+dHhfcGVuZGluZyksCisJCQkgICAgYXRvbWljX3JlYWQoJmFkYXB0ZXItPmNtZF9wZW5kaW5nKSk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnByaXZfbnVtOyBpKyspIHsKKwkJcHJpdiA9IGFkYXB0ZXItPnByaXZbaV07CisJCWlmICghcHJpdikKKwkJCWNvbnRpbnVlOworCQlydG5sX2xvY2soKTsKKwkJaWYgKHByaXYtPm5ldGRldiAmJgorCQkgICAgcHJpdi0+d2Rldi5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQpCisJCQltd2lmaWV4X2RlbF92aXJ0dWFsX2ludGYoYWRhcHRlci0+d2lwaHksICZwcml2LT53ZGV2KTsKKwkJcnRubF91bmxvY2soKTsKKwl9CisKKwl1cChzZW0pOworZXhpdF9zZW1fZXJyOgorCW13aWZpZXhfZGJnKGFkYXB0ZXIsIElORk8sICIlcywgc3VjY2Vzc2Z1bFxuIiwgX19mdW5jX18pOworZXhpdF9yZXR1cm46CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZHVyaW5nIFBDSWUgZnVuY3Rpb24gbGV2ZWwgcmVzZXQuIFJlcXVpcmVkCisgKiBjb2RlIGlzIGV4dHJhY3RlZCBmcm9tIG13aWZpZXhfYWRkX2NhcmQoKQorICovCitzdGF0aWMgaW50Cittd2lmaWV4X3JlaW5pdF9zdyhzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3Qgc2VtYXBob3JlICpzZW0sCisJCSAgc3RydWN0IG13aWZpZXhfaWZfb3BzICppZl9vcHMsIHU4IGlmYWNlX3R5cGUpCit7CisJY2hhciBmd19uYW1lWzMyXTsKKwlzdHJ1Y3QgcGNpZV9zZXJ2aWNlX2NhcmQgKmNhcmQgPSBhZGFwdGVyLT5jYXJkOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZShzZW0pKQorCQlnb3RvIGV4aXRfc2VtX2VycjsKKworCW13aWZpZXhfaW5pdF9sb2NrX2xpc3QoYWRhcHRlcik7CisJaWYgKGFkYXB0ZXItPmlmX29wcy51cF9kZXYpCisJCWFkYXB0ZXItPmlmX29wcy51cF9kZXYoYWRhcHRlcik7CisKKwlhZGFwdGVyLT5pZmFjZV90eXBlID0gaWZhY2VfdHlwZTsKKwlhZGFwdGVyLT5jYXJkX3NlbSA9IHNlbTsKKworCWFkYXB0ZXItPmh3X3N0YXR1cyA9IE1XSUZJRVhfSFdfU1RBVFVTX0lOSVRJQUxJWklORzsKKwlhZGFwdGVyLT5zdXJwcmlzZV9yZW1vdmVkID0gZmFsc2U7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYWRhcHRlci0+aW5pdF93YWl0X3EpOworCWFkYXB0ZXItPmlzX3N1c3BlbmRlZCA9IGZhbHNlOworCWFkYXB0ZXItPmhzX2FjdGl2YXRlZCA9IGZhbHNlOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFkYXB0ZXItPmhzX2FjdGl2YXRlX3dhaXRfcSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYWRhcHRlci0+Y21kX3dhaXRfcS53YWl0KTsKKwlhZGFwdGVyLT5jbWRfd2FpdF9xLnN0YXR1cyA9IDA7CisJYWRhcHRlci0+c2Nhbl93YWl0X3Ffd29rZW4gPSBmYWxzZTsKKworCWlmICgobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDEpIHx8IGFkYXB0ZXItPmlmYWNlX3R5cGUgPT0gTVdJRklFWF9VU0IpCisJCWFkYXB0ZXItPnJ4X3dvcmtfZW5hYmxlZCA9IHRydWU7CisKKwlhZGFwdGVyLT53b3JrcXVldWUgPQorCQlhbGxvY193b3JrcXVldWUoIk1XSUZJRVhfV09SS19RVUVVRSIsCisJCQkJV1FfSElHSFBSSSB8IFdRX01FTV9SRUNMQUlNIHwgV1FfVU5CT1VORCwgMSk7CisJaWYgKCFhZGFwdGVyLT53b3JrcXVldWUpCisJCWdvdG8gZXJyX2ttYWxsb2M7CisKKwlJTklUX1dPUksoJmFkYXB0ZXItPm1haW5fd29yaywgbXdpZmlleF9tYWluX3dvcmtfcXVldWUpOworCisJaWYgKGFkYXB0ZXItPnJ4X3dvcmtfZW5hYmxlZCkgeworCQlhZGFwdGVyLT5yeF93b3JrcXVldWUgPSBhbGxvY193b3JrcXVldWUoIk1XSUZJRVhfUlhfV09SS19RVUVVRSIsCisJCQkJCQkJV1FfSElHSFBSSSB8CisJCQkJCQkJV1FfTUVNX1JFQ0xBSU0gfAorCQkJCQkJCVdRX1VOQk9VTkQsIDEpOworCQlpZiAoIWFkYXB0ZXItPnJ4X3dvcmtxdWV1ZSkKKwkJCWdvdG8gZXJyX2ttYWxsb2M7CisJCUlOSVRfV09SSygmYWRhcHRlci0+cnhfd29yaywgbXdpZmlleF9yeF93b3JrX3F1ZXVlKTsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgZGV2aWNlLiBGaWxsIHVwIHRoZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlIHdpdGgKKwkgKiByZWxldmFudCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjYXJkLiBTb21lIGNvZGUgZXh0cmFjdGVkIGZyb20KKwkgKiBtd2lmaWV4X3JlZ2lzdGVyX2RldigpCisJICovCisJbXdpZmlleF9kYmcoYWRhcHRlciwgSU5GTywgIiVzLCBtd2lmaWV4X2luaXRfaHdfZncoKS4uLlxuIiwgX19mdW5jX18pOworCXN0cmNweShmd19uYW1lLCBhZGFwdGVyLT5md19uYW1lKTsKKwlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwgUENJRTg5OTdfREVGQVVMVF9XSUZJRldfTkFNRSk7CisKKwlhZGFwdGVyLT50eF9idWZfc2l6ZSA9IGNhcmQtPnBjaWUudHhfYnVmX3NpemU7CisJYWRhcHRlci0+ZXh0X3NjYW4gPSBjYXJkLT5wY2llLmNhbl9leHRfc2NhbjsKKwlpZiAobXdpZmlleF9pbml0X2h3X2Z3KGFkYXB0ZXIsIGZhbHNlKSkgeworCQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwgZndfbmFtZSk7CisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAorCQkJICAgICIlczogZmlybXdhcmUgaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfaW5pdF9mdzsKKwl9CisJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIGZ3X25hbWUpOworCW13aWZpZXhfZGJnKGFkYXB0ZXIsIElORk8sICIlcywgc3VjY2Vzc2Z1bFxuIiwgX19mdW5jX18pOworCXVwKHNlbSk7CisJcmV0dXJuIDA7CisKK2Vycl9pbml0X2Z3OgorCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLCAiaW5mbzogJXM6IHVucmVnaXN0ZXIgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGFkYXB0ZXItPmlmX29wcy51bnJlZ2lzdGVyX2RldikKKwkJYWRhcHRlci0+aWZfb3BzLnVucmVnaXN0ZXJfZGV2KGFkYXB0ZXIpOworCWlmIChhZGFwdGVyLT5od19zdGF0dXMgPT0gTVdJRklFWF9IV19TVEFUVVNfUkVBRFkpIHsKKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCisJCQkgICAgImluZm86ICVzOiBzaHV0ZG93biBtd2lmaWV4XG4iLCBfX2Z1bmNfXyk7CisJCWFkYXB0ZXItPmluaXRfd2FpdF9xX3dva2VuID0gZmFsc2U7CisKKwkJaWYgKG13aWZpZXhfc2h1dGRvd25fZHJ2KGFkYXB0ZXIpID09IC1FSU5QUk9HUkVTUykKKwkJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShhZGFwdGVyLT5pbml0X3dhaXRfcSwKKwkJCQkJCSBhZGFwdGVyLT5pbml0X3dhaXRfcV93b2tlbik7CisJfQorCitlcnJfa21hbGxvYzoKKwltd2lmaWV4X3Rlcm1pbmF0ZV93b3JrcXVldWUoYWRhcHRlcik7CisJYWRhcHRlci0+c3VycHJpc2VfcmVtb3ZlZCA9IHRydWU7CisJdXAoc2VtKTsKK2V4aXRfc2VtX2VycjoKKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLCAiJXMsIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHByZSBhbmQgcG9zdCBQQ0llIGZ1bmN0aW9uIGxldmVsIHJlc2V0cy4KKyAqIEl0IHBlcmZvcm1zIHNvZnR3YXJlIGNsZWFudXAgd2l0aG91dCB0b3VjaGluZyBQQ0llIHNwZWNpZmljIGNvZGUuCisgKiBBbHNvLCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gUENJZSBzdHVmZiBpcyBza2lwcGVkLgorICovCit2b2lkIG13aWZpZXhfZG9fZmxyKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgcHJlcGFyZSkKK3sKKwlzdHJ1Y3QgbXdpZmlleF9pZl9vcHMgaWZfb3BzOworCisJaWYgKCFwcmVwYXJlKSB7CisJCW13aWZpZXhfcmVpbml0X3N3KGFkYXB0ZXIsIGFkYXB0ZXItPmNhcmRfc2VtLCAmaWZfb3BzLAorCQkJCSAgYWRhcHRlci0+aWZhY2VfdHlwZSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KCZpZl9vcHMsICZhZGFwdGVyLT5pZl9vcHMsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWZfb3BzKSk7CisJCW13aWZpZXhfc2h1dGRvd25fc3coYWRhcHRlciwgYWRhcHRlci0+Y2FyZF9zZW0pOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKG13aWZpZXhfZG9fZmxyKTsKKworLyoKICAqIFRoaXMgZnVuY3Rpb24gYWRkcyB0aGUgY2FyZC4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIGZvbGxvd2luZyBtYWpvciBzdGVwcyB0byBzZXQgdXAgdGhlIGRldmljZSAtCkBAIC0xMzkxLDcgKzE2MjMsNyBAQAogCQlnb3RvIGVycl9yZWdpc3RlcmRldjsKIAl9CiAKLQlpZiAobXdpZmlleF9pbml0X2h3X2Z3KGFkYXB0ZXIpKSB7CisJaWYgKG13aWZpZXhfaW5pdF9od19mdyhhZGFwdGVyLCB0cnVlKSkgewogCQlwcl9lcnIoIiVzOiBmaXJtd2FyZSBpbml0IGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlnb3RvIGVycl9pbml0X2Z3OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvbWFpbi5oCmluZGV4IDlmNmJiNDAuLjI2ZGYyOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9tYWluLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L21haW4uaApAQCAtNTgsNiArNTgsNyBAQAogI2luY2x1ZGUgInNkaW8uaCIKIAogZXh0ZXJuIGNvbnN0IGNoYXIgZHJpdmVyX3ZlcnNpb25bXTsKK2V4dGVybiBib29sIG1mZ19tb2RlOwogCiBzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyOwogc3RydWN0IG13aWZpZXhfcHJpdmF0ZTsKQEAgLTY3NSw2ICs2NzYsNyBAQAogCXN0cnVjdCBtd2lmaWV4X3VzZXJfc2Nhbl9jaGFuIGhpZGRlbl9jaGFuW01XSUZJRVhfVVNFUl9TQ0FOX0NIQU5fTUFYXTsKIAl1OCBhc3NvY19yZXNwX2h0X3BhcmFtOwogCWJvb2wgaHRfcGFyYW1fcHJlc2VudDsKKwl1OCByYW5kb21fbWFjW0VUSF9BTEVOXTsKIH07CiAKIApAQCAtODI3LDYgKzgyOSw4IEBACiAJdm9pZCAoKmRlYWdncl9wa3QpKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiAJdm9pZCAoKm11bHRpX3BvcnRfcmVzeW5jKShzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICopOwogCWJvb2wgKCppc19wb3J0X3JlYWR5KShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICopOworCXZvaWQgKCpkb3duX2Rldikoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqKTsKKwl2b2lkICgqdXBfZGV2KShzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICopOwogfTsKIAogc3RydWN0IG13aWZpZXhfYWRhcHRlciB7CkBAIC05ODksNiArOTkzLDcgQEAKIAl1MzIgZHJ2X2luZm9fc2l6ZTsKIAlib29sIHNjYW5fY2hhbl9nYXBfZW5hYmxlZDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X2RhdGFfcTsKKwlib29sIG1mZ19tb2RlOwogCXN0cnVjdCBtd2lmaWV4X2NoYW5fc3RhdHMgKmNoYW5fc3RhdHM7CiAJdTMyIG51bV9pbl9jaGFuX3N0YXRzOwogCWludCBzdXJ2ZXlfaWR4OwpAQCAtMTAwNCw2ICsxMDA5LDcgQEAKIAlib29sIHVzYl9tY19zdGF0dXM7CiAJYm9vbCB1c2JfbWNfc2V0dXA7CiAJc3RydWN0IGNmZzgwMjExX3dvd2xhbl9uZF9pbmZvICpuZF9pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZWdkOwogfTsKIAogdm9pZCBtd2lmaWV4X3Byb2Nlc3NfdHhfcXVldWUoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcik7CkBAIC0xNjI1LDQgKzE2MzEsNSBAQAogdm9pZCBtd2lmaWV4X2Rldl9kZWJ1Z2ZzX2luaXQoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdik7CiB2b2lkIG13aWZpZXhfZGV2X2RlYnVnZnNfcmVtb3ZlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYpOwogI2VuZGlmCit2b2lkIG13aWZpZXhfZG9fZmxyKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgcHJlcGFyZSk7CiAjZW5kaWYgLyogIV9NV0lGSUVYX01BSU5fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvcGNpZS5jCmluZGV4IDQ1M2FiNmEuLjNjM2M0ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJaWYgKCFhZGFwdGVyIHx8ICFhZGFwdGVyLT5wcml2X251bSkKIAkJcmV0dXJuOwogCi0JaWYgKHVzZXJfcm1tb2QpIHsKKwlpZiAodXNlcl9ybW1vZCAmJiAhYWRhcHRlci0+bWZnX21vZGUpIHsKICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIAkJaWYgKGFkYXB0ZXItPmlzX3N1c3BlbmRlZCkKIAkJCW13aWZpZXhfcGNpZV9yZXN1bWUoJnBkZXYtPmRldik7CkBAIC0yNzcsNiArMjc3LDUyIEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBtd2lmaWV4X2lkcyk7CiAKK3N0YXRpYyB2b2lkIG13aWZpZXhfcGNpZV9yZXNldF9ub3RpZnkoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGJvb2wgcHJlcGFyZSkKK3sKKwlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyOworCXN0cnVjdCBwY2llX3NlcnZpY2VfY2FyZCAqY2FyZDsKKworCWlmICghcGRldikgeworCQlwcl9lcnIoIiVzOiBQQ0llIGRldmljZSBpcyBub3Qgc3BlY2lmaWVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybjsKKwl9CisKKwljYXJkID0gKHN0cnVjdCBwY2llX3NlcnZpY2VfY2FyZCAqKXBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpZiAoIWNhcmQgfHwgIWNhcmQtPmFkYXB0ZXIpIHsKKwkJcHJfZXJyKCIlczogQ2FyZCBvciBhZGFwdGVyIHN0cnVjdHVyZSBpcyBub3QgdmFsaWQgKCVsZClcbiIsCisJCSAgICAgICBfX2Z1bmNfXywgKGxvbmcpY2FyZCk7CisJCXJldHVybjsKKwl9CisKKwlhZGFwdGVyID0gY2FyZC0+YWRhcHRlcjsKKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLAorCQkgICAgIiVzOiB2ZW5kb3I9MHglNC4wNHggZGV2aWNlPTB4JTQuMDR4IHJldj0lZCAlc1xuIiwKKwkJICAgIF9fZnVuY19fLCBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKKwkJICAgIHBkZXYtPnJldmlzaW9uLAorCQkgICAgcHJlcGFyZSA/ICJQcmUtRkxSIiA6ICJQb3N0LUZMUiIpOworCisJaWYgKHByZXBhcmUpIHsKKwkJLyogS2VybmVsIHdvdWxkIGJlIHBlcmZvcm1pbmcgRkxSIGFmdGVyIHRoaXMgbm90aWZpY2F0aW9uLgorCQkgKiBDbGVhbnVwIGFsbCBzb2Z0d2FyZSB3aXRob3V0IGNsZWFuaW5nIGFueXRoaW5nIHJlbGF0ZWQgdG8KKwkJICogUENJZSBhbmQgSFcuCisJCSAqLworCQltd2lmaWV4X2RvX2ZscihhZGFwdGVyLCBwcmVwYXJlKTsKKwkJYWRhcHRlci0+c3VycHJpc2VfcmVtb3ZlZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJLyogS2VybmVsIHN0b3JlcyBhbmQgcmVzdG9yZXMgUENJZSBmdW5jdGlvbiBjb250ZXh0IGJlZm9yZSBhbmQKKwkJICogYWZ0ZXIgcGVyZm9ybWluZyBGTFIgcmVzcGVjdGl2ZWx5LiBSZWNvbmZpZ3VyZSB0aGUgc29mdHdhcmUKKwkJICogYW5kIGZpcm13YXJlIGluY2x1ZGluZyBmaXJtd2FyZSByZWRvd25sb2FkCisJCSAqLworCQlhZGFwdGVyLT5zdXJwcmlzZV9yZW1vdmVkID0gZmFsc2U7CisJCW13aWZpZXhfZG9fZmxyKGFkYXB0ZXIsIHByZXBhcmUpOworCX0KKwltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLCAiJXMsIHN1Y2Nlc3NmdWxcbiIsIF9fZnVuY19fKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgbXdpZmlleF9wY2llX2Vycl9oYW5kbGVyW10gPSB7CisJCXsgLnJlc2V0X25vdGlmeSA9IG13aWZpZXhfcGNpZV9yZXNldF9ub3RpZnksIH0sCit9OworCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAvKiBQb3dlciBNYW5hZ2VtZW50IEhvb2tzICovCiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobXdpZmlleF9wY2llX3BtX29wcywgbXdpZmlleF9wY2llX3N1c3BlbmQsCkBAIC0yOTUsNiArMzQxLDcgQEAKIAl9LAogI2VuZGlmCiAJLnNodXRkb3duID0gbXdpZmlleF9wY2llX3NodXRkb3duLAorCS5lcnJfaGFuZGxlciA9IG13aWZpZXhfcGNpZV9lcnJfaGFuZGxlciwKIH07CiAKIC8qCkBAIC0xOTU2LDggKzIwMDMsNiBAQAogCQkJaWYgKGZpcm13YXJlX2xlbiAtIG9mZnNldCA8IHR4bGVuKQogCQkJCXR4bGVuID0gZmlybXdhcmVfbGVuIC0gb2Zmc2V0OwogCi0JCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLCAiLiIpOwotCiAJCQl0eF9ibG9ja3MgPSAodHhsZW4gKyBjYXJkLT5wY2llLmJsa3N6X2Z3X2RsIC0gMSkgLwogCQkJCSAgICBjYXJkLT5wY2llLmJsa3N6X2Z3X2RsOwogCkBAIC0yMDQzLDYgKzIwODgsMTAgQEAKIAkJCXJldCA9IC0xOwogCQllbHNlCiAJCQlyZXQgPSAwOworCisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIElORk8sICJUcnkgJWQgaWYgRlcgaXMgcmVhZHkgPCVkLCUjeD4iLAorCQkJICAgIHRyaWVzLCByZXQsIGZpcm13YXJlX3N0YXQpOworCiAJCWlmIChyZXQpCiAJCQljb250aW51ZTsKIAkJaWYgKGZpcm13YXJlX3N0YXQgPT0gRklSTVdBUkVfUkVBRFlfUENJRSkgewpAQCAtMjA3NCw4ICsyMTIzLDcgQEAKIAkJYWRhcHRlci0+d2lubmVyID0gMTsKIAl9IGVsc2UgewogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKLQkJCSAgICAiUENJLUUgaXMgbm90IHRoZSB3aW5uZXIgPCUjeCwlZD4sIGV4aXQgZG5sZFxuIiwKLQkJCSAgICByZXQsIGFkYXB0ZXItPndpbm5lcik7CisJCQkgICAgIlBDSS1FIGlzIG5vdCB0aGUgd2lubmVyIDwlI3g+Iiwgd2lubmVyKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjg2Myw3ICsyOTExLDcgQEAKIHN0YXRpYyB2b2lkIG13aWZpZXhfcGNpZV9nZXRfZndfbmFtZShzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKQogewogCWludCByZXZpc2lvbl9pZCA9IDA7Ci0JaW50IHZlcnNpb247CisJaW50IHZlcnNpb24sIG1hZ2ljOwogCXN0cnVjdCBwY2llX3NlcnZpY2VfY2FyZCAqY2FyZCA9IGFkYXB0ZXItPmNhcmQ7CiAKIAlzd2l0Y2ggKGNhcmQtPmRldi0+ZGV2aWNlKSB7CkBAIC0yODg4LDMwICsyOTM2LDE5IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBQQ0lFX0RFVklDRV9JRF9NQVJWRUxMXzg4Vzg5OTc6Ci0JCW13aWZpZXhfcmVhZF9yZWcoYWRhcHRlciwgMHgwYzQ4LCAmcmV2aXNpb25faWQpOworCQltd2lmaWV4X3JlYWRfcmVnKGFkYXB0ZXIsIDB4OCwgJnJldmlzaW9uX2lkKTsKIAkJbXdpZmlleF9yZWFkX3JlZyhhZGFwdGVyLCAweDBjZDAsICZ2ZXJzaW9uKTsKKwkJbXdpZmlleF9yZWFkX3JlZyhhZGFwdGVyLCAweDBjZDQsICZtYWdpYyk7CisJCXJldmlzaW9uX2lkICY9IDB4ZmY7CiAJCXZlcnNpb24gJj0gMHg3OwotCQlzd2l0Y2ggKHJldmlzaW9uX2lkKSB7Ci0JCWNhc2UgUENJRTg5OTdfVjI6Ci0JCQlpZiAodmVyc2lvbiA9PSBDSElQX1ZFUl9QQ0lFVUFSVCkKLQkJCQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwKLQkJCQkgICAgICAgUENJRVVBUlQ4OTk3X0ZXX05BTUVfVjIpOwotCQkJZWxzZQotCQkJCXN0cmNweShhZGFwdGVyLT5md19uYW1lLAotCQkJCSAgICAgICBQQ0lFVVNCODk5N19GV19OQU1FX1YyKTsKLQkJCWJyZWFrOwotCQljYXNlIFBDSUU4OTk3X1o6Ci0JCQlpZiAodmVyc2lvbiA9PSBDSElQX1ZFUl9QQ0lFVUFSVCkKLQkJCQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwKLQkJCQkgICAgICAgUENJRVVBUlQ4OTk3X0ZXX05BTUVfWik7Ci0JCQllbHNlCi0JCQkJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsCi0JCQkJICAgICAgIFBDSUVVU0I4OTk3X0ZXX05BTUVfWik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXN0cmNweShhZGFwdGVyLT5md19uYW1lLCBQQ0lFODk5N19ERUZBVUxUX0ZXX05BTUUpOwotCQkJYnJlYWs7Ci0JCX0KKwkJbWFnaWMgJj0gMHhmZjsKKwkJaWYgKHJldmlzaW9uX2lkID09IFBDSUU4OTk3X0ExICYmCisJCSAgICBtYWdpYyA9PSBDSElQX01BR0lDX1ZBTFVFICYmCisJCSAgICB2ZXJzaW9uID09IENISVBfVkVSX1BDSUVVQVJUKQorCQkJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIFBDSUVVQVJUODk5N19GV19OQU1FX1Y0KTsKKwkJZWxzZQorCQkJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIFBDSUVVU0I4OTk3X0ZXX05BTUVfVjQpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0yOTUyLDcgKzI5ODksNiBAQAogc3RhdGljIHZvaWQgbXdpZmlleF91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBwY2llX3NlcnZpY2VfY2FyZCAqY2FyZCA9IGFkYXB0ZXItPmNhcmQ7Ci0JY29uc3Qgc3RydWN0IG13aWZpZXhfcGNpZV9jYXJkX3JlZyAqcmVnOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCWludCBpOwogCkBAIC0yOTc2LDggKzMwMTIsOTAgQEAKIAkJCWlmIChjYXJkLT5tc2lfZW5hYmxlKQogCQkJCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKIAkgICAgICAgfQorCX0KK30KIAotCQlyZWcgPSBjYXJkLT5wY2llLnJlZzsKKy8qIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIFBDSS1FIGhvc3QgbWVtb3J5IHNwYWNlLCBXQ0IgcmluZ3MsIGV0Yy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9ucyBzdGVwcyBhcmUgZm9sbG93ZWQgLQorICogICAgICAtIEFsbG9jYXRlIFRYQkQgcmluZyBidWZmZXJzCisgKiAgICAgIC0gQWxsb2NhdGUgUlhCRCByaW5nIGJ1ZmZlcnMKKyAqICAgICAgLSBBbGxvY2F0ZSBldmVudCBCRCByaW5nIGJ1ZmZlcnMKKyAqICAgICAgLSBBbGxvY2F0ZSBjb21tYW5kIHJlc3BvbnNlIHJpbmcgYnVmZmVyCisgKiAgICAgIC0gQWxsb2NhdGUgc2xlZXAgY29va2llIGJ1ZmZlcgorICogUGFydCBvZiBtd2lmaWV4X3BjaWVfaW5pdCgpLCBub3QgcmVzZXQgdGhlIFBDSUUgcmVnaXN0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIG13aWZpZXhfcGNpZV91cF9kZXYoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcGNpZV9zZXJ2aWNlX2NhcmQgKmNhcmQgPSBhZGFwdGVyLT5jYXJkOworCWludCByZXQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBjYXJkLT5kZXY7CisJY29uc3Qgc3RydWN0IG13aWZpZXhfcGNpZV9jYXJkX3JlZyAqcmVnID0gY2FyZC0+cGNpZS5yZWc7CisKKwljYXJkLT5jbWRyc3BfYnVmID0gTlVMTDsKKwlyZXQgPSBtd2lmaWV4X3BjaWVfY3JlYXRlX3R4YmRfcmluZyhhZGFwdGVyKTsKKwlpZiAocmV0KSB7CisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB0eGJkIHJpbmdcbiIpOworCQlnb3RvIGVycl9jcmVfdHhiZDsKKwl9CisKKwlyZXQgPSBtd2lmaWV4X3BjaWVfY3JlYXRlX3J4YmRfcmluZyhhZGFwdGVyKTsKKwlpZiAocmV0KSB7CisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSByeGJkIHJpbmdcbiIpOworCQlnb3RvIGVycl9jcmVfcnhiZDsKKwl9CisKKwlyZXQgPSBtd2lmaWV4X3BjaWVfY3JlYXRlX2V2dGJkX3JpbmcoYWRhcHRlcik7CisJaWYgKHJldCkgeworCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgZXZ0YmQgcmluZ1xuIik7CisJCWdvdG8gZXJyX2NyZV9ldnRiZDsKKwl9CisKKwlyZXQgPSBtd2lmaWV4X3BjaWVfYWxsb2NfY21kcnNwX2J1ZihhZGFwdGVyKTsKKwlpZiAocmV0KSB7CisJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNtZGJ1ZiBidWZmZXJcbiIpOworCQlnb3RvIGVycl9hbGxvY19jbWRidWY7CisJfQorCisJaWYgKHJlZy0+c2xlZXBfY29va2llKSB7CisJCXJldCA9IG13aWZpZXhfcGNpZV9hbGxvY19zbGVlcF9jb29raWVfYnVmKGFkYXB0ZXIpOworCQlpZiAocmV0KSB7CisJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzbGVlcF9jb29raWUgYnVmZmVyXG4iKTsKKwkJCWdvdG8gZXJyX2FsbG9jX2Nvb2tpZTsKKwkJfQorCX0gZWxzZSB7CisJCWNhcmQtPnNsZWVwX2Nvb2tpZV92YmFzZSA9IE5VTEw7CisJfQorCXJldHVybjsKKworZXJyX2FsbG9jX2Nvb2tpZToKKwltd2lmaWV4X3BjaWVfZGVsZXRlX2NtZHJzcF9idWYoYWRhcHRlcik7CitlcnJfYWxsb2NfY21kYnVmOgorCW13aWZpZXhfcGNpZV9kZWxldGVfZXZ0YmRfcmluZyhhZGFwdGVyKTsKK2Vycl9jcmVfZXZ0YmQ6CisJbXdpZmlleF9wY2llX2RlbGV0ZV9yeGJkX3JpbmcoYWRhcHRlcik7CitlcnJfY3JlX3J4YmQ6CisJbXdpZmlleF9wY2llX2RlbGV0ZV90eGJkX3JpbmcoYWRhcHRlcik7CitlcnJfY3JlX3R4YmQ6CisJcGNpX2lvdW5tYXAocGRldiwgY2FyZC0+cGNpX21tYXAxKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBjbGVhbnMgdXAgdGhlIFBDSS1FIGhvc3QgbWVtb3J5IHNwYWNlLgorICogU29tZSBjb2RlIGlzIGV4dHJhY3RlZCBmcm9tIG13aWZpZXhfdW5yZWdpc3Rlcl9kZXYoKQorICoKKyAqLworc3RhdGljIHZvaWQgbXdpZmlleF9wY2llX2Rvd25fZGV2KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHBjaWVfc2VydmljZV9jYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKKwljb25zdCBzdHJ1Y3QgbXdpZmlleF9wY2llX2NhcmRfcmVnICpyZWcgPSBjYXJkLT5wY2llLnJlZzsKKworCWlmIChtd2lmaWV4X3dyaXRlX3JlZyhhZGFwdGVyLCByZWctPmRydl9yZHksIDB4MDAwMDAwMDApKQorCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgIkZhaWxlZCB0byB3cml0ZSBkcml2ZXIgbm90LXJlYWR5IHNpZ25hdHVyZVxuIik7CisKKwlhZGFwdGVyLT5zZXFfbnVtID0gMDsKKwlhZGFwdGVyLT50eF9idWZfc2l6ZSA9IE1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV80SzsKKworCWlmIChjYXJkKSB7CiAJCWlmIChyZWctPnNsZWVwX2Nvb2tpZSkKIAkJCW13aWZpZXhfcGNpZV9kZWxldGVfc2xlZXBfY29va2llX2J1ZihhZGFwdGVyKTsKIApAQCAtMjk4Nyw2ICszMTA1LDggQEAKIAkJbXdpZmlleF9wY2llX2RlbGV0ZV90eGJkX3JpbmcoYWRhcHRlcik7CiAJCWNhcmQtPmNtZHJzcF9idWYgPSBOVUxMOwogCX0KKworCXJldHVybjsKIH0KIAogc3RhdGljIHN0cnVjdCBtd2lmaWV4X2lmX29wcyBwY2llX29wcyA9IHsKQEAgLTMwMTMsNiArMzEzMyw4IEBACiAJLmNsZWFuX3BjaWVfcmluZyA9CQltd2lmaWV4X2NsZWFuX3BjaWVfcmluZ19idWYsCiAJLnJlZ19kdW1wID0JCQltd2lmaWV4X3BjaWVfcmVnX2R1bXAsCiAJLmRldmljZV9kdW1wID0JCQltd2lmaWV4X3BjaWVfZGV2aWNlX2R1bXAsCisJLmRvd25fZGV2ID0JCQltd2lmaWV4X3BjaWVfZG93bl9kZXYsCisJLnVwX2RldiA9CQkJbXdpZmlleF9wY2llX3VwX2RldiwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvcGNpZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3BjaWUuaAppbmRleCBmMDUwNjFjLi40NmY5OWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvcGNpZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9wY2llLmgKQEAgLTMyLDExICszMiw5IEBACiAjZGVmaW5lIFBDSUU4ODk3X0RFRkFVTFRfRldfTkFNRSAibXJ2bC9wY2llODg5N191YXBzdGEuYmluIgogI2RlZmluZSBQQ0lFODg5N19BMF9GV19OQU1FICJtcnZsL3BjaWU4ODk3X3VhcHN0YV9hMC5iaW4iCiAjZGVmaW5lIFBDSUU4ODk3X0IwX0ZXX05BTUUgIm1ydmwvcGNpZTg4OTdfdWFwc3RhLmJpbiIKLSNkZWZpbmUgUENJRTg5OTdfREVGQVVMVF9GV19OQU1FICJtcnZsL3BjaWV1c2I4OTk3X2NvbWJvX3YyLmJpbiIKLSNkZWZpbmUgUENJRVVBUlQ4OTk3X0ZXX05BTUVfWiAibXJ2bC9wY2lldWFydDg5OTdfY29tYm8uYmluIgotI2RlZmluZSBQQ0lFVUFSVDg5OTdfRldfTkFNRV9WMiAibXJ2bC9wY2lldWFydDg5OTdfY29tYm9fdjIuYmluIgotI2RlZmluZSBQQ0lFVVNCODk5N19GV19OQU1FX1ogIm1ydmwvcGNpZXVzYjg5OTdfY29tYm8uYmluIgotI2RlZmluZSBQQ0lFVVNCODk5N19GV19OQU1FX1YyICJtcnZsL3BjaWV1c2I4OTk3X2NvbWJvX3YyLmJpbiIKKyNkZWZpbmUgUENJRVVBUlQ4OTk3X0ZXX05BTUVfVjQgIm1ydmwvcGNpZXVhcnQ4OTk3X2NvbWJvX3Y0LmJpbiIKKyNkZWZpbmUgUENJRVVTQjg5OTdfRldfTkFNRV9WNCAibXJ2bC9wY2lldXNiODk5N19jb21ib192NC5iaW4iCisjZGVmaW5lIFBDSUU4OTk3X0RFRkFVTFRfV0lGSUZXX05BTUUgIm1ydmwvcGNpZTg5OTdfd2xhbl92NC5iaW4iCiAKICNkZWZpbmUgUENJRV9WRU5ET1JfSURfTUFSVkVMTCAgICAgICAgICAgICAgKDB4MTFhYikKICNkZWZpbmUgUENJRV9WRU5ET1JfSURfVjJfTUFSVkVMTCAgICAgICAgICAgKDB4MWI0YikKQEAgLTQ2LDkgKzQ0LDEwIEBACiAKICNkZWZpbmUgUENJRTg4OTdfQTAJMHgxMTAwCiAjZGVmaW5lIFBDSUU4ODk3X0IwCTB4MTIwMAotI2RlZmluZSBQQ0lFODk5N19aCTB4MAotI2RlZmluZSBQQ0lFODk5N19WMgkweDQ3MQorI2RlZmluZSBQQ0lFODk5N19BMAkweDEwCisjZGVmaW5lIFBDSUU4OTk3X0ExCTB4MTEKICNkZWZpbmUgQ0hJUF9WRVJfUENJRVVBUlQJMHgzCisjZGVmaW5lIENISVBfTUFHSUNfVkFMVUUJMHgyNAogCiAvKiBDb25zdGFudHMgZm9yIEJ1ZmZlciBEZXNjcmlwdG9yIChCRCkgcmluZ3MgKi8KICNkZWZpbmUgTVdJRklFWF9NQVhfVFhSWF9CRAkJCTB4MjAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zY2FuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc2Nhbi5jCmluZGV4IDIxZWM4NDcuLjk3Yzk3NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NjYW4uYwpAQCAtODIwLDYgKzgyMCw3IEBACiAJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CiAJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfbnVtX3Byb2JlcyAqbnVtX3Byb2Jlc190bHY7CiAJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfc2Nhbl9jaGFuX2dhcCAqY2hhbl9nYXBfdGx2OworCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3JhbmRvbV9tYWMgKnJhbmRvbV9tYWNfdGx2OwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX3dpbGRjYXJkX3NzaWRfcGFyYW1zICp3aWxkY2FyZF9zc2lkX3RsdjsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19ic3NpZF9saXN0ICpic3NpZF90bHY7CiAJdTggKnRsdl9wb3M7CkBAIC04MzUsNiArODM2LDcgQEAKIAl1OCBzc2lkX2ZpbHRlcjsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGNhcCAqaHRfY2FwOwogCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2Jzc19tb2RlICpic3NfbW9kZTsKKwljb25zdCB1OCB6ZXJvX21hY1s2XSA9IHswLCAwLCAwLCAwLCAwLCAwfTsKIAogCS8qIFRoZSB0bHZfYnVmX2xlbiBpcyBjYWxjdWxhdGVkIGZvciBlYWNoIHNjYW4gY29tbWFuZC4gIFRoZSBUTFZzIGFkZGVkCiAJICAgaW4gdGhpcyByb3V0aW5lIHdpbGwgYmUgcHJlc2VydmVkIHNpbmNlIHRoZSByb3V0aW5lIHRoYXQgc2VuZHMgdGhlCkBAIC05NjcsNiArOTY5LDE4IEBACiAJCQl0bHZfcG9zICs9CiAJCQkJICBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfc2Nhbl9jaGFuX2dhcCk7CiAJCX0KKworCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwodXNlcl9zY2FuX2luLT5yYW5kb21fbWFjLCB6ZXJvX21hYykpIHsKKwkJCXJhbmRvbV9tYWNfdGx2ID0gKHZvaWQgKil0bHZfcG9zOworCQkJcmFuZG9tX21hY190bHYtPmhlYWRlci50eXBlID0KKwkJCQkJIGNwdV90b19sZTE2KFRMVl9UWVBFX1JBTkRPTV9NQUMpOworCQkJcmFuZG9tX21hY190bHYtPmhlYWRlci5sZW4gPQorCQkJCSAgICBjcHVfdG9fbGUxNihzaXplb2YocmFuZG9tX21hY190bHYtPm1hYykpOworCQkJZXRoZXJfYWRkcl9jb3B5KHJhbmRvbV9tYWNfdGx2LT5tYWMsCisJCQkJCXVzZXJfc2Nhbl9pbi0+cmFuZG9tX21hYyk7CisJCQl0bHZfcG9zICs9CisJCQkJICBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfcmFuZG9tX21hYyk7CisJCX0KIAl9IGVsc2UgewogCQlzY2FuX2NmZ19vdXQtPmJzc19tb2RlID0gKHU4KSBhZGFwdGVyLT5zY2FuX21vZGU7CiAJCW51bV9wcm9iZXMgPSBhZGFwdGVyLT5zY2FuX3Byb2JlczsKQEAgLTE5MjIsNiArMTkzNiw3IEBACiAJfQogCiAJYWRhcHRlci0+YWN0aXZlX3NjYW5fdHJpZ2dlcmVkID0gdHJ1ZTsKKwlldGhlcl9hZGRyX2NvcHkodXNlcl9zY2FuX2NmZy0+cmFuZG9tX21hYywgcHJpdi0+cmFuZG9tX21hYyk7CiAJdXNlcl9zY2FuX2NmZy0+bnVtX3NzaWRzID0gcHJpdi0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzOwogCXVzZXJfc2Nhbl9jZmctPnNzaWRfbGlzdCA9IHByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHM7CiAKQEAgLTIxNzksMTggKzIxOTQsMTQgQEAKIAogCQlpZiAoY2hhbl9iYW5kX3RsdiAmJiBhZGFwdGVyLT5uZF9pbmZvKSB7CiAJCQlhZGFwdGVyLT5uZF9pbmZvLT5tYXRjaGVzW2lkeF0gPQotCQkJCWt6YWxsb2Moc2l6ZW9mKCpwbWF0Y2gpICsKLQkJCQlzaXplb2YodTMyKSwgR0ZQX0FUT01JQyk7CisJCQkJa3phbGxvYyhzaXplb2YoKnBtYXRjaCkgKyBzaXplb2YodTMyKSwKKwkJCQkJR0ZQX0FUT01JQyk7CiAKIAkJCXBtYXRjaCA9IGFkYXB0ZXItPm5kX2luZm8tPm1hdGNoZXNbaWR4XTsKIAogCQkJaWYgKHBtYXRjaCkgewotCQkJCW1lbXNldChwbWF0Y2gsIDAsIHNpemVvZigqcG1hdGNoKSk7Ci0JCQkJaWYgKGNoYW5fYmFuZF90bHYpIHsKLQkJCQkJcG1hdGNoLT5uX2NoYW5uZWxzID0gMTsKLQkJCQkJcG1hdGNoLT5jaGFubmVsc1swXSA9Ci0JCQkJCQljaGFuX2JhbmQtPmNoYW5fbnVtYmVyOwotCQkJCX0KKwkJCQlwbWF0Y2gtPm5fY2hhbm5lbHMgPSAxOworCQkJCXBtYXRjaC0+Y2hhbm5lbHNbMF0gPSBjaGFuX2JhbmQtPmNoYW5fbnVtYmVyOwogCQkJfQogCQl9CiAKQEAgLTI3NjEsNiArMjc3Miw3IEBACiAJaWYgKCFzY2FuX2NmZykKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlldGhlcl9hZGRyX2NvcHkoc2Nhbl9jZmctPnJhbmRvbV9tYWMsIHByaXYtPnJhbmRvbV9tYWMpOwogCXNjYW5fY2ZnLT5zc2lkX2xpc3QgPSByZXFfc3NpZDsKIAlzY2FuX2NmZy0+bnVtX3NzaWRzID0gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zZGlvLmMKaW5kZXggZDNlMTU2MS4uODcxODk1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc2Rpby5jCkBAIC0xMjIsOSArMTIyLDExIEBACiAJCQkJCSAgICAgICBJUlFGX1RSSUdHRVJfTE9XLAogCQkJCQkgICAgICAgIndpZmlfd2FrZSIsIGNmZyk7CiAJCQlpZiAocmV0KSB7Ci0JCQkJZGV2X2VycihkZXYsCisJCQkJZGV2X2RiZyhkZXYsCiAJCQkJCSJGYWlsZWQgdG8gcmVxdWVzdCBpcnFfd2lmaSAlZCAoJWQpXG4iLAogCQkJCQljZmctPmlycV93aWZpLCByZXQpOworCQkJCWNhcmQtPnBsdF93YWtlX2NmZyA9IE5VTEw7CisJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQlkaXNhYmxlX2lycShjZmctPmlycV93aWZpKTsKIAkJfQpAQCAtMjg5LDcgKzI5MSw3IEBACiAKIAltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLCAiaW5mbzogU0RJTyBmdW5jIG51bT0lZFxuIiwgZnVuYy0+bnVtKTsKIAotCWlmICh1c2VyX3JtbW9kKSB7CisJaWYgKHVzZXJfcm1tb2QgJiYgIWFkYXB0ZXItPm1mZ19tb2RlKSB7CiAJCWlmIChhZGFwdGVyLT5pc19zdXNwZW5kZWQpCiAJCQltd2lmaWV4X3NkaW9fcmVzdW1lKGFkYXB0ZXItPmRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2NtZC5jCmluZGV4IDc4OTcwMzcuLjJhMTYyYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9jbWQuYwpAQCAtNTk4LDYgKzU5OCwxMSBAQAogCQltZW1jcHkoa20tPmtleV9wYXJhbV9zZXQua2V5X3BhcmFtcy5jbWFjX2Flcy5rZXksCiAJCSAgICAgICBlbmNfa2V5LT5rZXlfbWF0ZXJpYWwsIGVuY19rZXktPmtleV9sZW4pOwogCQlsZW4gKz0gc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2NtYWNfYWVzX3BhcmFtKTsKKwl9IGVsc2UgaWYgKGVuY19rZXktPmlzX2lndGtfZGVmX2tleSkgeworCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLAorCQkJICAgICIlczogU2V0IENNQUMgZGVmYXVsdCBLZXkgaW5kZXhcbiIsIF9fZnVuY19fKTsKKwkJa20tPmtleV9wYXJhbV9zZXQua2V5X3R5cGUgPSBLRVlfVFlQRV9JRF9BRVNfQ01BQ19ERUY7CisJCWttLT5rZXlfcGFyYW1fc2V0LmtleV9pZHggPSBlbmNfa2V5LT5rZXlfaW5kZXggJiBLRVlfSU5ERVhfTUFTSzsKIAl9IGVsc2UgewogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBJTkZPLAogCQkJICAgICIlczogU2V0IEFFUyBLZXlcbiIsIF9fZnVuY19fKTsKQEAgLTcwNiwxNSArNzExLDEwIEBACiAJCQkJICAgIChwcml2LT53ZXBfa2V5X2N1cnJfaW5kZXggJiBLRVlfSU5ERVhfTUFTSykpCiAJCQkJCWtleV9pbmZvIHw9IEtFWV9ERUZBVUxUOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAobWFjKSB7Ci0JCQkJCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtYWMpKQotCQkJCQkJa2V5X2luZm8gfD0gS0VZX01DQVNUOwotCQkJCQllbHNlCi0JCQkJCQlrZXlfaW5mbyB8PSBLRVlfVU5JQ0FTVCB8Ci0JCQkJCQkJICAgIEtFWV9ERUZBVUxUOwotCQkJCX0gZWxzZSB7CisJCQkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1hYykpCiAJCQkJCWtleV9pbmZvIHw9IEtFWV9NQ0FTVDsKLQkJCQl9CisJCQkJZWxzZQorCQkJCQlrZXlfaW5mbyB8PSBLRVlfVU5JQ0FTVCB8IEtFWV9ERUZBVUxUOwogCQkJfQogCQl9CiAJCWttLT5rZXlfcGFyYW1fc2V0LmtleV9pbmZvID0gY3B1X3RvX2xlMTYoa2V5X2luZm8pOwpAQCAtMTI0NCwyMCArMTI0NCwyMyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIFNlbmQgdGhlIHJpbmcgYmFzZSBhZGRyZXNzZXMgYW5kIGNvdW50IHRvIGZpcm13YXJlICovCi0JaG9zdF9zcGVjLT50eGJkX2FkZHJfbG8gPSAodTMyKShjYXJkLT50eGJkX3JpbmdfcGJhc2UpOwotCWhvc3Rfc3BlYy0+dHhiZF9hZGRyX2hpID0gKHUzMikoKCh1NjQpY2FyZC0+dHhiZF9yaW5nX3BiYXNlKT4+MzIpOwotCWhvc3Rfc3BlYy0+dHhiZF9jb3VudCA9IE1XSUZJRVhfTUFYX1RYUlhfQkQ7Ci0JaG9zdF9zcGVjLT5yeGJkX2FkZHJfbG8gPSAodTMyKShjYXJkLT5yeGJkX3JpbmdfcGJhc2UpOwotCWhvc3Rfc3BlYy0+cnhiZF9hZGRyX2hpID0gKHUzMikoKCh1NjQpY2FyZC0+cnhiZF9yaW5nX3BiYXNlKT4+MzIpOwotCWhvc3Rfc3BlYy0+cnhiZF9jb3VudCA9IE1XSUZJRVhfTUFYX1RYUlhfQkQ7Ci0JaG9zdF9zcGVjLT5ldnRiZF9hZGRyX2xvID0gKHUzMikoY2FyZC0+ZXZ0YmRfcmluZ19wYmFzZSk7Ci0JaG9zdF9zcGVjLT5ldnRiZF9hZGRyX2hpID0gKHUzMikoKCh1NjQpY2FyZC0+ZXZ0YmRfcmluZ19wYmFzZSk+PjMyKTsKLQlob3N0X3NwZWMtPmV2dGJkX2NvdW50ID0gTVdJRklFWF9NQVhfRVZUX0JEOworCWhvc3Rfc3BlYy0+dHhiZF9hZGRyX2xvID0gY3B1X3RvX2xlMzIoKHUzMikoY2FyZC0+dHhiZF9yaW5nX3BiYXNlKSk7CisJaG9zdF9zcGVjLT50eGJkX2FkZHJfaGkgPQorCQkJY3B1X3RvX2xlMzIoKHUzMikoKCh1NjQpY2FyZC0+dHhiZF9yaW5nX3BiYXNlKSA+PiAzMikpOworCWhvc3Rfc3BlYy0+dHhiZF9jb3VudCA9IGNwdV90b19sZTMyKE1XSUZJRVhfTUFYX1RYUlhfQkQpOworCWhvc3Rfc3BlYy0+cnhiZF9hZGRyX2xvID0gY3B1X3RvX2xlMzIoKHUzMikoY2FyZC0+cnhiZF9yaW5nX3BiYXNlKSk7CisJaG9zdF9zcGVjLT5yeGJkX2FkZHJfaGkgPQorCQkJY3B1X3RvX2xlMzIoKHUzMikoKCh1NjQpY2FyZC0+cnhiZF9yaW5nX3BiYXNlKSA+PiAzMikpOworCWhvc3Rfc3BlYy0+cnhiZF9jb3VudCA9IGNwdV90b19sZTMyKE1XSUZJRVhfTUFYX1RYUlhfQkQpOworCWhvc3Rfc3BlYy0+ZXZ0YmRfYWRkcl9sbyA9IGNwdV90b19sZTMyKCh1MzIpKGNhcmQtPmV2dGJkX3JpbmdfcGJhc2UpKTsKKwlob3N0X3NwZWMtPmV2dGJkX2FkZHJfaGkgPQorCQkJY3B1X3RvX2xlMzIoKHUzMikoKCh1NjQpY2FyZC0+ZXZ0YmRfcmluZ19wYmFzZSkgPj4gMzIpKTsKKwlob3N0X3NwZWMtPmV2dGJkX2NvdW50ID0gY3B1X3RvX2xlMzIoTVdJRklFWF9NQVhfRVZUX0JEKTsKIAlpZiAoY2FyZC0+c2xlZXBfY29va2llX3ZiYXNlKSB7CiAJCWhvc3Rfc3BlYy0+c2xlZXBfY29va2llX2FkZHJfbG8gPQotCQkJCQkJKHUzMikoY2FyZC0+c2xlZXBfY29va2llX3BiYXNlKTsKLQkJaG9zdF9zcGVjLT5zbGVlcF9jb29raWVfYWRkcl9oaSA9Ci0JCQkJICh1MzIpKCgodTY0KShjYXJkLT5zbGVlcF9jb29raWVfcGJhc2UpKSA+PiAzMik7CisJCQkJY3B1X3RvX2xlMzIoKHUzMikoY2FyZC0+c2xlZXBfY29va2llX3BiYXNlKSk7CisJCWhvc3Rfc3BlYy0+c2xlZXBfY29va2llX2FkZHJfaGkgPSBjcHVfdG9fbGUzMigodTMyKSgoKHU2NCkKKwkJCQkJKGNhcmQtPnNsZWVwX2Nvb2tpZV9wYmFzZSkpID4+IDMyKSk7CiAJCW13aWZpZXhfZGJnKHByaXYtPmFkYXB0ZXIsIElORk8sCiAJCQkgICAgInNsZWVwX2Nvb2tfbG8gcGh5IGFkZHI6IDB4JXhcbiIsCiAJCQkgICAgaG9zdF9zcGVjLT5zbGVlcF9jb29raWVfYWRkcl9sbyk7CkBAIC0xNDgyLDcgKzE0ODUsNyBAQAogCQkJY29udGludWU7CiAKIAkJLyogcHJvcGVydHkgaGVhZGVyIGlzIDYgYnl0ZXMsIGRhdGEgbXVzdCBmaXQgaW4gY21kIGJ1ZmZlciAqLwotCQlpZiAocHJvcCAmJiBwcm9wLT52YWx1ZSAmJiBwcm9wLT5sZW5ndGggPiA2ICYmCisJCWlmIChwcm9wLT52YWx1ZSAmJiBwcm9wLT5sZW5ndGggPiA2ICYmCiAJCSAgICBwcm9wLT5sZW5ndGggPD0gTVdJRklFWF9TSVpFX09GX0NNRF9CVUZGRVIgLSBTX0RTX0dFTikgewogCQkJcmV0ID0gbXdpZmlleF9zZW5kX2NtZChwcml2LCBIb3N0Q21kX0NNRF9DRkdfREFUQSwKIAkJCQkJICAgICAgIEhvc3RDbWRfQUNUX0dFTl9TRVQsIDAsCkBAIC0xNTk2LDYgKzE1OTksMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtd2lmaWV4X2NtZF9jaGFuX3JlZ2lvbl9jZmcoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkgICAgICAgdTE2IGNtZF9hY3Rpb24pCit7CisJc3RydWN0IGhvc3RfY21kX2RzX2NoYW5fcmVnaW9uX2NmZyAqcmVnID0gJmNtZC0+cGFyYW1zLnJlZ19jZmc7CisKKwljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihIb3N0Q21kX0NNRF9DSEFOX1JFR0lPTl9DRkcpOworCWNtZC0+c2l6ZSA9IGNwdV90b19sZTE2KHNpemVvZigqcmVnKSArIFNfRFNfR0VOKTsKKworCWlmIChjbWRfYWN0aW9uID09IEhvc3RDbWRfQUNUX0dFTl9HRVQpCisJCXJlZy0+YWN0aW9uID0gY3B1X3RvX2xlMTYoY21kX2FjdGlvbik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludAogbXdpZmlleF9jbWRfY29hbGVzY2VfY2ZnKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCiAJCQkgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKQEAgLTIxMzYsNiArMjE1NCw5IEBACiAJCXJldCA9IG13aWZpZXhfY21kX2d0a19yZWtleV9vZmZsb2FkKHByaXYsIGNtZF9wdHIsIGNtZF9hY3Rpb24sCiAJCQkJCQkgICAgZGF0YV9idWYpOwogCQlicmVhazsKKwljYXNlIEhvc3RDbWRfQ01EX0NIQU5fUkVHSU9OX0NGRzoKKwkJcmV0ID0gbXdpZmlleF9jbWRfY2hhbl9yZWdpb25fY2ZnKHByaXYsIGNtZF9wdHIsIGNtZF9hY3Rpb24pOworCQlicmVhazsKIAlkZWZhdWx0OgogCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBFUlJPUiwKIAkJCSAgICAiUFJFUF9DTUQ6IHVua25vd24gY21kLSAlI3hcbiIsIGNtZF9ubyk7CkBAIC0yMjczLDYgKzIyOTQsOSBAQAogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gLTE7CiAJCX0KKworCQltd2lmaWV4X3NlbmRfY21kKHByaXYsIEhvc3RDbWRfQ01EX0NIQU5fUkVHSU9OX0NGRywKKwkJCQkgSG9zdENtZF9BQ1RfR0VOX0dFVCwgMCwgTlVMTCwgdHJ1ZSk7CiAJfQogCiAJLyogZ2V0IHR4IHJhdGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfY21kcmVzcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9jbWRyZXNwLmMKaW5kZXggY2NmNTQ5MzIuLjg1NDgwMjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2NtZHJlc3AuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2NtZHJlc3AuYwpAQCAtOTYyLDcgKzk2Miw3IEBACiAJaW50IGk7CiAJc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKnN0YV9ub2RlOwogCi0JZm9yIChpID0gMDsgaSA8IHN0YV9saXN0LT5zdGFfY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAobGUxNl90b19jcHUoc3RhX2xpc3QtPnN0YV9jb3VudCkpOyBpKyspIHsKIAkJc3RhX25vZGUgPSBtd2lmaWV4X2dldF9zdGFfZW50cnkocHJpdiwgc3RhX2luZm8tPm1hYyk7CiAJCWlmICh1bmxpa2VseSghc3RhX25vZGUpKQogCQkJY29udGludWU7CkBAIC0xMDIyLDYgKzEwMjIsMTM4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqCittd2lmaWV4X2NyZWF0ZV9jdXN0b21fcmVnZG9tYWluKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCisJCQkJdTggKmJ1ZiwgdTE2IGJ1Zl9sZW4pCit7CisJdTE2IG51bV9jaGFuID0gYnVmX2xlbiAvIDI7CisJc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJlZ2Q7CisJc3RydWN0IGllZWU4MDIxMV9yZWdfcnVsZSAqcnVsZTsKKwlib29sIG5ld19ydWxlOworCWludCByZWdkX3NpemUsIGlkeCwgZnJlcSwgcHJldl9mcmVxID0gMDsKKwl1MzIgYncsIHByZXZfYncgPSAwOworCXU4IGNoZmxhZ3MsIHByZXZfY2hmbGFncyA9IDAsIHZhbGlkX3J1bGVzID0gMDsKKworCWlmIChXQVJOX09OX09OQ0UobnVtX2NoYW4gPiBOTDgwMjExX01BWF9TVVBQX1JFR19SVUxFUykpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcmVnZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluKSArCisJCSAgICBudW1fY2hhbiAqIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JlZ19ydWxlKTsKKworCXJlZ2QgPSBremFsbG9jKHJlZ2Rfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWdkKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgbnVtX2NoYW47IGlkeCsrKSB7CisJCXU4IGNoYW47CisJCWVudW0gbmw4MDIxMV9iYW5kIGJhbmQ7CisKKwkJY2hhbiA9ICpidWYrKzsKKwkJaWYgKCFjaGFuKSB7CisJCQlrZnJlZShyZWdkKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWNoZmxhZ3MgPSAqYnVmKys7CisJCWJhbmQgPSAoY2hhbiA8PSAxNCkgPyBOTDgwMjExX0JBTkRfMkdIWiA6IE5MODAyMTFfQkFORF81R0haOworCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW4sIGJhbmQpOworCQluZXdfcnVsZSA9IGZhbHNlOworCisJCWlmIChjaGZsYWdzICYgTVdJRklFWF9DSEFOTkVMX0RJU0FCTEVEKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhbmQgPT0gTkw4MDIxMV9CQU5EXzVHSFopIHsKKwkJCWlmICghKGNoZmxhZ3MgJiBNV0lGSUVYX0NIQU5ORUxfTk9IVDgwKSkKKwkJCQlidyA9IE1IWl9UT19LSFooODApOworCQkJZWxzZSBpZiAoIShjaGZsYWdzICYgTVdJRklFWF9DSEFOTkVMX05PSFQ0MCkpCisJCQkJYncgPSBNSFpfVE9fS0haKDQwKTsKKwkJCWVsc2UKKwkJCQlidyA9IE1IWl9UT19LSFooMjApOworCQl9IGVsc2UgeworCQkJaWYgKCEoY2hmbGFncyAmIE1XSUZJRVhfQ0hBTk5FTF9OT0hUNDApKQorCQkJCWJ3ID0gTUhaX1RPX0tIWig0MCk7CisJCQllbHNlCisJCQkJYncgPSBNSFpfVE9fS0haKDIwKTsKKwkJfQorCisJCWlmIChpZHggPT0gMCB8fCBwcmV2X2NoZmxhZ3MgIT0gY2hmbGFncyB8fCBwcmV2X2J3ICE9IGJ3IHx8CisJCSAgICBmcmVxIC0gcHJldl9mcmVxID4gMjApIHsKKwkJCXZhbGlkX3J1bGVzKys7CisJCQluZXdfcnVsZSA9IHRydWU7CisJCX0KKworCQlydWxlID0gJnJlZ2QtPnJlZ19ydWxlc1t2YWxpZF9ydWxlcyAtIDFdOworCisJCXJ1bGUtPmZyZXFfcmFuZ2UuZW5kX2ZyZXFfa2h6ID0gTUhaX1RPX0tIWihmcmVxICsgMTApOworCisJCXByZXZfY2hmbGFncyA9IGNoZmxhZ3M7CisJCXByZXZfZnJlcSA9IGZyZXE7CisJCXByZXZfYncgPSBidzsKKworCQlpZiAoIW5ld19ydWxlKQorCQkJY29udGludWU7CisKKwkJcnVsZS0+ZnJlcV9yYW5nZS5zdGFydF9mcmVxX2toeiA9IE1IWl9UT19LSFooZnJlcSAtIDEwKTsKKwkJcnVsZS0+cG93ZXJfcnVsZS5tYXhfZWlycCA9IERCTV9UT19NQk0oMTkpOworCisJCWlmIChjaGZsYWdzICYgTVdJRklFWF9DSEFOTkVMX1BBU1NJVkUpCisJCQlydWxlLT5mbGFncyA9IE5MODAyMTFfUlJGX05PX0lSOworCisJCWlmIChjaGZsYWdzICYgTVdJRklFWF9DSEFOTkVMX0RGUykKKwkJCXJ1bGUtPmZsYWdzID0gTkw4MDIxMV9SUkZfREZTOworCisJCXJ1bGUtPmZyZXFfcmFuZ2UubWF4X2JhbmR3aWR0aF9raHogPSBidzsKKwl9CisKKwlyZWdkLT5uX3JlZ19ydWxlcyA9IHZhbGlkX3J1bGVzOworCXJlZ2QtPmFscGhhMlswXSA9ICc5JzsKKwlyZWdkLT5hbHBoYTJbMV0gPSAnOSc7CisKKwlyZXR1cm4gcmVnZDsKK30KKworc3RhdGljIGludCBtd2lmaWV4X3JldF9jaGFuX3JlZ2lvbl9jZmcoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKnJlc3ApCit7CisJc3RydWN0IGhvc3RfY21kX2RzX2NoYW5fcmVnaW9uX2NmZyAqcmVnID0gJnJlc3AtPnBhcmFtcy5yZWdfY2ZnOworCXUxNiBhY3Rpb24gPSBsZTE2X3RvX2NwdShyZWctPmFjdGlvbik7CisJdTE2IHRsdiwgdGx2X2J1Zl9sZW4sIHRsdl9idWZfbGVmdDsKKwlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19oZWFkZXIgKmhlYWQ7CisJc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJlZ2Q7CisJdTggKnRsdl9idWY7CisKKwlpZiAoYWN0aW9uICE9IEhvc3RDbWRfQUNUX0dFTl9HRVQpCisJCXJldHVybiAwOworCisJdGx2X2J1ZiA9ICh1OCAqKXJlZyArIHNpemVvZigqcmVnKTsKKwl0bHZfYnVmX2xlZnQgPSBsZTE2X3RvX2NwdShyZXNwLT5zaXplKSAtIFNfRFNfR0VOIC0gc2l6ZW9mKCpyZWcpOworCisJd2hpbGUgKHRsdl9idWZfbGVmdCA+PSBzaXplb2YoKmhlYWQpKSB7CisJCWhlYWQgPSAoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaGVhZGVyICopdGx2X2J1ZjsKKwkJdGx2ID0gbGUxNl90b19jcHUoaGVhZC0+dHlwZSk7CisJCXRsdl9idWZfbGVuID0gbGUxNl90b19jcHUoaGVhZC0+bGVuKTsKKworCQlpZiAodGx2X2J1Zl9sZWZ0IDwgKHNpemVvZigqaGVhZCkgKyB0bHZfYnVmX2xlbikpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKHRsdikgeworCQljYXNlIFRMVl9UWVBFX0NIQU5fQVRUUl9DRkc6CisJCQltd2lmaWV4X2RiZ19kdW1wKHByaXYtPmFkYXB0ZXIsIENNRF9ELCAiQ0hBTjoiLAorCQkJCQkgKHU4ICopaGVhZCArIHNpemVvZigqaGVhZCksCisJCQkJCSB0bHZfYnVmX2xlbik7CisJCQlyZWdkID0gbXdpZmlleF9jcmVhdGVfY3VzdG9tX3JlZ2RvbWFpbihwcml2LAorCQkJCSh1OCAqKWhlYWQgKyBzaXplb2YoKmhlYWQpLCB0bHZfYnVmX2xlbik7CisJCQlpZiAoIUlTX0VSUihyZWdkKSkKKwkJCQlwcml2LT5hZGFwdGVyLT5yZWdkID0gcmVnZDsKKwkJCWJyZWFrOworCQl9CisKKwkJdGx2X2J1ZiArPSAoc2l6ZW9mKCpoZWFkKSArIHRsdl9idWZfbGVuKTsKKwkJdGx2X2J1Zl9sZWZ0IC09IChzaXplb2YoKmhlYWQpICsgdGx2X2J1Zl9sZW4pOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBjb21tYW5kIHJlc3BvbnNlcy4KICAqCkBAIC0xMjM5LDYgKzEzNzEsOSBAQAogCQlicmVhazsKIAljYXNlIEhvc3RDbWRfQ01EX0dUS19SRUtFWV9PRkZMT0FEX0NGRzoKIAkJYnJlYWs7CisJY2FzZSBIb3N0Q21kX0NNRF9DSEFOX1JFR0lPTl9DRkc6CisJCXJldCA9IG13aWZpZXhfcmV0X2NoYW5fcmVnaW9uX2NmZyhwcml2LCByZXNwKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVJST1IsCiAJCQkgICAgIkNNRF9SRVNQOiB1bmtub3duIGNtZCByZXNwb25zZSAlI3hcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2V2ZW50LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2V2ZW50LmMKaW5kZXggYTQyMmYzMy4uOWRmMGM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9ldmVudC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfZXZlbnQuYwpAQCAtMjUsNiArMjUsOTkgQEAKICNpbmNsdWRlICJ3bW0uaCIKICNpbmNsdWRlICIxMW4uaCIKIAorI2RlZmluZSBNV0lGSUVYX0lCU1NfQ09OTkVDVF9FVlRfRklYX1NJWkUgICAgMTIKKworc3RhdGljIGludCBtd2lmaWV4X2NoZWNrX2lic3NfcGVlcl9jYXBhYmlsdGllcyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAorCQkJCQkgICAgICAgc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKnN0YV9wdHIsCisJCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqZXZlbnQpCit7CisJaW50IGV2dF9sZW4sIGVsZV9sZW47CisJdTggKmN1cnI7CisJc3RydWN0IGllZWVfdHlwZXNfaGVhZGVyICplbGVfaGRyOworCXN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX21nbXRfZnJhbWUgKnRsdl9tZ210X2ZyYW1lOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXA7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwICp2aHRfY2FwOworCisJc2tiX3B1bGwoZXZlbnQsIE1XSUZJRVhfSUJTU19DT05ORUNUX0VWVF9GSVhfU0laRSk7CisJZXZ0X2xlbiA9IGV2ZW50LT5sZW47CisJY3VyciA9IGV2ZW50LT5kYXRhOworCisJbXdpZmlleF9kYmdfZHVtcChwcml2LT5hZGFwdGVyLCBFVlRfRCwgImlic3MgcGVlciBjYXBhYmlsdGllczoiLAorCQkJIGV2ZW50LT5kYXRhLCBldmVudC0+bGVuKTsKKworCXNrYl9wdXNoKGV2ZW50LCBNV0lGSUVYX0lCU1NfQ09OTkVDVF9FVlRfRklYX1NJWkUpOworCisJdGx2X21nbXRfZnJhbWUgPSAodm9pZCAqKWN1cnI7CisJaWYgKGV2dF9sZW4gPj0gc2l6ZW9mKCp0bHZfbWdtdF9mcmFtZSkgJiYKKwkgICAgbGUxNl90b19jcHUodGx2X21nbXRfZnJhbWUtPmhlYWRlci50eXBlKSA9PQorCSAgICBUTFZfVFlQRV9VQVBfTUdNVF9GUkFNRSkgeworCQkvKiBMb2NhdGUgY3VyciBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBiZWFjb24gdGx2LAorCQkgKiB0aW1lc3RhbXAgOCBieXRlcywgYmVhY29uIGludGVydmVsIDIgYnl0ZXMsCisJCSAqIGNhcGFiaWxpdHkgaW5mbyAyIGJ5dGVzLCB0b3RhbGx5IDEyIGJ5dGUgYmVhY29uIGhlYWRlcgorCQkgKi8KKwkJZXZ0X2xlbiA9IGxlMTZfdG9fY3B1KHRsdl9tZ210X2ZyYW1lLT5oZWFkZXIubGVuKTsKKwkJY3VyciArPSAoc2l6ZW9mKCp0bHZfbWdtdF9mcmFtZSkgKyAxMik7CisJfSBlbHNlIHsKKwkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgTVNHLAorCQkJICAgICJtYW5hZ2VtZW50IGZyYW1lIHRsdiBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2hpbGUgKGV2dF9sZW4gPj0gc2l6ZW9mKCplbGVfaGRyKSkgeworCQllbGVfaGRyID0gKHN0cnVjdCBpZWVlX3R5cGVzX2hlYWRlciAqKWN1cnI7CisJCWVsZV9sZW4gPSBlbGVfaGRyLT5sZW47CisKKwkJaWYgKGV2dF9sZW4gPCBlbGVfbGVuICsgc2l6ZW9mKCplbGVfaGRyKSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoZWxlX2hkci0+ZWxlbWVudF9pZCkgeworCQljYXNlIFdMQU5fRUlEX0hUX0NBUEFCSUxJVFk6CisJCQlzdGFfcHRyLT5pc18xMW5fZW5hYmxlZCA9IHRydWU7CisJCQlodF9jYXAgPSAodm9pZCAqKShlbGVfaGRyICsgMik7CisJCQlzdGFfcHRyLT5tYXhfYW1zZHUgPSBsZTE2X3RvX2NwdShodF9jYXAtPmNhcF9pbmZvKSAmCisJCQkJSUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFUgPworCQkJCU1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV84SyA6CisJCQkJTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzRLOworCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgSU5GTywKKwkJCQkgICAgIjExbiBlbmFibGVkISwgbWF4X2Ftc2R1IDogJWRcbiIsCisJCQkJICAgIHN0YV9wdHItPm1heF9hbXNkdSk7CisJCQlicmVhazsKKworCQljYXNlIFdMQU5fRUlEX1ZIVF9DQVBBQklMSVRZOgorCQkJc3RhX3B0ci0+aXNfMTFhY19lbmFibGVkID0gdHJ1ZTsKKwkJCXZodF9jYXAgPSAodm9pZCAqKShlbGVfaGRyICsgMik7CisJCQkvKiBjaGVjayBWSFQgTUFYTVBEVSBjYXBhYmlsaXR5ICovCisJCQlzd2l0Y2ggKGxlMzJfdG9fY3B1KHZodF9jYXAtPnZodF9jYXBfaW5mbykgJiAweDMpIHsKKwkJCWNhc2UgSUVFRTgwMjExX1ZIVF9DQVBfTUFYX01QRFVfTEVOR1RIXzExNDU0OgorCQkJCXN0YV9wdHItPm1heF9hbXNkdSA9CisJCQkJCU1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV8xMks7CisJCQkJYnJlYWs7CisJCQljYXNlIElFRUU4MDIxMV9WSFRfQ0FQX01BWF9NUERVX0xFTkdUSF83OTkxOgorCQkJCXN0YV9wdHItPm1heF9hbXNkdSA9CisJCQkJCU1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV84SzsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUVFRTgwMjExX1ZIVF9DQVBfTUFYX01QRFVfTEVOR1RIXzM4OTU6CisJCQkJc3RhX3B0ci0+bWF4X2Ftc2R1ID0KKwkJCQkJTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzRLOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbXdpZmlleF9kYmcocHJpdi0+YWRhcHRlciwgSU5GTywKKwkJCQkgICAgIjExYWMgZW5hYmxlZCEsIG1heF9hbXNkdSA6ICVkXG4iLAorCQkJCSAgICBzdGFfcHRyLT5tYXhfYW1zZHUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWN1cnIgKz0gKGVsZV9sZW4gKyBzaXplb2YoKmVsZV9oZHIpKTsKKwkJZXZ0X2xlbiAtPSAoZWxlX2xlbiArIHNpemVvZigqZWxlX2hkcikpOworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIGNvbm5lY3Rpb24gc3RhdGUuCiAgKgpAQCAtNTE5LDYgKzYxMiw4IEBACiAgKiAgICAgIC0gRVZFTlRfTElOS19RVUFMSVRZCiAgKiAgICAgIC0gRVZFTlRfUFJFX0JFQUNPTl9MT1NUCiAgKiAgICAgIC0gRVZFTlRfSUJTU19DT0FMRVNDRUQKKyAqICAgICAgLSBFVkVOVF9JQlNTX1NUQV9DT05ORUNUCisgKiAgICAgIC0gRVZFTlRfSUJTU19TVEFfRElTQ09OTkVDVAogICogICAgICAtIEVWRU5UX1dFUF9JQ1ZfRVJSCiAgKiAgICAgIC0gRVZFTlRfQldfQ0hBTkdFCiAgKiAgICAgIC0gRVZFTlRfSE9TVFdBS0VfU1RBSUUKQEAgLTU0Nyw5ICs2NDIsMTEgQEAKIGludCBtd2lmaWV4X3Byb2Nlc3Nfc3RhX2V2ZW50KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYpCiB7CiAJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IDAsIGk7CiAJdTMyIGV2ZW50Y2F1c2UgPSBhZGFwdGVyLT5ldmVudF9jYXVzZTsKIAl1MTYgY3RybCwgcmVhc29uX2NvZGU7CisJdTggaWJzc19zdGFfYWRkcltFVEhfQUxFTl07CisJc3RydWN0IG13aWZpZXhfc3RhX25vZGUgKnN0YV9wdHI7CiAKIAlzd2l0Y2ggKGV2ZW50Y2F1c2UpIHsKIAljYXNlIEVWRU5UX0RVTU1ZX0hPU1RfV0FLRVVQX1NJR05BTDoKQEAgLTcwOCw3ICs4MDUsMTEgQEAKIAogCWNhc2UgRVZFTlRfRVhUX1NDQU5fUkVQT1JUOgogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFVkVOVCwgImV2ZW50OiBFWFRfU0NBTiBSZXBvcnRcbiIpOwotCQlpZiAoYWRhcHRlci0+ZXh0X3NjYW4gJiYgIXByaXYtPnNjYW5fYWJvcnRpbmcpCisJCS8qIFdlIGludGVuZCB0byBza2lwIHRoaXMgZXZlbnQgZHVyaW5nIHN1c3BlbmQsIGJ1dCBoYW5kbGUKKwkJICogaXQgaW4gaW50ZXJmYWNlIGRpc2FibGVkIGNhc2UKKwkJICovCisJCWlmIChhZGFwdGVyLT5leHRfc2NhbiAmJiAoIXByaXYtPnNjYW5fYWJvcnRpbmcgfHwKKwkJCQkJICAhbmV0aWZfcnVubmluZyhwcml2LT5uZXRkZXYpKSkKIAkJCXJldCA9IG13aWZpZXhfaGFuZGxlX2V2ZW50X2V4dF9zY2FuX3JlcG9ydChwcml2LAogCQkJCQkJYWRhcHRlci0+ZXZlbnRfc2tiLT5kYXRhKTsKIApAQCAtNzcxLDYgKzg3MiwzOSBAQAogCQkJCUhvc3RDbWRfQ01EXzgwMl8xMV9JQlNTX0NPQUxFU0NJTkdfU1RBVFVTLAogCQkJCUhvc3RDbWRfQUNUX0dFTl9HRVQsIDAsIE5VTEwsIGZhbHNlKTsKIAkJYnJlYWs7CisJY2FzZSBFVkVOVF9JQlNTX1NUQV9DT05ORUNUOgorCQlldGhlcl9hZGRyX2NvcHkoaWJzc19zdGFfYWRkciwgYWRhcHRlci0+ZXZlbnRfYm9keSArIDIpOworCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFVkVOVCwgImV2ZW50OiBJQlNTX1NUQV9DT05ORUNUICVwTVxuIiwKKwkJCSAgICBpYnNzX3N0YV9hZGRyKTsKKwkJc3RhX3B0ciA9IG13aWZpZXhfYWRkX3N0YV9lbnRyeShwcml2LCBpYnNzX3N0YV9hZGRyKTsKKwkJaWYgKHN0YV9wdHIgJiYgYWRhcHRlci0+YWRob2NfMTFuX2VuYWJsZWQpIHsKKwkJCW13aWZpZXhfY2hlY2tfaWJzc19wZWVyX2NhcGFiaWx0aWVzKHByaXYsIHN0YV9wdHIsCisJCQkJCQkJICAgIGFkYXB0ZXItPmV2ZW50X3NrYik7CisJCQlpZiAoc3RhX3B0ci0+aXNfMTFuX2VuYWJsZWQpCisJCQkJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fVElEOyBpKyspCisJCQkJCXN0YV9wdHItPmFtcGR1X3N0YVtpXSA9CisJCQkJCXByaXYtPmFnZ3JfcHJpb190YmxbaV0uYW1wZHVfdXNlcjsKKwkJCWVsc2UKKwkJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9USUQ7IGkrKykKKwkJCQkJc3RhX3B0ci0+YW1wZHVfc3RhW2ldID0KKwkJCQkJCUJBX1NUUkVBTV9OT1RfQUxMT1dFRDsKKwkJCW1lbXNldChzdGFfcHRyLT5yeF9zZXEsIDB4ZmYsIHNpemVvZihzdGFfcHRyLT5yeF9zZXEpKTsKKwkJfQorCisJCWJyZWFrOworCWNhc2UgRVZFTlRfSUJTU19TVEFfRElTQ09OTkVDVDoKKwkJZXRoZXJfYWRkcl9jb3B5KGlic3Nfc3RhX2FkZHIsIGFkYXB0ZXItPmV2ZW50X2JvZHkgKyAyKTsKKwkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVZFTlQsICJldmVudDogSUJTU19TVEFfRElTQ09OTkVDVCAlcE1cbiIsCisJCQkgICAgaWJzc19zdGFfYWRkcik7CisJCXN0YV9wdHIgPSBtd2lmaWV4X2dldF9zdGFfZW50cnkocHJpdiwgaWJzc19zdGFfYWRkcik7CisJCWlmIChzdGFfcHRyICYmIHN0YV9wdHItPmlzXzExbl9lbmFibGVkKSB7CisJCQltd2lmaWV4XzExbl9kZWxfcnhfcmVvcmRlcl90YmxfYnlfdGEocHJpdiwKKwkJCQkJCQkgICAgIGlic3Nfc3RhX2FkZHIpOworCQkJbXdpZmlleF9kZWxfdHhfYmFfc3RyZWFtX3RibF9ieV9yYShwcml2LCBpYnNzX3N0YV9hZGRyKTsKKwkJfQorCQltd2lmaWV4X3dtbV9kZWxfcGVlcl9yYV9saXN0KHByaXYsIGlic3Nfc3RhX2FkZHIpOworCQltd2lmaWV4X2RlbF9zdGFfZW50cnkocHJpdiwgaWJzc19zdGFfYWRkcik7CisJCWJyZWFrOwogCWNhc2UgRVZFTlRfQUREQkE6CiAJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVWRU5ULCAiZXZlbnQ6IEFEREJBIFJlcXVlc3RcbiIpOwogCQltd2lmaWV4X3NlbmRfY21kKHByaXYsIEhvc3RDbWRfQ01EXzExTl9BRERCQV9SU1AsCkBAIC04NjksNiArMTAwMywxMiBAQAogCQltd2lmaWV4X2J0X2NvZXhfd2xhbl9wYXJhbV91cGRhdGVfZXZlbnQocHJpdiwKIAkJCQkJCQlhZGFwdGVyLT5ldmVudF9za2IpOwogCQlicmVhazsKKwljYXNlIEVWRU5UX1JYQkFfU1lOQzoKKwkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJFVkVOVDogUlhCQV9TWU5DXG4iKTsKKwkJbXdpZmlleF8xMW5fcnhiYV9zeW5jX2V2ZW50KHByaXYsIGFkYXB0ZXItPmV2ZW50X2JvZHksCisJCQkJCSAgICBhZGFwdGVyLT5ldmVudF9za2ItPmxlbiAtCisJCQkJCSAgICBzaXplb2YoZXZlbnRjYXVzZSkpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwgImV2ZW50OiB1bmtub3duIGV2ZW50IGlkOiAlI3hcbiIsCiAJCQkgICAgZXZlbnRjYXVzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvc3RhX2lvY3RsLmMKaW5kZXggZTA2NjQ3YS4uNjQ0ZjNhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3N0YV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC9zdGFfaW9jdGwuYwpAQCAtNTc0LDcgKzU3NCw3IEBACiAKIAlhZGFwdGVyLT5oc19hY3RpdmF0ZV93YWl0X3Ffd29rZW4gPSBmYWxzZTsKIAotCW1lbXNldCgmaHNjZmcsIDAsIHNpemVvZihzdHJ1Y3QgbXdpZmlleF9kc19oc19jZmcpKTsKKwltZW1zZXQoJmhzY2ZnLCAwLCBzaXplb2YoaHNjZmcpKTsKIAloc2NmZy5pc19pbnZva2VfaG9zdGNtZCA9IHRydWU7CiAKIAlhZGFwdGVyLT5oc19lbmFibGluZyA9IHRydWU7CkBAIC0xMTM4LDcgKzExMzgsNyBAQAogewogCXN0cnVjdCBtd2lmaWV4X2RzX2VuY3J5cHRfa2V5IGVuY3J5cHRfa2V5OwogCi0JbWVtc2V0KCZlbmNyeXB0X2tleSwgMCwgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2RzX2VuY3J5cHRfa2V5KSk7CisJbWVtc2V0KCZlbmNyeXB0X2tleSwgMCwgc2l6ZW9mKGVuY3J5cHRfa2V5KSk7CiAJZW5jcnlwdF9rZXkua2V5X2xlbiA9IGtleV9sZW47CiAJZW5jcnlwdF9rZXkua2V5X2luZGV4ID0ga2V5X2luZGV4OwogCkBAIC0xMTgwLDcgKzExODAsNyBAQAogewogCXN0cnVjdCBtd2lmaWV4X3Zlcl9leHQgdmVyX2V4dDsKIAotCW1lbXNldCgmdmVyX2V4dCwgMCwgc2l6ZW9mKHN0cnVjdCBob3N0X2NtZF9kc192ZXJzaW9uX2V4dCkpOworCW1lbXNldCgmdmVyX2V4dCwgMCwgc2l6ZW9mKHZlcl9leHQpKTsKIAl2ZXJfZXh0LnZlcnNpb25fc3RyX3NlbCA9IHZlcnNpb25fc3RyX3NlbDsKIAlpZiAobXdpZmlleF9zZW5kX2NtZChwcml2LCBIb3N0Q21kX0NNRF9WRVJTSU9OX0VYVCwKIAkJCSAgICAgSG9zdENtZF9BQ1RfR0VOX0dFVCwgMCwgJnZlcl9leHQsIHRydWUpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VhcF9ldmVudC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VhcF9ldmVudC5jCmluZGV4IDg2ZmY1NDIuLmQyNGVjYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91YXBfZXZlbnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdWFwX2V2ZW50LmMKQEAgLTMwNiw3ICszMDYsMTIgQEAKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgRVZFTlQsICJldmVudDogbXVsdGktY2hhbiBpbmZvXG4iKTsKIAkJbXdpZmlleF9wcm9jZXNzX211bHRpX2NoYW5fZXZlbnQocHJpdiwgYWRhcHRlci0+ZXZlbnRfc2tiKTsKIAkJYnJlYWs7Ci0KKwljYXNlIEVWRU5UX1JYQkFfU1lOQzoKKwkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJFVkVOVDogUlhCQV9TWU5DXG4iKTsKKwkJbXdpZmlleF8xMW5fcnhiYV9zeW5jX2V2ZW50KHByaXYsIGFkYXB0ZXItPmV2ZW50X2JvZHksCisJCQkJCSAgICBhZGFwdGVyLT5ldmVudF9za2ItPmxlbiAtCisJCQkJCSAgICBzaXplb2YoZXZlbnRjYXVzZSkpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFVkVOVCwKIAkJCSAgICAiZXZlbnQ6IHVua25vd24gZXZlbnQgaWQ6ICUjeFxuIiwgZXZlbnRjYXVzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXNiLmMKaW5kZXggMDg1NzU3NS4uNzNlYjA4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91c2IuYwpAQCAtMjczLDYgKzI3Myw4IEBACiAJfSBlbHNlIHsKIAkJbXdpZmlleF9kYmcoYWRhcHRlciwgREFUQSwKIAkJCSAgICAiJXM6IERBVEFcbiIsIF9fZnVuY19fKTsKKwkJbXdpZmlleF93cml0ZV9kYXRhX2NvbXBsZXRlKGFkYXB0ZXIsIGNvbnRleHQtPnNrYiwgMCwKKwkJCQkJICAgIHVyYi0+c3RhdHVzID8gLTEgOiAwKTsKIAkJZm9yIChpID0gMDsgaSA8IE1XSUZJRVhfVFhfREFUQV9QT1JUOyBpKyspIHsKIAkJCXBvcnQgPSAmY2FyZC0+cG9ydFtpXTsKIAkJCWlmIChjb250ZXh0LT5lcCA9PSBwb3J0LT50eF9kYXRhX2VwKSB7CkBAIC0yODIsOCArMjg0LDYgQEAKIAkJCX0KIAkJfQogCQlhZGFwdGVyLT5kYXRhX3NlbnQgPSBmYWxzZTsKLQkJbXdpZmlleF93cml0ZV9kYXRhX2NvbXBsZXRlKGFkYXB0ZXIsIGNvbnRleHQtPnNrYiwgMCwKLQkJCQkJICAgIHVyYi0+c3RhdHVzID8gLTEgOiAwKTsKIAl9CiAKIAlpZiAoY2FyZC0+bWNfcmVzeW5jX2ZsYWcpCkBAIC02MTEsNyArNjExLDcgQEAKIAlpZiAoIWFkYXB0ZXItPnByaXZfbnVtKQogCQlyZXR1cm47CiAKLQlpZiAodXNlcl9ybW1vZCkgeworCWlmICh1c2VyX3JtbW9kICYmICFhZGFwdGVyLT5tZmdfbW9kZSkgewogI2lmZGVmIENPTkZJR19QTQogCQlpZiAoYWRhcHRlci0+aXNfc3VzcGVuZGVkKQogCQkJbXdpZmlleF91c2JfcmVzdW1lKGludGYpOwpAQCAtNjU3LDExICs2NTcsOCBAQAogCWNhcmQtPnR4X2NtZC5lcCA9IGNhcmQtPnR4X2NtZF9lcDsKIAogCWNhcmQtPnR4X2NtZC51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghY2FyZC0+dHhfY21kLnVyYikgewotCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKLQkJCSAgICAidHhfY21kLnVyYiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFjYXJkLT50eF9jbWQudXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTVdJRklFWF9UWF9EQVRBX1BPUlQ7IGkrKykgewogCQlwb3J0ID0gJmNhcmQtPnBvcnRbaV07CkBAIC02NzcsMTEgKzY3NCw4IEBACiAJCQlwb3J0LT50eF9kYXRhX2xpc3Rbal0uZXAgPSBwb3J0LT50eF9kYXRhX2VwOwogCQkJcG9ydC0+dHhfZGF0YV9saXN0W2pdLnVyYiA9CiAJCQkJCXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXBvcnQtPnR4X2RhdGFfbGlzdFtqXS51cmIpIHsKLQkJCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKLQkJCQkJICAgICJ1cmIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQkJaWYgKCFwb3J0LT50eF9kYXRhX2xpc3Rbal0udXJiKQogCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQogCQl9CiAJfQogCkBAIC02OTcsMTAgKzY5MSw4IEBACiAJY2FyZC0+cnhfY21kLmVwID0gY2FyZC0+cnhfY21kX2VwOwogCiAJY2FyZC0+cnhfY21kLnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjYXJkLT5yeF9jbWQudXJiKSB7Ci0JCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLCAicnhfY21kLnVyYiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJaWYgKCFjYXJkLT5yeF9jbWQudXJiKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAljYXJkLT5yeF9jbWQuc2tiID0gZGV2X2FsbG9jX3NrYihNV0lGSUVYX1JYX0NNRF9CVUZfU0laRSk7CiAJaWYgKCFjYXJkLT5yeF9jbWQuc2tiKQpAQCAtNzE0LDExICs3MDYsOCBAQAogCQljYXJkLT5yeF9kYXRhX2xpc3RbaV0uZXAgPSBjYXJkLT5yeF9kYXRhX2VwOwogCiAJCWNhcmQtPnJ4X2RhdGFfbGlzdFtpXS51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIWNhcmQtPnJ4X2RhdGFfbGlzdFtpXS51cmIpIHsKLQkJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLAotCQkJCSAgICAicnhfZGF0YV9saXN0W10gdXJiIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJaWYgKCFjYXJkLT5yeF9kYXRhX2xpc3RbaV0udXJiKQogCQkJcmV0dXJuIC0xOwotCQl9CiAJCWlmIChtd2lmaWV4X3VzYl9zdWJtaXRfcnhfdXJiKCZjYXJkLT5yeF9kYXRhX2xpc3RbaV0sCiAJCQkJCSAgICAgIE1XSUZJRVhfUlhfREFUQV9CVUZfU0laRSkpCiAJCQlyZXR1cm4gLTE7CkBAIC04NTIsNyArODQxLDcgQEAKIAlzdHJ1Y3QgdXNiX3R4X2RhdGFfcG9ydCAqcG9ydCA9IE5VTEw7CiAJdTggKmRhdGEgPSAodTggKilza2ItPmRhdGE7CiAJc3RydWN0IHVyYiAqdHhfdXJiOwotCWludCBpZHgsIHJldDsKKwlpbnQgaWR4LCByZXQgPSAtRUlOUFJPR1JFU1M7CiAKIAlpZiAoYWRhcHRlci0+aXNfc3VzcGVuZGVkKSB7CiAJCW13aWZpZXhfZGJnKGFkYXB0ZXIsIEVSUk9SLApAQCAtODc2LDggKzg2NSw5IEBACiAJCQkJaWYgKGF0b21pY19yZWFkKCZwb3J0LT50eF9kYXRhX3VyYl9wZW5kaW5nKQogCQkJCSAgICA+PSBNV0lGSUVYX1RYX0RBVEFfVVJCKSB7CiAJCQkJCXBvcnQtPmJsb2NrX3N0YXR1cyA9IHRydWU7Ci0JCQkJCXJldCA9IC1FQlVTWTsKLQkJCQkJZ290byBkb25lOworCQkJCQlhZGFwdGVyLT5kYXRhX3NlbnQgPQorCQkJCQkJbXdpZmlleF91c2JfZGF0YV9zZW50KGFkYXB0ZXIpOworCQkJCQlyZXR1cm4gLUVCVVNZOwogCQkJCX0KIAkJCQlpZiAocG9ydC0+dHhfZGF0YV9peCA+PSBNV0lGSUVYX1RYX0RBVEFfVVJCKQogCQkJCQlwb3J0LT50eF9kYXRhX2l4ID0gMDsKQEAgLTkwOCw2ICs4OTgsMTQgQEAKIAllbHNlCiAJCWF0b21pY19pbmMoJnBvcnQtPnR4X2RhdGFfdXJiX3BlbmRpbmcpOwogCisJaWYgKGVwICE9IGNhcmQtPnR4X2NtZF9lcCAmJgorCSAgICBhdG9taWNfcmVhZCgmcG9ydC0+dHhfZGF0YV91cmJfcGVuZGluZykgPT0KKwkJCQkJTVdJRklFWF9UWF9EQVRBX1VSQikgeworCQlwb3J0LT5ibG9ja19zdGF0dXMgPSB0cnVlOworCQlhZGFwdGVyLT5kYXRhX3NlbnQgPSBtd2lmaWV4X3VzYl9kYXRhX3NlbnQoYWRhcHRlcik7CisJCXJldCA9IC1FTk9TUjsKKwl9CisKIAlpZiAodXNiX3N1Ym1pdF91cmIodHhfdXJiLCBHRlBfQVRPTUlDKSkgewogCQltd2lmaWV4X2RiZyhhZGFwdGVyLCBFUlJPUiwKIAkJCSAgICAiJXM6IHVzYl9zdWJtaXRfdXJiIGZhaWxlZFxuIiwgX19mdW5jX18pOwpAQCAtOTE2LDI5ICs5MTQsMTUgQEAKIAkJfSBlbHNlIHsKIAkJCWF0b21pY19kZWMoJnBvcnQtPnR4X2RhdGFfdXJiX3BlbmRpbmcpOwogCQkJcG9ydC0+YmxvY2tfc3RhdHVzID0gZmFsc2U7CisJCQlhZGFwdGVyLT5kYXRhX3NlbnQgPSBmYWxzZTsKIAkJCWlmIChwb3J0LT50eF9kYXRhX2l4KQogCQkJCXBvcnQtPnR4X2RhdGFfaXgtLTsKIAkJCWVsc2UKIAkJCQlwb3J0LT50eF9kYXRhX2l4ID0gTVdJRklFWF9UWF9EQVRBX1VSQjsKIAkJfQotCi0JCXJldHVybiAtMTsKLQl9IGVsc2UgewotCQlpZiAoZXAgIT0gY2FyZC0+dHhfY21kX2VwICYmCi0JCSAgICBhdG9taWNfcmVhZCgmcG9ydC0+dHhfZGF0YV91cmJfcGVuZGluZykgPT0KLQkJCQkJCQlNV0lGSUVYX1RYX0RBVEFfVVJCKSB7Ci0JCQlwb3J0LT5ibG9ja19zdGF0dXMgPSB0cnVlOwotCQkJcmV0ID0gLUVOT1NSOwotCQkJZ290byBkb25lOwotCQl9CisJCXJldCA9IC0xOwogCX0KIAotCXJldHVybiAtRUlOUFJPR1JFU1M7Ci0KLWRvbmU6Ci0JaWYgKGVwICE9IGNhcmQtPnR4X2NtZF9lcCkKLQkJYWRhcHRlci0+ZGF0YV9zZW50ID0gbXdpZmlleF91c2JfZGF0YV9zZW50KGFkYXB0ZXIpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTAzNyw2ICsxMDIxLDEwIEBACiAJCQlkbmxkX2NtZCA9IGxlMzJfdG9fY3B1KGZ3ZGF0YS0+ZndfaGRyLmRubGRfY21kKTsKIAkJCXRsZW4gKz0gc2l6ZW9mKHN0cnVjdCBmd19oZWFkZXIpOwogCisJCQkvKiBDb21tYW5kIDcgZG9lc24ndCBoYXZlIGRhdGEgbGVuZ3RoIGZpZWxkICovCisJCQlpZiAoZG5sZF9jbWQgPT0gRldfQ01EXzcpCisJCQkJZGxlbiA9IDA7CisKIAkJCW1lbWNweShmd2RhdGEtPmRhdGEsICZmaXJtd2FyZVt0bGVuXSwgZGxlbik7CiAKIAkJCWZ3ZGF0YS0+c2VxX251bSA9IGNwdV90b19sZTMyKGZ3X3NlcW51bSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXNiLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXNiLmgKaW5kZXggYjRlOTI0Ni4uMzBlOGViOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3VzYi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91c2IuaApAQCAtNDYsMTEgKzQ2LDEyIEBACiAjZGVmaW5lIFVTQjg3NjZfREVGQVVMVF9GV19OQU1FCSJtcnZsL3VzYjg3NjZfdWFwc3RhLmJpbiIKICNkZWZpbmUgVVNCODc5N19ERUZBVUxUX0ZXX05BTUUJIm1ydmwvdXNiODc5N191YXBzdGEuYmluIgogI2RlZmluZSBVU0I4ODAxX0RFRkFVTFRfRldfTkFNRQkibXJ2bC91c2I4ODAxX3VhcHN0YS5iaW4iCi0jZGVmaW5lIFVTQjg5OTdfREVGQVVMVF9GV19OQU1FCSJtcnZsL3VzYjg5OTdfdWFwc3RhLmJpbiIKKyNkZWZpbmUgVVNCODk5N19ERUZBVUxUX0ZXX05BTUUJIm1ydmwvdXNidXNiODk5N19jb21ib192NC5iaW4iCiAKICNkZWZpbmUgRldfRE5MRF9UWF9CVUZfU0laRQk2MjAKICNkZWZpbmUgRldfRE5MRF9SWF9CVUZfU0laRQkyMDQ4CiAjZGVmaW5lIEZXX0hBU19MQVNUX0JMT0NLCTB4MDAwMDAwMDQKKyNkZWZpbmUgRldfQ01EXzcJCTB4MDAwMDAwMDcKIAogI2RlZmluZSBGV19EQVRBX1hNSVRfU0laRSBcCiAJKHNpemVvZihzdHJ1Y3QgZndfaGVhZGVyKSArIGRsZW4gKyBzaXplb2YodTMyKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91dGlsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213aWZpZXgvdXRpbC5jCmluZGV4IDY2ODFiZTAuLjE4ZmJiOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdpZmlleC91dGlsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2lmaWV4L3V0aWwuYwpAQCAtMzg2LDYgKzM4Niw3IEBACiAJCQkJICAgICJ1bmtub3duIHB1YmxpYyBhY3Rpb24gZnJhbWUgY2F0ZWdvcnkgJWRcbiIsCiAJCQkJICAgIGNhdGVnb3J5KTsKIAkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQltd2lmaWV4X2RiZyhwcml2LT5hZGFwdGVyLCBJTkZPLAogCQkgICAgInVua25vd24gbWdtdCBmcmFtZSBzdWJ0eXBlICUjeFxuIiwgc3R5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZG1hLmMKaW5kZXggNTdhODBjZi4uYThiYzA2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9kbWEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2RtYS5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogCWlmICh1bmxpa2VseShyeHdpLT56ZXJvWzBdIHx8IHJ4d2ktPnplcm9bMV0gfHwgcnh3aS0+emVyb1syXSkpCiAJCWRldl9lcnJfb25jZShkZXYtPmRldiwgIkVycm9yOiBSWFdJIHplcm8gZmllbGRzIGFyZSBzZXRcbiIpOwotCWlmICh1bmxpa2VseShNVDc2X0dFVChNVF9SWERfSU5GT19UWVBFLCBmY2VfaW5mbykpKQorCWlmICh1bmxpa2VseShGSUVMRF9HRVQoTVRfUlhEX0lORk9fVFlQRSwgZmNlX2luZm8pKSkKIAkJZGV2X2Vycl9vbmNlKGRldi0+ZGV2LCAiRXJyb3I6IFJYIHBhdGggc2VlbiBhIG5vbi1wa3QgdXJiXG4iKTsKIAogCXRyYWNlX210X3J4KGRldiwgcnh3aSwgZmNlX2luZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9kbWEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZG1hLmgKaW5kZXggOTc4ZThhOS4uMjcwZDEyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9kbWEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2RtYS5oCkBAIC0xOCw4ICsxOCw2IEBACiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCi0jaW5jbHVkZSAidXRpbC5oIgotCiAjZGVmaW5lIE1UX0RNQV9IRFJfTEVOCQkJNAogI2RlZmluZSBNVF9SWF9JTkZPX0xFTgkJCTQKICNkZWZpbmUgTVRfRkNFX0lORk9fTEVOCQkJNApAQCAtNzksOSArNzcsOSBAQAogCSAqLwogCiAJaW5mbyA9IGZsYWdzIHwKLQkJTVQ3Nl9TRVQoTVRfVFhEX0lORk9fTEVOLCByb3VuZF91cChza2ItPmxlbiwgNCkpIHwKLQkJTVQ3Nl9TRVQoTVRfVFhEX0lORk9fRF9QT1JULCBkX3BvcnQpIHwKLQkJTVQ3Nl9TRVQoTVRfVFhEX0lORk9fVFlQRSwgdHlwZSk7CisJCUZJRUxEX1BSRVAoTVRfVFhEX0lORk9fTEVOLCByb3VuZF91cChza2ItPmxlbiwgNCkpIHwKKwkJRklFTERfUFJFUChNVF9UWERfSU5GT19EX1BPUlQsIGRfcG9ydCkgfAorCQlGSUVMRF9QUkVQKE1UX1RYRF9JTkZPX1RZUEUsIHR5cGUpOwogCiAJcHV0X3VuYWxpZ25lZF9sZTMyKGluZm8sIHNrYl9wdXNoKHNrYiwgc2l6ZW9mKGluZm8pKSk7CiAJcmV0dXJuIHNrYl9wdXRfcGFkdG8oc2tiLCByb3VuZF91cChza2ItPmxlbiwgNCkgKyA0KTsKQEAgLTkwLDcgKzg4LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBtdDc2MDF1X2RtYV9za2Jfd3JhcF9wa3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBtdDc2X3FzZWwgcXNlbCwgdTMyIGZsYWdzKQogewotCWZsYWdzIHw9IE1UNzZfU0VUKE1UX1RYRF9QS1RfSU5GT19RU0VMLCBxc2VsKTsKKwlmbGFncyB8PSBGSUVMRF9QUkVQKE1UX1RYRF9QS1RfSU5GT19RU0VMLCBxc2VsKTsKIAlyZXR1cm4gbXQ3NjAxdV9kbWFfc2tiX3dyYXAoc2tiLCBXTEFOX1BPUlQsIERNQV9QQUNLRVQsIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvZWVwcm9tLmMKaW5kZXggOGQ4ZWUwMy4uZGE2ZmFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9lZXByb20uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2VlcHJvbS5jCkBAIC00NSw4ICs0NSw4IEBACiAJdmFsID0gbXQ3Nl9ycihkZXYsIE1UX0VGVVNFX0NUUkwpOwogCXZhbCAmPSB+KE1UX0VGVVNFX0NUUkxfQUlOIHwKIAkJIE1UX0VGVVNFX0NUUkxfTU9ERSk7Ci0JdmFsIHw9IE1UNzZfU0VUKE1UX0VGVVNFX0NUUkxfQUlOLCBhZGRyICYgfjB4ZikgfAotCSAgICAgICBNVDc2X1NFVChNVF9FRlVTRV9DVFJMX01PREUsIG1vZGUpIHwKKwl2YWwgfD0gRklFTERfUFJFUChNVF9FRlVTRV9DVFJMX0FJTiwgYWRkciAmIH4weGYpIHwKKwkgICAgICAgRklFTERfUFJFUChNVF9FRlVTRV9DVFJMX01PREUsIG1vZGUpIHwKIAkgICAgICAgTVRfRUZVU0VfQ1RSTF9LSUNLOwogCW10NzZfd3IoZGV2LCBNVF9FRlVTRV9DVFJMLCB2YWwpOwogCkBAIC0xMjgsOCArMTI4LDggQEAKIAlpZiAoIWZpZWxkX3ZhbGlkKG5pY19jb25mMCA+PiA4KSkKIAkJcmV0dXJuOwogCi0JaWYgKE1UNzZfR0VUKE1UX0VFX05JQ19DT05GXzBfUlhfUEFUSCwgbmljX2NvbmYwKSA+IDEgfHwKLQkgICAgTVQ3Nl9HRVQoTVRfRUVfTklDX0NPTkZfMF9UWF9QQVRILCBuaWNfY29uZjApID4gMSkKKwlpZiAoRklFTERfR0VUKE1UX0VFX05JQ19DT05GXzBfUlhfUEFUSCwgbmljX2NvbmYwKSA+IDEgfHwKKwkgICAgRklFTERfR0VUKE1UX0VFX05JQ19DT05GXzBfVFhfUEFUSCwgbmljX2NvbmYwKSA+IDEpCiAJCWRldl9lcnIoZGV2LT5kZXYsCiAJCQkiRXJyb3I6IGRldmljZSBoYXMgbW9yZSB0aGFuIDEgUlgvVFggc3RyZWFtIVxuIik7CiB9CkBAIC0xNTAsNyArMTUwLDcgQEAKIAogCW10NzZfd3IoZGV2LCBNVF9NQUNfQUREUl9EVzAsIGdldF91bmFsaWduZWRfbGUzMihkZXYtPm1hY2FkZHIpKTsKIAltdDc2X3dyKGRldiwgTVRfTUFDX0FERFJfRFcxLCBnZXRfdW5hbGlnbmVkX2xlMTYoZGV2LT5tYWNhZGRyICsgNCkgfAotCQlNVDc2X1NFVChNVF9NQUNfQUREUl9EVzFfVTJNRV9NQVNLLCAweGZmKSk7CisJCUZJRUxEX1BSRVAoTVRfTUFDX0FERFJfRFcxX1UyTUVfTUFTSywgMHhmZikpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzYsNyArMTc2LDcgQEAKIAl1OCBtYXhfcHdyOwogCiAJdmFsID0gbXQ3NjAxdV9ycihkZXYsIE1UX1RYX0FMQ19DRkdfMCk7Ci0JbWF4X3B3ciA9IE1UNzZfR0VUKE1UX1RYX0FMQ19DRkdfMF9MSU1JVF8wLCB2YWwpOworCW1heF9wd3IgPSBGSUVMRF9HRVQoTVRfVFhfQUxDX0NGR18wX0xJTUlUXzAsIHZhbCk7CiAKIAlpZiAobXQ3NjAxdV9oYXNfdHNzaShkZXYsIGVlcHJvbSkpIHsKIAkJbXQ3NjAxdV9zZXRfY2hhbm5lbF90YXJnZXRfcG93ZXIoZGV2LCBlZXByb20sIG1heF9wd3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9pbml0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2luaXQuYwppbmRleCA4ZmE3OGQ3Li40NGQ0NmUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2luaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L2luaXQuYwpAQCAtMTA4LDggKzEwOCw5IEBACiB7CiAJdTMyIHZhbDsKIAotCXZhbCA9IE1UNzZfU0VUKE1UX1VTQl9ETUFfQ0ZHX1JYX0JVTEtfQUdHX1RPVVQsIE1UX1VTQl9BR0dSX1RJTUVPVVQpIHwKLQkgICAgICBNVDc2X1NFVChNVF9VU0JfRE1BX0NGR19SWF9CVUxLX0FHR19MTVQsIE1UX1VTQl9BR0dSX1NJWkVfTElNSVQpIHwKKwl2YWwgPSBGSUVMRF9QUkVQKE1UX1VTQl9ETUFfQ0ZHX1JYX0JVTEtfQUdHX1RPVVQsIE1UX1VTQl9BR0dSX1RJTUVPVVQpIHwKKwkgICAgICBGSUVMRF9QUkVQKE1UX1VTQl9ETUFfQ0ZHX1JYX0JVTEtfQUdHX0xNVCwKKwkJCSBNVF9VU0JfQUdHUl9TSVpFX0xJTUlUKSB8CiAJICAgICAgTVRfVVNCX0RNQV9DRkdfUlhfQlVMS19FTiB8CiAJICAgICAgTVRfVVNCX0RNQV9DRkdfVFhfQlVMS19FTjsKIAlpZiAoZGV2LT5pbl9tYXhfcGFja2V0ID09IDUxMikKQEAgLTM5Niw4ICszOTcsOSBAQAogCiAJbXQ3NjAxdV9ybXcoZGV2LCBNVF9VU19DWUNfQ0ZHLCBNVF9VU19DWUNfQ05ULCAweDFlKTsKIAotCW10NzYwMXVfd3IoZGV2LCBNVF9UWE9QX0NUUkxfQ0ZHLCBNVDc2X1NFVChNVF9UWE9QX1RSVU5fRU4sIDB4M2YpIHwKLQkJCQkJICBNVDc2X1NFVChNVF9UWE9QX0VYVF9DQ0FfRExZLCAweDU4KSk7CisJbXQ3NjAxdV93cihkZXYsIE1UX1RYT1BfQ1RSTF9DRkcsCisJCSAgIEZJRUxEX1BSRVAoTVRfVFhPUF9UUlVOX0VOLCAweDNmKSB8CisJCSAgIEZJRUxEX1BSRVAoTVRfVFhPUF9FWFRfQ0NBX0RMWSwgMHg1OCkpOwogCiAJcmV0ID0gbXQ3NjAxdV9lZXByb21faW5pdChkZXYpOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tYWMuYwppbmRleCBlMjFjNTNlLi4zYzU3NjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWFjLmMKQEAgLTE5LDEzICsxOSwxMyBAQAogc3RhdGljIHZvaWQKIG10NzZfbWFjX3Byb2Nlc3NfdHhfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnR4cmF0ZSwgdTE2IHJhdGUpCiB7Ci0JdTggaWR4ID0gTVQ3Nl9HRVQoTVRfVFhXSV9SQVRFX01DUywgcmF0ZSk7CisJdTggaWR4ID0gRklFTERfR0VUKE1UX1RYV0lfUkFURV9NQ1MsIHJhdGUpOwogCiAJdHhyYXRlLT5pZHggPSAwOwogCXR4cmF0ZS0+ZmxhZ3MgPSAwOwogCXR4cmF0ZS0+Y291bnQgPSAxOwogCi0Jc3dpdGNoIChNVDc2X0dFVChNVF9UWFdJX1JBVEVfUEhZX01PREUsIHJhdGUpKSB7CisJc3dpdGNoIChGSUVMRF9HRVQoTVRfVFhXSV9SQVRFX1BIWV9NT0RFLCByYXRlKSkgewogCWNhc2UgTVRfUEhZX1RZUEVfT0ZETToKIAkJdHhyYXRlLT5pZHggPSBpZHggKyA0OwogCQlyZXR1cm47CkBAIC00Nyw3ICs0Nyw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoTVQ3Nl9HRVQoTVRfVFhXSV9SQVRFX0JXLCByYXRlKSA9PSBNVF9QSFlfQldfNDApCisJaWYgKEZJRUxEX0dFVChNVF9UWFdJX1JBVEVfQlcsIHJhdGUpID09IE1UX1BIWV9CV180MCkKIAkJdHhyYXRlLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIOwogCiAJaWYgKHJhdGUgJiBNVF9UWFdJX1JBVEVfU0dJKQpAQCAtMTI1LDkgKzEyNSw5IEBACiAJCWJ3ID0gMDsKIAl9CiAKLQlyYXRldmFsID0gTVQ3Nl9TRVQoTVRfUlhXSV9SQVRFX01DUywgcmF0ZV9pZHgpOwotCXJhdGV2YWwgfD0gTVQ3Nl9TRVQoTVRfUlhXSV9SQVRFX1BIWSwgcGh5KTsKLQlyYXRldmFsIHw9IE1UNzZfU0VUKE1UX1JYV0lfUkFURV9CVywgYncpOworCXJhdGV2YWwgPSBGSUVMRF9QUkVQKE1UX1JYV0lfUkFURV9NQ1MsIHJhdGVfaWR4KTsKKwlyYXRldmFsIHw9IEZJRUxEX1BSRVAoTVRfUlhXSV9SQVRFX1BIWSwgcGh5KTsKKwlyYXRldmFsIHw9IEZJRUxEX1BSRVAoTVRfUlhXSV9SQVRFX0JXLCBidyk7CiAJaWYgKHJhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJKQogCQlyYXRldmFsIHw9IE1UX1JYV0lfUkFURV9TR0k7CiAKQEAgLTE1Niw5ICsxNTYsOSBAQAogCXN0YXQuc3VjY2VzcyA9ICEhKHZhbCAmIE1UX1RYX1NUQVRfRklGT19TVUNDRVNTKTsKIAlzdGF0LmFnZ3IgPSAhISh2YWwgJiBNVF9UWF9TVEFUX0ZJRk9fQUdHUik7CiAJc3RhdC5hY2tfcmVxID0gISEodmFsICYgTVRfVFhfU1RBVF9GSUZPX0FDS1JFUSk7Ci0Jc3RhdC5wa3RpZCA9IE1UNzZfR0VUKE1UX1RYX1NUQVRfRklGT19QSURfVFlQRSwgdmFsKTsKLQlzdGF0LndjaWQgPSBNVDc2X0dFVChNVF9UWF9TVEFUX0ZJRk9fV0NJRCwgdmFsKTsKLQlzdGF0LnJhdGUgPSBNVDc2X0dFVChNVF9UWF9TVEFUX0ZJRk9fUkFURSwgdmFsKTsKKwlzdGF0LnBrdGlkID0gRklFTERfR0VUKE1UX1RYX1NUQVRfRklGT19QSURfVFlQRSwgdmFsKTsKKwlzdGF0LndjaWQgPSBGSUVMRF9HRVQoTVRfVFhfU1RBVF9GSUZPX1dDSUQsIHZhbCk7CisJc3RhdC5yYXRlID0gRklFTERfR0VUKE1UX1RYX1NUQVRfRklGT19SQVRFLCB2YWwpOwogCiAJcmV0dXJuIHN0YXQ7CiB9CkBAIC0yNzAsNyArMjcwLDcgQEAKIAl9CiAKIAl2YWwgJj0gfk1UX0JFQUNPTl9USU1FX0NGR19JTlRWQUw7Ci0JdmFsIHw9IE1UNzZfU0VUKE1UX0JFQUNPTl9USU1FX0NGR19JTlRWQUwsIGludGVydmFsIDw8IDQpIHwKKwl2YWwgfD0gRklFTERfUFJFUChNVF9CRUFDT05fVElNRV9DRkdfSU5UVkFMLCBpbnRlcnZhbCA8PCA0KSB8CiAJCU1UX0JFQUNPTl9USU1FX0NGR19USU1FUl9FTiB8CiAJCU1UX0JFQUNPTl9USU1FX0NGR19TWU5DX01PREUgfAogCQlNVF9CRUFDT05fVElNRV9DRkdfVEJUVF9FTjsKQEAgLTM0OSw4ICszNDksOCBAQAogCXU4IHptYWNbRVRIX0FMRU5dID0ge307CiAJdTMyIGF0dHI7CiAKLQlhdHRyID0gTVQ3Nl9TRVQoTVRfV0NJRF9BVFRSX0JTU19JRFgsIHZpZl9pZHggJiA3KSB8Ci0JICAgICAgIE1UNzZfU0VUKE1UX1dDSURfQVRUUl9CU1NfSURYX0VYVCwgISEodmlmX2lkeCAmIDgpKTsKKwlhdHRyID0gRklFTERfUFJFUChNVF9XQ0lEX0FUVFJfQlNTX0lEWCwgdmlmX2lkeCAmIDcpIHwKKwkgICAgICAgRklFTERfUFJFUChNVF9XQ0lEX0FUVFJfQlNTX0lEWF9FWFQsICEhKHZpZl9pZHggJiA4KSk7CiAKIAltdDc2X3dyKGRldiwgTVRfV0NJRF9BVFRSKGlkeCksIGF0dHIpOwogCkBAIC0zODIsMTUgKzM4MiwxNSBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJbXQ3NjAxdV93cihkZXYsIE1UX01BWF9MRU5fQ0ZHLCAweGEwZmZmIHwKLQkJICAgTVQ3Nl9TRVQoTVRfTUFYX0xFTl9DRkdfQU1QRFUsIG1pbl9mYWN0b3IpKTsKKwkJICAgRklFTERfUFJFUChNVF9NQVhfTEVOX0NGR19BTVBEVSwgbWluX2ZhY3RvcikpOwogfQogCiBzdGF0aWMgdm9pZAogbXQ3Nl9tYWNfcHJvY2Vzc19yYXRlKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXMsIHUxNiByYXRlKQogewotCXU4IGlkeCA9IE1UNzZfR0VUKE1UX1JYV0lfUkFURV9NQ1MsIHJhdGUpOworCXU4IGlkeCA9IEZJRUxEX0dFVChNVF9SWFdJX1JBVEVfTUNTLCByYXRlKTsKIAotCXN3aXRjaCAoTVQ3Nl9HRVQoTVRfUlhXSV9SQVRFX1BIWSwgcmF0ZSkpIHsKKwlzd2l0Y2ggKEZJRUxEX0dFVChNVF9SWFdJX1JBVEVfUEhZLCByYXRlKSkgewogCWNhc2UgTVRfUEhZX1RZUEVfT0ZETToKIAkJaWYgKFdBUk5fT04oaWR4ID49IDgpKQogCQkJaWR4ID0gMDsKQEAgLTQzNiw3ICs0MzYsNyBAQAogCQkJICB1MTYgcmF0ZSwgaW50IHJzc2kpCiB7CiAJZGV2LT5iY25fZnJlcV9vZmYgPSByeHdpLT5mcmVxX29mZjsKLQlkZXYtPmJjbl9waHlfbW9kZSA9IE1UNzZfR0VUKE1UX1JYV0lfUkFURV9QSFksIHJhdGUpOworCWRldi0+YmNuX3BoeV9tb2RlID0gRklFTERfR0VUKE1UX1JYV0lfUkFURV9QSFksIHJhdGUpOwogCWRldi0+YXZnX3Jzc2kgPSAoZGV2LT5hdmdfcnNzaSAqIDE1KSAvIDE2ICsgKHJzc2kgPDwgOCk7CiB9CiAKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCXUxNiByYXRlID0gbGUxNl90b19jcHUocnh3aS0+cmF0ZSk7CiAJaW50IHJzc2k7CiAKLQlsZW4gPSBNVDc2X0dFVChNVF9SWFdJX0NUTF9NUERVX0xFTiwgY3RsKTsKKwlsZW4gPSBGSUVMRF9HRVQoTVRfUlhXSV9DVExfTVBEVV9MRU4sIGN0bCk7CiAJaWYgKGxlbiA8IDEwKQogCQlyZXR1cm4gMDsKIApAQCAtNTQyLDggKzU0Miw4IEBACiAKIAl2YWwgPSBtdDc2MDF1X3JyKGRldiwgTVRfV0NJRF9BVFRSKGlkeCkpOwogCXZhbCAmPSB+TVRfV0NJRF9BVFRSX1BLRVlfTU9ERSAmIH5NVF9XQ0lEX0FUVFJfUEtFWV9NT0RFX0VYVDsKLQl2YWwgfD0gTVQ3Nl9TRVQoTVRfV0NJRF9BVFRSX1BLRVlfTU9ERSwgY2lwaGVyICYgNykgfAotCSAgICAgICBNVDc2X1NFVChNVF9XQ0lEX0FUVFJfUEtFWV9NT0RFX0VYVCwgY2lwaGVyID4+IDMpOworCXZhbCB8PSBGSUVMRF9QUkVQKE1UX1dDSURfQVRUUl9QS0VZX01PREUsIGNpcGhlciAmIDcpIHwKKwkgICAgICAgRklFTERfUFJFUChNVF9XQ0lEX0FUVFJfUEtFWV9NT0RFX0VYVCwgY2lwaGVyID4+IDMpOwogCXZhbCAmPSB+TVRfV0NJRF9BVFRSX1BBSVJXSVNFOwogCXZhbCB8PSBNVF9XQ0lEX0FUVFJfUEFJUldJU0UgKgogCQkhIShrZXkgJiYga2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWFpbi5jCmluZGV4IGU3MGRkOTUuLjQzZWJkNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWFpbi5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSAibXQ3NjAxdS5oIgogI2luY2x1ZGUgIm1hYy5oIgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiBzdGF0aWMgaW50IG10NzYwMXVfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21jdS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tY3UuYwppbmRleCA5MWM0YjM0Li5kYmRmYjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L21jdS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvbWN1LmMKQEAgLTQzLDggKzQzLDggQEAKIAkJCQkJICAgIHU4IHNlcSwgZW51bSBtY3VfY21kIGNtZCkKIHsKIAlXQVJOX09OKG10NzYwMXVfZG1hX3NrYl93cmFwKHNrYiwgQ1BVX1RYX1BPUlQsIERNQV9DT01NQU5ELAotCQkJCSAgICAgTVQ3Nl9TRVQoTVRfVFhEX0NNRF9JTkZPX1NFUSwgc2VxKSB8Ci0JCQkJICAgICBNVDc2X1NFVChNVF9UWERfQ01EX0lORk9fVFlQRSwgY21kKSkpOworCQkJCSAgICAgRklFTERfUFJFUChNVF9UWERfQ01EX0lORk9fU0VRLCBzZXEpIHwKKwkJCQkgICAgIEZJRUxEX1BSRVAoTVRfVFhEX0NNRF9JTkZPX1RZUEUsIGNtZCkpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRyYWNlX210X21jdV9tc2dfc2VuZF9jcyhzdHJ1Y3QgbXQ3NjAxdV9kZXYgKmRldiwKQEAgLTEwMCwxMyArMTAwLDEzIEBACiAJCQlkZXZfZXJyKGRldi0+ZGV2LCAiRXJyb3I6IE1DVSByZXNwIHVyYiBmYWlsZWQ6JWRcbiIsCiAJCQkJdXJiX3N0YXR1cyk7CiAKLQkJaWYgKE1UNzZfR0VUKE1UX1JYRF9DTURfSU5GT19DTURfU0VRLCByeGZjZSkgPT0gc2VxICYmCi0JCSAgICBNVDc2X0dFVChNVF9SWERfQ01EX0lORk9fRVZUX1RZUEUsIHJ4ZmNlKSA9PSBDTURfRE9ORSkKKwkJaWYgKEZJRUxEX0dFVChNVF9SWERfQ01EX0lORk9fQ01EX1NFUSwgcnhmY2UpID09IHNlcSAmJgorCQkgICAgRklFTERfR0VUKE1UX1JYRF9DTURfSU5GT19FVlRfVFlQRSwgcnhmY2UpID09IENNRF9ET05FKQogCQkJcmV0dXJuIDA7CiAKLQkJZGV2X2VycihkZXYtPmRldiwgIkVycm9yOiBNQ1UgcmVzcCBldnQ6JWhoeCBzZXE6JWhoeC0laGh4IVxuIiwKLQkJCU1UNzZfR0VUKE1UX1JYRF9DTURfSU5GT19FVlRfVFlQRSwgcnhmY2UpLAotCQkJc2VxLCBNVDc2X0dFVChNVF9SWERfQ01EX0lORk9fQ01EX1NFUSwgcnhmY2UpKTsKKwkJZGV2X2VycihkZXYtPmRldiwgIkVycm9yOiBNQ1UgcmVzcCBldnQ6JWx4IHNlcTolaGh4LSVseCFcbiIsCisJCQlGSUVMRF9HRVQoTVRfUlhEX0NNRF9JTkZPX0VWVF9UWVBFLCByeGZjZSksCisJCQlzZXEsIEZJRUxEX0dFVChNVF9SWERfQ01EX0lORk9fQ01EX1NFUSwgcnhmY2UpKTsKIAl9CiAKIAlkZXZfZXJyKGRldi0+ZGV2LCAiRXJyb3I6ICVzIHRpbWVkIG91dFxuIiwgX19mdW5jX18pOwpAQCAtMjkxLDkgKzI5MSw5IEBACiAJdTMyIHZhbDsKIAlpbnQgcmV0OwogCi0JcmVnID0gY3B1X3RvX2xlMzIoTVQ3Nl9TRVQoTVRfVFhEX0lORk9fVFlQRSwgRE1BX1BBQ0tFVCkgfAotCQkJICBNVDc2X1NFVChNVF9UWERfSU5GT19EX1BPUlQsIENQVV9UWF9QT1JUKSB8Ci0JCQkgIE1UNzZfU0VUKE1UX1RYRF9JTkZPX0xFTiwgbGVuKSk7CisJcmVnID0gY3B1X3RvX2xlMzIoRklFTERfUFJFUChNVF9UWERfSU5GT19UWVBFLCBETUFfUEFDS0VUKSB8CisJCQkgIEZJRUxEX1BSRVAoTVRfVFhEX0lORk9fRF9QT1JULCBDUFVfVFhfUE9SVCkgfAorCQkJICBGSUVMRF9QUkVQKE1UX1RYRF9JTkZPX0xFTiwgbGVuKSk7CiAJbWVtY3B5KGJ1Zi5idWYsICZyZWcsIHNpemVvZihyZWcpKTsKIAltZW1jcHkoYnVmLmJ1ZiArIHNpemVvZihyZWcpLCBkYXRhLCBsZW4pOwogCW1lbXNldChidWYuYnVmICsgc2l6ZW9mKHJlZykgKyBsZW4sIDAsIDgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9tdDc2MDF1LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L210NzYwMXUuaAppbmRleCA0MjhiZDJmLi5jN2VjNDA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L210NzYwMXUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L210NzYwMXUuaApAQCAtMTUsNiArMTUsNyBAQAogI2lmbmRlZiBNVDc2MDFVX0gKICNkZWZpbmUgTVQ3NjAxVV9ICiAKKyNpbmNsdWRlIDxsaW51eC9iaXRmaWVsZC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC0yNCw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogCiAjaW5jbHVkZSAicmVncy5oIgotI2luY2x1ZGUgInV0aWwuaCIKIAogI2RlZmluZSBNVF9DQUxJQlJBVEVfSU5URVJWQUwJCSg0ICogSFopCiAKQEAgLTI5OSw3ICsyOTksNyBAQAogCiAvKiBDb21wYXRpYmlsaXR5IHdpdGggbXQ3NiAqLwogI2RlZmluZSBtdDc2X3Jtd19maWVsZChfZGV2LCBfcmVnLCBfZmllbGQsIF92YWwpCVwKLQltdDc2X3JtdyhfZGV2LCBfcmVnLCBfZmllbGQsIE1UNzZfU0VUKF9maWVsZCwgX3ZhbCkpCisJbXQ3Nl9ybXcoX2RldiwgX3JlZywgX2ZpZWxkLCBGSUVMRF9QUkVQKF9maWVsZCwgX3ZhbCkpCiAKIHN0YXRpYyBpbmxpbmUgdTMyIG10NzZfcnIoc3RydWN0IG10NzYwMXVfZGV2ICpkZXYsIHUzMiBvZmZzZXQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS9waHkuYwppbmRleCAxOTA4YWY2Li5jYTA5YTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvcGh5LmMKQEAgLTQxLDExICs0MSwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQltdDc2MDF1X3dyKGRldiwgTVRfUkZfQ1NSX0NGRywgTVQ3Nl9TRVQoTVRfUkZfQ1NSX0NGR19EQVRBLCB2YWx1ZSkgfAotCQkJCSAgICAgICBNVDc2X1NFVChNVF9SRl9DU1JfQ0ZHX1JFR19CQU5LLCBiYW5rKSB8Ci0JCQkJICAgICAgIE1UNzZfU0VUKE1UX1JGX0NTUl9DRkdfUkVHX0lELCBvZmZzZXQpIHwKLQkJCQkgICAgICAgTVRfUkZfQ1NSX0NGR19XUiB8Ci0JCQkJICAgICAgIE1UX1JGX0NTUl9DRkdfS0lDSyk7CisJbXQ3NjAxdV93cihkZXYsIE1UX1JGX0NTUl9DRkcsCisJCSAgIEZJRUxEX1BSRVAoTVRfUkZfQ1NSX0NGR19EQVRBLCB2YWx1ZSkgfAorCQkgICBGSUVMRF9QUkVQKE1UX1JGX0NTUl9DRkdfUkVHX0JBTkssIGJhbmspIHwKKwkJICAgRklFTERfUFJFUChNVF9SRl9DU1JfQ0ZHX1JFR19JRCwgb2Zmc2V0KSB8CisJCSAgIE1UX1JGX0NTUl9DRkdfV1IgfAorCQkgICBNVF9SRl9DU1JfQ0ZHX0tJQ0spOwogCXRyYWNlX3JmX3dyaXRlKGRldiwgYmFuaywgb2Zmc2V0LCB2YWx1ZSk7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZkZXYtPnJlZ19hdG9taWNfbXV0ZXgpOwpAQCAtNzQsMTcgKzc1LDE4IEBACiAJaWYgKCFtdDc2X3BvbGwoZGV2LCBNVF9SRl9DU1JfQ0ZHLCBNVF9SRl9DU1JfQ0ZHX0tJQ0ssIDAsIDEwMCkpCiAJCWdvdG8gb3V0OwogCi0JbXQ3NjAxdV93cihkZXYsIE1UX1JGX0NTUl9DRkcsIE1UNzZfU0VUKE1UX1JGX0NTUl9DRkdfUkVHX0JBTkssIGJhbmspIHwKLQkJCQkgICAgICAgTVQ3Nl9TRVQoTVRfUkZfQ1NSX0NGR19SRUdfSUQsIG9mZnNldCkgfAotCQkJCSAgICAgICBNVF9SRl9DU1JfQ0ZHX0tJQ0spOworCW10NzYwMXVfd3IoZGV2LCBNVF9SRl9DU1JfQ0ZHLAorCQkgICBGSUVMRF9QUkVQKE1UX1JGX0NTUl9DRkdfUkVHX0JBTkssIGJhbmspIHwKKwkJICAgRklFTERfUFJFUChNVF9SRl9DU1JfQ0ZHX1JFR19JRCwgb2Zmc2V0KSB8CisJCSAgIE1UX1JGX0NTUl9DRkdfS0lDSyk7CiAKIAlpZiAoIW10NzZfcG9sbChkZXYsIE1UX1JGX0NTUl9DRkcsIE1UX1JGX0NTUl9DRkdfS0lDSywgMCwgMTAwKSkKIAkJZ290byBvdXQ7CiAKIAl2YWwgPSBtdDc2MDF1X3JyKGRldiwgTVRfUkZfQ1NSX0NGRyk7Ci0JaWYgKE1UNzZfR0VUKE1UX1JGX0NTUl9DRkdfUkVHX0lELCB2YWwpID09IG9mZnNldCAmJgotCSAgICBNVDc2X0dFVChNVF9SRl9DU1JfQ0ZHX1JFR19CQU5LLCB2YWwpID09IGJhbmspIHsKLQkJcmV0ID0gTVQ3Nl9HRVQoTVRfUkZfQ1NSX0NGR19EQVRBLCB2YWwpOworCWlmIChGSUVMRF9HRVQoTVRfUkZfQ1NSX0NGR19SRUdfSUQsIHZhbCkgPT0gb2Zmc2V0ICYmCisJICAgIEZJRUxEX0dFVChNVF9SRl9DU1JfQ0ZHX1JFR19CQU5LLCB2YWwpID09IGJhbmspIHsKKwkJcmV0ID0gRklFTERfR0VUKE1UX1JGX0NTUl9DRkdfREFUQSwgdmFsKTsKIAkJdHJhY2VfcmZfcmVhZChkZXYsIGJhbmssIG9mZnNldCwgcmV0KTsKIAl9CiBvdXQ6CkBAIC0xMzksOCArMTQxLDggQEAKIAl9CiAKIAltdDc2MDF1X3dyKGRldiwgTVRfQkJQX0NTUl9DRkcsCi0JCSAgIE1UNzZfU0VUKE1UX0JCUF9DU1JfQ0ZHX1ZBTCwgdmFsKSB8Ci0JCSAgIE1UNzZfU0VUKE1UX0JCUF9DU1JfQ0ZHX1JFR19OVU0sIG9mZnNldCkgfAorCQkgICBGSUVMRF9QUkVQKE1UX0JCUF9DU1JfQ0ZHX1ZBTCwgdmFsKSB8CisJCSAgIEZJRUxEX1BSRVAoTVRfQkJQX0NTUl9DRkdfUkVHX05VTSwgb2Zmc2V0KSB8CiAJCSAgIE1UX0JCUF9DU1JfQ0ZHX1JXX01PREUgfCBNVF9CQlBfQ1NSX0NGR19CVVNZKTsKIAl0cmFjZV9iYnBfd3JpdGUoZGV2LCBvZmZzZXQsIHZhbCk7CiBvdXQ6CkBAIC0xNjMsNyArMTY1LDcgQEAKIAkJZ290byBvdXQ7CiAKIAltdDc2MDF1X3dyKGRldiwgTVRfQkJQX0NTUl9DRkcsCi0JCSAgIE1UNzZfU0VUKE1UX0JCUF9DU1JfQ0ZHX1JFR19OVU0sIG9mZnNldCkgfAorCQkgICBGSUVMRF9QUkVQKE1UX0JCUF9DU1JfQ0ZHX1JFR19OVU0sIG9mZnNldCkgfAogCQkgICBNVF9CQlBfQ1NSX0NGR19SV19NT0RFIHwgTVRfQkJQX0NTUl9DRkdfQlVTWSB8CiAJCSAgIE1UX0JCUF9DU1JfQ0ZHX1JFQUQpOwogCkBAIC0xNzEsOCArMTczLDggQEAKIAkJZ290byBvdXQ7CiAKIAl2YWwgPSBtdDc2MDF1X3JyKGRldiwgTVRfQkJQX0NTUl9DRkcpOwotCWlmIChNVDc2X0dFVChNVF9CQlBfQ1NSX0NGR19SRUdfTlVNLCB2YWwpID09IG9mZnNldCkgewotCQlyZXQgPSBNVDc2X0dFVChNVF9CQlBfQ1NSX0NGR19WQUwsIHZhbCk7CisJaWYgKEZJRUxEX0dFVChNVF9CQlBfQ1NSX0NGR19SRUdfTlVNLCB2YWwpID09IG9mZnNldCkgeworCQlyZXQgPSBGSUVMRF9HRVQoTVRfQkJQX0NTUl9DRkdfVkFMLCB2YWwpOwogCQl0cmFjZV9iYnBfcmVhZChkZXYsIG9mZnNldCwgcmV0KTsKIAl9CiBvdXQ6CkBAIC0yNDksOSArMjUxLDkgQEAKIAkJCS8qIGJ3NDAgKi8geyAtMiwgMTYsIDM0IH0KIAkJfQogCX07Ci0JaW50IGJ3ID0gTVQ3Nl9HRVQoTVRfUlhXSV9SQVRFX0JXLCByYXRlKTsKLQlpbnQgYXV4X2xuYSA9IE1UNzZfR0VUKE1UX1JYV0lfQU5UX0FVWF9MTkEsIHJ4d2ktPmFudCk7Ci0JaW50IGxuYV9pZCA9IE1UNzZfR0VUKE1UX1JYV0lfR0FJTl9SU1NJX0xOQV9JRCwgcnh3aS0+Z2Fpbik7CisJaW50IGJ3ID0gRklFTERfR0VUKE1UX1JYV0lfUkFURV9CVywgcmF0ZSk7CisJaW50IGF1eF9sbmEgPSBGSUVMRF9HRVQoTVRfUlhXSV9BTlRfQVVYX0xOQSwgcnh3aS0+YW50KTsKKwlpbnQgbG5hX2lkID0gRklFTERfR0VUKE1UX1JYV0lfR0FJTl9SU1NJX0xOQV9JRCwgcnh3aS0+Z2Fpbik7CiAJaW50IHZhbDsKIAogCWlmIChsbmFfaWQpIC8qIExOQSBpZCBjYW4gYmUgMCwgMiwgMy4gKi8KQEAgLTI1OSw3ICsyNjEsNyBAQAogCiAJdmFsID0gODsKIAl2YWwgLT0gbG5hW2F1eF9sbmFdW2J3XVtsbmFfaWRdOwotCXZhbCAtPSBNVDc2X0dFVChNVF9SWFdJX0dBSU5fUlNTSV9WQUwsIHJ4d2ktPmdhaW4pOworCXZhbCAtPSBGSUVMRF9HRVQoTVRfUlhXSV9HQUlOX1JTU0lfVkFMLCByeHdpLT5nYWluKTsKIAl2YWwgLT0gZGV2LT5lZS0+bG5hX2dhaW47CiAJdmFsIC09IGRldi0+ZWUtPnJzc2lfb2Zmc2V0WzBdOwogCkBAIC05MzksNyArOTQxLDcgQEAKIAlkZXZfZGJnKGRldi0+ZGV2LCAiZmluYWwgZGlmZjogJTA4eFxuIiwgZGlmZl9wd3IpOwogCiAJdmFsID0gbXQ3NjAxdV9ycihkZXYsIE1UX1RYX0FMQ19DRkdfMSk7Ci0JY3Vycl9wd3IgPSBzNl90b19pbnQoTVQ3Nl9HRVQoTVRfVFhfQUxDX0NGR18xX1RFTVBfQ09NUCwgdmFsKSk7CisJY3Vycl9wd3IgPSBzNl90b19pbnQoRklFTERfR0VUKE1UX1RYX0FMQ19DRkdfMV9URU1QX0NPTVAsIHZhbCkpOwogCWRpZmZfcHdyICs9IGN1cnJfcHdyOwogCXZhbCA9ICh2YWwgJiB+TVRfVFhfQUxDX0NGR18xX1RFTVBfQ09NUCkgfCBpbnRfdG9fczYoZGlmZl9wd3IpOwogCW10NzYwMXVfd3IoZGV2LCBNVF9UWF9BTENfQ0ZHXzEsIHZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3JlZ3MuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvcmVncy5oCmluZGV4IGFmZDg5NzguLjI3YTQyOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvcmVncy5oCkBAIC0xNywxMCArMTcsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKLSNpZm5kZWYgR0VOTUFTSwotI2RlZmluZSBHRU5NQVNLKGgsIGwpICAgICAgICgoKFUzMl9DKDEpIDw8ICgoaCkgLSAobCkgKyAxKSkgLSAxKSA8PCAobCkpCi0jZW5kaWYKLQogI2RlZmluZSBNVF9BU0lDX1ZFUlNJT04JCQkweDAwMDAKIAogI2RlZmluZSBNVDc2WFhfUkVWX0UzCQkweDIyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tZWRpYXRlay9tdDc2MDF1L3R4LmMKaW5kZXggYTBhMzNkYy4uYWQ3N2JlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS90eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvdHguYwpAQCAtMTc1LDExICsxNzUsMTIgQEAKIAkJYmFfc2l6ZSA9IG1pbl90KGludCwgNjMsIGJhX3NpemUpOwogCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRSkKIAkJCWJhX3NpemUgPSAwOwotCQl0eHdpLT5hY2tfY3RsIHw9IE1UNzZfU0VUKE1UX1RYV0lfQUNLX0NUTF9CQV9XSU5ET1csIGJhX3NpemUpOworCQl0eHdpLT5hY2tfY3RsIHw9IEZJRUxEX1BSRVAoTVRfVFhXSV9BQ0tfQ1RMX0JBX1dJTkRPVywgYmFfc2l6ZSk7CiAKLQkJdHh3aS0+ZmxhZ3MgPSBjcHVfdG9fbGUxNihNVF9UWFdJX0ZMQUdTX0FNUERVIHwKLQkJCQkJICBNVDc2X1NFVChNVF9UWFdJX0ZMQUdTX01QRFVfREVOU0lUWSwKLQkJCQkJCSAgIHN0YS0+aHRfY2FwLmFtcGR1X2RlbnNpdHkpKTsKKwkJdHh3aS0+ZmxhZ3MgPQorCQkJY3B1X3RvX2xlMTYoTVRfVFhXSV9GTEFHU19BTVBEVSB8CisJCQkJICAgIEZJRUxEX1BSRVAoTVRfVFhXSV9GTEFHU19NUERVX0RFTlNJVFksCisJCQkJCSAgICAgICBzdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5KSk7CiAJCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUkFURV9DVFJMX1BST0JFKQogCQkJdHh3aS0+ZmxhZ3MgPSAwOwogCX0KQEAgLTE4OCw3ICsxODksNyBAQAogCiAJaXNfcHJvYmUgPSAhIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUkFURV9DVFJMX1BST0JFKTsKIAlwa3RfaWQgPSBtdDc2MDF1X3R4X3BrdGlkX2VuYyhkZXYsIHJhdGVfY3RsICYgMHg3LCBpc19wcm9iZSk7Ci0JcGt0X2xlbiB8PSBNVDc2X1NFVChNVF9UWFdJX0xFTl9QS1RJRCwgcGt0X2lkKTsKKwlwa3RfbGVuIHw9IEZJRUxEX1BSRVAoTVRfVFhXSV9MRU5fUEtUSUQsIHBrdF9pZCk7CiAJdHh3aS0+bGVuX2N0bCA9IGNwdV90b19sZTE2KHBrdF9sZW4pOwogCiAJcmV0dXJuIHR4d2k7CkBAIC0yODUsOSArMjg2LDkgQEAKIAlXQVJOX09OKGN3X21pbiA+IDB4Zik7CiAJV0FSTl9PTihjd19tYXggPiAweGYpOwogCi0JdmFsID0gTVQ3Nl9TRVQoTVRfRURDQV9DRkdfQUlGU04sIHBhcmFtcy0+YWlmcykgfAotCSAgICAgIE1UNzZfU0VUKE1UX0VEQ0FfQ0ZHX0NXTUlOLCBjd19taW4pIHwKLQkgICAgICBNVDc2X1NFVChNVF9FRENBX0NGR19DV01BWCwgY3dfbWF4KTsKKwl2YWwgPSBGSUVMRF9QUkVQKE1UX0VEQ0FfQ0ZHX0FJRlNOLCBwYXJhbXMtPmFpZnMpIHwKKwkgICAgICBGSUVMRF9QUkVQKE1UX0VEQ0FfQ0ZHX0NXTUlOLCBjd19taW4pIHwKKwkgICAgICBGSUVMRF9QUkVQKE1UX0VEQ0FfQ0ZHX0NXTUFYLCBjd19tYXgpOwogCS8qIFRPRE86IGJhc2VkIG9uIHVzZXItY29udHJvbGxlZCBFbmFibGVUeEJ1cnN0IHZhciB2ZW5kb3IgZHJ2IHNldHMKIAkgKgkgYSByZWFsbHkgbG9uZyB0eG9wIG9uIEFDMCAoc2VlIGNvbm5lY3QuYzoyMDA5KSBidXQgb25seSBvbgogCSAqCSBjb25uZWN0PyBXaGVuIG5vdCBjb25uZWN0ZWQgc2hvdWxkIGJlIDAuCkBAIC0yOTUsNyArMjk2LDcgQEAKIAlpZiAoIWh3X3EpCiAJCXZhbCB8PSAweDYwOwogCWVsc2UKLQkJdmFsIHw9IE1UNzZfU0VUKE1UX0VEQ0FfQ0ZHX1RYT1AsIHBhcmFtcy0+dHhvcCk7CisJCXZhbCB8PSBGSUVMRF9QUkVQKE1UX0VEQ0FfQ0ZHX1RYT1AsIHBhcmFtcy0+dHhvcCk7CiAJbXQ3Nl93cihkZXYsIE1UX0VEQ0FfQ0ZHX0FDKGh3X3EpLCB2YWwpOwogCiAJdmFsID0gbXQ3Nl9ycihkZXYsIE1UX1dNTV9UWE9QKGh3X3EpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21lZGlhdGVrL210NzYwMXUvdXRpbC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OTE0MGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWVkaWF0ZWsvbXQ3NjAxdS91dGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IEZlbGl4IEZpZXRrYXUgPG5iZEBvcGVud3J0Lm9yZz4KLSAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDkgSXZvIHZhbiBEb29ybiA8SXZEb29ybkBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX01UNzZfVVRJTF9ICi0jZGVmaW5lIF9fTVQ3Nl9VVElMX0gKLQotLyoKLSAqIFBvd2VyIG9mIHR3byBjaGVjaywgdGhpcyB3aWxsIGNoZWNrCi0gKiBpZiB0aGUgbWFzayB0aGF0IGhhcyBiZWVuIGdpdmVuIGNvbnRhaW5zIGFuZCBjb250aWd1b3VzIHNldCBvZiBiaXRzLgotICogTm90ZSB0aGF0IHdlIGNhbm5vdCB1c2UgdGhlIGlzX3Bvd2VyX29mXzIoKSBmdW5jdGlvbiBzaW5jZSB0aGlzCi0gKiBjaGVjayBtdXN0IGJlIGRvbmUgYXQgY29tcGlsZS10aW1lLgotICovCi0jZGVmaW5lIGlzX3Bvd2VyX29mX3R3byh4KQkoICEoKHgpICYgKCh4KS0xKSkgKQotI2RlZmluZSBsb3dfYml0X21hc2soeCkJCSggKCh4KS0xKSAmIH4oeCkgKQotI2RlZmluZSBpc192YWxpZF9tYXNrKHgpCWlzX3Bvd2VyX29mX3R3bygxTFUgKyAoeCkgKyBsb3dfYml0X21hc2soeCkpCi0KLS8qCi0gKiBNYWNyb3MgdG8gZmluZCBmaXJzdCBzZXQgYml0IGluIGEgdmFyaWFibGUuCi0gKiBUaGVzZSBtYWNyb3MgYmVoYXZlIHRoZSBzYW1lIGFzIHRoZSBfX2ZmcygpIGZ1bmN0aW9ucyBidXQKLSAqIHRoZSBtb3N0IGltcG9ydGFudCBkaWZmZXJlbmNlIHRoYXQgdGhpcyBpcyBkb25lIGR1cmluZwotICogY29tcGlsZS10aW1lIHJhdGhlciB0aGVuIHJ1bi10aW1lLgotICovCi0jZGVmaW5lIGNvbXBpbGVfZmZzMihfX3gpIFwKLQlfX2J1aWx0aW5fY2hvb3NlX2V4cHIoKChfX3gpICYgMHgxKSwgMCwgMSkKLQotI2RlZmluZSBjb21waWxlX2ZmczQoX194KSBcCi0JX19idWlsdGluX2Nob29zZV9leHByKCgoX194KSAmIDB4MyksIFwKLQkJCSAgICAgIChjb21waWxlX2ZmczIoKF9feCkpKSwgXAotCQkJICAgICAgKGNvbXBpbGVfZmZzMigoX194KSA+PiAyKSArIDIpKQotCi0jZGVmaW5lIGNvbXBpbGVfZmZzOChfX3gpIFwKLQlfX2J1aWx0aW5fY2hvb3NlX2V4cHIoKChfX3gpICYgMHhmKSwgXAotCQkJICAgICAgKGNvbXBpbGVfZmZzNCgoX194KSkpLCBcCi0JCQkgICAgICAoY29tcGlsZV9mZnM0KChfX3gpID4+IDQpICsgNCkpCi0KLSNkZWZpbmUgY29tcGlsZV9mZnMxNihfX3gpIFwKLQlfX2J1aWx0aW5fY2hvb3NlX2V4cHIoKChfX3gpICYgMHhmZiksIFwKLQkJCSAgICAgIChjb21waWxlX2ZmczgoKF9feCkpKSwgXAotCQkJICAgICAgKGNvbXBpbGVfZmZzOCgoX194KSA+PiA4KSArIDgpKQotCi0jZGVmaW5lIGNvbXBpbGVfZmZzMzIoX194KSBcCi0JX19idWlsdGluX2Nob29zZV9leHByKCgoX194KSAmIDB4ZmZmZiksIFwKLQkJCSAgICAgIChjb21waWxlX2ZmczE2KChfX3gpKSksIFwKLQkJCSAgICAgIChjb21waWxlX2ZmczE2KChfX3gpID4+IDE2KSArIDE2KSkKLQotLyoKLSAqIFRoaXMgbWFjcm8gd2lsbCBjaGVjayB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgRklFTER7OCwxNiwzMn0gbWFjcm9zCi0gKiBUaGUgbWFzayBzaG91bGQgYmUgYSBjb25zdGFudCBub24temVybyBjb250aWd1b3VzIHNldCBvZiBiaXRzIHdoaWNoCi0gKiBkb2VzIG5vdCBleGNlZWQgdGhlIGdpdmVuIHR5cGVsaW1pdC4KLSAqLwotI2RlZmluZSBGSUVMRF9DSEVDSyhfX21hc2spIFwKLQlCVUlMRF9CVUdfT04oIShfX21hc2spIHx8ICFpc192YWxpZF9tYXNrKF9fbWFzaykpCi0KLSNkZWZpbmUgTVQ3Nl9TRVQoX21hc2ssIF92YWwpCQkJCQkJXAotCSh7CQkJCQkJCQlcCi0JCUZJRUxEX0NIRUNLKF9tYXNrKTsJCQkJCVwKLQkJKCgodTMyKSAoX3ZhbCkpIDw8IGNvbXBpbGVfZmZzMzIoX21hc2spKSAmIF9tYXNrOwlcCi0JfSkKLQotI2RlZmluZSBNVDc2X0dFVChfbWFzaywgX3ZhbCkJCQkJCQlcCi0JKHsJCQkJCQkJCVwKLQkJRklFTERfQ0hFQ0soX21hc2spOwkJCQkJXAotCQkodTMyKSAoKChfdmFsKSAmIF9tYXNrKSA+PiBjb21waWxlX2ZmczMyKF9tYXNrKSk7CVwKLQl9KQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JhbGluay9ydDJ4MDAvcnQyeDAwdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYWxpbmsvcnQyeDAwL3J0MngwMHVzYi5jCmluZGV4IDdjZjI2YzYuLjYwMDVlMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JhbGluay9ydDJ4MDAvcnQyeDAwdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmFsaW5rL3J0MngwMC9ydDJ4MDB1c2IuYwpAQCAtODMxLDggKzgzMSwxMCBAQAogCXJ0MngwMGRldi0+YW5jaG9yID0gZGV2bV9rbWFsbG9jKCZ1c2JfZGV2LT5kZXYsCiAJCQkJCXNpemVvZihzdHJ1Y3QgdXNiX2FuY2hvciksCiAJCQkJCUdGUF9LRVJORUwpOwotCWlmICghcnQyeDAwZGV2LT5hbmNob3IpCisJaWYgKCFydDJ4MDBkZXYtPmFuY2hvcikgeworCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGV4aXRfZnJlZV9yZWc7CisJfQogCiAJaW5pdF91c2JfYW5jaG9yKHJ0MngwMGRldi0+YW5jaG9yKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHUuaAppbmRleCA0MzQxZDU2Li4xMDE2NjI4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHUuaApAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBSVEw4WFhYVV9ERUJVR19IMkMJCTB4ODAwCiAjZGVmaW5lIFJUTDhYWFhVX0RFQlVHX0FDVElPTgkJMHgxMDAwCiAjZGVmaW5lIFJUTDhYWFhVX0RFQlVHX0VGVVNFCQkweDIwMDAKKyNkZWZpbmUgUlRMOFhYWFVfREVCVUdfSU5URVJSVVBUCTB4NDAwMAogCiAjZGVmaW5lIFJUV19VU0JfQ09OVFJPTF9NU0dfVElNRU9VVAk1MDAKICNkZWZpbmUgUlRMOFhYWFVfTUFYX1JFR19QT0xMCQk1MDAKQEAgLTQzLDYgKzQ0LDcgQEAKIAogI2RlZmluZSBUWF9UT1RBTF9QQUdFX05VTQkJMHhmOAogI2RlZmluZSBUWF9UT1RBTF9QQUdFX05VTV84MTkyRQkJMHhmMworI2RlZmluZSBUWF9UT1RBTF9QQUdFX05VTV84NzIzQgkJMHhmNwogLyogKEhQUSArIExQUSArIE5QUSArIFBVQlEpID0gVFhfVE9UQUxfUEFHRV9OVU0gKi8KICNkZWZpbmUgVFhfUEFHRV9OVU1fUFVCUQkJMHhlNwogI2RlZmluZSBUWF9QQUdFX05VTV9ISV9QUQkJMHgwYwpAQCAtNTQsNiArNTYsMTEgQEAKICNkZWZpbmUgVFhfUEFHRV9OVU1fTE9fUFFfODE5MkUJCTB4MGMKICNkZWZpbmUgVFhfUEFHRV9OVU1fTk9STV9QUV84MTkyRQkweDAwCiAKKyNkZWZpbmUgVFhfUEFHRV9OVU1fUFVCUV84NzIzQgkJMHhlNworI2RlZmluZSBUWF9QQUdFX05VTV9ISV9QUV84NzIzQgkJMHgwYworI2RlZmluZSBUWF9QQUdFX05VTV9MT19QUV84NzIzQgkJMHgwMgorI2RlZmluZSBUWF9QQUdFX05VTV9OT1JNX1BRXzg3MjNCCTB4MDIKKwogI2RlZmluZSBSVExfRldfUEFHRV9TSVpFCQk0MDk2CiAjZGVmaW5lIFJUTDhYWFhVX0ZJUk1XQVJFX1BPTExfTUFYCTEwMDAKIApAQCAtMTMxMiw3ICsxMzE5LDcgQEAKIAlpbnQgKCpwb3dlcl9vbikgKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIAl2b2lkICgqcG93ZXJfb2ZmKSAoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogCXZvaWQgKCpyZXNldF84MDUxKSAoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwotCWludCAoKmxsdF9pbml0KSAoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYsIHU4IGxhc3RfdHhfcGFnZSk7CisJaW50ICgqbGx0X2luaXQpIChzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiAJdm9pZCAoKmluaXRfcGh5X2JiKSAoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogCWludCAoKmluaXRfcGh5X3JmKSAoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogCXZvaWQgKCpwaHlfaW5pdF9hbnRlbm5hX3NlbGVjdGlvbikgKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKQEAgLTEzMzAsMTEgKzEzMzcsMTcgQEAKIAkJCQkgIHUzMiByYW1hc2ssIGludCBzZ2kpOwogCXZvaWQgKCpyZXBvcnRfY29ubmVjdCkgKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LAogCQkJCXU4IG1hY2lkLCBib29sIGNvbm5lY3QpOworCXZvaWQgKCpmaWxsX3R4ZGVzYykgKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkgICAgIHN0cnVjdCBydGw4eHh4dV90eGRlc2MzMiAqdHhfZGVzYywgdTMyIHJhdGUsCisJCQkgICAgIHUxNiByYXRlX2ZsYWcsIGJvb2wgc2dpLCBib29sIHNob3J0X3ByZWFtYmxlLAorCQkJICAgICBib29sIGFtcGR1X2VuYWJsZSk7CiAJaW50IHdyaXRlTl9ibG9ja19zaXplOwogCWludCByeF9hZ2dfYnVmX3NpemU7CiAJY2hhciB0eF9kZXNjX3NpemU7CiAJY2hhciByeF9kZXNjX3NpemU7Ci0JY2hhciBoYXNfczBzMTsKKwl1OCBoYXNfczBzMToxOworCXU4IGhhc190eF9yZXBvcnQ6MTsKKwl1OCBnZW4yX3RoZXJtYWxfbWV0ZXI6MTsKIAl1MzIgYWRkYV8xdF9pbml0OwogCXUzMiBhZGRhXzF0X3BhdGhfb247CiAJdTMyIGFkZGFfMnRfcGF0aF9vbl9hOwpAQCAtMTM4OCwxNCArMTQwMSwxNCBAQAogdm9pZCBydGw4eHh4dV9maXJtd2FyZV9zZWxmX3Jlc2V0KHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIHZvaWQgcnRsOHh4eHVfcG93ZXJfb2ZmKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIHZvaWQgcnRsOHh4eHVfcmVzZXRfODA1MShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7Ci1pbnQgcnRsOHh4eHVfYXV0b19sbHRfdGFibGUoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYsIHU4IGxhc3RfdHhfcGFnZSk7CitpbnQgcnRsOHh4eHVfYXV0b19sbHRfdGFibGUoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogdm9pZCBydGw4eHh4dV9nZW4yX3ByZXBhcmVfY2FsaWJyYXRlKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LCB1OCBzdGFydCk7CiBpbnQgcnRsOHh4eHVfZmx1c2hfZmlmbyhzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiBpbnQgcnRsOHh4eHVfZ2VuMl9oMmNfY21kKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LAogCQkJICBzdHJ1Y3QgaDJjX2NtZCAqaDJjLCBpbnQgbGVuKTsKIGludCBydGw4eHh4dV9hY3RpdmVfdG9fbHBzKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKIHZvaWQgcnRsOHh4eHVfZGlzYWJsZWRfdG9fZW11KHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KTsKLWludCBydGw4eHh4dV9pbml0X2xsdF90YWJsZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwgdTggbGFzdF90eF9wYWdlKTsKK2ludCBydGw4eHh4dV9pbml0X2xsdF90YWJsZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiB2b2lkIHJ0bDh4eHh1X2dlbjFfcGh5X2lxX2NhbGlicmF0ZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdik7CiB2b2lkIHJ0bDh4eHh1X2dlbjFfaW5pdF9waHlfYmIoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpOwogdm9pZCBydGw4eHh4dV9nZW4xX3NldF90eF9wb3dlcihzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwKQEAgLTE0MjEsNiArMTQzNCwxNCBAQAogaW50IHJ0bDh4eHh1X2dlbjJfY2hhbm5lbF90b19ncm91cChpbnQgY2hhbm5lbCk7CiBib29sIHJ0bDh4eHh1X2dlbjJfc2ltdWxhcml0eV9jb21wYXJlKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LAogCQkJCSAgICAgIGludCByZXN1bHRbXVs4XSwgaW50IGMxLCBpbnQgYzIpOwordm9pZCBydGw4eHh4dV9maWxsX3R4ZGVzY192MShzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICBzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjMzIgKnR4X2Rlc2MsIHUzMiByYXRlLAorCQkJICAgICB1MTYgcmF0ZV9mbGFnLCBib29sIHNnaSwgYm9vbCBzaG9ydF9wcmVhbWJsZSwKKwkJCSAgICAgYm9vbCBhbXBkdV9lbmFibGUpOwordm9pZCBydGw4eHh4dV9maWxsX3R4ZGVzY192MihzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICBzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjMzIgKnR4X2Rlc2MzMiwgdTMyIHJhdGUsCisJCQkgICAgIHUxNiByYXRlX2ZsYWcsIGJvb2wgc2dpLCBib29sIHNob3J0X3ByZWFtYmxlLAorCQkJICAgICBib29sIGFtcGR1X2VuYWJsZSk7CiAKIGV4dGVybiBzdHJ1Y3QgcnRsOHh4eHVfZmlsZW9wcyBydGw4MTkyY3VfZm9wczsKIGV4dGVybiBzdHJ1Y3QgcnRsOHh4eHVfZmlsZW9wcyBydGw4MTkyZXVfZm9wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODE5MmMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODE5MmMuYwppbmRleCA2OWQxYTE0Li5mOWUyMDUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1XzgxOTJjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84MTkyYy5jCkBAIC01NjcsNiArNTY3LDcgQEAKIAkuc2V0X3R4X3Bvd2VyID0gcnRsOHh4eHVfZ2VuMV9zZXRfdHhfcG93ZXIsCiAJLnVwZGF0ZV9yYXRlX21hc2sgPSBydGw4eHh4dV91cGRhdGVfcmF0ZV9tYXNrLAogCS5yZXBvcnRfY29ubmVjdCA9IHJ0bDh4eHh1X2dlbjFfcmVwb3J0X2Nvbm5lY3QsCisJLmZpbGxfdHhkZXNjID0gcnRsOHh4eHVfZmlsbF90eGRlc2NfdjEsCiAJLndyaXRlTl9ibG9ja19zaXplID0gMTI4LAogCS5yeF9hZ2dfYnVmX3NpemUgPSAxNjAwMCwKIAkudHhfZGVzY19zaXplID0gc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV90eGRlc2MzMiksCkBAIC01NzksNSArNTgwLDkgQEAKIAkucGJwX3J4ID0gUEJQX1BBR0VfU0laRV8xMjgsCiAJLnBicF90eCA9IFBCUF9QQUdFX1NJWkVfMTI4LAogCS5tYWN0YWJsZSA9IHJ0bDh4eHh1X2dlbjFfbWFjX2luaXRfdGFibGUsCisJLnRvdGFsX3BhZ2VfbnVtID0gVFhfVE9UQUxfUEFHRV9OVU0sCisJLnBhZ2VfbnVtX2hpID0gVFhfUEFHRV9OVU1fSElfUFEsCisJLnBhZ2VfbnVtX2xvID0gVFhfUEFHRV9OVU1fTE9fUFEsCisJLnBhZ2VfbnVtX25vcm0gPSBUWF9QQUdFX05VTV9OT1JNX1BRLAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84MTkyZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84MTkyZS5jCmluZGV4IDlhMTk5NGYuLmRmNTRkMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODE5MmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1XzgxOTJlLmMKQEAgLTEzOTYsNiArMTM5NiwxMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IHJ0bDgxOTJldV9hY3RpdmVfdG9fbHBzKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwcml2LT51ZGV2LT5kZXY7CisJdTggdmFsODsKKwl1MTYgdmFsMTY7CisJdTMyIHZhbDMyOworCWludCByZXRyeSwgcmV0dmFsOworCisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19UWFBBVVNFLCAweGZmKTsKKworCXJldHJ5ID0gMTAwOworCXJldHZhbCA9IC1FQlVTWTsKKwkvKgorCSAqIFBvbGwgMzIgYml0IHdpZGUgMHgwNWY4IGZvciAweDAwMDAwMDAwIHRvIGVuc3VyZSBubyBUWCBpcyBwZW5kaW5nLgorCSAqLworCWRvIHsKKwkJdmFsMzIgPSBydGw4eHh4dV9yZWFkMzIocHJpdiwgUkVHX1NDSF9UWF9DTUQpOworCQlpZiAoIXZhbDMyKSB7CisJCQlyZXR2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChyZXRyeS0tKTsKKworCWlmICghcmV0cnkpIHsKKwkJZGV2X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGZsdXNoIFRYIHF1ZXVlXG4iKTsKKwkJcmV0dmFsID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBEaXNhYmxlIENDSyBhbmQgT0ZETSwgY2xvY2sgZ2F0ZWQgKi8KKwl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX1NZU19GVU5DKTsKKwl2YWw4ICY9IH5TWVNfRlVOQ19CQlJTVEI7CisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19TWVNfRlVOQywgdmFsOCk7CisKKwl1ZGVsYXkoMik7CisKKwkvKiBSZXNldCB3aG9sZSBCQiAqLworCXZhbDggPSBydGw4eHh4dV9yZWFkOChwcml2LCBSRUdfU1lTX0ZVTkMpOworCXZhbDggJj0gflNZU19GVU5DX0JCX0dMQl9SU1ROOworCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfU1lTX0ZVTkMsIHZhbDgpOworCisJLyogUmVzZXQgTUFDIFRSWCAqLworCXZhbDE2ID0gcnRsOHh4eHVfcmVhZDE2KHByaXYsIFJFR19DUik7CisJdmFsMTYgJj0gMHhmZjAwOworCXZhbDE2IHw9IChDUl9IQ0lfVFhETUFfRU5BQkxFIHwgQ1JfSENJX1JYRE1BX0VOQUJMRSk7CisJcnRsOHh4eHVfd3JpdGUxNihwcml2LCBSRUdfQ1IsIHZhbDE2KTsKKworCXZhbDE2ID0gcnRsOHh4eHVfcmVhZDE2KHByaXYsIFJFR19DUik7CisJdmFsMTYgJj0gfkNSX1NFQ1VSSVRZX0VOQUJMRTsKKwlydGw4eHh4dV93cml0ZTE2KHByaXYsIFJFR19DUiwgdmFsMTYpOworCisJdmFsOCA9IHJ0bDh4eHh1X3JlYWQ4KHByaXYsIFJFR19EVUFMX1RTRl9SU1QpOworCXZhbDggfD0gRFVBTF9UU0ZfVFhfT0s7CisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19EVUFMX1RTRl9SU1QsIHZhbDgpOworCitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBydGw4MTkyZXVfYWN0aXZlX3RvX2VtdShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdikKK3sKKwl1OCB2YWw4OworCWludCBjb3VudCwgcmV0ID0gMDsKKworCS8qIFR1cm4gb2ZmIFJGICovCisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19SRl9DVFJMLCAwKTsKKworCS8qIFN3aXRjaCBEUERUX1NFTF9QIG91dHB1dCBmcm9tIHJlZ2lzdGVyIDB4NjVbMl0gKi8KKwl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX0xFRENGRzIpOworCXZhbDggJj0gfkxFRENGRzJfRFBEVF9TRUxFQ1Q7CisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19MRURDRkcyLCB2YWw4KTsKKworCS8qIDB4MDAwNVsxXSA9IDEgdHVybiBvZmYgTUFDIGJ5IEhXIHN0YXRlIG1hY2hpbmUqLworCXZhbDggPSBydGw4eHh4dV9yZWFkOChwcml2LCBSRUdfQVBTX0ZTTUNPICsgMSk7CisJdmFsOCB8PSBCSVQoMSk7CisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19BUFNfRlNNQ08gKyAxLCB2YWw4KTsKKworCWZvciAoY291bnQgPSBSVEw4WFhYVV9NQVhfUkVHX1BPTEw7IGNvdW50OyBjb3VudC0tKSB7CisJCXZhbDggPSBydGw4eHh4dV9yZWFkOChwcml2LCBSRUdfQVBTX0ZTTUNPICsgMSk7CisJCWlmICgodmFsOCAmIEJJVCgxKSkgPT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKworCWlmICghY291bnQpIHsKKwkJZGV2X3dhcm4oJnByaXYtPnVkZXYtPmRldiwgIiVzOiBEaXNhYmxpbmcgTUFDIHRpbWVkIG91dFxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBleGl0OworCX0KKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0bDgxOTJldV9lbXVfdG9fZGlzYWJsZWQoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpCit7CisJdTggdmFsODsKKworCS8qIDB4MDRbMTI6MTFdID0gMDEgZW5hYmxlIFdMIHN1c3BlbmQgKi8KKwl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX0FQU19GU01DTyArIDEpOworCXZhbDggJj0gfihCSVQoMykgfCBCSVQoNCkpOworCXZhbDggfD0gQklUKDMpOworCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfQVBTX0ZTTUNPICsgMSwgdmFsOCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBydGw4MTkyZXVfcG93ZXJfb24oc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpCiB7CiAJdTE2IHZhbDE2OwpAQCAtMTQ0Niw2ICsxNTU0LDQwIEBACiAJcmV0dXJuIHJldDsKIH0KIAordm9pZCBydGw4MTkyZXVfcG93ZXJfb2ZmKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KQoreworCXU4IHZhbDg7CisJdTE2IHZhbDE2OworCisJcnRsOHh4eHVfZmx1c2hfZmlmbyhwcml2KTsKKworCXZhbDggPSBydGw4eHh4dV9yZWFkOChwcml2LCBSRUdfVFhfUkVQT1JUX0NUUkwpOworCXZhbDggJj0gflRYX1JFUE9SVF9DVFJMX1RJTUVSX0VOQUJMRTsKKwlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX1RYX1JFUE9SVF9DVFJMLCB2YWw4KTsKKworCS8qIFR1cm4gb2ZmIFJGICovCisJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19SRl9DVFJMLCAweDAwKTsKKworCXJ0bDgxOTJldV9hY3RpdmVfdG9fbHBzKHByaXYpOworCisJLyogUmVzZXQgRmlybXdhcmUgaWYgcnVubmluZyBpbiBSQU0gKi8KKwlpZiAocnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX01DVV9GV19ETCkgJiBNQ1VfRldfUkFNX1NFTCkKKwkJcnRsOHh4eHVfZmlybXdhcmVfc2VsZl9yZXNldChwcml2KTsKKworCS8qIFJlc2V0IE1DVSAqLworCXZhbDE2ID0gcnRsOHh4eHVfcmVhZDE2KHByaXYsIFJFR19TWVNfRlVOQyk7CisJdmFsMTYgJj0gflNZU19GVU5DX0NQVV9FTkFCTEU7CisJcnRsOHh4eHVfd3JpdGUxNihwcml2LCBSRUdfU1lTX0ZVTkMsIHZhbDE2KTsKKworCS8qIFJlc2V0IE1DVSByZWFkeSBzdGF0dXMgKi8KKwlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX01DVV9GV19ETCwgMHgwMCk7CisKKwlydGw4eHh4dV9yZXNldF84MDUxKHByaXYpOworCisJcnRsODE5MmV1X2FjdGl2ZV90b19lbXUocHJpdik7CisJcnRsODE5MmV1X2VtdV90b19kaXNhYmxlZChwcml2KTsKK30KKwogc3RhdGljIHZvaWQgcnRsODE5MmVfZW5hYmxlX3JmKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KQogewogCXUzMiB2YWwzMjsKQEAgLTE0ODcsNyArMTYyOSw3IEBACiAJLnBhcnNlX2VmdXNlID0gcnRsODE5MmV1X3BhcnNlX2VmdXNlLAogCS5sb2FkX2Zpcm13YXJlID0gcnRsODE5MmV1X2xvYWRfZmlybXdhcmUsCiAJLnBvd2VyX29uID0gcnRsODE5MmV1X3Bvd2VyX29uLAotCS5wb3dlcl9vZmYgPSBydGw4eHh4dV9wb3dlcl9vZmYsCisJLnBvd2VyX29mZiA9IHJ0bDgxOTJldV9wb3dlcl9vZmYsCiAJLnJlc2V0XzgwNTEgPSBydGw4eHh4dV9yZXNldF84MDUxLAogCS5sbHRfaW5pdCA9IHJ0bDh4eHh1X2F1dG9fbGx0X3RhYmxlLAogCS5pbml0X3BoeV9iYiA9IHJ0bDgxOTJldV9pbml0X3BoeV9iYiwKQEAgLTE1MDEsMTAgKzE2NDMsMTIgQEAKIAkuc2V0X3R4X3Bvd2VyID0gcnRsODE5MmVfc2V0X3R4X3Bvd2VyLAogCS51cGRhdGVfcmF0ZV9tYXNrID0gcnRsOHh4eHVfZ2VuMl91cGRhdGVfcmF0ZV9tYXNrLAogCS5yZXBvcnRfY29ubmVjdCA9IHJ0bDh4eHh1X2dlbjJfcmVwb3J0X2Nvbm5lY3QsCisJLmZpbGxfdHhkZXNjID0gcnRsOHh4eHVfZmlsbF90eGRlc2NfdjIsCiAJLndyaXRlTl9ibG9ja19zaXplID0gMTI4LAogCS50eF9kZXNjX3NpemUgPSBzaXplb2Yoc3RydWN0IHJ0bDh4eHh1X3R4ZGVzYzQwKSwKIAkucnhfZGVzY19zaXplID0gc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV9yeGRlc2MyNCksCiAJLmhhc19zMHMxID0gMCwKKwkuZ2VuMl90aGVybWFsX21ldGVyID0gMSwKIAkuYWRkYV8xdF9pbml0ID0gMHgwZmMwMTYxNiwKIAkuYWRkYV8xdF9wYXRoX29uID0gMHgwZmMwMTYxNiwKIAkuYWRkYV8ydF9wYXRoX29uX2EgPSAweDBmYzAxNjE2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84NzIzYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84NzIzYS5jCmluZGV4IDY4NmM1NTEuLmFlZjM3MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODcyM2EuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1Xzg3MjNhLmMKQEAgLTM4NCw2ICszODQsNyBAQAogCS5zZXRfdHhfcG93ZXIgPSBydGw4eHh4dV9nZW4xX3NldF90eF9wb3dlciwKIAkudXBkYXRlX3JhdGVfbWFzayA9IHJ0bDh4eHh1X3VwZGF0ZV9yYXRlX21hc2ssCiAJLnJlcG9ydF9jb25uZWN0ID0gcnRsOHh4eHVfZ2VuMV9yZXBvcnRfY29ubmVjdCwKKwkuZmlsbF90eGRlc2MgPSBydGw4eHh4dV9maWxsX3R4ZGVzY192MSwKIAkud3JpdGVOX2Jsb2NrX3NpemUgPSAxMDI0LAogCS5yeF9hZ2dfYnVmX3NpemUgPSAxNjAwMCwKIAkudHhfZGVzY19zaXplID0gc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV90eGRlc2MzMiksCkBAIC0zOTYsNCArMzk3LDggQEAKIAkucGJwX3J4ID0gUEJQX1BBR0VfU0laRV8xMjgsCiAJLnBicF90eCA9IFBCUF9QQUdFX1NJWkVfMTI4LAogCS5tYWN0YWJsZSA9IHJ0bDh4eHh1X2dlbjFfbWFjX2luaXRfdGFibGUsCisJLnRvdGFsX3BhZ2VfbnVtID0gVFhfVE9UQUxfUEFHRV9OVU0sCisJLnBhZ2VfbnVtX2hpID0gVFhfUEFHRV9OVU1fSElfUFEsCisJLnBhZ2VfbnVtX2xvID0gVFhfUEFHRV9OVU1fTE9fUFEsCisJLnBhZ2VfbnVtX25vcm0gPSBUWF9QQUdFX05VTV9OT1JNX1BRLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODcyM2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfODcyM2IuYwppbmRleCA5ZDQ1YWZiLi42YzA4NmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1Xzg3MjNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV84NzIzYi5jCkBAIC0xNjYyLDEwICsxNjYyLDEzIEBACiAJLnNldF90eF9wb3dlciA9IHJ0bDg3MjNiX3NldF90eF9wb3dlciwKIAkudXBkYXRlX3JhdGVfbWFzayA9IHJ0bDh4eHh1X2dlbjJfdXBkYXRlX3JhdGVfbWFzaywKIAkucmVwb3J0X2Nvbm5lY3QgPSBydGw4eHh4dV9nZW4yX3JlcG9ydF9jb25uZWN0LAorCS5maWxsX3R4ZGVzYyA9IHJ0bDh4eHh1X2ZpbGxfdHhkZXNjX3YyLAogCS53cml0ZU5fYmxvY2tfc2l6ZSA9IDEwMjQsCiAJLnR4X2Rlc2Nfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjNDApLAogCS5yeF9kZXNjX3NpemUgPSBzaXplb2Yoc3RydWN0IHJ0bDh4eHh1X3J4ZGVzYzI0KSwKIAkuaGFzX3MwczEgPSAxLAorCS5oYXNfdHhfcmVwb3J0ID0gMSwKKwkuZ2VuMl90aGVybWFsX21ldGVyID0gMSwKIAkuYWRkYV8xdF9pbml0ID0gMHgwMWMwMDAxNCwKIAkuYWRkYV8xdF9wYXRoX29uID0gMHgwMWMwMDAxNCwKIAkuYWRkYV8ydF9wYXRoX29uX2EgPSAweDAxYzAwMDE0LApAQCAtMTY3NCw0ICsxNjc3LDggQEAKIAkucGJwX3J4ID0gUEJQX1BBR0VfU0laRV8yNTYsCiAJLnBicF90eCA9IFBCUF9QQUdFX1NJWkVfMjU2LAogCS5tYWN0YWJsZSA9IHJ0bDg3MjNiX21hY19pbml0X3RhYmxlLAorCS50b3RhbF9wYWdlX251bSA9IFRYX1RPVEFMX1BBR0VfTlVNXzg3MjNCLAorCS5wYWdlX251bV9oaSA9IFRYX1BBR0VfTlVNX0hJX1BRXzg3MjNCLAorCS5wYWdlX251bV9sbyA9IFRYX1BBR0VfTlVNX0xPX1BRXzg3MjNCLAorCS5wYWdlX251bV9ub3JtID0gVFhfUEFHRV9OVU1fTk9STV9QUV84NzIzQiwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1L3J0bDh4eHh1X2NvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfY29yZS5jCmluZGV4IDc3MDQ4ZGIuLmIyZDdmNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfY29yZS5jCkBAIC04OTQsNyArODk0LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIHJ0bDh4eHh1X2dlbjFfaDJjX2NtZChzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwgc3RydWN0IGgyY19jbWQgKmgyYywgaW50IGxlbikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+dWRldi0+ZGV2OwpAQCAtMjQ3MiwxMCArMjQ3MiwxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBydGw4eHh4dV9pbml0X2xsdF90YWJsZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiwgdTggbGFzdF90eF9wYWdlKQoraW50IHJ0bDh4eHh1X2luaXRfbGx0X3RhYmxlKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2KQogewogCWludCByZXQ7CiAJaW50IGk7CisJdTggbGFzdF90eF9wYWdlOworCisJbGFzdF90eF9wYWdlID0gcHJpdi0+Zm9wcy0+dG90YWxfcGFnZV9udW07CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGFzdF90eF9wYWdlOyBpKyspIHsKIAkJcmV0ID0gcnRsOHh4eHVfbGx0X3dyaXRlKHByaXYsIGksIGkgKyAxKTsKQEAgLTI1MDMsNyArMjUwNiw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHJ0bDh4eHh1X2F1dG9fbGx0X3RhYmxlKHN0cnVjdCBydGw4eHh4dV9wcml2ICpwcml2LCB1OCBsYXN0X3R4X3BhZ2UpCitpbnQgcnRsOHh4eHVfYXV0b19sbHRfdGFibGUoc3RydWN0IHJ0bDh4eHh1X3ByaXYgKnByaXYpCiB7CiAJdTMyIHZhbDMyOwogCWludCByZXQgPSAwOwpAQCAtMzg0NywyOCArMzg1MCw2IEBACiAJcnRsOHh4eHVfd3JpdGUzMihwcml2LCBSRUdfUlhfV0FJVF9DQ0EsIHZhbDMyKTsKIH0KIAotc3RhdGljIHZvaWQgcnRsOHh4eHVfb2xkX2luaXRfcXVldWVfcmVzZXJ2ZWRfcGFnZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdikKLXsKLQl1OCB2YWw4OwotCXUzMiB2YWwzMjsKLQotCWlmIChwcml2LT5lcF90eF9ub3JtYWxfcXVldWUpCi0JCXZhbDggPSBUWF9QQUdFX05VTV9OT1JNX1BROwotCWVsc2UKLQkJdmFsOCA9IDA7Ci0KLQlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX1JRUE5fTlBRLCB2YWw4KTsKLQotCXZhbDMyID0gKFRYX1BBR0VfTlVNX1BVQlEgPDwgUlFQTl9QVUJfUFFfU0hJRlQpIHwgUlFQTl9MT0FEOwotCi0JaWYgKHByaXYtPmVwX3R4X2hpZ2hfcXVldWUpCi0JCXZhbDMyIHw9IChUWF9QQUdFX05VTV9ISV9QUSA8PCBSUVBOX0hJX1BRX1NISUZUKTsKLQlpZiAocHJpdi0+ZXBfdHhfbG93X3F1ZXVlKQotCQl2YWwzMiB8PSAoVFhfUEFHRV9OVU1fTE9fUFEgPDwgUlFQTl9MT19QUV9TSElGVCk7Ci0KLQlydGw4eHh4dV93cml0ZTMyKHByaXYsIFJFR19SUVBOLCB2YWwzMik7Ci19Ci0KIHN0YXRpYyB2b2lkIHJ0bDh4eHh1X2luaXRfcXVldWVfcmVzZXJ2ZWRfcGFnZShzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgcnRsOHh4eHVfZmlsZW9wcyAqZm9wcyA9IHByaXYtPmZvcHM7CkBAIC0zODkxLDcgKzM4NzIsNyBAQAogCXZhbDMyID0gKG5xIDw8IFJRUE5fTlBRX1NISUZUKSB8IChlcSA8PCBSUVBOX0VQUV9TSElGVCk7CiAJcnRsOHh4eHVfd3JpdGUzMihwcml2LCBSRUdfUlFQTl9OUFEsIHZhbDMyKTsKIAotCXB1YnEgPSBmb3BzLT50b3RhbF9wYWdlX251bSAtIGhxIC0gbHEgLSBucTsKKwlwdWJxID0gZm9wcy0+dG90YWxfcGFnZV9udW0gLSBocSAtIGxxIC0gbnEgLSAxOwogCiAJdmFsMzIgPSBSUVBOX0xPQUQ7CiAJdmFsMzIgfD0gKGhxIDw8IFJRUE5fSElfUFFfU0hJRlQpOwpAQCAtMzkwNSw2ICszODg2LDcgQEAKIHsKIAlzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwcml2LT51ZGV2LT5kZXY7CisJc3RydWN0IHJ0bDh4eHh1X2ZpbGVvcHMgKmZvcHMgPSBwcml2LT5mb3BzOwogCWJvb2wgbWFjcG93ZXI7CiAJaW50IHJldDsKIAl1OCB2YWw4OwpAQCAtMzkyMywxOCArMzkwNSwxNCBAQAogCWVsc2UKIAkJbWFjcG93ZXIgPSB0cnVlOwogCi0JcmV0ID0gcHJpdi0+Zm9wcy0+cG93ZXJfb24ocHJpdik7CisJcmV0ID0gZm9wcy0+cG93ZXJfb24ocHJpdik7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X3dhcm4oZGV2LCAiJXM6IEZhaWxlZCBwb3dlciBvblxuIiwgX19mdW5jX18pOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JaWYgKCFtYWNwb3dlcikgewotCQlpZiAocHJpdi0+Zm9wcy0+dG90YWxfcGFnZV9udW0pCi0JCQlydGw4eHh4dV9pbml0X3F1ZXVlX3Jlc2VydmVkX3BhZ2UocHJpdik7Ci0JCWVsc2UKLQkJCXJ0bDh4eHh1X29sZF9pbml0X3F1ZXVlX3Jlc2VydmVkX3BhZ2UocHJpdik7Ci0JfQorCWlmICghbWFjcG93ZXIpCisJCXJ0bDh4eHh1X2luaXRfcXVldWVfcmVzZXJ2ZWRfcGFnZShwcml2KTsKIAogCXJldCA9IHJ0bDh4eHh1X2luaXRfcXVldWVfcHJpb3JpdHkocHJpdik7CiAJZGV2X2RiZyhkZXYsICIlczogaW5pdF9xdWV1ZV9wcmlvcml0eSAlaVxuIiwgX19mdW5jX18sIHJldCk7CkBAIC0zOTQ0LDE5ICszOTIyLDE5IEBACiAJLyoKIAkgKiBTZXQgUlggcGFnZSBib3VuZGFyeQogCSAqLwotCXJ0bDh4eHh1X3dyaXRlMTYocHJpdiwgUkVHX1RSWEZGX0JORFkgKyAyLCBwcml2LT5mb3BzLT50cnhmZl9ib3VuZGFyeSk7CisJcnRsOHh4eHVfd3JpdGUxNihwcml2LCBSRUdfVFJYRkZfQk5EWSArIDIsIGZvcHMtPnRyeGZmX2JvdW5kYXJ5KTsKIAogCXJldCA9IHJ0bDh4eHh1X2Rvd25sb2FkX2Zpcm13YXJlKHByaXYpOwotCWRldl9kYmcoZGV2LCAiJXM6IGRvd25sb2FkX2Zpd21hcmUgJWlcbiIsIF9fZnVuY19fLCByZXQpOworCWRldl9kYmcoZGV2LCAiJXM6IGRvd25sb2FkX2Zpcm13YXJlICVpXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAJcmV0ID0gcnRsOHh4eHVfc3RhcnRfZmlybXdhcmUocHJpdik7Ci0JZGV2X2RiZyhkZXYsICIlczogc3RhcnRfZml3bWFyZSAlaVxuIiwgX19mdW5jX18sIHJldCk7CisJZGV2X2RiZyhkZXYsICIlczogc3RhcnRfZmlybXdhcmUgJWlcbiIsIF9fZnVuY19fLCByZXQpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIAotCWlmIChwcml2LT5mb3BzLT5waHlfaW5pdF9hbnRlbm5hX3NlbGVjdGlvbikKLQkJcHJpdi0+Zm9wcy0+cGh5X2luaXRfYW50ZW5uYV9zZWxlY3Rpb24ocHJpdik7CisJaWYgKGZvcHMtPnBoeV9pbml0X2FudGVubmFfc2VsZWN0aW9uKQorCQlmb3BzLT5waHlfaW5pdF9hbnRlbm5hX3NlbGVjdGlvbihwcml2KTsKIAogCXJldCA9IHJ0bDh4eHh1X2luaXRfbWFjKHByaXYpOwogCkBAIC0zOTY5LDcgKzM5NDcsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIAotCXJldCA9IHByaXYtPmZvcHMtPmluaXRfcGh5X3JmKHByaXYpOworCXJldCA9IGZvcHMtPmluaXRfcGh5X3JmKHByaXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKIApAQCAtMzk5NCwxMyArMzk3Miw3IEBACiAJCS8qCiAJCSAqIFNldCBUWCBidWZmZXIgYm91bmRhcnkKIAkJICovCi0JCWlmIChwcml2LT5ydGxfY2hpcCA9PSBSVEw4MTkyRSkKLQkJCXZhbDggPSBUWF9UT1RBTF9QQUdFX05VTV84MTkyRSArIDE7Ci0JCWVsc2UKLQkJCXZhbDggPSBUWF9UT1RBTF9QQUdFX05VTSArIDE7Ci0KLQkJaWYgKHByaXYtPnJ0bF9jaGlwID09IFJUTDg3MjNCKQotCQkJdmFsOCAtPSAxOworCQl2YWw4ID0gZm9wcy0+dG90YWxfcGFnZV9udW0gKyAxOwogCiAJCXJ0bDh4eHh1X3dyaXRlOChwcml2LCBSRUdfVFhQS1RCVUZfQkNOUV9CRE5ZLCB2YWw4KTsKIAkJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19UWFBLVEJVRl9NR1FfQkROWSwgdmFsOCk7CkBAIC00MDEzLDE0ICszOTg1LDE0IEBACiAJICogVGhlIHZlbmRvciBkcml2ZXJzIHNldCBQQlAgZm9yIGFsbCBkZXZpY2VzLCBleGNlcHQgODE5MmUuCiAJICogVGhlcmUgaXMgbm8gZXhwbGFuYXRpb24gZm9yIHRoaXMgaW4gYW55IG9mIHRoZSBzb3VyY2VzLgogCSAqLwotCXZhbDggPSAocHJpdi0+Zm9wcy0+cGJwX3J4IDw8IFBCUF9QQUdFX1NJWkVfUlhfU0hJRlQpIHwKLQkJKHByaXYtPmZvcHMtPnBicF90eCA8PCBQQlBfUEFHRV9TSVpFX1RYX1NISUZUKTsKKwl2YWw4ID0gKGZvcHMtPnBicF9yeCA8PCBQQlBfUEFHRV9TSVpFX1JYX1NISUZUKSB8CisJCShmb3BzLT5wYnBfdHggPDwgUEJQX1BBR0VfU0laRV9UWF9TSElGVCk7CiAJaWYgKHByaXYtPnJ0bF9jaGlwICE9IFJUTDgxOTJFKQogCQlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX1BCUCwgdmFsOCk7CiAKIAlkZXZfZGJnKGRldiwgIiVzOiBtYWNwb3dlciAlaVxuIiwgX19mdW5jX18sIG1hY3Bvd2VyKTsKIAlpZiAoIW1hY3Bvd2VyKSB7Ci0JCXJldCA9IHByaXYtPmZvcHMtPmxsdF9pbml0KHByaXYsIFRYX1RPVEFMX1BBR0VfTlVNKTsKKwkJcmV0ID0gZm9wcy0+bGx0X2luaXQocHJpdik7CiAJCWlmIChyZXQpIHsKIAkJCWRldl93YXJuKGRldiwgIiVzOiBMTFQgdGFibGUgaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJCWdvdG8gZXhpdDsKQEAgLTQwMjksMTMgKzQwMDEsMTIgQEAKIAkJLyoKIAkJICogQ2hpcCBzcGVjaWZpYyBxdWlya3MKIAkJICovCi0JCXByaXYtPmZvcHMtPnVzYl9xdWlya3MocHJpdik7CisJCWZvcHMtPnVzYl9xdWlya3MocHJpdik7CiAKIAkJLyoKLQkJICogUHJlc3VtYWJseSB0aGlzIGlzIGZvciA4MTg4RVUgYXMgd2VsbAotCQkgKiBFbmFibGUgVFggcmVwb3J0IGFuZCBUWCByZXBvcnQgdGltZXIKKwkJICogRW5hYmxlIFRYIHJlcG9ydCBhbmQgVFggcmVwb3J0IHRpbWVyIGZvciA4NzIzYnUvODE4OGV1Ly4uLgogCQkgKi8KLQkJaWYgKHByaXYtPnJ0bF9jaGlwID09IFJUTDg3MjNCKSB7CisJCWlmIChmb3BzLT5oYXNfdHhfcmVwb3J0KSB7CiAJCQl2YWw4ID0gcnRsOHh4eHVfcmVhZDgocHJpdiwgUkVHX1RYX1JFUE9SVF9DVFJMKTsKIAkJCXZhbDggfD0gVFhfUkVQT1JUX0NUUkxfVElNRVJfRU5BQkxFOwogCQkJcnRsOHh4eHVfd3JpdGU4KHByaXYsIFJFR19UWF9SRVBPUlRfQ1RSTCwgdmFsOCk7CkBAIC00MTcwLDggKzQxNDEsOCBAQAogCQlydGw4eHh4dV93cml0ZTgocHJpdiwgUkVHX1JTVl9DVFJMLCB2YWw4KTsKIAl9CiAKLQlpZiAocHJpdi0+Zm9wcy0+aW5pdF9hZ2dyZWdhdGlvbikKLQkJcHJpdi0+Zm9wcy0+aW5pdF9hZ2dyZWdhdGlvbihwcml2KTsKKwlpZiAoZm9wcy0+aW5pdF9hZ2dyZWdhdGlvbikKKwkJZm9wcy0+aW5pdF9hZ2dyZWdhdGlvbihwcml2KTsKIAogCS8qCiAJICogRW5hYmxlIENDSyBhbmQgT0ZETSBibG9jawpAQCAtNDE4OCw3ICs0MTU5LDcgQEAKIAkvKgogCSAqIFN0YXJ0IG91dCB3aXRoIGRlZmF1bHQgcG93ZXIgbGV2ZWxzIGZvciBjaGFubmVsIDYsIDIwTUh6CiAJICovCi0JcHJpdi0+Zm9wcy0+c2V0X3R4X3Bvd2VyKHByaXYsIDEsIGZhbHNlKTsKKwlmb3BzLT5zZXRfdHhfcG93ZXIocHJpdiwgMSwgZmFsc2UpOwogCiAJLyogTGV0IHRoZSA4MDUxIHRha2UgY29udHJvbCBvZiBhbnRlbm5hIHNldHRpbmcgKi8KIAlpZiAocHJpdi0+cnRsX2NoaXAgIT0gUlRMODE5MkUpIHsKQEAgLTQyMDQsOCArNDE3NSw4IEBACiAKIAlydGw4eHh4dV93cml0ZTE2KHByaXYsIFJFR19GQVNUX0VEQ0FfQ1RSTCwgMCk7CiAKLQlpZiAocHJpdi0+Zm9wcy0+aW5pdF9zdGF0aXN0aWNzKQotCQlwcml2LT5mb3BzLT5pbml0X3N0YXRpc3RpY3MocHJpdik7CisJaWYgKGZvcHMtPmluaXRfc3RhdGlzdGljcykKKwkJZm9wcy0+aW5pdF9zdGF0aXN0aWNzKHByaXYpOwogCiAJaWYgKHByaXYtPnJ0bF9jaGlwID09IFJUTDgxOTJFKSB7CiAJCS8qCkBAIC00MjIzLDEyICs0MTk0LDEyIEBACiAKIAlydGw4NzIzYV9waHlfbGNfY2FsaWJyYXRlKHByaXYpOwogCi0JcHJpdi0+Zm9wcy0+cGh5X2lxX2NhbGlicmF0ZShwcml2KTsKKwlmb3BzLT5waHlfaXFfY2FsaWJyYXRlKHByaXYpOwogCiAJLyoKIAkgKiBUaGlzIHNob3VsZCBlbmFibGUgdGhlcm1hbCBtZXRlcgogCSAqLwotCWlmIChwcml2LT5mb3BzLT50eF9kZXNjX3NpemUgPT0gc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV90eGRlc2M0MCkpCisJaWYgKGZvcHMtPmdlbjJfdGhlcm1hbF9tZXRlcikKIAkJcnRsOHh4eHVfd3JpdGVfcmZyZWcocHJpdiwKIAkJCQkgICAgIFJGX0EsIFJGNjA1Ml9SRUdfVF9NRVRFUl84NzIzQiwgMHgzN2NmOCk7CiAJZWxzZQpAQCAtNDc4Myw2ICs0NzU0LDExMyBAQAogCX0KIH0KIAorLyoKKyAqIEZpbGwgaW4gdjEgKGdlbjEpIHNwZWNpZmljIFRYIGRlc2NyaXB0b3IgYml0cy4KKyAqIFRoaXMgZm9ybWF0IGlzIHVzZWQgb24gODE4OGN1LzgxOTJjdS84NzIzYXUKKyAqLwordm9pZAorcnRsOHh4eHVfZmlsbF90eGRlc2NfdjEoc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCXN0cnVjdCBydGw4eHh4dV90eGRlc2MzMiAqdHhfZGVzYywgdTMyIHJhdGUsCisJCQl1MTYgcmF0ZV9mbGFnLCBib29sIHNnaSwgYm9vbCBzaG9ydF9wcmVhbWJsZSwKKwkJCWJvb2wgYW1wZHVfZW5hYmxlKQoreworCXUxNiBzZXFfbnVtYmVyOworCisJc2VxX251bWJlciA9IElFRUU4MDIxMV9TRVFfVE9fU04obGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkpOworCisJdHhfZGVzYy0+dHhkdzUgPSBjcHVfdG9fbGUzMihyYXRlKTsKKworCWlmIChpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKQorCQl0eF9kZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMigweDAwMDFmZjAwKTsKKworCXR4X2Rlc2MtPnR4ZHczID0gY3B1X3RvX2xlMzIoKHUzMilzZXFfbnVtYmVyIDw8IFRYREVTQzMyX1NFUV9TSElGVCk7CisKKwlpZiAoYW1wZHVfZW5hYmxlKQorCQl0eF9kZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9BR0dfRU5BQkxFKTsKKwllbHNlCisJCXR4X2Rlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKFRYREVTQzMyX0FHR19CUkVBSyk7CisKKwlpZiAoaWVlZTgwMjExX2lzX21nbXQoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQl0eF9kZXNjLT50eGR3NSA9IGNwdV90b19sZTMyKHJhdGUpOworCQl0eF9kZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9VU0VfRFJJVkVSX1JBVEUpOworCQl0eF9kZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMig2IDw8IFRYREVTQzMyX1JFVFJZX0xJTUlUX1NISUZUKTsKKwkJdHhfZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoVFhERVNDMzJfUkVUUllfTElNSVRfRU5BQkxFKTsKKwl9CisKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpCisJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1FPUyk7CisKKwlpZiAoc2hvcnRfcHJlYW1ibGUpCisJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1NIT1JUX1BSRUFNQkxFKTsKKworCWlmIChzZ2kpCisJCXR4X2Rlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1NIT1JUX0dJKTsKKworCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1JUU19DVFMpIHsKKwkJLyoKKwkJICogVXNlIFJUUyByYXRlIDI0TSAtIGRvZXMgdGhlIG1hYzgwMjExIHRlbGwKKwkJICogdXMgd2hpY2ggdG8gdXNlPworCQkgKi8KKwkJdHhfZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoREVTQ19SQVRFXzI0TSA8PAorCQkJCQkgICAgICBUWERFU0MzMl9SVFNfUkFURV9TSElGVCk7CisJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1JUU19DVFNfRU5BQkxFKTsKKwkJdHhfZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoVFhERVNDMzJfSFdfUlRTX0VOQUJMRSk7CisJfQorfQorCisvKgorICogRmlsbCBpbiB2MiAoZ2VuMikgc3BlY2lmaWMgVFggZGVzY3JpcHRvciBiaXRzLgorICogVGhpcyBmb3JtYXQgaXMgdXNlZCBvbiA4MTkyZXUvODcyM2J1CisgKi8KK3ZvaWQKK3J0bDh4eHh1X2ZpbGxfdHhkZXNjX3YyKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQlzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjMzIgKnR4X2Rlc2MzMiwgdTMyIHJhdGUsCisJCQl1MTYgcmF0ZV9mbGFnLCBib29sIHNnaSwgYm9vbCBzaG9ydF9wcmVhbWJsZSwKKwkJCWJvb2wgYW1wZHVfZW5hYmxlKQoreworCXN0cnVjdCBydGw4eHh4dV90eGRlc2M0MCAqdHhfZGVzYzQwOworCXUxNiBzZXFfbnVtYmVyOworCisJdHhfZGVzYzQwID0gKHN0cnVjdCBydGw4eHh4dV90eGRlc2M0MCAqKXR4X2Rlc2MzMjsKKworCXNlcV9udW1iZXIgPSBJRUVFODAyMTFfU0VRX1RPX1NOKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpKTsKKworCXR4X2Rlc2M0MC0+dHhkdzQgPSBjcHVfdG9fbGUzMihyYXRlKTsKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQl0eF9kZXNjNDAtPnR4ZHc0IHw9IGNwdV90b19sZTMyKDB4MWYgPDwKKwkJCQkJCVRYREVTQzQwX0RBVEFfUkFURV9GQl9TSElGVCk7CisJfQorCisJdHhfZGVzYzQwLT50eGR3OSA9IGNwdV90b19sZTMyKCh1MzIpc2VxX251bWJlciA8PCBUWERFU0M0MF9TRVFfU0hJRlQpOworCisJaWYgKGFtcGR1X2VuYWJsZSkKKwkJdHhfZGVzYzQwLT50eGR3MiB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9BR0dfRU5BQkxFKTsKKwllbHNlCisJCXR4X2Rlc2M0MC0+dHhkdzIgfD0gY3B1X3RvX2xlMzIoVFhERVNDNDBfQUdHX0JSRUFLKTsKKworCWlmIChpZWVlODAyMTFfaXNfbWdtdChoZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCXR4X2Rlc2M0MC0+dHhkdzQgPSBjcHVfdG9fbGUzMihyYXRlKTsKKwkJdHhfZGVzYzQwLT50eGR3MyB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9VU0VfRFJJVkVSX1JBVEUpOworCQl0eF9kZXNjNDAtPnR4ZHc0IHw9CisJCQljcHVfdG9fbGUzMig2IDw8IFRYREVTQzQwX1JFVFJZX0xJTUlUX1NISUZUKTsKKwkJdHhfZGVzYzQwLT50eGR3NCB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9SRVRSWV9MSU1JVF9FTkFCTEUpOworCX0KKworCWlmIChzaG9ydF9wcmVhbWJsZSkKKwkJdHhfZGVzYzQwLT50eGR3NSB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9TSE9SVF9QUkVBTUJMRSk7CisKKwlpZiAocmF0ZV9mbGFnICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB7CisJCS8qCisJCSAqIFVzZSBSVFMgcmF0ZSAyNE0gLSBkb2VzIHRoZSBtYWM4MDIxMSB0ZWxsCisJCSAqIHVzIHdoaWNoIHRvIHVzZT8KKwkJICovCisJCXR4X2Rlc2M0MC0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoREVTQ19SQVRFXzI0TSA8PAorCQkJCQkJVFhERVNDNDBfUlRTX1JBVEVfU0hJRlQpOworCQl0eF9kZXNjNDAtPnR4ZHczIHw9IGNwdV90b19sZTMyKFRYREVTQzQwX1JUU19DVFNfRU5BQkxFKTsKKwkJdHhfZGVzYzQwLT50eGR3MyB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9IV19SVFNfRU5BQkxFKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHJ0bDh4eHh1X3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJc3RydWN0IGllZWU4MDIxMV90eF9jb250cm9sICpjb250cm9sLAogCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTQ3OTIsNyArNDg3MCw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9yYXRlICp0eF9yYXRlID0gaWVlZTgwMjExX2dldF90eF9yYXRlKGh3LCB0eF9pbmZvKTsKIAlzdHJ1Y3QgcnRsOHh4eHVfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwogCXN0cnVjdCBydGw4eHh4dV90eGRlc2MzMiAqdHhfZGVzYzsKLQlzdHJ1Y3QgcnRsOHh4eHVfdHhkZXNjNDAgKnR4X2Rlc2M0MDsKIAlzdHJ1Y3QgcnRsOHh4eHVfdHhfdXJiICp0eF91cmI7CiAJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHR4X2luZm8tPmNvbnRyb2wudmlmOwpAQCAtNDgwMyw3ICs0ODgwLDcgQEAKIAl1MTYgcmF0ZV9mbGFnID0gdHhfaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFnczsKIAlpbnQgdHhfZGVzY19zaXplID0gcHJpdi0+Zm9wcy0+dHhfZGVzY19zaXplOwogCWludCByZXQ7Ci0JYm9vbCB1c2VkZXNjNDAsIGFtcGR1X2VuYWJsZTsKKwlib29sIHVzZWRlc2M0MCwgYW1wZHVfZW5hYmxlLCBzZ2kgPSBmYWxzZSwgc2hvcnRfcHJlYW1ibGUgPSBmYWxzZTsKIAogCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IHR4X2Rlc2Nfc2l6ZSkgewogCQlkZXZfd2FybihkZXYsCkBAIC00ODgxLDEwNyArNDk1OCwyNiBAQAogCQl9CiAJfQogCi0JaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpCisJaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MgJiYKKwkgICAgIWllZWU4MDIxMV9pc19tZ210KGhkci0+ZnJhbWVfY29udHJvbCkpCiAJCXJhdGUgPSB0eF9pbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeCArIERFU0NfUkFURV9NQ1MwOwogCWVsc2UKIAkJcmF0ZSA9IHR4X3JhdGUtPmh3X3ZhbHVlOwogCisJaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSB8fAorCSAgICAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKKwkgICAgIHN0YSAmJiBzdGEtPmh0X2NhcC5jYXAgJgorCSAgICAgKElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjApKSkKKwkJc2dpID0gdHJ1ZTsKKworCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1NIT1JUX1BSRUFNQkxFIHx8CisJICAgIChzdGEgJiYgdmlmICYmIHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKSkKKwkJc2hvcnRfcHJlYW1ibGUgPSB0cnVlOworCiAJc2VxX251bWJlciA9IElFRUU4MDIxMV9TRVFfVE9fU04obGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkpOwotCWlmICghdXNlZGVzYzQwKSB7Ci0JCXR4X2Rlc2MtPnR4ZHc1ID0gY3B1X3RvX2xlMzIocmF0ZSk7CiAKLQkJaWYgKGllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCQl0eF9kZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMigweDAwMDFmZjAwKTsKLQotCQl0eF9kZXNjLT50eGR3MyA9Ci0JCQljcHVfdG9fbGUzMigodTMyKXNlcV9udW1iZXIgPDwgVFhERVNDMzJfU0VRX1NISUZUKTsKLQotCQlpZiAoYW1wZHVfZW5hYmxlKQotCQkJdHhfZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoVFhERVNDMzJfQUdHX0VOQUJMRSk7Ci0JCWVsc2UKLQkJCXR4X2Rlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKFRYREVTQzMyX0FHR19CUkVBSyk7Ci0KLQkJaWYgKGllZWU4MDIxMV9pc19tZ210KGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJCXR4X2Rlc2MtPnR4ZHc1ID0gY3B1X3RvX2xlMzIodHhfcmF0ZS0+aHdfdmFsdWUpOwotCQkJdHhfZGVzYy0+dHhkdzQgfD0KLQkJCQljcHVfdG9fbGUzMihUWERFU0MzMl9VU0VfRFJJVkVSX1JBVEUpOwotCQkJdHhfZGVzYy0+dHhkdzUgfD0KLQkJCQljcHVfdG9fbGUzMig2IDw8IFRYREVTQzMyX1JFVFJZX0xJTUlUX1NISUZUKTsKLQkJCXR4X2Rlc2MtPnR4ZHc1IHw9Ci0JCQkJY3B1X3RvX2xlMzIoVFhERVNDMzJfUkVUUllfTElNSVRfRU5BQkxFKTsKLQkJfQotCi0JCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1FPUyk7Ci0KLQkJaWYgKHJhdGVfZmxhZyAmIElFRUU4MDIxMV9UWF9SQ19VU0VfU0hPUlRfUFJFQU1CTEUgfHwKLQkJICAgIChzdGEgJiYgdmlmICYmIHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKSkKLQkJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX1NIT1JUX1BSRUFNQkxFKTsKLQotCQlpZiAocmF0ZV9mbGFnICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJIHx8Ci0JCSAgICAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKLQkJICAgICBzdGEgJiYgc3RhLT5odF9jYXAuY2FwICYKLQkJICAgICAoSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfCBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkpKSB7Ci0JCQl0eF9kZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMihUWERFU0MzMl9TSE9SVF9HSSk7Ci0JCX0KLQotCQlpZiAocmF0ZV9mbGFnICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB7Ci0JCQkvKgotCQkJICogVXNlIFJUUyByYXRlIDI0TSAtIGRvZXMgdGhlIG1hYzgwMjExIHRlbGwKLQkJCSAqIHVzIHdoaWNoIHRvIHVzZT8KLQkJCSAqLwotCQkJdHhfZGVzYy0+dHhkdzQgfD0KLQkJCQljcHVfdG9fbGUzMihERVNDX1JBVEVfMjRNIDw8Ci0JCQkJCSAgICBUWERFU0MzMl9SVFNfUkFURV9TSElGVCk7Ci0JCQl0eF9kZXNjLT50eGR3NCB8PQotCQkJCWNwdV90b19sZTMyKFRYREVTQzMyX1JUU19DVFNfRU5BQkxFKTsKLQkJCXR4X2Rlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKFRYREVTQzMyX0hXX1JUU19FTkFCTEUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJdHhfZGVzYzQwID0gKHN0cnVjdCBydGw4eHh4dV90eGRlc2M0MCAqKXR4X2Rlc2M7Ci0KLQkJdHhfZGVzYzQwLT50eGR3NCA9IGNwdV90b19sZTMyKHJhdGUpOwotCQlpZiAoaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQkJdHhfZGVzYy0+dHhkdzQgfD0KLQkJCQljcHVfdG9fbGUzMigweDFmIDw8Ci0JCQkJCSAgICBUWERFU0M0MF9EQVRBX1JBVEVfRkJfU0hJRlQpOwotCQl9Ci0KLQkJdHhfZGVzYzQwLT50eGR3OSA9Ci0JCQljcHVfdG9fbGUzMigodTMyKXNlcV9udW1iZXIgPDwgVFhERVNDNDBfU0VRX1NISUZUKTsKLQotCQlpZiAoYW1wZHVfZW5hYmxlKQotCQkJdHhfZGVzYzQwLT50eGR3MiB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9BR0dfRU5BQkxFKTsKLQkJZWxzZQotCQkJdHhfZGVzYzQwLT50eGR3MiB8PSBjcHVfdG9fbGUzMihUWERFU0M0MF9BR0dfQlJFQUspOwotCi0JCWlmIChpZWVlODAyMTFfaXNfbWdtdChoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCQl0eF9kZXNjNDAtPnR4ZHc0ID0gY3B1X3RvX2xlMzIodHhfcmF0ZS0+aHdfdmFsdWUpOwotCQkJdHhfZGVzYzQwLT50eGR3MyB8PQotCQkJCWNwdV90b19sZTMyKFRYREVTQzQwX1VTRV9EUklWRVJfUkFURSk7Ci0JCQl0eF9kZXNjNDAtPnR4ZHc0IHw9Ci0JCQkJY3B1X3RvX2xlMzIoNiA8PCBUWERFU0M0MF9SRVRSWV9MSU1JVF9TSElGVCk7Ci0JCQl0eF9kZXNjNDAtPnR4ZHc0IHw9Ci0JCQkJY3B1X3RvX2xlMzIoVFhERVNDNDBfUkVUUllfTElNSVRfRU5BQkxFKTsKLQkJfQotCi0JCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1NIT1JUX1BSRUFNQkxFIHx8Ci0JCSAgICAoc3RhICYmIHZpZiAmJiB2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkpCi0JCQl0eF9kZXNjNDAtPnR4ZHc1IHw9Ci0JCQkJY3B1X3RvX2xlMzIoVFhERVNDNDBfU0hPUlRfUFJFQU1CTEUpOwotCi0JCWlmIChyYXRlX2ZsYWcgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1JUU19DVFMpIHsKLQkJCS8qCi0JCQkgKiBVc2UgUlRTIHJhdGUgMjRNIC0gZG9lcyB0aGUgbWFjODAyMTEgdGVsbAotCQkJICogdXMgd2hpY2ggdG8gdXNlPwotCQkJICovCi0JCQl0eF9kZXNjLT50eGR3NCB8PQotCQkJCWNwdV90b19sZTMyKERFU0NfUkFURV8yNE0gPDwKLQkJCQkJICAgIFRYREVTQzQwX1JUU19SQVRFX1NISUZUKTsKLQkJCXR4X2Rlc2MtPnR4ZHczIHw9IGNwdV90b19sZTMyKFRYREVTQzQwX1JUU19DVFNfRU5BQkxFKTsKLQkJCXR4X2Rlc2MtPnR4ZHczIHw9IGNwdV90b19sZTMyKFRYREVTQzQwX0hXX1JUU19FTkFCTEUpOwotCQl9Ci0JfQorCXByaXYtPmZvcHMtPmZpbGxfdHhkZXNjKGhkciwgdHhfZGVzYywgcmF0ZSwgcmF0ZV9mbGFnLAorCQkJCXNnaSwgc2hvcnRfcHJlYW1ibGUsIGFtcGR1X2VuYWJsZSk7CiAKIAlydGw4eHh4dV9jYWxjX3R4X2Rlc2NfY3N1bSh0eF9kZXNjKTsKIApAQCAtNTM3OSw3ICs1Mzc1LDggQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+dWRldi0+ZGV2OwogCWludCByZXQ7CiAKLQlkZXZfZGJnKGRldiwgIiVzOiBzdGF0dXMgJWlcbiIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJaWYgKHJ0bDh4eHh1X2RlYnVnICYgUlRMOFhYWFVfREVCVUdfSU5URVJSVVBUKQorCQlkZXZfZGJnKGRldiwgIiVzOiBzdGF0dXMgJWlcbiIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJaWYgKHVyYi0+c3RhdHVzID09IDApIHsKIAkJdXNiX2FuY2hvcl91cmIodXJiLCAmcHJpdi0+aW50X2FuY2hvcik7CiAJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CkBAIC01NzA0LDcgKzU3MDEsNyBAQAogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVDoKLQkJZGV2X2luZm8oZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVFxuIiwgX19mdW5jX18pOworCQlkZXZfZGJnKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlRcbiIsIF9fZnVuY19fKTsKIAkJYW1wZHVfZmFjdG9yID0gc3RhLT5odF9jYXAuYW1wZHVfZmFjdG9yOwogCQlhbXBkdV9kZW5zaXR5ID0gc3RhLT5odF9jYXAuYW1wZHVfZGVuc2l0eTsKIAkJcnRsOHh4eHVfc2V0X2FtcGR1X2ZhY3Rvcihwcml2LCBhbXBkdV9mYWN0b3IpOwpAQCAtNTcxNCwyMSArNTcxMSwyMSBAQAogCQkJYW1wZHVfZmFjdG9yLCBhbXBkdV9kZW5zaXR5KTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUF9GTFVTSDoKLQkJZGV2X2luZm8oZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9kYmcoZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIXG4iLCBfX2Z1bmNfXyk7CiAJCXJ0bDh4eHh1X3NldF9hbXBkdV9mYWN0b3IocHJpdiwgMCk7CiAJCXJ0bDh4eHh1X3NldF9hbXBkdV9taW5fc3BhY2UocHJpdiwgMCk7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1BfRkxVU0hfQ09OVDoKLQkJZGV2X2luZm8oZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIX0NPTlRcbiIsCisJCWRldl9kYmcoZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIX0NPTlRcbiIsCiAJCQkgX19mdW5jX18pOwogCQlydGw4eHh4dV9zZXRfYW1wZHVfZmFjdG9yKHByaXYsIDApOwogCQlydGw4eHh4dV9zZXRfYW1wZHVfbWluX3NwYWNlKHByaXYsIDApOwogCQlicmVhazsKIAljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDoKLQkJZGV2X2luZm8oZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVFxuIiwgX19mdW5jX18pOworCQlkZXZfZGJnKGRldiwgIiVzOiBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlRcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUDoKLQkJZGV2X2luZm8oZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9kYmcoZGV2LCAiJXM6IElFRUU4MDIxMV9BTVBEVV9SWF9TVE9QXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtNTk0Nyw3ICs1OTQ0LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCWludCB1bnRlc3RlZCA9IDE7CiAKIAl1ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKQEAgLTU5NzEsNiArNTk2OCwxOCBAQAogCQlpZiAoaWQtPmlkUHJvZHVjdCA9PSAweDEwMDQpCiAJCQl1bnRlc3RlZCA9IDA7CiAJCWJyZWFrOworCWNhc2UgMHgyMGY0OgorCQlpZiAoaWQtPmlkUHJvZHVjdCA9PSAweDY0OGIpCisJCQl1bnRlc3RlZCA9IDA7CisJCWJyZWFrOworCWNhc2UgMHgyMDAxOgorCQlpZiAoaWQtPmlkUHJvZHVjdCA9PSAweDMzMDgpCisJCQl1bnRlc3RlZCA9IDA7CisJCWJyZWFrOworCWNhc2UgMHgyMzU3OgorCQlpZiAoaWQtPmlkUHJvZHVjdCA9PSAweDAxMDkpCisJCQl1bnRlc3RlZCA9IDA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTU5ODcsNiArNTk5Niw3IEBACiAJaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBydGw4eHh4dV9wcml2KSwgJnJ0bDh4eHh1X29wcyk7CiAJaWYgKCFodykgewogCQlyZXQgPSAtRU5PTUVNOworCQlwcml2ID0gTlVMTDsKIAkJZ290byBleGl0OwogCX0KIApAQCAtNjAzNSw2ICs2MDQ1LDggQEAKIAl9CiAKIAlyZXQgPSBydGw4eHh4dV9pbml0X2RldmljZShodyk7CisJaWYgKHJldCkKKwkJZ290byBleGl0OwogCiAJaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IDE7CiAJaHctPndpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSBJRUVFODAyMTFfTUFYX0RBVEFfTEVOOwpAQCAtNjA4NSw5ICs2MDk3LDIwIEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKKwlyZXR1cm4gMDsKKwogZXhpdDoKLQlpZiAocmV0IDwgMCkKLQkJdXNiX3B1dF9kZXYodWRldik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCisJaWYgKHByaXYpIHsKKwkJa2ZyZWUocHJpdi0+ZndfZGF0YSk7CisJCW11dGV4X2Rlc3Ryb3koJnByaXYtPnVzYl9idWZfbXV0ZXgpOworCQltdXRleF9kZXN0cm95KCZwcml2LT5oMmNfbXV0ZXgpOworCX0KKwl1c2JfcHV0X2Rldih1ZGV2KTsKKworCWllZWU4MDIxMV9mcmVlX2h3KGh3KTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYxMTEsNiArNjEzNCwxMSBAQAogCW11dGV4X2Rlc3Ryb3koJnByaXYtPnVzYl9idWZfbXV0ZXgpOwogCW11dGV4X2Rlc3Ryb3koJnByaXYtPmgyY19tdXRleCk7CiAKKwlpZiAocHJpdi0+dWRldi0+c3RhdGUgIT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKSB7CisJCWRldl9pbmZvKCZwcml2LT51ZGV2LT5kZXYsCisJCQkgIkRldmljZSBzdGlsbCBhdHRhY2hlZCwgdHJ5aW5nIHRvIHJlc2V0XG4iKTsKKwkJdXNiX3Jlc2V0X2RldmljZShwcml2LT51ZGV2KTsKKwl9CiAJdXNiX3B1dF9kZXYocHJpdi0+dWRldik7CiAJaWVlZTgwMjExX2ZyZWVfaHcoaHcpOwogfQpAQCAtNjEyNCw2ICs2MTUyLDkgQEAKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODcyM2F1X2ZvcHN9LAoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKFVTQl9WRU5ET1JfSURfUkVBTFRFSywgMHg4MThiLCAweGZmLCAweGZmLCAweGZmKSwKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmV1X2ZvcHN9LAorLyogVGVzdGVkIGJ5IE15Y2tlbCBIYWJldHMgKi8KK3tVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDIzNTcsIDB4MDEwOSwgMHhmZiwgMHhmZiwgMHhmZiksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDgxOTJldV9mb3BzfSwKIHtVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhVU0JfVkVORE9SX0lEX1JFQUxURUssIDB4YjcyMCwgMHhmZiwgMHhmZiwgMHhmZiksCiAJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDg3MjNidV9mb3BzfSwKICNpZmRlZiBDT05GSUdfUlRMOFhYWFVfVU5URVNURUQKQEAgLTYxNDAsNiArNjE3MSwxMiBAQAogLyogVGVzdGVkIGJ5IEFuZHJlYSBNZXJlbGxvICovCiB7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgwNTBkLCAweDEwMDQsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCisvKiBUZXN0ZWQgYnkgSm9jZWx5biBNYXllciAqLwore1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MjBmNCwgMHg2NDhiLCAweGZmLCAweGZmLCAweGZmKSwKKwkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAorLyogVGVzdGVkIGJ5IFN0ZWZhbm8gQnJhdmkgKi8KK3tVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTygweDIwMDEsIDB4MzMwOCwgMHhmZiwgMHhmZiwgMHhmZiksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpJnJ0bDgxOTJjdV9mb3BzfSwKIC8qIEN1cnJlbnRseSB1bnRlc3RlZCA4MTg4IHNlcmllcyBkZXZpY2VzICovCiB7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oVVNCX1ZFTkRPUl9JRF9SRUFMVEVLLCAweDgxOTEsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCkBAIC02MTg3LDggKzYyMjQsNiBAQAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCiB7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgxM2QzLCAweDMzNTcsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCi17VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgyMDAxLCAweDMzMDgsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCiB7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgyMDAxLCAweDMzMGIsIDB4ZmYsIDB4ZmYsIDB4ZmYpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSZydGw4MTkyY3VfZm9wc30sCiB7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgyMDE5LCAweDQ5MDIsIDB4ZmYsIDB4ZmYsIDB4ZmYpLApAQCAtNjE5OSw4ICs2MjM0LDYgQEAKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MjAxOSwgMHhlZDE3LCAweGZmLCAweGZmLCAweGZmKSwKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAote1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MjBmNCwgMHg2NDhiLCAweGZmLCAweGZmLCAweGZmKSwKLQkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4NDg1NSwgMHgwMDkwLCAweGZmLCAweGZmLCAweGZmKSwKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykmcnRsODE5MmN1X2ZvcHN9LAoge1VTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKDB4NDg1NiwgMHgwMDkxLCAweGZmLCAweGZmLCAweGZmKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsOHh4eHUvcnRsOHh4eHVfcmVncy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV9yZWdzLmgKaW5kZXggOTIxYzU2NS4uMzE1Y2NmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV9yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGw4eHh4dS9ydGw4eHh4dV9yZWdzLmgKQEAgLTIxMywxMCArMjEzLDY2IEBACiAjZGVmaW5lIFJFR19ITUJPWF9FWFRfMQkJCTB4MDA4YQogI2RlZmluZSBSRUdfSE1CT1hfRVhUXzIJCQkweDAwOGMKICNkZWZpbmUgUkVHX0hNQk9YX0VYVF8zCQkJMHgwMDhlCisKIC8qIEludGVycnVwdCByZWdpc3RlcnMgZm9yIDgxOTJlLzg3MjNidS84ODEyICovCiAjZGVmaW5lIFJFR19ISU1SMAkJCTB4MDBiMAorI2RlZmluZQkgSU1SMF9UWENDSwkJCUJJVCgzMCkJLyogVFhSUFQgaW50ZXJydXB0IHdoZW4gQ0NYIGJpdAorCQkJCQkJICAgb2YgdGhlIHBhY2tldCBpcyBzZXQgKi8KKyNkZWZpbmUJIElNUjBfUFNUSU1FT1VUCQkJQklUKDI5KQkvKiBQb3dlciBTYXZlIFRpbWUgT3V0IEludCAqLworI2RlZmluZQkgSU1SMF9HVElOVDQJCQlCSVQoMjgpCS8qIFNldCB3aGVuIEdUSU1FUjQgZXhwaXJlcyAqLworI2RlZmluZQkgSU1SMF9HVElOVDMJCQlCSVQoMjcpCS8qIFNldCB3aGVuIEdUSU1FUjMgZXhwaXJlcyAqLworI2RlZmluZQkgSU1SMF9UQkRFUgkJCUJJVCgyNikJLyogVHJhbnNtaXQgQmVhY29uMCBFcnJvciAqLworI2RlZmluZQkgSU1SMF9UQkRPSwkJCUJJVCgyNSkJLyogVHJhbnNtaXQgQmVhY29uMCBPSyAqLworI2RlZmluZQkgSU1SMF9UU0ZfQklUMzJfVE9HR0xFCQlCSVQoMjQpCS8qIFRTRiBUaW1lciBCSVQzMiB0b2dnbGUKKwkJCQkJCSAgIGluZGljYXRpb24gaW50ZXJydXB0ICovCisjZGVmaW5lCSBJTVIwX0JDTkRNQUlOVDAJCUJJVCgyMCkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgMCAqLworI2RlZmluZQkgSU1SMF9CQ05ERVJSMAkJCUJJVCgxNikJLyogQmVhY29uIFF1ZXVlIERNQSBFcnJvciAwICovCisjZGVmaW5lCSBJTVIwX0hTSVNSX0lORF9PTl9JTlQJCUJJVCgxNSkJLyogSFNJU1IgSW5kaWNhdG9yIChIU0lNUiAmCisJCQkJCQkgICBIU0lTUiBpcyB0cnVlKSAqLworI2RlZmluZQkgSU1SMF9CQ05ETUFJTlRfRQkJQklUKDE0KQkvKiBCZWFjb24gRE1BIEludGVycnVwdAorCQkJCQkJICAgRXh0ZW5zaW9uIGZvciBXaW43ICovCisjZGVmaW5lCSBJTVIwX0FUSU1FTkQJCQlCSVQoMTIpCS8qIENUV2lkbm93IEVuZCBvcgorCQkJCQkJICAgQVRJTSBXaW5kb3cgRW5kICovCisjZGVmaW5lCSBJTVIwX0hJU1IxX0lORF9JTlQJCUJJVCgxMSkJLyogSElTUjEgSW5kaWNhdG9yCisJCQkJCQkgICAoSElTUjEgJiBISU1SMSBpcyB0cnVlKSAqLworI2RlZmluZQkgSU1SMF9DMkhDTUQJCQlCSVQoMTApCS8qIENQVSB0byBIb3N0IENvbW1hbmQgSU5UCisJCQkJCQkgICBTdGF0dXMsIFdyaXRlIDEgdG8gY2xlYXIgKi8KKyNkZWZpbmUJIElNUjBfQ1BXTTIJCQlCSVQoOSkJLyogQ1BVIHBvd2VyIE1vZGUgZXhjaGFuZ2UgSU5UCisJCQkJCQkgICBTdGF0dXMsIFdyaXRlIDEgdG8gY2xlYXIgKi8KKyNkZWZpbmUJIElNUjBfQ1BXTQkJCUJJVCg4KQkvKiBDUFUgcG93ZXIgTW9kZSBleGNoYW5nZSBJTlQKKwkJCQkJCSAgIFN0YXR1cywgV3JpdGUgMSB0byBjbGVhciAqLworI2RlZmluZQkgSU1SMF9ISUdIRE9LCQkJQklUKDcpCS8qIEhpZ2ggUXVldWUgRE1BIE9LICovCisjZGVmaW5lCSBJTVIwX01HTlRET0sJCQlCSVQoNikJLyogTWFuYWdlbWVudCBRdWV1ZSBETUEgT0sgKi8KKyNkZWZpbmUJIElNUjBfQktET0sJCQlCSVQoNSkJLyogQUNfQksgRE1BIE9LICovCisjZGVmaW5lCSBJTVIwX0JFRE9LCQkJQklUKDQpCS8qIEFDX0JFIERNQSBPSyAqLworI2RlZmluZQkgSU1SMF9WSURPSwkJCUJJVCgzKQkvKiBBQ19WSSBETUEgT0sgKi8KKyNkZWZpbmUJIElNUjBfVk9ET0sJCQlCSVQoMikJLyogQUNfVk8gRE1BIE9LICovCisjZGVmaW5lCSBJTVIwX1JEVQkJCUJJVCgxKQkvKiBSeCBEZXNjcmlwdG9yIFVuYXZhaWxhYmxlICovCisjZGVmaW5lCSBJTVIwX1JPSwkJCUJJVCgwKQkvKiBSZWNlaXZlIERNQSBPSyAqLwogI2RlZmluZSBSRUdfSElTUjAJCQkweDAwYjQKICNkZWZpbmUgUkVHX0hJTVIxCQkJMHgwMGI4CisjZGVmaW5lCSBJTVIxX0JDTkRNQUlOVDcJCUJJVCgyNykJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgNyAqLworI2RlZmluZQkgSU1SMV9CQ05ETUFJTlQ2CQlCSVQoMjYpCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDYgKi8KKyNkZWZpbmUJIElNUjFfQkNORE1BSU5UNQkJQklUKDI1KQkvKiBCZWFjb24gRE1BIEludGVycnVwdCA1ICovCisjZGVmaW5lCSBJTVIxX0JDTkRNQUlOVDQJCUJJVCgyNCkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgNCAqLworI2RlZmluZQkgSU1SMV9CQ05ETUFJTlQzCQlCSVQoMjMpCS8qIEJlYWNvbiBETUEgSW50ZXJydXB0IDMgKi8KKyNkZWZpbmUJIElNUjFfQkNORE1BSU5UMgkJQklUKDIyKQkvKiBCZWFjb24gRE1BIEludGVycnVwdCAyICovCisjZGVmaW5lCSBJTVIxX0JDTkRNQUlOVDEJCUJJVCgyMSkJLyogQmVhY29uIERNQSBJbnRlcnJ1cHQgMSAqLworI2RlZmluZQkgSU1SMV9CQ05ERVJSNwkJCUJJVCgyMCkJLyogQmVhY29uIFF1ZXVlIERNQSBFcnIgSW50IDcgKi8KKyNkZWZpbmUJIElNUjFfQkNOREVSUjYJCQlCSVQoMTkpCS8qIEJlYWNvbiBRdWV1ZSBETUEgRXJyIEludCA2ICovCisjZGVmaW5lCSBJTVIxX0JDTkRFUlI1CQkJQklUKDE4KQkvKiBCZWFjb24gUXVldWUgRE1BIEVyciBJbnQgNSAqLworI2RlZmluZQkgSU1SMV9CQ05ERVJSNAkJCUJJVCgxNykJLyogQmVhY29uIFF1ZXVlIERNQSBFcnIgSW50IDQgKi8KKyNkZWZpbmUJIElNUjFfQkNOREVSUjMJCQlCSVQoMTYpCS8qIEJlYWNvbiBRdWV1ZSBETUEgRXJyIEludCAzICovCisjZGVmaW5lCSBJTVIxX0JDTkRFUlIyCQkJQklUKDE1KQkvKiBCZWFjb24gUXVldWUgRE1BIEVyciBJbnQgMiAqLworI2RlZmluZQkgSU1SMV9CQ05ERVJSMQkJCUJJVCgxNCkJLyogQmVhY29uIFF1ZXVlIERNQSBFcnIgSW50IDEgKi8KKyNkZWZpbmUJIElNUjFfQVRJTUVORF9FCQkJQklUKDEzKQkvKiBBVElNIFdpbmRvdyBFbmQgRXh0ZW5zaW9uCisJCQkJCQkgICBmb3IgV2luNyAqLworI2RlZmluZQkgSU1SMV9UWEVSUgkJCUJJVCgxMSkJLyogVHggRXJyb3IgRmxhZyBJbnQgU3RhdHVzLAorCQkJCQkJICAgd3JpdGUgMSB0byBjbGVhciAqLworI2RlZmluZQkgSU1SMV9SWEVSUgkJCUJJVCgxMCkJLyogUnggRXJyb3IgRmxhZyBJbnQgU3RhdHVzLAorCQkJCQkJICAgd3JpdGUgMSB0byBjbGVhciAqLworI2RlZmluZQkgSU1SMV9UWEZPVlcJCQlCSVQoOSkJLyogVHJhbnNtaXQgRklGTyBPdmVyZmxvdyAqLworI2RlZmluZQkgSU1SMV9SWEZPVlcJCQlCSVQoOCkJLyogUmVjZWl2ZSBGSUZPIE92ZXJmbG93ICovCiAjZGVmaW5lIFJFR19ISVNSMQkJCTB4MDBiYwogCiAvKiAgSG9zdCBzdXNwZW5kIGNvdW50ZXIgb24gRlBHQSBwbGF0Zm9ybSAqLwpAQCAtNjIwLDYgKzY3Niw3IEBACiAjZGVmaW5lIFJFR19TQ0hfVFhDTUQJCQkweDA1ZDAKIAogLyogZGVmaW5lIFJFR19GV19UU0ZfU1lOQ19DTlQJCTB4MDRhMCAqLworI2RlZmluZSBSRUdfU0NIX1RYX0NNRAkJCTB4MDVmOAogI2RlZmluZSBSRUdfRldfUkVTRVRfVFNGX0NOVF8xCQkweDA1ZmMKICNkZWZpbmUgUkVHX0ZXX1JFU0VUX1RTRl9DTlRfMAkJMHgwNWZkCiAjZGVmaW5lIFJFR19GV19CQ05fRElTX0NOVAkJMHgwNWZlCkBAIC03ODAsNiArODM3LDEwIEBACiAjZGVmaW5lICBGUEdBX1JGX01PREVfT0ZETQkJQklUKDI1KQogCiAjZGVmaW5lIFJFR19GUEdBMF9UWF9JTkZPCQkweDA4MDQKKyNkZWZpbmUgIEZQR0EwX1RYX0lORk9fT0ZETV9QQVRIX0EJQklUKDApCisjZGVmaW5lICBGUEdBMF9UWF9JTkZPX09GRE1fUEFUSF9CCUJJVCgxKQorI2RlZmluZSAgRlBHQTBfVFhfSU5GT19PRkRNX1BBVEhfQwlCSVQoMikKKyNkZWZpbmUgIEZQR0EwX1RYX0lORk9fT0ZETV9QQVRIX0QJQklUKDMpCiAjZGVmaW5lIFJFR19GUEdBMF9QU0RfRlVOQwkJMHgwODA4CiAjZGVmaW5lIFJFR19GUEdBMF9UWF9HQUlOCQkweDA4MGMKICNkZWZpbmUgUkVHX0ZQR0EwX1JGX1RJTUlORzEJCTB4MDgxMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL2NvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9jb3JlLmMKaW5kZXggNDFmNzdmOC4uZjk1NzYwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvY29yZS5jCkBAIC03NjUsNyArNzY1LDggQEAKIAkJCQkJbWFjLT5id180MCA9IGZhbHNlOwogCQkJCQltYWMtPmJ3XzgwID0gZmFsc2U7CiAJCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkJCSBjaGFubmVsX3R5cGUpOwogCQkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMTEzNSw3ICsxMTM2LDcgQEAKIAkJCQkJbWFjLT5tb2RlID0gV0lSRUxFU1NfTU9ERV9BQ18yNEc7CiAJCQl9CiAKLQkJCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJiBzdGEpCisJCQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCQkJcnRscHJpdi0+Y2ZnLT5vcHMtPnVwZGF0ZV9yYXRlX3RibChodywgc3RhLCAwKTsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcGNpLmMKaW5kZXggZDEyNTg2ZC4uMGRmYTllYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9wY2kuYwpAQCAtMTc5LDcgKzE3OSw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCSBydGxwY2ktPmNvbnN0X3N1cHBvcnRfcGNpYXNwbSk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3BzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcHMuYwppbmRleCA5YTY0ZjliLi4xOGQ5NzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcHMuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHN0YXRlX3Rvc2V0KTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcmVnZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3JlZ2QuYwppbmRleCAzNTI0NDQxLi42ZWU2YmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcmVnZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9yZWdkLmMKQEAgLTM0NSw5ICszNDUsOSBAQAogCQlyZXR1cm4gJnJ0bF9yZWdkb21fbm9fbWlkYmFuZDsKIAljYXNlIENPVU5UUllfQ09ERV9JQzoKIAkJcmV0dXJuICZydGxfcmVnZG9tXzExOwotCWNhc2UgQ09VTlRSWV9DT0RFX0VUU0k6CiAJY2FzZSBDT1VOVFJZX0NPREVfVEVMRUNfTkVUR0VBUjoKIAkJcmV0dXJuICZydGxfcmVnZG9tXzYwXzY0OworCWNhc2UgQ09VTlRSWV9DT0RFX0VUU0k6CiAJY2FzZSBDT1VOVFJZX0NPREVfU1BBSU46CiAJY2FzZSBDT1VOVFJZX0NPREVfRlJBTkNFOgogCWNhc2UgQ09VTlRSWV9DT0RFX0lTUkFFTDoKQEAgLTQwNiw2ICs0MDYsOCBAQAogCQlyZXR1cm4gQ09VTlRSWV9DT0RFX1dPUkxEX1dJREVfMTM7CiAJY2FzZSAweDIyOgogCQlyZXR1cm4gQ09VTlRSWV9DT0RFX0lDOworCWNhc2UgMHgyNToKKwkJcmV0dXJuIENPVU5UUllfQ09ERV9FVFNJOwogCWNhc2UgMHgzMjoKIAkJcmV0dXJuIENPVU5UUllfQ09ERV9URUxFQ19ORVRHRUFSOwogCWNhc2UgMHg0MToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvZncuYwppbmRleCA2MjkxMjU2Li41MzYwZDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9mdy5jCkBAIC0zMzQsNyArMzM0LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGJveG51bSk7CiAJCQlicmVhazsKIAkJfQogCQlpc2Z3X3JlYWQgPSBfcnRsODhlX2NoZWNrX2Z3X3JlYWRfbGFzdF9oMmMoaHcsIGJveG51bSk7CkBAIC00MDUsNyArNDA1LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9ody5jCmluZGV4IDRhYjYyMDEuLjM3ZDZlZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL2h3LmMKQEAgLTM1NSw5ICszNTUsMTEgQEAKIAogCQkqKCh1NjQgKikodmFsKSkgPSB0c2Y7CiAJCWJyZWFrOyB9CisJY2FzZSBIQUxfREVGX1dPV0xBTjoKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3MgJXhcbiIsIHZhcmlhYmxlKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtNTcxLDcgKzU3Myw4IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCQkgZV9hY2kpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC03MzUsNyArNzM4LDcgQEAKIAkJYnJlYWs7IH0KIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2VzcyAleFxuIiwgdmFyaWFibGUpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0yMzUyLDcgKzIzNTUsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGVuY19hbGdvKTsKIAkJCWVuY19hbGdvID0gQ0FNX1RLSVA7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvbGVkLmMKaW5kZXggYjUwNGJkMC4uZjA1YzJjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9sZWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL2xlZC5jCkBAIC02Miw3ICs2Miw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gdHJ1ZTsKQEAgLTEwMCw3ICsxMDAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvcGh5LmMKaW5kZXggNzQ5OGExMi4uZmZmYWE5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL3BoeS5jCkBAIC0xMzQ2LDcgKzEzNDYsOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkgY3VycmVudGNtZC0+Y21kaWQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMjEyOCw3ICsyMTI5LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGlvdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGZhbHNlKTsKQEAgLTIxNjYsNyArMjE2Nyw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCSBydGxwaHktPmN1cnJlbnRfaW9fdHlwZSk7CiAJCWJyZWFrOwogCX0KIAlydGxwaHktPnNldF9pb19pbnByb2dyZXNzID0gZmFsc2U7CkBAIC0yMzE5LDcgKzIzMjEsNyBAQAogCQl9CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnB3cl9zdGF0ZSk7CiAJCWJyZXN1bHQgPSBmYWxzZTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxODhlZS9zdy5jCmluZGV4IDQ3ZTMyY2IuLmU3YjExYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTg4ZWUvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE4OGVlL3N3LmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCS5kZWJ1ZyA9IERCR19FTUVSRywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODhlZV9oYWxfY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBydGxfaGFsX2NmZyBydGw4OGVlX2hhbF9jZmcgPSB7CiAJLmJhcl9pZCA9IDIsCiAJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKIAkubmFtZSA9ICJydGw4OGVfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uYwppbmRleCA0M2ZjYjI1Li43ZDE1MjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5jCkBAIC0zNTIsNyArMzUyLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGJveG51bSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC00NTYsNyArNDU2LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjL3BoeV9jb21tb24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyYy9waHlfY29tbW9uLmMKaW5kZXggNjBhYjJlYy4uMjdlM2Q1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjL3BoeV9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmMvcGh5X2NvbW1vbi5jCkBAIC05MTAsNyArOTEwLDggQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkJIGN1cnJlbnRjbWQtPmNtZGlkKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE1NjcsNyArMTU2OCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBpb3R5cGUpOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChmYWxzZSk7CkBAIC0xNjA1LDcgKzE2MDYsOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkgcnRscGh5LT5jdXJyZW50X2lvX3R5cGUpOwogCQlicmVhazsKIAl9CiAJcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9ody5jCmluZGV4IDI0NDYwNzkuLmE0N2JlNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL2h3LmMKQEAgLTE0MSw5ICsxNDEsMTEgQEAKIAogCQlicmVhazsKIAkJfQorCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0zNjcsNyArMzY5LDggQEAKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKIAkJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCQkJIGVfYWNpKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtMjE1NCw3ICsyMTU3LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGVuY19hbGdvKTsKIAkJCWVuY19hbGdvID0gQ0FNX1RLSVA7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvbGVkLmMKaW5kZXggODI4M2U5YjIuLjI0ZTQ4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9sZWQuYwpAQCAtNjIsNyArNjIsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IHRydWU7CkBAIC05Nyw3ICs5Nyw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9waHkuYwppbmRleCAxZWU1YTZhLi40NmQwZDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2UvcGh5LmMKQEAgLTMwMCwxMiArMzAwLDkgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9DOgotCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKLQkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfRDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnBhdGgpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTU1NCw3ICs1NTEsNyBAQAogCQl9CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnB3cl9zdGF0ZSk7CiAJCWJyZXN1bHQgPSBmYWxzZTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jCmluZGV4IDQ3ODBiZGMuLjg3YWEyMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY2Uvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmNlL3N3LmMKQEAgLTI1OCw3ICsyNTgsNyBAQAogCS5kZWJ1ZyA9IERCR19FTUVSRywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsOTJjZV9oYWxfY2ZnID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBydGxfaGFsX2NmZyBydGw5MmNlX2hhbF9jZmcgPSB7CiAJLmJhcl9pZCA9IDIsCiAJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKIAkubmFtZSA9ICJydGw5MmNfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvaHcuYwppbmRleCA4Nzg5NzUyLi5hZThmMDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9ody5jCkBAIC0xNTYwLDcgKzE1NjAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTkzMSw3ICsxOTMxLDcgQEAKIAkJfQogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9sZWQuYwppbmRleCA3NWEyZGViLi44NTE0YWI2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9sZWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L2xlZC5jCkBAIC02Miw3ICs2Miw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gdHJ1ZTsKQEAgLTk1LDcgKzk1LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmN1L3BoeS5jCmluZGV4IGM5NzJmYTUuLjRiMjk3NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJjdS9waHkuYwpAQCAtMjc3LDEyICsyNzcsOSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgUkY5MF9QQVRIX0M6Ci0JCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOwotCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9EOgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcGF0aCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtNTE3LDcgKzUxNCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwd3Jfc3RhdGUpOwogCQlicmVzdWx0ID0gZmFsc2U7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvZncuYwppbmRleCA2MmVmODIwLi44ZGUyOWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9mdy5jCkBAIC00MzUsNyArNDM1LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGJveG51bSk7CiAJCQlicmVhazsKIAkJfQogCQlpc2Z3X3JlYWQgPSBfcnRsOTJkX2NoZWNrX2Z3X3JlYWRfbGFzdF9oMmMoaHcsIGJveG51bSk7CkBAIC01MTIsNyArNTEyLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIAkJYndyaXRlX3N1Y2Nlc3MgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9ody5jCmluZGV4IGIwZjYzMjQuLmQ5MWY4YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2h3LmMKQEAgLTE2NCw5ICsxNjQsMTEgQEAKIAljYXNlIEhXX1ZBUl9JTlRfQUM6CiAJCSooKGJvb2wgKikodmFsKSkgPSBydGxwcml2LT5kbS5kaXNhYmxlX3R4X2ludDsKIAkJYnJlYWs7CisJY2FzZSBIQUxfREVGX1dPV0xBTjoKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTM2MSw3ICszNjMsOCBAQAogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCQkgZV9hY2kpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC01MDIsNyArNTA1LDcgQEAKIAl9CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTE3NTcsNyArMTc2MCw3IEBACiAJCXJldHVybjsKIAogCWlmIChydGxfZ2V0X2h3aW5mbyhodywgcnRscHJpdiwgSFdTRVRfTUFYX1NJWkUsIGh3aW5mbywgcGFyYW1zKSkKLQkJcmV0dXJuOworCQlnb3RvIGV4aXQ7CiAKIAlfcnRsOTJkZV9lZnVzZV91cGRhdGVfY2hpcF92ZXJzaW9uKGh3KTsKIAlfcnRsOTJkZV9yZWFkX21hY3BoeW1vZGVfYW5kX2JhbmR0eXBlKGh3LCBod2luZm8pOwpAQCAtMTc5MCw2ICsxNzkzLDcgQEAKIAkJYnJlYWs7CiAJfQogCXJ0bGVmdXNlLT50eHB3cl9mcm9tZXByb20gPSB0cnVlOworZXhpdDoKIAlrZnJlZShod2luZm8pOwogfQogCkBAIC0yMTcwLDcgKzIxNzQsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgZW5jX2FsZ28pOwogCQkJZW5jX2FsZ28gPSBDQU1fVEtJUDsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9sZWQuYwppbmRleCA3NmE1N2FlLi44MTFiYTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvbGVkLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSB0cnVlOwpAQCAtMTA2LDcgKzEwNiw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9waHkuYwppbmRleCBkMzM0ZDJhLi4yYTFlZGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvcGh5LmMKQEAgLTU4OCw3ICs1ODgsNyBAQAogCQkJCSAqIHNldHRpbmcuICovCiAJCQkJdWRlbGF5KDEpOwogCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkJCQkgIlRoZSBSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlWzBdIGlzICV1bCBSdGw4MTlYUEhZX1JFR0FycmF5WzFdIGlzICV1bFxuIiwKKwkJCQkJICJUaGUgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVswXSBpcyAldSBSdGw4MTlYUEhZX1JFR0FycmF5WzFdIGlzICV1XG4iLAogCQkJCQkgYWdjdGFiX2FycmF5X3RhYmxlW2ldLAogCQkJCQkgYWdjdGFiX2FycmF5X3RhYmxlW2kgKyAxXSk7CiAJCQl9CkBAIC02MDQsNyArNjA0LDcgQEAKIAkJCQkJICogc2V0dGluZy4gKi8KIAkJCQkJdWRlbGF5KDEpOwogCQkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJCQkJCSAiVGhlIFJ0bDgxOVhBR0NUQUJfQXJyYXlfVGFibGVbMF0gaXMgJXVsIFJ0bDgxOVhQSFlfUkVHQXJyYXlbMV0gaXMgJXVsXG4iLAorCQkJCQkJICJUaGUgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVswXSBpcyAldSBSdGw4MTlYUEhZX1JFR0FycmF5WzFdIGlzICV1XG4iLAogCQkJCQkJIGFnY3RhYl9hcnJheV90YWJsZVtpXSwKIAkJCQkJCSBhZ2N0YWJfYXJyYXlfdGFibGVbaSArIDFdKTsKIAkJCQl9CkBAIC02MjAsNyArNjIwLDcgQEAKIAkJCQkJICogc2V0dGluZy4gKi8KIAkJCQkJdWRlbGF5KDEpOwogCQkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJCQkJCSAiVGhlIFJ0bDgxOVhBR0NUQUJfNUdBcnJheV9UYWJsZVswXSBpcyAldWwgUnRsODE5WFBIWV9SRUdBcnJheVsxXSBpcyAldWxcbiIsCisJCQkJCQkgIlRoZSBSdGw4MTlYQUdDVEFCXzVHQXJyYXlfVGFibGVbMF0gaXMgJXUgUnRsODE5WFBIWV9SRUdBcnJheVsxXSBpcyAldVxuIiwKIAkJCQkJCSBhZ2N0YWJfNWdhcnJheV90YWJsZVtpXSwKIAkJCQkJCSBhZ2N0YWJfNWdhcnJheV90YWJsZVtpICsgMV0pOwogCQkJCX0KQEAgLTgzNiwxMiArODM2LDkgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9DOgotCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKLQkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfRDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnBhdGgpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIHRydWU7CkBAIC0yODUwLDcgKzI4NDcsOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkgY3VycmVudGNtZC0+Y21kaWQpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0yOTYzLDcgKzI5NjEsOCBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkgcnRscGh5LT5jdXJyZW50X2lvX3R5cGUpOwogCQlicmVhazsKIAl9CiAJcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcyA9IGZhbHNlOwpAQCAtMjk5NCw3ICsyOTkzLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGlvdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGZhbHNlKTsKQEAgLTMxODIsNyArMzE4MSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwd3Jfc3RhdGUpOwogCQlicmVzdWx0ID0gZmFsc2U7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZGUvc3cuYwppbmRleCBjNmUwOWExLi4wNTM4YTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmRlL3N3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJkZS9zdy5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAkuZGVidWcgPSBEQkdfRU1FUkcsCiB9OwogCi1zdGF0aWMgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDkyZGVfaGFsX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsOTJkZV9oYWxfY2ZnID0gewogCS5iYXJfaWQgPSAyLAogCS53cml0ZV9yZWFkYmFjayA9IHRydWUsCiAJLm5hbWUgPSAicnRsODE5MmRlIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvZncuYwppbmRleCAwNzA4ZWVkLi5iM2Y2YTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9mdy5jCkBAIC0zNDQsNyArMzQ0LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGJveG51bSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC00MzMsNyArNDMzLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9ody5jCmluZGV4IGIwN2FmOGQuLmViZjY2M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2h3LmMKQEAgLTMzOCw5ICszMzgsMTEgQEAKIAkJKigodTY0ICopKHZhbCkpID0gdHNmOwogCQl9CiAJCWJyZWFrOworCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRE1FU0csCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLCB2YXJpYWJsZSk7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTU2Niw3ICs1NjgsOCBAQAogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0RNRVNHLAotCQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkJIGVfYWNpKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtNjg1LDcgKzY4OCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRE1FU0csCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLCB2YXJpYWJsZSk7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTI0NjMsNyArMjQ2Niw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRE1FU0csCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgZW5jX2FsZ28pOwogCQkJZW5jX2FsZ28gPSBDQU1fVEtJUDsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2xlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9sZWQuYwppbmRleCA4Mzg4ZTM3Li40N2RhMDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvbGVkLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSB0cnVlOwpAQCAtOTEsNyArOTEsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvcGh5LmMKaW5kZXggYmVhZmM5YS4uNWFkN2U3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL3BoeS5jCkBAIC0xOTI3LDcgKzE5MjcsOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkgY3VycmVudGNtZC0+Y21kaWQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMzAwMSw3ICszMDAyLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGlvdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGZhbHNlKTsKQEAgLTMwNDEsNyArMzA0Miw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCSBydGxwaHktPmN1cnJlbnRfaW9fdHlwZSk7CiAJCWJyZWFrOwogCX0KIAlydGxwaHktPnNldF9pb19pbnByb2dyZXNzID0gZmFsc2U7CkBAIC0zMTg3LDcgKzMxODksNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcHdyX3N0YXRlKTsKIAkJYnJlc3VsdCA9IGZhbHNlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MmVlL3N3LmMKaW5kZXggYzMxYzZiZi4uYWMyOTljYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJlZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyZWUvc3cuYwpAQCAtMjYyLDcgKzI2Miw3IEBACiAJLmRlYnVnID0gREJHX0VNRVJHLAogfTsKIAotc3RhdGljIHN0cnVjdCBydGxfaGFsX2NmZyBydGw5MmVlX2hhbF9jZmcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDkyZWVfaGFsX2NmZyA9IHsKIAkuYmFyX2lkID0gMiwKIAkud3JpdGVfcmVhZGJhY2sgPSB0cnVlLAogCS5uYW1lID0gInJ0bDkyZWVfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvaHcuYwppbmRleCBkZGZhMGFlLi41MmU0NDMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJzZS9ody5jCkBAIC03Nyw5ICs3NywxMSBAQAogCQkJKigoYm9vbCAqKSh2YWwpKSA9IHJ0bHByaXYtPmRtLmN1cnJlbnRfbXJjX3N3aXRjaDsKIAkJCWJyZWFrOwogCQl9CisJY2FzZSBIQUxfREVGX1dPV0xBTjoKKwkJYnJlYWs7CiAJZGVmYXVsdDogewogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjk3LDcgKzI5OSw4IEBACiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6CiAJCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkJCSBlX2FjaSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTQzMyw3ICs0MzYsNyBAQAogCQlicmVhazsgfQogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiAKQEAgLTI0NjUsNyArMjQ2OCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBlbmNfYWxnbyk7CiAJCQllbmNfYWxnbyA9IENBTV9US0lQOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL2xlZC5jCmluZGV4IDQ0OTQ5YjUuLjk4NDljYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJzZS9sZWQuYwpAQCAtNjgsNyArNjgsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IHRydWU7CkBAIC0xMDQsNyArMTA0LDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NlZFxuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODE5MnNlL3BoeS5jCmluZGV4IDg4MTgyMWYuLjRiYjc1NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJzZS9waHkuYwpAQCAtNDQyLDcgKzQ0Miw4IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc2VkXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCSBjdXJyZW50Y21kLT5jbWRpZCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC02NDgsNyArNjQ5LDcgQEAKIAkJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwd3Jfc3RhdGUpOwogCQlicmVzdWx0ID0gZmFsc2U7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYwppbmRleCAzMWJhY2E0MS4uNWU4ZTAyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDgxOTJzZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYwpAQCAtMzA2LDcgKzMwNiw3IEBACiAKIC8qIEJlY2F1c2UgbWVtb3J5IFIvVyBidXJzdGluZyB3aWxsIGNhdXNlIHN5c3RlbSBoYW5nL2NyYXNoCiAgKiBmb3IgOTJzZSwgc28gd2UgZG9uJ3QgcmVhZCBiYWNrIGFmdGVyIGV2ZXJ5IHdyaXRlIGFjdGlvbiAqLwotc3RhdGljIHN0cnVjdCBydGxfaGFsX2NmZyBydGw5MnNlX2hhbF9jZmcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJ0bF9oYWxfY2ZnIHJ0bDkyc2VfaGFsX2NmZyA9IHsKIAkuYmFyX2lkID0gMSwKIAkud3JpdGVfcmVhZGJhY2sgPSBmYWxzZSwKIAkubmFtZSA9ICJydGw5MnNfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvZncuYwppbmRleCBiN2MwZDM4Li4xMTg2NzU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9mdy5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBib3hudW0pOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMjMwLDcgKzIzMCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgY21kX2xlbik7CiAJCQlicmVhazsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2h3LmMKaW5kZXggYjg4YzdlZS4uZjhiZTBiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvaHcuYwpAQCAtMTQxLDkgKzE0MSwxMSBAQAogCiAJCQlicmVhazsKIAkJfQorCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgdmFyaWFibGUpOwogCQlicmVhazsKIAl9CiB9CkBAIC0zNjYsNyArMzY4LDggQEAKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKIAkJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCQkJIGVfYWNpKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQpAQCAtNTQ2LDcgKzU0OSw3IEBACiAJCX0KIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTY1NCw3ICsxNjU3LDcgQEAKIAkJCXJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZywgaHdpbmZvKTsKIAogCWlmIChydGxoYWwtPm9lbV9pZCAhPSBSVF9DSURfREVGQVVMVCkKLQkJcmV0dXJuOworCQlnb3RvIGV4aXQ7CiAKIAlzd2l0Y2ggKHJ0bGVmdXNlLT5lZXByb21fb2VtaWQpIHsKIAljYXNlIEVFUFJPTV9DSURfREVGQVVMVDoKQEAgLTIyMjUsNyArMjIyOCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBlbmNfYWxnbyk7CiAJCQllbmNfYWxnbyA9IENBTV9US0lQOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL2xlZC5jCmluZGV4IDEzMTczMzUuLmM3YmU5MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9sZWQuYwpAQCAtNjMsNyArNjMsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSB0cnVlOwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvcGh5LmMKaW5kZXggNjAxYjc4ZS4uMTdiNThjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL3BoeS5jCkBAIC0xMDIzLDcgKzEwMjMsOCBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCQkgY3VycmVudGNtZC0+Y21kaWQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTQ5OSw3ICsxNTAwLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGlvdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGZhbHNlKTsKQEAgLTE1MzYsNyArMTUzNyw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwKKwkJCSBydGxwaHktPmN1cnJlbnRfaW9fdHlwZSk7CiAJCWJyZWFrOwogCX0KIAlydGxwaHktPnNldF9pb19pbnByb2dyZXNzID0gZmFsc2U7CkBAIC0xNjgyLDcgKzE2ODQsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcHdyX3N0YXRlKTsKIAkJYnJlc3VsdCA9IGZhbHNlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2FlL3N3LmMKaW5kZXggZmY0OWE4Yy4uODljODI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNhZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYWUvc3cuYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAJLmRpc2FibGVfd2F0Y2hkb2cgPSBmYWxzZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODcyM2VfaGFsX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODcyM2VfaGFsX2NmZyA9IHsKIAkuYmFyX2lkID0gMiwKIAkud3JpdGVfcmVhZGJhY2sgPSB0cnVlLAogCS5uYW1lID0gInJ0bDg3MjNlX3BjaSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL2Z3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL2Z3LmMKaW5kZXggZDVkYTBmMy4uOGM1YzI3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvZncuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgYm94bnVtKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE5NSw3ICsxOTUsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9ody5jCmluZGV4IDgyZTQ0NzYuLmFiYTYwYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL2h3LmMKQEAgLTM0OCw5ICszNDgsMTEgQEAKIAkJKigodTY0ICopKHZhbCkpID0gdHNmOwogCQl9CiAJCWJyZWFrOworCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3MgJXhcbiIsIHZhcmlhYmxlKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtNjA3LDcgKzYwOSw4IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkJCSBlX2FjaSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTcyMyw4ICs3MjYsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLAotCQkJIHZhcmlhYmxlKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHZhcmlhYmxlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMjU2NSw3ICsyNTY3LDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGVuY19hbGdvKTsKIAkJCWVuY19hbGdvID0gQ0FNX1RLSVA7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvbGVkLmMKaW5kZXggNDE5NmVmYi4uNDk3OTEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9sZWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL2xlZC5jCkBAIC01OCw3ICs1OCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IHRydWU7CkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcGxlZC0+bGVkcGluKTsKIAkJYnJlYWs7CiAJfQogCXBsZWQtPmxlZG9uID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9waHkuYwppbmRleCAyODU4MThkLi4zY2MyMjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvcGh5LmMKQEAgLTgzNyw3ICs4MzcsNyBAQAogCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9EOgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcGF0aCk7CiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gdHJ1ZTsKQEAgLTE1MDcsNyArMTUwNyw4IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCSBjdXJyZW50Y21kLT5jbWRpZCk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0yNTE1LDcgKzI1MTYsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgaW90eXBlKTsKIAkJCWJyZWFrOwogCQl9CiAJfSB3aGlsZSAoZmFsc2UpOwpAQCAtMjU1Myw3ICsyNTU0LDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJIHJ0bHBoeS0+Y3VycmVudF9pb190eXBlKTsKIAkJYnJlYWs7CiAJfQogCXJ0bHBoeS0+c2V0X2lvX2lucHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTI3MDUsNyArMjcwNyw3IEBACiAKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHJmcHdyX3N0YXRlKTsKIAkJYnJlc3VsdCA9IGZhbHNlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODcyM2JlL3N3LmMKaW5kZXggMjEwMTc5My4uMjBiNTNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg3MjNiZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4NzIzYmUvc3cuYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAJLmFudF9zZWwgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBydGxfaGFsX2NmZyBydGw4NzIzYmVfaGFsX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODcyM2JlX2hhbF9jZmcgPSB7CiAJLmJhcl9pZCA9IDIsCiAJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKIAkubmFtZSA9ICJydGw4NzIzYmVfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvZncuYwppbmRleCBhNGZjNzBlLi5iNjY1NDQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9mdy5jCkBAIC0zOTIsNyArMzkyLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGJveG51bSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC00ODEsNyArNDgxLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGNtZF9sZW4pOwogCQkJYnJlYWs7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9ody5jCmluZGV4IDBjZGRmMWEuLjEyODFlYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL2h3LmMKQEAgLTQ4MCw3ICs0ODAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLCB2YXJpYWJsZSk7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTY3MSw3ICs2NzEsOCBAQAogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLAorCQkJCQkgZV9hY2kpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC04MDAsNyArODAxLDcgQEAKIAkJYnJlYWs7IH0KIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzICV4XG4iLCB2YXJpYWJsZSk7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCB2YXJpYWJsZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTM5MzQsNyArMzkzNSw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKLQkJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBlbmNfYWxnbyk7CiAJCQllbmNfYWxnbyA9IENBTV9US0lQOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL2xlZC5jCmluZGV4IGJhMTk0NmEuLmZjYjNiMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9sZWQuYwpAQCAtNjAsNyArNjAsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIHBsZWQtPmxlZHBpbik7CiAJCWJyZWFrOwogCX0KIAlwbGVkLT5sZWRvbiA9IHRydWU7CkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCBwbGVkLT5sZWRwaW4pOwogCQlicmVhazsKIAl9CiAJcGxlZC0+bGVkb24gPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvcGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL3BoeS5jCmluZGV4IGE3MWJmZTMuLjVkYWQ0MDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvcnRsODgyMWFlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvcGh5LmMKQEAgLTIwNjMsMTIgKzIwNjMsOSBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgUkY5MF9QQVRIX0M6Ci0JCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKLQkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfRDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwYXRoKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiB0cnVlOwpAQCAtMjEzMywxNiArMjEzMCwxMCBAQAogCQlicmVhazsKIAogCWNhc2UgUkY5MF9QQVRIX0I6Ci0JCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKLQkJYnJlYWs7CiAJY2FzZSBSRjkwX1BBVEhfQzoKLQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOwotCQlicmVhazsKIAljYXNlIFJGOTBfUEFUSF9EOgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJICJzd2l0Y2ggY2FzZSBub3QgcHJvY2Vzc1xuIik7CisJCQkgInN3aXRjaCBjYXNlICUjeCBub3QgcHJvY2Vzc2VkXG4iLCByZnBhdGgpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIHRydWU7CkBAIC00NjcwLDcgKzQ2NjEsNyBAQAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAotCQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsIGlvdHlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0gd2hpbGUgKGZhbHNlKTsKQEAgLTQ3MTQsNyArNDcwNSw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCi0JCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzXG4iKTsKKwkJCSAic3dpdGNoIGNhc2UgJSN4IG5vdCBwcm9jZXNzZWRcbiIsCisJCQkgcnRscGh5LT5jdXJyZW50X2lvX3R5cGUpOwogCQlicmVhazsKIAl9CiAJcnRscGh5LT5zZXRfaW9faW5wcm9ncmVzcyA9IGZhbHNlOwpAQCAtNDgyMCw3ICs0ODEyLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKLQkJCSAic3dpdGNoIGNhc2Ugbm90IHByb2Nlc3NcbiIpOworCQkJICJzd2l0Y2ggY2FzZSAlI3ggbm90IHByb2Nlc3NlZFxuIiwgcmZwd3Jfc3RhdGUpOwogCQlicmVzdWx0ID0gZmFsc2U7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvc3cuYwppbmRleCA0MTU5ZjliLi4yMmY2ODdiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3J0bDg4MjFhZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS9ydGw4ODIxYWUvc3cuYwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJLmRpc2FibGVfd2F0Y2hkb2cgPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBydGxfaGFsX2NmZyBydGw4ODIxYWVfaGFsX2NmZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRsX2hhbF9jZmcgcnRsODgyMWFlX2hhbF9jZmcgPSB7CiAJLmJhcl9pZCA9IDIsCiAJLndyaXRlX3JlYWRiYWNrID0gdHJ1ZSwKIAkubmFtZSA9ICJydGw4ODIxYWVfcGNpIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS91c2IuYwppbmRleCA0MTYxN2I3Li4zMmFhNWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3VzYi5jCkBAIC03MzksMTEgKzczOSw4IEBACiAJZm9yIChpID0gMDsgaSA8IHJ0bHVzYi0+cnhfdXJiX251bTsgaSsrKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdXJiKSB7Ci0JCQlSVF9UUkFDRShydGxwcml2LCBDT01QX1VTQiwgREJHX0VNRVJHLAotCQkJCSAiRmFpbGVkIHRvIGFsbG9jIFVSQiEhXG4iKTsKKwkJaWYgKCF1cmIpCiAJCQlnb3RvIGVycl9vdXQ7Ci0JCX0KIAogCQllcnIgPSBfcnRsX3ByZXBfcnhfdXJiKGh3LCBydGx1c2IsIHVyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChlcnIgPCAwKSB7CkBAIC05MDcsMTUgKzkwNCwxMiBAQAogc3RhdGljIHN0cnVjdCB1cmIgKl9ydGxfdXNiX3R4X3VyYl9zZXR1cChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZXBfbnVtKQogewotCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAlzdHJ1Y3QgcnRsX3VzYiAqcnRsdXNiID0gcnRsX3VzYmRldihydGxfdXNicHJpdihodykpOwogCXN0cnVjdCB1cmIgKl91cmI7CiAKIAlXQVJOX09OKE5VTEwgPT0gc2tiKTsKIAlfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIAlpZiAoIV91cmIpIHsKLQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9VU0IsIERCR19FTUVSRywKLQkJCSAiQ2FuJ3QgYWxsb2NhdGUgVVJCIGZvciBidWxrIG91dCFcbiIpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3dpZmkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JlYWx0ZWsvcnRsd2lmaS93aWZpLmgKaW5kZXggYzUwODZjMi4uNTk1ZjdkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmVhbHRlay9ydGx3aWZpL3dpZmkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bHdpZmkvd2lmaS5oCkBAIC0zOTQsMTEwICszOTQsMTEwIEBACiB9OwogCiBlbnVtIGh3X3ZhcmlhYmxlcyB7Ci0JSFdfVkFSX0VUSEVSX0FERFIsCi0JSFdfVkFSX01VTFRJQ0FTVF9SRUcsCi0JSFdfVkFSX0JBU0lDX1JBVEUsCi0JSFdfVkFSX0JTU0lELAotCUhXX1ZBUl9NRURJQV9TVEFUVVMsCi0JSFdfVkFSX1NFQ1VSSVRZX0NPTkYsCi0JSFdfVkFSX0JFQUNPTl9JTlRFUlZBTCwKLQlIV19WQVJfQVRJTV9XSU5ET1csCi0JSFdfVkFSX0xJU1RFTl9JTlRFUlZBTCwKLQlIV19WQVJfQ1NfQ09VTlRFUiwKLQlIV19WQVJfREVGQVVMVEtFWTAsCi0JSFdfVkFSX0RFRkFVTFRLRVkxLAotCUhXX1ZBUl9ERUZBVUxUS0VZMiwKLQlIV19WQVJfREVGQVVMVEtFWTMsCi0JSFdfVkFSX1NJRlMsCi0JSFdfVkFSX1IyVF9TSUZTLAotCUhXX1ZBUl9ESUZTLAotCUhXX1ZBUl9FSUZTLAotCUhXX1ZBUl9TTE9UX1RJTUUsCi0JSFdfVkFSX0FDS19QUkVBTUJMRSwKLQlIV19WQVJfQ1dfQ09ORklHLAotCUhXX1ZBUl9DV19WQUxVRVMsCi0JSFdfVkFSX1JBVEVfRkFMTEJBQ0tfQ09OVFJPTCwKLQlIV19WQVJfQ09OVEVOVElPTl9XSU5ET1csCi0JSFdfVkFSX1JFVFJZX0NPVU5ULAotCUhXX1ZBUl9UUl9TV0lUQ0gsCi0JSFdfVkFSX0NPTU1BTkQsCi0JSFdfVkFSX1dQQV9DT05GSUcsCi0JSFdfVkFSX0FNUERVX01JTl9TUEFDRSwKLQlIV19WQVJfU0hPUlRHSV9ERU5TSVRZLAotCUhXX1ZBUl9BTVBEVV9GQUNUT1IsCi0JSFdfVkFSX01DU19SQVRFX0FWQUlMQUJMRSwKLQlIV19WQVJfQUNfUEFSQU0sCi0JSFdfVkFSX0FDTV9DVFJMLAotCUhXX1ZBUl9ESVNfUmVxX1FzaXplLAotCUhXX1ZBUl9DQ1hfQ0hOTF9MT0FELAotCUhXX1ZBUl9DQ1hfTk9JU0VfSElTVE9HUkFNLAotCUhXX1ZBUl9DQ1hfQ0xNX05ITSwKLQlIV19WQVJfVHhPUExpbWl0LAotCUhXX1ZBUl9UVVJCT19NT0RFLAotCUhXX1ZBUl9SRl9TVEFURSwKLQlIV19WQVJfUkZfT0ZGX0JZX0hXLAotCUhXX1ZBUl9CVVNfU1BFRUQsCi0JSFdfVkFSX1NFVF9ERVZfUE9XRVIsCisJSFdfVkFSX0VUSEVSX0FERFIgPSAweDAsCisJSFdfVkFSX01VTFRJQ0FTVF9SRUcgPSAweDEsCisJSFdfVkFSX0JBU0lDX1JBVEUgPSAweDIsCisJSFdfVkFSX0JTU0lEID0gMHgzLAorCUhXX1ZBUl9NRURJQV9TVEFUVVM9IDB4NCwKKwlIV19WQVJfU0VDVVJJVFlfQ09ORj0gMHg1LAorCUhXX1ZBUl9CRUFDT05fSU5URVJWQUwgPSAweDYsCisJSFdfVkFSX0FUSU1fV0lORE9XID0gMHg3LAorCUhXX1ZBUl9MSVNURU5fSU5URVJWQUwgPSAweDgsCisJSFdfVkFSX0NTX0NPVU5URVIgPSAweDksCisJSFdfVkFSX0RFRkFVTFRLRVkwID0gMHhhLAorCUhXX1ZBUl9ERUZBVUxUS0VZMSA9IDB4YiwKKwlIV19WQVJfREVGQVVMVEtFWTIgPSAweGMsCisJSFdfVkFSX0RFRkFVTFRLRVkzID0gMHhkLAorCUhXX1ZBUl9TSUZTID0gMHhlLAorCUhXX1ZBUl9SMlRfU0lGUyA9IDB4ZiwKKwlIV19WQVJfRElGUyA9IDB4MTAsCisJSFdfVkFSX0VJRlMgPSAweDExLAorCUhXX1ZBUl9TTE9UX1RJTUUgPSAweDEyLAorCUhXX1ZBUl9BQ0tfUFJFQU1CTEUgPSAweDEzLAorCUhXX1ZBUl9DV19DT05GSUcgPSAweDE0LAorCUhXX1ZBUl9DV19WQUxVRVMgPSAweDE1LAorCUhXX1ZBUl9SQVRFX0ZBTExCQUNLX0NPTlRST0w9IDB4MTYsCisJSFdfVkFSX0NPTlRFTlRJT05fV0lORE9XID0gMHgxNywKKwlIV19WQVJfUkVUUllfQ09VTlQgPSAweDE4LAorCUhXX1ZBUl9UUl9TV0lUQ0ggPSAweDE5LAorCUhXX1ZBUl9DT01NQU5EID0gMHgxYSwKKwlIV19WQVJfV1BBX0NPTkZJRyA9IDB4MWIsCisJSFdfVkFSX0FNUERVX01JTl9TUEFDRSA9IDB4MWMsCisJSFdfVkFSX1NIT1JUR0lfREVOU0lUWSA9IDB4MWQsCisJSFdfVkFSX0FNUERVX0ZBQ1RPUiA9IDB4MWUsCisJSFdfVkFSX01DU19SQVRFX0FWQUlMQUJMRSA9IDB4MWYsCisJSFdfVkFSX0FDX1BBUkFNID0gMHgyMCwKKwlIV19WQVJfQUNNX0NUUkwgPSAweDIxLAorCUhXX1ZBUl9ESVNfUmVxX1FzaXplID0gMHgyMiwKKwlIV19WQVJfQ0NYX0NITkxfTE9BRCA9IDB4MjMsCisJSFdfVkFSX0NDWF9OT0lTRV9ISVNUT0dSQU0gPSAweDI0LAorCUhXX1ZBUl9DQ1hfQ0xNX05ITSA9IDB4MjUsCisJSFdfVkFSX1R4T1BMaW1pdCA9IDB4MjYsCisJSFdfVkFSX1RVUkJPX01PREUgPSAweDI3LAorCUhXX1ZBUl9SRl9TVEFURSA9IDB4MjgsCisJSFdfVkFSX1JGX09GRl9CWV9IVyA9IDB4MjksCisJSFdfVkFSX0JVU19TUEVFRCA9IDB4MmEsCisJSFdfVkFSX1NFVF9ERVZfUE9XRVIgPSAweDJiLAogCi0JSFdfVkFSX1JDUiwKLQlIV19WQVJfUkFUUl8wLAotCUhXX1ZBUl9SUlNSLAotCUhXX1ZBUl9DUFVfUlNULAotCUhXX1ZBUl9DSEVDS19CU1NJRCwKLQlIV19WQVJfTEJLX01PREUsCi0JSFdfVkFSX0FFU18xMU5fRklYLAotCUhXX1ZBUl9VU0JfUlhfQUdHUiwKLQlIV19WQVJfVVNFUl9DT05UUk9MX1RVUkJPX01PREUsCi0JSFdfVkFSX1JFVFJZX0xJTUlULAotCUhXX1ZBUl9JTklUX1RYX1JBVEUsCi0JSFdfVkFSX1RYX1JBVEVfUkVHLAotCUhXX1ZBUl9FRlVTRV9VU0FHRSwKLQlIV19WQVJfRUZVU0VfQllURVMsCi0JSFdfVkFSX0FVVE9MT0FEX1NUQVRVUywKLQlIV19WQVJfUkZfMlJfRElTQUJMRSwKLQlIV19WQVJfU0VUX1JQV00sCi0JSFdfVkFSX0gyQ19GV19QV1JNT0RFLAotCUhXX1ZBUl9IMkNfRldfSk9JTkJTU1JQVCwKLQlIV19WQVJfSDJDX0ZXX01FRElBU1RBVFVTUlBULAotCUhXX1ZBUl9IMkNfRldfUDJQX1BTX09GRkxPQUQsCi0JSFdfVkFSX0ZXX1BTTU9ERV9TVEFUVVMsCi0JSFdfVkFSX0lOSVRfUlRTX1JBVEUsCi0JSFdfVkFSX1JFU1VNRV9DTEtfT04sCi0JSFdfVkFSX0ZXX0xQU19BQ1RJT04sCi0JSFdfVkFSXzFYMV9SRUNWX0NPTUJJTkUsCi0JSFdfVkFSX1NUT1BfU0VORF9CRUFDT04sCi0JSFdfVkFSX1RTRl9USU1FUiwKLQlIV19WQVJfSU9fQ01ELAorCUhXX1ZBUl9SQ1IgPSAweDJjLAorCUhXX1ZBUl9SQVRSXzAgPSAweDJkLAorCUhXX1ZBUl9SUlNSID0gMHgyZSwKKwlIV19WQVJfQ1BVX1JTVCA9IDB4MmYsCisJSFdfVkFSX0NIRUNLX0JTU0lEID0gMHgzMCwKKwlIV19WQVJfTEJLX01PREUgPSAweDMxLAorCUhXX1ZBUl9BRVNfMTFOX0ZJWCA9IDB4MzIsCisJSFdfVkFSX1VTQl9SWF9BR0dSID0gMHgzMywKKwlIV19WQVJfVVNFUl9DT05UUk9MX1RVUkJPX01PREUgPSAweDM0LAorCUhXX1ZBUl9SRVRSWV9MSU1JVCA9IDB4MzUsCisJSFdfVkFSX0lOSVRfVFhfUkFURSA9IDB4MzYsCisJSFdfVkFSX1RYX1JBVEVfUkVHID0gMHgzNywKKwlIV19WQVJfRUZVU0VfVVNBR0UgPSAweDM4LAorCUhXX1ZBUl9FRlVTRV9CWVRFUyA9IDB4MzksCisJSFdfVkFSX0FVVE9MT0FEX1NUQVRVUyA9IDB4M2EsCisJSFdfVkFSX1JGXzJSX0RJU0FCTEUgPSAweDNiLAorCUhXX1ZBUl9TRVRfUlBXTSA9IDB4M2MsCisJSFdfVkFSX0gyQ19GV19QV1JNT0RFID0gMHgzZCwKKwlIV19WQVJfSDJDX0ZXX0pPSU5CU1NSUFQgPSAweDNlLAorCUhXX1ZBUl9IMkNfRldfTUVESUFTVEFUVVNSUFQgPSAweDNmLAorCUhXX1ZBUl9IMkNfRldfUDJQX1BTX09GRkxPQUQgPSAweDQwLAorCUhXX1ZBUl9GV19QU01PREVfU1RBVFVTID0gMHg0MSwKKwlIV19WQVJfSU5JVF9SVFNfUkFURSA9IDB4NDIsCisJSFdfVkFSX1JFU1VNRV9DTEtfT04gPSAweDQzLAorCUhXX1ZBUl9GV19MUFNfQUNUSU9OID0gMHg0NCwKKwlIV19WQVJfMVgxX1JFQ1ZfQ09NQklORSA9IDB4NDUsCisJSFdfVkFSX1NUT1BfU0VORF9CRUFDT04gPSAweDQ2LAorCUhXX1ZBUl9UU0ZfVElNRVIgPSAweDQ3LAorCUhXX1ZBUl9JT19DTUQgPSAweDQ4LAogCi0JSFdfVkFSX1JGX1JFQ09WRVJZLAotCUhXX1ZBUl9IMkNfRldfVVBEQVRFX0dUSywKLQlIV19WQVJfV0ZfTUFTSywKLQlIV19WQVJfV0ZfQ1JDLAotCUhXX1ZBUl9XRl9JU19NQUNfQUREUiwKLQlIV19WQVJfSDJDX0ZXX09GRkxPQUQsCi0JSFdfVkFSX1JFU0VUX1dGQ1JDLAorCUhXX1ZBUl9SRl9SRUNPVkVSWSA9IDB4NDksCisJSFdfVkFSX0gyQ19GV19VUERBVEVfR1RLID0gMHg0YSwKKwlIV19WQVJfV0ZfTUFTSyA9IDB4NGIsCisJSFdfVkFSX1dGX0NSQyA9IDB4NGMsCisJSFdfVkFSX1dGX0lTX01BQ19BRERSID0gMHg0ZCwKKwlIV19WQVJfSDJDX0ZXX09GRkxPQUQgPSAweDRlLAorCUhXX1ZBUl9SRVNFVF9XRkNSQyA9IDB4NGYsCiAKLQlIV19WQVJfSEFORExFX0ZXX0MySCwKLQlIV19WQVJfRExfRldfUlNWRF9QQUdFLAotCUhXX1ZBUl9BSUQsCi0JSFdfVkFSX0hXX1NFUV9FTkFCTEUsCi0JSFdfVkFSX0NPUlJFQ1RfVFNGLAotCUhXX1ZBUl9CQ05fVkFMSUQsCi0JSFdfVkFSX0ZXTFBTX1JGX09OLAotCUhXX1ZBUl9EVUFMX1RTRl9SU1QsCi0JSFdfVkFSX1NXSVRDSF9FUEhZX1dvV0xBTiwKLQlIV19WQVJfSU5UX01JR1JBVElPTiwKLQlIV19WQVJfSU5UX0FDLAotCUhXX1ZBUl9SRl9USU1JTkcsCisJSFdfVkFSX0hBTkRMRV9GV19DMkggPSAweDUwLAorCUhXX1ZBUl9ETF9GV19SU1ZEX1BBR0UgPSAweDUxLAorCUhXX1ZBUl9BSUQgPSAweDUyLAorCUhXX1ZBUl9IV19TRVFfRU5BQkxFID0gMHg1MywKKwlIV19WQVJfQ09SUkVDVF9UU0YgPSAweDU0LAorCUhXX1ZBUl9CQ05fVkFMSUQgPSAweDU1LAorCUhXX1ZBUl9GV0xQU19SRl9PTiA9IDB4NTYsCisJSFdfVkFSX0RVQUxfVFNGX1JTVCA9IDB4NTcsCisJSFdfVkFSX1NXSVRDSF9FUEhZX1dvV0xBTiA9IDB4NTgsCisJSFdfVkFSX0lOVF9NSUdSQVRJT04gPSAweDU5LAorCUhXX1ZBUl9JTlRfQUMgPSAweDVhLAorCUhXX1ZBUl9SRl9USU1JTkcgPSAweDViLAogCi0JSEFMX0RFRl9XT1dMQU4sCi0JSFdfVkFSX01SQywKLQlIV19WQVJfS0VFUF9BTElWRSwKLQlIV19WQVJfTkFWX1VQUEVSLAorCUhBTF9ERUZfV09XTEFOID0gMHg1YywKKwlIV19WQVJfTVJDID0gMHg1ZCwKKwlIV19WQVJfS0VFUF9BTElWRSA9IDB4NWUsCisJSFdfVkFSX05BVl9VUFBFUiA9IDB4NWYsCiAKLQlIV19WQVJfTUdUX0ZJTFRFUiwKLQlIV19WQVJfQ1RSTF9GSUxURVIsCi0JSFdfVkFSX0RBVEFfRklMVEVSLAorCUhXX1ZBUl9NR1RfRklMVEVSID0gMHg2MCwKKwlIV19WQVJfQ1RSTF9GSUxURVIgPSAweDYxLAorCUhXX1ZBUl9EQVRBX0ZJTFRFUiA9IDB4NjIsCiB9OwogCiBlbnVtIHJ0X21lZGlhX3N0YXR1cyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvYWN4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvYWN4LmMKaW5kZXggNGJlMDQwOS4uYjU1MjVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2FjeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9hY3guYwpAQCAtMzA5LDMgKzMwOSwzMiBAQAogCWtmcmVlKGFjeCk7CiAJcmV0dXJuIHJldDsKIH0KKworaW50IHdsMTh4eF9hY3hfdGltZV9zeW5jX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK3sKKwlzdHJ1Y3QgYWN4X3RpbWVfc3luY19jZmcgKmFjeDsKKwlpbnQgcmV0OworCisJd2wxMjcxX2RlYnVnKERFQlVHX0FDWCwgImFjeCB0aW1lIHN5bmMgY2ZnOiBtb2RlICVkLCBhZGRyOiAlcE0iLAorCQkgICAgIHdsLT5jb25mLnNnLnBhcmFtc1tXTDE4WFhfQ09ORl9TR19USU1FX1NZTkNdLAorCQkgICAgIHdsLT56b25lX21hc3Rlcl9tYWNfYWRkcik7CisKKwlhY3ggPSBremFsbG9jKHNpemVvZigqYWN4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhY3gpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJYWN4LT5zeW5jX21vZGUgPSB3bC0+Y29uZi5zZy5wYXJhbXNbV0wxOFhYX0NPTkZfU0dfVElNRV9TWU5DXTsKKwltZW1jcHkoYWN4LT56b25lX21hY19hZGRyLCB3bC0+em9uZV9tYXN0ZXJfbWFjX2FkZHIsIEVUSF9BTEVOKTsKKworCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfVElNRV9TWU5DX0NGRywKKwkJCQkgICBhY3gsIHNpemVvZigqYWN4KSk7CisJaWYgKHJldCA8IDApIHsKKwkJd2wxMjcxX3dhcm5pbmcoImFjeCB0aW1lIHN5bmMgY2ZnIGZhaWxlZDogJWQiLCByZXQpOworCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJa2ZyZWUoYWN4KTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2FjeC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2FjeC5oCmluZGV4IDM0MmEyOTkuLjJlZGJiYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9hY3guaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvYWN4LmgKQEAgLTM3LDYgKzM3LDcgQEAKIAlBQ1hfUlhfQkFfRklMVEVSCQkgPSAweDAwNTgsCiAJQUNYX0FQX1NMRUVQX0NGRyAgICAgICAgICAgICAgICAgPSAweDAwNTksCiAJQUNYX0RZTkFNSUNfVFJBQ0VTX0NGRwkJID0gMHgwMDVBLAorCUFDWF9USU1FX1NZTkNfQ0ZHCQkgPSAweDAwNUIsCiB9OwogCiAvKiBudW1iZXJzIG9mIGJpdHMgdGhlIGxlbmd0aCBmaWVsZCB0YWtlcyAoYWRkIDEgZm9yIHRoZSBhY3R1YWwgbnVtYmVyKSAqLwpAQCAtMzg4LDYgKzM4OSwxNyBAQAogCV9fbGUzMiBkeW5hbWljX2Z3X3RyYWNlczsKIH0gX19wYWNrZWQ7CiAKKy8qCisgKiBBQ1hfVElNRV9TWU5DX0NGRworICogY29uZmlndXJlIHRoZSB0aW1lIHN5bmMgcGFyYW1ldGVycworICovCitzdHJ1Y3QgYWN4X3RpbWVfc3luY19jZmcgeworCXN0cnVjdCBhY3hfaGVhZGVyIGhlYWRlcjsKKwl1OCBzeW5jX21vZGU7CisJdTggem9uZV9tYWNfYWRkcltFVEhfQUxFTl07CisJdTggcGFkZGluZ1sxXTsKK30gX19wYWNrZWQ7CisKIGludCB3bDE4eHhfYWN4X2hvc3RfaWZfY2ZnX2JpdG1hcChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIGhvc3RfY2ZnX2JpdG1hcCwKIAkJCQkgIHUzMiBzZGlvX2Jsa19zaXplLCB1MzIgZXh0cmFfbWVtX2Jsa3MsCiAJCQkJICB1MzIgbGVuX2ZpZWxkX3NpemUpOwpAQCAtNDAyLDUgKzQxNCw2IEBACiBpbnQgd2wxOHh4X2FjeF9yeF9iYV9maWx0ZXIoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgYWN0aW9uKTsKIGludCB3bDE4eHhfYWN4X2FwX3NsZWVwKHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDE4eHhfYWN4X2R5bmFtaWNfZndfdHJhY2VzKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDE4eHhfYWN4X3RpbWVfc3luY19jZmcoc3RydWN0IHdsMTI3MSAqd2wpOwogCiAjZW5kaWYgLyogX19XTDE4WFhfQUNYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2V2ZW50LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvZXZlbnQuYwppbmRleCAyYzVkZjQzLi5iMzZjZTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvZXZlbnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvZXZlbnQuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KICNpbmNsdWRlICJldmVudC5oIgogI2luY2x1ZGUgInNjYW4uaCIKKyNpbmNsdWRlICJjb25mLmgiCiAjaW5jbHVkZSAiLi4vd2xjb3JlL2NtZC5oIgogI2luY2x1ZGUgIi4uL3dsY29yZS9kZWJ1Zy5oIgogI2luY2x1ZGUgIi4uL3dsY29yZS92ZW5kb3JfY21kLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L21haW4uYwppbmRleCAwMGEwNGRmLi4wNmQ2OTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9tYWluLmMKQEAgLTEzOTcsMjUgKzEzOTcsMjQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZGVmaW5lIFdMMThYWF9DT05GX0ZJTEVfTkFNRSAidGktY29ubmVjdGl2aXR5L3dsMTh4eC1jb25mLmJpbiIKLQogc3RhdGljIGludCB3bDE4eHhfbG9hZF9jb25mX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgd2xjb3JlX2NvbmYgKmNvbmYsCi0JCQkJIHN0cnVjdCB3bDE4eHhfcHJpdl9jb25mICpwcml2X2NvbmYpCisJCQkJIHN0cnVjdCB3bDE4eHhfcHJpdl9jb25mICpwcml2X2NvbmYsCisJCQkJIGNvbnN0IGNoYXIgKmZpbGUpCiB7CiAJc3RydWN0IHdsY29yZV9jb25mX2ZpbGUgKmNvbmZfZmlsZTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwogCWludCByZXQ7CiAKLQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgV0wxOFhYX0NPTkZfRklMRV9OQU1FLCBkZXYpOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlLCBkZXYpOwogCWlmIChyZXQgPCAwKSB7CiAJCXdsMTI3MV9lcnJvcigiY291bGQgbm90IGdldCBjb25maWd1cmF0aW9uIGJpbmFyeSAlczogJWQiLAotCQkJICAgICBXTDE4WFhfQ09ORl9GSUxFX05BTUUsIHJldCk7CisJCQkgICAgIGZpbGUsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJaWYgKGZ3LT5zaXplICE9IFdMMThYWF9DT05GX1NJWkUpIHsKLQkJd2wxMjcxX2Vycm9yKCJjb25maWd1cmF0aW9uIGJpbmFyeSBmaWxlIHNpemUgaXMgd3JvbmcsIGV4cGVjdGVkICV6dSBnb3QgJXp1IiwKLQkJCSAgICAgV0wxOFhYX0NPTkZfU0laRSwgZnctPnNpemUpOworCQl3bDEyNzFfZXJyb3IoIiVzIGNvbmZpZ3VyYXRpb24gYmluYXJ5IHNpemUgaXMgd3JvbmcsIGV4cGVjdGVkICV6dSBnb3QgJXp1IiwKKwkJCSAgICAgZmlsZSwgV0wxOFhYX0NPTkZfU0laRSwgZnctPnNpemUpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KQEAgLTE0NDgsOSArMTQ0NywxMiBAQAogCiBzdGF0aWMgaW50IHdsMTh4eF9jb25mX2luaXQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gd2wtPnBkZXY7CisJc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgd2wxOHh4X3ByaXYgKnByaXYgPSB3bC0+cHJpdjsKIAotCWlmICh3bDE4eHhfbG9hZF9jb25mX2ZpbGUoZGV2LCAmd2wtPmNvbmYsICZwcml2LT5jb25mKSA8IDApIHsKKwlpZiAod2wxOHh4X2xvYWRfY29uZl9maWxlKGRldiwgJndsLT5jb25mLCAmcHJpdi0+Y29uZiwKKwkJCQkgIHBkYXRhLT5mYW1pbHktPmNmZ19uYW1lKSA8IDApIHsKIAkJd2wxMjcxX3dhcm5pbmcoImZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGNvbmZpZyIpOwogCiAJCS8qIGFwcGx5IGRyaXZlciBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KQEAgLTIxNDEsNCArMjE0MywzIEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CiBNT0RVTEVfQVVUSE9SKCJMdWNpYW5vIENvZWxobyA8Y29lbGhvQHRpLmNvbT4iKTsKIE1PRFVMRV9GSVJNV0FSRShXTDE4WFhfRldfTkFNRSk7Ci1NT0RVTEVfRklSTVdBUkUoV0wxOFhYX0NPTkZfRklMRV9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9ib290LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvYm9vdC5jCmluZGV4IGY3NWQzMDQuLmYwMDUwOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9ib290LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL2Jvb3QuYwpAQCAtMjgyLDYgKzI4Miw5IEBACiAKIGludCB3bGNvcmVfYm9vdF91cGxvYWRfbnZzKHN0cnVjdCB3bDEyNzEgKndsKQogeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB3bC0+cGRldjsKKwlzdHJ1Y3Qgd2xjb3JlX3BsYXRkZXZfZGF0YSAqcGRldl9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwljb25zdCBjaGFyICpudnNfbmFtZSA9ICJ1bmtub3duIjsKIAlzaXplX3QgbnZzX2xlbiwgYnVyc3RfbGVuOwogCWludCBpOwogCXUzMiBkZXN0X2FkZHIsIHZhbDsKQEAgLTI5Myw2ICsyOTYsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlpZiAocGRldl9kYXRhICYmIHBkZXZfZGF0YS0+ZmFtaWx5KQorCQludnNfbmFtZSA9IHBkZXZfZGF0YS0+ZmFtaWx5LT5udnNfbmFtZTsKKwogCWlmICh3bC0+cXVpcmtzICYgV0xDT1JFX1FVSVJLX0xFR0FDWV9OVlMpIHsKIAkJc3RydWN0IHdsMTI3MV9udnNfZmlsZSAqbnZzID0KIAkJCShzdHJ1Y3Qgd2wxMjcxX252c19maWxlICopd2wtPm52czsKQEAgLTMxMCw4ICszMTYsOSBAQAogCQlpZiAod2wtPm52c19sZW4gIT0gc2l6ZW9mKHN0cnVjdCB3bDEyNzFfbnZzX2ZpbGUpICYmCiAJCSAgICAod2wtPm52c19sZW4gIT0gV0wxMjcxX0lOSV9MRUdBQ1lfTlZTX0ZJTEVfU0laRSB8fAogCQkgICAgIHdsLT5lbmFibGVfMTFhKSkgewotCQkJd2wxMjcxX2Vycm9yKCJudnMgc2l6ZSBpcyBub3QgYXMgZXhwZWN0ZWQ6ICV6dSAhPSAlenUiLAotCQkJCXdsLT5udnNfbGVuLCBzaXplb2Yoc3RydWN0IHdsMTI3MV9udnNfZmlsZSkpOworCQkJd2wxMjcxX2Vycm9yKCIlcyBzaXplIGlzIG5vdCBhcyBleHBlY3RlZDogJXp1ICE9ICV6dSIsCisJCQkJICAgICBudnNfbmFtZSwgd2wtPm52c19sZW4sCisJCQkJICAgICBzaXplb2Yoc3RydWN0IHdsMTI3MV9udnNfZmlsZSkpOwogCQkJa2ZyZWUod2wtPm52cyk7CiAJCQl3bC0+bnZzID0gTlVMTDsKIAkJCXdsLT5udnNfbGVuID0gMDsKQEAgLTMyOCw4ICszMzUsOCBAQAogCQkJaWYgKG52cy0+Z2VuZXJhbF9wYXJhbXMuZHVhbF9tb2RlX3NlbGVjdCkKIAkJCQl3bC0+ZW5hYmxlXzExYSA9IHRydWU7CiAJCX0gZWxzZSB7Ci0JCQl3bDEyNzFfZXJyb3IoIm52cyBzaXplIGlzIG5vdCBhcyBleHBlY3RlZDogJXp1ICE9ICV6dSIsCi0JCQkJICAgICB3bC0+bnZzX2xlbiwKKwkJCXdsMTI3MV9lcnJvcigiJXMgc2l6ZSBpcyBub3QgYXMgZXhwZWN0ZWQ6ICV6dSAhPSAlenUiLAorCQkJCSAgICAgbnZzX25hbWUsIHdsLT5udnNfbGVuLAogCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB3bDEyOHhfbnZzX2ZpbGUpKTsKIAkJCWtmcmVlKHdsLT5udnMpOwogCQkJd2wtPm52cyA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL21haW4uYwppbmRleCA5ZTFmMmQ5Li40NzE1MjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9tYWluLmMKQEAgLTQ5ODYsNyArNDk4Niw2IEBACiAJCXJldHVybiByZXQ7CiAKIAl3bF9zdGEgPSAoc3RydWN0IHdsMTI3MV9zdGF0aW9uICopc3RhLT5kcnZfcHJpdjsKLQl3bF9zdGEtPndsID0gd2w7CiAJaGxpZCA9IHdsX3N0YS0+aGxpZDsKIAogCXJldCA9IHdsMTJ4eF9jbWRfYWRkX3BlZXIod2wsIHdsdmlmLCBzdGEsIGhsaWQpOwpAQCAtNjQxNCw5ICs2NDEzLDEyIEBACiAJCQlnb3RvIG91dDsKIAkJfQogCQl3bC0+bnZzX2xlbiA9IGZ3LT5zaXplOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChwZGV2X2RhdGEtPmZhbWlseS0+bnZzX25hbWUpIHsKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0JPT1QsICJDb3VsZCBub3QgZ2V0IG52cyBmaWxlICVzIiwKLQkJCSAgICAgV0wxMlhYX05WU19OQU1FKTsKKwkJCSAgICAgcGRldl9kYXRhLT5mYW1pbHktPm52c19uYW1lKTsKKwkJd2wtPm52cyA9IE5VTEw7CisJCXdsLT5udnNfbGVuID0gMDsKKwl9IGVsc2UgewogCQl3bC0+bnZzID0gTlVMTDsKIAkJd2wtPm52c19sZW4gPSAwOwogCX0KQEAgLTY1MTEsMjEgKzY1MTMsMjkgQEAKIAogaW50IHdsY29yZV9wcm9iZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpbnQgcmV0OworCXN0cnVjdCB3bGNvcmVfcGxhdGRldl9kYXRhICpwZGV2X2RhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOworCWNvbnN0IGNoYXIgKm52c19uYW1lOworCWludCByZXQgPSAwOwogCi0JaWYgKCF3bC0+b3BzIHx8ICF3bC0+cHRhYmxlKQorCWlmICghd2wtPm9wcyB8fCAhd2wtPnB0YWJsZSB8fCAhcGRldl9kYXRhKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXdsLT5kZXYgPSAmcGRldi0+ZGV2OwogCXdsLT5wZGV2ID0gcGRldjsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3bCk7CiAKLQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgRldfQUNUSU9OX0hPVFBMVUcsCi0JCQkJICAgICAgV0wxMlhYX05WU19OQU1FLCAmcGRldi0+ZGV2LCBHRlBfS0VSTkVMLAotCQkJCSAgICAgIHdsLCB3bGNvcmVfbnZzX2NiKTsKLQlpZiAocmV0IDwgMCkgewotCQl3bDEyNzFfZXJyb3IoInJlcXVlc3RfZmlybXdhcmVfbm93YWl0IGZhaWxlZDogJWQiLCByZXQpOwotCQljb21wbGV0ZV9hbGwoJndsLT5udnNfbG9hZGluZ19jb21wbGV0ZSk7CisJaWYgKHBkZXZfZGF0YS0+ZmFtaWx5ICYmIHBkZXZfZGF0YS0+ZmFtaWx5LT5udnNfbmFtZSkgeworCQludnNfbmFtZSA9IHBkZXZfZGF0YS0+ZmFtaWx5LT5udnNfbmFtZTsKKwkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIEZXX0FDVElPTl9IT1RQTFVHLAorCQkJCQkgICAgICBudnNfbmFtZSwgJnBkZXYtPmRldiwgR0ZQX0tFUk5FTCwKKwkJCQkJICAgICAgd2wsIHdsY29yZV9udnNfY2IpOworCQlpZiAocmV0IDwgMCkgeworCQkJd2wxMjcxX2Vycm9yKCJyZXF1ZXN0X2Zpcm13YXJlX25vd2FpdCBmYWlsZWQgZm9yICVzOiAlZCIsCisJCQkJICAgICBudnNfbmFtZSwgcmV0KTsKKwkJCWNvbXBsZXRlX2FsbCgmd2wtPm52c19sb2FkaW5nX2NvbXBsZXRlKTsKKwkJfQorCX0gZWxzZSB7CisJCXdsY29yZV9udnNfY2IoTlVMTCwgd2wpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC02NTM0LDkgKzY1NDQsMTEgQEAKIAogaW50IHdsY29yZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3Qgd2xjb3JlX3BsYXRkZXZfZGF0YSAqcGRldl9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmd2wtPm52c19sb2FkaW5nX2NvbXBsZXRlKTsKKwlpZiAocGRldl9kYXRhLT5mYW1pbHkgJiYgcGRldl9kYXRhLT5mYW1pbHktPm52c19uYW1lKQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3bC0+bnZzX2xvYWRpbmdfY29tcGxldGUpOwogCWlmICghd2wtPmluaXRpYWxpemVkKQogCQlyZXR1cm4gMDsKIApAQCAtNjU3Myw0ICs2NTg1LDMgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkx1Y2lhbm8gQ29lbGhvIDxjb2VsaG9AdGkuY29tPiIpOwogTU9EVUxFX0FVVEhPUigiSnV1c28gT2lrYXJpbmVuIDxqdXVzby5vaWthcmluZW5Abm9raWEuY29tPiIpOwotTU9EVUxFX0ZJUk1XQVJFKFdMMTJYWF9OVlNfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvc2Rpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3NkaW8uYwppbmRleCA1ODM5YWNiLi5hNmU5NGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9zZGlvLmMKQEAgLTIxNiwxNyArMjE2LDMzIEBACiB9OwogCiAjaWZkZWYgQ09ORklHX09GCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2lsaW5rX2ZhbWlseV9kYXRhIHdsMTI3eF9kYXRhID0geworCS5uYW1lID0gIndsMTI3eCIsCisJLm52c19uYW1lID0gInRpLWNvbm5lY3Rpdml0eS93bDEyN3gtbnZzLmJpbiIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdpbGlua19mYW1pbHlfZGF0YSB3bDEyOHhfZGF0YSA9IHsKKwkubmFtZSA9ICJ3bDEyOHgiLAorCS5udnNfbmFtZSA9ICJ0aS1jb25uZWN0aXZpdHkvd2wxMjh4LW52cy5iaW4iLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3aWxpbmtfZmFtaWx5X2RhdGEgd2wxOHh4X2RhdGEgPSB7CisJLm5hbWUgPSAid2wxOHh4IiwKKwkuY2ZnX25hbWUgPSAidGktY29ubmVjdGl2aXR5L3dsMTh4eC1jb25mLmJpbiIsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bGNvcmVfc2Rpb19vZl9tYXRjaF90YWJsZVtdID0gewotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjcxIiB9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjczIiB9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjgxIiB9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjgzIiB9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODAxIiB9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODA1IiB9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODA3IiB9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODMxIiB9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODM1IiB9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODM3IiB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjcxIiwgLmRhdGEgPSAmd2wxMjd4X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTI3MyIsIC5kYXRhID0gJndsMTI3eF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDEyODEiLCAuZGF0YSA9ICZ3bDEyOHhfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjgzIiwgLmRhdGEgPSAmd2wxMjh4X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgwMSIsIC5kYXRhID0gJndsMTh4eF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MDUiLCAuZGF0YSA9ICZ3bDE4eHhfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODA3IiwgLmRhdGEgPSAmd2wxOHh4X2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLHdsMTgzMSIsIC5kYXRhID0gJndsMTh4eF9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSx3bDE4MzUiLCAuZGF0YSA9ICZ3bDE4eHhfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODM3IiwgLmRhdGEgPSAmd2wxOHh4X2RhdGEgfSwKIAl7IH0KIH07CiAKQEAgLTIzNCw5ICsyNTAsMTMgQEAKIAkJCSAgIHN0cnVjdCB3bGNvcmVfcGxhdGRldl9kYXRhICpwZGV2X2RhdGEpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKIAotCWlmICghbnAgfHwgIW9mX21hdGNoX25vZGUod2xjb3JlX3NkaW9fb2ZfbWF0Y2hfdGFibGUsIG5wKSkKLQkJcmV0dXJuIC1FTk9EQVRBOworCW9mX2lkID0gb2ZfbWF0Y2hfbm9kZSh3bGNvcmVfc2Rpb19vZl9tYXRjaF90YWJsZSwgbnApOworCWlmICghb2ZfaWQpCisJCXJldHVybiAtRU5PREVWOworCisJcGRldl9kYXRhLT5mYW1pbHkgPSBvZl9pZC0+ZGF0YTsKIAogCSppcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CiAJaWYgKCEqaXJxKSB7CkBAIC0yNjMsNyArMjgzLDcgQEAKIHN0YXRpYyBpbnQgd2wxMjcxX3Byb2JlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMsCiAJCQkJICBjb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgKmlkKQogewotCXN0cnVjdCB3bGNvcmVfcGxhdGRldl9kYXRhIHBkZXZfZGF0YTsKKwlzdHJ1Y3Qgd2xjb3JlX3BsYXRkZXZfZGF0YSAqcGRldl9kYXRhOwogCXN0cnVjdCB3bDEyeHhfc2Rpb19nbHVlICpnbHVlOwogCXN0cnVjdCByZXNvdXJjZSByZXNbMV07CiAJbW1jX3BtX2ZsYWdfdCBtbWNmbGFnczsKQEAgLTI3NSwxNCArMjk1LDE1IEBACiAJaWYgKGZ1bmMtPm51bSAhPSAweDAyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW1lbXNldCgmcGRldl9kYXRhLCAweDAwLCBzaXplb2YocGRldl9kYXRhKSk7Ci0JcGRldl9kYXRhLmlmX29wcyA9ICZzZGlvX29wczsKKwlwZGV2X2RhdGEgPSBkZXZtX2t6YWxsb2MoJmZ1bmMtPmRldiwgc2l6ZW9mKCpwZGV2X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkZXZfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlnbHVlID0ga3phbGxvYyhzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWdsdWUpIHsKLQkJZGV2X2VycigmZnVuYy0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgZ2x1ZVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KKwlwZGV2X2RhdGEtPmlmX29wcyA9ICZzZGlvX29wczsKKworCWdsdWUgPSBkZXZtX2t6YWxsb2MoJmZ1bmMtPmRldiwgc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnbHVlKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWdsdWUtPmRldiA9ICZmdW5jLT5kZXY7CiAKQEAgLTI5MiwxNiArMzEzLDE2IEBACiAJLyogVXNlIGJsb2NrIG1vZGUgZm9yIHRyYW5zZmVycmluZyBvdmVyIG9uZSBibG9jayBzaXplIG9mIGRhdGEgKi8KIAlmdW5jLT5jYXJkLT5xdWlya3MgfD0gTU1DX1FVSVJLX0JMS1NaX0ZPUl9CWVRFX01PREU7CiAKLQlyZXQgPSB3bGNvcmVfcHJvYmVfb2YoJmZ1bmMtPmRldiwgJmlycSwgJnBkZXZfZGF0YSk7CisJcmV0ID0gd2xjb3JlX3Byb2JlX29mKCZmdW5jLT5kZXYsICZpcnEsIHBkZXZfZGF0YSk7CiAJaWYgKHJldCkKLQkJZ290byBvdXRfZnJlZV9nbHVlOworCQlnb3RvIG91dDsKIAogCS8qIGlmIHNkaW8gY2FuIGtlZXAgcG93ZXIgd2hpbGUgaG9zdCBpcyBzdXNwZW5kZWQsIGVuYWJsZSB3b3cgKi8KIAltbWNmbGFncyA9IHNkaW9fZ2V0X2hvc3RfcG1fY2FwcyhmdW5jKTsKIAlkZXZfZGJnKGdsdWUtPmRldiwgInNkaW8gUE0gY2FwcyA9IDB4JXhcbiIsIG1tY2ZsYWdzKTsKIAogCWlmIChtbWNmbGFncyAmIE1NQ19QTV9LRUVQX1BPV0VSKQotCQlwZGV2X2RhdGEucHdyX2luX3N1c3BlbmQgPSB0cnVlOworCQlwZGV2X2RhdGEtPnB3cl9pbl9zdXNwZW5kID0gdHJ1ZTsKIAogCXNkaW9fc2V0X2RydmRhdGEoZnVuYywgZ2x1ZSk7CiAKQEAgLTMyMyw3ICszNDQsNyBAQAogCWlmICghZ2x1ZS0+Y29yZSkgewogCQlkZXZfZXJyKGdsdWUtPmRldiwgImNhbid0IGFsbG9jYXRlIHBsYXRmb3JtX2RldmljZSIpOwogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9mcmVlX2dsdWU7CisJCWdvdG8gb3V0OwogCX0KIAogCWdsdWUtPmNvcmUtPmRldi5wYXJlbnQgPSAmZnVuYy0+ZGV2OwpAQCAtMzQxLDggKzM2Miw4IEBACiAJCWdvdG8gb3V0X2Rldl9wdXQ7CiAJfQogCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGdsdWUtPmNvcmUsICZwZGV2X2RhdGEsCi0JCQkJICAgICAgIHNpemVvZihwZGV2X2RhdGEpKTsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoZ2x1ZS0+Y29yZSwgcGRldl9kYXRhLAorCQkJCSAgICAgICBzaXplb2YoKnBkZXZfZGF0YSkpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihnbHVlLT5kZXYsICJjYW4ndCBhZGQgcGxhdGZvcm0gZGF0YVxuIik7CiAJCWdvdG8gb3V0X2Rldl9wdXQ7CkBAIC0zNTgsOSArMzc5LDYgQEAKIG91dF9kZXZfcHV0OgogCXBsYXRmb3JtX2RldmljZV9wdXQoZ2x1ZS0+Y29yZSk7CiAKLW91dF9mcmVlX2dsdWU6Ci0Ja2ZyZWUoZ2x1ZSk7Ci0KIG91dDoKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3NwaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3NwaS5jCmluZGV4IDZkMjQwNDAuLmY5NDlhZDJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3NwaS5jCkBAIC03OSwxOSArNzksMTkgQEAKICNkZWZpbmUgV1NQSV9NQVhfTlVNX09GX0NIVU5LUyBcCiAJKChTUElfQUdHUl9CVUZGRVJfU0laRSAvIFdTUElfTUFYX0NIVU5LX1NJWkUpICsgMSkKIAotCi1zdHJ1Y3Qgd2lsaW5rX2ZhbWlsaXlfZGF0YSB7Ci0JY2hhciBuYW1lWzhdOworc3RhdGljIGNvbnN0IHN0cnVjdCB3aWxpbmtfZmFtaWx5X2RhdGEgd2wxMjd4X2RhdGEgPSB7CisJLm5hbWUgPSAid2wxMjd4IiwKKwkubnZzX25hbWUgPSAidGktY29ubmVjdGl2aXR5L3dsMTI3eC1udnMuYmluIiwKIH07CiAKLWNvbnN0IHN0cnVjdCB3aWxpbmtfZmFtaWxpeV9kYXRhICp3aWxpbmtfZGF0YTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2lsaW5rX2ZhbWlseV9kYXRhIHdsMTI4eF9kYXRhID0geworCS5uYW1lID0gIndsMTI4eCIsCisJLm52c19uYW1lID0gInRpLWNvbm5lY3Rpdml0eS93bDEyOHgtbnZzLmJpbiIsCit9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdpbGlua19mYW1pbGl5X2RhdGEgd2wxOHh4X2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHdpbGlua19mYW1pbHlfZGF0YSB3bDE4eHhfZGF0YSA9IHsKIAkubmFtZSA9ICJ3bDE4eHgiLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCB3aWxpbmtfZmFtaWxpeV9kYXRhIHdsMTJ4eF9kYXRhID0gewotCS5uYW1lID0gIndsMTJ4eCIsCisJLmNmZ19uYW1lID0gInRpLWNvbm5lY3Rpdml0eS93bDE4eHgtY29uZi5iaW4iLAogfTsKIAogc3RydWN0IHdsMTJ4eF9zcGlfZ2x1ZSB7CkBAIC00MjksMTAgKzQyOSwxMCBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd2xjb3JlX3NwaV9vZl9tYXRjaF90YWJsZVtdID0gewotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjcxIiwgLmRhdGEgPSAmd2wxMnh4X2RhdGF9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjczIiwgLmRhdGEgPSAmd2wxMnh4X2RhdGF9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjgxIiwgLmRhdGEgPSAmd2wxMnh4X2RhdGF9LAotCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjgzIiwgLmRhdGEgPSAmd2wxMnh4X2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjcxIiwgLmRhdGEgPSAmd2wxMjd4X2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjczIiwgLmRhdGEgPSAmd2wxMjd4X2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjgxIiwgLmRhdGEgPSAmd2wxMjh4X2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAidGksd2wxMjgzIiwgLmRhdGEgPSAmd2wxMjh4X2RhdGF9LAogCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODAxIiwgLmRhdGEgPSAmd2wxOHh4X2RhdGF9LAogCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODA1IiwgLmRhdGEgPSAmd2wxOHh4X2RhdGF9LAogCXsgLmNvbXBhdGlibGUgPSAidGksd2wxODA3IiwgLmRhdGEgPSAmd2wxOHh4X2RhdGF9LApAQCAtNDYwLDkgKzQ2MCw5IEBACiAJaWYgKCFvZl9pZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQl3aWxpbmtfZGF0YSA9IG9mX2lkLT5kYXRhOwotCWRldl9pbmZvKCZzcGktPmRldiwgInNlbGVjdGVkIGNoaXAgZmFtaWxpeSBpcyAlc1xuIiwKLQkJIHdpbGlua19kYXRhLT5uYW1lKTsKKwlwZGV2X2RhdGEtPmZhbWlseSA9IG9mX2lkLT5kYXRhOworCWRldl9pbmZvKCZzcGktPmRldiwgInNlbGVjdGVkIGNoaXAgZmFtaWx5IGlzICVzXG4iLAorCQkgcGRldl9kYXRhLT5mYW1pbHktPm5hbWUpOwogCiAJaWYgKG9mX2ZpbmRfcHJvcGVydHkoZHRfbm9kZSwgImNsb2NrLXh0YWwiLCBOVUxMKSkKIAkJcGRldl9kYXRhLT5yZWZfY2xvY2tfeHRhbCA9IHRydWU7CkBAIC00NzksMTMgKzQ3OSwxNSBAQAogc3RhdGljIGludCB3bDEyNzFfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlzdHJ1Y3Qgd2wxMnh4X3NwaV9nbHVlICpnbHVlOwotCXN0cnVjdCB3bGNvcmVfcGxhdGRldl9kYXRhIHBkZXZfZGF0YTsKKwlzdHJ1Y3Qgd2xjb3JlX3BsYXRkZXZfZGF0YSAqcGRldl9kYXRhOwogCXN0cnVjdCByZXNvdXJjZSByZXNbMV07CiAJaW50IHJldDsKIAotCW1lbXNldCgmcGRldl9kYXRhLCAweDAwLCBzaXplb2YocGRldl9kYXRhKSk7CisJcGRldl9kYXRhID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpwZGV2X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkZXZfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlwZGV2X2RhdGEuaWZfb3BzID0gJnNwaV9vcHM7CisJcGRldl9kYXRhLT5pZl9vcHMgPSAmc3BpX29wczsKIAogCWdsdWUgPSBkZXZtX2t6YWxsb2MoJnNwaS0+ZGV2LCBzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdsdWUpIHsKQEAgLTUwOSw3ICs1MTEsNyBAQAogCQlyZXR1cm4gUFRSX0VSUihnbHVlLT5yZWcpOwogCX0KIAotCXJldCA9IHdsY29yZV9wcm9iZV9vZihzcGksIGdsdWUsICZwZGV2X2RhdGEpOworCXJldCA9IHdsY29yZV9wcm9iZV9vZihzcGksIGdsdWUsIHBkZXZfZGF0YSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGdsdWUtPmRldiwKIAkJCSJjYW4ndCBnZXQgZGV2aWNlIHRyZWUgcGFyYW1ldGVycyAoJWQpXG4iLCByZXQpOwpAQCAtNTIyLDcgKzUyNCw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JZ2x1ZS0+Y29yZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyh3aWxpbmtfZGF0YS0+bmFtZSwKKwlnbHVlLT5jb3JlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKHBkZXZfZGF0YS0+ZmFtaWx5LT5uYW1lLAogCQkJCQkgICBQTEFURk9STV9ERVZJRF9BVVRPKTsKIAlpZiAoIWdsdWUtPmNvcmUpIHsKIAkJZGV2X2VycihnbHVlLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBwbGF0Zm9ybV9kZXZpY2VcbiIpOwpAQCAtNTQzLDggKzU0NSw4IEBACiAJCWdvdG8gb3V0X2Rldl9wdXQ7CiAJfQogCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGdsdWUtPmNvcmUsICZwZGV2X2RhdGEsCi0JCQkJICAgICAgIHNpemVvZihwZGV2X2RhdGEpKTsKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkX2RhdGEoZ2x1ZS0+Y29yZSwgcGRldl9kYXRhLAorCQkJCSAgICAgICBzaXplb2YoKnBkZXZfZGF0YSkpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihnbHVlLT5kZXYsICJjYW4ndCBhZGQgcGxhdGZvcm0gZGF0YVxuIik7CiAJCWdvdG8gb3V0X2Rldl9wdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvd2xjb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvd2xjb3JlLmgKaW5kZXggOGYyOGFhMC4uMTgyNzU0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3dsY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS93bGNvcmUuaApAQCAtNTAxLDYgKzUwMSw5IEBACiAKIAkvKiBkeW5hbWljIGZ3IHRyYWNlcyAqLwogCXUzMiBkeW5hbWljX2Z3X3RyYWNlczsKKworCS8qIHRpbWUgc3luYyB6b25lIG1hc3RlciAqLworCXU4IHpvbmVfbWFzdGVyX21hY19hZGRyW0VUSF9BTEVOXTsKIH07CiAKIGludCB3bGNvcmVfcHJvYmUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL3dsY29yZV9pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvd2xjb3JlX2kuaAppbmRleCAyNDJiNGUzLi5lODQwOTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvd2xjb3JlX2kuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvd2xjb3JlX2kuaApAQCAtMzUsMTIgKzM1LDExIEBACiAjaW5jbHVkZSAiY29uZi5oIgogI2luY2x1ZGUgImluaS5oIgogCi0vKgotICogd2wxMjd4IGFuZCB3bDEyOHggYXJlIHVzaW5nIHRoZSBzYW1lIE5WUyBmaWxlIG5hbWUuIEhvd2V2ZXIsIHRoZQotICogaW5pIHBhcmFtZXRlcnMgYmV0d2VlbiB0aGVtIGFyZSBkaWZmZXJlbnQuICBUaGUgZHJpdmVyIHZhbGlkYXRlcwotICogdGhlIGNvcnJlY3QgTlZTIHNpemUgaW4gd2wxMjcxX2Jvb3RfdXBsb2FkX252cygpLgotICovCi0jZGVmaW5lIFdMMTJYWF9OVlNfTkFNRSAidGktY29ubmVjdGl2aXR5L3dsMTI3MS1udnMuYmluIgorc3RydWN0IHdpbGlua19mYW1pbHlfZGF0YSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpudnNfbmFtZTsJLyogd2wxMnh4IG52cyBmaWxlICovCisJY29uc3QgY2hhciAqY2ZnX25hbWU7CS8qIHdsMTh4eCBjZmcgZmlsZSAqLworfTsKIAogI2RlZmluZSBXTDEyNzFfVFhfU0VDVVJJVFlfTE8xNihzKSAoKHUxNikoKHMpICYgMHhmZmZmKSkKICNkZWZpbmUgV0wxMjcxX1RYX1NFQ1VSSVRZX0hJMzIocykgKCh1MzIpKCgocykgPj4gMTYpICYgMHhmZmZmZmZmZikpCkBAIC0yMDgsNiArMjA3LDcgQEAKIAogc3RydWN0IHdsY29yZV9wbGF0ZGV2X2RhdGEgewogCXN0cnVjdCB3bDEyNzFfaWZfb3BlcmF0aW9ucyAqaWZfb3BzOworCWNvbnN0IHN0cnVjdCB3aWxpbmtfZmFtaWx5X2RhdGEgKmZhbWlseTsKIAogCWJvb2wgcmVmX2Nsb2NrX3h0YWw7CS8qIHNwZWNpZnkgd2hldGhlciB0aGUgY2xvY2sgaXMgWFRBTCBvciBub3QgKi8KIAl1MzIgcmVmX2Nsb2NrX2ZyZXE7CS8qIGluIEhlcnR6ICovCkBAIC0zNDcsNyArMzQ3LDYgQEAKIAkgKiBVc2VkIGluIGJvdGggQVAgYW5kIFNUQSBtb2RlLgogCSAqLwogCXU2NCB0b3RhbF9mcmVlZF9wa3RzOwotCXN0cnVjdCB3bDEyNzEgKndsOwogfTsKIAogc3RydWN0IHdsMTJ4eF92aWYgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDM1MDFfY3MuYwppbmRleCA4MmQ5NGY4Li45MzJmM2Y4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wzNTAxX2NzLmMKQEAgLTEyNTgsNyArMTI1OCw5IEBACiB7CiAJc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgcmMgPSAtRU5PREVWOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGhpcy0+bG9jaywgZmxhZ3MpOwogCXdsMzUwMV9ibG9ja19pbnRlcnJ1cHQodGhpcyk7CiAKIAlpZiAod2wzNTAxX2luaXRfZmlybXdhcmUodGhpcykpIHsKQEAgLTEyODAsMjAgKzEyODIsMTcgQEAKIAlwcl9kZWJ1ZygiJXM6IGRldmljZSByZXNldCIsIGRldi0+bmFtZSk7CiAJcmMgPSAwOwogb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoaXMtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIHdsMzUwMV90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IHdsMzUwMV9jYXJkICp0aGlzID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYzsKIAogCXN0YXRzLT50eF9lcnJvcnMrKzsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdGhpcy0+bG9jaywgZmxhZ3MpOwogCXJjID0gd2wzNTAxX3Jlc2V0KGRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhpcy0+bG9jaywgZmxhZ3MpOwogCWlmIChyYykKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IgJWQgcmVzZXR0aW5nIGNhcmQgb24gVHggdGltZW91dCFcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUsIHJjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3p5ZGFzL3pkMTIxMXJ3L3pkX3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvenlkYXMvemQxMjExcncvemRfdXNiLmMKaW5kZXggYTkxMmRjMC4uYzVlZmZkNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3p5ZGFzL3pkMTIxMXJ3L3pkX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3p5ZGFzL3pkMTIxMXJ3L3pkX3VzYi5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAkJCTAsIDAsIHAsIHNpemVvZihyZXQpLCA1MDAwIC8qIG1zICovKTsKIAkJaWYgKHIgIT0gc2l6ZW9mKHJldCkpIHsKIAkJCWRldl9lcnIoJnVkZXYtPmRldiwKLQkJCQkiY29udHJvbCByZXF1ZXN0IGZpcm1ld2FyZSBjb25maXJtYXRpb24gZmFpbGVkLiIKKwkJCQkiY29udHJvbCByZXF1ZXN0IGZpcm13YXJlIGNvbmZpcm1hdGlvbiBmYWlsZWQuIgogCQkJCSIgUmV0dXJuIHZhbHVlICVkXG4iLCByKTsKIAkJCWlmIChyID49IDApCiAJCQkJciA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaCBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2NvbW1vbi5oCmluZGV4IDg0ZDZjYmQuLmIzOGZiMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2NvbW1vbi5oCkBAIC0yOTIsOCArMjkyLDYgQEAKICNlbmRpZgogCiAJc3RydWN0IHhlbl9uZXRpZl9jdHJsX2JhY2tfcmluZyBjdHJsOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3RybF90YXNrOwotCXdhaXRfcXVldWVfaGVhZF90IGN0cmxfd3E7CiAJdW5zaWduZWQgaW50IGN0cmxfaXJxOwogCiAJLyogTWlzY2VsbGFuZW91cyBwcml2YXRlIHN0dWZmLiAqLwpAQCAtMzU5LDcgKzM1Nyw3IEBACiAKIGludCB4ZW52aWZfZGVhbGxvY19rdGhyZWFkKHZvaWQgKmRhdGEpOwogCi1pbnQgeGVudmlmX2N0cmxfa3RocmVhZCh2b2lkICpkYXRhKTsKK2lycXJldHVybl90IHhlbnZpZl9jdHJsX2lycV9mbihpbnQgaXJxLCB2b2lkICpkYXRhKTsKIAogdm9pZCB4ZW52aWZfcnhfcXVldWVfdGFpbChzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2hhc2guYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2hhc2guYwppbmRleCBmYjg3Y2IzLi42MTNiYWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9oYXNoLmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaGFzaC5jCkBAIC0zMiwxNSArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAKLXN0YXRpYyB2b2lkIHhlbnZpZl9kZWxfaGFzaChzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKLXsKLQlzdHJ1Y3QgeGVudmlmX2hhc2hfY2FjaGVfZW50cnkgKmVudHJ5OwotCi0JZW50cnkgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgeGVudmlmX2hhc2hfY2FjaGVfZW50cnksIHJjdSk7Ci0KLQlrZnJlZShlbnRyeSk7Ci19Ci0KIHN0YXRpYyB2b2lkIHhlbnZpZl9hZGRfaGFzaChzdHJ1Y3QgeGVudmlmICp2aWYsIGNvbnN0IHU4ICp0YWcsCiAJCQkgICAgdW5zaWduZWQgaW50IGxlbiwgdTMyIHZhbCkKIHsKQEAgLTc2LDcgKzY3LDcgQEAKIAkJaWYgKCsrdmlmLT5oYXNoLmNhY2hlLmNvdW50ID4geGVudmlmX2hhc2hfY2FjaGVfc2l6ZSkgewogCQkJbGlzdF9kZWxfcmN1KCZvbGRlc3QtPmxpbmspOwogCQkJdmlmLT5oYXNoLmNhY2hlLmNvdW50LS07Ci0JCQljYWxsX3JjdSgmb2xkZXN0LT5yY3UsIHhlbnZpZl9kZWxfaGFzaCk7CisJCQlrZnJlZV9yY3Uob2xkZXN0LCByY3UpOwogCQl9CiAJfQogCkBAIC0xMTQsNyArMTA1LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShlbnRyeSwgJnZpZi0+aGFzaC5jYWNoZS5saXN0LCBsaW5rKSB7CiAJCWxpc3RfZGVsX3JjdSgmZW50cnktPmxpbmspOwogCQl2aWYtPmhhc2guY2FjaGUuY291bnQtLTsKLQkJY2FsbF9yY3UoJmVudHJ5LT5yY3UsIHhlbnZpZl9kZWxfaGFzaCk7CisJCWtmcmVlX3JjdShlbnRyeSwgcmN1KTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aWYtPmhhc2guY2FjaGUubG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9pbnRlcmZhY2UuYwppbmRleCA4M2RlZWViLi5mYjUwYzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9pbnRlcmZhY2UuYwpAQCAtMTI4LDE1ICsxMjgsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotaXJxcmV0dXJuX3QgeGVudmlmX2N0cmxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgeGVudmlmICp2aWYgPSBkZXZfaWQ7Ci0KLQl3YWtlX3VwKCZ2aWYtPmN0cmxfd3EpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCiBpbnQgeGVudmlmX3F1ZXVlX3N0b3BwZWQoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHF1ZXVlLT52aWYtPmRldjsKQEAgLTU3MCw4ICs1NjEsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB2aWYtPmRldjsKIAl2b2lkICphZGRyOwogCXN0cnVjdCB4ZW5fbmV0aWZfY3RybF9zcmluZyAqc2hhcmVkOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQlpbnQgZXJyID0gLUVOT01FTTsKKwlpbnQgZXJyOwogCiAJZXJyID0geGVuYnVzX21hcF9yaW5nX3ZhbGxvYyh4ZW52aWZfdG9feGVuYnVzX2RldmljZSh2aWYpLAogCQkJCSAgICAgJnJpbmdfcmVmLCAxLCAmYWRkcik7CkBAIC01ODEsMTEgKzU3MSw3IEBACiAJc2hhcmVkID0gKHN0cnVjdCB4ZW5fbmV0aWZfY3RybF9zcmluZyAqKWFkZHI7CiAJQkFDS19SSU5HX0lOSVQoJnZpZi0+Y3RybCwgc2hhcmVkLCBYRU5fUEFHRV9TSVpFKTsKIAotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZpZi0+Y3RybF93cSk7Ci0KLQllcnIgPSBiaW5kX2ludGVyZG9tYWluX2V2dGNobl90b19pcnFoYW5kbGVyKHZpZi0+ZG9taWQsIGV2dGNobiwKLQkJCQkJCSAgICB4ZW52aWZfY3RybF9pbnRlcnJ1cHQsCi0JCQkJCQkgICAgMCwgZGV2LT5uYW1lLCB2aWYpOworCWVyciA9IGJpbmRfaW50ZXJkb21haW5fZXZ0Y2huX3RvX2lycSh2aWYtPmRvbWlkLCBldnRjaG4pOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycl91bm1hcDsKIApAQCAtNTkzLDE5ICs1NzksMTMgQEAKIAogCXhlbnZpZl9pbml0X2hhc2godmlmKTsKIAotCXRhc2sgPSBrdGhyZWFkX2NyZWF0ZSh4ZW52aWZfY3RybF9rdGhyZWFkLCAodm9pZCAqKXZpZiwKLQkJCSAgICAgICIlcy1jb250cm9sIiwgZGV2LT5uYW1lKTsKLQlpZiAoSVNfRVJSKHRhc2spKSB7Ci0JCXByX3dhcm4oIkNvdWxkIG5vdCBhbGxvY2F0ZSBrdGhyZWFkIGZvciAlc1xuIiwgZGV2LT5uYW1lKTsKLQkJZXJyID0gUFRSX0VSUih0YXNrKTsKKwllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh2aWYtPmN0cmxfaXJxLCBOVUxMLCB4ZW52aWZfY3RybF9pcnFfZm4sCisJCQkJICAgSVJRRl9PTkVTSE9ULCAieGVuLW5ldGJhY2stY3RybCIsIHZpZik7CisJaWYgKGVycikgeworCQlwcl93YXJuKCJDb3VsZCBub3Qgc2V0dXAgaXJxIGhhbmRsZXIgZm9yICVzXG4iLCBkZXYtPm5hbWUpOwogCQlnb3RvIGVycl9kZWluaXQ7CiAJfQogCi0JZ2V0X3Rhc2tfc3RydWN0KHRhc2spOwotCXZpZi0+Y3RybF90YXNrID0gdGFzazsKLQotCXdha2VfdXBfcHJvY2Vzcyh2aWYtPmN0cmxfdGFzayk7Ci0KIAlyZXR1cm4gMDsKIAogZXJyX2RlaW5pdDoKQEAgLTc3NCwxMiArNzU0LDYgQEAKIAogdm9pZCB4ZW52aWZfZGlzY29ubmVjdF9jdHJsKHN0cnVjdCB4ZW52aWYgKnZpZikKIHsKLQlpZiAodmlmLT5jdHJsX3Rhc2spIHsKLQkJa3RocmVhZF9zdG9wKHZpZi0+Y3RybF90YXNrKTsKLQkJcHV0X3Rhc2tfc3RydWN0KHZpZi0+Y3RybF90YXNrKTsKLQkJdmlmLT5jdHJsX3Rhc2sgPSBOVUxMOwotCX0KLQogCWlmICh2aWYtPmN0cmxfaXJxKSB7CiAJCXhlbnZpZl9kZWluaXRfaGFzaCh2aWYpOwogCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKHZpZi0+Y3RybF9pcnEsIHZpZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKaW5kZXggZWRiYWUwYi4uM2QwYzk4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYwpAQCAtMjM1OSwyNCArMjM1OSwxNCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgeGVudmlmX2N0cmxfa3RocmVhZCh2b2lkICpkYXRhKQoraXJxcmV0dXJuX3QgeGVudmlmX2N0cmxfaXJxX2ZuKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHhlbnZpZiAqdmlmID0gZGF0YTsKIAotCWZvciAoOzspIHsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHZpZi0+Y3RybF93cSwKLQkJCQkJIHhlbnZpZl9jdHJsX3dvcmtfdG9kbyh2aWYpIHx8Ci0JCQkJCSBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQkJYnJlYWs7CisJd2hpbGUgKHhlbnZpZl9jdHJsX3dvcmtfdG9kbyh2aWYpKQorCQl4ZW52aWZfY3RybF9hY3Rpb24odmlmKTsKIAotCQl3aGlsZSAoeGVudmlmX2N0cmxfd29ya190b2RvKHZpZikpCi0JCQl4ZW52aWZfY3RybF9hY3Rpb24odmlmKTsKLQotCQljb25kX3Jlc2NoZWQoKTsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IG5ldGJhY2tfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2sveGVuYnVzLmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay94ZW5idXMuYwppbmRleCA2YTMxZjI2Li5kYWY0Yzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay94ZW5idXMuYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay94ZW5idXMuYwpAQCAtMjcxLDYgKzI3MSwxMSBAQAogCWJlLT5kZXYgPSBkZXY7CiAJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgYmUpOwogCisJYmUtPnN0YXRlID0gWGVuYnVzU3RhdGVJbml0aWFsaXNpbmc7CisJZXJyID0geGVuYnVzX3N3aXRjaF9zdGF0ZShkZXYsIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw7CisKIAlzZyA9IDE7CiAKIAlkbyB7CkBAIC0zODMsMTEgKzM4OCw2IEBACiAKIAliZS0+aG90cGx1Z19zY3JpcHQgPSBzY3JpcHQ7CiAKLQllcnIgPSB4ZW5idXNfc3dpdGNoX3N0YXRlKGRldiwgWGVuYnVzU3RhdGVJbml0V2FpdCk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsOwotCi0JYmUtPnN0YXRlID0gWGVuYnVzU3RhdGVJbml0V2FpdDsKIAogCS8qIFRoaXMga2lja3MgaG90cGx1ZyBzY3JpcHRzLCBzbyBkbyBpdCBpbW1lZGlhdGVseS4gKi8KIAllcnIgPSBiYWNrZW5kX2NyZWF0ZV94ZW52aWYoYmUpOwpAQCAtNDkyLDIwICs0OTIsMjAgQEAKIAogLyogSGFuZGxlIGJhY2tlbmQgc3RhdGUgdHJhbnNpdGlvbnM6CiAgKgotICogVGhlIGJhY2tlbmQgc3RhdGUgc3RhcnRzIGluIEluaXRXYWl0IGFuZCB0aGUgZm9sbG93aW5nIHRyYW5zaXRpb25zIGFyZQorICogVGhlIGJhY2tlbmQgc3RhdGUgc3RhcnRzIGluIEluaXRpYWxpc2luZyBhbmQgdGhlIGZvbGxvd2luZyB0cmFuc2l0aW9ucyBhcmUKICAqIGFsbG93ZWQuCiAgKgotICogSW5pdFdhaXQgLT4gQ29ubmVjdGVkCisgKiBJbml0aWFsaXNpbmcgLT4gSW5pdFdhaXQgLT4gQ29ubmVjdGVkCisgKiAgICAgICAgICBcCisgKiAgICAgICAgICAgXCAgICAgICAgXiAgICBcICAgICAgICAgfAorICogICAgICAgICAgICBcICAgICAgIHwgICAgIFwgICAgICAgIHwKKyAqICAgICAgICAgICAgIFwgICAgICB8ICAgICAgXCAgICAgICB8CisgKiAgICAgICAgICAgICAgXCAgICAgfCAgICAgICBcICAgICAgfAorICogICAgICAgICAgICAgICBcICAgIHwgICAgICAgIFwgICAgIHwKKyAqICAgICAgICAgICAgICAgIFwgICB8ICAgICAgICAgXCAgICB8CisgKiAgICAgICAgICAgICAgICAgViAgfCAgICAgICAgICBWICAgVgogICoKLSAqICAgIF4gICAgXCAgICAgICAgIHwKLSAqICAgIHwgICAgIFwgICAgICAgIHwKLSAqICAgIHwgICAgICBcICAgICAgIHwKLSAqICAgIHwgICAgICAgXCAgICAgIHwKLSAqICAgIHwgICAgICAgIFwgICAgIHwKLSAqICAgIHwgICAgICAgICBcICAgIHwKLSAqICAgIHwgICAgICAgICAgViAgIFYKLSAqCi0gKiAgQ2xvc2VkICA8LT4gQ2xvc2luZworICogICAgICAgICAgICAgICAgICBDbG9zZWQgIDwtPiBDbG9zaW5nCiAgKgogICogVGhlIHN0YXRlIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgZXZlbnR1YWwgc3RhdGUgb2YgdGhlIGJhY2tlbmQgYW5kIHRoZQogICogZnVuY3Rpb24gdHJhbnNpdGlvbnMgdG8gdGhhdCBzdGF0ZSB2aWEgdGhlIHNob3J0ZXN0IHBhdGguCkBAIC01MTUsNiArNTE1LDIwIEBACiB7CiAJd2hpbGUgKGJlLT5zdGF0ZSAhPSBzdGF0ZSkgewogCQlzd2l0Y2ggKGJlLT5zdGF0ZSkgeworCQljYXNlIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nOgorCQkJc3dpdGNoIChzdGF0ZSkgeworCQkJY2FzZSBYZW5idXNTdGF0ZUluaXRXYWl0OgorCQkJY2FzZSBYZW5idXNTdGF0ZUNvbm5lY3RlZDoKKwkJCWNhc2UgWGVuYnVzU3RhdGVDbG9zaW5nOgorCQkJCWJhY2tlbmRfc3dpdGNoX3N0YXRlKGJlLCBYZW5idXNTdGF0ZUluaXRXYWl0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgWGVuYnVzU3RhdGVDbG9zZWQ6CisJCQkJYmFja2VuZF9zd2l0Y2hfc3RhdGUoYmUsIFhlbmJ1c1N0YXRlQ2xvc2VkKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQlVHKCk7CisJCQl9CisJCQlicmVhazsKIAkJY2FzZSBYZW5idXNTdGF0ZUNsb3NlZDoKIAkJCXN3aXRjaCAoc3RhdGUpIHsKIAkJCWNhc2UgWGVuYnVzU3RhdGVJbml0V2FpdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKaW5kZXggOTZjY2Q0ZS4uZTE3ODc5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKKysrIGIvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMKQEAgLTU2NSw2ICs1NjUsNyBAQAogCXN0cnVjdCBuZXRmcm9udF9xdWV1ZSAqcXVldWUgPSBOVUxMOwogCXVuc2lnbmVkIGludCBudW1fcXVldWVzID0gZGV2LT5yZWFsX251bV90eF9xdWV1ZXM7CiAJdTE2IHF1ZXVlX2luZGV4OworCXN0cnVjdCBza19idWZmICpuc2tiOwogCiAJLyogRHJvcCB0aGUgcGFja2V0IGlmIG5vIHF1ZXVlcyBhcmUgc2V0IHVwICovCiAJaWYgKG51bV9xdWV1ZXMgPCAxKQpAQCAtNTkzLDYgKzU5NCwyMCBAQAogCiAJcGFnZSA9IHZpcnRfdG9fcGFnZShza2ItPmRhdGEpOwogCW9mZnNldCA9IG9mZnNldF9pbl9wYWdlKHNrYi0+ZGF0YSk7CisKKwkvKiBUaGUgZmlyc3QgcmVxIHNob3VsZCBiZSBhdCBsZWFzdCBFVEhfSExFTiBzaXplIG9yIHRoZSBwYWNrZXQgd2lsbCBiZQorCSAqIGRyb3BwZWQgYnkgbmV0YmFjay4KKwkgKi8KKwlpZiAodW5saWtlbHkoUEFHRV9TSVpFIC0gb2Zmc2V0IDwgRVRIX0hMRU4pKSB7CisJCW5za2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAoIW5za2IpCisJCQlnb3RvIGRyb3A7CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXNrYiA9IG5za2I7CisJCXBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhKTsKKwkJb2Zmc2V0ID0gb2Zmc2V0X2luX3BhZ2Uoc2tiLT5kYXRhKTsKKwl9CisKIAlsZW4gPSBza2JfaGVhZGxlbihza2IpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT50eF9sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL250Yi9udGJfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL250Yi9udGJfdHJhbnNwb3J0LmMKaW5kZXggZDVjNTg5NC4uODYwMWMxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYwpAQCAtMTAyLDEzICsxMDIsMTYgQEAKIAl2b2lkICpidWY7CiAJdW5zaWduZWQgaW50IGxlbjsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJaW50IHJldHJpZXM7CisJaW50IGVycm9yczsKKwl1bnNpZ25lZCBpbnQgdHhfaW5kZXg7CisJdW5zaWduZWQgaW50IHJ4X2luZGV4OwogCiAJc3RydWN0IG50Yl90cmFuc3BvcnRfcXAgKnFwOwogCXVuaW9uIHsKIAkJc3RydWN0IG50Yl9wYXlsb2FkX2hlYWRlciBfX2lvbWVtICp0eF9oZHI7CiAJCXN0cnVjdCBudGJfcGF5bG9hZF9oZWFkZXIgKnJ4X2hkcjsKIAl9OwotCXVuc2lnbmVkIGludCBpbmRleDsKIH07CiAKIHN0cnVjdCBudGJfcnhfaW5mbyB7CkBAIC0yNTksNiArMjYyLDEyIEBACiBzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X3J4Y19kYih1bnNpZ25lZCBsb25nIGRhdGEpOwogc3RhdGljIGNvbnN0IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0X29wczsKIHN0YXRpYyBzdHJ1Y3QgbnRiX2NsaWVudCBudGJfdHJhbnNwb3J0X2NsaWVudDsKK3N0YXRpYyBpbnQgbnRiX2FzeW5jX3R4X3N1Ym1pdChzdHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXAsCisJCQkgICAgICAgc3RydWN0IG50Yl9xdWV1ZV9lbnRyeSAqZW50cnkpOworc3RhdGljIHZvaWQgbnRiX21lbWNweV90eChzdHJ1Y3QgbnRiX3F1ZXVlX2VudHJ5ICplbnRyeSwgdm9pZCBfX2lvbWVtICpvZmZzZXQpOworc3RhdGljIGludCBudGJfYXN5bmNfcnhfc3VibWl0KHN0cnVjdCBudGJfcXVldWVfZW50cnkgKmVudHJ5LCB2b2lkICpvZmZzZXQpOworc3RhdGljIHZvaWQgbnRiX21lbWNweV9yeChzdHJ1Y3QgbnRiX3F1ZXVlX2VudHJ5ICplbnRyeSwgdm9pZCAqb2Zmc2V0KTsKKwogCiBzdGF0aWMgaW50IG50Yl90cmFuc3BvcnRfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQpAQCAtMTIyOSw3ICsxMjM4LDcgQEAKIAkJCWJyZWFrOwogCiAJCWVudHJ5LT5yeF9oZHItPmZsYWdzID0gMDsKLQkJaW93cml0ZTMyKGVudHJ5LT5pbmRleCwgJnFwLT5yeF9pbmZvLT5lbnRyeSk7CisJCWlvd3JpdGUzMihlbnRyeS0+cnhfaW5kZXgsICZxcC0+cnhfaW5mby0+ZW50cnkpOwogCiAJCWNiX2RhdGEgPSBlbnRyeS0+Y2JfZGF0YTsKIAkJbGVuID0gZW50cnktPmxlbjsKQEAgLTEyNDcsMTAgKzEyNTYsMzYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxcC0+bnRiX3J4X3FfbG9jaywgaXJxZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBudGJfcnhfY29weV9jYWxsYmFjayh2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgbnRiX3J4X2NvcHlfY2FsbGJhY2sodm9pZCAqZGF0YSwKKwkJCQkgY29uc3Qgc3RydWN0IGRtYWVuZ2luZV9yZXN1bHQgKnJlcykKIHsKIAlzdHJ1Y3QgbnRiX3F1ZXVlX2VudHJ5ICplbnRyeSA9IGRhdGE7CiAKKwkvKiB3ZSBuZWVkIHRvIGNoZWNrIERNQSByZXN1bHRzIGlmIHdlIGFyZSB1c2luZyBETUEgKi8KKwlpZiAocmVzKSB7CisJCWVudW0gZG1hZW5naW5lX3R4X3Jlc3VsdCBkbWFfZXJyID0gcmVzLT5yZXN1bHQ7CisKKwkJc3dpdGNoIChkbWFfZXJyKSB7CisJCWNhc2UgRE1BX1RSQU5TX1JFQURfRkFJTEVEOgorCQljYXNlIERNQV9UUkFOU19XUklURV9GQUlMRUQ6CisJCQllbnRyeS0+ZXJyb3JzKys7CisJCWNhc2UgRE1BX1RSQU5TX0FCT1JURUQ6CisJCXsKKwkJCXN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCA9IGVudHJ5LT5xcDsKKwkJCXZvaWQgKm9mZnNldCA9IHFwLT5yeF9idWZmICsgcXAtPnJ4X21heF9mcmFtZSAqCisJCQkJCXFwLT5yeF9pbmRleDsKKworCQkJbnRiX21lbWNweV9yeChlbnRyeSwgb2Zmc2V0KTsKKwkJCXFwLT5yeF9tZW1jcHkrKzsKKwkJCXJldHVybjsKKwkJfQorCisJCWNhc2UgRE1BX1RSQU5TX05PRVJST1I6CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwogCWVudHJ5LT5mbGFncyB8PSBERVNDX0RPTkVfRkxBRzsKIAogCW50Yl9jb21wbGV0ZV9yeGMoZW50cnktPnFwKTsKQEAgLTEyNjYsMTAgKzEzMDEsMTAgQEAKIAkvKiBFbnN1cmUgdGhhdCB0aGUgZGF0YSBpcyBmdWxseSBjb3BpZWQgb3V0IGJlZm9yZSBjbGVhcmluZyB0aGUgZmxhZyAqLwogCXdtYigpOwogCi0JbnRiX3J4X2NvcHlfY2FsbGJhY2soZW50cnkpOworCW50Yl9yeF9jb3B5X2NhbGxiYWNrKGVudHJ5LCBOVUxMKTsKIH0KIAotc3RhdGljIHZvaWQgbnRiX2FzeW5jX3J4KHN0cnVjdCBudGJfcXVldWVfZW50cnkgKmVudHJ5LCB2b2lkICpvZmZzZXQpCitzdGF0aWMgaW50IG50Yl9hc3luY19yeF9zdWJtaXQoc3RydWN0IG50Yl9xdWV1ZV9lbnRyeSAqZW50cnksIHZvaWQgKm9mZnNldCkKIHsKIAlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4ZDsKIAlzdHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXAgPSBlbnRyeS0+cXA7CkBAIC0xMjgyLDEzICsxMzE3LDYgQEAKIAlpbnQgcmV0cmllcyA9IDA7CiAKIAlsZW4gPSBlbnRyeS0+bGVuOwotCi0JaWYgKCFjaGFuKQotCQlnb3RvIGVycjsKLQotCWlmIChsZW4gPCBjb3B5X2J5dGVzKQotCQlnb3RvIGVycjsKLQogCWRldmljZSA9IGNoYW4tPmRldmljZTsKIAlwYXlfb2ZmID0gKHNpemVfdClvZmZzZXQgJiB+UEFHRV9NQVNLOwogCWJ1ZmZfb2ZmID0gKHNpemVfdClidWYgJiB+UEFHRV9NQVNLOwpAQCAtMTMxNiw3ICsxMzQ0LDggQEAKIAl1bm1hcC0+ZnJvbV9jbnQgPSAxOwogCiAJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IERNQV9SRVRSSUVTOyByZXRyaWVzKyspIHsKLQkJdHhkID0gZGV2aWNlLT5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5KGNoYW4sIHVubWFwLT5hZGRyWzFdLAorCQl0eGQgPSBkZXZpY2UtPmRldmljZV9wcmVwX2RtYV9tZW1jcHkoY2hhbiwKKwkJCQkJCSAgICAgdW5tYXAtPmFkZHJbMV0sCiAJCQkJCQkgICAgIHVubWFwLT5hZGRyWzBdLCBsZW4sCiAJCQkJCQkgICAgIERNQV9QUkVQX0lOVEVSUlVQVCk7CiAJCWlmICh0eGQpCkBAIC0xMzMxLDcgKzEzNjAsNyBAQAogCQlnb3RvIGVycl9nZXRfdW5tYXA7CiAJfQogCi0JdHhkLT5jYWxsYmFjayA9IG50Yl9yeF9jb3B5X2NhbGxiYWNrOworCXR4ZC0+Y2FsbGJhY2tfcmVzdWx0ID0gbnRiX3J4X2NvcHlfY2FsbGJhY2s7CiAJdHhkLT5jYWxsYmFja19wYXJhbSA9IGVudHJ5OwogCWRtYV9zZXRfdW5tYXAodHhkLCB1bm1hcCk7CiAKQEAgLTEzNDUsMTMgKzEzNzQsMzggQEAKIAogCXFwLT5yeF9hc3luYysrOwogCi0JcmV0dXJuOworCXJldHVybiAwOwogCiBlcnJfc2V0X3VubWFwOgogCWRtYWVuZ2luZV91bm1hcF9wdXQodW5tYXApOwogZXJyX2dldF91bm1hcDoKIAlkbWFlbmdpbmVfdW5tYXBfcHV0KHVubWFwKTsKIGVycjoKKwlyZXR1cm4gLUVOWElPOworfQorCitzdGF0aWMgdm9pZCBudGJfYXN5bmNfcngoc3RydWN0IG50Yl9xdWV1ZV9lbnRyeSAqZW50cnksIHZvaWQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXAgPSBlbnRyeS0+cXA7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gcXAtPnJ4X2RtYV9jaGFuOworCWludCByZXM7CisKKwlpZiAoIWNoYW4pCisJCWdvdG8gZXJyOworCisJaWYgKGVudHJ5LT5sZW4gPCBjb3B5X2J5dGVzKQorCQlnb3RvIGVycjsKKworCXJlcyA9IG50Yl9hc3luY19yeF9zdWJtaXQoZW50cnksIG9mZnNldCk7CisJaWYgKHJlcyA8IDApCisJCWdvdG8gZXJyOworCisJaWYgKCFlbnRyeS0+cmV0cmllcykKKwkJcXAtPnJ4X2FzeW5jKys7CisKKwlyZXR1cm47CisKK2VycjoKIAludGJfbWVtY3B5X3J4KGVudHJ5LCBvZmZzZXQpOwogCXFwLT5yeF9tZW1jcHkrKzsKIH0KQEAgLTEzOTcsNyArMTQ1MSw3IEBACiAJfQogCiAJZW50cnktPnJ4X2hkciA9IGhkcjsKLQllbnRyeS0+aW5kZXggPSBxcC0+cnhfaW5kZXg7CisJZW50cnktPnJ4X2luZGV4ID0gcXAtPnJ4X2luZGV4OwogCiAJaWYgKGhkci0+bGVuID4gZW50cnktPmxlbikgewogCQlkZXZfZGJnKCZxcC0+bmRldi0+cGRldi0+ZGV2LApAQCAtMTQ2NywxMiArMTUyMSwzOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbnRiX3R4X2NvcHlfY2FsbGJhY2sodm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIG50Yl90eF9jb3B5X2NhbGxiYWNrKHZvaWQgKmRhdGEsCisJCQkJIGNvbnN0IHN0cnVjdCBkbWFlbmdpbmVfcmVzdWx0ICpyZXMpCiB7CiAJc3RydWN0IG50Yl9xdWV1ZV9lbnRyeSAqZW50cnkgPSBkYXRhOwogCXN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCA9IGVudHJ5LT5xcDsKIAlzdHJ1Y3QgbnRiX3BheWxvYWRfaGVhZGVyIF9faW9tZW0gKmhkciA9IGVudHJ5LT50eF9oZHI7CiAKKwkvKiB3ZSBuZWVkIHRvIGNoZWNrIERNQSByZXN1bHRzIGlmIHdlIGFyZSB1c2luZyBETUEgKi8KKwlpZiAocmVzKSB7CisJCWVudW0gZG1hZW5naW5lX3R4X3Jlc3VsdCBkbWFfZXJyID0gcmVzLT5yZXN1bHQ7CisKKwkJc3dpdGNoIChkbWFfZXJyKSB7CisJCWNhc2UgRE1BX1RSQU5TX1JFQURfRkFJTEVEOgorCQljYXNlIERNQV9UUkFOU19XUklURV9GQUlMRUQ6CisJCQllbnRyeS0+ZXJyb3JzKys7CisJCWNhc2UgRE1BX1RSQU5TX0FCT1JURUQ6CisJCXsKKwkJCXZvaWQgX19pb21lbSAqb2Zmc2V0ID0KKwkJCQlxcC0+dHhfbXcgKyBxcC0+dHhfbWF4X2ZyYW1lICoKKwkJCQllbnRyeS0+dHhfaW5kZXg7CisKKwkJCS8qIHJlc3VibWl0IHZpYSBDUFUgKi8KKwkJCW50Yl9tZW1jcHlfdHgoZW50cnksIG9mZnNldCk7CisJCQlxcC0+dHhfbWVtY3B5Kys7CisJCQlyZXR1cm47CisJCX0KKworCQljYXNlIERNQV9UUkFOU19OT0VSUk9SOgorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKIAlpb3dyaXRlMzIoZW50cnktPmZsYWdzIHwgREVTQ19ET05FX0ZMQUcsICZoZHItPmZsYWdzKTsKIAogCW50Yl9wZWVyX2RiX3NldChxcC0+bmRldiwgQklUX1VMTChxcC0+cXBfbnVtKSk7CkBAIC0xNTA3LDQwICsxNTg4LDI1IEBACiAJLyogRW5zdXJlIHRoYXQgdGhlIGRhdGEgaXMgZnVsbHkgY29waWVkIG91dCBiZWZvcmUgc2V0dGluZyB0aGUgZmxhZ3MgKi8KIAl3bWIoKTsKIAotCW50Yl90eF9jb3B5X2NhbGxiYWNrKGVudHJ5KTsKKwludGJfdHhfY29weV9jYWxsYmFjayhlbnRyeSwgTlVMTCk7CiB9CiAKLXN0YXRpYyB2b2lkIG50Yl9hc3luY190eChzdHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXAsCi0JCQkgc3RydWN0IG50Yl9xdWV1ZV9lbnRyeSAqZW50cnkpCitzdGF0aWMgaW50IG50Yl9hc3luY190eF9zdWJtaXQoc3RydWN0IG50Yl90cmFuc3BvcnRfcXAgKnFwLAorCQkJICAgICAgIHN0cnVjdCBudGJfcXVldWVfZW50cnkgKmVudHJ5KQogewotCXN0cnVjdCBudGJfcGF5bG9hZF9oZWFkZXIgX19pb21lbSAqaGRyOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkOwogCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IHFwLT50eF9kbWFfY2hhbjsKIAlzdHJ1Y3QgZG1hX2RldmljZSAqZGV2aWNlOworCXNpemVfdCBsZW4gPSBlbnRyeS0+bGVuOworCXZvaWQgKmJ1ZiA9IGVudHJ5LT5idWY7CiAJc2l6ZV90IGRlc3Rfb2ZmLCBidWZmX29mZjsKIAlzdHJ1Y3QgZG1hZW5naW5lX3VubWFwX2RhdGEgKnVubWFwOwogCWRtYV9hZGRyX3QgZGVzdDsKIAlkbWFfY29va2llX3QgY29va2llOwotCXZvaWQgX19pb21lbSAqb2Zmc2V0OwotCXNpemVfdCBsZW4gPSBlbnRyeS0+bGVuOwotCXZvaWQgKmJ1ZiA9IGVudHJ5LT5idWY7CiAJaW50IHJldHJpZXMgPSAwOwogCi0Jb2Zmc2V0ID0gcXAtPnR4X213ICsgcXAtPnR4X21heF9mcmFtZSAqIHFwLT50eF9pbmRleDsKLQloZHIgPSBvZmZzZXQgKyBxcC0+dHhfbWF4X2ZyYW1lIC0gc2l6ZW9mKHN0cnVjdCBudGJfcGF5bG9hZF9oZWFkZXIpOwotCWVudHJ5LT50eF9oZHIgPSBoZHI7Ci0KLQlpb3dyaXRlMzIoZW50cnktPmxlbiwgJmhkci0+bGVuKTsKLQlpb3dyaXRlMzIoKHUzMilxcC0+dHhfcGt0cywgJmhkci0+dmVyKTsKLQotCWlmICghY2hhbikKLQkJZ290byBlcnI7Ci0KLQlpZiAobGVuIDwgY29weV9ieXRlcykKLQkJZ290byBlcnI7Ci0KIAlkZXZpY2UgPSBjaGFuLT5kZXZpY2U7Ci0JZGVzdCA9IHFwLT50eF9td19waHlzICsgcXAtPnR4X21heF9mcmFtZSAqIHFwLT50eF9pbmRleDsKKwlkZXN0ID0gcXAtPnR4X213X3BoeXMgKyBxcC0+dHhfbWF4X2ZyYW1lICogZW50cnktPnR4X2luZGV4OwogCWJ1ZmZfb2ZmID0gKHNpemVfdClidWYgJiB+UEFHRV9NQVNLOwogCWRlc3Rfb2ZmID0gKHNpemVfdClkZXN0ICYgflBBR0VfTUFTSzsKIApAQCAtMTU2MCw4ICsxNjI2LDkgQEAKIAl1bm1hcC0+dG9fY250ID0gMTsKIAogCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCBETUFfUkVUUklFUzsgcmV0cmllcysrKSB7Ci0JCXR4ZCA9IGRldmljZS0+ZGV2aWNlX3ByZXBfZG1hX21lbWNweShjaGFuLCBkZXN0LCB1bm1hcC0+YWRkclswXSwKLQkJCQkJCSAgICAgbGVuLCBETUFfUFJFUF9JTlRFUlJVUFQpOworCQl0eGQgPSBkZXZpY2UtPmRldmljZV9wcmVwX2RtYV9tZW1jcHkoY2hhbiwgZGVzdCwKKwkJCQkJCSAgICAgdW5tYXAtPmFkZHJbMF0sIGxlbiwKKwkJCQkJCSAgICAgRE1BX1BSRVBfSU5URVJSVVBUKTsKIAkJaWYgKHR4ZCkKIAkJCWJyZWFrOwogCkBAIC0xNTc0LDcgKzE2NDEsNyBAQAogCQlnb3RvIGVycl9nZXRfdW5tYXA7CiAJfQogCi0JdHhkLT5jYWxsYmFjayA9IG50Yl90eF9jb3B5X2NhbGxiYWNrOworCXR4ZC0+Y2FsbGJhY2tfcmVzdWx0ID0gbnRiX3R4X2NvcHlfY2FsbGJhY2s7CiAJdHhkLT5jYWxsYmFja19wYXJhbSA9IGVudHJ5OwogCWRtYV9zZXRfdW5tYXAodHhkLCB1bm1hcCk7CiAKQEAgLTE1ODUsMTQgKzE2NTIsNDggQEAKIAlkbWFlbmdpbmVfdW5tYXBfcHV0KHVubWFwKTsKIAogCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKGNoYW4pOwotCXFwLT50eF9hc3luYysrOwogCi0JcmV0dXJuOworCXJldHVybiAwOwogZXJyX3NldF91bm1hcDoKIAlkbWFlbmdpbmVfdW5tYXBfcHV0KHVubWFwKTsKIGVycl9nZXRfdW5tYXA6CiAJZG1hZW5naW5lX3VubWFwX3B1dCh1bm1hcCk7CiBlcnI6CisJcmV0dXJuIC1FTlhJTzsKK30KKworc3RhdGljIHZvaWQgbnRiX2FzeW5jX3R4KHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCwKKwkJCSBzdHJ1Y3QgbnRiX3F1ZXVlX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgbnRiX3BheWxvYWRfaGVhZGVyIF9faW9tZW0gKmhkcjsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSBxcC0+dHhfZG1hX2NoYW47CisJdm9pZCBfX2lvbWVtICpvZmZzZXQ7CisJaW50IHJlczsKKworCWVudHJ5LT50eF9pbmRleCA9IHFwLT50eF9pbmRleDsKKwlvZmZzZXQgPSBxcC0+dHhfbXcgKyBxcC0+dHhfbWF4X2ZyYW1lICogZW50cnktPnR4X2luZGV4OworCWhkciA9IG9mZnNldCArIHFwLT50eF9tYXhfZnJhbWUgLSBzaXplb2Yoc3RydWN0IG50Yl9wYXlsb2FkX2hlYWRlcik7CisJZW50cnktPnR4X2hkciA9IGhkcjsKKworCWlvd3JpdGUzMihlbnRyeS0+bGVuLCAmaGRyLT5sZW4pOworCWlvd3JpdGUzMigodTMyKXFwLT50eF9wa3RzLCAmaGRyLT52ZXIpOworCisJaWYgKCFjaGFuKQorCQlnb3RvIGVycjsKKworCWlmIChlbnRyeS0+bGVuIDwgY29weV9ieXRlcykKKwkJZ290byBlcnI7CisKKwlyZXMgPSBudGJfYXN5bmNfdHhfc3VibWl0KHFwLCBlbnRyeSk7CisJaWYgKHJlcyA8IDApCisJCWdvdG8gZXJyOworCisJaWYgKCFlbnRyeS0+cmV0cmllcykKKwkJcXAtPnR4X2FzeW5jKys7CisKKwlyZXR1cm47CisKK2VycjoKIAludGJfbWVtY3B5X3R4KGVudHJ5LCBvZmZzZXQpOwogCXFwLT50eF9tZW1jcHkrKzsKIH0KQEAgLTE5MjgsNiArMjAyOSw5IEBACiAJZW50cnktPmJ1ZiA9IGRhdGE7CiAJZW50cnktPmxlbiA9IGxlbjsKIAllbnRyeS0+ZmxhZ3MgPSAwOworCWVudHJ5LT5yZXRyaWVzID0gMDsKKwllbnRyeS0+ZXJyb3JzID0gMDsKKwllbnRyeS0+cnhfaW5kZXggPSAwOwogCiAJbnRiX2xpc3RfYWRkKCZxcC0+bnRiX3J4X3FfbG9jaywgJmVudHJ5LT5lbnRyeSwgJnFwLT5yeF9wZW5kX3EpOwogCkBAIC0xOTcwLDYgKzIwNzQsOSBAQAogCWVudHJ5LT5idWYgPSBkYXRhOwogCWVudHJ5LT5sZW4gPSBsZW47CiAJZW50cnktPmZsYWdzID0gMDsKKwllbnRyeS0+ZXJyb3JzID0gMDsKKwllbnRyeS0+cmV0cmllcyA9IDA7CisJZW50cnktPnR4X2luZGV4ID0gMDsKIAogCXJjID0gbnRiX3Byb2Nlc3NfdHgocXAsIGVudHJ5KTsKIAlpZiAocmMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL252ZGltbS9idXMuYyBiL2RyaXZlcnMvbnZkaW1tL2J1cy5jCmluZGV4IDQ1OGRhZjkuLjkzNTg2NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZkaW1tL2J1cy5jCisrKyBiL2RyaXZlcnMvbnZkaW1tL2J1cy5jCkBAIC0xODUsOCArMTg1LDEyIEBACiAJCXJldHVybiAtRU5YSU87CiAKIAluZF9kZXNjID0gbnZkaW1tX2J1cy0+bmRfZGVzYzsKKwkvKgorCSAqIGlmIG5kY3RsIGRvZXMgbm90IGV4aXN0LCBpdCdzIFBNRU1fTEVHQUNZIGFuZAorCSAqIHdlIHdhbnQgdG8ganVzdCBwcmV0ZW5kIGV2ZXJ5dGhpbmcgaXMgaGFuZGxlZC4KKwkgKi8KIAlpZiAoIW5kX2Rlc2MtPm5kY3RsKQotCQlyZXR1cm4gLUVOWElPOworCQlyZXR1cm4gbGVuOwogCiAJbWVtc2V0KCZhcnNfY2FwLCAwLCBzaXplb2YoYXJzX2NhcCkpOwogCWFyc19jYXAuYWRkcmVzcyA9IHBoeXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL252ZGltbS9jb3JlLmMgYi9kcml2ZXJzL252ZGltbS9jb3JlLmMKaW5kZXggNzE1NTgzZi4uNGQ3YmJkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9udmRpbW0vY29yZS5jCisrKyBiL2RyaXZlcnMvbnZkaW1tL2NvcmUuYwpAQCAtOTksOCArOTksMTEgQEAKIAludmRpbW1fbWFwLT5zaXplID0gc2l6ZTsKIAlrcmVmX2luaXQoJm52ZGltbV9tYXAtPmtyZWYpOwogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ob2Zmc2V0LCBzaXplLCBkZXZfbmFtZSgmbnZkaW1tX2J1cy0+ZGV2KSkpCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ob2Zmc2V0LCBzaXplLCBkZXZfbmFtZSgmbnZkaW1tX2J1cy0+ZGV2KSkpIHsKKwkJZGV2X2VycigmbnZkaW1tX2J1cy0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgJXBhICsgJXpkIGZvciAlc1xuIiwKKwkJCQkmb2Zmc2V0LCBzaXplLCBkZXZfbmFtZShkZXYpKTsKIAkJZ290byBlcnJfcmVxdWVzdF9yZWdpb247CisJfQogCiAJaWYgKGZsYWdzKQogCQludmRpbW1fbWFwLT5tZW0gPSBtZW1yZW1hcChvZmZzZXQsIHNpemUsIGZsYWdzKTsKQEAgLTE3MSw2ICsxNzQsOSBAQAogCQlrcmVmX2dldCgmbnZkaW1tX21hcC0+a3JlZik7CiAJbnZkaW1tX2J1c191bmxvY2soZGV2KTsKIAorCWlmICghbnZkaW1tX21hcCkKKwkJcmV0dXJuIE5VTEw7CisKIAlpZiAoZGV2bV9hZGRfYWN0aW9uX29yX3Jlc2V0KGRldiwgbnZkaW1tX21hcF9wdXQsIG52ZGltbV9tYXApKQogCQlyZXR1cm4gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9udmRpbW0vbmQuaCBiL2RyaXZlcnMvbnZkaW1tL25kLmgKaW5kZXggODAyNGEwZS4uMGI3OGE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9udmRpbW0vbmQuaAorKysgYi9kcml2ZXJzL252ZGltbS9uZC5oCkBAIC01MiwxMCArNTIsMjggQEAKIHN0cnVjdCBuZF9yZWdpb25fZGF0YSB7CiAJaW50IG5zX2NvdW50OwogCWludCBuc19hY3RpdmU7Ci0JdW5zaWduZWQgaW50IGZsdXNoX21hc2s7Ci0Jdm9pZCBfX2lvbWVtICpmbHVzaF93cHFbMF1bMF07CisJdW5zaWduZWQgaW50IGhpbnRzX3NoaWZ0OworCXZvaWQgX19pb21lbSAqZmx1c2hfd3BxWzBdOwogfTsKIAorc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKm5kcmRfZ2V0X2ZsdXNoX3dwcShzdHJ1Y3QgbmRfcmVnaW9uX2RhdGEgKm5kcmQsCisJCWludCBkaW1tLCBpbnQgaGludCkKK3sKKwl1bnNpZ25lZCBpbnQgbnVtID0gMSA8PCBuZHJkLT5oaW50c19zaGlmdDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IG51bSAtIDE7CisKKwlyZXR1cm4gbmRyZC0+Zmx1c2hfd3BxW2RpbW0gKiBudW0gKyAoaGludCAmIG1hc2spXTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5kcmRfc2V0X2ZsdXNoX3dwcShzdHJ1Y3QgbmRfcmVnaW9uX2RhdGEgKm5kcmQsIGludCBkaW1tLAorCQlpbnQgaGludCwgdm9pZCBfX2lvbWVtICpmbHVzaCkKK3sKKwl1bnNpZ25lZCBpbnQgbnVtID0gMSA8PCBuZHJkLT5oaW50c19zaGlmdDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IG51bSAtIDE7CisKKwluZHJkLT5mbHVzaF93cHFbZGltbSAqIG51bSArIChoaW50ICYgbWFzayldID0gZmx1c2g7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5kX25hbWVzcGFjZV9pbmRleCAqdG9fbmFtZXNwYWNlX2luZGV4KAogCQlzdHJ1Y3QgbnZkaW1tX2RydmRhdGEgKm5kZCwgaW50IGkpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL252ZGltbS9yZWdpb25fZGV2cy5jIGIvZHJpdmVycy9udmRpbW0vcmVnaW9uX2RldnMuYwppbmRleCBlOGQ1YmE3Li40YzBhYzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL252ZGltbS9yZWdpb25fZGV2cy5jCisrKyBiL2RyaXZlcnMvbnZkaW1tL3JlZ2lvbl9kZXZzLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAogCWRldl9kYmcoZGV2LCAiJXM6IG1hcCAlZCBmbHVzaCBhZGRyZXNzJXNcbiIsIG52ZGltbV9uYW1lKG52ZGltbSksCiAJCQludmRpbW0tPm51bV9mbHVzaCwgbnZkaW1tLT5udW1fZmx1c2ggPT0gMSA/ICIiIDogImVzIik7Ci0JZm9yIChpID0gMDsgaSA8IG52ZGltbS0+bnVtX2ZsdXNoOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgbmRyZC0+aGludHNfc2hpZnQpOyBpKyspIHsKIAkJc3RydWN0IHJlc291cmNlICpyZXMgPSAmbnZkaW1tLT5mbHVzaF93cHFbaV07CiAJCXVuc2lnbmVkIGxvbmcgcGZuID0gUEhZU19QRk4ocmVzLT5zdGFydCk7CiAJCXZvaWQgX19pb21lbSAqZmx1c2hfcGFnZTsKQEAgLTU0LDE0ICs1NCwxNSBAQAogCiAJCWlmIChqIDwgaSkKIAkJCWZsdXNoX3BhZ2UgPSAodm9pZCBfX2lvbWVtICopICgodW5zaWduZWQgbG9uZykKLQkJCQkJbmRyZC0+Zmx1c2hfd3BxW2RpbW1dW2pdICYgUEFHRV9NQVNLKTsKKwkJCQkJbmRyZF9nZXRfZmx1c2hfd3BxKG5kcmQsIGRpbW0sIGopCisJCQkJCSYgUEFHRV9NQVNLKTsKIAkJZWxzZQogCQkJZmx1c2hfcGFnZSA9IGRldm1fbnZkaW1tX2lvcmVtYXAoZGV2LAotCQkJCQlQSFlTX1BGTihwZm4pLCBQQUdFX1NJWkUpOworCQkJCQlQRk5fUEhZUyhwZm4pLCBQQUdFX1NJWkUpOwogCQlpZiAoIWZsdXNoX3BhZ2UpCiAJCQlyZXR1cm4gLUVOWElPOwotCQluZHJkLT5mbHVzaF93cHFbZGltbV1baV0gPSBmbHVzaF9wYWdlCi0JCQkrIChyZXMtPnN0YXJ0ICYgflBBR0VfTUFTSyk7CisJCW5kcmRfc2V0X2ZsdXNoX3dwcShuZHJkLCBkaW1tLCBpLCBmbHVzaF9wYWdlCisJCQkJKyAocmVzLT5zdGFydCAmIH5QQUdFX01BU0spKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTkzLDcgKzk0LDEwIEBACiAJCXJldHVybiAtRU5PTUVNOwogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIG5kcmQpOwogCi0JbmRyZC0+Zmx1c2hfbWFzayA9ICgxIDw8IGlsb2cyKG51bV9mbHVzaCkpIC0gMTsKKwlpZiAoIW51bV9mbHVzaCkKKwkJcmV0dXJuIDA7CisKKwluZHJkLT5oaW50c19zaGlmdCA9IGlsb2cyKG51bV9mbHVzaCk7CiAJZm9yIChpID0gMDsgaSA8IG5kX3JlZ2lvbi0+bmRyX21hcHBpbmdzOyBpKyspIHsKIAkJc3RydWN0IG5kX21hcHBpbmcgKm5kX21hcHBpbmcgPSAmbmRfcmVnaW9uLT5tYXBwaW5nW2ldOwogCQlzdHJ1Y3QgbnZkaW1tICpudmRpbW0gPSBuZF9tYXBwaW5nLT5udmRpbW07CkBAIC05MDAsOCArOTA0LDggQEAKIAkgKi8KIAl3bWIoKTsKIAlmb3IgKGkgPSAwOyBpIDwgbmRfcmVnaW9uLT5uZHJfbWFwcGluZ3M7IGkrKykKLQkJaWYgKG5kcmQtPmZsdXNoX3dwcVtpXVswXSkKLQkJCXdyaXRlcSgxLCBuZHJkLT5mbHVzaF93cHFbaV1baWR4ICYgbmRyZC0+Zmx1c2hfbWFza10pOworCQlpZiAobmRyZF9nZXRfZmx1c2hfd3BxKG5kcmQsIGksIDApKQorCQkJd3JpdGVxKDEsIG5kcmRfZ2V0X2ZsdXNoX3dwcShuZHJkLCBpLCBpZHgpKTsKIAl3bWIoKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG52ZGltbV9mbHVzaCk7CkBAIC05MjUsNyArOTI5LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBuZF9yZWdpb24tPm5kcl9tYXBwaW5nczsgaSsrKQogCQkvKiBmbHVzaCBoaW50cyBwcmVzZW50LCBmbHVzaGluZyByZXF1aXJlZCAqLwotCQlpZiAobmRyZC0+Zmx1c2hfd3BxW2ldWzBdKQorCQlpZiAobmRyZF9nZXRfZmx1c2hfd3BxKG5kcmQsIGksIDApKQogCQkJcmV0dXJuIDE7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvbnZtZS9ob3N0L0tjb25maWcKaW5kZXggZGIzOWQ1My4uZjdkMzdhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL252bWUvaG9zdC9LY29uZmlnCkBAIC0zMCw4ICszMCw4IEBACiAKIGNvbmZpZyBOVk1FX1JETUEKIAl0cmlzdGF0ZSAiTlZNIEV4cHJlc3Mgb3ZlciBGYWJyaWNzIFJETUEgaG9zdCBkcml2ZXIiCi0JZGVwZW5kcyBvbiBJTkZJTklCQU5ECi0JZGVwZW5kcyBvbiBCTEtfREVWX05WTUUKKwlkZXBlbmRzIG9uIElORklOSUJBTkQgJiYgQkxPQ0sKKwlzZWxlY3QgTlZNRV9DT1JFCiAJc2VsZWN0IE5WTUVfRkFCUklDUwogCXNlbGVjdCBTR19QT09MCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL2hvc3QvY29yZS5jIGIvZHJpdmVycy9udm1lL2hvc3QvY29yZS5jCmluZGV4IDJmZWFjYzcuLjQ2NjljMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS9ob3N0L2NvcmUuYworKysgYi9kcml2ZXJzL252bWUvaG9zdC9jb3JlLmMKQEAgLTE1NiwxMiArMTU2LDE0IEBACiB7CiAJc3RydWN0IG52bWVfbnMgKm5zID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBudm1lX25zLCBrcmVmKTsKIAotCWlmIChucy0+dHlwZSA9PSBOVk1FX05TX0xJR0hUTlZNKQotCQludm1lX252bV91bnJlZ2lzdGVyKG5zLT5xdWV1ZSwgbnMtPmRpc2stPmRpc2tfbmFtZSk7CisJaWYgKG5zLT5uZGV2KQorCQludm1lX252bV91bnJlZ2lzdGVyKG5zKTsKIAotCXNwaW5fbG9jaygmZGV2X2xpc3RfbG9jayk7Ci0JbnMtPmRpc2stPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJmRldl9saXN0X2xvY2spOworCWlmIChucy0+ZGlzaykgeworCQlzcGluX2xvY2soJmRldl9saXN0X2xvY2spOworCQlucy0+ZGlzay0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwkJc3Bpbl91bmxvY2soJmRldl9saXN0X2xvY2spOworCX0KIAogCXB1dF9kaXNrKG5zLT5kaXNrKTsKIAlpZGFfc2ltcGxlX3JlbW92ZSgmbnMtPmN0cmwtPm5zX2lkYSwgbnMtPmluc3RhbmNlKTsKQEAgLTU5Nyw3ICs1OTksNyBAQAogfQogCiBpbnQgbnZtZV9nZXRfZmVhdHVyZXMoc3RydWN0IG52bWVfY3RybCAqZGV2LCB1bnNpZ25lZCBmaWQsIHVuc2lnbmVkIG5zaWQsCi0JCQkJCWRtYV9hZGRyX3QgZG1hX2FkZHIsIHUzMiAqcmVzdWx0KQorCQkgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBidWZsZW4sIHUzMiAqcmVzdWx0KQogewogCXN0cnVjdCBudm1lX2NvbW1hbmQgYzsKIAlzdHJ1Y3QgbnZtZV9jb21wbGV0aW9uIGNxZTsKQEAgLTYwNiwxMCArNjA4LDkgQEAKIAltZW1zZXQoJmMsIDAsIHNpemVvZihjKSk7CiAJYy5mZWF0dXJlcy5vcGNvZGUgPSBudm1lX2FkbWluX2dldF9mZWF0dXJlczsKIAljLmZlYXR1cmVzLm5zaWQgPSBjcHVfdG9fbGUzMihuc2lkKTsKLQljLmZlYXR1cmVzLmRwdHIucHJwMSA9IGNwdV90b19sZTY0KGRtYV9hZGRyKTsKIAljLmZlYXR1cmVzLmZpZCA9IGNwdV90b19sZTMyKGZpZCk7CiAKLQlyZXQgPSBfX252bWVfc3VibWl0X3N5bmNfY21kKGRldi0+YWRtaW5fcSwgJmMsICZjcWUsIE5VTEwsIDAsIDAsCisJcmV0ID0gX19udm1lX3N1Ym1pdF9zeW5jX2NtZChkZXYtPmFkbWluX3EsICZjLCAmY3FlLCBidWZmZXIsIGJ1ZmxlbiwgMCwKIAkJCU5WTUVfUUlEX0FOWSwgMCwgMCk7CiAJaWYgKHJldCA+PSAwICYmIHJlc3VsdCkKIAkJKnJlc3VsdCA9IGxlMzJfdG9fY3B1KGNxZS5yZXN1bHQpOwpAQCAtNjE3LDcgKzYxOCw3IEBACiB9CiAKIGludCBudm1lX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbnZtZV9jdHJsICpkZXYsIHVuc2lnbmVkIGZpZCwgdW5zaWduZWQgZHdvcmQxMSwKLQkJCQkJZG1hX2FkZHJfdCBkbWFfYWRkciwgdTMyICpyZXN1bHQpCisJCSAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbiwgdTMyICpyZXN1bHQpCiB7CiAJc3RydWN0IG52bWVfY29tbWFuZCBjOwogCXN0cnVjdCBudm1lX2NvbXBsZXRpb24gY3FlOwpAQCAtNjI1LDEyICs2MjYsMTEgQEAKIAogCW1lbXNldCgmYywgMCwgc2l6ZW9mKGMpKTsKIAljLmZlYXR1cmVzLm9wY29kZSA9IG52bWVfYWRtaW5fc2V0X2ZlYXR1cmVzOwotCWMuZmVhdHVyZXMuZHB0ci5wcnAxID0gY3B1X3RvX2xlNjQoZG1hX2FkZHIpOwogCWMuZmVhdHVyZXMuZmlkID0gY3B1X3RvX2xlMzIoZmlkKTsKIAljLmZlYXR1cmVzLmR3b3JkMTEgPSBjcHVfdG9fbGUzMihkd29yZDExKTsKIAotCXJldCA9IF9fbnZtZV9zdWJtaXRfc3luY19jbWQoZGV2LT5hZG1pbl9xLCAmYywgJmNxZSwgTlVMTCwgMCwgMCwKLQkJCU5WTUVfUUlEX0FOWSwgMCwgMCk7CisJcmV0ID0gX19udm1lX3N1Ym1pdF9zeW5jX2NtZChkZXYtPmFkbWluX3EsICZjLCAmY3FlLAorCQkJYnVmZmVyLCBidWZsZW4sIDAsIE5WTUVfUUlEX0FOWSwgMCwgMCk7CiAJaWYgKHJldCA+PSAwICYmIHJlc3VsdCkKIAkJKnJlc3VsdCA9IGxlMzJfdG9fY3B1KGNxZS5yZXN1bHQpOwogCXJldHVybiByZXQ7CkBAIC02NjQsNyArNjY0LDcgQEAKIAl1MzIgcmVzdWx0OwogCWludCBzdGF0dXMsIG5yX2lvX3F1ZXVlczsKIAotCXN0YXR1cyA9IG52bWVfc2V0X2ZlYXR1cmVzKGN0cmwsIE5WTUVfRkVBVF9OVU1fUVVFVUVTLCBxX2NvdW50LCAwLAorCXN0YXR1cyA9IG52bWVfc2V0X2ZlYXR1cmVzKGN0cmwsIE5WTUVfRkVBVF9OVU1fUVVFVUVTLCBxX2NvdW50LCBOVUxMLCAwLAogCQkJJnJlc3VsdCk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCXJldHVybiBzdGF0dXM7CkBAIC04ODgsNDIgKzg4OCwzMiBAQAogCXF1ZXVlX2ZsYWdfc2V0X3VubG9ja2VkKFFVRVVFX0ZMQUdfRElTQ0FSRCwgbnMtPnF1ZXVlKTsKIH0KIAotc3RhdGljIGludCBudm1lX3JldmFsaWRhdGVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3N0YXRpYyBpbnQgbnZtZV9yZXZhbGlkYXRlX25zKHN0cnVjdCBudm1lX25zICpucywgc3RydWN0IG52bWVfaWRfbnMgKippZCkKIHsKLQlzdHJ1Y3QgbnZtZV9ucyAqbnMgPSBkaXNrLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IG52bWVfaWRfbnMgKmlkOwotCXU4IGxiYWYsIHBpX3R5cGU7Ci0JdTE2IG9sZF9tczsKLQl1bnNpZ25lZCBzaG9ydCBiczsKLQotCWlmICh0ZXN0X2JpdChOVk1FX05TX0RFQUQsICZucy0+ZmxhZ3MpKSB7Ci0JCXNldF9jYXBhY2l0eShkaXNrLCAwKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlmIChudm1lX2lkZW50aWZ5X25zKG5zLT5jdHJsLCBucy0+bnNfaWQsICZpZCkpIHsKLQkJZGV2X3dhcm4oZGlza190b19kZXYobnMtPmRpc2spLCAiJXM6IElkZW50aWZ5IGZhaWx1cmVcbiIsCi0JCQkJX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JaWYgKGlkLT5uY2FwID09IDApIHsKLQkJa2ZyZWUoaWQpOworCWlmIChudm1lX2lkZW50aWZ5X25zKG5zLT5jdHJsLCBucy0+bnNfaWQsIGlkKSkgeworCQlkZXZfd2Fybihucy0+Y3RybC0+ZGV2LCAiJXM6IElkZW50aWZ5IGZhaWx1cmVcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKG52bWVfbnZtX25zX3N1cHBvcnRlZChucywgaWQpICYmIG5zLT50eXBlICE9IE5WTUVfTlNfTElHSFROVk0pIHsKLQkJaWYgKG52bWVfbnZtX3JlZ2lzdGVyKG5zLT5xdWV1ZSwgZGlzay0+ZGlza19uYW1lKSkgewotCQkJZGV2X3dhcm4oZGlza190b19kZXYobnMtPmRpc2spLAotCQkJCSIlczogTGlnaHROVk0gaW5pdCBmYWlsdXJlXG4iLCBfX2Z1bmNfXyk7Ci0JCQlrZnJlZShpZCk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQlucy0+dHlwZSA9IE5WTUVfTlNfTElHSFROVk07CisJaWYgKCgqaWQpLT5uY2FwID09IDApIHsKKwkJa2ZyZWUoKmlkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKG5zLT5jdHJsLT52cyA+PSBOVk1FX1ZTKDEsIDEpKQotCQltZW1jcHkobnMtPmV1aSwgaWQtPmV1aTY0LCBzaXplb2YobnMtPmV1aSkpOworCQltZW1jcHkobnMtPmV1aSwgKCppZCktPmV1aTY0LCBzaXplb2YobnMtPmV1aSkpOwogCWlmIChucy0+Y3RybC0+dnMgPj0gTlZNRV9WUygxLCAyKSkKLQkJbWVtY3B5KG5zLT51dWlkLCBpZC0+bmd1aWQsIHNpemVvZihucy0+dXVpZCkpOworCQltZW1jcHkobnMtPnV1aWQsICgqaWQpLT5uZ3VpZCwgc2l6ZW9mKG5zLT51dWlkKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19udm1lX3JldmFsaWRhdGVfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgc3RydWN0IG52bWVfaWRfbnMgKmlkKQoreworCXN0cnVjdCBudm1lX25zICpucyA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwl1OCBsYmFmLCBwaV90eXBlOworCXUxNiBvbGRfbXM7CisJdW5zaWduZWQgc2hvcnQgYnM7CiAKIAlvbGRfbXMgPSBucy0+bXM7CiAJbGJhZiA9IGlkLT5mbGJhcyAmIE5WTUVfTlNfRkxCQVNfTEJBX01BU0s7CkBAIC05NjIsOCArOTUyLDI2IEBACiAJaWYgKG5zLT5jdHJsLT5vbmNzICYgTlZNRV9DVFJMX09OQ1NfRFNNKQogCQludm1lX2NvbmZpZ19kaXNjYXJkKG5zKTsKIAlibGtfbXFfdW5mcmVlemVfcXVldWUoZGlzay0+cXVldWUpOworfQogCitzdGF0aWMgaW50IG52bWVfcmV2YWxpZGF0ZV9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCXN0cnVjdCBudm1lX25zICpucyA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbnZtZV9pZF9ucyAqaWQgPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAodGVzdF9iaXQoTlZNRV9OU19ERUFELCAmbnMtPmZsYWdzKSkgeworCQlzZXRfY2FwYWNpdHkoZGlzaywgMCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IG52bWVfcmV2YWxpZGF0ZV9ucyhucywgJmlkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJX19udm1lX3JldmFsaWRhdGVfZGlzayhkaXNrLCBpZCk7CiAJa2ZyZWUoaWQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MjUsNyArMTQzMyw3IEBACiBzdGF0aWMgc3NpemVfdCB3d2lkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJCQkJY2hhciAqYnVmKQogewotCXN0cnVjdCBudm1lX25zICpucyA9IGRldl90b19kaXNrKGRldiktPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbnZtZV9ucyAqbnMgPSBudm1lX2dldF9uc19mcm9tX2RldihkZXYpOwogCXN0cnVjdCBudm1lX2N0cmwgKmN0cmwgPSBucy0+Y3RybDsKIAlpbnQgc2VyaWFsX2xlbiA9IHNpemVvZihjdHJsLT5zZXJpYWwpOwogCWludCBtb2RlbF9sZW4gPSBzaXplb2YoY3RybC0+bW9kZWwpOwpAQCAtMTQ0OSw3ICsxNDU3LDcgQEAKIHN0YXRpYyBzc2l6ZV90IHV1aWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkJCQljaGFyICpidWYpCiB7Ci0Jc3RydWN0IG52bWVfbnMgKm5zID0gZGV2X3RvX2Rpc2soZGV2KS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBudm1lX25zICpucyA9IG52bWVfZ2V0X25zX2Zyb21fZGV2KGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXBVXG4iLCBucy0+dXVpZCk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIodXVpZCwgU19JUlVHTywgdXVpZF9zaG93LCBOVUxMKTsKQEAgLTE0NTcsNyArMTQ2NSw3IEBACiBzdGF0aWMgc3NpemVfdCBldWlfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkJCQljaGFyICpidWYpCiB7Ci0Jc3RydWN0IG52bWVfbnMgKm5zID0gZGV2X3RvX2Rpc2soZGV2KS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBudm1lX25zICpucyA9IG52bWVfZ2V0X25zX2Zyb21fZGV2KGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJThwaGRcbiIsIG5zLT5ldWkpOwogfQogc3RhdGljIERFVklDRV9BVFRSKGV1aSwgU19JUlVHTywgZXVpX3Nob3csIE5VTEwpOwpAQCAtMTQ2NSw3ICsxNDczLDcgQEAKIHN0YXRpYyBzc2l6ZV90IG5zaWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkJCQljaGFyICpidWYpCiB7Ci0Jc3RydWN0IG52bWVfbnMgKm5zID0gZGV2X3RvX2Rpc2soZGV2KS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBudm1lX25zICpucyA9IG52bWVfZ2V0X25zX2Zyb21fZGV2KGRldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIG5zLT5uc19pZCk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIobnNpZCwgU19JUlVHTywgbnNpZF9zaG93LCBOVUxMKTsKQEAgLTE0ODIsNyArMTQ5MCw3IEBACiAJCXN0cnVjdCBhdHRyaWJ1dGUgKmEsIGludCBuKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKLQlzdHJ1Y3QgbnZtZV9ucyAqbnMgPSBkZXZfdG9fZGlzayhkZXYpLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG52bWVfbnMgKm5zID0gbnZtZV9nZXRfbnNfZnJvbV9kZXYoZGV2KTsKIAogCWlmIChhID09ICZkZXZfYXR0cl91dWlkLmF0dHIpIHsKIAkJaWYgKCFtZW1jaHJfaW52KG5zLT51dWlkLCAwLCBzaXplb2YobnMtPnV1aWQpKSkKQEAgLTE2NDIsNiArMTY1MCw4IEBACiB7CiAJc3RydWN0IG52bWVfbnMgKm5zOwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOworCXN0cnVjdCBudm1lX2lkX25zICppZDsKKwljaGFyIGRpc2tfbmFtZVtESVNLX05BTUVfTEVOXTsKIAlpbnQgbm9kZSA9IGRldl90b19ub2RlKGN0cmwtPmRldik7CiAKIAlucyA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKm5zKSwgR0ZQX0tFUk5FTCwgbm9kZSk7CkBAIC0xNjU5LDM0ICsxNjY5LDQ5IEBACiAJbnMtPnF1ZXVlLT5xdWV1ZWRhdGEgPSBuczsKIAlucy0+Y3RybCA9IGN0cmw7CiAKLQlkaXNrID0gYWxsb2NfZGlza19ub2RlKDAsIG5vZGUpOwotCWlmICghZGlzaykKLQkJZ290byBvdXRfZnJlZV9xdWV1ZTsKLQogCWtyZWZfaW5pdCgmbnMtPmtyZWYpOwogCW5zLT5uc19pZCA9IG5zaWQ7Ci0JbnMtPmRpc2sgPSBkaXNrOwogCW5zLT5sYmFfc2hpZnQgPSA5OyAvKiBzZXQgdG8gYSBkZWZhdWx0IHZhbHVlIGZvciA1MTIgdW50aWwgZGlzayBpcyB2YWxpZGF0ZWQgKi8KIAotCiAJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShucy0+cXVldWUsIDEgPDwgbnMtPmxiYV9zaGlmdCk7CiAJbnZtZV9zZXRfcXVldWVfbGltaXRzKGN0cmwsIG5zLT5xdWV1ZSk7CiAKLQlkaXNrLT5mb3BzID0gJm52bWVfZm9wczsKLQlkaXNrLT5wcml2YXRlX2RhdGEgPSBuczsKLQlkaXNrLT5xdWV1ZSA9IG5zLT5xdWV1ZTsKLQlkaXNrLT5mbGFncyA9IEdFTkhEX0ZMX0VYVF9ERVZUOwotCXNwcmludGYoZGlzay0+ZGlza19uYW1lLCAibnZtZSVkbiVkIiwgY3RybC0+aW5zdGFuY2UsIG5zLT5pbnN0YW5jZSk7CisJc3ByaW50ZihkaXNrX25hbWUsICJudm1lJWRuJWQiLCBjdHJsLT5pbnN0YW5jZSwgbnMtPmluc3RhbmNlKTsKIAotCWlmIChudm1lX3JldmFsaWRhdGVfZGlzayhucy0+ZGlzaykpCi0JCWdvdG8gb3V0X2ZyZWVfZGlzazsKKwlpZiAobnZtZV9yZXZhbGlkYXRlX25zKG5zLCAmaWQpKQorCQlnb3RvIG91dF9mcmVlX3F1ZXVlOworCisJaWYgKG52bWVfbnZtX25zX3N1cHBvcnRlZChucywgaWQpKSB7CisJCWlmIChudm1lX252bV9yZWdpc3RlcihucywgZGlza19uYW1lLCBub2RlLAorCQkJCQkJCSZudm1lX25zX2F0dHJfZ3JvdXApKSB7CisJCQlkZXZfd2FybihjdHJsLT5kZXYsICIlczogTGlnaHROVk0gaW5pdCBmYWlsdXJlXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIG91dF9mcmVlX2lkOworCQl9CisJfSBlbHNlIHsKKwkJZGlzayA9IGFsbG9jX2Rpc2tfbm9kZSgwLCBub2RlKTsKKwkJaWYgKCFkaXNrKQorCQkJZ290byBvdXRfZnJlZV9pZDsKKworCQlkaXNrLT5mb3BzID0gJm52bWVfZm9wczsKKwkJZGlzay0+cHJpdmF0ZV9kYXRhID0gbnM7CisJCWRpc2stPnF1ZXVlID0gbnMtPnF1ZXVlOworCQlkaXNrLT5mbGFncyA9IEdFTkhEX0ZMX0VYVF9ERVZUOworCQltZW1jcHkoZGlzay0+ZGlza19uYW1lLCBkaXNrX25hbWUsIERJU0tfTkFNRV9MRU4pOworCQlucy0+ZGlzayA9IGRpc2s7CisKKwkJX19udm1lX3JldmFsaWRhdGVfZGlzayhkaXNrLCBpZCk7CisJfQogCiAJbXV0ZXhfbG9jaygmY3RybC0+bmFtZXNwYWNlc19tdXRleCk7CiAJbGlzdF9hZGRfdGFpbCgmbnMtPmxpc3QsICZjdHJsLT5uYW1lc3BhY2VzKTsKIAltdXRleF91bmxvY2soJmN0cmwtPm5hbWVzcGFjZXNfbXV0ZXgpOwogCiAJa3JlZl9nZXQoJmN0cmwtPmtyZWYpOwotCWlmIChucy0+dHlwZSA9PSBOVk1FX05TX0xJR0hUTlZNKQorCisJa2ZyZWUoaWQpOworCisJaWYgKG5zLT5uZGV2KQogCQlyZXR1cm47CiAKIAlkZXZpY2VfYWRkX2Rpc2soY3RybC0+ZGV2aWNlLCBucy0+ZGlzayk7CkBAIC0xNjk1LDggKzE3MjAsOCBAQAogCQlwcl93YXJuKCIlczogZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBncm91cCBmb3IgaWRlbnRpZmljYXRpb25cbiIsCiAJCQlucy0+ZGlzay0+ZGlza19uYW1lKTsKIAlyZXR1cm47Ci0gb3V0X2ZyZWVfZGlzazoKLQlrZnJlZShkaXNrKTsKKyBvdXRfZnJlZV9pZDoKKwlrZnJlZShpZCk7CiAgb3V0X2ZyZWVfcXVldWU6CiAJYmxrX2NsZWFudXBfcXVldWUobnMtPnF1ZXVlKTsKICBvdXRfcmVsZWFzZV9pbnN0YW5jZToKQEAgLTE3MTAsNyArMTczNSw3IEBACiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoTlZNRV9OU19SRU1PVklORywgJm5zLT5mbGFncykpCiAJCXJldHVybjsKIAotCWlmIChucy0+ZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9VUCkgeworCWlmIChucy0+ZGlzayAmJiBucy0+ZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9VUCkgewogCQlpZiAoYmxrX2dldF9pbnRlZ3JpdHkobnMtPmRpc2spKQogCQkJYmxrX2ludGVncml0eV91bnJlZ2lzdGVyKG5zLT5kaXNrKTsKIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkaXNrX3RvX2Rldihucy0+ZGlzayktPmtvYmosCkBAIC0xNzMzLDcgKzE3NTgsNyBAQAogCiAJbnMgPSBudm1lX2ZpbmRfZ2V0X25zKGN0cmwsIG5zaWQpOwogCWlmIChucykgewotCQlpZiAocmV2YWxpZGF0ZV9kaXNrKG5zLT5kaXNrKSkKKwkJaWYgKG5zLT5kaXNrICYmIHJldmFsaWRhdGVfZGlzayhucy0+ZGlzaykpCiAJCQludm1lX25zX3JlbW92ZShucyk7CiAJCW52bWVfcHV0X25zKG5zKTsKIAl9IGVsc2UKQEAgLTIwMzgsNyArMjA2Myw3IEBACiAJCSAqIFJldmFsaWRhdGluZyBhIGRlYWQgbmFtZXNwYWNlIHNldHMgY2FwYWNpdHkgdG8gMC4gVGhpcyB3aWxsCiAJCSAqIGVuZCBidWZmZXJlZCB3cml0ZXJzIGRpcnR5aW5nIHBhZ2VzIHRoYXQgY2FuJ3QgYmUgc3luY2VkLgogCQkgKi8KLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KE5WTUVfTlNfREVBRCwgJm5zLT5mbGFncykpCisJCWlmIChucy0+ZGlzayAmJiAhdGVzdF9hbmRfc2V0X2JpdChOVk1FX05TX0RFQUQsICZucy0+ZmxhZ3MpKQogCQkJcmV2YWxpZGF0ZV9kaXNrKG5zLT5kaXNrKTsKIAogCQlibGtfc2V0X3F1ZXVlX2R5aW5nKG5zLT5xdWV1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmMgYi9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmMKaW5kZXggZGM5OTY3Ni4uNWEzZjAwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL2hvc3QvZmFicmljcy5jCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L2ZhYnJpY3MuYwpAQCAtNDcsOCArNDcsMTAgQEAKIAogCW11dGV4X2xvY2soJm52bWZfaG9zdHNfbXV0ZXgpOwogCWhvc3QgPSBfX252bWZfaG9zdF9maW5kKGhvc3RucW4pOwotCWlmIChob3N0KQorCWlmIChob3N0KSB7CisJCWtyZWZfZ2V0KCZob3N0LT5yZWYpOwogCQlnb3RvIG91dF91bmxvY2s7CisJfQogCiAJaG9zdCA9IGttYWxsb2Moc2l6ZW9mKCpob3N0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFob3N0KQpAQCAtNTYsNyArNTgsNyBAQAogCiAJa3JlZl9pbml0KCZob3N0LT5yZWYpOwogCW1lbWNweShob3N0LT5ucW4sIGhvc3RucW4sIE5WTUZfTlFOX1NJWkUpOwotCXV1aWRfbGVfZ2VuKCZob3N0LT5pZCk7CisJdXVpZF9iZV9nZW4oJmhvc3QtPmlkKTsKIAogCWxpc3RfYWRkX3RhaWwoJmhvc3QtPmxpc3QsICZudm1mX2hvc3RzKTsKIG91dF91bmxvY2s6CkBAIC03Myw5ICs3NSw5IEBACiAJCXJldHVybiBOVUxMOwogCiAJa3JlZl9pbml0KCZob3N0LT5yZWYpOwotCXV1aWRfbGVfZ2VuKCZob3N0LT5pZCk7CisJdXVpZF9iZV9nZW4oJmhvc3QtPmlkKTsKIAlzbnByaW50Zihob3N0LT5ucW4sIE5WTUZfTlFOX1NJWkUsCi0JCSJucW4uMjAxNC0wOC5vcmcubnZtZXhwcmVzczpOVk1mOnV1aWQ6JXBVbCIsICZob3N0LT5pZCk7CisJCSJucW4uMjAxNC0wOC5vcmcubnZtZXhwcmVzczpOVk1mOnV1aWQ6JXBVYiIsICZob3N0LT5pZCk7CiAKIAltdXRleF9sb2NrKCZudm1mX2hvc3RzX211dGV4KTsKIAlsaXN0X2FkZF90YWlsKCZob3N0LT5saXN0LCAmbnZtZl9ob3N0cyk7CkBAIC0xMDksOCArMTExLDE5IEBACiAgKi8KIGludCBudm1mX2dldF9hZGRyZXNzKHN0cnVjdCBudm1lX2N0cmwgKmN0cmwsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCiB7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1Ziwgc2l6ZSwgInRyYWRkcj0lcyx0cnN2Y2lkPSVzXG4iLAotCQkJY3RybC0+b3B0cy0+dHJhZGRyLCBjdHJsLT5vcHRzLT50cnN2Y2lkKTsKKwlpbnQgbGVuID0gMDsKKworCWlmIChjdHJsLT5vcHRzLT5tYXNrICYgTlZNRl9PUFRfVFJBRERSKQorCQlsZW4gKz0gc25wcmludGYoYnVmLCBzaXplLCAidHJhZGRyPSVzIiwgY3RybC0+b3B0cy0+dHJhZGRyKTsKKwlpZiAoY3RybC0+b3B0cy0+bWFzayAmIE5WTUZfT1BUX1RSU1ZDSUQpCisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sICIlc3Ryc3ZjaWQ9JXMiLAorCQkJCShsZW4pID8gIiwiIDogIiIsIGN0cmwtPm9wdHMtPnRyc3ZjaWQpOworCWlmIChjdHJsLT5vcHRzLT5tYXNrICYgTlZNRl9PUFRfSE9TVF9UUkFERFIpCisJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sICIlc2hvc3RfdHJhZGRyPSVzIiwKKwkJCQkobGVuKSA/ICIsIiA6ICIiLCBjdHJsLT5vcHRzLT5ob3N0X3RyYWRkcik7CisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgIlxuIik7CisKKwlyZXR1cm4gbGVuOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobnZtZl9nZXRfYWRkcmVzcyk7CiAKQEAgLTM2Myw3ICszNzYsMTQgQEAKIAljbWQuY29ubmVjdC5vcGNvZGUgPSBudm1lX2ZhYnJpY3NfY29tbWFuZDsKIAljbWQuY29ubmVjdC5mY3R5cGUgPSBudm1lX2ZhYnJpY3NfdHlwZV9jb25uZWN0OwogCWNtZC5jb25uZWN0LnFpZCA9IDA7Ci0JY21kLmNvbm5lY3Quc3FzaXplID0gY3B1X3RvX2xlMTYoY3RybC0+c3FzaXplKTsKKworCS8qCisJICogZmFicmljcyBzcGVjIHNldHMgYSBtaW5pbXVtIG9mIGRlcHRoIDMyIGZvciBhZG1pbiBxdWV1ZSwKKwkgKiBzbyBzZXQgdGhlIHF1ZXVlIHdpdGggdGhpcyBkZXB0aCBhbHdheXMgdW50aWwKKwkgKiBqdXN0aWZpY2F0aW9uIG90aGVyd2lzZS4KKwkgKi8KKwljbWQuY29ubmVjdC5zcXNpemUgPSBjcHVfdG9fbGUxNihOVk1GX0FRX0RFUFRIIC0gMSk7CisKIAkvKgogCSAqIFNldCBrZWVwLWFsaXZlIHRpbWVvdXQgaW4gc2Vjb25kcyBncmFudWxhcml0eSAobXMgKiAxMDAwKQogCSAqIGFuZCBhZGQgYSBncmFjZSBwZXJpb2QgZm9yIGNvbnRyb2xsZXIga2F0byBlbmZvcmNlbWVudApAQCAtMzc1LDcgKzM5NSw3IEBACiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbWNweSgmZGF0YS0+aG9zdGlkLCAmY3RybC0+b3B0cy0+aG9zdC0+aWQsIHNpemVvZih1dWlkX2xlKSk7CisJbWVtY3B5KCZkYXRhLT5ob3N0aWQsICZjdHJsLT5vcHRzLT5ob3N0LT5pZCwgc2l6ZW9mKHV1aWRfYmUpKTsKIAlkYXRhLT5jbnRsaWQgPSBjcHVfdG9fbGUxNigweGZmZmYpOwogCXN0cm5jcHkoZGF0YS0+c3Vic3lzbnFuLCBjdHJsLT5vcHRzLT5zdWJzeXNucW4sIE5WTUZfTlFOX1NJWkUpOwogCXN0cm5jcHkoZGF0YS0+aG9zdG5xbiwgY3RybC0+b3B0cy0+aG9zdC0+bnFuLCBOVk1GX05RTl9TSVpFKTsKQEAgLTQzNCw3ICs0NTQsNyBAQAogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1jcHkoJmRhdGEtPmhvc3RpZCwgJmN0cmwtPm9wdHMtPmhvc3QtPmlkLCBzaXplb2YodXVpZF9sZSkpOworCW1lbWNweSgmZGF0YS0+aG9zdGlkLCAmY3RybC0+b3B0cy0+aG9zdC0+aWQsIHNpemVvZih1dWlkX2JlKSk7CiAJZGF0YS0+Y250bGlkID0gY3B1X3RvX2xlMTYoY3RybC0+Y250bGlkKTsKIAlzdHJuY3B5KGRhdGEtPnN1YnN5c25xbiwgY3RybC0+b3B0cy0+c3Vic3lzbnFuLCBOVk1GX05RTl9TSVpFKTsKIAlzdHJuY3B5KGRhdGEtPmhvc3RucW4sIGN0cmwtPm9wdHMtPmhvc3QtPm5xbiwgTlZNRl9OUU5fU0laRSk7CkBAIC01MTAsNiArNTMwLDcgQEAKIAl7IE5WTUZfT1BUX1JFQ09OTkVDVF9ERUxBWSwJInJlY29ubmVjdF9kZWxheT0lZCIJfSwKIAl7IE5WTUZfT1BUX0tBVE8sCQkia2VlcF9hbGl2ZV90bW89JWQiCX0sCiAJeyBOVk1GX09QVF9IT1NUTlFOLAkJImhvc3RucW49JXMiCQl9LAorCXsgTlZNRl9PUFRfSE9TVF9UUkFERFIsCQkiaG9zdF90cmFkZHI9JXMiCX0sCiAJeyBOVk1GX09QVF9FUlIsCQkJTlVMTAkJCX0KIH07CiAKQEAgLTY2Niw2ICs2ODcsMTQgQEAKIAkJCX0KIAkJCW9wdHMtPnJlY29ubmVjdF9kZWxheSA9IHRva2VuOwogCQkJYnJlYWs7CisJCWNhc2UgTlZNRl9PUFRfSE9TVF9UUkFERFI6CisJCQlwID0gbWF0Y2hfc3RyZHVwKGFyZ3MpOworCQkJaWYgKCFwKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCW9wdHMtPmhvc3RfdHJhZGRyID0gcDsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJfd2FybigidW5rbm93biBwYXJhbWV0ZXIgb3IgbWlzc2luZyB2YWx1ZSAnJXMnIGluIGN0cmwgY3JlYXRpb24gcmVxdWVzdFxuIiwKIAkJCQlwKTsKQEAgLTczMiw2ICs3NjEsNyBAQAogCWtmcmVlKG9wdHMtPnRyYWRkcik7CiAJa2ZyZWUob3B0cy0+dHJzdmNpZCk7CiAJa2ZyZWUob3B0cy0+c3Vic3lzbnFuKTsKKwlrZnJlZShvcHRzLT5ob3N0X3RyYWRkcik7CiAJa2ZyZWUob3B0cyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChudm1mX2ZyZWVfb3B0aW9ucyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmggYi9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmgKaW5kZXggODlkZjUyYy4uOTI0MTQ1YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS9ob3N0L2ZhYnJpY3MuaAorKysgYi9kcml2ZXJzL252bWUvaG9zdC9mYWJyaWNzLmgKQEAgLTM0LDcgKzM0LDcgQEAKIAlzdHJ1Y3Qga3JlZgkJcmVmOwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAljaGFyCQkJbnFuW05WTUZfTlFOX1NJWkVdOwotCXV1aWRfbGUJCQlpZDsKKwl1dWlkX2JlCQkJaWQ7CiB9OwogCiAvKioKQEAgLTUyLDYgKzUyLDcgQEAKIAlOVk1GX09QVF9LQVRPCQk9IDEgPDwgNywKIAlOVk1GX09QVF9IT1NUTlFOCT0gMSA8PCA4LAogCU5WTUZfT1BUX1JFQ09OTkVDVF9ERUxBWSA9IDEgPDwgOSwKKwlOVk1GX09QVF9IT1NUX1RSQUREUgk9IDEgPDwgMTAsCiB9OwogCiAvKioKQEAgLTY0LDkgKzY1LDEyIEBACiAgKgkJYmVpbmcgYWRkZWQuCiAgKiBAc3Vic3lzbnFuOglIb2xkIHRoZSBmdWxseSBxdWFsaWZpZWQgTlFOIHN1YnlzdGVtIG5hbWUgKGZvcm1hdCBkZWZpbmVkCiAgKgkJaW4gdGhlIE5WTWUgc3BlY2lmaWNhdGlvbiwgIk5WTWUgUXVhbGlmaWVkIE5hbWVzIikuCi0gKiBAdHJhZGRyOgluZXR3b3JrIGFkZHJlc3MgdGhhdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGhvc3QgdG8gY29tbXVuaWNhdGUKLSAqCQl0byB0aGUgYWRkZWQgTlZNZSBjb250cm9sbGVyLgotICogQHRyc3ZjaWQ6CW5ldHdvcmsgcG9ydCB1c2VkIGZvciBob3N0LWNvbnRyb2xsZXIgY29tbXVuaWNhdGlvbi4KKyAqIEB0cmFkZHI6CVRoZSB0cmFuc3BvcnQtc3BlY2lmaWMgVFJBRERSIGZpZWxkIGZvciBhIHBvcnQgb24gdGhlCisgKiAgICAgICAgICAgICAgc3Vic3lzdGVtIHdoaWNoIGlzIGFkZGluZyBhIGNvbnRyb2xsZXIuCisgKiBAdHJzdmNpZDoJVGhlIHRyYW5zcG9ydC1zcGVjaWZpYyBUUlNWQ0lEIGZpZWxkIGZvciBhIHBvcnQgb24gdGhlCisgKiAgICAgICAgICAgICAgc3Vic3lzdGVtIHdoaWNoIGlzIGFkZGluZyBhIGNvbnRyb2xsZXIuCisgKiBAaG9zdF90cmFkZHI6IEEgdHJhbnNwb3J0LXNwZWNpZmljIGZpZWxkIGlkZW50aWZ5aW5nIHRoZSBOVk1FIGhvc3QgcG9ydAorICogICAgICAgICAgICAgIHRvIHVzZSBmb3IgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGNvbnRyb2xsZXIuCiAgKiBAcXVldWVfc2l6ZTogTnVtYmVyIG9mIElPIHF1ZXVlIGVsZW1lbnRzLgogICogQG5yX2lvX3F1ZXVlczogTnVtYmVyIG9mIGNvbnRyb2xsZXIgSU8gcXVldWVzIHRoYXQgd2lsbCBiZSBlc3RhYmxpc2hlZC4KICAqIEByZWNvbm5lY3RfZGVsYXk6IFRpbWUgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgcmVjb25uZWN0IGF0dGVtcHRzLgpAQCAtODAsNiArODQsNyBAQAogCWNoYXIJCQkqc3Vic3lzbnFuOwogCWNoYXIJCQkqdHJhZGRyOwogCWNoYXIJCQkqdHJzdmNpZDsKKwljaGFyCQkJKmhvc3RfdHJhZGRyOwogCXNpemVfdAkJCXF1ZXVlX3NpemU7CiAJdW5zaWduZWQgaW50CQlucl9pb19xdWV1ZXM7CiAJdW5zaWduZWQgaW50CQlyZWNvbm5lY3RfZGVsYXk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9saWdodG52bS5jIGIvZHJpdmVycy9udm1lL2hvc3QvbGlnaHRudm0uYwppbmRleCA2M2Y0ODNkLi5mNWUzMDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9saWdodG52bS5jCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L2xpZ2h0bnZtLmMKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCiAJaWYgKHJxZC0+b3Bjb2RlID09IE5WTV9PUF9IQldSSVRFIHx8IHJxZC0+b3Bjb2RlID09IE5WTV9PUF9IQlJFQUQpCiAJCWMtPmhiX3J3LnNsYmEgPSBjcHVfdG9fbGU2NChudm1lX2Jsb2NrX25yKG5zLAotCQkJCQkJcnFkLT5iaW8tPmJpX2l0ZXIuYmlfc2VjdG9yKSk7CisJCQkJCXJxZC0+YmlvLT5iaV9pdGVyLmJpX3NlY3RvcikpOwogfQogCiBzdGF0aWMgdm9pZCBudm1lX252bV9lbmRfaW8oc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IpCkBAIC01OTIsMTQgKzU5MiwzNyBAQAogCS5tYXhfcGh5c19zZWN0CQk9IDY0LAogfTsKIAotaW50IG52bWVfbnZtX3JlZ2lzdGVyKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpkaXNrX25hbWUpCitpbnQgbnZtZV9udm1fcmVnaXN0ZXIoc3RydWN0IG52bWVfbnMgKm5zLCBjaGFyICpkaXNrX25hbWUsIGludCBub2RlLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRycykKIHsKLQlyZXR1cm4gbnZtX3JlZ2lzdGVyKHEsIGRpc2tfbmFtZSwgJm52bWVfbnZtX2Rldl9vcHMpOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gbnMtPnF1ZXVlOworCXN0cnVjdCBudm1fZGV2ICpkZXY7CisJaW50IHJldDsKKworCWRldiA9IG52bV9hbGxvY19kZXYobm9kZSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5xID0gcTsKKwltZW1jcHkoZGV2LT5uYW1lLCBkaXNrX25hbWUsIERJU0tfTkFNRV9MRU4pOworCWRldi0+b3BzID0gJm52bWVfbnZtX2Rldl9vcHM7CisJZGV2LT5wYXJlbnRfZGV2ID0gbnMtPmN0cmwtPmRldmljZTsKKwlkZXYtPnByaXZhdGVfZGF0YSA9IG5zOworCW5zLT5uZGV2ID0gZGV2OworCisJcmV0ID0gbnZtX3JlZ2lzdGVyKGRldik7CisKKwlucy0+bGJhX3NoaWZ0ID0gaWxvZzIoZGV2LT5zZWNfc2l6ZSkgLSA5OworCisJaWYgKHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5kZXYua29iaiwgYXR0cnMpKQorCQlwcl93YXJuKCIlczogZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBncm91cCBmb3IgaWRlbnRpZmljYXRpb25cbiIsCisJCQlkaXNrX25hbWUpOworCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgbnZtZV9udm1fdW5yZWdpc3RlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqZGlza19uYW1lKQordm9pZCBudm1lX252bV91bnJlZ2lzdGVyKHN0cnVjdCBudm1lX25zICpucykKIHsKLQludm1fdW5yZWdpc3RlcihkaXNrX25hbWUpOworCW52bV91bnJlZ2lzdGVyKG5zLT5uZGV2KTsKIH0KIAogLyogbW92ZSB0byBzaGFyZWQgcGxhY2Ugd2hlbiB1c2VkIGluIG11bHRpcGxlIHBsYWNlcy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L252bWUuaCBiL2RyaXZlcnMvbnZtZS9ob3N0L252bWUuaAppbmRleCBhYjE4Yjc4Li5iMGE5ZWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9udm1lLmgKKysrIGIvZHJpdmVycy9udm1lL2hvc3QvbnZtZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsay1tcS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpZ2h0bnZtLmg+CiAKIGVudW0gewogCS8qCkBAIC0xNTQsNiArMTU1LDcgQEAKIAlzdHJ1Y3QgbnZtZV9jdHJsICpjdHJsOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlzdHJ1Y3QgbnZtX2RldiAqbmRldjsKIAlzdHJ1Y3Qga3JlZiBrcmVmOwogCWludCBpbnN0YW5jZTsKIApAQCAtMTY1LDcgKzE2Nyw2IEBACiAJdTE2IG1zOwogCWJvb2wgZXh0OwogCXU4IHBpX3R5cGU7Ci0JaW50IHR5cGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogI2RlZmluZSBOVk1FX05TX1JFTU9WSU5HIDAKQEAgLTI5Miw5ICsyOTMsOSBAQAogCQlzdHJ1Y3QgbnZtZV9pZF9ucyAqKmlkKTsKIGludCBudm1lX2dldF9sb2dfcGFnZShzdHJ1Y3QgbnZtZV9jdHJsICpkZXYsIHN0cnVjdCBudm1lX3NtYXJ0X2xvZyAqKmxvZyk7CiBpbnQgbnZtZV9nZXRfZmVhdHVyZXMoc3RydWN0IG52bWVfY3RybCAqZGV2LCB1bnNpZ25lZCBmaWQsIHVuc2lnbmVkIG5zaWQsCi0JCQlkbWFfYWRkcl90IGRtYV9hZGRyLCB1MzIgKnJlc3VsdCk7CisJCSAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbiwgdTMyICpyZXN1bHQpOwogaW50IG52bWVfc2V0X2ZlYXR1cmVzKHN0cnVjdCBudm1lX2N0cmwgKmRldiwgdW5zaWduZWQgZmlkLCB1bnNpZ25lZCBkd29yZDExLAotCQkJZG1hX2FkZHJfdCBkbWFfYWRkciwgdTMyICpyZXN1bHQpOworCQkgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBidWZsZW4sIHUzMiAqcmVzdWx0KTsKIGludCBudm1lX3NldF9xdWV1ZV9jb3VudChzdHJ1Y3QgbnZtZV9jdHJsICpjdHJsLCBpbnQgKmNvdW50KTsKIHZvaWQgbnZtZV9zdGFydF9rZWVwX2FsaXZlKHN0cnVjdCBudm1lX2N0cmwgKmN0cmwpOwogdm9pZCBudm1lX3N0b3Bfa2VlcF9hbGl2ZShzdHJ1Y3QgbnZtZV9jdHJsICpjdHJsKTsKQEAgLTMwNywyMCArMzA4LDM1IEBACiAKICNpZmRlZiBDT05GSUdfTlZNCiBpbnQgbnZtZV9udm1fbnNfc3VwcG9ydGVkKHN0cnVjdCBudm1lX25zICpucywgc3RydWN0IG52bWVfaWRfbnMgKmlkKTsKLWludCBudm1lX252bV9yZWdpc3RlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqZGlza19uYW1lKTsKLXZvaWQgbnZtZV9udm1fdW5yZWdpc3RlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqZGlza19uYW1lKTsKK2ludCBudm1lX252bV9yZWdpc3RlcihzdHJ1Y3QgbnZtZV9ucyAqbnMsIGNoYXIgKmRpc2tfbmFtZSwgaW50IG5vZGUsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmF0dHJzKTsKK3ZvaWQgbnZtZV9udm1fdW5yZWdpc3RlcihzdHJ1Y3QgbnZtZV9ucyAqbnMpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBudm1lX25zICpudm1lX2dldF9uc19mcm9tX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+dHlwZS0+ZGV2bm9kZSkKKwkJcmV0dXJuIGRldl90b19kaXNrKGRldiktPnByaXZhdGVfZGF0YTsKKworCXJldHVybiAoY29udGFpbmVyX29mKGRldiwgc3RydWN0IG52bV9kZXYsIGRldikpLT5wcml2YXRlX2RhdGE7Cit9CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQgbnZtZV9udm1fcmVnaXN0ZXIoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKmRpc2tfbmFtZSkKK3N0YXRpYyBpbmxpbmUgaW50IG52bWVfbnZtX3JlZ2lzdGVyKHN0cnVjdCBudm1lX25zICpucywgY2hhciAqZGlza19uYW1lLAorCQkJCSAgICBpbnQgbm9kZSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cnMpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBudm1lX252bV91bnJlZ2lzdGVyKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpkaXNrX25hbWUpIHt9Oworc3RhdGljIGlubGluZSB2b2lkIG52bWVfbnZtX3VucmVnaXN0ZXIoc3RydWN0IG52bWVfbnMgKm5zKSB7fTsKIAogc3RhdGljIGlubGluZSBpbnQgbnZtZV9udm1fbnNfc3VwcG9ydGVkKHN0cnVjdCBudm1lX25zICpucywgc3RydWN0IG52bWVfaWRfbnMgKmlkKQogewogCXJldHVybiAwOwogfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbnZtZV9ucyAqbnZtZV9nZXRfbnNfZnJvbV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXZfdG9fZGlzayhkZXYpLT5wcml2YXRlX2RhdGE7Cit9CiAjZW5kaWYgLyogQ09ORklHX05WTSAqLwogCiBpbnQgX19pbml0IG52bWVfY29yZV9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL2hvc3QvcGNpLmMgYi9kcml2ZXJzL252bWUvaG9zdC9wY2kuYwppbmRleCA4ZGNmNWE5Li42MGY3ZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9wY2kuYworKysgYi9kcml2ZXJzL252bWUvaG9zdC9wY2kuYwpAQCAtMTY5Myw3ICsxNjkzLDEyIEBACiAJCW52bWVfc3VzcGVuZF9xdWV1ZShkZXYtPnF1ZXVlc1tpXSk7CiAKIAlpZiAoY3N0cyAmIE5WTUVfQ1NUU19DRlMgfHwgIShjc3RzICYgTlZNRV9DU1RTX1JEWSkpIHsKLQkJbnZtZV9zdXNwZW5kX3F1ZXVlKGRldi0+cXVldWVzWzBdKTsKKwkJLyogQSBkZXZpY2UgbWlnaHQgYmVjb21lIElPIGluY2FwYWJsZSB2ZXJ5IHNvb24gZHVyaW5nCisJCSAqIHByb2JlLCBiZWZvcmUgdGhlIGFkbWluIHF1ZXVlIGlzIGNvbmZpZ3VyZWQuIFRodXMsCisJCSAqIHF1ZXVlX2NvdW50IGNhbiBiZSAwIGhlcmUuCisJCSAqLworCQlpZiAoZGV2LT5xdWV1ZV9jb3VudCkKKwkJCW52bWVfc3VzcGVuZF9xdWV1ZShkZXYtPnF1ZXVlc1swXSk7CiAJfSBlbHNlIHsKIAkJbnZtZV9kaXNhYmxlX2lvX3F1ZXVlcyhkZXYpOwogCQludm1lX2Rpc2FibGVfYWRtaW5fcXVldWUoZGV2LCBzaHV0ZG93bik7CkBAIC0yMTEyLDYgKzIxMTcsOCBAQAogCQkuZHJpdmVyX2RhdGEgPSBOVk1FX1FVSVJLX0lERU5USUZZX0NOUywgfSwKIAl7IFBDSV9ERVZJQ0UoMHgxYzU4LCAweDAwMDMpLAkvKiBIR1NUIGFkYXB0ZXIgKi8KIAkJLmRyaXZlcl9kYXRhID0gTlZNRV9RVUlSS19ERUxBWV9CRUZPUkVfQ0hLX1JEWSwgfSwKKwl7IFBDSV9ERVZJQ0UoMHgxYzVmLCAweDA1NDApLAkvKiBNZW1ibGF6ZSBQYmxhemU0IGFkYXB0ZXIgKi8KKwkJLmRyaXZlcl9kYXRhID0gTlZNRV9RVUlSS19ERUxBWV9CRUZPUkVfQ0hLX1JEWSwgfSwKIAl7IFBDSV9ERVZJQ0VfQ0xBU1MoUENJX0NMQVNTX1NUT1JBR0VfRVhQUkVTUywgMHhmZmZmZmYpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVBQTEUsIDB4MjAwMSkgfSwKIAl7IDAsIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L3JkbWEuYyBiL2RyaXZlcnMvbnZtZS9ob3N0L3JkbWEuYwppbmRleCA4ZDI4NzViLi5mYmRiMjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9yZG1hLmMKKysrIGIvZHJpdmVycy9udm1lL2hvc3QvcmRtYS5jCkBAIC00MywxMCArNDMsNiBAQAogCiAjZGVmaW5lIE5WTUVfUkRNQV9NQVhfSU5MSU5FX1NFR01FTlRTCTEKIAotI2RlZmluZSBOVk1FX1JETUFfTUFYX1BBR0VTX1BFUl9NUgk1MTIKLQotI2RlZmluZSBOVk1FX1JETUFfREVGX1JFQ09OTkVDVF9ERUxBWQkyMAotCiAvKgogICogV2UgaGFuZGxlIEFFTiBjb21tYW5kcyBvdXJzZWx2ZXMgYW5kIGRvbid0IGV2ZW4gbGV0IHRoZQogICogYmxvY2sgbGF5ZXIga25vdyBhYm91dCB0aGVtLgpAQCAtNzcsNyArNzMsNiBAQAogCXUzMgkJCW51bV9zZ2U7CiAJaW50CQkJbmVudHM7CiAJYm9vbAkJCWlubGluZV9kYXRhOwotCWJvb2wJCQluZWVkX2ludmFsOwogCXN0cnVjdCBpYl9yZWdfd3IJcmVnX3dyOwogCXN0cnVjdCBpYl9jcWUJCXJlZ19jcWU7CiAJc3RydWN0IG52bWVfcmRtYV9xdWV1ZSAgKnF1ZXVlOwpAQCAtODcsNiArODIsOCBAQAogCiBlbnVtIG52bWVfcmRtYV9xdWV1ZV9mbGFncyB7CiAJTlZNRV9SRE1BX1FfQ09OTkVDVEVEID0gKDEgPDwgMCksCisJTlZNRV9SRE1BX0lCX1FVRVVFX0FMTE9DQVRFRCA9ICgxIDw8IDEpLAorCU5WTUVfUkRNQV9RX0RFTEVUSU5HID0gKDEgPDwgMiksCiB9OwogCiBzdHJ1Y3QgbnZtZV9yZG1hX3F1ZXVlIHsKQEAgLTI4Niw3ICsyODMsNyBAQAogCXN0cnVjdCBudm1lX3JkbWFfcmVxdWVzdCAqcmVxID0gYmxrX21xX3JxX3RvX3BkdShycSk7CiAJaW50IHJldCA9IDA7CiAKLQlpZiAoIXJlcS0+bmVlZF9pbnZhbCkKKwlpZiAoIXJlcS0+bXItPm5lZWRfaW52YWwpCiAJCWdvdG8gb3V0OwogCiAJaWJfZGVyZWdfbXIocmVxLT5tcik7CkBAIC0yOTYsOSArMjkzLDEwIEBACiAJaWYgKElTX0VSUihyZXEtPm1yKSkgewogCQlyZXQgPSBQVFJfRVJSKHJlcS0+bXIpOwogCQlyZXEtPm1yID0gTlVMTDsKKwkJZ290byBvdXQ7CiAJfQogCi0JcmVxLT5uZWVkX2ludmFsID0gZmFsc2U7CisJcmVxLT5tci0+bmVlZF9pbnZhbCA9IGZhbHNlOwogCiBvdXQ6CiAJcmV0dXJuIHJldDsKQEAgLTQ4NSw5ICs0ODMsMTQgQEAKIAogc3RhdGljIHZvaWQgbnZtZV9yZG1hX2Rlc3Ryb3lfcXVldWVfaWIoc3RydWN0IG52bWVfcmRtYV9xdWV1ZSAqcXVldWUpCiB7Ci0Jc3RydWN0IG52bWVfcmRtYV9kZXZpY2UgKmRldiA9IHF1ZXVlLT5kZXZpY2U7Ci0Jc3RydWN0IGliX2RldmljZSAqaWJkZXYgPSBkZXYtPmRldjsKKwlzdHJ1Y3QgbnZtZV9yZG1hX2RldmljZSAqZGV2OworCXN0cnVjdCBpYl9kZXZpY2UgKmliZGV2OwogCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTlZNRV9SRE1BX0lCX1FVRVVFX0FMTE9DQVRFRCwgJnF1ZXVlLT5mbGFncykpCisJCXJldHVybjsKKworCWRldiA9IHF1ZXVlLT5kZXZpY2U7CisJaWJkZXYgPSBkZXYtPmRldjsKIAlyZG1hX2Rlc3Ryb3lfcXAocXVldWUtPmNtX2lkKTsKIAlpYl9mcmVlX2NxKHF1ZXVlLT5pYl9jcSk7CiAKQEAgLTUzOCw2ICs1NDEsNyBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9kZXN0cm95X3FwOwogCX0KKwlzZXRfYml0KE5WTUVfUkRNQV9JQl9RVUVVRV9BTExPQ0FURUQsICZxdWV1ZS0+ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTU5MCwxMSArNTk0LDEzIEBACiAJCWdvdG8gb3V0X2Rlc3Ryb3lfY21faWQ7CiAJfQogCisJY2xlYXJfYml0KE5WTUVfUkRNQV9RX0RFTEVUSU5HLCAmcXVldWUtPmZsYWdzKTsKIAlzZXRfYml0KE5WTUVfUkRNQV9RX0NPTk5FQ1RFRCwgJnF1ZXVlLT5mbGFncyk7CiAKIAlyZXR1cm4gMDsKIAogb3V0X2Rlc3Ryb3lfY21faWQ6CisJbnZtZV9yZG1hX2Rlc3Ryb3lfcXVldWVfaWIocXVldWUpOwogCXJkbWFfZGVzdHJveV9pZChxdWV1ZS0+Y21faWQpOwogCXJldHVybiByZXQ7CiB9CkBAIC02MTMsNyArNjE5LDcgQEAKIAogc3RhdGljIHZvaWQgbnZtZV9yZG1hX3N0b3BfYW5kX2ZyZWVfcXVldWUoc3RydWN0IG52bWVfcmRtYV9xdWV1ZSAqcXVldWUpCiB7Ci0JaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoTlZNRV9SRE1BX1FfQ09OTkVDVEVELCAmcXVldWUtPmZsYWdzKSkKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChOVk1FX1JETUFfUV9ERUxFVElORywgJnF1ZXVlLT5mbGFncykpCiAJCXJldHVybjsKIAludm1lX3JkbWFfc3RvcF9xdWV1ZShxdWV1ZSk7CiAJbnZtZV9yZG1hX2ZyZWVfcXVldWUocXVldWUpOwpAQCAtNjQ1LDcgKzY1MSw4IEBACiAJaW50IGksIHJldDsKIAogCWZvciAoaSA9IDE7IGkgPCBjdHJsLT5xdWV1ZV9jb3VudDsgaSsrKSB7Ci0JCXJldCA9IG52bWVfcmRtYV9pbml0X3F1ZXVlKGN0cmwsIGksIGN0cmwtPmN0cmwuc3FzaXplKTsKKwkJcmV0ID0gbnZtZV9yZG1hX2luaXRfcXVldWUoY3RybCwgaSwKKwkJCQkJICAgY3RybC0+Y3RybC5vcHRzLT5xdWV1ZV9zaXplKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2luZm8oY3RybC0+Y3RybC5kZXZpY2UsCiAJCQkJImZhaWxlZCB0byBpbml0aWFsaXplIGkvbyBxdWV1ZTogJWRcbiIsIHJldCk7CkBAIC02NTYsNyArNjYzLDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0X2ZyZWVfcXVldWVzOgotCWZvciAoOyBpID49IDE7IGktLSkKKwlmb3IgKGktLTsgaSA+PSAxOyBpLS0pCiAJCW52bWVfcmRtYV9zdG9wX2FuZF9mcmVlX3F1ZXVlKCZjdHJsLT5xdWV1ZXNbaV0pOwogCiAJcmV0dXJuIHJldDsKQEAgLTc2NSw4ICs3NzIsMTMgQEAKIHsKIAlzdHJ1Y3QgbnZtZV9yZG1hX2N0cmwgKmN0cmwgPSBjb250YWluZXJfb2Yod29yaywKIAkJCXN0cnVjdCBudm1lX3JkbWFfY3RybCwgZXJyX3dvcmspOworCWludCBpOwogCiAJbnZtZV9zdG9wX2tlZXBfYWxpdmUoJmN0cmwtPmN0cmwpOworCisJZm9yIChpID0gMDsgaSA8IGN0cmwtPnF1ZXVlX2NvdW50OyBpKyspCisJCWNsZWFyX2JpdChOVk1FX1JETUFfUV9DT05ORUNURUQsICZjdHJsLT5xdWV1ZXNbaV0uZmxhZ3MpOworCiAJaWYgKGN0cmwtPnF1ZXVlX2NvdW50ID4gMSkKIAkJbnZtZV9zdG9wX3F1ZXVlcygmY3RybC0+Y3RybCk7CiAJYmxrX21xX3N0b3BfaHdfcXVldWVzKGN0cmwtPmN0cmwuYWRtaW5fcSk7CkBAIC04NDksNyArODYxLDcgQEAKIAlpZiAoIWJsa19ycV9ieXRlcyhycSkpCiAJCXJldHVybjsKIAotCWlmIChyZXEtPm5lZWRfaW52YWwpIHsKKwlpZiAocmVxLT5tci0+bmVlZF9pbnZhbCkgewogCQlyZXMgPSBudm1lX3JkbWFfaW52X3JrZXkocXVldWUsIHJlcSk7CiAJCWlmIChyZXMgPCAwKSB7CiAJCQlkZXZfZXJyKGN0cmwtPmN0cmwuZGV2aWNlLApAQCAtOTM1LDcgKzk0Nyw3IEBACiAJCQkgICAgIElCX0FDQ0VTU19SRU1PVEVfUkVBRCB8CiAJCQkgICAgIElCX0FDQ0VTU19SRU1PVEVfV1JJVEU7CiAKLQlyZXEtPm5lZWRfaW52YWwgPSB0cnVlOworCXJlcS0+bXItPm5lZWRfaW52YWwgPSB0cnVlOwogCiAJc2ctPmFkZHIgPSBjcHVfdG9fbGU2NChyZXEtPm1yLT5pb3ZhKTsKIAlwdXRfdW5hbGlnbmVkX2xlMjQocmVxLT5tci0+bGVuZ3RoLCBzZy0+bGVuZ3RoKTsKQEAgLTk1OCw3ICs5NzAsNyBAQAogCiAJcmVxLT5udW1fc2dlID0gMTsKIAlyZXEtPmlubGluZV9kYXRhID0gZmFsc2U7Ci0JcmVxLT5uZWVkX2ludmFsID0gZmFsc2U7CisJcmVxLT5tci0+bmVlZF9pbnZhbCA9IGZhbHNlOwogCiAJYy0+Y29tbW9uLmZsYWdzIHw9IE5WTUVfQ01EX1NHTF9NRVRBQlVGOwogCkBAIC0xMTQ1LDcgKzExNTcsNyBAQAogCiAJaWYgKCh3Yy0+d2NfZmxhZ3MgJiBJQl9XQ19XSVRIX0lOVkFMSURBVEUpICYmCiAJICAgIHdjLT5leC5pbnZhbGlkYXRlX3JrZXkgPT0gcmVxLT5tci0+cmtleSkKLQkJcmVxLT5uZWVkX2ludmFsID0gZmFsc2U7CisJCXJlcS0+bXItPm5lZWRfaW52YWwgPSBmYWxzZTsKIAogCWJsa19tcV9jb21wbGV0ZV9yZXF1ZXN0KHJxLCBzdGF0dXMpOwogCkBAIC0xMjc4LDggKzEyOTAsMjIgQEAKIAogCXByaXYucmVjZm10ID0gY3B1X3RvX2xlMTYoTlZNRV9SRE1BX0NNX0ZNVF8xXzApOwogCXByaXYucWlkID0gY3B1X3RvX2xlMTYobnZtZV9yZG1hX3F1ZXVlX2lkeChxdWV1ZSkpOwotCXByaXYuaHJxc2l6ZSA9IGNwdV90b19sZTE2KHF1ZXVlLT5xdWV1ZV9zaXplKTsKLQlwcml2LmhzcXNpemUgPSBjcHVfdG9fbGUxNihxdWV1ZS0+cXVldWVfc2l6ZSk7CisJLyoKKwkgKiBzZXQgdGhlIGFkbWluIHF1ZXVlIGRlcHRoIHRvIHRoZSBtaW5pbXVtIHNpemUKKwkgKiBzcGVjaWZpZWQgYnkgdGhlIEZhYnJpY3Mgc3RhbmRhcmQuCisJICovCisJaWYgKHByaXYucWlkID09IDApIHsKKwkJcHJpdi5ocnFzaXplID0gY3B1X3RvX2xlMTYoTlZNRl9BUV9ERVBUSCk7CisJCXByaXYuaHNxc2l6ZSA9IGNwdV90b19sZTE2KE5WTUZfQVFfREVQVEggLSAxKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBjdXJyZW50IGludGVycHJldGF0aW9uIG9mIHRoZSBmYWJyaWNzIHNwZWMKKwkJICogaXMgYXQgbWluaW11bSB5b3UgbWFrZSBocnFzaXplIHNxc2l6ZSsxLCBvciBhCisJCSAqIDEncyBiYXNlZCByZXByZXNlbnRhdGlvbiBvZiBzcXNpemUuCisJCSAqLworCQlwcml2LmhycXNpemUgPSBjcHVfdG9fbGUxNihxdWV1ZS0+cXVldWVfc2l6ZSk7CisJCXByaXYuaHNxc2l6ZSA9IGNwdV90b19sZTE2KHF1ZXVlLT5jdHJsLT5jdHJsLnNxc2l6ZSk7CisJfQogCiAJcmV0ID0gcmRtYV9jb25uZWN0KHF1ZXVlLT5jbV9pZCwgJnBhcmFtKTsKIAlpZiAocmV0KSB7CkBAIC0xMjk1LDU4ICsxMzIxLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKioKLSAqIG52bWVfcmRtYV9kZXZpY2VfdW5wbHVnKCkgLSBIYW5kbGUgUkRNQSBkZXZpY2UgdW5wbHVnCi0gKiBAcXVldWU6ICAgICAgUXVldWUgdGhhdCBvd25zIHRoZSBjbV9pZCB0aGF0IGNhdWdodCB0aGUgZXZlbnQKLSAqCi0gKiBERVZJQ0VfUkVNT1ZBTCBldmVudCBub3RpZmllcyB1cyB0aGF0IHRoZSBSRE1BIGRldmljZSBpcyBhYm91dAotICogdG8gdW5wbHVnIHNvIHdlIHNob3VsZCB0YWtlIGNhcmUgb2YgZGVzdHJveWluZyBvdXIgUkRNQSByZXNvdXJjZXMuCi0gKiBUaGlzIGV2ZW50IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBlYWNoIGFsbG9jYXRlZCBjbV9pZC4KLSAqCi0gKiBJbiBvdXIgY2FzZSwgdGhlIFJETUEgcmVzb3VyY2VzIGFyZSBtYW5hZ2VkIHBlciBjb250cm9sbGVyIGFuZCBub3QKLSAqIG9ubHkgcGVyIHF1ZXVlLiBTbyB0aGUgd2F5IHdlIGhhbmRsZSB0aGlzIGlzIHdlIHRyaWdnZXIgYW4gaW1wbGljaXQKLSAqIGNvbnRyb2xsZXIgZGVsZXRpb24gdXBvbiB0aGUgZmlyc3QgREVWSUNFX1JFTU9WQUwgZXZlbnQgd2Ugc2VlLCBhbmQKLSAqIGhvbGQgdGhlIGV2ZW50IGluZmxpZ2h0IHVudGlsIHRoZSBjb250cm9sbGVyIGRlbGV0aW9uIGlzIGNvbXBsZXRlZC4KLSAqCi0gKiBPbmUgZXhjZXB0aW9uIHRoYXQgd2UgbmVlZCB0byBoYW5kbGUgaXMgdGhlIGRlc3RydWN0aW9uIG9mIHRoZSBjbV9pZAotICogdGhhdCBjYXVnaHQgdGhlIGV2ZW50LiBTaW5jZSB3ZSBob2xkIHRoZSBjYWxsb3V0IHVudGlsIHRoZSBjb250cm9sbGVyCi0gKiBkZWxldGlvbiBpcyBjb21wbGV0ZWQsIHdlJ2xsIGRlYWRsb2NrIGlmIHRoZSBjb250cm9sbGVyIGRlbGV0aW9uIHdpbGwKLSAqIGNhbGwgcmRtYV9kZXN0cm95X2lkIG9uIHRoaXMgcXVldWUncyBjbV9pZC4gVGh1cywgd2UgY2xhaW0gb3duZXJzaGlwCi0gKiBvZiBkZXN0cm95aW5nIHRoaXMgcXVldWUgYmVmb3JlLWhhbmQsIGRlc3Ryb3kgdGhlIHF1ZXVlIHJlc291cmNlcywKLSAqIHRoZW4gcXVldWUgdGhlIGNvbnRyb2xsZXIgZGVsZXRpb24gd2hpY2ggd29uJ3QgZGVzdHJveSB0aGlzIHF1ZXVlIGFuZAotICogd2UgZGVzdHJveSB0aGUgY21faWQgaW1wbGljaXRlbHkgYnkgcmV0dXJuaW5nIGEgbm9uLXplcm8gcmMgdG8gdGhlIGNhbGxvdXQuCi0gKi8KLXN0YXRpYyBpbnQgbnZtZV9yZG1hX2RldmljZV91bnBsdWcoc3RydWN0IG52bWVfcmRtYV9xdWV1ZSAqcXVldWUpCi17Ci0Jc3RydWN0IG52bWVfcmRtYV9jdHJsICpjdHJsID0gcXVldWUtPmN0cmw7Ci0JaW50IHJldDsKLQotCS8qIE93biB0aGUgY29udHJvbGxlciBkZWxldGlvbiAqLwotCWlmICghbnZtZV9jaGFuZ2VfY3RybF9zdGF0ZSgmY3RybC0+Y3RybCwgTlZNRV9DVFJMX0RFTEVUSU5HKSkKLQkJcmV0dXJuIDA7Ci0KLQlkZXZfd2FybihjdHJsLT5jdHJsLmRldmljZSwKLQkJIkdvdCByZG1hIGRldmljZSByZW1vdmFsIGV2ZW50LCBkZWxldGluZyBjdHJsXG4iKTsKLQotCS8qIEdldCByaWQgb2YgcmVjb25uZWN0IHdvcmsgaWYgaXRzIHJ1bm5pbmcgKi8KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmN0cmwtPnJlY29ubmVjdF93b3JrKTsKLQotCS8qIERpc2FibGUgdGhlIHF1ZXVlIHNvIGN0cmwgZGVsZXRlIHdvbid0IGZyZWUgaXQgKi8KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5WTUVfUkRNQV9RX0NPTk5FQ1RFRCwgJnF1ZXVlLT5mbGFncykpIHsKLQkJLyogRnJlZSB0aGlzIHF1ZXVlIG91cnNlbHZlcyAqLwotCQludm1lX3JkbWFfc3RvcF9xdWV1ZShxdWV1ZSk7Ci0JCW52bWVfcmRtYV9kZXN0cm95X3F1ZXVlX2liKHF1ZXVlKTsKLQotCQkvKiBSZXR1cm4gbm9uLXplcm8gc28gdGhlIGNtX2lkIHdpbGwgZGVzdHJveSBpbXBsaWNpdGx5ICovCi0JCXJldCA9IDE7Ci0JfQotCi0JLyogUXVldWUgY29udHJvbGxlciBkZWxldGlvbiAqLwotCXF1ZXVlX3dvcmsobnZtZV9yZG1hX3dxLCAmY3RybC0+ZGVsZXRlX3dvcmspOwotCWZsdXNoX3dvcmsoJmN0cmwtPmRlbGV0ZV93b3JrKTsKLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IG52bWVfcmRtYV9jbV9oYW5kbGVyKHN0cnVjdCByZG1hX2NtX2lkICpjbV9pZCwKIAkJc3RydWN0IHJkbWFfY21fZXZlbnQgKmV2KQogewpAQCAtMTM4OCw4ICsxMzYyLDggQEAKIAkJbnZtZV9yZG1hX2Vycm9yX3JlY292ZXJ5KHF1ZXVlLT5jdHJsKTsKIAkJYnJlYWs7CiAJY2FzZSBSRE1BX0NNX0VWRU5UX0RFVklDRV9SRU1PVkFMOgotCQkvKiByZXR1cm4gMSBtZWFucyBpbXBsaWNpeSBDTSBJRCBkZXN0cm95ICovCi0JCXJldHVybiBudm1lX3JkbWFfZGV2aWNlX3VucGx1ZyhxdWV1ZSk7CisJCS8qIGRldmljZSByZW1vdmFsIGlzIGhhbmRsZWQgdmlhIHRoZSBpYl9jbGllbnQgQVBJICovCisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIocXVldWUtPmN0cmwtPmN0cmwuZGV2aWNlLAogCQkJIlVuZXhwZWN0ZWQgUkRNQSBDTSBldmVudCAoJWQpXG4iLCBldi0+ZXZlbnQpOwpAQCAtMTQ2MSw3ICsxNDM1LDcgQEAKIAlpZiAocnEtPmNtZF90eXBlID09IFJFUV9UWVBFX0ZTICYmIHJlcV9vcChycSkgPT0gUkVRX09QX0ZMVVNIKQogCQlmbHVzaCA9IHRydWU7CiAJcmV0ID0gbnZtZV9yZG1hX3Bvc3Rfc2VuZChxdWV1ZSwgc3FlLCByZXEtPnNnZSwgcmVxLT5udW1fc2dlLAotCQkJcmVxLT5uZWVkX2ludmFsID8gJnJlcS0+cmVnX3dyLndyIDogTlVMTCwgZmx1c2gpOworCQkJcmVxLT5tci0+bmVlZF9pbnZhbCA/ICZyZXEtPnJlZ193ci53ciA6IE5VTEwsIGZsdXNoKTsKIAlpZiAocmV0KSB7CiAJCW52bWVfcmRtYV91bm1hcF9kYXRhKHF1ZXVlLCBycSk7CiAJCWdvdG8gZXJyOwpAQCAtMTY5MCwxNSArMTY2NCwxOSBAQAogc3RhdGljIGludCBudm1lX3JkbWFfZGVsX2N0cmwoc3RydWN0IG52bWVfY3RybCAqbmN0cmwpCiB7CiAJc3RydWN0IG52bWVfcmRtYV9jdHJsICpjdHJsID0gdG9fcmRtYV9jdHJsKG5jdHJsKTsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCisJLyoKKwkgKiBLZWVwIGEgcmVmZXJlbmNlIHVudGlsIGFsbCB3b3JrIGlzIGZsdXNoZWQgc2luY2UKKwkgKiBfX252bWVfcmRtYV9kZWxfY3RybCBjYW4gZnJlZSB0aGUgY3RybCBtZW0KKwkgKi8KKwlpZiAoIWtyZWZfZ2V0X3VubGVzc196ZXJvKCZjdHJsLT5jdHJsLmtyZWYpKQorCQlyZXR1cm4gLUVCVVNZOwogCXJldCA9IF9fbnZtZV9yZG1hX2RlbF9jdHJsKGN0cmwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlmbHVzaF93b3JrKCZjdHJsLT5kZWxldGVfd29yayk7Ci0KLQlyZXR1cm4gMDsKKwlpZiAoIXJldCkKKwkJZmx1c2hfd29yaygmY3RybC0+ZGVsZXRlX3dvcmspOworCW52bWVfcHV0X2N0cmwoJmN0cmwtPmN0cmwpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIG52bWVfcmRtYV9yZW1vdmVfY3RybF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTE4MTYsNyArMTc5NCw3IEBACiAKIAltZW1zZXQoJmN0cmwtPnRhZ19zZXQsIDAsIHNpemVvZihjdHJsLT50YWdfc2V0KSk7CiAJY3RybC0+dGFnX3NldC5vcHMgPSAmbnZtZV9yZG1hX21xX29wczsKLQljdHJsLT50YWdfc2V0LnF1ZXVlX2RlcHRoID0gY3RybC0+Y3RybC5zcXNpemU7CisJY3RybC0+dGFnX3NldC5xdWV1ZV9kZXB0aCA9IGN0cmwtPmN0cmwub3B0cy0+cXVldWVfc2l6ZTsKIAljdHJsLT50YWdfc2V0LnJlc2VydmVkX3RhZ3MgPSAxOyAvKiBmYWJyaWMgY29ubmVjdCAqLwogCWN0cmwtPnRhZ19zZXQubnVtYV9ub2RlID0gTlVNQV9OT19OT0RFOwogCWN0cmwtPnRhZ19zZXQuZmxhZ3MgPSBCTEtfTVFfRl9TSE9VTERfTUVSR0U7CkBAIC0xOTE0LDcgKzE4OTIsNyBAQAogCXNwaW5fbG9ja19pbml0KCZjdHJsLT5sb2NrKTsKIAogCWN0cmwtPnF1ZXVlX2NvdW50ID0gb3B0cy0+bnJfaW9fcXVldWVzICsgMTsgLyogKzEgZm9yIGFkbWluIHF1ZXVlICovCi0JY3RybC0+Y3RybC5zcXNpemUgPSBvcHRzLT5xdWV1ZV9zaXplOworCWN0cmwtPmN0cmwuc3FzaXplID0gb3B0cy0+cXVldWVfc2l6ZSAtIDE7CiAJY3RybC0+Y3RybC5rYXRvID0gb3B0cy0+a2F0bzsKIAogCXJldCA9IC1FTk9NRU07CkBAIC0xOTk1LDI3ICsxOTczLDU3IEBACiAJLmNyZWF0ZV9jdHJsCT0gbnZtZV9yZG1hX2NyZWF0ZV9jdHJsLAogfTsKIAorc3RhdGljIHZvaWQgbnZtZV9yZG1hX2FkZF9vbmUoc3RydWN0IGliX2RldmljZSAqaWJfZGV2aWNlKQoreworfQorCitzdGF0aWMgdm9pZCBudm1lX3JkbWFfcmVtb3ZlX29uZShzdHJ1Y3QgaWJfZGV2aWNlICppYl9kZXZpY2UsIHZvaWQgKmNsaWVudF9kYXRhKQoreworCXN0cnVjdCBudm1lX3JkbWFfY3RybCAqY3RybDsKKworCS8qIERlbGV0ZSBhbGwgY29udHJvbGxlcnMgdXNpbmcgdGhpcyBkZXZpY2UgKi8KKwltdXRleF9sb2NrKCZudm1lX3JkbWFfY3RybF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdHJsLCAmbnZtZV9yZG1hX2N0cmxfbGlzdCwgbGlzdCkgeworCQlpZiAoY3RybC0+ZGV2aWNlLT5kZXYgIT0gaWJfZGV2aWNlKQorCQkJY29udGludWU7CisJCWRldl9pbmZvKGN0cmwtPmN0cmwuZGV2aWNlLAorCQkJIlJlbW92aW5nIGN0cmw6IE5RTiBcIiVzXCIsIGFkZHIgJXBJU3BcbiIsCisJCQljdHJsLT5jdHJsLm9wdHMtPnN1YnN5c25xbiwgJmN0cmwtPmFkZHIpOworCQlfX252bWVfcmRtYV9kZWxfY3RybChjdHJsKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZudm1lX3JkbWFfY3RybF9tdXRleCk7CisKKwlmbHVzaF93b3JrcXVldWUobnZtZV9yZG1hX3dxKTsKK30KKworc3RhdGljIHN0cnVjdCBpYl9jbGllbnQgbnZtZV9yZG1hX2liX2NsaWVudCA9IHsKKwkubmFtZSAgID0gIm52bWVfcmRtYSIsCisJLmFkZCA9IG52bWVfcmRtYV9hZGRfb25lLAorCS5yZW1vdmUgPSBudm1lX3JkbWFfcmVtb3ZlX29uZQorfTsKKwogc3RhdGljIGludCBfX2luaXQgbnZtZV9yZG1hX2luaXRfbW9kdWxlKHZvaWQpCiB7CisJaW50IHJldDsKKwogCW52bWVfcmRtYV93cSA9IGNyZWF0ZV93b3JrcXVldWUoIm52bWVfcmRtYV93cSIpOwogCWlmICghbnZtZV9yZG1hX3dxKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXJldCA9IGliX3JlZ2lzdGVyX2NsaWVudCgmbnZtZV9yZG1hX2liX2NsaWVudCk7CisJaWYgKHJldCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShudm1lX3JkbWFfd3EpOworCQlyZXR1cm4gcmV0OworCX0KKwogCW52bWZfcmVnaXN0ZXJfdHJhbnNwb3J0KCZudm1lX3JkbWFfdHJhbnNwb3J0KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG52bWVfcmRtYV9jbGVhbnVwX21vZHVsZSh2b2lkKQogewotCXN0cnVjdCBudm1lX3JkbWFfY3RybCAqY3RybDsKLQogCW52bWZfdW5yZWdpc3Rlcl90cmFuc3BvcnQoJm52bWVfcmRtYV90cmFuc3BvcnQpOwotCi0JbXV0ZXhfbG9jaygmbnZtZV9yZG1hX2N0cmxfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3RybCwgJm52bWVfcmRtYV9jdHJsX2xpc3QsIGxpc3QpCi0JCV9fbnZtZV9yZG1hX2RlbF9jdHJsKGN0cmwpOwotCW11dGV4X3VubG9jaygmbnZtZV9yZG1hX2N0cmxfbXV0ZXgpOwotCisJaWJfdW5yZWdpc3Rlcl9jbGllbnQoJm52bWVfcmRtYV9pYl9jbGllbnQpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKG52bWVfcmRtYV93cSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L3Njc2kuYyBiL2RyaXZlcnMvbnZtZS9ob3N0L3Njc2kuYwppbmRleCBlOTQ3ZTI5Li5jMmEwYTFjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL2hvc3Qvc2NzaS5jCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L3Njc2kuYwpAQCAtNzIsMTUgKzcyLDYgQEAKICNkZWZpbmUgQUxMX0xVTlNfUkVUVVJORUQJCQkJMHgwMgogI2RlZmluZSBBTExfV0VMTF9LTk9XTl9MVU5TX1JFVFVSTkVECQkJMHgwMQogI2RlZmluZSBSRVNUUklDVEVEX0xVTlNfUkVUVVJORUQJCQkweDAwCi0jZGVmaW5lIE5WTUVfUE9XRVJfU1RBVEVfU1RBUlRfVkFMSUQJCQkweDAwCi0jZGVmaW5lIE5WTUVfUE9XRVJfU1RBVEVfQUNUSVZFCQkJCTB4MDEKLSNkZWZpbmUgTlZNRV9QT1dFUl9TVEFURV9JRExFCQkJCTB4MDIKLSNkZWZpbmUgTlZNRV9QT1dFUl9TVEFURV9TVEFOREJZCQkJMHgwMwotI2RlZmluZSBOVk1FX1BPV0VSX1NUQVRFX0xVX0NPTlRST0wJCQkweDA3Ci0jZGVmaW5lIFBPV0VSX1NUQVRFXzAJCQkJCTAKLSNkZWZpbmUgUE9XRVJfU1RBVEVfMQkJCQkJMQotI2RlZmluZSBQT1dFUl9TVEFURV8yCQkJCQkyCi0jZGVmaW5lIFBPV0VSX1NUQVRFXzMJCQkJCTMKICNkZWZpbmUgRE9XTkxPQURfU0FWRV9BQ1RJVkFURQkJCQkweDA1CiAjZGVmaW5lIERPV05MT0FEX1NBVkVfREVGRVJfQUNUSVZBVEUJCQkweDBFCiAjZGVmaW5lIEFDVElWQVRFX0RFRkVSUkVEX01JQ1JPQ09ERQkJCTB4MEYKQEAgLTkxNSw3ICs5MDYsNyBAQAogCWtmcmVlKHNtYXJ0X2xvZyk7CiAKIAkvKiBHZXQgRmVhdHVyZXMgZm9yIFRlbXAgVGhyZXNob2xkICovCi0JcmVzID0gbnZtZV9nZXRfZmVhdHVyZXMobnMtPmN0cmwsIE5WTUVfRkVBVF9URU1QX1RIUkVTSCwgMCwgMCwKKwlyZXMgPSBudm1lX2dldF9mZWF0dXJlcyhucy0+Y3RybCwgTlZNRV9GRUFUX1RFTVBfVEhSRVNILCAwLCBOVUxMLCAwLAogCQkJCQkJCQkmZmVhdHVyZV9yZXNwKTsKIAlpZiAocmVzICE9IE5WTUVfU0NfU1VDQ0VTUykKIAkJdGVtcF9jX3RocmVzaCA9IExPR19URU1QX1VOS05PV047CkBAIC0xMDQ4LDcgKzEwMzksNyBAQAogCWlmIChsZW4gPCBNT0RFX1BBR0VfQ0FDSElOR19MRU4pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbnZtZV9zYyA9IG52bWVfZ2V0X2ZlYXR1cmVzKG5zLT5jdHJsLCBOVk1FX0ZFQVRfVk9MQVRJTEVfV0MsIDAsIDAsCisJbnZtZV9zYyA9IG52bWVfZ2V0X2ZlYXR1cmVzKG5zLT5jdHJsLCBOVk1FX0ZFQVRfVk9MQVRJTEVfV0MsIDAsIE5VTEwsIDAsCiAJCQkJCQkJCSZmZWF0dXJlX3Jlc3ApOwogCXJlcyA9IG52bWVfdHJhbnNfc3RhdHVzX2NvZGUoaGRyLCBudm1lX3NjKTsKIAlpZiAocmVzKQpAQCAtMTIyOSw2NCArMTIyMCw2IEBACiAKIC8qIFN0YXJ0IFN0b3AgVW5pdCBIZWxwZXIgRnVuY3Rpb25zICovCiAKLXN0YXRpYyBpbnQgbnZtZV90cmFuc19wb3dlcl9zdGF0ZShzdHJ1Y3QgbnZtZV9ucyAqbnMsIHN0cnVjdCBzZ19pb19oZHIgKmhkciwKLQkJCQkJCXU4IHBjLCB1OCBwY21vZCwgdTggc3RhcnQpCi17Ci0JaW50IHJlczsKLQlpbnQgbnZtZV9zYzsKLQlzdHJ1Y3QgbnZtZV9pZF9jdHJsICppZF9jdHJsOwotCWludCBsb3dlc3RfcG93X3N0OwkvKiBtYXggbnBzcyA9IGxvd2VzdCBwb3dlciBjb25zdW1wdGlvbiAqLwotCXVuc2lnbmVkIHBzX2Rlc2lyZWQgPSAwOwotCi0JbnZtZV9zYyA9IG52bWVfaWRlbnRpZnlfY3RybChucy0+Y3RybCwgJmlkX2N0cmwpOwotCXJlcyA9IG52bWVfdHJhbnNfc3RhdHVzX2NvZGUoaGRyLCBudm1lX3NjKTsKLQlpZiAocmVzKQotCQlyZXR1cm4gcmVzOwotCi0JbG93ZXN0X3Bvd19zdCA9IG1heChQT1dFUl9TVEFURV8wLCAoaW50KShpZF9jdHJsLT5ucHNzIC0gMSkpOwotCWtmcmVlKGlkX2N0cmwpOwotCi0Jc3dpdGNoIChwYykgewotCWNhc2UgTlZNRV9QT1dFUl9TVEFURV9TVEFSVF9WQUxJRDoKLQkJLyogQWN0aW9uIHVuc3BlY2lmaWVkIGlmIFBPV0VSIENPTkRJVElPTiBNT0RJRklFUiAhPSAwICovCi0JCWlmIChwY21vZCA9PSAwICYmIHN0YXJ0ID09IDB4MSkKLQkJCXBzX2Rlc2lyZWQgPSBQT1dFUl9TVEFURV8wOwotCQlpZiAocGNtb2QgPT0gMCAmJiBzdGFydCA9PSAweDApCi0JCQlwc19kZXNpcmVkID0gbG93ZXN0X3Bvd19zdDsKLQkJYnJlYWs7Ci0JY2FzZSBOVk1FX1BPV0VSX1NUQVRFX0FDVElWRToKLQkJLyogQWN0aW9uIHVuc3BlY2lmaWVkIGlmIFBPV0VSIENPTkRJVElPTiBNT0RJRklFUiAhPSAwICovCi0JCWlmIChwY21vZCA9PSAwKQotCQkJcHNfZGVzaXJlZCA9IFBPV0VSX1NUQVRFXzA7Ci0JCWJyZWFrOwotCWNhc2UgTlZNRV9QT1dFUl9TVEFURV9JRExFOgotCQkvKiBBY3Rpb24gdW5zcGVjaWZpZWQgaWYgUE9XRVIgQ09ORElUSU9OIE1PRElGSUVSICE9IFswLDEsMl0gKi8KLQkJaWYgKHBjbW9kID09IDB4MCkKLQkJCXBzX2Rlc2lyZWQgPSBQT1dFUl9TVEFURV8xOwotCQllbHNlIGlmIChwY21vZCA9PSAweDEpCi0JCQlwc19kZXNpcmVkID0gUE9XRVJfU1RBVEVfMjsKLQkJZWxzZSBpZiAocGNtb2QgPT0gMHgyKQotCQkJcHNfZGVzaXJlZCA9IFBPV0VSX1NUQVRFXzM7Ci0JCWJyZWFrOwotCWNhc2UgTlZNRV9QT1dFUl9TVEFURV9TVEFOREJZOgotCQkvKiBBY3Rpb24gdW5zcGVjaWZpZWQgaWYgUE9XRVIgQ09ORElUSU9OIE1PRElGSUVSICE9IFswLDFdICovCi0JCWlmIChwY21vZCA9PSAweDApCi0JCQlwc19kZXNpcmVkID0gbWF4KFBPV0VSX1NUQVRFXzAsIChsb3dlc3RfcG93X3N0IC0gMikpOwotCQllbHNlIGlmIChwY21vZCA9PSAweDEpCi0JCQlwc19kZXNpcmVkID0gbWF4KFBPV0VSX1NUQVRFXzAsIChsb3dlc3RfcG93X3N0IC0gMSkpOwotCQlicmVhazsKLQljYXNlIE5WTUVfUE9XRVJfU1RBVEVfTFVfQ09OVFJPTDoKLQlkZWZhdWx0OgotCQlyZXMgPSBudm1lX3RyYW5zX2NvbXBsZXRpb24oaGRyLCBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04sCi0JCQkJSUxMRUdBTF9SRVFVRVNULCBTQ1NJX0FTQ19JTlZBTElEX0NEQiwKLQkJCQlTQ1NJX0FTQ1FfQ0FVU0VfTk9UX1JFUE9SVEFCTEUpOwotCQlicmVhazsKLQl9Ci0JbnZtZV9zYyA9IG52bWVfc2V0X2ZlYXR1cmVzKG5zLT5jdHJsLCBOVk1FX0ZFQVRfUE9XRVJfTUdNVCwgcHNfZGVzaXJlZCwgMCwKLQkJCQkgICAgTlVMTCk7Ci0JcmV0dXJuIG52bWVfdHJhbnNfc3RhdHVzX2NvZGUoaGRyLCBudm1lX3NjKTsKLX0KLQogc3RhdGljIGludCBudm1lX3RyYW5zX3NlbmRfYWN0aXZhdGVfZndfY21kKHN0cnVjdCBudm1lX25zICpucywgc3RydWN0IHNnX2lvX2hkciAqaGRyLAogCQkJCQl1OCBidWZmZXJfaWQpCiB7CkBAIC0xMzk1LDcgKzEzMjgsNyBAQAogCWNhc2UgTU9ERV9QQUdFX0NBQ0hJTkc6CiAJCWR3b3JkMTEgPSAoKG1vZGVfcGFnZVsyXSAmIENBQ0hJTkdfTU9ERV9QQUdFX1dDRV9NQVNLKSA/IDEgOiAwKTsKIAkJbnZtZV9zYyA9IG52bWVfc2V0X2ZlYXR1cmVzKG5zLT5jdHJsLCBOVk1FX0ZFQVRfVk9MQVRJTEVfV0MsCi0JCQkJCSAgICBkd29yZDExLCAwLCBOVUxMKTsKKwkJCQkJICAgIGR3b3JkMTEsIE5VTEwsIDAsIE5VTEwpOwogCQlyZXMgPSBudm1lX3RyYW5zX3N0YXR1c19jb2RlKGhkciwgbnZtZV9zYyk7CiAJCWJyZWFrOwogCWNhc2UgTU9ERV9QQUdFX0NPTlRST0w6CkBAIC0yMjM1LDExICsyMTY4LDEwIEBACiBzdGF0aWMgaW50IG52bWVfdHJhbnNfc3RhcnRfc3RvcChzdHJ1Y3QgbnZtZV9ucyAqbnMsIHN0cnVjdCBzZ19pb19oZHIgKmhkciwKIAkJCQkJCQl1OCAqY21kKQogewotCXU4IGltbWVkLCBwY21vZCwgcGMsIG5vX2ZsdXNoLCBzdGFydDsKKwl1OCBpbW1lZCwgcGNtb2QsIG5vX2ZsdXNoLCBzdGFydDsKIAogCWltbWVkID0gY21kWzFdICYgMHgwMTsKIAlwY21vZCA9IGNtZFszXSAmIDB4MGY7Ci0JcGMgPSAoY21kWzRdICYgMHhmMCkgPj4gNDsKIAlub19mbHVzaCA9IGNtZFs0XSAmIDB4MDQ7CiAJc3RhcnQgPSBjbWRbNF0gJiAweDAxOwogCkBAIC0yMjU0LDggKzIxODYsOCBAQAogCQkJaWYgKHJlcykKIAkJCQlyZXR1cm4gcmVzOwogCQl9Ci0JCS8qIFNldHVwIHRoZSBleHBlY3RlZCBwb3dlciBzdGF0ZSB0cmFuc2l0aW9uICovCi0JCXJldHVybiBudm1lX3RyYW5zX3Bvd2VyX3N0YXRlKG5zLCBoZHIsIHBjLCBwY21vZCwgc3RhcnQpOworCisJCXJldHVybiAwOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL3RhcmdldC9LY29uZmlnIGIvZHJpdmVycy9udm1lL3RhcmdldC9LY29uZmlnCmluZGV4IGE1YzMxY2IuLjNhNWI5ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS90YXJnZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL252bWUvdGFyZ2V0L0tjb25maWcKQEAgLTE1LDggKzE1LDggQEAKIAogY29uZmlnIE5WTUVfVEFSR0VUX0xPT1AKIAl0cmlzdGF0ZSAiTlZNZSBsb29wYmFjayBkZXZpY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEJMS19ERVZfTlZNRQogCWRlcGVuZHMgb24gTlZNRV9UQVJHRVQKKwlzZWxlY3QgTlZNRV9DT1JFCiAJc2VsZWN0IE5WTUVfRkFCUklDUwogCXNlbGVjdCBTR19QT09MCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL3RhcmdldC9hZG1pbi1jbWQuYyBiL2RyaXZlcnMvbnZtZS90YXJnZXQvYWRtaW4tY21kLmMKaW5kZXggNDdjNTY0Yi4uN2FiOWM5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL3RhcmdldC9hZG1pbi1jbWQuYworKysgYi9kcml2ZXJzL252bWUvdGFyZ2V0L2FkbWluLWNtZC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8Z2VuZXJhdGVkL3V0c3JlbGVhc2UuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSAibnZtZXQuaCIKIAogdTMyIG52bWV0X2dldF9sb2dfcGFnZV9sZW4oc3RydWN0IG52bWVfY29tbWFuZCAqY21kKQpAQCAtMjksOCArMzAsODQgQEAKIAlyZXR1cm4gbGVuOwogfQogCitzdGF0aWMgdTE2IG52bWV0X2dldF9zbWFydF9sb2dfbnNpZChzdHJ1Y3QgbnZtZXRfcmVxICpyZXEsCisJCXN0cnVjdCBudm1lX3NtYXJ0X2xvZyAqc2xvZykKK3sKKwl1MTYgc3RhdHVzOworCXN0cnVjdCBudm1ldF9ucyAqbnM7CisJdTY0IGhvc3RfcmVhZHMsIGhvc3Rfd3JpdGVzLCBkYXRhX3VuaXRzX3JlYWQsIGRhdGFfdW5pdHNfd3JpdHRlbjsKKworCXN0YXR1cyA9IE5WTUVfU0NfU1VDQ0VTUzsKKwlucyA9IG52bWV0X2ZpbmRfbmFtZXNwYWNlKHJlcS0+c3EtPmN0cmwsIHJlcS0+Y21kLT5nZXRfbG9nX3BhZ2UubnNpZCk7CisJaWYgKCFucykgeworCQlzdGF0dXMgPSBOVk1FX1NDX0lOVkFMSURfTlM7CisJCXByX2VycigibnZtZXQgOiBDb3VubGQgbm90IGZpbmQgbmFtZXNwYWNlIGlkIDogJWRcbiIsCisJCQkJbGUzMl90b19jcHUocmVxLT5jbWQtPmdldF9sb2dfcGFnZS5uc2lkKSk7CisJCWdvdG8gb3V0OworCX0KKworCWhvc3RfcmVhZHMgPSBwYXJ0X3N0YXRfcmVhZChucy0+YmRldi0+YmRfcGFydCwgaW9zW1JFQURdKTsKKwlkYXRhX3VuaXRzX3JlYWQgPSBwYXJ0X3N0YXRfcmVhZChucy0+YmRldi0+YmRfcGFydCwgc2VjdG9yc1tSRUFEXSk7CisJaG9zdF93cml0ZXMgPSBwYXJ0X3N0YXRfcmVhZChucy0+YmRldi0+YmRfcGFydCwgaW9zW1dSSVRFXSk7CisJZGF0YV91bml0c193cml0dGVuID0gcGFydF9zdGF0X3JlYWQobnMtPmJkZXYtPmJkX3BhcnQsIHNlY3RvcnNbV1JJVEVdKTsKKworCXB1dF91bmFsaWduZWRfbGU2NChob3N0X3JlYWRzLCAmc2xvZy0+aG9zdF9yZWFkc1swXSk7CisJcHV0X3VuYWxpZ25lZF9sZTY0KGRhdGFfdW5pdHNfcmVhZCwgJnNsb2ctPmRhdGFfdW5pdHNfcmVhZFswXSk7CisJcHV0X3VuYWxpZ25lZF9sZTY0KGhvc3Rfd3JpdGVzLCAmc2xvZy0+aG9zdF93cml0ZXNbMF0pOworCXB1dF91bmFsaWduZWRfbGU2NChkYXRhX3VuaXRzX3dyaXR0ZW4sICZzbG9nLT5kYXRhX3VuaXRzX3dyaXR0ZW5bMF0pOworCW52bWV0X3B1dF9uYW1lc3BhY2UobnMpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1MTYgbnZtZXRfZ2V0X3NtYXJ0X2xvZ19hbGwoc3RydWN0IG52bWV0X3JlcSAqcmVxLAorCQlzdHJ1Y3QgbnZtZV9zbWFydF9sb2cgKnNsb2cpCit7CisJdTE2IHN0YXR1czsKKwl1NjQgaG9zdF9yZWFkcyA9IDAsIGhvc3Rfd3JpdGVzID0gMDsKKwl1NjQgZGF0YV91bml0c19yZWFkID0gMCwgZGF0YV91bml0c193cml0dGVuID0gMDsKKwlzdHJ1Y3QgbnZtZXRfbnMgKm5zOworCXN0cnVjdCBudm1ldF9jdHJsICpjdHJsOworCisJc3RhdHVzID0gTlZNRV9TQ19TVUNDRVNTOworCWN0cmwgPSByZXEtPnNxLT5jdHJsOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG5zLCAmY3RybC0+c3Vic3lzLT5uYW1lc3BhY2VzLCBkZXZfbGluaykgeworCQlob3N0X3JlYWRzICs9IHBhcnRfc3RhdF9yZWFkKG5zLT5iZGV2LT5iZF9wYXJ0LCBpb3NbUkVBRF0pOworCQlkYXRhX3VuaXRzX3JlYWQgKz0KKwkJCXBhcnRfc3RhdF9yZWFkKG5zLT5iZGV2LT5iZF9wYXJ0LCBzZWN0b3JzW1JFQURdKTsKKwkJaG9zdF93cml0ZXMgKz0gcGFydF9zdGF0X3JlYWQobnMtPmJkZXYtPmJkX3BhcnQsIGlvc1tXUklURV0pOworCQlkYXRhX3VuaXRzX3dyaXR0ZW4gKz0KKwkJCXBhcnRfc3RhdF9yZWFkKG5zLT5iZGV2LT5iZF9wYXJ0LCBzZWN0b3JzW1dSSVRFXSk7CisKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlwdXRfdW5hbGlnbmVkX2xlNjQoaG9zdF9yZWFkcywgJnNsb2ctPmhvc3RfcmVhZHNbMF0pOworCXB1dF91bmFsaWduZWRfbGU2NChkYXRhX3VuaXRzX3JlYWQsICZzbG9nLT5kYXRhX3VuaXRzX3JlYWRbMF0pOworCXB1dF91bmFsaWduZWRfbGU2NChob3N0X3dyaXRlcywgJnNsb2ctPmhvc3Rfd3JpdGVzWzBdKTsKKwlwdXRfdW5hbGlnbmVkX2xlNjQoZGF0YV91bml0c193cml0dGVuLCAmc2xvZy0+ZGF0YV91bml0c193cml0dGVuWzBdKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1MTYgbnZtZXRfZ2V0X3NtYXJ0X2xvZyhzdHJ1Y3QgbnZtZXRfcmVxICpyZXEsCisJCXN0cnVjdCBudm1lX3NtYXJ0X2xvZyAqc2xvZykKK3sKKwl1MTYgc3RhdHVzOworCisJV0FSTl9PTihyZXEgPT0gTlVMTCB8fCBzbG9nID09IE5VTEwpOworCWlmIChyZXEtPmNtZC0+Z2V0X2xvZ19wYWdlLm5zaWQgPT0gMHhGRkZGRkZGRikKKwkJc3RhdHVzID0gbnZtZXRfZ2V0X3NtYXJ0X2xvZ19hbGwocmVxLCBzbG9nKTsKKwllbHNlCisJCXN0YXR1cyA9IG52bWV0X2dldF9zbWFydF9sb2dfbnNpZChyZXEsIHNsb2cpOworCXJldHVybiBzdGF0dXM7Cit9CisKIHN0YXRpYyB2b2lkIG52bWV0X2V4ZWN1dGVfZ2V0X2xvZ19wYWdlKHN0cnVjdCBudm1ldF9yZXEgKnJlcSkKIHsKKwlzdHJ1Y3QgbnZtZV9zbWFydF9sb2cgKnNtYXJ0X2xvZzsKIAlzaXplX3QgZGF0YV9sZW4gPSBudm1ldF9nZXRfbG9nX3BhZ2VfbGVuKHJlcS0+Y21kKTsKIAl2b2lkICpidWY7CiAJdTE2IHN0YXR1cyA9IDA7CkBAIC01OSw2ICsxMzYsMTYgQEAKIAkJICogYXZhaWxhYmxlIChlLmcuIHVuaXRzIG9yIGNvbW1hbmRzIHJlYWQvd3JpdHRlbikgdGhvc2UgYXJlbid0CiAJCSAqIHBlcnNpc3RlbnQgb3ZlciBwb3dlciBsb3NzLgogCQkgKi8KKwkJaWYgKGRhdGFfbGVuICE9IHNpemVvZigqc21hcnRfbG9nKSkgeworCQkJc3RhdHVzID0gTlZNRV9TQ19JTlRFUk5BTDsKKwkJCWdvdG8gZXJyOworCQl9CisJCXNtYXJ0X2xvZyA9IGJ1ZjsKKwkJc3RhdHVzID0gbnZtZXRfZ2V0X3NtYXJ0X2xvZyhyZXEsIHNtYXJ0X2xvZyk7CisJCWlmIChzdGF0dXMpIHsKKwkJCW1lbXNldChidWYsICdcMCcsIGRhdGFfbGVuKTsKKwkJCWdvdG8gZXJyOworCQl9CiAJCWJyZWFrOwogCWNhc2UgMHgwMzoKIAkJLyoKQEAgLTczLDYgKzE2MCw3IEBACiAKIAlzdGF0dXMgPSBudm1ldF9jb3B5X3RvX3NnbChyZXEsIDAsIGJ1ZiwgZGF0YV9sZW4pOwogCitlcnI6CiAJa2ZyZWUoYnVmKTsKIG91dDoKIAludm1ldF9yZXFfY29tcGxldGUocmVxLCBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL3RhcmdldC9pby1jbWQuYyBiL2RyaXZlcnMvbnZtZS90YXJnZXQvaW8tY21kLmMKaW5kZXggMmNkMDY5YjYuLjRhOTZjMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS90YXJnZXQvaW8tY21kLmMKKysrIGIvZHJpdmVycy9udm1lL3RhcmdldC9pby1jbWQuYwpAQCAtNTgsNiArNTgsNyBAQAogCiAJaWYgKHJlcS0+Y21kLT5ydy5vcGNvZGUgPT0gbnZtZV9jbWRfd3JpdGUpIHsKIAkJb3AgPSBSRVFfT1BfV1JJVEU7CisJCW9wX2ZsYWdzID0gV1JJVEVfT0RJUkVDVDsKIAkJaWYgKHJlcS0+Y21kLT5ydy5jb250cm9sICYgY3B1X3RvX2xlMTYoTlZNRV9SV19GVUEpKQogCQkJb3BfZmxhZ3MgfD0gUkVRX0ZVQTsKIAl9IGVsc2UgewpAQCAtMjA1LDcgKzIwNiw3IEBACiAJCXJldHVybiAwOwogCWNhc2UgbnZtZV9jbWRfZHNtOgogCQlyZXEtPmV4ZWN1dGUgPSBudm1ldF9leGVjdXRlX2RzbTsKLQkJcmVxLT5kYXRhX2xlbiA9IGxlMzJfdG9fY3B1KGNtZC0+ZHNtLm5yKSAqCisJCXJlcS0+ZGF0YV9sZW4gPSBsZTMyX3RvX2NwdShjbWQtPmRzbS5uciArIDEpICoKIAkJCXNpemVvZihzdHJ1Y3QgbnZtZV9kc21fcmFuZ2UpOwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL3RhcmdldC9sb29wLmMgYi9kcml2ZXJzL252bWUvdGFyZ2V0L2xvb3AuYwppbmRleCA3YWZmZDQwLi4zOTVlNjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvdGFyZ2V0L2xvb3AuYworKysgYi9kcml2ZXJzL252bWUvdGFyZ2V0L2xvb3AuYwpAQCAtNTU2LDcgKzU1Niw3IEBACiAKIAltZW1zZXQoJmN0cmwtPnRhZ19zZXQsIDAsIHNpemVvZihjdHJsLT50YWdfc2V0KSk7CiAJY3RybC0+dGFnX3NldC5vcHMgPSAmbnZtZV9sb29wX21xX29wczsKLQljdHJsLT50YWdfc2V0LnF1ZXVlX2RlcHRoID0gY3RybC0+Y3RybC5zcXNpemU7CisJY3RybC0+dGFnX3NldC5xdWV1ZV9kZXB0aCA9IGN0cmwtPmN0cmwub3B0cy0+cXVldWVfc2l6ZTsKIAljdHJsLT50YWdfc2V0LnJlc2VydmVkX3RhZ3MgPSAxOyAvKiBmYWJyaWMgY29ubmVjdCAqLwogCWN0cmwtPnRhZ19zZXQubnVtYV9ub2RlID0gTlVNQV9OT19OT0RFOwogCWN0cmwtPnRhZ19zZXQuZmxhZ3MgPSBCTEtfTVFfRl9TSE9VTERfTUVSR0U7CkBAIC02MjAsNyArNjIwLDcgQEAKIAogCXJldCA9IC1FTk9NRU07CiAKLQljdHJsLT5jdHJsLnNxc2l6ZSA9IG9wdHMtPnF1ZXVlX3NpemU7CisJY3RybC0+Y3RybC5zcXNpemUgPSBvcHRzLT5xdWV1ZV9zaXplIC0gMTsKIAljdHJsLT5jdHJsLmthdG8gPSBvcHRzLT5rYXRvOwogCiAJY3RybC0+cXVldWVzID0ga2NhbGxvYyhvcHRzLT5ucl9pb19xdWV1ZXMgKyAxLCBzaXplb2YoKmN0cmwtPnF1ZXVlcyksCmRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvdGFyZ2V0L3JkbWEuYyBiL2RyaXZlcnMvbnZtZS90YXJnZXQvcmRtYS5jCmluZGV4IGI0ZDY0ODUuLjFjYmU2ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS90YXJnZXQvcmRtYS5jCisrKyBiL2RyaXZlcnMvbnZtZS90YXJnZXQvcmRtYS5jCkBAIC05NzgsMTAgKzk3OCwxMSBAQAogCQljb250YWluZXJfb2Yodywgc3RydWN0IG52bWV0X3JkbWFfcXVldWUsIHJlbGVhc2Vfd29yayk7CiAJc3RydWN0IHJkbWFfY21faWQgKmNtX2lkID0gcXVldWUtPmNtX2lkOwogCXN0cnVjdCBudm1ldF9yZG1hX2RldmljZSAqZGV2ID0gcXVldWUtPmRldjsKKwllbnVtIG52bWV0X3JkbWFfcXVldWVfc3RhdGUgc3RhdGUgPSBxdWV1ZS0+c3RhdGU7CiAKIAludm1ldF9yZG1hX2ZyZWVfcXVldWUocXVldWUpOwogCi0JaWYgKHF1ZXVlLT5zdGF0ZSAhPSBOVk1FVF9SRE1BX0lOX0RFVklDRV9SRU1PVkFMKQorCWlmIChzdGF0ZSAhPSBOVk1FVF9SRE1BX0lOX0RFVklDRV9SRU1PVkFMKQogCQlyZG1hX2Rlc3Ryb3lfaWQoY21faWQpOwogCiAJa3JlZl9wdXQoJmRldi0+cmVmLCBudm1ldF9yZG1hX2ZyZWVfZGV2KTsKQEAgLTEwMDMsMTAgKzEwMDQsMTAgQEAKIAlxdWV1ZS0+aG9zdF9xaWQgPSBsZTE2X3RvX2NwdShyZXEtPnFpZCk7CiAKIAkvKgotCSAqIHJlcS0+aHNxc2l6ZSBjb3JyZXNwb25kcyB0byBvdXIgcmVjdiBxdWV1ZSBzaXplCisJICogcmVxLT5oc3FzaXplIGNvcnJlc3BvbmRzIHRvIG91ciByZWN2IHF1ZXVlIHNpemUgcGx1cyAxCiAJICogcmVxLT5ocnFzaXplIGNvcnJlc3BvbmRzIHRvIG91ciBzZW5kIHF1ZXVlIHNpemUKIAkgKi8KLQlxdWV1ZS0+cmVjdl9xdWV1ZV9zaXplID0gbGUxNl90b19jcHUocmVxLT5oc3FzaXplKTsKKwlxdWV1ZS0+cmVjdl9xdWV1ZV9zaXplID0gbGUxNl90b19jcHUocmVxLT5oc3FzaXplKSArIDE7CiAJcXVldWUtPnNlbmRfcXVldWVfc2l6ZSA9IGxlMTZfdG9fY3B1KHJlcS0+aHJxc2l6ZSk7CiAKIAlpZiAoIXF1ZXVlLT5ob3N0X3FpZCAmJiBxdWV1ZS0+cmVjdl9xdWV1ZV9zaXplID4gTlZNRl9BUV9ERVBUSCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZW0vcm9ja2NoaXAtZWZ1c2UuYyBiL2RyaXZlcnMvbnZtZW0vcm9ja2NoaXAtZWZ1c2UuYwppbmRleCA0ZDNmMzkxLi40MjM5MDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWVtL3JvY2tjaGlwLWVmdXNlLmMKKysrIGIvZHJpdmVycy9udm1lbS9yb2NrY2hpcC1lZnVzZS5jCkBAIC0yMiwxNyArMjIsMjkgQEAKICNpbmNsdWRlIDxsaW51eC9udm1lbS1wcm92aWRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKLSNkZWZpbmUgRUZVU0VfQV9TSElGVAkJCTYKLSNkZWZpbmUgRUZVU0VfQV9NQVNLCQkJMHgzZmYKLSNkZWZpbmUgRUZVU0VfUEdFTkIJCQlCSVQoMykKLSNkZWZpbmUgRUZVU0VfTE9BRAkJCUJJVCgyKQotI2RlZmluZSBFRlVTRV9TVFJPQkUJCQlCSVQoMSkKLSNkZWZpbmUgRUZVU0VfQ1NCCQkJQklUKDApCisjZGVmaW5lIFJLMzI4OF9BX1NISUZUCQk2CisjZGVmaW5lIFJLMzI4OF9BX01BU0sJCTB4M2ZmCisjZGVmaW5lIFJLMzI4OF9QR0VOQgkJQklUKDMpCisjZGVmaW5lIFJLMzI4OF9MT0FECQlCSVQoMikKKyNkZWZpbmUgUkszMjg4X1NUUk9CRQkJQklUKDEpCisjZGVmaW5lIFJLMzI4OF9DU0IJCUJJVCgwKQogCi0jZGVmaW5lIFJFR19FRlVTRV9DVFJMCQkJMHgwMDAwCi0jZGVmaW5lIFJFR19FRlVTRV9ET1VUCQkJMHgwMDA0CisjZGVmaW5lIFJLMzM5OV9BX1NISUZUCQkxNgorI2RlZmluZSBSSzMzOTlfQV9NQVNLCQkweDNmZgorI2RlZmluZSBSSzMzOTlfTkJZVEVTCQk0CisjZGVmaW5lIFJLMzM5OV9TVFJPQlNGVFNFTAlCSVQoOSkKKyNkZWZpbmUgUkszMzk5X1JTQgkJQklUKDcpCisjZGVmaW5lIFJLMzM5OV9QRAkJQklUKDUpCisjZGVmaW5lIFJLMzM5OV9QR0VOQgkJQklUKDMpCisjZGVmaW5lIFJLMzM5OV9MT0FECQlCSVQoMikKKyNkZWZpbmUgUkszMzk5X1NUUk9CRQkJQklUKDEpCisjZGVmaW5lIFJLMzM5OV9DU0IJCUJJVCgwKQorCisjZGVmaW5lIFJFR19FRlVTRV9DVFJMCQkweDAwMDAKKyNkZWZpbmUgUkVHX0VGVVNFX0RPVVQJCTB4MDAwNAogCiBzdHJ1Y3Qgcm9ja2NoaXBfZWZ1c2VfY2hpcCB7CiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtNDAsOCArNTIsOCBAQAogCXN0cnVjdCBjbGsgKmNsazsKIH07CiAKLXN0YXRpYyBpbnQgcm9ja2NoaXBfZWZ1c2VfcmVhZCh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAotCQkJICAgICAgIHZvaWQgKnZhbCwgc2l6ZV90IGJ5dGVzKQorc3RhdGljIGludCByb2NrY2hpcF9yazMyODhfZWZ1c2VfcmVhZCh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJCSAgICAgIHZvaWQgKnZhbCwgc2l6ZV90IGJ5dGVzKQogewogCXN0cnVjdCByb2NrY2hpcF9lZnVzZV9jaGlwICplZnVzZSA9IGNvbnRleHQ7CiAJdTggKmJ1ZiA9IHZhbDsKQEAgLTUzLDI3ICs2NSw4MiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXdyaXRlbChFRlVTRV9MT0FEIHwgRUZVU0VfUEdFTkIsIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOworCXdyaXRlbChSSzMyODhfTE9BRCB8IFJLMzI4OF9QR0VOQiwgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CiAJdWRlbGF5KDEpOwogCXdoaWxlIChieXRlcy0tKSB7CiAJCXdyaXRlbChyZWFkbChlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKSAmCi0JCQkgICAgICh+KEVGVVNFX0FfTUFTSyA8PCBFRlVTRV9BX1NISUZUKSksCisJCQkgICAgICh+KFJLMzI4OF9BX01BU0sgPDwgUkszMjg4X0FfU0hJRlQpKSwKIAkJCSAgICAgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CiAJCXdyaXRlbChyZWFkbChlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKSB8Ci0JCQkgICAgICgob2Zmc2V0KysgJiBFRlVTRV9BX01BU0spIDw8IEVGVVNFX0FfU0hJRlQpLAorCQkJICAgICAoKG9mZnNldCsrICYgUkszMjg4X0FfTUFTSykgPDwgUkszMjg4X0FfU0hJRlQpLAogCQkJICAgICBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKIAkJdWRlbGF5KDEpOwogCQl3cml0ZWwocmVhZGwoZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCkgfAotCQkJICAgICBFRlVTRV9TVFJPQkUsIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOworCQkJICAgICBSSzMyODhfU1RST0JFLCBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKIAkJdWRlbGF5KDEpOwogCQkqYnVmKysgPSByZWFkYihlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9ET1VUKTsKIAkJd3JpdGVsKHJlYWRsKGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpICYKLQkJICAgICAofkVGVVNFX1NUUk9CRSksIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOworCQkgICAgICAgKH5SSzMyODhfU1RST0JFKSwgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CiAJCXVkZWxheSgxKTsKIAl9CiAKIAkvKiBTd2l0Y2ggdG8gc3RhbmRieSBtb2RlICovCi0Jd3JpdGVsKEVGVVNFX1BHRU5CIHwgRUZVU0VfQ1NCLCBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKKwl3cml0ZWwoUkszMjg4X1BHRU5CIHwgUkszMjg4X0NTQiwgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZWZ1c2UtPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9yazMzOTlfZWZ1c2VfcmVhZCh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJCSAgICAgIHZvaWQgKnZhbCwgc2l6ZV90IGJ5dGVzKQoreworCXN0cnVjdCByb2NrY2hpcF9lZnVzZV9jaGlwICplZnVzZSA9IGNvbnRleHQ7CisJdW5zaWduZWQgaW50IGFkZHJfc3RhcnQsIGFkZHJfZW5kLCBhZGRyX29mZnNldCwgYWRkcl9sZW47CisJdTMyIG91dF92YWx1ZTsKKwl1OCAqYnVmOworCWludCByZXQsIGkgPSAwOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGVmdXNlLT5jbGspOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZWZ1c2UtPmRldiwgImZhaWxlZCB0byBwcmVwYXJlL2VuYWJsZSBlZnVzZSBjbGtcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWFkZHJfc3RhcnQgPSByb3VuZGRvd24ob2Zmc2V0LCBSSzMzOTlfTkJZVEVTKSAvIFJLMzM5OV9OQllURVM7CisJYWRkcl9lbmQgPSByb3VuZHVwKG9mZnNldCArIGJ5dGVzLCBSSzMzOTlfTkJZVEVTKSAvIFJLMzM5OV9OQllURVM7CisJYWRkcl9vZmZzZXQgPSBvZmZzZXQgJSBSSzMzOTlfTkJZVEVTOworCWFkZHJfbGVuID0gYWRkcl9lbmQgLSBhZGRyX3N0YXJ0OworCisJYnVmID0ga3phbGxvYyhzaXplb2YoKmJ1ZikgKiBhZGRyX2xlbiAqIFJLMzM5OV9OQllURVMsIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShlZnVzZS0+Y2xrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJd3JpdGVsKFJLMzM5OV9MT0FEIHwgUkszMzk5X1BHRU5CIHwgUkszMzk5X1NUUk9CU0ZUU0VMIHwgUkszMzk5X1JTQiwKKwkgICAgICAgZWZ1c2UtPmJhc2UgKyBSRUdfRUZVU0VfQ1RSTCk7CisJdWRlbGF5KDEpOworCXdoaWxlIChhZGRyX2xlbi0tKSB7CisJCXdyaXRlbChyZWFkbChlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKSB8IFJLMzM5OV9TVFJPQkUgfAorCQkgICAgICAgKChhZGRyX3N0YXJ0KysgJiBSSzMzOTlfQV9NQVNLKSA8PCBSSzMzOTlfQV9TSElGVCksCisJCSAgICAgICBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKKwkJdWRlbGF5KDEpOworCQlvdXRfdmFsdWUgPSByZWFkbChlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9ET1VUKTsKKwkJd3JpdGVsKHJlYWRsKGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpICYgKH5SSzMzOTlfU1RST0JFKSwKKwkJICAgICAgIGVmdXNlLT5iYXNlICsgUkVHX0VGVVNFX0NUUkwpOworCQl1ZGVsYXkoMSk7CisKKwkJbWVtY3B5KCZidWZbaV0sICZvdXRfdmFsdWUsIFJLMzM5OV9OQllURVMpOworCQlpICs9IFJLMzM5OV9OQllURVM7CisJfQorCisJLyogU3dpdGNoIHRvIHN0YW5kYnkgbW9kZSAqLworCXdyaXRlbChSSzMzOTlfUEQgfCBSSzMzOTlfQ1NCLCBlZnVzZS0+YmFzZSArIFJFR19FRlVTRV9DVFJMKTsKKworCW1lbWNweSh2YWwsIGJ1ZiArIGFkZHJfb2Zmc2V0LCBieXRlcyk7CisKKwlrZnJlZShidWYpOwogCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGVmdXNlLT5jbGspOwogCkBAIC04OSw3ICsxNTYsMjcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJvY2tjaGlwX2VmdXNlX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyb2NrY2hpcC1lZnVzZSIsIH0sCisJLyogZGVwcmVjYXRlZCBidXQga2VwdCBhcm91bmQgZm9yIGR0cyBiaW5kaW5nIGNvbXBhdGliaWxpdHkgKi8KKwl7CisJCS5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJvY2tjaGlwLWVmdXNlIiwKKwkJLmRhdGEgPSAodm9pZCAqKSZyb2NrY2hpcF9yazMyODhfZWZ1c2VfcmVhZCwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMDY2YS1lZnVzZSIsCisJCS5kYXRhID0gKHZvaWQgKikmcm9ja2NoaXBfcmszMjg4X2VmdXNlX3JlYWQsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzE4OC1lZnVzZSIsCisJCS5kYXRhID0gKHZvaWQgKikmcm9ja2NoaXBfcmszMjg4X2VmdXNlX3JlYWQsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzI4OC1lZnVzZSIsCisJCS5kYXRhID0gKHZvaWQgKikmcm9ja2NoaXBfcmszMjg4X2VmdXNlX3JlYWQsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInJvY2tjaGlwLHJrMzM5OS1lZnVzZSIsCisJCS5kYXRhID0gKHZvaWQgKikmcm9ja2NoaXBfcmszMzk5X2VmdXNlX3JlYWQsCisJfSwKIAl7IC8qIHNlbnRpbmVsICovfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2NrY2hpcF9lZnVzZV9tYXRjaCk7CkBAIC05OSw2ICsxODYsMTQgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgbnZtZW1fZGV2aWNlICpudm1lbTsKIAlzdHJ1Y3Qgcm9ja2NoaXBfZWZ1c2VfY2hpcCAqZWZ1c2U7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKworCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKGRldi0+ZHJpdmVyLT5vZl9tYXRjaF90YWJsZSwgZGV2KTsKKwlpZiAoIW1hdGNoIHx8ICFtYXRjaC0+ZGF0YSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgbWF0Y2ggZGF0YVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCWVmdXNlID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgcm9ja2NoaXBfZWZ1c2VfY2hpcCksCiAJCQkgICAgIEdGUF9LRVJORUwpOwpAQCAtMTE2LDcgKzIxMSw3IEBACiAKIAllZnVzZS0+ZGV2ID0gJnBkZXYtPmRldjsKIAllY29uZmlnLnNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7Ci0JZWNvbmZpZy5yZWdfcmVhZCA9IHJvY2tjaGlwX2VmdXNlX3JlYWQ7CisJZWNvbmZpZy5yZWdfcmVhZCA9IG1hdGNoLT5kYXRhOwogCWVjb25maWcucHJpdiA9IGVmdXNlOwogCWVjb25maWcuZGV2ID0gZWZ1c2UtPmRldjsKIAludm1lbSA9IG52bWVtX3JlZ2lzdGVyKCZlY29uZmlnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYmFzZS5jIGIvZHJpdmVycy9vZi9iYXNlLmMKaW5kZXggM2NlNjk1My4uYTBiY2NiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9iYXNlLmMKKysrIGIvZHJpdmVycy9vZi9iYXNlLmMKQEAgLTExNDYsMTYgKzExNDYsMTggQEAKICAqCiAgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgogICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KLSAqIEBsZW46CXJlcXVlc3RlZCBsZW5ndGggb2YgcHJvcGVydHkgdmFsdWUKKyAqIEBtaW46CW1pbmltdW0gYWxsb3dlZCBsZW5ndGggb2YgcHJvcGVydHkgdmFsdWUKKyAqIEBtYXg6CW1heGltdW0gYWxsb3dlZCBsZW5ndGggb2YgcHJvcGVydHkgdmFsdWUgKDAgbWVhbnMgdW5saW1pdGVkKQorICogQGxlbjoJaWYgIT1OVUxMLCBhY3R1YWwgbGVuZ3RoIGlzIHdyaXR0ZW4gdG8gaGVyZQogICoKICAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSBub2RlIGFuZCB2YWxpZCB0aGUgcmVxdWVzdGVkIHNpemUuCiAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdAogICogIGV4aXN0LCAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XIGlmIHRoZQotICogcHJvcGVydHkgZGF0YSBpc24ndCBsYXJnZSBlbm91Z2guCisgKiBwcm9wZXJ0eSBkYXRhIGlzIHRvbyBzbWFsbCBvciB0b28gbGFyZ2UuCiAgKgogICovCiBzdGF0aWMgdm9pZCAqb2ZfZmluZF9wcm9wZXJ0eV92YWx1ZV9vZl9zaXplKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTMyIGxlbikKKwkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCB1MzIgbWluLCB1MzIgbWF4LCBzaXplX3QgKmxlbikKIHsKIAlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCBwcm9wbmFtZSwgTlVMTCk7CiAKQEAgLTExNjMsOCArMTE2NSwxMyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAlpZiAoIXByb3AtPnZhbHVlKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7Ci0JaWYgKGxlbiA+IHByb3AtPmxlbmd0aCkKKwlpZiAocHJvcC0+bGVuZ3RoIDwgbWluKQogCQlyZXR1cm4gRVJSX1BUUigtRU9WRVJGTE9XKTsKKwlpZiAobWF4ICYmIHByb3AtPmxlbmd0aCA+IG1heCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVPVkVSRkxPVyk7CisKKwlpZiAobGVuKQorCQkqbGVuID0gcHJvcC0+bGVuZ3RoOwogCiAJcmV0dXJuIHByb3AtPnZhbHVlOwogfQpAQCAtMTE4OSw3ICsxMTk2LDkgQEAKIAkJCQkgICAgICAgdTMyIGluZGV4LCB1MzIgKm91dF92YWx1ZSkKIHsKIAljb25zdCB1MzIgKnZhbCA9IG9mX2ZpbmRfcHJvcGVydHlfdmFsdWVfb2Zfc2l6ZShucCwgcHJvcG5hbWUsCi0JCQkJCSgoaW5kZXggKyAxKSAqIHNpemVvZigqb3V0X3ZhbHVlKSkpOworCQkJCQkoKGluZGV4ICsgMSkgKiBzaXplb2YoKm91dF92YWx1ZSkpLAorCQkJCQkwLAorCQkJCQlOVUxMKTsKIAogCWlmIChJU19FUlIodmFsKSkKIAkJcmV0dXJuIFBUUl9FUlIodmFsKTsKQEAgLTEyMDAsMTAyICsxMjA5LDE0NSBAQAogRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgpOwogCiAvKioKLSAqIG9mX3Byb3BlcnR5X3JlYWRfdThfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIHU4IGZyb20gYSBwcm9wZXJ0eS4KKyAqIG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdThfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIHU4IGZyb20gYQorICogcHJvcGVydHksIHdpdGggYm91bmRzIG9uIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGFycmF5IHNpemUuCiAgKgogICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KICAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCiAgKiBAb3V0X3ZhbHVlczoJcG9pbnRlciB0byByZXR1cm4gdmFsdWUsIG1vZGlmaWVkIG9ubHkgaWYgcmV0dXJuIHZhbHVlIGlzIDAuCi0gKiBAc3o6CQludW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZAorICogQHN6X21pbjoJbWluaW11bSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZAorICogQHN6X21heDoJbWF4aW11bSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZCwgaWYgemVybyB0aGVyZSBpcyBubworICoJCXVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGR0cyBlbnRyeSBidXQgb25seQorICoJCXN6X21pbiB3aWxsIGJlIHJlYWQuCiAgKgogICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIHJlYWQgOC1iaXQgdmFsdWUocykgZnJvbQotICogaXQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwKLSAqIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCi0gKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqIGl0LiBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cyByZWFkIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5CisgKiBkb2VzIG5vdCBleGlzdCwgLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVworICogaWYgdGhlIHByb3BlcnR5IGRhdGEgaXMgc21hbGxlciB0aGFuIHN6X21pbiBvciBsb25nZXIgdGhhbiBzel9tYXguCiAgKgogICogZHRzIGVudHJ5IG9mIGFycmF5IHNob3VsZCBiZSBsaWtlOgogICoJcHJvcGVydHkgPSAvYml0cy8gOCA8MHg1MCAweDYwIDB4NzA+OwogICoKICAqIFRoZSBvdXRfdmFsdWVzIGlzIG1vZGlmaWVkIG9ubHkgaWYgYSB2YWxpZCB1OCB2YWx1ZSBjYW4gYmUgZGVjb2RlZC4KICAqLwotaW50IG9mX3Byb3BlcnR5X3JlYWRfdThfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCB1OCAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQoraW50IG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdThfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHU4ICpvdXRfdmFsdWVzLAorCQkJCQlzaXplX3Qgc3pfbWluLCBzaXplX3Qgc3pfbWF4KQogeworCXNpemVfdCBzeiwgY291bnQ7CiAJY29uc3QgdTggKnZhbCA9IG9mX2ZpbmRfcHJvcGVydHlfdmFsdWVfb2Zfc2l6ZShucCwgcHJvcG5hbWUsCi0JCQkJCQkoc3ogKiBzaXplb2YoKm91dF92YWx1ZXMpKSk7CisJCQkJCQkoc3pfbWluICogc2l6ZW9mKCpvdXRfdmFsdWVzKSksCisJCQkJCQkoc3pfbWF4ICogc2l6ZW9mKCpvdXRfdmFsdWVzKSksCisJCQkJCQkmc3opOwogCiAJaWYgKElTX0VSUih2YWwpKQogCQlyZXR1cm4gUFRSX0VSUih2YWwpOwogCi0Jd2hpbGUgKHN6LS0pCisJaWYgKCFzel9tYXgpCisJCXN6ID0gc3pfbWluOworCWVsc2UKKwkJc3ogLz0gc2l6ZW9mKCpvdXRfdmFsdWVzKTsKKworCWNvdW50ID0gc3o7CisJd2hpbGUgKGNvdW50LS0pCiAJCSpvdXRfdmFsdWVzKysgPSAqdmFsKys7Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gc3o7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3U4X2FycmF5KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdThfYXJyYXkpOwogCiAvKioKLSAqIG9mX3Byb3BlcnR5X3JlYWRfdTE2X2FycmF5IC0gRmluZCBhbmQgcmVhZCBhbiBhcnJheSBvZiB1MTYgZnJvbSBhIHByb3BlcnR5LgorICogb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91MTZfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIHUxNiBmcm9tIGEKKyAqIHByb3BlcnR5LCB3aXRoIGJvdW5kcyBvbiB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBhcnJheSBzaXplLgogICoKICAqIEBucDoJCWRldmljZSBub2RlIGZyb20gd2hpY2ggdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRvIGJlIHJlYWQuCiAgKiBAcHJvcG5hbWU6CW5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNlYXJjaGVkLgogICogQG91dF92YWx1ZXM6CXBvaW50ZXIgdG8gcmV0dXJuIHZhbHVlLCBtb2RpZmllZCBvbmx5IGlmIHJldHVybiB2YWx1ZSBpcyAwLgotICogQHN6OgkJbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqIEBzel9taW46CW1pbmltdW0gbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQKKyAqIEBzel9tYXg6CW1heGltdW0gbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIHRvIHJlYWQsIGlmIHplcm8gdGhlcmUgaXMgbm8KKyAqCQl1cHBlciBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkdHMgZW50cnkgYnV0IG9ubHkKKyAqCQlzel9taW4gd2lsbCBiZSByZWFkLgogICoKICAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSBub2RlIGFuZCByZWFkIDE2LWJpdCB2YWx1ZShzKSBmcm9tCi0gKiBpdC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LAotICogLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVyBpZiB0aGUKLSAqIHByb3BlcnR5IGRhdGEgaXNuJ3QgbGFyZ2UgZW5vdWdoLgorICogaXQuIFJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIHJlYWQgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkKKyAqIGRvZXMgbm90IGV4aXN0LCAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XCisgKiBpZiB0aGUgcHJvcGVydHkgZGF0YSBpcyBzbWFsbGVyIHRoYW4gc3pfbWluIG9yIGxvbmdlciB0aGFuIHN6X21heC4KICAqCiAgKiBkdHMgZW50cnkgb2YgYXJyYXkgc2hvdWxkIGJlIGxpa2U6CiAgKglwcm9wZXJ0eSA9IC9iaXRzLyAxNiA8MHg1MDAwIDB4NjAwMCAweDcwMDA+OwogICoKICAqIFRoZSBvdXRfdmFsdWVzIGlzIG1vZGlmaWVkIG9ubHkgaWYgYSB2YWxpZCB1MTYgdmFsdWUgY2FuIGJlIGRlY29kZWQuCiAgKi8KLWludCBvZl9wcm9wZXJ0eV9yZWFkX3UxNl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHUxNiAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQoraW50IG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdTE2X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCWNvbnN0IGNoYXIgKnByb3BuYW1lLCB1MTYgKm91dF92YWx1ZXMsCisJCQkJCXNpemVfdCBzel9taW4sIHNpemVfdCBzel9tYXgpCiB7CisJc2l6ZV90IHN6LCBjb3VudDsKIAljb25zdCBfX2JlMTYgKnZhbCA9IG9mX2ZpbmRfcHJvcGVydHlfdmFsdWVfb2Zfc2l6ZShucCwgcHJvcG5hbWUsCi0JCQkJCQkoc3ogKiBzaXplb2YoKm91dF92YWx1ZXMpKSk7CisJCQkJCQkoc3pfbWluICogc2l6ZW9mKCpvdXRfdmFsdWVzKSksCisJCQkJCQkoc3pfbWF4ICogc2l6ZW9mKCpvdXRfdmFsdWVzKSksCisJCQkJCQkmc3opOwogCiAJaWYgKElTX0VSUih2YWwpKQogCQlyZXR1cm4gUFRSX0VSUih2YWwpOwogCi0Jd2hpbGUgKHN6LS0pCisJaWYgKCFzel9tYXgpCisJCXN6ID0gc3pfbWluOworCWVsc2UKKwkJc3ogLz0gc2l6ZW9mKCpvdXRfdmFsdWVzKTsKKworCWNvdW50ID0gc3o7CisJd2hpbGUgKGNvdW50LS0pCiAJCSpvdXRfdmFsdWVzKysgPSBiZTE2X3RvX2NwdXAodmFsKyspOwotCXJldHVybiAwOworCisJcmV0dXJuIHN6OwogfQotRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF91MTZfYXJyYXkpOworRVhQT1JUX1NZTUJPTF9HUEwob2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91MTZfYXJyYXkpOwogCiAvKioKLSAqIG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5IC0gRmluZCBhbmQgcmVhZCBhbiBhcnJheSBvZiAzMiBiaXQgaW50ZWdlcnMKLSAqIGZyb20gYSBwcm9wZXJ0eS4KKyAqIG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdTMyX2FycmF5IC0gRmluZCBhbmQgcmVhZCBhbiBhcnJheSBvZiAzMiBiaXQKKyAqIGludGVnZXJzIGZyb20gYSBwcm9wZXJ0eSwgd2l0aCBib3VuZHMgb24gdGhlIG1pbmltdW0gYW5kIG1heGltdW0gYXJyYXkgc2l6ZS4KICAqCiAgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgogICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KICAqIEBvdXRfdmFsdWVzOglwb2ludGVyIHRvIHJldHVybiB2YWx1ZSwgbW9kaWZpZWQgb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMC4KLSAqIEBzejoJCW51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKiBAc3pfbWluOgltaW5pbXVtIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKiBAc3pfbWF4OgltYXhpbXVtIG51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkLCBpZiB6ZXJvIHRoZXJlIGlzIG5vCisgKgkJdXBwZXIgbGltaXQgb24gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZHRzIGVudHJ5IGJ1dCBvbmx5CisgKgkJc3pfbWluIHdpbGwgYmUgcmVhZC4KICAqCiAgKiBTZWFyY2ggZm9yIGEgcHJvcGVydHkgaW4gYSBkZXZpY2Ugbm9kZSBhbmQgcmVhZCAzMi1iaXQgdmFsdWUocykgZnJvbQotICogaXQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwKLSAqIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCi0gKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqIGl0LiBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cyByZWFkIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5CisgKiBkb2VzIG5vdCBleGlzdCwgLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVworICogaWYgdGhlIHByb3BlcnR5IGRhdGEgaXMgc21hbGxlciB0aGFuIHN6X21pbiBvciBsb25nZXIgdGhhbiBzel9tYXguCiAgKgogICogVGhlIG91dF92YWx1ZXMgaXMgbW9kaWZpZWQgb25seSBpZiBhIHZhbGlkIHUzMiB2YWx1ZSBjYW4gYmUgZGVjb2RlZC4KICAqLwotaW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCitpbnQgb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwgdTMyICpvdXRfdmFsdWVzLAotCQkJICAgICAgIHNpemVfdCBzeikKKwkJCSAgICAgICBzaXplX3Qgc3pfbWluLCBzaXplX3Qgc3pfbWF4KQogeworCXNpemVfdCBzeiwgY291bnQ7CiAJY29uc3QgX19iZTMyICp2YWwgPSBvZl9maW5kX3Byb3BlcnR5X3ZhbHVlX29mX3NpemUobnAsIHByb3BuYW1lLAotCQkJCQkJKHN6ICogc2l6ZW9mKCpvdXRfdmFsdWVzKSkpOworCQkJCQkJKHN6X21pbiAqIHNpemVvZigqb3V0X3ZhbHVlcykpLAorCQkJCQkJKHN6X21heCAqIHNpemVvZigqb3V0X3ZhbHVlcykpLAorCQkJCQkJJnN6KTsKIAogCWlmIChJU19FUlIodmFsKSkKIAkJcmV0dXJuIFBUUl9FUlIodmFsKTsKIAotCXdoaWxlIChzei0tKQorCWlmICghc3pfbWF4KQorCQlzeiA9IHN6X21pbjsKKwllbHNlCisJCXN6IC89IHNpemVvZigqb3V0X3ZhbHVlcyk7CisKKwljb3VudCA9IHN6OworCXdoaWxlIChjb3VudC0tKQogCQkqb3V0X3ZhbHVlcysrID0gYmUzMl90b19jcHVwKHZhbCsrKTsKLQlyZXR1cm4gMDsKKworCXJldHVybiBzejsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdTMyX2FycmF5KTsKIAogLyoqCiAgKiBvZl9wcm9wZXJ0eV9yZWFkX3U2NCAtIEZpbmQgYW5kIHJlYWQgYSA2NCBiaXQgaW50ZWdlciBmcm9tIGEgcHJvcGVydHkKQEAgLTEzMTQsNyArMTM2Niw5IEBACiAJCQkgdTY0ICpvdXRfdmFsdWUpCiB7CiAJY29uc3QgX19iZTMyICp2YWwgPSBvZl9maW5kX3Byb3BlcnR5X3ZhbHVlX29mX3NpemUobnAsIHByb3BuYW1lLAotCQkJCQkJc2l6ZW9mKCpvdXRfdmFsdWUpKTsKKwkJCQkJCXNpemVvZigqb3V0X3ZhbHVlKSwKKwkJCQkJCTAsCisJCQkJCQlOVUxMKTsKIAogCWlmIChJU19FUlIodmFsKSkKIAkJcmV0dXJuIFBUUl9FUlIodmFsKTsKQEAgLTEzMjUsMzggKzEzNzksNTEgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKG9mX3Byb3BlcnR5X3JlYWRfdTY0KTsKIAogLyoqCi0gKiBvZl9wcm9wZXJ0eV9yZWFkX3U2NF9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgNjQgYml0IGludGVnZXJzCi0gKiBmcm9tIGEgcHJvcGVydHkuCisgKiBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U2NF9hcnJheSAtIEZpbmQgYW5kIHJlYWQgYW4gYXJyYXkgb2YgNjQgYml0CisgKiBpbnRlZ2VycyBmcm9tIGEgcHJvcGVydHksIHdpdGggYm91bmRzIG9uIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGFycmF5IHNpemUuCiAgKgogICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KICAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCiAgKiBAb3V0X3ZhbHVlczoJcG9pbnRlciB0byByZXR1cm4gdmFsdWUsIG1vZGlmaWVkIG9ubHkgaWYgcmV0dXJuIHZhbHVlIGlzIDAuCi0gKiBAc3o6CQludW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZAorICogQHN6X21pbjoJbWluaW11bSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZAorICogQHN6X21heDoJbWF4aW11bSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZCwgaWYgemVybyB0aGVyZSBpcyBubworICoJCXVwcGVyIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGR0cyBlbnRyeSBidXQgb25seQorICoJCXN6X21pbiB3aWxsIGJlIHJlYWQuCiAgKgogICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIHJlYWQgNjQtYml0IHZhbHVlKHMpIGZyb20KLSAqIGl0LiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsCi0gKiAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XIGlmIHRoZQotICogcHJvcGVydHkgZGF0YSBpc24ndCBsYXJnZSBlbm91Z2guCisgKiBpdC4gUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgcmVhZCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eQorICogZG9lcyBub3QgZXhpc3QsIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cKKyAqIGlmIHRoZSBwcm9wZXJ0eSBkYXRhIGlzIHNtYWxsZXIgdGhhbiBzel9taW4gb3IgbG9uZ2VyIHRoYW4gc3pfbWF4LgogICoKICAqIFRoZSBvdXRfdmFsdWVzIGlzIG1vZGlmaWVkIG9ubHkgaWYgYSB2YWxpZCB1NjQgdmFsdWUgY2FuIGJlIGRlY29kZWQuCiAgKi8KLWludCBvZl9wcm9wZXJ0eV9yZWFkX3U2NF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAoraW50IG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdTY0X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkgICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsIHU2NCAqb3V0X3ZhbHVlcywKLQkJCSAgICAgICBzaXplX3Qgc3opCisJCQkgICAgICAgc2l6ZV90IHN6X21pbiwgc2l6ZV90IHN6X21heCkKIHsKKwlzaXplX3Qgc3osIGNvdW50OwogCWNvbnN0IF9fYmUzMiAqdmFsID0gb2ZfZmluZF9wcm9wZXJ0eV92YWx1ZV9vZl9zaXplKG5wLCBwcm9wbmFtZSwKLQkJCQkJCShzeiAqIHNpemVvZigqb3V0X3ZhbHVlcykpKTsKKwkJCQkJCShzel9taW4gKiBzaXplb2YoKm91dF92YWx1ZXMpKSwKKwkJCQkJCShzel9tYXggKiBzaXplb2YoKm91dF92YWx1ZXMpKSwKKwkJCQkJCSZzeik7CiAKIAlpZiAoSVNfRVJSKHZhbCkpCiAJCXJldHVybiBQVFJfRVJSKHZhbCk7CiAKLQl3aGlsZSAoc3otLSkgeworCWlmICghc3pfbWF4KQorCQlzeiA9IHN6X21pbjsKKwllbHNlCisJCXN6IC89IHNpemVvZigqb3V0X3ZhbHVlcyk7CisKKwljb3VudCA9IHN6OworCXdoaWxlIChjb3VudC0tKSB7CiAJCSpvdXRfdmFsdWVzKysgPSBvZl9yZWFkX251bWJlcih2YWwsIDIpOwogCQl2YWwgKz0gMjsKIAl9Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gc3o7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3U2NF9hcnJheSk7CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3U2NF9hcnJheSk7CiAKIC8qKgogICogb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcgLSBGaW5kIGFuZCByZWFkIGEgc3RyaW5nIGZyb20gYSBwcm9wZXJ0eQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9mZHQuYyBiL2RyaXZlcnMvb2YvZmR0LmMKaW5kZXggMDg1YzYzOC4uYzg5ZDVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9mZHQuYworKysgYi9kcml2ZXJzL29mL2ZkdC5jCkBAIC05MjQsNyArOTI0LDcgQEAKIAogI2lmZGVmIENPTkZJR19TRVJJQUxfRUFSTFlDT04KIAotc3RhdGljIGludCBfX2luaXQgZWFybHlfaW5pdF9kdF9zY2FuX2Nob3Nlbl9zZXJpYWwodm9pZCkKK2ludCBfX2luaXQgZWFybHlfaW5pdF9kdF9zY2FuX2Nob3Nlbl9zdGRvdXQodm9pZCkKIHsKIAlpbnQgb2Zmc2V0OwogCWNvbnN0IGNoYXIgKnAsICpxLCAqb3B0aW9ucyA9IE5VTEw7CkBAIC05NjgsMTUgKzk2OCw2IEBACiAJfQogCXJldHVybiAtRU5PREVWOwogfQotCi1zdGF0aWMgaW50IF9faW5pdCBzZXR1cF9vZl9lYXJseWNvbihjaGFyICpidWYpCi17Ci0JaWYgKGJ1ZikKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gZWFybHlfaW5pdF9kdF9zY2FuX2Nob3Nlbl9zZXJpYWwoKTsKLX0KLWVhcmx5X3BhcmFtKCJlYXJseWNvbiIsIHNldHVwX29mX2Vhcmx5Y29uKTsKICNlbmRpZgogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfbnVtYS5jIGIvZHJpdmVycy9vZi9vZl9udW1hLmMKaW5kZXggZWQ1YTA5Ny4uZjYzZDRiMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfbnVtYS5jCisrKyBiL2RyaXZlcnMvb2Yvb2ZfbnVtYS5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpICJPRjogTlVNQTogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CkBAIC00OSwxMCArNTEsOSBAQAogCQlpZiAocikKIAkJCWNvbnRpbnVlOwogCi0JCXByX2RlYnVnKCJOVU1BOiBDUFUgb24gJXVcbiIsIG5pZCk7CisJCXByX2RlYnVnKCJDUFUgb24gJXVcbiIsIG5pZCk7CiAJCWlmIChuaWQgPj0gTUFYX05VTU5PREVTKQotCQkJcHJfd2FybigiTlVNQTogTm9kZSBpZCAldSBleGNlZWRzIG1heGltdW0gdmFsdWVcbiIsCi0JCQkJbmlkKTsKKwkJCXByX3dhcm4oIk5vZGUgaWQgJXUgZXhjZWVkcyBtYXhpbXVtIHZhbHVlXG4iLCBuaWQpOwogCQllbHNlCiAJCQlub2RlX3NldChuaWQsIG51bWFfbm9kZXNfcGFyc2VkKTsKIAl9CkBAIC02MywxMyArNjQsOSBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOwogCXN0cnVjdCByZXNvdXJjZSByc3JjOwogCXUzMiBuaWQ7Ci0JaW50IHIgPSAwOworCWludCBpLCByOwogCi0JZm9yICg7OykgewotCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAibWVtb3J5Iik7Ci0JCWlmICghbnApCi0JCQlicmVhazsKLQorCWZvcl9lYWNoX25vZGVfYnlfdHlwZShucCwgIm1lbW9yeSIpIHsKIAkJciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibnVtYS1ub2RlLWlkIiwgJm5pZCk7CiAJCWlmIChyID09IC1FSU5WQUwpCiAJCQkvKgpAQCAtNzgsMjcgKzc1LDIzIEBACiAJCQkgKiAibnVtYS1ub2RlLWlkIiBwcm9wZXJ0eQogCQkJICovCiAJCQljb250aW51ZTsKLQkJZWxzZSBpZiAocikKLQkJCS8qIHNvbWUgb3RoZXIgZXJyb3IgKi8KLQkJCWJyZWFrOwogCi0JCXIgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcnNyYyk7Ci0JCWlmIChyKSB7Ci0JCQlwcl9lcnIoIk5VTUE6IGJhZCByZWcgcHJvcGVydHkgaW4gbWVtb3J5IG5vZGVcbiIpOwotCQkJYnJlYWs7CisJCWlmIChuaWQgPj0gTUFYX05VTU5PREVTKSB7CisJCQlwcl93YXJuKCJOb2RlIGlkICV1IGV4Y2VlZHMgbWF4aW11bSB2YWx1ZVxuIiwgbmlkKTsKKwkJCXIgPSAtRUlOVkFMOwogCQl9CiAKLQkJcHJfZGVidWcoIk5VTUE6ICBiYXNlID0gJWxseCBsZW4gPSAlbGx4LCBub2RlID0gJXVcbiIsCi0JCQkgcnNyYy5zdGFydCwgcnNyYy5lbmQgLSByc3JjLnN0YXJ0ICsgMSwgbmlkKTsKKwkJZm9yIChpID0gMDsgIXIgJiYgIW9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIGksICZyc3JjKTsgaSsrKQorCQkJciA9IG51bWFfYWRkX21lbWJsayhuaWQsIHJzcmMuc3RhcnQsIHJzcmMuZW5kICsgMSk7CiAKLQotCQlyID0gbnVtYV9hZGRfbWVtYmxrKG5pZCwgcnNyYy5zdGFydCwgcnNyYy5lbmQgKyAxKTsKLQkJaWYgKHIpCi0JCQlicmVhazsKKwkJaWYgKCFpIHx8IHIpIHsKKwkJCW9mX25vZGVfcHV0KG5wKTsKKwkJCXByX2VycigiYmFkIHByb3BlcnR5IGluIG1lbW9yeSBub2RlXG4iKTsKKwkJCXJldHVybiByID8gOiAtRUlOVkFMOworCQl9CiAJfQotCW9mX25vZGVfcHV0KG5wKTsKIAotCXJldHVybiByOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBvZl9udW1hX3BhcnNlX2Rpc3RhbmNlX21hcF92MShzdHJ1Y3QgZGV2aWNlX25vZGUgKm1hcCkKQEAgLTEwNywxNyArMTAwLDE3IEBACiAJaW50IGVudHJ5X2NvdW50OwogCWludCBpOwogCi0JcHJfaW5mbygiTlVNQTogcGFyc2luZyBudW1hLWRpc3RhbmNlLW1hcC12MVxuIik7CisJcHJfaW5mbygicGFyc2luZyBudW1hLWRpc3RhbmNlLW1hcC12MVxuIik7CiAKIAltYXRyaXggPSBvZl9nZXRfcHJvcGVydHkobWFwLCAiZGlzdGFuY2UtbWF0cml4IiwgTlVMTCk7CiAJaWYgKCFtYXRyaXgpIHsKLQkJcHJfZXJyKCJOVU1BOiBObyBkaXN0YW5jZS1tYXRyaXggcHJvcGVydHkgaW4gZGlzdGFuY2UtbWFwXG4iKTsKKwkJcHJfZXJyKCJObyBkaXN0YW5jZS1tYXRyaXggcHJvcGVydHkgaW4gZGlzdGFuY2UtbWFwXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZW50cnlfY291bnQgPSBvZl9wcm9wZXJ0eV9jb3VudF91MzJfZWxlbXMobWFwLCAiZGlzdGFuY2UtbWF0cml4Iik7CiAJaWYgKGVudHJ5X2NvdW50IDw9IDApIHsKLQkJcHJfZXJyKCJOVU1BOiBJbnZhbGlkIGRpc3RhbmNlLW1hdHJpeFxuIik7CisJCXByX2VycigiSW52YWxpZCBkaXN0YW5jZS1tYXRyaXhcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEzMiw3ICsxMjUsNyBAQAogCQltYXRyaXgrKzsKIAogCQludW1hX3NldF9kaXN0YW5jZShub2RlYSwgbm9kZWIsIGRpc3RhbmNlKTsKLQkJcHJfZGVidWcoIk5VTUE6ICBkaXN0YW5jZVtub2RlJWQgLT4gbm9kZSVkXSA9ICVkXG4iLAorCQlwcl9kZWJ1ZygiZGlzdGFuY2Vbbm9kZSVkIC0+IG5vZGUlZF0gPSAlZFxuIiwKIAkJCSBub2RlYSwgbm9kZWIsIGRpc3RhbmNlKTsKIAogCQkvKiBTZXQgZGVmYXVsdCBkaXN0YW5jZSBvZiBub2RlIEItPkEgc2FtZSBhcyBBLT5CICovCkBAIC0xNjYsOCArMTU5LDYgQEAKIAlucCA9IG9mX25vZGVfZ2V0KGRldmljZSk7CiAKIAl3aGlsZSAobnApIHsKLQkJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7Ci0KIAkJciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibnVtYS1ub2RlLWlkIiwgJm5pZCk7CiAJCS8qCiAJCSAqIC1FSU5WQUwgaW5kaWNhdGVzIHRoZSBwcm9wZXJ0eSB3YXMgbm90IGZvdW5kLCBhbmQKQEAgLTE3OCwyMiArMTY5LDE1IEBACiAJCWlmIChyICE9IC1FSU5WQUwpCiAJCQlicmVhazsKIAotCQlwYXJlbnQgPSBvZl9nZXRfcGFyZW50KG5wKTsKLQkJb2Zfbm9kZV9wdXQobnApOwotCQlucCA9IHBhcmVudDsKKwkJbnAgPSBvZl9nZXRfbmV4dF9wYXJlbnQobnApOwogCX0KIAlpZiAobnAgJiYgcikKLQkJcHJfd2FybigiTlVNQTogSW52YWxpZCBcIm51bWEtbm9kZS1pZFwiIHByb3BlcnR5IGluIG5vZGUgJXNcbiIsCisJCXByX3dhcm4oIkludmFsaWQgXCJudW1hLW5vZGUtaWRcIiBwcm9wZXJ0eSBpbiBub2RlICVzXG4iLAogCQkJbnAtPm5hbWUpOwogCW9mX25vZGVfcHV0KG5wKTsKIAotCWlmICghcikgewotCQlpZiAobmlkID49IE1BWF9OVU1OT0RFUykKLQkJCXByX3dhcm4oIk5VTUE6IE5vZGUgaWQgJXUgZXhjZWVkcyBtYXhpbXVtIHZhbHVlXG4iLAotCQkJCW5pZCk7Ci0JCWVsc2UKLQkJCXJldHVybiBuaWQ7Ci0JfQorCWlmICghcikKKwkJcmV0dXJuIG5pZDsKIAogCXJldHVybiBOVU1BX05PX05PREU7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL3BsYXRmb3JtLmMgYi9kcml2ZXJzL29mL3BsYXRmb3JtLmMKaW5kZXggZjM5Y2NkNS4uZjgxMWQyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvb2YvcGxhdGZvcm0uYwpAQCAtMTQyLDYgKzE0Miw3IEBACiAJfQogCiAJZGV2LT5kZXYub2Zfbm9kZSA9IG9mX25vZGVfZ2V0KG5wKTsKKwlkZXYtPmRldi5md25vZGUgPSAmbnAtPmZ3bm9kZTsKIAlkZXYtPmRldi5wYXJlbnQgPSBwYXJlbnQgPyA6ICZwbGF0Zm9ybV9idXM7CiAKIAlpZiAoYnVzX2lkKQpAQCAtMjQxLDYgKzI0Miw3IEBACiAKIAkvKiBzZXR1cCBnZW5lcmljIGRldmljZSBpbmZvICovCiAJZGV2LT5kZXYub2Zfbm9kZSA9IG9mX25vZGVfZ2V0KG5vZGUpOworCWRldi0+ZGV2LmZ3bm9kZSA9ICZub2RlLT5md25vZGU7CiAJZGV2LT5kZXYucGFyZW50ID0gcGFyZW50ID8gOiAmcGxhdGZvcm1fYnVzOwogCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwbGF0Zm9ybV9kYXRhOwogCWlmIChidXNfaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL3RpbWVyX2ludC5jIGIvZHJpdmVycy9vcHJvZmlsZS90aW1lcl9pbnQuYwppbmRleCBiZGVmOTE2Li4yNDk4YTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL3RpbWVyX2ludC5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvdGltZXJfaW50LmMKQEAgLTc0LDM3ICs3NCwzOSBAQAogCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCi1zdGF0aWMgaW50IG9wcm9maWxlX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCBvcHJvZmlsZV90aW1lcl9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlsb25nIGNwdSA9IChsb25nKSBoY3B1OwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgX19vcHJvZmlsZV9ocnRpbWVyX3N0YXJ0LAotCQkJCQkgTlVMTCwgMSk7Ci0JCWJyZWFrOwotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCV9fb3Byb2ZpbGVfaHJ0aW1lcl9zdG9wKGNwdSk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJX19vcHJvZmlsZV9ocnRpbWVyX3N0YXJ0KE5VTEwpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX3JlZmRhdGEgb3Byb2ZpbGVfY3B1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gb3Byb2ZpbGVfY3B1X25vdGlmeSwKLX07CitzdGF0aWMgaW50IG9wcm9maWxlX3RpbWVyX3ByZXBfZG93bih1bnNpZ25lZCBpbnQgY3B1KQoreworCV9fb3Byb2ZpbGVfaHJ0aW1lcl9zdG9wKGNwdSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIGhwX29ubGluZTsKIAogc3RhdGljIGludCBvcHJvZmlsZV9ocnRpbWVyX3NldHVwKHZvaWQpCiB7Ci0JcmV0dXJuIHJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmb3Byb2ZpbGVfY3B1X25vdGlmaWVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLAorCQkJCQkib3Byb2ZpbGUvdGltZXI6b25saW5lIiwKKwkJCQkJb3Byb2ZpbGVfdGltZXJfb25saW5lLAorCQkJCQlvcHJvZmlsZV90aW1lcl9wcmVwX2Rvd24pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWhwX29ubGluZSA9IHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgb3Byb2ZpbGVfaHJ0aW1lcl9zaHV0ZG93bih2b2lkKQogewotCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZvcHJvZmlsZV9jcHVfbm90aWZpZXIpOworCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKGhwX29ubGluZSk7CiB9CiAKIGludCBvcHJvZmlsZV90aW1lcl9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9LY29uZmlnIGIvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCA2N2Y5OTE2Li42NTU1ZWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNpL0tjb25maWcKQEAgLTI1LDcgKzI1LDcgQEAKIAkgICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBZLgogCiBjb25maWcgUENJX01TSV9JUlFfRE9NQUlOCi0JZGVmX2Jvb2wgQVJNIHx8IEFSTTY0IHx8IFg4NgorCWRlZl9ib29sIEFSQyB8fCBBUk0gfHwgQVJNNjQgfHwgWDg2CiAJZGVwZW5kcyBvbiBQQ0lfTVNJCiAJc2VsZWN0IEdFTkVSSUNfTVNJX0lSUV9ET01BSU4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC1icmlkZ2UuYyBiL2RyaXZlcnMvcGNpL2hvc3QtYnJpZGdlLmMKaW5kZXggNWY0YTJlMC4uYWRkNjYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC1icmlkZ2UuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0LWJyaWRnZS5jCkBAIC00NCw2ICs0NCw3IEBACiAJYnJpZGdlLT5yZWxlYXNlX2ZuID0gcmVsZWFzZV9mbjsKIAlicmlkZ2UtPnJlbGVhc2VfZGF0YSA9IHJlbGVhc2VfZGF0YTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9zZXRfaG9zdF9icmlkZ2VfcmVsZWFzZSk7CiAKIHZvaWQgcGNpYmlvc19yZXNvdXJjZV90b19idXMoc3RydWN0IHBjaV9idXMgKmJ1cywgc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24sCiAJCQkgICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9LY29uZmlnIGIvZHJpdmVycy9wY2kvaG9zdC9LY29uZmlnCmluZGV4IDliNDg1ZDguLmQ3ZTdjMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3BjaS9ob3N0L0tjb25maWcKQEAgLTI3NCw0ICsyNzQsMzEgQEAKIAkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIFBDSWUgY29udHJvbGxlciBzdXBwb3J0IG9uIEF4aXMgQVJUUEVDLTYKIAkgIFNvQ3MuICBUaGlzIFBDSWUgY29udHJvbGxlciB1c2VzIHRoZSBEZXNpZ25XYXJlIGNvcmUuCiAKK2NvbmZpZyBQQ0lFX1JPQ0tDSElQCisJYm9vbCAiUm9ja2NoaXAgUENJZSBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gQVJDSF9ST0NLQ0hJUAorCWRlcGVuZHMgb24gT0YKKwlkZXBlbmRzIG9uIFBDSV9NU0lfSVJRX0RPTUFJTgorCXNlbGVjdCBNRkRfU1lTQ09OCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBpbnRlcm5hbCBQQ0kgc3VwcG9ydCBvbiBSb2NrY2hpcCBTb0MuCisJICBUaGVyZSBpcyAxIGludGVybmFsIFBDSWUgcG9ydCBhdmFpbGFibGUgdG8gc3VwcG9ydCBHRU4yIHdpdGgKKwkgIDQgc2xvdHMuCisKK2NvbmZpZyBWTUQKKwlkZXBlbmRzIG9uIFBDSV9NU0kgJiYgWDg2XzY0CisJdHJpc3RhdGUgIkludGVsIFZvbHVtZSBNYW5hZ2VtZW50IERldmljZSBEcml2ZXIiCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgQWRkcyBzdXBwb3J0IGZvciB0aGUgSW50ZWwgVm9sdW1lIE1hbmFnZW1lbnQgRGV2aWNlIChWTUQpLiBWTUQgaXMgYQorCSAgc2Vjb25kYXJ5IFBDSSBob3N0IGJyaWRnZSB0aGF0IGFsbG93cyBQQ0kgRXhwcmVzcyByb290IHBvcnRzLAorCSAgYW5kIGRldmljZXMgYXR0YWNoZWQgdG8gdGhlbSwgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBkZWZhdWx0CisJICBQQ0kgZG9tYWluIGFuZCBwbGFjZWQgd2l0aGluIHRoZSBWTUQgZG9tYWluLiBUaGlzIHByb3ZpZGVzCisJICBtb3JlIGJ1cyByZXNvdXJjZXMgdGhhbiBhcmUgb3RoZXJ3aXNlIHBvc3NpYmxlIHdpdGggYQorCSAgc2luZ2xlIGRvbWFpbi4gSWYgeW91IGtub3cgeW91ciBzeXN0ZW0gcHJvdmlkZXMgb25lIG9mIHRoZXNlIGFuZAorCSAgaGFzIGRldmljZXMgYXR0YWNoZWQgdG8gaXQsIHNheSBZOyBpZiB5b3UgYXJlIG5vdCBzdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdm1kLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L01ha2VmaWxlIGIvZHJpdmVycy9wY2kvaG9zdC9NYWtlZmlsZQppbmRleCA4ODQzNDEwLi4wODRjYjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvTWFrZWZpbGUKQEAgLTMxLDMgKzMxLDUgQEAKIG9iai0kKENPTkZJR19QQ0lfSE9TVF9USFVOREVSX1BFTSkgKz0gcGNpLXRodW5kZXItcGVtLm8KIG9iai0kKENPTkZJR19QQ0lFX0FSTUFEQV84SykgKz0gcGNpZS1hcm1hZGE4ay5vCiBvYmotJChDT05GSUdfUENJRV9BUlRQRUM2KSArPSBwY2llLWFydHBlYzYubworb2JqLSQoQ09ORklHX1BDSUVfUk9DS0NISVApICs9IHBjaWUtcm9ja2NoaXAubworb2JqLSQoQ09ORklHX1ZNRCkgKz0gdm1kLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWFhcmR2YXJrLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1hYXJkdmFyay5jCmluZGV4IGVmOTg5M2YuLmU0YTViN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWFhcmR2YXJrLmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktYWFyZHZhcmsuYwpAQCAtODQ4LDcgKzg0OCw3IEBACiAJaW50IGVyciwgcmVzX3ZhbGlkID0gMDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGNpZS0+cGRldi0+ZGV2OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7Ci0Jc3RydWN0IHJlc291cmNlX2VudHJ5ICp3aW47CisJc3RydWN0IHJlc291cmNlX2VudHJ5ICp3aW4sICp0bXA7CiAJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZTsKIAogCUlOSVRfTElTVF9IRUFEKCZwY2llLT5yZXNvdXJjZXMpOwpAQCAtODYyLDcgKzg2Miw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfcmVsZWFzZV9yZXM7CiAKLQlyZXNvdXJjZV9saXN0X2Zvcl9lYWNoX2VudHJ5KHdpbiwgJnBjaWUtPnJlc291cmNlcykgeworCXJlc291cmNlX2xpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh3aW4sIHRtcCwgJnBjaWUtPnJlc291cmNlcykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHdpbi0+cmVzOwogCiAJCXN3aXRjaCAocmVzb3VyY2VfdHlwZShyZXMpKSB7CkBAIC04NzQsOSArODc0LDExIEBACiAJCQkJCSAgICAgbG93ZXJfMzJfYml0cyhyZXMtPnN0YXJ0KSwKIAkJCQkJICAgICBPQl9QQ0lFX0lPKTsKIAkJCWVyciA9IHBjaV9yZW1hcF9pb3NwYWNlKHJlcywgaW9iYXNlKTsKLQkJCWlmIChlcnIpCisJCQlpZiAoZXJyKSB7CiAJCQkJZGV2X3dhcm4oZGV2LCAiZXJyb3IgJWQ6IGZhaWxlZCB0byBtYXAgcmVzb3VyY2UgJXBSXG4iLAogCQkJCQkgZXJyLCByZXMpOworCQkJCXJlc291cmNlX2xpc3RfZGVzdHJveV9lbnRyeSh3aW4pOworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgSU9SRVNPVVJDRV9NRU06CiAJCQlhZHZrX3BjaWVfc2V0X29iX3dpbihwY2llLCAwLApAQCAtOTI1LDEwICs5MjcsOCBAQAogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlwY2llLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihwY2llLT5iYXNlKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gbWFwIHJlZ2lzdGVyc1xuIik7CisJaWYgKElTX0VSUihwY2llLT5iYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIocGNpZS0+YmFzZSk7Ci0JfQogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgYWR2a19wY2llX2lycV9oYW5kbGVyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktZHJhN3h4LmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1kcmE3eHguYwppbmRleCA4MWIzOTQ5Li4xOTIyM2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1kcmE3eHguYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1kcmE3eHguYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgpAQCAtNDQzLDI1ICs0NDMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19leGl0IGRyYTd4eF9wY2llX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBkcmE3eHhfcGNpZSAqZHJhN3h4ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IHBjaWVfcG9ydCAqcHAgPSAmZHJhN3h4LT5wcDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCWludCBjb3VudCA9IGRyYTd4eC0+cGh5X2NvdW50OwotCi0JaWYgKHBwLT5pcnFfZG9tYWluKQotCQlpcnFfZG9tYWluX3JlbW92ZShwcC0+aXJxX2RvbWFpbik7Ci0JcG1fcnVudGltZV9wdXQoZGV2KTsKLQlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKLQl3aGlsZSAoY291bnQtLSkgewotCQlwaHlfcG93ZXJfb2ZmKGRyYTd4eC0+cGh5W2NvdW50XSk7Ci0JCXBoeV9leGl0KGRyYTd4eC0+cGh5W2NvdW50XSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBpbnQgZHJhN3h4X3BjaWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC01NDUsMTkgKzUyNiwxMyBAQAogCXsgLmNvbXBhdGlibGUgPSAidGksZHJhNy1wY2llIiwgfSwKIAl7fSwKIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9kcmE3eHhfcGNpZV9tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRyYTd4eF9wY2llX2RyaXZlciA9IHsKLQkucmVtb3ZlCQk9IF9fZXhpdF9wKGRyYTd4eF9wY2llX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAiZHJhNy1wY2llIiwKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfZHJhN3h4X3BjaWVfbWF0Y2gsCisJCS5zdXBwcmVzc19iaW5kX2F0dHJzID0gdHJ1ZSwKIAkJLnBtCT0gJmRyYTd4eF9wY2llX3BtX29wcywKIAl9LAogfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcl9wcm9iZShkcmE3eHhfcGNpZV9kcml2ZXIsIGRyYTd4eF9wY2llX3Byb2JlKTsKLQotTU9EVUxFX0FVVEhPUigiS2lzaG9uIFZpamF5IEFicmFoYW0gSSA8a2lzaG9uQHRpLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiVEkgUENJZSBjb250cm9sbGVyIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworYnVpbHRpbl9wbGF0Zm9ybV9kcml2ZXJfcHJvYmUoZHJhN3h4X3BjaWVfZHJpdmVyLCBkcmE3eHhfcGNpZV9wcm9iZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1leHlub3MuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWV4eW5vcy5jCmluZGV4IDIxOTk3NjEuLjJlMmQ3ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWV4eW5vcy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWV4eW5vcy5jCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC00MjUsMTIgKzQyNSwxNSBAQAogCQlleHlub3NfcGNpZV9tc2lfaW5pdChwcCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBleHlub3NfcGNpZV9yZWFkbF9yYyhzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwKLQkJCQkJdm9pZCBfX2lvbWVtICpkYmlfYmFzZSwgdTMyICp2YWwpCitzdGF0aWMgaW5saW5lIHUzMiBleHlub3NfcGNpZV9yZWFkbF9yYyhzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwKKwkJCQkgICAgICAgdm9pZCBfX2lvbWVtICpkYmlfYmFzZSkKIHsKKwl1MzIgdmFsOworCiAJZXh5bm9zX3BjaWVfc2lkZWJhbmRfZGJpX3JfbW9kZShwcCwgdHJ1ZSk7Ci0JKnZhbCA9IHJlYWRsKGRiaV9iYXNlKTsKKwl2YWwgPSByZWFkbChkYmlfYmFzZSk7CiAJZXh5bm9zX3BjaWVfc2lkZWJhbmRfZGJpX3JfbW9kZShwcCwgZmFsc2UpOworCXJldHVybiB2YWw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBleHlub3NfcGNpZV93cml0ZWxfcmMoc3RydWN0IHBjaWVfcG9ydCAqcHAsCkBAIC02MjQsNyArNjI3LDYgQEAKIAl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTQ0MC1wY2llIiwgfSwKIAl7fSwKIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBleHlub3NfcGNpZV9vZl9tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGV4eW5vc19wY2llX2RyaXZlciA9IHsKIAkucmVtb3ZlCQk9IF9fZXhpdF9wKGV4eW5vc19wY2llX3JlbW92ZSksCkBAIC02NDEsNyArNjQzLDMgQEAKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZleHlub3NfcGNpZV9kcml2ZXIsIGV4eW5vc19wY2llX3Byb2JlKTsKIH0KIHN1YnN5c19pbml0Y2FsbChleHlub3NfcGNpZV9pbml0KTsKLQotTU9EVUxFX0FVVEhPUigiSmluZ29vIEhhbiA8amcxLmhhbkBzYW1zdW5nLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBQQ0llIGhvc3QgY29udHJvbGxlciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWhvc3QtY29tbW9uLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1ob3N0LWNvbW1vbi5jCmluZGV4IDlkOWQzNGUuLmUzYzQ4YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWhvc3QtY29tbW9uLmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktaG9zdC1jb21tb24uYwpAQCAtMSw0ICsxLDYgQEAKIC8qCisgKiBHZW5lcmljIFBDSSBob3N0IGRyaXZlciBjb21tb24gY29kZQorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCkBAIC0xNyw3ICsxOSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wY2ktZWNhbS5oPgpAQCAtMjksNyArMzAsNyBAQAogCWludCBlcnIsIHJlc192YWxpZCA9IDA7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAlyZXNvdXJjZV9zaXplX3QgaW9iYXNlOwotCXN0cnVjdCByZXNvdXJjZV9lbnRyeSAqd2luOworCXN0cnVjdCByZXNvdXJjZV9lbnRyeSAqd2luLCAqdG1wOwogCiAJZXJyID0gb2ZfcGNpX2dldF9ob3N0X2JyaWRnZV9yZXNvdXJjZXMobnAsIDAsIDB4ZmYsIHJlc291cmNlcywgJmlvYmFzZSk7CiAJaWYgKGVycikKQEAgLTM5LDE1ICs0MCwxNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlyZXNvdXJjZV9saXN0X2Zvcl9lYWNoX2VudHJ5KHdpbiwgcmVzb3VyY2VzKSB7CisJcmVzb3VyY2VfbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdpbiwgdG1wLCByZXNvdXJjZXMpIHsKIAkJc3RydWN0IHJlc291cmNlICpyZXMgPSB3aW4tPnJlczsKIAogCQlzd2l0Y2ggKHJlc291cmNlX3R5cGUocmVzKSkgewogCQljYXNlIElPUkVTT1VSQ0VfSU86CiAJCQllcnIgPSBwY2lfcmVtYXBfaW9zcGFjZShyZXMsIGlvYmFzZSk7Ci0JCQlpZiAoZXJyKQorCQkJaWYgKGVycikgewogCQkJCWRldl93YXJuKGRldiwgImVycm9yICVkOiBmYWlsZWQgdG8gbWFwIHJlc291cmNlICVwUlxuIiwKIAkJCQkJIGVyciwgcmVzKTsKKwkJCQlyZXNvdXJjZV9saXN0X2Rlc3Ryb3lfZW50cnkod2luKTsKKwkJCX0KIAkJCWJyZWFrOwogCQljYXNlIElPUkVTT1VSQ0VfTUVNOgogCQkJcmVzX3ZhbGlkIHw9ICEocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpOwpAQCAtMTYyLDcgKzE2NSwzIEBACiAJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOwogCXJldHVybiAwOwogfQotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkdlbmVyaWMgUENJIGhvc3QgZHJpdmVyIGNvbW1vbiBjb2RlIik7Ci1NT0RVTEVfQVVUSE9SKCJXaWxsIERlYWNvbiA8d2lsbC5kZWFjb25AYXJtLmNvbT4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWh5cGVydi5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktaHlwZXJ2LmMKaW5kZXggNjk1NWZmZGIuLjc2M2ZmODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWh5cGVydi5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWh5cGVydi5jCkBAIC0yMDAsMTEgKzIwMCwxMSBAQAogICovCiAKIHN0cnVjdCBwY2lfbWVzc2FnZSB7Ci0JdTMyIG1lc3NhZ2VfdHlwZTsKKwl1MzIgdHlwZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwY2lfY2hpbGRfbWVzc2FnZSB7Ci0JdTMyIG1lc3NhZ2VfdHlwZTsKKwlzdHJ1Y3QgcGNpX21lc3NhZ2UgbWVzc2FnZV90eXBlOwogCXVuaW9uIHdpbl9zbG90X2VuY29kaW5nIHdzbG90OwogfSBfX3BhY2tlZDsKIApAQCAtMjIyLDcgKzIyMiw4IEBACiAJdm9pZCAoKmNvbXBsZXRpb25fZnVuYykodm9pZCAqY29udGV4dCwgc3RydWN0IHBjaV9yZXNwb25zZSAqcmVzcCwKIAkJCQlpbnQgcmVzcF9wYWNrZXRfc2l6ZSk7CiAJdm9pZCAqY29tcGxfY3R4dDsKLQlzdHJ1Y3QgcGNpX21lc3NhZ2UgbWVzc2FnZTsKKworCXN0cnVjdCBwY2lfbWVzc2FnZSBtZXNzYWdlWzBdOwogfTsKIAogLyoKQEAgLTI1OCw3ICsyNTksNyBAQAogc3RydWN0IHBjaV9idXNfcmVsYXRpb25zIHsKIAlzdHJ1Y3QgcGNpX2luY29taW5nX21lc3NhZ2UgaW5jb21pbmc7CiAJdTMyIGRldmljZV9jb3VudDsKLQlzdHJ1Y3QgcGNpX2Z1bmN0aW9uX2Rlc2NyaXB0aW9uIGZ1bmNbMV07CisJc3RydWN0IHBjaV9mdW5jdGlvbl9kZXNjcmlwdGlvbiBmdW5jWzBdOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHBjaV9xX3Jlc19yZXFfcmVzcG9uc2UgewpAQCAtMzE0LDcgKzMxNSw3IEBACiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcGNpX2VqZWN0X3Jlc3BvbnNlIHsKLQl1MzIgbWVzc2FnZV90eXBlOworCXN0cnVjdCBwY2lfbWVzc2FnZSBtZXNzYWdlX3R5cGU7CiAJdW5pb24gd2luX3Nsb3RfZW5jb2Rpbmcgd3Nsb3Q7CiAJdTMyIHN0YXR1czsKIH0gX19wYWNrZWQ7CkBAIC0zNzMsNyArMzc0LDYgQEAKIAogCXN0cnVjdCBsaXN0X2hlYWQgY2hpbGRyZW47CiAJc3RydWN0IGxpc3RfaGVhZCBkcl9saXN0OwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3cms7CiAKIAlzdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvIG1zaV9pbmZvOwogCXN0cnVjdCBtc2lfY29udHJvbGxlciBtc2lfY2hpcDsKQEAgLTM5Myw3ICszOTMsNyBAQAogc3RydWN0IGh2X2RyX3N0YXRlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZW50cnk7CiAJdTMyIGRldmljZV9jb3VudDsKLQlzdHJ1Y3QgcGNpX2Z1bmN0aW9uX2Rlc2NyaXB0aW9uIGZ1bmNbMV07CisJc3RydWN0IHBjaV9mdW5jdGlvbl9kZXNjcmlwdGlvbiBmdW5jWzBdOwogfTsKIAogZW51bSBodl9wY2ljaGlsZF9zdGF0ZSB7CkBAIC00NDcsMTUgKzQ0NywxNiBAQAogICogZm9yIGFueSBtZXNzYWdlIGZvciB3aGljaCB0aGUgY29tcGxldGlvbiBwYWNrZXQgY29udGFpbnMgYQogICogc3RhdHVzIGFuZCBub3RoaW5nIGVsc2UuCiAgKi8KLXN0YXRpYwotdm9pZAotaHZfcGNpX2dlbmVyaWNfY29tcGwodm9pZCAqY29udGV4dCwgc3RydWN0IHBjaV9yZXNwb25zZSAqcmVzcCwKLQkJICAgICBpbnQgcmVzcF9wYWNrZXRfc2l6ZSkKK3N0YXRpYyB2b2lkIGh2X3BjaV9nZW5lcmljX2NvbXBsKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBwY2lfcmVzcG9uc2UgKnJlc3AsCisJCQkJIGludCByZXNwX3BhY2tldF9zaXplKQogewogCXN0cnVjdCBodl9wY2lfY29tcGwgKmNvbXBfcGt0ID0gY29udGV4dDsKIAogCWlmIChyZXNwX3BhY2tldF9zaXplID49IG9mZnNldG9mZW5kKHN0cnVjdCBwY2lfcmVzcG9uc2UsIHN0YXR1cykpCiAJCWNvbXBfcGt0LT5jb21wbGV0aW9uX3N0YXR1cyA9IHJlc3AtPnN0YXR1czsKKwllbHNlCisJCWNvbXBfcGt0LT5jb21wbGV0aW9uX3N0YXR1cyA9IC0xOworCiAJY29tcGxldGUoJmNvbXBfcGt0LT5ob3N0X2V2ZW50KTsKIH0KIApAQCAtNjk0LDEzICs2OTUsMTIgQEAKIAlzdHJ1Y3QgcGNpX2RlbGV0ZV9pbnRlcnJ1cHQgKmludF9wa3Q7CiAJc3RydWN0IHsKIAkJc3RydWN0IHBjaV9wYWNrZXQgcGt0OwotCQl1OCBidWZmZXJbc2l6ZW9mKHN0cnVjdCBwY2lfZGVsZXRlX2ludGVycnVwdCkgLQotCQkJICBzaXplb2Yoc3RydWN0IHBjaV9tZXNzYWdlKV07CisJCXU4IGJ1ZmZlcltzaXplb2Yoc3RydWN0IHBjaV9kZWxldGVfaW50ZXJydXB0KV07CiAJfSBjdHh0OwogCiAJbWVtc2V0KCZjdHh0LCAwLCBzaXplb2YoY3R4dCkpOwogCWludF9wa3QgPSAoc3RydWN0IHBjaV9kZWxldGVfaW50ZXJydXB0ICopJmN0eHQucGt0Lm1lc3NhZ2U7Ci0JaW50X3BrdC0+bWVzc2FnZV90eXBlLm1lc3NhZ2VfdHlwZSA9CisJaW50X3BrdC0+bWVzc2FnZV90eXBlLnR5cGUgPQogCQlQQ0lfREVMRVRFX0lOVEVSUlVQVF9NRVNTQUdFOwogCWludF9wa3QtPndzbG90LnNsb3QgPSBocGRldi0+ZGVzYy53aW5fc2xvdC5zbG90OwogCWludF9wa3QtPmludF9kZXNjID0gKmludF9kZXNjOwpAQCAtODQ3LDggKzg0Nyw3IEBACiAJc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5OwogCXN0cnVjdCB7CiAJCXN0cnVjdCBwY2lfcGFja2V0IHBrdDsKLQkJdTggYnVmZmVyW3NpemVvZihzdHJ1Y3QgcGNpX2NyZWF0ZV9pbnRlcnJ1cHQpIC0KLQkJCSAgc2l6ZW9mKHN0cnVjdCBwY2lfbWVzc2FnZSldOworCQl1OCBidWZmZXJbc2l6ZW9mKHN0cnVjdCBwY2lfY3JlYXRlX2ludGVycnVwdCldOwogCX0gY3R4dDsKIAlpbnQgY3B1OwogCWludCByZXQ7CkBAIC04NzYsNyArODc1LDcgQEAKIAljdHh0LnBrdC5jb21wbGV0aW9uX2Z1bmMgPSBodl9wY2lfY29tcG9zZV9jb21wbDsKIAljdHh0LnBrdC5jb21wbF9jdHh0ID0gJmNvbXA7CiAJaW50X3BrdCA9IChzdHJ1Y3QgcGNpX2NyZWF0ZV9pbnRlcnJ1cHQgKikmY3R4dC5wa3QubWVzc2FnZTsKLQlpbnRfcGt0LT5tZXNzYWdlX3R5cGUubWVzc2FnZV90eXBlID0gUENJX0NSRUFURV9JTlRFUlJVUFRfTUVTU0FHRTsKKwlpbnRfcGt0LT5tZXNzYWdlX3R5cGUudHlwZSA9IFBDSV9DUkVBVEVfSU5URVJSVVBUX01FU1NBR0U7CiAJaW50X3BrdC0+d3Nsb3Quc2xvdCA9IGhwZGV2LT5kZXNjLndpbl9zbG90LnNsb3Q7CiAJaW50X3BrdC0+aW50X2Rlc2MudmVjdG9yID0gY2ZnLT52ZWN0b3I7CiAJaW50X3BrdC0+aW50X2Rlc2MudmVjdG9yX2NvdW50ID0gMTsKQEAgLTg5Nyw4ICs4OTYsMTAgQEAKIAkJCSAgICAgICBzaXplb2YoKmludF9wa3QpLCAodW5zaWduZWQgbG9uZykmY3R4dC5wa3QsCiAJCQkgICAgICAgVk1fUEtUX0RBVEFfSU5CQU5ELAogCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOwotCWlmICghcmV0KQotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wLmNvbXBfcGt0Lmhvc3RfZXZlbnQpOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV9pbnRfZGVzYzsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXAuY29tcF9wa3QuaG9zdF9ldmVudCk7CiAKIAlpZiAoY29tcC5jb21wX3BrdC5jb21wbGV0aW9uX3N0YXR1cyA8IDApIHsKIAkJZGV2X2VycigmaGJ1cy0+aGRldi0+ZGV2aWNlLApAQCAtMTI4OSw3ICsxMjkwLDcgQEAKIAlwa3QuaW5pdF9wYWNrZXQuY29tcGxfY3R4dCA9ICZjb21wX3BrdDsKIAlwa3QuaW5pdF9wYWNrZXQuY29tcGxldGlvbl9mdW5jID0gcV9yZXNvdXJjZV9yZXF1aXJlbWVudHM7CiAJcmVzX3JlcSA9IChzdHJ1Y3QgcGNpX2NoaWxkX21lc3NhZ2UgKikmcGt0LmluaXRfcGFja2V0Lm1lc3NhZ2U7Ci0JcmVzX3JlcS0+bWVzc2FnZV90eXBlID0gUENJX1FVRVJZX1JFU09VUkNFX1JFUVVJUkVNRU5UUzsKKwlyZXNfcmVxLT5tZXNzYWdlX3R5cGUudHlwZSA9IFBDSV9RVUVSWV9SRVNPVVJDRV9SRVFVSVJFTUVOVFM7CiAJcmVzX3JlcS0+d3Nsb3Quc2xvdCA9IGRlc2MtPndpbl9zbG90LnNsb3Q7CiAKIAlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGhidXMtPmhkZXYtPmNoYW5uZWwsIHJlc19yZXEsCkBAIC0xNDY2LDggKzE0NjcsNyBAQAogCQkJaWYgKGhwZGV2LT5yZXBvcnRlZF9taXNzaW5nKSB7CiAJCQkJZm91bmQgPSB0cnVlOwogCQkJCXB1dF9wY2ljaGlsZChocGRldiwgaHZfcGNpZGV2X3JlZl9jaGlsZGxpc3QpOwotCQkJCWxpc3RfZGVsKCZocGRldi0+bGlzdF9lbnRyeSk7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmaHBkZXYtPmxpc3RfZW50cnksICZyZW1vdmVkKTsKKwkJCQlsaXN0X21vdmVfdGFpbCgmaHBkZXYtPmxpc3RfZW50cnksICZyZW1vdmVkKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMTU1OCw4ICsxNTU4LDcgQEAKIAlpbnQgd3Nsb3Q7CiAJc3RydWN0IHsKIAkJc3RydWN0IHBjaV9wYWNrZXQgcGt0OwotCQl1OCBidWZmZXJbc2l6ZW9mKHN0cnVjdCBwY2lfZWplY3RfcmVzcG9uc2UpIC0KLQkJCSAgc2l6ZW9mKHN0cnVjdCBwY2lfbWVzc2FnZSldOworCQl1OCBidWZmZXJbc2l6ZW9mKHN0cnVjdCBwY2lfZWplY3RfcmVzcG9uc2UpXTsKIAl9IGN0eHQ7CiAKIAlocGRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaHZfcGNpX2Rldiwgd3JrKTsKQEAgLTE1ODUsNyArMTU4NCw3IEBACiAKIAltZW1zZXQoJmN0eHQsIDAsIHNpemVvZihjdHh0KSk7CiAJZWpjdF9wa3QgPSAoc3RydWN0IHBjaV9lamVjdF9yZXNwb25zZSAqKSZjdHh0LnBrdC5tZXNzYWdlOwotCWVqY3RfcGt0LT5tZXNzYWdlX3R5cGUgPSBQQ0lfRUpFQ1RJT05fQ09NUExFVEU7CisJZWpjdF9wa3QtPm1lc3NhZ2VfdHlwZS50eXBlID0gUENJX0VKRUNUSU9OX0NPTVBMRVRFOwogCWVqY3RfcGt0LT53c2xvdC5zbG90ID0gaHBkZXYtPmRlc2Mud2luX3Nsb3Quc2xvdDsKIAl2bWJ1c19zZW5kcGFja2V0KGhwZGV2LT5oYnVzLT5oZGV2LT5jaGFubmVsLCBlamN0X3BrdCwKIAkJCSBzaXplb2YoKmVqY3RfcGt0KSwgKHVuc2lnbmVkIGxvbmcpJmN0eHQucGt0LApAQCAtMTY4OCw3ICsxNjg3LDcgQEAKIAkJY2FzZSBWTV9QS1RfREFUQV9JTkJBTkQ6CiAKIAkJCW5ld19tZXNzYWdlID0gKHN0cnVjdCBwY2lfaW5jb21pbmdfbWVzc2FnZSAqKWJ1ZmZlcjsKLQkJCXN3aXRjaCAobmV3X21lc3NhZ2UtPm1lc3NhZ2VfdHlwZS5tZXNzYWdlX3R5cGUpIHsKKwkJCXN3aXRjaCAobmV3X21lc3NhZ2UtPm1lc3NhZ2VfdHlwZS50eXBlKSB7CiAJCQljYXNlIFBDSV9CVVNfUkVMQVRJT05TOgogCiAJCQkJYnVzX3JlbCA9IChzdHJ1Y3QgcGNpX2J1c19yZWxhdGlvbnMgKilidWZmZXI7CkBAIC0xNzE5LDcgKzE3MTgsNyBAQAogCQkJZGVmYXVsdDoKIAkJCQlkZXZfd2FybigmaGJ1cy0+aGRldi0+ZGV2aWNlLAogCQkJCQkiVW5pbXBsZW1lbnRlZCBwcm90b2NvbCBtZXNzYWdlICV4XG4iLAotCQkJCQluZXdfbWVzc2FnZS0+bWVzc2FnZV90eXBlLm1lc3NhZ2VfdHlwZSk7CisJCQkJCW5ld19tZXNzYWdlLT5tZXNzYWdlX3R5cGUudHlwZSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlicmVhazsKQEAgLTE3NzIsNyArMTc3MSw3IEBACiAJcGt0LT5jb21wbGV0aW9uX2Z1bmMgPSBodl9wY2lfZ2VuZXJpY19jb21wbDsKIAlwa3QtPmNvbXBsX2N0eHQgPSAmY29tcF9wa3Q7CiAJdmVyc2lvbl9yZXEgPSAoc3RydWN0IHBjaV92ZXJzaW9uX3JlcXVlc3QgKikmcGt0LT5tZXNzYWdlOwotCXZlcnNpb25fcmVxLT5tZXNzYWdlX3R5cGUubWVzc2FnZV90eXBlID0gUENJX1FVRVJZX1BST1RPQ09MX1ZFUlNJT047CisJdmVyc2lvbl9yZXEtPm1lc3NhZ2VfdHlwZS50eXBlID0gUENJX1FVRVJZX1BST1RPQ09MX1ZFUlNJT047CiAJdmVyc2lvbl9yZXEtPnByb3RvY29sX3ZlcnNpb24gPSBQQ0lfUFJPVE9DT0xfVkVSU0lPTl9DVVJSRU5UOwogCiAJcmV0ID0gdm1idXNfc2VuZHBhY2tldChoZGV2LT5jaGFubmVsLCB2ZXJzaW9uX3JlcSwKQEAgLTE5NzMsNyArMTk3Miw3IEBACiAJcGt0LT5jb21wbGV0aW9uX2Z1bmMgPSBodl9wY2lfZ2VuZXJpY19jb21wbDsKIAlwa3QtPmNvbXBsX2N0eHQgPSAmY29tcF9wa3Q7CiAJZDBfZW50cnkgPSAoc3RydWN0IHBjaV9idXNfZDBfZW50cnkgKikmcGt0LT5tZXNzYWdlOwotCWQwX2VudHJ5LT5tZXNzYWdlX3R5cGUubWVzc2FnZV90eXBlID0gUENJX0JVU19EMEVOVFJZOworCWQwX2VudHJ5LT5tZXNzYWdlX3R5cGUudHlwZSA9IFBDSV9CVVNfRDBFTlRSWTsKIAlkMF9lbnRyeS0+bW1pb19iYXNlID0gaGJ1cy0+bWVtX2NvbmZpZy0+c3RhcnQ7CiAKIAlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGhkZXYtPmNoYW5uZWwsIGQwX2VudHJ5LCBzaXplb2YoKmQwX2VudHJ5KSwKQEAgLTIwMTksNyArMjAxOCw3IEBACiAJCXJldHVybiAtRU5PVEVNUFRZOwogCiAJbWVtc2V0KCZtZXNzYWdlLCAwLCBzaXplb2YobWVzc2FnZSkpOwotCW1lc3NhZ2UubWVzc2FnZV90eXBlID0gUENJX1FVRVJZX0JVU19SRUxBVElPTlM7CisJbWVzc2FnZS50eXBlID0gUENJX1FVRVJZX0JVU19SRUxBVElPTlM7CiAKIAlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGhkZXYtPmNoYW5uZWwsICZtZXNzYWdlLCBzaXplb2YobWVzc2FnZSksCiAJCQkgICAgICAgMCwgVk1fUEtUX0RBVEFfSU5CQU5ELCAwKTsKQEAgLTIwNzIsOCArMjA3MSw4IEBACiAJCWluaXRfY29tcGxldGlvbigmY29tcF9wa3QuaG9zdF9ldmVudCk7CiAJCXBrdC0+Y29tcGxldGlvbl9mdW5jID0gaHZfcGNpX2dlbmVyaWNfY29tcGw7CiAJCXBrdC0+Y29tcGxfY3R4dCA9ICZjb21wX3BrdDsKLQkJcGt0LT5tZXNzYWdlLm1lc3NhZ2VfdHlwZSA9IFBDSV9SRVNPVVJDRVNfQVNTSUdORUQ7CiAJCXJlc19hc3NpZ25lZCA9IChzdHJ1Y3QgcGNpX3Jlc291cmNlc19hc3NpZ25lZCAqKSZwa3QtPm1lc3NhZ2U7CisJCXJlc19hc3NpZ25lZC0+bWVzc2FnZV90eXBlLnR5cGUgPSBQQ0lfUkVTT1VSQ0VTX0FTU0lHTkVEOwogCQlyZXNfYXNzaWduZWQtPndzbG90LnNsb3QgPSBocGRldi0+ZGVzYy53aW5fc2xvdC5zbG90OwogCiAJCXB1dF9wY2ljaGlsZChocGRldiwgaHZfcGNpZGV2X3JlZl9ieV9zbG90KTsKQEAgLTIxMjMsNyArMjEyMiw3IEBACiAJCQljb250aW51ZTsKIAogCQltZW1zZXQoJnBrdCwgMCwgc2l6ZW9mKHBrdCkpOwotCQlwa3QubWVzc2FnZV90eXBlID0gUENJX1JFU09VUkNFU19SRUxFQVNFRDsKKwkJcGt0Lm1lc3NhZ2VfdHlwZS50eXBlID0gUENJX1JFU09VUkNFU19SRUxFQVNFRDsKIAkJcGt0LndzbG90LnNsb3QgPSBocGRldi0+ZGVzYy53aW5fc2xvdC5zbG90OwogCiAJCXB1dF9wY2ljaGlsZChocGRldiwgaHZfcGNpZGV2X3JlZl9ieV9zbG90KTsKQEAgLTIyOTAsNyArMjI4OSw3IEBACiAJaW5pdF9jb21wbGV0aW9uKCZjb21wX3BrdC5ob3N0X2V2ZW50KTsKIAlwa3QudGVhcmRvd25fcGFja2V0LmNvbXBsZXRpb25fZnVuYyA9IGh2X3BjaV9nZW5lcmljX2NvbXBsOwogCXBrdC50ZWFyZG93bl9wYWNrZXQuY29tcGxfY3R4dCA9ICZjb21wX3BrdDsKLQlwa3QudGVhcmRvd25fcGFja2V0Lm1lc3NhZ2UubWVzc2FnZV90eXBlID0gUENJX0JVU19EMEVYSVQ7CisJcGt0LnRlYXJkb3duX3BhY2tldC5tZXNzYWdlWzBdLnR5cGUgPSBQQ0lfQlVTX0QwRVhJVDsKIAogCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoaGRldi0+Y2hhbm5lbCwgJnBrdC50ZWFyZG93bl9wYWNrZXQubWVzc2FnZSwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IHBjaV9tZXNzYWdlKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWlteDYuYwppbmRleCBiNzQxYTM2Li5lYWQ0YTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1pbXg2LmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktaW14Ni5jCkBAIC03MzksNyArNzM5LDYgQEAKIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg2cXAtcGNpZSIsIC5kYXRhID0gKHZvaWQgKilJTVg2UVAsIH0sCiAJe30sCiB9OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaW14Nl9wY2llX29mX21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaW14Nl9wY2llX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewpAQCAtNzQ5LDE0ICs3NDgsOCBAQAogCS5zaHV0ZG93biA9IGlteDZfcGNpZV9zaHV0ZG93biwKIH07CiAKLS8qIEZyZWVzY2FsZSBQQ0llIGRyaXZlciBkb2VzIG5vdCBhbGxvdyBtb2R1bGUgdW5sb2FkICovCi0KIHN0YXRpYyBpbnQgX19pbml0IGlteDZfcGNpZV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmaW14Nl9wY2llX2RyaXZlciwgaW14Nl9wY2llX3Byb2JlKTsKIH0KLW1vZHVsZV9pbml0KGlteDZfcGNpZV9pbml0KTsKLQotTU9EVUxFX0FVVEhPUigiU2VhbiBDcm9zcyA8eG9ic0Brb3NhZ2kuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJGcmVlc2NhbGUgaS5NWDYgUENJZSBob3N0IGNvbnRyb2xsZXIgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitkZXZpY2VfaW5pdGNhbGwoaW14Nl9wY2llX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2kta2V5c3RvbmUuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWtleXN0b25lLmMKaW5kZXggOGJhMjg4My4uODJiNDYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2kta2V5c3RvbmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS1rZXlzdG9uZS5jCkBAIC0zMzQsOCArMzM0LDkgQEAKIAlpZiAoa3NfcGNpZS0+ZXJyb3JfaXJxIDw9IDApCiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJubyBlcnJvciBJUlEgZGVmaW5lZFxuIik7CiAJZWxzZSB7Ci0JCWlmIChyZXF1ZXN0X2lycShrc19wY2llLT5lcnJvcl9pcnEsIHBjaWVfZXJyX2lycV9oYW5kbGVyLAotCQkJCUlSUUZfU0hBUkVELCAicGNpZS1lcnJvci1pcnEiLCBrc19wY2llKSA8IDApIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoa3NfcGNpZS0+ZXJyb3JfaXJxLCBwY2llX2Vycl9pcnFfaGFuZGxlciwKKwkJCQkgIElSUUZfU0hBUkVELCAicGNpZS1lcnJvci1pcnEiLCBrc19wY2llKTsKKwkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGVycm9yIElSUSAlZFxuIiwKIAkJCQlrc19wY2llLT5lcnJvcl9pcnEpOwogCQkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXRlZ3JhLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS10ZWdyYS5jCmluZGV4IDZkZTA3NTcuLmUyYThlNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXRlZ3JhLmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktdGVncmEuYwpAQCAtMjQwLDcgKzI0MCw3IEBACiB9OwogCiAvKiB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBUZWdyYSBTb0MgZ2VuZXJhdGlvbnMgKi8KLXN0cnVjdCB0ZWdyYV9wY2llX3NvY19kYXRhIHsKK3N0cnVjdCB0ZWdyYV9wY2llX3NvYyB7CiAJdW5zaWduZWQgaW50IG51bV9wb3J0czsKIAl1bnNpZ25lZCBpbnQgbXNpX2Jhc2Vfc2hpZnQ7CiAJdTMyIHBhZHNfcGxsX2N0bDsKQEAgLTMwMCw3ICszMDAsNyBAQAogCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpzdXBwbGllczsKIAl1bnNpZ25lZCBpbnQgbnVtX3N1cHBsaWVzOwogCi0JY29uc3Qgc3RydWN0IHRlZ3JhX3BjaWVfc29jX2RhdGEgKnNvY19kYXRhOworCWNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvYyAqc29jOwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnM7CiB9OwogCkBAIC01NDIsOCArNTQyLDggQEAKIAogc3RhdGljIHZvaWQgdGVncmFfcGNpZV9wb3J0X2VuYWJsZShzdHJ1Y3QgdGVncmFfcGNpZV9wb3J0ICpwb3J0KQogewotCWNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvY19kYXRhICpzb2MgPSBwb3J0LT5wY2llLT5zb2NfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGN0cmwgPSB0ZWdyYV9wY2llX3BvcnRfZ2V0X3BleF9jdHJsKHBvcnQpOworCWNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvYyAqc29jID0gcG9ydC0+cGNpZS0+c29jOwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAKIAkvKiBlbmFibGUgcmVmZXJlbmNlIGNsb2NrICovCkBAIC01NjIsOCArNTYyLDggQEAKIAogc3RhdGljIHZvaWQgdGVncmFfcGNpZV9wb3J0X2Rpc2FibGUoc3RydWN0IHRlZ3JhX3BjaWVfcG9ydCAqcG9ydCkKIHsKLQljb25zdCBzdHJ1Y3QgdGVncmFfcGNpZV9zb2NfZGF0YSAqc29jID0gcG9ydC0+cGNpZS0+c29jX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBjdHJsID0gdGVncmFfcGNpZV9wb3J0X2dldF9wZXhfY3RybChwb3J0KTsKKwljb25zdCBzdHJ1Y3QgdGVncmFfcGNpZV9zb2MgKnNvYyA9IHBvcnQtPnBjaWUtPnNvYzsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCiAJLyogYXNzZXJ0IHBvcnQgcmVzZXQgKi8KQEAgLTYyMSw3ICs2MjEsMTEgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXBjaV9hZGRfcmVzb3VyY2Vfb2Zmc2V0KCZzeXMtPnJlc291cmNlcywgJnBjaWUtPnBpbywgc3lzLT5pb19vZmZzZXQpOworCWVyciA9IHBjaV9yZW1hcF9pb3NwYWNlKCZwY2llLT5waW8sIHBjaWUtPmlvLnN0YXJ0KTsKKwlpZiAoIWVycikKKwkJcGNpX2FkZF9yZXNvdXJjZV9vZmZzZXQoJnN5cy0+cmVzb3VyY2VzLCAmcGNpZS0+cGlvLAorCQkJCQlzeXMtPmlvX29mZnNldCk7CisKIAlwY2lfYWRkX3Jlc291cmNlX29mZnNldCgmc3lzLT5yZXNvdXJjZXMsICZwY2llLT5tZW0sIHN5cy0+bWVtX29mZnNldCk7CiAJcGNpX2FkZF9yZXNvdXJjZV9vZmZzZXQoJnN5cy0+cmVzb3VyY2VzLCAmcGNpZS0+cHJlZmV0Y2gsCiAJCQkJc3lzLT5tZW1fb2Zmc2V0KTsKQEAgLTYzMSw3ICs2MzUsNiBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JcGNpX3JlbWFwX2lvc3BhY2UoJnBjaWUtPnBpbywgcGNpZS0+aW8uc3RhcnQpOwogCXJldHVybiAxOwogfQogCkBAIC03NzQsNyArNzc3LDcgQEAKIAogc3RhdGljIGludCB0ZWdyYV9wY2llX3BsbF93YWl0KHN0cnVjdCB0ZWdyYV9wY2llICpwY2llLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCiB7Ci0JY29uc3Qgc3RydWN0IHRlZ3JhX3BjaWVfc29jX2RhdGEgKnNvYyA9IHBjaWUtPnNvY19kYXRhOworCWNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvYyAqc29jID0gcGNpZS0+c29jOwogCXUzMiB2YWx1ZTsKIAogCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KTsKQEAgLTc5MCw3ICs3OTMsNyBAQAogCiBzdGF0aWMgaW50IHRlZ3JhX3BjaWVfcGh5X2VuYWJsZShzdHJ1Y3QgdGVncmFfcGNpZSAqcGNpZSkKIHsKLQljb25zdCBzdHJ1Y3QgdGVncmFfcGNpZV9zb2NfZGF0YSAqc29jID0gcGNpZS0+c29jX2RhdGE7CisJY29uc3Qgc3RydWN0IHRlZ3JhX3BjaWVfc29jICpzb2MgPSBwY2llLT5zb2M7CiAJdTMyIHZhbHVlOwogCWludCBlcnI7CiAKQEAgLTg0NSw3ICs4NDgsNyBAQAogCiBzdGF0aWMgaW50IHRlZ3JhX3BjaWVfcGh5X2Rpc2FibGUoc3RydWN0IHRlZ3JhX3BjaWUgKnBjaWUpCiB7Ci0JY29uc3Qgc3RydWN0IHRlZ3JhX3BjaWVfc29jX2RhdGEgKnNvYyA9IHBjaWUtPnNvY19kYXRhOworCWNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvYyAqc29jID0gcGNpZS0+c29jOwogCXUzMiB2YWx1ZTsKIAogCS8qIGRpc2FibGUgVFgvUlggZGF0YSAqLwpAQCAtOTA2LDcgKzkwOSw3IEBACiAKIHN0YXRpYyBpbnQgdGVncmFfcGNpZV9waHlfcG93ZXJfb24oc3RydWN0IHRlZ3JhX3BjaWUgKnBjaWUpCiB7Ci0JY29uc3Qgc3RydWN0IHRlZ3JhX3BjaWVfc29jX2RhdGEgKnNvYyA9IHBjaWUtPnNvY19kYXRhOworCWNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvYyAqc29jID0gcGNpZS0+c29jOwogCXN0cnVjdCB0ZWdyYV9wY2llX3BvcnQgKnBvcnQ7CiAJaW50IGVycjsKIApAQCAtOTc0LDcgKzk3Nyw3IEBACiAKIHN0YXRpYyBpbnQgdGVncmFfcGNpZV9lbmFibGVfY29udHJvbGxlcihzdHJ1Y3QgdGVncmFfcGNpZSAqcGNpZSkKIHsKLQljb25zdCBzdHJ1Y3QgdGVncmFfcGNpZV9zb2NfZGF0YSAqc29jID0gcGNpZS0+c29jX2RhdGE7CisJY29uc3Qgc3RydWN0IHRlZ3JhX3BjaWVfc29jICpzb2MgPSBwY2llLT5zb2M7CiAJc3RydWN0IHRlZ3JhX3BjaWVfcG9ydCAqcG9ydDsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCWludCBlcnI7CkBAIC0xMDY3LDcgKzEwNzAsNyBAQAogCiBzdGF0aWMgaW50IHRlZ3JhX3BjaWVfcG93ZXJfb24oc3RydWN0IHRlZ3JhX3BjaWUgKnBjaWUpCiB7Ci0JY29uc3Qgc3RydWN0IHRlZ3JhX3BjaWVfc29jX2RhdGEgKnNvYyA9IHBjaWUtPnNvY19kYXRhOworCWNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvYyAqc29jID0gcGNpZS0+c29jOwogCWludCBlcnI7CiAKIAlyZXNldF9jb250cm9sX2Fzc2VydChwY2llLT5wY2llX3hyc3QpOwpAQCAtMTExNyw3ICsxMTIwLDcgQEAKIAogc3RhdGljIGludCB0ZWdyYV9wY2llX2Nsb2Nrc19nZXQoc3RydWN0IHRlZ3JhX3BjaWUgKnBjaWUpCiB7Ci0JY29uc3Qgc3RydWN0IHRlZ3JhX3BjaWVfc29jX2RhdGEgKnNvYyA9IHBjaWUtPnNvY19kYXRhOworCWNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvYyAqc29jID0gcGNpZS0+c29jOwogCiAJcGNpZS0+cGV4X2NsayA9IGRldm1fY2xrX2dldChwY2llLT5kZXYsICJwZXgiKTsKIAlpZiAoSVNfRVJSKHBjaWUtPnBleF9jbGspKQpAQCAtMTIzNCw3ICsxMjM3LDcgQEAKIAogc3RhdGljIGludCB0ZWdyYV9wY2llX3BoeXNfZ2V0KHN0cnVjdCB0ZWdyYV9wY2llICpwY2llKQogewotCWNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvY19kYXRhICpzb2MgPSBwY2llLT5zb2NfZGF0YTsKKwljb25zdCBzdHJ1Y3QgdGVncmFfcGNpZV9zb2MgKnNvYyA9IHBjaWUtPnNvYzsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGNpZS0+ZGV2LT5vZl9ub2RlOwogCXN0cnVjdCB0ZWdyYV9wY2llX3BvcnQgKnBvcnQ7CiAJaW50IGVycjsKQEAgLTE0ODYsNyArMTQ4OSw3IEBACiBzdGF0aWMgaW50IHRlZ3JhX3BjaWVfZW5hYmxlX21zaShzdHJ1Y3QgdGVncmFfcGNpZSAqcGNpZSkKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKHBjaWUtPmRldik7Ci0JY29uc3Qgc3RydWN0IHRlZ3JhX3BjaWVfc29jX2RhdGEgKnNvYyA9IHBjaWUtPnNvY19kYXRhOworCWNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvYyAqc29jID0gcGNpZS0+c29jOwogCXN0cnVjdCB0ZWdyYV9tc2kgKm1zaSA9ICZwY2llLT5tc2k7CiAJdW5zaWduZWQgbG9uZyBiYXNlOwogCWludCBlcnI7CkBAIC0xNzk5LDggKzE4MDIsOCBAQAogCiBzdGF0aWMgaW50IHRlZ3JhX3BjaWVfcGFyc2VfZHQoc3RydWN0IHRlZ3JhX3BjaWUgKnBjaWUpCiB7Ci0JY29uc3Qgc3RydWN0IHRlZ3JhX3BjaWVfc29jX2RhdGEgKnNvYyA9IHBjaWUtPnNvY19kYXRhOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwY2llLT5kZXYtPm9mX25vZGUsICpwb3J0OworCWNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvYyAqc29jID0gcGNpZS0+c29jOwogCXN0cnVjdCBvZl9wY2lfcmFuZ2VfcGFyc2VyIHBhcnNlcjsKIAlzdHJ1Y3Qgb2ZfcGNpX3JhbmdlIHJhbmdlOwogCXUzMiBsYW5lcyA9IDAsIG1hc2sgPSAwOwpAQCAtMjA0Myw3ICsyMDQ2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvY19kYXRhIHRlZ3JhMjBfcGNpZV9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvYyB0ZWdyYTIwX3BjaWUgPSB7CiAJLm51bV9wb3J0cyA9IDIsCiAJLm1zaV9iYXNlX3NoaWZ0ID0gMCwKIAkucGFkc19wbGxfY3RsID0gUEFEU19QTExfQ1RMX1RFR1JBMjAsCkBAIC0yMDU2LDcgKzIwNTksNyBAQAogCS5oYXNfZ2VuMiA9IGZhbHNlLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvY19kYXRhIHRlZ3JhMzBfcGNpZV9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvYyB0ZWdyYTMwX3BjaWUgPSB7CiAJLm51bV9wb3J0cyA9IDMsCiAJLm1zaV9iYXNlX3NoaWZ0ID0gOCwKIAkucGFkc19wbGxfY3RsID0gUEFEU19QTExfQ1RMX1RFR1JBMzAsCkBAIC0yMDcwLDcgKzIwNzMsNyBAQAogCS5oYXNfZ2VuMiA9IGZhbHNlLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9wY2llX3NvY19kYXRhIHRlZ3JhMTI0X3BjaWVfZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGVncmFfcGNpZV9zb2MgdGVncmExMjRfcGNpZSA9IHsKIAkubnVtX3BvcnRzID0gMiwKIAkubXNpX2Jhc2Vfc2hpZnQgPSA4LAogCS5wYWRzX3BsbF9jdGwgPSBQQURTX1BMTF9DVExfVEVHUkEzMCwKQEAgLTIwODQsOSArMjA4Nyw5IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0ZWdyYV9wY2llX29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMjQtcGNpZSIsIC5kYXRhID0gJnRlZ3JhMTI0X3BjaWVfZGF0YSB9LAotCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtcGNpZSIsIC5kYXRhID0gJnRlZ3JhMzBfcGNpZV9kYXRhIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1wY2llIiwgLmRhdGEgPSAmdGVncmEyMF9wY2llX2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTEyNC1wY2llIiwgLmRhdGEgPSAmdGVncmExMjRfcGNpZSB9LAorCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtcGNpZSIsIC5kYXRhID0gJnRlZ3JhMzBfcGNpZSB9LAorCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtcGNpZSIsIC5kYXRhID0gJnRlZ3JhMjBfcGNpZSB9LAogCXsgfSwKIH07CiAKQEAgLTIyMDEsMjEgKzIyMDQsMTYgQEAKIAogc3RhdGljIGludCB0ZWdyYV9wY2llX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAJc3RydWN0IHRlZ3JhX3BjaWUgKnBjaWU7CiAJaW50IGVycjsKIAotCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKHRlZ3JhX3BjaWVfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOwotCWlmICghbWF0Y2gpCi0JCXJldHVybiAtRU5PREVWOwotCiAJcGNpZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBjaWUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBjaWUpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcGNpZS0+c29jID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOwogCUlOSVRfTElTVF9IRUFEKCZwY2llLT5idXNlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJnBjaWUtPnBvcnRzKTsKLQlwY2llLT5zb2NfZGF0YSA9IG1hdGNoLT5kYXRhOwogCXBjaWUtPmRldiA9ICZwZGV2LT5kZXY7CiAKIAllcnIgPSB0ZWdyYV9wY2llX3BhcnNlX2R0KHBjaWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktdmVyc2F0aWxlLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS12ZXJzYXRpbGUuYwppbmRleCBmMjM0NDA1Ny4uYjdkYzA3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktdmVyc2F0aWxlLmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktdmVyc2F0aWxlLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAlpbnQgZXJyLCBtZW0gPSAxLCByZXNfdmFsaWQgPSAwOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZTsKLQlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKndpbjsKKwlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKndpbiwgKnRtcDsKIAogCWVyciA9IG9mX3BjaV9nZXRfaG9zdF9icmlkZ2VfcmVzb3VyY2VzKG5wLCAwLCAweGZmLCByZXMsICZpb2Jhc2UpOwogCWlmIChlcnIpCkBAIC04NCwxNSArODQsMTcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9yZWxlYXNlX3JlczsKIAotCXJlc291cmNlX2xpc3RfZm9yX2VhY2hfZW50cnkod2luLCByZXMpIHsKKwlyZXNvdXJjZV9saXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2luLCB0bXAsIHJlcykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHdpbi0+cmVzOwogCiAJCXN3aXRjaCAocmVzb3VyY2VfdHlwZShyZXMpKSB7CiAJCWNhc2UgSU9SRVNPVVJDRV9JTzoKIAkJCWVyciA9IHBjaV9yZW1hcF9pb3NwYWNlKHJlcywgaW9iYXNlKTsKLQkJCWlmIChlcnIpCisJCQlpZiAoZXJyKSB7CiAJCQkJZGV2X3dhcm4oZGV2LCAiZXJyb3IgJWQ6IGZhaWxlZCB0byBtYXAgcmVzb3VyY2UgJXBSXG4iLAogCQkJCQkgZXJyLCByZXMpOworCQkJCXJlc291cmNlX2xpc3RfZGVzdHJveV9lbnRyeSh3aW4pOworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgSU9SRVNPVVJDRV9NRU06CiAJCQlyZXNfdmFsaWQgfD0gIShyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtYWx0ZXJhLW1zaS5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWFsdGVyYS1tc2kuYwppbmRleCA5OTE3N2Y0Li40ZTVkNjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtYWx0ZXJhLW1zaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1hbHRlcmEtbXNpLmMKQEAgLTEsNCArMSw4IEBACiAvKgorICogQWx0ZXJhIFBDSWUgTVNJIHN1cHBvcnQKKyAqCisgKiBBdXRob3I6IExleSBGb29uIFRhbiA8bGZ0YW5AYWx0ZXJhLmNvbT4KKyAqCiAgKiBDb3B5cmlnaHQgQWx0ZXJhIENvcnBvcmF0aW9uIChDKSAyMDEzLTIwMTUuIEFsbCByaWdodHMgcmVzZXJ2ZWQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdApAQCAtMTYsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxY2hpcC9jaGFpbmVkX2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CkBAIC0yMzcsMTEgKzI0MSw2IEBACiAJbXNpLT5wZGV2ID0gcGRldjsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJjc3IiKTsKLQlpZiAoIXJlcykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBjc3IgbWVtb3J5IHJlc291cmNlIGRlZmluZWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KIAltc2ktPmNzcl9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CiAJaWYgKElTX0VSUihtc2ktPmNzcl9iYXNlKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIGNzciBtZW1vcnlcbiIpOwpAQCAtMjUwLDExICsyNDksNiBAQAogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwKIAkJCQkJICAgInZlY3Rvcl9zbGF2ZSIpOwotCWlmICghcmVzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHZlY3Rvcl9zbGF2ZSBtZW1vcnkgcmVzb3VyY2UgZGVmaW5lZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCW1zaS0+dmVjdG9yX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKG1zaS0+dmVjdG9yX2Jhc2UpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBtYXAgdmVjdG9yX3NsYXZlIG1lbW9yeVxuIik7CkBAIC0zMDgsNyArMzAyLDMgQEAKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbHRlcmFfbXNpX2RyaXZlcik7CiB9CiBzdWJzeXNfaW5pdGNhbGwoYWx0ZXJhX21zaV9pbml0KTsKLQotTU9EVUxFX0FVVEhPUigiTGV5IEZvb24gVGFuIDxsZnRhbkBhbHRlcmEuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBbHRlcmEgUENJZSBNU0kgc3VwcG9ydCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLWFsdGVyYS5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWFsdGVyYS5jCmluZGV4IDJiNzgzNzYuLmMyNGU5NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1hbHRlcmEuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtYWx0ZXJhLmMKQEAgLTEsNiArMSw5IEBACiAvKgogICogQ29weXJpZ2h0IEFsdGVyYSBDb3Jwb3JhdGlvbiAoQykgMjAxMy0yMDE1LiBBbGwgcmlnaHRzIHJlc2VydmVkCiAgKgorICogQXV0aG9yOiBMZXkgRm9vbiBUYW4gPGxmdGFuQGFsdGVyYS5jb20+CisgKiBEZXNjcmlwdGlvbjogQWx0ZXJhIFBDSWUgaG9zdCBjb250cm9sbGVyIGRyaXZlcgorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAogICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQEAgLTE3LDcgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvY2hhaW5lZF9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgpAQCAtNDMsNiArNDYsNyBAQAogI2RlZmluZSBSUF9MVFNTTV9NQVNLCQkJMHgxZgogI2RlZmluZSBMVFNTTV9MMAkJCTB4ZgogCisjZGVmaW5lIFBDSUVfQ0FQX09GRlNFVAkJCTB4ODAKIC8qIFRMUCBjb25maWd1cmF0aW9uIHR5cGUgMCBhbmQgMSAqLwogI2RlZmluZSBUTFBfRk1UVFlQRV9DRkdSRDAJCTB4MDQJLyogQ29uZmlndXJhdGlvbiBSZWFkIFR5cGUgMCAqLwogI2RlZmluZSBUTFBfRk1UVFlQRV9DRkdXUjAJCTB4NDQJLyogQ29uZmlndXJhdGlvbiBXcml0ZSBUeXBlIDAgKi8KQEAgLTYxLDcgKzY1LDggQEAKICNkZWZpbmUgVExQX0xPT1AJCQk1MDAKICNkZWZpbmUgUlBfREVWRk4JCQkwCiAKLSNkZWZpbmUgTElOS19VUF9USU1FT1VUCQkJNTAwMAorI2RlZmluZSBMSU5LX1VQX1RJTUVPVVQJCQlIWgorI2RlZmluZSBMSU5LX1JFVFJBSU5fVElNRU9VVAkJSFoKIAogI2RlZmluZSBJTlRYX05VTQkJCTQKIApAQCAtOTksMzggKzEwNCw2IEBACiAJcmV0dXJuICEhKChjcmFfcmVhZGwocGNpZSwgUlBfTFRTU00pICYgUlBfTFRTU01fTUFTSykgPT0gTFRTU01fTDApOwogfQogCi1zdGF0aWMgdm9pZCBhbHRlcmFfcGNpZV9yZXRyYWluKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JdTE2IGxpbmtjYXAsIGxpbmtzdGF0OwotCXN0cnVjdCBhbHRlcmFfcGNpZSAqcGNpZSA9IGRldi0+YnVzLT5zeXNkYXRhOwotCWludCB0aW1lb3V0ID0gIDA7Ci0KLQlpZiAoIWFsdGVyYV9wY2llX2xpbmtfaXNfdXAocGNpZSkpCi0JCXJldHVybjsKLQotCS8qCi0JICogU2V0IHRoZSByZXRyYWluIGJpdCBpZiB0aGUgUENJZSByb290cG9ydCBzdXBwb3J0ID4gMi41R0IvcywgYnV0Ci0JICogY3VycmVudCBzcGVlZCBpcyAyLjUgR0Ivcy4KLQkgKi8KLQlwY2llX2NhcGFiaWxpdHlfcmVhZF93b3JkKGRldiwgUENJX0VYUF9MTktDQVAsICZsaW5rY2FwKTsKLQotCWlmICgobGlua2NhcCAmIFBDSV9FWFBfTE5LQ0FQX1NMUykgPD0gUENJX0VYUF9MTktDQVBfU0xTXzJfNUdCKQotCQlyZXR1cm47Ci0KLQlwY2llX2NhcGFiaWxpdHlfcmVhZF93b3JkKGRldiwgUENJX0VYUF9MTktTVEEsICZsaW5rc3RhdCk7Ci0JaWYgKChsaW5rc3RhdCAmIFBDSV9FWFBfTE5LU1RBX0NMUykgPT0gUENJX0VYUF9MTktTVEFfQ0xTXzJfNUdCKSB7Ci0JCXBjaWVfY2FwYWJpbGl0eV9zZXRfd29yZChkZXYsIFBDSV9FWFBfTE5LQ1RMLAotCQkJCQkgUENJX0VYUF9MTktDVExfUkwpOwotCQl3aGlsZSAoIWFsdGVyYV9wY2llX2xpbmtfaXNfdXAocGNpZSkpIHsKLQkJCXRpbWVvdXQrKzsKLQkJCWlmICh0aW1lb3V0ID4gTElOS19VUF9USU1FT1VUKQotCQkJCWJyZWFrOwotCQkJdWRlbGF5KDUpOwotCQl9Ci0JfQotfQotREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoMHgxMTcyLCBQQ0lfQU5ZX0lELCBhbHRlcmFfcGNpZV9yZXRyYWluKTsKLQogLyoKICAqIEFsdGVyYSBQQ0llIHBvcnQgdXNlcyBCQVIwIG9mIFJDJ3MgY29uZmlndXJhdGlvbiBzcGFjZSBhcyB0aGUgdHJhbnNsYXRpb24KICAqIGZyb20gUENJIGJ1cyB0byBuYXRpdmUgQlVTLiAgRW50aXJlIEREUiByZWdpb24gaXMgbWFwcGVkIGludG8gUENJZSBzcGFjZQpAQCAtMTcxLDEzICsxNDQsNiBAQAogCWlmIChidXMtPm51bWJlciA9PSBwY2llLT5yb290X2J1c19uciAmJiBkZXYgPiAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQkvKgotCSAqIERvIG5vdCByZWFkIG1vcmUgdGhhbiBvbmUgZGV2aWNlIG9uIHRoZSBidXMgZGlyZWN0bHkgYXR0YWNoZWQKLQkgKiB0byByb290IHBvcnQsIHJvb3QgcG9ydCBjYW4gb25seSBhdHRhY2ggdG8gb25lIGRvd25zdHJlYW0gcG9ydC4KLQkgKi8KLQlpZiAoYnVzLT5wcmltYXJ5ID09IHBjaWUtPnJvb3RfYnVzX25yICYmIGRldiA+IDApCi0JCXJldHVybiBmYWxzZTsKLQogCSByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMzAxLDIyICsyNjcsMTQgQEAKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1zdGF0aWMgaW50IGFsdGVyYV9wY2llX2NmZ19yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJCQlpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbHVlKQorc3RhdGljIGludCBfYWx0ZXJhX3BjaWVfY2ZnX3JlYWQoc3RydWN0IGFsdGVyYV9wY2llICpwY2llLCB1OCBidXNubywKKwkJCQkgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIGludCBzaXplLAorCQkJCSB1MzIgKnZhbHVlKQogewotCXN0cnVjdCBhbHRlcmFfcGNpZSAqcGNpZSA9IGJ1cy0+c3lzZGF0YTsKIAlpbnQgcmV0OwogCXUzMiBkYXRhOwogCXU4IGJ5dGVfZW47CiAKLQlpZiAoYWx0ZXJhX3BjaWVfaGlkZV9yY19iYXIoYnVzLCBkZXZmbiwgd2hlcmUpKQotCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOwotCi0JaWYgKCFhbHRlcmFfcGNpZV92YWxpZF9jb25maWcocGNpZSwgYnVzLCBQQ0lfU0xPVChkZXZmbikpKSB7Ci0JCSp2YWx1ZSA9IDB4ZmZmZmZmZmY7Ci0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0JfQotCiAJc3dpdGNoIChzaXplKSB7CiAJY2FzZSAxOgogCQlieXRlX2VuID0gMSA8PCAod2hlcmUgJiAzKTsKQEAgLTMyOSw3ICsyODcsNyBAQAogCQlicmVhazsKIAl9CiAKLQlyZXQgPSB0bHBfY2ZnX2R3b3JkX3JlYWQocGNpZSwgYnVzLT5udW1iZXIsIGRldmZuLAorCXJldCA9IHRscF9jZmdfZHdvcmRfcmVhZChwY2llLCBidXNubywgZGV2Zm4sCiAJCQkJICh3aGVyZSAmIH5EV09SRF9NQVNLKSwgYnl0ZV9lbiwgJmRhdGEpOwogCWlmIChyZXQgIT0gUENJQklPU19TVUNDRVNTRlVMKQogCQlyZXR1cm4gcmV0OwpAQCAtMzQ5LDIwICszMDcsMTQgQEAKIAlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQogCi1zdGF0aWMgaW50IGFsdGVyYV9wY2llX2NmZ193cml0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCi0JCQkJIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWx1ZSkKK3N0YXRpYyBpbnQgX2FsdGVyYV9wY2llX2NmZ193cml0ZShzdHJ1Y3QgYWx0ZXJhX3BjaWUgKnBjaWUsIHU4IGJ1c25vLAorCQkJCSAgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIGludCBzaXplLAorCQkJCSAgdTMyIHZhbHVlKQogewotCXN0cnVjdCBhbHRlcmFfcGNpZSAqcGNpZSA9IGJ1cy0+c3lzZGF0YTsKIAl1MzIgZGF0YTMyOwogCXUzMiBzaGlmdCA9IDggKiAod2hlcmUgJiAzKTsKIAl1OCBieXRlX2VuOwogCi0JaWYgKGFsdGVyYV9wY2llX2hpZGVfcmNfYmFyKGJ1cywgZGV2Zm4sIHdoZXJlKSkKLQkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKLQotCWlmICghYWx0ZXJhX3BjaWVfdmFsaWRfY29uZmlnKHBjaWUsIGJ1cywgUENJX1NMT1QoZGV2Zm4pKSkKLQkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKLQogCXN3aXRjaCAoc2l6ZSkgewogCWNhc2UgMToKIAkJZGF0YTMyID0gKHZhbHVlICYgMHhmZikgPDwgc2hpZnQ7CkBAIC0zNzgsOCArMzMwLDQwIEBACiAJCWJyZWFrOwogCX0KIAotCXJldHVybiB0bHBfY2ZnX2R3b3JkX3dyaXRlKHBjaWUsIGJ1cy0+bnVtYmVyLCBkZXZmbiwKLQkJKHdoZXJlICYgfkRXT1JEX01BU0spLCBieXRlX2VuLCBkYXRhMzIpOworCXJldHVybiB0bHBfY2ZnX2R3b3JkX3dyaXRlKHBjaWUsIGJ1c25vLCBkZXZmbiwgKHdoZXJlICYgfkRXT1JEX01BU0spLAorCQkJCSAgIGJ5dGVfZW4sIGRhdGEzMik7Cit9CisKK3N0YXRpYyBpbnQgYWx0ZXJhX3BjaWVfY2ZnX3JlYWQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCWludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsdWUpCit7CisJc3RydWN0IGFsdGVyYV9wY2llICpwY2llID0gYnVzLT5zeXNkYXRhOworCisJaWYgKGFsdGVyYV9wY2llX2hpZGVfcmNfYmFyKGJ1cywgZGV2Zm4sIHdoZXJlKSkKKwkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKKworCWlmICghYWx0ZXJhX3BjaWVfdmFsaWRfY29uZmlnKHBjaWUsIGJ1cywgUENJX1NMT1QoZGV2Zm4pKSkgeworCQkqdmFsdWUgPSAweGZmZmZmZmZmOworCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCX0KKworCXJldHVybiBfYWx0ZXJhX3BjaWVfY2ZnX3JlYWQocGNpZSwgYnVzLT5udW1iZXIsIGRldmZuLCB3aGVyZSwgc2l6ZSwKKwkJCQkgICAgIHZhbHVlKTsKK30KKworc3RhdGljIGludCBhbHRlcmFfcGNpZV9jZmdfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAorCQkJCSBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsdWUpCit7CisJc3RydWN0IGFsdGVyYV9wY2llICpwY2llID0gYnVzLT5zeXNkYXRhOworCisJaWYgKGFsdGVyYV9wY2llX2hpZGVfcmNfYmFyKGJ1cywgZGV2Zm4sIHdoZXJlKSkKKwkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKKworCWlmICghYWx0ZXJhX3BjaWVfdmFsaWRfY29uZmlnKHBjaWUsIGJ1cywgUENJX1NMT1QoZGV2Zm4pKSkKKwkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKworCXJldHVybiBfYWx0ZXJhX3BjaWVfY2ZnX3dyaXRlKHBjaWUsIGJ1cy0+bnVtYmVyLCBkZXZmbiwgd2hlcmUsIHNpemUsCisJCQkJICAgICB2YWx1ZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX29wcyBhbHRlcmFfcGNpZV9vcHMgPSB7CkBAIC0zODcsNiArMzcxLDkwIEBACiAJLndyaXRlID0gYWx0ZXJhX3BjaWVfY2ZnX3dyaXRlLAogfTsKIAorc3RhdGljIGludCBhbHRlcmFfcmVhZF9jYXBfd29yZChzdHJ1Y3QgYWx0ZXJhX3BjaWUgKnBjaWUsIHU4IGJ1c25vLAorCQkJCXVuc2lnbmVkIGludCBkZXZmbiwgaW50IG9mZnNldCwgdTE2ICp2YWx1ZSkKK3sKKwl1MzIgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gX2FsdGVyYV9wY2llX2NmZ19yZWFkKHBjaWUsIGJ1c25vLCBkZXZmbiwKKwkJCQkgICAgUENJRV9DQVBfT0ZGU0VUICsgb2Zmc2V0LCBzaXplb2YoKnZhbHVlKSwKKwkJCQkgICAgJmRhdGEpOworCSp2YWx1ZSA9IGRhdGE7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbHRlcmFfd3JpdGVfY2FwX3dvcmQoc3RydWN0IGFsdGVyYV9wY2llICpwY2llLCB1OCBidXNubywKKwkJCQkgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgb2Zmc2V0LCB1MTYgdmFsdWUpCit7CisJcmV0dXJuIF9hbHRlcmFfcGNpZV9jZmdfd3JpdGUocGNpZSwgYnVzbm8sIGRldmZuLAorCQkJCSAgICAgIFBDSUVfQ0FQX09GRlNFVCArIG9mZnNldCwgc2l6ZW9mKHZhbHVlKSwKKwkJCQkgICAgICB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFsdGVyYV93YWl0X2xpbmtfcmV0cmFpbihzdHJ1Y3QgYWx0ZXJhX3BjaWUgKnBjaWUpCit7CisJdTE2IHJlZzE2OworCXVuc2lnbmVkIGxvbmcgc3RhcnRfamlmZmllczsKKworCS8qIFdhaXQgZm9yIGxpbmsgdHJhaW5pbmcgZW5kLiAqLworCXN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOworCWZvciAoOzspIHsKKwkJYWx0ZXJhX3JlYWRfY2FwX3dvcmQocGNpZSwgcGNpZS0+cm9vdF9idXNfbnIsIFJQX0RFVkZOLAorCQkJCSAgICAgUENJX0VYUF9MTktTVEEsICZyZWcxNik7CisJCWlmICghKHJlZzE2ICYgUENJX0VYUF9MTktTVEFfTFQpKQorCQkJYnJlYWs7CisKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgc3RhcnRfamlmZmllcyArIExJTktfUkVUUkFJTl9USU1FT1VUKSkgeworCQkJZGV2X2VycigmcGNpZS0+cGRldi0+ZGV2LCAibGluayByZXRyYWluIHRpbWVvdXRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMCk7CisJfQorCisJLyogV2FpdCBmb3IgbGluayBpcyB1cCAqLworCXN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOworCWZvciAoOzspIHsKKwkJaWYgKGFsdGVyYV9wY2llX2xpbmtfaXNfdXAocGNpZSkpCisJCQlicmVhazsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBzdGFydF9qaWZmaWVzICsgTElOS19VUF9USU1FT1VUKSkgeworCQkJZGV2X2VycigmcGNpZS0+cGRldi0+ZGV2LCAibGluayB1cCB0aW1lb3V0XG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXVkZWxheSgxMDApOworCX0KK30KKworc3RhdGljIHZvaWQgYWx0ZXJhX3BjaWVfcmV0cmFpbihzdHJ1Y3QgYWx0ZXJhX3BjaWUgKnBjaWUpCit7CisJdTE2IGxpbmtjYXAsIGxpbmtzdGF0LCBsaW5rY3RsOworCisJaWYgKCFhbHRlcmFfcGNpZV9saW5rX2lzX3VwKHBjaWUpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFNldCB0aGUgcmV0cmFpbiBiaXQgaWYgdGhlIFBDSWUgcm9vdHBvcnQgc3VwcG9ydCA+IDIuNUdCL3MsIGJ1dAorCSAqIGN1cnJlbnQgc3BlZWQgaXMgMi41IEdCL3MuCisJICovCisJYWx0ZXJhX3JlYWRfY2FwX3dvcmQocGNpZSwgcGNpZS0+cm9vdF9idXNfbnIsIFJQX0RFVkZOLCBQQ0lfRVhQX0xOS0NBUCwKKwkJCSAgICAgJmxpbmtjYXApOworCWlmICgobGlua2NhcCAmIFBDSV9FWFBfTE5LQ0FQX1NMUykgPD0gUENJX0VYUF9MTktDQVBfU0xTXzJfNUdCKQorCQlyZXR1cm47CisKKwlhbHRlcmFfcmVhZF9jYXBfd29yZChwY2llLCBwY2llLT5yb290X2J1c19uciwgUlBfREVWRk4sIFBDSV9FWFBfTE5LU1RBLAorCQkJICAgICAmbGlua3N0YXQpOworCWlmICgobGlua3N0YXQgJiBQQ0lfRVhQX0xOS1NUQV9DTFMpID09IFBDSV9FWFBfTE5LU1RBX0NMU18yXzVHQikgeworCQlhbHRlcmFfcmVhZF9jYXBfd29yZChwY2llLCBwY2llLT5yb290X2J1c19uciwgUlBfREVWRk4sCisJCQkJICAgICBQQ0lfRVhQX0xOS0NUTCwgJmxpbmtjdGwpOworCQlsaW5rY3RsIHw9IFBDSV9FWFBfTE5LQ1RMX1JMOworCQlhbHRlcmFfd3JpdGVfY2FwX3dvcmQocGNpZSwgcGNpZS0+cm9vdF9idXNfbnIsIFJQX0RFVkZOLAorCQkJCSAgICAgIFBDSV9FWFBfTE5LQ1RMLCBsaW5rY3RsKTsKKworCQlhbHRlcmFfd2FpdF9saW5rX3JldHJhaW4ocGNpZSk7CisJfQorfQorCiBzdGF0aWMgaW50IGFsdGVyYV9wY2llX2ludHhfbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGludCBpcnEsCiAJCQkJaXJxX2h3X251bWJlcl90IGh3aXJxKQogewpAQCAtNTA4LDYgKzU3NiwxMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBhbHRlcmFfcGNpZV9ob3N0X2luaXQoc3RydWN0IGFsdGVyYV9wY2llICpwY2llKQoreworCWFsdGVyYV9wY2llX3JldHJhaW4ocGNpZSk7Cit9CisKIHN0YXRpYyBpbnQgYWx0ZXJhX3BjaWVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgYWx0ZXJhX3BjaWUgKnBjaWU7CkBAIC01NDUsNiArNjE4LDcgQEAKIAljcmFfd3JpdGVsKHBjaWUsIFAyQV9JTlRfU1RTX0FMTCwgUDJBX0lOVF9TVEFUVVMpOwogCS8qIGVuYWJsZSBhbGwgaW50ZXJydXB0cyAqLwogCWNyYV93cml0ZWwocGNpZSwgUDJBX0lOVF9FTkFfQUxMLCBQMkFfSU5UX0VOQUJMRSk7CisJYWx0ZXJhX3BjaWVfaG9zdF9pbml0KHBjaWUpOwogCiAJYnVzID0gcGNpX3NjYW5fcm9vdF9idXMoJnBkZXYtPmRldiwgcGNpZS0+cm9vdF9idXNfbnIsICZhbHRlcmFfcGNpZV9vcHMsCiAJCQkJcGNpZSwgJnBjaWUtPnJlc291cmNlcyk7CkBAIC01NjgsNyArNjQyLDYgQEAKIAl7IC5jb21wYXRpYmxlID0gImFsdHIscGNpZS1yb290LXBvcnQtMS4wIiwgfSwKIAl7fSwKIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhbHRlcmFfcGNpZV9vZl9tYXRjaCk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFsdGVyYV9wY2llX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gYWx0ZXJhX3BjaWVfcHJvYmUsCkBAIC01ODMsOCArNjU2LDQgQEAKIHsKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbHRlcmFfcGNpZV9kcml2ZXIpOwogfQotbW9kdWxlX2luaXQoYWx0ZXJhX3BjaWVfaW5pdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkxleSBGb29uIFRhbiA8bGZ0YW5AYWx0ZXJhLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQWx0ZXJhIFBDSWUgaG9zdCBjb250cm9sbGVyIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworZGV2aWNlX2luaXRjYWxsKGFsdGVyYV9wY2llX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLWFydHBlYzYuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1hcnRwZWM2LmMKaW5kZXggMTZiYTcwYjcuLjM5YmYxYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1hcnRwZWM2LmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWFydHBlYzYuYwpAQCAtMTkxLDggKzE5MSw4IEBACiAJcmV0dXJuIGR3X2hhbmRsZV9tc2lfaXJxKHBwKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYXJ0cGVjNl9hZGRfcGNpZV9wb3J0KHN0cnVjdCBwY2llX3BvcnQgKnBwLAotCQkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBhcnRwZWM2X2FkZF9wY2llX3BvcnQoc3RydWN0IHBjaWVfcG9ydCAqcHAsCisJCQkJIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUtcGxhdC5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUtcGxhdC5jCmluZGV4IGM4MDc5ZGMuLjE3ZGEwMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLXBsYXQuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS1wbGF0LmMKQEAgLTEwMCw5ICsxMDAsNiBAQAogCXBwLT5kZXYgPSAmcGRldi0+ZGV2OwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlkd19wbGF0X3BjaWUtPm1lbV9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CiAJaWYgKElTX0VSUihkd19wbGF0X3BjaWUtPm1lbV9iYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoZHdfcGxhdF9wY2llLT5tZW1fYmFzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuYwppbmRleCAxMmFmY2UxLi43NGRhNzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGNpLmg+CkBAIC0yNiw3ICsyNSwxNyBAQAogCiAjaW5jbHVkZSAicGNpZS1kZXNpZ253YXJlLmgiCiAKLS8qIFN5bm9wc2lzIHNwZWNpZmljIFBDSUUgY29uZmlndXJhdGlvbiByZWdpc3RlcnMgKi8KKy8qIFBhcmFtZXRlcnMgZm9yIHRoZSB3YWl0aW5nIGZvciBsaW5rIHVwIHJvdXRpbmUgKi8KKyNkZWZpbmUgTElOS19XQUlUX01BWF9SRVRSSUVTCQkxMAorI2RlZmluZSBMSU5LX1dBSVRfVVNMRUVQX01JTgkJOTAwMDAKKyNkZWZpbmUgTElOS19XQUlUX1VTTEVFUF9NQVgJCTEwMDAwMAorCisvKiBQYXJhbWV0ZXJzIGZvciB0aGUgd2FpdGluZyBmb3IgaUFUVSBlbmFibGVkIHJvdXRpbmUgKi8KKyNkZWZpbmUgTElOS19XQUlUX01BWF9JQVRVX1JFVFJJRVMJNQorI2RlZmluZSBMSU5LX1dBSVRfSUFUVV9NSU4JCTkwMDAKKyNkZWZpbmUgTElOS19XQUlUX0lBVFVfTUFYCQkxMDAwMAorCisvKiBTeW5vcHN5cy1zcGVjaWZpYyBQQ0llIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCiAjZGVmaW5lIFBDSUVfUE9SVF9MSU5LX0NPTlRST0wJCTB4NzEwCiAjZGVmaW5lIFBPUlRfTElOS19NT0RFX01BU0sJCSgweDNmIDw8IDE2KQogI2RlZmluZSBQT1JUX0xJTktfTU9ERV8xX0xBTkVTCQkoMHgxIDw8IDE2KQpAQCAtNTEsNiArNjAsNyBAQAogI2RlZmluZSBQQ0lFX0FUVV9WSUVXUE9SVAkJMHg5MDAKICNkZWZpbmUgUENJRV9BVFVfUkVHSU9OX0lOQk9VTkQJCSgweDEgPDwgMzEpCiAjZGVmaW5lIFBDSUVfQVRVX1JFR0lPTl9PVVRCT1VORAkoMHgwIDw8IDMxKQorI2RlZmluZSBQQ0lFX0FUVV9SRUdJT05fSU5ERVgyCQkoMHgyIDw8IDApCiAjZGVmaW5lIFBDSUVfQVRVX1JFR0lPTl9JTkRFWDEJCSgweDEgPDwgMCkKICNkZWZpbmUgUENJRV9BVFVfUkVHSU9OX0lOREVYMAkJKDB4MCA8PCAwKQogI2RlZmluZSBQQ0lFX0FUVV9DUjEJCQkweDkwNApAQCAtNzAsMTAgKzgwLDI2IEBACiAjZGVmaW5lIFBDSUVfQVRVX0ZVTkMoeCkJCSgoKHgpICYgMHg3KSA8PCAxNikKICNkZWZpbmUgUENJRV9BVFVfVVBQRVJfVEFSR0VUCQkweDkxQwogCisvKgorICogaUFUVSBVbnJvbGwtc3BlY2lmaWMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqIEZyb20gNC44MCBjb3JlIHZlcnNpb24gdGhlIGFkZHJlc3MgdHJhbnNsYXRpb24gd2lsbCBiZSBtYWRlIGJ5IHVucm9sbAorICovCisjZGVmaW5lIFBDSUVfQVRVX1VOUl9SRUdJT05fQ1RSTDEJMHgwMAorI2RlZmluZSBQQ0lFX0FUVV9VTlJfUkVHSU9OX0NUUkwyCTB4MDQKKyNkZWZpbmUgUENJRV9BVFVfVU5SX0xPV0VSX0JBU0UJCTB4MDgKKyNkZWZpbmUgUENJRV9BVFVfVU5SX1VQUEVSX0JBU0UJCTB4MEMKKyNkZWZpbmUgUENJRV9BVFVfVU5SX0xJTUlUCQkweDEwCisjZGVmaW5lIFBDSUVfQVRVX1VOUl9MT1dFUl9UQVJHRVQJMHgxNAorI2RlZmluZSBQQ0lFX0FUVV9VTlJfVVBQRVJfVEFSR0VUCTB4MTgKKworLyogUmVnaXN0ZXIgYWRkcmVzcyBidWlsZGVyICovCisjZGVmaW5lIFBDSUVfR0VUX0FUVV9PVVRCX1VOUl9SRUdfT0ZGU0VUKHJlZ2lvbikgICgoMHgzIDw8IDIwKSB8IChyZWdpb24gPDwgOSkpCisKIC8qIFBDSWUgUG9ydCBMb2dpYyByZWdpc3RlcnMgKi8KICNkZWZpbmUgUExSX09GRlNFVAkJCTB4NzAwCiAjZGVmaW5lIFBDSUVfUEhZX0RFQlVHX1IxCQkoUExSX09GRlNFVCArIDB4MmMpCi0jZGVmaW5lIFBDSUVfUEhZX0RFQlVHX1IxX0xJTktfVVAJMHgwMDAwMDAxMAorI2RlZmluZSBQQ0lFX1BIWV9ERUJVR19SMV9MSU5LX1VQCSgweDEgPDwgNCkKKyNkZWZpbmUgUENJRV9QSFlfREVCVUdfUjFfTElOS19JTl9UUkFJTklORwkoMHgxIDw8IDI5KQogCiBzdGF0aWMgc3RydWN0IHBjaV9vcHMgZHdfcGNpZV9vcHM7CiAKQEAgLTExNSwxMiArMTQxLDEyIEBACiAJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGR3X3BjaWVfcmVhZGxfcmMoc3RydWN0IHBjaWVfcG9ydCAqcHAsIHUzMiByZWcsIHUzMiAqdmFsKQorc3RhdGljIGlubGluZSB1MzIgZHdfcGNpZV9yZWFkbF9yYyhzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwgdTMyIHJlZykKIHsKIAlpZiAocHAtPm9wcy0+cmVhZGxfcmMpCi0JCXBwLT5vcHMtPnJlYWRsX3JjKHBwLCBwcC0+ZGJpX2Jhc2UgKyByZWcsIHZhbCk7Ci0JZWxzZQotCQkqdmFsID0gcmVhZGwocHAtPmRiaV9iYXNlICsgcmVnKTsKKwkJcmV0dXJuIHBwLT5vcHMtPnJlYWRsX3JjKHBwLCBwcC0+ZGJpX2Jhc2UgKyByZWcpOworCisJcmV0dXJuIHJlYWRsKHBwLT5kYmlfYmFzZSArIHJlZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkd19wY2llX3dyaXRlbF9yYyhzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwgdTMyIHZhbCwgdTMyIHJlZykKQEAgLTEzMSw2ICsxNTcsMjcgQEAKIAkJd3JpdGVsKHZhbCwgcHAtPmRiaV9iYXNlICsgcmVnKTsKIH0KIAorc3RhdGljIGlubGluZSB1MzIgZHdfcGNpZV9yZWFkbF91bnJvbGwoc3RydWN0IHBjaWVfcG9ydCAqcHAsIHUzMiBpbmRleCwgdTMyIHJlZykKK3sKKwl1MzIgb2Zmc2V0ID0gUENJRV9HRVRfQVRVX09VVEJfVU5SX1JFR19PRkZTRVQoaW5kZXgpOworCisJaWYgKHBwLT5vcHMtPnJlYWRsX3JjKQorCQlyZXR1cm4gcHAtPm9wcy0+cmVhZGxfcmMocHAsIHBwLT5kYmlfYmFzZSArIG9mZnNldCArIHJlZyk7CisKKwlyZXR1cm4gcmVhZGwocHAtPmRiaV9iYXNlICsgb2Zmc2V0ICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR3X3BjaWVfd3JpdGVsX3Vucm9sbChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwgdTMyIGluZGV4LAorCQkJCQkgdTMyIHZhbCwgdTMyIHJlZykKK3sKKwl1MzIgb2Zmc2V0ID0gUENJRV9HRVRfQVRVX09VVEJfVU5SX1JFR19PRkZTRVQoaW5kZXgpOworCisJaWYgKHBwLT5vcHMtPndyaXRlbF9yYykKKwkJcHAtPm9wcy0+d3JpdGVsX3JjKHBwLCB2YWwsIHBwLT5kYmlfYmFzZSArIG9mZnNldCArIHJlZyk7CisJZWxzZQorCQl3cml0ZWwodmFsLCBwcC0+ZGJpX2Jhc2UgKyBvZmZzZXQgKyByZWcpOworfQorCiBzdGF0aWMgaW50IGR3X3BjaWVfcmRfb3duX2NvbmYoc3RydWN0IHBjaWVfcG9ydCAqcHAsIGludCB3aGVyZSwgaW50IHNpemUsCiAJCQkgICAgICAgdTMyICp2YWwpCiB7CkBAIC0xNTIsMjQgKzE5OSw1NyBAQAogc3RhdGljIHZvaWQgZHdfcGNpZV9wcm9nX291dGJvdW5kX2F0dShzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwgaW50IGluZGV4LAogCQlpbnQgdHlwZSwgdTY0IGNwdV9hZGRyLCB1NjQgcGNpX2FkZHIsIHUzMiBzaXplKQogewotCXUzMiB2YWw7CisJdTMyIHJldHJpZXMsIHZhbDsKIAotCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCBQQ0lFX0FUVV9SRUdJT05fT1VUQk9VTkQgfCBpbmRleCwKLQkJCSAgUENJRV9BVFVfVklFV1BPUlQpOwotCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCBsb3dlcl8zMl9iaXRzKGNwdV9hZGRyKSwgUENJRV9BVFVfTE9XRVJfQkFTRSk7Ci0JZHdfcGNpZV93cml0ZWxfcmMocHAsIHVwcGVyXzMyX2JpdHMoY3B1X2FkZHIpLCBQQ0lFX0FUVV9VUFBFUl9CQVNFKTsKLQlkd19wY2llX3dyaXRlbF9yYyhwcCwgbG93ZXJfMzJfYml0cyhjcHVfYWRkciArIHNpemUgLSAxKSwKLQkJCSAgUENJRV9BVFVfTElNSVQpOwotCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCBsb3dlcl8zMl9iaXRzKHBjaV9hZGRyKSwgUENJRV9BVFVfTE9XRVJfVEFSR0VUKTsKLQlkd19wY2llX3dyaXRlbF9yYyhwcCwgdXBwZXJfMzJfYml0cyhwY2lfYWRkciksIFBDSUVfQVRVX1VQUEVSX1RBUkdFVCk7Ci0JZHdfcGNpZV93cml0ZWxfcmMocHAsIHR5cGUsIFBDSUVfQVRVX0NSMSk7Ci0JZHdfcGNpZV93cml0ZWxfcmMocHAsIFBDSUVfQVRVX0VOQUJMRSwgUENJRV9BVFVfQ1IyKTsKKwlpZiAocHAtPmlhdHVfdW5yb2xsX2VuYWJsZWQpIHsKKwkJZHdfcGNpZV93cml0ZWxfdW5yb2xsKHBwLCBpbmRleCwKKwkJCWxvd2VyXzMyX2JpdHMoY3B1X2FkZHIpLCBQQ0lFX0FUVV9VTlJfTE9XRVJfQkFTRSk7CisJCWR3X3BjaWVfd3JpdGVsX3Vucm9sbChwcCwgaW5kZXgsCisJCQl1cHBlcl8zMl9iaXRzKGNwdV9hZGRyKSwgUENJRV9BVFVfVU5SX1VQUEVSX0JBU0UpOworCQlkd19wY2llX3dyaXRlbF91bnJvbGwocHAsIGluZGV4LAorCQkJbG93ZXJfMzJfYml0cyhjcHVfYWRkciArIHNpemUgLSAxKSwgUENJRV9BVFVfVU5SX0xJTUlUKTsKKwkJZHdfcGNpZV93cml0ZWxfdW5yb2xsKHBwLCBpbmRleCwKKwkJCWxvd2VyXzMyX2JpdHMocGNpX2FkZHIpLCBQQ0lFX0FUVV9VTlJfTE9XRVJfVEFSR0VUKTsKKwkJZHdfcGNpZV93cml0ZWxfdW5yb2xsKHBwLCBpbmRleCwKKwkJCXVwcGVyXzMyX2JpdHMocGNpX2FkZHIpLCBQQ0lFX0FUVV9VTlJfVVBQRVJfVEFSR0VUKTsKKwkJZHdfcGNpZV93cml0ZWxfdW5yb2xsKHBwLCBpbmRleCwKKwkJCXR5cGUsIFBDSUVfQVRVX1VOUl9SRUdJT05fQ1RSTDEpOworCQlkd19wY2llX3dyaXRlbF91bnJvbGwocHAsIGluZGV4LAorCQkJUENJRV9BVFVfRU5BQkxFLCBQQ0lFX0FUVV9VTlJfUkVHSU9OX0NUUkwyKTsKKwl9IGVsc2UgeworCQlkd19wY2llX3dyaXRlbF9yYyhwcCwgUENJRV9BVFVfUkVHSU9OX09VVEJPVU5EIHwgaW5kZXgsCisJCQkJCQlQQ0lFX0FUVV9WSUVXUE9SVCk7CisJCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCBsb3dlcl8zMl9iaXRzKGNwdV9hZGRyKSwKKwkJCQkJCVBDSUVfQVRVX0xPV0VSX0JBU0UpOworCQlkd19wY2llX3dyaXRlbF9yYyhwcCwgdXBwZXJfMzJfYml0cyhjcHVfYWRkciksCisJCQkJCQlQQ0lFX0FUVV9VUFBFUl9CQVNFKTsKKwkJZHdfcGNpZV93cml0ZWxfcmMocHAsIGxvd2VyXzMyX2JpdHMoY3B1X2FkZHIgKyBzaXplIC0gMSksCisJCQkJCQlQQ0lFX0FUVV9MSU1JVCk7CisJCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCBsb3dlcl8zMl9iaXRzKHBjaV9hZGRyKSwKKwkJCQkJCVBDSUVfQVRVX0xPV0VSX1RBUkdFVCk7CisJCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCB1cHBlcl8zMl9iaXRzKHBjaV9hZGRyKSwKKwkJCQkJCVBDSUVfQVRVX1VQUEVSX1RBUkdFVCk7CisJCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCB0eXBlLCBQQ0lFX0FUVV9DUjEpOworCQlkd19wY2llX3dyaXRlbF9yYyhwcCwgUENJRV9BVFVfRU5BQkxFLCBQQ0lFX0FUVV9DUjIpOworCX0KIAogCS8qCiAJICogTWFrZSBzdXJlIEFUVSBlbmFibGUgdGFrZXMgZWZmZWN0IGJlZm9yZSBhbnkgc3Vic2VxdWVudCBjb25maWcKIAkgKiBhbmQgSS9PIGFjY2Vzc2VzLgogCSAqLwotCWR3X3BjaWVfcmVhZGxfcmMocHAsIFBDSUVfQVRVX0NSMiwgJnZhbCk7CisJZm9yIChyZXRyaWVzID0gMDsgcmV0cmllcyA8IExJTktfV0FJVF9NQVhfSUFUVV9SRVRSSUVTOyByZXRyaWVzKyspIHsKKwkJaWYgKHBwLT5pYXR1X3Vucm9sbF9lbmFibGVkKQorCQkJdmFsID0gZHdfcGNpZV9yZWFkbF91bnJvbGwocHAsIGluZGV4LAorCQkJCQkJICAgUENJRV9BVFVfVU5SX1JFR0lPTl9DVFJMMik7CisJCWVsc2UKKwkJCXZhbCA9IGR3X3BjaWVfcmVhZGxfcmMocHAsIFBDSUVfQVRVX0NSMik7CisKKwkJaWYgKHZhbCA9PSBQQ0lFX0FUVV9FTkFCTEUpCisJCQlyZXR1cm47CisKKwkJdXNsZWVwX3JhbmdlKExJTktfV0FJVF9JQVRVX01JTiwgTElOS19XQUlUX0lBVFVfTUFYKTsKKwl9CisJZGV2X2VycihwcC0+ZGV2LCAiaUFUVSBpcyBub3QgYmVpbmcgZW5hYmxlZFxuIik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgZHdfbXNpX2lycV9jaGlwID0gewpAQCAtNDEyLDcgKzQ5Miw4IEBACiAJCXJldHVybiBwcC0+b3BzLT5saW5rX3VwKHBwKTsKIAogCXZhbCA9IHJlYWRsKHBwLT5kYmlfYmFzZSArIFBDSUVfUEhZX0RFQlVHX1IxKTsKLQlyZXR1cm4gdmFsICYgUENJRV9QSFlfREVCVUdfUjFfTElOS19VUDsKKwlyZXR1cm4gKCh2YWwgJiBQQ0lFX1BIWV9ERUJVR19SMV9MSU5LX1VQKSAmJgorCQkoISh2YWwgJiBQQ0lFX1BIWV9ERUJVR19SMV9MSU5LX0lOX1RSQUlOSU5HKSkpOwogfQogCiBzdGF0aWMgaW50IGR3X3BjaWVfbXNpX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBpbnQgaXJxLApAQCAtNDI4LDYgKzUwOSwxNyBAQAogCS5tYXAgPSBkd19wY2llX21zaV9tYXAsCiB9OwogCitzdGF0aWMgdTggZHdfcGNpZV9pYXR1X3Vucm9sbF9lbmFibGVkKHN0cnVjdCBwY2llX3BvcnQgKnBwKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBkd19wY2llX3JlYWRsX3JjKHBwLCBQQ0lFX0FUVV9WSUVXUE9SVCk7CisJaWYgKHZhbCA9PSAweGZmZmZmZmZmKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCiBpbnQgZHdfcGNpZV9ob3N0X2luaXQoc3RydWN0IHBjaWVfcG9ydCAqcHApCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBwLT5kZXYtPm9mX25vZGU7CkBAIC00MzYsNyArNTI4LDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKmNmZ19yZXM7CiAJaW50IGksIHJldDsKIAlMSVNUX0hFQUQocmVzKTsKLQlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKndpbjsKKwlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKndpbiwgKnRtcDsKIAogCWNmZ19yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiY29uZmlnIik7CiAJaWYgKGNmZ19yZXMpIHsKQEAgLTQ1NywxNyArNTQ5LDIwIEBACiAJCWdvdG8gZXJyb3I7CiAKIAkvKiBHZXQgdGhlIEkvTyBhbmQgbWVtb3J5IHJhbmdlcyBmcm9tIERUICovCi0JcmVzb3VyY2VfbGlzdF9mb3JfZWFjaF9lbnRyeSh3aW4sICZyZXMpIHsKKwlyZXNvdXJjZV9saXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2luLCB0bXAsICZyZXMpIHsKIAkJc3dpdGNoIChyZXNvdXJjZV90eXBlKHdpbi0+cmVzKSkgewogCQljYXNlIElPUkVTT1VSQ0VfSU86Ci0JCQlwcC0+aW8gPSB3aW4tPnJlczsKLQkJCXBwLT5pby0+bmFtZSA9ICJJL08iOwotCQkJcHAtPmlvX3NpemUgPSByZXNvdXJjZV9zaXplKHBwLT5pbyk7Ci0JCQlwcC0+aW9fYnVzX2FkZHIgPSBwcC0+aW8tPnN0YXJ0IC0gd2luLT5vZmZzZXQ7Ci0JCQlyZXQgPSBwY2lfcmVtYXBfaW9zcGFjZShwcC0+aW8sIHBwLT5pb19iYXNlKTsKLQkJCWlmIChyZXQpCisJCQlyZXQgPSBwY2lfcmVtYXBfaW9zcGFjZSh3aW4tPnJlcywgcHAtPmlvX2Jhc2UpOworCQkJaWYgKHJldCkgewogCQkJCWRldl93YXJuKHBwLT5kZXYsICJlcnJvciAlZDogZmFpbGVkIHRvIG1hcCByZXNvdXJjZSAlcFJcbiIsCi0JCQkJCSByZXQsIHBwLT5pbyk7CisJCQkJCSByZXQsIHdpbi0+cmVzKTsKKwkJCQlyZXNvdXJjZV9saXN0X2Rlc3Ryb3lfZW50cnkod2luKTsKKwkJCX0gZWxzZSB7CisJCQkJcHAtPmlvID0gd2luLT5yZXM7CisJCQkJcHAtPmlvLT5uYW1lID0gIkkvTyI7CisJCQkJcHAtPmlvX3NpemUgPSByZXNvdXJjZV9zaXplKHBwLT5pbyk7CisJCQkJcHAtPmlvX2J1c19hZGRyID0gcHAtPmlvLT5zdGFydCAtIHdpbi0+b2Zmc2V0OworCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgSU9SRVNPVVJDRV9NRU06CiAJCQlwcC0+bWVtID0gd2luLT5yZXM7CkBAIC01MjQsNiArNjE5LDEwIEBACiAJaWYgKHJldCkKIAkJcHAtPmxhbmVzID0gMDsKIAorCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibnVtLXZpZXdwb3J0IiwgJnBwLT5udW1fdmlld3BvcnQpOworCWlmIChyZXQpCisJCXBwLT5udW1fdmlld3BvcnQgPSAyOworCiAJaWYgKElTX0VOQUJMRUQoQ09ORklHX1BDSV9NU0kpKSB7CiAJCWlmICghcHAtPm9wcy0+bXNpX2hvc3RfaW5pdCkgewogCQkJcHAtPmlycV9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIocHAtPmRldi0+b2Zfbm9kZSwKQEAgLTU0NCw2ICs2NDMsOCBAQAogCQl9CiAJfQogCisJcHAtPmlhdHVfdW5yb2xsX2VuYWJsZWQgPSBkd19wY2llX2lhdHVfdW5yb2xsX2VuYWJsZWQocHApOworCiAJaWYgKHBwLT5vcHMtPmhvc3RfaW5pdCkKIAkJcHAtPm9wcy0+aG9zdF9pbml0KHBwKTsKIApAQCAtNjA5LDEzICs3MTAsMTQgQEAKIAkJdmFfY2ZnX2Jhc2UgPSBwcC0+dmFfY2ZnMV9iYXNlOwogCX0KIAotCWR3X3BjaWVfcHJvZ19vdXRib3VuZF9hdHUocHAsIFBDSUVfQVRVX1JFR0lPTl9JTkRFWDAsCisJZHdfcGNpZV9wcm9nX291dGJvdW5kX2F0dShwcCwgUENJRV9BVFVfUkVHSU9OX0lOREVYMSwKIAkJCQkgIHR5cGUsIGNwdV9hZGRyLAogCQkJCSAgYnVzZGV2LCBjZmdfc2l6ZSk7CiAJcmV0ID0gZHdfcGNpZV9jZmdfcmVhZCh2YV9jZmdfYmFzZSArIHdoZXJlLCBzaXplLCB2YWwpOwotCWR3X3BjaWVfcHJvZ19vdXRib3VuZF9hdHUocHAsIFBDSUVfQVRVX1JFR0lPTl9JTkRFWDAsCi0JCQkJICBQQ0lFX0FUVV9UWVBFX0lPLCBwcC0+aW9fYmFzZSwKLQkJCQkgIHBwLT5pb19idXNfYWRkciwgcHAtPmlvX3NpemUpOworCWlmIChwcC0+bnVtX3ZpZXdwb3J0IDw9IDIpCisJCWR3X3BjaWVfcHJvZ19vdXRib3VuZF9hdHUocHAsIFBDSUVfQVRVX1JFR0lPTl9JTkRFWDEsCisJCQkJCSAgUENJRV9BVFVfVFlQRV9JTywgcHAtPmlvX2Jhc2UsCisJCQkJCSAgcHAtPmlvX2J1c19hZGRyLCBwcC0+aW9fc2l6ZSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjQ2LDEzICs3NDgsMTQgQEAKIAkJdmFfY2ZnX2Jhc2UgPSBwcC0+dmFfY2ZnMV9iYXNlOwogCX0KIAotCWR3X3BjaWVfcHJvZ19vdXRib3VuZF9hdHUocHAsIFBDSUVfQVRVX1JFR0lPTl9JTkRFWDAsCisJZHdfcGNpZV9wcm9nX291dGJvdW5kX2F0dShwcCwgUENJRV9BVFVfUkVHSU9OX0lOREVYMSwKIAkJCQkgIHR5cGUsIGNwdV9hZGRyLAogCQkJCSAgYnVzZGV2LCBjZmdfc2l6ZSk7CiAJcmV0ID0gZHdfcGNpZV9jZmdfd3JpdGUodmFfY2ZnX2Jhc2UgKyB3aGVyZSwgc2l6ZSwgdmFsKTsKLQlkd19wY2llX3Byb2dfb3V0Ym91bmRfYXR1KHBwLCBQQ0lFX0FUVV9SRUdJT05fSU5ERVgwLAotCQkJCSAgUENJRV9BVFVfVFlQRV9JTywgcHAtPmlvX2Jhc2UsCi0JCQkJICBwcC0+aW9fYnVzX2FkZHIsIHBwLT5pb19zaXplKTsKKwlpZiAocHAtPm51bV92aWV3cG9ydCA8PSAyKQorCQlkd19wY2llX3Byb2dfb3V0Ym91bmRfYXR1KHBwLCBQQ0lFX0FUVV9SRUdJT05fSU5ERVgxLAorCQkJCQkgIFBDSUVfQVRVX1RZUEVfSU8sIHBwLT5pb19iYXNlLAorCQkJCQkgIHBwLT5pb19idXNfYWRkciwgcHAtPmlvX3NpemUpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTY3MCwxMyArNzczLDYgQEAKIAlpZiAoYnVzLT5udW1iZXIgPT0gcHAtPnJvb3RfYnVzX25yICYmIGRldiA+IDApCiAJCXJldHVybiAwOwogCi0JLyoKLQkgKiBkbyBub3QgcmVhZCBtb3JlIHRoYW4gb25lIGRldmljZSBvbiB0aGUgYnVzIGRpcmVjdGx5IGF0dGFjaGVkCi0JICogdG8gUkMncyAoVmlydHVhbCBCcmlkZ2UncykgRFMgc2lkZS4KLQkgKi8KLQlpZiAoYnVzLT5wcmltYXJ5ID09IHBwLT5yb290X2J1c19uciAmJiBkZXYgPiAwKQotCQlyZXR1cm4gMDsKLQogCXJldHVybiAxOwogfQogCkBAIC03MjAsNyArODE2LDcgQEAKIAl1MzIgdmFsOwogCiAJLyogc2V0IHRoZSBudW1iZXIgb2YgbGFuZXMgKi8KLQlkd19wY2llX3JlYWRsX3JjKHBwLCBQQ0lFX1BPUlRfTElOS19DT05UUk9MLCAmdmFsKTsKKwl2YWwgPSBkd19wY2llX3JlYWRsX3JjKHBwLCBQQ0lFX1BPUlRfTElOS19DT05UUk9MKTsKIAl2YWwgJj0gflBPUlRfTElOS19NT0RFX01BU0s7CiAJc3dpdGNoIChwcC0+bGFuZXMpIHsKIAljYXNlIDE6CkBAIC03NDIsNyArODM4LDcgQEAKIAlkd19wY2llX3dyaXRlbF9yYyhwcCwgdmFsLCBQQ0lFX1BPUlRfTElOS19DT05UUk9MKTsKIAogCS8qIHNldCBsaW5rIHdpZHRoIHNwZWVkIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQlkd19wY2llX3JlYWRsX3JjKHBwLCBQQ0lFX0xJTktfV0lEVEhfU1BFRURfQ09OVFJPTCwgJnZhbCk7CisJdmFsID0gZHdfcGNpZV9yZWFkbF9yYyhwcCwgUENJRV9MSU5LX1dJRFRIX1NQRUVEX0NPTlRST0wpOwogCXZhbCAmPSB+UE9SVF9MT0dJQ19MSU5LX1dJRFRIX01BU0s7CiAJc3dpdGNoIChwcC0+bGFuZXMpIHsKIAljYXNlIDE6CkBAIC03NjUsMTkgKzg2MSwxOSBAQAogCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCAweDAwMDAwMDAwLCBQQ0lfQkFTRV9BRERSRVNTXzEpOwogCiAJLyogc2V0dXAgaW50ZXJydXB0IHBpbnMgKi8KLQlkd19wY2llX3JlYWRsX3JjKHBwLCBQQ0lfSU5URVJSVVBUX0xJTkUsICZ2YWwpOworCXZhbCA9IGR3X3BjaWVfcmVhZGxfcmMocHAsIFBDSV9JTlRFUlJVUFRfTElORSk7CiAJdmFsICY9IDB4ZmZmZjAwZmY7CiAJdmFsIHw9IDB4MDAwMDAxMDA7CiAJZHdfcGNpZV93cml0ZWxfcmMocHAsIHZhbCwgUENJX0lOVEVSUlVQVF9MSU5FKTsKIAogCS8qIHNldHVwIGJ1cyBudW1iZXJzICovCi0JZHdfcGNpZV9yZWFkbF9yYyhwcCwgUENJX1BSSU1BUllfQlVTLCAmdmFsKTsKKwl2YWwgPSBkd19wY2llX3JlYWRsX3JjKHBwLCBQQ0lfUFJJTUFSWV9CVVMpOwogCXZhbCAmPSAweGZmMDAwMDAwOwogCXZhbCB8PSAweDAwMDEwMTAwOwogCWR3X3BjaWVfd3JpdGVsX3JjKHBwLCB2YWwsIFBDSV9QUklNQVJZX0JVUyk7CiAKIAkvKiBzZXR1cCBjb21tYW5kIHJlZ2lzdGVyICovCi0JZHdfcGNpZV9yZWFkbF9yYyhwcCwgUENJX0NPTU1BTkQsICZ2YWwpOworCXZhbCA9IGR3X3BjaWVfcmVhZGxfcmMocHAsIFBDSV9DT01NQU5EKTsKIAl2YWwgJj0gMHhmZmZmMDAwMDsKIAl2YWwgfD0gUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1PUlkgfAogCQlQQ0lfQ09NTUFORF9NQVNURVIgfCBQQ0lfQ09NTUFORF9TRVJSOwpAQCAtNzg4LDEwICs4ODQsMTUgQEAKIAkgKiB1c2VzIGl0cyBvd24gYWRkcmVzcyB0cmFuc2xhdGlvbiBjb21wb25lbnQgcmF0aGVyIHRoYW4gQVRVLCBzbwogCSAqIHdlIHNob3VsZCBub3QgcHJvZ3JhbSB0aGUgQVRVIGhlcmUuCiAJICovCi0JaWYgKCFwcC0+b3BzLT5yZF9vdGhlcl9jb25mKQotCQlkd19wY2llX3Byb2dfb3V0Ym91bmRfYXR1KHBwLCBQQ0lFX0FUVV9SRUdJT05fSU5ERVgxLAorCWlmICghcHAtPm9wcy0+cmRfb3RoZXJfY29uZikgeworCQlkd19wY2llX3Byb2dfb3V0Ym91bmRfYXR1KHBwLCBQQ0lFX0FUVV9SRUdJT05fSU5ERVgwLAogCQkJCQkgIFBDSUVfQVRVX1RZUEVfTUVNLCBwcC0+bWVtX2Jhc2UsCiAJCQkJCSAgcHAtPm1lbV9idXNfYWRkciwgcHAtPm1lbV9zaXplKTsKKwkJaWYgKHBwLT5udW1fdmlld3BvcnQgPiAyKQorCQkJZHdfcGNpZV9wcm9nX291dGJvdW5kX2F0dShwcCwgUENJRV9BVFVfUkVHSU9OX0lOREVYMiwKKwkJCQkJCSAgUENJRV9BVFVfVFlQRV9JTywgcHAtPmlvX2Jhc2UsCisJCQkJCQkgIHBwLT5pb19idXNfYWRkciwgcHAtPmlvX3NpemUpOworCX0KIAogCWR3X3BjaWVfd3Jfb3duX2NvbmYocHAsIFBDSV9CQVNFX0FERFJFU1NfMCwgNCwgMCk7CiAKQEAgLTgwMiw3ICs5MDMsMyBAQAogCXZhbCB8PSBQT1JUX0xPR0lDX1NQRUVEX0NIQU5HRTsKIAlkd19wY2llX3dyX293bl9jb25mKHBwLCBQQ0lFX0xJTktfV0lEVEhfU1BFRURfQ09OVFJPTCwgNCwgdmFsKTsKIH0KLQotTU9EVUxFX0FVVEhPUigiSmluZ29vIEhhbiA8amcxLmhhbkBzYW1zdW5nLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRGVzaWdud2FyZSBQQ0llIGhvc3QgY29udHJvbGxlciBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLmggYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS5oCmluZGV4IGY0MzdmOWIuLmM4ZTViYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLmgKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuaApAQCAtMjIsMTEgKzIyLDYgQEAKICNkZWZpbmUgTUFYX01TSV9JUlFTCQkJMzIKICNkZWZpbmUgTUFYX01TSV9DVFJMUwkJCShNQVhfTVNJX0lSUVMgLyAzMikKIAotLyogUGFyYW1ldGVycyBmb3IgdGhlIHdhaXRpbmcgZm9yIGxpbmsgdXAgcm91dGluZSAqLwotI2RlZmluZSBMSU5LX1dBSVRfTUFYX1JFVFJJRVMJCTEwCi0jZGVmaW5lIExJTktfV0FJVF9VU0xFRVBfTUlOCQk5MDAwMAotI2RlZmluZSBMSU5LX1dBSVRfVVNMRUVQX01BWAkJMTAwMDAwCi0KIHN0cnVjdCBwY2llX3BvcnQgewogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJdTgJCQlyb290X2J1c19ucjsKQEAgLTQ5LDE2ICs0NCwxNyBAQAogCXN0cnVjdCByZXNvdXJjZQkJKmJ1c247CiAJaW50CQkJaXJxOwogCXUzMgkJCWxhbmVzOworCXUzMgkJCW51bV92aWV3cG9ydDsKIAlzdHJ1Y3QgcGNpZV9ob3N0X29wcwkqb3BzOwogCWludAkJCW1zaV9pcnE7CiAJc3RydWN0IGlycV9kb21haW4JKmlycV9kb21haW47CiAJdW5zaWduZWQgbG9uZwkJbXNpX2RhdGE7CisJdTgJCQlpYXR1X3Vucm9sbF9lbmFibGVkOwogCURFQ0xBUkVfQklUTUFQKG1zaV9pcnFfaW5fdXNlLCBNQVhfTVNJX0lSUVMpOwogfTsKIAogc3RydWN0IHBjaWVfaG9zdF9vcHMgewotCXZvaWQgKCpyZWFkbF9yYykoc3RydWN0IHBjaWVfcG9ydCAqcHAsCi0JCQl2b2lkIF9faW9tZW0gKmRiaV9iYXNlLCB1MzIgKnZhbCk7CisJdTMyICgqcmVhZGxfcmMpKHN0cnVjdCBwY2llX3BvcnQgKnBwLCB2b2lkIF9faW9tZW0gKmRiaV9iYXNlKTsKIAl2b2lkICgqd3JpdGVsX3JjKShzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwKIAkJCXUzMiB2YWwsIHZvaWQgX19pb21lbSAqZGJpX2Jhc2UpOwogCWludCAoKnJkX293bl9jb25mKShzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyICp2YWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLXFjb20uYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1xY29tLmMKaW5kZXggZjJmOTBjNS4uNWVjMmQ0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLXFjb20uYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtcWNvbS5jCkBAIC0xLDcgKzEsMTEgQEAKIC8qCisgKiBRdWFsY29tbSBQQ0llIHJvb3QgY29tcGxleCBkcml2ZXIKKyAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgMjAxNSBMaW5hcm8gTGltaXRlZC4KICAqCisgKiBBdXRob3I6IFN0YW5pbWlyIFZhcmJhbm92IDxzdmFyYmFub3ZAbW0tc29sLmNvbT4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCiAgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQEAgLTE5LDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC01NzAsMzcgKzU3NCwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHFjb21fcGNpZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgcWNvbV9wY2llICpwY2llID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlxY29tX2VwX3Jlc2V0X2Fzc2VydChwY2llKTsKLQlwaHlfcG93ZXJfb2ZmKHBjaWUtPnBoeSk7Ci0JcGh5X2V4aXQocGNpZS0+cGh5KTsKLQlwY2llLT5vcHMtPmRlaW5pdChwY2llKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBxY29tX3BjaWVfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInFjb20scGNpZS1pcHE4MDY0IiwgLmRhdGEgPSAmb3BzX3YwIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBjaWUtYXBxODA2NCIsIC5kYXRhID0gJm9wc192MCB9LAogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwY2llLWFwcTgwODQiLCAuZGF0YSA9ICZvcHNfdjEgfSwKIAl7IH0KIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBxY29tX3BjaWVfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBxY29tX3BjaWVfZHJpdmVyID0gewogCS5wcm9iZSA9IHFjb21fcGNpZV9wcm9iZSwKLQkucmVtb3ZlID0gcWNvbV9wY2llX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJxY29tLXBjaWUiLAorCQkuc3VwcHJlc3NfYmluZF9hdHRycyA9IHRydWUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IHFjb21fcGNpZV9tYXRjaCwKIAl9LAogfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihxY29tX3BjaWVfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiU3RhbmltaXIgVmFyYmFub3YgPHN2YXJiYW5vdkBtbS1zb2wuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJRdWFsY29tbSBQQ0llIHJvb3QgY29tcGxleCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKHFjb21fcGNpZV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLXJjYXIuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1yY2FyLmMKaW5kZXggNjVkYjdhMi4uZTA2YjFkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLXJjYXIuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtcmNhci5jCkBAIC04NCw4ICs4NCwxOCBAQAogI2RlZmluZSBJRFNFVFIxCQkJMHgwMTEwMDQKICNkZWZpbmUgVExDVExSCQkJMHgwMTEwNDgKICNkZWZpbmUgTUFDU1IJCQkweDAxMTA1NAorI2RlZmluZSAgU1BDSEdGSU4JCSgxIDw8IDQpCisjZGVmaW5lICBTUENIR0ZBSUwJCSgxIDw8IDYpCisjZGVmaW5lICBTUENIR1NVQwkJKDEgPDwgNykKKyNkZWZpbmUgIExJTktfU1BFRUQJCSgweGYgPDwgMTYpCisjZGVmaW5lICBMSU5LX1NQRUVEXzJfNUdUUwkoMSA8PCAxNikKKyNkZWZpbmUgIExJTktfU1BFRURfNV8wR1RTCSgyIDw8IDE2KQogI2RlZmluZSBNQUNDVExSCQkJMHgwMTEwNTgKKyNkZWZpbmUgIFNQRUVEX0NIQU5HRQkJKDEgPDwgMjQpCiAjZGVmaW5lICBTQ1JBTUJMRV9ESVNBQkxFCSgxIDw8IDI3KQorI2RlZmluZSBNQUNTMlIJCQkweDAxMTA3OAorI2RlZmluZSBNQUNDR1NQU0VUUgkJMHgwMTEwODQKKyNkZWZpbmUgIFNQQ05HUlNOCQkoMSA8PCAzMSkKIAogLyogUi1DYXIgSDEgUEhZICovCiAjZGVmaW5lIEgxX1BDSUVQSFlBRFJSCQkweDA0MDAwYwpAQCAtMzg1LDExICszOTUsNjcgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIHZvaWQgcmNhcl9wY2llX2ZvcmNlX3NwZWVkdXAoc3RydWN0IHJjYXJfcGNpZSAqcGNpZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IDEwMDA7CisJdTMyIG1hY3NyOworCisJaWYgKChyY2FyX3BjaV9yZWFkX3JlZyhwY2llLCBNQUNTMlIpICYgTElOS19TUEVFRCkgIT0gTElOS19TUEVFRF81XzBHVFMpCisJCXJldHVybjsKKworCWlmIChyY2FyX3BjaV9yZWFkX3JlZyhwY2llLCBNQUNDVExSKSAmIFNQRUVEX0NIQU5HRSkgeworCQlkZXZfZXJyKHBjaWUtPmRldiwgIlNwZWVkIGNoYW5nZSBhbHJlYWR5IGluIHByb2dyZXNzXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1hY3NyID0gcmNhcl9wY2lfcmVhZF9yZWcocGNpZSwgTUFDU1IpOworCWlmICgobWFjc3IgJiBMSU5LX1NQRUVEKSA9PSBMSU5LX1NQRUVEXzVfMEdUUykKKwkJZ290byBkb25lOworCisJLyogU2V0IHRhcmdldCBsaW5rIHNwZWVkIHRvIDUuMCBHVC9zICovCisJcmNhcl9ybXczMihwY2llLCBFWFBDQVAoMTIpLCBQQ0lfRVhQX0xOS1NUQV9DTFMsCisJCSAgIFBDSV9FWFBfTE5LU1RBX0NMU181XzBHQik7CisKKwkvKiBTZXQgc3BlZWQgY2hhbmdlIHJlYXNvbiBhcyBpbnRlbnRpb25hbCBmYWN0b3IgKi8KKwlyY2FyX3JtdzMyKHBjaWUsIE1BQ0NHU1BTRVRSLCBTUENOR1JTTiwgMCk7CisKKwkvKiBDbGVhciBTUENIR0ZJTiwgU1BDSEdTVUMsIGFuZCBTUENIR0ZBSUwgKi8KKwlpZiAobWFjc3IgJiAoU1BDSEdGSU4gfCBTUENIR1NVQyB8IFNQQ0hHRkFJTCkpCisJCXJjYXJfcGNpX3dyaXRlX3JlZyhwY2llLCBtYWNzciwgTUFDU1IpOworCisJLyogU3RhcnQgbGluayBzcGVlZCBjaGFuZ2UgKi8KKwlyY2FyX3JtdzMyKHBjaWUsIE1BQ0NUTFIsIFNQRUVEX0NIQU5HRSwgU1BFRURfQ0hBTkdFKTsKKworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJbWFjc3IgPSByY2FyX3BjaV9yZWFkX3JlZyhwY2llLCBNQUNTUik7CisJCWlmIChtYWNzciAmIFNQQ0hHRklOKSB7CisJCQkvKiBDbGVhciB0aGUgaW50ZXJydXB0IGJpdHMgKi8KKwkJCXJjYXJfcGNpX3dyaXRlX3JlZyhwY2llLCBtYWNzciwgTUFDU1IpOworCisJCQlpZiAobWFjc3IgJiBTUENIR0ZBSUwpCisJCQkJZGV2X2VycihwY2llLT5kZXYsICJTcGVlZCBjaGFuZ2UgZmFpbGVkXG4iKTsKKworCQkJZ290byBkb25lOworCQl9CisKKwkJbXNsZWVwKDEpOworCX07CisKKwlkZXZfZXJyKHBjaWUtPmRldiwgIlNwZWVkIGNoYW5nZSB0aW1lZCBvdXRcbiIpOworCitkb25lOgorCWRldl9pbmZvKHBjaWUtPmRldiwgIkN1cnJlbnQgbGluayBzcGVlZCBpcyAlcyBHVC9zXG4iLAorCQkgKG1hY3NyICYgTElOS19TUEVFRCkgPT0gTElOS19TUEVFRF81XzBHVFMgPyAiNSIgOiAiMi41Iik7Cit9CisKIHN0YXRpYyBpbnQgcmNhcl9wY2llX2VuYWJsZShzdHJ1Y3QgcmNhcl9wY2llICpwY2llKQogewogCXN0cnVjdCBwY2lfYnVzICpidXMsICpjaGlsZDsKIAlMSVNUX0hFQUQocmVzKTsKIAorCS8qIFRyeSBzZXR0aW5nIDUgR1QvcyBsaW5rIHNwZWVkICovCisJcmNhcl9wY2llX2ZvcmNlX3NwZWVkdXAocGNpZSk7CisKIAlyY2FyX3BjaWVfc2V0dXAoJnJlcywgcGNpZSk7CiAKIAlwY2lfYWRkX2ZsYWdzKFBDSV9SRUFTU0lHTl9BTExfUlNSQyB8IFBDSV9SRUFTU0lHTl9BTExfQlVTKTsKQEAgLTYwOCw2ICs2NzQsMTggQEAKIAlyZXR1cm4gbXNpOwogfQogCitzdGF0aWMgaW50IHJjYXJfbXNpX2FsbG9jX3JlZ2lvbihzdHJ1Y3QgcmNhcl9tc2kgKmNoaXAsIGludCBub19pcnFzKQoreworCWludCBtc2k7CisKKwltdXRleF9sb2NrKCZjaGlwLT5sb2NrKTsKKwltc2kgPSBiaXRtYXBfZmluZF9mcmVlX3JlZ2lvbihjaGlwLT51c2VkLCBJTlRfUENJX01TSV9OUiwKKwkJCQkgICAgICBvcmRlcl9iYXNlXzIobm9faXJxcykpOworCW11dGV4X3VubG9jaygmY2hpcC0+bG9jayk7CisKKwlyZXR1cm4gbXNpOworfQorCiBzdGF0aWMgdm9pZCByY2FyX21zaV9mcmVlKHN0cnVjdCByY2FyX21zaSAqY2hpcCwgdW5zaWduZWQgbG9uZyBpcnEpCiB7CiAJbXV0ZXhfbG9jaygmY2hpcC0+bG9jayk7CkBAIC02NjUsNyArNzQzLDcgQEAKIAlpZiAoaHdpcnEgPCAwKQogCQlyZXR1cm4gaHdpcnE7CiAKLQlpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcobXNpLT5kb21haW4sIGh3aXJxKTsKKwlpcnEgPSBpcnFfZmluZF9tYXBwaW5nKG1zaS0+ZG9tYWluLCBod2lycSk7CiAJaWYgKCFpcnEpIHsKIAkJcmNhcl9tc2lfZnJlZShtc2ksIGh3aXJxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02ODIsNiArNzYwLDU4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcmNhcl9tc2lfc2V0dXBfaXJxcyhzdHJ1Y3QgbXNpX2NvbnRyb2xsZXIgKmNoaXAsCisJCQkgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBudmVjLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgcmNhcl9wY2llICpwY2llID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCByY2FyX3BjaWUsIG1zaS5jaGlwKTsKKwlzdHJ1Y3QgcmNhcl9tc2kgKm1zaSA9IHRvX3JjYXJfbXNpKGNoaXApOworCXN0cnVjdCBtc2lfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgbXNpX21zZyBtc2c7CisJdW5zaWduZWQgaW50IGlycTsKKwlpbnQgaHdpcnE7CisJaW50IGk7CisKKwkvKiBNU0ktWCBpbnRlcnJ1cHRzIGFyZSBub3Qgc3VwcG9ydGVkICovCisJaWYgKHR5cGUgPT0gUENJX0NBUF9JRF9NU0lYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCVdBUk5fT04oIWxpc3RfaXNfc2luZ3VsYXIoJnBkZXYtPmRldi5tc2lfbGlzdCkpOworCWRlc2MgPSBsaXN0X2VudHJ5KHBkZXYtPmRldi5tc2lfbGlzdC5uZXh0LCBzdHJ1Y3QgbXNpX2Rlc2MsIGxpc3QpOworCisJaHdpcnEgPSByY2FyX21zaV9hbGxvY19yZWdpb24obXNpLCBudmVjKTsKKwlpZiAoaHdpcnEgPCAwKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlycSA9IGlycV9maW5kX21hcHBpbmcobXNpLT5kb21haW4sIGh3aXJxKTsKKwlpZiAoIWlycSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnZlYzsgaSsrKSB7CisJCS8qCisJCSAqIGlycV9jcmVhdGVfbWFwcGluZygpIGNhbGxlZCBmcm9tIHJjYXJfcGNpZV9wcm9iZSgpIHByZS0KKwkJICogYWxsb2NhdGVzIGRlc2NzLCAgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBhbGxvY2F0ZSBkZXNjcyBoZXJlLgorCQkgKiBXZSBjYW4gdGhlcmVmb3JlIGFzc3VtZSB0aGF0IGlmIGlycV9maW5kX21hcHBpbmcoKSBhYm92ZQorCQkgKiByZXR1cm5zIG5vbi16ZXJvLCB0aGVuIHRoZSBkZXNjcyBhcmUgYWxzbyBzdWNjZXNzZnVsbHkKKwkJICogYWxsb2NhdGVkLgorCQkgKi8KKwkJaWYgKGlycV9zZXRfbXNpX2Rlc2Nfb2ZmKGlycSwgaSwgZGVzYykpIHsKKwkJCS8qIFRPRE86IGNsZWFyICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWRlc2MtPm52ZWNfdXNlZCA9IG52ZWM7CisJZGVzYy0+bXNpX2F0dHJpYi5tdWx0aXBsZSA9IG9yZGVyX2Jhc2VfMihudmVjKTsKKworCW1zZy5hZGRyZXNzX2xvID0gcmNhcl9wY2lfcmVhZF9yZWcocGNpZSwgUENJRU1TSUFMUikgJiB+TVNJRkU7CisJbXNnLmFkZHJlc3NfaGkgPSByY2FyX3BjaV9yZWFkX3JlZyhwY2llLCBQQ0lFTVNJQVVSKTsKKwltc2cuZGF0YSA9IGh3aXJxOworCisJcGNpX3dyaXRlX21zaV9tc2coaXJxLCAmbXNnKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCByY2FyX21zaV90ZWFyZG93bl9pcnEoc3RydWN0IG1zaV9jb250cm9sbGVyICpjaGlwLCB1bnNpZ25lZCBpbnQgaXJxKQogewogCXN0cnVjdCByY2FyX21zaSAqbXNpID0gdG9fcmNhcl9tc2koY2hpcCk7CkBAIC03MTYsMTIgKzg0NiwxMyBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UocGNpZS0+ZGV2KTsKIAlzdHJ1Y3QgcmNhcl9tc2kgKm1zaSA9ICZwY2llLT5tc2k7CiAJdW5zaWduZWQgbG9uZyBiYXNlOwotCWludCBlcnI7CisJaW50IGVyciwgaTsKIAogCW11dGV4X2luaXQoJm1zaS0+bG9jayk7CiAKIAltc2ktPmNoaXAuZGV2ID0gcGNpZS0+ZGV2OwogCW1zaS0+Y2hpcC5zZXR1cF9pcnEgPSByY2FyX21zaV9zZXR1cF9pcnE7CisJbXNpLT5jaGlwLnNldHVwX2lycXMgPSByY2FyX21zaV9zZXR1cF9pcnFzOwogCW1zaS0+Y2hpcC50ZWFyZG93bl9pcnEgPSByY2FyX21zaV90ZWFyZG93bl9pcnE7CiAKIAltc2ktPmRvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihwY2llLT5kZXYtPm9mX25vZGUsIElOVF9QQ0lfTVNJX05SLApAQCAtNzMxLDYgKzg2Miw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWZvciAoaSA9IDA7IGkgPCBJTlRfUENJX01TSV9OUjsgaSsrKQorCQlpcnFfY3JlYXRlX21hcHBpbmcobXNpLT5kb21haW4sIGkpOworCiAJLyogVHdvIGlycXMgYXJlIGZvciBNU0ksIGJ1dCB0aGV5IGFyZSBhbHNvIHVzZWQgZm9yIG5vbi1NU0kgaXJxcyAqLwogCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgbXNpLT5pcnExLCByY2FyX3BjaWVfbXNpX2lycSwKIAkJCSAgICAgICBJUlFGX1NIQVJFRCB8IElSUUZfTk9fVEhSRUFELApAQCAtNzc1LDYgKzkwOSwxMCBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwlwY2llLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsICZyZXMpOworCWlmIChJU19FUlIocGNpZS0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHBjaWUtPmJhc2UpOworCiAJcGNpZS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2llIik7CiAJaWYgKElTX0VSUihwY2llLT5jbGspKSB7CiAJCWRldl9lcnIocGNpZS0+ZGV2LCAiY2Fubm90IGdldCBwbGF0Zm9ybSBjbG9ja1xuIik7CkBAIC03ODIsNyArOTIwLDcgQEAKIAl9CiAJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKHBjaWUtPmNsayk7CiAJaWYgKGVycikKLQkJZ290byBmYWlsX2NsazsKKwkJcmV0dXJuIGVycjsKIAogCXBjaWUtPmJ1c19jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInBjaWVfYnVzIik7CiAJaWYgKElTX0VSUihwY2llLT5idXNfY2xrKSkgewpAQCAtNzkyLDcgKzkzMCw3IEBACiAJfQogCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShwY2llLT5idXNfY2xrKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9tYXBfcmVnOworCQlnb3RvIGZhaWxfY2xrOwogCiAJaSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHBkZXYtPmRldi5vZl9ub2RlLCAwKTsKIAlpZiAoIWkpIHsKQEAgLTgxMCwxMiArOTQ4LDYgQEAKIAl9CiAJcGNpZS0+bXNpLmlycTIgPSBpOwogCi0JcGNpZS0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCAmcmVzKTsKLQlpZiAoSVNfRVJSKHBjaWUtPmJhc2UpKSB7Ci0JCWVyciA9IFBUUl9FUlIocGNpZS0+YmFzZSk7Ci0JCWdvdG8gZXJyX21hcF9yZWc7Ci0JfQotCiAJcmV0dXJuIDA7CiAKIGVycl9tYXBfcmVnOgpAQCAtODY1LDEyICs5OTcsMTYgQEAKIAkJICogU2V0IHVwIDY0LWJpdCBpbmJvdW5kIHJlZ2lvbnMgYXMgdGhlIHJhbmdlIHBhcnNlciBkb2Vzbid0CiAJCSAqIGRpc3Rpbmd1aXNoIGJldHdlZW4gMzIgYW5kIDY0LWJpdCB0eXBlcy4KIAkJICovCi0JCXJjYXJfcGNpX3dyaXRlX3JlZyhwY2llLCBsb3dlcl8zMl9iaXRzKHBjaV9hZGRyKSwgUENJRVBSQVIoaWR4KSk7CisJCXJjYXJfcGNpX3dyaXRlX3JlZyhwY2llLCBsb3dlcl8zMl9iaXRzKHBjaV9hZGRyKSwKKwkJCQkgICBQQ0lFUFJBUihpZHgpKTsKIAkJcmNhcl9wY2lfd3JpdGVfcmVnKHBjaWUsIGxvd2VyXzMyX2JpdHMoY3B1X2FkZHIpLCBQQ0lFTEFSKGlkeCkpOwotCQlyY2FyX3BjaV93cml0ZV9yZWcocGNpZSwgbG93ZXJfMzJfYml0cyhtYXNrKSB8IGZsYWdzLCBQQ0lFTEFNUihpZHgpKTsKKwkJcmNhcl9wY2lfd3JpdGVfcmVnKHBjaWUsIGxvd2VyXzMyX2JpdHMobWFzaykgfCBmbGFncywKKwkJCQkgICBQQ0lFTEFNUihpZHgpKTsKIAotCQlyY2FyX3BjaV93cml0ZV9yZWcocGNpZSwgdXBwZXJfMzJfYml0cyhwY2lfYWRkciksIFBDSUVQUkFSKGlkeCsxKSk7Ci0JCXJjYXJfcGNpX3dyaXRlX3JlZyhwY2llLCB1cHBlcl8zMl9iaXRzKGNwdV9hZGRyKSwgUENJRUxBUihpZHgrMSkpOworCQlyY2FyX3BjaV93cml0ZV9yZWcocGNpZSwgdXBwZXJfMzJfYml0cyhwY2lfYWRkciksCisJCQkJICAgUENJRVBSQVIoaWR4ICsgMSkpOworCQlyY2FyX3BjaV93cml0ZV9yZWcocGNpZSwgdXBwZXJfMzJfYml0cyhjcHVfYWRkciksCisJCQkJICAgUENJRUxBUihpZHggKyAxKSk7CiAJCXJjYXJfcGNpX3dyaXRlX3JlZyhwY2llLCAwLCBQQ0lFTEFNUihpZHggKyAxKSk7CiAKIAkJcGNpX2FkZHIgKz0gc2l6ZTsKQEAgLTkxOSw2ICsxMDU1LDcgQEAKIAkvKiBHZXQgdGhlIGRtYS1yYW5nZXMgZnJvbSBEVCAqLwogCWZvcl9lYWNoX29mX3BjaV9yYW5nZSgmcGFyc2VyLCAmcmFuZ2UpIHsKIAkJdTY0IGVuZCA9IHJhbmdlLmNwdV9hZGRyICsgcmFuZ2Uuc2l6ZSAtIDE7CisKIAkJZGV2X2RiZyhwY2llLT5kZXYsICIweCUwOHggMHglMDE2bGx4Li4weCUwMTZsbHggLT4gMHglMDE2bGx4XG4iLAogCQkJcmFuZ2UuZmxhZ3MsIHJhbmdlLmNwdV9hZGRyLCBlbmQsIHJhbmdlLnBjaV9hZGRyKTsKIApAQCAtOTMyLDkgKzEwNjksMTIgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcmNhcl9wY2llX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHBjaWUtcjhhNzc3OSIsIC5kYXRhID0gcmNhcl9wY2llX2h3X2luaXRfaDEgfSwKLQl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscGNpZS1yY2FyLWdlbjIiLCAuZGF0YSA9IHJjYXJfcGNpZV9od19pbml0X2dlbjIgfSwKLQl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscGNpZS1yOGE3NzkwIiwgLmRhdGEgPSByY2FyX3BjaWVfaHdfaW5pdF9nZW4yIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHBjaWUtcjhhNzc5MSIsIC5kYXRhID0gcmNhcl9wY2llX2h3X2luaXRfZ2VuMiB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxwY2llLXJjYXItZ2VuMiIsCisJICAuZGF0YSA9IHJjYXJfcGNpZV9od19pbml0X2dlbjIgfSwKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscGNpZS1yOGE3NzkwIiwKKwkgIC5kYXRhID0gcmNhcl9wY2llX2h3X2luaXRfZ2VuMiB9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxwY2llLXI4YTc3OTEiLAorCSAgLmRhdGEgPSByY2FyX3BjaWVfaHdfaW5pdF9nZW4yIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHBjaWUtcjhhNzc5NSIsIC5kYXRhID0gcmNhcl9wY2llX2h3X2luaXQgfSwKIAl7fSwKIH07CkBAIC05NDUsOSArMTA4NSwxMCBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjaS0+ZGV2OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZTsKLQlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKndpbjsKKwlzdHJ1Y3QgcmVzb3VyY2VfZW50cnkgKndpbiwgKnRtcDsKIAotCWVyciA9IG9mX3BjaV9nZXRfaG9zdF9icmlkZ2VfcmVzb3VyY2VzKG5wLCAwLCAweGZmLCAmcGNpLT5yZXNvdXJjZXMsICZpb2Jhc2UpOworCWVyciA9IG9mX3BjaV9nZXRfaG9zdF9icmlkZ2VfcmVzb3VyY2VzKG5wLCAwLCAweGZmLCAmcGNpLT5yZXNvdXJjZXMsCisJCQkJCSAgICAgICAmaW9iYXNlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC05NTUsMTQgKzEwOTYsMTcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9yZWxlYXNlX3JlczsKIAotCXJlc291cmNlX2xpc3RfZm9yX2VhY2hfZW50cnkod2luLCAmcGNpLT5yZXNvdXJjZXMpIHsKKwlyZXNvdXJjZV9saXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2luLCB0bXAsICZwY2ktPnJlc291cmNlcykgewogCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHdpbi0+cmVzOwogCiAJCWlmIChyZXNvdXJjZV90eXBlKHJlcykgPT0gSU9SRVNPVVJDRV9JTykgewogCQkJZXJyID0gcGNpX3JlbWFwX2lvc3BhY2UocmVzLCBpb2Jhc2UpOwotCQkJaWYgKGVycikKKwkJCWlmIChlcnIpIHsKIAkJCQlkZXZfd2FybihkZXYsICJlcnJvciAlZDogZmFpbGVkIHRvIG1hcCByZXNvdXJjZSAlcFJcbiIsCiAJCQkJCSBlcnIsIHJlcyk7CisKKwkJCQlyZXNvdXJjZV9saXN0X2Rlc3Ryb3lfZW50cnkod2luKTsKKwkJCX0KIAkJfQogCX0KIApAQCAtOTk4LDggKzExNDIsOCBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCSBlcnIgPSByY2FyX3BjaWVfcGFyc2VfbWFwX2RtYV9yYW5nZXMocGNpZSwgcGRldi0+ZGV2Lm9mX25vZGUpOwotCSBpZiAoZXJyKQorCWVyciA9IHJjYXJfcGNpZV9wYXJzZV9tYXBfZG1hX3JhbmdlcyhwY2llLCBwZGV2LT5kZXYub2Zfbm9kZSk7CisJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKHJjYXJfcGNpZV9vZl9tYXRjaCwgcGNpZS0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1yb2NrY2hpcC5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLXJvY2tjaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjODJmYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1yb2NrY2hpcC5jCkBAIC0wLDAgKzEsMTIyOSBAQAorLyoKKyAqIFJvY2tjaGlwIEFYSSBQQ0llIGhvc3QgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUm9ja2NoaXAsIEluYy4KKyAqCisgKiBBdXRob3I6IFNoYXduIExpbiA8c2hhd24ubGluQHJvY2stY2hpcHMuY29tPgorICogICAgICAgICBXZW5ydWkgTGkgPHdlbnJ1aS5saUByb2NrLWNoaXBzLmNvbT4KKyAqCisgKiBCaXRzIHRha2VuIGZyb20gU3lub3BzeXMgRGVzaWdud2FyZSBIb3N0IGNvbnRyb2xsZXIgZHJpdmVyIGFuZAorICogQVJNIFBDSSBIb3N0IGdlbmVyaWMgZHJpdmVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2NoYWluZWRfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworLyoKKyAqIFRoZSB1cHBlciAxNiBiaXRzIG9mIFBDSUVfQ0xJRU5UX0NPTkZJRyBhcmUgYSB3cml0ZSBtYXNrIGZvciB0aGUgbG93ZXIgMTYKKyAqIGJpdHMuICBUaGlzIGFsbG93cyBhdG9taWMgdXBkYXRlcyBvZiB0aGUgcmVnaXN0ZXIgd2l0aG91dCBsb2NraW5nLgorICovCisjZGVmaW5lIEhJV09SRF9VUERBVEUobWFzaywgdmFsKQkoKChtYXNrKSA8PCAxNikgfCAodmFsKSkKKyNkZWZpbmUgSElXT1JEX1VQREFURV9CSVQodmFsKQkJSElXT1JEX1VQREFURSh2YWwsIHZhbCkKKworI2RlZmluZSBFTkNPREVfTEFORVMoeCkJCQkoKCgoeCkgPj4gMSkgJiAzKSA8PCA0KQorCisjZGVmaW5lIFBDSUVfQ0xJRU5UX0JBU0UJCTB4MAorI2RlZmluZSBQQ0lFX0NMSUVOVF9DT05GSUcJCShQQ0lFX0NMSUVOVF9CQVNFICsgMHgwMCkKKyNkZWZpbmUgICBQQ0lFX0NMSUVOVF9DT05GX0VOQUJMRQkgIEhJV09SRF9VUERBVEVfQklUKDB4MDAwMSkKKyNkZWZpbmUgICBQQ0lFX0NMSUVOVF9MSU5LX1RSQUlOX0VOQUJMRQkgIEhJV09SRF9VUERBVEVfQklUKDB4MDAwMikKKyNkZWZpbmUgICBQQ0lFX0NMSUVOVF9BUklfRU5BQkxFCSAgSElXT1JEX1VQREFURV9CSVQoMHgwMDA4KQorI2RlZmluZSAgIFBDSUVfQ0xJRU5UX0NPTkZfTEFORV9OVU0oeCkJICBISVdPUkRfVVBEQVRFKDB4MDAzMCwgRU5DT0RFX0xBTkVTKHgpKQorI2RlZmluZSAgIFBDSUVfQ0xJRU5UX01PREVfUkMJCSAgSElXT1JEX1VQREFURV9CSVQoMHgwMDQwKQorI2RlZmluZSAgIFBDSUVfQ0xJRU5UX0dFTl9TRUxfMgkJICBISVdPUkRfVVBEQVRFX0JJVCgweDAwODApCisjZGVmaW5lIFBDSUVfQ0xJRU5UX0JBU0lDX1NUQVRVUzEJKFBDSUVfQ0xJRU5UX0JBU0UgKyAweDQ4KQorI2RlZmluZSAgIFBDSUVfQ0xJRU5UX0xJTktfU1RBVFVTX1VQCQkweDAwMzAwMDAwCisjZGVmaW5lICAgUENJRV9DTElFTlRfTElOS19TVEFUVVNfTUFTSwkJMHgwMDMwMDAwMAorI2RlZmluZSBQQ0lFX0NMSUVOVF9JTlRfTUFTSwkJKFBDSUVfQ0xJRU5UX0JBU0UgKyAweDRjKQorI2RlZmluZSBQQ0lFX0NMSUVOVF9JTlRfU1RBVFVTCQkoUENJRV9DTElFTlRfQkFTRSArIDB4NTApCisjZGVmaW5lICAgUENJRV9DTElFTlRfSU5UUl9NQVNLCQkJR0VOTUFTSyg4LCA1KQorI2RlZmluZSAgIFBDSUVfQ0xJRU5UX0lOVFJfU0hJRlQJCTUKKyNkZWZpbmUgICBQQ0lFX0NMSUVOVF9JTlRfTEVHQUNZX0RPTkUJCUJJVCgxNSkKKyNkZWZpbmUgICBQQ0lFX0NMSUVOVF9JTlRfTVNHCQkJQklUKDE0KQorI2RlZmluZSAgIFBDSUVfQ0xJRU5UX0lOVF9IT1RfUlNUCQlCSVQoMTMpCisjZGVmaW5lICAgUENJRV9DTElFTlRfSU5UX0RQQQkJCUJJVCgxMikKKyNkZWZpbmUgICBQQ0lFX0NMSUVOVF9JTlRfRkFUQUxfRVJSCQlCSVQoMTEpCisjZGVmaW5lICAgUENJRV9DTElFTlRfSU5UX05GQVRBTF9FUlIJCUJJVCgxMCkKKyNkZWZpbmUgICBQQ0lFX0NMSUVOVF9JTlRfQ09SUl9FUlIJCUJJVCg5KQorI2RlZmluZSAgIFBDSUVfQ0xJRU5UX0lOVF9JTlRECQkJQklUKDgpCisjZGVmaW5lICAgUENJRV9DTElFTlRfSU5UX0lOVEMJCQlCSVQoNykKKyNkZWZpbmUgICBQQ0lFX0NMSUVOVF9JTlRfSU5UQgkJCUJJVCg2KQorI2RlZmluZSAgIFBDSUVfQ0xJRU5UX0lOVF9JTlRBCQkJQklUKDUpCisjZGVmaW5lICAgUENJRV9DTElFTlRfSU5UX0xPQ0FMCQkJQklUKDQpCisjZGVmaW5lICAgUENJRV9DTElFTlRfSU5UX1VETUEJCQlCSVQoMykKKyNkZWZpbmUgICBQQ0lFX0NMSUVOVF9JTlRfUEhZCQkJQklUKDIpCisjZGVmaW5lICAgUENJRV9DTElFTlRfSU5UX0hPVF9QTFVHCQlCSVQoMSkKKyNkZWZpbmUgICBQQ0lFX0NMSUVOVF9JTlRfUFdSX1NUQ0cJCUJJVCgwKQorCisjZGVmaW5lIFBDSUVfQ0xJRU5UX0lOVF9MRUdBQ1kgXAorCShQQ0lFX0NMSUVOVF9JTlRfSU5UQSB8IFBDSUVfQ0xJRU5UX0lOVF9JTlRCIHwgXAorCVBDSUVfQ0xJRU5UX0lOVF9JTlRDIHwgUENJRV9DTElFTlRfSU5UX0lOVEQpCisKKyNkZWZpbmUgUENJRV9DTElFTlRfSU5UX0NMSSBcCisJKFBDSUVfQ0xJRU5UX0lOVF9DT1JSX0VSUiB8IFBDSUVfQ0xJRU5UX0lOVF9ORkFUQUxfRVJSIHwgXAorCVBDSUVfQ0xJRU5UX0lOVF9GQVRBTF9FUlIgfCBQQ0lFX0NMSUVOVF9JTlRfRFBBIHwgXAorCVBDSUVfQ0xJRU5UX0lOVF9IT1RfUlNUIHwgUENJRV9DTElFTlRfSU5UX01TRyB8IFwKKwlQQ0lFX0NMSUVOVF9JTlRfTEVHQUNZX0RPTkUgfCBQQ0lFX0NMSUVOVF9JTlRfTEVHQUNZIHwgXAorCVBDSUVfQ0xJRU5UX0lOVF9QSFkpCisKKyNkZWZpbmUgUENJRV9DT1JFX0NUUkxfTUdNVF9CQVNFCTB4OTAwMDAwCisjZGVmaW5lIFBDSUVfQ09SRV9DVFJMCQkJKFBDSUVfQ09SRV9DVFJMX01HTVRfQkFTRSArIDB4MDAwKQorI2RlZmluZSAgIFBDSUVfQ09SRV9QTF9DT05GX1NQRUVEXzVHCQkweDAwMDAwMDA4CisjZGVmaW5lICAgUENJRV9DT1JFX1BMX0NPTkZfU1BFRURfTUFTSwkJMHgwMDAwMDAxOAorI2RlZmluZSAgIFBDSUVfQ09SRV9QTF9DT05GX0xBTkVfTUFTSwkJMHgwMDAwMDAwNgorI2RlZmluZSAgIFBDSUVfQ09SRV9QTF9DT05GX0xBTkVfU0hJRlQJCTEKKyNkZWZpbmUgUENJRV9DT1JFX0NUUkxfUExDMQkJKFBDSUVfQ09SRV9DVFJMX01HTVRfQkFTRSArIDB4MDA0KQorI2RlZmluZSAgIFBDSUVfQ09SRV9DVFJMX1BMQzFfRlRTX01BU0sJCUdFTk1BU0soMjMsIDgpCisjZGVmaW5lICAgUENJRV9DT1JFX0NUUkxfUExDMV9GVFNfU0hJRlQJCTgKKyNkZWZpbmUgICBQQ0lFX0NPUkVfQ1RSTF9QTEMxX0ZUU19DTlQJCTB4ZmZmZgorI2RlZmluZSBQQ0lFX0NPUkVfVFhDUkVESVRfQ0ZHMQkJKFBDSUVfQ09SRV9DVFJMX01HTVRfQkFTRSArIDB4MDIwKQorI2RlZmluZSAgIFBDSUVfQ09SRV9UWENSRURJVF9DRkcxX01VSV9NQVNLCTB4RkZGRjAwMDAKKyNkZWZpbmUgICBQQ0lFX0NPUkVfVFhDUkVESVRfQ0ZHMV9NVUlfU0hJRlQJMTYKKyNkZWZpbmUgICBQQ0lFX0NPUkVfVFhDUkVESVRfQ0ZHMV9NVUlfRU5DT0RFKHgpIFwKKwkJKCgoeCkgPj4gMykgPDwgUENJRV9DT1JFX1RYQ1JFRElUX0NGRzFfTVVJX1NISUZUKQorI2RlZmluZSBQQ0lFX0NPUkVfSU5UX1NUQVRVUwkJKFBDSUVfQ09SRV9DVFJMX01HTVRfQkFTRSArIDB4MjBjKQorI2RlZmluZSAgIFBDSUVfQ09SRV9JTlRfUFJGUEUJCQlCSVQoMCkKKyNkZWZpbmUgICBQQ0lFX0NPUkVfSU5UX0NSRlBFCQkJQklUKDEpCisjZGVmaW5lICAgUENJRV9DT1JFX0lOVF9SUlBFCQkJQklUKDIpCisjZGVmaW5lICAgUENJRV9DT1JFX0lOVF9QUkZPCQkJQklUKDMpCisjZGVmaW5lICAgUENJRV9DT1JFX0lOVF9DUkZPCQkJQklUKDQpCisjZGVmaW5lICAgUENJRV9DT1JFX0lOVF9SVAkJCUJJVCg1KQorI2RlZmluZSAgIFBDSUVfQ09SRV9JTlRfUlRSCQkJQklUKDYpCisjZGVmaW5lICAgUENJRV9DT1JFX0lOVF9QRQkJCUJJVCg3KQorI2RlZmluZSAgIFBDSUVfQ09SRV9JTlRfTVRSCQkJQklUKDgpCisjZGVmaW5lICAgUENJRV9DT1JFX0lOVF9VQ1IJCQlCSVQoOSkKKyNkZWZpbmUgICBQQ0lFX0NPUkVfSU5UX0ZDRQkJCUJJVCgxMCkKKyNkZWZpbmUgICBQQ0lFX0NPUkVfSU5UX0NUCQkJQklUKDExKQorI2RlZmluZSAgIFBDSUVfQ09SRV9JTlRfVVRDCQkJQklUKDE4KQorI2RlZmluZSAgIFBDSUVfQ09SRV9JTlRfTU1WQwkJCUJJVCgxOSkKKyNkZWZpbmUgUENJRV9DT1JFX0lOVF9NQVNLCQkoUENJRV9DT1JFX0NUUkxfTUdNVF9CQVNFICsgMHgyMTApCisjZGVmaW5lIFBDSUVfUkNfQkFSX0NPTkYJCShQQ0lFX0NPUkVfQ1RSTF9NR01UX0JBU0UgKyAweDMwMCkKKworI2RlZmluZSBQQ0lFX0NPUkVfSU5UIFwKKwkJKFBDSUVfQ09SRV9JTlRfUFJGUEUgfCBQQ0lFX0NPUkVfSU5UX0NSRlBFIHwgXAorCQkgUENJRV9DT1JFX0lOVF9SUlBFIHwgUENJRV9DT1JFX0lOVF9DUkZPIHwgXAorCQkgUENJRV9DT1JFX0lOVF9SVCB8IFBDSUVfQ09SRV9JTlRfUlRSIHwgXAorCQkgUENJRV9DT1JFX0lOVF9QRSB8IFBDSUVfQ09SRV9JTlRfTVRSIHwgXAorCQkgUENJRV9DT1JFX0lOVF9VQ1IgfCBQQ0lFX0NPUkVfSU5UX0ZDRSB8IFwKKwkJIFBDSUVfQ09SRV9JTlRfQ1QgfCBQQ0lFX0NPUkVfSU5UX1VUQyB8IFwKKwkJIFBDSUVfQ09SRV9JTlRfTU1WQykKKworI2RlZmluZSBQQ0lFX1JDX0NPTkZJR19CQVNFCQkweGEwMDAwMAorI2RlZmluZSBQQ0lFX1JDX0NPTkZJR19WRU5ET1IJCShQQ0lFX1JDX0NPTkZJR19CQVNFICsgMHgwMCkKKyNkZWZpbmUgUENJRV9SQ19DT05GSUdfUklEX0NDUgkJKFBDSUVfUkNfQ09ORklHX0JBU0UgKyAweDA4KQorI2RlZmluZSAgIFBDSUVfUkNfQ09ORklHX1NDQ19TSElGVAkJMTYKKyNkZWZpbmUgUENJRV9SQ19DT05GSUdfTENTCQkoUENJRV9SQ19DT05GSUdfQkFTRSArIDB4ZDApCisjZGVmaW5lICAgUENJRV9SQ19DT05GSUdfTENTX1JFVFJBSU5fTElOSwlCSVQoNSkKKyNkZWZpbmUgICBQQ0lFX1JDX0NPTkZJR19MQ1NfTEJNSUUJCUJJVCgxMCkKKyNkZWZpbmUgICBQQ0lFX1JDX0NPTkZJR19MQ1NfTEFCSUUJCUJJVCgxMSkKKyNkZWZpbmUgICBQQ0lFX1JDX0NPTkZJR19MQ1NfTEJNUwkJQklUKDMwKQorI2RlZmluZSAgIFBDSUVfUkNfQ09ORklHX0xDU19MQU1TCQlCSVQoMzEpCisjZGVmaW5lIFBDSUVfUkNfQ09ORklHX0wxX1NVQlNUQVRFX0NUUkwyIChQQ0lFX1JDX0NPTkZJR19CQVNFICsgMHg5MGMpCisKKyNkZWZpbmUgUENJRV9DT1JFX0FYSV9DT05GX0JBU0UJCTB4YzAwMDAwCisjZGVmaW5lIFBDSUVfQ09SRV9PQl9SRUdJT05fQUREUjAJKFBDSUVfQ09SRV9BWElfQ09ORl9CQVNFICsgMHgwKQorI2RlZmluZSAgIFBDSUVfQ09SRV9PQl9SRUdJT05fQUREUjBfTlVNX0JJVFMJMHgzZgorI2RlZmluZSAgIFBDSUVfQ09SRV9PQl9SRUdJT05fQUREUjBfTE9fQUREUgkweGZmZmZmZjAwCisjZGVmaW5lIFBDSUVfQ09SRV9PQl9SRUdJT05fQUREUjEJKFBDSUVfQ09SRV9BWElfQ09ORl9CQVNFICsgMHg0KQorI2RlZmluZSBQQ0lFX0NPUkVfT0JfUkVHSU9OX0RFU0MwCShQQ0lFX0NPUkVfQVhJX0NPTkZfQkFTRSArIDB4OCkKKyNkZWZpbmUgUENJRV9DT1JFX09CX1JFR0lPTl9ERVNDMQkoUENJRV9DT1JFX0FYSV9DT05GX0JBU0UgKyAweGMpCisKKyNkZWZpbmUgUENJRV9DT1JFX0FYSV9JTkJPVU5EX0JBU0UJMHhjMDA4MDAKKyNkZWZpbmUgUENJRV9SUF9JQl9BRERSMAkJKFBDSUVfQ09SRV9BWElfSU5CT1VORF9CQVNFICsgMHgwKQorI2RlZmluZSAgIFBDSUVfQ09SRV9JQl9SRUdJT05fQUREUjBfTlVNX0JJVFMJMHgzZgorI2RlZmluZSAgIFBDSUVfQ09SRV9JQl9SRUdJT05fQUREUjBfTE9fQUREUgkweGZmZmZmZjAwCisjZGVmaW5lIFBDSUVfUlBfSUJfQUREUjEJCShQQ0lFX0NPUkVfQVhJX0lOQk9VTkRfQkFTRSArIDB4NCkKKworLyogU2l6ZSBvZiBvbmUgQVhJIFJlZ2lvbiAobm90IFJlZ2lvbiAwKSAqLworI2RlZmluZSBBWElfUkVHSU9OX1NJWkUJCQkJQklUKDIwKQorLyogU2l6ZSBvZiBSZWdpb24gMCwgZXF1YWwgdG8gc3VtIG9mIHNpemVzIG9mIG90aGVyIHJlZ2lvbnMgKi8KKyNkZWZpbmUgQVhJX1JFR0lPTl8wX1NJWkUJCQkoMzIgKiAoMHgxIDw8IDIwKSkKKyNkZWZpbmUgT0JfUkVHX1NJWkVfU0hJRlQJCQk1CisjZGVmaW5lIElCX1JPT1RfUE9SVF9SRUdfU0laRV9TSElGVAkJMworI2RlZmluZSBBWElfV1JBUFBFUl9JT19XUklURQkJCTB4NgorI2RlZmluZSBBWElfV1JBUFBFUl9NRU1fV1JJVEUJCQkweDIKKworI2RlZmluZSBNQVhfQVhJX0lCX1JPT1RQT1JUX1JFR0lPTl9OVU0JCTMKKyNkZWZpbmUgTUlOX0FYSV9BRERSX0JJVFNfUEFTU0VECQk4CisjZGVmaW5lIFJPQ0tDSElQX1ZFTkRPUl9JRAkJCTB4MWQ4NworI2RlZmluZSBQQ0lFX0VDQU1fQlVTKHgpCQkJKCgoeCkgJiAweGZmKSA8PCAyMCkKKyNkZWZpbmUgUENJRV9FQ0FNX0RFVih4KQkJCSgoKHgpICYgMHgxZikgPDwgMTUpCisjZGVmaW5lIFBDSUVfRUNBTV9GVU5DKHgpCQkJKCgoeCkgJiAweDcpIDw8IDEyKQorI2RlZmluZSBQQ0lFX0VDQU1fUkVHKHgpCQkJKCgoeCkgJiAweGZmZikgPDwgMCkKKyNkZWZpbmUgUENJRV9FQ0FNX0FERFIoYnVzLCBkZXYsIGZ1bmMsIHJlZykgXAorCSAgKFBDSUVfRUNBTV9CVVMoYnVzKSB8IFBDSUVfRUNBTV9ERVYoZGV2KSB8IFwKKwkgICBQQ0lFX0VDQU1fRlVOQyhmdW5jKSB8IFBDSUVfRUNBTV9SRUcocmVnKSkKKworI2RlZmluZSBSQ19SRUdJT05fMF9BRERSX1RSQU5TX0gJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUkNfUkVHSU9OXzBfQUREUl9UUkFOU19MCQkweDAwMDAwMDAwCisjZGVmaW5lIFJDX1JFR0lPTl8wX1BBU1NfQklUUwkJCSgyNSAtIDEpCisjZGVmaW5lIE1BWF9BWElfV1JBUFBFUl9SRUdJT05fTlVNCQkzMworCitzdHJ1Y3Qgcm9ja2NoaXBfcGNpZSB7CisJdm9pZAlfX2lvbWVtICpyZWdfYmFzZTsJCS8qIERUIGF4aS1iYXNlICovCisJdm9pZAlfX2lvbWVtICphcGJfYmFzZTsJCS8qIERUIGFwYi1iYXNlICovCisJc3RydWN0CXBoeSAqcGh5OworCXN0cnVjdAlyZXNldF9jb250cm9sICpjb3JlX3JzdDsKKwlzdHJ1Y3QJcmVzZXRfY29udHJvbCAqbWdtdF9yc3Q7CisJc3RydWN0CXJlc2V0X2NvbnRyb2wgKm1nbXRfc3RpY2t5X3JzdDsKKwlzdHJ1Y3QJcmVzZXRfY29udHJvbCAqcGlwZV9yc3Q7CisJc3RydWN0CWNsayAqYWNsa19wY2llOworCXN0cnVjdAljbGsgKmFjbGtfcGVyZl9wY2llOworCXN0cnVjdAljbGsgKmhjbGtfcGNpZTsKKwlzdHJ1Y3QJY2xrICpjbGtfcGNpZV9wbTsKKwlzdHJ1Y3QJcmVndWxhdG9yICp2cGNpZTN2MzsgLyogMy4zViBwb3dlciBzdXBwbHkgKi8KKwlzdHJ1Y3QJcmVndWxhdG9yICp2cGNpZTF2ODsgLyogMS44ViBwb3dlciBzdXBwbHkgKi8KKwlzdHJ1Y3QJcmVndWxhdG9yICp2cGNpZTB2OTsgLyogMC45ViBwb3dlciBzdXBwbHkgKi8KKwlzdHJ1Y3QJZ3Bpb19kZXNjICplcF9ncGlvOworCXUzMglsYW5lczsKKwl1OAlyb290X2J1c19ucjsKKwlzdHJ1Y3QJZGV2aWNlICpkZXY7CisJc3RydWN0CWlycV9kb21haW4gKmlycV9kb21haW47Cit9OworCitzdGF0aWMgdTMyIHJvY2tjaGlwX3BjaWVfcmVhZChzdHJ1Y3Qgcm9ja2NoaXBfcGNpZSAqcm9ja2NoaXAsIHUzMiByZWcpCit7CisJcmV0dXJuIHJlYWRsKHJvY2tjaGlwLT5hcGJfYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3BjaWVfd3JpdGUoc3RydWN0IHJvY2tjaGlwX3BjaWUgKnJvY2tjaGlwLCB1MzIgdmFsLAorCQkJCXUzMiByZWcpCit7CisJd3JpdGVsKHZhbCwgcm9ja2NoaXAtPmFwYl9iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgcm9ja2NoaXBfcGNpZV9lbmFibGVfYndfaW50KHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCkKK3sKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gcm9ja2NoaXBfcGNpZV9yZWFkKHJvY2tjaGlwLCBQQ0lFX1JDX0NPTkZJR19MQ1MpOworCXN0YXR1cyB8PSAoUENJRV9SQ19DT05GSUdfTENTX0xCTUlFIHwgUENJRV9SQ19DT05GSUdfTENTX0xBQklFKTsKKwlyb2NrY2hpcF9wY2llX3dyaXRlKHJvY2tjaGlwLCBzdGF0dXMsIFBDSUVfUkNfQ09ORklHX0xDUyk7Cit9CisKK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3BjaWVfY2xyX2J3X2ludChzdHJ1Y3Qgcm9ja2NoaXBfcGNpZSAqcm9ja2NoaXApCit7CisJdTMyIHN0YXR1czsKKworCXN0YXR1cyA9IHJvY2tjaGlwX3BjaWVfcmVhZChyb2NrY2hpcCwgUENJRV9SQ19DT05GSUdfTENTKTsKKwlzdGF0dXMgfD0gKFBDSUVfUkNfQ09ORklHX0xDU19MQk1TIHwgUENJRV9SQ19DT05GSUdfTENTX0xBTVMpOworCXJvY2tjaGlwX3BjaWVfd3JpdGUocm9ja2NoaXAsIHN0YXR1cywgUENJRV9SQ19DT05GSUdfTENTKTsKK30KKworc3RhdGljIHZvaWQgcm9ja2NoaXBfcGNpZV91cGRhdGVfdHhjcmVkaXRfbXVpKHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCkKK3sKKwl1MzIgdmFsOworCisJLyogVXBkYXRlIFR4IGNyZWRpdCBtYXhpbXVtIHVwZGF0ZSBpbnRlcnZhbCAqLworCXZhbCA9IHJvY2tjaGlwX3BjaWVfcmVhZChyb2NrY2hpcCwgUENJRV9DT1JFX1RYQ1JFRElUX0NGRzEpOworCXZhbCAmPSB+UENJRV9DT1JFX1RYQ1JFRElUX0NGRzFfTVVJX01BU0s7CisJdmFsIHw9IFBDSUVfQ09SRV9UWENSRURJVF9DRkcxX01VSV9FTkNPREUoMjQwMDApOwkvKiBucyAqLworCXJvY2tjaGlwX3BjaWVfd3JpdGUocm9ja2NoaXAsIHZhbCwgUENJRV9DT1JFX1RYQ1JFRElUX0NGRzEpOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfdmFsaWRfZGV2aWNlKHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCwKKwkJCQkgICAgICBzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgZGV2KQoreworCS8qIGFjY2VzcyBvbmx5IG9uZSBzbG90IG9uIGVhY2ggcm9vdCBwb3J0ICovCisJaWYgKGJ1cy0+bnVtYmVyID09IHJvY2tjaGlwLT5yb290X2J1c19uciAmJiBkZXYgPiAwKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogZG8gbm90IHJlYWQgbW9yZSB0aGFuIG9uZSBkZXZpY2Ugb24gdGhlIGJ1cyBkaXJlY3RseSBhdHRhY2hlZAorCSAqIHRvIFJDJ3MgZG93bnN0cmVhbSBzaWRlLgorCSAqLworCWlmIChidXMtPnByaW1hcnkgPT0gcm9ja2NoaXAtPnJvb3RfYnVzX25yICYmIGRldiA+IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV9yZF9vd25fY29uZihzdHJ1Y3Qgcm9ja2NoaXBfcGNpZSAqcm9ja2NoaXAsCisJCQkJICAgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbCkKK3sKKwl2b2lkIF9faW9tZW0gKmFkZHIgPSByb2NrY2hpcC0+YXBiX2Jhc2UgKyBQQ0lFX1JDX0NPTkZJR19CQVNFICsgd2hlcmU7CisKKwlpZiAoIUlTX0FMSUdORUQoKHVpbnRwdHJfdClhZGRyLCBzaXplKSkgeworCQkqdmFsID0gMDsKKwkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKKwl9CisKKwlpZiAoc2l6ZSA9PSA0KSB7CisJCSp2YWwgPSByZWFkbChhZGRyKTsKKwl9IGVsc2UgaWYgKHNpemUgPT0gMikgeworCQkqdmFsID0gcmVhZHcoYWRkcik7CisJfSBlbHNlIGlmIChzaXplID09IDEpIHsKKwkJKnZhbCA9IHJlYWRiKGFkZHIpOworCX0gZWxzZSB7CisJCSp2YWwgPSAwOworCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOworCX0KKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfd3Jfb3duX2NvbmYoc3RydWN0IHJvY2tjaGlwX3BjaWUgKnJvY2tjaGlwLAorCQkJCSAgICAgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKK3sKKwl1MzIgbWFzaywgdG1wLCBvZmZzZXQ7CisKKwlvZmZzZXQgPSB3aGVyZSAmIH4weDM7CisKKwlpZiAoc2l6ZSA9PSA0KSB7CisJCXdyaXRlbCh2YWwsIHJvY2tjaGlwLT5hcGJfYmFzZSArIFBDSUVfUkNfQ09ORklHX0JBU0UgKyBvZmZzZXQpOworCQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworCX0KKworCW1hc2sgPSB+KCgoMSA8PCAoc2l6ZSAqIDgpKSAtIDEpIDw8ICgod2hlcmUgJiAweDMpICogOCkpOworCisJLyoKKwkgKiBOLkIuIFRoaXMgcmVhZC9tb2RpZnkvd3JpdGUgaXNuJ3Qgc2FmZSBpbiBnZW5lcmFsIGJlY2F1c2UgaXQgY2FuCisJICogY29ycnVwdCBSVzFDIGJpdHMgaW4gYWRqYWNlbnQgcmVnaXN0ZXJzLiAgQnV0IHRoZSBoYXJkd2FyZQorCSAqIGRvZXNuJ3Qgc3VwcG9ydCBzbWFsbGVyIHdyaXRlcy4KKwkgKi8KKwl0bXAgPSByZWFkbChyb2NrY2hpcC0+YXBiX2Jhc2UgKyBQQ0lFX1JDX0NPTkZJR19CQVNFICsgb2Zmc2V0KSAmIG1hc2s7CisJdG1wIHw9IHZhbCA8PCAoKHdoZXJlICYgMHgzKSAqIDgpOworCXdyaXRlbCh0bXAsIHJvY2tjaGlwLT5hcGJfYmFzZSArIFBDSUVfUkNfQ09ORklHX0JBU0UgKyBvZmZzZXQpOworCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX3JkX290aGVyX2NvbmYoc3RydWN0IHJvY2tjaGlwX3BjaWUgKnJvY2tjaGlwLAorCQkJCSAgICAgICBzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1MzIgZGV2Zm4sCisJCQkJICAgICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQoreworCXUzMiBidXNkZXY7CisKKwlidXNkZXYgPSBQQ0lFX0VDQU1fQUREUihidXMtPm51bWJlciwgUENJX1NMT1QoZGV2Zm4pLAorCQkJCVBDSV9GVU5DKGRldmZuKSwgd2hlcmUpOworCisJaWYgKCFJU19BTElHTkVEKGJ1c2Rldiwgc2l6ZSkpIHsKKwkJKnZhbCA9IDA7CisJCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CisJfQorCisJaWYgKHNpemUgPT0gNCkgeworCQkqdmFsID0gcmVhZGwocm9ja2NoaXAtPnJlZ19iYXNlICsgYnVzZGV2KTsKKwl9IGVsc2UgaWYgKHNpemUgPT0gMikgeworCQkqdmFsID0gcmVhZHcocm9ja2NoaXAtPnJlZ19iYXNlICsgYnVzZGV2KTsKKwl9IGVsc2UgaWYgKHNpemUgPT0gMSkgeworCQkqdmFsID0gcmVhZGIocm9ja2NoaXAtPnJlZ19iYXNlICsgYnVzZGV2KTsKKwl9IGVsc2UgeworCQkqdmFsID0gMDsKKwkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKKwl9CisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX3dyX290aGVyX2NvbmYoc3RydWN0IHJvY2tjaGlwX3BjaWUgKnJvY2tjaGlwLAorCQkJCSAgICAgICBzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1MzIgZGV2Zm4sCisJCQkJICAgICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCit7CisJdTMyIGJ1c2RldjsKKworCWJ1c2RldiA9IFBDSUVfRUNBTV9BRERSKGJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChkZXZmbiksCisJCQkJUENJX0ZVTkMoZGV2Zm4pLCB3aGVyZSk7CisJaWYgKCFJU19BTElHTkVEKGJ1c2Rldiwgc2l6ZSkpCisJCXJldHVybiBQQ0lCSU9TX0JBRF9SRUdJU1RFUl9OVU1CRVI7CisKKwlpZiAoc2l6ZSA9PSA0KQorCQl3cml0ZWwodmFsLCByb2NrY2hpcC0+cmVnX2Jhc2UgKyBidXNkZXYpOworCWVsc2UgaWYgKHNpemUgPT0gMikKKwkJd3JpdGV3KHZhbCwgcm9ja2NoaXAtPnJlZ19iYXNlICsgYnVzZGV2KTsKKwllbHNlIGlmIChzaXplID09IDEpCisJCXdyaXRlYih2YWwsIHJvY2tjaGlwLT5yZWdfYmFzZSArIGJ1c2Rldik7CisJZWxzZQorCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOworCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX3JkX2NvbmYoc3RydWN0IHBjaV9idXMgKmJ1cywgdTMyIGRldmZuLCBpbnQgd2hlcmUsCisJCQkJIGludCBzaXplLCB1MzIgKnZhbCkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZSAqcm9ja2NoaXAgPSBidXMtPnN5c2RhdGE7CisKKwlpZiAoIXJvY2tjaGlwX3BjaWVfdmFsaWRfZGV2aWNlKHJvY2tjaGlwLCBidXMsIFBDSV9TTE9UKGRldmZuKSkpIHsKKwkJKnZhbCA9IDB4ZmZmZmZmZmY7CisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJfQorCisJaWYgKGJ1cy0+bnVtYmVyID09IHJvY2tjaGlwLT5yb290X2J1c19ucikKKwkJcmV0dXJuIHJvY2tjaGlwX3BjaWVfcmRfb3duX2NvbmYocm9ja2NoaXAsIHdoZXJlLCBzaXplLCB2YWwpOworCisJcmV0dXJuIHJvY2tjaGlwX3BjaWVfcmRfb3RoZXJfY29uZihyb2NrY2hpcCwgYnVzLCBkZXZmbiwgd2hlcmUsIHNpemUsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV93cl9jb25mKHN0cnVjdCBwY2lfYnVzICpidXMsIHUzMiBkZXZmbiwKKwkJCQkgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZSAqcm9ja2NoaXAgPSBidXMtPnN5c2RhdGE7CisKKwlpZiAoIXJvY2tjaGlwX3BjaWVfdmFsaWRfZGV2aWNlKHJvY2tjaGlwLCBidXMsIFBDSV9TTE9UKGRldmZuKSkpCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlpZiAoYnVzLT5udW1iZXIgPT0gcm9ja2NoaXAtPnJvb3RfYnVzX25yKQorCQlyZXR1cm4gcm9ja2NoaXBfcGNpZV93cl9vd25fY29uZihyb2NrY2hpcCwgd2hlcmUsIHNpemUsIHZhbCk7CisKKwlyZXR1cm4gcm9ja2NoaXBfcGNpZV93cl9vdGhlcl9jb25mKHJvY2tjaGlwLCBidXMsIGRldmZuLCB3aGVyZSwgc2l6ZSwgdmFsKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIHJvY2tjaGlwX3BjaWVfb3BzID0geworCS5yZWFkID0gcm9ja2NoaXBfcGNpZV9yZF9jb25mLAorCS53cml0ZSA9IHJvY2tjaGlwX3BjaWVfd3JfY29uZiwKK307CisKKy8qKgorICogcm9ja2NoaXBfcGNpZV9pbml0X3BvcnQgLSBJbml0aWFsaXplIGhhcmR3YXJlCisgKiBAcm9ja2NoaXA6IFBDSWUgcG9ydCBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfaW5pdF9wb3J0KHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByb2NrY2hpcC0+ZGV2OworCWludCBlcnI7CisJdTMyIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlncGlvZF9zZXRfdmFsdWUocm9ja2NoaXAtPmVwX2dwaW8sIDApOworCisJZXJyID0gcGh5X2luaXQocm9ja2NoaXAtPnBoeSk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsIHRvIGluaXQgcGh5LCBlcnIgJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gcmVzZXRfY29udHJvbF9hc3NlcnQocm9ja2NoaXAtPmNvcmVfcnN0KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiYXNzZXJ0IGNvcmVfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSByZXNldF9jb250cm9sX2Fzc2VydChyb2NrY2hpcC0+bWdtdF9yc3QpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJhc3NlcnQgbWdtdF9yc3QgZXJyICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHJlc2V0X2NvbnRyb2xfYXNzZXJ0KHJvY2tjaGlwLT5tZ210X3N0aWNreV9yc3QpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJhc3NlcnQgbWdtdF9zdGlja3lfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSByZXNldF9jb250cm9sX2Fzc2VydChyb2NrY2hpcC0+cGlwZV9yc3QpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJhc3NlcnQgcGlwZV9yc3QgZXJyICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJvY2tjaGlwX3BjaWVfd3JpdGUocm9ja2NoaXAsCisJCQkgICAgUENJRV9DTElFTlRfQ09ORl9FTkFCTEUgfAorCQkJICAgIFBDSUVfQ0xJRU5UX0xJTktfVFJBSU5fRU5BQkxFIHwKKwkJCSAgICBQQ0lFX0NMSUVOVF9BUklfRU5BQkxFIHwKKwkJCSAgICBQQ0lFX0NMSUVOVF9DT05GX0xBTkVfTlVNKHJvY2tjaGlwLT5sYW5lcykgfAorCQkJICAgIFBDSUVfQ0xJRU5UX01PREVfUkMgfAorCQkJICAgIFBDSUVfQ0xJRU5UX0dFTl9TRUxfMiwKKwkJCQlQQ0lFX0NMSUVOVF9DT05GSUcpOworCisJZXJyID0gcGh5X3Bvd2VyX29uKHJvY2tjaGlwLT5waHkpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsIHRvIHBvd2VyIG9uIHBoeSwgZXJyICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogUGxlYXNlIGRvbid0IHJlb3JkZXIgdGhlIGRlYXNzZXJ0IHNlcXVlbmNlIG9mIHRoZSBmb2xsb3dpbmcKKwkgKiBmb3VyIHJlc2V0IHBpbnMuCisJICovCisJZXJyID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChyb2NrY2hpcC0+bWdtdF9zdGlja3lfcnN0KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAiZGVhc3NlcnQgbWdtdF9zdGlja3lfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KHJvY2tjaGlwLT5jb3JlX3JzdCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgImRlYXNzZXJ0IGNvcmVfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KHJvY2tjaGlwLT5tZ210X3JzdCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgImRlYXNzZXJ0IG1nbXRfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KHJvY2tjaGlwLT5waXBlX3JzdCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgImRlYXNzZXJ0IHBpcGVfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gcmVhZC93cml0ZSBQQ0lFX1JDX0NPTkZJR19MMV9TVUJTVEFURV9DVFJMMiBiZWZvcmUKKwkgKiBlbmFibGluZyBBU1BNLiAgT3RoZXJ3aXNlIEwxUHdyT25TYyBhbmQgTDFQd3JPblZhbCBpc24ndAorCSAqIHJlbGlhYmxlIGFuZCBlbmFibGluZyBBU1BNIGRvZXNuJ3Qgd29yay4gIFRoaXMgaXMgYSBjb250cm9sbGVyCisJICogYnVnIHdlIG5lZWQgdG8gd29yayBhcm91bmQuCisJICovCisJc3RhdHVzID0gcm9ja2NoaXBfcGNpZV9yZWFkKHJvY2tjaGlwLCBQQ0lFX1JDX0NPTkZJR19MMV9TVUJTVEFURV9DVFJMMik7CisJcm9ja2NoaXBfcGNpZV93cml0ZShyb2NrY2hpcCwgc3RhdHVzLCBQQ0lFX1JDX0NPTkZJR19MMV9TVUJTVEFURV9DVFJMMik7CisKKwkvKiBGaXggdGhlIHRyYW5zbWl0dGVkIEZUUyBjb3VudCBkZXNpcmVkIHRvIGV4aXQgZnJvbSBMMHMuICovCisJc3RhdHVzID0gcm9ja2NoaXBfcGNpZV9yZWFkKHJvY2tjaGlwLCBQQ0lFX0NPUkVfQ1RSTF9QTEMxKTsKKwlzdGF0dXMgPSAoc3RhdHVzICYgUENJRV9DT1JFX0NUUkxfUExDMV9GVFNfTUFTSykgfAorCQkgKFBDSUVfQ09SRV9DVFJMX1BMQzFfRlRTX0NOVCA8PCBQQ0lFX0NPUkVfQ1RSTF9QTEMxX0ZUU19TSElGVCk7CisJcm9ja2NoaXBfcGNpZV93cml0ZShyb2NrY2hpcCwgc3RhdHVzLCBQQ0lFX0NPUkVfQ1RSTF9QTEMxKTsKKworCS8qIEVuYWJsZSBHZW4xIHRyYWluaW5nICovCisJcm9ja2NoaXBfcGNpZV93cml0ZShyb2NrY2hpcCwgUENJRV9DTElFTlRfTElOS19UUkFJTl9FTkFCTEUsCisJCQkgICAgUENJRV9DTElFTlRfQ09ORklHKTsKKworCWdwaW9kX3NldF92YWx1ZShyb2NrY2hpcC0+ZXBfZ3BpbywgMSk7CisKKwkvKiA1MDBtcyB0aW1lb3V0IHZhbHVlIHNob3VsZCBiZSBlbm91Z2ggZm9yIEdlbjEvMiB0cmFpbmluZyAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MDApOworCisJZm9yICg7OykgeworCQlzdGF0dXMgPSByb2NrY2hpcF9wY2llX3JlYWQocm9ja2NoaXAsCisJCQkJCSAgICBQQ0lFX0NMSUVOVF9CQVNJQ19TVEFUVVMxKTsKKwkJaWYgKChzdGF0dXMgJiBQQ0lFX0NMSUVOVF9MSU5LX1NUQVRVU19NQVNLKSA9PQorCQkgICAgUENJRV9DTElFTlRfTElOS19TVEFUVVNfVVApIHsKKwkJCWRldl9kYmcoZGV2LCAiUENJZSBsaW5rIHRyYWluaW5nIGdlbjEgcGFzcyFcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJZGV2X2VycihkZXYsICJQQ0llIGxpbmsgdHJhaW5pbmcgZ2VuMSB0aW1lb3V0IVxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCisJCW1zbGVlcCgyMCk7CisJfQorCisJLyoKKwkgKiBFbmFibGUgcmV0cmFpbiBmb3IgZ2VuMi4gVGhpcyBzaG91bGQgYmUgY29uZmlndXJlZCBvbmx5IGFmdGVyCisJICogZ2VuMSBmaW5pc2hlZC4KKwkgKi8KKwlzdGF0dXMgPSByb2NrY2hpcF9wY2llX3JlYWQocm9ja2NoaXAsIFBDSUVfUkNfQ09ORklHX0xDUyk7CisJc3RhdHVzIHw9IFBDSUVfUkNfQ09ORklHX0xDU19SRVRSQUlOX0xJTks7CisJcm9ja2NoaXBfcGNpZV93cml0ZShyb2NrY2hpcCwgc3RhdHVzLCBQQ0lFX1JDX0NPTkZJR19MQ1MpOworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCk7CisJZm9yICg7OykgeworCQlzdGF0dXMgPSByb2NrY2hpcF9wY2llX3JlYWQocm9ja2NoaXAsIFBDSUVfQ09SRV9DVFJMKTsKKwkJaWYgKChzdGF0dXMgJiBQQ0lFX0NPUkVfUExfQ09ORl9TUEVFRF9NQVNLKSA9PQorCQkgICAgUENJRV9DT1JFX1BMX0NPTkZfU1BFRURfNUcpIHsKKwkJCWRldl9kYmcoZGV2LCAiUENJZSBsaW5rIHRyYWluaW5nIGdlbjIgcGFzcyFcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJZGV2X2RiZyhkZXYsICJQQ0llIGxpbmsgdHJhaW5pbmcgZ2VuMiB0aW1lb3V0LCBmYWxsIGJhY2sgdG8gZ2VuMSFcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQltc2xlZXAoMjApOworCX0KKworCS8qIENoZWNrIHRoZSBmaW5hbCBsaW5rIHdpZHRoIGZyb20gbmVnb3RpYXRlZCBsYW5lIGNvdW50ZXIgZnJvbSBNR01UICovCisJc3RhdHVzID0gcm9ja2NoaXBfcGNpZV9yZWFkKHJvY2tjaGlwLCBQQ0lFX0NPUkVfQ1RSTCk7CisJc3RhdHVzID0gIDB4MSA8PCAoKHN0YXR1cyAmIFBDSUVfQ09SRV9QTF9DT05GX0xBTkVfTUFTSykgPj4KKwkJCSAgUENJRV9DT1JFX1BMX0NPTkZfTEFORV9NQVNLKTsKKwlkZXZfZGJnKGRldiwgImN1cnJlbnQgbGluayB3aWR0aCBpcyB4JWRcbiIsIHN0YXR1cyk7CisKKwlyb2NrY2hpcF9wY2llX3dyaXRlKHJvY2tjaGlwLCBST0NLQ0hJUF9WRU5ET1JfSUQsCisJCQkgICAgUENJRV9SQ19DT05GSUdfVkVORE9SKTsKKwlyb2NrY2hpcF9wY2llX3dyaXRlKHJvY2tjaGlwLAorCQkJICAgIFBDSV9DTEFTU19CUklER0VfUENJIDw8IFBDSUVfUkNfQ09ORklHX1NDQ19TSElGVCwKKwkJCSAgICBQQ0lFX1JDX0NPTkZJR19SSURfQ0NSKTsKKwlyb2NrY2hpcF9wY2llX3dyaXRlKHJvY2tjaGlwLCAweDAsIFBDSUVfUkNfQkFSX0NPTkYpOworCisJcm9ja2NoaXBfcGNpZV93cml0ZShyb2NrY2hpcCwKKwkJCSAgICAoUkNfUkVHSU9OXzBfQUREUl9UUkFOU19MICsgUkNfUkVHSU9OXzBfUEFTU19CSVRTKSwKKwkJCSAgICBQQ0lFX0NPUkVfT0JfUkVHSU9OX0FERFIwKTsKKwlyb2NrY2hpcF9wY2llX3dyaXRlKHJvY2tjaGlwLCBSQ19SRUdJT05fMF9BRERSX1RSQU5TX0gsCisJCQkgICAgUENJRV9DT1JFX09CX1JFR0lPTl9BRERSMSk7CisJcm9ja2NoaXBfcGNpZV93cml0ZShyb2NrY2hpcCwgMHgwMDgwMDAwYSwgUENJRV9DT1JFX09CX1JFR0lPTl9ERVNDMCk7CisJcm9ja2NoaXBfcGNpZV93cml0ZShyb2NrY2hpcCwgMHgwLCBQQ0lFX0NPUkVfT0JfUkVHSU9OX0RFU0MxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgcm9ja2NoaXBfcGNpZV9zdWJzeXNfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCA9IGFyZzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByb2NrY2hpcC0+ZGV2OworCXUzMiByZWc7CisJdTMyIHN1Yl9yZWc7CisKKwlyZWcgPSByb2NrY2hpcF9wY2llX3JlYWQocm9ja2NoaXAsIFBDSUVfQ0xJRU5UX0lOVF9TVEFUVVMpOworCWlmIChyZWcgJiBQQ0lFX0NMSUVOVF9JTlRfTE9DQUwpIHsKKwkJZGV2X2RiZyhkZXYsICJsb2NhbCBpbnRlcnJ1cHQgcmVjZWl2ZWRcbiIpOworCQlzdWJfcmVnID0gcm9ja2NoaXBfcGNpZV9yZWFkKHJvY2tjaGlwLCBQQ0lFX0NPUkVfSU5UX1NUQVRVUyk7CisJCWlmIChzdWJfcmVnICYgUENJRV9DT1JFX0lOVF9QUkZQRSkKKwkJCWRldl9kYmcoZGV2LCAicGFyaXR5IGVycm9yIGRldGVjdGVkIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgUE5QIHJlY2VpdmUgRklGTyBSQU1cbiIpOworCisJCWlmIChzdWJfcmVnICYgUENJRV9DT1JFX0lOVF9DUkZQRSkKKwkJCWRldl9kYmcoZGV2LCAicGFyaXR5IGVycm9yIGRldGVjdGVkIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgQ29tcGxldGlvbiBSZWNlaXZlIEZJRk8gUkFNXG4iKTsKKworCQlpZiAoc3ViX3JlZyAmIFBDSUVfQ09SRV9JTlRfUlJQRSkKKwkJCWRldl9kYmcoZGV2LCAicGFyaXR5IGVycm9yIGRldGVjdGVkIHdoaWxlIHJlYWRpbmcgZnJvbSByZXBsYXkgYnVmZmVyIFJBTVxuIik7CisKKwkJaWYgKHN1Yl9yZWcgJiBQQ0lFX0NPUkVfSU5UX1BSRk8pCisJCQlkZXZfZGJnKGRldiwgIm92ZXJmbG93IG9jY3VycmVkIGluIHRoZSBQTlAgcmVjZWl2ZSBGSUZPXG4iKTsKKworCQlpZiAoc3ViX3JlZyAmIFBDSUVfQ09SRV9JTlRfQ1JGTykKKwkJCWRldl9kYmcoZGV2LCAib3ZlcmZsb3cgb2NjdXJyZWQgaW4gdGhlIGNvbXBsZXRpb24gcmVjZWl2ZSBGSUZPXG4iKTsKKworCQlpZiAoc3ViX3JlZyAmIFBDSUVfQ09SRV9JTlRfUlQpCisJCQlkZXZfZGJnKGRldiwgInJlcGxheSB0aW1lciB0aW1lZCBvdXRcbiIpOworCisJCWlmIChzdWJfcmVnICYgUENJRV9DT1JFX0lOVF9SVFIpCisJCQlkZXZfZGJnKGRldiwgInJlcGxheSB0aW1lciByb2xsZWQgb3ZlciBhZnRlciA0IHRyYW5zbWlzc2lvbnMgb2YgdGhlIHNhbWUgVExQXG4iKTsKKworCQlpZiAoc3ViX3JlZyAmIFBDSUVfQ09SRV9JTlRfUEUpCisJCQlkZXZfZGJnKGRldiwgInBoeSBlcnJvciBkZXRlY3RlZCBvbiByZWNlaXZlIHNpZGVcbiIpOworCisJCWlmIChzdWJfcmVnICYgUENJRV9DT1JFX0lOVF9NVFIpCisJCQlkZXZfZGJnKGRldiwgIm1hbGZvcm1lZCBUTFAgcmVjZWl2ZWQgZnJvbSB0aGUgbGlua1xuIik7CisKKwkJaWYgKHN1Yl9yZWcgJiBQQ0lFX0NPUkVfSU5UX1VDUikKKwkJCWRldl9kYmcoZGV2LCAibWFsZm9ybWVkIFRMUCByZWNlaXZlZCBmcm9tIHRoZSBsaW5rXG4iKTsKKworCQlpZiAoc3ViX3JlZyAmIFBDSUVfQ09SRV9JTlRfRkNFKQorCQkJZGV2X2RiZyhkZXYsICJhbiBlcnJvciB3YXMgb2JzZXJ2ZWQgaW4gdGhlIGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50cyBmcm9tIHRoZSBvdGhlciBzaWRlXG4iKTsKKworCQlpZiAoc3ViX3JlZyAmIFBDSUVfQ09SRV9JTlRfQ1QpCisJCQlkZXZfZGJnKGRldiwgImEgcmVxdWVzdCB0aW1lZCBvdXQgd2FpdGluZyBmb3IgY29tcGxldGlvblxuIik7CisKKwkJaWYgKHN1Yl9yZWcgJiBQQ0lFX0NPUkVfSU5UX1VUQykKKwkJCWRldl9kYmcoZGV2LCAidW5tYXBwZWQgVEMgZXJyb3JcbiIpOworCisJCWlmIChzdWJfcmVnICYgUENJRV9DT1JFX0lOVF9NTVZDKQorCQkJZGV2X2RiZyhkZXYsICJNU0kgbWFzayByZWdpc3RlciBjaGFuZ2VzXG4iKTsKKworCQlyb2NrY2hpcF9wY2llX3dyaXRlKHJvY2tjaGlwLCBzdWJfcmVnLCBQQ0lFX0NPUkVfSU5UX1NUQVRVUyk7CisJfSBlbHNlIGlmIChyZWcgJiBQQ0lFX0NMSUVOVF9JTlRfUEhZKSB7CisJCWRldl9kYmcoZGV2LCAicGh5IGxpbmsgY2hhbmdlc1xuIik7CisJCXJvY2tjaGlwX3BjaWVfdXBkYXRlX3R4Y3JlZGl0X211aShyb2NrY2hpcCk7CisJCXJvY2tjaGlwX3BjaWVfY2xyX2J3X2ludChyb2NrY2hpcCk7CisJfQorCisJcm9ja2NoaXBfcGNpZV93cml0ZShyb2NrY2hpcCwgcmVnICYgUENJRV9DTElFTlRfSU5UX0xPQ0FMLAorCQkJICAgIFBDSUVfQ0xJRU5UX0lOVF9TVEFUVVMpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgcm9ja2NoaXBfcGNpZV9jbGllbnRfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqYXJnKQoreworCXN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCA9IGFyZzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByb2NrY2hpcC0+ZGV2OworCXUzMiByZWc7CisKKwlyZWcgPSByb2NrY2hpcF9wY2llX3JlYWQocm9ja2NoaXAsIFBDSUVfQ0xJRU5UX0lOVF9TVEFUVVMpOworCWlmIChyZWcgJiBQQ0lFX0NMSUVOVF9JTlRfTEVHQUNZX0RPTkUpCisJCWRldl9kYmcoZGV2LCAibGVnYWN5IGRvbmUgaW50ZXJydXB0IHJlY2VpdmVkXG4iKTsKKworCWlmIChyZWcgJiBQQ0lFX0NMSUVOVF9JTlRfTVNHKQorCQlkZXZfZGJnKGRldiwgIm1lc3NhZ2UgZG9uZSBpbnRlcnJ1cHQgcmVjZWl2ZWRcbiIpOworCisJaWYgKHJlZyAmIFBDSUVfQ0xJRU5UX0lOVF9IT1RfUlNUKQorCQlkZXZfZGJnKGRldiwgImhvdCByZXNldCBpbnRlcnJ1cHQgcmVjZWl2ZWRcbiIpOworCisJaWYgKHJlZyAmIFBDSUVfQ0xJRU5UX0lOVF9EUEEpCisJCWRldl9kYmcoZGV2LCAiZHBhIGludGVycnVwdCByZWNlaXZlZFxuIik7CisKKwlpZiAocmVnICYgUENJRV9DTElFTlRfSU5UX0ZBVEFMX0VSUikKKwkJZGV2X2RiZyhkZXYsICJmYXRhbCBlcnJvciBpbnRlcnJ1cHQgcmVjZWl2ZWRcbiIpOworCisJaWYgKHJlZyAmIFBDSUVfQ0xJRU5UX0lOVF9ORkFUQUxfRVJSKQorCQlkZXZfZGJnKGRldiwgIm5vIGZhdGFsIGVycm9yIGludGVycnVwdCByZWNlaXZlZFxuIik7CisKKwlpZiAocmVnICYgUENJRV9DTElFTlRfSU5UX0NPUlJfRVJSKQorCQlkZXZfZGJnKGRldiwgImNvcnJlY3RhYmxlIGVycm9yIGludGVycnVwdCByZWNlaXZlZFxuIik7CisKKwlpZiAocmVnICYgUENJRV9DTElFTlRfSU5UX1BIWSkKKwkJZGV2X2RiZyhkZXYsICJwaHkgaW50ZXJydXB0IHJlY2VpdmVkXG4iKTsKKworCXJvY2tjaGlwX3BjaWVfd3JpdGUocm9ja2NoaXAsIHJlZyAmIChQQ0lFX0NMSUVOVF9JTlRfTEVHQUNZX0RPTkUgfAorCQkJICAgICAgUENJRV9DTElFTlRfSU5UX01TRyB8IFBDSUVfQ0xJRU5UX0lOVF9IT1RfUlNUIHwKKwkJCSAgICAgIFBDSUVfQ0xJRU5UX0lOVF9EUEEgfCBQQ0lFX0NMSUVOVF9JTlRfRkFUQUxfRVJSIHwKKwkJCSAgICAgIFBDSUVfQ0xJRU5UX0lOVF9ORkFUQUxfRVJSIHwKKwkJCSAgICAgIFBDSUVfQ0xJRU5UX0lOVF9DT1JSX0VSUiB8CisJCQkgICAgICBQQ0lFX0NMSUVOVF9JTlRfUEhZKSwKKwkJICAgUENJRV9DTElFTlRfSU5UX1NUQVRVUyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3BjaWVfbGVnYWN5X2ludF9oYW5kbGVyKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZSAqcm9ja2NoaXAgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJvY2tjaGlwLT5kZXY7CisJdTMyIHJlZzsKKwl1MzIgaHdpcnE7CisJdTMyIHZpcnE7CisKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKworCXJlZyA9IHJvY2tjaGlwX3BjaWVfcmVhZChyb2NrY2hpcCwgUENJRV9DTElFTlRfSU5UX1NUQVRVUyk7CisJcmVnID0gKHJlZyAmIFBDSUVfQ0xJRU5UX0lOVFJfTUFTSykgPj4gUENJRV9DTElFTlRfSU5UUl9TSElGVDsKKworCXdoaWxlIChyZWcpIHsKKwkJaHdpcnEgPSBmZnMocmVnKSAtIDE7CisJCXJlZyAmPSB+QklUKGh3aXJxKTsKKworCQl2aXJxID0gaXJxX2ZpbmRfbWFwcGluZyhyb2NrY2hpcC0+aXJxX2RvbWFpbiwgaHdpcnEpOworCQlpZiAodmlycSkKKwkJCWdlbmVyaWNfaGFuZGxlX2lycSh2aXJxKTsKKwkJZWxzZQorCQkJZGV2X2VycihkZXYsICJ1bmV4cGVjdGVkIElSUSwgSU5UJWRcbiIsIGh3aXJxKTsKKwl9CisKKwljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOworfQorCisKKy8qKgorICogcm9ja2NoaXBfcGNpZV9wYXJzZV9kdCAtIFBhcnNlIERldmljZSBUcmVlCisgKiBAcm9ja2NoaXA6IFBDSWUgcG9ydCBpbmZvcm1hdGlvbgorICoKKyAqIFJldHVybjogJzAnIG9uIHN1Y2Nlc3MgYW5kIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCByb2NrY2hpcF9wY2llX3BhcnNlX2R0KHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByb2NrY2hpcC0+ZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IHJlc291cmNlICpyZWdzOworCWludCBpcnE7CisJaW50IGVycjsKKworCXJlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsCisJCQkJCSAgICBJT1JFU09VUkNFX01FTSwKKwkJCQkJICAgICJheGktYmFzZSIpOworCXJvY2tjaGlwLT5yZWdfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlZ3MpOworCWlmIChJU19FUlIocm9ja2NoaXAtPnJlZ19iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIocm9ja2NoaXAtPnJlZ19iYXNlKTsKKworCXJlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsCisJCQkJCSAgICBJT1JFU09VUkNFX01FTSwKKwkJCQkJICAgICJhcGItYmFzZSIpOworCXJvY2tjaGlwLT5hcGJfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlZ3MpOworCWlmIChJU19FUlIocm9ja2NoaXAtPmFwYl9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIocm9ja2NoaXAtPmFwYl9iYXNlKTsKKworCXJvY2tjaGlwLT5waHkgPSBkZXZtX3BoeV9nZXQoZGV2LCAicGNpZS1waHkiKTsKKwlpZiAoSVNfRVJSKHJvY2tjaGlwLT5waHkpKSB7CisJCWlmIChQVFJfRVJSKHJvY2tjaGlwLT5waHkpICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKGRldiwgIm1pc3NpbmcgcGh5XG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocm9ja2NoaXAtPnBoeSk7CisJfQorCisJcm9ja2NoaXAtPmxhbmVzID0gMTsKKwllcnIgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAibnVtLWxhbmVzIiwgJnJvY2tjaGlwLT5sYW5lcyk7CisJaWYgKCFlcnIgJiYgKHJvY2tjaGlwLT5sYW5lcyA9PSAwIHx8CisJCSAgICAgcm9ja2NoaXAtPmxhbmVzID09IDMgfHwKKwkJICAgICByb2NrY2hpcC0+bGFuZXMgPiA0KSkgeworCQlkZXZfd2FybihkZXYsICJpbnZhbGlkIG51bS1sYW5lcywgZGVmYXVsdCB0byB1c2Ugb25lIGxhbmVcbiIpOworCQlyb2NrY2hpcC0+bGFuZXMgPSAxOworCX0KKworCXJvY2tjaGlwLT5jb3JlX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAiY29yZSIpOworCWlmIChJU19FUlIocm9ja2NoaXAtPmNvcmVfcnN0KSkgeworCQlpZiAoUFRSX0VSUihyb2NrY2hpcC0+Y29yZV9yc3QpICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKGRldiwgIm1pc3NpbmcgY29yZSByZXNldCBwcm9wZXJ0eSBpbiBub2RlXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocm9ja2NoaXAtPmNvcmVfcnN0KTsKKwl9CisKKwlyb2NrY2hpcC0+bWdtdF9yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KGRldiwgIm1nbXQiKTsKKwlpZiAoSVNfRVJSKHJvY2tjaGlwLT5tZ210X3JzdCkpIHsKKwkJaWYgKFBUUl9FUlIocm9ja2NoaXAtPm1nbXRfcnN0KSAhPSAtRVBST0JFX0RFRkVSKQorCQkJZGV2X2VycihkZXYsICJtaXNzaW5nIG1nbXQgcmVzZXQgcHJvcGVydHkgaW4gbm9kZVxuIik7CisJCXJldHVybiBQVFJfRVJSKHJvY2tjaGlwLT5tZ210X3JzdCk7CisJfQorCisJcm9ja2NoaXAtPm1nbXRfc3RpY2t5X3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAibWdtdC1zdGlja3kiKTsKKwlpZiAoSVNfRVJSKHJvY2tjaGlwLT5tZ210X3N0aWNreV9yc3QpKSB7CisJCWlmIChQVFJfRVJSKHJvY2tjaGlwLT5tZ210X3N0aWNreV9yc3QpICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKGRldiwgIm1pc3NpbmcgbWdtdC1zdGlja3kgcmVzZXQgcHJvcGVydHkgaW4gbm9kZVxuIik7CisJCXJldHVybiBQVFJfRVJSKHJvY2tjaGlwLT5tZ210X3N0aWNreV9yc3QpOworCX0KKworCXJvY2tjaGlwLT5waXBlX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAicGlwZSIpOworCWlmIChJU19FUlIocm9ja2NoaXAtPnBpcGVfcnN0KSkgeworCQlpZiAoUFRSX0VSUihyb2NrY2hpcC0+cGlwZV9yc3QpICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKGRldiwgIm1pc3NpbmcgcGlwZSByZXNldCBwcm9wZXJ0eSBpbiBub2RlXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocm9ja2NoaXAtPnBpcGVfcnN0KTsKKwl9CisKKwlyb2NrY2hpcC0+ZXBfZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0KGRldiwgImVwIiwgR1BJT0RfT1VUX0hJR0gpOworCWlmIChJU19FUlIocm9ja2NoaXAtPmVwX2dwaW8pKSB7CisJCWRldl9lcnIoZGV2LCAibWlzc2luZyBlcC1ncGlvcyBwcm9wZXJ0eSBpbiBub2RlXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocm9ja2NoaXAtPmVwX2dwaW8pOworCX0KKworCXJvY2tjaGlwLT5hY2xrX3BjaWUgPSBkZXZtX2Nsa19nZXQoZGV2LCAiYWNsayIpOworCWlmIChJU19FUlIocm9ja2NoaXAtPmFjbGtfcGNpZSkpIHsKKwkJZGV2X2VycihkZXYsICJhY2xrIGNsb2NrIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHJvY2tjaGlwLT5hY2xrX3BjaWUpOworCX0KKworCXJvY2tjaGlwLT5hY2xrX3BlcmZfcGNpZSA9IGRldm1fY2xrX2dldChkZXYsICJhY2xrLXBlcmYiKTsKKwlpZiAoSVNfRVJSKHJvY2tjaGlwLT5hY2xrX3BlcmZfcGNpZSkpIHsKKwkJZGV2X2VycihkZXYsICJhY2xrX3BlcmYgY2xvY2sgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocm9ja2NoaXAtPmFjbGtfcGVyZl9wY2llKTsKKwl9CisKKwlyb2NrY2hpcC0+aGNsa19wY2llID0gZGV2bV9jbGtfZ2V0KGRldiwgImhjbGsiKTsKKwlpZiAoSVNfRVJSKHJvY2tjaGlwLT5oY2xrX3BjaWUpKSB7CisJCWRldl9lcnIoZGV2LCAiaGNsayBjbG9jayBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyb2NrY2hpcC0+aGNsa19wY2llKTsKKwl9CisKKwlyb2NrY2hpcC0+Y2xrX3BjaWVfcG0gPSBkZXZtX2Nsa19nZXQoZGV2LCAicG0iKTsKKwlpZiAoSVNfRVJSKHJvY2tjaGlwLT5jbGtfcGNpZV9wbSkpIHsKKwkJZGV2X2VycihkZXYsICJwbSBjbG9jayBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyb2NrY2hpcC0+Y2xrX3BjaWVfcG0pOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJzeXMiKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIm1pc3Npbmcgc3lzIElSUSByZXNvdXJjZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsIHJvY2tjaGlwX3BjaWVfc3Vic3lzX2lycV9oYW5kbGVyLAorCQkJICAgICAgIElSUUZfU0hBUkVELCAicGNpZS1zeXMiLCByb2NrY2hpcCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IFBDSWUgc3Vic3lzdGVtIElSUVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgImxlZ2FjeSIpOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAibWlzc2luZyBsZWdhY3kgSVJRIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXJfYW5kX2RhdGEoaXJxLAorCQkJCQkgcm9ja2NoaXBfcGNpZV9sZWdhY3lfaW50X2hhbmRsZXIsCisJCQkJCSByb2NrY2hpcCk7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAiY2xpZW50Iik7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJtaXNzaW5nIGNsaWVudCBJUlEgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgaXJxLCByb2NrY2hpcF9wY2llX2NsaWVudF9pcnFfaGFuZGxlciwKKwkJCSAgICAgICBJUlFGX1NIQVJFRCwgInBjaWUtY2xpZW50Iiwgcm9ja2NoaXApOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBQQ0llIGNsaWVudCBJUlFcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJvY2tjaGlwLT52cGNpZTN2MyA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChkZXYsICJ2cGNpZTN2MyIpOworCWlmIChJU19FUlIocm9ja2NoaXAtPnZwY2llM3YzKSkgeworCQlpZiAoUFRSX0VSUihyb2NrY2hpcC0+dnBjaWUzdjMpID09IC1FUFJPQkVfREVGRVIpCisJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwkJZGV2X2luZm8oZGV2LCAibm8gdnBjaWUzdjMgcmVndWxhdG9yIGZvdW5kXG4iKTsKKwl9CisKKwlyb2NrY2hpcC0+dnBjaWUxdjggPSBkZXZtX3JlZ3VsYXRvcl9nZXRfb3B0aW9uYWwoZGV2LCAidnBjaWUxdjgiKTsKKwlpZiAoSVNfRVJSKHJvY2tjaGlwLT52cGNpZTF2OCkpIHsKKwkJaWYgKFBUUl9FUlIocm9ja2NoaXAtPnZwY2llMXY4KSA9PSAtRVBST0JFX0RFRkVSKQorCQkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisJCWRldl9pbmZvKGRldiwgIm5vIHZwY2llMXY4IHJlZ3VsYXRvciBmb3VuZFxuIik7CisJfQorCisJcm9ja2NoaXAtPnZwY2llMHY5ID0gZGV2bV9yZWd1bGF0b3JfZ2V0X29wdGlvbmFsKGRldiwgInZwY2llMHY5Iik7CisJaWYgKElTX0VSUihyb2NrY2hpcC0+dnBjaWUwdjkpKSB7CisJCWlmIChQVFJfRVJSKHJvY2tjaGlwLT52cGNpZTB2OSkgPT0gLUVQUk9CRV9ERUZFUikKKwkJCXJldHVybiAtRVBST0JFX0RFRkVSOworCQlkZXZfaW5mbyhkZXYsICJubyB2cGNpZTB2OSByZWd1bGF0b3IgZm91bmRcbiIpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfc2V0X3ZwY2llKHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByb2NrY2hpcC0+ZGV2OworCWludCBlcnI7CisKKwlpZiAoIUlTX0VSUihyb2NrY2hpcC0+dnBjaWUzdjMpKSB7CisJCWVyciA9IHJlZ3VsYXRvcl9lbmFibGUocm9ja2NoaXAtPnZwY2llM3YzKTsKKwkJaWYgKGVycikgeworCQkJZGV2X2VycihkZXYsICJmYWlsIHRvIGVuYWJsZSB2cGNpZTN2MyByZWd1bGF0b3JcbiIpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCisJaWYgKCFJU19FUlIocm9ja2NoaXAtPnZwY2llMXY4KSkgeworCQllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHJvY2tjaGlwLT52cGNpZTF2OCk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbCB0byBlbmFibGUgdnBjaWUxdjggcmVndWxhdG9yXG4iKTsKKwkJCWdvdG8gZXJyX2Rpc2FibGVfM3YzOworCQl9CisJfQorCisJaWYgKCFJU19FUlIocm9ja2NoaXAtPnZwY2llMHY5KSkgeworCQllcnIgPSByZWd1bGF0b3JfZW5hYmxlKHJvY2tjaGlwLT52cGNpZTB2OSk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbCB0byBlbmFibGUgdnBjaWUwdjkgcmVndWxhdG9yXG4iKTsKKwkJCWdvdG8gZXJyX2Rpc2FibGVfMXY4OworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9kaXNhYmxlXzF2ODoKKwlpZiAoIUlTX0VSUihyb2NrY2hpcC0+dnBjaWUxdjgpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShyb2NrY2hpcC0+dnBjaWUxdjgpOworZXJyX2Rpc2FibGVfM3YzOgorCWlmICghSVNfRVJSKHJvY2tjaGlwLT52cGNpZTN2MykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKHJvY2tjaGlwLT52cGNpZTN2Myk7CitlcnJfb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3BjaWVfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHJvY2tjaGlwX3BjaWUgKnJvY2tjaGlwKQoreworCXJvY2tjaGlwX3BjaWVfd3JpdGUocm9ja2NoaXAsIChQQ0lFX0NMSUVOVF9JTlRfQ0xJIDw8IDE2KSAmCisJCQkgICAgKH5QQ0lFX0NMSUVOVF9JTlRfQ0xJKSwgUENJRV9DTElFTlRfSU5UX01BU0spOworCXJvY2tjaGlwX3BjaWVfd3JpdGUocm9ja2NoaXAsICh1MzIpKH5QQ0lFX0NPUkVfSU5UKSwKKwkJCSAgICBQQ0lFX0NPUkVfSU5UX01BU0spOworCisJcm9ja2NoaXBfcGNpZV9lbmFibGVfYndfaW50KHJvY2tjaGlwKTsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX2ludHhfbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGludCBpcnEsCisJCQkJICBpcnFfaHdfbnVtYmVyX3QgaHdpcnEpCit7CisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmR1bW15X2lycV9jaGlwLCBoYW5kbGVfc2ltcGxlX2lycSk7CisJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBkb21haW4tPmhvc3RfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyBpbnR4X2RvbWFpbl9vcHMgPSB7CisJLm1hcCA9IHJvY2tjaGlwX3BjaWVfaW50eF9tYXAsCit9OworCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfaW5pdF9pcnFfZG9tYWluKHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByb2NrY2hpcC0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW50YyA9IG9mX2dldF9uZXh0X2NoaWxkKGRldi0+b2Zfbm9kZSwgTlVMTCk7CisKKwlpZiAoIWludGMpIHsKKwkJZGV2X2VycihkZXYsICJtaXNzaW5nIGNoaWxkIGludGVycnVwdC1jb250cm9sbGVyIG5vZGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyb2NrY2hpcC0+aXJxX2RvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihpbnRjLCA0LAorCQkJCQkJICAgICZpbnR4X2RvbWFpbl9vcHMsIHJvY2tjaGlwKTsKKwlpZiAoIXJvY2tjaGlwLT5pcnFfZG9tYWluKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBhIElOVHggSVJRIGRvbWFpblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfcHJvZ19vYl9hdHUoc3RydWN0IHJvY2tjaGlwX3BjaWUgKnJvY2tjaGlwLAorCQkJCSAgICAgaW50IHJlZ2lvbl9ubywgaW50IHR5cGUsIHU4IG51bV9wYXNzX2JpdHMsCisJCQkJICAgICB1MzIgbG93ZXJfYWRkciwgdTMyIHVwcGVyX2FkZHIpCit7CisJdTMyIG9iX2FkZHJfMDsKKwl1MzIgb2JfYWRkcl8xOworCXUzMiBvYl9kZXNjXzA7CisJdTMyIGF3X29mZnNldDsKKworCWlmIChyZWdpb25fbm8gPj0gTUFYX0FYSV9XUkFQUEVSX1JFR0lPTl9OVU0pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChudW1fcGFzc19iaXRzICsgMSA8IDgpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChudW1fcGFzc19iaXRzID4gNjMpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChyZWdpb25fbm8gPT0gMCkgeworCQlpZiAoQVhJX1JFR0lPTl8wX1NJWkUgPCAoMlVMTCA8PCBudW1fcGFzc19iaXRzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZWdpb25fbm8gIT0gMCkgeworCQlpZiAoQVhJX1JFR0lPTl9TSVpFIDwgKDJVTEwgPDwgbnVtX3Bhc3NfYml0cykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlhd19vZmZzZXQgPSAocmVnaW9uX25vIDw8IE9CX1JFR19TSVpFX1NISUZUKTsKKworCW9iX2FkZHJfMCA9IG51bV9wYXNzX2JpdHMgJiBQQ0lFX0NPUkVfT0JfUkVHSU9OX0FERFIwX05VTV9CSVRTOworCW9iX2FkZHJfMCB8PSBsb3dlcl9hZGRyICYgUENJRV9DT1JFX09CX1JFR0lPTl9BRERSMF9MT19BRERSOworCW9iX2FkZHJfMSA9IHVwcGVyX2FkZHI7CisJb2JfZGVzY18wID0gKDEgPDwgMjMgfCB0eXBlKTsKKworCXJvY2tjaGlwX3BjaWVfd3JpdGUocm9ja2NoaXAsIG9iX2FkZHJfMCwKKwkJCSAgICBQQ0lFX0NPUkVfT0JfUkVHSU9OX0FERFIwICsgYXdfb2Zmc2V0KTsKKwlyb2NrY2hpcF9wY2llX3dyaXRlKHJvY2tjaGlwLCBvYl9hZGRyXzEsCisJCQkgICAgUENJRV9DT1JFX09CX1JFR0lPTl9BRERSMSArIGF3X29mZnNldCk7CisJcm9ja2NoaXBfcGNpZV93cml0ZShyb2NrY2hpcCwgb2JfZGVzY18wLAorCQkJICAgIFBDSUVfQ09SRV9PQl9SRUdJT05fREVTQzAgKyBhd19vZmZzZXQpOworCXJvY2tjaGlwX3BjaWVfd3JpdGUocm9ja2NoaXAsIDAsCisJCQkgICAgUENJRV9DT1JFX09CX1JFR0lPTl9ERVNDMSArIGF3X29mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX3Byb2dfaWJfYXR1KHN0cnVjdCByb2NrY2hpcF9wY2llICpyb2NrY2hpcCwKKwkJCQkgICAgIGludCByZWdpb25fbm8sIHU4IG51bV9wYXNzX2JpdHMsCisJCQkJICAgICB1MzIgbG93ZXJfYWRkciwgdTMyIHVwcGVyX2FkZHIpCit7CisJdTMyIGliX2FkZHJfMDsKKwl1MzIgaWJfYWRkcl8xOworCXUzMiBhd19vZmZzZXQ7CisKKwlpZiAocmVnaW9uX25vID4gTUFYX0FYSV9JQl9ST09UUE9SVF9SRUdJT05fTlVNKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobnVtX3Bhc3NfYml0cyArIDEgPCBNSU5fQVhJX0FERFJfQklUU19QQVNTRUQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChudW1fcGFzc19iaXRzID4gNjMpCisJCXJldHVybiAtRUlOVkFMOworCisJYXdfb2Zmc2V0ID0gKHJlZ2lvbl9ubyA8PCBJQl9ST09UX1BPUlRfUkVHX1NJWkVfU0hJRlQpOworCisJaWJfYWRkcl8wID0gbnVtX3Bhc3NfYml0cyAmIFBDSUVfQ09SRV9JQl9SRUdJT05fQUREUjBfTlVNX0JJVFM7CisJaWJfYWRkcl8wIHw9IChsb3dlcl9hZGRyIDw8IDgpICYgUENJRV9DT1JFX0lCX1JFR0lPTl9BRERSMF9MT19BRERSOworCWliX2FkZHJfMSA9IHVwcGVyX2FkZHI7CisKKwlyb2NrY2hpcF9wY2llX3dyaXRlKHJvY2tjaGlwLCBpYl9hZGRyXzAsIFBDSUVfUlBfSUJfQUREUjAgKyBhd19vZmZzZXQpOworCXJvY2tjaGlwX3BjaWVfd3JpdGUocm9ja2NoaXAsIGliX2FkZHJfMSwgUENJRV9SUF9JQl9BRERSMSArIGF3X29mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJvY2tjaGlwX3BjaWUgKnJvY2tjaGlwOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHBjaV9idXMgKmJ1cywgKmNoaWxkOworCXN0cnVjdCByZXNvdXJjZV9lbnRyeSAqd2luOworCXJlc291cmNlX3NpemVfdCBpb19iYXNlOworCXN0cnVjdCByZXNvdXJjZQkqbWVtOworCXN0cnVjdCByZXNvdXJjZQkqaW87CisJcGh5c19hZGRyX3QgaW9fYnVzX2FkZHIgPSAwOworCXUzMiBpb19zaXplOworCXBoeXNfYWRkcl90IG1lbV9idXNfYWRkciA9IDA7CisJdTMyIG1lbV9zaXplID0gMDsKKwlpbnQgcmVnX25vOworCWludCBlcnI7CisJaW50IG9mZnNldDsKKworCUxJU1RfSEVBRChyZXMpOworCisJaWYgKCFkZXYtPm9mX25vZGUpCisJCXJldHVybiAtRU5PREVWOworCisJcm9ja2NoaXAgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnJvY2tjaGlwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyb2NrY2hpcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyb2NrY2hpcC0+ZGV2ID0gZGV2OworCisJZXJyID0gcm9ja2NoaXBfcGNpZV9wYXJzZV9kdChyb2NrY2hpcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShyb2NrY2hpcC0+YWNsa19wY2llKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGVuYWJsZSBhY2xrX3BjaWUgY2xvY2tcbiIpOworCQlnb3RvIGVycl9hY2xrX3BjaWU7CisJfQorCisJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKHJvY2tjaGlwLT5hY2xrX3BlcmZfcGNpZSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBlbmFibGUgYWNsa19wZXJmX3BjaWUgY2xvY2tcbiIpOworCQlnb3RvIGVycl9hY2xrX3BlcmZfcGNpZTsKKwl9CisKKwllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUocm9ja2NoaXAtPmhjbGtfcGNpZSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBlbmFibGUgaGNsa19wY2llIGNsb2NrXG4iKTsKKwkJZ290byBlcnJfaGNsa19wY2llOworCX0KKworCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShyb2NrY2hpcC0+Y2xrX3BjaWVfcG0pOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gZW5hYmxlIGhjbGtfcGNpZSBjbG9ja1xuIik7CisJCWdvdG8gZXJyX3BjaWVfcG07CisJfQorCisJZXJyID0gcm9ja2NoaXBfcGNpZV9zZXRfdnBjaWUocm9ja2NoaXApOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IHZwY2llIHJlZ3VsYXRvclxuIik7CisJCWdvdG8gZXJyX3NldF92cGNpZTsKKwl9CisKKwllcnIgPSByb2NrY2hpcF9wY2llX2luaXRfcG9ydChyb2NrY2hpcCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfdnBjaWU7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCByb2NrY2hpcCk7CisKKwlyb2NrY2hpcF9wY2llX2VuYWJsZV9pbnRlcnJ1cHRzKHJvY2tjaGlwKTsKKworCWVyciA9IHJvY2tjaGlwX3BjaWVfaW5pdF9pcnFfZG9tYWluKHJvY2tjaGlwKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfdnBjaWU7CisKKwllcnIgPSBvZl9wY2lfZ2V0X2hvc3RfYnJpZGdlX3Jlc291cmNlcyhkZXYtPm9mX25vZGUsIDAsIDB4ZmYsCisJCQkJCSAgICAgICAmcmVzLCAmaW9fYmFzZSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfdnBjaWU7CisKKwllcnIgPSBkZXZtX3JlcXVlc3RfcGNpX2J1c19yZXNvdXJjZXMoZGV2LCAmcmVzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl92cGNpZTsKKworCS8qIEdldCB0aGUgSS9PIGFuZCBtZW1vcnkgcmFuZ2VzIGZyb20gRFQgKi8KKwlpb19zaXplID0gMDsKKwlyZXNvdXJjZV9saXN0X2Zvcl9lYWNoX2VudHJ5KHdpbiwgJnJlcykgeworCQlzd2l0Y2ggKHJlc291cmNlX3R5cGUod2luLT5yZXMpKSB7CisJCWNhc2UgSU9SRVNPVVJDRV9JTzoKKwkJCWlvID0gd2luLT5yZXM7CisJCQlpby0+bmFtZSA9ICJJL08iOworCQkJaW9fc2l6ZSA9IHJlc291cmNlX3NpemUoaW8pOworCQkJaW9fYnVzX2FkZHIgPSBpby0+c3RhcnQgLSB3aW4tPm9mZnNldDsKKwkJCWVyciA9IHBjaV9yZW1hcF9pb3NwYWNlKGlvLCBpb19iYXNlKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlkZXZfd2FybihkZXYsICJlcnJvciAlZDogZmFpbGVkIHRvIG1hcCByZXNvdXJjZSAlcFJcbiIsCisJCQkJCSBlcnIsIGlvKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElPUkVTT1VSQ0VfTUVNOgorCQkJbWVtID0gd2luLT5yZXM7CisJCQltZW0tPm5hbWUgPSAiTUVNIjsKKwkJCW1lbV9zaXplID0gcmVzb3VyY2Vfc2l6ZShtZW0pOworCQkJbWVtX2J1c19hZGRyID0gbWVtLT5zdGFydCAtIHdpbi0+b2Zmc2V0OworCQkJYnJlYWs7CisJCWNhc2UgSU9SRVNPVVJDRV9CVVM6CisJCQlyb2NrY2hpcC0+cm9vdF9idXNfbnIgPSB3aW4tPnJlcy0+c3RhcnQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisJaWYgKG1lbV9zaXplKSB7CisJCWZvciAocmVnX25vID0gMDsgcmVnX25vIDwgKG1lbV9zaXplID4+IDIwKTsgcmVnX25vKyspIHsKKwkJCWVyciA9IHJvY2tjaGlwX3BjaWVfcHJvZ19vYl9hdHUocm9ja2NoaXAsIHJlZ19ubyArIDEsCisJCQkJCQkJQVhJX1dSQVBQRVJfTUVNX1dSSVRFLAorCQkJCQkJCTIwIC0gMSwKKwkJCQkJCQltZW1fYnVzX2FkZHIgKworCQkJCQkJCShyZWdfbm8gPDwgMjApLAorCQkJCQkJCTApOworCQkJaWYgKGVycikgeworCQkJCWRldl9lcnIoZGV2LCAicHJvZ3JhbSBSQyBtZW0gb3V0Ym91bmQgQVRVIGZhaWxlZFxuIik7CisJCQkJZ290byBlcnJfdnBjaWU7CisJCQl9CisJCX0KKwl9CisKKwllcnIgPSByb2NrY2hpcF9wY2llX3Byb2dfaWJfYXR1KHJvY2tjaGlwLCAyLCAzMiAtIDEsIDB4MCwgMCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgInByb2dyYW0gUkMgbWVtIGluYm91bmQgQVRVIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX3ZwY2llOworCX0KKworCW9mZnNldCA9IG1lbV9zaXplID4+IDIwOworCisJaWYgKGlvX3NpemUpIHsKKwkJZm9yIChyZWdfbm8gPSAwOyByZWdfbm8gPCAoaW9fc2l6ZSA+PiAyMCk7IHJlZ19ubysrKSB7CisJCQllcnIgPSByb2NrY2hpcF9wY2llX3Byb2dfb2JfYXR1KHJvY2tjaGlwLAorCQkJCQkJCXJlZ19ubyArIDEgKyBvZmZzZXQsCisJCQkJCQkJQVhJX1dSQVBQRVJfSU9fV1JJVEUsCisJCQkJCQkJMjAgLSAxLAorCQkJCQkJCWlvX2J1c19hZGRyICsKKwkJCQkJCQkocmVnX25vIDw8IDIwKSwKKwkJCQkJCQkwKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlkZXZfZXJyKGRldiwgInByb2dyYW0gUkMgaW8gb3V0Ym91bmQgQVRVIGZhaWxlZFxuIik7CisJCQkJZ290byBlcnJfdnBjaWU7CisJCQl9CisJCX0KKwl9CisKKwlidXMgPSBwY2lfc2Nhbl9yb290X2J1cygmcGRldi0+ZGV2LCAwLCAmcm9ja2NoaXBfcGNpZV9vcHMsIHJvY2tjaGlwLCAmcmVzKTsKKwlpZiAoIWJ1cykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl92cGNpZTsKKwl9CisKKwlwY2lfYnVzX3NpemVfYnJpZGdlcyhidXMpOworCXBjaV9idXNfYXNzaWduX3Jlc291cmNlcyhidXMpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZidXMtPmNoaWxkcmVuLCBub2RlKQorCQlwY2llX2J1c19jb25maWd1cmVfc2V0dGluZ3MoY2hpbGQpOworCisJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOworCisJZGV2X3dhcm4oZGV2LCAib25seSAzMi1iaXQgY29uZmlnIGFjY2Vzc2VzIHN1cHBvcnRlZDsgc21hbGxlciB3cml0ZXMgbWF5IGNvcnJ1cHQgYWRqYWNlbnQgUlcxQyBmaWVsZHNcbiIpOworCisJcmV0dXJuIGVycjsKKworZXJyX3ZwY2llOgorCWlmICghSVNfRVJSKHJvY2tjaGlwLT52cGNpZTN2MykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKHJvY2tjaGlwLT52cGNpZTN2Myk7CisJaWYgKCFJU19FUlIocm9ja2NoaXAtPnZwY2llMXY4KSkKKwkJcmVndWxhdG9yX2Rpc2FibGUocm9ja2NoaXAtPnZwY2llMXY4KTsKKwlpZiAoIUlTX0VSUihyb2NrY2hpcC0+dnBjaWUwdjkpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShyb2NrY2hpcC0+dnBjaWUwdjkpOworZXJyX3NldF92cGNpZToKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocm9ja2NoaXAtPmNsa19wY2llX3BtKTsKK2Vycl9wY2llX3BtOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShyb2NrY2hpcC0+aGNsa19wY2llKTsKK2Vycl9oY2xrX3BjaWU6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJvY2tjaGlwLT5hY2xrX3BlcmZfcGNpZSk7CitlcnJfYWNsa19wZXJmX3BjaWU6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJvY2tjaGlwLT5hY2xrX3BjaWUpOworZXJyX2FjbGtfcGNpZToKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByb2NrY2hpcF9wY2llX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktcGNpZSIsIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJvY2tjaGlwX3BjaWVfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInJvY2tjaGlwLXBjaWUiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSByb2NrY2hpcF9wY2llX29mX21hdGNoLAorCX0sCisJLnByb2JlID0gcm9ja2NoaXBfcGNpZV9wcm9iZSwKKworfTsKK2J1aWx0aW5fcGxhdGZvcm1fZHJpdmVyKHJvY2tjaGlwX3BjaWVfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1zcGVhcjEzeHguYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1zcGVhcjEzeHguYwppbmRleCBhNDA2MGI4Li4wOWFlZDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtc3BlYXIxM3h4LmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLXNwZWFyMTN4eC5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgpAQCAtMzU1LDcgKzM1NSw2IEBACiAJeyAuY29tcGF0aWJsZSA9ICJzdCxzcGVhcjEzNDAtcGNpZSIsIH0sCiAJe30sCiB9OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3BlYXIxM3h4X3BjaWVfb2ZfbWF0Y2gpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGVhcjEzeHhfcGNpZV9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IHNwZWFyMTN4eF9wY2llX3Byb2JlLApAQCAtMzY1LDE0ICszNjQsOCBAQAogCX0sCiB9OwogCi0vKiBTUEVBcjEzeHggUENJZSBkcml2ZXIgZG9lcyBub3QgYWxsb3cgbW9kdWxlIHVubG9hZCAqLwotCiBzdGF0aWMgaW50IF9faW5pdCBzcGVhcjEzeHhfcGNpZV9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3BlYXIxM3h4X3BjaWVfZHJpdmVyKTsKIH0KLW1vZHVsZV9pbml0KHNwZWFyMTN4eF9wY2llX2luaXQpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNUIE1pY3JvZWxlY3Ryb25pY3MgU1BFQXIxM3h4IFBDSWUgaG9zdCBjb250cm9sbGVyIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiUHJhdHl1c2ggQW5hbmQgPHByYXR5dXNoLmFuYW5kQGdtYWlsLmNvbT4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK2RldmljZV9pbml0Y2FsbChzcGVhcjEzeHhfcGNpZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS14aWxpbngtbndsLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUteGlsaW54LW53bC5jCmluZGV4IDBiNTk3ZDkuLjY3ZWFlNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS14aWxpbngtbndsLmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLXhpbGlueC1ud2wuYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tc2kuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGNpLmg+CkBAIC04NSwxMCArODUsMTUgQEAKICNkZWZpbmUgTVNHRl9NSVNDX1NSX01BU1RFUl9FUlIJCUJJVCg1KQogI2RlZmluZSBNU0dGX01JU0NfU1JfSV9BRERSX0VSUgkJQklUKDYpCiAjZGVmaW5lIE1TR0ZfTUlTQ19TUl9FX0FERFJfRVJSCQlCSVQoNykKLSNkZWZpbmUgTVNHRl9NSVNDX1NSX1VSX0RFVEVDVCAgICAgICAgICBCSVQoMjApCi0KLSNkZWZpbmUgTVNHRl9NSVNDX1NSX1BDSUVfQ09SRQkJR0VOTUFTSygxOCwgMTYpCi0jZGVmaW5lIE1TR0ZfTUlTQ19TUl9QQ0lFX0NPUkVfRVJSCUdFTk1BU0soMzEsIDIyKQorI2RlZmluZSBNU0dGX01JU0NfU1JfRkFUQUxfQUVSCQlCSVQoMTYpCisjZGVmaW5lIE1TR0ZfTUlTQ19TUl9OT05fRkFUQUxfQUVSCUJJVCgxNykKKyNkZWZpbmUgTVNHRl9NSVNDX1NSX0NPUlJfQUVSCQlCSVQoMTgpCisjZGVmaW5lIE1TR0ZfTUlTQ19TUl9VUl9ERVRFQ1QJCUJJVCgyMCkKKyNkZWZpbmUgTVNHRl9NSVNDX1NSX05PTl9GQVRBTF9ERVYJQklUKDIyKQorI2RlZmluZSBNU0dGX01JU0NfU1JfRkFUQUxfREVWCQlCSVQoMjMpCisjZGVmaW5lIE1TR0ZfTUlTQ19TUl9MSU5LX0RPV04JCUJJVCgyNCkKKyNkZWZpbmUgTVNHRl9NU0lDX1NSX0xJTktfQVVUT19CV0lEVEgJQklUKDI1KQorI2RlZmluZSBNU0dGX01TSUNfU1JfTElOS19CV0lEVEgJQklUKDI2KQogCiAjZGVmaW5lIE1TR0ZfTUlTQ19TUl9NQVNLQUxMCQkoTVNHRl9NSVNDX1NSX1JYTVNHX0FWQUlMIHwgXAogCQkJCQlNU0dGX01JU0NfU1JfUlhNU0dfT1ZFUiB8IFwKQEAgLTk2LDkgKzEwMSwxNSBAQAogCQkJCQlNU0dGX01JU0NfU1JfTUFTVEVSX0VSUiB8IFwKIAkJCQkJTVNHRl9NSVNDX1NSX0lfQUREUl9FUlIgfCBcCiAJCQkJCU1TR0ZfTUlTQ19TUl9FX0FERFJfRVJSIHwgXAorCQkJCQlNU0dGX01JU0NfU1JfRkFUQUxfQUVSIHwgXAorCQkJCQlNU0dGX01JU0NfU1JfTk9OX0ZBVEFMX0FFUiB8IFwKKwkJCQkJTVNHRl9NSVNDX1NSX0NPUlJfQUVSIHwgXAogCQkJCQlNU0dGX01JU0NfU1JfVVJfREVURUNUIHwgXAotCQkJCQlNU0dGX01JU0NfU1JfUENJRV9DT1JFIHwgXAotCQkJCQlNU0dGX01JU0NfU1JfUENJRV9DT1JFX0VSUikKKwkJCQkJTVNHRl9NSVNDX1NSX05PTl9GQVRBTF9ERVYgfCBcCisJCQkJCU1TR0ZfTUlTQ19TUl9GQVRBTF9ERVYgfCBcCisJCQkJCU1TR0ZfTUlTQ19TUl9MSU5LX0RPV04gfCBcCisJCQkJCU1TR0ZfTVNJQ19TUl9MSU5LX0FVVE9fQldJRFRIIHwgXAorCQkJCQlNU0dGX01TSUNfU1JfTElOS19CV0lEVEgpCiAKIC8qIExlZ2FjeSBpbnRlcnJ1cHQgc3RhdHVzIG1hc2sgYml0cyAqLwogI2RlZmluZSBNU0dGX0xFR19TUl9JTlRBCQlCSVQoMCkKQEAgLTEwOSw4ICsxMjAsOCBAQAogCQkJCQlNU0dGX0xFR19TUl9JTlRDIHwgTVNHRl9MRUdfU1JfSU5URCkKIAogLyogTVNJIGludGVycnVwdCBzdGF0dXMgbWFzayBiaXRzICovCi0jZGVmaW5lIE1TR0ZfTVNJX1NSX0xPX01BU0sJCUJJVCgwKQotI2RlZmluZSBNU0dGX01TSV9TUl9ISV9NQVNLCQlCSVQoMCkKKyNkZWZpbmUgTVNHRl9NU0lfU1JfTE9fTUFTSwkJR0VOTUFTSygzMSwgMCkKKyNkZWZpbmUgTVNHRl9NU0lfU1JfSElfTUFTSwkJR0VOTUFTSygzMSwgMCkKIAogI2RlZmluZSBNU0lJX1BSRVNFTlQJCQlCSVQoMCkKICNkZWZpbmUgTVNJSV9FTkFCTEUJCQlCSVQoMCkKQEAgLTI5MSw4ICszMDIsMjkgQEAKIAkJZGV2X2VycihwY2llLT5kZXYsCiAJCQkiSW4gTWlzYyBFZ3Jlc3MgYWRkcmVzcyB0cmFuc2xhdGlvbiBlcnJvclxuIik7CiAKLQlpZiAobWlzY19zdGF0ICYgTVNHRl9NSVNDX1NSX1BDSUVfQ09SRV9FUlIpCi0JCWRldl9lcnIocGNpZS0+ZGV2LCAiUENJZSBDb3JlIGVycm9yXG4iKTsKKwlpZiAobWlzY19zdGF0ICYgTVNHRl9NSVNDX1NSX0ZBVEFMX0FFUikKKwkJZGV2X2VycihwY2llLT5kZXYsICJGYXRhbCBFcnJvciBpbiBBRVIgQ2FwYWJpbGl0eVxuIik7CisKKwlpZiAobWlzY19zdGF0ICYgTVNHRl9NSVNDX1NSX05PTl9GQVRBTF9BRVIpCisJCWRldl9lcnIocGNpZS0+ZGV2LCAiTm9uLUZhdGFsIEVycm9yIGluIEFFUiBDYXBhYmlsaXR5XG4iKTsKKworCWlmIChtaXNjX3N0YXQgJiBNU0dGX01JU0NfU1JfQ09SUl9BRVIpCisJCWRldl9lcnIocGNpZS0+ZGV2LCAiQ29ycmVjdGFibGUgRXJyb3IgaW4gQUVSIENhcGFiaWxpdHlcbiIpOworCisJaWYgKG1pc2Nfc3RhdCAmIE1TR0ZfTUlTQ19TUl9VUl9ERVRFQ1QpCisJCWRldl9lcnIocGNpZS0+ZGV2LCAiVW5zdXBwb3J0ZWQgcmVxdWVzdCBEZXRlY3RlZFxuIik7CisKKwlpZiAobWlzY19zdGF0ICYgTVNHRl9NSVNDX1NSX05PTl9GQVRBTF9ERVYpCisJCWRldl9lcnIocGNpZS0+ZGV2LCAiTm9uLUZhdGFsIEVycm9yIERldGVjdGVkXG4iKTsKKworCWlmIChtaXNjX3N0YXQgJiBNU0dGX01JU0NfU1JfRkFUQUxfREVWKQorCQlkZXZfZXJyKHBjaWUtPmRldiwgIkZhdGFsIEVycm9yIERldGVjdGVkXG4iKTsKKworCWlmIChtaXNjX3N0YXQgJiBNU0dGX01TSUNfU1JfTElOS19BVVRPX0JXSURUSCkKKwkJZGV2X2luZm8ocGNpZS0+ZGV2LCAiTGluayBBdXRvbm9tb3VzIEJhbmR3aWR0aCBNYW5hZ2VtZW50IFN0YXR1cyBiaXQgc2V0XG4iKTsKKworCWlmIChtaXNjX3N0YXQgJiBNU0dGX01TSUNfU1JfTElOS19CV0lEVEgpCisJCWRldl9pbmZvKHBjaWUtPmRldiwgIkxpbmsgQmFuZHdpZHRoIE1hbmFnZW1lbnQgU3RhdHVzIGJpdCBzZXRcbiIpOwogCiAJLyogQ2xlYXIgbWlzYyBpbnRlcnJ1cHQgc3RhdHVzICovCiAJbndsX2JyaWRnZV93cml0ZWwocGNpZSwgbWlzY19zdGF0LCBNU0dGX01JU0NfU1RBVFVTKTsKQEAgLTQ1OSw0MCArNDkxLDYgQEAKIAkuZnJlZSAgID0gbndsX2lycV9kb21haW5fZnJlZSwKIH07CiAKLXN0YXRpYyB2b2lkIG53bF9tc2lfZnJlZV9pcnFfZG9tYWluKHN0cnVjdCBud2xfcGNpZSAqcGNpZSkKLXsKLQlzdHJ1Y3QgbndsX21zaSAqbXNpID0gJnBjaWUtPm1zaTsKLQotCWlmIChtc2ktPmlycV9tc2kwKQotCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcl9hbmRfZGF0YShtc2ktPmlycV9tc2kwLCBOVUxMLCBOVUxMKTsKLQlpZiAobXNpLT5pcnFfbXNpMSkKLQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXJfYW5kX2RhdGEobXNpLT5pcnFfbXNpMSwgTlVMTCwgTlVMTCk7Ci0KLQlpZiAobXNpLT5tc2lfZG9tYWluKQotCQlpcnFfZG9tYWluX3JlbW92ZShtc2ktPm1zaV9kb21haW4pOwotCWlmIChtc2ktPmRldl9kb21haW4pCi0JCWlycV9kb21haW5fcmVtb3ZlKG1zaS0+ZGV2X2RvbWFpbik7Ci0KLQlrZnJlZShtc2ktPmJpdG1hcCk7Ci0JbXNpLT5iaXRtYXAgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBud2xfcGNpZV9mcmVlX2lycV9kb21haW4oc3RydWN0IG53bF9wY2llICpwY2llKQotewotCWludCBpOwotCXUzMiBpcnE7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSU5UWF9OVU07IGkrKykgewotCQlpcnEgPSBpcnFfZmluZF9tYXBwaW5nKHBjaWUtPmxlZ2FjeV9pcnFfZG9tYWluLCBpICsgMSk7Ci0JCWlmIChpcnEgPiAwKQotCQkJaXJxX2Rpc3Bvc2VfbWFwcGluZyhpcnEpOwotCX0KLQlpZiAocGNpZS0+bGVnYWN5X2lycV9kb21haW4pCi0JCWlycV9kb21haW5fcmVtb3ZlKHBjaWUtPmxlZ2FjeV9pcnFfZG9tYWluKTsKLQotCW53bF9tc2lfZnJlZV9pcnFfZG9tYWluKHBjaWUpOwotfQotCiBzdGF0aWMgaW50IG53bF9wY2llX2luaXRfbXNpX2lycV9kb21haW4oc3RydWN0IG53bF9wY2llICpwY2llKQogewogI2lmZGVmIENPTkZJR19QQ0lfTVNJCkBAIC04NjcsMjUgKzg2NSwxMiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbndsX3BjaWVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG53bF9wY2llICpwY2llID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlud2xfcGNpZV9mcmVlX2lycV9kb21haW4ocGNpZSk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG53bF9wY2llX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJud2wtcGNpZSIsCisJCS5zdXBwcmVzc19iaW5kX2F0dHJzID0gdHJ1ZSwKIAkJLm9mX21hdGNoX3RhYmxlID0gbndsX3BjaWVfb2ZfbWF0Y2gsCiAJfSwKIAkucHJvYmUgPSBud2xfcGNpZV9wcm9iZSwKLQkucmVtb3ZlID0gbndsX3BjaWVfcmVtb3ZlLAogfTsKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobndsX3BjaWVfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiWGlsaW54LCBJbmMiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTldMIFBDSWUgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CitidWlsdGluX3BsYXRmb3JtX2RyaXZlcihud2xfcGNpZV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLXhpbGlueC5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLXhpbGlueC5jCmluZGV4IGEzMGUwMTYuLmJlNTY4MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS14aWxpbnguYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUteGlsaW54LmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgpAQCAtMTAxLDcgKzEwMSw4IEBACiAgKiBAbXNpX3BhZ2VzOiBNU0kgcGFnZXMKICAqIEByb290X2J1c25vOiBSb290IEJ1cyBudW1iZXIKICAqIEBkZXY6IERldmljZSBwb2ludGVyCi0gKiBAaXJxX2RvbWFpbjogSVJRIGRvbWFpbiBwb2ludGVyCisgKiBAbXNpX2RvbWFpbjogTVNJIElSUSBkb21haW4gcG9pbnRlcgorICogQGxlZ19kb21haW46IExlZ2FjeSBJUlEgZG9tYWluIHBvaW50ZXIKICAqIEByZXNvdXJjZXM6IEJ1cyBSZXNvdXJjZXMKICAqLwogc3RydWN0IHhpbGlueF9wY2llX3BvcnQgewpAQCAtMTEwLDcgKzExMSw4IEBACiAJdW5zaWduZWQgbG9uZyBtc2lfcGFnZXM7CiAJdTggcm9vdF9idXNubzsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGlycV9kb21haW4gKmlycV9kb21haW47CisJc3RydWN0IGlycV9kb21haW4gKm1zaV9kb21haW47CisJc3RydWN0IGlycV9kb21haW4gKmxlZ19kb21haW47CiAJc3RydWN0IGxpc3RfaGVhZCByZXNvdXJjZXM7CiB9OwogCkBAIC0xNjgsMTMgKzE3MCw2IEBACiAJaWYgKGJ1cy0+bnVtYmVyID09IHBvcnQtPnJvb3RfYnVzbm8gJiYgZGV2Zm4gPiAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQkvKgotCSAqIERvIG5vdCByZWFkIG1vcmUgdGhhbiBvbmUgZGV2aWNlIG9uIHRoZSBidXMgZGlyZWN0bHkgYXR0YWNoZWQKLQkgKiB0byBSQy4KLQkgKi8KLQlpZiAoYnVzLT5wcmltYXJ5ID09IHBvcnQtPnJvb3RfYnVzbm8gJiYgZGV2Zm4gPiAwKQotCQlyZXR1cm4gZmFsc2U7Ci0KIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMjE5LDEzICsyMTQsMTUgQEAKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKm1zaTsKIAlzdHJ1Y3QgeGlsaW54X3BjaWVfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgaXJxX2RhdGEgKmQgPSBpcnFfZ2V0X2lycV9kYXRhKGlycSk7CisJaXJxX2h3X251bWJlcl90IGh3aXJxID0gaXJxZF90b19od2lycShkKTsKIAotCWlmICghdGVzdF9iaXQoaXJxLCBtc2lfaXJxX2luX3VzZSkpIHsKKwlpZiAoIXRlc3RfYml0KGh3aXJxLCBtc2lfaXJxX2luX3VzZSkpIHsKIAkJbXNpID0gaXJxX2dldF9tc2lfZGVzYyhpcnEpOwogCQlwb3J0ID0gbXNpX2Rlc2NfdG9fcGNpX3N5c2RhdGEobXNpKTsKIAkJZGV2X2Vycihwb3J0LT5kZXYsICJUcnlpbmcgdG8gZnJlZSB1bnVzZWQgTVNJIyVkXG4iLCBpcnEpOwogCX0gZWxzZSB7Ci0JCWNsZWFyX2JpdChpcnEsIG1zaV9pcnFfaW5fdXNlKTsKKwkJY2xlYXJfYml0KGh3aXJxLCBtc2lfaXJxX2luX3VzZSk7CiAJfQogfQogCkBAIC0yNTcsNiArMjU0LDcgQEAKIAkJCQkgICAgdW5zaWduZWQgaW50IGlycSkKIHsKIAl4aWxpbnhfcGNpZV9kZXN0cm95X21zaShpcnEpOworCWlycV9kaXNwb3NlX21hcHBpbmcoaXJxKTsKIH0KIAogLyoqCkBAIC0yODEsNyArMjc5LDcgQEAKIAlpZiAoaHdpcnEgPCAwKQogCQlyZXR1cm4gaHdpcnE7CiAKLQlpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcocG9ydC0+aXJxX2RvbWFpbiwgaHdpcnEpOworCWlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhwb3J0LT5tc2lfZG9tYWluLCBod2lycSk7CiAJaWYgKCFpcnEpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC00MzIsNyArNDMwLDcgQEAKIAkJLyogQ2hlY2sgd2hldGhlciBpbnRlcnJ1cHQgdmFsaWQgKi8KIAkJaWYgKCEodmFsICYgWElMSU5YX1BDSUVfUlBJRlIxX0lOVFJfVkFMSUQpKSB7CiAJCQlkZXZfd2Fybihwb3J0LT5kZXYsICJSUCBJbnRyIEZJRk8xIHJlYWQgZXJyb3JcbiIpOwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQkJZ290byBlcnJvcjsKIAkJfQogCiAJCWlmICghKHZhbCAmIFhJTElOWF9QQ0lFX1JQSUZSMV9NU0lfSU5UUikpIHsKQEAgLTQ0Myw3ICs0NDEsNyBAQAogCQkJLyogSGFuZGxlIElOVHggSW50ZXJydXB0ICovCiAJCQl2YWwgPSAoKHZhbCAmIFhJTElOWF9QQ0lFX1JQSUZSMV9JTlRSX01BU0spID4+CiAJCQkJWElMSU5YX1BDSUVfUlBJRlIxX0lOVFJfU0hJRlQpICsgMTsKLQkJCWdlbmVyaWNfaGFuZGxlX2lycShpcnFfZmluZF9tYXBwaW5nKHBvcnQtPmlycV9kb21haW4sCisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxX2ZpbmRfbWFwcGluZyhwb3J0LT5sZWdfZG9tYWluLAogCQkJCQkJCSAgICB2YWwpKTsKIAkJfQogCX0KQEAgLTQ1NCw3ICs0NTIsNyBAQAogCiAJCWlmICghKHZhbCAmIFhJTElOWF9QQ0lFX1JQSUZSMV9JTlRSX1ZBTElEKSkgewogCQkJZGV2X3dhcm4ocG9ydC0+ZGV2LCAiUlAgSW50ciBGSUZPMSByZWFkIGVycm9yXG4iKTsKLQkJCXJldHVybiBJUlFfSEFORExFRDsKKwkJCWdvdG8gZXJyb3I7CiAJCX0KIAogCQlpZiAodmFsICYgWElMSU5YX1BDSUVfUlBJRlIxX01TSV9JTlRSKSB7CkBAIC00OTksNiArNDk3LDcgQEAKIAlpZiAoc3RhdHVzICYgWElMSU5YX1BDSUVfSU5UUl9NU1RfRVJSUCkKIAkJZGV2X3dhcm4ocG9ydC0+ZGV2LCAiTWFzdGVyIGVycm9yIHBvaXNvblxuIik7CiAKK2Vycm9yOgogCS8qIENsZWFyIHRoZSBJbnRlcnJ1cHQgRGVjb2RlIHJlZ2lzdGVyICovCiAJcGNpZV93cml0ZShwb3J0LCBzdGF0dXMsIFhJTElOWF9QQ0lFX1JFR19JRFIpOwogCkBAIC01MDYsMzUgKzUwNSw2IEBACiB9CiAKIC8qKgotICogeGlsaW54X3BjaWVfZnJlZV9pcnFfZG9tYWluIC0gRnJlZSBJUlEgZG9tYWluCi0gKiBAcG9ydDogUENJZSBwb3J0IGluZm9ybWF0aW9uCi0gKi8KLXN0YXRpYyB2b2lkIHhpbGlueF9wY2llX2ZyZWVfaXJxX2RvbWFpbihzdHJ1Y3QgeGlsaW54X3BjaWVfcG9ydCAqcG9ydCkKLXsKLQlpbnQgaTsKLQl1MzIgaXJxLCBudW1faXJxczsKLQotCS8qIEZyZWUgSVJRIERvbWFpbiAqLwotCWlmIChJU19FTkFCTEVEKENPTkZJR19QQ0lfTVNJKSkgewotCi0JCWZyZWVfcGFnZXMocG9ydC0+bXNpX3BhZ2VzLCAwKTsKLQotCQludW1faXJxcyA9IFhJTElOWF9OVU1fTVNJX0lSUVM7Ci0JfSBlbHNlIHsKLQkJLyogSU5UeCAqLwotCQludW1faXJxcyA9IDQ7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG51bV9pcnFzOyBpKyspIHsKLQkJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhwb3J0LT5pcnFfZG9tYWluLCBpKTsKLQkJaWYgKGlycSA+IDApCi0JCQlpcnFfZGlzcG9zZV9tYXBwaW5nKGlycSk7Ci0JfQotCi0JaXJxX2RvbWFpbl9yZW1vdmUocG9ydC0+aXJxX2RvbWFpbik7Ci19Ci0KLS8qKgogICogeGlsaW54X3BjaWVfaW5pdF9pcnFfZG9tYWluIC0gSW5pdGlhbGl6ZSBJUlEgZG9tYWluCiAgKiBAcG9ydDogUENJZSBwb3J0IGluZm9ybWF0aW9uCiAgKgpAQCAtNTUzLDIxICs1MjMsMjEgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JcG9ydC0+aXJxX2RvbWFpbiA9IGlycV9kb21haW5fYWRkX2xpbmVhcihwY2llX2ludGNfbm9kZSwgNCwKKwlwb3J0LT5sZWdfZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKHBjaWVfaW50Y19ub2RlLCA0LAogCQkJCQkJICZpbnR4X2RvbWFpbl9vcHMsCiAJCQkJCQkgcG9ydCk7Ci0JaWYgKCFwb3J0LT5pcnFfZG9tYWluKSB7CisJaWYgKCFwb3J0LT5sZWdfZG9tYWluKSB7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBhIElOVHggSVJRIGRvbWFpblxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCS8qIFNldHVwIE1TSSAqLwogCWlmIChJU19FTkFCTEVEKENPTkZJR19QQ0lfTVNJKSkgewotCQlwb3J0LT5pcnFfZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKG5vZGUsCisJCXBvcnQtPm1zaV9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIobm9kZSwKIAkJCQkJCQkgWElMSU5YX05VTV9NU0lfSVJRUywKIAkJCQkJCQkgJm1zaV9kb21haW5fb3BzLAogCQkJCQkJCSAmeGlsaW54X3BjaWVfbXNpX2NoaXApOwotCQlpZiAoIXBvcnQtPmlycV9kb21haW4pIHsKKwkJaWYgKCFwb3J0LT5tc2lfZG9tYWluKSB7CiAJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgYSBNU0kgSVJRIGRvbWFpblxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtNzI0LDIxICs2OTQsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qKgotICogeGlsaW54X3BjaWVfcmVtb3ZlIC0gUmVtb3ZlIGZ1bmN0aW9uCi0gKiBAcGRldjogUGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIKLSAqCi0gKiBSZXR1cm46ICcwJyBhbHdheXMKLSAqLwotc3RhdGljIGludCB4aWxpbnhfcGNpZV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgeGlsaW54X3BjaWVfcG9ydCAqcG9ydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JeGlsaW54X3BjaWVfZnJlZV9pcnFfZG9tYWluKHBvcnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhpbGlueF9wY2llX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJ4bG54LGF4aS1wY2llLWhvc3QtMS4wMC5hIiwgfSwKIAl7fQpAQCAtNzUxLDEwICs3MDYsNSBAQAogCQkuc3VwcHJlc3NfYmluZF9hdHRycyA9IHRydWUsCiAJfSwKIAkucHJvYmUgPSB4aWxpbnhfcGNpZV9wcm9iZSwKLQkucmVtb3ZlID0geGlsaW54X3BjaWVfcmVtb3ZlLAogfTsKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoeGlsaW54X3BjaWVfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiWGlsaW54IEluYyIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJYaWxpbnggQVhJIFBDSWUgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitidWlsdGluX3BsYXRmb3JtX2RyaXZlcih4aWxpbnhfcGNpZV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC92bWQuYyBiL2RyaXZlcnMvcGNpL2hvc3Qvdm1kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlMjliNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL2hvc3Qvdm1kLmMKQEAgLTAsMCArMSw3NjggQEAKKy8qCisgKiBWb2x1bWUgTWFuYWdlbWVudCBEZXZpY2UgZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8YXNtL2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9tc2kuaD4KKyNpbmNsdWRlIDxhc20vbXNpZGVmLmg+CisKKyNkZWZpbmUgVk1EX0NGR0JBUgkwCisjZGVmaW5lIFZNRF9NRU1CQVIxCTIKKyNkZWZpbmUgVk1EX01FTUJBUjIJNAorCisvKgorICogTG9jayBmb3IgbWFuaXB1bGF0aW5nIFZNRCBJUlEgbGlzdHMuCisgKi8KK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGxpc3RfbG9jayk7CisKKy8qKgorICogc3RydWN0IHZtZF9pcnEgLSBwcml2YXRlIGRhdGEgdG8gbWFwIGRyaXZlciBJUlEgdG8gdGhlIFZNRCBzaGFyZWQgdmVjdG9yCisgKiBAbm9kZToJbGlzdCBpdGVtIGZvciBwYXJlbnQgdHJhdmVyc2FsLgorICogQHJjdToJUkNVIGNhbGxiYWNrIGl0ZW0gZm9yIGZyZWVpbmcuCisgKiBAaXJxOgliYWNrIHBvaW50ZXIgdG8gcGFyZW50LgorICogQGVuYWJsZWQ6CXRydWUgaWYgZHJpdmVyIGVuYWJsZWQgSVJRCisgKiBAdmlycToJdGhlIHZpcnR1YWwgSVJRIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSByZXF1ZXN0aW5nIGRyaXZlci4KKyAqCisgKiBFdmVyeSBNU0kvTVNJLVggSVJRIHJlcXVlc3RlZCBmb3IgYSBkZXZpY2UgaW4gYSBWTUQgZG9tYWluIHdpbGwgYmUgbWFwcGVkIHRvCisgKiBhIFZNRCBJUlEgdXNpbmcgdGhpcyBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCB2bWRfaXJxIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CisJc3RydWN0IHJjdV9oZWFkCQlyY3U7CisJc3RydWN0IHZtZF9pcnFfbGlzdAkqaXJxOworCWJvb2wJCQllbmFibGVkOworCXVuc2lnbmVkIGludAkJdmlycTsKK307CisKKy8qKgorICogc3RydWN0IHZtZF9pcnFfbGlzdCAtIGxpc3Qgb2YgZHJpdmVyIHJlcXVlc3RlZCBJUlFzIG1hcHBpbmcgdG8gYSBWTUQgdmVjdG9yCisgKiBAaXJxX2xpc3Q6CXRoZSBsaXN0IG9mIGlycSdzIHRoZSBWTUQgb25lIGRlbXV4ZXMgdG8uCisgKiBAY291bnQ6CW51bWJlciBvZiBjaGlsZCBJUlFzIGFzc2lnbmVkIHRvIHRoaXMgdmVjdG9yOyB1c2VkIHRvIHRyYWNrCisgKgkJc2hhcmluZy4KKyAqLworc3RydWN0IHZtZF9pcnFfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZAlpcnFfbGlzdDsKKwl1bnNpZ25lZCBpbnQJCWNvdW50OworfTsKKworc3RydWN0IHZtZF9kZXYgeworCXN0cnVjdCBwY2lfZGV2CQkqZGV2OworCisJc3BpbmxvY2tfdAkJY2ZnX2xvY2s7CisJY2hhciBfX2lvbWVtCQkqY2ZnYmFyOworCisJaW50IG1zaXhfY291bnQ7CisJc3RydWN0IHZtZF9pcnFfbGlzdAkqaXJxczsKKworCXN0cnVjdCBwY2lfc3lzZGF0YQlzeXNkYXRhOworCXN0cnVjdCByZXNvdXJjZQkJcmVzb3VyY2VzWzNdOworCXN0cnVjdCBpcnFfZG9tYWluCSppcnFfZG9tYWluOworCXN0cnVjdCBwY2lfYnVzCQkqYnVzOworCisjaWZkZWYgQ09ORklHX1g4Nl9ERVZfRE1BX09QUworCXN0cnVjdCBkbWFfbWFwX29wcwlkbWFfb3BzOworCXN0cnVjdCBkbWFfZG9tYWluCWRtYV9kb21haW47CisjZW5kaWYKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZtZF9kZXYgKnZtZF9mcm9tX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXJldHVybiBjb250YWluZXJfb2YoYnVzLT5zeXNkYXRhLCBzdHJ1Y3Qgdm1kX2Rldiwgc3lzZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGluZGV4X2Zyb21faXJxcyhzdHJ1Y3Qgdm1kX2RldiAqdm1kLAorCQkJCQkgICBzdHJ1Y3Qgdm1kX2lycV9saXN0ICppcnFzKQoreworCXJldHVybiBpcnFzIC0gdm1kLT5pcnFzOworfQorCisvKgorICogRHJpdmVycyBtYW5hZ2luZyBhIGRldmljZSBpbiBhIFZNRCBkb21haW4gYWxsb2NhdGUgdGhlaXIgb3duIElSUXMgYXMgYmVmb3JlLAorICogYnV0IHRoZSBNU0kgZW50cnkgZm9yIHRoZSBoYXJkd2FyZSBpdCdzIGRyaXZpbmcgd2lsbCBiZSBwcm9ncmFtbWVkIHdpdGggYQorICogZGVzdGluYXRpb24gSUQgZm9yIHRoZSBWTUQgTVNJLVggdGFibGUuICBUaGUgVk1EIG11eGVzIGludGVycnVwdHMgaW4gaXRzCisgKiBkb21haW4gaW50byBvbmUgb2YgaXRzIG93biwgYW5kIHRoZSBWTUQgZHJpdmVyIGRlLW11eGVzIHRoZXNlIGZvciB0aGUKKyAqIGhhbmRsZXJzIHNoYXJpbmcgdGhhdCBWTUQgSVJRLiAgVGhlIHZtZCBpcnFfZG9tYWluIHByb3ZpZGVzIHRoZSBvcGVyYXRpb25zCisgKiBhbmQgaXJxX2NoaXAgdG8gc2V0IHRoaXMgdXAuCisgKi8KK3N0YXRpYyB2b2lkIHZtZF9jb21wb3NlX21zaV9tc2coc3RydWN0IGlycV9kYXRhICpkYXRhLCBzdHJ1Y3QgbXNpX21zZyAqbXNnKQoreworCXN0cnVjdCB2bWRfaXJxICp2bWRpcnEgPSBkYXRhLT5jaGlwX2RhdGE7CisJc3RydWN0IHZtZF9pcnFfbGlzdCAqaXJxID0gdm1kaXJxLT5pcnE7CisJc3RydWN0IHZtZF9kZXYgKnZtZCA9IGlycV9kYXRhX2dldF9pcnFfaGFuZGxlcl9kYXRhKGRhdGEpOworCisJbXNnLT5hZGRyZXNzX2hpID0gTVNJX0FERFJfQkFTRV9ISTsKKwltc2ctPmFkZHJlc3NfbG8gPSBNU0lfQUREUl9CQVNFX0xPIHwKKwkJCSAgTVNJX0FERFJfREVTVF9JRChpbmRleF9mcm9tX2lycXModm1kLCBpcnEpKTsKKwltc2ctPmRhdGEgPSAwOworfQorCisvKgorICogV2UgcmVseSBvbiBNU0lfRkxBR19VU0VfREVGX0NISVBfT1BTIHRvIHNldCB0aGUgSVJRIG1hc2svdW5tYXNrIG9wcy4KKyAqLworc3RhdGljIHZvaWQgdm1kX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCB2bWRfaXJxICp2bWRpcnEgPSBkYXRhLT5jaGlwX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CisJV0FSTl9PTih2bWRpcnEtPmVuYWJsZWQpOworCWxpc3RfYWRkX3RhaWxfcmN1KCZ2bWRpcnEtPm5vZGUsICZ2bWRpcnEtPmlycS0+aXJxX2xpc3QpOworCXZtZGlycS0+ZW5hYmxlZCA9IHRydWU7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOworCisJZGF0YS0+Y2hpcC0+aXJxX3VubWFzayhkYXRhKTsKK30KKworc3RhdGljIHZvaWQgdm1kX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3Qgdm1kX2lycSAqdm1kaXJxID0gZGF0YS0+Y2hpcF9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYXRhLT5jaGlwLT5pcnFfbWFzayhkYXRhKTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CisJaWYgKHZtZGlycS0+ZW5hYmxlZCkgeworCQlsaXN0X2RlbF9yY3UoJnZtZGlycS0+bm9kZSk7CisJCXZtZGlycS0+ZW5hYmxlZCA9IGZhbHNlOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBYWFg6IFN0dWJiZWQgdW50aWwgd2UgZGV2ZWxvcCBhY2NlcHRhYmxlIHdheSB0byBub3QgY3JlYXRlIGNvbmZsaWN0cyB3aXRoCisgKiBvdGhlciBkZXZpY2VzIHNoYXJpbmcgdGhlIHNhbWUgdmVjdG9yLgorICovCitzdGF0aWMgaW50IHZtZF9pcnFfc2V0X2FmZmluaXR5KHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwKKwkJCQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCwgYm9vbCBmb3JjZSkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB2bWRfbXNpX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCQk9ICJWTUQtTVNJIiwKKwkuaXJxX2VuYWJsZQkJPSB2bWRfaXJxX2VuYWJsZSwKKwkuaXJxX2Rpc2FibGUJCT0gdm1kX2lycV9kaXNhYmxlLAorCS5pcnFfY29tcG9zZV9tc2lfbXNnCT0gdm1kX2NvbXBvc2VfbXNpX21zZywKKwkuaXJxX3NldF9hZmZpbml0eQk9IHZtZF9pcnFfc2V0X2FmZmluaXR5LAorfTsKKworc3RhdGljIGlycV9od19udW1iZXJfdCB2bWRfZ2V0X2h3aXJxKHN0cnVjdCBtc2lfZG9tYWluX2luZm8gKmluZm8sCisJCQkJICAgICBtc2lfYWxsb2NfaW5mb190ICphcmcpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBYWFg6IFdlIGNhbiBiZSBldmVuIHNtYXJ0ZXIgc2VsZWN0aW5nIHRoZSBiZXN0IElSUSBvbmNlIHdlIHNvbHZlIHRoZQorICogYWZmaW5pdHkgcHJvYmxlbS4KKyAqLworc3RhdGljIHN0cnVjdCB2bWRfaXJxX2xpc3QgKnZtZF9uZXh0X2lycShzdHJ1Y3Qgdm1kX2RldiAqdm1kLCBzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MpCit7CisJaW50IGksIGJlc3QgPSAxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWRlc2MtPm1zaV9hdHRyaWIuaXNfbXNpeCB8fCB2bWQtPm1zaXhfY291bnQgPT0gMSkKKwkJcmV0dXJuICZ2bWQtPmlycXNbMF07CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDE7IGkgPCB2bWQtPm1zaXhfY291bnQ7IGkrKykKKwkJaWYgKHZtZC0+aXJxc1tpXS5jb3VudCA8IHZtZC0+aXJxc1tiZXN0XS5jb3VudCkKKwkJCWJlc3QgPSBpOworCXZtZC0+aXJxc1tiZXN0XS5jb3VudCsrOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAmdm1kLT5pcnFzW2Jlc3RdOworfQorCitzdGF0aWMgaW50IHZtZF9tc2lfaW5pdChzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLCBzdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvICppbmZvLAorCQkJdW5zaWduZWQgaW50IHZpcnEsIGlycV9od19udW1iZXJfdCBod2lycSwKKwkJCW1zaV9hbGxvY19pbmZvX3QgKmFyZykKK3sKKwlzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2MgPSBhcmctPmRlc2M7CisJc3RydWN0IHZtZF9kZXYgKnZtZCA9IHZtZF9mcm9tX2J1cyhtc2lfZGVzY190b19wY2lfZGV2KGRlc2MpLT5idXMpOworCXN0cnVjdCB2bWRfaXJxICp2bWRpcnEgPSBremFsbG9jKHNpemVvZigqdm1kaXJxKSwgR0ZQX0tFUk5FTCk7CisJdW5zaWduZWQgaW50IGluZGV4LCB2ZWN0b3I7CisKKwlpZiAoIXZtZGlycSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlJTklUX0xJU1RfSEVBRCgmdm1kaXJxLT5ub2RlKTsKKwl2bWRpcnEtPmlycSA9IHZtZF9uZXh0X2lycSh2bWQsIGRlc2MpOworCXZtZGlycS0+dmlycSA9IHZpcnE7CisJaW5kZXggPSBpbmRleF9mcm9tX2lycXModm1kLCB2bWRpcnEtPmlycSk7CisJdmVjdG9yID0gcGNpX2lycV92ZWN0b3Iodm1kLT5kZXYsIGluZGV4KTsKKworCWlycV9kb21haW5fc2V0X2luZm8oZG9tYWluLCB2aXJxLCB2ZWN0b3IsIGluZm8tPmNoaXAsIHZtZGlycSwKKwkJCSAgICBoYW5kbGVfdW50cmFja2VkX2lycSwgdm1kLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdm1kX21zaV9mcmVlKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sCisJCQlzdHJ1Y3QgbXNpX2RvbWFpbl9pbmZvICppbmZvLCB1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlzdHJ1Y3Qgdm1kX2lycSAqdm1kaXJxID0gaXJxX2dldF9jaGlwX2RhdGEodmlycSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN5bmNocm9uaXplX3JjdSgpOworCisJLyogWFhYOiBQb3RlbnRpYWwgb3B0aW1pemF0aW9uIHRvIHJlYmFsYW5jZSAqLworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CisJdm1kaXJxLT5pcnEtPmNvdW50LS07CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOworCisJa2ZyZWVfcmN1KHZtZGlycSwgcmN1KTsKK30KKworc3RhdGljIGludCB2bWRfbXNpX3ByZXBhcmUoc3RydWN0IGlycV9kb21haW4gKmRvbWFpbiwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgaW50IG52ZWMsIG1zaV9hbGxvY19pbmZvX3QgKmFyZykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3Qgdm1kX2RldiAqdm1kID0gdm1kX2Zyb21fYnVzKHBkZXYtPmJ1cyk7CisKKwlpZiAobnZlYyA+IHZtZC0+bXNpeF9jb3VudCkKKwkJcmV0dXJuIHZtZC0+bXNpeF9jb3VudDsKKworCW1lbXNldChhcmcsIDAsIHNpemVvZigqYXJnKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZtZF9zZXRfZGVzYyhtc2lfYWxsb2NfaW5mb190ICphcmcsIHN0cnVjdCBtc2lfZGVzYyAqZGVzYykKK3sKKwlhcmctPmRlc2MgPSBkZXNjOworfQorCitzdGF0aWMgc3RydWN0IG1zaV9kb21haW5fb3BzIHZtZF9tc2lfZG9tYWluX29wcyA9IHsKKwkuZ2V0X2h3aXJxCT0gdm1kX2dldF9od2lycSwKKwkubXNpX2luaXQJPSB2bWRfbXNpX2luaXQsCisJLm1zaV9mcmVlCT0gdm1kX21zaV9mcmVlLAorCS5tc2lfcHJlcGFyZQk9IHZtZF9tc2lfcHJlcGFyZSwKKwkuc2V0X2Rlc2MJPSB2bWRfc2V0X2Rlc2MsCit9OworCitzdGF0aWMgc3RydWN0IG1zaV9kb21haW5faW5mbyB2bWRfbXNpX2RvbWFpbl9pbmZvID0geworCS5mbGFncwkJPSBNU0lfRkxBR19VU0VfREVGX0RPTV9PUFMgfCBNU0lfRkxBR19VU0VfREVGX0NISVBfT1BTIHwKKwkJCSAgTVNJX0ZMQUdfUENJX01TSVgsCisJLm9wcwkJPSAmdm1kX21zaV9kb21haW5fb3BzLAorCS5jaGlwCQk9ICZ2bWRfbXNpX2NvbnRyb2xsZXIsCit9OworCisjaWZkZWYgQ09ORklHX1g4Nl9ERVZfRE1BX09QUworLyoKKyAqIFZNRCByZXBsYWNlcyB0aGUgcmVxdWVzdGVyIElEIHdpdGggaXRzIG93bi4gIERNQSBtYXBwaW5ncyBmb3IgZGV2aWNlcyBpbiBhCisgKiBWTUQgZG9tYWluIG5lZWQgdG8gYmUgbWFwcGVkIGZvciB0aGUgVk1ELCBub3QgdGhlIGRldmljZSByZXF1aXJpbmcKKyAqIHRoZSBtYXBwaW5nLgorICovCitzdGF0aWMgc3RydWN0IGRldmljZSAqdG9fdm1kX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHZtZF9kZXYgKnZtZCA9IHZtZF9mcm9tX2J1cyhwZGV2LT5idXMpOworCisJcmV0dXJuICZ2bWQtPmRldi0+ZGV2OworfQorCitzdGF0aWMgc3RydWN0IGRtYV9tYXBfb3BzICp2bWRfZG1hX29wcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGdldF9kbWFfb3BzKHRvX3ZtZF9kZXYoZGV2KSk7Cit9CisKK3N0YXRpYyB2b2lkICp2bWRfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqYWRkciwKKwkJICAgICAgIGdmcF90IGZsYWcsIHVuc2lnbmVkIGxvbmcgYXR0cnMpCit7CisJcmV0dXJuIHZtZF9kbWFfb3BzKGRldiktPmFsbG9jKHRvX3ZtZF9kZXYoZGV2KSwgc2l6ZSwgYWRkciwgZmxhZywKKwkJCQkgICAgICAgYXR0cnMpOworfQorCitzdGF0aWMgdm9pZCB2bWRfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwKKwkJICAgICBkbWFfYWRkcl90IGFkZHIsIHVuc2lnbmVkIGxvbmcgYXR0cnMpCit7CisJcmV0dXJuIHZtZF9kbWFfb3BzKGRldiktPmZyZWUodG9fdm1kX2RldihkZXYpLCBzaXplLCB2YWRkciwgYWRkciwKKwkJCQkgICAgICBhdHRycyk7Cit9CisKK3N0YXRpYyBpbnQgdm1kX21tYXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJICAgIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGFkZHIsIHNpemVfdCBzaXplLAorCQkgICAgdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwlyZXR1cm4gdm1kX2RtYV9vcHMoZGV2KS0+bW1hcCh0b192bWRfZGV2KGRldiksIHZtYSwgY3B1X2FkZHIsIGFkZHIsCisJCQkJICAgICAgc2l6ZSwgYXR0cnMpOworfQorCitzdGF0aWMgaW50IHZtZF9nZXRfc2d0YWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZ190YWJsZSAqc2d0LAorCQkJICAgdm9pZCAqY3B1X2FkZHIsIGRtYV9hZGRyX3QgYWRkciwgc2l6ZV90IHNpemUsCisJCQkgICB1bnNpZ25lZCBsb25nIGF0dHJzKQoreworCXJldHVybiB2bWRfZG1hX29wcyhkZXYpLT5nZXRfc2d0YWJsZSh0b192bWRfZGV2KGRldiksIHNndCwgY3B1X2FkZHIsCisJCQkJCSAgICAgYWRkciwgc2l6ZSwgYXR0cnMpOworfQorCitzdGF0aWMgZG1hX2FkZHJfdCB2bWRfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCit7CisJcmV0dXJuIHZtZF9kbWFfb3BzKGRldiktPm1hcF9wYWdlKHRvX3ZtZF9kZXYoZGV2KSwgcGFnZSwgb2Zmc2V0LCBzaXplLAorCQkJCQkgIGRpciwgYXR0cnMpOworfQorCitzdGF0aWMgdm9pZCB2bWRfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwgc2l6ZV90IHNpemUsCisJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHVuc2lnbmVkIGxvbmcgYXR0cnMpCit7CisJdm1kX2RtYV9vcHMoZGV2KS0+dW5tYXBfcGFnZSh0b192bWRfZGV2KGRldiksIGFkZHIsIHNpemUsIGRpciwgYXR0cnMpOworfQorCitzdGF0aWMgaW50IHZtZF9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCisJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwlyZXR1cm4gdm1kX2RtYV9vcHMoZGV2KS0+bWFwX3NnKHRvX3ZtZF9kZXYoZGV2KSwgc2csIG5lbnRzLCBkaXIsIGF0dHJzKTsKK30KKworc3RhdGljIHZvaWQgdm1kX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorCQkJIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwl2bWRfZG1hX29wcyhkZXYpLT51bm1hcF9zZyh0b192bWRfZGV2KGRldiksIHNnLCBuZW50cywgZGlyLCBhdHRycyk7Cit9CisKK3N0YXRpYyB2b2lkIHZtZF9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyLAorCQkJCSAgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXZtZF9kbWFfb3BzKGRldiktPnN5bmNfc2luZ2xlX2Zvcl9jcHUodG9fdm1kX2RldihkZXYpLCBhZGRyLCBzaXplLCBkaXIpOworfQorCitzdGF0aWMgdm9pZCB2bWRfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwKKwkJCQkgICAgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwl2bWRfZG1hX29wcyhkZXYpLT5zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHRvX3ZtZF9kZXYoZGV2KSwgYWRkciwgc2l6ZSwKKwkJCQkJCSBkaXIpOworfQorCitzdGF0aWMgdm9pZCB2bWRfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQlpbnQgbmVudHMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwl2bWRfZG1hX29wcyhkZXYpLT5zeW5jX3NnX2Zvcl9jcHUodG9fdm1kX2RldihkZXYpLCBzZywgbmVudHMsIGRpcik7Cit9CisKK3N0YXRpYyB2b2lkIHZtZF9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCSAgIGludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXZtZF9kbWFfb3BzKGRldiktPnN5bmNfc2dfZm9yX2RldmljZSh0b192bWRfZGV2KGRldiksIHNnLCBuZW50cywgZGlyKTsKK30KKworc3RhdGljIGludCB2bWRfbWFwcGluZ19lcnJvcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkcikKK3sKKwlyZXR1cm4gdm1kX2RtYV9vcHMoZGV2KS0+bWFwcGluZ19lcnJvcih0b192bWRfZGV2KGRldiksIGFkZHIpOworfQorCitzdGF0aWMgaW50IHZtZF9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisJcmV0dXJuIHZtZF9kbWFfb3BzKGRldiktPmRtYV9zdXBwb3J0ZWQodG9fdm1kX2RldihkZXYpLCBtYXNrKTsKK30KKworI2lmZGVmIEFSQ0hfSEFTX0RNQV9HRVRfUkVRVUlSRURfTUFTSworc3RhdGljIHU2NCB2bWRfZ2V0X3JlcXVpcmVkX21hc2soc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiB2bWRfZG1hX29wcyhkZXYpLT5nZXRfcmVxdWlyZWRfbWFzayh0b192bWRfZGV2KGRldikpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHZtZF90ZWFyZG93bl9kbWFfb3BzKHN0cnVjdCB2bWRfZGV2ICp2bWQpCit7CisJc3RydWN0IGRtYV9kb21haW4gKmRvbWFpbiA9ICZ2bWQtPmRtYV9kb21haW47CisKKwlpZiAoZ2V0X2RtYV9vcHMoJnZtZC0+ZGV2LT5kZXYpKQorCQlkZWxfZG1hX2RvbWFpbihkb21haW4pOworfQorCisjZGVmaW5lIEFTU0lHTl9WTURfRE1BX09QUyhzb3VyY2UsIGRlc3QsIGZuKQlcCisJZG8gewkJCQkJXAorCQlpZiAoc291cmNlLT5mbikJCQlcCisJCQlkZXN0LT5mbiA9IHZtZF8jI2ZuOwlcCisJfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgdm1kX3NldHVwX2RtYV9vcHMoc3RydWN0IHZtZF9kZXYgKnZtZCkKK3sKKwljb25zdCBzdHJ1Y3QgZG1hX21hcF9vcHMgKnNvdXJjZSA9IGdldF9kbWFfb3BzKCZ2bWQtPmRldi0+ZGV2KTsKKwlzdHJ1Y3QgZG1hX21hcF9vcHMgKmRlc3QgPSAmdm1kLT5kbWFfb3BzOworCXN0cnVjdCBkbWFfZG9tYWluICpkb21haW4gPSAmdm1kLT5kbWFfZG9tYWluOworCisJZG9tYWluLT5kb21haW5fbnIgPSB2bWQtPnN5c2RhdGEuZG9tYWluOworCWRvbWFpbi0+ZG1hX29wcyA9IGRlc3Q7CisKKwlpZiAoIXNvdXJjZSkKKwkJcmV0dXJuOworCUFTU0lHTl9WTURfRE1BX09QUyhzb3VyY2UsIGRlc3QsIGFsbG9jKTsKKwlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBmcmVlKTsKKwlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBtbWFwKTsKKwlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBnZXRfc2d0YWJsZSk7CisJQVNTSUdOX1ZNRF9ETUFfT1BTKHNvdXJjZSwgZGVzdCwgbWFwX3BhZ2UpOworCUFTU0lHTl9WTURfRE1BX09QUyhzb3VyY2UsIGRlc3QsIHVubWFwX3BhZ2UpOworCUFTU0lHTl9WTURfRE1BX09QUyhzb3VyY2UsIGRlc3QsIG1hcF9zZyk7CisJQVNTSUdOX1ZNRF9ETUFfT1BTKHNvdXJjZSwgZGVzdCwgdW5tYXBfc2cpOworCUFTU0lHTl9WTURfRE1BX09QUyhzb3VyY2UsIGRlc3QsIHN5bmNfc2luZ2xlX2Zvcl9jcHUpOworCUFTU0lHTl9WTURfRE1BX09QUyhzb3VyY2UsIGRlc3QsIHN5bmNfc2luZ2xlX2Zvcl9kZXZpY2UpOworCUFTU0lHTl9WTURfRE1BX09QUyhzb3VyY2UsIGRlc3QsIHN5bmNfc2dfZm9yX2NwdSk7CisJQVNTSUdOX1ZNRF9ETUFfT1BTKHNvdXJjZSwgZGVzdCwgc3luY19zZ19mb3JfZGV2aWNlKTsKKwlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBtYXBwaW5nX2Vycm9yKTsKKwlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBkbWFfc3VwcG9ydGVkKTsKKyNpZmRlZiBBUkNIX0hBU19ETUFfR0VUX1JFUVVJUkVEX01BU0sKKwlBU1NJR05fVk1EX0RNQV9PUFMoc291cmNlLCBkZXN0LCBnZXRfcmVxdWlyZWRfbWFzayk7CisjZW5kaWYKKwlhZGRfZG1hX2RvbWFpbihkb21haW4pOworfQorI3VuZGVmIEFTU0lHTl9WTURfRE1BX09QUworI2Vsc2UKK3N0YXRpYyB2b2lkIHZtZF90ZWFyZG93bl9kbWFfb3BzKHN0cnVjdCB2bWRfZGV2ICp2bWQpIHt9CitzdGF0aWMgdm9pZCB2bWRfc2V0dXBfZG1hX29wcyhzdHJ1Y3Qgdm1kX2RldiAqdm1kKSB7fQorI2VuZGlmCisKK3N0YXRpYyBjaGFyIF9faW9tZW0gKnZtZF9jZmdfYWRkcihzdHJ1Y3Qgdm1kX2RldiAqdm1kLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzLAorCQkJCSAgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuKQoreworCWNoYXIgX19pb21lbSAqYWRkciA9IHZtZC0+Y2ZnYmFyICsKKwkJCSAgICAgKGJ1cy0+bnVtYmVyIDw8IDIwKSArIChkZXZmbiA8PCAxMikgKyByZWc7CisKKwlpZiAoKGFkZHIgLSB2bWQtPmNmZ2JhcikgKyBsZW4gPj0KKwkgICAgcmVzb3VyY2Vfc2l6ZSgmdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9DRkdCQVJdKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gYWRkcjsKK30KKworLyoKKyAqIENQVSBtYXkgZGVhZGxvY2sgaWYgY29uZmlnIHNwYWNlIGlzIG5vdCBzZXJpYWxpemVkIG9uIHNvbWUgdmVyc2lvbnMgb2YgdGhpcworICogaGFyZHdhcmUsIHNvIGFsbCBjb25maWcgc3BhY2UgYWNjZXNzIGlzIGRvbmUgdW5kZXIgYSBzcGlubG9jay4KKyAqLworc3RhdGljIGludCB2bWRfcGNpX3JlYWQoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLAorCQkJaW50IGxlbiwgdTMyICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgdm1kX2RldiAqdm1kID0gdm1kX2Zyb21fYnVzKGJ1cyk7CisJY2hhciBfX2lvbWVtICphZGRyID0gdm1kX2NmZ19hZGRyKHZtZCwgYnVzLCBkZXZmbiwgcmVnLCBsZW4pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWFkZHIpCisJCXJldHVybiAtRUZBVUxUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZtZC0+Y2ZnX2xvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKnZhbHVlID0gcmVhZGIoYWRkcik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKnZhbHVlID0gcmVhZHcoYWRkcik7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKnZhbHVlID0gcmVhZGwoYWRkcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2bWQtPmNmZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFZNRCBoL3cgY29udmVydHMgbm9uLXBvc3RlZCBjb25maWcgd3JpdGVzIHRvIHBvc3RlZCBtZW1vcnkgd3JpdGVzLiBUaGUKKyAqIHJlYWQtYmFjayBpbiB0aGlzIGZ1bmN0aW9uIGZvcmNlcyB0aGUgY29tcGxldGlvbiBzbyBpdCByZXR1cm5zIG9ubHkgYWZ0ZXIKKyAqIHRoZSBjb25maWcgc3BhY2Ugd2FzIHdyaXR0ZW4sIGFzIGV4cGVjdGVkLgorICovCitzdGF0aWMgaW50IHZtZF9wY2lfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLAorCQkJIGludCBsZW4sIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qgdm1kX2RldiAqdm1kID0gdm1kX2Zyb21fYnVzKGJ1cyk7CisJY2hhciBfX2lvbWVtICphZGRyID0gdm1kX2NmZ19hZGRyKHZtZCwgYnVzLCBkZXZmbiwgcmVnLCBsZW4pOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWFkZHIpCisJCXJldHVybiAtRUZBVUxUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZtZC0+Y2ZnX2xvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJd3JpdGViKHZhbHVlLCBhZGRyKTsKKwkJcmVhZGIoYWRkcik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJd3JpdGV3KHZhbHVlLCBhZGRyKTsKKwkJcmVhZHcoYWRkcik7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJd3JpdGVsKHZhbHVlLCBhZGRyKTsKKwkJcmVhZGwoYWRkcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2bWQtPmNmZ19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfb3BzIHZtZF9vcHMgPSB7CisJLnJlYWQJCT0gdm1kX3BjaV9yZWFkLAorCS53cml0ZQkJPSB2bWRfcGNpX3dyaXRlLAorfTsKKworc3RhdGljIHZvaWQgdm1kX2F0dGFjaF9yZXNvdXJjZXMoc3RydWN0IHZtZF9kZXYgKnZtZCkKK3sKKwl2bWQtPmRldi0+cmVzb3VyY2VbVk1EX01FTUJBUjFdLmNoaWxkID0gJnZtZC0+cmVzb3VyY2VzWzFdOworCXZtZC0+ZGV2LT5yZXNvdXJjZVtWTURfTUVNQkFSMl0uY2hpbGQgPSAmdm1kLT5yZXNvdXJjZXNbMl07Cit9CisKK3N0YXRpYyB2b2lkIHZtZF9kZXRhY2hfcmVzb3VyY2VzKHN0cnVjdCB2bWRfZGV2ICp2bWQpCit7CisJdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9NRU1CQVIxXS5jaGlsZCA9IE5VTEw7CisJdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9NRU1CQVIyXS5jaGlsZCA9IE5VTEw7Cit9CisKKy8qCisgKiBWTUQgZG9tYWlucyBzdGFydCBhdCAweDEwMDAgdG8gbm90IGNsYXNoIHdpdGggQUNQSSBfU0VHIGRvbWFpbnMuCisgKi8KK3N0YXRpYyBpbnQgdm1kX2ZpbmRfZnJlZV9kb21haW4odm9pZCkKK3sKKwlpbnQgZG9tYWluID0gMHhmZmZmOworCXN0cnVjdCBwY2lfYnVzICpidXMgPSBOVUxMOworCisJd2hpbGUgKChidXMgPSBwY2lfZmluZF9uZXh0X2J1cyhidXMpKSAhPSBOVUxMKQorCQlkb21haW4gPSBtYXhfdChpbnQsIGRvbWFpbiwgcGNpX2RvbWFpbl9ucihidXMpKTsKKwlyZXR1cm4gZG9tYWluICsgMTsKK30KKworc3RhdGljIGludCB2bWRfZW5hYmxlX2RvbWFpbihzdHJ1Y3Qgdm1kX2RldiAqdm1kKQoreworCXN0cnVjdCBwY2lfc3lzZGF0YSAqc2QgPSAmdm1kLT5zeXNkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXUzMiB1cHBlcl9iaXRzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKHJlc291cmNlcyk7CisKKwlyZXMgPSAmdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9DRkdCQVJdOworCXZtZC0+cmVzb3VyY2VzWzBdID0gKHN0cnVjdCByZXNvdXJjZSkgeworCQkubmFtZSAgPSAiVk1EIENGR0JBUiIsCisJCS5zdGFydCA9IDAsCisJCS5lbmQgICA9IChyZXNvdXJjZV9zaXplKHJlcykgPj4gMjApIC0gMSwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9CVVMgfCBJT1JFU09VUkNFX1BDSV9GSVhFRCwKKwl9OworCisJLyoKKwkgKiBJZiB0aGUgd2luZG93IGlzIGJlbG93IDRHQiwgY2xlYXIgSU9SRVNPVVJDRV9NRU1fNjQgc28gd2UgY2FuCisJICogcHV0IDMyLWJpdCByZXNvdXJjZXMgaW4gdGhlIHdpbmRvdy4KKwkgKgorCSAqIFRoZXJlJ3Mgbm8gaGFyZHdhcmUgcmVhc29uIHdoeSBhIDY0LWJpdCB3aW5kb3cgKmNvdWxkbid0KgorCSAqIGNvbnRhaW4gYSAzMi1iaXQgcmVzb3VyY2UsIGJ1dCBwYnVzX3NpemVfbWVtKCkgY29tcHV0ZXMgdGhlCisJICogYnJpZGdlIHdpbmRvdyBzaXplIGFzc3VtaW5nIGEgNjQtYml0IHdpbmRvdyB3aWxsIGNvbnRhaW4gbm8KKwkgKiAzMi1iaXQgcmVzb3VyY2VzLiAgX19wY2lfYXNzaWduX3Jlc291cmNlKCkgZW5mb3JjZXMgdGhhdAorCSAqIGFydGlmaWNpYWwgcmVzdHJpY3Rpb24gdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgd2lsbCBmaXQuCisJICoKKwkgKiBUaGUgb25seSB3YXkgd2UgY291bGQgdXNlIGEgNjQtYml0IG5vbi1wcmVmZWNoYWJsZSBNRU1CQVIgaXMKKwkgKiBpZiBpdHMgYWRkcmVzcyBpcyA8NEdCIHNvIHRoYXQgd2UgY2FuIGNvbnZlcnQgaXQgdG8gYSAzMi1iaXQKKwkgKiByZXNvdXJjZS4gIFRvIGJlIHZpc2libGUgdG8gdGhlIGhvc3QgT1MsIGFsbCBWTUQgZW5kcG9pbnRzIG11c3QKKwkgKiBiZSBpbml0aWFsbHkgY29uZmlndXJlZCBieSBwbGF0Zm9ybSBCSU9TLCB3aGljaCBpbmNsdWRlcyBzZXR0aW5nCisJICogdXAgdGhlc2UgcmVzb3VyY2VzLiAgV2UgY2FuIGFzc3VtZSB0aGUgZGV2aWNlIGlzIGNvbmZpZ3VyZWQKKwkgKiBhY2NvcmRpbmcgdG8gdGhlIHBsYXRmb3JtIG5lZWRzLgorCSAqLworCXJlcyA9ICZ2bWQtPmRldi0+cmVzb3VyY2VbVk1EX01FTUJBUjFdOworCXVwcGVyX2JpdHMgPSB1cHBlcl8zMl9iaXRzKHJlcy0+ZW5kKTsKKwlmbGFncyA9IHJlcy0+ZmxhZ3MgJiB+SU9SRVNPVVJDRV9TSVpFQUxJR047CisJaWYgKCF1cHBlcl9iaXRzKQorCQlmbGFncyAmPSB+SU9SRVNPVVJDRV9NRU1fNjQ7CisJdm1kLT5yZXNvdXJjZXNbMV0gPSAoc3RydWN0IHJlc291cmNlKSB7CisJCS5uYW1lICA9ICJWTUQgTUVNQkFSMSIsCisJCS5zdGFydCA9IHJlcy0+c3RhcnQsCisJCS5lbmQgICA9IHJlcy0+ZW5kLAorCQkuZmxhZ3MgPSBmbGFncywKKwkJLnBhcmVudCA9IHJlcywKKwl9OworCisJcmVzID0gJnZtZC0+ZGV2LT5yZXNvdXJjZVtWTURfTUVNQkFSMl07CisJdXBwZXJfYml0cyA9IHVwcGVyXzMyX2JpdHMocmVzLT5lbmQpOworCWZsYWdzID0gcmVzLT5mbGFncyAmIH5JT1JFU09VUkNFX1NJWkVBTElHTjsKKwlpZiAoIXVwcGVyX2JpdHMpCisJCWZsYWdzICY9IH5JT1JFU09VUkNFX01FTV82NDsKKwl2bWQtPnJlc291cmNlc1syXSA9IChzdHJ1Y3QgcmVzb3VyY2UpIHsKKwkJLm5hbWUgID0gIlZNRCBNRU1CQVIyIiwKKwkJLnN0YXJ0ID0gcmVzLT5zdGFydCArIDB4MjAwMCwKKwkJLmVuZCAgID0gcmVzLT5lbmQsCisJCS5mbGFncyA9IGZsYWdzLAorCQkucGFyZW50ID0gcmVzLAorCX07CisKKwlzZC0+dm1kX2RvbWFpbiA9IHRydWU7CisJc2QtPmRvbWFpbiA9IHZtZF9maW5kX2ZyZWVfZG9tYWluKCk7CisJaWYgKHNkLT5kb21haW4gPCAwKQorCQlyZXR1cm4gc2QtPmRvbWFpbjsKKworCXNkLT5ub2RlID0gcGNpYnVzX3RvX25vZGUodm1kLT5kZXYtPmJ1cyk7CisKKwl2bWQtPmlycV9kb21haW4gPSBwY2lfbXNpX2NyZWF0ZV9pcnFfZG9tYWluKE5VTEwsICZ2bWRfbXNpX2RvbWFpbl9pbmZvLAorCQkJCQkJICAgIHg4Nl92ZWN0b3JfZG9tYWluKTsKKwlpZiAoIXZtZC0+aXJxX2RvbWFpbikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwY2lfYWRkX3Jlc291cmNlKCZyZXNvdXJjZXMsICZ2bWQtPnJlc291cmNlc1swXSk7CisJcGNpX2FkZF9yZXNvdXJjZSgmcmVzb3VyY2VzLCAmdm1kLT5yZXNvdXJjZXNbMV0pOworCXBjaV9hZGRfcmVzb3VyY2UoJnJlc291cmNlcywgJnZtZC0+cmVzb3VyY2VzWzJdKTsKKwl2bWQtPmJ1cyA9IHBjaV9jcmVhdGVfcm9vdF9idXMoJnZtZC0+ZGV2LT5kZXYsIDAsICZ2bWRfb3BzLCBzZCwKKwkJCQkgICAgICAgJnJlc291cmNlcyk7CisJaWYgKCF2bWQtPmJ1cykgeworCQlwY2lfZnJlZV9yZXNvdXJjZV9saXN0KCZyZXNvdXJjZXMpOworCQlpcnFfZG9tYWluX3JlbW92ZSh2bWQtPmlycV9kb21haW4pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl2bWRfYXR0YWNoX3Jlc291cmNlcyh2bWQpOworCXZtZF9zZXR1cF9kbWFfb3BzKHZtZCk7CisJZGV2X3NldF9tc2lfZG9tYWluKCZ2bWQtPmJ1cy0+ZGV2LCB2bWQtPmlycV9kb21haW4pOworCXBjaV9yZXNjYW5fYnVzKHZtZC0+YnVzKTsKKworCVdBUk4oc3lzZnNfY3JlYXRlX2xpbmsoJnZtZC0+ZGV2LT5kZXYua29iaiwgJnZtZC0+YnVzLT5kZXYua29iaiwKKwkJCSAgICAgICAiZG9tYWluIiksICJDYW4ndCBjcmVhdGUgc3ltbGluayB0byBkb21haW5cbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgdm1kX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB2bWRfaXJxX2xpc3QgKmlycXMgPSBkYXRhOworCXN0cnVjdCB2bWRfaXJxICp2bWRpcnE7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uodm1kaXJxLCAmaXJxcy0+aXJxX2xpc3QsIG5vZGUpCisJCWdlbmVyaWNfaGFuZGxlX2lycSh2bWRpcnEtPnZpcnEpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHZtZF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHZtZF9kZXYgKnZtZDsKKwlpbnQgaSwgZXJyOworCisJaWYgKHJlc291cmNlX3NpemUoJmRldi0+cmVzb3VyY2VbVk1EX0NGR0JBUl0pIDwgKDEgPDwgMjApKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXZtZCA9IGRldm1fa3phbGxvYygmZGV2LT5kZXYsIHNpemVvZigqdm1kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2bWQpCisJCXJldHVybiAtRU5PTUVNOworCisJdm1kLT5kZXYgPSBkZXY7CisJZXJyID0gcGNpbV9lbmFibGVfZGV2aWNlKGRldik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwl2bWQtPmNmZ2JhciA9IHBjaW1faW9tYXAoZGV2LCBWTURfQ0ZHQkFSLCAwKTsKKwlpZiAoIXZtZC0+Y2ZnYmFyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjaV9zZXRfbWFzdGVyKGRldik7CisJaWYgKGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJmRldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKSAmJgorCSAgICBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KCZkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSkpCisJCXJldHVybiAtRU5PREVWOworCisJdm1kLT5tc2l4X2NvdW50ID0gcGNpX21zaXhfdmVjX2NvdW50KGRldik7CisJaWYgKHZtZC0+bXNpeF9jb3VudCA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJdm1kLT5tc2l4X2NvdW50ID0gcGNpX2FsbG9jX2lycV92ZWN0b3JzKGRldiwgMSwgdm1kLT5tc2l4X2NvdW50LAorCQkJCQlQQ0lfSVJRX01TSVggfCBQQ0lfSVJRX0FGRklOSVRZKTsKKwlpZiAodm1kLT5tc2l4X2NvdW50IDwgMCkKKwkJcmV0dXJuIHZtZC0+bXNpeF9jb3VudDsKKworCXZtZC0+aXJxcyA9IGRldm1fa2NhbGxvYygmZGV2LT5kZXYsIHZtZC0+bXNpeF9jb3VudCwgc2l6ZW9mKCp2bWQtPmlycXMpLAorCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIXZtZC0+aXJxcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgdm1kLT5tc2l4X2NvdW50OyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJnZtZC0+aXJxc1tpXS5pcnFfbGlzdCk7CisJCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoJmRldi0+ZGV2LCBwY2lfaXJxX3ZlY3RvcihkZXYsIGkpLAorCQkJCSAgICAgICB2bWRfaXJxLCAwLCAidm1kIiwgJnZtZC0+aXJxc1tpXSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXNwaW5fbG9ja19pbml0KCZ2bWQtPmNmZ19sb2NrKTsKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCB2bWQpOworCWVyciA9IHZtZF9lbmFibGVfZG9tYWluKHZtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWRldl9pbmZvKCZ2bWQtPmRldi0+ZGV2LCAiQm91bmQgdG8gUENJIGRvbWFpbiAlMDR4XG4iLAorCQkgdm1kLT5zeXNkYXRhLmRvbWFpbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZtZF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgdm1kX2RldiAqdm1kID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwl2bWRfZGV0YWNoX3Jlc291cmNlcyh2bWQpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworCXN5c2ZzX3JlbW92ZV9saW5rKCZ2bWQtPmRldi0+ZGV2LmtvYmosICJkb21haW4iKTsKKwlwY2lfc3RvcF9yb290X2J1cyh2bWQtPmJ1cyk7CisJcGNpX3JlbW92ZV9yb290X2J1cyh2bWQtPmJ1cyk7CisJdm1kX3RlYXJkb3duX2RtYV9vcHModm1kKTsKKwlpcnFfZG9tYWluX3JlbW92ZSh2bWQtPmlycV9kb21haW4pOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHZtZF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKworCXBjaV9zYXZlX3N0YXRlKHBkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZtZF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyh2bWRfZGV2X3BtX29wcywgdm1kX3N1c3BlbmQsIHZtZF9yZXN1bWUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgdm1kX2lkc1tdID0geworCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MjAxZCksfSwKKwl7MCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHZtZF9pZHMpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdm1kX2RydiA9IHsKKwkubmFtZQkJPSAidm1kIiwKKwkuaWRfdGFibGUJPSB2bWRfaWRzLAorCS5wcm9iZQkJPSB2bWRfcHJvYmUsCisJLnJlbW92ZQkJPSB2bWRfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkucG0JPSAmdm1kX2Rldl9wbV9vcHMsCisJfSwKK307Cittb2R1bGVfcGNpX2RyaXZlcih2bWRfZHJ2KTsKKworTU9EVUxFX0FVVEhPUigiSW50ZWwgQ29ycG9yYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjYiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Zy5oCmluZGV4IDU1NWJjZGUuLjYwZTY2ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWcuaApAQCAtMTAxLDEwICsxMDEsOCBAQAogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfUENJX0NQQ0kKIGludCBjcGNpX2hvdHBsdWdfaW5pdChpbnQgZGVidWcpOwotdm9pZCBjcGNpX2hvdHBsdWdfZXhpdCh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBjcGNpX2hvdHBsdWdfaW5pdChpbnQgZGVidWcpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcGNpX2hvdHBsdWdfZXhpdCh2b2lkKSB7IH0KICNlbmRpZgogCiAjZW5kaWYJLyogX0NQQ0lfSE9UUExVR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19jb3JlLmMKaW5kZXggN2QzODY2Yy4uN2VjOGE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcGNpX2hvdHBsdWdfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX2NvcmUuYwpAQCAtNzE5LDEzICs3MTksMyBAQAogCWNwY2lfZGVidWcgPSBkZWJ1ZzsKIAlyZXR1cm4gMDsKIH0KLQotdm9pZCBfX2V4aXQKLWNwY2lfaG90cGx1Z19leGl0KHZvaWQpCi17Ci0JLyoKLQkgKiBDbGVhbiBldmVyeXRoaW5nIHVwLgotCSAqLwotCWNwY2lfaHBfc3RvcCgpOwotCWNwY2lfaHBfdW5yZWdpc3Rlcl9jb250cm9sbGVyKGNvbnRyb2xsZXIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2lfaG90cGx1Z19jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYwppbmRleCA5YWNkMTk5Li5mZWEwYjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYwpAQCAtMjUsNyArMjUsNyBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIHRyeV9tb2R1bGVfZ2V0ICYgbW9kdWxlX3B1dCAqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTUzNywxNyArNTM3LDExIEBACiAJaW5mbyhEUklWRVJfREVTQyAiIHZlcnNpb246ICIgRFJJVkVSX1ZFUlNJT04gIlxuIik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KK2RldmljZV9pbml0Y2FsbChwY2lfaG90cGx1Z19pbml0KTsKIAotc3RhdGljIHZvaWQgX19leGl0IHBjaV9ob3RwbHVnX2V4aXQodm9pZCkKLXsKLQljcGNpX2hvdHBsdWdfZXhpdCgpOwotfQotCi1tb2R1bGVfaW5pdChwY2lfaG90cGx1Z19pbml0KTsKLW1vZHVsZV9leGl0KHBjaV9ob3RwbHVnX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwotTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKy8qCisgKiBub3QgcmVhbGx5IG1vZHVsYXIsIGJ1dCB0aGUgZWFzaWVzdCB3YXkgdG8ga2VlcCBjb21wYXQgd2l0aCBleGlzdGluZworICogYm9vdGFyZ3MgYmVoYXZpb3VyIGlzIHRvIGNvbnRpbnVlIHVzaW5nIG1vZHVsZV9wYXJhbSBoZXJlLgorICovCiBtb2R1bGVfcGFyYW0oZGVidWcsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnZ2luZyBtb2RlIGVuYWJsZWQgb3Igbm90Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHAuaAppbmRleCBlNzY0OTE4Li4zN2Q3MGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwLmgKQEAgLTE1Miw2ICsxNTIsOSBAQAogdm9pZCBwY2llaHBfcmVsZWFzZV9jdHJsKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKTsKIGludCBwY2llaHBfcmVzZXRfc2xvdChzdHJ1Y3Qgc2xvdCAqc2xvdCwgaW50IHByb2JlKTsKIAoraW50IHBjaWVocF9zZXRfcmF3X2luZGljYXRvcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaF9zbG90LCB1OCBzdGF0dXMpOworaW50IHBjaWVocF9nZXRfcmF3X2luZGljYXRvcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaF9zbG90LCB1OCAqc3RhdHVzKTsKKwogc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpzbG90X25hbWUoc3RydWN0IHNsb3QgKnNsb3QpCiB7CiAJcmV0dXJuIGhvdHBsdWdfc2xvdF9uYW1lKHNsb3QtPmhvdHBsdWdfc2xvdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKaW5kZXggYWM1MzFlNi4uN2QzMmZhMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jb3JlLmMKQEAgLTI3LDcgKzI3LDYgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDcsMTAgKzQ2LDEwIEBACiAjZGVmaW5lIERSSVZFUl9BVVRIT1IJIkRhbiBaaW5rIDxkYW4uemlua0Bjb21wYXEuY29tPiwgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4sIERlbHkgU3kgPGRlbHkubC5zeUBpbnRlbC5jb20+IgogI2RlZmluZSBEUklWRVJfREVTQwkiUENJIEV4cHJlc3MgSG90IFBsdWcgQ29udHJvbGxlciBEcml2ZXIiCiAKLU1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCisvKgorICogbm90IHJlYWxseSBtb2R1bGFyLCBidXQgdGhlIGVhc2llc3Qgd2F5IHRvIGtlZXAgY29tcGF0IHdpdGggZXhpc3RpbmcKKyAqIGJvb3RhcmdzIGJlaGF2aW91ciBpcyB0byBjb250aW51ZSB1c2luZyBtb2R1bGVfcGFyYW0gaGVyZS4KKyAqLwogbW9kdWxlX3BhcmFtKHBjaWVocF9kZWJ1ZywgYm9vbCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocGNpZWhwX3BvbGxfbW9kZSwgYm9vbCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocGNpZWhwX3BvbGxfdGltZSwgaW50LCAwNjQ0KTsKQEAgLTExNCw2ICsxMTMsOSBAQAogCWlmIChBVFROX0xFRChjdHJsKSkgewogCQlvcHMtPmdldF9hdHRlbnRpb25fc3RhdHVzID0gZ2V0X2F0dGVudGlvbl9zdGF0dXM7CiAJCW9wcy0+c2V0X2F0dGVudGlvbl9zdGF0dXMgPSBzZXRfYXR0ZW50aW9uX3N0YXR1czsKKwl9IGVsc2UgaWYgKGN0cmwtPnBjaWUtPnBvcnQtPmhvdHBsdWdfdXNlcl9pbmRpY2F0b3JzKSB7CisJCW9wcy0+Z2V0X2F0dGVudGlvbl9zdGF0dXMgPSBwY2llaHBfZ2V0X3Jhd19pbmRpY2F0b3Jfc3RhdHVzOworCQlvcHMtPnNldF9hdHRlbnRpb25fc3RhdHVzID0gcGNpZWhwX3NldF9yYXdfaW5kaWNhdG9yX3N0YXR1czsKIAl9CiAKIAkvKiByZWdpc3RlciB0aGlzIHNsb3Qgd2l0aCB0aGUgaG90cGx1ZyBwY2kgY29yZSAqLwpAQCAtMzM3LDEzICszMzksNCBAQAogCiAJcmV0dXJuIHJldHZhbDsKIH0KLQotc3RhdGljIHZvaWQgX19leGl0IHBjaWVkX2NsZWFudXAodm9pZCkKLXsKLQlkYmcoInVubG9hZF9wY2llaHBkKClcbiIpOwotCXBjaWVfcG9ydF9zZXJ2aWNlX3VucmVnaXN0ZXIoJmhwZHJpdmVyX3BvcnRkcnYpOwotCWluZm8oRFJJVkVSX0RFU0MgIiB2ZXJzaW9uOiAiIERSSVZFUl9WRVJTSU9OICIgdW5sb2FkZWRcbiIpOwotfQotCi1tb2R1bGVfaW5pdChwY2llZF9pbml0KTsKLW1vZHVsZV9leGl0KHBjaWVkX2NsZWFudXApOworZGV2aWNlX2luaXRjYWxsKHBjaWVkX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCmluZGV4IDg4MDk3OGIuLmVmZTY5ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCiAJLyogQ2hlY2sgZm9yIGEgcG93ZXIgZmF1bHQgKi8KIAlpZiAoY3RybC0+cG93ZXJfZmF1bHRfZGV0ZWN0ZWQgfHwgcGNpZWhwX3F1ZXJ5X3Bvd2VyX2ZhdWx0KHBfc2xvdCkpIHsKLQkJY3RybF9lcnIoY3RybCwgIlBvd2VyIGZhdWx0IG9uIHNsb3QgJXNcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKKwkJY3RybF9lcnIoY3RybCwgIlNsb3QoJXMpOiBQb3dlciBmYXVsdFxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQlyZXR2YWwgPSAtRUlPOwogCQlnb3RvIGVycl9leGl0OwogCX0KQEAgLTEyMCw2ICsxMjAsNyBAQAogCX0KIAogCXBjaWVocF9ncmVlbl9sZWRfb24ocF9zbG90KTsKKwlwY2llaHBfc2V0X2F0dGVudGlvbl9zdGF0dXMocF9zbG90LCAwKTsKIAlyZXR1cm4gMDsKIAogZXJyX2V4aXQ6CkBAIC0yNTMsMTEgKzI1NCwxMSBAQAogCQlwY2llaHBfZ2V0X3Bvd2VyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCQlpZiAoZ2V0c3RhdHVzKSB7CiAJCQlwX3Nsb3QtPnN0YXRlID0gQkxJTktJTkdPRkZfU1RBVEU7Ci0JCQljdHJsX2luZm8oY3RybCwgIlBDSSBzbG90ICMlcyAtIHBvd2VyaW5nIG9mZiBkdWUgdG8gYnV0dG9uIHByZXNzXG4iLAorCQkJY3RybF9pbmZvKGN0cmwsICJTbG90KCVzKTogUG93ZXJpbmcgb2ZmIGR1ZSB0byBidXR0b24gcHJlc3NcbiIsCiAJCQkJICBzbG90X25hbWUocF9zbG90KSk7CiAJCX0gZWxzZSB7CiAJCQlwX3Nsb3QtPnN0YXRlID0gQkxJTktJTkdPTl9TVEFURTsKLQkJCWN0cmxfaW5mbyhjdHJsLCAiUENJIHNsb3QgIyVzIC0gcG93ZXJpbmcgb24gZHVlIHRvIGJ1dHRvbiBwcmVzc1xuIiwKKwkJCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCglcykgUG93ZXJpbmcgb24gZHVlIHRvIGJ1dHRvbiBwcmVzc1xuIiwKIAkJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJfQogCQkvKiBibGluayBncmVlbiBMRUQgYW5kIHR1cm4gb2ZmIGFtYmVyICovCkBAIC0yNzIsMTQgKzI3MywxNCBAQAogCQkgKiBwcmVzcyB0aGUgYXR0ZW50aW9uIGFnYWluIGJlZm9yZSB0aGUgNSBzZWMuIGxpbWl0CiAJCSAqIGV4cGlyZXMgdG8gY2FuY2VsIGhvdC1hZGQgb3IgaG90LXJlbW92ZQogCQkgKi8KLQkJY3RybF9pbmZvKGN0cmwsICJCdXR0b24gY2FuY2VsIG9uIFNsb3QoJXMpXG4iLCBzbG90X25hbWUocF9zbG90KSk7CisJCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCglcyk6IEJ1dHRvbiBjYW5jZWxcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcF9zbG90LT53b3JrKTsKIAkJaWYgKHBfc2xvdC0+c3RhdGUgPT0gQkxJTktJTkdPRkZfU1RBVEUpCiAJCQlwY2llaHBfZ3JlZW5fbGVkX29uKHBfc2xvdCk7CiAJCWVsc2UKIAkJCXBjaWVocF9ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CiAJCXBjaWVocF9zZXRfYXR0ZW50aW9uX3N0YXR1cyhwX3Nsb3QsIDApOwotCQljdHJsX2luZm8oY3RybCwgIlBDSSBzbG90ICMlcyAtIGFjdGlvbiBjYW5jZWxlZCBkdWUgdG8gYnV0dG9uIHByZXNzXG4iLAorCQljdHJsX2luZm8oY3RybCwgIlNsb3QoJXMpOiBBY3Rpb24gY2FuY2VsZWQgZHVlIHRvIGJ1dHRvbiBwcmVzc1xuIiwKIAkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQlwX3Nsb3QtPnN0YXRlID0gU1RBVElDX1NUQVRFOwogCQlicmVhazsKQEAgLTI5MCwxMCArMjkxLDEyIEBACiAJCSAqIHRoaXMgbWVhbnMgdGhhdCB0aGUgcHJldmlvdXMgYXR0ZW50aW9uIGJ1dHRvbiBhY3Rpb24KIAkJICogdG8gaG90LWFkZCBvciBob3QtcmVtb3ZlIGlzIHVuZGVyZ29pbmcKIAkJICovCi0JCWN0cmxfaW5mbyhjdHJsLCAiQnV0dG9uIGlnbm9yZSBvbiBTbG90KCVzKVxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOworCQljdHJsX2luZm8oY3RybCwgIlNsb3QoJXMpOiBCdXR0b24gaWdub3JlZFxuIiwKKwkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQljdHJsX3dhcm4oY3RybCwgImlnbm9yaW5nIGludmFsaWQgc3RhdGUgJSN4XG4iLCBwX3Nsb3QtPnN0YXRlKTsKKwkJY3RybF9lcnIoY3RybCwgIlNsb3QoJXMpOiBJZ25vcmluZyBpbnZhbGlkIHN0YXRlICUjeFxuIiwKKwkJCSBzbG90X25hbWUocF9zbG90KSwgcF9zbG90LT5zdGF0ZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTMwMSwyMCArMzA0LDYgQEAKIC8qCiAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggc2xvdC0+bG9jayBoZWxkCiAgKi8KLXN0YXRpYyB2b2lkIGhhbmRsZV9zdXJwcmlzZV9ldmVudChzdHJ1Y3Qgc2xvdCAqcF9zbG90KQotewotCXU4IGdldHN0YXR1czsKLQotCXBjaWVocF9nZXRfYWRhcHRlcl9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKLQlpZiAoIWdldHN0YXR1cykKLQkJcGNpZWhwX3F1ZXVlX3Bvd2VyX3dvcmsocF9zbG90LCBESVNBQkxFX1JFUSk7Ci0JZWxzZQotCQlwY2llaHBfcXVldWVfcG93ZXJfd29yayhwX3Nsb3QsIEVOQUJMRV9SRVEpOwotfQotCi0vKgotICogTm90ZTogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIHNsb3QtPmxvY2sgaGVsZAotICovCiBzdGF0aWMgdm9pZCBoYW5kbGVfbGlua19ldmVudChzdHJ1Y3Qgc2xvdCAqcF9zbG90LCB1MzIgZXZlbnQpCiB7CiAJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBwX3Nsb3QtPmN0cmw7CkBAIC0zMzAsMzEgKzMxOSwyNyBAQAogCQlicmVhazsKIAljYXNlIFBPV0VST05fU1RBVEU6CiAJCWlmIChldmVudCA9PSBJTlRfTElOS19VUCkgewotCQkJY3RybF9pbmZvKGN0cmwsCi0JCQkJICAiTGluayBVcCBldmVudCBpZ25vcmVkIG9uIHNsb3QoJXMpOiBhbHJlYWR5IHBvd2VyaW5nIG9uXG4iLAorCQkJY3RybF9pbmZvKGN0cmwsICJTbG90KCVzKTogTGluayBVcCBldmVudCBpZ25vcmVkOyBhbHJlYWR5IHBvd2VyaW5nIG9uXG4iLAogCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQl9IGVsc2UgewotCQkJY3RybF9pbmZvKGN0cmwsCi0JCQkJICAiTGluayBEb3duIGV2ZW50IHF1ZXVlZCBvbiBzbG90KCVzKTogY3VycmVudGx5IGdldHRpbmcgcG93ZXJlZCBvblxuIiwKKwkJCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCglcyk6IExpbmsgRG93biBldmVudCBxdWV1ZWQ7IGN1cnJlbnRseSBnZXR0aW5nIHBvd2VyZWQgb25cbiIsCiAJCQkJICBzbG90X25hbWUocF9zbG90KSk7CiAJCQlwY2llaHBfcXVldWVfcG93ZXJfd29yayhwX3Nsb3QsIERJU0FCTEVfUkVRKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFBPV0VST0ZGX1NUQVRFOgogCQlpZiAoZXZlbnQgPT0gSU5UX0xJTktfVVApIHsKLQkJCWN0cmxfaW5mbyhjdHJsLAotCQkJCSAgIkxpbmsgVXAgZXZlbnQgcXVldWVkIG9uIHNsb3QoJXMpOiBjdXJyZW50bHkgZ2V0dGluZyBwb3dlcmVkIG9mZlxuIiwKKwkJCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCglcyk6IExpbmsgVXAgZXZlbnQgcXVldWVkOyBjdXJyZW50bHkgZ2V0dGluZyBwb3dlcmVkIG9mZlxuIiwKIAkJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJCXBjaWVocF9xdWV1ZV9wb3dlcl93b3JrKHBfc2xvdCwgRU5BQkxFX1JFUSk7CiAJCX0gZWxzZSB7Ci0JCQljdHJsX2luZm8oY3RybCwKLQkJCQkgICJMaW5rIERvd24gZXZlbnQgaWdub3JlZCBvbiBzbG90KCVzKTogYWxyZWFkeSBwb3dlcmluZyBvZmZcbiIsCisJCQljdHJsX2luZm8oY3RybCwgIlNsb3QoJXMpOiBMaW5rIERvd24gZXZlbnQgaWdub3JlZDsgYWxyZWFkeSBwb3dlcmluZyBvZmZcbiIsCiAJCQkJICBzbG90X25hbWUocF9zbG90KSk7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJY3RybF9lcnIoY3RybCwgImlnbm9yaW5nIGludmFsaWQgc3RhdGUgJSN4IG9uIHNsb3QoJXMpXG4iLAotCQkJIHBfc2xvdC0+c3RhdGUsIHNsb3RfbmFtZShwX3Nsb3QpKTsKKwkJY3RybF9lcnIoY3RybCwgIlNsb3QoJXMpOiBJZ25vcmluZyBpbnZhbGlkIHN0YXRlICUjeFxuIiwKKwkJCSBzbG90X25hbWUocF9zbG90KSwgcF9zbG90LT5zdGF0ZSk7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTM3NywxNCArMzYyLDE0IEBACiAJCXBjaWVocF9ncmVlbl9sZWRfb2ZmKHBfc2xvdCk7CiAJCWJyZWFrOwogCWNhc2UgSU5UX1BSRVNFTkNFX09OOgotCQloYW5kbGVfc3VycHJpc2VfZXZlbnQocF9zbG90KTsKKwkJcGNpZWhwX3F1ZXVlX3Bvd2VyX3dvcmsocF9zbG90LCBFTkFCTEVfUkVRKTsKIAkJYnJlYWs7CiAJY2FzZSBJTlRfUFJFU0VOQ0VfT0ZGOgogCQkvKgogCQkgKiBSZWdhcmRsZXNzIG9mIHN1cnByaXNlIGNhcGFiaWxpdHksIHdlIG5lZWQgdG8KIAkJICogZGVmaW5pdGVseSByZW1vdmUgYSBjYXJkIHRoYXQgaGFzIGJlZW4gcHVsbGVkIG91dCEKIAkJICovCi0JCWhhbmRsZV9zdXJwcmlzZV9ldmVudChwX3Nsb3QpOworCQlwY2llaHBfcXVldWVfcG93ZXJfd29yayhwX3Nsb3QsIERJU0FCTEVfUkVRKTsKIAkJYnJlYWs7CiAJY2FzZSBJTlRfTElOS19VUDoKIAljYXNlIElOVF9MSU5LX0RPV046CkBAIC00MDQsMTggKzM4OSwxNyBAQAogaW50IHBjaWVocF9lbmFibGVfc2xvdChzdHJ1Y3Qgc2xvdCAqcF9zbG90KQogewogCXU4IGdldHN0YXR1cyA9IDA7Ci0JaW50IHJjOwogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gcF9zbG90LT5jdHJsOwogCiAJcGNpZWhwX2dldF9hZGFwdGVyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCWlmICghZ2V0c3RhdHVzKSB7Ci0JCWN0cmxfaW5mbyhjdHJsLCAiTm8gYWRhcHRlciBvbiBzbG90KCVzKVxuIiwgc2xvdF9uYW1lKHBfc2xvdCkpOworCQljdHJsX2luZm8oY3RybCwgIlNsb3QoJXMpOiBObyBhZGFwdGVyXG4iLCBzbG90X25hbWUocF9zbG90KSk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAlpZiAoTVJMX1NFTlMocF9zbG90LT5jdHJsKSkgewogCQlwY2llaHBfZ2V0X2xhdGNoX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCQlpZiAoZ2V0c3RhdHVzKSB7Ci0JCQljdHJsX2luZm8oY3RybCwgIkxhdGNoIG9wZW4gb24gc2xvdCglcylcbiIsCisJCQljdHJsX2luZm8oY3RybCwgIlNsb3QoJXMpOiBMYXRjaCBvcGVuXG4iLAogCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KQEAgLTQyNCwxOSArNDA4LDEzIEBACiAJaWYgKFBPV0VSX0NUUkwocF9zbG90LT5jdHJsKSkgewogCQlwY2llaHBfZ2V0X3Bvd2VyX3N0YXR1cyhwX3Nsb3QsICZnZXRzdGF0dXMpOwogCQlpZiAoZ2V0c3RhdHVzKSB7Ci0JCQljdHJsX2luZm8oY3RybCwgIkFscmVhZHkgZW5hYmxlZCBvbiBzbG90KCVzKVxuIiwKKwkJCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCglcyk6IEFscmVhZHkgZW5hYmxlZFxuIiwKIAkJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfQogCi0JcGNpZWhwX2dldF9sYXRjaF9zdGF0dXMocF9zbG90LCAmZ2V0c3RhdHVzKTsKLQotCXJjID0gYm9hcmRfYWRkZWQocF9zbG90KTsKLQlpZiAocmMpCi0JCXBjaWVocF9nZXRfbGF0Y2hfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7Ci0KLQlyZXR1cm4gcmM7CisJcmV0dXJuIGJvYXJkX2FkZGVkKHBfc2xvdCk7CiB9CiAKIC8qCkBAIC00NTMsNyArNDMxLDcgQEAKIAlpZiAoUE9XRVJfQ1RSTChwX3Nsb3QtPmN0cmwpKSB7CiAJCXBjaWVocF9nZXRfcG93ZXJfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJCWlmICghZ2V0c3RhdHVzKSB7Ci0JCQljdHJsX2luZm8oY3RybCwgIkFscmVhZHkgZGlzYWJsZWQgb24gc2xvdCglcylcbiIsCisJCQljdHJsX2luZm8oY3RybCwgIlNsb3QoJXMpOiBBbHJlYWR5IGRpc2FibGVkXG4iLAogCQkJCSAgc2xvdF9uYW1lKHBfc2xvdCkpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTQ4MSwxNyArNDU5LDE3IEBACiAJCXBfc2xvdC0+c3RhdGUgPSBTVEFUSUNfU1RBVEU7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJPTl9TVEFURToKLQkJY3RybF9pbmZvKGN0cmwsICJTbG90ICVzIGlzIGFscmVhZHkgaW4gcG93ZXJpbmcgb24gc3RhdGVcbiIsCisJCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCglcyk6IEFscmVhZHkgaW4gcG93ZXJpbmcgb24gc3RhdGVcbiIsCiAJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJYnJlYWs7CiAJY2FzZSBCTElOS0lOR09GRl9TVEFURToKIAljYXNlIFBPV0VST0ZGX1NUQVRFOgotCQljdHJsX2luZm8oY3RybCwgIkFscmVhZHkgZW5hYmxlZCBvbiBzbG90ICVzXG4iLAorCQljdHJsX2luZm8oY3RybCwgIlNsb3QoJXMpOiBBbHJlYWR5IGVuYWJsZWRcbiIsCiAJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJY3RybF9lcnIoY3RybCwgImludmFsaWQgc3RhdGUgJSN4IG9uIHNsb3QgJXNcbiIsCi0JCQkgcF9zbG90LT5zdGF0ZSwgc2xvdF9uYW1lKHBfc2xvdCkpOworCQljdHJsX2VycihjdHJsLCAiU2xvdCglcyk6IEludmFsaWQgc3RhdGUgJSN4XG4iLAorCQkJIHNsb3RfbmFtZShwX3Nsb3QpLCBwX3Nsb3QtPnN0YXRlKTsKIAkJYnJlYWs7CiAJfQogCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKQEAgLTUxOCwxNyArNDk2LDE3IEBACiAJCXBfc2xvdC0+c3RhdGUgPSBTVEFUSUNfU1RBVEU7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJPRkZfU1RBVEU6Ci0JCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCAlcyBpcyBhbHJlYWR5IGluIHBvd2VyaW5nIG9mZiBzdGF0ZVxuIiwKKwkJY3RybF9pbmZvKGN0cmwsICJTbG90KCVzKTogQWxyZWFkeSBpbiBwb3dlcmluZyBvZmYgc3RhdGVcbiIsCiAJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJYnJlYWs7CiAJY2FzZSBCTElOS0lOR09OX1NUQVRFOgogCWNhc2UgUE9XRVJPTl9TVEFURToKLQkJY3RybF9pbmZvKGN0cmwsICJBbHJlYWR5IGRpc2FibGVkIG9uIHNsb3QgJXNcbiIsCisJCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCglcyk6IEFscmVhZHkgZGlzYWJsZWRcbiIsCiAJCQkgIHNsb3RfbmFtZShwX3Nsb3QpKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJY3RybF9lcnIoY3RybCwgImludmFsaWQgc3RhdGUgJSN4IG9uIHNsb3QgJXNcbiIsCi0JCQkgcF9zbG90LT5zdGF0ZSwgc2xvdF9uYW1lKHBfc2xvdCkpOworCQljdHJsX2VycihjdHJsLCAiU2xvdCglcyk6IEludmFsaWQgc3RhdGUgJSN4XG4iLAorCQkJIHNsb3RfbmFtZShwX3Nsb3QpLCBwX3Nsb3QtPnN0YXRlKTsKIAkJYnJlYWs7CiAJfQogCW11dGV4X3VubG9jaygmcF9zbG90LT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKaW5kZXggMDhlODRkNi4uYjU3ZmM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKQEAgLTM1NSw2ICszNTUsMTggQEAKIAlyZXR1cm4gX19wY2llaHBfbGlua19zZXQoY3RybCwgdHJ1ZSk7CiB9CiAKK2ludCBwY2llaHBfZ2V0X3Jhd19pbmRpY2F0b3Jfc3RhdHVzKHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCwKKwkJCQkgICAgdTggKnN0YXR1cykKK3sKKwlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGhvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGN0cmxfZGV2KHNsb3QtPmN0cmwpOworCXUxNiBzbG90X2N0cmw7CisKKwlwY2llX2NhcGFiaWxpdHlfcmVhZF93b3JkKHBkZXYsIFBDSV9FWFBfU0xUQ1RMLCAmc2xvdF9jdHJsKTsKKwkqc3RhdHVzID0gKHNsb3RfY3RybCAmIChQQ0lfRVhQX1NMVENUTF9BSUMgfCBQQ0lfRVhQX1NMVENUTF9QSUMpKSA+PiA2OworCXJldHVybiAwOworfQorCiB2b2lkIHBjaWVocF9nZXRfYXR0ZW50aW9uX3N0YXR1cyhzdHJ1Y3Qgc2xvdCAqc2xvdCwgdTggKnN0YXR1cykKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IHNsb3QtPmN0cmw7CkBAIC00MzEsNiArNDQzLDE3IEBACiAJcmV0dXJuICEhKHNsb3Rfc3RhdHVzICYgUENJX0VYUF9TTFRTVEFfUEZEKTsKIH0KIAoraW50IHBjaWVocF9zZXRfcmF3X2luZGljYXRvcl9zdGF0dXMoc3RydWN0IGhvdHBsdWdfc2xvdCAqaG90cGx1Z19zbG90LAorCQkJCSAgICB1OCBzdGF0dXMpCit7CisJc3RydWN0IHNsb3QgKnNsb3QgPSBob3RwbHVnX3Nsb3QtPnByaXZhdGU7CisJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBzbG90LT5jdHJsOworCisJcGNpZV93cml0ZV9jbWRfbm93YWl0KGN0cmwsIHN0YXR1cyA8PCA2LAorCQkJICAgICAgUENJX0VYUF9TTFRDVExfQUlDIHwgUENJX0VYUF9TTFRDVExfUElDKTsKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBwY2llaHBfc2V0X2F0dGVudGlvbl9zdGF0dXMoc3RydWN0IHNsb3QgKnNsb3QsIHU4IHZhbHVlKQogewogCXN0cnVjdCBjb250cm9sbGVyICpjdHJsID0gc2xvdC0+Y3RybDsKQEAgLTUzNSwxNCArNTU4LDE0IEBACiAJCSBQQ0lfRVhQX1NMVENUTF9QV1JfT0ZGKTsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHBjaWVfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3N0YXRpYyBpcnFyZXR1cm5fdCBwY2llaHBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IChzdHJ1Y3QgY29udHJvbGxlciAqKWRldl9pZDsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGN0cmxfZGV2KGN0cmwpOwogCXN0cnVjdCBwY2lfYnVzICpzdWJvcmRpbmF0ZSA9IHBkZXYtPnN1Ym9yZGluYXRlOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJc3RydWN0IHNsb3QgKnNsb3QgPSBjdHJsLT5zbG90OwotCXUxNiBkZXRlY3RlZCwgaW50cl9sb2M7CisJdTE2IHN0YXR1cywgZXZlbnRzOwogCXU4IHByZXNlbnQ7CiAJYm9vbCBsaW5rOwogCkBAIC01NTAsMzYgKzU3MywzMSBAQAogCWlmIChwZGV2LT5jdXJyZW50X3N0YXRlID09IFBDSV9EM2NvbGQpCiAJCXJldHVybiBJUlFfTk9ORTsKIAorCXBjaWVfY2FwYWJpbGl0eV9yZWFkX3dvcmQocGRldiwgUENJX0VYUF9TTFRTVEEsICZzdGF0dXMpOworCWlmIChzdGF0dXMgPT0gKHUxNikgfjApIHsKKwkJY3RybF9pbmZvKGN0cmwsICIlczogbm8gcmVzcG9uc2UgZnJvbSBkZXZpY2VcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKwogCS8qCi0JICogSW4gb3JkZXIgdG8gZ3VhcmFudGVlIHRoYXQgYWxsIGludGVycnVwdCBldmVudHMgYXJlCi0JICogc2VydmljZWQsIHdlIG5lZWQgdG8gcmUtaW5zcGVjdCBTbG90IFN0YXR1cyByZWdpc3RlciBhZnRlcgotCSAqIGNsZWFyaW5nIHdoYXQgaXMgcHJlc3VtZWQgdG8gYmUgdGhlIGxhc3QgcGVuZGluZyBpbnRlcnJ1cHQuCisJICogU2xvdCBTdGF0dXMgY29udGFpbnMgcGxhaW4gc3RhdHVzIGJpdHMgYXMgd2VsbCBhcyBldmVudAorCSAqIG5vdGlmaWNhdGlvbiBiaXRzOyByaWdodCBub3cgd2Ugb25seSB3YW50IHRoZSBldmVudCBiaXRzLgogCSAqLwotCWludHJfbG9jID0gMDsKLQlkbyB7Ci0JCXBjaWVfY2FwYWJpbGl0eV9yZWFkX3dvcmQocGRldiwgUENJX0VYUF9TTFRTVEEsICZkZXRlY3RlZCk7Ci0JCWlmIChkZXRlY3RlZCA9PSAodTE2KSB+MCkgewotCQkJY3RybF9pbmZvKGN0cmwsICIlczogbm8gcmVzcG9uc2UgZnJvbSBkZXZpY2VcbiIsCi0JCQkJICBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0KKwlldmVudHMgPSBzdGF0dXMgJiAoUENJX0VYUF9TTFRTVEFfQUJQIHwgUENJX0VYUF9TTFRTVEFfUEZEIHwKKwkJCSAgIFBDSV9FWFBfU0xUU1RBX1BEQyB8IFBDSV9FWFBfU0xUU1RBX0NDIHwKKwkJCSAgIFBDSV9FWFBfU0xUU1RBX0RMTFNDKTsKKwlpZiAoIWV2ZW50cykKKwkJcmV0dXJuIElSUV9OT05FOwogCi0JCWRldGVjdGVkICY9IChQQ0lfRVhQX1NMVFNUQV9BQlAgfCBQQ0lfRVhQX1NMVFNUQV9QRkQgfAotCQkJICAgICBQQ0lfRVhQX1NMVFNUQV9QREMgfAotCQkJICAgICBQQ0lfRVhQX1NMVFNUQV9DQyB8IFBDSV9FWFBfU0xUU1RBX0RMTFNDKTsKLQkJZGV0ZWN0ZWQgJj0gfmludHJfbG9jOwotCQlpbnRyX2xvYyB8PSBkZXRlY3RlZDsKLQkJaWYgKCFpbnRyX2xvYykKLQkJCXJldHVybiBJUlFfTk9ORTsKLQkJaWYgKGRldGVjdGVkKQotCQkJcGNpZV9jYXBhYmlsaXR5X3dyaXRlX3dvcmQocGRldiwgUENJX0VYUF9TTFRTVEEsCi0JCQkJCQkgICBpbnRyX2xvYyk7Ci0JfSB3aGlsZSAoZGV0ZWN0ZWQpOworCS8qIENhcHR1cmUgbGluayBzdGF0dXMgYmVmb3JlIGNsZWFyaW5nIGludGVycnVwdHMgKi8KKwlpZiAoZXZlbnRzICYgUENJX0VYUF9TTFRTVEFfRExMU0MpCisJCWxpbmsgPSBwY2llaHBfY2hlY2tfbGlua19hY3RpdmUoY3RybCk7CiAKLQljdHJsX2RiZyhjdHJsLCAicGVuZGluZyBpbnRlcnJ1cHRzICUjMDZ4IGZyb20gU2xvdCBTdGF0dXNcbiIsIGludHJfbG9jKTsKKwlwY2llX2NhcGFiaWxpdHlfd3JpdGVfd29yZChwZGV2LCBQQ0lfRVhQX1NMVFNUQSwgZXZlbnRzKTsKKwljdHJsX2RiZyhjdHJsLCAicGVuZGluZyBpbnRlcnJ1cHRzICUjMDZ4IGZyb20gU2xvdCBTdGF0dXNcbiIsIGV2ZW50cyk7CiAKIAkvKiBDaGVjayBDb21tYW5kIENvbXBsZXRlIEludGVycnVwdCBQZW5kaW5nICovCi0JaWYgKGludHJfbG9jICYgUENJX0VYUF9TTFRTVEFfQ0MpIHsKKwlpZiAoZXZlbnRzICYgUENJX0VYUF9TTFRTVEFfQ0MpIHsKIAkJY3RybC0+Y21kX2J1c3kgPSAwOwogCQlzbXBfbWIoKTsKIAkJd2FrZV91cCgmY3RybC0+cXVldWUpOwpAQCAtNTg5LDQyICs2MDcsMzggQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZzdWJvcmRpbmF0ZS0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKIAkJCWlmIChkZXYtPmlnbm9yZV9ob3RwbHVnKSB7CiAJCQkJY3RybF9kYmcoY3RybCwgImlnbm9yaW5nIGhvdHBsdWcgZXZlbnQgJSMwNnggKCVzIHJlcXVlc3RlZCBubyBob3RwbHVnKVxuIiwKLQkJCQkJIGludHJfbG9jLCBwY2lfbmFtZShkZXYpKTsKKwkJCQkJIGV2ZW50cywgcGNpX25hbWUoZGV2KSk7CiAJCQkJcmV0dXJuIElSUV9IQU5ETEVEOwogCQkJfQogCQl9CiAJfQogCi0JaWYgKCEoaW50cl9sb2MgJiB+UENJX0VYUF9TTFRTVEFfQ0MpKQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0KIAkvKiBDaGVjayBBdHRlbnRpb24gQnV0dG9uIFByZXNzZWQgKi8KLQlpZiAoaW50cl9sb2MgJiBQQ0lfRVhQX1NMVFNUQV9BQlApIHsKLQkJY3RybF9pbmZvKGN0cmwsICJCdXR0b24gcHJlc3NlZCBvbiBTbG90KCVzKVxuIiwKKwlpZiAoZXZlbnRzICYgUENJX0VYUF9TTFRTVEFfQUJQKSB7CisJCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCglcyk6IEF0dGVudGlvbiBidXR0b24gcHJlc3NlZFxuIiwKIAkJCSAgc2xvdF9uYW1lKHNsb3QpKTsKIAkJcGNpZWhwX3F1ZXVlX2ludGVycnVwdF9ldmVudChzbG90LCBJTlRfQlVUVE9OX1BSRVNTKTsKIAl9CiAKIAkvKiBDaGVjayBQcmVzZW5jZSBEZXRlY3QgQ2hhbmdlZCAqLwotCWlmIChpbnRyX2xvYyAmIFBDSV9FWFBfU0xUU1RBX1BEQykgewotCQlwY2llaHBfZ2V0X2FkYXB0ZXJfc3RhdHVzKHNsb3QsICZwcmVzZW50KTsKLQkJY3RybF9pbmZvKGN0cmwsICJDYXJkICVzcHJlc2VudCBvbiBTbG90KCVzKVxuIiwKLQkJCSAgcHJlc2VudCA/ICIiIDogIm5vdCAiLCBzbG90X25hbWUoc2xvdCkpOworCWlmIChldmVudHMgJiBQQ0lfRVhQX1NMVFNUQV9QREMpIHsKKwkJcHJlc2VudCA9ICEhKHN0YXR1cyAmIFBDSV9FWFBfU0xUU1RBX1BEUyk7CisJCWN0cmxfaW5mbyhjdHJsLCAiU2xvdCglcyk6IENhcmQgJXNwcmVzZW50XG4iLCBzbG90X25hbWUoc2xvdCksCisJCQkgIHByZXNlbnQgPyAiIiA6ICJub3QgIik7CiAJCXBjaWVocF9xdWV1ZV9pbnRlcnJ1cHRfZXZlbnQoc2xvdCwgcHJlc2VudCA/IElOVF9QUkVTRU5DRV9PTiA6CiAJCQkJCSAgICAgSU5UX1BSRVNFTkNFX09GRik7CiAJfQogCiAJLyogQ2hlY2sgUG93ZXIgRmF1bHQgRGV0ZWN0ZWQgKi8KLQlpZiAoKGludHJfbG9jICYgUENJX0VYUF9TTFRTVEFfUEZEKSAmJiAhY3RybC0+cG93ZXJfZmF1bHRfZGV0ZWN0ZWQpIHsKKwlpZiAoKGV2ZW50cyAmIFBDSV9FWFBfU0xUU1RBX1BGRCkgJiYgIWN0cmwtPnBvd2VyX2ZhdWx0X2RldGVjdGVkKSB7CiAJCWN0cmwtPnBvd2VyX2ZhdWx0X2RldGVjdGVkID0gMTsKLQkJY3RybF9lcnIoY3RybCwgIlBvd2VyIGZhdWx0IG9uIHNsb3QgJXNcbiIsIHNsb3RfbmFtZShzbG90KSk7CisJCWN0cmxfZXJyKGN0cmwsICJTbG90KCVzKTogUG93ZXIgZmF1bHRcbiIsIHNsb3RfbmFtZShzbG90KSk7CiAJCXBjaWVocF9xdWV1ZV9pbnRlcnJ1cHRfZXZlbnQoc2xvdCwgSU5UX1BPV0VSX0ZBVUxUKTsKIAl9CiAKLQlpZiAoaW50cl9sb2MgJiBQQ0lfRVhQX1NMVFNUQV9ETExTQykgewotCQlsaW5rID0gcGNpZWhwX2NoZWNrX2xpbmtfYWN0aXZlKGN0cmwpOwotCQljdHJsX2luZm8oY3RybCwgInNsb3QoJXMpOiBMaW5rICVzIGV2ZW50XG4iLAotCQkJICBzbG90X25hbWUoc2xvdCksIGxpbmsgPyAiVXAiIDogIkRvd24iKTsKKwlpZiAoZXZlbnRzICYgUENJX0VYUF9TTFRTVEFfRExMU0MpIHsKKwkJY3RybF9pbmZvKGN0cmwsICJTbG90KCVzKTogTGluayAlc1xuIiwgc2xvdF9uYW1lKHNsb3QpLAorCQkJICBsaW5rID8gIlVwIiA6ICJEb3duIik7CiAJCXBjaWVocF9xdWV1ZV9pbnRlcnJ1cHRfZXZlbnQoc2xvdCwgbGluayA/IElOVF9MSU5LX1VQIDoKIAkJCQkJICAgICBJTlRfTElOS19ET1dOKTsKIAl9CkBAIC02MzIsNiArNjQ2LDI1IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgaXJxcmV0dXJuX3QgcGNpZV9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWlycXJldHVybl90IHJjLCBoYW5kbGVkID0gSVJRX05PTkU7CisKKwkvKgorCSAqIFRvIGd1YXJhbnRlZSB0aGF0IGFsbCBpbnRlcnJ1cHQgZXZlbnRzIGFyZSBzZXJ2aWNlZCwgd2UgbmVlZCB0bworCSAqIHJlLWluc3BlY3QgU2xvdCBTdGF0dXMgcmVnaXN0ZXIgYWZ0ZXIgY2xlYXJpbmcgd2hhdCBpcyBwcmVzdW1lZAorCSAqIHRvIGJlIHRoZSBsYXN0IHBlbmRpbmcgaW50ZXJydXB0LgorCSAqLworCWRvIHsKKwkJcmMgPSBwY2llaHBfaXNyKGlycSwgZGV2X2lkKTsKKwkJaWYgKHJjID09IElSUV9IQU5ETEVEKQorCQkJaGFuZGxlZCA9IElSUV9IQU5ETEVEOworCX0gd2hpbGUgKHJjID09IElSUV9IQU5ETEVEKTsKKworCS8qIFJldHVybiBJUlFfSEFORExFRCBpZiB3ZSBoYW5kbGVkIG9uZSBvciBtb3JlIGV2ZW50cyAqLworCXJldHVybiBoYW5kbGVkOworfQorCiB2b2lkIHBjaWVfZW5hYmxlX25vdGlmaWNhdGlvbihzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKIHsKIAl1MTYgY21kLCBtYXNrOwpAQCAtODA0LDYgKzgzNywxMCBAQAogCX0KIAljdHJsLT5wY2llID0gZGV2OwogCXBjaWVfY2FwYWJpbGl0eV9yZWFkX2R3b3JkKHBkZXYsIFBDSV9FWFBfU0xUQ0FQLCAmc2xvdF9jYXApOworCisJaWYgKHBkZXYtPmhvdHBsdWdfdXNlcl9pbmRpY2F0b3JzKQorCQlzbG90X2NhcCAmPSB+KFBDSV9FWFBfU0xUQ0FQX0FJUCB8IFBDSV9FWFBfU0xUQ0FQX1BJUCk7CisKIAljdHJsLT5zbG90X2NhcCA9IHNsb3RfY2FwOwogCW11dGV4X2luaXQoJmN0cmwtPmN0cmxfbG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY3RybC0+cXVldWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wbnZfcGhwLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3Budl9waHAuYwppbmRleCBlNjI0NWIwLi41NmVmYWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3Budl9waHAuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3Budl9waHAuYwpAQCAtMjIsNiArMjIsMTIgQEAKICNkZWZpbmUgRFJJVkVSX0FVVEhPUgkiR2F2aW4gU2hhbiwgSUJNIENvcnBvcmF0aW9uIgogI2RlZmluZSBEUklWRVJfREVTQwkiUG93ZXJQQyBQb3dlck5WIFBDSSBIb3RwbHVnIERyaXZlciIKIAorc3RydWN0IHBudl9waHBfZXZlbnQgeworCWJvb2wJCQlhZGRlZDsKKwlzdHJ1Y3QgcG52X3BocF9zbG90CSpwaHBfc2xvdDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKK307CisKIHN0YXRpYyBMSVNUX0hFQUQocG52X3BocF9zbG90X2xpc3QpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhwbnZfcGhwX2xvY2spOwogCkBAIC0yOSwxMiArMzUsNDAgQEAKIHN0YXRpYyB2b2lkIHBudl9waHBfdW5yZWdpc3Rlcl9vbmUoc3RydWN0IGRldmljZV9ub2RlICpkbik7CiBzdGF0aWMgdm9pZCBwbnZfcGhwX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZV9ub2RlICpkbik7CiAKK3N0YXRpYyB2b2lkIHBudl9waHBfZGlzYWJsZV9pcnEoc3RydWN0IHBudl9waHBfc2xvdCAqcGhwX3Nsb3QpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwaHBfc2xvdC0+cGRldjsKKwl1MTYgY3RybDsKKworCWlmIChwaHBfc2xvdC0+aXJxID4gMCkgeworCQlwY2llX2NhcGFiaWxpdHlfcmVhZF93b3JkKHBkZXYsIFBDSV9FWFBfU0xUQ1RMLCAmY3RybCk7CisJCWN0cmwgJj0gfihQQ0lfRVhQX1NMVENUTF9IUElFIHwKKwkJCSAgUENJX0VYUF9TTFRDVExfUERDRSB8CisJCQkgIFBDSV9FWFBfU0xUQ1RMX0RMTFNDRSk7CisJCXBjaWVfY2FwYWJpbGl0eV93cml0ZV93b3JkKHBkZXYsIFBDSV9FWFBfU0xUQ1RMLCBjdHJsKTsKKworCQlmcmVlX2lycShwaHBfc2xvdC0+aXJxLCBwaHBfc2xvdCk7CisJCXBocF9zbG90LT5pcnEgPSAwOworCX0KKworCWlmIChwaHBfc2xvdC0+d3EpIHsKKwkJZGVzdHJveV93b3JrcXVldWUocGhwX3Nsb3QtPndxKTsKKwkJcGhwX3Nsb3QtPndxID0gTlVMTDsKKwl9CisKKwlpZiAocGRldi0+bXNpeF9lbmFibGVkKQorCQlwY2lfZGlzYWJsZV9tc2l4KHBkZXYpOworCWVsc2UgaWYgKHBkZXYtPm1zaV9lbmFibGVkKQorCQlwY2lfZGlzYWJsZV9tc2kocGRldik7Cit9CisKIHN0YXRpYyB2b2lkIHBudl9waHBfZnJlZV9zbG90KHN0cnVjdCBrcmVmICprcmVmKQogewogCXN0cnVjdCBwbnZfcGhwX3Nsb3QgKnBocF9zbG90ID0gY29udGFpbmVyX29mKGtyZWYsCiAJCQkJCXN0cnVjdCBwbnZfcGhwX3Nsb3QsIGtyZWYpOwogCiAJV0FSTl9PTighbGlzdF9lbXB0eSgmcGhwX3Nsb3QtPmNoaWxkcmVuKSk7CisJcG52X3BocF9kaXNhYmxlX2lycShwaHBfc2xvdCk7CiAJa2ZyZWUocGhwX3Nsb3QtPm5hbWUpOwogCWtmcmVlKHBocF9zbG90KTsKIH0KQEAgLTEyMiw3ICsxNTYsNyBAQAogCiAJCW9mX25vZGVfcHV0KGRuKTsKIAkJcmVmY291bnQgPSBhdG9taWNfcmVhZCgmZG4tPmtvYmoua3JlZi5yZWZjb3VudCk7Ci0JCWlmICh1bmxpa2VseShyZWZjb3VudCAhPSAxKSkKKwkJaWYgKHJlZmNvdW50ICE9IDEpCiAJCQlwcl93YXJuKCJJbnZhbGlkIHJlZmNvdW50ICVkIG9uIDwlcz5cbiIsCiAJCQkJcmVmY291bnQsIG9mX25vZGVfZnVsbF9uYW1lKGRuKSk7CiAKQEAgLTE4NCwxMSArMjE4LDExIEBACiAKIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKGRuLCBjaGlsZCkgewogCQlyZXQgPSBvZl9jaGFuZ2VzZXRfYXR0YWNoX25vZGUob2NzLCBjaGlsZCk7Ci0JCWlmICh1bmxpa2VseShyZXQpKQorCQlpZiAocmV0KQogCQkJYnJlYWs7CiAKIAkJcmV0ID0gcG52X3BocF9wb3B1bGF0ZV9jaGFuZ2VzZXQob2NzLCBjaGlsZCk7Ci0JCWlmICh1bmxpa2VseShyZXQpKQorCQlpZiAocmV0KQogCQkJYnJlYWs7CiAJfQogCkBAIC0yMDEsNyArMjM1LDcgQEAKIAlzdHJ1Y3QgcGNpX2RuICpwZG47CiAKIAlwZG4gPSBwY2lfYWRkX2RldmljZV9ub2RlX2luZm8oaG9zZSwgZG4pOwotCWlmICh1bmxpa2VseSghcGRuKSkKKwlpZiAoIXBkbikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTIyNCwyMSArMjU4LDIxIEBACiAJICogZml0cyB0aGUgcmVhbCBzaXplLgogCSAqLwogCWZkdDEgPSBremFsbG9jKDB4MTAwMDAsIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghZmR0MSkpIHsKKwlpZiAoIWZkdDEpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZGV2X3dhcm4oJnBocF9zbG90LT5wZGV2LT5kZXYsICJDYW5ub3QgYWxsb2MgRkRUIGJsb2JcbiIpOwogCQlnb3RvIG91dDsKIAl9CiAKIAlyZXQgPSBwbnZfcGNpX2dldF9kZXZpY2VfdHJlZShwaHBfc2xvdC0+ZG4tPnBoYW5kbGUsIGZkdDEsIDB4MTAwMDApOwotCWlmICh1bmxpa2VseShyZXQpKSB7CisJaWYgKHJldCkgewogCQlkZXZfd2FybigmcGhwX3Nsb3QtPnBkZXYtPmRldiwgIkVycm9yICVkIGdldHRpbmcgRkRUIGJsb2JcbiIsCiAJCQkgcmV0KTsKIAkJZ290byBmcmVlX2ZkdDE7CiAJfQogCiAJZmR0ID0ga3phbGxvYyhmZHRfdG90YWxzaXplKGZkdDEpLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoIWZkdCkpIHsKKwlpZiAoIWZkdCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlkZXZfd2FybigmcGhwX3Nsb3QtPnBkZXYtPmRldiwgIkNhbm5vdCAlZCBieXRlcyBtZW1vcnlcbiIsCiAJCQkgZmR0X3RvdGFsc2l6ZShmZHQxKSk7CkBAIC0yNDgsNyArMjgyLDcgQEAKIAkvKiBVbmZsYXR0ZW4gZGV2aWNlIHRyZWUgYmxvYiAqLwogCW1lbWNweShmZHQsIGZkdDEsIGZkdF90b3RhbHNpemUoZmR0MSkpOwogCWR0ID0gb2ZfZmR0X3VuZmxhdHRlbl90cmVlKGZkdCwgcGhwX3Nsb3QtPmRuLCBOVUxMKTsKLQlpZiAodW5saWtlbHkoIWR0KSkgeworCWlmICghZHQpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZGV2X3dhcm4oJnBocF9zbG90LT5wZGV2LT5kZXYsICJDYW5ub3QgdW5mbGF0dGVuIEZEVFxuIik7CiAJCWdvdG8gZnJlZV9mZHQ7CkBAIC0yNTgsNyArMjkyLDcgQEAKIAlvZl9jaGFuZ2VzZXRfaW5pdCgmcGhwX3Nsb3QtPm9jcyk7CiAJcG52X3BocF9yZXZlcnNlX25vZGVzKHBocF9zbG90LT5kbik7CiAJcmV0ID0gcG52X3BocF9wb3B1bGF0ZV9jaGFuZ2VzZXQoJnBocF9zbG90LT5vY3MsIHBocF9zbG90LT5kbik7Ci0JaWYgKHVubGlrZWx5KHJldCkpIHsKKwlpZiAocmV0KSB7CiAJCXBudl9waHBfcmV2ZXJzZV9ub2RlcyhwaHBfc2xvdC0+ZG4pOwogCQlkZXZfd2FybigmcGhwX3Nsb3QtPnBkZXYtPmRldiwgIkVycm9yICVkIHBvcHVsYXRpbmcgY2hhbmdlc2V0XG4iLAogCQkJIHJldCk7CkBAIC0yNjcsNyArMzAxLDcgQEAKIAogCXBocF9zbG90LT5kbi0+Y2hpbGQgPSBOVUxMOwogCXJldCA9IG9mX2NoYW5nZXNldF9hcHBseSgmcGhwX3Nsb3QtPm9jcyk7Ci0JaWYgKHVubGlrZWx5KHJldCkpIHsKKwlpZiAocmV0KSB7CiAJCWRldl93YXJuKCZwaHBfc2xvdC0+cGRldi0+ZGV2LCAiRXJyb3IgJWQgYXBwbHlpbmcgY2hhbmdlc2V0XG4iLAogCQkJIHJldCk7CiAJCWdvdG8gZGVzdHJveV9jaGFuZ2VzZXQ7CkBAIC0zMDEsNyArMzM1LDcgQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gcG52X3BjaV9zZXRfcG93ZXJfc3RhdGUocGhwX3Nsb3QtPmlkLCBzdGF0ZSwgJm1zZyk7Ci0JaWYgKGxpa2VseShyZXQgPiAwKSkgeworCWlmIChyZXQgPiAwKSB7CiAJCWlmIChiZTY0X3RvX2NwdShtc2cucGFyYW1zWzFdKSAhPSBwaHBfc2xvdC0+ZG4tPnBoYW5kbGUJfHwKIAkJICAgIGJlNjRfdG9fY3B1KG1zZy5wYXJhbXNbMl0pICE9IHN0YXRlCQkJfHwKIAkJICAgIGJlNjRfdG9fY3B1KG1zZy5wYXJhbXNbM10pICE9IE9QQUxfU1VDQ0VTUykgewpAQCAtMzExLDcgKzM0NSw3IEBACiAJCQkJIGJlNjRfdG9fY3B1KG1zZy5wYXJhbXNbM10pKTsKIAkJCXJldHVybiAtRU5PTVNHOwogCQl9Ci0JfSBlbHNlIGlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCX0gZWxzZSBpZiAocmV0IDwgMCkgewogCQlkZXZfd2FybigmcGhwX3Nsb3QtPnBkZXYtPmRldiwgIkVycm9yICVkIHBvd2VyaW5nICVzXG4iLAogCQkJIHJldCwgKHN0YXRlID09IE9QQUxfUENJX1NMT1RfUE9XRVJfT04pID8gIm9uIiA6ICJvZmYiKTsKIAkJcmV0dXJuIHJldDsKQEAgLTMzOCw3ICszNzIsNyBAQAogCSAqIGJlIG9uLgogCSAqLwogCXJldCA9IHBudl9wY2lfZ2V0X3Bvd2VyX3N0YXRlKHBocF9zbG90LT5pZCwgJnBvd2VyX3N0YXRlKTsKLQlpZiAodW5saWtlbHkocmV0KSkgeworCWlmIChyZXQpIHsKIAkJZGV2X3dhcm4oJnBocF9zbG90LT5wZGV2LT5kZXYsICJFcnJvciAlZCBnZXR0aW5nIHBvd2VyIHN0YXR1c1xuIiwKIAkJCSByZXQpOwogCX0gZWxzZSB7CkBAIC0zNjAsNyArMzk0LDcgQEAKIAkgKiBnZXQgdGhhdCwgaXQgd2lsbCBmYWlsIGJhY2sgdG8gYmUgZW1wdHkuCiAJICovCiAJcmV0ID0gcG52X3BjaV9nZXRfcHJlc2VuY2Vfc3RhdGUocGhwX3Nsb3QtPmlkLCAmcHJlc2VuY2UpOwotCWlmIChsaWtlbHkocmV0ID49IDApKSB7CisJaWYgKHJldCA+PSAwKSB7CiAJCSpzdGF0ZSA9IHByZXNlbmNlOwogCQlzbG90LT5pbmZvLT5hZGFwdGVyX3N0YXR1cyA9IHByZXNlbmNlOwogCQlyZXQgPSAwOwpAQCAtMzkzLDcgKzQyNyw3IEBACiAKIAkvKiBSZXRyaWV2ZSBzbG90IHByZXNlbmNlIHN0YXR1cyAqLwogCXJldCA9IHBudl9waHBfZ2V0X2FkYXB0ZXJfc3RhdGUoc2xvdCwgJnByZXNlbmNlKTsKLQlpZiAodW5saWtlbHkocmV0KSkKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJLyogUHJvY2VlZCBpZiB0aGVyZSBoYXZlIG5vdGhpbmcgYmVoaW5kIHRoZSBzbG90ICovCkBAIC00MTQsNyArNDQ4LDcgQEAKIAkJcGhwX3Nsb3QtPnBvd2VyX3N0YXRlX2NoZWNrID0gdHJ1ZTsKIAogCQlyZXQgPSBwbnZfcGhwX2dldF9wb3dlcl9zdGF0ZShzbG90LCAmcG93ZXJfc3RhdHVzKTsKLQkJaWYgKHVubGlrZWx5KHJldCkpCisJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCiAJCWlmIChwb3dlcl9zdGF0dXMgIT0gT1BBTF9QQ0lfU0xPVF9QT1dFUl9PTikKQEAgLTQyMyw3ICs0NTcsNyBAQAogCiAJLyogQ2hlY2sgdGhlIHBvd2VyIHN0YXR1cy4gU2NhbiB0aGUgc2xvdCBpZiBpdCBpcyBhbHJlYWR5IG9uICovCiAJcmV0ID0gcG52X3BocF9nZXRfcG93ZXJfc3RhdGUoc2xvdCwgJnBvd2VyX3N0YXR1cyk7Ci0JaWYgKHVubGlrZWx5KHJldCkpCisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCWlmIChwb3dlcl9zdGF0dXMgPT0gT1BBTF9QQ0lfU0xPVF9QT1dFUl9PTikKQEAgLTQzMSw3ICs0NjUsNyBAQAogCiAJLyogUG93ZXIgaXMgb2ZmLCB0dXJuIGl0IG9uIGFuZCB0aGVuIHNjYW4gdGhlIHNsb3QgKi8KIAlyZXQgPSBwbnZfcGhwX3NldF9zbG90X3Bvd2VyX3N0YXRlKHNsb3QsIE9QQUxfUENJX1NMT1RfUE9XRVJfT04pOwotCWlmICh1bmxpa2VseShyZXQpKQorCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIHNjYW46CkBAIC01MTMsMjkgKzU0NywzMCBAQAogCXN0cnVjdCBwY2lfYnVzICpidXM7CiAJY29uc3QgY2hhciAqbGFiZWw7CiAJdWludDY0X3QgaWQ7CisJaW50IHJldDsKIAotCWxhYmVsID0gb2ZfZ2V0X3Byb3BlcnR5KGRuLCAiaWJtLHNsb3QtbGFiZWwiLCBOVUxMKTsKLQlpZiAodW5saWtlbHkoIWxhYmVsKSkKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhkbiwgImlibSxzbG90LWxhYmVsIiwgJmxhYmVsKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChwbnZfcGNpX2dldF9zbG90X2lkKGRuLCAmaWQpKQogCQlyZXR1cm4gTlVMTDsKIAogCWJ1cyA9IHBjaV9maW5kX2J1c19ieV9ub2RlKGRuKTsKLQlpZiAodW5saWtlbHkoIWJ1cykpCisJaWYgKCFidXMpCiAJCXJldHVybiBOVUxMOwogCiAJcGhwX3Nsb3QgPSBremFsbG9jKHNpemVvZigqcGhwX3Nsb3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoIXBocF9zbG90KSkKKwlpZiAoIXBocF9zbG90KQogCQlyZXR1cm4gTlVMTDsKIAogCXBocF9zbG90LT5uYW1lID0ga3N0cmR1cChsYWJlbCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCFwaHBfc2xvdC0+bmFtZSkpIHsKKwlpZiAoIXBocF9zbG90LT5uYW1lKSB7CiAJCWtmcmVlKHBocF9zbG90KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaWYgKGxpa2VseShkbi0+Y2hpbGQgJiYgUENJX0ROKGRuLT5jaGlsZCkpKQorCWlmIChkbi0+Y2hpbGQgJiYgUENJX0ROKGRuLT5jaGlsZCkpCiAJCXBocF9zbG90LT5zbG90X25vID0gUENJX1NMT1QoUENJX0ROKGRuLT5jaGlsZCktPmRldmZuKTsKIAllbHNlCiAJCXBocF9zbG90LT5zbG90X25vID0gLTE7ICAgLyogUGxhY2Vob2xkZXIgc2xvdCAqLwpAQCAtNTY3LDcgKzYwMiw3IEBACiAKIAkvKiBDaGVjayBpZiB0aGUgc2xvdCBpcyByZWdpc3RlcmVkIG9yIG5vdCAqLwogCXBhcmVudCA9IHBudl9waHBfZmluZF9zbG90KHBocF9zbG90LT5kbik7Ci0JaWYgKHVubGlrZWx5KHBhcmVudCkpIHsKKwlpZiAocGFyZW50KSB7CiAJCXBudl9waHBfcHV0X3Nsb3QocGFyZW50KTsKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJfQpAQCAtNTc1LDcgKzYxMCw3IEBACiAJLyogUmVnaXN0ZXIgUENJIHNsb3QgKi8KIAlyZXQgPSBwY2lfaHBfcmVnaXN0ZXIoJnBocF9zbG90LT5zbG90LCBwaHBfc2xvdC0+YnVzLAogCQkJICAgICAgcGhwX3Nsb3QtPnNsb3Rfbm8sIHBocF9zbG90LT5uYW1lKTsKLQlpZiAodW5saWtlbHkocmV0KSkgeworCWlmIChyZXQpIHsKIAkJZGV2X3dhcm4oJnBocF9zbG90LT5wZGV2LT5kZXYsICJFcnJvciAlZCByZWdpc3RlcmluZyBzbG90XG4iLAogCQkJIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC02MDksMzMgKzY0NCwyMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwbnZfcGhwX2VuYWJsZV9tc2l4KHN0cnVjdCBwbnZfcGhwX3Nsb3QgKnBocF9zbG90KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGhwX3Nsb3QtPnBkZXY7CisJc3RydWN0IG1zaXhfZW50cnkgZW50cnk7CisJaW50IG5yX2VudHJpZXMsIHJldDsKKwl1MTYgcGNpZV9mbGFnOworCisJLyogR2V0IHRvdGFsIG51bWJlciBvZiBNU0l4IGVudHJpZXMgKi8KKwlucl9lbnRyaWVzID0gcGNpX21zaXhfdmVjX2NvdW50KHBkZXYpOworCWlmIChucl9lbnRyaWVzIDwgMCkKKwkJcmV0dXJuIG5yX2VudHJpZXM7CisKKwkvKiBDaGVjayBob3RwbHVnIE1TSXggZW50cnkgaXMgaW4gcmFuZ2UgKi8KKwlwY2llX2NhcGFiaWxpdHlfcmVhZF93b3JkKHBkZXYsIFBDSV9FWFBfRkxBR1MsICZwY2llX2ZsYWcpOworCWVudHJ5LmVudHJ5ID0gKHBjaWVfZmxhZyAmIFBDSV9FWFBfRkxBR1NfSVJRKSA+PiA5OworCWlmIChlbnRyeS5lbnRyeSA+PSBucl9lbnRyaWVzKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCS8qIEVuYWJsZSBNU0l4ICovCisJcmV0ID0gcGNpX2VuYWJsZV9tc2l4X2V4YWN0KHBkZXYsICZlbnRyeSwgMSk7CisJaWYgKHJldCkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiRXJyb3IgJWQgZW5hYmxpbmcgTVNJeFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gZW50cnkudmVjdG9yOworfQorCitzdGF0aWMgdm9pZCBwbnZfcGhwX2V2ZW50X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBwbnZfcGhwX2V2ZW50ICpldmVudCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcG52X3BocF9ldmVudCwgd29yayk7CisJc3RydWN0IHBudl9waHBfc2xvdCAqcGhwX3Nsb3QgPSBldmVudC0+cGhwX3Nsb3Q7CisKKwlpZiAoZXZlbnQtPmFkZGVkKQorCQlwbnZfcGhwX2VuYWJsZV9zbG90KCZwaHBfc2xvdC0+c2xvdCk7CisJZWxzZQorCQlwbnZfcGhwX2Rpc2FibGVfc2xvdCgmcGhwX3Nsb3QtPnNsb3QpOworCisJa2ZyZWUoZXZlbnQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcG52X3BocF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcG52X3BocF9zbG90ICpwaHBfc2xvdCA9IGRhdGE7CisJc3RydWN0IHBjaV9kZXYgKnBjaGlsZCwgKnBkZXYgPSBwaHBfc2xvdC0+cGRldjsKKwlzdHJ1Y3QgZWVoX2RldiAqZWRldjsKKwlzdHJ1Y3QgZWVoX3BlICpwZTsKKwlzdHJ1Y3QgcG52X3BocF9ldmVudCAqZXZlbnQ7CisJdTE2IHN0cywgbHN0czsKKwl1OCBwcmVzZW5jZTsKKwlib29sIGFkZGVkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCXBjaWVfY2FwYWJpbGl0eV9yZWFkX3dvcmQocGRldiwgUENJX0VYUF9TTFRTVEEsICZzdHMpOworCXN0cyAmPSAoUENJX0VYUF9TTFRTVEFfUERDIHwgUENJX0VYUF9TTFRTVEFfRExMU0MpOworCXBjaWVfY2FwYWJpbGl0eV93cml0ZV93b3JkKHBkZXYsIFBDSV9FWFBfU0xUU1RBLCBzdHMpOworCWlmIChzdHMgJiBQQ0lfRVhQX1NMVFNUQV9ETExTQykgeworCQlwY2llX2NhcGFiaWxpdHlfcmVhZF93b3JkKHBkZXYsIFBDSV9FWFBfTE5LU1RBLCAmbHN0cyk7CisJCWFkZGVkID0gISEobHN0cyAmIFBDSV9FWFBfTE5LU1RBX0RMTExBKTsKKwl9IGVsc2UgaWYgKHN0cyAmIFBDSV9FWFBfU0xUU1RBX1BEQykgeworCQlyZXQgPSBwbnZfcGNpX2dldF9wcmVzZW5jZV9zdGF0ZShwaHBfc2xvdC0+aWQsICZwcmVzZW5jZSk7CisJCWlmICghcmV0KQorCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQlhZGRlZCA9ICEhKHByZXNlbmNlID09IE9QQUxfUENJX1NMT1RfUFJFU0VOVCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCS8qIEZyZWV6ZSB0aGUgcmVtb3ZlZCBQRSB0byBhdm9pZCB1bmV4cGVjdGVkIGVycm9yIHJlcG9ydGluZyAqLworCWlmICghYWRkZWQpIHsKKwkJcGNoaWxkID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZwaHBfc2xvdC0+YnVzLT5kZXZpY2VzLAorCQkJCQkJICBzdHJ1Y3QgcGNpX2RldiwgYnVzX2xpc3QpOworCQllZGV2ID0gcGNoaWxkID8gcGNpX2Rldl90b19lZWhfZGV2KHBjaGlsZCkgOiBOVUxMOworCQlwZSA9IGVkZXYgPyBlZGV2LT5wZSA6IE5VTEw7CisJCWlmIChwZSkgeworCQkJZWVoX3NlcmlhbGl6ZV9sb2NrKCZmbGFncyk7CisJCQllZWhfcGVfc3RhdGVfbWFyayhwZSwgRUVIX1BFX0lTT0xBVEVEKTsKKwkJCWVlaF9zZXJpYWxpemVfdW5sb2NrKGZsYWdzKTsKKwkJCWVlaF9wZV9zZXRfb3B0aW9uKHBlLCBFRUhfT1BUX0ZSRUVaRV9QRSk7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoZSBQRSBpcyBsZWZ0IGluIGZyb3plbiBzdGF0ZSBpZiB0aGUgZXZlbnQgaXMgbWlzc2VkLiBJdCdzCisJICogZmluZSBhcyB0aGUgUENJIGRldmljZXMgKFBFKSBhcmVuJ3QgZnVuY3Rpb25hbCBhbnkgbW9yZS4KKwkgKi8KKwlldmVudCA9IGt6YWxsb2Moc2l6ZW9mKCpldmVudCksIEdGUF9BVE9NSUMpOworCWlmICghZXZlbnQpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIlBDSSBzbG90IFslc10gbWlzc2VkIGhvdHBsdWcgZXZlbnQgMHglMDR4XG4iLAorCQkJIHBocF9zbG90LT5uYW1lLCBzdHMpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlBDSSBzbG90IFslc10gJXMgKElSUTogJWQpXG4iLAorCQkgcGhwX3Nsb3QtPm5hbWUsIGFkZGVkID8gImFkZGVkIiA6ICJyZW1vdmVkIiwgaXJxKTsKKwlJTklUX1dPUksoJmV2ZW50LT53b3JrLCBwbnZfcGhwX2V2ZW50X2hhbmRsZXIpOworCWV2ZW50LT5hZGRlZCA9IGFkZGVkOworCWV2ZW50LT5waHBfc2xvdCA9IHBocF9zbG90OworCXF1ZXVlX3dvcmsocGhwX3Nsb3QtPndxLCAmZXZlbnQtPndvcmspOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBwbnZfcGhwX2luaXRfaXJxKHN0cnVjdCBwbnZfcGhwX3Nsb3QgKnBocF9zbG90LCBpbnQgaXJxKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGhwX3Nsb3QtPnBkZXY7CisJdTE2IHN0cywgY3RybDsKKwlpbnQgcmV0OworCisJLyogQWxsb2NhdGUgd29ya3F1ZXVlICovCisJcGhwX3Nsb3QtPndxID0gYWxsb2Nfd29ya3F1ZXVlKCJwY2llaHAtJXMiLCAwLCAwLCBwaHBfc2xvdC0+bmFtZSk7CisJaWYgKCFwaHBfc2xvdC0+d3EpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkNhbm5vdCBhbGxvYyB3b3JrcXVldWVcbiIpOworCQlwbnZfcGhwX2Rpc2FibGVfaXJxKHBocF9zbG90KTsKKwkJcmV0dXJuOworCX0KKworCS8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXBjaWVfY2FwYWJpbGl0eV9yZWFkX3dvcmQocGRldiwgUENJX0VYUF9TTFRTVEEsICZzdHMpOworCXN0cyB8PSAoUENJX0VYUF9TTFRTVEFfUERDIHwgUENJX0VYUF9TTFRTVEFfRExMU0MpOworCXBjaWVfY2FwYWJpbGl0eV93cml0ZV93b3JkKHBkZXYsIFBDSV9FWFBfU0xUU1RBLCBzdHMpOworCisJLyogUmVxdWVzdCB0aGUgaW50ZXJydXB0ICovCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBwbnZfcGhwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCQkgIHBocF9zbG90LT5uYW1lLCBwaHBfc2xvdCk7CisJaWYgKHJldCkgeworCQlwbnZfcGhwX2Rpc2FibGVfaXJxKHBocF9zbG90KTsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkVycm9yICVkIGVuYWJsaW5nIElSUSAlZFxuIiwgcmV0LCBpcnEpOworCQlyZXR1cm47CisJfQorCisJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzICovCisJcGNpZV9jYXBhYmlsaXR5X3JlYWRfd29yZChwZGV2LCBQQ0lfRVhQX1NMVENUTCwgJmN0cmwpOworCWN0cmwgfD0gKFBDSV9FWFBfU0xUQ1RMX0hQSUUgfAorCQkgUENJX0VYUF9TTFRDVExfUERDRSB8CisJCSBQQ0lfRVhQX1NMVENUTF9ETExTQ0UpOworCXBjaWVfY2FwYWJpbGl0eV93cml0ZV93b3JkKHBkZXYsIFBDSV9FWFBfU0xUQ1RMLCBjdHJsKTsKKworCS8qIFRoZSBpbnRlcnJ1cHQgaXMgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IHdoZW4gQGlycSBpcyB2YWxpZCAqLworCXBocF9zbG90LT5pcnEgPSBpcnE7Cit9CisKK3N0YXRpYyB2b2lkIHBudl9waHBfZW5hYmxlX2lycShzdHJ1Y3QgcG52X3BocF9zbG90ICpwaHBfc2xvdCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHBocF9zbG90LT5wZGV2OworCWludCBpcnEsIHJldDsKKworCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkVycm9yICVkIGVuYWJsaW5nIGRldmljZVxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogRW5hYmxlIE1TSXggaW50ZXJydXB0ICovCisJaXJxID0gcG52X3BocF9lbmFibGVfbXNpeChwaHBfc2xvdCk7CisJaWYgKGlycSA+IDApIHsKKwkJcG52X3BocF9pbml0X2lycShwaHBfc2xvdCwgaXJxKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVXNlIE1TSSBpZiBNU0l4IGRvZXNuJ3Qgd29yay4gRmFpbCBiYWNrIHRvIGxlZ2FjeSBJTlR4CisJICogaWYgTVNJIGRvZXNuJ3Qgd29yayBlaXRoZXIKKwkgKi8KKwlyZXQgPSBwY2lfZW5hYmxlX21zaShwZGV2KTsKKwlpZiAoIXJldCB8fCBwZGV2LT5pcnEpIHsKKwkJaXJxID0gcGRldi0+aXJxOworCQlwbnZfcGhwX2luaXRfaXJxKHBocF9zbG90LCBpcnEpOworCX0KK30KKwogc3RhdGljIGludCBwbnZfcGhwX3JlZ2lzdGVyX29uZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuKQogewogCXN0cnVjdCBwbnZfcGhwX3Nsb3QgKnBocF9zbG90OwotCWNvbnN0IF9fYmUzMiAqcHJvcDMyOworCXUzMiBwcm9wMzI7CiAJaW50IHJldDsKIAogCS8qIENoZWNrIGlmIGl0J3MgaG90cGx1Z2dhYmxlIHNsb3QgKi8KLQlwcm9wMzIgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJpYm0sc2xvdC1wbHVnZ2FibGUiLCBOVUxMKTsKLQlpZiAoIXByb3AzMiB8fCAhb2ZfcmVhZF9udW1iZXIocHJvcDMyLCAxKSkKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkbiwgImlibSxzbG90LXBsdWdnYWJsZSIsICZwcm9wMzIpOworCWlmIChyZXQgfHwgIXByb3AzMikKIAkJcmV0dXJuIC1FTlhJTzsKIAotCXByb3AzMiA9IG9mX2dldF9wcm9wZXJ0eShkbiwgImlibSxyZXNldC1ieS1maXJtd2FyZSIsIE5VTEwpOwotCWlmICghcHJvcDMyIHx8ICFvZl9yZWFkX251bWJlcihwcm9wMzIsIDEpKQorCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRuLCAiaWJtLHJlc2V0LWJ5LWZpcm13YXJlIiwgJnByb3AzMik7CisJaWYgKHJldCB8fCAhcHJvcDMyKQogCQlyZXR1cm4gLUVOWElPOwogCiAJcGhwX3Nsb3QgPSBwbnZfcGhwX2FsbG9jX3Nsb3QoZG4pOwotCWlmICh1bmxpa2VseSghcGhwX3Nsb3QpKQorCWlmICghcGhwX3Nsb3QpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0ID0gcG52X3BocF9yZWdpc3Rlcl9zbG90KHBocF9zbG90KTsKLQlpZiAodW5saWtlbHkocmV0KSkKKwlpZiAocmV0KQogCQlnb3RvIGZyZWVfc2xvdDsKIAogCXJldCA9IHBudl9waHBfZW5hYmxlKHBocF9zbG90LCBmYWxzZSk7Ci0JaWYgKHVubGlrZWx5KHJldCkpCisJaWYgKHJldCkKIAkJZ290byB1bnJlZ2lzdGVyX3Nsb3Q7CiAKKwkvKiBFbmFibGUgaW50ZXJydXB0IGlmIHRoZSBzbG90IHN1cHBvcnRzIHN1cnByaXNlIGhvdHBsdWcgKi8KKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihkbiwgImlibSxzbG90LXN1cnByaXNlLXBsdWdnYWJsZSIsICZwcm9wMzIpOworCWlmICghcmV0ICYmIHByb3AzMikKKwkJcG52X3BocF9lbmFibGVfaXJxKHBocF9zbG90KTsKKwogCXJldHVybiAwOwogCiB1bnJlZ2lzdGVyX3Nsb3Q6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pb3YuYyBiL2RyaXZlcnMvcGNpL2lvdi5jCmluZGV4IDIxOTRiNDQuLmUzMGYwNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2lvdi5jCisrKyBiL2RyaXZlcnMvcGNpL2lvdi5jCkBAIC0xMzYsNyArMTM2LDEwIEBACiAJdmlydGZuLT5kZXZmbiA9IHBjaV9pb3ZfdmlydGZuX2RldmZuKGRldiwgaWQpOwogCXZpcnRmbi0+dmVuZG9yID0gZGV2LT52ZW5kb3I7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBpb3YtPnBvcyArIFBDSV9TUklPVl9WRl9ESUQsICZ2aXJ0Zm4tPmRldmljZSk7Ci0JcGNpX3NldHVwX2RldmljZSh2aXJ0Zm4pOworCXJjID0gcGNpX3NldHVwX2RldmljZSh2aXJ0Zm4pOworCWlmIChyYykKKwkJZ290byBmYWlsZWQwOworCiAJdmlydGZuLT5kZXYucGFyZW50ID0gZGV2LT5kZXYucGFyZW50OwogCXZpcnRmbi0+cGh5c2ZuID0gcGNpX2Rldl9nZXQoZGV2KTsKIAl2aXJ0Zm4tPmlzX3ZpcnRmbiA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9tc2kuYyBiL2RyaXZlcnMvcGNpL21zaS5jCmluZGV4IDk4ZjEyMjIuLmJmZGQwNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5jCisrKyBiL2RyaXZlcnMvcGNpL21zaS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGlfaW9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KQEAgLTU0OSwxNSArNTUwLDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBtc2lfZGVzYyAqbXNpX3NldHVwX2VudHJ5KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBudmVjKQorc3RhdGljIHN0cnVjdCBtc2lfZGVzYyAqCittc2lfc2V0dXBfZW50cnkoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG52ZWMsIGJvb2wgYWZmaW5pdHkpCiB7Ci0JdTE2IGNvbnRyb2w7CisJc3RydWN0IGNwdW1hc2sgKm1hc2tzID0gTlVMTDsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OworCXUxNiBjb250cm9sOworCisJaWYgKGFmZmluaXR5KSB7CisJCW1hc2tzID0gaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrcyhkZXYtPmlycV9hZmZpbml0eSwgbnZlYyk7CisJCWlmICghbWFza3MpCisJCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBhZmZpbml0eSBtYXNrcywgaWdub3JpbmdcbiIpOworCX0KIAogCS8qIE1TSSBFbnRyeSBJbml0aWFsaXphdGlvbiAqLwotCWVudHJ5ID0gYWxsb2NfbXNpX2VudHJ5KCZkZXYtPmRldik7CisJZW50cnkgPSBhbGxvY19tc2lfZW50cnkoJmRldi0+ZGV2LCBudmVjLCBtYXNrcyk7CiAJaWYgKCFlbnRyeSkKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gb3V0OwogCiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBkZXYtPm1zaV9jYXAgKyBQQ0lfTVNJX0ZMQUdTLCAmY29udHJvbCk7CiAKQEAgLTU2OCw4ICs1NzcsNiBAQAogCWVudHJ5LT5tc2lfYXR0cmliLmRlZmF1bHRfaXJxCT0gZGV2LT5pcnE7CS8qIFNhdmUgSU9BUElDIElSUSAqLwogCWVudHJ5LT5tc2lfYXR0cmliLm11bHRpX2NhcAk9IChjb250cm9sICYgUENJX01TSV9GTEFHU19RTUFTSykgPj4gMTsKIAllbnRyeS0+bXNpX2F0dHJpYi5tdWx0aXBsZQk9IGlsb2cyKF9fcm91bmR1cF9wb3dfb2ZfdHdvKG52ZWMpKTsKLQllbnRyeS0+bnZlY191c2VkCQk9IG52ZWM7Ci0JZW50cnktPmFmZmluaXR5CQkJPSBkZXYtPmlycV9hZmZpbml0eTsKIAogCWlmIChjb250cm9sICYgUENJX01TSV9GTEFHU182NEJJVCkKIAkJZW50cnktPm1hc2tfcG9zID0gZGV2LT5tc2lfY2FwICsgUENJX01TSV9NQVNLXzY0OwpAQCAtNTgwLDYgKzU4Nyw4IEBACiAJaWYgKGVudHJ5LT5tc2lfYXR0cmliLm1hc2tiaXQpCiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIGVudHJ5LT5tYXNrX3BvcywgJmVudHJ5LT5tYXNrZWQpOwogCitvdXQ6CisJa2ZyZWUobWFza3MpOwogCXJldHVybiBlbnRyeTsKIH0KIApAQCAtNjA4LDcgKzYxNyw3IEBACiAgKiBhbiBlcnJvciwgYW5kIGEgcG9zaXRpdmUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGludGVycnVwdHMKICAqIHdoaWNoIGNvdWxkIGhhdmUgYmVlbiBhbGxvY2F0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgbXNpX2NhcGFiaWxpdHlfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnZlYykKK3N0YXRpYyBpbnQgbXNpX2NhcGFiaWxpdHlfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbnZlYywgYm9vbCBhZmZpbml0eSkKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwogCWludCByZXQ7CkBAIC02MTYsNyArNjI1LDcgQEAKIAogCXBjaV9tc2lfc2V0X2VuYWJsZShkZXYsIDApOwkvKiBEaXNhYmxlIE1TSSBkdXJpbmcgc2V0IHVwICovCiAKLQllbnRyeSA9IG1zaV9zZXR1cF9lbnRyeShkZXYsIG52ZWMpOworCWVudHJ5ID0gbXNpX3NldHVwX2VudHJ5KGRldiwgbnZlYywgYWZmaW5pdHkpOwogCWlmICghZW50cnkpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC02NzksMjggKzY4OCwyOSBAQAogfQogCiBzdGF0aWMgaW50IG1zaXhfc2V0dXBfZW50cmllcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkIF9faW9tZW0gKmJhc2UsCi0JCQkgICAgICBzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywgaW50IG52ZWMpCisJCQkgICAgICBzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywgaW50IG52ZWMsCisJCQkgICAgICBib29sIGFmZmluaXR5KQogewotCWNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrID0gTlVMTDsKKwlzdHJ1Y3QgY3B1bWFzayAqY3VybXNrLCAqbWFza3MgPSBOVUxMOwogCXN0cnVjdCBtc2lfZGVzYyAqZW50cnk7Ci0JaW50IGNwdSA9IC0xLCBpOworCWludCByZXQsIGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnZlYzsgaSsrKSB7Ci0JCWlmIChkZXYtPmlycV9hZmZpbml0eSkgewotCQkJY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgZGV2LT5pcnFfYWZmaW5pdHkpOwotCQkJaWYgKGNwdSA+PSBucl9jcHVfaWRzKQotCQkJCWNwdSA9IGNwdW1hc2tfZmlyc3QoZGV2LT5pcnFfYWZmaW5pdHkpOwotCQkJbWFzayA9IGNwdW1hc2tfb2YoY3B1KTsKLQkJfQorCWlmIChhZmZpbml0eSkgeworCQltYXNrcyA9IGlycV9jcmVhdGVfYWZmaW5pdHlfbWFza3MoZGV2LT5pcnFfYWZmaW5pdHksIG52ZWMpOworCQlpZiAoIW1hc2tzKQorCQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUgYWZmaW5pdHkgbWFza3MsIGlnbm9yaW5nXG4iKTsKKwl9CiAKLQkJZW50cnkgPSBhbGxvY19tc2lfZW50cnkoJmRldi0+ZGV2KTsKKwlmb3IgKGkgPSAwLCBjdXJtc2sgPSBtYXNrczsgaSA8IG52ZWM7IGkrKykgeworCQllbnRyeSA9IGFsbG9jX21zaV9lbnRyeSgmZGV2LT5kZXYsIDEsIGN1cm1zayk7CiAJCWlmICghZW50cnkpIHsKIAkJCWlmICghaSkKIAkJCQlpb3VubWFwKGJhc2UpOwogCQkJZWxzZQogCQkJCWZyZWVfbXNpX2lycXMoZGV2KTsKIAkJCS8qIE5vIGVub3VnaCBtZW1vcnkuIERvbid0IHRyeSBhZ2FpbiAqLwotCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQllbnRyeS0+bXNpX2F0dHJpYi5pc19tc2l4CT0gMTsKQEAgLTcxMSwxMiArNzIxLDE0IEBACiAJCQllbnRyeS0+bXNpX2F0dHJpYi5lbnRyeV9uciA9IGk7CiAJCWVudHJ5LT5tc2lfYXR0cmliLmRlZmF1bHRfaXJxCT0gZGV2LT5pcnE7CiAJCWVudHJ5LT5tYXNrX2Jhc2UJCT0gYmFzZTsKLQkJZW50cnktPm52ZWNfdXNlZAkJPSAxOwotCQllbnRyeS0+YWZmaW5pdHkJCQk9IG1hc2s7CiAKIAkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsIGRldl90b19tc2lfbGlzdCgmZGV2LT5kZXYpKTsKKwkJaWYgKG1hc2tzKQorCQkJY3VybXNrKys7CiAJfQotCisJcmV0ID0gMDsKK291dDoKKwlrZnJlZShtYXNrcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc0NSw4ICs3NTcsOCBAQAogICogc2luZ2xlIE1TSS1YIGlycS4gQSByZXR1cm4gb2YgemVybyBpbmRpY2F0ZXMgdGhlIHN1Y2Nlc3NmdWwgc2V0dXAgb2YKICAqIHJlcXVlc3RlZCBNU0ktWCBlbnRyaWVzIHdpdGggYWxsb2NhdGVkIGlycXMgb3Igbm9uLXplcm8gZm9yIG90aGVyd2lzZS4KICAqKi8KLXN0YXRpYyBpbnQgbXNpeF9jYXBhYmlsaXR5X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldiwKLQkJCQlzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywgaW50IG52ZWMpCitzdGF0aWMgaW50IG1zaXhfY2FwYWJpbGl0eV9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzLAorCQkJCWludCBudmVjLCBib29sIGFmZmluaXR5KQogewogCWludCByZXQ7CiAJdTE2IGNvbnRyb2w7CkBAIC03NjEsNyArNzczLDcgQEAKIAlpZiAoIWJhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmV0ID0gbXNpeF9zZXR1cF9lbnRyaWVzKGRldiwgYmFzZSwgZW50cmllcywgbnZlYyk7CisJcmV0ID0gbXNpeF9zZXR1cF9lbnRyaWVzKGRldiwgYmFzZSwgZW50cmllcywgbnZlYywgYWZmaW5pdHkpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTk0MSwyMiArOTUzLDggQEAKIH0KIEVYUE9SVF9TWU1CT0wocGNpX21zaXhfdmVjX2NvdW50KTsKIAotLyoqCi0gKiBwY2lfZW5hYmxlX21zaXggLSBjb25maWd1cmUgZGV2aWNlJ3MgTVNJLVggY2FwYWJpbGl0eSBzdHJ1Y3R1cmUKLSAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIHBjaV9kZXYgZGF0YSBzdHJ1Y3R1cmUgb2YgTVNJLVggZGV2aWNlIGZ1bmN0aW9uCi0gKiBAZW50cmllczogcG9pbnRlciB0byBhbiBhcnJheSBvZiBNU0ktWCBlbnRyaWVzIChvcHRpb25hbCkKLSAqIEBudmVjOiBudW1iZXIgb2YgTVNJLVggaXJxcyByZXF1ZXN0ZWQgZm9yIGFsbG9jYXRpb24gYnkgZGV2aWNlIGRyaXZlcgotICoKLSAqIFNldHVwIHRoZSBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZSBvZiBkZXZpY2UgZnVuY3Rpb24gd2l0aCB0aGUgbnVtYmVyCi0gKiBvZiByZXF1ZXN0ZWQgaXJxcyB1cG9uIGl0cyBzb2Z0d2FyZSBkcml2ZXIgY2FsbCB0byByZXF1ZXN0IGZvcgotICogTVNJLVggbW9kZSBlbmFibGVkIG9uIGl0cyBoYXJkd2FyZSBkZXZpY2UgZnVuY3Rpb24uIEEgcmV0dXJuIG9mIHplcm8KLSAqIGluZGljYXRlcyB0aGUgc3VjY2Vzc2Z1bCBjb25maWd1cmF0aW9uIG9mIE1TSS1YIGNhcGFiaWxpdHkgc3RydWN0dXJlCi0gKiB3aXRoIG5ldyBhbGxvY2F0ZWQgTVNJLVggaXJxcy4gQSByZXR1cm4gb2YgPCAwIGluZGljYXRlcyBhIGZhaWx1cmUuCi0gKiBPciBhIHJldHVybiBvZiA+IDAgaW5kaWNhdGVzIHRoYXQgZHJpdmVyIHJlcXVlc3QgaXMgZXhjZWVkaW5nIHRoZSBudW1iZXIKLSAqIG9mIGlycXMgb3IgTVNJLVggdmVjdG9ycyBhdmFpbGFibGUuIERyaXZlciBzaG91bGQgdXNlIHRoZSByZXR1cm5lZCB2YWx1ZSB0bwotICogcmUtc2VuZCBpdHMgcmVxdWVzdC4KLSAqKi8KLWludCBwY2lfZW5hYmxlX21zaXgoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXMsIGludCBudmVjKQorc3RhdGljIGludCBfX3BjaV9lbmFibGVfbXNpeChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywKKwkJCSAgICAgaW50IG52ZWMsIGJvb2wgYWZmaW5pdHkpCiB7CiAJaW50IG5yX2VudHJpZXM7CiAJaW50IGksIGo7CkBAIC05ODgsNyArOTg2LDI3IEBACiAJCWRldl9pbmZvKCZkZXYtPmRldiwgImNhbid0IGVuYWJsZSBNU0ktWCAoTVNJIElSUSBhbHJlYWR5IGFzc2lnbmVkKVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlyZXR1cm4gbXNpeF9jYXBhYmlsaXR5X2luaXQoZGV2LCBlbnRyaWVzLCBudmVjKTsKKwlyZXR1cm4gbXNpeF9jYXBhYmlsaXR5X2luaXQoZGV2LCBlbnRyaWVzLCBudmVjLCBhZmZpbml0eSk7Cit9CisKKy8qKgorICogcGNpX2VuYWJsZV9tc2l4IC0gY29uZmlndXJlIGRldmljZSdzIE1TSS1YIGNhcGFiaWxpdHkgc3RydWN0dXJlCisgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBwY2lfZGV2IGRhdGEgc3RydWN0dXJlIG9mIE1TSS1YIGRldmljZSBmdW5jdGlvbgorICogQGVudHJpZXM6IHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgTVNJLVggZW50cmllcyAob3B0aW9uYWwpCisgKiBAbnZlYzogbnVtYmVyIG9mIE1TSS1YIGlycXMgcmVxdWVzdGVkIGZvciBhbGxvY2F0aW9uIGJ5IGRldmljZSBkcml2ZXIKKyAqCisgKiBTZXR1cCB0aGUgTVNJLVggY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgb2YgZGV2aWNlIGZ1bmN0aW9uIHdpdGggdGhlIG51bWJlcgorICogb2YgcmVxdWVzdGVkIGlycXMgdXBvbiBpdHMgc29mdHdhcmUgZHJpdmVyIGNhbGwgdG8gcmVxdWVzdCBmb3IKKyAqIE1TSS1YIG1vZGUgZW5hYmxlZCBvbiBpdHMgaGFyZHdhcmUgZGV2aWNlIGZ1bmN0aW9uLiBBIHJldHVybiBvZiB6ZXJvCisgKiBpbmRpY2F0ZXMgdGhlIHN1Y2Nlc3NmdWwgY29uZmlndXJhdGlvbiBvZiBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZQorICogd2l0aCBuZXcgYWxsb2NhdGVkIE1TSS1YIGlycXMuIEEgcmV0dXJuIG9mIDwgMCBpbmRpY2F0ZXMgYSBmYWlsdXJlLgorICogT3IgYSByZXR1cm4gb2YgPiAwIGluZGljYXRlcyB0aGF0IGRyaXZlciByZXF1ZXN0IGlzIGV4Y2VlZGluZyB0aGUgbnVtYmVyCisgKiBvZiBpcnFzIG9yIE1TSS1YIHZlY3RvcnMgYXZhaWxhYmxlLiBEcml2ZXIgc2hvdWxkIHVzZSB0aGUgcmV0dXJuZWQgdmFsdWUgdG8KKyAqIHJlLXNlbmQgaXRzIHJlcXVlc3QuCisgKiovCitpbnQgcGNpX2VuYWJsZV9tc2l4KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzLCBpbnQgbnZlYykKK3sKKwlyZXR1cm4gX19wY2lfZW5hYmxlX21zaXgoZGV2LCBlbnRyaWVzLCBudmVjLCBmYWxzZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9lbmFibGVfbXNpeCk7CiAKQEAgLTEwNDEsNiArMTA1OSw3IEBACiBzdGF0aWMgaW50IF9fcGNpX2VuYWJsZV9tc2lfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IG1pbnZlYywgaW50IG1heHZlYywKIAkJdW5zaWduZWQgaW50IGZsYWdzKQogeworCWJvb2wgYWZmaW5pdHkgPSBmbGFncyAmIFBDSV9JUlFfQUZGSU5JVFk7CiAJaW50IG52ZWM7CiAJaW50IHJjOwogCkBAIC0xMDY5LDE5ICsxMDg4LDE3IEBACiAJCW52ZWMgPSBtYXh2ZWM7CiAKIAlmb3IgKDs7KSB7Ci0JCWlmIChmbGFncyAmIFBDSV9JUlFfQUZGSU5JVFkpIHsKLQkJCWRldi0+aXJxX2FmZmluaXR5ID0gaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrKCZudmVjKTsKKwkJaWYgKGFmZmluaXR5KSB7CisJCQludmVjID0gaXJxX2NhbGNfYWZmaW5pdHlfdmVjdG9ycyhkZXYtPmlycV9hZmZpbml0eSwKKwkJCQkJbnZlYyk7CiAJCQlpZiAobnZlYyA8IG1pbnZlYykKIAkJCQlyZXR1cm4gLUVOT1NQQzsKIAkJfQogCi0JCXJjID0gbXNpX2NhcGFiaWxpdHlfaW5pdChkZXYsIG52ZWMpOworCQlyYyA9IG1zaV9jYXBhYmlsaXR5X2luaXQoZGV2LCBudmVjLCBhZmZpbml0eSk7CiAJCWlmIChyYyA9PSAwKQogCQkJcmV0dXJuIG52ZWM7CiAKLQkJa2ZyZWUoZGV2LT5pcnFfYWZmaW5pdHkpOwotCQlkZXYtPmlycV9hZmZpbml0eSA9IE5VTEw7Ci0KIAkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKIAkJaWYgKHJjIDwgbWludmVjKQpAQCAtMTExMywyNiArMTEzMCwyNCBAQAogCQlzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywgaW50IG1pbnZlYywgaW50IG1heHZlYywKIAkJdW5zaWduZWQgaW50IGZsYWdzKQogewotCWludCBudmVjID0gbWF4dmVjOwotCWludCByYzsKKwlib29sIGFmZmluaXR5ID0gZmxhZ3MgJiBQQ0lfSVJRX0FGRklOSVRZOworCWludCByYywgbnZlYyA9IG1heHZlYzsKIAogCWlmIChtYXh2ZWMgPCBtaW52ZWMpCiAJCXJldHVybiAtRVJBTkdFOwogCiAJZm9yICg7OykgewotCQlpZiAoZmxhZ3MgJiBQQ0lfSVJRX0FGRklOSVRZKSB7Ci0JCQlkZXYtPmlycV9hZmZpbml0eSA9IGlycV9jcmVhdGVfYWZmaW5pdHlfbWFzaygmbnZlYyk7CisJCWlmIChhZmZpbml0eSkgeworCQkJbnZlYyA9IGlycV9jYWxjX2FmZmluaXR5X3ZlY3RvcnMoZGV2LT5pcnFfYWZmaW5pdHksCisJCQkJCW52ZWMpOwogCQkJaWYgKG52ZWMgPCBtaW52ZWMpCiAJCQkJcmV0dXJuIC1FTk9TUEM7CiAJCX0KIAotCQlyYyA9IHBjaV9lbmFibGVfbXNpeChkZXYsIGVudHJpZXMsIG52ZWMpOworCQlyYyA9IF9fcGNpX2VuYWJsZV9tc2l4KGRldiwgZW50cmllcywgbnZlYywgYWZmaW5pdHkpOwogCQlpZiAocmMgPT0gMCkKIAkJCXJldHVybiBudmVjOwogCi0JCWtmcmVlKGRldi0+aXJxX2FmZmluaXR5KTsKLQkJZGV2LT5pcnFfYWZmaW5pdHkgPSBOVUxMOwotCiAJCWlmIChyYyA8IDApCiAJCQlyZXR1cm4gcmM7CiAJCWlmIChyYyA8IG1pbnZlYykKQEAgLTEyNTYsNiArMTI3MSwzNyBAQAogfQogRVhQT1JUX1NZTUJPTChwY2lfaXJxX3ZlY3Rvcik7CiAKKy8qKgorICogcGNpX2lycV9nZXRfYWZmaW5pdHkgLSByZXR1cm4gdGhlIGFmZmluaXR5IG9mIGEgcGFydGljdWxhciBtc2kgdmVjdG9yCisgKiBAZGV2OglQQ0kgZGV2aWNlIHRvIG9wZXJhdGUgb24KKyAqIEBucjoJCWRldmljZS1yZWxhdGl2ZSBpbnRlcnJ1cHQgdmVjdG9yIGluZGV4ICgwLWJhc2VkKS4KKyAqLworY29uc3Qgc3RydWN0IGNwdW1hc2sgKnBjaV9pcnFfZ2V0X2FmZmluaXR5KHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBucikKK3sKKwlpZiAoZGV2LT5tc2l4X2VuYWJsZWQpIHsKKwkJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKKwkJaW50IGkgPSAwOworCisJCWZvcl9lYWNoX3BjaV9tc2lfZW50cnkoZW50cnksIGRldikgeworCQkJaWYgKGkgPT0gbnIpCisJCQkJcmV0dXJuIGVudHJ5LT5hZmZpbml0eTsKKwkJCWkrKzsKKwkJfQorCQlXQVJOX09OX09OQ0UoMSk7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAoZGV2LT5tc2lfZW5hYmxlZCkgeworCQlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5ID0gZmlyc3RfcGNpX21zaV9lbnRyeShkZXYpOworCisJCWlmIChXQVJOX09OX09OQ0UoIWVudHJ5IHx8IG5yID49IGVudHJ5LT5udmVjX3VzZWQpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJcmV0dXJuICZlbnRyeS0+YWZmaW5pdHlbbnJdOworCX0gZWxzZSB7CisJCXJldHVybiBjcHVfcG9zc2libGVfbWFzazsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHBjaV9pcnFfZ2V0X2FmZmluaXR5KTsKKwogc3RydWN0IHBjaV9kZXYgKm1zaV9kZXNjX3RvX3BjaV9kZXYoc3RydWN0IG1zaV9kZXNjICpkZXNjKQogewogCXJldHVybiB0b19wY2lfZGV2KGRlc2MtPmRldik7CkBAIC0xNTAyLDggKzE1NDgsOCBAQAogCXBjaV9mb3JfZWFjaF9kbWFfYWxpYXMocGRldiwgZ2V0X21zaV9pZF9jYiwgJnJpZCk7CiAKIAlvZl9ub2RlID0gaXJxX2RvbWFpbl9nZXRfb2Zfbm9kZShkb21haW4pOwotCWlmIChvZl9ub2RlKQotCQlyaWQgPSBvZl9tc2lfbWFwX3JpZCgmcGRldi0+ZGV2LCBvZl9ub2RlLCByaWQpOworCXJpZCA9IG9mX25vZGUgPyBvZl9tc2lfbWFwX3JpZCgmcGRldi0+ZGV2LCBvZl9ub2RlLCByaWQpIDoKKwkJCWlvcnRfbXNpX21hcF9yaWQoJnBkZXYtPmRldiwgcmlkKTsKIAogCXJldHVybiByaWQ7CiB9CkBAIC0xNTE5LDkgKzE1NjUsMTMgQEAKICAqLwogc3RydWN0IGlycV9kb21haW4gKnBjaV9tc2lfZ2V0X2RldmljZV9kb21haW4oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CisJc3RydWN0IGlycV9kb21haW4gKmRvbTsKIAl1MzIgcmlkID0gMDsKIAogCXBjaV9mb3JfZWFjaF9kbWFfYWxpYXMocGRldiwgZ2V0X21zaV9pZF9jYiwgJnJpZCk7Ci0JcmV0dXJuIG9mX21zaV9tYXBfZ2V0X2RldmljZV9kb21haW4oJnBkZXYtPmRldiwgcmlkKTsKKwlkb20gPSBvZl9tc2lfbWFwX2dldF9kZXZpY2VfZG9tYWluKCZwZGV2LT5kZXYsIHJpZCk7CisJaWYgKCFkb20pCisJCWRvbSA9IGlvcnRfZ2V0X2RldmljZV9kb21haW4oJnBkZXYtPmRldiwgcmlkKTsKKwlyZXR1cm4gZG9tOwogfQogI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJX0lSUV9ET01BSU4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMgYi9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCmluZGV4IDlhMDMzZTguLmQ5NjZkNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwpAQCAtNDUyLDYgKzQ1MiwyNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorc3RhdGljIHBjaV9wb3dlcl90IGFjcGlfcGNpX2dldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IEFDUElfQ09NUEFOSU9OKCZkZXYtPmRldik7CisJc3RhdGljIGNvbnN0IHBjaV9wb3dlcl90IHN0YXRlX2NvbnZbXSA9IHsKKwkJW0FDUElfU1RBVEVfRDBdICAgICAgPSBQQ0lfRDAsCisJCVtBQ1BJX1NUQVRFX0QxXSAgICAgID0gUENJX0QxLAorCQlbQUNQSV9TVEFURV9EMl0gICAgICA9IFBDSV9EMiwKKwkJW0FDUElfU1RBVEVfRDNfSE9UXSAgPSBQQ0lfRDNob3QsCisJCVtBQ1BJX1NUQVRFX0QzX0NPTERdID0gUENJX0QzY29sZCwKKwl9OworCWludCBzdGF0ZTsKKworCWlmICghYWRldiB8fCAhYWNwaV9kZXZpY2VfcG93ZXJfbWFuYWdlYWJsZShhZGV2KSkKKwkJcmV0dXJuIFBDSV9VTktOT1dOOworCisJaWYgKGFjcGlfZGV2aWNlX2dldF9wb3dlcihhZGV2LCAmc3RhdGUpIHx8IHN0YXRlID09IEFDUElfU1RBVEVfVU5LTk9XTikKKwkJcmV0dXJuIFBDSV9VTktOT1dOOworCisJcmV0dXJuIHN0YXRlX2NvbnZbc3RhdGVdOworfQorCiBzdGF0aWMgYm9vbCBhY3BpX3BjaV9jYW5fd2FrZXVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2ID0gQUNQSV9DT01QQU5JT04oJmRldi0+ZGV2KTsKQEAgLTUzNCw2ICs1NTUsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfcGxhdGZvcm1fcG1fb3BzIGFjcGlfcGNpX3BsYXRmb3JtX3BtID0gewogCS5pc19tYW5hZ2VhYmxlID0gYWNwaV9wY2lfcG93ZXJfbWFuYWdlYWJsZSwKIAkuc2V0X3N0YXRlID0gYWNwaV9wY2lfc2V0X3Bvd2VyX3N0YXRlLAorCS5nZXRfc3RhdGUgPSBhY3BpX3BjaV9nZXRfcG93ZXJfc3RhdGUsCiAJLmNob29zZV9zdGF0ZSA9IGFjcGlfcGNpX2Nob29zZV9zdGF0ZSwKIAkuc2xlZXBfd2FrZSA9IGFjcGlfcGNpX3NsZWVwX3dha2UsCiAJLnJ1bl93YWtlID0gYWNwaV9wY2lfcnVuX3dha2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMgYi9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKaW5kZXggZTM5YTY3Yy4uMWNjY2UxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwpAQCAtNDY2LDcgKzQ2Niw2IEBACiAJcGNpX21zaV9zaHV0ZG93bihwY2lfZGV2KTsKIAlwY2lfbXNpeF9zaHV0ZG93bihwY2lfZGV2KTsKIAotI2lmZGVmIENPTkZJR19LRVhFQ19DT1JFCiAJLyoKIAkgKiBJZiB0aGlzIGlzIGEga2V4ZWMgcmVib290LCB0dXJuIG9mZiBCdXMgTWFzdGVyIGJpdCBvbiB0aGUKIAkgKiBkZXZpY2UgdG8gdGVsbCBpdCB0byBub3QgY29udGludWUgdG8gZG8gRE1BLiBEb24ndCB0b3VjaApAQCAtNDc2LDcgKzQ3NSw2IEBACiAJICovCiAJaWYgKGtleGVjX2luX3Byb2dyZXNzICYmIChwY2lfZGV2LT5jdXJyZW50X3N0YXRlIDw9IFBDSV9EM2hvdCkpCiAJCXBjaV9jbGVhcl9tYXN0ZXIocGNpX2Rldik7Ci0jZW5kaWYKIH0KIAogI2lmZGVmIENPTkZJR19QTQpAQCAtNjg0LDggKzY4MiwxOSBAQAogCiBzdGF0aWMgdm9pZCBwY2lfcG1fY29tcGxldGUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXBjaV9kZXZfY29tcGxldGVfcmVzdW1lKHRvX3BjaV9kZXYoZGV2KSk7Ci0JcG1fY29tcGxldGVfd2l0aF9yZXN1bWVfY2hlY2soZGV2KTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKKworCXBjaV9kZXZfY29tcGxldGVfcmVzdW1lKHBjaV9kZXYpOworCXBtX2dlbmVyaWNfY29tcGxldGUoZGV2KTsKKworCS8qIFJlc3VtZSBkZXZpY2UgaWYgcGxhdGZvcm0gZmlybXdhcmUgaGFzIHB1dCBpdCBpbiByZXNldC1wb3dlci1vbiAqLworCWlmIChkZXYtPnBvd2VyLmRpcmVjdF9jb21wbGV0ZSAmJiBwbV9yZXN1bWVfdmlhX2Zpcm13YXJlKCkpIHsKKwkJcGNpX3Bvd2VyX3QgcHJlX3NsZWVwX3N0YXRlID0gcGNpX2Rldi0+Y3VycmVudF9zdGF0ZTsKKworCQlwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUocGNpX2RldiwgcGNpX2Rldi0+Y3VycmVudF9zdGF0ZSk7CisJCWlmIChwY2lfZGV2LT5jdXJyZW50X3N0YXRlIDwgcHJlX3NsZWVwX3N0YXRlKQorCQkJcG1fcmVxdWVzdF9yZXN1bWUoZGV2KTsKKwl9CiB9CiAKICNlbHNlIC8qICFDT05GSUdfUE1fU0xFRVAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1taWQuYyBiL2RyaXZlcnMvcGNpL3BjaS1taWQuYwppbmRleCBjODc4YWE3Li41NWY0NTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktbWlkLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLW1pZC5jCkBAIC02MCw4ICs2MCwxMyBAQAogCiAjZGVmaW5lIElDUFUobW9kZWwpCXsgWDg2X1ZFTkRPUl9JTlRFTCwgNiwgbW9kZWwsIFg4Nl9GRUFUVVJFX0FOWSwgfQogCisvKgorICogVGhpcyB0YWJsZSBzaG91bGQgYmUgaW4gc3luYyB3aXRoIHRoZSBvbmUgaW4KKyAqIGFyY2gveDg2L3BsYXRmb3JtL2ludGVsLW1pZC9wd3IuYy4KKyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB4ODZfY3B1X2lkIGxwc3NfY3B1X2lkc1tdID0gewotCUlDUFUoSU5URUxfRkFNNl9BVE9NX01FUlJJRklFTEQxKSwKKwlJQ1BVKElOVEVMX0ZBTTZfQVRPTV9QRU5XRUxMKSwKKwlJQ1BVKElOVEVMX0ZBTTZfQVRPTV9NRVJSSUZJRUxEKSwKIAl7fQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCBhYWI5ZDUxLi5iYTM0OTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtNDgwLDYgKzQ4MCwzMCBAQAogRVhQT1JUX1NZTUJPTChwY2lfZmluZF9wYXJlbnRfcmVzb3VyY2UpOwogCiAvKioKKyAqIHBjaV9maW5kX3Jlc291cmNlIC0gUmV0dXJuIG1hdGNoaW5nIFBDSSBkZXZpY2UgcmVzb3VyY2UKKyAqIEBkZXY6IFBDSSBkZXZpY2UgdG8gcXVlcnkKKyAqIEByZXM6IFJlc291cmNlIHRvIGxvb2sgZm9yCisgKgorICogR29lcyBvdmVyIHN0YW5kYXJkIFBDSSByZXNvdXJjZXMgKEJBUnMpIGFuZCBjaGVja3MgaWYgdGhlIGdpdmVuIHJlc291cmNlCisgKiBpcyBwYXJ0aWFsbHkgb3IgZnVsbHkgY29udGFpbmVkIGluIGFueSBvZiB0aGVtLiBJbiB0aGF0IGNhc2UgdGhlCisgKiBtYXRjaGluZyByZXNvdXJjZSBpcyByZXR1cm5lZCwgJU5VTEwgb3RoZXJ3aXNlLgorICovCitzdHJ1Y3QgcmVzb3VyY2UgKnBjaV9maW5kX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKKworCQlpZiAoci0+c3RhcnQgJiYgcmVzb3VyY2VfY29udGFpbnMociwgcmVzKSkKKwkJCXJldHVybiByOworCX0KKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTChwY2lfZmluZF9yZXNvdXJjZSk7CisKKy8qKgogICogcGNpX2ZpbmRfcGNpZV9yb290X3BvcnQgLSByZXR1cm4gUENJZSBSb290IFBvcnQKICAqIEBkZXY6IFBDSSBkZXZpY2UgdG8gcXVlcnkKICAqCkBAIC01NTIsOCArNTc2LDkgQEAKIAogaW50IHBjaV9zZXRfcGxhdGZvcm1fcG0oY29uc3Qgc3RydWN0IHBjaV9wbGF0Zm9ybV9wbV9vcHMgKm9wcykKIHsKLQlpZiAoIW9wcy0+aXNfbWFuYWdlYWJsZSB8fCAhb3BzLT5zZXRfc3RhdGUgfHwgIW9wcy0+Y2hvb3NlX3N0YXRlIHx8Ci0JICAgICFvcHMtPnNsZWVwX3dha2UgfHwgIW9wcy0+cnVuX3dha2UgfHwgIW9wcy0+bmVlZF9yZXN1bWUpCisJaWYgKCFvcHMtPmlzX21hbmFnZWFibGUgfHwgIW9wcy0+c2V0X3N0YXRlICB8fCAhb3BzLT5nZXRfc3RhdGUgfHwKKwkgICAgIW9wcy0+Y2hvb3NlX3N0YXRlICB8fCAhb3BzLT5zbGVlcF93YWtlIHx8ICFvcHMtPnJ1bl93YWtlICB8fAorCSAgICAhb3BzLT5uZWVkX3Jlc3VtZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcGNpX3BsYXRmb3JtX3BtID0gb3BzOwogCXJldHVybiAwOwpAQCAtNTcwLDYgKzU5NSwxMSBAQAogCXJldHVybiBwY2lfcGxhdGZvcm1fcG0gPyBwY2lfcGxhdGZvcm1fcG0tPnNldF9zdGF0ZShkZXYsIHQpIDogLUVOT1NZUzsKIH0KIAorc3RhdGljIGlubGluZSBwY2lfcG93ZXJfdCBwbGF0Zm9ybV9wY2lfZ2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcmV0dXJuIHBjaV9wbGF0Zm9ybV9wbSA/IHBjaV9wbGF0Zm9ybV9wbS0+Z2V0X3N0YXRlKGRldikgOiBQQ0lfVU5LTk9XTjsKK30KKwogc3RhdGljIGlubGluZSBwY2lfcG93ZXJfdCBwbGF0Zm9ybV9wY2lfY2hvb3NlX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJcmV0dXJuIHBjaV9wbGF0Zm9ybV9wbSA/CkBAIC03MDEsMjYgKzczMSwyNSBAQAogfQogCiAvKioKLSAqIHBjaV91cGRhdGVfY3VycmVudF9zdGF0ZSAtIFJlYWQgUENJIHBvd2VyIHN0YXRlIG9mIGdpdmVuIGRldmljZSBmcm9tIGl0cwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJIFBNIHJlZ2lzdGVycyBhbmQgY2FjaGUgaXQKKyAqIHBjaV91cGRhdGVfY3VycmVudF9zdGF0ZSAtIFJlYWQgcG93ZXIgc3RhdGUgb2YgZ2l2ZW4gZGV2aWNlIGFuZCBjYWNoZSBpdAogICogQGRldjogUENJIGRldmljZSB0byBoYW5kbGUuCiAgKiBAc3RhdGU6IFN0YXRlIHRvIGNhY2hlIGluIGNhc2UgdGhlIGRldmljZSBkb2Vzbid0IGhhdmUgdGhlIFBNIGNhcGFiaWxpdHkKKyAqCisgKiBUaGUgcG93ZXIgc3RhdGUgaXMgcmVhZCBmcm9tIHRoZSBQTUNTUiByZWdpc3Rlciwgd2hpY2ggaG93ZXZlciBpcworICogaW5hY2Nlc3NpYmxlIGluIEQzY29sZC4gIFRoZSBwbGF0Zm9ybSBmaXJtd2FyZSBpcyB0aGVyZWZvcmUgcXVlcmllZCBmaXJzdAorICogdG8gZGV0ZWN0IGFjY2Vzc2liaWxpdHkgb2YgdGhlIHJlZ2lzdGVyLiAgSW4gY2FzZSB0aGUgcGxhdGZvcm0gZmlybXdhcmUKKyAqIHJlcG9ydHMgYW4gaW5jb3JyZWN0IHN0YXRlIG9yIHRoZSBkZXZpY2UgaXNuJ3QgcG93ZXIgbWFuYWdlYWJsZSBieSB0aGUKKyAqIHBsYXRmb3JtIGF0IGFsbCwgd2UgdHJ5IHRvIGRldGVjdCBEM2NvbGQgYnkgdGVzdGluZyBhY2Nlc3NpYmlsaXR5IG9mIHRoZQorICogdmVuZG9yIElEIGluIGNvbmZpZyBzcGFjZS4KICAqLwogdm9pZCBwY2lfdXBkYXRlX2N1cnJlbnRfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgcGNpX3Bvd2VyX3Qgc3RhdGUpCiB7Ci0JaWYgKGRldi0+cG1fY2FwKSB7CisJaWYgKHBsYXRmb3JtX3BjaV9nZXRfcG93ZXJfc3RhdGUoZGV2KSA9PSBQQ0lfRDNjb2xkIHx8CisJICAgICFwY2lfZGV2aWNlX2lzX3ByZXNlbnQoZGV2KSkgeworCQlkZXYtPmN1cnJlbnRfc3RhdGUgPSBQQ0lfRDNjb2xkOworCX0gZWxzZSBpZiAoZGV2LT5wbV9jYXApIHsKIAkJdTE2IHBtY3NyOwogCi0JCS8qCi0JCSAqIENvbmZpZ3VyYXRpb24gc3BhY2UgaXMgbm90IGFjY2Vzc2libGUgZm9yIGRldmljZSBpbgotCQkgKiBEM2NvbGQsIHNvIGp1c3Qga2VlcCBvciBzZXQgRDNjb2xkIGZvciBzYWZldHkKLQkJICovCi0JCWlmIChkZXYtPmN1cnJlbnRfc3RhdGUgPT0gUENJX0QzY29sZCkKLQkJCXJldHVybjsKLQkJaWYgKHN0YXRlID09IFBDSV9EM2NvbGQpIHsKLQkJCWRldi0+Y3VycmVudF9zdGF0ZSA9IFBDSV9EM2NvbGQ7Ci0JCQlyZXR1cm47Ci0JCX0KIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBkZXYtPnBtX2NhcCArIFBDSV9QTV9DVFJMLCAmcG1jc3IpOwogCQlkZXYtPmN1cnJlbnRfc3RhdGUgPSAocG1jc3IgJiBQQ0lfUE1fQ1RSTF9TVEFURV9NQVNLKTsKIAl9IGVsc2UgewpAQCAtMTk1OSw5ICsxOTg4LDIyIEBACiAJCWRlZmF1bHQ6CiAJCQl0YXJnZXRfc3RhdGUgPSBzdGF0ZTsKIAkJfQotCX0gZWxzZSBpZiAoIWRldi0+cG1fY2FwKSB7CisKKwkJcmV0dXJuIHRhcmdldF9zdGF0ZTsKKwl9CisKKwlpZiAoIWRldi0+cG1fY2FwKQogCQl0YXJnZXRfc3RhdGUgPSBQQ0lfRDA7Ci0JfSBlbHNlIGlmIChkZXZpY2VfbWF5X3dha2V1cCgmZGV2LT5kZXYpKSB7CisKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXMgaW4gRDNjb2xkIGV2ZW4gdGhvdWdoIGl0J3Mgbm90IHBvd2VyLW1hbmFnZWFibGUgYnkKKwkgKiB0aGUgcGxhdGZvcm0sIGl0IG1heSBoYXZlIGJlZW4gcG93ZXJlZCBkb3duIGJ5IG5vbi1zdGFuZGFyZCBtZWFucy4KKwkgKiBCZXN0IHRvIGxldCBpdCBzbHVtYmVyLgorCSAqLworCWlmIChkZXYtPmN1cnJlbnRfc3RhdGUgPT0gUENJX0QzY29sZCkKKwkJdGFyZ2V0X3N0YXRlID0gUENJX0QzY29sZDsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmZGV2LT5kZXYpKSB7CiAJCS8qCiAJCSAqIEZpbmQgdGhlIGRlZXBlc3Qgc3RhdGUgZnJvbSB3aGljaCB0aGUgZGV2aWNlIGNhbiBnZW5lcmF0ZQogCQkgKiB3YWtlLXVwIGV2ZW50cywgbWFrZSBpdCB0aGUgdGFyZ2V0IHN0YXRlIGFuZCBlbmFibGUgZGV2aWNlCkBAIC00OTU5LDYgKzUwMDEsMTMgQEAKIAogCXNwaW5fbG9jaygmcmVzb3VyY2VfYWxpZ25tZW50X2xvY2spOwogCXAgPSByZXNvdXJjZV9hbGlnbm1lbnRfcGFyYW07CisJaWYgKCEqcCkKKwkJZ290byBvdXQ7CisJaWYgKHBjaV9oYXNfZmxhZyhQQ0lfUFJPQkVfT05MWSkpIHsKKwkJcHJfaW5mb19vbmNlKCJQQ0k6IElnbm9yaW5nIHJlcXVlc3RlZCBhbGlnbm1lbnRzIChQQ0lfUFJPQkVfT05MWSlcbiIpOworCQlnb3RvIG91dDsKKwl9CisKIAl3aGlsZSAoKnApIHsKIAkJY291bnQgPSAwOwogCQlpZiAoc3NjYW5mKHAsICIlZCVuIiwgJmFsaWduX29yZGVyLCAmY291bnQpID09IDEgJiYKQEAgLTUwMjMsNiArNTA3Miw3IEBACiAJCX0KIAkJcCsrOwogCX0KK291dDoKIAlzcGluX3VubG9jaygmcmVzb3VyY2VfYWxpZ25tZW50X2xvY2spOwogCXJldHVybiBhbGlnbjsKIH0KQEAgLTUwNDEsNiArNTA5MSwxNSBAQAogCXJlc291cmNlX3NpemVfdCBhbGlnbiwgc2l6ZTsKIAl1MTYgY29tbWFuZDsKIAorCS8qCisJICogVkYgQkFScyBhcmUgcmVhZC1vbmx5IHplcm8gYWNjb3JkaW5nIHRvIFNSLUlPViBzcGVjIHIxLjEsIHNlYworCSAqIDMuNC4xLjExLiAgVGhlaXIgcmVzb3VyY2VzIGFyZSBhbGxvY2F0ZWQgZnJvbSB0aGUgc3BhY2UKKwkgKiBkZXNjcmliZWQgYnkgdGhlIFZGIEJBUnggcmVnaXN0ZXIgaW4gdGhlIFBGJ3MgU1ItSU9WIGNhcGFiaWxpdHkuCisJICogV2UgY2FuJ3QgaW5mbHVlbmNlIHRoZWlyIGFsaWdubWVudCBoZXJlLgorCSAqLworCWlmIChkZXYtPmlzX3ZpcnRmbikKKwkJcmV0dXJuOworCiAJLyogY2hlY2sgaWYgc3BlY2lmaWVkIFBDSSBpcyB0YXJnZXQgZGV2aWNlIHRvIHJlYXNzaWduICovCiAJYWxpZ24gPSBwY2lfc3BlY2lmaWVkX3Jlc291cmNlX2FsaWdubWVudChkZXYpOwogCWlmICghYWxpZ24pCkBAIC01MDYzLDYgKzUxMjIsMTIgQEAKIAkJciA9ICZkZXYtPnJlc291cmNlW2ldOwogCQlpZiAoIShyLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSkKIAkJCWNvbnRpbnVlOworCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1BDSV9GSVhFRCkgeworCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAiSWdub3JpbmcgcmVxdWVzdGVkIGFsaWdubWVudCBmb3IgQkFSJWQ6ICVwUlxuIiwKKwkJCQlpLCByKTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJc2l6ZSA9IHJlc291cmNlX3NpemUocik7CiAJCWlmIChzaXplIDwgYWxpZ24pIHsKIAkJCXNpemUgPSBhbGlnbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5oIGIvZHJpdmVycy9wY2kvcGNpLmgKaW5kZXggOTczMGM0Ny4uNDUxODU2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmgKKysrIGIvZHJpdmVycy9wY2kvcGNpLmgKQEAgLTQyLDYgKzQyLDggQEAKICAqCiAgKiBAc2V0X3N0YXRlOiBpbnZva2VzIHRoZSBwbGF0Zm9ybSBmaXJtd2FyZSB0byBzZXQgdGhlIGRldmljZSdzIHBvd2VyIHN0YXRlCiAgKgorICogQGdldF9zdGF0ZTogcXVlcmllcyB0aGUgcGxhdGZvcm0gZmlybXdhcmUgZm9yIGEgZGV2aWNlJ3MgY3VycmVudCBwb3dlciBzdGF0ZQorICoKICAqIEBjaG9vc2Vfc3RhdGU6IHJldHVybnMgUENJIHBvd2VyIHN0YXRlIG9mIGdpdmVuIGRldmljZSBwcmVmZXJyZWQgYnkgdGhlCiAgKiAgICAgICAgICAgICAgICBwbGF0Zm9ybTsgdG8gYmUgdXNlZCBkdXJpbmcgc3lzdGVtLXdpZGUgdHJhbnNpdGlvbnMgZnJvbSBhCiAgKiAgICAgICAgICAgICAgICBzbGVlcGluZyBzdGF0ZSB0byB0aGUgd29ya2luZyBzdGF0ZSBhbmQgdmljZSB2ZXJzYQpAQCAtNjIsNiArNjQsNyBAQAogc3RydWN0IHBjaV9wbGF0Zm9ybV9wbV9vcHMgewogCWJvb2wgKCppc19tYW5hZ2VhYmxlKShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAlpbnQgKCpzZXRfc3RhdGUpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBjaV9wb3dlcl90IHN0YXRlKTsKKwlwY2lfcG93ZXJfdCAoKmdldF9zdGF0ZSkoc3RydWN0IHBjaV9kZXYgKmRldik7CiAJcGNpX3Bvd2VyX3QgKCpjaG9vc2Vfc3RhdGUpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCWludCAoKnNsZWVwX3dha2UpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGJvb2wgZW5hYmxlKTsKIAlpbnQgKCpydW5fd2FrZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgYm9vbCBlbmFibGUpOwpAQCAtMzMyLDYgKzMzNSwxMiBAQAogCiB2b2lkIHBjaV9lbmFibGVfYWNzKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCisjaWZkZWYgQ09ORklHX1BDSUVfUFRNCit2b2lkIHBjaV9wdG1faW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3B0bV9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQorI2VuZGlmCisKIHN0cnVjdCBwY2lfZGV2X3Jlc2V0X21ldGhvZHMgewogCXUxNiB2ZW5kb3I7CiAJdTE2IGRldmljZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvS2NvbmZpZyBiL2RyaXZlcnMvcGNpL3BjaWUvS2NvbmZpZwppbmRleCA3ZmNlYTc1Li43Y2U3NzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9LY29uZmlnCkBAIC05MiwzICs5MiwxNCBAQAogCSAgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBEUEMgZHJpdmVyLiAgSWYgeW91ciBzeXN0ZW0gZG9lc24ndAogCSAgaGF2ZSB0aGlzIGNhcGFiaWxpdHkgb3IgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmUsCiAJICBpdCBpcyBzYWZlIHRvIGFuc3dlciBOLgorCitjb25maWcgUENJRV9QVE0KKwlib29sICJQQ0llIFByZWNpc2lvbiBUaW1lIE1lYXN1cmVtZW50IHN1cHBvcnQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQ0lFUE9SVEJVUworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBQQ0kgRXhwcmVzcyBQcmVjaXNpb24gVGltZSBNZWFzdXJlbWVudCAoUFRNKQorCSAgc3VwcG9ydC4KKworCSAgVGhpcyBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgaGF2ZSBkZXZpY2VzIHRoYXQgc3VwcG9ydCBQVE0sIGJ1dCBpdAorCSAgaXMgc2FmZSB0byBlbmFibGUgZXZlbiBpZiB5b3UgZG9uJ3QuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvcGNpZS9NYWtlZmlsZQppbmRleCBiMjQ1MjViLi4zNmUzNWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvTWFrZWZpbGUKQEAgLTE2LDMgKzE2LDQgQEAKIG9iai0kKENPTkZJR19QQ0lFX1BNRSkgKz0gcG1lLm8KIAogb2JqLSQoQ09ORklHX1BDSUVfRFBDKSArPSBwY2llLWRwYy5vCitvYmotJChDT05GSUdfUENJRV9QVE0pICs9IHB0bS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydi5jCmluZGV4IDQ4ZDIxZTAuLjEzOTE1MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydi5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydi5jCkBAIC0xNSw3ICsxNSw2IEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wY2ktYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC0zNyw5ICszNiw2IEBACiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS4wIgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJ0b20ubC5uZ3V5ZW5AaW50ZWwuY29tIgogI2RlZmluZSBEUklWRVJfREVTQyAiUm9vdCBQb3J0IEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyBEcml2ZXIiCi1NT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwotTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIGludCBhZXJfcHJvYmUoc3RydWN0IHBjaWVfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgYWVyX3JlbW92ZShzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldik7CkBAIC03MCw3ICs2Niw3IEBACiAKIHZvaWQgcGNpX25vX2Flcih2b2lkKQogewotCXBjaWVfYWVyX2Rpc2FibGUgPSAxOwkvKiBoYXMgcHJpb3JpdHkgb3ZlciAnZm9yY2Vsb2FkJyAqLworCXBjaWVfYWVyX2Rpc2FibGUgPSAxOwogfQogCiBib29sIHBjaV9hZXJfYXZhaWxhYmxlKHZvaWQpCkBAIC0xMzQsNyArMTMwLDcgQEAKIAlwY2llX2NhcGFiaWxpdHlfY2xlYXJfd29yZChwZGV2LCBQQ0lfRVhQX1JUQ1RMLAogCQkJCSAgIFNZU1RFTV9FUlJPUl9JTlRSX09OX01FU0dfTUFTSyk7CiAKLQlhZXJfcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkocGRldiwgUENJX0VYVF9DQVBfSURfRVJSKTsKKwlhZXJfcG9zID0gcGRldi0+YWVyX2NhcDsKIAkvKiBDbGVhciBlcnJvciBzdGF0dXMgKi8KIAlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgYWVyX3BvcyArIFBDSV9FUlJfUk9PVF9TVEFUVVMsICZyZWczMik7CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBhZXJfcG9zICsgUENJX0VSUl9ST09UX1NUQVRVUywgcmVnMzIpOwpAQCAtMTczLDcgKzE2OSw3IEBACiAJICovCiAJc2V0X2Rvd25zdHJlYW1fZGV2aWNlc19lcnJvcl9yZXBvcnRpbmcocGRldiwgZmFsc2UpOwogCi0JcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkocGRldiwgUENJX0VYVF9DQVBfSURfRVJSKTsKKwlwb3MgPSBwZGV2LT5hZXJfY2FwOwogCS8qIERpc2FibGUgUm9vdCdzIGludGVycnVwdCBpbiByZXNwb25zZSB0byBlcnJvciBtZXNzYWdlcyAqLwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBwb3MgKyBQQ0lfRVJSX1JPT1RfQ09NTUFORCwgJnJlZzMyKTsKIAlyZWczMiAmPSB+Uk9PVF9QT1JUX0lOVFJfT05fTUVTR19NQVNLOwpAQCAtMjAwLDcgKzE5Niw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcG9zOwogCi0JcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkocGRldi0+cG9ydCwgUENJX0VYVF9DQVBfSURfRVJSKTsKKwlwb3MgPSBwZGV2LT5wb3J0LT5hZXJfY2FwOwogCS8qCiAJICogTXVzdCBsb2NrIGFjY2VzcyB0byBSb290IEVycm9yIFN0YXR1cyBSZWcsIFJvb3QgRXJyb3IgSUQgUmVnLAogCSAqIGFuZCBSb290IGVycm9yIHByb2R1Y2VyL2NvbnN1bWVyIGluZGV4CkBAIC0yOTQsNyArMjkwLDYgQEAKIC8qKgogICogYWVyX3Byb2JlIC0gaW5pdGlhbGl6ZSByZXNvdXJjZXMKICAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIHBjaWVfZGV2IGRhdGEgc3RydWN0dXJlCi0gKiBAaWQ6IHBvaW50ZXIgdG8gdGhlIHNlcnZpY2UgaWQgZGF0YSBzdHJ1Y3R1cmUKICAqCiAgKiBJbnZva2VkIHdoZW4gUENJIEV4cHJlc3MgYnVzIGxvYWRzIEFFUiBzZXJ2aWNlIGRyaXZlci4KICAqLwpAQCAtMzA0LDExICsyOTksNiBAQAogCXN0cnVjdCBhZXJfcnBjICpycGM7CiAJc3RydWN0IGRldmljZSAqZGV2aWNlID0gJmRldi0+ZGV2aWNlOwogCi0JLyogSW5pdCAqLwotCXN0YXR1cyA9IGFlcl9pbml0KGRldik7Ci0JaWYgKHN0YXR1cykKLQkJcmV0dXJuIHN0YXR1czsKLQogCS8qIEFsbG9jIHJwYyBkYXRhIHN0cnVjdHVyZSAqLwogCXJwYyA9IGFlcl9hbGxvY19ycGMoZGV2KTsKIAlpZiAoIXJwYykgewpAQCAtMzQzLDcgKzMzMyw3IEBACiAJdTMyIHJlZzMyOwogCWludCBwb3M7CiAKLQlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0VSUik7CisJcG9zID0gZGV2LT5hZXJfY2FwOwogCiAJLyogRGlzYWJsZSBSb290J3MgaW50ZXJydXB0IGluIHJlc3BvbnNlIHRvIGVycm9yIG1lc3NhZ2VzICovCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9ST09UX0NPTU1BTkQsICZyZWczMik7CkBAIC0zOTYsNyArMzg2LDcgQEAKIAlwY2llX2NhcGFiaWxpdHlfd3JpdGVfd29yZChkZXYsIFBDSV9FWFBfREVWU1RBLCByZWcxNik7CiAKIAkvKiBDbGVhbiBBRVIgUm9vdCBFcnJvciBTdGF0dXMgKi8KLQlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0VSUik7CisJcG9zID0gZGV2LT5hZXJfY2FwOwogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU1RBVFVTLCAmc3RhdHVzKTsKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVJSX1VOQ09SX1NFVkVSLCAmbWFzayk7CiAJaWYgKGRldi0+ZXJyb3Jfc3RhdGUgPT0gcGNpX2NoYW5uZWxfaW9fbm9ybWFsKQpAQCAtNDE3LDE2ICs0MDcsNCBAQAogCQlyZXR1cm4gLUVOWElPOwogCXJldHVybiBwY2llX3BvcnRfc2VydmljZV9yZWdpc3RlcigmYWVyZHJpdmVyKTsKIH0KLQotLyoqCi0gKiBhZXJfc2VydmljZV9leGl0IC0gdW5yZWdpc3RlciBBRVIgcm9vdCBzZXJ2aWNlIGRyaXZlcgotICoKLSAqIEludm9rZWQgd2hlbiBBRVIgcm9vdCBzZXJ2aWNlIGRyaXZlciBpcyB1bmxvYWRlZC4KLSAqLwotc3RhdGljIHZvaWQgX19leGl0IGFlcl9zZXJ2aWNlX2V4aXQodm9pZCkKLXsKLQlwY2llX3BvcnRfc2VydmljZV91bnJlZ2lzdGVyKCZhZXJkcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChhZXJfc2VydmljZV9pbml0KTsKLW1vZHVsZV9leGl0KGFlcl9zZXJ2aWNlX2V4aXQpOworZGV2aWNlX2luaXRjYWxsKGFlcl9zZXJ2aWNlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmggYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuaAppbmRleCA5NDVjOTM5Li5kNTFlNGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuaAorKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuaApAQCAtNjAsNiArNjAsNyBAQAogCXN0cnVjdCBwY2llX2RldmljZSAqcnBkOwkvKiBSb290IFBvcnQgZGV2aWNlICovCiAJc3RydWN0IHdvcmtfc3RydWN0IGRwY19oYW5kbGVyOwogCXN0cnVjdCBhZXJfZXJyX3NvdXJjZSBlX3NvdXJjZXNbQUVSX0VSUk9SX1NPVVJDRVNfTUFYXTsKKwlzdHJ1Y3QgYWVyX2Vycl9pbmZvIGVfaW5mbzsKIAl1bnNpZ25lZCBzaG9ydCBwcm9kX2lkeDsJLyogRXJyb3IgUHJvZHVjZXIgSW5kZXggKi8KIAl1bnNpZ25lZCBzaG9ydCBjb25zX2lkeDsJLyogRXJyb3IgQ29uc3VtZXIgSW5kZXggKi8KIAlpbnQgaXNyOwpAQCAtMTA1LDcgKzEwNiw2IEBACiB9CiAKIGV4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgcGNpZV9wb3J0X2J1c190eXBlOwotaW50IGFlcl9pbml0KHN0cnVjdCBwY2llX2RldmljZSAqZGV2KTsKIHZvaWQgYWVyX2lzcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCBhZXJfcHJpbnRfZXJyb3Ioc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IGFlcl9lcnJfaW5mbyAqaW5mbyk7CiB2b2lkIGFlcl9wcmludF9wb3J0X2luZm8oc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IGFlcl9lcnJfaW5mbyAqaW5mbyk7CkBAIC0xMjEsMTEgKzEyMSw0IEBACiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKLQotc3RhdGljIGlubGluZSB2b2lkIHBjaWVfYWVyX2ZvcmNlX2Zpcm13YXJlX2ZpcnN0KHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAotCQkJCQkJIGludCBlbmFibGUpCi17Ci0JcGNpX2Rldi0+X19hZXJfZmlybXdhcmVfZmlyc3QgPSAhIWVuYWJsZTsKLQlwY2lfZGV2LT5fX2Flcl9maXJtd2FyZV9maXJzdF92YWxpZCA9IDE7Ci19CiAjZW5kaWYgLyogX0FFUkRSVl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9jb3JlLmMKaW5kZXggNTIxZTM5Yy4uYjEzMDNiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jCkBAIC0yNywxMSArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CiAjaW5jbHVkZSAiYWVyZHJ2LmgiCiAKLXN0YXRpYyBib29sIGZvcmNlbG9hZDsKLXN0YXRpYyBib29sIG5vc291cmNlaWQ7Ci1tb2R1bGVfcGFyYW0oZm9yY2Vsb2FkLCBib29sLCAwKTsKLW1vZHVsZV9wYXJhbShub3NvdXJjZWlkLCBib29sLCAwKTsKLQogI2RlZmluZQlQQ0lfRVhQX0FFUl9GTEFHUwkoUENJX0VYUF9ERVZDVExfQ0VSRSB8IFBDSV9FWFBfREVWQ1RMX05GRVJFIHwgXAogCQkJCSBQQ0lfRVhQX0RFVkNUTF9GRVJFIHwgUENJX0VYUF9ERVZDVExfVVJSRSkKIApAQCAtNDAsNyArMzUsNyBAQAogCWlmIChwY2llX2Flcl9nZXRfZmlybXdhcmVfZmlyc3QoZGV2KSkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoIXBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfRVJSKSkKKwlpZiAoIWRldi0+YWVyX2NhcCkKIAkJcmV0dXJuIC1FSU87CiAKIAlyZXR1cm4gcGNpZV9jYXBhYmlsaXR5X3NldF93b3JkKGRldiwgUENJX0VYUF9ERVZDVEwsIFBDSV9FWFBfQUVSX0ZMQUdTKTsKQEAgLTYyLDcgKzU3LDcgQEAKIAlpbnQgcG9zOwogCXUzMiBzdGF0dXM7CiAKLQlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0VSUik7CisJcG9zID0gZGV2LT5hZXJfY2FwOwogCWlmICghcG9zKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtODMsNyArNzgsNyBAQAogCWlmICghcGNpX2lzX3BjaWUoZGV2KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0VSUik7CisJcG9zID0gZGV2LT5hZXJfY2FwOwogCWlmICghcG9zKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtMTAyLDYgKzk3LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBwY2lfYWVyX2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlkZXYtPmFlcl9jYXAgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShkZXYsIFBDSV9FWFRfQ0FQX0lEX0VSUik7CisJcmV0dXJuIHBjaV9jbGVhbnVwX2Flcl9lcnJvcl9zdGF0dXNfcmVncyhkZXYpOworfQorCiAvKioKICAqIGFkZF9lcnJvcl9kZXZpY2UgLSBsaXN0IGRldmljZSB0byBiZSBoYW5kbGVkCiAgKiBAZV9pbmZvOiBwb2ludGVyIHRvIGVycm9yIGluZm8KQEAgLTEzMiw3ICsxMzMsOCBAQAogCSAqIFdoZW4gYnVzIGlkIGlzIGVxdWFsIHRvIDAsIGl0IG1pZ2h0IGJlIGEgYmFkIGlkCiAJICogcmVwb3J0ZWQgYnkgcm9vdCBwb3J0LgogCSAqLwotCWlmICghbm9zb3VyY2VpZCAmJiAoUENJX0JVU19OVU0oZV9pbmZvLT5pZCkgIT0gMCkpIHsKKwlpZiAoKFBDSV9CVVNfTlVNKGVfaW5mby0+aWQpICE9IDApICYmCisJICAgICEoZGV2LT5idXMtPmJ1c19mbGFncyAmIFBDSV9CVVNfRkxBR1NfTk9fQUVSU0lEKSkgewogCQkvKiBEZXZpY2UgSUQgbWF0Y2g/ICovCiAJCWlmIChlX2luZm8tPmlkID09ICgoZGV2LT5idXMtPm51bWJlciA8PCA4KSB8IGRldi0+ZGV2Zm4pKQogCQkJcmV0dXJuIHRydWU7CkBAIC0xNDQsMTAgKzE0NiwxMCBAQAogCiAJLyoKIAkgKiBXaGVuIGVpdGhlcgotCSAqICAgICAgMSkgbm9zb3VyY2VpZD09eTsKLQkgKiAgICAgIDIpIGJ1cyBpZCBpcyBlcXVhbCB0byAwLiBTb21lIHBvcnRzIG1pZ2h0IGxvc2UgdGhlIGJ1cworCSAqICAgICAgMSkgYnVzIGlkIGlzIGVxdWFsIHRvIDAuIFNvbWUgcG9ydHMgbWlnaHQgbG9zZSB0aGUgYnVzCiAJICogICAgICAgICAgICAgIGlkIG9mIGVycm9yIHNvdXJjZSBpZDsKLQkgKiAgICAgIDMpIFRoZXJlIGFyZSBtdWx0aXBsZSBlcnJvcnMgYW5kIHByaW9yIGlkIGNvbXBhcmluZyBmYWlsczsKKwkgKiAgICAgIDIpIGJ1cyBmbGFnIFBDSV9CVVNfRkxBR1NfTk9fQUVSU0lEIGlzIHNldAorCSAqICAgICAgMykgVGhlcmUgYXJlIG11bHRpcGxlIGVycm9ycyBhbmQgcHJpb3IgSUQgY29tcGFyaW5nIGZhaWxzOwogCSAqIFdlIGNoZWNrIEFFUiBzdGF0dXMgcmVnaXN0ZXJzIHRvIGZpbmQgcG9zc2libGUgcmVwb3J0ZXIuCiAJICovCiAJaWYgKGF0b21pY19yZWFkKCZkZXYtPmVuYWJsZV9jbnQpID09IDApCkBAIC0xNTgsNyArMTYwLDcgQEAKIAlpZiAoIShyZWcxNiAmIFBDSV9FWFBfQUVSX0ZMQUdTKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9FUlIpOworCXBvcyA9IGRldi0+YWVyX2NhcDsKIAlpZiAoIXBvcykKIAkJcmV0dXJuIGZhbHNlOwogCkBAIC01NTUsNyArNTU3LDcgQEAKIAkJICogQ29ycmVjdGFibGUgZXJyb3IgZG9lcyBub3QgbmVlZCBzb2Z0d2FyZSBpbnRlcnZlbnRpb24uCiAJCSAqIE5vIG5lZWQgdG8gZ28gdGhyb3VnaCBlcnJvciByZWNvdmVyeSBwcm9jZXNzLgogCQkgKi8KLQkJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9FUlIpOworCQlwb3MgPSBkZXYtPmFlcl9jYXA7CiAJCWlmIChwb3MpCiAJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9DT1JfU1RBVFVTLAogCQkJCQlpbmZvLT5zdGF0dXMpOwpAQCAtNjQ3LDcgKzY0OSw3IEBACiAJaW5mby0+c3RhdHVzID0gMDsKIAlpbmZvLT50bHBfaGVhZGVyX3ZhbGlkID0gMDsKIAotCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfRVJSKTsKKwlwb3MgPSBkZXYtPmFlcl9jYXA7CiAKIAkvKiBUaGUgZGV2aWNlIG1pZ2h0IG5vdCBzdXBwb3J0IEFFUiAqLwogCWlmICghcG9zKQpAQCAtNzE1LDE1ICs3MTcsOCBAQAogc3RhdGljIHZvaWQgYWVyX2lzcl9vbmVfZXJyb3Ioc3RydWN0IHBjaWVfZGV2aWNlICpwX2RldmljZSwKIAkJc3RydWN0IGFlcl9lcnJfc291cmNlICplX3NyYykKIHsKLQlzdHJ1Y3QgYWVyX2Vycl9pbmZvICplX2luZm87Ci0KLQkvKiBzdHJ1Y3QgYWVyX2Vycl9pbmZvIG1pZ2h0IGJlIGJpZywgc28gd2UgYWxsb2NhdGUgaXQgd2l0aCBzbGFiICovCi0JZV9pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFlcl9lcnJfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghZV9pbmZvKSB7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBfZGV2aWNlLT5wb3J0LT5kZXYsCi0JCQkiQ2FuJ3QgYWxsb2NhdGUgbWVtIHdoZW4gcHJvY2Vzc2luZyBBRVIgZXJyb3JzXG4iKTsKLQkJcmV0dXJuOwotCX0KKwlzdHJ1Y3QgYWVyX3JwYyAqcnBjID0gZ2V0X3NlcnZpY2VfZGF0YShwX2RldmljZSk7CisJc3RydWN0IGFlcl9lcnJfaW5mbyAqZV9pbmZvID0gJnJwYy0+ZV9pbmZvOwogCiAJLyoKIAkgKiBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgYm90aCBjb3JyZWN0YWJsZSBlcnJvciBhbmQKQEAgLTc2Miw4ICs3NTcsNiBAQAogCQlpZiAoZmluZF9zb3VyY2VfZGV2aWNlKHBfZGV2aWNlLT5wb3J0LCBlX2luZm8pKQogCQkJYWVyX3Byb2Nlc3NfZXJyX2RldmljZXMocF9kZXZpY2UsIGVfaW5mbyk7CiAJfQotCi0Ja2ZyZWUoZV9pbmZvKTsKIH0KIAogLyoqCkBAIC04MTIsMTkgKzgwNSwzIEBACiAJCWFlcl9pc3Jfb25lX2Vycm9yKHBfZGV2aWNlLCAmZV9zcmMpOwogCW11dGV4X3VubG9jaygmcnBjLT5ycGNfbXV0ZXgpOwogfQotCi0vKioKLSAqIGFlcl9pbml0IC0gcHJvdmlkZSBBRVIgaW5pdGlhbGl6YXRpb24KLSAqIEBkZXY6IHBvaW50ZXIgdG8gQUVSIHBjaWUgZGV2aWNlCi0gKgotICogSW52b2tlZCB3aGVuIEFFUiBzZXJ2aWNlIGRyaXZlciBpcyBsb2FkZWQuCi0gKi8KLWludCBhZXJfaW5pdChzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldikKLXsKLQlpZiAoZm9yY2Vsb2FkKSB7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2aWNlLAotCQkJICAgImFlcmRydiBmb3JjZWxvYWQgcmVxdWVzdGVkLlxuIik7Ci0JCXBjaWVfYWVyX2ZvcmNlX2Zpcm13YXJlX2ZpcnN0KGRldi0+cG9ydCwgMCk7Ci0JfQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYwppbmRleCAxNjdmZTQxLi41NGM0YjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYwpAQCAtMjE5LDE1ICsyMTksMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwZXJfc2V2ZXJpdHlfdG9fYWVyKTsKIAotdm9pZCBjcGVyX3ByaW50X2FlcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgY3Blcl9zZXZlcml0eSwKK3ZvaWQgY3Blcl9wcmludF9hZXIoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGFlcl9zZXZlcml0eSwKIAkJICAgIHN0cnVjdCBhZXJfY2FwYWJpbGl0eV9yZWdzICphZXIpCiB7Ci0JaW50IGFlcl9zZXZlcml0eSwgbGF5ZXIsIGFnZW50LCBzdGF0dXNfc3Ryc19zaXplLCB0bHBfaGVhZGVyX3ZhbGlkID0gMDsKKwlpbnQgbGF5ZXIsIGFnZW50LCBzdGF0dXNfc3Ryc19zaXplLCB0bHBfaGVhZGVyX3ZhbGlkID0gMDsKIAl1MzIgc3RhdHVzLCBtYXNrOwogCWNvbnN0IGNoYXIgKipzdGF0dXNfc3RyczsKIAotCWFlcl9zZXZlcml0eSA9IGNwZXJfc2V2ZXJpdHlfdG9fYWVyKGNwZXJfc2V2ZXJpdHkpOwotCiAJaWYgKGFlcl9zZXZlcml0eSA9PSBBRVJfQ09SUkVDVEFCTEUpIHsKIAkJc3RhdHVzID0gYWVyLT5jb3Jfc3RhdHVzOwogCQltYXNrID0gYWVyLT5jb3JfbWFzazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcGNpZS1kcGMuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcGNpZS1kcGMuYwppbmRleCAyNTBmODc4Li45ODExYjE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BjaWUtZHBjLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wY2llLWRwYy5jCkBAIC0xLDUgKzEsNyBAQAogLyoKICAqIFBDSSBFeHByZXNzIERvd25zdHJlYW0gUG9ydCBDb250YWlubWVudCBzZXJ2aWNlcyBkcml2ZXIKKyAqIEF1dGhvcjogS2VpdGggQnVzY2ggPGtlaXRoLmJ1c2NoQGludGVsLmNvbT4KKyAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSW50ZWwgQ29ycC4KICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwpAQCAtOSw3ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9wY2llcG9ydF9pZi5oPgogCkBAIC0xNDMsMTYgKzE0NSw0IEBACiB7CiAJcmV0dXJuIHBjaWVfcG9ydF9zZXJ2aWNlX3JlZ2lzdGVyKCZkcGNkcml2ZXIpOwogfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZHBjX3NlcnZpY2VfZXhpdCh2b2lkKQotewotCXBjaWVfcG9ydF9zZXJ2aWNlX3VucmVnaXN0ZXIoJmRwY2RyaXZlcik7Ci19Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiUENJIEV4cHJlc3MgRG93bnN0cmVhbSBQb3J0IENvbnRhaW5tZW50IGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiS2VpdGggQnVzY2ggPGtlaXRoLmJ1c2NoQGludGVsLmNvbT4iKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9WRVJTSU9OKCIwLjEiKTsKLQotbW9kdWxlX2luaXQoZHBjX3NlcnZpY2VfaW5pdCk7Ci1tb2R1bGVfZXhpdChkcGNfc2VydmljZV9leGl0KTsKK2RldmljZV9pbml0Y2FsbChkcGNfc2VydmljZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG1lLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BtZS5jCmluZGV4IDFhZTRjNzMuLjg4NGJhZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG1lLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wbWUuYwpAQCAtMTAsNyArMTAsNiBAQAogICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTQ0OSwxNyArNDQ4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqCi0gKiBwY2llX3BtZV9yZW1vdmUgLSBQcmVwYXJlIFBDSWUgUE1FIHNlcnZpY2UgZGV2aWNlIGZvciByZW1vdmFsLgotICogQHNydiAtIFBDSWUgc2VydmljZSBkZXZpY2UgdG8gcmVtb3ZlLgotICovCi1zdGF0aWMgdm9pZCBwY2llX3BtZV9yZW1vdmUoc3RydWN0IHBjaWVfZGV2aWNlICpzcnYpCi17Ci0JcGNpZV9wbWVfc3VzcGVuZChzcnYpOwotCWZyZWVfaXJxKHNydi0+aXJxLCBzcnYpOwotCWtmcmVlKGdldF9zZXJ2aWNlX2RhdGEoc3J2KSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyIHBjaWVfcG1lX2RyaXZlciA9IHsKIAkubmFtZQkJPSAicGNpZV9wbWUiLAogCS5wb3J0X3R5cGUJPSBQQ0lfRVhQX1RZUEVfUk9PVF9QT1JULApAQCAtNDY4LDcgKzQ1Niw2IEBACiAJLnByb2JlCQk9IHBjaWVfcG1lX3Byb2JlLAogCS5zdXNwZW5kCT0gcGNpZV9wbWVfc3VzcGVuZCwKIAkucmVzdW1lCQk9IHBjaWVfcG1lX3Jlc3VtZSwKLQkucmVtb3ZlCQk9IHBjaWVfcG1lX3JlbW92ZSwKIH07CiAKIC8qKgpAQCAtNDc4LDUgKzQ2NSw0IEBACiB7CiAJcmV0dXJuIHBjaWVfcG9ydF9zZXJ2aWNlX3JlZ2lzdGVyKCZwY2llX3BtZV9kcml2ZXIpOwogfQotCi1tb2R1bGVfaW5pdChwY2llX3BtZV9zZXJ2aWNlX2luaXQpOworZGV2aWNlX2luaXRjYWxsKHBjaWVfcG1lX3NlcnZpY2VfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKaW5kZXggNzBkN2FkOC4uNzkzMjdjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwpAQCAtMSwxMiArMSwxMyBAQAogLyoKICAqIEZpbGU6CXBvcnRkcnZfcGNpLmMKICAqIFB1cnBvc2U6CVBDSSBFeHByZXNzIFBvcnQgQnVzIERyaXZlcgorICogQXV0aG9yOglUb20gTmd1eWVuIDx0b20ubC5uZ3V5ZW5AaW50ZWwuY29tPgorICogVmVyc2lvbjoJdjEuMAogICoKICAqIENvcHlyaWdodCAoQykgMjAwNCBJbnRlbAogICogQ29weXJpZ2h0IChDKSBUb20gTG9uZyBOZ3V5ZW4gKHRvbS5sLm5ndXllbkBpbnRlbC5jb20pCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC0yMSwxNiArMjIsNiBAQAogI2luY2x1ZGUgInBvcnRkcnYuaCIKICNpbmNsdWRlICJhZXIvYWVyZHJ2LmgiCiAKLS8qCi0gKiBWZXJzaW9uIEluZm9ybWF0aW9uCi0gKi8KLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjAiCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgInRvbS5sLm5ndXllbkBpbnRlbC5jb20iCi0jZGVmaW5lIERSSVZFUl9ERVNDICJQQ0llIFBvcnQgQnVzIERyaXZlciIKLU1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCiAvKiBJZiB0aGlzIHN3aXRjaCBpcyBzZXQsIFBDSWUgcG9ydCBuYXRpdmUgc2VydmljZXMgc2hvdWxkIG5vdCBiZSBlbmFibGVkLiAqLwogYm9vbCBwY2llX3BvcnRzX2Rpc2FibGVkOwogCkBAIC0zNDEsNyArMzMyLDYgQEAKIAlQQ0lfREVWSUNFX0NMQVNTKCgoUENJX0NMQVNTX0JSSURHRV9QQ0kgPDwgOCkgfCAweDAwKSwgfjApLAogCX0sIHsgLyogZW5kOiBhbGwgemVyb2VzICovIH0KIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcG9ydF9wY2lfaWRzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgcGNpZV9wb3J0ZHJ2X2Vycl9oYW5kbGVyID0gewogCS5lcnJvcl9kZXRlY3RlZCA9IHBjaWVfcG9ydGRydl9lcnJvcl9kZXRlY3RlZCwKQEAgLTQwNiw1ICszOTYsNCBAQAogIG91dDoKIAlyZXR1cm4gcmV0dmFsOwogfQotCi1tb2R1bGVfaW5pdChwY2llX3BvcnRkcnZfaW5pdCk7CitkZXZpY2VfaW5pdGNhbGwocGNpZV9wb3J0ZHJ2X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wdG0uYyBiL2RyaXZlcnMvcGNpL3BjaWUvcHRtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiOGFjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcHRtLmMKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBQQ0kgRXhwcmVzcyBQcmVjaXNpb24gVGltZSBNZWFzdXJlbWVudAorICogQ29weXJpZ2h0IChjKSAyMDE2LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICIuLi9wY2kuaCIKKworc3RhdGljIHZvaWQgcGNpX3B0bV9pbmZvKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJY2hhciBjbG9ja19kZXNjWzhdOworCisJc3dpdGNoIChkZXYtPnB0bV9ncmFudWxhcml0eSkgeworCWNhc2UgMDoKKwkJc25wcmludGYoY2xvY2tfZGVzYywgc2l6ZW9mKGNsb2NrX2Rlc2MpLCAidW5rbm93biIpOworCQlicmVhazsKKwljYXNlIDI1NToKKwkJc25wcmludGYoY2xvY2tfZGVzYywgc2l6ZW9mKGNsb2NrX2Rlc2MpLCAiPjI1NG5zIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNucHJpbnRmKGNsb2NrX2Rlc2MsIHNpemVvZihjbG9ja19kZXNjKSwgIiV1ZG5zIiwKKwkJCSBkZXYtPnB0bV9ncmFudWxhcml0eSk7CisJCWJyZWFrOworCX0KKwlkZXZfaW5mbygmZGV2LT5kZXYsICJQVE0gZW5hYmxlZCVzLCAlcyBncmFudWxhcml0eVxuIiwKKwkJIGRldi0+cHRtX3Jvb3QgPyAiIChyb290KSIgOiAiIiwgY2xvY2tfZGVzYyk7Cit9CisKK3ZvaWQgcGNpX3B0bV9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHBvczsKKwl1MzIgY2FwLCBjdHJsOworCXU4IGxvY2FsX2Nsb2NrOworCXN0cnVjdCBwY2lfZGV2ICp1cHM7CisKKwlpZiAoIXBjaV9pc19wY2llKGRldikpCisJCXJldHVybjsKKworCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGRldiwgUENJX0VYVF9DQVBfSURfUFRNKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBFbmFibGUgUFRNIG9ubHkgb24gaW50ZXJpb3IgZGV2aWNlcyAocm9vdCBwb3J0cywgc3dpdGNoIHBvcnRzLAorCSAqIGV0Yy4pIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXQgY2F1c2VzIG5vIGxpbmsgdHJhZmZpYyB1bnRpbCBhbgorCSAqIGVuZHBvaW50IGVuYWJsZXMgaXQuCisJICovCisJaWYgKChwY2lfcGNpZV90eXBlKGRldikgPT0gUENJX0VYUF9UWVBFX0VORFBPSU5UIHx8CisJICAgICBwY2lfcGNpZV90eXBlKGRldikgPT0gUENJX0VYUF9UWVBFX1JDX0VORCkpCisJCXJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9QVE1fQ0FQLCAmY2FwKTsKKwlsb2NhbF9jbG9jayA9IChjYXAgJiBQQ0lfUFRNX0dSQU5VTEFSSVRZX01BU0spID4+IDg7CisKKwkvKgorCSAqIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gZW5hYmxpbmcgUFRNIHVubGVzcyBpdCdzIGVuYWJsZWQgaW4gdGhlCisJICogdXBzdHJlYW0gZGV2aWNlIG9yIHRoaXMgZGV2aWNlIGNhbiBiZSBhIFBUTSBSb290IGl0c2VsZi4gIFBlcgorCSAqIHRoZSBzcGVjIHJlY29tbWVuZGF0aW9uIChQQ0llIHIzLjEsIHNlYyA3LjMyLjMpLCBzZWxlY3QgdGhlCisJICogZnVydGhlc3QgdXBzdHJlYW0gVGltZSBTb3VyY2UgYXMgdGhlIFBUTSBSb290LgorCSAqLworCXVwcyA9IHBjaV91cHN0cmVhbV9icmlkZ2UoZGV2KTsKKwlpZiAodXBzICYmIHVwcy0+cHRtX2VuYWJsZWQpIHsKKwkJY3RybCA9IFBDSV9QVE1fQ1RSTF9FTkFCTEU7CisJCWlmICh1cHMtPnB0bV9ncmFudWxhcml0eSA9PSAwKQorCQkJZGV2LT5wdG1fZ3JhbnVsYXJpdHkgPSAwOworCQllbHNlIGlmICh1cHMtPnB0bV9ncmFudWxhcml0eSA+IGxvY2FsX2Nsb2NrKQorCQkJZGV2LT5wdG1fZ3JhbnVsYXJpdHkgPSB1cHMtPnB0bV9ncmFudWxhcml0eTsKKwl9IGVsc2UgeworCQlpZiAoY2FwICYgUENJX1BUTV9DQVBfUk9PVCkgeworCQkJY3RybCA9IFBDSV9QVE1fQ1RSTF9FTkFCTEUgfCBQQ0lfUFRNX0NUUkxfUk9PVDsKKwkJCWRldi0+cHRtX3Jvb3QgPSAxOworCQkJZGV2LT5wdG1fZ3JhbnVsYXJpdHkgPSBsb2NhbF9jbG9jazsKKwkJfSBlbHNlCisJCQlyZXR1cm47CisJfQorCisJY3RybCB8PSBkZXYtPnB0bV9ncmFudWxhcml0eSA8PCA4OworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfUFRNX0NUUkwsIGN0cmwpOworCWRldi0+cHRtX2VuYWJsZWQgPSAxOworCisJcGNpX3B0bV9pbmZvKGRldik7Cit9CisKK2ludCBwY2lfZW5hYmxlX3B0bShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqZ3JhbnVsYXJpdHkpCit7CisJaW50IHBvczsKKwl1MzIgY2FwLCBjdHJsOworCXN0cnVjdCBwY2lfZGV2ICp1cHM7CisKKwlpZiAoIXBjaV9pc19wY2llKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkoZGV2LCBQQ0lfRVhUX0NBUF9JRF9QVE0pOworCWlmICghcG9zKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9QVE1fQ0FQLCAmY2FwKTsKKwlpZiAoIShjYXAgJiBQQ0lfUFRNX0NBUF9SRVEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogRm9yIGEgUENJZSBFbmRwb2ludCwgUFRNIGlzIG9ubHkgdXNlZnVsIGlmIHRoZSBlbmRwb2ludCBjYW4KKwkgKiBpc3N1ZSBQVE0gcmVxdWVzdHMgdG8gdXBzdHJlYW0gZGV2aWNlcyB0aGF0IGhhdmUgUFRNIGVuYWJsZWQuCisJICoKKwkgKiBGb3IgUm9vdCBDb21wbGV4IEludGVncmF0ZWQgRW5kcG9pbnRzLCB0aGVyZSBpcyBubyB1cHN0cmVhbQorCSAqIGRldmljZSwgc28gdGhlcmUgbXVzdCBiZSBzb21lIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHdheSB0bworCSAqIGFzc29jaWF0ZSB0aGUgZW5kcG9pbnQgd2l0aCBhIHRpbWUgc291cmNlLgorCSAqLworCWlmIChwY2lfcGNpZV90eXBlKGRldikgPT0gUENJX0VYUF9UWVBFX0VORFBPSU5UKSB7CisJCXVwcyA9IHBjaV91cHN0cmVhbV9icmlkZ2UoZGV2KTsKKwkJaWYgKCF1cHMgfHwgIXVwcy0+cHRtX2VuYWJsZWQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkZXYtPnB0bV9ncmFudWxhcml0eSA9IHVwcy0+cHRtX2dyYW51bGFyaXR5OworCX0gZWxzZSBpZiAocGNpX3BjaWVfdHlwZShkZXYpID09IFBDSV9FWFBfVFlQRV9SQ19FTkQpIHsKKwkJZGV2LT5wdG1fZ3JhbnVsYXJpdHkgPSAwOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWN0cmwgPSBQQ0lfUFRNX0NUUkxfRU5BQkxFOworCWN0cmwgfD0gZGV2LT5wdG1fZ3JhbnVsYXJpdHkgPDwgODsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX1BUTV9DVFJMLCBjdHJsKTsKKwlkZXYtPnB0bV9lbmFibGVkID0gMTsKKworCXBjaV9wdG1faW5mbyhkZXYpOworCisJaWYgKGdyYW51bGFyaXR5KQorCQkqZ3JhbnVsYXJpdHkgPSBkZXYtPnB0bV9ncmFudWxhcml0eTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocGNpX2VuYWJsZV9wdG0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggOTNmMjgwZC4uYWIwMDI2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC0xNjY2LDcgKzE2NjYsMTEgQEAKIAkvKiBFbmFibGUgQUNTIFAyUCB1cHN0cmVhbSBmb3J3YXJkaW5nICovCiAJcGNpX2VuYWJsZV9hY3MoZGV2KTsKIAotCXBjaV9jbGVhbnVwX2Flcl9lcnJvcl9zdGF0dXNfcmVncyhkZXYpOworCS8qIFByZWNpc2lvbiBUaW1lIE1lYXN1cmVtZW50ICovCisJcGNpX3B0bV9pbml0KGRldik7CisKKwkvKiBBZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcgKi8KKwlwY2lfYWVyX2luaXQoZGV2KTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggMzdmZjAxNS4uY2ZmYzFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTMxOTgsNiArMzE5OCw3IEBACiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9BVEhFUk9TLCAweDAwMzAsIHF1aXJrX25vX2J1c19yZXNldCk7CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9BVEhFUk9TLCAweDAwMzIsIHF1aXJrX25vX2J1c19yZXNldCk7CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9BVEhFUk9TLCAweDAwM2MsIHF1aXJrX25vX2J1c19yZXNldCk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9BVEhFUk9TLCAweDAwMzMsIHF1aXJrX25vX2J1c19yZXNldCk7CiAKIHN0YXRpYyB2b2lkIHF1aXJrX25vX3BtX3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CkBAIC0zMzI3LDkgKzMzMjgsOSBAQAogCWlmIChuaGktPnZlbmRvciAhPSBQQ0lfVkVORE9SX0lEX0lOVEVMCiAJCSAgICB8fCAobmhpLT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9MSUdIVF9SSURHRSAmJgogCQkJbmhpLT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9DQUNUVVNfUklER0VfNEMgJiYKKwkJCW5oaS0+ZGV2aWNlICE9IFBDSV9ERVZJQ0VfSURfSU5URUxfRkFMQ09OX1JJREdFXzJDX05ISSAmJgogCQkJbmhpLT5kZXZpY2UgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9GQUxDT05fUklER0VfNENfTkhJKQotCQkgICAgfHwgbmhpLT5zdWJzeXN0ZW1fdmVuZG9yICE9IDB4MjIyMgotCQkgICAgfHwgbmhpLT5zdWJzeXN0ZW1fZGV2aWNlICE9IDB4MTExMSkKKwkJICAgIHx8IG5oaS0+Y2xhc3MgIT0gUENJX0NMQVNTX1NZU1RFTV9PVEhFUiA8PCA4KQogCQlnb3RvIG91dDsKIAlkZXZfaW5mbygmZGV2LT5kZXYsICJxdWlyazogd2FpdGluZyBmb3IgdGh1bmRlcmJvbHQgdG8gcmVlc3RhYmxpc2ggUENJIHR1bm5lbHMuLi5cbiIpOwogCWRldmljZV9wbV93YWl0X2Zvcl9kZXYoJmRldi0+ZGV2LCAmbmhpLT5kZXYpOwpAQCAtMzM0NCw2ICszMzQ1LDkgQEAKIAkJCSAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMX0NBQ1RVU19SSURHRV80QywKIAkJCSAgICAgICBxdWlya19hcHBsZV93YWl0X2Zvcl90aHVuZGVyYm9sdCk7CiBERUNMQVJFX1BDSV9GSVhVUF9SRVNVTUVfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJCSAgICAgICBQQ0lfREVWSUNFX0lEX0lOVEVMX0ZBTENPTl9SSURHRV8yQ19CUklER0UsCisJCQkgICAgICAgcXVpcmtfYXBwbGVfd2FpdF9mb3JfdGh1bmRlcmJvbHQpOworREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FX0VBUkxZKFBDSV9WRU5ET1JfSURfSU5URUwsCiAJCQkgICAgICAgUENJX0RFVklDRV9JRF9JTlRFTF9GQUxDT05fUklER0VfNENfQlJJREdFLAogCQkJICAgICAgIHF1aXJrX2FwcGxlX3dhaXRfZm9yX3RodW5kZXJib2x0KTsKICNlbmRpZgpAQCAtNDQyOCwzICs0NDMyLDIwIEBACiAJfQogfQogREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHg0NDMsIHF1aXJrX2ludGVsX3FhdF92Zl9jYXApOworCisvKgorICogVk1ELWVuYWJsZWQgcm9vdCBwb3J0cyB3aWxsIGNoYW5nZSB0aGUgc291cmNlIElEIGZvciBhbGwgbWVzc2FnZXMKKyAqIHRvIHRoZSBWTUQgZGV2aWNlLiBSYXRoZXIgdGhhbiBkb2luZyBkZXZpY2UgbWF0Y2hpbmcgd2l0aCB0aGUgc291cmNlCisgKiBJRCwgdGhlIEFFUiBkcml2ZXIgc2hvdWxkIHRyYXZlcnNlIHRoZSBjaGlsZCBkZXZpY2UgdHJlZSwgcmVhZGluZworICogQUVSIHJlZ2lzdGVycyB0byBmaW5kIHRoZSBmYXVsdGluZyBkZXZpY2UuCisgKi8KK3N0YXRpYyB2b2lkIHF1aXJrX25vX2FlcnNpZChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwkvKiBWTUQgRG9tYWluICovCisJaWYgKHBkZXYtPmJ1cy0+c3lzZGF0YSAmJiBwY2lfZG9tYWluX25yKHBkZXYtPmJ1cykgPj0gMHgxMDAwMCkKKwkJcGRldi0+YnVzLT5idXNfZmxhZ3MgfD0gUENJX0JVU19GTEFHU19OT19BRVJTSUQ7Cit9CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMzAsIHF1aXJrX25vX2FlcnNpZCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMzEsIHF1aXJrX25vX2FlcnNpZCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMzIsIHF1aXJrX25vX2FlcnNpZCk7CitERUNMQVJFX1BDSV9GSVhVUF9FQVJMWShQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDIwMzMsIHF1aXJrX25vX2FlcnNpZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9yZW1vdmUuYyBiL2RyaXZlcnMvcGNpL3JlbW92ZS5jCmluZGV4IGQxZWY3YWMuLmY5MzU3ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3JlbW92ZS5jCisrKyBiL2RyaXZlcnMvcGNpL3JlbW92ZS5jCkBAIC00MCw2ICs0MCw3IEBACiAJbGlzdF9kZWwoJmRldi0+YnVzX2xpc3QpOwogCXVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAKKwlwY2lfYnJpZGdlX2QzX2RldmljZV9yZW1vdmVkKGRldik7CiAJcGNpX2ZyZWVfcmVzb3VyY2VzKGRldik7CiAJcHV0X2RldmljZSgmZGV2LT5kZXYpOwogfQpAQCAtOTYsOCArOTcsNiBAQAogCQlkZXYtPnN1Ym9yZGluYXRlID0gTlVMTDsKIAl9CiAKLQlwY2lfYnJpZGdlX2QzX2RldmljZV9yZW1vdmVkKGRldik7Ci0KIAlwY2lfZGVzdHJveV9kZXYoZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCBjNzQwNTllLi5mMzBjYTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlICJwY2kuaCIKIAogdW5zaWduZWQgaW50IHBjaV9mbGFnczsKQEAgLTE4NTIsOCArMTg1MywxMyBAQAogewogCXN0cnVjdCBwY2lfYnVzICpyb290X2J1czsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocm9vdF9idXMsICZwY2lfcm9vdF9idXNlcywgbm9kZSkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJvb3RfYnVzLCAmcGNpX3Jvb3RfYnVzZXMsIG5vZGUpIHsKIAkJcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jvb3RfYnVzX3Jlc291cmNlcyhyb290X2J1cyk7CisKKwkJLyogTWFrZSBzdXJlIHRoZSByb290IGJyaWRnZSBoYXMgYSBjb21wYW5pb24gQUNQSSBkZXZpY2U6ICovCisJCWlmIChBQ1BJX0hBTkRMRShyb290X2J1cy0+YnJpZGdlKSkKKwkJCWFjcGlfaW9hcGljX2FkZChBQ1BJX0hBTkRMRShyb290X2J1cy0+YnJpZGdlKSk7CisJfQogfQogCiB2b2lkIHBjaV9hc3NpZ25fdW5hc3NpZ25lZF9icmlkZ2VfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpicmlkZ2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9kcy5jIGIvZHJpdmVycy9wY21jaWEvZHMuYwppbmRleCA0ODllYTEwLi42OWI1ZTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9kcy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL2RzLmMKQEAgLTk3Nyw3ICs5NzcsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqIHJ1bnRpbWUgUE0gc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQgcGNtY2lhX2Rldl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgcGNtY2lhX2Rldl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CiBzdGF0aWMgaW50IHBjbWNpYV9kZXZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIHN0YXRpYyBpbnQgcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTk4NSw3ICs5ODUsNyBAQAogCWludCByYzsKIAogCWRldmljZV9sb2NrKGRldik7Ci0JcmMgPSBwY21jaWFfZGV2X3N1c3BlbmQoZGV2LCBQTVNHX1NVU1BFTkQpOworCXJjID0gcGNtY2lhX2Rldl9zdXNwZW5kKGRldik7CiAJZGV2aWNlX3VubG9jayhkZXYpOwogCXJldHVybiByYzsKIH0KQEAgLTExMzUsNyArMTEzNSw3IEBACiAKIC8qIFBNIHN1cHBvcnQsIGFsc28gbmVlZGVkIGZvciByZXNldCAqLwogCi1zdGF0aWMgaW50IHBjbWNpYV9kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcGNtY2lhX2Rldl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNtY2lhX2RldmljZSAqcF9kZXYgPSB0b19wY21jaWFfZGV2KGRldik7CiAJc3RydWN0IHBjbWNpYV9kcml2ZXIgKnBfZHJ2ID0gTlVMTDsKQEAgLTE0MTAsNiArMTQxMCw5IEBACiAJLnJlbW92ZV9kZXYgPSAmcGNtY2lhX2J1c19yZW1vdmVfc29ja2V0LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHBjbWNpYV9idXNfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBjbWNpYV9kZXZfc3VzcGVuZCwgcGNtY2lhX2Rldl9yZXN1bWUpCit9OwogCiBzdHJ1Y3QgYnVzX3R5cGUgcGNtY2lhX2J1c190eXBlID0gewogCS5uYW1lID0gInBjbWNpYSIsCkBAIC0xNDE4LDggKzE0MjEsNyBAQAogCS5kZXZfZ3JvdXBzID0gcGNtY2lhX2Rldl9ncm91cHMsCiAJLnByb2JlID0gcGNtY2lhX2RldmljZV9wcm9iZSwKIAkucmVtb3ZlID0gcGNtY2lhX2RldmljZV9yZW1vdmUsCi0JLnN1c3BlbmQgPSBwY21jaWFfZGV2X3N1c3BlbmQsCi0JLnJlc3VtZSA9IHBjbWNpYV9kZXZfcmVzdW1lLAorCS5wbSA9ICZwY21jaWFfYnVzX3BtX29wcywKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmMKaW5kZXggNDgzZjkxOS4uOTFiNWY1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5jCkBAIC0yMTQsOSArMjE0LDggQEAKIH0KICNlbmRpZgogCi12b2lkIHB4YTJ4eF9jb25maWd1cmVfc29ja2V0cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit2b2lkIHB4YTJ4eF9jb25maWd1cmVfc29ja2V0cyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwY21jaWFfbG93X2xldmVsICpvcHMpCiB7Ci0Jc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wcyA9IGRldi0+cGxhdGZvcm1fZGF0YTsKIAkvKgogCSAqIFdlIGhhdmUgYXQgbGVhc3Qgb25lIHNvY2tldCwgc28gc2V0IE1FQ1I6Q0lUCiAJICogKENhcmQgSXMgVGhlcmUpCkBAIC0zMjIsNyArMzIxLDcgQEAKIAkJCWdvdG8gZXJyMTsKIAl9CiAKLQlweGEyeHhfY29uZmlndXJlX3NvY2tldHMoJmRldi0+ZGV2KTsKKwlweGEyeHhfY29uZmlndXJlX3NvY2tldHMoJmRldi0+ZGV2LCBvcHMpOwogCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIHNpbmZvKTsKIAogCXJldHVybiAwOwpAQCAtMzQ4LDcgKzM0Nyw5IEBACiAKIHN0YXRpYyBpbnQgcHhhMnh4X2Rydl9wY21jaWFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlweGEyeHhfY29uZmlndXJlX3NvY2tldHMoZGV2KTsKKwlzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqb3BzID0gKHN0cnVjdCBwY21jaWFfbG93X2xldmVsICopZGV2LT5wbGF0Zm9ybV9kYXRhOworCisJcHhhMnh4X2NvbmZpZ3VyZV9zb2NrZXRzKGRldiwgb3BzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuaCBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYXNlLmgKaW5kZXggYjYwOWI0NS4uZTU4YzdhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X2Jhc2UuaAorKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFzZS5oCkBAIC0xLDQgKzEsNCBAQAogaW50IHB4YTJ4eF9kcnZfcGNtY2lhX2FkZF9vbmUoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpOwogdm9pZCBweGEyeHhfZHJ2X3BjbWNpYV9vcHMoc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgKm9wcyk7Ci12b2lkIHB4YTJ4eF9jb25maWd1cmVfc29ja2V0cyhzdHJ1Y3QgZGV2aWNlICpkZXYpOwordm9pZCBweGEyeHhfY29uZmlndXJlX3NvY2tldHMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCAqb3BzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTExX2JhZGdlNC5jIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX2JhZGdlNC5jCmluZGV4IDEyZjBkZDAuLjJmNDkwOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9iYWRnZTQuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfYmFkZ2U0LmMKQEAgLTEzNCwyMCArMTM0LDE0IEBACiAKIGludCBwY21jaWFfYmFkZ2U0X2luaXQoc3RydWN0IHNhMTExMV9kZXYgKmRldikKIHsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKKwlwcmludGsoS0VSTl9JTkZPCisJICAgICAgICIlczogYmFkZ2U0X3BjbXZjYz0lZCwgYmFkZ2U0X3BjbXZwcD0lZCwgYmFkZ2U0X2NmdmNjPSVkXG4iLAorCSAgICAgICBfX2Z1bmNfXywKKwkgICAgICAgYmFkZ2U0X3BjbXZjYywgYmFkZ2U0X3BjbXZwcCwgYmFkZ2U0X2NmdmNjKTsKIAotCWlmIChtYWNoaW5lX2lzX2JhZGdlNCgpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICIlczogYmFkZ2U0X3BjbXZjYz0lZCwgYmFkZ2U0X3BjbXZwcD0lZCwgYmFkZ2U0X2NmdmNjPSVkXG4iLAotCQkgICAgICAgX19mdW5jX18sCi0JCSAgICAgICBiYWRnZTRfcGNtdmNjLCBiYWRnZTRfcGNtdnBwLCBiYWRnZTRfY2Z2Y2MpOwotCi0JCXNhMTF4eF9kcnZfcGNtY2lhX29wcygmYmFkZ2U0X3BjbWNpYV9vcHMpOwotCQlyZXQgPSBzYTExMTFfcGNtY2lhX2FkZChkZXYsICZiYWRnZTRfcGNtY2lhX29wcywKLQkJCQlzYTExeHhfZHJ2X3BjbWNpYV9hZGRfb25lKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXNhMTF4eF9kcnZfcGNtY2lhX29wcygmYmFkZ2U0X3BjbWNpYV9vcHMpOworCXJldHVybiBzYTExMTFfcGNtY2lhX2FkZChkZXYsICZiYWRnZTRfcGNtY2lhX29wcywKKwkJCQkgc2ExMXh4X2Rydl9wY21jaWFfYWRkX29uZSk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBjbXZfc2V0dXAoY2hhciAqcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9nZW5lcmljLmMgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfZ2VuZXJpYy5jCmluZGV4IGExNTMxZmUuLjNkOTVkZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX2dlbmVyaWMuYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zYTExMTEuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogI2luY2x1ZGUgInNhMTExMV9nZW5lcmljLmgiCkBAIC0yMDMsMTkgKzIwNCwzMCBAQAogCXNhMTExMV93cml0ZWwoUENTU1JfUzBfU0xFRVAgfCBQQ1NTUl9TMV9TTEVFUCwgYmFzZSArIFBDU1NSKTsKIAlzYTExMTFfd3JpdGVsKFBDQ1JfUzBfRkxUIHwgUENDUl9TMV9GTFQsIGJhc2UgKyBQQ0NSKTsKIAorCXJldCA9IC1FTk9ERVY7CiAjaWZkZWYgQ09ORklHX1NBMTEwMF9CQURHRTQKLQlwY21jaWFfYmFkZ2U0X2luaXQoZGV2KTsKKwlpZiAobWFjaGluZV9pc19iYWRnZTQoKSkKKwkJcmV0ID0gcGNtY2lhX2JhZGdlNF9pbml0KGRldik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU0ExMTAwX0pPUk5BREE3MjAKLQlwY21jaWFfam9ybmFkYTcyMF9pbml0KGRldik7CisJaWYgKG1hY2hpbmVfaXNfam9ybmFkYTcyMCgpKQorCQlyZXQgPSBwY21jaWFfam9ybmFkYTcyMF9pbml0KGRldik7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVJDSF9MVUJCT0NLCi0JcGNtY2lhX2x1YmJvY2tfaW5pdChkZXYpOworCWlmIChtYWNoaW5lX2lzX2x1YmJvY2soKSkKKwkJcmV0ID0gcGNtY2lhX2x1YmJvY2tfaW5pdChkZXYpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0FTU0FCRVRfTkVQT05TRVQKLQlwY21jaWFfbmVwb25zZXRfaW5pdChkZXYpOworCWlmIChtYWNoaW5lX2lzX2Fzc2FiZXQoKSkKKwkJcmV0ID0gcGNtY2lhX25lcG9uc2V0X2luaXQoZGV2KTsKICNlbmRpZgotCXJldHVybiAwOworCisJaWYgKHJldCkgeworCQlyZWxlYXNlX21lbV9yZWdpb24oZGV2LT5yZXMuc3RhcnQsIDUxMik7CisJCXNhMTExMV9kaXNhYmxlX2RldmljZShkZXYpOworCX0KKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcGNtY2lhX3JlbW92ZShzdHJ1Y3Qgc2ExMTExX2RldiAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTExX2pvcm5hZGE3MjAuYyBiL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9qb3JuYWRhNzIwLmMKaW5kZXggYzJjMzA1OC4uNDgwYTNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc2ExMTExX2pvcm5hZGE3MjAuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfam9ybmFkYTcyMC5jCkBAIC05NCwyMiArOTQsMTcgQEAKIAogaW50IHBjbWNpYV9qb3JuYWRhNzIwX2luaXQoc3RydWN0IHNhMTExMV9kZXYgKnNhZGV2KQogewotCWludCByZXQgPSAtRU5PREVWOworCXVuc2lnbmVkIGludCBwaW4gPSBHUElPX0EwIHwgR1BJT19BMSB8IEdQSU9fQTIgfCBHUElPX0EzOwogCi0JaWYgKG1hY2hpbmVfaXNfam9ybmFkYTcyMCgpKSB7Ci0JCXVuc2lnbmVkIGludCBwaW4gPSBHUElPX0EwIHwgR1BJT19BMSB8IEdQSU9fQTIgfCBHUElPX0EzOworCS8qIEZpeG1lOiB3aHkgbWVzc2luZyBhcm91bmQgd2l0aCBTQTExeDAncyBHUElPMT8gKi8KKwlHUkVSIHw9IDB4MDAwMDAwMDI7CiAKLQkJR1JFUiB8PSAweDAwMDAwMDAyOworCS8qIFNldCBHUElPX0E8MzoxPiB0byBiZSBvdXRwdXRzIGZvciBQQ01DSUEvQ0YgcG93ZXIgY29udHJvbGxlcjogKi8KKwlzYTExMTFfc2V0X2lvX2RpcihzYWRldiwgcGluLCAwLCAwKTsKKwlzYTExMTFfc2V0X2lvKHNhZGV2LCBwaW4sIDApOworCXNhMTExMV9zZXRfc2xlZXBfaW8oc2FkZXYsIHBpbiwgMCk7CiAKLQkJLyogU2V0IEdQSU9fQTwzOjE+IHRvIGJlIG91dHB1dHMgZm9yIFBDTUNJQS9DRiBwb3dlciBjb250cm9sbGVyOiAqLwotCQlzYTExMTFfc2V0X2lvX2RpcihzYWRldiwgcGluLCAwLCAwKTsKLQkJc2ExMTExX3NldF9pbyhzYWRldiwgcGluLCAwKTsKLQkJc2ExMTExX3NldF9zbGVlcF9pbyhzYWRldiwgcGluLCAwKTsKLQotCQlzYTExeHhfZHJ2X3BjbWNpYV9vcHMoJmpvcm5hZGE3MjBfcGNtY2lhX29wcyk7Ci0JCXJldCA9IHNhMTExMV9wY21jaWFfYWRkKHNhZGV2LCAmam9ybmFkYTcyMF9wY21jaWFfb3BzLAotCQkJCXNhMTF4eF9kcnZfcGNtY2lhX2FkZF9vbmUpOwotCX0KLQotCXJldHVybiByZXQ7CisJc2ExMXh4X2Rydl9wY21jaWFfb3BzKCZqb3JuYWRhNzIwX3BjbWNpYV9vcHMpOworCXJldHVybiBzYTExMTFfcGNtY2lhX2FkZChzYWRldiwgJmpvcm5hZGE3MjBfcGNtY2lhX29wcywKKwkJCQkgc2ExMXh4X2Rydl9wY21jaWFfYWRkX29uZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zYTExMTFfbHViYm9jay5jIGIvZHJpdmVycy9wY21jaWEvc2ExMTExX2x1YmJvY2suYwppbmRleCBjNWNhZjU3Li5lNzQxZjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zYTExMTFfbHViYm9jay5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NhMTExMV9sdWJib2NrLmMKQEAgLTIxMCwyNyArMjEwLDIxIEBACiAKIGludCBwY21jaWFfbHViYm9ja19pbml0KHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldikKIHsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKKwkvKgorCSAqIFNldCBHUElPX0E8MzowPiB0byBiZSBvdXRwdXRzIGZvciB0aGUgTUFYMTYwMCwKKwkgKiBhbmQgc3dpdGNoIHRvIHN0YW5kYnkgbW9kZS4KKwkgKi8KKwlzYTExMTFfc2V0X2lvX2RpcihzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCwgMCk7CisJc2ExMTExX3NldF9pbyhzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCk7CisJc2ExMTExX3NldF9zbGVlcF9pbyhzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCk7CiAKLQlpZiAobWFjaGluZV9pc19sdWJib2NrKCkpIHsKLQkJLyoKLQkJICogU2V0IEdQSU9fQTwzOjA+IHRvIGJlIG91dHB1dHMgZm9yIHRoZSBNQVgxNjAwLAotCQkgKiBhbmQgc3dpdGNoIHRvIHN0YW5kYnkgbW9kZS4KLQkJICovCi0JCXNhMTExMV9zZXRfaW9fZGlyKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwLCAwKTsKLQkJc2ExMTExX3NldF9pbyhzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCk7Ci0JCXNhMTExMV9zZXRfc2xlZXBfaW8oc2FkZXYsIEdQSU9fQTB8R1BJT19BMXxHUElPX0EyfEdQSU9fQTMsIDApOworCS8qIFNldCBDRiBTb2NrZXQgMSBwb3dlciB0byBzdGFuZGJ5IG1vZGUuICovCisJbHViYm9ja19zZXRfbWlzY193cigoMSA8PCAxNSkgfCAoMSA8PCAxNCksIDApOwogCi0JCS8qIFNldCBDRiBTb2NrZXQgMSBwb3dlciB0byBzdGFuZGJ5IG1vZGUuICovCi0JCWx1YmJvY2tfc2V0X21pc2Nfd3IoKDEgPDwgMTUpIHwgKDEgPDwgMTQpLCAwKTsKLQotCQlweGEyeHhfZHJ2X3BjbWNpYV9vcHMoJmx1YmJvY2tfcGNtY2lhX29wcyk7Ci0JCXB4YTJ4eF9jb25maWd1cmVfc29ja2V0cygmc2FkZXYtPmRldik7Ci0JCXJldCA9IHNhMTExMV9wY21jaWFfYWRkKHNhZGV2LCAmbHViYm9ja19wY21jaWFfb3BzLAotCQkJCXB4YTJ4eF9kcnZfcGNtY2lhX2FkZF9vbmUpOwotCX0KLQotCXJldHVybiByZXQ7CisJcHhhMnh4X2Rydl9wY21jaWFfb3BzKCZsdWJib2NrX3BjbWNpYV9vcHMpOworCXB4YTJ4eF9jb25maWd1cmVfc29ja2V0cygmc2FkZXYtPmRldiwgJmx1YmJvY2tfcGNtY2lhX29wcyk7CisJcmV0dXJuIHNhMTExMV9wY21jaWFfYWRkKHNhZGV2LCAmbHViYm9ja19wY21jaWFfb3BzLAorCQkJCSBweGEyeHhfZHJ2X3BjbWNpYV9hZGRfb25lKTsKIH0KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMTExX25lcG9uc2V0LmMgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfbmVwb25zZXQuYwppbmRleCAxZDc4NzM5Li4wMTljMzk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9zYTExMTFfbmVwb25zZXQuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExMTFfbmVwb25zZXQuYwpAQCAtMTEwLDIwICsxMTAsMTQgQEAKIAogaW50IHBjbWNpYV9uZXBvbnNldF9pbml0KHN0cnVjdCBzYTExMTFfZGV2ICpzYWRldikKIHsKLQlpbnQgcmV0ID0gLUVOT0RFVjsKLQotCWlmIChtYWNoaW5lX2lzX2Fzc2FiZXQoKSkgewotCQkvKgotCQkgKiBTZXQgR1BJT19BPDM6MD4gdG8gYmUgb3V0cHV0cyBmb3IgdGhlIE1BWDE2MDAsCi0JCSAqIGFuZCBzd2l0Y2ggdG8gc3RhbmRieSBtb2RlLgotCQkgKi8KLQkJc2ExMTExX3NldF9pb19kaXIoc2FkZXYsIEdQSU9fQTB8R1BJT19BMXxHUElPX0EyfEdQSU9fQTMsIDAsIDApOwotCQlzYTExMTFfc2V0X2lvKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwKTsKLQkJc2ExMTExX3NldF9zbGVlcF9pbyhzYWRldiwgR1BJT19BMHxHUElPX0ExfEdQSU9fQTJ8R1BJT19BMywgMCk7Ci0JCXNhMTF4eF9kcnZfcGNtY2lhX29wcygmbmVwb25zZXRfcGNtY2lhX29wcyk7Ci0JCXJldCA9IHNhMTExMV9wY21jaWFfYWRkKHNhZGV2LCAmbmVwb25zZXRfcGNtY2lhX29wcywKLQkJCQlzYTExeHhfZHJ2X3BjbWNpYV9hZGRfb25lKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCS8qCisJICogU2V0IEdQSU9fQTwzOjA+IHRvIGJlIG91dHB1dHMgZm9yIHRoZSBNQVgxNjAwLAorCSAqIGFuZCBzd2l0Y2ggdG8gc3RhbmRieSBtb2RlLgorCSAqLworCXNhMTExMV9zZXRfaW9fZGlyKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwLCAwKTsKKwlzYTExMTFfc2V0X2lvKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwKTsKKwlzYTExMTFfc2V0X3NsZWVwX2lvKHNhZGV2LCBHUElPX0EwfEdQSU9fQTF8R1BJT19BMnxHUElPX0EzLCAwKTsKKwlzYTExeHhfZHJ2X3BjbWNpYV9vcHMoJm5lcG9uc2V0X3BjbWNpYV9vcHMpOworCXJldHVybiBzYTExMTFfcGNtY2lhX2FkZChzYWRldiwgJm5lcG9uc2V0X3BjbWNpYV9vcHMsCisJCQkJIHNhMTF4eF9kcnZfcGNtY2lhX2FkZF9vbmUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvc2ExMXh4X2Jhc2UuYyBiL2RyaXZlcnMvcGNtY2lhL3NhMTF4eF9iYXNlLmMKaW5kZXggOWY2ZWM4Ny4uNDgxNDBhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc2ExMXh4X2Jhc2UuYworKysgYi9kcml2ZXJzL3BjbWNpYS9zYTExeHhfYmFzZS5jCkBAIC0xNDQsMTkgKzE0NCwxOSBAQAogc2ExMTAwX3BjbWNpYV9zaG93X3RpbWluZyhzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCwgY2hhciAqYnVmKQogewogCXN0cnVjdCBzb2NfcGNtY2lhX3RpbWluZyB0aW1pbmc7Ci0JdW5zaWduZWQgaW50IGNsb2NrID0gY2xrX2dldF9yYXRlKHNrdC0+Y2xrKTsKKwl1bnNpZ25lZCBpbnQgY2xvY2sgPSBjbGtfZ2V0X3JhdGUoc2t0LT5jbGspIC8gMTAwMDsKIAl1bnNpZ25lZCBsb25nIG1lY3IgPSBNRUNSOwogCWNoYXIgKnAgPSBidWY7CiAKIAlzb2NfY29tbW9uX3BjbWNpYV9nZXRfdGltaW5nKHNrdCwgJnRpbWluZyk7CiAKLQlwKz1zcHJpbnRmKHAsICJJL08gICAgICA6ICV1ICgldSlcbiIsIHRpbWluZy5pbywKKwlwKz1zcHJpbnRmKHAsICJJL08gICAgICA6ICV1bnMgKCV1bnMpXG4iLCB0aW1pbmcuaW8sCiAJCSAgIHNhMTEwMF9wY21jaWFfY21kX3RpbWUoY2xvY2ssIE1FQ1JfQlNJT19HRVQobWVjciwgc2t0LT5ucikpKTsKIAotCXArPXNwcmludGYocCwgImF0dHJpYnV0ZTogJXUgKCV1KVxuIiwgdGltaW5nLmF0dHIsCisJcCs9c3ByaW50ZihwLCAiYXR0cmlidXRlOiAldW5zICgldW5zKVxuIiwgdGltaW5nLmF0dHIsCiAJCSAgIHNhMTEwMF9wY21jaWFfY21kX3RpbWUoY2xvY2ssIE1FQ1JfQlNBX0dFVChtZWNyLCBza3QtPm5yKSkpOwogCi0JcCs9c3ByaW50ZihwLCAiY29tbW9uICAgOiAldSAoJXUpXG4iLCB0aW1pbmcubWVtLAorCXArPXNwcmludGYocCwgImNvbW1vbiAgIDogJXVucyAoJXVucylcbiIsIHRpbWluZy5tZW0sCiAJCSAgIHNhMTEwMF9wY21jaWFfY21kX3RpbWUoY2xvY2ssIE1FQ1JfQlNNX0dFVChtZWNyLCBza3QtPm5yKSkpOwogCiAJcmV0dXJuIHAgLSBidWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMgYi9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMKaW5kZXggZWVkNWU5Yy4uZDVjYTc2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYwpAQCAtMjM1LDcgKzIzNSw3IEBACiAJc3RhdCB8PSBza3QtPmNzX3N0YXRlLlZjYyA/IFNTX1BPV0VST04gOiAwOwogCiAJaWYgKHNrdC0+Y3Nfc3RhdGUuZmxhZ3MgJiBTU19JT0NBUkQpCi0JCXN0YXQgfD0gc3RhdGUuYnZkMSA/IFNTX1NUU0NIRyA6IDA7CisJCXN0YXQgfD0gc3RhdGUuYnZkMSA/IDAgOiBTU19TVFNDSEc7CiAJZWxzZSB7CiAJCWlmIChzdGF0ZS5idmQxID09IDApCiAJCQlzdGF0IHw9IFNTX0JBVERFQUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BlcmYvYXJtX3BtdS5jIGIvZHJpdmVycy9wZXJmL2FybV9wbXUuYwppbmRleCBjNDk0NjEzLi5iMzdiNTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BlcmYvYXJtX3BtdS5jCisrKyBiL2RyaXZlcnMvcGVyZi9hcm1fcG11LmMKQEAgLTUzNCw2ICs1MzQsMjQgQEAKIAlyZXR1cm4gY3B1bWFza190ZXN0X2NwdShjcHUsICZhcm1wbXUtPnN1cHBvcnRlZF9jcHVzKTsKIH0KIAorc3RhdGljIHNzaXplX3QgYXJtcG11X2NwdW1hc2tfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJcmV0dXJuIGNwdW1hcF9wcmludF90b19wYWdlYnVmKHRydWUsIGJ1ZiwgJmFybXBtdS0+c3VwcG9ydGVkX2NwdXMpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoY3B1cywgU19JUlVHTywgYXJtcG11X2NwdW1hc2tfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphcm1wbXVfY29tbW9uX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2NwdXMuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYXJtcG11X2NvbW1vbl9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IGFybXBtdV9jb21tb25fYXR0cnMsCit9OworCiBzdGF0aWMgdm9pZCBhcm1wbXVfaW5pdChzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11KQogewogCWF0b21pY19zZXQoJmFybXBtdS0+YWN0aXZlX2V2ZW50cywgMCk7CkBAIC01NDksNyArNTY3LDEwIEBACiAJCS5zdG9wCQk9IGFybXBtdV9zdG9wLAogCQkucmVhZAkJPSBhcm1wbXVfcmVhZCwKIAkJLmZpbHRlcl9tYXRjaAk9IGFybXBtdV9maWx0ZXJfbWF0Y2gsCisJCS5hdHRyX2dyb3Vwcwk9IGFybXBtdS0+YXR0cl9ncm91cHMsCiAJfTsKKwlhcm1wbXUtPmF0dHJfZ3JvdXBzW0FSTVBNVV9BVFRSX0dST1VQX0NPTU1PTl0gPQorCQkmYXJtcG11X2NvbW1vbl9hdHRyX2dyb3VwOwogfQogCiAvKiBTZXQgYXQgcnVudGltZSB3aGVuIHdlIGtub3cgd2hhdCBDUFUgdHlwZSB3ZSBhcmUuICovCkBAIC02MDIsNyArNjIzLDcgQEAKIAlpcnFzID0gbWluKHBtdV9kZXZpY2UtPm51bV9yZXNvdXJjZXMsIG51bV9wb3NzaWJsZV9jcHVzKCkpOwogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwbXVfZGV2aWNlLCAwKTsKLQlpZiAoaXJxID49IDAgJiYgaXJxX2lzX3BlcmNwdShpcnEpKSB7CisJaWYgKGlycSA+IDAgJiYgaXJxX2lzX3BlcmNwdShpcnEpKSB7CiAJCW9uX2VhY2hfY3B1X21hc2soJmNwdV9wbXUtPnN1cHBvcnRlZF9jcHVzLAogCQkJCSBjcHVfcG11X2Rpc2FibGVfcGVyY3B1X2lycSwgJmlycSwgMSk7CiAJCWZyZWVfcGVyY3B1X2lycShpcnEsICZod19ldmVudHMtPnBlcmNwdV9wbXUpOwpAQCAtNjE2LDcgKzYzNyw3IEBACiAJCQlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJmNwdV9wbXUtPmFjdGl2ZV9pcnFzKSkKIAkJCQljb250aW51ZTsKIAkJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocG11X2RldmljZSwgaSk7Ci0JCQlpZiAoaXJxID49IDApCisJCQlpZiAoaXJxID4gMCkKIAkJCQlmcmVlX2lycShpcnEsIHBlcl9jcHVfcHRyKCZod19ldmVudHMtPnBlcmNwdV9wbXUsIGNwdSkpOwogCQl9CiAJfQpAQCAtNjM4LDcgKzY1OSw3IEBACiAJfQogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwbXVfZGV2aWNlLCAwKTsKLQlpZiAoaXJxID49IDAgJiYgaXJxX2lzX3BlcmNwdShpcnEpKSB7CisJaWYgKGlycSA+IDAgJiYgaXJxX2lzX3BlcmNwdShpcnEpKSB7CiAJCWVyciA9IHJlcXVlc3RfcGVyY3B1X2lycShpcnEsIGhhbmRsZXIsICJhcm0tcG11IiwKIAkJCQkJICZod19ldmVudHMtPnBlcmNwdV9wbXUpOwogCQlpZiAoZXJyKSB7CkBAIC02ODgsMjggKzcwOSwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFybV9wbXVfbG9jayk7Ci1zdGF0aWMgTElTVF9IRUFEKGFybV9wbXVfbGlzdCk7Ci0KIC8qCiAgKiBQTVUgaGFyZHdhcmUgbG9zZXMgYWxsIGNvbnRleHQgd2hlbiBhIENQVSBnb2VzIG9mZmxpbmUuCiAgKiBXaGVuIGEgQ1BVIGlzIGhvdHBsdWdnZWQgYmFjayBpbiwgc2luY2Ugc29tZSBoYXJkd2FyZSByZWdpc3RlcnMgYXJlCiAgKiBVTktOT1dOIGF0IHJlc2V0LCB0aGUgUE1VIG11c3QgYmUgZXhwbGljaXRseSByZXNldCB0byBhdm9pZCByZWFkaW5nCiAgKiBqdW5rIHZhbHVlcyBvdXQgb2YgdGhlbS4KICAqLwotc3RhdGljIGludCBhcm1fcGVyZl9zdGFydGluZ19jcHUodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyBpbnQgYXJtX3BlcmZfc3RhcnRpbmdfY3B1KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQogewotCXN0cnVjdCBhcm1fcG11ICpwbXU7CisJc3RydWN0IGFybV9wbXUgKnBtdSA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IGFybV9wbXUsIG5vZGUpOwogCi0Jc3Bpbl9sb2NrKCZhcm1fcG11X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocG11LCAmYXJtX3BtdV9saXN0LCBlbnRyeSkgewotCi0JCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsICZwbXUtPnN1cHBvcnRlZF9jcHVzKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAocG11LT5yZXNldCkKLQkJCXBtdS0+cmVzZXQocG11KTsKLQl9Ci0Jc3Bpbl91bmxvY2soJmFybV9wbXVfbG9jayk7CisJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgJnBtdS0+c3VwcG9ydGVkX2NwdXMpKQorCQlyZXR1cm4gMDsKKwlpZiAocG11LT5yZXNldCkKKwkJcG11LT5yZXNldChwbXUpOwogCXJldHVybiAwOwogfQogCkBAIC04MjEsOSArODM0LDEwIEBACiAJaWYgKCFjcHVfaHdfZXZlbnRzKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwaW5fbG9jaygmYXJtX3BtdV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZjcHVfcG11LT5lbnRyeSwgJmFybV9wbXVfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmFybV9wbXVfbG9jayk7CisJZXJyID0gY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fU1RBUlRJTkcsCisJCQkJCSAgICAgICAmY3B1X3BtdS0+bm9kZSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKIAogCWVyciA9IGNwdV9wbV9wbXVfcmVnaXN0ZXIoY3B1X3BtdSk7CiAJaWYgKGVycikKQEAgLTg1OSw5ICs4NzMsOSBAQAogCXJldHVybiAwOwogCiBvdXRfdW5yZWdpc3RlcjoKLQlzcGluX2xvY2soJmFybV9wbXVfbG9jayk7Ci0JbGlzdF9kZWwoJmNwdV9wbXUtPmVudHJ5KTsKLQlzcGluX3VubG9jaygmYXJtX3BtdV9sb2NrKTsKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhDUFVIUF9BUF9QRVJGX0FSTV9TVEFSVElORywKKwkJCQkJICAgICZjcHVfcG11LT5ub2RlKTsKK291dF9mcmVlOgogCWZyZWVfcGVyY3B1KGNwdV9od19ldmVudHMpOwogCXJldHVybiBlcnI7CiB9CkBAIC04NjksOSArODgzLDggQEAKIHN0YXRpYyB2b2lkIGNwdV9wbXVfZGVzdHJveShzdHJ1Y3QgYXJtX3BtdSAqY3B1X3BtdSkKIHsKIAljcHVfcG1fcG11X3VucmVnaXN0ZXIoY3B1X3BtdSk7Ci0Jc3Bpbl9sb2NrKCZhcm1fcG11X2xvY2spOwotCWxpc3RfZGVsKCZjcHVfcG11LT5lbnRyeSk7Ci0Jc3Bpbl91bmxvY2soJmFybV9wbXVfbG9jayk7CisJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fU1RBUlRJTkcsCisJCQkJCSAgICAmY3B1X3BtdS0+bm9kZSk7CiAJZnJlZV9wZXJjcHUoY3B1X3BtdS0+aHdfZXZlbnRzKTsKIH0KIApAQCAtOTE5LDEyICs5MzIsMTMgQEAKIAogCQkvKiBDaGVjayB0aGUgSVJRIHR5cGUgYW5kIHByb2hpYml0IGEgbWl4IG9mIFBQSXMgYW5kIFNQSXMgKi8KIAkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsKLQkJaWYgKGlycSA+PSAwKSB7CisJCWlmIChpcnEgPiAwKSB7CiAJCQlib29sIHNwaSA9ICFpcnFfaXNfcGVyY3B1KGlycSk7CiAKIAkJCWlmIChpID4gMCAmJiBzcGkgIT0gdXNpbmdfc3BpKSB7CiAJCQkJcHJfZXJyKCJQUEkvU1BJIElSUSB0eXBlIG1pc21hdGNoIGZvciAlcyFcbiIsCiAJCQkJCWRuLT5uYW1lKTsKKwkJCQlvZl9ub2RlX3B1dChkbik7CiAJCQkJa2ZyZWUoaXJxcyk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CkBAIC05NjksNyArOTgzLDcgQEAKIAlpZiAoY3B1bWFza193ZWlnaHQoJnBtdS0+c3VwcG9ydGVkX2NwdXMpID09IDApIHsKIAkJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAKLQkJaWYgKGlycV9pc19wZXJjcHUoaXJxKSkgeworCQlpZiAoaXJxID4gMCAmJiBpcnFfaXNfcGVyY3B1KGlycSkpIHsKIAkJCS8qIElmIHVzaW5nIFBQSXMsIGNoZWNrIHRoZSBhZmZpbml0eSBvZiB0aGUgcGFydGl0aW9uICovCiAJCQlpbnQgcmV0OwogCkBAIC0xMDI4LDcgKzEwNDIsNyBAQAogCQlyZXQgPSBvZl9wbXVfaXJxX2NmZyhwbXUpOwogCQlpZiAoIXJldCkKIAkJCXJldCA9IGluaXRfZm4ocG11KTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAocHJvYmVfdGFibGUpIHsKIAkJY3B1bWFza19zZXRhbGwoJnBtdS0+c3VwcG9ydGVkX2NwdXMpOwogCQlyZXQgPSBwcm9iZV9jdXJyZW50X3BtdShwbXUsIHByb2JlX3RhYmxlKTsKIAl9CkBAIC0xMDM4LDYgKzEwNTIsNyBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAorCiAJcmV0ID0gY3B1X3BtdV9pbml0KHBtdSk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZnJlZTsKQEAgLTEwNjgsOSArMTA4Myw5IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfUEVSRl9BUk1fU1RBUlRJTkcsCi0JCQkJCSJBUF9QRVJGX0FSTV9TVEFSVElORyIsCi0JCQkJCWFybV9wZXJmX3N0YXJ0aW5nX2NwdSwgTlVMTCk7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfUEVSRl9BUk1fU1RBUlRJTkcsCisJCQkJICAgICAgIkFQX1BFUkZfQVJNX1NUQVJUSU5HIiwKKwkJCQkgICAgICBhcm1fcGVyZl9zdGFydGluZ19jcHUsIE5VTEwpOwogCWlmIChyZXQpCiAJCXByX2VycigiQ1BVIGhvdHBsdWcgbm90aWZpZXIgZm9yIEFSTSBQTVUgY291bGQgbm90IGJlIHJlZ2lzdGVyZWQ6ICVkXG4iLAogCQkgICAgICAgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L0tjb25maWcgYi9kcml2ZXJzL3BoeS9LY29uZmlnCmluZGV4IDE5YmZmM2EuLmZlMDBmOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L0tjb25maWcKKysrIGIvZHJpdmVycy9waHkvS2NvbmZpZwpAQCAtMjQsNiArMjQsMTUgQEAKIAkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgQnJvYWRjb20gVVNCIDIuMCBQSFkgY29ubmVjdGVkIHRvIHRoZSBVU0IKIAkgIGNvbnRyb2xsZXIgb24gTm9ydGhzdGFyIGZhbWlseS4KIAorY29uZmlnIFBIWV9CQ01fTlNfVVNCMworCXRyaXN0YXRlICJCcm9hZGNvbSBOb3J0aHN0YXIgVVNCIDMuMCBQSFkgRHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9CQ01fSVBST0MgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0gJiYgT0YKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IEJyb2FkY29tIFVTQiAzLjAgUEhZIGNvbm5lY3RlZCB0byB0aGUgVVNCCisJICBjb250cm9sbGVyIG9uIE5vcnRoc3RhciBmYW1pbHkuCisKIGNvbmZpZyBQSFlfQkVSTElOX1VTQgogCXRyaXN0YXRlICJNYXJ2ZWxsIEJlcmxpbiBVU0IgUEhZIERyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfQkVSTElOICYmIFJFU0VUX0NPTlRST0xMRVIgJiYgSEFTX0lPTUVNICYmIE9GCkBAIC0yNTgsNyArMjY3LDkgQEAKIAlkZXBlbmRzIG9uIFJFU0VUX0NPTlRST0xMRVIKIAlkZXBlbmRzIG9uIEVYVENPTgogCWRlcGVuZHMgb24gUE9XRVJfU1VQUExZCisJZGVwZW5kcyBvbiBVU0JfU1VQUE9SVAogCXNlbGVjdCBHRU5FUklDX1BIWQorCXNlbGVjdCBVU0JfQ09NTU9OCiAJaGVscAogCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgdHJhbnNjZWl2ZXIgdGhhdCBpcyBwYXJ0IG9mIEFsbHdpbm5lcgogCSAgc3VueGkgU29Dcy4KQEAgLTM1OCw2ICszNjksMTQgQEAKIAloZWxwCiAJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSBSb2NrY2hpcCBVU0IgMi4wIFBIWS4KIAorY29uZmlnIFBIWV9ST0NLQ0hJUF9JTk5PX1VTQjIKKwl0cmlzdGF0ZSAiUm9ja2NoaXAgSU5OTyBVU0IyUEhZIERyaXZlciIKKwlkZXBlbmRzIG9uIChBUkNIX1JPQ0tDSElQIHx8IENPTVBJTEVfVEVTVCkgJiYgT0YKKwlkZXBlbmRzIG9uIENPTU1PTl9DTEsKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwloZWxwCisJICBTdXBwb3J0IGZvciBSb2NrY2hpcCBVU0IyLjAgUEhZIHdpdGggSW5ub3NpbGljb24gSVAgYmxvY2suCisKIGNvbmZpZyBQSFlfUk9DS0NISVBfRU1NQwogCXRyaXN0YXRlICJSb2NrY2hpcCBFTU1DIFBIWSBEcml2ZXIiCiAJZGVwZW5kcyBvbiBBUkNIX1JPQ0tDSElQICYmIE9GCkBAIC0zNzIsNiArMzkxLDIzIEBACiAJaGVscAogCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgUm9ja2NoaXAgRGlzcGxheSBQb3J0IFBIWS4KIAorY29uZmlnIFBIWV9ST0NLQ0hJUF9QQ0lFCisJdHJpc3RhdGUgIlJvY2tjaGlwIFBDSWUgUEhZIERyaXZlciIKKwlkZXBlbmRzIG9uIChBUkNIX1JPQ0tDSElQICYmIE9GKSB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwlzZWxlY3QgTUZEX1NZU0NPTgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHN1cHBvcnQgdGhlIFJvY2tjaGlwIFBDSWUgUEhZLgorCitjb25maWcgUEhZX1JPQ0tDSElQX1RZUEVDCisJdHJpc3RhdGUgIlJvY2tjaGlwIFRZUEVDIFBIWSBEcml2ZXIiCisJZGVwZW5kcyBvbiBPRiAmJiAoQVJDSF9ST0NLQ0hJUCB8fCBDT01QSUxFX1RFU1QpCisJc2VsZWN0IEVYVENPTgorCXNlbGVjdCBHRU5FUklDX1BIWQorCXNlbGVjdCBSRVNFVF9DT05UUk9MTEVSCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCB0aGUgUm9ja2NoaXAgVVNCIFRZUEVDIFBIWS4KKwogY29uZmlnIFBIWV9TVF9TUEVBUjEzMTBfTUlQSFkKIAl0cmlzdGF0ZSAiU1QgU1BFQVIxMzEwLU1JUEhZIGRyaXZlciIKIAlzZWxlY3QgR0VORVJJQ19QSFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L01ha2VmaWxlIGIvZHJpdmVycy9waHkvTWFrZWZpbGUKaW5kZXggOTBhZTE5OC4uYTUzNGNmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9waHkvTWFrZWZpbGUKQEAgLTQsNiArNCw3IEBACiAKIG9iai0kKENPTkZJR19HRU5FUklDX1BIWSkJCSs9IHBoeS1jb3JlLm8KIG9iai0kKENPTkZJR19QSFlfQkNNX05TX1VTQjIpCQkrPSBwaHktYmNtLW5zLXVzYjIubworb2JqLSQoQ09ORklHX1BIWV9CQ01fTlNfVVNCMykJCSs9IHBoeS1iY20tbnMtdXNiMy5vCiBvYmotJChDT05GSUdfUEhZX0JFUkxJTl9VU0IpCQkrPSBwaHktYmVybGluLXVzYi5vCiBvYmotJChDT05GSUdfUEhZX0JFUkxJTl9TQVRBKQkJKz0gcGh5LWJlcmxpbi1zYXRhLm8KIG9iai0kKENPTkZJR19QSFlfREE4WFhfVVNCKQkJKz0gcGh5LWRhOHh4LXVzYi5vCkBAIC0zOSw4ICs0MCwxMSBAQAogb2JqLSQoQ09ORklHX1BIWV9FWFlOT1M1X1VTQkRSRCkJKz0gcGh5LWV4eW5vczUtdXNiZHJkLm8KIG9iai0kKENPTkZJR19QSFlfUUNPTV9BUFE4MDY0X1NBVEEpCSs9IHBoeS1xY29tLWFwcTgwNjQtc2F0YS5vCiBvYmotJChDT05GSUdfUEhZX1JPQ0tDSElQX1VTQikgKz0gcGh5LXJvY2tjaGlwLXVzYi5vCitvYmotJChDT05GSUdfUEhZX1JPQ0tDSElQX0lOTk9fVVNCMikJKz0gcGh5LXJvY2tjaGlwLWlubm8tdXNiMi5vCiBvYmotJChDT05GSUdfUEhZX1JPQ0tDSElQX0VNTUMpICs9IHBoeS1yb2NrY2hpcC1lbW1jLm8KK29iai0kKENPTkZJR19QSFlfUk9DS0NISVBfUENJRSkgKz0gcGh5LXJvY2tjaGlwLXBjaWUubwogb2JqLSQoQ09ORklHX1BIWV9ST0NLQ0hJUF9EUCkJCSs9IHBoeS1yb2NrY2hpcC1kcC5vCitvYmotJChDT05GSUdfUEhZX1JPQ0tDSElQX1RZUEVDKSArPSBwaHktcm9ja2NoaXAtdHlwZWMubwogb2JqLSQoQ09ORklHX1BIWV9RQ09NX0lQUTgwNlhfU0FUQSkJKz0gcGh5LXFjb20taXBxODA2eC1zYXRhLm8KIG9iai0kKENPTkZJR19QSFlfU1RfU1BFQVIxMzEwX01JUEhZKQkrPSBwaHktc3BlYXIxMzEwLW1pcGh5Lm8KIG9iai0kKENPTkZJR19QSFlfU1RfU1BFQVIxMzQwX01JUEhZKQkrPSBwaHktc3BlYXIxMzQwLW1pcGh5Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1iY20tbnMtdXNiMy5jIGIvZHJpdmVycy9waHkvcGh5LWJjbS1ucy11c2IzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyMGZhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1iY20tbnMtdXNiMy5jCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogQnJvYWRjb20gTm9ydGhzdGFyIFVTQiAzLjAgUEhZIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBSYWZhxYIgTWnFgmVja2kgPHJhZmFsQG1pbGVja2kucGw+CisgKgorICogQWxsIG1hZ2ljIHZhbHVlcyB1c2VkIGZvciBpbml0aWFsaXphdGlvbiAoYW5kIHJlbGF0ZWQgY29tbWVudHMpIHdlcmUgb2J0YWluZWQKKyAqIGZyb20gQnJvYWRjb20ncyBTREs6CisgKiBDb3B5cmlnaHQgKGMpIEJyb2FkY29tIENvcnAsIDIwMTIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBCQ01fTlNfVVNCM19NSUlfTU5HX1RJTUVPVVRfVVMJMTAwMAkvKiB1c2VjcyAqLworCitlbnVtIGJjbV9uc19mYW1pbHkgeworCUJDTV9OU19VTktOT1dOLAorCUJDTV9OU19BWCwKKwlCQ01fTlNfQlgsCit9OworCitzdHJ1Y3QgYmNtX25zX3VzYjMgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwllbnVtIGJjbV9uc19mYW1pbHkgZmFtaWx5OworCXZvaWQgX19pb21lbSAqZG1wOworCXZvaWQgX19pb21lbSAqY2NiX21paTsKKwlzdHJ1Y3QgcGh5ICpwaHk7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY21fbnNfdXNiM19pZF90YWJsZVtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAiYnJjbSxucy1heC11c2IzLXBoeSIsCisJCS5kYXRhID0gKGludCAqKUJDTV9OU19BWCwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAiYnJjbSxucy1ieC11c2IzLXBoeSIsCisJCS5kYXRhID0gKGludCAqKUJDTV9OU19CWCwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGJjbV9uc191c2IzX2lkX3RhYmxlKTsKKworc3RhdGljIGludCBiY21fbnNfdXNiM193YWl0X3JlZyhzdHJ1Y3QgYmNtX25zX3VzYjMgKnVzYjMsIHZvaWQgX19pb21lbSAqYWRkciwKKwkJCQl1MzIgbWFzaywgdTMyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJdW5zaWduZWQgbG9uZyBkZWFkbGluZSA9IGppZmZpZXMgKyB0aW1lb3V0OworCXUzMiB2YWw7CisKKwlkbyB7CisJCXZhbCA9IHJlYWRsKGFkZHIpOworCQlpZiAoKHZhbCAmIG1hc2spID09IHZhbHVlKQorCQkJcmV0dXJuIDA7CisJCWNwdV9yZWxheCgpOworCQl1ZGVsYXkoMTApOworCX0gd2hpbGUgKCF0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGRlYWRsaW5lKSk7CisKKwlkZXZfZXJyKHVzYjMtPmRldiwgIlRpbWVvdXQgd2FpdGluZyBmb3IgcmVnaXN0ZXIgJXBcbiIsIGFkZHIpOworCisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmNtX25zX3VzYjNfbWlpX21uZ193YWl0X2lkbGUoc3RydWN0IGJjbV9uc191c2IzICp1c2IzKQoreworCXJldHVybiBiY21fbnNfdXNiM193YWl0X3JlZyh1c2IzLCB1c2IzLT5jY2JfbWlpICsgQkNNQV9DQ0JfTUlJX01OR19DVEwsCisJCQkJICAgIDB4MDEwMCwgMHgwMDAwLAorCQkJCSAgICB1c2Vjc190b19qaWZmaWVzKEJDTV9OU19VU0IzX01JSV9NTkdfVElNRU9VVF9VUykpOworfQorCitzdGF0aWMgaW50IGJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMihzdHJ1Y3QgYmNtX25zX3VzYjMgKnVzYjMsIHUzMiB2YWx1ZSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYmNtX25zX3VzYjNfbWlpX21uZ193YWl0X2lkbGUodXNiMyk7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2Vycih1c2IzLT5kZXYsICJDb3VsZG4ndCB3cml0ZSAweCUwOHggdmFsdWVcbiIsIHZhbHVlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl3cml0ZWwodmFsdWUsIHVzYjMtPmNjYl9taWkgKyBCQ01BX0NDQl9NSUlfTU5HX0NNRF9EQVRBKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9uc191c2IzX3BoeV9pbml0X25zX2J4KHN0cnVjdCBiY21fbnNfdXNiMyAqdXNiMykKK3sKKwlpbnQgZXJyOworCisJLyogRW5hYmxlIE1ESU8uIFNldHRpbmcgTURDRElWIGFzIDI2ICAqLworCXdyaXRlbCgweDAwMDAwMDlhLCB1c2IzLT5jY2JfbWlpICsgQkNNQV9DQ0JfTUlJX01OR19DVEwpOworCisJLyogV2FpdCBmb3IgTURJTz8gKi8KKwl1ZGVsYXkoMik7CisKKwkvKiBVU0IzIFBMTCBCbG9jayAqLworCWVyciA9IGJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4N2U4MDAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIEFzc2VydCBBbmFfUGxsc2VxIHN0YXJ0ICovCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTgwNjEwMDApOworCisJLyogQXNzZXJ0IENNTCBEaXZpZGVyIHJhdGlvIHRvIDI2ICovCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTgyYTY0MDApOworCisJLyogQXNzZXJ0aW5nIFBMTCBSZXNldCAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MmVjMDAwKTsKKworCS8qIERlYWFzZXJ0aW5nIFBMTCBSZXNldCAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MmU4MDAwKTsKKworCS8qIFdhaXRpbmcgTUlJIE1ndCBpbnRlcmZhY2UgaWRsZSAqLworCWJjbV9uc191c2IzX21paV9tbmdfd2FpdF9pZGxlKHVzYjMpOworCisJLyogRGVhc3NlcnRpbmcgVVNCMyBzeXN0ZW0gcmVzZXQgKi8KKwl3cml0ZWwoMCwgdXNiMy0+ZG1wICsgQkNNQV9SRVNFVF9DVEwpOworCisJLyogUExMIGZyZXF1ZW5jeSBtb25pdG9yIGVuYWJsZSAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MDY5MDAwKTsKKworCS8qIFBJUEUgQmxvY2sgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODdlODA2MCk7CisKKwkvKiBDTVBNQVggJiBDTVBNSU5USCBzZXR0aW5nICovCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTgwYWYzMGQpOworCisJLyogREVHTElUQ0ggTUlOICYgTUFYIHNldHRpbmcgKi8KKwliY21fbnNfdXNiM19taWlfbW5nX3dyaXRlMzIodXNiMywgMHg1ODBlNjMwMik7CisKKwkvKiBUWFBNRCBibG9jayAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4N2U4MDQwKTsKKworCS8qIEVuYWJsaW5nIFNTQyAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MDYxMDAzKTsKKworCS8qIFdhaXRpbmcgTUlJIE1ndCBpbnRlcmZhY2UgaWRsZSAqLworCWJjbV9uc191c2IzX21paV9tbmdfd2FpdF9pZGxlKHVzYjMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX25zX3VzYjNfcGh5X2luaXRfbnNfYXgoc3RydWN0IGJjbV9uc191c2IzICp1c2IzKQoreworCWludCBlcnI7CisKKwkvKiBFbmFibGUgTURJTy4gU2V0dGluZyBNRENESVYgYXMgMjYgICovCisJd3JpdGVsKDB4MDAwMDAwOWEsIHVzYjMtPmNjYl9taWkgKyBCQ01BX0NDQl9NSUlfTU5HX0NUTCk7CisKKwkvKiBXYWl0IGZvciBNRElPPyAqLworCXVkZWxheSgyKTsKKworCS8qIFBMTDMwIGJsb2NrICovCisJZXJyID0gYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTg3ZTgwMDApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTgyYTY0MDApOworCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTg3ZTgwZTApOworCisJYmNtX25zX3VzYjNfbWlpX21uZ193cml0ZTMyKHVzYjMsIDB4NTgwYTAwOWMpOworCisJLyogRW5hYmxlIFNTQyAqLworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4N2U4MDQwKTsKKworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MGEyMWQzKTsKKworCWJjbV9uc191c2IzX21paV9tbmdfd3JpdGUzMih1c2IzLCAweDU4MDYxMDAzKTsKKworCS8qIFdhaXRpbmcgTUlJIE1ndCBpbnRlcmZhY2UgaWRsZSAqLworCWJjbV9uc191c2IzX21paV9tbmdfd2FpdF9pZGxlKHVzYjMpOworCisJLyogRGVhc3NlcnRpbmcgVVNCMyBzeXN0ZW0gcmVzZXQgKi8KKwl3cml0ZWwoMCwgdXNiMy0+ZG1wICsgQkNNQV9SRVNFVF9DVEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX25zX3VzYjNfcGh5X2luaXQoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCBiY21fbnNfdXNiMyAqdXNiMyA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCWludCBlcnI7CisKKwkvKiBQZXJmb3JtIFVTQjMgc3lzdGVtIHNvZnQgcmVzZXQgKi8KKwl3cml0ZWwoQkNNQV9SRVNFVF9DVExfUkVTRVQsIHVzYjMtPmRtcCArIEJDTUFfUkVTRVRfQ1RMKTsKKworCXN3aXRjaCAodXNiMy0+ZmFtaWx5KSB7CisJY2FzZSBCQ01fTlNfQVg6CisJCWVyciA9IGJjbV9uc191c2IzX3BoeV9pbml0X25zX2F4KHVzYjMpOworCQlicmVhazsKKwljYXNlIEJDTV9OU19CWDoKKwkJZXJyID0gYmNtX25zX3VzYjNfcGh5X2luaXRfbnNfYngodXNiMyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCWVyciA9IC1FTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgb3BzID0geworCS5pbml0CQk9IGJjbV9uc191c2IzX3BoeV9pbml0LAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgYmNtX25zX3VzYjNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOworCXN0cnVjdCBiY21fbnNfdXNiMyAqdXNiMzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7CisKKwl1c2IzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCp1c2IzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2IzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXVzYjMtPmRldiA9IGRldjsKKworCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKGJjbV9uc191c2IzX2lkX3RhYmxlLCBkZXYpOworCWlmICghb2ZfaWQpCisJCXJldHVybiAtRUlOVkFMOworCXVzYjMtPmZhbWlseSA9IChlbnVtIGJjbV9uc19mYW1pbHkpb2ZfaWQtPmRhdGE7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiZG1wIik7CisJdXNiMy0+ZG1wID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHVzYjMtPmRtcCkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIERNUCByZWdzXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodXNiMy0+ZG1wKTsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiY2NiLW1paSIpOworCXVzYjMtPmNjYl9taWkgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIodXNiMy0+Y2NiX21paSkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIENoaXBDb21tb24gQiBNSUkgcmVnc1xuIik7CisJCXJldHVybiBQVFJfRVJSKHVzYjMtPmNjYl9taWkpOworCX0KKworCXVzYjMtPnBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsIE5VTEwsICZvcHMpOworCWlmIChJU19FUlIodXNiMy0+cGh5KSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBjcmVhdGUgUEhZXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodXNiMy0+cGh5KTsKKwl9CisKKwlwaHlfc2V0X2RydmRhdGEodXNiMy0+cGh5LCB1c2IzKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB1c2IzKTsKKworCXBoeV9wcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKGRldiwgb2ZfcGh5X3NpbXBsZV94bGF0ZSk7CisJaWYgKCFJU19FUlIocGh5X3Byb3ZpZGVyKSkKKwkJZGV2X2luZm8oZGV2LCAiUmVnaXN0ZXJlZCBCcm9hZGNvbSBOb3J0aHN0YXIgVVNCIDMuMCBQSFkgZHJpdmVyXG4iKTsKKworCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocGh5X3Byb3ZpZGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmNtX25zX3VzYjNfZHJpdmVyID0geworCS5wcm9iZQkJPSBiY21fbnNfdXNiM19wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJiY21fbnNfdXNiMyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGJjbV9uc191c2IzX2lkX3RhYmxlLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiY21fbnNfdXNiM19kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktYmNtLW5zMi1wY2llLmMgYi9kcml2ZXJzL3BoeS9waHktYmNtLW5zMi1wY2llLmMKaW5kZXggOTUxM2Y3YS4uNGM3ZDExZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWJjbS1uczItcGNpZS5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1iY20tbnMyLXBjaWUuYwpAQCAtMTgsMTEgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CiAKLXN0cnVjdCBuczJfcGNpX3BoeSB7Ci0Jc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2OwotCXN0cnVjdCBwaHkgKnBoeTsKLX07Ci0KICNkZWZpbmUgQkxLX0FERFJfUkVHX09GRlNFVAkweDFmCiAjZGVmaW5lIFBMTF9BRkUxXzEwME1IWl9CTEsJMHgyMTAwCiAjZGVmaW5lIFBMTF9DTEtfQU1QX09GRlNFVAkweDAzCkBAIC0zMCwxNyArMjUsMTcgQEAKIAogc3RhdGljIGludCBuczJfcGNpX3BoeV9pbml0KHN0cnVjdCBwaHkgKnApCiB7Ci0Jc3RydWN0IG5zMl9wY2lfcGh5ICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEocCk7CisJc3RydWN0IG1kaW9fZGV2aWNlICptZGlvZGV2ID0gcGh5X2dldF9kcnZkYXRhKHApOwogCWludCByYzsKIAogCS8qIHNlbGVjdCB0aGUgQUZFIDEwME1IeiBibG9jayBwYWdlICovCi0JcmMgPSBtZGlvYnVzX3dyaXRlKHBoeS0+bWRpb2Rldi0+YnVzLCBwaHktPm1kaW9kZXYtPmFkZHIsCisJcmMgPSBtZGlvYnVzX3dyaXRlKG1kaW9kZXYtPmJ1cywgbWRpb2Rldi0+YWRkciwKIAkJCSAgIEJMS19BRERSX1JFR19PRkZTRVQsIFBMTF9BRkUxXzEwME1IWl9CTEspOwogCWlmIChyYykKIAkJZ290byBlcnI7CiAKIAkvKiBzZXQgdGhlIDEwMCBNSHogcmVmZXJlbmNlIGNsb2NrIGFtcGxpdHVkZSB0byAyLjA1IHYgKi8KLQlyYyA9IG1kaW9idXNfd3JpdGUocGh5LT5tZGlvZGV2LT5idXMsIHBoeS0+bWRpb2Rldi0+YWRkciwKKwlyYyA9IG1kaW9idXNfd3JpdGUobWRpb2Rldi0+YnVzLCBtZGlvZGV2LT5hZGRyLAogCQkJICAgUExMX0NMS19BTVBfT0ZGU0VULCBQTExfQ0xLX0FNUF8yUDA1Vik7CiAJaWYgKHJjKQogCQlnb3RvIGVycjsKQEAgLTQ4LDE5ICs0MywxOSBAQAogCXJldHVybiAwOwogCiBlcnI6Ci0JZGV2X2VycigmcGh5LT5tZGlvZGV2LT5kZXYsICJFcnJvciAlZCB3cml0aW5nIHRvIHBoeVxuIiwgcmMpOworCWRldl9lcnIoJm1kaW9kZXYtPmRldiwgIkVycm9yICVkIHdyaXRpbmcgdG8gcGh5XG4iLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc3RydWN0IHBoeV9vcHMgbnMyX3BjaV9waHlfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIG5zMl9wY2lfcGh5X29wcyA9IHsKIAkuaW5pdCA9IG5zMl9wY2lfcGh5X2luaXQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IG5zMl9wY2lfcGh5X3Byb2JlKHN0cnVjdCBtZGlvX2RldmljZSAqbWRpb2RldikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbWRpb2Rldi0+ZGV2OwogCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnByb3ZpZGVyOwotCXN0cnVjdCBuczJfcGNpX3BoeSAqcDsKIAlzdHJ1Y3QgcGh5ICpwaHk7CiAKIAlwaHkgPSBkZXZtX3BoeV9jcmVhdGUoZGV2LCBkZXYtPm9mX25vZGUsICZuczJfcGNpX3BoeV9vcHMpOwpAQCAtNjksMTYgKzY0LDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIocGh5KTsKIAl9CiAKLQlwID0gZGV2bV9rbWFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBuczJfcGNpX3BoeSksCi0JCQkgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXAtPm1kaW9kZXYgPSBtZGlvZGV2OwotCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHApOwotCi0JcC0+cGh5ID0gcGh5OwotCXBoeV9zZXRfZHJ2ZGF0YShwaHksIHApOworCXBoeV9zZXRfZHJ2ZGF0YShwaHksIG1kaW9kZXYpOwogCiAJcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcigmcGh5LT5kZXYsCiAJCQkJCQkgb2ZfcGh5X3NpbXBsZV94bGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktYnJjbS1zYXRhLmMgYi9kcml2ZXJzL3BoeS9waHktYnJjbS1zYXRhLmMKaW5kZXggMThkNjYyNi4uOGZmYzQ0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWJyY20tc2F0YS5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1icmNtLXNhdGEuYwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAJCXJjID0gLUVOT0RFVjsKIAl9OwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgcGh5X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1jb3JlLmMgYi9kcml2ZXJzL3BoeS9waHktY29yZS5jCmluZGV4IDhlY2E5MDYuLmEyNjhmNGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1jb3JlLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LWNvcmUuYwpAQCAtMzU3LDYgKzM1NywyMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocGh5X3NldF9tb2RlKTsKIAoraW50IHBoeV9yZXNldChzdHJ1Y3QgcGh5ICpwaHkpCit7CisJaW50IHJldDsKKworCWlmICghcGh5IHx8ICFwaHktPm9wcy0+cmVzZXQpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmcGh5LT5tdXRleCk7CisJcmV0ID0gcGh5LT5vcHMtPnJlc2V0KHBoeSk7CisJbXV0ZXhfdW5sb2NrKCZwaHktPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwaHlfcmVzZXQpOworCiAvKioKICAqIF9vZl9waHlfZ2V0KCkgLSBsb29rdXAgYW5kIG9idGFpbiBhIHJlZmVyZW5jZSB0byBhIHBoeSBieSBwaGFuZGxlCiAgKiBAbnA6IGRldmljZV9ub2RlIGZvciB3aGljaCB0byBnZXQgdGhlIHBoeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWRhOHh4LXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LWRhOHh4LXVzYi5jCmluZGV4IGIyZTU5YjYuLjMyYWU3OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1kYTh4eC11c2IuYworKysgYi9kcml2ZXJzL3BoeS9waHktZGE4eHgtdXNiLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogCQlkX3BoeS0+cmVnbWFwID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfY29tcGF0aWJsZSgKIAkJCQkJCQkidGksZGE4MzAtY2ZnY2hpcCIpOwogCWVsc2UKLQkJZF9waHktPnJlZ21hcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BkZXZuYW1lKCJzeXNjb24uMCIpOworCQlkX3BoeS0+cmVnbWFwID0gc3lzY29uX3JlZ21hcF9sb29rdXBfYnlfcGRldm5hbWUoInN5c2NvbiIpOwogCWlmIChJU19FUlIoZF9waHktPnJlZ21hcCkpIHsKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHN5c2NvblxuIik7CiAJCXJldHVybiBQVFJfRVJSKGRfcGh5LT5yZWdtYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWV4eW5vczUtdXNiZHJkLmMgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNS11c2JkcmQuYwppbmRleCAyMDY5NmY1Li4wN2VkNjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zNS11c2JkcmQuYworKysgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNS11c2JkcmQuYwpAQCAtMjQ5LDcgKzI0OSw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50CiBleHlub3M1X3VzYmRyZF9waXBlM19zZXRfcmVmY2xrKHN0cnVjdCBwaHlfdXNiX2luc3RhbmNlICppbnN0KQogewotCXN0YXRpYyB1MzIgcmVnOworCXUzMiByZWc7CiAJc3RydWN0IGV4eW5vczVfdXNiZHJkX3BoeSAqcGh5X2RyZCA9IHRvX3VzYmRyZF9waHkoaW5zdCk7CiAKIAkvKiByZXN0b3JlIGFueSBwcmV2aW91cyByZWZlcmVuY2UgY2xvY2sgc2V0dGluZ3MgKi8KQEAgLTI5NSw3ICsyOTUsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludAogZXh5bm9zNV91c2JkcmRfdXRtaV9zZXRfcmVmY2xrKHN0cnVjdCBwaHlfdXNiX2luc3RhbmNlICppbnN0KQogewotCXN0YXRpYyB1MzIgcmVnOworCXUzMiByZWc7CiAJc3RydWN0IGV4eW5vczVfdXNiZHJkX3BoeSAqcGh5X2RyZCA9IHRvX3VzYmRyZF9waHkoaW5zdCk7CiAKIAkvKiByZXN0b3JlIGFueSBwcmV2aW91cyByZWZlcmVuY2UgY2xvY2sgc2V0dGluZ3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1vbWFwLXVzYjIuYyBiL2RyaXZlcnMvcGh5L3BoeS1vbWFwLXVzYjIuYwppbmRleCBjMTM0OTg5Li5mZTkwOWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktb21hcC11c2IyLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LW9tYXAtdXNiMi5jCkBAIC0xMzMsMTEgKzEzMyw0OSBAQAogCXJldHVybiBvbWFwX3VzYl9waHlfcG93ZXIocGh5LCB0cnVlKTsKIH0KIAorc3RhdGljIGludCBvbWFwX3VzYjJfZGlzYWJsZV9jbG9ja3Moc3RydWN0IG9tYXBfdXNiICpwaHkpCit7CisJY2xrX2Rpc2FibGUocGh5LT53a3VwY2xrKTsKKwlpZiAoIUlTX0VSUihwaHktPm9wdGNsaykpCisJCWNsa19kaXNhYmxlKHBoeS0+b3B0Y2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXBfdXNiMl9lbmFibGVfY2xvY2tzKHN0cnVjdCBvbWFwX3VzYiAqcGh5KQoreworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfZW5hYmxlKHBoeS0+d2t1cGNsayk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihwaHktPmRldiwgIkZhaWxlZCB0byBlbmFibGUgd2t1cGNsayAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnIwOworCX0KKworCWlmICghSVNfRVJSKHBoeS0+b3B0Y2xrKSkgeworCQlyZXQgPSBjbGtfZW5hYmxlKHBoeS0+b3B0Y2xrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocGh5LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIG9wdGNsayAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gZXJyMTsKKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnIxOgorCWNsa19kaXNhYmxlKHBoeS0+d2t1cGNsayk7CisKK2VycjA6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBvbWFwX3VzYl9pbml0KHN0cnVjdCBwaHkgKngpCiB7CiAJc3RydWN0IG9tYXBfdXNiICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoeCk7CiAJdTMyIHZhbDsKIAorCW9tYXBfdXNiMl9lbmFibGVfY2xvY2tzKHBoeSk7CisKIAlpZiAocGh5LT5mbGFncyAmIE9NQVBfVVNCMl9DQUxJQlJBVEVfRkFMU0VfRElTQ09OTkVDVCkgewogCQkvKgogCQkgKgpAQCAtMTU1LDggKzE5MywxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9tYXBfdXNiX2V4aXQoc3RydWN0IHBoeSAqeCkKK3sKKwlzdHJ1Y3Qgb21hcF91c2IgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YSh4KTsKKworCXJldHVybiBvbWFwX3VzYjJfZGlzYWJsZV9jbG9ja3MocGh5KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIG9wcyA9IHsKIAkuaW5pdAkJPSBvbWFwX3VzYl9pbml0LAorCS5leGl0CQk9IG9tYXBfdXNiX2V4aXQsCiAJLnBvd2VyX29uCT0gb21hcF91c2JfcG93ZXJfb24sCiAJLnBvd2VyX29mZgk9IG9tYXBfdXNiX3Bvd2VyX29mZiwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCkBAIC0zNzYsNjUgKzQyMiwxMSBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCi0KLXN0YXRpYyBpbnQgb21hcF91c2IyX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwotCXN0cnVjdCBvbWFwX3VzYgkqcGh5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQljbGtfZGlzYWJsZShwaHktPndrdXBjbGspOwotCWlmICghSVNfRVJSKHBoeS0+b3B0Y2xrKSkKLQkJY2xrX2Rpc2FibGUocGh5LT5vcHRjbGspOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcF91c2IyX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7Ci0Jc3RydWN0IG9tYXBfdXNiCSpwaHkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY2xrX2VuYWJsZShwaHktPndrdXBjbGspOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocGh5LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHdrdXBjbGsgJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyMDsKLQl9Ci0KLQlpZiAoIUlTX0VSUihwaHktPm9wdGNsaykpIHsKLQkJcmV0ID0gY2xrX2VuYWJsZShwaHktPm9wdGNsayk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBvcHRjbGsgJWRcbiIsIHJldCk7Ci0JCQlnb3RvIGVycjE7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyMToKLQljbGtfZGlzYWJsZShwaHktPndrdXBjbGspOwotCi1lcnIwOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBvbWFwX3VzYjJfcG1fb3BzID0gewotCVNFVF9SVU5USU1FX1BNX09QUyhvbWFwX3VzYjJfcnVudGltZV9zdXNwZW5kLCBvbWFwX3VzYjJfcnVudGltZV9yZXN1bWUsCi0JCU5VTEwpCi19OwotCi0jZGVmaW5lIERFVl9QTV9PUFMgICAgICgmb21hcF91c2IyX3BtX29wcykKLSNlbHNlCi0jZGVmaW5lIERFVl9QTV9PUFMgICAgIE5VTEwKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX3VzYjJfZHJpdmVyID0gewogCS5wcm9iZQkJPSBvbWFwX3VzYjJfcHJvYmUsCiAJLnJlbW92ZQkJPSBvbWFwX3VzYjJfcmVtb3ZlLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJvbWFwLXVzYjIiLAotCQkucG0JPSBERVZfUE1fT1BTLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvbWFwX3VzYjJfaWRfdGFibGUsCiAJfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktcWNvbS11ZnMuYyBiL2RyaXZlcnMvcGh5L3BoeS1xY29tLXVmcy5jCmluZGV4IDEwN2NiNTcuLjE4YTViNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1xY29tLXVmcy5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1xY29tLXVmcy5jCkBAIC0yODMsMTAgKzI4Myw4IEBACiAJCQllcnIgPSAwOwogCQl9CiAJCXNucHJpbnRmKHByb3BfbmFtZSwgTUFYX1BST1BfTkFNRSwgIiVzLWFsd2F5cy1vbiIsIG5hbWUpOwotCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KGRldi0+b2Zfbm9kZSwgcHJvcF9uYW1lLCBOVUxMKSkKLQkJCXZyZWctPmlzX2Fsd2F5c19vbiA9IHRydWU7Ci0JCWVsc2UKLQkJCXZyZWctPmlzX2Fsd2F5c19vbiA9IGZhbHNlOworCQl2cmVnLT5pc19hbHdheXNfb24gPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LT5vZl9ub2RlLAorCQkJCQkJCSAgIHByb3BfbmFtZSk7CiAJfQogCiAJaWYgKCFzdHJjbXAobmFtZSwgInZkZGEtcGxsIikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1yY2FyLWdlbjMtdXNiMi5jIGIvZHJpdmVycy9waHkvcGh5LXJjYXItZ2VuMy11c2IyLmMKaW5kZXggMzExNTZjOS4uM2Q5N2VhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LXJjYXItZ2VuMy11c2IyLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LXJjYXItZ2VuMy11c2IyLmMKQEAgLTI4MCw2ICsyODAsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByY2FyX2dlbjNfcGh5X3VzYjJfbWF0Y2hfdGFibGVbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsdXNiMi1waHktcjhhNzc5NSIgfSwKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMsdXNiMi1waHktcjhhNzc5NiIgfSwKIAl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscmNhci1nZW4zLXVzYjItcGh5IiB9LAogCXsgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC1pbm5vLXVzYjIuYyBiL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC1pbm5vLXVzYjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzIwMzEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLWlubm8tdXNiMi5jCkBAIC0wLDAgKzEsNzA3IEBACisvKgorICogUm9ja2NoaXAgVVNCMi4wIFBIWSB3aXRoIElubm9zaWxpY29uIElQIGJsb2NrIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBGdXpob3UgUm9ja2NoaXAgRWxlY3Ryb25pY3MgQ28uLCBMdGQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorCisjZGVmaW5lIEJJVF9XUklURUFCTEVfU0hJRlQJMTYKKyNkZWZpbmUgU0NIRURVTEVfREVMQVkJKDYwICogSFopCisKK2VudW0gcm9ja2NoaXBfdXNiMnBoeV9wb3J0X2lkIHsKKwlVU0IyUEhZX1BPUlRfT1RHLAorCVVTQjJQSFlfUE9SVF9IT1NULAorCVVTQjJQSFlfTlVNX1BPUlRTLAorfTsKKworZW51bSByb2NrY2hpcF91c2IycGh5X2hvc3Rfc3RhdGUgeworCVBIWV9TVEFURV9IU19PTkxJTkUJPSAwLAorCVBIWV9TVEFURV9ESVNDT05ORUNUCT0gMSwKKwlQSFlfU1RBVEVfQ09OTkVDVAk9IDIsCisJUEhZX1NUQVRFX0ZTX0xTX09OTElORQk9IDQsCit9OworCitzdHJ1Y3QgdXNiMnBoeV9yZWcgeworCXVuc2lnbmVkIGludAlvZmZzZXQ7CisJdW5zaWduZWQgaW50CWJpdGVuZDsKKwl1bnNpZ25lZCBpbnQJYml0c3RhcnQ7CisJdW5zaWduZWQgaW50CWRpc2FibGU7CisJdW5zaWduZWQgaW50CWVuYWJsZTsKK307CisKKy8qKgorICogc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydF9jZmc6IHVzYi1waHkgcG9ydCBjb25maWd1cmF0aW9uLgorICogQHBoeV9zdXM6IHBoeSBzdXNwZW5kIHJlZ2lzdGVyLgorICogQGxzX2RldF9lbjogbGluZXN0YXRlIGRldGVjdGlvbiBlbmFibGUgcmVnaXN0ZXIuCisgKiBAbHNfZGV0X3N0OiBsaW5lc3RhdGUgZGV0ZWN0aW9uIHN0YXRlIHJlZ2lzdGVyLgorICogQGxzX2RldF9jbHI6IGxpbmVzdGF0ZSBkZXRlY3Rpb24gY2xlYXIgcmVnaXN0ZXIuCisgKiBAdXRtaV9sczogdXRtaSBsaW5lc3RhdGUgc3RhdGUgcmVnaXN0ZXIuCisgKiBAdXRtaV9oc3RkZXQ6IHV0bWkgaG9zdCBkaXNjb25uZWN0IHJlZ2lzdGVyLgorICovCitzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0X2NmZyB7CisJc3RydWN0IHVzYjJwaHlfcmVnCXBoeV9zdXM7CisJc3RydWN0IHVzYjJwaHlfcmVnCWxzX2RldF9lbjsKKwlzdHJ1Y3QgdXNiMnBoeV9yZWcJbHNfZGV0X3N0OworCXN0cnVjdCB1c2IycGh5X3JlZwlsc19kZXRfY2xyOworCXN0cnVjdCB1c2IycGh5X3JlZwl1dG1pX2xzOworCXN0cnVjdCB1c2IycGh5X3JlZwl1dG1pX2hzdGRldDsKK307CisKKy8qKgorICogc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfY2ZnOiB1c2ItcGh5IGNvbmZpZ3VyYXRpb24uCisgKiBAcmVnOiB0aGUgYWRkcmVzcyBvZmZzZXQgb2YgZ3JmIGZvciB1c2ItcGh5IGNvbmZpZy4KKyAqIEBudW1fcG9ydHM6IHNwZWNpZnkgaG93IG1hbnkgcG9ydHMgdGhhdCB0aGUgcGh5IGhhcy4KKyAqIEBjbGtvdXRfY3RsOiBrZWVwIG9uL3R1cm4gb2ZmIG91dHB1dCBjbGsgb2YgcGh5LgorICovCitzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9jZmcgeworCXVuc2lnbmVkIGludAlyZWc7CisJdW5zaWduZWQgaW50CW51bV9wb3J0czsKKwlzdHJ1Y3QgdXNiMnBoeV9yZWcJY2xrb3V0X2N0bDsKKwljb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0X2NmZwlwb3J0X2NmZ3NbVVNCMlBIWV9OVU1fUE9SVFNdOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0OiB1c2ItcGh5IHBvcnQgZGF0YS4KKyAqIEBwb3J0X2lkOiBmbGFnIGZvciBvdGcgcG9ydCBvciBob3N0IHBvcnQuCisgKiBAc3VzcGVuZGVkOiBwaHkgc3VzcGVuZGVkIGZsYWcuCisgKiBAbHNfaXJxOiBJUlEgbnVtYmVyIGFzc2lnbmVkIGZvciBsaW5lc3RhdGUgZGV0ZWN0aW9uLgorICogQG11dGV4OiBmb3IgcmVnaXN0ZXIgdXBkYXRpbmcgaW4gc21fd29yay4KKyAqIEBzbV93b3JrOiBPVEcgc3RhdGUgbWFjaGluZSB3b3JrLgorICogQHBoeV9jZmc6IHBvcnQgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiwgYXNzaWduZWQgYnkgZHJpdmVyIGRhdGEuCisgKi8KK3N0cnVjdCByb2NrY2hpcF91c2IycGh5X3BvcnQgeworCXN0cnVjdCBwaHkJKnBoeTsKKwl1bnNpZ25lZCBpbnQJcG9ydF9pZDsKKwlib29sCQlzdXNwZW5kZWQ7CisJaW50CQlsc19pcnE7CisJc3RydWN0IG11dGV4CW11dGV4OworCXN0cnVjdAkJZGVsYXllZF93b3JrIHNtX3dvcms7CisJY29uc3Qgc3RydWN0CXJvY2tjaGlwX3VzYjJwaHlfcG9ydF9jZmcgKnBvcnRfY2ZnOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeTogdXNiMi4wIHBoeSBkcml2ZXIgZGF0YS4KKyAqIEBncmY6IEdlbmVyYWwgUmVnaXN0ZXIgRmlsZXMgcmVnbWFwLgorICogQGNsazogY2xvY2sgc3RydWN0IG9mIHBoeSBpbnB1dCBjbGsuCisgKiBAY2xrNDgwbTogY2xvY2sgc3RydWN0IG9mIHBoeSBvdXRwdXQgY2xrLgorICogQGNsa19odzogY2xvY2sgc3RydWN0IG9mIHBoeSBvdXRwdXQgY2xrIG1hbmFnZW1lbnQuCisgKiBAcGh5X2NmZzogcGh5IHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24sIGFzc2lnbmVkIGJ5IGRyaXZlciBkYXRhLgorICogQHBvcnRzOiBwaHkgcG9ydCBpbnN0YW5jZS4KKyAqLworc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgeworCXN0cnVjdCBkZXZpY2UJKmRldjsKKwlzdHJ1Y3QgcmVnbWFwCSpncmY7CisJc3RydWN0IGNsawkqY2xrOworCXN0cnVjdCBjbGsJKmNsazQ4MG07CisJc3RydWN0IGNsa19odwljbGs0ODBtX2h3OworCWNvbnN0IHN0cnVjdCByb2NrY2hpcF91c2IycGh5X2NmZwkqcGh5X2NmZzsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0CXBvcnRzW1VTQjJQSFlfTlVNX1BPUlRTXTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb3BlcnR5X2VuYWJsZShzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSwKKwkJCQkgIGNvbnN0IHN0cnVjdCB1c2IycGh5X3JlZyAqcmVnLCBib29sIGVuKQoreworCXVuc2lnbmVkIGludCB2YWwsIG1hc2ssIHRtcDsKKworCXRtcCA9IGVuID8gcmVnLT5lbmFibGUgOiByZWctPmRpc2FibGU7CisJbWFzayA9IEdFTk1BU0socmVnLT5iaXRlbmQsIHJlZy0+Yml0c3RhcnQpOworCXZhbCA9ICh0bXAgPDwgcmVnLT5iaXRzdGFydCkgfCAobWFzayA8PCBCSVRfV1JJVEVBQkxFX1NISUZUKTsKKworCXJldHVybiByZWdtYXBfd3JpdGUocnBoeS0+Z3JmLCByZWctPm9mZnNldCwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHByb3BlcnR5X2VuYWJsZWQoc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHksCisJCQkJICAgIGNvbnN0IHN0cnVjdCB1c2IycGh5X3JlZyAqcmVnKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHRtcCwgb3JpZzsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IEdFTk1BU0socmVnLT5iaXRlbmQsIHJlZy0+Yml0c3RhcnQpOworCisJcmV0ID0gcmVnbWFwX3JlYWQocnBoeS0+Z3JmLCByZWctPm9mZnNldCwgJm9yaWcpOworCWlmIChyZXQpCisJCXJldHVybiBmYWxzZTsKKworCXRtcCA9IChvcmlnICYgbWFzaykgPj4gcmVnLT5iaXRzdGFydDsKKwlyZXR1cm4gdG1wID09IHJlZy0+ZW5hYmxlOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9lbmFibGUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkgPQorCQljb250YWluZXJfb2YoaHcsIHN0cnVjdCByb2NrY2hpcF91c2IycGh5LCBjbGs0ODBtX2h3KTsKKwlpbnQgcmV0OworCisJLyogdHVybiBvbiA0ODBtIGNsayBvdXRwdXQgaWYgaXQgaXMgb2ZmICovCisJaWYgKCFwcm9wZXJ0eV9lbmFibGVkKHJwaHksICZycGh5LT5waHlfY2ZnLT5jbGtvdXRfY3RsKSkgeworCQlyZXQgPSBwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwaHktPnBoeV9jZmctPmNsa291dF9jdGwsIHRydWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKiB3YWl0dGluZyBmb3IgdGhlIGNsayBiZWNvbWUgc3RhYmxlICovCisJCW1kZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcm9ja2NoaXBfdXNiMnBoeV9jbGs0ODBtX2Rpc2FibGUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkgPQorCQljb250YWluZXJfb2YoaHcsIHN0cnVjdCByb2NrY2hpcF91c2IycGh5LCBjbGs0ODBtX2h3KTsKKworCS8qIHR1cm4gb2ZmIDQ4MG0gY2xrIG91dHB1dCAqLworCXByb3BlcnR5X2VuYWJsZShycGh5LCAmcnBoeS0+cGh5X2NmZy0+Y2xrb3V0X2N0bCwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9lbmFibGVkKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5ICpycGh5ID0KKwkJY29udGFpbmVyX29mKGh3LCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSwgY2xrNDgwbV9odyk7CisKKwlyZXR1cm4gcHJvcGVydHlfZW5hYmxlZChycGh5LCAmcnBoeS0+cGh5X2NmZy0+Y2xrb3V0X2N0bCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCityb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fcmVjYWxjX3JhdGUoc3RydWN0IGNsa19odyAqaHcsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlKQoreworCXJldHVybiA0ODAwMDAwMDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2xrX29wcyByb2NrY2hpcF91c2IycGh5X2Nsa291dF9vcHMgPSB7CisJLmVuYWJsZSA9IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9lbmFibGUsCisJLmRpc2FibGUgPSByb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fZGlzYWJsZSwKKwkuaXNfZW5hYmxlZCA9IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9lbmFibGVkLAorCS5yZWNhbGNfcmF0ZSA9IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9yZWNhbGNfcmF0ZSwKK307CisKK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV91bnJlZ2lzdGVyKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkgPSBkYXRhOworCisJb2ZfY2xrX2RlbF9wcm92aWRlcihycGh5LT5kZXYtPm9mX25vZGUpOworCWNsa191bnJlZ2lzdGVyKHJwaHktPmNsazQ4MG0pOworfQorCitzdGF0aWMgaW50Cityb2NrY2hpcF91c2IycGh5X2NsazQ4MG1fcmVnaXN0ZXIoc3RydWN0IHJvY2tjaGlwX3VzYjJwaHkgKnJwaHkpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gcnBoeS0+ZGV2LT5vZl9ub2RlOworCXN0cnVjdCBjbGtfaW5pdF9kYXRhIGluaXQ7CisJY29uc3QgY2hhciAqY2xrX25hbWU7CisJaW50IHJldDsKKworCWluaXQuZmxhZ3MgPSAwOworCWluaXQubmFtZSA9ICJjbGtfdXNicGh5XzQ4MG0iOworCWluaXQub3BzID0gJnJvY2tjaGlwX3VzYjJwaHlfY2xrb3V0X29wczsKKworCS8qIG9wdGlvbmFsIG92ZXJyaWRlIG9mIHRoZSBjbG9ja25hbWUgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhub2RlLCAiY2xvY2stb3V0cHV0LW5hbWVzIiwgJmluaXQubmFtZSk7CisKKwlpZiAocnBoeS0+Y2xrKSB7CisJCWNsa19uYW1lID0gX19jbGtfZ2V0X25hbWUocnBoeS0+Y2xrKTsKKwkJaW5pdC5wYXJlbnRfbmFtZXMgPSAmY2xrX25hbWU7CisJCWluaXQubnVtX3BhcmVudHMgPSAxOworCX0gZWxzZSB7CisJCWluaXQucGFyZW50X25hbWVzID0gTlVMTDsKKwkJaW5pdC5udW1fcGFyZW50cyA9IDA7CisJfQorCisJcnBoeS0+Y2xrNDgwbV9ody5pbml0ID0gJmluaXQ7CisKKwkvKiByZWdpc3RlciB0aGUgY2xvY2sgKi8KKwlycGh5LT5jbGs0ODBtID0gY2xrX3JlZ2lzdGVyKHJwaHktPmRldiwgJnJwaHktPmNsazQ4MG1faHcpOworCWlmIChJU19FUlIocnBoeS0+Y2xrNDgwbSkpIHsKKwkJcmV0ID0gUFRSX0VSUihycGh5LT5jbGs0ODBtKTsKKwkJZ290byBlcnJfcmV0OworCX0KKworCXJldCA9IG9mX2Nsa19hZGRfcHJvdmlkZXIobm9kZSwgb2ZfY2xrX3NyY19zaW1wbGVfZ2V0LCBycGh5LT5jbGs0ODBtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfY2xrX3Byb3ZpZGVyOworCisJcmV0ID0gZGV2bV9hZGRfYWN0aW9uKHJwaHktPmRldiwgcm9ja2NoaXBfdXNiMnBoeV9jbGs0ODBtX3VucmVnaXN0ZXIsCisJCQkgICAgICBycGh5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfdW5yZWdfYWN0aW9uOworCisJcmV0dXJuIDA7CisKK2Vycl91bnJlZ19hY3Rpb246CisJb2ZfY2xrX2RlbF9wcm92aWRlcihub2RlKTsKK2Vycl9jbGtfcHJvdmlkZXI6CisJY2xrX3VucmVnaXN0ZXIocnBoeS0+Y2xrNDgwbSk7CitlcnJfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdXNiMnBoeV9pbml0KHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0ICpycG9ydCA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5ICpycGh5ID0gZGV2X2dldF9kcnZkYXRhKHBoeS0+ZGV2LnBhcmVudCk7CisJaW50IHJldDsKKworCWlmIChycG9ydC0+cG9ydF9pZCA9PSBVU0IyUEhZX1BPUlRfSE9TVCkgeworCQkvKiBjbGVhciBsaW5lc3RhdGUgYW5kIGVuYWJsZSBsaW5lc3RhdGUgZGV0ZWN0IGlycSAqLworCQltdXRleF9sb2NrKCZycG9ydC0+bXV0ZXgpOworCisJCXJldCA9IHByb3BlcnR5X2VuYWJsZShycGh5LCAmcnBvcnQtPnBvcnRfY2ZnLT5sc19kZXRfY2xyLCB0cnVlKTsKKwkJaWYgKHJldCkgeworCQkJbXV0ZXhfdW5sb2NrKCZycG9ydC0+bXV0ZXgpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IHByb3BlcnR5X2VuYWJsZShycGh5LCAmcnBvcnQtPnBvcnRfY2ZnLT5sc19kZXRfZW4sIHRydWUpOworCQlpZiAocmV0KSB7CisJCQltdXRleF91bmxvY2soJnJwb3J0LT5tdXRleCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJbXV0ZXhfdW5sb2NrKCZycG9ydC0+bXV0ZXgpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJwb3J0LT5zbV93b3JrLCBTQ0hFRFVMRV9ERUxBWSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdXNiMnBoeV9wb3dlcl9vbihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCAqcnBvcnQgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSA9IGRldl9nZXRfZHJ2ZGF0YShwaHktPmRldi5wYXJlbnQpOworCWludCByZXQ7CisKKwlkZXZfZGJnKCZycG9ydC0+cGh5LT5kZXYsICJwb3J0IHBvd2VyIG9uXG4iKTsKKworCWlmICghcnBvcnQtPnN1c3BlbmRlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocnBoeS0+Y2xrNDgwbSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHByb3BlcnR5X2VuYWJsZShycGh5LCAmcnBvcnQtPnBvcnRfY2ZnLT5waHlfc3VzLCBmYWxzZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJwb3J0LT5zdXNwZW5kZWQgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IycGh5X3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCAqcnBvcnQgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSA9IGRldl9nZXRfZHJ2ZGF0YShwaHktPmRldi5wYXJlbnQpOworCWludCByZXQ7CisKKwlkZXZfZGJnKCZycG9ydC0+cGh5LT5kZXYsICJwb3J0IHBvd2VyIG9mZlxuIik7CisKKwlpZiAocnBvcnQtPnN1c3BlbmRlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwb3J0LT5wb3J0X2NmZy0+cGh5X3N1cywgdHJ1ZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJwb3J0LT5zdXNwZW5kZWQgPSB0cnVlOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShycGh5LT5jbGs0ODBtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3VzYjJwaHlfZXhpdChzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCAqcnBvcnQgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKworCWlmIChycG9ydC0+cG9ydF9pZCA9PSBVU0IyUEhZX1BPUlRfSE9TVCkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZycG9ydC0+c21fd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwaHlfb3BzIHJvY2tjaGlwX3VzYjJwaHlfb3BzID0geworCS5pbml0CQk9IHJvY2tjaGlwX3VzYjJwaHlfaW5pdCwKKwkuZXhpdAkJPSByb2NrY2hpcF91c2IycGh5X2V4aXQsCisJLnBvd2VyX29uCT0gcm9ja2NoaXBfdXNiMnBoeV9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmCT0gcm9ja2NoaXBfdXNiMnBoeV9wb3dlcl9vZmYsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworLyoKKyAqIFRoZSBmdW5jdGlvbiBtYW5hZ2UgaG9zdC1waHkgcG9ydCBzdGF0ZSBhbmQgc3VzcGVuZC9yZXN1bWUgcGh5IHBvcnQKKyAqIHRvIHNhdmUgcG93ZXIuCisgKgorICogd2UgcmVseSBvbiB1dG1pX2xpbmVzdGF0ZSBhbmQgdXRtaV9ob3N0ZGlzY29ubmVjdCB0byBpZGVudGlmeSB3aGV0aGVyCisgKiBkZXZpY2VzIGlzIGRpc2Nvbm5lY3Qgb3Igbm90LiBCZXNpZGVzLCB3ZSBkbyBub3QgbmVlZCBjYXJlIGl0IGlzIEZTL0xTCisgKiBkaXNjb25uZWN0ZWQgb3IgSFMgZGlzY29ubmVjdGVkLCBhY3R1YWxseSwgd2UganVzdCBvbmx5IG5lZWQgZ2V0IHRoZQorICogZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCBhdCBsYXN0IHRocm91Z2ggcmVhcm0gdGhlIGRlbGF5ZWQgd29yaywKKyAqIHRvIHN1c3BlbmQgdGhlIHBoeSBwb3J0IGluIF9QSFlfU1RBVEVfRElTQ09OTkVDVF8gY2FzZS4KKyAqCisgKiBOT1RFOiBJdCBtYXkgaW52b2tlICpwaHlfcG93cl9vZmYgb3IgKnBoeV9wb3dlcl9vbiB3aGljaCB3aWxsIGludm9rZQorICogc29tZSBjbGsgcmVsYXRlZCBBUElzLCBzbyBkbyBub3QgaW52b2tlIGl0IGZyb20gaW50ZXJydXB0IGNvbnRleHQgZGlyZWN0bHkuCisgKi8KK3N0YXRpYyB2b2lkIHJvY2tjaGlwX3VzYjJwaHlfc21fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCAqcnBvcnQgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfcG9ydCwgc21fd29yay53b3JrKTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSA9IGRldl9nZXRfZHJ2ZGF0YShycG9ydC0+cGh5LT5kZXYucGFyZW50KTsKKwl1bnNpZ25lZCBpbnQgc2ggPSBycG9ydC0+cG9ydF9jZmctPnV0bWlfaHN0ZGV0LmJpdGVuZCAtCisJCQkgIHJwb3J0LT5wb3J0X2NmZy0+dXRtaV9oc3RkZXQuYml0c3RhcnQgKyAxOworCXVuc2lnbmVkIGludCB1bCwgdWhkLCBzdGF0ZTsKKwl1bnNpZ25lZCBpbnQgdWxfbWFzaywgdWhkX21hc2s7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnJwb3J0LT5tdXRleCk7CisKKwlyZXQgPSByZWdtYXBfcmVhZChycGh5LT5ncmYsIHJwb3J0LT5wb3J0X2NmZy0+dXRtaV9scy5vZmZzZXQsICZ1bCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gbmV4dF9zY2hlZHVsZTsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJwaHktPmdyZiwgcnBvcnQtPnBvcnRfY2ZnLT51dG1pX2hzdGRldC5vZmZzZXQsCisJCQkgICZ1aGQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG5leHRfc2NoZWR1bGU7CisKKwl1aGRfbWFzayA9IEdFTk1BU0socnBvcnQtPnBvcnRfY2ZnLT51dG1pX2hzdGRldC5iaXRlbmQsCisJCQkgICBycG9ydC0+cG9ydF9jZmctPnV0bWlfaHN0ZGV0LmJpdHN0YXJ0KTsKKwl1bF9tYXNrID0gR0VOTUFTSyhycG9ydC0+cG9ydF9jZmctPnV0bWlfbHMuYml0ZW5kLAorCQkJICBycG9ydC0+cG9ydF9jZmctPnV0bWlfbHMuYml0c3RhcnQpOworCisJLyogc3RpdGNoIG9uIHV0bWlfbHMgYW5kIHV0bWlfaHN0ZGV0IGFzIHBoeSBzdGF0ZSAqLworCXN0YXRlID0gKCh1aGQgJiB1aGRfbWFzaykgPj4gcnBvcnQtPnBvcnRfY2ZnLT51dG1pX2hzdGRldC5iaXRzdGFydCkgfAorCQkoKCh1bCAmIHVsX21hc2spID4+IHJwb3J0LT5wb3J0X2NmZy0+dXRtaV9scy5iaXRzdGFydCkgPDwgc2gpOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgUEhZX1NUQVRFX0hTX09OTElORToKKwkJZGV2X2RiZygmcnBvcnQtPnBoeS0+ZGV2LCAiSFMgb25saW5lXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBQSFlfU1RBVEVfRlNfTFNfT05MSU5FOgorCQkvKgorCQkgKiBGb3IgRlMvTFMgZGV2aWNlLCB0aGUgb25saW5lIHN0YXRlIHNoYXJlIHdpdGggY29ubmVjdCBzdGF0ZQorCQkgKiBmcm9tIHV0bWlfbHMgYW5kIHV0bWlfaHN0ZGV0IHJlZ2lzdGVyLCBzbyB3ZSBkaXN0aW5ndWlzaAorCQkgKiB0aGVtIHZpYSBzdXNwZW5kZWQgZmxhZy4KKwkJICoKKwkJICogUGx1cywgdGhlcmUgYXJlIHR3byBjYXNlcywgb25lIGlzIEQtIExpbmUgcHVsbC11cCwgYW5kIEQrCisJCSAqIGxpbmUgcHVsbC1kb3duLCB0aGUgc3RhdGUgaXMgNDsgYW5vdGhlciBpcyBEKyBsaW5lIHB1bGwtdXAsCisJCSAqIGFuZCBELSBsaW5lIHB1bGwtZG93biwgdGhlIHN0YXRlIGlzIDIuCisJCSAqLworCQlpZiAoIXJwb3J0LT5zdXNwZW5kZWQpIHsKKwkJCS8qIEQtIGxpbmUgcHVsbC11cCwgRCsgbGluZSBwdWxsLWRvd24gKi8KKwkJCWRldl9kYmcoJnJwb3J0LT5waHktPmRldiwgIkZTL0xTIG9ubGluZVxuIik7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFBIWV9TVEFURV9DT05ORUNUOgorCQlpZiAocnBvcnQtPnN1c3BlbmRlZCkgeworCQkJZGV2X2RiZygmcnBvcnQtPnBoeS0+ZGV2LCAiQ29ubmVjdGVkXG4iKTsKKwkJCXJvY2tjaGlwX3VzYjJwaHlfcG93ZXJfb24ocnBvcnQtPnBoeSk7CisJCQlycG9ydC0+c3VzcGVuZGVkID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQkvKiBEKyBsaW5lIHB1bGwtdXAsIEQtIGxpbmUgcHVsbC1kb3duICovCisJCQlkZXZfZGJnKCZycG9ydC0+cGh5LT5kZXYsICJGUy9MUyBvbmxpbmVcbiIpOworCQl9CisJCWJyZWFrOworCWNhc2UgUEhZX1NUQVRFX0RJU0NPTk5FQ1Q6CisJCWlmICghcnBvcnQtPnN1c3BlbmRlZCkgeworCQkJZGV2X2RiZygmcnBvcnQtPnBoeS0+ZGV2LCAiRGlzY29ubmVjdGVkXG4iKTsKKwkJCXJvY2tjaGlwX3VzYjJwaHlfcG93ZXJfb2ZmKHJwb3J0LT5waHkpOworCQkJcnBvcnQtPnN1c3BlbmRlZCA9IHRydWU7CisJCX0KKworCQkvKgorCQkgKiBhY3RpdmF0ZSB0aGUgbGluZXN0YXRlIGRldGVjdGlvbiB0byBnZXQgdGhlIG5leHQgZGV2aWNlCisJCSAqIHBsdWctaW4gaXJxLgorCQkgKi8KKwkJcHJvcGVydHlfZW5hYmxlKHJwaHksICZycG9ydC0+cG9ydF9jZmctPmxzX2RldF9jbHIsIHRydWUpOworCQlwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwb3J0LT5wb3J0X2NmZy0+bHNfZGV0X2VuLCB0cnVlKTsKKworCQkvKgorCQkgKiB3ZSBkb24ndCBuZWVkIHRvIHJlYXJtIHRoZSBkZWxheWVkIHdvcmsgd2hlbiB0aGUgcGh5IHBvcnQKKwkJICogaXMgc3VzcGVuZGVkLgorCQkgKi8KKwkJbXV0ZXhfdW5sb2NrKCZycG9ydC0+bXV0ZXgpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJZGV2X2RiZygmcnBvcnQtPnBoeS0+ZGV2LCAidW5rbm93biBwaHkgc3RhdGVcbiIpOworCQlicmVhazsKKwl9CisKK25leHRfc2NoZWR1bGU6CisJbXV0ZXhfdW5sb2NrKCZycG9ydC0+bXV0ZXgpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcnBvcnQtPnNtX3dvcmssIFNDSEVEVUxFX0RFTEFZKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHJvY2tjaGlwX3VzYjJwaHlfbGluZXN0YXRlX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCByb2NrY2hpcF91c2IycGh5X3BvcnQgKnJwb3J0ID0gZGF0YTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeSA9IGRldl9nZXRfZHJ2ZGF0YShycG9ydC0+cGh5LT5kZXYucGFyZW50KTsKKworCWlmICghcHJvcGVydHlfZW5hYmxlZChycGh5LCAmcnBvcnQtPnBvcnRfY2ZnLT5sc19kZXRfc3QpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwltdXRleF9sb2NrKCZycG9ydC0+bXV0ZXgpOworCisJLyogZGlzYWJsZSBsaW5lc3RhdGUgZGV0ZWN0IGlycSBhbmQgY2xlYXIgaXRzIHN0YXR1cyAqLworCXByb3BlcnR5X2VuYWJsZShycGh5LCAmcnBvcnQtPnBvcnRfY2ZnLT5sc19kZXRfZW4sIGZhbHNlKTsKKwlwcm9wZXJ0eV9lbmFibGUocnBoeSwgJnJwb3J0LT5wb3J0X2NmZy0+bHNfZGV0X2NsciwgdHJ1ZSk7CisKKwltdXRleF91bmxvY2soJnJwb3J0LT5tdXRleCk7CisKKwkvKgorCSAqIEluIHRoaXMgY2FzZSBmb3IgaG9zdCBwaHkgcG9ydCwgYSBuZXcgZGV2aWNlIGlzIHBsdWdnZWQgaW4sCisJICogbWVhbndoaWxlLCBpZiB0aGUgcGh5IHBvcnQgaXMgc3VzcGVuZGVkLCB3ZSBuZWVkIHJlYXJtIHRoZSB3b3JrIHRvCisJICogcmVzdW1lIGl0IGFuZCBtYW5nZSBpdHMgc3RhdGVzOyBvdGhlcndpc2UsIHdlIGRvIG5vdGhpbmcgYWJvdXQgdGhhdC4KKwkgKi8KKwlpZiAocnBvcnQtPnN1c3BlbmRlZCAmJiBycG9ydC0+cG9ydF9pZCA9PSBVU0IyUEhZX1BPUlRfSE9TVCkKKwkJcm9ja2NoaXBfdXNiMnBoeV9zbV93b3JrKCZycG9ydC0+c21fd29yay53b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IycGh5X2hvc3RfcG9ydF9pbml0KHN0cnVjdCByb2NrY2hpcF91c2IycGh5ICpycGh5LAorCQkJCQkgICBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0ICpycG9ydCwKKwkJCQkJICAgc3RydWN0IGRldmljZV9ub2RlICpjaGlsZF9ucCkKK3sKKwlpbnQgcmV0OworCisJcnBvcnQtPnBvcnRfaWQgPSBVU0IyUEhZX1BPUlRfSE9TVDsKKwlycG9ydC0+cG9ydF9jZmcgPSAmcnBoeS0+cGh5X2NmZy0+cG9ydF9jZmdzW1VTQjJQSFlfUE9SVF9IT1NUXTsKKwlycG9ydC0+c3VzcGVuZGVkID0gdHJ1ZTsKKworCW11dGV4X2luaXQoJnJwb3J0LT5tdXRleCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJnJwb3J0LT5zbV93b3JrLCByb2NrY2hpcF91c2IycGh5X3NtX3dvcmspOworCisJcnBvcnQtPmxzX2lycSA9IG9mX2lycV9nZXRfYnluYW1lKGNoaWxkX25wLCAibGluZXN0YXRlIik7CisJaWYgKHJwb3J0LT5sc19pcnEgPCAwKSB7CisJCWRldl9lcnIocnBoeS0+ZGV2LCAibm8gbGluZXN0YXRlIGlycSBwcm92aWRlZFxuIik7CisJCXJldHVybiBycG9ydC0+bHNfaXJxOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEocnBoeS0+ZGV2LCBycG9ydC0+bHNfaXJxLCBOVUxMLAorCQkJCQlyb2NrY2hpcF91c2IycGh5X2xpbmVzdGF0ZV9pcnEsCisJCQkJCUlSUUZfT05FU0hPVCwKKwkJCQkJInJvY2tjaGlwX3VzYjJwaHkiLCBycG9ydCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHJwaHktPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGlycSBoYW5kbGVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3VzYjJwaHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZF9ucDsKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwcm92aWRlcjsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeSAqcnBoeTsKKwljb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9jZmcgKnBoeV9jZmdzOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCXVuc2lnbmVkIGludCByZWc7CisJaW50IGluZGV4LCByZXQ7CisKKwlycGh5ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpycGh5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFycGh5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKGRldi0+ZHJpdmVyLT5vZl9tYXRjaF90YWJsZSwgZGV2KTsKKwlpZiAoIW1hdGNoIHx8ICFtYXRjaC0+ZGF0YSkgeworCQlkZXZfZXJyKGRldiwgInBoeSBjb25maWdzIGFyZSBub3QgYXNzaWduZWQhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFkZXYtPnBhcmVudCB8fCAhZGV2LT5wYXJlbnQtPm9mX25vZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJcnBoeS0+Z3JmID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKGRldi0+cGFyZW50LT5vZl9ub2RlKTsKKwlpZiAoSVNfRVJSKHJwaHktPmdyZikpCisJCXJldHVybiBQVFJfRVJSKHJwaHktPmdyZik7CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyZWciLCAmcmVnKSkgeworCQlkZXZfZXJyKGRldiwgInRoZSByZWcgcHJvcGVydHkgaXMgbm90IGFzc2lnbmVkIGluICVzIG5vZGVcbiIsCisJCQlucC0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJwaHktPmRldiA9IGRldjsKKwlwaHlfY2ZncyA9IG1hdGNoLT5kYXRhOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJwaHkpOworCisJLyogZmluZCBvdXQgYSBwcm9wZXIgY29uZmlnIHdoaWNoIGNhbiBiZSBtYXRjaGVkIHdpdGggZHQuICovCisJaW5kZXggPSAwOworCXdoaWxlIChwaHlfY2Znc1tpbmRleF0ucmVnKSB7CisJCWlmIChwaHlfY2Znc1tpbmRleF0ucmVnID09IHJlZykgeworCQkJcnBoeS0+cGh5X2NmZyA9ICZwaHlfY2Znc1tpbmRleF07CisJCQlicmVhazsKKwkJfQorCisJCSsraW5kZXg7CisJfQorCisJaWYgKCFycGh5LT5waHlfY2ZnKSB7CisJCWRldl9lcnIoZGV2LCAibm8gcGh5LWNvbmZpZyBjYW4gYmUgbWF0Y2hlZCB3aXRoICVzIG5vZGVcbiIsCisJCQlucC0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJwaHktPmNsayA9IG9mX2Nsa19nZXRfYnlfbmFtZShucCwgInBoeWNsayIpOworCWlmICghSVNfRVJSKHJwaHktPmNsaykpIHsKKwkJY2xrX3ByZXBhcmVfZW5hYmxlKHJwaHktPmNsayk7CisJfSBlbHNlIHsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgIm5vIHBoeWNsayBzcGVjaWZpZWRcbiIpOworCQlycGh5LT5jbGsgPSBOVUxMOworCX0KKworCXJldCA9IHJvY2tjaGlwX3VzYjJwaHlfY2xrNDgwbV9yZWdpc3RlcihycGh5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIDQ4MG0gb3V0cHV0IGNsb2NrXG4iKTsKKwkJZ290byBkaXNhYmxlX2Nsa3M7CisJfQorCisJaW5kZXggPSAwOworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKG5wLCBjaGlsZF9ucCkgeworCQlzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9wb3J0ICpycG9ydCA9ICZycGh5LT5wb3J0c1tpbmRleF07CisJCXN0cnVjdCBwaHkgKnBoeTsKKworCQkvKgorCQkgKiBUaGlzIGRyaXZlciBhaW0gdG8gc3VwcG9ydCBib3RoIG90Zy1wb3J0IGFuZCBob3N0LXBvcnQsCisJCSAqIGJ1dCB1bmZvcnR1bmF0ZWx5LCB0aGUgb3RnIHBhcnQgaXMgbm90IHJlYWR5IGluIGN1cnJlbnQsCisJCSAqIHNvIHRoaXMgY29tbWVudHMgYW5kIGJlbG93IGNvZGVzIGFyZSBpbnRlcmltLCB3aGljaCBzaG91bGQKKwkJICogYmUgY2hhbmdlZCBhZnRlciBvdGctcG9ydCBpcyBzdXBwbGllZCBzb29uLgorCQkgKi8KKwkJaWYgKG9mX25vZGVfY21wKGNoaWxkX25wLT5uYW1lLCAiaG9zdC1wb3J0IikpCisJCQlnb3RvIG5leHRfY2hpbGQ7CisKKwkJcGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgY2hpbGRfbnAsICZyb2NrY2hpcF91c2IycGh5X29wcyk7CisJCWlmIChJU19FUlIocGh5KSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIHBoeVxuIik7CisJCQlyZXQgPSBQVFJfRVJSKHBoeSk7CisJCQlnb3RvIHB1dF9jaGlsZDsKKwkJfQorCisJCXJwb3J0LT5waHkgPSBwaHk7CisJCXBoeV9zZXRfZHJ2ZGF0YShycG9ydC0+cGh5LCBycG9ydCk7CisKKwkJcmV0ID0gcm9ja2NoaXBfdXNiMnBoeV9ob3N0X3BvcnRfaW5pdChycGh5LCBycG9ydCwgY2hpbGRfbnApOworCQlpZiAocmV0KQorCQkJZ290byBwdXRfY2hpbGQ7CisKK25leHRfY2hpbGQ6CisJCS8qIHRvIHByZXZlbnQgb3V0IG9mIGJvdW5kYXJ5ICovCisJCWlmICgrK2luZGV4ID49IHJwaHktPnBoeV9jZmctPm51bV9wb3J0cykKKwkJCWJyZWFrOworCX0KKworCXByb3ZpZGVyID0gZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoZGV2LCBvZl9waHlfc2ltcGxlX3hsYXRlKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHByb3ZpZGVyKTsKKworcHV0X2NoaWxkOgorCW9mX25vZGVfcHV0KGNoaWxkX25wKTsKK2Rpc2FibGVfY2xrczoKKwlpZiAocnBoeS0+Y2xrKSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShycGh5LT5jbGspOworCQljbGtfcHV0KHJwaHktPmNsayk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfdXNiMnBoeV9jZmcgcmszMzY2X3BoeV9jZmdzW10gPSB7CisJeworCQkucmVnID0gMHg3MDAsCisJCS5udW1fcG9ydHMJPSAyLAorCQkuY2xrb3V0X2N0bAk9IHsgMHgwNzI0LCAxNSwgMTUsIDEsIDAgfSwKKwkJLnBvcnRfY2Zncwk9IHsKKwkJCVtVU0IyUEhZX1BPUlRfSE9TVF0gPSB7CisJCQkJLnBoeV9zdXMJPSB7IDB4MDcyOCwgMTUsIDAsIDAsIDB4MWQxIH0sCisJCQkJLmxzX2RldF9lbgk9IHsgMHgwNjgwLCA0LCA0LCAwLCAxIH0sCisJCQkJLmxzX2RldF9zdAk9IHsgMHgwNjkwLCA0LCA0LCAwLCAxIH0sCisJCQkJLmxzX2RldF9jbHIJPSB7IDB4MDZhMCwgNCwgNCwgMCwgMSB9LAorCQkJCS51dG1pX2xzCT0geyAweDA0OWMsIDE0LCAxMywgMCwgMSB9LAorCQkJCS51dG1pX2hzdGRldAk9IHsgMHgwNDljLCAxMiwgMTIsIDAsIDEgfQorCQkJfQorCQl9LAorCX0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJvY2tjaGlwX3VzYjJwaHlfY2ZnIHJrMzM5OV9waHlfY2Znc1tdID0geworCXsKKwkJLnJlZyA9IDB4ZTQ1MCwKKwkJLm51bV9wb3J0cwk9IDIsCisJCS5jbGtvdXRfY3RsCT0geyAweGU0NTAsIDQsIDQsIDEsIDAgfSwKKwkJLnBvcnRfY2Zncwk9IHsKKwkJCVtVU0IyUEhZX1BPUlRfSE9TVF0gPSB7CisJCQkJLnBoeV9zdXMJPSB7IDB4ZTQ1OCwgMSwgMCwgMHgyLCAweDEgfSwKKwkJCQkubHNfZGV0X2VuCT0geyAweGUzYzAsIDYsIDYsIDAsIDEgfSwKKwkJCQkubHNfZGV0X3N0CT0geyAweGUzZTAsIDYsIDYsIDAsIDEgfSwKKwkJCQkubHNfZGV0X2Nscgk9IHsgMHhlM2QwLCA2LCA2LCAwLCAxIH0sCisJCQkJLnV0bWlfbHMJPSB7IDB4ZTJhYywgMjIsIDIxLCAwLCAxIH0sCisJCQkJLnV0bWlfaHN0ZGV0CT0geyAweGUyYWMsIDIzLCAyMywgMCwgMSB9CisJCQl9CisJCX0sCisJfSwKKwl7CisJCS5yZWcgPSAweGU0NjAsCisJCS5udW1fcG9ydHMJPSAyLAorCQkuY2xrb3V0X2N0bAk9IHsgMHhlNDYwLCA0LCA0LCAxLCAwIH0sCisJCS5wb3J0X2NmZ3MJPSB7CisJCQlbVVNCMlBIWV9QT1JUX0hPU1RdID0geworCQkJCS5waHlfc3VzCT0geyAweGU0NjgsIDEsIDAsIDB4MiwgMHgxIH0sCisJCQkJLmxzX2RldF9lbgk9IHsgMHhlM2MwLCAxMSwgMTEsIDAsIDEgfSwKKwkJCQkubHNfZGV0X3N0CT0geyAweGUzZTAsIDExLCAxMSwgMCwgMSB9LAorCQkJCS5sc19kZXRfY2xyCT0geyAweGUzZDAsIDExLCAxMSwgMCwgMSB9LAorCQkJCS51dG1pX2xzCT0geyAweGUyYWMsIDI2LCAyNSwgMCwgMSB9LAorCQkJCS51dG1pX2hzdGRldAk9IHsgMHhlMmFjLCAyNywgMjcsIDAsIDEgfQorCQkJfQorCQl9LAorCX0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByb2NrY2hpcF91c2IycGh5X2R0X21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzNjYtdXNiMnBoeSIsIC5kYXRhID0gJnJrMzM2Nl9waHlfY2ZncyB9LAorCXsgLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LXVzYjJwaHkiLCAuZGF0YSA9ICZyazMzOTlfcGh5X2NmZ3MgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJvY2tjaGlwX3VzYjJwaHlfZHRfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByb2NrY2hpcF91c2IycGh5X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcm9ja2NoaXBfdXNiMnBoeV9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicm9ja2NoaXAtdXNiMnBoeSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHJvY2tjaGlwX3VzYjJwaHlfZHRfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJvY2tjaGlwX3VzYjJwaHlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiRnJhbmsgV2FuZyA8ZnJhbmsud2FuZ0Byb2NrLWNoaXBzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUm9ja2NoaXAgVVNCMi4wIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC1wY2llLmMgYi9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtcGNpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjRjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtcGNpZS5jCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogUm9ja2NoaXAgUENJZSBQSFkgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFNoYXduIExpbiA8c2hhd24ubGluQHJvY2stY2hpcHMuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE2IFJPQ0tDSElQLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKworLyoKKyAqIFRoZSBoaWdoZXIgMTYtYml0IG9mIHRoaXMgcmVnaXN0ZXIgaXMgdXNlZCBmb3Igd3JpdGUgcHJvdGVjdGlvbgorICogb25seSBpZiBCSVQoeCArIDE2KSBzZXQgdG8gMSB0aGUgQklUKHgpIGNhbiBiZSB3cml0dGVuLgorICovCisjZGVmaW5lIEhJV09SRF9VUERBVEUodmFsLCBtYXNrLCBzaGlmdCkgXAorCQkoKHZhbCkgPDwgKHNoaWZ0KSB8IChtYXNrKSA8PCAoKHNoaWZ0KSArIDE2KSkKKworI2RlZmluZSBQSFlfTUFYX0xBTkVfTlVNICAgICAgNAorI2RlZmluZSBQSFlfQ0ZHX0RBVEFfU0hJRlQgICAgNworI2RlZmluZSBQSFlfQ0ZHX0FERFJfU0hJRlQgICAgMQorI2RlZmluZSBQSFlfQ0ZHX0RBVEFfTUFTSyAgICAgMHhmCisjZGVmaW5lIFBIWV9DRkdfQUREUl9NQVNLICAgICAweDNmCisjZGVmaW5lIFBIWV9DRkdfUkRfTUFTSyAgICAgICAweDNmZgorI2RlZmluZSBQSFlfQ0ZHX1dSX0VOQUJMRSAgICAgMQorI2RlZmluZSBQSFlfQ0ZHX1dSX0RJU0FCTEUgICAgMQorI2RlZmluZSBQSFlfQ0ZHX1dSX1NISUZUICAgICAgMAorI2RlZmluZSBQSFlfQ0ZHX1dSX01BU0sgICAgICAgMQorI2RlZmluZSBQSFlfQ0ZHX1BMTF9MT0NLICAgICAgMHgxMAorI2RlZmluZSBQSFlfQ0ZHX0NMS19URVNUICAgICAgMHgxMAorI2RlZmluZSBQSFlfQ0ZHX0NMS19TQ0MgICAgICAgMHgxMgorI2RlZmluZSBQSFlfQ0ZHX1NFUEVfUkFURSAgICAgQklUKDMpCisjZGVmaW5lIFBIWV9DRkdfUExMXzEwME0gICAgICBCSVQoMykKKyNkZWZpbmUgUEhZX1BMTF9MT0NLRUQgICAgICAgIEJJVCg5KQorI2RlZmluZSBQSFlfUExMX09VVFBVVCAgICAgICAgQklUKDEwKQorI2RlZmluZSBQSFlfTEFORV9BX1NUQVRVUyAgICAgMHgzMAorI2RlZmluZSBQSFlfTEFORV9CX1NUQVRVUyAgICAgMHgzMQorI2RlZmluZSBQSFlfTEFORV9DX1NUQVRVUyAgICAgMHgzMgorI2RlZmluZSBQSFlfTEFORV9EX1NUQVRVUyAgICAgMHgzMworI2RlZmluZSBQSFlfTEFORV9SWF9ERVRfU0hJRlQgMTEKKyNkZWZpbmUgUEhZX0xBTkVfUlhfREVUX1RIICAgIDB4MQorI2RlZmluZSBQSFlfTEFORV9JRExFX09GRiAgICAgMHgxCisjZGVmaW5lIFBIWV9MQU5FX0lETEVfTUFTSyAgICAweDEKKyNkZWZpbmUgUEhZX0xBTkVfSURMRV9BX1NISUZUIDMKKyNkZWZpbmUgUEhZX0xBTkVfSURMRV9CX1NISUZUIDQKKyNkZWZpbmUgUEhZX0xBTkVfSURMRV9DX1NISUZUIDUKKyNkZWZpbmUgUEhZX0xBTkVfSURMRV9EX1NISUZUIDYKKworc3RydWN0IHJvY2tjaGlwX3BjaWVfZGF0YSB7CisJdW5zaWduZWQgaW50IHBjaWVfY29uZjsKKwl1bnNpZ25lZCBpbnQgcGNpZV9zdGF0dXM7CisJdW5zaWduZWQgaW50IHBjaWVfbGFuZW9mZjsKK307CisKK3N0cnVjdCByb2NrY2hpcF9wY2llX3BoeSB7CisJc3RydWN0IHJvY2tjaGlwX3BjaWVfZGF0YSAqcGh5X2RhdGE7CisJc3RydWN0IHJlZ21hcCAqcmVnX2Jhc2U7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnBoeV9yc3Q7CisJc3RydWN0IGNsayAqY2xrX3BjaWVwaHlfcmVmOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHBoeV93cl9jZmcoc3RydWN0IHJvY2tjaGlwX3BjaWVfcGh5ICpya19waHksCisJCQkgICAgICB1MzIgYWRkciwgdTMyIGRhdGEpCit7CisJcmVnbWFwX3dyaXRlKHJrX3BoeS0+cmVnX2Jhc2UsIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfY29uZiwKKwkJICAgICBISVdPUkRfVVBEQVRFKGRhdGEsCisJCQkJICAgUEhZX0NGR19EQVRBX01BU0ssCisJCQkJICAgUEhZX0NGR19EQVRBX1NISUZUKSB8CisJCSAgICAgSElXT1JEX1VQREFURShhZGRyLAorCQkJCSAgIFBIWV9DRkdfQUREUl9NQVNLLAorCQkJCSAgIFBIWV9DRkdfQUREUl9TSElGVCkpOworCXVkZWxheSgxKTsKKwlyZWdtYXBfd3JpdGUocmtfcGh5LT5yZWdfYmFzZSwgcmtfcGh5LT5waHlfZGF0YS0+cGNpZV9jb25mLAorCQkgICAgIEhJV09SRF9VUERBVEUoUEhZX0NGR19XUl9FTkFCTEUsCisJCQkJICAgUEhZX0NGR19XUl9NQVNLLAorCQkJCSAgIFBIWV9DRkdfV1JfU0hJRlQpKTsKKwl1ZGVsYXkoMSk7CisJcmVnbWFwX3dyaXRlKHJrX3BoeS0+cmVnX2Jhc2UsIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfY29uZiwKKwkJICAgICBISVdPUkRfVVBEQVRFKFBIWV9DRkdfV1JfRElTQUJMRSwKKwkJCQkgICBQSFlfQ0ZHX1dSX01BU0ssCisJCQkJICAgUEhZX0NGR19XUl9TSElGVCkpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBwaHlfcmRfY2ZnKHN0cnVjdCByb2NrY2hpcF9wY2llX3BoeSAqcmtfcGh5LAorCQkJICAgICB1MzIgYWRkcikKK3sKKwl1MzIgdmFsOworCisJcmVnbWFwX3dyaXRlKHJrX3BoeS0+cmVnX2Jhc2UsIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfY29uZiwKKwkJICAgICBISVdPUkRfVVBEQVRFKGFkZHIsCisJCQkJICAgUEhZX0NGR19SRF9NQVNLLAorCQkJCSAgIFBIWV9DRkdfQUREUl9TSElGVCkpOworCXJlZ21hcF9yZWFkKHJrX3BoeS0+cmVnX2Jhc2UsCisJCSAgICBya19waHktPnBoeV9kYXRhLT5wY2llX3N0YXR1cywKKwkJICAgICZ2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV9waHlfcG93ZXJfb2ZmKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9waHkgKnJrX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCWludCBlcnIgPSAwOworCisJZXJyID0gcmVzZXRfY29udHJvbF9hc3NlcnQocmtfcGh5LT5waHlfcnN0KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBoeS0+ZGV2LCAiYXNzZXJ0IHBoeV9yc3QgZXJyICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9waHkgKnJrX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCWludCBlcnIgPSAwOworCXUzMiBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJZXJyID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChya19waHktPnBoeV9yc3QpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGh5LT5kZXYsICJkZWFzc2VydCBwaHlfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZWdtYXBfd3JpdGUocmtfcGh5LT5yZWdfYmFzZSwgcmtfcGh5LT5waHlfZGF0YS0+cGNpZV9jb25mLAorCQkgICAgIEhJV09SRF9VUERBVEUoUEhZX0NGR19QTExfTE9DSywKKwkJCQkgICBQSFlfQ0ZHX0FERFJfTUFTSywKKwkJCQkgICBQSFlfQ0ZHX0FERFJfU0hJRlQpKTsKKworCS8qCisJICogTm8gZG9jdW1lbnRlZCB0aW1lb3V0IHZhbHVlIGZvciBwaHkgb3BlcmF0aW9uIGJlbG93LAorCSAqIHNvIHdlIG1ha2UgaXQgbGFyZ2UgZW5vdWdoIGhlcmUuIEFuZCB3ZSB1c2UgbG9vcC1icmVhaworCSAqIG1ldGhvZCB3aGljaCBzaG91bGQgbm90IGJlIGhhcm1mdWwuCisJICovCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJcmVnbWFwX3JlYWQocmtfcGh5LT5yZWdfYmFzZSwKKwkJCSAgICBya19waHktPnBoeV9kYXRhLT5wY2llX3N0YXR1cywKKwkJCSAgICAmc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFBIWV9QTExfTE9DS0VEKSB7CisJCQlkZXZfZGJnKCZwaHktPmRldiwgInBsbCBsb2NrZWQhXG4iKTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMjApOworCX0KKworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGh5LT5kZXYsICJwbGwgbG9jayB0aW1lb3V0IVxuIik7CisJCWdvdG8gZXJyX3BsbF9sb2NrOworCX0KKworCXBoeV93cl9jZmcocmtfcGh5LCBQSFlfQ0ZHX0NMS19URVNULCBQSFlfQ0ZHX1NFUEVfUkFURSk7CisJcGh5X3dyX2NmZyhya19waHksIFBIWV9DRkdfQ0xLX1NDQywgUEhZX0NGR19QTExfMTAwTSk7CisKKwllcnIgPSAtRVRJTUVET1VUOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlyZWdtYXBfcmVhZChya19waHktPnJlZ19iYXNlLAorCQkJICAgIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfc3RhdHVzLAorCQkJICAgICZzdGF0dXMpOworCQlpZiAoIShzdGF0dXMgJiBQSFlfUExMX09VVFBVVCkpIHsKKwkJCWRldl9kYmcoJnBoeS0+ZGV2LCAicGxsIG91dHB1dCBlbmFibGUgZG9uZSFcbiIpOworCQkJZXJyID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgyMCk7CisJfQorCisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwaHktPmRldiwgInBsbCBvdXRwdXQgZW5hYmxlIHRpbWVvdXQhXG4iKTsKKwkJZ290byBlcnJfcGxsX2xvY2s7CisJfQorCisJcmVnbWFwX3dyaXRlKHJrX3BoeS0+cmVnX2Jhc2UsIHJrX3BoeS0+cGh5X2RhdGEtPnBjaWVfY29uZiwKKwkJICAgICBISVdPUkRfVVBEQVRFKFBIWV9DRkdfUExMX0xPQ0ssCisJCQkJICAgUEhZX0NGR19BRERSX01BU0ssCisJCQkJICAgUEhZX0NGR19BRERSX1NISUZUKSk7CisJZXJyID0gLUVJTlZBTDsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJcmVnbWFwX3JlYWQocmtfcGh5LT5yZWdfYmFzZSwKKwkJCSAgICBya19waHktPnBoeV9kYXRhLT5wY2llX3N0YXR1cywKKwkJCSAgICAmc3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFBIWV9QTExfTE9DS0VEKSB7CisJCQlkZXZfZGJnKCZwaHktPmRldiwgInBsbCByZWxvY2tlZCFcbiIpOworCQkJZXJyID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW1zbGVlcCgyMCk7CisJfQorCisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwaHktPmRldiwgInBsbCByZWxvY2sgdGltZW91dCFcbiIpOworCQlnb3RvIGVycl9wbGxfbG9jazsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3BsbF9sb2NrOgorCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHJrX3BoeS0+cGh5X3JzdCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9wY2llX3BoeV9pbml0KHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9waHkgKnJrX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCWludCBlcnIgPSAwOworCisJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKHJrX3BoeS0+Y2xrX3BjaWVwaHlfcmVmKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBoeS0+ZGV2LCAiRmFpbCB0byBlbmFibGUgcGNpZSByZWYgY2xvY2suXG4iKTsKKwkJZ290byBlcnJfcmVmY2xrOworCX0KKworCWVyciA9IHJlc2V0X2NvbnRyb2xfYXNzZXJ0KHJrX3BoeS0+cGh5X3JzdCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwaHktPmRldiwgImFzc2VydCBwaHlfcnN0IGVyciAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfcmVzZXQ7CisJfQorCisJcmV0dXJuIGVycjsKKworZXJyX3Jlc2V0OgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShya19waHktPmNsa19wY2llcGh5X3JlZik7CitlcnJfcmVmY2xrOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfcGNpZV9waHlfZXhpdChzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3BjaWVfcGh5ICpya19waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlpbnQgZXJyID0gMDsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShya19waHktPmNsa19wY2llcGh5X3JlZik7CisKKwllcnIgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KHJrX3BoeS0+cGh5X3JzdCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwaHktPmRldiwgImRlYXNzZXJ0IHBoeV9yc3QgZXJyICVkXG4iLCBlcnIpOworCQlnb3RvIGVycl9yZXNldDsKKwl9CisKKwlyZXR1cm4gZXJyOworCitlcnJfcmVzZXQ6CisJY2xrX3ByZXBhcmVfZW5hYmxlKHJrX3BoeS0+Y2xrX3BjaWVwaHlfcmVmKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgb3BzID0geworCS5pbml0CQk9IHJvY2tjaGlwX3BjaWVfcGh5X2luaXQsCisJLmV4aXQJCT0gcm9ja2NoaXBfcGNpZV9waHlfZXhpdCwKKwkucG93ZXJfb24JPSByb2NrY2hpcF9wY2llX3BoeV9wb3dlcl9vbiwKKwkucG93ZXJfb2ZmCT0gcm9ja2NoaXBfcGNpZV9waHlfcG93ZXJfb2ZmLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9kYXRhIHJrMzM5OV9wY2llX2RhdGEgPSB7CisJLnBjaWVfY29uZiA9IDB4ZTIyMCwKKwkucGNpZV9zdGF0dXMgPSAweGUyYTQsCisJLnBjaWVfbGFuZW9mZiA9IDB4ZTIxNCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJvY2tjaGlwX3BjaWVfcGh5X2R0X2lkc1tdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAicm9ja2NoaXAscmszMzk5LXBjaWUtcGh5IiwKKwkJLmRhdGEgPSAmcmszMzk5X3BjaWVfZGF0YSwKKwl9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2NrY2hpcF9wY2llX3BoeV9kdF9pZHMpOworCitzdGF0aWMgaW50IHJvY2tjaGlwX3BjaWVfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3Qgcm9ja2NoaXBfcGNpZV9waHkgKnJrX3BoeTsKKwlzdHJ1Y3QgcGh5ICpnZW5lcmljX3BoeTsKKwlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7CisJc3RydWN0IHJlZ21hcCAqZ3JmOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOworCisJZ3JmID0gc3lzY29uX25vZGVfdG9fcmVnbWFwKGRldi0+cGFyZW50LT5vZl9ub2RlKTsKKwlpZiAoSVNfRVJSKGdyZikpIHsKKwkJZGV2X2VycihkZXYsICJDYW5ub3QgZmluZCBHUkYgc3lzY29uXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZ3JmKTsKKwl9CisKKwlya19waHkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnJrX3BoeSksIEdGUF9LRVJORUwpOworCWlmICghcmtfcGh5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKHJvY2tjaGlwX3BjaWVfcGh5X2R0X2lkcywgJnBkZXYtPmRldik7CisJaWYgKCFvZl9pZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlya19waHktPnBoeV9kYXRhID0gKHN0cnVjdCByb2NrY2hpcF9wY2llX2RhdGEgKilvZl9pZC0+ZGF0YTsKKwlya19waHktPnJlZ19iYXNlID0gZ3JmOworCisJcmtfcGh5LT5waHlfcnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChkZXYsICJwaHkiKTsKKwlpZiAoSVNfRVJSKHJrX3BoeS0+cGh5X3JzdCkpIHsKKwkJaWYgKFBUUl9FUlIocmtfcGh5LT5waHlfcnN0KSAhPSAtRVBST0JFX0RFRkVSKQorCQkJZGV2X2VycihkZXYsCisJCQkJIm1pc3NpbmcgcGh5IHByb3BlcnR5IGZvciByZXNldCBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocmtfcGh5LT5waHlfcnN0KTsKKwl9CisKKwlya19waHktPmNsa19wY2llcGh5X3JlZiA9IGRldm1fY2xrX2dldChkZXYsICJyZWZjbGsiKTsKKwlpZiAoSVNfRVJSKHJrX3BoeS0+Y2xrX3BjaWVwaHlfcmVmKSkgeworCQlkZXZfZXJyKGRldiwgInJlZmNsayBub3QgZm91bmQuXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocmtfcGh5LT5jbGtfcGNpZXBoeV9yZWYpOworCX0KKworCWdlbmVyaWNfcGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwgZGV2LT5vZl9ub2RlLCAmb3BzKTsKKwlpZiAoSVNfRVJSKGdlbmVyaWNfcGh5KSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgUEhZXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoZ2VuZXJpY19waHkpOworCX0KKworCXBoeV9zZXRfZHJ2ZGF0YShnZW5lcmljX3BoeSwgcmtfcGh5KTsKKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYsIG9mX3BoeV9zaW1wbGVfeGxhdGUpOworCisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwaHlfcHJvdmlkZXIpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciByb2NrY2hpcF9wY2llX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcm9ja2NoaXBfcGNpZV9waHlfcHJvYmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInJvY2tjaGlwLXBjaWUtcGh5IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gcm9ja2NoaXBfcGNpZV9waHlfZHRfaWRzLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJvY2tjaGlwX3BjaWVfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiU2hhd24gTGluIDxzaGF3bi5saW5Acm9jay1jaGlwcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJvY2tjaGlwIFBDSWUgUEhZIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXR5cGVjLmMgYi9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtdHlwZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2ZiMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXR5cGVjLmMKQEAgLTAsMCArMSwxMDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSBGdXpob3UgUm9ja2NoaXAgRWxlY3Ryb25pY3MgQ28uTHRkCisgKiBBdXRob3I6IENocmlzIFpob25nIDx6eXdAcm9jay1jaGlwcy5jb20+CisgKiAgICAgICAgIEtldmVyIFlhbmcgPGtldmVyLnlhbmdAcm9jay1jaGlwcy5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBUaGUgUk9DS0NISVAgVHlwZS1DIFBIWSBoYXMgdHdvIFBMTCBjbG9ja3MuIFRoZSBmaXJzdCBQTEwgY2xvY2sKKyAqIGlzIHVzZWQgZm9yIFVTQjMsIHRoZSBzZWNvbmQgUExMIGNsb2NrIGlzIHVzZWQgZm9yIERQLiBUaGlzIFR5cGUtQyBQSFkgaGFzCisgKiAzIHdvcmtpbmcgbW9kZXM6IFVTQjMgb25seSBtb2RlLCBEUCBvbmx5IG1vZGUsIGFuZCBVU0IzK0RQIG1vZGUuCisgKiBBdCBVU0IzIG9ubHkgbW9kZSwgYm90aCBQTEwgY2xvY2tzIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQsIHRoaXMgYWxsb3dzIHRoZQorICogUEhZIHRvIHN3aXRjaCBtb2RlIGJldHdlZW4gVVNCMyBhbmQgVVNCMytEUCwgd2l0aG91dCBkaXNjb25uZWN0aW5nIHRoZSBVU0IKKyAqIGRldmljZS4KKyAqIEluIFRoZSBEUCBvbmx5IG1vZGUsIG9ubHkgdGhlIERQIFBMTCBuZWVkcyB0byBiZSBwb3dlcmVkIG9uLCBhbmQgdGhlIDQgbGFuZXMKKyAqIGFyZSBhbGwgdXNlZCBmb3IgRFAuCisgKgorICogVGhpcyBkcml2ZXIgZ2V0cyBleHRjb24gY2FibGUgc3RhdGUgYW5kIHByb3BlcnR5LCB0aGVuIGRlY2lkZXMgd2hpY2ggbW9kZSB0bworICogc2VsZWN0OgorICoKKyAqIDEuIFVTQjMgb25seSBtb2RlOgorICogICAgRVhUQ09OX1VTQiBvciBFWFRDT05fVVNCX0hPU1Qgc3RhdGUgaXMgdHJ1ZSwgYW5kCisgKiAgICBFWFRDT05fUFJPUF9VU0JfU1MgcHJvcGVydHkgaXMgdHJ1ZS4KKyAqICAgIEVYVENPTl9ESVNQX0RQIHN0YXRlIGlzIGZhbHNlLgorICoKKyAqIDIuIERQIG9ubHkgbW9kZToKKyAqICAgIEVYVENPTl9ESVNQX0RQIHN0YXRlIGlzIHRydWUsIGFuZAorICogICAgRVhUQ09OX1BST1BfVVNCX1NTIHByb3BlcnR5IGlzIGZhbHNlLgorICogICAgSWYgRVhUQ09OX1VTQl9IT1NUIHN0YXRlIGlzIHRydWUsIGl0IGlzIERQICsgVVNCMiBtb2RlLCBzaW5jZSB0aGUgVVNCMiBwaHkKKyAqICAgIGlzIGEgc2VwYXJhdGUgcGh5LCBzbyB0aGlzIGNhc2UgaXMgc3RpbGwgRFAgb25seSBtb2RlLgorICoKKyAqIDMuIFVTQjMrRFAgbW9kZToKKyAqICAgIEVYVENPTl9VU0JfSE9TVCBhbmQgRVhUQ09OX0RJU1BfRFAgYXJlIGJvdGggdHJ1ZSwgYW5kCisgKiAgICBFWFRDT05fUFJPUF9VU0JfU1MgcHJvcGVydHkgaXMgdHJ1ZS4KKyAqCisgKiBUaGlzIFR5cGUtQyBQSFkgZHJpdmVyIHN1cHBvcnRzIG5vcm1hbCBhbmQgZmxpcCBvcmllbnRhdGlvbi4gVGhlIG9yaWVudGF0aW9uCisgKiBpcyByZXBvcnRlZCBieSB0aGUgRVhUQ09OX1BST1BfVVNCX1RZUEVDX1BPTEFSSVRZIHByb3BlcnR5OiB0cnVlIGlzIGZsaXAKKyAqIG9yaWVudGF0aW9uLCBmYWxzZSBpcyBub3JtYWwgb3JpZW50YXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dGNvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorCisjZGVmaW5lIENNTl9TU01fQkFOREdBUAkJCSgweDIxIDw8IDIpCisjZGVmaW5lIENNTl9TU01fQklBUwkJCSgweDIyIDw8IDIpCisjZGVmaW5lIENNTl9QTExTTTBfUExMRU4JCSgweDI5IDw8IDIpCisjZGVmaW5lIENNTl9QTExTTTBfUExMUFJFCQkoMHgyYSA8PCAyKQorI2RlZmluZSBDTU5fUExMU00wX1BMTFZSRUYJCSgweDJiIDw8IDIpCisjZGVmaW5lIENNTl9QTExTTTBfUExMTE9DSwkJKDB4MmMgPDwgMikKKyNkZWZpbmUgQ01OX1BMTFNNMV9QTExFTgkJKDB4MzEgPDwgMikKKyNkZWZpbmUgQ01OX1BMTFNNMV9QTExQUkUJCSgweDMyIDw8IDIpCisjZGVmaW5lIENNTl9QTExTTTFfUExMVlJFRgkJKDB4MzMgPDwgMikKKyNkZWZpbmUgQ01OX1BMTFNNMV9QTExMT0NLCQkoMHgzNCA8PCAyKQorI2RlZmluZSBDTU5fUExMU00xX1VTRVJfREVGX0NUUkwJKDB4MzcgPDwgMikKKyNkZWZpbmUgQ01OX0lDQUxfT1ZSRAkJCSgweGMxIDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX1ZDT0NBTF9PVlJECQkoMHg4MyA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9WQ09DQUxfSU5JVAkJKDB4ODQgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDBfVkNPQ0FMX0lURVIJCSgweDg1IDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX0xPQ0tfUkVGQ05UX1NUQVJUCSgweDkwIDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX0xPQ0tfUExMQ05UX1NUQVJUCSgweDkyIDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX0xPQ0tfUExMQ05UX1RIUgkoMHg5MyA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9JTlRESVYJCQkoMHg5NCA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9GUkFDRElWCQkoMHg5NSA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9ISUdIX1RIUgkJKDB4OTYgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDBfRFNNX0RJQUcJCSgweDk3IDw8IDIpCisjZGVmaW5lIENNTl9QTEwwX1NTX0NUUkwxCQkoMHg5OCA8PCAyKQorI2RlZmluZSBDTU5fUExMMF9TU19DVFJMMgkJKDB4OTkgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfVkNPQ0FMX1NUQVJUCQkoMHhhMSA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9WQ09DQUxfT1ZSRAkJKDB4YTMgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfVkNPQ0FMX0lOSVQJCSgweGE0IDw8IDIpCisjZGVmaW5lIENNTl9QTEwxX1ZDT0NBTF9JVEVSCQkoMHhhNSA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9MT0NLX1JFRkNOVF9TVEFSVAkoMHhiMCA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9MT0NLX1BMTENOVF9TVEFSVAkoMHhiMiA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9MT0NLX1BMTENOVF9USFIJKDB4YjMgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfSU5URElWCQkJKDB4YjQgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfRlJBQ0RJVgkJKDB4YjUgPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfSElHSF9USFIJCSgweGI2IDw8IDIpCisjZGVmaW5lIENNTl9QTEwxX0RTTV9ESUFHCQkoMHhiNyA8PCAyKQorI2RlZmluZSBDTU5fUExMMV9TU19DVFJMMQkJKDB4YjggPDwgMikKKyNkZWZpbmUgQ01OX1BMTDFfU1NfQ1RSTDIJCSgweGI5IDw8IDIpCisjZGVmaW5lIENNTl9SWENBTF9PVlJECQkJKDB4ZDEgPDwgMikKKyNkZWZpbmUgQ01OX1RYUFVDQUxfQ1RSTAkJKDB4ZTAgPDwgMikKKyNkZWZpbmUgQ01OX1RYUFVDQUxfT1ZSRAkJKDB4ZTEgPDwgMikKKyNkZWZpbmUgQ01OX1RYUERDQUxfT1ZSRAkJKDB4ZjEgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9GQkhfT1ZSRAkJKDB4MWMwIDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDBfRkJMX09WUkQJCSgweDFjMSA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwwX09WUkQJCSgweDFjMiA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwwX1YySV9UVU5FCQkoMHgxYzUgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9DUF9UVU5FCQkoMHgxYzYgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMF9MRl9QUk9HCQkoMHgxYzcgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMV9GQkhfT1ZSRAkJKDB4MWQwIDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDFfRkJMX09WUkQJCSgweDFkMSA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwxX09WUkQJCSgweDFkMiA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwxX1YySV9UVU5FCQkoMHgxZDUgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMV9DUF9UVU5FCQkoMHgxZDYgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMV9MRl9QUk9HCQkoMHgxZDcgPDwgMikKKyNkZWZpbmUgQ01OX0RJQUdfUExMMV9QVEFUSVNfVFVORTEJKDB4MWQ4IDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX1BMTDFfUFRBVElTX1RVTkUyCSgweDFkOSA8PCAyKQorI2RlZmluZSBDTU5fRElBR19QTEwxX0lOQ0xLX0NUUkwJKDB4MWRhIDw8IDIpCisjZGVmaW5lIENNTl9ESUFHX0hTQ0xLX1NFTAkJKDB4MWUwIDw8IDIpCisKKyNkZWZpbmUgWENWUl9QU01fUkNUUkwobikJCSgoMHg0MDAxIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgWENWUl9QU01fQ0FMX1RNUihuKQkJKCgweDQwMDIgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBYQ1ZSX1BTTV9BMElOX1RNUihuKQkJKCgweDQwMDMgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX0NBTF9TQ0xSX01VTFQobikJKCgweDQwNDcgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX0NQT1NUX01VTFRfMDAobikJKCgweDQwNGMgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX0NQT1NUX01VTFRfMDEobikJKCgweDQwNGQgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX0NQT1NUX01VTFRfMTAobikJKCgweDQwNGUgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX0NQT1NUX01VTFRfMTEobikJKCgweDQwNGYgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX01HTkZTX01VTFRfMDAwKG4pCSgoMHg0MDUwIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19NR05GU19NVUxUXzAwMShuKQkoKDB4NDA1MSB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1RYQ0NfTUdORlNfTVVMVF8wMTAobikJKCgweDQwNTIgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX01HTkZTX01VTFRfMDExKG4pCSgoMHg0MDUzIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19NR05GU19NVUxUXzEwMChuKQkoKDB4NDA1NCB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1RYQ0NfTUdORlNfTVVMVF8xMDEobikJKCgweDQwNTUgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9UWENDX01HTkZTX01VTFRfMTEwKG4pCSgoMHg0MDU2IHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfVFhDQ19NR05GU19NVUxUXzExMShuKQkoKDB4NDA1NyB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFhDVlJfRElBR19QTExEUkNfQ1RSTChuKQkoKDB4NDBlMCB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFhDVlJfRElBR19CSURJX0NUUkwobikJCSgoMHg0MGU4IHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgWENWUl9ESUFHX0xBTkVfRkNNX0VOX01HTihuKQkoKDB4NDBmMiB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1BTQ19BMChuKQkJCSgoMHg0MTAwIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfUFNDX0ExKG4pCQkJKCgweDQxMDEgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9QU0NfQTIobikJCQkoKDB4NDEwMiB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX1BTQ19BMyhuKQkJCSgoMHg0MTAzIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfUkNWREVUX0NUUkwobikJCSgoMHg0MTIwIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgVFhfUkNWREVUX0VOX1RNUihuKQkJKCgweDQxMjIgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9SQ1ZERVRfU1RfVE1SKG4pCQkoKDB4NDEyMyB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX0RJQUdfVFhfRFJWKG4pCQkoKDB4NDFlMSB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFRYX0RJQUdfQkdSRUZfUFJFRFJWX0RFTEFZCSgweDQxZTcgPDwgMikKKyNkZWZpbmUgVFhfQU5BX0NUUkxfUkVHXzEJCSgweDUwMjAgPDwgMikKKyNkZWZpbmUgVFhfQU5BX0NUUkxfUkVHXzIJCSgweDUwMjEgPDwgMikKKyNkZWZpbmUgVFhEQV9DT0VGRl9DQUxDX0NUUkwJCSgweDUwMjIgPDwgMikKKyNkZWZpbmUgVFhfRElHX0NUUkxfUkVHXzIJCSgweDUwMjQgPDwgMikKKyNkZWZpbmUgVFhEQV9DWUFfQVVYREFfQ1lBCQkoMHg1MDI1IDw8IDIpCisjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR18zCQkoMHg1MDI2IDw8IDIpCisjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR180CQkoMHg1MDI3IDw8IDIpCisjZGVmaW5lIFRYX0FOQV9DVFJMX1JFR181CQkoMHg1MDI5IDw8IDIpCisKKyNkZWZpbmUgUlhfUFNDX0EwKG4pCQkJKCgweDgwMDAgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9QU0NfQTEobikJCQkoKDB4ODAwMSB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFJYX1BTQ19BMihuKQkJCSgoMHg4MDAyIHwgKChuKSA8PCA5KSkgPDwgMikKKyNkZWZpbmUgUlhfUFNDX0EzKG4pCQkJKCgweDgwMDMgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9QU0NfQ0FMKG4pCQkJKCgweDgwMDYgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9QU0NfUkRZKG4pCQkJKCgweDgwMDcgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9JUVBJX0lMTF9DQUxfT1ZSRAkJKDB4ODAyMyA8PCAyKQorI2RlZmluZSBSWF9FUElfSUxMX0NBTF9PVlJECQkoMHg4MDMzIDw8IDIpCisjZGVmaW5lIFJYX1NEQ0FMMF9PVlJECQkJKDB4ODA0MSA8PCAyKQorI2RlZmluZSBSWF9TRENBTDFfT1ZSRAkJCSgweDgwNDkgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0lOSVQJCQkoMHg4MDZkIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19SVU4JCQkoMHg4MDZlIDw8IDIpCisjZGVmaW5lIFJYX0NEUkxGX0NORkcyCQkJKDB4ODA4MSA8PCAyKQorI2RlZmluZSBSWF9TSUdERVRfSExfRklMVF9UTVIobikJKCgweDgwOTAgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9TTENfSU9QMF9PVlJECQkoMHg4MTAxIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19JT1AxX09WUkQJCSgweDgxMDUgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FPUDBfT1ZSRAkJKDB4ODEwOSA8PCAyKQorI2RlZmluZSBSWF9TTENfUU9QMV9PVlJECQkoMHg4MTBkIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FT1AwX09WUkQJCSgweDgxMTEgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0VPUDFfT1ZSRAkJKDB4ODExNSA8PCAyKQorI2RlZmluZSBSWF9TTENfSU9OMF9PVlJECQkoMHg4MTE5IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19JT04xX09WUkQJCSgweDgxMWQgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FPTjBfT1ZSRAkJKDB4ODEyMSA8PCAyKQorI2RlZmluZSBSWF9TTENfUU9OMV9PVlJECQkoMHg4MTI1IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FT04wX09WUkQJCSgweDgxMjkgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0VPTjFfT1ZSRAkJKDB4ODEyZCA8PCAyKQorI2RlZmluZSBSWF9TTENfSUVQMF9PVlJECQkoMHg4MTMxIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19JRVAxX09WUkQJCSgweDgxMzUgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FFUDBfT1ZSRAkJKDB4ODEzOSA8PCAyKQorI2RlZmluZSBSWF9TTENfUUVQMV9PVlJECQkoMHg4MTNkIDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FRVAwX09WUkQJCSgweDgxNDEgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0VFUDFfT1ZSRAkJKDB4ODE0NSA8PCAyKQorI2RlZmluZSBSWF9TTENfSUVOMF9PVlJECQkoMHg4MTQ5IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19JRU4xX09WUkQJCSgweDgxNGQgPDwgMikKKyNkZWZpbmUgUlhfU0xDX1FFTjBfT1ZSRAkJKDB4ODE1MSA8PCAyKQorI2RlZmluZSBSWF9TTENfUUVOMV9PVlJECQkoMHg4MTU1IDw8IDIpCisjZGVmaW5lIFJYX1NMQ19FRU4wX09WUkQJCSgweDgxNTkgPDwgMikKKyNkZWZpbmUgUlhfU0xDX0VFTjFfT1ZSRAkJKDB4ODE1ZCA8PCAyKQorI2RlZmluZSBSWF9SRUVfQ1RSTF9EQVRBX01BU0sobikJKCgweDgxYmIgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBSWF9ESUFHX1NJR0RFVF9UVU5FKG4pCQkoKDB4ODFkYyB8ICgobikgPDwgOSkpIDw8IDIpCisjZGVmaW5lIFJYX0RJQUdfU0MyQ19ERUxBWQkJKDB4ODFlMSA8PCAyKQorCisjZGVmaW5lIFBNQV9MQU5FX0NGRwkJCSgweGMwMDAgPDwgMikKKyNkZWZpbmUgUElQRV9DTU5fQ1RSTDEJCQkoMHhjMDAxIDw8IDIpCisjZGVmaW5lIFBJUEVfQ01OX0NUUkwyCQkJKDB4YzAwMiA8PCAyKQorI2RlZmluZSBQSVBFX0NPTV9MT0NLX0NGRzEJCSgweGMwMDMgPDwgMikKKyNkZWZpbmUgUElQRV9DT01fTE9DS19DRkcyCQkoMHhjMDA0IDw8IDIpCisjZGVmaW5lIFBJUEVfUkNWX0RFVF9JTkgJCSgweGMwMDUgPDwgMikKKyNkZWZpbmUgRFBfTU9ERV9DVEwJCQkoMHhjMDA4IDw8IDIpCisjZGVmaW5lIERQX0NMS19DVEwJCQkoMHhjMDA5IDw8IDIpCisjZGVmaW5lIFNUUwkJCQkoMHhjMDBGIDw8IDIpCisjZGVmaW5lIFBIWV9JU09fQ01OX0NUUkwJCSgweGMwMTAgPDwgMikKKyNkZWZpbmUgUEhZX0RQX1RYX0NUTAkJCSgweGM0MDggPDwgMikKKyNkZWZpbmUgUE1BX0NNTl9DVFJMMQkJCSgweGM4MDAgPDwgMikKKyNkZWZpbmUgUEhZX1BNQV9JU09fQ01OX0NUUkwJCSgweGM4MTAgPDwgMikKKyNkZWZpbmUgUEhZX0lTT0xBVElPTl9DVFJMCQkoMHhjODFmIDw8IDIpCisjZGVmaW5lIFBIWV9QTUFfSVNPX1hDVlJfQ1RSTChuKQkoKDB4Y2MxMSB8ICgobikgPDwgNikpIDw8IDIpCisjZGVmaW5lIFBIWV9QTUFfSVNPX0xJTktfTU9ERShuKQkoKDB4Y2MxMiB8ICgobikgPDwgNikpIDw8IDIpCisjZGVmaW5lIFBIWV9QTUFfSVNPX1BXUlNUX0NUUkwobikJKCgweGNjMTMgfCAoKG4pIDw8IDYpKSA8PCAyKQorI2RlZmluZSBQSFlfUE1BX0lTT19UWF9EQVRBX0xPKG4pCSgoMHhjYzE0IHwgKChuKSA8PCA2KSkgPDwgMikKKyNkZWZpbmUgUEhZX1BNQV9JU09fVFhfREFUQV9ISShuKQkoKDB4Y2MxNSB8ICgobikgPDwgNikpIDw8IDIpCisjZGVmaW5lIFBIWV9QTUFfSVNPX1JYX0RBVEFfTE8obikJKCgweGNjMTYgfCAoKG4pIDw8IDYpKSA8PCAyKQorI2RlZmluZSBQSFlfUE1BX0lTT19SWF9EQVRBX0hJKG4pCSgoMHhjYzE3IHwgKChuKSA8PCA2KSkgPDwgMikKKyNkZWZpbmUgVFhfQklTVF9DVFJMKG4pCQkJKCgweDQxNDAgfCAoKG4pIDw8IDkpKSA8PCAyKQorI2RlZmluZSBUWF9CSVNUX1VERFdSKG4pCQkoKDB4NDE0MSB8ICgobikgPDwgOSkpIDw8IDIpCisKKy8qCisgKiBTZWxlY3RzIHdoaWNoIFBMTCBjbG9jayB3aWxsIGJlIGRyaXZlbiBvbiB0aGUgYW5hbG9nIGhpZ2ggc3BlZWQKKyAqIGNsb2NrIDA6IFBMTCAwIGRpdiAxCisgKiBjbG9jayAxOiBQTEwgMSBkaXYgMgorICovCisjZGVmaW5lIENMS19QTExfQ09ORklHCQkJMFgzMAorI2RlZmluZSBDTEtfUExMX01BU0sJCQkweDMzCisKKyNkZWZpbmUgQ01OX1JFQURZCQkJQklUKDApCisKKyNkZWZpbmUgRFBfUExMX0NMT0NLX0VOQUJMRQkJQklUKDIpCisjZGVmaW5lIERQX1BMTF9FTkFCTEUJCQlCSVQoMCkKKyNkZWZpbmUgRFBfUExMX0RBVEFfUkFURV9SQlIJCSgoMiA8PCAxMikgfCAoNCA8PCA4KSkKKyNkZWZpbmUgRFBfUExMX0RBVEFfUkFURV9IQlIJCSgoMiA8PCAxMikgfCAoNCA8PCA4KSkKKyNkZWZpbmUgRFBfUExMX0RBVEFfUkFURV9IQlIyCQkoKDEgPDwgMTIpIHwgKDIgPDwgOCkpCisKKyNkZWZpbmUgRFBfTU9ERV9BMAkJCUJJVCg0KQorI2RlZmluZSBEUF9NT0RFX0EyCQkJQklUKDYpCisjZGVmaW5lIERQX01PREVfRU5URVJfQTAJCTB4YzEwMQorI2RlZmluZSBEUF9NT0RFX0VOVEVSX0EyCQkweGMxMDQKKworI2RlZmluZSBQSFlfTU9ERV9TRVRfVElNRU9VVAkJMTAwMDAwCisKKyNkZWZpbmUgUElOX0FTU0lHTl9DX0UJCQkweDUxZDkKKyNkZWZpbmUgUElOX0FTU0lHTl9EX0YJCQkweDUxMDAKKworI2RlZmluZSBNT0RFX0RJU0NPTk5FQ1QJCQkwCisjZGVmaW5lIE1PREVfVUZQX1VTQgkJCUJJVCgwKQorI2RlZmluZSBNT0RFX0RGUF9VU0IJCQlCSVQoMSkKKyNkZWZpbmUgTU9ERV9ERlBfRFAJCQlCSVQoMikKKworc3RydWN0IHVzYjNwaHlfcmVnIHsKKwl1MzIgb2Zmc2V0OworCXUzMiBlbmFibGVfYml0OworCXUzMiB3cml0ZV9lbmFibGU7Cit9OworCitzdHJ1Y3Qgcm9ja2NoaXBfdXNiM3BoeV9wb3J0X2NmZyB7CisJc3RydWN0IHVzYjNwaHlfcmVnIHR5cGVjX2Nvbm5fZGlyOworCXN0cnVjdCB1c2IzcGh5X3JlZyB1c2IzdG91c2IyX2VuOworCXN0cnVjdCB1c2IzcGh5X3JlZyBleHRlcm5hbF9wc207CisJc3RydWN0IHVzYjNwaHlfcmVnIHBpcGVfc3RhdHVzOworfTsKKworc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgZXh0Y29uX2RldiAqZXh0Y29uOworCXN0cnVjdCByZWdtYXAgKmdyZl9yZWdzOworCXN0cnVjdCBjbGsgKmNsa19jb3JlOworCXN0cnVjdCBjbGsgKmNsa19yZWY7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnVwaHlfcnN0OworCXN0cnVjdCByZXNldF9jb250cm9sICpwaXBlX3JzdDsKKwlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqdGNwaHlfcnN0OworCXN0cnVjdCByb2NrY2hpcF91c2IzcGh5X3BvcnRfY2ZnIHBvcnRfY2ZnczsKKwkvKiBtdXRleCB0byBwcm90ZWN0IGFjY2VzcyB0byBpbmRpdmlkdWFsIFBIWXMgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKworCWJvb2wgZmxpcDsKKwl1OCBtb2RlOworfTsKKworc3RydWN0IHBoeV9yZWcgeworCXUxNiB2YWx1ZTsKKwl1MzIgYWRkcjsKK307CisKK3N0cnVjdCBwaHlfcmVnIHVzYjNfcGxsX2NmZ1tdID0geworCXsgMHhmMCwJCUNNTl9QTEwwX1ZDT0NBTF9JTklUIH0sCisJeyAweDE4LAkJQ01OX1BMTDBfVkNPQ0FMX0lURVIgfSwKKwl7IDB4ZDAsCQlDTU5fUExMMF9JTlRESVYgfSwKKwl7IDB4NGE0YSwJQ01OX1BMTDBfRlJBQ0RJViB9LAorCXsgMHgzNCwJCUNNTl9QTEwwX0hJR0hfVEhSIH0sCisJeyAweDFlZSwJQ01OX1BMTDBfU1NfQ1RSTDEgfSwKKwl7IDB4N2YwMywJQ01OX1BMTDBfU1NfQ1RSTDIgfSwKKwl7IDB4MjAsCQlDTU5fUExMMF9EU01fRElBRyB9LAorCXsgMCwJCUNNTl9ESUFHX1BMTDBfT1ZSRCB9LAorCXsgMCwJCUNNTl9ESUFHX1BMTDBfRkJIX09WUkQgfSwKKwl7IDAsCQlDTU5fRElBR19QTEwwX0ZCTF9PVlJEIH0sCisJeyAweDcsCQlDTU5fRElBR19QTEwwX1YySV9UVU5FIH0sCisJeyAweDQ1LAkJQ01OX0RJQUdfUExMMF9DUF9UVU5FIH0sCisJeyAweDgsCQlDTU5fRElBR19QTEwwX0xGX1BST0cgfSwKK307CisKK3N0cnVjdCBwaHlfcmVnIGRwX3BsbF9jZmdbXSA9IHsKKwl7IDB4ZjAsCQlDTU5fUExMMV9WQ09DQUxfSU5JVCB9LAorCXsgMHgxOCwJCUNNTl9QTEwxX1ZDT0NBTF9JVEVSIH0sCisJeyAweDMwYjksCUNNTl9QTEwxX1ZDT0NBTF9TVEFSVCB9LAorCXsgMHgyMWMsCUNNTl9QTEwxX0lOVERJViB9LAorCXsgMCwJCUNNTl9QTEwxX0ZSQUNESVYgfSwKKwl7IDB4NSwJCUNNTl9QTEwxX0hJR0hfVEhSIH0sCisJeyAweDM1LAkJQ01OX1BMTDFfU1NfQ1RSTDEgfSwKKwl7IDB4N2YxZSwJQ01OX1BMTDFfU1NfQ1RSTDIgfSwKKwl7IDB4MjAsCQlDTU5fUExMMV9EU01fRElBRyB9LAorCXsgMCwJCUNNTl9QTExTTTFfVVNFUl9ERUZfQ1RSTCB9LAorCXsgMCwJCUNNTl9ESUFHX1BMTDFfT1ZSRCB9LAorCXsgMCwJCUNNTl9ESUFHX1BMTDFfRkJIX09WUkQgfSwKKwl7IDAsCQlDTU5fRElBR19QTEwxX0ZCTF9PVlJEIH0sCisJeyAweDYsCQlDTU5fRElBR19QTEwxX1YySV9UVU5FIH0sCisJeyAweDQ1LAkJQ01OX0RJQUdfUExMMV9DUF9UVU5FIH0sCisJeyAweDgsCQlDTU5fRElBR19QTEwxX0xGX1BST0cgfSwKKwl7IDB4MTAwLAlDTU5fRElBR19QTEwxX1BUQVRJU19UVU5FMSB9LAorCXsgMHg3LAkJQ01OX0RJQUdfUExMMV9QVEFUSVNfVFVORTIgfSwKKwl7IDB4NCwJCUNNTl9ESUFHX1BMTDFfSU5DTEtfQ1RSTCB9LAorfTsKKworc3RhdGljIHZvaWQgdGNwaHlfY2ZnXzI0bShzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSkKK3sKKwl1MzIgaSwgcmRhdGE7CisKKwkvKgorCSAqIGNtbl9yZWZfY2xrX3NlbCA9IDMsIHNlbGVjdCB0aGUgMjRNaHogZm9yIGNsayBwYXJlbnQKKwkgKiBjbW5fcHNtX2Nsa19kaWdfZGl2ID0gMiwgc2V0IHRoZSBjbGsgZGl2aXNpb24gdG8gMgorCSAqLworCXdyaXRlbCgweDgzMCwgdGNwaHktPmJhc2UgKyBQTUFfQ01OX0NUUkwxKTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCS8qCisJCSAqIFRoZSBmb2xsb3dpbmcgUEhZIGNvbmZpZ3VyYXRpb24gYXNzdW1lcyBhIDI0IE1IeiByZWZlcmVuY2UKKwkJICogY2xvY2suCisJCSAqLworCQl3cml0ZWwoMHg5MCwgdGNwaHktPmJhc2UgKyBYQ1ZSX0RJQUdfTEFORV9GQ01fRU5fTUdOKGkpKTsKKwkJd3JpdGVsKDB4OTYwLCB0Y3BoeS0+YmFzZSArIFRYX1JDVkRFVF9FTl9UTVIoaSkpOworCQl3cml0ZWwoMHgzMCwgdGNwaHktPmJhc2UgKyBUWF9SQ1ZERVRfU1RfVE1SKGkpKTsKKwl9CisKKwlyZGF0YSA9IHJlYWRsKHRjcGh5LT5iYXNlICsgQ01OX0RJQUdfSFNDTEtfU0VMKTsKKwlyZGF0YSAmPSB+Q0xLX1BMTF9NQVNLOworCXJkYXRhIHw9IENMS19QTExfQ09ORklHOworCXdyaXRlbChyZGF0YSwgdGNwaHktPmJhc2UgKyBDTU5fRElBR19IU0NMS19TRUwpOworfQorCitzdGF0aWMgdm9pZCB0Y3BoeV9jZmdfdXNiM19wbGwoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkpCit7CisJdTMyIGk7CisKKwkvKiBsb2FkIHRoZSBjb25maWd1cmF0aW9uIG9mIFBMTDAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh1c2IzX3BsbF9jZmcpOyBpKyspCisJCXdyaXRlbCh1c2IzX3BsbF9jZmdbaV0udmFsdWUsCisJCSAgICAgICB0Y3BoeS0+YmFzZSArIHVzYjNfcGxsX2NmZ1tpXS5hZGRyKTsKK30KKworc3RhdGljIHZvaWQgdGNwaHlfY2ZnX2RwX3BsbChzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSkKK3sKKwl1MzIgaTsKKworCS8qIHNldCB0aGUgZGVmYXVsdCBtb2RlIHRvIFJCUiAqLworCXdyaXRlbChEUF9QTExfQ0xPQ0tfRU5BQkxFIHwgRFBfUExMX0VOQUJMRSB8IERQX1BMTF9EQVRBX1JBVEVfUkJSLAorCSAgICAgICB0Y3BoeS0+YmFzZSArIERQX0NMS19DVEwpOworCisJLyogbG9hZCB0aGUgY29uZmlndXJhdGlvbiBvZiBQTEwxICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHBfcGxsX2NmZyk7IGkrKykKKwkJd3JpdGVsKGRwX3BsbF9jZmdbaV0udmFsdWUsIHRjcGh5LT5iYXNlICsgZHBfcGxsX2NmZ1tpXS5hZGRyKTsKK30KKworc3RhdGljIHZvaWQgdGNwaHlfdHhfdXNiM19jZmdfbGFuZShzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSwgdTMyIGxhbmUpCit7CisJd3JpdGVsKDB4Nzc5OSwgdGNwaHktPmJhc2UgKyBUWF9QU0NfQTAobGFuZSkpOworCXdyaXRlbCgweDc3OTgsIHRjcGh5LT5iYXNlICsgVFhfUFNDX0ExKGxhbmUpKTsKKwl3cml0ZWwoMHg1MDk4LCB0Y3BoeS0+YmFzZSArIFRYX1BTQ19BMihsYW5lKSk7CisJd3JpdGVsKDB4NTA5OCwgdGNwaHktPmJhc2UgKyBUWF9QU0NfQTMobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMDAobGFuZSkpOworCXdyaXRlbCgweGJmLCB0Y3BoeS0+YmFzZSArIFhDVlJfRElBR19CSURJX0NUUkwobGFuZSkpOworfQorCitzdGF0aWMgdm9pZCB0Y3BoeV9yeF91c2IzX2NmZ19sYW5lKHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5LCB1MzIgbGFuZSkKK3sKKwl3cml0ZWwoMHhhNmZkLCB0Y3BoeS0+YmFzZSArIFJYX1BTQ19BMChsYW5lKSk7CisJd3JpdGVsKDB4YTZmZCwgdGNwaHktPmJhc2UgKyBSWF9QU0NfQTEobGFuZSkpOworCXdyaXRlbCgweGE0MTAsIHRjcGh5LT5iYXNlICsgUlhfUFNDX0EyKGxhbmUpKTsKKwl3cml0ZWwoMHgyNDEwLCB0Y3BoeS0+YmFzZSArIFJYX1BTQ19BMyhsYW5lKSk7CisJd3JpdGVsKDB4MjNmZiwgdGNwaHktPmJhc2UgKyBSWF9QU0NfQ0FMKGxhbmUpKTsKKwl3cml0ZWwoMHgxMywgdGNwaHktPmJhc2UgKyBSWF9TSUdERVRfSExfRklMVF9UTVIobGFuZSkpOworCXdyaXRlbCgweDAzZTcsIHRjcGh5LT5iYXNlICsgUlhfUkVFX0NUUkxfREFUQV9NQVNLKGxhbmUpKTsKKwl3cml0ZWwoMHgxMDA0LCB0Y3BoeS0+YmFzZSArIFJYX0RJQUdfU0lHREVUX1RVTkUobGFuZSkpOworCXdyaXRlbCgweDIwMTAsIHRjcGh5LT5iYXNlICsgUlhfUFNDX1JEWShsYW5lKSk7CisJd3JpdGVsKDB4ZmIsIHRjcGh5LT5iYXNlICsgWENWUl9ESUFHX0JJRElfQ1RSTChsYW5lKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRjcGh5X2RwX2NmZ19sYW5lKHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5LCB1MzIgbGFuZSkKK3sKKwl1MTYgcmRhdGE7CisKKwl3cml0ZWwoMHhiZWZjLCB0Y3BoeS0+YmFzZSArIFhDVlJfUFNNX1JDVFJMKGxhbmUpKTsKKwl3cml0ZWwoMHg2Nzk5LCB0Y3BoeS0+YmFzZSArIFRYX1BTQ19BMChsYW5lKSk7CisJd3JpdGVsKDB4Njc5OCwgdGNwaHktPmJhc2UgKyBUWF9QU0NfQTEobGFuZSkpOworCXdyaXRlbCgweDk4LCB0Y3BoeS0+YmFzZSArIFRYX1BTQ19BMihsYW5lKSk7CisJd3JpdGVsKDB4OTgsIHRjcGh5LT5iYXNlICsgVFhfUFNDX0EzKGxhbmUpKTsKKworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMDAobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMDEobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMTAobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8wMTEobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8xMDAobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8xMDEobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8xMTAobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfTUdORlNfTVVMVF8xMTEobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfQ1BPU1RfTVVMVF8xMChsYW5lKSk7CisJd3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgVFhfVFhDQ19DUE9TVF9NVUxUXzAxKGxhbmUpKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9UWENDX0NQT1NUX01VTFRfMDAobGFuZSkpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX1RYQ0NfQ1BPU1RfTVVMVF8xMShsYW5lKSk7CisKKwl3cml0ZWwoMHgxMjgsIHRjcGh5LT5iYXNlICsgVFhfVFhDQ19DQUxfU0NMUl9NVUxUKGxhbmUpKTsKKwl3cml0ZWwoMHg0MDAsIHRjcGh5LT5iYXNlICsgVFhfRElBR19UWF9EUlYobGFuZSkpOworCisJcmRhdGEgPSByZWFkbCh0Y3BoeS0+YmFzZSArIFhDVlJfRElBR19QTExEUkNfQ1RSTChsYW5lKSk7CisJcmRhdGEgPSAocmRhdGEgJiAweDhmZmYpIHwgMHg2MDAwOworCXdyaXRlbChyZGF0YSwgdGNwaHktPmJhc2UgKyBYQ1ZSX0RJQUdfUExMRFJDX0NUUkwobGFuZSkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9wZXJ0eV9lbmFibGUoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHksCisJCQkJICBjb25zdCBzdHJ1Y3QgdXNiM3BoeV9yZWcgKnJlZywgYm9vbCBlbikKK3sKKwl1MzIgbWFzayA9IDEgPDwgcmVnLT53cml0ZV9lbmFibGU7CisJdTMyIHZhbCA9IGVuIDw8IHJlZy0+ZW5hYmxlX2JpdDsKKworCXJldHVybiByZWdtYXBfd3JpdGUodGNwaHktPmdyZl9yZWdzLCByZWctPm9mZnNldCwgdmFsIHwgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIHRjcGh5X2RwX2F1eF9jYWxpYnJhdGlvbihzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSkKK3sKKwl1MTYgcmRhdGEsIHJkYXRhMiwgdmFsOworCisJLyogZGlzYWJsZSB0eGRhX2NhbF9sYXRjaF9lbiBmb3IgcmV3cml0ZSB0aGUgY2FsaWJyYXRpb24gdmFsdWVzICovCisJcmRhdGEgPSByZWFkbCh0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18xKTsKKwl2YWwgPSByZGF0YSAmIDB4ZGZmZjsKKwl3cml0ZWwodmFsLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18xKTsKKworCS8qCisJICogcmVhZCBhIHJlc2lzdG9yIGNhbGlicmF0aW9uIGNvZGUgZnJvbSBDTU5fVFhQVUNBTF9DVFJMWzY6MF0gYW5kCisJICogd3JpdGUgaXQgdG8gVFhfRElHX0NUUkxfUkVHXzJbNjowXSwgYW5kIGRlbGF5IDFtcyB0byBtYWtlIHN1cmUgaXQKKwkgKiB3b3Jrcy4KKwkgKi8KKwlyZGF0YSA9IHJlYWRsKHRjcGh5LT5iYXNlICsgVFhfRElHX0NUUkxfUkVHXzIpOworCXJkYXRhID0gcmRhdGEgJiAweGZmYzA7CisKKwlyZGF0YTIgPSByZWFkbCh0Y3BoeS0+YmFzZSArIENNTl9UWFBVQ0FMX0NUUkwpOworCXJkYXRhMiA9IHJkYXRhMiAmIDB4M2Y7CisKKwl2YWwgPSByZGF0YSB8IHJkYXRhMjsKKwl3cml0ZWwodmFsLCB0Y3BoeS0+YmFzZSArIFRYX0RJR19DVFJMX1JFR18yKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTA1MCk7CisKKwkvKgorCSAqIEVuYWJsZSBzaWduYWwgZm9yIGxhdGNoIHRoYXQgc2FtcGxlIGFuZCBob2xkcyBjYWxpYnJhdGlvbiB2YWx1ZXMuCisJICogQWN0aXZhdGUgdGhpcyBzaWduYWwgZm9yIDEgY2xvY2sgY3ljbGUgdG8gc2FtcGxlIG5ldyBjYWxpYnJhdGlvbgorCSAqIHZhbHVlcy4KKwkgKi8KKwlyZGF0YSA9IHJlYWRsKHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzEpOworCXZhbCA9IHJkYXRhIHwgMHgyMDAwOworCXdyaXRlbCh2YWwsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzEpOworCXVzbGVlcF9yYW5nZSgxNTAsIDIwMCk7CisKKwkvKiBzZXQgVFggVm9sdGFnZSBMZXZlbCBhbmQgVFggRGVlbXBoYXNpcyB0byAwICovCisJd3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgUEhZX0RQX1RYX0NUTCk7CisJLyogcmUtZW5hYmxlIGRlY2FwICovCisJd3JpdGVsKDB4MTAwLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR18yKTsKKwl3cml0ZWwoMHgzMDAsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzIpOworCXdyaXRlbCgweDIwMDgsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzEpOworCXdyaXRlbCgweDIwMTgsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzEpOworCisJd3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzUpOworCisJLyoKKwkgKiBQcm9ncmFtcyB0eGRhX2Rydl9sZG9fcHJvZ1sxNTowXSwgU2V0cyBkcml2ZXIgTERPCisJICogdm9sdGFnZSAxNidoMTAwMSBmb3IgRFAtQVVYLVRYIGFuZCBSWAorCSAqLworCXdyaXRlbCgweDEwMDEsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzQpOworCisJLyogcmUtZW5hYmxlcyBCYW5kZ2FwIHJlZmVyZW5jZSBmb3IgTERPICovCisJd3JpdGVsKDB4MjA5OCwgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMSk7CisJd3JpdGVsKDB4MjE5OCwgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMSk7CisKKwkvKgorCSAqIHJlLWVuYWJsZXMgdGhlIHRyYW5zbWl0dGVyIHByZS1kcml2ZXIsIGRyaXZlciBkYXRhIHNlbGVjdGlvbiBNVVgsCisJICogYW5kIHJlY2VpdmVyIGRldGVjdCBjaXJjdWl0cy4KKwkgKi8KKwl3cml0ZWwoMHgzMDEsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzIpOworCXdyaXRlbCgweDMwMywgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMik7CisKKwkvKgorCSAqIEJJVCAxMjogQ29udHJvbHMgYXV4ZGFfcG9sYXJpdHksIHdoaWNoIHNlbGVjdHMgdGhlIHBvbGFyaXR5IG9mIHRoZQorCSAqIHhjdnI6CisJICogMSwgUmV2ZXJzZXMgdGhlIHBvbGFyaXR5IChJZiBUWVBFQywgUHVsbHMgdXBzIGF1eF9wIGFuZCBwdWxsCisJICogZG93biBhdXhfbSkKKwkgKiAwLCBOb3JtYWwgcG9sYXJpdHkgKGlmIFRZUEVfQywgcHVsbHMgdXAgYXV4X20gYW5kIHB1bGxzIGRvd24KKwkgKiBhdXhfcCkKKwkgKi8KKwl2YWwgPSAweGEwNzg7CisJaWYgKCF0Y3BoeS0+ZmxpcCkKKwkJdmFsIHw9IEJJVCgxMik7CisJd3JpdGVsKHZhbCwgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMSk7CisKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWF9BTkFfQ1RSTF9SRUdfMyk7CisJd3JpdGVsKDAsIHRjcGh5LT5iYXNlICsgVFhfQU5BX0NUUkxfUkVHXzQpOworCXdyaXRlbCgwLCB0Y3BoeS0+YmFzZSArIFRYX0FOQV9DVFJMX1JFR181KTsKKworCS8qCisJICogQ29udHJvbHMgbG93X3Bvd2VyX3N3aW5nX2VuLCBzZXQgdGhlIHZvbHRhZ2Ugc3dpbmcgb2YgdGhlIGRyaXZlcgorCSAqIHRvIDQwMG12LiBUaGUgdmFsdWVzCWJlbG93IGFyZSBwZWFrIHRvIHBlYWsgKGRpZmZlcmVudGlhbCkgdmFsdWVzLgorCSAqLworCXdyaXRlbCg0LCB0Y3BoeS0+YmFzZSArIFRYREFfQ09FRkZfQ0FMQ19DVFJMKTsKKwl3cml0ZWwoMCwgdGNwaHktPmJhc2UgKyBUWERBX0NZQV9BVVhEQV9DWUEpOworCisJLyogQ29udHJvbHMgdHhfaGlnaF96X3RtX2VuICovCisJdmFsID0gcmVhZGwodGNwaHktPmJhc2UgKyBUWF9ESUdfQ1RSTF9SRUdfMik7CisJdmFsIHw9IEJJVCgxNSk7CisJd3JpdGVsKHZhbCwgdGNwaHktPmJhc2UgKyBUWF9ESUdfQ1RSTF9SRUdfMik7Cit9CisKK3N0YXRpYyBpbnQgdGNwaHlfcGh5X2luaXQoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHksIHU4IG1vZGUpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjNwaHlfcG9ydF9jZmcgKmNmZyA9ICZ0Y3BoeS0+cG9ydF9jZmdzOworCWludCByZXQsIGk7CisJdTMyIHZhbDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSh0Y3BoeS0+Y2xrX2NvcmUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycih0Y3BoeS0+ZGV2LCAiRmFpbGVkIHRvIHByZXBhcmVfZW5hYmxlIGNvcmUgY2xvY2tcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSh0Y3BoeS0+Y2xrX3JlZik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHRjcGh5LT5kZXYsICJGYWlsZWQgdG8gcHJlcGFyZV9lbmFibGUgcmVmIGNsb2NrXG4iKTsKKwkJZ290byBlcnJfY2xrX2NvcmU7CisJfQorCisJcmVzZXRfY29udHJvbF9kZWFzc2VydCh0Y3BoeS0+dGNwaHlfcnN0KTsKKworCXByb3BlcnR5X2VuYWJsZSh0Y3BoeSwgJmNmZy0+dHlwZWNfY29ubl9kaXIsIHRjcGh5LT5mbGlwKTsKKworCXRjcGh5X2NmZ18yNG0odGNwaHkpOworCisJaWYgKG1vZGUgPT0gTU9ERV9ERlBfRFApIHsKKwkJdGNwaHlfY2ZnX2RwX3BsbCh0Y3BoeSk7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgaSk7CisKKwkJd3JpdGVsKFBJTl9BU1NJR05fQ19FLCB0Y3BoeS0+YmFzZSArIFBNQV9MQU5FX0NGRyk7CisJfSBlbHNlIHsKKwkJdGNwaHlfY2ZnX3VzYjNfcGxsKHRjcGh5KTsKKwkJdGNwaHlfY2ZnX2RwX3BsbCh0Y3BoeSk7CisJCWlmICh0Y3BoeS0+ZmxpcCkgeworCQkJdGNwaHlfdHhfdXNiM19jZmdfbGFuZSh0Y3BoeSwgMyk7CisJCQl0Y3BoeV9yeF91c2IzX2NmZ19sYW5lKHRjcGh5LCAyKTsKKwkJCXRjcGh5X2RwX2NmZ19sYW5lKHRjcGh5LCAwKTsKKwkJCXRjcGh5X2RwX2NmZ19sYW5lKHRjcGh5LCAxKTsKKwkJfSBlbHNlIHsKKwkJCXRjcGh5X3R4X3VzYjNfY2ZnX2xhbmUodGNwaHksIDApOworCQkJdGNwaHlfcnhfdXNiM19jZmdfbGFuZSh0Y3BoeSwgMSk7CisJCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgMik7CisJCQl0Y3BoeV9kcF9jZmdfbGFuZSh0Y3BoeSwgMyk7CisJCX0KKworCQl3cml0ZWwoUElOX0FTU0lHTl9EX0YsIHRjcGh5LT5iYXNlICsgUE1BX0xBTkVfQ0ZHKTsKKwl9CisKKwl3cml0ZWwoRFBfTU9ERV9FTlRFUl9BMiwgdGNwaHktPmJhc2UgKyBEUF9NT0RFX0NUTCk7CisKKwlyZXNldF9jb250cm9sX2RlYXNzZXJ0KHRjcGh5LT51cGh5X3JzdCk7CisKKwlyZXQgPSByZWFkeF9wb2xsX3RpbWVvdXQocmVhZGwsIHRjcGh5LT5iYXNlICsgUE1BX0NNTl9DVFJMMSwKKwkJCQkgdmFsLCB2YWwgJiBDTU5fUkVBRFksIDEwLAorCQkJCSBQSFlfTU9ERV9TRVRfVElNRU9VVCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycih0Y3BoeS0+ZGV2LCAid2FpdCBwbWEgcmVhZHkgdGltZW91dFxuIik7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gZXJyX3dhaXRfcG1hOworCX0KKworCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQodGNwaHktPnBpcGVfcnN0KTsKKworCXJldHVybiAwOworCitlcnJfd2FpdF9wbWE6CisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnVwaHlfcnN0KTsKKwlyZXNldF9jb250cm9sX2Fzc2VydCh0Y3BoeS0+dGNwaHlfcnN0KTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUodGNwaHktPmNsa19yZWYpOworZXJyX2Nsa19jb3JlOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZSh0Y3BoeS0+Y2xrX2NvcmUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRjcGh5X3BoeV9kZWluaXQoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkpCit7CisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnRjcGh5X3JzdCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnVwaHlfcnN0KTsKKwlyZXNldF9jb250cm9sX2Fzc2VydCh0Y3BoeS0+cGlwZV9yc3QpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZSh0Y3BoeS0+Y2xrX2NvcmUpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZSh0Y3BoeS0+Y2xrX3JlZik7Cit9CisKK3N0YXRpYyBpbnQgdGNwaHlfZ2V0X21vZGUoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkpCit7CisJc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYgPSB0Y3BoeS0+ZXh0Y29uOworCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSBwcm9wZXJ0eTsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJYm9vbCBkZnAsIHVmcCwgZHA7CisJdTggbW9kZTsKKwlpbnQgcmV0OworCisJdWZwID0gZXh0Y29uX2dldF9zdGF0ZShlZGV2LCBFWFRDT05fVVNCKTsKKwlkZnAgPSBleHRjb25fZ2V0X3N0YXRlKGVkZXYsIEVYVENPTl9VU0JfSE9TVCk7CisJZHAgPSBleHRjb25fZ2V0X3N0YXRlKGVkZXYsIEVYVENPTl9ESVNQX0RQKTsKKworCW1vZGUgPSBNT0RFX0RGUF9VU0I7CisJaWQgPSBFWFRDT05fVVNCX0hPU1Q7CisKKwlpZiAodWZwKSB7CisJCW1vZGUgPSBNT0RFX1VGUF9VU0I7CisJCWlkID0gRVhUQ09OX1VTQjsKKwl9IGVsc2UgaWYgKGRwKSB7CisJCW1vZGUgPSBNT0RFX0RGUF9EUDsKKwkJaWQgPSBFWFRDT05fRElTUF9EUDsKKworCQlyZXQgPSBleHRjb25fZ2V0X3Byb3BlcnR5KGVkZXYsIGlkLCBFWFRDT05fUFJPUF9VU0JfU1MsCisJCQkJCSAgJnByb3BlcnR5KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycih0Y3BoeS0+ZGV2LCAiZ2V0IHN1cGVyc3BlZWQgcHJvcGVydHkgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlpZiAocHJvcGVydHkuaW50dmFsKQorCQkJbW9kZSB8PSBNT0RFX0RGUF9VU0I7CisJfQorCisJcmV0ID0gZXh0Y29uX2dldF9wcm9wZXJ0eShlZGV2LCBpZCwgRVhUQ09OX1BST1BfVVNCX1RZUEVDX1BPTEFSSVRZLAorCQkJCSAgJnByb3BlcnR5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIodGNwaHktPmRldiwgImdldCBwb2xhcml0eSBwcm9wZXJ0eSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXRjcGh5LT5mbGlwID0gcHJvcGVydHkuaW50dmFsID8gMSA6IDA7CisKKwlyZXR1cm4gbW9kZTsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IzX3BoeV9wb3dlcl9vbihzdHJ1Y3QgcGh5ICpwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKKwlzdHJ1Y3Qgcm9ja2NoaXBfdXNiM3BoeV9wb3J0X2NmZyAqY2ZnID0gJnRjcGh5LT5wb3J0X2NmZ3M7CisJY29uc3Qgc3RydWN0IHVzYjNwaHlfcmVnICpyZWcgPSAmY2ZnLT5waXBlX3N0YXR1czsKKwlpbnQgdGltZW91dCwgbmV3X21vZGUsIHJldCA9IDA7CisJdTMyIHZhbDsKKworCW11dGV4X2xvY2soJnRjcGh5LT5sb2NrKTsKKworCW5ld19tb2RlID0gdGNwaHlfZ2V0X21vZGUodGNwaHkpOworCWlmIChuZXdfbW9kZSA8IDApIHsKKwkJcmV0ID0gbmV3X21vZGU7CisJCWdvdG8gdW5sb2NrX3JldDsKKwl9CisKKwkvKiBEUC1vbmx5IG1vZGU7IGZhbGwgYmFjayB0byBVU0IyICovCisJaWYgKCEobmV3X21vZGUgJiAoTU9ERV9ERlBfVVNCIHwgTU9ERV9VRlBfVVNCKSkpCisJCWdvdG8gdW5sb2NrX3JldDsKKworCWlmICh0Y3BoeS0+bW9kZSA9PSBuZXdfbW9kZSkKKwkJZ290byB1bmxvY2tfcmV0OworCisJaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVDVCkKKwkJdGNwaHlfcGh5X2luaXQodGNwaHksIG5ld19tb2RlKTsKKworCS8qIHdhaXQgVENQSFkgZm9yIHBpcGUgcmVhZHkgKi8KKwlmb3IgKHRpbWVvdXQgPSAwOyB0aW1lb3V0IDwgMTAwOyB0aW1lb3V0KyspIHsKKwkJcmVnbWFwX3JlYWQodGNwaHktPmdyZl9yZWdzLCByZWctPm9mZnNldCwgJnZhbCk7CisJCWlmICghKHZhbCAmIEJJVChyZWctPmVuYWJsZV9iaXQpKSkgeworCQkJdGNwaHktPm1vZGUgfD0gbmV3X21vZGUgJiAoTU9ERV9ERlBfVVNCIHwgTU9ERV9VRlBfVVNCKTsKKwkJCWdvdG8gdW5sb2NrX3JldDsKKwkJfQorCQl1c2xlZXBfcmFuZ2UoMTAsIDIwKTsKKwl9CisKKwlpZiAodGNwaHktPm1vZGUgPT0gTU9ERV9ESVNDT05ORUNUKQorCQl0Y3BoeV9waHlfZGVpbml0KHRjcGh5KTsKKworCXJldCA9IC1FVElNRURPVVQ7CisKK3VubG9ja19yZXQ6CisJbXV0ZXhfdW5sb2NrKCZ0Y3BoeS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF91c2IzX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisKKwltdXRleF9sb2NrKCZ0Y3BoeS0+bG9jayk7CisKKwlpZiAodGNwaHktPm1vZGUgPT0gTU9ERV9ESVNDT05ORUNUKQorCQlnb3RvIHVubG9jazsKKworCXRjcGh5LT5tb2RlICY9IH4oTU9ERV9VRlBfVVNCIHwgTU9ERV9ERlBfVVNCKTsKKwlpZiAodGNwaHktPm1vZGUgPT0gTU9ERV9ESVNDT05ORUNUKQorCQl0Y3BoeV9waHlfZGVpbml0KHRjcGh5KTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmdGNwaHktPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgcm9ja2NoaXBfdXNiM19waHlfb3BzID0geworCS5wb3dlcl9vbgk9IHJvY2tjaGlwX3VzYjNfcGh5X3Bvd2VyX29uLAorCS5wb3dlcl9vZmYJPSByb2NrY2hpcF91c2IzX3BoeV9wb3dlcl9vZmYsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCByb2NrY2hpcF9kcF9waHlfcG93ZXJfb24oc3RydWN0IHBoeSAqcGh5KQoreworCXN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CisJaW50IG5ld19tb2RlLCByZXQgPSAwOworCXUzMiB2YWw7CisKKwltdXRleF9sb2NrKCZ0Y3BoeS0+bG9jayk7CisKKwluZXdfbW9kZSA9IHRjcGh5X2dldF9tb2RlKHRjcGh5KTsKKwlpZiAobmV3X21vZGUgPCAwKSB7CisJCXJldCA9IG5ld19tb2RlOworCQlnb3RvIHVubG9ja19yZXQ7CisJfQorCisJaWYgKCEobmV3X21vZGUgJiBNT0RFX0RGUF9EUCkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byB1bmxvY2tfcmV0OworCX0KKworCWlmICh0Y3BoeS0+bW9kZSA9PSBuZXdfbW9kZSkKKwkJZ290byB1bmxvY2tfcmV0OworCisJLyoKKwkgKiBJZiB0aGUgUEhZIGhhcyBiZWVuIHBvd2VyIG9uLCBidXQgdGhlIG1vZGUgaXMgbm90IERQIG9ubHkgbW9kZSwKKwkgKiByZS1pbml0IHRoZSBQSFkgZm9yIHNldHRpbmcgYWxsIG9mIDQgbGFuZXMgdG8gRFAuCisJICovCisJaWYgKG5ld19tb2RlID09IE1PREVfREZQX0RQICYmIHRjcGh5LT5tb2RlICE9IE1PREVfRElTQ09OTkVDVCkgeworCQl0Y3BoeV9waHlfZGVpbml0KHRjcGh5KTsKKwkJdGNwaHlfcGh5X2luaXQodGNwaHksIG5ld19tb2RlKTsKKwl9IGVsc2UgaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVDVCkgeworCQl0Y3BoeV9waHlfaW5pdCh0Y3BoeSwgbmV3X21vZGUpOworCX0KKworCXJldCA9IHJlYWR4X3BvbGxfdGltZW91dChyZWFkbCwgdGNwaHktPmJhc2UgKyBEUF9NT0RFX0NUTCwKKwkJCQkgdmFsLCB2YWwgJiBEUF9NT0RFX0EyLCAxMDAwLAorCQkJCSBQSFlfTU9ERV9TRVRfVElNRU9VVCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycih0Y3BoeS0+ZGV2LCAiZmFpbGVkIHRvIHdhaXQgVENQSFkgZW50ZXIgQTJcbiIpOworCQlnb3RvIHBvd2VyX29uX2ZpbmlzaDsKKwl9CisKKwl0Y3BoeV9kcF9hdXhfY2FsaWJyYXRpb24odGNwaHkpOworCisJd3JpdGVsKERQX01PREVfRU5URVJfQTAsIHRjcGh5LT5iYXNlICsgRFBfTU9ERV9DVEwpOworCisJcmV0ID0gcmVhZHhfcG9sbF90aW1lb3V0KHJlYWRsLCB0Y3BoeS0+YmFzZSArIERQX01PREVfQ1RMLAorCQkJCSB2YWwsIHZhbCAmIERQX01PREVfQTAsIDEwMDAsCisJCQkJIFBIWV9NT0RFX1NFVF9USU1FT1VUKTsKKwlpZiAocmV0IDwgMCkgeworCQl3cml0ZWwoRFBfTU9ERV9FTlRFUl9BMiwgdGNwaHktPmJhc2UgKyBEUF9NT0RFX0NUTCk7CisJCWRldl9lcnIodGNwaHktPmRldiwgImZhaWxlZCB0byB3YWl0IFRDUEhZIGVudGVyIEEwXG4iKTsKKwkJZ290byBwb3dlcl9vbl9maW5pc2g7CisJfQorCisJdGNwaHktPm1vZGUgfD0gTU9ERV9ERlBfRFA7CisKK3Bvd2VyX29uX2ZpbmlzaDoKKwlpZiAodGNwaHktPm1vZGUgPT0gTU9ERV9ESVNDT05ORUNUKQorCQl0Y3BoeV9waHlfZGVpbml0KHRjcGh5KTsKK3VubG9ja19yZXQ6CisJbXV0ZXhfdW5sb2NrKCZ0Y3BoeS0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByb2NrY2hpcF9kcF9waHlfcG93ZXJfb2ZmKHN0cnVjdCBwaHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgcm9ja2NoaXBfdHlwZWNfcGh5ICp0Y3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOworCisJbXV0ZXhfbG9jaygmdGNwaHktPmxvY2spOworCisJaWYgKHRjcGh5LT5tb2RlID09IE1PREVfRElTQ09OTkVDVCkKKwkJZ290byB1bmxvY2s7CisKKwl0Y3BoeS0+bW9kZSAmPSB+TU9ERV9ERlBfRFA7CisKKwl3cml0ZWwoRFBfTU9ERV9FTlRFUl9BMiwgdGNwaHktPmJhc2UgKyBEUF9NT0RFX0NUTCk7CisKKwlpZiAodGNwaHktPm1vZGUgPT0gTU9ERV9ESVNDT05ORUNUKQorCQl0Y3BoeV9waHlfZGVpbml0KHRjcGh5KTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmdGNwaHktPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgcm9ja2NoaXBfZHBfcGh5X29wcyA9IHsKKwkucG93ZXJfb24JPSByb2NrY2hpcF9kcF9waHlfcG93ZXJfb24sCisJLnBvd2VyX29mZgk9IHJvY2tjaGlwX2RwX3BoeV9wb3dlcl9vZmYsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCB0Y3BoeV9nZXRfcGFyYW0oc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IHVzYjNwaHlfcmVnICpyZWcsCisJCQkgICBjb25zdCBjaGFyICpuYW1lKQoreworCXUzMiBidWZmZXJbM107CisJaW50IHJldDsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGRldi0+b2Zfbm9kZSwgbmFtZSwgYnVmZmVyLCAzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiQ2FuIG5vdCBwYXJzZSAlc1xuIiwgbmFtZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmVnLT5vZmZzZXQgPSBidWZmZXJbMF07CisJcmVnLT5lbmFibGVfYml0ID0gYnVmZmVyWzFdOworCXJlZy0+d3JpdGVfZW5hYmxlID0gYnVmZmVyWzJdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjcGh5X3BhcnNlX2R0KHN0cnVjdCByb2NrY2hpcF90eXBlY19waHkgKnRjcGh5LAorCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjNwaHlfcG9ydF9jZmcgKmNmZyA9ICZ0Y3BoeS0+cG9ydF9jZmdzOworCWludCByZXQ7CisKKwlyZXQgPSB0Y3BoeV9nZXRfcGFyYW0oZGV2LCAmY2ZnLT50eXBlY19jb25uX2RpciwKKwkJCSAgICAgICJyb2NrY2hpcCx0eXBlYy1jb25uLWRpciIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0Y3BoeV9nZXRfcGFyYW0oZGV2LCAmY2ZnLT51c2IzdG91c2IyX2VuLAorCQkJICAgICAgInJvY2tjaGlwLHVzYjN0b3VzYjItZW4iKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gdGNwaHlfZ2V0X3BhcmFtKGRldiwgJmNmZy0+ZXh0ZXJuYWxfcHNtLAorCQkJICAgICAgInJvY2tjaGlwLGV4dGVybmFsLXBzbSIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0Y3BoeV9nZXRfcGFyYW0oZGV2LCAmY2ZnLT5waXBlX3N0YXR1cywKKwkJCSAgICAgICJyb2NrY2hpcCxwaXBlLXN0YXR1cyIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl0Y3BoeS0+Z3JmX3JlZ3MgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKGRldi0+b2Zfbm9kZSwKKwkJCQkJCQkgICJyb2NrY2hpcCxncmYiKTsKKwlpZiAoSVNfRVJSKHRjcGh5LT5ncmZfcmVncykpIHsKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgZmluZCBncmYgZHQgbm9kZVxuIik7CisJCXJldHVybiBQVFJfRVJSKHRjcGh5LT5ncmZfcmVncyk7CisJfQorCisJdGNwaHktPmNsa19jb3JlID0gZGV2bV9jbGtfZ2V0KGRldiwgInRjcGRjb3JlIik7CisJaWYgKElTX0VSUih0Y3BoeS0+Y2xrX2NvcmUpKSB7CisJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGdldCB1cGh5IGNvcmUgY2xvY2tcbiIpOworCQlyZXR1cm4gUFRSX0VSUih0Y3BoeS0+Y2xrX2NvcmUpOworCX0KKworCXRjcGh5LT5jbGtfcmVmID0gZGV2bV9jbGtfZ2V0KGRldiwgInRjcGRwaHktcmVmIik7CisJaWYgKElTX0VSUih0Y3BoeS0+Y2xrX3JlZikpIHsKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgZ2V0IHVwaHkgcmVmIGNsb2NrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodGNwaHktPmNsa19yZWYpOworCX0KKworCXRjcGh5LT51cGh5X3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAidXBoeSIpOworCWlmIChJU19FUlIodGNwaHktPnVwaHlfcnN0KSkgeworCQlkZXZfZXJyKGRldiwgIm5vIHVwaHlfcnN0IHJlc2V0IGNvbnRyb2wgZm91bmRcbiIpOworCQlyZXR1cm4gUFRSX0VSUih0Y3BoeS0+dXBoeV9yc3QpOworCX0KKworCXRjcGh5LT5waXBlX3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAidXBoeS1waXBlIik7CisJaWYgKElTX0VSUih0Y3BoeS0+cGlwZV9yc3QpKSB7CisJCWRldl9lcnIoZGV2LCAibm8gcGlwZV9yc3QgcmVzZXQgY29udHJvbCBmb3VuZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHRjcGh5LT5waXBlX3JzdCk7CisJfQorCisJdGNwaHktPnRjcGh5X3JzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAidXBoeS10Y3BoeSIpOworCWlmIChJU19FUlIodGNwaHktPnRjcGh5X3JzdCkpIHsKKwkJZGV2X2VycihkZXYsICJubyB0Y3BoeV9yc3QgcmVzZXQgY29udHJvbCBmb3VuZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHRjcGh5LT50Y3BoeV9yc3QpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0eXBlY19waHlfcHJlX2luaXQoc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYjNwaHlfcG9ydF9jZmcgKmNmZyA9ICZ0Y3BoeS0+cG9ydF9jZmdzOworCisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnRjcGh5X3JzdCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQodGNwaHktPnVwaHlfcnN0KTsKKwlyZXNldF9jb250cm9sX2Fzc2VydCh0Y3BoeS0+cGlwZV9yc3QpOworCisJLyogc2VsZWN0IGV4dGVybmFsIHBzbSBjbG9jayAqLworCXByb3BlcnR5X2VuYWJsZSh0Y3BoeSwgJmNmZy0+ZXh0ZXJuYWxfcHNtLCAxKTsKKwlwcm9wZXJ0eV9lbmFibGUodGNwaHksICZjZmctPnVzYjN0b3VzYjJfZW4sIDApOworCisJdGNwaHktPm1vZGUgPSBNT0RFX0RJU0NPTk5FQ1Q7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdHlwZWNfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGRfbnA7CisJc3RydWN0IHJvY2tjaGlwX3R5cGVjX3BoeSAqdGNwaHk7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwl0Y3BoeSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqdGNwaHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRjcGh5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJdGNwaHktPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIodGNwaHktPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUih0Y3BoeS0+YmFzZSk7CisKKwlyZXQgPSB0Y3BoeV9wYXJzZV9kdCh0Y3BoeSwgZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdGNwaHktPmRldiA9IGRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB0Y3BoeSk7CisJbXV0ZXhfaW5pdCgmdGNwaHktPmxvY2spOworCisJdHlwZWNfcGh5X3ByZV9pbml0KHRjcGh5KTsKKworCXRjcGh5LT5leHRjb24gPSBleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRsZShkZXYsIDApOworCWlmIChJU19FUlIodGNwaHktPmV4dGNvbikpIHsKKwkJaWYgKFBUUl9FUlIodGNwaHktPmV4dGNvbikgIT0gLUVQUk9CRV9ERUZFUikKKwkJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBvciBtaXNzaW5nIGV4dGNvblxuIik7CisJCXJldHVybiBQVFJfRVJSKHRjcGh5LT5leHRjb24pOworCX0KKworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisKKwlmb3JfZWFjaF9hdmFpbGFibGVfY2hpbGRfb2Zfbm9kZShucCwgY2hpbGRfbnApIHsKKwkJc3RydWN0IHBoeSAqcGh5OworCisJCWlmICghb2Zfbm9kZV9jbXAoY2hpbGRfbnAtPm5hbWUsICJkcC1wb3J0IikpCisJCQlwaHkgPSBkZXZtX3BoeV9jcmVhdGUoZGV2LCBjaGlsZF9ucCwKKwkJCQkJICAgICAgJnJvY2tjaGlwX2RwX3BoeV9vcHMpOworCQllbHNlIGlmICghb2Zfbm9kZV9jbXAoY2hpbGRfbnAtPm5hbWUsICJ1c2IzLXBvcnQiKSkKKwkJCXBoeSA9IGRldm1fcGh5X2NyZWF0ZShkZXYsIGNoaWxkX25wLAorCQkJCQkgICAgICAmcm9ja2NoaXBfdXNiM19waHlfb3BzKTsKKwkJZWxzZQorCQkJY29udGludWU7CisKKwkJaWYgKElTX0VSUihwaHkpKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgcGh5OiAlc1xuIiwKKwkJCQljaGlsZF9ucC0+bmFtZSk7CisJCQlyZXR1cm4gUFRSX0VSUihwaHkpOworCQl9CisKKwkJcGh5X3NldF9kcnZkYXRhKHBoeSwgdGNwaHkpOworCX0KKworCXBoeV9wcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKGRldiwgb2ZfcGh5X3NpbXBsZV94bGF0ZSk7CisJaWYgKElTX0VSUihwaHlfcHJvdmlkZXIpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHBoeSBwcm92aWRlclxuIik7CisJCXJldHVybiBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfdHlwZWNfcGh5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByb2NrY2hpcF90eXBlY19waHlfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktdHlwZWMtcGh5IiB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2NrY2hpcF90eXBlY19waHlfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9ja2NoaXBfdHlwZWNfcGh5X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gcm9ja2NoaXBfdHlwZWNfcGh5X3Byb2JlLAorCS5yZW1vdmUJCT0gcm9ja2NoaXBfdHlwZWNfcGh5X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAicm9ja2NoaXAtdHlwZWMtcGh5IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gcm9ja2NoaXBfdHlwZWNfcGh5X2R0X2lkcywKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyb2NrY2hpcF90eXBlY19waHlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiQ2hyaXMgWmhvbmcgPHp5d0Byb2NrLWNoaXBzLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIktldmVyIFlhbmcgPGtldmVyLnlhbmdAcm9jay1jaGlwcy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJvY2tjaGlwIFVTQiBUWVBFLUMgUEhZIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXVzYi5jCmluZGV4IDJhNzM4MWYuLjczNDk4N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC11c2IuYworKysgYi9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtdXNiLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiBzdGF0aWMgaW50IGVuYWJsZV91c2JfdWFydDsKIApAQCAtNjQsNiArNjUsNyBAQAogCXN0cnVjdCBjbGtfaHcJY2xrNDgwbV9odzsKIAlzdHJ1Y3QgcGh5CSpwaHk7CiAJYm9vbAkJdWFydF9lbmFibGVkOworCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNldDsKIH07CiAKIHN0YXRpYyBpbnQgcm9ja2NoaXBfdXNiX3BoeV9wb3dlcihzdHJ1Y3Qgcm9ja2NoaXBfdXNiX3BoeSAqcGh5LApAQCAtMTQ0LDkgKzE0NiwyMyBAQAogCXJldHVybiBjbGtfcHJlcGFyZV9lbmFibGUocGh5LT5jbGs0ODBtKTsKIH0KIAorc3RhdGljIGludCByb2NrY2hpcF91c2JfcGh5X3Jlc2V0KHN0cnVjdCBwaHkgKl9waHkpCit7CisJc3RydWN0IHJvY2tjaGlwX3VzYl9waHkgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YShfcGh5KTsKKworCWlmIChwaHktPnJlc2V0KSB7CisJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHBoeS0+cmVzZXQpOworCQl1ZGVsYXkoMTApOworCQlyZXNldF9jb250cm9sX2RlYXNzZXJ0KHBoeS0+cmVzZXQpOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBoeV9vcHMgb3BzID0gewogCS5wb3dlcl9vbgk9IHJvY2tjaGlwX3VzYl9waHlfcG93ZXJfb24sCiAJLnBvd2VyX29mZgk9IHJvY2tjaGlwX3VzYl9waHlfcG93ZXJfb2ZmLAorCS5yZXNldAkJPSByb2NrY2hpcF91c2JfcGh5X3Jlc2V0LAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIH07CiAKQEAgLTE4NSw2ICsyMDEsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJcmtfcGh5LT5yZXNldCA9IG9mX3Jlc2V0X2NvbnRyb2xfZ2V0KGNoaWxkLCAicGh5LXJlc2V0Iik7CisJaWYgKElTX0VSUihya19waHktPnJlc2V0KSkKKwkJcmtfcGh5LT5yZXNldCA9IE5VTEw7CisKIAlya19waHktPnJlZ19vZmZzZXQgPSByZWdfb2Zmc2V0OwogCiAJcmtfcGh5LT5jbGsgPSBvZl9jbGtfZ2V0X2J5X25hbWUoY2hpbGQsICJwaHljbGsiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1zdW40aS11c2IuYyBiL2RyaXZlcnMvcGh5L3BoeS1zdW40aS11c2IuYwppbmRleCAwYTQ1YmM2Li5iOTM0MmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktc3VuNGktdXNiLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LXN1bjRpLXVzYi5jCkBAIC00MCw2ICs0MCw4IEBACiAjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjZGVmaW5lIFJFR19JU0NSCQkJMHgwMApAQCAtNDksNyArNTEsNyBAQAogI2RlZmluZSBSRUdfUEhZQ1RMX0EzMwkJCTB4MTAKICNkZWZpbmUgUkVHX1BIWV9VTktfSDMJCQkweDIwCiAKLSNkZWZpbmUgUkVHX1BNVV9VTktfSDMJCQkweDEwCisjZGVmaW5lIFJFR19QTVVfVU5LMQkJCTB4MTAKIAogI2RlZmluZSBQSFlDVExfREFUQQkJCUJJVCg3KQogCkBAIC05Nyw2ICs5OSw3IEBACiAJc3VuNmlfYTMxX3BoeSwKIAlzdW44aV9hMzNfcGh5LAogCXN1bjhpX2gzX3BoeSwKKwlzdW41MGlfYTY0X3BoeSwKIH07CiAKIHN0cnVjdCBzdW40aV91c2JfcGh5X2NmZyB7CkBAIC0xMDUsMTIgKzEwOCwxNCBAQAogCXUzMiBkaXNjX3RocmVzaDsKIAl1OCBwaHljdGxfb2Zmc2V0OwogCWJvb2wgZGVkaWNhdGVkX2Nsb2NrczsKKwlib29sIGVuYWJsZV9wbXVfdW5rMTsKIH07CiAKIHN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgewogCXZvaWQgX19pb21lbSAqYmFzZTsKIAljb25zdCBzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9jZmcgKmNmZzsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJZW51bSB1c2JfZHJfbW9kZSBkcl9tb2RlOworCXNwaW5sb2NrX3QgcmVnX2xvY2s7IC8qIGd1YXJkIGFjY2VzcyB0byBwaHljdGwgcmVnICovCiAJc3RydWN0IHN1bjRpX3VzYl9waHkgewogCQlzdHJ1Y3QgcGh5ICpwaHk7CiAJCXZvaWQgX19pb21lbSAqcG11OwpAQCAtMTI4LDYgKzEzMyw3IEBACiAJc3RydWN0IHBvd2VyX3N1cHBseSAqdmJ1c19wb3dlcl9zdXBwbHk7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHZidXNfcG93ZXJfbmI7CiAJYm9vbCB2YnVzX3Bvd2VyX25iX3JlZ2lzdGVyZWQ7CisJYm9vbCBmb3JjZV9zZXNzaW9uX2VuZDsKIAlpbnQgaWRfZGV0X2lycTsKIAlpbnQgdmJ1c19kZXRfaXJxOwogCWludCBpZF9kZXQ7CkBAIC0xNzYsMTIgKzE4MiwxNCBAQAogCXN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgKnBoeV9kYXRhID0gdG9fc3VuNGlfdXNiX3BoeV9kYXRhKHBoeSk7CiAJdTMyIHRlbXAsIHVzYmNfYml0ID0gQklUKHBoeS0+aW5kZXggKiAyKTsKIAl2b2lkIF9faW9tZW0gKnBoeWN0bCA9IHBoeV9kYXRhLT5iYXNlICsgcGh5X2RhdGEtPmNmZy0+cGh5Y3RsX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCi0JbXV0ZXhfbG9jaygmcGh5X2RhdGEtPm11dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGh5X2RhdGEtPnJlZ19sb2NrLCBmbGFncyk7CiAKLQlpZiAocGh5X2RhdGEtPmNmZy0+dHlwZSA9PSBzdW44aV9hMzNfcGh5KSB7Ci0JCS8qIEEzMyBuZWVkcyB1cyB0byBzZXQgcGh5Y3RsIHRvIDAgZXhwbGljaXRseSAqLworCWlmIChwaHlfZGF0YS0+Y2ZnLT50eXBlID09IHN1bjhpX2EzM19waHkgfHwKKwkgICAgcGh5X2RhdGEtPmNmZy0+dHlwZSA9PSBzdW41MGlfYTY0X3BoeSkgeworCQkvKiBBMzMgb3IgQTY0IG5lZWRzIHVzIHRvIHNldCBwaHljdGwgdG8gMCBleHBsaWNpdGx5ICovCiAJCXdyaXRlbCgwLCBwaHljdGwpOwogCX0KIApAQCAtMjE1LDcgKzIyMyw4IEBACiAKIAkJZGF0YSA+Pj0gMTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZwaHlfZGF0YS0+bXV0ZXgpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGh5X2RhdGEtPnJlZ19sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHN1bjRpX3VzYl9waHlfcGFzc2J5KHN0cnVjdCBzdW40aV91c2JfcGh5ICpwaHksIGludCBlbmFibGUpCkBAIC0yNTUsMTQgKzI2NCwxNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCWlmIChkYXRhLT5jZmctPmVuYWJsZV9wbXVfdW5rMSkgeworCQl2YWwgPSByZWFkbChwaHktPnBtdSArIFJFR19QTVVfVU5LMSk7CisJCXdyaXRlbCh2YWwgJiB+MiwgcGh5LT5wbXUgKyBSRUdfUE1VX1VOSzEpOworCX0KKwogCWlmIChkYXRhLT5jZmctPnR5cGUgPT0gc3VuOGlfaDNfcGh5KSB7CiAJCWlmIChwaHktPmluZGV4ID09IDApIHsKIAkJCXZhbCA9IHJlYWRsKGRhdGEtPmJhc2UgKyBSRUdfUEhZX1VOS19IMyk7CiAJCQl3cml0ZWwodmFsICYgfjEsIGRhdGEtPmJhc2UgKyBSRUdfUEhZX1VOS19IMyk7CiAJCX0KLQotCQl2YWwgPSByZWFkbChwaHktPnBtdSArIFJFR19QTVVfVU5LX0gzKTsKLQkJd3JpdGVsKHZhbCAmIH4yLCBwaHktPnBtdSArIFJFR19QTVVfVU5LX0gzKTsKIAl9IGVsc2UgewogCQkvKiBFbmFibGUgVVNCIDQ1IE9obSByZXNpc3RvciBjYWxpYnJhdGlvbiAqLwogCQlpZiAocGh5LT5pbmRleCA9PSAwKQpAQCAtMjg1LDE2ICsyOTYsMTAgQEAKIAkJc3VuNGlfdXNiX3BoeTBfdXBkYXRlX2lzY3IoX3BoeSwgMCwgSVNDUl9EUERNX1BVTExVUF9FTik7CiAJCXN1bjRpX3VzYl9waHkwX3VwZGF0ZV9pc2NyKF9waHksIDAsIElTQ1JfSURfUFVMTFVQX0VOKTsKIAotCQlpZiAoZGF0YS0+aWRfZGV0X2dwaW8pIHsKLQkJCS8qIE9URyBtb2RlLCBmb3JjZSBJU0NSIGFuZCBjYWJsZSBzdGF0ZSB1cGRhdGVzICovCi0JCQlkYXRhLT5pZF9kZXQgPSAtMTsKLQkJCWRhdGEtPnZidXNfZGV0ID0gLTE7Ci0JCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3dxLCAmZGF0YS0+ZGV0ZWN0LCAwKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEhvc3Qgb25seSBtb2RlICovCi0JCQlzdW40aV91c2JfcGh5MF9zZXRfaWRfZGV0ZWN0KF9waHksIDApOwotCQkJc3VuNGlfdXNiX3BoeTBfc2V0X3ZidXNfZGV0ZWN0KF9waHksIDEpOwotCQl9CisJCS8qIEZvcmNlIElTQ1IgYW5kIGNhYmxlIHN0YXRlIHVwZGF0ZXMgKi8KKwkJZGF0YS0+aWRfZGV0ID0gLTE7CisJCWRhdGEtPnZidXNfZGV0ID0gLTE7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fd3EsICZkYXRhLT5kZXRlY3QsIDApOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzE5LDYgKzMyNCwyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN1bjRpX3VzYl9waHkwX2dldF9pZF9kZXQoc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSAqZGF0YSkKK3sKKwlzd2l0Y2ggKGRhdGEtPmRyX21vZGUpIHsKKwljYXNlIFVTQl9EUl9NT0RFX09URzoKKwkJaWYgKGRhdGEtPmlkX2RldF9ncGlvKQorCQkJcmV0dXJuIGdwaW9kX2dldF92YWx1ZV9jYW5zbGVlcChkYXRhLT5pZF9kZXRfZ3Bpbyk7CisJCWVsc2UKKwkJCXJldHVybiAxOyAvKiBGYWxsYmFjayB0byBwZXJpcGhlcmFsIG1vZGUgKi8KKwljYXNlIFVTQl9EUl9NT0RFX0hPU1Q6CisJCXJldHVybiAwOworCWNhc2UgVVNCX0RSX01PREVfUEVSSVBIRVJBTDoKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgc3VuNGlfdXNiX3BoeTBfZ2V0X3ZidXNfZGV0KHN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgKmRhdGEpCiB7CiAJaWYgKGRhdGEtPnZidXNfZGV0X2dwaW8pCkBAIC0zNzIsOCArMzkzLDEwIEBACiAKIAkvKiBGb3IgcGh5MCBvbmx5IHR1cm4gb24gVmJ1cyBpZiB3ZSBkb24ndCBoYXZlIGFuIGV4dC4gVmJ1cyAqLwogCWlmIChwaHktPmluZGV4ID09IDAgJiYgc3VuNGlfdXNiX3BoeTBfaGF2ZV92YnVzX2RldChkYXRhKSAmJgotCQkJCWRhdGEtPnZidXNfZGV0KQorCQkJCWRhdGEtPnZidXNfZGV0KSB7CisJCWRldl93YXJuKCZfcGh5LT5kZXYsICJFeHRlcm5hbCB2YnVzIGRldGVjdGVkLCBub3QgZW5hYmxpbmcgb3VyIG93biB2YnVzXG4iKTsKIAkJcmV0dXJuIDA7CisJfQogCiAJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShwaHktPnZidXMpOwogCWlmIChyZXQpCkBAIC00MDksNiArNDMyLDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc3VuNGlfdXNiX3BoeV9zZXRfbW9kZShzdHJ1Y3QgcGh5ICpfcGh5LCBlbnVtIHBoeV9tb2RlIG1vZGUpCit7CisJc3RydWN0IHN1bjRpX3VzYl9waHkgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YShfcGh5KTsKKwlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9kYXRhICpkYXRhID0gdG9fc3VuNGlfdXNiX3BoeV9kYXRhKHBoeSk7CisKKwlpZiAocGh5LT5pbmRleCAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgUEhZX01PREVfVVNCX0hPU1Q6CisJCWRhdGEtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9IT1NUOworCQlicmVhazsKKwljYXNlIFBIWV9NT0RFX1VTQl9ERVZJQ0U6CisJCWRhdGEtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9QRVJJUEhFUkFMOworCQlicmVhazsKKwljYXNlIFBIWV9NT0RFX1VTQl9PVEc6CisJCWRhdGEtPmRyX21vZGUgPSBVU0JfRFJfTU9ERV9PVEc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9pbmZvKCZfcGh5LT5kZXYsICJDaGFuZ2luZyBkcl9tb2RlIHRvICVkXG4iLCAoaW50KWRhdGEtPmRyX21vZGUpOworCWRhdGEtPmZvcmNlX3Nlc3Npb25fZW5kID0gdHJ1ZTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3dxLCAmZGF0YS0+ZGV0ZWN0LCAwKTsKKworCXJldHVybiAwOworfQorCiB2b2lkIHN1bjRpX3VzYl9waHlfc2V0X3NxdWVsY2hfZGV0ZWN0KHN0cnVjdCBwaHkgKl9waHksIGJvb2wgZW5hYmxlZCkKIHsKIAlzdHJ1Y3Qgc3VuNGlfdXNiX3BoeSAqcGh5ID0gcGh5X2dldF9kcnZkYXRhKF9waHkpOwpAQCAtNDIyLDYgKzQ3NCw3IEBACiAJLmV4aXQJCT0gc3VuNGlfdXNiX3BoeV9leGl0LAogCS5wb3dlcl9vbgk9IHN1bjRpX3VzYl9waHlfcG93ZXJfb24sCiAJLnBvd2VyX29mZgk9IHN1bjRpX3VzYl9waHlfcG93ZXJfb2ZmLAorCS5zZXRfbW9kZQk9IHN1bjRpX3VzYl9waHlfc2V0X21vZGUsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKIApAQCAtNDMwLDkgKzQ4MywxMyBAQAogCXN0cnVjdCBzdW40aV91c2JfcGh5X2RhdGEgKmRhdGEgPQogCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHN1bjRpX3VzYl9waHlfZGF0YSwgZGV0ZWN0LndvcmspOwogCXN0cnVjdCBwaHkgKnBoeTAgPSBkYXRhLT5waHlzWzBdLnBoeTsKLQlpbnQgaWRfZGV0LCB2YnVzX2RldCwgaWRfbm90aWZ5ID0gMCwgdmJ1c19ub3RpZnkgPSAwOworCWJvb2wgZm9yY2Vfc2Vzc2lvbl9lbmQsIGlkX25vdGlmeSA9IGZhbHNlLCB2YnVzX25vdGlmeSA9IGZhbHNlOworCWludCBpZF9kZXQsIHZidXNfZGV0OwogCi0JaWRfZGV0ID0gZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPmlkX2RldF9ncGlvKTsKKwlpZiAocGh5MCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZF9kZXQgPSBzdW40aV91c2JfcGh5MF9nZXRfaWRfZGV0KGRhdGEpOwogCXZidXNfZGV0ID0gc3VuNGlfdXNiX3BoeTBfZ2V0X3ZidXNfZGV0KGRhdGEpOwogCiAJbXV0ZXhfbG9jaygmcGh5MC0+bXV0ZXgpOwpAQCAtNDQyLDI2ICs0OTksMzAgQEAKIAkJcmV0dXJuOwogCX0KIAorCWZvcmNlX3Nlc3Npb25fZW5kID0gZGF0YS0+Zm9yY2Vfc2Vzc2lvbl9lbmQ7CisJZGF0YS0+Zm9yY2Vfc2Vzc2lvbl9lbmQgPSBmYWxzZTsKKwogCWlmIChpZF9kZXQgIT0gZGF0YS0+aWRfZGV0KSB7Ci0JCS8qCi0JCSAqIFdoZW4gYSBob3N0IGNhYmxlIChpZCA9PSAwKSBnZXRzIHBsdWdnZWQgaW4gb24gc3lzdGVtcwotCQkgKiB3aXRob3V0IHZidXMgZGV0ZWN0aW9uIHJlcG9ydCB2YnVzIGxvdyBmb3IgbG9uZyBlbm91Z2ggZm9yCi0JCSAqIHRoZSBtdXNiLWlwIHRvIGVuZCB0aGUgY3VycmVudCBkZXZpY2Ugc2Vzc2lvbi4KLQkJICovCi0JCWlmICghc3VuNGlfdXNiX3BoeTBfaGF2ZV92YnVzX2RldChkYXRhKSAmJiBpZF9kZXQgPT0gMCkgeworCQkvKiBpZC1jaGFuZ2UsIGZvcmNlIHNlc3Npb24gZW5kIGlmIHdlJ3ZlIG5vIHZidXMgZGV0ZWN0aW9uICovCisJCWlmIChkYXRhLT5kcl9tb2RlID09IFVTQl9EUl9NT0RFX09URyAmJgorCQkgICAgIXN1bjRpX3VzYl9waHkwX2hhdmVfdmJ1c19kZXQoZGF0YSkpCisJCQlmb3JjZV9zZXNzaW9uX2VuZCA9IHRydWU7CisKKwkJLyogV2hlbiBlbnRlcmluZyBob3N0IG1vZGUgKGlkID0gMCkgZm9yY2UgZW5kIHRoZSBzZXNzaW9uIG5vdyAqLworCQlpZiAoZm9yY2Vfc2Vzc2lvbl9lbmQgJiYgaWRfZGV0ID09IDApIHsKIAkJCXN1bjRpX3VzYl9waHkwX3NldF92YnVzX2RldGVjdChwaHkwLCAwKTsKIAkJCW1zbGVlcCgyMDApOwogCQkJc3VuNGlfdXNiX3BoeTBfc2V0X3ZidXNfZGV0ZWN0KHBoeTAsIDEpOwogCQl9CiAJCXN1bjRpX3VzYl9waHkwX3NldF9pZF9kZXRlY3QocGh5MCwgaWRfZGV0KTsKIAkJZGF0YS0+aWRfZGV0ID0gaWRfZGV0OwotCQlpZF9ub3RpZnkgPSAxOworCQlpZF9ub3RpZnkgPSB0cnVlOwogCX0KIAogCWlmICh2YnVzX2RldCAhPSBkYXRhLT52YnVzX2RldCkgewogCQlzdW40aV91c2JfcGh5MF9zZXRfdmJ1c19kZXRlY3QocGh5MCwgdmJ1c19kZXQpOwogCQlkYXRhLT52YnVzX2RldCA9IHZidXNfZGV0OwotCQl2YnVzX25vdGlmeSA9IDE7CisJCXZidXNfbm90aWZ5ID0gdHJ1ZTsKIAl9CiAKIAltdXRleF91bmxvY2soJnBoeTAtPm11dGV4KTsKQEAgLTQ2OSwxMiArNTMwLDggQEAKIAlpZiAoaWRfbm90aWZ5KSB7CiAJCWV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKGRhdGEtPmV4dGNvbiwgRVhUQ09OX1VTQl9IT1NULAogCQkJCQkhaWRfZGV0KTsKLQkJLyoKLQkJICogV2hlbiBhIGhvc3QgY2FibGUgZ2V0cyB1bnBsdWdnZWQgKGlkID09IDEpIG9uIHN5c3RlbXMKLQkJICogd2l0aG91dCB2YnVzIGRldGVjdGlvbiByZXBvcnQgdmJ1cyBsb3cgZm9yIGxvbmcgZW5vdWdoIHRvCi0JCSAqIHRoZSBtdXNiLWlwIHRvIGVuZCB0aGUgY3VycmVudCBob3N0IHNlc3Npb24uCi0JCSAqLwotCQlpZiAoIXN1bjRpX3VzYl9waHkwX2hhdmVfdmJ1c19kZXQoZGF0YSkgJiYgaWRfZGV0ID09IDEpIHsKKwkJLyogV2hlbiBsZWF2aW5nIGhvc3QgbW9kZSBmb3JjZSBlbmQgdGhlIHNlc3Npb24gaGVyZSAqLworCQlpZiAoZm9yY2Vfc2Vzc2lvbl9lbmQgJiYgaWRfZGV0ID09IDEpIHsKIAkJCW11dGV4X2xvY2soJnBoeTAtPm11dGV4KTsKIAkJCXN1bjRpX3VzYl9waHkwX3NldF92YnVzX2RldGVjdChwaHkwLCAwKTsKIAkJCW1zbGVlcCgxMDAwKTsKQEAgLTU2MSw3ICs2MTgsNyBAQAogCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltdXRleF9pbml0KCZkYXRhLT5tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJmRhdGEtPnJlZ19sb2NrKTsKIAlJTklUX0RFTEFZRURfV09SSygmZGF0YS0+ZGV0ZWN0LCBzdW40aV91c2JfcGh5MF9pZF92YnVzX2RldF9zY2FuKTsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBkYXRhKTsKIAlkYXRhLT5jZmcgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTsKQEAgLTU5MywyMyArNjUwLDE2IEBACiAJCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKIAl9CiAKLQkvKiB2YnVzX2RldCB3aXRob3V0IGlkX2RldCBtYWtlcyBubyBzZW5zZSwgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQlpZiAoc3VuNGlfdXNiX3BoeTBfaGF2ZV92YnVzX2RldChkYXRhKSAmJiAhZGF0YS0+aWRfZGV0X2dwaW8pIHsKLQkJZGV2X2VycihkZXYsICJ1c2IwX2lkX2RldCBtaXNzaW5nIG9yIGludmFsaWRcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJZGF0YS0+ZHJfbW9kZSA9IG9mX3VzYl9nZXRfZHJfbW9kZV9ieV9waHkobnAsIDApOwogCi0JaWYgKGRhdGEtPmlkX2RldF9ncGlvKSB7Ci0JCWRhdGEtPmV4dGNvbiA9IGRldm1fZXh0Y29uX2Rldl9hbGxvY2F0ZShkZXYsCi0JCQkJCQkJc3VuNGlfdXNiX3BoeTBfY2FibGUpOwotCQlpZiAoSVNfRVJSKGRhdGEtPmV4dGNvbikpCi0JCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5leHRjb24pOworCWRhdGEtPmV4dGNvbiA9IGRldm1fZXh0Y29uX2Rldl9hbGxvY2F0ZShkZXYsIHN1bjRpX3VzYl9waHkwX2NhYmxlKTsKKwlpZiAoSVNfRVJSKGRhdGEtPmV4dGNvbikpCisJCXJldHVybiBQVFJfRVJSKGRhdGEtPmV4dGNvbik7CiAKLQkJcmV0ID0gZGV2bV9leHRjb25fZGV2X3JlZ2lzdGVyKGRldiwgZGF0YS0+ZXh0Y29uKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0Y29uOiAlZFxuIiwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KKwlyZXQgPSBkZXZtX2V4dGNvbl9kZXZfcmVnaXN0ZXIoZGV2LCBkYXRhLT5leHRjb24pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZXh0Y29uOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+Y2ZnLT5udW1fcGh5czsgaSsrKSB7CkBAIC03MTMsNiArNzYzLDcgQEAKIAkuZGlzY190aHJlc2ggPSAzLAogCS5waHljdGxfb2Zmc2V0ID0gUkVHX1BIWUNUTF9BMTAsCiAJLmRlZGljYXRlZF9jbG9ja3MgPSBmYWxzZSwKKwkuZW5hYmxlX3BtdV91bmsxID0gZmFsc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX3VzYl9waHlfY2ZnIHN1bjVpX2ExM19jZmcgPSB7CkBAIC03MjEsNiArNzcyLDcgQEAKIAkuZGlzY190aHJlc2ggPSAyLAogCS5waHljdGxfb2Zmc2V0ID0gUkVHX1BIWUNUTF9BMTAsCiAJLmRlZGljYXRlZF9jbG9ja3MgPSBmYWxzZSwKKwkuZW5hYmxlX3BtdV91bmsxID0gZmFsc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX3VzYl9waHlfY2ZnIHN1bjZpX2EzMV9jZmcgPSB7CkBAIC03MjksNiArNzgxLDcgQEAKIAkuZGlzY190aHJlc2ggPSAzLAogCS5waHljdGxfb2Zmc2V0ID0gUkVHX1BIWUNUTF9BMTAsCiAJLmRlZGljYXRlZF9jbG9ja3MgPSB0cnVlLAorCS5lbmFibGVfcG11X3VuazEgPSBmYWxzZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9jZmcgc3VuN2lfYTIwX2NmZyA9IHsKQEAgLTczNyw2ICs3OTAsNyBAQAogCS5kaXNjX3RocmVzaCA9IDIsCiAJLnBoeWN0bF9vZmZzZXQgPSBSRUdfUEhZQ1RMX0ExMCwKIAkuZGVkaWNhdGVkX2Nsb2NrcyA9IGZhbHNlLAorCS5lbmFibGVfcG11X3VuazEgPSBmYWxzZSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9jZmcgc3VuOGlfYTIzX2NmZyA9IHsKQEAgLTc0NSw2ICs3OTksNyBAQAogCS5kaXNjX3RocmVzaCA9IDMsCiAJLnBoeWN0bF9vZmZzZXQgPSBSRUdfUEhZQ1RMX0ExMCwKIAkuZGVkaWNhdGVkX2Nsb2NrcyA9IHRydWUsCisJLmVuYWJsZV9wbXVfdW5rMSA9IGZhbHNlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdW40aV91c2JfcGh5X2NmZyBzdW44aV9hMzNfY2ZnID0gewpAQCAtNzUzLDYgKzgwOCw3IEBACiAJLmRpc2NfdGhyZXNoID0gMywKIAkucGh5Y3RsX29mZnNldCA9IFJFR19QSFlDVExfQTMzLAogCS5kZWRpY2F0ZWRfY2xvY2tzID0gdHJ1ZSwKKwkuZW5hYmxlX3BtdV91bmsxID0gZmFsc2UsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bjRpX3VzYl9waHlfY2ZnIHN1bjhpX2gzX2NmZyA9IHsKQEAgLTc2MCw2ICs4MTYsMTYgQEAKIAkudHlwZSA9IHN1bjhpX2gzX3BoeSwKIAkuZGlzY190aHJlc2ggPSAzLAogCS5kZWRpY2F0ZWRfY2xvY2tzID0gdHJ1ZSwKKwkuZW5hYmxlX3BtdV91bmsxID0gdHJ1ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuNGlfdXNiX3BoeV9jZmcgc3VuNTBpX2E2NF9jZmcgPSB7CisJLm51bV9waHlzID0gMiwKKwkudHlwZSA9IHN1bjUwaV9hNjRfcGh5LAorCS5kaXNjX3RocmVzaCA9IDMsCisJLnBoeWN0bF9vZmZzZXQgPSBSRUdfUEhZQ1RMX0EzMywKKwkuZGVkaWNhdGVkX2Nsb2NrcyA9IHRydWUsCisJLmVuYWJsZV9wbXVfdW5rMSA9IHRydWUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW40aV91c2JfcGh5X29mX21hdGNoW10gPSB7CkBAIC03NzAsNiArODM2LDggQEAKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW44aS1hMjMtdXNiLXBoeSIsIC5kYXRhID0gJnN1bjhpX2EyM19jZmcgfSwKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW44aS1hMzMtdXNiLXBoeSIsIC5kYXRhID0gJnN1bjhpX2EzM19jZmcgfSwKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW44aS1oMy11c2ItcGh5IiwgLmRhdGEgPSAmc3VuOGlfaDNfY2ZnIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNTBpLWE2NC11c2ItcGh5IiwKKwkgIC5kYXRhID0gJnN1bjUwaV9hNjRfY2ZnfSwKIAl7IH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VuNGlfdXNiX3BoeV9vZl9tYXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktc3VuOWktdXNiLmMgYi9kcml2ZXJzL3BoeS9waHktc3VuOWktdXNiLmMKaW5kZXggYWM0ZjMxYS4uMjhmY2U0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LXN1bjlpLXVzYi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1zdW45aS11c2IuYwpAQCAtMTQxLDkgKzE0MSw5IEBACiAJCX0KIAogCQlwaHktPmhzaWNfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImhzaWNfMTJNIik7Ci0JCWlmIChJU19FUlIocGh5LT5jbGspKSB7CisJCWlmIChJU19FUlIocGh5LT5oc2ljX2NsaykpIHsKIAkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBoc2ljXzEyTSBjbG9ja1xuIik7Ci0JCQlyZXR1cm4gUFRSX0VSUihwaHktPmNsayk7CisJCQlyZXR1cm4gUFRSX0VSUihwaHktPmhzaWNfY2xrKTsKIAkJfQogCiAJCXBoeS0+cmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0KGRldiwgImhzaWMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS10d2w0MDMwLXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LXR3bDQwMzAtdXNiLmMKaW5kZXggZDliMTBhMy4uODdlNjMzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LXR3bDQwMzAtdXNiLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LXR3bDQwMzAtdXNiLmMKQEAgLTE3Miw2ICsxNzIsNyBAQAogCWludAkJCWlycTsKIAllbnVtIG11c2JfdmJ1c19pZF9zdGF0dXMgbGlua3N0YXQ7CiAJYm9vbAkJCXZidXNfc3VwcGxpZWQ7CisJYm9vbAkJCW11c2JfbWFpbGJveF9wZW5kaW5nOwogCiAJc3RydWN0IGRlbGF5ZWRfd29yawlpZF93b3JrYXJvdW5kX3dvcms7CiB9OwpAQCAtNDM5LDYgKzQ0MCwxNyBAQAogCQkJICAoUEhZX0NMS19DVFJMX0NMT0NLR0FUSU5HX0VOIHwKIAkJCSAgIFBIWV9DTEtfQ1RSTF9DTEszMktfRU4pKTsKIAorCXR3bDQwMzBfaTJjX2FjY2Vzcyh0d2wsIDEpOworCXR3bDQwMzBfdXNiX3NldF9tb2RlKHR3bCwgdHdsLT51c2JfbW9kZSk7CisJaWYgKHR3bC0+dXNiX21vZGUgPT0gVDJfVVNCX01PREVfVUxQSSkKKwkJdHdsNDAzMF9pMmNfYWNjZXNzKHR3bCwgMCk7CisJLyoKKwkgKiBBY2NvcmRpbmcgdG8gdGhlIFRQUzY1OTUwIFRSTSwgdGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IDUwbXMKKwkgKiBkZWxheSBiZXR3ZWVuIHNldHRpbmcgUE9XRVJfQ1RSTF9PVEdfRU5BQiBhbmQgZW5hYmxpbmcgY2hhcmdpbmcKKwkgKiBzbyB3YWl0IGhlcmUgc28gdGhhdCBhIGZ1bGx5IGVuYWJsZWQgcGh5IGNhbiBiZSBleHBlY3RlZCBhZnRlcgorCSAqIHJlc3VtZQorCSAqLworCW1zbGVlcCg1MCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ1OSwxMSArNDcxLDYgQEAKIAogCWRldl9kYmcodHdsLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwogCXBtX3J1bnRpbWVfZ2V0X3N5bmModHdsLT5kZXYpOwotCXR3bDQwMzBfaTJjX2FjY2Vzcyh0d2wsIDEpOwotCXR3bDQwMzBfdXNiX3NldF9tb2RlKHR3bCwgdHdsLT51c2JfbW9kZSk7Ci0JaWYgKHR3bC0+dXNiX21vZGUgPT0gVDJfVVNCX01PREVfVUxQSSkKLQkJdHdsNDAzMF9pMmNfYWNjZXNzKHR3bCwgMCk7Ci0JdHdsLT5saW5rc3RhdCA9IE1VU0JfVU5LTk9XTjsKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR3bC0+aWRfd29ya2Fyb3VuZF93b3JrLCBIWik7CiAKIAlyZXR1cm4gMDsKQEAgLTU2OSw5ICs1NzYsMTIgQEAKIAkJCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kodHdsLT5kZXYpOwogCQkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQodHdsLT5kZXYpOwogCQl9CisJCXR3bC0+bXVzYl9tYWlsYm94X3BlbmRpbmcgPSB0cnVlOworCX0KKwlpZiAodHdsLT5tdXNiX21haWxib3hfcGVuZGluZykgewogCQllcnIgPSBtdXNiX21haWxib3goc3RhdHVzKTsKLQkJaWYgKGVycikKLQkJCXR3bC0+bGlua3N0YXQgPSBNVVNCX1VOS05PV047CisJCWlmICghZXJyKQorCQkJdHdsLT5tdXNiX21haWxib3hfcGVuZGluZyA9IGZhbHNlOwogCX0KIAogCS8qIGRvbid0IHNjaGVkdWxlIGR1cmluZyBzbGVlcCAtIGlycSB3b3JrcyByaWdodCB0aGVuICovCkBAIC02NzYsNiArNjg2LDcgQEAKIAl0d2wtPmlycQkJPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCXR3bC0+dmJ1c19zdXBwbGllZAk9IGZhbHNlOwogCXR3bC0+bGlua3N0YXQJCT0gTVVTQl9VTktOT1dOOworCXR3bC0+bXVzYl9tYWlsYm94X3BlbmRpbmcgPSBmYWxzZTsKIAogCXR3bC0+cGh5LmRldgkJPSB0d2wtPmRldjsKIAl0d2wtPnBoeS5sYWJlbAkJPSAidHdsNDAzMCI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS90ZWdyYS94dXNiLmMgYi9kcml2ZXJzL3BoeS90ZWdyYS94dXNiLmMKaW5kZXggZWM4M2RmZC4uODczNDI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvdGVncmEveHVzYi5jCisrKyBiL2RyaXZlcnMvcGh5L3RlZ3JhL3h1c2IuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS90ZWdyYS94dXNiLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KQEAgLTEwMSw3ICsxMDIsOCBAQAogCXJldHVybiBvZl9maW5kX25vZGVfYnlfbmFtZShucCwgcGFkLT5zb2MtPmxhbmVzW2luZGV4XS5uYW1lKTsKIH0KIAotaW50IHRlZ3JhX3h1c2JfbGFuZV9sb29rdXBfZnVuY3Rpb24oc3RydWN0IHRlZ3JhX3h1c2JfbGFuZSAqbGFuZSwKK3N0YXRpYyBpbnQKK3RlZ3JhX3h1c2JfbGFuZV9sb29rdXBfZnVuY3Rpb24oc3RydWN0IHRlZ3JhX3h1c2JfbGFuZSAqbGFuZSwKIAkJCQkgICAgY29uc3QgY2hhciAqZnVuY3Rpb24pCiB7CiAJdW5zaWduZWQgaW50IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZyBiL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCmluZGV4IGIzZmUxZDMuLjBlNzVkOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCkBAIC0yNTQsNiArMjU0LDcgQEAKIAloZWxwCiAJICBUaGlzIHNlbGVjdHMgdGhlIHBpbmN0cmwgZHJpdmVyIGZvciBYaWxpbnggWnlucS4KIAorc291cmNlICJkcml2ZXJzL3BpbmN0cmwvYXNwZWVkL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvcGluY3RybC9iY20vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9waW5jdHJsL2Jlcmxpbi9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3BpbmN0cmwvZnJlZXNjYWxlL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvTWFrZWZpbGUgYi9kcml2ZXJzL3BpbmN0cmwvTWFrZWZpbGUKaW5kZXggOGViZDdiOC4uMTFiYWQzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGluY3RybC9NYWtlZmlsZQpAQCAtMzcsNiArMzcsNyBAQAogb2JqLSQoQ09ORklHX1BJTkNUUkxfU1QpIAkrPSBwaW5jdHJsLXN0Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1pZTlEpCSs9IHBpbmN0cmwtenlucS5vCiAKK29iai0kKENPTkZJR19BUkNIX0FTUEVFRCkJKz0gYXNwZWVkLwogb2JqLXkJCQkJKz0gYmNtLwogb2JqLSQoQ09ORklHX1BJTkNUUkxfQkVSTElOKQkrPSBiZXJsaW4vCiBvYmoteQkJCQkrPSBmcmVlc2NhbGUvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL0tjb25maWcgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4ZWFiZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvS2NvbmZpZwpAQCAtMCwwICsxLDI0IEBACitjb25maWcgUElOQ1RSTF9BU1BFRUQKKwlib29sCisJZGVwZW5kcyBvbiAoQVJDSF9BU1BFRUQgfHwgQ09NUElMRV9URVNUKSAmJiBPRgorCWRlcGVuZHMgb24gTUZEX1NZU0NPTgorCXNlbGVjdCBQSU5NVVgKKwlzZWxlY3QgUElOQ09ORgorCXNlbGVjdCBHRU5FUklDX1BJTkNPTkYKKwlzZWxlY3QgUkVHTUFQX01NSU8KKworY29uZmlnIFBJTkNUUkxfQVNQRUVEX0c0CisJYm9vbCAiQXNwZWVkIEc0IFNvQyBwaW4gY29udHJvbCIKKwlkZXBlbmRzIG9uIChNQUNIX0FTUEVFRF9HNCB8fCBDT01QSUxFX1RFU1QpICYmIE9GCisJc2VsZWN0IFBJTkNUUkxfQVNQRUVECisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgcGluIGNvbnRyb2xsZXIgc3VwcG9ydCBmb3IgQXNwZWVkJ3MgNHRoCisJICBnZW5lcmF0aW9uIFNvQ3MuIEdQSU8gaXMgcHJvdmlkZWQgYnkgYSBzZXBhcmF0ZSBHUElPIGRyaXZlci4KKworY29uZmlnIFBJTkNUUkxfQVNQRUVEX0c1CisJYm9vbCAiQXNwZWVkIEc1IFNvQyBwaW4gY29udHJvbCIKKwlkZXBlbmRzIG9uIChNQUNIX0FTUEVFRF9HNSB8fCBDT01QSUxFX1RFU1QpICYmIE9GCisJc2VsZWN0IFBJTkNUUkxfQVNQRUVECisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgcGluIGNvbnRyb2xsZXIgc3VwcG9ydCBmb3IgQXNwZWVkJ3MgNXRoCisJICBnZW5lcmF0aW9uIFNvQ3MuIEdQSU8gaXMgcHJvdmlkZWQgYnkgYSBzZXBhcmF0ZSBHUElPIGRyaXZlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvTWFrZWZpbGUgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MWVkMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIyBBc3BlZWQgcGluY3RybCBzdXBwb3J0CisKK2NjZmxhZ3MteSArPSAtV292ZXJyaWRlLWluaXQKK29iai0kKENPTkZJR19QSU5DVFJMX0FTUEVFRCkJKz0gcGluY3RybC1hc3BlZWQubworb2JqLSQoQ09ORklHX1BJTkNUUkxfQVNQRUVEX0c0KQkrPSBwaW5jdHJsLWFzcGVlZC1nNC5vCitvYmotJChDT05GSUdfUElOQ1RSTF9BU1BFRURfRzUpCSs9IHBpbmN0cmwtYXNwZWVkLWc1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQtZzQuYyBiL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQtZzQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjFiMDcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9waW5jdHJsLWFzcGVlZC1nNC5jCkBAIC0wLDAgKzEsMTIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGlubXV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLWdlbmVyaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSAiLi4vY29yZS5oIgorI2luY2x1ZGUgIi4uL3BpbmN0cmwtdXRpbHMuaCIKKyNpbmNsdWRlICJwaW5jdHJsLWFzcGVlZC5oIgorCisvKgorICogVXNlcyB1bmRlZmluZWQgbWFjcm9zIGZvciBzeW1ib2wgbmFtaW5nIGFuZCByZWZlcmVuY2VzLCBlZyBHUElPQTAsIE1BQzFMSU5LLAorICogVElNRVIzIGV0Yy4KKyAqCisgKiBQaW5zIGFyZSBkZWZpbmVkIGluIEdQSU8gYmFuayBvcmRlcjoKKyAqCisgKiBHUElPQTA6IDAKKyAqIC4uLgorICogR1BJT0E3OiA3CisgKiBHUElPQjA6IDgKKyAqIC4uLgorICogR1BJT1o3OiAyMDcKKyAqIEdQSU9BQTA6IDIwOAorICogLi4uCisgKiBHUElPQUIzOiAyMTkKKyAqCisgKiBOb3QgYWxsIHBpbnMgaGF2ZSB0aGVpciBzaWduYWxzIGRlZmluZWQgKHlldCkuCisgKi8KKworI2RlZmluZSBBNCAyCitTU1NGX1BJTl9ERUNMKEE0LCBHUElPQTIsIFRJTUVSMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAyKSk7CisKKyNkZWZpbmUgSTJDOV9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjIpCisKKyNkZWZpbmUgQzUgNAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w5LCBJMkM5LCBJMkM5X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShUSU1FUjUsIFRJTUVSNSwgU0lHX0RFU0NfU0VUKFNDVTgwLCA0KSk7CitNU19QSU5fREVDTChDNSwgR1BJT0E0LCBTQ0w5LCBUSU1FUjUpOworCitGVU5DX0dST1VQX0RFQ0woVElNRVI1LCBDNSk7CisKKyNkZWZpbmUgQjQgNQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE5LCBJMkM5LCBJMkM5X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShUSU1FUjYsIFRJTUVSNiwgU0lHX0RFU0NfU0VUKFNDVTgwLCA1KSk7CitNU19QSU5fREVDTChCNCwgR1BJT0E1LCBTREE5LCBUSU1FUjYpOworCitGVU5DX0dST1VQX0RFQ0woVElNRVI2LCBCNCk7CitGVU5DX0dST1VQX0RFQ0woSTJDOSwgQzUsIEI0KTsKKworI2RlZmluZSBNRElPMl9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMikKKworI2RlZmluZSBBMyA2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE1EQzIsIE1ESU8yLCBNRElPMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVElNRVI3LCBUSU1FUjcsIFNJR19ERVNDX1NFVChTQ1U4MCwgNikpOworTVNfUElOX0RFQ0woQTMsIEdQSU9BNiwgTURDMiwgVElNRVI3KTsKKworRlVOQ19HUk9VUF9ERUNMKFRJTUVSNywgQTMpOworCisjZGVmaW5lIEQ1IDcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTURJTzIsIE1ESU8yLCBNRElPMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVElNRVI4LCBUSU1FUjgsIFNJR19ERVNDX1NFVChTQ1U4MCwgNykpOworTVNfUElOX0RFQ0woRDUsIEdQSU9BNywgTURJTzIsIFRJTUVSOCk7CisKK0ZVTkNfR1JPVVBfREVDTChUSU1FUjgsIEQ1KTsKK0ZVTkNfR1JPVVBfREVDTChNRElPMiwgQTMsIEQ1KTsKKworI2RlZmluZSBIMTkgMTMKKyNkZWZpbmUgSDE5X0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4MCwgMTMpCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKExQQ1BELCBMUENQRCwgSDE5X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShMUENTTUksIExQQ1NNSSwgSDE5X0RFU0MpOworTVNfUElOX0RFQ0woSDE5LCBHUElPQjUsIExQQ1BELCBMUENTTUkpOworCitGVU5DX0dST1VQX0RFQ0woTFBDUEQsIEgxOSk7CitGVU5DX0dST1VQX0RFQ0woTFBDU01JLCBIMTkpOworCisjZGVmaW5lIEgyMCAxNAorU1NTRl9QSU5fREVDTChIMjAsIEdQSU9CNiwgTFBDUE1FLCBTSUdfREVTQ19TRVQoU0NVODAsIDE0KSk7CisKKyNkZWZpbmUgU0QxX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAwKQorI2RlZmluZSBJMkMxMF9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjMpCisKKyNkZWZpbmUgQzQgMTYKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxQ0xLLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMTAsIEkyQzEwLCBJMkMxMF9ERVNDKTsKK01TX1BJTl9ERUNMKEM0LCBHUElPQzAsIFNEMUNMSywgU0NMMTApOworCisjZGVmaW5lIEIzIDE3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMUNNRCwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEQTEwLCBJMkMxMCwgSTJDMTBfREVTQyk7CitNU19QSU5fREVDTChCMywgR1BJT0MxLCBTRDFDTUQsIFNEQTEwKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzEwLCBDNCwgQjMpOworCisjZGVmaW5lIEkyQzExX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNCkKKworI2RlZmluZSBBMiAxOAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQwLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMTEsIEkyQzExLCBJMkMxMV9ERVNDKTsKK01TX1BJTl9ERUNMKEEyLCBHUElPQzIsIFNEMURBVDAsIFNDTDExKTsKKworI2RlZmluZSBFNSAxOQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQxLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTEsIEkyQzExLCBJMkMxMV9ERVNDKTsKK01TX1BJTl9ERUNMKEU1LCBHUElPQzMsIFNEMURBVDEsIFNEQTExKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzExLCBBMiwgRTUpOworCisjZGVmaW5lIEkyQzEyX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNSkKKworI2RlZmluZSBENCAyMAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQyLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMTIsIEkyQzEyLCBJMkMxMl9ERVNDKTsKK01TX1BJTl9ERUNMKEQ0LCBHUElPQzQsIFNEMURBVDIsIFNDTDEyKTsKKworI2RlZmluZSBDMyAyMQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQzLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTIsIEkyQzEyLCBJMkMxMl9ERVNDKTsKK01TX1BJTl9ERUNMKEMzLCBHUElPQzUsIFNEMURBVDMsIFNEQTEyKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzEyLCBENCwgQzMpOworCisjZGVmaW5lIEkyQzEzX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNikKKworI2RlZmluZSBCMiAyMgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFDRCwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDEzLCBJMkMxMywgSTJDMTNfREVTQyk7CitNU19QSU5fREVDTChCMiwgR1BJT0M2LCBTRDFDRCwgU0NMMTMpOworCisjZGVmaW5lIEExIDIzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMVdQLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTMsIEkyQzEzLCBJMkMxM19ERVNDKTsKK01TX1BJTl9ERUNMKEExLCBHUElPQzcsIFNEMVdQLCBTREExMyk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkMxMywgQjIsIEExKTsKK0ZVTkNfR1JPVVBfREVDTChTRDEsIEM0LCBCMywgQTIsIEU1LCBENCwgQzMsIEIyLCBBMSk7CisKKyNkZWZpbmUgU0QyX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAxKQorI2RlZmluZSBHUElEX0RFU0MgICAgICAgU0lHX0RFU0NfU0VUKEhXX1NUUkFQMSwgMjEpCisjZGVmaW5lIEdQSUQwX0RFU0MJU0lHX0RFU0NfU0VUKFNDVThDLCA4KQorCisjZGVmaW5lIEExOCAyNAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDJDTEssIFNEMiwgU0QyX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElEMElOLCBHUElEMCwgR1BJRDBfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQwSU4sIEdQSUQsIEdQSURfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChHUElEMElOLCBHUElEMCwgR1BJRCk7CitNU19QSU5fREVDTChBMTgsIEdQSU9EMCwgU0QyQ0xLLCBHUElEMElOKTsKKworI2RlZmluZSBEMTYgMjUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QyQ01ELCBTRDIsIFNEMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRDBPVVQsIEdQSUQwLCBHUElEMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRDBPVVQsIEdQSUQsIEdQSURfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChHUElEME9VVCwgR1BJRDAsIEdQSUQpOworTVNfUElOX0RFQ0woRDE2LCBHUElPRDEsIFNEMkNNRCwgR1BJRDBPVVQpOworCitGVU5DX0dST1VQX0RFQ0woR1BJRDAsIEExOCwgRDE2KTsKKworI2RlZmluZSBHUElFX0RFU0MgICAgICAgU0lHX0RFU0NfU0VUKEhXX1NUUkFQMSwgMjIpCisjZGVmaW5lIEdQSUUwX0RFU0MgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDEyKQorI2RlZmluZSBHUElFMl9ERVNDICAgICAgU0lHX0RFU0NfU0VUKFNDVThDLCAxMykKKyNkZWZpbmUgR1BJRTRfREVTQyAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgMTQpCisjZGVmaW5lIEdQSUU2X0RFU0MgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDE1KQorCisjZGVmaW5lIEQxNSAzMgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOQ1RTMywgTkNUUzMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMTYpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTBJTiwgR1BJRTAsIEdQSUUwX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFMElOLCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTBJTiwgR1BJRTAsIEdQSUUpOworTVNfUElOX0RFQ0woRDE1LCBHUElPRTAsIE5DVFMzLCBHUElFMElOKTsKKworRlVOQ19HUk9VUF9ERUNMKE5DVFMzLCBEMTUpOworCisjZGVmaW5lIEMxNSAzMworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShORENEMywgTkRDRDMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMTcpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTBPVVQsIEdQSUUwLCBHUElFMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRTBPVVQsIEdQSUUsIEdQSUVfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChHUElFME9VVCwgR1BJRTAsIEdQSUUpOworTVNfUElOX0RFQ0woQzE1LCBHUElPRTEsIE5EQ0QzLCBHUElFME9VVCk7CisKK0ZVTkNfR1JPVVBfREVDTChORENEMywgQzE1KTsKK0ZVTkNfR1JPVVBfREVDTChHUElFMCwgRDE1LCBDMTUpOworCisjZGVmaW5lIEIxNSAzNAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShORFNSMywgTkRTUjMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMTgpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTJJTiwgR1BJRTIsIEdQSUUyX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFMklOLCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTJJTiwgR1BJRTIsIEdQSUUpOworTVNfUElOX0RFQ0woQjE1LCBHUElPRTIsIE5EU1IzLCBHUElFMklOKTsKKworRlVOQ19HUk9VUF9ERUNMKE5EU1IzLCBCMTUpOworCisjZGVmaW5lIEExNSAzNQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOUkkzLCBOUkkzLCBTSUdfREVTQ19TRVQoU0NVODAsIDE5KSk7CitTSUdfRVhQUl9ERUNMKEdQSUUyT1VULCBHUElFMiwgR1BJRTJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUUyT1VULCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTJPVVQsIEdQSUUyLCBHUElFKTsKK01TX1BJTl9ERUNMKEExNSwgR1BJT0UzLCBOUkkzLCBHUElFMk9VVCk7CisKK0ZVTkNfR1JPVVBfREVDTChOUkkzLCBBMTUpOworRlVOQ19HUk9VUF9ERUNMKEdQSUUyLCBCMTUsIEExNSk7CisKKyNkZWZpbmUgRTE0IDM2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5EVFIzLCBORFRSMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAyMCkpOworU0lHX0VYUFJfREVDTChHUElFNElOLCBHUElFNCwgR1BJRTRfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUU0SU4sIEdQSUUsIEdQSUVfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChHUElFNElOLCBHUElFNCwgR1BJRSk7CitNU19QSU5fREVDTChFMTQsIEdQSU9FNCwgTkRUUjMsIEdQSUU0SU4pOworCitGVU5DX0dST1VQX0RFQ0woTkRUUjMsIEUxNCk7CisKKyNkZWZpbmUgRDE0IDM3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5SVFMzLCBOUlRTMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAyMSkpOworU0lHX0VYUFJfREVDTChHUElFNE9VVCwgR1BJRTQsIEdQSUU0X0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFNE9VVCwgR1BJRSwgR1BJRV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUU0T1VULCBHUElFNCwgR1BJRSk7CitNU19QSU5fREVDTChEMTQsIEdQSU9FNSwgTlJUUzMsIEdQSUU0T1VUKTsKKworRlVOQ19HUk9VUF9ERUNMKE5SVFMzLCBEMTQpOworRlVOQ19HUk9VUF9ERUNMKEdQSUU0LCBFMTQsIEQxNCk7CisKKyNkZWZpbmUgQzE0IDM4CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRYRDMsIFRYRDMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMjIpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTZJTiwgR1BJRTYsIEdQSUU2X0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFNklOLCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTZJTiwgR1BJRTYsIEdQSUUpOworTVNfUElOX0RFQ0woQzE0LCBHUElPRTYsIFRYRDMsIEdQSUU2SU4pOworCitGVU5DX0dST1VQX0RFQ0woVFhEMywgQzE0KTsKKworI2RlZmluZSBCMTQgMzkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUlhEMywgUlhEMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAyMykpOworU0lHX0VYUFJfREVDTChHUElFNk9VVCwgR1BJRTYsIEdQSUU2X0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFNk9VVCwgR1BJRSwgR1BJRV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUU2T1VULCBHUElFNiwgR1BJRSk7CitNU19QSU5fREVDTChCMTQsIEdQSU9FNywgUlhEMywgR1BJRTZPVVQpOworCitGVU5DX0dST1VQX0RFQ0woUlhEMywgQjE0KTsKK0ZVTkNfR1JPVVBfREVDTChHUElFNiwgQzE0LCBCMTQpOworCisjZGVmaW5lIEQxOCA0MAorU1NTRl9QSU5fREVDTChEMTgsIEdQSU9GMCwgTkNUUzQsIFNJR19ERVNDX1NFVChTQ1U4MCwgMjQpKTsKKworI2RlZmluZSBBQ1BJX0RFU0MgICAgICAgU0lHX0RFU0NfQklUKEhXX1NUUkFQMSwgMTksIDApCisKKyNkZWZpbmUgQjE5IDQxCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5EQ0Q0LCBORENENCwgU0lHX0RFU0NfU0VUKFNDVTgwLCAyNSkpOworU0lHX0VYUFJfREVDTChTSU9QQkksIFNJT1BCSSwgU0lHX0RFU0NfU0VUKFNDVUE0LCAxMikpOworU0lHX0VYUFJfREVDTChTSU9QQkksIEFDUEksIEFDUElfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChTSU9QQkksIFNJT1BCSSwgQUNQSSk7CitNU19QSU5fREVDTChCMTksIEdQSU9GMSwgTkRDRDQsIFNJT1BCSSk7CitGVU5DX0dST1VQX0RFQ0woTkRDRDQsIEIxOSk7CitGVU5DX0dST1VQX0RFQ0woU0lPUEJJLCBCMTkpOworCisjZGVmaW5lIEQxNyA0MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOUkk0LCBOUkk0LCBTSUdfREVTQ19TRVQoU0NVODAsIDI3KSk7CitTSUdfRVhQUl9ERUNMKFNJT1BCTywgU0lPUEJPLCBTSUdfREVTQ19TRVQoU0NVQTQsIDE0KSk7CitTSUdfRVhQUl9ERUNMKFNJT1BCTywgQUNQSSwgQUNQSV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFNJT1BCTywgU0lPUEJPLCBBQ1BJKTsKK01TX1BJTl9ERUNMKEQxNywgR1BJT0YzLCBOUkk0LCBTSU9QQk8pOworRlVOQ19HUk9VUF9ERUNMKE5SSTQsIEQxNyk7CitGVU5DX0dST1VQX0RFQ0woU0lPUEJPLCBEMTcpOworCitGVU5DX0dST1VQX0RFQ0woQUNQSSwgQjE5LCBEMTcpOworCisjZGVmaW5lIEUxNiA0NgorU1NTRl9QSU5fREVDTChFMTYsIEdQSU9GNiwgVFhENCwgU0lHX0RFU0NfU0VUKFNDVTgwLCAzMCkpOworCisjZGVmaW5lIEMxNyA0NworU1NTRl9QSU5fREVDTChDMTcsIEdQSU9GNywgUlhENCwgU0lHX0RFU0NfU0VUKFNDVTgwLCAzMSkpOworCisjZGVmaW5lIEFBMjIgNTQKK1NTU0ZfUElOX0RFQ0woQUEyMiwgR1BJT0c2LCBGTEJVU1ksIFNJR19ERVNDX1NFVChTQ1U4NCwgNikpOworCisjZGVmaW5lIFUxOCA1NQorU1NTRl9QSU5fREVDTChVMTgsIEdQSU9HNywgRkxXUCwgU0lHX0RFU0NfU0VUKFNDVTg0LCA3KSk7CisKKyNkZWZpbmUgVUFSVDZfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDcpCisjZGVmaW5lIFJPTTE2X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCA2KQorI2RlZmluZSBGTEFTSF9XSURFCVNJR19ERVNDX1NFVChIV19TVFJBUDEsIDQpCisjZGVmaW5lIEJPT1RfU1JDX05PUgl7IEhXX1NUUkFQMSwgR0VOTUFTSygxLCAwKSwgMCwgMCB9CisKKyNkZWZpbmUgQTggNTYKK1NJR19FWFBSX0RFQ0woUk9NRDgsIFJPTTE2LCBST00xNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDgsIFJPTTE2UywgRkxBU0hfV0lERSwgQk9PVF9TUkNfTk9SKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFJPTUQ4LCBST00xNiwgUk9NMTZTKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkNUUzYsIE5DVFM2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEE4LCBHUElPSDAsIFJPTUQ4LCBOQ1RTNik7CisKKyNkZWZpbmUgQzcgNTcKK1NJR19FWFBSX0RFQ0woUk9NRDksIFJPTTE2LCBST00xNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDksIFJPTTE2UywgRkxBU0hfV0lERSwgQk9PVF9TUkNfTk9SKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFJPTUQ5LCBST00xNiwgUk9NMTZTKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRDRDYsIE5EQ0Q2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEM3LCBHUElPSDEsIFJPTUQ5LCBORENENik7CisKKyNkZWZpbmUgQjcgNTgKK1NJR19FWFBSX0RFQ0woUk9NRDEwLCBST00xNiwgUk9NMTZfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQxMCwgUk9NMTZTLCBGTEFTSF9XSURFLCBCT09UX1NSQ19OT1IpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoUk9NRDEwLCBST00xNiwgUk9NMTZTKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRTUjYsIE5EU1I2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEI3LCBHUElPSDIsIFJPTUQxMCwgTkRTUjYpOworCisjZGVmaW5lIEE3IDU5CitTSUdfRVhQUl9ERUNMKFJPTUQxMSwgUk9NMTYsIFJPTTE2X0RFU0MpOworU0lHX0VYUFJfREVDTChST01EMTEsIFJPTTE2UywgRkxBU0hfV0lERSwgQk9PVF9TUkNfTk9SKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFJPTUQxMSwgUk9NMTYsIFJPTTE2Uyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5SSTYsIE5SSTYsIFVBUlQ2X0RFU0MpOworTVNfUElOX0RFQ0woQTcsIEdQSU9IMywgUk9NRDExLCBOUkk2KTsKKworI2RlZmluZSBENyA2MAorU0lHX0VYUFJfREVDTChST01EMTIsIFJPTTE2LCBST00xNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDEyLCBST00xNlMsIEZMQVNIX1dJREUsIEJPT1RfU1JDX05PUik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChST01EMTIsIFJPTTE2LCBST00xNlMpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShORFRSNiwgTkRUUjYsIFVBUlQ2X0RFU0MpOworTVNfUElOX0RFQ0woRDcsIEdQSU9INCwgUk9NRDEyLCBORFRSNik7CisKKyNkZWZpbmUgQjYgNjEKK1NJR19FWFBSX0RFQ0woUk9NRDEzLCBST00xNiwgUk9NMTZfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQxMywgUk9NMTZTLCBGTEFTSF9XSURFLCBCT09UX1NSQ19OT1IpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoUk9NRDEzLCBST00xNiwgUk9NMTZTKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTlJUUzYsIE5SVFM2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEI2LCBHUElPSDUsIFJPTUQxMywgTlJUUzYpOworCisjZGVmaW5lIEE2IDYyCitTSUdfRVhQUl9ERUNMKFJPTUQxNCwgUk9NMTYsIFJPTTE2X0RFU0MpOworU0lHX0VYUFJfREVDTChST01EMTQsIFJPTTE2UywgRkxBU0hfV0lERSwgQk9PVF9TUkNfTk9SKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFJPTUQxNCwgUk9NMTYsIFJPTTE2Uyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRYRDYsIFRYRDYsIFVBUlQ2X0RFU0MpOworTVNfUElOX0RFQ0woQTYsIEdQSU9INiwgUk9NRDE0LCBUWEQ2KTsKKworI2RlZmluZSBFNyA2MworU0lHX0VYUFJfREVDTChST01EMTUsIFJPTTE2LCBST00xNl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDE1LCBST00xNlMsIEZMQVNIX1dJREUsIEJPT1RfU1JDX05PUik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChST01EMTUsIFJPTTE2LCBST00xNlMpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSWEQ2LCBSWEQ2LCBVQVJUNl9ERVNDKTsKK01TX1BJTl9ERUNMKEU3LCBHUElPSDcsIFJPTUQxNSwgUlhENik7CisKK0ZVTkNfR1JPVVBfREVDTChVQVJUNiwgQTgsIEM3LCBCNywgQTcsIEQ3LCBCNiwgQTYsIEU3KTsKKworI2RlZmluZSBKMyA3NQorU1NTRl9QSU5fREVDTChKMywgR1BJT0ozLCBTR1BNSSwgU0lHX0RFU0NfU0VUKFNDVTg0LCAxMSkpOworCisjZGVmaW5lIFQ0IDc2CitTU1NGX1BJTl9ERUNMKFQ0LCBHUElPSjQsIFZHQUhTLCBTSUdfREVTQ19TRVQoU0NVODQsIDEyKSk7CisKKyNkZWZpbmUgVTIgNzcKK1NTU0ZfUElOX0RFQ0woVTIsIEdQSU9KNSwgVkdBVlMsIFNJR19ERVNDX1NFVChTQ1U4NCwgMTMpKTsKKworI2RlZmluZSBUMiA3OAorU1NTRl9QSU5fREVDTChUMiwgR1BJT0o2LCBERENDTEssIFNJR19ERVNDX1NFVChTQ1U4NCwgMTQpKTsKKworI2RlZmluZSBUMSA3OQorU1NTRl9QSU5fREVDTChUMSwgR1BJT0o3LCBERENEQVQsIFNJR19ERVNDX1NFVChTQ1U4NCwgMTUpKTsKKworI2RlZmluZSBJMkM1X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAxOCkKKworI2RlZmluZSBFMyA4MAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w1LCBJMkM1LCBJMkM1X0RFU0MpOworU1NfUElOX0RFQ0woRTMsIEdQSU9LMCwgU0NMNSk7CisKKyNkZWZpbmUgRDIgODEKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBNSwgSTJDNSwgSTJDNV9ERVNDKTsKK1NTX1BJTl9ERUNMKEQyLCBHUElPSzEsIFNEQTUpOworCitGVU5DX0dST1VQX0RFQ0woSTJDNSwgRTMsIEQyKTsKKworI2RlZmluZSBJMkM2X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAxOSkKKworI2RlZmluZSBDMSA4MgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w2LCBJMkM2LCBJMkM2X0RFU0MpOworU1NfUElOX0RFQ0woQzEsIEdQSU9LMiwgU0NMNik7CisKKyNkZWZpbmUgRjQgODMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBNiwgSTJDNiwgSTJDNl9ERVNDKTsKK1NTX1BJTl9ERUNMKEY0LCBHUElPSzMsIFNEQTYpOworCitGVU5DX0dST1VQX0RFQ0woSTJDNiwgQzEsIEY0KTsKKworI2RlZmluZSBJMkM3X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyMCkKKworI2RlZmluZSBFMiA4NAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w3LCBJMkM3LCBJMkM3X0RFU0MpOworU1NfUElOX0RFQ0woRTIsIEdQSU9LNCwgU0NMNyk7CisKKyNkZWZpbmUgRDEgODUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBNywgSTJDNywgSTJDN19ERVNDKTsKK1NTX1BJTl9ERUNMKEQxLCBHUElPSzUsIFNEQTcpOworCitGVU5DX0dST1VQX0RFQ0woSTJDNywgRTIsIEQxKTsKKworI2RlZmluZSBJMkM4X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyMSkKKworI2RlZmluZSBHNSA4NgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0w4LCBJMkM4LCBJMkM4X0RFU0MpOworU1NfUElOX0RFQ0woRzUsIEdQSU9LNiwgU0NMOCk7CisKKyNkZWZpbmUgRjMgODcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBOCwgSTJDOCwgSTJDOF9ERVNDKTsKK1NTX1BJTl9ERUNMKEYzLCBHUElPSzcsIFNEQTgpOworCitGVU5DX0dST1VQX0RFQ0woSTJDOCwgRzUsIEYzKTsKKworI2RlZmluZSBVMSA4OAorU1NTRl9QSU5fREVDTChVMSwgR1BJT0wwLCBOQ1RTMSwgU0lHX0RFU0NfU0VUKFNDVTg0LCAxNikpOworCisjZGVmaW5lIFZQSTE4X0RFU0MJeyBTQ1U5MCwgR0VOTUFTSyg1LCA0KSwgMSwgMCB9CisjZGVmaW5lIFZQSTI0X0RFU0MJeyBTQ1U5MCwgR0VOTUFTSyg1LCA0KSwgMiwgMCB9CisjZGVmaW5lIFZQSTMwX0RFU0MJeyBTQ1U5MCwgR0VOTUFTSyg1LCA0KSwgMywgMCB9CisKKyNkZWZpbmUgVDUgODkKKyNkZWZpbmUgVDVfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4NCwgMTcpCitTSUdfRVhQUl9ERUNMKFZQSURFLCBWUEkxOCwgVlBJMThfREVTQywgVDVfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSURFLCBWUEkyNCwgVlBJMjRfREVTQywgVDVfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSURFLCBWUEkzMCwgVlBJMzBfREVTQywgVDVfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woVlBJREUsIFNJR19FWFBSX1BUUihWUElERSwgVlBJMTgpLAorCQlTSUdfRVhQUl9QVFIoVlBJREUsIFZQSTI0KSwKKwkJU0lHX0VYUFJfUFRSKFZQSURFLCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShORENEMSwgTkRDRDEsIFQ1X0RFU0MpOworTVNfUElOX0RFQ0woVDUsIEdQSU9MMSwgVlBJREUsIE5EQ0QxKTsKK0ZVTkNfR1JPVVBfREVDTChORENEMSwgVDUpOworCisjZGVmaW5lIFUzIDkwCisjZGVmaW5lIFUzX0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODQsIDE4KQorU0lHX0VYUFJfREVDTChWUElPREQsIFZQSTE4LCBWUEkxOF9ERVNDLCBVM19ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBJT0RELCBWUEkyNCwgVlBJMjRfREVTQywgVTNfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSU9ERCwgVlBJMzAsIFZQSTMwX0RFU0MsIFUzX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFZQSU9ERCwgU0lHX0VYUFJfUFRSKFZQSU9ERCwgVlBJMTgpLAorCQlTSUdfRVhQUl9QVFIoVlBJT0RELCBWUEkyNCksCisJCVNJR19FWFBSX1BUUihWUElPREQsIFZQSTMwKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE5EU1IxLCBORFNSMSwgVTNfREVTQyk7CitNU19QSU5fREVDTChVMywgR1BJT0wyLCBWUElPREQsIE5EU1IxKTsKK0ZVTkNfR1JPVVBfREVDTChORFNSMSwgVTMpOworCisjZGVmaW5lIFYxIDkxCisjZGVmaW5lIFYxX0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODQsIDE5KQorU0lHX0VYUFJfREVDTChWUElIUywgVlBJMTgsIFZQSTE4X0RFU0MsIFYxX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElIUywgVlBJMjQsIFZQSTI0X0RFU0MsIFYxX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElIUywgVlBJMzAsIFZQSTMwX0RFU0MsIFYxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFZQSUhTLCBTSUdfRVhQUl9QVFIoVlBJSFMsIFZQSTE4KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUhTLCBWUEkyNCksCisJCVNJR19FWFBSX1BUUihWUElIUywgVlBJMzApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTlJJMSwgTlJJMSwgVjFfREVTQyk7CitNU19QSU5fREVDTChWMSwgR1BJT0wzLCBWUElIUywgTlJJMSk7CitGVU5DX0dST1VQX0RFQ0woTlJJMSwgVjEpOworCisjZGVmaW5lIFU0IDkyCisjZGVmaW5lIFU0X0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODQsIDIwKQorU0lHX0VYUFJfREVDTChWUElWUywgVlBJMTgsIFZQSTE4X0RFU0MsIFU0X0RFU0MpOworU0lHX0VYUFJfREVDTChWUElWUywgVlBJMjQsIFZQSTI0X0RFU0MsIFU0X0RFU0MpOworU0lHX0VYUFJfREVDTChWUElWUywgVlBJMzAsIFZQSTMwX0RFU0MsIFU0X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFZQSVZTLCBTSUdfRVhQUl9QVFIoVlBJVlMsIFZQSTE4KSwKKwkJU0lHX0VYUFJfUFRSKFZQSVZTLCBWUEkyNCksCisJCVNJR19FWFBSX1BUUihWUElWUywgVlBJMzApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRUUjEsIE5EVFIxLCBVNF9ERVNDKTsKK01TX1BJTl9ERUNMKFU0LCBHUElPTDQsIFZQSVZTLCBORFRSMSk7CitGVU5DX0dST1VQX0RFQ0woTkRUUjEsIFU0KTsKKworI2RlZmluZSBWMiA5MworI2RlZmluZSBWMl9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg0LCAyMSkKK1NJR19FWFBSX0RFQ0woVlBJQ0xLLCBWUEkxOCwgVlBJMThfREVTQywgVjJfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUNMSywgVlBJMjQsIFZQSTI0X0RFU0MsIFYyX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElDTEssIFZQSTMwLCBWUEkzMF9ERVNDLCBWMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChWUElDTEssIFNJR19FWFBSX1BUUihWUElDTEssIFZQSTE4KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUNMSywgVlBJMjQpLAorCQlTSUdfRVhQUl9QVFIoVlBJQ0xLLCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOUlRTMSwgTlJUUzEsIFYyX0RFU0MpOworTVNfUElOX0RFQ0woVjIsIEdQSU9MNSwgVlBJQ0xLLCBOUlRTMSk7CitGVU5DX0dST1VQX0RFQ0woTlJUUzEsIFYyKTsKKworI2RlZmluZSBXMSA5NAorI2RlZmluZSBXMV9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg0LCAyMikKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJQjAsIFZQSTMwLCBWUEkzMF9ERVNDLCBXMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVFhEMSwgVFhEMSwgVzFfREVTQyk7CitNU19QSU5fREVDTChXMSwgR1BJT0w2LCBWUElCMCwgVFhEMSk7CitGVU5DX0dST1VQX0RFQ0woVFhEMSwgVzEpOworCisjZGVmaW5lIFU1IDk1CisjZGVmaW5lIFU1X0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODQsIDIzKQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUElCMSwgVlBJMzAsIFZQSTMwX0RFU0MsIFU1X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSWEQxLCBSWEQxLCBVNV9ERVNDKTsKK01TX1BJTl9ERUNMKFU1LCBHUElPTDcsIFZQSUIxLCBSWEQxKTsKK0ZVTkNfR1JPVVBfREVDTChSWEQxLCBVNSk7CisKKyNkZWZpbmUgVzQgMTA0CisjZGVmaW5lIFc0X0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDApCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFZQSUcwLCBWUEkzMCwgVlBJMzBfREVTQywgVzRfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTAsIFBXTTAsIFc0X0RFU0MpOworTVNfUElOX0RFQ0woVzQsIEdQSU9OMCwgVlBJRzAsIFBXTTApOworRlVOQ19HUk9VUF9ERUNMKFBXTTAsIFc0KTsKKworI2RlZmluZSBZMyAxMDUKKyNkZWZpbmUgWTNfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgMSkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJRzEsIFZQSTMwLCBWUEkzMF9ERVNDLCBZM19ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNMSwgUFdNMSwgWTNfREVTQyk7CitNU19QSU5fREVDTChZMywgR1BJT04xLCBWUElHMSwgUFdNMSk7CitGVU5DX0dST1VQX0RFQ0woUFdNMSwgWTMpOworCisjZGVmaW5lIEFBMiAxMDYKKyNkZWZpbmUgQUEyX0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgMikKK1NJR19FWFBSX0RFQ0woVlBJRzIsIFZQSTE4LCBWUEkxOF9ERVNDLCBBQTJfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUcyLCBWUEkyNCwgVlBJMjRfREVTQywgQUEyX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElHMiwgVlBJMzAsIFZQSTMwX0RFU0MsIEFBMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChWUElHMiwgU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkxOCksCisJCVNJR19FWFBSX1BUUihWUElHMiwgVlBJMjQpLAorCQlTSUdfRVhQUl9QVFIoVlBJRzIsIFZQSTMwKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTIsIFBXTTIsIEFBMl9ERVNDKTsKK01TX1BJTl9ERUNMKEFBMiwgR1BJT04yLCBWUElHMiwgUFdNMik7CitGVU5DX0dST1VQX0RFQ0woUFdNMiwgQUEyKTsKKworI2RlZmluZSBBQjEgMTA3CisjZGVmaW5lIEFCMV9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDMpCitTSUdfRVhQUl9ERUNMKFZQSUczLCBWUEkxOCwgVlBJMThfREVTQywgQUIxX0RFU0MpOworU0lHX0VYUFJfREVDTChWUElHMywgVlBJMjQsIFZQSTI0X0RFU0MsIEFCMV9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBJRzMsIFZQSTMwLCBWUEkzMF9ERVNDLCBBQjFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woVlBJRzMsIFNJR19FWFBSX1BUUihWUElHMywgVlBJMTgpLAorCQlTSUdfRVhQUl9QVFIoVlBJRzIsIFZQSTI0KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV00zLCBQV00zLCBBQjFfREVTQyk7CitNU19QSU5fREVDTChBQjEsIEdQSU9OMywgVlBJRzMsIFBXTTMpOworRlVOQ19HUk9VUF9ERUNMKFBXTTMsIEFCMSk7CisKKyNkZWZpbmUgVzUgMTA4CisjZGVmaW5lIFc1X0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDQpCitTSUdfRVhQUl9ERUNMKFZQSUc0LCBWUEkxOCwgVlBJMThfREVTQywgVzVfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUc0LCBWUEkyNCwgVlBJMjRfREVTQywgVzVfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUc0LCBWUEkzMCwgVlBJMzBfREVTQywgVzVfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woVlBJRzQsIFNJR19FWFBSX1BUUihWUElHNCwgVlBJMTgpLAorCQlTSUdfRVhQUl9QVFIoVlBJRzIsIFZQSTI0KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV000LCBQV000LCBXNV9ERVNDKTsKK01TX1BJTl9ERUNMKFc1LCBHUElPTjQsIFZQSUc0LCBQV000KTsKK0ZVTkNfR1JPVVBfREVDTChQV000LCBXNSk7CisKKyNkZWZpbmUgWTQgMTA5CisjZGVmaW5lIFk0X0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDUpCitTSUdfRVhQUl9ERUNMKFZQSUc1LCBWUEkxOCwgVlBJMThfREVTQywgWTRfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUc1LCBWUEkyNCwgVlBJMjRfREVTQywgWTRfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQSUc1LCBWUEkzMCwgVlBJMzBfREVTQywgWTRfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woVlBJRzUsIFNJR19FWFBSX1BUUihWUElHNSwgVlBJMTgpLAorCQlTSUdfRVhQUl9QVFIoVlBJRzIsIFZQSTI0KSwKKwkJU0lHX0VYUFJfUFRSKFZQSUcyLCBWUEkzMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV001LCBQV001LCBZNF9ERVNDKTsKK01TX1BJTl9ERUNMKFk0LCBHUElPTjUsIFZQSUc1LCBQV001KTsKK0ZVTkNfR1JPVVBfREVDTChQV001LCBZNCk7CisKKyNkZWZpbmUgQUEzIDExMAorI2RlZmluZSBBQTNfREVTQyAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCA2KQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUElHNiwgVlBJMzAsIFZQSTMwX0RFU0MsIEFBM19ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNNiwgUFdNNiwgQUEzX0RFU0MpOworTVNfUElOX0RFQ0woQUEzLCBHUElPTjYsIFZQSUc2LCBQV002KTsKK0ZVTkNfR1JPVVBfREVDTChQV002LCBBQTMpOworCisjZGVmaW5lIEFCMiAxMTEKKyNkZWZpbmUgQUIyX0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgNykKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJRzcsIFZQSTMwLCBWUEkzMF9ERVNDLCBBQjJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTcsIFBXTTcsIEFCMl9ERVNDKTsKK01TX1BJTl9ERUNMKEFCMiwgR1BJT043LCBWUElHNywgUFdNNyk7CitGVU5DX0dST1VQX0RFQ0woUFdNNywgQUIyKTsKKworI2RlZmluZSBWNiAxMTIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJRzgsIFZQSTI0LCBWUEkyNF9ERVNDLCBTSUdfREVTQ19TRVQoU0NVODgsIDgpKTsKK1NTX1BJTl9ERUNMKFY2LCBHUElPTzAsIFZQSUc4KTsKKworI2RlZmluZSBZNSAxMTMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBJRzksIFZQSTI0LCBWUEkyNF9ERVNDLCBTSUdfREVTQ19TRVQoU0NVODgsIDkpKTsKK1NTX1BJTl9ERUNMKFk1LCBHUElPTzEsIFZQSUc5KTsKKworRlVOQ19HUk9VUF9ERUNMKFZQSTE4LCBUNSwgVTMsIFYxLCBVNCwgVjIsIEFBMjIsIFc1LCBZNCwgQUEzLCBBQjIpOworRlVOQ19HUk9VUF9ERUNMKFZQSTI0LCBUNSwgVTMsIFYxLCBVNCwgVjIsIEFBMjIsIFc1LCBZNCwgQUEzLCBBQjIsIFY2LCBZNSk7CitGVU5DX0dST1VQX0RFQ0woVlBJMzAsIFQ1LCBVMywgVjEsIFU0LCBWMiwgVzEsIFU1LCBXNCwgWTMsIEFBMjIsIFc1LCBZNCwgQUEzLAorCQlBQjIpOworCisjZGVmaW5lIFk3IDEyNQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPUDUsIEdQSU9QNSk7CitNU19QSU5fREVDTF8oWTcsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9QNSkpOworCisjZGVmaW5lIEFBNyAxMjYKK1NTU0ZfUElOX0RFQ0woQUE3LCBHUElPUDYsIEJNQ0lOVCwgU0lHX0RFU0NfU0VUKFNDVTg4LCAyMikpOworCisjZGVmaW5lIEFCNyAxMjcKK1NTU0ZfUElOX0RFQ0woQUI3LCBHUElPUDcsIEZMQUNLLCBTSUdfREVTQ19TRVQoU0NVODgsIDIzKSk7CisKKyNkZWZpbmUgSTJDM19ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMTYpCisKKyNkZWZpbmUgRDMgMTI4CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDMsIEkyQzMsIEkyQzNfREVTQyk7CitTU19QSU5fREVDTChEMywgR1BJT1EwLCBTQ0wzKTsKKworI2RlZmluZSBDMiAxMjkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMywgSTJDMywgSTJDM19ERVNDKTsKK1NTX1BJTl9ERUNMKEMyLCBHUElPUTEsIFNEQTMpOworCitGVU5DX0dST1VQX0RFQ0woSTJDMywgRDMsIEMyKTsKKworI2RlZmluZSBJMkM0X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAxNykKKworI2RlZmluZSBCMSAxMzAKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMNCwgSTJDNCwgSTJDNF9ERVNDKTsKK1NTX1BJTl9ERUNMKEIxLCBHUElPUTIsIFNDTDQpOworCisjZGVmaW5lIEY1IDEzMQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE0LCBJMkM0LCBJMkM0X0RFU0MpOworU1NfUElOX0RFQ0woRjUsIEdQSU9RMywgU0RBNCk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM0LCBCMSwgRjUpOworCisjZGVmaW5lIERBU0g5MDI4X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyOCkKKworI2RlZmluZSBIMiAxMzQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoREFTSEgyLCBEQVNISDIsIERBU0g5MDI4X0RFU0MpOworU1NfUElOX0RFQ0woSDIsIEdQSU9RNiwgREFTSEgyKTsKKworI2RlZmluZSBIMSAxMzUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoREFTSEgxLCBEQVNISDEsIERBU0g5MDI4X0RFU0MpOworU1NfUElOX0RFQ0woSDEsIEdQSU9RNywgREFTSEgxKTsKKworI2RlZmluZSBWMjAgMTM2CitTU1NGX1BJTl9ERUNMKFYyMCwgR1BJT1IwLCBST01DUzEsIFNJR19ERVNDX1NFVChTQ1U4OCwgMjQpKTsKKworI2RlZmluZSBXMjEgMTM3CitTU1NGX1BJTl9ERUNMKFcyMSwgR1BJT1IxLCBST01DUzIsIFNJR19ERVNDX1NFVChTQ1U4OCwgMjUpKTsKKworI2RlZmluZSBZMjIgMTM4CitTU1NGX1BJTl9ERUNMKFkyMiwgR1BJT1IyLCBST01DUzMsIFNJR19ERVNDX1NFVChTQ1U4OCwgMjYpKTsKKworI2RlZmluZSBVMTkgMTM5CitTU1NGX1BJTl9ERUNMKFUxOSwgR1BJT1IzLCBST01DUzQsIFNJR19ERVNDX1NFVChTQ1U4OCwgMjcpKTsKKworI2RlZmluZSBWUE9PRkYwX0RFU0MJeyBTQ1U5NCwgR0VOTUFTSygxLCAwKSwgMCwgMCB9CisjZGVmaW5lIFZQTzEyX0RFU0MJeyBTQ1U5NCwgR0VOTUFTSygxLCAwKSwgMSwgMCB9CisjZGVmaW5lIFZQTzI0X0RFU0MJeyBTQ1U5NCwgR0VOTUFTSygxLCAwKSwgMiwgMCB9CisjZGVmaW5lIFZQT09GRjFfREVTQwl7IFNDVTk0LCBHRU5NQVNLKDEsIDApLCAzLCAwIH0KKyNkZWZpbmUgVlBPX09GRl8xMiAgICAgIHsgU0NVOTQsIDB4MiwgMCwgMCB9CisjZGVmaW5lIFZQT18yNF9PRkYgICAgICBTSUdfREVTQ19TRVQoU0NVOTQsIDEpCisKKyNkZWZpbmUgVjIxIDE0MAorI2RlZmluZSBWMjFfREVTQwlTSUdfREVTQ19TRVQoU0NVODgsIDI4KQorU0lHX0VYUFJfREVDTChST01BMjQsIFJPTTgsIFYyMV9ERVNDLCBWUE9fT0ZGXzEyKTsKK1NJR19FWFBSX0RFQ0woUk9NQTI0LCBST00xNiwgVjIxX0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfREVDTChST01BMjQsIFJPTTE2UywgVjIxX0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfTElTVF9ERUNMKFJPTUEyNCwgU0lHX0VYUFJfUFRSKFJPTUEyNCwgUk9NOCksCisJCVNJR19FWFBSX1BUUihST01BMjQsIFJPTTE2KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUEyNCwgUk9NMTZTKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFZQT1I2LCBWUE8yNCwgVjIxX0RFU0MsIFZQT18yNF9PRkYpOworTVNfUElOX0RFQ0woVjIxLCBHUElPUjQsIFJPTUEyNCwgVlBPUjYpOworCisjZGVmaW5lIFcyMiAxNDEKKyNkZWZpbmUgVzIyX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTg4LCAyOSkKK1NJR19FWFBSX0RFQ0woUk9NQTI1LCBST004LCBXMjJfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9ERUNMKFJPTUEyNSwgUk9NMTYsIFcyMl9ERVNDLCBWUE9fT0ZGXzEyKTsKK1NJR19FWFBSX0RFQ0woUk9NQTI1LCBST00xNlMsIFcyMl9ERVNDLCBWUE9fT0ZGXzEyKTsKK1NJR19FWFBSX0xJU1RfREVDTChST01BMjUsIFNJR19FWFBSX1BUUihST01BMjUsIFJPTTgpLAorCQlTSUdfRVhQUl9QVFIoUk9NQTI1LCBST00xNiksCisJCVNJR19FWFBSX1BUUihST01BMjUsIFJPTTE2UykpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUE9SNywgVlBPMjQsIFcyMl9ERVNDLCBWUE9fMjRfT0ZGKTsKK01TX1BJTl9ERUNMKFcyMiwgR1BJT1I1LCBST01BMjUsIFZQT1I3KTsKKworI2RlZmluZSBDNiAxNDIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTURDMSwgTURJTzEsIFNJR19ERVNDX1NFVChTQ1U4OCwgMzApKTsKK1NTX1BJTl9ERUNMKEM2LCBHUElPUjYsIE1EQzEpOworCisjZGVmaW5lIEE1IDE0MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShNRElPMSwgTURJTzEsIFNJR19ERVNDX1NFVChTQ1U4OCwgMzEpKTsKK1NTX1BJTl9ERUNMKEE1LCBHUElPUjcsIE1ESU8xKTsKKworRlVOQ19HUk9VUF9ERUNMKE1ESU8xLCBDNiwgQTUpOworCisjZGVmaW5lIFUyMSAxNDQKKyNkZWZpbmUgVTIxX0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgMCkKK1NJR19FWFBSX0RFQ0woUk9NRDQsIFJPTTgsIFUyMV9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfREVDTChST01ENCwgUk9NMTYsIFUyMV9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfREVDTChST01ENCwgUk9NMTZTLCBVMjFfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChST01ENCwgU0lHX0VYUFJfUFRSKFJPTUQ0LCBST004KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUQ0LCBST00xNiksCisJCVNJR19FWFBSX1BUUihST01ENCwgUk9NMTZTKSk7CitTSUdfRVhQUl9ERUNMKFZQT0RFLCBWUE8xMiwgVTIxX0RFU0MsIFZQTzEyX0RFU0MpOworU0lHX0VYUFJfREVDTChWUE9ERSwgVlBPMjQsIFUyMV9ERVNDLCBWUE8xMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFZQT0RFLCBWUE8xMiwgVlBPMjQpOworTVNfUElOX0RFQ0woVTIxLCBHUElPUzAsIFJPTUQ0LCBWUE9ERSk7CisKKyNkZWZpbmUgVDE5IDE0NQorI2RlZmluZSBUMTlfREVTQyAgICAgICAgU0lHX0RFU0NfU0VUKFNDVThDLCAxKQorU0lHX0VYUFJfREVDTChST01ENSwgUk9NOCwgVDE5X0RFU0MsIFZQT09GRjBfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQ1LCBST00xNiwgVDE5X0RFU0MsIFZQT09GRjBfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTUQ1LCBST00xNlMsIFQxOV9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFJPTUQ1LCBTSUdfRVhQUl9QVFIoUk9NRDUsIFJPTTgpLAorCQlTSUdfRVhQUl9QVFIoUk9NRDUsIFJPTTE2KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUQ1LCBST00xNlMpKTsKK1NJR19FWFBSX0RFQ0woVlBPSFMsIFZQTzEyLCBUMTlfREVTQywgVlBPMTJfREVTQyk7CitTSUdfRVhQUl9ERUNMKFZQT0hTLCBWUE8yNCwgVDE5X0RFU0MsIFZQTzI0X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoVlBPSFMsIFZQTzEyLCBWUE8yNCk7CitNU19QSU5fREVDTChUMTksIEdQSU9TMSwgUk9NRDUsIFZQT0hTKTsKKworI2RlZmluZSBWMjIgMTQ2CisjZGVmaW5lIFYyMl9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDIpCitTSUdfRVhQUl9ERUNMKFJPTUQ2LCBST004LCBWMjJfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDYsIFJPTTE2LCBWMjJfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NRDYsIFJPTTE2UywgVjIyX0RFU0MsIFZQT09GRjBfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woUk9NRDYsIFNJR19FWFBSX1BUUihST01ENiwgUk9NOCksCisJCVNJR19FWFBSX1BUUihST01ENiwgUk9NMTYpLAorCQlTSUdfRVhQUl9QVFIoUk9NRDYsIFJPTTE2UykpOworU0lHX0VYUFJfREVDTChWUE9WUywgVlBPMTIsIFYyMl9ERVNDLCBWUE8xMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBPVlMsIFZQTzI0LCBWMjJfREVTQywgVlBPMjRfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChWUE9WUywgVlBPMTIsIFZQTzI0KTsKK01TX1BJTl9ERUNMKFYyMiwgR1BJT1MyLCBST01ENiwgVlBPVlMpOworCisjZGVmaW5lIFUyMCAxNDcKKyNkZWZpbmUgVTIwX0RFU0MgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgMykKK1NJR19FWFBSX0RFQ0woUk9NRDcsIFJPTTgsIFUyMF9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfREVDTChST01ENywgUk9NMTYsIFUyMF9ERVNDLCBWUE9PRkYwX0RFU0MpOworU0lHX0VYUFJfREVDTChST01ENywgUk9NMTZTLCBVMjBfREVTQywgVlBPT0ZGMF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTChST01ENywgU0lHX0VYUFJfUFRSKFJPTUQ3LCBST004KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUQ3LCBST00xNiksCisJCVNJR19FWFBSX1BUUihST01ENywgUk9NMTZTKSk7CitTSUdfRVhQUl9ERUNMKFZQT0NMSywgVlBPMTIsIFUyMF9ERVNDLCBWUE8xMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woVlBPQ0xLLCBWUE8yNCwgVTIwX0RFU0MsIFZQTzI0X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoVlBPQ0xLLCBWUE8xMiwgVlBPMjQpOworTVNfUElOX0RFQ0woVTIwLCBHUElPUzMsIFJPTUQ3LCBWUE9DTEspOworCisjZGVmaW5lIFIxOCAxNDgKKyNkZWZpbmUgUk9NT0VfREVTQyAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgNCkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1M0LCBHUElPUzQpOworU0lHX0VYUFJfREVDTChST01PRSwgUk9NOCwgUk9NT0VfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTU9FLCBST00xNiwgUk9NT0VfREVTQyk7CitTSUdfRVhQUl9ERUNMKFJPTU9FLCBST00xNlMsIFJPTU9FX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMKFJPTU9FLCBTSUdfRVhQUl9QVFIoUk9NT0UsIFJPTTgpLAorCQlTSUdfRVhQUl9QVFIoUk9NT0UsIFJPTTE2KSwKKwkJU0lHX0VYUFJfUFRSKFJPTU9FLCBST00xNlMpKTsKK01TX1BJTl9ERUNMXyhSMTgsIFNJR19FWFBSX0xJU1RfUFRSKFJPTU9FKSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1M0KSk7CisKKyNkZWZpbmUgTjIxIDE0OQorI2RlZmluZSBST01XRV9ERVNDICAgICAgU0lHX0RFU0NfU0VUKFNDVThDLCA1KQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPUzUsIEdQSU9TNSk7CitTSUdfRVhQUl9ERUNMKFJPTVdFLCBST004LCBST01XRV9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NV0UsIFJPTTE2LCBST01XRV9ERVNDKTsKK1NJR19FWFBSX0RFQ0woUk9NV0UsIFJPTTE2UywgUk9NV0VfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0woUk9NV0UsIFNJR19FWFBSX1BUUihST01XRSwgUk9NOCksCisJCVNJR19FWFBSX1BUUihST01XRSwgUk9NMTYpLAorCQlTSUdfRVhQUl9QVFIoUk9NV0UsIFJPTTE2UykpOworTVNfUElOX0RFQ0xfKE4yMSwgU0lHX0VYUFJfTElTVF9QVFIoUk9NV0UpLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPUzUpKTsKKworI2RlZmluZSBMMjIgMTUwCisjZGVmaW5lIEwyMl9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDYpCitTSUdfRVhQUl9ERUNMKFJPTUEyMiwgUk9NOCwgTDIyX0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfREVDTChST01BMjIsIFJPTTE2LCBMMjJfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9ERUNMKFJPTUEyMiwgUk9NMTZTLCBMMjJfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9MSVNUX0RFQ0woUk9NQTIyLCBTSUdfRVhQUl9QVFIoUk9NQTIyLCBST004KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUEyMiwgUk9NMTYpLAorCQlTSUdfRVhQUl9QVFIoUk9NQTIyLCBST00xNlMpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBPUjQsIFZQTzI0LCBMMjJfREVTQywgVlBPXzI0X09GRik7CitNU19QSU5fREVDTChMMjIsIEdQSU9TNiwgUk9NQTIyLCBWUE9SNCk7CisKKyNkZWZpbmUgSzE4IDE1MQorI2RlZmluZSBLMThfREVTQwlTSUdfREVTQ19TRVQoU0NVOEMsIDcpCitTSUdfRVhQUl9ERUNMKFJPTUEyMywgUk9NOCwgSzE4X0RFU0MsIFZQT19PRkZfMTIpOworU0lHX0VYUFJfREVDTChST01BMjMsIFJPTTE2LCBLMThfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9ERUNMKFJPTUEyMywgUk9NMTZTLCBLMThfREVTQywgVlBPX09GRl8xMik7CitTSUdfRVhQUl9MSVNUX0RFQ0woUk9NQTIzLCBTSUdfRVhQUl9QVFIoUk9NQTIzLCBST004KSwKKwkJU0lHX0VYUFJfUFRSKFJPTUEyMywgUk9NMTYpLAorCQlTSUdfRVhQUl9QVFIoUk9NQTIzLCBST00xNlMpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVlBPUjUsIFZQTzI0LCBLMThfREVTQywgVlBPXzI0X09GRik7CitNU19QSU5fREVDTChLMTgsIEdQSU9TNywgUk9NQTIzLCBWUE9SNSk7CisKK0ZVTkNfR1JPVVBfREVDTChST004LCBWMjAsIFUyMSwgVDE5LCBWMjIsIFUyMCwgUjE4LCBOMjEsIEwyMiwgSzE4LCBXMjEsIFkyMiwKKwkJVTE5KTsKK0ZVTkNfR1JPVVBfREVDTChST00xNiwgVjIwLCBVMjEsIFQxOSwgVjIyLCBVMjAsIFIxOCwgTjIxLCBMMjIsIEsxOCwKKwkJQTgsIEM3LCBCNywgQTcsIEQ3LCBCNiwgQTYsIEU3LCBXMjEsIFkyMiwgVTE5KTsKK0ZVTkNfR1JPVVBfREVDTChWUE8xMiwgVTIxLCBUMTksIFYyMiwgVTIwKTsKK0ZVTkNfR1JPVVBfREVDTChWUE8yNCwgVTIxLCBUMTksIFYyMiwgVTIwLCBMMjIsIEsxOCwgVjIxLCBXMjIpOworCisjZGVmaW5lIFJNSUkxX0RFU0MgICAgICBTSUdfREVTQ19CSVQoSFdfU1RSQVAxLCA2LCAwKQorCisjZGVmaW5lIEExMiAxNTIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1QwLCBHUElPVDAsIFNJR19ERVNDX1NFVChTQ1VBMCwgMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVRYRU4sIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxVFhDSywgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhBMTIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UMCksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxVFhFTiksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVRYQ0spKTsKKworI2RlZmluZSBCMTIgMTUzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UMSwgR1BJT1QxLCBTSUdfREVTQ19TRVQoU0NVQTAsIDEpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoREFTSEIxMiwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFUWENUTCwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhCMTIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UMSksIFNJR19FWFBSX0xJU1RfUFRSKERBU0hCMTIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWENUTCkpOworCisjZGVmaW5lIEMxMiAxNTQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1QyLCBHUElPVDIsIFNJR19ERVNDX1NFVChTQ1VBMCwgMikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVRYRDAsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxVFhEMCwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhDMTIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UMiksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxVFhEMCksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVRYRDApKTsKKworI2RlZmluZSBEMTIgMTU1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UMywgR1BJT1QzLCBTSUdfREVTQ19TRVQoU0NVQTAsIDMpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFUWEQxLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYRDEsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oRDEyLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDMpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVRYRDEpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQxKSk7CisKKyNkZWZpbmUgRTEyIDE1NgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDQsIEdQSU9UNCwgU0lHX0RFU0NfU0VUKFNDVUEwLCA0KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKERBU0hFMTIsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxVFhEMiwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhFMTIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UNCksIFNJR19FWFBSX0xJU1RfUFRSKERBU0hFMTIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQyKSk7CisKKyNkZWZpbmUgQTEzIDE1NworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDUsIEdQSU9UNSwgU0lHX0RFU0NfU0VUKFNDVUEwLCA1KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKERBU0hBMTMsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxVFhEMywgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhBMTMsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UNSksIFNJR19FWFBSX0xJU1RfUFRSKERBU0hBMTMpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQzKSk7CisKKyNkZWZpbmUgRTExIDE2NAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTQsIEdQSU9VNCwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxMikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMVJDTEssIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhDSywgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhFMTEsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9VNCksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxUkNMSyksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYQ0spKTsKKworI2RlZmluZSBEMTEgMTY1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNSwgR1BJT1U1LCBTSUdfREVTQ19TRVQoU0NVQTAsIDEzKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKERBU0hEMTEsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhDVEwsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oRDExLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTUpLCBTSUdfRVhQUl9MSVNUX1BUUihEQVNIRDExKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxUlhDVEwpKTsKKworI2RlZmluZSBDMTEgMTY2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNiwgR1BJT1U2LCBTSUdfREVTQ19TRVQoU0NVQTAsIDE0KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUlhEMCwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWEQwLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEMxMSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1U2KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFSWEQwKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxUlhEMCkpOworCisjZGVmaW5lIEIxMSAxNjcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1U3LCBHUElPVTcsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTUpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFSWEQxLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYRDEsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQjExLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTcpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVJYRDEpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWEQxKSk7CisKKyNkZWZpbmUgQTExIDE2OAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjAsIEdQSU9WMCwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxNikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMUNSU0RWLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYRDIsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQTExLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVjApLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMUNSU0RWKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxUlhEMikpOworCisjZGVmaW5lIEUxMCAxNjkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1YxLCBHUElPVjEsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTcpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFSWEVSLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYRDMsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oRTEwLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVjEpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVJYRVIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWEQzKSk7CisKK0ZVTkNfR1JPVVBfREVDTChSTUlJMSwgQTEyLCBCMTIsIEMxMiwgRDEyLCBFMTIsIEExMywgRTExLCBEMTEsIEMxMSwgQjExLCBBMTEsCisJCUUxMCk7CitGVU5DX0dST1VQX0RFQ0woUkdNSUkxLCBBMTIsIEIxMiwgQzEyLCBEMTIsIEUxMiwgQTEzLCBFMTEsIEQxMSwgQzExLCBCMTEsIEExMSwKKwkJRTEwKTsKKworLyogTm90ZSB3ZSBhY2NvdW50IGZvciBHUElPWTQtR1BJT1k3IGV2ZW4gdGhvdWdoIHRoZXkncmUgbm90IHZhbGlkLCB0aHVzIDIxNgorICogcGlucyBiZWNvbWVzIDIyMC4KKyAqLworI2RlZmluZSBBU1BFRURfRzRfTlJfUElOUyAyMjAKKworLyogUGlucywgZ3JvdXBzIGFuZCBmdW5jdGlvbnMgYXJlIHNvcnQoMSk6ZWQgYWxwaGFiZXRpY2FsbHkgZm9yIHNhbml0eSAqLworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgYXNwZWVkX2c0X3BpbnNbQVNQRUVEX0c0X05SX1BJTlNdID0geworCUFTUEVFRF9QSU5DVFJMX1BJTihBMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEExMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEExMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEExMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEExNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEExOCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEE1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBNyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEE4KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQUEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQUEyMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFBMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFBNyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFCMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFCMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEFCNyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjExKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjE0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjE1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjE5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEI0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCNyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzExKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzE0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzE1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzE3KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEM0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDNiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEM3KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTcpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMTgpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihENSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQ3KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTEwKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTExKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTEyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTE0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTE2KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEU1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTcpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihGMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEY0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRjUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihHNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEgxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oSDE5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oSDIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihIMjApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihKMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEsxOCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEwyMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKE4yMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFIxOCksCisJQVNQRUVEX1BJTkNUUkxfUElOKFQxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVDE5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVDIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihUNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKFQ1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVMTgpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVMTkpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKFUyMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKFUyMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFUzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihVNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFYxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWMjApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWMjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWMjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWNiksCisJQVNQRUVEX1BJTkNUUkxfUElOKFcxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVzIxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVzIyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVzQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihXNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFkyMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKFkzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oWTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihZNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFk3KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9ncm91cCBhc3BlZWRfZzRfZ3JvdXBzW10gPSB7CisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoQUNQSSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoQk1DSU5UKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChERENDTEspLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEREQ0RBVCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoRkxBQ0spLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEZMQlVTWSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoRkxXUCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoR1BJRDApLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEdQSUUwKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChHUElFMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoR1BJRTQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEdQSUU2KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkMxMCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMTEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzEyKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkMxMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDNyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDOCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDOSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTFBDUEQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKExQQ1BNRSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTFBDUE1FKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChMUENTTUkpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE1ESU8xKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChNRElPMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTkNUUzEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5DVFMzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChOQ1RTNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTkRDRDEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5EQ0QzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChORENENCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTkRTUjEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5EU1IzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChORFRSMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTkRUUjMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5SSTEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5SSTMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5SSTQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE5SVFMxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChOUlRTMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUkdNSUkxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChSTUlJMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUk9NMTYpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJPTTgpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJPTUNTMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUk9NQ1MyKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChST01DUzMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJPTUNTNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUlhEMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUlhEMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUlhENCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoU0QxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChTR1BNSSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoU0lPUEJJKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChTSU9QQk8pLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFRJTUVSMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVElNRVI1KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUSU1FUjYpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFRJTUVSNyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVElNRVI4KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUWEQxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUWEQzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUWEQ0KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChVQVJUNiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVkdBSFMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFZHQVZTKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChWUEkxOCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVlBJMjQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFZQSTMwKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChWUE8xMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVlBPMjQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Z1bmN0aW9uIGFzcGVlZF9nNF9mdW5jdGlvbnNbXSA9IHsKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEFDUEkpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoQk1DSU5UKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEREQ0NMSyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhERENEQVQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoRkxBQ0spLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoRkxCVVNZKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEZMV1ApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRDApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRTIpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRTQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRTYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTIpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzUpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDNiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM3KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzgpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDOSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhMUENQRCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhMUENQTUUpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoTFBDU01JKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE1ESU8xKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE1ESU8yKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5DVFMxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5DVFMzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5DVFM0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EQ0QxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EQ0QzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EQ0Q0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EU1IxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EU1IzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EVFIxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5EVFIzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5SSTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoTlJJMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhOUkk0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5SVFMxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKE5SVFMzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV00yKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV001KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNNyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhSR01JSTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUk1JSTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUk9NMTYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUk9NOCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhST01DUzEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUk9NQ1MyKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJPTUNTMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhST01DUzQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUlhEMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhSWEQzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJYRDQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoU0QxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFNHUE1JKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFNJT1BCSSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhTSU9QQk8pLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVElNRVIzKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRJTUVSNSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUSU1FUjYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVElNRVI3KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRJTUVSOCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUWEQxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRYRDMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVFhENCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhVQVJUNiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWR0FIUyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWR0FWUyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWUEkxOCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWUEkyNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWUEkzMCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWUE8xMiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhWUE8yNCksCit9OworCitzdGF0aWMgc3RydWN0IGFzcGVlZF9waW5jdHJsX2RhdGEgYXNwZWVkX2c0X3BpbmN0cmxfZGF0YSA9IHsKKwkucGlucyA9IGFzcGVlZF9nNF9waW5zLAorCS5ucGlucyA9IEFSUkFZX1NJWkUoYXNwZWVkX2c0X3BpbnMpLAorCS5ncm91cHMgPSBhc3BlZWRfZzRfZ3JvdXBzLAorCS5uZ3JvdXBzID0gQVJSQVlfU0laRShhc3BlZWRfZzRfZ3JvdXBzKSwKKwkuZnVuY3Rpb25zID0gYXNwZWVkX2c0X2Z1bmN0aW9ucywKKwkubmZ1bmN0aW9ucyA9IEFSUkFZX1NJWkUoYXNwZWVkX2c0X2Z1bmN0aW9ucyksCit9OworCitzdGF0aWMgc3RydWN0IHBpbm11eF9vcHMgYXNwZWVkX2c0X3Bpbm11eF9vcHMgPSB7CisJLmdldF9mdW5jdGlvbnNfY291bnQgPSBhc3BlZWRfcGlubXV4X2dldF9mbl9jb3VudCwKKwkuZ2V0X2Z1bmN0aW9uX25hbWUgPSBhc3BlZWRfcGlubXV4X2dldF9mbl9uYW1lLAorCS5nZXRfZnVuY3Rpb25fZ3JvdXBzID0gYXNwZWVkX3Bpbm11eF9nZXRfZm5fZ3JvdXBzLAorCS5zZXRfbXV4ID0gYXNwZWVkX3Bpbm11eF9zZXRfbXV4LAorCS5ncGlvX3JlcXVlc3RfZW5hYmxlID0gYXNwZWVkX2dwaW9fcmVxdWVzdF9lbmFibGUsCisJLnN0cmljdCA9IHRydWUsCit9OworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfb3BzIGFzcGVlZF9nNF9waW5jdHJsX29wcyA9IHsKKwkuZ2V0X2dyb3Vwc19jb3VudCA9IGFzcGVlZF9waW5jdHJsX2dldF9ncm91cHNfY291bnQsCisJLmdldF9ncm91cF9uYW1lID0gYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3VwX25hbWUsCisJLmdldF9ncm91cF9waW5zID0gYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3VwX3BpbnMsCisJLnBpbl9kYmdfc2hvdyA9IGFzcGVlZF9waW5jdHJsX3Bpbl9kYmdfc2hvdywKKwkuZHRfbm9kZV90b19tYXAgPSBwaW5jb25mX2dlbmVyaWNfZHRfbm9kZV90b19tYXBfcGluLAorCS5kdF9mcmVlX21hcCA9IHBpbmN0cmxfdXRpbHNfZnJlZV9tYXAsCit9OworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfZGVzYyBhc3BlZWRfZzRfcGluY3RybF9kZXNjID0geworCS5uYW1lID0gImFzcGVlZC1nNC1waW5jdHJsIiwKKwkucGlucyA9IGFzcGVlZF9nNF9waW5zLAorCS5ucGlucyA9IEFSUkFZX1NJWkUoYXNwZWVkX2c0X3BpbnMpLAorCS5wY3Rsb3BzID0gJmFzcGVlZF9nNF9waW5jdHJsX29wcywKKwkucG14b3BzID0gJmFzcGVlZF9nNF9waW5tdXhfb3BzLAorfTsKKworc3RhdGljIGludCBhc3BlZWRfZzRfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXNwZWVkX2c0X3BpbnMpOyBpKyspCisJCWFzcGVlZF9nNF9waW5zW2ldLm51bWJlciA9IGk7CisKKwlyZXR1cm4gYXNwZWVkX3BpbmN0cmxfcHJvYmUocGRldiwgJmFzcGVlZF9nNF9waW5jdHJsX2Rlc2MsCisJCQkmYXNwZWVkX2c0X3BpbmN0cmxfZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFzcGVlZF9nNF9waW5jdHJsX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJhc3BlZWQsYXN0MjQwMC1waW5jdHJsIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImFzcGVlZCxnNC1waW5jdHJsIiwgfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhc3BlZWRfZzRfcGluY3RybF9kcml2ZXIgPSB7CisJLnByb2JlID0gYXNwZWVkX2c0X3BpbmN0cmxfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYXNwZWVkLWc0LXBpbmN0cmwiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhc3BlZWRfZzRfcGluY3RybF9vZl9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBhc3BlZWRfZzRfcGluY3RybF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXNwZWVkX2c0X3BpbmN0cmxfZHJpdmVyKTsKK30KKworYXJjaF9pbml0Y2FsbChhc3BlZWRfZzRfcGluY3RybF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQtZzUuYyBiL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQtZzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFiODY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9waW5jdHJsLWFzcGVlZC1nNS5jCkBAIC0wLDAgKzEsODA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5tdXguaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYtZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICIuLi9jb3JlLmgiCisjaW5jbHVkZSAiLi4vcGluY3RybC11dGlscy5oIgorI2luY2x1ZGUgInBpbmN0cmwtYXNwZWVkLmgiCisKKyNkZWZpbmUgQVNQRUVEX0c1X05SX1BJTlMgMjI4CisKKyNkZWZpbmUgQ09ORDEJCVNJR19ERVNDX0JJVChTQ1U5MCwgNiwgMCkKKyNkZWZpbmUgQ09ORDIJCXsgU0NVOTQsIEdFTk1BU0soMSwgMCksIDAsIDAgfQorCisjZGVmaW5lIEIxNCAwCitTU1NGX1BJTl9ERUNMKEIxNCwgR1BJT0EwLCBNQUMxTElOSywgU0lHX0RFU0NfU0VUKFNDVTgwLCAwKSk7CisKKyNkZWZpbmUgRTEzIDMKK1NTU0ZfUElOX0RFQ0woRTEzLCBHUElPQTMsIFRJTUVSNCwgU0lHX0RFU0NfU0VUKFNDVTgwLCAzKSk7CisKKyNkZWZpbmUgSTJDOV9ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMjIpCisKKyNkZWZpbmUgQzE0IDQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMOSwgSTJDOSwgSTJDOV9ERVNDLCBDT05EMSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRJTUVSNSwgVElNRVI1LCBTSUdfREVTQ19TRVQoU0NVODAsIDQpLCBDT05EMSk7CitNU19QSU5fREVDTChDMTQsIEdQSU9BNCwgU0NMOSwgVElNRVI1KTsKKworRlVOQ19HUk9VUF9ERUNMKFRJTUVSNSwgQzE0KTsKKworI2RlZmluZSBBMTMgNQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE5LCBJMkM5LCBJMkM5X0RFU0MsIENPTkQxKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVElNRVI2LCBUSU1FUjYsIFNJR19ERVNDX1NFVChTQ1U4MCwgNSksIENPTkQxKTsKK01TX1BJTl9ERUNMKEExMywgR1BJT0E1LCBTREE5LCBUSU1FUjYpOworCitGVU5DX0dST1VQX0RFQ0woVElNRVI2LCBBMTMpOworCitGVU5DX0dST1VQX0RFQ0woSTJDOSwgQzE0LCBBMTMpOworCisjZGVmaW5lIE1ESU8yX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyKQorCisjZGVmaW5lIEMxMyA2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE1EQzIsIE1ESU8yLCBNRElPMl9ERVNDLCBDT05EMSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFRJTUVSNywgVElNRVI3LCBTSUdfREVTQ19TRVQoU0NVODAsIDYpLCBDT05EMSk7CitNU19QSU5fREVDTChDMTMsIEdQSU9BNiwgTURDMiwgVElNRVI3KTsKKworRlVOQ19HUk9VUF9ERUNMKFRJTUVSNywgQzEzKTsKKworI2RlZmluZSBCMTMgNworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShNRElPMiwgTURJTzIsIE1ESU8yX0RFU0MsIENPTkQxKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoVElNRVI4LCBUSU1FUjgsIFNJR19ERVNDX1NFVChTQ1U4MCwgNyksIENPTkQxKTsKK01TX1BJTl9ERUNMKEIxMywgR1BJT0E3LCBNRElPMiwgVElNRVI4KTsKKworRlVOQ19HUk9VUF9ERUNMKFRJTUVSOCwgQjEzKTsKKworRlVOQ19HUk9VUF9ERUNMKE1ESU8yLCBDMTMsIEIxMyk7CisKKyNkZWZpbmUgSDIwIDE1CitHUElPX1BJTl9ERUNMKEgyMCwgR1BJT0I3KTsKKworI2RlZmluZSBTRDFfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDApCisKKyNkZWZpbmUgQzEyIDE2CisjZGVmaW5lIEkyQzEwX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyMykKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxQ0xLLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMTAsIEkyQzEwLCBJMkMxMF9ERVNDKTsKK01TX1BJTl9ERUNMKEMxMiwgR1BJT0MwLCBTRDFDTEssIFNDTDEwKTsKKworI2RlZmluZSBBMTIgMTcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxQ01ELCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTAsIEkyQzEwLCBJMkMxMF9ERVNDKTsKK01TX1BJTl9ERUNMKEExMiwgR1BJT0MxLCBTRDFDTUQsIFNEQTEwKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzEwLCBDMTIsIEExMik7CisKKyNkZWZpbmUgQjEyIDE4CisjZGVmaW5lIEkyQzExX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNCkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxREFUMCwgU0QxLCBTRDFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDExLCBJMkMxMSwgSTJDMTFfREVTQyk7CitNU19QSU5fREVDTChCMTIsIEdQSU9DMiwgU0QxREFUMCwgU0NMMTEpOworCisjZGVmaW5lIEQ5ICAxOQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQxLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTEsIEkyQzExLCBJMkMxMV9ERVNDKTsKK01TX1BJTl9ERUNMKEQ5LCBHUElPQzMsIFNEMURBVDEsIFNEQTExKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzExLCBCMTIsIEQ5KTsKKworI2RlZmluZSBEMTAgMjAKKyNkZWZpbmUgSTJDMTJfREVTQwlTSUdfREVTQ19TRVQoU0NVOTAsIDI1KQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTRDFEQVQyLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMMTIsIEkyQzEyLCBJMkMxMl9ERVNDKTsKK01TX1BJTl9ERUNMKEQxMCwgR1BJT0M0LCBTRDFEQVQyLCBTQ0wxMik7CisKKyNkZWZpbmUgRTEyIDIxCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMURBVDMsIFNEMSwgU0QxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREExMiwgSTJDMTIsIEkyQzEyX0RFU0MpOworTVNfUElOX0RFQ0woRTEyLCBHUElPQzUsIFNEMURBVDMsIFNEQTEyKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzEyLCBEMTAsIEUxMik7CisKKyNkZWZpbmUgQzExIDIyCisjZGVmaW5lIEkyQzEzX0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNikKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QxQ0QsIFNEMSwgU0QxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0wxMywgSTJDMTMsIEkyQzEzX0RFU0MpOworTVNfUElOX0RFQ0woQzExLCBHUElPQzYsIFNEMUNELCBTQ0wxMyk7CisKKyNkZWZpbmUgQjExIDIzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMVdQLCBTRDEsIFNEMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTMsIEkyQzEzLCBJMkMxM19ERVNDKTsKK01TX1BJTl9ERUNMKEIxMSwgR1BJT0M3LCBTRDFXUCwgU0RBMTMpOworCitGVU5DX0dST1VQX0RFQ0woSTJDMTMsIEMxMSwgQjExKTsKK0ZVTkNfR1JPVVBfREVDTChTRDEsIEMxMiwgQTEyLCBCMTIsIEQ5LCBEMTAsIEUxMiwgQzExLCBCMTEpOworCisjZGVmaW5lIFNEMl9ERVNDICAgICAgICBTSUdfREVTQ19TRVQoU0NVOTAsIDEpCisjZGVmaW5lIEdQSUQwX0RFU0MgICAgICBTSUdfREVTQ19TRVQoU0NVOEMsIDgpCisjZGVmaW5lIEdQSURfREVTQyAgICAgICBTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCAyMSkKKworI2RlZmluZSBGMTkgMjQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QyQ0xLLCBTRDIsIFNEMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRDBJTiwgR1BJRDAsIEdQSUQwX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElEMElOLCBHUElELCBHUElEX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRDBJTiwgR1BJRDAsIEdQSUQpOworTVNfUElOX0RFQ0woRjE5LCBHUElPRDAsIFNEMkNMSywgR1BJRDBJTik7CisKKyNkZWZpbmUgRTIxIDI1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNEMkNNRCwgU0QyLCBTRDJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQwT1VULCBHUElEMCwgR1BJRDBfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQwT1VULCBHUElELCBHUElEX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRDBPVVQsIEdQSUQwLCBHUElEKTsKK01TX1BJTl9ERUNMKEUyMSwgR1BJT0QxLCBTRDJDTUQsIEdQSUQwT1VUKTsKKworRlVOQ19HUk9VUF9ERUNMKEdQSUQwLCBGMTksIEUyMSk7CisKKyNkZWZpbmUgR1BJRDJfREVTQyAgICAgIFNJR19ERVNDX1NFVChTQ1U4QywgOSkKKworI2RlZmluZSBEMjAgMjYKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QyREFUMCwgU0QyLCBTRDJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQySU4sIEdQSUQyLCBHUElEMl9ERVNDKTsKK1NJR19FWFBSX0RFQ0woR1BJRDJJTiwgR1BJRCwgR1BJRF9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKEdQSUQySU4sIEdQSUQyLCBHUElEKTsKK01TX1BJTl9ERUNMKEQyMCwgR1BJT0QyLCBTRDJEQVQwLCBHUElEMklOKTsKKworI2RlZmluZSBEMjEgMjcKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0QyREFUMSwgU0QyLCBTRDJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQyT1VULCBHUElEMiwgR1BJRDJfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUQyT1VULCBHUElELCBHUElEX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRDJPVVQsIEdQSUQyLCBHUElEKTsKK01TX1BJTl9ERUNMKEQyMSwgR1BJT0QzLCBTRDJEQVQxLCBHUElEMk9VVCk7CisKK0ZVTkNfR1JPVVBfREVDTChHUElEMiwgRDIwLCBEMjEpOworCisjZGVmaW5lIEdQSUVfREVTQwlTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCAyMSkKKyNkZWZpbmUgR1BJRTBfREVTQwlTSUdfREVTQ19TRVQoU0NVOEMsIDEyKQorCisjZGVmaW5lIEIyMCAzMgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOQ1RTMywgTkNUUzMsIFNJR19ERVNDX1NFVChTQ1U4MCwgMTYpKTsKK1NJR19FWFBSX0RFQ0woR1BJRTBJTiwgR1BJRTAsIEdQSUUwX0RFU0MpOworU0lHX0VYUFJfREVDTChHUElFMElOLCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTBJTiwgR1BJRTAsIEdQSUUpOworTVNfUElOX0RFQ0woQjIwLCBHUElPRTAsIE5DVFMzLCBHUElFMElOKTsKKworI2RlZmluZSBDMjAgMzMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkRDRDMsIE5EQ0QzLCBTSUdfREVTQ19TRVQoU0NVODAsIDE3KSk7CitTSUdfRVhQUl9ERUNMKEdQSUUwT1VULCBHUElFMCwgR1BJRTBfREVTQyk7CitTSUdfRVhQUl9ERUNMKEdQSUUwT1VULCBHUElFLCBHUElFX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoR1BJRTBPVVQsIEdQSUUwLCBHUElFKTsKK01TX1BJTl9ERUNMKEMyMCwgR1BJRTAsIE5EQ0QzLCBHUElFME9VVCk7CisKK0ZVTkNfR1JPVVBfREVDTChHUElFMCwgQjIwLCBDMjApOworCisjZGVmaW5lIFNQSTFfREVTQwlTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCAxMykKKyNkZWZpbmUgQzE4IDY0CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNZU0NTLCBTUEkxLCBDT05EMSwgU1BJMV9ERVNDKTsKK1NTX1BJTl9ERUNMKEMxOCwgR1BJT0kwLCBTWVNDUyk7CisKKyNkZWZpbmUgRTE1IDY1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNZU0NLLCBTUEkxLCBDT05EMSwgU1BJMV9ERVNDKTsKK1NTX1BJTl9ERUNMKEUxNSwgR1BJT0kxLCBTWVNDSyk7CisKKyNkZWZpbmUgQTE0IDY2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNZU01PU0ksIFNQSTEsIENPTkQxLCBTUEkxX0RFU0MpOworU1NfUElOX0RFQ0woQTE0LCBHUElPSTIsIFNZU01PU0kpOworCisjZGVmaW5lIEMxNiA2NworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTWVNNSVNPLCBTUEkxLCBDT05EMSwgU1BJMV9ERVNDKTsKK1NTX1BJTl9ERUNMKEMxNiwgR1BJT0kzLCBTWVNNSVNPKTsKKworRlVOQ19HUk9VUF9ERUNMKFNQSTEsIEMxOCwgRTE1LCBBMTQsIEMxNik7CisKKyNkZWZpbmUgTDIgNzMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0dQTUxELCBTR1BNLCBTSUdfREVTQ19TRVQoU0NVODQsIDkpKTsKK1NTX1BJTl9ERUNMKEwyLCBHUElPSjEsIFNHUE1MRCk7CisKKyNkZWZpbmUgTjMgNzQKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0dQTU8sIFNHUE0sIFNJR19ERVNDX1NFVChTQ1U4NCwgMTApKTsKK1NTX1BJTl9ERUNMKE4zLCBHUElPSjIsIFNHUE1PKTsKKworI2RlZmluZSBONCA3NQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTR1BNSSwgU0dQTSwgU0lHX0RFU0NfU0VUKFNDVTg0LCAxMSkpOworU1NfUElOX0RFQ0woTjQsIEdQSU9KMywgU0dQTUkpOworCisjZGVmaW5lIEkyQzVfREVTQyAgICAgICBTSUdfREVTQ19TRVQoU0NVOTAsIDE4KQorCisjZGVmaW5lIEwzIDgwCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDUsIEkyQzUsIEkyQzVfREVTQyk7CitTU19QSU5fREVDTChMMywgR1BJT0swLCBTQ0w1KTsKKworI2RlZmluZSBMNCA4MQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE1LCBJMkM1LCBJMkM1X0RFU0MpOworU1NfUElOX0RFQ0woTDQsIEdQSU9LMSwgU0RBNSk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM1LCBMMywgTDQpOworCisjZGVmaW5lIEkyQzZfREVTQyAgICAgICBTSUdfREVTQ19TRVQoU0NVOTAsIDE5KQorCisjZGVmaW5lIEwxIDgyCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDYsIEkyQzYsIEkyQzZfREVTQyk7CitTU19QSU5fREVDTChMMSwgR1BJT0syLCBTQ0w2KTsKKworI2RlZmluZSBOMiA4MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE2LCBJMkM2LCBJMkM2X0RFU0MpOworU1NfUElOX0RFQ0woTjIsIEdQSU9LMywgU0RBNik7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM2LCBMMSwgTjIpOworCisjZGVmaW5lIEkyQzdfREVTQyAgICAgICBTSUdfREVTQ19TRVQoU0NVOTAsIDIwKQorCisjZGVmaW5lIE4xIDg0CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDcsIEkyQzcsIEkyQzdfREVTQyk7CitTU19QSU5fREVDTChOMSwgR1BJT0s0LCBTQ0w3KTsKKworI2RlZmluZSBQMSA4NQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE3LCBJMkM3LCBJMkM3X0RFU0MpOworU1NfUElOX0RFQ0woUDEsIEdQSU9LNSwgU0RBNyk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM3LCBOMSwgUDEpOworCisjZGVmaW5lIEkyQzhfREVTQyAgICAgICBTSUdfREVTQ19TRVQoU0NVOTAsIDIxKQorCisjZGVmaW5lIFAyIDg2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDgsIEkyQzgsIEkyQzhfREVTQyk7CitTU19QSU5fREVDTChQMiwgR1BJT0s2LCBTQ0w4KTsKKworI2RlZmluZSBSMSA4NworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE4LCBJMkM4LCBJMkM4X0RFU0MpOworU1NfUElOX0RFQ0woUjEsIEdQSU9LNywgU0RBOCk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM4LCBQMiwgUjEpOworCisjZGVmaW5lIFZQSU9GRjBfREVTQyAgICB7IFNDVTkwLCBHRU5NQVNLKDUsIDQpLCAwLCAwIH0KKyNkZWZpbmUgVlBJT0ZGMV9ERVNDICAgIHsgU0NVOTAsIEdFTk1BU0soNSwgNCksIDEsIDAgfQorI2RlZmluZSBWUEkyNF9ERVNDICAgICAgeyBTQ1U5MCwgR0VOTUFTSyg1LCA0KSwgMiwgMCB9CisjZGVmaW5lIFZQSVJTVkRfREVTQyAgICB7IFNDVTkwLCBHRU5NQVNLKDUsIDQpLCAzLCAwIH0KKworI2RlZmluZSBWMiAxMDQKKyNkZWZpbmUgVjJfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgMCkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoREFTSE4wLCBEQVNITjAsIFZQSVJTVkRfREVTQywgVjJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTAsIFBXTTAsIFYyX0RFU0MsIENPTkQyKTsKK01TX1BJTl9ERUNMKFYyLCBHUElPTjAsIERBU0hOMCwgUFdNMCk7CitGVU5DX0dST1VQX0RFQ0woUFdNMCwgVjIpOworCisjZGVmaW5lIFcyIDEwNQorI2RlZmluZSBXMl9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCAxKQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShEQVNITjEsIERBU0hOMSwgVlBJUlNWRF9ERVNDLCBXMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNMSwgUFdNMSwgVzJfREVTQywgQ09ORDIpOworTVNfUElOX0RFQ0woVzIsIEdQSU9OMSwgREFTSE4xLCBQV00xKTsKK0ZVTkNfR1JPVVBfREVDTChQV00xLCBXMik7CisKKyNkZWZpbmUgVjMgMTA2CisjZGVmaW5lIFYzX0RFU0MgICAgICAgICBTSUdfREVTQ19TRVQoU0NVODgsIDIpCitTSUdfRVhQUl9ERUNMKFZQSUcyLCBWUEkyNCwgVlBJMjRfREVTQywgVjNfREVTQywgQ09ORDIpOworU0lHX0VYUFJfREVDTChWUElHMiwgVlBJUlNWRCwgVlBJUlNWRF9ERVNDLCBWM19ERVNDLCBDT05EMik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChWUElHMiwgVlBJMjQsIFZQSVJTVkQpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV00yLCBQV00yLCBWM19ERVNDLCBDT05EMik7CitNU19QSU5fREVDTChWMywgR1BJT04yLCBWUElHMiwgUFdNMik7CitGVU5DX0dST1VQX0RFQ0woUFdNMiwgVjMpOworCisjZGVmaW5lIFUzIDEwNworI2RlZmluZSBVM19ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCAzKQorU0lHX0VYUFJfREVDTChWUElHMywgVlBJMjQsIFZQSTI0X0RFU0MsIFUzX0RFU0MsIENPTkQyKTsKK1NJR19FWFBSX0RFQ0woVlBJRzMsIFZQSVJTVkQsIFZQSVJTVkRfREVTQywgVTNfREVTQywgQ09ORDIpOworU0lHX0VYUFJfTElTVF9ERUNMX0RVQUwoVlBJRzMsIFZQSTI0LCBWUElSU1ZEKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUFdNMywgUFdNMywgVTNfREVTQywgQ09ORDIpOworTVNfUElOX0RFQ0woVTMsIEdQSU9OMywgVlBJRzMsIFBXTTMpOworRlVOQ19HUk9VUF9ERUNMKFBXTTMsIFUzKTsKKworI2RlZmluZSBXMyAxMDgKKyNkZWZpbmUgVzNfREVTQyAgICAgICAgIFNJR19ERVNDX1NFVChTQ1U4OCwgNCkKK1NJR19FWFBSX0RFQ0woVlBJRzQsIFZQSTI0LCBWUEkyNF9ERVNDLCBXM19ERVNDLCBDT05EMik7CitTSUdfRVhQUl9ERUNMKFZQSUc0LCBWUElSU1ZELCBWUElSU1ZEX0RFU0MsIFczX0RFU0MsIENPTkQyKTsKK1NJR19FWFBSX0xJU1RfREVDTF9EVUFMKFZQSUc0LCBWUEkyNCwgVlBJUlNWRCk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFBXTTQsIFBXTTQsIFczX0RFU0MsIENPTkQyKTsKK01TX1BJTl9ERUNMKFczLCBHUElPTjQsIFZQSUc0LCBQV000KTsKK0ZVTkNfR1JPVVBfREVDTChQV000LCBXMyk7CisKKyNkZWZpbmUgQUEzIDEwOQorI2RlZmluZSBBQTNfREVTQyAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCA1KQorU0lHX0VYUFJfREVDTChWUElHNSwgVlBJMjQsIFZQSTI0X0RFU0MsIEFBM19ERVNDLCBDT05EMik7CitTSUdfRVhQUl9ERUNMKFZQSUc1LCBWUElSU1ZELCBWUElSU1ZEX0RFU0MsIEFBM19ERVNDLCBDT05EMik7CitTSUdfRVhQUl9MSVNUX0RFQ0xfRFVBTChWUElHNSwgVlBJMjQsIFZQSVJTVkQpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV001LCBQV001LCBBQTNfREVTQywgQ09ORDIpOworTVNfUElOX0RFQ0woQUEzLCBHUElPTjUsIFZQSUc1LCBQV001KTsKK0ZVTkNfR1JPVVBfREVDTChQV001LCBBQTMpOworCisjZGVmaW5lIFkzIDExMAorI2RlZmluZSBZM19ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCA2KQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUElHNiwgVlBJMjQsIFZQSTI0X0RFU0MsIFkzX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV002LCBQV002LCBZM19ERVNDLCBDT05EMik7CitNU19QSU5fREVDTChZMywgR1BJT042LCBWUElHNiwgUFdNNik7CitGVU5DX0dST1VQX0RFQ0woUFdNNiwgWTMpOworCisjZGVmaW5lIFQ0IDExMQorI2RlZmluZSBUNF9ERVNDICAgICAgICAgU0lHX0RFU0NfU0VUKFNDVTg4LCA3KQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShWUElHNywgVlBJMjQsIFZQSTI0X0RFU0MsIFQ0X0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShQV003LCBQV003LCBUNF9ERVNDLCBDT05EMik7CitNU19QSU5fREVDTChUNCwgR1BJT043LCBWUElHNywgUFdNNyk7CitGVU5DX0dST1VQX0RFQ0woUFdNNywgVDQpOworCisjZGVmaW5lIFY2IDEyNworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShEQVNIVjYsIERBU0hWNiwgU0lHX0RFU0NfU0VUKFNDVTkwLCAyOCksCisJCVNJR19ERVNDX1NFVChTQ1U4OCwgMjMpKTsKK1NTX1BJTl9ERUNMKFY2LCBHUElPUDcsIERBU0hWNik7CisKKyNkZWZpbmUgSTJDM19ERVNDCVNJR19ERVNDX1NFVChTQ1U5MCwgMTYpCisKKyNkZWZpbmUgQTExIDEyOAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTQ0wzLCBJMkMzLCBJMkMzX0RFU0MpOworU1NfUElOX0RFQ0woQTExLCBHUElPUTAsIFNDTDMpOworCisjZGVmaW5lIEExMCAxMjkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMywgSTJDMywgSTJDM19ERVNDKTsKK1NTX1BJTl9ERUNMKEExMCwgR1BJT1ExLCBTREEzKTsKKworRlVOQ19HUk9VUF9ERUNMKEkyQzMsIEExMSwgQTEwKTsKKworI2RlZmluZSBJMkM0X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAxNykKKworI2RlZmluZSBBOSAxMzAKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMNCwgSTJDNCwgSTJDNF9ERVNDKTsKK1NTX1BJTl9ERUNMKEE5LCBHUElPUTIsIFNDTDQpOworCisjZGVmaW5lIEI5IDEzMQorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShTREE0LCBJMkM0LCBJMkM0X0RFU0MpOworU1NfUElOX0RFQ0woQjksIEdQSU9RMywgU0RBNCk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkM0LCBBOSwgQjkpOworCisjZGVmaW5lIEkyQzE0X0RFU0MJU0lHX0RFU0NfU0VUKFNDVTkwLCAyNykKKworI2RlZmluZSBOMjEgMTMyCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFNDTDE0LCBJMkMxNCwgSTJDMTRfREVTQyk7CitTU19QSU5fREVDTChOMjEsIEdQSU9RNCwgU0NMMTQpOworCisjZGVmaW5lIE4yMiAxMzMKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0RBMTQsIEkyQzE0LCBJMkMxNF9ERVNDKTsKK1NTX1BJTl9ERUNMKE4yMiwgR1BJT1E1LCBTREExNCk7CisKK0ZVTkNfR1JPVVBfREVDTChJMkMxNCwgTjIxLCBOMjIpOworCisjZGVmaW5lIEIxMCAxMzQKK1NTU0ZfUElOX0RFQ0woQjEwLCBHUElPUTYsIE9TQ0NMSywgU0lHX0RFU0NfU0VUKFNDVTJDLCAxKSk7CisKKyNkZWZpbmUgTjIwIDEzNQorU1NTRl9QSU5fREVDTChOMjAsIEdQSU9RNywgUEVXQUtFLCBTSUdfREVTQ19TRVQoU0NVMkMsIDI5KSk7CisKKyNkZWZpbmUgRDggMTQyCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE1EQzEsIE1ESU8xLCBTSUdfREVTQ19TRVQoU0NVODgsIDMwKSk7CitTU19QSU5fREVDTChEOCwgR1BJT1I2LCBNREMxKTsKKworI2RlZmluZSBFMTAgMTQzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKE1ESU8xLCBNRElPMSwgU0lHX0RFU0NfU0VUKFNDVTg4LCAzMSkpOworU1NfUElOX0RFQ0woRTEwLCBHUElPUjcsIE1ESU8xKTsKKworRlVOQ19HUk9VUF9ERUNMKE1ESU8xLCBEOCwgRTEwKTsKKworLyogUkdNSUkxL1JNSUkxICovCisKKyNkZWZpbmUgUk1JSTFfREVTQyAgICAgIFNJR19ERVNDX0JJVChIV19TVFJBUDEsIDYsIDApCisjZGVmaW5lIFJNSUkyX0RFU0MgICAgICBTSUdfREVTQ19CSVQoSFdfU1RSQVAxLCA3LCAwKQorCisjZGVmaW5lIEI1IDE1MgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDAsIEdQSU9UMCwgU0lHX0RFU0NfU0VUKFNDVUEwLCAwKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUkNMS08sIFJNSUkxLCBSTUlJMV9ERVNDLAorCQlTSUdfREVTQ19TRVQoU0NVNDgsIDI5KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYQ0ssIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQjUsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UMCksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxUkNMS08pLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWENLKSk7CisKKyNkZWZpbmUgRTkgMTUzCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UMSwgR1BJT1QxLCBTSUdfREVTQ19TRVQoU0NVQTAsIDEpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFUWEVOLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYQ1RMLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEU5LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDEpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVRYRU4pLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWENUTCkpOworCisjZGVmaW5lIEY5IDE1NAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDIsIEdQSU9UMiwgU0lHX0RFU0NfU0VUKFNDVUEwLCAyKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxVFhEMCwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFUWEQwLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEY5LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDIpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVRYRDApLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQwKSk7CisKKyNkZWZpbmUgQTUgMTU1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UMywgR1BJT1QzLCBTSUdfREVTQ19TRVQoU0NVQTAsIDMpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFUWEQxLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYRDEsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQTUsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UMyksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxVFhEMSksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVRYRDEpKTsKKworI2RlZmluZSBFNyAxNTYKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1Q0LCBHUElPVDQsIFNJR19ERVNDX1NFVChTQ1VBMCwgNCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMURBU0gwLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVRYRDIsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oRTcsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UNCksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxREFTSDApLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFUWEQyKSk7CisKKyNkZWZpbmUgRDcgMTU3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UNSwgR1BJT1Q1LCBTSUdfREVTQ19TRVQoU0NVQTAsIDUpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFEQVNIMSwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFUWEQzLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEQ3LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDUpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMURBU0gxKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkxVFhEMykpOworCisjZGVmaW5lIEIyIDE1OAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVDYsIEdQSU9UNiwgU0lHX0RFU0NfU0VUKFNDVUEwLCA2KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkyUkNMS08sIFJNSUkyLCBSTUlJMl9ERVNDLAorCQlTSUdfREVTQ19TRVQoU0NVNDgsIDMwKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlRYQ0ssIFJHTUlJMik7CitNU19QSU5fREVDTF8oQjIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9UNiksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyUkNMS08pLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJUWENLKSk7CisKKyNkZWZpbmUgQjEgMTU5CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9UNywgR1BJT1Q3LCBTSUdfREVTQ19TRVQoU0NVQTAsIDcpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTJUWEVOLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlRYQ1RMLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEIxLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVDcpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMlRYRU4pLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJUWENUTCkpOworCisjZGVmaW5lIEEyIDE2MAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTAsIEdQSU9VMCwgU0lHX0RFU0NfU0VUKFNDVUEwLCA4KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkyVFhEMCwgUk1JSTIsIFJNSUkyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJUWEQwLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEEyLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTApLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMlRYRDApLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJUWEQwKSk7CisKKyNkZWZpbmUgQjMgMTYxCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VMSwgR1BJT1UxLCBTSUdfREVTQ19TRVQoU0NVQTAsIDkpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTJUWEQxLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlRYRDEsIFJHTUlJMik7CitNU19QSU5fREVDTF8oQjMsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9VMSksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyVFhEMSksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMlRYRDEpKTsKKworI2RlZmluZSBENSAxNjIKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1UyLCBHUElPVTIsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTApKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTJEQVNIMCwgUk1JSTIsIFJNSUkyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJUWEQyLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEQ1LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTIpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMkRBU0gwKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyVFhEMikpOworCisjZGVmaW5lIEQ0IDE2MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVTMsIEdQSU9VMywgU0lHX0RFU0NfU0VUKFNDVUEwLCAxMSkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMkRBU0gxLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlRYRDMsIFJHTUlJMik7CitNU19QSU5fREVDTF8oRDQsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9VMyksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyREFTSDEpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJUWEQzKSk7CisKKyNkZWZpbmUgQjQgMTY0CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNCwgR1BJT1U0LCBTSUdfREVTQ19TRVQoU0NVQTAsIDEyKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUkNMS0ksIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhDSywgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhCNCwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1U0KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFSQ0xLSSksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYQ0spKTsKKworI2RlZmluZSBBNCAxNjUKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1U1LCBHUElPVTUsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTMpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFEQVNIMiwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWENUTCwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhBNCwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1U1KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFEQVNIMiksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYQ1RMKSk7CisKKyNkZWZpbmUgQTMgMTY2CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNiwgR1BJT1U2LCBTSUdfREVTQ19TRVQoU0NVQTAsIDE0KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUlhEMCwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWEQwLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEEzLCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTYpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVJYRDApLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWEQwKSk7CisKKyNkZWZpbmUgRDYgMTY3CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9VNywgR1BJT1U3LCBTSUdfREVTQ19TRVQoU0NVQTAsIDE1KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxUlhEMSwgUk1JSTEsIFJNSUkxX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTFSWEQxLCBSR01JSTEpOworTVNfUElOX0RFQ0xfKEQ2LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVTcpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMVJYRDEpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTFSWEQxKSk7CisKKyNkZWZpbmUgQzUgMTY4CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9WMCwgR1BJT1YwLCBTSUdfREVTQ19TRVQoU0NVQTAsIDE2KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkxQ1JTRFYsIFJNSUkxLCBSTUlJMV9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkxUlhEMiwgUkdNSUkxKTsKK01TX1BJTl9ERUNMXyhDNSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1YwKSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTFDUlNEViksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYRDIpKTsKKworI2RlZmluZSBDNCAxNjkKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoR1BJT1YxLCBHUElPVjEsIFNJR19ERVNDX1NFVChTQ1VBMCwgMTcpKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUk1JSTFSWEVSLCBSTUlJMSwgUk1JSTFfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMVJYRDMsIFJHTUlJMSk7CitNU19QSU5fREVDTF8oQzQsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9WMSksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkxUlhFUiksCisJCVNJR19FWFBSX0xJU1RfUFRSKFJHTUlJMVJYRDMpKTsKKworRlVOQ19HUk9VUF9ERUNMKFJHTUlJMSwgQjQsIEE0LCBBMywgRDYsIEM1LCBDNCwgQjUsIEU5LCBGOSwgQTUsIEU3LCBENyk7CitGVU5DX0dST1VQX0RFQ0woUk1JSTEsIEI0LCBBMywgRDYsIEM1LCBDNCwgQjUsIEU5LCBGOSwgQTUpOworCisjZGVmaW5lIEMyIDE3MAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjIsIEdQSU9WMiwgU0lHX0RFU0NfU0VUKFNDVUEwLCAxOCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMlJDTEtJLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlJYQ0ssIFJHTUlJMik7CitNU19QSU5fREVDTF8oQzIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9WMiksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyUkNMS0kpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJSWENLKSk7CisKKyNkZWZpbmUgQzEgMTcxCitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9WMywgR1BJT1YzLCBTSUdfREVTQ19TRVQoU0NVQTAsIDE5KSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkyREFTSDIsIFJNSUkyLCBSTUlJMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkyUlhDVEwsIFJHTUlJMik7CitNU19QSU5fREVDTF8oQzEsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9WMyksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyREFTSDIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJSWENUTCkpOworCisjZGVmaW5lIEMzIDE3MgorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjQsIEdQSU9WNCwgU0lHX0RFU0NfU0VUKFNDVUEwLCAyMCkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMlJYRDAsIFJNSUkyLCBSTUlJMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkyUlhEMCwgUkdNSUkyKTsKK01TX1BJTl9ERUNMXyhDMywgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1Y0KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTJSWEQwKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyUlhEMCkpOworCisjZGVmaW5lIEQxIDE3MworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjUsIEdQSU9WNSwgU0lHX0RFU0NfU0VUKFNDVUEwLCAyMSkpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMlJYRDEsIFJNSUkyLCBSTUlJMl9ERVNDKTsKK1NJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoUkdNSUkyUlhEMSwgUkdNSUkyKTsKK01TX1BJTl9ERUNMXyhEMSwgU0lHX0VYUFJfTElTVF9QVFIoR1BJT1Y1KSwgU0lHX0VYUFJfTElTVF9QVFIoUk1JSTJSWEQxKSwKKwkJU0lHX0VYUFJfTElTVF9QVFIoUkdNSUkyUlhEMSkpOworCisjZGVmaW5lIEQyIDE3NAorU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShHUElPVjYsIEdQSU9WNiwgU0lHX0RFU0NfU0VUKFNDVUEwLCAyMikpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSTUlJMkNSU0RWLCBSTUlJMiwgUk1JSTJfREVTQyk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJHTUlJMlJYRDIsIFJHTUlJMik7CitNU19QSU5fREVDTF8oRDIsIFNJR19FWFBSX0xJU1RfUFRSKEdQSU9WNiksIFNJR19FWFBSX0xJU1RfUFRSKFJNSUkyQ1JTRFYpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJSWEQyKSk7CisKKyNkZWZpbmUgRTYgMTc1CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKEdQSU9WNywgR1BJT1Y3LCBTSUdfREVTQ19TRVQoU0NVQTAsIDIzKSk7CitTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKFJNSUkyUlhFUiwgUk1JSTIsIFJNSUkyX0RFU0MpOworU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShSR01JSTJSWEQzLCBSR01JSTIpOworTVNfUElOX0RFQ0xfKEU2LCBTSUdfRVhQUl9MSVNUX1BUUihHUElPVjcpLCBTSUdfRVhQUl9MSVNUX1BUUihSTUlJMlJYRVIpLAorCQlTSUdfRVhQUl9MSVNUX1BUUihSR01JSTJSWEQzKSk7CisKK0ZVTkNfR1JPVVBfREVDTChSR01JSTIsIEIyLCBCMSwgQTIsIEIzLCBENSwgRDQsIEMyLCBDMSwgQzMsIEQxLCBEMiwgRTYpOworRlVOQ19HUk9VUF9ERUNMKFJNSUkyLCBCMiwgQjEsIEEyLCBCMywgQzIsIEMzLCBEMSwgRDIsIEU2KTsKKworLyogUGlucywgZ3JvdXBzIGFuZCBmdW5jdGlvbnMgYXJlIHNvcnQoMSk6ZWQgYWxwaGFiZXRpY2FsbHkgZm9yIHNhbml0eSAqLworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgYXNwZWVkX2c1X3BpbnNbQVNQRUVEX0c1X05SX1BJTlNdID0geworCUFTUEVFRF9QSU5DVFJMX1BJTihBMTApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEEzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihBNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEE5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQUEzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMTApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIyMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEIzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQjQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihCNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEI5KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMTgpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMyMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEMzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oQzQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihDNSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDEwKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMjApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihEMjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihENCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQ1KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDYpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihENyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEQ4KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRDkpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMTApLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMTIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMTMpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMTUpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFMjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihFNiksCisJQVNQRUVEX1BJTkNUUkxfUElOKEU3KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oRTkpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihGMTkpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihGOSksCisJQVNQRUVEX1BJTkNUUkxfUElOKEgyMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKEwxKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oTDIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihMMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKEw0KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oTjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihOMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKE4yMCksCisJQVNQRUVEX1BJTkNUUkxfUElOKE4yMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKE4yMiksCisJQVNQRUVEX1BJTkNUUkxfUElOKE4zKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oTjQpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihQMSksCisJQVNQRUVEX1BJTkNUUkxfUElOKFAyKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oUjEpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihUNCksCisJQVNQRUVEX1BJTkNUUkxfUElOKFUzKSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVjIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihWMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKFY2KSwKKwlBU1BFRURfUElOQ1RSTF9QSU4oVzIpLAorCUFTUEVFRF9QSU5DVFJMX1BJTihXMyksCisJQVNQRUVEX1BJTkNUUkxfUElOKFkzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9ncm91cCBhc3BlZWRfZzVfZ3JvdXBzW10gPSB7CisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoR1BJRDApLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEdQSUQyKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChHUElFMCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMTApLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzExKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkMxMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoSTJDMTMpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKEkyQzE0KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkMzKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM0KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM1KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM2KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM3KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM4KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChJMkM5KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChNQUMxTElOSyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoTURJTzEpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKE1ESU8yKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChPU0NDTEspLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFBFV0FLRSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNMyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNCksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUFdNNyksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoUkdNSUkxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChSR01JSTIpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFJNSUkxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChSTUlJMiksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoU0QxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChTUEkxKSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUSU1FUjQpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFRJTUVSNSksCisJQVNQRUVEX1BJTkNUUkxfR1JPVVAoVElNRVI2KSwKKwlBU1BFRURfUElOQ1RSTF9HUk9VUChUSU1FUjcpLAorCUFTUEVFRF9QSU5DVFJMX0dST1VQKFRJTUVSOCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZnVuY3Rpb24gYXNwZWVkX2c1X2Z1bmN0aW9uc1tdID0geworCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRDApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRDIpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoR1BJRTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTIpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMTQpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDMyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM0KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzUpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDNiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhJMkM3KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKEkyQzgpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoSTJDOSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhNQUMxTElOSyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhNRElPMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhNRElPMiksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhPU0NDTEspLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUEVXQUtFKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTApLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV00yKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTMpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhQV001KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFBXTTYpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUFdNNyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhSR01JSTEpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoUkdNSUkyKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJNSUkxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFJNSUkyKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFNEMSksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhTUEkxKSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRJTUVSNCksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUSU1FUjUpLAorCUFTUEVFRF9QSU5DVFJMX0ZVTkMoVElNRVI2KSwKKwlBU1BFRURfUElOQ1RSTF9GVU5DKFRJTUVSNyksCisJQVNQRUVEX1BJTkNUUkxfRlVOQyhUSU1FUjgpLAorfTsKKworc3RhdGljIHN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhIGFzcGVlZF9nNV9waW5jdHJsX2RhdGEgPSB7CisJLnBpbnMgPSBhc3BlZWRfZzVfcGlucywKKwkubnBpbnMgPSBBUlJBWV9TSVpFKGFzcGVlZF9nNV9waW5zKSwKKwkuZ3JvdXBzID0gYXNwZWVkX2c1X2dyb3VwcywKKwkubmdyb3VwcyA9IEFSUkFZX1NJWkUoYXNwZWVkX2c1X2dyb3VwcyksCisJLmZ1bmN0aW9ucyA9IGFzcGVlZF9nNV9mdW5jdGlvbnMsCisJLm5mdW5jdGlvbnMgPSBBUlJBWV9TSVpFKGFzcGVlZF9nNV9mdW5jdGlvbnMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5tdXhfb3BzIGFzcGVlZF9nNV9waW5tdXhfb3BzID0geworCS5nZXRfZnVuY3Rpb25zX2NvdW50ID0gYXNwZWVkX3Bpbm11eF9nZXRfZm5fY291bnQsCisJLmdldF9mdW5jdGlvbl9uYW1lID0gYXNwZWVkX3Bpbm11eF9nZXRfZm5fbmFtZSwKKwkuZ2V0X2Z1bmN0aW9uX2dyb3VwcyA9IGFzcGVlZF9waW5tdXhfZ2V0X2ZuX2dyb3VwcywKKwkuc2V0X211eCA9IGFzcGVlZF9waW5tdXhfc2V0X211eCwKKwkuZ3Bpb19yZXF1ZXN0X2VuYWJsZSA9IGFzcGVlZF9ncGlvX3JlcXVlc3RfZW5hYmxlLAorCS5zdHJpY3QgPSB0cnVlLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX29wcyBhc3BlZWRfZzVfcGluY3RybF9vcHMgPSB7CisJLmdldF9ncm91cHNfY291bnQgPSBhc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBzX2NvdW50LAorCS5nZXRfZ3JvdXBfbmFtZSA9IGFzcGVlZF9waW5jdHJsX2dldF9ncm91cF9uYW1lLAorCS5nZXRfZ3JvdXBfcGlucyA9IGFzcGVlZF9waW5jdHJsX2dldF9ncm91cF9waW5zLAorCS5waW5fZGJnX3Nob3cgPSBhc3BlZWRfcGluY3RybF9waW5fZGJnX3Nob3csCisJLmR0X25vZGVfdG9fbWFwID0gcGluY29uZl9nZW5lcmljX2R0X25vZGVfdG9fbWFwX3BpbiwKKwkuZHRfZnJlZV9tYXAgPSBwaW5jdHJsX3V0aWxzX2ZyZWVfbWFwLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX2Rlc2MgYXNwZWVkX2c1X3BpbmN0cmxfZGVzYyA9IHsKKwkubmFtZSA9ICJhc3BlZWQtZzUtcGluY3RybCIsCisJLnBpbnMgPSBhc3BlZWRfZzVfcGlucywKKwkubnBpbnMgPSBBUlJBWV9TSVpFKGFzcGVlZF9nNV9waW5zKSwKKwkucGN0bG9wcyA9ICZhc3BlZWRfZzVfcGluY3RybF9vcHMsCisJLnBteG9wcyA9ICZhc3BlZWRfZzVfcGlubXV4X29wcywKK307CisKK3N0YXRpYyBpbnQgYXNwZWVkX2c1X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFzcGVlZF9nNV9waW5zKTsgaSsrKQorCQlhc3BlZWRfZzVfcGluc1tpXS5udW1iZXIgPSBpOworCisJcmV0dXJuIGFzcGVlZF9waW5jdHJsX3Byb2JlKHBkZXYsICZhc3BlZWRfZzVfcGluY3RybF9kZXNjLAorCQkJJmFzcGVlZF9nNV9waW5jdHJsX2RhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhc3BlZWRfZzVfcGluY3RybF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI1MDAtcGluY3RybCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJhc3BlZWQsZzUtcGluY3RybCIsIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXNwZWVkX2c1X3BpbmN0cmxfZHJpdmVyID0geworCS5wcm9iZSA9IGFzcGVlZF9nNV9waW5jdHJsX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFzcGVlZC1nNS1waW5jdHJsIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gYXNwZWVkX2c1X3BpbmN0cmxfb2ZfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgYXNwZWVkX2c1X3BpbmN0cmxfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFzcGVlZF9nNV9waW5jdHJsX2RyaXZlcik7Cit9CisKK2FyY2hfaW5pdGNhbGwoYXNwZWVkX2c1X3BpbmN0cmxfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL3BpbmN0cmwtYXNwZWVkLmMgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL3BpbmN0cmwtYXNwZWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5MWY5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9hc3BlZWQvcGluY3RybC1hc3BlZWQuYwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgIi4uL2NvcmUuaCIKKyNpbmNsdWRlICJwaW5jdHJsLWFzcGVlZC5oIgorCitpbnQgYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3Vwc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpCit7CisJc3RydWN0IGFzcGVlZF9waW5jdHJsX2RhdGEgKnBkYXRhID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisKKwlyZXR1cm4gcGRhdGEtPm5ncm91cHM7Cit9CisKK2NvbnN0IGNoYXIgKmFzcGVlZF9waW5jdHJsX2dldF9ncm91cF9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJdW5zaWduZWQgaW50IGdyb3VwKQoreworCXN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJcmV0dXJuIHBkYXRhLT5ncm91cHNbZ3JvdXBdLm5hbWU7Cit9CisKK2ludCBhc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBfcGlucyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICB1bnNpZ25lZCBpbnQgZ3JvdXAsIGNvbnN0IHVuc2lnbmVkIGludCAqKnBpbnMsCisJCQkJICB1bnNpZ25lZCBpbnQgKm5waW5zKQoreworCXN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJKnBpbnMgPSAmcGRhdGEtPmdyb3Vwc1tncm91cF0ucGluc1swXTsKKwkqbnBpbnMgPSBwZGF0YS0+Z3JvdXBzW2dyb3VwXS5ucGluczsKKworCXJldHVybiAwOworfQorCit2b2lkIGFzcGVlZF9waW5jdHJsX3Bpbl9kYmdfc2hvdyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJIHN0cnVjdCBzZXFfZmlsZSAqcywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzZXFfcHJpbnRmKHMsICIgJXMiLCBkZXZfbmFtZShwY3RsZGV2LT5kZXYpKTsKK30KKworaW50IGFzcGVlZF9waW5tdXhfZ2V0X2ZuX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldikKK3sKKwlzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCXJldHVybiBwZGF0YS0+bmZ1bmN0aW9uczsKK30KKworY29uc3QgY2hhciAqYXNwZWVkX3Bpbm11eF9nZXRfZm5fbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZ1bmN0aW9uKQoreworCXN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJcmV0dXJuIHBkYXRhLT5mdW5jdGlvbnNbZnVuY3Rpb25dLm5hbWU7Cit9CisKK2ludCBhc3BlZWRfcGlubXV4X2dldF9mbl9ncm91cHMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJCXVuc2lnbmVkIGludCBmdW5jdGlvbiwKKwkJCQljb25zdCBjaGFyICogY29uc3QgKipncm91cHMsCisJCQkJdW5zaWduZWQgaW50ICogY29uc3QgbnVtX2dyb3VwcykKK3sKKwlzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCSpncm91cHMgPSBwZGF0YS0+ZnVuY3Rpb25zW2Z1bmN0aW9uXS5ncm91cHM7CisJKm51bV9ncm91cHMgPSBwZGF0YS0+ZnVuY3Rpb25zW2Z1bmN0aW9uXS5uZ3JvdXBzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhc3BlZWRfc2lnX2Rlc2NfcHJpbnRfdmFsKAorCQljb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19kZXNjICpkZXNjLCBib29sIGVuYWJsZSwgdTMyIHJ2KQoreworCXByX2RlYnVnKCJTQ1UleFsweCUwOHhdPTB4JXgsIGdvdCAweCV4IGZyb20gMHglMDh4XG4iLCBkZXNjLT5yZWcsCisJCQlkZXNjLT5tYXNrLCBlbmFibGUgPyBkZXNjLT5lbmFibGUgOiBkZXNjLT5kaXNhYmxlLAorCQkJKHJ2ICYgZGVzYy0+bWFzaykgPj4gX19mZnMoZGVzYy0+bWFzayksIHJ2KTsKK30KKworLyoqCisgKiBRdWVyeSB0aGUgZW5hYmxlZCBvciBkaXNhYmxlZCBzdGF0ZSBvZiBhIHNpZ25hbCBkZXNjcmlwdG9yCisgKgorICogQGRlc2M6IFRoZSBzaWduYWwgZGVzY3JpcHRvciBvZiBpbnRlcmVzdAorICogQGVuYWJsZWQ6IFRydWUgdG8gcXVlcnkgdGhlIGVuYWJsZWQgc3RhdGUsIGZhbHNlIHRvIHF1ZXJ5IGRpc2FibGVkIHN0YXRlCisgKiBAcmVnbWFwOiBUaGUgU0NVIHJlZ21hcCBpbnN0YW5jZQorICoKKyAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZGVzY3JpcHRvcidzIGJpdGZpZWxkIGlzIGNvbmZpZ3VyZWQgdG8gdGhlIHN0YXRlCisgKiBzZWxlY3RlZCBieSBAZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKgorICogRXZhbHVhdGlvbiBvZiBkZXNjcmlwdG9yIHN0YXRlIGlzIG5vbi10cml2aWFsIGluIHRoYXQgaXQgaXMgbm90IGEgYmluYXJ5CisgKiBvdXRjb21lOiBUaGUgYml0ZmllbGRzIGNhbiBiZSBncmVhdGVyIHRoYW4gb25lIGJpdCBpbiBzaXplIGFuZCB0aHVzIGNhbiB0YWtlCisgKiBhIHZhbHVlIHRoYXQgaXMgbmVpdGhlciB0aGUgZW5hYmxlZCBub3IgZGlzYWJsZWQgc3RhdGUgcmVjb3JkZWQgaW4gdGhlCisgKiBkZXNjcmlwdG9yICh0eXBpY2FsbHkgdGhpcyBtZWFucyBhIGRpZmZlcmVudCBmdW5jdGlvbiB0byB0aGUgb25lIG9mIGludGVyZXN0CisgKiBpcyBlbmFibGVkKS4gVGh1cyB3ZSBtdXN0IGV4cGxpY2l0bHkgdGVzdCBmb3IgZWl0aGVyIGNvbmRpdGlvbiBhcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGJvb2wgYXNwZWVkX3NpZ19kZXNjX2V2YWwoY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZGVzYyAqZGVzYywKKwkJCQkgYm9vbCBlbmFibGVkLCBzdHJ1Y3QgcmVnbWFwICptYXApCit7CisJdW5zaWduZWQgaW50IHJhdzsKKwl1MzIgd2FudDsKKworCWlmIChyZWdtYXBfcmVhZChtYXAsIGRlc2MtPnJlZywgJnJhdykgPCAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlhc3BlZWRfc2lnX2Rlc2NfcHJpbnRfdmFsKGRlc2MsIGVuYWJsZWQsIHJhdyk7CisJd2FudCA9IGVuYWJsZWQgPyBkZXNjLT5lbmFibGUgOiBkZXNjLT5kaXNhYmxlOworCisJcmV0dXJuICgocmF3ICYgZGVzYy0+bWFzaykgPj4gX19mZnMoZGVzYy0+bWFzaykpID09IHdhbnQ7Cit9CisKKy8qKgorICogUXVlcnkgdGhlIGVuYWJsZWQgb3IgZGlzYWJsZWQgc3RhdGUgZm9yIGEgbXV4IGZ1bmN0aW9uJ3Mgc2lnbmFsIG9uIGEgcGluCisgKgorICogQGV4cHI6IEFuIGV4cHJlc3Npb24gY29udHJvbGxpbmcgdGhlIHNpZ25hbCBmb3IgYSBtdXggZnVuY3Rpb24gb24gYSBwaW4KKyAqIEBlbmFibGVkOiBUcnVlIHRvIHF1ZXJ5IHRoZSBlbmFibGVkIHN0YXRlLCBmYWxzZSB0byBxdWVyeSBkaXNhYmxlZCBzdGF0ZQorICogQHJlZ21hcDogVGhlIFNDVSByZWdtYXAgaW5zdGFuY2UKKyAqCisgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGV4cHJlc3Npb24gY29tcG9zZWQgYnkgQGVuYWJsZWQgZXZhbHVhdGVzIHRydWUsIGZhbHNlCisgKiBvdGhlcndpc2UKKyAqCisgKiBBIG11eCBmdW5jdGlvbiBpcyBlbmFibGVkIG9yIGRpc2FibGVkIGlmIHRoZSBmdW5jdGlvbidzIHNpZ25hbCBleHByZXNzaW9uCisgKiBmb3IgZWFjaCBwaW4gaW4gdGhlIGZ1bmN0aW9uJ3MgcGluIGdyb3VwIGV2YWx1YXRlcyB0cnVlIGZvciB0aGUgZGVzaXJlZAorICogc3RhdGUuIEFuIHNpZ25hbCBleHByZXNzaW9uIGV2YWx1YXRlcyB0cnVlIGlmIGFsbCBvZiBpdHMgYXNzb2NpYXRlZCBzaWduYWwKKyAqIGRlc2NyaXB0b3JzIGV2YWx1YXRlIHRydWUgZm9yIHRoZSBkZXNpcmVkIHN0YXRlLgorICoKKyAqIElmIGFuIGV4cHJlc3Npb24ncyBzdGF0ZSBpcyBkZXNjcmliZWQgYnkgbW9yZSB0aGFuIG9uZSBiaXQsIGVpdGhlciB0aHJvdWdoCisgKiBtdWx0aS1iaXQgYml0ZmllbGRzIGluIGEgc2luZ2xlIHNpZ25hbCBkZXNjcmlwdG9yIG9yIHRocm91Z2ggbXVsdGlwbGUgc2lnbmFsCisgKiBkZXNjcmlwdG9ycyBvZiBhIHNpbmdsZSBiaXQgdGhlbiBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIGV4cHJlc3Npb24gdG8gYmUgaW4KKyAqIG5laXRoZXIgdGhlIGVuYWJsZWQgbm9yIGRpc2FibGVkIHN0YXRlLiBUaHVzIHdlIG11c3QgZXhwbGljaXRseSB0ZXN0IGZvcgorICogZWl0aGVyIGNvbmRpdGlvbiBhcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGJvb2wgYXNwZWVkX3NpZ19leHByX2V2YWwoY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqZXhwciwKKwkJCQkgYm9vbCBlbmFibGVkLCBzdHJ1Y3QgcmVnbWFwICptYXApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZXhwci0+bmRlc2NzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZGVzYyAqZGVzYyA9ICZleHByLT5kZXNjc1tpXTsKKworCQlpZiAoIWFzcGVlZF9zaWdfZGVzY19ldmFsKGRlc2MsIGVuYWJsZWQsIG1hcCkpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogQ29uZmlndXJlIGEgcGluJ3Mgc2lnbmFsIGJ5IGFwcGx5aW5nIGFuIGV4cHJlc3Npb24ncyBkZXNjcmlwdG9yIHN0YXRlIGZvcgorICogYWxsIGRlc2NyaXB0b3JzIGluIHRoZSBleHByZXNzaW9uLgorICoKKyAqIEBleHByOiBUaGUgZXhwcmVzc2lvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIHdob3NlIHNpZ25hbCBpcyB0byBiZQorICogICAgICAgIGNvbmZpZ3VyZWQKKyAqIEBlbmFibGU6IHRydWUgdG8gZW5hYmxlIGFuIGZ1bmN0aW9uJ3Mgc2lnbmFsIHRocm91Z2ggYSBwaW4ncyBzaWduYWwKKyAqICAgICAgICAgIGV4cHJlc3Npb24sIGZhbHNlIHRvIGRpc2FibGUgdGhlIGZ1bmN0aW9uJ3Mgc2lnbmFsCisgKiBAbWFwOiBUaGUgU0NVJ3MgcmVnbWFwIGluc3RhbmNlIGZvciBwaW5tdXggcmVnaXN0ZXIgYWNjZXNzLgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZXhwcmVzc2lvbiBpcyBjb25maWd1cmVkIGFzIHJlcXVlc3RlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBib29sIGFzcGVlZF9zaWdfZXhwcl9zZXQoY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqZXhwciwKKwkJCQlib29sIGVuYWJsZSwgc3RydWN0IHJlZ21hcCAqbWFwKQoreworCWludCBpOworCWJvb2wgcmV0OworCisJcmV0ID0gYXNwZWVkX3NpZ19leHByX2V2YWwoZXhwciwgZW5hYmxlLCBtYXApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZXhwci0+bmRlc2NzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZGVzYyAqZGVzYyA9ICZleHByLT5kZXNjc1tpXTsKKwkJdTMyIHBhdHRlcm4gPSBlbmFibGUgPyBkZXNjLT5lbmFibGUgOiBkZXNjLT5kaXNhYmxlOworCisJCS8qCisJCSAqIFN0cmFwIHJlZ2lzdGVycyBhcmUgY29uZmlndXJlZCBpbiBoYXJkd2FyZSBvciBieSBlYXJseS1ib290CisJCSAqIGZpcm13YXJlLiBUcmVhdCB0aGVtIGFzIHJlYWQtb25seSBkZXNwaXRlIHRoYXQgd2UgY2FuIHdyaXRlCisJCSAqIHRoZW0uIFRoaXMgbWF5IG1lYW4gdGhhdCBjZXJ0YWluIGZ1bmN0aW9ucyBjYW5ub3QgYmUKKwkJICogZGVjb25maWd1cmVkIGFuZCBpcyB0aGUgcmVhc29uIHdlIHJlLWV2YWx1YXRlIGFmdGVyIHdyaXRpbmcKKwkJICogYWxsIGRlc2NyaXB0b3IgYml0cy4KKwkJICovCisJCWlmIChkZXNjLT5yZWcgPT0gSFdfU1RSQVAxIHx8IGRlc2MtPnJlZyA9PSBIV19TVFJBUDIpCisJCQljb250aW51ZTsKKworCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMobWFwLCBkZXNjLT5yZWcsIGRlc2MtPm1hc2ssCisJCQkJcGF0dGVybiA8PCBfX2ZmcyhkZXNjLT5tYXNrKSkgPT0gMDsKKworCQlpZiAoIXJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGFzcGVlZF9zaWdfZXhwcl9ldmFsKGV4cHIsIGVuYWJsZSwgbWFwKTsKK30KKworc3RhdGljIGJvb2wgYXNwZWVkX3NpZ19leHByX2VuYWJsZShjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICpleHByLAorCQkJCSAgIHN0cnVjdCByZWdtYXAgKm1hcCkKK3sKKwlyZXR1cm4gYXNwZWVkX3NpZ19leHByX3NldChleHByLCB0cnVlLCBtYXApOworfQorCitzdGF0aWMgYm9vbCBhc3BlZWRfc2lnX2V4cHJfZGlzYWJsZShjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICpleHByLAorCQkJCSAgICBzdHJ1Y3QgcmVnbWFwICptYXApCit7CisJcmV0dXJuIGFzcGVlZF9zaWdfZXhwcl9zZXQoZXhwciwgZmFsc2UsIG1hcCk7Cit9CisKKy8qKgorICogRGlzYWJsZSBhIHNpZ25hbCBvbiBhIHBpbiBieSBkaXNhYmxpbmcgYWxsIHByb3ZpZGVkIHNpZ25hbCBleHByZXNzaW9ucy4KKyAqCisgKiBAZXhwcnM6IFRoZSBsaXN0IG9mIHNpZ25hbCBleHByZXNzaW9ucyAoZnJvbSBhIHByaW9yaXR5IGxldmVsIG9uIGEgcGluKQorICogQG1hcDogVGhlIFNDVSdzIHJlZ21hcCBpbnN0YW5jZSBmb3IgcGlubXV4IHJlZ2lzdGVyIGFjY2Vzcy4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgYWxsIGV4cHJlc3Npb25zIGluIHRoZSBsaXN0IGFyZSBzdWNjZXNzZnVsbHkgZGlzYWJsZWQsIGZhbHNlCisgKiBvdGhlcndpc2UKKyAqLworc3RhdGljIGJvb2wgYXNwZWVkX2Rpc2FibGVfc2lnKGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKipleHBycywKKwkJCSAgICAgICBzdHJ1Y3QgcmVnbWFwICptYXApCit7CisJYm9vbCBkaXNhYmxlZCA9IHRydWU7CisKKwlpZiAoIWV4cHJzKQorCQlyZXR1cm4gdHJ1ZTsKKworCXdoaWxlICgqZXhwcnMpIHsKKwkJYm9vbCByZXQ7CisKKwkJcmV0ID0gYXNwZWVkX3NpZ19leHByX2Rpc2FibGUoKmV4cHJzLCBtYXApOworCQlkaXNhYmxlZCA9IGRpc2FibGVkICYmIHJldDsKKworCQlleHBycysrOworCX0KKworCXJldHVybiBkaXNhYmxlZDsKK30KKworLyoqCisgKiBTZWFyY2ggZm9yIHRoZSBzaWduYWwgZXhwcmVzc2lvbiBuZWVkZWQgdG8gZW5hYmxlIHRoZSBwaW4ncyBzaWduYWwgZm9yIHRoZQorICogcmVxdWVzdGVkIGZ1bmN0aW9uLgorICoKKyAqIEBleHByczogTGlzdCBvZiBzaWduYWwgZXhwcmVzc2lvbnMgKGhheXN0YWNrKQorICogQG5hbWU6IFRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24gKG5lZWRsZSkKKyAqCisgKiBAcmV0dXJuIEEgcG9pbnRlciB0byB0aGUgc2lnbmFsIGV4cHJlc3Npb24gd2hvc2UgZnVuY3Rpb24gdGFnIG1hdGNoZXMgdGhlCisgKiAgICAgICAgIHByb3ZpZGVkIG5hbWUsIG90aGVyd2lzZSBOVUxMLgorICoKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKmFzcGVlZF9maW5kX2V4cHJfYnlfbmFtZSgKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKmV4cHJzLCBjb25zdCBjaGFyICpuYW1lKQoreworCXdoaWxlICgqZXhwcnMpIHsKKwkJaWYgKHN0cmNtcCgoKmV4cHJzKS0+ZnVuY3Rpb24sIG5hbWUpID09IDApCisJCQlyZXR1cm4gKmV4cHJzOworCQlleHBycysrOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciAqZ2V0X2RlZmluZWRfYXR0cmlidXRlKGNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Rlc2MgKnBkZXNjLAorCQkJCSAgIGNvbnN0IGNoYXIgKigqZ2V0KSgKKwkJCQkJICAgY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKSkKK3sKKwljaGFyICpmb3VuZCA9IE5VTEw7CisJc2l6ZV90IGxlbiA9IDA7CisJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKipwcmlvcywgKipmdW5jcywgKmV4cHI7CisKKwlwcmlvcyA9IHBkZXNjLT5wcmlvczsKKworCXdoaWxlICgoZnVuY3MgPSAqcHJpb3MpKSB7CisJCXdoaWxlICgoZXhwciA9ICpmdW5jcykpIHsKKwkJCWNvbnN0IGNoYXIgKnN0ciA9IGdldChleHByKTsKKwkJCXNpemVfdCBkZWx0YSA9IHN0cmxlbihzdHIpICsgMjsKKwkJCWNoYXIgKmV4cGFuZGVkOworCisJCQlleHBhbmRlZCA9IGtyZWFsbG9jKGZvdW5kLCBsZW4gKyBkZWx0YSArIDEsIEdGUF9LRVJORUwpOworCQkJaWYgKCFleHBhbmRlZCkgeworCQkJCWtmcmVlKGZvdW5kKTsKKwkJCQlyZXR1cm4gZXhwYW5kZWQ7CisJCQl9CisKKwkJCWZvdW5kID0gZXhwYW5kZWQ7CisJCQlmb3VuZFtsZW5dID0gJ1wwJzsKKwkJCWxlbiArPSBkZWx0YTsKKworCQkJc3RyY2F0KGZvdW5kLCBzdHIpOworCQkJc3RyY2F0KGZvdW5kLCAiLCAiKTsKKworCQkJZnVuY3MrKzsKKwkJfQorCQlwcmlvcysrOworCX0KKworCWlmIChsZW4gPCAyKSB7CisJCWtmcmVlKGZvdW5kKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm91bmRbbGVuIC0gMl0gPSAnXDAnOworCisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYXNwZWVkX3NpZ19leHByX2Z1bmN0aW9uKGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKmV4cHIpCit7CisJcmV0dXJuIGV4cHItPmZ1bmN0aW9uOworfQorCitzdGF0aWMgY2hhciAqZ2V0X2RlZmluZWRfZnVuY3Rpb25zKGNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Rlc2MgKnBkZXNjKQoreworCXJldHVybiBnZXRfZGVmaW5lZF9hdHRyaWJ1dGUocGRlc2MsIGFzcGVlZF9zaWdfZXhwcl9mdW5jdGlvbik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICphc3BlZWRfc2lnX2V4cHJfc2lnbmFsKGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKmV4cHIpCit7CisJcmV0dXJuIGV4cHItPnNpZ25hbDsKK30KKworc3RhdGljIGNoYXIgKmdldF9kZWZpbmVkX3NpZ25hbHMoY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZGVzYyAqcGRlc2MpCit7CisJcmV0dXJuIGdldF9kZWZpbmVkX2F0dHJpYnV0ZShwZGVzYywgYXNwZWVkX3NpZ19leHByX3NpZ25hbCk7Cit9CisKK2ludCBhc3BlZWRfcGlubXV4X3NldF9tdXgoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNpZ25lZCBpbnQgZnVuY3Rpb24sCisJCQkgIHVuc2lnbmVkIGludCBncm91cCkKK3sKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEgPQorCQlwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9ncm91cCAqcGdyb3VwID0gJnBkYXRhLT5ncm91cHNbZ3JvdXBdOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Z1bmN0aW9uICpwZnVuYyA9CisJCSZwZGF0YS0+ZnVuY3Rpb25zW2Z1bmN0aW9uXTsKKworCWZvciAoaSA9IDA7IGkgPCBwZ3JvdXAtPm5waW5zOyBpKyspIHsKKwkJaW50IHBpbiA9IHBncm91cC0+cGluc1tpXTsKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZGVzYyAqcGRlc2MgPSBwZGF0YS0+cGluc1twaW5dLmRydl9kYXRhOworCQljb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICpleHByID0gTlVMTDsKKwkJY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKmZ1bmNzOworCQljb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICoqKnByaW9zOworCisJCWlmICghcGRlc2MpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcmlvcyA9IHBkZXNjLT5wcmlvczsKKworCQlpZiAoIXByaW9zKQorCQkJY29udGludWU7CisKKwkJLyogRGlzYWJsZSBmdW5jdGlvbnMgYXQgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGF0IHJlcXVlc3RlZCAqLworCQl3aGlsZSAoKGZ1bmNzID0gKnByaW9zKSkgeworCQkJZXhwciA9IGFzcGVlZF9maW5kX2V4cHJfYnlfbmFtZShmdW5jcywgcGZ1bmMtPm5hbWUpOworCisJCQlpZiAoZXhwcikKKwkJCQlicmVhazsKKworCQkJaWYgKCFhc3BlZWRfZGlzYWJsZV9zaWcoZnVuY3MsIHBkYXRhLT5tYXApKQorCQkJCXJldHVybiAtRVBFUk07CisKKwkJCXByaW9zKys7CisJCX0KKworCQlpZiAoIWV4cHIpIHsKKwkJCWNoYXIgKmZ1bmN0aW9ucyA9IGdldF9kZWZpbmVkX2Z1bmN0aW9ucyhwZGVzYyk7CisJCQljaGFyICpzaWduYWxzID0gZ2V0X2RlZmluZWRfc2lnbmFscyhwZGVzYyk7CisKKwkJCXByX3dhcm4oIk5vIGZ1bmN0aW9uICVzIGZvdW5kIG9uIHBpbiAlcyAoJWQpLiBGb3VuZCBzaWduYWwocykgJXMgZm9yIGZ1bmN0aW9uKHMpICVzXG4iLAorCQkJCXBmdW5jLT5uYW1lLCBwZGVzYy0+bmFtZSwgcGluLCBzaWduYWxzLAorCQkJCWZ1bmN0aW9ucyk7CisJCQlrZnJlZShzaWduYWxzKTsKKwkJCWtmcmVlKGZ1bmN0aW9ucyk7CisKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKworCQlpZiAoIWFzcGVlZF9zaWdfZXhwcl9lbmFibGUoZXhwciwgcGRhdGEtPm1hcCkpCisJCQlyZXR1cm4gLUVQRVJNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBhc3BlZWRfZXhwcl9pc19ncGlvKGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKmV4cHIpCit7CisJLyoKKwkgKiBUaGUgc2lnbmFsIHR5cGUgaXMgR1BJTyBpZiB0aGUgc2lnbmFsIG5hbWUgaGFzICJHUElPIiBhcyBhIHByZWZpeC4KKwkgKiBzdHJuY21wIChyYXRoZXIgdGhhbiBzdHJjbXApIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBwcmVmaXgKKwkgKiByZXF1aXJlbWVudC4KKwkgKgorCSAqIGV4cHItPnNpZ25hbCBtaWdodCBsb29rIGxpa2UgIkdQSU9UMyIgaW4gdGhlIEdQSU8gY2FzZS4KKwkgKi8KKwlyZXR1cm4gc3RybmNtcChleHByLT5zaWduYWwsICJHUElPIiwgNCkgPT0gMDsKK30KKworc3RhdGljIGJvb2wgYXNwZWVkX2dwaW9faW5fZXhwcnMoY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZXhwciAqKmV4cHJzKQoreworCWlmICghZXhwcnMpCisJCXJldHVybiBmYWxzZTsKKworCXdoaWxlICgqZXhwcnMpIHsKKwkJaWYgKGFzcGVlZF9leHByX2lzX2dwaW8oKmV4cHJzKSkKKwkJCXJldHVybiB0cnVlOworCQlleHBycysrOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworaW50IGFzcGVlZF9ncGlvX3JlcXVlc3RfZW5hYmxlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlICpyYW5nZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWNvbnN0IHN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhICpwZGF0YSA9CisJCXBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Rlc2MgKnBkZXNjID0gcGRhdGEtPnBpbnNbb2Zmc2V0XS5kcnZfZGF0YTsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByICoqKnByaW9zLCAqKmZ1bmNzLCAqZXhwcjsKKworCWlmICghcGRlc2MpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpb3MgPSBwZGVzYy0+cHJpb3M7CisKKwlpZiAoIXByaW9zKQorCQlyZXR1cm4gLUVOWElPOworCisJLyogRGlzYWJsZSBhbnkgZnVuY3Rpb25zIG9mIGhpZ2hlciBwcmlvcml0eSB0aGFuIEdQSU8gKi8KKwl3aGlsZSAoKGZ1bmNzID0gKnByaW9zKSkgeworCQlpZiAoYXNwZWVkX2dwaW9faW5fZXhwcnMoZnVuY3MpKQorCQkJYnJlYWs7CisKKwkJaWYgKCFhc3BlZWRfZGlzYWJsZV9zaWcoZnVuY3MsIHBkYXRhLT5tYXApKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlwcmlvcysrOworCX0KKworCWlmICghZnVuY3MpIHsKKwkJY2hhciAqc2lnbmFscyA9IGdldF9kZWZpbmVkX3NpZ25hbHMocGRlc2MpOworCisJCXByX3dhcm4oIk5vIEdQSU8gc2lnbmFsIHR5cGUgZm91bmQgb24gcGluICVzICglZCkuIEZvdW5kOiAlc1xuIiwKKwkJCXBkZXNjLT5uYW1lLCBvZmZzZXQsIHNpZ25hbHMpOworCQlrZnJlZShzaWduYWxzKTsKKworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWV4cHIgPSAqZnVuY3M7CisKKwkvKgorCSAqIERpc2FibGluZyBhbGwgaGlnaGVyLXByaW9yaXR5IGV4cHJlc3Npb25zIGlzIGVub3VnaCB0byBlbmFibGUgdGhlCisJICogbG93ZXN0LXByaW9yaXR5IHNpZ25hbCB0eXBlLiBBcyBzdWNoIGl0IGhhcyBubyBhc3NvY2lhdGVkCisJICogZXhwcmVzc2lvbi4KKwkgKi8KKwlpZiAoIWV4cHIpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiBHUElPIGlzIG5vdCB0aGUgbG93ZXN0IHByaW9yaXR5IHNpZ25hbCB0eXBlLCBhc3N1bWUgdGhlcmUgaXMgb25seQorCSAqIG9uZSBleHByZXNzaW9uIGRlZmluZWQgdG8gZW5hYmxlIHRoZSBHUElPIGZ1bmN0aW9uCisJICovCisJaWYgKCFhc3BlZWRfc2lnX2V4cHJfZW5hYmxlKGV4cHIsIHBkYXRhLT5tYXApKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBhc3BlZWRfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJIHN0cnVjdCBwaW5jdHJsX2Rlc2MgKnBkZXNjLAorCQkJIHN0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CisJc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsOworCisJcGFyZW50ID0gcGRldi0+ZGV2LnBhcmVudDsKKwlpZiAoIXBhcmVudCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwYXJlbnQgZm9yIHN5c2NvbiBwaW5jb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGRhdGEtPm1hcCA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChwYXJlbnQtPm9mX25vZGUpOworCWlmIChJU19FUlIocGRhdGEtPm1hcCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcmVnbWFwIGZvciBzeXNjb24gcGluY29udHJvbGxlciBwYXJlbnRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwZGF0YS0+bWFwKTsKKwl9CisKKwlwY3RsID0gcGluY3RybF9yZWdpc3RlcihwZGVzYywgJnBkZXYtPmRldiwgcGRhdGEpOworCisJaWYgKElTX0VSUihwY3RsKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgcGluY3RybFxuIik7CisJCXJldHVybiBQVFJfRVJSKHBjdGwpOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBkYXRhKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9waW5jdHJsLWFzcGVlZC5oIGIvZHJpdmVycy9waW5jdHJsL2FzcGVlZC9waW5jdHJsLWFzcGVlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNzJlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvYXNwZWVkL3BpbmN0cmwtYXNwZWVkLmgKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIFBJTkNUUkxfQVNQRUVECisjZGVmaW5lIFBJTkNUUkxfQVNQRUVECisKKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi1nZW5lcmljLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKy8qCisgKiBUaGUgQVNQRUVEIFNvQ3MgcHJvdmlkZSB0eXBpY2FsbHkgbW9yZSB0aGFuIDIwMCBwaW5zIGZvciBHUElPIGFuZCBvdGhlcgorICogZnVuY3Rpb25zLiBUaGUgU29DIGZ1bmN0aW9uIGVuYWJsZWQgb24gYSBwaW4gaXMgZGV0ZXJtaW5lZCBvbiBhIHByaW9yaXR5CisgKiBiYXNpcyB3aGVyZSBhIGdpdmVuIHBpbiBjYW4gcHJvdmlkZSBhIG51bWJlciBvZiBkaWZmZXJlbnQgc2lnbmFsIHR5cGVzLgorICoKKyAqIFRoZSBzaWduYWwgYWN0aXZlIG9uIGEgcGluIGlzIGRlc2NyaWJlZCBieSBib3RoIGEgcHJpb3JpdHkgbGV2ZWwgYW5kCisgKiBjb21wb3VuZCBsb2dpY2FsIGV4cHJlc3Npb25zIGludm9sdmluZyBtdWx0aXBsZSBvcGVyYXRvcnMsIHJlZ2lzdGVycyBhbmQKKyAqIGJpdHMuIFNvbWUgZGlmZmljdWx0eSBhcmlzZXMgYXMgdGhlIHBpbidzIGZ1bmN0aW9uIGJpdCBtYXNrcyBmb3IgZWFjaAorICogcHJpb3JpdHkgbGV2ZWwgYXJlIGZyZXF1ZW50bHkgbm90IHRoZSBzYW1lIChpLmUuIGNhbm5vdCBqdXN0IGZsaXAgYSBiaXQgdG8KKyAqIGNoYW5nZSBmcm9tIGEgaGlnaCB0byBsb3cgcHJpb3JpdHkgc2lnbmFsKSwgb3IgZXZlbiBpbiB0aGUgc2FtZSByZWdpc3Rlci4KKyAqIEZ1cnRoZXIsIG5vdCBhbGwgc2lnbmFscyBjYW4gYmUgdW5tdXhlZCwgYXMgc29tZSBleHByZXNzaW9ucyBkZXBlbmQgb24KKyAqIHZhbHVlcyBpbiB0aGUgaGFyZHdhcmUgc3RyYXBwaW5nIHJlZ2lzdGVyICh3aGljaCBpcyB0cmVhdGVkIGFzIHJlYWQtb25seSkuCisgKgorICogU29DIE11bHRpLWZ1bmN0aW9uIFBpbiBFeHByZXNzaW9uIEV4YW1wbGVzCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBIZXJlIGFyZSBzb21lIHNhbXBsZSBtdXggY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgQVNUMjQwMCBhbmQgQVNUMjUwMAorICogZGF0YXNoZWV0cyB0byBpbGx1c3RyYXRlIHRoZSBjb3JuZXIgY2FzZXMsIHJvdWdobHkgaW4gb3JkZXIgb2YgbGVhc3QgdG8gbW9zdAorICogY29ybmVyLiBUaGUgc2lnbmFsIHByaW9yaXRpZXMgYXJlIGluIGRlY2VuZGluZyBvcmRlciBmcm9tIFAwIChoaWdoZXN0KS4KKyAqCisgKiBENiBpcyBhIHBpbiB3aXRoIGEgc2luZ2xlIGZ1bmN0aW9uIChiZXNpZGUgR1BJTyk7IGEgaGlnaCBwcmlvcml0eSBzaWduYWwKKyAqIHRoYXQgcGFydGljaXBhdGVzIGluIG9uZSBmdW5jdGlvbjoKKyAqCisgKiBCYWxsIHwgRGVmYXVsdCB8IFAwIFNpZ25hbCB8IFAwIEV4cHJlc3Npb24gICAgICAgICAgICAgICB8IFAxIFNpZ25hbCB8IFAxIEV4cHJlc3Npb24gfCBPdGhlcgorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKiAgRDYgICAgR1BJT0EwICAgIE1BQzFMSU5LICAgIFNDVTgwWzBdPTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUElPQTAKKyAqIC0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICoKKyAqIEM1IGlzIGEgbXVsdGktc2lnbmFsIHBpbiAoaGlnaCBhbmQgbG93IHByaW9yaXR5IHNpZ25hbHMpLiBIZXJlIHdlIHRvdWNoCisgKiBkaWZmZXJlbnQgcmVnaXN0ZXJzIGZvciB0aGUgZGlmZmVyZW50IGZ1bmN0aW9ucyB0aGF0IGVuYWJsZSBlYWNoIHNpZ25hbDoKKyAqCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0KKyAqICBDNSAgICBHUElPQTQgICAgU0NMOSAgICAgICAgU0NVOTBbMjJdPTEgICAgICAgICAgICAgICAgICAgVElNRVI1ICAgICAgU0NVODBbNF09MSAgICAgIEdQSU9BNAorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKgorICogRTE5IGlzIGEgc2luZ2xlLXNpZ25hbCBwaW4gd2l0aCB0d28gZnVuY3Rpb25zIHRoYXQgaW5mbHVlbmNlIHRoZSBhY3RpdmUKKyAqIHNpZ25hbC4gSW4gdGhpcyBjYXNlIGJvdGggYml0cyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgLSBlbmFibGUgYSBkZWRpY2F0ZWQKKyAqIExQQyByZXNldCBwaW4uIEhvd2V2ZXIgaXQncyBub3QgYWx3YXlzIHRoZSBjYXNlIHRoYXQgdGhlIGJpdHMgaW4gdGhlCisgKiBPUi1yZWxhdGlvbnNoaXAgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nLgorICoKKyAqIC0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICogIEUxOSAgIEdQSU9CNCAgICBMUENSU1QjICAgICBTQ1U4MFsxMl09MSB8IFN0cmFwWzE0XT0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BJT0I0CisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0KKyAqCisgKiBGb3IgZXhhbXBsZSwgcGluIEIxOSBoYXMgYSBsb3ctcHJpb3JpdHkgc2lnbmFsIHRoYXQncyBlbmFibGVkIGJ5IHR3bworICogZGlzdGluY3QgU29DIGZ1bmN0aW9uczogQSBzcGVjaWZpYyBTSU9QQkkgYml0IGluIHJlZ2lzdGVyIFNDVUE0LCBhbmQgYW4gQUNQSQorICogYml0IGluIHRoZSBTVFJBUCByZWdpc3Rlci4gVGhlIEFDUEkgYml0IGNvbmZpZ3VyZXMgc2lnbmFscyBvbiBwaW5zIGluCisgKiBhZGRpdGlvbiB0byBCMTkuIEJvdGggb2YgdGhlIGxvdyBwcmlvcml0eSBmdW5jdGlvbnMgYXMgd2VsbCBhcyB0aGUgaGlnaAorICogcHJpb3JpdHkgZnVuY3Rpb24gbXVzdCBiZSBkaXNhYmxlZCBmb3IgR1BJT0YxIHRvIGJlIHVzZWQuCisgKgorICogQmFsbCB8IERlZmF1bHQgfCBQMCBTaWduYWwgfCBQMCBFeHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQMSBTaWduYWwgfCBQMSBFeHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICB8IE90aGVyCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKiAgQjE5ICAgR1BJT0YxICAgIE5EQ0Q0ICAgICAgIFNDVTgwWzI1XT0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJT1BCSSMgICAgIFNDVUE0WzEyXT0xIHwgU3RyYXBbMTldPTAgICAgICAgICAgICAgICAgR1BJT0YxCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKgorICogRm9yIHBpbiBFMTgsIHRoZSBTb0MgQU5EcyB0aGUgZXhwZWN0ZWQgc3RhdGUgb2YgdGhyZWUgYml0cyB0byBkZXRlcm1pbmUgdGhlCisgKiBwaW4ncyBhY3RpdmUgc2lnbmFsOgorICoKKyAqICogU0NVM0NbM106IEVuYWJsZSBleHRlcm5hbCBTT0MgcmVzZXQgZnVuY3Rpb24KKyAqICogU0NVODBbMTVdOiBFbmFibGUgU1BJQ1MxIyBvciBFWFRSU1QjIGZ1bmN0aW9uIHBpbgorICogKiBTQ1U5MFszMV06IFNlbGVjdCBTUEkgaW50ZXJmYWNlIENTIyBvdXRwdXQKKyAqCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKiAgRTE4ICAgR1BJT0I3ICAgIEVYVFJTVCMgICAgIFNDVTNDWzNdPTEgJiBTQ1U4MFsxNV09MSAmIFNDVTkwWzMxXT0wICAgIFNQSUNTMSMgICAgIFNDVTNDWzNdPTEgJiBTQ1U4MFsxNV09MSAmIFNDVTkwWzMxXT0xICAgR1BJT0I3CisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKgorICogKEJpdHMgU0NVM0NbM10gYW5kIFNDVTgwWzE1XSBhcHBlYXIgdG8gb25seSBiZSB1c2VkIGluIHRoZSBleHByZXNzaW9ucyBmb3IKKyAqIHNlbGVjdGluZyB0aGUgc2lnbmFscyBvbiBwaW4gRTE4KQorICoKKyAqIFBpbiBUNSBpcyBhIG11bHRpLXNpZ25hbCBwaW4gd2l0aCBhIG1vcmUgY29tcGxleCBjb25maWd1cmF0aW9uOgorICoKKyAqIEJhbGwgfCBEZWZhdWx0IHwgUDAgU2lnbmFsIHwgUDAgRXhwcmVzc2lvbiAgICAgICAgICAgICAgICB8IFAxIFNpZ25hbCB8IFAxIEV4cHJlc3Npb24gfCBPdGhlcgorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICogIFQ1ICAgIEdQSU9MMSAgICBWUElERSAgICAgICBTQ1U5MFs1OjRdIT0wICYgU0NVODRbMTddPTEgICAgTkRDRDEgICAgICAgU0NVODRbMTddPTEgICAgIEdQSU9MMQorICogLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorICoKKyAqIFRoZSBoaWdoIHByaW9yaXR5IHNpZ25hbCBjb25maWd1cmF0aW9uIGlzIGJlc3QgdGhvdWdodCBvZiBpbiB0ZXJtcyBvZiBpdHMKKyAqIGV4cGxvZGVkIGZvcm0sIHdpdGggcmVmZXJlbmNlIHRvIHRoZSBTQ1U5MFs1OjRdIGJpdHM6CisgKgorICogKiBTQ1U5MFs1OjRdPTAwOiBkaXNhYmxlCisgKiAqIFNDVTkwWzU6NF09MDE6IDE4IGJpdHMgKFI2L0c2L0I2KSB2aWRlbyBtb2RlLgorICogKiBTQ1U5MFs1OjRdPTEwOiAyNCBiaXRzIChSOC9HOC9COCkgdmlkZW8gbW9kZS4KKyAqICogU0NVOTBbNTo0XT0xMTogMzAgYml0cyAoUjEwL0cxMC9CMTApIHZpZGVvIG1vZGUuCisgKgorICogUmUtd3JpdGluZzoKKyAqCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKiAgVDUgICAgR1BJT0wxICAgIFZQSURFICAgICAgKFNDVTkwWzU6NF09MSAmIFNDVTg0WzE3XT0xKSAgICBORENEMSAgICAgICBTQ1U4NFsxN109MSAgICAgR1BJT0wxCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoU0NVOTBbNTo0XT0yICYgU0NVODRbMTddPTEpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoU0NVOTBbNTo0XT0zICYgU0NVODRbMTddPTEpCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKgorICogRm9yIHJlZmVyZW5jZSB0aGUgU0NVODRbMTddIGJpdCBjb25maWd1cmUgdGhlICJVQVJUMSBORENEMSBvciBWaWRlbyBWUElERQorICogZnVuY3Rpb24gcGluIiwgd2hlcmUgdGhlIHNpZ25hbCBpdHNlbGYgaXMgZGV0ZXJtaW5lZCBieSB3aGV0aGVyIFNDVTk0WzU6NF0KKyAqIGlzIGRpc2FibGVkIG9yIGluIG9uZSBvZiB0aGUgMTgsIDI0IG9yIDMwYml0IHZpZGVvIG1vZGVzLgorICoKKyAqIE90aGVyIHZpZGVvLWlucHV0LXJlbGF0ZWQgcGlucyByZXF1aXJlIGFuIGV4cGxpY2l0IHN0YXRlIGluIFNDVTkwWzU6NF0sIGUuZy4KKyAqIFcxIGFuZCBVNToKKyAqCisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKiAgVzEgICAgR1BJT0w2ICAgIFZQSUIwICAgICAgIFNDVTkwWzU6NF09MyAmIFNDVTg0WzIyXT0xICAgICBUWEQxICAgICAgICBTQ1U4NFsyMl09MSAgICAgR1BJT0w2CisgKiAgVTUgICAgR1BJT0w3ICAgIFZQSUIxICAgICAgIFNDVTkwWzU6NF09MyAmIFNDVTg0WzIzXT0xICAgICBSWEQxICAgICAgICBTQ1U4NFsyM109MSAgICAgR1BJT0w3CisgKiAtLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgKgorICogVGhlIGV4YW1wbGVzIG9mIFQ1IGFuZCBXMSBhcmUgcGFydGljdWxhcmx5IGZlcnRpbGUsIGFzIHRoZXkgYWxzbyBkZW1vbnN0cmF0ZQorICogdGhhdCBkZXNwaXRlIG9wZXJhdGluZyBhcyBwYXJ0IG9mIHRoZSB2aWRlbyBpbnB1dCBidXMgZWFjaCBzaWduYWwgbmVlZHMgdG8KKyAqIGJlIGVuYWJsZWQgaW5kaXZpZHVhbGx5IHZpYSBpdCdzIG93biBTQ1U4NCAoaW4gdGhlIGNhc2VzIG9mIFQ1IGFuZCBXMSkKKyAqIHJlZ2lzdGVyIGJpdC4gVGhpcyBpcyBhIGxpdHRsZSBjcmF6eSBpZiB0aGUgYnVzIGRvZXNuJ3QgaGF2ZSBvcHRpb25hbAorICogc2lnbmFscywgYnV0IGlzIHVzZWQgdG8gZGVjZW50IGVmZmVjdCB3aXRoIHNvbWUgb2YgdGhlIFVBUlRzIHdoZXJlIG5vdCBhbGwKKyAqIHNpZ25hbHMgYXJlIHJlcXVpcmVkLiBIb3dldmVyLCB0aGlzIGlzbid0IGRvbmUgY29uc2lzdGVudGx5IC0gVUFSVDEgaXMKKyAqIGVuYWJsZWQgb24gYSBwZXItcGluIGJhc2lzLCBhbmQgYnkgY29udHJhc3QsIGFsbCBzaWduYWxzIGZvciBVQVJUNiBhcmUKKyAqIGVuYWJsZWQgYnkgYSBzaW5nbGUgYml0LgorICoKKyAqIEZ1cnRoZXIsIHRoZSBoaWdoIGFuZCBsb3cgcHJpb3JpdHkgc2lnbmFscyBsaXN0ZWQgaW4gdGhlIHRhYmxlIGFib3ZlIHNoYXJlCisgKiBhIGNvbmZpZ3VyYXRpb24gYml0LiBUaGUgVlBJIHNpZ25hbHMgc2hvdWxkIG9wZXJhdGUgaW4gY29uY2VydCBpbiBhIHNpbmdsZQorICogZnVuY3Rpb24sIGJ1dCB0aGUgVUFSVCBzaWduYWxzIHNob3VsZCByZXRhaW4gdGhlIGFiaWxpdHkgdG8gYmUgY29uZmlndXJlZAorICogaW5kZXBlbmRlbnRseS4gVGhpcyBwdXNoZXMgdGhlIGltcGxlbWVudGF0aW9uIGRvd24gdGhlIHBhdGggb2YgdGFnZ2luZyBhCisgKiBzaWduYWwncyBleHByZXNzaW9ucyB3aXRoIHRoZSBmdW5jdGlvbiB0aGV5IHBhcnRpY2lwYXRlIGluLCByYXRoZXIgdGhhbgorICogZGVmaW5pbmcgbWFza3MgYWZmZWN0aW5nIG11bHRpcGxlIHNpZ25hbHMgcGVyIGZ1bmN0aW9uLiBUaGUgbGF0dGVyIGFwcHJvYWNoCisgKiBmYWlscyBpbiB0aGlzIGluc3RhbmNlIHdoZXJlIGFwcGx5aW5nIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgVUFSVCBwaW4gb2YKKyAqIGludGVyZXN0IHdpbGwgc3RvbXAgb24gdGhlIHN0YXRlIG9mIG90aGVyIFVBUlQgc2lnbmFscyB3aGVuIGRpc2FibGluZyB0aGUKKyAqIFZQSSBmdW5jdGlvbnMgb24gdGhlIGN1cnJlbnQgcGluLgorICoKKyAqIEJhbGwgfCAgRGVmYXVsdCAgIHwgUDAgU2lnbmFsIHwgUDAgRXhwcmVzc2lvbiAgICAgICAgICAgICB8IFAxIFNpZ25hbCB8IFAxIEV4cHJlc3Npb24gfCBPdGhlcgorICogLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tCisgKiAgQTEyICAgUkdNSUkxVFhDSyAgIEdQSU9UMCAgICAgIFNDVUEwWzBdPTEgICAgICAgICAgICAgICAgICBSTUlJMVRYRU4gICBTdHJhcFs2XT0wICAgICAgUkdNSUkxVFhDSworICogIEIxMiAgIFJHTUlJMVRYQ1RMICBHUElPVDEgICAgICBTQ1VBMFsxXT0xICAgICAgICAgICAgICAgICAg4oCTICAgICAgICAgICBTdHJhcFs2XT0wICAgICAgUkdNSUkxVFhDVEwKKyAqIC0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLQorICoKKyAqIEExMiBkZW1vbnN0cmF0ZXMgdGhhdCB0aGUgIk90aGVyIiBzaWduYWwgaXNuJ3QgYWx3YXlzIEdQSU8gLSBpbiB0aGlzIGNhc2UKKyAqIEdQSU9UMCBpcyBhIGhpZ2gtcHJpb3JpdHkgc2lnbmFsIGFuZCBSR01JSTFUWENLIGlzIE90aGVyLiBUaHVzLCBHUElPCisgKiBzaG91bGQgYmUgdHJlYXRlZCBsaWtlIGFueSBvdGhlciBzaWduYWwgdHlwZSB3aXRoIGZ1bGwgZnVuY3Rpb24gZXhwcmVzc2lvbgorICogcmVxdWlyZW1lbnRzLCBhbmQgbm90IGFzc3VtZWQgdG8gYmUgdGhlIGRlZmF1bHQgY2FzZS4gU2VwYXJhdGVseSwgR1BJT1QwIGFuZAorICogR1BJT1QxJ3Mgc2lnbmFsIGRlc2NyaXB0b3IgYml0cyBhcmUgZGlzdGluY3QsIHRoZXJlZm9yZSB3ZSBtdXN0IGl0ZXJhdGUgYWxsCisgKiBwaW5zIGluIHRoZSBmdW5jdGlvbidzIGdyb3VwIHRvIGRpc2FibGUgdGhlIGhpZ2hlci1wcmlvcml0eSBzaWduYWxzIHN1Y2gKKyAqIHRoYXQgdGhlIHNpZ25hbCBmb3IgdGhlIGZ1bmN0aW9uIG9mIGludGVyZXN0IGlzIGNvcnJlY3RseSBlbmFibGVkLgorICoKKyAqIEZpbmFsbHksIHRocmVlIHByaW9yaXR5IGxldmVscyBhcmVuJ3QgYWx3YXlzIGVub3VnaDsgdGhlIEFTVDI1MDAgYnJpbmdzIHdpdGgKKyAqIGl0IDE4IHBpbnMgb2YgZml2ZSBwcmlvcml0eSBsZXZlbHMsIGhvd2V2ZXIgdGhlIDE4IHBpbnMgb25seSB1c2UgdGhyZWUgb2YKKyAqIHRoZSBmaXZlIHByaW9yaXR5IGxldmVscy4KKyAqCisgKiBVbHRpbWF0ZWx5IHRoZSByZXF1aXJlbWVudCB0byBjb250cm9sIHBpbnMgaW4gdGhlIGV4YW1wbGVzIGFib3ZlIGRyaXZlIHRoZQorICogZGVzaWduOgorICoKKyAqICogUGlucyBwcm92aWRlIHNpZ25hbHMgYWNjb3JkaW5nIHRvIGZ1bmN0aW9ucyBhY3RpdmF0ZWQgaW4gdGhlIG11eAorICogICBjb25maWd1cmF0aW9uCisgKgorICogKiBQaW5zIHByb3ZpZGUgdXAgdG8gZml2ZSBzaWduYWwgdHlwZXMgaW4gYSBwcmlvcml0eSBvcmRlcgorICoKKyAqICogRm9yIHByaW9yaXRpZXMgbGV2ZWxzIGRlZmluZWQgb24gYSBwaW4sIGVhY2ggcHJpb3JpdHkgcHJvdmlkZXMgb25lIHNpZ25hbAorICoKKyAqICogRW5hYmxpbmcgbG93ZXIgcHJpb3JpdHkgc2lnbmFscyByZXF1aXJlcyBoaWdoZXIgcHJpb3JpdHkgc2lnbmFscyBiZQorICogICBkaXNhYmxlZAorICoKKyAqICogQSBmdW5jdGlvbiByZXByZXNlbnRzIGEgc2V0IG9mIHNpZ25hbHM7IGZ1bmN0aW9ucyBhcmUgZGlzdGluY3QgaWYgdGhlaXIKKyAqICAgc2V0cyBvZiBzaWduYWxzIGFyZSBub3QgZXF1YWwKKyAqCisgKiAqIFNpZ25hbHMgcGFydGljaXBhdGUgaW4gb25lIG9yIG1vcmUgZnVuY3Rpb25zCisgKgorICogKiBBIGZ1bmN0aW9uIGlzIGRlc2NyaWJlZCBieSBhbiBleHByZXNzaW9uIG9mIG9uZSBvciBtb3JlIHNpZ25hbAorICogICBkZXNjcmlwdG9ycywgd2hpY2ggY29tcGFyZSBiaXQgdmFsdWVzIGluIGEgcmVnaXN0ZXIKKyAqCisgKiAqIEEgc2lnbmFsIGV4cHJlc3Npb24gaXMgdGhlIHNtYWxsZXN0IHNldCBvZiBzaWduYWwgZGVzY3JpcHRvcnMgd2hvc2UKKyAqICAgY29tcGFyaXNvbnMgbXVzdCBldmFsdWF0ZSAndHJ1ZScgZm9yIGEgc2lnbmFsIHRvIGJlIGVuYWJsZWQgb24gYSBwaW4uCisgKgorICogKiBBIGZ1bmN0aW9uJ3Mgc2lnbmFsIGlzIGFjdGl2ZSBvbiBhIHBpbiBpZiBldmFsdWF0aW5nIGFsbCBzaWduYWwKKyAqICAgZGVzY3JpcHRvcnMgaW4gdGhlIHBpbidzIHNpZ25hbCBleHByZXNzaW9uIGZvciB0aGUgZnVuY3Rpb24geWllbGRzIGEgJ3RydWUnCisgKiAgIHJlc3VsdAorICoKKyAqICogQSBzaWduYWwgYXQgYSBnaXZlbiBwcmlvcml0eSBvbiBhIGdpdmVuIHBpbiBpcyBhY3RpdmUgaWYgYW55IG9mIHRoZQorICogICBmdW5jdGlvbnMgaW4gd2hpY2ggdGhlIHNpZ25hbCBwYXJ0aWNpcGF0ZXMgYXJlIGFjdGl2ZSwgYW5kIG5vIGhpZ2hlcgorICogICBwcmlvcml0eSBzaWduYWwgb24gdGhlIHBpbiBpcyBhY3RpdmUKKyAqCisgKiAqIEdQSU8gaXMgY29uZmlndXJlZCBwZXItcGluCisgKgorICogQW5kIHNvOgorICoKKyAqICogVG8gZGlzYWJsZSBhIHNpZ25hbCwgYW55IGZ1bmN0aW9uKHMpIGFjdGl2YXRpbmcgdGhlIHNpZ25hbCBtdXN0IGJlCisgKiAgIGRpc2FibGVkCisgKgorICogKiBFYWNoIHBpbiBtdXN0IGtub3cgdGhlIHNpZ25hbCBleHByZXNzaW9ucyBvZiBmdW5jdGlvbnMgaW4gd2hpY2ggaXQKKyAqICAgcGFydGljaXBhdGVzLCBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5hYmxpbmcgdGhlIE90aGVyIGZ1bmN0aW9uLiBUaGlzIGlzIGRvbmUKKyAqICAgYnkgZGVhY3RpdmF0aW5nIGFsbCBmdW5jdGlvbnMgdGhhdCBhY3RpdmF0ZSBoaWdoZXIgcHJpb3JpdHkgc2lnbmFscyBvbiB0aGUKKyAqICAgcGluLgorICoKKyAqIEFzIGEgY29uY3JldGUgZXhhbXBsZToKKyAqCisgKiAqIFQ1IHByb3ZpZGVzIHRocmVlIHNpZ25hbHMgdHlwZXM6IFZQSURFLCBORENEMSBhbmQgR1BJTworICoKKyAqICogVGhlIFZQSURFIHNpZ25hbCBwYXJ0aWNpcGF0ZXMgaW4gMyBmdW5jdGlvbnM6IFZQSTE4LCBWUEkyNCBhbmQgVlBJMzAKKyAqCisgKiAqIFRoZSBORENEMSBzaWduYWwgcGFydGljaXBhdGVzIGluIGp1c3QgaXRzIG93biBORENEMSBmdW5jdGlvbgorICoKKyAqICogVlBJREUgaXMgaGlnaCBwcmlvcml0eSwgTkRDRDEgaXMgbG93IHByaW9yaXR5LCBhbmQgR1BJT0wxIGlzIHRoZSBsZWFzdAorICogICBwcmlvcml0aXNlZAorICoKKyAqICogVGhlIHByZXJlcXVpc2l0IGZvciBhY3RpdmF0aW5nIHRoZSBORENEMSBzaWduYWwgaXMgdGhhdCB0aGUgVlBJMTgsIFZQSTI0CisgKiAgIGFuZCBWUEkzMCBmdW5jdGlvbnMgYWxsIGJlIGRpc2FibGVkCisgKgorICogKiBTaW1pbGFybHksIGFsbCBvZiBWUEkxOCwgVlBJMjQsIFZQSTMwIGFuZCBORENEMSBmdW5jdGlvbnMgbXVzdCBiZSBkaXNhYmxlZAorICogICB0byBwcm92aWRlIEdQSU9MNgorICoKKyAqIENvbnNpZGVyYXRpb25zCisgKiAtLS0tLS0tLS0tLS0tLQorICoKKyAqIElmIHBpbmN0cmwgYWxsb3dzIHVzIHRvIGFsbG9jYXRlIGEgcGluIHdlIGNhbiBjb25maWd1cmUgYSBmdW5jdGlvbiB3aXRob3V0CisgKiBjb25jZXJuIGZvciB0aGUgZnVuY3Rpb24gb2YgYWxyZWFkeSBhbGxvY2F0ZWQgcGlucywgaWYgcGluIGdyb3VwcyBhcmUKKyAqIGNyZWF0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBTb0MgZnVuY3Rpb25zIGluIHdoaWNoIHRoZXkgcGFydGljaXBhdGUuIFRoaXMgaXMKKyAqIGludHVpdGl2ZSwgYnV0IGl0IGRpZCBub3QgZmVlbCBvYnZpb3VzIGZyb20gdGhlIGJpdC9waW4gcmVsYXRpb25zaGlwcy4KKyAqCisgKiBDb252ZXJzZWx5LCBmYWlsaW5nIHRvIGFsbG9jYXRlIGFsbCBwaW5zIGluIGEgZ3JvdXAgaW5kaWNhdGVzIHNvbWUgYml0cyAoYXMKKyAqIHdlbGwgYXMgcGlucykgcmVxdWlyZWQgZm9yIHRoZSBncm91cCdzIGNvbmZpZ3VyYXRpb24gd2lsbCBhbHJlYWR5IGJlIGluIHVzZSwKKyAqIGxpa2VseSBpbiBhIHdheSB0aGF0J3MgaW5jb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgZmFpbGVkCisgKiBncm91cC4KKyAqLworCisvKgorICogVGhlICJNdWx0aS1mdW5jdGlvbiBQaW5zIE1hcHBpbmcgYW5kIENvbnRyb2wiIHRhYmxlIGluIHRoZSBTb0MgZGF0YXNoZWV0CisgKiByZWZlcmVuY2VzIHJlZ2lzdGVycyBieSB0aGUgZGV2aWNlL29mZnNldCBtbmVtb25pYy4gVGhlIHJlZ2lzdGVyIG1hY3JvcworICogYmVsb3cgYXJlIG5hbWVkIHRoZSBzYW1lIHdheSB0byBlYXNlIHRyYW5zY3JpcHRpb24gYW5kIHZlcmlmaWNhdGlvbiAoYXMKKyAqIG9wcG9zZWQgdG8gbmFtaW5nIHRoZW0gZS5nLiBQSU5NVVhfQ1RSTF9bMC05XSkuIEZ1cnRoZXIsIHNpZ25hbCBleHByZXNzaW9ucworICogcmVmZXJlbmNlIHJlZ2lzdGVycyBiZXlvbmQgdGhvc2UgZGVkaWNhdGVkIHRvIHBpbm11eCwgc3VjaCBhcyB0aGUgc3lzdGVtCisgKiByZXNldCBjb250cm9sIGFuZCBNQUMgY2xvY2sgY29uZmlndXJhdGlvbiByZWdpc3RlcnMuIFRoZSBBU1QyNTAwIGdvZXMgYSBzdGVwCisgKiBmdXJ0aGVyIGFuZCByZWZlcmVuY2VzIHJlZ2lzdGVycyBpbiB0aGUgZ3JhcGhpY3MgSVAgYmxvY2ssIGJ1dCB0aGF0IGlzbid0CisgKiBoYW5kbGVkIHlldC4KKyAqLworI2RlZmluZSBTQ1UyQyAgICAgICAgICAgMHgyQyAvKiBNaXNjLiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNDVTNDICAgICAgICAgICAweDNDIC8qIFN5c3RlbSBSZXNldCBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTQ1U0OCAgICAgICAgICAgMHg0OCAvKiBNQUMgSW50ZXJmYWNlIENsb2NrIERlbGF5IFNldHRpbmcgKi8KKyNkZWZpbmUgSFdfU1RSQVAxICAgICAgIDB4NzAgLyogQVNUMjQwMCBzdHJhcHBpbmcgaXMgMzMgYml0cywgaXMgc3BsaXQgKi8KKyNkZWZpbmUgU0NVODAgICAgICAgICAgIDB4ODAgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzEgKi8KKyNkZWZpbmUgU0NVODQgICAgICAgICAgIDB4ODQgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzIgKi8KKyNkZWZpbmUgU0NVODggICAgICAgICAgIDB4ODggLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzMgKi8KKyNkZWZpbmUgU0NVOEMgICAgICAgICAgIDB4OEMgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzQgKi8KKyNkZWZpbmUgU0NVOTAgICAgICAgICAgIDB4OTAgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzUgKi8KKyNkZWZpbmUgU0NVOTQgICAgICAgICAgIDB4OTQgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzYgKi8KKyNkZWZpbmUgU0NVQTAgICAgICAgICAgIDB4QTAgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzcgKi8KKyNkZWZpbmUgU0NVQTQgICAgICAgICAgIDB4QTQgLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzggKi8KKyNkZWZpbmUgU0NVQTggICAgICAgICAgIDB4QTggLyogTXVsdGktZnVuY3Rpb24gUGluIENvbnRyb2wgIzkgKi8KKyNkZWZpbmUgSFdfU1RSQVAyICAgICAgIDB4RDAgLyogU3RyYXBwaW5nICovCisKKyAvKioKKyAgKiBBIHNpZ25hbCBkZXNjcmlwdG9yLCB3aGljaCBkZXNjcmliZXMgdGhlIHJlZ2lzdGVyLCBiaXRzIGFuZCB0aGUKKyAgKiBlbmFibGUvZGlzYWJsZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgY29tcGFyZWQgb3Igd3JpdHRlbi4KKyAgKgorICAqIEByZWc6IFRoZSByZWdpc3RlciBvZmZzZXQgZnJvbSBiYXNlIGluIGJ5dGVzCisgICogQG1hc2s6IFRoZSBtYXNrIHRvIGFwcGx5IHRvIHRoZSByZWdpc3Rlci4gVGhlIGxvd2VzdCBzZXQgYml0IG9mIHRoZSBtYXNrIGlzCisgICogICAgICAgIHVzZWQgdG8gZGVyaXZlIHRoZSBzaGlmdCB2YWx1ZS4KKyAgKiBAZW5hYmxlOiBUaGUgdmFsdWUgdGhhdCBlbmFibGVzIHRoZSBmdW5jdGlvbi4gVmFsdWUgc2hvdWxkIGJlIGluIHRoZSBMU0JzLAorICAqICAgICAgICAgIG5vdCBhdCB0aGUgcG9zaXRpb24gb2YgdGhlIG1hc2suCisgICogQGRpc2FibGU6IFRoZSB2YWx1ZSB0aGF0IGRpc2FibGVzIHRoZSBmdW5jdGlvbi4gVmFsdWUgc2hvdWxkIGJlIGluIHRoZQorICAqICAgICAgICAgICBMU0JzLCBub3QgYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtYXNrLgorICAqLworc3RydWN0IGFzcGVlZF9zaWdfZGVzYyB7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1MzIgbWFzazsKKwl1MzIgZW5hYmxlOworCXUzMiBkaXNhYmxlOworfTsKKworLyoqCisgKiBEZXNjcmliZXMgYSBzaWduYWwgZXhwcmVzc2lvbi4gVGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGJ5IEFORGluZyB0aGUKKyAqIGV2YWx1YXRpb24gb2YgdGhlIGRlc2NyaXB0b3JzLgorICoKKyAqIEBzaWduYWw6IFRoZSBzaWduYWwgbmFtZSBmb3IgdGhlIHByaW9yaXR5IGxldmVsIG9uIHRoZSBwaW4uIElmIHRoZSBzaWduYWwKKyAqICAgICAgICAgIHR5cGUgaXMgR1BJTywgdGhlbiB0aGUgc2lnbmFsIG5hbWUgbXVzdCBiZWdpbiB3aXRoIHRoZSBzdHJpbmcKKyAqICAgICAgICAgICJHUElPIiwgZS5nLiBHUElPQTAsIEdQSU9UNCBldGMuCisgKiBAZnVuY3Rpb246IFRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGUgc2lnbmFsIHBhcnRpY2lwYXRlcyBpbiBmb3IgdGhlCisgKiAgICAgICAgICAgIGFzc29jaWF0ZWQgZXhwcmVzc2lvbgorICogQG5kZXNjczogVGhlIG51bWJlciBvZiBzaWduYWwgZGVzY3JpcHRvcnMgaW4gdGhlIGV4cHJlc3Npb24KKyAqIEBkZXNjczogUG9pbnRlciB0byBhbiBhcnJheSBvZiBzaWduYWwgZGVzY3JpcHRvcnMgdGhhdCBjb21wcmlzZSB0aGUKKyAqICAgICAgICAgZnVuY3Rpb24gZXhwcmVzc2lvbgorICovCitzdHJ1Y3QgYXNwZWVkX3NpZ19leHByIHsKKwljb25zdCBjaGFyICpzaWduYWw7CisJY29uc3QgY2hhciAqZnVuY3Rpb247CisJaW50IG5kZXNjczsKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19kZXNjICpkZXNjczsKK307CisKKy8qKgorICogQSBzdHJ1Y3QgY2FwdHVyaW5nIHRoZSBsaXN0IG9mIGV4cHJlc3Npb25zIGVuYWJsaW5nIHNpZ25hbHMgYXQgZWFjaCBwcmlvcml0eQorICogZm9yIGEgZ2l2ZW4gcGluLiBUaGUgc2lnbmFsIGNvbmZpZ3VyYXRpb24gZm9yIGEgcHJpb3JpdHkgbGV2ZWwgaXMgZXZhbHVhdGVkCisgKiBieSBPUmluZyB0aGUgZXZhbHVhdGlvbiBvZiB0aGUgc2lnbmFsIGV4cHJlc3Npb25zIGluIHRoZSByZXNwZWN0aXZlCisgKiBwcmlvcml0eSdzIGxpc3QuCisgKgorICogQG5hbWU6IEEgbmFtZSBmb3IgdGhlIHBpbgorICogQHByaW9zOiBBIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgZXhwcmVzc2lvbiBsaXN0IHBvaW50ZXJzCisgKgorICovCitzdHJ1Y3QgYXNwZWVkX3Bpbl9kZXNjIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKioqcHJpb3M7Cit9OworCisvKiBNYWNybyBoZWxsICovCisKKy8qKgorICogU2hvcnQtaGFuZCBtYWNybyBmb3IgZGVzY3JpYmluZyBhIGNvbmZpZ3VyYXRpb24gZW5hYmxlZCBieSB0aGUgc3RhdGUgb2Ygb25lCisgKiBiaXQuIFRoZSBkaXNhYmxlIHZhbHVlIGlzIGRlcml2ZWQuCisgKgorICogQHJlZzogVGhlIHNpZ25hbCdzIGFzc29jaWF0ZWQgcmVnaXN0ZXIsIG9mZnNldCBmcm9tIGJhc2UKKyAqIEBpZHg6IFRoZSBzaWduYWwncyBiaXQgaW5kZXggaW4gdGhlIHJlZ2lzdGVyCisgKiBAdmFsOiBUaGUgdmFsdWUgKDAgb3IgMSkgdGhhdCBlbmFibGVzIHRoZSBmdW5jdGlvbgorICovCisjZGVmaW5lIFNJR19ERVNDX0JJVChyZWcsIGlkeCwgdmFsKSBcCisJeyByZWcsIEJJVF9NQVNLKGlkeCksIHZhbCwgKCgodmFsKSArIDEpICYgMSkgfQorCisvKioKKyAqIEEgZnVydGhlciBzaG9ydC1oYW5kIG1hY3JvIGRlc2NyaWJpbmcgYSBjb25maWd1cmF0aW9uIGVuYWJsZWQgd2l0aCBhIHNldCBiaXQuCisgKgorICogQHJlZzogVGhlIGNvbmZpZ3VyYXRpb24ncyBhc3NvY2lhdGVkIHJlZ2lzdGVyLCBvZmZzZXQgZnJvbSBiYXNlCisgKiBAaWR4OiBUaGUgY29uZmlndXJhdGlvbidzIGJpdCBpbmRleCBpbiB0aGUgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBTSUdfREVTQ19TRVQocmVnLCBpZHgpIFNJR19ERVNDX0JJVChyZWcsIGlkeCwgMSkKKworI2RlZmluZSBTSUdfREVTQ19MSVNUX1NZTShzaWcsIGZ1bmMpIHNpZ19kZXNjc18gIyMgc2lnICMjIF8gIyMgZnVuYworI2RlZmluZSBTSUdfREVTQ19MSVNUX0RFQ0woc2lnLCBmdW5jLCAuLi4pIFwKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGFzcGVlZF9zaWdfZGVzYyBTSUdfREVTQ19MSVNUX1NZTShzaWcsIGZ1bmMpW10gPSBcCisJCXsgX19WQV9BUkdTX18gfQorCisjZGVmaW5lIFNJR19FWFBSX1NZTShzaWcsIGZ1bmMpIHNpZ19leHByXyAjIyBzaWcgIyMgXyAjIyBmdW5jCisjZGVmaW5lIFNJR19FWFBSX0RFQ0xfKHNpZywgZnVuYykgXAorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXNwZWVkX3NpZ19leHByIFNJR19FWFBSX1NZTShzaWcsIGZ1bmMpID0gXAorCXsgXAorCQkuc2lnbmFsID0gI3NpZywgXAorCQkuZnVuY3Rpb24gPSAjZnVuYywgXAorCQkubmRlc2NzID0gQVJSQVlfU0laRShTSUdfREVTQ19MSVNUX1NZTShzaWcsIGZ1bmMpKSwgXAorCQkuZGVzY3MgPSAmKFNJR19ERVNDX0xJU1RfU1lNKHNpZywgZnVuYykpWzBdLCBcCisJfQorCisvKioKKyAqIERlY2xhcmUgYSBzaWduYWwgZXhwcmVzc2lvbi4KKyAqCisgKiBAc2lnOiBBIG1hY3JvIHN5bWJvbCBuYW1lIGZvciB0aGUgc2lnbmFsIChpcyBzdWJqZWN0ZWQgdG8gc3RyaW5naWZpY2F0aW9uCisgKiAgICAgICAgYW5kIHRva2VuIHBhc3RpbmcpCisgKiBAZnVuYzogVGhlIGZ1bmN0aW9uIGluIHdoaWNoIHRoZSBzaWduYWwgaXMgcGFydGljaXBhdGluZworICogQC4uLjogU2lnbmFsIGRlc2NyaXB0b3JzIHRoYXQgZGVmaW5lIHRoZSBzaWduYWwgZXhwcmVzc2lvbgorICoKKyAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGRlY2xhcmVzIHRoZSBST01EOCBzaWduYWwgZm9yIHRoZSBST00xNiBmdW5jdGlvbjoKKyAqCisgKiAgICAgU0lHX0VYUFJfREVDTChST01EOCwgUk9NMTYsIFNJR19ERVNDX1NFVChTQ1U5MCwgNikpOworICoKKyAqIEFuZCB3aXRoIG11bHRpcGxlIHNpZ25hbCBkZXNjcmlwdG9yczoKKyAqCisgKiAgICAgU0lHX0VYUFJfREVDTChST01EOCwgUk9NMTZTLCBTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCA0KSwKKyAqICAgICAgICAgICAgICB7IEhXX1NUUkFQMSwgR0VOTUFTSygxLCAwKSwgMCwgMCB9KTsKKyAqLworI2RlZmluZSBTSUdfRVhQUl9ERUNMKHNpZywgZnVuYywgLi4uKSBcCisJU0lHX0RFU0NfTElTVF9ERUNMKHNpZywgZnVuYywgX19WQV9BUkdTX18pOyBcCisJU0lHX0VYUFJfREVDTF8oc2lnLCBmdW5jKQorCisvKioKKyAqIERlY2xhcmUgYSBwb2ludGVyIHRvIGEgc2lnbmFsIGV4cHJlc3Npb24KKyAqCisgKiBAc2lnOiBUaGUgbWFjcm8gc3ltYm9sIG5hbWUgZm9yIHRoZSBzaWduYWwgKHN1YmplY3RlZCB0byB0b2tlbiBwYXN0aW5nKQorICogQGZ1bmM6IFRoZSBtYWNybyBzeW1ib2wgbmFtZSBmb3IgdGhlIGZ1bmN0aW9uIChzdWJqZWN0ZWQgdG8gdG9rZW4gcGFzdGluZykKKyAqLworI2RlZmluZSBTSUdfRVhQUl9QVFIoc2lnLCBmdW5jKSAoJlNJR19FWFBSX1NZTShzaWcsIGZ1bmMpKQorCisjZGVmaW5lIFNJR19FWFBSX0xJU1RfU1lNKHNpZykgc2lnX2V4cHJzXyAjIyBzaWcKKworLyoqCisgKiBEZWNsYXJlIGEgc2lnbmFsIGV4cHJlc3Npb24gbGlzdCBmb3IgcmVmZXJlbmNlIGluIGEgc3RydWN0IGFzcGVlZF9waW5fcHJpby4KKyAqCisgKiBAc2lnOiBBIG1hY3JvIHN5bWJvbCBuYW1lIGZvciB0aGUgc2lnbmFsIChpcyBzdWJqZWN0ZWQgdG8gdG9rZW4gcGFzdGluZykKKyAqIEAuLi46IFNpZ25hbCBleHByZXNzaW9uIHN0cnVjdHVyZSBwb2ludGVycyAodXNlIFNJR19FWFBSX1BUUigpKQorICoKKyAqIEZvciBleGFtcGxlLCB0aGUgMTYtYml0IFJPTSBidXMgY2FuIGJlIGVuYWJsZWQgYnkgb25lIG9mIHR3byBwb3NzaWJsZSBzaWduYWwKKyAqIGV4cHJlc3Npb25zOgorICoKKyAqICAgICBTSUdfRVhQUl9ERUNMKFJPTUQ4LCBST00xNiwgU0lHX0RFU0NfU0VUKFNDVTkwLCA2KSk7CisgKiAgICAgU0lHX0VYUFJfREVDTChST01EOCwgUk9NMTZTLCBTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCA0KSwKKyAqICAgICAgICAgICAgICB7IEhXX1NUUkFQMSwgR0VOTUFTSygxLCAwKSwgMCwgMCB9KTsKKyAqICAgICBTSUdfRVhQUl9MSVNUX0RFQ0woUk9NRDgsIFNJR19FWFBSX1BUUihST01EOCwgUk9NMTYpLAorICogICAgICAgICAgICAgIFNJR19FWFBSX1BUUihST01EOCwgUk9NMTZTKSk7CisgKi8KKyNkZWZpbmUgU0lHX0VYUFJfTElTVF9ERUNMKHNpZywgLi4uKSBcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKlNJR19FWFBSX0xJU1RfU1lNKHNpZylbXSA9IFwKKwkJeyBfX1ZBX0FSR1NfXywgTlVMTCB9CisKKy8qKgorICogQSBzaG9ydC1oYW5kIG1hY3JvIGZvciBkZWNsYXJpbmcgYSBmdW5jdGlvbiBleHByZXNzaW9uIGFuZCBhbiBleHByZXNzaW9uCisgKiBsaXN0IHdpdGggYSBzaW5nbGUgZnVuY3Rpb24uCisgKgorICogQGZ1bmM6IEEgbWFjcm8gc3ltYm9sIG5hbWUgZm9yIHRoZSBmdW5jdGlvbiAoaXMgc3ViamVjdGVkIHRvIHRva2VuIHBhc3RpbmcpCisgKiBALi4uOiBGdW5jdGlvbiBkZXNjcmlwdG9ycyB0aGF0IGRlZmluZSB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbgorICoKKyAqIEZvciBleGFtcGxlLCBzaWduYWwgTkNUUzYgcGFydGljaXBhdGVzIGluIGl0cyBvd24gZnVuY3Rpb24gd2l0aCBvbmUgZ3JvdXA6CisgKgorICogICAgIFNJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoTkNUUzYsIE5DVFM2LCBTSUdfREVTQ19TRVQoU0NVOTAsIDcpKTsKKyAqLworI2RlZmluZSBTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKHNpZywgZnVuYywgLi4uKSBcCisJU0lHX0RFU0NfTElTVF9ERUNMKHNpZywgZnVuYywgX19WQV9BUkdTX18pOyBcCisJU0lHX0VYUFJfREVDTF8oc2lnLCBmdW5jKTsgXAorCVNJR19FWFBSX0xJU1RfREVDTChzaWcsIFNJR19FWFBSX1BUUihzaWcsIGZ1bmMpKQorCisjZGVmaW5lIFNJR19FWFBSX0xJU1RfREVDTF9EVUFMKHNpZywgZjAsIGYxKSBcCisJU0lHX0VYUFJfTElTVF9ERUNMKHNpZywgU0lHX0VYUFJfUFRSKHNpZywgZjApLCBTSUdfRVhQUl9QVFIoc2lnLCBmMSkpCisKKyNkZWZpbmUgU0lHX0VYUFJfTElTVF9QVFIoc2lnKSAoJlNJR19FWFBSX0xJU1RfU1lNKHNpZylbMF0pCisKKyNkZWZpbmUgUElOX0VYUFJTX1NZTShwaW4pIHBpbl9leHByc18gIyMgcGluCisjZGVmaW5lIFBJTl9FWFBSU19QVFIocGluKSAoJlBJTl9FWFBSU19TWU0ocGluKVswXSkKKyNkZWZpbmUgUElOX1NZTShwaW4pIHBpbl8gIyMgcGluCisKKyNkZWZpbmUgTVNfUElOX0RFQ0xfKHBpbiwgLi4uKSBcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfc2lnX2V4cHIgKipQSU5fRVhQUlNfU1lNKHBpbilbXSA9IFwKKwkJeyBfX1ZBX0FSR1NfXywgTlVMTCB9OyBcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBhc3BlZWRfcGluX2Rlc2MgUElOX1NZTShwaW4pID0gXAorCQl7ICNwaW4sIFBJTl9FWFBSU19QVFIocGluKSB9CisKKy8qKgorICogRGVjbGFyZSBhIG11bHRpLXNpZ25hbCBwaW4KKyAqCisgKiBAcGluOiBUaGUgcGluIG51bWJlcgorICogQG90aGVyOiBNYWNybyBuYW1lIGZvciAib3RoZXIiIGZ1bmN0aW9uYWxpdHkgKHN1YmplY3RlZCB0byBzdHJpbmdpZmljYXRpb24pCisgKiBAaGlnaDogTWFjcm8gbmFtZSBmb3IgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgc2lnbmFsIGZ1bmN0aW9ucworICogQGxvdzogTWFjcm8gbmFtZSBmb3IgdGhlIGxvdyBzaWduYWwgZnVuY3Rpb25zCisgKgorICogRm9yIGV4YW1wbGU6CisgKgorICogICAgICNkZWZpbmUgQTggNTYKKyAqICAgICBTSUdfRVhQUl9ERUNMKFJPTUQ4LCBST00xNiwgU0lHX0RFU0NfU0VUKFNDVTkwLCA2KSk7CisgKiAgICAgU0lHX0VYUFJfREVDTChST01EOCwgUk9NMTZTLCBTSUdfREVTQ19TRVQoSFdfU1RSQVAxLCA0KSwKKyAqICAgICAgICAgICAgICB7IEhXX1NUUkFQMSwgR0VOTUFTSygxLCAwKSwgMCwgMCB9KTsKKyAqICAgICBTSUdfRVhQUl9MSVNUX0RFQ0woUk9NRDgsIFNJR19FWFBSX1BUUihST01EOCwgUk9NMTYpLAorICogICAgICAgICAgICAgIFNJR19FWFBSX1BUUihST01EOCwgUk9NMTZTKSk7CisgKiAgICAgU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShOQ1RTNiwgTkNUUzYsIFNJR19ERVNDX1NFVChTQ1U5MCwgNykpOworICogICAgIE1TX1BJTl9ERUNMKEE4LCBHUElPSDAsIFJPTUQ4LCBOQ1RTNik7CisgKi8KKyNkZWZpbmUgTVNfUElOX0RFQ0wocGluLCBvdGhlciwgaGlnaCwgbG93KSBcCisJU0lHX0VYUFJfTElTVF9ERUNMX1NJTkdMRShvdGhlciwgb3RoZXIpOyBcCisJTVNfUElOX0RFQ0xfKHBpbiwgXAorCQkJU0lHX0VYUFJfTElTVF9QVFIoaGlnaCksIFwKKwkJCVNJR19FWFBSX0xJU1RfUFRSKGxvdyksIFwKKwkJCVNJR19FWFBSX0xJU1RfUFRSKG90aGVyKSkKKworI2RlZmluZSBQSU5fR1JPVVBfU1lNKGZ1bmMpIHBpbnNfICMjIGZ1bmMKKyNkZWZpbmUgRlVOQ19HUk9VUF9TWU0oZnVuYykgZ3JvdXBzXyAjIyBmdW5jCisjZGVmaW5lIEZVTkNfR1JPVVBfREVDTChmdW5jLCAuLi4pIFwKKwlzdGF0aWMgY29uc3QgaW50IFBJTl9HUk9VUF9TWU0oZnVuYylbXSA9IHsgX19WQV9BUkdTX18gfTsgXAorCXN0YXRpYyBjb25zdCBjaGFyICpGVU5DX0dST1VQX1NZTShmdW5jKVtdID0geyAjZnVuYyB9CisKKy8qKgorICogRGVjbGFyZSBhIHNpbmdsZSBzaWduYWwgcGluCisgKgorICogQHBpbjogVGhlIHBpbiBudW1iZXIKKyAqIEBvdGhlcjogTWFjcm8gbmFtZSBmb3IgIm90aGVyIiBmdW5jdGlvbmFsaXR5IChzdWJqZWN0ZWQgdG8gc3RyaW5naWZpY2F0aW9uKQorICogQHNpZzogTWFjcm8gbmFtZSBmb3IgdGhlIHNpZ25hbCAoc3ViamVjdGVkIHRvIHN0cmluZ2lmaWNhdGlvbikKKyAqCisgKiBGb3IgZXhhbXBsZToKKyAqCisgKiAgICAgI2RlZmluZSBFMyA4MAorICogICAgIFNJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoU0NMNSwgSTJDNSwgSTJDNV9ERVNDKTsKKyAqICAgICBTU19QSU5fREVDTChFMywgR1BJT0swLCBTQ0w1KTsKKyAqLworI2RlZmluZSBTU19QSU5fREVDTChwaW4sIG90aGVyLCBzaWcpIFwKKwlTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKG90aGVyLCBvdGhlcik7IFwKKwlNU19QSU5fREVDTF8ocGluLCBTSUdfRVhQUl9MSVNUX1BUUihzaWcpLCBTSUdfRVhQUl9MSVNUX1BUUihvdGhlcikpCisKKy8qKgorICogU2luZ2xlIHNpZ25hbCwgc2luZ2xlIGZ1bmN0aW9uIHBpbiBkZWNsYXJhdGlvbgorICoKKyAqIEBwaW46IFRoZSBwaW4gbnVtYmVyCisgKiBAb3RoZXI6IE1hY3JvIG5hbWUgZm9yICJvdGhlciIgZnVuY3Rpb25hbGl0eSAoc3ViamVjdGVkIHRvIHN0cmluZ2lmaWNhdGlvbikKKyAqIEBzaWc6IE1hY3JvIG5hbWUgZm9yIHRoZSBzaWduYWwgKHN1YmplY3RlZCB0byBzdHJpbmdpZmljYXRpb24pCisgKiBALi4uOiBTaWduYWwgZGVzY3JpcHRvcnMgdGhhdCBkZWZpbmUgdGhlIGZ1bmN0aW9uIGV4cHJlc3Npb24KKyAqCisgKiBGb3IgZXhhbXBsZToKKyAqCisgKiAgICBTU1NGX1BJTl9ERUNMKEE0LCBHUElPQTIsIFRJTUVSMywgU0lHX0RFU0NfU0VUKFNDVTgwLCAyKSk7CisgKi8KKyNkZWZpbmUgU1NTRl9QSU5fREVDTChwaW4sIG90aGVyLCBzaWcsIC4uLikgXAorCVNJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUoc2lnLCBzaWcsIF9fVkFfQVJHU19fKTsgXAorCVNJR19FWFBSX0xJU1RfREVDTF9TSU5HTEUob3RoZXIsIG90aGVyKTsgXAorCU1TX1BJTl9ERUNMXyhwaW4sIFNJR19FWFBSX0xJU1RfUFRSKHNpZyksIFNJR19FWFBSX0xJU1RfUFRSKG90aGVyKSk7IFwKKwlGVU5DX0dST1VQX0RFQ0woc2lnLCBwaW4pCisKKyNkZWZpbmUgR1BJT19QSU5fREVDTChwaW4sIGdwaW8pIFwKKwlTSUdfRVhQUl9MSVNUX0RFQ0xfU0lOR0xFKGdwaW8sIGdwaW8pOyBcCisJTVNfUElOX0RFQ0xfKHBpbiwgU0lHX0VYUFJfTElTVF9QVFIoZ3BpbykpCisKK3N0cnVjdCBhc3BlZWRfcGluY3RybF9kYXRhIHsKKwlzdHJ1Y3QgcmVnbWFwICptYXA7CisKKwljb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAqcGluczsKKwljb25zdCB1bnNpZ25lZCBpbnQgbnBpbnM7CisKKwljb25zdCBzdHJ1Y3QgYXNwZWVkX3Bpbl9ncm91cCAqZ3JvdXBzOworCWNvbnN0IHVuc2lnbmVkIGludCBuZ3JvdXBzOworCisJY29uc3Qgc3RydWN0IGFzcGVlZF9waW5fZnVuY3Rpb24gKmZ1bmN0aW9uczsKKwljb25zdCB1bnNpZ25lZCBpbnQgbmZ1bmN0aW9uczsKK307CisKKyNkZWZpbmUgQVNQRUVEX1BJTkNUUkxfUElOKG5hbWVfKSBcCisJW25hbWVfXSA9IHsgXAorCQkubnVtYmVyID0gbmFtZV8sIFwKKwkJLm5hbWUgPSAjbmFtZV8sIFwKKwkJLmRydl9kYXRhID0gKHZvaWQgKikgJihQSU5fU1lNKG5hbWVfKSkgXAorCX0KKworc3RydWN0IGFzcGVlZF9waW5fZ3JvdXAgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgdW5zaWduZWQgaW50ICpwaW5zOworCWNvbnN0IHVuc2lnbmVkIGludCBucGluczsKK307CisKKyNkZWZpbmUgQVNQRUVEX1BJTkNUUkxfR1JPVVAobmFtZV8pIHsgXAorCS5uYW1lID0gI25hbWVfLCBcCisJLnBpbnMgPSAmKFBJTl9HUk9VUF9TWU0obmFtZV8pKVswXSwgXAorCS5ucGlucyA9IEFSUkFZX1NJWkUoUElOX0dST1VQX1NZTShuYW1lXykpLCBcCit9CisKK3N0cnVjdCBhc3BlZWRfcGluX2Z1bmN0aW9uIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmNvbnN0ICpncm91cHM7CisJdW5zaWduZWQgaW50IG5ncm91cHM7Cit9OworCisjZGVmaW5lIEFTUEVFRF9QSU5DVFJMX0ZVTkMobmFtZV8sIC4uLikgeyBcCisJLm5hbWUgPSAjbmFtZV8sIFwKKwkuZ3JvdXBzID0gJkZVTkNfR1JPVVBfU1lNKG5hbWVfKVswXSwgXAorCS5uZ3JvdXBzID0gQVJSQVlfU0laRShGVU5DX0dST1VQX1NZTShuYW1lXykpLCBcCit9CisKK2ludCBhc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBzX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldik7Citjb25zdCBjaGFyICphc3BlZWRfcGluY3RybF9nZXRfZ3JvdXBfbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCXVuc2lnbmVkIGludCBncm91cCk7CitpbnQgYXNwZWVkX3BpbmN0cmxfZ2V0X2dyb3VwX3BpbnMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQl1bnNpZ25lZCBpbnQgZ3JvdXAsIGNvbnN0IHVuc2lnbmVkIGludCAqKnBpbnMsCisJCXVuc2lnbmVkIGludCAqbnBpbnMpOwordm9pZCBhc3BlZWRfcGluY3RybF9waW5fZGJnX3Nob3coc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHVuc2lnbmVkIGludCBvZmZzZXQpOworaW50IGFzcGVlZF9waW5tdXhfZ2V0X2ZuX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldik7Citjb25zdCBjaGFyICphc3BlZWRfcGlubXV4X2dldF9mbl9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJdW5zaWduZWQgaW50IGZ1bmN0aW9uKTsKK2ludCBhc3BlZWRfcGlubXV4X2dldF9mbl9ncm91cHMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQl1bnNpZ25lZCBpbnQgZnVuY3Rpb24sIGNvbnN0IGNoYXIgKiBjb25zdCAqKmdyb3VwcywKKwkJdW5zaWduZWQgaW50ICogY29uc3QgbnVtX2dyb3Vwcyk7CitpbnQgYXNwZWVkX3Bpbm11eF9zZXRfbXV4KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgaW50IGZ1bmN0aW9uLAorCQl1bnNpZ25lZCBpbnQgZ3JvdXApOworaW50IGFzcGVlZF9ncGlvX3JlcXVlc3RfZW5hYmxlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSAqcmFuZ2UsCisJCXVuc2lnbmVkIGludCBvZmZzZXQpOworaW50IGFzcGVlZF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCXN0cnVjdCBwaW5jdHJsX2Rlc2MgKnBkZXNjLAorCQlzdHJ1Y3QgYXNwZWVkX3BpbmN0cmxfZGF0YSAqcGRhdGEpOworCisjZW5kaWYgLyogUElOQ1RSTF9BU1BFRUQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1iY20yODF4eC5jIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLWJjbTI4MXh4LmMKaW5kZXggNTgyZjZkZi4uYTUzMzFmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLWJjbTI4MXh4LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLWJjbTI4MXh4LmMKQEAgLTEwMTgsNyArMTAxOCw3IEBACiAJc2VxX3ByaW50ZihzLCAiICVzIiwgZGV2X25hbWUocGN0bGRldi0+ZGV2KSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGluY3RybF9vcHMgYmNtMjgxeHhfcGluY3RybF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfb3BzIGJjbTI4MXh4X3BpbmN0cmxfb3BzID0gewogCS5nZXRfZ3JvdXBzX2NvdW50ID0gYmNtMjgxeHhfcGluY3RybF9nZXRfZ3JvdXBzX2NvdW50LAogCS5nZXRfZ3JvdXBfbmFtZSA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2dyb3VwX25hbWUsCiAJLmdldF9ncm91cF9waW5zID0gYmNtMjgxeHhfcGluY3RybF9nZXRfZ3JvdXBfcGlucywKQEAgLTEwODAsNyArMTA4MCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgc3RydWN0IHBpbm11eF9vcHMgYmNtMjgxeHhfcGluY3RybF9waW5tdXhfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5tdXhfb3BzIGJjbTI4MXh4X3BpbmN0cmxfcGlubXV4X29wcyA9IHsKIAkuZ2V0X2Z1bmN0aW9uc19jb3VudCA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2ZjbnNfY291bnQsCiAJLmdldF9mdW5jdGlvbl9uYW1lID0gYmNtMjgxeHhfcGluY3RybF9nZXRfZmNuX25hbWUsCiAJLmdldF9mdW5jdGlvbl9ncm91cHMgPSBiY20yODF4eF9waW5jdHJsX2dldF9mY25fZ3JvdXBzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLW5zMi1tdXguYyBiL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1uczItbXV4LmMKaW5kZXggY2E4MTc4OS4uMTNhNGMyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLW5zMi1tdXguYworKysgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtbnMyLW11eC5jCkBAIC01MzEsNyArNTMxLDcgQEAKIAlzZXFfcHJpbnRmKHMsICIgJXMiLCBkZXZfbmFtZShwY3RybF9kZXYtPmRldikpOwogfQogCi1zdGF0aWMgc3RydWN0IHBpbmN0cmxfb3BzIG5zMl9waW5jdHJsX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9vcHMgbnMyX3BpbmN0cmxfb3BzID0gewogCS5nZXRfZ3JvdXBzX2NvdW50ID0gbnMyX2dldF9ncm91cHNfY291bnQsCiAJLmdldF9ncm91cF9uYW1lID0gbnMyX2dldF9ncm91cF9uYW1lLAogCS5nZXRfZ3JvdXBfcGlucyA9IG5zMl9nZXRfZ3JvdXBfcGlucywKQEAgLTk1OSw3ICs5NTksNyBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9Ci1zdGF0aWMgc3RydWN0IHBpbm11eF9vcHMgbnMyX3Bpbm11eF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbm11eF9vcHMgbnMyX3Bpbm11eF9vcHMgPSB7CiAJLmdldF9mdW5jdGlvbnNfY291bnQgPSBuczJfZ2V0X2Z1bmN0aW9uc19jb3VudCwKIAkuZ2V0X2Z1bmN0aW9uX25hbWUgPSBuczJfZ2V0X2Z1bmN0aW9uX25hbWUsCiAJLmdldF9mdW5jdGlvbl9ncm91cHMgPSBuczJfZ2V0X2Z1bmN0aW9uX2dyb3VwcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1uc3AtbXV4LmMgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtbnNwLW11eC5jCmluZGV4IDQxNDlkYjMuLjM1YzE3NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1uc3AtbXV4LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLW5zcC1tdXguYwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJc2VxX3ByaW50ZihzLCAiICVzIiwgZGV2X25hbWUocGN0cmxfZGV2LT5kZXYpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBwaW5jdHJsX29wcyBuc3BfcGluY3RybF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfb3BzIG5zcF9waW5jdHJsX29wcyA9IHsKIAkuZ2V0X2dyb3Vwc19jb3VudCA9IG5zcF9nZXRfZ3JvdXBzX2NvdW50LAogCS5nZXRfZ3JvdXBfbmFtZSA9IG5zcF9nZXRfZ3JvdXBfbmFtZSwKIAkuZ2V0X2dyb3VwX3BpbnMgPSBuc3BfZ2V0X2dyb3VwX3BpbnMsCkBAIC01MTgsNyArNTE4LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaW5jdHJsLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGlubXV4X29wcyBuc3BfcGlubXV4X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGlubXV4X29wcyBuc3BfcGlubXV4X29wcyA9IHsKIAkuZ2V0X2Z1bmN0aW9uc19jb3VudCA9IG5zcF9nZXRfZnVuY3Rpb25zX2NvdW50LAogCS5nZXRfZnVuY3Rpb25fbmFtZSA9IG5zcF9nZXRfZnVuY3Rpb25fbmFtZSwKIAkuZ2V0X2Z1bmN0aW9uX2dyb3VwcyA9IG5zcF9nZXRfZnVuY3Rpb25fZ3JvdXBzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2ZyZWVzY2FsZS9waW5jdHJsLWlteC5jIGIvZHJpdmVycy9waW5jdHJsL2ZyZWVzY2FsZS9waW5jdHJsLWlteC5jCmluZGV4IDcxMzkxNzUuLjQ3NjEzMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9mcmVlc2NhbGUvcGluY3RybC1pbXguYworKysgYi9kcml2ZXJzL3BpbmN0cmwvZnJlZXNjYWxlL3BpbmN0cmwtaW14LmMKQEAgLTMxNSw3ICszMTUsNyBAQAogCiAJLyogQ3VycmVudGx5IGltcGxlbWVudGF0aW9uIG9ubHkgZm9yIHNoYXJlZCBtdXgvY29uZiByZWdpc3RlciAqLwogCWlmICghKGluZm8tPmZsYWdzICYgU0hBUkVfTVVYX0NPTkZfUkVHKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCiAJcGluX3JlZyA9ICZpbmZvLT5waW5fcmVnc1tvZmZzZXRdOwogCWlmIChwaW5fcmVnLT5tdXhfcmVnID09IC0xKQpAQCAtMzgwLDcgKzM4MCw3IEBACiAJICogVGhleSBhcmUgcGFydCBvZiB0aGUgc2hhcmVkIG11eC9jb25mIHJlZ2lzdGVyLgogCSAqLwogCWlmICghKGluZm8tPmZsYWdzICYgU0hBUkVfTVVYX0NPTkZfUkVHKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCiAJcGluX3JlZyA9ICZpbmZvLT5waW5fcmVnc1tvZmZzZXRdOwogCWlmIChwaW5fcmVnLT5tdXhfcmVnID09IC0xKQpAQCAtNTAxLDcgKzUwMSw3IEBACiAJCXJldCA9IGlteF9waW5jb25mX2dldChwY3RsZGV2LCBwaW4tPnBpbiwgJmNvbmZpZyk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm47Ci0JCXNlcV9wcmludGYocywgIiVzOiAweCVseCIsIG5hbWUsIGNvbmZpZyk7CisJCXNlcV9wcmludGYocywgIiAgJXM6IDB4JWx4XG4iLCBuYW1lLCBjb25maWcpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtY2hlcnJ5dmlldy5jIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtY2hlcnJ5dmlldy5jCmluZGV4IDU3NDlhNGVlLi4zMDM4OWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1jaGVycnl2aWV3LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtY2hlcnJ5dmlldy5jCkBAIC0xMzQsNiArMTM0LDcgQEAKICAqIEBncGlvX3JhbmdlczogQW4gYXJyYXkgb2YgR1BJTyByYW5nZXMgaW4gdGhpcyBjb21tdW5pdHkKICAqIEBuZ3Bpb19yYW5nZXM6IE51bWJlciBvZiBHUElPIHJhbmdlcwogICogQG5ncGlvczogVG90YWwgbnVtYmVyIG9mIEdQSU9zIGluIHRoaXMgY29tbXVuaXR5CisgKiBAbmlycXM6IFRvdGFsIG51bWJlciBvZiBJUlFzIHRoaXMgY29tbXVuaXR5IGNhbiBnZW5lcmF0ZQogICovCiBzdHJ1Y3QgY2h2X2NvbW11bml0eSB7CiAJY29uc3QgY2hhciAqdWlkOwpAQCAtMTQ2LDYgKzE0Nyw3IEBACiAJY29uc3Qgc3RydWN0IGNodl9ncGlvX3BpbnJhbmdlICpncGlvX3JhbmdlczsKIAlzaXplX3QgbmdwaW9fcmFuZ2VzOwogCXNpemVfdCBuZ3Bpb3M7CisJc2l6ZV90IG5pcnFzOwogfTsKIAogc3RydWN0IGNodl9waW5fY29udGV4dCB7CkBAIC0zOTYsNiArMzk4LDEyIEBACiAJLmdwaW9fcmFuZ2VzID0gc291dGh3ZXN0X2dwaW9fcmFuZ2VzLAogCS5uZ3Bpb19yYW5nZXMgPSBBUlJBWV9TSVpFKHNvdXRod2VzdF9ncGlvX3JhbmdlcyksCiAJLm5ncGlvcyA9IEFSUkFZX1NJWkUoc291dGh3ZXN0X3BpbnMpLAorCS8qCisJICogU291dGh3ZXN0IGNvbW11bml0eSBjYW4gYmVuZXJhdGUgR1BJTyBpbnRlcnJ1cHRzIG9ubHkgZm9yIHRoZQorCSAqIGZpcnN0IDggaW50ZXJydXB0cy4gVGhlIHVwcGVyIGhhbGYgKDgtMTUpIGNhbiBvbmx5IGJlIHVzZWQgdG8KKwkgKiB0cmlnZ2VyIEdQRXMuCisJICovCisJLm5pcnFzID0gOCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyBub3J0aF9waW5zW10gPSB7CkBAIC00NzksNiArNDg3LDEyIEBACiAJLmdwaW9fcmFuZ2VzID0gbm9ydGhfZ3Bpb19yYW5nZXMsCiAJLm5ncGlvX3JhbmdlcyA9IEFSUkFZX1NJWkUobm9ydGhfZ3Bpb19yYW5nZXMpLAogCS5uZ3Bpb3MgPSBBUlJBWV9TSVpFKG5vcnRoX3BpbnMpLAorCS8qCisJICogTm9ydGggY29tbXVuaXR5IGNhbiBiZW5lcmF0ZSBHUElPIGludGVycnVwdHMgb25seSBmb3IgdGhlIGZpcnN0CisJICogOCBpbnRlcnJ1cHRzLiBUaGUgdXBwZXIgaGFsZiAoOC0xNSkgY2FuIG9ubHkgYmUgdXNlZCB0byB0cmlnZ2VyCisJICogR1BFcy4KKwkgKi8KKwkubmlycXMgPSA4LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIGVhc3RfcGluc1tdID0gewpAQCAtNTIxLDYgKzUzNSw3IEBACiAJLmdwaW9fcmFuZ2VzID0gZWFzdF9ncGlvX3JhbmdlcywKIAkubmdwaW9fcmFuZ2VzID0gQVJSQVlfU0laRShlYXN0X2dwaW9fcmFuZ2VzKSwKIAkubmdwaW9zID0gQVJSQVlfU0laRShlYXN0X3BpbnMpLAorCS5uaXJxcyA9IDE2LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIHNvdXRoZWFzdF9waW5zW10gPSB7CkBAIC02NDYsNiArNjYxLDcgQEAKIAkuZ3Bpb19yYW5nZXMgPSBzb3V0aGVhc3RfZ3Bpb19yYW5nZXMsCiAJLm5ncGlvX3JhbmdlcyA9IEFSUkFZX1NJWkUoc291dGhlYXN0X2dwaW9fcmFuZ2VzKSwKIAkubmdwaW9zID0gQVJSQVlfU0laRShzb3V0aGVhc3RfcGlucyksCisJLm5pcnFzID0gMTYsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNodl9jb21tdW5pdHkgKmNodl9jb21tdW5pdGllc1tdID0gewpAQCAtMTQ5Nyw3ICsxNTEzLDcgQEAKIAljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKIAogCXBlbmRpbmcgPSByZWFkbChwY3RybC0+cmVncyArIENIVl9JTlRTVEFUKTsKLQlmb3JfZWFjaF9zZXRfYml0KGludHJfbGluZSwgJnBlbmRpbmcsIDE2KSB7CisJZm9yX2VhY2hfc2V0X2JpdChpbnRyX2xpbmUsICZwZW5kaW5nLCBwY3RybC0+Y29tbXVuaXR5LT5uaXJxcykgewogCQl1bnNpZ25lZCBpcnEsIG9mZnNldDsKIAogCQlvZmZzZXQgPSBwY3RybC0+aW50cl9saW5lc1tpbnRyX2xpbmVdOwpAQCAtMTUyMCw4ICsxNTM2LDkgQEAKIAljaGlwLT5sYWJlbCA9IGRldl9uYW1lKHBjdHJsLT5kZXYpOwogCWNoaXAtPnBhcmVudCA9IHBjdHJsLT5kZXY7CiAJY2hpcC0+YmFzZSA9IC0xOworCWNoaXAtPmlycV9uZWVkX3ZhbGlkX21hc2sgPSB0cnVlOwogCi0JcmV0ID0gZ3Bpb2NoaXBfYWRkX2RhdGEoY2hpcCwgcGN0cmwpOworCXJldCA9IGRldm1fZ3Bpb2NoaXBfYWRkX2RhdGEocGN0cmwtPmRldiwgY2hpcCwgcGN0cmwpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihwY3RybC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGdwaW9jaGlwXG4iKTsKIAkJcmV0dXJuIHJldDsKQEAgLTE1MzMsMzEgKzE1NTAsNDAgQEAKIAkJCQkJICAgICByYW5nZS0+YmFzZSwgcmFuZ2UtPm5waW5zKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycihwY3RybC0+ZGV2LCAiZmFpbGVkIHRvIGFkZCBHUElPIHBpbiByYW5nZVxuIik7Ci0JCQlnb3RvIGZhaWw7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAKIAkJb2Zmc2V0ICs9IHJhbmdlLT5ucGluczsKIAl9CiAKLQkvKiBNYXNrIGFuZCBjbGVhciBhbGwgaW50ZXJydXB0cyAqLwotCWNodl93cml0ZWwoMCwgcGN0cmwtPnJlZ3MgKyBDSFZfSU5UTUFTSyk7CisJLyogRG8gbm90IGFkZCBHUElPcyB0aGF0IGNhbiBvbmx5IGdlbmVyYXRlIEdQRXMgdG8gdGhlIElSUSBkb21haW4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGN0cmwtPmNvbW11bml0eS0+bnBpbnM7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAqZGVzYzsKKwkJdTMyIGludHNlbDsKKworCQlkZXNjID0gJnBjdHJsLT5jb21tdW5pdHktPnBpbnNbaV07CisKKwkJaW50c2VsID0gcmVhZGwoY2h2X3BhZHJlZyhwY3RybCwgZGVzYy0+bnVtYmVyLCBDSFZfUEFEQ1RSTDApKTsKKwkJaW50c2VsICY9IENIVl9QQURDVFJMMF9JTlRTRUxfTUFTSzsKKwkJaW50c2VsID4+PSBDSFZfUEFEQ1RSTDBfSU5UU0VMX1NISUZUOworCisJCWlmIChpbnRzZWwgPj0gcGN0cmwtPmNvbW11bml0eS0+bmlycXMpCisJCQljbGVhcl9iaXQoaSwgY2hpcC0+aXJxX3ZhbGlkX21hc2spOworCX0KKworCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHRzICovCiAJY2h2X3dyaXRlbCgweGZmZmYsIHBjdHJsLT5yZWdzICsgQ0hWX0lOVFNUQVQpOwogCiAJcmV0ID0gZ3Bpb2NoaXBfaXJxY2hpcF9hZGQoY2hpcCwgJmNodl9ncGlvX2lycWNoaXAsIDAsCi0JCQkJICAgaGFuZGxlX3NpbXBsZV9pcnEsIElSUV9UWVBFX05PTkUpOworCQkJCSAgIGhhbmRsZV9iYWRfaXJxLCBJUlFfVFlQRV9OT05FKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIocGN0cmwtPmRldiwgImZhaWxlZCB0byBhZGQgSVJRIGNoaXBcbiIpOwotCQlnb3RvIGZhaWw7CisJCXJldHVybiByZXQ7CiAJfQogCiAJZ3Bpb2NoaXBfc2V0X2NoYWluZWRfaXJxY2hpcChjaGlwLCAmY2h2X2dwaW9faXJxY2hpcCwgaXJxLAogCQkJCSAgICAgY2h2X2dwaW9faXJxX2hhbmRsZXIpOwogCXJldHVybiAwOwotCi1mYWlsOgotCWdwaW9jaGlwX3JlbW92ZShjaGlwKTsKLQotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgY2h2X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTE2MjUsMTUgKzE2NTEsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNodl9waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBjaHZfcGluY3RybCAqcGN0cmwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWdwaW9jaGlwX3JlbW92ZSgmcGN0cmwtPmNoaXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KICNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBpbnQgY2h2X3BpbmN0cmxfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0xNzMwLDcgKzE3NDcsNiBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBjaHZfcGluY3RybF9kcml2ZXIgPSB7CiAJLnByb2JlID0gY2h2X3BpbmN0cmxfcHJvYmUsCi0JLnJlbW92ZSA9IGNodl9waW5jdHJsX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJjaGVycnl2aWV3LXBpbmN0cmwiLAogCQkucG0gPSAmY2h2X3BpbmN0cmxfcG1fb3BzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtaW50ZWwuYyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLWludGVsLmMKaW5kZXggMjU3Y2FiMS4uNjMzODdhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtaW50ZWwuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1pbnRlbC5jCkBAIC04Niw2ICs4Niw3IEBACiAgKiBAY29tbXVuaXRpZXM6IEFsbCBjb21tdW5pdGllcyBpbiB0aGlzIHBpbiBjb250cm9sbGVyCiAgKiBAbmNvbW11bml0aWVzOiBOdW1iZXIgb2YgY29tbXVuaXRpZXMgaW4gdGhpcyBwaW4gY29udHJvbGxlcgogICogQGNvbnRleHQ6IENvbmZpZ3VyYXRpb24gc2F2ZWQgb3ZlciBzeXN0ZW0gc2xlZXAKKyAqIEBpcnE6IHBpbmN0cmwvR1BJTyBjaGlwIGlycSBudW1iZXIKICAqLwogc3RydWN0IGludGVsX3BpbmN0cmwgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKQEAgLTk3LDYgKzk4LDcgQEAKIAlzdHJ1Y3QgaW50ZWxfY29tbXVuaXR5ICpjb21tdW5pdGllczsKIAlzaXplX3QgbmNvbW11bml0aWVzOwogCXN0cnVjdCBpbnRlbF9waW5jdHJsX2NvbnRleHQgY29udGV4dDsKKwlpbnQgaXJxOwogfTsKIAogI2RlZmluZSBwaW5fdG9fcGFkbm8oYywgcCkJKChwKSAtIChjKS0+cGluX2Jhc2UpCkBAIC03OTMsMzggKzc5NSwxMiBAQAogewogCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CiAJc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoZ2MpOwotCWNvbnN0IHN0cnVjdCBpbnRlbF9jb21tdW5pdHkgKmNvbW11bml0eTsKIAl1bnNpZ25lZCBwaW4gPSBpcnFkX3RvX2h3aXJxKGQpOwotCXVuc2lnbmVkIHBhZG5vLCBncHAsIGdwcF9vZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgZ3BlX2VuOwogCi0JY29tbXVuaXR5ID0gaW50ZWxfZ2V0X2NvbW11bml0eShwY3RybCwgcGluKTsKLQlpZiAoIWNvbW11bml0eSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7Ci0KLQlwYWRubyA9IHBpbl90b19wYWRubyhjb21tdW5pdHksIHBpbik7Ci0JZ3BwID0gcGFkbm8gLyBjb21tdW5pdHktPmdwcF9zaXplOwotCWdwcF9vZmZzZXQgPSBwYWRubyAlIGNvbW11bml0eS0+Z3BwX3NpemU7Ci0KLQkvKiBDbGVhciB0aGUgZXhpc3Rpbmcgd2FrZSBzdGF0dXMgKi8KLQl3cml0ZWwoQklUKGdwcF9vZmZzZXQpLCBjb21tdW5pdHktPnJlZ3MgKyBHUElfR1BFX1NUUyArIGdwcCAqIDQpOwotCi0JLyoKLQkgKiBUaGUgY29udHJvbGxlciB3aWxsIGdlbmVyYXRlIHdha2Ugd2hlbiBHUEUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBwYWQgaXMgZW5hYmxlZCBhbmQgaXQgaXMgbm90IHJvdXRlZCB0byBTQ0kgKEdQSVJPVVRTQ0kgaXMgbm90Ci0JICogc2V0KS4KLQkgKi8KLQlncGVfZW4gPSByZWFkbChjb21tdW5pdHktPnJlZ3MgKyBHUElfR1BFX0VOICsgZ3BwICogNCk7CiAJaWYgKG9uKQotCQlncGVfZW4gfD0gQklUKGdwcF9vZmZzZXQpOworCQllbmFibGVfaXJxX3dha2UocGN0cmwtPmlycSk7CiAJZWxzZQotCQlncGVfZW4gJj0gfkJJVChncHBfb2Zmc2V0KTsKLQl3cml0ZWwoZ3BlX2VuLCBjb21tdW5pdHktPnJlZ3MgKyBHUElfR1BFX0VOICsgZ3BwICogNCk7Ci0KLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKKwkJZGlzYWJsZV9pcnFfd2FrZShwY3RybC0+aXJxKTsKIAogCWRldl9kYmcocGN0cmwtPmRldiwgIiVzYWJsZSB3YWtlIGZvciBwaW4gJXVcbiIsIG9uID8gImVuIiA6ICJkaXMiLCBwaW4pOwogCXJldHVybiAwOwpAQCAtOTA1LDYgKzg4MSw3IEBACiAJcGN0cmwtPmNoaXAubGFiZWwgPSBkZXZfbmFtZShwY3RybC0+ZGV2KTsKIAlwY3RybC0+Y2hpcC5wYXJlbnQgPSBwY3RybC0+ZGV2OwogCXBjdHJsLT5jaGlwLmJhc2UgPSAtMTsKKwlwY3RybC0+aXJxID0gaXJxOwogCiAJcmV0ID0gZ3Bpb2NoaXBfYWRkX2RhdGEoJnBjdHJsLT5jaGlwLCBwY3RybCk7CiAJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtbWVycmlmaWVsZC5jIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtbWVycmlmaWVsZC5jCmluZGV4IDdmYjc2NTYuLjc4MjZjN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLW1lcnJpZmllbGQuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1tZXJyaWZpZWxkLmMKQEAgLTg1NCw3ICs4NTQsNyBAQAogCSAqLwogCW5mYW1pbGllcyA9IEFSUkFZX1NJWkUobXJmbGRfZmFtaWxpZXMpLAogCWZhbWlsaWVzID0gZGV2bV9rbWVtZHVwKCZwZGV2LT5kZXYsIG1yZmxkX2ZhbWlsaWVzLAotCQkJCQkgICAgbmZhbWlsaWVzICogc2l6ZW9mKG1yZmxkX2ZhbWlsaWVzKSwKKwkJCQkJICAgIHNpemVvZihtcmZsZF9mYW1pbGllcyksCiAJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAlpZiAoIWZhbWlsaWVzKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9waW5jdHJsLW10ay1jb21tb24uYyBiL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9waW5jdHJsLW10ay1jb21tb24uYwppbmRleCBjZTU1NGUwLi5mOWFlZjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvcGluY3RybC1tdGstY29tbW9uLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL3BpbmN0cmwtbXRrLWNvbW1vbi5jCkBAIC0xNSw3ICsxNSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8vZHJpdmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CkBAIC0xMDU1LDcgKzEwNTQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBtdGtfZ3Bpb19jaGlwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgbXRrX2dwaW9fY2hpcCA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5yZXF1ZXN0CQk9IGdwaW9jaGlwX2dlbmVyaWNfcmVxdWVzdCwKIAkuZnJlZQkJCT0gZ3Bpb2NoaXBfZ2VuZXJpY19mcmVlLApAQCAtMTQ5Niw3ICsxNDk1LDMgQEAKIAlncGlvY2hpcF9yZW1vdmUocGN0bC0+Y2hpcCk7CiAJcmV0dXJuIHJldDsKIH0KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNZWRpYVRlayBQaW5jdHJsIERyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiSG9uZ3pob3UgWWFuZyA8aG9uZ3pob3UueWFuZ0BtZWRpYXRlay5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi1neGJiLmMgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi1neGJiLmMKaW5kZXggY2I0ZDZhZC4uYzM5MjhhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24tZ3hiYi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLWd4YmIuYwpAQCAtMTU2LDYgKzE1NiwxMSBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBlbW1jX2NtZF9waW5zW10gPSB7IFBJTihCT09UXzEwLCBFRV9PRkYpIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVtbWNfZHNfcGluc1tdID0geyBQSU4oQk9PVF8xNSwgRUVfT0ZGKSB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5vcl9kX3BpbnNbXQkJPSB7IFBJTihCT09UXzExLCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5vcl9xX3BpbnNbXQkJPSB7IFBJTihCT09UXzEyLCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5vcl9jX3BpbnNbXQkJPSB7IFBJTihCT09UXzEzLCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5vcl9jc19waW5zW10JCT0geyBQSU4oQk9PVF8xNSwgRUVfT0ZGKSB9OworCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkY2FyZF9kMF9waW5zW10gPSB7IFBJTihDQVJEXzEsIEVFX09GRikgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RjYXJkX2QxX3BpbnNbXSA9IHsgUElOKENBUkRfMCwgRUVfT0ZGKSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGNhcmRfZDJfcGluc1tdID0geyBQSU4oQ0FSRF81LCBFRV9PRkYpIH07CkBAIC0xNjMsNiArMTY4LDIzIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkY2FyZF9jbWRfcGluc1tdID0geyBQSU4oQ0FSRF8zLCBFRV9PRkYpIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkY2FyZF9jbGtfcGluc1tdID0geyBQSU4oQ0FSRF8yLCBFRV9PRkYpIH07CiAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2Rpb19kMF9waW5zW10gPSB7IFBJTihHUElPWF8wLCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW9fZDFfcGluc1tdID0geyBQSU4oR1BJT1hfMSwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvX2QyX3BpbnNbXSA9IHsgUElOKEdQSU9YXzIsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2Rpb19kM19waW5zW10gPSB7IFBJTihHUElPWF8zLCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkaW9fY21kX3BpbnNbXSA9IHsgUElOKEdQSU9YXzQsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2Rpb19jbGtfcGluc1tdID0geyBQSU4oR1BJT1hfNSwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZGlvX2lycV9waW5zW10gPSB7IFBJTihHUElPWF83LCBFRV9PRkYpIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9jZTBfcGluc1tdCT0geyBQSU4oQk9PVF84LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfY2UxX3BpbnNbXQk9IHsgUElOKEJPT1RfOSwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX3JiMF9waW5zW10JPSB7IFBJTihCT09UXzEwLCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfYWxlX3BpbnNbXQk9IHsgUElOKEJPT1RfMTEsIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9jbGVfcGluc1tdCT0geyBQSU4oQk9PVF8xMiwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX3dlbl9jbGtfcGluc1tdCT0geyBQSU4oQk9PVF8xMywgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX3Jlbl93cl9waW5zW10JPSB7IFBJTihCT09UXzE0LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfZHFzX3BpbnNbXQk9IHsgUElOKEJPT1RfMTUsIEVFX09GRikgfTsKKwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3R4X2FfcGluc1tdCT0geyBQSU4oR1BJT1hfMTIsIEVFX09GRikgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9yeF9hX3BpbnNbXQk9IHsgUElOKEdQSU9YXzEzLCBFRV9PRkYpIH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfY3RzX2FfcGluc1tdCT0geyBQSU4oR1BJT1hfMTQsIEVFX09GRikgfTsKQEAgLTE3OCw2ICsyMDAsMTUgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9jdHNfY19waW5zW10JPSB7IFBJTihHUElPWF8xMSwgRUVfT0ZGKSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J0c19jX3BpbnNbXQk9IHsgUElOKEdQSU9YXzEyLCBFRV9PRkYpIH07CiAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3Nja19hX3BpbnNbXQk9IHsgUElOKEdQSU9EVl8yNSwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2FfcGluc1tdCT0geyBQSU4oR1BJT0RWXzI0LCBFRV9PRkYpIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3Nja19iX3BpbnNbXQk9IHsgUElOKEdQSU9EVl8yNywgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2JfcGluc1tdCT0geyBQSU4oR1BJT0RWXzI2LCBFRV9PRkYpIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3Nja19jX3BpbnNbXQk9IHsgUElOKEdQSU9EVl8yOSwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2NfcGluc1tdCT0geyBQSU4oR1BJT0RWXzI4LCBFRV9PRkYpIH07CisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX21kaW9fcGluc1tdCT0geyBQSU4oR1BJT1pfMCwgRUVfT0ZGKSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfbWRjX3BpbnNbXQk9IHsgUElOKEdQSU9aXzEsIEVFX09GRikgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX2Nsa19yeF9jbGtfcGluc1tdCT0geyBQSU4oR1BJT1pfMiwgRUVfT0ZGKSB9OwpAQCAtMTkzLDYgKzIyNCwxNCBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfdHhkMl9waW5zW10JPSB7IFBJTihHUElPWl8xMiwgRUVfT0ZGKSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfdHhkM19waW5zW10JPSB7IFBJTihHUElPWl8xMywgRUVfT0ZGKSB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9hX3hfcGluc1tdCT0geyBQSU4oR1BJT1hfNiwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fYV95X3BpbnNbXQk9IHsgUElOKEdQSU9ZXzE2LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9iX3BpbnNbXQkJPSB7IFBJTihHUElPRFZfMjksIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2RfcGluc1tdCQk9IHsgUElOKEdQSU9EVl8yOCwgRUVfT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fZV9waW5zW10JCT0geyBQSU4oR1BJT1hfMTksIEVFX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2ZfeF9waW5zW10JPSB7IFBJTihHUElPWF83LCBFRV9PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9mX3lfcGluc1tdCT0geyBQSU4oR1BJT1lfMTUsIEVFX09GRikgfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIG1lc29uX2d4YmJfYW9idXNfcGluc1tdID0gewogCU1FU09OX1BJTihHUElPQU9fMCwgMCksCiAJTUVTT05fUElOKEdQSU9BT18xLCAwKSwKQEAgLTIyNSw2ICsyNjQsMTMgQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NsYXZlX3Nja19hb19waW5zW10gPSB7UElOKEdQSU9BT180LCAwKSB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2xhdmVfc2RhX2FvX3BpbnNbXSA9IHtQSU4oR1BJT0FPXzUsIDApIH07CiAKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcmVtb3RlX2lucHV0X2FvX3BpbnNbXSA9IHtQSU4oR1BJT0FPXzcsIDApIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2FvX2FfM19waW5zW10JPSB7IFBJTihHUElPQU9fMywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2FvX2FfNl9waW5zW10JPSB7IFBJTihHUElPQU9fNiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2FvX2FfMTJfcGluc1tdCT0geyBQSU4oR1BJT0FPXzEyLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fYW9fYl9waW5zW10JPSB7IFBJTihHUElPQU9fMTMsIDApIH07CisKIHN0YXRpYyBzdHJ1Y3QgbWVzb25fcG14X2dyb3VwIG1lc29uX2d4YmJfcGVyaXBoc19ncm91cHNbXSA9IHsKIAlHUElPX0dST1VQKEdQSU9aXzAsIEVFX09GRiksCiAJR1BJT19HUk9VUChHUElPWl8xLCBFRV9PRkYpLApAQCAtMzU1LDE2ICs0MDEsMjggQEAKIAlHUElPX0dST1VQKEdQSU9fVEVTVF9OLCBFRV9PRkYpLAogCiAJLyogQmFuayBYICovCisJR1JPVVAoc2Rpb19kMCwJCTgsCTUpLAorCUdST1VQKHNkaW9fZDEsCQk4LAk0KSwKKwlHUk9VUChzZGlvX2QyLAkJOCwJMyksCisJR1JPVVAoc2Rpb19kMywJCTgsCTIpLAorCUdST1VQKHNkaW9fY21kLAkJOCwJMSksCisJR1JPVVAoc2Rpb19jbGssCQk4LAkwKSwKKwlHUk9VUChzZGlvX2lycSwJCTgsCTExKSwKIAlHUk9VUCh1YXJ0X3R4X2EsCTQsCTEzKSwKIAlHUk9VUCh1YXJ0X3J4X2EsCTQsCTEyKSwKIAlHUk9VUCh1YXJ0X2N0c19hLAk0LAkxMSksCiAJR1JPVVAodWFydF9ydHNfYSwJNCwJMTApLAorCUdST1VQKHB3bV9hX3gsCQkzLAkxNyksCisJR1JPVVAocHdtX2UsCQkyLAkzMCksCisJR1JPVVAocHdtX2ZfeCwJCTMsCTE4KSwKIAogCS8qIEJhbmsgWSAqLwogCUdST1VQKHVhcnRfY3RzX2MsCTEsCTE5KSwKIAlHUk9VUCh1YXJ0X3J0c19jLAkxLAkxOCksCiAJR1JPVVAodWFydF90eF9jLAkxLAkxNyksCiAJR1JPVVAodWFydF9yeF9jLAkxLAkxNiksCisJR1JPVVAocHdtX2FfeSwJCTEsCTIxKSwKKwlHUk9VUChwd21fZl95LAkJMSwJMjApLAogCiAJLyogQmFuayBaICovCiAJR1JPVVAoZXRoX21kaW8sCQk2LAkxKSwKQEAgLTM4NywxMiArNDQ1LDMyIEBACiAJR1JPVVAodWFydF9yeF9iLAkyLAkyOCksCiAJR1JPVVAodWFydF9jdHNfYiwJMiwJMjcpLAogCUdST1VQKHVhcnRfcnRzX2IsCTIsCTI2KSwKKwlHUk9VUChwd21fYiwJCTMsCTIxKSwKKwlHUk9VUChwd21fZCwJCTMsCTIwKSwKKwlHUk9VUChpMmNfc2NrX2EsCTcsCTI3KSwKKwlHUk9VUChpMmNfc2RhX2EsCTcsCTI2KSwKKwlHUk9VUChpMmNfc2NrX2IsCTcsCTI1KSwKKwlHUk9VUChpMmNfc2RhX2IsCTcsCTI0KSwKKwlHUk9VUChpMmNfc2NrX2MsCTcsCTIzKSwKKwlHUk9VUChpMmNfc2RhX2MsCTcsCTIyKSwKIAogCS8qIEJhbmsgQk9PVCAqLwogCUdST1VQKGVtbWNfbmFuZF9kMDcsCTQsCTMwKSwKIAlHUk9VUChlbW1jX2NsaywJCTQsCTE4KSwKIAlHUk9VUChlbW1jX2NtZCwJCTQsCTE5KSwKIAlHUk9VUChlbW1jX2RzLAkJNCwJMzEpLAorCUdST1VQKG5vcl9kLAkJNSwJMSksCisJR1JPVVAobm9yX3EsCQk1LAkzKSwKKwlHUk9VUChub3JfYywJCTUsCTIpLAorCUdST1VQKG5vcl9jcywJCTUsCTApLAorCUdST1VQKG5hbmRfY2UwLAkJNCwJMjYpLAorCUdST1VQKG5hbmRfY2UxLAkJNCwJMjcpLAorCUdST1VQKG5hbmRfcmIwLAkJNCwJMjUpLAorCUdST1VQKG5hbmRfYWxlLAkJNCwJMjQpLAorCUdST1VQKG5hbmRfY2xlLAkJNCwJMjMpLAorCUdST1VQKG5hbmRfd2VuX2NsaywJNCwJMjIpLAorCUdST1VQKG5hbmRfcmVuX3dyLAk0LAkyMSksCisJR1JPVVAobmFuZF9kcXMsCQk0LAkyMCksCiAKIAkvKiBCYW5rIENBUkQgKi8KIAlHUk9VUChzZGNhcmRfZDEsCTIsCTE0KSwKQEAgLTQzMiw2ICs1MTAsMTEgQEAKIAlHUk9VUChpMmNfc2RhX2FvLAkwLAk1KSwKIAlHUk9VUChpMmNfc2xhdmVfc2NrX2FvLCAwLAkyKSwKIAlHUk9VUChpMmNfc2xhdmVfc2RhX2FvLCAwLAkxKSwKKwlHUk9VUChyZW1vdGVfaW5wdXRfYW8sCTAsCTApLAorCUdST1VQKHB3bV9hb19hXzMsCTAsCTIyKSwKKwlHUk9VUChwd21fYW9fYV82LAkwLAkxOCksCisJR1JPVVAocHdtX2FvX2FfMTIsCTAsCTE3KSwKKwlHUk9VUChwd21fYW9fYiwJCTAsCTMpLAogfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBncGlvX3BlcmlwaHNfZ3JvdXBzW10gPSB7CkBAIC00NzUsMTEgKzU1OCwyNSBAQAogCSJlbW1jX25hbmRfZDA3IiwgImVtbWNfY2xrIiwgImVtbWNfY21kIiwgImVtbWNfZHMiLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBub3JfZ3JvdXBzW10gPSB7CisJIm5vcl9kIiwgIm5vcl9xIiwgIm5vcl9jIiwgIm5vcl9jcyIsCit9OworCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkY2FyZF9ncm91cHNbXSA9IHsKIAkic2RjYXJkX2QwIiwgInNkY2FyZF9kMSIsICJzZGNhcmRfZDIiLCAic2RjYXJkX2QzIiwKIAkic2RjYXJkX2NtZCIsICJzZGNhcmRfY2xrIiwKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2Rpb19ncm91cHNbXSA9IHsKKwkic2Rpb19kMCIsICJzZGlvX2QxIiwgInNkaW9fZDIiLCAic2Rpb19kMyIsCisJInNkaW9fY21kIiwgInNkaW9fY2xrIiwgInNkaW9faXJxIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFuZF9ncm91cHNbXSA9IHsKKwkibmFuZF9jZTAiLCAibmFuZF9jZTEiLCAibmFuZF9yYjAiLCAibmFuZF9hbGUiLCAibmFuZF9jbGUiLAorCSJuYW5kX3dlbl9jbGsiLCAibmFuZF9yZW5fd3IiLCAibmFuZF9kcXMiLAorfTsKKwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0X2FfZ3JvdXBzW10gPSB7CiAJInVhcnRfdHhfYSIsICJ1YXJ0X3J4X2EiLCAidWFydF9jdHNfYSIsICJ1YXJ0X3J0c19hIiwKIH07CkBAIC00OTIsNiArNTg5LDE4IEBACiAJInVhcnRfdHhfYyIsICJ1YXJ0X3J4X2MiLCAidWFydF9jdHNfYyIsICJ1YXJ0X3J0c19jIiwKIH07CiAKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJjX2FfZ3JvdXBzW10gPSB7CisJImkyY19zY2tfYSIsICJpMmNfc2RhX2EiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNfYl9ncm91cHNbXSA9IHsKKwkiaTJjX3Nja19iIiwgImkyY19zZGFfYiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyY19jX2dyb3Vwc1tdID0geworCSJpMmNfc2NrX2MiLCAiaTJjX3NkYV9jIiwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZXRoX2dyb3Vwc1tdID0gewogCSJldGhfbWRpbyIsICJldGhfbWRjIiwgImV0aF9jbGtfcnhfY2xrIiwgImV0aF9yeF9kdiIsCiAJImV0aF9yeGQwIiwgImV0aF9yeGQxIiwgImV0aF9yeGQyIiwgImV0aF9yeGQzIiwKQEAgLTQ5OSw2ICs2MDgsMzQgQEAKIAkiZXRoX3R4ZDAiLCAiZXRoX3R4ZDEiLCAiZXRoX3R4ZDIiLCAiZXRoX3R4ZDMiLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fYV94X2dyb3Vwc1tdID0geworCSJwd21fYV94IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2FfeV9ncm91cHNbXSA9IHsKKwkicHdtX2FfeSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9iX2dyb3Vwc1tdID0geworCSJwd21fYiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9kX2dyb3Vwc1tdID0geworCSJwd21fZCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9lX2dyb3Vwc1tdID0geworCSJwd21fZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9mX3hfZ3JvdXBzW10gPSB7CisJInB3bV9mX3giLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fZl95X2dyb3Vwc1tdID0geworCSJwd21fZl95IiwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZ3Bpb19hb2J1c19ncm91cHNbXSA9IHsKIAkiR1BJT0FPXzAiLCAiR1BJT0FPXzEiLCAiR1BJT0FPXzIiLCAiR1BJT0FPXzMiLCAiR1BJT0FPXzQiLAogCSJHUElPQU9fNSIsICJHUElPQU9fNiIsICJHUElPQU9fNyIsICJHUElPQU9fOCIsICJHUElPQU9fOSIsCkBAIC01MjEsMTQgKzY1OCw0NyBAQAogCSJpMmNfc2xhdmVfc2RrX2FvIiwgImkyY19zbGF2ZV9zZGFfYW8iLAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByZW1vdGVfaW5wdXRfYW9fZ3JvdXBzW10gPSB7CisJInJlbW90ZV9pbnB1dF9hbyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9hb19hXzNfZ3JvdXBzW10gPSB7CisJInB3bV9hb19hXzMiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fYW9fYV82X2dyb3Vwc1tdID0geworCSJwd21fYW9fYV82IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2FvX2FfMTJfZ3JvdXBzW10gPSB7CisJInB3bV9hb19hXzEyIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2FvX2JfZ3JvdXBzW10gPSB7CisJInB3bV9hb19iIiwKK307CisKIHN0YXRpYyBzdHJ1Y3QgbWVzb25fcG14X2Z1bmMgbWVzb25fZ3hiYl9wZXJpcGhzX2Z1bmN0aW9uc1tdID0gewogCUZVTkNUSU9OKGdwaW9fcGVyaXBocyksCiAJRlVOQ1RJT04oZW1tYyksCisJRlVOQ1RJT04obm9yKSwKIAlGVU5DVElPTihzZGNhcmQpLAorCUZVTkNUSU9OKHNkaW8pLAorCUZVTkNUSU9OKG5hbmQpLAogCUZVTkNUSU9OKHVhcnRfYSksCiAJRlVOQ1RJT04odWFydF9iKSwKIAlGVU5DVElPTih1YXJ0X2MpLAorCUZVTkNUSU9OKGkyY19hKSwKKwlGVU5DVElPTihpMmNfYiksCisJRlVOQ1RJT04oaTJjX2MpLAogCUZVTkNUSU9OKGV0aCksCisJRlVOQ1RJT04ocHdtX2FfeCksCisJRlVOQ1RJT04ocHdtX2FfeSksCisJRlVOQ1RJT04ocHdtX2IpLAorCUZVTkNUSU9OKHB3bV9kKSwKKwlGVU5DVElPTihwd21fZSksCisJRlVOQ1RJT04ocHdtX2ZfeCksCisJRlVOQ1RJT04ocHdtX2ZfeSksCiB9OwogCiBzdGF0aWMgc3RydWN0IG1lc29uX3BteF9mdW5jIG1lc29uX2d4YmJfYW9idXNfZnVuY3Rpb25zW10gPSB7CkBAIC01MzcsNiArNzA3LDExIEBACiAJRlVOQ1RJT04odWFydF9hb19iKSwKIAlGVU5DVElPTihpMmNfYW8pLAogCUZVTkNUSU9OKGkyY19zbGF2ZV9hbyksCisJRlVOQ1RJT04ocmVtb3RlX2lucHV0X2FvKSwKKwlGVU5DVElPTihwd21fYW9fYV8zKSwKKwlGVU5DVElPTihwd21fYW9fYV82KSwKKwlGVU5DVElPTihwd21fYW9fYV8xMiksCisJRlVOQ1RJT04ocHdtX2FvX2IpLAogfTsKIAogc3RhdGljIHN0cnVjdCBtZXNvbl9iYW5rIG1lc29uX2d4YmJfcGVyaXBoc19iYW5rc1tdID0gewpAQCAtNTU2LDM4ICs3MzEsMjggQEAKIAlCQU5LKCJBTyIsICAgUElOKEdQSU9BT18wLCAwKSwgIFBJTihHUElPQU9fMTMsIDApLCAwLCAgMCwgIDAsIDE2LCAgMCwgIDAsICAwLCAxNiwgIDEsICAwKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbWVzb25fZG9tYWluX2RhdGEgbWVzb25fZ3hiYl9wZXJpcGhzX2RvbWFpbl9kYXRhID0gewotCS5uYW1lCQk9ICJwZXJpcGhzLWJhbmtzIiwKLQkuYmFua3MJCT0gbWVzb25fZ3hiYl9wZXJpcGhzX2JhbmtzLAotCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uX2d4YmJfcGVyaXBoc19iYW5rcyksCi0JLnBpbl9iYXNlCT0gMTQsCi0JLm51bV9waW5zCT0gMTIwLAotfTsKLQotc3RhdGljIHN0cnVjdCBtZXNvbl9kb21haW5fZGF0YSBtZXNvbl9neGJiX2FvYnVzX2RvbWFpbl9kYXRhID0gewotCS5uYW1lCQk9ICJhb2J1cy1iYW5rcyIsCi0JLmJhbmtzCQk9IG1lc29uX2d4YmJfYW9idXNfYmFua3MsCi0JLm51bV9iYW5rcwk9IEFSUkFZX1NJWkUobWVzb25fZ3hiYl9hb2J1c19iYW5rcyksCi0JLnBpbl9iYXNlCT0gMCwKLQkubnVtX3BpbnMJPSAxNCwKLX07Ci0KIHN0cnVjdCBtZXNvbl9waW5jdHJsX2RhdGEgbWVzb25fZ3hiYl9wZXJpcGhzX3BpbmN0cmxfZGF0YSA9IHsKKwkubmFtZQkJPSAicGVyaXBocy1iYW5rcyIsCisJLnBpbl9iYXNlCT0gMTQsCiAJLnBpbnMJCT0gbWVzb25fZ3hiYl9wZXJpcGhzX3BpbnMsCiAJLmdyb3VwcwkJPSBtZXNvbl9neGJiX3BlcmlwaHNfZ3JvdXBzLAogCS5mdW5jcwkJPSBtZXNvbl9neGJiX3BlcmlwaHNfZnVuY3Rpb25zLAotCS5kb21haW5fZGF0YQk9ICZtZXNvbl9neGJiX3BlcmlwaHNfZG9tYWluX2RhdGEsCisJLmJhbmtzCQk9IG1lc29uX2d4YmJfcGVyaXBoc19iYW5rcywKIAkubnVtX3BpbnMJPSBBUlJBWV9TSVpFKG1lc29uX2d4YmJfcGVyaXBoc19waW5zKSwKIAkubnVtX2dyb3Vwcwk9IEFSUkFZX1NJWkUobWVzb25fZ3hiYl9wZXJpcGhzX2dyb3VwcyksCiAJLm51bV9mdW5jcwk9IEFSUkFZX1NJWkUobWVzb25fZ3hiYl9wZXJpcGhzX2Z1bmN0aW9ucyksCisJLm51bV9iYW5rcwk9IEFSUkFZX1NJWkUobWVzb25fZ3hiYl9wZXJpcGhzX2JhbmtzKSwKIH07CiAKIHN0cnVjdCBtZXNvbl9waW5jdHJsX2RhdGEgbWVzb25fZ3hiYl9hb2J1c19waW5jdHJsX2RhdGEgPSB7CisJLm5hbWUJCT0gImFvYnVzLWJhbmtzIiwKKwkucGluX2Jhc2UJPSAwLAogCS5waW5zCQk9IG1lc29uX2d4YmJfYW9idXNfcGlucywKIAkuZ3JvdXBzCQk9IG1lc29uX2d4YmJfYW9idXNfZ3JvdXBzLAogCS5mdW5jcwkJPSBtZXNvbl9neGJiX2FvYnVzX2Z1bmN0aW9ucywKLQkuZG9tYWluX2RhdGEJPSAmbWVzb25fZ3hiYl9hb2J1c19kb21haW5fZGF0YSwKKwkuYmFua3MJCT0gbWVzb25fZ3hiYl9hb2J1c19iYW5rcywKIAkubnVtX3BpbnMJPSBBUlJBWV9TSVpFKG1lc29uX2d4YmJfYW9idXNfcGlucyksCiAJLm51bV9ncm91cHMJPSBBUlJBWV9TSVpFKG1lc29uX2d4YmJfYW9idXNfZ3JvdXBzKSwKIAkubnVtX2Z1bmNzCT0gQVJSQVlfU0laRShtZXNvbl9neGJiX2FvYnVzX2Z1bmN0aW9ucyksCisJLm51bV9iYW5rcwk9IEFSUkFZX1NJWkUobWVzb25fZ3hiYl9hb2J1c19iYW5rcyksCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24uYyBiL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmMKaW5kZXggNDRlNjljOS4uNTcxMjJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24uYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi5jCkBAIC0yMSw5ICsyMSw4IEBACiAgKiBkb21haW4gd2hpY2ggY2FuJ3QgYmUgcG93ZXJlZCBvZmY7IHRoZSBiYW5rIGFsc28gdXNlcyBhIHNldCBvZgogICogcmVnaXN0ZXJzIGRpZmZlcmVudCBmcm9tIHRoZSBvdGhlciBiYW5rcy4KICAqCi0gKiBGb3IgZWFjaCBvZiB0aGUgdHdvIHBvd2VyIGRvbWFpbnMgKHJlZ3VsYXIgYW5kIGFsd2F5cy1vbikgdGhlcmUgYXJlCi0gKiA0IGRpZmZlcmVudCByZWdpc3RlciByYW5nZXMgdGhhdCBjb250cm9sIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcwotICogb2YgdGhlIHBpbnM6CisgKiBGb3IgZWFjaCBwaW4gY29udHJvbGxlciB0aGVyZSBhcmUgNCBkaWZmZXJlbnQgcmVnaXN0ZXIgcmFuZ2VzIHRoYXQKKyAqIGNvbnRyb2wgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG9mIHRoZSBwaW5zOgogICogIDEpIHBpbiBtdXhpbmcKICAqICAyKSBwdWxsIGVuYWJsZS9kaXNhYmxlCiAgKiAgMykgcHVsbCB1cC9kb3duCkBAIC0zMyw4ICszMiw4IEBACiAgKiBkaXJlY3Rpb24gYXJlIHRoZSBzYW1lIGFuZCB0aHVzIHRoZXJlIGFyZSBvbmx5IDMgcmVnaXN0ZXIgcmFuZ2VzLgogICoKICAqIEV2ZXJ5IHBpbm11eCBncm91cCBjYW4gYmUgZW5hYmxlZCBieSBhIHNwZWNpZmljIGJpdCBpbiB0aGUgZmlyc3QKLSAqIHJlZ2lzdGVyIHJhbmdlIG9mIHRoZSBkb21haW47IHdoZW4gYWxsIGdyb3VwcyBmb3IgYSBnaXZlbiBwaW4gYXJlCi0gKiBkaXNhYmxlZCB0aGUgcGluIGFjdHMgYXMgYSBHUElPLgorICogcmVnaXN0ZXIgcmFuZ2U7IHdoZW4gYWxsIGdyb3VwcyBmb3IgYSBnaXZlbiBwaW4gYXJlIGRpc2FibGVkIHRoZQorICogcGluIGFjdHMgYXMgYSBHUElPLgogICoKICAqIEZvciB0aGUgcHVsbCBhbmQgR1BJTyBjb25maWd1cmF0aW9uIGV2ZXJ5IGJhbmsgdXNlcyBhIGNvbnRpZ3VvdXMKICAqIHNldCBvZiBiaXRzIGluIHRoZSByZWdpc3RlciBzZXRzIGRlc2NyaWJlZCBhYm92ZTsgdGhlIHNhbWUgcmVnaXN0ZXIKQEAgLTY2LDIxICs2NSwyMSBAQAogLyoqCiAgKiBtZXNvbl9nZXRfYmFuaygpIC0gZmluZCB0aGUgYmFuayBjb250YWluaW5nIGEgZ2l2ZW4gcGluCiAgKgotICogQGRvbWFpbjoJdGhlIGRvbWFpbiBjb250YWluaW5nIHRoZSBwaW4KKyAqIEBwYzoJCXRoZSBwaW5jdHJsIGluc3RhbmNlCiAgKiBAcGluOgl0aGUgcGluIG51bWJlcgogICogQGJhbms6CXRoZSBmb3VuZCBiYW5rCiAgKgogICogUmV0dXJuOgkwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IKICAqLwotc3RhdGljIGludCBtZXNvbl9nZXRfYmFuayhzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGludCBwaW4sCitzdGF0aWMgaW50IG1lc29uX2dldF9iYW5rKHN0cnVjdCBtZXNvbl9waW5jdHJsICpwYywgdW5zaWduZWQgaW50IHBpbiwKIAkJCSAgc3RydWN0IG1lc29uX2JhbmsgKipiYW5rKQogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGRvbWFpbi0+ZGF0YS0+bnVtX2JhbmtzOyBpKyspIHsKLQkJaWYgKHBpbiA+PSBkb21haW4tPmRhdGEtPmJhbmtzW2ldLmZpcnN0ICYmCi0JCSAgICBwaW4gPD0gZG9tYWluLT5kYXRhLT5iYW5rc1tpXS5sYXN0KSB7Ci0JCQkqYmFuayA9ICZkb21haW4tPmRhdGEtPmJhbmtzW2ldOworCWZvciAoaSA9IDA7IGkgPCBwYy0+ZGF0YS0+bnVtX2JhbmtzOyBpKyspIHsKKwkJaWYgKHBpbiA+PSBwYy0+ZGF0YS0+YmFua3NbaV0uZmlyc3QgJiYKKwkJICAgIHBpbiA8PSBwYy0+ZGF0YS0+YmFua3NbaV0ubGFzdCkgeworCQkJKmJhbmsgPSAmcGMtPmRhdGEtPmJhbmtzW2ldOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC04OSwzMyArODgsNiBAQAogfQogCiAvKioKLSAqIG1lc29uX2dldF9kb21haW5fYW5kX2JhbmsoKSAtIGZpbmQgZG9tYWluIGFuZCBiYW5rIGNvbnRhaW5pbmcgYSBnaXZlbiBwaW4KLSAqCi0gKiBAcGM6CQlNZXNvbiBwaW4gY29udHJvbGxlciBkZXZpY2UKLSAqIEBwaW46CXRoZSBwaW4gbnVtYmVyCi0gKiBAZG9tYWluOgl0aGUgZm91bmQgZG9tYWluCi0gKiBAYmFuazoJdGhlIGZvdW5kIGJhbmsKLSAqCi0gKiBSZXR1cm46CTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvcgotICovCi1zdGF0aWMgaW50IG1lc29uX2dldF9kb21haW5fYW5kX2Jhbmsoc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjLCB1bnNpZ25lZCBpbnQgcGluLAotCQkJCSAgICAgc3RydWN0IG1lc29uX2RvbWFpbiAqKmRvbWFpbiwKLQkJCQkgICAgIHN0cnVjdCBtZXNvbl9iYW5rICoqYmFuaykKLXsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkOwotCi0JZCA9IHBjLT5kb21haW47Ci0KLQlpZiAocGluID49IGQtPmRhdGEtPnBpbl9iYXNlICYmCi0JICAgIHBpbiA8IGQtPmRhdGEtPnBpbl9iYXNlICsgZC0+ZGF0YS0+bnVtX3BpbnMpIHsKLQkJKmRvbWFpbiA9IGQ7Ci0JCXJldHVybiBtZXNvbl9nZXRfYmFuayhkLCBwaW4sIGJhbmspOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi0vKioKICAqIG1lc29uX2NhbGNfcmVnX2FuZF9iaXQoKSAtIGNhbGN1bGF0ZSByZWdpc3RlciBhbmQgYml0IGZvciBhIHBpbgogICoKICAqIEBiYW5rOgl0aGUgYmFuayBjb250YWluaW5nIHRoZSBwaW4KQEAgLTE5MCw3ICsxNjIsNiBAQAogCQkJCQkgICB1bnNpZ25lZCBpbnQgcGluLCBpbnQgc2VsX2dyb3VwKQogewogCXN0cnVjdCBtZXNvbl9wbXhfZ3JvdXAgKmdyb3VwOwotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbjsKIAlpbnQgaSwgajsKIAogCWZvciAoaSA9IDA7IGkgPCBwYy0+ZGF0YS0+bnVtX2dyb3VwczsgaSsrKSB7CkBAIC0yMDEsOCArMTcyLDcgQEAKIAkJZm9yIChqID0gMDsgaiA8IGdyb3VwLT5udW1fcGluczsgaisrKSB7CiAJCQlpZiAoZ3JvdXAtPnBpbnNbal0gPT0gcGluKSB7CiAJCQkJLyogV2UgaGF2ZSBmb3VuZCBhIGdyb3VwIHVzaW5nIHRoZSBwaW4gKi8KLQkJCQlkb21haW4gPSBwYy0+ZG9tYWluOwotCQkJCXJlZ21hcF91cGRhdGVfYml0cyhkb21haW4tPnJlZ19tdXgsCisJCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdfbXV4LAogCQkJCQkJICAgZ3JvdXAtPnJlZyAqIDQsCiAJCQkJCQkgICBCSVQoZ3JvdXAtPmJpdCksIDApOwogCQkJfQpAQCAtMjE2LDcgKzE4Niw2IEBACiAJc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGNkZXYpOwogCXN0cnVjdCBtZXNvbl9wbXhfZnVuYyAqZnVuYyA9ICZwYy0+ZGF0YS0+ZnVuY3NbZnVuY19udW1dOwogCXN0cnVjdCBtZXNvbl9wbXhfZ3JvdXAgKmdyb3VwID0gJnBjLT5kYXRhLT5ncm91cHNbZ3JvdXBfbnVtXTsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW4gPSBwYy0+ZG9tYWluOwogCWludCBpLCByZXQgPSAwOwogCiAJZGV2X2RiZyhwYy0+ZGV2LCAiZW5hYmxlIGZ1bmN0aW9uICVzLCBncm91cCAlc1xuIiwgZnVuYy0+bmFtZSwKQEAgLTIzMSw3ICsyMDAsNyBAQAogCiAJLyogRnVuY3Rpb24gMCAoR1BJTykgZG9lc24ndCBuZWVkIGFueSBhZGRpdGlvbmFsIHNldHRpbmcgKi8KIAlpZiAoZnVuY19udW0pCi0JCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkb21haW4tPnJlZ19tdXgsIGdyb3VwLT5yZWcgKiA0LAorCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocGMtPnJlZ19tdXgsIGdyb3VwLT5yZWcgKiA0LAogCQkJCQkgQklUKGdyb3VwLT5iaXQpLCBCSVQoZ3JvdXAtPmJpdCkpOwogCiAJcmV0dXJuIHJldDsKQEAgLTI4NywxNCArMjU2LDEzIEBACiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmNvbmZpZ3MsIHVuc2lnbmVkIG51bV9jb25maWdzKQogewogCXN0cnVjdCBtZXNvbl9waW5jdHJsICpwYyA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjZGV2KTsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW47CiAJc3RydWN0IG1lc29uX2JhbmsgKmJhbms7CiAJZW51bSBwaW5fY29uZmlnX3BhcmFtIHBhcmFtOwogCXVuc2lnbmVkIGludCByZWcsIGJpdDsKIAlpbnQgaSwgcmV0OwogCXUxNiBhcmc7CiAKLQlyZXQgPSBtZXNvbl9nZXRfZG9tYWluX2FuZF9iYW5rKHBjLCBwaW4sICZkb21haW4sICZiYW5rKTsKKwlyZXQgPSBtZXNvbl9nZXRfYmFuayhwYywgcGluLCAmYmFuayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzA3LDcgKzI3NSw3IEBACiAJCQlkZXZfZGJnKHBjLT5kZXYsICJwaW4gJXU6IGRpc2FibGUgYmlhc1xuIiwgcGluKTsKIAogCQkJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19QVUxMLCAmcmVnLCAmYml0KTsKLQkJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkb21haW4tPnJlZ19wdWxsLCByZWcsCisJCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocGMtPnJlZ19wdWxsLCByZWcsCiAJCQkJCQkgQklUKGJpdCksIDApOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwpAQCAtMzE3LDEzICsyODUsMTMgQEAKIAogCQkJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19QVUxMRU4sCiAJCQkJCSAgICAgICAmcmVnLCAmYml0KTsKLQkJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkb21haW4tPnJlZ19wdWxsZW4sIHJlZywKKwkJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVnX3B1bGxlbiwgcmVnLAogCQkJCQkJIEJJVChiaXQpLCBCSVQoYml0KSk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CiAKIAkJCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfUFVMTCwgJnJlZywgJmJpdCk7Ci0JCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZG9tYWluLT5yZWdfcHVsbCwgcmVnLAorCQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdfcHVsbCwgcmVnLAogCQkJCQkJIEJJVChiaXQpLCBCSVQoYml0KSk7CiAJCQlpZiAocmV0KQogCQkJCXJldHVybiByZXQ7CkBAIC0zMzMsMTMgKzMwMSwxMyBAQAogCiAJCQltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX1BVTExFTiwKIAkJCQkJICAgICAgICZyZWcsICZiaXQpOwotCQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRvbWFpbi0+cmVnX3B1bGxlbiwgcmVnLAorCQkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBjLT5yZWdfcHVsbGVuLCByZWcsCiAJCQkJCQkgQklUKGJpdCksIEJJVChiaXQpKTsKIAkJCWlmIChyZXQpCiAJCQkJcmV0dXJuIHJldDsKIAogCQkJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19QVUxMLCAmcmVnLCAmYml0KTsKLQkJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkb21haW4tPnJlZ19wdWxsLCByZWcsCisJCQlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocGMtPnJlZ19wdWxsLCByZWcsCiAJCQkJCQkgQklUKGJpdCksIDApOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwpAQCAtMzU0LDE4ICszMjIsMTcgQEAKIAogc3RhdGljIGludCBtZXNvbl9waW5jb25mX2dldF9wdWxsKHN0cnVjdCBtZXNvbl9waW5jdHJsICpwYywgdW5zaWduZWQgaW50IHBpbikKIHsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW47CiAJc3RydWN0IG1lc29uX2JhbmsgKmJhbms7CiAJdW5zaWduZWQgaW50IHJlZywgYml0LCB2YWw7CiAJaW50IHJldCwgY29uZjsKIAotCXJldCA9IG1lc29uX2dldF9kb21haW5fYW5kX2JhbmsocGMsIHBpbiwgJmRvbWFpbiwgJmJhbmspOworCXJldCA9IG1lc29uX2dldF9iYW5rKHBjLCBwaW4sICZiYW5rKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19QVUxMRU4sICZyZWcsICZiaXQpOwogCi0JcmV0ID0gcmVnbWFwX3JlYWQoZG9tYWluLT5yZWdfcHVsbGVuLCByZWcsICZ2YWwpOworCXJldCA9IHJlZ21hcF9yZWFkKHBjLT5yZWdfcHVsbGVuLCByZWcsICZ2YWwpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTM3NCw3ICszNDEsNyBAQAogCX0gZWxzZSB7CiAJCW1lc29uX2NhbGNfcmVnX2FuZF9iaXQoYmFuaywgcGluLCBSRUdfUFVMTCwgJnJlZywgJmJpdCk7CiAKLQkJcmV0ID0gcmVnbWFwX3JlYWQoZG9tYWluLT5yZWdfcHVsbCwgcmVnLCAmdmFsKTsKKwkJcmV0ID0gcmVnbWFwX3JlYWQocGMtPnJlZ19wdWxsLCByZWcsICZ2YWwpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIApAQCAtNDUyLDgyICs0MTksODIgQEAKIAogc3RhdGljIHZvaWQgbWVzb25fZ3Bpb19mcmVlKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGdwaW8pCiB7Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAKLQlwaW5jdHJsX2ZyZWVfZ3Bpbyhkb21haW4tPmRhdGEtPnBpbl9iYXNlICsgZ3Bpbyk7CisJcGluY3RybF9mcmVlX2dwaW8ocGMtPmRhdGEtPnBpbl9iYXNlICsgZ3Bpbyk7CiB9CiAKIHN0YXRpYyBpbnQgbWVzb25fZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKIHsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW4gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAl1bnNpZ25lZCBpbnQgcmVnLCBiaXQsIHBpbjsKIAlzdHJ1Y3QgbWVzb25fYmFuayAqYmFuazsKIAlpbnQgcmV0OwogCi0JcGluID0gZG9tYWluLT5kYXRhLT5waW5fYmFzZSArIGdwaW87Ci0JcmV0ID0gbWVzb25fZ2V0X2JhbmsoZG9tYWluLCBwaW4sICZiYW5rKTsKKwlwaW4gPSBwYy0+ZGF0YS0+cGluX2Jhc2UgKyBncGlvOworCXJldCA9IG1lc29uX2dldF9iYW5rKHBjLCBwaW4sICZiYW5rKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19ESVIsICZyZWcsICZiaXQpOwogCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhkb21haW4tPnJlZ19ncGlvLCByZWcsIEJJVChiaXQpLCBCSVQoYml0KSk7CisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVnX2dwaW8sIHJlZywgQklUKGJpdCksIEJJVChiaXQpKTsKIH0KIAogc3RhdGljIGludCBtZXNvbl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbywKIAkJCQkgICAgICAgaW50IHZhbHVlKQogewotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbiA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOworCXN0cnVjdCBtZXNvbl9waW5jdHJsICpwYyA9IGdwaW9jaGlwX2dldF9kYXRhKGNoaXApOwogCXVuc2lnbmVkIGludCByZWcsIGJpdCwgcGluOwogCXN0cnVjdCBtZXNvbl9iYW5rICpiYW5rOwogCWludCByZXQ7CiAKLQlwaW4gPSBkb21haW4tPmRhdGEtPnBpbl9iYXNlICsgZ3BpbzsKLQlyZXQgPSBtZXNvbl9nZXRfYmFuayhkb21haW4sIHBpbiwgJmJhbmspOworCXBpbiA9IHBjLT5kYXRhLT5waW5fYmFzZSArIGdwaW87CisJcmV0ID0gbWVzb25fZ2V0X2JhbmsocGMsIHBpbiwgJmJhbmspOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX0RJUiwgJnJlZywgJmJpdCk7Ci0JcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRvbWFpbi0+cmVnX2dwaW8sIHJlZywgQklUKGJpdCksIDApOworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVnX2dwaW8sIHJlZywgQklUKGJpdCksIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX09VVCwgJnJlZywgJmJpdCk7Ci0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhkb21haW4tPnJlZ19ncGlvLCByZWcsIEJJVChiaXQpLAorCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocGMtPnJlZ19ncGlvLCByZWcsIEJJVChiaXQpLAogCQkJCSAgdmFsdWUgPyBCSVQoYml0KSA6IDApOwogfQogCiBzdGF0aWMgdm9pZCBtZXNvbl9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvLCBpbnQgdmFsdWUpCiB7Ci0Jc3RydWN0IG1lc29uX2RvbWFpbiAqZG9tYWluID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CisJc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjID0gZ3Bpb2NoaXBfZ2V0X2RhdGEoY2hpcCk7CiAJdW5zaWduZWQgaW50IHJlZywgYml0LCBwaW47CiAJc3RydWN0IG1lc29uX2JhbmsgKmJhbms7CiAJaW50IHJldDsKIAotCXBpbiA9IGRvbWFpbi0+ZGF0YS0+cGluX2Jhc2UgKyBncGlvOwotCXJldCA9IG1lc29uX2dldF9iYW5rKGRvbWFpbiwgcGluLCAmYmFuayk7CisJcGluID0gcGMtPmRhdGEtPnBpbl9iYXNlICsgZ3BpbzsKKwlyZXQgPSBtZXNvbl9nZXRfYmFuayhwYywgcGluLCAmYmFuayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuOwogCiAJbWVzb25fY2FsY19yZWdfYW5kX2JpdChiYW5rLCBwaW4sIFJFR19PVVQsICZyZWcsICZiaXQpOwotCXJlZ21hcF91cGRhdGVfYml0cyhkb21haW4tPnJlZ19ncGlvLCByZWcsIEJJVChiaXQpLAorCXJlZ21hcF91cGRhdGVfYml0cyhwYy0+cmVnX2dwaW8sIHJlZywgQklUKGJpdCksCiAJCQkgICB2YWx1ZSA/IEJJVChiaXQpIDogMCk7CiB9CiAKIHN0YXRpYyBpbnQgbWVzb25fZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgZ3BpbykKIHsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW4gPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKKwlzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMgPSBncGlvY2hpcF9nZXRfZGF0YShjaGlwKTsKIAl1bnNpZ25lZCBpbnQgcmVnLCBiaXQsIHZhbCwgcGluOwogCXN0cnVjdCBtZXNvbl9iYW5rICpiYW5rOwogCWludCByZXQ7CiAKLQlwaW4gPSBkb21haW4tPmRhdGEtPnBpbl9iYXNlICsgZ3BpbzsKLQlyZXQgPSBtZXNvbl9nZXRfYmFuayhkb21haW4sIHBpbiwgJmJhbmspOworCXBpbiA9IHBjLT5kYXRhLT5waW5fYmFzZSArIGdwaW87CisJcmV0ID0gbWVzb25fZ2V0X2JhbmsocGMsIHBpbiwgJmJhbmspOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAltZXNvbl9jYWxjX3JlZ19hbmRfYml0KGJhbmssIHBpbiwgUkVHX0lOLCAmcmVnLCAmYml0KTsKLQlyZWdtYXBfcmVhZChkb21haW4tPnJlZ19ncGlvLCByZWcsICZ2YWwpOworCXJlZ21hcF9yZWFkKHBjLT5yZWdfZ3BpbywgcmVnLCAmdmFsKTsKIAogCXJldHVybiAhISh2YWwgJiBCSVQoYml0KSk7CiB9CkBAIC01NjIsMzUgKzUyOSwzMiBAQAogCiBzdGF0aWMgaW50IG1lc29uX2dwaW9saWJfcmVnaXN0ZXIoc3RydWN0IG1lc29uX3BpbmN0cmwgKnBjKQogewotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbjsKIAlpbnQgcmV0OwogCi0JZG9tYWluID0gcGMtPmRvbWFpbjsKKwlwYy0+Y2hpcC5sYWJlbCA9IHBjLT5kYXRhLT5uYW1lOworCXBjLT5jaGlwLnBhcmVudCA9IHBjLT5kZXY7CisJcGMtPmNoaXAucmVxdWVzdCA9IG1lc29uX2dwaW9fcmVxdWVzdDsKKwlwYy0+Y2hpcC5mcmVlID0gbWVzb25fZ3Bpb19mcmVlOworCXBjLT5jaGlwLmRpcmVjdGlvbl9pbnB1dCA9IG1lc29uX2dwaW9fZGlyZWN0aW9uX2lucHV0OworCXBjLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBtZXNvbl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7CisJcGMtPmNoaXAuZ2V0ID0gbWVzb25fZ3Bpb19nZXQ7CisJcGMtPmNoaXAuc2V0ID0gbWVzb25fZ3Bpb19zZXQ7CisJcGMtPmNoaXAuYmFzZSA9IHBjLT5kYXRhLT5waW5fYmFzZTsKKwlwYy0+Y2hpcC5uZ3BpbyA9IHBjLT5kYXRhLT5udW1fcGluczsKKwlwYy0+Y2hpcC5jYW5fc2xlZXAgPSBmYWxzZTsKKwlwYy0+Y2hpcC5vZl9ub2RlID0gcGMtPm9mX25vZGU7CisJcGMtPmNoaXAub2ZfZ3Bpb19uX2NlbGxzID0gMjsKIAotCWRvbWFpbi0+Y2hpcC5sYWJlbCA9IGRvbWFpbi0+ZGF0YS0+bmFtZTsKLQlkb21haW4tPmNoaXAucGFyZW50ID0gcGMtPmRldjsKLQlkb21haW4tPmNoaXAucmVxdWVzdCA9IG1lc29uX2dwaW9fcmVxdWVzdDsKLQlkb21haW4tPmNoaXAuZnJlZSA9IG1lc29uX2dwaW9fZnJlZTsKLQlkb21haW4tPmNoaXAuZGlyZWN0aW9uX2lucHV0ID0gbWVzb25fZ3Bpb19kaXJlY3Rpb25faW5wdXQ7Ci0JZG9tYWluLT5jaGlwLmRpcmVjdGlvbl9vdXRwdXQgPSBtZXNvbl9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7Ci0JZG9tYWluLT5jaGlwLmdldCA9IG1lc29uX2dwaW9fZ2V0OwotCWRvbWFpbi0+Y2hpcC5zZXQgPSBtZXNvbl9ncGlvX3NldDsKLQlkb21haW4tPmNoaXAuYmFzZSA9IGRvbWFpbi0+ZGF0YS0+cGluX2Jhc2U7Ci0JZG9tYWluLT5jaGlwLm5ncGlvID0gZG9tYWluLT5kYXRhLT5udW1fcGluczsKLQlkb21haW4tPmNoaXAuY2FuX3NsZWVwID0gZmFsc2U7Ci0JZG9tYWluLT5jaGlwLm9mX25vZGUgPSBkb21haW4tPm9mX25vZGU7Ci0JZG9tYWluLT5jaGlwLm9mX2dwaW9fbl9jZWxscyA9IDI7Ci0KLQlyZXQgPSBncGlvY2hpcF9hZGRfZGF0YSgmZG9tYWluLT5jaGlwLCBkb21haW4pOworCXJldCA9IGdwaW9jaGlwX2FkZF9kYXRhKCZwYy0+Y2hpcCwgcGMpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihwYy0+ZGV2LCAiY2FuJ3QgYWRkIGdwaW8gY2hpcCAlc1xuIiwKLQkJCWRvbWFpbi0+ZGF0YS0+bmFtZSk7CisJCQlwYy0+ZGF0YS0+bmFtZSk7CiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlyZXQgPSBncGlvY2hpcF9hZGRfcGluX3JhbmdlKCZkb21haW4tPmNoaXAsIGRldl9uYW1lKHBjLT5kZXYpLAotCQkJCSAgICAgMCwgZG9tYWluLT5kYXRhLT5waW5fYmFzZSwKLQkJCQkgICAgIGRvbWFpbi0+Y2hpcC5uZ3Bpbyk7CisJcmV0ID0gZ3Bpb2NoaXBfYWRkX3Bpbl9yYW5nZSgmcGMtPmNoaXAsIGRldl9uYW1lKHBjLT5kZXYpLAorCQkJCSAgICAgMCwgcGMtPmRhdGEtPnBpbl9iYXNlLAorCQkJCSAgICAgcGMtPmNoaXAubmdwaW8pOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihwYy0+ZGV2LCAiY2FuJ3QgYWRkIHBpbiByYW5nZVxuIik7CiAJCWdvdG8gZmFpbDsKQEAgLTU5OCw3ICs1NjIsNyBAQAogCiAJcmV0dXJuIDA7CiBmYWlsOgotCWdwaW9jaGlwX3JlbW92ZSgmcGMtPmRvbWFpbi0+Y2hpcCk7CisJZ3Bpb2NoaXBfcmVtb3ZlKCZwYy0+Y2hpcCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjM3LDU4ICs2MDEsNDYgQEAKIHN0YXRpYyBpbnQgbWVzb25fcGluY3RybF9wYXJzZV9kdChzdHJ1Y3QgbWVzb25fcGluY3RybCAqcGMsCiAJCQkJICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluICpkb21haW47Ci0JaW50IG51bV9kb21haW5zID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqZ3Bpb19ucCA9IE5VTEw7CiAKIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5vZGUsIG5wKSB7CiAJCWlmICghb2ZfZmluZF9wcm9wZXJ0eShucCwgImdwaW8tY29udHJvbGxlciIsIE5VTEwpKQogCQkJY29udGludWU7Ci0JCW51bV9kb21haW5zKys7CisJCWlmIChncGlvX25wKSB7CisJCQlkZXZfZXJyKHBjLT5kZXYsICJtdWx0aXBsZSBncGlvIG5vZGVzXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWdwaW9fbnAgPSBucDsKIAl9CiAKLQlpZiAobnVtX2RvbWFpbnMgIT0gMSkgewotCQlkZXZfZXJyKHBjLT5kZXYsICJ3cm9uZyBudW1iZXIgb2Ygc3Vibm9kZXNcbiIpOworCWlmICghZ3Bpb19ucCkgeworCQlkZXZfZXJyKHBjLT5kZXYsICJubyBncGlvIG5vZGUgZm91bmRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwYy0+ZG9tYWluID0gZGV2bV9remFsbG9jKHBjLT5kZXYsIHNpemVvZihzdHJ1Y3QgbWVzb25fZG9tYWluKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYy0+ZG9tYWluKQotCQlyZXR1cm4gLUVOT01FTTsKKwlwYy0+b2Zfbm9kZSA9IGdwaW9fbnA7CiAKLQlkb21haW4gPSBwYy0+ZG9tYWluOwotCWRvbWFpbi0+ZGF0YSA9IHBjLT5kYXRhLT5kb21haW5fZGF0YTsKKwlwYy0+cmVnX211eCA9IG1lc29uX21hcF9yZXNvdXJjZShwYywgZ3Bpb19ucCwgIm11eCIpOworCWlmIChJU19FUlIocGMtPnJlZ19tdXgpKSB7CisJCWRldl9lcnIocGMtPmRldiwgIm11eCByZWdpc3RlcnMgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocGMtPnJlZ19tdXgpOworCX0KIAotCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobm9kZSwgbnApIHsKLQkJaWYgKCFvZl9maW5kX3Byb3BlcnR5KG5wLCAiZ3Bpby1jb250cm9sbGVyIiwgTlVMTCkpCi0JCQljb250aW51ZTsKKwlwYy0+cmVnX3B1bGwgPSBtZXNvbl9tYXBfcmVzb3VyY2UocGMsIGdwaW9fbnAsICJwdWxsIik7CisJaWYgKElTX0VSUihwYy0+cmVnX3B1bGwpKSB7CisJCWRldl9lcnIocGMtPmRldiwgInB1bGwgcmVnaXN0ZXJzIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiBQVFJfRVJSKHBjLT5yZWdfcHVsbCk7CisJfQogCi0JCWRvbWFpbi0+b2Zfbm9kZSA9IG5wOworCXBjLT5yZWdfcHVsbGVuID0gbWVzb25fbWFwX3Jlc291cmNlKHBjLCBncGlvX25wLCAicHVsbC1lbmFibGUiKTsKKwkvKiBVc2UgcHVsbCByZWdpb24gaWYgcHVsbC1lbmFibGUgb25lIGlzIG5vdCBwcmVzZW50ICovCisJaWYgKElTX0VSUihwYy0+cmVnX3B1bGxlbikpCisJCXBjLT5yZWdfcHVsbGVuID0gcGMtPnJlZ19wdWxsOwogCi0JCWRvbWFpbi0+cmVnX211eCA9IG1lc29uX21hcF9yZXNvdXJjZShwYywgbnAsICJtdXgiKTsKLQkJaWYgKElTX0VSUihkb21haW4tPnJlZ19tdXgpKSB7Ci0JCQlkZXZfZXJyKHBjLT5kZXYsICJtdXggcmVnaXN0ZXJzIG5vdCBmb3VuZFxuIik7Ci0JCQlyZXR1cm4gUFRSX0VSUihkb21haW4tPnJlZ19tdXgpOwotCQl9Ci0KLQkJZG9tYWluLT5yZWdfcHVsbCA9IG1lc29uX21hcF9yZXNvdXJjZShwYywgbnAsICJwdWxsIik7Ci0JCWlmIChJU19FUlIoZG9tYWluLT5yZWdfcHVsbCkpIHsKLQkJCWRldl9lcnIocGMtPmRldiwgInB1bGwgcmVnaXN0ZXJzIG5vdCBmb3VuZFxuIik7Ci0JCQlyZXR1cm4gUFRSX0VSUihkb21haW4tPnJlZ19wdWxsKTsKLQkJfQotCi0JCWRvbWFpbi0+cmVnX3B1bGxlbiA9IG1lc29uX21hcF9yZXNvdXJjZShwYywgbnAsICJwdWxsLWVuYWJsZSIpOwotCQkvKiBVc2UgcHVsbCByZWdpb24gaWYgcHVsbC1lbmFibGUgb25lIGlzIG5vdCBwcmVzZW50ICovCi0JCWlmIChJU19FUlIoZG9tYWluLT5yZWdfcHVsbGVuKSkKLQkJCWRvbWFpbi0+cmVnX3B1bGxlbiA9IGRvbWFpbi0+cmVnX3B1bGw7Ci0KLQkJZG9tYWluLT5yZWdfZ3BpbyA9IG1lc29uX21hcF9yZXNvdXJjZShwYywgbnAsICJncGlvIik7Ci0JCWlmIChJU19FUlIoZG9tYWluLT5yZWdfZ3BpbykpIHsKLQkJCWRldl9lcnIocGMtPmRldiwgImdwaW8gcmVnaXN0ZXJzIG5vdCBmb3VuZFxuIik7Ci0JCQlyZXR1cm4gUFRSX0VSUihkb21haW4tPnJlZ19ncGlvKTsKLQkJfQotCi0JCWJyZWFrOworCXBjLT5yZWdfZ3BpbyA9IG1lc29uX21hcF9yZXNvdXJjZShwYywgZ3Bpb19ucCwgImdwaW8iKTsKKwlpZiAoSVNfRVJSKHBjLT5yZWdfZ3BpbykpIHsKKwkJZGV2X2VycihwYy0+ZGV2LCAiZ3BpbyByZWdpc3RlcnMgbm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocGMtPnJlZ19ncGlvKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmggYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi5oCmluZGV4IGQ4OTQ0MmUuLjk4YjUwODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmgKKysrIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24uaApAQCAtOTUsNTQgKzk1LDE3IEBACiAJc3RydWN0IG1lc29uX3JlZ19kZXNjIHJlZ3NbTlVNX1JFR107CiB9OwogCi0vKioKLSAqIHN0cnVjdCBtZXNvbl9kb21haW5fZGF0YSAtIGRvbWFpbiBwbGF0Zm9ybSBkYXRhCi0gKgotICogQG5hbWU6CW5hbWUgb2YgdGhlIGRvbWFpbgotICogQGJhbmtzOglzZXQgb2YgYmFua3MgYmVsb25naW5nIHRvIHRoZSBkb21haW4KLSAqIEBudW1fYmFua3M6CW51bWJlciBvZiBiYW5rcyBpbiB0aGUgZG9tYWluCi0gKi8KLXN0cnVjdCBtZXNvbl9kb21haW5fZGF0YSB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlzdHJ1Y3QgbWVzb25fYmFuayAqYmFua3M7Ci0JdW5zaWduZWQgaW50IG51bV9iYW5rczsKLQl1bnNpZ25lZCBpbnQgcGluX2Jhc2U7Ci0JdW5zaWduZWQgaW50IG51bV9waW5zOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgbWVzb25fZG9tYWluCi0gKgotICogQHJlZ19tdXg6CXJlZ2lzdGVycyBmb3IgbXV4IHNldHRpbmdzCi0gKiBAcmVnX3B1bGxlbjoJcmVnaXN0ZXJzIGZvciBwdWxsLWVuYWJsZSBzZXR0aW5ncwotICogQHJlZ19wdWxsOglyZWdpc3RlcnMgZm9yIHB1bGwgc2V0dGluZ3MKLSAqIEByZWdfZ3BpbzoJcmVnaXN0ZXJzIGZvciBncGlvIHNldHRpbmdzCi0gKiBAY2hpcDoJZ3BpbyBjaGlwIGFzc29jaWF0ZWQgd2l0aCB0aGUgZG9tYWluCi0gKiBAZGF0YTsJcGxhdGZvcm0gZGF0YSBmb3IgdGhlIGRvbWFpbgotICogQG5vZGU6CWRldmljZSB0cmVlIG5vZGUgZm9yIHRoZSBkb21haW4KLSAqCi0gKiBBIGRvbWFpbiByZXByZXNlbnRzIGEgc2V0IG9mIGJhbmtzIGNvbnRyb2xsZWQgYnkgdGhlIHNhbWUgc2V0IG9mCi0gKiByZWdpc3RlcnMuCi0gKi8KLXN0cnVjdCBtZXNvbl9kb21haW4gewotCXN0cnVjdCByZWdtYXAgKnJlZ19tdXg7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnX3B1bGxlbjsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdfcHVsbDsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdfZ3BpbzsKLQotCXN0cnVjdCBncGlvX2NoaXAgY2hpcDsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluX2RhdGEgKmRhdGE7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOwotfTsKLQogc3RydWN0IG1lc29uX3BpbmN0cmxfZGF0YSB7CisJY29uc3QgY2hhciAqbmFtZTsKIAljb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAqcGluczsKIAlzdHJ1Y3QgbWVzb25fcG14X2dyb3VwICpncm91cHM7CiAJc3RydWN0IG1lc29uX3BteF9mdW5jICpmdW5jczsKLQlzdHJ1Y3QgbWVzb25fZG9tYWluX2RhdGEgKmRvbWFpbl9kYXRhOworCXVuc2lnbmVkIGludCBwaW5fYmFzZTsKIAl1bnNpZ25lZCBpbnQgbnVtX3BpbnM7CiAJdW5zaWduZWQgaW50IG51bV9ncm91cHM7CiAJdW5zaWduZWQgaW50IG51bV9mdW5jczsKKwlzdHJ1Y3QgbWVzb25fYmFuayAqYmFua3M7CisJdW5zaWduZWQgaW50IG51bV9iYW5rczsKIH07CiAKIHN0cnVjdCBtZXNvbl9waW5jdHJsIHsKQEAgLTE1MCw3ICsxMTMsMTIgQEAKIAlzdHJ1Y3QgcGluY3RybF9kZXYgKnBjZGV2OwogCXN0cnVjdCBwaW5jdHJsX2Rlc2MgZGVzYzsKIAlzdHJ1Y3QgbWVzb25fcGluY3RybF9kYXRhICpkYXRhOwotCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbjsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdfbXV4OworCXN0cnVjdCByZWdtYXAgKnJlZ19wdWxsZW47CisJc3RydWN0IHJlZ21hcCAqcmVnX3B1bGw7CisJc3RydWN0IHJlZ21hcCAqcmVnX2dwaW87CisJc3RydWN0IGdwaW9fY2hpcCBjaGlwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKIH07CiAKICNkZWZpbmUgUElOKHgsIGIpCShiICsgeCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uOC5jIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244LmMKaW5kZXggMzJkZTE5MS4uMDdmMWNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244LmMKQEAgLTkzMSwzOCArOTMxLDI4IEBACiAJQkFOSygiQU8iLCAgIFBJTihHUElPQU9fMCwgQU9fT0ZGKSwgUElOKEdQSU9fVEVTVF9OLCBBT19PRkYpLCAwLCAgMCwgIDAsIDE2LCAgMCwgIDAsICAwLCAxNiwgIDEsICAwKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbWVzb25fZG9tYWluX2RhdGEgbWVzb244X2NidXNfZG9tYWluX2RhdGEgPSB7Ci0JLm5hbWUJCT0gImNidXMtYmFua3MiLAotCS5iYW5rcwkJPSBtZXNvbjhfY2J1c19iYW5rcywKLQkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhfY2J1c19iYW5rcyksCi0JLnBpbl9iYXNlCT0gMCwKLQkubnVtX3BpbnMJPSAxMjAsCi19OwotCi1zdGF0aWMgc3RydWN0IG1lc29uX2RvbWFpbl9kYXRhIG1lc29uOF9hb2J1c19kb21haW5fZGF0YSA9IHsKLQkubmFtZQkJPSAiYW8tYmFuayIsCi0JLmJhbmtzCQk9IG1lc29uOF9hb2J1c19iYW5rcywKLQkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhfYW9idXNfYmFua3MpLAotCS5waW5fYmFzZQk9IDEyMCwKLQkubnVtX3BpbnMJPSAxNiwKLX07Ci0KIHN0cnVjdCBtZXNvbl9waW5jdHJsX2RhdGEgbWVzb244X2NidXNfcGluY3RybF9kYXRhID0geworCS5uYW1lCQk9ICJjYnVzLWJhbmtzIiwKKwkucGluX2Jhc2UJPSAwLAogCS5waW5zCQk9IG1lc29uOF9jYnVzX3BpbnMsCiAJLmdyb3VwcwkJPSBtZXNvbjhfY2J1c19ncm91cHMsCiAJLmZ1bmNzCQk9IG1lc29uOF9jYnVzX2Z1bmN0aW9ucywKLQkuZG9tYWluX2RhdGEJPSAmbWVzb244X2NidXNfZG9tYWluX2RhdGEsCisJLmJhbmtzCQk9IG1lc29uOF9jYnVzX2JhbmtzLAogCS5udW1fcGlucwk9IEFSUkFZX1NJWkUobWVzb244X2NidXNfcGlucyksCiAJLm51bV9ncm91cHMJPSBBUlJBWV9TSVpFKG1lc29uOF9jYnVzX2dyb3VwcyksCiAJLm51bV9mdW5jcwk9IEFSUkFZX1NJWkUobWVzb244X2NidXNfZnVuY3Rpb25zKSwKKwkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhfY2J1c19iYW5rcyksCiB9OwogCiBzdHJ1Y3QgbWVzb25fcGluY3RybF9kYXRhIG1lc29uOF9hb2J1c19waW5jdHJsX2RhdGEgPSB7CisJLm5hbWUJCT0gImFvLWJhbmsiLAorCS5waW5fYmFzZQk9IDEyMCwKIAkucGlucwkJPSBtZXNvbjhfYW9idXNfcGlucywKIAkuZ3JvdXBzCQk9IG1lc29uOF9hb2J1c19ncm91cHMsCiAJLmZ1bmNzCQk9IG1lc29uOF9hb2J1c19mdW5jdGlvbnMsCi0JLmRvbWFpbl9kYXRhCT0gJm1lc29uOF9hb2J1c19kb21haW5fZGF0YSwKKwkuYmFua3MJCT0gbWVzb244X2FvYnVzX2JhbmtzLAogCS5udW1fcGlucwk9IEFSUkFZX1NJWkUobWVzb244X2FvYnVzX3BpbnMpLAogCS5udW1fZ3JvdXBzCT0gQVJSQVlfU0laRShtZXNvbjhfYW9idXNfZ3JvdXBzKSwKIAkubnVtX2Z1bmNzCT0gQVJSQVlfU0laRShtZXNvbjhfYW9idXNfZnVuY3Rpb25zKSwKKwkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhfYW9idXNfYmFua3MpLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uOGIuYyBiL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uOGIuYwppbmRleCA4NzRmMmVkLi43NmYwNzdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbjhiLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244Yi5jCkBAIC04OTYsMzggKzg5NiwyOCBAQAogCUJBTksoIkFPIiwgICBQSU4oR1BJT0FPXzAsIEFPX09GRiksIFBJTihHUElPX1RFU1RfTiwgQU9fT0ZGKSwgMCwgIDAsICAwLCAxNiwgIDAsICAwLCAgMCwgMTYsICAxLCAgMCksCiB9OwogCi1zdGF0aWMgc3RydWN0IG1lc29uX2RvbWFpbl9kYXRhIG1lc29uOGJfY2J1c19kb21haW5fZGF0YSA9IHsKLQkubmFtZQkJPSAiY2J1cy1iYW5rcyIsCi0JLmJhbmtzCQk9IG1lc29uOGJfY2J1c19iYW5rcywKLQkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhiX2NidXNfYmFua3MpLAotCS5waW5fYmFzZQk9IDAsCi0JLm51bV9waW5zCT0gMTMwLAotfTsKLQotc3RhdGljIHN0cnVjdCBtZXNvbl9kb21haW5fZGF0YSBtZXNvbjhiX2FvYnVzX2RvbWFpbl9kYXRhID0gewotCS5uYW1lCQk9ICJhb2J1cy1iYW5rcyIsCi0JLmJhbmtzCQk9IG1lc29uOGJfYW9idXNfYmFua3MsCi0JLm51bV9iYW5rcwk9IEFSUkFZX1NJWkUobWVzb244Yl9hb2J1c19iYW5rcyksCi0JLnBpbl9iYXNlCT0gMTMwLAotCS5udW1fcGlucwk9IDE2LAotfTsKLQogc3RydWN0IG1lc29uX3BpbmN0cmxfZGF0YSBtZXNvbjhiX2NidXNfcGluY3RybF9kYXRhID0geworCS5uYW1lCQk9ICJjYnVzLWJhbmtzIiwKKwkucGluX2Jhc2UJPSAwLAogCS5waW5zCQk9IG1lc29uOGJfY2J1c19waW5zLAogCS5ncm91cHMJCT0gbWVzb244Yl9jYnVzX2dyb3VwcywKIAkuZnVuY3MJCT0gbWVzb244Yl9jYnVzX2Z1bmN0aW9ucywKLQkuZG9tYWluX2RhdGEJPSAmbWVzb244Yl9jYnVzX2RvbWFpbl9kYXRhLAorCS5iYW5rcwkJPSBtZXNvbjhiX2NidXNfYmFua3MsCiAJLm51bV9waW5zCT0gQVJSQVlfU0laRShtZXNvbjhiX2NidXNfcGlucyksCiAJLm51bV9ncm91cHMJPSBBUlJBWV9TSVpFKG1lc29uOGJfY2J1c19ncm91cHMpLAogCS5udW1fZnVuY3MJPSBBUlJBWV9TSVpFKG1lc29uOGJfY2J1c19mdW5jdGlvbnMpLAorCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uOGJfY2J1c19iYW5rcyksCiB9OwogCiBzdHJ1Y3QgbWVzb25fcGluY3RybF9kYXRhIG1lc29uOGJfYW9idXNfcGluY3RybF9kYXRhID0geworCS5uYW1lCQk9ICJhb2J1cy1iYW5rcyIsCisJLnBpbl9iYXNlCT0gMTMwLAogCS5waW5zCQk9IG1lc29uOGJfYW9idXNfcGlucywKIAkuZ3JvdXBzCQk9IG1lc29uOGJfYW9idXNfZ3JvdXBzLAogCS5mdW5jcwkJPSBtZXNvbjhiX2FvYnVzX2Z1bmN0aW9ucywKLQkuZG9tYWluX2RhdGEJPSAmbWVzb244Yl9hb2J1c19kb21haW5fZGF0YSwKKwkuYmFua3MJCT0gbWVzb244Yl9hb2J1c19iYW5rcywKIAkubnVtX3BpbnMJPSBBUlJBWV9TSVpFKG1lc29uOGJfYW9idXNfcGlucyksCiAJLm51bV9ncm91cHMJPSBBUlJBWV9TSVpFKG1lc29uOGJfYW9idXNfZ3JvdXBzKSwKIAkubnVtX2Z1bmNzCT0gQVJSQVlfU0laRShtZXNvbjhiX2FvYnVzX2Z1bmN0aW9ucyksCisJLm51bV9iYW5rcwk9IEFSUkFZX1NJWkUobWVzb244Yl9hb2J1c19iYW5rcyksCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL25vbWFkaWsvcGluY3RybC1hYng1MDAuYyBiL2RyaXZlcnMvcGluY3RybC9ub21hZGlrL3BpbmN0cmwtYWJ4NTAwLmMKaW5kZXggN2QzNDNjMi4uZjk1MDAxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL25vbWFkaWsvcGluY3RybC1hYng1MDAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLWFieDUwMC5jCkBAIC00LDYgKzQsOCBAQAogICogQXV0aG9yOiBQYXRyaWNlIENob3RhcmQgPHBhdHJpY2UuY2hvdGFyZEBzdC5jb20+CiAgKiBMaWNlbnNlIHRlcm1zOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSB2ZXJzaW9uIDIKICAqCisgKiBEcml2ZXIgYWxsb3dzIHRvIHVzZSBBeEI1eHggdW51c2VkIHBpbnMgdG8gYmUgdXNlZCBhcyBHUElPCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQEAgLTEyLDcgKzE0LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KQEAgLTEyNjksOCArMTI3MCwzIEBACiAJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYWJ4NTAwX2dwaW9fZHJpdmVyKTsKIH0KIGNvcmVfaW5pdGNhbGwoYWJ4NTAwX2dwaW9faW5pdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlBhdHJpY2UgQ2hvdGFyZCA8cGF0cmljZS5jaG90YXJkQHN0LmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGFsbG93cyB0byB1c2UgQXhCNXh4IHVudXNlZCBwaW5zIHRvIGJlIHVzZWQgYXMgR1BJTyIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphYng1MDAtZ3BpbyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL25vbWFkaWsvcGluY3RybC1ub21hZGlrLmMgYi9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLW5vbWFkaWsuYwppbmRleCAzNWY2MjE4Li5kMzE4Y2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLW5vbWFkaWsuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLW5vbWFkaWsuYwpAQCAtMTEsNyArMTEsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CkBAIC0xMTEwLDEwICsxMTA5LDggQEAKIAkJcmV0dXJuIFBUUl9FUlIobm1rX2NoaXApOwogCX0KIAotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJzdCxzdXBwb3J0cy1zbGVlcG1vZGUiLCBOVUxMKSkKLQkJc3VwcG9ydHNfc2xlZXBtb2RlID0gdHJ1ZTsKLQllbHNlCi0JCXN1cHBvcnRzX3NsZWVwbW9kZSA9IGZhbHNlOworCXN1cHBvcnRzX3NsZWVwbW9kZSA9CisJCW9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInN0LHN1cHBvcnRzLXNsZWVwbW9kZSIpOwogCiAJLyogQ29ycmVjdCBwbGF0Zm9ybSBkZXZpY2UgSUQgKi8KIAlkZXYtPmlkID0gbm1rX2NoaXAtPmJhbms7CkBAIC0xMTgwLDcgKzExNzcsNyBAQAogCQkJCSAgIGlycWNoaXAsCiAJCQkJICAgMCwKIAkJCQkgICBoYW5kbGVfZWRnZV9pcnEsCi0JCQkJICAgSVJRX1RZUEVfRURHRV9GQUxMSU5HKTsKKwkJCQkgICBJUlFfVFlQRV9OT05FKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiY291bGQgbm90IGFkZCBpcnFjaGlwXG4iKTsKIAkJZ3Bpb2NoaXBfcmVtb3ZlKCZubWtfY2hpcC0+Y2hpcCk7CkBAIC0xOTg1LDcgKzE5ODIsMyBAQAogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm5ta19waW5jdHJsX2RyaXZlcik7CiB9CiBjb3JlX2luaXRjYWxsKG5ta19waW5jdHJsX2luaXQpOwotCi1NT0RVTEVfQVVUSE9SKCJQcmFmdWxsYSBXQURBU0tBUiBhbmQgQWxlc3NhbmRybyBSdWJpbmkiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTm9tYWRpayBHUElPIERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYW1kLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hbWQuYwppbmRleCBiM2U3NzIzLi5hZWEzMTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hbWQuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hbWQuYwpAQCAtMzgzLDEyICszODMsMjYgQEAKIAlpbnQgcmV0ID0gMDsKIAl1MzIgcGluX3JlZzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgbGV2ZWxfdHJpZzsKKwl1MzIgYWN0aXZlX2xldmVsOwogCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CiAJc3RydWN0IGFtZF9ncGlvICpncGlvX2RldiA9IGdwaW9jaGlwX2dldF9kYXRhKGdjKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOwogCXBpbl9yZWcgPSByZWFkbChncGlvX2Rldi0+YmFzZSArIChkLT5od2lycSkqNCk7CiAKKwkvKgorCSAqIFdoZW4gbGV2ZWxfdHJpZyBpcyBzZXQgRURHRSBhbmQgYWN0aXZlX2xldmVsIGlzIHNldCBISUdIIGluIEJJT1MKKwkgKiBkZWZhdWx0IHNldHRpbmdzLCBpZ25vcmUgaW5jb21pbmcgc2V0dGluZ3MgZnJvbSBjbGllbnQgYW5kIHVzZQorCSAqIEJJT1Mgc2V0dGluZ3MgdG8gY29uZmlndXJlIEdQSU8gcmVnaXN0ZXIuCisJICovCisJbGV2ZWxfdHJpZyA9ICEocGluX3JlZyAmIChMRVZFTF9UUklHR0VSIDw8IExFVkVMX1RSSUdfT0ZGKSk7CisJYWN0aXZlX2xldmVsID0gcGluX3JlZyAmIChBQ1RJVkVfTEVWRUxfTUFTSyA8PCBBQ1RJVkVfTEVWRUxfT0ZGKTsKKworCWlmKGxldmVsX3RyaWcgJiYKKwkgICAoKGFjdGl2ZV9sZXZlbCA+PiBBQ1RJVkVfTEVWRUxfT0ZGKSA9PSBBQ1RJVkVfSElHSCkpCisJCXR5cGUgPSBJUlFfVFlQRV9FREdFX0ZBTExJTkc7CisKIAlzd2l0Y2ggKHR5cGUgJiBJUlFfVFlQRV9TRU5TRV9NQVNLKSB7CiAJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKIAkJcGluX3JlZyAmPSB+QklUKExFVkVMX1RSSUdfT0ZGKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWF0OTEuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWF0OTEuYwppbmRleCA4MGRhZWFkLi45ZjA5MDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hdDkxLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYXQ5MS5jCkBAIC0xNjE0LDcgKzE2MTQsNyBAQAogCQkJCSAgICZncGlvX2lycWNoaXAsCiAJCQkJICAgMCwKIAkJCQkgICBoYW5kbGVfZWRnZV9pcnEsCi0JCQkJICAgSVJRX1RZUEVfRURHRV9CT1RIKTsKKwkJCQkgICBJUlFfVFlQRV9OT05FKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImF0OTFfZ3Bpby4lZDogQ291bGRuJ3QgYWRkIGlycWNoaXAgdG8gZ3Bpb2NoaXAuXG4iLAogCQkJYXQ5MV9ncGlvLT5waW9jX2lkeCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1wYWxtYXMuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXBhbG1hcy5jCmluZGV4IDhlZGIzZjhjLi5hMzAxNDZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1wYWxtYXMuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1wYWxtYXMuYwpAQCAtMTAwNCw5ICsxMDA0LDcgQEAKIAlib29sIGVuYWJsZV9kdmZzMiA9IGZhbHNlOwogCiAJaWYgKHBkZXYtPmRldi5vZl9ub2RlKSB7Ci0JCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwotCQltYXRjaCA9IG9mX21hdGNoX2RldmljZShwYWxtYXNfcGluY3RybF9vZl9tYXRjaCwgJnBkZXYtPmRldik7Ci0JCXBpbmN0cmxfZGF0YSA9IG1hdGNoLT5kYXRhOworCQlwaW5jdHJsX2RhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7CiAJCWVuYWJsZV9kdmZzMSA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9kZSwKIAkJCQkJInRpLHBhbG1hcy1lbmFibGUtZHZmczEiKTsKIAkJZW5hYmxlX2R2ZnMyID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcGlzdGFjaGlvLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1waXN0YWNoaW8uYwppbmRleCA3YmFkMjAwLi41NTM3NWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1waXN0YWNoaW8uYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1waXN0YWNoaW8uYwpAQCAtODA5LDE3ICs4MDksMTcgQEAKIAkJCSAgIFBBRFNfRlVOQ1RJT05fU0VMRUNUMiwgMTIsIDB4MyksCiAJTUZJT19NVVhfUElOX0dST1VQKDgzLCBNSVBTX1BMTF9MT0NLLCBNSVBTX1RSQUNFX0RBVEEsIFVTQl9ERUJVRywKIAkJCSAgIFBBRFNfRlVOQ1RJT05fU0VMRUNUMiwgMTQsIDB4MyksCi0JTUZJT19NVVhfUElOX0dST1VQKDg0LCBTWVNfUExMX0xPQ0ssIE1JUFNfVFJBQ0VfREFUQSwgVVNCX0RFQlVHLAorCU1GSU9fTVVYX1BJTl9HUk9VUCg4NCwgQVVESU9fUExMX0xPQ0ssIE1JUFNfVFJBQ0VfREFUQSwgVVNCX0RFQlVHLAogCQkJICAgUEFEU19GVU5DVElPTl9TRUxFQ1QyLCAxNiwgMHgzKSwKLQlNRklPX01VWF9QSU5fR1JPVVAoODUsIFdJRklfUExMX0xPQ0ssIE1JUFNfVFJBQ0VfREFUQSwgU0RIT1NUX0RFQlVHLAorCU1GSU9fTVVYX1BJTl9HUk9VUCg4NSwgUlBVX1ZfUExMX0xPQ0ssIE1JUFNfVFJBQ0VfREFUQSwgU0RIT1NUX0RFQlVHLAogCQkJICAgUEFEU19GVU5DVElPTl9TRUxFQ1QyLCAxOCwgMHgzKSwKLQlNRklPX01VWF9QSU5fR1JPVVAoODYsIEJUX1BMTF9MT0NLLCBNSVBTX1RSQUNFX0RBVEEsIFNESE9TVF9ERUJVRywKKwlNRklPX01VWF9QSU5fR1JPVVAoODYsIFJQVV9MX1BMTF9MT0NLLCBNSVBTX1RSQUNFX0RBVEEsIFNESE9TVF9ERUJVRywKIAkJCSAgIFBBRFNfRlVOQ1RJT05fU0VMRUNUMiwgMjAsIDB4MyksCi0JTUZJT19NVVhfUElOX0dST1VQKDg3LCBSUFVfVl9QTExfTE9DSywgRFJFUTIsIFNPQ0lGX0RFQlVHLAorCU1GSU9fTVVYX1BJTl9HUk9VUCg4NywgU1lTX1BMTF9MT0NLLCBEUkVRMiwgU09DSUZfREVCVUcsCiAJCQkgICBQQURTX0ZVTkNUSU9OX1NFTEVDVDIsIDIyLCAweDMpLAotCU1GSU9fTVVYX1BJTl9HUk9VUCg4OCwgUlBVX0xfUExMX0xPQ0ssIERSRVEzLCBTT0NJRl9ERUJVRywKKwlNRklPX01VWF9QSU5fR1JPVVAoODgsIFdJRklfUExMX0xPQ0ssIERSRVEzLCBTT0NJRl9ERUJVRywKIAkJCSAgIFBBRFNfRlVOQ1RJT05fU0VMRUNUMiwgMjQsIDB4MyksCi0JTUZJT19NVVhfUElOX0dST1VQKDg5LCBBVURJT19QTExfTE9DSywgRFJFUTQsIERSRVE1LAorCU1GSU9fTVVYX1BJTl9HUk9VUCg4OSwgQlRfUExMX0xPQ0ssIERSRVE0LCBEUkVRNSwKIAkJCSAgIFBBRFNfRlVOQ1RJT05fU0VMRUNUMiwgMjYsIDB4MyksCiAJUElOX0dST1VQKFRDSywgInRjayIpLAogCVBJTl9HUk9VUChUUlNUTiwgInRyc3RuIiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1yb2NrY2hpcC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcm9ja2NoaXAuYwppbmRleCA0NDkwMmM2Li40OWJmN2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1yb2NrY2hpcC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXJvY2tjaGlwLmMKQEAgLTIzLDcgKzIzLDcgQEAKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpAQCAtMjcwNCw3ICsyNzA0LDYgQEAKIAkJLmRhdGEgPSAodm9pZCAqKSZyazMzOTlfcGluX2N0cmwgfSwKIAl7fSwKIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByb2NrY2hpcF9waW5jdHJsX2R0X21hdGNoKTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcm9ja2NoaXBfcGluY3RybF9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IHJvY2tjaGlwX3BpbmN0cmxfcHJvYmUsCkBAIC0yNzIwLDcgKzI3MTksMyBAQAogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnJvY2tjaGlwX3BpbmN0cmxfZHJpdmVyKTsKIH0KIHBvc3Rjb3JlX2luaXRjYWxsKHJvY2tjaGlwX3BpbmN0cmxfZHJ2X3JlZ2lzdGVyKTsKLQotTU9EVUxFX0FVVEhPUigiSGVpa28gU3R1ZWJuZXIgPGhlaWtvQHNudGVjaC5kZT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUm9ja2NoaXAgcGluY3RybCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN0LmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdC5jCmluZGV4IDBkZTFjNjcuLjk5ZGE0Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN0LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3QuYwpAQCAtMzM1LDYxICszMzUsMjUgQEAKIH07CiAKIC8qIFNPQyBzcGVjaWZpYyBkYXRhICovCi0vKiBTVGlINDE1IGRhdGEgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RpaDQxNV9pbnB1dF9kZWxheXNbXSA9IHswLCA1MDAsIDEwMDAsIDE1MDB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzdGloNDE1X291dHB1dF9kZWxheXNbXSA9IHswLCAxMDAwLCAyMDAwLCAzMDAwfTsKIAotI2RlZmluZSBTVElINDE1X1BDVFJMX0NPTU1PTl9EQVRBCQkJCVwKLQkucnRfc3R5bGUJPSBzdF9yZXRpbWVfc3R5bGVfcGFja2VkLAkJXAotCS5pbnB1dF9kZWxheXMJPSBzdGloNDE1X2lucHV0X2RlbGF5cywJCQlcCi0JLm5pbnB1dF9kZWxheXMJPSBBUlJBWV9TSVpFKHN0aWg0MTVfaW5wdXRfZGVsYXlzKSwJXAotCS5vdXRwdXRfZGVsYXlzID0gc3RpaDQxNV9vdXRwdXRfZGVsYXlzLAkJCVwKLQkubm91dHB1dF9kZWxheXMgPSBBUlJBWV9TSVpFKHN0aWg0MTVfb3V0cHV0X2RlbGF5cykKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzdF9wY3RsX2RhdGEgIHN0aWg0MTVfc2JjX2RhdGEgPSB7Ci0JU1RJSDQxNV9QQ1RSTF9DT01NT05fREFUQSwKLQkuYWx0ID0gMCwgLm9lID0gNSwgLnB1ID0gNywgLm9kID0gOSwgLnJ0ID0gMTYsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAgc3RpaDQxNV9mcm9udF9kYXRhID0gewotCVNUSUg0MTVfUENUUkxfQ09NTU9OX0RBVEEsCi0JLmFsdCA9IDAsIC5vZSA9IDgsIC5wdSA9IDEwLCAub2QgPSAxMiwgLnJ0ID0gMTYsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAgc3RpaDQxNV9yZWFyX2RhdGEgPSB7Ci0JU1RJSDQxNV9QQ1RSTF9DT01NT05fREFUQSwKLQkuYWx0ID0gMCwgLm9lID0gNiwgLnB1ID0gOCwgLm9kID0gMTAsIC5ydCA9IDM4LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzdF9wY3RsX2RhdGEgIHN0aWg0MTVfbGVmdF9kYXRhID0gewotCVNUSUg0MTVfUENUUkxfQ09NTU9OX0RBVEEsCi0JLmFsdCA9IDAsIC5vZSA9IDMsIC5wdSA9IDQsIC5vZCA9IDUsIC5ydCA9IDYsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAgc3RpaDQxNV9yaWdodF9kYXRhID0gewotCVNUSUg0MTVfUENUUkxfQ09NTU9OX0RBVEEsCi0JLmFsdCA9IDAsIC5vZSA9IDUsIC5wdSA9IDcsIC5vZCA9IDksIC5ydCA9IDExLAotfTsKLQotLyogU1RpSDQxNiBkYXRhICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0aWg0MTZfZGVsYXlzW10gPSB7MCwgMzAwLCA1MDAsIDc1MCwgMTAwMCwgMTI1MCwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RpaDQwN19kZWxheXNbXSA9IHswLCAzMDAsIDUwMCwgNzUwLCAxMDAwLCAxMjUwLAogCQkJMTUwMCwgMTc1MCwgMjAwMCwgMjI1MCwgMjUwMCwgMjc1MCwgMzAwMCwgMzI1MCB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN0X3BjdGxfZGF0YSAgc3RpaDQxNl9kYXRhID0gewotCS5ydF9zdHlsZQk9IHN0X3JldGltZV9zdHlsZV9kZWRpY2F0ZWQsCi0JLmlucHV0X2RlbGF5cwk9IHN0aWg0MTZfZGVsYXlzLAotCS5uaW5wdXRfZGVsYXlzCT0gQVJSQVlfU0laRShzdGloNDE2X2RlbGF5cyksCi0JLm91dHB1dF9kZWxheXMJPSBzdGloNDE2X2RlbGF5cywKLQkubm91dHB1dF9kZWxheXMgPSBBUlJBWV9TSVpFKHN0aWg0MTZfZGVsYXlzKSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RfcGN0bF9kYXRhICBzdGloNDA3X2RhdGEgPSB7CisJLnJ0X3N0eWxlICAgICAgID0gc3RfcmV0aW1lX3N0eWxlX2RlZGljYXRlZCwKKwkuaW5wdXRfZGVsYXlzICAgPSBzdGloNDA3X2RlbGF5cywKKwkubmlucHV0X2RlbGF5cyAgPSBBUlJBWV9TSVpFKHN0aWg0MDdfZGVsYXlzKSwKKwkub3V0cHV0X2RlbGF5cyAgPSBzdGloNDA3X2RlbGF5cywKKwkubm91dHB1dF9kZWxheXMgPSBBUlJBWV9TSVpFKHN0aWg0MDdfZGVsYXlzKSwKIAkuYWx0ID0gMCwgLm9lID0gNDAsIC5wdSA9IDUwLCAub2QgPSA2MCwgLnJ0ID0gMTAwLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzdF9wY3RsX2RhdGEgc3RpaDQwN19mbGFzaGRhdGEgPSB7CiAJLnJ0X3N0eWxlCT0gc3RfcmV0aW1lX3N0eWxlX25vbmUsCi0JLmlucHV0X2RlbGF5cwk9IHN0aWg0MTZfZGVsYXlzLAotCS5uaW5wdXRfZGVsYXlzCT0gQVJSQVlfU0laRShzdGloNDE2X2RlbGF5cyksCi0JLm91dHB1dF9kZWxheXMJPSBzdGloNDE2X2RlbGF5cywKLQkubm91dHB1dF9kZWxheXMgPSBBUlJBWV9TSVpFKHN0aWg0MTZfZGVsYXlzKSwKKwkuaW5wdXRfZGVsYXlzCT0gc3RpaDQwN19kZWxheXMsCisJLm5pbnB1dF9kZWxheXMJPSBBUlJBWV9TSVpFKHN0aWg0MDdfZGVsYXlzKSwKKwkub3V0cHV0X2RlbGF5cwk9IHN0aWg0MDdfZGVsYXlzLAorCS5ub3V0cHV0X2RlbGF5cyA9IEFSUkFZX1NJWkUoc3RpaDQwN19kZWxheXMpLAogCS5hbHQgPSAwLAogCS5vZSA9IC0xLCAvKiBOb3QgQXZhaWxhYmxlICovCiAJLnB1ID0gLTEsIC8qIE5vdCBBdmFpbGFibGUgKi8KQEAgLTc5OSwyMSArNzYzLDYgQEAKIAlyZXR1cm4gKGRpcmVjdGlvbiA9PSBTVF9HUElPX0RJUkVDVElPTl9JTik7CiB9CiAKLXN0YXRpYyBpbnQgc3RfZ3Bpb194bGF0ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKLQkJCWNvbnN0IHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmdwaW9zcGVjLCB1MzIgKmZsYWdzKQotewotCWlmIChXQVJOX09OKGdjLT5vZl9ncGlvX25fY2VsbHMgPCAxKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoV0FSTl9PTihncGlvc3BlYy0+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+CisKKyNpbmNsdWRlICJwaW5jdHJsLXN1bnhpLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfZGVzY19waW4gc3VuNWlfZ3I4X3BpbnNbXSA9IHsKKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyYzAiKSksCQkvKiBTQ0sgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiaTJjMCIpKSwJCS8qIFNEQSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCAyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJwd20wIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAic3BkaWYiKSwJCS8qIERPICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTYpKSwJCS8qIEVJTlQxNiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCAzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpcjAiKSwJCS8qIFRYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTcpKSwJCS8qIEVJTlQxNyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCA0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpcjAiKSwJCS8qIFJYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTgpKSwJCS8qIEVJTlQxOCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCA1KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpMnMwIiksCQkvKiBNQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTkpKSwJCS8qIEVJTlQxOSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCA2KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpMnMwIiksCQkvKiBCQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMjApKSwJCS8qIEVJTlQyMCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCA3KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpMnMwIiksCQkvKiBMUkNLICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMjEpKSwJCS8qIEVJTlQyMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCA4KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJpMnMwIiksCQkvKiBETyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDIyKSksCQkvKiBFSU5UMjIgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgOSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiaTJzMCIpLAkJLyogREkgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJzcGRpZiIpLAkJLyogREkgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyMykpLAkJLyogRUlOVDIzICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDEwKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkyIiksCQkvKiBDUzEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJzcGRpZiIpLAkJLyogRE8gKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyNCkpLAkJLyogRUlOVDI0ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDExKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkyIiksCQkvKiBDUzAgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJqdGFnIiksCQkvKiBNUzAgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyNSkpLAkJLyogRUlOVDI1ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDEyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkyIiksCQkvKiBDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJqdGFnIiksCQkvKiBDSzAgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAyNikpLAkJLyogRUlOVDI2ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEIsIDEzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkyIiksCQkvKiBNT1NJICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAianRhZyIpLAkJLyogRE8wICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMjcpKSwJCS8qIEVJTlQyNyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihCLCAxNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAic3BpMiIpLAkJLyogTUlTTyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImp0YWciKSwJCS8qIERJMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDI4KSksCQkvKiBFSU5UMjggKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTUpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyYzEiKSksCQkvKiBTQ0sgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTYpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyYzEiKSksCQkvKiBTREEgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTcpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyYzIiKSksCQkvKiBTQ0sgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQiwgMTgpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImkyYzIiKSksCQkvKiBTREEgKi8KKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBOV0UgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJzcGkwIikpLAkJLyogTU9TSSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAxKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTkFMRSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInNwaTAiKSksCQkvKiBNSVNPICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBOQ0xFICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAic3BpMCIpKSwJCS8qIENMSyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTkNFMSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInNwaTAiKSksCQkvKiBDUzAgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSksCS8qIE5DRTAgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgNSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSksCS8qIE5SRSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCA2KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTlJCMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgIm1tYzIiKSksCQkvKiBDTUQgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgNyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5SQjEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtbWMyIikpLAkJLyogQ0xLICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDgpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBORFEwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibW1jMiIpKSwJCS8qIEQwICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDkpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBORFExICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibW1jMiIpKSwJCS8qIEQxICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDEwKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTkRRMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgIm1tYzIiKSksCQkvKiBEMiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAxMSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5EUTMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtbWMyIikpLAkJLyogRDMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgMTIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBORFE0ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibW1jMiIpKSwJCS8qIEQ0ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEMsIDEzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJuYW5kMCIpLAkJLyogTkRRNSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgIm1tYzIiKSksCQkvKiBENSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAxNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5EUTYgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJtbWMyIikpLAkJLyogRDYgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQywgMTUpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm5hbmQwIiksCQkvKiBORFE3ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibW1jMiIpKSwJCS8qIEQ3ICovCisJLyogSG9sZSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihDLCAxOSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibmFuZDAiKSwJCS8qIE5EUVMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJ1YXJ0MiIpLAkJLyogUlggKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJ1YXJ0MyIpKSwJLyogUlRTICovCisJLyogSG9sZSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQyIikpLAkvKiBUWCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQyIikpLAkvKiBSWCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCA0KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBENCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQyIikpLAkvKiBDVFMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgNSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDUgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJ1YXJ0MiIpKSwJLyogUlRTICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDYpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQ2ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVDUlMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgNyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDcgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRUNPTCAqLworCS8qIEhvbGUgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMTApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQxMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFUlhEMCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAxMSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDExICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVSWEQxICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDEyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMTIgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVJYRDIgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMTMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQxMyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFUlhEMyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAxNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDE0ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVSWENLICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDE1KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMTUgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVJYRVJSICovCisJLyogSG9sZSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAxOCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDE4ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVSWERWICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDE5KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMTkgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVRYRDAgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMjApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQyMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFVFhEMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyMSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogRDIxICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVUWEQyICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDIyKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBEMjIgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRVRYRDMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRCwgMjMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImxjZDAiKSwJCS8qIEQyMyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFVFhFTiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiZW1hYyIpKSwJCS8qIEVUWENLICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEQsIDI1KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJsY2QwIiksCQkvKiBERSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImVtYWMiKSksCQkvKiBFVFhFUlIqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyNiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogSFNZTkMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRU1EQyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihELCAyNyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibGNkMCIpLAkJLyogVlNZTkMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJlbWFjIikpLAkJLyogRU1ESU8gKi8KKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIFBDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJzcGkyIiksCQkvKiBDUzAgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxNCkpLAkJLyogRUlOVDE0ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDEpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIEVSUiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIE1DTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJzcGkyIiksCQkvKiBDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxNSkpLAkJLyogRUlOVDE1ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIFNZTkMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJjc2kwIiksCQkvKiBIU1lOQyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgInNwaTIiKSksCQkvKiBNT1NJICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInRzMCIpLAkJLyogRFZMRCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIFZTWU5DICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAic3BpMiIpKSwJCS8qIE1JU08gKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidHMwIiksCQkvKiBEMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIEQwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMiIpKSwJCS8qIEQwICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDUpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInRzMCIpLAkJLyogRDEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJjc2kwIiksCQkvKiBEMSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzIiKSksCQkvKiBEMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihFLCA2KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIEQyICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiY3NpMCIpLAkJLyogRDIgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJtbWMyIikpLAkJLyogRDIgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgNyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidHMwIiksCQkvKiBEMyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIEQzICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMiIpKSwJCS8qIEQzICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDgpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInRzMCIpLAkJLyogRDQgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJjc2kwIiksCQkvKiBENCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgIm1tYzIiKSksCQkvKiBDTUQgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRSwgOSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidHMwIiksCQkvKiBENSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIEQ1ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAibW1jMiIpKSwJCS8qIENMSyAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihFLCAxMCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidHMwIiksCQkvKiBENiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgImNzaTAiKSwJCS8qIEQ2ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAidWFydDEiKSksCS8qIFRYICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEUsIDExKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ0czAiKSwJCS8qIEQ3ICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAiY3NpMCIpLAkJLyogRDcgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJ1YXJ0MSIpKSwJLyogUlggKi8KKwkvKiBIb2xlICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEYsIDApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSwJCS8qIEQxICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAianRhZyIpKSwJCS8qIE1TMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihGLCAxKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMwIiksCQkvKiBEMCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgImp0YWciKSksCQkvKiBESTEgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRiwgMiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMCIpLAkJLyogQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAidWFydDAiKSksCS8qIFRYICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEYsIDMpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzAiKSwJCS8qIENNRCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgImp0YWciKSksCQkvKiBETzEgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRiwgNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMCIpLAkJLyogRDMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJ1YXJ0MCIpKSwJLyogUlggKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRiwgNSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMCIpLAkJLyogRDIgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDQsICJqdGFnIikpLAkJLyogQ0sxICovCisJLyogSG9sZSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAwKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiZ3BzIiksCQkvKiBDTEsgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAwKSksCQkvKiBFSU5UMCAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAxKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAiZ3BzIiksCQkvKiBTSUdOICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMSkpLAkJLyogRUlOVDEgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgMiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgImdwcyIpLAkJLyogTUFHICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMikpLAkJLyogRUlOVDIgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgMyksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMSIpLAkJLyogQ01EICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibXMiKSwJCS8qIEJTICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAidWFydDEiKSwJCS8qIFRYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMykpLAkJLyogRUlOVDMgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgNCksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAibW1jMSIpLAkJLyogQ0xLICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibXMiKSwJCS8qIENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NCwgInVhcnQxIiksCQkvKiBSWCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDQpKSwJCS8qIEVJTlQ0ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDUpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzEiKSwJCS8qIEQwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibXMiKSwJCS8qIEQwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAidWFydDEiKSwJCS8qIENUUyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDUpKSwJCS8qIEVJTlQ1ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDYpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzEiKSwJCS8qIEQxICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibXMiKSwJCS8qIEQxICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg0LCAidWFydDEiKSwJCS8qIFJUUyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NSwgInVhcnQyIiksCQkvKiBSVFMgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCA2KSksCQkvKiBFSU5UNiAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCA3KSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJtbWMxIiksCQkvKiBEMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgIm1zIiksCQkvKiBEMiAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4NSwgInVhcnQyIiksCQkvKiBUWCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDcpKSwJCS8qIEVJTlQ3ICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDgpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgIm1tYzEiKSwJCS8qIEQzICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAibXMiKSwJCS8qIEQzICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHg1LCAidWFydDIiKSwJCS8qIFJYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgOCkpLAkJLyogRUlOVDggKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgOSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAic3BpMSIpLAkJLyogQ1MwICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAidWFydDMiKSwJCS8qIFRYICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgOSkpLAkJLyogRUlOVDkgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgMTApLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInNwaTEiKSwJCS8qIENMSyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQzIiksCQkvKiBSWCAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDEwKSksCQkvKiBFSU5UMTAgKi8KKwlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oRywgMTEpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInNwaTEiKSwJCS8qIE1PU0kgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJ1YXJ0MyIpLAkJLyogQ1RTICovCisJCSAgU1VOWElfRlVOQ1RJT05fSVJRKDB4NiwgMTEpKSwJCS8qIEVJTlQxMSAqLworCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAxMiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAorCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAic3BpMSIpLAkJLyogTUlTTyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInVhcnQzIiksCQkvKiBSVFMgKi8KKwkJICBTVU5YSV9GVU5DVElPTl9JUlEoMHg2LCAxMikpLAkJLyogRUlOVDEyICovCisJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDEzKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJzcGkxIiksCQkvKiBDUzEgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDMsICJwd20xIiksCisJCSAgU1VOWElfRlVOQ1RJT04oMHg1LCAidWFydDIiKSwJCS8qIENUUyAqLworCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUSgweDYsIDEzKSksCQkvKiBFSU5UMTMgKi8KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VueGlfcGluY3RybF9kZXNjIHN1bjVpX2dyOF9waW5jdHJsX2RhdGEgPSB7CisJLnBpbnMgPSBzdW41aV9ncjhfcGlucywKKwkubnBpbnMgPSBBUlJBWV9TSVpFKHN1bjVpX2dyOF9waW5zKSwKKwkuaXJxX2JhbmtzID0gMSwKK307CisKK3N0YXRpYyBpbnQgc3VuNWlfZ3I4X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gc3VueGlfcGluY3RybF9pbml0KHBkZXYsCisJCQkJICAmc3VuNWlfZ3I4X3BpbmN0cmxfZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjVpX2dyOF9waW5jdHJsX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJuZXh0dGhpbmcsZ3I4LXBpbmN0cmwiLCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VuNWlfZ3I4X3BpbmN0cmxfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzdW41aV9ncjhfcGluY3RybF9kcml2ZXIgPSB7CisJLnByb2JlCT0gc3VuNWlfZ3I4X3BpbmN0cmxfcHJvYmUsCisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJCT0gImdyOC1waW5jdHJsIiwKKwkJLm9mX21hdGNoX3RhYmxlCT0gc3VuNWlfZ3I4X3BpbmN0cmxfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN1bjVpX2dyOF9waW5jdHJsX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIk15bGVuZSBKb3NzZXJhbmQgPG15bGVuZS5qb3NzZXJhbmRAZnJlZS1lbGVjdHJvbnMuY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5leHRUaGluZyBHUjggcGluY3RybCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjZpLWEzMS5jIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNmktYTMxLmMKaW5kZXggMDIyODYzYS4uYTcwYjUyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNmktYTMxLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNmktYTMxLmMKQEAgLTg5NiwxMCArODk2LDE4IEBACiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSksCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEgsIDI3KSwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCi0JCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSksCisJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKKwkJLyoKKwkJICogVGhlIFNQRElGIGJsb2NrIGlzIG5vdCByZWZlcmVuY2VkIGF0IGFsbCBpbiB0aGUgQTMxIHVzZXIKKwkJICogbWFudWFsLiBIb3dldmVyIGl0IGlzIGRlc2NyaWJlZCBpbiB0aGUgY29kZSBsZWFrZWQgYW5kIHRoZQorCQkgKiBjb25maWd1cmF0aW9uIGZpbGVzIHN1cHBsaWVkIGJ5IHZlbmRvcnMuCisJCSAqLworCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInNwZGlmIikpLCAgICAgICAgLyogU1BESUYgSU4gKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oSCwgMjgpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpKSwKKwkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAorCQkvKiBVbmRvY3VtZW50ZWQgbXV4IGZ1bmN0aW9uIC0gc2VlIGFib3ZlICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgzLCAic3BkaWYiKSksICAgICAgICAvKiBTUERJRiBPVVQgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oSCwgMjkpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktYTIzLmMgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1hMjMuYwppbmRleCBjZTQ4M2IwLi5mOWQ2NjFlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktYTIzLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktYTIzLmMKQEAgLTQ4NSwxMiArNDg1LDEyIEBACiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDgpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInVhcnQyIiksCQkvKiBSVFMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ1YXJ0MSIpLAkJLyogUlRTICovCiAJCSAgU1VOWElfRlVOQ1RJT05fSVJRX0JBTksoMHg0LCAyLCA4KSksCS8qIFBHX0VJTlQ4ICovCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDkpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MCwgImdwaW9faW4iKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDEsICJncGlvX291dCIpLAotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MiwgInVhcnQyIiksCQkvKiBDVFMgKi8KKwkJICBTVU5YSV9GVU5DVElPTigweDIsICJ1YXJ0MSIpLAkJLyogQ1RTICovCiAJCSAgU1VOWElfRlVOQ1RJT05fSVJRX0JBTksoMHg0LCAyLCA5KSksCS8qIFBHX0VJTlQ5ICovCiAJU1VOWElfUElOKFNVTlhJX1BJTkNUUkxfUElOKEcsIDEwKSwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1hMzMuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWEzMy5jCmluZGV4IDMwNDBhYmUuLjMxMzFjYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWEzMy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWEzMy5jCkBAIC00MDcsMTIgKzQwNywxMiBAQAogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCA4KSwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDIsICJ1YXJ0MiIpLAkJLyogUlRTICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidWFydDEiKSwJCS8qIFJUUyAqLwogCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUV9CQU5LKDB4NCwgMSwgOCkpLAkvKiBQR19FSU5UOCAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCA5KSwKIAkJICBTVU5YSV9GVU5DVElPTigweDAsICJncGlvX2luIiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgxLCAiZ3Bpb19vdXQiKSwKLQkJICBTVU5YSV9GVU5DVElPTigweDIsICJ1YXJ0MiIpLAkJLyogQ1RTICovCisJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAidWFydDEiKSwJCS8qIENUUyAqLwogCQkgIFNVTlhJX0ZVTkNUSU9OX0lSUV9CQU5LKDB4NCwgMSwgOSkpLAkvKiBQR19FSU5UOSAqLwogCVNVTlhJX1BJTihTVU5YSV9QSU5DVFJMX1BJTihHLCAxMCksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktaDMuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWgzLmMKaW5kZXggMjZhMmFkMy4uNTE4YTkyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktaDMuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1oMy5jCkBAIC02MCw3ICs2MCw2IEBACiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLAogCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MSwgImdwaW9fb3V0IiksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgyLCAic2ltIiksCQkvKiBQV1JFTiAqLwotCQkgIFNVTlhJX0ZVTkNUSU9OKDB4MywgInB3bTEiKSwKIAkJICBTVU5YSV9GVU5DVElPTl9JUlFfQkFOSygweDYsIDAsIDYpKSwJLyogUEFfRUlOVDYgKi8KIAlTVU5YSV9QSU4oU1VOWElfUElOQ1RSTF9QSU4oQSwgNyksCiAJCSAgU1VOWElfRlVOQ1RJT04oMHgwLCAiZ3Bpb19pbiIpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VueGkuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bnhpLmMKaW5kZXggNTQ0NTVhZi4uMGZhY2JlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VueGkuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW54aS5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAiLi4vY29yZS5oIgotI2luY2x1ZGUgIi4uLy4uL2dwaW8vZ3Bpb2xpYi5oIgogI2luY2x1ZGUgInBpbmN0cmwtc3VueGkuaCIKIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBzdW54aV9waW5jdHJsX2VkZ2VfaXJxX2NoaXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL2Nocm9tZS9jcm9zX2VjX3Byb3RvLmMgYi9kcml2ZXJzL3BsYXRmb3JtL2Nocm9tZS9jcm9zX2VjX3Byb3RvLmMKaW5kZXggNmMwODRiMi4uMDQwNTNmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS9jaHJvbWUvY3Jvc19lY19wcm90by5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vY2hyb21lL2Nyb3NfZWNfcHJvdG8uYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNkZWZpbmUgRUNfQ09NTUFORF9SRVRSSUVTCTUwCiAKQEAgLTIzNCwxMSArMjM1LDQ0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBjcm9zX2VjX2dldF9ob3N0X2NvbW1hbmRfdmVyc2lvbl9tYXNrKHN0cnVjdCBjcm9zX2VjX2RldmljZSAqZWNfZGV2LAorCXUxNiBjbWQsIHUzMiAqbWFzaykKK3sKKwlzdHJ1Y3QgZWNfcGFyYW1zX2dldF9jbWRfdmVyc2lvbnMgKnB2ZXI7CisJc3RydWN0IGVjX3Jlc3BvbnNlX2dldF9jbWRfdmVyc2lvbnMgKnJ2ZXI7CisJc3RydWN0IGNyb3NfZWNfY29tbWFuZCAqbXNnOworCWludCByZXQ7CisKKwltc2cgPSBrbWFsbG9jKHNpemVvZigqbXNnKSArIG1heChzaXplb2YoKnJ2ZXIpLCBzaXplb2YoKnB2ZXIpKSwKKwkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJbXNnLT52ZXJzaW9uID0gMDsKKwltc2ctPmNvbW1hbmQgPSBFQ19DTURfR0VUX0NNRF9WRVJTSU9OUzsKKwltc2ctPmluc2l6ZSA9IHNpemVvZigqcnZlcik7CisJbXNnLT5vdXRzaXplID0gc2l6ZW9mKCpwdmVyKTsKKworCXB2ZXIgPSAoc3RydWN0IGVjX3BhcmFtc19nZXRfY21kX3ZlcnNpb25zICopbXNnLT5kYXRhOworCXB2ZXItPmNtZCA9IGNtZDsKKworCXJldCA9IGNyb3NfZWNfY21kX3hmZXIoZWNfZGV2LCBtc2cpOworCWlmIChyZXQgPiAwKSB7CisJCXJ2ZXIgPSAoc3RydWN0IGVjX3Jlc3BvbnNlX2dldF9jbWRfdmVyc2lvbnMgKiltc2ctPmRhdGE7CisJCSptYXNrID0gcnZlci0+dmVyc2lvbl9tYXNrOworCX0KKworCWtmcmVlKG1zZyk7CisKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgY3Jvc19lY19xdWVyeV9hbGwoc3RydWN0IGNyb3NfZWNfZGV2aWNlICplY19kZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gZWNfZGV2LT5kZXY7CiAJc3RydWN0IGNyb3NfZWNfY29tbWFuZCAqcHJvdG9fbXNnOwogCXN0cnVjdCBlY19yZXNwb25zZV9nZXRfcHJvdG9jb2xfaW5mbyAqcHJvdG9faW5mbzsKKwl1MzIgdmVyX21hc2sgPSAwOwogCWludCByZXQ7CiAKIAlwcm90b19tc2cgPSBremFsbG9jKHNpemVvZigqcHJvdG9fbXNnKSArIHNpemVvZigqcHJvdG9faW5mbyksCkBAIC0zMjgsNiArMzYyLDE1IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKKwkvKiBQcm9iZSBpZiBNS0JQIGV2ZW50IGlzIHN1cHBvcnRlZCAqLworCXJldCA9IGNyb3NfZWNfZ2V0X2hvc3RfY29tbWFuZF92ZXJzaW9uX21hc2soZWNfZGV2LAorCQkJCQkJICAgIEVDX0NNRF9HRVRfTkVYVF9FVkVOVCwKKwkJCQkJCSAgICAmdmVyX21hc2spOworCWlmIChyZXQgPCAwIHx8IHZlcl9tYXNrID09IDApCisJCWVjX2Rldi0+bWticF9ldmVudF9zdXBwb3J0ZWQgPSAwOworCWVsc2UKKwkJZWNfZGV2LT5ta2JwX2V2ZW50X3N1cHBvcnRlZCA9IDE7CisKIGV4aXQ6CiAJa2ZyZWUocHJvdG9fbXNnKTsKIAlyZXR1cm4gcmV0OwpAQCAtMzk3LDMgKzQ0MCw1MiBAQAogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGNyb3NfZWNfY21kX3hmZXJfc3RhdHVzKTsKKworc3RhdGljIGludCBnZXRfbmV4dF9ldmVudChzdHJ1Y3QgY3Jvc19lY19kZXZpY2UgKmVjX2RldikKK3sKKwl1OCBidWZmZXJbc2l6ZW9mKHN0cnVjdCBjcm9zX2VjX2NvbW1hbmQpICsgc2l6ZW9mKGVjX2Rldi0+ZXZlbnRfZGF0YSldOworCXN0cnVjdCBjcm9zX2VjX2NvbW1hbmQgKm1zZyA9IChzdHJ1Y3QgY3Jvc19lY19jb21tYW5kICopJmJ1ZmZlcjsKKwlpbnQgcmV0OworCisJbXNnLT52ZXJzaW9uID0gMDsKKwltc2ctPmNvbW1hbmQgPSBFQ19DTURfR0VUX05FWFRfRVZFTlQ7CisJbXNnLT5pbnNpemUgPSBzaXplb2YoZWNfZGV2LT5ldmVudF9kYXRhKTsKKwltc2ctPm91dHNpemUgPSAwOworCisJcmV0ID0gY3Jvc19lY19jbWRfeGZlcihlY19kZXYsIG1zZyk7CisJaWYgKHJldCA+IDApIHsKKwkJZWNfZGV2LT5ldmVudF9zaXplID0gcmV0IC0gMTsKKwkJbWVtY3B5KCZlY19kZXYtPmV2ZW50X2RhdGEsIG1zZy0+ZGF0YSwKKwkJICAgICAgIHNpemVvZihlY19kZXYtPmV2ZW50X2RhdGEpKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdldF9rZXlib2FyZF9zdGF0ZV9ldmVudChzdHJ1Y3QgY3Jvc19lY19kZXZpY2UgKmVjX2RldikKK3sKKwl1OCBidWZmZXJbc2l6ZW9mKHN0cnVjdCBjcm9zX2VjX2NvbW1hbmQpICsKKwkJICBzaXplb2YoZWNfZGV2LT5ldmVudF9kYXRhLmRhdGEpXTsKKwlzdHJ1Y3QgY3Jvc19lY19jb21tYW5kICptc2cgPSAoc3RydWN0IGNyb3NfZWNfY29tbWFuZCAqKSZidWZmZXI7CisKKwltc2ctPnZlcnNpb24gPSAwOworCW1zZy0+Y29tbWFuZCA9IEVDX0NNRF9NS0JQX1NUQVRFOworCW1zZy0+aW5zaXplID0gc2l6ZW9mKGVjX2Rldi0+ZXZlbnRfZGF0YS5kYXRhKTsKKwltc2ctPm91dHNpemUgPSAwOworCisJZWNfZGV2LT5ldmVudF9zaXplID0gY3Jvc19lY19jbWRfeGZlcihlY19kZXYsIG1zZyk7CisJZWNfZGV2LT5ldmVudF9kYXRhLmV2ZW50X3R5cGUgPSBFQ19NS0JQX0VWRU5UX0tFWV9NQVRSSVg7CisJbWVtY3B5KCZlY19kZXYtPmV2ZW50X2RhdGEuZGF0YSwgbXNnLT5kYXRhLAorCSAgICAgICBzaXplb2YoZWNfZGV2LT5ldmVudF9kYXRhLmRhdGEpKTsKKworCXJldHVybiBlY19kZXYtPmV2ZW50X3NpemU7Cit9CisKK2ludCBjcm9zX2VjX2dldF9uZXh0X2V2ZW50KHN0cnVjdCBjcm9zX2VjX2RldmljZSAqZWNfZGV2KQoreworCWlmIChlY19kZXYtPm1rYnBfZXZlbnRfc3VwcG9ydGVkKQorCQlyZXR1cm4gZ2V0X25leHRfZXZlbnQoZWNfZGV2KTsKKwllbHNlCisJCXJldHVybiBnZXRfa2V5Ym9hcmRfc3RhdGVfZXZlbnQoZWNfZGV2KTsKK30KK0VYUE9SVF9TWU1CT0woY3Jvc19lY19nZXRfbmV4dF9ldmVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL29scGMvb2xwYy1lYy5jIGIvZHJpdmVycy9wbGF0Zm9ybS9vbHBjL29scGMtZWMuYwppbmRleCBmOTliMTgzLi4zNzRhODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL29scGMvb2xwYy1lYy5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0vb2xwYy9vbHBjLWVjLmMKQEAgLTEsNiArMSw4IEBACiAvKgogICogR2VuZXJpYyBkcml2ZXIgZm9yIHRoZSBPTFBDIEVtYmVkZGVkIENvbnRyb2xsZXIuCiAgKgorICogQXV0aG9yOiBBbmRyZXMgU2Fsb21vbiA8ZGlsaW5nZXJAcXVldWVkLm5ldD4KKyAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBPbmUgTGFwdG9wIHBlciBDaGlsZCBGb3VuZGF0aW9uLgogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdjIgb3IgbGF0ZXIuCkBAIC0xMiw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+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+ZGV2LCAiZmFpbGVkOiBjcmVhdGUgc3lzZnMgZW50cnlcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXBzeV9jZmcuZHJ2X2RhdGEgPSBjaGc7Ci0JY2hnLT5jaGFyZ2VyID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZtYXgxNDU3N19jaGFyZ2VyX2Rlc2MsCi0JCQkJCQkmcHN5X2NmZyk7Ci0JaWYgKElTX0VSUihjaGctPmNoYXJnZXIpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKLQkJcmV0ID0gUFRSX0VSUihjaGctPmNoYXJnZXIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBDaGVjayBmb3IgdmFsaWQgdmFsdWVzIGZvciBjaGFyZ2VyICovCi0JQlVJTERfQlVHX09OKE1BWDE0NTc3X0NIQVJHRVJfRU9DX0NVUlJFTlRfTElNSVRfTUlOICsKLQkJCU1BWDE0NTc3X0NIQVJHRVJfRU9DX0NVUlJFTlRfTElNSVRfU1RFUCAqIDB4ZiAhPQotCQkJTUFYMTQ1NzdfQ0hBUkdFUl9FT0NfQ1VSUkVOVF9MSU1JVF9NQVgpOwotCXJldHVybiAwOwotCi1lcnI6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9mYXN0X2NoYXJnZV90aW1lcik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1heDE0NTc3X2NoYXJnZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9mYXN0X2NoYXJnZV90aW1lcik7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoY2hnLT5jaGFyZ2VyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBtYXgxNDU3N19jaGFyZ2VyX2lkW10gPSB7Ci0JeyAibWF4MTQ1NzctY2hhcmdlciIsIE1BWElNX0RFVklDRV9UWVBFX01BWDE0NTc3LCB9LAotCXsgIm1heDc3ODM2LWNoYXJnZXIiLCBNQVhJTV9ERVZJQ0VfVFlQRV9NQVg3NzgzNiwgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBtYXgxNDU3N19jaGFyZ2VyX2lkKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWF4MTQ1NzdfY2hhcmdlcl9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAibWF4MTQ1NzctY2hhcmdlciIsCi0JfSwKLQkucHJvYmUJCT0gbWF4MTQ1NzdfY2hhcmdlcl9wcm9iZSwKLQkucmVtb3ZlCQk9IG1heDE0NTc3X2NoYXJnZXJfcmVtb3ZlLAotCS5pZF90YWJsZQk9IG1heDE0NTc3X2NoYXJnZXJfaWQsCi19OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtYXgxNDU3N19jaGFyZ2VyX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIktyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbSAxNDU3Ny83NzgzNiBjaGFyZ2VyIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXg3NzY5M19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL21heDc3NjkzX2NoYXJnZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwY2FiNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL21heDc3NjkzX2NoYXJnZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDc3MSArMCwwIEBACi0vKgotICogbWF4Nzc2OTNfY2hhcmdlci5jIC0gQmF0dGVyeSBjaGFyZ2VyIGRyaXZlciBmb3IgdGhlIE1heGltIDc3NjkzCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqIEtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21heDc3NjkzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL21heDc3NjkzLWNvbW1vbi5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg3NzY5My1wcml2YXRlLmg+Ci0KLSNkZWZpbmUgTUFYNzc2OTNfQ0hBUkdFUl9OQU1FCQkJCSJtYXg3NzY5My1jaGFyZ2VyIgotc3RhdGljIGNvbnN0IGNoYXIgKm1heDc3NjkzX2NoYXJnZXJfbW9kZWwJCT0gIk1BWDc3NjkzIjsKLXN0YXRpYyBjb25zdCBjaGFyICptYXg3NzY5M19jaGFyZ2VyX21hbnVmYWN0dXJlcgk9ICJNYXhpbSBJbnRlZ3JhdGVkIjsKLQotc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgewotCXN0cnVjdCBkZXZpY2UJCSpkZXY7Ci0Jc3RydWN0IG1heDc3NjkzX2RldgkqbWF4Nzc2OTM7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseQkqY2hhcmdlcjsKLQotCXUzMiBjb25zdGFudF92b2x0OwotCXUzMiBtaW5fc3lzdGVtX3ZvbHQ7Ci0JdTMyIHRoZXJtYWxfcmVndWxhdGlvbl90ZW1wOwotCXUzMiBiYXR0dGVyeV9vdmVyY3VycmVudDsKLQl1MzIgY2hhcmdlX2lucHV0X3RocmVzaG9sZF92b2x0OwotfTsKLQotc3RhdGljIGludCBtYXg3NzY5M19nZXRfY2hhcmdlcl9zdGF0ZShzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IGRhdGE7Ci0KLQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0RFVEFJTFNfMDEsICZkYXRhKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWRhdGEgJj0gQ0hHX0RFVEFJTFNfMDFfQ0hHX01BU0s7Ci0JZGF0YSA+Pj0gQ0hHX0RFVEFJTFNfMDFfQ0hHX1NISUZUOwotCi0Jc3dpdGNoIChkYXRhKSB7Ci0JY2FzZSBNQVg3NzY5M19DSEFSR0lOR19QUkVRVUFMSUZJQ0FUSU9OOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfRkFTVF9DT05TVF9DVVJSRU5UOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfRkFTVF9DT05TVF9WT0xUQUdFOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVE9QX09GRjoKLQkvKiBJbiBoaWdoIHRlbXAgdGhlIGNoYXJnaW5nIGN1cnJlbnQgaXMgcmVkdWNlZCwgYnV0IHN0aWxsIGNoYXJnaW5nICovCi0JY2FzZSBNQVg3NzY5M19DSEFSR0lOR19ISUdIX1RFTVA6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwotCQlicmVhazsKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0RPTkU6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7Ci0JCWJyZWFrOwotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVElNRVJfRVhQSVJFRDoKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1RIRVJNSVNUT1JfU1VTUEVORDoKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwotCQlicmVhazsKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX09GRjoKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX09WRVJfVEVNUDoKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1dBVENIRE9HX0VYUElSRUQ6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwotCQlicmVhazsKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1JFU0VSVkVEOgotCWRlZmF1bHQ6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfZ2V0X2NoYXJnZV90eXBlKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50ICp2YWwpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgZGF0YTsKLQotCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfREVUQUlMU18wMSwgJmRhdGEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGF0YSAmPSBDSEdfREVUQUlMU18wMV9DSEdfTUFTSzsKLQlkYXRhID4+PSBDSEdfREVUQUlMU18wMV9DSEdfU0hJRlQ7Ci0KLQlzd2l0Y2ggKGRhdGEpIHsKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1BSRVFVQUxJRklDQVRJT046Ci0JLyoKLQkgKiBUb3Atb2ZmOiB0cmlja2xlIG9yIGZhc3Q/IEluIHRvcC1vZmYgdGhlIGN1cnJlbnQgdmFyaWVzIGJldHdlZW4KLQkgKiAxMDAgYW5kIDI1MCBtQS4gSXQgaXMgaGlnaGVyIHRoYW4gcHJlcXVhbGlmaWNhdGlvbiBjdXJyZW50LgotCSAqLwotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVE9QX09GRjoKLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9UUklDS0xFOwotCQlicmVhazsKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0ZBU1RfQ09OU1RfQ1VSUkVOVDoKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0ZBU1RfQ09OU1RfVk9MVEFHRToKLQkvKiBJbiBoaWdoIHRlbXAgdGhlIGNoYXJnaW5nIGN1cnJlbnQgaXMgcmVkdWNlZCwgYnV0IHN0aWxsIGNoYXJnaW5nICovCi0JY2FzZSBNQVg3NzY5M19DSEFSR0lOR19ISUdIX1RFTVA6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfRkFTVDsKLQkJYnJlYWs7Ci0JY2FzZSBNQVg3NzY5M19DSEFSR0lOR19ET05FOgotCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVElNRVJfRVhQSVJFRDoKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1RIRVJNSVNUT1JfU1VTUEVORDoKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX09GRjoKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX09WRVJfVEVNUDoKLQljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1dBVENIRE9HX0VYUElSRUQ6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfTk9ORTsKLQkJYnJlYWs7Ci0JY2FzZSBNQVg3NzY5M19DSEFSR0lOR19SRVNFUlZFRDoKLQlkZWZhdWx0OgotCQkqdmFsID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX1VOS05PV047Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTdXBwb3J0ZWQgaGVhbHRoIHN0YXR1c2VzOgotICogIC0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFECi0gKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0QKLSAqICAtIFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0UKLSAqICAtIFBPV0VSX1NVUFBMWV9IRUFMVEhfU0FGRVRZX1RJTUVSX0VYUElSRQotICogIC0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTktOT1dOCi0gKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFCi0gKi8KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfZ2V0X2JhdHRlcnlfaGVhbHRoKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50ICp2YWwpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBpbnQgZGF0YTsKLQotCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfREVUQUlMU18wMSwgJmRhdGEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGF0YSAmPSBDSEdfREVUQUlMU18wMV9CQVRfTUFTSzsKLQlkYXRhID4+PSBDSEdfREVUQUlMU18wMV9CQVRfU0hJRlQ7Ci0KLQlzd2l0Y2ggKGRhdGEpIHsKLQljYXNlIE1BWDc3NjkzX0JBVFRFUllfTk9CQVQ6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7Ci0JCWJyZWFrOwotCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9QUkVRVUFMSUZJQ0FUSU9OOgotCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9HT09EOgotCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9MT1dWT0xUQUdFOgotCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOwotCQlicmVhazsKLQljYXNlIE1BWDc3NjkzX0JBVFRFUllfVElNRVJfRVhQSVJFRDoKLQkJLyoKLQkJICogVG9vayBsb25nZXIgdG8gY2hhcmdlIHRoYW4gZXhwZWN0ZWQsIGNoYXJnaW5nIHN1c3BlbmRlZC4KLQkJICogRGFtYWdlZCBiYXR0ZXJ5PwotCQkgKi8KLQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfU0FGRVRZX1RJTUVSX0VYUElSRTsKLQkJYnJlYWs7Ci0JY2FzZSBNQVg3NzY5M19CQVRURVJZX09WRVJWT0xUQUdFOgotCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKLQkJYnJlYWs7Ci0JY2FzZSBNQVg3NzY5M19CQVRURVJZX09WRVJDVVJSRU5UOgotCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRTsKLQkJYnJlYWs7Ci0JY2FzZSBNQVg3NzY5M19CQVRURVJZX1JFU0VSVkVEOgotCWRlZmF1bHQ6Ci0JCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1heDc3NjkzX2dldF9wcmVzZW50KHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgaW50ICp2YWwpCi17Ci0JdW5zaWduZWQgaW50IGRhdGE7Ci0JaW50IHJldDsKLQotCS8qCi0JICogUmVhZCBDSEdfSU5UX09LIHJlZ2lzdGVyLiBIaWdoIERFVEJBVCBiaXQgaGVyZSBzaG91bGQgYmUKLQkgKiBlcXVhbCB0byB2YWx1ZSAweDAgaW4gQ0hHX0RFVEFJTFNfMDEvQkFUIGZpZWxkLgotCSAqLwotCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfSU5UX09LLCAmZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkqdmFsID0gKGRhdGEgJiBDSEdfSU5UX09LX0RFVEJBVF9NQVNLKSA/IDAgOiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfZ2V0X29ubGluZShzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQotewotCXVuc2lnbmVkIGludCBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0lOVF9PSywgJmRhdGEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JKnZhbCA9IChkYXRhICYgQ0hHX0lOVF9PS19DSEdJTl9NQVNLKSA/IDEgOiAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBtYXg3NzY5M19jaGFyZ2VyX3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAotCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFLAotCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKLQlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAotCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKLQlQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLAotCVBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwKLX07Ci0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfY2hhcmdlcl9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAotCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKLQkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKLQlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBjaGctPm1heDc3NjkzLT5yZWdtYXA7Ci0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKHBzcCkgewotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgotCQlyZXQgPSBtYXg3NzY5M19nZXRfY2hhcmdlcl9zdGF0ZShyZWdtYXAsICZ2YWwtPmludHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEU6Ci0JCXJldCA9IG1heDc3NjkzX2dldF9jaGFyZ2VfdHlwZShyZWdtYXAsICZ2YWwtPmludHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgotCQlyZXQgPSBtYXg3NzY5M19nZXRfYmF0dGVyeV9oZWFsdGgocmVnbWFwLCAmdmFsLT5pbnR2YWwpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6Ci0JCXJldCA9IG1heDc3NjkzX2dldF9wcmVzZW50KHJlZ21hcCwgJnZhbC0+aW50dmFsKTsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6Ci0JCXJldCA9IG1heDc3NjkzX2dldF9vbmxpbmUocmVnbWFwLCAmdmFsLT5pbnR2YWwpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUU6Ci0JCXZhbC0+c3RydmFsID0gbWF4Nzc2OTNfY2hhcmdlcl9tb2RlbDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVI6Ci0JCXZhbC0+c3RydmFsID0gbWF4Nzc2OTNfY2hhcmdlcl9tYW51ZmFjdHVyZXI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbWF4Nzc2OTNfY2hhcmdlcl9kZXNjID0gewotCS5uYW1lCQk9IE1BWDc3NjkzX0NIQVJHRVJfTkFNRSwKLQkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAotCS5wcm9wZXJ0aWVzCT0gbWF4Nzc2OTNfY2hhcmdlcl9wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDc3NjkzX2NoYXJnZXJfcHJvcHMpLAotCS5nZXRfcHJvcGVydHkJPSBtYXg3NzY5M19jaGFyZ2VyX2dldF9wcm9wZXJ0eSwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IGRldmljZV9hdHRyX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQlpbnQgKCpmbikoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKiwgdW5zaWduZWQgbG9uZykpCi17Ci0Jc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCByZXQ7Ci0KLQlyZXQgPSBrc3RydG91bChidWYsIDEwLCAmdmFsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gZm4oY2hnLCB2YWwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGZhc3RfY2hhcmdlX3RpbWVyX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBpbnQgZGF0YSwgdmFsOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWdtYXBfcmVhZChjaGctPm1heDc3NjkzLT5yZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDEsCi0JCQkmZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlkYXRhICY9IENIR19DTkZHXzAxX0ZDSEdUSU1FX01BU0s7Ci0JZGF0YSA+Pj0gQ0hHX0NORkdfMDFfRkNIR1RJTUVfU0hJRlQ7Ci0Jc3dpdGNoIChkYXRhKSB7Ci0JY2FzZSAweDEgLi4uIDB4NzoKLQkJLyogU3RhcnRpbmcgZnJvbSA0IGhvdXJzLCBzdGVwIGJ5IDIgaG91cnMgKi8KLQkJdmFsID0gNCArIChkYXRhIC0gMSkgKiAyOwotCQlicmVhazsKLQljYXNlIDB4MDoKLQlkZWZhdWx0OgotCQl2YWwgPSAwOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X2Zhc3RfY2hhcmdlX3RpbWVyKHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCi0JCXVuc2lnbmVkIGxvbmcgaG91cnMpCi17Ci0JdW5zaWduZWQgaW50IGRhdGE7Ci0KLQkvKgotCSAqIDB4MDAgLSBkaXNhYmxlCi0JICogMHgwMSAtIDRoCi0JICogMHgwMiAtIDZoCi0JICogLi4uCi0JICogMHgwNyAtIDE2aAotCSAqIFJvdW5kIGRvd24gb2RkIHZhbHVlcy4KLQkgKi8KLQlzd2l0Y2ggKGhvdXJzKSB7Ci0JY2FzZSA0IC4uLiAxNjoKLQkJZGF0YSA9IChob3VycyAtIDQpIC8gMiArIDE7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQkJLyogRGlzYWJsZSAqLwotCQlkYXRhID0gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWRhdGEgPDw9IENIR19DTkZHXzAxX0ZDSEdUSU1FX1NISUZUOwotCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCi0JCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzAxLAotCQkJQ0hHX0NORkdfMDFfRkNIR1RJTUVfTUFTSywgZGF0YSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGZhc3RfY2hhcmdlX3RpbWVyX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXJldHVybiBkZXZpY2VfYXR0cl9zdG9yZShkZXYsIGF0dHIsIGJ1ZiwgY291bnQsCi0JCQltYXg3NzY5M19zZXRfZmFzdF9jaGFyZ2VfdGltZXIpOwotfQotCi1zdGF0aWMgc3NpemVfdCB0b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1bnNpZ25lZCBpbnQgZGF0YSwgdmFsOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWdtYXBfcmVhZChjaGctPm1heDc3NjkzLT5yZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDMsCi0JCQkmZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlkYXRhICY9IENIR19DTkZHXzAzX1RPSVRIX01BU0s7Ci0JZGF0YSA+Pj0gQ0hHX0NORkdfMDNfVE9JVEhfU0hJRlQ7Ci0KLQlpZiAoZGF0YSA8PSAweDA0KQotCQl2YWwgPSAxMDAwMDAgKyBkYXRhICogMjUwMDA7Ci0JZWxzZQotCQl2YWwgPSBkYXRhICogNTAwMDA7Ci0KLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X3RvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnQoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZywKLQkJdW5zaWduZWQgbG9uZyB1YW1wKQotewotCXVuc2lnbmVkIGludCBkYXRhOwotCi0JaWYgKHVhbXAgPCAxMDAwMDAgfHwgdWFtcCA+IDM1MDAwMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodWFtcCA8PSAyMDAwMDApCi0JCWRhdGEgPSAodWFtcCAtIDEwMDAwMCkgLyAyNTAwMDsKLQllbHNlCi0JCS8qICgyMDAwMDAsIDM1MDAwMD4gKi8KLQkJZGF0YSA9IHVhbXAgLyA1MDAwMDsKLQotCWRhdGEgPDw9IENIR19DTkZHXzAzX1RPSVRIX1NISUZUOwotCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCi0JCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzAzLAotCQkJQ0hHX0NORkdfMDNfVE9JVEhfTUFTSywgZGF0YSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHRvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JcmV0dXJuIGRldmljZV9hdHRyX3N0b3JlKGRldiwgYXR0ciwgYnVmLCBjb3VudCwKLQkJCW1heDc3NjkzX3NldF90b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50KTsKLX0KLQotc3RhdGljIHNzaXplX3QgdG9wX29mZl90aW1lcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgaW50IGRhdGEsIHZhbDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVnbWFwX3JlYWQoY2hnLT5tYXg3NzY5My0+cmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzAzLAotCQkJJmRhdGEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGF0YSAmPSBDSEdfQ05GR18wM19UT1RJTUVfTUFTSzsKLQlkYXRhID4+PSBDSEdfQ05GR18wM19UT1RJTUVfU0hJRlQ7Ci0KLQl2YWwgPSBkYXRhICogMTA7Ci0KLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X3RvcF9vZmZfdGltZXIoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZywKLQkJdW5zaWduZWQgbG9uZyBtaW51dGVzKQotewotCXVuc2lnbmVkIGludCBkYXRhOwotCi0JaWYgKG1pbnV0ZXMgPiA3MCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkYXRhID0gbWludXRlcyAvIDEwOwotCWRhdGEgPDw9IENIR19DTkZHXzAzX1RPVElNRV9TSElGVDsKLQotCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hnLT5tYXg3NzY5My0+cmVnbWFwLAotCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wMywKLQkJCUNIR19DTkZHXzAzX1RPVElNRV9NQVNLLCBkYXRhKTsKLX0KLQotc3RhdGljIHNzaXplX3QgdG9wX29mZl90aW1lcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlyZXR1cm4gZGV2aWNlX2F0dHJfc3RvcmUoZGV2LCBhdHRyLCBidWYsIGNvdW50LAotCQkJbWF4Nzc2OTNfc2V0X3RvcF9vZmZfdGltZXIpOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFJfUlcoZmFzdF9jaGFyZ2VfdGltZXIpOwotc3RhdGljIERFVklDRV9BVFRSX1JXKHRvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnQpOwotc3RhdGljIERFVklDRV9BVFRSX1JXKHRvcF9vZmZfdGltZXIpOwotCi1zdGF0aWMgaW50IG1heDc3NjkzX3NldF9jb25zdGFudF92b2x0KHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCi0JCXVuc2lnbmVkIGludCB1dm9sdCkKLXsKLQl1bnNpZ25lZCBpbnQgZGF0YTsKLQotCS8qCi0JICogMHgwMCAtIDMuNjUwIFYKLQkgKiAweDAxIC0gMy42NzUgVgotCSAqIC4uLgotCSAqIDB4MWIgLSA0LjMyNSBWCi0JICogMHgxYyAtIDQuMzQwIFYKLQkgKiAweDFkIC0gNC4zNTAgVgotCSAqIDB4MWUgLSA0LjM3NSBWCi0JICogMHgxZiAtIDQuNDAwIFYKLQkgKi8KLQlpZiAodXZvbHQgPj0gMzY1MDAwMCAmJiB1dm9sdCA8IDQzNDAwMDApCi0JCWRhdGEgPSAodXZvbHQgLSAzNjUwMDAwKSAvIDI1MDAwOwotCWVsc2UgaWYgKHV2b2x0ID49IDQzNDAwMDAgJiYgdXZvbHQgPCA0MzUwMDAwKQotCQlkYXRhID0gMHgxYzsKLQllbHNlIGlmICh1dm9sdCA+PSA0MzUwMDAwICYmIHV2b2x0IDw9IDQ0MDAwMDApCi0JCWRhdGEgPSAweDFkICsgKHV2b2x0IC0gNDM1MDAwMCkgLyAyNTAwMDsKLQllbHNlIHsKLQkJZGV2X2VycihjaGctPmRldiwgIldyb25nIHZhbHVlIGZvciBjaGFyZ2luZyBjb25zdGFudCB2b2x0YWdlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGF0YSA8PD0gQ0hHX0NORkdfMDRfQ0hHQ1ZQUk1fU0hJRlQ7Ci0KLQlkZXZfZGJnKGNoZy0+ZGV2LCAiQ2hhcmdpbmcgY29uc3RhbnQgdm9sdGFnZTogJXUgKDB4JXgpXG4iLCB1dm9sdCwKLQkJCWRhdGEpOwotCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCi0JCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzA0LAotCQkJQ0hHX0NORkdfMDRfQ0hHQ1ZQUk1fTUFTSywgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X21pbl9zeXN0ZW1fdm9sdChzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnLAotCQl1bnNpZ25lZCBpbnQgdXZvbHQpCi17Ci0JdW5zaWduZWQgaW50IGRhdGE7Ci0KLQlpZiAodXZvbHQgPCAzMDAwMDAwIHx8IHV2b2x0ID4gMzcwMDAwMCkgewotCQlkZXZfZXJyKGNoZy0+ZGV2LCAiV3JvbmcgdmFsdWUgZm9yIG1pbmltdW0gc3lzdGVtIHJlZ3VsYXRpb24gdm9sdGFnZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRhdGEgPSAodXZvbHQgLSAzMDAwMDAwKSAvIDEwMDAwMDsKLQotCWRhdGEgPDw9IENIR19DTkZHXzA0X01JTlZTWVNfU0hJRlQ7Ci0KLQlkZXZfZGJnKGNoZy0+ZGV2LCAiTWluaW11bSBzeXN0ZW0gcmVndWxhdGlvbiB2b2x0YWdlOiAldSAoMHgleClcbiIsCi0JCQl1dm9sdCwgZGF0YSk7Ci0KLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwKLQkJCU1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDQsCi0JCQlDSEdfQ05GR18wNF9NSU5WU1lTX01BU0ssIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IG1heDc3NjkzX3NldF90aGVybWFsX3JlZ3VsYXRpb25fdGVtcChzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnLAotCQl1bnNpZ25lZCBpbnQgY2VscykKLXsKLQl1bnNpZ25lZCBpbnQgZGF0YTsKLQotCXN3aXRjaCAoY2VscykgewotCWNhc2UgNzA6Ci0JY2FzZSA4NToKLQljYXNlIDEwMDoKLQljYXNlIDExNToKLQkJZGF0YSA9IChjZWxzIC0gNzApIC8gMTU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoY2hnLT5kZXYsICJXcm9uZyB2YWx1ZSBmb3IgdGhlcm1hbCByZWd1bGF0aW9uIGxvb3AgdGVtcGVyYXR1cmVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkYXRhIDw8PSBDSEdfQ05GR18wN19SRUdURU1QX1NISUZUOwotCi0JZGV2X2RiZyhjaGctPmRldiwgIlRoZXJtYWwgcmVndWxhdGlvbiBsb29wIHRlbXBlcmF0dXJlOiAldSAoMHgleClcbiIsCi0JCQljZWxzLCBkYXRhKTsKLQotCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hnLT5tYXg3NzY5My0+cmVnbWFwLAotCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wNywKLQkJCUNIR19DTkZHXzA3X1JFR1RFTVBfTUFTSywgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X2JhdHR0ZXJ5X292ZXJjdXJyZW50KHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCi0JCXVuc2lnbmVkIGludCB1YW1wKQotewotCXVuc2lnbmVkIGludCBkYXRhOwotCi0JaWYgKHVhbXAgJiYgKHVhbXAgPCAyMDAwMDAwIHx8IHVhbXAgPiAzNTAwMDAwKSkgewotCQlkZXZfZXJyKGNoZy0+ZGV2LCAiV3JvbmcgdmFsdWUgZm9yIGJhdHRlcnkgb3ZlcmN1cnJlbnRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodWFtcCkKLQkJZGF0YSA9ICgodWFtcCAtIDIwMDAwMDApIC8gMjUwMDAwKSArIDE7Ci0JZWxzZQotCQlkYXRhID0gMDsgLyogZGlzYWJsZSAqLwotCi0JZGF0YSA8PD0gQ0hHX0NORkdfMTJfQjJTT1ZSQ19TSElGVDsKLQotCWRldl9kYmcoY2hnLT5kZXYsICJCYXR0ZXJ5IG92ZXJjdXJyZW50OiAldSAoMHgleClcbiIsIHVhbXAsIGRhdGEpOwotCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCi0JCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzEyLAotCQkJQ0hHX0NORkdfMTJfQjJTT1ZSQ19NQVNLLCBkYXRhKTsKLX0KLQotc3RhdGljIGludCBtYXg3NzY5M19zZXRfY2hhcmdlX2lucHV0X3RocmVzaG9sZF92b2x0KHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCi0JCXVuc2lnbmVkIGludCB1dm9sdCkKLXsKLQl1bnNpZ25lZCBpbnQgZGF0YTsKLQotCXN3aXRjaCAodXZvbHQpIHsKLQljYXNlIDQzMDAwMDA6Ci0JCWRhdGEgPSAweDA7Ci0JCWJyZWFrOwotCWNhc2UgNDcwMDAwMDoKLQljYXNlIDQ4MDAwMDA6Ci0JY2FzZSA0OTAwMDAwOgotCQlkYXRhID0gKHV2b2x0IC0gNDcwMDAwMCkgLyAxMDAwMDA7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihjaGctPmRldiwgIldyb25nIHZhbHVlIGZvciBjaGFyZ2UgaW5wdXQgdm9sdGFnZSByZWd1bGF0aW9uIHRocmVzaG9sZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRhdGEgPDw9IENIR19DTkZHXzEyX1ZDSEdJTlJFR19TSElGVDsKLQotCWRldl9kYmcoY2hnLT5kZXYsICJDaGFyZ2UgaW5wdXQgdm9sdGFnZSByZWd1bGF0aW9uIHRocmVzaG9sZDogJXUgKDB4JXgpXG4iLAotCQkJdXZvbHQsIGRhdGEpOwotCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCi0JCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzEyLAotCQkJQ0hHX0NORkdfMTJfVkNIR0lOUkVHX01BU0ssIGRhdGEpOwotfQotCi0vKgotICogU2V0cyBjaGFyZ2VyIHJlZ2lzdGVycyB0byBwcm9wZXIgYW5kIHNhZmUgZGVmYXVsdCB2YWx1ZXMuCi0gKi8KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfcmVnX2luaXQoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZykKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGludCBkYXRhOwotCi0JLyogVW5sb2NrIGNoYXJnZXIgcmVnaXN0ZXIgcHJvdGVjdGlvbiAqLwotCWRhdGEgPSAoMHgzIDw8IENIR19DTkZHXzA2X0NIR1BST1RfU0hJRlQpOwotCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCi0JCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wNiwKLQkJCQlDSEdfQ05GR18wNl9DSEdQUk9UX01BU0ssIGRhdGEpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihjaGctPmRldiwgIkVycm9yIHVubG9ja2luZyByZWdpc3RlcnM6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IG1heDc3NjkzX3NldF9mYXN0X2NoYXJnZV90aW1lcihjaGcsIERFRkFVTFRfRkFTVF9DSEFSR0VfVElNRVIpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBtYXg3NzY5M19zZXRfdG9wX29mZl90aHJlc2hvbGRfY3VycmVudChjaGcsCi0JCQlERUZBVUxUX1RPUF9PRkZfVEhSRVNIT0xEX0NVUlJFTlQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBtYXg3NzY5M19zZXRfdG9wX29mZl90aW1lcihjaGcsIERFRkFVTFRfVE9QX09GRl9USU1FUik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG1heDc3NjkzX3NldF9jb25zdGFudF92b2x0KGNoZywgY2hnLT5jb25zdGFudF92b2x0KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gbWF4Nzc2OTNfc2V0X21pbl9zeXN0ZW1fdm9sdChjaGcsIGNoZy0+bWluX3N5c3RlbV92b2x0KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gbWF4Nzc2OTNfc2V0X3RoZXJtYWxfcmVndWxhdGlvbl90ZW1wKGNoZywKLQkJCWNoZy0+dGhlcm1hbF9yZWd1bGF0aW9uX3RlbXApOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBtYXg3NzY5M19zZXRfYmF0dHRlcnlfb3ZlcmN1cnJlbnQoY2hnLCBjaGctPmJhdHR0ZXJ5X292ZXJjdXJyZW50KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIG1heDc3NjkzX3NldF9jaGFyZ2VfaW5wdXRfdGhyZXNob2xkX3ZvbHQoY2hnLAotCQkJY2hnLT5jaGFyZ2VfaW5wdXRfdGhyZXNob2xkX3ZvbHQpOwotfQotCi0jaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgaW50IG1heDc3NjkzX2R0X2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7Ci0KLQlpZiAoIW5wKSB7Ci0JCWRldl9lcnIoZGV2LCAibm8gY2hhcmdlciBPRiBub2RlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4aW0sY29uc3RhbnQtbWljcm92b2x0IiwKLQkJCSZjaGctPmNvbnN0YW50X3ZvbHQpKQotCQljaGctPmNvbnN0YW50X3ZvbHQgPSBERUZBVUxUX0NPTlNUQU5UX1ZPTFQ7Ci0KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJtYXhpbSxtaW4tc3lzdGVtLW1pY3Jvdm9sdCIsCi0JCQkmY2hnLT5taW5fc3lzdGVtX3ZvbHQpKQotCQljaGctPm1pbl9zeXN0ZW1fdm9sdCA9IERFRkFVTFRfTUlOX1NZU1RFTV9WT0xUOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4aW0sdGhlcm1hbC1yZWd1bGF0aW9uLWNlbHNpdXMiLAotCQkJJmNoZy0+dGhlcm1hbF9yZWd1bGF0aW9uX3RlbXApKQotCQljaGctPnRoZXJtYWxfcmVndWxhdGlvbl90ZW1wID0gREVGQVVMVF9USEVSTUFMX1JFR1VMQVRJT05fVEVNUDsKLQotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm1heGltLGJhdHRlcnktb3ZlcmN1cnJlbnQtbWljcm9hbXAiLAotCQkJJmNoZy0+YmF0dHRlcnlfb3ZlcmN1cnJlbnQpKQotCQljaGctPmJhdHR0ZXJ5X292ZXJjdXJyZW50ID0gREVGQVVMVF9CQVRURVJZX09WRVJDVVJSRU5UOwotCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4aW0sY2hhcmdlLWlucHV0LXRocmVzaG9sZC1taWNyb3ZvbHQiLAotCQkJJmNoZy0+Y2hhcmdlX2lucHV0X3RocmVzaG9sZF92b2x0KSkKLQkJY2hnLT5jaGFyZ2VfaW5wdXRfdGhyZXNob2xkX3ZvbHQgPQotCQkJREVGQVVMVF9DSEFSR0VSX0lOUFVUX1RIUkVTSE9MRF9WT0xUOwotCi0JcmV0dXJuIDA7Ci19Ci0jZWxzZSAvKiBDT05GSUdfT0YgKi8KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfZHRfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX09GICovCi0KLXN0YXRpYyBpbnQgbWF4Nzc2OTNfY2hhcmdlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGc7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwotCXN0cnVjdCBtYXg3NzY5M19kZXYgKm1heDc3NjkzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCWludCByZXQ7Ci0KLQljaGcgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjaGcpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNoZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGcpOwotCWNoZy0+ZGV2ID0gJnBkZXYtPmRldjsKLQljaGctPm1heDc3NjkzID0gbWF4Nzc2OTM7Ci0KLQlyZXQgPSBtYXg3NzY5M19kdF9pbml0KCZwZGV2LT5kZXYsIGNoZyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IG1heDc3NjkzX3JlZ19pbml0KGNoZyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXBzeV9jZmcuZHJ2X2RhdGEgPSBjaGc7Ci0KLQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2Zhc3RfY2hhcmdlX3RpbWVyKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZDogY3JlYXRlIGZhc3QgY2hhcmdlIHRpbWVyIHN5c2ZzIGVudHJ5XG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsCi0JCQkmZGV2X2F0dHJfdG9wX29mZl90aHJlc2hvbGRfY3VycmVudCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQ6IGNyZWF0ZSB0b3Agb2ZmIGN1cnJlbnQgc3lzZnMgZW50cnlcbiIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX3RvcF9vZmZfdGltZXIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBjcmVhdGUgdG9wIG9mZiB0aW1lciBzeXNmcyBlbnRyeVxuIik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCWNoZy0+Y2hhcmdlciA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAotCQkJCQkJJm1heDc3NjkzX2NoYXJnZXJfZGVzYywKLQkJCQkJCSZwc3lfY2ZnKTsKLQlpZiAoSVNfRVJSKGNoZy0+Y2hhcmdlcikpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXJcbiIpOwotCQlyZXQgPSBQVFJfRVJSKGNoZy0+Y2hhcmdlcik7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldHVybiAwOwotCi1lcnI6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl90b3Bfb2ZmX3RpbWVyKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX3RvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnQpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZmFzdF9jaGFyZ2VfdGltZXIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtYXg3NzY5M19jaGFyZ2VyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfdG9wX29mZl90aW1lcik7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl90b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50KTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2Zhc3RfY2hhcmdlX3RpbWVyKTsKLQotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGNoZy0+Y2hhcmdlcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgbWF4Nzc2OTNfY2hhcmdlcl9pZFtdID0gewotCXsgIm1heDc3NjkzLWNoYXJnZXIiLCAwLCB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIG1heDc3NjkzX2NoYXJnZXJfaWQpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtYXg3NzY5M19jaGFyZ2VyX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQk9ICJtYXg3NzY5My1jaGFyZ2VyIiwKLQl9LAotCS5wcm9iZQkJPSBtYXg3NzY5M19jaGFyZ2VyX3Byb2JlLAotCS5yZW1vdmUJCT0gbWF4Nzc2OTNfY2hhcmdlcl9yZW1vdmUsCi0JLmlkX3RhYmxlCT0gbWF4Nzc2OTNfY2hhcmdlcl9pZCwKLX07Ci1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1heDc3NjkzX2NoYXJnZXJfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1heGltIDc3NjkzIGNoYXJnZXIgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3BtMjMwMV9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3BtMjMwMV9jaGFyZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjJlZDMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wb3dlci9wbTIzMDFfY2hhcmdlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIgU1QgRXJpY3Nzb24uCi0gKgotICogUG93ZXIgc3VwcGx5IGRyaXZlciBmb3IgU1QgRXJpY3Nzb24gcG0yeHh4X2NoYXJnZXIgY2hhcmdlcgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwL2FiODUwMC5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLWJtLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC91eDUwMF9jaGFyZ2FsZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BtMjMwMV9jaGFyZ2VyLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbS5oPgotCi0jaW5jbHVkZSAicG0yMzAxX2NoYXJnZXIuaCIKLQotI2RlZmluZSB0b19wbTJ4eHhfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyh4KSBjb250YWluZXJfb2YoKHgpLCBcCi0JCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciwgYWNfY2hnKQotI2RlZmluZSBTTEVFUF9NSU4JCTUwCi0jZGVmaW5lIFNMRUVQX01BWAkJMTAwCi0jZGVmaW5lIFBNMlhYWF9BVVRPU1VTUEVORF9ERUxBWSA1MDAKLQotc3RhdGljIGludCBwbTJ4eHhfaW50ZXJydXB0X3JlZ2lzdGVyc1tdID0gewotCVBNMlhYWF9SRUdfSU5UMSwKLQlQTTJYWFhfUkVHX0lOVDIsCi0JUE0yWFhYX1JFR19JTlQzLAotCVBNMlhYWF9SRUdfSU5UNCwKLQlQTTJYWFhfUkVHX0lOVDUsCi0JUE0yWFhYX1JFR19JTlQ2LAotfTsKLQotc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBtMnh4eF9jaGFyZ2VyX2FjX3Byb3BzW10gPSB7Ci0JUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAotCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCi0JUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAotCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHLAotfTsKLQotc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcFtdID0gewotCTM1MDAsCi0JMzUyNSwKLQkzNTUwLAotCTM1NzUsCi0JMzYwMCwKLQkzNjI1LAotCTM2NTAsCi0JMzY3NSwKLQkzNzAwLAotCTM3MjUsCi0JMzc1MCwKLQkzNzc1LAotCTM4MDAsCi0JMzgyNSwKLQkzODUwLAotCTM4NzUsCi0JMzkwMCwKLQkzOTI1LAotCTM5NTAsCi0JMzk3NSwKLQk0MDAwLAotCTQwMjUsCi0JNDA1MCwKLQk0MDc1LAotCTQxMDAsCi0JNDEyNSwKLQk0MTUwLAotCTQxNzUsCi0JNDIwMCwKLQk0MjI1LAotCTQyNTAsCi0JNDI3NSwKLQk0MzAwLAotfTsKLQotc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9jdXJyZW50X21hcFtdID0gewotCTIwMCwKLQkyMDAsCi0JNDAwLAotCTYwMCwKLQk4MDAsCi0JMTAwMCwKLQkxMjAwLAotCTE0MDAsCi0JMTYwMCwKLQkxODAwLAotCTIwMDAsCi0JMjIwMCwKLQkyNDAwLAotCTI2MDAsCi0JMjgwMCwKLQkzMDAwLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBtMnh4eF9pZGVudFtdID0gewotCXsgInBtMjMwMSIsIDAgfSwKLQl7IH0KLX07Ci0KLXN0YXRpYyB2b2lkIHNldF9scG5fcGluKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yKQotewotCWlmICghcG0yLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCAmJiBncGlvX2lzX3ZhbGlkKHBtMi0+bHBuX3BpbikpIHsKLQkJZ3Bpb19zZXRfdmFsdWUocG0yLT5scG5fcGluLCAxKTsKLQkJdXNsZWVwX3JhbmdlKFNMRUVQX01JTiwgU0xFRVBfTUFYKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNsZWFyX2xwbl9waW4oc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCi17Ci0JaWYgKCFwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkICYmIGdwaW9faXNfdmFsaWQocG0yLT5scG5fcGluKSkKLQkJZ3Bpb19zZXRfdmFsdWUocG0yLT5scG5fcGluLCAwKTsKLX0KLQotc3RhdGljIGludCBwbTJ4eHhfcmVnX3JlYWQoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCByZWcsIHU4ICp2YWwpCi17Ci0JaW50IHJldDsKLQotCS8qIHdha2UgdXAgdGhlIGRldmljZSAqLwotCXBtX3J1bnRpbWVfZ2V0X3N5bmMocG0yLT5kZXYpOwotCi0JcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEocG0yLT5jb25maWcucG0yeHh4X2kyYywgcmVnLAotCQkJCTEsIHZhbCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIocG0yLT5kZXYsICJFcnJvciByZWFkaW5nIHJlZ2lzdGVyIGF0IDB4JXhcbiIsIHJlZyk7Ci0JZWxzZQotCQlyZXQgPSAwOwotCi0JcG1fcnVudGltZV9wdXRfc3luYyhwbTItPmRldik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9yZWdfd3JpdGUoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCByZWcsIHU4IHZhbCkKLXsKLQlpbnQgcmV0OwotCi0JLyogd2FrZSB1cCB0aGUgZGV2aWNlICovCi0JcG1fcnVudGltZV9nZXRfc3luYyhwbTItPmRldik7Ci0KLQlyZXQgPSBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEocG0yLT5jb25maWcucG0yeHh4X2kyYywgcmVnLAotCQkJCTEsICZ2YWwpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKHBtMi0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdpc3RlciBhdCAweCV4XG4iLCByZWcpOwotCWVsc2UKLQkJcmV0ID0gMDsKLQotCXBtX3J1bnRpbWVfcHV0X3N5bmMocG0yLT5kZXYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwbTJ4eHhfY2hhcmdpbmdfZW5hYmxlX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCi17Ci0JaW50IHJldDsKLQotCS8qIEVuYWJsZSBjaGFyZ2luZyAqLwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzIsCi0JCQkoUE0yWFhYX0NIX0FVVE9fUkVTVU1FX0VOIHwgUE0yWFhYX0NIQVJHRVJfRU5BKSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2luZ19kaXNhYmxlX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCi17Ci0JaW50IHJldDsKLQotCS8qIERpc2FibGUgU1cgRU9DIGN0cmwgKi8KLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX1NXX0NUUkxfUkVHLCBQTTJYWFhfU1dDVFJMX0hXKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIERpc2FibGUgY2hhcmdpbmcgKi8KLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUcyLAotCQkJKFBNMlhYWF9DSF9BVVRPX1JFU1VNRV9ESVMgfCBQTTJYWFhfQ0hBUkdFUl9ESVMpKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2JhdHRfdGhlcm1fbW5ndChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiwgaW50IHZhbCkKLXsKLQlxdWV1ZV93b3JrKHBtMi0+Y2hhcmdlcl93cSwgJnBtMi0+Y2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2RpZV90aGVybV9tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQotewotCXF1ZXVlX3dvcmsocG0yLT5jaGFyZ2VyX3dxLCAmcG0yLT5jaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX292dl9tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQotewotCWRldl9lcnIocG0yLT5kZXYsICJPdmVydm9sdGFnZSBkZXRlY3RlZFxuIik7Ci0JcG0yLT5mbGFncy5vdnYgPSB0cnVlOwotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBtMi0+YWNfY2hnLnBzeSk7Ci0KLQkvKiBTY2hlZHVsZSBhIG5ldyBIVyBmYWlsdXJlIGNoZWNrICovCi0JcXVldWVfZGVsYXllZF93b3JrKHBtMi0+Y2hhcmdlcl93cSwgJnBtMi0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX3dkX2V4cF9tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQotewotCWRldl9kYmcocG0yLT5kZXYgLCAiMjAgbWludXRlcyB3YXRjaGRvZyBleHBpcmVkXG4iKTsKLQotCXBtMi0+YWMud2RfZXhwaXJlZCA9IHRydWU7Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX3ZiYXRfbHNpZ19tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQotewotCWludCByZXQ7Ci0KLQlzd2l0Y2ggKHZhbCkgewotCWNhc2UgUE0yWFhYX0lOVDFfSVRWQkFUTE9XUjoKLQkJZGV2X2RiZyhwbTItPmRldiwgIlZCQVQgZ3Jvd3MgYWJvdmUgVkJBVF9MT1cgbGV2ZWxcbiIpOwotCQkvKiBFbmFibGUgU1cgRU9DIGN0cmwgKi8KLQkJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9TV19DVFJMX1JFRywKLQkJCQkJCQlQTTJYWFhfU1dDVFJMX1NXKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBQTTJYWFhfSU5UMV9JVFZCQVRMT1dGOgotCQlkZXZfZGJnKHBtMi0+ZGV2LCAiVkJBVCBkcm9wcyBiZWxvdyBWQkFUX0xPVyBsZXZlbFxuIik7Ci0JCS8qIERpc2FibGUgU1cgRU9DIGN0cmwgKi8KLQkJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9TV19DVFJMX1JFRywKLQkJCQkJCQlQTTJYWFhfU1dDVFJMX0hXKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGV2X2VycihwbTItPmRldiwgIlVua25vd24gVkJBVCBsZXZlbFxuIik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfYmF0X2Rpc2NfbW5ndChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiwgaW50IHZhbCkKLXsKLQlkZXZfZGJnKHBtMi0+ZGV2LCAiYmF0dGVyeSBkaXNjb25uZWN0ZWRcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfZGV0ZWN0aW9uKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCB1OCAqdmFsKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBwbTJ4eHhfcmVnX3JlYWQocG0yLCBQTTJYWFhfU1JDRV9SRUdfSU5UMiwgdmFsKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocG0yLT5kZXYsICJDaGFyZ2VyIGRldGVjdGlvbiBmYWlsZWRcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkqdmFsICY9IChQTTJYWFhfSU5UMl9TX0lUVlBXUjFQTFVHIHwgUE0yWFhYX0lOVDJfU19JVFZQV1IyUExVRyk7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2l0dl9wd3JfcGx1Z19tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQotewotCi0JaW50IHJldDsKLQl1OCByZWFkX3ZhbDsKLQotCS8qCi0JICogU2luY2Ugd2UgY2FuJ3QgYmUgc3VyZSB0aGF0IHRoZSBldmVudHMgYXJlIHJlY2VpdmVkCi0JICogc3luY2hyb25vdXNseSwgd2UgaGF2ZSB0aGUgY2hlY2sgaWYgdGhlIG1haW4gY2hhcmdlciBpcwotCSAqIGNvbm5lY3RlZCBieSByZWFkaW5nIHRoZSBpbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyLgotCSAqLwotCXJldCA9IHBtMnh4eF9jaGFyZ2VyX2RldGVjdGlvbihwbTIsICZyZWFkX3ZhbCk7Ci0KLQlpZiAoKHJldCA9PSAwKSAmJiByZWFkX3ZhbCkgewotCQlwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkID0gMTsKLQkJcG0yLT5hY19jb25uID0gdHJ1ZTsKLQkJcXVldWVfd29yayhwbTItPmNoYXJnZXJfd3EsICZwbTItPmFjX3dvcmspOwotCX0KLQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9pdHZfcHdyX3VucGx1Z19tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLAotCQkJCQkJCQlpbnQgdmFsKQotewotCXBtMi0+YWMuY2hhcmdlcl9jb25uZWN0ZWQgPSAwOwotCXF1ZXVlX3dvcmsocG0yLT5jaGFyZ2VyX3dxLCAmcG0yLT5hY193b3JrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBtMl9pbnRfcmVnMCh2b2lkICpwbTJfZGF0YSwgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IHBtMl9kYXRhOwotCWludCByZXQgPSAwOwotCi0JaWYgKHZhbCAmIFBNMlhYWF9JTlQxX0lUVkJBVExPV1IpIHsKLQkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfdmJhdF9sc2lnX21uZ3QocG0yLAotCQkJCQkJUE0yWFhYX0lOVDFfSVRWQkFUTE9XUik7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHZhbCAmIFBNMlhYWF9JTlQxX0lUVkJBVExPV0YpIHsKLQkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfdmJhdF9sc2lnX21uZ3QocG0yLAotCQkJCQkJUE0yWFhYX0lOVDFfSVRWQkFUTE9XRik7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHZhbCAmIFBNMlhYWF9JTlQxX0lUVkJBVERJU0NPTk5FQ1QpIHsKLQkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfYmF0X2Rpc2NfbW5ndChwbTIsCi0JCQkJUE0yWFhYX0lOVDFfSVRWQkFURElTQ09OTkVDVCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yX2ludF9yZWcxKHZvaWQgKnBtMl9kYXRhLCBpbnQgdmFsKQotewotCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gcG0yX2RhdGE7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodmFsICYgKFBNMlhYWF9JTlQyX0lUVlBXUjFQTFVHIHwgUE0yWFhYX0lOVDJfSVRWUFdSMlBMVUcpKSB7Ci0JCWRldl9kYmcocG0yLT5kZXYgLCAiTWFpbiBjaGFyZ2VyIHBsdWdnZWRcbiIpOwotCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9pdHZfcHdyX3BsdWdfbW5ndChwbTIsIHZhbCAmCi0JCQkoUE0yWFhYX0lOVDJfSVRWUFdSMVBMVUcgfCBQTTJYWFhfSU5UMl9JVFZQV1IyUExVRykpOwotCX0KLQotCWlmICh2YWwgJgotCQkoUE0yWFhYX0lOVDJfSVRWUFdSMVVOUExVRyB8IFBNMlhYWF9JTlQyX0lUVlBXUjJVTlBMVUcpKSB7Ci0JCWRldl9kYmcocG0yLT5kZXYgLCAiTWFpbiBjaGFyZ2VyIHVucGx1Z2dlZFxuIik7Ci0JCXJldCA9IHBtMnh4eF9jaGFyZ2VyX2l0dl9wd3JfdW5wbHVnX21uZ3QocG0yLCB2YWwgJgotCQkJCQkJKFBNMlhYWF9JTlQyX0lUVlBXUjFVTlBMVUcgfAotCQkJCQkJUE0yWFhYX0lOVDJfSVRWUFdSMlVOUExVRykpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yX2ludF9yZWcyKHZvaWQgKnBtMl9kYXRhLCBpbnQgdmFsKQotewotCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gcG0yX2RhdGE7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodmFsICYgUE0yWFhYX0lOVDNfSVRBVVRPVElNRU9VVFdEKQotCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl93ZF9leHBfbW5ndChwbTIsIHZhbCk7Ci0KLQlpZiAodmFsICYgKFBNMlhYWF9JTlQzX0lUQ0hQUkVDSEFSR0VXRCB8Ci0JCQkJUE0yWFhYX0lOVDNfSVRDSENDV0QgfCBQTTJYWFhfSU5UM19JVENIQ1ZXRCkpIHsKLQkJZGV2X2RiZyhwbTItPmRldiwKLQkJCSJXYXRjaGRvZyBvY2N1cnJlZCBmb3IgcHJlY2hhcmdlLCBDQyBhbmQgQ1YgY2hhcmdlXG4iKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBtMl9pbnRfcmVnMyh2b2lkICpwbTJfZGF0YSwgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IHBtMl9kYXRhOwotCWludCByZXQgPSAwOwotCi0JaWYgKHZhbCAmIChQTTJYWFhfSU5UNF9JVENIQVJHSU5HT04pKSB7Ci0JCWRldl9kYmcocG0yLT5kZXYgLAotCQkJImNoYXJnaW5kIG9wZXJhdGlvbiBoYXMgc3RhcnRlZFxuIik7Ci0JfQotCi0JaWYgKHZhbCAmIChQTTJYWFhfSU5UNF9JVFZSRVNVTUUpKSB7Ci0JCWRldl9kYmcocG0yLT5kZXYsCi0JCQkiYmF0dGVyeSBkaXNjaGFyZ2VkIGRvd24gdG8gVlJlc3VtZSB0aHJlc2hvbGRcbiIpOwotCX0KLQotCWlmICh2YWwgJiAoUE0yWFhYX0lOVDRfSVRCQVRURlVMTCkpIHsKLQkJZGV2X2RiZyhwbTItPmRldiAsICJiYXR0ZXJ5IGZ1bGx5IGRldGVjdGVkXG4iKTsKLQl9Ci0KLQlpZiAodmFsICYgKFBNMlhYWF9JTlQ0X0lUQ1ZQSEFTRSkpIHsKLQkJZGV2X2RiZyhwbTItPmRldiwgIkNWIHBoYXNlIGVudGVyIHdpdGggMC41QyBjaGFyZ2luZ1xuIik7Ci0JfQotCi0JaWYgKHZhbCAmIChQTTJYWFhfSU5UNF9JVFZQV1IyT1ZWIHwgUE0yWFhYX0lOVDRfSVRWUFdSMU9WVikpIHsKLQkJcG0yLT5mYWlsdXJlX2Nhc2UgPSBWUFdSX09WVjsKLQkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfb3Z2X21uZ3QocG0yLCB2YWwgJgotCQkJKFBNMlhYWF9JTlQ0X0lUVlBXUjJPVlYgfCBQTTJYWFhfSU5UNF9JVFZQV1IxT1ZWKSk7Ci0JCWRldl9kYmcocG0yLT5kZXYsICJWUFdSL1ZTWVNURU0gb3ZlcnZvbHRhZ2UgZGV0ZWN0ZWRcbiIpOwotCX0KLQotCWlmICh2YWwgJiAoUE0yWFhYX0lOVDRfU19JVEJBVFRFTVBDT0xEIHwKLQkJCQlQTTJYWFhfSU5UNF9TX0lUQkFUVEVNUEhPVCkpIHsKLQkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfYmF0dF90aGVybV9tbmd0KHBtMiwgdmFsICYKLQkJCShQTTJYWFhfSU5UNF9TX0lUQkFUVEVNUENPTEQgfAotCQkJUE0yWFhYX0lOVDRfU19JVEJBVFRFTVBIT1QpKTsKLQkJZGV2X2RiZyhwbTItPmRldiwgIkJURU1QIGlzIHRvbyBMb3cvSGlnaFxuIik7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwbTJfaW50X3JlZzQodm9pZCAqcG0yX2RhdGEsIGludCB2YWwpCi17Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBwbTJfZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh2YWwgJiBQTTJYWFhfSU5UNV9JVFZTWVNURU1PVlYpIHsKLQkJcG0yLT5mYWlsdXJlX2Nhc2UgPSBWU1lTVEVNX09WVjsKLQkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfb3Z2X21uZ3QocG0yLCB2YWwgJgotCQkJCQkJUE0yWFhYX0lOVDVfSVRWU1lTVEVNT1ZWKTsKLQkJZGV2X2RiZyhwbTItPmRldiwgIlZTWVNURU0gb3ZlcnZvbHRhZ2UgZGV0ZWN0ZWRcbiIpOwotCX0KLQotCWlmICh2YWwgJiAoUE0yWFhYX0lOVDVfSVRUSEVSTUFMV0FSTklOR0ZBTEwgfAotCQkJCVBNMlhYWF9JTlQ1X0lUVEhFUk1BTFdBUk5JTkdSSVNFIHwKLQkJCQlQTTJYWFhfSU5UNV9JVFRIRVJNQUxTSFVURE9XTkZBTEwgfAotCQkJCVBNMlhYWF9JTlQ1X0lUVEhFUk1BTFNIVVRET1dOUklTRSkpIHsKLQkJZGV2X2RiZyhwbTItPmRldiwgIkJURU1QIGRpZSB0ZW1wZXJhdHVyZSBpcyB0b28gTG93L0hpZ2hcbiIpOwotCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9kaWVfdGhlcm1fbW5ndChwbTIsIHZhbCAmCi0JCQkoUE0yWFhYX0lOVDVfSVRUSEVSTUFMV0FSTklOR0ZBTEwgfAotCQkJUE0yWFhYX0lOVDVfSVRUSEVSTUFMV0FSTklOR1JJU0UgfAotCQkJUE0yWFhYX0lOVDVfSVRUSEVSTUFMU0hVVERPV05GQUxMIHwKLQkJCVBNMlhYWF9JTlQ1X0lUVEhFUk1BTFNIVVRET1dOUklTRSkpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yX2ludF9yZWc1KHZvaWQgKnBtMl9kYXRhLCBpbnQgdmFsKQotewotCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gcG0yX2RhdGE7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodmFsICYgKFBNMlhYWF9JTlQ2X0lUVlBXUjJEUk9QIHwgUE0yWFhYX0lOVDZfSVRWUFdSMURST1ApKSB7Ci0JCWRldl9kYmcocG0yLT5kZXYsICJWTVBXUiBkcm9wIHRvIFZCQVQgbGV2ZWxcbiIpOwotCX0KLQotCWlmICh2YWwgJiAoUE0yWFhYX0lOVDZfSVRWUFdSMlZBTElEUklTRSB8Ci0JCQlQTTJYWFhfSU5UNl9JVFZQV1IxVkFMSURSSVNFIHwKLQkJCVBNMlhYWF9JTlQ2X0lUVlBXUjJWQUxJREZBTEwgfAotCQkJUE0yWFhYX0lOVDZfSVRWUFdSMVZBTElERkFMTCkpIHsKLQkJZGV2X2RiZyhwbTItPmRldiwgIkZhbGxpbmcvUmlzaW5nIGVkZ2Ugb24gV1BXUjEvMlxuIik7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlycXJldHVybl90ICBwbTJ4eHhfaXJxX2ludChpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gZGF0YTsKLQlzdHJ1Y3QgcG0yeHh4X2ludGVycnVwdHMgKmludGVycnVwdCA9IHBtMi0+cG0yX2ludDsKLQlpbnQgaTsKLQotCS8qIHdha2UgdXAgdGhlIGRldmljZSAqLwotCXBtX3J1bnRpbWVfZ2V0X3N5bmMocG0yLT5kZXYpOwotCi0JZG8gewotCQlmb3IgKGkgPSAwOyBpIDwgUE0yWFhYX05VTV9JTlRfUkVHOyBpKyspIHsKLQkJCXBtMnh4eF9yZWdfcmVhZChwbTIsCi0JCQkJcG0yeHh4X2ludGVycnVwdF9yZWdpc3RlcnNbaV0sCi0JCQkJJihpbnRlcnJ1cHQtPnJlZ1tpXSkpOwotCi0JCQlpZiAoaW50ZXJydXB0LT5yZWdbaV0gPiAwKQotCQkJCWludGVycnVwdC0+aGFuZGxlcltpXShwbTIsIGludGVycnVwdC0+cmVnW2ldKTsKLQkJfQotCX0gd2hpbGUgKGdwaW9fZ2V0X3ZhbHVlKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlcikgPT0gMCk7Ci0KLQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBtMi0+ZGV2KTsKLQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwbTItPmRldik7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfZ2V0X2FjX2N2KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yKQotewotCWludCByZXQgPSAwOwotCXU4IHZhbDsKLQotCWlmIChwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkICYmIHBtMi0+YWMuY2hhcmdlcl9vbmxpbmUpIHsKLQotCQlyZXQgPSBwbTJ4eHhfcmVnX3JlYWQocG0yLCBQTTJYWFhfU1JDRV9SRUdfSU5UNCwgJnZhbCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWlmICh2YWwgJiBQTTJYWFhfSU5UNF9TX0lUQ1ZQSEFTRSkKLQkJCXJldCA9IFBNMlhYWF9DT05TVF9WT0xUOwotCQllbHNlCi0JCQlyZXQgPSBQTTJYWFhfQ09OU1RfQ1VSUjsKLQl9Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwbTJ4eHhfY3VycmVudF90b19yZWd2YWwoaW50IGN1cnIpCi17Ci0JaW50IGk7Ci0KLQlpZiAoY3VyciA8IHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwWzBdKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwKTsgaSsrKSB7Ci0JCWlmIChjdXJyIDwgcG0yeHh4X2NoYXJnZXJfY3VycmVudF9tYXBbaV0pCi0JCQlyZXR1cm4gKGkgLSAxKTsKLQl9Ci0KLQlpID0gQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl9jdXJyZW50X21hcCkgLSAxOwotCWlmIChjdXJyID09IHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwW2ldKQotCQlyZXR1cm4gaTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF92b2x0YWdlX3RvX3JlZ3ZhbChpbnQgY3VycikKLXsKLQlpbnQgaTsKLQotCWlmIChjdXJyIDwgcG0yeHh4X2NoYXJnZXJfdm9sdGFnZV9tYXBbMF0pCi0JCXJldHVybiAwOwotCi0JZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUocG0yeHh4X2NoYXJnZXJfdm9sdGFnZV9tYXApOyBpKyspIHsKLQkJaWYgKGN1cnIgPCBwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcFtpXSkKLQkJCXJldHVybiBpIC0gMTsKLQl9Ci0KLQlpID0gQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcCkgLSAxOwotCWlmIChjdXJyID09IHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwW2ldKQotCQlyZXR1cm4gaTsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX3VwZGF0ZV9jaGFyZ2VyX2N1cnJlbnQoc3RydWN0IHV4NTAwX2NoYXJnZXIgKmNoYXJnZXIsCi0JCWludCBpY2hfb3V0KQotewotCWludCByZXQ7Ci0JaW50IGN1cnJfaW5kZXg7Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7Ci0JdTggdmFsOwotCi0JaWYgKGNoYXJnZXItPnBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUykKLQkJcG0yID0gdG9fcG0yeHh4X2NoYXJnZXJfYWNfZGV2aWNlX2luZm8oY2hhcmdlcik7Ci0JZWxzZQotCQlyZXR1cm4gLUVOWElPOwotCi0JY3Vycl9pbmRleCA9IHBtMnh4eF9jdXJyZW50X3RvX3JlZ3ZhbChpY2hfb3V0KTsKLQlpZiAoY3Vycl9pbmRleCA8IDApIHsKLQkJZGV2X2VycihwbTItPmRldiwKLQkJCSJDaGFyZ2VyIGN1cnJlbnQgdG9vIGhpZ2gsIGNoYXJnaW5nIG5vdCBzdGFydGVkXG4iKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlyZXQgPSBwbTJ4eHhfcmVnX3JlYWQocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzYsICZ2YWwpOwotCWlmIChyZXQgPj0gMCkgewotCQl2YWwgJj0gflBNMlhYWF9ESVJfQ0hfQ0NfQ1VSUkVOVF9NQVNLOwotCQl2YWwgfD0gY3Vycl9pbmRleDsKLQkJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHNiwgdmFsKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIocG0yLT5kZXYsCi0JCQkJIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQl9Ci0JfQotCWVsc2UKLQkJZGV2X2VycihwbTItPmRldiwgIiVzIHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2FjX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAotCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCi17Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7Ci0KLQlwbTIgPSB0b19wbTJ4eHhfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhwc3lfdG9fdXg1MDBfY2hhcmdlcihwc3kpKTsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6Ci0JCWlmIChwbTItPmZsYWdzLm1haW5leHRjaG5vdG9rKQotCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOwotCQllbHNlIGlmIChwbTItPmFjLndkX2V4cGlyZWQpCi0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRDsKLQkJZWxzZSBpZiAocG0yLT5mbGFncy5tYWluX3RoZXJtYWxfcHJvdCkKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKLQkJZWxzZSBpZiAocG0yLT5mbGFncy5vdnYpCi0JCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7Ci0JCWVsc2UKLQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKLQkJdmFsLT5pbnR2YWwgPSBwbTItPmFjLmNoYXJnZXJfb25saW5lOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6Ci0JCXZhbC0+aW50dmFsID0gcG0yLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0FWRzoKLQkJcG0yLT5hYy5jdl9hY3RpdmUgPSBwbTJ4eHhfY2hhcmdlcl9nZXRfYWNfY3YocG0yKTsKLQkJdmFsLT5pbnR2YWwgPSBwbTItPmFjLmN2X2FjdGl2ZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2luZ19pbml0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yKQotewotCWludCByZXQgPSAwOwotCi0JLyogZW5hYmxlIENDIGFuZCBDViB3YXRjaGRvZyAqLwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzMsCi0JCShQTTJYWFhfQ0hfV0RfQ1ZfUEhBU0VfNjBNSU4gfCBQTTJYWFhfQ0hfV0RfQ0NfUEhBU0VfNjBNSU4pKTsKLQlpZiggcmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIGVuYWJsZSBwcmVjaGFyZ2Ugd2F0Y2hkb2cgKi8KLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc0LAotCQkJCQlQTTJYWFhfQ0hfV0RfUFJFQ0hfUEhBU0VfNjBNSU4pOwotCi0JLyogRGlzYWJsZSBhdXRvIHRpbWVvdXQgKi8KLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc1LAotCQkJCQlQTTJYWFhfQ0hfV0RfQVVUT19USU1FT1VUXzIwTUlOKTsKLQotCS8qCi0gICAgICogRU9DIGN1cnJlbnQgbGV2ZWwgPSAxMDBtQQotCSAqIFByZWNoYXJnZSBjdXJyZW50IGxldmVsID0gMTAwbUEKLQkgKiBDQyBjdXJyZW50IGxldmVsID0gMTAwMG1BCi0JICovCi0JcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHNiwKLQkJKFBNMlhYWF9ESVJfQ0hfQ0NfQ1VSUkVOVF8xMDAwTUEgfAotCQlQTTJYWFhfQ0hfUFJFQ0hfQ1VSUkVOVF8xMDBNQSB8Ci0JCVBNMlhYWF9DSF9FT0NfQ1VSUkVOVF8xMDBNQSkpOwotCi0JLyoKLSAgICAgKiByZWNoYXJnZSB0aHJlc2hvbGQgPSAzLjhWCi0JICogUHJlY2hhcmdlIHRvIENDIHRocmVzaG9sZCA9IDIuOVYKLQkgKi8KLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc3LAotCQkoUE0yWFhYX0NIX1BSRUNIX1ZPTF8yXzkgfCBQTTJYWFhfQ0hfVlJFU1VNRV9WT0xfM184KSk7Ci0KLQkvKiBmbG9hdCB2b2x0YWdlIGNoYXJnZXIgbGV2ZWwgPSA0LjJWICovCi0JcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHOCwKLQkJUE0yWFhYX0NIX1ZPTFRfNF8yKTsKLQotCS8qIFZvbHRhZ2UgZHJvcCBiZXR3ZWVuIFZCQVQgYW5kIFZTWVMgaW4gSFcgY2hhcmdpbmcgPSAzMDBtViAqLwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzksCi0JCShQTTJYWFhfQ0hfMTUwTVZfRFJPUF8zMDBNViB8IFBNMlhYWF9DSEFSQ0hJTkdfSU5GT19ESVMgfAotCQlQTTJYWFhfQ0hfQ0NfUkVEVUNFRF9DVVJSRU5UX0lERU5UIHwKLQkJUE0yWFhYX0NIX0NDX01PREVEUk9QX0RJUykpOwotCi0JLyogSW5wdXQgY2hhcmdlciBsZXZlbCBvZiBvdmVyIHZvbHRhZ2UgPSAxMFYgKi8KLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0lOUF9WT0xUX1ZQV1IyLAotCQkJCQlQTTJYWFhfVlBXUjJfT1ZWXzEwKTsKLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0lOUF9WT0xUX1ZQV1IxLAotCQkJCQlQTTJYWFhfVlBXUjFfT1ZWXzEwKTsKLQotCS8qIElucHV0IGNoYXJnZXIgZHJvcCAqLwotCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfSU5QX0RST1BfVlBXUjIsCi0JCShQTTJYWFhfVlBXUjJfSFdfT1BUX0RJUyB8IFBNMlhYWF9WUFdSMl9WQUxJRF9ESVMgfAotCQlQTTJYWFhfVlBXUjJfRFJPUF9ESVMpKTsKLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0lOUF9EUk9QX1ZQV1IxLAotCQkoUE0yWFhYX1ZQV1IxX0hXX09QVF9ESVMgfCBQTTJYWFhfVlBXUjFfVkFMSURfRElTIHwKLQkJUE0yWFhYX1ZQV1IxX0RST1BfRElTKSk7Ci0KLQkvKiBEaXNhYmxlIGJhdHRlcnkgbG93IG1vbml0b3JpbmcgKi8KLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfTE9XX0xFVl9DT01QX1JFRywKLQkJUE0yWFhYX1ZCQVRfTE9XX01PTklUT1JJTkdfRU5BKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfYWNfZW4oc3RydWN0IHV4NTAwX2NoYXJnZXIgKmNoYXJnZXIsCi0JaW50IGVuYWJsZSwgaW50IHZzZXQsIGludCBpc2V0KQotewotCWludCByZXQ7Ci0JaW50IHZvbHRfaW5kZXg7Ci0JaW50IGN1cnJfaW5kZXg7Ci0JdTggdmFsOwotCi0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSB0b19wbTJ4eHhfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKLQotCWlmIChlbmFibGUpIHsKLQkJaWYgKCFwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkKSB7Ci0JCQlkZXZfZGJnKHBtMi0+ZGV2LCAiQUMgY2hhcmdlciBub3QgY29ubmVjdGVkXG4iKTsKLQkJCXJldHVybiAtRU5YSU87Ci0JCX0KLQotCQlkZXZfZGJnKHBtMi0+ZGV2LCAiRW5hYmxlIEFDOiAlZG1WICVkbUFcbiIsIHZzZXQsIGlzZXQpOwotCQlpZiAoIXBtMi0+dmRkYWRjX2VuX2FjKSB7Ci0JCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHBtMi0+cmVndSk7Ci0JCQlpZiAocmV0KQotCQkJCWRldl93YXJuKHBtMi0+ZGV2LAotCQkJCQkiRmFpbGVkIHRvIGVuYWJsZSB2ZGRhZGMgcmVndWxhdG9yXG4iKTsKLQkJCWVsc2UKLQkJCQlwbTItPnZkZGFkY19lbl9hYyA9IHRydWU7Ci0JCX0KLQotCQlyZXQgPSBwbTJ4eHhfY2hhcmdpbmdfaW5pdChwbTIpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwgIiVzIGNoYXJnaW5nIGluaXQgZmFpbGVkXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycm9yX29jY3VyZWQ7Ci0JCX0KLQotCQl2b2x0X2luZGV4ID0gcG0yeHh4X3ZvbHRhZ2VfdG9fcmVndmFsKHZzZXQpOwotCQljdXJyX2luZGV4ID0gcG0yeHh4X2N1cnJlbnRfdG9fcmVndmFsKGlzZXQpOwotCi0JCWlmICh2b2x0X2luZGV4IDwgMCB8fCBjdXJyX2luZGV4IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwKLQkJCQkiQ2hhcmdlciB2b2x0YWdlIG9yIGN1cnJlbnQgdG9vIGhpZ2gsICIKLQkJCQkiY2hhcmdpbmcgbm90IHN0YXJ0ZWRcbiIpOwotCQkJcmV0dXJuIC1FTlhJTzsKLQkJfQotCi0JCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHOCwgJnZhbCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycm9yX29jY3VyZWQ7Ci0JCX0KLQkJdmFsICY9IH5QTTJYWFhfQ0hfVk9MVF9NQVNLOwotCQl2YWwgfD0gdm9sdF9pbmRleDsKLQkJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHOCwgdmFsKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGVycm9yX29jY3VyZWQ7Ci0JCX0KLQotCQlyZXQgPSBwbTJ4eHhfcmVnX3JlYWQocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzYsICZ2YWwpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJZ290byBlcnJvcl9vY2N1cmVkOwotCQl9Ci0JCXZhbCAmPSB+UE0yWFhYX0RJUl9DSF9DQ19DVVJSRU5UX01BU0s7Ci0JCXZhbCB8PSBjdXJyX2luZGV4OwotCQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc2LCB2YWwpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKLQkJfQotCi0JCWlmICghcG0yLT5iYXQtPmVuYWJsZV9vdmVyc2hvb3QpIHsKLQkJCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9MRURfQ1RSTF9SRUcsICZ2YWwpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHJlYWQgZmFpbGVkXG4iLAotCQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJZ290byBlcnJvcl9vY2N1cmVkOwotCQkJfQotCQkJdmFsIHw9IFBNMlhYWF9BTlRJX09WRVJTSE9PVF9FTjsKLQkJCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfTEVEX0NUUkxfUkVHLCB2YWwpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHdyaXRlIGZhaWxlZFxuIiwKLQkJCQkJCQkJX19mdW5jX18pOwotCQkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKLQkJCX0KLQkJfQotCi0JCXJldCA9IHBtMnh4eF9jaGFyZ2luZ19lbmFibGVfbW5ndChwbTIpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwgIkZhaWxlZCB0byBlbmFibGUiCi0JCQkJCQkicG0yeHh4IGFjIGNoYXJnZXJcbiIpOwotCQkJZ290byBlcnJvcl9vY2N1cmVkOwotCQl9Ci0KLQkJcG0yLT5hYy5jaGFyZ2VyX29ubGluZSA9IDE7Ci0JfSBlbHNlIHsKLQkJcG0yLT5hYy5jaGFyZ2VyX29ubGluZSA9IDA7Ci0JCXBtMi0+YWMud2RfZXhwaXJlZCA9IGZhbHNlOwotCi0JCS8qIERpc2FibGUgcmVndWxhdG9yIGlmIGVuYWJsZWQgKi8KLQkJaWYgKHBtMi0+dmRkYWRjX2VuX2FjKSB7Ci0JCQlyZWd1bGF0b3JfZGlzYWJsZShwbTItPnJlZ3UpOwotCQkJcG0yLT52ZGRhZGNfZW5fYWMgPSBmYWxzZTsKLQkJfQotCi0JCXJldCA9IHBtMnh4eF9jaGFyZ2luZ19kaXNhYmxlX21uZ3QocG0yKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIocG0yLT5kZXYsICJmYWlsZWQgdG8gZGlzYWJsZSIKLQkJCQkJCSJwbTJ4eHggYWMgY2hhcmdlclxuIik7Ci0JCQlnb3RvIGVycm9yX29jY3VyZWQ7Ci0JCX0KLQotCQlkZXZfZGJnKHBtMi0+ZGV2LCAiUE0yMzAxOiAiICJEaXNhYmxlZCBBQyBjaGFyZ2luZ1xuIik7Ci0JfQotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBtMi0+YWNfY2hnLnBzeSk7Ci0KLWVycm9yX29jY3VyZWQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl93YXRjaGRvZ19raWNrKHN0cnVjdCB1eDUwMF9jaGFyZ2VyICpjaGFyZ2VyKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7Ci0KLQlpZiAoY2hhcmdlci0+cHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TKQotCQlwbTIgPSB0b19wbTJ4eHhfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKLQllbHNlCi0JCXJldHVybiAtRU5YSU87Ci0KLQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfV0RfS0lDSywgV0RfVElNRVIpOwotCWlmIChyZXQpCi0JCWRldl9lcnIocG0yLT5kZXYsICJGYWlsZWQgdG8ga2ljayBXRCFcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgcG0yeHh4X2NoYXJnZXJfYWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBjb250YWluZXJfb2Yod29yaywKLQkJc3RydWN0IHBtMnh4eF9jaGFyZ2VyLCBhY193b3JrKTsKLQotCi0JcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKLQlzeXNmc19ub3RpZnkoJnBtMi0+YWNfY2hnLnBzeS0+ZGV2LmtvYmosIE5VTEwsICJwcmVzZW50Iik7Ci19OwotCi1zdGF0aWMgdm9pZCBwbTJ4eHhfY2hhcmdlcl9jaGVja19od19mYWlsdXJlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXU4IHJlZ192YWx1ZTsKLQotCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gY29udGFpbmVyX29mKHdvcmssCi0JCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciwgY2hlY2tfaHdfZmFpbHVyZV93b3JrLndvcmspOwotCi0JaWYgKHBtMi0+ZmxhZ3Mub3Z2KSB7Ci0JCXBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9TUkNFX1JFR19JTlQ0LCAmcmVnX3ZhbHVlKTsKLQotCQlpZiAoIShyZWdfdmFsdWUgJiAoUE0yWFhYX0lOVDRfU19JVFZQV1IxT1ZWIHwKLQkJCQkJUE0yWFhYX0lOVDRfU19JVFZQV1IyT1ZWKSkpIHsKLQkJCXBtMi0+ZmxhZ3Mub3Z2ID0gZmFsc2U7Ci0JCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOwotCQl9Ci0JfQotCi0JLyogSWYgd2Ugc3RpbGwgaGF2ZSBhIGZhaWx1cmUsIHNjaGVkdWxlIGEgbmV3IGNoZWNrICovCi0JaWYgKHBtMi0+ZmxhZ3Mub3Z2KSB7Ci0JCXF1ZXVlX2RlbGF5ZWRfd29yayhwbTItPmNoYXJnZXJfd3EsCi0JCQkmcG0yLT5jaGVja19od19mYWlsdXJlX3dvcmssIHJvdW5kX2ppZmZpZXMoSFopKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHBtMnh4eF9jaGFyZ2VyX2NoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmsoCi0Jc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCWludCByZXQ7Ci0JdTggdmFsOwotCi0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBtMnh4eF9jaGFyZ2VyLAotCQkJCQljaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrKTsKLQotCS8qIENoZWNrIGlmIGRpZSB0ZW1wIHdhcm5pbmcgaXMgc3RpbGwgYWN0aXZlICovCi0JcmV0ID0gcG0yeHh4X3JlZ19yZWFkKHBtMiwgUE0yWFhYX1NSQ0VfUkVHX0lOVDUsICZ2YWwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAodmFsICYgKFBNMlhYWF9JTlQ1X1NfSVRUSEVSTUFMV0FSTklOR1JJU0UKLQkJCXwgUE0yWFhYX0lOVDVfU19JVFRIRVJNQUxTSFVURE9XTlJJU0UpKQotCQlwbTItPmZsYWdzLm1haW5fdGhlcm1hbF9wcm90ID0gdHJ1ZTsKLQllbHNlIGlmICh2YWwgJiAoUE0yWFhYX0lOVDVfU19JVFRIRVJNQUxXQVJOSU5HRkFMTAotCQkJCXwgUE0yWFhYX0lOVDVfU19JVFRIRVJNQUxTSFVURE9XTkZBTEwpKQotCQlwbTItPmZsYWdzLm1haW5fdGhlcm1hbF9wcm90ID0gZmFsc2U7Ci0KLQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOwotfQotCi1zdGF0aWMgc3RydWN0IHBtMnh4eF9pbnRlcnJ1cHRzIHBtMnh4eF9pbnQgPSB7Ci0JLmhhbmRsZXJbMF0gPSBwbTJfaW50X3JlZzAsCi0JLmhhbmRsZXJbMV0gPSBwbTJfaW50X3JlZzEsCi0JLmhhbmRsZXJbMl0gPSBwbTJfaW50X3JlZzIsCi0JLmhhbmRsZXJbM10gPSBwbTJfaW50X3JlZzMsCi0JLmhhbmRsZXJbNF0gPSBwbTJfaW50X3JlZzQsCi0JLmhhbmRsZXJbNV0gPSBwbTJfaW50X3JlZzUsCi19OwotCi1zdGF0aWMgc3RydWN0IHBtMnh4eF9pcnEgcG0yeHh4X2NoYXJnZXJfaXJxW10gPSB7Ci0JeyJQTTJYWFhfSVJRX0lOVCIsIHBtMnh4eF9pcnFfaW50fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcG0yeHh4X3dhbGxfY2hhcmdlcl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yOwotCi0JcG0yID0gIChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKilpMmNfZ2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCk7Ci0Jc2V0X2xwbl9waW4ocG0yKTsKLQotCS8qIElmIHdlIHN0aWxsIGhhdmUgYSBIVyBmYWlsdXJlLCBzY2hlZHVsZSBhIG5ldyBjaGVjayAqLwotCWlmIChwbTItPmZsYWdzLm92dikKLQkJcXVldWVfZGVsYXllZF93b3JrKHBtMi0+Y2hhcmdlcl93cSwKLQkJCQkmcG0yLT5jaGVja19od19mYWlsdXJlX3dvcmssIDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcG0yeHh4X3dhbGxfY2hhcmdlcl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKLQotCXBtMiA9ICAoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICopaTJjX2dldF9jbGllbnRkYXRhKGkyY19jbGllbnQpOwotCWNsZWFyX2xwbl9waW4ocG0yKTsKLQotCS8qIENhbmNlbCBhbnkgcGVuZGluZyBIVyBmYWlsdXJlIGNoZWNrICovCi0JaWYgKGRlbGF5ZWRfd29ya19wZW5kaW5nKCZwbTItPmNoZWNrX2h3X2ZhaWx1cmVfd29yaykpCi0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnBtMi0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrKTsKLQotCWZsdXNoX3dvcmsoJnBtMi0+YWNfd29yayk7Ci0JZmx1c2hfd29yaygmcG0yLT5jaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHBtMnh4eF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpwbTJ4eHhfaTJjX2NsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKLQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKLQotCXBtMiA9IChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKilpMmNfZ2V0X2NsaWVudGRhdGEocG0yeHh4X2kyY19jbGllbnQpOwotCWNsZWFyX2xwbl9waW4ocG0yKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHBtMnh4eF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKnBtMnh4eF9pMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yOwotCi0JcG0yID0gKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqKWkyY19nZXRfY2xpZW50ZGF0YShwbTJ4eHhfaTJjX2NsaWVudCk7Ci0KLQlpZiAoZ3Bpb19pc192YWxpZChwbTItPmxwbl9waW4pICYmIGdwaW9fZ2V0X3ZhbHVlKHBtMi0+bHBuX3BpbikgPT0gMCkKLQkJc2V0X2xwbl9waW4ocG0yKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcG0yeHh4X3BtX29wcyBfX21heWJlX3VudXNlZCA9IHsKLQlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwbTJ4eHhfd2FsbF9jaGFyZ2VyX3N1c3BlbmQsCi0JCXBtMnh4eF93YWxsX2NoYXJnZXJfcmVzdW1lKQotCVNFVF9SVU5USU1FX1BNX09QUyhwbTJ4eHhfcnVudGltZV9zdXNwZW5kLCBwbTJ4eHhfcnVudGltZV9yZXN1bWUsIE5VTEwpCi19OwotCi1zdGF0aWMgaW50IHBtMnh4eF93YWxsX2NoYXJnZXJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQsCi0JCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3QgcG0yeHh4X3BsYXRmb3JtX2RhdGEgKnBsX2RhdGEgPSBpMmNfY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7Ci0JaW50IHJldCA9IDA7Ci0JdTggdmFsOwotCWludCBpOwotCi0JaWYgKCFwbF9kYXRhKSB7Ci0JCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgIk5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwbTIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBtMikgewotCQlkZXZfZXJyKCZpMmNfY2xpZW50LT5kZXYsICJwbTJ4eHhfY2hhcmdlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIGdldCBwYXJlbnQgZGF0YSAqLwotCXBtMi0+ZGV2ID0gJmkyY19jbGllbnQtPmRldjsKLQotCXBtMi0+cG0yX2ludCA9ICZwbTJ4eHhfaW50OwotCi0JLyogZ2V0IGNoYXJnZXIgc3BjaWZpYyBwbGF0Zm9ybSBkYXRhICovCi0JaWYgKCFwbF9kYXRhLT53YWxsX2NoYXJnZXIpIHsKLQkJZGV2X2VycihwbTItPmRldiwgIm5vIGNoYXJnZXIgcGxhdGZvcm0gZGF0YSBzdXBwbGllZFxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZnJlZV9kZXZpY2VfaW5mbzsKLQl9Ci0KLQlwbTItPnBkYXRhID0gcGxfZGF0YS0+d2FsbF9jaGFyZ2VyOwotCi0JLyogZ2V0IGJhdHRlcnkgc3BlY2lmaWMgcGxhdGZvcm0gZGF0YSAqLwotCWlmICghcGxfZGF0YS0+YmF0dGVyeSkgewotCQlkZXZfZXJyKHBtMi0+ZGV2LCAibm8gYmF0dGVyeSBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBmcmVlX2RldmljZV9pbmZvOwotCX0KLQotCXBtMi0+YmF0ID0gcGxfZGF0YS0+YmF0dGVyeTsKLQotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoaTJjX2NsaWVudC0+YWRhcHRlciwKLQkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8Ci0JCQlJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQSkpIHsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZGV2X2luZm8ocG0yLT5kZXYsICJwbTIzMDEgaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkgZmFpbGVkXG4iKTsKLQkJZ290byBmcmVlX2RldmljZV9pbmZvOwotCX0KLQotCXBtMi0+Y29uZmlnLnBtMnh4eF9pMmMgPSBpMmNfY2xpZW50OwotCXBtMi0+Y29uZmlnLnBtMnh4eF9pZCA9IChzdHJ1Y3QgaTJjX2RldmljZV9pZCAqKSBpZDsKLQlpMmNfc2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCwgcG0yKTsKLQotCS8qIEFDIHN1cHBseSAqLwotCS8qIHBvd2VyX3N1cHBseSBiYXNlIGNsYXNzICovCi0JcG0yLT5hY19jaGdfZGVzYy5uYW1lID0gcG0yLT5wZGF0YS0+bGFiZWw7Ci0JcG0yLT5hY19jaGdfZGVzYy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7Ci0JcG0yLT5hY19jaGdfZGVzYy5wcm9wZXJ0aWVzID0gcG0yeHh4X2NoYXJnZXJfYWNfcHJvcHM7Ci0JcG0yLT5hY19jaGdfZGVzYy5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUocG0yeHh4X2NoYXJnZXJfYWNfcHJvcHMpOwotCXBtMi0+YWNfY2hnX2Rlc2MuZ2V0X3Byb3BlcnR5ID0gcG0yeHh4X2NoYXJnZXJfYWNfZ2V0X3Byb3BlcnR5OwotCi0JcHN5X2NmZy5zdXBwbGllZF90byA9IHBtMi0+cGRhdGEtPnN1cHBsaWVkX3RvOwotCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gcG0yLT5wZGF0YS0+bnVtX3N1cHBsaWNhbnRzOwotCS8qIHBtMnh4eF9jaGFyZ2VyIHN1Yi1jbGFzcyAqLwotCXBtMi0+YWNfY2hnLm9wcy5lbmFibGUgPSAmcG0yeHh4X2NoYXJnZXJfYWNfZW47Ci0JcG0yLT5hY19jaGcub3BzLmtpY2tfd2QgPSAmcG0yeHh4X2NoYXJnZXJfd2F0Y2hkb2dfa2ljazsKLQlwbTItPmFjX2NoZy5vcHMudXBkYXRlX2N1cnIgPSAmcG0yeHh4X2NoYXJnZXJfdXBkYXRlX2NoYXJnZXJfY3VycmVudDsKLQlwbTItPmFjX2NoZy5tYXhfb3V0X3ZvbHQgPSBwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcFsKLQkJQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcCkgLSAxXTsKLQlwbTItPmFjX2NoZy5tYXhfb3V0X2N1cnIgPSBwbTJ4eHhfY2hhcmdlcl9jdXJyZW50X21hcFsKLQkJQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl9jdXJyZW50X21hcCkgLSAxXTsKLQlwbTItPmFjX2NoZy53ZHRfcmVmcmVzaCA9IFdEX0tJQ0tfSU5URVJWQUw7Ci0JcG0yLT5hY19jaGcuZW5hYmxlZCA9IHRydWU7Ci0JcG0yLT5hY19jaGcuZXh0ZXJuYWwgPSB0cnVlOwotCi0JLyogQ3JlYXRlIGEgd29yayBxdWV1ZSBmb3IgdGhlIGNoYXJnZXIgKi8KLQlwbTItPmNoYXJnZXJfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgicG0yeHh4X2NoYXJnZXJfd3EiKTsKLQlpZiAocG0yLT5jaGFyZ2VyX3dxID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZGV2X2VycihwbTItPmRldiwgImZhaWxlZCB0byBjcmVhdGUgd29yayBxdWV1ZVxuIik7Ci0JCWdvdG8gZnJlZV9kZXZpY2VfaW5mbzsKLQl9Ci0KLQkvKiBJbml0IHdvcmsgZm9yIGNoYXJnZXIgZGV0ZWN0aW9uICovCi0JSU5JVF9XT1JLKCZwbTItPmFjX3dvcmssIHBtMnh4eF9jaGFyZ2VyX2FjX3dvcmspOwotCi0JLyogSW5pdCB3b3JrIGZvciBjaGVja2luZyBIVyBzdGF0dXMgKi8KLQlJTklUX1dPUksoJnBtMi0+Y2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yaywKLQkJcG0yeHh4X2NoYXJnZXJfY2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yayk7Ci0KLQkvKiBJbml0IHdvcmsgZm9yIEhXIGZhaWx1cmUgY2hlY2sgKi8KLQlJTklUX0RFRkVSUkFCTEVfV09SSygmcG0yLT5jaGVja19od19mYWlsdXJlX3dvcmssCi0JCXBtMnh4eF9jaGFyZ2VyX2NoZWNrX2h3X2ZhaWx1cmVfd29yayk7Ci0KLQkvKgotCSAqIFZERCBBREMgc3VwcGx5IG5lZWRzIHRvIGJlIGVuYWJsZWQgZnJvbSB0aGlzIGRyaXZlciB3aGVuIHRoZXJlCi0JICogaXMgYSBjaGFyZ2VyIGNvbm5lY3RlZCB0byBhdm9pZCBlcnJvbmVvdXMgQlRFTVBfSElHSC9MT1cKLQkgKiBpbnRlcnJ1cHRzIGR1cmluZyBjaGFyZ2luZwotCSAqLwotCXBtMi0+cmVndSA9IHJlZ3VsYXRvcl9nZXQocG0yLT5kZXYsICJ2ZGRhZGMiKTsKLQlpZiAoSVNfRVJSKHBtMi0+cmVndSkpIHsKLQkJcmV0ID0gUFRSX0VSUihwbTItPnJlZ3UpOwotCQlkZXZfZXJyKHBtMi0+ZGV2LCAiZmFpbGVkIHRvIGdldCB2ZGRhZGMgcmVndWxhdG9yXG4iKTsKLQkJZ290byBmcmVlX2NoYXJnZXJfd3E7Ci0JfQotCi0JLyogUmVnaXN0ZXIgQUMgY2hhcmdlciBjbGFzcyAqLwotCXBtMi0+YWNfY2hnLnBzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihwbTItPmRldiwgJnBtMi0+YWNfY2hnX2Rlc2MsCi0JCQkJCQkmcHN5X2NmZyk7Ci0JaWYgKElTX0VSUihwbTItPmFjX2NoZy5wc3kpKSB7Ci0JCWRldl9lcnIocG0yLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgQUMgY2hhcmdlclxuIik7Ci0JCXJldCA9IFBUUl9FUlIocG0yLT5hY19jaGcucHN5KTsKLQkJZ290byBmcmVlX3JlZ3VsYXRvcjsKLQl9Ci0KLQkvKiBSZWdpc3RlciBpbnRlcnJ1cHRzICovCi0JcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoZ3Bpb190b19pcnEocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSwKLQkJCQlOVUxMLAotCQkJCXBtMnh4eF9jaGFyZ2VyX2lycVswXS5pc3IsCi0JCQkJcG0yLT5wZGF0YS0+aXJxX3R5cGUsCi0JCQkJcG0yeHh4X2NoYXJnZXJfaXJxWzBdLm5hbWUsIHBtMik7Ci0KLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2VycihwbTItPmRldiwgImZhaWxlZCB0byByZXF1ZXN0ICVzIElSUSAlZDogJWRcbiIsCi0JCXBtMnh4eF9jaGFyZ2VyX2lycVswXS5uYW1lLAotCQkJZ3Bpb190b19pcnEocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSwgcmV0KTsKLQkJZ290byB1bnJlZ2lzdGVyX3BtMnh4eF9jaGFyZ2VyOwotCX0KLQotCXJldCA9IHBtX3J1bnRpbWVfc2V0X2FjdGl2ZShwbTItPmRldik7Ci0JaWYgKHJldCkKLQkJZGV2X2VycihwbTItPmRldiwgInNldCBhY3RpdmUgRXJyb3JcbiIpOwotCi0JcG1fcnVudGltZV9lbmFibGUocG0yLT5kZXYpOwotCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KHBtMi0+ZGV2LCBQTTJYWFhfQVVUT1NVU1BFTkRfREVMQVkpOwotCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKHBtMi0+ZGV2KTsKLQlwbV9ydW50aW1lX3Jlc3VtZShwbTItPmRldik7Ci0KLQkvKiBwbSBpbnRlcnJ1cHQgY2FuIHdha2UgdXAgc3lzdGVtICovCi0JcmV0ID0gZW5hYmxlX2lycV93YWtlKGdwaW9fdG9faXJxKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlcikpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihwbTItPmRldiwgImZhaWxlZCB0byBzZXQgaXJxIHdha2VcbiIpOwotCQlnb3RvIHVucmVnaXN0ZXJfcG0yeHh4X2ludGVycnVwdDsKLQl9Ci0KLQltdXRleF9pbml0KCZwbTItPmxvY2spOwotCi0JaWYgKGdwaW9faXNfdmFsaWQocG0yLT5wZGF0YS0+bHBuX2dwaW8pKSB7Ci0JCS8qIGdldCBscG4gR1BJTyBmcm9tIHBsYXRmb3JtIGRhdGEgKi8KLQkJcG0yLT5scG5fcGluID0gcG0yLT5wZGF0YS0+bHBuX2dwaW87Ci0KLQkJLyoKLQkJICogQ2hhcmdlciBkZXRlY3Rpb24gbWVjaGFuaXNtIHJlcXVpcmVzIHB1bGxpbmcgdXAgdGhlIExQTiBwaW4KLQkJICogd2hpbGUgaTJjIGNvbW11bmljYXRpb24gaWYgQ2hhcmdlciBpcyBub3QgY29ubmVjdGVkCi0JCSAqIExQTiBwaW4gb2YgUE0yMzAxIGlzIEdQSU82MCBvZiBBQjk1NDAKLQkJICovCi0JCXJldCA9IGdwaW9fcmVxdWVzdChwbTItPmxwbl9waW4sICJwbTIzMDFfbHBtX2dwaW8iKTsKLQotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwgInBtMjMwMV9scG1fZ3BpbyByZXF1ZXN0IGZhaWxlZFxuIik7Ci0JCQlnb3RvIGRpc2FibGVfcG0yX2lycV93YWtlOwotCQl9Ci0JCXJldCA9IGdwaW9fZGlyZWN0aW9uX291dHB1dChwbTItPmxwbl9waW4sIDApOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihwbTItPmRldiwgInBtMjMwMV9scG1fZ3BpbyBkaXJlY3Rpb24gZmFpbGVkXG4iKTsKLQkJCWdvdG8gZnJlZV9ncGlvOwotCQl9Ci0JCXNldF9scG5fcGluKHBtMik7Ci0JfQotCi0JLyogcmVhZCAgaW50ZXJydXB0IHJlZ2lzdGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBQTTJYWFhfTlVNX0lOVF9SRUc7IGkrKykKLQkJcG0yeHh4X3JlZ19yZWFkKHBtMiwKLQkJCXBtMnh4eF9pbnRlcnJ1cHRfcmVnaXN0ZXJzW2ldLAotCQkJJnZhbCk7Ci0KLQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9kZXRlY3Rpb24ocG0yLCAmdmFsKTsKLQotCWlmICgocmV0ID09IDApICYmIHZhbCkgewotCQlwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkID0gMTsKLQkJYWI4NTAwX292ZXJyaWRlX3R1cm5fb25fc3RhdCh+QUI4NTAwX1BPV19LRVlfMV9PTiwKLQkJCQkJICAgICBBQjg1MDBfTUFJTl9DSF9ERVQpOwotCQlwbTItPmFjX2Nvbm4gPSB0cnVlOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOwotCQlzeXNmc19ub3RpZnkoJnBtMi0+YWNfY2hnLnBzeS0+ZGV2LmtvYmosIE5VTEwsICJwcmVzZW50Iik7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWZyZWVfZ3BpbzoKLQlpZiAoZ3Bpb19pc192YWxpZChwbTItPmxwbl9waW4pKQotCQlncGlvX2ZyZWUocG0yLT5scG5fcGluKTsKLWRpc2FibGVfcG0yX2lycV93YWtlOgotCWRpc2FibGVfaXJxX3dha2UoZ3Bpb190b19pcnEocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSk7Ci11bnJlZ2lzdGVyX3BtMnh4eF9pbnRlcnJ1cHQ6Ci0JLyogZGlzYWJsZSBpbnRlcnJ1cHQgKi8KLQlmcmVlX2lycShncGlvX3RvX2lycShwbTItPnBkYXRhLT5ncGlvX2lycV9udW1iZXIpLCBwbTIpOwotdW5yZWdpc3Rlcl9wbTJ4eHhfY2hhcmdlcjoKLQkvKiB1bnJlZ2lzdGVyIHBvd2VyIHN1cHBseSAqLwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBtMi0+YWNfY2hnLnBzeSk7Ci1mcmVlX3JlZ3VsYXRvcjoKLQkvKiBkaXNhYmxlIHRoZSByZWd1bGF0b3IgKi8KLQlyZWd1bGF0b3JfcHV0KHBtMi0+cmVndSk7Ci1mcmVlX2NoYXJnZXJfd3E6Ci0JZGVzdHJveV93b3JrcXVldWUocG0yLT5jaGFyZ2VyX3dxKTsKLWZyZWVfZGV2aWNlX2luZm86Ci0Ja2ZyZWUocG0yKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcG0yeHh4X3dhbGxfY2hhcmdlcl9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQpCi17Ci0Jc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCk7Ci0KLQkvKiBEaXNhYmxlIHBtX3J1bnRpbWUgKi8KLQlwbV9ydW50aW1lX2Rpc2FibGUocG0yLT5kZXYpOwotCS8qIERpc2FibGUgQUMgY2hhcmdpbmcgKi8KLQlwbTJ4eHhfY2hhcmdlcl9hY19lbigmcG0yLT5hY19jaGcsIGZhbHNlLCAwLCAwKTsKLQotCS8qIERpc2FibGUgd2FrZSBieSBwbSBpbnRlcnJ1cHQgKi8KLQlkaXNhYmxlX2lycV93YWtlKGdwaW9fdG9faXJxKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlcikpOwotCi0JLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JZnJlZV9pcnEoZ3Bpb190b19pcnEocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSwgcG0yKTsKLQotCS8qIERlbGV0ZSB0aGUgd29yayBxdWV1ZSAqLwotCWRlc3Ryb3lfd29ya3F1ZXVlKHBtMi0+Y2hhcmdlcl93cSk7Ci0KLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCi0JLyogZGlzYWJsZSB0aGUgcmVndWxhdG9yICovCi0JcmVndWxhdG9yX3B1dChwbTItPnJlZ3UpOwotCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocG0yLT5hY19jaGcucHN5KTsKLQotCWlmIChncGlvX2lzX3ZhbGlkKHBtMi0+bHBuX3BpbikpCi0JCWdwaW9fZnJlZShwbTItPmxwbl9waW4pOwotCi0Ja2ZyZWUocG0yKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcG0yeHh4X2lkW10gPSB7Ci0JeyAicG0yMzAxIiwgMCB9LAotCXsgfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHBtMnh4eF9pZCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwbTJ4eHhfY2hhcmdlcl9kcml2ZXIgPSB7Ci0JLnByb2JlID0gcG0yeHh4X3dhbGxfY2hhcmdlcl9wcm9iZSwKLQkucmVtb3ZlID0gcG0yeHh4X3dhbGxfY2hhcmdlcl9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAicG0yeHh4LXdhbGxfY2hhcmdlciIsCi0JCS5wbSA9IElTX0VOQUJMRUQoQ09ORklHX1BNKSA/ICZwbTJ4eHhfcG1fb3BzIDogTlVMTCwKLQl9LAotCS5pZF90YWJsZSA9IHBtMnh4eF9pZCwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBtMnh4eF9jaGFyZ2VyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnBtMnh4eF9jaGFyZ2VyX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwbTJ4eHhfY2hhcmdlcl9leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJnBtMnh4eF9jaGFyZ2VyX2RyaXZlcik7Ci19Ci0KLWRldmljZV9pbml0Y2FsbF9zeW5jKHBtMnh4eF9jaGFyZ2VyX2luaXQpOwotbW9kdWxlX2V4aXQocG0yeHh4X2NoYXJnZXJfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9BVVRIT1IoIlJhamt1bWFyIGthc2lyYWphbiwgT2xpdmllciBMYXVuYXkiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUE0yeHh4IGNoYXJnZXIgbWFuYWdlbWVudCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQva2V5c3RvbmUtcmVzZXQuYyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQva2V5c3RvbmUtcmVzZXQuYwppbmRleCBjNzBmMWJmLi4wOTM4MDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L2tleXN0b25lLXJlc2V0LmMKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9rZXlzdG9uZS1yZXNldC5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAkJfQogCiAJCWlmICh2YWwgPj0gV0RUX01VWF9OVU1CRVIpIHsKLQkJCWRldl9lcnIoZGV2LCAidGksd2R0LWxpc3QgcHJvcGVydHkgY2FuIGNvbnRhaW4iCisJCQlkZXZfZXJyKGRldiwgInRpLHdkdC1saXN0IHByb3BlcnR5IGNhbiBjb250YWluICIKIAkJCQkib25seSBudW1iZXJzIDwgNFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9yZXNldC9yZWJvb3QtbW9kZS5jIGIvZHJpdmVycy9wb3dlci9yZXNldC9yZWJvb3QtbW9kZS5jCmluZGV4IDJkZmJiY2UuLmZiNTEyMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvcmVib290LW1vZGUuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3JlYm9vdC1tb2RlLmMKQEAgLTEzNSw2ICsxMzUsNjUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlYm9vdF9tb2RlX3VucmVnaXN0ZXIpOwogCitzdGF0aWMgdm9pZCBkZXZtX3JlYm9vdF9tb2RlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCit7CisJcmVib290X21vZGVfdW5yZWdpc3RlcigqKHN0cnVjdCByZWJvb3RfbW9kZV9kcml2ZXIgKiopcmVzKTsKK30KKworLyoqCisgKiBkZXZtX3JlYm9vdF9tb2RlX3JlZ2lzdGVyKCkgLSByZXNvdXJjZSBtYW5hZ2VkIHJlYm9vdF9tb2RlX3JlZ2lzdGVyKCkKKyAqIEBkZXY6IGRldmljZSB0byBhc3NvY2lhdGUgdGhpcyByZXNvdXJjZSB3aXRoCisgKiBAcmVib290OiByZWJvb3QgbW9kZSBkcml2ZXIKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBkZXZtX3JlYm9vdF9tb2RlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCByZWJvb3RfbW9kZV9kcml2ZXIgKnJlYm9vdCkKK3sKKwlzdHJ1Y3QgcmVib290X21vZGVfZHJpdmVyICoqZHI7CisJaW50IHJjOworCisJZHIgPSBkZXZyZXNfYWxsb2MoZGV2bV9yZWJvb3RfbW9kZV9yZWxlYXNlLCBzaXplb2YoKmRyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyYyA9IHJlYm9vdF9tb2RlX3JlZ2lzdGVyKHJlYm9vdCk7CisJaWYgKHJjKSB7CisJCWRldnJlc19mcmVlKGRyKTsKKwkJcmV0dXJuIHJjOworCX0KKworCSpkciA9IHJlYm9vdDsKKwlkZXZyZXNfYWRkKGRldiwgZHIpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZtX3JlYm9vdF9tb2RlX3JlZ2lzdGVyKTsKKworc3RhdGljIGludCBkZXZtX3JlYm9vdF9tb2RlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcmVzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCByZWJvb3RfbW9kZV9kcml2ZXIgKipwID0gcmVzOworCisJaWYgKFdBUk5fT04oIXAgfHwgISpwKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKnAgPT0gZGF0YTsKK30KKworLyoqCisgKiBkZXZtX3JlYm9vdF9tb2RlX3VucmVnaXN0ZXIoKSAtIHJlc291cmNlIG1hbmFnZWQgcmVib290X21vZGVfdW5yZWdpc3RlcigpCisgKiBAZGV2OiBkZXZpY2UgdG8gYXNzb2NpYXRlIHRoaXMgcmVzb3VyY2Ugd2l0aAorICogQHJlYm9vdDogcmVib290IG1vZGUgZHJpdmVyCisgKi8KK3ZvaWQgZGV2bV9yZWJvb3RfbW9kZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IHJlYm9vdF9tb2RlX2RyaXZlciAqcmVib290KQoreworCVdBUk5fT04oZGV2cmVzX3JlbGVhc2UoZGV2LAorCQkJICAgICAgIGRldm1fcmVib290X21vZGVfcmVsZWFzZSwKKwkJCSAgICAgICBkZXZtX3JlYm9vdF9tb2RlX21hdGNoLCByZWJvb3QpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1fcmVib290X21vZGVfdW5yZWdpc3Rlcik7CisKIE1PRFVMRV9BVVRIT1IoIkFuZHkgWWFuIDxhbmR5LnlhbkByb2NrLWNoaXBzLmNvbSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTeXN0ZW0gcmVib290IG1vZGUgY29yZSBsaWJyYXJ5Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3JlYm9vdC1tb2RlLmggYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3JlYm9vdC1tb2RlLmgKaW5kZXggMjQ5MWJiNy4uNzVmN2ZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9yZXNldC9yZWJvb3QtbW9kZS5oCisrKyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvcmVib290LW1vZGUuaApAQCAtMTAsNSArMTAsOSBAQAogCiBpbnQgcmVib290X21vZGVfcmVnaXN0ZXIoc3RydWN0IHJlYm9vdF9tb2RlX2RyaXZlciAqcmVib290KTsKIGludCByZWJvb3RfbW9kZV91bnJlZ2lzdGVyKHN0cnVjdCByZWJvb3RfbW9kZV9kcml2ZXIgKnJlYm9vdCk7CitpbnQgZGV2bV9yZWJvb3RfbW9kZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgcmVib290X21vZGVfZHJpdmVyICpyZWJvb3QpOwordm9pZCBkZXZtX3JlYm9vdF9tb2RlX3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgcmVib290X21vZGVfZHJpdmVyICpyZWJvb3QpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvc3QtcG93ZXJvZmYuYyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvc3QtcG93ZXJvZmYuYwppbmRleCBhNDg4ODc3Li4yMDQ2YjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3N0LXBvd2Vyb2ZmLmMKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9zdC1wb3dlcm9mZi5jCkBAIC0yOCwyOCArMjgsNiBAQAogCXVuc2lnbmVkIGludCBtYXNrX3JzdF9tc2s7CiB9OwogCi0vKiBTVGlINDE1ICovCi0jZGVmaW5lIFNUSUg0MTVfU1lTQ0ZHXzExCTB4MmMKLSNkZWZpbmUgU1RJSDQxNV9TWVNDRkdfMTUJMHgzYwotCi1zdGF0aWMgc3RydWN0IHJlc2V0X3N5c2NmZyBzdGloNDE1X3Jlc2V0ID0gewotCS5vZmZzZXRfcnN0ID0gU1RJSDQxNV9TWVNDRkdfMTEsCi0JLm1hc2tfcnN0ID0gQklUKDApLAotCS5vZmZzZXRfcnN0X21zayA9IFNUSUg0MTVfU1lTQ0ZHXzE1LAotCS5tYXNrX3JzdF9tc2sgPSBCSVQoMCkKLX07Ci0KLS8qIFNUaUg0MTYgKi8KLSNkZWZpbmUgU1RJSDQxNl9TWVNDRkdfNTAwCTB4N2QwCi0jZGVmaW5lIFNUSUg0MTZfU1lTQ0ZHXzUwNAkweDdlMAotCi1zdGF0aWMgc3RydWN0IHJlc2V0X3N5c2NmZyBzdGloNDE2X3Jlc2V0ID0gewotCS5vZmZzZXRfcnN0ID0gU1RJSDQxNl9TWVNDRkdfNTAwLAotCS5tYXNrX3JzdCA9IEJJVCgwKSwKLQkub2Zmc2V0X3JzdF9tc2sgPSBTVElINDE2X1NZU0NGR181MDQsCi0JLm1hc2tfcnN0X21zayA9IEJJVCgwKQotfTsKLQogLyogU1RpSDQwNyAqLwogI2RlZmluZSBTVElINDA3X1NZU0NGR180MDAwCTB4MAogI2RlZmluZSBTVElINDA3X1NZU0NGR180MDA4CTB4MjAKQEAgLTYxLDE2ICszOSw2IEBACiAJLm1hc2tfcnN0X21zayA9IEJJVCgwKQogfTsKIAotLyogU1RpRDEyNyAqLwotI2RlZmluZSBTVElEMTI3X1NZU0NGR183MDAJMHgwCi0jZGVmaW5lIFNUSUQxMjdfU1lTQ0ZHXzc3MwkweDEyNAotCi1zdGF0aWMgc3RydWN0IHJlc2V0X3N5c2NmZyBzdGlkMTI3X3Jlc2V0ID0gewotCS5vZmZzZXRfcnN0ID0gU1RJRDEyN19TWVNDRkdfNzczLAotCS5tYXNrX3JzdCA9IEJJVCgwKSwKLQkub2Zmc2V0X3JzdF9tc2sgPSBTVElEMTI3X1NZU0NGR183MDAsCi0JLm1hc2tfcnN0X21zayA9IEJJVCg4KQotfTsKIAogc3RhdGljIHN0cnVjdCByZXNldF9zeXNjZmcgKnN0X3Jlc3RhcnRfc3lzY2ZnOwogCkBAIC05OSwxNyArNjcsOCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdF9yZXNldF9vZl9tYXRjaFtdID0gewogCXsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNS1yZXN0YXJ0IiwKLQkJLmRhdGEgPSAodm9pZCAqKSZzdGloNDE1X3Jlc2V0LAotCX0sIHsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1yZXN0YXJ0IiwKLQkJLmRhdGEgPSAodm9pZCAqKSZzdGloNDE2X3Jlc2V0LAotCX0sIHsKIAkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy1yZXN0YXJ0IiwKIAkJLmRhdGEgPSAodm9pZCAqKSZzdGloNDA3X3Jlc2V0LAotCX0sIHsKLQkJLmNvbXBhdGlibGUgPSAic3Qsc3RpZDEyNy1yZXN0YXJ0IiwKLQkJLmRhdGEgPSAodm9pZCAqKSZzdGlkMTI3X3Jlc2V0LAogCX0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3N5c2Nvbi1yZWJvb3QtbW9kZS5jIGIvZHJpdmVycy9wb3dlci9yZXNldC9zeXNjb24tcmVib290LW1vZGUuYwppbmRleCA5ZTFjYmE1Li4xZWNiNTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3N5c2Nvbi1yZWJvb3QtbW9kZS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvc3lzY29uLXJlYm9vdC1tb2RlLmMKQEAgLTUzLDggKzUzLDYgQEAKIAlzeXNjb25fcmJtLT5yZWJvb3Qud3JpdGUgPSBzeXNjb25fcmVib290X21vZGVfd3JpdGU7CiAJc3lzY29uX3JibS0+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+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1heGltIDE0NTc3Lzc3ODM2IGNoYXJnZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDE3MDQwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L21heDE3MDQwX2JhdHRlcnkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9tYXgxNzA0MF9iYXR0ZXJ5LmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L21heDE3MDQwX2JhdHRlcnkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXgxNzA0Ml9iYXR0ZXJ5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXgxNzA0Ml9iYXR0ZXJ5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc3VwcGx5L21heDc3NjkzX2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L21heDc3NjkzX2NoYXJnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzc4ODg0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4Nzc2OTNfY2hhcmdlci5jCkBAIC0wLDAgKzEsNzcxIEBACisvKgorICogbWF4Nzc2OTNfY2hhcmdlci5jIC0gQmF0dGVyeSBjaGFyZ2VyIGRyaXZlciBmb3IgdGhlIE1heGltIDc3NjkzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIEtyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg3NzY5My5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg3NzY5My1jb21tb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWF4Nzc2OTMtcHJpdmF0ZS5oPgorCisjZGVmaW5lIE1BWDc3NjkzX0NIQVJHRVJfTkFNRQkJCQkibWF4Nzc2OTMtY2hhcmdlciIKK3N0YXRpYyBjb25zdCBjaGFyICptYXg3NzY5M19jaGFyZ2VyX21vZGVsCQk9ICJNQVg3NzY5MyI7CitzdGF0aWMgY29uc3QgY2hhciAqbWF4Nzc2OTNfY2hhcmdlcl9tYW51ZmFjdHVyZXIJPSAiTWF4aW0gSW50ZWdyYXRlZCI7CisKK3N0cnVjdCBtYXg3NzY5M19jaGFyZ2VyIHsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXN0cnVjdCBtYXg3NzY5M19kZXYJKm1heDc3NjkzOworCXN0cnVjdCBwb3dlcl9zdXBwbHkJKmNoYXJnZXI7CisKKwl1MzIgY29uc3RhbnRfdm9sdDsKKwl1MzIgbWluX3N5c3RlbV92b2x0OworCXUzMiB0aGVybWFsX3JlZ3VsYXRpb25fdGVtcDsKKwl1MzIgYmF0dHRlcnlfb3ZlcmN1cnJlbnQ7CisJdTMyIGNoYXJnZV9pbnB1dF90aHJlc2hvbGRfdm9sdDsKK307CisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfZ2V0X2NoYXJnZXJfc3RhdGUoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgKnZhbCkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBkYXRhOworCisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19ERVRBSUxTXzAxLCAmZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlkYXRhICY9IENIR19ERVRBSUxTXzAxX0NIR19NQVNLOworCWRhdGEgPj49IENIR19ERVRBSUxTXzAxX0NIR19TSElGVDsKKworCXN3aXRjaCAoZGF0YSkgeworCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfUFJFUVVBTElGSUNBVElPTjoKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0ZBU1RfQ09OU1RfQ1VSUkVOVDoKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0ZBU1RfQ09OU1RfVk9MVEFHRToKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1RPUF9PRkY6CisJLyogSW4gaGlnaCB0ZW1wIHRoZSBjaGFyZ2luZyBjdXJyZW50IGlzIHJlZHVjZWQsIGJ1dCBzdGlsbCBjaGFyZ2luZyAqLworCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfSElHSF9URU1QOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKwkJYnJlYWs7CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19ET05FOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCQlicmVhazsKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1RJTUVSX0VYUElSRUQ6CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19USEVSTUlTVE9SX1NVU1BFTkQ6CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwkJYnJlYWs7CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19PRkY6CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19PVkVSX1RFTVA6CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19XQVRDSERPR19FWFBJUkVEOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwkJYnJlYWs7CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19SRVNFUlZFRDoKKwlkZWZhdWx0OgorCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDc3NjkzX2dldF9jaGFyZ2VfdHlwZShzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0RFVEFJTFNfMDEsICZkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRhdGEgJj0gQ0hHX0RFVEFJTFNfMDFfQ0hHX01BU0s7CisJZGF0YSA+Pj0gQ0hHX0RFVEFJTFNfMDFfQ0hHX1NISUZUOworCisJc3dpdGNoIChkYXRhKSB7CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19QUkVRVUFMSUZJQ0FUSU9OOgorCS8qCisJICogVG9wLW9mZjogdHJpY2tsZSBvciBmYXN0PyBJbiB0b3Atb2ZmIHRoZSBjdXJyZW50IHZhcmllcyBiZXR3ZWVuCisJICogMTAwIGFuZCAyNTAgbUEuIEl0IGlzIGhpZ2hlciB0aGFuIHByZXF1YWxpZmljYXRpb24gY3VycmVudC4KKwkgKi8KKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1RPUF9PRkY6CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfVFJJQ0tMRTsKKwkJYnJlYWs7CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19GQVNUX0NPTlNUX0NVUlJFTlQ6CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19GQVNUX0NPTlNUX1ZPTFRBR0U6CisJLyogSW4gaGlnaCB0ZW1wIHRoZSBjaGFyZ2luZyBjdXJyZW50IGlzIHJlZHVjZWQsIGJ1dCBzdGlsbCBjaGFyZ2luZyAqLworCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfSElHSF9URU1QOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX0ZBU1Q7CisJCWJyZWFrOworCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfRE9ORToKKwljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1RJTUVSX0VYUElSRUQ6CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19USEVSTUlTVE9SX1NVU1BFTkQ6CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19PRkY6CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19PVkVSX1RFTVA6CisJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19XQVRDSERPR19FWFBJUkVEOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX05PTkU7CisJCWJyZWFrOworCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfUkVTRVJWRUQ6CisJZGVmYXVsdDoKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9VTktOT1dOOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogU3VwcG9ydGVkIGhlYWx0aCBzdGF0dXNlczoKKyAqICAtIFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRAorICogIC0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09ECisgKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFCisgKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX1NBRkVUWV9USU1FUl9FWFBJUkUKKyAqICAtIFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5LTk9XTgorICogIC0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRQorICovCitzdGF0aWMgaW50IG1heDc3NjkzX2dldF9iYXR0ZXJ5X2hlYWx0aChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQoreworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0RFVEFJTFNfMDEsICZkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRhdGEgJj0gQ0hHX0RFVEFJTFNfMDFfQkFUX01BU0s7CisJZGF0YSA+Pj0gQ0hHX0RFVEFJTFNfMDFfQkFUX1NISUZUOworCisJc3dpdGNoIChkYXRhKSB7CisJY2FzZSBNQVg3NzY5M19CQVRURVJZX05PQkFUOgorCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOworCQlicmVhazsKKwljYXNlIE1BWDc3NjkzX0JBVFRFUllfUFJFUVVBTElGSUNBVElPTjoKKwljYXNlIE1BWDc3NjkzX0JBVFRFUllfR09PRDoKKwljYXNlIE1BWDc3NjkzX0JBVFRFUllfTE9XVk9MVEFHRToKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKKwkJYnJlYWs7CisJY2FzZSBNQVg3NzY5M19CQVRURVJZX1RJTUVSX0VYUElSRUQ6CisJCS8qCisJCSAqIFRvb2sgbG9uZ2VyIHRvIGNoYXJnZSB0aGFuIGV4cGVjdGVkLCBjaGFyZ2luZyBzdXNwZW5kZWQuCisJCSAqIERhbWFnZWQgYmF0dGVyeT8KKwkJICovCisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1NBRkVUWV9USU1FUl9FWFBJUkU7CisJCWJyZWFrOworCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9PVkVSVk9MVEFHRToKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7CisJCWJyZWFrOworCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9PVkVSQ1VSUkVOVDoKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5TUEVDX0ZBSUxVUkU7CisJCWJyZWFrOworCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9SRVNFUlZFRDoKKwlkZWZhdWx0OgorCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTktOT1dOOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXg3NzY5M19nZXRfcHJlc2VudChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQoreworCXVuc2lnbmVkIGludCBkYXRhOworCWludCByZXQ7CisKKwkvKgorCSAqIFJlYWQgQ0hHX0lOVF9PSyByZWdpc3Rlci4gSGlnaCBERVRCQVQgYml0IGhlcmUgc2hvdWxkIGJlCisJICogZXF1YWwgdG8gdmFsdWUgMHgwIGluIENIR19ERVRBSUxTXzAxL0JBVCBmaWVsZC4KKwkgKi8KKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0lOVF9PSywgJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKnZhbCA9IChkYXRhICYgQ0hHX0lOVF9PS19ERVRCQVRfTUFTSykgPyAwIDogMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDc3NjkzX2dldF9vbmxpbmUoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19JTlRfT0ssICZkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSp2YWwgPSAoZGF0YSAmIENIR19JTlRfT0tfQ0hHSU5fTUFTSykgPyAxIDogMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgbWF4Nzc2OTNfY2hhcmdlcl9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCisJUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCit9OworCitzdGF0aWMgaW50IG1heDc3NjkzX2NoYXJnZXJfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCSAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gY2hnLT5tYXg3NzY5My0+cmVnbWFwOworCWludCByZXQgPSAwOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJcmV0ID0gbWF4Nzc2OTNfZ2V0X2NoYXJnZXJfc3RhdGUocmVnbWFwLCAmdmFsLT5pbnR2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9UWVBFOgorCQlyZXQgPSBtYXg3NzY5M19nZXRfY2hhcmdlX3R5cGUocmVnbWFwLCAmdmFsLT5pbnR2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJcmV0ID0gbWF4Nzc2OTNfZ2V0X2JhdHRlcnlfaGVhbHRoKHJlZ21hcCwgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCQlyZXQgPSBtYXg3NzY5M19nZXRfcHJlc2VudChyZWdtYXAsICZ2YWwtPmludHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQlyZXQgPSBtYXg3NzY5M19nZXRfb25saW5lKHJlZ21hcCwgJnZhbC0+aW50dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FOgorCQl2YWwtPnN0cnZhbCA9IG1heDc3NjkzX2NoYXJnZXJfbW9kZWw7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSOgorCQl2YWwtPnN0cnZhbCA9IG1heDc3NjkzX2NoYXJnZXJfbWFudWZhY3R1cmVyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIG1heDc3NjkzX2NoYXJnZXJfZGVzYyA9IHsKKwkubmFtZQkJPSBNQVg3NzY5M19DSEFSR0VSX05BTUUsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwk9IG1heDc3NjkzX2NoYXJnZXJfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShtYXg3NzY5M19jaGFyZ2VyX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CT0gbWF4Nzc2OTNfY2hhcmdlcl9nZXRfcHJvcGVydHksCit9OworCitzdGF0aWMgc3NpemVfdCBkZXZpY2VfYXR0cl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkJaW50ICgqZm4pKHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICosIHVuc2lnbmVkIGxvbmcpKQoreworCXN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0ga3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGZuKGNoZywgdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBmYXN0X2NoYXJnZV90aW1lcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGRhdGEsIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3JlYWQoY2hnLT5tYXg3NzY5My0+cmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzAxLAorCQkJJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGF0YSAmPSBDSEdfQ05GR18wMV9GQ0hHVElNRV9NQVNLOworCWRhdGEgPj49IENIR19DTkZHXzAxX0ZDSEdUSU1FX1NISUZUOworCXN3aXRjaCAoZGF0YSkgeworCWNhc2UgMHgxIC4uLiAweDc6CisJCS8qIFN0YXJ0aW5nIGZyb20gNCBob3Vycywgc3RlcCBieSAyIGhvdXJzICovCisJCXZhbCA9IDQgKyAoZGF0YSAtIDEpICogMjsKKwkJYnJlYWs7CisJY2FzZSAweDA6CisJZGVmYXVsdDoKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgaW50IG1heDc3NjkzX3NldF9mYXN0X2NoYXJnZV90aW1lcihzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnLAorCQl1bnNpZ25lZCBsb25nIGhvdXJzKQoreworCXVuc2lnbmVkIGludCBkYXRhOworCisJLyoKKwkgKiAweDAwIC0gZGlzYWJsZQorCSAqIDB4MDEgLSA0aAorCSAqIDB4MDIgLSA2aAorCSAqIC4uLgorCSAqIDB4MDcgLSAxNmgKKwkgKiBSb3VuZCBkb3duIG9kZCB2YWx1ZXMuCisJICovCisJc3dpdGNoIChob3VycykgeworCWNhc2UgNCAuLi4gMTY6CisJCWRhdGEgPSAoaG91cnMgLSA0KSAvIDIgKyAxOworCQlicmVhazsKKwljYXNlIDA6CisJCS8qIERpc2FibGUgKi8KKwkJZGF0YSA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkYXRhIDw8PSBDSEdfQ05GR18wMV9GQ0hHVElNRV9TSElGVDsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hnLT5tYXg3NzY5My0+cmVnbWFwLAorCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wMSwKKwkJCUNIR19DTkZHXzAxX0ZDSEdUSU1FX01BU0ssIGRhdGEpOworfQorCitzdGF0aWMgc3NpemVfdCBmYXN0X2NoYXJnZV90aW1lcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gZGV2aWNlX2F0dHJfc3RvcmUoZGV2LCBhdHRyLCBidWYsIGNvdW50LAorCQkJbWF4Nzc2OTNfc2V0X2Zhc3RfY2hhcmdlX3RpbWVyKTsKK30KKworc3RhdGljIHNzaXplX3QgdG9wX29mZl90aHJlc2hvbGRfY3VycmVudF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IGRhdGEsIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3JlYWQoY2hnLT5tYXg3NzY5My0+cmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzAzLAorCQkJJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZGF0YSAmPSBDSEdfQ05GR18wM19UT0lUSF9NQVNLOworCWRhdGEgPj49IENIR19DTkZHXzAzX1RPSVRIX1NISUZUOworCisJaWYgKGRhdGEgPD0gMHgwNCkKKwkJdmFsID0gMTAwMDAwICsgZGF0YSAqIDI1MDAwOworCWVsc2UKKwkJdmFsID0gZGF0YSAqIDUwMDAwOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgaW50IG1heDc3NjkzX3NldF90b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50KHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCisJCXVuc2lnbmVkIGxvbmcgdWFtcCkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCWlmICh1YW1wIDwgMTAwMDAwIHx8IHVhbXAgPiAzNTAwMDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHVhbXAgPD0gMjAwMDAwKQorCQlkYXRhID0gKHVhbXAgLSAxMDAwMDApIC8gMjUwMDA7CisJZWxzZQorCQkvKiAoMjAwMDAwLCAzNTAwMDA+ICovCisJCWRhdGEgPSB1YW1wIC8gNTAwMDA7CisKKwlkYXRhIDw8PSBDSEdfQ05GR18wM19UT0lUSF9TSElGVDsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hnLT5tYXg3NzY5My0+cmVnbWFwLAorCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wMywKKwkJCUNIR19DTkZHXzAzX1RPSVRIX01BU0ssIGRhdGEpOworfQorCitzdGF0aWMgc3NpemVfdCB0b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBkZXZpY2VfYXR0cl9zdG9yZShkZXYsIGF0dHIsIGJ1ZiwgY291bnQsCisJCQltYXg3NzY5M19zZXRfdG9wX29mZl90aHJlc2hvbGRfY3VycmVudCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRvcF9vZmZfdGltZXJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCBkYXRhLCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wMywKKwkJCSZkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRhdGEgJj0gQ0hHX0NORkdfMDNfVE9USU1FX01BU0s7CisJZGF0YSA+Pj0gQ0hHX0NORkdfMDNfVE9USU1FX1NISUZUOworCisJdmFsID0gZGF0YSAqIDEwOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgaW50IG1heDc3NjkzX3NldF90b3Bfb2ZmX3RpbWVyKHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcsCisJCXVuc2lnbmVkIGxvbmcgbWludXRlcykKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCWlmIChtaW51dGVzID4gNzApCisJCXJldHVybiAtRUlOVkFMOworCisJZGF0YSA9IG1pbnV0ZXMgLyAxMDsKKwlkYXRhIDw8PSBDSEdfQ05GR18wM19UT1RJTUVfU0hJRlQ7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwKKwkJCU1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDMsCisJCQlDSEdfQ05GR18wM19UT1RJTUVfTUFTSywgZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRvcF9vZmZfdGltZXJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIGRldmljZV9hdHRyX3N0b3JlKGRldiwgYXR0ciwgYnVmLCBjb3VudCwKKwkJCW1heDc3NjkzX3NldF90b3Bfb2ZmX3RpbWVyKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSX1JXKGZhc3RfY2hhcmdlX3RpbWVyKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyh0b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50KTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyh0b3Bfb2ZmX3RpbWVyKTsKKworc3RhdGljIGludCBtYXg3NzY5M19zZXRfY29uc3RhbnRfdm9sdChzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnLAorCQl1bnNpZ25lZCBpbnQgdXZvbHQpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwkvKgorCSAqIDB4MDAgLSAzLjY1MCBWCisJICogMHgwMSAtIDMuNjc1IFYKKwkgKiAuLi4KKwkgKiAweDFiIC0gNC4zMjUgVgorCSAqIDB4MWMgLSA0LjM0MCBWCisJICogMHgxZCAtIDQuMzUwIFYKKwkgKiAweDFlIC0gNC4zNzUgVgorCSAqIDB4MWYgLSA0LjQwMCBWCisJICovCisJaWYgKHV2b2x0ID49IDM2NTAwMDAgJiYgdXZvbHQgPCA0MzQwMDAwKQorCQlkYXRhID0gKHV2b2x0IC0gMzY1MDAwMCkgLyAyNTAwMDsKKwllbHNlIGlmICh1dm9sdCA+PSA0MzQwMDAwICYmIHV2b2x0IDwgNDM1MDAwMCkKKwkJZGF0YSA9IDB4MWM7CisJZWxzZSBpZiAodXZvbHQgPj0gNDM1MDAwMCAmJiB1dm9sdCA8PSA0NDAwMDAwKQorCQlkYXRhID0gMHgxZCArICh1dm9sdCAtIDQzNTAwMDApIC8gMjUwMDA7CisJZWxzZSB7CisJCWRldl9lcnIoY2hnLT5kZXYsICJXcm9uZyB2YWx1ZSBmb3IgY2hhcmdpbmcgY29uc3RhbnQgdm9sdGFnZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRhdGEgPDw9IENIR19DTkZHXzA0X0NIR0NWUFJNX1NISUZUOworCisJZGV2X2RiZyhjaGctPmRldiwgIkNoYXJnaW5nIGNvbnN0YW50IHZvbHRhZ2U6ICV1ICgweCV4KVxuIiwgdXZvbHQsCisJCQlkYXRhKTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hnLT5tYXg3NzY5My0+cmVnbWFwLAorCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18wNCwKKwkJCUNIR19DTkZHXzA0X0NIR0NWUFJNX01BU0ssIGRhdGEpOworfQorCitzdGF0aWMgaW50IG1heDc3NjkzX3NldF9taW5fc3lzdGVtX3ZvbHQoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZywKKwkJdW5zaWduZWQgaW50IHV2b2x0KQoreworCXVuc2lnbmVkIGludCBkYXRhOworCisJaWYgKHV2b2x0IDwgMzAwMDAwMCB8fCB1dm9sdCA+IDM3MDAwMDApIHsKKwkJZGV2X2VycihjaGctPmRldiwgIldyb25nIHZhbHVlIGZvciBtaW5pbXVtIHN5c3RlbSByZWd1bGF0aW9uIHZvbHRhZ2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhID0gKHV2b2x0IC0gMzAwMDAwMCkgLyAxMDAwMDA7CisKKwlkYXRhIDw8PSBDSEdfQ05GR18wNF9NSU5WU1lTX1NISUZUOworCisJZGV2X2RiZyhjaGctPmRldiwgIk1pbmltdW0gc3lzdGVtIHJlZ3VsYXRpb24gdm9sdGFnZTogJXUgKDB4JXgpXG4iLAorCQkJdXZvbHQsIGRhdGEpOworCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhjaGctPm1heDc3NjkzLT5yZWdtYXAsCisJCQlNQVg3NzY5M19DSEdfUkVHX0NIR19DTkZHXzA0LAorCQkJQ0hHX0NORkdfMDRfTUlOVlNZU19NQVNLLCBkYXRhKTsKK30KKworc3RhdGljIGludCBtYXg3NzY5M19zZXRfdGhlcm1hbF9yZWd1bGF0aW9uX3RlbXAoc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZywKKwkJdW5zaWduZWQgaW50IGNlbHMpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlzd2l0Y2ggKGNlbHMpIHsKKwljYXNlIDcwOgorCWNhc2UgODU6CisJY2FzZSAxMDA6CisJY2FzZSAxMTU6CisJCWRhdGEgPSAoY2VscyAtIDcwKSAvIDE1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNoZy0+ZGV2LCAiV3JvbmcgdmFsdWUgZm9yIHRoZXJtYWwgcmVndWxhdGlvbiBsb29wIHRlbXBlcmF0dXJlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0YSA8PD0gQ0hHX0NORkdfMDdfUkVHVEVNUF9TSElGVDsKKworCWRldl9kYmcoY2hnLT5kZXYsICJUaGVybWFsIHJlZ3VsYXRpb24gbG9vcCB0ZW1wZXJhdHVyZTogJXUgKDB4JXgpXG4iLAorCQkJY2VscywgZGF0YSk7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGNoZy0+bWF4Nzc2OTMtPnJlZ21hcCwKKwkJCU1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDcsCisJCQlDSEdfQ05GR18wN19SRUdURU1QX01BU0ssIGRhdGEpOworfQorCitzdGF0aWMgaW50IG1heDc3NjkzX3NldF9iYXR0dGVyeV9vdmVyY3VycmVudChzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnLAorCQl1bnNpZ25lZCBpbnQgdWFtcCkKK3sKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCWlmICh1YW1wICYmICh1YW1wIDwgMjAwMDAwMCB8fCB1YW1wID4gMzUwMDAwMCkpIHsKKwkJZGV2X2VycihjaGctPmRldiwgIldyb25nIHZhbHVlIGZvciBiYXR0ZXJ5IG92ZXJjdXJyZW50XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHVhbXApCisJCWRhdGEgPSAoKHVhbXAgLSAyMDAwMDAwKSAvIDI1MDAwMCkgKyAxOworCWVsc2UKKwkJZGF0YSA9IDA7IC8qIGRpc2FibGUgKi8KKworCWRhdGEgPDw9IENIR19DTkZHXzEyX0IyU09WUkNfU0hJRlQ7CisKKwlkZXZfZGJnKGNoZy0+ZGV2LCAiQmF0dGVyeSBvdmVyY3VycmVudDogJXUgKDB4JXgpXG4iLCB1YW1wLCBkYXRhKTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hnLT5tYXg3NzY5My0+cmVnbWFwLAorCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18xMiwKKwkJCUNIR19DTkZHXzEyX0IyU09WUkNfTUFTSywgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfc2V0X2NoYXJnZV9pbnB1dF90aHJlc2hvbGRfdm9sdChzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnLAorCQl1bnNpZ25lZCBpbnQgdXZvbHQpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlzd2l0Y2ggKHV2b2x0KSB7CisJY2FzZSA0MzAwMDAwOgorCQlkYXRhID0gMHgwOworCQlicmVhazsKKwljYXNlIDQ3MDAwMDA6CisJY2FzZSA0ODAwMDAwOgorCWNhc2UgNDkwMDAwMDoKKwkJZGF0YSA9ICh1dm9sdCAtIDQ3MDAwMDApIC8gMTAwMDAwOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY2hnLT5kZXYsICJXcm9uZyB2YWx1ZSBmb3IgY2hhcmdlIGlucHV0IHZvbHRhZ2UgcmVndWxhdGlvbiB0aHJlc2hvbGRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhIDw8PSBDSEdfQ05GR18xMl9WQ0hHSU5SRUdfU0hJRlQ7CisKKwlkZXZfZGJnKGNoZy0+ZGV2LCAiQ2hhcmdlIGlucHV0IHZvbHRhZ2UgcmVndWxhdGlvbiB0aHJlc2hvbGQ6ICV1ICgweCV4KVxuIiwKKwkJCXV2b2x0LCBkYXRhKTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2hnLT5tYXg3NzY5My0+cmVnbWFwLAorCQkJTUFYNzc2OTNfQ0hHX1JFR19DSEdfQ05GR18xMiwKKwkJCUNIR19DTkZHXzEyX1ZDSEdJTlJFR19NQVNLLCBkYXRhKTsKK30KKworLyoKKyAqIFNldHMgY2hhcmdlciByZWdpc3RlcnMgdG8gcHJvcGVyIGFuZCBzYWZlIGRlZmF1bHQgdmFsdWVzLgorICovCitzdGF0aWMgaW50IG1heDc3NjkzX3JlZ19pbml0KHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICpjaGcpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCS8qIFVubG9jayBjaGFyZ2VyIHJlZ2lzdGVyIHByb3RlY3Rpb24gKi8KKwlkYXRhID0gKDB4MyA8PCBDSEdfQ05GR18wNl9DSEdQUk9UX1NISUZUKTsKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoY2hnLT5tYXg3NzY5My0+cmVnbWFwLAorCQkJCU1BWDc3NjkzX0NIR19SRUdfQ0hHX0NORkdfMDYsCisJCQkJQ0hHX0NORkdfMDZfQ0hHUFJPVF9NQVNLLCBkYXRhKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY2hnLT5kZXYsICJFcnJvciB1bmxvY2tpbmcgcmVnaXN0ZXJzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBtYXg3NzY5M19zZXRfZmFzdF9jaGFyZ2VfdGltZXIoY2hnLCBERUZBVUxUX0ZBU1RfQ0hBUkdFX1RJTUVSKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbWF4Nzc2OTNfc2V0X3RvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnQoY2hnLAorCQkJREVGQVVMVF9UT1BfT0ZGX1RIUkVTSE9MRF9DVVJSRU5UKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbWF4Nzc2OTNfc2V0X3RvcF9vZmZfdGltZXIoY2hnLCBERUZBVUxUX1RPUF9PRkZfVElNRVIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtYXg3NzY5M19zZXRfY29uc3RhbnRfdm9sdChjaGcsIGNoZy0+Y29uc3RhbnRfdm9sdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG1heDc3NjkzX3NldF9taW5fc3lzdGVtX3ZvbHQoY2hnLCBjaGctPm1pbl9zeXN0ZW1fdm9sdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG1heDc3NjkzX3NldF90aGVybWFsX3JlZ3VsYXRpb25fdGVtcChjaGcsCisJCQljaGctPnRoZXJtYWxfcmVndWxhdGlvbl90ZW1wKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gbWF4Nzc2OTNfc2V0X2JhdHR0ZXJ5X292ZXJjdXJyZW50KGNoZywgY2hnLT5iYXR0dGVyeV9vdmVyY3VycmVudCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBtYXg3NzY5M19zZXRfY2hhcmdlX2lucHV0X3RocmVzaG9sZF92b2x0KGNoZywKKwkJCWNoZy0+Y2hhcmdlX2lucHV0X3RocmVzaG9sZF92b2x0KTsKK30KKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGludCBtYXg3NzY5M19kdF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZykKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCisJaWYgKCFucCkgeworCQlkZXZfZXJyKGRldiwgIm5vIGNoYXJnZXIgT0Ygbm9kZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm1heGltLGNvbnN0YW50LW1pY3Jvdm9sdCIsCisJCQkmY2hnLT5jb25zdGFudF92b2x0KSkKKwkJY2hnLT5jb25zdGFudF92b2x0ID0gREVGQVVMVF9DT05TVEFOVF9WT0xUOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAibWF4aW0sbWluLXN5c3RlbS1taWNyb3ZvbHQiLAorCQkJJmNoZy0+bWluX3N5c3RlbV92b2x0KSkKKwkJY2hnLT5taW5fc3lzdGVtX3ZvbHQgPSBERUZBVUxUX01JTl9TWVNURU1fVk9MVDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm1heGltLHRoZXJtYWwtcmVndWxhdGlvbi1jZWxzaXVzIiwKKwkJCSZjaGctPnRoZXJtYWxfcmVndWxhdGlvbl90ZW1wKSkKKwkJY2hnLT50aGVybWFsX3JlZ3VsYXRpb25fdGVtcCA9IERFRkFVTFRfVEhFUk1BTF9SRUdVTEFUSU9OX1RFTVA7CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJtYXhpbSxiYXR0ZXJ5LW92ZXJjdXJyZW50LW1pY3JvYW1wIiwKKwkJCSZjaGctPmJhdHR0ZXJ5X292ZXJjdXJyZW50KSkKKwkJY2hnLT5iYXR0dGVyeV9vdmVyY3VycmVudCA9IERFRkFVTFRfQkFUVEVSWV9PVkVSQ1VSUkVOVDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgIm1heGltLGNoYXJnZS1pbnB1dC10aHJlc2hvbGQtbWljcm92b2x0IiwKKwkJCSZjaGctPmNoYXJnZV9pbnB1dF90aHJlc2hvbGRfdm9sdCkpCisJCWNoZy0+Y2hhcmdlX2lucHV0X3RocmVzaG9sZF92b2x0ID0KKwkJCURFRkFVTFRfQ0hBUkdFUl9JTlBVVF9USFJFU0hPTERfVk9MVDsKKworCXJldHVybiAwOworfQorI2Vsc2UgLyogQ09ORklHX09GICovCitzdGF0aWMgaW50IG1heDc3NjkzX2R0X2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19PRiAqLworCitzdGF0aWMgaW50IG1heDc3NjkzX2NoYXJnZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKKwlzdHJ1Y3QgbWF4Nzc2OTNfZGV2ICptYXg3NzY5MyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlpbnQgcmV0OworCisJY2hnID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqY2hnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGcpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2hnKTsKKwljaGctPmRldiA9ICZwZGV2LT5kZXY7CisJY2hnLT5tYXg3NzY5MyA9IG1heDc3NjkzOworCisJcmV0ID0gbWF4Nzc2OTNfZHRfaW5pdCgmcGRldi0+ZGV2LCBjaGcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBtYXg3NzY5M19yZWdfaW5pdChjaGcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwc3lfY2ZnLmRydl9kYXRhID0gY2hnOworCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9mYXN0X2NoYXJnZV90aW1lcik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQ6IGNyZWF0ZSBmYXN0IGNoYXJnZSB0aW1lciBzeXNmcyBlbnRyeVxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LAorCQkJJmRldl9hdHRyX3RvcF9vZmZfdGhyZXNob2xkX2N1cnJlbnQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBjcmVhdGUgdG9wIG9mZiBjdXJyZW50IHN5c2ZzIGVudHJ5XG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl90b3Bfb2ZmX3RpbWVyKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZDogY3JlYXRlIHRvcCBvZmYgdGltZXIgc3lzZnMgZW50cnlcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwljaGctPmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJCQkJCSZtYXg3NzY5M19jaGFyZ2VyX2Rlc2MsCisJCQkJCQkmcHN5X2NmZyk7CisJaWYgKElTX0VSUihjaGctPmNoYXJnZXIpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihjaGctPmNoYXJnZXIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfdG9wX29mZl90aW1lcik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl90b3Bfb2ZmX3RocmVzaG9sZF9jdXJyZW50KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX2Zhc3RfY2hhcmdlX3RpbWVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfY2hhcmdlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnBkZXYtPmRldiwgJmRldl9hdHRyX3RvcF9vZmZfdGltZXIpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfdG9wX29mZl90aHJlc2hvbGRfY3VycmVudCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9mYXN0X2NoYXJnZV90aW1lcik7CisKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihjaGctPmNoYXJnZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG1heDc3NjkzX2NoYXJnZXJfaWRbXSA9IHsKKwl7ICJtYXg3NzY5My1jaGFyZ2VyIiwgMCwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBtYXg3NzY5M19jaGFyZ2VyX2lkKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWF4Nzc2OTNfY2hhcmdlcl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAibWF4Nzc2OTMtY2hhcmdlciIsCisJfSwKKwkucHJvYmUJCT0gbWF4Nzc2OTNfY2hhcmdlcl9wcm9iZSwKKwkucmVtb3ZlCQk9IG1heDc3NjkzX2NoYXJnZXJfcmVtb3ZlLAorCS5pZF90YWJsZQk9IG1heDc3NjkzX2NoYXJnZXJfaWQsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtYXg3NzY5M19jaGFyZ2VyX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIktyenlzenRvZiBLb3psb3dza2kgPGtyemtAa2VybmVsLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWF4aW0gNzc2OTMgY2hhcmdlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9tYXg4OTAzX2NoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9tYXg4OTAzX2NoYXJnZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4ODkwM19jaGFyZ2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4ODkyNV9wb3dlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4ODkyNV9wb3dlci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL21heDg5MjVfcG93ZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4ODkyNV9wb3dlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDg5OTdfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4ODk5N19jaGFyZ2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvbWF4ODk5N19jaGFyZ2VyLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L21heDg5OTdfY2hhcmdlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDg5OThfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvbWF4ODk5OF9jaGFyZ2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvbWF4ODk5OF9jaGFyZ2VyLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L21heDg5OThfY2hhcmdlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL29scGNfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvb2xwY19iYXR0ZXJ5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvb2xwY19iYXR0ZXJ5LmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L29scGNfYmF0dGVyeS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3BjZjUwNjMzLWNoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3BjZjUwNjMzLWNoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9wY2Y1MDYzMy1jaGFyZ2VyLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3BjZjUwNjMzLWNoYXJnZXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wZGFfcG93ZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3BkYV9wb3dlci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3BkYV9wb3dlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9wZGFfcG93ZXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zdXBwbHkvcG0yMzAxX2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3BtMjMwMV9jaGFyZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1NjFiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3BtMjMwMV9jaGFyZ2VyLmMKQEAgLTAsMCArMSwxMjU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTIgU1QgRXJpY3Nzb24uCisgKgorICogUG93ZXIgc3VwcGx5IGRyaXZlciBmb3IgU1QgRXJpY3Nzb24gcG0yeHh4X2NoYXJnZXIgY2hhcmdlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWJ4NTAwL2FiODUwMC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYng1MDAvYWI4NTAwLWJtLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2FieDUwMC91eDUwMF9jaGFyZ2FsZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BtMjMwMV9jaGFyZ2VyLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjaW5jbHVkZSAicG0yMzAxX2NoYXJnZXIuaCIKKworI2RlZmluZSB0b19wbTJ4eHhfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyh4KSBjb250YWluZXJfb2YoKHgpLCBcCisJCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciwgYWNfY2hnKQorI2RlZmluZSBTTEVFUF9NSU4JCTUwCisjZGVmaW5lIFNMRUVQX01BWAkJMTAwCisjZGVmaW5lIFBNMlhYWF9BVVRPU1VTUEVORF9ERUxBWSA1MDAKKworc3RhdGljIGludCBwbTJ4eHhfaW50ZXJydXB0X3JlZ2lzdGVyc1tdID0geworCVBNMlhYWF9SRUdfSU5UMSwKKwlQTTJYWFhfUkVHX0lOVDIsCisJUE0yWFhYX1JFR19JTlQzLAorCVBNMlhYWF9SRUdfSU5UNCwKKwlQTTJYWFhfUkVHX0lOVDUsCisJUE0yWFhYX1JFR19JTlQ2LAorfTsKKworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBtMnh4eF9jaGFyZ2VyX2FjX3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfSEVBTFRILAorCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHLAorfTsKKworc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcFtdID0geworCTM1MDAsCisJMzUyNSwKKwkzNTUwLAorCTM1NzUsCisJMzYwMCwKKwkzNjI1LAorCTM2NTAsCisJMzY3NSwKKwkzNzAwLAorCTM3MjUsCisJMzc1MCwKKwkzNzc1LAorCTM4MDAsCisJMzgyNSwKKwkzODUwLAorCTM4NzUsCisJMzkwMCwKKwkzOTI1LAorCTM5NTAsCisJMzk3NSwKKwk0MDAwLAorCTQwMjUsCisJNDA1MCwKKwk0MDc1LAorCTQxMDAsCisJNDEyNSwKKwk0MTUwLAorCTQxNzUsCisJNDIwMCwKKwk0MjI1LAorCTQyNTAsCisJNDI3NSwKKwk0MzAwLAorfTsKKworc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9jdXJyZW50X21hcFtdID0geworCTIwMCwKKwkyMDAsCisJNDAwLAorCTYwMCwKKwk4MDAsCisJMTAwMCwKKwkxMjAwLAorCTE0MDAsCisJMTYwMCwKKwkxODAwLAorCTIwMDAsCisJMjIwMCwKKwkyNDAwLAorCTI2MDAsCisJMjgwMCwKKwkzMDAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBtMnh4eF9pZGVudFtdID0geworCXsgInBtMjMwMSIsIDAgfSwKKwl7IH0KK307CisKK3N0YXRpYyB2b2lkIHNldF9scG5fcGluKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yKQoreworCWlmICghcG0yLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCAmJiBncGlvX2lzX3ZhbGlkKHBtMi0+bHBuX3BpbikpIHsKKwkJZ3Bpb19zZXRfdmFsdWUocG0yLT5scG5fcGluLCAxKTsKKwkJdXNsZWVwX3JhbmdlKFNMRUVQX01JTiwgU0xFRVBfTUFYKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2xwbl9waW4oc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCit7CisJaWYgKCFwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkICYmIGdwaW9faXNfdmFsaWQocG0yLT5scG5fcGluKSkKKwkJZ3Bpb19zZXRfdmFsdWUocG0yLT5scG5fcGluLCAwKTsKK30KKworc3RhdGljIGludCBwbTJ4eHhfcmVnX3JlYWQoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCByZWcsIHU4ICp2YWwpCit7CisJaW50IHJldDsKKworCS8qIHdha2UgdXAgdGhlIGRldmljZSAqLworCXBtX3J1bnRpbWVfZ2V0X3N5bmMocG0yLT5kZXYpOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEocG0yLT5jb25maWcucG0yeHh4X2kyYywgcmVnLAorCQkJCTEsIHZhbCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIocG0yLT5kZXYsICJFcnJvciByZWFkaW5nIHJlZ2lzdGVyIGF0IDB4JXhcbiIsIHJlZyk7CisJZWxzZQorCQlyZXQgPSAwOworCisJcG1fcnVudGltZV9wdXRfc3luYyhwbTItPmRldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtMnh4eF9yZWdfd3JpdGUoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIsIGludCByZWcsIHU4IHZhbCkKK3sKKwlpbnQgcmV0OworCisJLyogd2FrZSB1cCB0aGUgZGV2aWNlICovCisJcG1fcnVudGltZV9nZXRfc3luYyhwbTItPmRldik7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEocG0yLT5jb25maWcucG0yeHh4X2kyYywgcmVnLAorCQkJCTEsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKHBtMi0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdpc3RlciBhdCAweCV4XG4iLCByZWcpOworCWVsc2UKKwkJcmV0ID0gMDsKKworCXBtX3J1bnRpbWVfcHV0X3N5bmMocG0yLT5kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbTJ4eHhfY2hhcmdpbmdfZW5hYmxlX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCit7CisJaW50IHJldDsKKworCS8qIEVuYWJsZSBjaGFyZ2luZyAqLworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzIsCisJCQkoUE0yWFhYX0NIX0FVVE9fUkVTVU1FX0VOIHwgUE0yWFhYX0NIQVJHRVJfRU5BKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2luZ19kaXNhYmxlX21uZ3Qoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIpCit7CisJaW50IHJldDsKKworCS8qIERpc2FibGUgU1cgRU9DIGN0cmwgKi8KKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX1NXX0NUUkxfUkVHLCBQTTJYWFhfU1dDVFJMX0hXKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIERpc2FibGUgY2hhcmdpbmcgKi8KKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUcyLAorCQkJKFBNMlhYWF9DSF9BVVRPX1JFU1VNRV9ESVMgfCBQTTJYWFhfQ0hBUkdFUl9ESVMpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2JhdHRfdGhlcm1fbW5ndChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiwgaW50IHZhbCkKK3sKKwlxdWV1ZV93b3JrKHBtMi0+Y2hhcmdlcl93cSwgJnBtMi0+Y2hlY2tfbWFpbl90aGVybWFsX3Byb3Rfd29yayk7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2RpZV90aGVybV9tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQoreworCXF1ZXVlX3dvcmsocG0yLT5jaGFyZ2VyX3dxLCAmcG0yLT5jaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX292dl9tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQoreworCWRldl9lcnIocG0yLT5kZXYsICJPdmVydm9sdGFnZSBkZXRlY3RlZFxuIik7CisJcG0yLT5mbGFncy5vdnYgPSB0cnVlOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBtMi0+YWNfY2hnLnBzeSk7CisKKwkvKiBTY2hlZHVsZSBhIG5ldyBIVyBmYWlsdXJlIGNoZWNrICovCisJcXVldWVfZGVsYXllZF93b3JrKHBtMi0+Y2hhcmdlcl93cSwgJnBtMi0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX3dkX2V4cF9tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQoreworCWRldl9kYmcocG0yLT5kZXYgLCAiMjAgbWludXRlcyB3YXRjaGRvZyBleHBpcmVkXG4iKTsKKworCXBtMi0+YWMud2RfZXhwaXJlZCA9IHRydWU7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX3ZiYXRfbHNpZ19tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgUE0yWFhYX0lOVDFfSVRWQkFUTE9XUjoKKwkJZGV2X2RiZyhwbTItPmRldiwgIlZCQVQgZ3Jvd3MgYWJvdmUgVkJBVF9MT1cgbGV2ZWxcbiIpOworCQkvKiBFbmFibGUgU1cgRU9DIGN0cmwgKi8KKwkJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9TV19DVFJMX1JFRywKKwkJCQkJCQlQTTJYWFhfU1dDVFJMX1NXKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWJyZWFrOworCisJY2FzZSBQTTJYWFhfSU5UMV9JVFZCQVRMT1dGOgorCQlkZXZfZGJnKHBtMi0+ZGV2LCAiVkJBVCBkcm9wcyBiZWxvdyBWQkFUX0xPVyBsZXZlbFxuIik7CisJCS8qIERpc2FibGUgU1cgRU9DIGN0cmwgKi8KKwkJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9TV19DVFJMX1JFRywKKwkJCQkJCQlQTTJYWFhfU1dDVFJMX0hXKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihwbTItPmRldiwgIlVua25vd24gVkJBVCBsZXZlbFxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfYmF0X2Rpc2NfbW5ndChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiwgaW50IHZhbCkKK3sKKwlkZXZfZGJnKHBtMi0+ZGV2LCAiYmF0dGVyeSBkaXNjb25uZWN0ZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfZGV0ZWN0aW9uKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCB1OCAqdmFsKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwbTJ4eHhfcmVnX3JlYWQocG0yLCBQTTJYWFhfU1JDRV9SRUdfSU5UMiwgdmFsKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocG0yLT5kZXYsICJDaGFyZ2VyIGRldGVjdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkqdmFsICY9IChQTTJYWFhfSU5UMl9TX0lUVlBXUjFQTFVHIHwgUE0yWFhYX0lOVDJfU19JVFZQV1IyUExVRyk7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2l0dl9wd3JfcGx1Z19tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLCBpbnQgdmFsKQoreworCisJaW50IHJldDsKKwl1OCByZWFkX3ZhbDsKKworCS8qCisJICogU2luY2Ugd2UgY2FuJ3QgYmUgc3VyZSB0aGF0IHRoZSBldmVudHMgYXJlIHJlY2VpdmVkCisJICogc3luY2hyb25vdXNseSwgd2UgaGF2ZSB0aGUgY2hlY2sgaWYgdGhlIG1haW4gY2hhcmdlciBpcworCSAqIGNvbm5lY3RlZCBieSByZWFkaW5nIHRoZSBpbnRlcnJ1cHQgc291cmNlIHJlZ2lzdGVyLgorCSAqLworCXJldCA9IHBtMnh4eF9jaGFyZ2VyX2RldGVjdGlvbihwbTIsICZyZWFkX3ZhbCk7CisKKwlpZiAoKHJldCA9PSAwKSAmJiByZWFkX3ZhbCkgeworCQlwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkID0gMTsKKwkJcG0yLT5hY19jb25uID0gdHJ1ZTsKKwkJcXVldWVfd29yayhwbTItPmNoYXJnZXJfd3EsICZwbTItPmFjX3dvcmspOworCX0KKworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl9pdHZfcHdyX3VucGx1Z19tbmd0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yLAorCQkJCQkJCQlpbnQgdmFsKQoreworCXBtMi0+YWMuY2hhcmdlcl9jb25uZWN0ZWQgPSAwOworCXF1ZXVlX3dvcmsocG0yLT5jaGFyZ2VyX3dxLCAmcG0yLT5hY193b3JrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtMl9pbnRfcmVnMCh2b2lkICpwbTJfZGF0YSwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IHBtMl9kYXRhOworCWludCByZXQgPSAwOworCisJaWYgKHZhbCAmIFBNMlhYWF9JTlQxX0lUVkJBVExPV1IpIHsKKwkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfdmJhdF9sc2lnX21uZ3QocG0yLAorCQkJCQkJUE0yWFhYX0lOVDFfSVRWQkFUTE9XUik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKHZhbCAmIFBNMlhYWF9JTlQxX0lUVkJBVExPV0YpIHsKKwkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfdmJhdF9sc2lnX21uZ3QocG0yLAorCQkJCQkJUE0yWFhYX0lOVDFfSVRWQkFUTE9XRik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJaWYgKHZhbCAmIFBNMlhYWF9JTlQxX0lUVkJBVERJU0NPTk5FQ1QpIHsKKwkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfYmF0X2Rpc2NfbW5ndChwbTIsCisJCQkJUE0yWFhYX0lOVDFfSVRWQkFURElTQ09OTkVDVCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG0yX2ludF9yZWcxKHZvaWQgKnBtMl9kYXRhLCBpbnQgdmFsKQoreworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gcG0yX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlpZiAodmFsICYgKFBNMlhYWF9JTlQyX0lUVlBXUjFQTFVHIHwgUE0yWFhYX0lOVDJfSVRWUFdSMlBMVUcpKSB7CisJCWRldl9kYmcocG0yLT5kZXYgLCAiTWFpbiBjaGFyZ2VyIHBsdWdnZWRcbiIpOworCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9pdHZfcHdyX3BsdWdfbW5ndChwbTIsIHZhbCAmCisJCQkoUE0yWFhYX0lOVDJfSVRWUFdSMVBMVUcgfCBQTTJYWFhfSU5UMl9JVFZQV1IyUExVRykpOworCX0KKworCWlmICh2YWwgJgorCQkoUE0yWFhYX0lOVDJfSVRWUFdSMVVOUExVRyB8IFBNMlhYWF9JTlQyX0lUVlBXUjJVTlBMVUcpKSB7CisJCWRldl9kYmcocG0yLT5kZXYgLCAiTWFpbiBjaGFyZ2VyIHVucGx1Z2dlZFxuIik7CisJCXJldCA9IHBtMnh4eF9jaGFyZ2VyX2l0dl9wd3JfdW5wbHVnX21uZ3QocG0yLCB2YWwgJgorCQkJCQkJKFBNMlhYWF9JTlQyX0lUVlBXUjFVTlBMVUcgfAorCQkJCQkJUE0yWFhYX0lOVDJfSVRWUFdSMlVOUExVRykpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG0yX2ludF9yZWcyKHZvaWQgKnBtMl9kYXRhLCBpbnQgdmFsKQoreworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gcG0yX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlpZiAodmFsICYgUE0yWFhYX0lOVDNfSVRBVVRPVElNRU9VVFdEKQorCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl93ZF9leHBfbW5ndChwbTIsIHZhbCk7CisKKwlpZiAodmFsICYgKFBNMlhYWF9JTlQzX0lUQ0hQUkVDSEFSR0VXRCB8CisJCQkJUE0yWFhYX0lOVDNfSVRDSENDV0QgfCBQTTJYWFhfSU5UM19JVENIQ1ZXRCkpIHsKKwkJZGV2X2RiZyhwbTItPmRldiwKKwkJCSJXYXRjaGRvZyBvY2N1cnJlZCBmb3IgcHJlY2hhcmdlLCBDQyBhbmQgQ1YgY2hhcmdlXG4iKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtMl9pbnRfcmVnMyh2b2lkICpwbTJfZGF0YSwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMiA9IHBtMl9kYXRhOworCWludCByZXQgPSAwOworCisJaWYgKHZhbCAmIChQTTJYWFhfSU5UNF9JVENIQVJHSU5HT04pKSB7CisJCWRldl9kYmcocG0yLT5kZXYgLAorCQkJImNoYXJnaW5kIG9wZXJhdGlvbiBoYXMgc3RhcnRlZFxuIik7CisJfQorCisJaWYgKHZhbCAmIChQTTJYWFhfSU5UNF9JVFZSRVNVTUUpKSB7CisJCWRldl9kYmcocG0yLT5kZXYsCisJCQkiYmF0dGVyeSBkaXNjaGFyZ2VkIGRvd24gdG8gVlJlc3VtZSB0aHJlc2hvbGRcbiIpOworCX0KKworCWlmICh2YWwgJiAoUE0yWFhYX0lOVDRfSVRCQVRURlVMTCkpIHsKKwkJZGV2X2RiZyhwbTItPmRldiAsICJiYXR0ZXJ5IGZ1bGx5IGRldGVjdGVkXG4iKTsKKwl9CisKKwlpZiAodmFsICYgKFBNMlhYWF9JTlQ0X0lUQ1ZQSEFTRSkpIHsKKwkJZGV2X2RiZyhwbTItPmRldiwgIkNWIHBoYXNlIGVudGVyIHdpdGggMC41QyBjaGFyZ2luZ1xuIik7CisJfQorCisJaWYgKHZhbCAmIChQTTJYWFhfSU5UNF9JVFZQV1IyT1ZWIHwgUE0yWFhYX0lOVDRfSVRWUFdSMU9WVikpIHsKKwkJcG0yLT5mYWlsdXJlX2Nhc2UgPSBWUFdSX09WVjsKKwkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfb3Z2X21uZ3QocG0yLCB2YWwgJgorCQkJKFBNMlhYWF9JTlQ0X0lUVlBXUjJPVlYgfCBQTTJYWFhfSU5UNF9JVFZQV1IxT1ZWKSk7CisJCWRldl9kYmcocG0yLT5kZXYsICJWUFdSL1ZTWVNURU0gb3ZlcnZvbHRhZ2UgZGV0ZWN0ZWRcbiIpOworCX0KKworCWlmICh2YWwgJiAoUE0yWFhYX0lOVDRfU19JVEJBVFRFTVBDT0xEIHwKKwkJCQlQTTJYWFhfSU5UNF9TX0lUQkFUVEVNUEhPVCkpIHsKKwkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfYmF0dF90aGVybV9tbmd0KHBtMiwgdmFsICYKKwkJCShQTTJYWFhfSU5UNF9TX0lUQkFUVEVNUENPTEQgfAorCQkJUE0yWFhYX0lOVDRfU19JVEJBVFRFTVBIT1QpKTsKKwkJZGV2X2RiZyhwbTItPmRldiwgIkJURU1QIGlzIHRvbyBMb3cvSGlnaFxuIik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbTJfaW50X3JlZzQodm9pZCAqcG0yX2RhdGEsIGludCB2YWwpCit7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBwbTJfZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICh2YWwgJiBQTTJYWFhfSU5UNV9JVFZTWVNURU1PVlYpIHsKKwkJcG0yLT5mYWlsdXJlX2Nhc2UgPSBWU1lTVEVNX09WVjsKKwkJcmV0ID0gcG0yeHh4X2NoYXJnZXJfb3Z2X21uZ3QocG0yLCB2YWwgJgorCQkJCQkJUE0yWFhYX0lOVDVfSVRWU1lTVEVNT1ZWKTsKKwkJZGV2X2RiZyhwbTItPmRldiwgIlZTWVNURU0gb3ZlcnZvbHRhZ2UgZGV0ZWN0ZWRcbiIpOworCX0KKworCWlmICh2YWwgJiAoUE0yWFhYX0lOVDVfSVRUSEVSTUFMV0FSTklOR0ZBTEwgfAorCQkJCVBNMlhYWF9JTlQ1X0lUVEhFUk1BTFdBUk5JTkdSSVNFIHwKKwkJCQlQTTJYWFhfSU5UNV9JVFRIRVJNQUxTSFVURE9XTkZBTEwgfAorCQkJCVBNMlhYWF9JTlQ1X0lUVEhFUk1BTFNIVVRET1dOUklTRSkpIHsKKwkJZGV2X2RiZyhwbTItPmRldiwgIkJURU1QIGRpZSB0ZW1wZXJhdHVyZSBpcyB0b28gTG93L0hpZ2hcbiIpOworCQlyZXQgPSBwbTJ4eHhfY2hhcmdlcl9kaWVfdGhlcm1fbW5ndChwbTIsIHZhbCAmCisJCQkoUE0yWFhYX0lOVDVfSVRUSEVSTUFMV0FSTklOR0ZBTEwgfAorCQkJUE0yWFhYX0lOVDVfSVRUSEVSTUFMV0FSTklOR1JJU0UgfAorCQkJUE0yWFhYX0lOVDVfSVRUSEVSTUFMU0hVVERPV05GQUxMIHwKKwkJCVBNMlhYWF9JTlQ1X0lUVEhFUk1BTFNIVVRET1dOUklTRSkpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG0yX2ludF9yZWc1KHZvaWQgKnBtMl9kYXRhLCBpbnQgdmFsKQoreworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gcG0yX2RhdGE7CisJaW50IHJldCA9IDA7CisKKwlpZiAodmFsICYgKFBNMlhYWF9JTlQ2X0lUVlBXUjJEUk9QIHwgUE0yWFhYX0lOVDZfSVRWUFdSMURST1ApKSB7CisJCWRldl9kYmcocG0yLT5kZXYsICJWTVBXUiBkcm9wIHRvIFZCQVQgbGV2ZWxcbiIpOworCX0KKworCWlmICh2YWwgJiAoUE0yWFhYX0lOVDZfSVRWUFdSMlZBTElEUklTRSB8CisJCQlQTTJYWFhfSU5UNl9JVFZQV1IxVkFMSURSSVNFIHwKKwkJCVBNMlhYWF9JTlQ2X0lUVlBXUjJWQUxJREZBTEwgfAorCQkJUE0yWFhYX0lOVDZfSVRWUFdSMVZBTElERkFMTCkpIHsKKwkJZGV2X2RiZyhwbTItPmRldiwgIkZhbGxpbmcvUmlzaW5nIGVkZ2Ugb24gV1BXUjEvMlxuIik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90ICBwbTJ4eHhfaXJxX2ludChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gZGF0YTsKKwlzdHJ1Y3QgcG0yeHh4X2ludGVycnVwdHMgKmludGVycnVwdCA9IHBtMi0+cG0yX2ludDsKKwlpbnQgaTsKKworCS8qIHdha2UgdXAgdGhlIGRldmljZSAqLworCXBtX3J1bnRpbWVfZ2V0X3N5bmMocG0yLT5kZXYpOworCisJZG8geworCQlmb3IgKGkgPSAwOyBpIDwgUE0yWFhYX05VTV9JTlRfUkVHOyBpKyspIHsKKwkJCXBtMnh4eF9yZWdfcmVhZChwbTIsCisJCQkJcG0yeHh4X2ludGVycnVwdF9yZWdpc3RlcnNbaV0sCisJCQkJJihpbnRlcnJ1cHQtPnJlZ1tpXSkpOworCisJCQlpZiAoaW50ZXJydXB0LT5yZWdbaV0gPiAwKQorCQkJCWludGVycnVwdC0+aGFuZGxlcltpXShwbTIsIGludGVycnVwdC0+cmVnW2ldKTsKKwkJfQorCX0gd2hpbGUgKGdwaW9fZ2V0X3ZhbHVlKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlcikgPT0gMCk7CisKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBtMi0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwbTItPmRldik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfZ2V0X2FjX2N2KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yKQoreworCWludCByZXQgPSAwOworCXU4IHZhbDsKKworCWlmIChwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkICYmIHBtMi0+YWMuY2hhcmdlcl9vbmxpbmUpIHsKKworCQlyZXQgPSBwbTJ4eHhfcmVnX3JlYWQocG0yLCBQTTJYWFhfU1JDRV9SRUdfSU5UNCwgJnZhbCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICh2YWwgJiBQTTJYWFhfSU5UNF9TX0lUQ1ZQSEFTRSkKKwkJCXJldCA9IFBNMlhYWF9DT05TVF9WT0xUOworCQllbHNlCisJCQlyZXQgPSBQTTJYWFhfQ09OU1RfQ1VSUjsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbTJ4eHhfY3VycmVudF90b19yZWd2YWwoaW50IGN1cnIpCit7CisJaW50IGk7CisKKwlpZiAoY3VyciA8IHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwWzBdKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwKTsgaSsrKSB7CisJCWlmIChjdXJyIDwgcG0yeHh4X2NoYXJnZXJfY3VycmVudF9tYXBbaV0pCisJCQlyZXR1cm4gKGkgLSAxKTsKKwl9CisKKwlpID0gQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl9jdXJyZW50X21hcCkgLSAxOworCWlmIChjdXJyID09IHBtMnh4eF9jaGFyZ2VyX2N1cnJlbnRfbWFwW2ldKQorCQlyZXR1cm4gaTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHBtMnh4eF92b2x0YWdlX3RvX3JlZ3ZhbChpbnQgY3VycikKK3sKKwlpbnQgaTsKKworCWlmIChjdXJyIDwgcG0yeHh4X2NoYXJnZXJfdm9sdGFnZV9tYXBbMF0pCisJCXJldHVybiAwOworCisJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUocG0yeHh4X2NoYXJnZXJfdm9sdGFnZV9tYXApOyBpKyspIHsKKwkJaWYgKGN1cnIgPCBwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcFtpXSkKKwkJCXJldHVybiBpIC0gMTsKKwl9CisKKwlpID0gQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcCkgLSAxOworCWlmIChjdXJyID09IHBtMnh4eF9jaGFyZ2VyX3ZvbHRhZ2VfbWFwW2ldKQorCQlyZXR1cm4gaTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX3VwZGF0ZV9jaGFyZ2VyX2N1cnJlbnQoc3RydWN0IHV4NTAwX2NoYXJnZXIgKmNoYXJnZXIsCisJCWludCBpY2hfb3V0KQoreworCWludCByZXQ7CisJaW50IGN1cnJfaW5kZXg7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7CisJdTggdmFsOworCisJaWYgKGNoYXJnZXItPnBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUykKKwkJcG0yID0gdG9fcG0yeHh4X2NoYXJnZXJfYWNfZGV2aWNlX2luZm8oY2hhcmdlcik7CisJZWxzZQorCQlyZXR1cm4gLUVOWElPOworCisJY3Vycl9pbmRleCA9IHBtMnh4eF9jdXJyZW50X3RvX3JlZ3ZhbChpY2hfb3V0KTsKKwlpZiAoY3Vycl9pbmRleCA8IDApIHsKKwkJZGV2X2VycihwbTItPmRldiwKKwkJCSJDaGFyZ2VyIGN1cnJlbnQgdG9vIGhpZ2gsIGNoYXJnaW5nIG5vdCBzdGFydGVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXQgPSBwbTJ4eHhfcmVnX3JlYWQocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzYsICZ2YWwpOworCWlmIChyZXQgPj0gMCkgeworCQl2YWwgJj0gflBNMlhYWF9ESVJfQ0hfQ0NfQ1VSUkVOVF9NQVNLOworCQl2YWwgfD0gY3Vycl9pbmRleDsKKwkJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHNiwgdmFsKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocG0yLT5kZXYsCisJCQkJIiVzIHdyaXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQl9CisJfQorCWVsc2UKKwkJZGV2X2VycihwbTItPmRldiwgIiVzIHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2VyX2FjX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7CisKKwlwbTIgPSB0b19wbTJ4eHhfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhwc3lfdG9fdXg1MDBfY2hhcmdlcihwc3kpKTsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6CisJCWlmIChwbTItPmZsYWdzLm1haW5leHRjaG5vdG9rKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOworCQllbHNlIGlmIChwbTItPmFjLndkX2V4cGlyZWQpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRDsKKwkJZWxzZSBpZiAocG0yLT5mbGFncy5tYWluX3RoZXJtYWxfcHJvdCkKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKKwkJZWxzZSBpZiAocG0yLT5mbGFncy5vdnYpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJdmFsLT5pbnR2YWwgPSBwbTItPmFjLmNoYXJnZXJfb25saW5lOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXZhbC0+aW50dmFsID0gcG0yLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX0FWRzoKKwkJcG0yLT5hYy5jdl9hY3RpdmUgPSBwbTJ4eHhfY2hhcmdlcl9nZXRfYWNfY3YocG0yKTsKKwkJdmFsLT5pbnR2YWwgPSBwbTItPmFjLmN2X2FjdGl2ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBtMnh4eF9jaGFyZ2luZ19pbml0KHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yKQoreworCWludCByZXQgPSAwOworCisJLyogZW5hYmxlIENDIGFuZCBDViB3YXRjaGRvZyAqLworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzMsCisJCShQTTJYWFhfQ0hfV0RfQ1ZfUEhBU0VfNjBNSU4gfCBQTTJYWFhfQ0hfV0RfQ0NfUEhBU0VfNjBNSU4pKTsKKwlpZiggcmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGVuYWJsZSBwcmVjaGFyZ2Ugd2F0Y2hkb2cgKi8KKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc0LAorCQkJCQlQTTJYWFhfQ0hfV0RfUFJFQ0hfUEhBU0VfNjBNSU4pOworCisJLyogRGlzYWJsZSBhdXRvIHRpbWVvdXQgKi8KKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc1LAorCQkJCQlQTTJYWFhfQ0hfV0RfQVVUT19USU1FT1VUXzIwTUlOKTsKKworCS8qCisgICAgICogRU9DIGN1cnJlbnQgbGV2ZWwgPSAxMDBtQQorCSAqIFByZWNoYXJnZSBjdXJyZW50IGxldmVsID0gMTAwbUEKKwkgKiBDQyBjdXJyZW50IGxldmVsID0gMTAwMG1BCisJICovCisJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHNiwKKwkJKFBNMlhYWF9ESVJfQ0hfQ0NfQ1VSUkVOVF8xMDAwTUEgfAorCQlQTTJYWFhfQ0hfUFJFQ0hfQ1VSUkVOVF8xMDBNQSB8CisJCVBNMlhYWF9DSF9FT0NfQ1VSUkVOVF8xMDBNQSkpOworCisJLyoKKyAgICAgKiByZWNoYXJnZSB0aHJlc2hvbGQgPSAzLjhWCisJICogUHJlY2hhcmdlIHRvIENDIHRocmVzaG9sZCA9IDIuOVYKKwkgKi8KKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc3LAorCQkoUE0yWFhYX0NIX1BSRUNIX1ZPTF8yXzkgfCBQTTJYWFhfQ0hfVlJFU1VNRV9WT0xfM184KSk7CisKKwkvKiBmbG9hdCB2b2x0YWdlIGNoYXJnZXIgbGV2ZWwgPSA0LjJWICovCisJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHOCwKKwkJUE0yWFhYX0NIX1ZPTFRfNF8yKTsKKworCS8qIFZvbHRhZ2UgZHJvcCBiZXR3ZWVuIFZCQVQgYW5kIFZTWVMgaW4gSFcgY2hhcmdpbmcgPSAzMDBtViAqLworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzksCisJCShQTTJYWFhfQ0hfMTUwTVZfRFJPUF8zMDBNViB8IFBNMlhYWF9DSEFSQ0hJTkdfSU5GT19ESVMgfAorCQlQTTJYWFhfQ0hfQ0NfUkVEVUNFRF9DVVJSRU5UX0lERU5UIHwKKwkJUE0yWFhYX0NIX0NDX01PREVEUk9QX0RJUykpOworCisJLyogSW5wdXQgY2hhcmdlciBsZXZlbCBvZiBvdmVyIHZvbHRhZ2UgPSAxMFYgKi8KKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0lOUF9WT0xUX1ZQV1IyLAorCQkJCQlQTTJYWFhfVlBXUjJfT1ZWXzEwKTsKKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0lOUF9WT0xUX1ZQV1IxLAorCQkJCQlQTTJYWFhfVlBXUjFfT1ZWXzEwKTsKKworCS8qIElucHV0IGNoYXJnZXIgZHJvcCAqLworCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfSU5QX0RST1BfVlBXUjIsCisJCShQTTJYWFhfVlBXUjJfSFdfT1BUX0RJUyB8IFBNMlhYWF9WUFdSMl9WQUxJRF9ESVMgfAorCQlQTTJYWFhfVlBXUjJfRFJPUF9ESVMpKTsKKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0lOUF9EUk9QX1ZQV1IxLAorCQkoUE0yWFhYX1ZQV1IxX0hXX09QVF9ESVMgfCBQTTJYWFhfVlBXUjFfVkFMSURfRElTIHwKKwkJUE0yWFhYX1ZQV1IxX0RST1BfRElTKSk7CisKKwkvKiBEaXNhYmxlIGJhdHRlcnkgbG93IG1vbml0b3JpbmcgKi8KKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfTE9XX0xFVl9DT01QX1JFRywKKwkJUE0yWFhYX1ZCQVRfTE9XX01PTklUT1JJTkdfRU5BKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcG0yeHh4X2NoYXJnZXJfYWNfZW4oc3RydWN0IHV4NTAwX2NoYXJnZXIgKmNoYXJnZXIsCisJaW50IGVuYWJsZSwgaW50IHZzZXQsIGludCBpc2V0KQoreworCWludCByZXQ7CisJaW50IHZvbHRfaW5kZXg7CisJaW50IGN1cnJfaW5kZXg7CisJdTggdmFsOworCisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSB0b19wbTJ4eHhfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKKworCWlmIChlbmFibGUpIHsKKwkJaWYgKCFwbTItPmFjLmNoYXJnZXJfY29ubmVjdGVkKSB7CisJCQlkZXZfZGJnKHBtMi0+ZGV2LCAiQUMgY2hhcmdlciBub3QgY29ubmVjdGVkXG4iKTsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKworCQlkZXZfZGJnKHBtMi0+ZGV2LCAiRW5hYmxlIEFDOiAlZG1WICVkbUFcbiIsIHZzZXQsIGlzZXQpOworCQlpZiAoIXBtMi0+dmRkYWRjX2VuX2FjKSB7CisJCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHBtMi0+cmVndSk7CisJCQlpZiAocmV0KQorCQkJCWRldl93YXJuKHBtMi0+ZGV2LAorCQkJCQkiRmFpbGVkIHRvIGVuYWJsZSB2ZGRhZGMgcmVndWxhdG9yXG4iKTsKKwkJCWVsc2UKKwkJCQlwbTItPnZkZGFkY19lbl9hYyA9IHRydWU7CisJCX0KKworCQlyZXQgPSBwbTJ4eHhfY2hhcmdpbmdfaW5pdChwbTIpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwgIiVzIGNoYXJnaW5nIGluaXQgZmFpbGVkXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGVycm9yX29jY3VyZWQ7CisJCX0KKworCQl2b2x0X2luZGV4ID0gcG0yeHh4X3ZvbHRhZ2VfdG9fcmVndmFsKHZzZXQpOworCQljdXJyX2luZGV4ID0gcG0yeHh4X2N1cnJlbnRfdG9fcmVndmFsKGlzZXQpOworCisJCWlmICh2b2x0X2luZGV4IDwgMCB8fCBjdXJyX2luZGV4IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwKKwkJCQkiQ2hhcmdlciB2b2x0YWdlIG9yIGN1cnJlbnQgdG9vIGhpZ2gsICIKKwkJCQkiY2hhcmdpbmcgbm90IHN0YXJ0ZWRcbiIpOworCQkJcmV0dXJuIC1FTlhJTzsKKwkJfQorCisJCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHOCwgJnZhbCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHJlYWQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGVycm9yX29jY3VyZWQ7CisJCX0KKwkJdmFsICY9IH5QTTJYWFhfQ0hfVk9MVF9NQVNLOworCQl2YWwgfD0gdm9sdF9pbmRleDsKKwkJcmV0ID0gcG0yeHh4X3JlZ193cml0ZShwbTIsIFBNMlhYWF9CQVRUX0NUUkxfUkVHOCwgdmFsKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggd3JpdGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGVycm9yX29jY3VyZWQ7CisJCX0KKworCQlyZXQgPSBwbTJ4eHhfcmVnX3JlYWQocG0yLCBQTTJYWFhfQkFUVF9DVFJMX1JFRzYsICZ2YWwpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCByZWFkIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJZ290byBlcnJvcl9vY2N1cmVkOworCQl9CisJCXZhbCAmPSB+UE0yWFhYX0RJUl9DSF9DQ19DVVJSRU5UX01BU0s7CisJCXZhbCB8PSBjdXJyX2luZGV4OworCQlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfQ1RSTF9SRUc2LCB2YWwpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwgIiVzIHBtMnh4eCB3cml0ZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKKwkJfQorCisJCWlmICghcG0yLT5iYXQtPmVuYWJsZV9vdmVyc2hvb3QpIHsKKwkJCXJldCA9IHBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9MRURfQ1RSTF9SRUcsICZ2YWwpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHJlYWQgZmFpbGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJCQkJZ290byBlcnJvcl9vY2N1cmVkOworCQkJfQorCQkJdmFsIHw9IFBNMlhYWF9BTlRJX09WRVJTSE9PVF9FTjsKKwkJCXJldCA9IHBtMnh4eF9yZWdfd3JpdGUocG0yLCBQTTJYWFhfTEVEX0NUUkxfUkVHLCB2YWwpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKHBtMi0+ZGV2LCAiJXMgcG0yeHh4IHdyaXRlIGZhaWxlZFxuIiwKKwkJCQkJCQkJX19mdW5jX18pOworCQkJCWdvdG8gZXJyb3Jfb2NjdXJlZDsKKwkJCX0KKwkJfQorCisJCXJldCA9IHBtMnh4eF9jaGFyZ2luZ19lbmFibGVfbW5ndChwbTIpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbTItPmRldiwgIkZhaWxlZCB0byBlbmFibGUiCisJCQkJCQkicG0yeHh4IGFjIGNoYXJnZXJcbiIpOworCQkJZ290byBlcnJvcl9vY2N1cmVkOworCQl9CisKKwkJcG0yLT5hYy5jaGFyZ2VyX29ubGluZSA9IDE7CisJfSBlbHNlIHsKKwkJcG0yLT5hYy5jaGFyZ2VyX29ubGluZSA9IDA7CisJCXBtMi0+YWMud2RfZXhwaXJlZCA9IGZhbHNlOworCisJCS8qIERpc2FibGUgcmVndWxhdG9yIGlmIGVuYWJsZWQgKi8KKwkJaWYgKHBtMi0+dmRkYWRjX2VuX2FjKSB7CisJCQlyZWd1bGF0b3JfZGlzYWJsZShwbTItPnJlZ3UpOworCQkJcG0yLT52ZGRhZGNfZW5fYWMgPSBmYWxzZTsKKwkJfQorCisJCXJldCA9IHBtMnh4eF9jaGFyZ2luZ19kaXNhYmxlX21uZ3QocG0yKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocG0yLT5kZXYsICJmYWlsZWQgdG8gZGlzYWJsZSIKKwkJCQkJCSJwbTJ4eHggYWMgY2hhcmdlclxuIik7CisJCQlnb3RvIGVycm9yX29jY3VyZWQ7CisJCX0KKworCQlkZXZfZGJnKHBtMi0+ZGV2LCAiUE0yMzAxOiAiICJEaXNhYmxlZCBBQyBjaGFyZ2luZ1xuIik7CisJfQorCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBtMi0+YWNfY2hnLnBzeSk7CisKK2Vycm9yX29jY3VyZWQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbTJ4eHhfY2hhcmdlcl93YXRjaGRvZ19raWNrKHN0cnVjdCB1eDUwMF9jaGFyZ2VyICpjaGFyZ2VyKQoreworCWludCByZXQ7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7CisKKwlpZiAoY2hhcmdlci0+cHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TKQorCQlwbTIgPSB0b19wbTJ4eHhfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKKwllbHNlCisJCXJldHVybiAtRU5YSU87CisKKwlyZXQgPSBwbTJ4eHhfcmVnX3dyaXRlKHBtMiwgUE0yWFhYX0JBVFRfV0RfS0lDSywgV0RfVElNRVIpOworCWlmIChyZXQpCisJCWRldl9lcnIocG0yLT5kZXYsICJGYWlsZWQgdG8ga2ljayBXRCFcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcG0yeHh4X2NoYXJnZXJfYWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IHBtMnh4eF9jaGFyZ2VyLCBhY193b3JrKTsKKworCisJcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKKwlzeXNmc19ub3RpZnkoJnBtMi0+YWNfY2hnLnBzeS0+ZGV2LmtvYmosIE5VTEwsICJwcmVzZW50Iik7Cit9OworCitzdGF0aWMgdm9pZCBwbTJ4eHhfY2hhcmdlcl9jaGVja19od19mYWlsdXJlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXU4IHJlZ192YWx1ZTsKKworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gY29udGFpbmVyX29mKHdvcmssCisJCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciwgY2hlY2tfaHdfZmFpbHVyZV93b3JrLndvcmspOworCisJaWYgKHBtMi0+ZmxhZ3Mub3Z2KSB7CisJCXBtMnh4eF9yZWdfcmVhZChwbTIsIFBNMlhYWF9TUkNFX1JFR19JTlQ0LCAmcmVnX3ZhbHVlKTsKKworCQlpZiAoIShyZWdfdmFsdWUgJiAoUE0yWFhYX0lOVDRfU19JVFZQV1IxT1ZWIHwKKwkJCQkJUE0yWFhYX0lOVDRfU19JVFZQV1IyT1ZWKSkpIHsKKwkJCXBtMi0+ZmxhZ3Mub3Z2ID0gZmFsc2U7CisJCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOworCQl9CisJfQorCisJLyogSWYgd2Ugc3RpbGwgaGF2ZSBhIGZhaWx1cmUsIHNjaGVkdWxlIGEgbmV3IGNoZWNrICovCisJaWYgKHBtMi0+ZmxhZ3Mub3Z2KSB7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhwbTItPmNoYXJnZXJfd3EsCisJCQkmcG0yLT5jaGVja19od19mYWlsdXJlX3dvcmssIHJvdW5kX2ppZmZpZXMoSFopKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBtMnh4eF9jaGFyZ2VyX2NoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmsoCisJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWludCByZXQ7CisJdTggdmFsOworCisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBtMnh4eF9jaGFyZ2VyLAorCQkJCQljaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrKTsKKworCS8qIENoZWNrIGlmIGRpZSB0ZW1wIHdhcm5pbmcgaXMgc3RpbGwgYWN0aXZlICovCisJcmV0ID0gcG0yeHh4X3JlZ19yZWFkKHBtMiwgUE0yWFhYX1NSQ0VfUkVHX0lOVDUsICZ2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocG0yLT5kZXYsICIlcyBwbTJ4eHggcmVhZCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodmFsICYgKFBNMlhYWF9JTlQ1X1NfSVRUSEVSTUFMV0FSTklOR1JJU0UKKwkJCXwgUE0yWFhYX0lOVDVfU19JVFRIRVJNQUxTSFVURE9XTlJJU0UpKQorCQlwbTItPmZsYWdzLm1haW5fdGhlcm1hbF9wcm90ID0gdHJ1ZTsKKwllbHNlIGlmICh2YWwgJiAoUE0yWFhYX0lOVDVfU19JVFRIRVJNQUxXQVJOSU5HRkFMTAorCQkJCXwgUE0yWFhYX0lOVDVfU19JVFRIRVJNQUxTSFVURE9XTkZBTEwpKQorCQlwbTItPmZsYWdzLm1haW5fdGhlcm1hbF9wcm90ID0gZmFsc2U7CisKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOworfQorCitzdGF0aWMgc3RydWN0IHBtMnh4eF9pbnRlcnJ1cHRzIHBtMnh4eF9pbnQgPSB7CisJLmhhbmRsZXJbMF0gPSBwbTJfaW50X3JlZzAsCisJLmhhbmRsZXJbMV0gPSBwbTJfaW50X3JlZzEsCisJLmhhbmRsZXJbMl0gPSBwbTJfaW50X3JlZzIsCisJLmhhbmRsZXJbM10gPSBwbTJfaW50X3JlZzMsCisJLmhhbmRsZXJbNF0gPSBwbTJfaW50X3JlZzQsCisJLmhhbmRsZXJbNV0gPSBwbTJfaW50X3JlZzUsCit9OworCitzdGF0aWMgc3RydWN0IHBtMnh4eF9pcnEgcG0yeHh4X2NoYXJnZXJfaXJxW10gPSB7CisJeyJQTTJYWFhfSVJRX0lOVCIsIHBtMnh4eF9pcnFfaW50fSwKK307CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcG0yeHh4X3dhbGxfY2hhcmdlcl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yOworCisJcG0yID0gIChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKilpMmNfZ2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCk7CisJc2V0X2xwbl9waW4ocG0yKTsKKworCS8qIElmIHdlIHN0aWxsIGhhdmUgYSBIVyBmYWlsdXJlLCBzY2hlZHVsZSBhIG5ldyBjaGVjayAqLworCWlmIChwbTItPmZsYWdzLm92dikKKwkJcXVldWVfZGVsYXllZF93b3JrKHBtMi0+Y2hhcmdlcl93cSwKKwkJCQkmcG0yLT5jaGVja19od19mYWlsdXJlX3dvcmssIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgcG0yeHh4X3dhbGxfY2hhcmdlcl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2NsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKKworCXBtMiA9ICAoc3RydWN0IHBtMnh4eF9jaGFyZ2VyICopaTJjX2dldF9jbGllbnRkYXRhKGkyY19jbGllbnQpOworCWNsZWFyX2xwbl9waW4ocG0yKTsKKworCS8qIENhbmNlbCBhbnkgcGVuZGluZyBIVyBmYWlsdXJlIGNoZWNrICovCisJaWYgKGRlbGF5ZWRfd29ya19wZW5kaW5nKCZwbTItPmNoZWNrX2h3X2ZhaWx1cmVfd29yaykpCisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnBtMi0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrKTsKKworCWZsdXNoX3dvcmsoJnBtMi0+YWNfd29yayk7CisJZmx1c2hfd29yaygmcG0yLT5jaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHBtMnh4eF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpwbTJ4eHhfaTJjX2NsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKKworCXBtMiA9IChzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKilpMmNfZ2V0X2NsaWVudGRhdGEocG0yeHh4X2kyY19jbGllbnQpOworCWNsZWFyX2xwbl9waW4ocG0yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHBtMnh4eF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKnBtMnh4eF9pMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yOworCisJcG0yID0gKHN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqKWkyY19nZXRfY2xpZW50ZGF0YShwbTJ4eHhfaTJjX2NsaWVudCk7CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbTItPmxwbl9waW4pICYmIGdwaW9fZ2V0X3ZhbHVlKHBtMi0+bHBuX3BpbikgPT0gMCkKKwkJc2V0X2xwbl9waW4ocG0yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcG0yeHh4X3BtX29wcyBfX21heWJlX3VudXNlZCA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhwbTJ4eHhfd2FsbF9jaGFyZ2VyX3N1c3BlbmQsCisJCXBtMnh4eF93YWxsX2NoYXJnZXJfcmVzdW1lKQorCVNFVF9SVU5USU1FX1BNX09QUyhwbTJ4eHhfcnVudGltZV9zdXNwZW5kLCBwbTJ4eHhfcnVudGltZV9yZXN1bWUsIE5VTEwpCit9OworCitzdGF0aWMgaW50IHBtMnh4eF93YWxsX2NoYXJnZXJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyY19jbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgcG0yeHh4X3BsYXRmb3JtX2RhdGEgKnBsX2RhdGEgPSBpMmNfY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CisJc3RydWN0IHBtMnh4eF9jaGFyZ2VyICpwbTI7CisJaW50IHJldCA9IDA7CisJdTggdmFsOworCWludCBpOworCisJaWYgKCFwbF9kYXRhKSB7CisJCWRldl9lcnIoJmkyY19jbGllbnQtPmRldiwgIk5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwbTIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtMikgeworCQlkZXZfZXJyKCZpMmNfY2xpZW50LT5kZXYsICJwbTJ4eHhfY2hhcmdlciBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIGdldCBwYXJlbnQgZGF0YSAqLworCXBtMi0+ZGV2ID0gJmkyY19jbGllbnQtPmRldjsKKworCXBtMi0+cG0yX2ludCA9ICZwbTJ4eHhfaW50OworCisJLyogZ2V0IGNoYXJnZXIgc3BjaWZpYyBwbGF0Zm9ybSBkYXRhICovCisJaWYgKCFwbF9kYXRhLT53YWxsX2NoYXJnZXIpIHsKKwkJZGV2X2VycihwbTItPmRldiwgIm5vIGNoYXJnZXIgcGxhdGZvcm0gZGF0YSBzdXBwbGllZFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZnJlZV9kZXZpY2VfaW5mbzsKKwl9CisKKwlwbTItPnBkYXRhID0gcGxfZGF0YS0+d2FsbF9jaGFyZ2VyOworCisJLyogZ2V0IGJhdHRlcnkgc3BlY2lmaWMgcGxhdGZvcm0gZGF0YSAqLworCWlmICghcGxfZGF0YS0+YmF0dGVyeSkgeworCQlkZXZfZXJyKHBtMi0+ZGV2LCAibm8gYmF0dGVyeSBwbGF0Zm9ybSBkYXRhIHN1cHBsaWVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmcmVlX2RldmljZV9pbmZvOworCX0KKworCXBtMi0+YmF0ID0gcGxfZGF0YS0+YmF0dGVyeTsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoaTJjX2NsaWVudC0+YWRhcHRlciwKKwkJCUkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSB8CisJCQlJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZGV2X2luZm8ocG0yLT5kZXYsICJwbTIzMDEgaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkgZmFpbGVkXG4iKTsKKwkJZ290byBmcmVlX2RldmljZV9pbmZvOworCX0KKworCXBtMi0+Y29uZmlnLnBtMnh4eF9pMmMgPSBpMmNfY2xpZW50OworCXBtMi0+Y29uZmlnLnBtMnh4eF9pZCA9IChzdHJ1Y3QgaTJjX2RldmljZV9pZCAqKSBpZDsKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjX2NsaWVudCwgcG0yKTsKKworCS8qIEFDIHN1cHBseSAqLworCS8qIHBvd2VyX3N1cHBseSBiYXNlIGNsYXNzICovCisJcG0yLT5hY19jaGdfZGVzYy5uYW1lID0gcG0yLT5wZGF0YS0+bGFiZWw7CisJcG0yLT5hY19jaGdfZGVzYy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7CisJcG0yLT5hY19jaGdfZGVzYy5wcm9wZXJ0aWVzID0gcG0yeHh4X2NoYXJnZXJfYWNfcHJvcHM7CisJcG0yLT5hY19jaGdfZGVzYy5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUocG0yeHh4X2NoYXJnZXJfYWNfcHJvcHMpOworCXBtMi0+YWNfY2hnX2Rlc2MuZ2V0X3Byb3BlcnR5ID0gcG0yeHh4X2NoYXJnZXJfYWNfZ2V0X3Byb3BlcnR5OworCisJcHN5X2NmZy5zdXBwbGllZF90byA9IHBtMi0+cGRhdGEtPnN1cHBsaWVkX3RvOworCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gcG0yLT5wZGF0YS0+bnVtX3N1cHBsaWNhbnRzOworCS8qIHBtMnh4eF9jaGFyZ2VyIHN1Yi1jbGFzcyAqLworCXBtMi0+YWNfY2hnLm9wcy5lbmFibGUgPSAmcG0yeHh4X2NoYXJnZXJfYWNfZW47CisJcG0yLT5hY19jaGcub3BzLmtpY2tfd2QgPSAmcG0yeHh4X2NoYXJnZXJfd2F0Y2hkb2dfa2ljazsKKwlwbTItPmFjX2NoZy5vcHMudXBkYXRlX2N1cnIgPSAmcG0yeHh4X2NoYXJnZXJfdXBkYXRlX2NoYXJnZXJfY3VycmVudDsKKwlwbTItPmFjX2NoZy5tYXhfb3V0X3ZvbHQgPSBwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcFsKKwkJQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl92b2x0YWdlX21hcCkgLSAxXTsKKwlwbTItPmFjX2NoZy5tYXhfb3V0X2N1cnIgPSBwbTJ4eHhfY2hhcmdlcl9jdXJyZW50X21hcFsKKwkJQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl9jdXJyZW50X21hcCkgLSAxXTsKKwlwbTItPmFjX2NoZy53ZHRfcmVmcmVzaCA9IFdEX0tJQ0tfSU5URVJWQUw7CisJcG0yLT5hY19jaGcuZW5hYmxlZCA9IHRydWU7CisJcG0yLT5hY19jaGcuZXh0ZXJuYWwgPSB0cnVlOworCisJLyogQ3JlYXRlIGEgd29yayBxdWV1ZSBmb3IgdGhlIGNoYXJnZXIgKi8KKwlwbTItPmNoYXJnZXJfd3EgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgicG0yeHh4X2NoYXJnZXJfd3EiLAorCQkJCQkJICBXUV9NRU1fUkVDTEFJTSk7CisJaWYgKHBtMi0+Y2hhcmdlcl93cSA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWRldl9lcnIocG0yLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHdvcmsgcXVldWVcbiIpOworCQlnb3RvIGZyZWVfZGV2aWNlX2luZm87CisJfQorCisJLyogSW5pdCB3b3JrIGZvciBjaGFyZ2VyIGRldGVjdGlvbiAqLworCUlOSVRfV09SSygmcG0yLT5hY193b3JrLCBwbTJ4eHhfY2hhcmdlcl9hY193b3JrKTsKKworCS8qIEluaXQgd29yayBmb3IgY2hlY2tpbmcgSFcgc3RhdHVzICovCisJSU5JVF9XT1JLKCZwbTItPmNoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmssCisJCXBtMnh4eF9jaGFyZ2VyX2NoZWNrX21haW5fdGhlcm1hbF9wcm90X3dvcmspOworCisJLyogSW5pdCB3b3JrIGZvciBIVyBmYWlsdXJlIGNoZWNrICovCisJSU5JVF9ERUZFUlJBQkxFX1dPUksoJnBtMi0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrLAorCQlwbTJ4eHhfY2hhcmdlcl9jaGVja19od19mYWlsdXJlX3dvcmspOworCisJLyoKKwkgKiBWREQgQURDIHN1cHBseSBuZWVkcyB0byBiZSBlbmFibGVkIGZyb20gdGhpcyBkcml2ZXIgd2hlbiB0aGVyZQorCSAqIGlzIGEgY2hhcmdlciBjb25uZWN0ZWQgdG8gYXZvaWQgZXJyb25lb3VzIEJURU1QX0hJR0gvTE9XCisJICogaW50ZXJydXB0cyBkdXJpbmcgY2hhcmdpbmcKKwkgKi8KKwlwbTItPnJlZ3UgPSByZWd1bGF0b3JfZ2V0KHBtMi0+ZGV2LCAidmRkYWRjIik7CisJaWYgKElTX0VSUihwbTItPnJlZ3UpKSB7CisJCXJldCA9IFBUUl9FUlIocG0yLT5yZWd1KTsKKwkJZGV2X2VycihwbTItPmRldiwgImZhaWxlZCB0byBnZXQgdmRkYWRjIHJlZ3VsYXRvclxuIik7CisJCWdvdG8gZnJlZV9jaGFyZ2VyX3dxOworCX0KKworCS8qIFJlZ2lzdGVyIEFDIGNoYXJnZXIgY2xhc3MgKi8KKwlwbTItPmFjX2NoZy5wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIocG0yLT5kZXYsICZwbTItPmFjX2NoZ19kZXNjLAorCQkJCQkJJnBzeV9jZmcpOworCWlmIChJU19FUlIocG0yLT5hY19jaGcucHN5KSkgeworCQlkZXZfZXJyKHBtMi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIEFDIGNoYXJnZXJcbiIpOworCQlyZXQgPSBQVFJfRVJSKHBtMi0+YWNfY2hnLnBzeSk7CisJCWdvdG8gZnJlZV9yZWd1bGF0b3I7CisJfQorCisJLyogUmVnaXN0ZXIgaW50ZXJydXB0cyAqLworCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGdwaW9fdG9faXJxKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlciksCisJCQkJTlVMTCwKKwkJCQlwbTJ4eHhfY2hhcmdlcl9pcnFbMF0uaXNyLAorCQkJCXBtMi0+cGRhdGEtPmlycV90eXBlLAorCQkJCXBtMnh4eF9jaGFyZ2VyX2lycVswXS5uYW1lLCBwbTIpOworCisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIocG0yLT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCAlcyBJUlEgJWQ6ICVkXG4iLAorCQlwbTJ4eHhfY2hhcmdlcl9pcnFbMF0ubmFtZSwKKwkJCWdwaW9fdG9faXJxKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlciksIHJldCk7CisJCWdvdG8gdW5yZWdpc3Rlcl9wbTJ4eHhfY2hhcmdlcjsKKwl9CisKKwlyZXQgPSBwbV9ydW50aW1lX3NldF9hY3RpdmUocG0yLT5kZXYpOworCWlmIChyZXQpCisJCWRldl9lcnIocG0yLT5kZXYsICJzZXQgYWN0aXZlIEVycm9yXG4iKTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKHBtMi0+ZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShwbTItPmRldiwgUE0yWFhYX0FVVE9TVVNQRU5EX0RFTEFZKTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZChwbTItPmRldik7CisJcG1fcnVudGltZV9yZXN1bWUocG0yLT5kZXYpOworCisJLyogcG0gaW50ZXJydXB0IGNhbiB3YWtlIHVwIHN5c3RlbSAqLworCXJldCA9IGVuYWJsZV9pcnFfd2FrZShncGlvX3RvX2lycShwbTItPnBkYXRhLT5ncGlvX2lycV9udW1iZXIpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocG0yLT5kZXYsICJmYWlsZWQgdG8gc2V0IGlycSB3YWtlXG4iKTsKKwkJZ290byB1bnJlZ2lzdGVyX3BtMnh4eF9pbnRlcnJ1cHQ7CisJfQorCisJbXV0ZXhfaW5pdCgmcG0yLT5sb2NrKTsKKworCWlmIChncGlvX2lzX3ZhbGlkKHBtMi0+cGRhdGEtPmxwbl9ncGlvKSkgeworCQkvKiBnZXQgbHBuIEdQSU8gZnJvbSBwbGF0Zm9ybSBkYXRhICovCisJCXBtMi0+bHBuX3BpbiA9IHBtMi0+cGRhdGEtPmxwbl9ncGlvOworCisJCS8qCisJCSAqIENoYXJnZXIgZGV0ZWN0aW9uIG1lY2hhbmlzbSByZXF1aXJlcyBwdWxsaW5nIHVwIHRoZSBMUE4gcGluCisJCSAqIHdoaWxlIGkyYyBjb21tdW5pY2F0aW9uIGlmIENoYXJnZXIgaXMgbm90IGNvbm5lY3RlZAorCQkgKiBMUE4gcGluIG9mIFBNMjMwMSBpcyBHUElPNjAgb2YgQUI5NTQwCisJCSAqLworCQlyZXQgPSBncGlvX3JlcXVlc3QocG0yLT5scG5fcGluLCAicG0yMzAxX2xwbV9ncGlvIik7CisKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocG0yLT5kZXYsICJwbTIzMDFfbHBtX2dwaW8gcmVxdWVzdCBmYWlsZWRcbiIpOworCQkJZ290byBkaXNhYmxlX3BtMl9pcnFfd2FrZTsKKwkJfQorCQlyZXQgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQocG0yLT5scG5fcGluLCAwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIocG0yLT5kZXYsICJwbTIzMDFfbHBtX2dwaW8gZGlyZWN0aW9uIGZhaWxlZFxuIik7CisJCQlnb3RvIGZyZWVfZ3BpbzsKKwkJfQorCQlzZXRfbHBuX3BpbihwbTIpOworCX0KKworCS8qIHJlYWQgIGludGVycnVwdCByZWdpc3RlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUE0yWFhYX05VTV9JTlRfUkVHOyBpKyspCisJCXBtMnh4eF9yZWdfcmVhZChwbTIsCisJCQlwbTJ4eHhfaW50ZXJydXB0X3JlZ2lzdGVyc1tpXSwKKwkJCSZ2YWwpOworCisJcmV0ID0gcG0yeHh4X2NoYXJnZXJfZGV0ZWN0aW9uKHBtMiwgJnZhbCk7CisKKwlpZiAoKHJldCA9PSAwKSAmJiB2YWwpIHsKKwkJcG0yLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCA9IDE7CisJCWFiODUwMF9vdmVycmlkZV90dXJuX29uX3N0YXQofkFCODUwMF9QT1dfS0VZXzFfT04sCisJCQkJCSAgICAgQUI4NTAwX01BSU5fQ0hfREVUKTsKKwkJcG0yLT5hY19jb25uID0gdHJ1ZTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKKwkJc3lzZnNfbm90aWZ5KCZwbTItPmFjX2NoZy5wc3ktPmRldi5rb2JqLCBOVUxMLCAicHJlc2VudCIpOworCX0KKworCXJldHVybiAwOworCitmcmVlX2dwaW86CisJaWYgKGdwaW9faXNfdmFsaWQocG0yLT5scG5fcGluKSkKKwkJZ3Bpb19mcmVlKHBtMi0+bHBuX3Bpbik7CitkaXNhYmxlX3BtMl9pcnFfd2FrZToKKwlkaXNhYmxlX2lycV93YWtlKGdwaW9fdG9faXJxKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlcikpOwordW5yZWdpc3Rlcl9wbTJ4eHhfaW50ZXJydXB0OgorCS8qIGRpc2FibGUgaW50ZXJydXB0ICovCisJZnJlZV9pcnEoZ3Bpb190b19pcnEocG0yLT5wZGF0YS0+Z3Bpb19pcnFfbnVtYmVyKSwgcG0yKTsKK3VucmVnaXN0ZXJfcG0yeHh4X2NoYXJnZXI6CisJLyogdW5yZWdpc3RlciBwb3dlciBzdXBwbHkgKi8KKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihwbTItPmFjX2NoZy5wc3kpOworZnJlZV9yZWd1bGF0b3I6CisJLyogZGlzYWJsZSB0aGUgcmVndWxhdG9yICovCisJcmVndWxhdG9yX3B1dChwbTItPnJlZ3UpOworZnJlZV9jaGFyZ2VyX3dxOgorCWRlc3Ryb3lfd29ya3F1ZXVlKHBtMi0+Y2hhcmdlcl93cSk7CitmcmVlX2RldmljZV9pbmZvOgorCWtmcmVlKHBtMik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBtMnh4eF93YWxsX2NoYXJnZXJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50KQoreworCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yID0gaTJjX2dldF9jbGllbnRkYXRhKGkyY19jbGllbnQpOworCisJLyogRGlzYWJsZSBwbV9ydW50aW1lICovCisJcG1fcnVudGltZV9kaXNhYmxlKHBtMi0+ZGV2KTsKKwkvKiBEaXNhYmxlIEFDIGNoYXJnaW5nICovCisJcG0yeHh4X2NoYXJnZXJfYWNfZW4oJnBtMi0+YWNfY2hnLCBmYWxzZSwgMCwgMCk7CisKKwkvKiBEaXNhYmxlIHdha2UgYnkgcG0gaW50ZXJydXB0ICovCisJZGlzYWJsZV9pcnFfd2FrZShncGlvX3RvX2lycShwbTItPnBkYXRhLT5ncGlvX2lycV9udW1iZXIpKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlciksIHBtMik7CisKKwkvKiBEZWxldGUgdGhlIHdvcmsgcXVldWUgKi8KKwlkZXN0cm95X3dvcmtxdWV1ZShwbTItPmNoYXJnZXJfd3EpOworCisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCS8qIGRpc2FibGUgdGhlIHJlZ3VsYXRvciAqLworCXJlZ3VsYXRvcl9wdXQocG0yLT5yZWd1KTsKKworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBtMi0+YWNfY2hnLnBzeSk7CisKKwlpZiAoZ3Bpb19pc192YWxpZChwbTItPmxwbl9waW4pKQorCQlncGlvX2ZyZWUocG0yLT5scG5fcGluKTsKKworCWtmcmVlKHBtMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBtMnh4eF9pZFtdID0geworCXsgInBtMjMwMSIsIDAgfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBwbTJ4eHhfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcG0yeHh4X2NoYXJnZXJfZHJpdmVyID0geworCS5wcm9iZSA9IHBtMnh4eF93YWxsX2NoYXJnZXJfcHJvYmUsCisJLnJlbW92ZSA9IHBtMnh4eF93YWxsX2NoYXJnZXJfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInBtMnh4eC13YWxsX2NoYXJnZXIiLAorCQkucG0gPSBJU19FTkFCTEVEKENPTkZJR19QTSkgPyAmcG0yeHh4X3BtX29wcyA6IE5VTEwsCisJfSwKKwkuaWRfdGFibGUgPSBwbTJ4eHhfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwbTJ4eHhfY2hhcmdlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZwbTJ4eHhfY2hhcmdlcl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcG0yeHh4X2NoYXJnZXJfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZwbTJ4eHhfY2hhcmdlcl9kcml2ZXIpOworfQorCitkZXZpY2VfaW5pdGNhbGxfc3luYyhwbTJ4eHhfY2hhcmdlcl9pbml0KTsKK21vZHVsZV9leGl0KHBtMnh4eF9jaGFyZ2VyX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJSYWprdW1hciBrYXNpcmFqYW4sIE9saXZpZXIgTGF1bmF5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBNMnh4eCBjaGFyZ2VyIG1hbmFnZW1lbnQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3BtMjMwMV9jaGFyZ2VyLmggYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9wbTIzMDFfY2hhcmdlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3BtMjMwMV9jaGFyZ2VyLmgKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3BtMjMwMV9jaGFyZ2VyLmgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcG11X2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3BtdV9iYXR0ZXJ5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvcG11X2JhdHRlcnkuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvcG11X2JhdHRlcnkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHkuaCBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3Bvd2VyX3N1cHBseS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseS5oCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHkuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfY29yZS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcG93ZXJfc3VwcGx5X2NvcmUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfY29yZS5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHlfY29yZS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9sZWRzLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHlfbGVkcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9sZWRzLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3Bvd2VyX3N1cHBseV9sZWRzLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X3N5c2ZzLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9wb3dlcl9zdXBwbHlfc3lzZnMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvcG93ZXJfc3VwcGx5X3N5c2ZzLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcWNvbV9zbWJiLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS9xY29tX3NtYmIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9xY29tX3NtYmIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvcWNvbV9zbWJiLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcnQ1MDMzX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3J0NTAzM19iYXR0ZXJ5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvcnQ1MDMzX2JhdHRlcnkuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvcnQ1MDMzX2JhdHRlcnkuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9ydDk0NTVfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcnQ5NDU1X2NoYXJnZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci9ydDk0NTVfY2hhcmdlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS9ydDk0NTVfY2hhcmdlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3J4NTFfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvcng1MV9iYXR0ZXJ5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvcng1MV9iYXR0ZXJ5LmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3J4NTFfYmF0dGVyeS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3MzY19hZGNfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvczNjX2FkY19iYXR0ZXJ5LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvczNjX2FkY19iYXR0ZXJ5LmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3MzY19hZGNfYmF0dGVyeS5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS9zYnMtYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvc2JzLWJhdHRlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmIyZWIzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvc2JzLWJhdHRlcnkuYwpAQCAtMCwwICsxLDkzNCBAQAorLyoKKyAqIEdhcyBHYXVnZSBkcml2ZXIgZm9yIFNCUyBDb21wbGlhbnQgQmF0dGVyaWVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBOVklESUEgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL3Nicy1iYXR0ZXJ5Lmg+CisKK2VudW0geworCVJFR19NQU5VRkFDVFVSRVJfREFUQSwKKwlSRUdfVEVNUEVSQVRVUkUsCisJUkVHX1ZPTFRBR0UsCisJUkVHX0NVUlJFTlQsCisJUkVHX0NBUEFDSVRZLAorCVJFR19USU1FX1RPX0VNUFRZLAorCVJFR19USU1FX1RPX0ZVTEwsCisJUkVHX1NUQVRVUywKKwlSRUdfQ0FQQUNJVFlfTEVWRUwsCisJUkVHX0NZQ0xFX0NPVU5ULAorCVJFR19TRVJJQUxfTlVNQkVSLAorCVJFR19SRU1BSU5JTkdfQ0FQQUNJVFksCisJUkVHX1JFTUFJTklOR19DQVBBQ0lUWV9DSEFSR0UsCisJUkVHX0ZVTExfQ0hBUkdFX0NBUEFDSVRZLAorCVJFR19GVUxMX0NIQVJHRV9DQVBBQ0lUWV9DSEFSR0UsCisJUkVHX0RFU0lHTl9DQVBBQ0lUWSwKKwlSRUdfREVTSUdOX0NBUEFDSVRZX0NIQVJHRSwKKwlSRUdfREVTSUdOX1ZPTFRBR0VfTUlOLAorCVJFR19ERVNJR05fVk9MVEFHRV9NQVgsCisJUkVHX01BTlVGQUNUVVJFUiwKKwlSRUdfTU9ERUxfTkFNRSwKK307CisKKy8qIEJhdHRlcnkgTW9kZSBkZWZpbmVzICovCisjZGVmaW5lIEJBVFRFUllfTU9ERV9PRkZTRVQJCTB4MDMKKyNkZWZpbmUgQkFUVEVSWV9NT0RFX01BU0sJCTB4ODAwMAorZW51bSBzYnNfYmF0dGVyeV9tb2RlIHsKKwlCQVRURVJZX01PREVfQU1QUywKKwlCQVRURVJZX01PREVfV0FUVFMKK307CisKKy8qIG1hbnVmYWN0dXJlciBhY2Nlc3MgZGVmaW5lcyAqLworI2RlZmluZSBNQU5VRkFDVFVSRVJfQUNDRVNTX1NUQVRVUwkweDAwMDYKKyNkZWZpbmUgTUFOVUZBQ1RVUkVSX0FDQ0VTU19TTEVFUAkweDAwMTEKKworLyogYmF0dGVyeSBzdGF0dXMgdmFsdWUgYml0cyAqLworI2RlZmluZSBCQVRURVJZX0lOSVRJQUxJWkVECQkweDgwCisjZGVmaW5lIEJBVFRFUllfRElTQ0hBUkdJTkcJCTB4NDAKKyNkZWZpbmUgQkFUVEVSWV9GVUxMX0NIQVJHRUQJCTB4MjAKKyNkZWZpbmUgQkFUVEVSWV9GVUxMX0RJU0NIQVJHRUQJCTB4MTAKKworLyogbWluX3ZhbHVlIGFuZCBtYXhfdmFsdWUgYXJlIG9ubHkgdmFsaWQgZm9yIG51bWVyaWNhbCBkYXRhICovCisjZGVmaW5lIFNCU19EQVRBKF9wc3AsIF9hZGRyLCBfbWluX3ZhbHVlLCBfbWF4X3ZhbHVlKSB7IFwKKwkucHNwID0gX3BzcCwgXAorCS5hZGRyID0gX2FkZHIsIFwKKwkubWluX3ZhbHVlID0gX21pbl92YWx1ZSwgXAorCS5tYXhfdmFsdWUgPSBfbWF4X3ZhbHVlLCBcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hpcF9kYXRhIHsKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3A7CisJdTggYWRkcjsKKwlpbnQgbWluX3ZhbHVlOworCWludCBtYXhfdmFsdWU7Cit9IHNic19kYXRhW10gPSB7CisJW1JFR19NQU5VRkFDVFVSRVJfREFUQV0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULCAweDAwLCAwLCA2NTUzNSksCisJW1JFR19URU1QRVJBVFVSRV0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9URU1QLCAweDA4LCAwLCA2NTUzNSksCisJW1JFR19WT0xUQUdFXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLCAweDA5LCAwLCAyMDAwMCksCisJW1JFR19DVVJSRU5UXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLCAweDBBLCAtMzI3NjgsIDMyNzY3KSwKKwlbUkVHX0NBUEFDSVRZXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLCAweDBELCAwLCAxMDApLAorCVtSRUdfUkVNQUlOSU5HX0NBUEFDSVRZXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9OT1csIDB4MEYsIDAsIDY1NTM1KSwKKwlbUkVHX1JFTUFJTklOR19DQVBBQ0lUWV9DSEFSR0VdID0KKwkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywgMHgwRiwgMCwgNjU1MzUpLAorCVtSRUdfRlVMTF9DSEFSR0VfQ0FQQUNJVFldID0KKwkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTEwsIDB4MTAsIDAsIDY1NTM1KSwKKwlbUkVHX0ZVTExfQ0hBUkdFX0NBUEFDSVRZX0NIQVJHRV0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwgMHgxMCwgMCwgNjU1MzUpLAorCVtSRUdfVElNRV9UT19FTVBUWV0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX0FWRywgMHgxMiwgMCwgNjU1MzUpLAorCVtSRUdfVElNRV9UT19GVUxMXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVMTF9BVkcsIDB4MTMsIDAsIDY1NTM1KSwKKwlbUkVHX1NUQVRVU10gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsIDB4MTYsIDAsIDY1NTM1KSwKKwlbUkVHX0NBUEFDSVRZX0xFVkVMXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0xFVkVMLCAweDE2LCAwLCA2NTUzNSksCisJW1JFR19DWUNMRV9DT1VOVF0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9DWUNMRV9DT1VOVCwgMHgxNywgMCwgNjU1MzUpLAorCVtSRUdfREVTSUdOX0NBUEFDSVRZXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMX0RFU0lHTiwgMHgxOCwgMCwgNjU1MzUpLAorCVtSRUdfREVTSUdOX0NBUEFDSVRZX0NIQVJHRV0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR04sIDB4MTgsIDAsIDY1NTM1KSwKKwlbUkVHX0RFU0lHTl9WT0xUQUdFX01JTl0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR04sIDB4MTksIDAsIDY1NTM1KSwKKwlbUkVHX0RFU0lHTl9WT0xUQUdFX01BWF0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR04sIDB4MTksIDAsIDY1NTM1KSwKKwlbUkVHX1NFUklBTF9OVU1CRVJdID0KKwkJU0JTX0RBVEEoUE9XRVJfU1VQUExZX1BST1BfU0VSSUFMX05VTUJFUiwgMHgxQywgMCwgNjU1MzUpLAorCS8qIFByb3BlcnRpZXMgb2YgdHlwZSBgY29uc3QgY2hhciAqJyAqLworCVtSRUdfTUFOVUZBQ1RVUkVSXSA9CisJCVNCU19EQVRBKFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUiwgMHgyMCwgMCwgNjU1MzUpLAorCVtSRUdfTU9ERUxfTkFNRV0gPQorCQlTQlNfREFUQShQT1dFUl9TVVBQTFlfUFJPUF9NT0RFTF9OQU1FLCAweDIxLCAwLCA2NTUzNSkKK307CisKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBzYnNfcHJvcGVydGllc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NZQ0xFX0NPVU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCisJUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9BVkcsCisJUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19GVUxMX0FWRywKKwlQT1dFUl9TVVBQTFlfUFJPUF9TRVJJQUxfTlVNQkVSLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR04sCisJLyogUHJvcGVydGllcyBvZiB0eXBlIGBjb25zdCBjaGFyIConICovCisJUE9XRVJfU1VQUExZX1BST1BfTUFOVUZBQ1RVUkVSLAorCVBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUUKK307CisKK3N0cnVjdCBzYnNfaW5mbyB7CisJc3RydWN0IGkyY19jbGllbnQJCSpjbGllbnQ7CisJc3RydWN0IHBvd2VyX3N1cHBseQkJKnBvd2VyX3N1cHBseTsKKwlib29sCQkJCWlzX3ByZXNlbnQ7CisJc3RydWN0IGdwaW9fZGVzYwkJKmdwaW9fZGV0ZWN0OworCWJvb2wJCQkJZW5hYmxlX2RldGVjdGlvbjsKKwlpbnQJCQkJbGFzdF9zdGF0ZTsKKwlpbnQJCQkJcG9sbF90aW1lOworCXUzMgkJCQlpMmNfcmV0cnlfY291bnQ7CisJdTMyCQkJCXBvbGxfcmV0cnlfY291bnQ7CisJc3RydWN0IGRlbGF5ZWRfd29yawkJd29yazsKKwlpbnQJCQkJaWdub3JlX2NoYW5nZXM7Cit9OworCitzdGF0aWMgY2hhciBtb2RlbF9uYW1lW0kyQ19TTUJVU19CTE9DS19NQVggKyAxXTsKK3N0YXRpYyBjaGFyIG1hbnVmYWN0dXJlcltJMkNfU01CVVNfQkxPQ0tfTUFYICsgMV07CitzdGF0aWMgYm9vbCBmb3JjZV9sb2FkOworCitzdGF0aWMgaW50IHNic19yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBhZGRyZXNzKQoreworCXN0cnVjdCBzYnNfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXMzMiByZXQgPSAwOworCWludCByZXRyaWVzID0gMTsKKworCXJldHJpZXMgPSBjaGlwLT5pMmNfcmV0cnlfY291bnQ7CisKKwl3aGlsZSAocmV0cmllcyA+IDApIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgYWRkcmVzcyk7CisJCWlmIChyZXQgPj0gMCkKKwkJCWJyZWFrOworCQlyZXRyaWVzLS07CisJfQorCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsCisJCQkiJXM6IGkyYyByZWFkIGF0IGFkZHJlc3MgMHgleCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgYWRkcmVzcyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGxlMTZfdG9fY3B1KHJldCk7Cit9CisKK3N0YXRpYyBpbnQgc2JzX3JlYWRfc3RyaW5nX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggYWRkcmVzcywKKwkJCQljaGFyICp2YWx1ZXMpCit7CisJc3RydWN0IHNic19pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJczMyIHJldCA9IDAsIGJsb2NrX2xlbmd0aCA9IDA7CisJaW50IHJldHJpZXNfbGVuZ3RoID0gMSwgcmV0cmllc19ibG9jayA9IDE7CisJdTggYmxvY2tfYnVmZmVyW0kyQ19TTUJVU19CTE9DS19NQVggKyAxXTsKKworCXJldHJpZXNfbGVuZ3RoID0gY2hpcC0+aTJjX3JldHJ5X2NvdW50OworCXJldHJpZXNfYmxvY2sgPSBjaGlwLT5pMmNfcmV0cnlfY291bnQ7CisKKwkvKiBBZGFwdGVyIG5lZWRzIHRvIHN1cHBvcnQgdGhlc2UgdHdvIGZ1bmN0aW9ucyAqLworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSykpeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBHZXQgdGhlIGxlbmd0aCBvZiBibG9jayBkYXRhICovCisJd2hpbGUgKHJldHJpZXNfbGVuZ3RoID4gMCkgeworCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBhZGRyZXNzKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJYnJlYWs7CisJCXJldHJpZXNfbGVuZ3RoLS07CisJfQorCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsCisJCQkiJXM6IGkyYyByZWFkIGF0IGFkZHJlc3MgMHgleCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgYWRkcmVzcyk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogYmxvY2tfbGVuZ3RoIGRvZXMgbm90IGluY2x1ZGUgTlVMTCB0ZXJtaW5hdG9yICovCisJYmxvY2tfbGVuZ3RoID0gcmV0OworCWlmIChibG9ja19sZW5ndGggPiBJMkNfU01CVVNfQkxPQ0tfTUFYKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIiVzOiBSZXR1cm5lZCBibG9ja19sZW5ndGggaXMgbG9uZ2VyIHRoYW4gMHgleFxuIiwKKwkJCV9fZnVuY19fLCBJMkNfU01CVVNfQkxPQ0tfTUFYKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogR2V0IHRoZSBibG9jayBkYXRhICovCisJd2hpbGUgKHJldHJpZXNfYmxvY2sgPiAwKSB7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKAorCQkJCWNsaWVudCwgYWRkcmVzcywKKwkJCQlibG9ja19sZW5ndGggKyAxLCBibG9ja19idWZmZXIpOworCQlpZiAocmV0ID49IDApCisJCQlicmVhazsKKwkJcmV0cmllc19ibG9jay0tOworCX0KKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkJIiVzOiBpMmMgcmVhZCBhdCBhZGRyZXNzIDB4JXggZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIGFkZHJlc3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGJsb2NrX2J1ZmZlclswXSA9PSBibG9ja19sZW5ndGggKi8KKwltZW1jcHkodmFsdWVzLCBibG9ja19idWZmZXIgKyAxLCBibG9ja19sZW5ndGgpOworCXZhbHVlc1tibG9ja19sZW5ndGhdID0gJ1wwJzsKKworCXJldHVybiBsZTE2X3RvX2NwdShyZXQpOworfQorCitzdGF0aWMgaW50IHNic193cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggYWRkcmVzcywKKwl1MTYgdmFsdWUpCit7CisJc3RydWN0IHNic19pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJczMyIHJldCA9IDA7CisJaW50IHJldHJpZXMgPSAxOworCisJcmV0cmllcyA9IGNoaXAtPmkyY19yZXRyeV9jb3VudDsKKworCXdoaWxlIChyZXRyaWVzID4gMCkgeworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgYWRkcmVzcywKKwkJCWxlMTZfdG9fY3B1KHZhbHVlKSk7CisJCWlmIChyZXQgPj0gMCkKKwkJCWJyZWFrOworCQlyZXRyaWVzLS07CisJfQorCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsCisJCQkiJXM6IGkyYyB3cml0ZSB0byBhZGRyZXNzIDB4JXggZmFpbGVkXG4iLAorCQkJX19mdW5jX18sIGFkZHJlc3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNic19nZXRfYmF0dGVyeV9wcmVzZW5jZV9hbmRfaGVhbHRoKAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXMzMiByZXQ7CisJc3RydWN0IHNic19pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQgJiYgY2hpcC0+Z3Bpb19kZXRlY3QpIHsKKwkJcmV0ID0gZ3Bpb2RfZ2V0X3ZhbHVlX2NhbnNsZWVwKGNoaXAtPmdwaW9fZGV0ZWN0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQl2YWwtPmludHZhbCA9IHJldDsKKwkJY2hpcC0+aXNfcHJlc2VudCA9IHZhbC0+aW50dmFsOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogV3JpdGUgdG8gTWFudWZhY3R1cmVyQWNjZXNzIHdpdGggTWFudWZhY3R1cmVyQWNjZXNzIGNvbW1hbmQKKwkgKiBhbmQgdGhlbiByZWFkIHRoZSBzdGF0dXMuIERvIG5vdCBjaGVjayBmb3IgZXJyb3Igb24gdGhlIHdyaXRlCisJICogc2luY2Ugbm90IGFsbCBiYXR0ZXJpZXMgaW1wbGVtZW50IHdyaXRlIGFjY2VzcyB0byB0aGlzIGNvbW1hbmQsCisJICogd2hpbGUgb3RoZXJzIG1hbmRhdGUgaXQuCisJICovCisJc2JzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHNic19kYXRhW1JFR19NQU5VRkFDVFVSRVJfREFUQV0uYWRkciwKKwkJCSAgICBNQU5VRkFDVFVSRVJfQUNDRVNTX1NUQVRVUyk7CisKKwlyZXQgPSBzYnNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBzYnNfZGF0YVtSRUdfTUFOVUZBQ1RVUkVSX0RBVEFdLmFkZHIpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCkKKwkJCXZhbC0+aW50dmFsID0gMDsgLyogYmF0dGVyeSByZW1vdmVkICovCisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHJldCA8IHNic19kYXRhW1JFR19NQU5VRkFDVFVSRVJfREFUQV0ubWluX3ZhbHVlIHx8CisJICAgIHJldCA+IHNic19kYXRhW1JFR19NQU5VRkFDVFVSRVJfREFUQV0ubWF4X3ZhbHVlKSB7CisJCXZhbC0+aW50dmFsID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTWFzayB0aGUgdXBwZXIgbmliYmxlIG9mIDJuZCBieXRlIGFuZAorCSAqIGxvd2VyIGJ5dGUgb2YgcmVzcG9uc2UgdGhlbgorCSAqIHNoaWZ0IHRoZSByZXN1bHQgYnkgOCB0byBnZXQgc3RhdHVzKi8KKwlyZXQgJj0gMHgwRjAwOworCXJldCA+Pj0gODsKKwlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQpIHsKKwkJaWYgKHJldCA9PSAweDBGKQorCQkJLyogYmF0dGVyeSByZW1vdmVkICovCisJCQl2YWwtPmludHZhbCA9IDA7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gMTsKKwl9IGVsc2UgaWYgKHBzcCA9PSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgpIHsKKwkJaWYgKHJldCA9PSAweDA5KQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOworCQllbHNlIGlmIChyZXQgPT0gMHgwQikKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKKwkJZWxzZSBpZiAocmV0ID09IDB4MEMpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfREVBRDsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2JzX2dldF9iYXR0ZXJ5X3Byb3BlcnR5KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJaW50IHJlZ19vZmZzZXQsIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCBzYnNfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXMzMiByZXQ7CisKKwlyZXQgPSBzYnNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBzYnNfZGF0YVtyZWdfb2Zmc2V0XS5hZGRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHJldHVybmVkIHZhbHVlcyBhcmUgMTYgYml0ICovCisJaWYgKHNic19kYXRhW3JlZ19vZmZzZXRdLm1pbl92YWx1ZSA8IDApCisJCXJldCA9IChzMTYpcmV0OworCisJaWYgKHJldCA+PSBzYnNfZGF0YVtyZWdfb2Zmc2V0XS5taW5fdmFsdWUgJiYKKwkgICAgcmV0IDw9IHNic19kYXRhW3JlZ19vZmZzZXRdLm1heF92YWx1ZSkgeworCQl2YWwtPmludHZhbCA9IHJldDsKKwkJaWYgKHBzcCA9PSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTCkgeworCQkJaWYgKCEocmV0ICYgQkFUVEVSWV9JTklUSUFMSVpFRCkpCisJCQkJdmFsLT5pbnR2YWwgPQorCQkJCQlQT1dFUl9TVVBQTFlfQ0FQQUNJVFlfTEVWRUxfVU5LTk9XTjsKKwkJCWVsc2UgaWYgKHJldCAmIEJBVFRFUllfRlVMTF9DSEFSR0VEKQorCQkJCXZhbC0+aW50dmFsID0KKwkJCQkJUE9XRVJfU1VQUExZX0NBUEFDSVRZX0xFVkVMX0ZVTEw7CisJCQllbHNlIGlmIChyZXQgJiBCQVRURVJZX0ZVTExfRElTQ0hBUkdFRCkKKwkJCQl2YWwtPmludHZhbCA9CisJCQkJCVBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9DUklUSUNBTDsKKwkJCWVsc2UKKwkJCQl2YWwtPmludHZhbCA9CisJCQkJCVBPV0VSX1NVUFBMWV9DQVBBQ0lUWV9MRVZFTF9OT1JNQUw7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChwc3AgIT0gUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChyZXQgJiBCQVRURVJZX0ZVTExfQ0hBUkdFRCkKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCQllbHNlIGlmIChyZXQgJiBCQVRURVJZX0RJU0NIQVJHSU5HKQorCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisKKwkJaWYgKGNoaXAtPnBvbGxfdGltZSA9PSAwKQorCQkJY2hpcC0+bGFzdF9zdGF0ZSA9IHZhbC0+aW50dmFsOworCQllbHNlIGlmIChjaGlwLT5sYXN0X3N0YXRlICE9IHZhbC0+aW50dmFsKSB7CisJCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNoaXAtPndvcmspOworCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hpcC0+cG93ZXJfc3VwcGx5KTsKKwkJCWNoaXAtPnBvbGxfdGltZSA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUykKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2JzX2dldF9iYXR0ZXJ5X3N0cmluZ19wcm9wZXJ0eShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCWludCByZWdfb2Zmc2V0LCBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsIGNoYXIgKnZhbCkKK3sKKwlzMzIgcmV0OworCisJcmV0ID0gc2JzX3JlYWRfc3RyaW5nX2RhdGEoY2xpZW50LCBzYnNfZGF0YVtyZWdfb2Zmc2V0XS5hZGRyLCB2YWwpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgIHNic191bml0X2FkanVzdG1lbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisjZGVmaW5lIEJBU0VfVU5JVF9DT05WRVJTSU9OCQkxMDAwCisjZGVmaW5lIEJBVFRFUllfTU9ERV9DQVBfTVVMVF9XQVRUCSgxMCAqIEJBU0VfVU5JVF9DT05WRVJTSU9OKQorI2RlZmluZSBUSU1FX1VOSVRfQ09OVkVSU0lPTgkJNjAKKyNkZWZpbmUgVEVNUF9LRUxWSU5fVE9fQ0VMU0lVUwkJMjczMQorCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfTk9XOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTEw6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9FTkVSR1lfRlVMTF9ERVNJR046CisJCS8qIHNicyBwcm92aWRlcyBlbmVyZ3kgaW4gdW5pdHMgb2YgMTBtV2guCisJCSAqIENvbnZlcnQgdG8gwrVXaAorCQkgKi8KKwkJdmFsLT5pbnR2YWwgKj0gQkFUVEVSWV9NT0RFX0NBUF9NVUxUX1dBVFQ7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTjoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOOgorCQl2YWwtPmludHZhbCAqPSBCQVNFX1VOSVRfQ09OVkVSU0lPTjsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CisJCS8qIHNicyBwcm92aWRlcyBiYXR0ZXJ5IHRlbXBlcmF0dXJlIGluIDAuMUsKKwkJICogc28gY29udmVydCBpdCB0byAwLjHCsEMKKwkJICovCisJCXZhbC0+aW50dmFsIC09IFRFTVBfS0VMVklOX1RPX0NFTFNJVVM7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX0FWRzoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRlVMTF9BVkc6CisJCS8qIHNicyBwcm92aWRlcyB0aW1lIHRvIGVtcHR5IGFuZCB0aW1lIHRvIGZ1bGwgaW4gbWludXRlcy4KKwkJICogQ29udmVydCB0byBzZWNvbmRzCisJCSAqLworCQl2YWwtPmludHZhbCAqPSBUSU1FX1VOSVRfQ09OVkVSU0lPTjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZGJnKCZjbGllbnQtPmRldiwKKwkJCSIlczogbm8gbmVlZCBmb3IgdW5pdCBjb252ZXJzaW9uICVkXG4iLCBfX2Z1bmNfXywgcHNwKTsKKwl9Cit9CisKK3N0YXRpYyBlbnVtIHNic19iYXR0ZXJ5X21vZGUgc2JzX3NldF9iYXR0ZXJ5X21vZGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwllbnVtIHNic19iYXR0ZXJ5X21vZGUgbW9kZSkKK3sKKwlpbnQgcmV0LCBvcmlnaW5hbF92YWw7CisKKwlvcmlnaW5hbF92YWwgPSBzYnNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBCQVRURVJZX01PREVfT0ZGU0VUKTsKKwlpZiAob3JpZ2luYWxfdmFsIDwgMCkKKwkJcmV0dXJuIG9yaWdpbmFsX3ZhbDsKKworCWlmICgob3JpZ2luYWxfdmFsICYgQkFUVEVSWV9NT0RFX01BU0spID09IG1vZGUpCisJCXJldHVybiBtb2RlOworCisJaWYgKG1vZGUgPT0gQkFUVEVSWV9NT0RFX0FNUFMpCisJCXJldCA9IG9yaWdpbmFsX3ZhbCAmIH5CQVRURVJZX01PREVfTUFTSzsKKwllbHNlCisJCXJldCA9IG9yaWdpbmFsX3ZhbCB8IEJBVFRFUllfTU9ERV9NQVNLOworCisJcmV0ID0gc2JzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIEJBVFRFUllfTU9ERV9PRkZTRVQsIHJldCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gb3JpZ2luYWxfdmFsICYgQkFUVEVSWV9NT0RFX01BU0s7Cit9CisKK3N0YXRpYyBpbnQgc2JzX2dldF9iYXR0ZXJ5X2NhcGFjaXR5KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJaW50IHJlZ19vZmZzZXQsIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXMzMiByZXQ7CisJZW51bSBzYnNfYmF0dGVyeV9tb2RlIG1vZGUgPSBCQVRURVJZX01PREVfV0FUVFM7CisKKwlpZiAocG93ZXJfc3VwcGx5X2lzX2FtcF9wcm9wZXJ0eShwc3ApKQorCQltb2RlID0gQkFUVEVSWV9NT0RFX0FNUFM7CisKKwltb2RlID0gc2JzX3NldF9iYXR0ZXJ5X21vZGUoY2xpZW50LCBtb2RlKTsKKwlpZiAobW9kZSA8IDApCisJCXJldHVybiBtb2RlOworCisJcmV0ID0gc2JzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgc2JzX2RhdGFbcmVnX29mZnNldF0uYWRkcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZKSB7CisJCS8qIHNicyBzcGVjIHNheXMgdGhhdCB0aGlzIGNhbiBiZSA+MTAwICUKKwkJKiBldmVuIGlmIG1heCB2YWx1ZSBpcyAxMDAgJSAqLworCQl2YWwtPmludHZhbCA9IG1pbihyZXQsIDEwMCk7CisJfSBlbHNlCisJCXZhbC0+aW50dmFsID0gcmV0OworCisJcmV0ID0gc2JzX3NldF9iYXR0ZXJ5X21vZGUoY2xpZW50LCBtb2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciBzYnNfc2VyaWFsWzVdOworc3RhdGljIGludCBzYnNfZ2V0X2JhdHRlcnlfc2VyaWFsX251bWJlcihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJaW50IHJldDsKKworCXJldCA9IHNic19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHNic19kYXRhW1JFR19TRVJJQUxfTlVNQkVSXS5hZGRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHNwcmludGYoc2JzX3NlcmlhbCwgIiUwNHgiLCByZXQpOworCXZhbC0+c3RydmFsID0gc2JzX3NlcmlhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNic19nZXRfcHJvcGVydHlfaW5kZXgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCit7CisJaW50IGNvdW50OworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEFSUkFZX1NJWkUoc2JzX2RhdGEpOyBjb3VudCsrKQorCQlpZiAocHNwID09IHNic19kYXRhW2NvdW50XS5wc3ApCisJCQlyZXR1cm4gY291bnQ7CisKKwlkZXZfd2FybigmY2xpZW50LT5kZXYsCisJCSIlczogSW52YWxpZCBQcm9wZXJ0eSAtICVkXG4iLCBfX2Z1bmNfXywgcHNwKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHNic19nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzYnNfaW5mbyAqY2hpcCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJcmV0ID0gc2JzX2dldF9iYXR0ZXJ5X3ByZXNlbmNlX2FuZF9oZWFsdGgoY2xpZW50LCBwc3AsIHZhbCk7CisJCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCkKKwkJCXJldHVybiAwOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9MSU9OOworCQlnb3RvIGRvbmU7IC8qIGRvbid0IHRyaWdnZXIgcG93ZXJfc3VwcGx5X2NoYW5nZWQoKSEgKi8KKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX05PVzoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0VORVJHWV9GVUxMOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfRU5FUkdZX0ZVTExfREVTSUdOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCXJldCA9IHNic19nZXRfcHJvcGVydHlfaW5kZXgoY2xpZW50LCBwc3ApOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXJldCA9IHNic19nZXRfYmF0dGVyeV9jYXBhY2l0eShjbGllbnQsIHJldCwgcHNwLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU0VSSUFMX05VTUJFUjoKKwkJcmV0ID0gc2JzX2dldF9iYXR0ZXJ5X3NlcmlhbF9udW1iZXIoY2xpZW50LCB2YWwpOworCQlicmVhazsKKworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfTEVWRUw6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DWUNMRV9DT1VOVDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9BVkc6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0ZVTExfQVZHOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVhfREVTSUdOOgorCQlyZXQgPSBzYnNfZ2V0X3Byb3BlcnR5X2luZGV4KGNsaWVudCwgcHNwKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKworCQlyZXQgPSBzYnNfZ2V0X2JhdHRlcnlfcHJvcGVydHkoY2xpZW50LCByZXQsIHBzcCwgdmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUU6CisJCXJldCA9IHNic19nZXRfcHJvcGVydHlfaW5kZXgoY2xpZW50LCBwc3ApOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXJldCA9IHNic19nZXRfYmF0dGVyeV9zdHJpbmdfcHJvcGVydHkoY2xpZW50LCByZXQsIHBzcCwKKwkJCQkJCSAgICAgIG1vZGVsX25hbWUpOworCQl2YWwtPnN0cnZhbCA9IG1vZGVsX25hbWU7CisJCWJyZWFrOworCisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVI6CisJCXJldCA9IHNic19nZXRfcHJvcGVydHlfaW5kZXgoY2xpZW50LCBwc3ApOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCisJCXJldCA9IHNic19nZXRfYmF0dGVyeV9zdHJpbmdfcHJvcGVydHkoY2xpZW50LCByZXQsIHBzcCwKKwkJCQkJCSAgICAgIG1hbnVmYWN0dXJlcik7CisJCXZhbC0+c3RydmFsID0gbWFudWZhY3R1cmVyOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIiVzOiBJTlZBTElEIHByb3BlcnR5XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghY2hpcC0+ZW5hYmxlX2RldGVjdGlvbikKKwkJZ290byBkb25lOworCisJaWYgKCFjaGlwLT5ncGlvX2RldGVjdCAmJgorCQljaGlwLT5pc19wcmVzZW50ICE9IChyZXQgPj0gMCkpIHsKKwkJY2hpcC0+aXNfcHJlc2VudCA9IChyZXQgPj0gMCk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoaXAtPnBvd2VyX3N1cHBseSk7CisJfQorCitkb25lOgorCWlmICghcmV0KSB7CisJCS8qIENvbnZlcnQgdW5pdHMgdG8gbWF0Y2ggcmVxdWlyZW1lbnRzIGZvciBwb3dlciBzdXBwbHkgY2xhc3MgKi8KKwkJc2JzX3VuaXRfYWRqdXN0bWVudChjbGllbnQsIHBzcCwgdmFsKTsKKwl9CisKKwlkZXZfZGJnKCZjbGllbnQtPmRldiwKKwkJIiVzOiBwcm9wZXJ0eSA9ICVkLCB2YWx1ZSA9ICV4XG4iLCBfX2Z1bmNfXywgcHNwLCB2YWwtPmludHZhbCk7CisKKwlpZiAocmV0ICYmIGNoaXAtPmlzX3ByZXNlbnQpCisJCXJldHVybiByZXQ7CisKKwkvKiBiYXR0ZXJ5IG5vdCBwcmVzZW50LCBzbyByZXR1cm4gTk9EQVRBIGZvciBwcm9wZXJ0aWVzICovCisJaWYgKHJldCkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzYnNfaXJxKGludCBpcnEsIHZvaWQgKmRldmlkKQoreworCXN0cnVjdCBzYnNfaW5mbyAqY2hpcCA9IGRldmlkOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRlcnkgPSBjaGlwLT5wb3dlcl9zdXBwbHk7CisJaW50IHJldDsKKworCXJldCA9IGdwaW9kX2dldF92YWx1ZV9jYW5zbGVlcChjaGlwLT5ncGlvX2RldGVjdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJY2hpcC0+aXNfcHJlc2VudCA9IHJldDsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChiYXR0ZXJ5KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgc2JzX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQoreworCXN0cnVjdCBzYnNfaW5mbyAqY2hpcCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJaWYgKGNoaXAtPmlnbm9yZV9jaGFuZ2VzID4gMCkgeworCQljaGlwLT5pZ25vcmVfY2hhbmdlcy0tOworCQlyZXR1cm47CisJfQorCisJLyogY2FuY2VsIG91dHN0YW5kaW5nIHdvcmsgKi8KKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNoaXAtPndvcmspOworCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjaGlwLT53b3JrLCBIWik7CisJY2hpcC0+cG9sbF90aW1lID0gY2hpcC0+cG9sbF9yZXRyeV9jb3VudDsKK30KKworc3RhdGljIHZvaWQgc2JzX2RlbGF5ZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNic19pbmZvICpjaGlwOworCXMzMiByZXQ7CisKKwljaGlwID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzYnNfaW5mbywgd29yay53b3JrKTsKKworCXJldCA9IHNic19yZWFkX3dvcmRfZGF0YShjaGlwLT5jbGllbnQsIHNic19kYXRhW1JFR19TVEFUVVNdLmFkZHIpOworCS8qIGlmIHRoZSByZWFkIGZhaWxlZCwgZ2l2ZSB1cCBvbiB0aGlzIHdvcmsgKi8KKwlpZiAocmV0IDwgMCkgeworCQljaGlwLT5wb2xsX3RpbWUgPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKHJldCAmIEJBVFRFUllfRlVMTF9DSEFSR0VEKQorCQlyZXQgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisJZWxzZSBpZiAocmV0ICYgQkFUVEVSWV9ESVNDSEFSR0lORykKKwkJcmV0ID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwllbHNlCisJCXJldCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisKKwlpZiAoY2hpcC0+bGFzdF9zdGF0ZSAhPSByZXQpIHsKKwkJY2hpcC0+cG9sbF90aW1lID0gMDsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hpcC0+cG93ZXJfc3VwcGx5KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoY2hpcC0+cG9sbF90aW1lID4gMCkgeworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNoaXAtPndvcmssIEhaKTsKKwkJY2hpcC0+cG9sbF90aW1lLS07CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2Mgc2JzX2RlZmF1bHRfZGVzYyA9IHsKKwkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCisJLnByb3BlcnRpZXMgPSBzYnNfcHJvcGVydGllcywKKwkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHNic19wcm9wZXJ0aWVzKSwKKwkuZ2V0X3Byb3BlcnR5ID0gc2JzX2dldF9wcm9wZXJ0eSwKKwkuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9IHNic19leHRlcm5hbF9wb3dlcl9jaGFuZ2VkLAorfTsKKworc3RhdGljIGludCBzYnNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHNic19pbmZvICpjaGlwOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqc2JzX2Rlc2M7CisJc3RydWN0IHNic19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OworCWludCByYzsKKwlpbnQgaXJxOworCisJc2JzX2Rlc2MgPSBkZXZtX2ttZW1kdXAoJmNsaWVudC0+ZGV2LCAmc2JzX2RlZmF1bHRfZGVzYywKKwkJCXNpemVvZigqc2JzX2Rlc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNic19kZXNjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNic19kZXNjLT5uYW1lID0gZGV2bV9rYXNwcmludGYoJmNsaWVudC0+ZGV2LCBHRlBfS0VSTkVMLCAic2JzLSVzIiwKKwkJCWRldl9uYW1lKCZjbGllbnQtPmRldikpOworCWlmICghc2JzX2Rlc2MtPm5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCisJY2hpcCA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc2JzX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoaXApCisJCXJldHVybiAtRU5PTUVNOworCisJY2hpcC0+Y2xpZW50ID0gY2xpZW50OworCWNoaXAtPmVuYWJsZV9kZXRlY3Rpb24gPSBmYWxzZTsKKwlwc3lfY2ZnLm9mX25vZGUgPSBjbGllbnQtPmRldi5vZl9ub2RlOworCXBzeV9jZmcuZHJ2X2RhdGEgPSBjaGlwOworCS8qIGlnbm9yZSBmaXJzdCBub3RpZmljYXRpb24gb2YgZXh0ZXJuYWwgY2hhbmdlLCBpdCBpcyBnZW5lcmF0ZWQKKwkgKiBmcm9tIHRoZSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIgY2FsbCBiYWNrCisJICovCisJY2hpcC0+aWdub3JlX2NoYW5nZXMgPSAxOworCWNoaXAtPmxhc3Rfc3RhdGUgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CisKKwkvKiB1c2UgcGRhdGEgaWYgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gRFQgcHJvcGVydGllcywKKwkgKiBvciBoYXJkY29kZWQgZGVmYXVsdHMgaWYgbm90CisJICovCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihjbGllbnQtPmRldi5vZl9ub2RlLCAic2JzLGkyYy1yZXRyeS1jb3VudCIsCisJCQkJICAmY2hpcC0+aTJjX3JldHJ5X2NvdW50KTsKKwlpZiAocmMpCisJCWNoaXAtPmkyY19yZXRyeV9jb3VudCA9IDA7CisKKwlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGNsaWVudC0+ZGV2Lm9mX25vZGUsICJzYnMscG9sbC1yZXRyeS1jb3VudCIsCisJCQkJICAmY2hpcC0+cG9sbF9yZXRyeV9jb3VudCk7CisJaWYgKHJjKQorCQljaGlwLT5wb2xsX3JldHJ5X2NvdW50ID0gMDsKKworCWlmIChwZGF0YSkgeworCQljaGlwLT5wb2xsX3JldHJ5X2NvdW50ID0gcGRhdGEtPnBvbGxfcmV0cnlfY291bnQ7CisJCWNoaXAtPmkyY19yZXRyeV9jb3VudCAgPSBwZGF0YS0+aTJjX3JldHJ5X2NvdW50OworCX0KKwljaGlwLT5pMmNfcmV0cnlfY291bnQgPSBjaGlwLT5pMmNfcmV0cnlfY291bnQgKyAxOworCisJY2hpcC0+Z3Bpb19kZXRlY3QgPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbCgmY2xpZW50LT5kZXYsCisJCQkic2JzLGJhdHRlcnktZGV0ZWN0IiwgR1BJT0RfSU4pOworCWlmIChJU19FUlIoY2hpcC0+Z3Bpb19kZXRlY3QpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGdldCBncGlvOiAlbGRcbiIsCisJCQlQVFJfRVJSKGNoaXAtPmdwaW9fZGV0ZWN0KSk7CisJCXJldHVybiBQVFJfRVJSKGNoaXAtPmdwaW9fZGV0ZWN0KTsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGlwKTsKKworCWlmICghY2hpcC0+Z3Bpb19kZXRlY3QpCisJCWdvdG8gc2tpcF9ncGlvOworCisJaXJxID0gZ3Bpb2RfdG9faXJxKGNoaXAtPmdwaW9fZGV0ZWN0KTsKKwlpZiAoaXJxIDw9IDApIHsKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGdldCBncGlvIGFzIGlycTogJWRcbiIsIGlycSk7CisJCWdvdG8gc2tpcF9ncGlvOworCX0KKworCXJjID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmY2xpZW50LT5kZXYsIGlycSwgTlVMTCwgc2JzX2lycSwKKwkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQlkZXZfbmFtZSgmY2xpZW50LT5kZXYpLCBjaGlwKTsKKwlpZiAocmMpIHsKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgcmMpOworCQlnb3RvIHNraXBfZ3BpbzsKKwl9CisKK3NraXBfZ3BpbzoKKwkvKgorCSAqIEJlZm9yZSB3ZSByZWdpc3Rlciwgd2UgbWlnaHQgbmVlZCB0byBtYWtlIHN1cmUgd2UgY2FuIGFjdHVhbGx5IHRhbGsKKwkgKiB0byB0aGUgYmF0dGVyeS4KKwkgKi8KKwlpZiAoIShmb3JjZV9sb2FkIHx8IGNoaXAtPmdwaW9fZGV0ZWN0KSkgeworCQlyYyA9IHNic19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHNic19kYXRhW1JFR19TVEFUVVNdLmFkZHIpOworCisJCWlmIChyYyA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IEZhaWxlZCB0byBnZXQgZGV2aWNlIHN0YXR1c1xuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCQlnb3RvIGV4aXRfcHN1cHBseTsKKwkJfQorCX0KKworCWNoaXAtPnBvd2VyX3N1cHBseSA9IGRldm1fcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgc2JzX2Rlc2MsCisJCQkJCQkgICAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihjaGlwLT5wb3dlcl9zdXBwbHkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgcG93ZXIgc3VwcGx5XG4iLCBfX2Z1bmNfXyk7CisJCXJjID0gUFRSX0VSUihjaGlwLT5wb3dlcl9zdXBwbHkpOworCQlnb3RvIGV4aXRfcHN1cHBseTsKKwl9CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsCisJCSIlczogYmF0dGVyeSBnYXMgZ2F1Z2UgZGV2aWNlIHJlZ2lzdGVyZWRcbiIsIGNsaWVudC0+bmFtZSk7CisKKwlJTklUX0RFTEFZRURfV09SSygmY2hpcC0+d29yaywgc2JzX2RlbGF5ZWRfd29yayk7CisKKwljaGlwLT5lbmFibGVfZGV0ZWN0aW9uID0gdHJ1ZTsKKworCXJldHVybiAwOworCitleGl0X3BzdXBwbHk6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHNic19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2hpcC0+d29yayk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIGRlZmluZWQgQ09ORklHX1BNX1NMRUVQCisKK3N0YXRpYyBpbnQgc2JzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNic19pbmZvICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpZiAoY2hpcC0+cG9sbF90aW1lID4gMCkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjaGlwLT53b3JrKTsKKworCS8qCisJICogV3JpdGUgdG8gbWFudWZhY3R1cmVyIGFjY2VzcyB3aXRoIHNsZWVwIGNvbW1hbmQuCisJICogU3VwcG9ydCBpcyBtYW51ZmFjdHVyZXIgZGVwZW5kZW5kLCBzbyBpZ25vcmUgZXJyb3JzLgorCSAqLworCXNic193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBzYnNfZGF0YVtSRUdfTUFOVUZBQ1RVUkVSX0RBVEFdLmFkZHIsCisJCU1BTlVGQUNUVVJFUl9BQ0NFU1NfU0xFRVApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhzYnNfcG1fb3BzLCBzYnNfc3VzcGVuZCwgTlVMTCk7CisjZGVmaW5lIFNCU19QTV9PUFMgKCZzYnNfcG1fb3BzKQorCisjZWxzZQorI2RlZmluZSBTQlNfUE1fT1BTIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc2JzX2lkW10gPSB7CisJeyAiYnEyMHo3NSIsIDAgfSwKKwl7ICJzYnMtYmF0dGVyeSIsIDEgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzYnNfaWQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzYnNfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzYnMsc2JzLWJhdHRlcnkiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJ0aSxicTIwejc1IiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNic19kdF9pZHMpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgc2JzX2JhdHRlcnlfZHJpdmVyID0geworCS5wcm9iZQkJPSBzYnNfcHJvYmUsCisJLnJlbW92ZQkJPSBzYnNfcmVtb3ZlLAorCS5pZF90YWJsZQk9IHNic19pZCwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJzYnMtYmF0dGVyeSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHNic19kdF9pZHMsCisJCS5wbQk9IFNCU19QTV9PUFMsCisJfSwKK307Cittb2R1bGVfaTJjX2RyaXZlcihzYnNfYmF0dGVyeV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNCUyBiYXR0ZXJ5IG1vbml0b3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShmb3JjZV9sb2FkLCBib29sLCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9sb2FkLAorCQkgIkF0dGVtcHQgdG8gbG9hZCB0aGUgZHJpdmVyIGV2ZW4gaWYgbm8gYmF0dGVyeSBpcyBjb25uZWN0ZWQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc21iMzQ3LWNoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3NtYjM0Ny1jaGFyZ2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvc21iMzQ3LWNoYXJnZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvc21iMzQ3LWNoYXJnZXIuYwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci90ZXN0X3Bvd2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS90ZXN0X3Bvd2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvdGVzdF9wb3dlci5jCnJlbmFtZSB0byBkcml2ZXJzL3Bvd2VyL3N1cHBseS90ZXN0X3Bvd2VyLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvdG9zYV9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS90b3NhX2JhdHRlcnkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9wb3dlci90b3NhX2JhdHRlcnkuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvdG9zYV9iYXR0ZXJ5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvdHBzNjUwOTAtY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvdHBzNjUwOTAtY2hhcmdlci5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3RwczY1MDkwLWNoYXJnZXIuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvdHBzNjUwOTAtY2hhcmdlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS90cHM2NTIxN19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS90cHM2NTIxN19jaGFyZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkMDE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3RwczY1MjE3X2NoYXJnZXIuYwpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIEJhdHRlcnkgY2hhcmdlciBkcml2ZXIgZm9yIFRJJ3MgdHBzNjUyMTcKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIENvbGxhYm9yYSBMdGQuCisKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvKgorICogQmF0dGVyeSBjaGFyZ2VyIGRyaXZlciBmb3IgVEkncyB0cHM2NTIxNworICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKworI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3RwczY1MjE3Lmg+CisKKyNkZWZpbmUgUE9MTF9JTlRFUlZBTAkJKEhaICogMikKKworc3RydWN0IHRwczY1MjE3X2NoYXJnZXIgeworCXN0cnVjdCB0cHM2NTIxNyAqdHBzOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICphYzsKKworCWludAlhY19vbmxpbmU7CisJaW50CXByZXZfYWNfb25saW5lOworCisJc3RydWN0IHRhc2tfc3RydWN0CSpwb2xsX3Rhc2s7CisKKwlpbnQJaXJxOworfTsKKworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHRwczY1MjE3X2FjX3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorfTsKKworc3RhdGljIGludCB0cHM2NTIxN19jb25maWdfY2hhcmdlcihzdHJ1Y3QgdHBzNjUyMTdfY2hhcmdlciAqY2hhcmdlcikKK3sKKwlpbnQgcmV0OworCisJZGV2X2RiZyhjaGFyZ2VyLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJLyoKKwkgKiB0cHM2NTIxNyByZXYuIEcsIHAuIDMxIChzZWUgcC4gMzIgZm9yIE5UQyBzY2hlbWF0aWMpCisJICoKKwkgKiBUaGUgZGV2aWNlIGNhbiBiZSBjb25maWd1cmVkIHRvIHN1cHBvcnQgYSAxMDBrIE5UQyAoQiA9IDM5NjApIGJ5CisJICogc2V0dGluZyB0aGUgdGhlIE5UQ19UWVBFIGJpdCBpbiByZWdpc3RlciBDSEdDT05GSUcxIHRvIDEuIEhvd2V2ZXIgaXQKKwkgKiBpcyBub3QgcmVjb21tZW5kZWQgdG8gZG8gc28uIEluIHNsZWVwIG1vZGUsIHRoZSBjaGFyZ2VyIGNvbnRpbnVlcworCSAqIGNoYXJnaW5nIHRoZSBiYXR0ZXJ5LCBidXQgYWxsIHJlZ2lzdGVyIHZhbHVlcyBhcmUgcmVzZXQgdG8gZGVmYXVsdAorCSAqIHZhbHVlcy4gVGhlcmVmb3JlLCB0aGUgY2hhcmdlciB3b3VsZCBnZXQgdGhlIHdyb25nIHRlbXBlcmF0dXJlCisJICogaW5mb3JtYXRpb24uIElmIDEwMGsgTlRDIHNldHRpbmcgaXMgcmVxdWlyZWQsIHBsZWFzZSBjb250YWN0IHRoZQorCSAqIGZhY3RvcnkuCisJICoKKwkgKiBBVFRFTlRJT04sIGNvbmZsaWN0aW5nIGluZm9ybWF0aW9uLCBmcm9tIHAuIDQ2CisJICoKKwkgKiBOVEMgVFlQRSAoZm9yIGJhdHRlcnkgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQpCisJICogICAwIOKAkyAxMDBrIChjdXJ2ZSAxLCBCID0gMzk2MCkKKwkgKiAgIDEg4oCTIDEwayAgKGN1cnZlIDIsIEIgPSAzNDgwKSAoZGVmYXVsdCBvbiByZXNldCkKKwkgKgorCSAqLworCXJldCA9IHRwczY1MjE3X2NsZWFyX2JpdHMoY2hhcmdlci0+dHBzLCBUUFM2NTIxN19SRUdfQ0hHQ09ORklHMSwKKwkJCQkgIFRQUzY1MjE3X0NIR0NPTkZJRzFfTlRDX1RZUEUsCisJCQkJICBUUFM2NTIxN19QUk9URUNUX05PTkUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjaGFyZ2VyLT5kZXYsCisJCQkiZmFpbGVkIHRvIHNldCAxMDBrIE5UQyBzZXR0aW5nOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cHM2NTIxN19lbmFibGVfY2hhcmdpbmcoc3RydWN0IHRwczY1MjE3X2NoYXJnZXIgKmNoYXJnZXIpCit7CisJaW50IHJldDsKKworCS8qIGNoYXJnZXIgYWxyZWFkeSBlbmFibGVkICovCisJaWYgKGNoYXJnZXItPmFjX29ubGluZSkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGNoYXJnZXItPmRldiwgIiVzOiBlbmFibGUgY2hhcmdpbmdcbiIsIF9fZnVuY19fKTsKKwlyZXQgPSB0cHM2NTIxN19zZXRfYml0cyhjaGFyZ2VyLT50cHMsIFRQUzY1MjE3X1JFR19DSEdDT05GSUcxLAorCQkJCVRQUzY1MjE3X0NIR0NPTkZJRzFfQ0hHX0VOLAorCQkJCVRQUzY1MjE3X0NIR0NPTkZJRzFfQ0hHX0VOLAorCQkJCVRQUzY1MjE3X1BST1RFQ1RfTk9ORSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNoYXJnZXItPmRldiwKKwkJCSIlczogRXJyb3IgaW4gd3JpdGluZyBDSEdfRU4gaW4gcmVnIDB4JXg6ICVkXG4iLAorCQkJX19mdW5jX18sIFRQUzY1MjE3X1JFR19DSEdDT05GSUcxLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNoYXJnZXItPmFjX29ubGluZSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cHM2NTIxN19hY19nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgdHBzNjUyMTdfY2hhcmdlciAqY2hhcmdlciA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJaWYgKHBzcCA9PSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUpIHsKKwkJdmFsLT5pbnR2YWwgPSBjaGFyZ2VyLT5hY19vbmxpbmU7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlycXJldHVybl90IHRwczY1MjE3X2NoYXJnZXJfaXJxKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlpbnQgcmV0LCB2YWw7CisJc3RydWN0IHRwczY1MjE3X2NoYXJnZXIgKmNoYXJnZXIgPSBkZXY7CisKKwljaGFyZ2VyLT5wcmV2X2FjX29ubGluZSA9IGNoYXJnZXItPmFjX29ubGluZTsKKworCXJldCA9IHRwczY1MjE3X3JlZ19yZWFkKGNoYXJnZXItPnRwcywgVFBTNjUyMTdfUkVHX1NUQVRVUywgJnZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihjaGFyZ2VyLT5kZXYsICIlczogRXJyb3IgaW4gcmVhZGluZyByZWcgMHgleFxuIiwKKwkJCV9fZnVuY19fLCBUUFM2NTIxN19SRUdfU1RBVFVTKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWRldl9kYmcoY2hhcmdlci0+ZGV2LCAiJXM6IDB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOworCisJLyogY2hlY2sgZm9yIEFDIHN0YXR1cyBiaXQgKi8KKwlpZiAodmFsICYgVFBTNjUyMTdfU1RBVFVTX0FDUFdSKSB7CisJCXJldCA9IHRwczY1MjE3X2VuYWJsZV9jaGFyZ2luZyhjaGFyZ2VyKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihjaGFyZ2VyLT5kZXYsCisJCQkJImZhaWxlZCB0byBlbmFibGUgY2hhcmdlcjogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCX0KKwl9IGVsc2UgeworCQljaGFyZ2VyLT5hY19vbmxpbmUgPSAwOworCX0KKworCWlmIChjaGFyZ2VyLT5wcmV2X2FjX29ubGluZSAhPSBjaGFyZ2VyLT5hY19vbmxpbmUpCisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoYXJnZXItPmFjKTsKKworCXJldCA9IHRwczY1MjE3X3JlZ19yZWFkKGNoYXJnZXItPnRwcywgVFBTNjUyMTdfUkVHX0NIR0NPTkZJRzAsICZ2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY2hhcmdlci0+ZGV2LCAiJXM6IEVycm9yIGluIHJlYWRpbmcgcmVnIDB4JXhcbiIsCisJCQlfX2Z1bmNfXywgVFBTNjUyMTdfUkVHX0NIR0NPTkZJRzApOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKHZhbCAmIFRQUzY1MjE3X0NIR0NPTkZJRzBfQUNUSVZFKQorCQlkZXZfZGJnKGNoYXJnZXItPmRldiwgIiVzOiBjaGFyZ2VyIGlzIGNoYXJnaW5nXG4iLCBfX2Z1bmNfXyk7CisJZWxzZQorCQlkZXZfZGJnKGNoYXJnZXItPmRldiwKKwkJCSIlczogY2hhcmdlciBpcyBOT1QgY2hhcmdpbmdcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB0cHM2NTIxN19jaGFyZ2VyX3BvbGxfdGFzayh2b2lkICpkYXRhKQoreworCXNldF9mcmVlemFibGUoKTsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShQT0xMX0lOVEVSVkFMKTsKKwkJdHJ5X3RvX2ZyZWV6ZSgpOworCQl0cHM2NTIxN19jaGFyZ2VyX2lycSgtMSwgZGF0YSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHRwczY1MjE3X2NoYXJnZXJfZGVzYyA9IHsKKwkubmFtZQkJCT0gInRwczY1MjE3LWFjIiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCisJLmdldF9wcm9wZXJ0eQkJPSB0cHM2NTIxN19hY19nZXRfcHJvcGVydHksCisJLnByb3BlcnRpZXMJCT0gdHBzNjUyMTdfYWNfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUodHBzNjUyMTdfYWNfcHJvcHMpLAorfTsKKworc3RhdGljIGludCB0cHM2NTIxN19jaGFyZ2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRwczY1MjE3ICp0cHMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHRwczY1MjE3X2NoYXJnZXIgKmNoYXJnZXI7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgY2ZnID0ge307CisJaW50IGlycTsKKwlpbnQgcmV0OworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWNoYXJnZXIgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjaGFyZ2VyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFyZ2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNoYXJnZXIpOworCWNoYXJnZXItPnRwcyA9IHRwczsKKwljaGFyZ2VyLT5kZXYgPSAmcGRldi0+ZGV2OworCisJY2ZnLm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwljZmcuZHJ2X2RhdGEgPSBjaGFyZ2VyOworCisJY2hhcmdlci0+YWMgPSBkZXZtX3Bvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAorCQkJCQkJICZ0cHM2NTIxN19jaGFyZ2VyX2Rlc2MsCisJCQkJCQkgJmNmZyk7CisJaWYgKElTX0VSUihjaGFyZ2VyLT5hYykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXJcbiIpOworCQlyZXR1cm4gUFRSX0VSUihjaGFyZ2VyLT5hYyk7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIkFDIik7CisJaWYgKGlycSA8IDApCisJCWlycSA9IC1FTlhJTzsKKwljaGFyZ2VyLT5pcnEgPSBpcnE7CisKKwlyZXQgPSB0cHM2NTIxN19jb25maWdfY2hhcmdlcihjaGFyZ2VyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNoYXJnZXItPmRldiwgImNoYXJnZXIgY29uZmlnIGZhaWxlZCwgZXJyICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChpcnEgIT0gLUVOWElPKSB7CisJCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwgaXJxLCBOVUxMLAorCQkJCQkJdHBzNjUyMTdfY2hhcmdlcl9pcnEsCisJCQkJCQkwLCAidHBzNjUyMTctY2hhcmdlciIsCisJCQkJCQljaGFyZ2VyKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihjaGFyZ2VyLT5kZXYsCisJCQkJIlVuYWJsZSB0byByZWdpc3RlciBpcnEgJWQgZXJyICVkXG4iLCBpcnEsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQkvKiBDaGVjayBjdXJyZW50IHN0YXRlICovCisJCXRwczY1MjE3X2NoYXJnZXJfaXJxKGlycSwgY2hhcmdlcik7CisJfSBlbHNlIHsKKwkJY2hhcmdlci0+cG9sbF90YXNrID0ga3RocmVhZF9ydW4odHBzNjUyMTdfY2hhcmdlcl9wb2xsX3Rhc2ssCisJCQkJCQljaGFyZ2VyLCAia3RwczY1MjE3Y2hhcmdlciIpOworCQlpZiAoSVNfRVJSKGNoYXJnZXItPnBvbGxfdGFzaykpIHsKKwkJCXJldCA9IFBUUl9FUlIoY2hhcmdlci0+cG9sbF90YXNrKTsKKwkJCWRldl9lcnIoY2hhcmdlci0+ZGV2LAorCQkJCSJVbmFibGUgdG8gcnVuIGt0aHJlYWQgZXJyICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRwczY1MjE3X2NoYXJnZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRwczY1MjE3X2NoYXJnZXIgKmNoYXJnZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChjaGFyZ2VyLT5pcnEgPT0gLUVOWElPKQorCQlrdGhyZWFkX3N0b3AoY2hhcmdlci0+cG9sbF90YXNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0cHM2NTIxN19jaGFyZ2VyX21hdGNoX3RhYmxlW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ0aSx0cHM2NTIxNy1jaGFyZ2VyIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0cHM2NTIxN19jaGFyZ2VyX21hdGNoX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHBzNjUyMTdfY2hhcmdlcl9kcml2ZXIgPSB7CisJLnByb2JlCT0gdHBzNjUyMTdfY2hhcmdlcl9wcm9iZSwKKwkucmVtb3ZlID0gdHBzNjUyMTdfY2hhcmdlcl9yZW1vdmUsCisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAidHBzNjUyMTctY2hhcmdlciIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cih0cHM2NTIxN19jaGFyZ2VyX21hdGNoX3RhYmxlKSwKKwl9LAorCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0cHM2NTIxN19jaGFyZ2VyX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIkVucmljIEJhbGxldGJvIFNlcnJhIDxlbnJpYy5iYWxsZXRib0Bjb2xsYWJvcmEuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUUFM2NTIxNyBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3R3bDQwMzBfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvdHdsNDAzMF9jaGFyZ2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvdHdsNDAzMF9jaGFyZ2VyLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3R3bDQwMzBfY2hhcmdlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3R3bDQwMzBfbWFkY19iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS90d2w0MDMwX21hZGNfYmF0dGVyeS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3R3bDQwMzBfbWFkY19iYXR0ZXJ5LmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3R3bDQwMzBfbWFkY19iYXR0ZXJ5LmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvd204MzF4X2JhY2t1cC5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvd204MzF4X2JhY2t1cC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3Bvd2VyL3dtODMxeF9iYWNrdXAuYwpyZW5hbWUgdG8gZHJpdmVycy9wb3dlci9zdXBwbHkvd204MzF4X2JhY2t1cC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3dtODMxeF9wb3dlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvd204MzF4X3Bvd2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvd204MzF4X3Bvd2VyLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3dtODMxeF9wb3dlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3dtODM1MF9wb3dlci5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvd204MzUwX3Bvd2VyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvcG93ZXIvd204MzUwX3Bvd2VyLmMKcmVuYW1lIHRvIGRyaXZlcnMvcG93ZXIvc3VwcGx5L3dtODM1MF9wb3dlci5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS93bTk3eHhfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvd205N3h4X2JhdHRlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mjg1NjI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9zdXBwbHkvd205N3h4X2JhdHRlcnkuYwpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIEJhdHRlcnkgbWVhc3VyZW1lbnQgY29kZSBmb3IgV005N3h4CisgKgorICogYmFzZWQgb24gdG9zYV9iYXR0ZXJ5LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWFyZWsgVmFzdXQgPG1hcmVrLnZhc3V0QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L3dtOTd4eC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBiYXRfd29yazsKK3N0YXRpYyBERUZJTkVfTVVURVgod29ya19sb2NrKTsKK3N0YXRpYyBpbnQgYmF0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSAqcHJvcDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd205N3h4X3JlYWRfYmF0KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKK3sKKwlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBiYXRfcHMtPmRldi5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YSA9IHdtZGF0YS0+YmF0dF9wZGF0YTsKKworCXJldHVybiB3bTk3eHhfcmVhZF9hdXhfYWRjKGRldl9nZXRfZHJ2ZGF0YShiYXRfcHMtPmRldi5wYXJlbnQpLAorCQkJCQlwZGF0YS0+YmF0dF9hdXgpICogcGRhdGEtPmJhdHRfbXVsdCAvCisJCQkJCXBkYXRhLT5iYXR0X2RpdjsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgd205N3h4X3JlYWRfdGVtcChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHMpCit7CisJc3RydWN0IHdtOTd4eF9wZGF0YSAqd21kYXRhID0gYmF0X3BzLT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSAqcGRhdGEgPSB3bWRhdGEtPmJhdHRfcGRhdGE7CisKKwlyZXR1cm4gd205N3h4X3JlYWRfYXV4X2FkYyhkZXZfZ2V0X2RydmRhdGEoYmF0X3BzLT5kZXYucGFyZW50KSwKKwkJCQkJcGRhdGEtPnRlbXBfYXV4KSAqIHBkYXRhLT50ZW1wX211bHQgLworCQkJCQlwZGF0YS0+dGVtcF9kaXY7Cit9CisKK3N0YXRpYyBpbnQgd205N3h4X2JhdF9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzLAorCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGJhdF9wcy0+ZGV2LnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgd205N3h4X2JhdHRfcGRhdGEgKnBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJdmFsLT5pbnR2YWwgPSBiYXRfc3RhdHVzOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6CisJCXZhbC0+aW50dmFsID0gcGRhdGEtPmJhdHRfdGVjaDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKKwkJaWYgKHBkYXRhLT5iYXR0X2F1eCA+PSAwKQorCQkJdmFsLT5pbnR2YWwgPSB3bTk3eHhfcmVhZF9iYXQoYmF0X3BzKTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKKwkJaWYgKHBkYXRhLT50ZW1wX2F1eCA+PSAwKQorCQkJdmFsLT5pbnR2YWwgPSB3bTk3eHhfcmVhZF90ZW1wKGJhdF9wcyk7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOgorCQlpZiAocGRhdGEtPm1heF92b2x0YWdlID49IDApCisJCQl2YWwtPmludHZhbCA9IHBkYXRhLT5tYXhfdm9sdGFnZTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU46CisJCWlmIChwZGF0YS0+bWluX3ZvbHRhZ2UgPj0gMCkKKwkJCXZhbC0+aW50dmFsID0gcGRhdGEtPm1pbl92b2x0YWdlOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCQl2YWwtPmludHZhbCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd205N3h4X2JhdF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKK3sKKwlzY2hlZHVsZV93b3JrKCZiYXRfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIHdtOTd4eF9iYXRfdXBkYXRlKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKK3sKKwlpbnQgb2xkX3N0YXR1cyA9IGJhdF9zdGF0dXM7CisJc3RydWN0IHdtOTd4eF9wZGF0YSAqd21kYXRhID0gYmF0X3BzLT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSAqcGRhdGEgPSB3bWRhdGEtPmJhdHRfcGRhdGE7CisKKwltdXRleF9sb2NrKCZ3b3JrX2xvY2spOworCisJYmF0X3N0YXR1cyA9IChwZGF0YS0+Y2hhcmdlX2dwaW8gPj0gMCkgPworCQkJKGdwaW9fZ2V0X3ZhbHVlKHBkYXRhLT5jaGFyZ2VfZ3BpbykgPworCQkJUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORyA6CisJCQlQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HKSA6CisJCQlQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CisKKwlpZiAob2xkX3N0YXR1cyAhPSBiYXRfc3RhdHVzKSB7CisJCXByX2RlYnVnKCIlczogJWkgLT4gJWlcbiIsIGJhdF9wcy0+ZGVzYy0+bmFtZSwgb2xkX3N0YXR1cywKKwkJCQkJYmF0X3N0YXR1cyk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGJhdF9wcyk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ3b3JrX2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzeTsKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYmF0X3BzeV9kZXNjID0geworCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5nZXRfcHJvcGVydHkJCT0gd205N3h4X2JhdF9nZXRfcHJvcGVydHksCisJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSB3bTk3eHhfYmF0X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQsCisJLnVzZV9mb3JfYXBtCQk9IDEsCit9OworCitzdGF0aWMgdm9pZCB3bTk3eHhfYmF0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXdtOTd4eF9iYXRfdXBkYXRlKGJhdF9wc3kpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd205N3h4X2NocmdfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc2NoZWR1bGVfd29yaygmYmF0X3dvcmspOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB3bTk3eHhfYmF0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWZsdXNoX3dvcmsoJmJhdF93b3JrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3bTk3eHhfYmF0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc2NoZWR1bGVfd29yaygmYmF0X3dvcmspOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgd205N3h4X2JhdF9wbV9vcHMgPSB7CisJLnN1c3BlbmQJPSB3bTk3eHhfYmF0X3N1c3BlbmQsCisJLnJlc3VtZQkJPSB3bTk3eHhfYmF0X3Jlc3VtZSwKK307CisjZW5kaWYKKworc3RhdGljIGludCB3bTk3eHhfYmF0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcHJvcHMgPSAxOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UICovCisJaW50IGkgPSAwOworCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YTsKKworCWlmICghd21kYXRhKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YSBzdXBwbGllZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOworCisJaWYgKGRldi0+aWQgIT0gLTEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIk5vIHBsYXRmb3JtX2RhdGEgc3VwcGxpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+Y2hhcmdlX2dwaW8pKSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+Y2hhcmdlX2dwaW8sICJCQVRUIENIUkciKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyOworCQlyZXQgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChwZGF0YS0+Y2hhcmdlX2dwaW8pOworCQlpZiAocmV0KQorCQkJZ290byBlcnIyOworCQlyZXQgPSByZXF1ZXN0X2lycShncGlvX3RvX2lycShwZGF0YS0+Y2hhcmdlX2dwaW8pLAorCQkJCXdtOTd4eF9jaHJnX2lycSwgMCwKKwkJCQkiQUMgRGV0ZWN0IiwgZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyMjsKKwkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTICovCisJfQorCisJaWYgKHBkYXRhLT5iYXR0X3RlY2ggPj0gMCkKKwkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSAqLworCWlmIChwZGF0YS0+dGVtcF9hdXggPj0gMCkKKwkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVEVNUCAqLworCWlmIChwZGF0YS0+YmF0dF9hdXggPj0gMCkKKwkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1cgKi8KKwlpZiAocGRhdGEtPm1heF92b2x0YWdlID49IDApCisJCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYICovCisJaWYgKHBkYXRhLT5taW5fdm9sdGFnZSA+PSAwKQorCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTiAqLworCisJcHJvcCA9IGt6YWxsb2MocHJvcHMgKiBzaXplb2YoKnByb3ApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByb3ApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnIzOworCX0KKworCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ7CisJaWYgKHBkYXRhLT5jaGFyZ2VfZ3BpbyA+PSAwKQorCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM7CisJaWYgKHBkYXRhLT5iYXR0X3RlY2ggPj0gMCkKKwkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWTsKKwlpZiAocGRhdGEtPnRlbXBfYXV4ID49IDApCisJCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA7CisJaWYgKHBkYXRhLT5iYXR0X2F1eCA+PSAwKQorCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzsKKwlpZiAocGRhdGEtPm1heF92b2x0YWdlID49IDApCisJCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOworCWlmIChwZGF0YS0+bWluX3ZvbHRhZ2UgPj0gMCkKKwkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU47CisKKwlJTklUX1dPUksoJmJhdF93b3JrLCB3bTk3eHhfYmF0X3dvcmspOworCisJaWYgKCFwZGF0YS0+YmF0dF9uYW1lKSB7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIlBsZWFzZSBjb25zaWRlciBzZXR0aW5nIHByb3BlciBiYXR0ZXJ5ICIKKwkJCQkibmFtZSBpbiBwbGF0Zm9ybSBkZWZpbml0aW9uIGZpbGUsIGZhbGxpbmcgIgorCQkJCSJiYWNrIHRvIG5hbWUgXCJ3bTk3eHgtYmF0dFwiXG4iKTsKKwkJYmF0X3BzeV9kZXNjLm5hbWUgPSAid205N3h4LWJhdHQiOworCX0gZWxzZQorCQliYXRfcHN5X2Rlc2MubmFtZSA9IHBkYXRhLT5iYXR0X25hbWU7CisKKwliYXRfcHN5X2Rlc2MucHJvcGVydGllcyA9IHByb3A7CisJYmF0X3BzeV9kZXNjLm51bV9wcm9wZXJ0aWVzID0gcHJvcHM7CisKKwliYXRfcHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZkZXYtPmRldiwgJmJhdF9wc3lfZGVzYywgTlVMTCk7CisJaWYgKCFJU19FUlIoYmF0X3BzeSkpIHsKKwkJc2NoZWR1bGVfd29yaygmYmF0X3dvcmspOworCX0gZWxzZSB7CisJCXJldCA9IFBUUl9FUlIoYmF0X3BzeSk7CisJCWdvdG8gZXJyNDsKKwl9CisKKwlyZXR1cm4gMDsKK2VycjQ6CisJa2ZyZWUocHJvcCk7CitlcnIzOgorCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5jaGFyZ2VfZ3BpbykpCisJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5jaGFyZ2VfZ3BpbyksIGRldik7CitlcnIyOgorCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5jaGFyZ2VfZ3BpbykpCisJCWdwaW9fZnJlZShwZGF0YS0+Y2hhcmdlX2dwaW8pOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgd205N3h4X2JhdF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YSA9IHdtZGF0YS0+YmF0dF9wZGF0YTsKKworCWlmIChwZGF0YSAmJiBncGlvX2lzX3ZhbGlkKHBkYXRhLT5jaGFyZ2VfZ3BpbykpIHsKKwkJZnJlZV9pcnEoZ3Bpb190b19pcnEocGRhdGEtPmNoYXJnZV9ncGlvKSwgZGV2KTsKKwkJZ3Bpb19mcmVlKHBkYXRhLT5jaGFyZ2VfZ3Bpbyk7CisJfQorCWNhbmNlbF93b3JrX3N5bmMoJmJhdF93b3JrKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihiYXRfcHN5KTsKKwlrZnJlZShwcm9wKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgd205N3h4X2JhdF9kcml2ZXIgPSB7CisJLmRyaXZlcgk9IHsKKwkJLm5hbWUJPSAid205N3h4LWJhdHRlcnkiLAorI2lmZGVmIENPTkZJR19QTQorCQkucG0JPSAmd205N3h4X2JhdF9wbV9vcHMsCisjZW5kaWYKKwl9LAorCS5wcm9iZQkJPSB3bTk3eHhfYmF0X3Byb2JlLAorCS5yZW1vdmUJCT0gd205N3h4X2JhdF9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdtOTd4eF9iYXRfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWFyZWsgVmFzdXQgPG1hcmVrLnZhc3V0QGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiV005N3h4IGJhdHRlcnkgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3N1cHBseS96Ml9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3N1cHBseS96Ml9iYXR0ZXJ5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0M2I0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvc3VwcGx5L3oyX2JhdHRlcnkuYwpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIEJhdHRlcnkgbWVhc3VyZW1lbnQgY29kZSBmb3IgWmlwaXQgWjIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUGV0ZXIgRWR3YXJkcyA8c3dlZXRsaWxtcmVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3oyX2JhdHRlcnkuaD4KKworI2RlZmluZQlaMl9ERUZBVUxUX05BTUUJIloyIgorCitzdHJ1Y3QgejJfY2hhcmdlciB7CisJc3RydWN0IHoyX2JhdHRlcnlfaW5mbwkJKmluZm87CisJaW50CQkJCWJhdF9zdGF0dXM7CisJc3RydWN0IGkyY19jbGllbnQJCSpjbGllbnQ7CisJc3RydWN0IHBvd2VyX3N1cHBseQkJKmJhdHRfcHM7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjCWJhdHRfcHNfZGVzYzsKKwlzdHJ1Y3QgbXV0ZXgJCQl3b3JrX2xvY2s7CisJc3RydWN0IHdvcmtfc3RydWN0CQliYXRfd29yazsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHoyX3JlYWRfYmF0KHN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyKQoreworCWludCBkYXRhOworCWRhdGEgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2hhcmdlci0+Y2xpZW50LAorCQkJCQljaGFyZ2VyLT5pbmZvLT5iYXR0X0kyQ19yZWcpOworCWlmIChkYXRhIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZGF0YSAqIGNoYXJnZXItPmluZm8tPmJhdHRfbXVsdCAvIGNoYXJnZXItPmluZm8tPmJhdHRfZGl2OworfQorCitzdGF0aWMgaW50IHoyX2JhdHRfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRfcHMsCisJCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEoYmF0dF9wcyk7CisJc3RydWN0IHoyX2JhdHRlcnlfaW5mbyAqaW5mbyA9IGNoYXJnZXItPmluZm87CisKKwlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQl2YWwtPmludHZhbCA9IGNoYXJnZXItPmJhdF9zdGF0dXM7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKKwkJdmFsLT5pbnR2YWwgPSBpbmZvLT5iYXR0X3RlY2g7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCWlmIChpbmZvLT5iYXR0X0kyQ19yZWcgPj0gMCkKKwkJCXZhbC0+aW50dmFsID0gejJfcmVhZF9iYXQoY2hhcmdlcik7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOgorCQlpZiAoaW5mby0+bWF4X3ZvbHRhZ2UgPj0gMCkKKwkJCXZhbC0+aW50dmFsID0gaW5mby0+bWF4X3ZvbHRhZ2U7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOOgorCQlpZiAoaW5mby0+bWluX3ZvbHRhZ2UgPj0gMCkKKwkJCXZhbC0+aW50dmFsID0gaW5mby0+bWluX3ZvbHRhZ2U7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXZhbC0+aW50dmFsID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHoyX2JhdHRfZXh0X3Bvd2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dF9wcykKK3sKKwlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlciA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShiYXR0X3BzKTsKKworCXNjaGVkdWxlX3dvcmsoJmNoYXJnZXItPmJhdF93b3JrKTsKK30KKworc3RhdGljIHZvaWQgejJfYmF0dF91cGRhdGUoc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIpCit7CisJaW50IG9sZF9zdGF0dXMgPSBjaGFyZ2VyLT5iYXRfc3RhdHVzOworCXN0cnVjdCB6Ml9iYXR0ZXJ5X2luZm8gKmluZm87CisKKwlpbmZvID0gY2hhcmdlci0+aW5mbzsKKworCW11dGV4X2xvY2soJmNoYXJnZXItPndvcmtfbG9jayk7CisKKwljaGFyZ2VyLT5iYXRfc3RhdHVzID0gKGluZm8tPmNoYXJnZV9ncGlvID49IDApID8KKwkJKGdwaW9fZ2V0X3ZhbHVlKGluZm8tPmNoYXJnZV9ncGlvKSA/CisJCVBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkcgOgorCQlQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HKSA6CisJCVBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKworCWlmIChvbGRfc3RhdHVzICE9IGNoYXJnZXItPmJhdF9zdGF0dXMpIHsKKwkJcHJfZGVidWcoIiVzOiAlaSAtPiAlaVxuIiwgY2hhcmdlci0+YmF0dF9wcy0+ZGVzYy0+bmFtZSwKKwkJCQlvbGRfc3RhdHVzLAorCQkJCWNoYXJnZXItPmJhdF9zdGF0dXMpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChjaGFyZ2VyLT5iYXR0X3BzKTsKKwl9CisKKwltdXRleF91bmxvY2soJmNoYXJnZXItPndvcmtfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHoyX2JhdHRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXI7CisJY2hhcmdlciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgejJfY2hhcmdlciwgYmF0X3dvcmspOworCXoyX2JhdHRfdXBkYXRlKGNoYXJnZXIpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgejJfY2hhcmdlX3N3aXRjaF9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIgPSBkZXZpZDsKKwlzY2hlZHVsZV93b3JrKCZjaGFyZ2VyLT5iYXRfd29yayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHoyX2JhdHRfcHNfaW5pdChzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlciwgaW50IHByb3BzKQoreworCWludCBpID0gMDsKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvICppbmZvID0gY2hhcmdlci0+aW5mbzsKKworCWlmIChpbmZvLT5jaGFyZ2VfZ3BpbyA+PSAwKQorCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMgKi8KKwlpZiAoaW5mby0+YmF0dF90ZWNoID49IDApCisJCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1kgKi8KKwlpZiAoaW5mby0+YmF0dF9JMkNfcmVnID49IDApCisJCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XICovCisJaWYgKGluZm8tPm1heF92b2x0YWdlID49IDApCisJCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYICovCisJaWYgKGluZm8tPm1pbl92b2x0YWdlID49IDApCisJCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOICovCisKKwlwcm9wID0ga3phbGxvYyhwcm9wcyAqIHNpemVvZigqcHJvcCksIEdGUF9LRVJORUwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOworCWlmIChpbmZvLT5jaGFyZ2VfZ3BpbyA+PSAwKQorCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM7CisJaWYgKGluZm8tPmJhdHRfdGVjaCA+PSAwKQorCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOworCWlmIChpbmZvLT5iYXR0X0kyQ19yZWcgPj0gMCkKKwkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c7CisJaWYgKGluZm8tPm1heF92b2x0YWdlID49IDApCisJCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYOworCWlmIChpbmZvLT5taW5fdm9sdGFnZSA+PSAwKQorCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTjsKKworCWlmICghaW5mby0+YmF0dF9uYW1lKSB7CisJCWRldl9pbmZvKCZjaGFyZ2VyLT5jbGllbnQtPmRldiwKKwkJCQkiUGxlYXNlIGNvbnNpZGVyIHNldHRpbmcgcHJvcGVyIGJhdHRlcnkgIgorCQkJCSJuYW1lIGluIHBsYXRmb3JtIGRlZmluaXRpb24gZmlsZSwgZmFsbGluZyAiCisJCQkJImJhY2sgdG8gbmFtZSBcIiBaMl9ERUZBVUxUX05BTUUgXCJcbiIpOworCQljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MubmFtZSA9IFoyX0RFRkFVTFRfTkFNRTsKKwl9IGVsc2UKKwkJY2hhcmdlci0+YmF0dF9wc19kZXNjLm5hbWUgPSBpbmZvLT5iYXR0X25hbWU7CisKKwljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MucHJvcGVydGllcwk9IHByb3A7CisJY2hhcmdlci0+YmF0dF9wc19kZXNjLm51bV9wcm9wZXJ0aWVzCT0gcHJvcHM7CisJY2hhcmdlci0+YmF0dF9wc19kZXNjLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKKwljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MuZ2V0X3Byb3BlcnR5CT0gejJfYmF0dF9nZXRfcHJvcGVydHk7CisJY2hhcmdlci0+YmF0dF9wc19kZXNjLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPQorCQkJCQkJejJfYmF0dF9leHRfcG93ZXJfY2hhbmdlZDsKKwljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MudXNlX2Zvcl9hcG0JPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgejJfYmF0dF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlpbnQgcHJvcHMgPSAxOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UICovCisJc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXI7CisJc3RydWN0IHoyX2JhdHRlcnlfaW5mbyAqaW5mbyA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OworCisJaWYgKGluZm8gPT0gTlVMTCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJQbGVhc2Ugc2V0IHBsYXRmb3JtIGRldmljZSBwbGF0Zm9ybV9kYXRhIgorCQkJIiB0byBhIHZhbGlkIHoyX2JhdHRlcnlfaW5mbyBwb2ludGVyIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNoYXJnZXIgPSBremFsbG9jKHNpemVvZigqY2hhcmdlciksIEdGUF9LRVJORUwpOworCWlmIChjaGFyZ2VyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY2hhcmdlci0+YmF0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKwljaGFyZ2VyLT5pbmZvID0gaW5mbzsKKwljaGFyZ2VyLT5jbGllbnQgPSBjbGllbnQ7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hhcmdlcik7CisJcHN5X2NmZy5kcnZfZGF0YSA9IGNoYXJnZXI7CisKKwltdXRleF9pbml0KCZjaGFyZ2VyLT53b3JrX2xvY2spOworCisJaWYgKGluZm8tPmNoYXJnZV9ncGlvID49IDAgJiYgZ3Bpb19pc192YWxpZChpbmZvLT5jaGFyZ2VfZ3BpbykpIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGluZm8tPmNoYXJnZV9ncGlvLCAiQkFUVCBDSFJHIik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKworCQlyZXQgPSBncGlvX2RpcmVjdGlvbl9pbnB1dChpbmZvLT5jaGFyZ2VfZ3Bpbyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjI7CisKKwkJaXJxX3NldF9pcnFfdHlwZShncGlvX3RvX2lycShpbmZvLT5jaGFyZ2VfZ3BpbyksCisJCQkJIElSUV9UWVBFX0VER0VfQk9USCk7CisJCXJldCA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKGluZm8tPmNoYXJnZV9ncGlvKSwKKwkJCQl6Ml9jaGFyZ2Vfc3dpdGNoX2lycSwgMCwKKwkJCQkiQUMgRGV0ZWN0IiwgY2hhcmdlcik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjM7CisJfQorCisJcmV0ID0gejJfYmF0dF9wc19pbml0KGNoYXJnZXIsIHByb3BzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjM7CisKKwlJTklUX1dPUksoJmNoYXJnZXItPmJhdF93b3JrLCB6Ml9iYXR0X3dvcmspOworCisJY2hhcmdlci0+YmF0dF9wcyA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmY2xpZW50LT5kZXYsCisJCQkJCQkgJmNoYXJnZXItPmJhdHRfcHNfZGVzYywKKwkJCQkJCSAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihjaGFyZ2VyLT5iYXR0X3BzKSkgeworCQlyZXQgPSBQVFJfRVJSKGNoYXJnZXItPmJhdHRfcHMpOworCQlnb3RvIGVycjQ7CisJfQorCisJc2NoZWR1bGVfd29yaygmY2hhcmdlci0+YmF0X3dvcmspOworCisJcmV0dXJuIDA7CisKK2VycjQ6CisJa2ZyZWUoY2hhcmdlci0+YmF0dF9wc19kZXNjLnByb3BlcnRpZXMpOworZXJyMzoKKwlpZiAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCAmJiBncGlvX2lzX3ZhbGlkKGluZm8tPmNoYXJnZV9ncGlvKSkKKwkJZnJlZV9pcnEoZ3Bpb190b19pcnEoaW5mby0+Y2hhcmdlX2dwaW8pLCBjaGFyZ2VyKTsKK2VycjI6CisJaWYgKGluZm8tPmNoYXJnZV9ncGlvID49IDAgJiYgZ3Bpb19pc192YWxpZChpbmZvLT5jaGFyZ2VfZ3BpbykpCisJCWdwaW9fZnJlZShpbmZvLT5jaGFyZ2VfZ3Bpbyk7CitlcnI6CisJa2ZyZWUoY2hhcmdlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB6Ml9iYXR0X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IHoyX2JhdHRlcnlfaW5mbyAqaW5mbyA9IGNoYXJnZXItPmluZm87CisKKwljYW5jZWxfd29ya19zeW5jKCZjaGFyZ2VyLT5iYXRfd29yayk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoY2hhcmdlci0+YmF0dF9wcyk7CisKKwlrZnJlZShjaGFyZ2VyLT5iYXR0X3BzX2Rlc2MucHJvcGVydGllcyk7CisJaWYgKGluZm8tPmNoYXJnZV9ncGlvID49IDAgJiYgZ3Bpb19pc192YWxpZChpbmZvLT5jaGFyZ2VfZ3BpbykpIHsKKwkJZnJlZV9pcnEoZ3Bpb190b19pcnEoaW5mby0+Y2hhcmdlX2dwaW8pLCBjaGFyZ2VyKTsKKwkJZ3Bpb19mcmVlKGluZm8tPmNoYXJnZV9ncGlvKTsKKwl9CisKKwlrZnJlZShjaGFyZ2VyKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHoyX2JhdHRfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZmx1c2hfd29yaygmY2hhcmdlci0+YmF0X3dvcmspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHoyX2JhdHRfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlzY2hlZHVsZV93b3JrKCZjaGFyZ2VyLT5iYXRfd29yayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyB6Ml9iYXR0ZXJ5X3BtX29wcyA9IHsKKwkuc3VzcGVuZAk9IHoyX2JhdHRfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHoyX2JhdHRfcmVzdW1lLAorfTsKKworI2RlZmluZQlaMl9CQVRURVJZX1BNX09QUwkoJnoyX2JhdHRlcnlfcG1fb3BzKQorCisjZWxzZQorI2RlZmluZQlaMl9CQVRURVJZX1BNX09QUwkoTlVMTCkKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgejJfYmF0dF9pZFtdID0geworCXsgImFlcjkxNSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgejJfYmF0dF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB6Ml9iYXR0X2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJ6Mi1iYXR0ZXJ5IiwKKwkJLnBtCT0gWjJfQkFUVEVSWV9QTV9PUFMKKwl9LAorCS5wcm9iZQkJPSB6Ml9iYXR0X3Byb2JlLAorCS5yZW1vdmUJCT0gejJfYmF0dF9yZW1vdmUsCisJLmlkX3RhYmxlCT0gejJfYmF0dF9pZCwKK307Cittb2R1bGVfaTJjX2RyaXZlcih6Ml9iYXR0X2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBldGVyIEVkd2FyZHMgPHN3ZWV0bGlsbXJlQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWmlwaXQgWjIgYmF0dGVyeSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvdHBzNjUyMTdfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci90cHM2NTIxN19jaGFyZ2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTZlNTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wb3dlci90cHM2NTIxN19jaGFyZ2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoKLSAqIEJhdHRlcnkgY2hhcmdlciBkcml2ZXIgZm9yIFRJJ3MgdHBzNjUyMTcKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUsIENvbGxhYm9yYSBMdGQuCi0KLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqLwotCi0vKgotICogQmF0dGVyeSBjaGFyZ2VyIGRyaXZlciBmb3IgVEkncyB0cHM2NTIxNwotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbWZkL3RwczY1MjE3Lmg+Ci0KLSNkZWZpbmUgUE9MTF9JTlRFUlZBTAkJKEhaICogMikKLQotc3RydWN0IHRwczY1MjE3X2NoYXJnZXIgewotCXN0cnVjdCB0cHM2NTIxNyAqdHBzOwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICphYzsKLQotCWludAlhY19vbmxpbmU7Ci0JaW50CXByZXZfYWNfb25saW5lOwotCi0Jc3RydWN0IHRhc2tfc3RydWN0CSpwb2xsX3Rhc2s7Ci19OwotCi1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgdHBzNjUyMTdfYWNfcHJvcHNbXSA9IHsKLQlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCi19OwotCi1zdGF0aWMgaW50IHRwczY1MjE3X2NvbmZpZ19jaGFyZ2VyKHN0cnVjdCB0cHM2NTIxN19jaGFyZ2VyICpjaGFyZ2VyKQotewotCWludCByZXQ7Ci0KLQlkZXZfZGJnKGNoYXJnZXItPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKgotCSAqIHRwczY1MjE3IHJldi4gRywgcC4gMzEgKHNlZSBwLiAzMiBmb3IgTlRDIHNjaGVtYXRpYykKLQkgKgotCSAqIFRoZSBkZXZpY2UgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBhIDEwMGsgTlRDIChCID0gMzk2MCkgYnkKLQkgKiBzZXR0aW5nIHRoZSB0aGUgTlRDX1RZUEUgYml0IGluIHJlZ2lzdGVyIENIR0NPTkZJRzEgdG8gMS4gSG93ZXZlciBpdAotCSAqIGlzIG5vdCByZWNvbW1lbmRlZCB0byBkbyBzby4gSW4gc2xlZXAgbW9kZSwgdGhlIGNoYXJnZXIgY29udGludWVzCi0JICogY2hhcmdpbmcgdGhlIGJhdHRlcnksIGJ1dCBhbGwgcmVnaXN0ZXIgdmFsdWVzIGFyZSByZXNldCB0byBkZWZhdWx0Ci0JICogdmFsdWVzLiBUaGVyZWZvcmUsIHRoZSBjaGFyZ2VyIHdvdWxkIGdldCB0aGUgd3JvbmcgdGVtcGVyYXR1cmUKLQkgKiBpbmZvcm1hdGlvbi4gSWYgMTAwayBOVEMgc2V0dGluZyBpcyByZXF1aXJlZCwgcGxlYXNlIGNvbnRhY3QgdGhlCi0JICogZmFjdG9yeS4KLQkgKgotCSAqIEFUVEVOVElPTiwgY29uZmxpY3RpbmcgaW5mb3JtYXRpb24sIGZyb20gcC4gNDYKLQkgKgotCSAqIE5UQyBUWVBFIChmb3IgYmF0dGVyeSB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCkKLQkgKiAgIDAg4oCTIDEwMGsgKGN1cnZlIDEsIEIgPSAzOTYwKQotCSAqICAgMSDigJMgMTBrICAoY3VydmUgMiwgQiA9IDM0ODApIChkZWZhdWx0IG9uIHJlc2V0KQotCSAqCi0JICovCi0JcmV0ID0gdHBzNjUyMTdfY2xlYXJfYml0cyhjaGFyZ2VyLT50cHMsIFRQUzY1MjE3X1JFR19DSEdDT05GSUcxLAotCQkJCSAgVFBTNjUyMTdfQ0hHQ09ORklHMV9OVENfVFlQRSwKLQkJCQkgIFRQUzY1MjE3X1BST1RFQ1RfTk9ORSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNoYXJnZXItPmRldiwKLQkJCSJmYWlsZWQgdG8gc2V0IDEwMGsgTlRDIHNldHRpbmc6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRwczY1MjE3X2VuYWJsZV9jaGFyZ2luZyhzdHJ1Y3QgdHBzNjUyMTdfY2hhcmdlciAqY2hhcmdlcikKLXsKLQlpbnQgcmV0OwotCi0JLyogY2hhcmdlciBhbHJlYWR5IGVuYWJsZWQgKi8KLQlpZiAoY2hhcmdlci0+YWNfb25saW5lKQotCQlyZXR1cm4gMDsKLQotCWRldl9kYmcoY2hhcmdlci0+ZGV2LCAiJXM6IGVuYWJsZSBjaGFyZ2luZ1xuIiwgX19mdW5jX18pOwotCXJldCA9IHRwczY1MjE3X3NldF9iaXRzKGNoYXJnZXItPnRwcywgVFBTNjUyMTdfUkVHX0NIR0NPTkZJRzEsCi0JCQkJVFBTNjUyMTdfQ0hHQ09ORklHMV9DSEdfRU4sCi0JCQkJVFBTNjUyMTdfQ0hHQ09ORklHMV9DSEdfRU4sCi0JCQkJVFBTNjUyMTdfUFJPVEVDVF9OT05FKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY2hhcmdlci0+ZGV2LAotCQkJIiVzOiBFcnJvciBpbiB3cml0aW5nIENIR19FTiBpbiByZWcgMHgleDogJWRcbiIsCi0JCQlfX2Z1bmNfXywgVFBTNjUyMTdfUkVHX0NIR0NPTkZJRzEsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JY2hhcmdlci0+YWNfb25saW5lID0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRwczY1MjE3X2FjX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQotewotCXN0cnVjdCB0cHM2NTIxN19jaGFyZ2VyICpjaGFyZ2VyID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7Ci0KLQlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX09OTElORSkgewotCQl2YWwtPmludHZhbCA9IGNoYXJnZXItPmFjX29ubGluZTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgdHBzNjUyMTdfY2hhcmdlcl9pcnEoaW50IGlycSwgdm9pZCAqZGV2KQotewotCWludCByZXQsIHZhbDsKLQlzdHJ1Y3QgdHBzNjUyMTdfY2hhcmdlciAqY2hhcmdlciA9IGRldjsKLQotCWNoYXJnZXItPnByZXZfYWNfb25saW5lID0gY2hhcmdlci0+YWNfb25saW5lOwotCi0JcmV0ID0gdHBzNjUyMTdfcmVnX3JlYWQoY2hhcmdlci0+dHBzLCBUUFM2NTIxN19SRUdfU1RBVFVTLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNoYXJnZXItPmRldiwgIiVzOiBFcnJvciBpbiByZWFkaW5nIHJlZyAweCV4XG4iLAotCQkJX19mdW5jX18sIFRQUzY1MjE3X1JFR19TVEFUVVMpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JZGV2X2RiZyhjaGFyZ2VyLT5kZXYsICIlczogMHgleFxuIiwgX19mdW5jX18sIHZhbCk7Ci0KLQkvKiBjaGVjayBmb3IgQUMgc3RhdHVzIGJpdCAqLwotCWlmICh2YWwgJiBUUFM2NTIxN19TVEFUVVNfQUNQV1IpIHsKLQkJcmV0ID0gdHBzNjUyMTdfZW5hYmxlX2NoYXJnaW5nKGNoYXJnZXIpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGNoYXJnZXItPmRldiwKLQkJCQkiZmFpbGVkIHRvIGVuYWJsZSBjaGFyZ2VyOiAlZFxuIiwgcmV0KTsKLQkJCXJldHVybiBJUlFfSEFORExFRDsKLQkJfQotCX0gZWxzZSB7Ci0JCWNoYXJnZXItPmFjX29ubGluZSA9IDA7Ci0JfQotCi0JaWYgKGNoYXJnZXItPnByZXZfYWNfb25saW5lICE9IGNoYXJnZXItPmFjX29ubGluZSkKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hhcmdlci0+YWMpOwotCi0JcmV0ID0gdHBzNjUyMTdfcmVnX3JlYWQoY2hhcmdlci0+dHBzLCBUUFM2NTIxN19SRUdfQ0hHQ09ORklHMCwgJnZhbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihjaGFyZ2VyLT5kZXYsICIlczogRXJyb3IgaW4gcmVhZGluZyByZWcgMHgleFxuIiwKLQkJCV9fZnVuY19fLCBUUFM2NTIxN19SRUdfQ0hHQ09ORklHMCk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAodmFsICYgVFBTNjUyMTdfQ0hHQ09ORklHMF9BQ1RJVkUpCi0JCWRldl9kYmcoY2hhcmdlci0+ZGV2LCAiJXM6IGNoYXJnZXIgaXMgY2hhcmdpbmdcbiIsIF9fZnVuY19fKTsKLQllbHNlCi0JCWRldl9kYmcoY2hhcmdlci0+ZGV2LAotCQkJIiVzOiBjaGFyZ2VyIGlzIE5PVCBjaGFyZ2luZ1xuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IHRwczY1MjE3X2NoYXJnZXJfcG9sbF90YXNrKHZvaWQgKmRhdGEpCi17Ci0Jc2V0X2ZyZWV6YWJsZSgpOwotCi0Jd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKFBPTExfSU5URVJWQUwpOwotCQl0cnlfdG9fZnJlZXplKCk7Ci0JCXRwczY1MjE3X2NoYXJnZXJfaXJxKC0xLCBkYXRhKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgdHBzNjUyMTdfY2hhcmdlcl9kZXNjID0gewotCS5uYW1lCQkJPSAidHBzNjUyMTctYWMiLAotCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUywKLQkuZ2V0X3Byb3BlcnR5CQk9IHRwczY1MjE3X2FjX2dldF9wcm9wZXJ0eSwKLQkucHJvcGVydGllcwkJPSB0cHM2NTIxN19hY19wcm9wcywKLQkubnVtX3Byb3BlcnRpZXMJCT0gQVJSQVlfU0laRSh0cHM2NTIxN19hY19wcm9wcyksCi19OwotCi1zdGF0aWMgaW50IHRwczY1MjE3X2NoYXJnZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgdHBzNjUyMTcgKnRwcyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKLQlzdHJ1Y3QgdHBzNjUyMTdfY2hhcmdlciAqY2hhcmdlcjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBjZmcgPSB7fTsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQotCWNoYXJnZXIgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjaGFyZ2VyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGFyZ2VyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNoYXJnZXIpOwotCWNoYXJnZXItPnRwcyA9IHRwczsKLQljaGFyZ2VyLT5kZXYgPSAmcGRldi0+ZGV2OwotCi0JY2ZnLm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKLQljZmcuZHJ2X2RhdGEgPSBjaGFyZ2VyOwotCi0JY2hhcmdlci0+YWMgPSBkZXZtX3Bvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAotCQkJCQkJICZ0cHM2NTIxN19jaGFyZ2VyX2Rlc2MsCi0JCQkJCQkgJmNmZyk7Ci0JaWYgKElTX0VSUihjaGFyZ2VyLT5hYykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXJcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihjaGFyZ2VyLT5hYyk7Ci0JfQotCi0JcmV0ID0gdHBzNjUyMTdfY29uZmlnX2NoYXJnZXIoY2hhcmdlcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihjaGFyZ2VyLT5kZXYsICJjaGFyZ2VyIGNvbmZpZyBmYWlsZWQsIGVyciAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQljaGFyZ2VyLT5wb2xsX3Rhc2sgPSBrdGhyZWFkX3J1bih0cHM2NTIxN19jaGFyZ2VyX3BvbGxfdGFzaywKLQkJCQkgICAgICBjaGFyZ2VyLCAia3RwczY1MjE3Y2hhcmdlciIpOwotCWlmIChJU19FUlIoY2hhcmdlci0+cG9sbF90YXNrKSkgewotCQlyZXQgPSBQVFJfRVJSKGNoYXJnZXItPnBvbGxfdGFzayk7Ci0JCWRldl9lcnIoY2hhcmdlci0+ZGV2LCAiVW5hYmxlIHRvIHJ1biBrdGhyZWFkIGVyciAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0cHM2NTIxN19jaGFyZ2VyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCB0cHM2NTIxN19jaGFyZ2VyICpjaGFyZ2VyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlrdGhyZWFkX3N0b3AoY2hhcmdlci0+cG9sbF90YXNrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0cHM2NTIxN19jaGFyZ2VyX21hdGNoX3RhYmxlW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJ0aSx0cHM2NTIxNy1jaGFyZ2VyIiwgfSwKLQl7IC8qIHNlbnRpbmVsICovIH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0cHM2NTIxN19jaGFyZ2VyX21hdGNoX3RhYmxlKTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHBzNjUyMTdfY2hhcmdlcl9kcml2ZXIgPSB7Ci0JLnByb2JlCT0gdHBzNjUyMTdfY2hhcmdlcl9wcm9iZSwKLQkucmVtb3ZlID0gdHBzNjUyMTdfY2hhcmdlcl9yZW1vdmUsCi0JLmRyaXZlcgk9IHsKLQkJLm5hbWUJPSAidHBzNjUyMTctY2hhcmdlciIsCi0JCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cih0cHM2NTIxN19jaGFyZ2VyX21hdGNoX3RhYmxlKSwKLQl9LAotCi19OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0cHM2NTIxN19jaGFyZ2VyX2RyaXZlcik7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9BVVRIT1IoIkVucmljIEJhbGxldGJvIFNlcnJhIDxlbnJpYy5iYWxsZXRib0Bjb2xsYWJvcmEuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJUUFM2NTIxNyBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3dtOTd4eF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3dtOTd4eF9iYXR0ZXJ5LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZjA5ZWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wb3dlci93bTk3eHhfYmF0dGVyeS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qCi0gKiBsaW51eC9kcml2ZXJzL3Bvd2VyL3dtOTd4eF9iYXR0ZXJ5LmMKLSAqCi0gKiBCYXR0ZXJ5IG1lYXN1cmVtZW50IGNvZGUgZm9yIFdNOTd4eAotICoKLSAqIGJhc2VkIG9uIHRvc2FfYmF0dGVyeS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IE1hcmVrIFZhc3V0IDxtYXJlay52YXN1dEBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC93bTk3eHguaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0KLXN0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgYmF0X3dvcms7Ci1zdGF0aWMgREVGSU5FX01VVEVYKHdvcmtfbG9jayk7Ci1zdGF0aWMgaW50IGJhdF9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci1zdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgKnByb3A7Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdtOTd4eF9yZWFkX2JhdChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHMpCi17Ci0Jc3RydWN0IHdtOTd4eF9wZGF0YSAqd21kYXRhID0gYmF0X3BzLT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSAqcGRhdGEgPSB3bWRhdGEtPmJhdHRfcGRhdGE7Ci0KLQlyZXR1cm4gd205N3h4X3JlYWRfYXV4X2FkYyhkZXZfZ2V0X2RydmRhdGEoYmF0X3BzLT5kZXYucGFyZW50KSwKLQkJCQkJcGRhdGEtPmJhdHRfYXV4KSAqIHBkYXRhLT5iYXR0X211bHQgLwotCQkJCQlwZGF0YS0+YmF0dF9kaXY7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdtOTd4eF9yZWFkX3RlbXAoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzKQotewotCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGJhdF9wcy0+ZGV2LnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgd205N3h4X2JhdHRfcGRhdGEgKnBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOwotCi0JcmV0dXJuIHdtOTd4eF9yZWFkX2F1eF9hZGMoZGV2X2dldF9kcnZkYXRhKGJhdF9wcy0+ZGV2LnBhcmVudCksCi0JCQkJCXBkYXRhLT50ZW1wX2F1eCkgKiBwZGF0YS0+dGVtcF9tdWx0IC8KLQkJCQkJcGRhdGEtPnRlbXBfZGl2OwotfQotCi1zdGF0aWMgaW50IHdtOTd4eF9iYXRfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcywKLQkJCSAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBiYXRfcHMtPmRldi5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHdtOTd4eF9iYXR0X3BkYXRhICpwZGF0YSA9IHdtZGF0YS0+YmF0dF9wZGF0YTsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Ci0JCXZhbC0+aW50dmFsID0gYmF0X3N0YXR1czsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgotCQl2YWwtPmludHZhbCA9IHBkYXRhLT5iYXR0X3RlY2g7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6Ci0JCWlmIChwZGF0YS0+YmF0dF9hdXggPj0gMCkKLQkJCXZhbC0+aW50dmFsID0gd205N3h4X3JlYWRfYmF0KGJhdF9wcyk7Ci0JCWVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6Ci0JCWlmIChwZGF0YS0+dGVtcF9hdXggPj0gMCkKLQkJCXZhbC0+aW50dmFsID0gd205N3h4X3JlYWRfdGVtcChiYXRfcHMpOwotCQllbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWDoKLQkJaWYgKHBkYXRhLT5tYXhfdm9sdGFnZSA+PSAwKQotCQkJdmFsLT5pbnR2YWwgPSBwZGF0YS0+bWF4X3ZvbHRhZ2U7Ci0JCWVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOOgotCQlpZiAocGRhdGEtPm1pbl92b2x0YWdlID49IDApCi0JCQl2YWwtPmludHZhbCA9IHBkYXRhLT5taW5fdm9sdGFnZTsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKLQkJdmFsLT5pbnR2YWwgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHdtOTd4eF9iYXRfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHMpCi17Ci0Jc2NoZWR1bGVfd29yaygmYmF0X3dvcmspOwotfQotCi1zdGF0aWMgdm9pZCB3bTk3eHhfYmF0X3VwZGF0ZShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXRfcHMpCi17Ci0JaW50IG9sZF9zdGF0dXMgPSBiYXRfc3RhdHVzOwotCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGJhdF9wcy0+ZGV2LnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3Qgd205N3h4X2JhdHRfcGRhdGEgKnBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOwotCi0JbXV0ZXhfbG9jaygmd29ya19sb2NrKTsKLQotCWJhdF9zdGF0dXMgPSAocGRhdGEtPmNoYXJnZV9ncGlvID49IDApID8KLQkJCShncGlvX2dldF92YWx1ZShwZGF0YS0+Y2hhcmdlX2dwaW8pID8KLQkJCVBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkcgOgotCQkJUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORykgOgotCQkJUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOwotCi0JaWYgKG9sZF9zdGF0dXMgIT0gYmF0X3N0YXR1cykgewotCQlwcl9kZWJ1ZygiJXM6ICVpIC0+ICVpXG4iLCBiYXRfcHMtPmRlc2MtPm5hbWUsIG9sZF9zdGF0dXMsCi0JCQkJCWJhdF9zdGF0dXMpOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChiYXRfcHMpOwotCX0KLQotCW11dGV4X3VubG9jaygmd29ya19sb2NrKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wc3k7Ci1zdGF0aWMgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGJhdF9wc3lfZGVzYyA9IHsKLQkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKLQkuZ2V0X3Byb3BlcnR5CQk9IHdtOTd4eF9iYXRfZ2V0X3Byb3BlcnR5LAotCS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gd205N3h4X2JhdF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkLAotCS51c2VfZm9yX2FwbQkJPSAxLAotfTsKLQotc3RhdGljIHZvaWQgd205N3h4X2JhdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQl3bTk3eHhfYmF0X3VwZGF0ZShiYXRfcHN5KTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHdtOTd4eF9jaHJnX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXNjaGVkdWxlX3dvcmsoJmJhdF93b3JrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgd205N3h4X2JhdF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlmbHVzaF93b3JrKCZiYXRfd29yayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd205N3h4X2JhdF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXNjaGVkdWxlX3dvcmsoJmJhdF93b3JrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHdtOTd4eF9iYXRfcG1fb3BzID0gewotCS5zdXNwZW5kCT0gd205N3h4X2JhdF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gd205N3h4X2JhdF9yZXN1bWUsCi19OwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgd205N3h4X2JhdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IHByb3BzID0gMTsJLyogUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCAqLwotCWludCBpID0gMDsKLQlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSAqcGRhdGE7Ci0KLQlpZiAoIXdtZGF0YSkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIk5vIHBsYXRmb3JtIGRhdGEgc3VwcGxpZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwZGF0YSA9IHdtZGF0YS0+YmF0dF9wZGF0YTsKLQotCWlmIChkZXYtPmlkICE9IC0xKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghcGRhdGEpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJObyBwbGF0Zm9ybV9kYXRhIHN1cHBsaWVkXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmNoYXJnZV9ncGlvKSkgewotCQlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPmNoYXJnZV9ncGlvLCAiQkFUVCBDSFJHIik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycjsKLQkJcmV0ID0gZ3Bpb19kaXJlY3Rpb25faW5wdXQocGRhdGEtPmNoYXJnZV9ncGlvKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyMjsKLQkJcmV0ID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEocGRhdGEtPmNoYXJnZV9ncGlvKSwKLQkJCQl3bTk3eHhfY2hyZ19pcnEsIDAsCi0JCQkJIkFDIERldGVjdCIsIGRldik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycjI7Ci0JCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUyAqLwotCX0KLQotCWlmIChwZGF0YS0+YmF0dF90ZWNoID49IDApCi0JCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1kgKi8KLQlpZiAocGRhdGEtPnRlbXBfYXV4ID49IDApCi0JCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVAgKi8KLQlpZiAocGRhdGEtPmJhdHRfYXV4ID49IDApCi0JCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XICovCi0JaWYgKHBkYXRhLT5tYXhfdm9sdGFnZSA+PSAwKQotCQlwcm9wcysrOwkvKiBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWCAqLwotCWlmIChwZGF0YS0+bWluX3ZvbHRhZ2UgPj0gMCkKLQkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU4gKi8KLQotCXByb3AgPSBremFsbG9jKHByb3BzICogc2l6ZW9mKCpwcm9wKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcm9wKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyMzsKLQl9Ci0KLQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOwotCWlmIChwZGF0YS0+Y2hhcmdlX2dwaW8gPj0gMCkKLQkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOwotCWlmIChwZGF0YS0+YmF0dF90ZWNoID49IDApCi0JCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k7Ci0JaWYgKHBkYXRhLT50ZW1wX2F1eCA+PSAwKQotCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOwotCWlmIChwZGF0YS0+YmF0dF9hdXggPj0gMCkKLQkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c7Ci0JaWYgKHBkYXRhLT5tYXhfdm9sdGFnZSA+PSAwKQotCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWDsKLQlpZiAocGRhdGEtPm1pbl92b2x0YWdlID49IDApCi0JCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOOwotCi0JSU5JVF9XT1JLKCZiYXRfd29yaywgd205N3h4X2JhdF93b3JrKTsKLQotCWlmICghcGRhdGEtPmJhdHRfbmFtZSkgewotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJQbGVhc2UgY29uc2lkZXIgc2V0dGluZyBwcm9wZXIgYmF0dGVyeSAiCi0JCQkJIm5hbWUgaW4gcGxhdGZvcm0gZGVmaW5pdGlvbiBmaWxlLCBmYWxsaW5nICIKLQkJCQkiYmFjayB0byBuYW1lIFwid205N3h4LWJhdHRcIlxuIik7Ci0JCWJhdF9wc3lfZGVzYy5uYW1lID0gIndtOTd4eC1iYXR0IjsKLQl9IGVsc2UKLQkJYmF0X3BzeV9kZXNjLm5hbWUgPSBwZGF0YS0+YmF0dF9uYW1lOwotCi0JYmF0X3BzeV9kZXNjLnByb3BlcnRpZXMgPSBwcm9wOwotCWJhdF9wc3lfZGVzYy5udW1fcHJvcGVydGllcyA9IHByb3BzOwotCi0JYmF0X3BzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmZGV2LT5kZXYsICZiYXRfcHN5X2Rlc2MsIE5VTEwpOwotCWlmICghSVNfRVJSKGJhdF9wc3kpKSB7Ci0JCXNjaGVkdWxlX3dvcmsoJmJhdF93b3JrKTsKLQl9IGVsc2UgewotCQlyZXQgPSBQVFJfRVJSKGJhdF9wc3kpOwotCQlnb3RvIGVycjQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci1lcnI0OgotCWtmcmVlKHByb3ApOwotZXJyMzoKLQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+Y2hhcmdlX2dwaW8pKQotCQlmcmVlX2lycShncGlvX3RvX2lycShwZGF0YS0+Y2hhcmdlX2dwaW8pLCBkZXYpOwotZXJyMjoKLQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+Y2hhcmdlX2dwaW8pKQotCQlncGlvX2ZyZWUocGRhdGEtPmNoYXJnZV9ncGlvKTsKLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdtOTd4eF9iYXRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSAqcGRhdGEgPSB3bWRhdGEtPmJhdHRfcGRhdGE7Ci0KLQlpZiAocGRhdGEgJiYgZ3Bpb19pc192YWxpZChwZGF0YS0+Y2hhcmdlX2dwaW8pKSB7Ci0JCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5jaGFyZ2VfZ3BpbyksIGRldik7Ci0JCWdwaW9fZnJlZShwZGF0YS0+Y2hhcmdlX2dwaW8pOwotCX0KLQljYW5jZWxfd29ya19zeW5jKCZiYXRfd29yayk7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYmF0X3BzeSk7Ci0Ja2ZyZWUocHJvcCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdtOTd4eF9iYXRfZHJpdmVyID0gewotCS5kcml2ZXIJPSB7Ci0JCS5uYW1lCT0gIndtOTd4eC1iYXR0ZXJ5IiwKLSNpZmRlZiBDT05GSUdfUE0KLQkJLnBtCT0gJndtOTd4eF9iYXRfcG1fb3BzLAotI2VuZGlmCi0JfSwKLQkucHJvYmUJCT0gd205N3h4X2JhdF9wcm9iZSwKLQkucmVtb3ZlCQk9IHdtOTd4eF9iYXRfcmVtb3ZlLAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih3bTk3eHhfYmF0X2RyaXZlcik7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIk1hcmVrIFZhc3V0IDxtYXJlay52YXN1dEBnbWFpbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIldNOTd4eCBiYXR0ZXJ5IGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci96Ml9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3oyX2JhdHRlcnkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIwMWUzZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Bvd2VyL3oyX2JhdHRlcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKgotICogQmF0dGVyeSBtZWFzdXJlbWVudCBjb2RlIGZvciBaaXBpdCBaMgotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBQZXRlciBFZHdhcmRzIDxzd2VldGxpbG1yZUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvejJfYmF0dGVyeS5oPgotCi0jZGVmaW5lCVoyX0RFRkFVTFRfTkFNRQkiWjIiCi0KLXN0cnVjdCB6Ml9jaGFyZ2VyIHsKLQlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvCQkqaW5mbzsKLQlpbnQJCQkJYmF0X3N0YXR1czsKLQlzdHJ1Y3QgaTJjX2NsaWVudAkJKmNsaWVudDsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5CQkqYmF0dF9wczsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MJYmF0dF9wc19kZXNjOwotCXN0cnVjdCBtdXRleAkJCXdvcmtfbG9jazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCWJhdF93b3JrOwotfTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgejJfcmVhZF9iYXQoc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIpCi17Ci0JaW50IGRhdGE7Ci0JZGF0YSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjaGFyZ2VyLT5jbGllbnQsCi0JCQkJCWNoYXJnZXItPmluZm8tPmJhdHRfSTJDX3JlZyk7Ci0JaWYgKGRhdGEgPCAwKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBkYXRhICogY2hhcmdlci0+aW5mby0+YmF0dF9tdWx0IC8gY2hhcmdlci0+aW5mby0+YmF0dF9kaXY7Ci19Ci0KLXN0YXRpYyBpbnQgejJfYmF0dF9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dF9wcywKLQkJCSAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKLXsKLQlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlciA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShiYXR0X3BzKTsKLQlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvICppbmZvID0gY2hhcmdlci0+aW5mbzsKLQotCXN3aXRjaCAocHNwKSB7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Ci0JCXZhbC0+aW50dmFsID0gY2hhcmdlci0+YmF0X3N0YXR1czsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgotCQl2YWwtPmludHZhbCA9IGluZm8tPmJhdHRfdGVjaDsKLQkJYnJlYWs7Ci0JY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJaWYgKGluZm8tPmJhdHRfSTJDX3JlZyA+PSAwKQotCQkJdmFsLT5pbnR2YWwgPSB6Ml9yZWFkX2JhdChjaGFyZ2VyKTsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVg6Ci0JCWlmIChpbmZvLT5tYXhfdm9sdGFnZSA+PSAwKQotCQkJdmFsLT5pbnR2YWwgPSBpbmZvLT5tYXhfdm9sdGFnZTsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU46Ci0JCWlmIChpbmZvLT5taW5fdm9sdGFnZSA+PSAwKQotCQkJdmFsLT5pbnR2YWwgPSBpbmZvLT5taW5fdm9sdGFnZTsKLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKLQkJdmFsLT5pbnR2YWwgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgejJfYmF0dF9leHRfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0X3BzKQotewotCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKGJhdHRfcHMpOwotCi0Jc2NoZWR1bGVfd29yaygmY2hhcmdlci0+YmF0X3dvcmspOwotfQotCi1zdGF0aWMgdm9pZCB6Ml9iYXR0X3VwZGF0ZShzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlcikKLXsKLQlpbnQgb2xkX3N0YXR1cyA9IGNoYXJnZXItPmJhdF9zdGF0dXM7Ci0Jc3RydWN0IHoyX2JhdHRlcnlfaW5mbyAqaW5mbzsKLQotCWluZm8gPSBjaGFyZ2VyLT5pbmZvOwotCi0JbXV0ZXhfbG9jaygmY2hhcmdlci0+d29ya19sb2NrKTsKLQotCWNoYXJnZXItPmJhdF9zdGF0dXMgPSAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCkgPwotCQkoZ3Bpb19nZXRfdmFsdWUoaW5mby0+Y2hhcmdlX2dwaW8pID8KLQkJUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORyA6Ci0JCVBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkcpIDoKLQkJUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOwotCi0JaWYgKG9sZF9zdGF0dXMgIT0gY2hhcmdlci0+YmF0X3N0YXR1cykgewotCQlwcl9kZWJ1ZygiJXM6ICVpIC0+ICVpXG4iLCBjaGFyZ2VyLT5iYXR0X3BzLT5kZXNjLT5uYW1lLAotCQkJCW9sZF9zdGF0dXMsCi0JCQkJY2hhcmdlci0+YmF0X3N0YXR1cyk7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoYXJnZXItPmJhdHRfcHMpOwotCX0KLQotCW11dGV4X3VubG9jaygmY2hhcmdlci0+d29ya19sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgejJfYmF0dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlcjsKLQljaGFyZ2VyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB6Ml9jaGFyZ2VyLCBiYXRfd29yayk7Ci0JejJfYmF0dF91cGRhdGUoY2hhcmdlcik7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB6Ml9jaGFyZ2Vfc3dpdGNoX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCkKLXsKLQlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlciA9IGRldmlkOwotCXNjaGVkdWxlX3dvcmsoJmNoYXJnZXItPmJhdF93b3JrKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpbnQgejJfYmF0dF9wc19pbml0KHN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyLCBpbnQgcHJvcHMpCi17Ci0JaW50IGkgPSAwOwotCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5ICpwcm9wOwotCXN0cnVjdCB6Ml9iYXR0ZXJ5X2luZm8gKmluZm8gPSBjaGFyZ2VyLT5pbmZvOwotCi0JaWYgKGluZm8tPmNoYXJnZV9ncGlvID49IDApCi0JCXByb3BzKys7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUyAqLwotCWlmIChpbmZvLT5iYXR0X3RlY2ggPj0gMCkKLQkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSAqLwotCWlmIChpbmZvLT5iYXR0X0kyQ19yZWcgPj0gMCkKLQkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1cgKi8KLQlpZiAoaW5mby0+bWF4X3ZvbHRhZ2UgPj0gMCkKLQkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVggKi8KLQlpZiAoaW5mby0+bWluX3ZvbHRhZ2UgPj0gMCkKLQkJcHJvcHMrKzsJLyogUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU4gKi8KLQotCXByb3AgPSBremFsbG9jKHByb3BzICogc2l6ZW9mKCpwcm9wKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcm9wKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ7Ci0JaWYgKGluZm8tPmNoYXJnZV9ncGlvID49IDApCi0JCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzsKLQlpZiAoaW5mby0+YmF0dF90ZWNoID49IDApCi0JCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k7Ci0JaWYgKGluZm8tPmJhdHRfSTJDX3JlZyA+PSAwKQotCQlwcm9wW2krK10gPSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzsKLQlpZiAoaW5mby0+bWF4X3ZvbHRhZ2UgPj0gMCkKLQkJcHJvcFtpKytdID0gUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVg7Ci0JaWYgKGluZm8tPm1pbl92b2x0YWdlID49IDApCi0JCXByb3BbaSsrXSA9IFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOOwotCi0JaWYgKCFpbmZvLT5iYXR0X25hbWUpIHsKLQkJZGV2X2luZm8oJmNoYXJnZXItPmNsaWVudC0+ZGV2LAotCQkJCSJQbGVhc2UgY29uc2lkZXIgc2V0dGluZyBwcm9wZXIgYmF0dGVyeSAiCi0JCQkJIm5hbWUgaW4gcGxhdGZvcm0gZGVmaW5pdGlvbiBmaWxlLCBmYWxsaW5nICIKLQkJCQkiYmFjayB0byBuYW1lIFwiIFoyX0RFRkFVTFRfTkFNRSBcIlxuIik7Ci0JCWNoYXJnZXItPmJhdHRfcHNfZGVzYy5uYW1lID0gWjJfREVGQVVMVF9OQU1FOwotCX0gZWxzZQotCQljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MubmFtZSA9IGluZm8tPmJhdHRfbmFtZTsKLQotCWNoYXJnZXItPmJhdHRfcHNfZGVzYy5wcm9wZXJ0aWVzCT0gcHJvcDsKLQljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MubnVtX3Byb3BlcnRpZXMJPSBwcm9wczsKLQljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCWNoYXJnZXItPmJhdHRfcHNfZGVzYy5nZXRfcHJvcGVydHkJPSB6Ml9iYXR0X2dldF9wcm9wZXJ0eTsKLQljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9Ci0JCQkJCQl6Ml9iYXR0X2V4dF9wb3dlcl9jaGFuZ2VkOwotCWNoYXJnZXItPmJhdHRfcHNfZGVzYy51c2VfZm9yX2FwbQk9IDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB6Ml9iYXR0X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByZXQgPSAwOwotCWludCBwcm9wcyA9IDE7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQgKi8KLQlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlcjsKLQlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvICppbmZvID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307Ci0KLQlpZiAoaW5mbyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkJIlBsZWFzZSBzZXQgcGxhdGZvcm0gZGV2aWNlIHBsYXRmb3JtX2RhdGEiCi0JCQkiIHRvIGEgdmFsaWQgejJfYmF0dGVyeV9pbmZvIHBvaW50ZXIhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY2hhcmdlciA9IGt6YWxsb2Moc2l6ZW9mKCpjaGFyZ2VyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNoYXJnZXIgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljaGFyZ2VyLT5iYXRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOwotCWNoYXJnZXItPmluZm8gPSBpbmZvOwotCWNoYXJnZXItPmNsaWVudCA9IGNsaWVudDsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGFyZ2VyKTsKLQlwc3lfY2ZnLmRydl9kYXRhID0gY2hhcmdlcjsKLQotCW11dGV4X2luaXQoJmNoYXJnZXItPndvcmtfbG9jayk7Ci0KLQlpZiAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCAmJiBncGlvX2lzX3ZhbGlkKGluZm8tPmNoYXJnZV9ncGlvKSkgewotCQlyZXQgPSBncGlvX3JlcXVlc3QoaW5mby0+Y2hhcmdlX2dwaW8sICJCQVRUIENIUkciKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOwotCi0JCXJldCA9IGdwaW9fZGlyZWN0aW9uX2lucHV0KGluZm8tPmNoYXJnZV9ncGlvKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyMjsKLQotCQlpcnFfc2V0X2lycV90eXBlKGdwaW9fdG9faXJxKGluZm8tPmNoYXJnZV9ncGlvKSwKLQkJCQkgSVJRX1RZUEVfRURHRV9CT1RIKTsKLQkJcmV0ID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEoaW5mby0+Y2hhcmdlX2dwaW8pLAotCQkJCXoyX2NoYXJnZV9zd2l0Y2hfaXJxLCAwLAotCQkJCSJBQyBEZXRlY3QiLCBjaGFyZ2VyKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyMzsKLQl9Ci0KLQlyZXQgPSB6Ml9iYXR0X3BzX2luaXQoY2hhcmdlciwgcHJvcHMpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyMzsKLQotCUlOSVRfV09SSygmY2hhcmdlci0+YmF0X3dvcmssIHoyX2JhdHRfd29yayk7Ci0KLQljaGFyZ2VyLT5iYXR0X3BzID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKLQkJCQkJCSAmY2hhcmdlci0+YmF0dF9wc19kZXNjLAotCQkJCQkJICZwc3lfY2ZnKTsKLQlpZiAoSVNfRVJSKGNoYXJnZXItPmJhdHRfcHMpKSB7Ci0JCXJldCA9IFBUUl9FUlIoY2hhcmdlci0+YmF0dF9wcyk7Ci0JCWdvdG8gZXJyNDsKLQl9Ci0KLQlzY2hlZHVsZV93b3JrKCZjaGFyZ2VyLT5iYXRfd29yayk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyNDoKLQlrZnJlZShjaGFyZ2VyLT5iYXR0X3BzX2Rlc2MucHJvcGVydGllcyk7Ci1lcnIzOgotCWlmIChpbmZvLT5jaGFyZ2VfZ3BpbyA+PSAwICYmIGdwaW9faXNfdmFsaWQoaW5mby0+Y2hhcmdlX2dwaW8pKQotCQlmcmVlX2lycShncGlvX3RvX2lycShpbmZvLT5jaGFyZ2VfZ3BpbyksIGNoYXJnZXIpOwotZXJyMjoKLQlpZiAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCAmJiBncGlvX2lzX3ZhbGlkKGluZm8tPmNoYXJnZV9ncGlvKSkKLQkJZ3Bpb19mcmVlKGluZm8tPmNoYXJnZV9ncGlvKTsKLWVycjoKLQlrZnJlZShjaGFyZ2VyKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHoyX2JhdHRfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvICppbmZvID0gY2hhcmdlci0+aW5mbzsKLQotCWNhbmNlbF93b3JrX3N5bmMoJmNoYXJnZXItPmJhdF93b3JrKTsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihjaGFyZ2VyLT5iYXR0X3BzKTsKLQotCWtmcmVlKGNoYXJnZXItPmJhdHRfcHNfZGVzYy5wcm9wZXJ0aWVzKTsKLQlpZiAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCAmJiBncGlvX2lzX3ZhbGlkKGluZm8tPmNoYXJnZV9ncGlvKSkgewotCQlmcmVlX2lycShncGlvX3RvX2lycShpbmZvLT5jaGFyZ2VfZ3BpbyksIGNoYXJnZXIpOwotCQlncGlvX2ZyZWUoaW5mby0+Y2hhcmdlX2dwaW8pOwotCX0KLQotCWtmcmVlKGNoYXJnZXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgejJfYmF0dF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwotCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0KLQlmbHVzaF93b3JrKCZjaGFyZ2VyLT5iYXRfd29yayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgejJfYmF0dF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Ci0Jc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCXNjaGVkdWxlX3dvcmsoJmNoYXJnZXItPmJhdF93b3JrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHoyX2JhdHRlcnlfcG1fb3BzID0gewotCS5zdXNwZW5kCT0gejJfYmF0dF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gejJfYmF0dF9yZXN1bWUsCi19OwotCi0jZGVmaW5lCVoyX0JBVFRFUllfUE1fT1BTCSgmejJfYmF0dGVyeV9wbV9vcHMpCi0KLSNlbHNlCi0jZGVmaW5lCVoyX0JBVFRFUllfUE1fT1BTCShOVUxMKQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB6Ml9iYXR0X2lkW10gPSB7Ci0JeyAiYWVyOTE1IiwgMCB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCB6Ml9iYXR0X2lkKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHoyX2JhdHRfZHJpdmVyID0gewotCS5kcml2ZXIJPSB7Ci0JCS5uYW1lCT0gInoyLWJhdHRlcnkiLAotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkJLnBtCT0gWjJfQkFUVEVSWV9QTV9PUFMKLQl9LAotCS5wcm9iZQkJPSB6Ml9iYXR0X3Byb2JlLAotCS5yZW1vdmUJCT0gejJfYmF0dF9yZW1vdmUsCi0JLmlkX3RhYmxlCT0gejJfYmF0dF9pZCwKLX07Ci1tb2R1bGVfaTJjX2RyaXZlcih6Ml9iYXR0X2RyaXZlcik7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIlBldGVyIEVkd2FyZHMgPHN3ZWV0bGlsbXJlQGdtYWlsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiWmlwaXQgWjIgYmF0dGVyeSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXJjYXAvaW50ZWxfcmFwbC5jIGIvZHJpdmVycy9wb3dlcmNhcC9pbnRlbF9yYXBsLmMKaW5kZXggZmJhYjI5ZC4uMjQzYjIzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlcmNhcC9pbnRlbF9yYXBsLmMKKysrIGIvZHJpdmVycy9wb3dlcmNhcC9pbnRlbF9yYXBsLmMKQEAgLTExNTQsOCArMTE1NCw4IEBACiAKIAlSQVBMX0NQVShJTlRFTF9GQU02X0FUT01fU0lMVkVSTU9OVDEsCXJhcGxfZGVmYXVsdHNfYnl0KSwKIAlSQVBMX0NQVShJTlRFTF9GQU02X0FUT01fQUlSTU9OVCwJcmFwbF9kZWZhdWx0c19jaHQpLAotCVJBUExfQ1BVKElOVEVMX0ZBTTZfQVRPTV9NRVJSSUZJRUxEMSwJcmFwbF9kZWZhdWx0c190bmcpLAotCVJBUExfQ1BVKElOVEVMX0ZBTTZfQVRPTV9NRVJSSUZJRUxEMiwJcmFwbF9kZWZhdWx0c19hbm4pLAorCVJBUExfQ1BVKElOVEVMX0ZBTTZfQVRPTV9NRVJSSUZJRUxELAlyYXBsX2RlZmF1bHRzX3RuZyksCisJUkFQTF9DUFUoSU5URUxfRkFNNl9BVE9NX01PT1JFRklFTEQsCXJhcGxfZGVmYXVsdHNfYW5uKSwKIAlSQVBMX0NQVShJTlRFTF9GQU02X0FUT01fR09MRE1PTlQsCXJhcGxfZGVmYXVsdHNfY29yZSksCiAJUkFQTF9DUFUoSU5URUxfRkFNNl9BVE9NX0RFTlZFUlRPTiwJcmFwbF9kZWZhdWx0c19jb3JlKSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wczMvcHMzLXZ1YXJ0LmMgYi9kcml2ZXJzL3BzMy9wczMtdnVhcnQuYwppbmRleCA2MzI3MDFhLi5iN2YzMDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BzMy9wczMtdnVhcnQuYworKysgYi9kcml2ZXJzL3BzMy9wczMtdnVhcnQuYwpAQCAtOTU4LDcgKzk1OCw3IEBACiAKIGZhaWxfcmVxdWVzdF9pcnE6CiAJcHMzX3Z1YXJ0X2lycV9kZXN0cm95KHZ1YXJ0X2J1c19wcml2LnZpcnEpOwotCXZ1YXJ0X2J1c19wcml2LnZpcnEgPSBOT19JUlE7CisJdnVhcnRfYnVzX3ByaXYudmlycSA9IDA7CiBmYWlsX2FsbG9jX2lycToKIAlrZnJlZSh2dWFydF9idXNfcHJpdi5ibXApOwogCXZ1YXJ0X2J1c19wcml2LmJtcCA9IE5VTEw7CkBAIC05ODIsNyArOTgyLDcgQEAKIAlmcmVlX2lycSh2dWFydF9idXNfcHJpdi52aXJxLCAmdnVhcnRfYnVzX3ByaXYpOwogCiAJcHMzX3Z1YXJ0X2lycV9kZXN0cm95KHZ1YXJ0X2J1c19wcml2LnZpcnEpOwotCXZ1YXJ0X2J1c19wcml2LnZpcnEgPSBOT19JUlE7CisJdnVhcnRfYnVzX3ByaXYudmlycSA9IDA7CiAKIAlrZnJlZSh2dWFydF9idXNfcHJpdi5ibXApOwogCXZ1YXJ0X2J1c19wcml2LmJtcCA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3B0cC9wdHBfY2xvY2suYyBiL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCmluZGV4IDJlNDgxYjkuLjg2MjgwYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCisrKyBiL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jCkBAIC0yNjMsNiArMjYzLDcgQEAKIG5vX2RldmljZToKIAltdXRleF9kZXN0cm95KCZwdHAtPnRzZXZxX211eCk7CiAJbXV0ZXhfZGVzdHJveSgmcHRwLT5waW5jZmdfbXV4KTsKKwlpZGFfc2ltcGxlX3JlbW92ZSgmcHRwX2Nsb2Nrc19tYXAsIGluZGV4KTsKIG5vX3Nsb3Q6CiAJa2ZyZWUocHRwKTsKIG5vX21lbW9yeToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHRwL3B0cF9peHA0NnguYyBiL2RyaXZlcnMvcHRwL3B0cF9peHA0NnguYwppbmRleCBlZTRmMTgzLi4zNDRhM2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3B0cC9wdHBfaXhwNDZ4LmMKKysrIGIvZHJpdmVycy9wdHAvcHRwX2l4cDQ2eC5jCkBAIC0yNjgsMTggKzI2OCwxOSBAQAogCQlyZXR1cm4gZXJyOwogCiAJaXJxID0gZ3Bpb190b19pcnEoZ3Bpbyk7CisJaWYgKGlycSA8IDApCisJCXJldHVybiBpcnE7CiAKLQlpZiAoTk9fSVJRID09IGlycSkKLQkJcmV0dXJuIE5PX0lSUTsKLQotCWlmIChpcnFfc2V0X2lycV90eXBlKGlycSwgSVJRRl9UUklHR0VSX0ZBTExJTkcpKSB7CisJZXJyID0gaXJxX3NldF9pcnFfdHlwZShpcnEsIElSUUZfVFJJR0dFUl9GQUxMSU5HKTsKKwlpZiAoZXJyKSB7CiAJCXByX2VycigiY2Fubm90IHNldCB0cmlnZ2VyIHR5cGUgZm9yIGlycSAlZFxuIiwgaXJxKTsKLQkJcmV0dXJuIE5PX0lSUTsKKwkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBpc3IsIDAsIERSSVZFUiwgJml4cF9jbG9jaykpIHsKKwllcnIgPSByZXF1ZXN0X2lycShpcnEsIGlzciwgMCwgRFJJVkVSLCAmaXhwX2Nsb2NrKTsKKwlpZiAoZXJyKSB7CiAJCXByX2VycigicmVxdWVzdF9pcnEgZmFpbGVkIGZvciBpcnEgJWRcbiIsIGlycSk7Ci0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiBlcnI7CiAJfQogCiAJcmV0dXJuIGlycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL3RzaTcyMS5jIGIvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMKaW5kZXggMzJmMGYwMS4uOWQxOWI5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMKKysrIGIvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmMKQEAgLTExNjEsNyArMTE2MSw3IEBACiAJCX0gZWxzZSBpZiAoaWJ3X3N0YXJ0IDwgKGliX3dpbi0+cnN0YXJ0ICsgaWJfd2luLT5zaXplKSAmJgogCQkJICAgKGlid19zdGFydCArIGlid19zaXplKSA+IGliX3dpbi0+cnN0YXJ0KSB7CiAJCQkvKiBSZXR1cm4gZXJyb3IgaWYgYWRkcmVzcyB0cmFuc2xhdGlvbiBpbnZvbHZlZCAqLwotCQkJaWYgKGRpcmVjdCAmJiBpYl93aW4tPnhsYXQpIHsKKwkJCWlmICghZGlyZWN0IHx8IGliX3dpbi0+eGxhdCkgewogCQkJCXJldCA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vcmlvX2NtLmMgYi9kcml2ZXJzL3JhcGlkaW8vcmlvX2NtLmMKaW5kZXggM2ZhMTdhYy4uY2ViYzI5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yYXBpZGlvL3Jpb19jbS5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9yaW9fY20uYwpAQCAtMjI0NywxNyArMjI0NywzMCBAQAogewogCXN0cnVjdCByaW9fY2hhbm5lbCAqY2g7CiAJdW5zaWduZWQgaW50IGk7CisJTElTVF9IRUFEKGxpc3QpOwogCiAJcmlvY21fZGVidWcoRVhJVCwgIi4iKTsKIAorCS8qCisJICogSWYgdGhlcmUgYXJlIGFueSBjaGFubmVscyBsZWZ0IGluIGNvbm5lY3RlZCBzdGF0ZSBzZW5kCisJICogY2xvc2Ugbm90aWZpY2F0aW9uIHRvIHRoZSBjb25uZWN0aW9uIHBhcnRuZXIuCisJICogRmlyc3QgYnVpbGQgYSBsaXN0IG9mIGNoYW5uZWxzIHRoYXQgcmVxdWlyZSBhIGNsb3NpbmcKKwkgKiBub3RpZmljYXRpb24gYmVjYXVzZSBmdW5jdGlvbiByaW9jbV9zZW5kX2Nsb3NlKCkgc2hvdWxkCisJICogYmUgY2FsbGVkIG91dHNpZGUgb2Ygc3BpbmxvY2sgcHJvdGVjdGVkIGNvZGUuCisJICovCiAJc3Bpbl9sb2NrX2JoKCZpZHJfbG9jayk7CiAJaWRyX2Zvcl9lYWNoX2VudHJ5KCZjaF9pZHIsIGNoLCBpKSB7Ci0JCXJpb2NtX2RlYnVnKEVYSVQsICJjbG9zZSBjaCAlZCIsIGNoLT5pZCk7Ci0JCWlmIChjaC0+c3RhdGUgPT0gUklPX0NNX0NPTk5FQ1RFRCkKLQkJCXJpb2NtX3NlbmRfY2xvc2UoY2gpOworCQlpZiAoY2gtPnN0YXRlID09IFJJT19DTV9DT05ORUNURUQpIHsKKwkJCXJpb2NtX2RlYnVnKEVYSVQsICJjbG9zZSBjaCAlZCIsIGNoLT5pZCk7CisJCQlpZHJfcmVtb3ZlKCZjaF9pZHIsIGNoLT5pZCk7CisJCQlsaXN0X2FkZCgmY2gtPmNoX25vZGUsICZsaXN0KTsKKwkJfQogCX0KIAlzcGluX3VubG9ja19iaCgmaWRyX2xvY2spOwogCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaCwgJmxpc3QsIGNoX25vZGUpCisJCXJpb2NtX3NlbmRfY2xvc2UoY2gpOworCiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwppbmRleCA2Yzg4ZTMxLi45MzZmN2NjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKQEAgLTMyMyw3ICszMjMsNyBAQAogCiBjb25maWcgUkVHVUxBVE9SX0xQODczWAogCXRyaXN0YXRlICJUSSBMUDg3M1ggUG93ZXIgcmVndWxhdG9ycyIKLQlkZXBlbmRzIG9uIE1GRF9MUDg3M1ggJiYgT0YKKwlkZXBlbmRzIG9uIE1GRF9USV9MUDg3M1ggJiYgT0YKIAloZWxwCiAJICBUaGlzIGRyaXZlciBzdXBwb3J0cyBMUDg3M1ggdm9sdGFnZSByZWd1bGF0b3IgY2hpcHMuIExQODczWAogCSAgcHJvdmlkZXMgdHdvIHN0ZXAtZG93biBjb252ZXJ0ZXJzIGFuZCB0d28gZ2VuZXJhbC1wdXJwb3NlIExETwpAQCAtMzUzLDYgKzM1MywxNCBAQAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMVEMzNTg5LCBMVEMzNTg5LTEsIGFuZCBMVEMzNTg5LTIKIAkgIDgtb3V0cHV0IHJlZ3VsYXRvcnMgY29udHJvbGxlZCB2aWEgSTJDLgogCitjb25maWcgUkVHVUxBVE9SX0xUQzM2NzYKKwl0cmlzdGF0ZSAiTFRDMzY3NiA4LW91dHB1dCB2b2x0YWdlIHJlZ3VsYXRvciIKKwlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBSRUdNQVBfSTJDCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBMVEMzNjc2CisJICA4LW91dHB1dCByZWd1bGF0b3JzIGNvbnRyb2xsZWQgdmlhIEkyQy4KKwogY29uZmlnIFJFR1VMQVRPUl9NQVgxNDU3NwogCXRyaXN0YXRlICJNYXhpbSAxNDU3Ny83NzgzNiByZWd1bGF0b3IiCiAJZGVwZW5kcyBvbiBNRkRfTUFYMTQ1NzcKQEAgLTYzNSwxMSArNjQzLDExIEBACiAJICBvdXRwdXRzIHdoaWNoIGNhbiBiZSBjb250cm9sbGVkIGJ5IGkyYyBjb21tdW5pY2F0aW9uLgogCiBjb25maWcgUkVHVUxBVE9SX1JLODA4Ci0JdHJpc3RhdGUgIlJvY2tjaGlwIFJLODA4IFBvd2VyIHJlZ3VsYXRvcnMiCisJdHJpc3RhdGUgIlJvY2tjaGlwIFJLODA4L1JLODE4IFBvd2VyIHJlZ3VsYXRvcnMiCiAJZGVwZW5kcyBvbiBNRkRfUks4MDgKIAloZWxwCiAJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIHRoZSBwb3dlciByZWd1bGF0b3Igb2YgUk9DS0NISVAKLQkgIFBNSUMgUks4MDguCisJICBQTUlDIFJLODA4IGFuZCBSSzgxOC4KIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBjb250cm9sIG9mIGRpZmZlcmVudCBwb3dlciByYWlscyBvZiBkZXZpY2UKIAkgIHRocm91Z2ggcmVndWxhdG9yIGludGVyZmFjZS4gVGhlIGRldmljZSBzdXBwb3J0cyBtdWx0aXBsZSBEQ0RDL0xETwogCSAgb3V0cHV0cyB3aGljaCBjYW4gYmUgY29udHJvbGxlZCBieSBpMmMgY29tbXVuaWNhdGlvbi4KQEAgLTgyMCw3ICs4MjgsNyBAQAogCSAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyBUUFM2NTkxMiB2b2x0YWdlIHJlZ3VsYXRvciBjaGlwLgogCiBjb25maWcgUkVHVUxBVE9SX1RQUzgwMDMxCi0JdHJpc3RhdGUgIlRJIFRQUzgwMDMxL1RQUzgwMDMyIHBvd2VyIHJlZ3VhbHRvciBkcml2ZXIiCisJdHJpc3RhdGUgIlRJIFRQUzgwMDMxL1RQUzgwMDMyIHBvd2VyIHJlZ3VsYXRvciBkcml2ZXIiCiAJZGVwZW5kcyBvbiBNRkRfVFBTODAwMzEKIAloZWxwCiAJICBUUFM4MDAzMS8gVFBTODAwMzIgRnVsbHkgSW50ZWdyYXRlZCBQb3dlciBNYW5hZ2VtZW50IHdpdGggUG93ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKaW5kZXggZjNkYTllZS4uMjE0MmE1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKQEAgLTQ3LDYgKzQ3LDcgQEAKIG9iai0kKENPTkZJR19SRUdVTEFUT1JfTFA4Nzg4KSArPSBscDg3ODgtbGRvLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfTFA4NzU1KSArPSBscDg3NTUubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9MVEMzNTg5KSArPSBsdGMzNTg5Lm8KK29iai0kKENPTkZJR19SRUdVTEFUT1JfTFRDMzY3NikgKz0gbHRjMzY3Ni5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX01BWDE0NTc3KSArPSBtYXgxNDU3Ny1yZWd1bGF0b3Iubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9NQVgxNTg2KSArPSBtYXgxNTg2Lm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfTUFYNzc2MjApICs9IG1heDc3NjIwLXJlZ3VsYXRvci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9heHAyMHgtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9heHAyMHgtcmVndWxhdG9yLmMKaW5kZXggNmQ5YWM3Ni4uNTQzODJlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYXhwMjB4LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2F4cDIweC1yZWd1bGF0b3IuYwpAQCAtMjQ0LDE2ICsyNDQsNjQgQEAKIAkub3BzCQk9ICZheHAyMHhfb3BzX3N3LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlIGF4cDgwNl9kY2RjYV9yYW5nZXNbXSA9IHsKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDYwMDAwMCwgMHgwLCAweDMyLCAxMDAwMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxMTIwMDAwLCAweDMzLCAweDQ3LCAyMDAwMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2UgYXhwODA2X2RjZGNkX3Jhbmdlc1tdID0geworCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoNjAwMDAwLCAweDAsIDB4MmQsIDIwMDAwKSwKKwlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDE2MDAwMDAsIDB4MmUsIDB4M2YsIDEwMDAwMCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2UgYXhwODA2X2NsZG8yX3Jhbmdlc1tdID0geworCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoNzAwMDAwLCAweDAsIDB4MWEsIDEwMDAwMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgzNDAwMDAwLCAweDFiLCAweDFmLCAyMDAwMDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyBheHA4MDZfcmVndWxhdG9yc1tdID0geworCUFYUF9ERVNDX1JBTkdFUyhBWFA4MDYsIERDRENBLCAiZGNkY2EiLCAidmluYSIsIGF4cDgwNl9kY2RjYV9yYW5nZXMsCisJCQk3MiwgQVhQODA2X0RDRENBX1ZfQ1RSTCwgMHg3ZiwgQVhQODA2X1BXUl9PVVRfQ1RSTDEsCisJCQlCSVQoMCkpLAorCUFYUF9ERVNDKEFYUDgwNiwgRENEQ0IsICJkY2RjYiIsICJ2aW5iIiwgMTAwMCwgMjU1MCwgNTAsCisJCSBBWFA4MDZfRENEQ0JfVl9DVFJMLCAweDFmLCBBWFA4MDZfUFdSX09VVF9DVFJMMSwgQklUKDEpKSwKKwlBWFBfREVTQ19SQU5HRVMoQVhQODA2LCBEQ0RDQywgImRjZGNjIiwgInZpbmMiLCBheHA4MDZfZGNkY2FfcmFuZ2VzLAorCQkJNzIsIEFYUDgwNl9EQ0RDQ19WX0NUUkwsIDB4N2YsIEFYUDgwNl9QV1JfT1VUX0NUUkwxLAorCQkJQklUKDIpKSwKKwlBWFBfREVTQ19SQU5HRVMoQVhQODA2LCBEQ0RDRCwgImRjZGNkIiwgInZpbmQiLCBheHA4MDZfZGNkY2RfcmFuZ2VzLAorCQkJNjQsIEFYUDgwNl9EQ0RDRF9WX0NUUkwsIDB4M2YsIEFYUDgwNl9QV1JfT1VUX0NUUkwxLAorCQkJQklUKDMpKSwKKwlBWFBfREVTQyhBWFA4MDYsIERDRENFLCAiZGNkY2UiLCAidmluZSIsIDExMDAsIDM0MDAsIDEwMCwKKwkJIEFYUDgwNl9EQ0RDQl9WX0NUUkwsIDB4MWYsIEFYUDgwNl9QV1JfT1VUX0NUUkwxLCBCSVQoNCkpLAorCUFYUF9ERVNDKEFYUDgwNiwgQUxETzEsICJhbGRvMSIsICJhbGRvaW4iLCA3MDAsIDMzMDAsIDEwMCwKKwkJIEFYUDgwNl9BTERPMV9WX0NUUkwsIDB4MWYsIEFYUDgwNl9QV1JfT1VUX0NUUkwxLCBCSVQoNSkpLAorCUFYUF9ERVNDKEFYUDgwNiwgQUxETzIsICJhbGRvMiIsICJhbGRvaW4iLCA3MDAsIDM0MDAsIDEwMCwKKwkJIEFYUDgwNl9BTERPMl9WX0NUUkwsIDB4MWYsIEFYUDgwNl9QV1JfT1VUX0NUUkwxLCBCSVQoNikpLAorCUFYUF9ERVNDKEFYUDgwNiwgQUxETzMsICJhbGRvMyIsICJhbGRvaW4iLCA3MDAsIDMzMDAsIDEwMCwKKwkJIEFYUDgwNl9BTERPM19WX0NUUkwsIDB4MWYsIEFYUDgwNl9QV1JfT1VUX0NUUkwxLCBCSVQoNykpLAorCUFYUF9ERVNDKEFYUDgwNiwgQkxETzEsICJibGRvMSIsICJibGRvaW4iLCA3MDAsIDE5MDAsIDEwMCwKKwkJIEFYUDgwNl9CTERPMV9WX0NUUkwsIDB4MGYsIEFYUDgwNl9QV1JfT1VUX0NUUkwyLCBCSVQoMCkpLAorCUFYUF9ERVNDKEFYUDgwNiwgQkxETzIsICJibGRvMiIsICJibGRvaW4iLCA3MDAsIDE5MDAsIDEwMCwKKwkJIEFYUDgwNl9CTERPMl9WX0NUUkwsIDB4MGYsIEFYUDgwNl9QV1JfT1VUX0NUUkwyLCBCSVQoMSkpLAorCUFYUF9ERVNDKEFYUDgwNiwgQkxETzMsICJibGRvMyIsICJibGRvaW4iLCA3MDAsIDE5MDAsIDEwMCwKKwkJIEFYUDgwNl9CTERPM19WX0NUUkwsIDB4MGYsIEFYUDgwNl9QV1JfT1VUX0NUUkwyLCBCSVQoMikpLAorCUFYUF9ERVNDKEFYUDgwNiwgQkxETzQsICJibGRvNCIsICJibGRvaW4iLCA3MDAsIDE5MDAsIDEwMCwKKwkJIEFYUDgwNl9CTERPNF9WX0NUUkwsIDB4MGYsIEFYUDgwNl9QV1JfT1VUX0NUUkwyLCBCSVQoMykpLAorCUFYUF9ERVNDKEFYUDgwNiwgQ0xETzEsICJjbGRvMSIsICJjbGRvaW4iLCA3MDAsIDMzMDAsIDEwMCwKKwkJIEFYUDgwNl9DTERPMV9WX0NUUkwsIDB4MWYsIEFYUDgwNl9QV1JfT1VUX0NUUkwyLCBCSVQoNCkpLAorCUFYUF9ERVNDX1JBTkdFUyhBWFA4MDYsIENMRE8yLCAiY2xkbzIiLCAiY2xkb2luIiwgYXhwODA2X2NsZG8yX3JhbmdlcywKKwkJCTMyLCBBWFA4MDZfQ0xETzJfVl9DVFJMLCAweDFmLCBBWFA4MDZfUFdSX09VVF9DVFJMMiwKKwkJCUJJVCg1KSksCisJQVhQX0RFU0MoQVhQODA2LCBDTERPMywgImNsZG8zIiwgImNsZG9pbiIsIDcwMCwgMzMwMCwgMTAwLAorCQkgQVhQODA2X0NMRE8zX1ZfQ1RSTCwgMHgxZiwgQVhQODA2X1BXUl9PVVRfQ1RSTDIsIEJJVCg2KSksCisJQVhQX0RFU0NfU1coQVhQODA2LCBTVywgInN3IiwgInN3aW4iLCBBWFA4MDZfUFdSX09VVF9DVFJMMiwgQklUKDcpKSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZSBheHA4MDlfZGNkYzRfcmFuZ2VzW10gPSB7CiAJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg2MDAwMDAsIDB4MCwgMHgyZiwgMjAwMDApLAogCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTgwMDAwMCwgMHgzMCwgMHgzOCwgMTAwMDAwKSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZSBheHA4MDlfZGxkbzFfcmFuZ2VzW10gPSB7Ci0JUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg3MDAwMDAsIDB4MCwgMHgxYSwgMTAwMDAwKSwKLQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDM0MDAwMDAsIDB4MWIsIDB4MWYsIDIwMDAwMCksCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIGF4cDgwOV9yZWd1bGF0b3JzW10gPSB7CiAJQVhQX0RFU0MoQVhQODA5LCBEQ0RDMSwgImRjZGMxIiwgInZpbjEiLCAxNjAwLCAzNDAwLCAxMDAsCiAJCSBBWFAyMlhfRENEQzFfVl9PVVQsIDB4MWYsIEFYUDIyWF9QV1JfT1VUX0NUUkwxLCBCSVQoMSkpLApAQCAtMjc4LDcgKzMyNiw3IEBACiAJCSBBWFAyMlhfQUxETzJfVl9PVVQsIDB4MWYsIEFYUDIyWF9QV1JfT1VUX0NUUkwxLCBCSVQoNykpLAogCUFYUF9ERVNDKEFYUDgwOSwgQUxETzMsICJhbGRvMyIsICJhbGRvaW4iLCA3MDAsIDMzMDAsIDEwMCwKIAkJIEFYUDIyWF9BTERPM19WX09VVCwgMHgxZiwgQVhQMjJYX1BXUl9PVVRfQ1RSTDIsIEJJVCg1KSksCi0JQVhQX0RFU0NfUkFOR0VTKEFYUDgwOSwgRExETzEsICJkbGRvMSIsICJkbGRvaW4iLCBheHA4MDlfZGxkbzFfcmFuZ2VzLAorCUFYUF9ERVNDX1JBTkdFUyhBWFA4MDksIERMRE8xLCAiZGxkbzEiLCAiZGxkb2luIiwgYXhwODA2X2NsZG8yX3JhbmdlcywKIAkJCTMyLCBBWFAyMlhfRExETzFfVl9PVVQsIDB4MWYsIEFYUDIyWF9QV1JfT1VUX0NUUkwyLAogCQkJQklUKDMpKSwKIAlBWFBfREVTQyhBWFA4MDksIERMRE8yLCAiZGxkbzIiLCAiZGxkb2luIiwgNzAwLCAzMzAwLCAxMDAsCkBAIC0zMDIsNiArMzUwLDcgQEAKIHN0YXRpYyBpbnQgYXhwMjB4X3NldF9kY2RjX2ZyZXEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdTMyIGRjZGNmcmVxKQogewogCXN0cnVjdCBheHAyMHhfZGV2ICpheHAyMHggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJdW5zaWduZWQgaW50IHJlZyA9IEFYUDIwWF9EQ0RDX0ZSRVE7CiAJdTMyIG1pbiwgbWF4LCBkZWYsIHN0ZXA7CiAKIAlzd2l0Y2ggKGF4cDIweC0+dmFyaWFudCkgewpAQCAtMzEyLDYgKzM2MSwxNCBAQAogCQlkZWYgPSAxNTAwOwogCQlzdGVwID0gNzU7CiAJCWJyZWFrOworCWNhc2UgQVhQODA2X0lEOgorCQkvKgorCQkgKiBBWFA4MDYgRENEQyB3b3JrIGZyZXF1ZW5jeSBzZXR0aW5nIGhhcyB0aGUgc2FtZSByYW5nZSBhbmQKKwkJICogc3RlcCBhcyBBWFAyMlgsIGJ1dCBhdCBhIGRpZmZlcmVudCByZWdpc3Rlci4KKwkJICogRmFsbCB0aHJvdWdoIHRvIHRoZSBjaGVjayBiZWxvdy4KKwkJICogKFNlZSBpbmNsdWRlL2xpbnV4L21mZC9heHAyMHguaCkKKwkJICovCisJCXJlZyA9IEFYUDgwNl9EQ0RDX0ZSRVFfQ1RSTDsKIAljYXNlIEFYUDIyMV9JRDoKIAljYXNlIEFYUDIyM19JRDoKIAljYXNlIEFYUDgwOV9JRDoKQEAgLTM0Myw3ICs0MDAsNyBAQAogCiAJZGNkY2ZyZXEgPSAoZGNkY2ZyZXEgLSBtaW4pIC8gc3RlcDsKIAotCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoYXhwMjB4LT5yZWdtYXAsIEFYUDIwWF9EQ0RDX0ZSRVEsCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhheHAyMHgtPnJlZ21hcCwgcmVnLAogCQkJCSAgQVhQMjBYX0ZSRVFfRENEQ19NQVNLLCBkY2RjZnJlcSk7CiB9CiAKQEAgLTM3Nyw2ICs0MzQsNyBAQAogc3RhdGljIGludCBheHAyMHhfc2V0X2RjZGNfd29ya21vZGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsIGludCBpZCwgdTMyIHdvcmttb2RlKQogewogCXN0cnVjdCBheHAyMHhfZGV2ICpheHAyMHggPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXVuc2lnbmVkIGludCByZWcgPSBBWFAyMFhfRENEQ19NT0RFOwogCXVuc2lnbmVkIGludCBtYXNrOwogCiAJc3dpdGNoIChheHAyMHgtPnZhcmlhbnQpIHsKQEAgLTM5Miw2ICs0NTAsMTMgQEAKIAkJd29ya21vZGUgPDw9IGZmcyhtYXNrKSAtIDE7CiAJCWJyZWFrOwogCisJY2FzZSBBWFA4MDZfSUQ6CisJCXJlZyA9IEFYUDgwNl9EQ0RDX01PREVfQ1RSTDI7CisJCS8qCisJCSAqIEFYUDgwNiBEQ0RDIHJlZ3VsYXRvciBJRHMgaGF2ZSB0aGUgc2FtZSByYW5nZSBhcyBBWFAyMlguCisJCSAqIEZhbGwgdGhyb3VnaCB0byB0aGUgY2hlY2sgYmVsb3cuCisJCSAqIChTZWUgaW5jbHVkZS9saW51eC9tZmQvYXhwMjB4LmgpCisJCSAqLwogCWNhc2UgQVhQMjIxX0lEOgogCWNhc2UgQVhQMjIzX0lEOgogCWNhc2UgQVhQODA5X0lEOgpAQCAtNDA4LDcgKzQ3MywzNCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJkZXYtPnJlZ21hcCwgQVhQMjBYX0RDRENfTU9ERSwgbWFzaywgd29ya21vZGUpOworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLCByZWcsIG1hc2ssIHdvcmttb2RlKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgYSByZWd1bGF0b3IgaXMgcGFydCBvZiBhIHBvbHktcGhhc2UKKyAqIG91dHB1dCBzZXR1cCBiYXNlZCBvbiB0aGUgcmVnaXN0ZXJzIHNldHRpbmdzLiBSZXR1cm5zIHRydWUgaWYgaXQgaXMuCisgKi8KK3N0YXRpYyBib29sIGF4cDIweF9pc19wb2x5cGhhc2Vfc2xhdmUoc3RydWN0IGF4cDIweF9kZXYgKmF4cDIweCwgaW50IGlkKQoreworCXUzMiByZWcgPSAwOworCisJLyogT25seSBBWFA4MDYgaGFzIHBvbHktcGhhc2Ugb3V0cHV0cyAqLworCWlmIChheHAyMHgtPnZhcmlhbnQgIT0gQVhQODA2X0lEKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZWdtYXBfcmVhZChheHAyMHgtPnJlZ21hcCwgQVhQODA2X0RDRENfTU9ERV9DVFJMMiwgJnJlZyk7CisKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBBWFA4MDZfRENEQ0I6CisJCXJldHVybiAoKChyZWcgJiBHRU5NQVNLKDcsIDYpKSA9PSBCSVQoNikpIHx8CisJCQkoKHJlZyAmIEdFTk1BU0soNywgNikpID09IEJJVCg3KSkpOworCWNhc2UgQVhQODA2X0RDRENDOgorCQlyZXR1cm4gKChyZWcgJiBHRU5NQVNLKDcsIDYpKSA9PSBCSVQoNykpOworCWNhc2UgQVhQODA2X0RDRENFOgorCQlyZXR1cm4gISEocmVnICYgQklUKDUpKTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHN0YXRpYyBpbnQgYXhwMjB4X3JlZ3VsYXRvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtNDQwLDYgKzUzMiwxMCBAQAogCQlkcml2ZXZidXMgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSwKIAkJCQkJCSAgIngtcG93ZXJzLGRyaXZlLXZidXMtZW4iKTsKIAkJYnJlYWs7CisJY2FzZSBBWFA4MDZfSUQ6CisJCXJlZ3VsYXRvcnMgPSBheHA4MDZfcmVndWxhdG9yczsKKwkJbnJlZ3VsYXRvcnMgPSBBWFA4MDZfUkVHX0lEX01BWDsKKwkJYnJlYWs7CiAJY2FzZSBBWFA4MDlfSUQ6CiAJCXJlZ3VsYXRvcnMgPSBheHA4MDlfcmVndWxhdG9yczsKIAkJbnJlZ3VsYXRvcnMgPSBBWFA4MDlfUkVHX0lEX01BWDsKQEAgLTQ1OCw2ICs1NTQsMTQgQEAKIAkJc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpuZXdfZGVzYzsKIAogCQkvKgorCQkgKiBJZiB0aGlzIHJlZ3VsYXRvciBpcyBhIHNsYXZlIGluIGEgcG9seS1waGFzZSBzZXR1cCwKKwkJICogc2tpcCBpdCwgYXMgaXRzIGNvbnRyb2xzIGFyZSBib3VuZCB0byB0aGUgbWFzdGVyCisJCSAqIHJlZ3VsYXRvciBhbmQgd29uJ3Qgd29yay4KKwkJICovCisJCWlmIChheHAyMHhfaXNfcG9seXBoYXNlX3NsYXZlKGF4cDIweCwgaSkpCisJCQljb250aW51ZTsKKworCQkvKgogCQkgKiBSZWd1bGF0b3JzIERDMVNXIGFuZCBEQzVMRE8gYXJlIGNvbm5lY3RlZCBpbnRlcm5hbGx5LAogCQkgKiBzbyB3ZSBoYXZlIHRvIGhhbmRsZSB0aGVpciBzdXBwbHkgbmFtZXMgc2VwYXJhdGVseS4KIAkJICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwppbmRleCBkYjMyMGU4Li42NzQyNmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCkBAIC02NzksMjQgKzY3OSw2IEBACiAJICAgICFyZGV2LT5kZXNjLT5vcHMtPnNldF9sb2FkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIGdldCBvdXRwdXQgdm9sdGFnZSAqLwotCW91dHB1dF91ViA9IF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldik7Ci0JaWYgKG91dHB1dF91ViA8PSAwKSB7Ci0JCXJkZXZfZXJyKHJkZXYsICJpbnZhbGlkIG91dHB1dCB2b2x0YWdlIGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogZ2V0IGlucHV0IHZvbHRhZ2UgKi8KLQlpbnB1dF91ViA9IDA7Ci0JaWYgKHJkZXYtPnN1cHBseSkKLQkJaW5wdXRfdVYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldi0+c3VwcGx5KTsKLQlpZiAoaW5wdXRfdVYgPD0gMCkKLQkJaW5wdXRfdVYgPSByZGV2LT5jb25zdHJhaW50cy0+aW5wdXRfdVY7Ci0JaWYgKGlucHV0X3VWIDw9IDApIHsKLQkJcmRldl9lcnIocmRldiwgImludmFsaWQgaW5wdXQgdm9sdGFnZSBmb3VuZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCS8qIGNhbGMgdG90YWwgcmVxdWVzdGVkIGxvYWQgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNpYmxpbmcsICZyZGV2LT5jb25zdW1lcl9saXN0LCBsaXN0KQogCQljdXJyZW50X3VBICs9IHNpYmxpbmctPnVBX2xvYWQ7CkBAIC03MDksNiArNjkxLDI0IEBACiAJCWlmIChlcnIgPCAwKQogCQkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBzZXQgbG9hZCAlZFxuIiwgY3VycmVudF91QSk7CiAJfSBlbHNlIHsKKwkJLyogZ2V0IG91dHB1dCB2b2x0YWdlICovCisJCW91dHB1dF91ViA9IF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldik7CisJCWlmIChvdXRwdXRfdVYgPD0gMCkgeworCQkJcmRldl9lcnIocmRldiwgImludmFsaWQgb3V0cHV0IHZvbHRhZ2UgZm91bmRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBnZXQgaW5wdXQgdm9sdGFnZSAqLworCQlpbnB1dF91ViA9IDA7CisJCWlmIChyZGV2LT5zdXBwbHkpCisJCQlpbnB1dF91ViA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2LT5zdXBwbHkpOworCQlpZiAoaW5wdXRfdVYgPD0gMCkKKwkJCWlucHV0X3VWID0gcmRldi0+Y29uc3RyYWludHMtPmlucHV0X3VWOworCQlpZiAoaW5wdXRfdVYgPD0gMCkgeworCQkJcmRldl9lcnIocmRldiwgImludmFsaWQgaW5wdXQgdm9sdGFnZSBmb3VuZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCiAJCS8qIG5vdyBnZXQgdGhlIG9wdGltdW0gbW9kZSBmb3Igb3VyIG5ldyB0b3RhbCByZWd1bGF0b3IgbG9hZCAqLwogCQltb2RlID0gcmRldi0+ZGVzYy0+b3BzLT5nZXRfb3B0aW11bV9tb2RlKHJkZXYsIGlucHV0X3VWLAogCQkJCQkJCSBvdXRwdXRfdVYsIGN1cnJlbnRfdUEpOwpAQCAtMjc0Myw2ICsyNzQzLDI0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBfcmVndWxhdG9yX3NldF92b2x0YWdlX3RpbWUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJICAgICAgIGludCBvbGRfdVYsIGludCBuZXdfdVYpCit7CisJdW5zaWduZWQgaW50IHJhbXBfZGVsYXkgPSAwOworCisJaWYgKHJkZXYtPmNvbnN0cmFpbnRzLT5yYW1wX2RlbGF5KQorCQlyYW1wX2RlbGF5ID0gcmRldi0+Y29uc3RyYWludHMtPnJhbXBfZGVsYXk7CisJZWxzZSBpZiAocmRldi0+ZGVzYy0+cmFtcF9kZWxheSkKKwkJcmFtcF9kZWxheSA9IHJkZXYtPmRlc2MtPnJhbXBfZGVsYXk7CisKKwlpZiAocmFtcF9kZWxheSA9PSAwKSB7CisJCXJkZXZfd2FybihyZGV2LCAicmFtcF9kZWxheSBub3Qgc2V0XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIERJVl9ST1VORF9VUChhYnMobmV3X3VWIC0gb2xkX3VWKSwgcmFtcF9kZWxheSk7Cit9CisKIHN0YXRpYyBpbnQgX3JlZ3VsYXRvcl9kb19zZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKIAkJCQkgICAgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCiB7CkBAIC0yNzUxLDYgKzI3NjksOCBAQAogCWludCBiZXN0X3ZhbCA9IDA7CiAJdW5zaWduZWQgaW50IHNlbGVjdG9yOwogCWludCBvbGRfc2VsZWN0b3IgPSAtMTsKKwljb25zdCBzdHJ1Y3QgcmVndWxhdG9yX29wcyAqb3BzID0gcmRldi0+ZGVzYy0+b3BzOworCWludCBvbGRfdVYgPSBfcmVndWxhdG9yX2dldF92b2x0YWdlKHJkZXYpOwogCiAJdHJhY2VfcmVndWxhdG9yX3NldF92b2x0YWdlKHJkZXZfZ2V0X25hbWUocmRldiksIG1pbl91ViwgbWF4X3VWKTsKIApAQCAtMjc2MiwyOSArMjc4MiwyOCBAQAogCSAqIGluZm8gdG8gY2FsbCBzZXRfdm9sdGFnZV90aW1lX3NlbCgpLgogCSAqLwogCWlmIChfcmVndWxhdG9yX2lzX2VuYWJsZWQocmRldikgJiYKLQkgICAgcmRldi0+ZGVzYy0+b3BzLT5zZXRfdm9sdGFnZV90aW1lX3NlbCAmJgotCSAgICByZGV2LT5kZXNjLT5vcHMtPmdldF92b2x0YWdlX3NlbCkgewotCQlvbGRfc2VsZWN0b3IgPSByZGV2LT5kZXNjLT5vcHMtPmdldF92b2x0YWdlX3NlbChyZGV2KTsKKwkgICAgb3BzLT5zZXRfdm9sdGFnZV90aW1lX3NlbCAmJiBvcHMtPmdldF92b2x0YWdlX3NlbCkgeworCQlvbGRfc2VsZWN0b3IgPSBvcHMtPmdldF92b2x0YWdlX3NlbChyZGV2KTsKIAkJaWYgKG9sZF9zZWxlY3RvciA8IDApCiAJCQlyZXR1cm4gb2xkX3NlbGVjdG9yOwogCX0KIAotCWlmIChyZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlKSB7CisJaWYgKG9wcy0+c2V0X3ZvbHRhZ2UpIHsKIAkJcmV0ID0gX3JlZ3VsYXRvcl9jYWxsX3NldF92b2x0YWdlKHJkZXYsIG1pbl91ViwgbWF4X3VWLAogCQkJCQkJICAmc2VsZWN0b3IpOwogCiAJCWlmIChyZXQgPj0gMCkgewotCQkJaWYgKHJkZXYtPmRlc2MtPm9wcy0+bGlzdF92b2x0YWdlKQotCQkJCWJlc3RfdmFsID0gcmRldi0+ZGVzYy0+b3BzLT5saXN0X3ZvbHRhZ2UocmRldiwKLQkJCQkJCQkJCSBzZWxlY3Rvcik7CisJCQlpZiAob3BzLT5saXN0X3ZvbHRhZ2UpCisJCQkJYmVzdF92YWwgPSBvcHMtPmxpc3Rfdm9sdGFnZShyZGV2LAorCQkJCQkJCSAgICAgc2VsZWN0b3IpOwogCQkJZWxzZQogCQkJCWJlc3RfdmFsID0gX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2KTsKIAkJfQogCi0JfSBlbHNlIGlmIChyZGV2LT5kZXNjLT5vcHMtPnNldF92b2x0YWdlX3NlbCkgeworCX0gZWxzZSBpZiAob3BzLT5zZXRfdm9sdGFnZV9zZWwpIHsKIAkJcmV0ID0gcmVndWxhdG9yX21hcF92b2x0YWdlKHJkZXYsIG1pbl91ViwgbWF4X3VWKTsKIAkJaWYgKHJldCA+PSAwKSB7Ci0JCQliZXN0X3ZhbCA9IHJkZXYtPmRlc2MtPm9wcy0+bGlzdF92b2x0YWdlKHJkZXYsIHJldCk7CisJCQliZXN0X3ZhbCA9IG9wcy0+bGlzdF92b2x0YWdlKHJkZXYsIHJldCk7CiAJCQlpZiAobWluX3VWIDw9IGJlc3RfdmFsICYmIG1heF91ViA+PSBiZXN0X3ZhbCkgewogCQkJCXNlbGVjdG9yID0gcmV0OwogCQkJCWlmIChvbGRfc2VsZWN0b3IgPT0gc2VsZWN0b3IpCkBAIC0yODAwLDM0ICsyODE5LDUwIEBACiAJCXJldCA9IC1FSU5WQUw7CiAJfQogCi0JLyogQ2FsbCBzZXRfdm9sdGFnZV90aW1lX3NlbCBpZiBzdWNjZXNzZnVsbHkgb2J0YWluZWQgb2xkX3NlbGVjdG9yICovCi0JaWYgKHJldCA9PSAwICYmICFyZGV2LT5jb25zdHJhaW50cy0+cmFtcF9kaXNhYmxlICYmIG9sZF9zZWxlY3RvciA+PSAwCi0JCSYmIG9sZF9zZWxlY3RvciAhPSBzZWxlY3RvcikgeworCWlmIChyZXQpCisJCWdvdG8gb3V0OwogCi0JCWRlbGF5ID0gcmRldi0+ZGVzYy0+b3BzLT5zZXRfdm9sdGFnZV90aW1lX3NlbChyZGV2LAotCQkJCQkJb2xkX3NlbGVjdG9yLCBzZWxlY3Rvcik7Ci0JCWlmIChkZWxheSA8IDApIHsKLQkJCXJkZXZfd2FybihyZGV2LCAic2V0X3ZvbHRhZ2VfdGltZV9zZWwoKSBmYWlsZWQ6ICVkXG4iLAotCQkJCSAgZGVsYXkpOwotCQkJZGVsYXkgPSAwOwotCQl9Ci0KLQkJLyogSW5zZXJ0IGFueSBuZWNlc3NhcnkgZGVsYXlzICovCi0JCWlmIChkZWxheSA+PSAxMDAwKSB7Ci0JCQltZGVsYXkoZGVsYXkgLyAxMDAwKTsKLQkJCXVkZWxheShkZWxheSAlIDEwMDApOwotCQl9IGVsc2UgaWYgKGRlbGF5KSB7Ci0JCQl1ZGVsYXkoZGVsYXkpOworCWlmIChvcHMtPnNldF92b2x0YWdlX3RpbWVfc2VsKSB7CisJCS8qCisJCSAqIENhbGwgc2V0X3ZvbHRhZ2VfdGltZV9zZWwgaWYgc3VjY2Vzc2Z1bGx5IG9idGFpbmVkCisJCSAqIG9sZF9zZWxlY3RvcgorCQkgKi8KKwkJaWYgKG9sZF9zZWxlY3RvciA+PSAwICYmIG9sZF9zZWxlY3RvciAhPSBzZWxlY3RvcikKKwkJCWRlbGF5ID0gb3BzLT5zZXRfdm9sdGFnZV90aW1lX3NlbChyZGV2LCBvbGRfc2VsZWN0b3IsCisJCQkJCQkJICBzZWxlY3Rvcik7CisJfSBlbHNlIHsKKwkJaWYgKG9sZF91ViAhPSBiZXN0X3ZhbCkgeworCQkJaWYgKG9wcy0+c2V0X3ZvbHRhZ2VfdGltZSkKKwkJCQlkZWxheSA9IG9wcy0+c2V0X3ZvbHRhZ2VfdGltZShyZGV2LCBvbGRfdVYsCisJCQkJCQkJICAgICAgYmVzdF92YWwpOworCQkJZWxzZQorCQkJCWRlbGF5ID0gX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lKHJkZXYsCisJCQkJCQkJCSAgICBvbGRfdVYsCisJCQkJCQkJCSAgICBiZXN0X3ZhbCk7CiAJCX0KIAl9CiAKLQlpZiAocmV0ID09IDAgJiYgYmVzdF92YWwgPj0gMCkgeworCWlmIChkZWxheSA8IDApIHsKKwkJcmRldl93YXJuKHJkZXYsICJmYWlsZWQgdG8gZ2V0IGRlbGF5OiAlZFxuIiwgZGVsYXkpOworCQlkZWxheSA9IDA7CisJfQorCisJLyogSW5zZXJ0IGFueSBuZWNlc3NhcnkgZGVsYXlzICovCisJaWYgKGRlbGF5ID49IDEwMDApIHsKKwkJbWRlbGF5KGRlbGF5IC8gMTAwMCk7CisJCXVkZWxheShkZWxheSAlIDEwMDApOworCX0gZWxzZSBpZiAoZGVsYXkpIHsKKwkJdWRlbGF5KGRlbGF5KTsKKwl9CisKKwlpZiAoYmVzdF92YWwgPj0gMCkgewogCQl1bnNpZ25lZCBsb25nIGRhdGEgPSBiZXN0X3ZhbDsKIAogCQlfbm90aWZpZXJfY2FsbF9jaGFpbihyZGV2LCBSRUdVTEFUT1JfRVZFTlRfVk9MVEFHRV9DSEFOR0UsCiAJCQkJICAgICAodm9pZCAqKWRhdGEpOwogCX0KIAorb3V0OgogCXRyYWNlX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV9jb21wbGV0ZShyZGV2X2dldF9uYW1lKHJkZXYpLCBiZXN0X3ZhbCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMjk5OCw5ICszMDMzLDEzIEBACiAJaW50IHZvbHRhZ2U7CiAJaW50IGk7CiAKKwlpZiAob3BzLT5zZXRfdm9sdGFnZV90aW1lKQorCQlyZXR1cm4gb3BzLT5zZXRfdm9sdGFnZV90aW1lKHJkZXYsIG9sZF91ViwgbmV3X3VWKTsKKwllbHNlIGlmICghb3BzLT5zZXRfdm9sdGFnZV90aW1lX3NlbCkKKwkJcmV0dXJuIF9yZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZShyZGV2LCBvbGRfdVYsIG5ld191Vik7CisKIAkvKiBDdXJyZW50bHkgcmVxdWlyZXMgb3BlcmF0aW9ucyB0byBkbyB0aGlzICovCi0JaWYgKCFvcHMtPmxpc3Rfdm9sdGFnZSB8fCAhb3BzLT5zZXRfdm9sdGFnZV90aW1lX3NlbAotCSAgICB8fCAhcmRldi0+ZGVzYy0+bl92b2x0YWdlcykKKwlpZiAoIW9wcy0+bGlzdF92b2x0YWdlIHx8ICFyZGV2LT5kZXNjLT5uX3ZvbHRhZ2VzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAoaSA9IDA7IGkgPCByZGV2LT5kZXNjLT5uX3ZvbHRhZ2VzOyBpKyspIHsKQEAgLTMwMzksMTkgKzMwNzgsOCBAQAogCQkJCSAgIHVuc2lnbmVkIGludCBvbGRfc2VsZWN0b3IsCiAJCQkJICAgdW5zaWduZWQgaW50IG5ld19zZWxlY3RvcikKIHsKLQl1bnNpZ25lZCBpbnQgcmFtcF9kZWxheSA9IDA7CiAJaW50IG9sZF92b2x0LCBuZXdfdm9sdDsKIAotCWlmIChyZGV2LT5jb25zdHJhaW50cy0+cmFtcF9kZWxheSkKLQkJcmFtcF9kZWxheSA9IHJkZXYtPmNvbnN0cmFpbnRzLT5yYW1wX2RlbGF5OwotCWVsc2UgaWYgKHJkZXYtPmRlc2MtPnJhbXBfZGVsYXkpCi0JCXJhbXBfZGVsYXkgPSByZGV2LT5kZXNjLT5yYW1wX2RlbGF5OwotCi0JaWYgKHJhbXBfZGVsYXkgPT0gMCkgewotCQlyZGV2X3dhcm4ocmRldiwgInJhbXBfZGVsYXkgbm90IHNldFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmICghcmRldi0+ZGVzYy0+b3BzLT5saXN0X3ZvbHRhZ2UpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzA1OSw3ICszMDg3LDExIEBACiAJb2xkX3ZvbHQgPSByZGV2LT5kZXNjLT5vcHMtPmxpc3Rfdm9sdGFnZShyZGV2LCBvbGRfc2VsZWN0b3IpOwogCW5ld192b2x0ID0gcmRldi0+ZGVzYy0+b3BzLT5saXN0X3ZvbHRhZ2UocmRldiwgbmV3X3NlbGVjdG9yKTsKIAotCXJldHVybiBESVZfUk9VTkRfVVAoYWJzKG5ld192b2x0IC0gb2xkX3ZvbHQpLCByYW1wX2RlbGF5KTsKKwlpZiAocmRldi0+ZGVzYy0+b3BzLT5zZXRfdm9sdGFnZV90aW1lKQorCQlyZXR1cm4gcmRldi0+ZGVzYy0+b3BzLT5zZXRfdm9sdGFnZV90aW1lKHJkZXYsIG9sZF92b2x0LAorCQkJCQkJCSBuZXdfdm9sdCk7CisJZWxzZQorCQlyZXR1cm4gX3JlZ3VsYXRvcl9zZXRfdm9sdGFnZV90aW1lKHJkZXYsIG9sZF92b2x0LCBuZXdfdm9sdCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3Jfc2V0X3ZvbHRhZ2VfdGltZV9zZWwpOwogCkBAIC0zNDgzLDEwICszNTE1LDggQEAKIAkJY29uc3VtZXJzW2ldLmNvbnN1bWVyID0gTlVMTDsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fY29uc3VtZXJzOyBpKyspIHsKLQkJY29uc3VtZXJzW2ldLmNvbnN1bWVyID0gX3JlZ3VsYXRvcl9nZXQoZGV2LAotCQkJCQkJICAgICAgIGNvbnN1bWVyc1tpXS5zdXBwbHksCi0JCQkJCQkgICAgICAgZmFsc2UsCi0JCQkJCQkgICAgICAgIWNvbnN1bWVyc1tpXS5vcHRpb25hbCk7CisJCWNvbnN1bWVyc1tpXS5jb25zdW1lciA9IHJlZ3VsYXRvcl9nZXQoZGV2LAorCQkJCQkJICAgICAgY29uc3VtZXJzW2ldLnN1cHBseSk7CiAJCWlmIChJU19FUlIoY29uc3VtZXJzW2ldLmNvbnN1bWVyKSkgewogCQkJcmV0ID0gUFRSX0VSUihjb25zdW1lcnNbaV0uY29uc3VtZXIpOwogCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IHN1cHBseSAnJXMnOiAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RieDUwMC1wcmNtdS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGJ4NTAwLXByY211LmMKaW5kZXggMzk2M2RmYS4uODk3NjE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGJ4NTAwLXByY211LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGJ4NTAwLXByY211LmMKQEAgLTc1LDI0ICs3NSw2IEBACiAJdTggKnN0YXRlX2FmdGVyX3N1c3BlbmQ7CiB9IHJkZWJ1ZzsKIAotdm9pZCB1eDUwMF9yZWd1bGF0b3Jfc3VzcGVuZF9kZWJ1Zyh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHJkZWJ1Zy5udW1fcmVndWxhdG9yczsgaSsrKQotCQlyZGVidWcuc3RhdGVfYmVmb3JlX3N1c3BlbmRbaV0gPQotCQkJcmRlYnVnLnJlZ3VsYXRvcl9hcnJheVtpXS5pc19lbmFibGVkOwotfQotCi12b2lkIHV4NTAwX3JlZ3VsYXRvcl9yZXN1bWVfZGVidWcodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCByZGVidWcubnVtX3JlZ3VsYXRvcnM7IGkrKykKLQkJcmRlYnVnLnN0YXRlX2FmdGVyX3N1c3BlbmRbaV0gPQotCQkJcmRlYnVnLnJlZ3VsYXRvcl9hcnJheVtpXS5pc19lbmFibGVkOwotfQotCiBzdGF0aWMgaW50IHV4NTAwX3JlZ3VsYXRvcl9wb3dlcl9zdGF0ZV9jbnRfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQogewogCS8qIHByaW50IHBvd2VyIHN0YXRlIGNvdW50ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kZXZyZXMuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2RldnJlcy5jCmluZGV4IDZhZDhhYjQuLjZlYzFkNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2RldnJlcy5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RldnJlcy5jCkBAIC0xNjQsMTEgKzE2NCw4IEBACiAJCWNvbnN1bWVyc1tpXS5jb25zdW1lciA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbnN1bWVyczsgaSsrKSB7Ci0JCWNvbnN1bWVyc1tpXS5jb25zdW1lciA9IF9kZXZtX3JlZ3VsYXRvcl9nZXQoZGV2LAotCQkJCQkJCSAgICBjb25zdW1lcnNbaV0uc3VwcGx5LAotCQkJCQkJCSAgICBjb25zdW1lcnNbaV0ub3B0aW9uYWwgPwotCQkJCQkJCQlPUFRJT05BTF9HRVQgOgotCQkJCQkJCQlOT1JNQUxfR0VUKTsKKwkJY29uc3VtZXJzW2ldLmNvbnN1bWVyID0gZGV2bV9yZWd1bGF0b3JfZ2V0KGRldiwKKwkJCQkJCQkgICBjb25zdW1lcnNbaV0uc3VwcGx5KTsKIAkJaWYgKElTX0VSUihjb25zdW1lcnNbaV0uY29uc3VtZXIpKSB7CiAJCQlyZXQgPSBQVFJfRVJSKGNvbnN1bWVyc1tpXS5jb25zdW1lcik7CiAJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgc3VwcGx5ICclcyc6ICVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvaGk2NDIxLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvaGk2NDIxLXJlZ3VsYXRvci5jCmluZGV4IDQyZGM1ZmIuLjYyYzVmNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2hpNjQyMS1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9oaTY0MjEtcmVndWxhdG9yLmMKQEAgLTQ3Nyw3ICs0NzcsOCBAQAogCXJldHVybiAwOwogfQogCi11bnNpZ25lZCBpbnQgaGk2NDIxX3JlZ3VsYXRvcl9sZG9fZ2V0X29wdGltdW1fbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2hpNjQyMV9yZWd1bGF0b3JfbGRvX2dldF9vcHRpbXVtX21vZGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCiAJCQlpbnQgaW5wdXRfdVYsIGludCBvdXRwdXRfdVYsIGludCBsb2FkX3VBKQogewogCXN0cnVjdCBoaTY0MjFfcmVndWxhdG9yX2luZm8gKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbHRjMzY3Ni5jIGIvZHJpdmVycy9yZWd1bGF0b3IvbHRjMzY3Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjQ3NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9sdGMzNjc2LmMKQEAgLTAsMCArMSw0MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgR2F0ZXdvcmtzIENvcnBvcmF0aW9uLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9vZl9yZWd1bGF0b3IuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRQkJImx0YzM2NzYiCisKKy8qIExUQzM2NzYgUmVnaXN0ZXJzICovCisjZGVmaW5lIExUQzM2NzZfQlVDSzEgICAgIDB4MDEKKyNkZWZpbmUgTFRDMzY3Nl9CVUNLMiAgICAgMHgwMgorI2RlZmluZSBMVEMzNjc2X0JVQ0szICAgICAweDAzCisjZGVmaW5lIExUQzM2NzZfQlVDSzQgICAgIDB4MDQKKyNkZWZpbmUgTFRDMzY3Nl9MRE9BICAgICAgMHgwNQorI2RlZmluZSBMVEMzNjc2X0xET0IgICAgICAweDA2CisjZGVmaW5lIExUQzM2NzZfU1FEMSAgICAgIDB4MDcKKyNkZWZpbmUgTFRDMzY3Nl9TUUQyICAgICAgMHgwOAorI2RlZmluZSBMVEMzNjc2X0NOVFJMICAgICAweDA5CisjZGVmaW5lIExUQzM2NzZfRFZCMUEgICAgIDB4MEEKKyNkZWZpbmUgTFRDMzY3Nl9EVkIxQiAgICAgMHgwQgorI2RlZmluZSBMVEMzNjc2X0RWQjJBICAgICAweDBDCisjZGVmaW5lIExUQzM2NzZfRFZCMkIgICAgIDB4MEQKKyNkZWZpbmUgTFRDMzY3Nl9EVkIzQSAgICAgMHgwRQorI2RlZmluZSBMVEMzNjc2X0RWQjNCICAgICAweDBGCisjZGVmaW5lIExUQzM2NzZfRFZCNEEgICAgIDB4MTAKKyNkZWZpbmUgTFRDMzY3Nl9EVkI0QiAgICAgMHgxMQorI2RlZmluZSBMVEMzNjc2X01TS0lSUSAgICAweDEyCisjZGVmaW5lIExUQzM2NzZfTVNLUEcgICAgIDB4MTMKKyNkZWZpbmUgTFRDMzY3Nl9VU0VSICAgICAgMHgxNAorI2RlZmluZSBMVEMzNjc2X0lSUVNUQVQgICAweDE1CisjZGVmaW5lIExUQzM2NzZfUEdTVEFUTCAgIDB4MTYKKyNkZWZpbmUgTFRDMzY3Nl9QR1NUQVRSVCAgMHgxNworI2RlZmluZSBMVEMzNjc2X0hSU1QgICAgICAweDFFCisjZGVmaW5lIExUQzM2NzZfQ0xJUlEgICAgIDB4MUYKKworI2RlZmluZSBMVEMzNjc2X0RWQnhBX1JFRl9TRUxFQ1QJQklUKDUpCisKKyNkZWZpbmUgTFRDMzY3Nl9JUlFTVEFUX1BHT09EX1RJTUVPVVQJQklUKDMpCisjZGVmaW5lIExUQzM2NzZfSVJRU1RBVF9VTkRFUlZPTFRfV0FSTglCSVQoNCkKKyNkZWZpbmUgTFRDMzY3Nl9JUlFTVEFUX1VOREVSVk9MVF9GQVVMVAlCSVQoNSkKKyNkZWZpbmUgTFRDMzY3Nl9JUlFTVEFUX1RIRVJNQUxfV0FSTglCSVQoNikKKyNkZWZpbmUgTFRDMzY3Nl9JUlFTVEFUX1RIRVJNQUxfRkFVTFQJQklUKDcpCisKK2VudW0gbHRjMzY3Nl9yZWcgeworCUxUQzM2NzZfU1cxLAorCUxUQzM2NzZfU1cyLAorCUxUQzM2NzZfU1czLAorCUxUQzM2NzZfU1c0LAorCUxUQzM2NzZfTERPMSwKKwlMVEMzNjc2X0xETzIsCisJTFRDMzY3Nl9MRE8zLAorCUxUQzM2NzZfTERPNCwKKwlMVEMzNjc2X05VTV9SRUdVTEFUT1JTLAorfTsKKworc3RydWN0IGx0YzM2NzYgeworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHJlZ3VsYXRvcl9kZXNjc1tMVEMzNjc2X05VTV9SRUdVTEFUT1JTXTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmVndWxhdG9yc1tMVEMzNjc2X05VTV9SRUdVTEFUT1JTXTsKK307CisKK3N0YXRpYyBpbnQgbHRjMzY3Nl9zZXRfc3VzcGVuZF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgdVYpCit7CisJc3RydWN0IGx0YzM2NzYgKmx0YzM2NzYgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGx0YzM2NzYtPmRldjsKKwlpbnQgZGNkYyA9IHJkZXZfZ2V0X2lkKHJkZXYpOworCWludCBzZWw7CisKKwlkZXZfZGJnKGRldiwgIiVzIGlkPSVkIHVWPSVkXG4iLCBfX2Z1bmNfXywgZGNkYywgdVYpOworCXNlbCA9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9saW5lYXIocmRldiwgdVYsIHVWKTsKKwlpZiAoc2VsIDwgMCkKKwkJcmV0dXJuIHNlbDsKKworCS8qIERWQkIgcmVnaXN0ZXIgZm9sbG93cyByaWdodCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBEVkJBIHJlZ2lzdGVyICovCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhsdGMzNjc2LT5yZWdtYXAsIHJkZXYtPmRlc2MtPnZzZWxfcmVnICsgMSwKKwkJCQkgIHJkZXYtPmRlc2MtPnZzZWxfbWFzaywgc2VsKTsKK30KKworc3RhdGljIGludCBsdGMzNjc2X3NldF9zdXNwZW5kX21vZGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJICAgIHVuc2lnbmVkIGludCBtb2RlKQoreworCXN0cnVjdCBsdGMzNjc2ICpsdGMzNjc2PSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGx0YzM2NzYtPmRldjsKKwlpbnQgbWFzaywgdmFsOworCWludCBkY2RjID0gcmRldl9nZXRfaWQocmRldik7CisKKwlkZXZfZGJnKGRldiwgIiVzIGlkPSVkIG1vZGU9JWRcbiIsIF9fZnVuY19fLCBkY2RjLCBtb2RlKTsKKworCW1hc2sgPSBMVEMzNjc2X0RWQnhBX1JFRl9TRUxFQ1Q7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9TVEFOREJZOgorCQl2YWwgPSAwOyAvKiBzZWxlY3QgRFZCeEEgKi8KKwkJYnJlYWs7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9OT1JNQUw6CisJCXZhbCA9IExUQzM2NzZfRFZCeEFfUkVGX1NFTEVDVDsgLyogc2VsZWN0IERWQnhCICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZyZGV2LT5kZXYsICIlczogcmVndWxhdG9yIG1vZGU6IDB4JXggbm90IHN1cHBvcnRlZFxuIiwKKwkJCSByZGV2LT5kZXNjLT5uYW1lLCBtb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhsdGMzNjc2LT5yZWdtYXAsIHJkZXYtPmRlc2MtPnZzZWxfcmVnLAorCQkJCSAgbWFzaywgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbHRjMzY3Nl9zY2FsZSh1bnNpZ25lZCBpbnQgdVYsIHUzMiByMSwgdTMyIHIyKQoreworCXVpbnQ2NF90IHRtcDsKKwlpZiAodVYgPT0gMCkKKwkJcmV0dXJuIDA7CisJdG1wID0gKHVpbnQ2NF90KXVWICogcjE7CisJZG9fZGl2KHRtcCwgcjIpOworCXJldHVybiB1ViArICh1bnNpZ25lZCBpbnQpdG1wOworfQorCitzdGF0aWMgaW50IGx0YzM2NzZfb2ZfcGFyc2VfY2Ioc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKmRlc2MsCisJCQkgICAgICAgc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgKmNvbmZpZykKK3sKKwlzdHJ1Y3QgbHRjMzY3NiAqbHRjMzY3NiA9IGNvbmZpZy0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpyZGVzYyA9ICZsdGMzNjc2LT5yZWd1bGF0b3JfZGVzY3NbZGVzYy0+aWRdOworCXUzMiByWzJdOworCWludCByZXQ7CisKKwkvKiBMRE8zIGhhcyBhIGZpeGVkIG91dHB1dCAqLworCWlmIChkZXNjLT5pZCA9PSBMVEMzNjc2X0xETzMpCisJCXJldHVybiAwOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkobnAsICJsbHRjLGZiLXZvbHRhZ2UtZGl2aWRlciIsIHIsIDIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihsdGMzNjc2LT5kZXYsICJGYWlsZWQgdG8gcGFyc2Ugdm9sdGFnZSBkaXZpZGVyOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmRlc2MtPm1pbl91ViA9IGx0YzM2NzZfc2NhbGUoZGVzYy0+bWluX3VWLCByWzBdLCByWzFdKTsKKwlyZGVzYy0+dVZfc3RlcCA9IGx0YzM2NzZfc2NhbGUoZGVzYy0+dVZfc3RlcCwgclswXSwgclsxXSk7CisJcmRlc2MtPmZpeGVkX3VWID0gbHRjMzY3Nl9zY2FsZShkZXNjLT5maXhlZF91ViwgclswXSwgclsxXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU1cxLCBTVzIsIFNXMywgU1c0IGxpbmVhciAwLjhWLTMuM1Ygd2l0aCBzY2FsYXIgdmlhIFIxL1IyIGZlZWJhY2sgcmVzICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgbHRjMzY3Nl9saW5lYXJfcmVndWxhdG9yX29wcyA9IHsKKwkuZW5hYmxlID0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUgPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCisJLmlzX2VuYWJsZWQgPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLmxpc3Rfdm9sdGFnZSA9IHJlZ3VsYXRvcl9saXN0X3ZvbHRhZ2VfbGluZWFyLAorCS5zZXRfdm9sdGFnZV9zZWwgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsID0gcmVndWxhdG9yX2dldF92b2x0YWdlX3NlbF9yZWdtYXAsCisJLnNldF9zdXNwZW5kX3ZvbHRhZ2UgPSBsdGMzNjc2X3NldF9zdXNwZW5kX3ZvbHRhZ2UsCisJLnNldF9zdXNwZW5kX21vZGUgPSBsdGMzNjc2X3NldF9zdXNwZW5kX21vZGUsCit9OworCisvKiBMRE8xIGFsd2F5cyBvbiBmaXhlZCAwLjhWLTMuM1YgdmlhIHNjYWxhciB2aWEgUjEvUjIgZmVlYmFjayByZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBsdGMzNjc2X2ZpeGVkX3N0YW5kYnlfcmVndWxhdG9yX29wcyA9IHsKK307CisKKy8qIExETzIsIExETzMgZml4ZWQgKExETzIgaGFzIGV4dGVybmFsIHNjYWxhciB2aWEgUjEvUjIgZmVlZGJhY2sgcmVzKSAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGx0YzM2NzZfZml4ZWRfcmVndWxhdG9yX29wcyA9IHsKKwkuZW5hYmxlID0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUgPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCisJLmlzX2VuYWJsZWQgPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCit9OworCisjZGVmaW5lIExUQzM2NzZfUkVHKF9pZCwgX25hbWUsIF9vcHMsIGVuX3JlZywgZW5fYml0LCBkdmJhX3JlZywgZHZiX21hc2spICAgXAorCVtMVEMzNjc2XyAjIyBfaWRdID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCS5uYW1lID0gI19uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkub2ZfbWF0Y2ggPSBvZl9tYXRjaF9wdHIoI19uYW1lKSwgICAgICAgICAgICAgIFwKKwkJLnJlZ3VsYXRvcnNfbm9kZSA9IG9mX21hdGNoX3B0cigicmVndWxhdG9ycyIpLCBcCisJCS5vZl9wYXJzZV9jYiA9IGx0YzM2NzZfb2ZfcGFyc2VfY2IsICAgICAgICAgICAgXAorCQkubl92b2x0YWdlcyA9IChkdmJfbWFzaykgKyAxLCAgICAgICAgICAgICAgICAgIFwKKwkJLm1pbl91ViA9IChkdmJhX3JlZykgPyA0MTI1MDAgOiAwLCAgICAgICAgICAgICBcCisJCS51Vl9zdGVwID0gKGR2YmFfcmVnKSA/IDEyNTAwIDogMCwgICAgICAgICAgICAgXAorCQkucmFtcF9kZWxheSA9IChkdmJhX3JlZykgPyA4MDAgOiAwLCAgICAgICAgICAgIFwKKwkJLmZpeGVkX3VWID0gKGR2Yl9tYXNrKSA/IDAgOiA3MjUwMDAsICAgICAgICAgICBcCisJCS5vcHMgPSAmbHRjMzY3Nl8gIyMgX29wcyAjIyBfcmVndWxhdG9yX29wcywgICAgXAorCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLCAgICAgICAgICAgICAgICAgICAgIFwKKwkJLmlkID0gTFRDMzY3Nl8gIyMgX2lkLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCS5vd25lciA9IFRISVNfTU9EVUxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkudnNlbF9yZWcgPSAoZHZiYV9yZWcpLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJLnZzZWxfbWFzayA9IChkdmJfbWFzayksICAgICAgICAgICAgICAgICAgICAgICBcCisJCS5lbmFibGVfcmVnID0gKGVuX3JlZyksICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkuZW5hYmxlX21hc2sgPSAoMSA8PCBlbl9iaXQpLCAgICAgICAgICAgICAgICAgIFwKKwl9CisKKyNkZWZpbmUgTFRDMzY3Nl9MSU5FQVJfUkVHKF9pZCwgX25hbWUsIF9lbiwgX2R2YmEpICAgICAgICAgICAgICAgICAgICAgXAorCUxUQzM2NzZfUkVHKF9pZCwgX25hbWUsIGxpbmVhciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgIExUQzM2NzZfICMjIF9lbiwgNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgIExUQzM2NzZfICMjIF9kdmJhLCAweDFmKQorCisjZGVmaW5lIExUQzM2NzZfRklYRURfUkVHKF9pZCwgX25hbWUsIF9lbl9yZWcsIF9lbl9iaXQpICAgICAgICAgICAgICAgIFwKKwlMVEMzNjc2X1JFRyhfaWQsIF9uYW1lLCBmaXhlZCwgTFRDMzY3Nl8gIyMgX2VuX3JlZywgX2VuX2JpdCwgMCwgMCkKKworc3RhdGljIHN0cnVjdCByZWd1bGF0b3JfZGVzYyBsdGMzNjc2X3JlZ3VsYXRvcnNbTFRDMzY3Nl9OVU1fUkVHVUxBVE9SU10gPSB7CisJTFRDMzY3Nl9MSU5FQVJfUkVHKFNXMSwgc3cxLCBCVUNLMSwgRFZCMUEpLAorCUxUQzM2NzZfTElORUFSX1JFRyhTVzIsIHN3MiwgQlVDSzIsIERWQjJBKSwKKwlMVEMzNjc2X0xJTkVBUl9SRUcoU1czLCBzdzMsIEJVQ0szLCBEVkIzQSksCisJTFRDMzY3Nl9MSU5FQVJfUkVHKFNXNCwgc3c0LCBCVUNLNCwgRFZCNEEpLAorCUxUQzM2NzZfUkVHKExETzEsIGxkbzEsIGZpeGVkX3N0YW5kYnksIDAsIDAsIDAsIDApLAorCUxUQzM2NzZfRklYRURfUkVHKExETzIsIGxkbzIsIExET0EsIDIpLAorCUxUQzM2NzZfRklYRURfUkVHKExETzMsIGxkbzMsIExET0EsIDUpLAorCUxUQzM2NzZfRklYRURfUkVHKExETzQsIGxkbzQsIExET0IsIDIpLAorfTsKKworc3RhdGljIGJvb2wgbHRjMzY3Nl93cml0ZWFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDMzY3Nl9JUlFTVEFUOgorCWNhc2UgTFRDMzY3Nl9CVUNLMToKKwljYXNlIExUQzM2NzZfQlVDSzI6CisJY2FzZSBMVEMzNjc2X0JVQ0szOgorCWNhc2UgTFRDMzY3Nl9CVUNLNDoKKwljYXNlIExUQzM2NzZfTERPQToKKwljYXNlIExUQzM2NzZfTERPQjoKKwljYXNlIExUQzM2NzZfU1FEMToKKwljYXNlIExUQzM2NzZfU1FEMjoKKwljYXNlIExUQzM2NzZfQ05UUkw6CisJY2FzZSBMVEMzNjc2X0RWQjFBOgorCWNhc2UgTFRDMzY3Nl9EVkIxQjoKKwljYXNlIExUQzM2NzZfRFZCMkE6CisJY2FzZSBMVEMzNjc2X0RWQjJCOgorCWNhc2UgTFRDMzY3Nl9EVkIzQToKKwljYXNlIExUQzM2NzZfRFZCM0I6CisJY2FzZSBMVEMzNjc2X0RWQjRBOgorCWNhc2UgTFRDMzY3Nl9EVkI0QjoKKwljYXNlIExUQzM2NzZfTVNLSVJROgorCWNhc2UgTFRDMzY3Nl9NU0tQRzoKKwljYXNlIExUQzM2NzZfVVNFUjoKKwljYXNlIExUQzM2NzZfSFJTVDoKKwljYXNlIExUQzM2NzZfQ0xJUlE6CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGx0YzM2NzZfcmVhZGFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDMzY3Nl9JUlFTVEFUOgorCWNhc2UgTFRDMzY3Nl9CVUNLMToKKwljYXNlIExUQzM2NzZfQlVDSzI6CisJY2FzZSBMVEMzNjc2X0JVQ0szOgorCWNhc2UgTFRDMzY3Nl9CVUNLNDoKKwljYXNlIExUQzM2NzZfTERPQToKKwljYXNlIExUQzM2NzZfTERPQjoKKwljYXNlIExUQzM2NzZfU1FEMToKKwljYXNlIExUQzM2NzZfU1FEMjoKKwljYXNlIExUQzM2NzZfQ05UUkw6CisJY2FzZSBMVEMzNjc2X0RWQjFBOgorCWNhc2UgTFRDMzY3Nl9EVkIxQjoKKwljYXNlIExUQzM2NzZfRFZCMkE6CisJY2FzZSBMVEMzNjc2X0RWQjJCOgorCWNhc2UgTFRDMzY3Nl9EVkIzQToKKwljYXNlIExUQzM2NzZfRFZCM0I6CisJY2FzZSBMVEMzNjc2X0RWQjRBOgorCWNhc2UgTFRDMzY3Nl9EVkI0QjoKKwljYXNlIExUQzM2NzZfTVNLSVJROgorCWNhc2UgTFRDMzY3Nl9NU0tQRzoKKwljYXNlIExUQzM2NzZfVVNFUjoKKwljYXNlIExUQzM2NzZfSFJTVDoKKwljYXNlIExUQzM2NzZfQ0xJUlE6CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGx0YzM2NzZfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTFRDMzY3Nl9JUlFTVEFUOgorCWNhc2UgTFRDMzY3Nl9QR1NUQVRMOgorCWNhc2UgTFRDMzY3Nl9QR1NUQVRSVDoKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGx0YzM2NzZfcmVnbWFwX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCisJLndyaXRlYWJsZV9yZWcgPSBsdGMzNjc2X3dyaXRlYWJsZV9yZWcsCisJLnJlYWRhYmxlX3JlZyA9IGx0YzM2NzZfcmVhZGFibGVfcmVnLAorCS52b2xhdGlsZV9yZWcgPSBsdGMzNjc2X3ZvbGF0aWxlX3JlZywKKwkubWF4X3JlZ2lzdGVyID0gTFRDMzY3Nl9DTElSUSwKKwkudXNlX3NpbmdsZV9ydyA9IHRydWUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCit9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgbHRjMzY3Nl9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBsdGMzNjc2ICpsdGMzNjc2ID0gZGV2X2lkOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGx0YzM2NzYtPmRldjsKKwl1bnNpZ25lZCBpbnQgaSwgaXJxc3RhdCwgZXZlbnQ7CisKKwlyZWdtYXBfcmVhZChsdGMzNjc2LT5yZWdtYXAsIExUQzM2NzZfSVJRU1RBVCwgJmlycXN0YXQpOworCisJZGV2X2RiZyhkZXYsICJpcnElZCBpcnFzdGF0PTB4JTAyeFxuIiwgaXJxLCBpcnFzdGF0KTsKKwlpZiAoaXJxc3RhdCAmIExUQzM2NzZfSVJRU1RBVF9USEVSTUFMX1dBUk4pIHsKKwkJZGV2X3dhcm4oZGV2LCAiT3Zlci10ZW1wZXJhdHVyZSBXYXJuaW5nXG4iKTsKKwkJZXZlbnQgPSBSRUdVTEFUT1JfRVZFTlRfT1ZFUl9URU1QOworCQlmb3IgKGkgPSAwOyBpIDwgTFRDMzY3Nl9OVU1fUkVHVUxBVE9SUzsgaSsrKQorCQkJcmVndWxhdG9yX25vdGlmaWVyX2NhbGxfY2hhaW4obHRjMzY3Ni0+cmVndWxhdG9yc1tpXSwKKwkJCQkJCSAgICAgIGV2ZW50LCBOVUxMKTsKKwl9CisKKwlpZiAoaXJxc3RhdCAmIExUQzM2NzZfSVJRU1RBVF9VTkRFUlZPTFRfV0FSTikgeworCQlkZXZfaW5mbyhkZXYsICJVbmRlcnZvbHRhZ2UgV2FybmluZ1xuIik7CisJCWV2ZW50ID0gUkVHVUxBVE9SX0VWRU5UX1VOREVSX1ZPTFRBR0U7CisJCWZvciAoaSA9IDA7IGkgPCBMVEMzNjc2X05VTV9SRUdVTEFUT1JTOyBpKyspCisJCQlyZWd1bGF0b3Jfbm90aWZpZXJfY2FsbF9jaGFpbihsdGMzNjc2LT5yZWd1bGF0b3JzW2ldLAorCQkJCQkJICAgICAgZXZlbnQsIE5VTEwpOworCX0KKworCS8qIENsZWFyIHdhcm5pbmcgY29uZGl0aW9uICovCisJcmVnbWFwX3dyaXRlKGx0YzM2NzYtPnJlZ21hcCwgTFRDMzY3Nl9DTElSUSwgMCk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgbHRjMzY3Nl9yZWd1bGF0b3JfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdF9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOworCXN0cnVjdCByZWd1bGF0b3JfZGVzYyAqZGVzY3M7CisJc3RydWN0IGx0YzM2NzYgKmx0YzM2NzY7CisJaW50IGksIHJldDsKKworCWx0YzM2NzYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmx0YzM2NzYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWx0YzM2NzYpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgbHRjMzY3Nik7CisJbHRjMzY3Ni0+ZGV2ID0gZGV2OworCisJZGVzY3MgPSBsdGMzNjc2LT5yZWd1bGF0b3JfZGVzY3M7CisJbWVtY3B5KGRlc2NzLCBsdGMzNjc2X3JlZ3VsYXRvcnMsIHNpemVvZihsdGMzNjc2X3JlZ3VsYXRvcnMpKTsKKwlkZXNjc1tMVEMzNjc2X0xETzNdLmZpeGVkX3VWID0gMTgwMDAwMDsgLyogTERPMyBpcyBmaXhlZCAxLjhWICovCisKKwlsdGMzNjc2LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZsdGMzNjc2X3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIobHRjMzY3Ni0+cmVnbWFwKSkgeworCQlyZXQgPSBQVFJfRVJSKGx0YzM2NzYtPnJlZ21hcCk7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgcmVnbWFwOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTFRDMzY3Nl9OVU1fUkVHVUxBVE9SUzsgaSsrKSB7CisJCXN0cnVjdCByZWd1bGF0b3JfZGVzYyAqZGVzYyA9ICZsdGMzNjc2LT5yZWd1bGF0b3JfZGVzY3NbaV07CisJCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKKworCQlpZiAoaW5pdF9kYXRhKQorCQkJY29uZmlnLmluaXRfZGF0YSA9ICZpbml0X2RhdGFbaV07CisKKwkJY29uZmlnLmRldiA9IGRldjsKKwkJY29uZmlnLmRyaXZlcl9kYXRhID0gbHRjMzY3NjsKKworCQlsdGMzNjc2LT5yZWd1bGF0b3JzW2ldID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoZGV2LCBkZXNjLAorCQkJCQkJCQkgJmNvbmZpZyk7CisJCWlmIChJU19FUlIobHRjMzY3Ni0+cmVndWxhdG9yc1tpXSkpIHsKKwkJCXJldCA9IFBUUl9FUlIobHRjMzY3Ni0+cmVndWxhdG9yc1tpXSk7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3IgJXM6ICVkXG4iLAorCQkJCWRlc2MtPm5hbWUsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmVnbWFwX3dyaXRlKGx0YzM2NzYtPnJlZ21hcCwgTFRDMzY3Nl9DTElSUSwgMCk7CisJaWYgKGNsaWVudC0+aXJxKSB7CisJCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCBjbGllbnQtPmlycSwgTlVMTCwKKwkJCQkJCWx0YzM2NzZfaXNyLAorCQkJCQkJSVJRRl9UUklHR0VSX0xPVyB8IElSUUZfT05FU0hPVCwKKwkJCQkJCWNsaWVudC0+bmFtZSwgbHRjMzY3Nik7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgSVJROiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGx0YzM2NzZfaTJjX2lkW10gPSB7CisJeyAibHRjMzY3NiIgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbHRjMzY3Nl9pMmNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbHRjMzY3Nl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUklWRVJfTkFNRSwKKwl9LAorCS5wcm9iZSA9IGx0YzM2NzZfcmVndWxhdG9yX3Byb2JlLAorCS5pZF90YWJsZSA9IGx0YzM2NzZfaTJjX2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKGx0YzM2NzZfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiVGltIEhhcnZleSA8dGhhcnZleUBnYXRld29ya3MuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWd1bGF0b3IgZHJpdmVyIGZvciBMaW5lYXIgVGVjaG5vbG9neSBMVEMxMzc2Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXgxNDU3Ny1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDE0NTc3LXJlZ3VsYXRvci5jCmluZGV4IGIyZGFhNjYuLmM5ZmYyNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL21heDE0NTc3LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDE0NTc3LXJlZ3VsYXRvci5jCkBAIC0yLDcgKzIsNyBAQAogICogbWF4MTQ1NzcuYyAtIFJlZ3VsYXRvciBkcml2ZXIgZm9yIHRoZSBNYXhpbSAxNDU3Ny83NzgzNgogICoKICAqIENvcHlyaWdodCAoQykgMjAxMywyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqIEtyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPgorICogS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMzMxLDcgKzMzMSw3IEBACiB9CiBtb2R1bGVfZXhpdChtYXgxNDU3N19yZWd1bGF0b3JfZXhpdCk7CiAKLU1PRFVMRV9BVVRIT1IoIktyenlzenRvZiBLb3psb3dza2kgPGsua296bG93c2tpQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0FVVEhPUigiS3J6eXN6dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbSAxNDU3Ny83NzgzNiByZWd1bGF0b3IgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm1heDE0NTc3LXJlZ3VsYXRvciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2OTMtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY5My1yZWd1bGF0b3IuYwppbmRleCBkZTczMGZkLi5jZmJiOTUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY5My1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY5My1yZWd1bGF0b3IuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNSBTYW1zdW5nIEVsZWN0cm9uaWNzCiAgKiBKb25naHdhIExlZSA8am9uZ2h3YTMubGVlQHNhbXN1bmcuY29tPgotICogS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2kua0BnbWFpbC5jb20+CisgKiBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0zMTQsNSArMzE0LDUgQEAKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNQVhJTSA3NzY5My83Nzg0MyByZWd1bGF0b3IgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJKb25naHdhIExlZSA8am9uZ2h3YTMubGVlQHNhbXN1bmcuY29tPiIpOwotTU9EVUxFX0FVVEhPUigiS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2kua0BnbWFpbC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9wdjg4MDgwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvcHY4ODA4MC1yZWd1bGF0b3IuYwppbmRleCA4MTk1MGJkLi45NTRhMjBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9wdjg4MDgwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3B2ODgwODAtcmVndWxhdG9yLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2RyaXZlci5oPgpAQCAtMjYsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9vZl9yZWd1bGF0b3IuaD4KICNpbmNsdWRlICJwdjg4MDgwLXJlZ3VsYXRvci5oIgogCi0jZGVmaW5lIFBWODgwODBfTUFYX1JFR1VMQVRPUlMJMworI2RlZmluZSBQVjg4MDgwX01BWF9SRUdVTEFUT1JTCTQKIAogLyogUFY4ODA4MCBSRUdVTEFUT1IgSURzICovCiBlbnVtIHsKQEAgLTM0LDYgKzM1LDEyIEBACiAJUFY4ODA4MF9JRF9CVUNLMSwKIAlQVjg4MDgwX0lEX0JVQ0syLAogCVBWODgwODBfSURfQlVDSzMsCisJUFY4ODA4MF9JRF9IVkJVQ0ssCit9OworCitlbnVtIHB2ODgwODBfdHlwZXMgeworCVRZUEVfUFY4ODA4MF9BQSwKKwlUWVBFX1BWODgwODBfQkEsCiB9OwogCiBzdHJ1Y3QgcHY4ODA4MF9yZWd1bGF0b3IgewpAQCAtNDIsNyArNDksOCBAQAogCXVuc2lnbmVkIGludCBuX2N1cnJlbnRfbGltaXRzOwogCWNvbnN0IGludCAqY3VycmVudF9saW1pdHM7CiAJdW5zaWduZWQgaW50IGxpbWl0X21hc2s7Ci0JdW5zaWduZWQgaW50IGNvbmY7CisJdW5zaWduZWQgaW50IG1vZGVfcmVnOworCXVuc2lnbmVkIGludCBsaW1pdF9yZWc7CiAJdW5zaWduZWQgaW50IGNvbmYyOwogCXVuc2lnbmVkIGludCBjb25mNTsKIH07CkBAIC01MSw2ICs1OSw4IEBACiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldltQVjg4MDgwX01BWF9SRUdVTEFUT1JTXTsKKwl1bnNpZ25lZCBsb25nIHR5cGU7CisJY29uc3Qgc3RydWN0IHB2ODgwODBfY29tcGF0aWJsZV9yZWdtYXAgKnJlZ21hcF9jb25maWc7CiB9OwogCiBzdHJ1Y3QgcHY4ODA4MF9idWNrX3ZvbHRhZ2UgewpAQCAtNTksNiArNjksMzAgQEAKIAlpbnQgdVZfc3RlcDsKIH07CiAKK3N0cnVjdCBwdjg4MDgwX2J1Y2tfcmVnbWFwIHsKKwkvKiBSRUdTICovCisJaW50IGJ1Y2tfZW5hYmxlX3JlZzsKKwlpbnQgYnVja192c2VsX3JlZzsKKwlpbnQgYnVja19tb2RlX3JlZzsKKwlpbnQgYnVja19saW1pdF9yZWc7CisJaW50IGJ1Y2tfdmRhY19yYW5nZV9yZWc7CisJaW50IGJ1Y2tfdnJhbmdlX2dhaW5fcmVnOworCS8qIE1BU0tTICovCisJaW50IGJ1Y2tfZW5hYmxlX21hc2s7CisJaW50IGJ1Y2tfdnNlbF9tYXNrOworCWludCBidWNrX2xpbWl0X21hc2s7Cit9OworCitzdHJ1Y3QgcHY4ODA4MF9jb21wYXRpYmxlX3JlZ21hcCB7CisJLyogQlVDSzEsIDIsIDMgKi8KKwlzdHJ1Y3QgcHY4ODA4MF9idWNrX3JlZ21hcCBidWNrX3JlZ21hcFtQVjg4MDgwX01BWF9SRUdVTEFUT1JTLTFdOworCS8qIEhWQlVDSyAqLworCWludCBodmJ1Y2tfZW5hYmxlX3JlZzsKKwlpbnQgaHZidWNrX3ZzZWxfcmVnOworCWludCBodmJ1Y2tfZW5hYmxlX21hc2s7CisJaW50IGh2YnVja192c2VsX21hc2s7Cit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcHY4ODA4MF9yZWdtYXBfY29uZmlnID0gewogCS5yZWdfYml0cyA9IDgsCiAJLnZhbF9iaXRzID0gOCwKQEAgLTg5LDEzICsxMjMsMTExIEBACiAJfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHY4ODA4MF9jb21wYXRpYmxlX3JlZ21hcCBwdjg4MDgwX2FhX3JlZ3MgPSB7CisJLyogQlVDSzEgKi8KKwkuYnVja19yZWdtYXBbMF0gPSB7CisJCS5idWNrX2VuYWJsZV9yZWcgICAgICA9IFBWODgwODBBQV9SRUdfQlVDSzFfQ09ORjAsCisJCS5idWNrX3ZzZWxfcmVnICAgICAgICA9IFBWODgwODBBQV9SRUdfQlVDSzFfQ09ORjAsCisJCS5idWNrX21vZGVfcmVnICAgICAgICA9IFBWODgwODBBQV9SRUdfQlVDSzFfQ09ORjEsCisJCS5idWNrX2xpbWl0X3JlZyAgICAgICA9IFBWODgwODBBQV9SRUdfQlVDSzFfQ09ORjEsCisJCS5idWNrX3ZkYWNfcmFuZ2VfcmVnICA9IFBWODgwODBBQV9SRUdfQlVDSzFfQ09ORjIsCisJCS5idWNrX3ZyYW5nZV9nYWluX3JlZyA9IFBWODgwODBBQV9SRUdfQlVDSzFfQ09ORjUsCisJCS5idWNrX2VuYWJsZV9tYXNrICAgICA9IFBWODgwODBfQlVDSzFfRU4sCisJCS5idWNrX3ZzZWxfbWFzayAgICAgICA9IFBWODgwODBfVkJVQ0sxX01BU0ssCisJCS5idWNrX2xpbWl0X21hc2sgICAgICA9IFBWODgwODBfQlVDSzFfSUxJTV9NQVNLLAorCX0sCisJLyogQlVDSzIgKi8KKwkuYnVja19yZWdtYXBbMV0gPSB7CisJCS5idWNrX2VuYWJsZV9yZWcgICAgICA9IFBWODgwODBBQV9SRUdfQlVDSzJfQ09ORjAsCisJCS5idWNrX3ZzZWxfcmVnICAgICAgICA9IFBWODgwODBBQV9SRUdfQlVDSzJfQ09ORjAsCisJCS5idWNrX21vZGVfcmVnICAgICAgICA9IFBWODgwODBBQV9SRUdfQlVDSzJfQ09ORjEsCisJCS5idWNrX2xpbWl0X3JlZwkgICAgICA9IFBWODgwODBBQV9SRUdfQlVDSzJfQ09ORjEsCisJCS5idWNrX3ZkYWNfcmFuZ2VfcmVnICA9IFBWODgwODBBQV9SRUdfQlVDSzJfQ09ORjIsCisJCS5idWNrX3ZyYW5nZV9nYWluX3JlZyA9IFBWODgwODBBQV9SRUdfQlVDSzJfQ09ORjUsCisJCS5idWNrX2VuYWJsZV9tYXNrCSAgPSBQVjg4MDgwX0JVQ0syX0VOLAorCQkuYnVja192c2VsX21hc2sgICAgICAgPSBQVjg4MDgwX1ZCVUNLMl9NQVNLLAorCQkuYnVja19saW1pdF9tYXNrICAgICAgPSBQVjg4MDgwX0JVQ0syX0lMSU1fTUFTSywKKwl9LAorCS8qIEJVQ0szICovCisJLmJ1Y2tfcmVnbWFwWzJdID0geworCQkuYnVja19lbmFibGVfcmVnCSAgPSBQVjg4MDgwQUFfUkVHX0JVQ0szX0NPTkYwLAorCQkuYnVja192c2VsX3JlZyAgICAgICAgPSBQVjg4MDgwQUFfUkVHX0JVQ0szX0NPTkYwLAorCQkuYnVja19tb2RlX3JlZyAgICAgICAgPSBQVjg4MDgwQUFfUkVHX0JVQ0szX0NPTkYxLAorCQkuYnVja19saW1pdF9yZWcJICAgICAgPSBQVjg4MDgwQUFfUkVHX0JVQ0szX0NPTkYxLAorCQkuYnVja192ZGFjX3JhbmdlX3JlZyAgPSBQVjg4MDgwQUFfUkVHX0JVQ0szX0NPTkYyLAorCQkuYnVja192cmFuZ2VfZ2Fpbl9yZWcgPSBQVjg4MDgwQUFfUkVHX0JVQ0szX0NPTkY1LAorCQkuYnVja19lbmFibGVfbWFzawkgID0gUFY4ODA4MF9CVUNLM19FTiwKKwkJLmJ1Y2tfdnNlbF9tYXNrICAgICAgID0gUFY4ODA4MF9WQlVDSzNfTUFTSywKKwkJLmJ1Y2tfbGltaXRfbWFzayAgICAgID0gUFY4ODA4MF9CVUNLM19JTElNX01BU0ssCisJfSwKKwkvKiBIVkJVQ0sgKi8KKwkuaHZidWNrX2VuYWJsZV9yZWcJICAgICAgPSBQVjg4MDgwQUFfUkVHX0hWQlVDS19DT05GMiwKKwkuaHZidWNrX3ZzZWxfcmVnICAgICAgICAgID0gUFY4ODA4MEFBX1JFR19IVkJVQ0tfQ09ORjEsCisJLmh2YnVja19lbmFibGVfbWFzayAgICAgICA9IFBWODgwODBfSFZCVUNLX0VOLAorCS5odmJ1Y2tfdnNlbF9tYXNrICAgICAgICAgPSBQVjg4MDgwX1ZIVkJVQ0tfTUFTSywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHY4ODA4MF9jb21wYXRpYmxlX3JlZ21hcCBwdjg4MDgwX2JhX3JlZ3MgPSB7CisJLyogQlVDSzEgKi8KKwkuYnVja19yZWdtYXBbMF0gPSB7CisJCS5idWNrX2VuYWJsZV9yZWcJICA9IFBWODgwODBCQV9SRUdfQlVDSzFfQ09ORjAsCisJCS5idWNrX3ZzZWxfcmVnICAgICAgICA9IFBWODgwODBCQV9SRUdfQlVDSzFfQ09ORjAsCisJCS5idWNrX21vZGVfcmVnICAgICAgICA9IFBWODgwODBCQV9SRUdfQlVDSzFfQ09ORjEsCisJCS5idWNrX2xpbWl0X3JlZyAgICAgICA9IFBWODgwODBCQV9SRUdfQlVDSzFfQ09ORjEsCisJCS5idWNrX3ZkYWNfcmFuZ2VfcmVnICA9IFBWODgwODBCQV9SRUdfQlVDSzFfQ09ORjIsCisJCS5idWNrX3ZyYW5nZV9nYWluX3JlZyA9IFBWODgwODBCQV9SRUdfQlVDSzFfQ09ORjUsCisJCS5idWNrX2VuYWJsZV9tYXNrICAgICA9IFBWODgwODBfQlVDSzFfRU4sCisJCS5idWNrX3ZzZWxfbWFzayAgICAgICA9IFBWODgwODBfVkJVQ0sxX01BU0ssCisJCS5idWNrX2xpbWl0X21hc2sJICA9IFBWODgwODBfQlVDSzFfSUxJTV9NQVNLLAorCX0sCisJLyogQlVDSzIgKi8KKwkuYnVja19yZWdtYXBbMV0gPSB7CisJCS5idWNrX2VuYWJsZV9yZWcJICA9IFBWODgwODBCQV9SRUdfQlVDSzJfQ09ORjAsCisJCS5idWNrX3ZzZWxfcmVnICAgICAgICA9IFBWODgwODBCQV9SRUdfQlVDSzJfQ09ORjAsCisJCS5idWNrX21vZGVfcmVnICAgICAgICA9IFBWODgwODBCQV9SRUdfQlVDSzJfQ09ORjEsCisJCS5idWNrX2xpbWl0X3JlZwkgICAgICA9IFBWODgwODBCQV9SRUdfQlVDSzJfQ09ORjEsCisJCS5idWNrX3ZkYWNfcmFuZ2VfcmVnICA9IFBWODgwODBCQV9SRUdfQlVDSzJfQ09ORjIsCisJCS5idWNrX3ZyYW5nZV9nYWluX3JlZyA9IFBWODgwODBCQV9SRUdfQlVDSzJfQ09ORjUsCisJCS5idWNrX2VuYWJsZV9tYXNrCSAgPSBQVjg4MDgwX0JVQ0syX0VOLAorCQkuYnVja192c2VsX21hc2sgICAgICAgPSBQVjg4MDgwX1ZCVUNLMl9NQVNLLAorCQkuYnVja19saW1pdF9tYXNrCSAgPSBQVjg4MDgwX0JVQ0syX0lMSU1fTUFTSywKKwl9LAorCS8qIEJVQ0szICovCisJLmJ1Y2tfcmVnbWFwWzJdID0geworCQkuYnVja19lbmFibGVfcmVnCSAgPSBQVjg4MDgwQkFfUkVHX0JVQ0szX0NPTkYwLAorCQkuYnVja192c2VsX3JlZyAgICAgICAgPSBQVjg4MDgwQkFfUkVHX0JVQ0szX0NPTkYwLAorCQkuYnVja19tb2RlX3JlZyAgICAgICAgPSBQVjg4MDgwQkFfUkVHX0JVQ0szX0NPTkYxLAorCQkuYnVja19saW1pdF9yZWcJICAgICAgPSBQVjg4MDgwQkFfUkVHX0JVQ0szX0NPTkYxLAorCQkuYnVja192ZGFjX3JhbmdlX3JlZyAgPSBQVjg4MDgwQkFfUkVHX0JVQ0szX0NPTkYyLAorCQkuYnVja192cmFuZ2VfZ2Fpbl9yZWcgPSBQVjg4MDgwQkFfUkVHX0JVQ0szX0NPTkY1LAorCQkuYnVja19lbmFibGVfbWFzawkgID0gUFY4ODA4MF9CVUNLM19FTiwKKwkJLmJ1Y2tfdnNlbF9tYXNrICAgICAgID0gUFY4ODA4MF9WQlVDSzNfTUFTSywKKwkJLmJ1Y2tfbGltaXRfbWFzawkgID0gUFY4ODA4MF9CVUNLM19JTElNX01BU0ssCisJfSwKKwkvKiBIVkJVQ0sgKi8KKwkuaHZidWNrX2VuYWJsZV9yZWcJICAgICAgPSBQVjg4MDgwQkFfUkVHX0hWQlVDS19DT05GMiwKKwkuaHZidWNrX3ZzZWxfcmVnICAgICAgICAgID0gUFY4ODA4MEJBX1JFR19IVkJVQ0tfQ09ORjEsCisJLmh2YnVja19lbmFibGVfbWFzayAgICAgICA9IFBWODgwODBfSFZCVUNLX0VOLAorCS5odmJ1Y2tfdnNlbF9tYXNrCQkgID0gUFY4ODA4MF9WSFZCVUNLX01BU0ssCit9OworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwdjg4MDgwX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAicHZzLHB2ODgwODAiLCAgICAuZGF0YSA9ICh2b2lkICopVFlQRV9QVjg4MDgwX0FBIH0sCisJeyAuY29tcGF0aWJsZSA9ICJwdnMscHY4ODA4MC1hYSIsIC5kYXRhID0gKHZvaWQgKilUWVBFX1BWODgwODBfQUEgfSwKKwl7IC5jb21wYXRpYmxlID0gInB2cyxwdjg4MDgwLWJhIiwgLmRhdGEgPSAodm9pZCAqKVRZUEVfUFY4ODA4MF9CQSB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHB2ODgwODBfZHRfaWRzKTsKKyNlbmRpZgorCiBzdGF0aWMgdW5zaWduZWQgaW50IHB2ODgwODBfYnVja19nZXRfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlzdHJ1Y3QgcHY4ODA4MF9yZWd1bGF0b3IgKmluZm8gPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOwogCXVuc2lnbmVkIGludCBkYXRhOwogCWludCByZXQsIG1vZGUgPSAwOwogCi0JcmV0ID0gcmVnbWFwX3JlYWQocmRldi0+cmVnbWFwLCBpbmZvLT5jb25mLCAmZGF0YSk7CisJcmV0ID0gcmVnbWFwX3JlYWQocmRldi0+cmVnbWFwLCBpbmZvLT5tb2RlX3JlZywgJmRhdGEpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMzYsNyArMjY4LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhyZGV2LT5yZWdtYXAsIGluZm8tPmNvbmYsCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhyZGV2LT5yZWdtYXAsIGluZm8tPm1vZGVfcmVnLAogCQkJCQlQVjg4MDgwX0JVQ0sxX01PREVfTUFTSywgdmFsKTsKIH0KIApAQCAtMTUxLDcgKzI4Myw3IEBACiAJCWlmIChtaW4gPD0gaW5mby0+Y3VycmVudF9saW1pdHNbaV0KIAkJCSYmIG1heCA+PSBpbmZvLT5jdXJyZW50X2xpbWl0c1tpXSkgewogCQkJCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMocmRldi0+cmVnbWFwLAotCQkJCQlpbmZvLT5jb25mLAorCQkJCQlpbmZvLT5saW1pdF9yZWcsCiAJCQkJCWluZm8tPmxpbWl0X21hc2ssCiAJCQkJCWkgPDwgUFY4ODA4MF9CVUNLMV9JTElNX1NISUZUKTsKIAkJfQpAQCAtMTY2LDcgKzI5OCw3IEBACiAJdW5zaWduZWQgaW50IGRhdGE7CiAJaW50IHJldDsKIAotCXJldCA9IHJlZ21hcF9yZWFkKHJkZXYtPnJlZ21hcCwgaW5mby0+Y29uZiwgJmRhdGEpOworCXJldCA9IHJlZ21hcF9yZWFkKHJkZXYtPnJlZ21hcCwgaW5mby0+bGltaXRfcmVnLCAmZGF0YSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTE4Nyw2ICszMTksMTUgQEAKIAkuZ2V0X2N1cnJlbnRfbGltaXQgPSBwdjg4MDgwX2dldF9jdXJyZW50X2xpbWl0LAogfTsKIAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHB2ODgwODBfaHZidWNrX29wcyA9IHsKKwkuZW5hYmxlID0gcmVndWxhdG9yX2VuYWJsZV9yZWdtYXAsCisJLmRpc2FibGUgPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCisJLmlzX2VuYWJsZWQgPSByZWd1bGF0b3JfaXNfZW5hYmxlZF9yZWdtYXAsCisJLnNldF92b2x0YWdlX3NlbCA9IHJlZ3VsYXRvcl9zZXRfdm9sdGFnZV9zZWxfcmVnbWFwLAorCS5nZXRfdm9sdGFnZV9zZWwgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Vfc2VsX3JlZ21hcCwKKwkubGlzdF92b2x0YWdlID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXIsCit9OworCiAjZGVmaW5lIFBWODgwODBfQlVDSyhjaGlwLCByZWdsX25hbWUsIG1pbiwgc3RlcCwgbWF4LCBsaW1pdHNfYXJyYXkpIFwKIHtcCiAJLmRlc2MJPQl7XApAQCAtMjAwLDE3ICszNDEsMjUgQEAKIAkJLm1pbl91ViA9IG1pbiwgXAogCQkudVZfc3RlcCA9IHN0ZXAsIFwKIAkJLm5fdm9sdGFnZXMgPSAoKG1heCkgLSAobWluKSkvKHN0ZXApICsgMSwgXAotCQkuZW5hYmxlX3JlZyA9IFBWODgwODBfUkVHXyMjcmVnbF9uYW1lIyNfQ09ORjAsIFwKLQkJLmVuYWJsZV9tYXNrID0gUFY4ODA4MF8jI3JlZ2xfbmFtZSMjX0VOLCBcCi0JCS52c2VsX3JlZyA9IFBWODgwODBfUkVHXyMjcmVnbF9uYW1lIyNfQ09ORjAsIFwKLQkJLnZzZWxfbWFzayA9IFBWODgwODBfViMjcmVnbF9uYW1lIyNfTUFTSywgXAogCX0sXAogCS5jdXJyZW50X2xpbWl0cyA9IGxpbWl0c19hcnJheSwgXAogCS5uX2N1cnJlbnRfbGltaXRzID0gQVJSQVlfU0laRShsaW1pdHNfYXJyYXkpLCBcCi0JLmxpbWl0X21hc2sgPSBQVjg4MDgwXyMjcmVnbF9uYW1lIyNfSUxJTV9NQVNLLCBcCi0JLmNvbmYgPSBQVjg4MDgwX1JFR18jI3JlZ2xfbmFtZSMjX0NPTkYxLCBcCi0JLmNvbmYyID0gUFY4ODA4MF9SRUdfIyNyZWdsX25hbWUjI19DT05GMiwgXAotCS5jb25mNSA9IFBWODgwODBfUkVHXyMjcmVnbF9uYW1lIyNfQ09ORjUsIFwKK30KKworI2RlZmluZSBQVjg4MDgwX0hWQlVDSyhjaGlwLCByZWdsX25hbWUsIG1pbiwgc3RlcCwgbWF4KSBcCit7XAorCS5kZXNjCT0Je1wKKwkJLmlkID0gY2hpcCMjX0lEXyMjcmVnbF9uYW1lLFwKKwkJLm5hbWUgPSBfX3N0cmluZ2lmeShjaGlwIyNfIyNyZWdsX25hbWUpLFwKKwkJLm9mX21hdGNoID0gb2ZfbWF0Y2hfcHRyKCNyZWdsX25hbWUpLFwKKwkJLnJlZ3VsYXRvcnNfbm9kZSA9IG9mX21hdGNoX3B0cigicmVndWxhdG9ycyIpLFwKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSxcCisJCS5vd25lciA9IFRISVNfTU9EVUxFLFwKKwkJLm9wcyA9ICZwdjg4MDgwX2h2YnVja19vcHMsXAorCQkubWluX3VWID0gbWluLCBcCisJCS51Vl9zdGVwID0gc3RlcCwgXAorCQkubl92b2x0YWdlcyA9ICgobWF4KSAtIChtaW4pKS8oc3RlcCkgKyAxLCBcCisJfSxcCiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHY4ODA4MF9yZWd1bGF0b3IgcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tdID0gewpAQCAtMjIwLDYgKzM2OSw3IEBACiAJCXB2ODgwODBfYnVjazIzX2xpbWl0cyksCiAJUFY4ODA4MF9CVUNLKFBWODgwODAsIEJVQ0szLCA2MDAwMDAsIDYyNTAsIDEzOTM3NTAsCiAJCXB2ODgwODBfYnVjazIzX2xpbWl0cyksCisJUFY4ODA4MF9IVkJVQ0soUFY4ODA4MCwgSFZCVUNLLCAwLCA1MDAwLCAxMjc1MDAwKSwKIH07CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBwdjg4MDgwX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCkBAIC0yODAsNiArNDMwLDggQEAKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdF9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmaTJjLT5kZXYpOwogCXN0cnVjdCBwdjg4MDgwICpjaGlwOworCWNvbnN0IHN0cnVjdCBwdjg4MDgwX2NvbXBhdGlibGVfcmVnbWFwICpyZWdtYXBfY29uZmlnOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCXN0cnVjdCByZWd1bGF0b3JfY29uZmlnIGNvbmZpZyA9IHsgfTsKIAlpbnQgaSwgZXJyb3IsIHJldDsKIAl1bnNpZ25lZCBpbnQgY29uZjIsIGNvbmY1OwpAQCAtMjk3LDYgKzQ0OSwxNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCisJaWYgKGkyYy0+ZGV2Lm9mX25vZGUpIHsKKwkJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKHB2ODgwODBfZHRfaWRzLCBpMmMtPmRldi5vZl9ub2RlKTsKKwkJaWYgKCFtYXRjaCkgeworCQkJZGV2X2VycihjaGlwLT5kZXYsICJGYWlsZWQgdG8gZ2V0IG9mX21hdGNoX25vZGVcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJY2hpcC0+dHlwZSA9ICh1bnNpZ25lZCBsb25nKW1hdGNoLT5kYXRhOworCX0gZWxzZSB7CisJCWNoaXAtPnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CisJfQorCiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgY2hpcCk7CiAKIAlpZiAoaTJjLT5pcnEgIT0gMCkgewpAQCAtMzM2LDMxICs0OTksNTggQEAKIAkJCQkiRmFpbGVkIHRvIHVwZGF0ZSBtYXNrIHJlZzogJWRcbiIsIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0KIAl9IGVsc2UgewogCQlkZXZfd2FybihjaGlwLT5kZXYsICJObyBJUlEgY29uZmlndXJlZFxuIik7CiAJfQogCisJc3dpdGNoIChjaGlwLT50eXBlKSB7CisJY2FzZSBUWVBFX1BWODgwODBfQUE6CisJCWNoaXAtPnJlZ21hcF9jb25maWcgPSAmcHY4ODA4MF9hYV9yZWdzOworCQlicmVhazsKKwljYXNlIFRZUEVfUFY4ODA4MF9CQToKKwkJY2hpcC0+cmVnbWFwX2NvbmZpZyA9ICZwdjg4MDgwX2JhX3JlZ3M7CisJCWJyZWFrOworCX0KKworCXJlZ21hcF9jb25maWcgPSBjaGlwLT5yZWdtYXBfY29uZmlnOwogCWNvbmZpZy5kZXYgPSBjaGlwLT5kZXY7CiAJY29uZmlnLnJlZ21hcCA9IGNoaXAtPnJlZ21hcDsKIAotCWZvciAoaSA9IDA7IGkgPCBQVjg4MDgwX01BWF9SRUdVTEFUT1JTOyBpKyspIHsKKwkvKiBSZWdpc3RlcmF0aW9uIGZvciBCVUNLMSwgMiwgMyAqLworCWZvciAoaSA9IDA7IGkgPCBQVjg4MDgwX01BWF9SRUdVTEFUT1JTLTE7IGkrKykgewogCQlpZiAoaW5pdF9kYXRhKQogCQkJY29uZmlnLmluaXRfZGF0YSA9ICZpbml0X2RhdGFbaV07CiAKKwkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5saW1pdF9yZWcKKwkJCT0gcmVnbWFwX2NvbmZpZy0+YnVja19yZWdtYXBbaV0uYnVja19saW1pdF9yZWc7CisJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0ubGltaXRfbWFzaworCQkJPSByZWdtYXBfY29uZmlnLT5idWNrX3JlZ21hcFtpXS5idWNrX2xpbWl0X21hc2s7CisJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0ubW9kZV9yZWcKKwkJCT0gcmVnbWFwX2NvbmZpZy0+YnVja19yZWdtYXBbaV0uYnVja19tb2RlX3JlZzsKKwkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5jb25mMgorCQkJPSByZWdtYXBfY29uZmlnLT5idWNrX3JlZ21hcFtpXS5idWNrX3ZkYWNfcmFuZ2VfcmVnOworCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmNvbmY1CisJCQk9IHJlZ21hcF9jb25maWctPmJ1Y2tfcmVnbWFwW2ldLmJ1Y2tfdnJhbmdlX2dhaW5fcmVnOworCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmRlc2MuZW5hYmxlX3JlZworCQkJPSByZWdtYXBfY29uZmlnLT5idWNrX3JlZ21hcFtpXS5idWNrX2VuYWJsZV9yZWc7CisJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0uZGVzYy5lbmFibGVfbWFzaworCQkJPSByZWdtYXBfY29uZmlnLT5idWNrX3JlZ21hcFtpXS5idWNrX2VuYWJsZV9tYXNrOworCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmRlc2MudnNlbF9yZWcKKwkJCT0gcmVnbWFwX2NvbmZpZy0+YnVja19yZWdtYXBbaV0uYnVja192c2VsX3JlZzsKKwkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5kZXNjLnZzZWxfbWFzaworCQkJPSByZWdtYXBfY29uZmlnLT5idWNrX3JlZ21hcFtpXS5idWNrX3ZzZWxfbWFzazsKKwogCQlyZXQgPSByZWdtYXBfcmVhZChjaGlwLT5yZWdtYXAsCi0JCQlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW2ldLmNvbmYyLCAmY29uZjIpOworCQkJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0uY29uZjIsICZjb25mMik7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKLQogCQljb25mMiA9ICgoY29uZjIgPj4gUFY4ODA4MF9CVUNLX1ZEQUNfUkFOR0VfU0hJRlQpICYKIAkJCVBWODgwODBfQlVDS19WREFDX1JBTkdFX01BU0spOwogCiAJCXJldCA9IHJlZ21hcF9yZWFkKGNoaXAtPnJlZ21hcCwKLQkJCXB2ODgwODBfcmVndWxhdG9yX2luZm9baV0uY29uZjUsICZjb25mNSk7CisJCQkJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tpXS5jb25mNSwgJmNvbmY1KTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwotCiAJCWNvbmY1ID0gKChjb25mNSA+PiBQVjg4MDgwX0JVQ0tfVlJBTkdFX0dBSU5fU0hJRlQpICYKIAkJCVBWODgwODBfQlVDS19WUkFOR0VfR0FJTl9NQVNLKTsKIApAQCAtMzgzLDIzICs1NzMsMzggQEAKIAkJfQogCX0KIAorCXB2ODgwODBfcmVndWxhdG9yX2luZm9bUFY4ODA4MF9JRF9IVkJVQ0tdLmRlc2MuZW5hYmxlX3JlZworCQk9IHJlZ21hcF9jb25maWctPmh2YnVja19lbmFibGVfcmVnOworCXB2ODgwODBfcmVndWxhdG9yX2luZm9bUFY4ODA4MF9JRF9IVkJVQ0tdLmRlc2MuZW5hYmxlX21hc2sKKwkJPSByZWdtYXBfY29uZmlnLT5odmJ1Y2tfZW5hYmxlX21hc2s7CisJcHY4ODA4MF9yZWd1bGF0b3JfaW5mb1tQVjg4MDgwX0lEX0hWQlVDS10uZGVzYy52c2VsX3JlZworCQk9IHJlZ21hcF9jb25maWctPmh2YnVja192c2VsX3JlZzsKKwlwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW1BWODgwODBfSURfSFZCVUNLXS5kZXNjLnZzZWxfbWFzaworCQk9IHJlZ21hcF9jb25maWctPmh2YnVja192c2VsX21hc2s7CisKKwkvKiBSZWdpc3RlcmF0aW9uIGZvciBIVkJVQ0sgKi8KKwlpZiAoaW5pdF9kYXRhKQorCQljb25maWcuaW5pdF9kYXRhID0gJmluaXRfZGF0YVtQVjg4MDgwX0lEX0hWQlVDS107CisKKwljb25maWcuZHJpdmVyX2RhdGEgPSAodm9pZCAqKSZwdjg4MDgwX3JlZ3VsYXRvcl9pbmZvW1BWODgwODBfSURfSFZCVUNLXTsKKwljaGlwLT5yZGV2W1BWODgwODBfSURfSFZCVUNLXSA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKGNoaXAtPmRldiwKKwkJJnB2ODgwODBfcmVndWxhdG9yX2luZm9bUFY4ODA4MF9JRF9IVkJVQ0tdLmRlc2MsICZjb25maWcpOworCWlmIChJU19FUlIoY2hpcC0+cmRldltQVjg4MDgwX0lEX0hWQlVDS10pKSB7CisJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFBWODgwODAgcmVndWxhdG9yXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2hpcC0+cmRldltQVjg4MDgwX0lEX0hWQlVDS10pOworCX0KKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgcHY4ODA4MF9pMmNfaWRbXSA9IHsKLQl7InB2ODgwODAiLCAwfSwKKwl7ICJwdjg4MDgwIiwgICAgVFlQRV9QVjg4MDgwX0FBIH0sCisJeyAicHY4ODA4MC1hYSIsIFRZUEVfUFY4ODA4MF9BQSB9LAorCXsgInB2ODgwODAtYmEiLCBUWVBFX1BWODgwODBfQkEgfSwKIAl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcHY4ODA4MF9pMmNfaWQpOwogCi0jaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwdjg4MDgwX2R0X2lkc1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAicHZzLHB2ODgwODAiLCAuZGF0YSA9ICZwdjg4MDgwX2kyY19pZFswXSB9LAotCXt9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHB2ODgwODBfZHRfaWRzKTsKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcHY4ODA4MF9yZWd1bGF0b3JfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gInB2ODgwODAiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvcHY4ODA4MC1yZWd1bGF0b3IuaCBiL2RyaXZlcnMvcmVndWxhdG9yL3B2ODgwODAtcmVndWxhdG9yLmgKaW5kZXggNWU5YWZkZS4uYWUyNWZmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvcHY4ODA4MC1yZWd1bGF0b3IuaAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9wdjg4MDgwLXJlZ3VsYXRvci5oCkBAIC0xNyw1NSArMTcsNzUgQEAKICNkZWZpbmUgX19QVjg4MDgwX1JFR0lTVEVSU19IX18KIAogLyogU3lzdGVtIENvbnRyb2wgYW5kIEV2ZW50IFJlZ2lzdGVycyAqLwotI2RlZmluZQlQVjg4MDgwX1JFR19FVkVOVF9BCQkJMHgwNAotI2RlZmluZQlQVjg4MDgwX1JFR19NQVNLX0EJCQkweDA5Ci0jZGVmaW5lCVBWODgwODBfUkVHX01BU0tfQgkJCTB4MGEKLSNkZWZpbmUJUFY4ODA4MF9SRUdfTUFTS19DCQkJMHgwYgorI2RlZmluZQlQVjg4MDgwX1JFR19FVkVOVF9BCQkJCTB4MDQKKyNkZWZpbmUJUFY4ODA4MF9SRUdfTUFTS19BCQkJCTB4MDkKKyNkZWZpbmUJUFY4ODA4MF9SRUdfTUFTS19CCQkJCTB4MEEKKyNkZWZpbmUJUFY4ODA4MF9SRUdfTUFTS19DCQkJCTB4MEIKIAotLyogUmVndWxhdG9yIFJlZ2lzdGVycyAqLwotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLMV9DT05GMAkJCTB4MjcKLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzFfQ09ORjEJCQkweDI4Ci0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0sxX0NPTkYyCQkJMHg1OQotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLMV9DT05GNQkJCTB4NWMKLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjAJCQkweDI5Ci0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0syX0NPTkYxCQkJMHgyYQotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLMl9DT05GMgkJCTB4NjEKLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjUJCQkweDY0Ci0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0szX0NPTkYwCQkJMHgyYgotI2RlZmluZQlQVjg4MDgwX1JFR19CVUNLM19DT05GMQkJCTB4MmMKLSNkZWZpbmUJUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjIJCQkweDY5Ci0jZGVmaW5lCVBWODgwODBfUkVHX0JVQ0szX0NPTkY1CQkJMHg2YworLyogUmVndWxhdG9yIFJlZ2lzdGVycyAtIHJldi4gQUEgKi8KKyNkZWZpbmUgUFY4ODA4MEFBX1JFR19IVkJVQ0tfQ09ORjEJCTB4MkQKKyNkZWZpbmUgUFY4ODA4MEFBX1JFR19IVkJVQ0tfQ09ORjIJCTB4MkUKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLMV9DT05GMAkJMHgyNworI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0sxX0NPTkYxCQkweDI4CisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzFfQ09ORjIJCTB4NTkKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLMV9DT05GNQkJMHg1QworI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0syX0NPTkYwCQkweDI5CisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzJfQ09ORjEJCTB4MkEKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLMl9DT05GMgkJMHg2MQorI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0syX0NPTkY1CQkweDY0CisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzNfQ09ORjAJCTB4MkIKKyNkZWZpbmUJUFY4ODA4MEFBX1JFR19CVUNLM19DT05GMQkJMHgyQworI2RlZmluZQlQVjg4MDgwQUFfUkVHX0JVQ0szX0NPTkYyCQkweDY5CisjZGVmaW5lCVBWODgwODBBQV9SRUdfQlVDSzNfQ09ORjUJCTB4NkMKKworLyogUmVndWxhdG9yIFJlZ2lzdGVycyAtIHJldi4gQkEgKi8KKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19IVkJVQ0tfQ09ORjEJCTB4MzMKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19IVkJVQ0tfQ09ORjIJCTB4MzQKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLMV9DT05GMAkJMHgyQQorI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0sxX0NPTkYxCQkweDJDCisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzFfQ09ORjIJCTB4NUEKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLMV9DT05GNQkJMHg1RAorI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0syX0NPTkYwCQkweDJECisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzJfQ09ORjEJCTB4MkYKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLMl9DT05GMgkJMHg2MworI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0syX0NPTkY1CQkweDY2CisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzNfQ09ORjAJCTB4MzAKKyNkZWZpbmUJUFY4ODA4MEJBX1JFR19CVUNLM19DT05GMQkJMHgzMgorI2RlZmluZQlQVjg4MDgwQkFfUkVHX0JVQ0szX0NPTkYyCQkweDZDCisjZGVmaW5lCVBWODgwODBCQV9SRUdfQlVDSzNfQ09ORjUJCTB4NkYKIAogLyogUFY4ODA4MF9SRUdfRVZFTlRfQSAoYWRkcj0weDA0KSAqLwogI2RlZmluZQlQVjg4MDgwX0VfVkREX0ZMVAkJCQkweDAxCi0jZGVmaW5lCVBWODgwODBfRV9PVkVSX1RFTVAJCQkweDAyCisjZGVmaW5lCVBWODgwODBfRV9PVkVSX1RFTVAJCQkJMHgwMgogCiAvKiBQVjg4MDgwX1JFR19NQVNLX0EgKGFkZHI9MHgwOSkgKi8KICNkZWZpbmUJUFY4ODA4MF9NX1ZERF9GTFQJCQkJMHgwMQotI2RlZmluZQlQVjg4MDgwX01fT1ZFUl9URU1QCQkJMHgwMgorI2RlZmluZQlQVjg4MDgwX01fT1ZFUl9URU1QCQkJCTB4MDIKIAotLyogUFY4ODA4MF9SRUdfQlVDSzFfQ09ORjAgKGFkZHI9MHgyNykgKi8KKy8qIFBWODgwODBfUkVHX0JVQ0sxX0NPTkYwIChhZGRyPTB4Mjd8MHgyQSkgKi8KICNkZWZpbmUJUFY4ODA4MF9CVUNLMV9FTgkJCQkweDgwCi0jZGVmaW5lIFBWODgwODBfVkJVQ0sxX01BU0sJCQkweDdGCi0vKiBQVjg4MDgwX1JFR19CVUNLMl9DT05GMCAoYWRkcj0weDI5KSAqLwotI2RlZmluZQlQVjg4MDgwX0JVQ0syX0VOCQkJCTB4ODAKLSNkZWZpbmUgUFY4ODA4MF9WQlVDSzJfTUFTSwkJCTB4N0YKLS8qIFBWODgwODBfUkVHX0JVQ0szX0NPTkYwIChhZGRyPTB4MmIpICovCi0jZGVmaW5lCVBWODgwODBfQlVDSzNfRU4JCQkJMHg4MAotI2RlZmluZSBQVjg4MDgwX1ZCVUNLM19NQVNLCQkJMHg3RgorI2RlZmluZSBQVjg4MDgwX1ZCVUNLMV9NQVNLCQkJCTB4N0YKIAotLyogUFY4ODA4MF9SRUdfQlVDSzFfQ09ORjEgKGFkZHI9MHgyOCkgKi8KLSNkZWZpbmUgUFY4ODA4MF9CVUNLMV9JTElNX1NISUZUCQkJMgorLyogUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjAgKGFkZHI9MHgyOXwweDJEKSAqLworI2RlZmluZQlQVjg4MDgwX0JVQ0syX0VOCQkJCTB4ODAKKyNkZWZpbmUgUFY4ODA4MF9WQlVDSzJfTUFTSwkJCQkweDdGCisKKy8qIFBWODgwODBfUkVHX0JVQ0szX0NPTkYwIChhZGRyPTB4MkJ8MHgzMCkgKi8KKyNkZWZpbmUJUFY4ODA4MF9CVUNLM19FTgkJCQkweDgwCisjZGVmaW5lIFBWODgwODBfVkJVQ0szX01BU0sJCQkJMHg3RgorCisvKiBQVjg4MDgwX1JFR19CVUNLMV9DT05GMSAoYWRkcj0weDI4fDB4MkMpICovCisjZGVmaW5lIFBWODgwODBfQlVDSzFfSUxJTV9TSElGVAkJMgogI2RlZmluZSBQVjg4MDgwX0JVQ0sxX0lMSU1fTUFTSwkJCTB4MEMKICNkZWZpbmUgUFY4ODA4MF9CVUNLMV9NT0RFX01BU0sJCQkweDAzCiAKLS8qIFBWODgwODBfUkVHX0JVQ0syX0NPTkYxIChhZGRyPTB4MmEpICovCi0jZGVmaW5lIFBWODgwODBfQlVDSzJfSUxJTV9TSElGVAkJCTIKKy8qIFBWODgwODBfUkVHX0JVQ0syX0NPTkYxIChhZGRyPTB4MkF8MHgyRikgKi8KKyNkZWZpbmUgUFY4ODA4MF9CVUNLMl9JTElNX1NISUZUCQkyCiAjZGVmaW5lIFBWODgwODBfQlVDSzJfSUxJTV9NQVNLCQkJMHgwQwogI2RlZmluZSBQVjg4MDgwX0JVQ0syX01PREVfTUFTSwkJCTB4MDMKIAotLyogUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjEgKGFkZHI9MHgyYykgKi8KLSNkZWZpbmUgUFY4ODA4MF9CVUNLM19JTElNX1NISUZUCQkJMgorLyogUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjEgKGFkZHI9MHgyQ3wweDMyKSAqLworI2RlZmluZSBQVjg4MDgwX0JVQ0szX0lMSU1fU0hJRlQJCTIKICNkZWZpbmUgUFY4ODA4MF9CVUNLM19JTElNX01BU0sJCQkweDBDCiAjZGVmaW5lIFBWODgwODBfQlVDSzNfTU9ERV9NQVNLCQkJMHgwMwogCkBAIC03MywyMCArOTMsMjYgQEAKICNkZWZpbmUJUFY4ODA4MF9CVUNLX01PREVfQVVUTwkJCTB4MDEKICNkZWZpbmUJUFY4ODA4MF9CVUNLX01PREVfU1lOQwkJCTB4MDIKIAotLyogUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjIgKGFkZHI9MHg2MSkgKi8KLS8qIFBWODgwODBfUkVHX0JVQ0szX0NPTkYyIChhZGRyPTB4NjkpICovCi0jZGVmaW5lIFBWODgwODBfQlVDS19WREFDX1JBTkdFX1NISUZUCQkJNwotI2RlZmluZSBQVjg4MDgwX0JVQ0tfVkRBQ19SQU5HRV9NQVNLCQkJMHgwMQorLyogUFY4ODA4MF9SRUdfSFZCVUNLX0NPTkYxIChhZGRyPTB4MkR8MHgzMykgKi8KKyNkZWZpbmUgUFY4ODA4MF9WSFZCVUNLX01BU0sJCQkweEZGCiAKLSNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZEQUNfUkFOR0VfMQkJCTB4MDAKLSNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZEQUNfUkFOR0VfMgkJCTB4MDEKKy8qIFBWODgwODBfUkVHX0hWQlVDS19DT05GMSAoYWRkcj0weDJFfDB4MzQpICovCisjZGVmaW5lIFBWODgwODBfSFZCVUNLX0VOCQkJCTB4MDEKIAotLyogUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjUgKGFkZHI9MHg2NCkgKi8KLS8qIFBWODgwODBfUkVHX0JVQ0szX0NPTkY1IChhZGRyPTB4NmMpICovCi0jZGVmaW5lIFBWODgwODBfQlVDS19WUkFOR0VfR0FJTl9TSElGVAkJCTAKLSNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZSQU5HRV9HQUlOX01BU0sJCQkweDAxCisvKiBQVjg4MDgwX1JFR19CVUNLMl9DT05GMiAoYWRkcj0weDYxfDB4NjMpICovCisvKiBQVjg4MDgwX1JFR19CVUNLM19DT05GMiAoYWRkcj0weDY5fDB4NkMpICovCisjZGVmaW5lIFBWODgwODBfQlVDS19WREFDX1JBTkdFX1NISUZUCTcKKyNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZEQUNfUkFOR0VfTUFTSwkweDAxCiAKLSNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZSQU5HRV9HQUlOXzEJCQkweDAwCi0jZGVmaW5lIFBWODgwODBfQlVDS19WUkFOR0VfR0FJTl8yCQkJMHgwMQorI2RlZmluZSBQVjg4MDgwX0JVQ0tfVkRBQ19SQU5HRV8xCQkweDAwCisjZGVmaW5lIFBWODgwODBfQlVDS19WREFDX1JBTkdFXzIJCTB4MDEKKworLyogUFY4ODA4MF9SRUdfQlVDSzJfQ09ORjUgKGFkZHI9MHg2NHwweDY2KSAqLworLyogUFY4ODA4MF9SRUdfQlVDSzNfQ09ORjUgKGFkZHI9MHg2Q3wweDZGKSAqLworI2RlZmluZSBQVjg4MDgwX0JVQ0tfVlJBTkdFX0dBSU5fU0hJRlQJMAorI2RlZmluZSBQVjg4MDgwX0JVQ0tfVlJBTkdFX0dBSU5fTUFTSwkweDAxCisKKyNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZSQU5HRV9HQUlOXzEJCTB4MDAKKyNkZWZpbmUgUFY4ODA4MF9CVUNLX1ZSQU5HRV9HQUlOXzIJCTB4MDEKIAogI2VuZGlmCS8qIF9fUFY4ODA4MF9SRUdJU1RFUlNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9wd20tcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9wd20tcmVndWxhdG9yLmMKaW5kZXggYzI0NTI0Mi4uMWI4OGUwZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3B3bS1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9wd20tcmVndWxhdG9yLmMKQEAgLTEwLDcgKzEwLDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KQEAgLTE5NCwxMiArMTkzLDEwIEBACiAJdW5zaWduZWQgaW50IG1pbl91Vl9kdXR5ID0gZHJ2ZGF0YS0+Y29udGludW91cy5taW5fdVZfZHV0eWN5Y2xlOwogCXVuc2lnbmVkIGludCBtYXhfdVZfZHV0eSA9IGRydmRhdGEtPmNvbnRpbnVvdXMubWF4X3VWX2R1dHljeWNsZTsKIAl1bnNpZ25lZCBpbnQgZHV0eV91bml0ID0gZHJ2ZGF0YS0+Y29udGludW91cy5kdXR5Y3ljbGVfdW5pdDsKLQl1bnNpZ25lZCBpbnQgcmFtcF9kZWxheSA9IHJkZXYtPmNvbnN0cmFpbnRzLT5yYW1wX2RlbGF5OwogCWludCBtaW5fdVYgPSByZGV2LT5jb25zdHJhaW50cy0+bWluX3VWOwogCWludCBtYXhfdVYgPSByZGV2LT5jb25zdHJhaW50cy0+bWF4X3VWOwogCWludCBkaWZmX3VWID0gbWF4X3VWIC0gbWluX3VWOwogCXN0cnVjdCBwd21fc3RhdGUgcHN0YXRlOwotCWludCBvbGRfdVYgPSBwd21fcmVndWxhdG9yX2dldF92b2x0YWdlKHJkZXYpOwogCXVuc2lnbmVkIGludCBkaWZmX2R1dHk7CiAJdW5zaWduZWQgaW50IGR1dHljeWNsZTsKIAlpbnQgcmV0OwpAQCAtMjMzLDEzICsyMzAsNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmICgocmFtcF9kZWxheSA9PSAwKSB8fCAhcHdtX3JlZ3VsYXRvcl9pc19lbmFibGVkKHJkZXYpKQotCQlyZXR1cm4gMDsKLQotCS8qIFJhbXAgZGVsYXkgaXMgaW4gdVYvdVMuIEFkanVzdCB0byB1UyBhbmQgZGVsYXkgKi8KLQlyYW1wX2RlbGF5ID0gRElWX1JPVU5EX1VQKGFicyhyZXFfbWluX3VWIC0gb2xkX3VWKSwgcmFtcF9kZWxheSk7Ci0JdXNsZWVwX3JhbmdlKHJhbXBfZGVsYXksIHJhbXBfZGVsYXkgKyBESVZfUk9VTkRfVVAocmFtcF9kZWxheSwgMTApKTsKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9xY29tX3JwbS1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3Fjb21fcnBtLXJlZ3VsYXRvci5jCmluZGV4IGUyNTQyNzIuLjFiMmFjYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3Fjb21fcnBtLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3Fjb21fcnBtLXJlZ3VsYXRvci5jCkBAIC00NDgsNiArNDQ4LDQ0IEBACiB9OwogCiAvKgorICogUE04MDE4IHJlZ3VsYXRvcnMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBxY29tX3JwbV9yZWcgcG04MDE4X3BsZG8gPSB7CisJLmRlc2MubGluZWFyX3JhbmdlcyA9IHBsZG9fcmFuZ2VzLAorCS5kZXNjLm5fbGluZWFyX3JhbmdlcyA9IEFSUkFZX1NJWkUocGxkb19yYW5nZXMpLAorCS5kZXNjLm5fdm9sdGFnZXMgPSAxNjEsCisJLmRlc2Mub3BzID0gJnVWX29wcywKKwkucGFydHMgPSAmcnBtODk2MF9sZG9fcGFydHMsCisJLnN1cHBvcnRzX2ZvcmNlX21vZGVfYXV0byA9IGZhbHNlLAorCS5zdXBwb3J0c19mb3JjZV9tb2RlX2J5cGFzcyA9IGZhbHNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBxY29tX3JwbV9yZWcgcG04MDE4X25sZG8gPSB7CisJLmRlc2MubGluZWFyX3JhbmdlcyA9IG5sZG9fcmFuZ2VzLAorCS5kZXNjLm5fbGluZWFyX3JhbmdlcyA9IEFSUkFZX1NJWkUobmxkb19yYW5nZXMpLAorCS5kZXNjLm5fdm9sdGFnZXMgPSA2NCwKKwkuZGVzYy5vcHMgPSAmdVZfb3BzLAorCS5wYXJ0cyA9ICZycG04OTYwX2xkb19wYXJ0cywKKwkuc3VwcG9ydHNfZm9yY2VfbW9kZV9hdXRvID0gZmFsc2UsCisJLnN1cHBvcnRzX2ZvcmNlX21vZGVfYnlwYXNzID0gZmFsc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHFjb21fcnBtX3JlZyBwbTgwMThfc21wcyA9IHsKKwkuZGVzYy5saW5lYXJfcmFuZ2VzID0gc21wc19yYW5nZXMsCisJLmRlc2Mubl9saW5lYXJfcmFuZ2VzID0gQVJSQVlfU0laRShzbXBzX3JhbmdlcyksCisJLmRlc2Mubl92b2x0YWdlcyA9IDE1NCwKKwkuZGVzYy5vcHMgPSAmdVZfb3BzLAorCS5wYXJ0cyA9ICZycG04OTYwX3NtcHNfcGFydHMsCisJLnN1cHBvcnRzX2ZvcmNlX21vZGVfYXV0byA9IGZhbHNlLAorCS5zdXBwb3J0c19mb3JjZV9tb2RlX2J5cGFzcyA9IGZhbHNlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBxY29tX3JwbV9yZWcgcG04MDE4X3N3aXRjaCA9IHsKKwkuZGVzYy5vcHMgPSAmc3dpdGNoX29wcywKKwkucGFydHMgPSAmcnBtODk2MF9zd2l0Y2hfcGFydHMsCit9OworCisvKgogICogUE04MDU4IHJlZ3VsYXRvcnMKICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBxY29tX3JwbV9yZWcgcG04MDU4X3BsZG8gPSB7CkBAIC03NTUsNiArNzkzLDMyIEBACiAJY29uc3QgY2hhciAqc3VwcGx5OwogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBycG1fcmVndWxhdG9yX2RhdGEgcnBtX3BtODAxOF9yZWd1bGF0b3JzW10gPSB7CisJeyAiczEiLCAgUUNPTV9SUE1fUE04MDE4X1NNUFMxLCAmcG04MDE4X3NtcHMsICJ2ZGRfczEiIH0sCisJeyAiczIiLCAgUUNPTV9SUE1fUE04MDE4X1NNUFMyLCAmcG04MDE4X3NtcHMsICJ2ZGRfczIiIH0sCisJeyAiczMiLCAgUUNPTV9SUE1fUE04MDE4X1NNUFMzLCAmcG04MDE4X3NtcHMsICJ2ZGRfczMiIH0sCisJeyAiczQiLCAgUUNPTV9SUE1fUE04MDE4X1NNUFM0LCAmcG04MDE4X3NtcHMsICJ2ZGRfczQiIH0sCisJeyAiczUiLCAgUUNPTV9SUE1fUE04MDE4X1NNUFM1LCAmcG04MDE4X3NtcHMsICJ2ZGRfczUiIH0sCisKKwl7ICJsMiIsICBRQ09NX1JQTV9QTTgwMThfTERPMiwgICZwbTgwMThfcGxkbywgInZkZF9sMiIgfSwKKwl7ICJsMyIsICBRQ09NX1JQTV9QTTgwMThfTERPMywgICZwbTgwMThfcGxkbywgInZkZF9sMyIgfSwKKwl7ICJsNCIsICBRQ09NX1JQTV9QTTgwMThfTERPNCwgICZwbTgwMThfcGxkbywgInZkZF9sNCIgfSwKKwl7ICJsNSIsICBRQ09NX1JQTV9QTTgwMThfTERPNSwgICZwbTgwMThfcGxkbywgInZkZF9sNSIgfSwKKwl7ICJsNiIsICBRQ09NX1JQTV9QTTgwMThfTERPNiwgICZwbTgwMThfcGxkbywgInZkZF9sNyIgfSwKKwl7ICJsNyIsICBRQ09NX1JQTV9QTTgwMThfTERPNywgICZwbTgwMThfcGxkbywgInZkZF9sNyIgfSwKKwl7ICJsOCIsICBRQ09NX1JQTV9QTTgwMThfTERPOCwgICZwbTgwMThfbmxkbywgInZkZF9sOCIgfSwKKwl7ICJsOSIsICBRQ09NX1JQTV9QTTgwMThfTERPOSwgICZwbTg5MjFfbmxkbzEyMDAsCisJCQkJCQkgICAgICAidmRkX2w5X2wxMF9sMTFfbDEyIiB9LAorCXsgImwxMCIsIFFDT01fUlBNX1BNODAxOF9MRE8xMCwgJnBtODAxOF9ubGRvLCAidmRkX2w5X2wxMF9sMTFfbDEyIiB9LAorCXsgImwxMSIsIFFDT01fUlBNX1BNODAxOF9MRE8xMSwgJnBtODAxOF9ubGRvLCAidmRkX2w5X2wxMF9sMTFfbDEyIiB9LAorCXsgImwxMiIsIFFDT01fUlBNX1BNODAxOF9MRE8xMiwgJnBtODAxOF9ubGRvLCAidmRkX2w5X2wxMF9sMTFfbDEyIiB9LAorCXsgImwxNCIsIFFDT01fUlBNX1BNODAxOF9MRE8xNCwgJnBtODAxOF9wbGRvLCAidmRkX2wxNCIgfSwKKworCXsgImx2czEiLCBRQ09NX1JQTV9QTTgwMThfTFZTMSwgJnBtODAxOF9zd2l0Y2gsICJsdnMxX2luIiB9LAorCisJeyB9Cit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJwbV9yZWd1bGF0b3JfZGF0YSBycG1fcG04MDU4X3JlZ3VsYXRvcnNbXSA9IHsKIAl7ICJsMCIsICAgUUNPTV9SUE1fUE04MDU4X0xETzAsICAgJnBtODA1OF9ubGRvLCAidmRkX2wwX2wxX2x2cyIJfSwKIAl7ICJsMSIsICAgUUNPTV9SUE1fUE04MDU4X0xETzEsICAgJnBtODA1OF9ubGRvLCAidmRkX2wwX2wxX2x2cyIgfSwKQEAgLTg3MCw2ICs5MzQsOCBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcnBtX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHJwbS1wbTgwMTgtcmVndWxhdG9ycyIsCisJCS5kYXRhID0gJnJwbV9wbTgwMThfcmVndWxhdG9ycyB9LAogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxycG0tcG04MDU4LXJlZ3VsYXRvcnMiLCAuZGF0YSA9ICZycG1fcG04MDU4X3JlZ3VsYXRvcnMgfSwKIAl7IC5jb21wYXRpYmxlID0gInFjb20scnBtLXBtODkwMS1yZWd1bGF0b3JzIiwgLmRhdGEgPSAmcnBtX3BtODkwMV9yZWd1bGF0b3JzIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHJwbS1wbTg5MjEtcmVndWxhdG9ycyIsIC5kYXRhID0gJnJwbV9wbTg5MjFfcmVndWxhdG9ycyB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvcWNvbV9zbWQtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9xY29tX3NtZC1yZWd1bGF0b3IuYwppbmRleCA1MDIyZmE4Li44ZWQ0NmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9xY29tX3NtZC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9xY29tX3NtZC1yZWd1bGF0b3IuYwpAQCAtMTc4LDIwICsxNzgsMjEgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcG1hODA4NF9mdHNtcHMgPSB7CiAJLmxpbmVhcl9yYW5nZXMgPSAoc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2VbXSkgewogCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDM1MDAwMCwgIDAsIDE4NCwgNTAwMCksCi0JCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoNzAwMDAwLCAxODUsIDMzOSwgMTAwMDApLAorCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDEyODAwMDAsIDE4NSwgMjYxLCAxMDAwMCksCiAJfSwKIAkubl9saW5lYXJfcmFuZ2VzID0gMiwKLQkubl92b2x0YWdlcyA9IDM0MCwKKwkubl92b2x0YWdlcyA9IDI2MiwKIAkub3BzID0gJnJwbV9zbXBzX2xkb19vcHMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHBtYTgwODRfcGxkbyA9IHsKIAkubGluZWFyX3JhbmdlcyA9IChzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZVtdKSB7Ci0JCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoNzUwMDAwLCAgMCwgIDMwLCAyNTAwMCksCi0JCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTUwMDAwMCwgMzEsIDk5LCA1MDAwMCksCisJCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoIDc1MDAwMCwgIDAsICA2MywgMTI1MDApLAorCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDE1NTAwMDAsIDY0LCAxMjYsIDI1MDAwKSwKKwkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgzMTAwMDAwLCAxMjcsIDE2MywgNTAwMDApLAogCX0sCi0JLm5fbGluZWFyX3JhbmdlcyA9IDIsCi0JLm5fdm9sdGFnZXMgPSAxMDAsCisJLm5fbGluZWFyX3JhbmdlcyA9IDMsCisJLm5fdm9sdGFnZXMgPSAxNjQsCiAJLm9wcyA9ICZycG1fc21wc19sZG9fb3BzLAogfTsKIApAQCAtMjIxLDI5ICsyMjIsMzAgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcG04ODQxX2Z0c21wcyA9IHsKIAkubGluZWFyX3JhbmdlcyA9IChzdHJ1Y3QgcmVndWxhdG9yX2xpbmVhcl9yYW5nZVtdKSB7CiAJCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMzUwMDAwLCAgMCwgMTg0LCA1MDAwKSwKLQkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg3MDAwMDAsIDE4NSwgMzM5LCAxMDAwMCksCisJCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTI4MDAwMCwgMTg1LCAyNjEsIDEwMDAwKSwKIAl9LAogCS5uX2xpbmVhcl9yYW5nZXMgPSAyLAotCS5uX3ZvbHRhZ2VzID0gMzQwLAorCS5uX3ZvbHRhZ2VzID0gMjYyLAogCS5vcHMgPSAmcnBtX3NtcHNfbGRvX29wcywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcG04OTQxX2Jvb3N0ID0gewogCS5saW5lYXJfcmFuZ2VzID0gKHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlW10pIHsKLQkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg0MDAwMDAwLCAwLCAxNSwgMTAwMDAwKSwKKwkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSg0MDAwMDAwLCAwLCAzMCwgNTAwMDApLAogCX0sCiAJLm5fbGluZWFyX3JhbmdlcyA9IDEsCi0JLm5fdm9sdGFnZXMgPSAxNiwKKwkubl92b2x0YWdlcyA9IDMxLAogCS5vcHMgPSAmcnBtX3NtcHNfbGRvX29wcywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgcG04OTQxX3BsZG8gPSB7CiAJLmxpbmVhcl9yYW5nZXMgPSAoc3RydWN0IHJlZ3VsYXRvcl9saW5lYXJfcmFuZ2VbXSkgewotCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKCA3NTAwMDAsICAwLCAgMzAsIDI1MDAwKSwKLQkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgxNTAwMDAwLCAzMSwgOTksIDUwMDAwKSwKKwkJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSggNzUwMDAwLCAgMCwgIDYzLCAxMjUwMCksCisJCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTU1MDAwMCwgNjQsIDEyNiwgMjUwMDApLAorCQlSRUdVTEFUT1JfTElORUFSX1JBTkdFKDMxMDAwMDAsIDEyNywgMTYzLCA1MDAwMCksCiAJfSwKLQkubl9saW5lYXJfcmFuZ2VzID0gMiwKLQkubl92b2x0YWdlcyA9IDEwMCwKKwkubl9saW5lYXJfcmFuZ2VzID0gMywKKwkubl92b2x0YWdlcyA9IDE2NCwKIAkub3BzID0gJnJwbV9zbXBzX2xkb19vcHMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9yazgwOC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3JrODA4LXJlZ3VsYXRvci5jCmluZGV4IDQwZDA3YmEuLjMzMTRiZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3JrODA4LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3JrODA4LXJlZ3VsYXRvci5jCkBAIC0xLDExICsxLDE1IEBACiAvKgotICogUmVndWxhdG9yIGRyaXZlciBmb3IgUm9ja2NoaXAgUks4MDgKKyAqIFJlZ3VsYXRvciBkcml2ZXIgZm9yIFJvY2tjaGlwIFJLODA4L1JLODE4CiAgKgogICogQ29weXJpZ2h0IChjKSAyMDE0LCBGdXpob3UgUm9ja2NoaXAgRWxlY3Ryb25pY3MgQ28uLCBMdGQKICAqCiAgKiBBdXRob3I6IENocmlzIFpob25nIDx6eXdAcm9jay1jaGlwcy5jb20+CiAgKiBBdXRob3I6IFpoYW5nIFFpbmcgPHpoYW5ncWluZ0Byb2NrLWNoaXBzLmNvbT4KICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgUEhZVEVDIE1lc3N0ZWNobmlrIEdtYkgKKyAqCisgKiBBdXRob3I6IFdhZGltIEVnb3JvdiA8dy5lZ29yb3ZAcGh5dGVjLmRlPgorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAogICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KQEAgLTMyLDYgKzM2LDEyIEBACiAjZGVmaW5lIFJLODA4X0JVQ0s0X1ZTRUxfTUFTSwkweGYKICNkZWZpbmUgUks4MDhfTERPX1ZTRUxfTUFTSwkweDFmCiAKKyNkZWZpbmUgUks4MThfQlVDS19WU0VMX01BU0sJCTB4M2YKKyNkZWZpbmUgUks4MThfQlVDSzRfVlNFTF9NQVNLCQkweDFmCisjZGVmaW5lIFJLODE4X0xET19WU0VMX01BU0sJCTB4MWYKKyNkZWZpbmUgUks4MThfTERPM19PTl9WU0VMX01BU0sJCTB4ZgorI2RlZmluZSBSSzgxOF9CT09TVF9PTl9WU0VMX01BU0sJMHhlMAorCiAvKiBSYW1wIHJhdGUgZGVmaW5pdGlvbnMgZm9yIGJ1Y2sxIC8gYnVjazIgb25seSAqLwogI2RlZmluZSBSSzgwOF9SQU1QX1JBVEVfT0ZGU0VUCQkzCiAjZGVmaW5lIFJLODA4X1JBTVBfUkFURV9NQVNLCQkoMyA8PCBSSzgwOF9SQU1QX1JBVEVfT0ZGU0VUKQpAQCAtNDU0LDYgKzQ2NCwxMDggQEAKIAkJUks4MDhfRENEQ19FTl9SRUcsIEJJVCg2KSksCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjIHJrODE4X3JlZ1tdID0geworCXsKKwkJLm5hbWUgPSAiRENEQ19SRUcxIiwKKwkJLnN1cHBseV9uYW1lID0gInZjYzEiLAorCQkub2ZfbWF0Y2ggPSBvZl9tYXRjaF9wdHIoIkRDRENfUkVHMSIpLAorCQkucmVndWxhdG9yc19ub2RlID0gb2ZfbWF0Y2hfcHRyKCJyZWd1bGF0b3JzIiksCisJCS5pZCA9IFJLODE4X0lEX0RDREMxLAorCQkub3BzID0gJnJrODA4X3JlZ19vcHMsCisJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCisJCS5taW5fdVYgPSA3MTI1MDAsCisJCS51Vl9zdGVwID0gMTI1MDAsCisJCS5uX3ZvbHRhZ2VzID0gNjQsCisJCS52c2VsX3JlZyA9IFJLODE4X0JVQ0sxX09OX1ZTRUxfUkVHLAorCQkudnNlbF9tYXNrID0gUks4MThfQlVDS19WU0VMX01BU0ssCisJCS5lbmFibGVfcmVnID0gUks4MThfRENEQ19FTl9SRUcsCisJCS5lbmFibGVfbWFzayA9IEJJVCgwKSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwgeworCQkubmFtZSA9ICJEQ0RDX1JFRzIiLAorCQkuc3VwcGx5X25hbWUgPSAidmNjMiIsCisJCS5vZl9tYXRjaCA9IG9mX21hdGNoX3B0cigiRENEQ19SRUcyIiksCisJCS5yZWd1bGF0b3JzX25vZGUgPSBvZl9tYXRjaF9wdHIoInJlZ3VsYXRvcnMiKSwKKwkJLmlkID0gUks4MThfSURfRENEQzIsCisJCS5vcHMgPSAmcms4MDhfcmVnX29wcywKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm1pbl91ViA9IDcxMjUwMCwKKwkJLnVWX3N0ZXAgPSAxMjUwMCwKKwkJLm5fdm9sdGFnZXMgPSA2NCwKKwkJLnZzZWxfcmVnID0gUks4MThfQlVDSzJfT05fVlNFTF9SRUcsCisJCS52c2VsX21hc2sgPSBSSzgxOF9CVUNLX1ZTRUxfTUFTSywKKwkJLmVuYWJsZV9yZWcgPSBSSzgxOF9EQ0RDX0VOX1JFRywKKwkJLmVuYWJsZV9tYXNrID0gQklUKDEpLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LCB7CisJCS5uYW1lID0gIkRDRENfUkVHMyIsCisJCS5zdXBwbHlfbmFtZSA9ICJ2Y2MzIiwKKwkJLm9mX21hdGNoID0gb2ZfbWF0Y2hfcHRyKCJEQ0RDX1JFRzMiKSwKKwkJLnJlZ3VsYXRvcnNfbm9kZSA9IG9mX21hdGNoX3B0cigicmVndWxhdG9ycyIpLAorCQkuaWQgPSBSSzgxOF9JRF9EQ0RDMywKKwkJLm9wcyA9ICZyazgwOF9zd2l0Y2hfb3BzLAorCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAorCQkubl92b2x0YWdlcyA9IDEsCisJCS5lbmFibGVfcmVnID0gUks4MThfRENEQ19FTl9SRUcsCisJCS5lbmFibGVfbWFzayA9IEJJVCgyKSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwlSSzhYWF9ERVNDKFJLODE4X0lEX0RDREM0LCAiRENEQ19SRUc0IiwgInZjYzQiLCAxODAwLCAzNjAwLCAxMDAsCisJCVJLODE4X0JVQ0s0X09OX1ZTRUxfUkVHLCBSSzgxOF9CVUNLNF9WU0VMX01BU0ssCisJCVJLODE4X0RDRENfRU5fUkVHLCBCSVQoMyksIDApLAorCVJLOFhYX0RFU0MoUks4MThfSURfQk9PU1QsICJEQ0RDX0JPT1NUIiwgImJvb3N0IiwgNDcwMCwgNTQwMCwgMTAwLAorCQlSSzgxOF9CT09TVF9MRE85X09OX1ZTRUxfUkVHLCBSSzgxOF9CT09TVF9PTl9WU0VMX01BU0ssCisJCVJLODE4X0RDRENfRU5fUkVHLCBCSVQoNCksIDApLAorCVJLOFhYX0RFU0MoUks4MThfSURfTERPMSwgIkxET19SRUcxIiwgInZjYzYiLCAxODAwLCAzNDAwLCAxMDAsCisJCVJLODE4X0xETzFfT05fVlNFTF9SRUcsIFJLODE4X0xET19WU0VMX01BU0ssIFJLODE4X0xET19FTl9SRUcsCisJCUJJVCgwKSwgNDAwKSwKKwlSSzhYWF9ERVNDKFJLODE4X0lEX0xETzIsICJMRE9fUkVHMiIsICJ2Y2M2IiwgMTgwMCwgMzQwMCwgMTAwLAorCQlSSzgxOF9MRE8xX09OX1ZTRUxfUkVHLCBSSzgxOF9MRE9fVlNFTF9NQVNLLCBSSzgxOF9MRE9fRU5fUkVHLAorCQlCSVQoMSksIDQwMCksCisJeworCQkubmFtZSA9ICJMRE9fUkVHMyIsCisJCS5zdXBwbHlfbmFtZSA9ICJ2Y2M3IiwKKwkJLm9mX21hdGNoID0gb2ZfbWF0Y2hfcHRyKCJMRE9fUkVHMyIpLAorCQkucmVndWxhdG9yc19ub2RlID0gb2ZfbWF0Y2hfcHRyKCJyZWd1bGF0b3JzIiksCisJCS5pZCA9IFJLODE4X0lEX0xETzMsCisJCS5vcHMgPSAmcms4MDhfcmVnX29wc19yYW5nZXMsCisJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCisJCS5uX3ZvbHRhZ2VzID0gMTYsCisJCS5saW5lYXJfcmFuZ2VzID0gcms4MDhfbGRvM192b2x0YWdlX3JhbmdlcywKKwkJLm5fbGluZWFyX3JhbmdlcyA9IEFSUkFZX1NJWkUocms4MDhfbGRvM192b2x0YWdlX3JhbmdlcyksCisJCS52c2VsX3JlZyA9IFJLODE4X0xETzNfT05fVlNFTF9SRUcsCisJCS52c2VsX21hc2sgPSBSSzgxOF9MRE8zX09OX1ZTRUxfTUFTSywKKwkJLmVuYWJsZV9yZWcgPSBSSzgxOF9MRE9fRU5fUkVHLAorCQkuZW5hYmxlX21hc2sgPSBCSVQoMiksCisJCS5lbmFibGVfdGltZSA9IDQwMCwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwlSSzhYWF9ERVNDKFJLODE4X0lEX0xETzQsICJMRE9fUkVHNCIsICJ2Y2M4IiwgMTgwMCwgMzQwMCwgMTAwLAorCQlSSzgxOF9MRE80X09OX1ZTRUxfUkVHLCBSSzgxOF9MRE9fVlNFTF9NQVNLLCBSSzgxOF9MRE9fRU5fUkVHLAorCQlCSVQoMyksIDQwMCksCisJUks4WFhfREVTQyhSSzgxOF9JRF9MRE81LCAiTERPX1JFRzUiLCAidmNjNyIsIDE4MDAsIDM0MDAsIDEwMCwKKwkJUks4MThfTERPNV9PTl9WU0VMX1JFRywgUks4MThfTERPX1ZTRUxfTUFTSywgUks4MThfTERPX0VOX1JFRywKKwkJQklUKDQpLCA0MDApLAorCVJLOFhYX0RFU0MoUks4MThfSURfTERPNiwgIkxET19SRUc2IiwgInZjYzgiLCA4MDAsIDI1MDAsIDEwMCwKKwkJUks4MThfTERPNl9PTl9WU0VMX1JFRywgUks4MThfTERPX1ZTRUxfTUFTSywgUks4MThfTERPX0VOX1JFRywKKwkJQklUKDUpLCA0MDApLAorCVJLOFhYX0RFU0MoUks4MThfSURfTERPNywgIkxET19SRUc3IiwgInZjYzciLCA4MDAsIDI1MDAsIDEwMCwKKwkJUks4MThfTERPN19PTl9WU0VMX1JFRywgUks4MThfTERPX1ZTRUxfTUFTSywgUks4MThfTERPX0VOX1JFRywKKwkJQklUKDYpLCA0MDApLAorCVJLOFhYX0RFU0MoUks4MThfSURfTERPOCwgIkxET19SRUc4IiwgInZjYzgiLCAxODAwLCAzNDAwLCAxMDAsCisJCVJLODE4X0xETzhfT05fVlNFTF9SRUcsIFJLODE4X0xET19WU0VMX01BU0ssIFJLODE4X0xET19FTl9SRUcsCisJCUJJVCg3KSwgNDAwKSwKKwlSSzhYWF9ERVNDKFJLODE4X0lEX0xETzksICJMRE9fUkVHOSIsICJ2Y2M5IiwgMTgwMCwgMzQwMCwgMTAwLAorCQlSSzgxOF9CT09TVF9MRE85X09OX1ZTRUxfUkVHLCBSSzgxOF9MRE9fVlNFTF9NQVNLLAorCQlSSzgxOF9EQ0RDX0VOX1JFRywgQklUKDUpLCA0MDApLAorCVJLOFhYX0RFU0NfU1dJVENIKFJLODE4X0lEX1NXSVRDSCwgIlNXSVRDSF9SRUciLCAidmNjOSIsCisJCVJLODE4X0RDRENfRU5fUkVHLCBCSVQoNikpLAorCVJLOFhYX0RFU0NfU1dJVENIKFJLODE4X0lEX0hETUlfU1dJVENILCAiSERNSV9TV0lUQ0giLCAiaF81diIsCisJCVJLODE4X0g1Vl9FTl9SRUcsIEJJVCgwKSksCisJUks4WFhfREVTQ19TV0lUQ0goUks4MThfSURfT1RHX1NXSVRDSCwgIk9UR19TV0lUQ0giLCAidXNiIiwKKwkJUks4MThfRENEQ19FTl9SRUcsIEJJVCg3KSksCit9OworCiBzdGF0aWMgaW50IHJrODA4X3JlZ3VsYXRvcl9kdF9wYXJzZV9wZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IGRldmljZSAqY2xpZW50X2RldiwKIAkJCQkgICBzdHJ1Y3QgcmVnbWFwICptYXAsCkBAIC00OTksNyArNjExLDggQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2NvbmZpZyBjb25maWcgPSB7fTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcms4MDhfcmRldjsKIAlzdHJ1Y3Qgcms4MDhfcmVndWxhdG9yX2RhdGEgKnBkYXRhOwotCWludCByZXQsIGk7CisJY29uc3Qgc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpyZWd1bGF0b3JzOworCWludCByZXQsIGksIG5yZWd1bGF0b3JzOwogCiAJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEpCkBAIC01MTIsMTQgKzYyNSwyOSBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOwogCisJc3dpdGNoIChyazgwOC0+dmFyaWFudCkgeworCWNhc2UgUks4MDhfSUQ6CisJCXJlZ3VsYXRvcnMgPSByazgwOF9yZWc7CisJCW5yZWd1bGF0b3JzID0gUks4MDhfTlVNX1JFR1VMQVRPUlM7CisJCWJyZWFrOworCWNhc2UgUks4MThfSUQ6CisJCXJlZ3VsYXRvcnMgPSByazgxOF9yZWc7CisJCW5yZWd1bGF0b3JzID0gUks4MThfTlVNX1JFR1VMQVRPUlM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidW5zdXBwb3J0ZWQgUks4WFggSUQgJWx1XG4iLAorCQkJcms4MDgtPnZhcmlhbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAljb25maWcuZGV2ID0gJmNsaWVudC0+ZGV2OwogCWNvbmZpZy5kcml2ZXJfZGF0YSA9IHBkYXRhOwogCWNvbmZpZy5yZWdtYXAgPSByazgwOC0+cmVnbWFwOwogCiAJLyogSW5zdGFudGlhdGUgdGhlIHJlZ3VsYXRvcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgUks4MDhfTlVNX1JFR1VMQVRPUlM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBucmVndWxhdG9yczsgaSsrKSB7CiAJCXJrODA4X3JkZXYgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LAotCQkJCQkJICAgICAmcms4MDhfcmVnW2ldLCAmY29uZmlnKTsKKwkJCQkJCSAgICAgJnJlZ3VsYXRvcnNbaV0sICZjb25maWcpOwogCQlpZiAoSVNfRVJSKHJrODA4X3JkZXYpKSB7CiAJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKIAkJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyICVkIHJlZ3VsYXRvclxuIiwgaSk7CkBAIC01MzMsMTUgKzY2MSwxNSBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcms4MDhfcmVndWxhdG9yX2RyaXZlciA9IHsKIAkucHJvYmUgPSByazgwOF9yZWd1bGF0b3JfcHJvYmUsCiAJLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAicms4MDgtcmVndWxhdG9yIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5uYW1lID0gInJrODA4LXJlZ3VsYXRvciIKIAl9LAogfTsKIAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyazgwOF9yZWd1bGF0b3JfZHJpdmVyKTsKIAotTU9EVUxFX0RFU0NSSVBUSU9OKCJyZWd1bGF0b3IgZHJpdmVyIGZvciB0aGUgcms4MDggc2VyaWVzIFBNSUNzIik7Ci1NT0RVTEVfQVVUSE9SKCJDaHJpcyBaaG9uZzx6eXdAcm9jay1jaGlwcy5jb20+Iik7Ci1NT0RVTEVfQVVUSE9SKCJaaGFuZyBRaW5nPHpoYW5ncWluZ0Byb2NrLWNoaXBzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigicmVndWxhdG9yIGRyaXZlciBmb3IgdGhlIFJLODA4L1JLODE4IHNlcmllcyBQTUlDcyIpOworTU9EVUxFX0FVVEhPUigiQ2hyaXMgWmhvbmcgPHp5d0Byb2NrLWNoaXBzLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlpoYW5nIFFpbmcgPHpoYW5ncWluZ0Byb2NrLWNoaXBzLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIldhZGltIEVnb3JvdiA8dy5lZ29yb3ZAcGh5dGVjLmRlPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpyazgwOC1yZWd1bGF0b3IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1MjE4LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTgtcmVndWxhdG9yLmMKaW5kZXggZDFlNjMxZC4uZWIwZjViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTgtcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjUyMTgtcmVndWxhdG9yLmMKQEAgLTE4MCw2ICsxODAsMTQgQEAKIAlpZiAocmlkIDwgVFBTNjUyMThfRENEQ18xIHx8IHJpZCA+IFRQUzY1MjE4X0xET18xKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qCisJICogQ2VydGFpbiByZXZpc2lvbnMgb2YgVFBTNjUyMTggd2lsbCBuZWVkIHRvIGhhdmUgRENEQzMgcmVndWxhdG9yCisJICogZW5hYmxlZCBhbHdheXMsIG90aGVyd2lzZSBhbiBpbW1lZGlhdGUgc3lzdGVtIHJlYm9vdCB3aWxsIG9jY3VyCisJICogZHVyaW5nIHBvd2Vyb2ZmLgorCSAqLworCWlmIChyaWQgPT0gVFBTNjUyMThfRENEQ18zICYmIHRwcy0+cmV2ID09IFRQUzY1MjE4X1JFVl8yXzEpCisJCXJldHVybiAwOworCiAJaWYgKCF0cHMtPmluZm9bcmlkXS0+c3Ryb2JlKSB7CiAJCWlmIChyaWQgPT0gVFBTNjUyMThfRENEQ18zKQogCQkJdHBzLT5pbmZvW3JpZF0tPnN0cm9iZSA9IDM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCmluZGV4IGZiOTkxZWMuLjY5NjExNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEwLXJlZ3VsYXRvci5jCkBAIC0xMTExLDYgKzExMTEsMTIgQEAKIAkJcG1pYy0+bnVtX3JlZ3VsYXRvcnMgPSBBUlJBWV9TSVpFKHRwczY1OTEwX3JlZ3MpOwogCQlwbWljLT5leHRfc2xlZXBfY29udHJvbCA9IHRwczY1OTEwX2V4dF9zbGVlcF9jb250cm9sOwogCQlpbmZvID0gdHBzNjU5MTBfcmVnczsKKwkJLyogV29yayBhcm91bmQgc2lsaWNvbiBlcnJhdHVtIFNXQ1owMTA6IG91dHB1dCBwcm9ncmFtbWVkCisJCSAqIHZvbHRhZ2UgbGV2ZWwgY2FuIGdvIGhpZ2hlciB0aGFuIGV4cGVjdGVkIG9yIGNyYXNoCisJCSAqIFdvcmthcm91bmQ6IHVzZSBubyBzeW5jaHJvbml6YXRpb24gb2YgRENEQyBjbG9ja3MKKwkJICovCisJCXRwczY1OTEwX3JlZ19jbGVhcl9iaXRzKHBtaWMtPm1mZCwgVFBTNjU5MTBfRENEQ0NUUkwsCisJCQkJCURDRENDVFJMX0RDRENDS1NZTkNfTUFTSyk7CiAJCWJyZWFrOwogCWNhc2UgVFBTNjU5MTE6CiAJCXBtaWMtPmdldF9jdHJsX3JlZyA9ICZ0cHM2NTkxMV9nZXRfY3RybF9yZWdpc3RlcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVtb3RlcHJvYy9LY29uZmlnIGIvZHJpdmVycy9yZW1vdGVwcm9jL0tjb25maWcKaW5kZXggMWE4YmY3NmEuLmYzOTZiZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVtb3RlcHJvYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9LY29uZmlnCkBAIC0xNyw3ICsxNyw3IEBACiAJc2VsZWN0IFJFTU9URVBST0MKIAlzZWxlY3QgTUFJTEJPWAogCXNlbGVjdCBPTUFQMlBMVVNfTUJPWAotCXNlbGVjdCBSUE1TRworCXNlbGVjdCBSUE1TR19WSVJUSU8KIAloZWxwCiAJICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgT01BUCdzIHJlbW90ZSBwcm9jZXNzb3JzIChkdWFsIE0zCiAJICBhbmQgRFNQIG9uIE9NQVA0KSB2aWEgdGhlIHJlbW90ZSBwcm9jZXNzb3IgZnJhbWV3b3JrLgpAQCAtNTksNyArNTksNyBAQAogCWRlcGVuZHMgb24gQVJDSF9EQVZJTkNJX0RBOFhYCiAJc2VsZWN0IENNQSBpZiBNTVUKIAlzZWxlY3QgUkVNT1RFUFJPQwotCXNlbGVjdCBSUE1TRworCXNlbGVjdCBSUE1TR19WSVJUSU8KIAloZWxwCiAJICBTYXkgeSBoZXJlIHRvIHN1cHBvcnQgREE4eHgvT01BUC1MMTN4IHJlbW90ZSBwcm9jZXNzb3JzIHZpYSB0aGUKIAkgIHJlbW90ZSBwcm9jZXNzb3IgZnJhbWV3b3JrLgpAQCAtOTEsNiArOTEsMjIgQEAKIAkgIFNheSB5IGhlcmUgdG8gc3VwcG9ydCB0aGUgUXVhbGNvbW0gUGVyaXBoZXJpYWwgSW1hZ2UgTG9hZGVyIGZvciB0aGUKIAkgIEhleGFnb24gVjUgYmFzZWQgcmVtb3RlIHByb2Nlc3NvcnMuCiAKK2NvbmZpZyBRQ09NX1dDTlNTX0lSSVMKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gT0YgJiYgQVJDSF9RQ09NCisKK2NvbmZpZyBRQ09NX1dDTlNTX1BJTAorCXRyaXN0YXRlICJRdWFsY29tbSBXQ05TUyBQZXJpcGhlcmFsIEltYWdlIExvYWRlciIKKwlkZXBlbmRzIG9uIE9GICYmIEFSQ0hfUUNPTQorCWRlcGVuZHMgb24gUUNPTV9TTUVNCisJc2VsZWN0IFFDT01fTURUX0xPQURFUgorCXNlbGVjdCBRQ09NX1NDTQorCXNlbGVjdCBRQ09NX1dDTlNTX0lSSVMKKwlzZWxlY3QgUkVNT1RFUFJPQworCWhlbHAKKwkgIFNheSB5IGhlcmUgdG8gc3VwcG9ydCB0aGUgUGVyaXBoZXJhbCBJbWFnZSBMb2FkZXIgZm9yIHRoZSBRdWFsY29tbQorCSAgV2lyZWxlc3MgQ29ubmVjdGl2aXR5IFN1YnN5c3RlbS4KKwogY29uZmlnIFNUX1JFTU9URVBST0MKIAl0cmlzdGF0ZSAiU1QgcmVtb3RlcHJvYyBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9TVEkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVtb3RlcHJvYy9NYWtlZmlsZSBiL2RyaXZlcnMvcmVtb3RlcHJvYy9NYWtlZmlsZQppbmRleCA5MmQzNzU4Li42ZGZiNjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlbW90ZXByb2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9yZW1vdGVwcm9jL01ha2VmaWxlCkBAIC0xMyw0ICsxMyw2IEBACiBvYmotJChDT05GSUdfREE4WFhfUkVNT1RFUFJPQykJCSs9IGRhOHh4X3JlbW90ZXByb2Mubwogb2JqLSQoQ09ORklHX1FDT01fTURUX0xPQURFUikJCSs9IHFjb21fbWR0X2xvYWRlci5vCiBvYmotJChDT05GSUdfUUNPTV9RNlY1X1BJTCkJCSs9IHFjb21fcTZ2NV9waWwubworb2JqLSQoQ09ORklHX1FDT01fV0NOU1NfSVJJUykJCSs9IHFjb21fd2Nuc3NfaXJpcy5vCitvYmotJChDT05GSUdfUUNPTV9XQ05TU19QSUwpCQkrPSBxY29tX3djbnNzLm8KIG9iai0kKENPTkZJR19TVF9SRU1PVEVQUk9DKQkJKz0gc3RfcmVtb3RlcHJvYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlbW90ZXByb2MvZGE4eHhfcmVtb3RlcHJvYy5jIGIvZHJpdmVycy9yZW1vdGVwcm9jL2RhOHh4X3JlbW90ZXByb2MuYwppbmRleCAwMDllNTZmLi4xYWZhYzhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlbW90ZXByb2MvZGE4eHhfcmVtb3RlcHJvYy5jCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9kYTh4eF9yZW1vdGVwcm9jLmMKQEAgLTE0Nyw3ICsxNDcsNyBAQAogewogCXN0cnVjdCBkYTh4eF9ycHJvYyAqZHJwcm9jID0gKHN0cnVjdCBkYTh4eF9ycHJvYyAqKXJwcm9jLT5wcml2OwogCi0JLyogSW50ZXJ1cHQgcmVtb3RlIHByb2MgKi8KKwkvKiBJbnRlcnJ1cHQgcmVtb3RlIHByb2MgKi8KIAl3cml0ZWwoU1lTQ0ZHX0NISVBTSUcyLCBkcnByb2MtPmNoaXBzaWcpOwogfQogCkBAIC0yNjEsNyArMjYxLDcgQEAKIAlyZXR1cm4gMDsKIAogZnJlZV9ycHJvYzoKLQlycHJvY19wdXQocnByb2MpOworCXJwcm9jX2ZyZWUocnByb2MpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI5MCw3ICsyOTAsNyBAQAogCWRpc2FibGVfaXJxKGRycHJvYy0+aXJxKTsKIAogCXJwcm9jX2RlbChycHJvYyk7Ci0JcnByb2NfcHV0KHJwcm9jKTsKKwlycHJvY19mcmVlKHJwcm9jKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1vdGVwcm9jL29tYXBfcmVtb3RlcHJvYy5jIGIvZHJpdmVycy9yZW1vdGVwcm9jL29tYXBfcmVtb3RlcHJvYy5jCmluZGV4IGI3NDM2OGEuLmZhNjNiZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVtb3RlcHJvYy9vbWFwX3JlbW90ZXByb2MuYworKysgYi9kcml2ZXJzL3JlbW90ZXByb2Mvb21hcF9yZW1vdGVwcm9jLmMKQEAgLTk2LDcgKzk2LDggQEAKIAkvKiBzZW5kIHRoZSBpbmRleCBvZiB0aGUgdHJpZ2dlcmVkIHZpcnRxdWV1ZSBpbiB0aGUgbWFpbGJveCBwYXlsb2FkICovCiAJcmV0ID0gbWJveF9zZW5kX21lc3NhZ2Uob3Byb2MtPm1ib3gsICh2b2lkICopdnFpZCk7CiAJaWYgKHJldCA8IDApCi0JCWRldl9lcnIoZGV2LCAib21hcF9tYm94X21zZ19zZW5kIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHNlbmQgbWFpbGJveCBtZXNzYWdlLCBzdGF0dXMgPSAlZFxuIiwKKwkJCXJldCk7CiB9CiAKIC8qCkBAIC0xOTYsNyArMTk3LDcgQEAKIAl9CiAKIAlycHJvYyA9IHJwcm9jX2FsbG9jKCZwZGV2LT5kZXYsIHBkYXRhLT5uYW1lLCAmb21hcF9ycHJvY19vcHMsCi0JCQkJcGRhdGEtPmZpcm13YXJlLCBzaXplb2YoKm9wcm9jKSk7CisJCQkgICAgcGRhdGEtPmZpcm13YXJlLCBzaXplb2YoKm9wcm9jKSk7CiAJaWYgKCFycHJvYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTIxNCw3ICsyMTUsNyBAQAogCXJldHVybiAwOwogCiBmcmVlX3Jwcm9jOgotCXJwcm9jX3B1dChycHJvYyk7CisJcnByb2NfZnJlZShycHJvYyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjIzLDcgKzIyNCw3IEBACiAJc3RydWN0IHJwcm9jICpycHJvYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJcnByb2NfZGVsKHJwcm9jKTsKLQlycHJvY19wdXQocnByb2MpOworCXJwcm9jX2ZyZWUocnByb2MpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlbW90ZXByb2MvcWNvbV9xNnY1X3BpbC5jIGIvZHJpdmVycy9yZW1vdGVwcm9jL3Fjb21fcTZ2NV9waWwuYwppbmRleCAyYTFiMmM3Li4yZTBjYWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlbW90ZXByb2MvcWNvbV9xNnY1X3BpbC5jCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9xY29tX3E2djVfcGlsLmMKQEAgLTg2Myw4ICs4NjMsMTAgQEAKIAkJZ290byBmcmVlX3Jwcm9jOwogCiAJcXByb2MtPnN0YXRlID0gcWNvbV9zbWVtX3N0YXRlX2dldCgmcGRldi0+ZGV2LCAic3RvcCIsICZxcHJvYy0+c3RvcF9iaXQpOwotCWlmIChJU19FUlIocXByb2MtPnN0YXRlKSkKKwlpZiAoSVNfRVJSKHFwcm9jLT5zdGF0ZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihxcHJvYy0+c3RhdGUpOwogCQlnb3RvIGZyZWVfcnByb2M7CisJfQogCiAJcmV0ID0gcnByb2NfYWRkKHJwcm9jKTsKIAlpZiAocmV0KQpAQCAtODczLDcgKzg3NSw3IEBACiAJcmV0dXJuIDA7CiAKIGZyZWVfcnByb2M6Ci0JcnByb2NfcHV0KHJwcm9jKTsKKwlycHJvY19mcmVlKHJwcm9jKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC04ODMsNyArODg1LDcgQEAKIAlzdHJ1Y3QgcTZ2NSAqcXByb2MgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCXJwcm9jX2RlbChxcHJvYy0+cnByb2MpOwotCXJwcm9jX3B1dChxcHJvYy0+cnByb2MpOworCXJwcm9jX2ZyZWUocXByb2MtPnJwcm9jKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1vdGVwcm9jL3Fjb21fd2Nuc3MuYyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9xY29tX3djbnNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjZWRlYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9xY29tX3djbnNzLmMKQEAgLTAsMCArMSw2MjQgQEAKKy8qCisgKiBRdWFsY29tbSBXaXJlbGVzcyBDb25uZWN0aXZpdHkgU3Vic3lzdGVtIFBlcmlwaGVyYWwgSW1hZ2UgTG9hZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IExpbmFybyBMdGQKKyAqIENvcHlyaWdodCAoQykgMjAxNCBTb255IE1vYmlsZSBDb21tdW5pY2F0aW9ucyBBQgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Fjb21fc2NtLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVtb3RlcHJvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvYy9xY29tL3NtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2MvcWNvbS9zbWVtX3N0YXRlLmg+CisKKyNpbmNsdWRlICJxY29tX21kdF9sb2FkZXIuaCIKKyNpbmNsdWRlICJyZW1vdGVwcm9jX2ludGVybmFsLmgiCisjaW5jbHVkZSAicWNvbV93Y25zcy5oIgorCisjZGVmaW5lIFdDTlNTX0NSQVNIX1JFQVNPTl9TTUVNCQk0MjIKKyNkZWZpbmUgV0NOU1NfRklSTVdBUkVfTkFNRQkJIndjbnNzLm1kdCIKKyNkZWZpbmUgV0NOU1NfUEFTX0lECQkJNgorCisjZGVmaW5lIFdDTlNTX1NQQVJFX05WQklOX0RMTkQJCUJJVCgyNSkKKworI2RlZmluZSBXQ05TU19QTVVfSVJJU19YT19DRkcJCUJJVCgzKQorI2RlZmluZSBXQ05TU19QTVVfSVJJU19YT19FTgkJQklUKDQpCisjZGVmaW5lIFdDTlNTX1BNVV9HQ19CVVNfTVVYX1NFTF9UT1AJQklUKDUpCisjZGVmaW5lIFdDTlNTX1BNVV9JUklTX1hPX0NGR19TVFMJQklUKDYpIC8qIDE6IGluIHByb2dyZXNzLCAwOiBkb25lICovCisKKyNkZWZpbmUgV0NOU1NfUE1VX0lSSVNfUkVTRVQJCUJJVCg3KQorI2RlZmluZSBXQ05TU19QTVVfSVJJU19SRVNFVF9TVFMJQklUKDgpIC8qIDE6IGluIHByb2dyZXNzLCAwOiBkb25lICovCisjZGVmaW5lIFdDTlNTX1BNVV9JUklTX1hPX1JFQUQJCUJJVCg5KQorI2RlZmluZSBXQ05TU19QTVVfSVJJU19YT19SRUFEX1NUUwlCSVQoMTApCisKKyNkZWZpbmUgV0NOU1NfUE1VX1hPX01PREVfTUFTSwkJR0VOTUFTSygyLCAxKQorI2RlZmluZSBXQ05TU19QTVVfWE9fTU9ERV8xOXAyCQkwCisjZGVmaW5lIFdDTlNTX1BNVV9YT19NT0RFXzQ4CQkzCisKK3N0cnVjdCB3Y25zc19kYXRhIHsKKwlzaXplX3QgcG11X29mZnNldDsKKwlzaXplX3Qgc3BhcmVfb2Zmc2V0OworCisJY29uc3Qgc3RydWN0IHdjbnNzX3ZyZWdfaW5mbyAqdnJlZ3M7CisJc2l6ZV90IG51bV92cmVnczsKK307CisKK3N0cnVjdCBxY29tX3djbnNzIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJwcm9jICpycHJvYzsKKworCXZvaWQgX19pb21lbSAqcG11X2NmZzsKKwl2b2lkIF9faW9tZW0gKnNwYXJlX291dDsKKworCWJvb2wgdXNlXzQ4bWh6X3hvOworCisJaW50IHdkb2dfaXJxOworCWludCBmYXRhbF9pcnE7CisJaW50IHJlYWR5X2lycTsKKwlpbnQgaGFuZG92ZXJfaXJxOworCWludCBzdG9wX2Fja19pcnE7CisKKwlzdHJ1Y3QgcWNvbV9zbWVtX3N0YXRlICpzdGF0ZTsKKwl1bnNpZ25lZCBzdG9wX2JpdDsKKworCXN0cnVjdCBtdXRleCBpcmlzX2xvY2s7CisJc3RydWN0IHFjb21faXJpcyAqaXJpczsKKworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICp2cmVnczsKKwlzaXplX3QgbnVtX3ZyZWdzOworCisJc3RydWN0IGNvbXBsZXRpb24gc3RhcnRfZG9uZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBzdG9wX2RvbmU7CisKKwlwaHlzX2FkZHJfdCBtZW1fcGh5czsKKwlwaHlzX2FkZHJfdCBtZW1fcmVsb2M7CisJdm9pZCAqbWVtX3JlZ2lvbjsKKwlzaXplX3QgbWVtX3NpemU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjbnNzX2RhdGEgcml2YV9kYXRhID0geworCS5wbXVfb2Zmc2V0ID0gMHgyOCwKKwkuc3BhcmVfb2Zmc2V0ID0gMHhiNCwKKworCS52cmVncyA9IChzdHJ1Y3Qgd2Nuc3NfdnJlZ19pbmZvW10pIHsKKwkJeyAidmRkbXgiLCAgMTA1MDAwMCwgMTE1MDAwMCwgMCB9LAorCQl7ICJ2ZGRjeCIsICAxMDUwMDAwLCAxMTUwMDAwLCAwIH0sCisJCXsgInZkZHB4IiwgIDE4MDAwMDAsIDE4MDAwMDAsIDAgfSwKKwl9LAorCS5udW1fdnJlZ3MgPSAzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB3Y25zc19kYXRhIHByb250b192MV9kYXRhID0geworCS5wbXVfb2Zmc2V0ID0gMHgxMDA0LAorCS5zcGFyZV9vZmZzZXQgPSAweDEwODgsCisKKwkudnJlZ3MgPSAoc3RydWN0IHdjbnNzX3ZyZWdfaW5mb1tdKSB7CisJCXsgInZkZG14IiwgOTUwMDAwLCAxMTUwMDAwLCAwIH0sCisJCXsgInZkZGN4IiwgLnN1cGVyX3R1cmJvID0gdHJ1ZX0sCisJCXsgInZkZHB4IiwgMTgwMDAwMCwgMTgwMDAwMCwgMCB9LAorCX0sCisJLm51bV92cmVncyA9IDMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHdjbnNzX2RhdGEgcHJvbnRvX3YyX2RhdGEgPSB7CisJLnBtdV9vZmZzZXQgPSAweDEwMDQsCisJLnNwYXJlX29mZnNldCA9IDB4MTA4OCwKKworCS52cmVncyA9IChzdHJ1Y3Qgd2Nuc3NfdnJlZ19pbmZvW10pIHsKKwkJeyAidmRkbXgiLCAxMjg3NTAwLCAxMjg3NTAwLCAwIH0sCisJCXsgInZkZGN4IiwgLnN1cGVyX3R1cmJvID0gdHJ1ZSB9LAorCQl7ICJ2ZGRweCIsIDE4MDAwMDAsIDE4MDAwMDAsIDAgfSwKKwl9LAorCS5udW1fdnJlZ3MgPSAzLAorfTsKKwordm9pZCBxY29tX3djbnNzX2Fzc2lnbl9pcmlzKHN0cnVjdCBxY29tX3djbnNzICp3Y25zcywKKwkJCSAgICBzdHJ1Y3QgcWNvbV9pcmlzICppcmlzLAorCQkJICAgIGJvb2wgdXNlXzQ4bWh6X3hvKQoreworCW11dGV4X2xvY2soJndjbnNzLT5pcmlzX2xvY2spOworCisJd2Nuc3MtPmlyaXMgPSBpcmlzOworCXdjbnNzLT51c2VfNDhtaHpfeG8gPSB1c2VfNDhtaHpfeG87CisKKwltdXRleF91bmxvY2soJndjbnNzLT5pcmlzX2xvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwocWNvbV93Y25zc19hc3NpZ25faXJpcyk7CisKK3N0YXRpYyBpbnQgd2Nuc3NfbG9hZChzdHJ1Y3QgcnByb2MgKnJwcm9jLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQoreworCXN0cnVjdCBxY29tX3djbnNzICp3Y25zcyA9IChzdHJ1Y3QgcWNvbV93Y25zcyAqKXJwcm9jLT5wcml2OworCXBoeXNfYWRkcl90IGZ3X2FkZHI7CisJc2l6ZV90IGZ3X3NpemU7CisJYm9vbCByZWxvY2F0ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gcWNvbV9zY21fcGFzX2luaXRfaW1hZ2UoV0NOU1NfUEFTX0lELCBmdy0+ZGF0YSwgZnctPnNpemUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcnByb2MtPmRldiwgImludmFsaWQgZmlybXdhcmUgbWV0YWRhdGFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHFjb21fbWR0X3BhcnNlKGZ3LCAmZndfYWRkciwgJmZ3X3NpemUsICZyZWxvY2F0ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZycHJvYy0+ZGV2LCAiZmFpbGVkIHRvIHBhcnNlIG1kdCBoZWFkZXJcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChyZWxvY2F0ZSkgeworCQl3Y25zcy0+bWVtX3JlbG9jID0gZndfYWRkcjsKKworCQlyZXQgPSBxY29tX3NjbV9wYXNfbWVtX3NldHVwKFdDTlNTX1BBU19JRCwgd2Nuc3MtPm1lbV9waHlzLCBmd19zaXplKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcnByb2MtPmRldiwgInVuYWJsZSB0byBzZXR1cCBtZW1vcnkgZm9yIGltYWdlXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcWNvbV9tZHRfbG9hZChycHJvYywgZncsIHJwcm9jLT5maXJtd2FyZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnByb2NfZndfb3BzIHdjbnNzX2Z3X29wcyA9IHsKKwkuZmluZF9yc2NfdGFibGUgPSBxY29tX21kdF9maW5kX3JzY190YWJsZSwKKwkubG9hZCA9IHdjbnNzX2xvYWQsCit9OworCitzdGF0aWMgdm9pZCB3Y25zc19pbmRpY2F0ZV9udl9kb3dubG9hZChzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MpCit7CisJdTMyIHZhbDsKKworCS8qIEluZGljYXRlIE5WIGRvd25sb2FkIGNhcGFiaWxpdHkgKi8KKwl2YWwgPSByZWFkbCh3Y25zcy0+c3BhcmVfb3V0KTsKKwl2YWwgfD0gV0NOU1NfU1BBUkVfTlZCSU5fRExORDsKKwl3cml0ZWwodmFsLCB3Y25zcy0+c3BhcmVfb3V0KTsKK30KKworc3RhdGljIHZvaWQgd2Nuc3NfY29uZmlndXJlX2lyaXMoc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzKQoreworCXUzMiB2YWw7CisKKwkvKiBDbGVhciBQTVUgY2ZnIHJlZ2lzdGVyICovCisJd3JpdGVsKDAsIHdjbnNzLT5wbXVfY2ZnKTsKKworCXZhbCA9IFdDTlNTX1BNVV9HQ19CVVNfTVVYX1NFTF9UT1AgfCBXQ05TU19QTVVfSVJJU19YT19FTjsKKwl3cml0ZWwodmFsLCB3Y25zcy0+cG11X2NmZyk7CisKKwkvKiBDbGVhciBYT19NT0RFICovCisJdmFsICY9IH5XQ05TU19QTVVfWE9fTU9ERV9NQVNLOworCWlmICh3Y25zcy0+dXNlXzQ4bWh6X3hvKQorCQl2YWwgfD0gV0NOU1NfUE1VX1hPX01PREVfNDggPDwgMTsKKwllbHNlCisJCXZhbCB8PSBXQ05TU19QTVVfWE9fTU9ERV8xOXAyIDw8IDE7CisJd3JpdGVsKHZhbCwgd2Nuc3MtPnBtdV9jZmcpOworCisJLyogUmVzZXQgSVJJUyAqLworCXZhbCB8PSBXQ05TU19QTVVfSVJJU19SRVNFVDsKKwl3cml0ZWwodmFsLCB3Y25zcy0+cG11X2NmZyk7CisKKwkvKiBXYWl0IGZvciBQTVUuaXJpc19yZWdfcmVzZXRfc3RzICovCisJd2hpbGUgKHJlYWRsKHdjbnNzLT5wbXVfY2ZnKSAmIFdDTlNTX1BNVV9JUklTX1JFU0VUX1NUUykKKwkJY3B1X3JlbGF4KCk7CisKKwkvKiBDbGVhciBJUklTIHJlc2V0ICovCisJdmFsICY9IH5XQ05TU19QTVVfSVJJU19SRVNFVDsKKwl3cml0ZWwodmFsLCB3Y25zcy0+cG11X2NmZyk7CisKKwkvKiBTdGFydCBJUklTIFhPIGNvbmZpZ3VyYXRpb24gKi8KKwl2YWwgfD0gV0NOU1NfUE1VX0lSSVNfWE9fQ0ZHOworCXdyaXRlbCh2YWwsIHdjbnNzLT5wbXVfY2ZnKTsKKworCS8qIFdhaXQgZm9yIFhPIGNvbmZpZ3VyYXRpb24gdG8gZmluaXNoICovCisJd2hpbGUgKHJlYWRsKHdjbnNzLT5wbXVfY2ZnKSAmIFdDTlNTX1BNVV9JUklTX1hPX0NGR19TVFMpCisJCWNwdV9yZWxheCgpOworCisJLyogU3RvcCBJUklTIFhPIGNvbmZpZ3VyYXRpb24gKi8KKwl2YWwgJj0gfldDTlNTX1BNVV9HQ19CVVNfTVVYX1NFTF9UT1A7CisJdmFsICY9IH5XQ05TU19QTVVfSVJJU19YT19DRkc7CisJd3JpdGVsKHZhbCwgd2Nuc3MtPnBtdV9jZmcpOworCisJLyogQWRkIHNvbWUgZGVsYXkgZm9yIFhPIHRvIHNldHRsZSAqLworCW1zbGVlcCgyMCk7Cit9CisKK3N0YXRpYyBpbnQgd2Nuc3Nfc3RhcnQoc3RydWN0IHJwcm9jICpycHJvYykKK3sKKwlzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MgPSAoc3RydWN0IHFjb21fd2Nuc3MgKilycHJvYy0+cHJpdjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmd2Nuc3MtPmlyaXNfbG9jayk7CisJaWYgKCF3Y25zcy0+aXJpcykgeworCQlkZXZfZXJyKHdjbnNzLT5kZXYsICJubyBpcmlzIHJlZ2lzdGVyZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHJlbGVhc2VfaXJpc19sb2NrOworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZSh3Y25zcy0+bnVtX3ZyZWdzLCB3Y25zcy0+dnJlZ3MpOworCWlmIChyZXQpCisJCWdvdG8gcmVsZWFzZV9pcmlzX2xvY2s7CisKKwlyZXQgPSBxY29tX2lyaXNfZW5hYmxlKHdjbnNzLT5pcmlzKTsKKwlpZiAocmV0KQorCQlnb3RvIGRpc2FibGVfcmVndWxhdG9yczsKKworCXdjbnNzX2luZGljYXRlX252X2Rvd25sb2FkKHdjbnNzKTsKKwl3Y25zc19jb25maWd1cmVfaXJpcyh3Y25zcyk7CisKKwlyZXQgPSBxY29tX3NjbV9wYXNfYXV0aF9hbmRfcmVzZXQoV0NOU1NfUEFTX0lEKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIod2Nuc3MtPmRldiwKKwkJCSJmYWlsZWQgdG8gYXV0aGVudGljYXRlIGltYWdlIGFuZCByZWxlYXNlIHJlc2V0XG4iKTsKKwkJZ290byBkaXNhYmxlX2lyaXM7CisJfQorCisJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ3Y25zcy0+c3RhcnRfZG9uZSwKKwkJCQkJICBtc2Vjc190b19qaWZmaWVzKDUwMDApKTsKKwlpZiAod2Nuc3MtPnJlYWR5X2lycSA+IDAgJiYgcmV0ID09IDApIHsKKwkJLyogV2UgaGF2ZSBhIHJlYWR5X2lycSwgYnV0IGl0IGRpZG4ndCBmaXJlIGluIHRpbWUuICovCisJCWRldl9lcnIod2Nuc3MtPmRldiwgInN0YXJ0IHRpbWVkIG91dFxuIik7CisJCXFjb21fc2NtX3Bhc19zaHV0ZG93bihXQ05TU19QQVNfSUQpOworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIGRpc2FibGVfaXJpczsKKwl9CisKKwlyZXQgPSAwOworCitkaXNhYmxlX2lyaXM6CisJcWNvbV9pcmlzX2Rpc2FibGUod2Nuc3MtPmlyaXMpOworZGlzYWJsZV9yZWd1bGF0b3JzOgorCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUod2Nuc3MtPm51bV92cmVncywgd2Nuc3MtPnZyZWdzKTsKK3JlbGVhc2VfaXJpc19sb2NrOgorCW11dGV4X3VubG9jaygmd2Nuc3MtPmlyaXNfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdjbnNzX3N0b3Aoc3RydWN0IHJwcm9jICpycHJvYykKK3sKKwlzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MgPSAoc3RydWN0IHFjb21fd2Nuc3MgKilycHJvYy0+cHJpdjsKKwlpbnQgcmV0OworCisJaWYgKHdjbnNzLT5zdGF0ZSkgeworCQlxY29tX3NtZW1fc3RhdGVfdXBkYXRlX2JpdHMod2Nuc3MtPnN0YXRlLAorCQkJCQkgICAgQklUKHdjbnNzLT5zdG9wX2JpdCksCisJCQkJCSAgICBCSVQod2Nuc3MtPnN0b3BfYml0KSk7CisKKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ3Y25zcy0+c3RvcF9kb25lLAorCQkJCQkJICBtc2Vjc190b19qaWZmaWVzKDUwMDApKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJZGV2X2Vycih3Y25zcy0+ZGV2LCAidGltZWQgb3V0IG9uIHdhaXRcbiIpOworCisJCXFjb21fc21lbV9zdGF0ZV91cGRhdGVfYml0cyh3Y25zcy0+c3RhdGUsCisJCQkJCSAgICBCSVQod2Nuc3MtPnN0b3BfYml0KSwKKwkJCQkJICAgIDApOworCX0KKworCXJldCA9IHFjb21fc2NtX3Bhc19zaHV0ZG93bihXQ05TU19QQVNfSUQpOworCWlmIChyZXQpCisJCWRldl9lcnIod2Nuc3MtPmRldiwgImZhaWxlZCB0byBzaHV0ZG93bjogJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCAqd2Nuc3NfZGFfdG9fdmEoc3RydWN0IHJwcm9jICpycHJvYywgdTY0IGRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBxY29tX3djbnNzICp3Y25zcyA9IChzdHJ1Y3QgcWNvbV93Y25zcyAqKXJwcm9jLT5wcml2OworCWludCBvZmZzZXQ7CisKKwlvZmZzZXQgPSBkYSAtIHdjbnNzLT5tZW1fcmVsb2M7CisJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgbGVuID4gd2Nuc3MtPm1lbV9zaXplKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiB3Y25zcy0+bWVtX3JlZ2lvbiArIG9mZnNldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBycHJvY19vcHMgd2Nuc3Nfb3BzID0geworCS5zdGFydCA9IHdjbnNzX3N0YXJ0LAorCS5zdG9wID0gd2Nuc3Nfc3RvcCwKKwkuZGFfdG9fdmEgPSB3Y25zc19kYV90b192YSwKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y25zc193ZG9nX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXYpCit7CisJc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzID0gZGV2OworCisJcnByb2NfcmVwb3J0X2NyYXNoKHdjbnNzLT5ycHJvYywgUlBST0NfV0FUQ0hET0cpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2Nuc3NfZmF0YWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MgPSBkZXY7CisJc2l6ZV90IGxlbjsKKwljaGFyICptc2c7CisKKwltc2cgPSBxY29tX3NtZW1fZ2V0KFFDT01fU01FTV9IT1NUX0FOWSwgV0NOU1NfQ1JBU0hfUkVBU09OX1NNRU0sICZsZW4pOworCWlmICghSVNfRVJSKG1zZykgJiYgbGVuID4gMCAmJiBtc2dbMF0pCisJCWRldl9lcnIod2Nuc3MtPmRldiwgImZhdGFsIGVycm9yIHJlY2VpdmVkOiAlc1xuIiwgbXNnKTsKKworCXJwcm9jX3JlcG9ydF9jcmFzaCh3Y25zcy0+cnByb2MsIFJQUk9DX0ZBVEFMX0VSUk9SKTsKKworCWlmICghSVNfRVJSKG1zZykpCisJCW1zZ1swXSA9ICdcMCc7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y25zc19yZWFkeV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBxY29tX3djbnNzICp3Y25zcyA9IGRldjsKKworCWNvbXBsZXRlKCZ3Y25zcy0+c3RhcnRfZG9uZSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y25zc19oYW5kb3Zlcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KQoreworCS8qCisJICogWFhYOiBBdCB0aGlzIHBvaW50IHdlJ3JlIHN1cHBvc2VkIHRvIHJlbGVhc2UgdGhlIHJlc291cmNlcyB0aGF0IHdlCisJICogaGF2ZSBiZWVuIGhvbGRpbmcgb24gYmVoYWxmIG9mIHRoZSBXQ05TUy4gVW5mb3J0dW5hdGVseSB0aGlzCisJICogaW50ZXJydXB0IGNvbWVzIHdheSBiZWZvcmUgdGhlIG90aGVyIHNpZGUgc2VlbXMgdG8gYmUgZG9uZS4KKwkgKgorCSAqIFNvIHdlJ3JlIGN1cnJlbnRseSByZWx5aW5nIG9uIHRoZSByZWFkeSBpbnRlcnJ1cHQgZmlyaW5nIGxhdGVyIHRoZW4KKwkgKiB0aGlzIGFuZCB3ZSBqdXN0IGRpc2FibGUgdGhlIHJlc291cmNlcyBhdCB0aGUgZW5kIG9mIHdjbnNzX3N0YXJ0KCkuCisJICovCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB3Y25zc19zdG9wX2Fja19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2KQoreworCXN0cnVjdCBxY29tX3djbnNzICp3Y25zcyA9IGRldjsKKworCWNvbXBsZXRlKCZ3Y25zcy0+c3RvcF9kb25lKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCB3Y25zc19pbml0X3JlZ3VsYXRvcnMoc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzLAorCQkJCSBjb25zdCBzdHJ1Y3Qgd2Nuc3NfdnJlZ19pbmZvICppbmZvLAorCQkJCSBpbnQgbnVtX3ZyZWdzKQoreworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpidWxrOworCWludCByZXQ7CisJaW50IGk7CisKKwlidWxrID0gZGV2bV9rY2FsbG9jKHdjbnNzLT5kZXYsCisJCQkgICAgbnVtX3ZyZWdzLCBzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEpLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghYnVsaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3ZyZWdzOyBpKyspCisJCWJ1bGtbaV0uc3VwcGx5ID0gaW5mb1tpXS5uYW1lOworCisJcmV0ID0gZGV2bV9yZWd1bGF0b3JfYnVsa19nZXQod2Nuc3MtPmRldiwgbnVtX3ZyZWdzLCBidWxrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IG51bV92cmVnczsgaSsrKSB7CisJCWlmIChpbmZvW2ldLm1heF92b2x0YWdlKQorCQkJcmVndWxhdG9yX3NldF92b2x0YWdlKGJ1bGtbaV0uY29uc3VtZXIsCisJCQkJCSAgICAgIGluZm9baV0ubWluX3ZvbHRhZ2UsCisJCQkJCSAgICAgIGluZm9baV0ubWF4X3ZvbHRhZ2UpOworCisJCWlmIChpbmZvW2ldLmxvYWRfdUEpCisJCQlyZWd1bGF0b3Jfc2V0X2xvYWQoYnVsa1tpXS5jb25zdW1lciwgaW5mb1tpXS5sb2FkX3VBKTsKKwl9CisKKwl3Y25zcy0+dnJlZ3MgPSBidWxrOworCXdjbnNzLT5udW1fdnJlZ3MgPSBudW1fdnJlZ3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3Y25zc19yZXF1ZXN0X2lycShzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MsCisJCQkgICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIGJvb2wgb3B0aW9uYWwsCisJCQkgICAgIGlycV9oYW5kbGVyX3QgdGhyZWFkX2ZuKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBuYW1lKTsKKwlpZiAocmV0IDwgMCAmJiBvcHRpb25hbCkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJubyAlcyBJUlEgZGVmaW5lZCwgaWdub3JpbmdcbiIsIG5hbWUpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gJXMgSVJRIGRlZmluZWRcbiIsIG5hbWUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwgcmV0LAorCQkJCQlOVUxMLCB0aHJlYWRfZm4sCisJCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX09ORVNIT1QsCisJCQkJCSJ3Y25zcyIsIHdjbnNzKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZXF1ZXN0ICVzIElSUSBmYWlsZWRcbiIsIG5hbWUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y25zc19hbGxvY19tZW1vcnlfcmVnaW9uKHN0cnVjdCBxY29tX3djbnNzICp3Y25zcykKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJc3RydWN0IHJlc291cmNlIHI7CisJaW50IHJldDsKKworCW5vZGUgPSBvZl9wYXJzZV9waGFuZGxlKHdjbnNzLT5kZXYtPm9mX25vZGUsICJtZW1vcnktcmVnaW9uIiwgMCk7CisJaWYgKCFub2RlKSB7CisJCWRldl9lcnIod2Nuc3MtPmRldiwgIm5vIG1lbW9yeS1yZWdpb24gc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXdjbnNzLT5tZW1fcGh5cyA9IHdjbnNzLT5tZW1fcmVsb2MgPSByLnN0YXJ0OworCXdjbnNzLT5tZW1fc2l6ZSA9IHJlc291cmNlX3NpemUoJnIpOworCXdjbnNzLT5tZW1fcmVnaW9uID0gZGV2bV9pb3JlbWFwX3djKHdjbnNzLT5kZXYsIHdjbnNzLT5tZW1fcGh5cywgd2Nuc3MtPm1lbV9zaXplKTsKKwlpZiAoIXdjbnNzLT5tZW1fcmVnaW9uKSB7CisJCWRldl9lcnIod2Nuc3MtPmRldiwgInVuYWJsZSB0byBtYXAgbWVtb3J5IHJlZ2lvbjogJXBhKyV6eFxuIiwKKwkJCSZyLnN0YXJ0LCB3Y25zcy0+bWVtX3NpemUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdjbnNzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IHdjbnNzX2RhdGEgKmRhdGE7CisJc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBycHJvYyAqcnByb2M7CisJdm9pZCBfX2lvbWVtICptbWlvOworCWludCByZXQ7CisKKwlkYXRhID0gb2ZfZGV2aWNlX2dldF9tYXRjaF9kYXRhKCZwZGV2LT5kZXYpOworCisJaWYgKCFxY29tX3NjbV9pc19hdmFpbGFibGUoKSkKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisKKwlpZiAoIXFjb21fc2NtX3Bhc19zdXBwb3J0ZWQoV0NOU1NfUEFTX0lEKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJQQVMgaXMgbm90IGF2YWlsYWJsZSBmb3IgV0NOU1NcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJwcm9jID0gcnByb2NfYWxsb2MoJnBkZXYtPmRldiwgcGRldi0+bmFtZSwgJndjbnNzX29wcywKKwkJCSAgICBXQ05TU19GSVJNV0FSRV9OQU1FLCBzaXplb2YoKndjbnNzKSk7CisJaWYgKCFycHJvYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgcmVtb3RlcHJvY1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJwcm9jLT5md19vcHMgPSAmd2Nuc3NfZndfb3BzOworCisJd2Nuc3MgPSAoc3RydWN0IHFjb21fd2Nuc3MgKilycHJvYy0+cHJpdjsKKwl3Y25zcy0+ZGV2ID0gJnBkZXYtPmRldjsKKwl3Y25zcy0+cnByb2MgPSBycHJvYzsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3Y25zcyk7CisKKwlpbml0X2NvbXBsZXRpb24oJndjbnNzLT5zdGFydF9kb25lKTsKKwlpbml0X2NvbXBsZXRpb24oJndjbnNzLT5zdG9wX2RvbmUpOworCisJbXV0ZXhfaW5pdCgmd2Nuc3MtPmlyaXNfbG9jayk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAicG11Iik7CisJbW1pbyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIobW1pbykpIHsKKwkJcmV0ID0gUFRSX0VSUihtbWlvKTsKKwkJZ290byBmcmVlX3Jwcm9jOworCX07CisKKwlyZXQgPSB3Y25zc19hbGxvY19tZW1vcnlfcmVnaW9uKHdjbnNzKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfcnByb2M7CisKKwl3Y25zcy0+cG11X2NmZyA9IG1taW8gKyBkYXRhLT5wbXVfb2Zmc2V0OworCXdjbnNzLT5zcGFyZV9vdXQgPSBtbWlvICsgZGF0YS0+c3BhcmVfb2Zmc2V0OworCisJcmV0ID0gd2Nuc3NfaW5pdF9yZWd1bGF0b3JzKHdjbnNzLCBkYXRhLT52cmVncywgZGF0YS0+bnVtX3ZyZWdzKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfcnByb2M7CisKKwlyZXQgPSB3Y25zc19yZXF1ZXN0X2lycSh3Y25zcywgcGRldiwgIndkb2ciLCBmYWxzZSwgd2Nuc3Nfd2RvZ19pbnRlcnJ1cHQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZyZWVfcnByb2M7CisJd2Nuc3MtPndkb2dfaXJxID0gcmV0OworCisJcmV0ID0gd2Nuc3NfcmVxdWVzdF9pcnEod2Nuc3MsIHBkZXYsICJmYXRhbCIsIGZhbHNlLCB3Y25zc19mYXRhbF9pbnRlcnJ1cHQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZyZWVfcnByb2M7CisJd2Nuc3MtPmZhdGFsX2lycSA9IHJldDsKKworCXJldCA9IHdjbnNzX3JlcXVlc3RfaXJxKHdjbnNzLCBwZGV2LCAicmVhZHkiLCB0cnVlLCB3Y25zc19yZWFkeV9pbnRlcnJ1cHQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZyZWVfcnByb2M7CisJd2Nuc3MtPnJlYWR5X2lycSA9IHJldDsKKworCXJldCA9IHdjbnNzX3JlcXVlc3RfaXJxKHdjbnNzLCBwZGV2LCAiaGFuZG92ZXIiLCB0cnVlLCB3Y25zc19oYW5kb3Zlcl9pbnRlcnJ1cHQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZyZWVfcnByb2M7CisJd2Nuc3MtPmhhbmRvdmVyX2lycSA9IHJldDsKKworCXJldCA9IHdjbnNzX3JlcXVlc3RfaXJxKHdjbnNzLCBwZGV2LCAic3RvcC1hY2siLCB0cnVlLCB3Y25zc19zdG9wX2Fja19pbnRlcnJ1cHQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZyZWVfcnByb2M7CisJd2Nuc3MtPnN0b3BfYWNrX2lycSA9IHJldDsKKworCWlmICh3Y25zcy0+c3RvcF9hY2tfaXJxKSB7CisJCXdjbnNzLT5zdGF0ZSA9IHFjb21fc21lbV9zdGF0ZV9nZXQoJnBkZXYtPmRldiwgInN0b3AiLAorCQkJCQkJICAgJndjbnNzLT5zdG9wX2JpdCk7CisJCWlmIChJU19FUlIod2Nuc3MtPnN0YXRlKSkgeworCQkJcmV0ID0gUFRSX0VSUih3Y25zcy0+c3RhdGUpOworCQkJZ290byBmcmVlX3Jwcm9jOworCQl9CisJfQorCisJcmV0ID0gcnByb2NfYWRkKHJwcm9jKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfcnByb2M7CisKKwlyZXR1cm4gb2ZfcGxhdGZvcm1fcG9wdWxhdGUocGRldi0+ZGV2Lm9mX25vZGUsIE5VTEwsIE5VTEwsICZwZGV2LT5kZXYpOworCitmcmVlX3Jwcm9jOgorCXJwcm9jX2ZyZWUocnByb2MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3Y25zc19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCW9mX3BsYXRmb3JtX2RlcG9wdWxhdGUoJnBkZXYtPmRldik7CisKKwlxY29tX3NtZW1fc3RhdGVfcHV0KHdjbnNzLT5zdGF0ZSk7CisJcnByb2NfZGVsKHdjbnNzLT5ycHJvYyk7CisJcnByb2NfZnJlZSh3Y25zcy0+cnByb2MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdjbnNzX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHJpdmEtcGlsIiwgJnJpdmFfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwcm9udG8tdjEtcGlsIiwgJnByb250b192MV9kYXRhIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHByb250by12Mi1waWwiLCAmcHJvbnRvX3YyX2RhdGEgfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB3Y25zc19kcml2ZXIgPSB7CisJLnByb2JlID0gd2Nuc3NfcHJvYmUsCisJLnJlbW92ZSA9IHdjbnNzX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJxY29tLXdjbnNzLXBpbCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHdjbnNzX29mX21hdGNoLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHdjbnNzX2RyaXZlcik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlF1YWxjb21tIFBlcmlwaGVyaWFsIEltYWdlIExvYWRlciBmb3IgV2lyZWxlc3MgU3Vic3lzdGVtIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlbW90ZXByb2MvcWNvbV93Y25zcy5oIGIvZHJpdmVycy9yZW1vdGVwcm9jL3Fjb21fd2Nuc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGM0YTlmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9yZW1vdGVwcm9jL3Fjb21fd2Nuc3MuaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fUUNPTV9XTkNTU19IX18KKyNkZWZpbmUgX19RQ09NX1dOQ1NTX0hfXworCitzdHJ1Y3QgcWNvbV9pcmlzOworc3RydWN0IHFjb21fd2Nuc3M7CisKK3N0cnVjdCB3Y25zc192cmVnX2luZm8geworCWNvbnN0IGNoYXIgKiBjb25zdCBuYW1lOworCWludCBtaW5fdm9sdGFnZTsKKwlpbnQgbWF4X3ZvbHRhZ2U7CisKKwlpbnQgbG9hZF91QTsKKworCWJvb2wgc3VwZXJfdHVyYm87Cit9OworCitpbnQgcWNvbV9pcmlzX2VuYWJsZShzdHJ1Y3QgcWNvbV9pcmlzICppcmlzKTsKK3ZvaWQgcWNvbV9pcmlzX2Rpc2FibGUoc3RydWN0IHFjb21faXJpcyAqaXJpcyk7CisKK3ZvaWQgcWNvbV93Y25zc19hc3NpZ25faXJpcyhzdHJ1Y3QgcWNvbV93Y25zcyAqd2Nuc3MsIHN0cnVjdCBxY29tX2lyaXMgKmlyaXMsIGJvb2wgdXNlXzQ4bWh6X3hvKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlbW90ZXByb2MvcWNvbV93Y25zc19pcmlzLmMgYi9kcml2ZXJzL3JlbW90ZXByb2MvcWNvbV93Y25zc19pcmlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjYTI0YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9xY29tX3djbnNzX2lyaXMuYwpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIFF1YWxjb21tIFdpcmVsZXNzIENvbm5lY3Rpdml0eSBTdWJzeXN0ZW0gSXJpcyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTGluYXJvIEx0ZAorICogQ29weXJpZ2h0IChDKSAyMDE0IFNvbnkgTW9iaWxlIENvbW11bmljYXRpb25zIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKworI2luY2x1ZGUgInFjb21fd2Nuc3MuaCIKKworc3RydWN0IHFjb21faXJpcyB7CisJc3RydWN0IGRldmljZSAqZGV2OworCisJc3RydWN0IGNsayAqeG9fY2xrOworCisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgKnZyZWdzOworCXNpemVfdCBudW1fdnJlZ3M7Cit9OworCitzdHJ1Y3QgaXJpc19kYXRhIHsKKwljb25zdCBzdHJ1Y3Qgd2Nuc3NfdnJlZ19pbmZvICp2cmVnczsKKwlzaXplX3QgbnVtX3ZyZWdzOworCisJYm9vbCB1c2VfNDhtaHpfeG87Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlyaXNfZGF0YSB3Y24zNjIwX2RhdGEgPSB7CisJLnZyZWdzID0gKHN0cnVjdCB3Y25zc192cmVnX2luZm9bXSkgeworCQl7ICJ2ZGR4byIsICAxODAwMDAwLCAxODAwMDAwLCAxMDAwMCB9LAorCQl7ICJ2ZGRyZmEiLCAxMzAwMDAwLCAxMzAwMDAwLCAxMDAwMDAgfSwKKwkJeyAidmRkcGEiLCAgMzMwMDAwMCwgMzMwMDAwMCwgNTE1MDAwIH0sCisJCXsgInZkZGRpZyIsIDE4MDAwMDAsIDE4MDAwMDAsIDEwMDAwIH0sCisJfSwKKwkubnVtX3ZyZWdzID0gNCwKKwkudXNlXzQ4bWh6X3hvID0gZmFsc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlyaXNfZGF0YSB3Y24zNjYwX2RhdGEgPSB7CisJLnZyZWdzID0gKHN0cnVjdCB3Y25zc192cmVnX2luZm9bXSkgeworCQl7ICJ2ZGR4byIsICAxODAwMDAwLCAxODAwMDAwLCAxMDAwMCB9LAorCQl7ICJ2ZGRyZmEiLCAxMzAwMDAwLCAxMzAwMDAwLCAxMDAwMDAgfSwKKwkJeyAidmRkcGEiLCAgMjkwMDAwMCwgMzAwMDAwMCwgNTE1MDAwIH0sCisJCXsgInZkZGRpZyIsIDEyMDAwMDAsIDEyMjUwMDAsIDEwMDAwIH0sCisJfSwKKwkubnVtX3ZyZWdzID0gNCwKKwkudXNlXzQ4bWh6X3hvID0gdHJ1ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJpc19kYXRhIHdjbjM2ODBfZGF0YSA9IHsKKwkudnJlZ3MgPSAoc3RydWN0IHdjbnNzX3ZyZWdfaW5mb1tdKSB7CisJCXsgInZkZHhvIiwgIDE4MDAwMDAsIDE4MDAwMDAsIDEwMDAwIH0sCisJCXsgInZkZHJmYSIsIDEzMDAwMDAsIDEzMDAwMDAsIDEwMDAwMCB9LAorCQl7ICJ2ZGRwYSIsICAzMzAwMDAwLCAzMzAwMDAwLCA1MTUwMDAgfSwKKwkJeyAidmRkZGlnIiwgMTgwMDAwMCwgMTgwMDAwMCwgMTAwMDAgfSwKKwl9LAorCS5udW1fdnJlZ3MgPSA0LAorCS51c2VfNDhtaHpfeG8gPSB0cnVlLAorfTsKKworaW50IHFjb21faXJpc19lbmFibGUoc3RydWN0IHFjb21faXJpcyAqaXJpcykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKGlyaXMtPm51bV92cmVncywgaXJpcy0+dnJlZ3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoaXJpcy0+eG9fY2xrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoaXJpcy0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSB4byBjbGtcbiIpOworCQlnb3RvIGRpc2FibGVfcmVndWxhdG9yczsKKwl9CisKKwlyZXR1cm4gMDsKKworZGlzYWJsZV9yZWd1bGF0b3JzOgorCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoaXJpcy0+bnVtX3ZyZWdzLCBpcmlzLT52cmVncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocWNvbV9pcmlzX2VuYWJsZSk7CisKK3ZvaWQgcWNvbV9pcmlzX2Rpc2FibGUoc3RydWN0IHFjb21faXJpcyAqaXJpcykKK3sKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaXJpcy0+eG9fY2xrKTsKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKGlyaXMtPm51bV92cmVncywgaXJpcy0+dnJlZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocWNvbV9pcmlzX2Rpc2FibGUpOworCitzdGF0aWMgaW50IHFjb21faXJpc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBpcmlzX2RhdGEgKmRhdGE7CisJc3RydWN0IHFjb21fd2Nuc3MgKndjbnNzOworCXN0cnVjdCBxY29tX2lyaXMgKmlyaXM7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWlyaXMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBxY29tX2lyaXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlyaXMpCisJCXJldHVybiAtRU5PTUVNOworCisJZGF0YSA9IG9mX2RldmljZV9nZXRfbWF0Y2hfZGF0YSgmcGRldi0+ZGV2KTsKKwl3Y25zcyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKworCWlyaXMtPnhvX2NsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAieG8iKTsKKwlpZiAoSVNfRVJSKGlyaXMtPnhvX2NsaykpIHsKKwkJaWYgKFBUUl9FUlIoaXJpcy0+eG9fY2xrKSAhPSAtRVBST0JFX0RFRkVSKQorCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFjcXVpcmUgeG8gY2xrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoaXJpcy0+eG9fY2xrKTsKKwl9CisKKwlpcmlzLT5udW1fdnJlZ3MgPSBkYXRhLT5udW1fdnJlZ3M7CisJaXJpcy0+dnJlZ3MgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwKKwkJCQkgICBpcmlzLT5udW1fdnJlZ3MsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhKSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWlyaXMtPnZyZWdzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBpcmlzLT5udW1fdnJlZ3M7IGkrKykKKwkJaXJpcy0+dnJlZ3NbaV0uc3VwcGx5ID0gZGF0YS0+dnJlZ3NbaV0ubmFtZTsKKworCXJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KCZwZGV2LT5kZXYsIGlyaXMtPm51bV92cmVncywgaXJpcy0+dnJlZ3MpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCByZWd1bGF0b3JzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgaXJpcy0+bnVtX3ZyZWdzOyBpKyspIHsKKwkJaWYgKGRhdGEtPnZyZWdzW2ldLm1heF92b2x0YWdlKQorCQkJcmVndWxhdG9yX3NldF92b2x0YWdlKGlyaXMtPnZyZWdzW2ldLmNvbnN1bWVyLAorCQkJCQkgICAgICBkYXRhLT52cmVnc1tpXS5taW5fdm9sdGFnZSwKKwkJCQkJICAgICAgZGF0YS0+dnJlZ3NbaV0ubWF4X3ZvbHRhZ2UpOworCisJCWlmIChkYXRhLT52cmVnc1tpXS5sb2FkX3VBKQorCQkJcmVndWxhdG9yX3NldF9sb2FkKGlyaXMtPnZyZWdzW2ldLmNvbnN1bWVyLAorCQkJCQkgICBkYXRhLT52cmVnc1tpXS5sb2FkX3VBKTsKKwl9CisKKwlxY29tX3djbnNzX2Fzc2lnbl9pcmlzKHdjbnNzLCBpcmlzLCBkYXRhLT51c2VfNDhtaHpfeG8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcWNvbV9pcmlzX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBxY29tX3djbnNzICp3Y25zcyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKworCXFjb21fd2Nuc3NfYXNzaWduX2lyaXMod2Nuc3MsIE5VTEwsIGZhbHNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpcmlzX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHdjbjM2MjAiLCAuZGF0YSA9ICZ3Y24zNjIwX2RhdGEgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20sd2NuMzY2MCIsIC5kYXRhID0gJndjbjM2NjBfZGF0YSB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSx3Y24zNjgwIiwgLmRhdGEgPSAmd2NuMzY4MF9kYXRhIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdjbnNzX2RyaXZlciA9IHsKKwkucHJvYmUgPSBxY29tX2lyaXNfcHJvYmUsCisJLnJlbW92ZSA9IHFjb21faXJpc19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicWNvbS1pcmlzIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gaXJpc19vZl9tYXRjaCwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih3Y25zc19kcml2ZXIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJRdWFsY29tbSBXaXJlbGVzcyBTdWJzeXN0ZW0gSXJpcyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX2NvcmUuYyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX2NvcmUuYwppbmRleCBmZTA1MzllLi5jNmJmYjM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfY29yZS5jCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX2NvcmUuYwpAQCAtNzgsNyArNzgsNyBAQAogICogd2lsbCB0cnkgdG8gYWNjZXNzIGFuIHVubWFwcGVkIGRldmljZSBhZGRyZXNzLgogICovCiBzdGF0aWMgaW50IHJwcm9jX2lvbW11X2ZhdWx0KHN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiwgc3RydWN0IGRldmljZSAqZGV2LAotCQl1bnNpZ25lZCBsb25nIGlvdmEsIGludCBmbGFncywgdm9pZCAqdG9rZW4pCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgaW92YSwgaW50IGZsYWdzLCB2b2lkICp0b2tlbikKIHsKIAlzdHJ1Y3QgcnByb2MgKnJwcm9jID0gdG9rZW47CiAKQEAgLTIzNiw4ICsyMzYsOCBAQAogCX0KIAlub3RpZnlpZCA9IHJldDsKIAotCWRldl9kYmcoZGV2LCAidnJpbmclZDogdmEgJXAgZG1hICVsbHggc2l6ZSAleCBpZHIgJWRcbiIsIGksIHZhLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZG1hLCBzaXplLCBub3RpZnlpZCk7CisJZGV2X2RiZyhkZXYsICJ2cmluZyVkOiB2YSAlcCBkbWEgJXBhZCBzaXplIDB4JXggaWRyICVkXG4iLAorCQlpLCB2YSwgJmRtYSwgc2l6ZSwgbm90aWZ5aWQpOwogCiAJcnZyaW5nLT52YSA9IHZhOwogCXJ2cmluZy0+ZG1hID0gZG1hOwpAQCAtMjYzLDE5ICsyNjMsMTMgQEAKIAlzdHJ1Y3QgZndfcnNjX3ZkZXZfdnJpbmcgKnZyaW5nID0gJnJzYy0+dnJpbmdbaV07CiAJc3RydWN0IHJwcm9jX3ZyaW5nICpydnJpbmcgPSAmcnZkZXYtPnZyaW5nW2ldOwogCi0JZGV2X2RiZyhkZXYsICJ2ZGV2IHJzYzogdnJpbmclZDogZGEgJXgsIHFzeiAlZCwgYWxpZ24gJWRcbiIsCi0JCQkJaSwgdnJpbmctPmRhLCB2cmluZy0+bnVtLCB2cmluZy0+YWxpZ24pOwotCi0JLyogbWFrZSBzdXJlIHJlc2VydmVkIGJ5dGVzIGFyZSB6ZXJvZXMgKi8KLQlpZiAodnJpbmctPnJlc2VydmVkKSB7Ci0JCWRldl9lcnIoZGV2LCAidnJpbmcgcnNjIGhhcyBub24gemVybyByZXNlcnZlZCBieXRlc1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlkZXZfZGJnKGRldiwgInZkZXYgcnNjOiB2cmluZyVkOiBkYSAweCV4LCBxc3ogJWQsIGFsaWduICVkXG4iLAorCQlpLCB2cmluZy0+ZGEsIHZyaW5nLT5udW0sIHZyaW5nLT5hbGlnbik7CiAKIAkvKiB2ZXJpZnkgcXVldWUgc2l6ZSBhbmQgdnJpbmcgYWxpZ25tZW50IGFyZSBzYW5lICovCiAJaWYgKCF2cmluZy0+bnVtIHx8ICF2cmluZy0+YWxpZ24pIHsKIAkJZGV2X2VycihkZXYsICJpbnZhbGlkIHFzeiAoJWQpIG9yIGFsaWdubWVudCAoJWQpXG4iLAotCQkJCQkJdnJpbmctPm51bSwgdnJpbmctPmFsaWduKTsKKwkJCXZyaW5nLT5udW0sIHZyaW5nLT5hbGlnbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzMwLDcgKzMyNCw3IEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3IgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZSBvdGhlcndpc2UKICAqLwogc3RhdGljIGludCBycHJvY19oYW5kbGVfdmRldihzdHJ1Y3QgcnByb2MgKnJwcm9jLCBzdHJ1Y3QgZndfcnNjX3ZkZXYgKnJzYywKLQkJCQkJCQlpbnQgb2Zmc2V0LCBpbnQgYXZhaWwpCisJCQkgICAgIGludCBvZmZzZXQsIGludCBhdmFpbCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcnByb2MtPmRldjsKIAlzdHJ1Y3QgcnByb2NfdmRldiAqcnZkZXY7CkBAIC0zNDksNyArMzQzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZGV2X2RiZyhkZXYsICJ2ZGV2IHJzYzogaWQgJWQsIGRmZWF0dXJlcyAleCwgY2ZnIGxlbiAlZCwgJWQgdnJpbmdzXG4iLAorCWRldl9kYmcoZGV2LCAidmRldiByc2M6IGlkICVkLCBkZmVhdHVyZXMgMHgleCwgY2ZnIGxlbiAlZCwgJWQgdnJpbmdzXG4iLAogCQlyc2MtPmlkLCByc2MtPmRmZWF0dXJlcywgcnNjLT5jb25maWdfbGVuLCByc2MtPm51bV9vZl92cmluZ3MpOwogCiAJLyogd2UgY3VycmVudGx5IHN1cHBvcnQgb25seSB0d28gdnJpbmdzIHBlciBydmRldiAqLwpAQCAtMzU4LDcgKzM1Miw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJ2ZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJwcm9jX3ZkZXYpLCBHRlBfS0VSTkVMKTsKKwlydmRldiA9IGt6YWxsb2Moc2l6ZW9mKCpydmRldiksIEdGUF9LRVJORUwpOwogCWlmICghcnZkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC00MDcsNyArNDAxLDcgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIG90aGVyd2lzZQogICovCiBzdGF0aWMgaW50IHJwcm9jX2hhbmRsZV90cmFjZShzdHJ1Y3QgcnByb2MgKnJwcm9jLCBzdHJ1Y3QgZndfcnNjX3RyYWNlICpyc2MsCi0JCQkJCQkJaW50IG9mZnNldCwgaW50IGF2YWlsKQorCQkJICAgICAgaW50IG9mZnNldCwgaW50IGF2YWlsKQogewogCXN0cnVjdCBycHJvY19tZW1fZW50cnkgKnRyYWNlOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZycHJvYy0+ZGV2OwpAQCAtNDU1LDggKzQ0OSw4IEBACiAKIAlycHJvYy0+bnVtX3RyYWNlcysrOwogCi0JZGV2X2RiZyhkZXYsICIlcyBhZGRlZDogdmEgJXAsIGRhIDB4JXgsIGxlbiAweCV4XG4iLCBuYW1lLCBwdHIsCi0JCQkJCQlyc2MtPmRhLCByc2MtPmxlbik7CisJZGV2X2RiZyhkZXYsICIlcyBhZGRlZDogdmEgJXAsIGRhIDB4JXgsIGxlbiAweCV4XG4iLAorCQluYW1lLCBwdHIsIHJzYy0+ZGEsIHJzYy0+bGVuKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDg3LDcgKzQ4MSw3IEBACiAgKiBhcmUgb3V0c2lkZSB0aG9zZSByYW5nZXMuCiAgKi8KIHN0YXRpYyBpbnQgcnByb2NfaGFuZGxlX2Rldm1lbShzdHJ1Y3QgcnByb2MgKnJwcm9jLCBzdHJ1Y3QgZndfcnNjX2Rldm1lbSAqcnNjLAotCQkJCQkJCWludCBvZmZzZXQsIGludCBhdmFpbCkKKwkJCSAgICAgICBpbnQgb2Zmc2V0LCBpbnQgYXZhaWwpCiB7CiAJc3RydWN0IHJwcm9jX21lbV9lbnRyeSAqbWFwcGluZzsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcnByb2MtPmRldjsKQEAgLTUzMCw3ICs1MjQsNyBAQAogCWxpc3RfYWRkX3RhaWwoJm1hcHBpbmctPm5vZGUsICZycHJvYy0+bWFwcGluZ3MpOwogCiAJZGV2X2RiZyhkZXYsICJtYXBwZWQgZGV2bWVtIHBhIDB4JXgsIGRhIDB4JXgsIGxlbiAweCV4XG4iLAotCQkJCQlyc2MtPnBhLCByc2MtPmRhLCByc2MtPmxlbik7CisJCXJzYy0+cGEsIHJzYy0+ZGEsIHJzYy0+bGVuKTsKIAogCXJldHVybiAwOwogCkBAIC01NTgsOSArNTUyLDggQEAKICAqIHByZXNzdXJlIGlzIGltcG9ydGFudDsgaXQgbWF5IGhhdmUgYSBzdWJzdGFudGlhbCBpbXBhY3Qgb24gcGVyZm9ybWFuY2UuCiAgKi8KIHN0YXRpYyBpbnQgcnByb2NfaGFuZGxlX2NhcnZlb3V0KHN0cnVjdCBycHJvYyAqcnByb2MsCi0JCQkJCQlzdHJ1Y3QgZndfcnNjX2NhcnZlb3V0ICpyc2MsCi0JCQkJCQlpbnQgb2Zmc2V0LCBpbnQgYXZhaWwpCi0KKwkJCQkgc3RydWN0IGZ3X3JzY19jYXJ2ZW91dCAqcnNjLAorCQkJCSBpbnQgb2Zmc2V0LCBpbnQgYXZhaWwpCiB7CiAJc3RydWN0IHJwcm9jX21lbV9lbnRyeSAqY2FydmVvdXQsICptYXBwaW5nOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZycHJvYy0+ZGV2OwpAQCAtNTc5LDggKzU3Miw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRldl9kYmcoZGV2LCAiY2FydmVvdXQgcnNjOiBkYSAleCwgcGEgJXgsIGxlbiAleCwgZmxhZ3MgJXhcbiIsCi0JCQlyc2MtPmRhLCByc2MtPnBhLCByc2MtPmxlbiwgcnNjLT5mbGFncyk7CisJZGV2X2RiZyhkZXYsICJjYXJ2ZW91dCByc2M6IG5hbWU6ICVzLCBkYSAweCV4LCBwYSAweCV4LCBsZW4gMHgleCwgZmxhZ3MgMHgleFxuIiwKKwkJcnNjLT5uYW1lLCByc2MtPmRhLCByc2MtPnBhLCByc2MtPmxlbiwgcnNjLT5mbGFncyk7CiAKIAljYXJ2ZW91dCA9IGt6YWxsb2Moc2l6ZW9mKCpjYXJ2ZW91dCksIEdGUF9LRVJORUwpOwogCWlmICghY2FydmVvdXQpCkBAIC01ODgsMTMgKzU4MSwxNCBAQAogCiAJdmEgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LT5wYXJlbnQsIHJzYy0+bGVuLCAmZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZhKSB7Ci0JCWRldl9lcnIoZGV2LT5wYXJlbnQsICJkbWFfYWxsb2NfY29oZXJlbnQgZXJyOiAlZFxuIiwgcnNjLT5sZW4pOworCQlkZXZfZXJyKGRldi0+cGFyZW50LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBkbWEgbWVtb3J5OiBsZW4gMHgleFxuIiwgcnNjLT5sZW4pOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZyZWVfY2FydjsKIAl9CiAKLQlkZXZfZGJnKGRldiwgImNhcnZlb3V0IHZhICVwLCBkbWEgJWxseCwgbGVuIDB4JXhcbiIsIHZhLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRtYSwgcnNjLT5sZW4pOworCWRldl9kYmcoZGV2LCAiY2FydmVvdXQgdmEgJXAsIGRtYSAlcGFkLCBsZW4gMHgleFxuIiwKKwkJdmEsICZkbWEsIHJzYy0+bGVuKTsKIAogCS8qCiAJICogT2ssIHRoaXMgaXMgbm9uLXN0YW5kYXJkLgpAQCAtNjE2LDEzICs2MTAsMTIgQEAKIAlpZiAocnByb2MtPmRvbWFpbikgewogCQltYXBwaW5nID0ga3phbGxvYyhzaXplb2YoKm1hcHBpbmcpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtYXBwaW5nKSB7Ci0JCQlkZXZfZXJyKGRldiwgImt6YWxsb2MgbWFwcGluZyBmYWlsZWRcbiIpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZG1hX2ZyZWU7CiAJCX0KIAogCQlyZXQgPSBpb21tdV9tYXAocnByb2MtPmRvbWFpbiwgcnNjLT5kYSwgZG1hLCByc2MtPmxlbiwKLQkJCQkJCQkJcnNjLT5mbGFncyk7CisJCQkJcnNjLT5mbGFncyk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoZGV2LCAiaW9tbXVfbWFwIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCQlnb3RvIGZyZWVfbWFwcGluZzsKQEAgLTYzOSw4ICs2MzIsOCBAQAogCQltYXBwaW5nLT5sZW4gPSByc2MtPmxlbjsKIAkJbGlzdF9hZGRfdGFpbCgmbWFwcGluZy0+bm9kZSwgJnJwcm9jLT5tYXBwaW5ncyk7CiAKLQkJZGV2X2RiZyhkZXYsICJjYXJ2ZW91dCBtYXBwZWQgMHgleCB0byAweCVsbHhcbiIsCi0JCQkJCXJzYy0+ZGEsICh1bnNpZ25lZCBsb25nIGxvbmcpZG1hKTsKKwkJZGV2X2RiZyhkZXYsICJjYXJ2ZW91dCBtYXBwZWQgMHgleCB0byAlcGFkXG4iLAorCQkJcnNjLT5kYSwgJmRtYSk7CiAJfQogCiAJLyoKQEAgLTY5NywxNyArNjkwLDEzIEBACiAJW1JTQ19DQVJWRU9VVF0gPSAocnByb2NfaGFuZGxlX3Jlc291cmNlX3QpcnByb2NfaGFuZGxlX2NhcnZlb3V0LAogCVtSU0NfREVWTUVNXSA9IChycHJvY19oYW5kbGVfcmVzb3VyY2VfdClycHJvY19oYW5kbGVfZGV2bWVtLAogCVtSU0NfVFJBQ0VdID0gKHJwcm9jX2hhbmRsZV9yZXNvdXJjZV90KXJwcm9jX2hhbmRsZV90cmFjZSwKLQlbUlNDX1ZERVZdID0gTlVMTCwgLyogVkRFVnMgd2VyZSBoYW5kbGVkIHVwb24gcmVnaXN0cmFyaW9uICovCisJW1JTQ19WREVWXSA9IChycHJvY19oYW5kbGVfcmVzb3VyY2VfdClycHJvY19jb3VudF92cmluZ3MsCiB9OwogCiBzdGF0aWMgcnByb2NfaGFuZGxlX3Jlc291cmNlX3QgcnByb2NfdmRldl9oYW5kbGVyW1JTQ19MQVNUXSA9IHsKIAlbUlNDX1ZERVZdID0gKHJwcm9jX2hhbmRsZV9yZXNvdXJjZV90KXJwcm9jX2hhbmRsZV92ZGV2LAogfTsKIAotc3RhdGljIHJwcm9jX2hhbmRsZV9yZXNvdXJjZV90IHJwcm9jX2NvdW50X3ZyaW5nc19oYW5kbGVyW1JTQ19MQVNUXSA9IHsKLQlbUlNDX1ZERVZdID0gKHJwcm9jX2hhbmRsZV9yZXNvdXJjZV90KXJwcm9jX2NvdW50X3ZyaW5ncywKLX07Ci0KIC8qIGhhbmRsZSBmaXJtd2FyZSByZXNvdXJjZSBlbnRyaWVzIGJlZm9yZSBib290aW5nIHRoZSByZW1vdGUgcHJvY2Vzc29yICovCiBzdGF0aWMgaW50IHJwcm9jX2hhbmRsZV9yZXNvdXJjZXMoc3RydWN0IHJwcm9jICpycHJvYywgaW50IGxlbiwKIAkJCQkgIHJwcm9jX2hhbmRsZV9yZXNvdXJjZV90IGhhbmRsZXJzW1JTQ19MQVNUXSkKQEAgLTc1Nyw2ICs3NDYsNyBAQAogc3RhdGljIHZvaWQgcnByb2NfcmVzb3VyY2VfY2xlYW51cChzdHJ1Y3QgcnByb2MgKnJwcm9jKQogewogCXN0cnVjdCBycHJvY19tZW1fZW50cnkgKmVudHJ5LCAqdG1wOworCXN0cnVjdCBycHJvY192ZGV2ICpydmRldiwgKnJ2dG1wOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZycHJvYy0+ZGV2OwogCiAJLyogY2xlYW4gdXAgZGVidWdmcyB0cmFjZSBlbnRyaWVzICovCkBAIC03NzUsNyArNzY1LDcgQEAKIAkJaWYgKHVubWFwcGVkICE9IGVudHJ5LT5sZW4pIHsKIAkJCS8qIG5vdGhpbmcgbXVjaCB0byBkbyBiZXNpZGVzIGNvbXBsYWluaW5nICovCiAJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byB1bm1hcCAldS8lenVcbiIsIGVudHJ5LT5sZW4sCi0JCQkJCQkJCXVubWFwcGVkKTsKKwkJCQl1bm1hcHBlZCk7CiAJCX0KIAogCQlsaXN0X2RlbCgmZW50cnktPm5vZGUpOwpAQCAtNzg5LDYgKzc3OSwxMCBAQAogCQlsaXN0X2RlbCgmZW50cnktPm5vZGUpOwogCQlrZnJlZShlbnRyeSk7CiAJfQorCisJLyogY2xlYW4gdXAgcmVtb3RlIHZkZXYgZW50cmllcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShydmRldiwgcnZ0bXAsICZycHJvYy0+cnZkZXZzLCBub2RlKQorCQlycHJvY19yZW1vdmVfdmlydGlvX2RldihydmRldik7CiB9CiAKIC8qCkBAIC04MDEsOSArNzk1LDYgQEAKIAlzdHJ1Y3QgcmVzb3VyY2VfdGFibGUgKnRhYmxlLCAqbG9hZGVkX3RhYmxlOwogCWludCByZXQsIHRhYmxlc3o7CiAKLQlpZiAoIXJwcm9jLT50YWJsZV9wdHIpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJcmV0ID0gcnByb2NfZndfc2FuaXR5X2NoZWNrKHJwcm9jLCBmdyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTgzMCw5ICs4MjEsMjUgQEAKIAkJZ290byBjbGVhbl91cDsKIAl9CiAKLQkvKiBWZXJpZnkgdGhhdCByZXNvdXJjZSB0YWJsZSBpbiBsb2FkZWQgZncgaXMgdW5jaGFuZ2VkICovCi0JaWYgKHJwcm9jLT50YWJsZV9jc3VtICE9IGNyYzMyKDAsIHRhYmxlLCB0YWJsZXN6KSkgewotCQlkZXZfZXJyKGRldiwgInJlc291cmNlIGNoZWNrc3VtIGZhaWxlZCwgZncgY2hhbmdlZD9cbiIpOworCS8qCisJICogQ3JlYXRlIGEgY29weSBvZiB0aGUgcmVzb3VyY2UgdGFibGUuIFdoZW4gYSB2aXJ0aW8gZGV2aWNlIHN0YXJ0cworCSAqIGFuZCBjYWxscyB2cmluZ19uZXdfdmlydHF1ZXVlKCkgdGhlIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCB2cmluZworCSAqIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBjYWNoZWRfdGFibGUuIEJlZm9yZSB0aGUgZGV2aWNlIGlzIHN0YXJ0ZWQsCisJICogY2FjaGVkX3RhYmxlIHdpbGwgYmUgY29waWVkIGludG8gZGV2aWNlIG1lbW9yeS4KKwkgKi8KKwlycHJvYy0+Y2FjaGVkX3RhYmxlID0ga21lbWR1cCh0YWJsZSwgdGFibGVzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFycHJvYy0+Y2FjaGVkX3RhYmxlKQorCQlnb3RvIGNsZWFuX3VwOworCisJcnByb2MtPnRhYmxlX3B0ciA9IHJwcm9jLT5jYWNoZWRfdGFibGU7CisKKwkvKiByZXNldCBtYXhfbm90aWZ5aWQgKi8KKwlycHJvYy0+bWF4X25vdGlmeWlkID0gLTE7CisKKwkvKiBsb29rIGZvciB2aXJ0aW8gZGV2aWNlcyBhbmQgcmVnaXN0ZXIgdGhlbSAqLworCXJldCA9IHJwcm9jX2hhbmRsZV9yZXNvdXJjZXMocnByb2MsIHRhYmxlc3osIHJwcm9jX3ZkZXZfaGFuZGxlcik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBoYW5kbGUgdmRldiByZXNvdXJjZXM6ICVkXG4iLCByZXQpOwogCQlnb3RvIGNsZWFuX3VwOwogCX0KIApAQCAtODQwLDQ5ICs4NDcsNTAgQEAKIAlyZXQgPSBycHJvY19oYW5kbGVfcmVzb3VyY2VzKHJwcm9jLCB0YWJsZXN6LCBycHJvY19sb2FkaW5nX2hhbmRsZXJzKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHByb2Nlc3MgcmVzb3VyY2VzOiAlZFxuIiwgcmV0KTsKLQkJZ290byBjbGVhbl91cDsKKwkJZ290byBjbGVhbl91cF9yZXNvdXJjZXM7CiAJfQogCiAJLyogbG9hZCB0aGUgRUxGIHNlZ21lbnRzIHRvIG1lbW9yeSAqLwogCXJldCA9IHJwcm9jX2xvYWRfc2VnbWVudHMocnByb2MsIGZ3KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGxvYWQgcHJvZ3JhbSBzZWdtZW50czogJWRcbiIsIHJldCk7Ci0JCWdvdG8gY2xlYW5fdXA7CisJCWdvdG8gY2xlYW5fdXBfcmVzb3VyY2VzOwogCX0KIAogCS8qCiAJICogVGhlIHN0YXJ0aW5nIGRldmljZSBoYXMgYmVlbiBnaXZlbiB0aGUgcnByb2MtPmNhY2hlZF90YWJsZSBhcyB0aGUKIAkgKiByZXNvdXJjZSB0YWJsZS4gVGhlIGFkZHJlc3Mgb2YgdGhlIHZyaW5nIGFsb25nIHdpdGggdGhlIG90aGVyCiAJICogYWxsb2NhdGVkIHJlc291cmNlcyAoY2FydmVvdXRzIGV0YykgaXMgc3RvcmVkIGluIGNhY2hlZF90YWJsZS4KLQkgKiBJbiBvcmRlciB0byBwYXNzIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhlIHJlbW90ZSBkZXZpY2Ugd2UgbXVzdAotCSAqIGNvcHkgdGhpcyBpbmZvcm1hdGlvbiB0byBkZXZpY2UgbWVtb3J5LgorCSAqIEluIG9yZGVyIHRvIHBhc3MgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUgcmVtb3RlIGRldmljZSB3ZSBtdXN0IGNvcHkKKwkgKiB0aGlzIGluZm9ybWF0aW9uIHRvIGRldmljZSBtZW1vcnkuIFdlIGFsc28gdXBkYXRlIHRoZSB0YWJsZV9wdHIgc28KKwkgKiB0aGF0IGFueSBzdWJzZXF1ZW50IGNoYW5nZXMgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBsb2FkZWQgdmVyc2lvbi4KIAkgKi8KIAlsb2FkZWRfdGFibGUgPSBycHJvY19maW5kX2xvYWRlZF9yc2NfdGFibGUocnByb2MsIGZ3KTsKLQlpZiAobG9hZGVkX3RhYmxlKQorCWlmIChsb2FkZWRfdGFibGUpIHsKIAkJbWVtY3B5KGxvYWRlZF90YWJsZSwgcnByb2MtPmNhY2hlZF90YWJsZSwgdGFibGVzeik7CisJCXJwcm9jLT50YWJsZV9wdHIgPSBsb2FkZWRfdGFibGU7CisJfQogCiAJLyogcG93ZXIgdXAgdGhlIHJlbW90ZSBwcm9jZXNzb3IgKi8KIAlyZXQgPSBycHJvYy0+b3BzLT5zdGFydChycHJvYyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgImNhbid0IHN0YXJ0IHJwcm9jICVzOiAlZFxuIiwgcnByb2MtPm5hbWUsIHJldCk7Ci0JCWdvdG8gY2xlYW5fdXA7CisJCWdvdG8gY2xlYW5fdXBfcmVzb3VyY2VzOwogCX0KIAotCS8qCi0JICogVXBkYXRlIHRhYmxlX3B0ciBzbyB0aGF0IGFsbCBzdWJzZXF1ZW50IHZyaW5nIGFsbG9jYXRpb25zIGFuZAotCSAqIHZpcnRpbyBmaWVsZHMgbWFuaXB1bGF0aW9uIHVwZGF0ZSB0aGUgYWN0dWFsIGxvYWRlZCByZXNvdXJjZSB0YWJsZQotCSAqIGluIGRldmljZSBtZW1vcnkuCi0JICovCi0JcnByb2MtPnRhYmxlX3B0ciA9IGxvYWRlZF90YWJsZTsKLQogCXJwcm9jLT5zdGF0ZSA9IFJQUk9DX1JVTk5JTkc7CiAKIAlkZXZfaW5mbyhkZXYsICJyZW1vdGUgcHJvY2Vzc29yICVzIGlzIG5vdyB1cFxuIiwgcnByb2MtPm5hbWUpOwogCiAJcmV0dXJuIDA7CiAKLWNsZWFuX3VwOgorY2xlYW5fdXBfcmVzb3VyY2VzOgogCXJwcm9jX3Jlc291cmNlX2NsZWFudXAocnByb2MpOworY2xlYW5fdXA6CisJa2ZyZWUocnByb2MtPmNhY2hlZF90YWJsZSk7CisJcnByb2MtPmNhY2hlZF90YWJsZSA9IE5VTEw7CisJcnByb2MtPnRhYmxlX3B0ciA9IE5VTEw7CisKIAlycHJvY19kaXNhYmxlX2lvbW11KHJwcm9jKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtODk4LDQyICs5MDYsMTEgQEAKIHN0YXRpYyB2b2lkIHJwcm9jX2Z3X2NvbmZpZ192aXJ0aW8oY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKIHsKIAlzdHJ1Y3QgcnByb2MgKnJwcm9jID0gY29udGV4dDsKLQlzdHJ1Y3QgcmVzb3VyY2VfdGFibGUgKnRhYmxlOwotCWludCByZXQsIHRhYmxlc3o7CiAKLQlpZiAocnByb2NfZndfc2FuaXR5X2NoZWNrKHJwcm9jLCBmdykgPCAwKQotCQlnb3RvIG91dDsKKwkvKiBpZiBycHJvYyBpcyBtYXJrZWQgYWx3YXlzLW9uLCByZXF1ZXN0IGl0IHRvIGJvb3QgKi8KKwlpZiAocnByb2MtPmF1dG9fYm9vdCkKKwkJcnByb2NfYm9vdF9ub3dhaXQocnByb2MpOwogCi0JLyogbG9vayBmb3IgdGhlIHJlc291cmNlIHRhYmxlICovCi0JdGFibGUgPSBycHJvY19maW5kX3JzY190YWJsZShycHJvYywgZncsICAmdGFibGVzeik7Ci0JaWYgKCF0YWJsZSkKLQkJZ290byBvdXQ7Ci0KLQlycHJvYy0+dGFibGVfY3N1bSA9IGNyYzMyKDAsIHRhYmxlLCB0YWJsZXN6KTsKLQotCS8qCi0JICogQ3JlYXRlIGEgY29weSBvZiB0aGUgcmVzb3VyY2UgdGFibGUuIFdoZW4gYSB2aXJ0aW8gZGV2aWNlIHN0YXJ0cwotCSAqIGFuZCBjYWxscyB2cmluZ19uZXdfdmlydHF1ZXVlKCkgdGhlIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCB2cmluZwotCSAqIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBjYWNoZWRfdGFibGUuIEJlZm9yZSB0aGUgZGV2aWNlIGlzIHN0YXJ0ZWQsCi0JICogY2FjaGVkX3RhYmxlIHdpbGwgYmUgY29waWVkIGludG8gZGV2aWMgbWVtb3J5LgotCSAqLwotCXJwcm9jLT5jYWNoZWRfdGFibGUgPSBrbWVtZHVwKHRhYmxlLCB0YWJsZXN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJwcm9jLT5jYWNoZWRfdGFibGUpCi0JCWdvdG8gb3V0OwotCi0JcnByb2MtPnRhYmxlX3B0ciA9IHJwcm9jLT5jYWNoZWRfdGFibGU7Ci0KLQkvKiBjb3VudCB0aGUgbnVtYmVyIG9mIG5vdGlmeS1pZHMgKi8KLQlycHJvYy0+bWF4X25vdGlmeWlkID0gLTE7Ci0JcmV0ID0gcnByb2NfaGFuZGxlX3Jlc291cmNlcyhycHJvYywgdGFibGVzeiwKLQkJCQkgICAgIHJwcm9jX2NvdW50X3ZyaW5nc19oYW5kbGVyKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dDsKLQotCS8qIGxvb2sgZm9yIHZpcnRpbyBkZXZpY2VzIGFuZCByZWdpc3RlciB0aGVtICovCi0JcmV0ID0gcnByb2NfaGFuZGxlX3Jlc291cmNlcyhycHJvYywgdGFibGVzeiwgcnByb2NfdmRldl9oYW5kbGVyKTsKLQotb3V0OgogCXJlbGVhc2VfZmlybXdhcmUoZncpOwogCS8qIGFsbG93IHJwcm9jX2RlbCgpIGNvbnRleHRzLCBpZiBhbnksIHRvIHByb2NlZWQgKi8KIAljb21wbGV0ZV9hbGwoJnJwcm9jLT5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKQEAgLTk2OSw3ICs5NDYsNyBAQAogICogcnByb2NfdHJpZ2dlcl9yZWNvdmVyeSgpIC0gcmVjb3ZlciBhIHJlbW90ZXByb2MKICAqIEBycHJvYzogdGhlIHJlbW90ZSBwcm9jZXNzb3IKICAqCi0gKiBUaGUgcmVjb3ZlcnkgaXMgZG9uZSBieSByZXNldGluZyBhbGwgdGhlIHZpcnRpbyBkZXZpY2VzLCB0aGF0IHdheSBhbGwgdGhlCisgKiBUaGUgcmVjb3ZlcnkgaXMgZG9uZSBieSByZXNldHRpbmcgYWxsIHRoZSB2aXJ0aW8gZGV2aWNlcywgdGhhdCB3YXkgYWxsIHRoZQogICogcnBtc2cgZHJpdmVycyB3aWxsIGJlIHJlc2V0ZWQgYWxvbmcgd2l0aCB0aGUgcmVtb3RlIHByb2Nlc3NvciBtYWtpbmcgdGhlCiAgKiByZW1vdGVwcm9jIGZ1bmN0aW9uYWwgYWdhaW4uCiAgKgpAQCAtOTc3LDIzICs5NTQsMjMgQEAKICAqLwogaW50IHJwcm9jX3RyaWdnZXJfcmVjb3Zlcnkoc3RydWN0IHJwcm9jICpycHJvYykKIHsKLQlzdHJ1Y3QgcnByb2NfdmRldiAqcnZkZXYsICpydnRtcDsKLQogCWRldl9lcnIoJnJwcm9jLT5kZXYsICJyZWNvdmVyaW5nICVzXG4iLCBycHJvYy0+bmFtZSk7CiAKIAlpbml0X2NvbXBsZXRpb24oJnJwcm9jLT5jcmFzaF9jb21wKTsKIAotCS8qIGNsZWFuIHVwIHJlbW90ZSB2ZGV2IGVudHJpZXMgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnZkZXYsIHJ2dG1wLCAmcnByb2MtPnJ2ZGV2cywgbm9kZSkKLQkJcnByb2NfcmVtb3ZlX3ZpcnRpb19kZXYocnZkZXYpOworCS8qIHNodXQgZG93biB0aGUgcmVtb3RlICovCisJLyogVE9ETzogbWFrZSBzdXJlIHRoaXMgd29ya3Mgd2l0aCBycHJvYy0+cG93ZXIgPiAxICovCisJcnByb2Nfc2h1dGRvd24ocnByb2MpOwogCiAJLyogd2FpdCB1bnRpbCB0aGVyZSBpcyBubyBtb3JlIHJwcm9jIHVzZXJzICovCiAJd2FpdF9mb3JfY29tcGxldGlvbigmcnByb2MtPmNyYXNoX2NvbXApOwogCi0JLyogRnJlZSB0aGUgY29weSBvZiB0aGUgcmVzb3VyY2UgdGFibGUgKi8KLQlrZnJlZShycHJvYy0+Y2FjaGVkX3RhYmxlKTsKKwkvKgorCSAqIGJvb3QgdGhlIHJlbW90ZSBwcm9jZXNzb3IgdXAgYWdhaW4KKwkgKi8KKwlycHJvY19ib290KHJwcm9jKTsKIAotCXJldHVybiBycHJvY19hZGRfdmlydGlvX2RldmljZXMocnByb2MpOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTEwNTgsMjAgKzEwMzUsNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIGxvYWRpbmcgYSBmaXJtd2FyZSBpcyByZXF1aXJlZCAqLwotCWlmICghcnByb2MtPmZpcm13YXJlKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IG5vIGZpcm13YXJlIHRvIGxvYWRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byB1bmxvY2tfbXV0ZXg7Ci0JfQotCi0JLyogcHJldmVudCB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgcmVtb3ZlZCAqLwotCWlmICghdHJ5X21vZHVsZV9nZXQoZGV2LT5wYXJlbnQtPmRyaXZlci0+b3duZXIpKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGNhbid0IGdldCBvd25lclxuIiwgX19mdW5jX18pOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIHVubG9ja19tdXRleDsKLQl9Ci0KIAkvKiBza2lwIHRoZSBib290IHByb2Nlc3MgaWYgcnByb2MgaXMgYWxyZWFkeSBwb3dlcmVkIHVwICovCiAJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZycHJvYy0+cG93ZXIpID4gMSkgewogCQlyZXQgPSAwOwpAQCAtMTA5NiwxMCArMTA1OSw4IEBACiAJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZV9wKTsKIAogZG93bnJlZl9ycHJvYzoKLQlpZiAocmV0KSB7Ci0JCW1vZHVsZV9wdXQoZGV2LT5wYXJlbnQtPmRyaXZlci0+b3duZXIpOworCWlmIChyZXQpCiAJCWF0b21pY19kZWMoJnJwcm9jLT5wb3dlcik7Ci0JfQogdW5sb2NrX211dGV4OgogCW11dGV4X3VubG9jaygmcnByb2MtPmxvY2spOwogCXJldHVybiByZXQ7CkBAIC0xMTczLDggKzExMzQsMTAgQEAKIAogCXJwcm9jX2Rpc2FibGVfaW9tbXUocnByb2MpOwogCi0JLyogR2l2ZSB0aGUgbmV4dCBzdGFydCBhIGNsZWFuIHJlc291cmNlIHRhYmxlICovCi0JcnByb2MtPnRhYmxlX3B0ciA9IHJwcm9jLT5jYWNoZWRfdGFibGU7CisJLyogRnJlZSB0aGUgY29weSBvZiB0aGUgcmVzb3VyY2UgdGFibGUgKi8KKwlrZnJlZShycHJvYy0+Y2FjaGVkX3RhYmxlKTsKKwlycHJvYy0+Y2FjaGVkX3RhYmxlID0gTlVMTDsKKwlycHJvYy0+dGFibGVfcHRyID0gTlVMTDsKIAogCS8qIGlmIGluIGNyYXNoIHN0YXRlLCB1bmxvY2sgY3Jhc2ggaGFuZGxlciAqLwogCWlmIChycHJvYy0+c3RhdGUgPT0gUlBST0NfQ1JBU0hFRCkKQEAgLTExODYsOCArMTE0OSw2IEBACiAKIG91dDoKIAltdXRleF91bmxvY2soJnJwcm9jLT5sb2NrKTsKLQlpZiAoIXJldCkKLQkJbW9kdWxlX3B1dChkZXYtPnBhcmVudC0+ZHJpdmVyLT5vd25lcik7CiB9CiBFWFBPUlRfU1lNQk9MKHJwcm9jX3NodXRkb3duKTsKIApAQCAtMTIxNiw2ICsxMTc3LDEyIEBACiAJbXV0ZXhfbG9jaygmcnByb2NfbGlzdF9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShyLCAmcnByb2NfbGlzdCwgbm9kZSkgewogCQlpZiAoci0+ZGV2LnBhcmVudCAmJiByLT5kZXYucGFyZW50LT5vZl9ub2RlID09IG5wKSB7CisJCQkvKiBwcmV2ZW50IHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gZnJvbSBiZWluZyByZW1vdmVkICovCisJCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHItPmRldi5wYXJlbnQtPmRyaXZlci0+b3duZXIpKSB7CisJCQkJZGV2X2Vycigmci0+ZGV2LCAiY2FuJ3QgZ2V0IG93bmVyXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwogCQkJcnByb2MgPSByOwogCQkJZ2V0X2RldmljZSgmcnByb2MtPmRldik7CiAJCQlicmVhazsKQEAgLTEzMzUsMTEgKzEzMDIsMTEgQEAKICAqIE9uIHN1Y2Nlc3MgdGhlIG5ldyBycHJvYyBpcyByZXR1cm5lZCwgYW5kIG9uIGZhaWx1cmUsIE5VTEwuCiAgKgogICogTm90ZTogX25ldmVyXyBkaXJlY3RseSBkZWFsbG9jYXRlIEBycHJvYywgZXZlbiBpZiBpdCB3YXMgbm90IHJlZ2lzdGVyZWQKLSAqIHlldC4gSW5zdGVhZCwgd2hlbiB5b3UgbmVlZCB0byB1bnJvbGwgcnByb2NfYWxsb2MoKSwgdXNlIHJwcm9jX3B1dCgpLgorICogeWV0LiBJbnN0ZWFkLCB3aGVuIHlvdSBuZWVkIHRvIHVucm9sbCBycHJvY19hbGxvYygpLCB1c2UgcnByb2NfZnJlZSgpLgogICovCiBzdHJ1Y3QgcnByb2MgKnJwcm9jX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQljb25zdCBzdHJ1Y3QgcnByb2Nfb3BzICpvcHMsCi0JCQkJY29uc3QgY2hhciAqZmlybXdhcmUsIGludCBsZW4pCisJCQkgIGNvbnN0IHN0cnVjdCBycHJvY19vcHMgKm9wcywKKwkJCSAgY29uc3QgY2hhciAqZmlybXdhcmUsIGludCBsZW4pCiB7CiAJc3RydWN0IHJwcm9jICpycHJvYzsKIAljaGFyICpwLCAqdGVtcGxhdGUgPSAicnByb2MtJXMtZnciOwpAQCAtMTM1OSw3ICsxMzI2LDcgQEAKIAkJICovCiAJCW5hbWVfbGVuID0gc3RybGVuKG5hbWUpICsgc3RybGVuKHRlbXBsYXRlKSAtIDIgKyAxOwogCi0JcnByb2MgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnByb2MpICsgbGVuICsgbmFtZV9sZW4sIEdGUF9LRVJORUwpOworCXJwcm9jID0ga3phbGxvYyhzaXplb2YoKnJwcm9jKSArIGxlbiArIG5hbWVfbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJwcm9jKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTM3NCw2ICsxMzQxLDcgQEAKIAlycHJvYy0+bmFtZSA9IG5hbWU7CiAJcnByb2MtPm9wcyA9IG9wczsKIAlycHJvYy0+cHJpdiA9ICZycHJvY1sxXTsKKwlycHJvYy0+YXV0b19ib290ID0gdHJ1ZTsKIAogCWRldmljZV9pbml0aWFsaXplKCZycHJvYy0+ZGV2KTsKIAlycHJvYy0+ZGV2LnBhcmVudCA9IGRldjsKQEAgLTE0MTMsNyArMTM4MSwyMiBAQAogRVhQT1JUX1NZTUJPTChycHJvY19hbGxvYyk7CiAKIC8qKgotICogcnByb2NfcHV0KCkgLSB1bnJvbGwgcnByb2NfYWxsb2MoKQorICogcnByb2NfZnJlZSgpIC0gdW5yb2xsIHJwcm9jX2FsbG9jKCkKKyAqIEBycHJvYzogdGhlIHJlbW90ZSBwcm9jZXNzb3IgaGFuZGxlCisgKgorICogVGhpcyBmdW5jdGlvbiBkZWNyZW1lbnRzIHRoZSBycHJvYyBkZXYgcmVmY291bnQuCisgKgorICogSWYgbm8gb25lIGhvbGRzIGFueSByZWZlcmVuY2UgdG8gcnByb2MgYW55bW9yZSwgdGhlbiBpdHMgcmVmY291bnQgd291bGQKKyAqIG5vdyBkcm9wIHRvIHplcm8sIGFuZCBpdCB3b3VsZCBiZSBmcmVlZC4KKyAqLwordm9pZCBycHJvY19mcmVlKHN0cnVjdCBycHJvYyAqcnByb2MpCit7CisJcHV0X2RldmljZSgmcnByb2MtPmRldik7Cit9CitFWFBPUlRfU1lNQk9MKHJwcm9jX2ZyZWUpOworCisvKioKKyAqIHJwcm9jX3B1dCgpIC0gcmVsZWFzZSBycHJvYyByZWZlcmVuY2UKICAqIEBycHJvYzogdGhlIHJlbW90ZSBwcm9jZXNzb3IgaGFuZGxlCiAgKgogICogVGhpcyBmdW5jdGlvbiBkZWNyZW1lbnRzIHRoZSBycHJvYyBkZXYgcmVmY291bnQuCkBAIC0xNDIzLDYgKzE0MDYsNyBAQAogICovCiB2b2lkIHJwcm9jX3B1dChzdHJ1Y3QgcnByb2MgKnJwcm9jKQogeworCW1vZHVsZV9wdXQocnByb2MtPmRldi5wYXJlbnQtPmRyaXZlci0+b3duZXIpOwogCXB1dF9kZXZpY2UoJnJwcm9jLT5kZXYpOwogfQogRVhQT1JUX1NZTUJPTChycHJvY19wdXQpOwpAQCAtMTQzOCw3ICsxNDIyLDcgQEAKICAqCiAgKiBBZnRlciBycHJvY19kZWwoKSByZXR1cm5zLCBAcnByb2MgaXNuJ3QgZnJlZWQgeWV0LCBiZWNhdXNlCiAgKiBvZiB0aGUgb3V0c3RhbmRpbmcgcmVmZXJlbmNlIGNyZWF0ZWQgYnkgcnByb2NfYWxsb2MuIFRvIGRlY3JlbWVudCB0aGF0Ci0gKiBvbmUgbGFzdCByZWZjb3VudCwgb25lIHN0aWxsIG5lZWRzIHRvIGNhbGwgcnByb2NfcHV0KCkuCisgKiBvbmUgbGFzdCByZWZjb3VudCwgb25lIHN0aWxsIG5lZWRzIHRvIGNhbGwgcnByb2NfZnJlZSgpLgogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCAtRUlOVkFMIGlmIEBycHJvYyBpc24ndCB2YWxpZC4KICAqLwpAQCAtMTQ1MiwxMyArMTQzNiwxNSBAQAogCS8qIGlmIHJwcm9jIGlzIGp1c3QgYmVpbmcgcmVnaXN0ZXJlZCwgd2FpdCAqLwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJwcm9jLT5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKIAorCS8qIGlmIHJwcm9jIGlzIG1hcmtlZCBhbHdheXMtb24sIHJwcm9jX2FkZCgpIGJvb3RlZCBpdCAqLworCS8qIFRPRE86IG1ha2Ugc3VyZSB0aGlzIHdvcmtzIHdpdGggcnByb2MtPnBvd2VyID4gMSAqLworCWlmIChycHJvYy0+YXV0b19ib290KQorCQlycHJvY19zaHV0ZG93bihycHJvYyk7CisKIAkvKiBjbGVhbiB1cCByZW1vdGUgdmRldiBlbnRyaWVzICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ2ZGV2LCB0bXAsICZycHJvYy0+cnZkZXZzLCBub2RlKQogCQlycHJvY19yZW1vdmVfdmlydGlvX2RldihydmRldik7CiAKLQkvKiBGcmVlIHRoZSBjb3B5IG9mIHRoZSByZXNvdXJjZSB0YWJsZSAqLwotCWtmcmVlKHJwcm9jLT5jYWNoZWRfdGFibGUpOwotCiAJLyogdGhlIHJwcm9jIGlzIGRvd25yZWYnZWQgYXMgc29vbiBhcyBpdCdzIHJlbW92ZWQgZnJvbSB0aGUga2xpc3QgKi8KIAltdXRleF9sb2NrKCZycHJvY19saXN0X211dGV4KTsKIAlsaXN0X2RlbCgmcnByb2MtPm5vZGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfZGVidWdmcy5jIGIvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfZGVidWdmcy5jCmluZGV4IDc0YTEyMGIuLjM3NDc5NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX2RlYnVnZnMuYworKysgYi9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY19kZWJ1Z2ZzLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKICAqIGFzIGl0IHByb3ZpZGVzIHZlcnkgZWFybHkgdHJhY2luZyB3aXRoIGxpdHRsZSB0byBubyBkZXBlbmRlbmNpZXMgYXQgYWxsLgogICovCiBzdGF0aWMgc3NpemVfdCBycHJvY190cmFjZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKLQkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBycHJvY19tZW1fZW50cnkgKnRyYWNlID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCWludCBsZW4gPSBzdHJubGVuKHRyYWNlLT52YSwgdHJhY2UtPmxlbik7CkBAIC03Myw3ICs3Myw3IEBACiAKIC8qIGV4cG9zZSB0aGUgc3RhdGUgb2YgdGhlIHJlbW90ZSBwcm9jZXNzb3IgdmlhIGRlYnVnZnMgKi8KIHN0YXRpYyBzc2l6ZV90IHJwcm9jX3N0YXRlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1c2VyYnVmLAotCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHJwcm9jICpycHJvYyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAl1bnNpZ25lZCBpbnQgc3RhdGU7CkBAIC04Myw3ICs4Myw3IEBACiAJc3RhdGUgPSBycHJvYy0+c3RhdGUgPiBSUFJPQ19MQVNUID8gUlBST0NfTEFTVCA6IHJwcm9jLT5zdGF0ZTsKIAogCWkgPSBzY25wcmludGYoYnVmLCAzMCwgIiUuMjhzICglZClcbiIsIHJwcm9jX3N0YXRlX3N0cmluZ1tzdGF0ZV0sCi0JCQkJCQkJcnByb2MtPnN0YXRlKTsKKwkJICAgICAgcnByb2MtPnN0YXRlKTsKIAogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBpKTsKIH0KQEAgLTEzMCw3ICsxMzAsNyBAQAogCiAvKiBleHBvc2UgdGhlIG5hbWUgb2YgdGhlIHJlbW90ZSBwcm9jZXNzb3IgdmlhIGRlYnVnZnMgKi8KIHN0YXRpYyBzc2l6ZV90IHJwcm9jX25hbWVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVzZXJidWYsCi0JCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgcnByb2MgKnJwcm9jID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCS8qIG5lZWQgcm9vbSBmb3IgdGhlIG5hbWUsIGEgbmV3bGluZSBhbmQgYSB0ZXJtaW5hdGluZyBudWxsICovCkBAIC0yMzAsMTIgKzIzMCwxMiBAQAogfQogCiBzdHJ1Y3QgZGVudHJ5ICpycHJvY19jcmVhdGVfdHJhY2VfZmlsZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcnByb2MgKnJwcm9jLAotCQkJCQlzdHJ1Y3QgcnByb2NfbWVtX2VudHJ5ICp0cmFjZSkKKwkJCQkgICAgICAgc3RydWN0IHJwcm9jX21lbV9lbnRyeSAqdHJhY2UpCiB7CiAJc3RydWN0IGRlbnRyeSAqdGZpbGU7CiAKLQl0ZmlsZSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgMDQwMCwgcnByb2MtPmRiZ19kaXIsCi0JCQkJCQl0cmFjZSwgJnRyYWNlX3Jwcm9jX29wcyk7CisJdGZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIDA0MDAsIHJwcm9jLT5kYmdfZGlyLCB0cmFjZSwKKwkJCQkgICAgJnRyYWNlX3Jwcm9jX29wcyk7CiAJaWYgKCF0ZmlsZSkgewogCQlkZXZfZXJyKCZycHJvYy0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIHRyYWNlIGVudHJ5XG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yNjQsMTEgKzI2NCwxMSBAQAogCQlyZXR1cm47CiAKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJuYW1lIiwgMDQwMCwgcnByb2MtPmRiZ19kaXIsCi0JCQkJCXJwcm9jLCAmcnByb2NfbmFtZV9vcHMpOworCQkJICAgIHJwcm9jLCAmcnByb2NfbmFtZV9vcHMpOwogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInN0YXRlIiwgMDQwMCwgcnByb2MtPmRiZ19kaXIsCi0JCQkJCXJwcm9jLCAmcnByb2Nfc3RhdGVfb3BzKTsKKwkJCSAgICBycHJvYywgJnJwcm9jX3N0YXRlX29wcyk7CiAJZGVidWdmc19jcmVhdGVfZmlsZSgicmVjb3ZlcnkiLCAwNDAwLCBycHJvYy0+ZGJnX2RpciwKLQkJCQkJcnByb2MsICZycHJvY19yZWNvdmVyeV9vcHMpOworCQkJICAgIHJwcm9jLCAmcnByb2NfcmVjb3Zlcnlfb3BzKTsKIH0KIAogdm9pZCBfX2luaXQgcnByb2NfaW5pdF9kZWJ1Z2ZzKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY19lbGZfbG9hZGVyLmMgYi9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY19lbGZfbG9hZGVyLmMKaW5kZXggY2UyODNhNS4uYzUyMzk4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfZWxmX2xvYWRlci5jCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX2VsZl9sb2FkZXIuYwpAQCAtMTY2LDE4ICsxNjYsMTggQEAKIAkJCWNvbnRpbnVlOwogCiAJCWRldl9kYmcoZGV2LCAicGhkcjogdHlwZSAlZCBkYSAweCV4IG1lbXN6IDB4JXggZmlsZXN6IDB4JXhcbiIsCi0JCQkJCXBoZHItPnBfdHlwZSwgZGEsIG1lbXN6LCBmaWxlc3opOworCQkJcGhkci0+cF90eXBlLCBkYSwgbWVtc3osIGZpbGVzeik7CiAKIAkJaWYgKGZpbGVzeiA+IG1lbXN6KSB7CiAJCQlkZXZfZXJyKGRldiwgImJhZCBwaGRyIGZpbGVzeiAweCV4IG1lbXN6IDB4JXhcbiIsCi0JCQkJCQkJZmlsZXN6LCBtZW1zeik7CisJCQkJZmlsZXN6LCBtZW1zeik7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCX0KIAogCQlpZiAob2Zmc2V0ICsgZmlsZXN6ID4gZnctPnNpemUpIHsKIAkJCWRldl9lcnIoZGV2LCAidHJ1bmNhdGVkIGZ3OiBuZWVkIDB4JXggYXZhaWwgMHglenhcbiIsCi0JCQkJCW9mZnNldCArIGZpbGVzeiwgZnctPnNpemUpOworCQkJCW9mZnNldCArIGZpbGVzeiwgZnctPnNpemUpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY19pbnRlcm5hbC5oIGIvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfaW50ZXJuYWwuaAppbmRleCA1N2UxZGU1Li40Y2Y5M2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlbW90ZXByb2MvcmVtb3RlcHJvY19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX2ludGVybmFsLmgKQEAgLTM2LDEwICszNiwxMCBAQAogICovCiBzdHJ1Y3QgcnByb2NfZndfb3BzIHsKIAlzdHJ1Y3QgcmVzb3VyY2VfdGFibGUgKigqZmluZF9yc2NfdGFibGUpKHN0cnVjdCBycHJvYyAqcnByb2MsCi0JCQkJCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LAotCQkJCQkJaW50ICp0YWJsZXN6KTsKLQlzdHJ1Y3QgcmVzb3VyY2VfdGFibGUgKigqZmluZF9sb2FkZWRfcnNjX3RhYmxlKShzdHJ1Y3QgcnByb2MgKnJwcm9jLAotCQkJCQkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyk7CisJCQkJCQkgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKKwkJCQkJCSBpbnQgKnRhYmxlc3opOworCXN0cnVjdCByZXNvdXJjZV90YWJsZSAqKCpmaW5kX2xvYWRlZF9yc2NfdGFibGUpKAorCQkJCXN0cnVjdCBycHJvYyAqcnByb2MsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpOwogCWludCAoKmxvYWQpKHN0cnVjdCBycHJvYyAqcnByb2MsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpOwogCWludCAoKnNhbml0eV9jaGVjaykoc3RydWN0IHJwcm9jICpycHJvYywgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyk7CiAJdTMyICgqZ2V0X2Jvb3RfYWRkcikoc3RydWN0IHJwcm9jICpycHJvYywgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyk7CkBAIC01Nyw3ICs1Nyw3IEBACiAvKiBmcm9tIHJlbW90ZXByb2NfZGVidWdmcy5jICovCiB2b2lkIHJwcm9jX3JlbW92ZV90cmFjZV9maWxlKHN0cnVjdCBkZW50cnkgKnRmaWxlKTsKIHN0cnVjdCBkZW50cnkgKnJwcm9jX2NyZWF0ZV90cmFjZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBycHJvYyAqcnByb2MsCi0JCQkJCXN0cnVjdCBycHJvY19tZW1fZW50cnkgKnRyYWNlKTsKKwkJCQkgICAgICAgc3RydWN0IHJwcm9jX21lbV9lbnRyeSAqdHJhY2UpOwogdm9pZCBycHJvY19kZWxldGVfZGVidWdfZGlyKHN0cnVjdCBycHJvYyAqcnByb2MpOwogdm9pZCBycHJvY19jcmVhdGVfZGVidWdfZGlyKHN0cnVjdCBycHJvYyAqcnByb2MpOwogdm9pZCBycHJvY19pbml0X2RlYnVnZnModm9pZCk7CkBAIC05OCw3ICs5OCw4IEBACiAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCByZXNvdXJjZV90YWJsZSAqcnByb2NfZmluZF9yc2NfdGFibGUoc3RydWN0IHJwcm9jICpycHJvYywKLQkJCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LCBpbnQgKnRhYmxlc3opCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LAorCQkJCQkgICAgaW50ICp0YWJsZXN6KQogewogCWlmIChycHJvYy0+Zndfb3BzLT5maW5kX3JzY190YWJsZSkKIAkJcmV0dXJuIHJwcm9jLT5md19vcHMtPmZpbmRfcnNjX3RhYmxlKHJwcm9jLCBmdywgdGFibGVzeik7CkBAIC0xMDgsNyArMTA5LDcgQEAKIAogc3RhdGljIGlubGluZQogc3RydWN0IHJlc291cmNlX3RhYmxlICpycHJvY19maW5kX2xvYWRlZF9yc2NfdGFibGUoc3RydWN0IHJwcm9jICpycHJvYywKLQkJCQkJCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncpCisJCQkJCQkgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQogewogCWlmIChycHJvYy0+Zndfb3BzLT5maW5kX2xvYWRlZF9yc2NfdGFibGUpCiAJCXJldHVybiBycHJvYy0+Zndfb3BzLT5maW5kX2xvYWRlZF9yc2NfdGFibGUocnByb2MsIGZ3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVtb3RlcHJvYy9yZW1vdGVwcm9jX3ZpcnRpby5jIGIvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfdmlydGlvLmMKaW5kZXggY2M5MTU1Ni4uMDE4NzBhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfdmlydGlvLmMKKysrIGIvZHJpdmVycy9yZW1vdGVwcm9jL3JlbW90ZXByb2NfdmlydGlvLmMKQEAgLTY5LDcgKzY5LDcgQEAKIEVYUE9SVF9TWU1CT0wocnByb2NfdnFfaW50ZXJydXB0KTsKIAogc3RhdGljIHN0cnVjdCB2aXJ0cXVldWUgKnJwX2ZpbmRfdnEoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsCi0JCQkJICAgIHVuc2lnbmVkIGlkLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgaWQsCiAJCQkJICAgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IHZpcnRxdWV1ZSAqdnEpLAogCQkJCSAgICBjb25zdCBjaGFyICpuYW1lKQogewpAQCAtMTAxLDE0ICsxMDEsMTQgQEAKIAltZW1zZXQoYWRkciwgMCwgc2l6ZSk7CiAKIAlkZXZfZGJnKGRldiwgInZyaW5nJWQ6IHZhICVwIHFzeiAlZCBub3RpZnlpZCAlZFxuIiwKLQkJCQkJaWQsIGFkZHIsIGxlbiwgcnZyaW5nLT5ub3RpZnlpZCk7CisJCWlkLCBhZGRyLCBsZW4sIHJ2cmluZy0+bm90aWZ5aWQpOwogCiAJLyoKIAkgKiBDcmVhdGUgdGhlIG5ldyB2cSwgYW5kIHRlbGwgdmlydGlvIHdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluCiAJICogdGhlICd3ZWFrJyBzbXAgYmFycmllcnMsIHNpbmNlIHdlJ3JlIHRhbGtpbmcgd2l0aCBhIHJlYWwgZGV2aWNlLgogCSAqLwogCXZxID0gdnJpbmdfbmV3X3ZpcnRxdWV1ZShpZCwgbGVuLCBydnJpbmctPmFsaWduLCB2ZGV2LCBmYWxzZSwgYWRkciwKLQkJCQkJcnByb2NfdmlydGlvX25vdGlmeSwgY2FsbGJhY2ssIG5hbWUpOworCQkJCSBycHJvY192aXJ0aW9fbm90aWZ5LCBjYWxsYmFjaywgbmFtZSk7CiAJaWYgKCF2cSkgewogCQlkZXZfZXJyKGRldiwgInZyaW5nX25ld192aXJ0cXVldWUgJXMgZmFpbGVkXG4iLCBuYW1lKTsKIAkJcnByb2NfZnJlZV92cmluZyhydnJpbmcpOwpAQCAtMTM2LDIwICsxMzYsMTQgQEAKIAogc3RhdGljIHZvaWQgcnByb2NfdmlydGlvX2RlbF92cXMoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCiB7Ci0Jc3RydWN0IHJwcm9jICpycHJvYyA9IHZkZXZfdG9fcnByb2ModmRldik7Ci0KLQkvKiBwb3dlciBkb3duIHRoZSByZW1vdGUgcHJvY2Vzc29yIGJlZm9yZSBkZWxldGluZyB2cXMgKi8KLQlycHJvY19zaHV0ZG93bihycHJvYyk7Ci0KIAlfX3Jwcm9jX3ZpcnRpb19kZWxfdnFzKHZkZXYpOwogfQogCi1zdGF0aWMgaW50IHJwcm9jX3ZpcnRpb19maW5kX3ZxcyhzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiwgdW5zaWduZWQgbnZxcywKLQkJICAgICAgIHN0cnVjdCB2aXJ0cXVldWUgKnZxc1tdLAotCQkgICAgICAgdnFfY2FsbGJhY2tfdCAqY2FsbGJhY2tzW10sCi0JCSAgICAgICBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSkKK3N0YXRpYyBpbnQgcnByb2NfdmlydGlvX2ZpbmRfdnFzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2LCB1bnNpZ25lZCBpbnQgbnZxcywKKwkJCQkgc3RydWN0IHZpcnRxdWV1ZSAqdnFzW10sCisJCQkJIHZxX2NhbGxiYWNrX3QgKmNhbGxiYWNrc1tdLAorCQkJCSBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbXSkKIHsKLQlzdHJ1Y3QgcnByb2MgKnJwcm9jID0gdmRldl90b19ycHJvYyh2ZGV2KTsKIAlpbnQgaSwgcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IG52cXM7ICsraSkgewpAQCAtMTYwLDEzICsxNTQsNiBAQAogCQl9CiAJfQogCi0JLyogbm93IHRoYXQgdGhlIHZxcyBhcmUgYWxsIHNldCwgYm9vdCB0aGUgcmVtb3RlIHByb2Nlc3NvciAqLwotCXJldCA9IHJwcm9jX2Jvb3Rfbm93YWl0KHJwcm9jKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnJwcm9jLT5kZXYsICJycHJvY19ib290KCkgZmFpbGVkICVkXG4iLCByZXQpOwotCQlnb3RvIGVycm9yOwotCX0KLQogCXJldHVybiAwOwogCiBlcnJvcjoKQEAgLTIzOSw4ICsyMjYsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBycHJvY192aXJ0aW9fZ2V0KHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2LCB1bnNpZ25lZCBvZmZzZXQsCi0JCQkJCQkJdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4pCitzdGF0aWMgdm9pZCBycHJvY192aXJ0aW9fZ2V0KHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2LCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCQkJICAgICB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJc3RydWN0IHJwcm9jX3ZkZXYgKnJ2ZGV2ID0gdmRldl90b19ydmRldih2ZGV2KTsKIAlzdHJ1Y3QgZndfcnNjX3ZkZXYgKnJzYzsKQEAgLTI1Nyw4ICsyNDQsOCBAQAogCW1lbWNweShidWYsIGNmZyArIG9mZnNldCwgbGVuKTsKIH0KIAotc3RhdGljIHZvaWQgcnByb2NfdmlydGlvX3NldChzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldiwgdW5zaWduZWQgb2Zmc2V0LAotCQkgICAgICBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbikKK3N0YXRpYyB2b2lkIHJwcm9jX3ZpcnRpb19zZXQoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIGludCBvZmZzZXQsCisJCQkgICAgIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlzdHJ1Y3QgcnByb2NfdmRldiAqcnZkZXYgPSB2ZGV2X3RvX3J2ZGV2KHZkZXYpOwogCXN0cnVjdCBmd19yc2NfdmRldiAqcnNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1vdGVwcm9jL3N0X3JlbW90ZXByb2MuYyBiL2RyaXZlcnMvcmVtb3RlcHJvYy9zdF9yZW1vdGVwcm9jLmMKaW5kZXggNmYwNTZjYS4uYWU4OTYzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZW1vdGVwcm9jL3N0X3JlbW90ZXByb2MuYworKysgYi9kcml2ZXJzL3JlbW90ZXByb2Mvc3RfcmVtb3RlcHJvYy5jCkBAIC0yNjIsNyArMjYyLDcgQEAKIAlyZXR1cm4gMDsKIAogZnJlZV9ycHJvYzoKLQlycHJvY19wdXQocnByb2MpOworCXJwcm9jX2ZyZWUocnByb2MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTI3Nyw3ICsyNzcsNyBAQAogCiAJb2ZfcmVzZXJ2ZWRfbWVtX2RldmljZV9yZWxlYXNlKCZwZGV2LT5kZXYpOwogCi0JcnByb2NfcHV0KHJwcm9jKTsKKwlycHJvY19mcmVlKHJwcm9jKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZW1vdGVwcm9jL3N0ZV9tb2RlbV9ycHJvYy5jIGIvZHJpdmVycy9yZW1vdGVwcm9jL3N0ZV9tb2RlbV9ycHJvYy5jCmluZGV4IDUzZGMxN2IuLjAzZDY5YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVtb3RlcHJvYy9zdGVfbW9kZW1fcnByb2MuYworKysgYi9kcml2ZXJzL3JlbW90ZXByb2Mvc3RlX21vZGVtX3Jwcm9jLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCXJwcm9jX2RlbChzcHJvYy0+cnByb2MpOwogCWRtYV9mcmVlX2NvaGVyZW50KHNwcm9jLT5ycHJvYy0+ZGV2LnBhcmVudCwgU1BST0NfRldfU0laRSwKIAkJCSAgc3Byb2MtPmZ3X2FkZHIsIHNwcm9jLT5md19kbWFfYWRkcik7Ci0JcnByb2NfcHV0KHNwcm9jLT5ycHJvYyk7CisJcnByb2NfZnJlZShzcHJvYy0+cnByb2MpOwogCiAJbWRldi0+ZHJ2X2RhdGEgPSBOVUxMOwogCkBAIC0zMjUsNyArMzI1LDcgQEAKIGZyZWVfcnByb2M6CiAJLyogUmVzZXQgZGV2aWNlIGRhdGEgdXBvbiBlcnJvciAqLwogCW1kZXYtPmRydl9kYXRhID0gTlVMTDsKLQlycHJvY19wdXQocnByb2MpOworCXJwcm9jX2ZyZWUocnByb2MpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVtb3RlcHJvYy93a3VwX20zX3Jwcm9jLmMgYi9kcml2ZXJzL3JlbW90ZXByb2Mvd2t1cF9tM19ycHJvYy5jCmluZGV4IDAyZDI3MWQuLjE4MTc1ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVtb3RlcHJvYy93a3VwX20zX3Jwcm9jLmMKKysrIGIvZHJpdmVycy9yZW1vdGVwcm9jL3drdXBfbTNfcnByb2MuYwpAQCAtMTY3LDYgKzE2Nyw4IEBACiAJCWdvdG8gZXJyOwogCX0KIAorCXJwcm9jLT5hdXRvX2Jvb3QgPSBmYWxzZTsKKwogCXdrdXBtMyA9IHJwcm9jLT5wcml2OwogCXdrdXBtMy0+cnByb2MgPSBycHJvYzsKIAl3a3VwbTMtPnBkZXYgPSBwZGV2OwpAQCAtMjA2LDcgKzIwOCw3IEBACiAJcmV0dXJuIDA7CiAKIGVycl9wdXRfcnByb2M6Ci0JcnByb2NfcHV0KHJwcm9jKTsKKwlycHJvY19mcmVlKHJwcm9jKTsKIGVycjoKIAlwbV9ydW50aW1lX3B1dF9ub2lkbGUoZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKQEAgLTIxOCw3ICsyMjAsNyBAQAogCXN0cnVjdCBycHJvYyAqcnByb2MgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCXJwcm9jX2RlbChycHJvYyk7Ci0JcnByb2NfcHV0KHJwcm9jKTsKKwlycHJvY19mcmVlKHJwcm9jKTsKIAlwbV9ydW50aW1lX3B1dF9zeW5jKCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ycG1zZy9LY29uZmlnIGIvZHJpdmVycy9ycG1zZy9LY29uZmlnCmluZGV4IDY5YTIxOTMuLmRlMzFjNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnBtc2cvS2NvbmZpZworKysgYi9kcml2ZXJzL3JwbXNnL0tjb25maWcKQEAgLTMsNiArMywyMCBAQAogIyBSUE1TRyBhbHdheXMgZ2V0cyBzZWxlY3RlZCBieSB3aG9ldmVyIHdhbnRzIGl0CiBjb25maWcgUlBNU0cKIAl0cmlzdGF0ZQorCitjb25maWcgUlBNU0dfUUNPTV9TTUQKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gU2hhcmVkIE1lbW9yeSBEcml2ZXIgKFNNRCkiCisJZGVwZW5kcyBvbiBRQ09NX1NNRU0KKwlkZXBlbmRzIG9uIFFDT01fU01EPW4KKwlzZWxlY3QgUlBNU0cKKwloZWxwCisJICBTYXkgeSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgUXVhbGNvbW0gU2hhcmVkIE1lbW9yeSBEcml2ZXIKKwkgIHByb3ZpZGluZyBjb21tdW5pY2F0aW9uIGNoYW5uZWxzIHRvIHJlbW90ZSBwcm9jZXNzb3JzIGluIFF1YWxjb21tCisJICBwbGF0Zm9ybXMuCisKK2NvbmZpZyBSUE1TR19WSVJUSU8KKwl0cmlzdGF0ZQorCXNlbGVjdCBSUE1TRwogCXNlbGVjdCBWSVJUSU8KIAlzZWxlY3QgVklSVFVBTElaQVRJT04KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ycG1zZy9NYWtlZmlsZSBiL2RyaXZlcnMvcnBtc2cvTWFrZWZpbGUKaW5kZXggNzYxN2ZjYi4uYWU5YzkxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ycG1zZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3JwbXNnL01ha2VmaWxlCkBAIC0xICsxLDMgQEAKLW9iai0kKENPTkZJR19SUE1TRykJKz0gdmlydGlvX3JwbXNnX2J1cy5vCitvYmotJChDT05GSUdfUlBNU0cpCQkrPSBycG1zZ19jb3JlLm8KK29iai0kKENPTkZJR19SUE1TR19RQ09NX1NNRCkJKz0gcWNvbV9zbWQubworb2JqLSQoQ09ORklHX1JQTVNHX1ZJUlRJTykJKz0gdmlydGlvX3JwbXNnX2J1cy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JwbXNnL3Fjb21fc21kLmMgYi9kcml2ZXJzL3JwbXNnL3Fjb21fc21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmZWYyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnBtc2cvcWNvbV9zbWQuYwpAQCAtMCwwICsxLDE0MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNvbnkgTW9iaWxlIENvbW11bmljYXRpb25zIEFCLgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc29jL3Fjb20vc21lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ycG1zZy5oPgorCisjaW5jbHVkZSAicnBtc2dfaW50ZXJuYWwuaCIKKworLyoKKyAqIFRoZSBRdWFsY29tbSBTaGFyZWQgTWVtb3J5IGNvbW11bmljYXRpb24gc29sdXRpb24gcHJvdmlkZXMgcG9pbnQtdG8tcG9pbnQKKyAqIGNoYW5uZWxzIGZvciBjbGllbnRzIHRvIHNlbmQgYW5kIHJlY2VpdmUgc3RyZWFtaW5nIG9yIHBhY2tldCBiYXNlZCBkYXRhLgorICoKKyAqIEVhY2ggY2hhbm5lbCBjb25zaXN0cyBvZiBhIGNvbnRyb2wgaXRlbSAoY2hhbm5lbCBpbmZvKSBhbmQgYSByaW5nIGJ1ZmZlcgorICogcGFpci4gVGhlIGNoYW5uZWwgaW5mbyBjYXJyeSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGNoYW5uZWwgc3RhdGUsIGZsb3cKKyAqIGNvbnRyb2wgYW5kIHRoZSBvZmZzZXRzIHdpdGhpbiB0aGUgcmluZyBidWZmZXIuCisgKgorICogQWxsIGFsbG9jYXRlZCBjaGFubmVscyBhcmUgbGlzdGVkIGluIGFuIGFsbG9jYXRpb24gdGFibGUsIGlkZW50aWZ5aW5nIHRoZQorICogcGFpciBvZiBpdGVtcyBieSBuYW1lLCB0eXBlIGFuZCByZW1vdGUgcHJvY2Vzc29yLgorICoKKyAqIFVwb24gY3JlYXRpbmcgYSBuZXcgY2hhbm5lbCB0aGUgcmVtb3RlIHByb2Nlc3NvciBhbGxvY2F0ZXMgY2hhbm5lbCBpbmZvIGFuZAorICogcmluZyBidWZmZXIgaXRlbXMgZnJvbSB0aGUgc21lbSBoZWFwIGFuZCBwb3B1bGF0ZSB0aGUgYWxsb2NhdGlvbiB0YWJsZS4gQW4KKyAqIGludGVycnVwdCBpcyBzZW50IHRvIHRoZSBvdGhlciBlbmQgb2YgdGhlIGNoYW5uZWwgYW5kIGEgc2NhbiBmb3IgbmV3CisgKiBjaGFubmVscyBzaG91bGQgYmUgZG9uZS4gQSBjaGFubmVsIG5ldmVyIGdvZXMgYXdheSwgaXQgd2lsbCBvbmx5IGNoYW5nZQorICogc3RhdGUuCisgKgorICogVGhlIHJlbW90ZSBwcm9jZXNzb3Igc2lnbmFscyBpdCBpbnRlbnQgZm9yIGJyaW5nIHVwIHRoZSBjb21tdW5pY2F0aW9uCisgKiBjaGFubmVsIGJ5IHNldHRpbmcgdGhlIHN0YXRlIG9mIGl0cyBlbmQgb2YgdGhlIGNoYW5uZWwgdG8gIm9wZW5pbmciIGFuZAorICogc2VuZHMgb3V0IGFuIGludGVycnVwdC4gV2UgZGV0ZWN0IHRoaXMgY2hhbmdlIGFuZCByZWdpc3RlciBhIHNtZCBkZXZpY2UgdG8KKyAqIGNvbnN1bWUgdGhlIGNoYW5uZWwuIFVwb24gZmluZGluZyBhIGNvbnN1bWVyIHdlIGZpbmlzaCB0aGUgaGFuZHNoYWtlIGFuZCB0aGUKKyAqIGNoYW5uZWwgaXMgdXAuCisgKgorICogVXBvbiBjbG9zaW5nIGEgY2hhbm5lbCwgdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2lsbCB1cGRhdGUgdGhlIHN0YXRlIG9mIGl0cworICogZW5kIG9mIHRoZSBjaGFubmVsIGFuZCBzaWduYWwgdXMsIHdlIHdpbGwgdGhlbiB1bnJlZ2lzdGVyIGFueSBhdHRhY2hlZAorICogZGV2aWNlIGFuZCBjbG9zZSBvdXIgZW5kIG9mIHRoZSBjaGFubmVsLgorICoKKyAqIERldmljZXMgYXR0YWNoZWQgdG8gYSBjaGFubmVsIGNhbiB1c2UgdGhlIHFjb21fc21kX3NlbmQgZnVuY3Rpb24gdG8gcHVzaAorICogZGF0YSB0byB0aGUgY2hhbm5lbCwgdGhpcyBpcyBkb25lIGJ5IGNvcHlpbmcgdGhlIGRhdGEgaW50byB0aGUgdHggcmluZworICogYnVmZmVyLCB1cGRhdGluZyB0aGUgcG9pbnRlcnMgaW4gdGhlIGNoYW5uZWwgaW5mbyBhbmQgc2lnbmFsaW5nIHRoZSByZW1vdGUKKyAqIHByb2Nlc3Nvci4KKyAqCisgKiBUaGUgcmVtb3RlIHByb2Nlc3NvciBkb2VzIHRoZSBlcXVpdmFsZW50IHdoZW4gaXQgdHJhbnNmZXIgZGF0YSBhbmQgdXBvbgorICogcmVjZWl2aW5nIHRoZSBpbnRlcnJ1cHQgd2UgY2hlY2sgdGhlIGNoYW5uZWwgaW5mbyBmb3IgbmV3IGRhdGEgYW5kIGRlbGl2ZXJzCisgKiB0aGlzIHRvIHRoZSBhdHRhY2hlZCBkZXZpY2UuIElmIHRoZSBkZXZpY2UgaXMgbm90IHJlYWR5IHRvIHJlY2VpdmUgdGhlIGRhdGEKKyAqIHdlIGxlYXZlIGl0IGluIHRoZSByaW5nIGJ1ZmZlciBmb3Igbm93LgorICovCisKK3N0cnVjdCBzbWRfY2hhbm5lbF9pbmZvOworc3RydWN0IHNtZF9jaGFubmVsX2luZm9fcGFpcjsKK3N0cnVjdCBzbWRfY2hhbm5lbF9pbmZvX3dvcmQ7CitzdHJ1Y3Qgc21kX2NoYW5uZWxfaW5mb193b3JkX3BhaXI7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnBtc2dfZW5kcG9pbnRfb3BzIHFjb21fc21kX2VuZHBvaW50X29wczsKKworI2RlZmluZSBTTURfQUxMT0NfVEJMX0NPVU5UCTIKKyNkZWZpbmUgU01EX0FMTE9DX1RCTF9TSVpFCTY0CisKKy8qCisgKiBUaGlzIGxpc3RzIHRoZSB2YXJpb3VzIHNtZW0gaGVhcCBpdGVtcyByZWxldmFudCBmb3IgdGhlIGFsbG9jYXRpb24gdGFibGUgYW5kCisgKiBzbWQgY2hhbm5lbCBlbnRyaWVzLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBhbGxvY190YmxfaWQ7CisJdW5zaWduZWQgaW5mb19iYXNlX2lkOworCXVuc2lnbmVkIGZpZm9fYmFzZV9pZDsKK30gc21lbV9pdGVtc1tTTURfQUxMT0NfVEJMX0NPVU5UXSA9IHsKKwl7CisJCS5hbGxvY190YmxfaWQgPSAxMywKKwkJLmluZm9fYmFzZV9pZCA9IDE0LAorCQkuZmlmb19iYXNlX2lkID0gMzM4CisJfSwKKwl7CisJCS5hbGxvY190YmxfaWQgPSAyNjYsCisJCS5pbmZvX2Jhc2VfaWQgPSAxMzgsCisJCS5maWZvX2Jhc2VfaWQgPSAyMDIsCisJfSwKK307CisKKy8qKgorICogc3RydWN0IHFjb21fc21kX2VkZ2UgLSByZXByZXNlbnRpbmcgYSByZW1vdGUgcHJvY2Vzc29yCisgKiBAb2Zfbm9kZToJCW9mX25vZGUgaGFuZGxlIGZvciBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoaXMgZWRnZQorICogQGVkZ2VfaWQ6CQlpZGVudGlmaWVyIG9mIHRoaXMgZWRnZQorICogQHJlbW90ZV9waWQ6CQlpZGVudGlmaWVyIG9mIHJlbW90ZSBwcm9jZXNzb3IKKyAqIEBpcnE6CQlpbnRlcnJ1cHQgZm9yIHNpZ25hbHMgb24gdGhpcyBlZGdlCisgKiBAaXBjX3JlZ21hcDoJCXJlZ21hcCBoYW5kbGUgaG9sZGluZyB0aGUgb3V0Z29pbmcgaXBjIHJlZ2lzdGVyCisgKiBAaXBjX29mZnNldDoJCW9mZnNldCB3aXRoaW4gQGlwY19yZWdtYXAgb2YgdGhlIHJlZ2lzdGVyIGZvciBpcGMKKyAqIEBpcGNfYml0OgkJYml0IGluIHRoZSByZWdpc3RlciBhdCBAaXBjX29mZnNldCBvZiBAaXBjX3JlZ21hcAorICogQGNoYW5uZWxzOgkJbGlzdCBvZiBhbGwgY2hhbm5lbHMgZGV0ZWN0ZWQgb24gdGhpcyBlZGdlCisgKiBAY2hhbm5lbHNfbG9jazoJZ3VhcmQgZm9yIG1vZGlmaWNhdGlvbnMgb2YgQGNoYW5uZWxzCisgKiBAYWxsb2NhdGVkOgkJYXJyYXkgb2YgYml0bWFwcyByZXByZXNlbnRpbmcgYWxyZWFkeSBhbGxvY2F0ZWQgY2hhbm5lbHMKKyAqIEBzbWVtX2F2YWlsYWJsZToJbGFzdCBhdmFpbGFibGUgYW1vdW50IG9mIHNtZW0gdHJpZ2dlcmluZyBhIGNoYW5uZWwgc2NhbgorICogQHNjYW5fd29yazoJCXdvcmsgaXRlbSBmb3IgZGlzY292ZXJpbmcgbmV3IGNoYW5uZWxzCisgKiBAc3RhdGVfd29yazoJCXdvcmsgaXRlbSBmb3IgZWRnZSBzdGF0ZSBjaGFuZ2VzCisgKi8KK3N0cnVjdCBxY29tX3NtZF9lZGdlIHsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKKwl1bnNpZ25lZCBlZGdlX2lkOworCXVuc2lnbmVkIHJlbW90ZV9waWQ7CisKKwlpbnQgaXJxOworCisJc3RydWN0IHJlZ21hcCAqaXBjX3JlZ21hcDsKKwlpbnQgaXBjX29mZnNldDsKKwlpbnQgaXBjX2JpdDsKKworCXN0cnVjdCBsaXN0X2hlYWQgY2hhbm5lbHM7CisJc3BpbmxvY2tfdCBjaGFubmVsc19sb2NrOworCisJREVDTEFSRV9CSVRNQVAoYWxsb2NhdGVkW1NNRF9BTExPQ19UQkxfQ09VTlRdLCBTTURfQUxMT0NfVEJMX1NJWkUpOworCisJdW5zaWduZWQgc21lbV9hdmFpbGFibGU7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCBuZXdfY2hhbm5lbF9ldmVudDsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCBzY2FuX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHN0YXRlX3dvcms7Cit9OworCisvKgorICogU01EIGNoYW5uZWwgc3RhdGVzLgorICovCitlbnVtIHNtZF9jaGFubmVsX3N0YXRlIHsKKwlTTURfQ0hBTk5FTF9DTE9TRUQsCisJU01EX0NIQU5ORUxfT1BFTklORywKKwlTTURfQ0hBTk5FTF9PUEVORUQsCisJU01EX0NIQU5ORUxfRkxVU0hJTkcsCisJU01EX0NIQU5ORUxfQ0xPU0lORywKKwlTTURfQ0hBTk5FTF9SRVNFVCwKKwlTTURfQ0hBTk5FTF9SRVNFVF9PUEVOSU5HCit9OworCitzdHJ1Y3QgcWNvbV9zbWRfZGV2aWNlIHsKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlIHJwZGV2OworCisJc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2U7Cit9OworCitzdHJ1Y3QgcWNvbV9zbWRfZW5kcG9pbnQgeworCXN0cnVjdCBycG1zZ19lbmRwb2ludCBlcHQ7CisKKwlzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqcXNjaDsKK307CisKKyNkZWZpbmUgdG9fc21kX2RldmljZShfcnBkZXYpCWNvbnRhaW5lcl9vZihfcnBkZXYsIHN0cnVjdCBxY29tX3NtZF9kZXZpY2UsIHJwZGV2KQorI2RlZmluZSB0b19zbWRfZWRnZShkKQkJY29udGFpbmVyX29mKGQsIHN0cnVjdCBxY29tX3NtZF9lZGdlLCBkZXYpCisjZGVmaW5lIHRvX3NtZF9lbmRwb2ludChlcHQpCWNvbnRhaW5lcl9vZihlcHQsIHN0cnVjdCBxY29tX3NtZF9lbmRwb2ludCwgZXB0KQorCisvKioKKyAqIHN0cnVjdCBxY29tX3NtZF9jaGFubmVsIC0gc21kIGNoYW5uZWwgc3RydWN0CisgKiBAZWRnZToJCXFjb21fc21kX2VkZ2UgdGhpcyBjaGFubmVsIGlzIGxpdmluZyBvbgorICogQHFzZGV2OgkJcmVmZXJlbmNlIHRvIGEgYXNzb2NpYXRlZCBzbWQgY2xpZW50IGRldmljZQorICogQG5hbWU6CQluYW1lIG9mIHRoZSBjaGFubmVsCisgKiBAc3RhdGU6CQlsb2NhbCBzdGF0ZSBvZiB0aGUgY2hhbm5lbAorICogQHJlbW90ZV9zdGF0ZToJcmVtb3RlIHN0YXRlIG9mIHRoZSBjaGFubmVsCisgKiBAaW5mbzoJCWJ5dGUgYWxpZ25lZCBvdXRnb2luZy9pbmNvbWluZyBjaGFubmVsIGluZm8KKyAqIEBpbmZvX3dvcmQ6CQl3b3JkIGFsaWduZWQgb3V0Z29pbmcvaW5jb21pbmcgY2hhbm5lbCBpbmZvCisgKiBAdHhfbG9jazoJCWxvY2sgdG8gbWFrZSB3cml0ZXMgdG8gdGhlIGNoYW5uZWwgbXV0dWFsbHkgZXhjbHVzaXZlCisgKiBAZmJsb2NrcmVhZF9ldmVudDoJd2FrZXVwIGV2ZW50IHRpZWQgdG8gdHggZkJMT0NLUkVBRElOVFIKKyAqIEB0eF9maWZvOgkJcG9pbnRlciB0byB0aGUgb3V0Z29pbmcgcmluZyBidWZmZXIKKyAqIEByeF9maWZvOgkJcG9pbnRlciB0byB0aGUgaW5jb21pbmcgcmluZyBidWZmZXIKKyAqIEBmaWZvX3NpemU6CQlzaXplIG9mIGVhY2ggcmluZyBidWZmZXIKKyAqIEBib3VuY2VfYnVmZmVyOglib3VuY2UgYnVmZmVyIGZvciByZWFkaW5nIHdyYXBwZWQgcGFja2V0cworICogQGNiOgkJCWNhbGxiYWNrIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY2hhbm5lbAorICogQHJlY3ZfbG9jazoJCWd1YXJkIGZvciByeCBpbmZvIG1vZGlmaWNhdGlvbnMgYW5kIGNiIHBvaW50ZXIKKyAqIEBwa3Rfc2l6ZToJCXNpemUgb2YgdGhlIGN1cnJlbnRseSBoYW5kbGVkIHBhY2tldAorICogQGxpc3Q6CQlsaXRlIGVudHJ5IGZvciBAY2hhbm5lbHMgaW4gcWNvbV9zbWRfZWRnZQorICovCitzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCB7CisJc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2U7CisKKwlzdHJ1Y3QgcWNvbV9zbWRfZW5kcG9pbnQgKnFzZXB0OworCWJvb2wgcmVnaXN0ZXJlZDsKKworCWNoYXIgKm5hbWU7CisJZW51bSBzbWRfY2hhbm5lbF9zdGF0ZSBzdGF0ZTsKKwllbnVtIHNtZF9jaGFubmVsX3N0YXRlIHJlbW90ZV9zdGF0ZTsKKworCXN0cnVjdCBzbWRfY2hhbm5lbF9pbmZvX3BhaXIgKmluZm87CisJc3RydWN0IHNtZF9jaGFubmVsX2luZm9fd29yZF9wYWlyICppbmZvX3dvcmQ7CisKKwlzdHJ1Y3QgbXV0ZXggdHhfbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBmYmxvY2tyZWFkX2V2ZW50OworCisJdm9pZCAqdHhfZmlmbzsKKwl2b2lkICpyeF9maWZvOworCWludCBmaWZvX3NpemU7CisKKwl2b2lkICpib3VuY2VfYnVmZmVyOworCisJc3BpbmxvY2tfdCByZWN2X2xvY2s7CisKKwlpbnQgcGt0X3NpemU7CisKKwl2b2lkICpkcnZkYXRhOworCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworLyoKKyAqIEZvcm1hdCBvZiB0aGUgc21kX2luZm8gc21lbSBpdGVtcywgZm9yIGJ5dGUgYWxpZ25lZCBjaGFubmVscy4KKyAqLworc3RydWN0IHNtZF9jaGFubmVsX2luZm8geworCV9fbGUzMiBzdGF0ZTsKKwl1OCAgZkRTUjsKKwl1OCAgZkNUUzsKKwl1OCAgZkNEOworCXU4ICBmUkk7CisJdTggIGZIRUFEOworCXU4ICBmVEFJTDsKKwl1OCAgZlNUQVRFOworCXU4ICBmQkxPQ0tSRUFESU5UUjsKKwlfX2xlMzIgdGFpbDsKKwlfX2xlMzIgaGVhZDsKK307CisKK3N0cnVjdCBzbWRfY2hhbm5lbF9pbmZvX3BhaXIgeworCXN0cnVjdCBzbWRfY2hhbm5lbF9pbmZvIHR4OworCXN0cnVjdCBzbWRfY2hhbm5lbF9pbmZvIHJ4OworfTsKKworLyoKKyAqIEZvcm1hdCBvZiB0aGUgc21kX2luZm8gc21lbSBpdGVtcywgZm9yIHdvcmQgYWxpZ25lZCBjaGFubmVscy4KKyAqLworc3RydWN0IHNtZF9jaGFubmVsX2luZm9fd29yZCB7CisJX19sZTMyIHN0YXRlOworCV9fbGUzMiBmRFNSOworCV9fbGUzMiBmQ1RTOworCV9fbGUzMiBmQ0Q7CisJX19sZTMyIGZSSTsKKwlfX2xlMzIgZkhFQUQ7CisJX19sZTMyIGZUQUlMOworCV9fbGUzMiBmU1RBVEU7CisJX19sZTMyIGZCTE9DS1JFQURJTlRSOworCV9fbGUzMiB0YWlsOworCV9fbGUzMiBoZWFkOworfTsKKworc3RydWN0IHNtZF9jaGFubmVsX2luZm9fd29yZF9wYWlyIHsKKwlzdHJ1Y3Qgc21kX2NoYW5uZWxfaW5mb193b3JkIHR4OworCXN0cnVjdCBzbWRfY2hhbm5lbF9pbmZvX3dvcmQgcng7Cit9OworCisjZGVmaW5lIEdFVF9SWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgcGFyYW0pCQkJCSAgICAgXAorCSh7CQkJCQkJCQkgICAgIFwKKwkJQlVJTERfQlVHX09OKHNpemVvZihjaGFubmVsLT5pbmZvLT5yeC5wYXJhbSkgIT0gc2l6ZW9mKHU4KSk7IFwKKwkJY2hhbm5lbC0+aW5mb193b3JkID8JCQkJCSAgICAgXAorCQkJbGUzMl90b19jcHUoY2hhbm5lbC0+aW5mb193b3JkLT5yeC5wYXJhbSkgOgkgICAgIFwKKwkJCWNoYW5uZWwtPmluZm8tPnJ4LnBhcmFtOwkJCSAgICAgXAorCX0pCisKKyNkZWZpbmUgR0VUX1JYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBwYXJhbSkJCQkJICAgICAgXAorCSh7CQkJCQkJCQkgICAgICBcCisJCUJVSUxEX0JVR19PTihzaXplb2YoY2hhbm5lbC0+aW5mby0+cngucGFyYW0pICE9IHNpemVvZih1MzIpKTsgXAorCQlsZTMyX3RvX2NwdShjaGFubmVsLT5pbmZvX3dvcmQgPwkJCSAgICAgIFwKKwkJCWNoYW5uZWwtPmluZm9fd29yZC0+cngucGFyYW0gOgkJCSAgICAgIFwKKwkJCWNoYW5uZWwtPmluZm8tPnJ4LnBhcmFtKTsJCQkgICAgICBcCisJfSkKKworI2RlZmluZSBTRVRfUlhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIHBhcmFtLCB2YWx1ZSkJCQkgICAgIFwKKwkoewkJCQkJCQkJICAgICBcCisJCUJVSUxEX0JVR19PTihzaXplb2YoY2hhbm5lbC0+aW5mby0+cngucGFyYW0pICE9IHNpemVvZih1OCkpOyBcCisJCWlmIChjaGFubmVsLT5pbmZvX3dvcmQpCQkJCQkgICAgIFwKKwkJCWNoYW5uZWwtPmluZm9fd29yZC0+cngucGFyYW0gPSBjcHVfdG9fbGUzMih2YWx1ZSk7ICAgXAorCQllbHNlCQkJCQkJCSAgICAgXAorCQkJY2hhbm5lbC0+aW5mby0+cngucGFyYW0gPSB2YWx1ZTsJCSAgICAgXAorCX0pCisKKyNkZWZpbmUgU0VUX1JYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBwYXJhbSwgdmFsdWUpCQkJICAgICAgXAorCSh7CQkJCQkJCQkgICAgICBcCisJCUJVSUxEX0JVR19PTihzaXplb2YoY2hhbm5lbC0+aW5mby0+cngucGFyYW0pICE9IHNpemVvZih1MzIpKTsgXAorCQlpZiAoY2hhbm5lbC0+aW5mb193b3JkKQkJCQkJICAgICAgXAorCQkJY2hhbm5lbC0+aW5mb193b3JkLT5yeC5wYXJhbSA9IGNwdV90b19sZTMyKHZhbHVlKTsgICAgXAorCQllbHNlCQkJCQkJCSAgICAgIFwKKwkJCWNoYW5uZWwtPmluZm8tPnJ4LnBhcmFtID0gY3B1X3RvX2xlMzIodmFsdWUpOwkgICAgICBcCisJfSkKKworI2RlZmluZSBHRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIHBhcmFtKQkJCQkgICAgIFwKKwkoewkJCQkJCQkJICAgICBcCisJCUJVSUxEX0JVR19PTihzaXplb2YoY2hhbm5lbC0+aW5mby0+dHgucGFyYW0pICE9IHNpemVvZih1OCkpOyBcCisJCWNoYW5uZWwtPmluZm9fd29yZCA/CQkJCQkgICAgIFwKKwkJCWxlMzJfdG9fY3B1KGNoYW5uZWwtPmluZm9fd29yZC0+dHgucGFyYW0pIDogICAgICAgICAgXAorCQkJY2hhbm5lbC0+aW5mby0+dHgucGFyYW07CQkJICAgICBcCisJfSkKKworI2RlZmluZSBHRVRfVFhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHBhcmFtKQkJCQkgICAgICBcCisJKHsJCQkJCQkJCSAgICAgIFwKKwkJQlVJTERfQlVHX09OKHNpemVvZihjaGFubmVsLT5pbmZvLT50eC5wYXJhbSkgIT0gc2l6ZW9mKHUzMikpOyBcCisJCWxlMzJfdG9fY3B1KGNoYW5uZWwtPmluZm9fd29yZCA/CQkJICAgICAgXAorCQkJY2hhbm5lbC0+aW5mb193b3JkLT50eC5wYXJhbSA6CQkJICAgICAgXAorCQkJY2hhbm5lbC0+aW5mby0+dHgucGFyYW0pOwkJCSAgICAgIFwKKwl9KQorCisjZGVmaW5lIFNFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgcGFyYW0sIHZhbHVlKQkJCSAgICAgXAorCSh7CQkJCQkJCQkgICAgIFwKKwkJQlVJTERfQlVHX09OKHNpemVvZihjaGFubmVsLT5pbmZvLT50eC5wYXJhbSkgIT0gc2l6ZW9mKHU4KSk7IFwKKwkJaWYgKGNoYW5uZWwtPmluZm9fd29yZCkJCQkJCSAgICAgXAorCQkJY2hhbm5lbC0+aW5mb193b3JkLT50eC5wYXJhbSA9IGNwdV90b19sZTMyKHZhbHVlKTsgICBcCisJCWVsc2UJCQkJCQkJICAgICBcCisJCQljaGFubmVsLT5pbmZvLT50eC5wYXJhbSA9IHZhbHVlOwkJICAgICBcCisJfSkKKworI2RlZmluZSBTRVRfVFhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHBhcmFtLCB2YWx1ZSkJCQkgICAgICBcCisJKHsJCQkJCQkJCSAgICAgIFwKKwkJQlVJTERfQlVHX09OKHNpemVvZihjaGFubmVsLT5pbmZvLT50eC5wYXJhbSkgIT0gc2l6ZW9mKHUzMikpOyBcCisJCWlmIChjaGFubmVsLT5pbmZvX3dvcmQpCQkJCQkgICAgICBcCisJCQljaGFubmVsLT5pbmZvX3dvcmQtPnR4LnBhcmFtID0gY3B1X3RvX2xlMzIodmFsdWUpOyAgIFwKKwkJZWxzZQkJCQkJCQkgICAgICBcCisJCQljaGFubmVsLT5pbmZvLT50eC5wYXJhbSA9IGNwdV90b19sZTMyKHZhbHVlKTsJICAgICAgXAorCX0pCisKKy8qKgorICogc3RydWN0IHFjb21fc21kX2FsbG9jX2VudHJ5IC0gY2hhbm5lbCBhbGxvY2F0aW9uIGVudHJ5CisgKiBAbmFtZToJY2hhbm5lbCBuYW1lCisgKiBAY2lkOgljaGFubmVsIGluZGV4CisgKiBAZmxhZ3M6CWNoYW5uZWwgZmxhZ3MgYW5kIGVkZ2UgaWQKKyAqIEByZWZfY291bnQ6CXJlZmVyZW5jZSBjb3VudCBvZiB0aGUgY2hhbm5lbAorICovCitzdHJ1Y3QgcWNvbV9zbWRfYWxsb2NfZW50cnkgeworCXU4IG5hbWVbMjBdOworCV9fbGUzMiBjaWQ7CisJX19sZTMyIGZsYWdzOworCV9fbGUzMiByZWZfY291bnQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFNNRF9DSEFOTkVMX0ZMQUdTX0VER0VfTUFTSwkweGZmCisjZGVmaW5lIFNNRF9DSEFOTkVMX0ZMQUdTX1NUUkVBTQlCSVQoOCkKKyNkZWZpbmUgU01EX0NIQU5ORUxfRkxBR1NfUEFDS0VUCUJJVCg5KQorCisvKgorICogRWFjaCBzbWQgcGFja2V0IGNvbnRhaW5zIGEgMjAgYnl0ZSBoZWFkZXIsIHdpdGggdGhlIGZpcnN0IDQgYmVpbmcgdGhlIGxlbmd0aAorICogb2YgdGhlIHBhY2tldC4KKyAqLworI2RlZmluZSBTTURfUEFDS0VUX0hFQURFUl9MRU4JMjAKKworLyoKKyAqIFNpZ25hbCB0aGUgcmVtb3RlIHByb2Nlc3NvciBhc3NvY2lhdGVkIHdpdGggJ2NoYW5uZWwnLgorICovCitzdGF0aWMgdm9pZCBxY29tX3NtZF9zaWduYWxfY2hhbm5lbChzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcWNvbV9zbWRfZWRnZSAqZWRnZSA9IGNoYW5uZWwtPmVkZ2U7CisKKwlyZWdtYXBfd3JpdGUoZWRnZS0+aXBjX3JlZ21hcCwgZWRnZS0+aXBjX29mZnNldCwgQklUKGVkZ2UtPmlwY19iaXQpKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIHR4IGNoYW5uZWwgaW5mbworICovCitzdGF0aWMgdm9pZCBxY29tX3NtZF9jaGFubmVsX3Jlc2V0KHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsKQoreworCVNFVF9UWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgc3RhdGUsIFNNRF9DSEFOTkVMX0NMT1NFRCk7CisJU0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmRFNSLCAwKTsKKwlTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZDVFMsIDApOworCVNFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZkNELCAwKTsKKwlTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZSSSwgMCk7CisJU0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmSEVBRCwgMCk7CisJU0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmVEFJTCwgMCk7CisJU0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmU1RBVEUsIDEpOworCVNFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZkJMT0NLUkVBRElOVFIsIDEpOworCVNFVF9UWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgaGVhZCwgMCk7CisJU0VUX1JYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCB0YWlsLCAwKTsKKworCXFjb21fc21kX3NpZ25hbF9jaGFubmVsKGNoYW5uZWwpOworCisJY2hhbm5lbC0+c3RhdGUgPSBTTURfQ0hBTk5FTF9DTE9TRUQ7CisJY2hhbm5lbC0+cGt0X3NpemUgPSAwOworfQorCisvKgorICogU2V0IHRoZSBjYWxsYmFjayBmb3IgYSBjaGFubmVsLCB3aXRoIGFwcHJvcHJpYXRlIGxvY2tpbmcKKyAqLworc3RhdGljIHZvaWQgcWNvbV9zbWRfY2hhbm5lbF9zZXRfY2FsbGJhY2soc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJCSAgcnBtc2dfcnhfY2JfdCBjYikKK3sKKwlzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCA9ICZjaGFubmVsLT5xc2VwdC0+ZXB0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbm5lbC0+cmVjdl9sb2NrLCBmbGFncyk7CisJZXB0LT5jYiA9IGNiOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW5uZWwtPnJlY3ZfbG9jaywgZmxhZ3MpOworfTsKKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlIGluIHRoZSByeCBmaWZvCisgKi8KK3N0YXRpYyBzaXplX3QgcWNvbV9zbWRfY2hhbm5lbF9nZXRfcnhfYXZhaWwoc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJdW5zaWduZWQgaGVhZDsKKwl1bnNpZ25lZCB0YWlsOworCisJaGVhZCA9IEdFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgaGVhZCk7CisJdGFpbCA9IEdFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgdGFpbCk7CisKKwlyZXR1cm4gKGhlYWQgLSB0YWlsKSAmIChjaGFubmVsLT5maWZvX3NpemUgLSAxKTsKK30KKworLyoKKyAqIFNldCB0eCBjaGFubmVsIHN0YXRlIGFuZCBpbmZvcm0gdGhlIHJlbW90ZSBwcm9jZXNzb3IKKyAqLworc3RhdGljIHZvaWQgcWNvbV9zbWRfY2hhbm5lbF9zZXRfc3RhdGUoc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJICAgICAgIGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcWNvbV9zbWRfZWRnZSAqZWRnZSA9IGNoYW5uZWwtPmVkZ2U7CisJYm9vbCBpc19vcGVuID0gc3RhdGUgPT0gU01EX0NIQU5ORUxfT1BFTkVEOworCisJaWYgKGNoYW5uZWwtPnN0YXRlID09IHN0YXRlKQorCQlyZXR1cm47CisKKwlkZXZfZGJnKCZlZGdlLT5kZXYsICJzZXRfc3RhdGUoJXMsICVkKVxuIiwgY2hhbm5lbC0+bmFtZSwgc3RhdGUpOworCisJU0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmRFNSLCBpc19vcGVuKTsKKwlTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZDVFMsIGlzX29wZW4pOworCVNFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZkNELCBpc19vcGVuKTsKKworCVNFVF9UWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgc3RhdGUsIHN0YXRlKTsKKwlTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZTVEFURSwgMSk7CisKKwljaGFubmVsLT5zdGF0ZSA9IHN0YXRlOworCXFjb21fc21kX3NpZ25hbF9jaGFubmVsKGNoYW5uZWwpOworfQorCisvKgorICogQ29weSBjb3VudCBieXRlcyBvZiBkYXRhIHVzaW5nIDMyYml0IGFjY2Vzc2VzLCBpZiB0aGF0J3MgcmVxdWlyZWQuCisgKi8KK3N0YXRpYyB2b2lkIHNtZF9jb3B5X3RvX2ZpZm8odm9pZCBfX2lvbWVtICpkc3QsCisJCQkgICAgIGNvbnN0IHZvaWQgKnNyYywKKwkJCSAgICAgc2l6ZV90IGNvdW50LAorCQkJICAgICBib29sIHdvcmRfYWxpZ25lZCkKK3sKKwlpZiAod29yZF9hbGlnbmVkKSB7CisJCV9faW93cml0ZTMyX2NvcHkoZHN0LCBzcmMsIGNvdW50IC8gc2l6ZW9mKHUzMikpOworCX0gZWxzZSB7CisJCW1lbWNweV90b2lvKGRzdCwgc3JjLCBjb3VudCk7CisJfQorfQorCisvKgorICogQ29weSBjb3VudCBieXRlcyBvZiBkYXRhIHVzaW5nIDMyYml0IGFjY2Vzc2VzLCBpZiB0aGF0IGlzIHJlcXVpcmVkLgorICovCitzdGF0aWMgdm9pZCBzbWRfY29weV9mcm9tX2ZpZm8odm9pZCAqZHN0LAorCQkJICAgICAgIGNvbnN0IHZvaWQgX19pb21lbSAqc3JjLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwKKwkJCSAgICAgICBib29sIHdvcmRfYWxpZ25lZCkKK3sKKwlpZiAod29yZF9hbGlnbmVkKSB7CisJCV9faW9yZWFkMzJfY29weShkc3QsIHNyYywgY291bnQgLyBzaXplb2YodTMyKSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5X2Zyb21pbyhkc3QsIHNyYywgY291bnQpOworCX0KK30KKworLyoKKyAqIFJlYWQgY291bnQgYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSByeCBmaWZvIGludG8gYnVmLCBidXQgZG9uJ3QgYWR2YW5jZSB0aGUKKyAqIHRhaWwuCisgKi8KK3N0YXRpYyBzaXplX3QgcWNvbV9zbWRfY2hhbm5lbF9wZWVrKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsLAorCQkJCSAgICB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlib29sIHdvcmRfYWxpZ25lZDsKKwl1bnNpZ25lZCB0YWlsOworCXNpemVfdCBsZW47CisKKwl3b3JkX2FsaWduZWQgPSBjaGFubmVsLT5pbmZvX3dvcmQ7CisJdGFpbCA9IEdFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgdGFpbCk7CisKKwlsZW4gPSBtaW5fdChzaXplX3QsIGNvdW50LCBjaGFubmVsLT5maWZvX3NpemUgLSB0YWlsKTsKKwlpZiAobGVuKSB7CisJCXNtZF9jb3B5X2Zyb21fZmlmbyhidWYsCisJCQkJICAgY2hhbm5lbC0+cnhfZmlmbyArIHRhaWwsCisJCQkJICAgbGVuLAorCQkJCSAgIHdvcmRfYWxpZ25lZCk7CisJfQorCisJaWYgKGxlbiAhPSBjb3VudCkgeworCQlzbWRfY29weV9mcm9tX2ZpZm8oYnVmICsgbGVuLAorCQkJCSAgIGNoYW5uZWwtPnJ4X2ZpZm8sCisJCQkJICAgY291bnQgLSBsZW4sCisJCQkJICAgd29yZF9hbGlnbmVkKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBBZHZhbmNlIHRoZSByeCB0YWlsIGJ5IGNvdW50IGJ5dGVzLgorICovCitzdGF0aWMgdm9pZCBxY29tX3NtZF9jaGFubmVsX2FkdmFuY2Uoc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJICAgICBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgdGFpbDsKKworCXRhaWwgPSBHRVRfUlhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHRhaWwpOworCXRhaWwgKz0gY291bnQ7CisJdGFpbCAmPSAoY2hhbm5lbC0+Zmlmb19zaXplIC0gMSk7CisJU0VUX1JYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCB0YWlsLCB0YWlsKTsKK30KKworLyoKKyAqIFJlYWQgb3V0IGEgc2luZ2xlIHBhY2tldCBmcm9tIHRoZSByeCBmaWZvIGFuZCBkZWxpdmVyIGl0IHRvIHRoZSBkZXZpY2UKKyAqLworc3RhdGljIGludCBxY29tX3NtZF9jaGFubmVsX3JlY3Zfc2luZ2xlKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0ID0gJmNoYW5uZWwtPnFzZXB0LT5lcHQ7CisJdW5zaWduZWQgdGFpbDsKKwlzaXplX3QgbGVuOworCXZvaWQgKnB0cjsKKwlpbnQgcmV0OworCisJdGFpbCA9IEdFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgdGFpbCk7CisKKwkvKiBVc2UgYm91bmNlIGJ1ZmZlciBpZiB0aGUgZGF0YSB3cmFwcyAqLworCWlmICh0YWlsICsgY2hhbm5lbC0+cGt0X3NpemUgPj0gY2hhbm5lbC0+Zmlmb19zaXplKSB7CisJCXB0ciA9IGNoYW5uZWwtPmJvdW5jZV9idWZmZXI7CisJCWxlbiA9IHFjb21fc21kX2NoYW5uZWxfcGVlayhjaGFubmVsLCBwdHIsIGNoYW5uZWwtPnBrdF9zaXplKTsKKwl9IGVsc2UgeworCQlwdHIgPSBjaGFubmVsLT5yeF9maWZvICsgdGFpbDsKKwkJbGVuID0gY2hhbm5lbC0+cGt0X3NpemU7CisJfQorCisJcmV0ID0gZXB0LT5jYihlcHQtPnJwZGV2LCBwdHIsIGxlbiwgZXB0LT5wcml2LCBSUE1TR19BRERSX0FOWSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBPbmx5IGZvcndhcmQgdGhlIHRhaWwgaWYgdGhlIGNsaWVudCBjb25zdW1lZCB0aGUgZGF0YSAqLworCXFjb21fc21kX2NoYW5uZWxfYWR2YW5jZShjaGFubmVsLCBsZW4pOworCisJY2hhbm5lbC0+cGt0X3NpemUgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXIgY2hhbm5lbCBpbnRlcnJ1cHQgaGFuZGxpbmcKKyAqLworc3RhdGljIGJvb2wgcWNvbV9zbWRfY2hhbm5lbF9pbnRyKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsKQoreworCWJvb2wgbmVlZF9zdGF0ZV9zY2FuID0gZmFsc2U7CisJaW50IHJlbW90ZV9zdGF0ZTsKKwlfX2xlMzIgcGt0bGVuOworCWludCBhdmFpbDsKKwlpbnQgcmV0OworCisJLyogSGFuZGxlIHN0YXRlIGNoYW5nZXMgKi8KKwlyZW1vdGVfc3RhdGUgPSBHRVRfUlhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHN0YXRlKTsKKwlpZiAocmVtb3RlX3N0YXRlICE9IGNoYW5uZWwtPnJlbW90ZV9zdGF0ZSkgeworCQljaGFubmVsLT5yZW1vdGVfc3RhdGUgPSByZW1vdGVfc3RhdGU7CisJCW5lZWRfc3RhdGVfc2NhbiA9IHRydWU7CisJfQorCS8qIEluZGljYXRlIHRoYXQgd2UgaGF2ZSBzZWVuIGFueSBzdGF0ZSBjaGFuZ2UgKi8KKwlTRVRfUlhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZTVEFURSwgMCk7CisKKwkvKiBTaWduYWwgd2FpdGluZyBxY29tX3NtZF9zZW5kKCkgYWJvdXQgdGhlIGludGVycnVwdCAqLworCWlmICghR0VUX1RYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmQkxPQ0tSRUFESU5UUikpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2hhbm5lbC0+ZmJsb2NrcmVhZF9ldmVudCk7CisKKwkvKiBEb24ndCBjb25zdW1lIGFueSBkYXRhIHVudGlsIHdlJ3ZlIG9wZW5lZCB0aGUgY2hhbm5lbCAqLworCWlmIChjaGFubmVsLT5zdGF0ZSAhPSBTTURfQ0hBTk5FTF9PUEVORUQpCisJCWdvdG8gb3V0OworCisJLyogSW5kaWNhdGUgdGhhdCB3ZSd2ZSBzZWVuIHRoZSBuZXcgZGF0YSAqLworCVNFVF9SWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZkhFQUQsIDApOworCisJLyogQ29uc3VtZSBkYXRhICovCisJZm9yICg7OykgeworCQlhdmFpbCA9IHFjb21fc21kX2NoYW5uZWxfZ2V0X3J4X2F2YWlsKGNoYW5uZWwpOworCisJCWlmICghY2hhbm5lbC0+cGt0X3NpemUgJiYgYXZhaWwgPj0gU01EX1BBQ0tFVF9IRUFERVJfTEVOKSB7CisJCQlxY29tX3NtZF9jaGFubmVsX3BlZWsoY2hhbm5lbCwgJnBrdGxlbiwgc2l6ZW9mKHBrdGxlbikpOworCQkJcWNvbV9zbWRfY2hhbm5lbF9hZHZhbmNlKGNoYW5uZWwsIFNNRF9QQUNLRVRfSEVBREVSX0xFTik7CisJCQljaGFubmVsLT5wa3Rfc2l6ZSA9IGxlMzJfdG9fY3B1KHBrdGxlbik7CisJCX0gZWxzZSBpZiAoY2hhbm5lbC0+cGt0X3NpemUgJiYgYXZhaWwgPj0gY2hhbm5lbC0+cGt0X3NpemUpIHsKKwkJCXJldCA9IHFjb21fc21kX2NoYW5uZWxfcmVjdl9zaW5nbGUoY2hhbm5lbCk7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBJbmRpY2F0ZSB0aGF0IHdlIGhhdmUgc2VlbiBhbmQgdXBkYXRlZCB0YWlsICovCisJU0VUX1JYX0NIQU5ORUxfRkxBRyhjaGFubmVsLCBmVEFJTCwgMSk7CisKKwkvKiBTaWduYWwgdGhlIHJlbW90ZSB0aGF0IHdlJ3ZlIGNvbnN1bWVkIHRoZSBkYXRhIChpZiByZXF1ZXN0ZWQpICovCisJaWYgKCFHRVRfUlhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZCTE9DS1JFQURJTlRSKSkgeworCQkvKiBFbnN1cmUgb3JkZXJpbmcgb2YgY2hhbm5lbCBpbmZvIHVwZGF0ZXMgKi8KKwkJd21iKCk7CisKKwkJcWNvbV9zbWRfc2lnbmFsX2NoYW5uZWwoY2hhbm5lbCk7CisJfQorCitvdXQ6CisJcmV0dXJuIG5lZWRfc3RhdGVfc2NhbjsKK30KKworLyoKKyAqIFRoZSBlZGdlIGludGVycnVwdHMgYXJlIHRyaWdnZXJlZCBieSB0aGUgcmVtb3RlIHByb2Nlc3NvciBvbiBzdGF0ZSBjaGFuZ2VzLAorICogY2hhbm5lbCBpbmZvIHVwZGF0ZXMgb3Igd2hlbiBuZXcgY2hhbm5lbHMgYXJlIGNyZWF0ZWQuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBxY29tX3NtZF9lZGdlX2ludHIoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcWNvbV9zbWRfZWRnZSAqZWRnZSA9IGRhdGE7CisJc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWw7CisJdW5zaWduZWQgYXZhaWxhYmxlOworCWJvb2wga2lja19zY2FubmVyID0gZmFsc2U7CisJYm9vbCBraWNrX3N0YXRlID0gZmFsc2U7CisKKwkvKgorCSAqIEhhbmRsZSBzdGF0ZSBjaGFuZ2VzIG9yIGRhdGEgb24gZWFjaCBvZiB0aGUgY2hhbm5lbHMgb24gdGhpcyBlZGdlCisJICovCisJc3Bpbl9sb2NrKCZlZGdlLT5jaGFubmVsc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW5uZWwsICZlZGdlLT5jaGFubmVscywgbGlzdCkgeworCQlzcGluX2xvY2soJmNoYW5uZWwtPnJlY3ZfbG9jayk7CisJCWtpY2tfc3RhdGUgfD0gcWNvbV9zbWRfY2hhbm5lbF9pbnRyKGNoYW5uZWwpOworCQlzcGluX3VubG9jaygmY2hhbm5lbC0+cmVjdl9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmVkZ2UtPmNoYW5uZWxzX2xvY2spOworCisJLyoKKwkgKiBDcmVhdGluZyBhIG5ldyBjaGFubmVsIHJlcXVpcmVzIGFsbG9jYXRpbmcgYW4gc21lbSBlbnRyeSwgc28gd2Ugb25seQorCSAqIGhhdmUgdG8gc2NhbiBpZiB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBzcGFjZSBpbiBzbWVtIGhhdmUgY2hhbmdlZAorCSAqIHNpbmNlIGxhc3Qgc2Nhbi4KKwkgKi8KKwlhdmFpbGFibGUgPSBxY29tX3NtZW1fZ2V0X2ZyZWVfc3BhY2UoZWRnZS0+cmVtb3RlX3BpZCk7CisJaWYgKGF2YWlsYWJsZSAhPSBlZGdlLT5zbWVtX2F2YWlsYWJsZSkgeworCQllZGdlLT5zbWVtX2F2YWlsYWJsZSA9IGF2YWlsYWJsZTsKKwkJa2lja19zY2FubmVyID0gdHJ1ZTsKKwl9CisKKwlpZiAoa2lja19zY2FubmVyKQorCQlzY2hlZHVsZV93b3JrKCZlZGdlLT5zY2FuX3dvcmspOworCWlmIChraWNrX3N0YXRlKQorCQlzY2hlZHVsZV93b3JrKCZlZGdlLT5zdGF0ZV93b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIENhbGN1bGF0ZSBob3cgbXVjaCBzcGFjZSBpcyBhdmFpbGFibGUgaW4gdGhlIHR4IGZpZm8uCisgKi8KK3N0YXRpYyBzaXplX3QgcWNvbV9zbWRfZ2V0X3R4X2F2YWlsKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsKQoreworCXVuc2lnbmVkIGhlYWQ7CisJdW5zaWduZWQgdGFpbDsKKwl1bnNpZ25lZCBtYXNrID0gY2hhbm5lbC0+Zmlmb19zaXplIC0gMTsKKworCWhlYWQgPSBHRVRfVFhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIGhlYWQpOworCXRhaWwgPSBHRVRfVFhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHRhaWwpOworCisJcmV0dXJuIG1hc2sgLSAoKGhlYWQgLSB0YWlsKSAmIG1hc2spOworfQorCisvKgorICogV3JpdGUgY291bnQgYnl0ZXMgb2YgZGF0YSBpbnRvIGNoYW5uZWwsIHBvc3NpYmx5IHdyYXBwaW5nIGluIHRoZSByaW5nIGJ1ZmZlcgorICovCitzdGF0aWMgaW50IHFjb21fc21kX3dyaXRlX2ZpZm8oc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgICBzaXplX3QgY291bnQpCit7CisJYm9vbCB3b3JkX2FsaWduZWQ7CisJdW5zaWduZWQgaGVhZDsKKwlzaXplX3QgbGVuOworCisJd29yZF9hbGlnbmVkID0gY2hhbm5lbC0+aW5mb193b3JkOworCWhlYWQgPSBHRVRfVFhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIGhlYWQpOworCisJbGVuID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgY2hhbm5lbC0+Zmlmb19zaXplIC0gaGVhZCk7CisJaWYgKGxlbikgeworCQlzbWRfY29weV90b19maWZvKGNoYW5uZWwtPnR4X2ZpZm8gKyBoZWFkLAorCQkJCSBkYXRhLAorCQkJCSBsZW4sCisJCQkJIHdvcmRfYWxpZ25lZCk7CisJfQorCisJaWYgKGxlbiAhPSBjb3VudCkgeworCQlzbWRfY29weV90b19maWZvKGNoYW5uZWwtPnR4X2ZpZm8sCisJCQkJIGRhdGEgKyBsZW4sCisJCQkJIGNvdW50IC0gbGVuLAorCQkJCSB3b3JkX2FsaWduZWQpOworCX0KKworCWhlYWQgKz0gY291bnQ7CisJaGVhZCAmPSAoY2hhbm5lbC0+Zmlmb19zaXplIC0gMSk7CisJU0VUX1RYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBoZWFkLCBoZWFkKTsKKworCXJldHVybiBjb3VudDsKK30KKworLyoqCisgKiBxY29tX3NtZF9zZW5kIC0gd3JpdGUgZGF0YSB0byBzbWQgY2hhbm5lbAorICogQGNoYW5uZWw6CWNoYW5uZWwgaGFuZGxlCisgKiBAZGF0YToJYnVmZmVyIG9mIGRhdGEgdG8gd3JpdGUKKyAqIEBsZW46CW51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICoKKyAqIFRoaXMgaXMgYSBibG9ja2luZyB3cml0ZSBvZiBsZW4gYnl0ZXMgaW50byB0aGUgY2hhbm5lbCdzIHR4IHJpbmcgYnVmZmVyIGFuZAorICogc2lnbmFsIHRoZSByZW1vdGUgZW5kLiBJdCB3aWxsIHNsZWVwIHVudGlsIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBhdmFpbGFibGUKKyAqIGluIHRoZSB0eCBidWZmZXIsIHV0aWxpemluZyB0aGUgZkJMT0NLUkVBRElOVFIgc2lnbmFsaW5nIG1lY2hhbmlzbSB0byBhdm9pZAorICogcG9sbGluZy4KKyAqLworc3RhdGljIGludCBfX3Fjb21fc21kX3NlbmQoc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWwsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkgICBpbnQgbGVuLCBib29sIHdhaXQpCit7CisJX19sZTMyIGhkcls1XSA9IHsgY3B1X3RvX2xlMzIobGVuKSwgfTsKKwlpbnQgdGxlbiA9IHNpemVvZihoZHIpICsgbGVuOworCWludCByZXQ7CisKKwkvKiBXb3JkIGFsaWduZWQgY2hhbm5lbHMgb25seSBhY2NlcHQgd29yZCBzaXplIGFsaWduZWQgZGF0YSAqLworCWlmIChjaGFubmVsLT5pbmZvX3dvcmQgJiYgbGVuICUgNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBSZWplY3QgcGFja2V0cyB0aGF0IGFyZSB0b28gYmlnICovCisJaWYgKHRsZW4gPj0gY2hhbm5lbC0+Zmlmb19zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY2hhbm5lbC0+dHhfbG9jayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXdoaWxlIChxY29tX3NtZF9nZXRfdHhfYXZhaWwoY2hhbm5lbCkgPCB0bGVuKSB7CisJCWlmICghd2FpdCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGNoYW5uZWwtPnN0YXRlICE9IFNNRF9DSEFOTkVMX09QRU5FRCkgeworCQkJcmV0ID0gLUVQSVBFOworCQkJZ290byBvdXQ7CisJCX0KKworCQlTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZCTE9DS1JFQURJTlRSLCAwKTsKKworCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoY2hhbm5lbC0+ZmJsb2NrcmVhZF9ldmVudCwKKwkJCQkgICAgICAgcWNvbV9zbWRfZ2V0X3R4X2F2YWlsKGNoYW5uZWwpID49IHRsZW4gfHwKKwkJCQkgICAgICAgY2hhbm5lbC0+c3RhdGUgIT0gU01EX0NIQU5ORUxfT1BFTkVEKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCVNFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZkJMT0NLUkVBRElOVFIsIDEpOworCX0KKworCVNFVF9UWF9DSEFOTkVMX0ZMQUcoY2hhbm5lbCwgZlRBSUwsIDApOworCisJcWNvbV9zbWRfd3JpdGVfZmlmbyhjaGFubmVsLCBoZHIsIHNpemVvZihoZHIpKTsKKwlxY29tX3NtZF93cml0ZV9maWZvKGNoYW5uZWwsIGRhdGEsIGxlbik7CisKKwlTRVRfVFhfQ0hBTk5FTF9GTEFHKGNoYW5uZWwsIGZIRUFELCAxKTsKKworCS8qIEVuc3VyZSBvcmRlcmluZyBvZiBjaGFubmVsIGluZm8gdXBkYXRlcyAqLworCXdtYigpOworCisJcWNvbV9zbWRfc2lnbmFsX2NoYW5uZWwoY2hhbm5lbCk7CisKK291dDoKKwltdXRleF91bmxvY2soJmNoYW5uZWwtPnR4X2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEhlbHBlciBmb3Igb3BlbmluZyBhIGNoYW5uZWwKKyAqLworc3RhdGljIGludCBxY29tX3NtZF9jaGFubmVsX29wZW4oc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJIHJwbXNnX3J4X2NiX3QgY2IpCit7CisJc2l6ZV90IGJiX3NpemU7CisKKwkvKgorCSAqIFBhY2tldHMgYXJlIG1heGltdW0gNGssIGJ1dCByZWR1Y2UgaWYgdGhlIGZpZm8gaXMgc21hbGxlcgorCSAqLworCWJiX3NpemUgPSBtaW4oY2hhbm5lbC0+Zmlmb19zaXplLCBTWl80Syk7CisJY2hhbm5lbC0+Ym91bmNlX2J1ZmZlciA9IGttYWxsb2MoYmJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFubmVsLT5ib3VuY2VfYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXFjb21fc21kX2NoYW5uZWxfc2V0X2NhbGxiYWNrKGNoYW5uZWwsIGNiKTsKKwlxY29tX3NtZF9jaGFubmVsX3NldF9zdGF0ZShjaGFubmVsLCBTTURfQ0hBTk5FTF9PUEVOSU5HKTsKKwlxY29tX3NtZF9jaGFubmVsX3NldF9zdGF0ZShjaGFubmVsLCBTTURfQ0hBTk5FTF9PUEVORUQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBIZWxwZXIgZm9yIGNsb3NpbmcgYW5kIHJlc2V0dGluZyBhIGNoYW5uZWwKKyAqLworc3RhdGljIHZvaWQgcWNvbV9zbWRfY2hhbm5lbF9jbG9zZShzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlxY29tX3NtZF9jaGFubmVsX3NldF9jYWxsYmFjayhjaGFubmVsLCBOVUxMKTsKKworCWtmcmVlKGNoYW5uZWwtPmJvdW5jZV9idWZmZXIpOworCWNoYW5uZWwtPmJvdW5jZV9idWZmZXIgPSBOVUxMOworCisJcWNvbV9zbWRfY2hhbm5lbF9zZXRfc3RhdGUoY2hhbm5lbCwgU01EX0NIQU5ORUxfQ0xPU0VEKTsKKwlxY29tX3NtZF9jaGFubmVsX3Jlc2V0KGNoYW5uZWwpOworfQorCitzdGF0aWMgc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKgorcWNvbV9zbWRfZmluZF9jaGFubmVsKHN0cnVjdCBxY29tX3NtZF9lZGdlICplZGdlLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsOworCXN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpyZXQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3RhdGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWRnZS0+Y2hhbm5lbHNfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbm5lbCwgJmVkZ2UtPmNoYW5uZWxzLCBsaXN0KSB7CisJCWlmIChzdHJjbXAoY2hhbm5lbC0+bmFtZSwgbmFtZSkpCisJCQljb250aW51ZTsKKworCQlzdGF0ZSA9IEdFVF9SWF9DSEFOTkVMX0lORk8oY2hhbm5lbCwgc3RhdGUpOworCQlpZiAoc3RhdGUgIT0gU01EX0NIQU5ORUxfT1BFTklORyAmJgorCQkgICAgc3RhdGUgIT0gU01EX0NIQU5ORUxfT1BFTkVEKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gY2hhbm5lbDsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVkZ2UtPmNoYW5uZWxzX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXB0X3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHJwbXNnX2VuZHBvaW50LAorCQkJCQkJICByZWZjb3VudCk7CisJa2ZyZWUodG9fc21kX2VuZHBvaW50KGVwdCkpOworfQorCitzdGF0aWMgc3RydWN0IHJwbXNnX2VuZHBvaW50ICpxY29tX3NtZF9jcmVhdGVfZXB0KHN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2LAorCQkJCQkJICBycG1zZ19yeF9jYl90IGNiLCB2b2lkICpwcml2LAorCQkJCQkJICBzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvIGNoaW5mbykKK3sKKwlzdHJ1Y3QgcWNvbV9zbWRfZW5kcG9pbnQgKnFzZXB0OworCXN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsOworCXN0cnVjdCBxY29tX3NtZF9kZXZpY2UgKnFzZGV2ID0gdG9fc21kX2RldmljZShycGRldik7CisJc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2UgPSBxc2Rldi0+ZWRnZTsKKwlzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdDsKKwljb25zdCBjaGFyICpuYW1lID0gY2hpbmZvLm5hbWU7CisJaW50IHJldDsKKworCS8qIFdhaXQgdXAgdG8gSFogZm9yIHRoZSBjaGFubmVsIHRvIGFwcGVhciAqLworCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGVkZ2UtPm5ld19jaGFubmVsX2V2ZW50LAorCQkJKGNoYW5uZWwgPSBxY29tX3NtZF9maW5kX2NoYW5uZWwoZWRnZSwgbmFtZSkpICE9IE5VTEwsCisJCQlIWik7CisJaWYgKCFyZXQpCisJCXJldHVybiBOVUxMOworCisJaWYgKGNoYW5uZWwtPnN0YXRlICE9IFNNRF9DSEFOTkVMX0NMT1NFRCkgeworCQlkZXZfZXJyKCZycGRldi0+ZGV2LCAiY2hhbm5lbCAlcyBpcyBidXN5XG4iLCBjaGFubmVsLT5uYW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcXNlcHQgPSBremFsbG9jKHNpemVvZigqcXNlcHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXFzZXB0KQorCQlyZXR1cm4gTlVMTDsKKworCWVwdCA9ICZxc2VwdC0+ZXB0OworCisJa3JlZl9pbml0KCZlcHQtPnJlZmNvdW50KTsKKworCWVwdC0+cnBkZXYgPSBycGRldjsKKwllcHQtPmNiID0gY2I7CisJZXB0LT5wcml2ID0gcHJpdjsKKwllcHQtPm9wcyA9ICZxY29tX3NtZF9lbmRwb2ludF9vcHM7CisKKwljaGFubmVsLT5xc2VwdCA9IHFzZXB0OworCXFzZXB0LT5xc2NoID0gY2hhbm5lbDsKKworCXJldCA9IHFjb21fc21kX2NoYW5uZWxfb3BlbihjaGFubmVsLCBjYik7CisJaWYgKHJldCkKKwkJZ290byBmcmVlX2VwdDsKKworCXJldHVybiBlcHQ7CisKK2ZyZWVfZXB0OgorCWNoYW5uZWwtPnFzZXB0ID0gTlVMTDsKKwlrcmVmX3B1dCgmZXB0LT5yZWZjb3VudCwgX19lcHRfcmVsZWFzZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHFjb21fc21kX2Rlc3Ryb3lfZXB0KHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0KQoreworCXN0cnVjdCBxY29tX3NtZF9lbmRwb2ludCAqcXNlcHQgPSB0b19zbWRfZW5kcG9pbnQoZXB0KTsKKwlzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2ggPSBxc2VwdC0+cXNjaDsKKworCXFjb21fc21kX2NoYW5uZWxfY2xvc2UoY2gpOworCWNoLT5xc2VwdCA9IE5VTEw7CisJa3JlZl9wdXQoJmVwdC0+cmVmY291bnQsIF9fZXB0X3JlbGVhc2UpOworfQorCitzdGF0aWMgaW50IHFjb21fc21kX3NlbmQoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHFjb21fc21kX2VuZHBvaW50ICpxc2VwdCA9IHRvX3NtZF9lbmRwb2ludChlcHQpOworCisJcmV0dXJuIF9fcWNvbV9zbWRfc2VuZChxc2VwdC0+cXNjaCwgZGF0YSwgbGVuLCB0cnVlKTsKK30KKworc3RhdGljIGludCBxY29tX3NtZF90cnlzZW5kKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBxY29tX3NtZF9lbmRwb2ludCAqcXNlcHQgPSB0b19zbWRfZW5kcG9pbnQoZXB0KTsKKworCXJldHVybiBfX3Fjb21fc21kX3NlbmQocXNlcHQtPnFzY2gsIGRhdGEsIGxlbiwgZmFsc2UpOworfQorCisvKgorICogRmluZHMgdGhlIGRldmljZV9ub2RlIGZvciB0aGUgc21kIGNoaWxkIGludGVyZXN0ZWQgaW4gdGhpcyBjaGFubmVsLgorICovCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpxY29tX3NtZF9tYXRjaF9jaGFubmVsKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZWRnZV9ub2RlLAorCQkJCQkJICBjb25zdCBjaGFyICpjaGFubmVsKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY2hpbGQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICprZXk7CisJaW50IHJldDsKKworCWZvcl9lYWNoX2F2YWlsYWJsZV9jaGlsZF9vZl9ub2RlKGVkZ2Vfbm9kZSwgY2hpbGQpIHsKKwkJa2V5ID0gInFjb20sc21kLWNoYW5uZWxzIjsKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoY2hpbGQsIGtleSwgJm5hbWUpOworCQlpZiAocmV0KQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmNtcChuYW1lLCBjaGFubmVsKSA9PSAwKQorCQkJcmV0dXJuIGNoaWxkOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJwbXNnX2RldmljZV9vcHMgcWNvbV9zbWRfZGV2aWNlX29wcyA9IHsKKwkuY3JlYXRlX2VwdCA9IHFjb21fc21kX2NyZWF0ZV9lcHQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJwbXNnX2VuZHBvaW50X29wcyBxY29tX3NtZF9lbmRwb2ludF9vcHMgPSB7CisJLmRlc3Ryb3lfZXB0ID0gcWNvbV9zbWRfZGVzdHJveV9lcHQsCisJLnNlbmQgPSBxY29tX3NtZF9zZW5kLAorCS50cnlzZW5kID0gcWNvbV9zbWRfdHJ5c2VuZCwKK307CisKKy8qCisgKiBDcmVhdGUgYSBzbWQgY2xpZW50IGRldmljZSBmb3IgY2hhbm5lbCB0aGF0IGlzIGJlaW5nIG9wZW5lZC4KKyAqLworc3RhdGljIGludCBxY29tX3NtZF9jcmVhdGVfZGV2aWNlKHN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBxY29tX3NtZF9kZXZpY2UgKnFzZGV2OworCXN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2OworCXN0cnVjdCBxY29tX3NtZF9lZGdlICplZGdlID0gY2hhbm5lbC0+ZWRnZTsKKworCWRldl9kYmcoJmVkZ2UtPmRldiwgInJlZ2lzdGVyaW5nICclcydcbiIsIGNoYW5uZWwtPm5hbWUpOworCisJcXNkZXYgPSBremFsbG9jKHNpemVvZigqcXNkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXFzZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIExpbmsgcXNkZXYgdG8gb3VyIFNNRCBlZGdlICovCisJcXNkZXYtPmVkZ2UgPSBlZGdlOworCisJLyogQXNzaWduIGNhbGxiYWNrcyBmb3IgcnBtc2dfZGV2aWNlICovCisJcXNkZXYtPnJwZGV2Lm9wcyA9ICZxY29tX3NtZF9kZXZpY2Vfb3BzOworCisJLyogQXNzaWduIHB1YmxpYyBpbmZvcm1hdGlvbiB0byB0aGUgcnBtc2dfZGV2aWNlICovCisJcnBkZXYgPSAmcXNkZXYtPnJwZGV2OworCXN0cm5jcHkocnBkZXYtPmlkLm5hbWUsIGNoYW5uZWwtPm5hbWUsIFJQTVNHX05BTUVfU0laRSk7CisJcnBkZXYtPnNyYyA9IFJQTVNHX0FERFJfQU5ZOworCXJwZGV2LT5kc3QgPSBSUE1TR19BRERSX0FOWTsKKworCXJwZGV2LT5kZXYub2Zfbm9kZSA9IHFjb21fc21kX21hdGNoX2NoYW5uZWwoZWRnZS0+b2Zfbm9kZSwgY2hhbm5lbC0+bmFtZSk7CisJcnBkZXYtPmRldi5wYXJlbnQgPSAmZWRnZS0+ZGV2OworCisJcmV0dXJuIHJwbXNnX3JlZ2lzdGVyX2RldmljZShycGRldik7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSB0aGUgcWNvbV9zbWRfY2hhbm5lbCBvYmplY3QgZm9yIGEgbmV3bHkgZm91bmQgc21kIGNoYW5uZWwsCisgKiByZXRyaWV2aW5nIGFuZCB2YWxpZGF0aW5nIHRoZSBzbWVtIGl0ZW1zIGludm9sdmVkLgorICovCitzdGF0aWMgc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKnFjb21fc21kX2NyZWF0ZV9jaGFubmVsKHN0cnVjdCBxY29tX3NtZF9lZGdlICplZGdlLAorCQkJCQkJCXVuc2lnbmVkIHNtZW1faW5mb19pdGVtLAorCQkJCQkJCXVuc2lnbmVkIHNtZW1fZmlmb19pdGVtLAorCQkJCQkJCWNoYXIgKm5hbWUpCit7CisJc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWw7CisJc2l6ZV90IGZpZm9fc2l6ZTsKKwlzaXplX3QgaW5mb19zaXplOworCXZvaWQgKmZpZm9fYmFzZTsKKwl2b2lkICppbmZvOworCWludCByZXQ7CisKKwljaGFubmVsID0gZGV2bV9remFsbG9jKCZlZGdlLT5kZXYsIHNpemVvZigqY2hhbm5lbCksIEdGUF9LRVJORUwpOworCWlmICghY2hhbm5lbCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwljaGFubmVsLT5lZGdlID0gZWRnZTsKKwljaGFubmVsLT5uYW1lID0gZGV2bV9rc3RyZHVwKCZlZGdlLT5kZXYsIG5hbWUsIEdGUF9LRVJORUwpOworCWlmICghY2hhbm5lbC0+bmFtZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltdXRleF9pbml0KCZjaGFubmVsLT50eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY2hhbm5lbC0+cmVjdl9sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaGFubmVsLT5mYmxvY2tyZWFkX2V2ZW50KTsKKworCWluZm8gPSBxY29tX3NtZW1fZ2V0KGVkZ2UtPnJlbW90ZV9waWQsIHNtZW1faW5mb19pdGVtLCAmaW5mb19zaXplKTsKKwlpZiAoSVNfRVJSKGluZm8pKSB7CisJCXJldCA9IFBUUl9FUlIoaW5mbyk7CisJCWdvdG8gZnJlZV9uYW1lX2FuZF9jaGFubmVsOworCX0KKworCS8qCisJICogVXNlIHRoZSBzaXplIG9mIHRoZSBpdGVtIHRvIGZpZ3VyZSBvdXQgd2hpY2ggY2hhbm5lbCBpbmZvIHN0cnVjdCB0bworCSAqIHVzZS4KKwkgKi8KKwlpZiAoaW5mb19zaXplID09IDIgKiBzaXplb2Yoc3RydWN0IHNtZF9jaGFubmVsX2luZm9fd29yZCkpIHsKKwkJY2hhbm5lbC0+aW5mb193b3JkID0gaW5mbzsKKwl9IGVsc2UgaWYgKGluZm9fc2l6ZSA9PSAyICogc2l6ZW9mKHN0cnVjdCBzbWRfY2hhbm5lbF9pbmZvKSkgeworCQljaGFubmVsLT5pbmZvID0gaW5mbzsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZlZGdlLT5kZXYsCisJCQkiY2hhbm5lbCBpbmZvIG9mIHNpemUgJXp1IG5vdCBzdXBwb3J0ZWRcbiIsIGluZm9fc2l6ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZnJlZV9uYW1lX2FuZF9jaGFubmVsOworCX0KKworCWZpZm9fYmFzZSA9IHFjb21fc21lbV9nZXQoZWRnZS0+cmVtb3RlX3BpZCwgc21lbV9maWZvX2l0ZW0sICZmaWZvX3NpemUpOworCWlmIChJU19FUlIoZmlmb19iYXNlKSkgeworCQlyZXQgPSAgUFRSX0VSUihmaWZvX2Jhc2UpOworCQlnb3RvIGZyZWVfbmFtZV9hbmRfY2hhbm5lbDsKKwl9CisKKwkvKiBUaGUgY2hhbm5lbCBjb25zaXN0IG9mIGEgcnggYW5kIHR4IGZpZm8gb2YgZXF1YWwgc2l6ZSAqLworCWZpZm9fc2l6ZSAvPSAyOworCisJZGV2X2RiZygmZWRnZS0+ZGV2LCAibmV3IGNoYW5uZWwgJyVzJyBpbmZvLXNpemU6ICV6dSBmaWZvLXNpemU6ICV6dVxuIiwKKwkJCSAgbmFtZSwgaW5mb19zaXplLCBmaWZvX3NpemUpOworCisJY2hhbm5lbC0+dHhfZmlmbyA9IGZpZm9fYmFzZTsKKwljaGFubmVsLT5yeF9maWZvID0gZmlmb19iYXNlICsgZmlmb19zaXplOworCWNoYW5uZWwtPmZpZm9fc2l6ZSA9IGZpZm9fc2l6ZTsKKworCXFjb21fc21kX2NoYW5uZWxfcmVzZXQoY2hhbm5lbCk7CisKKwlyZXR1cm4gY2hhbm5lbDsKKworZnJlZV9uYW1lX2FuZF9jaGFubmVsOgorCWRldm1fa2ZyZWUoJmVkZ2UtPmRldiwgY2hhbm5lbC0+bmFtZSk7CisJZGV2bV9rZnJlZSgmZWRnZS0+ZGV2LCBjaGFubmVsKTsKKworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKKy8qCisgKiBTY2FucyB0aGUgYWxsb2NhdGlvbiB0YWJsZSBmb3IgYW55IG5ld2x5IGFsbG9jYXRlZCBjaGFubmVscywgY2FsbHMKKyAqIHFjb21fc21kX2NyZWF0ZV9jaGFubmVsKCkgdG8gY3JlYXRlIHJlcHJlc2VudGF0aW9ucyBvZiB0aGVzZSBhbmQgYWRkCisgKiB0aGVtIHRvIHRoZSBlZGdlJ3MgbGlzdCBvZiBjaGFubmVscy4KKyAqLworc3RhdGljIHZvaWQgcWNvbV9jaGFubmVsX3NjYW5fd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcWNvbV9zbWRfZWRnZSAqZWRnZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcWNvbV9zbWRfZWRnZSwgc2Nhbl93b3JrKTsKKwlzdHJ1Y3QgcWNvbV9zbWRfYWxsb2NfZW50cnkgKmFsbG9jX3RibDsKKwlzdHJ1Y3QgcWNvbV9zbWRfYWxsb2NfZW50cnkgKmVudHJ5OworCXN0cnVjdCBxY29tX3NtZF9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgZmlmb19pZDsKKwl1bnNpZ25lZCBpbmZvX2lkOworCWludCB0Ymw7CisJaW50IGk7CisJdTMyIGVmbGFncywgY2lkOworCisJZm9yICh0YmwgPSAwOyB0YmwgPCBTTURfQUxMT0NfVEJMX0NPVU5UOyB0YmwrKykgeworCQlhbGxvY190YmwgPSBxY29tX3NtZW1fZ2V0KGVkZ2UtPnJlbW90ZV9waWQsCisJCQkJICAgIHNtZW1faXRlbXNbdGJsXS5hbGxvY190YmxfaWQsIE5VTEwpOworCQlpZiAoSVNfRVJSKGFsbG9jX3RibCkpCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgU01EX0FMTE9DX1RCTF9TSVpFOyBpKyspIHsKKwkJCWVudHJ5ID0gJmFsbG9jX3RibFtpXTsKKwkJCWVmbGFncyA9IGxlMzJfdG9fY3B1KGVudHJ5LT5mbGFncyk7CisJCQlpZiAodGVzdF9iaXQoaSwgZWRnZS0+YWxsb2NhdGVkW3RibF0pKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZW50cnktPnJlZl9jb3VudCA9PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIWVudHJ5LT5uYW1lWzBdKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIShlZmxhZ3MgJiBTTURfQ0hBTk5FTF9GTEFHU19QQUNLRVQpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoKGVmbGFncyAmIFNNRF9DSEFOTkVMX0ZMQUdTX0VER0VfTUFTSykgIT0gZWRnZS0+ZWRnZV9pZCkKKwkJCQljb250aW51ZTsKKworCQkJY2lkID0gbGUzMl90b19jcHUoZW50cnktPmNpZCk7CisJCQlpbmZvX2lkID0gc21lbV9pdGVtc1t0YmxdLmluZm9fYmFzZV9pZCArIGNpZDsKKwkJCWZpZm9faWQgPSBzbWVtX2l0ZW1zW3RibF0uZmlmb19iYXNlX2lkICsgY2lkOworCisJCQljaGFubmVsID0gcWNvbV9zbWRfY3JlYXRlX2NoYW5uZWwoZWRnZSwgaW5mb19pZCwgZmlmb19pZCwgZW50cnktPm5hbWUpOworCQkJaWYgKElTX0VSUihjaGFubmVsKSkKKwkJCQljb250aW51ZTsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZ2UtPmNoYW5uZWxzX2xvY2ssIGZsYWdzKTsKKwkJCWxpc3RfYWRkKCZjaGFubmVsLT5saXN0LCAmZWRnZS0+Y2hhbm5lbHMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZS0+Y2hhbm5lbHNfbG9jaywgZmxhZ3MpOworCisJCQlkZXZfZGJnKCZlZGdlLT5kZXYsICJuZXcgY2hhbm5lbCBmb3VuZDogJyVzJ1xuIiwgY2hhbm5lbC0+bmFtZSk7CisJCQlzZXRfYml0KGksIGVkZ2UtPmFsbG9jYXRlZFt0YmxdKTsKKworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZlZGdlLT5uZXdfY2hhbm5lbF9ldmVudCk7CisJCX0KKwl9CisKKwlzY2hlZHVsZV93b3JrKCZlZGdlLT5zdGF0ZV93b3JrKTsKK30KKworLyoKKyAqIFRoaXMgcGVyIGVkZ2Ugd29ya2VyIHNjYW5zIHNtZW0gZm9yIGFueSBuZXcgY2hhbm5lbHMgYW5kIHJlZ2lzdGVyIHRoZXNlLiBJdAorICogdGhlbiBzY2FucyBhbGwgcmVnaXN0ZXJlZCBjaGFubmVscyBmb3Igc3RhdGUgY2hhbmdlcyB0aGF0IHNob3VsZCBiZSBoYW5kbGVkCisgKiBieSBjcmVhdGluZyBvciBkZXN0cm95aW5nIHNtZCBjbGllbnQgZGV2aWNlcyBmb3IgdGhlIHJlZ2lzdGVyZWQgY2hhbm5lbHMuCisgKgorICogTE9DS0lORzogZWRnZS0+Y2hhbm5lbHNfbG9jayBvbmx5IG5lZWRzIHRvIGNvdmVyIHRoZSBsaXN0IG9wZXJhdGlvbnMsIGFzIHRoZQorICogd29ya2VyIGlzIGtpbGxlZCBiZWZvcmUgYW55IGNoYW5uZWxzIGFyZSBkZWFsbG9jYXRlZAorICovCitzdGF0aWMgdm9pZCBxY29tX2NoYW5uZWxfc3RhdGVfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcWNvbV9zbWRfY2hhbm5lbCAqY2hhbm5lbDsKKwlzdHJ1Y3QgcWNvbV9zbWRfZWRnZSAqZWRnZSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQkJICBzdHJ1Y3QgcWNvbV9zbWRfZWRnZSwKKwkJCQkJCSAgc3RhdGVfd29yayk7CisJc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyBjaGluZm87CisJdW5zaWduZWQgcmVtb3RlX3N0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIFJlZ2lzdGVyIGEgZGV2aWNlIGZvciBhbnkgY2xvc2VkIGNoYW5uZWwgd2hlcmUgdGhlIHJlbW90ZSBwcm9jZXNzb3IKKwkgKiBpcyBzaG93aW5nIGludGVyZXN0IGluIG9wZW5pbmcgdGhlIGNoYW5uZWwuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZ2UtPmNoYW5uZWxzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW5uZWwsICZlZGdlLT5jaGFubmVscywgbGlzdCkgeworCQlpZiAoY2hhbm5lbC0+c3RhdGUgIT0gU01EX0NIQU5ORUxfQ0xPU0VEKQorCQkJY29udGludWU7CisKKwkJcmVtb3RlX3N0YXRlID0gR0VUX1JYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBzdGF0ZSk7CisJCWlmIChyZW1vdGVfc3RhdGUgIT0gU01EX0NIQU5ORUxfT1BFTklORyAmJgorCQkgICAgcmVtb3RlX3N0YXRlICE9IFNNRF9DSEFOTkVMX09QRU5FRCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjaGFubmVsLT5yZWdpc3RlcmVkKQorCQkJY29udGludWU7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZS0+Y2hhbm5lbHNfbG9jaywgZmxhZ3MpOworCQlxY29tX3NtZF9jcmVhdGVfZGV2aWNlKGNoYW5uZWwpOworCQljaGFubmVsLT5yZWdpc3RlcmVkID0gdHJ1ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZ2UtPmNoYW5uZWxzX2xvY2ssIGZsYWdzKTsKKworCQljaGFubmVsLT5yZWdpc3RlcmVkID0gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIFVucmVnaXN0ZXIgdGhlIGRldmljZSBmb3IgYW55IGNoYW5uZWwgdGhhdCBpcyBvcGVuZWQgd2hlcmUgdGhlCisJICogcmVtb3RlIHByb2Nlc3NvciBpcyBjbG9zaW5nIHRoZSBjaGFubmVsLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbm5lbCwgJmVkZ2UtPmNoYW5uZWxzLCBsaXN0KSB7CisJCWlmIChjaGFubmVsLT5zdGF0ZSAhPSBTTURfQ0hBTk5FTF9PUEVOSU5HICYmCisJCSAgICBjaGFubmVsLT5zdGF0ZSAhPSBTTURfQ0hBTk5FTF9PUEVORUQpCisJCQljb250aW51ZTsKKworCQlyZW1vdGVfc3RhdGUgPSBHRVRfUlhfQ0hBTk5FTF9JTkZPKGNoYW5uZWwsIHN0YXRlKTsKKwkJaWYgKHJlbW90ZV9zdGF0ZSA9PSBTTURfQ0hBTk5FTF9PUEVOSU5HIHx8CisJCSAgICByZW1vdGVfc3RhdGUgPT0gU01EX0NIQU5ORUxfT1BFTkVEKQorCQkJY29udGludWU7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZS0+Y2hhbm5lbHNfbG9jaywgZmxhZ3MpOworCisJCXN0cm5jcHkoY2hpbmZvLm5hbWUsIGNoYW5uZWwtPm5hbWUsIHNpemVvZihjaGluZm8ubmFtZSkpOworCQljaGluZm8uc3JjID0gUlBNU0dfQUREUl9BTlk7CisJCWNoaW5mby5kc3QgPSBSUE1TR19BRERSX0FOWTsKKwkJcnBtc2dfdW5yZWdpc3Rlcl9kZXZpY2UoJmVkZ2UtPmRldiwgJmNoaW5mbyk7CisJCWNoYW5uZWwtPnJlZ2lzdGVyZWQgPSBmYWxzZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmVkZ2UtPmNoYW5uZWxzX2xvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWRnZS0+Y2hhbm5lbHNfbG9jaywgZmxhZ3MpOworfQorCisvKgorICogUGFyc2VzIGFuIG9mX25vZGUgZGVzY3JpYmluZyBhbiBlZGdlLgorICovCitzdGF0aWMgaW50IHFjb21fc21kX3BhcnNlX2VkZ2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgcWNvbV9zbWRfZWRnZSAqZWRnZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnN5c2Nvbl9ucDsKKwljb25zdCBjaGFyICprZXk7CisJaW50IGlycTsKKwlpbnQgcmV0OworCisJSU5JVF9MSVNUX0hFQUQoJmVkZ2UtPmNoYW5uZWxzKTsKKwlzcGluX2xvY2tfaW5pdCgmZWRnZS0+Y2hhbm5lbHNfbG9jayk7CisKKwlJTklUX1dPUksoJmVkZ2UtPnNjYW5fd29yaywgcWNvbV9jaGFubmVsX3NjYW5fd29ya2VyKTsKKwlJTklUX1dPUksoJmVkZ2UtPnN0YXRlX3dvcmssIHFjb21fY2hhbm5lbF9zdGF0ZV93b3JrZXIpOworCisJZWRnZS0+b2Zfbm9kZSA9IG9mX25vZGVfZ2V0KG5vZGUpOworCisJa2V5ID0gInFjb20sc21kLWVkZ2UiOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsIGtleSwgJmVkZ2UtPmVkZ2VfaWQpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJlZGdlIG1pc3NpbmcgJXMgcHJvcGVydHlcbiIsIGtleSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVkZ2UtPnJlbW90ZV9waWQgPSBRQ09NX1NNRU1fSE9TVF9BTlk7CisJa2V5ID0gInFjb20scmVtb3RlLXBpZCI7CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwga2V5LCAmZWRnZS0+cmVtb3RlX3BpZCk7CisKKwlzeXNjb25fbnAgPSBvZl9wYXJzZV9waGFuZGxlKG5vZGUsICJxY29tLGlwYyIsIDApOworCWlmICghc3lzY29uX25wKSB7CisJCWRldl9lcnIoZGV2LCAibm8gcWNvbSxpcGMgbm9kZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWVkZ2UtPmlwY19yZWdtYXAgPSBzeXNjb25fbm9kZV90b19yZWdtYXAoc3lzY29uX25wKTsKKwlpZiAoSVNfRVJSKGVkZ2UtPmlwY19yZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihlZGdlLT5pcGNfcmVnbWFwKTsKKworCWtleSA9ICJxY29tLGlwYyI7CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobm9kZSwga2V5LCAxLCAmZWRnZS0+aXBjX29mZnNldCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJubyBvZmZzZXQgaW4gJXNcbiIsIGtleSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5vZGUsIGtleSwgMiwgJmVkZ2UtPmlwY19iaXQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAibm8gYml0IGluICVzXG4iLCBrZXkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChub2RlLCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKGRldiwgInJlcXVpcmVkIHNtZCBpbnRlcnJ1cHQgbWlzc2luZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsCisJCQkgICAgICAgcWNvbV9zbWRfZWRnZV9pbnRyLCBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJICAgICAgIG5vZGUtPm5hbWUsIGVkZ2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBzbWQgaXJxXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwllZGdlLT5pcnEgPSBpcnE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlbGVhc2UgZnVuY3Rpb24gZm9yIGFuIGVkZ2UuCisgICogUmVzZXQgdGhlIHN0YXRlIG9mIGVhY2ggYXNzb2NpYXRlZCBjaGFubmVsIGFuZCBmcmVlIHRoZSBlZGdlIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkIHFjb21fc21kX2VkZ2VfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHFjb21fc21kX2NoYW5uZWwgKmNoYW5uZWw7CisJc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2UgPSB0b19zbWRfZWRnZShkZXYpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFubmVsLCAmZWRnZS0+Y2hhbm5lbHMsIGxpc3QpIHsKKwkJU0VUX1JYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBzdGF0ZSwgU01EX0NIQU5ORUxfQ0xPU0VEKTsKKwkJU0VUX1JYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCBoZWFkLCAwKTsKKwkJU0VUX1JYX0NIQU5ORUxfSU5GTyhjaGFubmVsLCB0YWlsLCAwKTsKKwl9CisKKwlrZnJlZShlZGdlKTsKK30KKworLyoqCisgKiBxY29tX3NtZF9yZWdpc3Rlcl9lZGdlKCkgLSByZWdpc3RlciBhbiBlZGdlIGJhc2VkIG9uIGFuIGRldmljZV9ub2RlCisgKiBAcGFyZW50OiAgICBwYXJlbnQgZGV2aWNlIGZvciB0aGUgZWRnZQorICogQG5vZGU6ICAgICAgZGV2aWNlX25vZGUgZGVzY3JpYmluZyB0aGUgZWRnZQorICoKKyAqIFJldHVybnMgYW4gZWRnZSByZWZlcmVuY2UsIG9yIG5lZ2F0aXZlIEVSUl9QVFIoKSBvbiBmYWlsdXJlLgorICovCitzdHJ1Y3QgcWNvbV9zbWRfZWRnZSAqcWNvbV9zbWRfcmVnaXN0ZXJfZWRnZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBxY29tX3NtZF9lZGdlICplZGdlOworCWludCByZXQ7CisKKwllZGdlID0ga3phbGxvYyhzaXplb2YoKmVkZ2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVkZ2UpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZWRnZS0+bmV3X2NoYW5uZWxfZXZlbnQpOworCisJZWRnZS0+ZGV2LnBhcmVudCA9IHBhcmVudDsKKwllZGdlLT5kZXYucmVsZWFzZSA9IHFjb21fc21kX2VkZ2VfcmVsZWFzZTsKKwlkZXZfc2V0X25hbWUoJmVkZ2UtPmRldiwgIiVzOiVzIiwgZGV2X25hbWUocGFyZW50KSwgbm9kZS0+bmFtZSk7CisJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZlZGdlLT5kZXYpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gcmVnaXN0ZXIgc21kIGVkZ2VcbiIpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCXJldCA9IHFjb21fc21kX3BhcnNlX2VkZ2UoJmVkZ2UtPmRldiwgbm9kZSwgZWRnZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZlZGdlLT5kZXYsICJmYWlsZWQgdG8gcGFyc2Ugc21kIGVkZ2VcbiIpOworCQlnb3RvIHVucmVnaXN0ZXJfZGV2OworCX0KKworCXNjaGVkdWxlX3dvcmsoJmVkZ2UtPnNjYW5fd29yayk7CisKKwlyZXR1cm4gZWRnZTsKKwordW5yZWdpc3Rlcl9kZXY6CisJcHV0X2RldmljZSgmZWRnZS0+ZGV2KTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorRVhQT1JUX1NZTUJPTChxY29tX3NtZF9yZWdpc3Rlcl9lZGdlKTsKKworc3RhdGljIGludCBxY29tX3NtZF9yZW1vdmVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcWNvbV9zbWRfdW5yZWdpc3Rlcl9lZGdlKCkgLSByZWxlYXNlIGFuIGVkZ2UgYW5kIGl0cyBjaGlsZHJlbgorICogQGVkZ2U6ICAgICAgZWRnZSByZWZlcmVuY2UgYWNxdWlyZWQgZnJvbSBxY29tX3NtZF9yZWdpc3Rlcl9lZGdlCisgKi8KK2ludCBxY29tX3NtZF91bnJlZ2lzdGVyX2VkZ2Uoc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2UpCit7CisJaW50IHJldDsKKworCWRpc2FibGVfaXJxKGVkZ2UtPmlycSk7CisJY2FuY2VsX3dvcmtfc3luYygmZWRnZS0+c2Nhbl93b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZlZGdlLT5zdGF0ZV93b3JrKTsKKworCXJldCA9IGRldmljZV9mb3JfZWFjaF9jaGlsZCgmZWRnZS0+ZGV2LCBOVUxMLCBxY29tX3NtZF9yZW1vdmVfZGV2aWNlKTsKKwlpZiAocmV0KQorCQlkZXZfd2FybigmZWRnZS0+ZGV2LCAiY2FuJ3QgcmVtb3ZlIHNtZCBkZXZpY2U6ICVkXG4iLCByZXQpOworCisJZGV2aWNlX3VucmVnaXN0ZXIoJmVkZ2UtPmRldik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wocWNvbV9zbWRfdW5yZWdpc3Rlcl9lZGdlKTsKKworc3RhdGljIGludCBxY29tX3NtZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwl2b2lkICpwOworCisJLyogV2FpdCBmb3Igc21lbSAqLworCXAgPSBxY29tX3NtZW1fZ2V0KFFDT01fU01FTV9IT1NUX0FOWSwgc21lbV9pdGVtc1swXS5hbGxvY190YmxfaWQsIE5VTEwpOworCWlmIChQVFJfRVJSKHApID09IC1FUFJPQkVfREVGRVIpCisJCXJldHVybiBQVFJfRVJSKHApOworCisJZm9yX2VhY2hfYXZhaWxhYmxlX2NoaWxkX29mX25vZGUocGRldi0+ZGV2Lm9mX25vZGUsIG5vZGUpCisJCXFjb21fc21kX3JlZ2lzdGVyX2VkZ2UoJnBkZXYtPmRldiwgbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxY29tX3NtZF9yZW1vdmVfZWRnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHFjb21fc21kX2VkZ2UgKmVkZ2UgPSB0b19zbWRfZWRnZShkZXYpOworCisJcmV0dXJuIHFjb21fc21kX3VucmVnaXN0ZXJfZWRnZShlZGdlKTsKK30KKworLyoKKyAqIFNodXQgZG93biBhbGwgc21kIGNsaWVudHMgYnkgbWFraW5nIHN1cmUgdGhhdCBlYWNoIGVkZ2Ugc3RvcHMgcHJvY2Vzc2luZworICogZXZlbnRzIGFuZCBzY2FubmluZyBmb3IgbmV3IGNoYW5uZWxzLCB0aGVuIGNhbGwgZGVzdHJveSBvbiB0aGUgZGV2aWNlcy4KKyAqLworc3RhdGljIGludCBxY29tX3NtZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZwZGV2LT5kZXYsIE5VTEwsIHFjb21fc21kX3JlbW92ZV9lZGdlKTsKKwlpZiAocmV0KQorCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiY2FuJ3QgcmVtb3ZlIHNtZCBkZXZpY2U6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcWNvbV9zbWRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sc21kIiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcWNvbV9zbWRfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBxY29tX3NtZF9kcml2ZXIgPSB7CisJLnByb2JlID0gcWNvbV9zbWRfcHJvYmUsCisJLnJlbW92ZSA9IHFjb21fc21kX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJxY29tLXNtZCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHFjb21fc21kX29mX21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBxY29tX3NtZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmcWNvbV9zbWRfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChxY29tX3NtZF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHFjb21fc21kX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcWNvbV9zbWRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHFjb21fc21kX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJCam9ybiBBbmRlcnNzb24gPGJqb3JuLmFuZGVyc3NvbkBzb255bW9iaWxlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUXVhbGNvbW0gU2hhcmVkIE1lbW9yeSBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnBtc2cvcnBtc2dfY29yZS5jIGIvZHJpdmVycy9ycG1zZy9ycG1zZ19jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlYTlmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnBtc2cvcnBtc2dfY29yZS5jCkBAIC0wLDAgKzEsNDk4IEBACisvKgorICogcmVtb3RlIHByb2Nlc3NvciBtZXNzYWdpbmcgYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRleGFzIEluc3RydW1lbnRzLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlLCBJbmMuCisgKgorICogT2hhZCBCZW4tQ29oZW4gPG9oYWRAd2l6ZXJ5LmNvbT4KKyAqIEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSAiJXM6ICIgZm10LCBfX2Z1bmNfXworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcnBtc2cuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJycG1zZ19pbnRlcm5hbC5oIgorCisvKioKKyAqIHJwbXNnX2NyZWF0ZV9lcHQoKSAtIGNyZWF0ZSBhIG5ldyBycG1zZ19lbmRwb2ludAorICogQHJwZGV2OiBycG1zZyBjaGFubmVsIGRldmljZQorICogQGNiOiByeCBjYWxsYmFjayBoYW5kbGVyCisgKiBAcHJpdjogcHJpdmF0ZSBkYXRhIGZvciB0aGUgZHJpdmVyJ3MgdXNlCisgKiBAY2hpbmZvOiBjaGFubmVsX2luZm8gd2l0aCB0aGUgbG9jYWwgcnBtc2cgYWRkcmVzcyB0byBiaW5kIHdpdGggQGNiCisgKgorICogRXZlcnkgcnBtc2cgYWRkcmVzcyBpbiB0aGUgc3lzdGVtIGlzIGJvdW5kIHRvIGFuIHJ4IGNhbGxiYWNrIChzbyB3aGVuCisgKiBpbmJvdW5kIG1lc3NhZ2VzIGFycml2ZSwgdGhleSBhcmUgZGlzcGF0Y2hlZCBieSB0aGUgcnBtc2cgYnVzIHVzaW5nIHRoZQorICogYXBwcm9wcmlhdGUgY2FsbGJhY2sgaGFuZGxlcikgYnkgbWVhbnMgb2YgYW4gcnBtc2dfZW5kcG9pbnQgc3RydWN0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGRyaXZlcnMgdG8gY3JlYXRlIHN1Y2ggYW4gZW5kcG9pbnQsIGFuZCBieSB0aGF0LAorICogYmluZCBhIGNhbGxiYWNrLCBhbmQgcG9zc2libHkgc29tZSBwcml2YXRlIGRhdGEgdG9vLCB0byBhbiBycG1zZyBhZGRyZXNzCisgKiAoZWl0aGVyIG9uZSB0aGF0IGlzIGtub3duIGluIGFkdmFuY2UsIG9yIG9uZSB0aGF0IHdpbGwgYmUgZHluYW1pY2FsbHkKKyAqIGFzc2lnbmVkIGZvciB0aGVtKS4KKyAqCisgKiBTaW1wbGUgcnBtc2cgZHJpdmVycyBuZWVkIG5vdCBjYWxsIHJwbXNnX2NyZWF0ZV9lcHQsIGJlY2F1c2UgYW4gZW5kcG9pbnQKKyAqIGlzIGFscmVhZHkgY3JlYXRlZCBmb3IgdGhlbSB3aGVuIHRoZXkgYXJlIHByb2JlZCBieSB0aGUgcnBtc2cgYnVzCisgKiAodXNpbmcgdGhlIHJ4IGNhbGxiYWNrIHByb3ZpZGVkIHdoZW4gdGhleSByZWdpc3RlcmVkIHRvIHRoZSBycG1zZyBidXMpLgorICoKKyAqIFNvIHRoaW5ncyBzaG91bGQganVzdCB3b3JrIGZvciBzaW1wbGUgZHJpdmVyczogdGhleSBhbHJlYWR5IGhhdmUgYW4KKyAqIGVuZHBvaW50LCB0aGVpciByeCBjYWxsYmFjayBpcyBib3VuZCB0byB0aGVpciBycG1zZyBhZGRyZXNzLCBhbmQgd2hlbgorICogcmVsZXZhbnQgaW5ib3VuZCBtZXNzYWdlcyBhcnJpdmUgKGkuZS4gbWVzc2FnZXMgd2hpY2ggdGhlaXIgZHN0IGFkZHJlc3MKKyAqIGVxdWFscyB0byB0aGUgc3JjIGFkZHJlc3Mgb2YgdGhlaXIgcnBtc2cgY2hhbm5lbCksIHRoZSBkcml2ZXIncyBoYW5kbGVyCisgKiBpcyBpbnZva2VkIHRvIHByb2Nlc3MgaXQuCisgKgorICogVGhhdCBzYWlkLCBtb3JlIGNvbXBsaWNhdGVkIGRyaXZlcnMgbWlnaHQgZG8gbmVlZCB0byBhbGxvY2F0ZQorICogYWRkaXRpb25hbCBycG1zZyBhZGRyZXNzZXMsIGFuZCBiaW5kIHRoZW0gdG8gZGlmZmVyZW50IHJ4IGNhbGxiYWNrcy4KKyAqIFRvIGFjY29tcGxpc2ggdGhhdCwgdGhvc2UgZHJpdmVycyBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBEcml2ZXJzIHNob3VsZCBwcm92aWRlIHRoZWlyIEBycGRldiBjaGFubmVsIChzbyB0aGUgbmV3IGVuZHBvaW50IHdvdWxkIGJlbG9uZworICogdG8gdGhlIHNhbWUgcmVtb3RlIHByb2Nlc3NvciB0aGVpciBjaGFubmVsIGJlbG9uZ3MgdG8pLCBhbiByeCBjYWxsYmFjaworICogZnVuY3Rpb24sIGFuIG9wdGlvbmFsIHByaXZhdGUgZGF0YSAod2hpY2ggaXMgcHJvdmlkZWQgYmFjayB3aGVuIHRoZQorICogcnggY2FsbGJhY2sgaXMgaW52b2tlZCksIGFuZCBhbiBhZGRyZXNzIHRoZXkgd2FudCB0byBiaW5kIHdpdGggdGhlCisgKiBjYWxsYmFjay4gSWYgQGFkZHIgaXMgUlBNU0dfQUREUl9BTlksIHRoZW4gcnBtc2dfY3JlYXRlX2VwdCB3aWxsCisgKiBkeW5hbWljYWxseSBhc3NpZ24gdGhlbSBhbiBhdmFpbGFibGUgcnBtc2cgYWRkcmVzcyAoZHJpdmVycyBzaG91bGQgaGF2ZQorICogYSB2ZXJ5IGdvb2QgcmVhc29uIHdoeSBub3QgdG8gYWx3YXlzIHVzZSBSUE1TR19BRERSX0FOWSBoZXJlKS4KKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW5kcG9pbnQgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBlcnJvci4KKyAqLworc3RydWN0IHJwbXNnX2VuZHBvaW50ICpycG1zZ19jcmVhdGVfZXB0KHN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2LAorCQkJCQlycG1zZ19yeF9jYl90IGNiLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvIGNoaW5mbykKK3sKKwlyZXR1cm4gcnBkZXYtPm9wcy0+Y3JlYXRlX2VwdChycGRldiwgY2IsIHByaXYsIGNoaW5mbyk7Cit9CitFWFBPUlRfU1lNQk9MKHJwbXNnX2NyZWF0ZV9lcHQpOworCisvKioKKyAqIHJwbXNnX2Rlc3Ryb3lfZXB0KCkgLSBkZXN0cm95IGFuIGV4aXN0aW5nIHJwbXNnIGVuZHBvaW50CisgKiBAZXB0OiBlbmRwb2luZyB0byBkZXN0cm95CisgKgorICogU2hvdWxkIGJlIHVzZWQgYnkgZHJpdmVycyB0byBkZXN0cm95IGFuIHJwbXNnIGVuZHBvaW50IHByZXZpb3VzbHkKKyAqIGNyZWF0ZWQgd2l0aCBycG1zZ19jcmVhdGVfZXB0KCkuCisgKi8KK3ZvaWQgcnBtc2dfZGVzdHJveV9lcHQoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQpCit7CisJZXB0LT5vcHMtPmRlc3Ryb3lfZXB0KGVwdCk7Cit9CitFWFBPUlRfU1lNQk9MKHJwbXNnX2Rlc3Ryb3lfZXB0KTsKKworLyoqCisgKiBycG1zZ19zZW5kKCkgLSBzZW5kIGEgbWVzc2FnZSBhY3Jvc3MgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3IKKyAqIEBlcHQ6IHRoZSBycG1zZyBlbmRwb2ludAorICogQGRhdGE6IHBheWxvYWQgb2YgbWVzc2FnZQorICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIEBkYXRhIG9mIGxlbmd0aCBAbGVuIG9uIHRoZSBAZXB0IGVuZHBvaW50LgorICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSByZW1vdGUgcHJvY2Vzc29yIHdoaWNoIHRoZSBAZXB0CisgKiBlbmRwb2ludCBiZWxvbmdzIHRvLCB1c2luZyBAZXB0J3MgYWRkcmVzcyBhbmQgaXRzIGFzc29jaWF0ZWQgcnBtc2cKKyAqIGRldmljZSBkZXN0aW5hdGlvbiBhZGRyZXNzZXMuCisgKiBJbiBjYXNlIHRoZXJlIGFyZSBubyBUWCBidWZmZXJzIGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwKKyAqIG9uZSBiZWNvbWVzIGF2YWlsYWJsZSwgb3IgYSB0aW1lb3V0IG9mIDE1IHNlY29uZHMgZWxhcHNlcy4gV2hlbiB0aGUgbGF0dGVyCisgKiBoYXBwZW5zLCAtRVJFU1RBUlRTWVMgaXMgcmV0dXJuZWQuCisgKgorICogQ2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0IChmb3Igbm93KS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IHJwbXNnX3NlbmQoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJcmV0dXJuIGVwdC0+b3BzLT5zZW5kKGVwdCwgZGF0YSwgbGVuKTsKK30KK0VYUE9SVF9TWU1CT0wocnBtc2dfc2VuZCk7CisKKy8qKgorICogcnBtc2dfc2VuZHRvKCkgLSBzZW5kIGEgbWVzc2FnZSBhY3Jvc3MgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3IsIHNwZWNpZnkgZHN0CisgKiBAZXB0OiB0aGUgcnBtc2cgZW5kcG9pbnQKKyAqIEBkYXRhOiBwYXlsb2FkIG9mIG1lc3NhZ2UKKyAqIEBsZW46IGxlbmd0aCBvZiBwYXlsb2FkCisgKiBAZHN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKgorICogVGhpcyBmdW5jdGlvbiBzZW5kcyBAZGF0YSBvZiBsZW5ndGggQGxlbiB0byB0aGUgcmVtb3RlIEBkc3QgYWRkcmVzcy4KKyAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcmVtb3RlIHByb2Nlc3NvciB3aGljaCB0aGUgQGVwdAorICogZW5kcG9pbnQgYmVsb25ncyB0bywgdXNpbmcgQGVwdCdzIGFkZHJlc3MgYXMgc291cmNlLgorICogSW4gY2FzZSB0aGVyZSBhcmUgbm8gVFggYnVmZmVycyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsCisgKiBvbmUgYmVjb21lcyBhdmFpbGFibGUsIG9yIGEgdGltZW91dCBvZiAxNSBzZWNvbmRzIGVsYXBzZXMuIFdoZW4gdGhlIGxhdHRlcgorICogaGFwcGVucywgLUVSRVNUQVJUU1lTIGlzIHJldHVybmVkLgorICoKKyAqIENhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCAoZm9yIG5vdykuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBycG1zZ19zZW5kdG8oc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4sIHUzMiBkc3QpCit7CisJcmV0dXJuIGVwdC0+b3BzLT5zZW5kdG8oZXB0LCBkYXRhLCBsZW4sIGRzdCk7Cit9CitFWFBPUlRfU1lNQk9MKHJwbXNnX3NlbmR0byk7CisKKy8qKgorICogcnBtc2dfc2VuZF9vZmZjaGFubmVsKCkgLSBzZW5kIGEgbWVzc2FnZSB1c2luZyBleHBsaWNpdCBzcmMvZHN0IGFkZHJlc3NlcworICogQGVwdDogdGhlIHJwbXNnIGVuZHBvaW50CisgKiBAc3JjOiBzb3VyY2UgYWRkcmVzcworICogQGRzdDogZGVzdGluYXRpb24gYWRkcmVzcworICogQGRhdGE6IHBheWxvYWQgb2YgbWVzc2FnZQorICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIEBkYXRhIG9mIGxlbmd0aCBAbGVuIHRvIHRoZSByZW1vdGUgQGRzdCBhZGRyZXNzLAorICogYW5kIHVzZXMgQHNyYyBhcyB0aGUgc291cmNlIGFkZHJlc3MuCisgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2hpY2ggdGhlIEBlcHQKKyAqIGVuZHBvaW50IGJlbG9uZ3MgdG8uCisgKiBJbiBjYXNlIHRoZXJlIGFyZSBubyBUWCBidWZmZXJzIGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdW50aWwKKyAqIG9uZSBiZWNvbWVzIGF2YWlsYWJsZSwgb3IgYSB0aW1lb3V0IG9mIDE1IHNlY29uZHMgZWxhcHNlcy4gV2hlbiB0aGUgbGF0dGVyCisgKiBoYXBwZW5zLCAtRVJFU1RBUlRTWVMgaXMgcmV0dXJuZWQuCisgKgorICogQ2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0IChmb3Igbm93KS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IHJwbXNnX3NlbmRfb2ZmY2hhbm5lbChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdTMyIHNyYywgdTMyIGRzdCwKKwkJCSAgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlyZXR1cm4gZXB0LT5vcHMtPnNlbmRfb2ZmY2hhbm5lbChlcHQsIHNyYywgZHN0LCBkYXRhLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTChycG1zZ19zZW5kX29mZmNoYW5uZWwpOworCisvKioKKyAqIHJwbXNnX3NlbmQoKSAtIHNlbmQgYSBtZXNzYWdlIGFjcm9zcyB0byB0aGUgcmVtb3RlIHByb2Nlc3NvcgorICogQGVwdDogdGhlIHJwbXNnIGVuZHBvaW50CisgKiBAZGF0YTogcGF5bG9hZCBvZiBtZXNzYWdlCisgKiBAbGVuOiBsZW5ndGggb2YgcGF5bG9hZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgQGRhdGEgb2YgbGVuZ3RoIEBsZW4gb24gdGhlIEBlcHQgZW5kcG9pbnQuCisgKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2hpY2ggdGhlIEBlcHQKKyAqIGVuZHBvaW50IGJlbG9uZ3MgdG8sIHVzaW5nIEBlcHQncyBhZGRyZXNzIGFzIHNvdXJjZSBhbmQgaXRzIGFzc29jaWF0ZWQKKyAqIHJwZGV2J3MgYWRkcmVzcyBhcyBkZXN0aW5hdGlvbi4KKyAqIEluIGNhc2UgdGhlcmUgYXJlIG5vIFRYIGJ1ZmZlcnMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gd2lsbCBpbW1lZGlhdGVseQorICogcmV0dXJuIC1FTk9NRU0gd2l0aG91dCB3YWl0aW5nIHVudGlsIG9uZSBiZWNvbWVzIGF2YWlsYWJsZS4KKyAqCisgKiBDYW4gb25seSBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgKGZvciBub3cpLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgcnBtc2dfdHJ5c2VuZChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlyZXR1cm4gZXB0LT5vcHMtPnRyeXNlbmQoZXB0LCBkYXRhLCBsZW4pOworfQorRVhQT1JUX1NZTUJPTChycG1zZ190cnlzZW5kKTsKKworLyoqCisgKiBycG1zZ19zZW5kdG8oKSAtIHNlbmQgYSBtZXNzYWdlIGFjcm9zcyB0byB0aGUgcmVtb3RlIHByb2Nlc3Nvciwgc3BlY2lmeSBkc3QKKyAqIEBlcHQ6IHRoZSBycG1zZyBlbmRwb2ludAorICogQGRhdGE6IHBheWxvYWQgb2YgbWVzc2FnZQorICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQKKyAqIEBkc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIEBkYXRhIG9mIGxlbmd0aCBAbGVuIHRvIHRoZSByZW1vdGUgQGRzdCBhZGRyZXNzLgorICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSByZW1vdGUgcHJvY2Vzc29yIHdoaWNoIHRoZSBAZXB0CisgKiBlbmRwb2ludCBiZWxvbmdzIHRvLCB1c2luZyBAZXB0J3MgYWRkcmVzcyBhcyBzb3VyY2UuCisgKiBJbiBjYXNlIHRoZXJlIGFyZSBubyBUWCBidWZmZXJzIGF2YWlsYWJsZSwgdGhlIGZ1bmN0aW9uIHdpbGwgaW1tZWRpYXRlbHkKKyAqIHJldHVybiAtRU5PTUVNIHdpdGhvdXQgd2FpdGluZyB1bnRpbCBvbmUgYmVjb21lcyBhdmFpbGFibGUuCisgKgorICogQ2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gcHJvY2VzcyBjb250ZXh0IChmb3Igbm93KS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IHJwbXNnX3RyeXNlbmR0byhzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbiwgdTMyIGRzdCkKK3sKKwlyZXR1cm4gZXB0LT5vcHMtPnRyeXNlbmR0byhlcHQsIGRhdGEsIGxlbiwgZHN0KTsKK30KK0VYUE9SVF9TWU1CT0wocnBtc2dfdHJ5c2VuZHRvKTsKKworLyoqCisgKiBycG1zZ19zZW5kX29mZmNoYW5uZWwoKSAtIHNlbmQgYSBtZXNzYWdlIHVzaW5nIGV4cGxpY2l0IHNyYy9kc3QgYWRkcmVzc2VzCisgKiBAZXB0OiB0aGUgcnBtc2cgZW5kcG9pbnQKKyAqIEBzcmM6IHNvdXJjZSBhZGRyZXNzCisgKiBAZHN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKiBAZGF0YTogcGF5bG9hZCBvZiBtZXNzYWdlCisgKiBAbGVuOiBsZW5ndGggb2YgcGF5bG9hZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgQGRhdGEgb2YgbGVuZ3RoIEBsZW4gdG8gdGhlIHJlbW90ZSBAZHN0IGFkZHJlc3MsCisgKiBhbmQgdXNlcyBAc3JjIGFzIHRoZSBzb3VyY2UgYWRkcmVzcy4KKyAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcmVtb3RlIHByb2Nlc3NvciB3aGljaCB0aGUgQGVwdAorICogZW5kcG9pbnQgYmVsb25ncyB0by4KKyAqIEluIGNhc2UgdGhlcmUgYXJlIG5vIFRYIGJ1ZmZlcnMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gd2lsbCBpbW1lZGlhdGVseQorICogcmV0dXJuIC1FTk9NRU0gd2l0aG91dCB3YWl0aW5nIHVudGlsIG9uZSBiZWNvbWVzIGF2YWlsYWJsZS4KKyAqCisgKiBDYW4gb25seSBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgKGZvciBub3cpLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvbiBmYWlsdXJlLgorICovCitpbnQgcnBtc2dfdHJ5c2VuZF9vZmZjaGFubmVsKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB1MzIgc3JjLCB1MzIgZHN0LAorCQkJICAgICB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXJldHVybiBlcHQtPm9wcy0+dHJ5c2VuZF9vZmZjaGFubmVsKGVwdCwgc3JjLCBkc3QsIGRhdGEsIGxlbik7Cit9CitFWFBPUlRfU1lNQk9MKHJwbXNnX3RyeXNlbmRfb2ZmY2hhbm5lbCk7CisKKy8qCisgKiBtYXRjaCBhbiBycG1zZyBjaGFubmVsIHdpdGggYSBjaGFubmVsIGluZm8gc3RydWN0LgorICogdGhpcyBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB3ZSdyZSBub3QgY3JlYXRpbmcgcnBtc2cgZGV2aWNlcyBmb3IgY2hhbm5lbHMKKyAqIHRoYXQgYWxyZWFkeSBleGlzdC4KKyAqLworc3RhdGljIGludCBycG1zZ19kZXZpY2VfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gKmNoaW5mbyA9IGRhdGE7CisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYgPSB0b19ycG1zZ19kZXZpY2UoZGV2KTsKKworCWlmIChjaGluZm8tPnNyYyAhPSBSUE1TR19BRERSX0FOWSAmJiBjaGluZm8tPnNyYyAhPSBycGRldi0+c3JjKQorCQlyZXR1cm4gMDsKKworCWlmIChjaGluZm8tPmRzdCAhPSBSUE1TR19BRERSX0FOWSAmJiBjaGluZm8tPmRzdCAhPSBycGRldi0+ZHN0KQorCQlyZXR1cm4gMDsKKworCWlmIChzdHJuY21wKGNoaW5mby0+bmFtZSwgcnBkZXYtPmlkLm5hbWUsIFJQTVNHX05BTUVfU0laRSkpCisJCXJldHVybiAwOworCisJLyogZm91bmQgYSBtYXRjaCAhICovCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBkZXZpY2UgKnJwbXNnX2ZpbmRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJCQkgc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyAqY2hpbmZvKQoreworCXJldHVybiBkZXZpY2VfZmluZF9jaGlsZChwYXJlbnQsIGNoaW5mbywgcnBtc2dfZGV2aWNlX21hdGNoKTsKKworfQorRVhQT1JUX1NZTUJPTChycG1zZ19maW5kX2RldmljZSk7CisKKy8qIHN5c2ZzIHNob3cgY29uZmlndXJhdGlvbiBmaWVsZHMgKi8KKyNkZWZpbmUgcnBtc2dfc2hvd19hdHRyKGZpZWxkLCBwYXRoLCBmb3JtYXRfc3RyaW5nKQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitmaWVsZCMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJCQkJXAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiA9IHRvX3JwbXNnX2RldmljZShkZXYpOwkJXAorCQkJCQkJCQkJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgZm9ybWF0X3N0cmluZywgcnBkZXYtPnBhdGgpOwkJXAorfQorCisvKiBmb3IgbW9yZSBpbmZvLCBzZWUgRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtcnBtc2cgKi8KK3JwbXNnX3Nob3dfYXR0cihuYW1lLCBpZC5uYW1lLCAiJXNcbiIpOworcnBtc2dfc2hvd19hdHRyKHNyYywgc3JjLCAiMHgleFxuIik7CitycG1zZ19zaG93X2F0dHIoZHN0LCBkc3QsICIweCV4XG4iKTsKK3JwbXNnX3Nob3dfYXR0cihhbm5vdW5jZSwgYW5ub3VuY2UgPyAidHJ1ZSIgOiAiZmFsc2UiLCAiJXNcbiIpOworCitzdGF0aWMgc3NpemVfdCBtb2RhbGlhc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiA9IHRvX3JwbXNnX2RldmljZShkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCBSUE1TR19ERVZJQ0VfTU9EQUxJQVNfRk1UICJcbiIsIHJwZGV2LT5pZC5uYW1lKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHJwbXNnX2Rldl9hdHRyc1tdID0geworCV9fQVRUUl9STyhuYW1lKSwKKwlfX0FUVFJfUk8obW9kYWxpYXMpLAorCV9fQVRUUl9STyhkc3QpLAorCV9fQVRUUl9STyhzcmMpLAorCV9fQVRUUl9STyhhbm5vdW5jZSksCisJX19BVFRSX05VTEwKK307CisKKy8qIHJwbXNnIGRldmljZXMgYW5kIGRyaXZlcnMgYXJlIG1hdGNoZWQgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSAqLworc3RhdGljIGlubGluZSBpbnQgcnBtc2dfaWRfbWF0Y2goY29uc3Qgc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcnBtc2dfZGV2aWNlX2lkICppZCkKK3sKKwlyZXR1cm4gc3RybmNtcChpZC0+bmFtZSwgcnBkZXYtPmlkLm5hbWUsIFJQTVNHX05BTUVfU0laRSkgPT0gMDsKK30KKworLyogbWF0Y2ggcnBtc2cgY2hhbm5lbCBhbmQgcnBtc2cgZHJpdmVyICovCitzdGF0aWMgaW50IHJwbXNnX2Rldl9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYgPSB0b19ycG1zZ19kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnBtc2dfZHJpdmVyICpycGRydiA9IHRvX3JwbXNnX2RyaXZlcihkcnYpOworCWNvbnN0IHN0cnVjdCBycG1zZ19kZXZpY2VfaWQgKmlkcyA9IHJwZHJ2LT5pZF90YWJsZTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChpZHMpCisJCWZvciAoaSA9IDA7IGlkc1tpXS5uYW1lWzBdOyBpKyspCisJCQlpZiAocnBtc2dfaWRfbWF0Y2gocnBkZXYsICZpZHNbaV0pKQorCQkJCXJldHVybiAxOworCisJcmV0dXJuIG9mX2RyaXZlcl9tYXRjaF9kZXZpY2UoZGV2LCBkcnYpOworfQorCitzdGF0aWMgaW50IHJwbXNnX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKK3sKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiA9IHRvX3JwbXNnX2RldmljZShkZXYpOworCisJcmV0dXJuIGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPSIgUlBNU0dfREVWSUNFX01PREFMSUFTX0ZNVCwKKwkJCQkJcnBkZXYtPmlkLm5hbWUpOworfQorCisvKgorICogd2hlbiBhbiBycG1zZyBkcml2ZXIgaXMgcHJvYmVkIHdpdGggYSBjaGFubmVsLCB3ZSBzZWFtbGVzc2x5IGNyZWF0ZQorICogaXQgYW4gZW5kcG9pbnQsIGJpbmRpbmcgaXRzIHJ4IGNhbGxiYWNrIHRvIGEgdW5pcXVlIGxvY2FsIHJwbXNnCisgKiBhZGRyZXNzLgorICoKKyAqIGlmIHdlIG5lZWQgdG8sIHdlIGFsc28gYW5ub3VuY2UgYWJvdXQgdGhpcyBjaGFubmVsIHRvIHRoZSByZW1vdGUKKyAqIHByb2Nlc3NvciAobmVlZGVkIGluIGNhc2UgdGhlIGRyaXZlciBpcyBleHBvc2luZyBhbiBycG1zZyBzZXJ2aWNlKS4KKyAqLworc3RhdGljIGludCBycG1zZ19kZXZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2ID0gdG9fcnBtc2dfZGV2aWNlKGRldik7CisJc3RydWN0IHJwbXNnX2RyaXZlciAqcnBkcnYgPSB0b19ycG1zZ19kcml2ZXIocnBkZXYtPmRldi5kcml2ZXIpOworCXN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gY2hpbmZvID0ge307CisJc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQ7CisJaW50IGVycjsKKworCXN0cm5jcHkoY2hpbmZvLm5hbWUsIHJwZGV2LT5pZC5uYW1lLCBSUE1TR19OQU1FX1NJWkUpOworCWNoaW5mby5zcmMgPSBycGRldi0+c3JjOworCWNoaW5mby5kc3QgPSBSUE1TR19BRERSX0FOWTsKKworCWVwdCA9IHJwbXNnX2NyZWF0ZV9lcHQocnBkZXYsIHJwZHJ2LT5jYWxsYmFjaywgTlVMTCwgY2hpbmZvKTsKKwlpZiAoIWVwdCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgZW5kcG9pbnRcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlycGRldi0+ZXB0ID0gZXB0OworCXJwZGV2LT5zcmMgPSBlcHQtPmFkZHI7CisKKwllcnIgPSBycGRydi0+cHJvYmUocnBkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICIlczogZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIGVycik7CisJCXJwbXNnX2Rlc3Ryb3lfZXB0KGVwdCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChycGRldi0+b3BzLT5hbm5vdW5jZV9jcmVhdGUpCisJCWVyciA9IHJwZGV2LT5vcHMtPmFubm91bmNlX2NyZWF0ZShycGRldik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBycG1zZ19kZXZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiA9IHRvX3JwbXNnX2RldmljZShkZXYpOworCXN0cnVjdCBycG1zZ19kcml2ZXIgKnJwZHJ2ID0gdG9fcnBtc2dfZHJpdmVyKHJwZGV2LT5kZXYuZHJpdmVyKTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChycGRldi0+b3BzLT5hbm5vdW5jZV9kZXN0cm95KQorCQllcnIgPSBycGRldi0+b3BzLT5hbm5vdW5jZV9kZXN0cm95KHJwZGV2KTsKKworCXJwZHJ2LT5yZW1vdmUocnBkZXYpOworCisJcnBtc2dfZGVzdHJveV9lcHQocnBkZXYtPmVwdCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIHJwbXNnX2J1cyA9IHsKKwkubmFtZQkJPSAicnBtc2ciLAorCS5tYXRjaAkJPSBycG1zZ19kZXZfbWF0Y2gsCisJLmRldl9hdHRycwk9IHJwbXNnX2Rldl9hdHRycywKKwkudWV2ZW50CQk9IHJwbXNnX3VldmVudCwKKwkucHJvYmUJCT0gcnBtc2dfZGV2X3Byb2JlLAorCS5yZW1vdmUJCT0gcnBtc2dfZGV2X3JlbW92ZSwKK307CisKK3N0YXRpYyB2b2lkIHJwbXNnX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiA9IHRvX3JwbXNnX2RldmljZShkZXYpOworCisJa2ZyZWUocnBkZXYpOworfQorCitpbnQgcnBtc2dfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZycGRldi0+ZGV2OworCWludCByZXQ7CisKKwlkZXZfc2V0X25hbWUoJnJwZGV2LT5kZXYsICIlczolcyIsCisJCSAgICAgZGV2X25hbWUoZGV2LT5wYXJlbnQpLCBycGRldi0+aWQubmFtZSk7CisKKwlycGRldi0+ZGV2LmJ1cyA9ICZycG1zZ19idXM7CisJcnBkZXYtPmRldi5yZWxlYXNlID0gcnBtc2dfcmVsZWFzZV9kZXZpY2U7CisKKwlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJnJwZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJkZXZpY2VfcmVnaXN0ZXIgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJcHV0X2RldmljZSgmcnBkZXYtPmRldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wocnBtc2dfcmVnaXN0ZXJfZGV2aWNlKTsKKworLyoKKyAqIGZpbmQgYW4gZXhpc3RpbmcgY2hhbm5lbCB1c2luZyBpdHMgbmFtZSArIGFkZHJlc3MgcHJvcGVydGllcywKKyAqIGFuZCBkZXN0cm95IGl0CisgKi8KK2ludCBycG1zZ191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkgICAgc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyAqY2hpbmZvKQoreworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCWRldiA9IHJwbXNnX2ZpbmRfZGV2aWNlKHBhcmVudCwgY2hpbmZvKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOworCisJcHV0X2RldmljZShkZXYpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHJwbXNnX3VucmVnaXN0ZXJfZGV2aWNlKTsKKworLyoqCisgKiBfX3JlZ2lzdGVyX3JwbXNnX2RyaXZlcigpIC0gcmVnaXN0ZXIgYW4gcnBtc2cgZHJpdmVyIHdpdGggdGhlIHJwbXNnIGJ1cworICogQHJwZHJ2OiBwb2ludGVyIHRvIGEgc3RydWN0IHJwbXNnX2RyaXZlcgorICogQG93bmVyOiBvd25pbmcgbW9kdWxlL2RyaXZlcgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KKyAqLworaW50IF9fcmVnaXN0ZXJfcnBtc2dfZHJpdmVyKHN0cnVjdCBycG1zZ19kcml2ZXIgKnJwZHJ2LCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwlycGRydi0+ZHJ2LmJ1cyA9ICZycG1zZ19idXM7CisJcnBkcnYtPmRydi5vd25lciA9IG93bmVyOworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJnJwZHJ2LT5kcnYpOworfQorRVhQT1JUX1NZTUJPTChfX3JlZ2lzdGVyX3JwbXNnX2RyaXZlcik7CisKKy8qKgorICogdW5yZWdpc3Rlcl9ycG1zZ19kcml2ZXIoKSAtIHVucmVnaXN0ZXIgYW4gcnBtc2cgZHJpdmVyIGZyb20gdGhlIHJwbXNnIGJ1cworICogQHJwZHJ2OiBwb2ludGVyIHRvIGEgc3RydWN0IHJwbXNnX2RyaXZlcgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhbmQgYW4gYXBwcm9wcmlhdGUgZXJyb3IgdmFsdWUgb24gZmFpbHVyZS4KKyAqLwordm9pZCB1bnJlZ2lzdGVyX3JwbXNnX2RyaXZlcihzdHJ1Y3QgcnBtc2dfZHJpdmVyICpycGRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmcnBkcnYtPmRydik7Cit9CitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfcnBtc2dfZHJpdmVyKTsKKworCitzdGF0aWMgaW50IF9faW5pdCBycG1zZ19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGJ1c19yZWdpc3RlcigmcnBtc2dfYnVzKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBycG1zZyBidXM6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KK3Bvc3Rjb3JlX2luaXRjYWxsKHJwbXNnX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcnBtc2dfZmluaSh2b2lkKQoreworCWJ1c191bnJlZ2lzdGVyKCZycG1zZ19idXMpOworfQorbW9kdWxlX2V4aXQocnBtc2dfZmluaSk7CisKK01PRFVMRV9ERVNDUklQVElPTigicmVtb3RlIHByb2Nlc3NvciBtZXNzYWdpbmcgYnVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JwbXNnL3JwbXNnX2ludGVybmFsLmggYi9kcml2ZXJzL3JwbXNnL3JwbXNnX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3NWEyMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnBtc2cvcnBtc2dfaW50ZXJuYWwuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogcmVtb3RlIHByb2Nlc3NvciBtZXNzYWdpbmcgYnVzIGludGVybmFscworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSwgSW5jLgorICoKKyAqIE9oYWQgQmVuLUNvaGVuIDxvaGFkQHdpemVyeS5jb20+CisgKiBCcmlhbiBTd2V0bGFuZCA8c3dldGxhbmRAZ29vZ2xlLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19SUE1TR19JTlRFUk5BTF9IX18KKyNkZWZpbmUgX19SUE1TR19JTlRFUk5BTF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3JwbXNnLmg+CisKKyNkZWZpbmUgdG9fcnBtc2dfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgcnBtc2dfZGV2aWNlLCBkZXYpCisjZGVmaW5lIHRvX3JwbXNnX2RyaXZlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHJwbXNnX2RyaXZlciwgZHJ2KQorCisvKioKKyAqIHN0cnVjdCBycG1zZ19kZXZpY2Vfb3BzIC0gaW5kaXJlY3Rpb24gdGFibGUgZm9yIHRoZSBycG1zZ19kZXZpY2Ugb3BlcmF0aW9ucworICogQGNyZWF0ZV9lcHQ6CQljcmVhdGUgYmFja2VuZC1zcGVjaWZpYyBlbmRwb2ludCwgcmVxdXJpZWQKKyAqIEBhbm5vdW5jZV9jcmVhdGU6CWFubm91bmNlIHByZXNlbmNlIG9mIG5ldyBjaGFubmVsLCBvcHRpb25hbAorICogQGFubm91bmNlX2Rlc3Ryb3k6CWFubm91bmNlIGRlc3RydWN0aW9uIG9mIGNoYW5uZWwsIG9wdGlvbmFsCisgKgorICogSW5kaXJlY3Rpb24gdGFibGUgZm9yIHRoZSBvcGVyYXRpb25zIHRoYXQgYSBycG1zZyBiYWNrZW5kIHNob3VsZCBpbXBsZW1lbnQuCisgKiBAYW5ub3VuY2VfY3JlYXRlIGFuZCBAYW5ub3VuY2VfZGVzdHJveSBhcmUgb3B0aW9uYWwgYXMgdGhlIGJhY2tlbmQgbWlnaHQKKyAqIGFkdmVydGlzZSBuZXcgY2hhbm5lbHMgaW1wbGljaXRseSBieSBjcmVhdGluZyB0aGUgZW5kcG9pbnRzLgorICovCitzdHJ1Y3QgcnBtc2dfZGV2aWNlX29wcyB7CisJc3RydWN0IHJwbXNnX2VuZHBvaW50ICooKmNyZWF0ZV9lcHQpKHN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2LAorCQkJCQkgICAgcnBtc2dfcnhfY2JfdCBjYiwgdm9pZCAqcHJpdiwKKwkJCQkJICAgIHN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gY2hpbmZvKTsKKworCWludCAoKmFubm91bmNlX2NyZWF0ZSkoc3RydWN0IHJwbXNnX2RldmljZSAqZXB0KTsKKwlpbnQgKCphbm5vdW5jZV9kZXN0cm95KShzdHJ1Y3QgcnBtc2dfZGV2aWNlICplcHQpOworfTsKKworLyoqCisgKiBzdHJ1Y3QgcnBtc2dfZW5kcG9pbnRfb3BzIC0gaW5kaXJlY3Rpb24gdGFibGUgZm9yIHJwbXNnX2VuZHBvaW50IG9wZXJhdGlvbnMKKyAqIEBkZXN0cm95X2VwdDoJZGVzdHJveSB0aGUgZ2l2ZW4gZW5kcG9pbnQsIHJlcXVpcmVkCisgKiBAc2VuZDoJCXNlZSBAcnBtc2dfc2VuZCgpLCByZXF1aXJlZAorICogQHNlbmR0bzoJCXNlZSBAcnBtc2dfc2VuZHRvKCksIG9wdGlvbmFsCisgKiBAc2VuZF9vZmZjaGFubmVsOglzZWUgQHJwbXNnX3NlbmRfb2ZmY2hhbm5lbCgpLCBvcHRpb25hbAorICogQHRyeXNlbmQ6CQlzZWUgQHJwbXNnX3RyeXNlbmQoKSwgcmVxdWlyZWQKKyAqIEB0cnlzZW5kdG86CQlzZWUgQHJwbXNnX3RyeXNlbmR0bygpLCBvcHRpb25hbAorICogQHRyeXNlbmRfb2ZmY2hhbm5lbDoJc2VlIEBycG1zZ190cnlzZW5kX29mZmNoYW5uZWwoKSwgb3B0aW9uYWwKKyAqCisgKiBJbmRpcmVjdGlvbiB0YWJsZSBmb3IgdGhlIG9wZXJhdGlvbnMgdGhhdCBhIHJwbXNnIGJhY2tlbmQgc2hvdWxkIGltcGxlbWVudC4KKyAqIEluIGFkZGl0aW9uIHRvIEBkZXN0cm95X2VwdCwgdGhlIGJhY2tlbmQgbXVzdCBhdCBsZWFzdCBpbXBsZW1lbnQgQHNlbmQgYW5kCisgKiBAdHJ5c2VuZCwgd2hpbGUgdGhlIHZhcmlhbnRzIHNlbmRpbmcgZGF0YSBvZmYtY2hhbm5lbCBhcmUgb3B0aW9uYWwuCisgKi8KK3N0cnVjdCBycG1zZ19lbmRwb2ludF9vcHMgeworCXZvaWQgKCpkZXN0cm95X2VwdCkoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQpOworCisJaW50ICgqc2VuZCkoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4pOworCWludCAoKnNlbmR0bykoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4sIHUzMiBkc3QpOworCWludCAoKnNlbmRfb2ZmY2hhbm5lbCkoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHUzMiBzcmMsIHUzMiBkc3QsCisJCQkJICB2b2lkICpkYXRhLCBpbnQgbGVuKTsKKworCWludCAoKnRyeXNlbmQpKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKKwlpbnQgKCp0cnlzZW5kdG8pKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuLCB1MzIgZHN0KTsKKwlpbnQgKCp0cnlzZW5kX29mZmNoYW5uZWwpKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB1MzIgc3JjLCB1MzIgZHN0LAorCQkJICAgICB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK307CisKK2ludCBycG1zZ19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYpOworaW50IHJwbXNnX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJCSAgICBzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvICpjaGluZm8pOworCitzdHJ1Y3QgZGV2aWNlICpycG1zZ19maW5kX2RldmljZShzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJIHN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gKmNoaW5mbyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ycG1zZy92aXJ0aW9fcnBtc2dfYnVzLmMgYi9kcml2ZXJzL3JwbXNnL3ZpcnRpb19ycG1zZ19idXMuYwppbmRleCBmZTAzYjJhLi4zMDkwYjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JwbXNnL3ZpcnRpb19ycG1zZ19idXMuYworKysgYi9kcml2ZXJzL3JwbXNnL3ZpcnRpb19ycG1zZ19idXMuYwpAQCAtMzMsNiArMzMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9ycG1zZy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisKKyNpbmNsdWRlICJycG1zZ19pbnRlcm5hbC5oIgogCiAvKioKICAqIHN0cnVjdCB2aXJ0cHJvY19pbmZvIC0gdmlydHVhbCByZW1vdGUgcHJvY2Vzc29yIHN0YXRlCkBAIC03MiwyMCArNzUsNjkgQEAKIAlzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKm5zX2VwdDsKIH07CiAKKy8qIFRoZSBmZWF0dXJlIGJpdG1hcCBmb3IgdmlydGlvIHJwbXNnICovCisjZGVmaW5lIFZJUlRJT19SUE1TR19GX05TCTAgLyogUlAgc3VwcG9ydHMgbmFtZSBzZXJ2aWNlIG5vdGlmaWNhdGlvbnMgKi8KKwogLyoqCi0gKiBzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvIC0gaW50ZXJuYWwgY2hhbm5lbCBpbmZvIHJlcHJlc2VudGF0aW9uCi0gKiBAbmFtZTogbmFtZSBvZiBzZXJ2aWNlCi0gKiBAc3JjOiBsb2NhbCBhZGRyZXNzCisgKiBzdHJ1Y3QgcnBtc2dfaGRyIC0gY29tbW9uIGhlYWRlciBmb3IgYWxsIHJwbXNnIG1lc3NhZ2VzCisgKiBAc3JjOiBzb3VyY2UgYWRkcmVzcwogICogQGRzdDogZGVzdGluYXRpb24gYWRkcmVzcworICogQHJlc2VydmVkOiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQgKGluIGJ5dGVzKQorICogQGZsYWdzOiBtZXNzYWdlIGZsYWdzCisgKiBAZGF0YTogQGxlbiBieXRlcyBvZiBtZXNzYWdlIHBheWxvYWQgZGF0YQorICoKKyAqIEV2ZXJ5IG1lc3NhZ2Ugc2VudCgvcmVjZWl2ZWQpIG9uIHRoZSBycG1zZyBidXMgYmVnaW5zIHdpdGggdGhpcyBoZWFkZXIuCiAgKi8KLXN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gewotCWNoYXIgbmFtZVtSUE1TR19OQU1FX1NJWkVdOworc3RydWN0IHJwbXNnX2hkciB7CiAJdTMyIHNyYzsKIAl1MzIgZHN0OworCXUzMiByZXNlcnZlZDsKKwl1MTYgbGVuOworCXUxNiBmbGFnczsKKwl1OCBkYXRhWzBdOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgcnBtc2dfbnNfbXNnIC0gZHluYW1pYyBuYW1lIHNlcnZpY2UgYW5ub3VuY2VtZW50IG1lc3NhZ2UKKyAqIEBuYW1lOiBuYW1lIG9mIHJlbW90ZSBzZXJ2aWNlIHRoYXQgaXMgcHVibGlzaGVkCisgKiBAYWRkcjogYWRkcmVzcyBvZiByZW1vdGUgc2VydmljZSB0aGF0IGlzIHB1Ymxpc2hlZAorICogQGZsYWdzOiBpbmRpY2F0ZXMgd2hldGhlciBzZXJ2aWNlIGlzIGNyZWF0ZWQgb3IgZGVzdHJveWVkCisgKgorICogVGhpcyBtZXNzYWdlIGlzIHNlbnQgYWNyb3NzIHRvIHB1Ymxpc2ggYSBuZXcgc2VydmljZSwgb3IgYW5ub3VuY2UKKyAqIGFib3V0IGl0cyByZW1vdmFsLiBXaGVuIHdlIHJlY2VpdmUgdGhlc2UgbWVzc2FnZXMsIGFuIGFwcHJvcHJpYXRlCisgKiBycG1zZyBjaGFubmVsIChpLmUgZGV2aWNlKSBpcyBjcmVhdGVkL2Rlc3Ryb3llZC4gSW4gdHVybiwgdGhlIC0+cHJvYmUoKQorICogb3IgLT5yZW1vdmUoKSBoYW5kbGVyIG9mIHRoZSBhcHByb3ByaWF0ZSBycG1zZyBkcml2ZXIgd2lsbCBiZSBpbnZva2VkCisgKiAoaWYvYXMtc29vbi1hcyBvbmUgaXMgcmVnaXN0ZXJlZCkuCisgKi8KK3N0cnVjdCBycG1zZ19uc19tc2cgeworCWNoYXIgbmFtZVtSUE1TR19OQU1FX1NJWkVdOworCXUzMiBhZGRyOworCXUzMiBmbGFnczsKK30gX19wYWNrZWQ7CisKKy8qKgorICogZW51bSBycG1zZ19uc19mbGFncyAtIGR5bmFtaWMgbmFtZSBzZXJ2aWNlIGFubm91bmNlbWVudCBmbGFncworICoKKyAqIEBSUE1TR19OU19DUkVBVEU6IGEgbmV3IHJlbW90ZSBzZXJ2aWNlIHdhcyBqdXN0IGNyZWF0ZWQKKyAqIEBSUE1TR19OU19ERVNUUk9ZOiBhIGtub3duIHJlbW90ZSBzZXJ2aWNlIHdhcyBqdXN0IGRlc3Ryb3llZAorICovCitlbnVtIHJwbXNnX25zX2ZsYWdzIHsKKwlSUE1TR19OU19DUkVBVEUJCT0gMCwKKwlSUE1TR19OU19ERVNUUk9ZCT0gMSwKIH07CiAKLSNkZWZpbmUgdG9fcnBtc2dfY2hhbm5lbChkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHJwbXNnX2NoYW5uZWwsIGRldikKLSNkZWZpbmUgdG9fcnBtc2dfZHJpdmVyKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgcnBtc2dfZHJpdmVyLCBkcnYpCisvKioKKyAqIEB2cnA6IHRoZSByZW1vdGUgcHJvY2Vzc29yIHRoaXMgY2hhbm5lbCBiZWxvbmdzIHRvCisgKi8KK3N0cnVjdCB2aXJ0aW9fcnBtc2dfY2hhbm5lbCB7CisJc3RydWN0IHJwbXNnX2RldmljZSBycGRldjsKKworCXN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnA7Cit9OworCisjZGVmaW5lIHRvX3ZpcnRpb19ycG1zZ19jaGFubmVsKF9ycGRldikgXAorCWNvbnRhaW5lcl9vZihfcnBkZXYsIHN0cnVjdCB2aXJ0aW9fcnBtc2dfY2hhbm5lbCwgcnBkZXYpCiAKIC8qCiAgKiBXZSdyZSBhbGxvY2F0aW5nIGJ1ZmZlcnMgb2YgNTEyIGJ5dGVzIGVhY2ggZm9yIGNvbW11bmljYXRpb25zLiBUaGUKQEAgLTExOCw3OCArMTcwLDI4IEBACiAvKiBBZGRyZXNzIDUzIGlzIHJlc2VydmVkIGZvciBhZHZlcnRpc2luZyByZW1vdGUgc2VydmljZXMgKi8KICNkZWZpbmUgUlBNU0dfTlNfQUREUgkJCSg1MykKIAotLyogc3lzZnMgc2hvdyBjb25maWd1cmF0aW9uIGZpZWxkcyAqLwotI2RlZmluZSBycG1zZ19zaG93X2F0dHIoZmllbGQsIHBhdGgsIGZvcm1hdF9zdHJpbmcpCQkJXAotc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKLWZpZWxkIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJCQlcCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQlcCi17CQkJCQkJCQkJXAotCXN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiA9IHRvX3JwbXNnX2NoYW5uZWwoZGV2KTsJCVwKLQkJCQkJCQkJCVwKLQlyZXR1cm4gc3ByaW50ZihidWYsIGZvcm1hdF9zdHJpbmcsIHJwZGV2LT5wYXRoKTsJCVwKLX0KK3N0YXRpYyB2b2lkIHZpcnRpb19ycG1zZ19kZXN0cm95X2VwdChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCk7CitzdGF0aWMgaW50IHZpcnRpb19ycG1zZ19zZW5kKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgdmlydGlvX3JwbXNnX3NlbmR0byhzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbiwKKwkJCSAgICAgICB1MzIgZHN0KTsKK3N0YXRpYyBpbnQgdmlydGlvX3JwbXNnX3NlbmRfb2ZmY2hhbm5lbChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdTMyIHNyYywKKwkJCQkJdTMyIGRzdCwgdm9pZCAqZGF0YSwgaW50IGxlbik7CitzdGF0aWMgaW50IHZpcnRpb19ycG1zZ190cnlzZW5kKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK3N0YXRpYyBpbnQgdmlydGlvX3JwbXNnX3RyeXNlbmR0byhzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwKKwkJCQkgIGludCBsZW4sIHUzMiBkc3QpOworc3RhdGljIGludCB2aXJ0aW9fcnBtc2dfdHJ5c2VuZF9vZmZjaGFubmVsKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB1MzIgc3JjLAorCQkJCQkgICB1MzIgZHN0LCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKIAotLyogZm9yIG1vcmUgaW5mbywgc2VlIERvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXJwbXNnICovCi1ycG1zZ19zaG93X2F0dHIobmFtZSwgaWQubmFtZSwgIiVzXG4iKTsKLXJwbXNnX3Nob3dfYXR0cihzcmMsIHNyYywgIjB4JXhcbiIpOwotcnBtc2dfc2hvd19hdHRyKGRzdCwgZHN0LCAiMHgleFxuIik7Ci1ycG1zZ19zaG93X2F0dHIoYW5ub3VuY2UsIGFubm91bmNlID8gInRydWUiIDogImZhbHNlIiwgIiVzXG4iKTsKLQotLyoKLSAqIFVuaXF1ZSAoYW5kIGZyZWUgcnVubmluZykgaW5kZXggZm9yIHJwbXNnIGRldmljZXMuCi0gKgotICogWWVhaCwgd2UncmUgbm90IHJlY3ljbGluZyB0aG9zZSBudW1iZXJzICh5ZXQ/KS4gd2lsbCBiZSBlYXN5Ci0gKiB0byBjaGFuZ2UgaWYvd2hlbiB3ZSB3YW50IHRvLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHJwbXNnX2Rldl9pbmRleDsKLQotc3RhdGljIHNzaXplX3QgbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2ID0gdG9fcnBtc2dfY2hhbm5lbChkZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCBSUE1TR19ERVZJQ0VfTU9EQUxJQVNfRk1UICJcbiIsIHJwZGV2LT5pZC5uYW1lKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHJwbXNnX2Rldl9hdHRyc1tdID0gewotCV9fQVRUUl9STyhuYW1lKSwKLQlfX0FUVFJfUk8obW9kYWxpYXMpLAotCV9fQVRUUl9STyhkc3QpLAotCV9fQVRUUl9STyhzcmMpLAotCV9fQVRUUl9STyhhbm5vdW5jZSksCi0JX19BVFRSX05VTEwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnBtc2dfZW5kcG9pbnRfb3BzIHZpcnRpb19lbmRwb2ludF9vcHMgPSB7CisJLmRlc3Ryb3lfZXB0ID0gdmlydGlvX3JwbXNnX2Rlc3Ryb3lfZXB0LAorCS5zZW5kID0gdmlydGlvX3JwbXNnX3NlbmQsCisJLnNlbmR0byA9IHZpcnRpb19ycG1zZ19zZW5kdG8sCisJLnNlbmRfb2ZmY2hhbm5lbCA9IHZpcnRpb19ycG1zZ19zZW5kX29mZmNoYW5uZWwsCisJLnRyeXNlbmQgPSB2aXJ0aW9fcnBtc2dfdHJ5c2VuZCwKKwkudHJ5c2VuZHRvID0gdmlydGlvX3JwbXNnX3RyeXNlbmR0bywKKwkudHJ5c2VuZF9vZmZjaGFubmVsID0gdmlydGlvX3JwbXNnX3RyeXNlbmRfb2ZmY2hhbm5lbCwKIH07CiAKLS8qIHJwbXNnIGRldmljZXMgYW5kIGRyaXZlcnMgYXJlIG1hdGNoZWQgdXNpbmcgdGhlIHNlcnZpY2UgbmFtZSAqLwotc3RhdGljIGlubGluZSBpbnQgcnBtc2dfaWRfbWF0Y2goY29uc3Qgc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2LAotCQkJCSAgY29uc3Qgc3RydWN0IHJwbXNnX2RldmljZV9pZCAqaWQpCi17Ci0JcmV0dXJuIHN0cm5jbXAoaWQtPm5hbWUsIHJwZGV2LT5pZC5uYW1lLCBSUE1TR19OQU1FX1NJWkUpID09IDA7Ci19Ci0KLS8qIG1hdGNoIHJwbXNnIGNoYW5uZWwgYW5kIHJwbXNnIGRyaXZlciAqLwotc3RhdGljIGludCBycG1zZ19kZXZfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQotewotCXN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiA9IHRvX3JwbXNnX2NoYW5uZWwoZGV2KTsKLQlzdHJ1Y3QgcnBtc2dfZHJpdmVyICpycGRydiA9IHRvX3JwbXNnX2RyaXZlcihkcnYpOwotCWNvbnN0IHN0cnVjdCBycG1zZ19kZXZpY2VfaWQgKmlkcyA9IHJwZHJ2LT5pZF90YWJsZTsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGlkc1tpXS5uYW1lWzBdOyBpKyspCi0JCWlmIChycG1zZ19pZF9tYXRjaChycGRldiwgJmlkc1tpXSkpCi0JCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJwbXNnX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKLXsKLQlzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYgPSB0b19ycG1zZ19jaGFubmVsKGRldik7Ci0KLQlyZXR1cm4gYWRkX3VldmVudF92YXIoZW52LCAiTU9EQUxJQVM9IiBSUE1TR19ERVZJQ0VfTU9EQUxJQVNfRk1ULAotCQkJCQlycGRldi0+aWQubmFtZSk7Ci19Ci0KIC8qKgogICogX19lcHRfcmVsZWFzZSgpIC0gZGVhbGxvY2F0ZSBhbiBycG1zZyBlbmRwb2ludAogICogQGtyZWY6IHRoZSBlcHQncyByZWZlcmVuY2UgY291bnQKQEAgLTIxMiwxOCArMjE0LDE3IEBACiAKIC8qIGZvciBtb3JlIGluZm8sIHNlZSBiZWxvdyBkb2N1bWVudGF0aW9uIG9mIHJwbXNnX2NyZWF0ZV9lcHQoKSAqLwogc3RhdGljIHN0cnVjdCBycG1zZ19lbmRwb2ludCAqX19ycG1zZ19jcmVhdGVfZXB0KHN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnAsCi0JCXN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiwgcnBtc2dfcnhfY2JfdCBjYiwKLQkJdm9pZCAqcHJpdiwgdTMyIGFkZHIpCisJCQkJCQkgc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYsCisJCQkJCQkgcnBtc2dfcnhfY2JfdCBjYiwKKwkJCQkJCSB2b2lkICpwcml2LCB1MzIgYWRkcikKIHsKIAlpbnQgaWRfbWluLCBpZF9tYXgsIGlkOwogCXN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJwZGV2ID8gJnJwZGV2LT5kZXYgOiAmdnJwLT52ZGV2LT5kZXY7CiAKIAllcHQgPSBremFsbG9jKHNpemVvZigqZXB0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlcHQpIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8ga3phbGxvYyBhIG5ldyBlcHRcbiIpOworCWlmICghZXB0KQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlrcmVmX2luaXQoJmVwdC0+cmVmY291bnQpOwogCW11dGV4X2luaXQoJmVwdC0+Y2JfbG9jayk7CkBAIC0yMzEsNiArMjMyLDcgQEAKIAllcHQtPnJwZGV2ID0gcnBkZXY7CiAJZXB0LT5jYiA9IGNiOwogCWVwdC0+cHJpdiA9IHByaXY7CisJZXB0LT5vcHMgPSAmdmlydGlvX2VuZHBvaW50X29wczsKIAogCS8qIGRvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBsb2NhbCBhZGRyZXNzID8gKi8KIAlpZiAoYWRkciA9PSBSUE1TR19BRERSX0FOWSkgewpAQCAtMjYxLDUyICsyNjMsMTUgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotLyoqCi0gKiBycG1zZ19jcmVhdGVfZXB0KCkgLSBjcmVhdGUgYSBuZXcgcnBtc2dfZW5kcG9pbnQKLSAqIEBycGRldjogcnBtc2cgY2hhbm5lbCBkZXZpY2UKLSAqIEBjYjogcnggY2FsbGJhY2sgaGFuZGxlcgotICogQHByaXY6IHByaXZhdGUgZGF0YSBmb3IgdGhlIGRyaXZlcidzIHVzZQotICogQGFkZHI6IGxvY2FsIHJwbXNnIGFkZHJlc3MgdG8gYmluZCB3aXRoIEBjYgotICoKLSAqIEV2ZXJ5IHJwbXNnIGFkZHJlc3MgaW4gdGhlIHN5c3RlbSBpcyBib3VuZCB0byBhbiByeCBjYWxsYmFjayAoc28gd2hlbgotICogaW5ib3VuZCBtZXNzYWdlcyBhcnJpdmUsIHRoZXkgYXJlIGRpc3BhdGNoZWQgYnkgdGhlIHJwbXNnIGJ1cyB1c2luZyB0aGUKLSAqIGFwcHJvcHJpYXRlIGNhbGxiYWNrIGhhbmRsZXIpIGJ5IG1lYW5zIG9mIGFuIHJwbXNnX2VuZHBvaW50IHN0cnVjdC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBkcml2ZXJzIHRvIGNyZWF0ZSBzdWNoIGFuIGVuZHBvaW50LCBhbmQgYnkgdGhhdCwKLSAqIGJpbmQgYSBjYWxsYmFjaywgYW5kIHBvc3NpYmx5IHNvbWUgcHJpdmF0ZSBkYXRhIHRvbywgdG8gYW4gcnBtc2cgYWRkcmVzcwotICogKGVpdGhlciBvbmUgdGhhdCBpcyBrbm93biBpbiBhZHZhbmNlLCBvciBvbmUgdGhhdCB3aWxsIGJlIGR5bmFtaWNhbGx5Ci0gKiBhc3NpZ25lZCBmb3IgdGhlbSkuCi0gKgotICogU2ltcGxlIHJwbXNnIGRyaXZlcnMgbmVlZCBub3QgY2FsbCBycG1zZ19jcmVhdGVfZXB0LCBiZWNhdXNlIGFuIGVuZHBvaW50Ci0gKiBpcyBhbHJlYWR5IGNyZWF0ZWQgZm9yIHRoZW0gd2hlbiB0aGV5IGFyZSBwcm9iZWQgYnkgdGhlIHJwbXNnIGJ1cwotICogKHVzaW5nIHRoZSByeCBjYWxsYmFjayBwcm92aWRlZCB3aGVuIHRoZXkgcmVnaXN0ZXJlZCB0byB0aGUgcnBtc2cgYnVzKS4KLSAqCi0gKiBTbyB0aGluZ3Mgc2hvdWxkIGp1c3Qgd29yayBmb3Igc2ltcGxlIGRyaXZlcnM6IHRoZXkgYWxyZWFkeSBoYXZlIGFuCi0gKiBlbmRwb2ludCwgdGhlaXIgcnggY2FsbGJhY2sgaXMgYm91bmQgdG8gdGhlaXIgcnBtc2cgYWRkcmVzcywgYW5kIHdoZW4KLSAqIHJlbGV2YW50IGluYm91bmQgbWVzc2FnZXMgYXJyaXZlIChpLmUuIG1lc3NhZ2VzIHdoaWNoIHRoZWlyIGRzdCBhZGRyZXNzCi0gKiBlcXVhbHMgdG8gdGhlIHNyYyBhZGRyZXNzIG9mIHRoZWlyIHJwbXNnIGNoYW5uZWwpLCB0aGUgZHJpdmVyJ3MgaGFuZGxlcgotICogaXMgaW52b2tlZCB0byBwcm9jZXNzIGl0LgotICoKLSAqIFRoYXQgc2FpZCwgbW9yZSBjb21wbGljYXRlZCBkcml2ZXJzIG1pZ2h0IGRvIG5lZWQgdG8gYWxsb2NhdGUKLSAqIGFkZGl0aW9uYWwgcnBtc2cgYWRkcmVzc2VzLCBhbmQgYmluZCB0aGVtIHRvIGRpZmZlcmVudCByeCBjYWxsYmFja3MuCi0gKiBUbyBhY2NvbXBsaXNoIHRoYXQsIHRob3NlIGRyaXZlcnMgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24uCi0gKgotICogRHJpdmVycyBzaG91bGQgcHJvdmlkZSB0aGVpciBAcnBkZXYgY2hhbm5lbCAoc28gdGhlIG5ldyBlbmRwb2ludCB3b3VsZCBiZWxvbmcKLSAqIHRvIHRoZSBzYW1lIHJlbW90ZSBwcm9jZXNzb3IgdGhlaXIgY2hhbm5lbCBiZWxvbmdzIHRvKSwgYW4gcnggY2FsbGJhY2sKLSAqIGZ1bmN0aW9uLCBhbiBvcHRpb25hbCBwcml2YXRlIGRhdGEgKHdoaWNoIGlzIHByb3ZpZGVkIGJhY2sgd2hlbiB0aGUKLSAqIHJ4IGNhbGxiYWNrIGlzIGludm9rZWQpLCBhbmQgYW4gYWRkcmVzcyB0aGV5IHdhbnQgdG8gYmluZCB3aXRoIHRoZQotICogY2FsbGJhY2suIElmIEBhZGRyIGlzIFJQTVNHX0FERFJfQU5ZLCB0aGVuIHJwbXNnX2NyZWF0ZV9lcHQgd2lsbAotICogZHluYW1pY2FsbHkgYXNzaWduIHRoZW0gYW4gYXZhaWxhYmxlIHJwbXNnIGFkZHJlc3MgKGRyaXZlcnMgc2hvdWxkIGhhdmUKLSAqIGEgdmVyeSBnb29kIHJlYXNvbiB3aHkgbm90IHRvIGFsd2F5cyB1c2UgUlBNU0dfQUREUl9BTlkgaGVyZSkuCi0gKgotICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVuZHBvaW50IG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZXJyb3IuCi0gKi8KLXN0cnVjdCBycG1zZ19lbmRwb2ludCAqcnBtc2dfY3JlYXRlX2VwdChzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYsCi0JCQkJcnBtc2dfcnhfY2JfdCBjYiwgdm9pZCAqcHJpdiwgdTMyIGFkZHIpCitzdGF0aWMgc3RydWN0IHJwbXNnX2VuZHBvaW50ICp2aXJ0aW9fcnBtc2dfY3JlYXRlX2VwdChzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiwKKwkJCQkJCSAgICAgIHJwbXNnX3J4X2NiX3QgY2IsCisJCQkJCQkgICAgICB2b2lkICpwcml2LAorCQkJCQkJICAgICAgc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyBjaGluZm8pCiB7Ci0JcmV0dXJuIF9fcnBtc2dfY3JlYXRlX2VwdChycGRldi0+dnJwLCBycGRldiwgY2IsIHByaXYsIGFkZHIpOworCXN0cnVjdCB2aXJ0aW9fcnBtc2dfY2hhbm5lbCAqdmNoID0gdG9fdmlydGlvX3JwbXNnX2NoYW5uZWwocnBkZXYpOworCisJcmV0dXJuIF9fcnBtc2dfY3JlYXRlX2VwdCh2Y2gtPnZycCwgcnBkZXYsIGNiLCBwcml2LCBjaGluZm8uc3JjKTsKIH0KLUVYUE9SVF9TWU1CT0wocnBtc2dfY3JlYXRlX2VwdCk7CiAKIC8qKgogICogX19ycG1zZ19kZXN0cm95X2VwdCgpIC0gZGVzdHJveSBhbiBleGlzdGluZyBycG1zZyBlbmRwb2ludApAQCAtMzM0LDE3OCArMjk5LDgyIEBACiAJa3JlZl9wdXQoJmVwdC0+cmVmY291bnQsIF9fZXB0X3JlbGVhc2UpOwogfQogCi0vKioKLSAqIHJwbXNnX2Rlc3Ryb3lfZXB0KCkgLSBkZXN0cm95IGFuIGV4aXN0aW5nIHJwbXNnIGVuZHBvaW50Ci0gKiBAZXB0OiBlbmRwb2luZyB0byBkZXN0cm95Ci0gKgotICogU2hvdWxkIGJlIHVzZWQgYnkgZHJpdmVycyB0byBkZXN0cm95IGFuIHJwbXNnIGVuZHBvaW50IHByZXZpb3VzbHkKLSAqIGNyZWF0ZWQgd2l0aCBycG1zZ19jcmVhdGVfZXB0KCkuCi0gKi8KLXZvaWQgcnBtc2dfZGVzdHJveV9lcHQoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQpCitzdGF0aWMgdm9pZCB2aXJ0aW9fcnBtc2dfZGVzdHJveV9lcHQoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQpCiB7Ci0JX19ycG1zZ19kZXN0cm95X2VwdChlcHQtPnJwZGV2LT52cnAsIGVwdCk7CisJc3RydWN0IHZpcnRpb19ycG1zZ19jaGFubmVsICp2Y2ggPSB0b192aXJ0aW9fcnBtc2dfY2hhbm5lbChlcHQtPnJwZGV2KTsKKworCV9fcnBtc2dfZGVzdHJveV9lcHQodmNoLT52cnAsIGVwdCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHJwbXNnX2Rlc3Ryb3lfZXB0KTsKIAotLyoKLSAqIHdoZW4gYW4gcnBtc2cgZHJpdmVyIGlzIHByb2JlZCB3aXRoIGEgY2hhbm5lbCwgd2Ugc2VhbWxlc3NseSBjcmVhdGUKLSAqIGl0IGFuIGVuZHBvaW50LCBiaW5kaW5nIGl0cyByeCBjYWxsYmFjayB0byBhIHVuaXF1ZSBsb2NhbCBycG1zZwotICogYWRkcmVzcy4KLSAqCi0gKiBpZiB3ZSBuZWVkIHRvLCB3ZSBhbHNvIGFubm91bmNlIGFib3V0IHRoaXMgY2hhbm5lbCB0byB0aGUgcmVtb3RlCi0gKiBwcm9jZXNzb3IgKG5lZWRlZCBpbiBjYXNlIHRoZSBkcml2ZXIgaXMgZXhwb3NpbmcgYW4gcnBtc2cgc2VydmljZSkuCi0gKi8KLXN0YXRpYyBpbnQgcnBtc2dfZGV2X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgdmlydGlvX3JwbXNnX2Fubm91bmNlX2NyZWF0ZShzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldikKIHsKLQlzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYgPSB0b19ycG1zZ19jaGFubmVsKGRldik7Ci0Jc3RydWN0IHJwbXNnX2RyaXZlciAqcnBkcnYgPSB0b19ycG1zZ19kcml2ZXIocnBkZXYtPmRldi5kcml2ZXIpOwotCXN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnAgPSBycGRldi0+dnJwOwotCXN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0OwotCWludCBlcnI7Ci0KLQllcHQgPSBycG1zZ19jcmVhdGVfZXB0KHJwZGV2LCBycGRydi0+Y2FsbGJhY2ssIE5VTEwsIHJwZGV2LT5zcmMpOwotCWlmICghZXB0KSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBlbmRwb2ludFxuIik7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJwZGV2LT5lcHQgPSBlcHQ7Ci0JcnBkZXYtPnNyYyA9IGVwdC0+YWRkcjsKLQotCWVyciA9IHJwZHJ2LT5wcm9iZShycGRldik7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKLQkJcnBtc2dfZGVzdHJveV9lcHQoZXB0KTsKLQkJZ290byBvdXQ7Ci0JfQorCXN0cnVjdCB2aXJ0aW9fcnBtc2dfY2hhbm5lbCAqdmNoID0gdG9fdmlydGlvX3JwbXNnX2NoYW5uZWwocnBkZXYpOworCXN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnAgPSB2Y2gtPnZycDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcnBkZXYtPmRldjsKKwlpbnQgZXJyID0gMDsKIAogCS8qIG5lZWQgdG8gdGVsbCByZW1vdGUgcHJvY2Vzc29yJ3MgbmFtZSBzZXJ2aWNlIGFib3V0IHRoaXMgY2hhbm5lbCA/ICovCiAJaWYgKHJwZGV2LT5hbm5vdW5jZSAmJgotCQkJdmlydGlvX2hhc19mZWF0dXJlKHZycC0+dmRldiwgVklSVElPX1JQTVNHX0ZfTlMpKSB7CisJICAgIHZpcnRpb19oYXNfZmVhdHVyZSh2cnAtPnZkZXYsIFZJUlRJT19SUE1TR19GX05TKSkgewogCQlzdHJ1Y3QgcnBtc2dfbnNfbXNnIG5zbTsKIAogCQlzdHJuY3B5KG5zbS5uYW1lLCBycGRldi0+aWQubmFtZSwgUlBNU0dfTkFNRV9TSVpFKTsKLQkJbnNtLmFkZHIgPSBycGRldi0+c3JjOworCQluc20uYWRkciA9IHJwZGV2LT5lcHQtPmFkZHI7CiAJCW5zbS5mbGFncyA9IFJQTVNHX05TX0NSRUFURTsKIAotCQllcnIgPSBycG1zZ19zZW5kdG8ocnBkZXYsICZuc20sIHNpemVvZihuc20pLCBSUE1TR19OU19BRERSKTsKKwkJZXJyID0gcnBtc2dfc2VuZHRvKHJwZGV2LT5lcHQsICZuc20sIHNpemVvZihuc20pLCBSUE1TR19OU19BRERSKTsKIAkJaWYgKGVycikKIAkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFubm91bmNlIHNlcnZpY2UgJWRcbiIsIGVycik7CiAJfQogCi1vdXQ6CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBycG1zZ19kZXZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgdmlydGlvX3JwbXNnX2Fubm91bmNlX2Rlc3Ryb3koc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYpCiB7Ci0Jc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2ID0gdG9fcnBtc2dfY2hhbm5lbChkZXYpOwotCXN0cnVjdCBycG1zZ19kcml2ZXIgKnJwZHJ2ID0gdG9fcnBtc2dfZHJpdmVyKHJwZGV2LT5kZXYuZHJpdmVyKTsKLQlzdHJ1Y3QgdmlydHByb2NfaW5mbyAqdnJwID0gcnBkZXYtPnZycDsKKwlzdHJ1Y3QgdmlydGlvX3JwbXNnX2NoYW5uZWwgKnZjaCA9IHRvX3ZpcnRpb19ycG1zZ19jaGFubmVsKHJwZGV2KTsKKwlzdHJ1Y3QgdmlydHByb2NfaW5mbyAqdnJwID0gdmNoLT52cnA7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnJwZGV2LT5kZXY7CiAJaW50IGVyciA9IDA7CiAKIAkvKiB0ZWxsIHJlbW90ZSBwcm9jZXNzb3IncyBuYW1lIHNlcnZpY2Ugd2UncmUgcmVtb3ZpbmcgdGhpcyBjaGFubmVsICovCiAJaWYgKHJwZGV2LT5hbm5vdW5jZSAmJgotCQkJdmlydGlvX2hhc19mZWF0dXJlKHZycC0+dmRldiwgVklSVElPX1JQTVNHX0ZfTlMpKSB7CisJICAgIHZpcnRpb19oYXNfZmVhdHVyZSh2cnAtPnZkZXYsIFZJUlRJT19SUE1TR19GX05TKSkgewogCQlzdHJ1Y3QgcnBtc2dfbnNfbXNnIG5zbTsKIAogCQlzdHJuY3B5KG5zbS5uYW1lLCBycGRldi0+aWQubmFtZSwgUlBNU0dfTkFNRV9TSVpFKTsKIAkJbnNtLmFkZHIgPSBycGRldi0+c3JjOwogCQluc20uZmxhZ3MgPSBSUE1TR19OU19ERVNUUk9ZOwogCi0JCWVyciA9IHJwbXNnX3NlbmR0byhycGRldiwgJm5zbSwgc2l6ZW9mKG5zbSksIFJQTVNHX05TX0FERFIpOworCQllcnIgPSBycG1zZ19zZW5kdG8ocnBkZXYtPmVwdCwgJm5zbSwgc2l6ZW9mKG5zbSksIFJQTVNHX05TX0FERFIpOwogCQlpZiAoZXJyKQogCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gYW5ub3VuY2Ugc2VydmljZSAlZFxuIiwgZXJyKTsKIAl9CiAKLQlycGRydi0+cmVtb3ZlKHJwZGV2KTsKLQotCXJwbXNnX2Rlc3Ryb3lfZXB0KHJwZGV2LT5lcHQpOwotCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBidXNfdHlwZSBycG1zZ19idXMgPSB7Ci0JLm5hbWUJCT0gInJwbXNnIiwKLQkubWF0Y2gJCT0gcnBtc2dfZGV2X21hdGNoLAotCS5kZXZfYXR0cnMJPSBycG1zZ19kZXZfYXR0cnMsCi0JLnVldmVudAkJPSBycG1zZ191ZXZlbnQsCi0JLnByb2JlCQk9IHJwbXNnX2Rldl9wcm9iZSwKLQkucmVtb3ZlCQk9IHJwbXNnX2Rldl9yZW1vdmUsCitzdGF0aWMgY29uc3Qgc3RydWN0IHJwbXNnX2RldmljZV9vcHMgdmlydGlvX3JwbXNnX29wcyA9IHsKKwkuY3JlYXRlX2VwdCA9IHZpcnRpb19ycG1zZ19jcmVhdGVfZXB0LAorCS5hbm5vdW5jZV9jcmVhdGUgPSB2aXJ0aW9fcnBtc2dfYW5ub3VuY2VfY3JlYXRlLAorCS5hbm5vdW5jZV9kZXN0cm95ID0gdmlydGlvX3JwbXNnX2Fubm91bmNlX2Rlc3Ryb3ksCiB9OwogCi0vKioKLSAqIF9fcmVnaXN0ZXJfcnBtc2dfZHJpdmVyKCkgLSByZWdpc3RlciBhbiBycG1zZyBkcml2ZXIgd2l0aCB0aGUgcnBtc2cgYnVzCi0gKiBAcnBkcnY6IHBvaW50ZXIgdG8gYSBzdHJ1Y3QgcnBtc2dfZHJpdmVyCi0gKiBAb3duZXI6IG93bmluZyBtb2R1bGUvZHJpdmVyCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1pbnQgX19yZWdpc3Rlcl9ycG1zZ19kcml2ZXIoc3RydWN0IHJwbXNnX2RyaXZlciAqcnBkcnYsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQotewotCXJwZHJ2LT5kcnYuYnVzID0gJnJwbXNnX2J1czsKLQlycGRydi0+ZHJ2Lm93bmVyID0gb3duZXI7Ci0JcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmcnBkcnYtPmRydik7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fcmVnaXN0ZXJfcnBtc2dfZHJpdmVyKTsKLQotLyoqCi0gKiB1bnJlZ2lzdGVyX3JwbXNnX2RyaXZlcigpIC0gdW5yZWdpc3RlciBhbiBycG1zZyBkcml2ZXIgZnJvbSB0aGUgcnBtc2cgYnVzCi0gKiBAcnBkcnY6IHBvaW50ZXIgdG8gYSBzdHJ1Y3QgcnBtc2dfZHJpdmVyCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi12b2lkIHVucmVnaXN0ZXJfcnBtc2dfZHJpdmVyKHN0cnVjdCBycG1zZ19kcml2ZXIgKnJwZHJ2KQotewotCWRyaXZlcl91bnJlZ2lzdGVyKCZycGRydi0+ZHJ2KTsKLX0KLUVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9ycG1zZ19kcml2ZXIpOwotCi1zdGF0aWMgdm9pZCBycG1zZ19yZWxlYXNlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2ID0gdG9fcnBtc2dfY2hhbm5lbChkZXYpOwotCi0Ja2ZyZWUocnBkZXYpOwotfQotCi0vKgotICogbWF0Y2ggYW4gcnBtc2cgY2hhbm5lbCB3aXRoIGEgY2hhbm5lbCBpbmZvIHN0cnVjdC4KLSAqIHRoaXMgaXMgdXNlZCB0byBtYWtlIHN1cmUgd2UncmUgbm90IGNyZWF0aW5nIHJwbXNnIGRldmljZXMgZm9yIGNoYW5uZWxzCi0gKiB0aGF0IGFscmVhZHkgZXhpc3QuCi0gKi8KLXN0YXRpYyBpbnQgcnBtc2dfY2hhbm5lbF9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyAqY2hpbmZvID0gZGF0YTsKLQlzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYgPSB0b19ycG1zZ19jaGFubmVsKGRldik7Ci0KLQlpZiAoY2hpbmZvLT5zcmMgIT0gUlBNU0dfQUREUl9BTlkgJiYgY2hpbmZvLT5zcmMgIT0gcnBkZXYtPnNyYykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoY2hpbmZvLT5kc3QgIT0gUlBNU0dfQUREUl9BTlkgJiYgY2hpbmZvLT5kc3QgIT0gcnBkZXYtPmRzdCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc3RybmNtcChjaGluZm8tPm5hbWUsIHJwZGV2LT5pZC5uYW1lLCBSUE1TR19OQU1FX1NJWkUpKQotCQlyZXR1cm4gMDsKLQotCS8qIGZvdW5kIGEgbWF0Y2ggISAqLwotCXJldHVybiAxOwotfQotCiAvKgogICogY3JlYXRlIGFuIHJwbXNnIGNoYW5uZWwgdXNpbmcgaXRzIG5hbWUgYW5kIGFkZHJlc3MgaW5mby4KICAqIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBib3RoIHN0YXRpYyBhbmQgZHluYW1pYwogICogY2hhbm5lbHMuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBtc2dfY3JlYXRlX2NoYW5uZWwoc3RydWN0IHZpcnRwcm9jX2luZm8gKnZycCwKLQkJCQlzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvICpjaGluZm8pCitzdGF0aWMgc3RydWN0IHJwbXNnX2RldmljZSAqcnBtc2dfY3JlYXRlX2NoYW5uZWwoc3RydWN0IHZpcnRwcm9jX2luZm8gKnZycCwKKwkJCQkJCSBzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvICpjaGluZm8pCiB7Ci0Jc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2OworCXN0cnVjdCB2aXJ0aW9fcnBtc2dfY2hhbm5lbCAqdmNoOworCXN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2OwogCXN0cnVjdCBkZXZpY2UgKnRtcCwgKmRldiA9ICZ2cnAtPnZkZXYtPmRldjsKIAlpbnQgcmV0OwogCiAJLyogbWFrZSBzdXJlIGEgc2ltaWxhciBjaGFubmVsIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCAqLwotCXRtcCA9IGRldmljZV9maW5kX2NoaWxkKGRldiwgY2hpbmZvLCBycG1zZ19jaGFubmVsX21hdGNoKTsKKwl0bXAgPSBycG1zZ19maW5kX2RldmljZShkZXYsIGNoaW5mbyk7CiAJaWYgKHRtcCkgewogCQkvKiBkZWNyZW1lbnQgdGhlIG1hdGNoZWQgZGV2aWNlJ3MgcmVmY291bnQgYmFjayAqLwogCQlwdXRfZGV2aWNlKHRtcCk7CkBAIC01MTQsNjIgKzM4MywzOCBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlycGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBycG1zZ19jaGFubmVsKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFycGRldikgewotCQlwcl9lcnIoImt6YWxsb2MgZmFpbGVkXG4iKTsKKwl2Y2ggPSBremFsbG9jKHNpemVvZigqdmNoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2Y2gpCiAJCXJldHVybiBOVUxMOwotCX0KIAotCXJwZGV2LT52cnAgPSB2cnA7CisJLyogTGluayB0aGUgY2hhbm5lbCB0byBvdXIgdnJwICovCisJdmNoLT52cnAgPSB2cnA7CisKKwkvKiBBc3NpZ24gY2FsbGJhY2tzIGZvciBycG1zZ19jaGFubmVsICovCisJdmNoLT5ycGRldi5vcHMgPSAmdmlydGlvX3JwbXNnX29wczsKKworCS8qIEFzc2lnbiBwdWJsaWMgaW5mb3JtYXRpb24gdG8gdGhlIHJwbXNnX2RldmljZSAqLworCXJwZGV2ID0gJnZjaC0+cnBkZXY7CiAJcnBkZXYtPnNyYyA9IGNoaW5mby0+c3JjOwogCXJwZGV2LT5kc3QgPSBjaGluZm8tPmRzdDsKKwlycGRldi0+b3BzID0gJnZpcnRpb19ycG1zZ19vcHM7CiAKIAkvKgogCSAqIHJwbXNnIHNlcnZlciBjaGFubmVscyBoYXMgcHJlZGVmaW5lZCBsb2NhbCBhZGRyZXNzIChmb3Igbm93KSwKIAkgKiBhbmQgdGhlaXIgZXhpc3RlbmNlIG5lZWRzIHRvIGJlIGFubm91bmNlZCByZW1vdGVseQogCSAqLwotCXJwZGV2LT5hbm5vdW5jZSA9IHJwZGV2LT5zcmMgIT0gUlBNU0dfQUREUl9BTlkgPyB0cnVlIDogZmFsc2U7CisJcnBkZXYtPmFubm91bmNlID0gcnBkZXYtPnNyYyAhPSBSUE1TR19BRERSX0FOWTsKIAogCXN0cm5jcHkocnBkZXYtPmlkLm5hbWUsIGNoaW5mby0+bmFtZSwgUlBNU0dfTkFNRV9TSVpFKTsKIAotCS8qIHZlcnkgc2ltcGxlIGRldmljZSBpbmRleGluZyBwbHVtYmluZyB3aGljaCBpcyBlbm91Z2ggZm9yIG5vdyAqLwotCWRldl9zZXRfbmFtZSgmcnBkZXYtPmRldiwgInJwbXNnJWQiLCBycG1zZ19kZXZfaW5kZXgrKyk7Ci0KIAlycGRldi0+ZGV2LnBhcmVudCA9ICZ2cnAtPnZkZXYtPmRldjsKLQlycGRldi0+ZGV2LmJ1cyA9ICZycG1zZ19idXM7Ci0JcnBkZXYtPmRldi5yZWxlYXNlID0gcnBtc2dfcmVsZWFzZV9kZXZpY2U7Ci0KLQlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJnJwZGV2LT5kZXYpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICJkZXZpY2VfcmVnaXN0ZXIgZmFpbGVkOiAlZFxuIiwgcmV0KTsKLQkJcHV0X2RldmljZSgmcnBkZXYtPmRldik7CisJcmV0ID0gcnBtc2dfcmVnaXN0ZXJfZGV2aWNlKHJwZGV2KTsKKwlpZiAocmV0KQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAlyZXR1cm4gcnBkZXY7CiB9CiAKLS8qCi0gKiBmaW5kIGFuIGV4aXN0aW5nIGNoYW5uZWwgdXNpbmcgaXRzIG5hbWUgKyBhZGRyZXNzIHByb3BlcnRpZXMsCi0gKiBhbmQgZGVzdHJveSBpdAotICovCi1zdGF0aWMgaW50IHJwbXNnX2Rlc3Ryb3lfY2hhbm5lbChzdHJ1Y3QgdmlydHByb2NfaW5mbyAqdnJwLAotCQkJCQlzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvICpjaGluZm8pCi17Ci0Jc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYgPSB2cnAtPnZkZXY7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCi0JZGV2ID0gZGV2aWNlX2ZpbmRfY2hpbGQoJnZkZXYtPmRldiwgY2hpbmZvLCBycG1zZ19jaGFubmVsX21hdGNoKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwotCi0JcHV0X2RldmljZShkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qIHN1cGVyIHNpbXBsZSBidWZmZXIgImFsbG9jYXRvciIgdGhhdCBpcyBqdXN0IGVub3VnaCBmb3Igbm93ICovCiBzdGF0aWMgdm9pZCAqZ2V0X2FfdHhfYnVmKHN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnApCiB7CkBAIC02ODQsMTAgKzUyOSwxMiBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvbiBmYWlsdXJlLgogICovCi1pbnQgcnBtc2dfc2VuZF9vZmZjaGFubmVsX3JhdyhzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqcnBkZXYsIHUzMiBzcmMsIHUzMiBkc3QsCi0JCQkJCXZvaWQgKmRhdGEsIGludCBsZW4sIGJvb2wgd2FpdCkKK3N0YXRpYyBpbnQgcnBtc2dfc2VuZF9vZmZjaGFubmVsX3JhdyhzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiwKKwkJCQkgICAgIHUzMiBzcmMsIHUzMiBkc3QsCisJCQkJICAgICB2b2lkICpkYXRhLCBpbnQgbGVuLCBib29sIHdhaXQpCiB7Ci0Jc3RydWN0IHZpcnRwcm9jX2luZm8gKnZycCA9IHJwZGV2LT52cnA7CisJc3RydWN0IHZpcnRpb19ycG1zZ19jaGFubmVsICp2Y2ggPSB0b192aXJ0aW9fcnBtc2dfY2hhbm5lbChycGRldik7CisJc3RydWN0IHZpcnRwcm9jX2luZm8gKnZycCA9IHZjaC0+dnJwOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZycGRldi0+ZGV2OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKIAlzdHJ1Y3QgcnBtc2dfaGRyICptc2c7CkBAIC03NTEsMTAgKzU5OCwxMSBAQAogCW1lbWNweShtc2ctPmRhdGEsIGRhdGEsIGxlbik7CiAKIAlkZXZfZGJnKGRldiwgIlRYIEZyb20gMHgleCwgVG8gMHgleCwgTGVuICVkLCBGbGFncyAlZCwgUmVzZXJ2ZWQgJWRcbiIsCi0JCQkJCW1zZy0+c3JjLCBtc2ctPmRzdCwgbXNnLT5sZW4sCi0JCQkJCW1zZy0+ZmxhZ3MsIG1zZy0+cmVzZXJ2ZWQpOwotCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJycG1zZ192aXJ0aW8gVFg6ICIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLAotCQkJCQltc2csIHNpemVvZigqbXNnKSArIG1zZy0+bGVuLCB0cnVlKTsKKwkJbXNnLT5zcmMsIG1zZy0+ZHN0LCBtc2ctPmxlbiwgbXNnLT5mbGFncywgbXNnLT5yZXNlcnZlZCk7CisjaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19ERUJVRykKKwlkeW5hbWljX2hleF9kdW1wKCJycG1zZ192aXJ0aW8gVFg6ICIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLAorCQkJIG1zZywgc2l6ZW9mKCptc2cpICsgbXNnLT5sZW4sIHRydWUpOworI2VuZGlmCiAKIAlzZ19pbml0X29uZSgmc2csIG1zZywgc2l6ZW9mKCptc2cpICsgbGVuKTsKIApAQCAtNzgwLDYgKzYyOCw1NiBAQAogfQogRVhQT1JUX1NZTUJPTChycG1zZ19zZW5kX29mZmNoYW5uZWxfcmF3KTsKIAorc3RhdGljIGludCB2aXJ0aW9fcnBtc2dfc2VuZChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiA9IGVwdC0+cnBkZXY7CisJdTMyIHNyYyA9IGVwdC0+YWRkciwgZHN0ID0gcnBkZXYtPmRzdDsKKworCXJldHVybiBycG1zZ19zZW5kX29mZmNoYW5uZWxfcmF3KHJwZGV2LCBzcmMsIGRzdCwgZGF0YSwgbGVuLCB0cnVlKTsKK30KKworc3RhdGljIGludCB2aXJ0aW9fcnBtc2dfc2VuZHRvKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuLAorCQkJICAgICAgIHUzMiBkc3QpCit7CisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYgPSBlcHQtPnJwZGV2OworCXUzMiBzcmMgPSBlcHQtPmFkZHI7CisKKwlyZXR1cm4gcnBtc2dfc2VuZF9vZmZjaGFubmVsX3JhdyhycGRldiwgc3JjLCBkc3QsIGRhdGEsIGxlbiwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlydGlvX3JwbXNnX3NlbmRfb2ZmY2hhbm5lbChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdTMyIHNyYywKKwkJCQkJdTMyIGRzdCwgdm9pZCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiA9IGVwdC0+cnBkZXY7CisKKwlyZXR1cm4gcnBtc2dfc2VuZF9vZmZjaGFubmVsX3JhdyhycGRldiwgc3JjLCBkc3QsIGRhdGEsIGxlbiwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlydGlvX3JwbXNnX3RyeXNlbmQoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYgPSBlcHQtPnJwZGV2OworCXUzMiBzcmMgPSBlcHQtPmFkZHIsIGRzdCA9IHJwZGV2LT5kc3Q7CisKKwlyZXR1cm4gcnBtc2dfc2VuZF9vZmZjaGFubmVsX3JhdyhycGRldiwgc3JjLCBkc3QsIGRhdGEsIGxlbiwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IHZpcnRpb19ycG1zZ190cnlzZW5kdG8oc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsCisJCQkJICBpbnQgbGVuLCB1MzIgZHN0KQoreworCXN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2ID0gZXB0LT5ycGRldjsKKwl1MzIgc3JjID0gZXB0LT5hZGRyOworCisJcmV0dXJuIHJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcocnBkZXYsIHNyYywgZHN0LCBkYXRhLCBsZW4sIGZhbHNlKTsKK30KKworc3RhdGljIGludCB2aXJ0aW9fcnBtc2dfdHJ5c2VuZF9vZmZjaGFubmVsKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB1MzIgc3JjLAorCQkJCQkgICB1MzIgZHN0LCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2ID0gZXB0LT5ycGRldjsKKworCXJldHVybiBycG1zZ19zZW5kX29mZmNoYW5uZWxfcmF3KHJwZGV2LCBzcmMsIGRzdCwgZGF0YSwgbGVuLCBmYWxzZSk7Cit9CisKIHN0YXRpYyBpbnQgcnBtc2dfcmVjdl9zaW5nbGUoc3RydWN0IHZpcnRwcm9jX2luZm8gKnZycCwgc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgcnBtc2dfaGRyICptc2csIHVuc2lnbmVkIGludCBsZW4pCiB7CkBAIC03ODgsMTcgKzY4NiwxOCBAQAogCWludCBlcnI7CiAKIAlkZXZfZGJnKGRldiwgIkZyb206IDB4JXgsIFRvOiAweCV4LCBMZW46ICVkLCBGbGFnczogJWQsIFJlc2VydmVkOiAlZFxuIiwKLQkJCQkJbXNnLT5zcmMsIG1zZy0+ZHN0LCBtc2ctPmxlbiwKLQkJCQkJbXNnLT5mbGFncywgbXNnLT5yZXNlcnZlZCk7Ci0JcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgInJwbXNnX3ZpcnRpbyBSWDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCi0JCQkJCW1zZywgc2l6ZW9mKCptc2cpICsgbXNnLT5sZW4sIHRydWUpOworCQltc2ctPnNyYywgbXNnLT5kc3QsIG1zZy0+bGVuLCBtc2ctPmZsYWdzLCBtc2ctPnJlc2VydmVkKTsKKyNpZiBkZWZpbmVkKENPTkZJR19EWU5BTUlDX0RFQlVHKQorCWR5bmFtaWNfaGV4X2R1bXAoInJwbXNnX3ZpcnRpbyBSWDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCisJCQkgbXNnLCBzaXplb2YoKm1zZykgKyBtc2ctPmxlbiwgdHJ1ZSk7CisjZW5kaWYKIAogCS8qCiAJICogV2UgY3VycmVudGx5IHVzZSBmaXhlZC1zaXplZCBidWZmZXJzLCBzbyB0cml2aWFsbHkgc2FuaXRpemUKIAkgKiB0aGUgcmVwb3J0ZWQgcGF5bG9hZCBsZW5ndGguCiAJICovCiAJaWYgKGxlbiA+IFJQTVNHX0JVRl9TSVpFIHx8Ci0JCW1zZy0+bGVuID4gKGxlbiAtIHNpemVvZihzdHJ1Y3QgcnBtc2dfaGRyKSkpIHsKKwkgICAgbXNnLT5sZW4gPiAobGVuIC0gc2l6ZW9mKHN0cnVjdCBycG1zZ19oZHIpKSkgewogCQlkZXZfd2FybihkZXYsICJpbmJvdW5kIG1zZyB0b28gYmlnOiAoJWQsICVkKVxuIiwgbGVuLCBtc2ctPmxlbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTg2NSw3ICs3NjQsNyBAQAogCQltc2dzX3JlY2VpdmVkKys7CiAKIAkJbXNnID0gdmlydHF1ZXVlX2dldF9idWYocnZxLCAmbGVuKTsKLQl9OworCX0KIAogCWRldl9kYmcoZGV2LCAiUmVjZWl2ZWQgJXUgbWVzc2FnZXNcbiIsIG1zZ3NfcmVjZWl2ZWQpOwogCkBAIC04OTIsMjMgKzc5MSwyNCBAQAogfQogCiAvKiBpbnZva2VkIHdoZW4gYSBuYW1lIHNlcnZpY2UgYW5ub3VuY2VtZW50IGFycml2ZXMgKi8KLXN0YXRpYyB2b2lkIHJwbXNnX25zX2NiKHN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiwgdm9pZCAqZGF0YSwgaW50IGxlbiwKLQkJCQkJCQl2b2lkICpwcml2LCB1MzIgc3JjKQorc3RhdGljIGludCBycG1zZ19uc19jYihzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiwgdm9pZCAqZGF0YSwgaW50IGxlbiwKKwkJICAgICAgIHZvaWQgKnByaXYsIHUzMiBzcmMpCiB7CiAJc3RydWN0IHJwbXNnX25zX21zZyAqbXNnID0gZGF0YTsKLQlzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqbmV3Y2g7CisJc3RydWN0IHJwbXNnX2RldmljZSAqbmV3Y2g7CiAJc3RydWN0IHJwbXNnX2NoYW5uZWxfaW5mbyBjaGluZm87CiAJc3RydWN0IHZpcnRwcm9jX2luZm8gKnZycCA9IHByaXY7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnZycC0+dmRldi0+ZGV2OwogCWludCByZXQ7CiAKLQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiTlMgYW5ub3VuY2VtZW50OiAiLAotCQkJRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCi0JCQlkYXRhLCBsZW4sIHRydWUpOworI2lmIGRlZmluZWQoQ09ORklHX0RZTkFNSUNfREVCVUcpCisJZHluYW1pY19oZXhfZHVtcCgiTlMgYW5ub3VuY2VtZW50OiAiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwKKwkJCSBkYXRhLCBsZW4sIHRydWUpOworI2VuZGlmCiAKIAlpZiAobGVuICE9IHNpemVvZigqbXNnKSkgewogCQlkZXZfZXJyKGRldiwgIm1hbGZvcm1lZCBucyBtc2cgKCVkKVxuIiwgbGVuKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKgpAQCAtOTE5LDIyICs4MTksMjIgQEAKIAkgKi8KIAlpZiAocnBkZXYpIHsKIAkJZGV2X2VycihkZXYsICJhbm9tYWx5OiBucyBlcHQgaGFzIGFuIHJwZGV2IGhhbmRsZVxuIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogZG9uJ3QgdHJ1c3QgdGhlIHJlbW90ZSBwcm9jZXNzb3IgZm9yIG51bGwgdGVybWluYXRpbmcgdGhlIG5hbWUgKi8KIAltc2ctPm5hbWVbUlBNU0dfTkFNRV9TSVpFIC0gMV0gPSAnXDAnOwogCiAJZGV2X2luZm8oZGV2LCAiJXNpbmcgY2hhbm5lbCAlcyBhZGRyIDB4JXhcbiIsCi0JCQltc2ctPmZsYWdzICYgUlBNU0dfTlNfREVTVFJPWSA/ICJkZXN0cm95IiA6ICJjcmVhdCIsCi0JCQltc2ctPm5hbWUsIG1zZy0+YWRkcik7CisJCSBtc2ctPmZsYWdzICYgUlBNU0dfTlNfREVTVFJPWSA/ICJkZXN0cm95IiA6ICJjcmVhdCIsCisJCSBtc2ctPm5hbWUsIG1zZy0+YWRkcik7CiAKIAlzdHJuY3B5KGNoaW5mby5uYW1lLCBtc2ctPm5hbWUsIHNpemVvZihjaGluZm8ubmFtZSkpOwogCWNoaW5mby5zcmMgPSBSUE1TR19BRERSX0FOWTsKIAljaGluZm8uZHN0ID0gbXNnLT5hZGRyOwogCiAJaWYgKG1zZy0+ZmxhZ3MgJiBSUE1TR19OU19ERVNUUk9ZKSB7Ci0JCXJldCA9IHJwbXNnX2Rlc3Ryb3lfY2hhbm5lbCh2cnAsICZjaGluZm8pOworCQlyZXQgPSBycG1zZ191bnJlZ2lzdGVyX2RldmljZSgmdnJwLT52ZGV2LT5kZXYsICZjaGluZm8pOwogCQlpZiAocmV0KQogCQkJZGV2X2VycihkZXYsICJycG1zZ19kZXN0cm95X2NoYW5uZWwgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAl9IGVsc2UgewpAQCAtOTQyLDYgKzg0Miw4IEBACiAJCWlmICghbmV3Y2gpCiAJCQlkZXZfZXJyKGRldiwgInJwbXNnX2NyZWF0ZV9jaGFubmVsIGZhaWxlZFxuIik7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcnBtc2dfcHJvYmUoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCkBAIC05OTUsOCArODk3LDggQEAKIAkJZ290byB2cXNfZGVsOwogCX0KIAotCWRldl9kYmcoJnZkZXYtPmRldiwgImJ1ZmZlcnM6IHZhICVwLCBkbWEgMHglbGx4XG4iLCBidWZzX3ZhLAotCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZycC0+YnVmc19kbWEpOworCWRldl9kYmcoJnZkZXYtPmRldiwgImJ1ZmZlcnM6IHZhICVwLCBkbWEgJXBhZFxuIiwKKwkJYnVmc192YSwgJnZycC0+YnVmc19kbWEpOwogCiAJLyogaGFsZiBvZiB0aGUgYnVmZmVycyBpcyBkZWRpY2F0ZWQgZm9yIFJYICovCiAJdnJwLT5yYnVmcyA9IGJ1ZnNfdmE7CkBAIC0xMDEyLDcgKzkxNCw3IEBACiAJCXNnX2luaXRfb25lKCZzZywgY3B1X2FkZHIsIFJQTVNHX0JVRl9TSVpFKTsKIAogCQllcnIgPSB2aXJ0cXVldWVfYWRkX2luYnVmKHZycC0+cnZxLCAmc2csIDEsIGNwdV9hZGRyLAotCQkJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQkJICBHRlBfS0VSTkVMKTsKIAkJV0FSTl9PTihlcnIpOyAvKiBzYW5pdHkgY2hlY2s7IHRoaXMgY2FuJ3QgcmVhbGx5IGhhcHBlbiAqLwogCX0KIApAQCAtMTExOSwxNyArMTAyMSw5IEBACiB7CiAJaW50IHJldDsKIAotCXJldCA9IGJ1c19yZWdpc3RlcigmcnBtc2dfYnVzKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiZmFpbGVkIHRvIHJlZ2lzdGVyIHJwbXNnIGJ1czogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJcmV0ID0gcmVnaXN0ZXJfdmlydGlvX2RyaXZlcigmdmlydGlvX2lwY19kcml2ZXIpOwotCWlmIChyZXQpIHsKKwlpZiAocmV0KQogCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciB2aXJ0aW8gZHJpdmVyOiAlZFxuIiwgcmV0KTsKLQkJYnVzX3VucmVnaXN0ZXIoJnJwbXNnX2J1cyk7Ci0JfQogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTExMzgsNyArMTAzMiw2IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgcnBtc2dfZmluaSh2b2lkKQogewogCXVucmVnaXN0ZXJfdmlydGlvX2RyaXZlcigmdmlydGlvX2lwY19kcml2ZXIpOwotCWJ1c191bnJlZ2lzdGVyKCZycG1zZ19idXMpOwogfQogbW9kdWxlX2V4aXQocnBtc2dfZmluaSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL0tjb25maWcgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCmluZGV4IGUyMTVmNTAuLmQxZTA4MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL0tjb25maWcKKysrIGIvZHJpdmVycy9ydGMvS2NvbmZpZwpAQCAtMTg3LDYgKzE4NywxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtYWJ4ODB4LgogCitjb25maWcgUlRDX0RSVl9BQzEwMAorCXRyaXN0YXRlICJYLVBvd2VycyBBQzEwMCIKKwlkZXBlbmRzIG9uIE1GRF9BQzEwMAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgcmVhbC10aW1lIGNsb2NrIGZvdW5kCisJICBpbiBYLVBvd2VycyBBQzEwMCBmYW1pbHkgcGVyaXBoZXJhbCBJQ3MuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLWFjMTAwLgorCiBjb25maWcgUlRDX0RSVl9BUzM3MjIKIAl0cmlzdGF0ZSAiYW1zIEFTMzcyMiBSVEMgZHJpdmVyIgogCWRlcGVuZHMgb24gTUZEX0FTMzcyMgpAQCAtMzI4LDExICszMzgsMTEgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1tYXg3NzY4Ni4KIAogY29uZmlnIFJUQ19EUlZfUks4MDgKLQl0cmlzdGF0ZSAiUm9ja2NoaXAgUks4MDggUlRDIgorCXRyaXN0YXRlICJSb2NrY2hpcCBSSzgwOC9SSzgxOCBSVEMiCiAJZGVwZW5kcyBvbiBNRkRfUks4MDgKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSB3aWxsIGdldCBzdXBwb3J0IGZvciB0aGUKLQkgIFJUQyBvZiBSSzgwOCBQTUlDLgorCSAgUlRDIG9mIFJLODA4IGFuZCBSSzgxOCBQTUlDLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJrODA4LXJ0Yy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL01ha2VmaWxlIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKaW5kZXggN2NmN2FkNS4uOGZiOTk0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDcgQEAKIG9iai0kKENPTkZJR19SVENfRFJWX0FCODUwMCkJKz0gcnRjLWFiODUwMC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9BQkI1WkVTMykJKz0gcnRjLWFiLWI1emUtczMubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfQUJYODBYKQkrPSBydGMtYWJ4ODB4Lm8KK29iai0kKENPTkZJR19SVENfRFJWX0FDMTAwKQkrPSBydGMtYWMxMDAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfQVJNQURBMzhYKQkrPSBydGMtYXJtYWRhMzh4Lm8KIG9iai0kKENPTkZJR19SVENfRFJWX0FTMzcyMikJKz0gcnRjLWFzMzcyMi5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9BU005MjYwKQkrPSBydGMtYXNtOTI2MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtYWMxMDAuYyBiL2RyaXZlcnMvcnRjL3J0Yy1hYzEwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjRmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtYWMxMDAuYwpAQCAtMCwwICsxLDYyNyBAQAorLyoKKyAqIFJUQyBEcml2ZXIgZm9yIFgtUG93ZXJzIEFDMTAwCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENoZW4tWXUgVHNhaQorICoKKyAqIENoZW4tWXUgVHNhaSA8d2Vuc0Bjc2llLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYzEwMC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIEFDMTAwX1JUQ19DVFJMXzI0SE9VUglCSVQoMCkKKworLyogQ2xvY2sgb3V0cHV0IHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgQUMxMDBfQ0xLT1VUX1BSRV9ESVZfU0hJRlQJNQorI2RlZmluZSBBQzEwMF9DTEtPVVRfUFJFX0RJVl9XSURUSAkzCisjZGVmaW5lIEFDMTAwX0NMS09VVF9NVVhfU0hJRlQJCTQKKyNkZWZpbmUgQUMxMDBfQ0xLT1VUX01VWF9XSURUSAkJMQorI2RlZmluZSBBQzEwMF9DTEtPVVRfRElWX1NISUZUCQkxCisjZGVmaW5lIEFDMTAwX0NMS09VVF9ESVZfV0lEVEgJCTMKKyNkZWZpbmUgQUMxMDBfQ0xLT1VUX0VOCQkJQklUKDApCisKKy8qIFJUQyAqLworI2RlZmluZSBBQzEwMF9SVENfU0VDX01BU0sJR0VOTUFTSyg2LCAwKQorI2RlZmluZSBBQzEwMF9SVENfTUlOX01BU0sJR0VOTUFTSyg2LCAwKQorI2RlZmluZSBBQzEwMF9SVENfSE9VX01BU0sJR0VOTUFTSyg1LCAwKQorI2RlZmluZSBBQzEwMF9SVENfV0VFX01BU0sJR0VOTUFTSygyLCAwKQorI2RlZmluZSBBQzEwMF9SVENfREFZX01BU0sJR0VOTUFTSyg1LCAwKQorI2RlZmluZSBBQzEwMF9SVENfTU9OX01BU0sJR0VOTUFTSyg0LCAwKQorI2RlZmluZSBBQzEwMF9SVENfWUVBX01BU0sJR0VOTUFTSyg3LCAwKQorI2RlZmluZSBBQzEwMF9SVENfWUVBX0xFQVAJQklUKDE1KQorI2RlZmluZSBBQzEwMF9SVENfVVBEX1RSSUdHRVIJQklUKDE1KQorCisvKiBBbGFybSAod2FsbCBjbG9jaykgKi8KKyNkZWZpbmUgQUMxMDBfQUxNX0lOVF9FTkFCTEUJQklUKDApCisKKyNkZWZpbmUgQUMxMDBfQUxNX1NFQ19NQVNLCUdFTk1BU0soNiwgMCkKKyNkZWZpbmUgQUMxMDBfQUxNX01JTl9NQVNLCUdFTk1BU0soNiwgMCkKKyNkZWZpbmUgQUMxMDBfQUxNX0hPVV9NQVNLCUdFTk1BU0soNSwgMCkKKyNkZWZpbmUgQUMxMDBfQUxNX1dFRV9NQVNLCUdFTk1BU0soMiwgMCkKKyNkZWZpbmUgQUMxMDBfQUxNX0RBWV9NQVNLCUdFTk1BU0soNSwgMCkKKyNkZWZpbmUgQUMxMDBfQUxNX01PTl9NQVNLCUdFTk1BU0soNCwgMCkKKyNkZWZpbmUgQUMxMDBfQUxNX1lFQV9NQVNLCUdFTk1BU0soNywgMCkKKyNkZWZpbmUgQUMxMDBfQUxNX0VOQUJMRV9GTEFHCUJJVCgxNSkKKyNkZWZpbmUgQUMxMDBfQUxNX1VQRF9UUklHR0VSCUJJVCgxNSkKKworLyoKKyAqIFRoZSB5ZWFyIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGRyaXZlciBpcyB1c3VhbGx5IGFuIG9mZnNldCByZWxhdGl2ZSB0bworICogdGhlIHllYXIgMTkwMC4gVGhpcyBtYWNybyBpcyB1c2VkIHRvIGNvbnZlcnQgdGhpcyBvZmZzZXQgdG8gYW5vdGhlciBvbmUKKyAqIHJlbGF0aXZlIHRvIHRoZSBtaW5pbXVtIHllYXIgYWxsb3dlZCBieSB0aGUgaGFyZHdhcmUuCisgKgorICogVGhlIHllYXIgcmFuZ2UgaXMgMTk3MCAtIDIwNjkuIFRoaXMgcmFuZ2UgaXMgc2VsZWN0ZWQgdG8gbWF0Y2ggQWxsd2lubmVyJ3MKKyAqIGRyaXZlci4KKyAqLworI2RlZmluZSBBQzEwMF9ZRUFSX01JTgkJCQkxOTcwCisjZGVmaW5lIEFDMTAwX1lFQVJfTUFYCQkJCTIwNjkKKyNkZWZpbmUgQUMxMDBfWUVBUl9PRkYJCQkJKEFDMTAwX1lFQVJfTUlOIC0gMTkwMCkKKworc3RydWN0IGFjMTAwX2Nsa291dCB7CisJc3RydWN0IGNsa19odyBodzsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJdTggb2Zmc2V0OworfTsKKworI2RlZmluZSB0b19hYzEwMF9jbGtvdXQoX2h3KSBjb250YWluZXJfb2YoX2h3LCBzdHJ1Y3QgYWMxMDBfY2xrb3V0LCBodykKKworI2RlZmluZSBBQzEwMF9SVENfMzJLX05BTUUJImFjMTAwLXJ0Yy0zMmsiCisjZGVmaW5lIEFDMTAwX1JUQ18zMktfUkFURQkzMjc2OAorI2RlZmluZSBBQzEwMF9DTEtPVVRfTlVNCTMKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhYzEwMF9jbGtvdXRfbmFtZXNbQUMxMDBfQ0xLT1VUX05VTV0gPSB7CisJImFjMTAwLWNrbzEtcnRjIiwKKwkiYWMxMDAtY2tvMi1ydGMiLAorCSJhYzEwMC1ja28zLXJ0YyIsCit9OworCitzdHJ1Y3QgYWMxMDBfcnRjX2RldiB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCWludCBpcnE7CisJdW5zaWduZWQgbG9uZyBhbGFybTsKKworCXN0cnVjdCBjbGtfaHcgKnJ0Y18zMmtfY2xrOworCXN0cnVjdCBhYzEwMF9jbGtvdXQgY2xrc1tBQzEwMF9DTEtPVVRfTlVNXTsKKwlzdHJ1Y3QgY2xrX2h3X29uZWNlbGxfZGF0YSAqY2xrX2RhdGE7Cit9OworCisvKioKKyAqIENsb2NrIGNvbnRyb2xzIGZvciAzIGNsb2NrIG91dHB1dCBwaW5zCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfZGl2X3RhYmxlIGFjMTAwX2Nsa291dF9wcmVkaXZbXSA9IHsKKwl7IC52YWwgPSAwLCAuZGl2ID0gMSB9LAorCXsgLnZhbCA9IDEsIC5kaXYgPSAyIH0sCisJeyAudmFsID0gMiwgLmRpdiA9IDQgfSwKKwl7IC52YWwgPSAzLCAuZGl2ID0gOCB9LAorCXsgLnZhbCA9IDQsIC5kaXYgPSAxNiB9LAorCXsgLnZhbCA9IDUsIC5kaXYgPSAzMiB9LAorCXsgLnZhbCA9IDYsIC5kaXYgPSA2NCB9LAorCXsgLnZhbCA9IDcsIC5kaXYgPSAxMjIgfSwKKwl7IH0sCit9OworCisvKiBBYnVzZSB0aGUgZmFjdCB0aGF0IG9uZSBwYXJlbnQgaXMgMzI3NjggSHosIGFuZCB0aGUgb3RoZXIgaXMgNCBNSHogKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFjMTAwX2Nsa291dF9yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwcmF0ZSkKK3sKKwlzdHJ1Y3QgYWMxMDBfY2xrb3V0ICpjbGsgPSB0b19hYzEwMF9jbGtvdXQoaHcpOworCXVuc2lnbmVkIGludCByZWcsIGRpdjsKKworCXJlZ21hcF9yZWFkKGNsay0+cmVnbWFwLCBjbGstPm9mZnNldCwgJnJlZyk7CisKKwkvKiBIYW5kbGUgcHJlLWRpdmlkZXIgZmlyc3QgKi8KKwlpZiAocHJhdGUgIT0gQUMxMDBfUlRDXzMyS19SQVRFKSB7CisJCWRpdiA9IChyZWcgPj4gQUMxMDBfQ0xLT1VUX1BSRV9ESVZfU0hJRlQpICYKKwkJCSgoMSA8PCBBQzEwMF9DTEtPVVRfUFJFX0RJVl9XSURUSCkgLSAxKTsKKwkJcHJhdGUgPSBkaXZpZGVyX3JlY2FsY19yYXRlKGh3LCBwcmF0ZSwgZGl2LAorCQkJCQkgICAgYWMxMDBfY2xrb3V0X3ByZWRpdiwgMCk7CisJfQorCisJZGl2ID0gKHJlZyA+PiBBQzEwMF9DTEtPVVRfRElWX1NISUZUKSAmCisJCShCSVQoQUMxMDBfQ0xLT1VUX0RJVl9XSURUSCkgLSAxKTsKKwlyZXR1cm4gZGl2aWRlcl9yZWNhbGNfcmF0ZShodywgcHJhdGUsIGRpdiwgTlVMTCwKKwkJCQkgICBDTEtfRElWSURFUl9QT1dFUl9PRl9UV08pOworfQorCitzdGF0aWMgbG9uZyBhYzEwMF9jbGtvdXRfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywgdW5zaWduZWQgbG9uZyByYXRlLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgYmVzdF9yYXRlID0gMCwgdG1wX3JhdGUsIHRtcF9wcmF0ZTsKKwlpbnQgaTsKKworCWlmIChwcmF0ZSA9PSBBQzEwMF9SVENfMzJLX1JBVEUpCisJCXJldHVybiBkaXZpZGVyX3JvdW5kX3JhdGUoaHcsIHJhdGUsICZwcmF0ZSwgTlVMTCwKKwkJCQkJICBBQzEwMF9DTEtPVVRfRElWX1dJRFRILAorCQkJCQkgIENMS19ESVZJREVSX1BPV0VSX09GX1RXTyk7CisKKwlmb3IgKGkgPSAwOyBhYzEwMF9jbGtvdXRfcHJlZGl2W2ldLmRpdjsgaSsrKSB7CisJCXRtcF9wcmF0ZSA9IERJVl9ST1VORF9VUChwcmF0ZSwgYWMxMDBfY2xrb3V0X3ByZWRpdltpXS52YWwpOworCQl0bXBfcmF0ZSA9IGRpdmlkZXJfcm91bmRfcmF0ZShodywgcmF0ZSwgJnRtcF9wcmF0ZSwgTlVMTCwKKwkJCQkJICAgICAgQUMxMDBfQ0xLT1VUX0RJVl9XSURUSCwKKwkJCQkJICAgICAgQ0xLX0RJVklERVJfUE9XRVJfT0ZfVFdPKTsKKworCQlpZiAodG1wX3JhdGUgPiByYXRlKQorCQkJY29udGludWU7CisJCWlmIChyYXRlIC0gdG1wX3JhdGUgPCBiZXN0X3JhdGUgLSB0bXBfcmF0ZSkKKwkJCWJlc3RfcmF0ZSA9IHRtcF9yYXRlOworCX0KKworCXJldHVybiBiZXN0X3JhdGU7Cit9CisKK3N0YXRpYyBpbnQgYWMxMDBfY2xrb3V0X2RldGVybWluZV9yYXRlKHN0cnVjdCBjbGtfaHcgKmh3LAorCQkJCSAgICAgICBzdHJ1Y3QgY2xrX3JhdGVfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjbGtfaHcgKmJlc3RfcGFyZW50OworCXVuc2lnbmVkIGxvbmcgYmVzdCA9IDA7CisJaW50IGksIG51bV9wYXJlbnRzID0gY2xrX2h3X2dldF9udW1fcGFyZW50cyhodyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhcmVudHM7IGkrKykgeworCQlzdHJ1Y3QgY2xrX2h3ICpwYXJlbnQgPSBjbGtfaHdfZ2V0X3BhcmVudF9ieV9pbmRleChodywgaSk7CisJCXVuc2lnbmVkIGxvbmcgdG1wLCBwcmF0ZSA9IGNsa19od19nZXRfcmF0ZShwYXJlbnQpOworCisJCXRtcCA9IGFjMTAwX2Nsa291dF9yb3VuZF9yYXRlKGh3LCByZXEtPnJhdGUsIHByYXRlKTsKKworCQlpZiAodG1wID4gcmVxLT5yYXRlKQorCQkJY29udGludWU7CisJCWlmIChyZXEtPnJhdGUgLSB0bXAgPCByZXEtPnJhdGUgLSBiZXN0KSB7CisJCQliZXN0ID0gdG1wOworCQkJYmVzdF9wYXJlbnQgPSBwYXJlbnQ7CisJCX0KKwl9CisKKwlpZiAoIWJlc3QpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVxLT5iZXN0X3BhcmVudF9odyA9IGJlc3RfcGFyZW50OworCXJlcS0+YmVzdF9wYXJlbnRfcmF0ZSA9IGJlc3Q7CisJcmVxLT5yYXRlID0gYmVzdDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjMTAwX2Nsa291dF9zZXRfcmF0ZShzdHJ1Y3QgY2xrX2h3ICpodywgdW5zaWduZWQgbG9uZyByYXRlLAorCQkJCSB1bnNpZ25lZCBsb25nIHByYXRlKQoreworCXN0cnVjdCBhYzEwMF9jbGtvdXQgKmNsayA9IHRvX2FjMTAwX2Nsa291dChodyk7CisJaW50IGRpdiA9IDAsIHByZV9kaXYgPSAwOworCisJZG8geworCQlkaXYgPSBkaXZpZGVyX2dldF92YWwocmF0ZSAqIGFjMTAwX2Nsa291dF9wcmVkaXZbcHJlX2Rpdl0uZGl2LAorCQkJCSAgICAgIHByYXRlLCBOVUxMLCBBQzEwMF9DTEtPVVRfRElWX1dJRFRILAorCQkJCSAgICAgIENMS19ESVZJREVSX1BPV0VSX09GX1RXTyk7CisJCWlmIChkaXYgPj0gMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKHByYXRlICE9IEFDMTAwX1JUQ18zMktfUkFURSAmJgorCQkgYWMxMDBfY2xrb3V0X3ByZWRpdlsrK3ByZV9kaXZdLmRpdik7CisKKwlpZiAoZGl2IDwgMCkKKwkJcmV0dXJuIGRpdjsKKworCXByZV9kaXYgPSBhYzEwMF9jbGtvdXRfcHJlZGl2W3ByZV9kaXZdLnZhbDsKKworCXJlZ21hcF91cGRhdGVfYml0cyhjbGstPnJlZ21hcCwgY2xrLT5vZmZzZXQsCisJCQkgICAoKDEgPDwgQUMxMDBfQ0xLT1VUX0RJVl9XSURUSCkgLSAxKSA8PCBBQzEwMF9DTEtPVVRfRElWX1NISUZUIHwKKwkJCSAgICgoMSA8PCBBQzEwMF9DTEtPVVRfUFJFX0RJVl9XSURUSCkgLSAxKSA8PCBBQzEwMF9DTEtPVVRfUFJFX0RJVl9TSElGVCwKKwkJCSAgIChkaXYgLSAxKSA8PCBBQzEwMF9DTEtPVVRfRElWX1NISUZUIHwKKwkJCSAgIChwcmVfZGl2IC0gMSkgPDwgQUMxMDBfQ0xLT1VUX1BSRV9ESVZfU0hJRlQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWMxMDBfY2xrb3V0X3ByZXBhcmUoc3RydWN0IGNsa19odyAqaHcpCit7CisJc3RydWN0IGFjMTAwX2Nsa291dCAqY2xrID0gdG9fYWMxMDBfY2xrb3V0KGh3KTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2xrLT5yZWdtYXAsIGNsay0+b2Zmc2V0LCBBQzEwMF9DTEtPVVRfRU4sCisJCQkJICBBQzEwMF9DTEtPVVRfRU4pOworfQorCitzdGF0aWMgdm9pZCBhYzEwMF9jbGtvdXRfdW5wcmVwYXJlKHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBhYzEwMF9jbGtvdXQgKmNsayA9IHRvX2FjMTAwX2Nsa291dChodyk7CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMoY2xrLT5yZWdtYXAsIGNsay0+b2Zmc2V0LCBBQzEwMF9DTEtPVVRfRU4sIDApOworfQorCitzdGF0aWMgaW50IGFjMTAwX2Nsa291dF9pc19wcmVwYXJlZChzdHJ1Y3QgY2xrX2h3ICpodykKK3sKKwlzdHJ1Y3QgYWMxMDBfY2xrb3V0ICpjbGsgPSB0b19hYzEwMF9jbGtvdXQoaHcpOworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWdtYXBfcmVhZChjbGstPnJlZ21hcCwgY2xrLT5vZmZzZXQsICZyZWcpOworCisJcmV0dXJuIHJlZyAmIEFDMTAwX0NMS09VVF9FTjsKK30KKworc3RhdGljIHU4IGFjMTAwX2Nsa291dF9nZXRfcGFyZW50KHN0cnVjdCBjbGtfaHcgKmh3KQoreworCXN0cnVjdCBhYzEwMF9jbGtvdXQgKmNsayA9IHRvX2FjMTAwX2Nsa291dChodyk7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZ21hcF9yZWFkKGNsay0+cmVnbWFwLCBjbGstPm9mZnNldCwgJnJlZyk7CisKKwlyZXR1cm4gKHJlZyA+PiBBQzEwMF9DTEtPVVRfTVVYX1NISUZUKSAmIDB4MTsKK30KKworc3RhdGljIGludCBhYzEwMF9jbGtvdXRfc2V0X3BhcmVudChzdHJ1Y3QgY2xrX2h3ICpodywgdTggaW5kZXgpCit7CisJc3RydWN0IGFjMTAwX2Nsa291dCAqY2xrID0gdG9fYWMxMDBfY2xrb3V0KGh3KTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoY2xrLT5yZWdtYXAsIGNsay0+b2Zmc2V0LAorCQkJCSAgQklUKEFDMTAwX0NMS09VVF9NVVhfU0hJRlQpLAorCQkJCSAgaW5kZXggPyBCSVQoQUMxMDBfQ0xLT1VUX01VWF9TSElGVCkgOiAwKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbGtfb3BzIGFjMTAwX2Nsa291dF9vcHMgPSB7CisJLnByZXBhcmUJPSBhYzEwMF9jbGtvdXRfcHJlcGFyZSwKKwkudW5wcmVwYXJlCT0gYWMxMDBfY2xrb3V0X3VucHJlcGFyZSwKKwkuaXNfcHJlcGFyZWQJPSBhYzEwMF9jbGtvdXRfaXNfcHJlcGFyZWQsCisJLnJlY2FsY19yYXRlCT0gYWMxMDBfY2xrb3V0X3JlY2FsY19yYXRlLAorCS5kZXRlcm1pbmVfcmF0ZQk9IGFjMTAwX2Nsa291dF9kZXRlcm1pbmVfcmF0ZSwKKwkuZ2V0X3BhcmVudAk9IGFjMTAwX2Nsa291dF9nZXRfcGFyZW50LAorCS5zZXRfcGFyZW50CT0gYWMxMDBfY2xrb3V0X3NldF9wYXJlbnQsCisJLnNldF9yYXRlCT0gYWMxMDBfY2xrb3V0X3NldF9yYXRlLAorfTsKKworc3RhdGljIGludCBhYzEwMF9ydGNfcmVnaXN0ZXJfY2xrcyhzdHJ1Y3QgYWMxMDBfcnRjX2RldiAqY2hpcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gY2hpcC0+ZGV2LT5vZl9ub2RlOworCWNvbnN0IGNoYXIgKnBhcmVudHNbMl0gPSB7QUMxMDBfUlRDXzMyS19OQU1FfTsKKwlpbnQgaSwgcmV0OworCisJY2hpcC0+Y2xrX2RhdGEgPSBkZXZtX2t6YWxsb2MoY2hpcC0+ZGV2LCBzaXplb2YoKmNoaXAtPmNsa19kYXRhKSArCisJCQkJCQkgc2l6ZW9mKCpjaGlwLT5jbGtfZGF0YS0+aHdzKSAqCisJCQkJCQkgQUMxMDBfQ0xLT1VUX05VTSwKKwkJCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoaXAtPmNsa19kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNoaXAtPnJ0Y18zMmtfY2xrID0gY2xrX2h3X3JlZ2lzdGVyX2ZpeGVkX3JhdGUoY2hpcC0+ZGV2LAorCQkJCQkJICAgICAgIEFDMTAwX1JUQ18zMktfTkFNRSwKKwkJCQkJCSAgICAgICBOVUxMLCAwLAorCQkJCQkJICAgICAgIEFDMTAwX1JUQ18zMktfUkFURSk7CisJaWYgKElTX0VSUihjaGlwLT5ydGNfMzJrX2NsaykpIHsKKwkJcmV0ID0gUFRSX0VSUihjaGlwLT5ydGNfMzJrX2Nsayk7CisJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFJUQy0zMmsgY2xvY2s6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwYXJlbnRzWzFdID0gb2ZfY2xrX2dldF9wYXJlbnRfbmFtZShucCwgMCk7CisJaWYgKCFwYXJlbnRzWzFdKSB7CisJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIGdldCBBRERBIDRNIGNsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFDMTAwX0NMS09VVF9OVU07IGkrKykgeworCQlzdHJ1Y3QgYWMxMDBfY2xrb3V0ICpjbGsgPSAmY2hpcC0+Y2xrc1tpXTsKKwkJc3RydWN0IGNsa19pbml0X2RhdGEgaW5pdCA9IHsKKwkJCS5uYW1lID0gYWMxMDBfY2xrb3V0X25hbWVzW2ldLAorCQkJLm9wcyA9ICZhYzEwMF9jbGtvdXRfb3BzLAorCQkJLnBhcmVudF9uYW1lcyA9IHBhcmVudHMsCisJCQkubnVtX3BhcmVudHMgPSBBUlJBWV9TSVpFKHBhcmVudHMpLAorCQkJLmZsYWdzID0gMCwKKwkJfTsKKworCQljbGstPnJlZ21hcCA9IGNoaXAtPnJlZ21hcDsKKwkJY2xrLT5vZmZzZXQgPSBBQzEwMF9DTEtPVVRfQ1RSTDEgKyBpOworCQljbGstPmh3LmluaXQgPSAmaW5pdDsKKworCQlyZXQgPSBkZXZtX2Nsa19od19yZWdpc3RlcihjaGlwLT5kZXYsICZjbGstPmh3KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihjaGlwLT5kZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgY2xrICclcyc6ICVkXG4iLAorCQkJCWluaXQubmFtZSwgcmV0KTsKKwkJCWdvdG8gZXJyX3VucmVnaXN0ZXJfcnRjXzMyazsKKwkJfQorCisJCWNoaXAtPmNsa19kYXRhLT5od3NbaV0gPSAmY2xrLT5odzsKKwl9CisKKwljaGlwLT5jbGtfZGF0YS0+bnVtID0gaTsKKwlyZXQgPSBvZl9jbGtfYWRkX2h3X3Byb3ZpZGVyKG5wLCBvZl9jbGtfaHdfb25lY2VsbF9nZXQsIGNoaXAtPmNsa19kYXRhKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl91bnJlZ2lzdGVyX3J0Y18zMms7CisKKwlyZXR1cm4gMDsKKworZXJyX3VucmVnaXN0ZXJfcnRjXzMyazoKKwljbGtfdW5yZWdpc3Rlcl9maXhlZF9yYXRlKGNoaXAtPnJ0Y18zMmtfY2xrLT5jbGspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYWMxMDBfcnRjX3VucmVnaXN0ZXJfY2xrcyhzdHJ1Y3QgYWMxMDBfcnRjX2RldiAqY2hpcCkKK3sKKwlvZl9jbGtfZGVsX3Byb3ZpZGVyKGNoaXAtPmRldi0+b2Zfbm9kZSk7CisJY2xrX3VucmVnaXN0ZXJfZml4ZWRfcmF0ZShjaGlwLT5ydGNfMzJrX2Nsay0+Y2xrKTsKK30KKworLyoqCisgKiBSVEMgcmVsYXRlZCBiaXRzCisgKi8KK3N0YXRpYyBpbnQgYWMxMDBfcnRjX2dldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpydGNfdG0pCit7CisJc3RydWN0IGFjMTAwX3J0Y19kZXYgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBjaGlwLT5yZWdtYXA7CisJdTE2IHJlZ1s3XTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX2J1bGtfcmVhZChyZWdtYXAsIEFDMTAwX1JUQ19TRUMsIHJlZywgNyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJ0Y190bS0+dG1fc2VjICA9IGJjZDJiaW4ocmVnWzBdICYgQUMxMDBfUlRDX1NFQ19NQVNLKTsKKwlydGNfdG0tPnRtX21pbiAgPSBiY2QyYmluKHJlZ1sxXSAmIEFDMTAwX1JUQ19NSU5fTUFTSyk7CisJcnRjX3RtLT50bV9ob3VyID0gYmNkMmJpbihyZWdbMl0gJiBBQzEwMF9SVENfSE9VX01BU0spOworCXJ0Y190bS0+dG1fd2RheSA9IGJjZDJiaW4ocmVnWzNdICYgQUMxMDBfUlRDX1dFRV9NQVNLKTsKKwlydGNfdG0tPnRtX21kYXkgPSBiY2QyYmluKHJlZ1s0XSAmIEFDMTAwX1JUQ19EQVlfTUFTSyk7CisJcnRjX3RtLT50bV9tb24gID0gYmNkMmJpbihyZWdbNV0gJiBBQzEwMF9SVENfTU9OX01BU0spIC0gMTsKKwlydGNfdG0tPnRtX3llYXIgPSBiY2QyYmluKHJlZ1s2XSAmIEFDMTAwX1JUQ19ZRUFfTUFTSykgKworCQkJICBBQzEwMF9ZRUFSX09GRjsKKworCXJldHVybiBydGNfdmFsaWRfdG0ocnRjX3RtKTsKK30KKworc3RhdGljIGludCBhYzEwMF9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKK3sKKwlzdHJ1Y3QgYWMxMDBfcnRjX2RldiAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNoaXAtPnJlZ21hcDsKKwlpbnQgeWVhcjsKKwl1MTYgcmVnWzhdOworCisJLyogb3VyIFJUQyBoYXMgYSBsaW1pdGVkIHllYXIgcmFuZ2UuLi4gKi8KKwl5ZWFyID0gcnRjX3RtLT50bV95ZWFyIC0gQUMxMDBfWUVBUl9PRkY7CisJaWYgKHllYXIgPCAwIHx8IHllYXIgPiAoQUMxMDBfWUVBUl9NQVggLSAxOTAwKSkgeworCQlkZXZfZXJyKGRldiwgInJ0YyBvbmx5IHN1cHBvcnRzIHllYXIgaW4gcmFuZ2UgJWQgLSAlZFxuIiwKKwkJCUFDMTAwX1lFQVJfTUlOLCBBQzEwMF9ZRUFSX01BWCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNvbnZlcnQgdG8gQkNEICovCisJcmVnWzBdID0gYmluMmJjZChydGNfdG0tPnRtX3NlYykgICAgICYgQUMxMDBfUlRDX1NFQ19NQVNLOworCXJlZ1sxXSA9IGJpbjJiY2QocnRjX3RtLT50bV9taW4pICAgICAmIEFDMTAwX1JUQ19NSU5fTUFTSzsKKwlyZWdbMl0gPSBiaW4yYmNkKHJ0Y190bS0+dG1faG91cikgICAgJiBBQzEwMF9SVENfSE9VX01BU0s7CisJcmVnWzNdID0gYmluMmJjZChydGNfdG0tPnRtX3dkYXkpICAgICYgQUMxMDBfUlRDX1dFRV9NQVNLOworCXJlZ1s0XSA9IGJpbjJiY2QocnRjX3RtLT50bV9tZGF5KSAgICAmIEFDMTAwX1JUQ19EQVlfTUFTSzsKKwlyZWdbNV0gPSBiaW4yYmNkKHJ0Y190bS0+dG1fbW9uICsgMSkgJiBBQzEwMF9SVENfTU9OX01BU0s7CisJcmVnWzZdID0gYmluMmJjZCh5ZWFyKQkJICAgICAmIEFDMTAwX1JUQ19ZRUFfTUFTSzsKKwkvKiB0cmlnZ2VyIHdyaXRlICovCisJcmVnWzddID0gQUMxMDBfUlRDX1VQRF9UUklHR0VSOworCisJLyogSXMgaXQgYSBsZWFwIHllYXI/ICovCisJaWYgKGlzX2xlYXBfeWVhcih5ZWFyICsgQUMxMDBfWUVBUl9PRkYgKyAxOTAwKSkKKwkJcmVnWzZdIHw9IEFDMTAwX1JUQ19ZRUFfTEVBUDsKKworCXJldHVybiByZWdtYXBfYnVsa193cml0ZShyZWdtYXAsIEFDMTAwX1JUQ19TRUMsIHJlZywgOCk7Cit9CisKK3N0YXRpYyBpbnQgYWMxMDBfcnRjX2FsYXJtX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZW4pCit7CisJc3RydWN0IGFjMTAwX3J0Y19kZXYgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBjaGlwLT5yZWdtYXA7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IGVuID8gQUMxMDBfQUxNX0lOVF9FTkFCTEUgOiAwOworCisJcmV0dXJuIHJlZ21hcF93cml0ZShyZWdtYXAsIEFDMTAwX0FMTV9JTlRfRU5BLCB2YWwpOworfQorCitzdGF0aWMgaW50IGFjMTAwX3J0Y19nZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgYWMxMDBfcnRjX2RldiAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNoaXAtPnJlZ21hcDsKKwlzdHJ1Y3QgcnRjX3RpbWUgKmFscm1fdG0gPSAmYWxybS0+dGltZTsKKwl1MTYgcmVnWzddOworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgQUMxMDBfQUxNX0lOVF9FTkEsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlhbHJtLT5lbmFibGVkID0gISEodmFsICYgQUMxMDBfQUxNX0lOVF9FTkFCTEUpOworCisJcmV0ID0gcmVnbWFwX2J1bGtfcmVhZChyZWdtYXAsIEFDMTAwX0FMTV9TRUMsIHJlZywgNyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWFscm1fdG0tPnRtX3NlYyAgPSBiY2QyYmluKHJlZ1swXSAmIEFDMTAwX0FMTV9TRUNfTUFTSyk7CisJYWxybV90bS0+dG1fbWluICA9IGJjZDJiaW4ocmVnWzFdICYgQUMxMDBfQUxNX01JTl9NQVNLKTsKKwlhbHJtX3RtLT50bV9ob3VyID0gYmNkMmJpbihyZWdbMl0gJiBBQzEwMF9BTE1fSE9VX01BU0spOworCWFscm1fdG0tPnRtX3dkYXkgPSBiY2QyYmluKHJlZ1szXSAmIEFDMTAwX0FMTV9XRUVfTUFTSyk7CisJYWxybV90bS0+dG1fbWRheSA9IGJjZDJiaW4ocmVnWzRdICYgQUMxMDBfQUxNX0RBWV9NQVNLKTsKKwlhbHJtX3RtLT50bV9tb24gID0gYmNkMmJpbihyZWdbNV0gJiBBQzEwMF9BTE1fTU9OX01BU0spIC0gMTsKKwlhbHJtX3RtLT50bV95ZWFyID0gYmNkMmJpbihyZWdbNl0gJiBBQzEwMF9BTE1fWUVBX01BU0spICsKKwkJCSAgIEFDMTAwX1lFQVJfT0ZGOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWMxMDBfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBhYzEwMF9ydGNfZGV2ICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gY2hpcC0+cmVnbWFwOworCXN0cnVjdCBydGNfdGltZSAqYWxybV90bSA9ICZhbHJtLT50aW1lOworCXUxNiByZWdbOF07CisJaW50IHllYXI7CisJaW50IHJldDsKKworCS8qIG91ciBhbGFybSBoYXMgYSBsaW1pdGVkIHllYXIgcmFuZ2UuLi4gKi8KKwl5ZWFyID0gYWxybV90bS0+dG1feWVhciAtIEFDMTAwX1lFQVJfT0ZGOworCWlmICh5ZWFyIDwgMCB8fCB5ZWFyID4gKEFDMTAwX1lFQVJfTUFYIC0gMTkwMCkpIHsKKwkJZGV2X2VycihkZXYsICJhbGFybSBvbmx5IHN1cHBvcnRzIHllYXIgaW4gcmFuZ2UgJWQgLSAlZFxuIiwKKwkJCUFDMTAwX1lFQVJfTUlOLCBBQzEwMF9ZRUFSX01BWCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNvbnZlcnQgdG8gQkNEICovCisJcmVnWzBdID0gKGJpbjJiY2QoYWxybV90bS0+dG1fc2VjKSAgJiBBQzEwMF9BTE1fU0VDX01BU0spIHwKKwkJCUFDMTAwX0FMTV9FTkFCTEVfRkxBRzsKKwlyZWdbMV0gPSAoYmluMmJjZChhbHJtX3RtLT50bV9taW4pICAmIEFDMTAwX0FMTV9NSU5fTUFTSykgfAorCQkJQUMxMDBfQUxNX0VOQUJMRV9GTEFHOworCXJlZ1syXSA9IChiaW4yYmNkKGFscm1fdG0tPnRtX2hvdXIpICYgQUMxMDBfQUxNX0hPVV9NQVNLKSB8CisJCQlBQzEwMF9BTE1fRU5BQkxFX0ZMQUc7CisJLyogRG8gbm90IGVuYWJsZSB3ZWVrZGF5IGFsYXJtICovCisJcmVnWzNdID0gYmluMmJjZChhbHJtX3RtLT50bV93ZGF5KSAmIEFDMTAwX0FMTV9XRUVfTUFTSzsKKwlyZWdbNF0gPSAoYmluMmJjZChhbHJtX3RtLT50bV9tZGF5KSAmIEFDMTAwX0FMTV9EQVlfTUFTSykgfAorCQkJQUMxMDBfQUxNX0VOQUJMRV9GTEFHOworCXJlZ1s1XSA9IChiaW4yYmNkKGFscm1fdG0tPnRtX21vbiArIDEpICAmIEFDMTAwX0FMTV9NT05fTUFTSykgfAorCQkJQUMxMDBfQUxNX0VOQUJMRV9GTEFHOworCXJlZ1s2XSA9IChiaW4yYmNkKHllYXIpICYgQUMxMDBfQUxNX1lFQV9NQVNLKSB8CisJCQlBQzEwMF9BTE1fRU5BQkxFX0ZMQUc7CisJLyogdHJpZ2dlciB3cml0ZSAqLworCXJlZ1s3XSA9IEFDMTAwX0FMTV9VUERfVFJJR0dFUjsKKworCXJldCA9IHJlZ21hcF9idWxrX3dyaXRlKHJlZ21hcCwgQUMxMDBfQUxNX1NFQywgcmVnLCA4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGFjMTAwX3J0Y19hbGFybV9pcnFfZW5hYmxlKGRldiwgYWxybS0+ZW5hYmxlZCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhYzEwMF9ydGNfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFjMTAwX3J0Y19kZXYgKmNoaXAgPSBkYXRhOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGNoaXAtPnJlZ21hcDsKKwl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2hpcC0+cnRjLT5vcHNfbG9jayk7CisKKwkvKiByZWFkIHN0YXR1cyAqLworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgQUMxMDBfQUxNX0lOVF9TVEEsICZ2YWwpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWYgKHZhbCAmIEFDMTAwX0FMTV9JTlRfRU5BQkxFKSB7CisJCS8qIHNpZ25hbCBydGMgZnJhbWV3b3JrICovCisJCXJ0Y191cGRhdGVfaXJxKGNoaXAtPnJ0YywgMSwgUlRDX0FGIHwgUlRDX0lSUUYpOworCisJCS8qIGNsZWFyIHN0YXR1cyAqLworCQlyZXQgPSByZWdtYXBfd3JpdGUocmVnbWFwLCBBQzEwMF9BTE1fSU5UX1NUQSwgdmFsKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0ICovCisJCXJldCA9IGFjMTAwX3J0Y19hbGFybV9pcnFfZW5hYmxlKGNoaXAtPmRldiwgMCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJmNoaXAtPnJ0Yy0+b3BzX2xvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzIGFjMTAwX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQkgID0gYWMxMDBfcnRjX2dldF90aW1lLAorCS5zZXRfdGltZQkgID0gYWMxMDBfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCSAgPSBhYzEwMF9ydGNfZ2V0X2FsYXJtLAorCS5zZXRfYWxhcm0JICA9IGFjMTAwX3J0Y19zZXRfYWxhcm0sCisJLmFsYXJtX2lycV9lbmFibGUgPSBhYzEwMF9ydGNfYWxhcm1faXJxX2VuYWJsZSwKK307CisKK3N0YXRpYyBpbnQgYWMxMDBfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFjMTAwX2RldiAqYWMxMDAgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGFjMTAwX3J0Y19kZXYgKmNoaXA7CisJaW50IHJldDsKKworCWNoaXAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2hpcCk7CisJY2hpcC0+ZGV2ID0gJnBkZXYtPmRldjsKKwljaGlwLT5yZWdtYXAgPSBhYzEwMC0+cmVnbWFwOworCisJY2hpcC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoY2hpcC0+aXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgcmVzb3VyY2VcbiIpOworCQlyZXR1cm4gY2hpcC0+aXJxOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwgY2hpcC0+aXJxLCBOVUxMLAorCQkJCQlhYzEwMF9ydGNfaXJxLAorCQkJCQlJUlFGX1NIQVJFRCB8IElSUUZfT05FU0hPVCwKKwkJCQkJZGV2X25hbWUoJnBkZXYtPmRldiksIGNoaXApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IHJlcXVlc3QgSVJRXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBhbHdheXMgdXNlIDI0IGhvdXIgbW9kZSAqLworCXJlZ21hcF93cml0ZV9iaXRzKGNoaXAtPnJlZ21hcCwgQUMxMDBfUlRDX0NUUkwsIEFDMTAwX1JUQ19DVFJMXzI0SE9VUiwKKwkJCSAgQUMxMDBfUlRDX0NUUkxfMjRIT1VSKTsKKworCS8qIGRpc2FibGUgY291bnRlciBhbGFybSBpbnRlcnJ1cHQgKi8KKwlyZWdtYXBfd3JpdGUoY2hpcC0+cmVnbWFwLCBBQzEwMF9BTE1fSU5UX0VOQSwgMCk7CisKKwkvKiBjbGVhciBjb3VudGVyIGFsYXJtIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCXJlZ21hcF93cml0ZShjaGlwLT5yZWdtYXAsIEFDMTAwX0FMTV9JTlRfU1RBLCBBQzEwMF9BTE1fSU5UX0VOQUJMRSk7CisKKwljaGlwLT5ydGMgPSBkZXZtX3J0Y19kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldiwgInJ0Yy1hYzEwMCIsCisJCQkJCSAgICAgJmFjMTAwX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKGNoaXAtPnJ0YykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlZ2lzdGVyIGRldmljZVxuIik7CisJCXJldHVybiBQVFJfRVJSKGNoaXAtPnJ0Yyk7CisJfQorCisJcmV0ID0gYWMxMDBfcnRjX3JlZ2lzdGVyX2Nsa3MoY2hpcCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJSVEMgZW5hYmxlZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYzEwMF9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFjMTAwX3J0Y19kZXYgKmNoaXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWFjMTAwX3J0Y191bnJlZ2lzdGVyX2Nsa3MoY2hpcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYWMxMDBfcnRjX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ4LXBvd2VycyxhYzEwMC1ydGMiIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFjMTAwX3J0Y19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFjMTAwX3J0Y19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGFjMTAwX3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IGFjMTAwX3J0Y19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCQk9ICJhYzEwMC1ydGMiLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBvZl9tYXRjaF9wdHIoYWMxMDBfcnRjX21hdGNoKSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYWMxMDBfcnRjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiWC1Qb3dlcnMgQUMxMDAgUlRDIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiQ2hlbi1ZdSBUc2FpIDx3ZW5zQGNzaWUub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXBtOHh4eC5jIGIvZHJpdmVycy9ydGMvcnRjLXBtOHh4eC5jCmluZGV4IDc5NWZjYmQuLmZhYzgzNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1wbTh4eHguYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtcG04eHh4LmMKQEAgLTQyOCw2ICs0MjgsNyBAQAogICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwbTh4eHhfaWRfdGFibGVbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInFjb20scG04OTIxLXJ0YyIsIC5kYXRhID0gJnBtODkyMV9yZWdzIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODAxOC1ydGMiLCAuZGF0YSA9ICZwbTg5MjFfcmVncyB9LAogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbTgwNTgtcnRjIiwgLmRhdGEgPSAmcG04MDU4X3JlZ3MgfSwKIAl7IC5jb21wYXRpYmxlID0gInFjb20scG04OTQxLXJ0YyIsIC5kYXRhID0gJnBtODk0MV9yZWdzIH0sCiAJeyB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKaW5kZXggZmIxYjU2YS4uMWRlMDg5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCkBAIC0yMTIsMTYgKzIxMiw2IEBACiB7CiAJLyogRGlzYWJsZSBleHRlbmRlZCBlcnJvciByZXBvcnRpbmcgZm9yIHRoaXMgZGV2aWNlLiAqLwogCWRhc2RfZWVyX2Rpc2FibGUoZGV2aWNlKTsKLQkvKiBGb3JnZXQgdGhlIGRpc2NpcGxpbmUgaW5mb3JtYXRpb24uICovCi0JaWYgKGRldmljZS0+ZGlzY2lwbGluZSkgewotCQlpZiAoZGV2aWNlLT5kaXNjaXBsaW5lLT51bmNoZWNrX2RldmljZSkKLQkJCWRldmljZS0+ZGlzY2lwbGluZS0+dW5jaGVja19kZXZpY2UoZGV2aWNlKTsKLQkJbW9kdWxlX3B1dChkZXZpY2UtPmRpc2NpcGxpbmUtPm93bmVyKTsKLQl9Ci0JZGV2aWNlLT5kaXNjaXBsaW5lID0gTlVMTDsKLQlpZiAoZGV2aWNlLT5iYXNlX2Rpc2NpcGxpbmUpCi0JCW1vZHVsZV9wdXQoZGV2aWNlLT5iYXNlX2Rpc2NpcGxpbmUtPm93bmVyKTsKLQlkZXZpY2UtPmJhc2VfZGlzY2lwbGluZSA9IE5VTEw7CiAJZGV2aWNlLT5zdGF0ZSA9IERBU0RfU1RBVEVfTkVXOwogCiAJaWYgKGRldmljZS0+YmxvY2spCkBAIC0zMzYsNiArMzI2LDcgQEAKIHsKIAlpbnQgcmM7CiAJc3RydWN0IGRhc2RfYmxvY2sgKmJsb2NrOworCXN0cnVjdCBnZW5kaXNrICpkaXNrOwogCiAJcmMgPSAwOwogCWJsb2NrID0gZGV2aWNlLT5ibG9jazsKQEAgLTM0Niw2ICszMzcsOSBAQAogCQlpZiAocmMpIHsKIAkJCWlmIChyYyAhPSAtRUFHQUlOKSB7CiAJCQkJZGV2aWNlLT5zdGF0ZSA9IERBU0RfU1RBVEVfVU5GTVQ7CisJCQkJZGlzayA9IGRldmljZS0+YmxvY2stPmdkcDsKKwkJCQlrb2JqZWN0X3VldmVudCgmZGlza190b19kZXYoZGlzayktPmtvYmosCisJCQkJCSAgICAgICBLT0JKX0NIQU5HRSk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQlyZXR1cm4gcmM7CkBAIC0yMjc0LDYgKzIyNjgsMTUgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCS8qCisJCSAqIERvbid0IHRyeSB0byBzdGFydCByZXF1ZXN0cyBpZiBkZXZpY2UgaXMgaW4KKwkJICogb2ZmbGluZSBwcm9jZXNzaW5nLCBpdCBtaWdodCB3YWl0IGZvcmV2ZXIKKwkJICovCisJCWlmICh0ZXN0X2JpdChEQVNEX0ZMQUdfT0ZGTElORSwgJmRldmljZS0+ZmxhZ3MpKSB7CisJCQljcXItPnN0YXR1cyA9IERBU0RfQ1FSX0ZBSUxFRDsKKwkJCWNxci0+aW50cmMgPSAtRU5PREVWOworCQkJY29udGludWU7CisJCX0KKwkJLyoKIAkJICogRG9uJ3QgdHJ5IHRvIHN0YXJ0IHJlcXVlc3RzIGlmIGRldmljZSBpcyBzdG9wcGVkCiAJCSAqIGV4Y2VwdCBwYXRoIHZlcmlmaWNhdGlvbiByZXF1ZXN0cwogCQkgKi8KQEAgLTMzNjQsNiArMzM2NywyMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGFzZF9nZW5lcmljX3Byb2JlKTsKIAordm9pZCBkYXNkX2dlbmVyaWNfZnJlZV9kaXNjaXBsaW5lKHN0cnVjdCBkYXNkX2RldmljZSAqZGV2aWNlKQoreworCS8qIEZvcmdldCB0aGUgZGlzY2lwbGluZSBpbmZvcm1hdGlvbi4gKi8KKwlpZiAoZGV2aWNlLT5kaXNjaXBsaW5lKSB7CisJCWlmIChkZXZpY2UtPmRpc2NpcGxpbmUtPnVuY2hlY2tfZGV2aWNlKQorCQkJZGV2aWNlLT5kaXNjaXBsaW5lLT51bmNoZWNrX2RldmljZShkZXZpY2UpOworCQltb2R1bGVfcHV0KGRldmljZS0+ZGlzY2lwbGluZS0+b3duZXIpOworCQlkZXZpY2UtPmRpc2NpcGxpbmUgPSBOVUxMOworCX0KKwlpZiAoZGV2aWNlLT5iYXNlX2Rpc2NpcGxpbmUpIHsKKwkJbW9kdWxlX3B1dChkZXZpY2UtPmJhc2VfZGlzY2lwbGluZS0+b3duZXIpOworCQlkZXZpY2UtPmJhc2VfZGlzY2lwbGluZSA9IE5VTEw7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoZGFzZF9nZW5lcmljX2ZyZWVfZGlzY2lwbGluZSk7CisKIC8qCiAgKiBUaGlzIHdpbGwgb25lIGRheSBiZSBjYWxsZWQgZnJvbSBhIGdsb2JhbCBub3Rfb3BlciBoYW5kbGVyLgogICogSXQgaXMgYWxzbyB1c2VkIGJ5IGRyaXZlcl91bnJlZ2lzdGVyIGR1cmluZyBtb2R1bGUgdW5sb2FkLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGV2bWFwLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYwppbmRleCAzY2RiY2U0Li4xNWExYTcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kZXZtYXAuYwpAQCAtNjE3LDYgKzYxNyw3IEBACiAJLyogV2FpdCBmb3IgcmVmZXJlbmNlIGNvdW50ZXIgdG8gZHJvcCB0byB6ZXJvLiAqLwogCXdhaXRfZXZlbnQoZGFzZF9kZWxldGVfd3EsIGF0b21pY19yZWFkKCZkZXZpY2UtPnJlZl9jb3VudCkgPT0gMCk7CiAKKwlkYXNkX2dlbmVyaWNfZnJlZV9kaXNjaXBsaW5lKGRldmljZSk7CiAJLyogRGlzY29ubmVjdCBkYXNkX2RldmljZSBzdHJ1Y3R1cmUgZnJvbSBjY3dfZGV2aWNlIHN0cnVjdHVyZS4gKi8KIAljZGV2ID0gZGV2aWNlLT5jZGV2OwogCWRldmljZS0+Y2RldiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKaW5kZXggOThiYmVjNC4uODMxOTM1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwpAQCAtNTIwMSw3ICs1MjAxLDcgQEAKIAogCWNxci0+YnVpbGRjbGsgPSBnZXRfdG9kX2Nsb2NrKCk7CiAJY3FyLT5zdGF0dXMgPSBEQVNEX0NRUl9GSUxMRUQ7Ci0JcmMgPSBkYXNkX3NsZWVwX29uKGNxcik7CisJcmMgPSBkYXNkX3NsZWVwX29uX2ludGVycnVwdGlibGUoY3FyKTsKIAlpZiAocmMgPT0gMCkgewogCQkqZGF0YSA9ICpob3N0X2FjY2VzczsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZXJwLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lcnAuYwppbmRleCBlMWU4ODQ4Li5kMTM4ZDAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lcnAuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lcnAuYwpAQCAtMTY5LDEyICsxNjksMTIgQEAKIAlkZXZpY2UgPSBjcXItPnN0YXJ0ZGV2OwogCWlmIChjcXItPmludHJjID09IC1FVElNRURPVVQpIHsKIAkJZGV2X2VycigmZGV2aWNlLT5jZGV2LT5kZXYsCi0JCQkiQSB0aW1lb3V0IGVycm9yIG9jY3VycmVkIGZvciBjcXIgJXAiLCBjcXIpOworCQkJIkEgdGltZW91dCBlcnJvciBvY2N1cnJlZCBmb3IgY3FyICVwXG4iLCBjcXIpOwogCQlyZXR1cm47CiAJfQogCWlmIChjcXItPmludHJjID09IC1FTk9MSU5LKSB7CiAJCWRldl9lcnIoJmRldmljZS0+Y2Rldi0+ZGV2LAotCQkJIkEgdHJhbnNwb3J0IGVycm9yIG9jY3VycmVkIGZvciBjcXIgJXAiLCBjcXIpOworCQkJIkEgdHJhbnNwb3J0IGVycm9yIG9jY3VycmVkIGZvciBjcXIgJXBcbiIsIGNxcik7CiAJCXJldHVybjsKIAl9CiAJLyogZHVtcCBzZW5zZSBkYXRhICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9pbnQuaCBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCmluZGV4IGFjNzAyN2UuLjg3ZmY2Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ludC5oCkBAIC03MjUsNiArNzI1LDcgQEAKIGludCAgZGFzZF9jYW5jZWxfcmVxKHN0cnVjdCBkYXNkX2Njd19yZXEgKik7CiBpbnQgZGFzZF9mbHVzaF9kZXZpY2VfcXVldWUoc3RydWN0IGRhc2RfZGV2aWNlICopOwogaW50IGRhc2RfZ2VuZXJpY19wcm9iZSAoc3RydWN0IGNjd19kZXZpY2UgKiwgc3RydWN0IGRhc2RfZGlzY2lwbGluZSAqKTsKK3ZvaWQgZGFzZF9nZW5lcmljX2ZyZWVfZGlzY2lwbGluZShzdHJ1Y3QgZGFzZF9kZXZpY2UgKik7CiB2b2lkIGRhc2RfZ2VuZXJpY19yZW1vdmUgKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2KTsKIGludCBkYXNkX2dlbmVyaWNfc2V0X29ubGluZShzdHJ1Y3QgY2N3X2RldmljZSAqLCBzdHJ1Y3QgZGFzZF9kaXNjaXBsaW5lICopOwogaW50IGRhc2RfZ2VuZXJpY19zZXRfb2ZmbGluZSAoc3RydWN0IGNjd19kZXZpY2UgKmNkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvY29uMzI3MC5jCmluZGV4IDZiMTU3N2MuLjI4NWI0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL2NvbjMyNzAuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9jb24zMjcwLmMKQEAgLTEyNCw3ICsxMjQsMTIgQEAKIHN0YXRpYyB2b2lkCiBjb24zMjcwX3VwZGF0ZV9zdHJpbmcoc3RydWN0IGNvbjMyNzAgKmNwLCBzdHJ1Y3Qgc3RyaW5nICpzLCBpbnQgbnIpCiB7Ci0JaWYgKHMtPmxlbiA+PSBjcC0+dmlldy5jb2xzIC0gNSkKKwlpZiAocy0+bGVuIDwgNCkgeworCQkvKiBUaGlzIGluZGljYXRlcyBhIGJ1ZywgYnV0IHByaW50aW5nIGEgd2FybmluZyB3b3VsZAorCQkgKiBjYXVzZSBhIGRlYWRsb2NrLiAqLworCQlyZXR1cm47CisJfQorCWlmIChzLT5zdHJpbmdbcy0+bGVuIC0gNF0gIT0gVE9fUkEpCiAJCXJldHVybjsKIAlyYXczMjcwX2J1ZmZlcl9hZGRyZXNzKGNwLT52aWV3LmRldiwgcy0+c3RyaW5nICsgcy0+bGVuIC0gMywKIAkJCSAgICAgICBjcC0+dmlldy5jb2xzICogKG5yICsgMSkpOwpAQCAtNDYwLDExICs0NjUsMTEgQEAKIAkJY3AtPmNsaW5lLT5sZW4gKyA0IDogY3AtPnZpZXcuY29sczsKIAlzID0gY29uMzI3MF9hbGxvY19zdHJpbmcoY3AsIHNpemUpOwogCW1lbWNweShzLT5zdHJpbmcsIGNwLT5jbGluZS0+c3RyaW5nLCBjcC0+Y2xpbmUtPmxlbik7Ci0JaWYgKHMtPmxlbiA8IGNwLT52aWV3LmNvbHMgLSA1KSB7CisJaWYgKGNwLT5jbGluZS0+bGVuIDwgY3AtPnZpZXcuY29scyAtIDUpIHsKIAkJcy0+c3RyaW5nW3MtPmxlbiAtIDRdID0gVE9fUkE7CiAJCXMtPnN0cmluZ1tzLT5sZW4gLSAxXSA9IDA7CiAJfSBlbHNlIHsKLQkJd2hpbGUgKC0tc2l6ZSA+IGNwLT5jbGluZS0+bGVuKQorCQl3aGlsZSAoLS1zaXplID49IGNwLT5jbGluZS0+bGVuKQogCQkJcy0+c3RyaW5nW3NpemVdID0gY3AtPnZpZXcuYXNjZWJjWycgJ107CiAJfQogCS8qIFJlcGxhY2UgY2xpbmUgd2l0aCBhbGxvY2F0ZWQgbGluZSBzIGFuZCByZXNldCBjbGluZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3RsLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2N0bC5jCmluZGV4IGVhNjA3YTQuLjU1NGVhYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfY3RsLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9jdGwuYwpAQCAtMTI2LDIxICsxMjYsNCBAQAogCS5uYW1lID0gInNjbHAiLAogCS5mb3BzID0gJnNjbHBfY3RsX2ZvcHMsCiB9OwotCi0vKgotICogUmVnaXN0ZXIgc2NscF9jdGwgbWlzYyBkZXZpY2UKLSAqLwotc3RhdGljIGludCBfX2luaXQgc2NscF9jdGxfaW5pdCh2b2lkKQotewotCXJldHVybiBtaXNjX3JlZ2lzdGVyKCZzY2xwX2N0bF9kZXZpY2UpOwotfQotbW9kdWxlX2luaXQoc2NscF9jdGxfaW5pdCk7Ci0KLS8qCi0gKiBEZXJlZ2lzdGVyIHNjbHBfY3RsIG1pc2MgZGV2aWNlCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBzY2xwX2N0bF9leGl0KHZvaWQpCi17Ci0JbWlzY19kZXJlZ2lzdGVyKCZzY2xwX2N0bF9kZXZpY2UpOwotfQotbW9kdWxlX2V4aXQoc2NscF9jdGxfZXhpdCk7Cittb2R1bGVfbWlzY19kZXZpY2Uoc2NscF9jdGxfZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKaW5kZXggZDNkMTkzNi4uZTM1MjA0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKQEAgLTMxMiwxNSArMzEyLDEwIEBACiAJCXJldHVybiAtRU5PU1lTOwogCWlmICghY3J5cHRfZW5hYmxlZChkZXZpY2UpKQogCQlyZXR1cm4gLUVVTkFUQ0g7Ci0JZXh0X2tla2xzID0ga21hbGxvYyhzaXplb2YoKmV4dF9rZWtscyksIEdGUF9LRVJORUwpOwotCWlmICghZXh0X2tla2xzKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoY29weV9mcm9tX3VzZXIoZXh0X2tla2xzLCAoY2hhciBfX3VzZXIgKilhcmcsIHNpemVvZigqZXh0X2tla2xzKSkpIHsKLQkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIG91dDsKLQl9CisJZXh0X2tla2xzID0gbWVtZHVwX3VzZXIoKGNoYXIgX191c2VyICopYXJnLCBzaXplb2YoKmV4dF9rZWtscykpOworCWlmIChJU19FUlIoZXh0X2tla2xzKSkKKwkJcmV0dXJuIFBUUl9FUlIoZXh0X2tla2xzKTsKIAlyYyA9IHRhcGVfMzU5Ml9rZWtsX3NldChkZXZpY2UsIGV4dF9rZWtscyk7Ci1vdXQ6CiAJa2ZyZWUoZXh0X2tla2xzKTsKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMgYi9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMKaW5kZXggNmMzMGU5M2EuLmZmMThmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3ZtdXIuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci92bXVyLmMKQEAgLTMwNiwxMCArMzA2LDExIEBACiB7CiAJc3RydWN0IHVyZGV2ICp1cmQ7CiAKLQlUUkFDRSgidXJfaW50X2hhbmRsZXI6IGludHBhcm09MHglbHggY3N0YXQ9JTAyeCBkc3RhdD0lMDJ4IHJlcz0ldVxuIiwKLQkgICAgICBpbnRwYXJtLCBpcmItPnNjc3cuY21kLmNzdGF0LCBpcmItPnNjc3cuY21kLmRzdGF0LAotCSAgICAgIGlyYi0+c2Nzdy5jbWQuY291bnQpOwotCisJaWYgKCFJU19FUlIoaXJiKSkgeworCQlUUkFDRSgidXJfaW50X2hhbmRsZXI6IGludHBhcm09MHglbHggY3N0YXQ9JTAyeCBkc3RhdD0lMDJ4IHJlcz0ldVxuIiwKKwkJICAgICAgaW50cGFybSwgaXJiLT5zY3N3LmNtZC5jc3RhdCwgaXJiLT5zY3N3LmNtZC5kc3RhdCwKKwkJICAgICAgaXJiLT5zY3N3LmNtZC5jb3VudCk7CisJfQogCWlmICghaW50cGFybSkgewogCQlUUkFDRSgidXJfaW50X2hhbmRsZXI6IHVuc29saWNpdGVkIGludGVycnVwdFxuIik7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKaW5kZXggOTQwZTcyNS4uMTE2NzQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaHNjLmMKQEAgLTk1LDEyICs5NSwxMyBAQAogaW50IGNoc2NfZ2V0X3NzZF9pbmZvKHN0cnVjdCBzdWJjaGFubmVsX2lkIHNjaGlkLCBzdHJ1Y3QgY2hzY19zc2RfaW5mbyAqc3NkKQogewogCXN0cnVjdCBjaHNjX3NzZF9hcmVhICpzc2RfYXJlYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjY29kZTsKIAlpbnQgcmV0OwogCWludCBpOwogCWludCBtYXNrOwogCi0Jc3Bpbl9sb2NrX2lycSgmY2hzY19wYWdlX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCW1lbXNldChjaHNjX3BhZ2UsIDAsIFBBR0VfU0laRSk7CiAJc3NkX2FyZWEgPSBjaHNjX3BhZ2U7CiAJc3NkX2FyZWEtPnJlcXVlc3QubGVuZ3RoID0gMHgwMDEwOwpAQCAtMTQ0LDcgKzE0NSw3IEBACiAJCQlzc2QtPmZsYVtpXSA9IHNzZF9hcmVhLT5mbGFbaV07CiAJfQogb3V0OgotCXNwaW5fdW5sb2NrX2lycSgmY2hzY19wYWdlX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoc2NfcGFnZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODMyLDkgKzgzMywxMCBAQAogCQl1MzIgZm10IDogNDsKIAkJdTMyIDogMTY7CiAJfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgKnNlY21fYXJlYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQsIGNjb2RlOwogCi0Jc3Bpbl9sb2NrX2lycSgmY2hzY19wYWdlX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCW1lbXNldChjaHNjX3BhZ2UsIDAsIFBBR0VfU0laRSk7CiAJc2VjbV9hcmVhID0gY2hzY19wYWdlOwogCXNlY21fYXJlYS0+cmVxdWVzdC5sZW5ndGggPSAweDAwNTA7CkBAIC04NjQsNyArODY2LDcgQEAKIAkJQ0lPX0NSV19FVkVOVCgyLCAiY2hzYzogc2VjbSBmYWlsZWQgKHJjPSUwNHgpXG4iLAogCQkJICAgICAgc2VjbV9hcmVhLT5yZXNwb25zZS5jb2RlKTsKIG91dDoKLQlzcGluX3VubG9ja19pcnEoJmNoc2NfcGFnZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTk5Miw2ICs5OTQsNyBAQAogCiBpbnQgY2hzY19nZXRfY2hhbm5lbF9tZWFzdXJlbWVudF9jaGFycyhzdHJ1Y3QgY2hhbm5lbF9wYXRoICpjaHApCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgY2NvZGUsIHJldDsKIAogCXN0cnVjdCB7CkBAIC0xMDIxLDcgKzEwMjQsNyBAQAogCWlmICghY3NzX2Noc2NfY2hhcmFjdGVyaXN0aWNzLnNjbWMgfHwgIWNzc19jaHNjX2NoYXJhY3RlcmlzdGljcy5zZWNtKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXNwaW5fbG9ja19pcnEoJmNoc2NfcGFnZV9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hzY19wYWdlX2xvY2ssIGZsYWdzKTsKIAltZW1zZXQoY2hzY19wYWdlLCAwLCBQQUdFX1NJWkUpOwogCXNjbWNfYXJlYSA9IGNoc2NfcGFnZTsKIAlzY21jX2FyZWEtPnJlcXVlc3QubGVuZ3RoID0gMHgwMDEwOwpAQCAtMTA1Myw3ICsxMDU2LDcgQEAKIAljaHNjX2luaXRpYWxpemVfY21nX2NoYXJzKGNocCwgc2NtY19hcmVhLT5jbWN2LAogCQkJCSAgKHN0cnVjdCBjbWdfY2hhcnMgKikgJnNjbWNfYXJlYS0+ZGF0YSk7CiBvdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjaHNjX3BhZ2VfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hzY19wYWdlX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTM0LDYgKzExMzcsNyBAQAogaW50IF9faW5pdAogY2hzY19kZXRlcm1pbmVfY3NzX2NoYXJhY3RlcmlzdGljcyh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgewogCQlzdHJ1Y3QgY2hzY19oZWFkZXIgcmVxdWVzdDsKQEAgLTExNDYsNyArMTE1MCw3IEBACiAJCXUzMiBjaHNjX2NoYXJbNTA4XTsKIAl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSAqc2NzY19hcmVhOwogCi0Jc3Bpbl9sb2NrX2lycSgmY2hzY19wYWdlX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCW1lbXNldChjaHNjX3BhZ2UsIDAsIFBBR0VfU0laRSk7CiAJc2NzY19hcmVhID0gY2hzY19wYWdlOwogCXNjc2NfYXJlYS0+cmVxdWVzdC5sZW5ndGggPSAweDAwMTA7CkBAIC0xMTY4LDcgKzExNzIsNyBAQAogCQlDSU9fQ1JXX0VWRU5UKDIsICJjaHNjOiBzY3NjIGZhaWxlZCAocmM9JTA0eClcbiIsCiAJCQkgICAgICBzY3NjX2FyZWEtPnJlc3BvbnNlLmNvZGUpOwogZXhpdDoKLQlzcGluX3VubG9ja19pcnEoJmNoc2NfcGFnZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaHNjX3BhZ2VfbG9jaywgZmxhZ3MpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5oCmluZGV4IDkzZGUwYjQuLmYwZTU3YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uaApAQCAtMTI3LDcgKzEyNyw2IEBACiBleHRlcm4gaW50IGNpb19oYWx0IChzdHJ1Y3Qgc3ViY2hhbm5lbCAqKTsKIGV4dGVybiBpbnQgY2lvX3N0YXJ0IChzdHJ1Y3Qgc3ViY2hhbm5lbCAqLCBzdHJ1Y3QgY2N3MSAqLCBfX3U4KTsKIGV4dGVybiBpbnQgY2lvX3N0YXJ0X2tleSAoc3RydWN0IHN1YmNoYW5uZWwgKiwgc3RydWN0IGNjdzEgKiwgX191OCwgX191OCk7Ci1leHRlcm4gaW50IGNpb19jYW5jZWwgKHN0cnVjdCBzdWJjaGFubmVsICopOwogZXh0ZXJuIGludCBjaW9fc2V0X29wdGlvbnMgKHN0cnVjdCBzdWJjaGFubmVsICosIGludCk7CiBleHRlcm4gaW50IGNpb191cGRhdGVfc2NoaWIoc3RydWN0IHN1YmNoYW5uZWwgKnNjaCk7CiBleHRlcm4gaW50IGNpb19jb21taXRfY29uZmlnKHN0cnVjdCBzdWJjaGFubmVsICpzY2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaCBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKaW5kZXggYmY0MDA2My4uNmQ0YjY4YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlLmgKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmUuaApAQCAtOTk5LDYgKzk5OSw3IEBACiAJCQkJCQkgX191MTYsIF9fdTE2LAogCQkJCQkJIGVudW0gcWV0aF9wcm90X3ZlcnNpb25zKTsKIGludCBxZXRoX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqLCBuZXRkZXZfZmVhdHVyZXNfdCk7CitpbnQgcWV0aF9yZWNvdmVyX2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICopOwogbmV0ZGV2X2ZlYXR1cmVzX3QgcWV0aF9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKiwgbmV0ZGV2X2ZlYXR1cmVzX3QpOwogCiAvKiBleHBvcnRzIGZvciBPU04gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYwppbmRleCA3ZGJhNmM4Li4yMGNmMjk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCkBAIC0zNjE5LDcgKzM2MTksOCBAQAogCQlpbnQgZTsKIAogCQllID0gMDsKLQkJd2hpbGUgKGJ1ZmZlci0+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+d29ya19xdWV1ZSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuYwppbmRleCA1ZDdmYmU0Li42MzdjZjg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogRGVidWcgdHJhY2VzIGZvciB6ZmNwLgogICoKLSAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAxMworICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDE2CiAgKi8KIAogI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAiemZjcCIKQEAgLTY1LDcgKzY1LDcgQEAKICAqIEB0YWc6IHRhZyBpbmRpY2F0aW5nIHdoaWNoIGtpbmQgb2YgdW5zb2xpY2l0ZWQgc3RhdHVzIGhhcyBiZWVuIHJlY2VpdmVkCiAgKiBAcmVxOiByZXF1ZXN0IGZvciB3aGljaCBhIHJlc3BvbnNlIHdhcyByZWNlaXZlZAogICovCi12b2lkIHpmY3BfZGJmX2hiYV9mc2ZfcmVzKGNoYXIgKnRhZywgc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQordm9pZCB6ZmNwX2RiZl9oYmFfZnNmX3JlcyhjaGFyICp0YWcsIGludCBsZXZlbCwgc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxKQogewogCXN0cnVjdCB6ZmNwX2RiZiAqZGJmID0gcmVxLT5hZGFwdGVyLT5kYmY7CiAJc3RydWN0IGZzZl9xdGNiX3ByZWZpeCAqcV9wcmVmID0gJnJlcS0+cXRjYi0+cHJlZml4OwpAQCAtODUsNiArODUsOCBAQAogCXJlYy0+dS5yZXMucmVxX2lzc3VlZCA9IHJlcS0+aXNzdWVkOwogCXJlYy0+dS5yZXMucHJvdF9zdGF0dXMgPSBxX3ByZWYtPnByb3Rfc3RhdHVzOwogCXJlYy0+dS5yZXMuZnNmX3N0YXR1cyA9IHFfaGVhZC0+ZnNmX3N0YXR1czsKKwlyZWMtPnUucmVzLnBvcnRfaGFuZGxlID0gcV9oZWFkLT5wb3J0X2hhbmRsZTsKKwlyZWMtPnUucmVzLmx1bl9oYW5kbGUgPSBxX2hlYWQtPmx1bl9oYW5kbGU7CiAKIAltZW1jcHkocmVjLT51LnJlcy5wcm90X3N0YXR1c19xdWFsLCAmcV9wcmVmLT5wcm90X3N0YXR1c19xdWFsLAogCSAgICAgICBGU0ZfUFJPVF9TVEFUVVNfUVVBTF9TSVpFKTsKQEAgLTk3LDcgKzk5LDcgQEAKIAkJCQkgIHJlYy0+cGxfbGVuLCAiZnNmX3JlcyIsIHJlcS0+cmVxX2lkKTsKIAl9CiAKLQlkZWJ1Z19ldmVudChkYmYtPmhiYSwgMSwgcmVjLCBzaXplb2YoKnJlYykpOworCWRlYnVnX2V2ZW50KGRiZi0+aGJhLCBsZXZlbCwgcmVjLCBzaXplb2YoKnJlYykpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiZi0+aGJhX2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMjQxLDcgKzI0Myw4IEBACiAJaWYgKHNkZXYpIHsKIAkJcmVjLT5sdW5fc3RhdHVzID0gYXRvbWljX3JlYWQoJnNkZXZfdG9femZjcChzZGV2KS0+c3RhdHVzKTsKIAkJcmVjLT5sdW4gPSB6ZmNwX3Njc2lfZGV2X2x1bihzZGV2KTsKLQl9CisJfSBlbHNlCisJCXJlYy0+bHVuID0gWkZDUF9EQkZfSU5WQUxJRF9MVU47CiB9CiAKIC8qKgpAQCAtMzIwLDEzICszMjMsNDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYmYtPnJlY19sb2NrLCBmbGFncyk7CiB9CiAKKy8qKgorICogemZjcF9kYmZfcmVjX3J1bl93a2EgLSB0cmFjZSB3a2EgcG9ydCBldmVudCB3aXRoIGluZm8gbGlrZSBydW5uaW5nIHJlY292ZXJ5CisgKiBAdGFnOiBpZGVudGlmaWVyIGZvciBldmVudAorICogQHdrYV9wb3J0OiB3ZWxsIGtub3duIGFkZHJlc3MgcG9ydAorICogQHJlcV9pZDogcmVxdWVzdCBJRCB0byBjb3JyZWxhdGUgd2l0aCBwb3RlbnRpYWwgSEJBIHRyYWNlIHJlY29yZAorICovCit2b2lkIHpmY3BfZGJmX3JlY19ydW5fd2thKGNoYXIgKnRhZywgc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgKndrYV9wb3J0LAorCQkJICB1NjQgcmVxX2lkKQoreworCXN0cnVjdCB6ZmNwX2RiZiAqZGJmID0gd2thX3BvcnQtPmFkYXB0ZXItPmRiZjsKKwlzdHJ1Y3QgemZjcF9kYmZfcmVjICpyZWMgPSAmZGJmLT5yZWNfYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGJmLT5yZWNfbG9jaywgZmxhZ3MpOworCW1lbXNldChyZWMsIDAsIHNpemVvZigqcmVjKSk7CisKKwlyZWMtPmlkID0gWkZDUF9EQkZfUkVDX1JVTjsKKwltZW1jcHkocmVjLT50YWcsIHRhZywgWkZDUF9EQkZfVEFHX0xFTik7CisJcmVjLT5wb3J0X3N0YXR1cyA9IHdrYV9wb3J0LT5zdGF0dXM7CisJcmVjLT5kX2lkID0gd2thX3BvcnQtPmRfaWQ7CisJcmVjLT5sdW4gPSBaRkNQX0RCRl9JTlZBTElEX0xVTjsKKworCXJlYy0+dS5ydW4uZnNmX3JlcV9pZCA9IHJlcV9pZDsKKwlyZWMtPnUucnVuLnJlY19zdGF0dXMgPSB+MDsKKwlyZWMtPnUucnVuLnJlY19zdGVwID0gfjA7CisJcmVjLT51LnJ1bi5yZWNfYWN0aW9uID0gfjA7CisJcmVjLT51LnJ1bi5yZWNfY291bnQgPSB+MDsKKworCWRlYnVnX2V2ZW50KGRiZi0+cmVjLCAxLCByZWMsIHNpemVvZigqcmVjKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGJmLT5yZWNfbG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgaW5saW5lCi12b2lkIHpmY3BfZGJmX3NhbihjaGFyICp0YWcsIHN0cnVjdCB6ZmNwX2RiZiAqZGJmLCB2b2lkICpkYXRhLCB1OCBpZCwgdTE2IGxlbiwKLQkJICB1NjQgcmVxX2lkLCB1MzIgZF9pZCkKK3ZvaWQgemZjcF9kYmZfc2FuKGNoYXIgKnRhZywgc3RydWN0IHpmY3BfZGJmICpkYmYsCisJCSAgY2hhciAqcGF5dGFnLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1OCBpZCwgdTE2IGxlbiwKKwkJICB1NjQgcmVxX2lkLCB1MzIgZF9pZCwgdTE2IGNhcF9sZW4pCiB7CiAJc3RydWN0IHpmY3BfZGJmX3NhbiAqcmVjID0gJmRiZi0+c2FuX2J1ZjsKIAl1MTYgcmVjX2xlbjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB6ZmNwX2RiZl9wYXkgKnBheWxvYWQgPSAmZGJmLT5wYXlfYnVmOworCXUxNiBwYXlfc3VtID0gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkYmYtPnNhbl9sb2NrLCBmbGFncyk7CiAJbWVtc2V0KHJlYywgMCwgc2l6ZW9mKCpyZWMpKTsKQEAgLTMzNCwxMCArMzcyLDQxIEBACiAJcmVjLT5pZCA9IGlkOwogCXJlYy0+ZnNmX3JlcV9pZCA9IHJlcV9pZDsKIAlyZWMtPmRfaWQgPSBkX2lkOwotCXJlY19sZW4gPSBtaW4obGVuLCAodTE2KVpGQ1BfREJGX1NBTl9NQVhfUEFZTE9BRCk7Ci0JbWVtY3B5KHJlYy0+cGF5bG9hZCwgZGF0YSwgcmVjX2xlbik7CiAJbWVtY3B5KHJlYy0+dGFnLCB0YWcsIFpGQ1BfREJGX1RBR19MRU4pOworCXJlYy0+cGxfbGVuID0gbGVuOyAvKiBmdWxsIGxlbmd0aCBldmVuIGlmIHdlIGNhcCBwYXkgYmVsb3cgKi8KKwlpZiAoIXNnKQorCQlnb3RvIG91dDsKKwlyZWNfbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzZy0+bGVuZ3RoLCBaRkNQX0RCRl9TQU5fTUFYX1BBWUxPQUQpOworCW1lbWNweShyZWMtPnBheWxvYWQsIHNnX3ZpcnQoc2cpLCByZWNfbGVuKTsgLyogcGFydCBvZiAxc3Qgc2cgZW50cnkgKi8KKwlpZiAobGVuIDw9IHJlY19sZW4pCisJCWdvdG8gb3V0OyAvKiBza2lwIHBheSByZWNvcmQgaWYgZnVsbCBjb250ZW50IGluIHJlYy0+cGF5bG9hZCAqLwogCisJLyogaWYgKGxlbiA+IHJlY19sZW4pOgorCSAqIGR1bXAgZGF0YSB1cCB0byBjYXBfbGVuIGlnbm9yaW5nIHNtYWxsIGR1cGxpY2F0ZSBpbiByZWMtPnBheWxvYWQKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGJmLT5wYXlfbG9jaywgZmxhZ3MpOworCW1lbXNldChwYXlsb2FkLCAwLCBzaXplb2YoKnBheWxvYWQpKTsKKwltZW1jcHkocGF5bG9hZC0+YXJlYSwgcGF5dGFnLCBaRkNQX0RCRl9UQUdfTEVOKTsKKwlwYXlsb2FkLT5mc2ZfcmVxX2lkID0gcmVxX2lkOworCXBheWxvYWQtPmNvdW50ZXIgPSAwOworCWZvciAoOyBzZyAmJiBwYXlfc3VtIDwgY2FwX2xlbjsgc2cgPSBzZ19uZXh0KHNnKSkgeworCQl1MTYgcGF5X2xlbiwgb2Zmc2V0ID0gMDsKKworCQl3aGlsZSAob2Zmc2V0IDwgc2ctPmxlbmd0aCAmJiBwYXlfc3VtIDwgY2FwX2xlbikgeworCQkJcGF5X2xlbiA9IG1pbigodTE2KVpGQ1BfREJGX1BBWV9NQVhfUkVDLAorCQkJCSAgICAgICh1MTYpKHNnLT5sZW5ndGggLSBvZmZzZXQpKTsKKwkJCS8qIGNhcF9sZW4gPD0gcGF5X3N1bSA8IGNhcF9sZW4rWkZDUF9EQkZfUEFZX01BWF9SRUMgKi8KKwkJCW1lbWNweShwYXlsb2FkLT5kYXRhLCBzZ192aXJ0KHNnKSArIG9mZnNldCwgcGF5X2xlbik7CisJCQlkZWJ1Z19ldmVudChkYmYtPnBheSwgMSwgcGF5bG9hZCwKKwkJCQkgICAgemZjcF9kYmZfcGxlbihwYXlfbGVuKSk7CisJCQlwYXlsb2FkLT5jb3VudGVyKys7CisJCQlvZmZzZXQgKz0gcGF5X2xlbjsKKwkJCXBheV9zdW0gKz0gcGF5X2xlbjsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmZGJmLT5wYXlfbG9jayk7CisKK291dDoKIAlkZWJ1Z19ldmVudChkYmYtPnNhbiwgMSwgcmVjLCBzaXplb2YoKnJlYykpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiZi0+c2FuX2xvY2ssIGZsYWdzKTsKIH0KQEAgLTM1NCw5ICs0MjMsNjIgQEAKIAlzdHJ1Y3QgemZjcF9mc2ZfY3RfZWxzICpjdF9lbHMgPSBmc2YtPmRhdGE7CiAJdTE2IGxlbmd0aDsKIAotCWxlbmd0aCA9ICh1MTYpKGN0X2Vscy0+cmVxLT5sZW5ndGggKyBGQ19DVF9IRFJfTEVOKTsKLQl6ZmNwX2RiZl9zYW4odGFnLCBkYmYsIHNnX3ZpcnQoY3RfZWxzLT5yZXEpLCBaRkNQX0RCRl9TQU5fUkVRLCBsZW5ndGgsCi0JCSAgICAgZnNmLT5yZXFfaWQsIGRfaWQpOworCWxlbmd0aCA9ICh1MTYpemZjcF9xZGlvX3JlYWxfYnl0ZXMoY3RfZWxzLT5yZXEpOworCXpmY3BfZGJmX3Nhbih0YWcsIGRiZiwgInNhbl9yZXEiLCBjdF9lbHMtPnJlcSwgWkZDUF9EQkZfU0FOX1JFUSwKKwkJICAgICBsZW5ndGgsIGZzZi0+cmVxX2lkLCBkX2lkLCBsZW5ndGgpOworfQorCitzdGF0aWMgdTE2IHpmY3BfZGJmX3Nhbl9yZXNfY2FwX2xlbl9pZl9ncG5fZnQoY2hhciAqdGFnLAorCQkJCQkgICAgICBzdHJ1Y3QgemZjcF9mc2ZfcmVxICpmc2YsCisJCQkJCSAgICAgIHUxNiBsZW4pCit7CisJc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqY3RfZWxzID0gZnNmLT5kYXRhOworCXN0cnVjdCBmY19jdF9oZHIgKnJlcWggPSBzZ192aXJ0KGN0X2Vscy0+cmVxKTsKKwlzdHJ1Y3QgZmNfbnNfZ2lkX2Z0ICpyZXFuID0gKHN0cnVjdCBmY19uc19naWRfZnQgKikocmVxaCArIDEpOworCXN0cnVjdCBzY2F0dGVybGlzdCAqcmVzcF9lbnRyeSA9IGN0X2Vscy0+cmVzcDsKKwlzdHJ1Y3QgZmNfZ3BuX2Z0X3Jlc3AgKmFjYzsKKwlpbnQgbWF4X2VudHJpZXMsIHgsIGxhc3QgPSAwOworCisJaWYgKCEobWVtY21wKHRhZywgImZzc2N0aDIiLCA3KSA9PSAwCisJICAgICAgJiYgY3RfZWxzLT5kX2lkID09IEZDX0ZJRF9ESVJfU0VSVgorCSAgICAgICYmIHJlcWgtPmN0X3JldiA9PSBGQ19DVF9SRVYKKwkgICAgICAmJiByZXFoLT5jdF9pbl9pZFswXSA9PSAwCisJICAgICAgJiYgcmVxaC0+Y3RfaW5faWRbMV0gPT0gMAorCSAgICAgICYmIHJlcWgtPmN0X2luX2lkWzJdID09IDAKKwkgICAgICAmJiByZXFoLT5jdF9mc190eXBlID09IEZDX0ZTVF9ESVIKKwkgICAgICAmJiByZXFoLT5jdF9mc19zdWJ0eXBlID09IEZDX05TX1NVQlRZUEUKKwkgICAgICAmJiByZXFoLT5jdF9vcHRpb25zID09IDAKKwkgICAgICAmJiByZXFoLT5fY3RfcmVzdmQxID09IDAKKwkgICAgICAmJiByZXFoLT5jdF9jbWQgPT0gRkNfTlNfR1BOX0ZUCisJICAgICAgLyogcmVxaC0+Y3RfbXJfc2l6ZSBjYW4gdmFyeSBzbyBkbyBub3QgbWF0Y2ggYnV0IHJlYWQgYmVsb3cgKi8KKwkgICAgICAmJiByZXFoLT5fY3RfcmVzdmQyID09IDAKKwkgICAgICAmJiByZXFoLT5jdF9yZWFzb24gPT0gMAorCSAgICAgICYmIHJlcWgtPmN0X2V4cGxhbiA9PSAwCisJICAgICAgJiYgcmVxaC0+Y3RfdmVuZG9yID09IDAKKwkgICAgICAmJiByZXFuLT5mbl9yZXN2ZCA9PSAwCisJICAgICAgJiYgcmVxbi0+Zm5fZG9tYWluX2lkX3Njb3BlID09IDAKKwkgICAgICAmJiByZXFuLT5mbl9hcmVhX2lkX3Njb3BlID09IDAKKwkgICAgICAmJiByZXFuLT5mbl9mYzRfdHlwZSA9PSBGQ19UWVBFX0ZDUCkpCisJCXJldHVybiBsZW47IC8qIG5vdCBHUE5fRlQgcmVzcG9uc2Ugc28gZG8gbm90IGNhcCAqLworCisJYWNjID0gc2dfdmlydChyZXNwX2VudHJ5KTsKKwltYXhfZW50cmllcyA9IChyZXFoLT5jdF9tcl9zaXplICogNCAvIHNpemVvZihzdHJ1Y3QgZmNfZ3BuX2Z0X3Jlc3ApKQorCQkrIDEgLyogemZjcF9mY19zY2FuX3BvcnRzOiBieXRlcyBjb3JyZWN0LCBlbnRyaWVzIG9mZi1ieS1vbmUKKwkJICAgICAqIHRvIGFjY291bnQgZm9yIGhlYWRlciBhcyAxc3QgcHNldWRvICJlbnRyeSIgKi87CisKKwkvKiB0aGUgYmFzaWMgQ1RfSVUgcHJlYW1ibGUgaXMgdGhlIHNhbWUgc2l6ZSBhcyBvbmUgZW50cnkgaW4gdGhlIEdQTl9GVAorCSAqIHJlc3BvbnNlLCBhbGxvd2luZyB1cyB0byBza2lwIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGl0IC0ganVzdCBza2lwIGl0CisJICovCisJZm9yICh4ID0gMTsgeCA8IG1heF9lbnRyaWVzICYmICFsYXN0OyB4KyspIHsKKwkJaWYgKHggJSAoWkZDUF9GQ19HUE5fRlRfRU5UX1BBR0UgKyAxKSkKKwkJCWFjYysrOworCQllbHNlCisJCQlhY2MgPSBzZ192aXJ0KCsrcmVzcF9lbnRyeSk7CisKKwkJbGFzdCA9IGFjYy0+ZnBfZmxhZ3MgJiBGQ19OU19GSURfTEFTVDsKKwl9CisJbGVuID0gbWluKGxlbiwgKHUxNikoeCAqIHNpemVvZihzdHJ1Y3QgZmNfZ3BuX2Z0X3Jlc3ApKSk7CisJcmV0dXJuIGxlbjsgLyogY2FwIGFmdGVyIGxhc3QgZW50cnkgKi8KIH0KIAogLyoqCkBAIC0zNzAsOSArNDkyLDEwIEBACiAJc3RydWN0IHpmY3BfZnNmX2N0X2VscyAqY3RfZWxzID0gZnNmLT5kYXRhOwogCXUxNiBsZW5ndGg7CiAKLQlsZW5ndGggPSAodTE2KShjdF9lbHMtPnJlc3AtPmxlbmd0aCArIEZDX0NUX0hEUl9MRU4pOwotCXpmY3BfZGJmX3Nhbih0YWcsIGRiZiwgc2dfdmlydChjdF9lbHMtPnJlc3ApLCBaRkNQX0RCRl9TQU5fUkVTLCBsZW5ndGgsCi0JCSAgICAgZnNmLT5yZXFfaWQsIDApOworCWxlbmd0aCA9ICh1MTYpemZjcF9xZGlvX3JlYWxfYnl0ZXMoY3RfZWxzLT5yZXNwKTsKKwl6ZmNwX2RiZl9zYW4odGFnLCBkYmYsICJzYW5fcmVzIiwgY3RfZWxzLT5yZXNwLCBaRkNQX0RCRl9TQU5fUkVTLAorCQkgICAgIGxlbmd0aCwgZnNmLT5yZXFfaWQsIGN0X2Vscy0+ZF9pZCwKKwkJICAgICB6ZmNwX2RiZl9zYW5fcmVzX2NhcF9sZW5faWZfZ3BuX2Z0KHRhZywgZnNmLCBsZW5ndGgpKTsKIH0KIAogLyoqCkBAIC0zODYsMTEgKzUwOSwxMyBAQAogCXN0cnVjdCBmc2Zfc3RhdHVzX3JlYWRfYnVmZmVyICpzcmIgPQogCQkoc3RydWN0IGZzZl9zdGF0dXNfcmVhZF9idWZmZXIgKikgZnNmLT5kYXRhOwogCXUxNiBsZW5ndGg7CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwogCiAJbGVuZ3RoID0gKHUxNikoc3JiLT5sZW5ndGggLQogCQkJb2Zmc2V0b2Yoc3RydWN0IGZzZl9zdGF0dXNfcmVhZF9idWZmZXIsIHBheWxvYWQpKTsKLQl6ZmNwX2RiZl9zYW4odGFnLCBkYmYsIHNyYi0+cGF5bG9hZC5kYXRhLCBaRkNQX0RCRl9TQU5fRUxTLCBsZW5ndGgsCi0JCSAgICAgZnNmLT5yZXFfaWQsIG50b2gyNChzcmItPmRfaWQpKTsKKwlzZ19pbml0X29uZSgmc2csIHNyYi0+cGF5bG9hZC5kYXRhLCBsZW5ndGgpOworCXpmY3BfZGJmX3Nhbih0YWcsIGRiZiwgInNhbl9lbHMiLCAmc2csIFpGQ1BfREJGX1NBTl9FTFMsIGxlbmd0aCwKKwkJICAgICBmc2YtPnJlcV9pZCwgbnRvaDI0KHNyYi0+ZF9pZCksIGxlbmd0aCk7CiB9CiAKIC8qKgpAQCAtMzk5LDcgKzUyNCw4IEBACiAgKiBAc2M6IHBvaW50ZXIgdG8gc3RydWN0IHNjc2lfY21uZAogICogQGZzZjogcG9pbnRlciB0byBzdHJ1Y3QgemZjcF9mc2ZfcmVxCiAgKi8KLXZvaWQgemZjcF9kYmZfc2NzaShjaGFyICp0YWcsIHN0cnVjdCBzY3NpX2NtbmQgKnNjLCBzdHJ1Y3QgemZjcF9mc2ZfcmVxICpmc2YpCit2b2lkIHpmY3BfZGJmX3Njc2koY2hhciAqdGFnLCBpbnQgbGV2ZWwsIHN0cnVjdCBzY3NpX2NtbmQgKnNjLAorCQkgICBzdHJ1Y3QgemZjcF9mc2ZfcmVxICpmc2YpCiB7CiAJc3RydWN0IHpmY3BfYWRhcHRlciAqYWRhcHRlciA9CiAJCShzdHJ1Y3QgemZjcF9hZGFwdGVyICopIHNjLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhWzBdOwpAQCAtNDQyLDcgKzU2OCw3IEBACiAJCX0KIAl9CiAKLQlkZWJ1Z19ldmVudChkYmYtPnNjc2ksIDEsIHJlYywgc2l6ZW9mKCpyZWMpKTsKKwlkZWJ1Z19ldmVudChkYmYtPnNjc2ksIGxldmVsLCByZWMsIHNpemVvZigqcmVjKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGJmLT5zY3NpX2xvY2ssIGZsYWdzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZGJmLmgKaW5kZXggMGJlM2Q0OC4uMzZkMDc1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9kYmYuaAorKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2RiZi5oCkBAIC0yLDcgKzIsNyBAQAogICogemZjcCBkZXZpY2UgZHJpdmVyCiAgKiBkZWJ1ZyBmZWF0dXJlIGRlY2xhcmF0aW9ucwogICoKLSAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwOCwgMjAxMAorICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA4LCAyMDE1CiAgKi8KIAogI2lmbmRlZiBaRkNQX0RCRl9ICkBAIC0xNyw2ICsxNywxMSBAQAogCiAjZGVmaW5lIFpGQ1BfREJGX0lOVkFMSURfTFVOCTB4RkZGRkZGRkZGRkZGRkZGRnVsbAogCitlbnVtIHpmY3BfZGJmX3BzZXVkb19lcnBfYWN0X3R5cGUgeworCVpGQ1BfUFNFVURPX0VSUF9BQ1RJT05fUlBPUlRfQUREID0gMHhmZiwKKwlaRkNQX1BTRVVET19FUlBfQUNUSU9OX1JQT1JUX0RFTCA9IDB4ZmUsCit9OworCiAvKioKICAqIHN0cnVjdCB6ZmNwX2RiZl9yZWNfdHJpZ2dlciAtIHRyYWNlIHJlY29yZCBmb3IgdHJpZ2dlcmVkIHJlY292ZXJ5IGFjdGlvbgogICogQHJlYWR5OiBudW1iZXIgb2YgcmVhZHkgcmVjb3ZlcnkgYWN0aW9ucwpAQCAtMTEwLDYgKzExNSw3IEBACiAJdTMyIGRfaWQ7CiAjZGVmaW5lIFpGQ1BfREJGX1NBTl9NQVhfUEFZTE9BRCAoRkNfQ1RfSERSX0xFTiArIDMyKQogCWNoYXIgcGF5bG9hZFtaRkNQX0RCRl9TQU5fTUFYX1BBWUxPQURdOworCXUxNiBwbF9sZW47CiB9IF9fcGFja2VkOwogCiAvKioKQEAgLTEyNiw2ICsxMzIsOCBAQAogCXU4ICBwcm90X3N0YXR1c19xdWFsW0ZTRl9QUk9UX1NUQVRVU19RVUFMX1NJWkVdOwogCXUzMiBmc2Zfc3RhdHVzOwogCXU4ICBmc2Zfc3RhdHVzX3F1YWxbRlNGX1NUQVRVU19RVUFMSUZJRVJfU0laRV07CisJdTMyIHBvcnRfaGFuZGxlOworCXUzMiBsdW5faGFuZGxlOwogfSBfX3BhY2tlZDsKIAogLyoqCkBAIC0yNzksNyArMjg3LDcgQEAKIHZvaWQgemZjcF9kYmZfaGJhX2ZzZl9yZXNwKGNoYXIgKnRhZywgaW50IGxldmVsLCBzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXEpCiB7CiAJaWYgKGRlYnVnX2xldmVsX2VuYWJsZWQocmVxLT5hZGFwdGVyLT5kYmYtPmhiYSwgbGV2ZWwpKQotCQl6ZmNwX2RiZl9oYmFfZnNmX3Jlcyh0YWcsIHJlcSk7CisJCXpmY3BfZGJmX2hiYV9mc2ZfcmVzKHRhZywgbGV2ZWwsIHJlcSk7CiB9CiAKIC8qKgpAQCAtMzE4LDcgKzMyNiw3IEBACiAJCQkJCXNjbWQtPmRldmljZS0+aG9zdC0+aG9zdGRhdGFbMF07CiAKIAlpZiAoZGVidWdfbGV2ZWxfZW5hYmxlZChhZGFwdGVyLT5kYmYtPnNjc2ksIGxldmVsKSkKLQkJemZjcF9kYmZfc2NzaSh0YWcsIHNjbWQsIHJlcSk7CisJCXpmY3BfZGJmX3Njc2kodGFnLCBsZXZlbCwgc2NtZCwgcmVxKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYwppbmRleCAzZmI0MTA5Li5hNTlkNjc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogRXJyb3IgUmVjb3ZlcnkgUHJvY2VkdXJlcyAoRVJQKS4KICAqCi0gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMTAKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAxNQogICovCiAKICNkZWZpbmUgS01TR19DT01QT05FTlQgInpmY3AiCkBAIC0xMjE3LDggKzEyMTcsMTQgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFpGQ1BfRVJQX0FDVElPTl9SRU9QRU5fUE9SVDoKLQkJaWYgKHJlc3VsdCA9PSBaRkNQX0VSUF9TVUNDRUVERUQpCi0JCQl6ZmNwX3Njc2lfc2NoZWR1bGVfcnBvcnRfcmVnaXN0ZXIocG9ydCk7CisJCS8qIFRoaXMgc3dpdGNoIGNhc2UgbWlnaHQgYWxzbyBoYXBwZW4gYWZ0ZXIgYSBmb3JjZWQgcmVvcGVuCisJCSAqIHdhcyBzdWNjZXNzZnVsbHkgZG9uZSBhbmQgdGh1cyBvdmVyd3JpdHRlbiB3aXRoIGEgbmV3CisJCSAqIG5vbi1mb3JjZWQgcmVvcGVuIGF0IGBlcnNmc18yJy4gSW4gdGhpcyBjYXNlLCB3ZSBtdXN0IG5vdAorCQkgKiBkbyB0aGUgY2xlYW4tdXAgb2YgdGhlIG5vbi1mb3JjZWQgdmVyc2lvbi4KKwkJICovCisJCWlmIChhY3QtPnN0ZXAgIT0gWkZDUF9FUlBfU1RFUF9VTklOSVRJQUxJWkVEKQorCQkJaWYgKHJlc3VsdCA9PSBaRkNQX0VSUF9TVUNDRUVERUQpCisJCQkJemZjcF9zY3NpX3NjaGVkdWxlX3Jwb3J0X3JlZ2lzdGVyKHBvcnQpOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFpGQ1BfRVJQX0FDVElPTl9SRU9QRU5fUE9SVF9GT1JDRUQ6CiAJCXB1dF9kZXZpY2UoJnBvcnQtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2V4dC5oIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9leHQuaAppbmRleCA1YjUwMDY1Li5jOGZlZDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2V4dC5oCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXh0LmgKQEAgLTMsNyArMyw3IEBACiAgKgogICogRXh0ZXJuYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgogICoKLSAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAxMAorICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDE1CiAgKi8KIAogI2lmbmRlZiBaRkNQX0VYVF9ICkBAIC0zNSw4ICszNSw5IEBACiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9yZWNfdHJpZyhjaGFyICosIHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKiwKIAkJCSAgICAgIHN0cnVjdCB6ZmNwX3BvcnQgKiwgc3RydWN0IHNjc2lfZGV2aWNlICosIHU4LCB1OCk7CiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9yZWNfcnVuKGNoYXIgKiwgc3RydWN0IHpmY3BfZXJwX2FjdGlvbiAqKTsKK2V4dGVybiB2b2lkIHpmY3BfZGJmX3JlY19ydW5fd2thKGNoYXIgKiwgc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgKiwgdTY0KTsKIGV4dGVybiB2b2lkIHpmY3BfZGJmX2hiYV9mc2ZfdXNzKGNoYXIgKiwgc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKLWV4dGVybiB2b2lkIHpmY3BfZGJmX2hiYV9mc2ZfcmVzKGNoYXIgKiwgc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKK2V4dGVybiB2b2lkIHpmY3BfZGJmX2hiYV9mc2ZfcmVzKGNoYXIgKiwgaW50LCBzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOwogZXh0ZXJuIHZvaWQgemZjcF9kYmZfaGJhX2JpdF9lcnIoY2hhciAqLCBzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOwogZXh0ZXJuIHZvaWQgemZjcF9kYmZfaGJhX2JlcnIoc3RydWN0IHpmY3BfZGJmICosIHN0cnVjdCB6ZmNwX2ZzZl9yZXEgKik7CiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9oYmFfZGVmX2VycihzdHJ1Y3QgemZjcF9hZGFwdGVyICosIHU2NCwgdTE2LCB2b2lkICoqKTsKQEAgLTQ0LDcgKzQ1LDggQEAKIGV4dGVybiB2b2lkIHpmY3BfZGJmX3Nhbl9yZXEoY2hhciAqLCBzdHJ1Y3QgemZjcF9mc2ZfcmVxICosIHUzMik7CiBleHRlcm4gdm9pZCB6ZmNwX2RiZl9zYW5fcmVzKGNoYXIgKiwgc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKIGV4dGVybiB2b2lkIHpmY3BfZGJmX3Nhbl9pbl9lbHMoY2hhciAqLCBzdHJ1Y3QgemZjcF9mc2ZfcmVxICopOwotZXh0ZXJuIHZvaWQgemZjcF9kYmZfc2NzaShjaGFyICosIHN0cnVjdCBzY3NpX2NtbmQgKiwgc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKK2V4dGVybiB2b2lkIHpmY3BfZGJmX3Njc2koY2hhciAqLCBpbnQsIHN0cnVjdCBzY3NpX2NtbmQgKiwKKwkJCSAgc3RydWN0IHpmY3BfZnNmX3JlcSAqKTsKIAogLyogemZjcF9lcnAuYyAqLwogZXh0ZXJuIHZvaWQgemZjcF9lcnBfc2V0X2FkYXB0ZXJfc3RhdHVzKHN0cnVjdCB6ZmNwX2FkYXB0ZXIgKiwgdTMyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCmluZGV4IDUyMmE2MzMuLjc1ZjgyMGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogSW1wbGVtZW50YXRpb24gb2YgRlNGIGNvbW1hbmRzLgogICoKLSAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAxMworICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDE1CiAgKi8KIAogI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAiemZjcCIKQEAgLTUwOCw3ICs1MDgsMTAgQEAKIAkJZmNfaG9zdF9wb3J0X3R5cGUoc2hvc3QpID0gRkNfUE9SVFRZUEVfUFRQOwogCQlicmVhazsKIAljYXNlIEZTRl9UT1BPX0ZBQlJJQzoKLQkJZmNfaG9zdF9wb3J0X3R5cGUoc2hvc3QpID0gRkNfUE9SVFRZUEVfTlBPUlQ7CisJCWlmIChib3R0b20tPmNvbm5lY3Rpb25fZmVhdHVyZXMgJiBGU0ZfRkVBVFVSRV9OUElWX01PREUpCisJCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9OUElWOworCQllbHNlCisJCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9OUE9SVDsKIAkJYnJlYWs7CiAJY2FzZSBGU0ZfVE9QT19BTDoKIAkJZmNfaG9zdF9wb3J0X3R5cGUoc2hvc3QpID0gRkNfUE9SVFRZUEVfTkxQT1JUOwpAQCAtNjEzLDcgKzYxNiw2IEBACiAKIAlpZiAoYWRhcHRlci0+Y29ubmVjdGlvbl9mZWF0dXJlcyAmIEZTRl9GRUFUVVJFX05QSVZfTU9ERSkgewogCQlmY19ob3N0X3Blcm1hbmVudF9wb3J0X25hbWUoc2hvc3QpID0gYm90dG9tLT53d3BuOwotCQlmY19ob3N0X3BvcnRfdHlwZShzaG9zdCkgPSBGQ19QT1JUVFlQRV9OUElWOwogCX0gZWxzZQogCQlmY19ob3N0X3Blcm1hbmVudF9wb3J0X25hbWUoc2hvc3QpID0gZmNfaG9zdF9wb3J0X25hbWUoc2hvc3QpOwogCWZjX2hvc3RfbWF4ZnJhbWVfc2l6ZShzaG9zdCkgPSBib3R0b20tPm1heGltdW1fZnJhbWVfc2l6ZTsKQEAgLTk4Miw4ICs5ODQsMTIgQEAKIAlpZiAoemZjcF9hZGFwdGVyX211bHRpX2J1ZmZlcl9hY3RpdmUoYWRhcHRlcikpIHsKIAkJaWYgKHpmY3BfcWRpb19zYmFsc19mcm9tX3NnKHFkaW8sICZyZXEtPnFkaW9fcmVxLCBzZ19yZXEpKQogCQkJcmV0dXJuIC1FSU87CisJCXF0Y2ItPmJvdHRvbS5zdXBwb3J0LnJlcV9idWZfbGVuZ3RoID0KKwkJCXpmY3BfcWRpb19yZWFsX2J5dGVzKHNnX3JlcSk7CiAJCWlmICh6ZmNwX3FkaW9fc2JhbHNfZnJvbV9zZyhxZGlvLCAmcmVxLT5xZGlvX3JlcSwgc2dfcmVzcCkpCiAJCQlyZXR1cm4gLUVJTzsKKwkJcXRjYi0+Ym90dG9tLnN1cHBvcnQucmVzcF9idWZfbGVuZ3RoID0KKwkJCXpmY3BfcWRpb19yZWFsX2J5dGVzKHNnX3Jlc3ApOwogCiAJCXpmY3BfcWRpb19zZXRfZGF0YV9kaXYocWRpbywgJnJlcS0+cWRpb19yZXEsCiAJCQkJCXpmY3BfcWRpb19zYmFsZV9jb3VudChzZ19yZXEpKTsKQEAgLTEwNzMsNiArMTA3OSw3IEBACiAKIAlyZXEtPmhhbmRsZXIgPSB6ZmNwX2ZzZl9zZW5kX2N0X2hhbmRsZXI7CiAJcmVxLT5xdGNiLT5oZWFkZXIucG9ydF9oYW5kbGUgPSB3a2FfcG9ydC0+aGFuZGxlOworCWN0LT5kX2lkID0gd2thX3BvcnQtPmRfaWQ7CiAJcmVxLT5kYXRhID0gY3Q7CiAKIAl6ZmNwX2RiZl9zYW5fcmVxKCJmc3NjdF8xIiwgcmVxLCB3a2FfcG9ydC0+ZF9pZCk7CkBAIC0xMTY5LDYgKzExNzYsNyBAQAogCiAJaHRvbjI0KHJlcS0+cXRjYi0+Ym90dG9tLnN1cHBvcnQuZF9pZCwgZF9pZCk7CiAJcmVxLT5oYW5kbGVyID0gemZjcF9mc2Zfc2VuZF9lbHNfaGFuZGxlcjsKKwllbHMtPmRfaWQgPSBkX2lkOwogCXJlcS0+ZGF0YSA9IGVsczsKIAogCXpmY3BfZGJmX3Nhbl9yZXEoImZzc2VsczEiLCByZXEsIGRfaWQpOwpAQCAtMTU3NSw3ICsxNTgzLDcgQEAKIGludCB6ZmNwX2ZzZl9vcGVuX3drYV9wb3J0KHN0cnVjdCB6ZmNwX2ZjX3drYV9wb3J0ICp3a2FfcG9ydCkKIHsKIAlzdHJ1Y3QgemZjcF9xZGlvICpxZGlvID0gd2thX3BvcnQtPmFkYXB0ZXItPnFkaW87Ci0Jc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxOworCXN0cnVjdCB6ZmNwX2ZzZl9yZXEgKnJlcSA9IE5VTEw7CiAJaW50IHJldHZhbCA9IC1FSU87CiAKIAlzcGluX2xvY2tfaXJxKCZxZGlvLT5yZXFfcV9sb2NrKTsKQEAgLTE2MDQsNiArMTYxMiw4IEBACiAJCXpmY3BfZnNmX3JlcV9mcmVlKHJlcSk7CiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxKCZxZGlvLT5yZXFfcV9sb2NrKTsKKwlpZiAocmVxICYmICFJU19FUlIocmVxKSkKKwkJemZjcF9kYmZfcmVjX3J1bl93a2EoImZzb3dwXzEiLCB3a2FfcG9ydCwgcmVxLT5yZXFfaWQpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTE2MjgsNyArMTYzOCw3IEBACiBpbnQgemZjcF9mc2ZfY2xvc2Vfd2thX3BvcnQoc3RydWN0IHpmY3BfZmNfd2thX3BvcnQgKndrYV9wb3J0KQogewogCXN0cnVjdCB6ZmNwX3FkaW8gKnFkaW8gPSB3a2FfcG9ydC0+YWRhcHRlci0+cWRpbzsKLQlzdHJ1Y3QgemZjcF9mc2ZfcmVxICpyZXE7CisJc3RydWN0IHpmY3BfZnNmX3JlcSAqcmVxID0gTlVMTDsKIAlpbnQgcmV0dmFsID0gLUVJTzsKIAogCXNwaW5fbG9ja19pcnEoJnFkaW8tPnJlcV9xX2xvY2spOwpAQCAtMTY1Nyw2ICsxNjY3LDggQEAKIAkJemZjcF9mc2ZfcmVxX2ZyZWUocmVxKTsKIG91dDoKIAlzcGluX3VubG9ja19pcnEoJnFkaW8tPnJlcV9xX2xvY2spOworCWlmIChyZXEgJiYgIUlTX0VSUihyZXEpKQorCQl6ZmNwX2RiZl9yZWNfcnVuX3drYSgiZnNjd3BfMSIsIHdrYV9wb3J0LCByZXEtPnJlcV9pZCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuaCBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZnNmLmgKaW5kZXggNTdhZTNhZS4uYmUxYzA0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9mc2YuaAorKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2ZzZi5oCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIEludGVyZmFjZSB0byB0aGUgRlNGIHN1cHBvcnQgZnVuY3Rpb25zLgogICoKLSAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAxMAorICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDE1CiAgKi8KIAogI2lmbmRlZiBGU0ZfSApAQCAtNDM2LDYgKzQzNiw3IEBACiAgKiBAaGFuZGxlcl9kYXRhOiBkYXRhIHBhc3NlZCB0byBoYW5kbGVyIGZ1bmN0aW9uCiAgKiBAcG9ydDogT3B0aW9uYWwgcG9pbnRlciB0byBwb3J0IGZvciB6ZmNwIGludGVybmFsIEVMUyAob25seSB0ZXN0IGxpbmsgQURJU0MpCiAgKiBAc3RhdHVzOiB1c2VkIHRvIHBhc3MgZXJyb3Igc3RhdHVzIHRvIGNhbGxpbmcgZnVuY3Rpb24KKyAqIEBkX2lkOiBEZXN0aW5hdGlvbiBJRCBvZiBlaXRoZXIgb3BlbiBXS0EgcG9ydCBmb3IgQ1Qgb3Igb2YgRF9JRCBmb3IgRUxTCiAgKi8KIHN0cnVjdCB6ZmNwX2ZzZl9jdF9lbHMgewogCXN0cnVjdCBzY2F0dGVybGlzdCAqcmVxOwpAQCAtNDQ0LDYgKzQ0NSw3IEBACiAJdm9pZCAqaGFuZGxlcl9kYXRhOwogCXN0cnVjdCB6ZmNwX3BvcnQgKnBvcnQ7CiAJaW50IHN0YXR1czsKKwl1MzIgZF9pZDsKIH07CiAKICNlbmRpZgkJCQkvKiBGU0ZfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9zY3NpLmMgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYwppbmRleCBiM2M2ZmY0Li45MDY5Zjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYworKysgYi9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBJbnRlcmZhY2UgdG8gTGludXggU0NTSSBtaWRsYXllci4KICAqCi0gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMTMKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAxNQogICovCiAKICNkZWZpbmUgS01TR19DT01QT05FTlQgInpmY3AiCkBAIC01NTYsNiArNTU2LDkgQEAKIAlpZHMucG9ydF9pZCA9IHBvcnQtPmRfaWQ7CiAJaWRzLnJvbGVzID0gRkNfUlBPUlRfUk9MRV9GQ1BfVEFSR0VUOwogCisJemZjcF9kYmZfcmVjX3RyaWcoInNjcGFkZHkiLCBwb3J0LT5hZGFwdGVyLCBwb3J0LCBOVUxMLAorCQkJICBaRkNQX1BTRVVET19FUlBfQUNUSU9OX1JQT1JUX0FERCwKKwkJCSAgWkZDUF9QU0VVRE9fRVJQX0FDVElPTl9SUE9SVF9BREQpOwogCXJwb3J0ID0gZmNfcmVtb3RlX3BvcnRfYWRkKHBvcnQtPmFkYXB0ZXItPnNjc2lfaG9zdCwgMCwgJmlkcyk7CiAJaWYgKCFycG9ydCkgewogCQlkZXZfZXJyKCZwb3J0LT5hZGFwdGVyLT5jY3dfZGV2aWNlLT5kZXYsCkBAIC01NzcsNiArNTgwLDkgQEAKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gcG9ydC0+cnBvcnQ7CiAKIAlpZiAocnBvcnQpIHsKKwkJemZjcF9kYmZfcmVjX3RyaWcoInNjcGRlbHkiLCBwb3J0LT5hZGFwdGVyLCBwb3J0LCBOVUxMLAorCQkJCSAgWkZDUF9QU0VVRE9fRVJQX0FDVElPTl9SUE9SVF9ERUwsCisJCQkJICBaRkNQX1BTRVVET19FUlBfQUNUSU9OX1JQT1JUX0RFTCk7CiAJCWZjX3JlbW90ZV9wb3J0X2RlbGV0ZShycG9ydCk7CiAJCXBvcnQtPnJwb3J0ID0gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCmluZGV4IDdkMWI0MzEuLjNlMmJkYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9LY29uZmlnCkBAIC0zOTYsMTggKzM5Niw2IEBACiAJICBQbGVhc2UgcmVhZCB0aGUgY29tbWVudHMgYXQgdGhlIHRvcCBvZgogCSAgPGZpbGU6ZHJpdmVycy9zY3NpLzN3LXNhcy5jPi4KIAotY29uZmlnIFNDU0lfNzAwMEZBU1NUCi0JdHJpc3RhdGUgIjcwMDBGQVNTVCBTQ1NJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0EgJiYgU0NTSSAmJiBJU0FfRE1BX0FQSQotCXNlbGVjdCBDSEVDS19TSUdOQVRVUkUKLQloZWxwCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgV2VzdGVybiBEaWdpdGFsIDcwMDAgU0NTSSBob3N0IGFkYXB0ZXIKLQkgIGZhbWlseS4gIFNvbWUgaW5mb3JtYXRpb24gaXMgaW4gdGhlIHNvdXJjZToKLQkgIDxmaWxlOmRyaXZlcnMvc2NzaS93ZDcwMDAuYz4uCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHdkNzAwMC4KLQogY29uZmlnIFNDU0lfQUNBUkQKIAl0cmlzdGF0ZSAiQUNBUkQgU0NTSSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJICYmIFNDU0kKQEAgLTUxMiwxOCArNTAwLDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkdmFuc3lzLgogCi1jb25maWcgU0NTSV9JTjIwMDAKLQl0cmlzdGF0ZSAiQWx3YXlzIElOMjAwMCBTQ1NJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0EgJiYgU0NTSQotCWhlbHAKLQkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgYW4gSVNBIGJ1cyBTQ1NJIGhvc3QgYWRhcHRlci4gIFlvdSdsbCBmaW5kIG1vcmUKLQkgIGluZm9ybWF0aW9uIGluIDxmaWxlOkRvY3VtZW50YXRpb24vc2NzaS9pbjIwMDAudHh0Pi4gSWYgaXQgZG9lc24ndCB3b3JrCi0JICBvdXQgb2YgdGhlIGJveCwgeW91IG1heSBoYXZlIHRvIGNoYW5nZSB0aGUganVtcGVycyBmb3IgSVJRIG9yCi0JICBhZGRyZXNzIHNlbGVjdGlvbi4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaW4yMDAwLgotCiBjb25maWcgU0NTSV9BUkNNU1IKIAl0cmlzdGF0ZSAiQVJFQ0EgKEFSQzExeHgvMTJ4eC8xM3h4LzE2eHgpIFNBVEEvU0FTIFJBSUQgSG9zdCBBZGFwdGVyIgogCWRlcGVuZHMgb24gUENJICYmIFNDU0kKQEAgLTU0MCw2ICs1MTYsNyBAQAogc291cmNlICJkcml2ZXJzL3Njc2kvZXNhczJyL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc2NzaS9tZWdhcmFpZC9LY29uZmlnLm1lZ2FyYWlkIgogc291cmNlICJkcml2ZXJzL3Njc2kvbXB0M3Nhcy9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3Njc2kvc21hcnRwcWkvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9zY3NpL3Vmcy9LY29uZmlnIgogCiBjb25maWcgU0NTSV9IUFRJT1AKQEAgLTY2MCwyMCArNjM3LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGRteDMxOTFkLgogCi1jb25maWcgU0NTSV9EVEMzMjgwCi0JdHJpc3RhdGUgIkRUQzMxODAvMzI4MCBTQ1NJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJU0EgJiYgU0NTSQotCXNlbGVjdCBTQ1NJX1NQSV9BVFRSUwotCXNlbGVjdCBDSEVDS19TSUdOQVRVUkUKLQloZWxwCi0JICBUaGlzIGlzIHN1cHBvcnQgZm9yIERUQyAzMTgwLzMyODAgU0NTSSBIb3N0IEFkYXB0ZXJzLiAgUGxlYXNlIHJlYWQKLQkgIHRoZSBTQ1NJLUhPV1RPLCBhdmFpbGFibGUgZnJvbQotCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPiwgYW5kIHRoZSBmaWxlCi0JICA8ZmlsZTpEb2N1bWVudGF0aW9uL3Njc2kvZHRjM3g4MC50eHQ+LgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkdGMuCi0KIGNvbmZpZyBTQ1NJX0VBVEEKIAl0cmlzdGF0ZSAiRUFUQSBJU0EvRUlTQS9QQ0kgKERQVCBhbmQgZ2VuZXJpYyBFQVRBL0RNQS1jb21wbGlhbnQgYm9hcmRzKSBzdXBwb3J0IgogCWRlcGVuZHMgb24gKElTQSB8fCBFSVNBIHx8IFBDSSkgJiYgU0NTSSAmJiBJU0FfRE1BX0FQSQpAQCAtMTI0OCwyMCArMTIxMSw2IEBACiAJICBub3QgYWxsb3cgdGFyZ2V0cyB0byBkaXNjb25uZWN0IGlzIG5vdCByZWFzb25hYmxlIGlmIHRoZXJlIGlzIG1vcmUKIAkgIHRoYW4gMSBkZXZpY2Ugb24gYSBTQ1NJIGJ1cy4gVGhlIG5vcm1hbCBhbnN3ZXIgdGhlcmVmb3JlIGlzIE4uCiAKLWNvbmZpZyBTQ1NJX1BBUzE2Ci0JdHJpc3RhdGUgIlBBUzE2IFNDU0kgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTQSAmJiBTQ1NJCi0Jc2VsZWN0IFNDU0lfU1BJX0FUVFJTCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBhIFNDU0kgaG9zdCBhZGFwdGVyLiAgSXQgaXMgZXhwbGFpbmVkIGluIHNlY3Rpb24KLQkgIDMuMTAgb2YgdGhlIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiAgSWYgaXQgZG9lc24ndCB3b3JrIG91dAotCSAgb2YgdGhlIGJveCwgeW91IG1heSBoYXZlIHRvIGNoYW5nZSBzb21lIHNldHRpbmdzIGluCi0JICA8ZmlsZTpkcml2ZXJzL3Njc2kvcGFzMTYuaD4uCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHBhczE2LgotCiBjb25maWcgU0NTSV9RTE9HSUNfRkFTCiAJdHJpc3RhdGUgIlFsb2dpYyBGQVMgU0NTSSBzdXBwb3J0IgogCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKQEAgLTEzODIsODkgKzEzMzEsNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYW01M2M5NzQuCiAKLWNvbmZpZyBTQ1NJX1QxMjgKLQl0cmlzdGF0ZSAiVHJhbnRvciBUMTI4L1QxMjhGL1QyMjggU0NTSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSVNBICYmIFNDU0kKLQlzZWxlY3QgU0NTSV9TUElfQVRUUlMKLQlzZWxlY3QgQ0hFQ0tfU0lHTkFUVVJFCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBzdXBwb3J0IGZvciBhIFNDU0kgaG9zdCBhZGFwdGVyLiBJdCBpcyBleHBsYWluZWQgaW4gc2VjdGlvbgotCSAgMy4xMSBvZiB0aGUgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KLQkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBJZiBpdCBkb2Vzbid0IHdvcmsgb3V0Ci0JICBvZiB0aGUgYm94LCB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHNvbWUgc2V0dGluZ3MgaW4KLQkgIDxmaWxlOmRyaXZlcnMvc2NzaS90MTI4Lmg+LiAgTm90ZSB0aGF0IFRyYW50b3Igd2FzIHB1cmNoYXNlZCBieQotCSAgQWRhcHRlYywgYW5kIHNvbWUgZm9ybWVyIFRyYW50b3IgcHJvZHVjdHMgYXJlIGJlaW5nIHNvbGQgdW5kZXIgdGhlCi0JICBBZGFwdGVjIG5hbWUuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHQxMjguCi0KLWNvbmZpZyBTQ1NJX1UxNF8zNEYKLQl0cmlzdGF0ZSAiVWx0cmFTdG9yIDE0Ri8zNEYgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElTQSAmJiBTQ1NJICYmIElTQV9ETUFfQVBJCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBzdXBwb3J0IGZvciB0aGUgVWx0cmFTdG9yIDE0RiBhbmQgMzRGIFNDU0ktMiBob3N0IGFkYXB0ZXJzLgotCSAgVGhlIHNvdXJjZSBhdCA8ZmlsZTpkcml2ZXJzL3Njc2kvdTE0LTM0Zi5jPiBjb250YWlucyBzb21lCi0JICBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGhhcmR3YXJlLiAgSWYgdGhlIGRyaXZlciBkb2Vzbid0IHdvcmsgb3V0IG9mCi0JICB0aGUgYm94LCB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHNvbWUgc2V0dGluZ3MgaW4KLQkgIDxmaWxlOiBkcml2ZXJzL3Njc2kvdTE0LTM0Zi5jPi4gIFJlYWQgdGhlIFNDU0ktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCi0JICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LiAgTm90ZSB0aGF0IHRoZXJlIGlzIGFsc28KLQkgIGFub3RoZXIgZHJpdmVyIGZvciB0aGUgc2FtZSBoYXJkd2FyZTogIlVsdHJhU3RvciBTQ1NJIHN1cHBvcnQiLAotCSAgYmVsb3cuICBZb3Ugc2hvdWxkIHNheSBZIHRvIGJvdGggb25seSBpZiB5b3Ugd2FudCAyNEYgc3VwcG9ydCBhcwotCSAgd2VsbC4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdTE0LTM0Zi4KLQotY29uZmlnIFNDU0lfVTE0XzM0Rl9UQUdHRURfUVVFVUUKLQlib29sICJlbmFibGUgdGFnZ2VkIGNvbW1hbmQgcXVldWVpbmciCi0JZGVwZW5kcyBvbiBTQ1NJX1UxNF8zNEYKLQloZWxwCi0JICBUaGlzIGlzIGEgZmVhdHVyZSBvZiBTQ1NJLTIgd2hpY2ggaW1wcm92ZXMgcGVyZm9ybWFuY2U6IHRoZSBob3N0Ci0JICBhZGFwdGVyIGNhbiBzZW5kIHNldmVyYWwgU0NTSSBjb21tYW5kcyB0byBhIGRldmljZSdzIHF1ZXVlIGV2ZW4gaWYKLQkgIHByZXZpb3VzIGNvbW1hbmRzIGhhdmVuJ3QgZmluaXNoZWQgeWV0LgotCSAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSAidTE0LTM0Zj10Yzp5IiBib290IG9wdGlvbi4KLQotY29uZmlnIFNDU0lfVTE0XzM0Rl9MSU5LRURfQ09NTUFORFMKLQlib29sICJlbmFibGUgZWxldmF0b3Igc29ydGluZyIKLQlkZXBlbmRzIG9uIFNDU0lfVTE0XzM0RgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZWxldmF0b3Igc29ydGluZyBmb3IgYWxsIHByb2JlZCBTQ1NJIGRpc2tzIGFuZAotCSAgQ0QtUk9Ncy4gSXQgZGVmaW5pdGVseSByZWR1Y2VzIHRoZSBhdmVyYWdlIHNlZWsgZGlzdGFuY2Ugd2hlbiBkb2luZwotCSAgcmFuZG9tIHNlZWtzLCBidXQgdGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSByZXN1bHQgaW4gYSBub3RpY2VhYmxlCi0JICBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudDogeW91ciBtaWxlYWdlIG1heSB2YXJ5Li4uCi0JICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlICJ1MTQtMzRmPWxjOnkiIGJvb3Qgb3B0aW9uLgotCi1jb25maWcgU0NTSV9VMTRfMzRGX01BWF9UQUdTCi0JaW50ICJtYXhpbXVtIG51bWJlciBvZiBxdWV1ZWQgY29tbWFuZHMiCi0JZGVwZW5kcyBvbiBTQ1NJX1UxNF8zNEYKLQlkZWZhdWx0ICI4IgotCWhlbHAKLQkgIFRoaXMgc3BlY2lmaWVzIGhvdyBtYW55IFNDU0kgY29tbWFuZHMgY2FuIGJlIG1heGltYWxseSBxdWV1ZWQgZm9yCi0JICBlYWNoIHByb2JlZCBTQ1NJIGRldmljZS4gWW91IHNob3VsZCByZWR1Y2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgOAotCSAgb25seSBpZiB5b3UgaGF2ZSBkaXNrcyB3aXRoIGJ1Z2d5IG9yIGxpbWl0ZWQgdGFnZ2VkIGNvbW1hbmQgc3VwcG9ydC4KLQkgIE1pbmltdW0gaXMgMiBhbmQgbWF4aW11bSBpcyAxNC4gVGhpcyB2YWx1ZSBpcyBhbHNvIHRoZSB3aW5kb3cgc2l6ZQotCSAgdXNlZCBieSB0aGUgZWxldmF0b3Igc29ydGluZyBvcHRpb24gYWJvdmUuIFRoZSBlZmZlY3RpdmUgdmFsdWUgdXNlZAotCSAgYnkgdGhlIGRyaXZlciBmb3IgZWFjaCBwcm9iZWQgU0NTSSBkZXZpY2UgaXMgcmVwb3J0ZWQgYXQgYm9vdCB0aW1lLgotCSAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSAidTE0LTM0Zj1tcTo4IiBib290IG9wdGlvbi4KLQotY29uZmlnIFNDU0lfVUxUUkFTVE9SCi0JdHJpc3RhdGUgIlVsdHJhU3RvciBTQ1NJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBYODYgJiYgSVNBICYmIFNDU0kgJiYgSVNBX0RNQV9BUEkKLQktLS1oZWxwLS0tCi0JICBUaGlzIGlzIHN1cHBvcnQgZm9yIHRoZSBVbHRyYVN0b3IgMTRGLCAyNEYgYW5kIDM0RiBTQ1NJLTIgaG9zdAotCSAgYWRhcHRlciBmYW1pbHkuICBUaGlzIGRyaXZlciBpcyBleHBsYWluZWQgaW4gc2VjdGlvbiAzLjEyIG9mIHRoZQotCSAgU0NTSS1IT1dUTywgYXZhaWxhYmxlIGZyb20KLQkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uICBJZiBpdCBkb2Vzbid0IHdvcmsgb3V0Ci0JICBvZiB0aGUgYm94LCB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHNvbWUgc2V0dGluZ3MgaW4KLQkgIDxmaWxlOmRyaXZlcnMvc2NzaS91bHRyYXN0b3IuaD4uCi0KLQkgIE5vdGUgdGhhdCB0aGVyZSBpcyBhbHNvIGFub3RoZXIgZHJpdmVyIGZvciB0aGUgc2FtZSBoYXJkd2FyZToKLQkgICJVbHRyYVN0b3IgMTRGLzM0RiBzdXBwb3J0IiwgYWJvdmUuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHVsdHJhc3Rvci4KLQogY29uZmlnIFNDU0lfTlNQMzIKIAl0cmlzdGF0ZSAiV29ya2JpdCBOaW5qYVNDU0ktMzJCaS9VREUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJICYmICE2NEJJVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCmluZGV4IGQ1Mzk3OTguLjM4ZDkzOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKQEAgLTYxLDkgKzYxLDcgQEAKIG9iai0kKENPTkZJR19TQ1NJX0FEVkFOU1lTKQkrPSBhZHZhbnN5cy5vCiBvYmotJChDT05GSUdfU0NTSV9CVVNMT0dJQykJKz0gQnVzTG9naWMubwogb2JqLSQoQ09ORklHX1NDU0lfRFBUX0kyTykJKz0gZHB0X2kyby5vCi1vYmotJChDT05GSUdfU0NTSV9VMTRfMzRGKQkrPSB1MTQtMzRmLm8KIG9iai0kKENPTkZJR19TQ1NJX0FSQ01TUikJKz0gYXJjbXNyLwotb2JqLSQoQ09ORklHX1NDU0lfVUxUUkFTVE9SKQkrPSB1bHRyYXN0b3Iubwogb2JqLSQoQ09ORklHX1NDU0lfQUhBMTUyWCkJKz0gYWhhMTUyeC5vCiBvYmotJChDT05GSUdfU0NTSV9BSEExNTQyKQkrPSBhaGExNTQyLm8KIG9iai0kKENPTkZJR19TQ1NJX0FIQTE3NDApCSs9IGFoYTE3NDAubwpAQCAtNzUsNyArNzMsNiBAQAogb2JqLSQoQ09ORklHX1NDU0lfSVNDSSkJCSs9IGlzY2kvCiBvYmotJChDT05GSUdfU0NTSV9JUFMpCQkrPSBpcHMubwogb2JqLSQoQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTikrPSBmZG9tYWluLm8KLW9iai0kKENPTkZJR19TQ1NJX0lOMjAwMCkJKz0gaW4yMDAwLm8KIG9iai0kKENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MCkgKz0gZ19OQ1I1MzgwLm8KIG9iai0kKENPTkZJR19TQ1NJX0dFTkVSSUNfTkNSNTM4MF9NTUlPKSArPSBnX05DUjUzODBfbW1pby5vCiBvYmotJChDT05GSUdfU0NTSV9OQ1I1M0M0MDZBKQkrPSBOQ1I1M2M0MDZhLm8KQEAgLTkwLDE1ICs4NywxMiBAQAogb2JqLSQoQ09ORklHX1NDU0lfTFBGQykJCSs9IGxwZmMvCiBvYmotJChDT05GSUdfU0NTSV9CRkFfRkMpCSs9IGJmYS8KIG9iai0kKENPTkZJR19TQ1NJX0NIRUxTSU9fRkNPRSkJKz0gY3Npb3N0b3IvCi1vYmotJChDT05GSUdfU0NTSV9QQVMxNikJKz0gcGFzMTYubwotb2JqLSQoQ09ORklHX1NDU0lfVDEyOCkJCSs9IHQxMjgubwogb2JqLSQoQ09ORklHX1NDU0lfRE1YMzE5MUQpCSs9IGRteDMxOTFkLm8KIG9iai0kKENPTkZJR19TQ1NJX0hQU0EpCQkrPSBocHNhLm8KLW9iai0kKENPTkZJR19TQ1NJX0RUQzMyODApCSs9IGR0Yy5vCitvYmotJChDT05GSUdfU0NTSV9TTUFSVFBRSSkJKz0gc21hcnRwcWkvCiBvYmotJChDT05GSUdfU0NTSV9TWU01M0M4WFhfMikJKz0gc3ltNTNjOHh4XzIvCiBvYmotJChDT05GSUdfU0NTSV9aQUxPTikJKz0gemFsb243eHgubwogb2JqLSQoQ09ORklHX1NDU0lfRUFUQV9QSU8pCSs9IGVhdGFfcGlvLm8KLW9iai0kKENPTkZJR19TQ1NJXzcwMDBGQVNTVCkJKz0gd2Q3MDAwLm8KIG9iai0kKENPTkZJR19TQ1NJX0VBVEEpCQkrPSBlYXRhLm8KIG9iai0kKENPTkZJR19TQ1NJX0RDMzk1eCkJKz0gZGMzOTV4Lm8KIG9iai0kKENPTkZJR19TQ1NJX0FNNTNDOTc0KQkrPSBlc3Bfc2NzaS5vCWFtNTNjOTc0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMgYi9kcml2ZXJzL3Njc2kvTkNSNTM4MC5jCmluZGV4IDQzOTA4YmIuLmRiMjczOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmMKKysrIGIvZHJpdmVycy9zY3NpL05DUjUzODAuYwpAQCAtMjMwLDEzICsyMzAsNiBAQAogCXJldHVybiAtRVRJTUVET1VUOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBOQ1I1MzgwX3BvbGxfcG9saXRlbHkoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZywgaW50IGJpdCwgaW50IHZhbCwgaW50IHdhaXQpCi17Ci0JcmV0dXJuIE5DUjUzODBfcG9sbF9wb2xpdGVseTIoaW5zdGFuY2UsIHJlZywgYml0LCB2YWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZywgYml0LCB2YWwsIHdhaXQpOwotfQotCiAjaWYgTkRFQlVHCiBzdGF0aWMgc3RydWN0IHsKIAl1bnNpZ25lZCBjaGFyIG1hc2s7CkBAIC0xODU0LDExICsxODQ3LDExIEBACiAJCQkJCQkvKiBYWFggLSBuZWVkIHRvIHNvdXJjZSBvciBzaW5rIGRhdGEgaGVyZSwgYXMgYXBwcm9wcmlhdGUgKi8KIAkJCQkJfQogCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIEJyZWFrIHVwIHRyYW5zZmVyIGludG8gMyBtcyBjaHVua3MsCi0JCQkJCSAqIHByZXN1bWluZyA2IGFjY2Vzc2VzIHBlciBoYW5kc2hha2UuCisJCQkJCS8qIFRyYW5zZmVyIGEgc21hbGwgY2h1bmsgc28gdGhhdCB0aGUKKwkJCQkJICogaXJxIG1vZGUgbG9jayBpcyBub3QgaGVsZCB0b28gbG9uZy4KIAkJCQkJICovCi0JCQkJCXRyYW5zZmVyc2l6ZSA9IG1pbigodW5zaWduZWQgbG9uZyljbWQtPlNDcC50aGlzX3Jlc2lkdWFsLAotCQkJCQkgICAgICAgICAgICAgICAgICAgaG9zdGRhdGEtPmFjY2Vzc2VzX3Blcl9tcyAvIDIpOworCQkJCQl0cmFuc2ZlcnNpemUgPSBtaW4oY21kLT5TQ3AudGhpc19yZXNpZHVhbCwKKwkJCQkJCQkgICBOQ1I1MzgwX1BJT19DSFVOS19TSVpFKTsKIAkJCQkJbGVuID0gdHJhbnNmZXJzaXplOwogCQkJCQlOQ1I1MzgwX3RyYW5zZmVyX3BpbyhpbnN0YW5jZSwgJnBoYXNlLCAmbGVuLAogCQkJCQkgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKikmY21kLT5TQ3AucHRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmggYi9kcml2ZXJzL3Njc2kvTkNSNTM4MC5oCmluZGV4IGM2MDcyODcuLjk2NWQ5MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9OQ1I1MzgwLmgKKysrIGIvZHJpdmVycy9zY3NpL05DUjUzODAuaApAQCAtMjUwLDYgKzI1MCw4IEBACiAKICNkZWZpbmUgTkNSNTM4MF9DTURfU0laRQkJKHNpemVvZihzdHJ1Y3QgTkNSNTM4MF9jbWQpKQogCisjZGVmaW5lIE5DUjUzODBfUElPX0NIVU5LX1NJWkUJCTI1NgorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzY3NpX2NtbmQgKk5DUjUzODBfdG9fc2NtZChzdHJ1Y3QgTkNSNTM4MF9jbWQgKm5jbWRfcHRyKQogewogCXJldHVybiAoKHN0cnVjdCBzY3NpX2NtbmQgKiluY21kX3B0cikgLSAxOwpAQCAtMjkyLDggKzI5NCwxNCBAQAogc3RhdGljIHN0cnVjdCBzY3NpX2NtbmQgKk5DUjUzODBfc2VsZWN0KHN0cnVjdCBTY3NpX0hvc3QgKiwgc3RydWN0IHNjc2lfY21uZCAqKTsKIHN0YXRpYyBpbnQgTkNSNTM4MF90cmFuc2Zlcl9kbWEoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIHVuc2lnbmVkIGNoYXIgKnBoYXNlLCBpbnQgKmNvdW50LCB1bnNpZ25lZCBjaGFyICoqZGF0YSk7CiBzdGF0aWMgaW50IE5DUjUzODBfdHJhbnNmZXJfcGlvKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLCB1bnNpZ25lZCBjaGFyICpwaGFzZSwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqKmRhdGEpOwotc3RhdGljIGludCBOQ1I1MzgwX3BvbGxfcG9saXRlbHkoc3RydWN0IFNjc2lfSG9zdCAqLCBpbnQsIGludCwgaW50LCBpbnQpOwogc3RhdGljIGludCBOQ1I1MzgwX3BvbGxfcG9saXRlbHkyKHN0cnVjdCBTY3NpX0hvc3QgKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50KTsKIAorc3RhdGljIGlubGluZSBpbnQgTkNSNTM4MF9wb2xsX3BvbGl0ZWx5KHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLAorCQkJCQlpbnQgcmVnLCBpbnQgYml0LCBpbnQgdmFsLCBpbnQgd2FpdCkKK3sKKwlyZXR1cm4gTkNSNTM4MF9wb2xsX3BvbGl0ZWx5MihpbnN0YW5jZSwgcmVnLCBiaXQsIHZhbCwKKwkJCQkJCXJlZywgYml0LCB2YWwsIHdhaXQpOworfQorCiAjZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLwogI2VuZGlmCQkJCS8qIE5DUjUzODBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvc3JjLmMgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYwppbmRleCAyOGY4YjhhLi4wYzQ1Mzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9zcmMuYwpAQCAtNjEzLDcgKzYxMyw3IEBACiAgKglAZGV2OiBBZGFwdGVyCiAgKglAY29tbTogY29tbXVuaWNhdGlvbnMgbWV0aG9kCiAgKi8KLWludCBhYWNfc3JjX3NlbGVjdF9jb21tKHN0cnVjdCBhYWNfZGV2ICpkZXYsIGludCBjb21tKQorc3RhdGljIGludCBhYWNfc3JjX3NlbGVjdF9jb21tKHN0cnVjdCBhYWNfZGV2ICpkZXYsIGludCBjb21tKQogewogCXN3aXRjaCAoY29tbSkgewogCWNhc2UgQUFDX0NPTU1fTUVTU0FHRToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaHdpLmMgYi9kcml2ZXJzL3Njc2kvYWljOTR4eC9haWM5NHh4X2h3aS5jCmluZGV4IDBmZGM5OGIuLjdjNzEzZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM5NHh4L2FpYzk0eHhfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzk0eHgvYWljOTR4eF9od2kuYwpAQCAtNjMyLDcgKzYzMiw3IEBACiAJCQkgICBwY2lfbmFtZShhc2RfaGEtPnBjaWRldikpOwogCQlyZXR1cm4gZXJyOwogCX0KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGFzZF9oYS0+cGNpZGV2LCBQQ0lDX0hTVFBDSVhfQ05UUkwsCisJZXJyID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChhc2RfaGEtPnBjaWRldiwgUENJQ19IU1RQQ0lYX0NOVFJMLAogCQkJCQl2IHwgU0NfVE1SX0RJUyk7CiAJaWYgKGVycikgewogCQlhc2RfcHJpbnRrKCJjb3VsZG4ndCBkaXNhYmxlIHNwbGl0IGNvbXBsZXRpb24gdGltZXIgb2YgJXNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYXJjbXNyL2FyY21zcl9oYmEuYyBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCmluZGV4IDc2NDA0OTguLjNkNTNkNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hcmNtc3IvYXJjbXNyX2hiYS5jCkBAIC0yMzg4LDE1ICsyMzg4LDIzIEBACiAJfQogCWNhc2UgQVJDTVNSX01FU1NBR0VfV1JJVEVfV1FCVUZGRVI6IHsKIAkJdW5zaWduZWQgY2hhciAqdmVyX2FkZHI7Ci0JCWludDMyX3QgdXNlcl9sZW4sIGNudDJlbmQ7CisJCXVpbnQzMl90IHVzZXJfbGVuOworCQlpbnQzMl90IGNudDJlbmQ7CiAJCXVpbnQ4X3QgKnBRYnVmZmVyLCAqcHRtcHVzZXJidWZmZXI7CisKKwkJdXNlcl9sZW4gPSBwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5MZW5ndGg7CisJCWlmICh1c2VyX2xlbiA+IEFSQ01TUl9BUElfREFUQV9CVUZMRU4pIHsKKwkJCXJldHZhbHVlID0gQVJDTVNSX01FU1NBR0VfRkFJTDsKKwkJCWdvdG8gbWVzc2FnZV9vdXQ7CisJCX0KKwogCQl2ZXJfYWRkciA9IGttYWxsb2MoQVJDTVNSX0FQSV9EQVRBX0JVRkxFTiwgR0ZQX0FUT01JQyk7CiAJCWlmICghdmVyX2FkZHIpIHsKIAkJCXJldHZhbHVlID0gQVJDTVNSX01FU1NBR0VfRkFJTDsKIAkJCWdvdG8gbWVzc2FnZV9vdXQ7CiAJCX0KIAkJcHRtcHVzZXJidWZmZXIgPSB2ZXJfYWRkcjsKLQkJdXNlcl9sZW4gPSBwY21kbWVzc2FnZWZsZC0+Y21kbWVzc2FnZS5MZW5ndGg7CisKIAkJbWVtY3B5KHB0bXB1c2VyYnVmZmVyLAogCQkJcGNtZG1lc3NhZ2VmbGQtPm1lc3NhZ2VkYXRhYnVmZmVyLCB1c2VyX2xlbik7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZhY2ItPndxYnVmZmVyX2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZS5oIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlLmgKaW5kZXggZWU1YWNlOC4uYjFkMGZkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlLmgKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlLmgKQEAgLTEsNSArMSw1IEBACiAvKioKLSAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMTUgRW11bGV4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDE2IEJyb2FkY29tCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTgsNyArOCw3IEBACiAgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KICAqCiAgKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogbGludXgtZHJpdmVyc0BhdmFnb3RlY2guY29tCisgKiBsaW51eC1kcml2ZXJzQGJyb2FkY29tLmNvbQogICoKICAqIEVtdWxleAogICogMzMzMyBTdXNhbiBTdHJlZXQKQEAgLTg5LDcgKzg5LDcgQEAKIAl1MzIgbWF4X2VxZDsJCS8qIGluIHVzZWNzICovCiAJdTMyIHByZXZfZXFkOwkJLyogaW4gdXNlY3MgKi8KIAl1MzIgZXRfZXFkOwkJLyogY29uZmlndXJlZCB2YWwgd2hlbiBhaWMgaXMgb2ZmICovCi0JdWxvbmcgamlmZnM7CisJdWxvbmcgamlmZmllczsKIAl1NjQgZXFfcHJldjsJCS8qIFVzZWQgdG8gY2FsY3VsYXRlIGVxZSAqLwogfTsKIApAQCAtMTAwLDcgKzEwMCw3IEBACiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gcTsKIAlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmE7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX2NxczsgLyogV29yayBJdGVtICovCisJc3RydWN0IHdvcmtfc3RydWN0IG1jY193b3JrOyAvKiBXb3JrIEl0ZW0gKi8KIAlzdHJ1Y3QgaXJxX3BvbGwJaW9wb2xsOwogfTsKIApAQCAtMTExLDggKzExMSwxMSBAQAogCiBzdHJ1Y3QgYmVpc2NzaV9tY2NfdGFnX3N0YXRlIHsKIAl1bnNpZ25lZCBsb25nIHRhZ19zdGF0ZTsKLSNkZWZpbmUgTUNDX1RBR19TVEFURV9SVU5OSU5HCTEKLSNkZWZpbmUgTUNDX1RBR19TVEFURV9USU1FT1VUCTIKKyNkZWZpbmUgTUNDX1RBR19TVEFURV9SVU5OSU5HCTAKKyNkZWZpbmUgTUNDX1RBR19TVEFURV9USU1FT1VUCTEKKyNkZWZpbmUgTUNDX1RBR19TVEFURV9BU1lOQwkyCisjZGVmaW5lIE1DQ19UQUdfU1RBVEVfSUdOT1JFCTMKKwl2b2lkICgqY2Jmbikoc3RydWN0IGJlaXNjc2lfaGJhICosIHVuc2lnbmVkIGludCk7CiAJc3RydWN0IGJlX2RtYV9tZW0gdGFnX21lbV9zdGF0ZTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jCmluZGV4IGE1NWVhZWUuLmJlNjVkYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAxNSBFbXVsZXgKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMTYgQnJvYWRjb20KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtOCw3ICs4LDcgQEAKICAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgogICoKICAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiBsaW51eC1kcml2ZXJzQGF2YWdvdGVjaC5jb20KKyAqIGxpbnV4LWRyaXZlcnNAYnJvYWRjb20uY29tCiAgKgogICogRW11bGV4CiAgKiAzMzMzIFN1c2FuIFN0cmVldApAQCAtMjEsMTEwICsyMSw3NyBAQAogI2luY2x1ZGUgImJlLmgiCiAjaW5jbHVkZSAiYmVfbWdtdC5oIgogCi1pbnQgYmVpc2NzaV9wY2lfc29mdF9yZXNldChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCi17Ci0JdTMyIHNyZXNldDsKLQl1OCAqcGNpX3Jlc2V0X29mZnNldCA9IDA7Ci0JdTggKnBjaV9vbmxpbmUwX29mZnNldCA9IDA7Ci0JdTggKnBjaV9vbmxpbmUxX29mZnNldCA9IDA7Ci0JdTMyIHBjb25saW5lMCA9IDA7Ci0JdTMyIHBjb25saW5lMSA9IDA7Ci0JdTMyIGk7CisvKiBVRSBTdGF0dXMgTG93IENTUiAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZXNjX3VlX3N0YXR1c19sb3dbXSA9IHsKKwkiQ0VWIiwKKwkiQ1RYIiwKKwkiREJVRiIsCisJIkVSWCIsCisJIkhvc3QiLAorCSJNUFUiLAorCSJORE1BIiwKKwkiUFRDICIsCisJIlJETUEgIiwKKwkiUlhGICIsCisJIlJYSVBTICIsCisJIlJYVUxQMCAiLAorCSJSWFVMUDEgIiwKKwkiUlhVTFAyICIsCisJIlRJTSAiLAorCSJUUE9TVCAiLAorCSJUUFJFICIsCisJIlRYSVBTICIsCisJIlRYVUxQMCAiLAorCSJUWFVMUDEgIiwKKwkiVUMgIiwKKwkiV0RNQSAiLAorCSJUWFVMUDIgIiwKKwkiSE9TVDEgIiwKKwkiUDBfT0JfTElOSyAiLAorCSJQMV9PQl9MSU5LICIsCisJIkhPU1RfR1BJTyAiLAorCSJNQk9YICIsCisJIkFYR01BQzAiLAorCSJBWEdNQUMxIiwKKwkiSlRBRyIsCisJIk1QVV9JTlRQRU5EIgorfTsKIAotCXBjaV9yZXNldF9vZmZzZXQgPSAodTggKilwaGJhLT5wY2lfdmEgKyBCRTJfU09GVF9SRVNFVDsKLQlwY2lfb25saW5lMF9vZmZzZXQgPSAodTggKilwaGJhLT5wY2lfdmEgKyBCRTJfUENJX09OTElORTA7Ci0JcGNpX29ubGluZTFfb2Zmc2V0ID0gKHU4ICopcGhiYS0+cGNpX3ZhICsgQkUyX1BDSV9PTkxJTkUxOwotCXNyZXNldCA9IHJlYWRsKCh2b2lkICopcGNpX3Jlc2V0X29mZnNldCk7Ci0Jc3Jlc2V0IHw9IEJFMl9TRVRfUkVTRVQ7Ci0Jd3JpdGVsKHNyZXNldCwgKHZvaWQgKilwY2lfcmVzZXRfb2Zmc2V0KTsKLQotCWkgPSAwOwotCXdoaWxlIChzcmVzZXQgJiBCRTJfU0VUX1JFU0VUKSB7Ci0JCWlmIChpID4gNjQpCi0JCQlicmVhazsKLQkJbXNsZWVwKDEwMCk7Ci0JCXNyZXNldCA9IHJlYWRsKCh2b2lkICopcGNpX3Jlc2V0X29mZnNldCk7Ci0JCWkrKzsKLQl9Ci0KLQlpZiAoc3Jlc2V0ICYgQkUyX1NFVF9SRVNFVCkgewotCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKLQkJICAgICAgICIgU29mdCBSZXNldCAgZGlkIG5vdCBkZWFzc2VydFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlwY29ubGluZTEgPSBCRTJfTVBVX0lSQU1fT05MSU5FOwotCXdyaXRlbChwY29ubGluZTAsICh2b2lkICopcGNpX29ubGluZTBfb2Zmc2V0KTsKLQl3cml0ZWwocGNvbmxpbmUxLCAodm9pZCAqKXBjaV9vbmxpbmUxX29mZnNldCk7Ci0KLQlzcmVzZXQgfD0gQkUyX1NFVF9SRVNFVDsKLQl3cml0ZWwoc3Jlc2V0LCAodm9pZCAqKXBjaV9yZXNldF9vZmZzZXQpOwotCi0JaSA9IDA7Ci0Jd2hpbGUgKHNyZXNldCAmIEJFMl9TRVRfUkVTRVQpIHsKLQkJaWYgKGkgPiA2NCkKLQkJCWJyZWFrOwotCQltc2xlZXAoMSk7Ci0JCXNyZXNldCA9IHJlYWRsKCh2b2lkICopcGNpX3Jlc2V0X29mZnNldCk7Ci0JCWkrKzsKLQl9Ci0JaWYgKHNyZXNldCAmIEJFMl9TRVRfUkVTRVQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCi0JCSAgICAgICAiIE1QVSBPbmxpbmUgU29mdCBSZXNldCBkaWQgbm90IGRlYXNzZXJ0XG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgYmVfY2hrX3Jlc2V0X2NvbXBsZXRlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKLXsKLQl1bnNpZ25lZCBpbnQgbnVtX2xvb3A7Ci0JdTggKm1wdV9zZW0gPSAwOwotCXUzMiBzdGF0dXM7Ci0KLQludW1fbG9vcCA9IDEwMDA7Ci0JbXB1X3NlbSA9ICh1OCAqKXBoYmEtPmNzcl92YSArIE1QVV9FUF9TRU1BUEhPUkU7Ci0JbXNsZWVwKDUwMDApOwotCi0Jd2hpbGUgKG51bV9sb29wKSB7Ci0JCXN0YXR1cyA9IHJlYWRsKCh2b2lkICopbXB1X3NlbSk7Ci0KLQkJaWYgKChzdGF0dXMgJiAweDgwMDAwMDAwKSB8fCAoc3RhdHVzICYgMHgwMDAwRkZGRikgPT0gMHhDMDAwKQotCQkJYnJlYWs7Ci0JCW1zbGVlcCg2MCk7Ci0JCW51bV9sb29wLS07Ci0JfQotCi0JaWYgKChzdGF0dXMgJiAweDgwMDAwMDAwKSB8fCAoIW51bV9sb29wKSkgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKLQkJCSAgICAiQkNfJWQgOiBGYWlsZWQgaW4gYmVfY2hrX3Jlc2V0X2NvbXBsZXRlIgotCQkJICAgICJzdGF0dXMgPSAweCV4XG4iLCBzdGF0dXMpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgaW50IGFsbG9jX21jY190YWcoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQotewotCXVuc2lnbmVkIGludCB0YWcgPSAwOwotCi0Jc3Bpbl9sb2NrKCZwaGJhLT5jdHJsLm1jY19sb2NrKTsKLQlpZiAocGhiYS0+Y3RybC5tY2NfdGFnX2F2YWlsYWJsZSkgewotCQl0YWcgPSBwaGJhLT5jdHJsLm1jY190YWdbcGhiYS0+Y3RybC5tY2NfYWxsb2NfaW5kZXhdOwotCQlwaGJhLT5jdHJsLm1jY190YWdbcGhiYS0+Y3RybC5tY2NfYWxsb2NfaW5kZXhdID0gMDsKLQkJcGhiYS0+Y3RybC5tY2NfdGFnX3N0YXR1c1t0YWddID0gMDsKLQkJcGhiYS0+Y3RybC5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlID0gMDsKLQl9Ci0JaWYgKHRhZykgewotCQlwaGJhLT5jdHJsLm1jY190YWdfYXZhaWxhYmxlLS07Ci0JCWlmIChwaGJhLT5jdHJsLm1jY19hbGxvY19pbmRleCA9PSAoTUFYX01DQ19DTUQgLSAxKSkKLQkJCXBoYmEtPmN0cmwubWNjX2FsbG9jX2luZGV4ID0gMDsKLQkJZWxzZQotCQkJcGhiYS0+Y3RybC5tY2NfYWxsb2NfaW5kZXgrKzsKLQl9Ci0Jc3Bpbl91bmxvY2soJnBoYmEtPmN0cmwubWNjX2xvY2spOwotCXJldHVybiB0YWc7Ci19CisvKiBVRSBTdGF0dXMgSGlnaCBDU1IgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVzY191ZV9zdGF0dXNfaGlbXSA9IHsKKwkiTFBDTUVNSE9TVCIsCisJIk1HTVRfTUFDIiwKKwkiUENTME9OTElORSIsCisJIk1QVV9JUkFNIiwKKwkiUENTMU9OTElORSIsCisJIlBDVEwwIiwKKwkiUENUTDEiLAorCSJQTUVNIiwKKwkiUlIiLAorCSJUWFBCIiwKKwkiUlhQUCIsCisJIlhBVUkiLAorCSJUWFAiLAorCSJBUk0iLAorCSJJUEMiLAorCSJIT1NUMiIsCisJIkhPU1QzIiwKKwkiSE9TVDQiLAorCSJIT1NUNSIsCisJIkhPU1Q2IiwKKwkiSE9TVDciLAorCSJIT1NUOCIsCisJIkhPU1Q5IiwKKwkiTkVUQyIsCisJIlVua25vd24iLAorCSJVbmtub3duIiwKKwkiVW5rbm93biIsCisJIlVua25vd24iLAorCSJVbmtub3duIiwKKwkiVW5rbm93biIsCisJIlVua25vd24iLAorCSJVbmtub3duIgorfTsKIAogc3RydWN0IGJlX21jY193cmIgKmFsbG9jX21jY193cmIoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQkJCSB1bnNpZ25lZCBpbnQgKnJlZl90YWcpCkBAIC0xMzMsNyArMTAwLDcgQEAKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgdGFnOwogCi0Jc3Bpbl9sb2NrX2JoKCZwaGJhLT5jdHJsLm1jY19sb2NrKTsKKwlzcGluX2xvY2soJnBoYmEtPmN0cmwubWNjX2xvY2spOwogCWlmIChtY2NxLT51c2VkID09IG1jY3EtPmxlbikgewogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCB8CiAJCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHIHwgQkVJU0NTSV9MT0dfTUJPWCwKQEAgLTE2MCw2ICsxMjcsNyBAQAogCXBoYmEtPmN0cmwubWNjX3RhZ1twaGJhLT5jdHJsLm1jY19hbGxvY19pbmRleF0gPSAwOwogCXBoYmEtPmN0cmwubWNjX3RhZ19zdGF0dXNbdGFnXSA9IDA7CiAJcGhiYS0+Y3RybC5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlID0gMDsKKwlwaGJhLT5jdHJsLnB0YWdfc3RhdGVbdGFnXS5jYmZuID0gTlVMTDsKIAlwaGJhLT5jdHJsLm1jY190YWdfYXZhaWxhYmxlLS07CiAJaWYgKHBoYmEtPmN0cmwubWNjX2FsbG9jX2luZGV4ID09IChNQVhfTUNDX0NNRCAtIDEpKQogCQlwaGJhLT5jdHJsLm1jY19hbGxvY19pbmRleCA9IDA7CkBAIC0xNzQsNyArMTQyLDcgQEAKIAltY2NxLT51c2VkKys7CiAKIGFsbG9jX2ZhaWxlZDoKLQlzcGluX3VubG9ja19iaCgmcGhiYS0+Y3RybC5tY2NfbG9jayk7CisJc3Bpbl91bmxvY2soJnBoYmEtPmN0cmwubWNjX2xvY2spOwogCXJldHVybiB3cmI7CiB9CiAKQEAgLTE4Miw3ICsxNTAsNyBAQAogewogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2NxID0gJmN0cmwtPm1jY19vYmoucTsKIAotCXNwaW5fbG9ja19iaCgmY3RybC0+bWNjX2xvY2spOworCXNwaW5fbG9jaygmY3RybC0+bWNjX2xvY2spOwogCXRhZyA9IHRhZyAmIE1DQ19RX0NNRF9UQUdfTUFTSzsKIAljdHJsLT5tY2NfdGFnW2N0cmwtPm1jY19mcmVlX2luZGV4XSA9IHRhZzsKIAlpZiAoY3RybC0+bWNjX2ZyZWVfaW5kZXggPT0gKE1BWF9NQ0NfQ01EIC0gMSkpCkBAIC0xOTEsMTYgKzE1OSw3MSBAQAogCQljdHJsLT5tY2NfZnJlZV9pbmRleCsrOwogCWN0cmwtPm1jY190YWdfYXZhaWxhYmxlKys7CiAJbWNjcS0+dXNlZC0tOwotCXNwaW5fdW5sb2NrX2JoKCZjdHJsLT5tY2NfbG9jayk7CisJc3Bpbl91bmxvY2soJmN0cmwtPm1jY19sb2NrKTsKIH0KIAotLyoqCi0gKiBiZWlzY3NpX2ZhaWxfc2Vzc2lvbigpOiBDbG9zaW5nIHNlc3Npb24gd2l0aCBhcHByb3ByaWF0ZSBlcnJvcgotICogQGNsc19zZXNzaW9uOiBwdHIgdG8gc2Vzc2lvbgotICoqLwotdm9pZCBiZWlzY3NpX2ZhaWxfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQorLyoKKyAqIGJlaXNjc2lfbWNjX2NvbXBsX3N0YXR1cyAtIFJldHVybiB0aGUgc3RhdHVzIG9mIE1DQyBjb21wbGV0aW9uCisgKiBAcGhiYTogRHJpdmVyIHByaXZhdGUgc3RydWN0dXJlCisgKiBAdGFnOiBUYWcgZm9yIHRoZSBNQlggQ29tbWFuZAorICogQHdyYjogdGhlIFdSQiB1c2VkIGZvciB0aGUgTUJYIENvbW1hbmQKKyAqIEBtYnhfY21kX21lbTogcHRyIHRvIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIE1CWCBDbWQKKyAqCisgKiByZXR1cm4KKyAqIFN1Y2Nlc3M6IDAKKyAqIEZhaWx1cmU6IE5vbi1aZXJvCisgKi8KK2ludCBfX2JlaXNjc2lfbWNjX2NvbXBsX3N0YXR1cyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHRhZywKKwkJCSAgICAgICBzdHJ1Y3QgYmVfbWNjX3dyYiAqKndyYiwKKwkJCSAgICAgICBzdHJ1Y3QgYmVfZG1hX21lbSAqbWJ4X2NtZF9tZW0pCiB7Ci0JaXNjc2lfc2Vzc2lvbl9mYWlsdXJlKGNsc19zZXNzaW9uLT5kZF9kYXRhLCBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2NxID0gJnBoYmEtPmN0cmwubWNjX29iai5xOworCXVpbnQxNl90IHN0YXR1cyA9IDAsIGFkZGxfc3RhdHVzID0gMCwgd3JiX251bSA9IDA7CisJc3RydWN0IGJlX2NtZF9yZXNwX2hkciAqbWJ4X3Jlc3BfaGRyOworCXN0cnVjdCBiZV9jbWRfcmVxX2hkciAqbWJ4X2hkcjsKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqdGVtcF93cmI7CisJdWludDMyX3QgbWNjX3RhZ19zdGF0dXM7CisJaW50IHJjID0gMDsKKworCW1jY190YWdfc3RhdHVzID0gcGhiYS0+Y3RybC5tY2NfdGFnX3N0YXR1c1t0YWddOworCXN0YXR1cyA9IChtY2NfdGFnX3N0YXR1cyAmIENRRV9TVEFUVVNfTUFTSyk7CisJYWRkbF9zdGF0dXMgPSAoKG1jY190YWdfc3RhdHVzICYgQ1FFX1NUQVRVU19BRERMX01BU0spID4+CisJCQlDUUVfU1RBVFVTX0FERExfU0hJRlQpOworCisJaWYgKG1ieF9jbWRfbWVtKSB7CisJCW1ieF9oZHIgPSAoc3RydWN0IGJlX2NtZF9yZXFfaGRyICopbWJ4X2NtZF9tZW0tPnZhOworCX0gZWxzZSB7CisJCXdyYl9udW0gPSAobWNjX3RhZ19zdGF0dXMgJiBDUUVfU1RBVFVTX1dSQl9NQVNLKSA+PgorCQkJICBDUUVfU1RBVFVTX1dSQl9TSElGVDsKKwkJdGVtcF93cmIgPSAoc3RydWN0IGJlX21jY193cmIgKilxdWV1ZV9nZXRfd3JiKG1jY3EsIHdyYl9udW0pOworCQltYnhfaGRyID0gZW1iZWRkZWRfcGF5bG9hZCh0ZW1wX3dyYik7CisKKwkJaWYgKHdyYikKKwkJCSp3cmIgPSB0ZW1wX3dyYjsKKwl9CisKKwlpZiAoc3RhdHVzIHx8IGFkZGxfc3RhdHVzKSB7CisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fV0FSTklORywKKwkJCSAgICBCRUlTQ1NJX0xPR19JTklUIHwgQkVJU0NTSV9MT0dfRUggfAorCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRywKKwkJCSAgICAiQkNfJWQgOiBNQlggQ21kIEZhaWxlZCBmb3IgU3Vic3lzIDogJWQgT3Bjb2RlIDogJWQgd2l0aCBTdGF0dXMgOiAlZCBhbmQgRXh0ZF9TdGF0dXMgOiAlZFxuIiwKKwkJCSAgICBtYnhfaGRyLT5zdWJzeXN0ZW0sIG1ieF9oZHItPm9wY29kZSwKKwkJCSAgICBzdGF0dXMsIGFkZGxfc3RhdHVzKTsKKwkJcmMgPSAtRUlPOworCQlpZiAoc3RhdHVzID09IE1DQ19TVEFUVVNfSU5TVUZGSUNJRU5UX0JVRkZFUikgeworCQkJbWJ4X3Jlc3BfaGRyID0gKHN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgKiltYnhfaGRyOworCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAorCQkJCSAgICBCRUlTQ1NJX0xPR19JTklUIHwgQkVJU0NTSV9MT0dfRUggfAorCQkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcsCisJCQkJICAgICJCQ18lZCA6IEluc3VmZmljaWVudCBCdWZmZXIgRXJyb3IgUmVzcF9MZW4gOiAlZCBBY3R1YWxfUmVzcF9MZW4gOiAlZFxuIiwKKwkJCQkgICAgbWJ4X3Jlc3BfaGRyLT5yZXNwb25zZV9sZW5ndGgsCisJCQkJICAgIG1ieF9yZXNwX2hkci0+YWN0dWFsX3Jlc3BfbGVuKTsKKwkJCXJjID0gLUVBR0FJTjsKKwkJfQorCX0KKworCXJldHVybiByYzsKIH0KIAogLyoKQEAgLTIxNywyNiArMjQwLDM0IEBACiAgKiBGYWlsdXJlOiBOb24tWmVybwogICoqLwogaW50IGJlaXNjc2lfbWNjcV9jb21wbF93YWl0KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKLQkJCSAgICB1aW50MzJfdCB0YWcsIHN0cnVjdCBiZV9tY2Nfd3JiICoqd3JiLAorCQkJICAgIHVuc2lnbmVkIGludCB0YWcsCisJCQkgICAgc3RydWN0IGJlX21jY193cmIgKip3cmIsCiAJCQkgICAgc3RydWN0IGJlX2RtYV9tZW0gKm1ieF9jbWRfbWVtKQogewogCWludCByYyA9IDA7Ci0JdWludDMyX3QgbWNjX3RhZ19zdGF0dXM7Ci0JdWludDE2X3Qgc3RhdHVzID0gMCwgYWRkbF9zdGF0dXMgPSAwLCB3cmJfbnVtID0gMDsKLQlzdHJ1Y3QgYmVfbWNjX3dyYiAqdGVtcF93cmI7Ci0Jc3RydWN0IGJlX2NtZF9yZXFfaGRyICptYnhfaGRyOwotCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgKm1ieF9yZXNwX2hkcjsKLQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqbWNjcSA9ICZwaGJhLT5jdHJsLm1jY19vYmoucTsKIAotCWlmIChiZWlzY3NpX2Vycm9yKHBoYmEpKQotCQlyZXR1cm4gLUVQRVJNOworCWlmIChiZWlzY3NpX2hiYV9pbl9lcnJvcihwaGJhKSkgeworCQljbGVhcl9iaXQoTUNDX1RBR19TVEFURV9SVU5OSU5HLAorCQkJICAmcGhiYS0+Y3RybC5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlKTsKKwkJcmV0dXJuIC1FSU87CisJfQogCiAJLyogd2FpdCBmb3IgdGhlIG1jY3EgY29tcGxldGlvbiAqLwotCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCi0JCQkJcGhiYS0+Y3RybC5tY2Nfd2FpdFt0YWddLAotCQkJCXBoYmEtPmN0cmwubWNjX3RhZ19zdGF0dXNbdGFnXSwKLQkJCQltc2Vjc190b19qaWZmaWVzKAotCQkJCUJFSVNDU0lfSE9TVF9NQlhfVElNRU9VVCkpOworCXJjID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQocGhiYS0+Y3RybC5tY2Nfd2FpdFt0YWddLAorCQkJCQkgICAgICBwaGJhLT5jdHJsLm1jY190YWdfc3RhdHVzW3RhZ10sCisJCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoCisJCQkJCQlCRUlTQ1NJX0hPU1RfTUJYX1RJTUVPVVQpKTsKKwkvKioKKwkgKiBSZXR1cm4gRUlPIGlmIHBvcnQgaXMgYmVpbmcgZGlzYWJsZWQuIEFzc29jaWF0ZWQgRE1BIG1lbW9yeSwgaWYgYW55LAorCSAqIGlzIGZyZWVkIGJ5IHRoZSBjYWxsZXIuIFdoZW4gcG9ydCBnb2VzIG9mZmxpbmUsIE1DQ1EgaXMgY2xlYW5lZCB1cAorCSAqIHNvIGRvZXMgV1JCLgorCSAqLworCWlmICghdGVzdF9iaXQoQkVJU0NTSV9IQkFfT05MSU5FLCAmcGhiYS0+c3RhdGUpKSB7CisJCWNsZWFyX2JpdChNQ0NfVEFHX1NUQVRFX1JVTk5JTkcsCisJCQkgICZwaGJhLT5jdHJsLnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKIAkvKioKIAkgKiBJZiBNQk9YIGNtZCB0aW1lb3V0IGV4cGlyZWQsIHRhZyBhbmQgcmVzb3VyY2UgYWxsb2NhdGVkCiAJICogZm9yIGNtZCBpcyBub3QgZnJlZWQgdW50aWwgRlcgcmV0dXJucyBjb21wbGV0aW9uLgpAQCAtMjcwLDQ3ICszMDEsNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXJjID0gMDsKLQltY2NfdGFnX3N0YXR1cyA9IHBoYmEtPmN0cmwubWNjX3RhZ19zdGF0dXNbdGFnXTsKLQlzdGF0dXMgPSAobWNjX3RhZ19zdGF0dXMgJiBDUUVfU1RBVFVTX01BU0spOwotCWFkZGxfc3RhdHVzID0gKChtY2NfdGFnX3N0YXR1cyAmIENRRV9TVEFUVVNfQURETF9NQVNLKSA+PgotCQkJQ1FFX1NUQVRVU19BRERMX1NISUZUKTsKLQotCWlmIChtYnhfY21kX21lbSkgewotCQltYnhfaGRyID0gKHN0cnVjdCBiZV9jbWRfcmVxX2hkciAqKW1ieF9jbWRfbWVtLT52YTsKLQl9IGVsc2UgewotCQl3cmJfbnVtID0gKG1jY190YWdfc3RhdHVzICYgQ1FFX1NUQVRVU19XUkJfTUFTSykgPj4KLQkJCSAgIENRRV9TVEFUVVNfV1JCX1NISUZUOwotCQl0ZW1wX3dyYiA9IChzdHJ1Y3QgYmVfbWNjX3dyYiAqKXF1ZXVlX2dldF93cmIobWNjcSwgd3JiX251bSk7Ci0JCW1ieF9oZHIgPSBlbWJlZGRlZF9wYXlsb2FkKHRlbXBfd3JiKTsKLQotCQlpZiAod3JiKQotCQkJKndyYiA9IHRlbXBfd3JiOwotCX0KLQotCWlmIChzdGF0dXMgfHwgYWRkbF9zdGF0dXMpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAotCQkJICAgIEJFSVNDU0lfTE9HX0lOSVQgfCBCRUlTQ1NJX0xPR19FSCB8Ci0JCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJICAgICJCQ18lZCA6IE1CWCBDbWQgRmFpbGVkIGZvciAiCi0JCQkgICAgIlN1YnN5cyA6ICVkIE9wY29kZSA6ICVkIHdpdGggIgotCQkJICAgICJTdGF0dXMgOiAlZCBhbmQgRXh0ZF9TdGF0dXMgOiAlZFxuIiwKLQkJCSAgICBtYnhfaGRyLT5zdWJzeXN0ZW0sCi0JCQkgICAgbWJ4X2hkci0+b3Bjb2RlLAotCQkJICAgIHN0YXR1cywgYWRkbF9zdGF0dXMpOwotCQlyYyA9IC1FSU87Ci0JCWlmIChzdGF0dXMgPT0gTUNDX1NUQVRVU19JTlNVRkZJQ0lFTlRfQlVGRkVSKSB7Ci0JCQltYnhfcmVzcF9oZHIgPSAoc3RydWN0IGJlX2NtZF9yZXNwX2hkciAqKSBtYnhfaGRyOwotCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAotCQkJCSAgICBCRUlTQ1NJX0xPR19JTklUIHwgQkVJU0NTSV9MT0dfRUggfAotCQkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcsCi0JCQkJICAgICJCQ18lZCA6IEluc3VmZmljaWVudCBCdWZmZXIgRXJyb3IgIgotCQkJCSAgICAiUmVzcF9MZW4gOiAlZCBBY3R1YWxfUmVzcF9MZW4gOiAlZFxuIiwKLQkJCQkgICAgbWJ4X3Jlc3BfaGRyLT5yZXNwb25zZV9sZW5ndGgsCi0JCQkJICAgIG1ieF9yZXNwX2hkci0+YWN0dWFsX3Jlc3BfbGVuKTsKLQkJCXJjID0gLUVBR0FJTjsKLQkJfQotCX0KKwlyYyA9IF9fYmVpc2NzaV9tY2NfY29tcGxfc3RhdHVzKHBoYmEsIHRhZywgd3JiLCBtYnhfY21kX21lbSk7CiAKIAlmcmVlX21jY193cmIoJnBoYmEtPmN0cmwsIHRhZyk7CiAJcmV0dXJuIHJjOwpAQCAtMzMwLDExICszMjEsMTAgQEAKIHN0YXRpYyBpbnQgYmVpc2NzaV9wcm9jZXNzX21ib3hfY29tcGwoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKIAkJCQkgICAgICBzdHJ1Y3QgYmVfbWNjX2NvbXBsICpjb21wbCkKIHsKLQl1MTYgY29tcGxfc3RhdHVzLCBleHRkX3N0YXR1czsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOwogCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IHBjaV9nZXRfZHJ2ZGF0YShjdHJsLT5wZGV2KTsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgKmhkciA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKLQlzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyICpyZXNwX2hkcjsKKwl1MTYgY29tcGxfc3RhdHVzLCBleHRkX3N0YXR1czsKIAogCS8qKgogCSAqIFRvIGNoZWNrIGlmIHZhbGlkIGJpdCBpcyBzZXQsIGNoZWNrIHRoZSBlbnRpcmUgd29yZCBhcyB3ZSBkb24ndCBrbm93CkBAIC0zNjgsMTQgKzM1OCw3IEBACiAJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0NPTkZJRyB8IEJFSVNDU0lfTE9HX01CT1gsCiAJCSAgICAiQkNfJWQgOiBlcnJvciBpbiBjbWQgY29tcGxldGlvbjogU3Vic3lzdGVtIDogJWQgT3Bjb2RlIDogJWQgc3RhdHVzKGNvbXBsL2V4dGQpPSVkLyVkXG4iLAogCQkgICAgaGRyLT5zdWJzeXN0ZW0sIGhkci0+b3Bjb2RlLCBjb21wbF9zdGF0dXMsIGV4dGRfc3RhdHVzKTsKLQotCWlmIChjb21wbF9zdGF0dXMgPT0gTUNDX1NUQVRVU19JTlNVRkZJQ0lFTlRfQlVGRkVSKSB7Ci0JCS8qIGlmIHN0YXR1cyBpcyBpbnN1ZmZpY2llbnQgYnVmZmVyLCBjaGVjayB0aGUgbGVuZ3RoICovCi0JCXJlc3BfaGRyID0gKHN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgKikgaGRyOwotCQlpZiAocmVzcF9oZHItPnJlc3BvbnNlX2xlbmd0aCkKLQkJCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gY29tcGxfc3RhdHVzOwogfQogCiBzdGF0aWMgdm9pZCBiZWlzY3NpX3Byb2Nlc3NfYXN5bmNfbGluayhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCkBAIC0zOTEsMTggKzM3NCwxOSBAQAogCSAqIFRoaXMgaGFzIGJlZW4gbmV3bHkgaW50cm9kdWNlZCBpbiBTS0gtUiBGaXJtd2FyZSAxMC4wLjMzOC40NS4KIAkgKiovCiAJaWYgKGV2dC0+cG9ydF9saW5rX3N0YXR1cyAmIEJFX0FTWU5DX0xJTktfVVBfTUFTSykgewotCQlwaGJhLT5zdGF0ZSA9IEJFX0FEQVBURVJfTElOS19VUCB8IEJFX0FEQVBURVJfQ0hFQ0tfQk9PVDsKLQkJcGhiYS0+Z2V0X2Jvb3QgPSBCRV9HRVRfQk9PVF9SRVRSSUVTOworCQlzZXRfYml0KEJFSVNDU0lfSEJBX0xJTktfVVAsICZwaGJhLT5zdGF0ZSk7CisJCWlmICh0ZXN0X2JpdChCRUlTQ1NJX0hCQV9CT09UX0ZPVU5ELCAmcGhiYS0+c3RhdGUpKQorCQkJYmVpc2NzaV9zdGFydF9ib290X3dvcmsocGhiYSwgQkVfQk9PVF9JTlZBTElEX1NIQU5ETEUpOwogCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAogCQkJICAgICAgIkJDXyVkIDogTGluayBVcCBvbiBQb3J0ICVkIHRhZyAweCV4XG4iLAogCQkJICAgICAgZXZ0LT5waHlzaWNhbF9wb3J0LCBldnQtPmV2ZW50X3RhZyk7CiAJfSBlbHNlIHsKLQkJcGhiYS0+c3RhdGUgPSBCRV9BREFQVEVSX0xJTktfRE9XTjsKKwkJY2xlYXJfYml0KEJFSVNDU0lfSEJBX0xJTktfVVAsICZwaGJhLT5zdGF0ZSk7CiAJCV9fYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCiAJCQkgICAgICAiQkNfJWQgOiBMaW5rIERvd24gb24gUG9ydCAlZCB0YWcgMHgleFxuIiwKIAkJCSAgICAgIGV2dC0+cGh5c2ljYWxfcG9ydCwgZXZ0LT5ldmVudF90YWcpOwogCQlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24ocGhiYS0+c2hvc3QsCi0JCQkJCSAgICBiZWlzY3NpX2ZhaWxfc2Vzc2lvbik7CisJCQkJCSAgICBiZWlzY3NpX3Nlc3Npb25fZmFpbCk7CiAJfQogfQogCkBAIC00ODIsOCArNDY2LDggQEAKIAkJYmVpc2NzaV9wcm9jZXNzX2FzeW5jX2xpbmsocGhiYSwgY29tcGwpOwogCQlicmVhazsKIAljYXNlIEFTWU5DX0VWRU5UX0NPREVfSVNDU0k6Ci0JCXBoYmEtPnN0YXRlIHw9IEJFX0FEQVBURVJfQ0hFQ0tfQk9PVDsKLQkJcGhiYS0+Z2V0X2Jvb3QgPSBCRV9HRVRfQk9PVF9SRVRSSUVTOworCQlpZiAodGVzdF9iaXQoQkVJU0NTSV9IQkFfQk9PVF9GT1VORCwgJnBoYmEtPnN0YXRlKSkKKwkJCWJlaXNjc2lfc3RhcnRfYm9vdF93b3JrKHBoYmEsIEJFX0JPT1RfSU5WQUxJRF9TSEFORExFKTsKIAkJc2V2ID0gS0VSTl9FUlI7CiAJCWJyZWFrOwogCWNhc2UgQVNZTkNfRVZFTlRfQ09ERV9TTEk6CkBAIC01MTksNiArNTAzLDkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJLyogZW5kIE1DQyB3aXRoIHRoaXMgdGFnICovCisJY2xlYXJfYml0KE1DQ19UQUdfU1RBVEVfUlVOTklORywgJmN0cmwtPnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUpOworCiAJaWYgKHRlc3RfYml0KE1DQ19UQUdfU1RBVEVfVElNRU9VVCwgJmN0cmwtPnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUpKSB7CiAJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fV0FSTklORywKIAkJCSAgICBCRUlTQ1NJX0xPR19NQk9YIHwgQkVJU0NTSV9MT0dfSU5JVCB8CkBAIC01MjksOSArNTE2LDExIEBACiAJCSAqIE9ubHkgZm9yIG5vbi1lbWJlZGRlZCBjbWQsIFBDSSByZXNvdXJjZSBpcyBhbGxvY2F0ZWQuCiAJCSAqKi8KIAkJdGFnX21lbSA9ICZjdHJsLT5wdGFnX3N0YXRlW3RhZ10udGFnX21lbV9zdGF0ZTsKLQkJaWYgKHRhZ19tZW0tPnNpemUpCisJCWlmICh0YWdfbWVtLT5zaXplKSB7CiAJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGN0cmwtPnBkZXYsIHRhZ19tZW0tPnNpemUsCiAJCQkJCXRhZ19tZW0tPnZhLCB0YWdfbWVtLT5kbWEpOworCQkJdGFnX21lbS0+c2l6ZSA9IDA7CisJCX0KIAkJZnJlZV9tY2Nfd3JiKGN0cmwsIHRhZyk7CiAJCXJldHVybiAwOwogCX0KQEAgLTU1MCw1OSArNTM5LDI3IEBACiAJCQkJICAgICBDUUVfU1RBVFVTX0FERExfTUFTSzsKIAljdHJsLT5tY2NfdGFnX3N0YXR1c1t0YWddIHw9IChjb21wbF9zdGF0dXMgJiBDUUVfU1RBVFVTX01BU0spOwogCi0JLyogd3JpdGUgb3JkZXJpbmcgZm9yY2VkIGluIHdha2VfdXBfaW50ZXJydXB0aWJsZSAqLwotCWNsZWFyX2JpdChNQ0NfVEFHX1NUQVRFX1JVTk5JTkcsICZjdHJsLT5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlKTsKKwlpZiAodGVzdF9iaXQoTUNDX1RBR19TVEFURV9BU1lOQywgJmN0cmwtPnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUpKSB7CisJCWlmIChjdHJsLT5wdGFnX3N0YXRlW3RhZ10uY2JmbikKKwkJCWN0cmwtPnB0YWdfc3RhdGVbdGFnXS5jYmZuKHBoYmEsIHRhZyk7CisJCWVsc2UKKwkJCV9fYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCisJCQkJICAgICAgIkJDXyVkIDogTUJYIEFTWU5DIGNvbW1hbmQgd2l0aCBubyBjYWxsYmFja1xuIik7CisJCWZyZWVfbWNjX3dyYihjdHJsLCB0YWcpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodGVzdF9iaXQoTUNDX1RBR19TVEFURV9JR05PUkUsICZjdHJsLT5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlKSkgeworCQkvKiBqdXN0IGNoZWNrIGNvbXBsZXRpb24gc3RhdHVzIGFuZCBmcmVlIHdyYiAqLworCQlfX2JlaXNjc2lfbWNjX2NvbXBsX3N0YXR1cyhwaGJhLCB0YWcsIE5VTEwsIE5VTEwpOworCQlmcmVlX21jY193cmIoY3RybCwgdGFnKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHJsLT5tY2Nfd2FpdFt0YWddKTsKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIGJlX21jY19jb21wbF9wb2xsKCktIFdhaXQgZm9yIE1CWCBjb21wbGV0aW9uCi0gKiBAcGhiYTogZHJpdmVyIHByaXZhdGUgc3RydWN0dXJlCi0gKgotICogV2FpdCB0aWxsIG5vIG1vcmUgcGVuZGluZyBtY2MgcmVxdWVzdHMgYXJlIHByZXNlbnQKLSAqCi0gKiByZXR1cm4KLSAqIFN1Y2Nlc3M6IDAKLSAqIEZhaWx1cmU6IE5vbi1aZXJvCi0gKgotICoqLwotaW50IGJlX21jY19jb21wbF9wb2xsKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdW5zaWduZWQgaW50IHRhZykKLXsKLQlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7Ci0JaW50IGk7Ci0KLQlpZiAoIXRlc3RfYml0KE1DQ19UQUdfU1RBVEVfUlVOTklORywKLQkJICAgICAgJmN0cmwtPnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUpKSB7Ci0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAotCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRyB8IEJFSVNDU0lfTE9HX01CT1gsCi0JCQkgICAgIkJDXyVkOiB0YWcgJXUgc3RhdGUgbm90IHJ1bm5pbmdcbiIsIHRhZyk7Ci0JCXJldHVybiAwOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgbWNjX3RpbWVvdXQ7IGkrKykgewotCQlpZiAoYmVpc2NzaV9lcnJvcihwaGJhKSkKLQkJCXJldHVybiAtRUlPOwotCi0JCWJlaXNjc2lfcHJvY2Vzc19tY2NfY3EocGhiYSk7Ci0JCS8qIGFmdGVyIHBvbGxpbmcsIHdyYiBhbmQgdGFnIG5lZWQgdG8gYmUgcmVsZWFzZWQgKi8KLQkJaWYgKCF0ZXN0X2JpdChNQ0NfVEFHX1NUQVRFX1JVTk5JTkcsCi0JCQkgICAgICAmY3RybC0+cHRhZ19zdGF0ZVt0YWddLnRhZ19zdGF0ZSkpIHsKLQkJCWZyZWVfbWNjX3dyYihjdHJsLCB0YWcpOwotCQkJYnJlYWs7Ci0JCX0KLQkJdWRlbGF5KDEwMCk7Ci0JfQotCi0JaWYgKGkgPCBtY2NfdGltZW91dCkKLQkJcmV0dXJuIDA7Ci0KLQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfQ09ORklHIHwgQkVJU0NTSV9MT0dfTUJPWCwKLQkJICAgICJCQ18lZCA6IEZXIFRpbWVkIE91dFxuIik7Ci0JcGhiYS0+ZndfdGltZW91dCA9IHRydWU7Ci0JYmVpc2NzaV91ZV9kZXRlY3QocGhiYSk7Ci0JcmV0dXJuIC1FQlVTWTsKLX0KLQogdm9pZCBiZV9tY2Nfbm90aWZ5KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdW5zaWduZWQgaW50IHRhZykKIHsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqbWNjcSA9ICZwaGJhLT5jdHJsLm1jY19vYmoucTsKQEAgLTY0Miw3ICs1OTksNyBAQAogCSAqLwogCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhCRUlTQ1NJX01CWF9SRFlfQklUX1RJTUVPVVQpOwogCWRvIHsKLQkJaWYgKGJlaXNjc2lfZXJyb3IocGhiYSkpCisJCWlmIChiZWlzY3NpX2hiYV9pbl9lcnJvcihwaGJhKSkKIAkJCXJldHVybiAtRUlPOwogCiAJCXJlYWR5ID0gaW9yZWFkMzIoZGIpOwpAQCAtNjU1LDE2ICs2MTIsMTQgQEAKIAogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKIAkJCWJyZWFrOwotCQltc2xlZXAoMjApOworCQkvKiAxbXMgc2xlZXAgaXMgZW5vdWdoIGluIG1vc3QgY2FzZXMgKi8KKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUobXNlY3NfdG9famlmZmllcygxKSk7CiAJfSB3aGlsZSAoIXJlYWR5KTsKIAogCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAogCQkJQkVJU0NTSV9MT0dfQ09ORklHIHwgQkVJU0NTSV9MT0dfTUJPWCwKIAkJCSJCQ18lZCA6IEZXIFRpbWVkIE91dFxuIik7Ci0KLQlwaGJhLT5md190aW1lb3V0ID0gdHJ1ZTsKLQliZWlzY3NpX3VlX2RldGVjdChwaGJhKTsKLQorCXNldF9iaXQoQkVJU0NTSV9IQkFfRldfVElNRU9VVCwgJnBoYmEtPnN0YXRlKTsKIAlyZXR1cm4gLUVCVVNZOwogfQogCkBAIC02NzksNyArNjM0LDcgQEAKICAqIFN1Y2Nlc3M6IDAKICAqIEZhaWx1cmU6IE5vbi1aZXJvCiAgKiovCi1pbnQgYmVfbWJveF9ub3RpZnkoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCkKK3N0YXRpYyBpbnQgYmVfbWJveF9ub3RpZnkoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCkKIHsKIAlpbnQgc3RhdHVzOwogCXUzMiB2YWwgPSAwOwpAQCAtODE5LDg3ICs3NzQsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qKgotICogYmVfY21kX2Z3X2luaXRpYWxpemUoKS0gSW5pdGlhbGl6ZSBGVwotICogQGN0cmw6IFBvaW50ZXIgdG8gZnVuY3Rpb24gY29udHJvbCBzdHJ1Y3R1cmUKLSAqCi0gKiBTZW5kIEZXIGluaXRpYWxpemUgcGF0dGVybiBmb3IgdGhlIGZ1bmN0aW9uLgotICoKLSAqIHJldHVybgotICogU3VjY2VzczogMAotICogRmFpbHVyZTogTm9uLVplcm8gdmFsdWUKLSAqKi8KLWludCBiZV9jbWRfZndfaW5pdGlhbGl6ZShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsKQotewotCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSB3cmJfZnJvbV9tYm94KCZjdHJsLT5tYm94X21lbSk7Ci0Jc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gcGNpX2dldF9kcnZkYXRhKGN0cmwtPnBkZXYpOwotCWludCBzdGF0dXM7Ci0JdTggKmVuZGlhbl9jaGVjazsKLQotCW11dGV4X2xvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0JbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKLQotCWVuZGlhbl9jaGVjayA9ICh1OCAqKSB3cmI7Ci0JKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKLQkqZW5kaWFuX2NoZWNrKysgPSAweDEyOwotCSplbmRpYW5fY2hlY2srKyA9IDB4MzQ7Ci0JKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKLQkqZW5kaWFuX2NoZWNrKysgPSAweEZGOwotCSplbmRpYW5fY2hlY2srKyA9IDB4NTY7Ci0JKmVuZGlhbl9jaGVjaysrID0gMHg3ODsKLQkqZW5kaWFuX2NoZWNrKysgPSAweEZGOwotCWJlX2R3c19jcHVfdG9fbGUod3JiLCBzaXplb2YoKndyYikpOwotCi0Jc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7Ci0JaWYgKHN0YXR1cykKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCi0JCQkgICAgIkJDXyVkIDogYmVfY21kX2Z3X2luaXRpYWxpemUgRmFpbGVkXG4iKTsKLQotCW11dGV4X3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKioKLSAqIGJlX2NtZF9md191bmluaXQoKS0gVWluaXRpYWxpemUgRlcKLSAqIEBjdHJsOiBQb2ludGVyIHRvIGZ1bmN0aW9uIGNvbnRyb2wgc3RydWN0dXJlCi0gKgotICogU2VuZCBGVyB1bmluaXRpYWxpemUgcGF0dGVybiBmb3IgdGhlIGZ1bmN0aW9uCi0gKgotICogcmV0dXJuCi0gKiBTdWNjZXNzOiAwCi0gKiBGYWlsdXJlOiBOb24tWmVybyB2YWx1ZQotICoqLwotaW50IGJlX2NtZF9md191bmluaXQoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCkKLXsKLQlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOwotCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IHBjaV9nZXRfZHJ2ZGF0YShjdHJsLT5wZGV2KTsKLQlpbnQgc3RhdHVzOwotCXU4ICplbmRpYW5fY2hlY2s7Ci0KLQltdXRleF9sb2NrKCZjdHJsLT5tYm94X2xvY2spOwotCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7Ci0KLQllbmRpYW5fY2hlY2sgPSAodTggKikgd3JiOwotCSplbmRpYW5fY2hlY2srKyA9IDB4RkY7Ci0JKmVuZGlhbl9jaGVjaysrID0gMHhBQTsKLQkqZW5kaWFuX2NoZWNrKysgPSAweEJCOwotCSplbmRpYW5fY2hlY2srKyA9IDB4RkY7Ci0JKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKLQkqZW5kaWFuX2NoZWNrKysgPSAweENDOwotCSplbmRpYW5fY2hlY2srKyA9IDB4REQ7Ci0JKmVuZGlhbl9jaGVjayA9IDB4RkY7Ci0KLQliZV9kd3NfY3B1X3RvX2xlKHdyYiwgc2l6ZW9mKCp3cmIpKTsKLQotCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOwotCWlmIChzdGF0dXMpCi0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAotCQkJICAgICJCQ18lZCA6IGJlX2NtZF9md191bmluaXQgRmFpbGVkXG4iKTsKLQotCW11dGV4X3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCiBpbnQgYmVpc2NzaV9jbWRfY3FfY3JlYXRlKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCiAJCQkgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpjcSwgc3RydWN0IGJlX3F1ZXVlX2luZm8gKmVxLAogCQkJICBib29sIHNvbF9ldnRzLCBib29sIG5vX2RlbGF5LCBpbnQgY29hbGVzY2Vfd20pCkBAIC0xMzQzLDI1ICsxMjE3LDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgYmVpc2NzaV9jbWRfcmVzZXRfZnVuY3Rpb24oc3RydWN0IGJlaXNjc2lfaGJhICAqcGhiYSkKLXsKLQlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7Ci0Jc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKLQlzdHJ1Y3QgYmVfcG9zdF9zZ2xfcGFnZXNfcmVxICpyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7Ci0JaW50IHN0YXR1czsKLQotCW11dGV4X2xvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0KLQlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7Ci0JYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAwKTsKLQliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKLQkJCSAgIE9QQ09ERV9DT01NT05fRlVOQ1RJT05fUkVTRVQsIHNpemVvZigqcmVxKSk7Ci0Jc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7Ci0KLQltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQogLyoqCiAgKiBiZV9jbWRfc2V0X3ZsYW4oKS0gQ29uZmlndXJlIFZMQU4gcGFyYW10ZXJzIG9uIHRoZSBhZGFwdGVyCiAgKiBAcGhiYTogZGV2aWNlIHByaXYgc3RydWN0dXJlIGluc3RhbmNlCkBAIC0xNDAyLDMgKzEyNTcsNTY0IEBACiAKIAlyZXR1cm4gdGFnOwogfQorCitpbnQgYmVpc2NzaV9jaGVja19zdXBwb3J0ZWRfZncoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKKwkJCSAgICAgICBzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCXN0cnVjdCBiZV9tZ210X2NvbnRyb2xsZXJfYXR0cmlidXRlcyAqcmVxOworCXN0cnVjdCBiZV9zZ2UgKnNnZSA9IG5vbmVtYmVkZGVkX3NnbCh3cmIpOworCWludCBzdGF0dXMgPSAwOworCisJbm9uZW1iX2NtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGN0cmwtPnBkZXYsCisJCQkJc2l6ZW9mKHN0cnVjdCBiZV9tZ210X2NvbnRyb2xsZXJfYXR0cmlidXRlcyksCisJCQkJJm5vbmVtYl9jbWQuZG1hKTsKKwlpZiAobm9uZW1iX2NtZC52YSA9PSBOVUxMKSB7CisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAorCQkJICAgICJCR18lZCA6IHBjaV9hbGxvY19jb25zaXN0ZW50IGZhaWxlZCBpbiAlc1xuIiwKKwkJCSAgICBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlub25lbWJfY21kLnNpemUgPSBzaXplb2Yoc3RydWN0IGJlX21nbXRfY29udHJvbGxlcl9hdHRyaWJ1dGVzKTsKKwlyZXEgPSBub25lbWJfY21kLnZhOworCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7CisJbXV0ZXhfbG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwltZW1zZXQod3JiLCAwLCBzaXplb2YoKndyYikpOworCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgZmFsc2UsIDEpOworCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAorCQkJICAgT1BDT0RFX0NPTU1PTl9HRVRfQ05UTF9BVFRSSUJVVEVTLCBzaXplb2YoKnJlcSkpOworCXNnZS0+cGFfaGkgPSBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKG5vbmVtYl9jbWQuZG1hKSk7CisJc2dlLT5wYV9sbyA9IGNwdV90b19sZTMyKG5vbmVtYl9jbWQuZG1hICYgMHhGRkZGRkZGRik7CisJc2dlLT5sZW4gPSBjcHVfdG9fbGUzMihub25lbWJfY21kLnNpemUpOworCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOworCWlmICghc3RhdHVzKSB7CisJCXN0cnVjdCBiZV9tZ210X2NvbnRyb2xsZXJfYXR0cmlidXRlc19yZXNwICpyZXNwID0gbm9uZW1iX2NtZC52YTsKKworCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sIEJFSVNDU0lfTE9HX0lOSVQsCisJCQkgICAgIkJHXyVkIDogRmlybXdhcmUgVmVyc2lvbiBvZiBDTUQgOiAlc1xuIgorCQkJICAgICJGaXJtd2FyZSBWZXJzaW9uIGlzIDogJXNcbiIKKwkJCSAgICAiRGV2ZWxvcGVyIEJ1aWxkLCBub3QgcGVyZm9ybWluZyB2ZXJzaW9uIGNoZWNrLi4uXG4iLAorCQkJICAgIHJlc3AtPnBhcmFtcy5oYmFfYXR0cmlicworCQkJICAgIC5mbGFzaHJvbV92ZXJzaW9uX3N0cmluZywKKwkJCSAgICByZXNwLT5wYXJhbXMuaGJhX2F0dHJpYnMuCisJCQkgICAgZmlybXdhcmVfdmVyc2lvbl9zdHJpbmcpOworCisJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9mZWF0dXJlcyA9CisJCQkJcmVzcC0+cGFyYW1zLmhiYV9hdHRyaWJzLmlzY3NpX2ZlYXR1cmVzOworCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sIEJFSVNDU0lfTE9HX0lOSVQsCisJCQkgICAgIkJNXyVkIDogcGhiYS0+ZndfY29uZmlnLmlzY3NpX2ZlYXR1cmVzID0gJWRcbiIsCisJCQkgICAgcGhiYS0+ZndfY29uZmlnLmlzY3NpX2ZlYXR1cmVzKTsKKwkJbWVtY3B5KHBoYmEtPmZ3X3Zlcl9zdHIsIHJlc3AtPnBhcmFtcy5oYmFfYXR0cmlicy4KKwkJICAgICAgIGZpcm13YXJlX3ZlcnNpb25fc3RyaW5nLCBCRUlTQ1NJX1ZFUl9TVFJMRU4pOworCX0gZWxzZQorCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKKwkJCSAgICAiQkdfJWQgOiAgRmFpbGVkIGluIGJlaXNjc2lfY2hlY2tfc3VwcG9ydGVkX2Z3XG4iKTsKKwltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJaWYgKG5vbmVtYl9jbWQudmEpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY3RybC0+cGRldiwgbm9uZW1iX2NtZC5zaXplLAorCQkJCSAgICBub25lbWJfY21kLnZhLCBub25lbWJfY21kLmRtYSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIGJlaXNjc2lfZ2V0X2Z3X2NvbmZpZygpLSBHZXQgdGhlIEZXIGNvbmZpZyBmb3IgdGhlIGZ1bmN0aW9uCisgKiBAY3RybDogcHRyIHRvIEN0cmwgSW5mbworICogQHBoYmE6IHB0ciB0byB0aGUgZGV2IHByaXYgc3RydWN0dXJlCisgKgorICogR2V0IHRoZSBGVyBjb25maWcgYW5kIHJlc291cmNlcyBhdmFpbGFibGUgZm9yIHRoZSBmdW5jdGlvbi4KKyAqIFRoZSByZXNvdXJjZXMgYXJlIGNyZWF0ZWQgYmFzZWQgb24gdGhlIGNvdW50IHJlY2VpdmVkIGhlcmUuCisgKgorICogcmV0dXJuCisgKglTdWNjZXNzOiAwCisgKglGYWlsdXJlOiBOb24tWmVybyBWYWx1ZQorICoqLworaW50IGJlaXNjc2lfZ2V0X2Z3X2NvbmZpZyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAorCQkJICBzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKKwlzdHJ1Y3QgYmVfZndfY2ZnICpwZndfY2ZnID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCXVpbnQzMl90IGNpZF9jb3VudCwgaWNkX2NvdW50OworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCXVpbnQ4X3QgdWxwX251bSA9IDA7CisKKwltdXRleF9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisJYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpwZndfY2ZnKSwgdHJ1ZSwgMCk7CisKKwliZV9jbWRfaGRyX3ByZXBhcmUoJnBmd19jZmctPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCisJCQkgICBPUENPREVfQ09NTU9OX1FVRVJZX0ZJUk1XQVJFX0NPTkZJRywKKwkJCSAgIEVNQkVEX01CWF9NQVhfUEFZTE9BRF9TSVpFKTsKKworCWlmIChiZV9tYm94X25vdGlmeShjdHJsKSkgeworCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKKwkJCSAgICAiQkdfJWQgOiBGYWlsZWQgaW4gYmVpc2NzaV9nZXRfZndfY29uZmlnXG4iKTsKKwkJZ290byBmYWlsX2luaXQ7CisJfQorCisJLyogRlcgcmVzcG9uc2UgZm9ybWF0cyBkZXBlbmQgb24gcG9ydCBpZCAqLworCXBoYmEtPmZ3X2NvbmZpZy5waHlzX3BvcnQgPSBwZndfY2ZnLT5waHlzX3BvcnQ7CisJaWYgKHBoYmEtPmZ3X2NvbmZpZy5waHlzX3BvcnQgPj0gQkVJU0NTSV9QSFlTX1BPUlRfTUFYKSB7CisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAorCQkJICAgICJCR18lZCA6IGludmFsaWQgcGh5c2ljYWwgcG9ydCBpZCAlZFxuIiwKKwkJCSAgICBwaGJhLT5md19jb25maWcucGh5c19wb3J0KTsKKwkJZ290byBmYWlsX2luaXQ7CisJfQorCisJLyogcG9wdWxhdGUgYW5kIGNoZWNrIEZXIGNvbmZpZyBhZ2FpbnN0IG1pbiBhbmQgbWF4IHZhbHVlcyAqLworCWlmICghaXNfY2hpcF9iZTJfYmUzcihwaGJhKSkgeworCQlwaGJhLT5md19jb25maWcuZXFpZF9jb3VudCA9IHBmd19jZmctPmVxaWRfY291bnQ7CisJCXBoYmEtPmZ3X2NvbmZpZy5jcWlkX2NvdW50ID0gcGZ3X2NmZy0+Y3FpZF9jb3VudDsKKwkJaWYgKHBoYmEtPmZ3X2NvbmZpZy5lcWlkX2NvdW50ID09IDAgfHwKKwkJICAgIHBoYmEtPmZ3X2NvbmZpZy5lcWlkX2NvdW50ID4gMjA0OCkgeworCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCisJCQkJICAgICJCR18lZCA6IGludmFsaWQgRVEgY291bnQgJWRcbiIsCisJCQkJICAgIHBoYmEtPmZ3X2NvbmZpZy5lcWlkX2NvdW50KTsKKwkJCWdvdG8gZmFpbF9pbml0OworCQl9CisJCWlmIChwaGJhLT5md19jb25maWcuY3FpZF9jb3VudCA9PSAwIHx8CisJCSAgICBwaGJhLT5md19jb25maWcuY3FpZF9jb3VudCA+IDQwOTYpIHsKKwkJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAorCQkJCSAgICAiQkdfJWQgOiBpbnZhbGlkIENRIGNvdW50ICVkXG4iLAorCQkJCSAgICBwaGJhLT5md19jb25maWcuY3FpZF9jb3VudCk7CisJCQlnb3RvIGZhaWxfaW5pdDsKKwkJfQorCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sIEJFSVNDU0lfTE9HX0lOSVQsCisJCQkgICAgIkJHXyVkIDogRVFfQ291bnQgOiAlZCBDUV9Db3VudCA6ICVkXG4iLAorCQkJICAgIHBoYmEtPmZ3X2NvbmZpZy5lcWlkX2NvdW50LAorCQkJICAgIHBoYmEtPmZ3X2NvbmZpZy5jcWlkX2NvdW50KTsKKwl9CisKKwkvKioKKwkgKiBDaGVjayBvbiB3aGljaCBhbGwgVUxQIGlTQ1NJIFByb3RvY29sIGlzIGxvYWRlZC4KKwkgKiBTZXQgdGhlIEJpdCBmb3IgdGhvc2UgVUxQLiBUaGlzIHNldCBmbGFnIGlzIHVzZWQKKwkgKiBhdCBhbGwgcGxhY2VzIGluIHRoZSBjb2RlIHRvIGNoZWNrIG9uIHdoaWNoIFVMUAorCSAqIGlTQ1NpIFByb3RvY29sIGlzIGxvYWRlZAorCSAqKi8KKwlmb3IgKHVscF9udW0gPSAwOyB1bHBfbnVtIDwgQkVJU0NTSV9VTFBfQ09VTlQ7IHVscF9udW0rKykgeworCQlpZiAocGZ3X2NmZy0+dWxwW3VscF9udW1dLnVscF9tb2RlICYKKwkJICAgIEJFSVNDU0lfVUxQX0lTQ1NJX0lOSV9NT0RFKSB7CisJCQlzZXRfYml0KHVscF9udW0sICZwaGJhLT5md19jb25maWcudWxwX3N1cHBvcnRlZCk7CisKKwkJCS8qIEdldCB0aGUgQ0lELCBJQ0QgYW5kIENoYWluIGNvdW50IGZvciBlYWNoIFVMUCAqLworCQkJcGhiYS0+ZndfY29uZmlnLmlzY3NpX2NpZF9zdGFydFt1bHBfbnVtXSA9CisJCQkJcGZ3X2NmZy0+dWxwW3VscF9udW1dLnNxX2Jhc2U7CisJCQlwaGJhLT5md19jb25maWcuaXNjc2lfY2lkX2NvdW50W3VscF9udW1dID0KKwkJCQlwZndfY2ZnLT51bHBbdWxwX251bV0uc3FfY291bnQ7CisKKwkJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9pY2Rfc3RhcnRbdWxwX251bV0gPQorCQkJCXBmd19jZmctPnVscFt1bHBfbnVtXS5pY2RfYmFzZTsKKwkJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9pY2RfY291bnRbdWxwX251bV0gPQorCQkJCXBmd19jZmctPnVscFt1bHBfbnVtXS5pY2RfY291bnQ7CisKKwkJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9jaGFpbl9zdGFydFt1bHBfbnVtXSA9CisJCQkJcGZ3X2NmZy0+Y2hhaW5faWNkW3VscF9udW1dLmNoYWluX2Jhc2U7CisJCQlwaGJhLT5md19jb25maWcuaXNjc2lfY2hhaW5fY291bnRbdWxwX251bV0gPQorCQkJCXBmd19jZmctPmNoYWluX2ljZFt1bHBfbnVtXS5jaGFpbl9jb3VudDsKKworCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLCBCRUlTQ1NJX0xPR19JTklULAorCQkJCSAgICAiQkdfJWQgOiBGdW5jdGlvbiBsb2FkZWQgb24gVUxQIDogJWRcbiIKKwkJCQkgICAgIlx0aXNjc2lfY2lkX2NvdW50IDogJWRcbiIKKwkJCQkgICAgIlx0aXNjc2lfY2lkX3N0YXJ0IDogJWRcbiIKKwkJCQkgICAgIlx0IGlzY3NpX2ljZF9jb3VudCA6ICVkXG4iCisJCQkJICAgICJcdCBpc2NzaV9pY2Rfc3RhcnQgOiAlZFxuIiwKKwkJCQkgICAgdWxwX251bSwKKwkJCQkgICAgcGhiYS0+ZndfY29uZmlnLgorCQkJCSAgICBpc2NzaV9jaWRfY291bnRbdWxwX251bV0sCisJCQkJICAgIHBoYmEtPmZ3X2NvbmZpZy4KKwkJCQkgICAgaXNjc2lfY2lkX3N0YXJ0W3VscF9udW1dLAorCQkJCSAgICBwaGJhLT5md19jb25maWcuCisJCQkJICAgIGlzY3NpX2ljZF9jb3VudFt1bHBfbnVtXSwKKwkJCQkgICAgcGhiYS0+ZndfY29uZmlnLgorCQkJCSAgICBpc2NzaV9pY2Rfc3RhcnRbdWxwX251bV0pOworCQl9CisJfQorCisJaWYgKHBoYmEtPmZ3X2NvbmZpZy51bHBfc3VwcG9ydGVkID09IDApIHsKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCisJCQkgICAgIkJHXyVkIDogaVNDU0kgaW5pdGlhdG9yIG1vZGUgbm90IHNldDogVUxQMCAleCBVTFAxICV4XG4iLAorCQkJICAgIHBmd19jZmctPnVscFtCRUlTQ1NJX1VMUDBdLnVscF9tb2RlLAorCQkJICAgIHBmd19jZmctPnVscFtCRUlTQ1NJX1VMUDFdLnVscF9tb2RlKTsKKwkJZ290byBmYWlsX2luaXQ7CisJfQorCisJLyoqCisJICogSUNEIGlzIHNoYXJlZCBhbW9uZyBVTFBzLiBVc2UgaWNkX2NvdW50IG9mIGFueSBvbmUgbG9hZGVkIFVMUAorCSAqKi8KKwlmb3IgKHVscF9udW0gPSAwOyB1bHBfbnVtIDwgQkVJU0NTSV9VTFBfQ09VTlQ7IHVscF9udW0rKykKKwkJaWYgKHRlc3RfYml0KHVscF9udW0sICZwaGJhLT5md19jb25maWcudWxwX3N1cHBvcnRlZCkpCisJCQlicmVhazsKKwlpY2RfY291bnQgPSBwaGJhLT5md19jb25maWcuaXNjc2lfaWNkX2NvdW50W3VscF9udW1dOworCWlmIChpY2RfY291bnQgPT0gMCB8fCBpY2RfY291bnQgPiA2NTUzNikgeworCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKKwkJCSAgICAiQkdfJWQ6IGludmFsaWQgSUNEIGNvdW50ICVkXG4iLCBpY2RfY291bnQpOworCQlnb3RvIGZhaWxfaW5pdDsKKwl9CisKKwljaWRfY291bnQgPSBCRUlTQ1NJX0dFVF9DSURfQ09VTlQocGhiYSwgQkVJU0NTSV9VTFAwKSArCisJCSAgICBCRUlTQ1NJX0dFVF9DSURfQ09VTlQocGhiYSwgQkVJU0NTSV9VTFAxKTsKKwlpZiAoY2lkX2NvdW50ID09IDAgfHwgY2lkX2NvdW50ID4gNDA5NikgeworCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKKwkJCSAgICAiQkdfJWQ6IGludmFsaWQgQ0lEIGNvdW50ICVkXG4iLCBjaWRfY291bnQpOworCQlnb3RvIGZhaWxfaW5pdDsKKwl9CisKKwkvKioKKwkgKiBDaGVjayBGVyBpcyBkdWFsIFVMUCBhd2FyZSBpLmUuIGNhbiBoYW5kbGUgZWl0aGVyCisJICogb2YgdGhlIHByb3RvY29scy4KKwkgKi8KKwlwaGJhLT5md19jb25maWcuZHVhbF91bHBfYXdhcmUgPSAocGZ3X2NmZy0+ZnVuY3Rpb25fbW9kZSAmCisJCQkJCSAgQkVJU0NTSV9GVU5DX0RVQV9NT0RFKTsKKworCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywgQkVJU0NTSV9MT0dfSU5JVCwKKwkJICAgICJCR18lZCA6IERVQSBNb2RlIDogMHgleFxuIiwKKwkJICAgIHBoYmEtPmZ3X2NvbmZpZy5kdWFsX3VscF9hd2FyZSk7CisKKwkvKiBhbGwgc2V0LCBjb250aW51ZSB1c2luZyB0aGlzIEZXIGNvbmZpZyAqLworCXN0YXR1cyA9IDA7CitmYWlsX2luaXQ6CisJbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogYmVpc2NzaV9nZXRfcG9ydF9uYW1lKCktIEdldCBwb3J0IG5hbWUgZm9yIHRoZSBmdW5jdGlvbgorICogQGN0cmw6IHB0ciB0byBDdHJsIEluZm8KKyAqIEBwaGJhOiBwdHIgdG8gdGhlIGRldiBwcml2IHN0cnVjdHVyZQorICoKKyAqIEdldCB0aGUgYWxwaGFudW1lcmljIGNoYXJhY3RlciBmb3IgcG9ydAorICoKKyAqKi8KK2ludCBiZWlzY3NpX2dldF9wb3J0X25hbWUoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CisJc3RydWN0IGJlX2NtZF9nZXRfcG9ydF9uYW1lICppb2N0bDsKKworCW11dGV4X2xvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisJaW9jdGwgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CisKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKmlvY3RsKSwgdHJ1ZSwgMCk7CisJYmVfY21kX2hkcl9wcmVwYXJlKCZpb2N0bC0+aC5yZXFfaGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKKwkJCSAgIE9QQ09ERV9DT01NT05fR0VUX1BPUlRfTkFNRSwKKwkJCSAgIEVNQkVEX01CWF9NQVhfUEFZTE9BRF9TSVpFKTsKKwlyZXQgPSBiZV9tYm94X25vdGlmeShjdHJsKTsKKwlwaGJhLT5wb3J0X25hbWUgPSAwOworCWlmICghcmV0KSB7CisJCXBoYmEtPnBvcnRfbmFtZSA9IGlvY3RsLT5wLnJlc3AucG9ydF9uYW1lcyA+PgorCQkJCSAgKHBoYmEtPmZ3X2NvbmZpZy5waHlzX3BvcnQgKiA4KSAmIDB4ZmY7CisJfSBlbHNlIHsKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLCBCRUlTQ1NJX0xPR19JTklULAorCQkJICAgICJCR18lZCA6IEdFVF9QT1JUX05BTUUgcmV0IDB4JXggc3RhdHVzIDB4JXhcbiIsCisJCQkgICAgcmV0LCBpb2N0bC0+aC5yZXNwX2hkci5zdGF0dXMpOworCX0KKworCWlmIChwaGJhLT5wb3J0X25hbWUgPT0gMCkKKwkJcGhiYS0+cG9ydF9uYW1lID0gJz8nOworCisJbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK2ludCBiZWlzY3NpX3NldF91ZXJfZmVhdHVyZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOworCXN0cnVjdCBiZV9jbWRfc2V0X2ZlYXR1cmVzICppb2N0bDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwl3cmIgPSB3cmJfZnJvbV9tYm94KCZjdHJsLT5tYm94X21lbSk7CisJbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKKwlpb2N0bCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKworCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqaW9jdGwpLCB0cnVlLCAwKTsKKwliZV9jbWRfaGRyX3ByZXBhcmUoJmlvY3RsLT5oLnJlcV9oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAorCQkJICAgT1BDT0RFX0NPTU1PTl9TRVRfRkVBVFVSRVMsCisJCQkgICBFTUJFRF9NQlhfTUFYX1BBWUxPQURfU0laRSk7CisJaW9jdGwtPmZlYXR1cmUgPSBCRV9DTURfU0VUX0ZFQVRVUkVfVUVSOworCWlvY3RsLT5wYXJhbV9sZW4gPSBzaXplb2YoaW9jdGwtPnBhcmFtLnJlcSk7CisJaW9jdGwtPnBhcmFtLnJlcS51ZXIgPSBCRV9DTURfVUVSX1NVUFBfQklUOworCXJldCA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOworCWlmICghcmV0KSB7CisJCXBoYmEtPnVlMnJwID0gaW9jdGwtPnBhcmFtLnJlc3AudWUycnA7CisJCXNldF9iaXQoQkVJU0NTSV9IQkFfVUVSX1NVUFAsICZwaGJhLT5zdGF0ZSk7CisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywgQkVJU0NTSV9MT0dfSU5JVCwKKwkJCSAgICAiQkdfJWQgOiBIQkEgZXJyb3IgcmVjb3Zlcnkgc3VwcG9ydGVkXG4iKTsKKwl9IGVsc2UgeworCQkvKioKKwkJICogQ2hlY2sgIk1DQ19TVEFUVVNfSU5WQUxJRF9MRU5HVEgiIGZvciBTS0guCisJCSAqIE9sZGVyIEZXIHZlcnNpb25zIHJldHVybiB0aGlzIGVycm9yLgorCQkgKi8KKwkJaWYgKHJldCA9PSBNQ0NfU1RBVFVTX0lMTEVHQUxfUkVRVUVTVCB8fAorCQkgICAgcmV0ID09IE1DQ19TVEFUVVNfSU5WQUxJRF9MRU5HVEgpCisJCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywKKwkJCQkgICAgICAiQkdfJWQgOiBIQkEgZXJyb3IgcmVjb3Zlcnkgbm90IHN1cHBvcnRlZFxuIik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MzIgYmVpc2NzaV9nZXRfcG9zdF9zdGFnZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJdTMyIHNlbTsKKworCWlmIChpc19jaGlwX2JlMl9iZTNyKHBoYmEpKQorCQlzZW0gPSBpb3JlYWQzMihwaGJhLT5jc3JfdmEgKyBTTElQT1JUX1NFTUFQSE9SRV9PRkZTRVRfQkV4KTsKKwllbHNlCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaGJhLT5wY2lkZXYsCisJCQkJICAgICAgU0xJUE9SVF9TRU1BUEhPUkVfT0ZGU0VUX1NILCAmc2VtKTsKKwlyZXR1cm4gc2VtOworfQorCitpbnQgYmVpc2NzaV9jaGVja19md19yZHkoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXUzMiBsb29wLCBwb3N0LCByZHkgPSAwOworCisJbG9vcCA9IDEwMDA7CisJd2hpbGUgKGxvb3AtLSkgeworCQlwb3N0ID0gYmVpc2NzaV9nZXRfcG9zdF9zdGFnZShwaGJhKTsKKwkJaWYgKHBvc3QgJiBQT1NUX0VSUk9SX0JJVCkKKwkJCWJyZWFrOworCQlpZiAoKHBvc3QgJiBQT1NUX1NUQUdFX01BU0spID09IFBPU1RfU1RBR0VfQVJNRldfUkRZKSB7CisJCQlyZHkgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDYwKTsKKwl9CisKKwlpZiAoIXJkeSkgeworCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAorCQkJICAgICAgIkJDXyVkIDogRlcgbm90IHJlYWR5IDB4JXhcbiIsIHBvc3QpOworCX0KKworCXJldHVybiByZHk7Cit9CisKK2ludCBiZWlzY3NpX2NtZF9mdW5jdGlvbl9yZXNldChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSB3cmJfZnJvbV9tYm94KCZjdHJsLT5tYm94X21lbSk7CisJc3RydWN0IGJlX3Bvc3Rfc2dsX3BhZ2VzX3JlcSAqcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCWludCBzdGF0dXM7CisKKwltdXRleF9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCisJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCk7CisJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCisJCQkgICBPUENPREVfQ09NTU9OX0ZVTkNUSU9OX1JFU0VULCBzaXplb2YoKnJlcSkpOworCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOworCisJbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBiZWlzY3NpX2NtZF9zcGVjaWFsX3dyYihzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLCB1MzIgbG9hZCkKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IHBjaV9nZXRfZHJ2ZGF0YShjdHJsLT5wZGV2KTsKKwl1OCAqZW5kaWFuX2NoZWNrOworCWludCBzdGF0dXM7CisKKwltdXRleF9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7CisKKwllbmRpYW5fY2hlY2sgPSAodTggKikgd3JiOworCWlmIChsb2FkKSB7CisJCS8qIHRvIHN0YXJ0IGNvbW11bmljYXRpbmcgKi8KKwkJKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHgxMjsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHgzNDsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHg1NjsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHg3ODsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKKwl9IGVsc2UgeworCQkvKiB0byBzdG9wIGNvbW11bmljYXRpbmcgKi8KKwkJKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHhBQTsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHhCQjsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHhGRjsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHhDQzsKKwkJKmVuZGlhbl9jaGVjaysrID0gMHhERDsKKwkJKmVuZGlhbl9jaGVjayA9IDB4RkY7CisJfQorCWJlX2R3c19jcHVfdG9fbGUod3JiLCBzaXplb2YoKndyYikpOworCisJc3RhdHVzID0gYmVfbWJveF9ub3RpZnkoY3RybCk7CisJaWYgKHN0YXR1cykKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLCBCRUlTQ1NJX0xPR19JTklULAorCQkJICAgICJCQ18lZCA6IHNwZWNpYWwgV1JCIG1lc3NhZ2UgZmFpbGVkXG4iKTsKKwltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGJlaXNjc2lfaW5pdF9zbGlwb3J0KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlpbnQgc3RhdHVzOworCisJLyogY2hlY2sgUE9TVCBzdGFnZSBiZWZvcmUgdGFsa2luZyB0byBGVyAqLworCXN0YXR1cyA9IGJlaXNjc2lfY2hlY2tfZndfcmR5KHBoYmEpOworCWlmICghc3RhdHVzKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIGNsZWFyIGFsbCBlcnJvciBzdGF0ZXMgYWZ0ZXIgY2hlY2tpbmcgRlcgcmR5ICovCisJcGhiYS0+c3RhdGUgJj0gfkJFSVNDU0lfSEJBX0lOX0VSUjsKKworCS8qIGNoZWNrIGFnYWluIFVFUiBzdXBwb3J0ICovCisJcGhiYS0+c3RhdGUgJj0gfkJFSVNDU0lfSEJBX1VFUl9TVVBQOworCisJLyoKKwkgKiBTTEkgQ09NTU9OX0ZVTkNUSU9OX1JFU0VUIGNvbXBsZXRpb24gaXMgaW5kaWNhdGVkIGJ5IEJNQlggUkRZIGJpdC4KKwkgKiBJdCBzaG91bGQgY2xlYW4gdXAgYW55IHN0YWxlIGluZm8gaW4gRlcgZm9yIHRoaXMgZm4uCisJICovCisJc3RhdHVzID0gYmVpc2NzaV9jbWRfZnVuY3Rpb25fcmVzZXQocGhiYSk7CisJaWYgKHN0YXR1cykgeworCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKKwkJCSAgICAiQkNfJWQgOiBTTEkgRnVuY3Rpb24gUmVzZXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBpbmRpY2F0ZSBkcml2ZXIgaXMgbG9hZGluZyAqLworCXJldHVybiBiZWlzY3NpX2NtZF9zcGVjaWFsX3dyYigmcGhiYS0+Y3RybCwgMSk7Cit9CisKKy8qKgorICogYmVpc2NzaV9jbWRfaXNjc2lfY2xlYW51cCgpLSBJbmZvcm0gRlcgdG8gY2xlYW51cCBFUCBkYXRhIHN0cnVjdHVyZXMuCisgKiBAcGhiYTogcG9pbnRlciB0byBkZXYgcHJpdiBzdHJ1Y3R1cmUKKyAqIEB1bHA6IFVMUCBudW1iZXIuCisgKgorICogcmV0dXJuCisgKglTdWNjZXNzOiAwCisgKglGYWlsdXJlOiBOb24tWmVybyBWYWx1ZQorICoqLworaW50IGJlaXNjc2lfY21kX2lzY3NpX2NsZWFudXAoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1bnNpZ25lZCBzaG9ydCB1bHApCit7CisJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOworCXN0cnVjdCBpc2NzaV9jbGVhbnVwX3JlcV92MSAqcmVxX3YxOworCXN0cnVjdCBpc2NzaV9jbGVhbnVwX3JlcSAqcmVxOworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CisJaW50IHN0YXR1czsKKworCW11dGV4X2xvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJd3JiID0gd3JiX2Zyb21fbWJveCgmY3RybC0+bWJveF9tZW0pOworCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOworCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fSVNDU0ksCisJCQkgICBPUENPREVfQ09NTU9OX0lTQ1NJX0NMRUFOVVAsIHNpemVvZigqcmVxKSk7CisKKyAgICAgICAvKioKKwkqIFRPRE86IENoZWNrIHdpdGggRlcgZm9sa3MgdGhlIGNodXRlIHZhbHVlIHRvIGJlIHNldC4KKwkqIEZvciBub3csIHVzZSB0aGUgVUxQX01BU0sgYXMgdGhlIGNodXRlIHZhbHVlLgorCSovCisJaWYgKGlzX2NoaXBfYmUyX2JlM3IocGhiYSkpIHsKKwkJcmVxLT5jaHV0ZSA9ICgxIDw8IHVscCk7CisJCXJlcS0+aGRyX3JpbmdfaWQgPSBIV0lfR0VUX0RFRl9IRFJRX0lEKHBoYmEsIHVscCk7CisJCXJlcS0+ZGF0YV9yaW5nX2lkID0gSFdJX0dFVF9ERUZfQlVGUV9JRChwaGJhLCB1bHApOworCX0gZWxzZSB7CisJCXJlcV92MSA9IChzdHJ1Y3QgaXNjc2lfY2xlYW51cF9yZXFfdjEgKilyZXE7CisJCXJlcV92MS0+aGRyLnZlcnNpb24gPSAxOworCQlyZXFfdjEtPmhkcl9yaW5nX2lkID0gY3B1X3RvX2xlMTYoSFdJX0dFVF9ERUZfSERSUV9JRChwaGJhLAorCQkJCQkJCQkgICAgICB1bHApKTsKKwkJcmVxX3YxLT5kYXRhX3JpbmdfaWQgPSBjcHVfdG9fbGUxNihIV0lfR0VUX0RFRl9CVUZRX0lEKHBoYmEsCisJCQkJCQkJCSAgICAgICB1bHApKTsKKwl9CisKKwlzdGF0dXMgPSBiZV9tYm94X25vdGlmeShjdHJsKTsKKwlpZiAoc3RhdHVzKQorCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIEJFSVNDU0lfTE9HX0lOSVQsCisJCQkgICAgIkJHXyVkIDogJXMgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgdWxwKTsKKwltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIGJlaXNjc2lfZGV0ZWN0X3VlKCktIERldGVjdCBVbnJlY292ZXJhYmxlIEVycm9yIG9uIGFkYXB0ZXIKKyAqIEBwaGJhOiBEcml2ZXIgcHJpdiBzdHJ1Y3R1cmUKKyAqCisgKiBSZWFkIHJlZ2lzdGVycyBsaW5rZWQgdG8gVUUgYW5kIGNoZWNrIGZvciB0aGUgVUUgc3RhdHVzCisgKiovCitpbnQgYmVpc2NzaV9kZXRlY3RfdWUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXVpbnQzMl90IHVlX21hc2tfaGkgPSAwLCB1ZV9tYXNrX2xvID0gMDsKKwl1aW50MzJfdCB1ZV9oaSA9IDAsIHVlX2xvID0gMDsKKwl1aW50OF90IGkgPSAwOworCWludCByZXQgPSAwOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBoYmEtPnBjaWRldiwKKwkJCSAgICAgIFBDSUNGR19VRV9TVEFUVVNfTE9XLCAmdWVfbG8pOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaGJhLT5wY2lkZXYsCisJCQkgICAgICBQQ0lDRkdfVUVfU1RBVFVTX01BU0tfTE9XLAorCQkJICAgICAgJnVlX21hc2tfbG8pOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaGJhLT5wY2lkZXYsCisJCQkgICAgICBQQ0lDRkdfVUVfU1RBVFVTX0hJR0gsCisJCQkgICAgICAmdWVfaGkpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaGJhLT5wY2lkZXYsCisJCQkgICAgICBQQ0lDRkdfVUVfU1RBVFVTX01BU0tfSEksCisJCQkgICAgICAmdWVfbWFza19oaSk7CisKKwl1ZV9sbyA9ICh1ZV9sbyAmIH51ZV9tYXNrX2xvKTsKKwl1ZV9oaSA9ICh1ZV9oaSAmIH51ZV9tYXNrX2hpKTsKKworCisJaWYgKHVlX2xvIHx8IHVlX2hpKSB7CisJCXNldF9iaXQoQkVJU0NTSV9IQkFfSU5fVUUsICZwaGJhLT5zdGF0ZSk7CisJCV9fYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCisJCQkgICAgICAiQkNfJWQgOiBIQkEgZXJyb3IgZGV0ZWN0ZWRcbiIpOworCQlyZXQgPSAxOworCX0KKworCWlmICh1ZV9sbykgeworCQlmb3IgKGkgPSAwOyB1ZV9sbzsgdWVfbG8gPj49IDEsIGkrKykgeworCQkJaWYgKHVlX2xvICYgMSkKKwkJCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAorCQkJCQkgICAgICAiQkNfJWQgOiBVRV9MT1cgJXMgYml0IHNldFxuIiwKKwkJCQkJICAgICAgZGVzY191ZV9zdGF0dXNfbG93W2ldKTsKKwkJfQorCX0KKworCWlmICh1ZV9oaSkgeworCQlmb3IgKGkgPSAwOyB1ZV9oaTsgdWVfaGkgPj49IDEsIGkrKykgeworCQkJaWYgKHVlX2hpICYgMSkKKwkJCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAorCQkJCQkgICAgICAiQkNfJWQgOiBVRV9ISUdIICVzIGJpdCBzZXRcbiIsCisJCQkJCSAgICAgIGRlc2NfdWVfc3RhdHVzX2hpW2ldKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogYmVpc2NzaV9kZXRlY3RfdHBlKCktIERldGVjdCBUcmFuc2llbnQgUGFyaXR5IEVycm9yIG9uIGFkYXB0ZXIKKyAqIEBwaGJhOiBEcml2ZXIgcHJpdiBzdHJ1Y3R1cmUKKyAqCisgKiBSZWFkIFNMSVBPUlQgU0VNQVBIT1JFIHJlZ2lzdGVyIHRvIGNoZWNrIGZvciBVRVIKKyAqCisgKiovCitpbnQgYmVpc2NzaV9kZXRlY3RfdHBlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwl1MzIgcG9zdCwgc3RhdHVzOworCWludCByZXQgPSAwOworCisJcG9zdCA9IGJlaXNjc2lfZ2V0X3Bvc3Rfc3RhZ2UocGhiYSk7CisJc3RhdHVzID0gcG9zdCAmIFBPU1RfU1RBR0VfTUFTSzsKKwlpZiAoKHN0YXR1cyAmIFBPU1RfRVJSX1JFQ09WRVJZX0NPREVfTUFTSykgPT0KKwkgICAgUE9TVF9TVEFHRV9SRUNPVkVSQUJMRV9FUlIpIHsKKwkJc2V0X2JpdChCRUlTQ1NJX0hCQV9JTl9UUEUsICZwaGJhLT5zdGF0ZSk7CisJCV9fYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLAorCQkJICAgICAgIkJDXyVkIDogSEJBIGVycm9yIHJlY292ZXJhYmxlOiAweCV4XG4iLCBwb3N0KTsKKwkJcmV0ID0gMTsKKwl9IGVsc2UgeworCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywKKwkJCSAgICAgICJCQ18lZCA6IEhCQSBpbiBVRTogMHgleFxuIiwgcG9zdCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmggYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5oCmluZGV4IGRlZWI5NTEuLjMyOGZiNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmgKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuaApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAxNSBFbXVsZXgKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMTYgQnJvYWRjb20KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtOCw3ICs4LDcgQEAKICAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgogICoKICAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiBsaW51eC1kcml2ZXJzQGF2YWdvdGVjaC5jb20KKyAqIGxpbnV4LWRyaXZlcnNAYnJvYWRjb20uY29tCiAgKgogICogRW11bGV4CiAgKiAzMzMzIFN1c2FuIFN0cmVldApAQCAtNTcsNiArNTcsNyBAQAogI2RlZmluZSBNQ0NfU1RBVFVTX0lMTEVHQUxfUkVRVUVTVCAweDIKICNkZWZpbmUgTUNDX1NUQVRVU19JTExFR0FMX0ZJRUxEIDB4MwogI2RlZmluZSBNQ0NfU1RBVFVTX0lOU1VGRklDSUVOVF9CVUZGRVIgMHg0CisjZGVmaW5lIE1DQ19TVEFUVVNfSU5WQUxJRF9MRU5HVEggMHg3NAogCiAjZGVmaW5lIENRRV9TVEFUVVNfQ09NUExfTUFTSwkweEZGRkYKICNkZWZpbmUgQ1FFX1NUQVRVU19DT01QTF9TSElGVAkwCQkvKiBiaXRzIDAgLSAxNSAqLwpAQCAtOTcsMTEgKzk4LDIzIEBACiAjZGVmaW5lIE1QVV9NQUlMQk9YX0RCX1JEWV9NQVNLCTB4MQkvKiBiaXQgMCAqLwogI2RlZmluZSBNUFVfTUFJTEJPWF9EQl9ISV9NQVNLCTB4MgkvKiBiaXQgMSAqLwogCi0vKioqKioqKioqKiBNUFUgc2VtcGhvcmUgKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBNUFVfRVBfU0VNQVBIT1JFX09GRlNFVCAweGFjCi0jZGVmaW5lIEVQX1NFTUFQSE9SRV9QT1NUX1NUQUdFX01BU0sgMHgwMDAwRkZGRgotI2RlZmluZSBFUF9TRU1BUEhPUkVfUE9TVF9FUlJfTUFTSyAweDEKLSNkZWZpbmUgRVBfU0VNQVBIT1JFX1BPU1RfRVJSX1NISUZUIDMxCisvKioqKioqKioqKiBNUFUgc2VtcGhvcmU6IHVzZWQgZm9yIFNIICYgQkUgKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBTTElQT1JUX1NPRlRSRVNFVF9PRkZTRVQJCTB4NWMJLyogQ1NSIEJBUiBvZmZzZXQgKi8KKyNkZWZpbmUgU0xJUE9SVF9TRU1BUEhPUkVfT0ZGU0VUX0JFeAkJMHhhYwkvKiBDU1IgQkFSIG9mZnNldCAqLworI2RlZmluZSBTTElQT1JUX1NFTUFQSE9SRV9PRkZTRVRfU0gJCTB4OTQJLyogUENJLUNGRyBvZmZzZXQgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9NQVNLCQkJCTB4MDAwMEZGRkYKKyNkZWZpbmUgUE9TVF9FUlJPUl9CSVQJCQkJMHg4MDAwMDAwMAorI2RlZmluZSBQT1NUX0VSUl9SRUNPVkVSWV9DT0RFX01BU0sJCTB4RjAwMAorCisvKiBTb2Z0IFJlc2V0IHJlZ2lzdGVyIG1hc2tzICovCisjZGVmaW5lIFNMSVBPUlRfU09GVFJFU0VUX1NSX01BU0sJCTB4MDAwMDAwODAJLyogU1IgYml0ICovCisKKy8qIE1QVSBzZW1waG9yZSBQT1NUIHN0YWdlIHZhbHVlcyAqLworI2RlZmluZSBQT1NUX1NUQUdFX0FXQUlUSU5HX0hPU1RfUkRZCTB4MSAvKiBGVyBhd2FpdGluZyBnb2FoZWFkIGZyb20gaG9zdCAqLworI2RlZmluZSBQT1NUX1NUQUdFX0hPU1RfUkRZCQkweDIgLyogSG9zdCBoYXMgZ2l2ZW4gZ28tYWhlZCB0byBGVyAqLworI2RlZmluZSBQT1NUX1NUQUdFX0JFX1JFU0VUCQkweDMgLyogSG9zdCB3YW50cyB0byByZXNldCBjaGlwICovCisjZGVmaW5lIFBPU1RfU1RBR0VfQVJNRldfUkRZCQkweEMwMDAgLyogRlcgaXMgZG9uZSB3aXRoIFBPU1QgKi8KKyNkZWZpbmUgUE9TVF9TVEFHRV9SRUNPVkVSQUJMRV9FUlIJMHhFMDAwIC8qIFJlY292ZXJhYmxlIGVyciBkZXRlY3RlZCAqLwogCiAvKioqKioqKioqKiBNQ0MgZG9vciBiZWxsICoqKioqKioqKioqKi8KICNkZWZpbmUgREJfTUNDUV9PRkZTRVQgMHgxNDAKQEAgLTEwOSw5ICsxMjIsNiBAQAogLyogTnVtYmVyIG9mIGVudHJpZXMgcG9zdGVkICovCiAjZGVmaW5lIERCX01DQ1FfTlVNX1BPU1RFRF9TSElGVCAxNgkJLyogYml0cyAxNiAtIDI5ICovCiAKLS8qIE1QVSBzZW1waG9yZSBQT1NUIHN0YWdlIHZhbHVlcyAqLwotI2RlZmluZSBQT1NUX1NUQUdFX0FSTUZXX1JEWQkJMHhjMDAwCS8qIEZXIGlzIGRvbmUgd2l0aCBQT1NUICovCi0KIC8qKgogICogV2hlbiB0aGUgYXN5bmMgYml0IG9mIG1jY19jb21wbCBpcyBzZXQsIHRoZSBsYXN0IDQgYnl0ZXMgb2YKICAqIG1jY19jb21wbCBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgpAQCAtMjE3LDYgKzIyNyw3IEBACiAjZGVmaW5lIE9QQ09ERV9DT01NT05fUVVFUllfRklSTVdBUkVfQ09ORklHCQk1OAogI2RlZmluZSBPUENPREVfQ09NTU9OX0ZVTkNUSU9OX1JFU0VUCQkJNjEKICNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfUE9SVF9OQU1FCQkJNzcKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfRkVBVFVSRVMJCQkxOTEKIAogLyoqCiAgKiBMSVNUIG9mIG9wY29kZXMgdGhhdCBhcmUgY29tbW9uIGJldHdlZW4gSW5pdGlhdG9yIGFuZCBUYXJnZXQKQEAgLTM0NSw4ICszNTYsOCBAQAogCiBzdHJ1Y3QgYmVfY21kX3Jlc3BfbG9nb3V0X2Z3X3Nlc3MgewogCXN0cnVjdCBiZV9jbWRfcmVzcF9oZHIgaGRyOwkvKiBkd1s0XSAqLwotI2RlZmluZSBCRUlTQ1NJX01HTVRfU0VTU0lPTl9DTE9TRSAweDIwCiAJdWludDMyX3Qgc2Vzc2lvbl9zdGF0dXM7CisjZGVmaW5lIEJFX1NFU1NfU1RBVFVTX0NMT1NFCQkweDIwCiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbWdtdF9jb25uX2xvZ2luX29wdGlvbnMgewpAQCAtMzY1LDYgKzM3NiwxNCBAQAogCXUxNiBzaXplX29mX3N0cnVjdHVyZTsKIAl1OCByZXNlcnZlZDsKIAl1OCBpcF90eXBlOworI2RlZmluZSBCRUlTQ1NJX0lQX1RZUEVfVjQJCTB4MQorI2RlZmluZSBCRUlTQ1NJX0lQX1RZUEVfU1RBVElDX1Y0CTB4MworI2RlZmluZSBCRUlTQ1NJX0lQX1RZUEVfREhDUF9WNAkJMHg1CisvKiB0eXBlIHY0IHZhbHVlcyA8IHR5cGUgdjYgdmFsdWVzICovCisjZGVmaW5lIEJFSVNDU0lfSVBfVFlQRV9WNgkJMHgxMAorI2RlZmluZSBCRUlTQ1NJX0lQX1RZUEVfUk9VVEFCTEVfVjYJMHgzMAorI2RlZmluZSBCRUlTQ1NJX0lQX1RZUEVfTElOS19MT0NBTF9WNgkweDUwCisjZGVmaW5lIEJFSVNDU0lfSVBfVFlQRV9BVVRPX1Y2CQkweDkwCiAJdTggYWRkclsxNl07CiAJdTMyIHJzdmQwOwogfSBfX3BhY2tlZDsKQEAgLTQzMCw4ICs0NDksMTMgQEAKIAogc3RydWN0IGJlX2NtZF9nZXRfYm9vdF90YXJnZXRfcmVzcCB7CiAJc3RydWN0IGJlX2NtZF9yZXNwX2hkciBoZHI7Ci0JdTMyICBib290X3Nlc3Npb25fY291bnQ7Ci0JaW50ICBib290X3Nlc3Npb25faGFuZGxlOworCXUzMiBib290X3Nlc3Npb25fY291bnQ7CisJdTMyIGJvb3Rfc2Vzc2lvbl9oYW5kbGU7CisvKioKKyAqIEZXIHJldHVybnMgMHhmZmZmZmZmZiBpZiBpdCBjb3VsZG4ndCBlc3RhYmxpc2ggY29ubmVjdGlvbiB3aXRoCisgKiBjb25maWd1cmVkIGJvb3QgdGFyZ2V0LgorICovCisjZGVmaW5lIEJFX0JPT1RfSU5WQUxJRF9TSEFORExFCTB4ZmZmZmZmZmYKIH07CiAKIHN0cnVjdCBiZV9jbWRfcmVvcGVuX3Nlc3Npb25fcmVxIHsKQEAgLTY5OSwxNiArNzIzLDU5IEBACiAJdTggbWFjX2FkZHJlc3NbRVRIX0FMRU5dOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBCRUlTQ1NJX0FMSUFTX0xFTiAzMgorLyoqKioqKioqKioqKioqKioqKioqIEdldCBIQkEgTkFNRSAqKioqKioqKioqKioqKioqKioqLwogCiBzdHJ1Y3QgYmVfY21kX2hiYV9uYW1lIHsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOwogCXUxNiBmbGFnczsKIAl1MTYgcnN2ZDA7CiAJdTggaW5pdGlhdG9yX25hbWVbSVNDU0lfTkFNRV9MRU5dOwotCXU4IGluaXRpYXRvcl9hbGlhc1tCRUlTQ1NJX0FMSUFTX0xFTl07CisjZGVmaW5lIEJFX0lOSV9BTElBU19MRU4gMzIKKwl1OCBpbml0aWF0b3JfYWxpYXNbQkVfSU5JX0FMSUFTX0xFTl07CiB9IF9fcGFja2VkOwogCisvKioqKioqKioqKioqKioqKioqKiogQ09NTU9OIFNFVCBGZWF0dXJlcyAqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBCRV9DTURfU0VUX0ZFQVRVUkVfVUVSCTB4MTAKKyNkZWZpbmUgQkVfQ01EX1VFUl9TVVBQX0JJVAkweDEKK3N0cnVjdCBiZV91ZXJfcmVxIHsKKwl1MzIgdWVyOworCXUzMiByc3ZkOworfTsKKworc3RydWN0IGJlX3Vlcl9yZXNwIHsKKwl1MzIgdWVyOworCXUxNiB1ZTJycDsKKwl1MTYgdWUyc3I7Cit9OworCitzdHJ1Y3QgYmVfY21kX3NldF9mZWF0dXJlcyB7CisJdW5pb24geworCQlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgcmVxX2hkcjsKKwkJc3RydWN0IGJlX2NtZF9yZXNwX2hkciByZXNwX2hkcjsKKwl9IGg7CisJdTMyIGZlYXR1cmU7CisJdTMyIHBhcmFtX2xlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBiZV91ZXJfcmVxIHJlcTsKKwkJc3RydWN0IGJlX3Vlcl9yZXNwIHJlc3A7CisJCXUzMiByc3ZkWzJdOworCX0gcGFyYW07Cit9IF9fcGFja2VkOworCitpbnQgYmVpc2NzaV9jbWRfZnVuY3Rpb25fcmVzZXQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKKworaW50IGJlaXNjc2lfY21kX3NwZWNpYWxfd3JiKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsIHUzMiBsb2FkKTsKKworaW50IGJlaXNjc2lfY2hlY2tfZndfcmR5KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CisKK2ludCBiZWlzY3NpX2luaXRfc2xpcG9ydChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpOworCitpbnQgYmVpc2NzaV9jbWRfaXNjc2lfY2xlYW51cChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHVuc2lnbmVkIHNob3J0IHVscF9udW0pOworCitpbnQgYmVpc2NzaV9kZXRlY3RfdWUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKKworaW50IGJlaXNjc2lfZGV0ZWN0X3RwZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpOworCiBpbnQgYmVpc2NzaV9jbWRfZXFfY3JlYXRlKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCiAJCQkgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICplcSwgaW50IGVxX2RlbGF5KTsKIApAQCAtNzIzLDI0ICs3OTAsMjEgQEAKIAkJCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICptY2NxLAogCQkJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxKTsKIAotaW50IGJlX3BvbGxfbWNjKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwpOwotaW50IG1nbXRfY2hlY2tfc3VwcG9ydGVkX2Z3KHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCi0JCQkJICAgICAgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKIHVuc2lnbmVkIGludCBiZV9jbWRfZ2V0X2luaXRuYW1lKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CiAKIHZvaWQgZnJlZV9tY2Nfd3JiKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsIHVuc2lnbmVkIGludCB0YWcpOwogCi1pbnQgYmVfY21kX21vZGlmeV9lcV9kZWxheShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHN0cnVjdCBiZV9zZXRfZXFkICosCitpbnQgYmVpc2NzaV9tb2RpZnlfZXFfZGVsYXkoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBzdHJ1Y3QgYmVfc2V0X2VxZCAqLAogCQkJICAgIGludCBudW0pOwogaW50IGJlaXNjc2lfbWNjcV9jb21wbF93YWl0KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKLQkJCSAgICB1aW50MzJfdCB0YWcsIHN0cnVjdCBiZV9tY2Nfd3JiICoqd3JiLAorCQkJICAgIHVuc2lnbmVkIGludCB0YWcsCisJCQkgICAgc3RydWN0IGJlX21jY193cmIgKip3cmIsCiAJCQkgICAgc3RydWN0IGJlX2RtYV9tZW0gKm1ieF9jbWRfbWVtKTsKLS8qSVNDU0kgRnVuY3R1aW9ucyAqLwotaW50IGJlX2NtZF9md19pbml0aWFsaXplKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwpOwotaW50IGJlX2NtZF9md191bmluaXQoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCk7Ci0KK2ludCBfX2JlaXNjc2lfbWNjX2NvbXBsX3N0YXR1cyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHRhZywKKwkJCSAgICAgICBzdHJ1Y3QgYmVfbWNjX3dyYiAqKndyYiwKKwkJCSAgICAgICBzdHJ1Y3QgYmVfZG1hX21lbSAqbWJ4X2NtZF9tZW0pOwogc3RydWN0IGJlX21jY193cmIgKndyYl9mcm9tX21ib3goc3RydWN0IGJlX2RtYV9tZW0gKm1ib3hfbWVtKTsKLWludCBiZV9tY2NfY29tcGxfcG9sbChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHVuc2lnbmVkIGludCB0YWcpOwogdm9pZCBiZV9tY2Nfbm90aWZ5KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdW5zaWduZWQgaW50IHRhZyk7CiBzdHJ1Y3QgYmVfbWNjX3dyYiAqYWxsb2NfbWNjX3dyYihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCiAJCQkJIHVuc2lnbmVkIGludCAqcmVmX3RhZyk7CkBAIC03NDksOSArODEzLDYgQEAKIGludCBiZWlzY3NpX3Byb2Nlc3NfbWNjX2NvbXBsKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCiAJCQkgICAgICBzdHJ1Y3QgYmVfbWNjX2NvbXBsICpjb21wbCk7CiAKLQotaW50IGJlX21ib3hfbm90aWZ5KHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwpOwotCiBpbnQgYmVfY21kX2NyZWF0ZV9kZWZhdWx0X3BkdV9xdWV1ZShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAogCQkJCSAgICBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3EsCiAJCQkJICAgIHN0cnVjdCBiZV9xdWV1ZV9pbmZvICpkcSwgaW50IGxlbmd0aCwKQEAgLTc2Nyw4ICs4MjgsNiBAQAogCQkJCXN0cnVjdCBiZV9kbWFfbWVtICpxX21lbSwgdTMyIHBhZ2Vfb2Zmc2V0LAogCQkJCXUzMiBudW1fcGFnZXMpOwogCi1pbnQgYmVpc2NzaV9jbWRfcmVzZXRfZnVuY3Rpb24oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKLQogaW50IGJlX2NtZF93cmJxX2NyZWF0ZShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLCBzdHJ1Y3QgYmVfZG1hX21lbSAqcV9tZW0sCiAJCSAgICAgICBzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqd3JicSwKIAkJICAgICAgIHN0cnVjdCBod2lfd3JiX2NvbnRleHQgKnB3cmJfY29udGV4dCwKQEAgLTc3Nyw2ICs4MzYsMTUgQEAKIC8qIENvbmZpZ3VyYXRpb24gRnVuY3Rpb25zICovCiBpbnQgYmVfY21kX3NldF92bGFuKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdWludDE2X3Qgdmxhbl90YWcpOwogCitpbnQgYmVpc2NzaV9jaGVja19zdXBwb3J0ZWRfZncoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKKwkJCSAgICAgICBzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpOworCitpbnQgYmVpc2NzaV9nZXRfZndfY29uZmlnKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsIHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CisKK2ludCBiZWlzY3NpX2dldF9wb3J0X25hbWUoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKKworaW50IGJlaXNjc2lfc2V0X3Vlcl9mZWF0dXJlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CisKIHN0cnVjdCBiZV9kZWZhdWx0X3BkdV9jb250ZXh0IHsKIAl1MzIgZHdbNF07CiB9IF9fcGFja2VkOwpAQCAtOTk5LDcgKzEwNjcsMTYgQEAKIAl1MTYgY2h1dGU7CiAJdTggaGRyX3JpbmdfaWQ7CiAJdTggZGF0YV9yaW5nX2lkOworfSBfX3BhY2tlZDsKIAorc3RydWN0IGlzY3NpX2NsZWFudXBfcmVxX3YxIHsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOworCXUxNiBjaHV0ZTsKKwl1MTYgcnN2ZDE7CisJdTE2IGhkcl9yaW5nX2lkOworCXUxNiByc3ZkMjsKKwl1MTYgZGF0YV9yaW5nX2lkOworCXUxNiByc3ZkMzsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBlcV9kZWxheSB7CkBAIC0xMzY4LDE0ICsxNDQ1LDkgQEAKIAkJCQkJCSAqIHRoZSBjeG4KIAkJCQkJCSAqLwogCi1pbnQgYmVpc2NzaV9wY2lfc29mdF9yZXNldChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpOwotaW50IGJlX2Noa19yZXNldF9jb21wbGV0ZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpOwotCiB2b2lkIGJlX3dyYl9oZHJfcHJlcGFyZShzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiLCBpbnQgcGF5bG9hZF9sZW4sCiAJCQlib29sIGVtYmVkZGVkLCB1OCBzZ2VfY250KTsKIAogdm9pZCBiZV9jbWRfaGRyX3ByZXBhcmUoc3RydWN0IGJlX2NtZF9yZXFfaGRyICpyZXFfaGRyLAogCQkJdTggc3Vic3lzdGVtLCB1OCBvcGNvZGUsIGludCBjbWRfbGVuKTsKLQotdm9pZCBiZWlzY3NpX2ZhaWxfc2Vzc2lvbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKTsKICNlbmRpZiAvKiAhQkVJU0NTSV9DTURTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9pc2NzaS5jIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKaW5kZXggMDlmODlhMy4uYmEyNTgyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmMKQEAgLTEsNSArMSw1IEBACiAvKioKLSAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMTUgRW11bGV4CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDE2IEJyb2FkY29tCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTcsMTAgKzcsMTAgQEAKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgVGhlIGZ1bGwgR05VIEdlbmVyYWwKICAqIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIGNhbGxlZCBDT1BZSU5HLgogICoKLSAqIFdyaXR0ZW4gYnk6IEpheWFtb2hhbiBLYWxsaWNrYWwgKGpheWFtb2hhbi5rYWxsaWNrYWxAYXZhZ290ZWNoLmNvbSkKKyAqIFdyaXR0ZW4gYnk6IEpheWFtb2hhbiBLYWxsaWNrYWwgKGpheWFtb2hhbi5rYWxsaWNrYWxAYnJvYWRjb20uY29tKQogICoKICAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiBsaW51eC1kcml2ZXJzQGF2YWdvdGVjaC5jb20KKyAqIGxpbnV4LWRyaXZlcnNAYnJvYWRjb20uY29tCiAgKgogICogRW11bGV4CiAgKiAzMzMzIFN1c2FuIFN0cmVldApAQCAtNTIsMjIgKzUyLDIwIEBACiAKIAogCWlmICghZXApIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiYmVpc2NzaV9zZXNzaW9uX2NyZWF0ZTogaW52YWxpZCBlcFxuIik7CisJCXByX2VycigiYmVpc2NzaV9zZXNzaW9uX2NyZWF0ZTogaW52YWxpZCBlcFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAliZWlzY3NpX2VwID0gZXAtPmRkX2RhdGE7CiAJcGhiYSA9IGJlaXNjc2lfZXAtPnBoYmE7CiAKLQlpZiAocGhiYS0+c3RhdGUgJiBCRV9BREFQVEVSX1BDSV9FUlIpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQlNfJWQgOiBQQ0lfRVJST1IgUmVjb3ZlcnlcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9IGVsc2UgeworCWlmICghYmVpc2NzaV9oYmFfaXNfb25saW5lKHBoYmEpKSB7CiAJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJICAgICJCU18lZCA6IEluIGJlaXNjc2lfc2Vzc2lvbl9jcmVhdGVcbiIpOworCQkJICAgICJCU18lZCA6IEhCQSBpbiBlcnJvciAweCVseFxuIiwgcGhiYS0+c3RhdGUpOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sIEJFSVNDU0lfTE9HX0NPTkZJRywKKwkJICAgICJCU18lZCA6IEluIGJlaXNjc2lfc2Vzc2lvbl9jcmVhdGVcbiIpOwogCWlmIChjbWRzX21heCA+IGJlaXNjc2lfZXAtPnBoYmEtPnBhcmFtcy53cmJzX3Blcl9jeG4pIHsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0NPTkZJRywKIAkJCSAgICAiQlNfJWQgOiBDYW5ub3QgaGFuZGxlICVkIGNtZHMuIgpAQCAtMTIwLDYgKzExOCwxNiBAQAogfQogCiAvKioKKyAqIGJlaXNjc2lfc2Vzc2lvbl9mYWlsKCk6IENsb3Npbmcgc2Vzc2lvbiB3aXRoIGFwcHJvcHJpYXRlIGVycm9yCisgKiBAY2xzX3Nlc3Npb246IHB0ciB0byBzZXNzaW9uCisgKiovCit2b2lkIGJlaXNjc2lfc2Vzc2lvbl9mYWlsKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pCit7CisJaXNjc2lfc2Vzc2lvbl9mYWlsdXJlKGNsc19zZXNzaW9uLT5kZF9kYXRhLCBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOworfQorCisKKy8qKgogICogYmVpc2NzaV9jb25uX2NyZWF0ZSAtIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpc2NzaSBjb25uZWN0aW9uCiAgKiBAY2xzX3Nlc3Npb246IHB0ciB0byBpc2NzaV9jbHNfc2Vzc2lvbgogICogQGNpZDogaXNjc2kgY2lkCkBAIC0yMzcsNyArMjQ1LDcgQEAKIAlyZXR1cm4gYmVpc2NzaV9iaW5kY29ubl9jaWQocGhiYSwgYmVpc2NzaV9jb25uLCBiZWlzY3NpX2VwLT5lcF9jaWQpOwogfQogCi1zdGF0aWMgaW50IGJlaXNjc2lfY3JlYXRlX2lwdjRfaWZhY2Uoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQorc3RhdGljIGludCBiZWlzY3NpX2lmYWNlX2NyZWF0ZV9pcHY0KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKIAlpZiAocGhiYS0+aXB2NF9pZmFjZSkKIAkJcmV0dXJuIDA7CkBAIC0yNTYsNyArMjY0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBiZWlzY3NpX2NyZWF0ZV9pcHY2X2lmYWNlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3N0YXRpYyBpbnQgYmVpc2NzaV9pZmFjZV9jcmVhdGVfaXB2NihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCiB7CiAJaWYgKHBoYmEtPmlwdjZfaWZhY2UpCiAJCXJldHVybiAwOwpAQCAtMjc1LDc5ICsyODMsMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBiZWlzY3NpX2NyZWF0ZV9kZWZfaWZhY2VzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3ZvaWQgYmVpc2NzaV9pZmFjZV9jcmVhdGVfZGVmYXVsdChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCiB7CiAJc3RydWN0IGJlX2NtZF9nZXRfaWZfaW5mb19yZXNwICppZl9pbmZvOwogCi0JaWYgKCFtZ210X2dldF9pZl9pbmZvKHBoYmEsIEJFMl9JUFY0LCAmaWZfaW5mbykpIHsKLQkJYmVpc2NzaV9jcmVhdGVfaXB2NF9pZmFjZShwaGJhKTsKKwlpZiAoIWJlaXNjc2lfaWZfZ2V0X2luZm8ocGhiYSwgQkVJU0NTSV9JUF9UWVBFX1Y0LCAmaWZfaW5mbykpIHsKKwkJYmVpc2NzaV9pZmFjZV9jcmVhdGVfaXB2NChwaGJhKTsKIAkJa2ZyZWUoaWZfaW5mbyk7CiAJfQogCi0JaWYgKCFtZ210X2dldF9pZl9pbmZvKHBoYmEsIEJFMl9JUFY2LCAmaWZfaW5mbykpIHsKLQkJYmVpc2NzaV9jcmVhdGVfaXB2Nl9pZmFjZShwaGJhKTsKKwlpZiAoIWJlaXNjc2lfaWZfZ2V0X2luZm8ocGhiYSwgQkVJU0NTSV9JUF9UWVBFX1Y2LCAmaWZfaW5mbykpIHsKKwkJYmVpc2NzaV9pZmFjZV9jcmVhdGVfaXB2NihwaGJhKTsKIAkJa2ZyZWUoaWZfaW5mbyk7CiAJfQogfQogCi12b2lkIGJlaXNjc2lfZGVzdHJveV9kZWZfaWZhY2VzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3ZvaWQgYmVpc2NzaV9pZmFjZV9kZXN0cm95X2RlZmF1bHQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQogewotCWlmIChwaGJhLT5pcHY2X2lmYWNlKQorCWlmIChwaGJhLT5pcHY2X2lmYWNlKSB7CiAJCWlzY3NpX2Rlc3Ryb3lfaWZhY2UocGhiYS0+aXB2Nl9pZmFjZSk7Ci0JaWYgKHBoYmEtPmlwdjRfaWZhY2UpCisJCXBoYmEtPmlwdjZfaWZhY2UgPSBOVUxMOworCX0KKwlpZiAocGhiYS0+aXB2NF9pZmFjZSkgewogCQlpc2NzaV9kZXN0cm95X2lmYWNlKHBoYmEtPmlwdjRfaWZhY2UpOwotfQotCi1zdGF0aWMgaW50Ci1iZWlzY3NpX3NldF9zdGF0aWNfaXAoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCi0JCXN0cnVjdCBpc2NzaV9pZmFjZV9wYXJhbV9pbmZvICppZmFjZV9wYXJhbSwKLQkJdm9pZCAqZGF0YSwgdWludDMyX3QgZHRfbGVuKQotewotCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7Ci0Jc3RydWN0IGlzY3NpX2lmYWNlX3BhcmFtX2luZm8gKmlmYWNlX2lwID0gTlVMTDsKLQlzdHJ1Y3QgaXNjc2lfaWZhY2VfcGFyYW1faW5mbyAqaWZhY2Vfc3VibmV0ID0gTlVMTDsKLQlzdHJ1Y3QgbmxhdHRyICpubGE7Ci0JaW50IHJldDsKLQotCi0Jc3dpdGNoIChpZmFjZV9wYXJhbS0+cGFyYW0pIHsKLQljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X0JPT1RQUk9UTzoKLQkJbmxhID0gbmxhX2ZpbmQoZGF0YSwgZHRfbGVuLCBJU0NTSV9ORVRfUEFSQU1fSVBWNF9BRERSKTsKLQkJaWYgKG5sYSkKLQkJCWlmYWNlX2lwID0gbmxhX2RhdGEobmxhKTsKLQotCQlubGEgPSBubGFfZmluZChkYXRhLCBkdF9sZW4sIElTQ1NJX05FVF9QQVJBTV9JUFY0X1NVQk5FVCk7Ci0JCWlmIChubGEpCi0JCQlpZmFjZV9zdWJuZXQgPSBubGFfZGF0YShubGEpOwotCQlicmVhazsKLQljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X0FERFI6Ci0JCWlmYWNlX2lwID0gaWZhY2VfcGFyYW07Ci0JCW5sYSA9IG5sYV9maW5kKGRhdGEsIGR0X2xlbiwgSVNDU0lfTkVUX1BBUkFNX0lQVjRfU1VCTkVUKTsKLQkJaWYgKG5sYSkKLQkJCWlmYWNlX3N1Ym5ldCA9IG5sYV9kYXRhKG5sYSk7Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjRfU1VCTkVUOgotCQlpZmFjZV9zdWJuZXQgPSBpZmFjZV9wYXJhbTsKLQkJbmxhID0gbmxhX2ZpbmQoZGF0YSwgZHRfbGVuLCBJU0NTSV9ORVRfUEFSQU1fSVBWNF9BRERSKTsKLQkJaWYgKG5sYSkKLQkJCWlmYWNlX2lwID0gbmxhX2RhdGEobmxhKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQlNfJWQgOiBVbnN1cHBvcnRlZCBwYXJhbSAlZFxuIiwKLQkJCSAgICBpZmFjZV9wYXJhbS0+cGFyYW0pOworCQlwaGJhLT5pcHY0X2lmYWNlID0gTlVMTDsKIAl9Ci0KLQlpZiAoIWlmYWNlX2lwIHx8ICFpZmFjZV9zdWJuZXQpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQlNfJWQgOiBJUCBhbmQgU3VibmV0IE1hc2sgcmVxdWlyZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXQgPSBtZ210X3NldF9pcChwaGJhLCBpZmFjZV9pcCwgaWZhY2Vfc3VibmV0LAotCQkJSVNDU0lfQk9PVFBST1RPX1NUQVRJQyk7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTM2MywxMzcgKzMyMywxNDEgQEAKICAqCUZhaWx1cmU6IE5vbi1aZXJvIFZhbHVlCiAgKiovCiBzdGF0aWMgaW50Ci1iZWlzY3NpX3NldF92bGFuX3RhZyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKLQkJICAgICAgc3RydWN0IGlzY3NpX2lmYWNlX3BhcmFtX2luZm8gKmlmYWNlX3BhcmFtKQorYmVpc2NzaV9pZmFjZV9jb25maWdfdmxhbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCSAgc3RydWN0IGlzY3NpX2lmYWNlX3BhcmFtX2luZm8gKmlmYWNlX3BhcmFtKQogewogCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7Ci0JaW50IHJldDsKLQotCS8qIEdldCB0aGUgSW50ZXJmYWNlIEhhbmRsZSAqLwotCXJldCA9IG1nbXRfZ2V0X2FsbF9pZl9pZChwaGJhKTsKLQlpZiAocmV0KSB7Ci0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19DT05GSUcsCi0JCQkgICAgIkJTXyVkIDogR2V0dGluZyBJbnRlcmZhY2UgSGFuZGxlIEZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWludCByZXQgPSAtRVBFUk07CiAKIAlzd2l0Y2ggKGlmYWNlX3BhcmFtLT5wYXJhbSkgewogCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fRU5BQkxFRDoKKwkJcmV0ID0gMDsKIAkJaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSAhPSBJU0NTSV9WTEFOX0VOQUJMRSkKLQkJCXJldCA9IG1nbXRfc2V0X3ZsYW4ocGhiYSwgQkVJU0NTSV9WTEFOX0RJU0FCTEUpOworCQkJcmV0ID0gYmVpc2NzaV9pZl9zZXRfdmxhbihwaGJhLCBCRUlTQ1NJX1ZMQU5fRElTQUJMRSk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fVEFHOgotCQlyZXQgPSBtZ210X3NldF92bGFuKHBoYmEsCi0JCQkJICAgICooKHVpbnQxNl90ICopaWZhY2VfcGFyYW0tPnZhbHVlKSk7CisJCXJldCA9IGJlaXNjc2lfaWZfc2V0X3ZsYW4ocGhiYSwKKwkJCQkJICAqKCh1aW50MTZfdCAqKWlmYWNlX3BhcmFtLT52YWx1ZSkpOwogCQlicmVhazsKLQlkZWZhdWx0OgotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQlNfJWQgOiBVbmtub3duIFBhcmFtIFR5cGUgOiAlZFxuIiwKLQkJCSAgICBpZmFjZV9wYXJhbS0+cGFyYW0pOwotCQlyZXR1cm4gLUVOT1NZUzsKIAl9CiAJcmV0dXJuIHJldDsKIH0KIAogCiBzdGF0aWMgaW50Ci1iZWlzY3NpX3NldF9pcHY0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAotCQlzdHJ1Y3QgaXNjc2lfaWZhY2VfcGFyYW1faW5mbyAqaWZhY2VfcGFyYW0sCi0JCXZvaWQgKmRhdGEsIHVpbnQzMl90IGR0X2xlbikKK2JlaXNjc2lfaWZhY2VfY29uZmlnX2lwdjQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCisJCQkgIHN0cnVjdCBpc2NzaV9pZmFjZV9wYXJhbV9pbmZvICppbmZvLAorCQkJICB2b2lkICpkYXRhLCB1aW50MzJfdCBkdF9sZW4pCiB7CiAJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKLQlpbnQgcmV0ID0gMDsKKwl1OCAqaXAgPSBOVUxMLCAqc3VibmV0ID0gTlVMTCwgKmd3OworCXN0cnVjdCBubGF0dHIgKm5sYTsKKwlpbnQgcmV0ID0gLUVQRVJNOwogCiAJLyogQ2hlY2sgdGhlIHBhcmFtICovCi0Jc3dpdGNoIChpZmFjZV9wYXJhbS0+cGFyYW0pIHsKKwlzd2l0Y2ggKGluZm8tPnBhcmFtKSB7CisJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSUZBQ0VfRU5BQkxFOgorCQlpZiAoaW5mby0+dmFsdWVbMF0gPT0gSVNDU0lfSUZBQ0VfRU5BQkxFKQorCQkJcmV0ID0gYmVpc2NzaV9pZmFjZV9jcmVhdGVfaXB2NChwaGJhKTsKKwkJZWxzZSB7CisJCQlpc2NzaV9kZXN0cm95X2lmYWNlKHBoYmEtPmlwdjRfaWZhY2UpOworCQkJcGhiYS0+aXB2NF9pZmFjZSA9IE5VTEw7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBJU0NTSV9ORVRfUEFSQU1fSVBWNF9HVzoKLQkJcmV0ID0gbWdtdF9zZXRfZ2F0ZXdheShwaGJhLCBpZmFjZV9wYXJhbSk7CisJCWd3ID0gaW5mby0+dmFsdWU7CisJCXJldCA9IGJlaXNjc2lfaWZfc2V0X2d3KHBoYmEsIEJFSVNDU0lfSVBfVFlQRV9WNCwgZ3cpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X0JPT1RQUk9UTzoKLQkJaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSA9PSBJU0NTSV9CT09UUFJPVE9fREhDUCkKLQkJCXJldCA9IG1nbXRfc2V0X2lwKHBoYmEsIGlmYWNlX3BhcmFtLAotCQkJCQlOVUxMLCBJU0NTSV9CT09UUFJPVE9fREhDUCk7Ci0JCWVsc2UgaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSA9PSBJU0NTSV9CT09UUFJPVE9fU1RBVElDKQotCQkJcmV0ID0gYmVpc2NzaV9zZXRfc3RhdGljX2lwKHNob3N0LCBpZmFjZV9wYXJhbSwKLQkJCQkJCSAgICBkYXRhLCBkdF9sZW4pOworCQlpZiAoaW5mby0+dmFsdWVbMF0gPT0gSVNDU0lfQk9PVFBST1RPX0RIQ1ApCisJCQlyZXQgPSBiZWlzY3NpX2lmX2VuX2RoY3AocGhiYSwgQkVJU0NTSV9JUF9UWVBFX1Y0KTsKKwkJZWxzZSBpZiAoaW5mby0+dmFsdWVbMF0gPT0gSVNDU0lfQk9PVFBST1RPX1NUQVRJQykKKwkJCS8qIHJlbGVhc2UgREhDUCBJUCBhZGRyZXNzICovCisJCQlyZXQgPSBiZWlzY3NpX2lmX2VuX3N0YXRpYyhwaGJhLCBCRUlTQ1NJX0lQX1RZUEVfVjQsCisJCQkJCQkgICBOVUxMLCBOVUxMKTsKIAkJZWxzZQogCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0NPTkZJRywKIAkJCQkgICAgIkJTXyVkIDogSW52YWxpZCBCT09UUFJPVE86ICVkXG4iLAotCQkJCSAgICBpZmFjZV9wYXJhbS0+dmFsdWVbMF0pOworCQkJCSAgICBpbmZvLT52YWx1ZVswXSk7CiAJCWJyZWFrOwotCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lGQUNFX0VOQUJMRToKLQkJaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSA9PSBJU0NTSV9JRkFDRV9FTkFCTEUpCi0JCQlyZXQgPSBiZWlzY3NpX2NyZWF0ZV9pcHY0X2lmYWNlKHBoYmEpOwotCQllbHNlCi0JCQlpc2NzaV9kZXN0cm95X2lmYWNlKHBoYmEtPmlwdjRfaWZhY2UpOworCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjRfQUREUjoKKwkJaXAgPSBpbmZvLT52YWx1ZTsKKwkJbmxhID0gbmxhX2ZpbmQoZGF0YSwgZHRfbGVuLCBJU0NTSV9ORVRfUEFSQU1fSVBWNF9TVUJORVQpOworCQlpZiAobmxhKSB7CisJCQlpbmZvID0gbmxhX2RhdGEobmxhKTsKKwkJCXN1Ym5ldCA9IGluZm8tPnZhbHVlOworCQl9CisJCXJldCA9IGJlaXNjc2lfaWZfZW5fc3RhdGljKHBoYmEsIEJFSVNDU0lfSVBfVFlQRV9WNCwKKwkJCQkJICAgaXAsIHN1Ym5ldCk7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjRfU1VCTkVUOgotCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjRfQUREUjoKLQkJcmV0ID0gYmVpc2NzaV9zZXRfc3RhdGljX2lwKHNob3N0LCBpZmFjZV9wYXJhbSwKLQkJCQkJICAgIGRhdGEsIGR0X2xlbik7CisJCS8qCisJCSAqIE9QQ09ERV9DT01NT05fSVNDU0lfTlRXS19NT0RJRllfSVBfQUREUiBpb2N0bCBuZWVkcyBJUAorCQkgKiBhbmQgc3VibmV0IGJvdGguIEZpbmQgSVAgdG8gYmUgYXBwbGllZCBmb3IgdGhpcyBzdWJuZXQuCisJCSAqLworCQlzdWJuZXQgPSBpbmZvLT52YWx1ZTsKKwkJbmxhID0gbmxhX2ZpbmQoZGF0YSwgZHRfbGVuLCBJU0NTSV9ORVRfUEFSQU1fSVBWNF9BRERSKTsKKwkJaWYgKG5sYSkgeworCQkJaW5mbyA9IG5sYV9kYXRhKG5sYSk7CisJCQlpcCA9IGluZm8tPnZhbHVlOworCQl9CisJCXJldCA9IGJlaXNjc2lfaWZfZW5fc3RhdGljKHBoYmEsIEJFSVNDU0lfSVBfVFlQRV9WNCwKKwkJCQkJICAgaXAsIHN1Ym5ldCk7CiAJCWJyZWFrOwotCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fRU5BQkxFRDoKLQljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX1RBRzoKLQkJcmV0ID0gYmVpc2NzaV9zZXRfdmxhbl90YWcoc2hvc3QsIGlmYWNlX3BhcmFtKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQlNfJWQgOiBQYXJhbSAlZCBub3Qgc3VwcG9ydGVkXG4iLAotCQkJICAgIGlmYWNlX3BhcmFtLT5wYXJhbSk7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludAotYmVpc2NzaV9zZXRfaXB2NihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKLQkJc3RydWN0IGlzY3NpX2lmYWNlX3BhcmFtX2luZm8gKmlmYWNlX3BhcmFtLAotCQl2b2lkICpkYXRhLCB1aW50MzJfdCBkdF9sZW4pCitiZWlzY3NpX2lmYWNlX2NvbmZpZ19pcHY2KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LAorCQkJICBzdHJ1Y3QgaXNjc2lfaWZhY2VfcGFyYW1faW5mbyAqaWZhY2VfcGFyYW0sCisJCQkgIHZvaWQgKmRhdGEsIHVpbnQzMl90IGR0X2xlbikKIHsKIAlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOwotCWludCByZXQgPSAwOworCWludCByZXQgPSAtRVBFUk07CiAKIAlzd2l0Y2ggKGlmYWNlX3BhcmFtLT5wYXJhbSkgewogCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lGQUNFX0VOQUJMRToKIAkJaWYgKGlmYWNlX3BhcmFtLT52YWx1ZVswXSA9PSBJU0NTSV9JRkFDRV9FTkFCTEUpCi0JCQlyZXQgPSBiZWlzY3NpX2NyZWF0ZV9pcHY2X2lmYWNlKHBoYmEpOworCQkJcmV0ID0gYmVpc2NzaV9pZmFjZV9jcmVhdGVfaXB2NihwaGJhKTsKIAkJZWxzZSB7CiAJCQlpc2NzaV9kZXN0cm95X2lmYWNlKHBoYmEtPmlwdjZfaWZhY2UpOwotCQkJcmV0ID0gMDsKKwkJCXBoYmEtPmlwdjZfaWZhY2UgPSBOVUxMOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lQVjZfQUREUjoKLQkJcmV0ID0gbWdtdF9zZXRfaXAocGhiYSwgaWZhY2VfcGFyYW0sIE5VTEwsCi0JCQkJICBJU0NTSV9CT09UUFJPVE9fU1RBVElDKTsKKwkJcmV0ID0gYmVpc2NzaV9pZl9lbl9zdGF0aWMocGhiYSwgQkVJU0NTSV9JUF9UWVBFX1Y2LAorCQkJCQkgICBpZmFjZV9wYXJhbS0+dmFsdWUsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX0VOQUJMRUQ6Ci0JY2FzZSBJU0NTSV9ORVRfUEFSQU1fVkxBTl9UQUc6Ci0JCXJldCA9IGJlaXNjc2lfc2V0X3ZsYW5fdGFnKHNob3N0LCBpZmFjZV9wYXJhbSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19DT05GSUcsCi0JCQkgICAgIkJTXyVkIDogUGFyYW0gJWQgbm90IHN1cHBvcnRlZFxuIiwKLQkJCSAgICBpZmFjZV9wYXJhbS0+cGFyYW0pOwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLWludCBiZTJpc2NzaV9pZmFjZV9zZXRfcGFyYW0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCi0JCXZvaWQgKmRhdGEsIHVpbnQzMl90IGR0X2xlbikKK2ludCBiZWlzY3NpX2lmYWNlX3NldF9wYXJhbShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwkJCSAgICB2b2lkICpkYXRhLCB1aW50MzJfdCBkdF9sZW4pCiB7CiAJc3RydWN0IGlzY3NpX2lmYWNlX3BhcmFtX2luZm8gKmlmYWNlX3BhcmFtID0gTlVMTDsKIAlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOwogCXN0cnVjdCBubGF0dHIgKmF0dHJpYjsKIAl1aW50MzJfdCBybV9sZW4gPSBkdF9sZW47Ci0JaW50IHJldCA9IDAgOworCWludCByZXQ7CiAKLQlpZiAocGhiYS0+c3RhdGUgJiBCRV9BREFQVEVSX1BDSV9FUlIpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQlNfJWQgOiBJbiBQQ0lfRVJST1IgUmVjb3ZlcnlcbiIpOworCWlmICghYmVpc2NzaV9oYmFfaXNfb25saW5lKHBoYmEpKSB7CisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywgQkVJU0NTSV9MT0dfQ09ORklHLAorCQkJICAgICJCU18lZCA6IEhCQSBpbiBlcnJvciAweCVseFxuIiwgcGhiYS0+c3RhdGUpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAorCS8qIHVwZGF0ZSBpbnRlcmZhY2VfaGFuZGxlICovCisJcmV0ID0gYmVpc2NzaV9pZl9nZXRfaGFuZGxlKHBoYmEpOworCWlmIChyZXQpIHsKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0NPTkZJRywKKwkJCSAgICAiQlNfJWQgOiBHZXR0aW5nIEludGVyZmFjZSBIYW5kbGUgRmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlubGFfZm9yX2VhY2hfYXR0cihhdHRyaWIsIGRhdGEsIGR0X2xlbiwgcm1fbGVuKSB7CiAJCWlmYWNlX3BhcmFtID0gbmxhX2RhdGEoYXR0cmliKTsKIApAQCAtNTEyLDQwICs0NzYsNTggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJc3dpdGNoIChpZmFjZV9wYXJhbS0+aWZhY2VfdHlwZSkgewotCQljYXNlIElTQ1NJX0lGQUNFX1RZUEVfSVBWNDoKLQkJCXJldCA9IGJlaXNjc2lfc2V0X2lwdjQoc2hvc3QsIGlmYWNlX3BhcmFtLAotCQkJCQkgICAgICAgZGF0YSwgZHRfbGVuKTsKLQkJCWJyZWFrOwotCQljYXNlIElTQ1NJX0lGQUNFX1RZUEVfSVBWNjoKLQkJCXJldCA9IGJlaXNjc2lfc2V0X2lwdjYoc2hvc3QsIGlmYWNlX3BhcmFtLAotCQkJCQkgICAgICAgZGF0YSwgZHRfbGVuKTsKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLCBCRUlTQ1NJX0xPR19DT05GSUcsCisJCQkgICAgIkJTXyVkIDogJXMuMCBzZXQgcGFyYW0gJWQiLAorCQkJICAgIChpZmFjZV9wYXJhbS0+aWZhY2VfdHlwZSA9PSBJU0NTSV9JRkFDRV9UWVBFX0lQVjQpID8KKwkJCSAgICAiaXB2NCIgOiAiaXB2NiIsIGlmYWNlX3BhcmFtLT5wYXJhbSk7CisKKwkJcmV0ID0gLUVQRVJNOworCQlzd2l0Y2ggKGlmYWNlX3BhcmFtLT5wYXJhbSkgeworCQljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX0VOQUJMRUQ6CisJCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fVEFHOgorCQkJcmV0ID0gYmVpc2NzaV9pZmFjZV9jb25maWdfdmxhbihzaG9zdCwgaWZhY2VfcGFyYW0pOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJCSAgICAiQlNfJWQgOiBJbnZhbGlkIGlmYWNlIHR5cGUgOiVkIHBhc3NlZFxuIiwKLQkJCQkgICAgaWZhY2VfcGFyYW0tPmlmYWNlX3R5cGUpOwotCQkJYnJlYWs7CisJCQlzd2l0Y2ggKGlmYWNlX3BhcmFtLT5pZmFjZV90eXBlKSB7CisJCQljYXNlIElTQ1NJX0lGQUNFX1RZUEVfSVBWNDoKKwkJCQlyZXQgPSBiZWlzY3NpX2lmYWNlX2NvbmZpZ19pcHY0KHNob3N0LAorCQkJCQkJCQlpZmFjZV9wYXJhbSwKKwkJCQkJCQkJZGF0YSwgZHRfbGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVNDU0lfSUZBQ0VfVFlQRV9JUFY2OgorCQkJCXJldCA9IGJlaXNjc2lfaWZhY2VfY29uZmlnX2lwdjYoc2hvc3QsCisJCQkJCQkJCWlmYWNlX3BhcmFtLAorCQkJCQkJCQlkYXRhLCBkdF9sZW4pOworCQkJCWJyZWFrOworCQkJfQogCQl9CiAKKwkJaWYgKHJldCA9PSAtRVBFUk0pIHsKKwkJCV9fYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCisJCQkJICAgICAgIkJTXyVkIDogJXMuMCBzZXQgcGFyYW0gJWQgbm90IHBlcm1pdHRlZCIsCisJCQkJICAgICAgKGlmYWNlX3BhcmFtLT5pZmFjZV90eXBlID09CisJCQkJICAgICAgIElTQ1NJX0lGQUNFX1RZUEVfSVBWNCkgPyAiaXB2NCIgOiAiaXB2NiIsCisJCQkJICAgICAgaWZhY2VfcGFyYW0tPnBhcmFtKTsKKwkJCXJldCA9IDA7CisJCX0KIAkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGJlMmlzY3NpX2dldF9pZl9wYXJhbShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCXN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2UsIGludCBwYXJhbSwKLQkJY2hhciAqYnVmKQorc3RhdGljIGludCBfX2JlaXNjc2lfaWZhY2VfZ2V0X3BhcmFtKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKKwkJCQkgICAgIHN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2UsCisJCQkJICAgICBpbnQgcGFyYW0sIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYmVfY21kX2dldF9pZl9pbmZvX3Jlc3AgKmlmX2luZm87Ci0JaW50IGxlbiwgaXBfdHlwZSA9IEJFMl9JUFY0OworCWludCBsZW4sIGlwX3R5cGUgPSBCRUlTQ1NJX0lQX1RZUEVfVjQ7CiAKIAlpZiAoaWZhY2UtPmlmYWNlX3R5cGUgPT0gSVNDU0lfSUZBQ0VfVFlQRV9JUFY2KQotCQlpcF90eXBlID0gQkUyX0lQVjY7CisJCWlwX3R5cGUgPSBCRUlTQ1NJX0lQX1RZUEVfVjY7CiAKLQlsZW4gPSBtZ210X2dldF9pZl9pbmZvKHBoYmEsIGlwX3R5cGUsICZpZl9pbmZvKTsKKwlsZW4gPSBiZWlzY3NpX2lmX2dldF9pbmZvKHBoYmEsIGlwX3R5cGUsICZpZl9pbmZvKTsKIAlpZiAobGVuKQogCQlyZXR1cm4gbGVuOwogCkBAIC01NjcsMjQgKzU0OSwyNCBAQAogCQlicmVhazsKIAljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX0VOQUJMRUQ6CiAJCWxlbiA9IHNwcmludGYoYnVmLCAiJXNcbiIsCi0JCQkgICAgIChpZl9pbmZvLT52bGFuX3ByaW9yaXR5ID09IEJFSVNDU0lfVkxBTl9ESVNBQkxFKQotCQkJICAgICA/ICJEaXNhYmxlZFxuIiA6ICJFbmFibGVkXG4iKTsKKwkJCSAgICAgIChpZl9pbmZvLT52bGFuX3ByaW9yaXR5ID09IEJFSVNDU0lfVkxBTl9ESVNBQkxFKSA/CisJCQkgICAgICAiZGlzYWJsZSIgOiAiZW5hYmxlIik7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fSUQ6CiAJCWlmIChpZl9pbmZvLT52bGFuX3ByaW9yaXR5ID09IEJFSVNDU0lfVkxBTl9ESVNBQkxFKQogCQkJbGVuID0gLUVJTlZBTDsKIAkJZWxzZQogCQkJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwKLQkJCQkgICAgIChpZl9pbmZvLT52bGFuX3ByaW9yaXR5ICYKLQkJCQkgICAgIElTQ1NJX01BWF9WTEFOX0lEKSk7CisJCQkJICAgICAgKGlmX2luZm8tPnZsYW5fcHJpb3JpdHkgJgorCQkJCSAgICAgICBJU0NTSV9NQVhfVkxBTl9JRCkpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX05FVF9QQVJBTV9WTEFOX1BSSU9SSVRZOgogCQlpZiAoaWZfaW5mby0+dmxhbl9wcmlvcml0eSA9PSBCRUlTQ1NJX1ZMQU5fRElTQUJMRSkKIAkJCWxlbiA9IC1FSU5WQUw7CiAJCWVsc2UKIAkJCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCQkJICAgICAoKGlmX2luZm8tPnZsYW5fcHJpb3JpdHkgPj4gMTMpICYKLQkJCQkgICAgIElTQ1NJX01BWF9WTEFOX1BSSU9SSVRZKSk7CisJCQkJICAgICAgKChpZl9pbmZvLT52bGFuX3ByaW9yaXR5ID4+IDEzKSAmCisJCQkJICAgICAgIElTQ1NJX01BWF9WTEFOX1BSSU9SSVRZKSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVdBUk5fT04oMSk7CkBAIC01OTQsMTggKzU3NiwyMCBAQAogCXJldHVybiBsZW47CiB9CiAKLWludCBiZTJpc2NzaV9pZmFjZV9nZXRfcGFyYW0oc3RydWN0IGlzY3NpX2lmYWNlICppZmFjZSwKLQkJZW51bSBpc2NzaV9wYXJhbV90eXBlIHBhcmFtX3R5cGUsCi0JCWludCBwYXJhbSwgY2hhciAqYnVmKQoraW50IGJlaXNjc2lfaWZhY2VfZ2V0X3BhcmFtKHN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2UsCisJCQkgICAgZW51bSBpc2NzaV9wYXJhbV90eXBlIHBhcmFtX3R5cGUsCisJCQkgICAgaW50IHBhcmFtLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBpc2NzaV9pZmFjZV90b19zaG9zdChpZmFjZSk7CiAJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gaXNjc2lfaG9zdF9wcml2KHNob3N0KTsKIAlzdHJ1Y3QgYmVfY21kX2dldF9kZWZfZ2F0ZXdheV9yZXNwIGdhdGV3YXk7Ci0JaW50IGxlbiA9IC1FTk9TWVM7CisJaW50IGxlbiA9IC1FUEVSTTsKIAotCWlmIChwaGJhLT5zdGF0ZSAmIEJFX0FEQVBURVJfUENJX0VSUikgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJICAgICJCU18lZCA6IEluIFBDSV9FUlJPUiBSZWNvdmVyeVxuIik7CisJaWYgKHBhcmFtX3R5cGUgIT0gSVNDU0lfTkVUX1BBUkFNKQorCQlyZXR1cm4gMDsKKwlpZiAoIWJlaXNjc2lfaGJhX2lzX29ubGluZShwaGJhKSkgeworCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sIEJFSVNDU0lfTE9HX0NPTkZJRywKKwkJCSAgICAiQlNfJWQgOiBIQkEgaW4gZXJyb3IgMHglbHhcbiIsIHBoYmEtPnN0YXRlKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKQEAgLTYxNywxOSArNjAxLDIyIEBACiAJY2FzZSBJU0NTSV9ORVRfUEFSQU1fVkxBTl9FTkFCTEVEOgogCWNhc2UgSVNDU0lfTkVUX1BBUkFNX1ZMQU5fSUQ6CiAJY2FzZSBJU0NTSV9ORVRfUEFSQU1fVkxBTl9QUklPUklUWToKLQkJbGVuID0gYmUyaXNjc2lfZ2V0X2lmX3BhcmFtKHBoYmEsIGlmYWNlLCBwYXJhbSwgYnVmKTsKKwkJbGVuID0gX19iZWlzY3NpX2lmYWNlX2dldF9wYXJhbShwaGJhLCBpZmFjZSwgcGFyYW0sIGJ1Zik7CiAJCWJyZWFrOwogCWNhc2UgSVNDU0lfTkVUX1BBUkFNX0lGQUNFX0VOQUJMRToKLQkJbGVuID0gc3ByaW50ZihidWYsICJlbmFibGVkXG4iKTsKKwkJaWYgKGlmYWNlLT5pZmFjZV90eXBlID09IElTQ1NJX0lGQUNFX1RZUEVfSVBWNCkKKwkJCWxlbiA9IHNwcmludGYoYnVmLCAiJXNcbiIsCisJCQkJICAgICAgcGhiYS0+aXB2NF9pZmFjZSA/ICJlbmFibGUiIDogImRpc2FibGUiKTsKKwkJZWxzZSBpZiAoaWZhY2UtPmlmYWNlX3R5cGUgPT0gSVNDU0lfSUZBQ0VfVFlQRV9JUFY2KQorCQkJbGVuID0gc3ByaW50ZihidWYsICIlc1xuIiwKKwkJCQkgICAgICBwaGJhLT5pcHY2X2lmYWNlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX05FVF9QQVJBTV9JUFY0X0dXOgogCQltZW1zZXQoJmdhdGV3YXksIDAsIHNpemVvZihnYXRld2F5KSk7Ci0JCWxlbiA9IG1nbXRfZ2V0X2dhdGV3YXkocGhiYSwgQkUyX0lQVjQsICZnYXRld2F5KTsKKwkJbGVuID0gYmVpc2NzaV9pZl9nZXRfZ3cocGhiYSwgQkVJU0NTSV9JUF9UWVBFX1Y0LCAmZ2F0ZXdheSk7CiAJCWlmICghbGVuKQogCQkJbGVuID0gc3ByaW50ZihidWYsICIlcEk0XG4iLCAmZ2F0ZXdheS5pcF9hZGRyLmFkZHIpOwogCQlicmVhazsKLQlkZWZhdWx0OgotCQlsZW4gPSAtRU5PU1lTOwogCX0KIAogCXJldHVybiBsZW47CkBAIC02NDcsNyArNjM0LDcgQEAKIAkJCSAgIGVudW0gaXNjc2lfcGFyYW0gcGFyYW0sIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYmVpc2NzaV9lbmRwb2ludCAqYmVpc2NzaV9lcCA9IGVwLT5kZF9kYXRhOwotCWludCBsZW4gPSAwOworCWludCBsZW47CiAKIAliZWlzY3NpX2xvZyhiZWlzY3NpX2VwLT5waGJhLCBLRVJOX0lORk8sCiAJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcsCkBAIC02NTksMTMgKzY0NiwxMyBAQAogCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVodVxuIiwgYmVpc2NzaV9lcC0+ZHN0X3RjcHBvcnQpOwogCQlicmVhazsKIAljYXNlIElTQ1NJX1BBUkFNX0NPTk5fQUREUkVTUzoKLQkJaWYgKGJlaXNjc2lfZXAtPmlwX3R5cGUgPT0gQkUyX0lQVjQpCisJCWlmIChiZWlzY3NpX2VwLT5pcF90eXBlID09IEJFSVNDU0lfSVBfVFlQRV9WNCkKIAkJCWxlbiA9IHNwcmludGYoYnVmLCAiJXBJNFxuIiwgJmJlaXNjc2lfZXAtPmRzdF9hZGRyKTsKIAkJZWxzZQogCQkJbGVuID0gc3ByaW50ZihidWYsICIlcEk2XG4iLCAmYmVpc2NzaV9lcC0+ZHN0Nl9hZGRyKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FTk9TWVM7CisJCWxlbiA9IC1FUEVSTTsKIAl9CiAJcmV0dXJuIGxlbjsKIH0KQEAgLTc1OCw3ICs3NDUsNyBAQAogCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CiAJc3RydWN0IGlzY3NpX2Nsc19ob3N0ICppaG9zdCA9IHNob3N0LT5zaG9zdF9kYXRhOwogCi0JaWhvc3QtPnBvcnRfc3RhdGUgPSAocGhiYS0+c3RhdGUgJiBCRV9BREFQVEVSX0xJTktfVVApID8KKwlpaG9zdC0+cG9ydF9zdGF0ZSA9IHRlc3RfYml0KEJFSVNDU0lfSEJBX0xJTktfVVAsICZwaGJhLT5zdGF0ZSkgPwogCQlJU0NTSV9QT1JUX1NUQVRFX1VQIDogSVNDU0lfUE9SVF9TVEFURV9ET1dOOwogfQogCkBAIC04MTAsMTYgKzc5NywxMyBAQAogCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQotCWlmIChwaGJhLT5zdGF0ZSAmIEJFX0FEQVBURVJfUENJX0VSUikgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJICAgICJCU18lZCA6IEluIFBDSV9FUlJPUiBSZWNvdmVyeVxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfSBlbHNlIHsKKwlpZiAoIWJlaXNjc2lfaGJhX2lzX29ubGluZShwaGJhKSkgewogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQlNfJWQgOiBJbiBiZWlzY3NpX2dldF9ob3N0X3BhcmFtLCIKLQkJCSAgICAiIHBhcmFtID0gJWRcbiIsIHBhcmFtKTsKKwkJCSAgICAiQlNfJWQgOiBIQkEgaW4gZXJyb3IgMHglbHhcbiIsIHBoYmEtPnN0YXRlKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CisJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLCBCRUlTQ1NJX0xPR19DT05GSUcsCisJCSAgICAiQlNfJWQgOiBJbiBiZWlzY3NpX2dldF9ob3N0X3BhcmFtLCBwYXJhbSA9ICVkXG4iLCBwYXJhbSk7CiAKIAlzd2l0Y2ggKHBhcmFtKSB7CiAJY2FzZSBJU0NTSV9IT1NUX1BBUkFNX0hXQUREUkVTUzoKQEAgLTk2MSwxNSArOTQ1LDEzIEBACiAKIAlwaGJhID0gKChzdHJ1Y3QgYmVpc2NzaV9jb25uICopY29ubi0+ZGRfZGF0YSktPnBoYmE7CiAKLQlpZiAocGhiYS0+c3RhdGUgJiBCRV9BREFQVEVSX1BDSV9FUlIpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQlNfJWQgOiBJbiBQQ0lfRVJST1IgUmVjb3ZlcnlcbiIpOworCWlmICghYmVpc2NzaV9oYmFfaXNfb25saW5lKHBoYmEpKSB7CisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywgQkVJU0NTSV9MT0dfQ09ORklHLAorCQkJICAgICJCU18lZCA6IEhCQSBpbiBlcnJvciAweCVseFxuIiwgcGhiYS0+c3RhdGUpOwogCQlyZXR1cm4gLUVCVVNZOwotCX0gZWxzZSB7Ci0JCWJlaXNjc2lfbG9nKGJlaXNjc2lfY29ubi0+cGhiYSwgS0VSTl9JTkZPLAotCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQlNfJWQgOiBJbiBiZWlzY3NpX2Nvbm5fc3RhcnRcbiIpOwogCX0KKwliZWlzY3NpX2xvZyhiZWlzY3NpX2Nvbm4tPnBoYmEsIEtFUk5fSU5GTywgQkVJU0NTSV9MT0dfQ09ORklHLAorCQkgICAgIkJTXyVkIDogSW4gYmVpc2NzaV9jb25uX3N0YXJ0XG4iKTsKIAogCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IGJlaXNjc2lfb2ZmbG9hZF9wYXJhbXMpKTsKIAliZWlzY3NpX2VwID0gYmVpc2NzaV9jb25uLT5lcDsKQEAgLTExODYsMjggKzExNjgsMjAgQEAKIAlzdHJ1Y3QgaXNjc2lfZW5kcG9pbnQgKmVwOwogCWludCByZXQ7CiAKLQlpZiAoc2hvc3QpCi0JCXBoYmEgPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOwotCWVsc2UgeworCWlmICghc2hvc3QpIHsKIAkJcmV0ID0gLUVOWElPOwotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJiZWlzY3NpX2VwX2Nvbm5lY3Qgc2hvc3QgaXMgTlVMTFxuIik7CisJCXByX2VycigiYmVpc2NzaV9lcF9jb25uZWN0IHNob3N0IGlzIE5VTExcbiIpOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIAotCWlmIChiZWlzY3NpX2Vycm9yKHBoYmEpKSB7CisJcGhiYSA9IGlzY3NpX2hvc3RfcHJpdihzaG9zdCk7CisJaWYgKCFiZWlzY3NpX2hiYV9pc19vbmxpbmUocGhiYSkpIHsKIAkJcmV0ID0gLUVJTzsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBCRUlTQ1NJX0xPR19DT05GSUcsCi0JCQkgICAgIkJTXyVkIDogVGhlIEZXIHN0YXRlIE5vdCBTdGFibGUhISFcbiIpOworCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sIEJFSVNDU0lfTE9HX0NPTkZJRywKKwkJCSAgICAiQlNfJWQgOiBIQkEgaW4gZXJyb3IgMHglbHhcbiIsIHBoYmEtPnN0YXRlKTsKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKIAl9Ci0KLQlpZiAocGhiYS0+c3RhdGUgJiBCRV9BREFQVEVSX1BDSV9FUlIpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJICAgICJCU18lZCA6IEluIFBDSV9FUlJPUiBSZWNvdmVyeVxuIik7Ci0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JfSBlbHNlIGlmIChwaGJhLT5zdGF0ZSAmIEJFX0FEQVBURVJfTElOS19ET1dOKSB7CisJaWYgKCF0ZXN0X2JpdChCRUlTQ1NJX0hCQV9MSU5LX1VQLCAmcGhiYS0+c3RhdGUpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBCRUlTQ1NJX0xPR19DT05GSUcsCiAJCQkgICAgIkJTXyVkIDogVGhlIEFkYXB0ZXIgUG9ydCBzdGF0ZSBpcyBEb3duISEhXG4iKTsKQEAgLTEzNjEsOSArMTMzNSw5IEBACiAJCXRjcF91cGxvYWRfZmxhZyA9IENPTk5FQ1RJT05fVVBMT0FEX0FCT1JUOwogCX0KIAotCWlmIChwaGJhLT5zdGF0ZSAmIEJFX0FEQVBURVJfUENJX0VSUikgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJICAgICJCU18lZCA6IFBDSV9FUlJPUiBSZWNvdmVyeVxuIik7CisJaWYgKCFiZWlzY3NpX2hiYV9pc19vbmxpbmUocGhiYSkpIHsKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLCBCRUlTQ1NJX0xPR19DT05GSUcsCisJCQkgICAgIkJTXyVkIDogSEJBIGluIGVycm9yIDB4JWx4XG4iLCBwaGJhLT5zdGF0ZSk7CiAJCWdvdG8gZnJlZV9lcDsKIAl9CiAKQEAgLTEzODYsNyArMTM2MCw3IEBACiAJaXNjc2lfZGVzdHJveV9lbmRwb2ludChiZWlzY3NpX2VwLT5vcGVuaXNjc2lfZXApOwogfQogCi11bW9kZV90IGJlMmlzY3NpX2F0dHJfaXNfdmlzaWJsZShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKQordW1vZGVfdCBiZWlzY3NpX2F0dHJfaXNfdmlzaWJsZShpbnQgcGFyYW1fdHlwZSwgaW50IHBhcmFtKQogewogCXN3aXRjaCAocGFyYW1fdHlwZSkgewogCWNhc2UgSVNDU0lfTkVUX1BBUkFNOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2lzY3NpLmggYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfaXNjc2kuaAppbmRleCAwYzg0ZTFjLi5lNGQ2N2RmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfaXNjc2kuaAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfaXNjc2kuaApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAxNSBBdmFnbyBUZWNobm9sb2dpZXMKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMTYgQnJvYWRjb20KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNywxMCArNywxMCBAQAogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAogICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCiAgKgotICogV3JpdHRlbiBieTogSmF5YW1vaGFuIEthbGxpY2thbCAoamF5YW1vaGFuLmthbGxpY2thbEBhdmFnb3RlY2guY29tKQorICogV3JpdHRlbiBieTogSmF5YW1vaGFuIEthbGxpY2thbCAoamF5YW1vaGFuLmthbGxpY2thbEBicm9hZGNvbS5jb20pCiAgKgogICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqIGxpbnV4LWRyaXZlcnNAYXZhZ290ZWNoLmNvbQorICogbGludXgtZHJpdmVyc0Bicm9hZGNvbS5jb20KICAqCiAgKiBBdmFnbyBUZWNobm9sb2dpZXMKICAqIDMzMzMgU3VzYW4gU3RyZWV0CkBAIC0yMywyNSArMjMsMTggQEAKICNpbmNsdWRlICJiZV9tYWluLmgiCiAjaW5jbHVkZSAiYmVfbWdtdC5oIgogCi0jZGVmaW5lIEJFMl9JUFY0ICAweDEKLSNkZWZpbmUgQkUyX0lQVjYgIDB4MTAKLSNkZWZpbmUgQkUyX0RIQ1BfVjQgMHgwNQordm9pZCBiZWlzY3NpX2lmYWNlX2NyZWF0ZV9kZWZhdWx0KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CiAKLSNkZWZpbmUgTk9OX0JMT0NLSU5HIDB4MAotI2RlZmluZSBCTE9DS0lORyAweDEKK3ZvaWQgYmVpc2NzaV9pZmFjZV9kZXN0cm95X2RlZmF1bHQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKIAotdm9pZCBiZWlzY3NpX2NyZWF0ZV9kZWZfaWZhY2VzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7Ci0KLXZvaWQgYmVpc2NzaV9kZXN0cm95X2RlZl9pZmFjZXMoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKLQotaW50IGJlMmlzY3NpX2lmYWNlX2dldF9wYXJhbShzdHJ1Y3QgaXNjc2lfaWZhY2UgKmlmYWNlLAoraW50IGJlaXNjc2lfaWZhY2VfZ2V0X3BhcmFtKHN0cnVjdCBpc2NzaV9pZmFjZSAqaWZhY2UsCiAJCQkgICAgIGVudW0gaXNjc2lfcGFyYW1fdHlwZSBwYXJhbV90eXBlLAogCQkJICAgICBpbnQgcGFyYW0sIGNoYXIgKmJ1Zik7CiAKLWludCBiZTJpc2NzaV9pZmFjZV9zZXRfcGFyYW0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCitpbnQgYmVpc2NzaV9pZmFjZV9zZXRfcGFyYW0oc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsCiAJCQkgICAgIHZvaWQgKmRhdGEsIHVpbnQzMl90IGNvdW50KTsKIAotdW1vZGVfdCBiZTJpc2NzaV9hdHRyX2lzX3Zpc2libGUoaW50IHBhcmFtX3R5cGUsIGludCBwYXJhbSk7Cit1bW9kZV90IGJlaXNjc2lfYXR0cl9pc192aXNpYmxlKGludCBwYXJhbV90eXBlLCBpbnQgcGFyYW0pOwogCiB2b2lkIGJlaXNjc2lfb2ZmbG9hZF9jb25uZWN0aW9uKHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKIAkJCQlzdHJ1Y3QgYmVpc2NzaV9vZmZsb2FkX3BhcmFtcyAqcGFyYW1zKTsKQEAgLTU3LDYgKzUwLDggQEAKIAogdm9pZCBiZWlzY3NpX3Nlc3Npb25fZGVzdHJveShzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKTsKIAordm9pZCBiZWlzY3NpX3Nlc3Npb25fZmFpbChzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKTsKKwogc3RydWN0IGlzY3NpX2Nsc19jb25uICpiZWlzY3NpX2Nvbm5fY3JlYXRlKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbgogCQkJCQkgICAqY2xzX3Nlc3Npb24sIHVpbnQzMl90IGNpZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jCmluZGV4IGYwNWU3NzMuLjZhNjkwNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYwpAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAxNSBFbXVsZXgKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMTYgQnJvYWRjb20KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNywxMCArNywxMCBAQAogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAogICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCiAgKgotICogV3JpdHRlbiBieTogSmF5YW1vaGFuIEthbGxpY2thbCAoamF5YW1vaGFuLmthbGxpY2thbEBhdmFnb3RlY2guY29tKQorICogV3JpdHRlbiBieTogSmF5YW1vaGFuIEthbGxpY2thbCAoamF5YW1vaGFuLmthbGxpY2thbEBicm9hZGNvbS5jb20pCiAgKgogICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqIGxpbnV4LWRyaXZlcnNAYXZhZ290ZWNoLmNvbQorICogbGludXgtZHJpdmVyc0Bicm9hZGNvbS5jb20KICAqCiAgKiBFbXVsZXgKICAqIDMzMzMgU3VzYW4gU3RyZWV0CkBAIC0zNzQsMTcwICszNzQsNiBAQAogCXJldHVybiBpc2NzaV9laF9kZXZpY2VfcmVzZXQoc2MpOwogfQogCi1zdGF0aWMgc3NpemVfdCBiZWlzY3NpX3Nob3dfYm9vdF90Z3RfaW5mbyh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKQotewotCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGRhdGE7Ci0Jc3RydWN0IG1nbXRfc2Vzc2lvbl9pbmZvICpib290X3Nlc3MgPSAmcGhiYS0+Ym9vdF9zZXNzOwotCXN0cnVjdCBtZ210X2Nvbm5faW5mbyAqYm9vdF9jb25uID0gJmJvb3Rfc2Vzcy0+Y29ubl9saXN0WzBdOwotCWNoYXIgKnN0ciA9IGJ1ZjsKLQlpbnQgcmM7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIElTQ1NJX0JPT1RfVEdUX05BTUU6Ci0JCXJjID0gc3ByaW50ZihidWYsICIlLipzXG4iLAotCQkJICAgIChpbnQpc3RybGVuKGJvb3Rfc2Vzcy0+dGFyZ2V0X25hbWUpLAotCQkJICAgIChjaGFyICopJmJvb3Rfc2Vzcy0+dGFyZ2V0X25hbWUpOwotCQlicmVhazsKLQljYXNlIElTQ1NJX0JPT1RfVEdUX0lQX0FERFI6Ci0JCWlmIChib290X2Nvbm4tPmRlc3RfaXBhZGRyLmlwX3R5cGUgPT0gMHgxKQotCQkJcmMgPSBzcHJpbnRmKGJ1ZiwgIiVwSTRcbiIsCi0JCQkJKGNoYXIgKikmYm9vdF9jb25uLT5kZXN0X2lwYWRkci5hZGRyKTsKLQkJZWxzZQotCQkJcmMgPSBzcHJpbnRmKHN0ciwgIiVwSTZcbiIsCi0JCQkJKGNoYXIgKikmYm9vdF9jb25uLT5kZXN0X2lwYWRkci5hZGRyKTsKLQkJYnJlYWs7Ci0JY2FzZSBJU0NTSV9CT09UX1RHVF9QT1JUOgotCQlyYyA9IHNwcmludGYoc3RyLCAiJWRcbiIsIGJvb3RfY29ubi0+ZGVzdF9wb3J0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIElTQ1NJX0JPT1RfVEdUX0NIQVBfTkFNRToKLQkJcmMgPSBzcHJpbnRmKHN0ciwgICIlLipzXG4iLAotCQkJICAgICBib290X2Nvbm4tPm5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy5hdXRoX2RhdGEuY2hhcC4KLQkJCSAgICAgdGFyZ2V0X2NoYXBfbmFtZV9sZW5ndGgsCi0JCQkgICAgIChjaGFyICopJmJvb3RfY29ubi0+bmVnb3RpYXRlZF9sb2dpbl9vcHRpb25zLgotCQkJICAgICBhdXRoX2RhdGEuY2hhcC50YXJnZXRfY2hhcF9uYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBJU0NTSV9CT09UX1RHVF9DSEFQX1NFQ1JFVDoKLQkJcmMgPSBzcHJpbnRmKHN0ciwgICIlLipzXG4iLAotCQkJICAgICBib290X2Nvbm4tPm5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy5hdXRoX2RhdGEuY2hhcC4KLQkJCSAgICAgdGFyZ2V0X3NlY3JldF9sZW5ndGgsCi0JCQkgICAgIChjaGFyICopJmJvb3RfY29ubi0+bmVnb3RpYXRlZF9sb2dpbl9vcHRpb25zLgotCQkJICAgICBhdXRoX2RhdGEuY2hhcC50YXJnZXRfc2VjcmV0KTsKLQkJYnJlYWs7Ci0JY2FzZSBJU0NTSV9CT09UX1RHVF9SRVZfQ0hBUF9OQU1FOgotCQlyYyA9IHNwcmludGYoc3RyLCAgIiUuKnNcbiIsCi0JCQkgICAgIGJvb3RfY29ubi0+bmVnb3RpYXRlZF9sb2dpbl9vcHRpb25zLmF1dGhfZGF0YS5jaGFwLgotCQkJICAgICBpbnRyX2NoYXBfbmFtZV9sZW5ndGgsCi0JCQkgICAgIChjaGFyICopJmJvb3RfY29ubi0+bmVnb3RpYXRlZF9sb2dpbl9vcHRpb25zLgotCQkJICAgICBhdXRoX2RhdGEuY2hhcC5pbnRyX2NoYXBfbmFtZSk7Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfQk9PVF9UR1RfUkVWX0NIQVBfU0VDUkVUOgotCQlyYyA9IHNwcmludGYoc3RyLCAgIiUuKnNcbiIsCi0JCQkgICAgIGJvb3RfY29ubi0+bmVnb3RpYXRlZF9sb2dpbl9vcHRpb25zLmF1dGhfZGF0YS5jaGFwLgotCQkJICAgICBpbnRyX3NlY3JldF9sZW5ndGgsCi0JCQkgICAgIChjaGFyICopJmJvb3RfY29ubi0+bmVnb3RpYXRlZF9sb2dpbl9vcHRpb25zLgotCQkJICAgICBhdXRoX2RhdGEuY2hhcC5pbnRyX3NlY3JldCk7Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfQk9PVF9UR1RfRkxBR1M6Ci0JCXJjID0gc3ByaW50ZihzdHIsICIyXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBJU0NTSV9CT09UX1RHVF9OSUNfQVNTT0M6Ci0JCXJjID0gc3ByaW50ZihzdHIsICIwXG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmMgPSAtRU5PU1lTOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBiZWlzY3NpX3Nob3dfYm9vdF9pbmlfaW5mbyh2b2lkICpkYXRhLCBpbnQgdHlwZSwgY2hhciAqYnVmKQotewotCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGRhdGE7Ci0JY2hhciAqc3RyID0gYnVmOwotCWludCByYzsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgSVNDU0lfQk9PVF9JTklfSU5JVElBVE9SX05BTUU6Ci0JCXJjID0gc3ByaW50ZihzdHIsICIlc1xuIiwgcGhiYS0+Ym9vdF9zZXNzLmluaXRpYXRvcl9pc2NzaW5hbWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IC1FTk9TWVM7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJlaXNjc2lfc2hvd19ib290X2V0aF9pbmZvKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gZGF0YTsKLQljaGFyICpzdHIgPSBidWY7Ci0JaW50IHJjOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBJU0NTSV9CT09UX0VUSF9GTEFHUzoKLQkJcmMgPSBzcHJpbnRmKHN0ciwgIjJcbiIpOwotCQlicmVhazsKLQljYXNlIElTQ1NJX0JPT1RfRVRIX0lOREVYOgotCQlyYyA9IHNwcmludGYoc3RyLCAiMFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfQk9PVF9FVEhfTUFDOgotCQlyYyAgPSBiZWlzY3NpX2dldF9tYWNhZGRyKHN0ciwgcGhiYSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gLUVOT1NZUzsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgdW1vZGVfdCBiZWlzY3NpX3RndF9nZXRfYXR0cl92aXNpYmlsaXR5KHZvaWQgKmRhdGEsIGludCB0eXBlKQotewotCXVtb2RlX3QgcmM7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIElTQ1NJX0JPT1RfVEdUX05BTUU6Ci0JY2FzZSBJU0NTSV9CT09UX1RHVF9JUF9BRERSOgotCWNhc2UgSVNDU0lfQk9PVF9UR1RfUE9SVDoKLQljYXNlIElTQ1NJX0JPT1RfVEdUX0NIQVBfTkFNRToKLQljYXNlIElTQ1NJX0JPT1RfVEdUX0NIQVBfU0VDUkVUOgotCWNhc2UgSVNDU0lfQk9PVF9UR1RfUkVWX0NIQVBfTkFNRToKLQljYXNlIElTQ1NJX0JPT1RfVEdUX1JFVl9DSEFQX1NFQ1JFVDoKLQljYXNlIElTQ1NJX0JPT1RfVEdUX05JQ19BU1NPQzoKLQljYXNlIElTQ1NJX0JPT1RfVEdUX0ZMQUdTOgotCQlyYyA9IFNfSVJVR087Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHVtb2RlX3QgYmVpc2NzaV9pbmlfZ2V0X2F0dHJfdmlzaWJpbGl0eSh2b2lkICpkYXRhLCBpbnQgdHlwZSkKLXsKLQl1bW9kZV90IHJjOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBJU0NTSV9CT09UX0lOSV9JTklUSUFUT1JfTkFNRToKLQkJcmMgPSBTX0lSVUdPOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyYyA9IDA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KLQotc3RhdGljIHVtb2RlX3QgYmVpc2NzaV9ldGhfZ2V0X2F0dHJfdmlzaWJpbGl0eSh2b2lkICpkYXRhLCBpbnQgdHlwZSkKLXsKLQl1bW9kZV90IHJjOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBJU0NTSV9CT09UX0VUSF9GTEFHUzoKLQljYXNlIElTQ1NJX0JPT1RfRVRIX01BQzoKLQljYXNlIElTQ1NJX0JPT1RfRVRIX0lOREVYOgotCQlyYyA9IFNfSVJVR087Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJjID0gMDsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByYzsKLX0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tIFBDSSBEcml2ZXIgb3BlcmF0aW9ucyBhbmQgZGF0YSAtLS0tLS0tLS0tLS0tLS0tLSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGJlaXNjc2lfcGNpX2lkX3RhYmxlW10gPSB7CiAJeyBQQ0lfREVWSUNFKEJFX1ZFTkRPUl9JRCwgQkVfREVWSUNFX0lEMSkgfSwKQEAgLTg1MCwxMiArNjg2LDExIEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgYmVfaXNyX21jYyhpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOwotCXN0cnVjdCBiZV9lcV9lbnRyeSAqZXFlID0gTlVMTDsKKwlzdHJ1Y3QgYmVfZXFfZW50cnkgKmVxZTsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZXE7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKm1jYzsKLQl1bnNpZ25lZCBpbnQgbnVtX2VxX3Byb2Nlc3NlZDsKKwl1bnNpZ25lZCBpbnQgbWNjX2V2ZW50czsKIAlzdHJ1Y3QgYmVfZXFfb2JqICpwYmVfZXE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXBiZV9lcSA9IGRldl9pZDsKIAllcSA9ICZwYmVfZXEtPnE7CkBAIC04NjMsMjcgKzY5OCwyMyBAQAogCW1jYyA9ICZwaGJhLT5jdHJsLm1jY19vYmouY3E7CiAJZXFlID0gcXVldWVfdGFpbF9ub2RlKGVxKTsKIAotCW51bV9lcV9wcm9jZXNzZWQgPSAwOwotCisJbWNjX2V2ZW50cyA9IDA7CiAJd2hpbGUgKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkKSAvIDMyXQogCQkJCSYgRVFFX1ZBTElEX01BU0spIHsKIAkJaWYgKCgoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwKIAkJICAgICByZXNvdXJjZV9pZCkgLyAzMl0gJgogCQkgICAgIEVRRV9SRVNJRF9NQVNLKSA+PiAxNikgPT0gbWNjLT5pZCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7Ci0JCQlwYmVfZXEtPnRvZG9fbWNjX2NxID0gdHJ1ZTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7CisJCQltY2NfZXZlbnRzKys7CiAJCX0KIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQsIGVxZSwgMCk7CiAJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKIAkJZXFlID0gcXVldWVfdGFpbF9ub2RlKGVxKTsKLQkJbnVtX2VxX3Byb2Nlc3NlZCsrOwogCX0KLQlpZiAocGJlX2VxLT50b2RvX21jY19jcSkKLQkJcXVldWVfd29yayhwaGJhLT53cSwgJnBiZV9lcS0+d29ya19jcXMpOwotCWlmIChudW1fZXFfcHJvY2Vzc2VkKQotCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDEsCW51bV9lcV9wcm9jZXNzZWQsIDEsIDEpOwogCisJaWYgKG1jY19ldmVudHMpIHsKKwkJcXVldWVfd29yayhwaGJhLT53cSwgJnBiZV9lcS0+bWNjX3dvcmspOworCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDEsCW1jY19ldmVudHMsIDEsIDEpOworCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTkwMiw3ICs3MzMsNiBAQAogCWVxID0gJnBiZV9lcS0+cTsKIAogCXBoYmEgPSBwYmVfZXEtPnBoYmE7Ci0KIAkvKiBkaXNhYmxlIGludGVycnVwdCB0aWxsIGlvcG9sbCBjb21wbGV0ZXMgKi8KIAlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDEsCTAsIDAsIDEpOwogCWlycV9wb2xsX3NjaGVkKCZwYmVfZXEtPmlvcG9sbCk7CkBAIC05MjAsMTQgKzc1MCwxMyBAQAogCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYTsKIAlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CiAJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OwotCXN0cnVjdCBiZV9lcV9lbnRyeSAqZXFlID0gTlVMTDsKKwlzdHJ1Y3QgYmVfZXFfZW50cnkgKmVxZTsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZXE7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKm1jYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpbmRleDsKLQl1bnNpZ25lZCBpbnQgbnVtX21jY2VxX3Byb2Nlc3NlZCwgbnVtX2lvZXFfcHJvY2Vzc2VkOworCXVuc2lnbmVkIGludCBtY2NfZXZlbnRzLCBpb19ldmVudHM7CiAJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybDsKIAlzdHJ1Y3QgYmVfZXFfb2JqICpwYmVfZXE7Ci0JaW50IGlzcjsKKwlpbnQgaXNyLCByZWFybTsKIAogCXBoYmEgPSBkZXZfaWQ7CiAJY3RybCA9ICZwaGJhLT5jdHJsOwpAQCAtOTQyLDQ0ICs3NzEsMzUgQEAKIAogCWVxID0gJnBod2lfY29udGV4dC0+YmVfZXFbMF0ucTsKIAltY2MgPSAmcGhiYS0+Y3RybC5tY2Nfb2JqLmNxOwotCWluZGV4ID0gMDsKIAllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOwogCi0JbnVtX2lvZXFfcHJvY2Vzc2VkID0gMDsKLQludW1fbWNjZXFfcHJvY2Vzc2VkID0gMDsKKwlpb19ldmVudHMgPSAwOworCW1jY19ldmVudHMgPSAwOwogCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KIAkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7CiAJCWlmICgoKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksCi0JCSAgICAgcmVzb3VyY2VfaWQpIC8gMzJdICYKLQkJICAgICBFUUVfUkVTSURfTUFTSykgPj4gMTYpID09IG1jYy0+aWQpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQkJcGJlX2VxLT50b2RvX21jY19jcSA9IHRydWU7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQkJbnVtX21jY2VxX3Byb2Nlc3NlZCsrOwotCQl9IGVsc2UgewotCQkJaXJxX3BvbGxfc2NoZWQoJnBiZV9lcS0+aW9wb2xsKTsKLQkJCW51bV9pb2VxX3Byb2Nlc3NlZCsrOwotCQl9CisJCSAgICAgIHJlc291cmNlX2lkKSAvIDMyXSAmIEVRRV9SRVNJRF9NQVNLKSA+PiAxNikgPT0gbWNjLT5pZCkKKwkJCW1jY19ldmVudHMrKzsKKwkJZWxzZQorCQkJaW9fZXZlbnRzKys7CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkLCBlcWUsIDApOwogCQlxdWV1ZV90YWlsX2luYyhlcSk7CiAJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7CiAJfQotCWlmIChudW1faW9lcV9wcm9jZXNzZWQgfHwgbnVtX21jY2VxX3Byb2Nlc3NlZCkgewotCQlpZiAocGJlX2VxLT50b2RvX21jY19jcSkKLQkJCXF1ZXVlX3dvcmsocGhiYS0+d3EsICZwYmVfZXEtPndvcmtfY3FzKTsKLQotCQlpZiAoKG51bV9tY2NlcV9wcm9jZXNzZWQpICYmICghbnVtX2lvZXFfcHJvY2Vzc2VkKSkKLQkJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMCwKLQkJCQkgICAgICAobnVtX2lvZXFfcHJvY2Vzc2VkICsKLQkJCQkgICAgICAgbnVtX21jY2VxX3Byb2Nlc3NlZCkgLCAxLCAxKTsKLQkJZWxzZQotCQkJaHdpX3JpbmdfZXFfZGIocGhiYSwgZXEtPmlkLCAwLAotCQkJCSAgICAgICAobnVtX2lvZXFfcHJvY2Vzc2VkICsKLQkJCQkJbnVtX21jY2VxX3Byb2Nlc3NlZCksIDAsIDEpOwotCi0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9IGVsc2UKKwlpZiAoIWlvX2V2ZW50cyAmJiAhbWNjX2V2ZW50cykKIAkJcmV0dXJuIElSUV9OT05FOworCisJLyogbm8gbmVlZCB0byByZWFybSBpZiBpbnRlcnJ1cHQgaXMgb25seSBmb3IgSU9zICovCisJcmVhcm0gPSAwOworCWlmIChtY2NfZXZlbnRzKSB7CisJCXF1ZXVlX3dvcmsocGhiYS0+d3EsICZwYmVfZXEtPm1jY193b3JrKTsKKwkJLyogcmVhcm0gZm9yIE1DQ1EgKi8KKwkJcmVhcm0gPSAxOworCX0KKwlpZiAoaW9fZXZlbnRzKQorCQlpcnFfcG9sbF9zY2hlZCgmcGJlX2VxLT5pb3BvbGwpOworCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMCwgKGlvX2V2ZW50cyArIG1jY19ldmVudHMpLCByZWFybSwgMSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiAKQEAgLTEwNzcsNTcgKzg5Nyw2IEBACiAJaW93cml0ZTMyKHZhbCwgcGhiYS0+ZGJfdmEgKyBEQl9DUV9PRkZTRVQpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1iZWlzY3NpX3Byb2Nlc3NfYXN5bmNfcGR1KHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKLQkJCSAgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAotCQkJICBzdHJ1Y3QgcGR1X2Jhc2UgKnBwZHUsCi0JCQkgIHVuc2lnbmVkIGxvbmcgcGR1X2xlbiwKLQkJCSAgdm9pZCAqcGJ1ZmZlciwgdW5zaWduZWQgbG9uZyBidWZfbGVuKQotewotCXN0cnVjdCBpc2NzaV9jb25uICpjb25uID0gYmVpc2NzaV9jb25uLT5jb25uOwotCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gY29ubi0+c2Vzc2lvbjsKLQlzdHJ1Y3QgaXNjc2lfdGFzayAqdGFzazsKLQlzdHJ1Y3QgYmVpc2NzaV9pb190YXNrICppb190YXNrOwotCXN0cnVjdCBpc2NzaV9oZHIgKmxvZ2luX2hkcjsKLQotCXN3aXRjaCAocHBkdS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfcGR1X2Jhc2UsIG9wY29kZSkgLyAzMl0gJgotCQkJCQkJUERVQkFTRV9PUENPREVfTUFTSykgewotCWNhc2UgSVNDU0lfT1BfTk9PUF9JTjoKLQkJcGJ1ZmZlciA9IE5VTEw7Ci0JCWJ1Zl9sZW4gPSAwOwotCQlicmVhazsKLQljYXNlIElTQ1NJX09QX0FTWU5DX0VWRU5UOgotCQlicmVhazsKLQljYXNlIElTQ1NJX09QX1JFSkVDVDoKLQkJV0FSTl9PTighcGJ1ZmZlcik7Ci0JCVdBUk5fT04oIShidWZfbGVuID09IDQ4KSk7Ci0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAotCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRyB8IEJFSVNDU0lfTE9HX0lPLAotCQkJICAgICJCTV8lZCA6IEluIElTQ1NJX09QX1JFSkVDVFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgSVNDU0lfT1BfTE9HSU5fUlNQOgotCWNhc2UgSVNDU0lfT1BfVEVYVF9SU1A6Ci0JCXRhc2sgPSBjb25uLT5sb2dpbl90YXNrOwotCQlpb190YXNrID0gdGFzay0+ZGRfZGF0YTsKLQkJbG9naW5faGRyID0gKHN0cnVjdCBpc2NzaV9oZHIgKilwcGR1OwotCQlsb2dpbl9oZHItPml0dCA9IGlvX3Rhc2stPmxpYmlzY3NpX2l0dDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAotCQkJICAgIEJFSVNDU0lfTE9HX0lPIHwgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJICAgICJCTV8lZCA6IFVucmVjb2duaXplZCBvcGNvZGUgMHgleCBpbiBhc3luYyBtc2dcbiIsCi0JCQkgICAgKHBwZHUtPgotCQkJICAgICBkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9wZHVfYmFzZSwgb3Bjb2RlKSAvIDMyXQotCQkJICAgICAmIFBEVUJBU0VfT1BDT0RFX01BU0spKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOwotCV9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIChzdHJ1Y3QgaXNjc2lfaGRyICopcHBkdSwgcGJ1ZmZlciwgYnVmX2xlbik7Ci0Jc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3Qgc2dsX2hhbmRsZSAqYWxsb2NfaW9fc2dsX2hhbmRsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCiB7CiAJc3RydWN0IHNnbF9oYW5kbGUgKnBzZ2xfaGFuZGxlOwpAQCAtMTE5OSw2ICs5NjgsOSBAQAogCQlwd3JiX2NvbnRleHQtPmFsbG9jX2luZGV4Kys7CiAJc3Bpbl91bmxvY2tfYmgoJnB3cmJfY29udGV4dC0+d3JiX2xvY2spOwogCisJaWYgKHB3cmJfaGFuZGxlKQorCQltZW1zZXQocHdyYl9oYW5kbGUtPnB3cmIsIDAsIHNpemVvZigqcHdyYl9oYW5kbGUtPnB3cmIpKTsKKwogCXJldHVybiBwd3JiX2hhbmRsZTsKIH0KIApAQCAtMTQ0MCwxMSArMTIxMiwxMCBAQAogCQkgICAgICAgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBzdHJ1Y3Qgc29sX2NxZSAqcHNvbCkKIHsKIAlzdHJ1Y3QgaHdpX3dyYl9jb250ZXh0ICpwd3JiX2NvbnRleHQ7Ci0Jc3RydWN0IHdyYl9oYW5kbGUgKnB3cmJfaGFuZGxlID0gTlVMTDsKLQlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7Ci0Jc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7Ci0Jc3RydWN0IGJlaXNjc2lfaW9fdGFzayAqaW9fdGFzazsKIAl1aW50MTZfdCB3cmJfaW5kZXgsIGNpZCwgY3JpX2luZGV4OworCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKKwlzdHJ1Y3Qgd3JiX2hhbmRsZSAqcHdyYl9oYW5kbGU7CisJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CiAKIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKIAlpZiAoaXNfY2hpcF9iZTJfYmUzcihwaGJhKSkgewpAQCAtMTQ2Myw5ICsxMjM0LDYgQEAKIAlwd3JiX2NvbnRleHQgPSAmcGh3aV9jdHJsci0+d3JiX2NvbnRleHRbY3JpX2luZGV4XTsKIAlwd3JiX2hhbmRsZSA9IHB3cmJfY29udGV4dC0+cHdyYl9oYW5kbGVfYmFzZXN0ZFt3cmJfaW5kZXhdOwogCXRhc2sgPSBwd3JiX2hhbmRsZS0+cGlvX2hhbmRsZTsKLQotCWlvX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOwotCW1lbXNldChpb190YXNrLT5wd3JiX2hhbmRsZS0+cHdyYiwgMCwgc2l6ZW9mKHN0cnVjdCBpc2NzaV93cmIpKTsKIAlpc2NzaV9wdXRfdGFzayh0YXNrKTsKIH0KIApAQCAtMTYxNCw0MzEgKzEzODIsNDI4IEBACiAJc3Bpbl91bmxvY2tfYmgoJnNlc3Npb24tPmJhY2tfbG9jayk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICpod2lfZ2V0X2FzeW5jX2J1c3lfbGlzdChzdHJ1Y3QgaHdpX2FzeW5jX3BkdV9jb250ZXh0Ci0JCQkJCSAgKnBhc3luY19jdHgsIHVuc2lnbmVkIGludCBpc19oZWFkZXIsCi0JCQkJCSAgdW5zaWduZWQgaW50IGhvc3Rfd3JpdGVfcHRyKQotewotCWlmIChpc19oZWFkZXIpCi0JCXJldHVybiAmcGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbaG9zdF93cml0ZV9wdHJdLgotCQkgICAgaGVhZGVyX2J1c3lfbGlzdDsKLQllbHNlCi0JCXJldHVybiAmcGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbaG9zdF93cml0ZV9wdHJdLmRhdGFfYnVzeV9saXN0OwotfQotCi1zdGF0aWMgc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUgKgotaHdpX2dldF9hc3luY19oYW5kbGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAotCQkgICAgIHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKLQkJICAgICBzdHJ1Y3QgaHdpX2FzeW5jX3BkdV9jb250ZXh0ICpwYXN5bmNfY3R4LAotCQkgICAgIHN0cnVjdCBpX3RfZHBkdV9jcWUgKnBkcGR1X2NxZSwgdW5zaWduZWQgaW50ICpwY3FfaW5kZXgpCi17Ci0Jc3RydWN0IGJlX2J1c19hZGRyZXNzIHBoeXNfYWRkcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwYnVzeV9saXN0OwotCXN0cnVjdCBhc3luY19wZHVfaGFuZGxlICpwYXN5bmNfaGFuZGxlID0gTlVMTDsKLQl1bnNpZ25lZCBjaGFyIGlzX2hlYWRlciA9IDA7Ci0JdW5zaWduZWQgaW50IGluZGV4LCBkcGw7Ci0KLQlpZiAoaXNfY2hpcF9iZTJfYmUzcihwaGJhKSkgewotCQlkcGwgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2lfdF9kcGR1X2NxZSwKLQkJCQkgICAgZHBsLCBwZHBkdV9jcWUpOwotCQlpbmRleCA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfaV90X2RwZHVfY3FlLAotCQkJCSAgICAgIGluZGV4LCBwZHBkdV9jcWUpOwotCX0gZWxzZSB7Ci0JCWRwbCA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfaV90X2RwZHVfY3FlX3YyLAotCQkJCSAgICBkcGwsIHBkcGR1X2NxZSk7Ci0JCWluZGV4ID0gQU1BUF9HRVRfQklUUyhzdHJ1Y3QgYW1hcF9pX3RfZHBkdV9jcWVfdjIsCi0JCQkJICAgICAgaW5kZXgsIHBkcGR1X2NxZSk7Ci0JfQotCi0JcGh5c19hZGRyLnUuYTMyLmFkZHJlc3NfbG8gPQotCQkocGRwZHVfY3FlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9pX3RfZHBkdV9jcWUsCi0JCQkJCWRiX2FkZHJfbG8pIC8gMzJdIC0gZHBsKTsKLQlwaHlzX2FkZHIudS5hMzIuYWRkcmVzc19oaSA9Ci0JCXBkcGR1X2NxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfaV90X2RwZHVfY3FlLAotCQkJCSAgICAgICBkYl9hZGRyX2hpKSAvIDMyXTsKLQotCXBoeXNfYWRkci51LmE2NC5hZGRyZXNzID0KLQkJCSooKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSgmcGh5c19hZGRyLnUuYTY0LmFkZHJlc3MpKTsKLQotCXN3aXRjaCAocGRwZHVfY3FlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9pX3RfZHBkdV9jcWUsIGNvZGUpIC8gMzJdCi0JCQkmIFBEVUNRRV9DT0RFX01BU0spIHsKLQljYXNlIFVOU09MX0hEUl9OT1RJRlk6Ci0JCWlzX2hlYWRlciA9IDE7Ci0KLQkJIHBidXN5X2xpc3QgPSBod2lfZ2V0X2FzeW5jX2J1c3lfbGlzdChwYXN5bmNfY3R4LAotCQkJCQkJICAgICAgaXNfaGVhZGVyLCBpbmRleCk7Ci0JCWJyZWFrOwotCWNhc2UgVU5TT0xfREFUQV9OT1RJRlk6Ci0JCSBwYnVzeV9saXN0ID0gaHdpX2dldF9hc3luY19idXN5X2xpc3QocGFzeW5jX2N0eCwKLQkJCQkJCSAgICAgIGlzX2hlYWRlciwgaW5kZXgpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwYnVzeV9saXN0ID0gTlVMTDsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAotCQkJICAgIEJFSVNDU0lfTE9HX0lPIHwgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJICAgICJCTV8lZCA6IFVuZXhwZWN0ZWQgY29kZT0lZFxuIiwKLQkJCSAgICBwZHBkdV9jcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2lfdF9kcGR1X2NxZSwKLQkJCSAgICBjb2RlKSAvIDMyXSAmIFBEVUNRRV9DT0RFX01BU0spOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlXQVJOX09OKGxpc3RfZW1wdHkocGJ1c3lfbGlzdCkpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocGFzeW5jX2hhbmRsZSwgcGJ1c3lfbGlzdCwgbGluaykgewotCQlpZiAocGFzeW5jX2hhbmRsZS0+cGEudS5hNjQuYWRkcmVzcyA9PSBwaHlzX2FkZHIudS5hNjQuYWRkcmVzcykKLQkJCWJyZWFrOwotCX0KLQotCVdBUk5fT04oIXBhc3luY19oYW5kbGUpOwotCi0JcGFzeW5jX2hhbmRsZS0+Y3JpID0gQkVfR0VUX0FTWU5DX0NSSV9GUk9NX0NJRCgKLQkJCSAgICAgYmVpc2NzaV9jb25uLT5iZWlzY3NpX2Nvbm5fY2lkKTsKLQlwYXN5bmNfaGFuZGxlLT5pc19oZWFkZXIgPSBpc19oZWFkZXI7Ci0JcGFzeW5jX2hhbmRsZS0+YnVmZmVyX2xlbiA9IGRwbDsKLQkqcGNxX2luZGV4ID0gaW5kZXg7Ci0KLQlyZXR1cm4gcGFzeW5jX2hhbmRsZTsKLX0KLQorLyoqCisgKiBBU1lOQyBQRFVzIGluY2x1ZGUKKyAqIGEuIFVuc29saWNpdGVkIE5PUC1JbiAodGFyZ2V0IGluaXRpYXRlZCBOT1AtSW4pCisgKiBiLiBBU1lOQyBNZXNzYWdlcworICogYy4gUmVqZWN0IFBEVQorICogZC4gTG9naW4gcmVzcG9uc2UKKyAqIFRoZXNlIGhlYWRlcnMgYXJyaXZlIHVucHJvY2Vzc2VkIGJ5IHRoZSBFUCBmaXJtd2FyZS4KKyAqIGlTQ1NJIGxheWVyIHByb2Nlc3NlcyB0aGVtLgorICovCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1od2lfdXBkYXRlX2FzeW5jX3dyaXRhYmxlcyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCQkgICAgc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCAqcGFzeW5jX2N0eCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgaXNfaGVhZGVyLCB1bnNpZ25lZCBpbnQgY3FfaW5kZXgpCitiZWlzY3NpX2NvbXBsZXRlX3BkdShzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCisJCXN0cnVjdCBwZHVfYmFzZSAqcGhkciwgdm9pZCAqcGRhdGEsIHVuc2lnbmVkIGludCBkbGVuKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnBidXN5X2xpc3Q7Ci0Jc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUgKnBhc3luY19oYW5kbGU7Ci0JdW5zaWduZWQgaW50IG51bV9lbnRyaWVzLCB3cml0YWJsZXMgPSAwOwotCXVuc2lnbmVkIGludCAqcGVwX3JlYWRfcHRyLCAqcHdyaXRhYmxlczsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBiZWlzY3NpX2Nvbm4tPnBoYmE7CisJc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4gPSBiZWlzY3NpX2Nvbm4tPmNvbm47CisJc3RydWN0IGJlaXNjc2lfaW9fdGFzayAqaW9fdGFzazsKKwlzdHJ1Y3QgaXNjc2lfaGRyICpsb2dpbl9oZHI7CisJc3RydWN0IGlzY3NpX3Rhc2sgKnRhc2s7CisJdTggY29kZTsKIAotCW51bV9lbnRyaWVzID0gcGFzeW5jX2N0eC0+bnVtX2VudHJpZXM7Ci0JaWYgKGlzX2hlYWRlcikgewotCQlwZXBfcmVhZF9wdHIgPSAmcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLmVwX3JlYWRfcHRyOwotCQlwd3JpdGFibGVzID0gJnBhc3luY19jdHgtPmFzeW5jX2hlYWRlci53cml0YWJsZXM7Ci0JfSBlbHNlIHsKLQkJcGVwX3JlYWRfcHRyID0gJnBhc3luY19jdHgtPmFzeW5jX2RhdGEuZXBfcmVhZF9wdHI7Ci0JCXB3cml0YWJsZXMgPSAmcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS53cml0YWJsZXM7Ci0JfQotCi0Jd2hpbGUgKCgqcGVwX3JlYWRfcHRyKSAhPSBjcV9pbmRleCkgewotCQkoKnBlcF9yZWFkX3B0cikrKzsKLQkJKnBlcF9yZWFkX3B0ciA9ICgqcGVwX3JlYWRfcHRyKSAlIG51bV9lbnRyaWVzOwotCi0JCXBidXN5X2xpc3QgPSBod2lfZ2V0X2FzeW5jX2J1c3lfbGlzdChwYXN5bmNfY3R4LCBpc19oZWFkZXIsCi0JCQkJCQkgICAgICpwZXBfcmVhZF9wdHIpOwotCQlpZiAod3JpdGFibGVzID09IDApCi0JCQlXQVJOX09OKGxpc3RfZW1wdHkocGJ1c3lfbGlzdCkpOwotCi0JCWlmICghbGlzdF9lbXB0eShwYnVzeV9saXN0KSkgewotCQkJcGFzeW5jX2hhbmRsZSA9IGxpc3RfZW50cnkocGJ1c3lfbGlzdC0+bmV4dCwKLQkJCQkJCSAgIHN0cnVjdCBhc3luY19wZHVfaGFuZGxlLAotCQkJCQkJICAgbGluayk7Ci0JCQlXQVJOX09OKCFwYXN5bmNfaGFuZGxlKTsKLQkJCXBhc3luY19oYW5kbGUtPmNvbnN1bWVkID0gMTsKLQkJfQotCi0JCXdyaXRhYmxlcysrOwotCX0KLQotCWlmICghd3JpdGFibGVzKSB7CisJY29kZSA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfcGR1X2Jhc2UsIG9wY29kZSwgcGhkcik7CisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBJU0NTSV9PUF9OT09QX0lOOgorCQlwZGF0YSA9IE5VTEw7CisJCWRsZW4gPSAwOworCQlicmVhazsKKwljYXNlIElTQ1NJX09QX0FTWU5DX0VWRU5UOgorCQlicmVhazsKKwljYXNlIElTQ1NJX09QX1JFSkVDVDoKKwkJV0FSTl9PTighcGRhdGEpOworCQlXQVJOX09OKCEoZGxlbiA9PSA0OCkpOwogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKIAkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19JTywKLQkJCSAgICAiQk1fJWQgOiBEdXBsaWNhdGUgbm90aWZpY2F0aW9uIHJlY2VpdmVkIC0gaW5kZXggMHgleCEhXG4iLAotCQkJICAgIGNxX2luZGV4KTsKLQkJV0FSTl9PTigxKTsKKwkJCSAgICAiQk1fJWQgOiBJbiBJU0NTSV9PUF9SRUpFQ1RcbiIpOworCQlicmVhazsKKwljYXNlIElTQ1NJX09QX0xPR0lOX1JTUDoKKwljYXNlIElTQ1NJX09QX1RFWFRfUlNQOgorCQl0YXNrID0gY29ubi0+bG9naW5fdGFzazsKKwkJaW9fdGFzayA9IHRhc2stPmRkX2RhdGE7CisJCWxvZ2luX2hkciA9IChzdHJ1Y3QgaXNjc2lfaGRyICopcGhkcjsKKwkJbG9naW5faGRyLT5pdHQgPSBpb190YXNrLT5saWJpc2NzaV9pdHQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fV0FSTklORywKKwkJCSAgICBCRUlTQ1NJX0xPR19JTyB8IEJFSVNDU0lfTE9HX0NPTkZJRywKKwkJCSAgICAiQk1fJWQgOiB1bnJlY29nbml6ZWQgYXN5bmMgUERVIG9wY29kZSAweCV4XG4iLAorCQkJICAgIGNvZGUpOworCQlyZXR1cm4gMTsKIAl9Ci0KLQkqcHdyaXRhYmxlcyA9ICpwd3JpdGFibGVzICsgd3JpdGFibGVzOworCV9faXNjc2lfY29tcGxldGVfcGR1KGNvbm4sIChzdHJ1Y3QgaXNjc2lfaGRyICopcGhkciwgcGRhdGEsIGRsZW4pOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBod2lfZnJlZV9hc3luY19tc2coc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAotCQkJICAgICAgIHN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQgKnBhc3luY19jdHgsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGNyaSkKK3N0YXRpYyBpbmxpbmUgdm9pZAorYmVpc2NzaV9oZGxfcHV0X2hhbmRsZShzdHJ1Y3QgaGRfYXN5bmNfY29udGV4dCAqcGFzeW5jX2N0eCwKKwkJCSBzdHJ1Y3QgaGRfYXN5bmNfaGFuZGxlICpwYXN5bmNfaGFuZGxlKQogewotCXN0cnVjdCBhc3luY19wZHVfaGFuZGxlICpwYXN5bmNfaGFuZGxlLCAqdG1wX2hhbmRsZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdDsKKwlpZiAocGFzeW5jX2hhbmRsZS0+aXNfaGVhZGVyKSB7CisJCWxpc3RfYWRkX3RhaWwoJnBhc3luY19oYW5kbGUtPmxpbmssCisJCQkJJnBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5mcmVlX2xpc3QpOworCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuZnJlZV9lbnRyaWVzKys7CisJfSBlbHNlIHsKKwkJbGlzdF9hZGRfdGFpbCgmcGFzeW5jX2hhbmRsZS0+bGluaywKKwkJCQkmcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5mcmVlX2xpc3QpOworCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfZW50cmllcysrOworCX0KK30KIAotCXBsaXN0ICA9ICZwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUubGlzdDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFzeW5jX2hhbmRsZSwgdG1wX2hhbmRsZSwgcGxpc3QsIGxpbmspIHsKLQkJbGlzdF9kZWwoJnBhc3luY19oYW5kbGUtPmxpbmspOworc3RhdGljIHN0cnVjdCBoZF9hc3luY19oYW5kbGUgKgorYmVpc2NzaV9oZGxfZ2V0X2hhbmRsZShzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCisJCSAgICAgICBzdHJ1Y3QgaGRfYXN5bmNfY29udGV4dCAqcGFzeW5jX2N0eCwKKwkJICAgICAgIHN0cnVjdCBpX3RfZHBkdV9jcWUgKnBkcGR1X2NxZSkKK3sKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBiZWlzY3NpX2Nvbm4tPnBoYmE7CisJc3RydWN0IGhkX2FzeW5jX2hhbmRsZSAqcGFzeW5jX2hhbmRsZTsKKwlzdHJ1Y3QgYmVfYnVzX2FkZHJlc3MgcGh5c19hZGRyOworCXU4IGZpbmFsLCBlcnJvciA9IDA7CisJdTE2IGNpZCwgY29kZSwgY2k7CisJdTMyIGRwbDsKIAotCQlpZiAocGFzeW5jX2hhbmRsZS0+aXNfaGVhZGVyKSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZwYXN5bmNfaGFuZGxlLT5saW5rLAotCQkJCSAgICAgICZwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuZnJlZV9saXN0KTsKLQkJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5mcmVlX2VudHJpZXMrKzsKLQkJfSBlbHNlIHsKLQkJCWxpc3RfYWRkX3RhaWwoJnBhc3luY19oYW5kbGUtPmxpbmssCi0JCQkJICAgICAgJnBhc3luY19jdHgtPmFzeW5jX2RhdGEuZnJlZV9saXN0KTsKLQkJCXBhc3luY19jdHgtPmFzeW5jX2RhdGEuZnJlZV9lbnRyaWVzKys7Ci0JCX0KKwljaWQgPSBiZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQ7CisJLyoqCisJICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIHRvIGdldCB0aGUgcmlnaHQgYXN5bmNfaGFuZGxlIHN0cnVjdHVyZQorCSAqIGZyb20gYSBnaXZlbiBERUYgUERVIENRIGVudHJ5LgorCSAqCisJICogLSBpbmRleCBpbiBDUSBlbnRyeSBnaXZlcyB0aGUgdmVydGljYWwgaW5kZXgKKwkgKiAtIGFkZHJlc3MgaW4gQ1EgZW50cnkgaXMgdGhlIG9mZnNldCB3aGVyZSB0aGUgRE1BIGxhc3QgZW5kZWQKKwkgKiAtIGZpbmFsIC0gbm8gbW9yZSBub3RpZmljYXRpb25zIGZvciB0aGlzIFBEVQorCSAqLworCWlmIChpc19jaGlwX2JlMl9iZTNyKHBoYmEpKSB7CisJCWRwbCA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfaV90X2RwZHVfY3FlLAorCQkJCSAgICBkcGwsIHBkcGR1X2NxZSk7CisJCWNpID0gQU1BUF9HRVRfQklUUyhzdHJ1Y3QgYW1hcF9pX3RfZHBkdV9jcWUsCisJCQkJICAgICAgaW5kZXgsIHBkcGR1X2NxZSk7CisJCWZpbmFsID0gQU1BUF9HRVRfQklUUyhzdHJ1Y3QgYW1hcF9pX3RfZHBkdV9jcWUsCisJCQkJICAgICAgZmluYWwsIHBkcGR1X2NxZSk7CisJfSBlbHNlIHsKKwkJZHBsID0gQU1BUF9HRVRfQklUUyhzdHJ1Y3QgYW1hcF9pX3RfZHBkdV9jcWVfdjIsCisJCQkJICAgIGRwbCwgcGRwZHVfY3FlKTsKKwkJY2kgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2lfdF9kcGR1X2NxZV92MiwKKwkJCQkgICAgICBpbmRleCwgcGRwZHVfY3FlKTsKKwkJZmluYWwgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2lfdF9kcGR1X2NxZV92MiwKKwkJCQkgICAgICBmaW5hbCwgcGRwZHVfY3FlKTsKIAl9CiAKLQlJTklUX0xJU1RfSEVBRCgmcGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbY3JpXS53YWl0X3F1ZXVlLmxpc3QpOwotCXBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS5oZHJfcmVjZWl2ZWQgPSAwOwotCXBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS5ieXRlc19yZWNlaXZlZCA9IDA7Ci19CisJLyoqCisJICogREIgYWRkciBIaS9MbyBpcyBzYW1lIGZvciBCRSBhbmQgU0tILgorCSAqIFN1YnRyYWN0IHRoZSBkYXRhcGxhY2VtZW50bGVuZ3RoIHRvIGdldCB0byB0aGUgYmFzZS4KKwkgKi8KKwlwaHlzX2FkZHIudS5hMzIuYWRkcmVzc19sbyA9IEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfaV90X2RwZHVfY3FlLAorCQkJCQkJICAgZGJfYWRkcl9sbywgcGRwZHVfY3FlKTsKKwlwaHlzX2FkZHIudS5hMzIuYWRkcmVzc19sbyAtPSBkcGw7CisJcGh5c19hZGRyLnUuYTMyLmFkZHJlc3NfaGkgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2lfdF9kcGR1X2NxZSwKKwkJCQkJCSAgIGRiX2FkZHJfaGksIHBkcGR1X2NxZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgcGh5c19hZGRyICoKLWh3aV9nZXRfcmluZ19hZGRyZXNzKHN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQgKnBhc3luY19jdHgsCi0JCSAgICAgdW5zaWduZWQgaW50IGlzX2hlYWRlciwgdW5zaWduZWQgaW50IGhvc3Rfd3JpdGVfcHRyKQotewotCXN0cnVjdCBwaHlzX2FkZHIgKnBhc3luY19zZ2UgPSBOVUxMOworCWNvZGUgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2lfdF9kcGR1X2NxZSwgY29kZSwgcGRwZHVfY3FlKTsKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIFVOU09MX0hEUl9OT1RJRlk6CisJCXBhc3luY19oYW5kbGUgPSBwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjaV0uaGVhZGVyOworCQlicmVhazsKKwljYXNlIFVOU09MX0RBVEFfRElHRVNUX0VSUk9SX05PVElGWToKKwkJZXJyb3IgPSAxOworCWNhc2UgVU5TT0xfREFUQV9OT1RJRlk6CisJCXBhc3luY19oYW5kbGUgPSBwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjaV0uZGF0YTsKKwkJYnJlYWs7CisJLyogY2FsbGVkIG9ubHkgZm9yIGFib3ZlIGNvZGVzICovCisJZGVmYXVsdDoKKwkJcGFzeW5jX2hhbmRsZSA9IE5VTEw7CisJCWJyZWFrOworCX0KIAotCWlmIChpc19oZWFkZXIpCi0JCXBhc3luY19zZ2UgPSBwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIucmluZ19iYXNlOworCWlmICghcGFzeW5jX2hhbmRsZSkgeworCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSVNDU0ksCisJCQkgICAgIkJNXyVkIDogY2lkICVkIGFzeW5jIFBEVSBoYW5kbGUgbm90IGZvdW5kIC0gY29kZSAlZCBjaSAlZCBhZGRyICVsbHhcbiIsCisJCQkgICAgY2lkLCBjb2RlLCBjaSwgcGh5c19hZGRyLnUuYTY0LmFkZHJlc3MpOworCQlyZXR1cm4gcGFzeW5jX2hhbmRsZTsKKwl9CisKKwlpZiAocGFzeW5jX2hhbmRsZS0+cGEudS5hNjQuYWRkcmVzcyAhPSBwaHlzX2FkZHIudS5hNjQuYWRkcmVzcyB8fAorCSAgICBwYXN5bmNfaGFuZGxlLT5pbmRleCAhPSBjaSkgeworCQkvKiBkcml2ZXIgYnVnIC0gaWYgY2kgZG9lcyBub3QgbWF0Y2ggYXN5bmMgaGFuZGxlIGluZGV4ICovCisJCWVycm9yID0gMTsKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lTQ1NJLAorCQkJICAgICJCTV8lZCA6IGNpZCAldSBhc3luYyBQRFUgaGFuZGxlIG1pc21hdGNoIC0gYWRkciBpbiAlY1FFICVsbHggYXQgJXU6YWRkciBpbiBDUUUgJWxseCBjaSAldVxuIiwKKwkJCSAgICBjaWQsIHBhc3luY19oYW5kbGUtPmlzX2hlYWRlciA/ICdIJyA6ICdEJywKKwkJCSAgICBwYXN5bmNfaGFuZGxlLT5wYS51LmE2NC5hZGRyZXNzLAorCQkJICAgIHBhc3luY19oYW5kbGUtPmluZGV4LAorCQkJICAgIHBoeXNfYWRkci51LmE2NC5hZGRyZXNzLCBjaSk7CisJCS8qIEZXIGhhcyBzdGFsZSBhZGRyZXNzIC0gYXR0ZW1wdCBjb250aW51aW5nIGJ5IGRyb3BwaW5nICovCisJfQorCisJLyoqCisJICogRWFjaCBDSUQgaXMgYXNzb2NpYXRlZCB3aXRoIHVuaXF1ZSBDUkkuCisJICogQVNZTkNfQ1JJX0ZST01fQ0lEIG1hcHBpbmcgYW5kIENSSV9GUk9NX0NJRCBhcmUgdG90YWx5IGRpZmZlcmVudC4KKwkgKiovCisJcGFzeW5jX2hhbmRsZS0+Y3JpID0gQkVfR0VUX0FTWU5DX0NSSV9GUk9NX0NJRChjaWQpOworCXBhc3luY19oYW5kbGUtPmlzX2ZpbmFsID0gZmluYWw7CisJcGFzeW5jX2hhbmRsZS0+YnVmZmVyX2xlbiA9IGRwbDsKKwkvKiBlbXB0eSB0aGUgc2xvdCAqLworCWlmIChwYXN5bmNfaGFuZGxlLT5pc19oZWFkZXIpCisJCXBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NpXS5oZWFkZXIgPSBOVUxMOwogCWVsc2UKLQkJcGFzeW5jX3NnZSA9IHBhc3luY19jdHgtPmFzeW5jX2RhdGEucmluZ19iYXNlOworCQlwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjaV0uZGF0YSA9IE5VTEw7CiAKLQlyZXR1cm4gcGFzeW5jX3NnZSArIGhvc3Rfd3JpdGVfcHRyOworCS8qKgorCSAqIERFRiBQRFUgaGVhZGVyIGFuZCBkYXRhIGJ1ZmZlcnMgd2l0aCBlcnJvcnMgc2hvdWxkIGJlIHNpbXBseQorCSAqIGRyb3BwZWQgYXMgdGhlcmUgYXJlIG5vIGNvbnN1bWVycyBmb3IgaXQuCisJICovCisJaWYgKGVycm9yKSB7CisJCWJlaXNjc2lfaGRsX3B1dF9oYW5kbGUocGFzeW5jX2N0eCwgcGFzeW5jX2hhbmRsZSk7CisJCXBhc3luY19oYW5kbGUgPSBOVUxMOworCX0KKwlyZXR1cm4gcGFzeW5jX2hhbmRsZTsKIH0KIAotc3RhdGljIHZvaWQgaHdpX3Bvc3RfYXN5bmNfYnVmZmVycyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCQkJICAgIHVuc2lnbmVkIGludCBpc19oZWFkZXIsIHVpbnQ4X3QgdWxwX251bSkKK3N0YXRpYyB2b2lkCitiZWlzY3NpX2hkbF9wdXJnZV9oYW5kbGVzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKKwkJCSAgc3RydWN0IGhkX2FzeW5jX2NvbnRleHQgKnBhc3luY19jdHgsCisJCQkgIHUxNiBjcmkpCiB7CisJc3RydWN0IGhkX2FzeW5jX2hhbmRsZSAqcGFzeW5jX2hhbmRsZSwgKnRtcF9oYW5kbGU7CisJc3RydWN0IGxpc3RfaGVhZCAqcGxpc3Q7CisKKwlwbGlzdCAgPSAmcGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbY3JpXS53cS5saXN0OworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYXN5bmNfaGFuZGxlLCB0bXBfaGFuZGxlLCBwbGlzdCwgbGluaykgeworCQlsaXN0X2RlbCgmcGFzeW5jX2hhbmRsZS0+bGluayk7CisJCWJlaXNjc2lfaGRsX3B1dF9oYW5kbGUocGFzeW5jX2N0eCwgcGFzeW5jX2hhbmRsZSk7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud3EubGlzdCk7CisJcGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbY3JpXS53cS5oZHJfbGVuID0gMDsKKwlwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndxLmJ5dGVzX3JlY2VpdmVkID0gMDsKKwlwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndxLmJ5dGVzX25lZWRlZCA9IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2JlaXNjc2lfaGRsX2Z3ZF9wZHUoc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uLAorCQkgICAgc3RydWN0IGhkX2FzeW5jX2NvbnRleHQgKnBhc3luY19jdHgsCisJCSAgICB1MTYgY3JpKQoreworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzaW9uID0gYmVpc2NzaV9jb25uLT5jb25uLT5zZXNzaW9uOworCXN0cnVjdCBoZF9hc3luY19oYW5kbGUgKnBhc3luY19oYW5kbGUsICpwbGFzdF9oYW5kbGU7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gYmVpc2NzaV9jb25uLT5waGJhOworCXZvaWQgKnBoZHIgPSBOVUxMLCAqcGRhdGEgPSBOVUxMOworCXUzMiBkbGVuID0gMCwgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdDsKKworCXBsaXN0ID0gJnBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud3EubGlzdDsKKwlwbGFzdF9oYW5kbGUgPSBOVUxMOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGFzeW5jX2hhbmRsZSwgcGxpc3QsIGxpbmspIHsKKwkJcGxhc3RfaGFuZGxlID0gcGFzeW5jX2hhbmRsZTsKKwkJLyogZ2V0IHRoZSBoZWFkZXIsIHRoZSBmaXJzdCBlbnRyeSAqLworCQlpZiAoIXBoZHIpIHsKKwkJCXBoZHIgPSBwYXN5bmNfaGFuZGxlLT5wYnVmZmVyOworCQkJY29udGludWU7CisJCX0KKwkJLyogdXNlIGZpcnN0IGJ1ZmZlciB0byBjb2xsZWN0IGFsbCB0aGUgZGF0YSAqLworCQlpZiAoIXBkYXRhKSB7CisJCQlwZGF0YSA9IHBhc3luY19oYW5kbGUtPnBidWZmZXI7CisJCQlkbGVuID0gcGFzeW5jX2hhbmRsZS0+YnVmZmVyX2xlbjsKKwkJCWNvbnRpbnVlOworCQl9CisJCW1lbWNweShwZGF0YSArIGRsZW4sIHBhc3luY19oYW5kbGUtPnBidWZmZXIsCisJCSAgICAgICBwYXN5bmNfaGFuZGxlLT5idWZmZXJfbGVuKTsKKwkJZGxlbiArPSBwYXN5bmNfaGFuZGxlLT5idWZmZXJfbGVuOworCX0KKworCWlmICghcGxhc3RfaGFuZGxlLT5pc19maW5hbCkgeworCQkvKiBsYXN0IGhhbmRsZSBzaG91bGQgaGF2ZSBmaW5hbCBQRFUgbm90aWZpY2F0aW9uIGZyb20gRlcgKi8KKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lTQ1NJLAorCQkJICAgICJCTV8lZCA6IGNpZCAldSAlcCBmd2QgYXN5bmMgUERVIHdpdGggbGFzdCBoYW5kbGUgbWlzc2luZyAtIEhMJXU6RE4ldTpEUiV1XG4iLAorCQkJICAgIGJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZCwgcGxhc3RfaGFuZGxlLAorCQkJICAgIHBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud3EuaGRyX2xlbiwKKwkJCSAgICBwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndxLmJ5dGVzX25lZWRlZCwKKwkJCSAgICBwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndxLmJ5dGVzX3JlY2VpdmVkKTsKKwl9CisJc3Bpbl9sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOworCXN0YXR1cyA9IGJlaXNjc2lfY29tcGxldGVfcGR1KGJlaXNjc2lfY29ubiwgcGhkciwgcGRhdGEsIGRsZW4pOworCXNwaW5fdW5sb2NrX2JoKCZzZXNzaW9uLT5iYWNrX2xvY2spOworCWJlaXNjc2lfaGRsX3B1cmdlX2hhbmRsZXMocGhiYSwgcGFzeW5jX2N0eCwgY3JpKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitiZWlzY3NpX2hkbF9nYXRoZXJfcGR1KHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKKwkJICAgICAgIHN0cnVjdCBoZF9hc3luY19jb250ZXh0ICpwYXN5bmNfY3R4LAorCQkgICAgICAgc3RydWN0IGhkX2FzeW5jX2hhbmRsZSAqcGFzeW5jX2hhbmRsZSkKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZXNfbmVlZGVkID0gMCwgc3RhdHVzID0gMDsKKwl1MTYgY3JpID0gcGFzeW5jX2hhbmRsZS0+Y3JpOworCXN0cnVjdCBjcmlfd2FpdF9xdWV1ZSAqd3E7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOworCXN0cnVjdCBwZHVfYmFzZSAqcHBkdTsKKwljaGFyICplcnIgPSAiIjsKKworCXBoYmEgPSBiZWlzY3NpX2Nvbm4tPnBoYmE7CisJd3EgPSAmcGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbY3JpXS53cTsKKwlpZiAocGFzeW5jX2hhbmRsZS0+aXNfaGVhZGVyKSB7CisJCS8qIGNoZWNrIGlmIFBEVSBoZHIgaXMgcmN2J2Qgd2hlbiBvbGQgaGRyIG5vdCBjb21wbGV0ZWQgKi8KKwkJaWYgKHdxLT5oZHJfbGVuKSB7CisJCQllcnIgPSAiaW5jb21wbGV0ZSI7CisJCQlnb3RvIGRyb3BfcGR1OworCQl9CisJCXBwZHUgPSBwYXN5bmNfaGFuZGxlLT5wYnVmZmVyOworCQlieXRlc19uZWVkZWQgPSBBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX3BkdV9iYXNlLAorCQkJCQkgICAgIGRhdGFfbGVuX2hpLCBwcGR1KTsKKwkJYnl0ZXNfbmVlZGVkIDw8PSAxNjsKKwkJYnl0ZXNfbmVlZGVkIHw9IGJlMTZfdG9fY3B1KEFNQVBfR0VUX0JJVFMoc3RydWN0IGFtYXBfcGR1X2Jhc2UsCisJCQkJCQkJICBkYXRhX2xlbl9sbywgcHBkdSkpOworCQl3cS0+aGRyX2xlbiA9IHBhc3luY19oYW5kbGUtPmJ1ZmZlcl9sZW47CisJCXdxLT5ieXRlc19yZWNlaXZlZCA9IDA7CisJCXdxLT5ieXRlc19uZWVkZWQgPSBieXRlc19uZWVkZWQ7CisJCWxpc3RfYWRkX3RhaWwoJnBhc3luY19oYW5kbGUtPmxpbmssICZ3cS0+bGlzdCk7CisJCWlmICghYnl0ZXNfbmVlZGVkKQorCQkJc3RhdHVzID0gYmVpc2NzaV9oZGxfZndkX3BkdShiZWlzY3NpX2Nvbm4sCisJCQkJCQkgICAgIHBhc3luY19jdHgsIGNyaSk7CisJfSBlbHNlIHsKKwkJLyogY2hlY2sgaWYgZGF0YSByZWNlaXZlZCBoYXMgaGVhZGVyIGFuZCBpcyBuZWVkZWQgKi8KKwkJaWYgKCF3cS0+aGRyX2xlbiB8fCAhd3EtPmJ5dGVzX25lZWRlZCkgeworCQkJZXJyID0gImhlYWRlciBsZXNzIjsKKwkJCWdvdG8gZHJvcF9wZHU7CisJCX0KKwkJd3EtPmJ5dGVzX3JlY2VpdmVkICs9IHBhc3luY19oYW5kbGUtPmJ1ZmZlcl9sZW47CisJCS8qIFNvbWV0aGluZyBnb3Qgb3ZlcndyaXR0ZW4/IEJldHRlciBjYXRjaCBpdCBoZXJlLiAqLworCQlpZiAod3EtPmJ5dGVzX3JlY2VpdmVkID4gd3EtPmJ5dGVzX25lZWRlZCkgeworCQkJZXJyID0gIm92ZXJmbG93IjsKKwkJCWdvdG8gZHJvcF9wZHU7CisJCX0KKwkJbGlzdF9hZGRfdGFpbCgmcGFzeW5jX2hhbmRsZS0+bGluaywgJndxLT5saXN0KTsKKwkJaWYgKHdxLT5ieXRlc19yZWNlaXZlZCA9PSB3cS0+Ynl0ZXNfbmVlZGVkKQorCQkJc3RhdHVzID0gYmVpc2NzaV9oZGxfZndkX3BkdShiZWlzY3NpX2Nvbm4sCisJCQkJCQkgICAgIHBhc3luY19jdHgsIGNyaSk7CisJfQorCXJldHVybiBzdGF0dXM7CisKK2Ryb3BfcGR1OgorCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JU0NTSSwKKwkJICAgICJCTV8lZCA6IGNpZCAldSBhc3luYyBQRFUgJXMgLSBkZWYtJWM6SEwldTpETiV1OkRSJXVcbiIsCisJCSAgICBiZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQsIGVyciwKKwkJICAgIHBhc3luY19oYW5kbGUtPmlzX2hlYWRlciA/ICdIJyA6ICdEJywKKwkJICAgIHdxLT5oZHJfbGVuLCB3cS0+Ynl0ZXNfbmVlZGVkLAorCQkgICAgcGFzeW5jX2hhbmRsZS0+YnVmZmVyX2xlbik7CisJLyogZGlzY2FyZCB0aGlzIGhhbmRsZSAqLworCWJlaXNjc2lfaGRsX3B1dF9oYW5kbGUocGFzeW5jX2N0eCwgcGFzeW5jX2hhbmRsZSk7CisJLyogZnJlZSBhbGwgdGhlIG90aGVyIGhhbmRsZXMgaW4gY3JpX3dhaXRfcXVldWUgKi8KKwliZWlzY3NpX2hkbF9wdXJnZV9oYW5kbGVzKHBoYmEsIHBhc3luY19jdHgsIGNyaSk7CisJLyogdHJ5IGNvbnRpbnVpbmcgKi8KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZAorYmVpc2NzaV9oZHFfcG9zdF9oYW5kbGVzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKKwkJCSB1OCBoZWFkZXIsIHU4IHVscF9udW0pCit7CisJc3RydWN0IGhkX2FzeW5jX2hhbmRsZSAqcGFzeW5jX2hhbmRsZSwgKnRtcCwgKipzbG90OworCXN0cnVjdCBoZF9hc3luY19jb250ZXh0ICpwYXN5bmNfY3R4OwogCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKLQlzdHJ1Y3QgaHdpX2FzeW5jX3BkdV9jb250ZXh0ICpwYXN5bmNfY3R4OwotCXN0cnVjdCBhc3luY19wZHVfaGFuZGxlICpwYXN5bmNfaGFuZGxlOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBmcmVlX2xpbmssICpwYnVzeV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgKmhmcmVlX2xpc3Q7CiAJc3RydWN0IHBoeXNfYWRkciAqcGFzeW5jX3NnZTsKLQl1bnNpZ25lZCBpbnQgcmluZ19pZCwgbnVtX2VudHJpZXM7Ci0JdW5zaWduZWQgaW50IGhvc3Rfd3JpdGVfbnVtLCBkb29yYmVsbF9vZmZzZXQ7Ci0JdW5zaWduZWQgaW50IHdyaXRhYmxlczsKLQl1bnNpZ25lZCBpbnQgaSA9IDA7Ci0JdTMyIGRvb3JiZWxsID0gMDsKKwl1MzIgcmluZ19pZCwgZG9vcmJlbGwgPSAwOworCXUxNiBpbmRleCwgbnVtX2VudHJpZXM7CisJdTMyIGRvb3JiZWxsX29mZnNldDsKKwl1MTYgcHJvZCA9IDAsIGNvbnM7CiAKIAlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKIAlwYXN5bmNfY3R4ID0gSFdJX0dFVF9BU1lOQ19QRFVfQ1RYKHBod2lfY3RybHIsIHVscF9udW0pOwogCW51bV9lbnRyaWVzID0gcGFzeW5jX2N0eC0+bnVtX2VudHJpZXM7Ci0KLQlpZiAoaXNfaGVhZGVyKSB7Ci0JCXdyaXRhYmxlcyA9IG1pbihwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIud3JpdGFibGVzLAotCQkJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5mcmVlX2VudHJpZXMpOwotCQlwZnJlZV9saW5rID0gcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLmZyZWVfbGlzdC5uZXh0OwotCQlob3N0X3dyaXRlX251bSA9IHBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5ob3N0X3dyaXRlX3B0cjsKKwlpZiAoaGVhZGVyKSB7CisJCWNvbnMgPSBwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuZnJlZV9lbnRyaWVzOworCQloZnJlZV9saXN0ID0gJnBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5mcmVlX2xpc3Q7CiAJCXJpbmdfaWQgPSBwaHdpX2N0cmxyLT5kZWZhdWx0X3BkdV9oZHJbdWxwX251bV0uaWQ7CiAJCWRvb3JiZWxsX29mZnNldCA9IHBod2lfY3RybHItPmRlZmF1bHRfcGR1X2hkclt1bHBfbnVtXS4KLQkJCQkgIGRvb3JiZWxsX29mZnNldDsKKwkJCQkJZG9vcmJlbGxfb2Zmc2V0OwogCX0gZWxzZSB7Ci0JCXdyaXRhYmxlcyA9IG1pbihwYXN5bmNfY3R4LT5hc3luY19kYXRhLndyaXRhYmxlcywKLQkJCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfZW50cmllcyk7Ci0JCXBmcmVlX2xpbmsgPSBwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfbGlzdC5uZXh0OwotCQlob3N0X3dyaXRlX251bSA9IHBhc3luY19jdHgtPmFzeW5jX2RhdGEuaG9zdF93cml0ZV9wdHI7CisJCWNvbnMgPSBwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfZW50cmllczsKKwkJaGZyZWVfbGlzdCA9ICZwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfbGlzdDsKIAkJcmluZ19pZCA9IHBod2lfY3RybHItPmRlZmF1bHRfcGR1X2RhdGFbdWxwX251bV0uaWQ7CiAJCWRvb3JiZWxsX29mZnNldCA9IHBod2lfY3RybHItPmRlZmF1bHRfcGR1X2RhdGFbdWxwX251bV0uCi0JCQkJICBkb29yYmVsbF9vZmZzZXQ7CisJCQkJCWRvb3JiZWxsX29mZnNldDsKIAl9CisJLyogbnVtYmVyIG9mIGVudHJpZXMgcG9zdGVkIG11c3QgYmUgaW4gbXVsdGlwbGVzIG9mIDggKi8KKwlpZiAoY29ucyAlIDgpCisJCXJldHVybjsKIAotCXdyaXRhYmxlcyA9ICh3cml0YWJsZXMgLyA4KSAqIDg7Ci0JaWYgKHdyaXRhYmxlcykgewotCQlmb3IgKGkgPSAwOyBpIDwgd3JpdGFibGVzOyBpKyspIHsKLQkJCXBidXN5X2xpc3QgPQotCQkJICAgIGh3aV9nZXRfYXN5bmNfYnVzeV9saXN0KHBhc3luY19jdHgsIGlzX2hlYWRlciwKLQkJCQkJCSAgICBob3N0X3dyaXRlX251bSk7Ci0JCQlwYXN5bmNfaGFuZGxlID0KLQkJCSAgICBsaXN0X2VudHJ5KHBmcmVlX2xpbmssIHN0cnVjdCBhc3luY19wZHVfaGFuZGxlLAotCQkJCQkJCQlsaW5rKTsKLQkJCVdBUk5fT04oIXBhc3luY19oYW5kbGUpOwotCQkJcGFzeW5jX2hhbmRsZS0+Y29uc3VtZWQgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYXN5bmNfaGFuZGxlLCB0bXAsIGhmcmVlX2xpc3QsIGxpbmspIHsKKwkJbGlzdF9kZWxfaW5pdCgmcGFzeW5jX2hhbmRsZS0+bGluayk7CisJCXBhc3luY19oYW5kbGUtPmlzX2ZpbmFsID0gMDsKKwkJcGFzeW5jX2hhbmRsZS0+YnVmZmVyX2xlbiA9IDA7CiAKLQkJCXBmcmVlX2xpbmsgPSBwZnJlZV9saW5rLT5uZXh0OwotCi0JCQlwYXN5bmNfc2dlID0gaHdpX2dldF9yaW5nX2FkZHJlc3MocGFzeW5jX2N0eCwKLQkJCQkJCWlzX2hlYWRlciwgaG9zdF93cml0ZV9udW0pOwotCi0JCQlwYXN5bmNfc2dlLT5oaSA9IHBhc3luY19oYW5kbGUtPnBhLnUuYTMyLmFkZHJlc3NfbG87Ci0JCQlwYXN5bmNfc2dlLT5sbyA9IHBhc3luY19oYW5kbGUtPnBhLnUuYTMyLmFkZHJlc3NfaGk7Ci0KLQkJCWxpc3RfbW92ZSgmcGFzeW5jX2hhbmRsZS0+bGluaywgcGJ1c3lfbGlzdCk7Ci0KLQkJCWhvc3Rfd3JpdGVfbnVtKys7Ci0JCQlob3N0X3dyaXRlX251bSA9IGhvc3Rfd3JpdGVfbnVtICUgbnVtX2VudHJpZXM7CisJCS8qIGhhbmRsZXMgY2FuIGJlIGNvbnN1bWVkIG91dCBvZiBvcmRlciwgdXNlIGluZGV4IGluIGhhbmRsZSAqLworCQlpbmRleCA9IHBhc3luY19oYW5kbGUtPmluZGV4OworCQlXQVJOX09OKHBhc3luY19oYW5kbGUtPmlzX2hlYWRlciAhPSBoZWFkZXIpOworCQlpZiAoaGVhZGVyKQorCQkJc2xvdCA9ICZwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtpbmRleF0uaGVhZGVyOworCQllbHNlCisJCQlzbG90ID0gJnBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2luZGV4XS5kYXRhOworCQkvKioKKwkJICogVGhlIHNsb3QganVzdCB0cmFja3MgaGFuZGxlJ3MgaG9sZCBhbmQgcmVsZWFzZSwgc28KKwkJICogb3ZlcndyaXRpbmcgYXQgdGhlIHNhbWUgaW5kZXggd29uJ3QgZG8gYW55IGhhcm0gYnV0CisJCSAqIG5lZWRzIHRvIGJlIGNhdWdodC4KKwkJICovCisJCWlmICgqc2xvdCAhPSBOVUxMKSB7CisJCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSVNDU0ksCisJCQkJICAgICJCTV8lZCA6IGFzeW5jIFBEVSAlcyBzbG90IGF0ICV1IG5vdCBlbXB0eVxuIiwKKwkJCQkgICAgaGVhZGVyID8gImhlYWRlciIgOiAiZGF0YSIsIGluZGV4KTsKIAkJfQorCQkvKioKKwkJICogV2UgdXNlIHNhbWUgZnJlZWQgaW5kZXggYXMgaW4gY29tcGxldGlvbiB0byBwb3N0IHNvIHRoaXMKKwkJICogb3BlcmF0aW9uIGlzIG5vdCByZXF1aXJlZCBmb3IgcmVmaWxscy4gSXRzIHJlcXVpcmVkIG9ubHkKKwkJICogZm9yIHJpbmcgY3JlYXRpb24uCisJCSAqLworCQlpZiAoaGVhZGVyKQorCQkJcGFzeW5jX3NnZSA9IHBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5yaW5nX2Jhc2U7CisJCWVsc2UKKwkJCXBhc3luY19zZ2UgPSBwYXN5bmNfY3R4LT5hc3luY19kYXRhLnJpbmdfYmFzZTsKKwkJcGFzeW5jX3NnZSArPSBpbmRleDsKKwkJLyogaWYgaXRzIGEgcmVmaWxsIHRoZW4gYWRkcmVzcyBpcyBzYW1lOyBoaSBpcyBsbyAqLworCQlXQVJOX09OKHBhc3luY19zZ2UtPmhpICYmCisJCQlwYXN5bmNfc2dlLT5oaSAhPSBwYXN5bmNfaGFuZGxlLT5wYS51LmEzMi5hZGRyZXNzX2xvKTsKKwkJV0FSTl9PTihwYXN5bmNfc2dlLT5sbyAmJgorCQkJcGFzeW5jX3NnZS0+bG8gIT0gcGFzeW5jX2hhbmRsZS0+cGEudS5hMzIuYWRkcmVzc19oaSk7CisJCXBhc3luY19zZ2UtPmhpID0gcGFzeW5jX2hhbmRsZS0+cGEudS5hMzIuYWRkcmVzc19sbzsKKwkJcGFzeW5jX3NnZS0+bG8gPSBwYXN5bmNfaGFuZGxlLT5wYS51LmEzMi5hZGRyZXNzX2hpOwogCi0JCWlmIChpc19oZWFkZXIpIHsKLQkJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5ob3N0X3dyaXRlX3B0ciA9Ci0JCQkJCQkJaG9zdF93cml0ZV9udW07Ci0JCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuZnJlZV9lbnRyaWVzIC09IHdyaXRhYmxlczsKLQkJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci53cml0YWJsZXMgLT0gd3JpdGFibGVzOwotCQkJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLmJ1c3lfZW50cmllcyArPSB3cml0YWJsZXM7Ci0JCX0gZWxzZSB7Ci0JCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLmhvc3Rfd3JpdGVfcHRyID0gaG9zdF93cml0ZV9udW07Ci0JCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfZW50cmllcyAtPSB3cml0YWJsZXM7Ci0JCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLndyaXRhYmxlcyAtPSB3cml0YWJsZXM7Ci0JCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLmJ1c3lfZW50cmllcyArPSB3cml0YWJsZXM7Ci0JCX0KLQotCQlkb29yYmVsbCB8PSByaW5nX2lkICYgREJfREVGX1BEVV9SSU5HX0lEX01BU0s7Ci0JCWRvb3JiZWxsIHw9IDEgPDwgREJfREVGX1BEVV9SRUFSTV9TSElGVDsKLQkJZG9vcmJlbGwgfD0gMCA8PCBEQl9ERUZfUERVX0VWRU5UX1NISUZUOwotCQlkb29yYmVsbCB8PSAod3JpdGFibGVzICYgREJfREVGX1BEVV9DUVBST0NfTUFTSykKLQkJCQkJPDwgREJfREVGX1BEVV9DUVBST0NfU0hJRlQ7Ci0KLQkJaW93cml0ZTMyKGRvb3JiZWxsLCBwaGJhLT5kYl92YSArIGRvb3JiZWxsX29mZnNldCk7CisJCSpzbG90ID0gcGFzeW5jX2hhbmRsZTsKKwkJaWYgKCsrcHJvZCA9PSBjb25zKQorCQkJYnJlYWs7CiAJfQorCWlmIChoZWFkZXIpCisJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5mcmVlX2VudHJpZXMgLT0gcHJvZDsKKwllbHNlCisJCXBhc3luY19jdHgtPmFzeW5jX2RhdGEuZnJlZV9lbnRyaWVzIC09IHByb2Q7CisKKwlkb29yYmVsbCB8PSByaW5nX2lkICYgREJfREVGX1BEVV9SSU5HX0lEX01BU0s7CisJZG9vcmJlbGwgfD0gMSA8PCBEQl9ERUZfUERVX1JFQVJNX1NISUZUOworCWRvb3JiZWxsIHw9IDAgPDwgREJfREVGX1BEVV9FVkVOVF9TSElGVDsKKwlkb29yYmVsbCB8PSAocHJvZCAmIERCX0RFRl9QRFVfQ1FQUk9DX01BU0spIDw8IERCX0RFRl9QRFVfQ1FQUk9DX1NISUZUOworCWlvd3JpdGUzMihkb29yYmVsbCwgcGhiYS0+ZGJfdmEgKyBkb29yYmVsbF9vZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCBod2lfZmx1c2hfZGVmYXVsdF9wZHVfYnVmZmVyKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKLQkJCQkJIHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKLQkJCQkJIHN0cnVjdCBpX3RfZHBkdV9jcWUgKnBkcGR1X2NxZSkKK3N0YXRpYyB2b2lkCitiZWlzY3NpX2hkcV9wcm9jZXNzX2NvbXBsKHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKKwkJCSAgc3RydWN0IGlfdF9kcGR1X2NxZSAqcGRwZHVfY3FlKQogeworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGJlaXNjc2lfY29ubi0+cGhiYTsKKwlzdHJ1Y3QgaGRfYXN5bmNfaGFuZGxlICpwYXN5bmNfaGFuZGxlID0gTlVMTDsKKwlzdHJ1Y3QgaGRfYXN5bmNfY29udGV4dCAqcGFzeW5jX2N0eDsKIAlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7Ci0Jc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCAqcGFzeW5jX2N0eDsKLQlzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSAqcGFzeW5jX2hhbmRsZSA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IGNxX2luZGV4ID0gLTE7Ci0JdWludDE2X3QgY3JpX2luZGV4ID0gQkVfR0VUX0NSSV9GUk9NX0NJRCgKLQkJCSAgICAgYmVpc2NzaV9jb25uLT5iZWlzY3NpX2Nvbm5fY2lkKTsKKwl1MTYgY2lkX2NyaTsKKwl1OCB1bHBfbnVtOwogCiAJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7Ci0JcGFzeW5jX2N0eCA9IEhXSV9HRVRfQVNZTkNfUERVX0NUWChwaHdpX2N0cmxyLAotCQkgICAgIEJFSVNDU0lfR0VUX1VMUF9GUk9NX0NSSShwaHdpX2N0cmxyLAotCQkgICAgIGNyaV9pbmRleCkpOworCWNpZF9jcmkgPSBCRV9HRVRfQ1JJX0ZST01fQ0lEKGJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZCk7CisJdWxwX251bSA9IEJFSVNDU0lfR0VUX1VMUF9GUk9NX0NSSShwaHdpX2N0cmxyLCBjaWRfY3JpKTsKKwlwYXN5bmNfY3R4ID0gSFdJX0dFVF9BU1lOQ19QRFVfQ1RYKHBod2lfY3RybHIsIHVscF9udW0pOworCXBhc3luY19oYW5kbGUgPSBiZWlzY3NpX2hkbF9nZXRfaGFuZGxlKGJlaXNjc2lfY29ubiwgcGFzeW5jX2N0eCwKKwkJCQkJICAgICAgIHBkcGR1X2NxZSk7CisJaWYgKCFwYXN5bmNfaGFuZGxlKQorCQlyZXR1cm47CiAKLQlwYXN5bmNfaGFuZGxlID0gaHdpX2dldF9hc3luY19oYW5kbGUocGhiYSwgYmVpc2NzaV9jb25uLCBwYXN5bmNfY3R4LAotCQkJCQkgICAgIHBkcGR1X2NxZSwgJmNxX2luZGV4KTsKLQlCVUdfT04ocGFzeW5jX2hhbmRsZS0+aXNfaGVhZGVyICE9IDApOwotCWlmIChwYXN5bmNfaGFuZGxlLT5jb25zdW1lZCA9PSAwKQotCQlod2lfdXBkYXRlX2FzeW5jX3dyaXRhYmxlcyhwaGJhLCBwYXN5bmNfY3R4LAotCQkJCQkgICBwYXN5bmNfaGFuZGxlLT5pc19oZWFkZXIsIGNxX2luZGV4KTsKLQotCWh3aV9mcmVlX2FzeW5jX21zZyhwaGJhLCBwYXN5bmNfY3R4LCBwYXN5bmNfaGFuZGxlLT5jcmkpOwotCWh3aV9wb3N0X2FzeW5jX2J1ZmZlcnMocGhiYSwgcGFzeW5jX2hhbmRsZS0+aXNfaGVhZGVyLAotCQkJICAgICAgIEJFSVNDU0lfR0VUX1VMUF9GUk9NX0NSSShwaHdpX2N0cmxyLAotCQkJICAgICAgIGNyaV9pbmRleCkpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1od2lfZndkX2FzeW5jX21zZyhzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCi0JCSAgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAotCQkgIHN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQgKnBhc3luY19jdHgsIHVuc2lnbmVkIHNob3J0IGNyaSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdDsKLQlzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSAqcGFzeW5jX2hhbmRsZTsKLQl2b2lkICpwaGRyID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgaGRyX2xlbiA9IDAsIGJ1Zl9sZW4gPSAwOwotCXVuc2lnbmVkIGludCBzdGF0dXMsIGluZGV4ID0gMCwgb2Zmc2V0ID0gMDsKLQl2b2lkICpwZmlyc3RfYnVmZmVyID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgbnVtX2J1ZiA9IDA7Ci0KLQlwbGlzdCA9ICZwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUubGlzdDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocGFzeW5jX2hhbmRsZSwgcGxpc3QsIGxpbmspIHsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCXBoZHIgPSBwYXN5bmNfaGFuZGxlLT5wYnVmZmVyOwotCQkJaGRyX2xlbiA9IHBhc3luY19oYW5kbGUtPmJ1ZmZlcl9sZW47Ci0JCX0gZWxzZSB7Ci0JCQlidWZfbGVuID0gcGFzeW5jX2hhbmRsZS0+YnVmZmVyX2xlbjsKLQkJCWlmICghbnVtX2J1ZikgewotCQkJCXBmaXJzdF9idWZmZXIgPSBwYXN5bmNfaGFuZGxlLT5wYnVmZmVyOwotCQkJCW51bV9idWYrKzsKLQkJCX0KLQkJCW1lbWNweShwZmlyc3RfYnVmZmVyICsgb2Zmc2V0LAotCQkJICAgICAgIHBhc3luY19oYW5kbGUtPnBidWZmZXIsIGJ1Zl9sZW4pOwotCQkJb2Zmc2V0ICs9IGJ1Zl9sZW47Ci0JCX0KLQkJaW5kZXgrKzsKLQl9Ci0KLQlzdGF0dXMgPSBiZWlzY3NpX3Byb2Nlc3NfYXN5bmNfcGR1KGJlaXNjc2lfY29ubiwgcGhiYSwKLQkJCQkJICAgIHBoZHIsIGhkcl9sZW4sIHBmaXJzdF9idWZmZXIsCi0JCQkJCSAgICBvZmZzZXQpOwotCi0JaHdpX2ZyZWVfYXN5bmNfbXNnKHBoYmEsIHBhc3luY19jdHgsIGNyaSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLWh3aV9nYXRoZXJfYXN5bmNfcGR1KHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKLQkJICAgICBzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCSAgICAgc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUgKnBhc3luY19oYW5kbGUpCi17Ci0Jc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCAqcGFzeW5jX2N0eDsKLQlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7Ci0JdW5zaWduZWQgaW50IGJ5dGVzX25lZWRlZCA9IDAsIHN0YXR1cyA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgY3JpID0gcGFzeW5jX2hhbmRsZS0+Y3JpOwotCXN0cnVjdCBwZHVfYmFzZSAqcHBkdTsKLQotCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOwotCXBhc3luY19jdHggPSBIV0lfR0VUX0FTWU5DX1BEVV9DVFgocGh3aV9jdHJsciwKLQkJICAgICBCRUlTQ1NJX0dFVF9VTFBfRlJPTV9DUkkocGh3aV9jdHJsciwKLQkJICAgICBCRV9HRVRfQ1JJX0ZST01fQ0lEKGJlaXNjc2lfY29ubi0+Ci0JCQkJIGJlaXNjc2lfY29ubl9jaWQpKSk7Ci0KLQlsaXN0X2RlbCgmcGFzeW5jX2hhbmRsZS0+bGluayk7Ci0JaWYgKHBhc3luY19oYW5kbGUtPmlzX2hlYWRlcikgewotCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuYnVzeV9lbnRyaWVzLS07Ci0JCWlmIChwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUuaGRyX3JlY2VpdmVkKSB7Ci0JCQlod2lfZnJlZV9hc3luY19tc2cocGhiYSwgcGFzeW5jX2N0eCwgY3JpKTsKLQkJCUJVRygpOwotCQl9Ci0KLQkJcGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbY3JpXS53YWl0X3F1ZXVlLmJ5dGVzX3JlY2VpdmVkID0gMDsKLQkJcGFzeW5jX2N0eC0+YXN5bmNfZW50cnlbY3JpXS53YWl0X3F1ZXVlLmhkcl9yZWNlaXZlZCA9IDE7Ci0JCXBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS5oZHJfbGVuID0KLQkJCQkodW5zaWduZWQgc2hvcnQpcGFzeW5jX2hhbmRsZS0+YnVmZmVyX2xlbjsKLQkJbGlzdF9hZGRfdGFpbCgmcGFzeW5jX2hhbmRsZS0+bGluaywKLQkJCSAgICAgICZwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUubGlzdCk7Ci0KLQkJcHBkdSA9IHBhc3luY19oYW5kbGUtPnBidWZmZXI7Ci0JCWJ5dGVzX25lZWRlZCA9ICgoKChwcGR1LT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9wZHVfYmFzZSwKLQkJCWRhdGFfbGVuX2hpKSAvIDMyXSAmIFBEVUJBU0VfREFUQUxFTkhJX01BU0spIDw8IDgpICYKLQkJCTB4RkZGRjAwMDApIHwgKChiZTE2X3RvX2NwdSgocHBkdS0+Ci0JCQlkd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9wZHVfYmFzZSwgZGF0YV9sZW5fbG8pIC8gMzJdCi0JCQkmIFBEVUJBU0VfREFUQUxFTkxPX01BU0spID4+IDE2KSkgJiAweDAwMDBGRkZGKSk7Ci0KLQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQlwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUuYnl0ZXNfbmVlZGVkID0KLQkJCSAgICBieXRlc19uZWVkZWQ7Ci0KLQkJCWlmIChieXRlc19uZWVkZWQgPT0gMCkKLQkJCQlzdGF0dXMgPSBod2lfZndkX2FzeW5jX21zZyhiZWlzY3NpX2Nvbm4sIHBoYmEsCi0JCQkJCQkJICAgcGFzeW5jX2N0eCwgY3JpKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXBhc3luY19jdHgtPmFzeW5jX2RhdGEuYnVzeV9lbnRyaWVzLS07Ci0JCWlmIChwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUuaGRyX3JlY2VpdmVkKSB7Ci0JCQlsaXN0X2FkZF90YWlsKCZwYXN5bmNfaGFuZGxlLT5saW5rLAotCQkJCSAgICAgICZwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUuCi0JCQkJICAgICAgbGlzdCk7Ci0JCQlwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtjcmldLndhaXRfcXVldWUuCi0JCQkJYnl0ZXNfcmVjZWl2ZWQgKz0KLQkJCQkodW5zaWduZWQgc2hvcnQpcGFzeW5jX2hhbmRsZS0+YnVmZmVyX2xlbjsKLQotCQkJaWYgKHBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS4KLQkJCSAgICBieXRlc19yZWNlaXZlZCA+PQotCQkJICAgIHBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2NyaV0ud2FpdF9xdWV1ZS4KLQkJCSAgICBieXRlc19uZWVkZWQpCi0JCQkJc3RhdHVzID0gaHdpX2Z3ZF9hc3luY19tc2coYmVpc2NzaV9jb25uLCBwaGJhLAotCQkJCQkJCSAgIHBhc3luY19jdHgsIGNyaSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgaHdpX3Byb2Nlc3NfZGVmYXVsdF9wZHVfcmluZyhzdHJ1Y3QgYmVpc2NzaV9jb25uICpiZWlzY3NpX2Nvbm4sCi0JCQkJCSBzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCQkJCSBzdHJ1Y3QgaV90X2RwZHVfY3FlICpwZHBkdV9jcWUpCi17Ci0Jc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOwotCXN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQgKnBhc3luY19jdHg7Ci0Jc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUgKnBhc3luY19oYW5kbGUgPSBOVUxMOwotCXVuc2lnbmVkIGludCBjcV9pbmRleCA9IC0xOwotCXVpbnQxNl90IGNyaV9pbmRleCA9IEJFX0dFVF9DUklfRlJPTV9DSUQoCi0JCQkgICAgIGJlaXNjc2lfY29ubi0+YmVpc2NzaV9jb25uX2NpZCk7Ci0KLQlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKLQlwYXN5bmNfY3R4ID0gSFdJX0dFVF9BU1lOQ19QRFVfQ1RYKHBod2lfY3RybHIsCi0JCSAgICAgQkVJU0NTSV9HRVRfVUxQX0ZST01fQ1JJKHBod2lfY3RybHIsCi0JCSAgICAgY3JpX2luZGV4KSk7Ci0KLQlwYXN5bmNfaGFuZGxlID0gaHdpX2dldF9hc3luY19oYW5kbGUocGhiYSwgYmVpc2NzaV9jb25uLCBwYXN5bmNfY3R4LAotCQkJCQkgICAgIHBkcGR1X2NxZSwgJmNxX2luZGV4KTsKLQotCWlmIChwYXN5bmNfaGFuZGxlLT5jb25zdW1lZCA9PSAwKQotCQlod2lfdXBkYXRlX2FzeW5jX3dyaXRhYmxlcyhwaGJhLCBwYXN5bmNfY3R4LAotCQkJCQkgICBwYXN5bmNfaGFuZGxlLT5pc19oZWFkZXIsIGNxX2luZGV4KTsKLQotCWh3aV9nYXRoZXJfYXN5bmNfcGR1KGJlaXNjc2lfY29ubiwgcGhiYSwgcGFzeW5jX2hhbmRsZSk7Ci0JaHdpX3Bvc3RfYXN5bmNfYnVmZmVycyhwaGJhLCBwYXN5bmNfaGFuZGxlLT5pc19oZWFkZXIsCi0JCQkgICAgICAgQkVJU0NTSV9HRVRfVUxQX0ZST01fQ1JJKAotCQkJICAgICAgIHBod2lfY3RybHIsIGNyaV9pbmRleCkpOworCWJlaXNjc2lfaGRsX2dhdGhlcl9wZHUoYmVpc2NzaV9jb25uLCBwYXN5bmNfY3R4LCBwYXN5bmNfaGFuZGxlKTsKKwliZWlzY3NpX2hkcV9wb3N0X2hhbmRsZXMocGhiYSwgcGFzeW5jX2hhbmRsZS0+aXNfaGVhZGVyLCB1bHBfbnVtKTsKIH0KIAogdm9pZCBiZWlzY3NpX3Byb2Nlc3NfbWNjX2NxKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKQEAgLTIwNTEsNiArMTgxNiw5IEBACiAJbWNjX2NvbXBsID0gcXVldWVfdGFpbF9ub2RlKG1jY19jcSk7CiAJbWNjX2NvbXBsLT5mbGFncyA9IGxlMzJfdG9fY3B1KG1jY19jb21wbC0+ZmxhZ3MpOwogCXdoaWxlIChtY2NfY29tcGwtPmZsYWdzICYgQ1FFX0ZMQUdTX1ZBTElEX01BU0spIHsKKwkJaWYgKGJlaXNjc2lfaGJhX2luX2Vycm9yKHBoYmEpKQorCQkJcmV0dXJuOworCiAJCWlmIChudW1fcHJvY2Vzc2VkID49IDMyKSB7CiAJCQlod2lfcmluZ19jcV9kYihwaGJhLCBtY2NfY3EtPmlkLAogCQkJCQludW1fcHJvY2Vzc2VkLCAwKTsKQEAgLTIwNzMsNiArMTg0MSwxOSBAQAogCQlod2lfcmluZ19jcV9kYihwaGJhLCBtY2NfY3EtPmlkLCBudW1fcHJvY2Vzc2VkLCAxKTsKIH0KIAorc3RhdGljIHZvaWQgYmVpc2NzaV9tY2Nfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGJlX2VxX29iaiAqcGJlX2VxOworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYTsKKworCXBiZV9lcSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfZXFfb2JqLCBtY2Nfd29yayk7CisJcGhiYSA9IHBiZV9lcS0+cGhiYTsKKwliZWlzY3NpX3Byb2Nlc3NfbWNjX2NxKHBoYmEpOworCS8qIHJlYXJtIEVRIGZvciBmdXJ0aGVyIGludGVycnVwdHMgKi8KKwlpZiAoIWJlaXNjc2lfaGJhX2luX2Vycm9yKHBoYmEpKQorCQlod2lfcmluZ19lcV9kYihwaGJhLCBwYmVfZXEtPnEuaWQsIDAsIDAsIDEsIDEpOworfQorCiAvKioKICAqIGJlaXNjc2lfcHJvY2Vzc19jcSgpLSBQcm9jZXNzIHRoZSBDb21wbGV0aW9uIFF1ZXVlCiAgKiBAcGJlX2VxOiBFdmVudCBRIG9uIHdoaWNoIHRoZSBDb21wbGV0aW9uIGhhcyBjb21lCkBAIC0yMTAxLDYgKzE4ODIsOSBAQAogCiAJd2hpbGUgKHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgdmFsaWQpIC8gMzJdICYKIAkgICAgICAgQ1FFX1ZBTElEX01BU0spIHsKKwkJaWYgKGJlaXNjc2lfaGJhX2luX2Vycm9yKHBoYmEpKQorCQkJcmV0dXJuIDA7CisKIAkJYmVfZHdzX2xlX3RvX2NwdShzb2wsIHNpemVvZihzdHJ1Y3Qgc29sX2NxZSkpOwogCiAJCSBjb2RlID0gKHNvbC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfc29sX2NxZSwgY29kZSkgLwpAQCAtMjE2NSw4ICsxOTQ5LDggQEAKIAkJCQkgICAgY3FlX2Rlc2NbY29kZV0sIGNvZGUsIGNpZCk7CiAKIAkJCXNwaW5fbG9ja19iaCgmcGhiYS0+YXN5bmNfcGR1X2xvY2spOwotCQkJaHdpX3Byb2Nlc3NfZGVmYXVsdF9wZHVfcmluZyhiZWlzY3NpX2Nvbm4sIHBoYmEsCi0JCQkJCSAgICAgKHN0cnVjdCBpX3RfZHBkdV9jcWUgKilzb2wpOworCQkJYmVpc2NzaV9oZHFfcHJvY2Vzc19jb21wbChiZWlzY3NpX2Nvbm4sCisJCQkJCQkgIChzdHJ1Y3QgaV90X2RwZHVfY3FlICopc29sKTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZwaGJhLT5hc3luY19wZHVfbG9jayk7CiAJCQlicmVhazsKIAkJY2FzZSBVTlNPTF9EQVRBX05PVElGWToKQEAgLTIxNzYsOCArMTk2MCw4IEBACiAJCQkJICAgIGNxZV9kZXNjW2NvZGVdLCBjb2RlLCBjaWQpOwogCiAJCQlzcGluX2xvY2tfYmgoJnBoYmEtPmFzeW5jX3BkdV9sb2NrKTsKLQkJCWh3aV9wcm9jZXNzX2RlZmF1bHRfcGR1X3JpbmcoYmVpc2NzaV9jb25uLCBwaGJhLAotCQkJCQkgICAgIChzdHJ1Y3QgaV90X2RwZHVfY3FlICopc29sKTsKKwkJCWJlaXNjc2lfaGRxX3Byb2Nlc3NfY29tcGwoYmVpc2NzaV9jb25uLAorCQkJCQkJICAoc3RydWN0IGlfdF9kcGR1X2NxZSAqKXNvbCk7CiAJCQlzcGluX3VubG9ja19iaCgmcGhiYS0+YXN5bmNfcGR1X2xvY2spOwogCQkJYnJlYWs7CiAJCWNhc2UgQ1hOX0lOVkFMSURBVEVfSU5ERVhfTk9USUZZOgpAQCAtMjIxMyw4ICsxOTk3LDkgQEAKIAkJCQkgICAgIkJNXyVkIDogIERyb3BwaW5nICVzWyVkXSBvbiBEUERVIHJpbmcgb24gQ0lEIDogJWRcbiIsCiAJCQkJICAgIGNxZV9kZXNjW2NvZGVdLCBjb2RlLCBjaWQpOwogCQkJc3Bpbl9sb2NrX2JoKCZwaGJhLT5hc3luY19wZHVfbG9jayk7Ci0JCQlod2lfZmx1c2hfZGVmYXVsdF9wZHVfYnVmZmVyKHBoYmEsIGJlaXNjc2lfY29ubiwKLQkJCQkJICAgICAoc3RydWN0IGlfdF9kcGR1X2NxZSAqKSBzb2wpOworCQkJLyogZHJpdmVyIGNvbnN1bWVzIHRoZSBlbnRyeSBhbmQgZHJvcHMgdGhlIGNvbnRlbnRzICovCisJCQliZWlzY3NpX2hkcV9wcm9jZXNzX2NvbXBsKGJlaXNjc2lfY29ubiwKKwkJCQkJCSAgKHN0cnVjdCBpX3RfZHBkdV9jcWUgKilzb2wpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnBoYmEtPmFzeW5jX3BkdV9sb2NrKTsKIAkJCWJyZWFrOwogCQljYXNlIENYTl9LSUxMRURfUERVX1NJWkVfRVhDRUVEU19EU0w6CkBAIC0yMjYyLDYwICsyMDQ3LDMyIEBACiAJcmV0dXJuIHRvdGFsOwogfQogCi12b2lkIGJlaXNjc2lfcHJvY2Vzc19hbGxfY3FzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKLQlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7Ci0Jc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOwotCXN0cnVjdCBiZV9lcV9vYmogKnBiZV9lcSA9Ci0JICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfZXFfb2JqLCB3b3JrX2Nxcyk7Ci0KLQlwaGJhID0gcGJlX2VxLT5waGJhOwotCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOwotCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKLQotCWlmIChwYmVfZXEtPnRvZG9fbWNjX2NxKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwaGJhLT5pc3JfbG9jaywgZmxhZ3MpOwotCQlwYmVfZXEtPnRvZG9fbWNjX2NxID0gZmFsc2U7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7Ci0JCWJlaXNjc2lfcHJvY2Vzc19tY2NfY3EocGhiYSk7Ci0JfQotCi0JaWYgKHBiZV9lcS0+dG9kb19jcSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aXNyX2xvY2ssIGZsYWdzKTsKLQkJcGJlX2VxLT50b2RvX2NxID0gZmFsc2U7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmlzcl9sb2NrLCBmbGFncyk7Ci0JCWJlaXNjc2lfcHJvY2Vzc19jcShwYmVfZXEsIEJFMl9NQVhfTlVNX0NRX1BST0MpOwotCX0KLQotCS8qIHJlYXJtIEVRIGZvciBmdXJ0aGVyIGludGVycnVwdHMgKi8KLQlod2lfcmluZ19lcV9kYihwaGJhLCBwYmVfZXEtPnEuaWQsIDAsIDAsIDEsIDEpOwotfQotCiBzdGF0aWMgaW50IGJlX2lvcG9sbChzdHJ1Y3QgaXJxX3BvbGwgKmlvcCwgaW50IGJ1ZGdldCkKIHsKLQl1bnNpZ25lZCBpbnQgcmV0LCBudW1fZXFfcHJvY2Vzc2VkOworCXVuc2lnbmVkIGludCByZXQsIGlvX2V2ZW50czsKIAlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmE7CiAJc3RydWN0IGJlX2VxX29iaiAqcGJlX2VxOwogCXN0cnVjdCBiZV9lcV9lbnRyeSAqZXFlID0gTlVMTDsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZXE7CiAKLQludW1fZXFfcHJvY2Vzc2VkID0gMDsKIAlwYmVfZXEgPSBjb250YWluZXJfb2YoaW9wLCBzdHJ1Y3QgYmVfZXFfb2JqLCBpb3BvbGwpOwogCXBoYmEgPSBwYmVfZXEtPnBoYmE7CisJaWYgKGJlaXNjc2lfaGJhX2luX2Vycm9yKHBoYmEpKSB7CisJCWlycV9wb2xsX2NvbXBsZXRlKGlvcCk7CisJCXJldHVybiAwOworCX0KKworCWlvX2V2ZW50cyA9IDA7CiAJZXEgPSAmcGJlX2VxLT5xOwogCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7Ci0KIAl3aGlsZSAoZXFlLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQpIC8gMzJdICYKIAkJCUVRRV9WQUxJRF9NQVNLKSB7CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkLCBlcWUsIDApOwogCQlxdWV1ZV90YWlsX2luYyhlcSk7CiAJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7Ci0JCW51bV9lcV9wcm9jZXNzZWQrKzsKKwkJaW9fZXZlbnRzKys7CiAJfQotCi0JaHdpX3JpbmdfZXFfZGIocGhiYSwgZXEtPmlkLCAxLCBudW1fZXFfcHJvY2Vzc2VkLCAwLCAxKTsKKwlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDEsIGlvX2V2ZW50cywgMCwgMSk7CiAKIAlyZXQgPSBiZWlzY3NpX3Byb2Nlc3NfY3EocGJlX2VxLCBidWRnZXQpOwogCXBiZV9lcS0+Y3FfY291bnQgKz0gcmV0OwpAQCAtMjMyNSw3ICsyMDgyLDggQEAKIAkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19JTywKIAkJCSAgICAiQk1fJWQgOiByZWFybSBwYmVfZXEtPnEuaWQgPSVkIHJldCAlZFxuIiwKIAkJCSAgICBwYmVfZXEtPnEuaWQsIHJldCk7Ci0JCWh3aV9yaW5nX2VxX2RiKHBoYmEsIHBiZV9lcS0+cS5pZCwgMCwgMCwgMSwgMSk7CisJCWlmICghYmVpc2NzaV9oYmFfaW5fZXJyb3IocGhiYSkpCisJCQlod2lfcmluZ19lcV9kYihwaGJhLCBwYmVfZXEtPnEuaWQsIDAsIDAsIDEsIDEpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMjY5MSwyMCArMjQ0OSwyMCBAQAogCQkJCQkgICh1bHBfbnVtICogTUVNX0RFU0NSX09GRlNFVCkpOwogCQkJcGhiYS0+bWVtX3JlcVttZW1fZGVzY3JfaW5kZXhdID0KIAkJCQkJICBCRUlTQ1NJX0dFVF9DSURfQ09VTlQocGhiYSwgdWxwX251bSkgKgotCQkJCQkgIHNpemVvZihzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSk7CisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBoZF9hc3luY19oYW5kbGUpOwogCiAJCQltZW1fZGVzY3JfaW5kZXggPSAoSFdJX01FTV9BU1lOQ19EQVRBX0hBTkRMRV9VTFAwICsKIAkJCQkJICAodWxwX251bSAqIE1FTV9ERVNDUl9PRkZTRVQpKTsKIAkJCXBoYmEtPm1lbV9yZXFbbWVtX2Rlc2NyX2luZGV4XSA9CiAJCQkJCSAgQkVJU0NTSV9HRVRfQ0lEX0NPVU5UKHBoYmEsIHVscF9udW0pICoKLQkJCQkJICBzaXplb2Yoc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUpOworCQkJCQkgIHNpemVvZihzdHJ1Y3QgaGRfYXN5bmNfaGFuZGxlKTsKIAogCQkJbWVtX2Rlc2NyX2luZGV4ID0gKEhXSV9NRU1fQVNZTkNfUERVX0NPTlRFWFRfVUxQMCArCiAJCQkJCSAgKHVscF9udW0gKiBNRU1fREVTQ1JfT0ZGU0VUKSk7CiAJCQlwaGJhLT5tZW1fcmVxW21lbV9kZXNjcl9pbmRleF0gPQotCQkJCQkgIHNpemVvZihzdHJ1Y3QgaHdpX2FzeW5jX3BkdV9jb250ZXh0KSArCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBoZF9hc3luY19jb250ZXh0KSArCiAJCQkJCSAoQkVJU0NTSV9HRVRfQ0lEX0NPVU5UKHBoYmEsIHVscF9udW0pICoKLQkJCQkJICBzaXplb2Yoc3RydWN0IGh3aV9hc3luY19lbnRyeSkpOworCQkJCQkgIHNpemVvZihzdHJ1Y3QgaGRfYXN5bmNfZW50cnkpKTsKIAkJfQogCX0KIH0KQEAgLTI5NjMsMzUgKzI3MjEsMzQgQEAKIAl1aW50OF90IHVscF9udW07CiAJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOwogCXN0cnVjdCBoYmFfcGFyYW1ldGVycyAqcCA9ICZwaGJhLT5wYXJhbXM7Ci0Jc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCAqcGFzeW5jX2N0eDsKLQlzdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSAqcGFzeW5jX2hlYWRlcl9oLCAqcGFzeW5jX2RhdGFfaDsKKwlzdHJ1Y3QgaGRfYXN5bmNfY29udGV4dCAqcGFzeW5jX2N0eDsKKwlzdHJ1Y3QgaGRfYXN5bmNfaGFuZGxlICpwYXN5bmNfaGVhZGVyX2gsICpwYXN5bmNfZGF0YV9oOwogCXVuc2lnbmVkIGludCBpbmRleCwgaWR4LCBudW1fcGVyX21lbSwgbnVtX2FzeW5jX2RhdGE7CiAJc3RydWN0IGJlX21lbV9kZXNjcmlwdG9yICptZW1fZGVzY3I7CiAKIAlmb3IgKHVscF9udW0gPSAwOyB1bHBfbnVtIDwgQkVJU0NTSV9VTFBfQ09VTlQ7IHVscF9udW0rKykgewogCQlpZiAodGVzdF9iaXQodWxwX251bSwgJnBoYmEtPmZ3X2NvbmZpZy51bHBfc3VwcG9ydGVkKSkgewotCisJCQkgLyogZ2V0IGFzeW5jX2N0eCBmb3IgZWFjaCBVTFAgKi8KIAkJCW1lbV9kZXNjciA9IChzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKilwaGJhLT5pbml0X21lbTsKIAkJCW1lbV9kZXNjciArPSAoSFdJX01FTV9BU1lOQ19QRFVfQ09OVEVYVF9VTFAwICsKIAkJCQkgICAgICh1bHBfbnVtICogTUVNX0RFU0NSX09GRlNFVCkpOwogCiAJCQlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKIAkJCXBod2lfY3RybHItPnBod2lfY3R4dC0+cGFzeW5jX2N0eFt1bHBfbnVtXSA9Ci0JCQkJKHN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQgKikKKwkJCQkoc3RydWN0IGhkX2FzeW5jX2NvbnRleHQgKikKIAkJCQkgbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzOwogCiAJCQlwYXN5bmNfY3R4ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0LT5wYXN5bmNfY3R4W3VscF9udW1dOwogCQkJbWVtc2V0KHBhc3luY19jdHgsIDAsIHNpemVvZigqcGFzeW5jX2N0eCkpOwogCiAJCQlwYXN5bmNfY3R4LT5hc3luY19lbnRyeSA9Ci0JCQkJCShzdHJ1Y3QgaHdpX2FzeW5jX2VudHJ5ICopCisJCQkJCShzdHJ1Y3QgaGRfYXN5bmNfZW50cnkgKikKIAkJCQkJKChsb25nIHVuc2lnbmVkIGludClwYXN5bmNfY3R4ICsKLQkJCQkJc2l6ZW9mKHN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZF9hc3luY19jb250ZXh0KSk7CiAKIAkJCXBhc3luY19jdHgtPm51bV9lbnRyaWVzID0gQkVJU0NTSV9HRVRfQ0lEX0NPVU5UKHBoYmEsCiAJCQkJCQkgIHVscF9udW0pOwotCQkJcGFzeW5jX2N0eC0+YnVmZmVyX3NpemUgPSBwLT5kZWZwZHVfaGRyX3N6OwotCisJCQkvKiBzZXR1cCBoZWFkZXIgYnVmZmVycyAqLwogCQkJbWVtX2Rlc2NyID0gKHN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqKXBoYmEtPmluaXRfbWVtOwogCQkJbWVtX2Rlc2NyICs9IEhXSV9NRU1fQVNZTkNfSEVBREVSX0JVRl9VTFAwICsKIAkJCQkodWxwX251bSAqIE1FTV9ERVNDUl9PRkZTRVQpOwpAQCAtMzAwOCw2ICsyNzY1LDcgQEAKIAkJCQkJICAgICJCTV8lZCA6IE5vIFZpcnR1YWwgYWRkcmVzcyBmb3IgVUxQIDogJWRcbiIsCiAJCQkJCSAgICB1bHBfbnVtKTsKIAorCQkJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLmJ1ZmZlcl9zaXplID0gcC0+ZGVmcGR1X2hkcl9zejsKIAkJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci52YV9iYXNlID0KIAkJCQltZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3M7CiAKQEAgLTMwMTUsNiArMjc3Myw3IEBACiAJCQkJbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0uCiAJCQkJYnVzX2FkZHJlc3MudS5hNjQuYWRkcmVzczsKIAorCQkJLyogc2V0dXAgaGVhZGVyIGJ1ZmZlciBzZ2xzICovCiAJCQltZW1fZGVzY3IgPSAoc3RydWN0IGJlX21lbV9kZXNjcmlwdG9yICopcGhiYS0+aW5pdF9tZW07CiAJCQltZW1fZGVzY3IgKz0gSFdJX01FTV9BU1lOQ19IRUFERVJfUklOR19VTFAwICsKIAkJCQkgICAgICh1bHBfbnVtICogTUVNX0RFU0NSX09GRlNFVCk7CkBAIC0zMDM0LDYgKzI3OTMsNyBAQAogCQkJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLnJpbmdfYmFzZSA9CiAJCQkJbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzOwogCisJCQkvKiBzZXR1cCBoZWFkZXIgYnVmZmVyIGhhbmRsZXMgKi8KIAkJCW1lbV9kZXNjciA9IChzdHJ1Y3QgYmVfbWVtX2Rlc2NyaXB0b3IgKilwaGJhLT5pbml0X21lbTsKIAkJCW1lbV9kZXNjciArPSBIV0lfTUVNX0FTWU5DX0hFQURFUl9IQU5ETEVfVUxQMCArCiAJCQkJICAgICAodWxwX251bSAqIE1FTV9ERVNDUl9PRkZTRVQpOwpAQCAtMzA1Miw5ICsyODEyLDkgQEAKIAogCQkJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLmhhbmRsZV9iYXNlID0KIAkJCQltZW1fZGVzY3ItPm1lbV9hcnJheVswXS52aXJ0dWFsX2FkZHJlc3M7Ci0JCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIud3JpdGFibGVzID0gMDsKIAkJCUlOSVRfTElTVF9IRUFEKCZwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuZnJlZV9saXN0KTsKIAorCQkJLyogc2V0dXAgZGF0YSBidWZmZXIgc2dscyAqLwogCQkJbWVtX2Rlc2NyID0gKHN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqKXBoYmEtPmluaXRfbWVtOwogCQkJbWVtX2Rlc2NyICs9IEhXSV9NRU1fQVNZTkNfREFUQV9SSU5HX1VMUDAgKwogCQkJCSAgICAgKHVscF9udW0gKiBNRU1fREVTQ1JfT0ZGU0VUKTsKQEAgLTMwNzQsNiArMjgzNCw3IEBACiAJCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLnJpbmdfYmFzZSA9CiAJCQkJbWVtX2Rlc2NyLT5tZW1fYXJyYXlbMF0udmlydHVhbF9hZGRyZXNzOwogCisJCQkvKiBzZXR1cCBkYXRhIGJ1ZmZlciBoYW5kbGVzICovCiAJCQltZW1fZGVzY3IgPSAoc3RydWN0IGJlX21lbV9kZXNjcmlwdG9yICopcGhiYS0+aW5pdF9tZW07CiAJCQltZW1fZGVzY3IgKz0gSFdJX01FTV9BU1lOQ19EQVRBX0hBTkRMRV9VTFAwICsKIAkJCQkgICAgICh1bHBfbnVtICogTUVNX0RFU0NSX09GRlNFVCk7CkBAIC0zMDg1LDE2ICsyODQ2LDE2IEBACiAKIAkJCXBhc3luY19jdHgtPmFzeW5jX2RhdGEuaGFuZGxlX2Jhc2UgPQogCQkJCW1lbV9kZXNjci0+bWVtX2FycmF5WzBdLnZpcnR1YWxfYWRkcmVzczsKLQkJCXBhc3luY19jdHgtPmFzeW5jX2RhdGEud3JpdGFibGVzID0gMDsKIAkJCUlOSVRfTElTVF9IRUFEKCZwYXN5bmNfY3R4LT5hc3luY19kYXRhLmZyZWVfbGlzdCk7CiAKIAkJCXBhc3luY19oZWFkZXJfaCA9Ci0JCQkJKHN0cnVjdCBhc3luY19wZHVfaGFuZGxlICopCisJCQkJKHN0cnVjdCBoZF9hc3luY19oYW5kbGUgKikKIAkJCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuaGFuZGxlX2Jhc2U7CiAJCQlwYXN5bmNfZGF0YV9oID0KLQkJCQkoc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUgKikKKwkJCQkoc3RydWN0IGhkX2FzeW5jX2hhbmRsZSAqKQogCQkJCXBhc3luY19jdHgtPmFzeW5jX2RhdGEuaGFuZGxlX2Jhc2U7CiAKKwkJCS8qIHNldHVwIGRhdGEgYnVmZmVycyAqLwogCQkJbWVtX2Rlc2NyID0gKHN0cnVjdCBiZV9tZW1fZGVzY3JpcHRvciAqKXBoYmEtPmluaXRfbWVtOwogCQkJbWVtX2Rlc2NyICs9IEhXSV9NRU1fQVNZTkNfREFUQV9CVUZfVUxQMCArCiAJCQkJICAgICAodWxwX251bSAqIE1FTV9ERVNDUl9PRkZTRVQpOwpAQCAtMzExMiw2ICsyODczLDcgQEAKIAkJCQkJICAgIHVscF9udW0pOwogCiAJCQlpZHggPSAwOworCQkJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5idWZmZXJfc2l6ZSA9IHAtPmRlZnBkdV9kYXRhX3N6OwogCQkJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS52YV9iYXNlID0KIAkJCQltZW1fZGVzY3ItPm1lbV9hcnJheVtpZHhdLnZpcnR1YWxfYWRkcmVzczsKIAkJCXBhc3luY19jdHgtPmFzeW5jX2RhdGEucGFfYmFzZS51LmE2NC5hZGRyZXNzID0KQEAgLTMxMjUsNyArMjg4Nyw4IEBACiAJCQlmb3IgKGluZGV4ID0gMDsJaW5kZXggPCBCRUlTQ1NJX0dFVF9DSURfQ09VTlQKIAkJCQkJKHBoYmEsIHVscF9udW0pOyBpbmRleCsrKSB7CiAJCQkJcGFzeW5jX2hlYWRlcl9oLT5jcmkgPSAtMTsKLQkJCQlwYXN5bmNfaGVhZGVyX2gtPmluZGV4ID0gKGNoYXIpaW5kZXg7CisJCQkJcGFzeW5jX2hlYWRlcl9oLT5pc19oZWFkZXIgPSAxOworCQkJCXBhc3luY19oZWFkZXJfaC0+aW5kZXggPSBpbmRleDsKIAkJCQlJTklUX0xJU1RfSEVBRCgmcGFzeW5jX2hlYWRlcl9oLT5saW5rKTsKIAkJCQlwYXN5bmNfaGVhZGVyX2gtPnBidWZmZXIgPQogCQkJCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykKQEAgLTMxNDIsMTQgKzI5MDUsMTMgQEAKIAkJCQkJICAgICAgZnJlZV9saXN0KTsKIAkJCQlwYXN5bmNfaGVhZGVyX2grKzsKIAkJCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuZnJlZV9lbnRyaWVzKys7Ci0JCQkJcGFzeW5jX2N0eC0+YXN5bmNfaGVhZGVyLndyaXRhYmxlcysrOworCQkJCUlOSVRfTElTVF9IRUFEKCZwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtpbmRleF0uCisJCQkJCQl3cS5saXN0KTsKKwkJCQlwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtpbmRleF0uaGVhZGVyID0gTlVMTDsKIAotCQkJCUlOSVRfTElTVF9IRUFEKCZwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtpbmRleF0uCi0JCQkJCSAgICAgICB3YWl0X3F1ZXVlLmxpc3QpOwotCQkJCUlOSVRfTElTVF9IRUFEKCZwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtpbmRleF0uCi0JCQkJCSAgICAgICBoZWFkZXJfYnVzeV9saXN0KTsKIAkJCQlwYXN5bmNfZGF0YV9oLT5jcmkgPSAtMTsKLQkJCQlwYXN5bmNfZGF0YV9oLT5pbmRleCA9IChjaGFyKWluZGV4OworCQkJCXBhc3luY19kYXRhX2gtPmlzX2hlYWRlciA9IDA7CisJCQkJcGFzeW5jX2RhdGFfaC0+aW5kZXggPSBpbmRleDsKIAkJCQlJTklUX0xJU1RfSEVBRCgmcGFzeW5jX2RhdGFfaC0+bGluayk7CiAKIAkJCQlpZiAoIW51bV9hc3luY19kYXRhKSB7CkBAIC0zMTg0LDE2ICsyOTQ2LDggQEAKIAkJCQkJICAgICAgZnJlZV9saXN0KTsKIAkJCQlwYXN5bmNfZGF0YV9oKys7CiAJCQkJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5mcmVlX2VudHJpZXMrKzsKLQkJCQlwYXN5bmNfY3R4LT5hc3luY19kYXRhLndyaXRhYmxlcysrOwotCi0JCQkJSU5JVF9MSVNUX0hFQUQoJnBhc3luY19jdHgtPmFzeW5jX2VudHJ5W2luZGV4XS4KLQkJCQkJICAgICAgIGRhdGFfYnVzeV9saXN0KTsKKwkJCQlwYXN5bmNfY3R4LT5hc3luY19lbnRyeVtpbmRleF0uZGF0YSA9IE5VTEw7CiAJCQl9Ci0KLQkJCXBhc3luY19jdHgtPmFzeW5jX2hlYWRlci5ob3N0X3dyaXRlX3B0ciA9IDA7Ci0JCQlwYXN5bmNfY3R4LT5hc3luY19oZWFkZXIuZXBfcmVhZF9wdHIgPSAtMTsKLQkJCXBhc3luY19jdHgtPmFzeW5jX2RhdGEuaG9zdF93cml0ZV9wdHIgPSAwOwotCQkJcGFzeW5jX2N0eC0+YXN5bmNfZGF0YS5lcF9yZWFkX3B0ciA9IC0xOwogCQl9CiAJfQogCkBAIC0zMjY1LDggKzMwMTksOCBAQAogc3RhdGljIGludCBiZWlzY3NpX2NyZWF0ZV9lcXMoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQkJICAgICBzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQpCiB7CisJaW50IHJldCA9IC1FTk9NRU0sIGVxX2Zvcl9tY2M7CiAJdW5zaWduZWQgaW50IGksIG51bV9lcV9wYWdlczsKLQlpbnQgcmV0ID0gMCwgZXFfZm9yX21jYzsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZXE7CiAJc3RydWN0IGJlX2RtYV9tZW0gKm1lbTsKIAl2b2lkICplcV92YWRkcmVzczsKQEAgLTMyODQsOCArMzAzOCw4IEBACiAJCW1lbSA9ICZlcS0+ZG1hX21lbTsKIAkJcGh3aV9jb250ZXh0LT5iZV9lcVtpXS5waGJhID0gcGhiYTsKIAkJZXFfdmFkZHJlc3MgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwaGJhLT5wY2lkZXYsCi0JCQkJCQkgICAgIG51bV9lcV9wYWdlcyAqIFBBR0VfU0laRSwKLQkJCQkJCSAgICAgJnBhZGRyKTsKKwkJCQkJCSAgIG51bV9lcV9wYWdlcyAqIFBBR0VfU0laRSwKKwkJCQkJCSAgICZwYWRkcik7CiAJCWlmICghZXFfdmFkZHJlc3MpCiAJCQlnb3RvIGNyZWF0ZV9lcV9lcnJvcjsKIApAQCAtMzMxMyw2ICszMDY3LDcgQEAKIAkJCSAgICBwaHdpX2NvbnRleHQtPmJlX2VxW2ldLnEuaWQpOwogCX0KIAlyZXR1cm4gMDsKKwogY3JlYXRlX2VxX2Vycm9yOgogCWZvciAoaSA9IDA7IGkgPCAocGhiYS0+bnVtX2NwdXMgKyBlcV9mb3JfbWNjKTsgaSsrKSB7CiAJCWVxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV0ucTsKQEAgLTMzMjksMTEgKzMwODQsMTEgQEAKIAkJCSAgICAgc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0KQogewogCXVuc2lnbmVkIGludCBpLCBudW1fY3FfcGFnZXM7Ci0JaW50IHJldCA9IDA7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmNxLCAqZXE7CiAJc3RydWN0IGJlX2RtYV9tZW0gKm1lbTsKIAlzdHJ1Y3QgYmVfZXFfb2JqICpwYmVfZXE7CiAJdm9pZCAqY3FfdmFkZHJlc3M7CisJaW50IHJldCA9IC1FTk9NRU07CiAJZG1hX2FkZHJfdCBwYWRkcjsKIAogCW51bV9jcV9wYWdlcyA9IFBBR0VTX1JFUVVJUkVEKHBoYmEtPnBhcmFtcy5udW1fY3FfZW50cmllcyAqIFwKQEAgLTMzNDcsMTAgKzMxMDIsMTEgQEAKIAkJcGJlX2VxLT5waGJhID0gcGhiYTsKIAkJbWVtID0gJmNxLT5kbWFfbWVtOwogCQljcV92YWRkcmVzcyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBoYmEtPnBjaWRldiwKLQkJCQkJCSAgICAgbnVtX2NxX3BhZ2VzICogUEFHRV9TSVpFLAotCQkJCQkJICAgICAmcGFkZHIpOworCQkJCQkJICAgbnVtX2NxX3BhZ2VzICogUEFHRV9TSVpFLAorCQkJCQkJICAgJnBhZGRyKTsKIAkJaWYgKCFjcV92YWRkcmVzcykKIAkJCWdvdG8gY3JlYXRlX2NxX2Vycm9yOworCiAJCXJldCA9IGJlX2ZpbGxfcXVldWUoY3EsIHBoYmEtPnBhcmFtcy5udW1fY3FfZW50cmllcywKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzb2xfY3FlKSwgY3FfdmFkZHJlc3MpOwogCQlpZiAocmV0KSB7CkBAIC0zMzg1LDcgKzMxNDEsNiBAQAogCQkJCQkgICAgbWVtLT52YSwgbWVtLT5kbWEpOwogCX0KIAlyZXR1cm4gcmV0OwotCiB9CiAKIHN0YXRpYyBpbnQKQEAgLTM0MzcsNyArMzE5Miw2IEBACiAJCSAgICAiQk1fJWQgOiBpc2NzaSBoZHIgZGVmIHBkdSBpZCBmb3IgVUxQIDogJWQgaXMgJWRcbiIsCiAJCSAgICB1bHBfbnVtLAogCQkgICAgcGh3aV9jb250ZXh0LT5iZV9kZWZfaGRycVt1bHBfbnVtXS5pZCk7Ci0JaHdpX3Bvc3RfYXN5bmNfYnVmZmVycyhwaGJhLCBCRUlTQ1NJX0RFRlFfSERSLCB1bHBfbnVtKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQ5MiwxMSArMzI0Niw5IEBACiAJCSAgICB1bHBfbnVtLAogCQkgICAgcGh3aV9jb250ZXh0LT5iZV9kZWZfZGF0YXFbdWxwX251bV0uaWQpOwogCi0JaHdpX3Bvc3RfYXN5bmNfYnVmZmVycyhwaGJhLCBCRUlTQ1NJX0RFRlFfREFUQSwgdWxwX251bSk7CiAJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLCBCRUlTQ1NJX0xPR19JTklULAogCQkgICAgIkJNXyVkIDogREVGQVVMVCBQRFUgREFUQSBSSU5HIENSRUFURUQiCiAJCSAgICAib24gVUxQIDogJWRcbiIsIHVscF9udW0pOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM3MTYsMTAgKzM0NjgsNTMgQEAKIAogc3RhdGljIHZvaWQgYmVfbWNjX3F1ZXVlc19kZXN0cm95KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKLQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqcTsKIAlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7CisJc3RydWN0IGJlX2RtYV9tZW0gKnB0YWdfbWVtOworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpxOworCWludCBpLCB0YWc7CiAKIAlxID0gJnBoYmEtPmN0cmwubWNjX29iai5xOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTUNDX0NNRDsgaSsrKSB7CisJCXRhZyA9IGkgKyAxOworCQlpZiAoIXRlc3RfYml0KE1DQ19UQUdfU1RBVEVfUlVOTklORywKKwkJCSAgICAgICZjdHJsLT5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh0ZXN0X2JpdChNQ0NfVEFHX1NUQVRFX1RJTUVPVVQsCisJCQkgICAgICZjdHJsLT5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlKSkgeworCQkJcHRhZ19tZW0gPSAmY3RybC0+cHRhZ19zdGF0ZVt0YWddLnRhZ19tZW1fc3RhdGU7CisJCQlpZiAocHRhZ19tZW0tPnNpemUpIHsKKwkJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGN0cmwtPnBkZXYsCisJCQkJCQkgICAgcHRhZ19tZW0tPnNpemUsCisJCQkJCQkgICAgcHRhZ19tZW0tPnZhLAorCQkJCQkJICAgIHB0YWdfbWVtLT5kbWEpOworCQkJCXB0YWdfbWVtLT5zaXplID0gMDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCS8qKgorCQkgKiBJZiBNQ0MgaXMgc3RpbGwgYWN0aXZlIGFuZCB3YWl0aW5nIHRoZW4gd2FrZSB1cCB0aGUgcHJvY2Vzcy4KKwkJICogV2UgYXJlIGhlcmUgb25seSBiZWNhdXNlIHBvcnQgaXMgZ29pbmcgb2ZmbGluZS4gVGhlIHByb2Nlc3MKKwkJICogc2VlcyB0aGF0IChCRUlTQ1NJX0hCQV9PTkxJTkUgaXMgY2xlYXJlZCkgYW5kIEVJTyBlcnJvciBpcworCQkgKiByZXR1cm5lZCBmb3IgdGhlIG9wZXJhdGlvbiBhbmQgYWxsb2NhdGVkIG1lbW9yeSBjbGVhbmVkIHVwLgorCQkgKi8KKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmN0cmwtPm1jY193YWl0W3RhZ10pKSB7CisJCQljdHJsLT5tY2NfdGFnX3N0YXR1c1t0YWddID0gTUNDX1NUQVRVU19GQUlMRUQ7CisJCQljdHJsLT5tY2NfdGFnX3N0YXR1c1t0YWddIHw9IENRRV9WQUxJRF9NQVNLOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdHJsLT5tY2Nfd2FpdFt0YWddKTsKKwkJCS8qCisJCQkgKiBDb250cm9sIHRhZyBpbmZvIGdldHMgcmVpbml0aWFsaXplZCBpbiBlbmFibGUKKwkJCSAqIHNvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGNsZWFyIHJ1bm5pbmcgc3RhdGUuCisJCQkgKi8KKwkJCXdoaWxlICh0ZXN0X2JpdChNQ0NfVEFHX1NUQVRFX1JVTk5JTkcsCisJCQkJCSZjdHJsLT5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlKSkKKwkJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWik7CisJCX0KKwkJLyoqCisJCSAqIEZvciBNQ0Mgd2l0aCB0YWdfc3RhdGVzIE1DQ19UQUdfU1RBVEVfQVNZTkMgYW5kCisJCSAqIE1DQ19UQUdfU1RBVEVfSUdOT1JFIG5vdGhpbmcgbmVlZHMgdG8gZG9uZS4KKwkJICovCisJfQogCWlmIChxLT5jcmVhdGVkKSB7CiAJCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBxLCBRVFlQRV9NQ0NRKTsKIAkJYmVfcXVldWVfZnJlZShwaGJhLCBxKTsKQEAgLTM3MzIsNjggKzM1MjcsNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaHdpX2NsZWFudXAoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQotewotCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICpxOwotCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKLQlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7Ci0Jc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OwotCXN0cnVjdCBod2lfYXN5bmNfcGR1X2NvbnRleHQgKnBhc3luY19jdHg7Ci0JaW50IGksIGVxX2Zvcl9tY2MsIHVscF9udW07Ci0KLQlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKLQlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7Ci0KLQliZV9jbWRfaXNjc2lfcmVtb3ZlX3RlbXBsYXRlX2hkcihjdHJsKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwaGJhLT5wYXJhbXMuY3huc19wZXJfY3RybDsgaSsrKSB7Ci0JCXEgPSAmcGh3aV9jb250ZXh0LT5iZV93cmJxW2ldOwotCQlpZiAocS0+Y3JlYXRlZCkKLQkJCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBxLCBRVFlQRV9XUkJRKTsKLQl9Ci0Ja2ZyZWUocGh3aV9jb250ZXh0LT5iZV93cmJxKTsKLQlmcmVlX3dyYl9oYW5kbGVzKHBoYmEpOwotCi0JZm9yICh1bHBfbnVtID0gMDsgdWxwX251bSA8IEJFSVNDU0lfVUxQX0NPVU5UOyB1bHBfbnVtKyspIHsKLQkJaWYgKHRlc3RfYml0KHVscF9udW0sICZwaGJhLT5md19jb25maWcudWxwX3N1cHBvcnRlZCkpIHsKLQotCQkJcSA9ICZwaHdpX2NvbnRleHQtPmJlX2RlZl9oZHJxW3VscF9udW1dOwotCQkJaWYgKHEtPmNyZWF0ZWQpCi0JCQkJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIHEsIFFUWVBFX0RQRFVRKTsKLQotCQkJcSA9ICZwaHdpX2NvbnRleHQtPmJlX2RlZl9kYXRhcVt1bHBfbnVtXTsKLQkJCWlmIChxLT5jcmVhdGVkKQotCQkJCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBxLCBRVFlQRV9EUERVUSk7Ci0KLQkJCXBhc3luY19jdHggPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQtPnBhc3luY19jdHhbdWxwX251bV07Ci0JCX0KLQl9Ci0KLQliZWlzY3NpX2NtZF9xX2Rlc3Ryb3koY3RybCwgTlVMTCwgUVRZUEVfU0dMKTsKLQotCWZvciAoaSA9IDA7IGkgPCAocGhiYS0+bnVtX2NwdXMpOyBpKyspIHsKLQkJcSA9ICZwaHdpX2NvbnRleHQtPmJlX2NxW2ldOwotCQlpZiAocS0+Y3JlYXRlZCkgewotCQkJYmVfcXVldWVfZnJlZShwaGJhLCBxKTsKLQkJCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBxLCBRVFlQRV9DUSk7Ci0JCX0KLQl9Ci0KLQliZV9tY2NfcXVldWVzX2Rlc3Ryb3kocGhiYSk7Ci0JaWYgKHBoYmEtPm1zaXhfZW5hYmxlZCkKLQkJZXFfZm9yX21jYyA9IDE7Ci0JZWxzZQotCQllcV9mb3JfbWNjID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgKHBoYmEtPm51bV9jcHVzICsgZXFfZm9yX21jYyk7IGkrKykgewotCQlxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV0ucTsKLQkJaWYgKHEtPmNyZWF0ZWQpIHsKLQkJCWJlX3F1ZXVlX2ZyZWUocGhiYSwgcSk7Ci0JCQliZWlzY3NpX2NtZF9xX2Rlc3Ryb3koY3RybCwgcSwgUVRZUEVfRVEpOwotCQl9Ci0JfQotCWJlX2NtZF9md191bmluaXQoY3RybCk7Ci19Ci0KIHN0YXRpYyBpbnQgYmVfbWNjX3F1ZXVlc19jcmVhdGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQkJCXN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dCkKIHsKQEAgLTM4NzUsNiArMzYwOCwxMTggQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGh3aV9wdXJnZV9lcShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOworCXN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dDsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqZXE7CisJc3RydWN0IGJlX2VxX2VudHJ5ICplcWUgPSBOVUxMOworCWludCBpLCBlcV9tc2l4OworCXVuc2lnbmVkIGludCBudW1fcHJvY2Vzc2VkOworCisJaWYgKGJlaXNjc2lfaGJhX2luX2Vycm9yKHBoYmEpKQorCQlyZXR1cm47CisKKwlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKKwlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CisJaWYgKHBoYmEtPm1zaXhfZW5hYmxlZCkKKwkJZXFfbXNpeCA9IDE7CisJZWxzZQorCQllcV9tc2l4ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAocGhiYS0+bnVtX2NwdXMgKyBlcV9tc2l4KTsgaSsrKSB7CisJCWVxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV0ucTsKKwkJZXFlID0gcXVldWVfdGFpbF9ub2RlKGVxKTsKKwkJbnVtX3Byb2Nlc3NlZCA9IDA7CisJCXdoaWxlIChlcWUtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCkgLyAzMl0KKwkJCQkJJiBFUUVfVkFMSURfTUFTSykgeworCQkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9lcV9lbnRyeSwgdmFsaWQsIGVxZSwgMCk7CisJCQlxdWV1ZV90YWlsX2luYyhlcSk7CisJCQllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOworCQkJbnVtX3Byb2Nlc3NlZCsrOworCQl9CisKKwkJaWYgKG51bV9wcm9jZXNzZWQpCisJCQlod2lfcmluZ19lcV9kYihwaGJhLCBlcS0+aWQsIDEsCW51bV9wcm9jZXNzZWQsIDEsIDEpOworCX0KK30KKworc3RhdGljIHZvaWQgaHdpX2NsZWFudXBfcG9ydChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnE7CisJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOworCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKKwlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CisJc3RydWN0IGhkX2FzeW5jX2NvbnRleHQgKnBhc3luY19jdHg7CisJaW50IGksIGVxX2Zvcl9tY2MsIHVscF9udW07CisKKwlmb3IgKHVscF9udW0gPSAwOyB1bHBfbnVtIDwgQkVJU0NTSV9VTFBfQ09VTlQ7IHVscF9udW0rKykKKwkJaWYgKHRlc3RfYml0KHVscF9udW0sICZwaGJhLT5md19jb25maWcudWxwX3N1cHBvcnRlZCkpCisJCQliZWlzY3NpX2NtZF9pc2NzaV9jbGVhbnVwKHBoYmEsIHVscF9udW0pOworCisJLyoqCisJICogUHVyZ2UgYWxsIEVRIGVudHJpZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIGxlZnQgb3V0LiBUaGlzIGlzIHRvCisJICogd29ya2Fyb3VuZCBhIHByb2JsZW0gd2UndmUgc2VlbiBvY2Nhc2lvbmFsbHkgd2hlcmUgZHJpdmVyIGdldHMgYW4KKwkgKiBpbnRlcnJ1cHQgd2l0aCBFUSBlbnRyeSBiaXQgc2V0IGFmdGVyIHN0b3BwaW5nIHRoZSBjb250cm9sbGVyLgorCSAqLworCWh3aV9wdXJnZV9lcShwaGJhKTsKKworCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOworCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKKworCWJlX2NtZF9pc2NzaV9yZW1vdmVfdGVtcGxhdGVfaGRyKGN0cmwpOworCisJZm9yIChpID0gMDsgaSA8IHBoYmEtPnBhcmFtcy5jeG5zX3Blcl9jdHJsOyBpKyspIHsKKwkJcSA9ICZwaHdpX2NvbnRleHQtPmJlX3dyYnFbaV07CisJCWlmIChxLT5jcmVhdGVkKQorCQkJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIHEsIFFUWVBFX1dSQlEpOworCX0KKwlrZnJlZShwaHdpX2NvbnRleHQtPmJlX3dyYnEpOworCWZyZWVfd3JiX2hhbmRsZXMocGhiYSk7CisKKwlmb3IgKHVscF9udW0gPSAwOyB1bHBfbnVtIDwgQkVJU0NTSV9VTFBfQ09VTlQ7IHVscF9udW0rKykgeworCQlpZiAodGVzdF9iaXQodWxwX251bSwgJnBoYmEtPmZ3X2NvbmZpZy51bHBfc3VwcG9ydGVkKSkgeworCisJCQlxID0gJnBod2lfY29udGV4dC0+YmVfZGVmX2hkcnFbdWxwX251bV07CisJCQlpZiAocS0+Y3JlYXRlZCkKKwkJCQliZWlzY3NpX2NtZF9xX2Rlc3Ryb3koY3RybCwgcSwgUVRZUEVfRFBEVVEpOworCisJCQlxID0gJnBod2lfY29udGV4dC0+YmVfZGVmX2RhdGFxW3VscF9udW1dOworCQkJaWYgKHEtPmNyZWF0ZWQpCisJCQkJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIHEsIFFUWVBFX0RQRFVRKTsKKworCQkJcGFzeW5jX2N0eCA9IHBod2lfY3RybHItPnBod2lfY3R4dC0+cGFzeW5jX2N0eFt1bHBfbnVtXTsKKwkJfQorCX0KKworCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBOVUxMLCBRVFlQRV9TR0wpOworCisJZm9yIChpID0gMDsgaSA8IChwaGJhLT5udW1fY3B1cyk7IGkrKykgeworCQlxID0gJnBod2lfY29udGV4dC0+YmVfY3FbaV07CisJCWlmIChxLT5jcmVhdGVkKSB7CisJCQliZV9xdWV1ZV9mcmVlKHBoYmEsIHEpOworCQkJYmVpc2NzaV9jbWRfcV9kZXN0cm95KGN0cmwsIHEsIFFUWVBFX0NRKTsKKwkJfQorCX0KKworCWJlX21jY19xdWV1ZXNfZGVzdHJveShwaGJhKTsKKwlpZiAocGhiYS0+bXNpeF9lbmFibGVkKQorCQllcV9mb3JfbWNjID0gMTsKKwllbHNlCisJCWVxX2Zvcl9tY2MgPSAwOworCWZvciAoaSA9IDA7IGkgPCAocGhiYS0+bnVtX2NwdXMgKyBlcV9mb3JfbWNjKTsgaSsrKSB7CisJCXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXS5xOworCQlpZiAocS0+Y3JlYXRlZCkgeworCQkJYmVfcXVldWVfZnJlZShwaGJhLCBxKTsKKwkJCWJlaXNjc2lfY21kX3FfZGVzdHJveShjdHJsLCBxLCBRVFlQRV9FUSk7CisJCX0KKwl9CisJLyogdGhpcyBlbnN1cmVzIGNvbXBsZXRlIEZXIGNsZWFudXAgKi8KKwliZWlzY3NpX2NtZF9mdW5jdGlvbl9yZXNldChwaGJhKTsKKwkvKiBsYXN0IGNvbW11bmljYXRpb24sIGluZGljYXRlIGRyaXZlciBpcyB1bmxvYWRpbmcgKi8KKwliZWlzY3NpX2NtZF9zcGVjaWFsX3dyYigmcGhiYS0+Y3RybCwgMCk7Cit9CisKIHN0YXRpYyBpbnQgaHdpX2luaXRfcG9ydChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCiB7CiAJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOwpAQCAtMzg4Nyw5ICszNzMyLDggQEAKIAlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CiAJcGh3aV9jb250ZXh0LT5tYXhfZXFkID0gMTI4OwogCXBod2lfY29udGV4dC0+bWluX2VxZCA9IDA7Ci0JcGh3aV9jb250ZXh0LT5jdXJfZXFkID0gMDsKLQliZV9jbWRfZndfaW5pdGlhbGl6ZSgmcGhiYS0+Y3RybCk7Ci0JLyogc2V0IG9wdGljIHN0YXRlIHRvIHVua25vd24gKi8KKwlwaHdpX2NvbnRleHQtPmN1cl9lcWQgPSAzMjsKKwkvKiBzZXQgcG9ydCBvcHRpYyBzdGF0ZSB0byB1bmtub3duICovCiAJcGhiYS0+b3B0aWNfc3RhdGUgPSAweGZmOwogCiAJc3RhdHVzID0gYmVpc2NzaV9jcmVhdGVfZXFzKHBoYmEsIHBod2lfY29udGV4dCk7CkBAIC0zOTAzLDcgKzM3NDcsNyBAQAogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBlcnJvcjsKIAotCXN0YXR1cyA9IG1nbXRfY2hlY2tfc3VwcG9ydGVkX2Z3KGN0cmwsIHBoYmEpOworCXN0YXR1cyA9IGJlaXNjc2lfY2hlY2tfc3VwcG9ydGVkX2Z3KGN0cmwsIHBoYmEpOwogCWlmIChzdGF0dXMgIT0gMCkgewogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKIAkJCSAgICAiQk1fJWQgOiBVbnN1cHBvcnRlZCBmdyB2ZXJzaW9uXG4iKTsKQEAgLTM5MTksNyArMzc2Myw2IEBACiAKIAlmb3IgKHVscF9udW0gPSAwOyB1bHBfbnVtIDwgQkVJU0NTSV9VTFBfQ09VTlQ7IHVscF9udW0rKykgewogCQlpZiAodGVzdF9iaXQodWxwX251bSwgJnBoYmEtPmZ3X2NvbmZpZy51bHBfc3VwcG9ydGVkKSkgewotCiAJCQlkZWZfcGR1X3Jpbmdfc3ogPQogCQkJCUJFSVNDU0lfR0VUX0NJRF9DT1VOVChwaGJhLCB1bHBfbnVtKSAqCiAJCQkJc2l6ZW9mKHN0cnVjdCBwaHlzX2FkZHIpOwpAQCAtMzk0NSw2ICszNzg4LDE1IEBACiAJCQkJCSAgICB1bHBfbnVtKTsKIAkJCQlnb3RvIGVycm9yOwogCQkJfQorCQkJLyoqCisJCQkgKiBOb3cgdGhhdCB0aGUgZGVmYXVsdCBQRFUgcmluZ3MgaGF2ZSBiZWVuIGNyZWF0ZWQsCisJCQkgKiBsZXQgRVAga25vdyBhYm91dCBpdC4KKwkJCSAqIENhbGwgYmVpc2NzaV9jbWRfaXNjc2lfY2xlYW51cCBiZWZvcmUgcG9zdGluZz8KKwkJCSAqLworCQkJYmVpc2NzaV9oZHFfcG9zdF9oYW5kbGVzKHBoYmEsIEJFSVNDU0lfREVGUV9IRFIsCisJCQkJCQkgdWxwX251bSk7CisJCQliZWlzY3NpX2hkcV9wb3N0X2hhbmRsZXMocGhiYSwgQkVJU0NTSV9ERUZRX0RBVEEsCisJCQkJCQkgdWxwX251bSk7CiAJCX0KIAl9CiAKQEAgLTM5NzMsNyArMzgyNSw3IEBACiAKIAkJaWYgKHRlc3RfYml0KHVscF9udW0sICZwaGJhLT5md19jb25maWcudWxwX3N1cHBvcnRlZCkpIHsKIAkJCXVpbnQxNl90IGNyaSA9IDA7Ci0JCQlzdHJ1Y3QgaHdpX2FzeW5jX3BkdV9jb250ZXh0ICpwYXN5bmNfY3R4OworCQkJc3RydWN0IGhkX2FzeW5jX2NvbnRleHQgKnBhc3luY19jdHg7CiAKIAkJCXBhc3luY19jdHggPSBIV0lfR0VUX0FTWU5DX1BEVV9DVFgoCiAJCQkJICAgICBwaHdpX2N0cmxyLCB1bHBfbnVtKTsKQEAgLTM5ODUsNiArMzgzNywxNCBAQAogCQkJCQlwaHdpX2N0cmxyLT53cmJfY29udGV4dFtjcmldLmNpZF0gPQogCQkJCQlhc3luY19hcnJfaWR4Kys7CiAJCQl9CisJCQkvKioKKwkJCSAqIE5vdyB0aGF0IHRoZSBkZWZhdWx0IFBEVSByaW5ncyBoYXZlIGJlZW4gY3JlYXRlZCwKKwkJCSAqIGxldCBFUCBrbm93IGFib3V0IGl0LgorCQkJICovCisJCQliZWlzY3NpX2hkcV9wb3N0X2hhbmRsZXMocGhiYSwgQkVJU0NTSV9ERUZRX0hEUiwKKwkJCQkJCSB1bHBfbnVtKTsKKwkJCWJlaXNjc2lfaGRxX3Bvc3RfaGFuZGxlcyhwaGJhLCBCRUlTQ1NJX0RFRlFfREFUQSwKKwkJCQkJCSB1bHBfbnVtKTsKIAkJfQogCX0KIApAQCAtMzk5NSw3ICszODU1LDcgQEAKIGVycm9yOgogCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAogCQkgICAgIkJNXyVkIDogaHdpX2luaXRfcG9ydCBmYWlsZWQiKTsKLQlod2lfY2xlYW51cChwaGJhKTsKKwlod2lfY2xlYW51cF9wb3J0KHBoYmEpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTQzNTQsMTQ5ICs0MjE0LDYgQEAKIAkJCSAgICAiQk1fJWQgOiBJbiBod2lfZGlzYWJsZV9pbnRyLCBBbHJlYWR5IERpc2FibGVkXG4iKTsKIH0KIAotLyoqCi0gKiBiZWlzY3NpX2dldF9ib290X2luZm8oKS0gR2V0IHRoZSBib290IHNlc3Npb24gaW5mbwotICogQHBoYmE6IFRoZSBkZXZpY2UgcHJpdiBzdHJ1Y3R1cmUgaW5zdGFuY2UKLSAqCi0gKiBHZXQgdGhlIGJvb3QgdGFyZ2V0IGluZm8gYW5kIHN0b3JlIGluIGRyaXZlciBwcml2IHN0cnVjdHVyZQotICoKLSAqIHJldHVybiB2YWx1ZXMKLSAqCVN1Y2Nlc3M6IDAKLSAqCUZhaWx1cmU6IE5vbi1aZXJvIFZhbHVlCi0gKiovCi1zdGF0aWMgaW50IGJlaXNjc2lfZ2V0X2Jvb3RfaW5mbyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCi17Ci0Jc3RydWN0IGJlX2NtZF9nZXRfc2Vzc2lvbl9yZXNwICpzZXNzaW9uX3Jlc3A7Ci0Jc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKLQl1bnNpZ25lZCBpbnQgdGFnOwotCXVuc2lnbmVkIGludCBzX2hhbmRsZTsKLQlpbnQgcmV0ID0gLUVOT01FTTsKLQotCS8qIEdldCB0aGUgc2Vzc2lvbiBoYW5kbGUgb2YgdGhlIGJvb3QgdGFyZ2V0ICovCi0JcmV0ID0gYmVfbWdtdF9nZXRfYm9vdF9zaGFuZGxlKHBoYmEsICZzX2hhbmRsZSk7Ci0JaWYgKHJldCkgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKLQkJCSAgICBCRUlTQ1NJX0xPR19JTklUIHwgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJICAgICJCTV8lZCA6IE5vIGJvb3Qgc2Vzc2lvblxuIik7Ci0KLQkJaWYgKHJldCA9PSAtRU5YSU8pCi0JCQlwaGJhLT5nZXRfYm9vdCA9IDA7Ci0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQlwaGJhLT5nZXRfYm9vdCA9IDA7Ci0Jbm9uZW1iX2NtZC52YSA9IHBjaV96YWxsb2NfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsCi0JCQkJCSAgICAgIHNpemVvZigqc2Vzc2lvbl9yZXNwKSwKLQkJCQkJICAgICAgJm5vbmVtYl9jbWQuZG1hKTsKLQlpZiAobm9uZW1iX2NtZC52YSA9PSBOVUxMKSB7Ci0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAotCQkJICAgIEJFSVNDU0lfTE9HX0lOSVQgfCBCRUlTQ1NJX0xPR19DT05GSUcsCi0JCQkgICAgIkJNXyVkIDogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IiCi0JCQkgICAgImJlaXNjc2lfZ2V0X3Nlc3Npb25faW5mb1xuIik7Ci0KLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JdGFnID0gbWdtdF9nZXRfc2Vzc2lvbl9pbmZvKHBoYmEsIHNfaGFuZGxlLAotCQkJCSAgICAmbm9uZW1iX2NtZCk7Ci0JaWYgKCF0YWcpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCi0JCQkgICAgQkVJU0NTSV9MT0dfSU5JVCB8IEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQk1fJWQgOiBiZWlzY3NpX2dldF9zZXNzaW9uX2luZm8iCi0JCQkgICAgIiBGYWlsZWRcbiIpOwotCi0JCWdvdG8gYm9vdF9mcmVlbWVtOwotCX0KLQotCXJldCA9IGJlaXNjc2lfbWNjcV9jb21wbF93YWl0KHBoYmEsIHRhZywgTlVMTCwgJm5vbmVtYl9jbWQpOwotCWlmIChyZXQpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCi0JCQkgICAgQkVJU0NTSV9MT0dfSU5JVCB8IEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQk1fJWQgOiBiZWlzY3NpX2dldF9zZXNzaW9uX2luZm8gRmFpbGVkIik7Ci0KLQkJaWYgKHJldCAhPSAtRUJVU1kpCi0JCQlnb3RvIGJvb3RfZnJlZW1lbTsKLQkJZWxzZQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzZXNzaW9uX3Jlc3AgPSBub25lbWJfY21kLnZhIDsKLQotCW1lbWNweSgmcGhiYS0+Ym9vdF9zZXNzLCAmc2Vzc2lvbl9yZXNwLT5zZXNzaW9uX2luZm8sCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgbWdtdF9zZXNzaW9uX2luZm8pKTsKLQotCSBiZWlzY3NpX2xvZ291dF9md19zZXNzKHBoYmEsCi0JCQkJcGhiYS0+Ym9vdF9zZXNzLnNlc3Npb25faGFuZGxlKTsKLQlyZXQgPSAwOwotCi1ib290X2ZyZWVtZW06Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5jdHJsLnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKLQkJICAgIG5vbmVtYl9jbWQudmEsIG5vbmVtYl9jbWQuZG1hKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBiZWlzY3NpX2Jvb3RfcmVsZWFzZSh2b2lkICpkYXRhKQotewotCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGRhdGE7Ci0KLQlzY3NpX2hvc3RfcHV0KHBoYmEtPnNob3N0KTsKLX0KLQotc3RhdGljIGludCBiZWlzY3NpX3NldHVwX2Jvb3RfaW5mbyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCi17Ci0Jc3RydWN0IGlzY3NpX2Jvb3Rfa29iaiAqYm9vdF9rb2JqOwotCi0JLyogaXQgaGFzIGJlZW4gY3JlYXRlZCBwcmV2aW91c2x5ICovCi0JaWYgKHBoYmEtPmJvb3Rfa3NldCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBnZXQgYm9vdCBpbmZvIHVzaW5nIG1nbXQgY21kICovCi0JaWYgKGJlaXNjc2lfZ2V0X2Jvb3RfaW5mbyhwaGJhKSkKLQkJLyogVHJ5IHRvIHNlZSBpZiB3ZSBjYW4gY2Fycnkgb24gd2l0aG91dCB0aGlzICovCi0JCXJldHVybiAwOwotCi0JcGhiYS0+Ym9vdF9rc2V0ID0gaXNjc2lfYm9vdF9jcmVhdGVfaG9zdF9rc2V0KHBoYmEtPnNob3N0LT5ob3N0X25vKTsKLQlpZiAoIXBoYmEtPmJvb3Rfa3NldCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBnZXQgYSByZWYgYmVjYXVzZSB0aGUgc2hvdyBmdW5jdGlvbiB3aWxsIHJlZiB0aGUgcGhiYSAqLwotCWlmICghc2NzaV9ob3N0X2dldChwaGJhLT5zaG9zdCkpCi0JCWdvdG8gZnJlZV9rc2V0OwotCWJvb3Rfa29iaiA9IGlzY3NpX2Jvb3RfY3JlYXRlX3RhcmdldChwaGJhLT5ib290X2tzZXQsIDAsIHBoYmEsCi0JCQkJCSAgICAgYmVpc2NzaV9zaG93X2Jvb3RfdGd0X2luZm8sCi0JCQkJCSAgICAgYmVpc2NzaV90Z3RfZ2V0X2F0dHJfdmlzaWJpbGl0eSwKLQkJCQkJICAgICBiZWlzY3NpX2Jvb3RfcmVsZWFzZSk7Ci0JaWYgKCFib290X2tvYmopCi0JCWdvdG8gcHV0X3Nob3N0OwotCi0JaWYgKCFzY3NpX2hvc3RfZ2V0KHBoYmEtPnNob3N0KSkKLQkJZ290byBmcmVlX2tzZXQ7Ci0JYm9vdF9rb2JqID0gaXNjc2lfYm9vdF9jcmVhdGVfaW5pdGlhdG9yKHBoYmEtPmJvb3Rfa3NldCwgMCwgcGhiYSwKLQkJCQkJCWJlaXNjc2lfc2hvd19ib290X2luaV9pbmZvLAotCQkJCQkJYmVpc2NzaV9pbmlfZ2V0X2F0dHJfdmlzaWJpbGl0eSwKLQkJCQkJCWJlaXNjc2lfYm9vdF9yZWxlYXNlKTsKLQlpZiAoIWJvb3Rfa29iaikKLQkJZ290byBwdXRfc2hvc3Q7Ci0KLQlpZiAoIXNjc2lfaG9zdF9nZXQocGhiYS0+c2hvc3QpKQotCQlnb3RvIGZyZWVfa3NldDsKLQlib290X2tvYmogPSBpc2NzaV9ib290X2NyZWF0ZV9ldGhlcm5ldChwaGJhLT5ib290X2tzZXQsIDAsIHBoYmEsCi0JCQkJCSAgICAgICBiZWlzY3NpX3Nob3dfYm9vdF9ldGhfaW5mbywKLQkJCQkJICAgICAgIGJlaXNjc2lfZXRoX2dldF9hdHRyX3Zpc2liaWxpdHksCi0JCQkJCSAgICAgICBiZWlzY3NpX2Jvb3RfcmVsZWFzZSk7Ci0JaWYgKCFib290X2tvYmopCi0JCWdvdG8gcHV0X3Nob3N0OwotCXJldHVybiAwOwotCi1wdXRfc2hvc3Q6Ci0Jc2NzaV9ob3N0X3B1dChwaGJhLT5zaG9zdCk7Ci1mcmVlX2tzZXQ6Ci0JaXNjc2lfYm9vdF9kZXN0cm95X2tzZXQocGhiYS0+Ym9vdF9rc2V0KTsKLQlwaGJhLT5ib290X2tzZXQgPSBOVUxMOwotCXJldHVybiAtRU5PTUVNOwotfQotCiBzdGF0aWMgaW50IGJlaXNjc2lfaW5pdF9wb3J0KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKIAlpbnQgcmV0OwpAQCAtNDUxNiw3ICs0MjMzLDggQEAKIAkJZ290byBkb19jbGVhbnVwX2N0cmxyOwogCX0KIAotCWlmIChoYmFfc2V0dXBfY2lkX3RibHMocGhiYSkpIHsKKwlyZXQgPSBoYmFfc2V0dXBfY2lkX3RibHMocGhiYSk7CisJaWYgKHJldCA8IDApIHsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCiAJCQkgICAgIkJNXyVkIDogRmFpbGVkIGluIGhiYV9zZXR1cF9jaWRfdGJsc1xuIik7CiAJCWtmcmVlKHBoYmEtPmlvX3NnbF9obmRsX2Jhc2UpOwpAQCAtNDUyNyw2MSArNDI0NSwxNSBAQAogCXJldHVybiByZXQ7CiAKIGRvX2NsZWFudXBfY3RybHI6Ci0JaHdpX2NsZWFudXAocGhiYSk7CisJaHdpX2NsZWFudXBfcG9ydChwaGJhKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBod2lfcHVyZ2VfZXEoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQorc3RhdGljIHZvaWQgYmVpc2NzaV9jbGVhbnVwX3BvcnQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQogewotCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKLQlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7Ci0Jc3RydWN0IGJlX3F1ZXVlX2luZm8gKmVxOwotCXN0cnVjdCBiZV9lcV9lbnRyeSAqZXFlID0gTlVMTDsKLQlpbnQgaSwgZXFfbXNpeDsKLQl1bnNpZ25lZCBpbnQgbnVtX3Byb2Nlc3NlZDsKLQotCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOwotCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKLQlpZiAocGhiYS0+bXNpeF9lbmFibGVkKQotCQllcV9tc2l4ID0gMTsKLQllbHNlCi0JCWVxX21zaXggPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IChwaGJhLT5udW1fY3B1cyArIGVxX21zaXgpOyBpKyspIHsKLQkJZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXS5xOwotCQllcWUgPSBxdWV1ZV90YWlsX25vZGUoZXEpOwotCQludW1fcHJvY2Vzc2VkID0gMDsKLQkJd2hpbGUgKGVxZS0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXFfZW50cnksIHZhbGlkKSAvIDMyXQotCQkJCQkmIEVRRV9WQUxJRF9NQVNLKSB7Ci0JCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2VxX2VudHJ5LCB2YWxpZCwgZXFlLCAwKTsKLQkJCXF1ZXVlX3RhaWxfaW5jKGVxKTsKLQkJCWVxZSA9IHF1ZXVlX3RhaWxfbm9kZShlcSk7Ci0JCQludW1fcHJvY2Vzc2VkKys7Ci0JCX0KLQotCQlpZiAobnVtX3Byb2Nlc3NlZCkKLQkJCWh3aV9yaW5nX2VxX2RiKHBoYmEsIGVxLT5pZCwgMSwJbnVtX3Byb2Nlc3NlZCwgMSwgMSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBiZWlzY3NpX2NsZWFuX3BvcnQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQotewotCWludCBtZ210X3N0YXR1cywgdWxwX251bTsKIAlzdHJ1Y3QgdWxwX2NpZF9pbmZvICpwdHJfY2lkX2luZm8gPSBOVUxMOworCWludCB1bHBfbnVtOwogCi0JZm9yICh1bHBfbnVtID0gMDsgdWxwX251bSA8IEJFSVNDU0lfVUxQX0NPVU5UOyB1bHBfbnVtKyspIHsKLQkJaWYgKHRlc3RfYml0KHVscF9udW0sICh2b2lkICopJnBoYmEtPmZ3X2NvbmZpZy51bHBfc3VwcG9ydGVkKSkgewotCQkJbWdtdF9zdGF0dXMgPSBtZ210X2VwZndfY2xlYW51cChwaGJhLCB1bHBfbnVtKTsKLQkJCWlmIChtZ210X3N0YXR1cykKLQkJCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsCi0JCQkJCSAgICBCRUlTQ1NJX0xPR19JTklULAotCQkJCQkgICAgIkJNXyVkIDogbWdtdF9lcGZ3X2NsZWFudXAgRkFJTEVEIgotCQkJCQkgICAgIiBmb3IgVUxQXyVkXG4iLCB1bHBfbnVtKTsKLQkJfQotCX0KLQotCWh3aV9wdXJnZV9lcShwaGJhKTsKLQlod2lfY2xlYW51cChwaGJhKTsKIAlrZnJlZShwaGJhLT5pb19zZ2xfaG5kbF9iYXNlKTsKIAlrZnJlZShwaGJhLT5laF9zZ2xfaG5kbF9iYXNlKTsKIAlrZnJlZShwaGJhLT5lcF9hcnJheSk7CkBAIC00NTk4LDcgKzQyNzAsNiBAQAogCQkJfQogCQl9CiAJfQotCiB9CiAKIC8qKgpAQCAtNDYyNSwxNiArNDI5NiwxMiBAQAogCWlvX3Rhc2sgPSB0YXNrLT5kZF9kYXRhOwogCiAJaWYgKGlvX3Rhc2stPnB3cmJfaGFuZGxlKSB7Ci0JCW1lbXNldChpb190YXNrLT5wd3JiX2hhbmRsZS0+cHdyYiwgMCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXNjc2lfd3JiKSk7Ci0JCWZyZWVfd3JiX2hhbmRsZShwaGJhLCBwd3JiX2NvbnRleHQsCi0JCQkJaW9fdGFzay0+cHdyYl9oYW5kbGUpOworCQlmcmVlX3dyYl9oYW5kbGUocGhiYSwgcHdyYl9jb250ZXh0LCBpb190YXNrLT5wd3JiX2hhbmRsZSk7CiAJCWlvX3Rhc2stPnB3cmJfaGFuZGxlID0gTlVMTDsKIAl9CiAKIAlpZiAoaW9fdGFzay0+cHNnbF9oYW5kbGUpIHsKLQkJZnJlZV9tZ210X3NnbF9oYW5kbGUocGhiYSwKLQkJCQkgICAgIGlvX3Rhc2stPnBzZ2xfaGFuZGxlKTsKKwkJZnJlZV9tZ210X3NnbF9oYW5kbGUocGhiYSwgaW9fdGFzay0+cHNnbF9oYW5kbGUpOwogCQlpb190YXNrLT5wc2dsX2hhbmRsZSA9IE5VTEw7CiAJfQogCkBAIC00NjcxLDYgKzQzMzgsNyBAQAogCQlwY2lfcG9vbF9mcmVlKGJlaXNjc2lfc2Vzcy0+YmhzX3Bvb2wsIGlvX3Rhc2stPmNtZF9iaHMsCiAJCQkgICAgICBpb190YXNrLT5iaHNfcGEudS5hNjQuYWRkcmVzcyk7CiAJCWlvX3Rhc2stPmNtZF9iaHMgPSBOVUxMOworCQl0YXNrLT5oZHIgPSBOVUxMOwogCX0KIAogCWlmICh0YXNrLT5zYykgewpAQCAtNDY4Niw3ICs0MzU0LDggQEAKIAkJfQogCiAJCWlmIChpb190YXNrLT5zY3NpX2NtbmQpIHsKLQkJCXNjc2lfZG1hX3VubWFwKGlvX3Rhc2stPnNjc2lfY21uZCk7CisJCQlpZiAoaW9fdGFzay0+bnVtX3NnKQorCQkJCXNjc2lfZG1hX3VubWFwKGlvX3Rhc2stPnNjc2lfY21uZCk7CiAJCQlpb190YXNrLT5zY3NpX2NtbmQgPSBOVUxMOwogCQl9CiAJfSBlbHNlIHsKQEAgLTUwNTEsNyArNDcyMCw2IEBACiAKIAljaWQgPSBiZWlzY3NpX2Nvbm4tPmJlaXNjc2lfY29ubl9jaWQ7CiAJcHdyYiA9IGlvX3Rhc2stPnB3cmJfaGFuZGxlLT5wd3JiOwotCW1lbXNldChwd3JiLCAwLCBzaXplb2YoKnB3cmIpKTsKIAogCWlmIChpc19jaGlwX2JlMl9iZTNyKHBoYmEpKSB7CiAJCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfd3JiLCBjbWRzbl9pdHQsIHB3cmIsCkBAIC01MTY1LDYgKzQ4MzMsMTUgQEAKIAlpbnQgbnVtX3NnOwogCXVuc2lnbmVkIGludCAgd3JpdGVkaXIgPSAwLCB4ZmVybGVuID0gMDsKIAorCXBoYmEgPSBpb190YXNrLT5jb25uLT5waGJhOworCS8qKgorCSAqIEhCQSBpbiBlcnJvciBpbmNsdWRlcyBCRUlTQ1NJX0hCQV9GV19USU1FT1VULiBJTyBwYXRoIG1pZ2h0IGJlCisJICogb3BlcmF0aW9uYWwgaWYgRlcgc3RpbGwgZ2V0cyBoZWFydGJlYXQgZnJvbSBFUCBGVy4gSXMgbWFuYWdlbWVudAorCSAqIHBhdGggcmVhbGx5IG5lZWRlZCB0byBjb250aW51ZSBmdXJ0aGVyPworCSAqLworCWlmICghYmVpc2NzaV9oYmFfaXNfb25saW5lKHBoYmEpKQorCQlyZXR1cm4gLUVJTzsKKwogCWlmICghaW9fdGFzay0+Y29ubi0+bG9naW5faW5fcHJvZ3Jlc3MpCiAJCXRhc2stPmhkci0+ZXhwX3N0YXRzbiA9IDA7CiAKQEAgLTUxNzIsOCArNDg0OSw4IEBACiAJCXJldHVybiBiZWlzY3NpX210YXNrKHRhc2spOwogCiAJaW9fdGFzay0+c2NzaV9jbW5kID0gc2M7CisJaW9fdGFzay0+bnVtX3NnID0gMDsKIAludW1fc2cgPSBzY3NpX2RtYV9tYXAoc2MpOwotCXBoYmEgPSBpb190YXNrLT5jb25uLT5waGJhOwogCWlmIChudW1fc2cgPCAwKSB7CiAJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAogCQkJICAgIEJFSVNDU0lfTE9HX0lPIHwgQkVJU0NTSV9MT0dfSVNDU0ksCkBAIC01MTg0LDYgKzQ4NjEsMTEgQEAKIAogCQlyZXR1cm4gbnVtX3NnOwogCX0KKwkvKioKKwkgKiBGb3Igc2NzaSBjbWQgdGFzaywgY2hlY2sgbnVtX3NnIGJlZm9yZSB1bm1hcHBpbmcgaW4gY2xlYW51cF90YXNrLgorCSAqIEZvciBtYW5hZ2VtZW50IHRhc2ssIGNsZWFudXBfdGFzayBjaGVja3MgbXRhc2tfYWRkciBiZWZvcmUgdW5tYXBwaW5nLgorCSAqLworCWlvX3Rhc2stPm51bV9zZyA9IG51bV9zZzsKIAl4ZmVybGVuID0gc2NzaV9idWZmbGVuKHNjKTsKIAlzZyA9IHNjc2lfc2dsaXN0KHNjKTsKIAlpZiAoc2MtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpCkBAIC01MjEzLDYgKzQ4OTUsMTIgQEAKIAlzaG9zdCA9IGlzY3NpX2pvYl90b19zaG9zdChqb2IpOwogCXBoYmEgPSBpc2NzaV9ob3N0X3ByaXYoc2hvc3QpOwogCisJaWYgKCFiZWlzY3NpX2hiYV9pc19vbmxpbmUocGhiYSkpIHsKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLCBCRUlTQ1NJX0xPR19DT05GSUcsCisJCQkgICAgIkJNXyVkIDogSEJBIGluIGVycm9yIDB4JWx4XG4iLCBwaGJhLT5zdGF0ZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCiAJc3dpdGNoIChic2dfcmVxLT5tc2djb2RlKSB7CiAJY2FzZSBJU0NTSV9CU0dfSFNUX1ZFTkRPUjoKIAkJbm9uZW1iX2NtZC52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwKQEAgLTUyNDAsNiArNDkyOCwxNCBAQAogCQkJCQlwaGJhLT5jdHJsLm1jY190YWdfc3RhdHVzW3RhZ10sCiAJCQkJCW1zZWNzX3RvX2ppZmZpZXMoCiAJCQkJCUJFSVNDU0lfSE9TVF9NQlhfVElNRU9VVCkpOworCisJCWlmICghdGVzdF9iaXQoQkVJU0NTSV9IQkFfT05MSU5FLCAmcGhiYS0+c3RhdGUpKSB7CisJCQljbGVhcl9iaXQoTUNDX1RBR19TVEFURV9SVU5OSU5HLAorCQkJCSAgJnBoYmEtPmN0cmwucHRhZ19zdGF0ZVt0YWddLnRhZ19zdGF0ZSk7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwgbm9uZW1iX2NtZC5zaXplLAorCQkJCQkgICAgbm9uZW1iX2NtZC52YSwgbm9uZW1iX2NtZC5kbWEpOworCQkJcmV0dXJuIC1FSU87CisJCX0KIAkJZXh0ZF9zdGF0dXMgPSAocGhiYS0+Y3RybC5tY2NfdGFnX3N0YXR1c1t0YWddICYKIAkJCSAgICAgICBDUUVfU1RBVFVTX0FERExfTUFTSykgPj4gQ1FFX1NUQVRVU19BRERMX1NISUZUOwogCQlzdGF0dXMgPSBwaGJhLT5jdHJsLm1jY190YWdfc3RhdHVzW3RhZ10gJiBDUUVfU1RBVFVTX01BU0s7CkBAIC01MjgzLDIxICs0OTc5LDUxNCBAQAogCWJlaXNjc2lfbG9nX2VuYWJsZV9pbml0KHBoYmEsIGJlaXNjc2lfbG9nX2VuYWJsZSk7CiB9CiAKK3ZvaWQgYmVpc2NzaV9zdGFydF9ib290X3dvcmsoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1bnNpZ25lZCBpbnQgc19oYW5kbGUpCit7CisJaWYgKHBoYmEtPmJvb3Rfc3RydWN0LmJvb3Rfa3NldCkKKwkJcmV0dXJuOworCisJLyogc2tpcCBpZiBib290IHdvcmsgaXMgYWxyZWFkeSBpbiBwcm9ncmVzcyAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KEJFSVNDU0lfSEJBX0JPT1RfV09SSywgJnBoYmEtPnN0YXRlKSkKKwkJcmV0dXJuOworCisJcGhiYS0+Ym9vdF9zdHJ1Y3QucmV0cnkgPSAzOworCXBoYmEtPmJvb3Rfc3RydWN0LnRhZyA9IDA7CisJcGhiYS0+Ym9vdF9zdHJ1Y3Quc19oYW5kbGUgPSBzX2hhbmRsZTsKKwlwaGJhLT5ib290X3N0cnVjdC5hY3Rpb24gPSBCRUlTQ1NJX0JPT1RfR0VUX1NIQU5ETEU7CisJc2NoZWR1bGVfd29yaygmcGhiYS0+Ym9vdF93b3JrKTsKK30KKworc3RhdGljIHNzaXplX3QgYmVpc2NzaV9zaG93X2Jvb3RfdGd0X2luZm8odm9pZCAqZGF0YSwgaW50IHR5cGUsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBkYXRhOworCXN0cnVjdCBtZ210X3Nlc3Npb25faW5mbyAqYm9vdF9zZXNzID0gJnBoYmEtPmJvb3Rfc3RydWN0LmJvb3Rfc2VzczsKKwlzdHJ1Y3QgbWdtdF9jb25uX2luZm8gKmJvb3RfY29ubiA9ICZib290X3Nlc3MtPmNvbm5fbGlzdFswXTsKKwljaGFyICpzdHIgPSBidWY7CisJaW50IHJjID0gLUVQRVJNOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJU0NTSV9CT09UX1RHVF9OQU1FOgorCQlyYyA9IHNwcmludGYoYnVmLCAiJS4qc1xuIiwKKwkJCSAgICAoaW50KXN0cmxlbihib290X3Nlc3MtPnRhcmdldF9uYW1lKSwKKwkJCSAgICAoY2hhciAqKSZib290X3Nlc3MtPnRhcmdldF9uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9CT09UX1RHVF9JUF9BRERSOgorCQlpZiAoYm9vdF9jb25uLT5kZXN0X2lwYWRkci5pcF90eXBlID09IEJFSVNDU0lfSVBfVFlQRV9WNCkKKwkJCXJjID0gc3ByaW50ZihidWYsICIlcEk0XG4iLAorCQkJCShjaGFyICopJmJvb3RfY29ubi0+ZGVzdF9pcGFkZHIuYWRkcik7CisJCWVsc2UKKwkJCXJjID0gc3ByaW50ZihzdHIsICIlcEk2XG4iLAorCQkJCShjaGFyICopJmJvb3RfY29ubi0+ZGVzdF9pcGFkZHIuYWRkcik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9UR1RfUE9SVDoKKwkJcmMgPSBzcHJpbnRmKHN0ciwgIiVkXG4iLCBib290X2Nvbm4tPmRlc3RfcG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBJU0NTSV9CT09UX1RHVF9DSEFQX05BTUU6CisJCXJjID0gc3ByaW50ZihzdHIsICAiJS4qc1xuIiwKKwkJCSAgICAgYm9vdF9jb25uLT5uZWdvdGlhdGVkX2xvZ2luX29wdGlvbnMuYXV0aF9kYXRhLmNoYXAuCisJCQkgICAgIHRhcmdldF9jaGFwX25hbWVfbGVuZ3RoLAorCQkJICAgICAoY2hhciAqKSZib290X2Nvbm4tPm5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy4KKwkJCSAgICAgYXV0aF9kYXRhLmNoYXAudGFyZ2V0X2NoYXBfbmFtZSk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9UR1RfQ0hBUF9TRUNSRVQ6CisJCXJjID0gc3ByaW50ZihzdHIsICAiJS4qc1xuIiwKKwkJCSAgICAgYm9vdF9jb25uLT5uZWdvdGlhdGVkX2xvZ2luX29wdGlvbnMuYXV0aF9kYXRhLmNoYXAuCisJCQkgICAgIHRhcmdldF9zZWNyZXRfbGVuZ3RoLAorCQkJICAgICAoY2hhciAqKSZib290X2Nvbm4tPm5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy4KKwkJCSAgICAgYXV0aF9kYXRhLmNoYXAudGFyZ2V0X3NlY3JldCk7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9UR1RfUkVWX0NIQVBfTkFNRToKKwkJcmMgPSBzcHJpbnRmKHN0ciwgICIlLipzXG4iLAorCQkJICAgICBib290X2Nvbm4tPm5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy5hdXRoX2RhdGEuY2hhcC4KKwkJCSAgICAgaW50cl9jaGFwX25hbWVfbGVuZ3RoLAorCQkJICAgICAoY2hhciAqKSZib290X2Nvbm4tPm5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy4KKwkJCSAgICAgYXV0aF9kYXRhLmNoYXAuaW50cl9jaGFwX25hbWUpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfVEdUX1JFVl9DSEFQX1NFQ1JFVDoKKwkJcmMgPSBzcHJpbnRmKHN0ciwgICIlLipzXG4iLAorCQkJICAgICBib290X2Nvbm4tPm5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy5hdXRoX2RhdGEuY2hhcC4KKwkJCSAgICAgaW50cl9zZWNyZXRfbGVuZ3RoLAorCQkJICAgICAoY2hhciAqKSZib290X2Nvbm4tPm5lZ290aWF0ZWRfbG9naW5fb3B0aW9ucy4KKwkJCSAgICAgYXV0aF9kYXRhLmNoYXAuaW50cl9zZWNyZXQpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0ZMQUdTOgorCQlyYyA9IHNwcmludGYoc3RyLCAiMlxuIik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9UR1RfTklDX0FTU09DOgorCQlyYyA9IHNwcmludGYoc3RyLCAiMFxuIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJlaXNjc2lfc2hvd19ib290X2luaV9pbmZvKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpCit7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gZGF0YTsKKwljaGFyICpzdHIgPSBidWY7CisJaW50IHJjID0gLUVQRVJNOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJU0NTSV9CT09UX0lOSV9JTklUSUFUT1JfTkFNRToKKwkJcmMgPSBzcHJpbnRmKHN0ciwgIiVzXG4iLAorCQkJICAgICBwaGJhLT5ib290X3N0cnVjdC5ib290X3Nlc3MuaW5pdGlhdG9yX2lzY3NpbmFtZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJlaXNjc2lfc2hvd19ib290X2V0aF9pbmZvKHZvaWQgKmRhdGEsIGludCB0eXBlLCBjaGFyICpidWYpCit7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gZGF0YTsKKwljaGFyICpzdHIgPSBidWY7CisJaW50IHJjID0gLUVQRVJNOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJU0NTSV9CT09UX0VUSF9GTEFHUzoKKwkJcmMgPSBzcHJpbnRmKHN0ciwgIjJcbiIpOworCQlicmVhazsKKwljYXNlIElTQ1NJX0JPT1RfRVRIX0lOREVYOgorCQlyYyA9IHNwcmludGYoc3RyLCAiMFxuIik7CisJCWJyZWFrOworCWNhc2UgSVNDU0lfQk9PVF9FVEhfTUFDOgorCQlyYyAgPSBiZWlzY3NpX2dldF9tYWNhZGRyKHN0ciwgcGhiYSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB1bW9kZV90IGJlaXNjc2lfdGd0X2dldF9hdHRyX3Zpc2liaWxpdHkodm9pZCAqZGF0YSwgaW50IHR5cGUpCit7CisJdW1vZGVfdCByYyA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElTQ1NJX0JPT1RfVEdUX05BTUU6CisJY2FzZSBJU0NTSV9CT09UX1RHVF9JUF9BRERSOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfUE9SVDoKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0NIQVBfTkFNRToKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0NIQVBfU0VDUkVUOgorCWNhc2UgSVNDU0lfQk9PVF9UR1RfUkVWX0NIQVBfTkFNRToKKwljYXNlIElTQ1NJX0JPT1RfVEdUX1JFVl9DSEFQX1NFQ1JFVDoKKwljYXNlIElTQ1NJX0JPT1RfVEdUX05JQ19BU1NPQzoKKwljYXNlIElTQ1NJX0JPT1RfVEdUX0ZMQUdTOgorCQlyYyA9IFNfSVJVR087CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB1bW9kZV90IGJlaXNjc2lfaW5pX2dldF9hdHRyX3Zpc2liaWxpdHkodm9pZCAqZGF0YSwgaW50IHR5cGUpCit7CisJdW1vZGVfdCByYyA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElTQ1NJX0JPT1RfSU5JX0lOSVRJQVRPUl9OQU1FOgorCQlyYyA9IFNfSVJVR087CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB1bW9kZV90IGJlaXNjc2lfZXRoX2dldF9hdHRyX3Zpc2liaWxpdHkodm9pZCAqZGF0YSwgaW50IHR5cGUpCit7CisJdW1vZGVfdCByYyA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElTQ1NJX0JPT1RfRVRIX0ZMQUdTOgorCWNhc2UgSVNDU0lfQk9PVF9FVEhfTUFDOgorCWNhc2UgSVNDU0lfQk9PVF9FVEhfSU5ERVg6CisJCXJjID0gU19JUlVHTzsKKwkJYnJlYWs7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYmVpc2NzaV9ib290X2tvYmpfcmVsZWFzZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IGRhdGE7CisKKwlzY3NpX2hvc3RfcHV0KHBoYmEtPnNob3N0KTsKK30KKworc3RhdGljIGludCBiZWlzY3NpX2Jvb3RfY3JlYXRlX2tzZXQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXN0cnVjdCBib290X3N0cnVjdCAqYnMgPSAmcGhiYS0+Ym9vdF9zdHJ1Y3Q7CisJc3RydWN0IGlzY3NpX2Jvb3Rfa29iaiAqYm9vdF9rb2JqOworCisJaWYgKGJzLT5ib290X2tzZXQpIHsKKwkJX19iZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKKwkJCSAgICAgICJCTV8lZDogYm9vdF9rc2V0IGFscmVhZHkgY3JlYXRlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWJzLT5ib290X2tzZXQgPSBpc2NzaV9ib290X2NyZWF0ZV9ob3N0X2tzZXQocGhiYS0+c2hvc3QtPmhvc3Rfbm8pOworCWlmICghYnMtPmJvb3Rfa3NldCkgeworCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAorCQkJICAgICAgIkJNXyVkOiBib290X2tzZXQgYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogZ2V0IHNob3N0IHJlZiBiZWNhdXNlIHRoZSBzaG93IGZ1bmN0aW9uIHdpbGwgcmVmZXIgcGhiYSAqLworCWlmICghc2NzaV9ob3N0X2dldChwaGJhLT5zaG9zdCkpCisJCWdvdG8gZnJlZV9rc2V0OworCisJYm9vdF9rb2JqID0gaXNjc2lfYm9vdF9jcmVhdGVfdGFyZ2V0KGJzLT5ib290X2tzZXQsIDAsIHBoYmEsCisJCQkJCSAgICAgYmVpc2NzaV9zaG93X2Jvb3RfdGd0X2luZm8sCisJCQkJCSAgICAgYmVpc2NzaV90Z3RfZ2V0X2F0dHJfdmlzaWJpbGl0eSwKKwkJCQkJICAgICBiZWlzY3NpX2Jvb3Rfa29ial9yZWxlYXNlKTsKKwlpZiAoIWJvb3Rfa29iaikKKwkJZ290byBwdXRfc2hvc3Q7CisKKwlpZiAoIXNjc2lfaG9zdF9nZXQocGhiYS0+c2hvc3QpKQorCQlnb3RvIGZyZWVfa3NldDsKKworCWJvb3Rfa29iaiA9IGlzY3NpX2Jvb3RfY3JlYXRlX2luaXRpYXRvcihicy0+Ym9vdF9rc2V0LCAwLCBwaGJhLAorCQkJCQkJYmVpc2NzaV9zaG93X2Jvb3RfaW5pX2luZm8sCisJCQkJCQliZWlzY3NpX2luaV9nZXRfYXR0cl92aXNpYmlsaXR5LAorCQkJCQkJYmVpc2NzaV9ib290X2tvYmpfcmVsZWFzZSk7CisJaWYgKCFib290X2tvYmopCisJCWdvdG8gcHV0X3Nob3N0OworCisJaWYgKCFzY3NpX2hvc3RfZ2V0KHBoYmEtPnNob3N0KSkKKwkJZ290byBmcmVlX2tzZXQ7CisKKwlib290X2tvYmogPSBpc2NzaV9ib290X2NyZWF0ZV9ldGhlcm5ldChicy0+Ym9vdF9rc2V0LCAwLCBwaGJhLAorCQkJCQkgICAgICAgYmVpc2NzaV9zaG93X2Jvb3RfZXRoX2luZm8sCisJCQkJCSAgICAgICBiZWlzY3NpX2V0aF9nZXRfYXR0cl92aXNpYmlsaXR5LAorCQkJCQkgICAgICAgYmVpc2NzaV9ib290X2tvYmpfcmVsZWFzZSk7CisJaWYgKCFib290X2tvYmopCisJCWdvdG8gcHV0X3Nob3N0OworCisJcmV0dXJuIDA7CisKK3B1dF9zaG9zdDoKKwlzY3NpX2hvc3RfcHV0KHBoYmEtPnNob3N0KTsKK2ZyZWVfa3NldDoKKwlpc2NzaV9ib290X2Rlc3Ryb3lfa3NldChicy0+Ym9vdF9rc2V0KTsKKwlicy0+Ym9vdF9rc2V0ID0gTlVMTDsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgYmVpc2NzaV9ib290X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVpc2NzaV9oYmEsIGJvb3Rfd29yayk7CisJc3RydWN0IGJvb3Rfc3RydWN0ICpicyA9ICZwaGJhLT5ib290X3N0cnVjdDsKKwl1bnNpZ25lZCBpbnQgdGFnID0gMDsKKworCWlmICghYmVpc2NzaV9oYmFfaXNfb25saW5lKHBoYmEpKQorCQlyZXR1cm47CisKKwliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sCisJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19NQk9YLAorCQkgICAgIkJNXyVkIDogJXMgYWN0aW9uICVkXG4iLAorCQkgICAgX19mdW5jX18sIHBoYmEtPmJvb3Rfc3RydWN0LmFjdGlvbik7CisKKwlzd2l0Y2ggKHBoYmEtPmJvb3Rfc3RydWN0LmFjdGlvbikgeworCWNhc2UgQkVJU0NTSV9CT09UX1JFT1BFTl9TRVNTOgorCQl0YWcgPSBiZWlzY3NpX2Jvb3RfcmVvcGVuX3Nlc3MocGhiYSk7CisJCWJyZWFrOworCWNhc2UgQkVJU0NTSV9CT09UX0dFVF9TSEFORExFOgorCQl0YWcgPSBfX2JlaXNjc2lfYm9vdF9nZXRfc2hhbmRsZShwaGJhLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBCRUlTQ1NJX0JPT1RfR0VUX1NJTkZPOgorCQl0YWcgPSBiZWlzY3NpX2Jvb3RfZ2V0X3NpbmZvKHBoYmEpOworCQlicmVhazsKKwljYXNlIEJFSVNDU0lfQk9PVF9MT0dPVVRfU0VTUzoKKwkJdGFnID0gYmVpc2NzaV9ib290X2xvZ291dF9zZXNzKHBoYmEpOworCQlicmVhazsKKwljYXNlIEJFSVNDU0lfQk9PVF9DUkVBVEVfS1NFVDoKKwkJYmVpc2NzaV9ib290X2NyZWF0ZV9rc2V0KHBoYmEpOworCQkvKioKKwkJICogdXBkYXRlZCBib290X2tzZXQgaXMgbWFkZSB2aXNpYmxlIHRvIGFsbCBiZWZvcmUKKwkJICogZW5kaW5nIHRoZSBib290IHdvcmsuCisJCSAqLworCQltYigpOworCQljbGVhcl9iaXQoQkVJU0NTSV9IQkFfQk9PVF9XT1JLLCAmcGhiYS0+c3RhdGUpOworCQlyZXR1cm47CisJfQorCWlmICghdGFnKSB7CisJCWlmIChicy0+cmV0cnktLSkKKwkJCXNjaGVkdWxlX3dvcmsoJnBoYmEtPmJvb3Rfd29yayk7CisJCWVsc2UKKwkJCWNsZWFyX2JpdChCRUlTQ1NJX0hCQV9CT09UX1dPUkssICZwaGJhLT5zdGF0ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiZWlzY3NpX2VxZF91cGRhdGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OworCXN0cnVjdCBiZV9zZXRfZXFkIHNldF9lcWRbTUFYX0NQVVNdOworCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKKwlzdHJ1Y3QgYmVfZXFfb2JqICpwYmVfZXE7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOworCXVuc2lnbmVkIGludCBwcHMsIGRlbHRhOworCXN0cnVjdCBiZV9haWNfb2JqICphaWM7CisJaW50IGVxZCwgaSwgbnVtID0gMDsKKwl1bnNpZ25lZCBsb25nIG5vdzsKKworCXBoYmEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJlaXNjc2lfaGJhLCBlcWRfdXBkYXRlLndvcmspOworCWlmICghYmVpc2NzaV9oYmFfaXNfb25saW5lKHBoYmEpKQorCQlyZXR1cm47CisKKwlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKKwlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7CisKKwlmb3IgKGkgPSAwOyBpIDw9IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKKwkJYWljID0gJnBoYmEtPmFpY19vYmpbaV07CisJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOworCQlub3cgPSBqaWZmaWVzOworCQlpZiAoIWFpYy0+amlmZmllcyB8fCB0aW1lX2JlZm9yZShub3csIGFpYy0+amlmZmllcykgfHwKKwkJICAgIHBiZV9lcS0+Y3FfY291bnQgPCBhaWMtPmVxX3ByZXYpIHsKKwkJCWFpYy0+amlmZmllcyA9IG5vdzsKKwkJCWFpYy0+ZXFfcHJldiA9IHBiZV9lcS0+Y3FfY291bnQ7CisJCQljb250aW51ZTsKKwkJfQorCQlkZWx0YSA9IGppZmZpZXNfdG9fbXNlY3Mobm93IC0gYWljLT5qaWZmaWVzKTsKKwkJcHBzID0gKCgodTMyKShwYmVfZXEtPmNxX2NvdW50IC0gYWljLT5lcV9wcmV2KSAqIDEwMDApIC8gZGVsdGEpOworCQllcWQgPSAocHBzIC8gMTUwMCkgPDwgMjsKKworCQlpZiAoZXFkIDwgOCkKKwkJCWVxZCA9IDA7CisJCWVxZCA9IG1pbl90KHUzMiwgZXFkLCBwaHdpX2NvbnRleHQtPm1heF9lcWQpOworCQllcWQgPSBtYXhfdCh1MzIsIGVxZCwgcGh3aV9jb250ZXh0LT5taW5fZXFkKTsKKworCQlhaWMtPmppZmZpZXMgPSBub3c7CisJCWFpYy0+ZXFfcHJldiA9IHBiZV9lcS0+Y3FfY291bnQ7CisKKwkJaWYgKGVxZCAhPSBhaWMtPnByZXZfZXFkKSB7CisJCQlzZXRfZXFkW251bV0uZGVsYXlfbXVsdGlwbGllciA9IChlcWQgKiA2NSkvMTAwOworCQkJc2V0X2VxZFtudW1dLmVxX2lkID0gcGJlX2VxLT5xLmlkOworCQkJYWljLT5wcmV2X2VxZCA9IGVxZDsKKwkJCW51bSsrOworCQl9CisJfQorCWlmIChudW0pCisJCS8qIGNvbXBsZXRpb24gb2YgdGhpcyBpcyBpZ25vcmVkICovCisJCWJlaXNjc2lfbW9kaWZ5X2VxX2RlbGF5KHBoYmEsIHNldF9lcWQsIG51bSk7CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBoYmEtPmVxZF91cGRhdGUsCisJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKEJFSVNDU0lfRVFEX1VQREFURV9JTlRFUlZBTCkpOworfQorCitzdGF0aWMgdm9pZCBiZWlzY3NpX21zaXhfZW5hYmxlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlpbnQgaSwgc3RhdHVzOworCisJZm9yIChpID0gMDsgaSA8PSBwaGJhLT5udW1fY3B1czsgaSsrKQorCQlwaGJhLT5tc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOworCisJc3RhdHVzID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKHBoYmEtPnBjaWRldiwgcGhiYS0+bXNpeF9lbnRyaWVzLAorCQkJCSAgICAgICBwaGJhLT5udW1fY3B1cyArIDEsIHBoYmEtPm51bV9jcHVzICsgMSk7CisJaWYgKHN0YXR1cyA+IDApCisJCXBoYmEtPm1zaXhfZW5hYmxlZCA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGJlaXNjc2lfaHdfdHBlX2NoZWNrKHVuc2lnbmVkIGxvbmcgcHRyKQoreworCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYTsKKwl1MzIgd2FpdDsKKworCXBoYmEgPSAoc3RydWN0IGJlaXNjc2lfaGJhICopcHRyOworCS8qIGlmIG5vdCBUUEUsIGRvIG5vdGhpbmcgKi8KKwlpZiAoIWJlaXNjc2lfZGV0ZWN0X3RwZShwaGJhKSkKKwkJcmV0dXJuOworCisJLyogd2FpdCBkZWZhdWx0IDQwMDBtcyBiZWZvcmUgcmVjb3ZlcmluZyAqLworCXdhaXQgPSA0MDAwOworCWlmIChwaGJhLT51ZTJycCA+IEJFSVNDU0lfVUVfREVURUNUX0lOVEVSVkFMKQorCQl3YWl0ID0gcGhiYS0+dWUycnAgLSBCRUlTQ1NJX1VFX0RFVEVDVF9JTlRFUlZBTDsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocGhiYS0+d3EsICZwaGJhLT5yZWNvdmVyX3BvcnQsCisJCQkgICBtc2Vjc190b19qaWZmaWVzKHdhaXQpKTsKK30KKworc3RhdGljIHZvaWQgYmVpc2NzaV9od19oZWFsdGhfY2hlY2sodW5zaWduZWQgbG9uZyBwdHIpCit7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOworCisJcGhiYSA9IChzdHJ1Y3QgYmVpc2NzaV9oYmEgKilwdHI7CisJYmVpc2NzaV9kZXRlY3RfdWUocGhiYSk7CisJaWYgKGJlaXNjc2lfZGV0ZWN0X3VlKHBoYmEpKSB7CisJCV9fYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCisJCQkgICAgICAiQk1fJWQgOiBwb3J0IGluIGVycm9yOiAlbHhcbiIsIHBoYmEtPnN0YXRlKTsKKwkJLyogc2Vzc2lvbnMgYXJlIG5vIGxvbmdlciB2YWxpZCwgc28gZmlyc3QgZmFpbCB0aGUgc2Vzc2lvbnMgKi8KKwkJcXVldWVfd29yayhwaGJhLT53cSwgJnBoYmEtPnNlc3Nfd29yayk7CisKKwkJLyogZGV0ZWN0IFVFUiBzdXBwb3J0ZWQgKi8KKwkJaWYgKCF0ZXN0X2JpdChCRUlTQ1NJX0hCQV9VRVJfU1VQUCwgJnBoYmEtPnN0YXRlKSkKKwkJCXJldHVybjsKKwkJLyogbW9kaWZ5IHRoaXMgdGltZXIgdG8gY2hlY2sgVFBFICovCisJCXBoYmEtPmh3X2NoZWNrLmZ1bmN0aW9uID0gYmVpc2NzaV9od190cGVfY2hlY2s7CisJfQorCisJbW9kX3RpbWVyKCZwaGJhLT5od19jaGVjaywKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhCRUlTQ1NJX1VFX0RFVEVDVF9JTlRFUlZBTCkpOworfQorCiAvKgotICogYmVpc2NzaV9xdWllc2NlKCktIENsZWFudXAgRHJpdmVyIHJlc291cmNlcworICogYmVpc2NzaV9lbmFibGVfcG9ydCgpLSBFbmFibGVzIHRoZSBkaXNhYmxlZCBwb3J0LgorICogT25seSBwb3J0IHJlc291cmNlcyBmcmVlZCBpbiBkaXNhYmxlIGZ1bmN0aW9uIGFyZSByZWFsbG9jYXRlZC4KKyAqIFRoaXMgaXMgY2FsbGVkIGluIEhCQSBlcnJvciBoYW5kbGluZyBwYXRoLgorICoKKyAqIEBwaGJhOiBJbnN0YW5jZSBvZiBkcml2ZXIgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqCisgKiovCitzdGF0aWMgaW50IGJlaXNjc2lfZW5hYmxlX3BvcnQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQoreworCXN0cnVjdCBod2lfY29udGV4dF9tZW1vcnkgKnBod2lfY29udGV4dDsKKwlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CisJc3RydWN0IGJlX2VxX29iaiAqcGJlX2VxOworCWludCByZXQsIGk7CisKKwlpZiAodGVzdF9iaXQoQkVJU0NTSV9IQkFfT05MSU5FLCAmcGhiYS0+c3RhdGUpKSB7CisJCV9fYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCisJCQkgICAgICAiQk1fJWQgOiAlcyA6IHBvcnQgaXMgb25saW5lICVseFxuIiwKKwkJCSAgICAgIF9fZnVuY19fLCBwaGJhLT5zdGF0ZSk7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IGJlaXNjc2lfaW5pdF9zbGlwb3J0KHBoYmEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoZW5hYmxlX21zaXgpCisJCWZpbmRfbnVtX2NwdXMocGhiYSk7CisJZWxzZQorCQlwaGJhLT5udW1fY3B1cyA9IDE7CisJaWYgKGVuYWJsZV9tc2l4KSB7CisJCWJlaXNjc2lfbXNpeF9lbmFibGUocGhiYSk7CisJCWlmICghcGhiYS0+bXNpeF9lbmFibGVkKQorCQkJcGhiYS0+bnVtX2NwdXMgPSAxOworCX0KKworCWJlaXNjc2lfZ2V0X3BhcmFtcyhwaGJhKTsKKwkvKiBSZS1lbmFibGUgVUVSLiBJZiBkaWZmZXJlbnQgVFBFIG9jY3VycyB0aGVuIGl0IGlzIHJlY292ZXJhYmxlLiAqLworCWJlaXNjc2lfc2V0X3Vlcl9mZWF0dXJlKHBoYmEpOworCisJcGhiYS0+c2hvc3QtPm1heF9pZCA9IHBoYmEtPnBhcmFtcy5jeG5zX3Blcl9jdHJsOworCXBoYmEtPnNob3N0LT5jYW5fcXVldWUgPSBwaGJhLT5wYXJhbXMuaW9zX3Blcl9jdHJsOworCXJldCA9IGh3aV9pbml0X2NvbnRyb2xsZXIocGhiYSk7CisJaWYgKHJldCkgeworCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAorCQkJICAgICAgIkJNXyVkIDogaW5pdCBjb250cm9sbGVyIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJZ290byBkaXNhYmxlX21zaXg7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9NQ0NfQ01EOyBpKyspIHsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmcGhiYS0+Y3RybC5tY2Nfd2FpdFtpICsgMV0pOworCQlwaGJhLT5jdHJsLm1jY190YWdbaV0gPSBpICsgMTsKKwkJcGhiYS0+Y3RybC5tY2NfdGFnX3N0YXR1c1tpICsgMV0gPSAwOworCQlwaGJhLT5jdHJsLm1jY190YWdfYXZhaWxhYmxlKys7CisJfQorCisJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CisJcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OworCWZvciAoaSA9IDA7IGkgPCBwaGJhLT5udW1fY3B1czsgaSsrKSB7CisJCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOworCQlpcnFfcG9sbF9pbml0KCZwYmVfZXEtPmlvcG9sbCwgYmVfaW9wb2xsX2J1ZGdldCwgYmVfaW9wb2xsKTsKKwl9CisKKwlpID0gKHBoYmEtPm1zaXhfZW5hYmxlZCkgPyBpIDogMDsKKwkvKiBXb3JrIGl0ZW0gZm9yIE1DQyBoYW5kbGluZyAqLworCXBiZV9lcSA9ICZwaHdpX2NvbnRleHQtPmJlX2VxW2ldOworCUlOSVRfV09SSygmcGJlX2VxLT5tY2Nfd29yaywgYmVpc2NzaV9tY2Nfd29yayk7CisKKwlyZXQgPSBiZWlzY3NpX2luaXRfaXJxcyhwaGJhKTsKKwlpZiAocmV0IDwgMCkgeworCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAorCQkJICAgICAgIkJNXyVkIDogc2V0dXAgSVJRcyBmYWlsZWQgJWRcbiIsIHJldCk7CisJCWdvdG8gY2xlYW51cF9wb3J0OworCX0KKwlod2lfZW5hYmxlX2ludHIocGhiYSk7CisJLyogcG9ydCBvcGVyYXRpb25hbDogY2xlYXIgYWxsIGVycm9yIGJpdHMgKi8KKwlzZXRfYml0KEJFSVNDU0lfSEJBX09OTElORSwgJnBoYmEtPnN0YXRlKTsKKwlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywKKwkJICAgICAgIkJNXyVkIDogcG9ydCBvbmxpbmU6IDB4JWx4XG4iLCBwaGJhLT5zdGF0ZSk7CisKKwkvKiBzdGFydCBod19jaGVjayB0aW1lciBhbmQgZXFkX3VwZGF0ZSB3b3JrICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwaGJhLT5lcWRfdXBkYXRlLAorCQkJICAgICAgbXNlY3NfdG9famlmZmllcyhCRUlTQ1NJX0VRRF9VUERBVEVfSU5URVJWQUwpKTsKKworCS8qKgorCSAqIFRpbWVyIGZ1bmN0aW9uIGdldHMgbW9kaWZpZWQgZm9yIFRQRSBkZXRlY3Rpb24uCisJICogQWx3YXlzIHJlaW5pdCB0byBkbyBoZWFsdGggY2hlY2sgZmlyc3QuCisJICovCisJcGhiYS0+aHdfY2hlY2suZnVuY3Rpb24gPSBiZWlzY3NpX2h3X2hlYWx0aF9jaGVjazsKKwltb2RfdGltZXIoJnBoYmEtPmh3X2NoZWNrLAorCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEJFSVNDU0lfVUVfREVURUNUX0lOVEVSVkFMKSk7CisJcmV0dXJuIDA7CisKK2NsZWFudXBfcG9ydDoKKwlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgeworCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKKwkJaXJxX3BvbGxfZGlzYWJsZSgmcGJlX2VxLT5pb3BvbGwpOworCX0KKwlod2lfY2xlYW51cF9wb3J0KHBoYmEpOworCitkaXNhYmxlX21zaXg6CisJaWYgKHBoYmEtPm1zaXhfZW5hYmxlZCkKKwkJcGNpX2Rpc2FibGVfbXNpeChwaGJhLT5wY2lkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGJlaXNjc2lfZGlzYWJsZV9wb3J0KCktIERpc2FibGUgcG9ydCBhbmQgY2xlYW51cCBkcml2ZXIgcmVzb3VyY2VzLgorICogVGhpcyBpcyBjYWxsZWQgaW4gSEJBIGVycm9yIGhhbmRsaW5nIGFuZCBkcml2ZXIgcmVtb3ZhbC4KICAqIEBwaGJhOiBJbnN0YW5jZSBQcml2IHN0cnVjdHVyZQotICogQHVubG9hZF9zdGF0ZTppIENsZWFuIG9yIEVFSCB1bmxvYWQgc3RhdGUKKyAqIEB1bmxvYWQ6IGluZGljYXRlIGRyaXZlciBpcyB1bmxvYWRpbmcKICAqCiAgKiBGcmVlIHRoZSBPUyBhbmQgSFcgcmVzb3VyY2VzIGhlbGQgYnkgdGhlIGRyaXZlcgogICoqLwotc3RhdGljIHZvaWQgYmVpc2NzaV9xdWllc2NlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKLQkJdWludDMyX3QgdW5sb2FkX3N0YXRlKQorc3RhdGljIHZvaWQgYmVpc2NzaV9kaXNhYmxlX3BvcnQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBpbnQgdW5sb2FkKQogewotCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKIAlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CisJc3RydWN0IGh3aV9jb250cm9sbGVyICpwaHdpX2N0cmxyOwogCXN0cnVjdCBiZV9lcV9vYmogKnBiZV9lcTsKIAl1bnNpZ25lZCBpbnQgaSwgbXNpeF92ZWM7CiAKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChCRUlTQ1NJX0hCQV9PTkxJTkUsICZwaGJhLT5zdGF0ZSkpCisJCXJldHVybjsKKwogCXBod2lfY3RybHIgPSBwaGJhLT5waHdpX2N0cmxyOwogCXBod2lfY29udGV4dCA9IHBod2lfY3RybHItPnBod2lfY3R4dDsKIAlod2lfZGlzYWJsZV9pbnRyKHBoYmEpOwpAQCAtNTMxMSwxNzEgKzU1MDAsNjEgQEAKIAkJaWYgKHBoYmEtPnBjaWRldi0+aXJxKQogCQkJZnJlZV9pcnEocGhiYS0+cGNpZGV2LT5pcnEsIHBoYmEpOwogCXBjaV9kaXNhYmxlX21zaXgocGhiYS0+cGNpZGV2KTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnBoYmEtPmJlaXNjc2lfaHdfY2hlY2tfdGFzayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGhiYS0+bnVtX2NwdXM7IGkrKykgewogCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKIAkJaXJxX3BvbGxfZGlzYWJsZSgmcGJlX2VxLT5pb3BvbGwpOwogCX0KLQotCWlmICh1bmxvYWRfc3RhdGUgPT0gQkVJU0NTSV9DTEVBTl9VTkxPQUQpIHsKLQkJZGVzdHJveV93b3JrcXVldWUocGhiYS0+d3EpOwotCQliZWlzY3NpX2NsZWFuX3BvcnQocGhiYSk7Ci0JCWJlaXNjc2lfZnJlZV9tZW0ocGhiYSk7Ci0KLQkJYmVpc2NzaV91bm1hcF9wY2lfZnVuY3Rpb24ocGhiYSk7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+cGNpZGV2LAotCQkJCSAgICBwaGJhLT5jdHJsLm1ib3hfbWVtX2FsbG9jZWQuc2l6ZSwKLQkJCQkgICAgcGhiYS0+Y3RybC5tYm94X21lbV9hbGxvY2VkLnZhLAotCQkJCSAgICBwaGJhLT5jdHJsLm1ib3hfbWVtX2FsbG9jZWQuZG1hKTsKLQl9IGVsc2UgewotCQlod2lfcHVyZ2VfZXEocGhiYSk7Ci0JCWh3aV9jbGVhbnVwKHBoYmEpOwotCX0KLQotfQotCi1zdGF0aWMgdm9pZCBiZWlzY3NpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQotewotCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9IE5VTEw7Ci0KLQlwaGJhID0gcGNpX2dldF9kcnZkYXRhKHBjaWRldik7Ci0JaWYgKCFwaGJhKSB7Ci0JCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiYmVpc2NzaV9yZW1vdmUgY2FsbGVkIHdpdGggbm8gcGhiYVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQliZWlzY3NpX2Rlc3Ryb3lfZGVmX2lmYWNlcyhwaGJhKTsKLQlpc2NzaV9ib290X2Rlc3Ryb3lfa3NldChwaGJhLT5ib290X2tzZXQpOwotCWlzY3NpX2hvc3RfcmVtb3ZlKHBoYmEtPnNob3N0KTsKLQliZWlzY3NpX3F1aWVzY2UocGhiYSwgQkVJU0NTSV9DTEVBTl9VTkxPQUQpOwotCXBjaV9kZXZfcHV0KHBoYmEtPnBjaWRldik7Ci0JaXNjc2lfaG9zdF9mcmVlKHBoYmEtPnNob3N0KTsKLQlwY2lfZGlzYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhwY2lkZXYpOwotCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIE5VTEwpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGNpZGV2KTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgYmVpc2NzaV9tc2l4X2VuYWJsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCi17Ci0JaW50IGksIHN0YXR1czsKLQotCWZvciAoaSA9IDA7IGkgPD0gcGhiYS0+bnVtX2NwdXM7IGkrKykKLQkJcGhiYS0+bXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gaTsKLQotCXN0YXR1cyA9IHBjaV9lbmFibGVfbXNpeF9yYW5nZShwaGJhLT5wY2lkZXYsIHBoYmEtPm1zaXhfZW50cmllcywKLQkJCQkgICAgICAgcGhiYS0+bnVtX2NwdXMgKyAxLCBwaGJhLT5udW1fY3B1cyArIDEpOwotCWlmIChzdGF0dXMgPiAwKQotCQlwaGJhLT5tc2l4X2VuYWJsZWQgPSB0cnVlOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBiZV9lcWRfdXBkYXRlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKLXsKLQlzdHJ1Y3QgYmVfc2V0X2VxZCBzZXRfZXFkW01BWF9DUFVTXTsKLQlzdHJ1Y3QgYmVfYWljX29iaiAqYWljOwotCXN0cnVjdCBiZV9lcV9vYmogKnBiZV9lcTsKLQlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7Ci0Jc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OwotCWludCBlcWQsIGksIG51bSA9IDA7Ci0JdWxvbmcgbm93OwotCXUzMiBwcHMsIGRlbHRhOwotCXVuc2lnbmVkIGludCB0YWc7Ci0KLQlwaHdpX2N0cmxyID0gcGhiYS0+cGh3aV9jdHJscjsKLQlwaHdpX2NvbnRleHQgPSBwaHdpX2N0cmxyLT5waHdpX2N0eHQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDw9IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKLQkJYWljID0gJnBoYmEtPmFpY19vYmpbaV07CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwaGJhLT5lcWRfdXBkYXRlKTsKKwljYW5jZWxfd29ya19zeW5jKCZwaGJhLT5ib290X3dvcmspOworCS8qIFdRIG1pZ2h0IGJlIHJ1bm5pbmcgY2FuY2VsIHF1ZXVlZCBtY2Nfd29yayBpZiB3ZSBhcmUgbm90IGV4aXRpbmcgKi8KKwlpZiAoIXVubG9hZCAmJiBiZWlzY3NpX2hiYV9pbl9lcnJvcihwaGJhKSkgewogCQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKLQkJbm93ID0gamlmZmllczsKLQkJaWYgKCFhaWMtPmppZmZzIHx8IHRpbWVfYmVmb3JlKG5vdywgYWljLT5qaWZmcykgfHwKLQkJICAgIHBiZV9lcS0+Y3FfY291bnQgPCBhaWMtPmVxX3ByZXYpIHsKLQkJCWFpYy0+amlmZnMgPSBub3c7Ci0JCQlhaWMtPmVxX3ByZXYgPSBwYmVfZXEtPmNxX2NvdW50OwotCQkJY29udGludWU7Ci0JCX0KLQkJZGVsdGEgPSBqaWZmaWVzX3RvX21zZWNzKG5vdyAtIGFpYy0+amlmZnMpOwotCQlwcHMgPSAoKCh1MzIpKHBiZV9lcS0+Y3FfY291bnQgLSBhaWMtPmVxX3ByZXYpICogMTAwMCkgLyBkZWx0YSk7Ci0JCWVxZCA9IChwcHMgLyAxNTAwKSA8PCAyOwotCi0JCWlmIChlcWQgPCA4KQotCQkJZXFkID0gMDsKLQkJZXFkID0gbWluX3QodTMyLCBlcWQsIHBod2lfY29udGV4dC0+bWF4X2VxZCk7Ci0JCWVxZCA9IG1heF90KHUzMiwgZXFkLCBwaHdpX2NvbnRleHQtPm1pbl9lcWQpOwotCi0JCWFpYy0+amlmZnMgPSBub3c7Ci0JCWFpYy0+ZXFfcHJldiA9IHBiZV9lcS0+Y3FfY291bnQ7Ci0KLQkJaWYgKGVxZCAhPSBhaWMtPnByZXZfZXFkKSB7Ci0JCQlzZXRfZXFkW251bV0uZGVsYXlfbXVsdGlwbGllciA9IChlcWQgKiA2NSkvMTAwOwotCQkJc2V0X2VxZFtudW1dLmVxX2lkID0gcGJlX2VxLT5xLmlkOwotCQkJYWljLT5wcmV2X2VxZCA9IGVxZDsKLQkJCW51bSsrOwotCQl9CisJCWNhbmNlbF93b3JrX3N5bmMoJnBiZV9lcS0+bWNjX3dvcmspOwogCX0KLQlpZiAobnVtKSB7Ci0JCXRhZyA9IGJlX2NtZF9tb2RpZnlfZXFfZGVsYXkocGhiYSwgc2V0X2VxZCwgbnVtKTsKLQkJaWYgKHRhZykKLQkJCWJlaXNjc2lfbWNjcV9jb21wbF93YWl0KHBoYmEsIHRhZywgTlVMTCwgTlVMTCk7Ci0JfQorCWh3aV9jbGVhbnVwX3BvcnQocGhiYSk7CiB9CiAKLXN0YXRpYyB2b2lkIGJlX2NoZWNrX2Jvb3Rfc2Vzc2lvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCitzdGF0aWMgdm9pZCBiZWlzY3NpX3Nlc3Nfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JaWYgKGJlaXNjc2lfc2V0dXBfYm9vdF9pbmZvKHBoYmEpKQotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKLQkJCSAgICAiQk1fJWQgOiBDb3VsZCBub3Qgc2V0IHVwICIKLQkJCSAgICAiaVNDU0kgYm9vdCBpbmZvIG9uIGFzeW5jIGV2ZW50LlxuIik7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOworCisJcGhiYSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVpc2NzaV9oYmEsIHNlc3Nfd29yayk7CisJLyoKKwkgKiBUaGlzIHdvcmsgZ2V0cyBzY2hlZHVsZWQgb25seSBpbiBjYXNlIG9mIEhCQSBlcnJvci4KKwkgKiBPbGQgc2Vzc2lvbnMgYXJlIGdvbmUgc28gbmVlZCB0byBiZSByZS1lc3RhYmxpc2hlZC4KKwkgKiBpc2NzaV9zZXNzaW9uX2ZhaWx1cmUgbmVlZHMgcHJvY2VzcyBjb250ZXh0IGhlbmNlIHRoaXMgd29yay4KKwkgKi8KKwlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24ocGhiYS0+c2hvc3QsIGJlaXNjc2lfc2Vzc2lvbl9mYWlsKTsKIH0KIAotLyoKLSAqIGJlaXNjc2lfaHdfaGVhbHRoX2NoZWNrKCktIENoZWNrIGFkYXB0ZXIgaGVhbHRoCi0gKiBAd29yazogd29yayBpdGVtIHRvIGNoZWNrIEhXIGhlYWx0aAotICoKLSAqIENoZWNrIGlmIGFkYXB0ZXIgaW4gYW4gdW5yZWNvdmVyYWJsZSBzdGF0ZSBvciBub3QuCi0gKiovCi1zdGF0aWMgdm9pZAotYmVpc2NzaV9od19oZWFsdGhfY2hlY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgYmVpc2NzaV9yZWNvdmVyX3BvcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVpc2NzaV9oYmEsCi0JCQkgICAgIGJlaXNjc2lfaHdfY2hlY2tfdGFzay53b3JrKTsKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmE7CiAKLQliZV9lcWRfdXBkYXRlKHBoYmEpOwotCi0JaWYgKHBoYmEtPnN0YXRlICYgQkVfQURBUFRFUl9DSEVDS19CT09UKSB7Ci0JCWlmICgocGhiYS0+Z2V0X2Jvb3QgPiAwKSAmJiAoIXBoYmEtPmJvb3Rfa3NldCkpIHsKLQkJCXBoYmEtPmdldF9ib290LS07Ci0JCQlpZiAoIShwaGJhLT5nZXRfYm9vdCAlIEJFX0dFVF9CT09UX1RPKSkKLQkJCQliZV9jaGVja19ib290X3Nlc3Npb24ocGhiYSk7Ci0JCX0gZWxzZSB7Ci0JCQlwaGJhLT5zdGF0ZSAmPSB+QkVfQURBUFRFUl9DSEVDS19CT09UOwotCQkJcGhiYS0+Z2V0X2Jvb3QgPSAwOwotCQl9Ci0JfQotCi0JYmVpc2NzaV91ZV9kZXRlY3QocGhiYSk7Ci0KLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBoYmEtPmJlaXNjc2lfaHdfY2hlY2tfdGFzaywKLQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCXBoYmEgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJlaXNjc2lfaGJhLCByZWNvdmVyX3BvcnQud29yayk7CisJYmVpc2NzaV9kaXNhYmxlX3BvcnQocGhiYSwgMCk7CisJYmVpc2NzaV9lbmFibGVfcG9ydChwaGJhKTsKIH0KIAotCiBzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBiZWlzY3NpX2VlaF9lcnJfZGV0ZWN0ZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCXBjaV9jaGFubmVsX3N0YXRlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhID0gTlVMTDsKIAogCXBoYmEgPSAoc3RydWN0IGJlaXNjc2lfaGJhICopcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXBoYmEtPnN0YXRlIHw9IEJFX0FEQVBURVJfUENJX0VSUjsKKwlzZXRfYml0KEJFSVNDU0lfSEJBX1BDSV9FUlIsICZwaGJhLT5zdGF0ZSk7CiAKIAliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKIAkJICAgICJCTV8lZCA6IEVFSCBlcnJvciBkZXRlY3RlZFxuIik7CiAKLQliZWlzY3NpX3F1aWVzY2UocGhiYSwgQkVJU0NTSV9FRUhfVU5MT0FEKTsKKwkvKiBmaXJzdCBzdG9wIFVFIGRldGVjdGlvbiB3aGVuIFBDSSBlcnJvciBkZXRlY3RlZCAqLworCWRlbF90aW1lcl9zeW5jKCZwaGJhLT5od19jaGVjayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwaGJhLT5yZWNvdmVyX3BvcnQpOworCisJLyogc2Vzc2lvbnMgYXJlIG5vIGxvbmdlciB2YWxpZCwgc28gZmlyc3QgZmFpbCB0aGUgc2Vzc2lvbnMgKi8KKwlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24ocGhiYS0+c2hvc3QsIGJlaXNjc2lfc2Vzc2lvbl9mYWlsKTsKKwliZWlzY3NpX2Rpc2FibGVfcG9ydChwaGJhLCAwKTsKIAogCWlmIChzdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUpIHsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCkBAIC01NTE1LDkgKzU1OTQsOCBAQAogCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKIAotCS8qIFdhaXQgZm9yIHRoZSBDSElQIFJlc2V0IHRvIGNvbXBsZXRlICovCi0Jc3RhdHVzID0gYmVfY2hrX3Jlc2V0X2NvbXBsZXRlKHBoYmEpOwotCWlmICghc3RhdHVzKSB7CisJc3RhdHVzID0gYmVpc2NzaV9jaGVja19md19yZHkocGhiYSk7CisJaWYgKHN0YXR1cykgewogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIEJFSVNDU0lfTE9HX0lOSVQsCiAJCQkgICAgIkJNXyVkIDogRUVIIFJlc2V0IENvbXBsZXRlZFxuIik7CiAJfSBlbHNlIHsKQEAgLTU1MzIsODcgKzU2MTAsMTYgQEAKIAogc3RhdGljIHZvaWQgYmVpc2NzaV9lZWhfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCWludCByZXQgPSAwLCBpOwotCXN0cnVjdCBiZV9lcV9vYmogKnBiZV9lcTsKLQlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBOVUxMOwotCXN0cnVjdCBod2lfY29udHJvbGxlciAqcGh3aV9jdHJscjsKLQlzdHJ1Y3QgaHdpX2NvbnRleHRfbWVtb3J5ICpwaHdpX2NvbnRleHQ7CisJc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhOworCWludCByZXQ7CiAKIAlwaGJhID0gKHN0cnVjdCBiZWlzY3NpX2hiYSAqKXBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAotCWlmIChlbmFibGVfbXNpeCkKLQkJZmluZF9udW1fY3B1cyhwaGJhKTsKLQllbHNlCi0JCXBoYmEtPm51bV9jcHVzID0gMTsKLQotCWlmIChlbmFibGVfbXNpeCkgewotCQliZWlzY3NpX21zaXhfZW5hYmxlKHBoYmEpOwotCQlpZiAoIXBoYmEtPm1zaXhfZW5hYmxlZCkKLQkJCXBoYmEtPm51bV9jcHVzID0gMTsKLQl9Ci0KLQlyZXQgPSBiZWlzY3NpX2NtZF9yZXNldF9mdW5jdGlvbihwaGJhKTsKLQlpZiAocmV0KSB7Ci0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAotCQkJICAgICJCTV8lZCA6IFJlc2V0IEZhaWxlZFxuIik7Ci0JCWdvdG8gcmV0X2VycjsKLQl9Ci0KLQlyZXQgPSBiZV9jaGtfcmVzZXRfY29tcGxldGUocGhiYSk7Ci0JaWYgKHJldCkgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKLQkJCSAgICAiQk1fJWQgOiBGYWlsZWQgdG8gZ2V0IG91dCBvZiByZXNldC5cbiIpOwotCQlnb3RvIHJldF9lcnI7Ci0JfQotCi0JYmVpc2NzaV9nZXRfcGFyYW1zKHBoYmEpOwotCXBoYmEtPnNob3N0LT5tYXhfaWQgPSBwaGJhLT5wYXJhbXMuY3huc19wZXJfY3RybDsKLQlwaGJhLT5zaG9zdC0+Y2FuX3F1ZXVlID0gcGhiYS0+cGFyYW1zLmlvc19wZXJfY3RybDsKLQlyZXQgPSBod2lfaW5pdF9jb250cm9sbGVyKHBoYmEpOwotCWlmIChyZXQpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCi0JCQkgICAgIkJNXyVkIDogYmVpc2NzaV9lZWhfcmVzdW1lIC0iCi0JCQkgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBiZWlzY3NpX2hiYS5cbiIpOwotCQlnb3RvIHJldF9lcnI7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9NQ0NfQ01EOyBpKyspIHsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmcGhiYS0+Y3RybC5tY2Nfd2FpdFtpICsgMV0pOwotCQlwaGJhLT5jdHJsLm1jY190YWdbaV0gPSBpICsgMTsKLQkJcGhiYS0+Y3RybC5tY2NfdGFnX3N0YXR1c1tpICsgMV0gPSAwOwotCQlwaGJhLT5jdHJsLm1jY190YWdfYXZhaWxhYmxlKys7Ci0JfQotCi0JcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7Ci0JcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OwotCi0JZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKLQkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07Ci0JCWlycV9wb2xsX2luaXQoJnBiZV9lcS0+aW9wb2xsLCBiZV9pb3BvbGxfYnVkZ2V0LAotCQkJCWJlX2lvcG9sbCk7Ci0JfQotCi0JaSA9IChwaGJhLT5tc2l4X2VuYWJsZWQpID8gaSA6IDA7Ci0JLyogV29yayBpdGVtIGZvciBNQ0MgaGFuZGxpbmcgKi8KLQlwYmVfZXEgPSAmcGh3aV9jb250ZXh0LT5iZV9lcVtpXTsKLQlJTklUX1dPUksoJnBiZV9lcS0+d29ya19jcXMsIGJlaXNjc2lfcHJvY2Vzc19hbGxfY3FzKTsKLQotCXJldCA9IGJlaXNjc2lfaW5pdF9pcnFzKHBoYmEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAotCQkJICAgICJCTV8lZCA6IGJlaXNjc2lfZWVoX3Jlc3VtZSAtICIKLQkJCSAgICAiRmFpbGVkIHRvIGJlaXNjc2lfaW5pdF9pcnFzXG4iKTsKLQkJZ290byByZXRfZXJyOwotCX0KLQotCWh3aV9lbmFibGVfaW50cihwaGJhKTsKLQlwaGJhLT5zdGF0ZSAmPSB+QkVfQURBUFRFUl9QQ0lfRVJSOwotCi0JcmV0dXJuOwotcmV0X2VycjoKLQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKLQkJICAgICJCTV8lZCA6IEFFUiBFRUggUmVzdW1lIEZhaWxlZFxuIik7CisJcmV0ID0gYmVpc2NzaV9lbmFibGVfcG9ydChwaGJhKTsKKwlpZiAocmV0KQorCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAorCQkJICAgICAgIkJNXyVkIDogQUVSIEVFSCByZXN1bWUgZmFpbGVkXG4iKTsKIH0KIAogc3RhdGljIGludCBiZWlzY3NpX2Rldl9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LApAQCAtNTYyMiw3ICs1NjI5LDggQEAKIAlzdHJ1Y3QgaHdpX2NvbnRyb2xsZXIgKnBod2lfY3RybHI7CiAJc3RydWN0IGh3aV9jb250ZXh0X21lbW9yeSAqcGh3aV9jb250ZXh0OwogCXN0cnVjdCBiZV9lcV9vYmogKnBiZV9lcTsKLQlpbnQgcmV0ID0gMCwgaTsKKwl1bnNpZ25lZCBpbnQgc19oYW5kbGU7CisJaW50IHJldCwgaTsKIAogCXJldCA9IGJlaXNjc2lfZW5hYmxlX3BjaShwY2lkZXYpOwogCWlmIChyZXQgPCAwKSB7CkBAIC01NjM1LDYgKzU2NDMsNyBAQAogCWlmICghcGhiYSkgewogCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwKIAkJCSJiZWlzY3NpX2Rldl9wcm9iZSAtIEZhaWxlZCBpbiBiZWlzY3NpX2hiYV9hbGxvY1xuIik7CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZGlzYWJsZV9wY2k7CiAJfQogCkBAIC01NjUwLDEwICs1NjU5LDggQEAKIAkvKiBJbml0aWFsaXplIERyaXZlciBjb25maWd1cmF0aW9uIFBhcmFtdGVycyAqLwogCWJlaXNjc2lfaGJhX2F0dHJzX2luaXQocGhiYSk7CiAKLQlwaGJhLT5md190aW1lb3V0ID0gZmFsc2U7CiAJcGhiYS0+bWFjX2FkZHJfc2V0ID0gZmFsc2U7CiAKLQogCXN3aXRjaCAocGNpZGV2LT5kZXZpY2UpIHsKIAljYXNlIEJFX0RFVklDRV9JRDE6CiAJY2FzZSBPQ19ERVZJQ0VfSUQxOgpAQCAtNTY3NywzOSArNTY4NCwyNiBAQAogCXJldCA9IGJlX2N0cmxfaW5pdChwaGJhLCBwY2lkZXYpOwogCWlmIChyZXQpIHsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCi0JCQkgICAgIkJNXyVkIDogYmVpc2NzaV9kZXZfcHJvYmUtIgotCQkJICAgICJGYWlsZWQgaW4gYmVfY3RybF9pbml0XG4iKTsKKwkJCSAgICAiQk1fJWQgOiBiZV9jdHJsX2luaXQgZmFpbGVkXG4iKTsKIAkJZ290byBoYmFfZnJlZTsKIAl9CiAKLQkvKgotCSAqIEZVTkNUSU9OX1JFU0VUIHNob3VsZCBjbGVhbiB1cCBhbnkgc3RhbGUgaW5mbyBpbiBGVyBmb3IgdGhpcyBmbgotCSAqLwotCXJldCA9IGJlaXNjc2lfY21kX3Jlc2V0X2Z1bmN0aW9uKHBoYmEpOwotCWlmIChyZXQpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCi0JCQkgICAgIkJNXyVkIDogUmVzZXQgRmFpbGVkXG4iKTsKKwlyZXQgPSBiZWlzY3NpX2luaXRfc2xpcG9ydChwaGJhKTsKKwlpZiAocmV0KQogCQlnb3RvIGhiYV9mcmVlOwotCX0KLQlyZXQgPSBiZV9jaGtfcmVzZXRfY29tcGxldGUocGhiYSk7Ci0JaWYgKHJldCkgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKLQkJCSAgICAiQk1fJWQgOiBGYWlsZWQgdG8gZ2V0IG91dCBvZiByZXNldC5cbiIpOwotCQlnb3RvIGhiYV9mcmVlOwotCX0KIAogCXNwaW5fbG9ja19pbml0KCZwaGJhLT5pb19zZ2xfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnBoYmEtPm1nbXRfc2dsX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZwaGJhLT5pc3JfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnBoYmEtPmFzeW5jX3BkdV9sb2NrKTsKLQlyZXQgPSBtZ210X2dldF9md19jb25maWcoJnBoYmEtPmN0cmwsIHBoYmEpOworCXJldCA9IGJlaXNjc2lfZ2V0X2Z3X2NvbmZpZygmcGhiYS0+Y3RybCwgcGhiYSk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAogCQkJICAgICJCTV8lZCA6IEVycm9yIGdldHRpbmcgZncgY29uZmlnXG4iKTsKIAkJZ290byBmcmVlX3BvcnQ7CiAJfQotCW1nbXRfZ2V0X3BvcnRfbmFtZSgmcGhiYS0+Y3RybCwgcGhiYSk7CisJYmVpc2NzaV9nZXRfcG9ydF9uYW1lKCZwaGJhLT5jdHJsLCBwaGJhKTsKIAliZWlzY3NpX2dldF9wYXJhbXMocGhiYSk7CisJYmVpc2NzaV9zZXRfdWVyX2ZlYXR1cmUocGhiYSk7CiAKIAlpZiAoZW5hYmxlX21zaXgpCiAJCWZpbmRfbnVtX2NwdXMocGhiYSk7CkBAIC01NzU0LDI1ICs1NzQ4LDI0IEBACiAJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAogCQkJICAgICJCTV8lZCA6IGJlaXNjc2lfZGV2X3Byb2JlLSIKIAkJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIHdvcmsgcXVldWVcbiIpOworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZyZWVfdHdxOwogCX0KIAotCUlOSVRfREVMQVlFRF9XT1JLKCZwaGJhLT5iZWlzY3NpX2h3X2NoZWNrX3Rhc2ssCi0JCQkgIGJlaXNjc2lfaHdfaGVhbHRoX2NoZWNrKTsKKwlJTklUX0RFTEFZRURfV09SSygmcGhiYS0+ZXFkX3VwZGF0ZSwgYmVpc2NzaV9lcWRfdXBkYXRlX3dvcmspOwogCiAJcGh3aV9jdHJsciA9IHBoYmEtPnBod2lfY3RybHI7CiAJcGh3aV9jb250ZXh0ID0gcGh3aV9jdHJsci0+cGh3aV9jdHh0OwogCiAJZm9yIChpID0gMDsgaSA8IHBoYmEtPm51bV9jcHVzOyBpKyspIHsKIAkJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07Ci0JCWlycV9wb2xsX2luaXQoJnBiZV9lcS0+aW9wb2xsLCBiZV9pb3BvbGxfYnVkZ2V0LAotCQkJCWJlX2lvcG9sbCk7CisJCWlycV9wb2xsX2luaXQoJnBiZV9lcS0+aW9wb2xsLCBiZV9pb3BvbGxfYnVkZ2V0LCBiZV9pb3BvbGwpOwogCX0KIAogCWkgPSAocGhiYS0+bXNpeF9lbmFibGVkKSA/IGkgOiAwOwogCS8qIFdvcmsgaXRlbSBmb3IgTUNDIGhhbmRsaW5nICovCiAJcGJlX2VxID0gJnBod2lfY29udGV4dC0+YmVfZXFbaV07Ci0JSU5JVF9XT1JLKCZwYmVfZXEtPndvcmtfY3FzLCBiZWlzY3NpX3Byb2Nlc3NfYWxsX2Nxcyk7CisJSU5JVF9XT1JLKCZwYmVfZXEtPm1jY193b3JrLCBiZWlzY3NpX21jY193b3JrKTsKIAogCXJldCA9IGJlaXNjc2lfaW5pdF9pcnFzKHBoYmEpOwogCWlmIChyZXQgPCAwKSB7CkBAIC01NzgzLDIyICs1Nzc2LDQyIEBACiAJfQogCWh3aV9lbmFibGVfaW50cihwaGJhKTsKIAotCWlmIChpc2NzaV9ob3N0X2FkZChwaGJhLT5zaG9zdCwgJnBoYmEtPnBjaWRldi0+ZGV2KSkKKwlyZXQgPSBpc2NzaV9ob3N0X2FkZChwaGJhLT5zaG9zdCwgJnBoYmEtPnBjaWRldi0+ZGV2KTsKKwlpZiAocmV0KQogCQlnb3RvIGZyZWVfYmxrZW5ibGQ7CiAKLQlpZiAoYmVpc2NzaV9zZXR1cF9ib290X2luZm8ocGhiYSkpCi0JCS8qCi0JCSAqIGxvZyBlcnJvciBidXQgY29udGludWUsIGJlY2F1c2Ugd2UgbWF5IG5vdCBiZSB1c2luZwotCQkgKiBpc2NzaSBib290LgorCS8qIHNldCBvbmxpbmUgYml0IGFmdGVyIHBvcnQgaXMgb3BlcmF0aW9uYWwgKi8KKwlzZXRfYml0KEJFSVNDU0lfSEJBX09OTElORSwgJnBoYmEtPnN0YXRlKTsKKwlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywKKwkJICAgICAgIkJNXyVkIDogcG9ydCBvbmxpbmU6IDB4JWx4XG4iLCBwaGJhLT5zdGF0ZSk7CisKKwlJTklUX1dPUksoJnBoYmEtPmJvb3Rfd29yaywgYmVpc2NzaV9ib290X3dvcmspOworCXJldCA9IGJlaXNjc2lfYm9vdF9nZXRfc2hhbmRsZShwaGJhLCAmc19oYW5kbGUpOworCWlmIChyZXQgPiAwKSB7CisJCWJlaXNjc2lfc3RhcnRfYm9vdF93b3JrKHBoYmEsIHNfaGFuZGxlKTsKKwkJLyoqCisJCSAqIFNldCB0aGlzIGJpdCBhZnRlciBzdGFydGluZyB0aGUgd29yayB0byBsZXQKKwkJICogcHJvYmUgaGFuZGxlIGl0IGZpcnN0LgorCQkgKiBBU1lOQyBldmVudCBjYW4gdG9vIHNjaGVkdWxlIHRoaXMgd29yay4KIAkJICovCi0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAotCQkJICAgICJCTV8lZCA6IENvdWxkIG5vdCBzZXQgdXAgIgotCQkJICAgICJpU0NTSSBib290IGluZm8uXG4iKTsKKwkJc2V0X2JpdChCRUlTQ1NJX0hCQV9CT09UX0ZPVU5ELCAmcGhiYS0+c3RhdGUpOworCX0KIAotCWJlaXNjc2lfY3JlYXRlX2RlZl9pZmFjZXMocGhiYSk7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwaGJhLT5iZWlzY3NpX2h3X2NoZWNrX3Rhc2ssCi0JCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwliZWlzY3NpX2lmYWNlX2NyZWF0ZV9kZWZhdWx0KHBoYmEpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGhiYS0+ZXFkX3VwZGF0ZSwKKwkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoQkVJU0NTSV9FUURfVVBEQVRFX0lOVEVSVkFMKSk7CiAKKwlJTklUX1dPUksoJnBoYmEtPnNlc3Nfd29yaywgYmVpc2NzaV9zZXNzX3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZwaGJhLT5yZWNvdmVyX3BvcnQsIGJlaXNjc2lfcmVjb3Zlcl9wb3J0KTsKKwkvKioKKwkgKiBTdGFydCBVRSBkZXRlY3Rpb24gaGVyZS4gVUUgYmVmb3JlIHRoaXMgd2lsbCBjYXVzZSBzdGFsbCBpbiBwcm9iZQorCSAqIGFuZCBldmVudHVhbGx5IGZhaWwgdGhlIHByb2JlLgorCSAqLworCWluaXRfdGltZXIoJnBoYmEtPmh3X2NoZWNrKTsKKwlwaGJhLT5od19jaGVjay5mdW5jdGlvbiA9IGJlaXNjc2lfaHdfaGVhbHRoX2NoZWNrOworCXBoYmEtPmh3X2NoZWNrLmRhdGEgPSAodW5zaWduZWQgbG9uZylwaGJhOworCW1vZF90aW1lcigmcGhiYS0+aHdfY2hlY2ssCisJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQkVJU0NTSV9VRV9ERVRFQ1RfSU5URVJWQUwpKTsKIAliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sIEJFSVNDU0lfTE9HX0lOSVQsCiAJCSAgICAiXG5cblxuIEJNXyVkIDogU1VDQ0VTUyAtIERSSVZFUiBMT0FERURcblxuXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTU4MTAsNyArNTgyMyw4IEBACiAJCWlycV9wb2xsX2Rpc2FibGUoJnBiZV9lcS0+aW9wb2xsKTsKIAl9CiBmcmVlX3R3cToKLQliZWlzY3NpX2NsZWFuX3BvcnQocGhiYSk7CisJaHdpX2NsZWFudXBfcG9ydChwaGJhKTsKKwliZWlzY3NpX2NsZWFudXBfcG9ydChwaGJhKTsKIAliZWlzY3NpX2ZyZWVfbWVtKHBoYmEpOwogZnJlZV9wb3J0OgogCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+cGNpZGV2LApAQCAtNTgzMCw2ICs1ODQ0LDQ5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgYmVpc2NzaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldikKK3sKKwlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEgPSBOVUxMOworCisJcGhiYSA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOworCWlmICghcGhiYSkgeworCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImJlaXNjc2lfcmVtb3ZlIGNhbGxlZCB3aXRoIG5vIHBoYmFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogZmlyc3Qgc3RvcCBVRSBkZXRlY3Rpb24gYmVmb3JlIHVubG9hZGluZyAqLworCWRlbF90aW1lcl9zeW5jKCZwaGJhLT5od19jaGVjayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwaGJhLT5yZWNvdmVyX3BvcnQpOworCWNhbmNlbF93b3JrX3N5bmMoJnBoYmEtPnNlc3Nfd29yayk7CisKKwliZWlzY3NpX2lmYWNlX2Rlc3Ryb3lfZGVmYXVsdChwaGJhKTsKKwlpc2NzaV9ob3N0X3JlbW92ZShwaGJhLT5zaG9zdCk7CisJYmVpc2NzaV9kaXNhYmxlX3BvcnQocGhiYSwgMSk7CisKKwkvKiBhZnRlciBjYW5jZWxsaW5nIGJvb3Rfd29yayAqLworCWlzY3NpX2Jvb3RfZGVzdHJveV9rc2V0KHBoYmEtPmJvb3Rfc3RydWN0LmJvb3Rfa3NldCk7CisKKwkvKiBmcmVlIGFsbCByZXNvdXJjZXMgKi8KKwlkZXN0cm95X3dvcmtxdWV1ZShwaGJhLT53cSk7CisJYmVpc2NzaV9jbGVhbnVwX3BvcnQocGhiYSk7CisJYmVpc2NzaV9mcmVlX21lbShwaGJhKTsKKworCS8qIGN0cmwgdW5pbml0ICovCisJYmVpc2NzaV91bm1hcF9wY2lfZnVuY3Rpb24ocGhiYSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChwaGJhLT5wY2lkZXYsCisJCQkgICAgcGhiYS0+Y3RybC5tYm94X21lbV9hbGxvY2VkLnNpemUsCisJCQkgICAgcGhiYS0+Y3RybC5tYm94X21lbV9hbGxvY2VkLnZhLAorCQkJICAgIHBoYmEtPmN0cmwubWJveF9tZW1fYWxsb2NlZC5kbWEpOworCisJcGNpX2Rldl9wdXQocGhiYS0+cGNpZGV2KTsKKwlpc2NzaV9ob3N0X2ZyZWUocGhiYS0+c2hvc3QpOworCXBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBjaWRldik7CisJcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgTlVMTCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwY2lkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOworfQorCisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2Vycm9yX2hhbmRsZXJzIGJlaXNjc2lfZWVoX2hhbmRsZXJzID0gewogCS5lcnJvcl9kZXRlY3RlZCA9IGJlaXNjc2lfZWVoX2Vycl9kZXRlY3RlZCwKIAkuc2xvdF9yZXNldCA9IGJlaXNjc2lfZWVoX3Jlc2V0LApAQCAtNTg0Niw5ICs1OTAzLDkgQEAKIAkuY3JlYXRlX2Nvbm4gPSBiZWlzY3NpX2Nvbm5fY3JlYXRlLAogCS5iaW5kX2Nvbm4gPSBiZWlzY3NpX2Nvbm5fYmluZCwKIAkuZGVzdHJveV9jb25uID0gaXNjc2lfY29ubl90ZWFyZG93biwKLQkuYXR0cl9pc192aXNpYmxlID0gYmUyaXNjc2lfYXR0cl9pc192aXNpYmxlLAotCS5zZXRfaWZhY2VfcGFyYW0gPSBiZTJpc2NzaV9pZmFjZV9zZXRfcGFyYW0sCi0JLmdldF9pZmFjZV9wYXJhbSA9IGJlMmlzY3NpX2lmYWNlX2dldF9wYXJhbSwKKwkuYXR0cl9pc192aXNpYmxlID0gYmVpc2NzaV9hdHRyX2lzX3Zpc2libGUsCisJLnNldF9pZmFjZV9wYXJhbSA9IGJlaXNjc2lfaWZhY2Vfc2V0X3BhcmFtLAorCS5nZXRfaWZhY2VfcGFyYW0gPSBiZWlzY3NpX2lmYWNlX2dldF9wYXJhbSwKIAkuc2V0X3BhcmFtID0gYmVpc2NzaV9zZXRfcGFyYW0sCiAJLmdldF9jb25uX3BhcmFtID0gaXNjc2lfY29ubl9nZXRfcGFyYW0sCiAJLmdldF9zZXNzaW9uX3BhcmFtID0gaXNjc2lfc2Vzc2lvbl9nZXRfcGFyYW0sCkBAIC01ODc3LDcgKzU5MzQsNiBAQAogCS5lcnJfaGFuZGxlciA9ICZiZWlzY3NpX2VlaF9oYW5kbGVycwogfTsKIAotCiBzdGF0aWMgaW50IF9faW5pdCBiZWlzY3NpX21vZHVsZV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmggYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5oCmluZGV4IDMwYTQ2MDYuLjYzNzY2NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmgKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uaApAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAxNSBFbXVsZXgKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMTYgQnJvYWRjb20KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNywxMCArNywxMCBAQAogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAogICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCiAgKgotICogV3JpdHRlbiBieTogSmF5YW1vaGFuIEthbGxpY2thbCAoamF5YW1vaGFuLmthbGxpY2thbEBhdmFnb3RlY2guY29tKQorICogV3JpdHRlbiBieTogSmF5YW1vaGFuIEthbGxpY2thbCAoamF5YW1vaGFuLmthbGxpY2thbEBicm9hZGNvbS5jb20pCiAgKgogICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqIGxpbnV4LWRyaXZlcnNAYXZhZ290ZWNoLmNvbQorICogbGludXgtZHJpdmVyc0Bicm9hZGNvbS5jb20KICAqCiAgKiBFbXVsZXgKICAqIDMzMzMgU3VzYW4gU3RyZWV0CkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9pc2NzaS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCQkiYmUyaXNjc2kiCi0jZGVmaW5lIEJVSUxEX1NUUgkJIjExLjAuMC4wIgorI2RlZmluZSBCVUlMRF9TVFIJCSIxMS4yLjAuMCIKICNkZWZpbmUgQkVfTkFNRQkJCSJFbXVsZXggT25lQ29ubmVjdCIgXAogCQkJCSJPcGVuLWlTQ1NJIERyaXZlciB2ZXJzaW9uIiBCVUlMRF9TVFIKICNkZWZpbmUgRFJWX0RFU0MJCUJFX05BTUUgIiAiICJEcml2ZXIiCkBAIC04MiwzNiArODIsMTIgQEAKICNkZWZpbmUgQkVJU0NTSV9NQVhfRlJBR1NfSU5JVAkxOTIKICNkZWZpbmUgQkVfTlVNX01TSVhfRU5UUklFUwkxCiAKLSNkZWZpbmUgTVBVX0VQX0NPTlRST0wgICAgICAgICAgMAotI2RlZmluZSBNUFVfRVBfU0VNQVBIT1JFICAgICAgICAweGFjCi0jZGVmaW5lIEJFMl9TT0ZUX1JFU0VUICAgICAgICAgIDB4NWMKLSNkZWZpbmUgQkUyX1BDSV9PTkxJTkUwICAgICAgICAgMHhiMAotI2RlZmluZSBCRTJfUENJX09OTElORTEgICAgICAgICAweGI0Ci0jZGVmaW5lIEJFMl9TRVRfUkVTRVQgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgQkUyX01QVV9JUkFNX09OTElORSAgICAgMHgwMDAwMDA4MAotCiAjZGVmaW5lIEJFX1NFTlNFX0lORk9fU0laRQkJMjU4CiAjZGVmaW5lIEJFX0lTQ1NJX1BEVV9IRUFERVJfU0laRQk2NAogI2RlZmluZSBCRV9NSU5fTUVNX1NJWkUJCQkxNjM4NAogI2RlZmluZSBNQVhfQ01EX1NaCQkJNjU1MzYKICNkZWZpbmUgSUlPQ19TQ1NJX0RBVEEgICAgICAgICAgICAgICAgICAweDA1CS8qIFdyaXRlIE9wZXJhdGlvbiAqLwogCi0jZGVmaW5lIElOVkFMSURfU0VTU19IQU5ETEUJMHhGRkZGRkZGRgotCi0vKioKLSAqIEFkYXB0ZXIgU3RhdGVzCi0gKiovCi0jZGVmaW5lIEJFX0FEQVBURVJfTElOS19VUAkweDAwMQotI2RlZmluZSBCRV9BREFQVEVSX0xJTktfRE9XTgkweDAwMgotI2RlZmluZSBCRV9BREFQVEVSX1BDSV9FUlIJMHgwMDQKLSNkZWZpbmUgQkVfQURBUFRFUl9DSEVDS19CT09UCTB4MDA4Ci0KLQotI2RlZmluZSBCRUlTQ1NJX0NMRUFOX1VOTE9BRAkweDAxCi0jZGVmaW5lIEJFSVNDU0lfRUVIX1VOTE9BRAkweDAyCi0KLSNkZWZpbmUgQkVfR0VUX0JPT1RfUkVUUklFUwk0NQotI2RlZmluZSBCRV9HRVRfQk9PVF9UTwkJMjAKIC8qKgogICogaGFyZHdhcmUgbmVlZHMgdGhlIGFzeW5jIFBEVSBidWZmZXJzIHRvIGJlIHBvc3RlZCBpbiBtdWx0aXBsZXMgb2YgOAogICogU28gaGF2ZSBhdGxlYXN0IDggb2YgdGhlbSBieSBkZWZhdWx0CkBAIC0zNzgsNyArMzU0LDYgQEAKIAlzdHJ1Y3Qgc2dsX2hhbmRsZSAqKmVoX3NnbF9obmRsX2Jhc2U7CiAJc3BpbmxvY2tfdCBpb19zZ2xfbG9jazsKIAlzcGlubG9ja190IG1nbXRfc2dsX2xvY2s7Ci0Jc3BpbmxvY2tfdCBpc3JfbG9jazsKIAlzcGlubG9ja190IGFzeW5jX3BkdV9sb2NrOwogCXVuc2lnbmVkIGludCBhZ2U7CiAJc3RydWN0IGxpc3RfaGVhZCBoYmFfcXVldWU7CkBAIC0zOTAsNyArMzY1LDYgQEAKIAlzdHJ1Y3QgdWxwX2NpZF9pbmZvICpjaWRfYXJyYXlfaW5mb1tCRUlTQ1NJX1VMUF9DT1VOVF07CiAJc3RydWN0IGlzY3NpX2VuZHBvaW50ICoqZXBfYXJyYXk7CiAJc3RydWN0IGJlaXNjc2lfY29ubiAqKmNvbm5fdGFibGU7Ci0Jc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqYm9vdF9rc2V0OwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwogCXN0cnVjdCBpc2NzaV9pZmFjZSAqaXB2NF9pZmFjZTsKIAlzdHJ1Y3QgaXNjc2lfaWZhY2UgKmlwdjZfaWZhY2U7CkBAIC00MTgsMTIgKzM5MiwzMyBAQAogCQl1bnNpZ25lZCBsb25nIHVscF9zdXBwb3J0ZWQ7CiAJfSBmd19jb25maWc7CiAKLQl1bnNpZ25lZCBpbnQgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBzdGF0ZTsKKyNkZWZpbmUgQkVJU0NTSV9IQkFfT05MSU5FCTAKKyNkZWZpbmUgQkVJU0NTSV9IQkFfTElOS19VUAkxCisjZGVmaW5lIEJFSVNDU0lfSEJBX0JPT1RfRk9VTkQJMgorI2RlZmluZSBCRUlTQ1NJX0hCQV9CT09UX1dPUksJMworI2RlZmluZSBCRUlTQ1NJX0hCQV9VRVJfU1VQUAk0CisjZGVmaW5lIEJFSVNDU0lfSEJBX1BDSV9FUlIJNQorI2RlZmluZSBCRUlTQ1NJX0hCQV9GV19USU1FT1VUCTYKKyNkZWZpbmUgQkVJU0NTSV9IQkFfSU5fVUUJNworI2RlZmluZSBCRUlTQ1NJX0hCQV9JTl9UUEUJOAorCisvKiBlcnJvciBiaXRzICovCisjZGVmaW5lIEJFSVNDU0lfSEJBX0lOX0VSUgkoKDEgPDwgQkVJU0NTSV9IQkFfUENJX0VSUikgfCBcCisJCQkJICgxIDw8IEJFSVNDU0lfSEJBX0ZXX1RJTUVPVVQpIHwgXAorCQkJCSAoMSA8PCBCRUlTQ1NJX0hCQV9JTl9VRSkgfCBcCisJCQkJICgxIDw8IEJFSVNDU0lfSEJBX0lOX1RQRSkpCisKIAl1OCBvcHRpY19zdGF0ZTsKLQlpbnQgZ2V0X2Jvb3Q7Ci0JYm9vbCBmd190aW1lb3V0OwotCWJvb2wgdWVfZGV0ZWN0ZWQ7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBiZWlzY3NpX2h3X2NoZWNrX3Rhc2s7CisJc3RydWN0IGRlbGF5ZWRfd29yayBlcWRfdXBkYXRlOworCS8qIHVwZGF0ZSBFUSBkZWxheSB0aW1lciBldmVyeSAxMDAwbXMgKi8KKyNkZWZpbmUgQkVJU0NTSV9FUURfVVBEQVRFX0lOVEVSVkFMCTEwMDAKKwlzdHJ1Y3QgdGltZXJfbGlzdCBod19jaGVjazsKKwkvKiBjaGVjayBmb3IgVUUgZXZlcnkgMTAwMG1zICovCisjZGVmaW5lIEJFSVNDU0lfVUVfREVURUNUX0lOVEVSVkFMCTEwMDAKKwl1MzIgdWUycnA7CisJc3RydWN0IGRlbGF5ZWRfd29yayByZWNvdmVyX3BvcnQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHNlc3Nfd29yazsKIAogCWJvb2wgbWFjX2FkZHJfc2V0OwogCXU4IG1hY19hZGRyZXNzW0VUSF9BTEVOXTsKQEAgLTQzNSw3ICs0MzAsNiBAQAogCXN0cnVjdCBiZV9jdHJsX2luZm8gY3RybDsKIAl1bnNpZ25lZCBpbnQgZ2VuZXJhdGlvbjsKIAl1bnNpZ25lZCBpbnQgaW50ZXJmYWNlX2hhbmRsZTsKLQlzdHJ1Y3QgbWdtdF9zZXNzaW9uX2luZm8gYm9vdF9zZXNzOwogCXN0cnVjdCBpbnZhbGlkYXRlX2NvbW1hbmRfdGFibGUgaW52X3RibFsxMjhdOwogCiAJc3RydWN0IGJlX2FpY19vYmogYWljX29ialtNQVhfQ1BVU107CkBAIC00NDQsOCArNDM4LDI5IEBACiAJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAogCQkJdWludDMyX3QgbnVtX3NnLCB1aW50MzJfdCB4ZmVybGVuLAogCQkJdWludDMyX3Qgd3JpdGVkaXIpOworCXN0cnVjdCBib290X3N0cnVjdCB7CisJCWludCByZXRyeTsKKwkJdW5zaWduZWQgaW50IHRhZzsKKwkJdW5zaWduZWQgaW50IHNfaGFuZGxlOworCQlzdHJ1Y3QgYmVfZG1hX21lbSBub25lbWJfY21kOworCQllbnVtIHsKKwkJCUJFSVNDU0lfQk9PVF9SRU9QRU5fU0VTUyA9IDEsCisJCQlCRUlTQ1NJX0JPT1RfR0VUX1NIQU5ETEUsCisJCQlCRUlTQ1NJX0JPT1RfR0VUX1NJTkZPLAorCQkJQkVJU0NTSV9CT09UX0xPR09VVF9TRVNTLAorCQkJQkVJU0NTSV9CT09UX0NSRUFURV9LU0VULAorCQl9IGFjdGlvbjsKKwkJc3RydWN0IG1nbXRfc2Vzc2lvbl9pbmZvIGJvb3Rfc2VzczsKKwkJc3RydWN0IGlzY3NpX2Jvb3Rfa3NldCAqYm9vdF9rc2V0OworCX0gYm9vdF9zdHJ1Y3Q7CisJc3RydWN0IHdvcmtfc3RydWN0IGJvb3Rfd29yazsKIH07CiAKKyNkZWZpbmUgYmVpc2NzaV9oYmFfaW5fZXJyb3IocGhiYSkgKChwaGJhKS0+c3RhdGUgJiBCRUlTQ1NJX0hCQV9JTl9FUlIpCisjZGVmaW5lIGJlaXNjc2lfaGJhX2lzX29ubGluZShwaGJhKSBcCisJKCFiZWlzY3NpX2hiYV9pbl9lcnJvcigocGhiYSkpICYmIFwKKwkgdGVzdF9iaXQoQkVJU0NTSV9IQkFfT05MSU5FLCAmcGhiYS0+c3RhdGUpKQorCiBzdHJ1Y3QgYmVpc2NzaV9zZXNzaW9uIHsKIAlzdHJ1Y3QgcGNpX3Bvb2wgKmJoc19wb29sOwogfTsKQEAgLTUwOCw2ICs1MjMsNyBAQAogCXN0cnVjdCBzZ2xfaGFuZGxlICpwc2dsX2hhbmRsZTsKIAlzdHJ1Y3QgYmVpc2NzaV9jb25uICpjb25uOwogCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2lfY21uZDsKKwlpbnQgbnVtX3NnOwogCXN0cnVjdCBod2lfd3JiX2NvbnRleHQgKnB3cmJfY29udGV4dDsKIAl1bnNpZ25lZCBpbnQgY21kX3NuOwogCXVuc2lnbmVkIGludCBmbGFnczsKQEAgLTU5Miw4MCArNjA4LDgxIEBACiAJdTggbWF4X3JlY3ZfZGF0YV9zZWdtZW50X2xlbmd0aFszMl07CiB9OwogCi0vKiB2b2lkIGh3aV9jb21wbGV0ZV9kcnZyX21zZ3Moc3RydWN0IGJlaXNjc2lfY29ubiAqYmVpc2NzaV9jb25uLAotCQlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHN0cnVjdCBzb2xfY3FlICpwc29sKTsqLwotCi1zdHJ1Y3QgYXN5bmNfcGR1X2hhbmRsZSB7CitzdHJ1Y3QgaGRfYXN5bmNfaGFuZGxlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CiAJc3RydWN0IGJlX2J1c19hZGRyZXNzIHBhOwogCXZvaWQgKnBidWZmZXI7Ci0JdW5zaWduZWQgaW50IGNvbnN1bWVkOwotCXVuc2lnbmVkIGNoYXIgaW5kZXg7Ci0JdW5zaWduZWQgY2hhciBpc19oZWFkZXI7Ci0JdW5zaWduZWQgc2hvcnQgY3JpOwotCXVuc2lnbmVkIGxvbmcgYnVmZmVyX2xlbjsKKwl1MzIgYnVmZmVyX2xlbjsKKwl1MTYgaW5kZXg7CisJdTE2IGNyaTsKKwl1OCBpc19oZWFkZXI7CisJdTggaXNfZmluYWw7CiB9OwogCi1zdHJ1Y3QgaHdpX2FzeW5jX2VudHJ5IHsKLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBjaGFyIGhkcl9yZWNlaXZlZDsKLQkJdW5zaWduZWQgY2hhciBoZHJfbGVuOwotCQl1bnNpZ25lZCBzaG9ydCBieXRlc19yZWNlaXZlZDsKKy8qKgorICogVGhpcyBoYXMgbGlzdCBvZiBhc3luYyBQRFVzIHRoYXQgYXJlIHdhaXRpbmcgdG8gYmUgcHJvY2Vzc2VkLgorICogQnVmZmVycyBsaXZlIGluIHRoaXMgbGlzdCBmb3IgYSBicmllZiBkdXJhdGlvbiBiZWZvcmUgdGhleSBnZXQKKyAqIHByb2Nlc3NlZCBhbmQgcG9zdGVkIGJhY2sgdG8gaGFyZHdhcmUuCisgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgb25lIGNyaV93YWl0X3F1ZXVlIHBlciBhc3luY19lbnRyeS4KKyAqIFdlIG5lZWQgb25lIGNyaV93YWl0X3F1ZXVlIHBlciBDUkkuIEl0cyBlYXNpZXIgdG8gbWFuYWdlIGlmIHRoaXMKKyAqIGlzIHRhZ2dlZCBhbG9uZyB3aXRoIHRoZSBhc3luY19lbnRyeS4KKyAqLworc3RydWN0IGhkX2FzeW5jX2VudHJ5IHsKKwlzdHJ1Y3QgY3JpX3dhaXRfcXVldWUgeworCQl1bnNpZ25lZCBzaG9ydCBoZHJfbGVuOworCQl1bnNpZ25lZCBpbnQgYnl0ZXNfcmVjZWl2ZWQ7CiAJCXVuc2lnbmVkIGludCBieXRlc19uZWVkZWQ7CiAJCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl9IHdhaXRfcXVldWU7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGhlYWRlcl9idXN5X2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBkYXRhX2J1c3lfbGlzdDsKKwl9IHdxOworCS8qIGhhbmRsZXMgcG9zdGVkIHRvIEZXIHJlc2lkZXMgaGVyZSAqLworCXN0cnVjdCBoZF9hc3luY19oYW5kbGUgKmhlYWRlcjsKKwlzdHJ1Y3QgaGRfYXN5bmNfaGFuZGxlICpkYXRhOwogfTsKIAotc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCB7Ci0Jc3RydWN0IHsKLQkJc3RydWN0IGJlX2J1c19hZGRyZXNzIHBhX2Jhc2U7Ci0JCXZvaWQgKnZhX2Jhc2U7Ci0JCXZvaWQgKnJpbmdfYmFzZTsKLQkJc3RydWN0IGFzeW5jX3BkdV9oYW5kbGUgKmhhbmRsZV9iYXNlOworc3RydWN0IGhkX2FzeW5jX2J1Zl9jb250ZXh0IHsKKwlzdHJ1Y3QgYmVfYnVzX2FkZHJlc3MgcGFfYmFzZTsKKwl2b2lkICp2YV9iYXNlOworCXZvaWQgKnJpbmdfYmFzZTsKKwlzdHJ1Y3QgaGRfYXN5bmNfaGFuZGxlICpoYW5kbGVfYmFzZTsKKwl1MTYgZnJlZV9lbnRyaWVzOworCXUzMiBidWZmZXJfc2l6ZTsKKwkvKioKKwkgKiBPbmNlIGlTQ1NJIGxheWVyIGZpbmlzaGVzIHByb2Nlc3NpbmcgYW4gYXN5bmMgUERVLCB0aGUKKwkgKiBoYW5kbGVzIHVzZWQgZm9yIHRoZSBQRFUgYXJlIGFkZGVkIHRvIHRoaXMgbGlzdC4KKwkgKiBUaGV5IGFyZSBwb3N0ZWQgYmFjayB0byBGVyBpbiBncm91cHMgb2YgOC4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfbGlzdDsKK307CiAKLQkJdW5zaWduZWQgaW50IGhvc3Rfd3JpdGVfcHRyOwotCQl1bnNpZ25lZCBpbnQgZXBfcmVhZF9wdHI7Ci0JCXVuc2lnbmVkIGludCB3cml0YWJsZXM7Ci0KLQkJdW5zaWduZWQgaW50IGZyZWVfZW50cmllczsKLQkJdW5zaWduZWQgaW50IGJ1c3lfZW50cmllczsKLQotCQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfbGlzdDsKLQl9IGFzeW5jX2hlYWRlcjsKLQotCXN0cnVjdCB7Ci0JCXN0cnVjdCBiZV9idXNfYWRkcmVzcyBwYV9iYXNlOwotCQl2b2lkICp2YV9iYXNlOwotCQl2b2lkICpyaW5nX2Jhc2U7Ci0JCXN0cnVjdCBhc3luY19wZHVfaGFuZGxlICpoYW5kbGVfYmFzZTsKLQotCQl1bnNpZ25lZCBpbnQgaG9zdF93cml0ZV9wdHI7Ci0JCXVuc2lnbmVkIGludCBlcF9yZWFkX3B0cjsKLQkJdW5zaWduZWQgaW50IHdyaXRhYmxlczsKLQotCQl1bnNpZ25lZCBpbnQgZnJlZV9lbnRyaWVzOwotCQl1bnNpZ25lZCBpbnQgYnVzeV9lbnRyaWVzOwotCQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfbGlzdDsKLQl9IGFzeW5jX2RhdGE7Ci0KLQl1bnNpZ25lZCBpbnQgYnVmZmVyX3NpemU7Ci0JdW5zaWduZWQgaW50IG51bV9lbnRyaWVzOworLyoqCisgKiBoZF9hc3luY19jb250ZXh0IGlzIGRlY2xhcmVkIGZvciBlYWNoIFVMUCBzdXBwb3J0aW5nIGlTQ1NJIGZ1bmN0aW9uLgorICovCitzdHJ1Y3QgaGRfYXN5bmNfY29udGV4dCB7CisJc3RydWN0IGhkX2FzeW5jX2J1Zl9jb250ZXh0IGFzeW5jX2hlYWRlcjsKKwlzdHJ1Y3QgaGRfYXN5bmNfYnVmX2NvbnRleHQgYXN5bmNfZGF0YTsKKwl1MTYgbnVtX2VudHJpZXM7CisJLyoqCisJICogV2hlbiB1bnNvbCBQRFUgaXMgaW4sIGl0IG5lZWRzIHRvIGJlIGNoYWluZWQgdGlsbCBhbGwgdGhlIGJ5dGVzIGFyZQorCSAqIHJlY2VpdmVkIGFuZCB0aGVuIHByb2Nlc3NpbmcgaXMgZG9uZS4gaGRfYXN5bmNfZW50cnkgaXMgY3JlYXRlZAorCSAqIGJhc2VkIG9uIHRoZSBjaWRfY291bnQgZm9yIGVhY2ggVUxQLiBXaGVuIHVuc29sIFBEVSBjb21lcyBpbiBiYXNlZAorCSAqIG9uIHRoZSBjb25uX2lkIGl0IG5lZWRzIHRvIGJlIGFkZGVkIHRvIHRoZSBjb3JyZWN0IGFzeW5jX2VudHJ5IHdxLgorCSAqIEJlbG93IGRlZmluZWQgY2lkX3RvX2FzeW5jX2NyaV9tYXAgaXMgdXNlZCB0byByZXRlcml2ZSB0aGUKKwkgKiBhc3luY19jcmlfbWFwIGZvciBhIHBhcnRpY3VsYXIgY29ubmVjdGlvbi4KKwkgKgorCSAqIFRoaXMgYXJyYXkgaXMgaW5pdGlhbGl6ZWQgYWZ0ZXIgYmVpc2NzaV9jcmVhdGVfd3JiX3JpbmdzIHJldHVybnMuCisJICoKKwkgKiAtIHRoaXMgbWV0aG9kIHRha2VzIG1vcmUgbWVtb3J5IHNwYWNlLCBmaXhlZCB0byAySworCSAqIC0gYW55IHN1cHBvcnQgZm9yIGNvbm5lY3Rpb25zIGdyZWF0ZXIgdGhhbiB0aGlzIHRoZSBhcnJheSBzaXplIG5lZWRzCisJICogdG8gYmUgaW5jcmVtZW50ZWQKKwkgKi8KICNkZWZpbmUgQkVfR0VUX0FTWU5DX0NSSV9GUk9NX0NJRChjaWQpIChwYXN5bmNfY3R4LT5jaWRfdG9fYXN5bmNfY3JpX21hcFtjaWRdKQogCXVuc2lnbmVkIHNob3J0IGNpZF90b19hc3luY19jcmlfbWFwW0JFX01BWF9TRVNTSU9OXTsKIAkvKioKLQkgKiBUaGlzIGlzIGEgdmFyeWluZyBzaXplIGxpc3QhIERvIG5vdCBhZGQgYW55dGhpbmcKLQkgKiBhZnRlciB0aGlzIGVudHJ5ISEKKwkgKiBUaGlzIGlzIGEgdmFyaWFibGUgc2l6ZSBhcnJheS4gRG9uYHQgYWRkIGFueXRoaW5nIGFmdGVyIHRoaXMgZmllbGQhIQogCSAqLwotCXN0cnVjdCBod2lfYXN5bmNfZW50cnkgKmFzeW5jX2VudHJ5OworCXN0cnVjdCBoZF9hc3luY19lbnRyeSAqYXN5bmNfZW50cnk7CiB9OwogCi0jZGVmaW5lIFBEVUNRRV9DT0RFX01BU0sJMHgwMDAwMDAzRgotI2RlZmluZSBQRFVDUUVfRFBMX01BU0sJCTB4RkZGRjAwMDAKLSNkZWZpbmUgUERVQ1FFX0lOREVYX01BU0sJMHgwMDAwRkZGRgotCiBzdHJ1Y3QgaV90X2RwZHVfY3FlIHsKIAl1MzIgZHdbNF07CiB9IF9fcGFja2VkOwpAQCAtODQ1LDcgKzg2Miw2IEBACiB2b2lkCiBmcmVlX21nbXRfc2dsX2hhbmRsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHN0cnVjdCBzZ2xfaGFuZGxlICpwc2dsX2hhbmRsZSk7CiAKLXZvaWQgYmVpc2NzaV9wcm9jZXNzX2FsbF9jcXMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIHZvaWQgYmVpc2NzaV9mcmVlX21nbXRfdGFza19oYW5kbGVzKHN0cnVjdCBiZWlzY3NpX2Nvbm4gKmJlaXNjc2lfY29ubiwKIAkJCQkgICAgIHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKTsKIApAQCAtODU2LDExICs4NzIsNiBAQAogdW5zaWduZWQgaW50IGJlaXNjc2lfcHJvY2Vzc19jcShzdHJ1Y3QgYmVfZXFfb2JqICpwYmVfZXEsIGludCBidWRnZXQpOwogdm9pZCBiZWlzY3NpX3Byb2Nlc3NfbWNjX2NxKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBiZWlzY3NpX2Vycm9yKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKLXsKLQlyZXR1cm4gcGhiYS0+dWVfZGV0ZWN0ZWQgfHwgcGhiYS0+ZndfdGltZW91dDsKLX0KLQogc3RydWN0IHBkdV9ub3Bfb3V0IHsKIAl1MzIgZHdbMTJdOwogfTsKQEAgLTEwNjcsMTEgKzEwNzgsMTggQEAKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyBiZV9jcVtNQVhfQ1BVUyAtIDFdOwogCiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmJlX3dyYnE7CisJLyoqCisJICogQ3JlYXRlIGFycmF5IG9mIFVMUCBudW1iZXIgZm9yIGJlbG93IGVudHJpZXMgYXMgREVGUQorCSAqIHdpbGwgYmUgY3JlYXRlZCBmb3IgYm90aCBVTFAgaWYgaVNDU0kgUHJvdG9jb2wgaXMKKwkgKiBsb2FkZWQgb24gYm90aCBVTFAuCisJICovCiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gYmVfZGVmX2hkcnFbQkVJU0NTSV9VTFBfQ09VTlRdOwogCXN0cnVjdCBiZV9xdWV1ZV9pbmZvIGJlX2RlZl9kYXRhcVtCRUlTQ1NJX1VMUF9DT1VOVF07Ci0Jc3RydWN0IGh3aV9hc3luY19wZHVfY29udGV4dCAqcGFzeW5jX2N0eFtCRUlTQ1NJX1VMUF9DT1VOVF07CisJc3RydWN0IGhkX2FzeW5jX2NvbnRleHQgKnBhc3luY19jdHhbQkVJU0NTSV9VTFBfQ09VTlRdOwogfTsKIAordm9pZCBiZWlzY3NpX3N0YXJ0X2Jvb3Rfd29yayhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHVuc2lnbmVkIGludCBzX2hhbmRsZSk7CisKIC8qIExvZ2dpbmcgcmVsYXRlZCBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBCRUlTQ1NJX0xPR19JTklUCTB4MDAwMQkvKiBJbml0aWFsaXphdGlvbiBldmVudHMgKi8KICNkZWZpbmUgQkVJU0NTSV9MT0dfTUJPWAkweDAwMDIJLyogTWFpbGJveCBFdmVudHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmMgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5jCmluZGV4IDgzOTI2ZTIuLmFlYmM0ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmMKKysrIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qKgotICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAxNSBFbXVsZXgKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMTYgQnJvYWRjb20KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNywxMCArNywxMCBAQAogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBUaGUgZnVsbCBHTlUgR2VuZXJhbAogICogUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCiAgKgotICogV3JpdHRlbiBieTogSmF5YW1vaGFuIEthbGxpY2thbCAoamF5YW1vaGFuLmthbGxpY2thbEBhdmFnb3RlY2guY29tKQorICogV3JpdHRlbiBieTogSmF5YW1vaGFuIEthbGxpY2thbCAoamF5YW1vaGFuLmthbGxpY2thbEBicm9hZGNvbS5jb20pCiAgKgogICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqIGxpbnV4LWRyaXZlcnNAYXZhZ290ZWNoLmNvbQorICogbGludXgtZHJpdmVyc0Bicm9hZGNvbS5jb20KICAqCiAgKiBFbXVsZXgKICAqIDMzMzMgU3VzYW4gU3RyZWV0CkBAIC0yNCwxMzkgKzI0LDkgQEAKICNpbmNsdWRlICJiZV9pc2NzaS5oIgogI2luY2x1ZGUgImJlX21haW4uaCIKIAotLyogVUUgU3RhdHVzIExvdyBDU1IgKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGVzY191ZV9zdGF0dXNfbG93W10gPSB7Ci0JIkNFViIsCi0JIkNUWCIsCi0JIkRCVUYiLAotCSJFUlgiLAotCSJIb3N0IiwKLQkiTVBVIiwKLQkiTkRNQSIsCi0JIlBUQyAiLAotCSJSRE1BICIsCi0JIlJYRiAiLAotCSJSWElQUyAiLAotCSJSWFVMUDAgIiwKLQkiUlhVTFAxICIsCi0JIlJYVUxQMiAiLAotCSJUSU0gIiwKLQkiVFBPU1QgIiwKLQkiVFBSRSAiLAotCSJUWElQUyAiLAotCSJUWFVMUDAgIiwKLQkiVFhVTFAxICIsCi0JIlVDICIsCi0JIldETUEgIiwKLQkiVFhVTFAyICIsCi0JIkhPU1QxICIsCi0JIlAwX09CX0xJTksgIiwKLQkiUDFfT0JfTElOSyAiLAotCSJIT1NUX0dQSU8gIiwKLQkiTUJPWCAiLAotCSJBWEdNQUMwIiwKLQkiQVhHTUFDMSIsCi0JIkpUQUciLAotCSJNUFVfSU5UUEVORCIKLX07Ci0KLS8qIFVFIFN0YXR1cyBIaWdoIENTUiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZXNjX3VlX3N0YXR1c19oaVtdID0gewotCSJMUENNRU1IT1NUIiwKLQkiTUdNVF9NQUMiLAotCSJQQ1MwT05MSU5FIiwKLQkiTVBVX0lSQU0iLAotCSJQQ1MxT05MSU5FIiwKLQkiUENUTDAiLAotCSJQQ1RMMSIsCi0JIlBNRU0iLAotCSJSUiIsCi0JIlRYUEIiLAotCSJSWFBQIiwKLQkiWEFVSSIsCi0JIlRYUCIsCi0JIkFSTSIsCi0JIklQQyIsCi0JIkhPU1QyIiwKLQkiSE9TVDMiLAotCSJIT1NUNCIsCi0JIkhPU1Q1IiwKLQkiSE9TVDYiLAotCSJIT1NUNyIsCi0JIkhPU1Q4IiwKLQkiSE9TVDkiLAotCSJORVRDIiwKLQkiVW5rbm93biIsCi0JIlVua25vd24iLAotCSJVbmtub3duIiwKLQkiVW5rbm93biIsCi0JIlVua25vd24iLAotCSJVbmtub3duIiwKLQkiVW5rbm93biIsCi0JIlVua25vd24iCi19OwotCi0vKgotICogYmVpc2NzaV91ZV9kZXRlYygpLSBEZXRlY3QgVW5yZWNvdmVyYWJsZSBFcnJvciBvbiBhZGFwdGVyCi0gKiBAcGhiYTogRHJpdmVyIHByaXYgc3RydWN0dXJlCi0gKgotICogUmVhZCByZWdpc3RlcnMgbGlua2VkIHRvIFVFIGFuZCBjaGVjayBmb3IgdGhlIFVFIHN0YXR1cwotICoqLwotdm9pZCBiZWlzY3NpX3VlX2RldGVjdChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCi17Ci0JdWludDMyX3QgdWVfaGkgPSAwLCB1ZV9sbyA9IDA7Ci0JdWludDMyX3QgdWVfbWFza19oaSA9IDAsIHVlX21hc2tfbG8gPSAwOwotCXVpbnQ4X3QgaSA9IDA7Ci0KLQlpZiAocGhiYS0+dWVfZGV0ZWN0ZWQpCi0JCXJldHVybjsKLQotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaGJhLT5wY2lkZXYsCi0JCQkgICAgICBQQ0lDRkdfVUVfU1RBVFVTX0xPVywgJnVlX2xvKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGhiYS0+cGNpZGV2LAotCQkJICAgICAgUENJQ0ZHX1VFX1NUQVRVU19NQVNLX0xPVywKLQkJCSAgICAgICZ1ZV9tYXNrX2xvKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGhiYS0+cGNpZGV2LAotCQkJICAgICAgUENJQ0ZHX1VFX1NUQVRVU19ISUdILAotCQkJICAgICAgJnVlX2hpKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGhiYS0+cGNpZGV2LAotCQkJICAgICAgUENJQ0ZHX1VFX1NUQVRVU19NQVNLX0hJLAotCQkJICAgICAgJnVlX21hc2tfaGkpOwotCi0JdWVfbG8gPSAodWVfbG8gJiB+dWVfbWFza19sbyk7Ci0JdWVfaGkgPSAodWVfaGkgJiB+dWVfbWFza19oaSk7Ci0KLQotCWlmICh1ZV9sbyB8fCB1ZV9oaSkgewotCQlwaGJhLT51ZV9kZXRlY3RlZCA9IHRydWU7Ci0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAotCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRyB8IEJFSVNDU0lfTE9HX01CT1gsCi0JCQkgICAgIkJHXyVkIDogRXJyb3IgZGV0ZWN0ZWQgb24gdGhlIGFkYXB0ZXJcbiIpOwotCX0KLQotCWlmICh1ZV9sbykgewotCQlmb3IgKGkgPSAwOyB1ZV9sbzsgdWVfbG8gPj49IDEsIGkrKykgewotCQkJaWYgKHVlX2xvICYgMSkKLQkJCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKLQkJCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCQkJICAgICJCR18lZCA6IFVFX0xPVyAlcyBiaXQgc2V0XG4iLAotCQkJCQkgICAgZGVzY191ZV9zdGF0dXNfbG93W2ldKTsKLQkJfQotCX0KLQotCWlmICh1ZV9oaSkgewotCQlmb3IgKGkgPSAwOyB1ZV9oaTsgdWVfaGkgPj49IDEsIGkrKykgewotCQkJaWYgKHVlX2hpICYgMSkKLQkJCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKLQkJCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCQkJICAgICJCR18lZCA6IFVFX0hJR0ggJXMgYml0IHNldFxuIiwKLQkJCQkJICAgIGRlc2NfdWVfc3RhdHVzX2hpW2ldKTsKLQkJfQotCX0KLX0KLQotaW50IGJlX2NtZF9tb2RpZnlfZXFfZGVsYXkoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAotCQkgc3RydWN0IGJlX3NldF9lcWQgKnNldF9lcWQsIGludCBudW0pCitpbnQgYmVpc2NzaV9tb2RpZnlfZXFfZGVsYXkoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJICAgIHN0cnVjdCBiZV9zZXRfZXFkICpzZXRfZXFkLAorCQkJICAgIGludCBudW0pCiB7CiAJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOwogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CkBAIC0xNzQsNyArNDQsNyBAQAogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOwogCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAotCQlPUENPREVfQ09NTU9OX01PRElGWV9FUV9ERUxBWSwgc2l6ZW9mKCpyZXEpKTsKKwkJCSAgIE9QQ09ERV9DT01NT05fTU9ESUZZX0VRX0RFTEFZLCBzaXplb2YoKnJlcSkpOwogCiAJcmVxLT5udW1fZXEgPSBjcHVfdG9fbGUzMihudW0pOwogCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewpAQCAtMTg0LDM4NiArNTQsMTMgQEAKIAkJCQljcHVfdG9fbGUzMihzZXRfZXFkW2ldLmRlbGF5X211bHRpcGxpZXIpOwogCX0KIAorCS8qIGlnbm9yZSB0aGUgY29tcGxldGlvbiBvZiB0aGlzIG1ib3ggY29tbWFuZCAqLworCXNldF9iaXQoTUNDX1RBR19TVEFURV9JR05PUkUsICZjdHJsLT5wdGFnX3N0YXRlW3RhZ10udGFnX3N0YXRlKTsKIAliZV9tY2Nfbm90aWZ5KHBoYmEsIHRhZyk7CiAJbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOwogCXJldHVybiB0YWc7CiB9CiAKLS8qKgotICogbWdtdF9yZW9wZW5fc2Vzc2lvbigpLSBSZW9wZW4gYSBzZXNzaW9uIGJhc2VkIG9uIHJlb3Blbl90eXBlCi0gKiBAcGhiYTogRGV2aWNlIHByaXYgc3RydWN0dXJlIGluc3RhbmNlCi0gKiBAcmVvcGVuX3R5cGU6IFR5cGUgb2YgcmVvcGVuX3Nlc3Npb24gRlcgc2hvdWxkIGRvLgotICogQHNlc3NfaGFuZGxlOiBTZXNzaW9uIEhhbmRsZSBvZiB0aGUgc2Vzc2lvbiB0byBiZSByZS1vcGVuZWQKLSAqCi0gKiByZXR1cm4KLSAqCXRoZSBUQUcgdXNlZCBmb3IgTUJPWCBDb21tYW5kCi0gKgotICoqLwotdW5zaWduZWQgaW50IG1nbXRfcmVvcGVuX3Nlc3Npb24oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAotCQkJCSAgdW5zaWduZWQgaW50IHJlb3Blbl90eXBlLAotCQkJCSAgdW5zaWduZWQgaW50IHNlc3NfaGFuZGxlKQotewotCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKLQlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwotCXN0cnVjdCBiZV9jbWRfcmVvcGVuX3Nlc3Npb25fcmVxICpyZXE7Ci0JdW5zaWduZWQgaW50IHRhZzsKLQotCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywKLQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRyB8IEJFSVNDU0lfTE9HX01CT1gsCi0JCSAgICAiQkdfJWQgOiBJbiBiZXNjc2lfZ2V0X2Jvb3RfdGFyZ2V0XG4iKTsKLQotCW11dGV4X2xvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0Jd3JiID0gYWxsb2NfbWNjX3dyYihwaGJhLCAmdGFnKTsKLQlpZiAoIXdyYikgewotCQltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKLQliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOwotCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fSVNDU0lfSU5JLAotCQkJICAgT1BDT0RFX0lTQ1NJX0lOSV9EUklWRVJfUkVPUEVOX0FMTF9TRVNTSU9OUywKLQkJCSAgIHNpemVvZihzdHJ1Y3QgYmVfY21kX3Jlb3Blbl9zZXNzaW9uX3Jlc3ApKTsKLQotCS8qIHNldCB0aGUgcmVvcGVuX3R5cGUsc2Vzc19oYW5kbGUgKi8KLQlyZXEtPnJlb3Blbl90eXBlID0gcmVvcGVuX3R5cGU7Ci0JcmVxLT5zZXNzaW9uX2hhbmRsZSA9IHNlc3NfaGFuZGxlOwotCi0JYmVfbWNjX25vdGlmeShwaGJhLCB0YWcpOwotCW11dGV4X3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQlyZXR1cm4gdGFnOwotfQotCi11bnNpZ25lZCBpbnQgbWdtdF9nZXRfYm9vdF90YXJnZXQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKQotewotCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKLQlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwotCXN0cnVjdCBiZV9jbWRfZ2V0X2Jvb3RfdGFyZ2V0X3JlcSAqcmVxOwotCXVuc2lnbmVkIGludCB0YWc7Ci0KLQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sCi0JCSAgICBCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19NQk9YLAotCQkgICAgIkJHXyVkIDogSW4gYmVzY3NpX2dldF9ib290X3RhcmdldFxuIik7Ci0KLQltdXRleF9sb2NrKCZjdHJsLT5tYm94X2xvY2spOwotCXdyYiA9IGFsbG9jX21jY193cmIocGhiYSwgJnRhZyk7Ci0JaWYgKCF3cmIpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7Ci0JYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAwKTsKLQliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0lTQ1NJX0lOSSwKLQkJCSAgIE9QQ09ERV9JU0NTSV9JTklfQk9PVF9HRVRfQk9PVF9UQVJHRVQsCi0JCQkgICBzaXplb2Yoc3RydWN0IGJlX2NtZF9nZXRfYm9vdF90YXJnZXRfcmVzcCkpOwotCi0JYmVfbWNjX25vdGlmeShwaGJhLCB0YWcpOwotCW11dGV4X3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQlyZXR1cm4gdGFnOwotfQotCi11bnNpZ25lZCBpbnQgbWdtdF9nZXRfc2Vzc2lvbl9pbmZvKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKLQkJCQkgICB1MzIgYm9vdF9zZXNzaW9uX2hhbmRsZSwKLQkJCQkgICBzdHJ1Y3QgYmVfZG1hX21lbSAqbm9uZW1iX2NtZCkKLXsKLQlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7Ci0Jc3RydWN0IGJlX21jY193cmIgKndyYjsKLQl1bnNpZ25lZCBpbnQgdGFnOwotCXN0cnVjdCAgYmVfY21kX2dldF9zZXNzaW9uX3JlcSAqcmVxOwotCXN0cnVjdCBiZV9jbWRfZ2V0X3Nlc3Npb25fcmVzcCAqcmVzcDsKLQlzdHJ1Y3QgYmVfc2dlICpzZ2U7Ci0KLQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sCi0JCSAgICBCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19NQk9YLAotCQkgICAgIkJHXyVkIDogSW4gYmVpc2NzaV9nZXRfc2Vzc2lvbl9pbmZvXG4iKTsKLQotCW11dGV4X2xvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0Jd3JiID0gYWxsb2NfbWNjX3dyYihwaGJhLCAmdGFnKTsKLQlpZiAoIXdyYikgewotCQltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQotCW5vbmVtYl9jbWQtPnNpemUgPSBzaXplb2YoKnJlc3ApOwotCXJlcSA9IG5vbmVtYl9jbWQtPnZhOwotCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7Ci0Jc2dlID0gbm9uZW1iZWRkZWRfc2dsKHdyYik7Ci0JYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCBmYWxzZSwgMSk7Ci0JYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9JU0NTSV9JTkksCi0JCQkgICBPUENPREVfSVNDU0lfSU5JX1NFU1NJT05fR0VUX0FfU0VTU0lPTiwKLQkJCSAgIHNpemVvZigqcmVzcCkpOwotCXJlcS0+c2Vzc2lvbl9oYW5kbGUgPSBib290X3Nlc3Npb25faGFuZGxlOwotCXNnZS0+cGFfaGkgPSBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKG5vbmVtYl9jbWQtPmRtYSkpOwotCXNnZS0+cGFfbG8gPSBjcHVfdG9fbGUzMihub25lbWJfY21kLT5kbWEgJiAweEZGRkZGRkZGKTsKLQlzZ2UtPmxlbiA9IGNwdV90b19sZTMyKG5vbmVtYl9jbWQtPnNpemUpOwotCi0JYmVfbWNjX25vdGlmeShwaGJhLCB0YWcpOwotCW11dGV4X3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQlyZXR1cm4gdGFnOwotfQotCi0vKioKLSAqIG1nbXRfZ2V0X3BvcnRfbmFtZSgpLSBHZXQgcG9ydCBuYW1lIGZvciB0aGUgZnVuY3Rpb24KLSAqIEBjdHJsOiBwdHIgdG8gQ3RybCBJbmZvCi0gKiBAcGhiYTogcHRyIHRvIHRoZSBkZXYgcHJpdiBzdHJ1Y3R1cmUKLSAqCi0gKiBHZXQgdGhlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXIgZm9yIHBvcnQKLSAqCi0gKiovCi1pbnQgbWdtdF9nZXRfcG9ydF9uYW1lKHN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwsCi0JCSAgICAgICBzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGJlX21jY193cmIgKndyYjsKLQlzdHJ1Y3QgYmVfY21kX2dldF9wb3J0X25hbWUgKmlvY3RsOwotCi0JbXV0ZXhfbG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQl3cmIgPSB3cmJfZnJvbV9tYm94KCZjdHJsLT5tYm94X21lbSk7Ci0JbWVtc2V0KHdyYiwgMCwgc2l6ZW9mKCp3cmIpKTsKLQlpb2N0bCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKLQotCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqaW9jdGwpLCB0cnVlLCAwKTsKLQliZV9jbWRfaGRyX3ByZXBhcmUoJmlvY3RsLT5oLnJlcV9oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAotCQkJICAgT1BDT0RFX0NPTU1PTl9HRVRfUE9SVF9OQU1FLAotCQkJICAgRU1CRURfTUJYX01BWF9QQVlMT0FEX1NJWkUpOwotCXJldCA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOwotCXBoYmEtPnBvcnRfbmFtZSA9IDA7Ci0JaWYgKCFyZXQpIHsKLQkJcGhiYS0+cG9ydF9uYW1lID0gaW9jdGwtPnAucmVzcC5wb3J0X25hbWVzID4+Ci0JCQkJICAocGhiYS0+ZndfY29uZmlnLnBoeXNfcG9ydCAqIDgpICYgMHhmZjsKLQl9IGVsc2UgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sIEJFSVNDU0lfTE9HX0lOSVQsCi0JCQkgICAgIkJHXyVkIDogR0VUX1BPUlRfTkFNRSByZXQgMHgleCBzdGF0dXMgMHgleFxuIiwKLQkJCSAgICByZXQsIGlvY3RsLT5oLnJlc3BfaGRyLnN0YXR1cyk7Ci0JfQotCi0JaWYgKHBoYmEtPnBvcnRfbmFtZSA9PSAwKQotCQlwaGJhLT5wb3J0X25hbWUgPSAnPyc7Ci0KLQltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBtZ210X2dldF9md19jb25maWcoKS0gR2V0IHRoZSBGVyBjb25maWcgZm9yIHRoZSBmdW5jdGlvbgotICogQGN0cmw6IHB0ciB0byBDdHJsIEluZm8KLSAqIEBwaGJhOiBwdHIgdG8gdGhlIGRldiBwcml2IHN0cnVjdHVyZQotICoKLSAqIEdldCB0aGUgRlcgY29uZmlnIGFuZCByZXNvdXJjZXMgYXZhaWxhYmxlIGZvciB0aGUgZnVuY3Rpb24uCi0gKiBUaGUgcmVzb3VyY2VzIGFyZSBjcmVhdGVkIGJhc2VkIG9uIHRoZSBjb3VudCByZWNlaXZlZCBoZXJlLgotICoKLSAqIHJldHVybgotICoJU3VjY2VzczogMAotICoJRmFpbHVyZTogTm9uLVplcm8gVmFsdWUKLSAqKi8KLWludCBtZ210X2dldF9md19jb25maWcoc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCwKLQkJCQlzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCi17Ci0Jc3RydWN0IGJlX21jY193cmIgKndyYiA9IHdyYl9mcm9tX21ib3goJmN0cmwtPm1ib3hfbWVtKTsKLQlzdHJ1Y3QgYmVfZndfY2ZnICpwZndfY2ZnID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwotCXVpbnQzMl90IGNpZF9jb3VudCwgaWNkX2NvdW50OwotCWludCBzdGF0dXMgPSAtRUlOVkFMOwotCXVpbnQ4X3QgdWxwX251bSA9IDA7Ci0KLQltdXRleF9sb2NrKCZjdHJsLT5tYm94X2xvY2spOwotCW1lbXNldCh3cmIsIDAsIHNpemVvZigqd3JiKSk7Ci0JYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpwZndfY2ZnKSwgdHJ1ZSwgMCk7Ci0KLQliZV9jbWRfaGRyX3ByZXBhcmUoJnBmd19jZmctPmhkciwgQ01EX1NVQlNZU1RFTV9DT01NT04sCi0JCQkgICBPUENPREVfQ09NTU9OX1FVRVJZX0ZJUk1XQVJFX0NPTkZJRywKLQkJCSAgIEVNQkVEX01CWF9NQVhfUEFZTE9BRF9TSVpFKTsKLQotCWlmIChiZV9tYm94X25vdGlmeShjdHJsKSkgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKLQkJCSAgICAiQkdfJWQgOiBGYWlsZWQgaW4gbWdtdF9nZXRfZndfY29uZmlnXG4iKTsKLQkJZ290byBmYWlsX2luaXQ7Ci0JfQotCi0JLyogRlcgcmVzcG9uc2UgZm9ybWF0cyBkZXBlbmQgb24gcG9ydCBpZCAqLwotCXBoYmEtPmZ3X2NvbmZpZy5waHlzX3BvcnQgPSBwZndfY2ZnLT5waHlzX3BvcnQ7Ci0JaWYgKHBoYmEtPmZ3X2NvbmZpZy5waHlzX3BvcnQgPj0gQkVJU0NTSV9QSFlTX1BPUlRfTUFYKSB7Ci0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAotCQkJICAgICJCR18lZCA6IGludmFsaWQgcGh5c2ljYWwgcG9ydCBpZCAlZFxuIiwKLQkJCSAgICBwaGJhLT5md19jb25maWcucGh5c19wb3J0KTsKLQkJZ290byBmYWlsX2luaXQ7Ci0JfQotCi0JLyogcG9wdWxhdGUgYW5kIGNoZWNrIEZXIGNvbmZpZyBhZ2FpbnN0IG1pbiBhbmQgbWF4IHZhbHVlcyAqLwotCWlmICghaXNfY2hpcF9iZTJfYmUzcihwaGJhKSkgewotCQlwaGJhLT5md19jb25maWcuZXFpZF9jb3VudCA9IHBmd19jZmctPmVxaWRfY291bnQ7Ci0JCXBoYmEtPmZ3X2NvbmZpZy5jcWlkX2NvdW50ID0gcGZ3X2NmZy0+Y3FpZF9jb3VudDsKLQkJaWYgKHBoYmEtPmZ3X2NvbmZpZy5lcWlkX2NvdW50ID09IDAgfHwKLQkJICAgIHBoYmEtPmZ3X2NvbmZpZy5lcWlkX2NvdW50ID4gMjA0OCkgewotCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCi0JCQkJICAgICJCR18lZCA6IGludmFsaWQgRVEgY291bnQgJWRcbiIsCi0JCQkJICAgIHBoYmEtPmZ3X2NvbmZpZy5lcWlkX2NvdW50KTsKLQkJCWdvdG8gZmFpbF9pbml0OwotCQl9Ci0JCWlmIChwaGJhLT5md19jb25maWcuY3FpZF9jb3VudCA9PSAwIHx8Ci0JCSAgICBwaGJhLT5md19jb25maWcuY3FpZF9jb3VudCA+IDQwOTYpIHsKLQkJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLCBCRUlTQ1NJX0xPR19JTklULAotCQkJCSAgICAiQkdfJWQgOiBpbnZhbGlkIENRIGNvdW50ICVkXG4iLAotCQkJCSAgICBwaGJhLT5md19jb25maWcuY3FpZF9jb3VudCk7Ci0JCQlnb3RvIGZhaWxfaW5pdDsKLQkJfQotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sIEJFSVNDU0lfTE9HX0lOSVQsCi0JCQkgICAgIkJHXyVkIDogRVFfQ291bnQgOiAlZCBDUV9Db3VudCA6ICVkXG4iLAotCQkJICAgIHBoYmEtPmZ3X2NvbmZpZy5lcWlkX2NvdW50LAotCQkJICAgIHBoYmEtPmZ3X2NvbmZpZy5jcWlkX2NvdW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBvbiB3aGljaCBhbGwgVUxQIGlTQ1NJIFByb3RvY29sIGlzIGxvYWRlZC4KLQkgKiBTZXQgdGhlIEJpdCBmb3IgdGhvc2UgVUxQLiBUaGlzIHNldCBmbGFnIGlzIHVzZWQKLQkgKiBhdCBhbGwgcGxhY2VzIGluIHRoZSBjb2RlIHRvIGNoZWNrIG9uIHdoaWNoIFVMUAotCSAqIGlTQ1NpIFByb3RvY29sIGlzIGxvYWRlZAotCSAqKi8KLQlmb3IgKHVscF9udW0gPSAwOyB1bHBfbnVtIDwgQkVJU0NTSV9VTFBfQ09VTlQ7IHVscF9udW0rKykgewotCQlpZiAocGZ3X2NmZy0+dWxwW3VscF9udW1dLnVscF9tb2RlICYKLQkJICAgIEJFSVNDU0lfVUxQX0lTQ1NJX0lOSV9NT0RFKSB7Ci0JCQlzZXRfYml0KHVscF9udW0sICZwaGJhLT5md19jb25maWcudWxwX3N1cHBvcnRlZCk7Ci0KLQkJCS8qIEdldCB0aGUgQ0lELCBJQ0QgYW5kIENoYWluIGNvdW50IGZvciBlYWNoIFVMUCAqLwotCQkJcGhiYS0+ZndfY29uZmlnLmlzY3NpX2NpZF9zdGFydFt1bHBfbnVtXSA9Ci0JCQkJcGZ3X2NmZy0+dWxwW3VscF9udW1dLnNxX2Jhc2U7Ci0JCQlwaGJhLT5md19jb25maWcuaXNjc2lfY2lkX2NvdW50W3VscF9udW1dID0KLQkJCQlwZndfY2ZnLT51bHBbdWxwX251bV0uc3FfY291bnQ7Ci0KLQkJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9pY2Rfc3RhcnRbdWxwX251bV0gPQotCQkJCXBmd19jZmctPnVscFt1bHBfbnVtXS5pY2RfYmFzZTsKLQkJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9pY2RfY291bnRbdWxwX251bV0gPQotCQkJCXBmd19jZmctPnVscFt1bHBfbnVtXS5pY2RfY291bnQ7Ci0KLQkJCXBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9jaGFpbl9zdGFydFt1bHBfbnVtXSA9Ci0JCQkJcGZ3X2NmZy0+Y2hhaW5faWNkW3VscF9udW1dLmNoYWluX2Jhc2U7Ci0JCQlwaGJhLT5md19jb25maWcuaXNjc2lfY2hhaW5fY291bnRbdWxwX251bV0gPQotCQkJCXBmd19jZmctPmNoYWluX2ljZFt1bHBfbnVtXS5jaGFpbl9jb3VudDsKLQotCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLCBCRUlTQ1NJX0xPR19JTklULAotCQkJCSAgICAiQkdfJWQgOiBGdW5jdGlvbiBsb2FkZWQgb24gVUxQIDogJWRcbiIKLQkJCQkgICAgIlx0aXNjc2lfY2lkX2NvdW50IDogJWRcbiIKLQkJCQkgICAgIlx0aXNjc2lfY2lkX3N0YXJ0IDogJWRcbiIKLQkJCQkgICAgIlx0IGlzY3NpX2ljZF9jb3VudCA6ICVkXG4iCi0JCQkJICAgICJcdCBpc2NzaV9pY2Rfc3RhcnQgOiAlZFxuIiwKLQkJCQkgICAgdWxwX251bSwKLQkJCQkgICAgcGhiYS0+ZndfY29uZmlnLgotCQkJCSAgICBpc2NzaV9jaWRfY291bnRbdWxwX251bV0sCi0JCQkJICAgIHBoYmEtPmZ3X2NvbmZpZy4KLQkJCQkgICAgaXNjc2lfY2lkX3N0YXJ0W3VscF9udW1dLAotCQkJCSAgICBwaGJhLT5md19jb25maWcuCi0JCQkJICAgIGlzY3NpX2ljZF9jb3VudFt1bHBfbnVtXSwKLQkJCQkgICAgcGhiYS0+ZndfY29uZmlnLgotCQkJCSAgICBpc2NzaV9pY2Rfc3RhcnRbdWxwX251bV0pOwotCQl9Ci0JfQotCi0JaWYgKHBoYmEtPmZ3X2NvbmZpZy51bHBfc3VwcG9ydGVkID09IDApIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCi0JCQkgICAgIkJHXyVkIDogaVNDU0kgaW5pdGlhdG9yIG1vZGUgbm90IHNldDogVUxQMCAleCBVTFAxICV4XG4iLAotCQkJICAgIHBmd19jZmctPnVscFtCRUlTQ1NJX1VMUDBdLnVscF9tb2RlLAotCQkJICAgIHBmd19jZmctPnVscFtCRUlTQ1NJX1VMUDFdLnVscF9tb2RlKTsKLQkJZ290byBmYWlsX2luaXQ7Ci0JfQotCi0JLyoqCi0JICogSUNEIGlzIHNoYXJlZCBhbW9uZyBVTFBzLiBVc2UgaWNkX2NvdW50IG9mIGFueSBvbmUgbG9hZGVkIFVMUAotCSAqKi8KLQlmb3IgKHVscF9udW0gPSAwOyB1bHBfbnVtIDwgQkVJU0NTSV9VTFBfQ09VTlQ7IHVscF9udW0rKykKLQkJaWYgKHRlc3RfYml0KHVscF9udW0sICZwaGJhLT5md19jb25maWcudWxwX3N1cHBvcnRlZCkpCi0JCQlicmVhazsKLQlpY2RfY291bnQgPSBwaGJhLT5md19jb25maWcuaXNjc2lfaWNkX2NvdW50W3VscF9udW1dOwotCWlmIChpY2RfY291bnQgPT0gMCB8fCBpY2RfY291bnQgPiA2NTUzNikgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKLQkJCSAgICAiQkdfJWQ6IGludmFsaWQgSUNEIGNvdW50ICVkXG4iLCBpY2RfY291bnQpOwotCQlnb3RvIGZhaWxfaW5pdDsKLQl9Ci0KLQljaWRfY291bnQgPSBCRUlTQ1NJX0dFVF9DSURfQ09VTlQocGhiYSwgQkVJU0NTSV9VTFAwKSArCi0JCSAgICBCRUlTQ1NJX0dFVF9DSURfQ09VTlQocGhiYSwgQkVJU0NTSV9VTFAxKTsKLQlpZiAoY2lkX2NvdW50ID09IDAgfHwgY2lkX2NvdW50ID4gNDA5NikgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwgQkVJU0NTSV9MT0dfSU5JVCwKLQkJCSAgICAiQkdfJWQ6IGludmFsaWQgQ0lEIGNvdW50ICVkXG4iLCBjaWRfY291bnQpOwotCQlnb3RvIGZhaWxfaW5pdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBGVyBpcyBkdWFsIFVMUCBhd2FyZSBpLmUuIGNhbiBoYW5kbGUgZWl0aGVyCi0JICogb2YgdGhlIHByb3RvY29scy4KLQkgKi8KLQlwaGJhLT5md19jb25maWcuZHVhbF91bHBfYXdhcmUgPSAocGZ3X2NmZy0+ZnVuY3Rpb25fbW9kZSAmCi0JCQkJCSAgQkVJU0NTSV9GVU5DX0RVQV9NT0RFKTsKLQotCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywgQkVJU0NTSV9MT0dfSU5JVCwKLQkJICAgICJCR18lZCA6IERVQSBNb2RlIDogMHgleFxuIiwKLQkJICAgIHBoYmEtPmZ3X2NvbmZpZy5kdWFsX3VscF9hd2FyZSk7Ci0KLQkvKiBhbGwgc2V0LCBjb250aW51ZSB1c2luZyB0aGlzIEZXIGNvbmZpZyAqLwotCXN0YXR1cyA9IDA7Ci1mYWlsX2luaXQ6Ci0JbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBtZ210X2NoZWNrX3N1cHBvcnRlZF9mdyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAotCQkJCSAgICAgIHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKLXsKLQlzdHJ1Y3QgYmVfZG1hX21lbSBub25lbWJfY21kOwotCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmIgPSB3cmJfZnJvbV9tYm94KCZjdHJsLT5tYm94X21lbSk7Ci0Jc3RydWN0IGJlX21nbXRfY29udHJvbGxlcl9hdHRyaWJ1dGVzICpyZXE7Ci0Jc3RydWN0IGJlX3NnZSAqc2dlID0gbm9uZW1iZWRkZWRfc2dsKHdyYik7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlub25lbWJfY21kLnZhID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY3RybC0+cGRldiwKLQkJCQlzaXplb2Yoc3RydWN0IGJlX21nbXRfY29udHJvbGxlcl9hdHRyaWJ1dGVzKSwKLQkJCQkmbm9uZW1iX2NtZC5kbWEpOwotCWlmIChub25lbWJfY21kLnZhID09IE5VTEwpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCi0JCQkgICAgIkJHXyVkIDogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgIgotCQkJICAgICJtZ210X2NoZWNrX3N1cHBvcnRlZF9md1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlub25lbWJfY21kLnNpemUgPSBzaXplb2Yoc3RydWN0IGJlX21nbXRfY29udHJvbGxlcl9hdHRyaWJ1dGVzKTsKLQlyZXEgPSBub25lbWJfY21kLnZhOwotCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7Ci0JbXV0ZXhfbG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQltZW1zZXQod3JiLCAwLCBzaXplb2YoKndyYikpOwotCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgZmFsc2UsIDEpOwotCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAotCQkJICAgT1BDT0RFX0NPTU1PTl9HRVRfQ05UTF9BVFRSSUJVVEVTLCBzaXplb2YoKnJlcSkpOwotCXNnZS0+cGFfaGkgPSBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKG5vbmVtYl9jbWQuZG1hKSk7Ci0Jc2dlLT5wYV9sbyA9IGNwdV90b19sZTMyKG5vbmVtYl9jbWQuZG1hICYgMHhGRkZGRkZGRik7Ci0Jc2dlLT5sZW4gPSBjcHVfdG9fbGUzMihub25lbWJfY21kLnNpemUpOwotCXN0YXR1cyA9IGJlX21ib3hfbm90aWZ5KGN0cmwpOwotCWlmICghc3RhdHVzKSB7Ci0JCXN0cnVjdCBiZV9tZ210X2NvbnRyb2xsZXJfYXR0cmlidXRlc19yZXNwICpyZXNwID0gbm9uZW1iX2NtZC52YTsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLCBCRUlTQ1NJX0xPR19JTklULAotCQkJICAgICJCR18lZCA6IEZpcm13YXJlIFZlcnNpb24gb2YgQ01EIDogJXNcbiIKLQkJCSAgICAiRmlybXdhcmUgVmVyc2lvbiBpcyA6ICVzXG4iCi0JCQkgICAgIkRldmVsb3BlciBCdWlsZCwgbm90IHBlcmZvcm1pbmcgdmVyc2lvbiBjaGVjay4uLlxuIiwKLQkJCSAgICByZXNwLT5wYXJhbXMuaGJhX2F0dHJpYnMKLQkJCSAgICAuZmxhc2hyb21fdmVyc2lvbl9zdHJpbmcsCi0JCQkgICAgcmVzcC0+cGFyYW1zLmhiYV9hdHRyaWJzLgotCQkJICAgIGZpcm13YXJlX3ZlcnNpb25fc3RyaW5nKTsKLQotCQlwaGJhLT5md19jb25maWcuaXNjc2lfZmVhdHVyZXMgPQotCQkJCXJlc3AtPnBhcmFtcy5oYmFfYXR0cmlicy5pc2NzaV9mZWF0dXJlczsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLCBCRUlTQ1NJX0xPR19JTklULAotCQkJICAgICJCTV8lZCA6IHBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9mZWF0dXJlcyA9ICVkXG4iLAotCQkJICAgIHBoYmEtPmZ3X2NvbmZpZy5pc2NzaV9mZWF0dXJlcyk7Ci0JCW1lbWNweShwaGJhLT5md192ZXJfc3RyLCByZXNwLT5wYXJhbXMuaGJhX2F0dHJpYnMuCi0JCSAgICAgICBmaXJtd2FyZV92ZXJzaW9uX3N0cmluZywgQkVJU0NTSV9WRVJfU1RSTEVOKTsKLQl9IGVsc2UKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsIEJFSVNDU0lfTE9HX0lOSVQsCi0JCQkgICAgIkJHXyVkIDogIEZhaWxlZCBpbiBtZ210X2NoZWNrX3N1cHBvcnRlZF9md1xuIik7Ci0JbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOwotCWlmIChub25lbWJfY21kLnZhKQotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGN0cmwtPnBkZXYsIG5vbmVtYl9jbWQuc2l6ZSwKLQkJCQkgICAgbm9uZW1iX2NtZC52YSwgbm9uZW1iX2NtZC5kbWEpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQogdW5zaWduZWQgaW50IG1nbXRfdmVuZG9yX3NwZWNpZmljX2Z3X2NtZChzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAogCQkJCQkgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQkJCQkgc3RydWN0IGJzZ19qb2IgKmpvYiwKQEAgLTYwOSw3ICsxMDYsNyBAQAogCQkJICAgIGJzZ19yZXEtPnJxc3RfZGF0YS5oX3ZlbmRvci52ZW5kb3JfY21kWzBdKTsKIAogCQltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0JCXJldHVybiAtRU5PU1lTOworCQlyZXR1cm4gLUVQRVJNOwogCX0KIAogCXdyYiA9IGFsbG9jX21jY193cmIocGhiYSwgJnRhZyk7CkBAIC02MzEsNDggKzEyOCw2IEBACiAJcmV0dXJuIHRhZzsKIH0KIAotLyoqCi0gKiBtZ210X2VwZndfY2xlYW51cCgpLSBJbmZvcm0gRlcgdG8gY2xlYW51cCBkYXRhIHN0cnVjdHVyZXMuCi0gKiBAcGhiYTogcG9pbnRlciB0byBkZXYgcHJpdiBzdHJ1Y3R1cmUKLSAqIEB1bHBfbnVtOiBVTFAgbnVtYmVyLgotICoKLSAqIHJldHVybgotICoJU3VjY2VzczogMAotICoJRmFpbHVyZTogTm9uLVplcm8gVmFsdWUKLSAqKi8KLWludCBtZ210X2VwZndfY2xlYW51cChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHVuc2lnbmVkIHNob3J0IHVscF9udW0pCi17Ci0Jc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOwotCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7Ci0Jc3RydWN0IGlzY3NpX2NsZWFudXBfcmVxICpyZXE7Ci0JdW5zaWduZWQgaW50IHRhZzsKLQlpbnQgc3RhdHVzOwotCi0JbXV0ZXhfbG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQl3cmIgPSBhbGxvY19tY2Nfd3JiKHBoYmEsICZ0YWcpOwotCWlmICghd3JiKSB7Ci0JCW11dGV4X3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7Ci0JYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAwKTsKLQliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0lTQ1NJLAotCQkJICAgT1BDT0RFX0NPTU1PTl9JU0NTSV9DTEVBTlVQLCBzaXplb2YoKnJlcSkpOwotCi0JcmVxLT5jaHV0ZSA9ICgxIDw8IHVscF9udW0pOwotCXJlcS0+aGRyX3JpbmdfaWQgPSBjcHVfdG9fbGUxNihIV0lfR0VUX0RFRl9IRFJRX0lEKHBoYmEsIHVscF9udW0pKTsKLQlyZXEtPmRhdGFfcmluZ19pZCA9IGNwdV90b19sZTE2KEhXSV9HRVRfREVGX0JVRlFfSUQocGhiYSwgdWxwX251bSkpOwotCi0JYmVfbWNjX25vdGlmeShwaGJhLCB0YWcpOwotCXN0YXR1cyA9IGJlX21jY19jb21wbF9wb2xsKHBoYmEsIHRhZyk7Ci0JaWYgKHN0YXR1cykKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBCRUlTQ1NJX0xPR19JTklULAotCQkJICAgICJCR18lZCA6IG1nbXRfZXBmd19jbGVhbnVwICwgRkFJTEVEXG4iKTsKLQltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQogdW5zaWduZWQgaW50ICBtZ210X2ludmFsaWRhdGVfaWNkcyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCiAJCQkJc3RydWN0IGludmFsaWRhdGVfY29tbWFuZF90YWJsZSAqaW52X3RibCwKIAkJCQl1bnNpZ25lZCBpbnQgbnVtX2ludmFsaWRhdGUsIHVuc2lnbmVkIGludCBjaWQsCkBAIC04NDQsNyArMjk5LDcgQEAKIAkJCSAgIG5vbmVtYl9jbWQtPnNpemUpOwogCWlmIChkc3RfYWRkci0+c2FfZmFtaWx5ID09IFBGX0lORVQpIHsKIAkJX19iZTMyIHNfYWRkciA9IGRhZGRyX2luLT5zaW5fYWRkci5zX2FkZHI7Ci0JCXJlcS0+aXBfYWRkcmVzcy5pcF90eXBlID0gQkUyX0lQVjQ7CisJCXJlcS0+aXBfYWRkcmVzcy5pcF90eXBlID0gQkVJU0NTSV9JUF9UWVBFX1Y0OwogCQlyZXEtPmlwX2FkZHJlc3MuYWRkclswXSA9IHNfYWRkciAmIDB4MDAwMDAwZmY7CiAJCXJlcS0+aXBfYWRkcmVzcy5hZGRyWzFdID0gKHNfYWRkciAmIDB4MDAwMGZmMDApID4+IDg7CiAJCXJlcS0+aXBfYWRkcmVzcy5hZGRyWzJdID0gKHNfYWRkciAmIDB4MDBmZjAwMDApID4+IDE2OwpAQCAtODUyLDE3ICszMDcsMTcgQEAKIAkJcmVxLT50Y3BfcG9ydCA9IG50b2hzKGRhZGRyX2luLT5zaW5fcG9ydCk7CiAJCWJlaXNjc2lfZXAtPmRzdF9hZGRyID0gZGFkZHJfaW4tPnNpbl9hZGRyLnNfYWRkcjsKIAkJYmVpc2NzaV9lcC0+ZHN0X3RjcHBvcnQgPSBudG9ocyhkYWRkcl9pbi0+c2luX3BvcnQpOwotCQliZWlzY3NpX2VwLT5pcF90eXBlID0gQkUyX0lQVjQ7CisJCWJlaXNjc2lfZXAtPmlwX3R5cGUgPSBCRUlTQ1NJX0lQX1RZUEVfVjQ7CiAJfSBlbHNlIHsKIAkJLyogZWxzZSBpdHMgUEZfSU5FVDYgZmFtaWx5ICovCi0JCXJlcS0+aXBfYWRkcmVzcy5pcF90eXBlID0gQkUyX0lQVjY7CisJCXJlcS0+aXBfYWRkcmVzcy5pcF90eXBlID0gQkVJU0NTSV9JUF9UWVBFX1Y2OwogCQltZW1jcHkoJnJlcS0+aXBfYWRkcmVzcy5hZGRyLAogCQkgICAgICAgJmRhZGRyX2luNi0+c2luNl9hZGRyLmluNl91LnU2X2FkZHI4LCAxNik7CiAJCXJlcS0+dGNwX3BvcnQgPSBudG9ocyhkYWRkcl9pbjYtPnNpbjZfcG9ydCk7CiAJCWJlaXNjc2lfZXAtPmRzdF90Y3Bwb3J0ID0gbnRvaHMoZGFkZHJfaW42LT5zaW42X3BvcnQpOwogCQltZW1jcHkoJmJlaXNjc2lfZXAtPmRzdDZfYWRkciwKIAkJICAgICAgICZkYWRkcl9pbjYtPnNpbjZfYWRkci5pbjZfdS51Nl9hZGRyOCwgMTYpOwotCQliZWlzY3NpX2VwLT5pcF90eXBlID0gQkUyX0lQVjY7CisJCWJlaXNjc2lfZXAtPmlwX3R5cGUgPSBCRUlTQ1NJX0lQX1RZUEVfVjY7CiAJfQogCXJlcS0+Y2lkID0gY2lkOwogCWkgPSBwaGJhLT5ueHRfY3FpZCsrOwpAQCAtODgzLDcgKzMzOCw3IEBACiAKIAlpZiAoIWlzX2NoaXBfYmUyX2JlM3IocGhiYSkpIHsKIAkJcmVxLT5oZHIudmVyc2lvbiA9IE1CWF9DTURfVkVSMTsKLQkJcmVxLT50Y3Bfd2luZG93X3NpemUgPSAwOworCQlyZXEtPnRjcF93aW5kb3dfc2l6ZSA9IDB4ODAwMDsKIAkJcmVxLT50Y3Bfd2luZG93X3NjYWxlX2NvdW50ID0gMjsKIAl9CiAKQEAgLTg5Miw0NCArMzQ3LDYgQEAKIAlyZXR1cm4gdGFnOwogfQogCi11bnNpZ25lZCBpbnQgbWdtdF9nZXRfYWxsX2lmX2lkKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKLXsKLQlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7Ci0Jc3RydWN0IGJlX21jY193cmIgKndyYjsKLQlzdHJ1Y3QgYmVfY21kX2dldF9hbGxfaWZfaWRfcmVxICpyZXE7Ci0Jc3RydWN0IGJlX2NtZF9nZXRfYWxsX2lmX2lkX3JlcSAqcGJlX2FsbGlkOwotCXVuc2lnbmVkIGludCB0YWc7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjdHJsLT5tYm94X2xvY2spKQotCQlyZXR1cm4gLUVJTlRSOwotCXdyYiA9IGFsbG9jX21jY193cmIocGhiYSwgJnRhZyk7Ci0JaWYgKCF3cmIpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7Ci0JYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAwKTsKLQliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0lTQ1NJLAotCQkJICAgT1BDT0RFX0NPTU1PTl9JU0NTSV9OVFdLX0dFVF9BTExfSUZfSUQsCi0JCQkgICBzaXplb2YoKnJlcSkpOwotCWJlX21jY19ub3RpZnkocGhiYSwgdGFnKTsKLQltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7Ci0KLQlzdGF0dXMgPSBiZWlzY3NpX21jY3FfY29tcGxfd2FpdChwaGJhLCB0YWcsICZ3cmIsIE5VTEwpOwotCWlmIChzdGF0dXMpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBCRUlTQ1NJX0xPR19DT05GSUcsCi0JCQkgICAgIkJHXyVkIDogRmFpbGVkIGluIG1nbXRfZ2V0X2FsbF9pZl9pZFxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcGJlX2FsbGlkID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwotCXBoYmEtPmludGVyZmFjZV9oYW5kbGUgPSBwYmVfYWxsaWQtPmlmX2huZGxfbGlzdFswXTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KIC8qCiAgKiBtZ210X2V4ZWNfbm9uZW1iX2NtZCgpLSBFeGVjdXRlIE5vbiBFbWJlZGRlZCBNQlggQ21kCiAgKiBAcGhiYTogRHJpdmVyIHByaXYgc3RydWN0dXJlCkBAIC0xMDAxLDcyICs0MTgsNjggQEAKIAl9CiAJY21kLT5zaXplID0gc2l6ZTsKIAliZV9jbWRfaGRyX3ByZXBhcmUoY21kLT52YSwgQ01EX1NVQlNZU1RFTV9JU0NTSSwgaXNjc2lfY21kLCBzaXplKTsKKwliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0lORk8sIEJFSVNDU0lfTE9HX0NPTkZJRywKKwkJICAgICJCR18lZCA6IHN1YnN5c3RlbSBpU0NTSSBjbWQgJWQgc2l6ZSAlZFxuIiwKKwkJICAgIGlzY3NpX2NtZCwgc2l6ZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLW1nbXRfc3RhdGljX2lwX21vZGlmeShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCSAgICAgIHN0cnVjdCBiZV9jbWRfZ2V0X2lmX2luZm9fcmVzcCAqaWZfaW5mbywKLQkJICAgICAgc3RydWN0IGlzY3NpX2lmYWNlX3BhcmFtX2luZm8gKmlwX3BhcmFtLAotCQkgICAgICBzdHJ1Y3QgaXNjc2lfaWZhY2VfcGFyYW1faW5mbyAqc3VibmV0X3BhcmFtLAotCQkgICAgICB1aW50MzJfdCBpcF9hY3Rpb24pCit1bnNpZ25lZCBpbnQgYmVpc2NzaV9pZl9nZXRfaGFuZGxlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKIHsKLQlzdHJ1Y3QgYmVfY21kX3NldF9pcF9hZGRyX3JlcSAqcmVxOwotCXN0cnVjdCBiZV9kbWFfbWVtIG5vbmVtYl9jbWQ7Ci0JdWludDMyX3QgaXBfdHlwZTsKLQlpbnQgcmM7CisJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CisJc3RydWN0IGJlX2NtZF9nZXRfYWxsX2lmX2lkX3JlcSAqcmVxOworCXN0cnVjdCBiZV9jbWRfZ2V0X2FsbF9pZl9pZF9yZXEgKnBiZV9hbGxpZDsKKwl1bnNpZ25lZCBpbnQgdGFnOworCWludCBzdGF0dXMgPSAwOwogCi0JcmMgPSBtZ210X2FsbG9jX2NtZF9kYXRhKHBoYmEsICZub25lbWJfY21kLAotCQkJCSBPUENPREVfQ09NTU9OX0lTQ1NJX05UV0tfTU9ESUZZX0lQX0FERFIsCi0JCQkJIHNpemVvZigqcmVxKSk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlpcF90eXBlID0gKGlwX3BhcmFtLT5wYXJhbSA9PSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9BRERSKSA/Ci0JCUJFMl9JUFY2IDogQkUyX0lQVjQgOwotCi0JcmVxID0gbm9uZW1iX2NtZC52YTsKLQlyZXEtPmlwX3BhcmFtcy5yZWNvcmRfZW50cnlfY291bnQgPSAxOwotCXJlcS0+aXBfcGFyYW1zLmlwX3JlY29yZC5hY3Rpb24gPSBpcF9hY3Rpb247Ci0JcmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLmludGVyZmFjZV9obmRsID0KLQkJcGhiYS0+aW50ZXJmYWNlX2hhbmRsZTsKLQlyZXEtPmlwX3BhcmFtcy5pcF9yZWNvcmQuaXBfYWRkci5zaXplX29mX3N0cnVjdHVyZSA9Ci0JCXNpemVvZihzdHJ1Y3QgYmVfaXBfYWRkcl9zdWJuZXRfZm9ybWF0KTsKLQlyZXEtPmlwX3BhcmFtcy5pcF9yZWNvcmQuaXBfYWRkci5pcF90eXBlID0gaXBfdHlwZTsKLQotCWlmIChpcF9hY3Rpb24gPT0gSVBfQUNUSU9OX0FERCkgewotCQltZW1jcHkocmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLmlwX2FkZHIuYWRkciwgaXBfcGFyYW0tPnZhbHVlLAotCQkgICAgICAgc2l6ZW9mKHJlcS0+aXBfcGFyYW1zLmlwX3JlY29yZC5pcF9hZGRyLmFkZHIpKTsKLQotCQlpZiAoc3VibmV0X3BhcmFtKQotCQkJbWVtY3B5KHJlcS0+aXBfcGFyYW1zLmlwX3JlY29yZC5pcF9hZGRyLnN1Ym5ldF9tYXNrLAotCQkJICAgICAgIHN1Ym5ldF9wYXJhbS0+dmFsdWUsCi0JCQkgICAgICAgc2l6ZW9mKHJlcS0+aXBfcGFyYW1zLmlwX3JlY29yZC5pcF9hZGRyLnN1Ym5ldF9tYXNrKSk7Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KHJlcS0+aXBfcGFyYW1zLmlwX3JlY29yZC5pcF9hZGRyLmFkZHIsCi0JCSAgICAgICBpZl9pbmZvLT5pcF9hZGRyLmFkZHIsCi0JCSAgICAgICBzaXplb2YocmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLmlwX2FkZHIuYWRkcikpOwotCi0JCW1lbWNweShyZXEtPmlwX3BhcmFtcy5pcF9yZWNvcmQuaXBfYWRkci5zdWJuZXRfbWFzaywKLQkJICAgICAgIGlmX2luZm8tPmlwX2FkZHIuc3VibmV0X21hc2ssCi0JCSAgICAgICBzaXplb2YocmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLmlwX2FkZHIuc3VibmV0X21hc2spKTsKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjdHJsLT5tYm94X2xvY2spKQorCQlyZXR1cm4gLUVJTlRSOworCXdyYiA9IGFsbG9jX21jY193cmIocGhiYSwgJnRhZyk7CisJaWYgKCF3cmIpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyYyA9IG1nbXRfZXhlY19ub25lbWJfY21kKHBoYmEsICZub25lbWJfY21kLCBOVUxMLCAwKTsKLQlpZiAocmMgPCAwKQorCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIHRydWUsIDApOworCWJlX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fSVNDU0ksCisJCQkgICBPUENPREVfQ09NTU9OX0lTQ1NJX05UV0tfR0VUX0FMTF9JRl9JRCwKKwkJCSAgIHNpemVvZigqcmVxKSk7CisJYmVfbWNjX25vdGlmeShwaGJhLCB0YWcpOworCW11dGV4X3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKworCXN0YXR1cyA9IGJlaXNjc2lfbWNjcV9jb21wbF93YWl0KHBoYmEsIHRhZywgJndyYiwgTlVMTCk7CisJaWYgKHN0YXR1cykgewogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQkdfJWQgOiBGYWlsZWQgdG8gTW9kaWZ5IGV4aXN0aW5nIElQIEFkZHJlc3NcbiIpOwotCXJldHVybiByYzsKKwkJCSAgICAiQkdfJWQgOiAlcyBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlwYmVfYWxsaWQgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CisJLyogd2Ugbm93IHN1cHBvcnQgb25seSBvbmUgaW50ZXJmYWNlIHBlciBmdW5jdGlvbiAqLworCXBoYmEtPmludGVyZmFjZV9oYW5kbGUgPSBwYmVfYWxsaWQtPmlmX2huZGxfbGlzdFswXTsKKworCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgbWdtdF9tb2RpZnlfZ2F0ZXdheShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHVpbnQ4X3QgKmd0X2FkZHIsCi0JCQkgICAgICAgdWludDMyX3QgZ3R3YXlfYWN0aW9uLCB1aW50MzJfdCBwYXJhbV9sZW4pCitzdGF0aWMgaW5saW5lIGJvb2wgYmVpc2NzaV9pZl96ZXJvX2lwKHU4ICppcCwgdTMyIGlwX3R5cGUpCit7CisJdTMyIGxlbjsKKworCWxlbiA9IChpcF90eXBlIDwgQkVJU0NTSV9JUF9UWVBFX1Y2KSA/IElQX1Y0X0xFTiA6IElQX1Y2X0xFTjsKKwl3aGlsZSAobGVuICYmICFpcFtsZW4gLSAxXSkKKwkJbGVuLS07CisJcmV0dXJuIChsZW4gPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgYmVpc2NzaV9pZl9tb2RfZ3coc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJICAgICB1MzIgYWN0aW9uLCB1MzIgaXBfdHlwZSwgdTggKmd3KQogewogCXN0cnVjdCBiZV9jbWRfc2V0X2RlZl9nYXRld2F5X3JlcSAqcmVxOwogCXN0cnVjdCBiZV9kbWFfbWVtIG5vbmVtYl9jbWQ7CiAJaW50IHJ0X3ZhbDsKIAotCiAJcnRfdmFsID0gbWdtdF9hbGxvY19jbWRfZGF0YShwaGJhLCAmbm9uZW1iX2NtZCwKIAkJCQlPUENPREVfQ09NTU9OX0lTQ1NJX05UV0tfTU9ESUZZX0RFRkFVTFRfR0FURVdBWSwKIAkJCQlzaXplb2YoKnJlcSkpOwpAQCAtMTA3NCwxNTMgKzQ4NywyOSBAQAogCQlyZXR1cm4gcnRfdmFsOwogCiAJcmVxID0gbm9uZW1iX2NtZC52YTsKLQlyZXEtPmFjdGlvbiA9IGd0d2F5X2FjdGlvbjsKLQlyZXEtPmlwX2FkZHIuaXBfdHlwZSA9IEJFMl9JUFY0OwotCi0JbWVtY3B5KHJlcS0+aXBfYWRkci5hZGRyLCBndF9hZGRyLCBzaXplb2YocmVxLT5pcF9hZGRyLmFkZHIpKTsKLQorCXJlcS0+YWN0aW9uID0gYWN0aW9uOworCXJlcS0+aXBfYWRkci5pcF90eXBlID0gaXBfdHlwZTsKKwltZW1jcHkocmVxLT5pcF9hZGRyLmFkZHIsIGd3LAorCSAgICAgICAoaXBfdHlwZSA8IEJFSVNDU0lfSVBfVFlQRV9WNikgPyBJUF9WNF9MRU4gOiBJUF9WNl9MRU4pOwogCXJldHVybiBtZ210X2V4ZWNfbm9uZW1iX2NtZChwaGJhLCAmbm9uZW1iX2NtZCwgTlVMTCwgMCk7CiB9CiAKLWludCBtZ210X3NldF9pcChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCXN0cnVjdCBpc2NzaV9pZmFjZV9wYXJhbV9pbmZvICppcF9wYXJhbSwKLQkJc3RydWN0IGlzY3NpX2lmYWNlX3BhcmFtX2luZm8gKnN1Ym5ldF9wYXJhbSwKLQkJdWludDMyX3QgYm9vdF9wcm90bykKK2ludCBiZWlzY3NpX2lmX3NldF9ndyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHUzMiBpcF90eXBlLCB1OCAqZ3cpCiB7Ci0Jc3RydWN0IGJlX2NtZF9nZXRfZGVmX2dhdGV3YXlfcmVzcCBndHdheV9hZGRyX3NldDsKLQlzdHJ1Y3QgYmVfY21kX2dldF9pZl9pbmZvX3Jlc3AgKmlmX2luZm87Ci0Jc3RydWN0IGJlX2NtZF9zZXRfZGhjcF9yZXEgKmRoY3ByZXE7Ci0Jc3RydWN0IGJlX2NtZF9yZWxfZGhjcF9yZXEgKnJlbGRoY3A7Ci0Jc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKLQl1aW50OF90ICpndHdheV9hZGRyOwotCXVpbnQzMl90IGlwX3R5cGU7Ci0JaW50IHJjOwotCi0JcmMgPSBtZ210X2dldF9hbGxfaWZfaWQocGhiYSk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlpcF90eXBlID0gKGlwX3BhcmFtLT5wYXJhbSA9PSBJU0NTSV9ORVRfUEFSQU1fSVBWNl9BRERSKSA/Ci0JCUJFMl9JUFY2IDogQkUyX0lQVjQgOwotCi0JcmMgPSBtZ210X2dldF9pZl9pbmZvKHBoYmEsIGlwX3R5cGUsICZpZl9pbmZvKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCWlmIChib290X3Byb3RvID09IElTQ1NJX0JPT1RQUk9UT19ESENQKSB7Ci0JCWlmIChpZl9pbmZvLT5kaGNwX3N0YXRlKSB7Ci0JCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCQkgICAgIkJHXyVkIDogREhDUCBBbHJlYWR5IEVuYWJsZWRcbiIpOwotCQkJZ290byBleGl0OwotCQl9Ci0JCS8qIFRoZSBpcF9wYXJhbS0+bGVuIGlzIDEgaW4gREhDUCBjYXNlLiBTZXR0aW5nCi0JCSAgIHByb3BlciBJUCBsZW4gYXMgdGhpcyBpdCBpcyB1c2VkIHdoaWxlCi0JCSAgIGZyZWVpbmcgdGhlIFN0YXRpYyBJUC4KLQkJICovCi0JCWlwX3BhcmFtLT5sZW4gPSAoaXBfcGFyYW0tPnBhcmFtID09IElTQ1NJX05FVF9QQVJBTV9JUFY2X0FERFIpID8KLQkJCQlJUF9WNl9MRU4gOiBJUF9WNF9MRU47Ci0KLQl9IGVsc2UgewotCQlpZiAoaWZfaW5mby0+ZGhjcF9zdGF0ZSkgewotCi0JCQltZW1zZXQoaWZfaW5mbywgMCwgc2l6ZW9mKCppZl9pbmZvKSk7Ci0JCQlyYyA9IG1nbXRfYWxsb2NfY21kX2RhdGEocGhiYSwgJm5vbmVtYl9jbWQsCi0JCQkJT1BDT0RFX0NPTU1PTl9JU0NTSV9OVFdLX1JFTF9TVEFURUxFU1NfSVBfQUREUiwKLQkJCQlzaXplb2YoKnJlbGRoY3ApKTsKLQotCQkJaWYgKHJjKQotCQkJCWdvdG8gZXhpdDsKLQotCQkJcmVsZGhjcCA9IG5vbmVtYl9jbWQudmE7Ci0JCQlyZWxkaGNwLT5pbnRlcmZhY2VfaG5kbCA9IHBoYmEtPmludGVyZmFjZV9oYW5kbGU7Ci0JCQlyZWxkaGNwLT5pcF90eXBlID0gaXBfdHlwZTsKLQotCQkJcmMgPSBtZ210X2V4ZWNfbm9uZW1iX2NtZChwaGJhLCAmbm9uZW1iX2NtZCwgTlVMTCwgMCk7Ci0JCQlpZiAocmMgPCAwKSB7Ci0JCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLAotCQkJCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJCQkgICAgIkJHXyVkIDogRmFpbGVkIHRvIERlbGV0ZSBleGlzdGluZyBkaGNwXG4iKTsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBEZWxldGUgdGhlIFN0YXRpYyBJUCBTZXQgKi8KLQlpZiAoaWZfaW5mby0+aXBfYWRkci5hZGRyWzBdKSB7Ci0JCXJjID0gbWdtdF9zdGF0aWNfaXBfbW9kaWZ5KHBoYmEsIGlmX2luZm8sIGlwX3BhcmFtLCBOVUxMLAotCQkJCQkgICBJUF9BQ1RJT05fREVMKTsKLQkJaWYgKHJjKQotCQkJZ290byBleGl0OwotCX0KLQotCS8qIERlbGV0ZSB0aGUgR2F0ZXdheSBzZXR0aW5ncyBpZiBtb2RlIGNoYW5nZSBpcyB0byBESENQICovCi0JaWYgKGJvb3RfcHJvdG8gPT0gSVNDU0lfQk9PVFBST1RPX0RIQ1ApIHsKLQkJbWVtc2V0KCZndHdheV9hZGRyX3NldCwgMCwgc2l6ZW9mKGd0d2F5X2FkZHJfc2V0KSk7Ci0JCXJjID0gbWdtdF9nZXRfZ2F0ZXdheShwaGJhLCBCRTJfSVBWNCwgJmd0d2F5X2FkZHJfc2V0KTsKLQkJaWYgKHJjKSB7Ci0JCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCQkgICAgIkJHXyVkIDogRmFpbGVkIHRvIEdldCBHYXRld2F5IEFkZHJcbiIpOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJaWYgKGd0d2F5X2FkZHJfc2V0LmlwX2FkZHIuYWRkclswXSkgewotCQkJZ3R3YXlfYWRkciA9ICh1aW50OF90ICopJmd0d2F5X2FkZHJfc2V0LmlwX2FkZHIuYWRkcjsKLQkJCXJjID0gbWdtdF9tb2RpZnlfZ2F0ZXdheShwaGJhLCBndHdheV9hZGRyLAotCQkJCQkJIElQX0FDVElPTl9ERUwsIElQX1Y0X0xFTik7Ci0KLQkJCWlmIChyYykgewotCQkJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fV0FSTklORywKLQkJCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCQkJICAgICJCR18lZCA6IEZhaWxlZCB0byBjbGVhciBHYXRld2F5IEFkZHIgU2V0XG4iKTsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBTZXQgQWRhcHRlciB0byBESENQL1N0YXRpYyBNb2RlICovCi0JaWYgKGJvb3RfcHJvdG8gPT0gSVNDU0lfQk9PVFBST1RPX0RIQ1ApIHsKLQkJcmMgPSBtZ210X2FsbG9jX2NtZF9kYXRhKHBoYmEsICZub25lbWJfY21kLAotCQkJT1BDT0RFX0NPTU1PTl9JU0NTSV9OVFdLX0NPTkZJR19TVEFURUxFU1NfSVBfQUREUiwKLQkJCXNpemVvZigqZGhjcHJlcSkpOwotCQlpZiAocmMpCi0JCQlnb3RvIGV4aXQ7Ci0KLQkJZGhjcHJlcSA9IG5vbmVtYl9jbWQudmE7Ci0JCWRoY3ByZXEtPmZsYWdzID0gQkxPQ0tJTkc7Ci0JCWRoY3ByZXEtPnJldHJ5X2NvdW50ID0gMTsKLQkJZGhjcHJlcS0+aW50ZXJmYWNlX2huZGwgPSBwaGJhLT5pbnRlcmZhY2VfaGFuZGxlOwotCQlkaGNwcmVxLT5pcF90eXBlID0gQkUyX0RIQ1BfVjQ7Ci0KLQkJcmMgPSBtZ210X2V4ZWNfbm9uZW1iX2NtZChwaGJhLCAmbm9uZW1iX2NtZCwgTlVMTCwgMCk7Ci0JfSBlbHNlIHsKLQkJcmMgPSBtZ210X3N0YXRpY19pcF9tb2RpZnkocGhiYSwgaWZfaW5mbywgaXBfcGFyYW0sCi0JCQkJCSAgICAgc3VibmV0X3BhcmFtLCBJUF9BQ1RJT05fQUREKTsKLQl9Ci0KLWV4aXQ6Ci0Ja2ZyZWUoaWZfaW5mbyk7Ci0JcmV0dXJuIHJjOwotfQotCi1pbnQgbWdtdF9zZXRfZ2F0ZXdheShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCSAgICAgc3RydWN0IGlzY3NpX2lmYWNlX3BhcmFtX2luZm8gKmdhdGV3YXlfcGFyYW0pCi17Ci0Jc3RydWN0IGJlX2NtZF9nZXRfZGVmX2dhdGV3YXlfcmVzcCBndHdheV9hZGRyX3NldDsKLQl1aW50OF90ICpndHdheV9hZGRyOworCXN0cnVjdCBiZV9jbWRfZ2V0X2RlZl9nYXRld2F5X3Jlc3AgZ3dfcmVzcDsKIAlpbnQgcnRfdmFsOwogCi0JbWVtc2V0KCZndHdheV9hZGRyX3NldCwgMCwgc2l6ZW9mKGd0d2F5X2FkZHJfc2V0KSk7Ci0JcnRfdmFsID0gbWdtdF9nZXRfZ2F0ZXdheShwaGJhLCBCRTJfSVBWNCwgJmd0d2F5X2FkZHJfc2V0KTsKKwltZW1zZXQoJmd3X3Jlc3AsIDAsIHNpemVvZihnd19yZXNwKSk7CisJcnRfdmFsID0gYmVpc2NzaV9pZl9nZXRfZ3cocGhiYSwgaXBfdHlwZSwgJmd3X3Jlc3ApOwogCWlmIChydF92YWwpIHsKIAkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBCRUlTQ1NJX0xPR19DT05GSUcsCiAJCQkgICAgIkJHXyVkIDogRmFpbGVkIHRvIEdldCBHYXRld2F5IEFkZHJcbiIpOwogCQlyZXR1cm4gcnRfdmFsOwogCX0KIAotCWlmIChndHdheV9hZGRyX3NldC5pcF9hZGRyLmFkZHJbMF0pIHsKLQkJZ3R3YXlfYWRkciA9ICh1aW50OF90ICopJmd0d2F5X2FkZHJfc2V0LmlwX2FkZHIuYWRkcjsKLQkJcnRfdmFsID0gbWdtdF9tb2RpZnlfZ2F0ZXdheShwaGJhLCBndHdheV9hZGRyLCBJUF9BQ1RJT05fREVMLAotCQkJCQkgICAgIGdhdGV3YXlfcGFyYW0tPmxlbik7CisJaWYgKCFiZWlzY3NpX2lmX3plcm9faXAoZ3dfcmVzcC5pcF9hZGRyLmFkZHIsIGlwX3R5cGUpKSB7CisJCXJ0X3ZhbCA9IGJlaXNjc2lfaWZfbW9kX2d3KHBoYmEsIElQX0FDVElPTl9ERUwsIGlwX3R5cGUsCisJCQkJCSAgIGd3X3Jlc3AuaXBfYWRkci5hZGRyKTsKIAkJaWYgKHJ0X3ZhbCkgewogCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBCRUlTQ1NJX0xPR19DT05GSUcsCiAJCQkJICAgICJCR18lZCA6IEZhaWxlZCB0byBjbGVhciBHYXRld2F5IEFkZHIgU2V0XG4iKTsKQEAgLTEyMjgsMTAgKzUxNyw3IEBACiAJCX0KIAl9CiAKLQlndHdheV9hZGRyID0gKHVpbnQ4X3QgKikmZ2F0ZXdheV9wYXJhbS0+dmFsdWU7Ci0JcnRfdmFsID0gbWdtdF9tb2RpZnlfZ2F0ZXdheShwaGJhLCBndHdheV9hZGRyLCBJUF9BQ1RJT05fQURELAotCQkJCSAgICAgZ2F0ZXdheV9wYXJhbS0+bGVuKTsKLQorCXJ0X3ZhbCA9IGJlaXNjc2lfaWZfbW9kX2d3KHBoYmEsIElQX0FDVElPTl9BREQsIGlwX3R5cGUsIGd3KTsKIAlpZiAocnRfdmFsKQogCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIEJFSVNDU0lfTE9HX0NPTkZJRywKIAkJCSAgICAiQkdfJWQgOiBGYWlsZWQgdG8gU2V0IEdhdGV3YXkgQWRkclxuIik7CkBAIC0xMjM5LDggKzUyNSw4IEBACiAJcmV0dXJuIHJ0X3ZhbDsKIH0KIAotaW50IG1nbXRfZ2V0X2dhdGV3YXkoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBpbnQgaXBfdHlwZSwKLQkJICAgICBzdHJ1Y3QgYmVfY21kX2dldF9kZWZfZ2F0ZXdheV9yZXNwICpnYXRld2F5KQoraW50IGJlaXNjc2lfaWZfZ2V0X2d3KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdTMyIGlwX3R5cGUsCisJCSAgICAgIHN0cnVjdCBiZV9jbWRfZ2V0X2RlZl9nYXRld2F5X3Jlc3AgKnJlc3ApCiB7CiAJc3RydWN0IGJlX2NtZF9nZXRfZGVmX2dhdGV3YXlfcmVxICpyZXE7CiAJc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKQEAgLTEyNDgsMjYgKzUzNCwyNTMgQEAKIAogCXJjID0gbWdtdF9hbGxvY19jbWRfZGF0YShwaGJhLCAmbm9uZW1iX2NtZCwKIAkJCQkgT1BDT0RFX0NPTU1PTl9JU0NTSV9OVFdLX0dFVF9ERUZBVUxUX0dBVEVXQVksCi0JCQkJIHNpemVvZigqZ2F0ZXdheSkpOworCQkJCSBzaXplb2YoKnJlc3ApKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAogCXJlcSA9IG5vbmVtYl9jbWQudmE7CiAJcmVxLT5pcF90eXBlID0gaXBfdHlwZTsKIAotCXJldHVybiBtZ210X2V4ZWNfbm9uZW1iX2NtZChwaGJhLCAmbm9uZW1iX2NtZCwgZ2F0ZXdheSwKLQkJCQkgICAgc2l6ZW9mKCpnYXRld2F5KSk7CisJcmV0dXJuIG1nbXRfZXhlY19ub25lbWJfY21kKHBoYmEsICZub25lbWJfY21kLCByZXNwLAorCQkJCSAgICBzaXplb2YoKnJlc3ApKTsKIH0KIAotaW50IG1nbXRfZ2V0X2lmX2luZm8oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBpbnQgaXBfdHlwZSwKLQkJICAgICBzdHJ1Y3QgYmVfY21kX2dldF9pZl9pbmZvX3Jlc3AgKippZl9pbmZvKQorc3RhdGljIGludAorYmVpc2NzaV9pZl9jbHJfaXAoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkgIHN0cnVjdCBiZV9jbWRfZ2V0X2lmX2luZm9fcmVzcCAqaWZfaW5mbykKK3sKKwlzdHJ1Y3QgYmVfY21kX3NldF9pcF9hZGRyX3JlcSAqcmVxOworCXN0cnVjdCBiZV9kbWFfbWVtIG5vbmVtYl9jbWQ7CisJaW50IHJjOworCisJcmMgPSBtZ210X2FsbG9jX2NtZF9kYXRhKHBoYmEsICZub25lbWJfY21kLAorCQkJCSBPUENPREVfQ09NTU9OX0lTQ1NJX05UV0tfTU9ESUZZX0lQX0FERFIsCisJCQkJIHNpemVvZigqcmVxKSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyZXEgPSBub25lbWJfY21kLnZhOworCXJlcS0+aXBfcGFyYW1zLnJlY29yZF9lbnRyeV9jb3VudCA9IDE7CisJcmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLmFjdGlvbiA9IElQX0FDVElPTl9ERUw7CisJcmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLmludGVyZmFjZV9obmRsID0KKwkJcGhiYS0+aW50ZXJmYWNlX2hhbmRsZTsKKwlyZXEtPmlwX3BhcmFtcy5pcF9yZWNvcmQuaXBfYWRkci5zaXplX29mX3N0cnVjdHVyZSA9CisJCXNpemVvZihzdHJ1Y3QgYmVfaXBfYWRkcl9zdWJuZXRfZm9ybWF0KTsKKwlyZXEtPmlwX3BhcmFtcy5pcF9yZWNvcmQuaXBfYWRkci5pcF90eXBlID0gaWZfaW5mby0+aXBfYWRkci5pcF90eXBlOworCW1lbWNweShyZXEtPmlwX3BhcmFtcy5pcF9yZWNvcmQuaXBfYWRkci5hZGRyLAorCSAgICAgICBpZl9pbmZvLT5pcF9hZGRyLmFkZHIsCisJICAgICAgIHNpemVvZihpZl9pbmZvLT5pcF9hZGRyLmFkZHIpKTsKKwltZW1jcHkocmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLmlwX2FkZHIuc3VibmV0X21hc2ssCisJICAgICAgIGlmX2luZm8tPmlwX2FkZHIuc3VibmV0X21hc2ssCisJICAgICAgIHNpemVvZihpZl9pbmZvLT5pcF9hZGRyLnN1Ym5ldF9tYXNrKSk7CisJcmMgPSBtZ210X2V4ZWNfbm9uZW1iX2NtZChwaGJhLCAmbm9uZW1iX2NtZCwgTlVMTCwgMCk7CisJaWYgKHJjIDwgMCB8fCByZXEtPmlwX3BhcmFtcy5pcF9yZWNvcmQuc3RhdHVzKSB7CisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywgQkVJU0NTSV9MT0dfQ09ORklHLAorCQkJICAgICJCR18lZCA6IGZhaWxlZCB0byBjbGVhciBJUDogcmMgJWQgc3RhdHVzICVkXG4iLAorCQkJICAgIHJjLCByZXEtPmlwX3BhcmFtcy5pcF9yZWNvcmQuc3RhdHVzKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitiZWlzY3NpX2lmX3NldF9pcChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHU4ICppcCwKKwkJICB1OCAqc3VibmV0LCB1MzIgaXBfdHlwZSkKK3sKKwlzdHJ1Y3QgYmVfY21kX3NldF9pcF9hZGRyX3JlcSAqcmVxOworCXN0cnVjdCBiZV9kbWFfbWVtIG5vbmVtYl9jbWQ7CisJdWludDMyX3QgaXBfbGVuOworCWludCByYzsKKworCXJjID0gbWdtdF9hbGxvY19jbWRfZGF0YShwaGJhLCAmbm9uZW1iX2NtZCwKKwkJCQkgT1BDT0RFX0NPTU1PTl9JU0NTSV9OVFdLX01PRElGWV9JUF9BRERSLAorCQkJCSBzaXplb2YoKnJlcSkpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmVxID0gbm9uZW1iX2NtZC52YTsKKwlyZXEtPmlwX3BhcmFtcy5yZWNvcmRfZW50cnlfY291bnQgPSAxOworCXJlcS0+aXBfcGFyYW1zLmlwX3JlY29yZC5hY3Rpb24gPSBJUF9BQ1RJT05fQUREOworCXJlcS0+aXBfcGFyYW1zLmlwX3JlY29yZC5pbnRlcmZhY2VfaG5kbCA9CisJCXBoYmEtPmludGVyZmFjZV9oYW5kbGU7CisJcmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLmlwX2FkZHIuc2l6ZV9vZl9zdHJ1Y3R1cmUgPQorCQlzaXplb2Yoc3RydWN0IGJlX2lwX2FkZHJfc3VibmV0X2Zvcm1hdCk7CisJcmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLmlwX2FkZHIuaXBfdHlwZSA9IGlwX3R5cGU7CisJaXBfbGVuID0gKGlwX3R5cGUgPCBCRUlTQ1NJX0lQX1RZUEVfVjYpID8gSVBfVjRfTEVOIDogSVBfVjZfTEVOOworCW1lbWNweShyZXEtPmlwX3BhcmFtcy5pcF9yZWNvcmQuaXBfYWRkci5hZGRyLCBpcCwgaXBfbGVuKTsKKwlpZiAoc3VibmV0KQorCQltZW1jcHkocmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLmlwX2FkZHIuc3VibmV0X21hc2ssCisJCSAgICAgICBzdWJuZXQsIGlwX2xlbik7CisKKwlyYyA9IG1nbXRfZXhlY19ub25lbWJfY21kKHBoYmEsICZub25lbWJfY21kLCBOVUxMLCAwKTsKKwkvKioKKwkgKiBJbiBzb21lIGNhc2VzLCBob3N0IG5lZWRzIHRvIGxvb2sgaW50byBpbmRpdmlkdWFsIHJlY29yZCBzdGF0dXMKKwkgKiBldmVuIHRob3VnaCBGVyByZXBvcnRlZCBzdWNjZXNzIGZvciB0aGF0IElPQ1RMLgorCSAqLworCWlmIChyYyA8IDAgfHwgcmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLnN0YXR1cykgeworCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAorCQkJICAgICJCR18lZCA6IGZhaWxlZCB0byBzZXQgSVA6IHJjICVkIHN0YXR1cyAlZFxuIiwKKwkJCSAgICByYywgcmVxLT5pcF9wYXJhbXMuaXBfcmVjb3JkLnN0YXR1cyk7CisJCWlmIChyZXEtPmlwX3BhcmFtcy5pcF9yZWNvcmQuc3RhdHVzKQorCQkJcmMgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK2ludCBiZWlzY3NpX2lmX2VuX3N0YXRpYyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHUzMiBpcF90eXBlLAorCQkJIHU4ICppcCwgdTggKnN1Ym5ldCkKK3sKKwlzdHJ1Y3QgYmVfY21kX2dldF9pZl9pbmZvX3Jlc3AgKmlmX2luZm87CisJc3RydWN0IGJlX2NtZF9yZWxfZGhjcF9yZXEgKnJlbGRoY3A7CisJc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKKwlpbnQgcmM7CisKKwlyYyA9IGJlaXNjc2lfaWZfZ2V0X2luZm8ocGhiYSwgaXBfdHlwZSwgJmlmX2luZm8pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKGlmX2luZm8tPmRoY3Bfc3RhdGUpIHsKKwkJcmMgPSBtZ210X2FsbG9jX2NtZF9kYXRhKHBoYmEsICZub25lbWJfY21kLAorCQkJCU9QQ09ERV9DT01NT05fSVNDU0lfTlRXS19SRUxfU1RBVEVMRVNTX0lQX0FERFIsCisJCQkJc2l6ZW9mKCpyZWxkaGNwKSk7CisJCWlmIChyYykKKwkJCWdvdG8gZXhpdDsKKworCQlyZWxkaGNwID0gbm9uZW1iX2NtZC52YTsKKwkJcmVsZGhjcC0+aW50ZXJmYWNlX2huZGwgPSBwaGJhLT5pbnRlcmZhY2VfaGFuZGxlOworCQlyZWxkaGNwLT5pcF90eXBlID0gaXBfdHlwZTsKKwkJcmMgPSBtZ210X2V4ZWNfbm9uZW1iX2NtZChwaGJhLCAmbm9uZW1iX2NtZCwgTlVMTCwgMCk7CisJCWlmIChyYyA8IDApIHsKKwkJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgQkVJU0NTSV9MT0dfQ09ORklHLAorCQkJCSAgICAiQkdfJWQgOiBmYWlsZWQgdG8gcmVsZWFzZSBleGlzdGluZyBESENQOiAlZFxuIiwKKwkJCQkgICAgcmMpOworCQkJZ290byBleGl0OworCQl9CisJfQorCisJLyogZmlyc3QgZGVsZXRlIGFueSBJUCBzZXQgKi8KKwlpZiAoIWJlaXNjc2lfaWZfemVyb19pcChpZl9pbmZvLT5pcF9hZGRyLmFkZHIsIGlwX3R5cGUpKSB7CisJCXJjID0gYmVpc2NzaV9pZl9jbHJfaXAocGhiYSwgaWZfaW5mbyk7CisJCWlmIChyYykKKwkJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBpZiBpcCA9PSBOVUxMIHRoZW4gdGhpcyBpcyBjYWxsZWQganVzdCB0byByZWxlYXNlIERIQ1AgSVAgKi8KKwlpZiAoaXApCisJCXJjID0gYmVpc2NzaV9pZl9zZXRfaXAocGhiYSwgaXAsIHN1Ym5ldCwgaXBfdHlwZSk7CitleGl0OgorCWtmcmVlKGlmX2luZm8pOworCXJldHVybiByYzsKK30KKworaW50IGJlaXNjc2lfaWZfZW5fZGhjcChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHUzMiBpcF90eXBlKQoreworCXN0cnVjdCBiZV9jbWRfZ2V0X2RlZl9nYXRld2F5X3Jlc3AgZ3dfcmVzcDsKKwlzdHJ1Y3QgYmVfY21kX2dldF9pZl9pbmZvX3Jlc3AgKmlmX2luZm87CisJc3RydWN0IGJlX2NtZF9zZXRfZGhjcF9yZXEgKmRoY3ByZXE7CisJc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKKwl1OCAqZ3c7CisJaW50IHJjOworCisJcmMgPSBiZWlzY3NpX2lmX2dldF9pbmZvKHBoYmEsIGlwX3R5cGUsICZpZl9pbmZvKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChpZl9pbmZvLT5kaGNwX3N0YXRlKSB7CisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgQkVJU0NTSV9MT0dfQ09ORklHLAorCQkJCSJCR18lZCA6IERIQ1AgQWxyZWFkeSBFbmFibGVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIGZpcnN0IGRlbGV0ZSBhbnkgSVAgc2V0ICovCisJaWYgKCFiZWlzY3NpX2lmX3plcm9faXAoaWZfaW5mby0+aXBfYWRkci5hZGRyLCBpcF90eXBlKSkgeworCQlyYyA9IGJlaXNjc2lfaWZfY2xyX2lwKHBoYmEsIGlmX2luZm8pOworCQlpZiAocmMpCisJCQlnb3RvIGV4aXQ7CisJfQorCisJLyogZGVsZXRlIGdhdGV3YXkgc2V0dGluZ3MgaWYgbW9kZSBjaGFuZ2UgaXMgdG8gREhDUCAqLworCW1lbXNldCgmZ3dfcmVzcCwgMCwgc2l6ZW9mKGd3X3Jlc3ApKTsKKwkvKiB1c2UgaXBfdHlwZSBwcm92aWRlZCBpbiBpZl9pbmZvICovCisJcmMgPSBiZWlzY3NpX2lmX2dldF9ndyhwaGJhLCBpZl9pbmZvLT5pcF9hZGRyLmlwX3R5cGUsICZnd19yZXNwKTsKKwlpZiAocmMpIHsKKwkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBCRUlTQ1NJX0xPR19DT05GSUcsCisJCQkgICAgIkJHXyVkIDogRmFpbGVkIHRvIEdldCBHYXRld2F5IEFkZHJcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCWd3ID0gKHU4ICopJmd3X3Jlc3AuaXBfYWRkci5hZGRyOworCWlmICghYmVpc2NzaV9pZl96ZXJvX2lwKGd3LCBpZl9pbmZvLT5pcF9hZGRyLmlwX3R5cGUpKSB7CisJCXJjID0gYmVpc2NzaV9pZl9tb2RfZ3cocGhiYSwgSVBfQUNUSU9OX0RFTCwKKwkJCQkgICAgICAgaWZfaW5mby0+aXBfYWRkci5pcF90eXBlLCBndyk7CisJCWlmIChyYykgeworCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBCRUlTQ1NJX0xPR19DT05GSUcsCisJCQkJICAgICJCR18lZCA6IEZhaWxlZCB0byBjbGVhciBHYXRld2F5IEFkZHIgU2V0XG4iKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCXJjID0gbWdtdF9hbGxvY19jbWRfZGF0YShwaGJhLCAmbm9uZW1iX2NtZCwKKwkJCU9QQ09ERV9DT01NT05fSVNDU0lfTlRXS19DT05GSUdfU1RBVEVMRVNTX0lQX0FERFIsCisJCQlzaXplb2YoKmRoY3ByZXEpKTsKKwlpZiAocmMpCisJCWdvdG8gZXhpdDsKKworCWRoY3ByZXEgPSBub25lbWJfY21kLnZhOworCWRoY3ByZXEtPmZsYWdzID0gMTsgLyogMSAtIGJsb2NraW5nOyAwIC0gbm9uLWJsb2NraW5nICovCisJZGhjcHJlcS0+cmV0cnlfY291bnQgPSAxOworCWRoY3ByZXEtPmludGVyZmFjZV9obmRsID0gcGhiYS0+aW50ZXJmYWNlX2hhbmRsZTsKKwlkaGNwcmVxLT5pcF90eXBlID0gaXBfdHlwZTsKKwlyYyA9IG1nbXRfZXhlY19ub25lbWJfY21kKHBoYmEsICZub25lbWJfY21kLCBOVUxMLCAwKTsKKworZXhpdDoKKwlrZnJlZShpZl9pbmZvKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogYmVpc2NzaV9pZl9zZXRfdmxhbigpLSBJc3N1ZSBhbmQgd2FpdCBmb3IgQ01EIGNvbXBsZXRpb24KKyAqIEBwaGJhOiBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUgaW5zdGFuY2UKKyAqIEB2bGFuX3RhZzogVkxBTiB0YWcKKyAqCisgKiBJc3N1ZSB0aGUgTUJYIENtZCBhbmQgd2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlCisgKiBjb21tYW5kLgorICoKKyAqIHJldHVybnMKKyAqCVN1Y2Nlc3M6IDAKKyAqCUZhaWx1cmU6IE5vbi1YZXJvIFZhbHVlCisgKiovCitpbnQgYmVpc2NzaV9pZl9zZXRfdmxhbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHVpbnQxNl90IHZsYW5fdGFnKQoreworCWludCByYzsKKwl1bnNpZ25lZCBpbnQgdGFnOworCisJdGFnID0gYmVfY21kX3NldF92bGFuKHBoYmEsIHZsYW5fdGFnKTsKKwlpZiAoIXRhZykgeworCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKKwkJCSAgICAoQkVJU0NTSV9MT0dfQ09ORklHIHwgQkVJU0NTSV9MT0dfTUJPWCksCisJCQkgICAgIkJHXyVkIDogVkxBTiBTZXR0aW5nIEZhaWxlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmMgPSBiZWlzY3NpX21jY3FfY29tcGxfd2FpdChwaGJhLCB0YWcsIE5VTEwsIE5VTEwpOworCWlmIChyYykgeworCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKKwkJCSAgICAoQkVJU0NTSV9MT0dfQ09ORklHIHwgQkVJU0NTSV9MT0dfTUJPWCksCisJCQkgICAgIkJTXyVkIDogVkxBTiBNQlggQ21kIEZhaWxlZFxuIik7CisJCXJldHVybiByYzsKKwl9CisJcmV0dXJuIHJjOworfQorCisKK2ludCBiZWlzY3NpX2lmX2dldF9pbmZvKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgaW50IGlwX3R5cGUsCisJCQlzdHJ1Y3QgYmVfY21kX2dldF9pZl9pbmZvX3Jlc3AgKippZl9pbmZvKQogewogCXN0cnVjdCBiZV9jbWRfZ2V0X2lmX2luZm9fcmVxICpyZXE7CiAJc3RydWN0IGJlX2RtYV9tZW0gbm9uZW1iX2NtZDsKIAl1aW50MzJfdCBpb2N0bF9zaXplID0gc2l6ZW9mKHN0cnVjdCBiZV9jbWRfZ2V0X2lmX2luZm9fcmVzcCk7CiAJaW50IHJjOwogCi0JcmMgPSBtZ210X2dldF9hbGxfaWZfaWQocGhiYSk7CisJcmMgPSBiZWlzY3NpX2lmX2dldF9oYW5kbGUocGhiYSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTEzNjQsMTIzICs4NzcsMzE3IEBACiAJcmV0dXJuIHRhZzsKIH0KIAorc3RhdGljIHZvaWQgYmVpc2NzaV9ib290X3Byb2Nlc3NfY29tcGwoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFnKQoreworCXN0cnVjdCBiZV9jbWRfZ2V0X2Jvb3RfdGFyZ2V0X3Jlc3AgKmJvb3RfcmVzcDsKKwlzdHJ1Y3QgYmVfY21kX3Jlc3BfbG9nb3V0X2Z3X3Nlc3MgKmxvZ29fcmVzcDsKKwlzdHJ1Y3QgYmVfY21kX2dldF9zZXNzaW9uX3Jlc3AgKnNlc3NfcmVzcDsKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOworCXN0cnVjdCBib290X3N0cnVjdCAqYnM7CisJaW50IGJvb3Rfd29yaywgc3RhdHVzOworCisJaWYgKCF0ZXN0X2JpdChCRUlTQ1NJX0hCQV9CT09UX1dPUkssICZwaGJhLT5zdGF0ZSkpIHsKKwkJX19iZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKKwkJCSAgICAgICJCR18lZCA6ICVzIG5vIGJvb3Qgd29yayAlbHhcbiIsCisJCQkgICAgICBfX2Z1bmNfXywgcGhiYS0+c3RhdGUpOworCQlyZXR1cm47CisJfQorCisJaWYgKHBoYmEtPmJvb3Rfc3RydWN0LnRhZyAhPSB0YWcpIHsKKwkJX19iZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKKwkJCSAgICAgICJCR18lZCA6ICVzIHRhZyBtaXNtYXRjaCAlZDolZFxuIiwKKwkJCSAgICAgIF9fZnVuY19fLCB0YWcsIHBoYmEtPmJvb3Rfc3RydWN0LnRhZyk7CisJCXJldHVybjsKKwl9CisJYnMgPSAmcGhiYS0+Ym9vdF9zdHJ1Y3Q7CisJYm9vdF93b3JrID0gMTsKKwlzdGF0dXMgPSAwOworCXN3aXRjaCAoYnMtPmFjdGlvbikgeworCWNhc2UgQkVJU0NTSV9CT09UX1JFT1BFTl9TRVNTOgorCQlzdGF0dXMgPSBfX2JlaXNjc2lfbWNjX2NvbXBsX3N0YXR1cyhwaGJhLCB0YWcsIE5VTEwsIE5VTEwpOworCQlpZiAoIXN0YXR1cykKKwkJCWJzLT5hY3Rpb24gPSBCRUlTQ1NJX0JPT1RfR0VUX1NIQU5ETEU7CisJCWVsc2UKKwkJCWJzLT5yZXRyeS0tOworCQlicmVhazsKKwljYXNlIEJFSVNDU0lfQk9PVF9HRVRfU0hBTkRMRToKKwkJc3RhdHVzID0gX19iZWlzY3NpX21jY19jb21wbF9zdGF0dXMocGhiYSwgdGFnLCAmd3JiLCBOVUxMKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWJvb3RfcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwkJCWJzLT5zX2hhbmRsZSA9IGJvb3RfcmVzcC0+Ym9vdF9zZXNzaW9uX2hhbmRsZTsKKwkJfQorCQlpZiAoYnMtPnNfaGFuZGxlID09IEJFX0JPT1RfSU5WQUxJRF9TSEFORExFKSB7CisJCQlicy0+YWN0aW9uID0gQkVJU0NTSV9CT09UX1JFT1BFTl9TRVNTOworCQkJYnMtPnJldHJ5LS07CisJCX0gZWxzZSB7CisJCQlicy0+YWN0aW9uID0gQkVJU0NTSV9CT09UX0dFVF9TSU5GTzsKKwkJfQorCQlicmVhazsKKwljYXNlIEJFSVNDU0lfQk9PVF9HRVRfU0lORk86CisJCXN0YXR1cyA9IF9fYmVpc2NzaV9tY2NfY29tcGxfc3RhdHVzKHBoYmEsIHRhZywgTlVMTCwKKwkJCQkJCSAgICAmYnMtPm5vbmVtYl9jbWQpOworCQlpZiAoIXN0YXR1cykgeworCQkJc2Vzc19yZXNwID0gYnMtPm5vbmVtYl9jbWQudmE7CisJCQltZW1jcHkoJmJzLT5ib290X3Nlc3MsICZzZXNzX3Jlc3AtPnNlc3Npb25faW5mbywKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IG1nbXRfc2Vzc2lvbl9pbmZvKSk7CisJCQlicy0+YWN0aW9uID0gQkVJU0NTSV9CT09UX0xPR09VVF9TRVNTOworCQl9IGVsc2UgeworCQkJX19iZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKKwkJCQkgICAgICAiQkdfJWQgOiBnZXQgYm9vdCBzZXNzaW9uIGluZm8gZXJyb3IgOiAweCV4XG4iLAorCQkJCSAgICAgIHN0YXR1cyk7CisJCQlib290X3dvcmsgPSAwOworCQl9CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGhiYS0+Y3RybC5wZGV2LCBicy0+bm9uZW1iX2NtZC5zaXplLAorCQkJCSAgICBicy0+bm9uZW1iX2NtZC52YSwgYnMtPm5vbmVtYl9jbWQuZG1hKTsKKwkJYnMtPm5vbmVtYl9jbWQudmEgPSBOVUxMOworCQlicmVhazsKKwljYXNlIEJFSVNDU0lfQk9PVF9MT0dPVVRfU0VTUzoKKwkJc3RhdHVzID0gX19iZWlzY3NpX21jY19jb21wbF9zdGF0dXMocGhiYSwgdGFnLCAmd3JiLCBOVUxMKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWxvZ29fcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwkJCWlmIChsb2dvX3Jlc3AtPnNlc3Npb25fc3RhdHVzICE9IEJFX1NFU1NfU1RBVFVTX0NMT1NFKSB7CisJCQkJX19iZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKKwkJCQkJICAgICAgIkJHXyVkIDogRlcgYm9vdCBzZXNzaW9uIGxvZ291dCBlcnJvciA6IDB4JXhcbiIsCisJCQkJCSAgICAgIGxvZ29fcmVzcC0+c2Vzc2lvbl9zdGF0dXMpOworCQkJfQorCQl9CisJCS8qIGNvbnRpbnVlIHRvIGNyZWF0ZSBib290X2tzZXQgZXZlbiBpZiBsb2dvdXQgZmFpbGVkPyAqLworCQlicy0+YWN0aW9uID0gQkVJU0NTSV9CT09UX0NSRUFURV9LU0VUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBjbGVhciB0aGUgdGFnIHNvIG5vIG90aGVyIGNvbXBsZXRpb24gbWF0Y2hlcyB0aGlzIHRhZyAqLworCWJzLT50YWcgPSAwOworCWlmICghYnMtPnJldHJ5KSB7CisJCWJvb3Rfd29yayA9IDA7CisJCV9fYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCisJCQkgICAgICAiQkdfJWQgOiBmYWlsZWQgdG8gc2V0dXAgYm9vdCB0YXJnZXQ6IHN0YXR1cyAlZCBhY3Rpb24gJWRcbiIsCisJCQkgICAgICBzdGF0dXMsIGJzLT5hY3Rpb24pOworCX0KKwlpZiAoIWJvb3Rfd29yaykgeworCQkvKiB3YWl0IGZvciBuZXh0IGV2ZW50IHRvIHN0YXJ0IGJvb3Rfd29yayAqLworCQljbGVhcl9iaXQoQkVJU0NTSV9IQkFfQk9PVF9XT1JLLCAmcGhiYS0+c3RhdGUpOworCQlyZXR1cm47CisJfQorCXNjaGVkdWxlX3dvcmsoJnBoYmEtPmJvb3Rfd29yayk7Cit9CisKIC8qKgotICogYmVfbWdtdF9nZXRfYm9vdF9zaGFuZGxlKCktIEdldCB0aGUgc2Vzc2lvbiBoYW5kbGUKKyAqIGJlaXNjc2lfYm9vdF9sb2dvdXRfc2VzcygpLSBMb2dvdXQgZnJvbSBib290IEZXIHNlc3Npb24KKyAqIEBwaGJhOiBEZXZpY2UgcHJpdiBzdHJ1Y3R1cmUgaW5zdGFuY2UKKyAqCisgKiByZXR1cm4KKyAqCXRoZSBUQUcgdXNlZCBmb3IgTUJPWCBDb21tYW5kCisgKgorICovCit1bnNpZ25lZCBpbnQgYmVpc2NzaV9ib290X2xvZ291dF9zZXNzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7CisJc3RydWN0IGJlX21jY193cmIgKndyYjsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9sb2dvdXRfZndfc2VzcyAqcmVxOworCXVuc2lnbmVkIGludCB0YWc7CisKKwltdXRleF9sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCXdyYiA9IGFsbG9jX21jY193cmIocGhiYSwgJnRhZyk7CisJaWYgKCF3cmIpIHsKKwkJbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXEgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7CisJYmVfd3JiX2hkcl9wcmVwYXJlKHdyYiwgc2l6ZW9mKCpyZXEpLCB0cnVlLCAwKTsKKwliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0lTQ1NJX0lOSSwKKwkJCSAgIE9QQ09ERV9JU0NTSV9JTklfU0VTU0lPTl9MT0dPVVRfVEFSR0VULAorCQkJICAgc2l6ZW9mKHN0cnVjdCBiZV9jbWRfcmVxX2xvZ291dF9md19zZXNzKSk7CisJLyogVXNlIHRoZSBzZXNzaW9uIGhhbmRsZSBjb3BpZWQgaW50byBib290X3Nlc3MgKi8KKwlyZXEtPnNlc3Npb25faGFuZGxlID0gcGhiYS0+Ym9vdF9zdHJ1Y3QuYm9vdF9zZXNzLnNlc3Npb25faGFuZGxlOworCisJcGhiYS0+Ym9vdF9zdHJ1Y3QudGFnID0gdGFnOworCXNldF9iaXQoTUNDX1RBR19TVEFURV9BU1lOQywgJmN0cmwtPnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUpOworCWN0cmwtPnB0YWdfc3RhdGVbdGFnXS5jYmZuID0gYmVpc2NzaV9ib290X3Byb2Nlc3NfY29tcGw7CisKKwliZV9tY2Nfbm90aWZ5KHBoYmEsIHRhZyk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCisJcmV0dXJuIHRhZzsKK30KKy8qKgorICogYmVpc2NzaV9ib290X3Jlb3Blbl9zZXNzKCktIFJlb3BlbiBib290IHNlc3Npb24KKyAqIEBwaGJhOiBEZXZpY2UgcHJpdiBzdHJ1Y3R1cmUgaW5zdGFuY2UKKyAqCisgKiByZXR1cm4KKyAqCXRoZSBUQUcgdXNlZCBmb3IgTUJPWCBDb21tYW5kCisgKgorICoqLwordW5zaWduZWQgaW50IGJlaXNjc2lfYm9vdF9yZW9wZW5fc2VzcyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpCit7CisJc3RydWN0IGJlX2N0cmxfaW5mbyAqY3RybCA9ICZwaGJhLT5jdHJsOworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CisJc3RydWN0IGJlX2NtZF9yZW9wZW5fc2Vzc2lvbl9yZXEgKnJlcTsKKwl1bnNpZ25lZCBpbnQgdGFnOworCisJbXV0ZXhfbG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwl3cmIgPSBhbGxvY19tY2Nfd3JiKHBoYmEsICZ0YWcpOworCWlmICghd3JiKSB7CisJCW11dGV4X3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCk7CisJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9JU0NTSV9JTkksCisJCQkgICBPUENPREVfSVNDU0lfSU5JX0RSSVZFUl9SRU9QRU5fQUxMX1NFU1NJT05TLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBiZV9jbWRfcmVvcGVuX3Nlc3Npb25fcmVzcCkpOworCXJlcS0+cmVvcGVuX3R5cGUgPSBCRV9SRU9QRU5fQk9PVF9TRVNTSU9OUzsKKwlyZXEtPnNlc3Npb25faGFuZGxlID0gQkVfQk9PVF9JTlZBTElEX1NIQU5ETEU7CisKKwlwaGJhLT5ib290X3N0cnVjdC50YWcgPSB0YWc7CisJc2V0X2JpdChNQ0NfVEFHX1NUQVRFX0FTWU5DLCAmY3RybC0+cHRhZ19zdGF0ZVt0YWddLnRhZ19zdGF0ZSk7CisJY3RybC0+cHRhZ19zdGF0ZVt0YWddLmNiZm4gPSBiZWlzY3NpX2Jvb3RfcHJvY2Vzc19jb21wbDsKKworCWJlX21jY19ub3RpZnkocGhiYSwgdGFnKTsKKwltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJcmV0dXJuIHRhZzsKK30KKworCisvKioKKyAqIGJlaXNjc2lfYm9vdF9nZXRfc2luZm8oKS0gR2V0IGJvb3Qgc2Vzc2lvbiBpbmZvCisgKiBAcGhiYTogZGV2aWNlIHByaXYgc3RydWN0dXJlIGluc3RhbmNlCisgKgorICogRmV0Y2hlcyB0aGUgYm9vdF9zdHJ1Y3Quc19oYW5kbGUgaW5mbyBmcm9tIEZXLgorICogcmV0dXJuCisgKgl0aGUgVEFHIHVzZWQgZm9yIE1CT1ggQ29tbWFuZAorICoKKyAqKi8KK3Vuc2lnbmVkIGludCBiZWlzY3NpX2Jvb3RfZ2V0X3NpbmZvKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSkKK3sKKwlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7CisJc3RydWN0IGJlX2NtZF9nZXRfc2Vzc2lvbl9yZXNwICpyZXNwOworCXN0cnVjdCBiZV9jbWRfZ2V0X3Nlc3Npb25fcmVxICpyZXE7CisJc3RydWN0IGJlX2RtYV9tZW0gKm5vbmVtYl9jbWQ7CisJc3RydWN0IGJlX21jY193cmIgKndyYjsKKwlzdHJ1Y3QgYmVfc2dlICpzZ2U7CisJdW5zaWduZWQgaW50IHRhZzsKKworCW11dGV4X2xvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJd3JiID0gYWxsb2NfbWNjX3dyYihwaGJhLCAmdGFnKTsKKwlpZiAoIXdyYikgeworCQltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCW5vbmVtYl9jbWQgPSAmcGhiYS0+Ym9vdF9zdHJ1Y3Qubm9uZW1iX2NtZDsKKwlub25lbWJfY21kLT5zaXplID0gc2l6ZW9mKCpyZXNwKTsKKwlub25lbWJfY21kLT52YSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBoYmEtPmN0cmwucGRldiwKKwkJCQkJICAgICAgc2l6ZW9mKG5vbmVtYl9jbWQtPnNpemUpLAorCQkJCQkgICAgICAmbm9uZW1iX2NtZC0+ZG1hKTsKKwlpZiAoIW5vbmVtYl9jbWQtPnZhKSB7CisJCW11dGV4X3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVxID0gbm9uZW1iX2NtZC0+dmE7CisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKKwlzZ2UgPSBub25lbWJlZGRlZF9zZ2wod3JiKTsKKwliZV93cmJfaGRyX3ByZXBhcmUod3JiLCBzaXplb2YoKnJlcSksIGZhbHNlLCAxKTsKKwliZV9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0lTQ1NJX0lOSSwKKwkJCSAgIE9QQ09ERV9JU0NTSV9JTklfU0VTU0lPTl9HRVRfQV9TRVNTSU9OLAorCQkJICAgc2l6ZW9mKCpyZXNwKSk7CisJcmVxLT5zZXNzaW9uX2hhbmRsZSA9IHBoYmEtPmJvb3Rfc3RydWN0LnNfaGFuZGxlOworCXNnZS0+cGFfaGkgPSBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKG5vbmVtYl9jbWQtPmRtYSkpOworCXNnZS0+cGFfbG8gPSBjcHVfdG9fbGUzMihub25lbWJfY21kLT5kbWEgJiAweEZGRkZGRkZGKTsKKwlzZ2UtPmxlbiA9IGNwdV90b19sZTMyKG5vbmVtYl9jbWQtPnNpemUpOworCisJcGhiYS0+Ym9vdF9zdHJ1Y3QudGFnID0gdGFnOworCXNldF9iaXQoTUNDX1RBR19TVEFURV9BU1lOQywgJmN0cmwtPnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUpOworCWN0cmwtPnB0YWdfc3RhdGVbdGFnXS5jYmZuID0gYmVpc2NzaV9ib290X3Byb2Nlc3NfY29tcGw7CisKKwliZV9tY2Nfbm90aWZ5KHBoYmEsIHRhZyk7CisJbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOworCXJldHVybiB0YWc7Cit9CisKK3Vuc2lnbmVkIGludCBfX2JlaXNjc2lfYm9vdF9nZXRfc2hhbmRsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIGludCBhc3luYykKK3sKKwlzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsID0gJnBoYmEtPmN0cmw7CisJc3RydWN0IGJlX21jY193cmIgKndyYjsKKwlzdHJ1Y3QgYmVfY21kX2dldF9ib290X3RhcmdldF9yZXEgKnJlcTsKKwl1bnNpZ25lZCBpbnQgdGFnOworCisJbXV0ZXhfbG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwl3cmIgPSBhbGxvY19tY2Nfd3JiKHBoYmEsICZ0YWcpOworCWlmICghd3JiKSB7CisJCW11dGV4X3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCk7CisJYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9JU0NTSV9JTkksCisJCQkgICBPUENPREVfSVNDU0lfSU5JX0JPT1RfR0VUX0JPT1RfVEFSR0VULAorCQkJICAgc2l6ZW9mKHN0cnVjdCBiZV9jbWRfZ2V0X2Jvb3RfdGFyZ2V0X3Jlc3ApKTsKKworCWlmIChhc3luYykgeworCQlwaGJhLT5ib290X3N0cnVjdC50YWcgPSB0YWc7CisJCXNldF9iaXQoTUNDX1RBR19TVEFURV9BU1lOQywgJmN0cmwtPnB0YWdfc3RhdGVbdGFnXS50YWdfc3RhdGUpOworCQljdHJsLT5wdGFnX3N0YXRlW3RhZ10uY2JmbiA9IGJlaXNjc2lfYm9vdF9wcm9jZXNzX2NvbXBsOworCX0KKworCWJlX21jY19ub3RpZnkocGhiYSwgdGFnKTsKKwltdXRleF91bmxvY2soJmN0cmwtPm1ib3hfbG9jayk7CisJcmV0dXJuIHRhZzsKK30KKworLyoqCisgKiBiZWlzY3NpX2Jvb3RfZ2V0X3NoYW5kbGUoKS0gR2V0IGJvb3Qgc2Vzc2lvbiBoYW5kbGUKICAqIEBwaGJhOiBkZXZpY2UgcHJpdiBzdHJ1Y3R1cmUgaW5zdGFuY2UKICAqIEBzX2hhbmRsZTogc2Vzc2lvbiBoYW5kbGUgcmV0dXJuZWQgZm9yIGJvb3Qgc2Vzc2lvbi4KICAqCi0gKiBHZXQgdGhlIGJvb3QgdGFyZ2V0IHNlc3Npb24gaGFuZGxlLiBJbiBjYXNlIG9mCi0gKiBjcmFzaGR1bXAgbW9kZSBkcml2ZXIgaGFzIHRvIGlzc3VlIGFuZCBNQlggQ21kCi0gKiBmb3IgRlcgdG8gbG9naW4gdG8gYm9vdCB0YXJnZXQKLSAqCiAgKiByZXR1cm4KLSAqCVN1Y2Nlc3M6IDAKLSAqCUZhaWx1cmU6IE5vbi1aZXJvIHZhbHVlCisgKglTdWNjZXNzOiAxCisgKglGYWlsdXJlOiBuZWdhdGl2ZQogICoKICAqKi8KLWludCBiZV9tZ210X2dldF9ib290X3NoYW5kbGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAotCQkJICAgICAgdW5zaWduZWQgaW50ICpzX2hhbmRsZSkKK2ludCBiZWlzY3NpX2Jvb3RfZ2V0X3NoYW5kbGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1bnNpZ25lZCBpbnQgKnNfaGFuZGxlKQogewogCXN0cnVjdCBiZV9jbWRfZ2V0X2Jvb3RfdGFyZ2V0X3Jlc3AgKmJvb3RfcmVzcDsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCXVuc2lnbmVkIGludCB0YWc7Ci0JdWludDhfdCBib290X3JldHJ5ID0gMzsKIAlpbnQgcmM7CiAKLQlkbyB7Ci0JCS8qIEdldCB0aGUgQm9vdCBUYXJnZXQgU2Vzc2lvbiBIYW5kbGUgYW5kIENvdW50Ki8KLQkJdGFnID0gbWdtdF9nZXRfYm9vdF90YXJnZXQocGhiYSk7Ci0JCWlmICghdGFnKSB7Ci0JCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKLQkJCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHIHwgQkVJU0NTSV9MT0dfSU5JVCwKLQkJCQkgICAgIkJHXyVkIDogR2V0dGluZyBCb290IFRhcmdldCBJbmZvIEZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCi0JCXJjID0gYmVpc2NzaV9tY2NxX2NvbXBsX3dhaXQocGhiYSwgdGFnLCAmd3JiLCBOVUxMKTsKLQkJaWYgKHJjKSB7Ci0JCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKLQkJCQkgICAgQkVJU0NTSV9MT0dfSU5JVCB8IEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCQkgICAgIkJHXyVkIDogTUJYIENNRCBnZXRfYm9vdF90YXJnZXQgRmFpbGVkXG4iKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQotCQlib290X3Jlc3AgPSBlbWJlZGRlZF9wYXlsb2FkKHdyYik7Ci0KLQkJLyogQ2hlY2sgaWYgdGhlIHRoZXJlIGFyZSBhbnkgQm9vdCB0YXJnZXRzIGNvbmZpZ3VyZWQgKi8KLQkJaWYgKCFib290X3Jlc3AtPmJvb3Rfc2Vzc2lvbl9jb3VudCkgewotCQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLAotCQkJCSAgICBCRUlTQ1NJX0xPR19JTklUIHwgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJCSAgICAiQkdfJWQgIDtObyBib290IHRhcmdldHMgY29uZmlndXJlZFxuIik7Ci0JCQlyZXR1cm4gLUVOWElPOwotCQl9Ci0KLQkJLyogRlcgcmV0dXJucyB0aGUgc2Vzc2lvbiBoYW5kbGUgb2YgdGhlIGJvb3Qgc2Vzc2lvbiAqLwotCQlpZiAoYm9vdF9yZXNwLT5ib290X3Nlc3Npb25faGFuZGxlICE9IElOVkFMSURfU0VTU19IQU5ETEUpIHsKLQkJCSpzX2hhbmRsZSA9IGJvb3RfcmVzcC0+Ym9vdF9zZXNzaW9uX2hhbmRsZTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJLyogSXNzdWUgTUJYIENtZCB0byBGVyB0byBsb2dpbiB0byB0aGUgYm9vdCB0YXJnZXQgKi8KLQkJdGFnID0gbWdtdF9yZW9wZW5fc2Vzc2lvbihwaGJhLCBCRV9SRU9QRU5fQk9PVF9TRVNTSU9OUywKLQkJCQkJICBJTlZBTElEX1NFU1NfSEFORExFKTsKLQkJaWYgKCF0YWcpIHsKLQkJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAotCQkJCSAgICBCRUlTQ1NJX0xPR19JTklUIHwgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJCSAgICAiQkdfJWQgOiBtZ210X3Jlb3Blbl9zZXNzaW9uIEZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCi0JCXJjID0gYmVpc2NzaV9tY2NxX2NvbXBsX3dhaXQocGhiYSwgdGFnLCBOVUxMLCBOVUxMKTsKLQkJaWYgKHJjKSB7Ci0JCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKLQkJCQkgICAgQkVJU0NTSV9MT0dfSU5JVCB8IEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCQkgICAgIkJHXyVkIDogbWdtdF9yZW9wZW5fc2Vzc2lvbiBGYWlsZWQiKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0gd2hpbGUgKC0tYm9vdF9yZXRyeSk7Ci0KLQkvKiBDb3VsZG4ndCBsb2cgaW50byB0aGUgYm9vdCB0YXJnZXQgKi8KLQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKLQkJICAgIEJFSVNDU0lfTE9HX0lOSVQgfCBCRUlTQ1NJX0xPR19DT05GSUcsCi0JCSAgICAiQkdfJWQgOiBMb2dpbiB0byBCb290IFRhcmdldCBGYWlsZWRcbiIpOwotCXJldHVybiAtRU5YSU87Ci19Ci0KLS8qKgotICogbWdtdF9zZXRfdmxhbigpLSBJc3N1ZSBhbmQgd2FpdCBmb3IgQ01EIGNvbXBsZXRpb24KLSAqIEBwaGJhOiBkZXZpY2UgcHJpdmF0ZSBzdHJ1Y3R1cmUgaW5zdGFuY2UKLSAqIEB2bGFuX3RhZzogVkxBTiB0YWcKLSAqCi0gKiBJc3N1ZSB0aGUgTUJYIENtZCBhbmQgd2FpdCBmb3IgdGhlIGNvbXBsZXRpb24gb2YgdGhlCi0gKiBjb21tYW5kLgotICoKLSAqIHJldHVybnMKLSAqCVN1Y2Nlc3M6IDAKLSAqCUZhaWx1cmU6IE5vbi1YZXJvIFZhbHVlCi0gKiovCi1pbnQgbWdtdF9zZXRfdmxhbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCSAgIHVpbnQxNl90IHZsYW5fdGFnKQotewotCWludCByYzsKLQl1bnNpZ25lZCBpbnQgdGFnOwotCi0JdGFnID0gYmVfY21kX3NldF92bGFuKHBoYmEsIHZsYW5fdGFnKTsKKwkqc19oYW5kbGUgPSBCRV9CT09UX0lOVkFMSURfU0hBTkRMRTsKKwkvKiBnZXQgY29uZmlndXJlZCBib290IHNlc3Npb24gY291bnQgYW5kIGhhbmRsZSAqLworCXRhZyA9IF9fYmVpc2NzaV9ib290X2dldF9zaGFuZGxlKHBoYmEsIDApOwogCWlmICghdGFnKSB7CiAJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAotCQkJICAgIChCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19NQk9YKSwKLQkJCSAgICAiQkdfJWQgOiBWTEFOIFNldHRpbmcgRmFpbGVkXG4iKTsKKwkJCSAgICBCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19JTklULAorCQkJICAgICJCR18lZCA6IEdldHRpbmcgQm9vdCBUYXJnZXQgSW5mbyBGYWlsZWRcbiIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlyYyA9IGJlaXNjc2lfbWNjcV9jb21wbF93YWl0KHBoYmEsIHRhZywgJndyYiwgTlVMTCk7CisJaWYgKHJjKSB7CisJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAorCQkJICAgIEJFSVNDU0lfTE9HX0lOSVQgfCBCRUlTQ1NJX0xPR19DT05GSUcsCisJCQkgICAgIkJHXyVkIDogTUJYIENNRCBnZXRfYm9vdF90YXJnZXQgRmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQlyYyA9IGJlaXNjc2lfbWNjcV9jb21wbF93YWl0KHBoYmEsIHRhZywgTlVMTCwgTlVMTCk7Ci0JaWYgKHJjKSB7Ci0JCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fRVJSLAotCQkJICAgIChCRUlTQ1NJX0xPR19DT05GSUcgfCBCRUlTQ1NJX0xPR19NQk9YKSwKLQkJCSAgICAiQlNfJWQgOiBWTEFOIE1CWCBDbWQgRmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJjOworCWJvb3RfcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKwkvKiBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGJvb3QgdGFyZ2V0cyBjb25maWd1cmVkICovCisJaWYgKCFib290X3Jlc3AtPmJvb3Rfc2Vzc2lvbl9jb3VudCkgeworCQlfX2JlaXNjc2lfbG9nKHBoYmEsIEtFUk5fSU5GTywKKwkJCSAgICAgICJCR18lZCA6IE5vIGJvb3QgdGFyZ2V0cyBjb25maWd1cmVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKIAl9Ci0JcmV0dXJuIHJjOworCisJLyogb25seSBpZiBGVyBoYXMgbG9nZ2VkIGluIHRvIHRoZSBib290IHRhcmdldCwgc19oYW5kbGUgaXMgdmFsaWQgKi8KKwkqc19oYW5kbGUgPSBib290X3Jlc3AtPmJvb3Rfc2Vzc2lvbl9oYW5kbGU7CisJcmV0dXJuIDE7CiB9CiAKIC8qKgpAQCAtMTY0NSw3ICsxMzUyLDYgQEAKIHsKIAlzdHJ1Y3QgaXNjc2lfd3JiICpwd3JiID0gcHdyYl9oYW5kbGUtPnB3cmI7CiAKLQltZW1zZXQocHdyYiwgMCwgc2l6ZW9mKCpwd3JiKSk7CiAJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9pc2NzaV90YXJnZXRfY29udGV4dF91cGRhdGVfd3JiLAogCQkgICAgICBtYXhfc2VuZF9kYXRhX3NlZ21lbnRfbGVuZ3RoLCBwd3JiLAogCQkgICAgICBwYXJhbXMtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2JlaXNjc2lfb2ZmbG9hZF9wYXJhbXMsCkBAIC0xNzE3LDggKzE0MjMsNiBAQAogewogCXN0cnVjdCBpc2NzaV93cmIgKnB3cmIgPSBwd3JiX2hhbmRsZS0+cHdyYjsKIAotCW1lbXNldChwd3JiLCAwLCBzaXplb2YoKnB3cmIpKTsKLQogCUFNQVBfU0VUX0JJVFMoc3RydWN0IGFtYXBfaXNjc2lfdGFyZ2V0X2NvbnRleHRfdXBkYXRlX3dyYl92MiwKIAkJICAgICAgbWF4X2J1cnN0X2xlbmd0aCwgcHdyYiwgcGFyYW1zLT5kd1tvZmZzZXRvZgogCQkgICAgICAoc3RydWN0IGFtYXBfYmVpc2NzaV9vZmZsb2FkX3BhcmFtcywKQEAgLTE3OTAsNzAgKzE0OTQsMyBAQAogCQkgICAgIChwYXJhbXMtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2JlaXNjc2lfb2ZmbG9hZF9wYXJhbXMsCiAJCSAgICAgIGV4cF9zdGF0c24pIC8gMzJdICsgMSkpOwogfQotCi0vKioKLSAqIGJlaXNjc2lfbG9nb3V0X2Z3X3Nlc3MoKS0gRmlybXdhcmUgU2Vzc2lvbiBMb2dvdXQKLSAqIEBwaGJhOiBEZXZpY2UgcHJpdiBzdHJ1Y3R1cmUgaW5zdGFuY2UKLSAqIEBmd19zZXNzX2hhbmRsZTogRlcgc2Vzc2lvbiBoYW5kbGUKLSAqCi0gKiBMb2dvdXQgZnJvbSB0aGUgRlcgZXN0YWJsaXNoZWQgc2Vzc2lvbnMuCi0gKiByZXR1cm5zCi0gKiAgU3VjY2VzczogMAotICogIEZhaWx1cmU6IE5vbi1aZXJvIFZhbHVlCi0gKgotICovCi1pbnQgYmVpc2NzaV9sb2dvdXRfZndfc2VzcyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCXVpbnQzMl90IGZ3X3Nlc3NfaGFuZGxlKQotewotCXN0cnVjdCBiZV9jdHJsX2luZm8gKmN0cmwgPSAmcGhiYS0+Y3RybDsKLQlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwotCXN0cnVjdCBiZV9jbWRfcmVxX2xvZ291dF9md19zZXNzICpyZXE7Ci0Jc3RydWN0IGJlX2NtZF9yZXNwX2xvZ291dF9md19zZXNzICpyZXNwOwotCXVuc2lnbmVkIGludCB0YWc7Ci0JaW50IHJjOwotCi0JYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLAotCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHIHwgQkVJU0NTSV9MT0dfTUJPWCwKLQkJICAgICJCR18lZCA6IEluIGJlc2NzaV9sb2dvdXRfZndib290X3Nlc3NcbiIpOwotCi0JbXV0ZXhfbG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQl3cmIgPSBhbGxvY19tY2Nfd3JiKHBoYmEsICZ0YWcpOwotCWlmICghd3JiKSB7Ci0JCW11dGV4X3VubG9jaygmY3RybC0+bWJveF9sb2NrKTsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9JTkZPLAotCQkJICAgIEJFSVNDU0lfTE9HX0NPTkZJRyB8IEJFSVNDU0lfTE9HX01CT1gsCi0JCQkgICAgIkJHXyVkIDogTUJYIFRhZyBGYWlsdXJlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwotCWJlX3dyYl9oZHJfcHJlcGFyZSh3cmIsIHNpemVvZigqcmVxKSwgdHJ1ZSwgMCk7Ci0JYmVfY21kX2hkcl9wcmVwYXJlKCZyZXEtPmhkciwgQ01EX1NVQlNZU1RFTV9JU0NTSV9JTkksCi0JCQkgICBPUENPREVfSVNDU0lfSU5JX1NFU1NJT05fTE9HT1VUX1RBUkdFVCwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgYmVfY21kX3JlcV9sb2dvdXRfZndfc2VzcykpOwotCi0JLyogU2V0IHRoZSBzZXNzaW9uIGhhbmRsZSAqLwotCXJlcS0+c2Vzc2lvbl9oYW5kbGUgPSBmd19zZXNzX2hhbmRsZTsKLQliZV9tY2Nfbm90aWZ5KHBoYmEsIHRhZyk7Ci0JbXV0ZXhfdW5sb2NrKCZjdHJsLT5tYm94X2xvY2spOwotCi0JcmMgPSBiZWlzY3NpX21jY3FfY29tcGxfd2FpdChwaGJhLCB0YWcsICZ3cmIsIE5VTEwpOwotCWlmIChyYykgewotCQliZWlzY3NpX2xvZyhwaGJhLCBLRVJOX0VSUiwKLQkJCSAgICBCRUlTQ1NJX0xPR19JTklUIHwgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJICAgICJCR18lZCA6IE1CWCBDTUQgRldfU0VTU0lPTl9MT0dPVVRfVEFSR0VUIEZhaWxlZFxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKLQlpZiAocmVzcC0+c2Vzc2lvbl9zdGF0dXMgIT0KLQkJQkVJU0NTSV9NR01UX1NFU1NJT05fQ0xPU0UpIHsKLQkJYmVpc2NzaV9sb2cocGhiYSwgS0VSTl9FUlIsCi0JCQkgICAgQkVJU0NTSV9MT0dfSU5JVCB8IEJFSVNDU0lfTE9HX0NPTkZJRywKLQkJCSAgICAiQkdfJWQgOiBGV19TRVNTSU9OX0xPR09VVF9UQVJHRVQgcmVzcCA6IDB4JXhcbiIsCi0JCQkgICAgcmVzcC0+c2Vzc2lvbl9zdGF0dXMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuaCBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tZ210LmgKaW5kZXggZjNhNDhhMC4uYjg5N2NmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21nbXQuaAorKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWdtdC5oCkBAIC0xLDUgKzEsNSBAQAogLyoqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDE1IEVtdWxleAorICogQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAxNiBCcm9hZGNvbQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC03LDEwICs3LDEwIEBACiAgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gIFRoZSBmdWxsIEdOVSBHZW5lcmFsCiAgKiBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KICAqCi0gKiBXcml0dGVuIGJ5OiBKYXlhbW9oYW4gS2FsbGlja2FsIChqYXlhbW9oYW4ua2FsbGlja2FsQGF2YWdvdGVjaC5jb20pCisgKiBXcml0dGVuIGJ5OiBKYXlhbW9oYW4gS2FsbGlja2FsIChqYXlhbW9oYW4ua2FsbGlja2FsQGJyb2FkY29tLmNvbSkKICAqCiAgKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogbGludXgtZHJpdmVyc0BhdmFnb3RlY2guY29tCisgKiBsaW51eC1kcml2ZXJzQGJyb2FkY29tLmNvbQogICoKICAqIEVtdWxleAogICogMzMzMyBTdXNhbiBTdHJlZXQKQEAgLTk2LDcgKzk2LDYgQEAKIAlzdHJ1Y3QgbWNjX3dyYl9wYXlsb2FkIHBheWxvYWQ7CiB9OwogCi1pbnQgbWdtdF9lcGZ3X2NsZWFudXAoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1bnNpZ25lZCBzaG9ydCBjaHV0ZSk7CiBpbnQgbWdtdF9vcGVuX2Nvbm5lY3Rpb24oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQkJIHN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHIsCiAJCQkgc3RydWN0IGJlaXNjc2lfZW5kcG9pbnQgKmJlaXNjc2lfZXAsCkBAIC0yNjYsNTAgKzI2NSw0MSBAQAogCXUxNiBjaWRfdmxkOwogfTsKIAotaW50IG1nbXRfZ2V0X2Z3X2NvbmZpZyhzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAotCQkJCSBzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpOwotaW50IG1nbXRfZ2V0X3BvcnRfbmFtZShzdHJ1Y3QgYmVfY3RybF9pbmZvICpjdHJsLAotCQkgICAgICAgc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKLQogdW5zaWduZWQgaW50IG1nbXRfaW52YWxpZGF0ZV9jb25uZWN0aW9uKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKIAkJCQkJIHN0cnVjdCBiZWlzY3NpX2VuZHBvaW50ICpiZWlzY3NpX2VwLAogCQkJCQkgdW5zaWduZWQgc2hvcnQgY2lkLAogCQkJCQkgdW5zaWduZWQgc2hvcnQgaXNzdWVfcmVzZXQsCiAJCQkJCSB1bnNpZ25lZCBzaG9ydCBzYXZlY2ZnX2ZsYWcpOwogCi1pbnQgbWdtdF9zZXRfaXAoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAotCQlzdHJ1Y3QgaXNjc2lfaWZhY2VfcGFyYW1faW5mbyAqaXBfcGFyYW0sCi0JCXN0cnVjdCBpc2NzaV9pZmFjZV9wYXJhbV9pbmZvICpzdWJuZXRfcGFyYW0sCi0JCXVpbnQzMl90IGJvb3RfcHJvdG8pOworaW50IGJlaXNjc2lfaWZfZW5fZGhjcChzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIHUzMiBpcF90eXBlKTsKIAotdW5zaWduZWQgaW50IG1nbXRfZ2V0X2Jvb3RfdGFyZ2V0KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CitpbnQgYmVpc2NzaV9pZl9lbl9zdGF0aWMoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1MzIgaXBfdHlwZSwKKwkJCSB1OCAqaXAsIHU4ICpzdWJuZXQpOwogCi11bnNpZ25lZCBpbnQgbWdtdF9yZW9wZW5fc2Vzc2lvbihzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCQkJICB1bnNpZ25lZCBpbnQgcmVvcGVuX3R5cGUsCi0JCQkJICB1bnNpZ25lZCBzZXNzX2hhbmRsZSk7CitpbnQgYmVpc2NzaV9pZl9zZXRfZ3coc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1MzIgaXBfdHlwZSwgdTggKmd3KTsKIAotdW5zaWduZWQgaW50IG1nbXRfZ2V0X3Nlc3Npb25faW5mbyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCQkJICAgdTMyIGJvb3Rfc2Vzc2lvbl9oYW5kbGUsCi0JCQkJICAgc3RydWN0IGJlX2RtYV9tZW0gKm5vbmVtYl9jbWQpOworaW50IGJlaXNjc2lfaWZfZ2V0X2d3KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdTMyIGlwX3R5cGUsCisJCSAgICAgIHN0cnVjdCBiZV9jbWRfZ2V0X2RlZl9nYXRld2F5X3Jlc3AgKnJlc3ApOwogCiBpbnQgbWdtdF9nZXRfbmljX2NvbmYoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAogCQkgICAgICBzdHJ1Y3QgYmVfY21kX2dldF9uaWNfY29uZl9yZXNwICptYWMpOwogCi1pbnQgbWdtdF9nZXRfaWZfaW5mbyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIGludCBpcF90eXBlLAotCQkgICAgIHN0cnVjdCBiZV9jbWRfZ2V0X2lmX2luZm9fcmVzcCAqKmlmX2luZm8pOworaW50IGJlaXNjc2lfaWZfZ2V0X2luZm8oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBpbnQgaXBfdHlwZSwKKwkJCXN0cnVjdCBiZV9jbWRfZ2V0X2lmX2luZm9fcmVzcCAqKmlmX2luZm8pOwogCi1pbnQgbWdtdF9nZXRfZ2F0ZXdheShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsIGludCBpcF90eXBlLAotCQkgICAgIHN0cnVjdCBiZV9jbWRfZ2V0X2RlZl9nYXRld2F5X3Jlc3AgKmdhdGV3YXkpOwordW5zaWduZWQgaW50IGJlaXNjc2lfaWZfZ2V0X2hhbmRsZShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpOwogCi1pbnQgbWdtdF9zZXRfZ2F0ZXdheShzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEsCi0JCSAgICAgc3RydWN0IGlzY3NpX2lmYWNlX3BhcmFtX2luZm8gKmdhdGV3YXlfcGFyYW0pOworaW50IGJlaXNjc2lfaWZfc2V0X3ZsYW4oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1aW50MTZfdCB2bGFuX3RhZyk7CiAKLWludCBiZV9tZ210X2dldF9ib290X3NoYW5kbGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLAotCQkJICAgICAgdW5zaWduZWQgaW50ICpzX2hhbmRsZSk7Cit1bnNpZ25lZCBpbnQgYmVpc2NzaV9ib290X2xvZ291dF9zZXNzKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSk7CiAKLXVuc2lnbmVkIGludCBtZ210X2dldF9hbGxfaWZfaWQoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKK3Vuc2lnbmVkIGludCBiZWlzY3NpX2Jvb3RfcmVvcGVuX3Nlc3Moc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKIAotaW50IG1nbXRfc2V0X3ZsYW4oc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCB1aW50MTZfdCB2bGFuX3RhZyk7Cit1bnNpZ25lZCBpbnQgYmVpc2NzaV9ib290X2dldF9zaW5mbyhzdHJ1Y3QgYmVpc2NzaV9oYmEgKnBoYmEpOworCit1bnNpZ25lZCBpbnQgX19iZWlzY3NpX2Jvb3RfZ2V0X3NoYW5kbGUoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhLCBpbnQgYXN5bmMpOworCitpbnQgYmVpc2NzaV9ib290X2dldF9zaGFuZGxlKHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwgdW5zaWduZWQgaW50ICpzX2hhbmRsZSk7CiAKIHNzaXplX3QgYmVpc2NzaV9kcnZyX3Zlcl9kaXNwKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKQEAgLTMzOSw3ICszMjksNiBAQAogCQkJICAgICBzdHJ1Y3Qgd3JiX2hhbmRsZSAqcHdyYl9oYW5kbGUsCiAJCQkgICAgIHN0cnVjdCBod2lfd3JiX2NvbnRleHQgKnB3cmJfY29udGV4dCk7CiAKLXZvaWQgYmVpc2NzaV91ZV9kZXRlY3Qoc3RydWN0IGJlaXNjc2lfaGJhICpwaGJhKTsKIGludCBiZV9jbWRfbW9kaWZ5X2VxX2RlbGF5KHN0cnVjdCBiZWlzY3NpX2hiYSAqcGhiYSwKIAkJCSBzdHJ1Y3QgYmVfc2V0X2VxZCAqLCBpbnQgbnVtKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2xwb3J0LmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYwppbmRleCA3NzMzYWQ1Li40ZGRkYTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYwpAQCAtNTgyNywxMyArNTgyNywxMyBAQAogCWJmYV9wb3J0X3NwZWVkX3QgbWF4X3NwZWVkID0gMDsKIAlzdHJ1Y3QgYmZhX3BvcnRfYXR0cl9zIHBvcnRfYXR0cjsKIAliZmFfcG9ydF9zcGVlZF90IHBvcnRfc3BlZWQsIHJwb3J0X3NwZWVkOwotCWJmYV9ib29sZWFuX3QgdHJsX2VuYWJsZWQgPSBiZmFfZmNwb3J0X2lzX3JhdGVsaW0ocG9ydC0+ZmNzLT5iZmEpOwotCisJYmZhX2Jvb2xlYW5fdCB0cmxfZW5hYmxlZDsKIAogCWlmIChwb3J0ID09IE5VTEwpCiAJCXJldHVybiAwOwogCiAJZmNzID0gcG9ydC0+ZmNzOworCXRybF9lbmFibGVkID0gYmZhX2ZjcG9ydF9pc19yYXRlbGltKHBvcnQtPmZjcy0+YmZhKTsKIAogCS8qIEdldCBQaHlzaWNhbCBwb3J0J3MgY3VycmVudCBzcGVlZCAqLwogCWJmYV9mY3BvcnRfZ2V0X2F0dHIocG9ydC0+ZmNzLT5iZmEsICZwb3J0X2F0dHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZWxzLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYwppbmRleCA1YmVlYTc3Li42OGNhNTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19lbHMuYwpAQCAtMjU0LDcgKzI1NCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi12b2lkIGJueDJmY19zcnJfY29tcGwoc3RydWN0IGJueDJmY19lbHNfY2JfYXJnICpjYl9hcmcpCitzdGF0aWMgdm9pZCBibngyZmNfc3JyX2NvbXBsKHN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyAqY2JfYXJnKQogewogCXN0cnVjdCBibngyZmNfbXBfcmVxICptcF9yZXE7CiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmNfaGRyLCAqZmg7CkBAIC0zNjQsNyArMzY0LDcgQEAKIAlrcmVmX3B1dCgmb3JpZ19pb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOwogfQogCi12b2lkIGJueDJmY19yZWNfY29tcGwoc3RydWN0IGJueDJmY19lbHNfY2JfYXJnICpjYl9hcmcpCitzdGF0aWMgdm9pZCBibngyZmNfcmVjX2NvbXBsKHN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyAqY2JfYXJnKQogewogCXN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcSwgKm5ld19pb19yZXE7CiAJc3RydWN0IGJueDJmY19jbWQgKnJlY19yZXE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMKaW5kZXggYTUwNTJkZC4uZjlkZGI2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYwpAQCAtNjI1LDcgKzYyNSw3IEBACiAgKgogICogQGFyZzoJcHRyIHRvIGJueDJmY19wZXJjcHVfaW5mbyBzdHJ1Y3R1cmUKICAqLwotaW50IGJueDJmY19wZXJjcHVfaW9fdGhyZWFkKHZvaWQgKmFyZykKK3N0YXRpYyBpbnQgYm54MmZjX3BlcmNwdV9pb190aHJlYWQodm9pZCAqYXJnKQogewogCXN0cnVjdCBibngyZmNfcGVyY3B1X3MgKnAgPSBhcmc7CiAJc3RydWN0IGJueDJmY193b3JrICp3b3JrLCAqdG1wOwpAQCAtMTQxMCw5ICsxNDEwLDEwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICpibngyZmNfaW50ZXJmYWNlX2NyZWF0ZShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhLAotCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICAgICAgZW51bSBmaXBfc3RhdGUgZmlwX21vZGUpCitzdGF0aWMgc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKgorYm54MmZjX2ludGVyZmFjZV9jcmVhdGUoc3RydWN0IGJueDJmY19oYmEgKmhiYSwKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQllbnVtIGZpcF9zdGF0ZSBmaXBfbW9kZSkKIHsKIAlzdHJ1Y3QgZmNvZV9jdGxyX2RldmljZSAqY3Rscl9kZXY7CiAJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKQEAgLTI3NjUsOCArMjc2Niw3IEBACiAJICogaGVsZC4KIAkgKi8KIAltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOwotCWxpc3Rfc3BsaWNlKCZhZGFwdGVyX2xpc3QsICZ0b19iZV9kZWxldGVkKTsKLQlJTklUX0xJU1RfSEVBRCgmYWRhcHRlcl9saXN0KTsKKwlsaXN0X3NwbGljZV9pbml0KCZhZGFwdGVyX2xpc3QsICZ0b19iZV9kZWxldGVkKTsKIAlhZGFwdGVyX2NvdW50ID0gMDsKIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaHdpLmMKaW5kZXggMjhjNjcxYi4uNWZmOWY4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaHdpLmMKQEAgLTk5NCw3ICs5OTQsNyBAQAogCiB9CiAKLXN0cnVjdCBibngyZmNfd29yayAqYm54MmZjX2FsbG9jX3dvcmsoc3RydWN0IGJueDJmY19ycG9ydCAqdGd0LCB1MTYgd3FlKQorc3RhdGljIHN0cnVjdCBibngyZmNfd29yayAqYm54MmZjX2FsbG9jX3dvcmsoc3RydWN0IGJueDJmY19ycG9ydCAqdGd0LCB1MTYgd3FlKQogewogCXN0cnVjdCBibngyZmNfd29yayAqd29yazsKIAl3b3JrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJueDJmY193b3JrKSwgR0ZQX0FUT01JQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYwppbmRleCA4ZjI0ZDYwLi5mNTAxMDk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMKQEAgLTEwNzksNyArMTA3OSw3IEBACiAJcmV0dXJuIGJueDJmY19pbml0aWF0ZV90bWYoc2NfY21kLCBGQ1BfVE1GX0xVTl9SRVNFVCk7CiB9CiAKLWludCBibngyZmNfYWJ0c19jbGVhbnVwKHN0cnVjdCBibngyZmNfY21kICppb19yZXEpCitzdGF0aWMgaW50IGJueDJmY19hYnRzX2NsZWFudXAoc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSkKIHsKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBpb19yZXEtPnRndDsKIAlpbnQgcmMgPSBTVUNDRVNTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2NvbnN0YW50cy5jIGIvZHJpdmVycy9zY3NpL2NvbnN0YW50cy5jCmluZGV4IDgzNDU4ZjcuLjZkYzk2YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jb25zdGFudHMuYworKysgYi9kcml2ZXJzL3Njc2kvY29uc3RhbnRzLmMKQEAgLTM2MSw4ICszNjEsOSBAQAogCiAvKiBHZXQgc2Vuc2Uga2V5IHN0cmluZyBvciBOVUxMIGlmIG5vdCBhdmFpbGFibGUgKi8KIGNvbnN0IGNoYXIgKgotc2NzaV9zZW5zZV9rZXlfc3RyaW5nKHVuc2lnbmVkIGNoYXIga2V5KSB7Ci0JaWYgKGtleSA8PSAweEUpCitzY3NpX3NlbnNlX2tleV9zdHJpbmcodW5zaWduZWQgY2hhciBrZXkpCit7CisJaWYgKGtleSA8IEFSUkFZX1NJWkUoc25zdGV4dCkpCiAJCXJldHVybiBzbnN0ZXh0W2tleV07CiAJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3Npb3N0b3IvY3Npb19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvY3Npb3N0b3IvY3Npb19zY3NpLmMKaW5kZXggYzJhNmY5Zi4uODlhNTJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2NzaW9zdG9yL2NzaW9fc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9jc2lvc3Rvci9jc2lvX3Njc2kuYwpAQCAtMTcyMSw3ICsxNzIxLDcgQEAKIAogCS8qIFdha2UgdXAgd2FpdGluZyB0aHJlYWRzICovCiAJY3Npb19zY3NpX2NtbmQocmVxKSA9IE5VTEw7Ci0JY29tcGxldGVfYWxsKCZyZXEtPmNtcGxvYmopOworCWNvbXBsZXRlKCZyZXEtPmNtcGxvYmopOwogfQogCiAvKgpAQCAtMTk0NSw2ICsxOTQ1LDcgQEAKIAlyZWFkeSA9IGNzaW9faXNfbG5vZGVfcmVhZHkobG4pOwogCXRtbyA9IENTSU9fU0NTSV9BQlJUX1RNT19NUzsKIAorCXJlaW5pdF9jb21wbGV0aW9uKCZpb3JlcS0+Y21wbG9iaik7CiAJc3Bpbl9sb2NrX2lycSgmaHctPmxvY2spOwogCXJ2ID0gY3Npb19kb19hYnJ0X2NscyhodywgaW9yZXEsIChyZWFkeSA/IFNDU0lfQUJPUlQgOiBTQ1NJX0NMT1NFKSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZody0+bG9jayk7CkBAIC0xOTY0LDggKzE5NjUsNiBAQAogCQlnb3RvIGludmFsX3NjbW5kOwogCX0KIAotCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQlpbml0X2NvbXBsZXRpb24oJmlvcmVxLT5jbXBsb2JqKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvcmVxLT5jbXBsb2JqLCBtc2Vjc190b19qaWZmaWVzKHRtbykpOwogCiAJLyogRlcgZGlkbnQgcmVzcG9uZCB0byBhYm9ydCB3aXRoaW4gb3VyIHRpbWVvdXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMgYi9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jCmluZGV4IGU0YmEyZDIuLjdjMGQ3YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYwpAQCAtODQsNiArODQsOSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGN4Z2I0X3VsZF9pbmZvIGN4Z2I0aV91bGRfaW5mbyA9IHsKIAkubmFtZSA9IERSVl9NT0RVTEVfTkFNRSwKKwkubnJ4cSA9IE1BWF9VTERfUVNFVFMsCisJLnJ4cV9zaXplID0gMTAyNCwKKwkubHJvID0gZmFsc2UsCiAJLmFkZCA9IHQ0X3VsZF9hZGQsCiAJLnJ4X2hhbmRsZXIgPSB0NF91bGRfcnhfaGFuZGxlciwKIAkuc3RhdGVfY2hhbmdlID0gdDRfdWxkX3N0YXRlX2NoYW5nZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGxmbGFzaC9tYWluLmMgYi9kcml2ZXJzL3Njc2kvY3hsZmxhc2gvbWFpbi5jCmluZGV4IDY2MWJiOTQuLmIzMDE2NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGxmbGFzaC9tYWluLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4bGZsYXNoL21haW4uYwpAQCAtODIzLDE3ICs4MjMsNiBAQAogfQogCiAvKioKLSAqIGN4bGZsYXNoX3NodXRkb3duKCkgLSBzaHV0ZG93biBoYW5kbGVyCi0gKiBAcGRldjoJUENJIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvc3QuCi0gKi8KLXN0YXRpYyB2b2lkIGN4bGZsYXNoX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBjeGxmbGFzaF9jZmcgKmNmZyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCW5vdGlmeV9zaHV0ZG93bihjZmcsIGZhbHNlKTsKLX0KLQotLyoqCiAgKiBjeGxmbGFzaF9yZW1vdmUoKSAtIFBDSSBlbnRyeSBwb2ludCB0byB0ZWFyIGRvd24gaG9zdAogICogQHBkZXY6CVBDSSBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBob3N0LgogICoKQEAgLTg0NCw2ICs4MzMsMTEgQEAKIAlzdHJ1Y3QgY3hsZmxhc2hfY2ZnICpjZmcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJdWxvbmcgbG9ja19mbGFnczsKIAorCWlmICghcGNpX2lzX2VuYWJsZWQocGRldikpIHsKKwkJcHJfZGVidWcoIiVzOiBEZXZpY2UgaXMgZGlzYWJsZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIElmIGEgVGFzayBNYW5hZ2VtZW50IEZ1bmN0aW9uIGlzIGFjdGl2ZSwgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUKIAkgKiBiZWZvcmUgY29udGludWluZyB3aXRoIHJlbW92ZS4KIAkgKi8KQEAgLTEwNDYsNiArMTA0MCw4IEBACiAJZG8gewogCQltc2xlZXAoZGVsYXlfdXMgLyAxMDAwKTsKIAkJc3RhdHVzID0gcmVhZHFfYmUoJmZjX3JlZ3NbRkNfTVRJUF9TVEFUVVMgLyA4XSk7CisJCWlmIChzdGF0dXMgPT0gVTY0X01BWCkKKwkJCW5yZXRyeSAvPSAyOwogCX0gd2hpbGUgKChzdGF0dXMgJiBGQ19NVElQX1NUQVRVU19NQVNLKSAhPSBGQ19NVElQX1NUQVRVU19PTkxJTkUgJiYKIAkJIG5yZXRyeS0tKTsKIApAQCAtMTA3Nyw2ICsxMDczLDggQEAKIAlkbyB7CiAJCW1zbGVlcChkZWxheV91cyAvIDEwMDApOwogCQlzdGF0dXMgPSByZWFkcV9iZSgmZmNfcmVnc1tGQ19NVElQX1NUQVRVUyAvIDhdKTsKKwkJaWYgKHN0YXR1cyA9PSBVNjRfTUFYKQorCQkJbnJldHJ5IC89IDI7CiAJfSB3aGlsZSAoKHN0YXR1cyAmIEZDX01USVBfU1RBVFVTX01BU0spICE9IEZDX01USVBfU1RBVFVTX09GRkxJTkUgJiYKIAkJIG5yZXRyeS0tKTsKIApAQCAtMTA5NSw0MiArMTA5MywyNSBAQAogICogb25saW5lLiBUaGlzIHRvZ2dsaW5nIGFjdGlvbiBjYW4gY2F1c2UgdGhpcyByb3V0aW5lIHRvIGRlbGF5IHVwIHRvIGEgZmV3CiAgKiBzZWNvbmRzLiBXaGVuIGNvbmZpZ3VyZWQgdG8gdXNlIHRoZSBpbnRlcm5hbCBMVU4gZmVhdHVyZSBvZiB0aGUgQUZVLCBhCiAgKiBmYWlsdXJlIHRvIGNvbWUgb25saW5lIGlzIG92ZXJyaWRkZW4uCi0gKgotICogUmV0dXJuOgotICoJMCB3aGVuIHRoZSBXV1BOIGlzIHN1Y2Nlc3NmdWxseSB3cml0dGVuIGFuZCB0aGUgcG9ydCBjb21lcyBiYWNrIG9ubGluZQotICoJLTEgd2hlbiB0aGUgcG9ydCBmYWlscyB0byBnbyBvZmZsaW5lIG9yIGNvbWUgYmFjayB1cCBvbmxpbmUKICAqLwotc3RhdGljIGludCBhZnVfc2V0X3d3cG4oc3RydWN0IGFmdSAqYWZ1LCBpbnQgcG9ydCwgX19iZTY0IF9faW9tZW0gKmZjX3JlZ3MsCi0JCQl1NjQgd3dwbikKK3N0YXRpYyB2b2lkIGFmdV9zZXRfd3dwbihzdHJ1Y3QgYWZ1ICphZnUsIGludCBwb3J0LCBfX2JlNjQgX19pb21lbSAqZmNfcmVncywKKwkJCSB1NjQgd3dwbikKIHsKLQlpbnQgcmMgPSAwOwotCiAJc2V0X3BvcnRfb2ZmbGluZShmY19yZWdzKTsKLQogCWlmICghd2FpdF9wb3J0X29mZmxpbmUoZmNfcmVncywgRkNfUE9SVF9TVEFUVVNfUkVUUllfSU5URVJWQUxfVVMsCiAJCQkgICAgICAgRkNfUE9SVF9TVEFUVVNfUkVUUllfQ05UKSkgewogCQlwcl9kZWJ1ZygiJXM6IHdhaXQgb24gcG9ydCAlZCB0byBnbyBvZmZsaW5lIHRpbWVkIG91dFxuIiwKIAkJCSBfX2Z1bmNfXywgcG9ydCk7Ci0JCXJjID0gLTE7IC8qIGJ1dCBjb250aW51ZSBvbiB0byBsZWF2ZSB0aGUgcG9ydCBiYWNrIG9ubGluZSAqLwogCX0KIAotCWlmIChyYyA9PSAwKQotCQl3cml0ZXFfYmUod3dwbiwgJmZjX3JlZ3NbRkNfUE5BTUUgLyA4XSk7Ci0KLQkvKiBBbHdheXMgcmV0dXJuIHN1Y2Nlc3MgYWZ0ZXIgcHJvZ3JhbW1pbmcgV1dQTiAqLwotCXJjID0gMDsKKwl3cml0ZXFfYmUod3dwbiwgJmZjX3JlZ3NbRkNfUE5BTUUgLyA4XSk7CiAKIAlzZXRfcG9ydF9vbmxpbmUoZmNfcmVncyk7Ci0KIAlpZiAoIXdhaXRfcG9ydF9vbmxpbmUoZmNfcmVncywgRkNfUE9SVF9TVEFUVVNfUkVUUllfSU5URVJWQUxfVVMsCiAJCQkgICAgICBGQ19QT1JUX1NUQVRVU19SRVRSWV9DTlQpKSB7Ci0JCXByX2VycigiJXM6IHdhaXQgb24gcG9ydCAlZCB0byBnbyBvbmxpbmUgdGltZWQgb3V0XG4iLAotCQkgICAgICAgX19mdW5jX18sIHBvcnQpOworCQlwcl9kZWJ1ZygiJXM6IHdhaXQgb24gcG9ydCAlZCB0byBnbyBvbmxpbmUgdGltZWQgb3V0XG4iLAorCQkJIF9fZnVuY19fLCBwb3J0KTsKIAl9Ci0KLQlwcl9kZWJ1ZygiJXM6IHJldHVybmluZyByYz0lZFxuIiwgX19mdW5jX18sIHJjKTsKLQotCXJldHVybiByYzsKIH0KIAogLyoqCkBAIC0xMTg3LDcgKzExNjgsNyBAQAogCXtTSVNMX0FTVEFUVVNfRkMwX0xPR0lfRiwgImxvZ2luIGZhaWxlZCIsIDAsIENMUl9GQ19FUlJPUn0sCiAJe1NJU0xfQVNUQVRVU19GQzBfTE9HSV9TLCAibG9naW4gc3VjY2VlZGVkIiwgMCwgU0NBTl9IT1NUfSwKIAl7U0lTTF9BU1RBVFVTX0ZDMF9MSU5LX0ROLCAibGluayBkb3duIiwgMCwgMH0sCi0Je1NJU0xfQVNUQVRVU19GQzBfTElOS19VUCwgImxpbmsgdXAiLCAwLCBTQ0FOX0hPU1R9LAorCXtTSVNMX0FTVEFUVVNfRkMwX0xJTktfVVAsICJsaW5rIHVwIiwgMCwgMH0sCiAJe1NJU0xfQVNUQVRVU19GQzFfT1RIRVIsICJvdGhlciBlcnJvciIsIDEsIENMUl9GQ19FUlJPUiB8IExJTktfUkVTRVR9LAogCXtTSVNMX0FTVEFUVVNfRkMxX0xPR08sICJ0YXJnZXQgaW5pdGlhdGVkIExPR08iLCAxLCAwfSwKIAl7U0lTTF9BU1RBVFVTX0ZDMV9DUkNfVCwgIkNSQyB0aHJlc2hvbGQgZXhjZWVkZWQiLCAxLCBMSU5LX1JFU0VUfSwKQEAgLTExOTUsNyArMTE3Niw3IEBACiAJe1NJU0xfQVNUQVRVU19GQzFfTE9HSV9GLCAibG9naW4gZmFpbGVkIiwgMSwgQ0xSX0ZDX0VSUk9SfSwKIAl7U0lTTF9BU1RBVFVTX0ZDMV9MT0dJX1MsICJsb2dpbiBzdWNjZWVkZWQiLCAxLCBTQ0FOX0hPU1R9LAogCXtTSVNMX0FTVEFUVVNfRkMxX0xJTktfRE4sICJsaW5rIGRvd24iLCAxLCAwfSwKLQl7U0lTTF9BU1RBVFVTX0ZDMV9MSU5LX1VQLCAibGluayB1cCIsIDEsIFNDQU5fSE9TVH0sCisJe1NJU0xfQVNUQVRVU19GQzFfTElOS19VUCwgImxpbmsgdXAiLCAxLCAwfSwKIAl7MHgwLCAiIiwgMCwgMH0JCS8qIHRlcm1pbmF0b3IgKi8KIH07CiAKQEAgLTE2MzEsMTUgKzE2MTIsMTAgQEAKIAkJCSAgW0ZDX0NSQ19USFJFU0ggLyA4XSk7CiAKIAkJLyogU2V0IFdXUE5zLiBJZiBhbHJlYWR5IHByb2dyYW1tZWQsIHd3cG5baV0gaXMgMCAqLwotCQlpZiAod3dwbltpXSAhPSAwICYmCi0JCSAgICBhZnVfc2V0X3d3cG4oYWZ1LCBpLAotCQkJCSAmYWZ1LT5hZnVfbWFwLT5nbG9iYWwuZmNfcmVnc1tpXVswXSwKLQkJCQkgd3dwbltpXSkpIHsKLQkJCWRldl9lcnIoZGV2LCAiJXM6IGZhaWxlZCB0byBzZXQgV1dQTiBvbiBwb3J0ICVkXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBpKTsKLQkJCXJjID0gLUVJTzsKLQkJCWdvdG8gb3V0OwotCQl9CisJCWlmICh3d3BuW2ldICE9IDApCisJCQlhZnVfc2V0X3d3cG4oYWZ1LCBpLAorCQkJCSAgICAgJmFmdS0+YWZ1X21hcC0+Z2xvYmFsLmZjX3JlZ3NbaV1bMF0sCisJCQkJICAgICB3d3BuW2ldKTsKIAkJLyogUHJvZ3JhbW1pbmcgV1dQTiBiYWNrIHRvIGJhY2sgY2F1c2VzIGFkZGl0aW9uYWwKIAkJICogb2ZmbGluZS9vbmxpbmUgdHJhbnNpdGlvbnMgYW5kIGEgUExPR0kKIAkJICovCkBAIC0yMDQ4LDYgKzIwMjQsMTEgQEAKICAqIGN4bGZsYXNoX2VoX2hvc3RfcmVzZXRfaGFuZGxlcigpIC0gcmVzZXQgdGhlIGhvc3QgYWRhcHRlcgogICogQHNjcDoJU0NTSSBjb21tYW5kIGZyb20gc3RhY2sgaWRlbnRpZnlpbmcgaG9zdC4KICAqCisgKiBGb2xsb3dpbmcgYSByZXNldCwgdGhlIHN0YXRlIGlzIGV2YWx1YXRlZCBhZ2FpbiBpbiBjYXNlIGFuIEVFSCBvY2N1cnJlZAorICogZHVyaW5nIHRoZSByZXNldC4gSW4gc3VjaCBhIHNjZW5hcmlvLCB0aGUgaG9zdCByZXNldCB3aWxsIGVpdGhlciB5aWVsZAorICogdW50aWwgdGhlIEVFSCByZWNvdmVyeSBpcyBjb21wbGV0ZSBvciByZXR1cm4gc3VjY2VzcyBvciBmYWlsdXJlIGJhc2VkCisgKiB1cG9uIHRoZSBjdXJyZW50IGRldmljZSBzdGF0ZS4KKyAqCiAgKiBSZXR1cm46CiAgKglTVUNDRVNTIGFzIGRlZmluZWQgaW4gc2NzaS9zY3NpLmgKICAqCUZBSUxFRCBhcyBkZWZpbmVkIGluIHNjc2kvc2NzaS5oCkBAIC0yMDgwLDcgKzIwNjEsOCBAQAogCQl9IGVsc2UKIAkJCWNmZy0+c3RhdGUgPSBTVEFURV9OT1JNQUw7CiAJCXdha2VfdXBfYWxsKCZjZmctPnJlc2V0X3dhaXRxKTsKLQkJYnJlYWs7CisJCXNzbGVlcCgxKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBTVEFURV9SRVNFVDoKIAkJd2FpdF9ldmVudChjZmctPnJlc2V0X3dhaXRxLCBjZmctPnN0YXRlICE9IFNUQVRFX1JFU0VUKTsKIAkJaWYgKGNmZy0+c3RhdGUgPT0gU1RBVEVfTk9STUFMKQpAQCAtMjU5Niw2ICsyNTc4LDkgQEAKICAqIEBwZGV2OglQQ0kgZGV2aWNlIHN0cnVjdC4KICAqIEBzdGF0ZToJUENJIGNoYW5uZWwgc3RhdGUuCiAgKgorICogV2hlbiBhbiBFRUggb2NjdXJzIGR1cmluZyBhbiBhY3RpdmUgcmVzZXQsIHdhaXQgdW50aWwgdGhlIHJlc2V0IGlzCisgKiBjb21wbGV0ZSBhbmQgdGhlbiB0YWtlIGFjdGlvbiBiYXNlZCB1cG9uIHRoZSBkZXZpY2Ugc3RhdGUuCisgKgogICogUmV0dXJuOiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUIG9yIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1QKICAqLwogc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgY3hsZmxhc2hfcGNpX2Vycm9yX2RldGVjdGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApAQCAtMjYwOSw2ICsyNTk0LDEwIEBACiAKIAlzd2l0Y2ggKHN0YXRlKSB7CiAJY2FzZSBwY2lfY2hhbm5lbF9pb19mcm96ZW46CisJCXdhaXRfZXZlbnQoY2ZnLT5yZXNldF93YWl0cSwgY2ZnLT5zdGF0ZSAhPSBTVEFURV9SRVNFVCk7CisJCWlmIChjZmctPnN0YXRlID09IFNUQVRFX0ZBSUxURVJNKQorCQkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CisKIAkJY2ZnLT5zdGF0ZSA9IFNUQVRFX1JFU0VUOwogCQlzY3NpX2Jsb2NrX3JlcXVlc3RzKGNmZy0+aG9zdCk7CiAJCWRyYWluX2lvY3RscyhjZmcpOwpAQCAtMjY4NSw3ICsyNjc0LDcgQEAKIAkuaWRfdGFibGUgPSBjeGxmbGFzaF9wY2lfdGFibGUsCiAJLnByb2JlID0gY3hsZmxhc2hfcHJvYmUsCiAJLnJlbW92ZSA9IGN4bGZsYXNoX3JlbW92ZSwKLQkuc2h1dGRvd24gPSBjeGxmbGFzaF9zaHV0ZG93biwKKwkuc2h1dGRvd24gPSBjeGxmbGFzaF9yZW1vdmUsCiAJLmVycl9oYW5kbGVyID0gJmN4bGZsYXNoX2Vycl9oYW5kbGVyLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4bGZsYXNoL3N1cGVycGlwZS5jIGIvZHJpdmVycy9zY3NpL2N4bGZsYXNoL3N1cGVycGlwZS5jCmluZGV4IGNlMTUwNzAuLjk2MzY5NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGxmbGFzaC9zdXBlcnBpcGUuYworKysgYi9kcml2ZXJzL3Njc2kvY3hsZmxhc2gvc3VwZXJwaXBlLmMKQEAgLTcwOSwxNCArNzA5LDEzIEBACiAgKiBAY2ZnOglJbnRlcm5hbCBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob3N0LgogICogQGN0eGk6CUNvbnRleHQgdG8gcmVsZWFzZS4KICAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgc2FmZSB0byBiZSBjYWxsZWQgd2l0aCBhIGEgbm9uLWluaXRpYWxpemVkIGNvbnRleHQKLSAqIGFuZCBpcyB0b2xlcmFudCBvZiBiZWluZyBjYWxsZWQgd2l0aCB0aGUgY29udGV4dCdzIG11dGV4IGhlbGQgKGl0Ci0gKiB3aWxsIGJlIHVubG9ja2VkIGlmIG5lY2Vzc2FyeSBiZWZvcmUgZnJlZWluZykuIEFsc28gbm90ZSB0aGF0IHRoZQotICogcm91dGluZSBjb25kaXRpb25hbGx5IGNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgY29udGV4dCBjb250cm9sCi0gKiBtYXAgYmVmb3JlIGNsZWFyaW5nIHRoZSBSSFQgcmVnaXN0ZXJzIGFuZCBjb250ZXh0IGNhcGFiaWxpdGllcyBiZWNhdXNlCi0gKiBpdCBpcyBwb3NzaWJsZSB0byBkZXN0cm95IGEgY29udGV4dCB3aGlsZSB0aGUgY29udGV4dCBpcyBpbiB0aGUgZXJyb3IKLSAqIHN0YXRlIChwcmV2aW91cyBtYXBwaW5nIHdhcyByZW1vdmVkIFtzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0Ci0gKiBjbGVhcmluZ10gYW5kIGNvbnRleHQgaXMgd2FpdGluZyBmb3IgYSBuZXcgbWFwcGluZykuCisgKiBUaGlzIHJvdXRpbmUgaXMgc2FmZSB0byBiZSBjYWxsZWQgd2l0aCBhIGEgbm9uLWluaXRpYWxpemVkIGNvbnRleHQuCisgKiBBbHNvIG5vdGUgdGhhdCB0aGUgcm91dGluZSBjb25kaXRpb25hbGx5IGNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZQorICogb2YgdGhlIGNvbnRleHQgY29udHJvbCBtYXAgYmVmb3JlIGNsZWFyaW5nIHRoZSBSSFQgcmVnaXN0ZXJzIGFuZAorICogY29udGV4dCBjYXBhYmlsaXRpZXMgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSB0byBkZXN0cm95IGEgY29udGV4dAorICogd2hpbGUgdGhlIGNvbnRleHQgaXMgaW4gdGhlIGVycm9yIHN0YXRlIChwcmV2aW91cyBtYXBwaW5nIHdhcworICogcmVtb3ZlZCBbc28gdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBjbGVhcmluZ10gYW5kIGNvbnRleHQKKyAqIGlzIHdhaXRpbmcgZm9yIGEgbmV3IG1hcHBpbmcpLgogICovCiBzdGF0aWMgdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IGN4bGZsYXNoX2NmZyAqY2ZnLAogCQkJICAgIHN0cnVjdCBjdHhfaW5mbyAqY3R4aSkKQEAgLTczMiw5ICs3MzEsNiBAQAogCQkJd3JpdGVxX2JlKDAsICZjdHhpLT5jdHJsX21hcC0+cmh0X2NudF9pZCk7CiAJCQl3cml0ZXFfYmUoMCwgJmN0eGktPmN0cmxfbWFwLT5jdHhfY2FwKTsKIAkJfQotCi0JCWlmIChtdXRleF9pc19sb2NrZWQoJmN0eGktPm11dGV4KSkKLQkJCW11dGV4X3VubG9jaygmY3R4aS0+bXV0ZXgpOwogCX0KIAogCS8qIEZyZWUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCBjb250ZXh0ICovCkBAIC03OTIsMzIgKzc4OCw1OCBAQAogICogQGNmZzoJSW50ZXJuYWwgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9zdC4KICAqIEBjdHg6CVByZXZpb3VzbHkgb2J0YWluZWQgQ1hMIGNvbnRleHQgcmVmZXJlbmNlLgogICogQGN0eGlkOglQcmV2aW91c2x5IG9idGFpbmVkIHByb2Nlc3MgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggQ1hMIGNvbnRleHQuCi0gKiBAYWRhcF9mZDoJUHJldmlvdXNseSBvYnRhaW5lZCBhZGFwdGVyIGZkIGFzc29jaWF0ZWQgd2l0aCBDWEwgY29udGV4dC4KICAqIEBmaWxlOglQcmV2aW91c2x5IG9idGFpbmVkIGZpbGUgYXNzb2NpYXRlZCB3aXRoIENYTCBjb250ZXh0LgogICogQHBlcm1zOglVc2VyLXNwZWNpZmllZCBwZXJtaXNzaW9ucy4KLSAqCi0gKiBVcG9uIHJldHVybiwgdGhlIGNvbnRleHQgaXMgbWFya2VkIGFzIGluaXRpYWxpemVkIGFuZCB0aGUgY29udGV4dCdzIG11dGV4Ci0gKiBpcyBsb2NrZWQuCiAgKi8KIHN0YXRpYyB2b2lkIGluaXRfY29udGV4dChzdHJ1Y3QgY3R4X2luZm8gKmN0eGksIHN0cnVjdCBjeGxmbGFzaF9jZmcgKmNmZywKLQkJCSBzdHJ1Y3QgY3hsX2NvbnRleHQgKmN0eCwgaW50IGN0eGlkLCBpbnQgYWRhcF9mZCwKLQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSwgdTMyIHBlcm1zKQorCQkJIHN0cnVjdCBjeGxfY29udGV4dCAqY3R4LCBpbnQgY3R4aWQsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIHUzMiBwZXJtcykKIHsKIAlzdHJ1Y3QgYWZ1ICphZnUgPSBjZmctPmFmdTsKIAogCWN0eGktPnJodF9wZXJtcyA9IHBlcm1zOwogCWN0eGktPmN0cmxfbWFwID0gJmFmdS0+YWZ1X21hcC0+Y3RybHNbY3R4aWRdLmN0cmw7CiAJY3R4aS0+Y3R4aWQgPSBFTkNPREVfQ1RYSUQoY3R4aSwgY3R4aWQpOwotCWN0eGktPmxmZCA9IGFkYXBfZmQ7CiAJY3R4aS0+cGlkID0gY3VycmVudC0+dGdpZDsgLyogdGdpZCA9IHBpZCAqLwogCWN0eGktPmN0eCA9IGN0eDsKKwljdHhpLT5jZmcgPSBjZmc7CiAJY3R4aS0+ZmlsZSA9IGZpbGU7CiAJY3R4aS0+aW5pdGlhbGl6ZWQgPSB0cnVlOwogCW11dGV4X2luaXQoJmN0eGktPm11dGV4KTsKKwlrcmVmX2luaXQoJmN0eGktPmtyZWYpOwogCUlOSVRfTElTVF9IRUFEKCZjdHhpLT5sdW5zKTsKIAlJTklUX0xJU1RfSEVBRCgmY3R4aS0+bGlzdCk7IC8qIGluaXRpYWxpemUgZm9yIGxpc3RfZW1wdHkoKSAqLworfQogCisvKioKKyAqIHJlbW92ZV9jb250ZXh0KCkgLSBjb250ZXh0IGtyZWYgcmVsZWFzZSBoYW5kbGVyCisgKiBAa3JlZjoJS2VybmVsIHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggY29udGV4dCB0byBiZSByZW1vdmVkLgorICoKKyAqIFdoZW4gYSBjb250ZXh0IG5vIGxvbmdlciBoYXMgYW55IHJlZmVyZW5jZXMgaXQgY2FuIHNhZmVseSBiZSByZW1vdmVkCisgKiBmcm9tIGdsb2JhbCBhY2Nlc3MgYW5kIGRlc3Ryb3llZC4gTm90ZSB0aGF0IGl0IGlzIGFzc3VtZWQgdGhlIHRocmVhZAorICogcmVsaW5xdWlzaGluZyBhY2Nlc3MgdG8gdGhlIGNvbnRleHQgaG9sZHMgaXRzIG11dGV4LgorICovCitzdGF0aWMgdm9pZCByZW1vdmVfY29udGV4dChzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgY3R4X2luZm8gKmN0eGkgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGN0eF9pbmZvLCBrcmVmKTsKKwlzdHJ1Y3QgY3hsZmxhc2hfY2ZnICpjZmcgPSBjdHhpLT5jZmc7CisJdTY0IGN0eGlkID0gREVDT0RFX0NUWElEKGN0eGktPmN0eGlkKTsKKworCS8qIFJlbW92ZSBjb250ZXh0IGZyb20gdGFibGUvZXJyb3IgbGlzdCAqLworCVdBUk5fT04oIW11dGV4X2lzX2xvY2tlZCgmY3R4aS0+bXV0ZXgpKTsKKwljdHhpLT51bmF2YWlsID0gdHJ1ZTsKKwltdXRleF91bmxvY2soJmN0eGktPm11dGV4KTsKKwltdXRleF9sb2NrKCZjZmctPmN0eF90YmxfbGlzdF9tdXRleCk7CiAJbXV0ZXhfbG9jaygmY3R4aS0+bXV0ZXgpOworCisJaWYgKCFsaXN0X2VtcHR5KCZjdHhpLT5saXN0KSkKKwkJbGlzdF9kZWwoJmN0eGktPmxpc3QpOworCWNmZy0+Y3R4X3RibFtjdHhpZF0gPSBOVUxMOworCW11dGV4X3VubG9jaygmY2ZnLT5jdHhfdGJsX2xpc3RfbXV0ZXgpOworCW11dGV4X3VubG9jaygmY3R4aS0+bXV0ZXgpOworCisJLyogQ29udGV4dCBub3cgY29tcGxldGVseSB1bmNvdXBsZWQvdW5yZWFjaGFibGUgKi8KKwlkZXN0cm95X2NvbnRleHQoY2ZnLCBjdHhpKTsKIH0KIAogLyoqCkBAIC04NDUsNyArODY3LDYgQEAKIAogCWludCBpOwogCWludCByYyA9IDA7Ci0JaW50IGxmZDsKIAl1NjQgY3R4aWQgPSBERUNPREVfQ1RYSUQoZGV0YWNoLT5jb250ZXh0X2lkKSwKIAkgICAgcmN0eGlkID0gZGV0YWNoLT5jb250ZXh0X2lkOwogCkBAIC04ODcsNDAgKzkwOCwxMyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCS8qIFRlYXIgZG93biBjb250ZXh0IGZvbGxvd2luZyBsYXN0IExVTiBjbGVhbnVwICovCi0JaWYgKGxpc3RfZW1wdHkoJmN0eGktPmx1bnMpKSB7Ci0JCWN0eGktPnVuYXZhaWwgPSB0cnVlOwotCQltdXRleF91bmxvY2soJmN0eGktPm11dGV4KTsKLQkJbXV0ZXhfbG9jaygmY2ZnLT5jdHhfdGJsX2xpc3RfbXV0ZXgpOwotCQltdXRleF9sb2NrKCZjdHhpLT5tdXRleCk7Ci0KLQkJLyogTWlnaHQgbm90IGhhdmUgYmVlbiBpbiBlcnJvciBsaXN0IHNvIGNvbmRpdGlvbmFsbHkgcmVtb3ZlICovCi0JCWlmICghbGlzdF9lbXB0eSgmY3R4aS0+bGlzdCkpCi0JCQlsaXN0X2RlbCgmY3R4aS0+bGlzdCk7Ci0JCWNmZy0+Y3R4X3RibFtjdHhpZF0gPSBOVUxMOwotCQltdXRleF91bmxvY2soJmNmZy0+Y3R4X3RibF9saXN0X211dGV4KTsKLQkJbXV0ZXhfdW5sb2NrKCZjdHhpLT5tdXRleCk7Ci0KLQkJbGZkID0gY3R4aS0+bGZkOwotCQlkZXN0cm95X2NvbnRleHQoY2ZnLCBjdHhpKTsKLQkJY3R4aSA9IE5VTEw7CisJLyoKKwkgKiBSZWxlYXNlIHRoZSBjb250ZXh0IHJlZmVyZW5jZSBhbmQgdGhlIHNkZXYgcmVmZXJlbmNlIHRoYXQKKwkgKiBib3VuZCB0aGlzIExVTiB0byB0aGUgY29udGV4dC4KKwkgKi8KKwlpZiAoa3JlZl9wdXQoJmN0eGktPmtyZWYsIHJlbW92ZV9jb250ZXh0KSkKIAkJcHV0X2N0eCA9IGZhbHNlOwotCi0JCS8qCi0JCSAqIEFzIGEgbGFzdCBzdGVwLCBjbGVhbiB1cCBleHRlcm5hbCByZXNvdXJjZXMgd2hlbiBub3QKLQkJICogYWxyZWFkeSBvbiBhbiBleHRlcm5hbCBjbGVhbnVwIHRocmVhZCwgaS5lLjogY2xvc2UoYWRhcF9mZCkuCi0JCSAqCi0JCSAqIE5PVEU6IHRoaXMgd2lsbCBmcmVlIHVwIHRoZSBjb250ZXh0IGZyb20gdGhlIENYTCBzZXJ2aWNlcywKLQkJICogYWxsb3dpbmcgaXQgdG8gZG9sZSBvdXQgdGhlIHNhbWUgY29udGV4dF9pZCBvbiBhIGZ1dHVyZQotCQkgKiAob3IgZXZlbiBjdXJyZW50bHkgaW4tZmxpZ2h0KSBkaXNrX2F0dGFjaCBvcGVyYXRpb24uCi0JCSAqLwotCQlpZiAobGZkICE9IC0xKQotCQkJc3lzX2Nsb3NlKGxmZCk7Ci0JfQotCi0JLyogUmVsZWFzZSB0aGUgc2RldiByZWZlcmVuY2UgdGhhdCBib3VuZCB0aGlzIExVTiB0byB0aGUgY29udGV4dCAqLwogCXNjc2lfZGV2aWNlX3B1dChzZGV2KTsKLQogb3V0OgogCWlmIChwdXRfY3R4KQogCQlwdXRfY29udGV4dChjdHhpKTsKQEAgLTk0MSwzNCArOTM1LDE4IEBACiAgKgogICogVGhpcyByb3V0aW5lIGlzIHRoZSByZWxlYXNlIGhhbmRsZXIgZm9yIHRoZSBmb3BzIHJlZ2lzdGVyZWQgd2l0aAogICogdGhlIENYTCBzZXJ2aWNlcyBvbiBhbiBpbml0aWFsIGF0dGFjaCBmb3IgYSBjb250ZXh0LiBJdCBpcyBjYWxsZWQKLSAqIHdoZW4gYSBjbG9zZSBpcyBwZXJmb3JtZWQgb24gdGhlIGFkYXB0ZXIgZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkCi0gKiB0byB0aGUgdXNlci4gUHJvZ3JhbW1hdGljYWxseSwgdGhlIHVzZXIgaXMgbm90IHJlcXVpcmVkIHRvIHBlcmZvcm0KLSAqIHRoZSBjbG9zZSwgYXMgaXQgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IHZpYSB0aGUgZGV0YWNoIGlvY3RsIHdoZW4KLSAqIGEgY29udGV4dCBpcyBiZWluZyByZW1vdmVkLiBOb3RlIHRoYXQgbm90aGluZyBwcmV2ZW50cyB0aGUgdXNlcgotICogZnJvbSBwZXJmb3JtaW5nIGEgY2xvc2UsIGJ1dCB0aGUgdXNlciBzaG91bGQgYmUgYXdhcmUgdGhhdCBkb2luZwotICogc28gaXMgY29uc2lkZXJlZCBjYXRhc3Ryb3BoaWMgYW5kIHN1YnNlcXVlbnQgdXNhZ2Ugb2YgdGhlIHN1cGVycGlwZQotICogQVBJIHdpdGggcHJldmlvdXNseSBzYXZlZCBvZmYgdG9rZW5zIHdpbGwgZmFpbC4KKyAqIHdoZW4gYSBjbG9zZSAoZXhwbGljaXR5IGJ5IHRoZSB1c2VyIG9yIGFzIHBhcnQgb2YgYSBwcm9jZXNzIHRlYXIKKyAqIGRvd24pIGlzIHBlcmZvcm1lZCBvbiB0aGUgYWRhcHRlciBmaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgdG8gdGhlCisgKiB1c2VyLiBUaGUgdXNlciBzaG91bGQgYmUgYXdhcmUgdGhhdCBleHBsaWNpdGx5IHBlcmZvcm1pbmcgYSBjbG9zZQorICogY29uc2lkZXJlZCBjYXRhc3Ryb3BoaWMgYW5kIHN1YnNlcXVlbnQgdXNhZ2Ugb2YgdGhlIHN1cGVycGlwZSBBUEkKKyAqIHdpdGggcHJldmlvdXNseSBzYXZlZCBvZmYgdG9rZW5zIHdpbGwgZmFpbC4KICAqCi0gKiBXaGVuIGluaXRpYXRlZCBmcm9tIGFuIGV4dGVybmFsIGNsb3NlIChlaXRoZXIgYnkgdGhlIHVzZXIgb3IgdmlhCi0gKiBhIHByb2Nlc3MgdGVhciBkb3duKSwgdGhlIHJvdXRpbmUgZGVyaXZlcyB0aGUgY29udGV4dCByZWZlcmVuY2UKLSAqIGFuZCBjYWxscyBkZXRhY2ggZm9yIGVhY2ggTFVOIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dC4gVGhlCi0gKiBmaW5hbCBkZXRhY2ggb3BlcmF0aW9uIHdpbGwgY2F1c2UgdGhlIGNvbnRleHQgaXRzZWxmIHRvIGJlIGZyZWVkLgotICogTm90ZSB0aGF0IHRoZSBzYXZlZCBvZmYgbGZkIGlzIHJlc2V0IHByaW9yIHRvIGNhbGxpbmcgZGV0YWNoIHRvCi0gKiBzaWduaWZ5IHRoYXQgdGhlIGZpbmFsIGRldGFjaCBzaG91bGQgbm90IHBlcmZvcm0gYSBjbG9zZS4KLSAqCi0gKiBXaGVuIGluaXRpYXRlZCBmcm9tIGEgZGV0YWNoIG9wZXJhdGlvbiBhcyBwYXJ0IG9mIHRoZSB0ZWFyIGRvd24KLSAqIG9mIGEgY29udGV4dCwgdGhlIGNvbnRleHQgaXMgZmlyc3QgY29tcGxldGVseSBmcmVlZCBhbmQgdGhlbiB0aGUKLSAqIGNsb3NlIGlzIHBlcmZvcm1lZC4gVGhpcyByb3V0aW5lIHdpbGwgZmFpbCB0byBkZXJpdmUgdGhlIGNvbnRleHQKLSAqIHJlZmVyZW5jZSAoZHVlIHRvIHRoZSBjb250ZXh0IGhhdmluZyBhbHJlYWR5IGJlZW4gZnJlZWQpIGFuZCB0aGVuCi0gKiBjYWxsIGludG8gdGhlIENYTCByZWxlYXNlIGVudHJ5IHBvaW50LgotICoKLSAqIFRodXMsIHdpdGggZXhjZXB0aW9uIHRvIHdoZW4gdGhlIENYTCBwcm9jZXNzIGVsZW1lbnQgKGNvbnRleHQgaWQpCi0gKiBsb29rdXAgZmFpbHMgKGEgY2FzZSB0aGF0IHNob3VsZCB0aGVvcmV0aWNhbGx5IG5ldmVyIG9jY3VyKSwgZXZlcnkKLSAqIGNhbGwgaW50byB0aGlzIHJvdXRpbmUgcmVzdWx0cyBpbiBhIGNvbXBsZXRlIGZyZWVpbmcgb2YgYSBjb250ZXh0LgotICoKLSAqIEFzIHBhcnQgb2YgdGhlIGRldGFjaCwgYWxsIHBlci1jb250ZXh0IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIExVTgotICogYXJlIGNsZWFuZWQgdXAuIFdoZW4gZGV0YWNoaW5nIHRoZSBsYXN0IExVTiBmb3IgYSBjb250ZXh0LCB0aGUgY29udGV4dAotICogaXRzZWxmIGlzIGNsZWFuZWQgdXAgYW5kIHJlbGVhc2VkLgorICogVGhpcyByb3V0aW5lIGRlcml2ZXMgdGhlIGNvbnRleHQgcmVmZXJlbmNlIGFuZCBjYWxscyBkZXRhY2ggZm9yCisgKiBlYWNoIExVTiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQuVGhlIGZpbmFsIGRldGFjaCBvcGVyYXRpb24KKyAqIGNhdXNlcyB0aGUgY29udGV4dCBpdHNlbGYgdG8gYmUgZnJlZWQuIFdpdGggZXhjZXB0aW9uIHRvIHdoZW4gdGhlCisgKiBDWEwgcHJvY2VzcyBlbGVtZW50IChjb250ZXh0IGlkKSBsb29rdXAgZmFpbHMgKGEgY2FzZSB0aGF0IHNob3VsZAorICogdGhlb3JldGljYWxseSBuZXZlciBvY2N1ciksIGV2ZXJ5IGNhbGwgaW50byB0aGlzIHJvdXRpbmUgcmVzdWx0cworICogaW4gYSBjb21wbGV0ZSBmcmVlaW5nIG9mIGEgY29udGV4dC4KICAqCiAgKiBSZXR1cm46IDAgb24gc3VjY2VzcwogICovCkBAIC0xMDA2LDExICs5ODQsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkZXZfZGJnKGRldiwgIiVzOiBjbG9zZSglZCkgZm9yIGNvbnRleHQgJWRcbiIsCi0JCV9fZnVuY19fLCBjdHhpLT5sZmQsIGN0eGlkKTsKKwlkZXZfZGJnKGRldiwgIiVzOiBjbG9zZSBmb3IgY29udGV4dCAlZFxuIiwgX19mdW5jX18sIGN0eGlkKTsKIAotCS8qIFJlc2V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gaW5kaWNhdGUgd2UncmUgb24gYSBjbG9zZSgpIHRocmVhZCAqLwotCWN0eGktPmxmZCA9IC0xOwogCWRldGFjaC5jb250ZXh0X2lkID0gY3R4aS0+Y3R4aWQ7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGx1bl9hY2Nlc3MsIHQsICZjdHhpLT5sdW5zLCBsaXN0KQogCQlfY3hsZmxhc2hfZGlza19kZXRhY2gobHVuX2FjY2Vzcy0+c2RldiwgY3R4aSwgJmRldGFjaCk7CkBAIC0xMTEwLDggKzEwODUsNyBAQAogCQlnb3RvIGVycjsKIAl9CiAKLQlkZXZfZGJnKGRldiwgIiVzOiBmYXVsdCglZCkgZm9yIGNvbnRleHQgJWRcbiIsCi0JCV9fZnVuY19fLCBjdHhpLT5sZmQsIGN0eGlkKTsKKwlkZXZfZGJnKGRldiwgIiVzOiBmYXVsdCBmb3IgY29udGV4dCAlZFxuIiwgX19mdW5jX18sIGN0eGlkKTsKIAogCWlmIChsaWtlbHkoIWN0eGktPmVycl9yZWNvdmVyeV9hY3RpdmUpKSB7CiAJCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CkBAIC0xMTg2LDggKzExNjAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkZXZfZGJnKGRldiwgIiVzOiBtbWFwKCVkKSBmb3IgY29udGV4dCAlZFxuIiwKLQkJX19mdW5jX18sIGN0eGktPmxmZCwgY3R4aWQpOworCWRldl9kYmcoZGV2LCAiJXM6IG1tYXAgZm9yIGNvbnRleHQgJWRcbiIsIF9fZnVuY19fLCBjdHhpZCk7CiAKIAlyYyA9IGN4bF9mZF9tbWFwKGZpbGUsIHZtYSk7CiAJaWYgKGxpa2VseSghcmMpKSB7CkBAIC0xMzc3LDEyICsxMzUwLDEyIEBACiAJbHVuX2FjY2Vzcy0+bGxpID0gbGxpOwogCWx1bl9hY2Nlc3MtPnNkZXYgPSBzZGV2OwogCi0JLyogTm9uLU5VTEwgY29udGV4dCBpbmRpY2F0ZXMgcmV1c2UgKi8KKwkvKiBOb24tTlVMTCBjb250ZXh0IGluZGljYXRlcyByZXVzZSAoYW5vdGhlciBjb250ZXh0IHJlZmVyZW5jZSkgKi8KIAlpZiAoY3R4aSkgewogCQlkZXZfZGJnKGRldiwgIiVzOiBSZXVzaW5nIGNvbnRleHQgZm9yIExVTiEgKCUwMTZsbFgpXG4iLAogCQkJX19mdW5jX18sIHJjdHhpZCk7CisJCWtyZWZfZ2V0KCZjdHhpLT5rcmVmKTsKIAkJbGlzdF9hZGQoJmx1bl9hY2Nlc3MtPmxpc3QsICZjdHhpLT5sdW5zKTsKLQkJZmQgPSBjdHhpLT5sZmQ7CiAJCWdvdG8gb3V0X2F0dGFjaDsKIAl9CiAKQEAgLTE0MzAsNyArMTQwMyw3IEBACiAJcGVybXMgPSBTSVNMX1JIVF9QRVJNKGF0dGFjaC0+aGRyLmZsYWdzICsgMSk7CiAKIAkvKiBDb250ZXh0IG11dGV4IGlzIGxvY2tlZCB1cG9uIHJldHVybiAqLwotCWluaXRfY29udGV4dChjdHhpLCBjZmcsIGN0eCwgY3R4aWQsIGZkLCBmaWxlLCBwZXJtcyk7CisJaW5pdF9jb250ZXh0KGN0eGksIGNmZywgY3R4LCBjdHhpZCwgZmlsZSwgcGVybXMpOwogCiAJcmMgPSBhZnVfYXR0YWNoKGNmZywgY3R4aSk7CiAJaWYgKHVubGlrZWx5KHJjKSkgewpAQCAtMTQ0NSw3ICsxNDE4LDYgQEAKIAkgKiBrbm93cyBhYm91dCB1cyB5ZXQ7IHdlIGNhbiBiZSB0aGUgb25seSBvbmUgaG9sZGluZyBvdXIgbXV0ZXguCiAJICovCiAJbGlzdF9hZGQoJmx1bl9hY2Nlc3MtPmxpc3QsICZjdHhpLT5sdW5zKTsKLQltdXRleF91bmxvY2soJmN0eGktPm11dGV4KTsKIAltdXRleF9sb2NrKCZjZmctPmN0eF90YmxfbGlzdF9tdXRleCk7CiAJbXV0ZXhfbG9jaygmY3R4aS0+bXV0ZXgpOwogCWNmZy0+Y3R4X3RibFtjdHhpZF0gPSBjdHhpOwpAQCAtMTQ1Myw3ICsxNDI1LDExIEBACiAJZmRfaW5zdGFsbChmZCwgZmlsZSk7CiAKIG91dF9hdHRhY2g6Ci0JYXR0YWNoLT5oZHIucmV0dXJuX2ZsYWdzID0gMDsKKwlpZiAoZmQgIT0gLTEpCisJCWF0dGFjaC0+aGRyLnJldHVybl9mbGFncyA9IERLX0NYTEZMQVNIX0FQUF9DTE9TRV9BREFQX0ZEOworCWVsc2UKKwkJYXR0YWNoLT5oZHIucmV0dXJuX2ZsYWdzID0gMDsKKwogCWF0dGFjaC0+Y29udGV4dF9pZCA9IGN0eGktPmN0eGlkOwogCWF0dGFjaC0+YmxvY2tfc2l6ZSA9IGdsaS0+YmxrX2xlbjsKIAlhdHRhY2gtPm1taW9fc2l6ZSA9IHNpemVvZihhZnUtPmFmdV9tYXAtPmhvc3RzWzBdLmhhcmVhKTsKQEAgLTE0OTQsNyArMTQ3MCw3IEBACiAJCWZpbGUgPSBOVUxMOwogCX0KIAotCS8qIENsZWFudXAgb3VyIGNvbnRleHQ7IHNhZmUgdG8gY2FsbCBldmVuIHdpdGggbXV0ZXggbG9ja2VkICovCisJLyogQ2xlYW51cCBvdXIgY29udGV4dCAqLwogCWlmIChjdHhpKSB7CiAJCWRlc3Ryb3lfY29udGV4dChjZmcsIGN0eGkpOwogCQljdHhpID0gTlVMTDsKQEAgLTE1MDksMTYgKzE0ODUsMTkgQEAKICAqIHJlY292ZXJfY29udGV4dCgpIC0gcmVjb3ZlcnMgYSBjb250ZXh0IGluIGVycm9yCiAgKiBAY2ZnOglJbnRlcm5hbCBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBob3N0LgogICogQGN0eGk6CUNvbnRleHQgdG8gcmVsZWFzZS4KKyAqIEBhZGFwX2ZkOglBZGFwdGVyIGZpbGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggbmV3L3JlY292ZXJlZCBjb250ZXh0LgogICoKICAqIFJlc3RhYmxpc2hlcyB0aGUgc3RhdGUgZm9yIGEgY29udGV4dC1pbi1lcnJvci4KICAqCiAgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUKICAqLwotc3RhdGljIGludCByZWNvdmVyX2NvbnRleHQoc3RydWN0IGN4bGZsYXNoX2NmZyAqY2ZnLCBzdHJ1Y3QgY3R4X2luZm8gKmN0eGkpCitzdGF0aWMgaW50IHJlY292ZXJfY29udGV4dChzdHJ1Y3QgY3hsZmxhc2hfY2ZnICpjZmcsCisJCQkgICBzdHJ1Y3QgY3R4X2luZm8gKmN0eGksCisJCQkgICBpbnQgKmFkYXBfZmQpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmNmZy0+ZGV2LT5kZXY7CiAJaW50IHJjID0gMDsKLQlpbnQgb2xkX2ZkLCBmZCA9IC0xOworCWludCBmZCA9IC0xOwogCWludCBjdHhpZCA9IC0xOwogCXN0cnVjdCBmaWxlICpmaWxlOwogCXN0cnVjdCBjeGxfY29udGV4dCAqY3R4OwpAQCAtMTU2Niw5ICsxNTQ1LDcgQEAKIAkgKiBObyBlcnJvciBwYXRocyBhZnRlciB0aGlzIHBvaW50LiBPbmNlIHRoZSBmZCBpcyBpbnN0YWxsZWQgaXQncwogCSAqIHZpc2libGUgdG8gdXNlciBzcGFjZSBhbmQgY2FuJ3QgYmUgdW5kb25lIHNhZmVseSBvbiB0aGlzIHRocmVhZC4KIAkgKi8KLQlvbGRfZmQgPSBjdHhpLT5sZmQ7CiAJY3R4aS0+Y3R4aWQgPSBFTkNPREVfQ1RYSUQoY3R4aSwgY3R4aWQpOwotCWN0eGktPmxmZCA9IGZkOwogCWN0eGktPmN0eCA9IGN0eDsKIAljdHhpLT5maWxlID0gZmlsZTsKIApAQCAtMTU4NSw5ICsxNTYyLDcgQEAKIAljZmctPmN0eF90YmxbY3R4aWRdID0gY3R4aTsKIAltdXRleF91bmxvY2soJmNmZy0+Y3R4X3RibF9saXN0X211dGV4KTsKIAlmZF9pbnN0YWxsKGZkLCBmaWxlKTsKLQotCS8qIFJlbGVhc2UgdGhlIG9yaWdpbmFsIGFkYXB0ZXIgZmQgYW5kIGFzc29jaWF0ZWQgQ1hMIHJlc291cmNlcyAqLwotCXN5c19jbG9zZShvbGRfZmQpOworCSphZGFwX2ZkID0gZmQ7CiBvdXQ6CiAJZGV2X2RiZyhkZXYsICIlczogcmV0dXJuaW5nIGN0eGlkPSVkIGZkPSVkIHJjPSVkXG4iLAogCQlfX2Z1bmNfXywgY3R4aWQsIGZkLCByYyk7CkBAIC0xNjQ2LDYgKzE2MjEsNyBAQAogCSAgICByY3R4aWQgPSByZWNvdmVyLT5jb250ZXh0X2lkOwogCWxvbmcgcmVnOwogCWludCBscmV0cnkgPSAyMDsgLyogdXAgdG8gMiBzZWNvbmRzICovCisJaW50IG5ld19hZGFwX2ZkID0gLTE7CiAJaW50IHJjID0gMDsKIAogCWF0b21pY19pbmMoJmNmZy0+cmVjb3ZlcnlfdGhyZWFkcyk7CkBAIC0xNjc1LDcgKzE2NTEsNyBAQAogCiAJaWYgKGN0eGktPmVycl9yZWNvdmVyeV9hY3RpdmUpIHsKIHJldHJ5X3JlY292ZXI6Ci0JCXJjID0gcmVjb3Zlcl9jb250ZXh0KGNmZywgY3R4aSk7CisJCXJjID0gcmVjb3Zlcl9jb250ZXh0KGNmZywgY3R4aSwgJm5ld19hZGFwX2ZkKTsKIAkJaWYgKHVubGlrZWx5KHJjKSkgewogCQkJZGV2X2VycihkZXYsICIlczogUmVjb3ZlcnkgZmFpbGVkIGZvciBjb250ZXh0ICVsbHUgKHJjPSVkKVxuIiwKIAkJCQlfX2Z1bmNfXywgY3R4aWQsIHJjKTsKQEAgLTE2OTcsOSArMTY3Myw5IEBACiAKIAkJY3R4aS0+ZXJyX3JlY292ZXJ5X2FjdGl2ZSA9IGZhbHNlOwogCQlyZWNvdmVyLT5jb250ZXh0X2lkID0gY3R4aS0+Y3R4aWQ7Ci0JCXJlY292ZXItPmFkYXBfZmQgPSBjdHhpLT5sZmQ7CisJCXJlY292ZXItPmFkYXBfZmQgPSBuZXdfYWRhcF9mZDsKIAkJcmVjb3Zlci0+bW1pb19zaXplID0gc2l6ZW9mKGFmdS0+YWZ1X21hcC0+aG9zdHNbMF0uaGFyZWEpOwotCQlyZWNvdmVyLT5oZHIucmV0dXJuX2ZsYWdzIHw9CisJCXJlY292ZXItPmhkci5yZXR1cm5fZmxhZ3MgPSBES19DWExGTEFTSF9BUFBfQ0xPU0VfQURBUF9GRCB8CiAJCQlES19DWExGTEFTSF9SRUNPVkVSX0FGVV9DT05URVhUX1JFU0VUOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3hsZmxhc2gvc3VwZXJwaXBlLmggYi9kcml2ZXJzL3Njc2kvY3hsZmxhc2gvc3VwZXJwaXBlLmgKaW5kZXggNWY5YTA5MS4uOWU2MmZmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2N4bGZsYXNoL3N1cGVycGlwZS5oCisrKyBiL2RyaXZlcnMvc2NzaS9jeGxmbGFzaC9zdXBlcnBpcGUuaApAQCAtMTAwLDEzICsxMDAsMTQgQEAKIAogCXN0cnVjdCBjeGxfaW9jdGxfc3RhcnRfd29yayB3b3JrOwogCXU2NCBjdHhpZDsKLQlpbnQgbGZkOwogCXBpZF90IHBpZDsKIAlib29sIGluaXRpYWxpemVkOwogCWJvb2wgdW5hdmFpbDsKIAlib29sIGVycl9yZWNvdmVyeV9hY3RpdmU7CiAJc3RydWN0IG11dGV4IG11dGV4OyAvKiBDb250ZXh0IHByb3RlY3Rpb24gKi8KKwlzdHJ1Y3Qga3JlZiBrcmVmOwogCXN0cnVjdCBjeGxfY29udGV4dCAqY3R4OworCXN0cnVjdCBjeGxmbGFzaF9jZmcgKmNmZzsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGx1bnM7CS8qIExVTnMgYXR0YWNoZWQgdG8gdGhpcyBjb250ZXh0ICovCiAJY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0ICpjeGxfbW1hcF92bW9wczsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGxmbGFzaC92bHVuLmMgYi9kcml2ZXJzL3Njc2kvY3hsZmxhc2gvdmx1bi5jCmluZGV4IDUwZjhlOTMuLjkwYzVkN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGxmbGFzaC92bHVuLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4bGZsYXNoL3ZsdW4uYwpAQCAtMTEzNSwxNCArMTEzNSwxMyBAQAogCSAgICBjdHhpZF9kc3QgPSBERUNPREVfQ1RYSUQoY2xvbmUtPmNvbnRleHRfaWRfZHN0KSwKIAkgICAgcmN0eGlkX3NyYyA9IGNsb25lLT5jb250ZXh0X2lkX3NyYywKIAkgICAgcmN0eGlkX2RzdCA9IGNsb25lLT5jb250ZXh0X2lkX2RzdDsKLQlpbnQgYWRhcF9mZF9zcmMgPSBjbG9uZS0+YWRhcF9mZF9zcmM7CiAJaW50IGksIGo7CiAJaW50IHJjID0gMDsKIAlib29sIGZvdW5kOwogCUxJU1RfSEVBRChzaWRlY2FyKTsKIAotCXByX2RlYnVnKCIlczogY3R4aWRfc3JjPSVsbHUgY3R4aWRfZHN0PSVsbHUgYWRhcF9mZF9zcmM9JWRcbiIsCi0JCSBfX2Z1bmNfXywgY3R4aWRfc3JjLCBjdHhpZF9kc3QsIGFkYXBfZmRfc3JjKTsKKwlwcl9kZWJ1ZygiJXM6IGN0eGlkX3NyYz0lbGx1IGN0eGlkX2RzdD0lbGx1XG4iLAorCQkgX19mdW5jX18sIGN0eGlkX3NyYywgY3R4aWRfZHN0KTsKIAogCS8qIERvIG5vdCBjbG9uZSB5b3Vyc2VsZiAqLwogCWlmICh1bmxpa2VseShyY3R4aWRfc3JjID09IHJjdHhpZF9kc3QpKSB7CkBAIC0xMTY2LDEzICsxMTY1LDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHVubGlrZWx5KGFkYXBfZmRfc3JjICE9IGN0eGlfc3JjLT5sZmQpKSB7Ci0JCXByX2RlYnVnKCIlczogSW52YWxpZCBzb3VyY2UgYWRhcHRlciBmZCEgKCVkKVxuIiwKLQkJCSBfX2Z1bmNfXywgYWRhcF9mZF9zcmMpOwotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQogCS8qIFZlcmlmeSB0aGVyZSBpcyBubyBvcGVuIHJlc291cmNlIGhhbmRsZSBpbiB0aGUgZGVzdGluYXRpb24gY29udGV4dCAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfUkhUX1BFUl9DT05URVhUOyBpKyspCiAJCWlmIChjdHhpX2RzdC0+cmh0X3N0YXJ0W2ldLm5tYXNrICE9IDApIHsKQEAgLTEyNTcsNyArMTI0OSw2IEBACiAKIG91dF9zdWNjZXNzOgogCWxpc3Rfc3BsaWNlKCZzaWRlY2FyLCAmY3R4aV9kc3QtPmx1bnMpOwotCXN5c19jbG9zZShhZGFwX2ZkX3NyYyk7CiAKIAkvKiBmYWxsIHRocm91Z2ggKi8KIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2FsdWEuYyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX2FsdWEuYwppbmRleCA3NTJiNWM5Li4yNDE4MjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9hbHVhLmMKKysrIGIvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfYWx1YS5jCkBAIC01ODMsNiArNTgzLDcgQEAKIAkJCXNkZXZfcHJpbnRrKEtFUk5fRVJSLCBzZGV2LCAiJXM6IHJ0cGcgcmV0cnlcbiIsCiAJCQkJICAgIEFMVUFfREhfTkFNRSk7CiAJCQlzY3NpX3ByaW50X3NlbnNlX2hkcihzZGV2LCBBTFVBX0RIX05BTUUsICZzZW5zZV9oZHIpOworCQkJa2ZyZWUoYnVmZik7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJCXNkZXZfcHJpbnRrKEtFUk5fRVJSLCBzZGV2LCAiJXM6IHJ0cGcgZmFpbGVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2R0Yy5jIGIvZHJpdmVycy9zY3NpL2R0Yy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTk4NjNmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2NzaS9kdGMuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKgotICogRFRDIDMxODAvMzI4MCBkcml2ZXIsIGJ5Ci0gKglSYXkgVmFuIFRhc3NsZQlyYXl2dEBjb21tLm1vdC5jb20KLSAqCi0gKgl0YWtlbiBmcm9tIC4uLgotICoJVHJhbnRvciBUMTI4L1QxMjhGL1QyMjggZHJpdmVyIGJ5Li4uCi0gKgotICogCURyZXcgRWNraGFyZHQKLSAqCVZpc2lvbmFyeSBDb21wdXRpbmcKLSAqCShVbml4IGFuZCBMaW51eCBjb25zdWx0aW5nIGFuZCBjdXN0b20gcHJvZ3JhbW1pbmcpCi0gKglkcmV3QGNvbG9yYWRvLmVkdQotICogICAgICArMSAoMzAzKSA0NDAtNDg5NAotICovCi0KLS8qCi0gKiBUaGUgY2FyZCBpcyBkZXRlY3RlZCBhbmQgaW5pdGlhbGl6ZWQgaW4gb25lIG9mIHNldmVyYWwgd2F5cyA6IAotICogMS4gIEF1dG9wcm9iZSAoZGVmYXVsdCkgLSBzaW5jZSB0aGUgYm9hcmQgaXMgbWVtb3J5IG1hcHBlZCwgCi0gKiAgICAgYSBCSU9TIHNpZ25hdHVyZSBpcyBzY2FubmVkIGZvciB0byBsb2NhdGUgdGhlIHJlZ2lzdGVycy4KLSAqICAgICBBbiBpbnRlcnJ1cHQgaXMgdHJpZ2dlcmVkIHRvIGF1dG9wcm9iZSBmb3IgdGhlIGludGVycnVwdAotICogICAgIGxpbmUuCi0gKgotICogMi4gIFdpdGggY29tbWFuZCBsaW5lIG92ZXJyaWRlcyAtIGR0Yz1hZGRyZXNzLGlycSBtYXkgYmUgCi0gKiAgICAgdXNlZCBvbiB0aGUgTElMTyBjb21tYW5kIGxpbmUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLgotICogCi0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogdGhlIGZvbGxvd2luZyB3aWxsIHNldCB0aGUgbW9uaXRvciBib3JkZXIgY29sb3IgKHVzZWZ1bCB0byBmaW5kCi0gd2hlcmUgc29tZXRoaW5nIGNyYXNoZWQgb3IgZ2V0cyBzdHVjayBhdCAqLwotLyogMSA9IGJsdWUKLSAyID0gZ3JlZW4KLSAzID0gY3lhbgotIDQgPSByZWQKLSA1ID0gbWFnZW50YQotIDYgPSB5ZWxsb3cKLSA3ID0gd2hpdGUKLSovCi0jaWYgMAotI2RlZmluZSBydHJjKGkpIHtpbmIoMHgzZGEpOyBvdXRiKDB4MzEsIDB4M2MwKTsgb3V0YigoaSksIDB4M2MwKTt9Ci0jZWxzZQotI2RlZmluZSBydHJjKGkpIHt9Ci0jZW5kaWYKLQotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KLQotI2luY2x1ZGUgImR0Yy5oIgotI2luY2x1ZGUgIk5DUjUzODAuaCIKLQotLyoKLSAqIFRoZSBEVEMzMTgwICYgMzI4MCBib2FyZHMgYXJlIG1lbW9yeSBtYXBwZWQuCi0gKiAKLSAqLwotCi0vKgotICovCi0vKiBPZmZzZXQgZnJvbSBEVENfNTM4MF9PRkZTRVQgKi8KLSNkZWZpbmUgRFRDX0NPTlRST0xfUkVHCQkweDEwMAkvKiBydyAqLwotI2RlZmluZSBEX0NSX0FDQ0VTUwkJMHg4MAkvKiBybyBzZXQ9Y2FuIGFjY2VzcyAzMjgwIHJlZ2lzdGVycyAqLwotI2RlZmluZSBDU1JfRElSX1JFQUQJCTB4NDAJLyogcncgZGlyZWN0aW9uLCAxID0gcmVhZCAwID0gd3JpdGUgKi8KLQotI2RlZmluZSBDU1JfUkVTRVQgICAgICAgICAgICAgIDB4ODAJLyogd28gIFJlc2V0cyA1M2M0MDAgKi8KLSNkZWZpbmUgQ1NSXzUzODBfUkVHICAgICAgICAgICAweDgwCS8qIHJvICA1MzgwIHJlZ2lzdGVycyBjYW4gYmUgYWNjZXNzZWQgKi8KLSNkZWZpbmUgQ1NSX1RSQU5TX0RJUiAgICAgICAgICAweDQwCS8qIHJ3ICBEYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiAqLwotI2RlZmluZSBDU1JfU0NTSV9CVUZGX0lOVFIgICAgIDB4MjAJLyogcncgIEVuYWJsZSBpbnQgb24gdHJhbnNmZXIgcmVhZHkgKi8KLSNkZWZpbmUgQ1NSXzUzODBfSU5UUiAgICAgICAgICAweDEwCS8qIHJ3ICBFbmFibGUgNTM4MCBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIENTUl9TSEFSRURfSU5UUiAgICAgICAgMHgwOAkvKiBydyAgSW50ZXJydXB0IHNoYXJpbmcgKi8KLSNkZWZpbmUgQ1NSX0hPU1RfQlVGX05PVF9SRFkgICAweDA0CS8qIHJvICBIb3N0IGJ1ZmZlciBub3QgcmVhZHkgKi8KLSNkZWZpbmUgQ1NSX1NDU0lfQlVGX1JEWSAgICAgICAweDAyCS8qIHJvICBTQ1NJIGJ1ZmZlciByZWFkeSAqLwotI2RlZmluZSBDU1JfR0FURURfNTM4MF9JUlEgICAgIDB4MDEJLyogcm8gIExhc3QgYmxvY2sgeGZlcnJlZCAqLwotI2RlZmluZSBDU1JfSU5UX0JBU0UgKENTUl9TQ1NJX0JVRkZfSU5UUiB8IENTUl81MzgwX0lOVFIpCi0KLQotI2RlZmluZSBEVENfQkxLX0NOVAkJMHgxMDEJLyogcncgCi0JCQkJCSAqICMgb2YgMTI4LWJ5dGUgYmxvY2tzIHRvIHRyYW5zZmVyICovCi0KLQotI2RlZmluZSBEX0NSX0FDQ0VTUyAgICAgICAgICAgICAweDgwCS8qIHJvIHNldD1jYW4gYWNjZXNzIDMyODAgcmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgRFRDX1NXSVRDSF9SRUcJCTB4Mzk4MgkvKiBybyAtIERJUCBzd2l0Y2hlcyAqLwotI2RlZmluZSBEVENfUkVTVU1FX1hGRVIJCTB4Mzk4MgkvKiB3byAtIHJlc3VtZSBkYXRhIHhmZXIgCi0JCQkJCSAqIGFmdGVyIGRpc2Nvbm5lY3QvcmVjb25uZWN0Ki8KLQotI2RlZmluZSBEVENfNTM4MF9PRkZTRVQJCTB4Mzg4MAkvKiA4IHJlZ2lzdGVycyBoZXJlLCBzZWUgTkNSNTM4MC5oICovCi0KLS8qISEhISBmb3IgZHRjLCBpdCdzIGEgMTI4IGJ5dGUgYnVmZmVyIGF0IDM5MDAgISEhICovCi0jZGVmaW5lIERUQ19EQVRBX0JVRgkJMHgzOTAwCS8qIHJ3IDEyOCBieXRlcyBsb25nICovCi0KLXN0YXRpYyBzdHJ1Y3Qgb3ZlcnJpZGUgewotCXVuc2lnbmVkIGludCBhZGRyZXNzOwotCWludCBpcnE7Ci19IG92ZXJyaWRlcwotI2lmZGVmIE9WRVJSSURFCi1bXSBfX2luaXRkYXRhID0gT1ZFUlJJREU7Ci0jZWxzZQotWzRdIF9faW5pdGRhdGEgPSB7Ci0JeyAwLCBJUlFfQVVUTyB9LCB7IDAsIElSUV9BVVRPIH0sIHsgMCwgSVJRX0FVVE8gfSwgeyAwLCBJUlFfQVVUTyB9Ci19OwotI2VuZGlmCi0KLSNkZWZpbmUgTk9fT1ZFUlJJREVTIEFSUkFZX1NJWkUob3ZlcnJpZGVzKQotCi1zdGF0aWMgc3RydWN0IGJhc2UgewotCXVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLQlpbnQgbm9hdXRvOwotfSBiYXNlc1tdIF9faW5pdGRhdGEgPSB7Ci0JeyAweGNjMDAwLCAwIH0sCi0JeyAweGM4MDAwLCAwIH0sCi0JeyAweGRjMDAwLCAwIH0sCi0JeyAweGQ4MDAwLCAwIH0KLX07Ci0KLSNkZWZpbmUgTk9fQkFTRVMgQVJSQVlfU0laRShiYXNlcykKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzaWduYXR1cmUgewotCWNvbnN0IGNoYXIgKnN0cmluZzsKLQlpbnQgb2Zmc2V0OwotfSBzaWduYXR1cmVzW10gPSB7Ci0JeyJEQVRBIFRFQ0hOT0xPR1kgQ09SUE9SQVRJT04gQklPUyIsIDB4MjV9LAotfTsKLQotI2RlZmluZSBOT19TSUdOQVRVUkVTIEFSUkFZX1NJWkUoc2lnbmF0dXJlcykKLQotI2lmbmRlZiBNT0RVTEUKLS8qCi0gKiBGdW5jdGlvbiA6IGR0Y19zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKLSAqCi0gKiBQdXJwb3NlIDogTElMTyBjb21tYW5kIGxpbmUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG92ZXJyaWRlcyBhcnJheSwKLSAqCi0gKiBJbnB1dHMgOiBzdHIgLSB1bnVzZWQsIGludHMgLSBhcnJheSBvZiBpbnRlZ2VyIHBhcmFtZXRlcnMgd2l0aCBpbnRzWzBdCi0gKgllcXVhbCB0byB0aGUgbnVtYmVyIG9mIGludHMuCi0gKgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGR0Y19zZXR1cChjaGFyICpzdHIpCi17Ci0Jc3RhdGljIGludCBjb21tYW5kbGluZV9jdXJyZW50OwotCWludCBpOwotCWludCBpbnRzWzEwXTsKLQotCWdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7Ci0JaWYgKGludHNbMF0gIT0gMikKLQkJcHJpbnRrKCJkdGNfc2V0dXA6IHVzYWdlIGR0Yz1hZGRyZXNzLGlycVxuIik7Ci0JZWxzZSBpZiAoY29tbWFuZGxpbmVfY3VycmVudCA8IE5PX09WRVJSSURFUykgewotCQlvdmVycmlkZXNbY29tbWFuZGxpbmVfY3VycmVudF0uYWRkcmVzcyA9IGludHNbMV07Ci0JCW92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5pcnEgPSBpbnRzWzJdOwotCQlmb3IgKGkgPSAwOyBpIDwgTk9fQkFTRVM7ICsraSkKLQkJCWlmIChiYXNlc1tpXS5hZGRyZXNzID09IGludHNbMV0pIHsKLQkJCQliYXNlc1tpXS5ub2F1dG8gPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQkrK2NvbW1hbmRsaW5lX2N1cnJlbnQ7Ci0JfQotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJkdGM9IiwgZHRjX3NldHVwKTsKLSNlbmRpZgotCi0vKiAKLSAqIEZ1bmN0aW9uIDogaW50IGR0Y19kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqIHRwbnQpCi0gKgotICogUHVycG9zZSA6IGRldGVjdHMgYW5kIGluaXRpYWxpemVzIERUQyAzMTgwLzMyODAgY29udHJvbGxlcnMKLSAqCXRoYXQgd2VyZSBhdXRvcHJvYmVkLCBvdmVycmlkZGVuIG9uIHRoZSBMSUxPIGNvbW1hbmQgbGluZSwgCi0gKglvciBzcGVjaWZpZWQgYXQgY29tcGlsZSB0aW1lLgotICoKLSAqIElucHV0cyA6IHRwbnQgLSB0ZW1wbGF0ZSBmb3IgdGhpcyBTQ1NJIGFkYXB0ZXIuCi0gKiAKLSAqIFJldHVybnMgOiAxIGlmIGEgaG9zdCBhZGFwdGVyIHdhcyBmb3VuZCwgMCBpZiBub3QuCi0gKgotKi8KLQotc3RhdGljIGludCBfX2luaXQgZHRjX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKLXsKLQlzdGF0aWMgaW50IGN1cnJlbnRfb3ZlcnJpZGUsIGN1cnJlbnRfYmFzZTsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKLQl1bnNpZ25lZCBpbnQgYWRkcjsKLQl2b2lkIF9faW9tZW0gKmJhc2U7Ci0JaW50IHNpZywgY291bnQ7Ci0KLQlmb3IgKGNvdW50ID0gMDsgY3VycmVudF9vdmVycmlkZSA8IE5PX09WRVJSSURFUzsgKytjdXJyZW50X292ZXJyaWRlKSB7Ci0JCWFkZHIgPSAwOwotCQliYXNlID0gTlVMTDsKLQotCQlpZiAob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmFkZHJlc3MpIHsKLQkJCWFkZHIgPSBvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uYWRkcmVzczsKLQkJCWJhc2UgPSBpb3JlbWFwKGFkZHIsIDB4MjAwMCk7Ci0JCQlpZiAoIWJhc2UpCi0JCQkJYWRkciA9IDA7Ci0JCX0gZWxzZQotCQkJZm9yICg7ICFhZGRyICYmIChjdXJyZW50X2Jhc2UgPCBOT19CQVNFUyk7ICsrY3VycmVudF9iYXNlKSB7Ci0JCQkJZHByaW50ayhOREVCVUdfSU5JVCwgImR0YzogcHJvYmluZyBhZGRyZXNzIDB4JTA4eFxuIiwKLQkJCQkgICAgICAgICh1bnNpZ25lZCBpbnQpYmFzZXNbY3VycmVudF9iYXNlXS5hZGRyZXNzKTsKLQkJCQlpZiAoYmFzZXNbY3VycmVudF9iYXNlXS5ub2F1dG8pCi0JCQkJCWNvbnRpbnVlOwotCQkJCWJhc2UgPSBpb3JlbWFwKGJhc2VzW2N1cnJlbnRfYmFzZV0uYWRkcmVzcywgMHgyMDAwKTsKLQkJCQlpZiAoIWJhc2UpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWZvciAoc2lnID0gMDsgc2lnIDwgTk9fU0lHTkFUVVJFUzsgKytzaWcpIHsKLQkJCQkJaWYgKGNoZWNrX3NpZ25hdHVyZShiYXNlICsgc2lnbmF0dXJlc1tzaWddLm9mZnNldCwgc2lnbmF0dXJlc1tzaWddLnN0cmluZywgc3RybGVuKHNpZ25hdHVyZXNbc2lnXS5zdHJpbmcpKSkgewotCQkJCQkJYWRkciA9IGJhc2VzW2N1cnJlbnRfYmFzZV0uYWRkcmVzczsKLQkJCQkJCWRwcmludGsoTkRFQlVHX0lOSVQsICJkdGM6IGRldGVjdGVkIGJvYXJkXG4iKTsKLQkJCQkJCWdvdG8gZm91bmQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaW91bm1hcChiYXNlKTsKLQkJCX0KLQotCQlkcHJpbnRrKE5ERUJVR19JTklULCAiZHRjOiBhZGRyID0gMHglMDh4XG4iLCBhZGRyKTsKLQotCQlpZiAoIWFkZHIpCi0JCQlicmVhazsKLQotZm91bmQ6Ci0JCWluc3RhbmNlID0gc2NzaV9yZWdpc3Rlcih0cG50LCBzaXplb2Yoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEpKTsKLQkJaWYgKGluc3RhbmNlID09IE5VTEwpCi0JCQlnb3RvIG91dF91bm1hcDsKLQotCQlpbnN0YW5jZS0+YmFzZSA9IGFkZHI7Ci0JCSgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKikoaW5zdGFuY2UpLT5ob3N0ZGF0YSktPmJhc2UgPSBiYXNlOwotCi0JCWlmIChOQ1I1MzgwX2luaXQoaW5zdGFuY2UsIEZMQUdfTEFURV9ETUFfU0VUVVApKQotCQkJZ290byBvdXRfdW5yZWdpc3RlcjsKLQotCQlOQ1I1MzgwX21heWJlX3Jlc2V0X2J1cyhpbnN0YW5jZSk7Ci0KLQkJTkNSNTM4MF93cml0ZShEVENfQ09OVFJPTF9SRUcsIENTUl81MzgwX0lOVFIpOwkvKiBFbmFibGUgaW50J3MgKi8KLQkJaWYgKG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5pcnEgIT0gSVJRX0FVVE8pCi0JCQlpbnN0YW5jZS0+aXJxID0gb3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlycTsKLQkJZWxzZQotCQkJaW5zdGFuY2UtPmlycSA9IE5DUjUzODBfcHJvYmVfaXJxKGluc3RhbmNlLCBEVENfSVJRUyk7Ci0KLQkJLyogQ29tcGF0aWJpbGl0eSB3aXRoIGRvY3VtZW50ZWQgTkNSNTM4MCBrZXJuZWwgcGFyYW1ldGVycyAqLwotCQlpZiAoaW5zdGFuY2UtPmlycSA9PSAyNTUpCi0JCQlpbnN0YW5jZS0+aXJxID0gTk9fSVJROwotCi0JCS8qIFdpdGggaW50ZXJydXB0cyBlbmFibGVkLCBpdCB3aWxsIHNvbWV0aW1lcyBoYW5nIHdoZW4gZG9pbmcgaGVhdnkKLQkJICogcmVhZHMuIFNvIGJldHRlciBub3QgZW5hYmxlIHRoZW0gdW50aWwgSSBmaW5nZXIgaXQgb3V0LiAqLwotCQlpbnN0YW5jZS0+aXJxID0gTk9fSVJROwotCi0JCWlmIChpbnN0YW5jZS0+aXJxICE9IE5PX0lSUSkKLQkJCWlmIChyZXF1ZXN0X2lycShpbnN0YW5jZS0+aXJxLCBkdGNfaW50ciwgMCwKLQkJCQkJImR0YyIsIGluc3RhbmNlKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAic2NzaSVkIDogSVJRJWQgbm90IGZyZWUsIGludGVycnVwdHMgZGlzYWJsZWRcbiIsIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKLQkJCQlpbnN0YW5jZS0+aXJxID0gTk9fSVJROwotCQkJfQotCi0JCWlmIChpbnN0YW5jZS0+aXJxID09IE5PX0lSUSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2NzaSVkIDogaW50ZXJydXB0cyBub3QgZW5hYmxlZC4gZm9yIGJldHRlciBpbnRlcmFjdGl2ZSBwZXJmb3JtYW5jZSxcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNjc2klZCA6IHBsZWFzZSBqdW1wZXIgdGhlIGJvYXJkIGZvciBhIGZyZWUgSVJRLlxuIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOwotCQl9Ci0KLQkJZHByaW50ayhOREVCVUdfSU5JVCwgInNjc2klZCA6IGlycSA9ICVkXG4iLAotCQkgICAgICAgIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKLQotCQkrK2N1cnJlbnRfb3ZlcnJpZGU7Ci0JCSsrY291bnQ7Ci0JfQotCXJldHVybiBjb3VudDsKLQotb3V0X3VucmVnaXN0ZXI6Ci0Jc2NzaV91bnJlZ2lzdGVyKGluc3RhbmNlKTsKLW91dF91bm1hcDoKLQlpb3VubWFwKGJhc2UpOwotCXJldHVybiBjb3VudDsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uIDogaW50IGR0Y19iaW9zcGFyYW0oRGlzayAqIGRpc2ssIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwgaW50ICppcCkKLSAqCi0gKiBQdXJwb3NlIDogR2VuZXJhdGVzIGEgQklPUyAvIERPUyBjb21wYXRpYmxlIEgtQy1TIG1hcHBpbmcgZm9yIAotICoJdGhlIHNwZWNpZmllZCBkZXZpY2UgLyBzaXplLgotICogCi0gKiBJbnB1dHMgOiBzaXplID0gc2l6ZSBvZiBkZXZpY2UgaW4gc2VjdG9ycyAoNTEyIGJ5dGVzKSwgZGV2ID0gYmxvY2sgZGV2aWNlCi0gKgltYWpvciAvIG1pbm9yLCBpcFtdID0ge2hlYWRzLCBzZWN0b3JzLCBjeWxpbmRlcnN9ICAKLSAqCi0gKiBSZXR1cm5zIDogYWx3YXlzIDAgKHN1Y2Nlc3MpLCBpbml0aWFsaXplcyBpcAotICoJCi0qLwotCi0vKiAKLSAqIFhYWCBNb3N0IFNDU0kgYm9hcmRzIHVzZSB0aGlzIG1hcHBpbmcsIEkgY291bGQgYmUgaW5jb3JyZWN0LiAgU29tZSBvbmUKLSAqIHVzaW5nIGhhcmQgZGlza3Mgb24gYSB0cmFudG9yIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGlzIG1hcHBpbmcgY29ycmVzcG9uZHMKLSAqIHRvIHRoYXQgdXNlZCBieSB0aGUgQklPUyAvIEFTUEkgZHJpdmVyIGJ5IHJ1bm5pbmcgdGhlIGxpbnV4IGZkaXNrIHByb2dyYW0KLSAqIGFuZCBtYXRjaGluZyB0aGUgSF9DX1MgY29vcmRpbmF0ZXMgdG8gd2hhdCBET1MgdXNlcy4KLSovCi0KLXN0YXRpYyBpbnQgZHRjX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwKLQkJCSBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppcCkKLXsKLQlpbnQgc2l6ZSA9IGNhcGFjaXR5OwotCi0JaXBbMF0gPSA2NDsKLQlpcFsxXSA9IDMyOwotCWlwWzJdID0gc2l6ZSA+PiAxMTsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogRnVuY3Rpb24gOiBpbnQgTkNSNTM4MF9wcmVhZCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAotICoJdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgbGVuKQotICoKLSAqIFB1cnBvc2UgOiBGYXN0IDUzODAgcHNldWRvLWRtYSByZWFkIGZ1bmN0aW9uLCByZWFkcyBsZW4gYnl0ZXMgdG8gCi0gKglkc3QKLSAqIAotICogSW5wdXRzIDogZHN0ID0gZGVzdGluYXRpb24sIGxlbiA9IGxlbmd0aCBpbiBieXRlcwotICoKLSAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3MsIG5vbiB6ZXJvIG9uIGEgZmFpbHVyZSBzdWNoIGFzIGEgd2F0Y2hkb2cgCi0gKiAJdGltZW91dC4KLSovCi0KLXN0YXRpYyBpbmxpbmUgaW50IGR0Y19wcmVhZChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4pCi17Ci0JdW5zaWduZWQgY2hhciAqZCA9IGRzdDsKLQlpbnQgaTsJCQkvKiBGb3IgY291bnRpbmcgdGltZSBzcGVudCBpbiB0aGUgcG9sbC1sb29wICovCi0Jc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhID0gc2hvc3RfcHJpdihpbnN0YW5jZSk7Ci0KLQlpID0gMDsKLQlpZiAoaW5zdGFuY2UtPmlycSA9PSBOT19JUlEpCi0JCU5DUjUzODBfd3JpdGUoRFRDX0NPTlRST0xfUkVHLCBDU1JfRElSX1JFQUQpOwotCWVsc2UKLQkJTkNSNTM4MF93cml0ZShEVENfQ09OVFJPTF9SRUcsIENTUl9ESVJfUkVBRCB8IENTUl9JTlRfQkFTRSk7Ci0JTkNSNTM4MF93cml0ZShEVENfQkxLX0NOVCwgbGVuID4+IDcpOwkvKiBCbG9jayBjb3VudCAqLwotCXJ0cmMoMSk7Ci0Jd2hpbGUgKGxlbiA+IDApIHsKLQkJcnRyYygyKTsKLQkJd2hpbGUgKE5DUjUzODBfcmVhZChEVENfQ09OVFJPTF9SRUcpICYgQ1NSX0hPU1RfQlVGX05PVF9SRFkpCi0JCQkrK2k7Ci0JCXJ0cmMoMyk7Ci0JCW1lbWNweV9mcm9taW8oZCwgaG9zdGRhdGEtPmJhc2UgKyBEVENfREFUQV9CVUYsIDEyOCk7Ci0JCWQgKz0gMTI4OwotCQlsZW4gLT0gMTI4OwotCQlydHJjKDcpOwotCQkvKioqIHdpdGggaW50J3Mgb24sIGl0IHNvbWV0aW1lcyBoYW5ncyBhZnRlciBoZXJlLgotCQkgKiBMb29rcyBsaWtlIHNvbWV0aGluZyBtYWtlcyBIQk5SIGdvIGF3YXkuICovCi0JfQotCXJ0cmMoNCk7Ci0Jd2hpbGUgKCEoTkNSNTM4MF9yZWFkKERUQ19DT05UUk9MX1JFRykgJiBEX0NSX0FDQ0VTUykpCi0JCSsraTsKLQlydHJjKDApOwotCXJldHVybiAoMCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGdW5jdGlvbiA6IGludCBOQ1I1MzgwX3B3cml0ZSAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsIAotICoJdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgbGVuKQotICoKLSAqIFB1cnBvc2UgOiBGYXN0IDUzODAgcHNldWRvLWRtYSB3cml0ZSBmdW5jdGlvbiwgdHJhbnNmZXJzIGxlbiBieXRlcyBmcm9tCi0gKglzcmMKLSAqIAotICogSW5wdXRzIDogc3JjID0gc291cmNlLCBsZW4gPSBsZW5ndGggaW4gYnl0ZXMKLSAqCi0gKiBSZXR1cm5zIDogMCBvbiBzdWNjZXNzLCBub24gemVybyBvbiBhIGZhaWx1cmUgc3VjaCBhcyBhIHdhdGNoZG9nIAotICogCXRpbWVvdXQuCi0qLwotCi1zdGF0aWMgaW5saW5lIGludCBkdGNfcHdyaXRlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0Jc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhID0gc2hvc3RfcHJpdihpbnN0YW5jZSk7Ci0KLQlpZiAoaW5zdGFuY2UtPmlycSA9PSBOT19JUlEpCi0JCU5DUjUzODBfd3JpdGUoRFRDX0NPTlRST0xfUkVHLCAwKTsKLQllbHNlCi0JCU5DUjUzODBfd3JpdGUoRFRDX0NPTlRST0xfUkVHLCBDU1JfNTM4MF9JTlRSKTsKLQlOQ1I1MzgwX3dyaXRlKERUQ19CTEtfQ05ULCBsZW4gPj4gNyk7CS8qIEJsb2NrIGNvdW50ICovCi0JZm9yIChpID0gMDsgbGVuID4gMDsgKytpKSB7Ci0JCXJ0cmMoNSk7Ci0JCS8qIFBvbGwgdW50aWwgdGhlIGhvc3QgYnVmZmVyIGNhbiBhY2NlcHQgZGF0YS4gKi8KLQkJd2hpbGUgKE5DUjUzODBfcmVhZChEVENfQ09OVFJPTF9SRUcpICYgQ1NSX0hPU1RfQlVGX05PVF9SRFkpCi0JCQkrK2k7Ci0JCXJ0cmMoMyk7Ci0JCW1lbWNweV90b2lvKGhvc3RkYXRhLT5iYXNlICsgRFRDX0RBVEFfQlVGLCBzcmMsIDEyOCk7Ci0JCXNyYyArPSAxMjg7Ci0JCWxlbiAtPSAxMjg7Ci0JfQotCXJ0cmMoNCk7Ci0Jd2hpbGUgKCEoTkNSNTM4MF9yZWFkKERUQ19DT05UUk9MX1JFRykgJiBEX0NSX0FDQ0VTUykpCi0JCSsraTsKLQlydHJjKDYpOwotCS8qIFdhaXQgdW50aWwgdGhlIGxhc3QgYnl0ZSBoYXMgYmVlbiBzZW50IHRvIHRoZSBkaXNrICovCi0Jd2hpbGUgKCEoTkNSNTM4MF9yZWFkKFRBUkdFVF9DT01NQU5EX1JFRykgJiBUQ1JfTEFTVF9CWVRFX1NFTlQpKQotCQkrK2k7Ci0JcnRyYyg3KTsKLQkvKiBDaGVjayBmb3IgcGFyaXR5IGVycm9yIGhlcmUuIGZpeG1lLiAqLwotCXJ0cmMoMCk7Ci0JcmV0dXJuICgwKTsKLX0KLQotc3RhdGljIGludCBkdGNfZG1hX3hmZXJfbGVuKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKLXsKLQlpbnQgdHJhbnNmZXJzaXplID0gY21kLT50cmFuc2ZlcnNpemU7Ci0KLQkvKiBMaW1pdCB0cmFuc2ZlcnMgdG8gMzJLLCBmb3IgeHg0MDAgJiB4eDQwNgotCSAqIHBzZXVkb0RNQSB0aGF0IHRyYW5zZmVycyBpbiAxMjggYnl0ZXMgYmxvY2tzLgotCSAqLwotCWlmICh0cmFuc2ZlcnNpemUgPiAzMiAqIDEwMjQgJiYgY21kLT5TQ3AudGhpc19yZXNpZHVhbCAmJgotCSAgICAhKGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgJSB0cmFuc2ZlcnNpemUpKQotCQl0cmFuc2ZlcnNpemUgPSAzMiAqIDEwMjQ7Ci0KLQlyZXR1cm4gdHJhbnNmZXJzaXplOwotfQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSNpbmNsdWRlICJOQ1I1MzgwLmMiCi0KLXN0YXRpYyBpbnQgZHRjX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCi17Ci0Jc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKmhvc3RkYXRhID0gc2hvc3RfcHJpdihzaG9zdCk7Ci0KLQlpZiAoc2hvc3QtPmlycSAhPSBOT19JUlEpCi0JCWZyZWVfaXJxKHNob3N0LT5pcnEsIHNob3N0KTsKLQlOQ1I1MzgwX2V4aXQoc2hvc3QpOwotCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7Ci0JaW91bm1hcChob3N0ZGF0YS0+YmFzZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKLQkubmFtZQkJCT0gIkRUQyAzMTgwLzMyODAiLAotCS5kZXRlY3QJCQk9IGR0Y19kZXRlY3QsCi0JLnJlbGVhc2UJCT0gZHRjX3JlbGVhc2UsCi0JLnByb2NfbmFtZQkJPSAiZHRjM3g4MCIsCi0JLmluZm8JCQk9IGR0Y19pbmZvLAotCS5xdWV1ZWNvbW1hbmQJCT0gZHRjX3F1ZXVlX2NvbW1hbmQsCi0JLmVoX2Fib3J0X2hhbmRsZXIJPSBkdGNfYWJvcnQsCi0JLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gZHRjX2J1c19yZXNldCwKLQkuYmlvc19wYXJhbQkJPSBkdGNfYmlvc3BhcmFtLAotCS5jYW5fcXVldWUJCT0gMzIsCi0JLnRoaXNfaWQJCT0gNywKLQkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKLQkuY21kX3Blcl9sdW4JCT0gMiwKLQkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAotCS5jbWRfc2l6ZQkJPSBOQ1I1MzgwX0NNRF9TSVpFLAotCS5tYXhfc2VjdG9ycwkJPSAxMjgsCi19OwotI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZHRjLmggYi9kcml2ZXJzL3Njc2kvZHRjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYjBhOGUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zY3NpL2R0Yy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIERUQyBjb250cm9sbGVyLCB0YWtlbiBmcm9tIFQxMjggZHJpdmVyIGJ5Li4uCi0gKiBDb3B5cmlnaHQgMTk5MywgRHJldyBFY2toYXJkdAotICoJVmlzaW9uYXJ5IENvbXB1dGluZwotICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKLSAqCWRyZXdAY29sb3JhZG8uZWR1Ci0gKiAgICAgICsxICgzMDMpIDQ0MC00ODk0Ci0gKi8KLQotI2lmbmRlZiBEVEMzMjgwX0gKLSNkZWZpbmUgRFRDMzI4MF9ICi0KLSNkZWZpbmUgTkNSNTM4MF9pbXBsZW1lbnRhdGlvbl9maWVsZHMgXAotICAgIHZvaWQgX19pb21lbSAqYmFzZQotCi0jZGVmaW5lIERUQ19hZGRyZXNzKHJlZykgXAotCSgoKHN0cnVjdCBOQ1I1MzgwX2hvc3RkYXRhICopc2hvc3RfcHJpdihpbnN0YW5jZSkpLT5iYXNlICsgRFRDXzUzODBfT0ZGU0VUICsgcmVnKQotCi0jZGVmaW5lIE5DUjUzODBfcmVhZChyZWcpIChyZWFkYihEVENfYWRkcmVzcyhyZWcpKSkKLSNkZWZpbmUgTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKSAod3JpdGViKHZhbHVlLCBEVENfYWRkcmVzcyhyZWcpKSkKLQotI2RlZmluZSBOQ1I1MzgwX2RtYV94ZmVyX2xlbihpbnN0YW5jZSwgY21kLCBwaGFzZSkgXAotICAgICAgICBkdGNfZG1hX3hmZXJfbGVuKGNtZCkKLSNkZWZpbmUgTkNSNTM4MF9kbWFfcmVjdl9zZXR1cAkJZHRjX3ByZWFkCi0jZGVmaW5lIE5DUjUzODBfZG1hX3NlbmRfc2V0dXAJCWR0Y19wd3JpdGUKLSNkZWZpbmUgTkNSNTM4MF9kbWFfcmVzaWR1YWwoaW5zdGFuY2UpCSgwKQotCi0jZGVmaW5lIE5DUjUzODBfaW50cgkJCWR0Y19pbnRyCi0jZGVmaW5lIE5DUjUzODBfcXVldWVfY29tbWFuZAkJZHRjX3F1ZXVlX2NvbW1hbmQKLSNkZWZpbmUgTkNSNTM4MF9hYm9ydAkJCWR0Y19hYm9ydAotI2RlZmluZSBOQ1I1MzgwX2J1c19yZXNldAkJZHRjX2J1c19yZXNldAotI2RlZmluZSBOQ1I1MzgwX2luZm8JCQlkdGNfaW5mbwotCi0jZGVmaW5lIE5DUjUzODBfaW9fZGVsYXkoeCkJCXVkZWxheSh4KQotCi0vKiAxNSAxMiAxMSAxMAotICAgMTAwMSAxMTAwIDAwMDAgMDAwMCAqLwotCi0jZGVmaW5lIERUQ19JUlFTIDB4OWMwMAotCi0KLSNlbmRpZiAvKiBEVEMzMjgwX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2luaXQuYyBiL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2luaXQuYwppbmRleCA3OGNlNGQ2MS4uZDZlNTNhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2VzYXMyci9lc2FzMnJfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX2luaXQuYwpAQCAtOTYzLDEwICs5NjMsNiBAQAogCiAJLyogaW5pdGlhbGl6ZSB0aGUgYWxsb2NhdGVkIG1lbW9yeSAqLwogCWlmICh0ZXN0X2JpdChBRl9GSVJTVF9JTklULCAmYS0+ZmxhZ3MpKSB7Ci0JCW1lbXNldChhLT5yZXFfdGFibGUsIDAsCi0JCSAgICAgICAobnVtX3JlcXVlc3RzICsgbnVtX2FlX3JlcXVlc3RzICsKLQkJCTEpICogc2l6ZW9mKHN0cnVjdCBlc2FzMnJfcmVxdWVzdCAqKSk7Ci0KIAkJZXNhczJyX3RhcmdfZGJfaW5pdGlhbGl6ZShhKTsKIAogCQkvKiBwcmltZSBwYXJ0cyBvZiB0aGUgaW5ib3VuZCBsaXN0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9tYWluLmMgYi9kcml2ZXJzL3Njc2kvZXNhczJyL2VzYXMycl9tYWluLmMKaW5kZXggMmFjYTRkMS4uNTA5MmM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2VzYXMyci9lc2FzMnJfbWFpbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9lc2FzMnIvZXNhczJyX21haW4uYwpAQCAtMTk0LDcgKzE5NCw3IEBACiAJaW50IGxlbmd0aCA9IG1pbihzaXplb2Yoc3RydWN0IGF0dG9faW9jdGwpLCBjb3VudCk7CiAKIAlpZiAoIWEtPmxvY2FsX2F0dG9faW9jdGwpIHsKLQkJYS0+bG9jYWxfYXR0b19pb2N0bCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdHRvX2lvY3RsKSwKKwkJYS0+bG9jYWxfYXR0b19pb2N0bCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdHRvX2lvY3RsKSwKIAkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmIChhLT5sb2NhbF9hdHRvX2lvY3RsID09IE5VTEwpIHsKIAkJCWVzYXMycl9sb2coRVNBUzJSX0xPR19XQVJOLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV90cmFuc3BvcnQuYyBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2VfdHJhbnNwb3J0LmMKaW5kZXggNzAyOGRkMy4uMzc1YzUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lX3RyYW5zcG9ydC5jCkBAIC04Myw2ICs4Myw0MSBAQAogCS5ub3RpZmllcl9jYWxsID0gbGliZmNvZV9kZXZpY2Vfbm90aWZpY2F0aW9uLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdTMyIGZjX3BvcnRfc3BlZWQ7CisjZGVmaW5lIFNQRUVEXzIwMDAJMjAwMAorI2RlZmluZSBTUEVFRF80MDAwCTQwMDAKKyNkZWZpbmUgU1BFRURfODAwMAk4MDAwCisjZGVmaW5lIFNQRUVEXzE2MDAwCTE2MDAwCisjZGVmaW5lIFNQRUVEXzMyMDAwCTMyMDAwCisJdTMyIGV0aF9wb3J0X3NwZWVkOworfSBmY29lX3BvcnRfc3BlZWRfbWFwcGluZ1tdID0geworCXsgRkNfUE9SVFNQRUVEXzFHQklULCAgIFNQRUVEXzEwMDAgICB9LAorCXsgRkNfUE9SVFNQRUVEXzJHQklULCAgIFNQRUVEXzIwMDAgICB9LAorCXsgRkNfUE9SVFNQRUVEXzRHQklULCAgIFNQRUVEXzQwMDAgICB9LAorCXsgRkNfUE9SVFNQRUVEXzhHQklULCAgIFNQRUVEXzgwMDAgICB9LAorCXsgRkNfUE9SVFNQRUVEXzEwR0JJVCwgIFNQRUVEXzEwMDAwICB9LAorCXsgRkNfUE9SVFNQRUVEXzE2R0JJVCwgIFNQRUVEXzE2MDAwICB9LAorCXsgRkNfUE9SVFNQRUVEXzIwR0JJVCwgIFNQRUVEXzIwMDAwICB9LAorCXsgRkNfUE9SVFNQRUVEXzI1R0JJVCwgIFNQRUVEXzI1MDAwICB9LAorCXsgRkNfUE9SVFNQRUVEXzMyR0JJVCwgIFNQRUVEXzMyMDAwICB9LAorCXsgRkNfUE9SVFNQRUVEXzQwR0JJVCwgIFNQRUVEXzQwMDAwICB9LAorCXsgRkNfUE9SVFNQRUVEXzUwR0JJVCwgIFNQRUVEXzUwMDAwICB9LAorCXsgRkNfUE9SVFNQRUVEXzEwMEdCSVQsIFNQRUVEXzEwMDAwMCB9LAorfTsKKworc3RhdGljIGlubGluZSB1MzIgZXRoMmZjX3NwZWVkKHUzMiBldGhfcG9ydF9zcGVlZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZjb2VfcG9ydF9zcGVlZF9tYXBwaW5nKTsgaSsrKSB7CisJCWlmIChmY29lX3BvcnRfc3BlZWRfbWFwcGluZ1tpXS5ldGhfcG9ydF9zcGVlZCA9PSBldGhfcG9ydF9zcGVlZCkKKwkJCXJldHVybiBmY29lX3BvcnRfc3BlZWRfbWFwcGluZ1tpXS5mY19wb3J0X3NwZWVkOworCX0KKworCXJldHVybiBGQ19QT1JUU1BFRURfVU5LTk9XTjsKK30KKwogLyoqCiAgKiBmY29lX2xpbmtfc3BlZWRfdXBkYXRlKCkgLSBVcGRhdGUgdGhlIHN1cHBvcnRlZCBhbmQgYWN0dWFsIGxpbmsgc3BlZWRzCiAgKiBAbHBvcnQ6IFRoZSBsb2NhbCBwb3J0IHRvIHVwZGF0ZSBzcGVlZHMgZm9yCkBAIC0xMjYsMjMgKzE2MSw3IEBACiAJCQkgICAgU1VQUE9SVEVEXzQwMDAwYmFzZUxSNF9GdWxsKSkKIAkJCWxwb3J0LT5saW5rX3N1cHBvcnRlZF9zcGVlZHMgfD0gRkNfUE9SVFNQRUVEXzQwR0JJVDsKIAotCQlzd2l0Y2ggKGVjbWQuYmFzZS5zcGVlZCkgewotCQljYXNlIFNQRUVEXzEwMDA6Ci0JCQlscG9ydC0+bGlua19zcGVlZCA9IEZDX1BPUlRTUEVFRF8xR0JJVDsKLQkJCWJyZWFrOwotCQljYXNlIFNQRUVEXzEwMDAwOgotCQkJbHBvcnQtPmxpbmtfc3BlZWQgPSBGQ19QT1JUU1BFRURfMTBHQklUOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1BFRURfMjAwMDA6Ci0JCQlscG9ydC0+bGlua19zcGVlZCA9IEZDX1BPUlRTUEVFRF8yMEdCSVQ7Ci0JCQlicmVhazsKLQkJY2FzZSBTUEVFRF80MDAwMDoKLQkJCWxwb3J0LT5saW5rX3NwZWVkID0gRkNfUE9SVFNQRUVEXzQwR0JJVDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbHBvcnQtPmxpbmtfc3BlZWQgPSBGQ19QT1JUU1BFRURfVU5LTk9XTjsKLQkJCWJyZWFrOwotCQl9CisJCWxwb3J0LT5saW5rX3NwZWVkID0gZXRoMmZjX3NwZWVkKGVjbWQuYmFzZS5zcGVlZCk7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaGlzaV9zYXMvaGlzaV9zYXMuaCBiL2RyaXZlcnMvc2NzaS9oaXNpX3Nhcy9oaXNpX3Nhcy5oCmluZGV4IDQ3MzFkMzIuLjcyYzk4NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9oaXNpX3Nhcy9oaXNpX3Nhcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9oaXNpX3Nhcy9oaXNpX3Nhcy5oCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8c2NzaS9zYXNfYXRhLmg+CiAjaW5jbHVkZSA8c2NzaS9saWJzYXMuaD4KIAotI2RlZmluZSBEUlZfVkVSU0lPTiAidjEuNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gInYxLjYiCiAKICNkZWZpbmUgSElTSV9TQVNfTUFYX1BIWVMJOQogI2RlZmluZSBISVNJX1NBU19NQVhfUVVFVUVTCTMyCkBAIC01Niw2ICs1NiwxMSBAQAogCUhJU0lfU0FTX0RFVl9FSCwKIH07CiAKK2VudW0geworCUhJU0lfU0FTX0lOVF9BQlRfQ01EID0gMCwKKwlISVNJX1NBU19JTlRfQUJUX0RFViA9IDEsCit9OworCiBlbnVtIGhpc2lfc2FzX2Rldl90eXBlIHsKIAlISVNJX1NBU19ERVZfVFlQRV9TVFAgPSAwLAogCUhJU0lfU0FTX0RFVl9UWVBFX1NTUCwKQEAgLTg5LDYgKzk0LDEzIEBACiAKIHN0cnVjdCBoaXNpX3Nhc19jcSB7CiAJc3RydWN0IGhpc2lfaGJhICpoaXNpX2hiYTsKKwlpbnQJcmRfcG9pbnQ7CisJaW50CWlkOworfTsKKworc3RydWN0IGhpc2lfc2FzX2RxIHsKKwlzdHJ1Y3QgaGlzaV9oYmEgKmhpc2lfaGJhOworCWludAl3cl9wb2ludDsKIAlpbnQJaWQ7CiB9OwogCkBAIC0xNDYsNiArMTU4LDkgQEAKIAkJCXN0cnVjdCBoaXNpX3Nhc19zbG90ICpzbG90KTsKIAlpbnQgKCpwcmVwX3N0cCkoc3RydWN0IGhpc2lfaGJhICpoaXNpX2hiYSwKIAkJCXN0cnVjdCBoaXNpX3Nhc19zbG90ICpzbG90KTsKKwlpbnQgKCpwcmVwX2Fib3J0KShzdHJ1Y3QgaGlzaV9oYmEgKmhpc2lfaGJhLAorCQkJICBzdHJ1Y3QgaGlzaV9zYXNfc2xvdCAqc2xvdCwKKwkJCSAgaW50IGRldmljZV9pZCwgaW50IGFib3J0X2ZsYWcsIGludCB0YWdfdG9fYWJvcnQpOwogCWludCAoKnNsb3RfY29tcGxldGUpKHN0cnVjdCBoaXNpX2hiYSAqaGlzaV9oYmEsCiAJCQkgICAgIHN0cnVjdCBoaXNpX3Nhc19zbG90ICpzbG90LCBpbnQgYWJvcnQpOwogCXZvaWQgKCpwaHlfZW5hYmxlKShzdHJ1Y3QgaGlzaV9oYmEgKmhpc2lfaGJhLCBpbnQgcGh5X25vKTsKQEAgLTE4NSw2ICsyMDAsNyBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OwogCiAJc3RydWN0IGhpc2lfc2FzX2NxIGNxW0hJU0lfU0FTX01BWF9RVUVVRVNdOworCXN0cnVjdCBoaXNpX3Nhc19kcSBkcVtISVNJX1NBU19NQVhfUVVFVUVTXTsKIAlzdHJ1Y3QgaGlzaV9zYXNfcGh5IHBoeVtISVNJX1NBU19NQVhfUEhZU107CiAJc3RydWN0IGhpc2lfc2FzX3BvcnQgcG9ydFtISVNJX1NBU19NQVhfUEhZU107CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9oaXNpX3Nhcy9oaXNpX3Nhc19tYWluLmMgYi9kcml2ZXJzL3Njc2kvaGlzaV9zYXMvaGlzaV9zYXNfbWFpbi5jCmluZGV4IDE4ZGQ1ZWEuLjJmODcyZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9oaXNpX3Nhcy9oaXNpX3Nhc19tYWluLmMKKysrIGIvZHJpdmVycy9zY3NpL2hpc2lfc2FzL2hpc2lfc2FzX21haW4uYwpAQCAtMTcsNiArMTcsMTAgQEAKIAogc3RhdGljIGludCBoaXNpX3Nhc19kZWJ1Z19pc3N1ZV9zc3BfdG1mKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXZpY2UsCiAJCQkJdTggKmx1biwgc3RydWN0IGhpc2lfc2FzX3RtZl90YXNrICp0bWYpOworc3RhdGljIGludAoraGlzaV9zYXNfaW50ZXJuYWxfdGFza19hYm9ydChzdHJ1Y3QgaGlzaV9oYmEgKmhpc2lfaGJhLAorCQkJICAgICBzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2aWNlLAorCQkJICAgICBpbnQgYWJvcnRfZmxhZywgaW50IHRhZyk7CiAKIHN0YXRpYyBzdHJ1Y3QgaGlzaV9oYmEgKmRldl90b19oaXNpX2hiYShzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2aWNlKQogewpAQCAtOTMsNyArOTcsNyBAQAogCXNsb3QtPnRhc2sgPSBOVUxMOwogCXNsb3QtPnBvcnQgPSBOVUxMOwogCWhpc2lfc2FzX3Nsb3RfaW5kZXhfZnJlZShoaXNpX2hiYSwgc2xvdC0+aWR4KTsKLQltZW1zZXQoc2xvdCwgMCwgc2l6ZW9mKCpzbG90KSk7CisJLyogc2xvdCBtZW1vcnkgaXMgZnVsbHkgemVyb2VkIHdoZW4gaXQgaXMgcmV1c2VkICovCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChoaXNpX3Nhc19zbG90X3Rhc2tfZnJlZSk7CiAKQEAgLTExNiw2ICsxMjAsMTQgQEAKIAlyZXR1cm4gaGlzaV9oYmEtPmh3LT5wcmVwX3N0cChoaXNpX2hiYSwgc2xvdCk7CiB9CiAKK3N0YXRpYyBpbnQgaGlzaV9zYXNfdGFza19wcmVwX2Fib3J0KHN0cnVjdCBoaXNpX2hiYSAqaGlzaV9oYmEsCisJCXN0cnVjdCBoaXNpX3Nhc19zbG90ICpzbG90LAorCQlpbnQgZGV2aWNlX2lkLCBpbnQgYWJvcnRfZmxhZywgaW50IHRhZ190b19hYm9ydCkKK3sKKwlyZXR1cm4gaGlzaV9oYmEtPmh3LT5wcmVwX2Fib3J0KGhpc2lfaGJhLCBzbG90LAorCQkJZGV2aWNlX2lkLCBhYm9ydF9mbGFnLCB0YWdfdG9fYWJvcnQpOworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiB3aWxsIGlzc3VlIGFuIGFib3J0IFRNRiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlCiAgKiB0YXNrIGlzIGluIHRoZSBzZGV2IG9yIG5vdC4gVGhlbiBpdCB3aWxsIGRvIHRoZSB0YXNrIGNvbXBsZXRlCkBAIC0xOTIsMjcgKzIwNCwxMyBAQAogCQlyZXR1cm4gcmM7CiAJfQogCXBvcnQgPSBkZXZpY2UtPnBvcnQtPmxsZGRfcG9ydDsKLQlpZiAocG9ydCAmJiAhcG9ydC0+cG9ydF9hdHRhY2hlZCAmJiAhdG1mKSB7Ci0JCWlmIChzYXNfcHJvdG9jb2xfYXRhKHRhc2stPnRhc2tfcHJvdG8pKSB7Ci0JCQlzdHJ1Y3QgdGFza19zdGF0dXNfc3RydWN0ICp0cyA9ICZ0YXNrLT50YXNrX3N0YXR1czsKKwlpZiAocG9ydCAmJiAhcG9ydC0+cG9ydF9hdHRhY2hlZCkgeworCQlkZXZfaW5mbyhkZXYsICJ0YXNrIHByZXA6ICVzIHBvcnQlZCBub3QgYXR0YWNoIGRldmljZVxuIiwKKwkJCSAoc2FzX3Byb3RvY29sX2F0YSh0YXNrLT50YXNrX3Byb3RvKSkgPworCQkJICJTQVRBL1NUUCIgOiAiU0FTIiwKKwkJCSBkZXZpY2UtPnBvcnQtPmlkKTsKIAotCQkJZGV2X2luZm8oZGV2LAotCQkJCSAidGFzayBwcmVwOiBTQVRBL1NUUCBwb3J0JWQgbm90IGF0dGFjaCBkZXZpY2VcbiIsCi0JCQkJIGRldmljZS0+cG9ydC0+aWQpOwotCQkJdHMtPnJlc3AgPSBTQVNfVEFTS19DT01QTEVURTsKLQkJCXRzLT5zdGF0ID0gU0FTX1BIWV9ET1dOOwotCQkJdGFzay0+dGFza19kb25lKHRhc2spOwotCQl9IGVsc2UgewotCQkJc3RydWN0IHRhc2tfc3RhdHVzX3N0cnVjdCAqdHMgPSAmdGFzay0+dGFza19zdGF0dXM7Ci0KLQkJCWRldl9pbmZvKGRldiwKLQkJCQkgInRhc2sgcHJlcDogU0FTIHBvcnQlZCBkb2VzIG5vdCBhdHRhY2ggZGV2aWNlXG4iLAotCQkJCSBkZXZpY2UtPnBvcnQtPmlkKTsKLQkJCXRzLT5yZXNwID0gU0FTX1RBU0tfVU5ERUxJVkVSRUQ7Ci0JCQl0cy0+c3RhdCA9IFNBU19QSFlfRE9XTjsKLQkJCXRhc2stPnRhc2tfZG9uZSh0YXNrKTsKLQkJfQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIFNBU19QSFlfRE9XTjsKIAl9CiAKIAlpZiAoIXNhc19wcm90b2NvbF9hdGEodGFzay0+dGFza19wcm90bykpIHsKQEAgLTYwOSw2ICs2MDcsOSBAQAogCWRldl9pbmZvKGRldiwgImZvdW5kIGRldlslbGxkOiV4XSBpcyBnb25lXG4iLAogCQkgc2FzX2Rldi0+ZGV2aWNlX2lkLCBzYXNfZGV2LT5kZXZfdHlwZSk7CiAKKwloaXNpX3Nhc19pbnRlcm5hbF90YXNrX2Fib3J0KGhpc2lfaGJhLCBkZXZpY2UsCisJCQkJICAgICBISVNJX1NBU19JTlRfQUJUX0RFViwgMCk7CisKIAloaXNpX2hiYS0+aHctPmZyZWVfZGV2aWNlKGhpc2lfaGJhLCBzYXNfZGV2KTsKIAlkZXZpY2UtPmxsZGRfZGV2ID0gTlVMTDsKIAltZW1zZXQoc2FzX2RldiwgMCwgc2l6ZW9mKCpzYXNfZGV2KSk7CkBAIC03MjksNiArNzMwLDEyIEBACiAJCX0KIAogCQlpZiAodGFzay0+dGFza19zdGF0dXMucmVzcCA9PSBTQVNfVEFTS19DT01QTEVURSAmJgorCQkJdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBUTUZfUkVTUF9GVU5DX1NVQ0MpIHsKKwkJCXJlcyA9IFRNRl9SRVNQX0ZVTkNfU1VDQzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKIAkJICAgICAgdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBTQVNfREFUQV9VTkRFUlJVTikgewogCQkJLyogbm8gZXJyb3IsIGJ1dCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZgogCQkJICogdW5kZXJydW4KQEAgLTgyNiwxOCArODMzLDIyIEBACiAJCQl9CiAJCX0KIAorCQloaXNpX3Nhc19pbnRlcm5hbF90YXNrX2Fib3J0KGhpc2lfaGJhLCBkZXZpY2UsCisJCQkJCSAgICAgSElTSV9TQVNfSU5UX0FCVF9DTUQsIHRhZyk7CiAJfSBlbHNlIGlmICh0YXNrLT50YXNrX3Byb3RvICYgU0FTX1BST1RPQ09MX1NBVEEgfHwKIAkJdGFzay0+dGFza19wcm90byAmIFNBU19QUk9UT0NPTF9TVFApIHsKIAkJaWYgKHRhc2stPmRldi0+ZGV2X3R5cGUgPT0gU0FTX1NBVEFfREVWKSB7Ci0JCQlzdHJ1Y3QgaGlzaV9zbG90X2luZm8gKnNsb3QgPSB0YXNrLT5sbGRkX3Rhc2s7Ci0KLQkJCWRldl9ub3RpY2UoZGV2LCAiYWJvcnQgdGFzazogaGJhPSVwIHRhc2s9JXAgc2xvdD0lcFxuIiwKLQkJCQkgICBoaXNpX2hiYSwgdGFzaywgc2xvdCk7Ci0JCQl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX1NUQVRFX0FCT1JURUQ7CisJCQloaXNpX3Nhc19pbnRlcm5hbF90YXNrX2Fib3J0KGhpc2lfaGJhLCBkZXZpY2UsCisJCQkJCQkgICAgIEhJU0lfU0FTX0lOVF9BQlRfREVWLCAwKTsKIAkJCXJjID0gVE1GX1JFU1BfRlVOQ19DT01QTEVURTsKLQkJCWdvdG8gb3V0OwogCQl9CisJfSBlbHNlIGlmICh0YXNrLT50YXNrX3Byb3RvICYgU0FTX1BST1RPQ09MX1NNUCkgeworCQkvKiBTTVAgKi8KKwkJc3RydWN0IGhpc2lfc2FzX3Nsb3QgKnNsb3QgPSB0YXNrLT5sbGRkX3Rhc2s7CisJCXUzMiB0YWcgPSBzbG90LT5pZHg7CiAKKwkJaGlzaV9zYXNfaW50ZXJuYWxfdGFza19hYm9ydChoaXNpX2hiYSwgZGV2aWNlLAorCQkJCQkgICAgIEhJU0lfU0FTX0lOVF9BQlRfQ01ELCB0YWcpOwogCX0KIAogb3V0OgpAQCAtOTU0LDYgKzk2NSwxNTcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQKK2hpc2lfc2FzX2ludGVybmFsX2Fib3J0X3Rhc2tfZXhlYyhzdHJ1Y3QgaGlzaV9oYmEgKmhpc2lfaGJhLCB1NjQgZGV2aWNlX2lkLAorCQkJCSAgc3RydWN0IHNhc190YXNrICp0YXNrLCBpbnQgYWJvcnRfZmxhZywKKwkJCQkgIGludCB0YXNrX3RhZykKK3sKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2aWNlID0gdGFzay0+ZGV2OworCXN0cnVjdCBoaXNpX3Nhc19kZXZpY2UgKnNhc19kZXYgPSBkZXZpY2UtPmxsZGRfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZoaXNpX2hiYS0+cGRldi0+ZGV2OworCXN0cnVjdCBoaXNpX3Nhc19wb3J0ICpwb3J0OworCXN0cnVjdCBoaXNpX3Nhc19zbG90ICpzbG90OworCXN0cnVjdCBoaXNpX3Nhc19jbWRfaGRyICpjbWRfaGRyX2Jhc2U7CisJaW50IGRsdnJ5X3F1ZXVlX3Nsb3QsIGRsdnJ5X3F1ZXVlLCBuX2VsZW0gPSAwLCByYywgc2xvdF9pZHg7CisKKwlpZiAoIWRldmljZS0+cG9ydCkKKwkJcmV0dXJuIC0xOworCisJcG9ydCA9IGRldmljZS0+cG9ydC0+bGxkZF9wb3J0OworCisJLyogc2ltcGx5IGdldCBhIHNsb3QgYW5kIHNlbmQgYWJvcnQgY29tbWFuZCAqLworCXJjID0gaGlzaV9zYXNfc2xvdF9pbmRleF9hbGxvYyhoaXNpX2hiYSwgJnNsb3RfaWR4KTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dDsKKwlyYyA9IGhpc2lfaGJhLT5ody0+Z2V0X2ZyZWVfc2xvdChoaXNpX2hiYSwgJmRsdnJ5X3F1ZXVlLAorCQkJCQkgJmRsdnJ5X3F1ZXVlX3Nsb3QpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0X3RhZzsKKworCXNsb3QgPSAmaGlzaV9oYmEtPnNsb3RfaW5mb1tzbG90X2lkeF07CisJbWVtc2V0KHNsb3QsIDAsIHNpemVvZihzdHJ1Y3QgaGlzaV9zYXNfc2xvdCkpOworCisJc2xvdC0+aWR4ID0gc2xvdF9pZHg7CisJc2xvdC0+bl9lbGVtID0gbl9lbGVtOworCXNsb3QtPmRsdnJ5X3F1ZXVlID0gZGx2cnlfcXVldWU7CisJc2xvdC0+ZGx2cnlfcXVldWVfc2xvdCA9IGRsdnJ5X3F1ZXVlX3Nsb3Q7CisJY21kX2hkcl9iYXNlID0gaGlzaV9oYmEtPmNtZF9oZHJbZGx2cnlfcXVldWVdOworCXNsb3QtPmNtZF9oZHIgPSAmY21kX2hkcl9iYXNlW2RsdnJ5X3F1ZXVlX3Nsb3RdOworCXNsb3QtPnRhc2sgPSB0YXNrOworCXNsb3QtPnBvcnQgPSBwb3J0OworCXRhc2stPmxsZGRfdGFzayA9IHNsb3Q7CisKKwltZW1zZXQoc2xvdC0+Y21kX2hkciwgMCwgc2l6ZW9mKHN0cnVjdCBoaXNpX3Nhc19jbWRfaGRyKSk7CisKKwlyYyA9IGhpc2lfc2FzX3Rhc2tfcHJlcF9hYm9ydChoaXNpX2hiYSwgc2xvdCwgZGV2aWNlX2lkLAorCQkJCSAgICAgIGFib3J0X2ZsYWcsIHRhc2tfdGFnKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF90YWc7CisKKwkvKiBQb3J0IHN0cnVjdHVyZSBpcyBzdGF0aWMgZm9yIHRoZSBIQkEsIHNvCisJKiAgZXZlbiBpZiB0aGUgcG9ydCBpcyBkZWZvcm1lZCBpdCBpcyBvaworCSogIHRvIHJlZmVyZW5jZS4KKwkqLworCWxpc3RfYWRkX3RhaWwoJnNsb3QtPmVudHJ5LCAmcG9ydC0+bGlzdCk7CisJc3Bpbl9sb2NrKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOworCXRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgfD0gU0FTX1RBU0tfQVRfSU5JVElBVE9SOworCXNwaW5fdW5sb2NrKCZ0YXNrLT50YXNrX3N0YXRlX2xvY2spOworCisJaGlzaV9oYmEtPnNsb3RfcHJlcCA9IHNsb3Q7CisKKwlzYXNfZGV2LT5ydW5uaW5nX3JlcSsrOworCS8qIHNlbmQgYWJvcnQgY29tbWFuZCB0byBvdXIgY2hpcCAqLworCWhpc2lfaGJhLT5ody0+c3RhcnRfZGVsaXZlcnkoaGlzaV9oYmEpOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfdGFnOgorCWhpc2lfc2FzX3Nsb3RfaW5kZXhfZnJlZShoaXNpX2hiYSwgc2xvdF9pZHgpOworZXJyX291dDoKKwlkZXZfZXJyKGRldiwgImludGVybmFsIGFib3J0IHRhc2sgcHJlcDogZmFpbGVkWyVkXSFcbiIsIHJjKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBoaXNpX3Nhc19pbnRlcm5hbF90YXNrX2Fib3J0IC0tIGV4ZWN1dGUgYW4gaW50ZXJuYWwKKyAqIGFib3J0IGNvbW1hbmQgZm9yIHNpbmdsZSBJTyBjb21tYW5kIG9yIGEgZGV2aWNlCisgKiBAaGlzaV9oYmE6IGhvc3QgY29udHJvbGxlciBzdHJ1Y3QKKyAqIEBkZXZpY2U6IGRvbWFpbiBkZXZpY2UKKyAqIEBhYm9ydF9mbGFnOiBtb2RlIG9mIG9wZXJhdGlvbiwgZGV2aWNlIG9yIHNpbmdsZSBJTworICogQHRhZzogdGFnIG9mIElPIHRvIGJlIGFib3J0ZWQgKG9ubHkgcmVsZXZhbnQgdG8gc2luZ2xlCisgKiAgICAgICBJTyBtb2RlKQorICovCitzdGF0aWMgaW50CitoaXNpX3Nhc19pbnRlcm5hbF90YXNrX2Fib3J0KHN0cnVjdCBoaXNpX2hiYSAqaGlzaV9oYmEsCisJCQkgICAgIHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXZpY2UsCisJCQkgICAgIGludCBhYm9ydF9mbGFnLCBpbnQgdGFnKQoreworCXN0cnVjdCBzYXNfdGFzayAqdGFzazsKKwlzdHJ1Y3QgaGlzaV9zYXNfZGV2aWNlICpzYXNfZGV2ID0gZGV2aWNlLT5sbGRkX2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaGlzaV9oYmEtPnBkZXYtPmRldjsKKwlpbnQgcmVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWhpc2lfaGJhLT5ody0+cHJlcF9hYm9ydCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJdGFzayA9IHNhc19hbGxvY19zbG93X3Rhc2soR0ZQX0tFUk5FTCk7CisJaWYgKCF0YXNrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRhc2stPmRldiA9IGRldmljZTsKKwl0YXNrLT50YXNrX3Byb3RvID0gZGV2aWNlLT50cHJvdG87CisJdGFzay0+dGFza19kb25lID0gaGlzaV9zYXNfdGFza19kb25lOworCXRhc2stPnNsb3dfdGFzay0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXRhc2s7CisJdGFzay0+c2xvd190YXNrLT50aW1lci5mdW5jdGlvbiA9IGhpc2lfc2FzX3RtZl90aW1lZG91dDsKKwl0YXNrLT5zbG93X3Rhc2stPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMjAqSFo7CisJYWRkX3RpbWVyKCZ0YXNrLT5zbG93X3Rhc2stPnRpbWVyKTsKKworCS8qIExvY2sgYXMgd2UgYXJlIGFsbG9jJ2luZyBhIHNsb3QsIHdoaWNoIGNhbm5vdCBiZSBpbnRlcnJ1cHRlZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZoaXNpX2hiYS0+bG9jaywgZmxhZ3MpOworCXJlcyA9IGhpc2lfc2FzX2ludGVybmFsX2Fib3J0X3Rhc2tfZXhlYyhoaXNpX2hiYSwgc2FzX2Rldi0+ZGV2aWNlX2lkLAorCQkJCQkJdGFzaywgYWJvcnRfZmxhZywgdGFnKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoaXNpX2hiYS0+bG9jaywgZmxhZ3MpOworCWlmIChyZXMpIHsKKwkJZGVsX3RpbWVyKCZ0YXNrLT5zbG93X3Rhc2stPnRpbWVyKTsKKwkJZGV2X2VycihkZXYsICJpbnRlcm5hbCB0YXNrIGFib3J0OiBleGVjdXRpbmcgaW50ZXJuYWwgdGFzayBmYWlsZWQ6ICVkXG4iLAorCQkJcmVzKTsKKwkJZ290byBleGl0OworCX0KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ0YXNrLT5zbG93X3Rhc2stPmNvbXBsZXRpb24pOworCXJlcyA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCisJaWYgKHRhc2stPnRhc2tfc3RhdHVzLnJlc3AgPT0gU0FTX1RBU0tfQ09NUExFVEUgJiYKKwkJdGFzay0+dGFza19zdGF0dXMuc3RhdCA9PSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFKSB7CisJCXJlcyA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBUTUYgdGltZWQgb3V0LCByZXR1cm4gZGlyZWN0LiAqLworCWlmICgodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0FCT1JURUQpKSB7CisJCWlmICghKHRhc2stPnRhc2tfc3RhdGVfZmxhZ3MgJiBTQVNfVEFTS19TVEFURV9ET05FKSkgeworCQkJZGV2X2VycihkZXYsICJpbnRlcm5hbCB0YXNrIGFib3J0OiB0aW1lb3V0LlxuIik7CisJCQlpZiAodGFzay0+bGxkZF90YXNrKSB7CisJCQkJc3RydWN0IGhpc2lfc2FzX3Nsb3QgKnNsb3QgPSB0YXNrLT5sbGRkX3Rhc2s7CisKKwkJCQloaXNpX3Nhc19zbG90X3Rhc2tfZnJlZShoaXNpX2hiYSwgdGFzaywgc2xvdCk7CisJCQl9CisJCX0KKwl9CisKK2V4aXQ6CisJZGV2X2luZm8oZGV2LCAiaW50ZXJuYWwgdGFzayBhYm9ydDogdGFzayB0byBkZXYgJTAxNmxseCB0YXNrPSVwICIKKwkJInJlc3A6IDB4JXggc3RzIDB4JXhcbiIsCisJCVNBU19BRERSKGRldmljZS0+c2FzX2FkZHIpLAorCQl0YXNrLAorCQl0YXNrLT50YXNrX3N0YXR1cy5yZXNwLCAvKiAwIGlzIGNvbXBsZXRlLCAtMSBpcyB1bmRlbGl2ZXJlZCAqLworCQl0YXNrLT50YXNrX3N0YXR1cy5zdGF0KTsKKwlzYXNfZnJlZV90YXNrKHRhc2spOworCisJcmV0dXJuIHJlczsKK30KKwogc3RhdGljIHZvaWQgaGlzaV9zYXNfcG9ydF9mb3JtZWQoc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5KQogewogCWhpc2lfc2FzX3BvcnRfbm90aWZ5X2Zvcm1lZChzYXNfcGh5KTsKQEAgLTEwNjMsMTEgKzEyMjUsMTYgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBoaXNpX2hiYS0+cXVldWVfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgaGlzaV9zYXNfY3EgKmNxID0gJmhpc2lfaGJhLT5jcVtpXTsKKwkJc3RydWN0IGhpc2lfc2FzX2RxICpkcSA9ICZoaXNpX2hiYS0+ZHFbaV07CiAKIAkJLyogQ29tcGxldGlvbiBxdWV1ZSBzdHJ1Y3R1cmUgKi8KIAkJY3EtPmlkID0gaTsKIAkJY3EtPmhpc2lfaGJhID0gaGlzaV9oYmE7CiAKKwkJLyogRGVsaXZlcnkgcXVldWUgc3RydWN0dXJlICovCisJCWRxLT5pZCA9IGk7CisJCWRxLT5oaXNpX2hiYSA9IGhpc2lfaGJhOworCiAJCS8qIERlbGl2ZXJ5IHF1ZXVlICovCiAJCXMgPSBzaXplb2Yoc3RydWN0IGhpc2lfc2FzX2NtZF9oZHIpICogSElTSV9TQVNfUVVFVUVfU0xPVFM7CiAJCWhpc2lfaGJhLT5jbWRfaGRyW2ldID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgcywKQEAgLTExMjgsNyArMTI5NSw3IEBACiAJbWVtc2V0KGhpc2lfaGJhLT5icmVha3BvaW50LCAwLCBzKTsKIAogCWhpc2lfaGJhLT5zbG90X2luZGV4X2NvdW50ID0gbWF4X2NvbW1hbmRfZW50cmllczsKLQlzID0gaGlzaV9oYmEtPnNsb3RfaW5kZXhfY291bnQgLyBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJcyA9IGhpc2lfaGJhLT5zbG90X2luZGV4X2NvdW50IC8gQklUU19QRVJfQllURTsKIAloaXNpX2hiYS0+c2xvdF9pbmRleF90YWdzID0gZGV2bV9remFsbG9jKGRldiwgcywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFoaXNpX2hiYS0+c2xvdF9pbmRleF90YWdzKQogCQlnb3RvIGVycl9vdXQ7CkBAIC0xMjcyLDYgKzE0MzksMTIgQEAKIAkJCQkgICAgICZoaXNpX2hiYS0+cXVldWVfY291bnQpKQogCQlnb3RvIGVycl9vdXQ7CiAKKwlpZiAoZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSyg2NCkpICYmCisJICAgIGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoZGV2LCBETUFfQklUX01BU0soMzIpKSkgeworCQlkZXZfZXJyKGRldiwgIk5vIHVzYWJsZSBETUEgYWRkcmVzc2luZyBtZXRob2RcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAloaXNpX2hiYS0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CiAJaWYgKElTX0VSUihoaXNpX2hiYS0+cmVncykpCkBAIC0xMzE5LDEzICsxNDkyLDYgQEAKIAloaXNpX2hiYSA9IHNob3N0X3ByaXYoc2hvc3QpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNoYSk7CiAKLQlpZiAoZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSyg2NCkpICYmCi0JICAgIGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoZGV2LCBETUFfQklUX01BU0soMzIpKSkgewotCQlkZXZfZXJyKGRldiwgIk5vIHVzYWJsZSBETUEgYWRkcmVzc2luZyBtZXRob2RcbiIpOwotCQlyYyA9IC1FSU87Ci0JCWdvdG8gZXJyX291dF9oYTsKLQl9Ci0KIAlwaHlfbnIgPSBwb3J0X25yID0gaGlzaV9oYmEtPm5fcGh5OwogCiAJYXJyX3BoeSA9IGRldm1fa2NhbGxvYyhkZXYsIHBoeV9uciwgc2l6ZW9mKHZvaWQgKiksIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hpc2lfc2FzL2hpc2lfc2FzX3YxX2h3LmMgYi9kcml2ZXJzL3Njc2kvaGlzaV9zYXMvaGlzaV9zYXNfdjFfaHcuYwppbmRleCAxYWJiYzJlLi5jMGFjNDlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaGlzaV9zYXMvaGlzaV9zYXNfdjFfaHcuYworKysgYi9kcml2ZXJzL3Njc2kvaGlzaV9zYXMvaGlzaV9zYXNfdjFfaHcuYwpAQCAtNDkwLDI1ICs0OTAsMTcgQEAKIAloaXNpX3Nhc19waHlfd3JpdGUzMihoaXNpX2hiYSwgcGh5X25vLCBUWF9JRF9EV09SRDAsCiAJCQlfX3N3YWIzMihpZGVudGlmeV9idWZmZXJbMF0pKTsKIAloaXNpX3Nhc19waHlfd3JpdGUzMihoaXNpX2hiYSwgcGh5X25vLCBUWF9JRF9EV09SRDEsCi0JCQlpZGVudGlmeV9idWZmZXJbMl0pOworCQkJX19zd2FiMzIoaWRlbnRpZnlfYnVmZmVyWzFdKSk7CiAJaGlzaV9zYXNfcGh5X3dyaXRlMzIoaGlzaV9oYmEsIHBoeV9ubywgVFhfSURfRFdPUkQyLAotCQkJaWRlbnRpZnlfYnVmZmVyWzFdKTsKKwkJCV9fc3dhYjMyKGlkZW50aWZ5X2J1ZmZlclsyXSkpOwogCWhpc2lfc2FzX3BoeV93cml0ZTMyKGhpc2lfaGJhLCBwaHlfbm8sIFRYX0lEX0RXT1JEMywKLQkJCWlkZW50aWZ5X2J1ZmZlcls0XSk7CisJCQlfX3N3YWIzMihpZGVudGlmeV9idWZmZXJbM10pKTsKIAloaXNpX3Nhc19waHlfd3JpdGUzMihoaXNpX2hiYSwgcGh5X25vLCBUWF9JRF9EV09SRDQsCi0JCQlpZGVudGlmeV9idWZmZXJbM10pOworCQkJX19zd2FiMzIoaWRlbnRpZnlfYnVmZmVyWzRdKSk7CiAJaGlzaV9zYXNfcGh5X3dyaXRlMzIoaGlzaV9oYmEsIHBoeV9ubywgVFhfSURfRFdPUkQ1LAogCQkJX19zd2FiMzIoaWRlbnRpZnlfYnVmZmVyWzVdKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGluaXRfaWRfZnJhbWVfdjFfaHcoc3RydWN0IGhpc2lfaGJhICpoaXNpX2hiYSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBoaXNpX2hiYS0+bl9waHk7IGkrKykKLQkJY29uZmlnX2lkX2ZyYW1lX3YxX2h3KGhpc2lfaGJhLCBpKTsKLX0KLQogc3RhdGljIHZvaWQgc2V0dXBfaXRjdF92MV9odyhzdHJ1Y3QgaGlzaV9oYmEgKmhpc2lfaGJhLAogCQkJICAgICBzdHJ1Y3QgaGlzaV9zYXNfZGV2aWNlICpzYXNfZGV2KQogewpAQCAtNzc0LDggKzc2Niw2IEBACiAJbXNsZWVwKDEwMCk7CiAJaW5pdF9yZWdfdjFfaHcoaGlzaV9oYmEpOwogCi0JaW5pdF9pZF9mcmFtZV92MV9odyhoaXNpX2hiYSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtODc1LDEyICs4NjUsMTMgQEAKIHN0YXRpYyBpbnQgZ2V0X2ZyZWVfc2xvdF92MV9odyhzdHJ1Y3QgaGlzaV9oYmEgKmhpc2lfaGJhLCBpbnQgKnEsIGludCAqcykKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaGlzaV9oYmEtPnBkZXYtPmRldjsKKwlzdHJ1Y3QgaGlzaV9zYXNfZHEgKmRxOwogCXUzMiByLCB3OwogCWludCBxdWV1ZSA9IGhpc2lfaGJhLT5xdWV1ZTsKIAogCXdoaWxlICgxKSB7Ci0JCXcgPSBoaXNpX3Nhc19yZWFkMzJfcmVsYXhlZChoaXNpX2hiYSwKLQkJCQkgICAgRExWUllfUV8wX1dSX1BUUiArIChxdWV1ZSAqIDB4MTQpKTsKKwkJZHEgPSAmaGlzaV9oYmEtPmRxW3F1ZXVlXTsKKwkJdyA9IGRxLT53cl9wb2ludDsKIAkJciA9IGhpc2lfc2FzX3JlYWQzMl9yZWxheGVkKGhpc2lfaGJhLAogCQkJCSAgICBETFZSWV9RXzBfUkRfUFRSICsgKHF1ZXVlICogMHgxNCkpOwogCQlpZiAociA9PSAodysxKSAlIEhJU0lfU0FTX1FVRVVFX1NMT1RTKSB7CkBAIC05MDMsMTAgKzg5NCwxMSBAQAogewogCWludCBkbHZyeV9xdWV1ZSA9IGhpc2lfaGJhLT5zbG90X3ByZXAtPmRsdnJ5X3F1ZXVlOwogCWludCBkbHZyeV9xdWV1ZV9zbG90ID0gaGlzaV9oYmEtPnNsb3RfcHJlcC0+ZGx2cnlfcXVldWVfc2xvdDsKKwlzdHJ1Y3QgaGlzaV9zYXNfZHEgKmRxID0gJmhpc2lfaGJhLT5kcVtkbHZyeV9xdWV1ZV07CiAKLQloaXNpX3Nhc193cml0ZTMyKGhpc2lfaGJhLAotCQkJIERMVlJZX1FfMF9XUl9QVFIgKyAoZGx2cnlfcXVldWUgKiAweDE0KSwKLQkJCSArK2RsdnJ5X3F1ZXVlX3Nsb3QgJSBISVNJX1NBU19RVUVVRV9TTE9UUyk7CisJZHEtPndyX3BvaW50ID0gKytkbHZyeV9xdWV1ZV9zbG90ICUgSElTSV9TQVNfUVVFVUVfU0xPVFM7CisJaGlzaV9zYXNfd3JpdGUzMihoaXNpX2hiYSwgRExWUllfUV8wX1dSX1BUUiArIChkbHZyeV9xdWV1ZSAqIDB4MTQpLAorCQkJIGRxLT53cl9wb2ludCk7CiB9CiAKIHN0YXRpYyBpbnQgcHJlcF9wcmRfc2dlX3YxX2h3KHN0cnVjdCBoaXNpX2hiYSAqaGlzaV9oYmEsCkBAIC0xNTY1LDE0ICsxNTU3LDExIEBACiAJc3RydWN0IGhpc2lfc2FzX2NvbXBsZXRlX3YxX2hkciAqY29tcGxldGVfcXVldWUgPQogCQkJKHN0cnVjdCBoaXNpX3Nhc19jb21wbGV0ZV92MV9oZHIgKikKIAkJCWhpc2lfaGJhLT5jb21wbGV0ZV9oZHJbcXVldWVdOwotCXUzMiBpcnFfdmFsdWUsIHJkX3BvaW50LCB3cl9wb2ludDsKKwl1MzIgaXJxX3ZhbHVlLCByZF9wb2ludCA9IGNxLT5yZF9wb2ludCwgd3JfcG9pbnQ7CiAKIAlpcnFfdmFsdWUgPSBoaXNpX3Nhc19yZWFkMzIoaGlzaV9oYmEsIE9RX0lOVF9TUkMpOwogCiAJaGlzaV9zYXNfd3JpdGUzMihoaXNpX2hiYSwgT1FfSU5UX1NSQywgMSA8PCBxdWV1ZSk7Ci0KLQlyZF9wb2ludCA9IGhpc2lfc2FzX3JlYWQzMihoaXNpX2hiYSwKLQkJCUNPTVBMX1FfMF9SRF9QVFIgKyAoMHgxNCAqIHF1ZXVlKSk7CiAJd3JfcG9pbnQgPSBoaXNpX3Nhc19yZWFkMzIoaGlzaV9oYmEsCiAJCQlDT01QTF9RXzBfV1JfUFRSICsgKDB4MTQgKiBxdWV1ZSkpOwogCkBAIC0xNjAwLDYgKzE1ODksNyBAQAogCX0KIAogCS8qIHVwZGF0ZSByZF9wb2ludCAqLworCWNxLT5yZF9wb2ludCA9IHJkX3BvaW50OwogCWhpc2lfc2FzX3dyaXRlMzIoaGlzaV9oYmEsIENPTVBMX1FfMF9SRF9QVFIgKyAoMHgxNCAqIHF1ZXVlKSwgcmRfcG9pbnQpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hpc2lfc2FzL2hpc2lfc2FzX3YyX2h3LmMgYi9kcml2ZXJzL3Njc2kvaGlzaV9zYXMvaGlzaV9zYXNfdjJfaHcuYwppbmRleCBmOTY1NjA0Li45ODI1YTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaGlzaV9zYXMvaGlzaV9zYXNfdjJfaHcuYworKysgYi9kcml2ZXJzL3Njc2kvaGlzaV9zYXMvaGlzaV9zYXNfdjJfaHcuYwpAQCAtMTE3LDYgKzExNyw4IEBACiAjZGVmaW5lIFNMX0NPTlRST0wJCQkoUE9SVF9CQVNFICsgMHg5NCkKICNkZWZpbmUgU0xfQ09OVFJPTF9OT1RJRllfRU5fT0ZGCTAKICNkZWZpbmUgU0xfQ09OVFJPTF9OT1RJRllfRU5fTVNLCSgweDEgPDwgU0xfQ09OVFJPTF9OT1RJRllfRU5fT0ZGKQorI2RlZmluZSBTTF9DT05UUk9MX0NUQV9PRkYJCTE3CisjZGVmaW5lIFNMX0NPTlRST0xfQ1RBX01TSwkJKDB4MSA8PCBTTF9DT05UUk9MX0NUQV9PRkYpCiAjZGVmaW5lIFRYX0lEX0RXT1JEMAkJCShQT1JUX0JBU0UgKyAweDljKQogI2RlZmluZSBUWF9JRF9EV09SRDEJCQkoUE9SVF9CQVNFICsgMHhhMCkKICNkZWZpbmUgVFhfSURfRFdPUkQyCQkJKFBPUlRfQkFTRSArIDB4YTQpCkBAIC0xMjQsNiArMTI2LDkgQEAKICNkZWZpbmUgVFhfSURfRFdPUkQ0CQkJKFBPUlRfQkFTRSArIDB4YUMpCiAjZGVmaW5lIFRYX0lEX0RXT1JENQkJCShQT1JUX0JBU0UgKyAweGIwKQogI2RlZmluZSBUWF9JRF9EV09SRDYJCQkoUE9SVF9CQVNFICsgMHhiNCkKKyNkZWZpbmUgVFhJRF9BVVRPCQkJKFBPUlRfQkFTRSArIDB4YjgpCisjZGVmaW5lIFRYSURfQVVUT19DVDNfT0ZGCQkxCisjZGVmaW5lIFRYSURfQVVUT19DVDNfTVNLCQkoMHgxIDw8IFRYSURfQVVUT19DVDNfT0ZGKQogI2RlZmluZSBSWF9JREFGX0RXT1JEMAkJCShQT1JUX0JBU0UgKyAweGM0KQogI2RlZmluZSBSWF9JREFGX0RXT1JEMQkJCShQT1JUX0JBU0UgKyAweGM4KQogI2RlZmluZSBSWF9JREFGX0RXT1JEMgkJCShQT1JUX0JBU0UgKyAweGNjKQpAQCAtMTc0LDYgKzE3OSwxMCBAQAogLyogSFcgZG1hIHN0cnVjdHVyZXMgKi8KIC8qIERlbGl2ZXJ5IHF1ZXVlIGhlYWRlciAqLwogLyogZHcwICovCisjZGVmaW5lIENNRF9IRFJfQUJPUlRfRkxBR19PRkYJCTAKKyNkZWZpbmUgQ01EX0hEUl9BQk9SVF9GTEFHX01TSwkJKDB4MyA8PCBDTURfSERSX0FCT1JUX0ZMQUdfT0ZGKQorI2RlZmluZSBDTURfSERSX0FCT1JUX0RFVklDRV9UWVBFX09GRgkyCisjZGVmaW5lIENNRF9IRFJfQUJPUlRfREVWSUNFX1RZUEVfTVNLCSgweDEgPDwgQ01EX0hEUl9BQk9SVF9ERVZJQ0VfVFlQRV9PRkYpCiAjZGVmaW5lIENNRF9IRFJfUkVTUF9SRVBPUlRfT0ZGCQk1CiAjZGVmaW5lIENNRF9IRFJfUkVTUF9SRVBPUlRfTVNLCQkoMHgxIDw8IENNRF9IRFJfUkVTUF9SRVBPUlRfT0ZGKQogI2RlZmluZSBDTURfSERSX1RMUl9DVFJMX09GRgkJNgpAQCAtMjE0LDYgKzIyMyw4IEBACiAjZGVmaW5lIENNRF9IRFJfRElGX1NHTF9MRU5fTVNLCQkoMHhmZmZmIDw8IENNRF9IRFJfRElGX1NHTF9MRU5fT0ZGKQogI2RlZmluZSBDTURfSERSX0RBVEFfU0dMX0xFTl9PRkYJMTYKICNkZWZpbmUgQ01EX0hEUl9EQVRBX1NHTF9MRU5fTVNLCSgweGZmZmYgPDwgQ01EX0hEUl9EQVRBX1NHTF9MRU5fT0ZGKQorI2RlZmluZSBDTURfSERSX0FCT1JUX0lQVFRfT0ZGCQkxNgorI2RlZmluZSBDTURfSERSX0FCT1JUX0lQVFRfTVNLCQkoMHhmZmZmIDw8IENNRF9IRFJfQUJPUlRfSVBUVF9PRkYpCiAKIC8qIENvbXBsZXRpb24gaGVhZGVyICovCiAvKiBkdzAgKi8KQEAgLTIyMSw2ICsyMzIsMTMgQEAKICNkZWZpbmUgQ01QTFRfSERSX1JTUE5TX1hGUkRfTVNLCSgweDEgPDwgQ01QTFRfSERSX1JTUE5TX1hGUkRfT0ZGKQogI2RlZmluZSBDTVBMVF9IRFJfRVJYX09GRgkJMTIKICNkZWZpbmUgQ01QTFRfSERSX0VSWF9NU0sJCSgweDEgPDwgQ01QTFRfSERSX0VSWF9PRkYpCisjZGVmaW5lIENNUExUX0hEUl9BQk9SVF9TVEFUX09GRgkxMworI2RlZmluZSBDTVBMVF9IRFJfQUJPUlRfU1RBVF9NU0sJKDB4NyA8PCBDTVBMVF9IRFJfQUJPUlRfU1RBVF9PRkYpCisvKiBhYm9ydF9zdGF0ICovCisjZGVmaW5lIFNUQVRfSU9fTk9UX1ZBTElECQkweDEKKyNkZWZpbmUgU1RBVF9JT19OT19ERVZJQ0UJCTB4MgorI2RlZmluZSBTVEFUX0lPX0NPTVBMRVRFCQkweDMKKyNkZWZpbmUgU1RBVF9JT19BQk9SVEVECQkJMHg0CiAvKiBkdzEgKi8KICNkZWZpbmUgQ01QTFRfSERSX0lQVFRfT0ZGCQkwCiAjZGVmaW5lIENNUExUX0hEUl9JUFRUX01TSwkJKDB4ZmZmZiA8PCBDTVBMVF9IRFJfSVBUVF9PRkYpCkBAIC01NDksMjUgKzU2NywxNyBAQAogCWhpc2lfc2FzX3BoeV93cml0ZTMyKGhpc2lfaGJhLCBwaHlfbm8sIFRYX0lEX0RXT1JEMCwKIAkJCV9fc3dhYjMyKGlkZW50aWZ5X2J1ZmZlclswXSkpOwogCWhpc2lfc2FzX3BoeV93cml0ZTMyKGhpc2lfaGJhLCBwaHlfbm8sIFRYX0lEX0RXT1JEMSwKLQkJCWlkZW50aWZ5X2J1ZmZlclsyXSk7CisJCQlfX3N3YWIzMihpZGVudGlmeV9idWZmZXJbMV0pKTsKIAloaXNpX3Nhc19waHlfd3JpdGUzMihoaXNpX2hiYSwgcGh5X25vLCBUWF9JRF9EV09SRDIsCi0JCQlpZGVudGlmeV9idWZmZXJbMV0pOworCQkJX19zd2FiMzIoaWRlbnRpZnlfYnVmZmVyWzJdKSk7CiAJaGlzaV9zYXNfcGh5X3dyaXRlMzIoaGlzaV9oYmEsIHBoeV9ubywgVFhfSURfRFdPUkQzLAotCQkJaWRlbnRpZnlfYnVmZmVyWzRdKTsKKwkJCV9fc3dhYjMyKGlkZW50aWZ5X2J1ZmZlclszXSkpOwogCWhpc2lfc2FzX3BoeV93cml0ZTMyKGhpc2lfaGJhLCBwaHlfbm8sIFRYX0lEX0RXT1JENCwKLQkJCWlkZW50aWZ5X2J1ZmZlclszXSk7CisJCQlfX3N3YWIzMihpZGVudGlmeV9idWZmZXJbNF0pKTsKIAloaXNpX3Nhc19waHlfd3JpdGUzMihoaXNpX2hiYSwgcGh5X25vLCBUWF9JRF9EV09SRDUsCiAJCQlfX3N3YWIzMihpZGVudGlmeV9idWZmZXJbNV0pKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9pZF9mcmFtZV92Ml9odyhzdHJ1Y3QgaGlzaV9oYmEgKmhpc2lfaGJhKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGhpc2lfaGJhLT5uX3BoeTsgaSsrKQotCQljb25maWdfaWRfZnJhbWVfdjJfaHcoaGlzaV9oYmEsIGkpOwotfQotCiBzdGF0aWMgdm9pZCBzZXR1cF9pdGN0X3YyX2h3KHN0cnVjdCBoaXNpX2hiYSAqaGlzaV9oYmEsCiAJCQkgICAgIHN0cnVjdCBoaXNpX3Nhc19kZXZpY2UgKnNhc19kZXYpCiB7CkBAIC01ODksNiArNTk5LDcgQEAKIAkJcXcwID0gSElTSV9TQVNfREVWX1RZUEVfU1NQIDw8IElUQ1RfSERSX0RFVl9UWVBFX09GRjsKIAkJYnJlYWs7CiAJY2FzZSBTQVNfU0FUQV9ERVY6CisJY2FzZSBTQVNfU0FUQV9QRU5ESU5HOgogCQlpZiAocGFyZW50X2RldiAmJiBERVZfSVNfRVhQQU5ERVIocGFyZW50X2Rldi0+ZGV2X3R5cGUpKQogCQkJcXcwID0gSElTSV9TQVNfREVWX1RZUEVfU1RQIDw8IElUQ1RfSERSX0RFVl9UWVBFX09GRjsKIAkJZWxzZQpAQCAtNjcyLDkgKzY4Myw3IEBACiAJZWxzZQogCQlyZXNldF92YWwgPSAweDdmZmZmOwogCi0JLyogRGlzYWJsZSBhbGwgb2YgdGhlIERRICovCi0JZm9yIChpID0gMDsgaSA8IEhJU0lfU0FTX01BWF9RVUVVRVM7IGkrKykKLQkJaGlzaV9zYXNfd3JpdGUzMihoaXNpX2hiYSwgRExWUllfUVVFVUVfRU5BQkxFLCAwKTsKKwloaXNpX3Nhc193cml0ZTMyKGhpc2lfaGJhLCBETFZSWV9RVUVVRV9FTkFCTEUsIDApOwogCiAJLyogRGlzYWJsZSBhbGwgb2YgdGhlIFBIWXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgaGlzaV9oYmEtPm5fcGh5OyBpKyspIHsKQEAgLTgxMCw2ICs4MTksOCBAQAogCQloaXNpX3Nhc19waHlfd3JpdGUzMihoaXNpX2hiYSwgaSwgUFJPR19QSFlfTElOS19SQVRFLCAweDg1NSk7CiAJCWhpc2lfc2FzX3BoeV93cml0ZTMyKGhpc2lfaGJhLCBpLCBTQVNfUEhZX0NUUkwsIDB4MzBiOTkwOCk7CiAJCWhpc2lfc2FzX3BoeV93cml0ZTMyKGhpc2lfaGJhLCBpLCBTTF9UT1VUX0NGRywgMHg3ZDdkN2Q3ZCk7CisJCWhpc2lfc2FzX3BoeV93cml0ZTMyKGhpc2lfaGJhLCBpLCBTTF9DT05UUk9MLCAweDApOworCQloaXNpX3Nhc19waHlfd3JpdGUzMihoaXNpX2hiYSwgaSwgVFhJRF9BVVRPLCAweDIpOwogCQloaXNpX3Nhc19waHlfd3JpdGUzMihoaXNpX2hiYSwgaSwgRE9ORV9SRUNFSVZFRF9USU1FLCAweDEwKTsKIAkJaGlzaV9zYXNfcGh5X3dyaXRlMzIoaGlzaV9oYmEsIGksIENITF9JTlQwLCAweGZmZmZmZmZmKTsKIAkJaGlzaV9zYXNfcGh5X3dyaXRlMzIoaGlzaV9oYmEsIGksIENITF9JTlQxLCAweGZmZmZmZmZmKTsKQEAgLTkwMSw4ICs5MTIsNiBAQAogCW1zbGVlcCgxMDApOwogCWluaXRfcmVnX3YyX2h3KGhpc2lfaGJhKTsKIAotCWluaXRfaWRfZnJhbWVfdjJfaHcoaGlzaV9oYmEpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk1MiwxNCArOTYxLDggQEAKIAogc3RhdGljIHZvaWQgcGh5c19pbml0X3YyX2h3KHN0cnVjdCBoaXNpX2hiYSAqaGlzaV9oYmEpCiB7Ci0JaW50IGk7CiAJc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJmhpc2lfaGJhLT50aW1lcjsKIAotCWZvciAoaSA9IDA7IGkgPCBoaXNpX2hiYS0+bl9waHk7IGkrKykgewotCQloaXNpX3Nhc19waHlfd3JpdGUzMihoaXNpX2hiYSwgaSwgQ0hMX0lOVDJfTVNLLCAweDZhKTsKLQkJaGlzaV9zYXNfcGh5X3JlYWQzMihoaXNpX2hiYSwgaSwgQ0hMX0lOVDJfTVNLKTsKLQl9Ci0KIAlzZXR1cF90aW1lcih0aW1lciwgc3RhcnRfcGh5c192Ml9odywgKHVuc2lnbmVkIGxvbmcpaGlzaV9oYmEpOwogCW1vZF90aW1lcih0aW1lciwgamlmZmllcyArIEhaKTsKIH0KQEAgLTEwMTAsMTIgKzEwMTMsMTMgQEAKIHN0YXRpYyBpbnQgZ2V0X2ZyZWVfc2xvdF92Ml9odyhzdHJ1Y3QgaGlzaV9oYmEgKmhpc2lfaGJhLCBpbnQgKnEsIGludCAqcykKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaGlzaV9oYmEtPnBkZXYtPmRldjsKKwlzdHJ1Y3QgaGlzaV9zYXNfZHEgKmRxOwogCXUzMiByLCB3OwogCWludCBxdWV1ZSA9IGhpc2lfaGJhLT5xdWV1ZTsKIAogCXdoaWxlICgxKSB7Ci0JCXcgPSBoaXNpX3Nhc19yZWFkMzJfcmVsYXhlZChoaXNpX2hiYSwKLQkJCQkJICAgIERMVlJZX1FfMF9XUl9QVFIgKyAocXVldWUgKiAweDE0KSk7CisJCWRxID0gJmhpc2lfaGJhLT5kcVtxdWV1ZV07CisJCXcgPSBkcS0+d3JfcG9pbnQ7CiAJCXIgPSBoaXNpX3Nhc19yZWFkMzJfcmVsYXhlZChoaXNpX2hiYSwKIAkJCQkJICAgIERMVlJZX1FfMF9SRF9QVFIgKyAocXVldWUgKiAweDE0KSk7CiAJCWlmIChyID09ICh3KzEpICUgSElTSV9TQVNfUVVFVUVfU0xPVFMpIHsKQEAgLTEwMzgsOSArMTA0MiwxMSBAQAogewogCWludCBkbHZyeV9xdWV1ZSA9IGhpc2lfaGJhLT5zbG90X3ByZXAtPmRsdnJ5X3F1ZXVlOwogCWludCBkbHZyeV9xdWV1ZV9zbG90ID0gaGlzaV9oYmEtPnNsb3RfcHJlcC0+ZGx2cnlfcXVldWVfc2xvdDsKKwlzdHJ1Y3QgaGlzaV9zYXNfZHEgKmRxID0gJmhpc2lfaGJhLT5kcVtkbHZyeV9xdWV1ZV07CiAKKwlkcS0+d3JfcG9pbnQgPSArK2RsdnJ5X3F1ZXVlX3Nsb3QgJSBISVNJX1NBU19RVUVVRV9TTE9UUzsKIAloaXNpX3Nhc193cml0ZTMyKGhpc2lfaGJhLCBETFZSWV9RXzBfV1JfUFRSICsgKGRsdnJ5X3F1ZXVlICogMHgxNCksCi0JCQkgKytkbHZyeV9xdWV1ZV9zbG90ICUgSElTSV9TQVNfUVVFVUVfU0xPVFMpOworCQkJIGRxLT53cl9wb2ludCk7CiB9CiAKIHN0YXRpYyBpbnQgcHJlcF9wcmRfc2dlX3YyX2h3KHN0cnVjdCBoaXNpX2hiYSAqaGlzaV9oYmEsCkBAIC0xNTYzLDYgKzE1NjksMzAgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJLyogVXNlIFNBUytUTUYgc3RhdHVzIGNvZGVzICovCisJc3dpdGNoICgoY29tcGxldGVfaGRyLT5kdzAgJiBDTVBMVF9IRFJfQUJPUlRfU1RBVF9NU0spCisJCQk+PiBDTVBMVF9IRFJfQUJPUlRfU1RBVF9PRkYpIHsKKwljYXNlIFNUQVRfSU9fQUJPUlRFRDoKKwkJLyogdGhpcyBpbyBoYXMgYmVlbiBhYm9ydGVkIGJ5IGFib3J0IGNvbW1hbmQgKi8KKwkJdHMtPnN0YXQgPSBTQVNfQUJPUlRFRF9UQVNLOworCQlnb3RvIG91dDsKKwljYXNlIFNUQVRfSU9fQ09NUExFVEU6CisJCS8qIGludGVybmFsIGFib3J0IGNvbW1hbmQgY29tcGxldGUgKi8KKwkJdHMtPnN0YXQgPSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOworCQlnb3RvIG91dDsKKwljYXNlIFNUQVRfSU9fTk9fREVWSUNFOgorCQl0cy0+c3RhdCA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisJCWdvdG8gb3V0OworCWNhc2UgU1RBVF9JT19OT1RfVkFMSUQ6CisJCS8qIGFib3J0IHNpbmdsZSBpbywgY29udHJvbGxlciBkb24ndCBmaW5kCisJCSAqIHRoZSBpbyBuZWVkIHRvIGFib3J0CisJCSAqLworCQl0cy0+c3RhdCA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCQlnb3RvIG91dDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKIAlpZiAoKGNvbXBsZXRlX2hkci0+ZHcwICYgQ01QTFRfSERSX0VSWF9NU0spICYmCiAJCSghKGNvbXBsZXRlX2hkci0+ZHcwICYgQ01QTFRfSERSX1JTUE5TX1hGUkRfTVNLKSkpIHsKIApAQCAtMTc3NSw2ICsxODA1LDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcHJlcF9hYm9ydF92Ml9odyhzdHJ1Y3QgaGlzaV9oYmEgKmhpc2lfaGJhLAorCQlzdHJ1Y3QgaGlzaV9zYXNfc2xvdCAqc2xvdCwKKwkJaW50IGRldmljZV9pZCwgaW50IGFib3J0X2ZsYWcsIGludCB0YWdfdG9fYWJvcnQpCit7CisJc3RydWN0IHNhc190YXNrICp0YXNrID0gc2xvdC0+dGFzazsKKwlzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2ID0gdGFzay0+ZGV2OworCXN0cnVjdCBoaXNpX3Nhc19jbWRfaGRyICpoZHIgPSBzbG90LT5jbWRfaGRyOworCXN0cnVjdCBoaXNpX3Nhc19wb3J0ICpwb3J0ID0gc2xvdC0+cG9ydDsKKworCS8qIGR3MCAqLworCWhkci0+ZHcwID0gY3B1X3RvX2xlMzIoKDUgPDwgQ01EX0hEUl9DTURfT0ZGKSB8IC8qYWJvcnQqLworCQkJICAgICAgIChwb3J0LT5pZCA8PCBDTURfSERSX1BPUlRfT0ZGKSB8CisJCQkgICAgICAgKChkZXZfaXNfc2F0YShkZXYpID8gMTowKSA8PAorCQkJCUNNRF9IRFJfQUJPUlRfREVWSUNFX1RZUEVfT0ZGKSB8CisJCQkgICAgICAgKGFib3J0X2ZsYWcgPDwgQ01EX0hEUl9BQk9SVF9GTEFHX09GRikpOworCisJLyogZHcxICovCisJaGRyLT5kdzEgPSBjcHVfdG9fbGUzMihkZXZpY2VfaWQgPDwgQ01EX0hEUl9ERVZfSURfT0ZGKTsKKworCS8qIGR3NyAqLworCWhkci0+ZHc3ID0gY3B1X3RvX2xlMzIodGFnX3RvX2Fib3J0IDw8IENNRF9IRFJfQUJPUlRfSVBUVF9PRkYpOworCWhkci0+dHJhbnNmZXJfdGFncyA9IGNwdV90b19sZTMyKHNsb3QtPmlkeCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBwaHlfdXBfdjJfaHcoaW50IHBoeV9ubywgc3RydWN0IGhpc2lfaGJhICpoaXNpX2hiYSkKIHsKIAlpbnQgaSwgcmVzID0gMDsKQEAgLTE4MTgsOSArMTg3NCw2IEBACiAJCWZyYW1lX3JjdmRbaV0gPSBfX3N3YWIzMihpZGFmKTsKIAl9CiAKLQkvKiBHZXQgdGhlIGxpbmtyYXRlcyAqLwotCWxpbmtfcmF0ZSA9IGhpc2lfc2FzX3JlYWQzMihoaXNpX2hiYSwgUEhZX0NPTk5fUkFURSk7Ci0JbGlua19yYXRlID0gKGxpbmtfcmF0ZSA+PiAocGh5X25vICogNCkpICYgMHhmOwogCXNhc19waHktPmxpbmtyYXRlID0gbGlua19yYXRlOwogCWhhcmRfcGh5X2xpbmtyYXRlID0gaGlzaV9zYXNfcGh5X3JlYWQzMihoaXNpX2hiYSwgcGh5X25vLAogCQkJCQkJSEFSRF9QSFlfTElOS1JBVEUpOwpAQCAtMTg1NSwxNiArMTkwOCwyMSBAQAogc3RhdGljIGludCBwaHlfZG93bl92Ml9odyhpbnQgcGh5X25vLCBzdHJ1Y3QgaGlzaV9oYmEgKmhpc2lfaGJhKQogewogCWludCByZXMgPSAwOwotCXUzMiBwaHlfY2ZnLCBwaHlfc3RhdGU7CisJdTMyIHBoeV9zdGF0ZSwgc2xfY3RybCwgdHhpZF9hdXRvOwogCiAJaGlzaV9zYXNfcGh5X3dyaXRlMzIoaGlzaV9oYmEsIHBoeV9ubywgUEhZQ1RSTF9OT1RfUkRZX01TSywgMSk7CiAKLQlwaHlfY2ZnID0gaGlzaV9zYXNfcGh5X3JlYWQzMihoaXNpX2hiYSwgcGh5X25vLCBQSFlfQ0ZHKTsKLQogCXBoeV9zdGF0ZSA9IGhpc2lfc2FzX3JlYWQzMihoaXNpX2hiYSwgUEhZX1NUQVRFKTsKLQogCWhpc2lfc2FzX3BoeV9kb3duKGhpc2lfaGJhLCBwaHlfbm8sIChwaHlfc3RhdGUgJiAxIDw8IHBoeV9ubykgPyAxIDogMCk7CiAKKwlzbF9jdHJsID0gaGlzaV9zYXNfcGh5X3JlYWQzMihoaXNpX2hiYSwgcGh5X25vLCBTTF9DT05UUk9MKTsKKwloaXNpX3Nhc19waHlfd3JpdGUzMihoaXNpX2hiYSwgcGh5X25vLCBTTF9DT05UUk9MLAorCQkJICAgICBzbF9jdHJsICYgflNMX0NPTlRST0xfQ1RBX01TSyk7CisKKwl0eGlkX2F1dG8gPSBoaXNpX3Nhc19waHlfcmVhZDMyKGhpc2lfaGJhLCBwaHlfbm8sIFRYSURfQVVUTyk7CisJaGlzaV9zYXNfcGh5X3dyaXRlMzIoaGlzaV9oYmEsIHBoeV9ubywgVFhJRF9BVVRPLAorCQkJICAgICB0eGlkX2F1dG8gfCBUWElEX0FVVE9fQ1QzX01TSyk7CisKIAloaXNpX3Nhc19waHlfd3JpdGUzMihoaXNpX2hiYSwgcGh5X25vLCBDSExfSU5UMCwgQ0hMX0lOVDBfTk9UX1JEWV9NU0spOwogCWhpc2lfc2FzX3BoeV93cml0ZTMyKGhpc2lfaGJhLCBwaHlfbm8sIFBIWUNUUkxfTk9UX1JEWV9NU0ssIDApOwogCkBAIC0xOTg2LDcgKzIwNDQsNyBAQAogCXN0cnVjdCBoaXNpX3Nhc19zbG90ICpzbG90OwogCXN0cnVjdCBoaXNpX3Nhc19pdGN0ICppdGN0OwogCXN0cnVjdCBoaXNpX3Nhc19jb21wbGV0ZV92Ml9oZHIgKmNvbXBsZXRlX3F1ZXVlOwotCXUzMiBpcnFfdmFsdWUsIHJkX3BvaW50LCB3cl9wb2ludCwgZGV2X2lkOworCXUzMiBpcnFfdmFsdWUsIHJkX3BvaW50ID0gY3EtPnJkX3BvaW50LCB3cl9wb2ludCwgZGV2X2lkOwogCWludCBxdWV1ZSA9IGNxLT5pZDsKIAogCWNvbXBsZXRlX3F1ZXVlID0gaGlzaV9oYmEtPmNvbXBsZXRlX2hkcltxdWV1ZV07CkBAIC0xOTk0LDggKzIwNTIsNiBAQAogCiAJaGlzaV9zYXNfd3JpdGUzMihoaXNpX2hiYSwgT1FfSU5UX1NSQywgMSA8PCBxdWV1ZSk7CiAKLQlyZF9wb2ludCA9IGhpc2lfc2FzX3JlYWQzMihoaXNpX2hiYSwgQ09NUExfUV8wX1JEX1BUUiArCi0JCQkJICAgKDB4MTQgKiBxdWV1ZSkpOwogCXdyX3BvaW50ID0gaGlzaV9zYXNfcmVhZDMyKGhpc2lfaGJhLCBDT01QTF9RXzBfV1JfUFRSICsKIAkJCQkgICAoMHgxNCAqIHF1ZXVlKSk7CiAKQEAgLTIwNDMsNiArMjA5OSw3IEBACiAJfQogCiAJLyogdXBkYXRlIHJkX3BvaW50ICovCisJY3EtPnJkX3BvaW50ID0gcmRfcG9pbnQ7CiAJaGlzaV9zYXNfd3JpdGUzMihoaXNpX2hiYSwgQ09NUExfUV8wX1JEX1BUUiArICgweDE0ICogcXVldWUpLCByZF9wb2ludCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMjIzOSw2ICsyMjk2LDcgQEAKIAkucHJlcF9zbXAgPSBwcmVwX3NtcF92Ml9odywKIAkucHJlcF9zc3AgPSBwcmVwX3NzcF92Ml9odywKIAkucHJlcF9zdHAgPSBwcmVwX2F0YV92Ml9odywKKwkucHJlcF9hYm9ydCA9IHByZXBfYWJvcnRfdjJfaHcsCiAJLmdldF9mcmVlX3Nsb3QgPSBnZXRfZnJlZV9zbG90X3YyX2h3LAogCS5zdGFydF9kZWxpdmVyeSA9IHN0YXJ0X2RlbGl2ZXJ5X3YyX2h3LAogCS5zbG90X2NvbXBsZXRlID0gc2xvdF9jb21wbGV0ZV92Ml9odywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ob3N0cy5jIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKaW5kZXggYmE5YWY0YS4uMjU4YTNmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hvc3RzLmMKKysrIGIvZHJpdmVycy9zY3NpL2hvc3RzLmMKQEAgLTI0NiwxMCArMjQ2LDYgQEAKIAogCXNob3N0LT5kbWFfZGV2ID0gZG1hX2RldjsKIAotCWVycm9yID0gZGV2aWNlX2FkZCgmc2hvc3QtPnNob3N0X2dlbmRldik7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF9kZXN0cm95X2ZyZWVsaXN0OwotCiAJLyoKIAkgKiBJbmNyZWFzZSB1c2FnZSBjb3VudCB0ZW1wb3JhcmlseSBoZXJlIHNvIHRoYXQgY2FsbGluZwogCSAqIHNjc2lfYXV0b3BtX3B1dF9ob3N0KCkgd2lsbCB0cmlnZ2VyIHJ1bnRpbWUgaWRsZSBpZiB0aGVyZSBpcwpAQCAtMjYwLDYgKzI1NiwxMCBAQAogCXBtX3J1bnRpbWVfZW5hYmxlKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKIAlkZXZpY2VfZW5hYmxlX2FzeW5jX3N1c3BlbmQoJnNob3N0LT5zaG9zdF9nZW5kZXYpOwogCisJZXJyb3IgPSBkZXZpY2VfYWRkKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2Rlc3Ryb3lfZnJlZWxpc3Q7CisKIAlzY3NpX2hvc3Rfc2V0X3N0YXRlKHNob3N0LCBTSE9TVF9SVU5OSU5HKTsKIAlnZXRfZGV2aWNlKHNob3N0LT5zaG9zdF9nZW5kZXYucGFyZW50KTsKIApAQCAtMzA5LDYgKzMwOSwxMCBAQAogIG91dF9kZWxfZ2VuZGV2OgogCWRldmljZV9kZWwoJnNob3N0LT5zaG9zdF9nZW5kZXYpOwogIG91dF9kZXN0cm95X2ZyZWVsaXN0OgorCWRldmljZV9kaXNhYmxlX2FzeW5jX3N1c3BlbmQoJnNob3N0LT5zaG9zdF9nZW5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmc2hvc3QtPnNob3N0X2dlbmRldik7CisJcG1fcnVudGltZV9zZXRfc3VzcGVuZGVkKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnNob3N0LT5zaG9zdF9nZW5kZXYpOwogCXNjc2lfZGVzdHJveV9jb21tYW5kX2ZyZWVsaXN0KHNob3N0KTsKICBvdXRfZGVzdHJveV90YWdzOgogCWlmIChzaG9zdF91c2VfYmxrX21xKHNob3N0KSkKQEAgLTQ4Niw2ICs0OTAsOCBAQAogCWVsc2UKIAkJc2hvc3QtPmRtYV9ib3VuZGFyeSA9IDB4ZmZmZmZmZmY7CiAKKwlzaG9zdC0+dXNlX2Jsa19tcSA9IHNjc2lfdXNlX2Jsa19tcTsKKwogCWRldmljZV9pbml0aWFsaXplKCZzaG9zdC0+c2hvc3RfZ2VuZGV2KTsKIAlkZXZfc2V0X25hbWUoJnNob3N0LT5zaG9zdF9nZW5kZXYsICJob3N0JWQiLCBzaG9zdC0+aG9zdF9ubyk7CiAJc2hvc3QtPnNob3N0X2dlbmRldi5idXMgPSAmc2NzaV9idXNfdHlwZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhLmMgYi9kcml2ZXJzL3Njc2kvaHBzYS5jCmluZGV4IDAzMGQwMDIuLmQwMDdlYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ocHNhLmMKKysrIGIvZHJpdmVycy9zY3NpL2hwc2EuYwpAQCAtMjkzLDYgKzI5Myw4IEBACiBzdGF0aWMgdm9pZCBocHNhX2Rpc2FibGVfcmxkX2NhY2hpbmcoc3RydWN0IGN0bHJfaW5mbyAqaCk7CiBzdGF0aWMgaW5saW5lIGludCBocHNhX3Njc2lfZG9fcmVwb3J0X3BoeXNfbHVucyhzdHJ1Y3QgY3Rscl9pbmZvICpoLAogCXN0cnVjdCBSZXBvcnRFeHRlbmRlZExVTmRhdGEgKmJ1ZiwgaW50IGJ1ZnNpemUpOworc3RhdGljIGJvb2wgaHBzYV92cGRfcGFnZV9zdXBwb3J0ZWQoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwl1bnNpZ25lZCBjaGFyIHNjc2kzYWRkcltdLCB1OCBwYWdlKTsKIHN0YXRpYyBpbnQgaHBzYV9sdW5zX2NoYW5nZWQoc3RydWN0IGN0bHJfaW5mbyAqaCk7CiBzdGF0aWMgYm9vbCBocHNhX2NtZF9kZXZfbWF0Y2goc3RydWN0IGN0bHJfaW5mbyAqaCwgc3RydWN0IENvbW1hbmRMaXN0ICpjLAogCQkJICAgICAgIHN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmRldiwKQEAgLTIzODgsNyArMjM5MCw4IEBACiAJCXN0cnVjdCBDb21tYW5kTGlzdCAqYywgc3RydWN0IHNjc2lfY21uZCAqY21kKQogewogCWhwc2FfY21kX3Jlc29sdmVfYW5kX2ZyZWUoaCwgYyk7Ci0JY21kLT5zY3NpX2RvbmUoY21kKTsKKwlpZiAoY21kICYmIGNtZC0+c2NzaV9kb25lKQorCQljbWQtPnNjc2lfZG9uZShjbWQpOwogfQogCiBzdGF0aWMgdm9pZCBocHNhX3JldHJ5X2NtZChzdHJ1Y3QgY3Rscl9pbmZvICpoLCBzdHJ1Y3QgQ29tbWFuZExpc3QgKmMpCkBAIC0yNDg5LDcgKzI0OTIsMTcgQEAKIAllaSA9IGNwLT5lcnJfaW5mbzsKIAljbWQgPSBjcC0+c2NzaV9jbWQ7CiAJaCA9IGNwLT5oOworCisJaWYgKCFjbWQtPmRldmljZSkgeworCQljbWQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlyZXR1cm4gaHBzYV9jbWRfZnJlZV9hbmRfZG9uZShoLCBjcCwgY21kKTsKKwl9CisKIAlkZXYgPSBjbWQtPmRldmljZS0+aG9zdGRhdGE7CisJaWYgKCFkZXYpIHsKKwkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJcmV0dXJuIGhwc2FfY21kX2ZyZWVfYW5kX2RvbmUoaCwgY3AsIGNtZCk7CisJfQogCWMyID0gJmgtPmlvYWNjZWwyX2NtZF9wb29sW2NwLT5jbWRpbmRleF07CiAKIAlzY3NpX2RtYV91bm1hcChjbWQpOyAvKiB1bmRvIHRoZSBETUEgbWFwcGluZ3MgKi8KQEAgLTI1MDQsOCArMjUxNywxNSBAQAogCWNtZC0+cmVzdWx0ID0gKERJRF9PSyA8PCAxNik7IAkJLyogaG9zdCBieXRlICovCiAJY21kLT5yZXN1bHQgfD0gKENPTU1BTkRfQ09NUExFVEUgPDwgOCk7CS8qIG1zZyBieXRlICovCiAKLQlpZiAoY3AtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMiB8fCBjcC0+Y21kX3R5cGUgPT0gQ01EX0lPQUNDRUwxKQotCQlhdG9taWNfZGVjKCZjcC0+cGh5c19kaXNrLT5pb2FjY2VsX2NtZHNfb3V0KTsKKwlpZiAoY3AtPmNtZF90eXBlID09IENNRF9JT0FDQ0VMMiB8fCBjcC0+Y21kX3R5cGUgPT0gQ01EX0lPQUNDRUwxKSB7CisJCWlmIChkZXYtPnBoeXNpY2FsX2RldmljZSAmJiBkZXYtPmV4cG9zZV9kZXZpY2UgJiYKKwkJCWRldi0+cmVtb3ZlZCkgeworCQkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKKwkJCXJldHVybiBocHNhX2NtZF9mcmVlX2FuZF9kb25lKGgsIGNwLCBjbWQpOworCQl9CisJCWlmIChsaWtlbHkoY3AtPnBoeXNfZGlzayAhPSBOVUxMKSkKKwkJCWF0b21pY19kZWMoJmNwLT5waHlzX2Rpc2stPmlvYWNjZWxfY21kc19vdXQpOworCX0KIAogCS8qCiAJICogV2UgY2hlY2sgZm9yIGxvY2t1cCBzdGF0dXMgaGVyZSBhcyBpdCBtYXkgYmUgc2V0IGZvcgpAQCAtMzA3NCwxMSArMzA5NCwxOSBAQAogCWJ1ZiA9IGt6YWxsb2MoNjQsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQogCQlyZXR1cm47Ci0JcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsIFZQRF9QQUdFIHwgMHhDMSwgYnVmLCA2NCk7CisKKwlpZiAoIWhwc2FfdnBkX3BhZ2Vfc3VwcG9ydGVkKGgsIHNjc2kzYWRkciwKKwkJSFBTQV9WUERfTFZfREVWSUNFX0dFT01FVFJZKSkKKwkJZ290byBleGl0OworCisJcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsIFZQRF9QQUdFIHwKKwkJSFBTQV9WUERfTFZfREVWSUNFX0dFT01FVFJZLCBidWYsIDY0KTsKKwogCWlmIChyYyA9PSAwKQogCQkqcmFpZF9sZXZlbCA9IGJ1Zls4XTsKIAlpZiAoKnJhaWRfbGV2ZWwgPiBSQUlEX1VOS05PV04pCiAJCSpyYWlkX2xldmVsID0gUkFJRF9VTktOT1dOOworZXhpdDoKIAlrZnJlZShidWYpOwogCXJldHVybjsKIH0KQEAgLTM0MzYsNyArMzQ2NCw3IEBACiB9CiAKIC8qIEdldCBhIGRldmljZSBpZCBmcm9tIGlucXVpcnkgcGFnZSAweDgzICovCi1zdGF0aWMgaW50IGhwc2FfdnBkX3BhZ2Vfc3VwcG9ydGVkKHN0cnVjdCBjdGxyX2luZm8gKmgsCitzdGF0aWMgYm9vbCBocHNhX3ZwZF9wYWdlX3N1cHBvcnRlZChzdHJ1Y3QgY3Rscl9pbmZvICpoLAogCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyW10sIHU4IHBhZ2UpCiB7CiAJaW50IHJjOwpAQCAtMzQ0Niw3ICszNDc0LDcgQEAKIAogCWJ1ZiA9IGt6YWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAogCS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgcGFnZSBsaXN0IGZpcnN0ICovCiAJcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsCkBAIC0zNDczLDEwICszNTAxLDEwIEBACiAJCQlnb3RvIGV4aXRfc3VwcG9ydGVkOwogZXhpdF91bnN1cHBvcnRlZDoKIAlrZnJlZShidWYpOwotCXJldHVybiAwOworCXJldHVybiBmYWxzZTsKIGV4aXRfc3VwcG9ydGVkOgogCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIGhwc2FfZ2V0X2lvYWNjZWxfc3RhdHVzKHN0cnVjdCBjdGxyX2luZm8gKmgsCkBAIC0zNTI1LDE4ICszNTUzLDI1IEBACiAJaW50IHJjOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKIAotCWlmIChidWZsZW4gPiAxNikKLQkJYnVmbGVuID0gMTY7CisJLyogRG9lcyBjb250cm9sbGVyIGhhdmUgVlBEIGZvciBkZXZpY2UgaWQ/ICovCisJaWYgKCFocHNhX3ZwZF9wYWdlX3N1cHBvcnRlZChoLCBzY3NpM2FkZHIsIEhQU0FfVlBEX0xWX0RFVklDRV9JRCkpCisJCXJldHVybiAxOyAvKiBub3Qgc3VwcG9ydGVkICovCisKIAlidWYgPSBremFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsIFZQRF9QQUdFIHwgMHg4MywgYnVmLCA2NCk7Ci0JaWYgKHJjID09IDApCi0JCW1lbWNweShkZXZpY2VfaWQsICZidWZbaW5kZXhdLCBidWZsZW4pOworCisJcmMgPSBocHNhX3Njc2lfZG9faW5xdWlyeShoLCBzY3NpM2FkZHIsIFZQRF9QQUdFIHwKKwkJCQkJSFBTQV9WUERfTFZfREVWSUNFX0lELCBidWYsIDY0KTsKKwlpZiAocmMgPT0gMCkgeworCQlpZiAoYnVmbGVuID4gMTYpCisJCQlidWZsZW4gPSAxNjsKKwkJbWVtY3B5KGRldmljZV9pZCwgJmJ1Zls4XSwgYnVmbGVuKTsKKwl9CiAKIAlrZnJlZShidWYpOwogCi0JcmV0dXJuIHJjICE9IDA7CisJcmV0dXJuIHJjOyAvKjAgLSBnb3QgaWQsICBvdGhlcndpc2UsIGRpZG4ndCAqLwogfQogCiBzdGF0aWMgaW50IGhwc2Ffc2NzaV9kb19yZXBvcnRfbHVucyhzdHJ1Y3QgY3Rscl9pbmZvICpoLCBpbnQgbG9naWNhbCwKQEAgLTM4MDcsOCArMzg0MiwxNSBAQAogCQlzaXplb2YodGhpc19kZXZpY2UtPm1vZGVsKSk7CiAJbWVtc2V0KHRoaXNfZGV2aWNlLT5kZXZpY2VfaWQsIDAsCiAJCXNpemVvZih0aGlzX2RldmljZS0+ZGV2aWNlX2lkKSk7Ci0JaHBzYV9nZXRfZGV2aWNlX2lkKGgsIHNjc2kzYWRkciwgdGhpc19kZXZpY2UtPmRldmljZV9pZCwgOCwKLQkJc2l6ZW9mKHRoaXNfZGV2aWNlLT5kZXZpY2VfaWQpKTsKKwlpZiAoaHBzYV9nZXRfZGV2aWNlX2lkKGgsIHNjc2kzYWRkciwgdGhpc19kZXZpY2UtPmRldmljZV9pZCwgOCwKKwkJc2l6ZW9mKHRoaXNfZGV2aWNlLT5kZXZpY2VfaWQpKSkKKwkJZGV2X2VycigmaC0+cGRldi0+ZGV2LAorCQkJImhwc2ElZDogJXM6IGNhbid0IGdldCBkZXZpY2UgaWQgZm9yIGhvc3QgJWQ6QzA6VCVkOkwlZFx0JXNcdCUuMTZzXG4iLAorCQkJaC0+Y3RsciwgX19mdW5jX18sCisJCQloLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCQl0aGlzX2RldmljZS0+dGFyZ2V0LCB0aGlzX2RldmljZS0+bHVuLAorCQkJc2NzaV9kZXZpY2VfdHlwZSh0aGlzX2RldmljZS0+ZGV2dHlwZSksCisJCQl0aGlzX2RldmljZS0+bW9kZWwpOwogCiAJaWYgKCh0aGlzX2RldmljZS0+ZGV2dHlwZSA9PSBUWVBFX0RJU0sgfHwKIAkJdGhpc19kZXZpY2UtPmRldnR5cGUgPT0gVFlQRV9aQkMpICYmCkBAIC00MDM0LDcgKzQwNzYsMTcgQEAKIAkJc3RydWN0IGJtaWNfaWRlbnRpZnlfcGh5c2ljYWxfZGV2aWNlICppZF9waHlzKQogewogCWludCByYzsKLQlzdHJ1Y3QgZXh0X3JlcG9ydF9sdW5fZW50cnkgKnJsZSA9ICZybGVwLT5MVU5bcmxlX2luZGV4XTsKKwlzdHJ1Y3QgZXh0X3JlcG9ydF9sdW5fZW50cnkgKnJsZTsKKworCS8qCisJICogZXh0ZXJuYWwgdGFyZ2V0cyBkb24ndCBzdXBwb3J0IEJNSUMKKwkgKi8KKwlpZiAoZGV2LT5leHRlcm5hbCkgeworCQlkZXYtPnF1ZXVlX2RlcHRoID0gNzsKKwkJcmV0dXJuOworCX0KKworCXJsZSA9ICZybGVwLT5MVU5bcmxlX2luZGV4XTsKIAogCWRldi0+aW9hY2NlbF9oYW5kbGUgPSBybGUtPmlvYWNjZWxfaGFuZGxlOwogCWlmICgocmxlLT5kZXZpY2VfZmxhZ3MgJiAweDA4KSAmJiBkZXYtPmlvYWNjZWxfaGFuZGxlKQpAQCAtNDI3MCw2ICs0MzIyLDExIEBACiAJCWx1bmFkZHJieXRlcyA9IGZpZ3VyZV9sdW5hZGRyYnl0ZXMoaCwgcmFpZF9jdGxyX3Bvc2l0aW9uLAogCQkJaSwgbnBoeXNpY2FscywgbmxvZ2ljYWxzLCBwaHlzZGV2X2xpc3QsIGxvZ2Rldl9saXN0KTsKIAorCQkvKiBEZXRlcm1pbmUgaWYgdGhpcyBpcyBhIGx1biBmcm9tIGFuIGV4dGVybmFsIHRhcmdldCBhcnJheSAqLworCQl0bXBkZXZpY2UtPmV4dGVybmFsID0KKwkJCWZpZ3VyZV9leHRlcm5hbF9zdGF0dXMoaCwgcmFpZF9jdGxyX3Bvc2l0aW9uLCBpLAorCQkJCQkJbnBoeXNpY2FscywgbmxvY2FsX2xvZ2ljYWxzKTsKKwogCQkvKgogCQkgKiBTa2lwIG92ZXIgc29tZSBkZXZpY2VzIHN1Y2ggYXMgYSBzcGFyZS4KIAkJICovCkBAIC00Mjk1LDExICs0MzUyLDYgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBsdW4gZnJvbSBhbiBleHRlcm5hbCB0YXJnZXQgYXJyYXkgKi8KLQkJdG1wZGV2aWNlLT5leHRlcm5hbCA9Ci0JCQlmaWd1cmVfZXh0ZXJuYWxfc3RhdHVzKGgsIHJhaWRfY3Rscl9wb3NpdGlvbiwgaSwKLQkJCQkJCW5waHlzaWNhbHMsIG5sb2NhbF9sb2dpY2Fscyk7Ci0KIAkJZmlndXJlX2J1c190YXJnZXRfbHVuKGgsIGx1bmFkZHJieXRlcywgdG1wZGV2aWNlKTsKIAkJaHBzYV91cGRhdGVfZGV2aWNlX3N1cHBvcnRzX2Fib3J0cyhoLCB0bXBkZXZpY2UsIGx1bmFkZHJieXRlcyk7CiAJCXRoaXNfZGV2aWNlID0gY3VycmVudHNkW25jdXJyZW50XTsKQEAgLTQ1MTMsNyArNDU2NSw5IEBACiAJY2FzZSBSRUFEXzY6CiAJY2FzZSBSRUFEXzEyOgogCQlpZiAoKmNkYl9sZW4gPT0gNikgewotCQkJYmxvY2sgPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmNkYlsyXSk7CisJCQlibG9jayA9ICgoKGNkYlsxXSAmIDB4MUYpIDw8IDE2KSB8CisJCQkJKGNkYlsyXSA8PCA4KSB8CisJCQkJY2RiWzNdKTsKIAkJCWJsb2NrX2NudCA9IGNkYls0XTsKIAkJCWlmIChibG9ja19jbnQgPT0gMCkKIAkJCQlibG9ja19jbnQgPSAyNTY7CkBAIC00NjM4LDYgKzQ2OTIsOSBAQAogCXN0cnVjdCBzY3NpX2NtbmQgKmNtZCA9IGMtPnNjc2lfY21kOwogCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmRldiA9IGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKIAorCWlmICghZGV2KQorCQlyZXR1cm4gLTE7CisKIAljLT5waHlzX2Rpc2sgPSBkZXY7CiAKIAlyZXR1cm4gaHBzYV9zY3NpX2lvYWNjZWxfcXVldWVfY29tbWFuZChoLCBjLCBkZXYtPmlvYWNjZWxfaGFuZGxlLApAQCAtNDY3MCw5ICs0NzI3LDExIEBACiAJICovCiAJc3dpdGNoIChjbWQtPmNtbmRbMF0pIHsKIAkvKiBSZXF1aXJlZD8gNi1ieXRlIGNkYnMgZWxpbWluYXRlZCBieSBmaXh1cF9pb2FjY2VsX2NkYiAqLwotCWNhc2UgV1JJVEVfNjoKIAljYXNlIFJFQURfNjoKLQkJZmlyc3RfYmxvY2sgPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmNtZC0+Y21uZFsyXSk7CisJY2FzZSBXUklURV82OgorCQlmaXJzdF9ibG9jayA9ICgoKGNtZC0+Y21uZFsxXSAmIDB4MUYpIDw8IDE2KSB8CisJCQkJKGNtZC0+Y21uZFsyXSA8PCA4KSB8CisJCQkJY21kLT5jbW5kWzNdKTsKIAkJYnJlYWs7CiAJY2FzZSBXUklURV8xMDoKIAljYXNlIFJFQURfMTA6CkBAIC00NzE0LDYgKzQ3NzMsMTIgQEAKIAl1MzIgbGVuOwogCXUzMiB0b3RhbF9sZW4gPSAwOwogCisJaWYgKCFjbWQtPmRldmljZSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFjbWQtPmRldmljZS0+aG9zdGRhdGEpCisJCXJldHVybiAtMTsKKwogCUJVR19PTihzY3NpX3NnX2NvdW50KGNtZCkgPiBoLT5tYXhzZ2VudHJpZXMpOwogCiAJaWYgKGZpeHVwX2lvYWNjZWxfY2RiKGNkYiwgJmNkYl9sZW4pKSB7CkBAIC00ODIyLDYgKzQ4ODcsMTIgQEAKIAlzdHJ1Y3QgQ29tbWFuZExpc3QgKmMsIHUzMiBpb2FjY2VsX2hhbmRsZSwgdTggKmNkYiwgaW50IGNkYl9sZW4sCiAJdTggKnNjc2kzYWRkciwgc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqcGh5c19kaXNrKQogeworCWlmICghYy0+c2NzaV9jbWQtPmRldmljZSkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFjLT5zY3NpX2NtZC0+ZGV2aWNlLT5ob3N0ZGF0YSkKKwkJcmV0dXJuIC0xOworCiAJLyogVHJ5IHRvIGhvbm9yIHRoZSBkZXZpY2UncyBxdWV1ZSBkZXB0aCAqLwogCWlmIChhdG9taWNfaW5jX3JldHVybigmcGh5c19kaXNrLT5pb2FjY2VsX2NtZHNfb3V0KSA+CiAJCQkJCXBoeXNfZGlzay0+cXVldWVfZGVwdGgpIHsKQEAgLTQ5MDIsMTIgKzQ5NzMsMTcgQEAKICNlbmRpZgogCWludCBvZmZsb2FkX3RvX21pcnJvcjsKIAorCWlmICghZGV2KQorCQlyZXR1cm4gLTE7CisKIAkvKiBjaGVjayBmb3IgdmFsaWQgb3Bjb2RlLCBnZXQgTEJBIGFuZCBibG9jayBjb3VudCAqLwogCXN3aXRjaCAoY21kLT5jbW5kWzBdKSB7CiAJY2FzZSBXUklURV82OgogCQlpc193cml0ZSA9IDE7CiAJY2FzZSBSRUFEXzY6Ci0JCWZpcnN0X2Jsb2NrID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZjbWQtPmNtbmRbMl0pOworCQlmaXJzdF9ibG9jayA9ICgoKGNtZC0+Y21uZFsxXSAmIDB4MUYpIDw8IDE2KSB8CisJCQkJKGNtZC0+Y21uZFsyXSA8PCA4KSB8CisJCQkJY21kLT5jbW5kWzNdKTsKIAkJYmxvY2tfY250ID0gY21kLT5jbW5kWzRdOwogCQlpZiAoYmxvY2tfY250ID09IDApCiAJCQlibG9ja19jbnQgPSAyNTY7CkBAIC01MzE0LDYgKzUzOTAsOSBAQAogCXN0cnVjdCBocHNhX3Njc2lfZGV2X3QgKmRldiA9IGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKIAlpbnQgcmMgPSBJT19BQ0NFTF9JTkVMSUdJQkxFOwogCisJaWYgKCFkZXYpCisJCXJldHVybiBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZOworCiAJY21kLT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKikgYzsKIAogCWlmIChkZXYtPm9mZmxvYWRfZW5hYmxlZCkgewpAQCAtNTg1Miw2ICs1OTMxLDkgQEAKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kID0gY29tbWFuZF90b19hYm9ydC0+c2NzaV9jbWQ7CiAJc3RydWN0IGhwc2Ffc2NzaV9kZXZfdCAqZGV2ID0gc2NtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKIAorCWlmICghZGV2KQorCQlyZXR1cm47CisKIAkvKgogCSAqIFdlJ3JlIG92ZXJsYXlpbmcgc3RydWN0IGhwc2FfdG1mX3N0cnVjdCBvbiB0b3Agb2Ygc29tZXRoaW5nIHdoaWNoCiAJICogd2FzIGFsbG9jYXRlZCBhcyBhIHN0cnVjdCBpb19hY2NlbDJfY21kLCBzbyB3ZSBiZXR0ZXIgYmUgc3VyZSBpdApAQCAtNTkzNSw3ICs2MDE3LDcgQEAKIAkJCSJSZXNldCBhcyBhYm9ydDogUmVzZXR0aW5nIHBoeXNpY2FsIGRldmljZSBhdCBzY3NpM2FkZHIgMHglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKIAkJCXBzYVswXSwgcHNhWzFdLCBwc2FbMl0sIHBzYVszXSwKIAkJCXBzYVs0XSwgcHNhWzVdLCBwc2FbNl0sIHBzYVs3XSk7Ci0JcmMgPSBocHNhX2RvX3Jlc2V0KGgsIGRldiwgcHNhLCBIUFNBX1JFU0VUX1RZUEVfVEFSR0VULCByZXBseV9xdWV1ZSk7CisJcmMgPSBocHNhX2RvX3Jlc2V0KGgsIGRldiwgcHNhLCBIUFNBX1BIWVNfVEFSR0VUX1JFU0VULCByZXBseV9xdWV1ZSk7CiAJaWYgKHJjICE9IDApIHsKIAkJZGV2X3dhcm4oJmgtPnBkZXYtPmRldiwKIAkJCSJSZXNldCBhcyBhYm9ydDogRmFpbGVkIG9uIHBoeXNpY2FsIGRldmljZSBhdCBzY3NpM2FkZHIgMHglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeFxuIiwKQEAgLTU5NzIsNiArNjA1NCw5IEBACiAJc3RydWN0IGlvX2FjY2VsMl9jbWQgKmMyOwogCiAJZGV2ID0gYWJvcnQtPnNjc2lfY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCWlmICghZGV2KQorCQlyZXR1cm4gLTE7CisKIAlpZiAoIWRldi0+b2ZmbG9hZF9lbmFibGVkICYmICFkZXYtPmhiYV9pb2FjY2VsX2VuYWJsZWQpCiAJCXJldHVybiAtMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hwc2EuaCBiL2RyaXZlcnMvc2NzaS9ocHNhLmgKaW5kZXggYTE0ODdlNi4uODJjZGZhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2EuaAorKysgYi9kcml2ZXJzL3Njc2kvaHBzYS5oCkBAIC0zMTIsNyArMzEyLDYgQEAKICNkZWZpbmUgSFBTQV9ERVZJQ0VfUkVTRVRfTVNHIDEKICNkZWZpbmUgSFBTQV9SRVNFVF9UWVBFX0NPTlRST0xMRVIgMHgwMAogI2RlZmluZSBIUFNBX1JFU0VUX1RZUEVfQlVTIDB4MDEKLSNkZWZpbmUgSFBTQV9SRVNFVF9UWVBFX1RBUkdFVCAweDAzCiAjZGVmaW5lIEhQU0FfUkVTRVRfVFlQRV9MVU4gMHgwNAogI2RlZmluZSBIUFNBX1BIWVNfVEFSR0VUX1JFU0VUIDB4OTkgLyogbm90IGRlZmluZWQgYnkgY2Npc3Mgc3BlYyAqLwogI2RlZmluZSBIUFNBX01TR19TRU5EX1JFVFJZX0xJTUlUIDEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaHBzYV9jbWQuaCBiL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCmluZGV4IGE1YmUxNTMuLmE1ODRjZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCisrKyBiL2RyaXZlcnMvc2NzaS9ocHNhX2NtZC5oCkBAIC0xNTcsNiArMTU3LDcgQEAKIAogLyogVlBEIElucXVpcnkgdHlwZXMgKi8KICNkZWZpbmUgSFBTQV9WUERfU1VQUE9SVEVEX1BBR0VTICAgICAgICAweDAwCisjZGVmaW5lIEhQU0FfVlBEX0xWX0RFVklDRV9JRCAgICAgICAgICAgMHg4MwogI2RlZmluZSBIUFNBX1ZQRF9MVl9ERVZJQ0VfR0VPTUVUUlkgICAgIDB4QzEKICNkZWZpbmUgSFBTQV9WUERfTFZfSU9BQ0NFTF9TVEFUVVMgICAgICAweEMyCiAjZGVmaW5lIEhQU0FfVlBEX0xWX1NUQVRVUwkJMHhDMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5jCmluZGV4IGFiNjdlYzQuLjdlNDg3YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuYworKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmMKQEAgLTUyLDYgKzUyLDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGlzY190aHJlYWRzID0gSUJNVkZDX01BWF9ESVNDX1RIUkVBRFM7CiBzdGF0aWMgdW5zaWduZWQgaW50IGlibXZmY19kZWJ1ZyA9IElCTVZGQ19ERUJVRzsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbG9nX2xldmVsID0gSUJNVkZDX0RFRkFVTFRfTE9HX0xFVkVMOworc3RhdGljIHVuc2lnbmVkIGludCBjbHMzX2Vycm9yID0gSUJNVkZDX0NMUzNfRVJST1I7CiBzdGF0aWMgTElTVF9IRUFEKGlibXZmY19oZWFkKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaWJtdmZjX2RyaXZlcl9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmlibXZmY190cmFuc3BvcnRfdGVtcGxhdGU7CkBAIC04Niw2ICs4Nyw5IEBACiBtb2R1bGVfcGFyYW1fbmFtZWQobG9nX2xldmVsLCBsb2dfbGV2ZWwsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhsb2dfbGV2ZWwsICJTZXQgdG8gMCAtIDQgZm9yIGluY3JlYXNpbmcgdmVyYm9zaXR5IG9mIGRldmljZSBkcml2ZXIuICIKIAkJICJbRGVmYXVsdD0iIF9fc3RyaW5naWZ5KElCTVZGQ19ERUZBVUxUX0xPR19MRVZFTCkgIl0iKTsKK21vZHVsZV9wYXJhbV9uYW1lZChjbHMzX2Vycm9yLCBjbHMzX2Vycm9yLCB1aW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY2xzM19lcnJvciwgIkVuYWJsZSBGQyBDbGFzcyAzIEVycm9yIFJlY292ZXJ5LiAiCisJCSAiW0RlZmF1bHQ9IiBfX3N0cmluZ2lmeShJQk1WRkNfQ0xTM19FUlJPUikgIl0iKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJdTE2IHN0YXR1czsKQEAgLTcxNyw3ICs3MjEsNiBAQAogCXNwaW5fbG9ja19pcnFzYXZlKHZob3N0LT5ob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKIAl2aG9zdC0+c3RhdGUgPSBJQk1WRkNfTk9fQ1JROwogCXZob3N0LT5sb2dnZWRfaW4gPSAwOwotCWlibXZmY19zZXRfaG9zdF9hY3Rpb24odmhvc3QsIElCTVZGQ19IT1NUX0FDVElPTl9OT05FKTsKIAogCS8qIENsZWFuIG91dCB0aGUgcXVldWUgKi8KIAltZW1zZXQoY3JxLT5tc2dzLCAwLCBQQUdFX1NJWkUpOwpAQCAtMTMzNSw2ICsxMzM4LDkgQEAKIAlzdHJ1Y3Qgc3JwX2RpcmVjdF9idWYgKmRhdGEgPSAmdmZjX2NtZC0+aW9iYTsKIAlzdHJ1Y3QgaWJtdmZjX2hvc3QgKnZob3N0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKKwlpZiAoY2xzM19lcnJvcikKKwkJdmZjX2NtZC0+ZmxhZ3MgfD0gY3B1X3RvX2JlMTYoSUJNVkZDX0NMQVNTXzNfRVJSKTsKKwogCXNnX21hcHBlZCA9IHNjc2lfZG1hX21hcChzY21kKTsKIAlpZiAoIXNnX21hcHBlZCkgewogCQl2ZmNfY21kLT5mbGFncyB8PSBjcHVfdG9fYmUxNihJQk1WRkNfTk9fTUVNX0RFU0MpOwpAQCAtMzM4MSw2ICszMzg3LDEwIEBACiAJcHJsaS0+cGFybXMudHlwZSA9IElCTVZGQ19TQ1NJX0ZDUF9UWVBFOwogCXBybGktPnBhcm1zLmZsYWdzID0gY3B1X3RvX2JlMTYoSUJNVkZDX1BSTElfRVNUX0lNR19QQUlSKTsKIAlwcmxpLT5wYXJtcy5zZXJ2aWNlX3Bhcm1zID0gY3B1X3RvX2JlMzIoSUJNVkZDX1BSTElfSU5JVElBVE9SX0ZVTkMpOworCXBybGktPnBhcm1zLnNlcnZpY2VfcGFybXMgfD0gY3B1X3RvX2JlMzIoSUJNVkZDX1BSTElfUkVBRF9GQ1BfWEZFUl9SRFlfRElTQUJMRUQpOworCisJaWYgKGNsczNfZXJyb3IpCisJCXBybGktPnBhcm1zLnNlcnZpY2VfcGFybXMgfD0gY3B1X3RvX2JlMzIoSUJNVkZDX1BSTElfUkVUUlkpOwogCiAJaWJtdmZjX3NldF90Z3RfYWN0aW9uKHRndCwgSUJNVkZDX1RHVF9BQ1RJT05fSU5JVF9XQUlUKTsKIAlpZiAoaWJtdmZjX3NlbmRfZXZlbnQoZXZ0LCB2aG9zdCwgZGVmYXVsdF90aW1lb3V0KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5oIGIvZHJpdmVycy9zY3NpL2libXZzY3NpL2libXZmYy5oCmluZGV4IDVjNzBhNTIuLjlhMDY5NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm12c2NzaS9pYm12ZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2kvaWJtdmZjLmgKQEAgLTU0LDYgKzU0LDcgQEAKICNkZWZpbmUgSUJNVkZDX0RFVl9MT1NTX1RNTwkJKDUgKiA2MCkKICNkZWZpbmUgSUJNVkZDX0RFRkFVTFRfTE9HX0xFVkVMCTIKICNkZWZpbmUgSUJNVkZDX01BWF9DREJfTEVOCQkxNgorI2RlZmluZSBJQk1WRkNfQ0xTM19FUlJPUgkJMAogCiAvKgogICogRW5zdXJlIHdlIGhhdmUgcmVzb3VyY2VzIGZvciBFUlAgYW5kIGluaXRpYWxpemF0aW9uOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libXZzY3NpX3RndC9pYm12c2NzaV90Z3QuYyBiL2RyaXZlcnMvc2NzaS9pYm12c2NzaV90Z3QvaWJtdnNjc2lfdGd0LmMKaW5kZXggYjI5ZmVmOS4uNjQyYjczOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2libXZzY3NpX3RndC9pYm12c2NzaV90Z3QuYworKysgYi9kcml2ZXJzL3Njc2kvaWJtdnNjc2lfdGd0L2libXZzY3NpX3RndC5jCkBAIC0xNjA2LDggKzE2MDYsNiBAQAogCiAJaWYgKCEodnNjc2ktPmZsYWdzICYgUkVTUE9OU0VfUV9ET1dOKSkgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY21kLCBueHQsICZ2c2NzaS0+d2FpdGluZ19yc3AsIGxpc3QpIHsKLQkJCXByX2RlYnVnKCJzZW5kX21lc3NhZ2VzIGNtZCAlcFxuIiwgY21kKTsKLQogCQkJaXVlID0gY21kLT5pdWU7CiAKIAkJCWNycS0+dmFsaWQgPSBWQUxJRF9DTURfUkVTUF9FTDsKQEAgLTE5MzQsNiArMTkzMiw4IEBACiAJLyoKIAkgKiBSZWxlYXNlIHRoZSBTQ1NJIElfVCBOZXh1cyB0byB0aGUgZW11bGF0ZWQgaWJtdnNjc2lzIFRhcmdldCBQb3J0CiAJICovCisJdGFyZ2V0X3dhaXRfZm9yX3Nlc3NfY21kcyhzZV9zZXNzKTsKKwl0cmFuc3BvcnRfZGVyZWdpc3Rlcl9zZXNzaW9uX2NvbmZpZ2ZzKHNlX3Nlc3MpOwogCXRyYW5zcG9ydF9kZXJlZ2lzdGVyX3Nlc3Npb24oc2Vfc2Vzcyk7CiAJdHBvcnQtPmlibXZfbmV4dXMgPSBOVUxMOwogCWtmcmVlKG5leHVzKTsKQEAgLTE5NzgsNyArMTk3OCw3IEBACiAJCXJlYXNvbiA9IFNSUF9MT0dJTl9SRUpfTVVMVElfQ0hBTk5FTF9VTlNVUFBPUlRFRDsKIAllbHNlIGlmIChmbXQtPmJ1ZmZlcnMgJiAoflNVUFBPUlRFRF9GT1JNQVRTKSkKIAkJcmVhc29uID0gU1JQX0xPR0lOX1JFSl9VTlNVUFBPUlRFRF9ERVNDUklQVE9SX0ZNVDsKLQllbHNlIGlmICgoZm10LT5idWZmZXJzIHwgU1VQUE9SVEVEX0ZPUk1BVFMpID09IDApCisJZWxzZSBpZiAoKGZtdC0+YnVmZmVycyAmIFNVUFBPUlRFRF9GT1JNQVRTKSA9PSAwKQogCQlyZWFzb24gPSBTUlBfTE9HSU5fUkVKX1VOU1VQUE9SVEVEX0RFU0NSSVBUT1JfRk1UOwogCiAJaWYgKHZzY3NpLT5zdGF0ZSA9PSBTUlBfUFJPQ0VTU0lORykKQEAgLTI1NTQsMTAgKzI1NTQsNiBAQAogCiAJc3JwLT5sdW4uc2NzaV9sdW5bMF0gJj0gMHgzZjsKIAotCXByX2RlYnVnKCJjYWxsaW5nIHN1Ym1pdF9jbWQsIHNlX2NtZCAlcCwgbHVuIDB4JWxseCwgY2RiIDB4JXgsIGF0dHI6JWRcbiIsCi0JCSAmY21kLT5zZV9jbWQsIHNjc2lsdW5fdG9faW50KCZzcnAtPmx1biksIChpbnQpc3JwLT5jZGJbMF0sCi0JCSBhdHRyKTsKLQogCXJjID0gdGFyZ2V0X3N1Ym1pdF9jbWQoJmNtZC0+c2VfY21kLCBuZXh1cy0+c2Vfc2Vzcywgc3JwLT5jZGIsCiAJCQkgICAgICAgY21kLT5zZW5zZV9idWYsIHNjc2lsdW5fdG9faW50KCZzcnAtPmx1biksCiAJCQkgICAgICAgZGF0YV9sZW4sIGF0dHIsIGRpciwgMCk7CkBAIC0zMTQyLDggKzMxMzgsNiBAQAogCWxvbmcgdHhfbGVuOwogCWxvbmcgcmMgPSAwOwogCi0JcHJfZGVidWcoInJkbWE6IGRpciAlZCwgYnl0ZXMgMHgleFxuIiwgZGlyLCBieXRlcyk7Ci0KIAlpZiAoYnl0ZXMgPT0gMCkKIAkJcmV0dXJuIDA7CiAKQEAgLTMxOTIsMTIgKzMxODYsNiBAQAogCQkJCQkgdnNjc2ktPmRkcy53aW5kb3dbTE9DQUxdLmxpb2JuLAogCQkJCQkgc2VydmVyX2lvYmEpOwogCQl9IGVsc2UgewotCQkJLyogd3JpdGUgdG8gY2xpZW50ICovCi0JCQlzdHJ1Y3Qgc3JwX2NtZCAqc3JwID0gKHN0cnVjdCBzcnBfY21kICopaXVlLT5zYnVmLT5idWY7Ci0KLQkJCWlmICghUkVBRF9DTUQoc3JwLT5jZGIpKQotCQkJCXByaW50X2hleF9kdW1wX2J5dGVzKCIgZGF0YToiLCBEVU1QX1BSRUZJWF9OT05FLAotCQkJCQkJICAgICBzZ192aXJ0KHNncCksIGJ1Zl9sZW4pOwogCQkJLyogVGhlIGhfY29weV9yZG1hIHdpbGwgY2F1c2UgcGh5cCwgcnVubmluZyBpbiBhbm90aGVyCiAJCQkgKiBwYXJ0aXRpb24sIHRvIHJlYWQgbWVtb3J5LCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQogCQkJICogdGhlIGRhdGEgaGFzIGJlZW4gd3JpdHRlbiBvdXQsIGhlbmNlIHRoZXNlIHN5bmNzLgpAQCAtMzMyMiwxMiArMzMxMCw5IEBACiAJCQkJcmMgPSBpYm12c2NzaXNfdHJhbnNfZXZlbnQodnNjc2ksIGNycSk7CiAJCQl9IGVsc2UgaWYgKHZzY3NpLT5mbGFncyAmIFRSQU5TX0VWRU5UKSB7CiAJCQkJLyoKLQkJCQkgKiBpZiBhIHRyYW5wb3J0IGV2ZW50IGhhcyBvY2N1cnJlZCBsZWF2ZQorCQkJCSAqIGlmIGEgdHJhbnNwb3J0IGV2ZW50IGhhcyBvY2N1cnJlZCBsZWF2ZQogCQkJCSAqIGV2ZXJ5dGhpbmcgYnV0IHRyYW5zcG9ydCBldmVudHMgb24gdGhlIHF1ZXVlCi0JCQkJICovCi0JCQkJcHJfZGVidWcoImhhbmRsZV9jcnEsIGlnbm9yaW5nXG4iKTsKLQotCQkJCS8qCisJCQkJICoKIAkJCQkgKiBuZWVkIHRvIGRlY3JlbWVudCB0aGUgcXVldWUgaW5kZXggc28gd2UgY2FuCiAJCQkJICogbG9vayBhdCB0aGUgZWxtZW50IGFnYWluCiAJCQkJICovCkBAIC0zNDYxLDYgKzM0NDYsNyBAQAogCXZzY3NpLT5tYXBfaW9iYSA9IGRtYV9tYXBfc2luZ2xlKCZ2ZGV2LT5kZXYsIHZzY3NpLT5tYXBfYnVmLCBQQUdFX1NJWkUsCiAJCQkJCSBETUFfQklESVJFQ1RJT05BTCk7CiAJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKCZ2ZGV2LT5kZXYsIHZzY3NpLT5tYXBfaW9iYSkpIHsKKwkJcmMgPSAtRU5PTUVNOwogCQlkZXZfZXJyKCZ2c2NzaS0+ZGV2LCAicHJvYmU6IGVycm9yIG1hcHBpbmcgY29tbWFuZCBidWZmZXJcbiIpOwogCQlnb3RvIGZyZWVfYnVmOwogCX0KQEAgLTM2OTMsMTIgKzM2NzksOSBAQAogCQkJCQkJIHNlX2NtZCk7CiAJc3RydWN0IHNjc2lfaW5mbyAqdnNjc2kgPSBjbWQtPmFkYXB0ZXI7CiAKLQlwcl9kZWJ1ZygicmVsZWFzZV9jbWQgJXAsIGZsYWdzICVkXG4iLCBzZV9jbWQsIGNtZC0+ZmxhZ3MpOwotCiAJc3Bpbl9sb2NrX2JoKCZ2c2NzaS0+aW50cl9sb2NrKTsKIAkvKiBSZW1vdmUgZnJvbSBhY3RpdmVfcSAqLwotCWxpc3RfZGVsKCZjbWQtPmxpc3QpOwotCWxpc3RfYWRkX3RhaWwoJmNtZC0+bGlzdCwgJnZzY3NpLT53YWl0aW5nX3JzcCk7CisJbGlzdF9tb3ZlX3RhaWwoJmNtZC0+bGlzdCwgJnZzY3NpLT53YWl0aW5nX3JzcCk7CiAJaWJtdnNjc2lzX3NlbmRfbWVzc2FnZXModnNjc2kpOwogCXNwaW5fdW5sb2NrX2JoKCZ2c2NzaS0+aW50cl9sb2NrKTsKIH0KQEAgLTM3MTUsOSArMzY5OCw2IEBACiAJc3RydWN0IGl1X2VudHJ5ICppdWUgPSBjbWQtPml1ZTsKIAlpbnQgcmM7CiAKLQlwcl9kZWJ1Zygid3JpdGVfcGVuZGluZywgc2VfY21kICVwLCBsZW5ndGggMHgleFxuIiwKLQkJIHNlX2NtZCwgc2VfY21kLT5kYXRhX2xlbmd0aCk7Ci0KIAlyYyA9IHNycF90cmFuc2Zlcl9kYXRhKGNtZCwgJnZpb19pdShpdWUpLT5zcnAuY21kLCBpYm12c2NzaXNfcmRtYSwKIAkJCSAgICAgICAxLCAxKTsKIAlpZiAocmMpIHsKQEAgLTM3NTYsOSArMzczNiw2IEBACiAJdWludCBsZW4gPSAwOwogCWludCByYzsKIAotCXByX2RlYnVnKCJxdWV1ZV9kYXRhX2luLCBzZV9jbWQgJXAsIGxlbmd0aCAweCV4XG4iLAotCQkgc2VfY21kLCBzZV9jbWQtPmRhdGFfbGVuZ3RoKTsKLQogCXJjID0gc3JwX3RyYW5zZmVyX2RhdGEoY21kLCAmdmlvX2l1KGl1ZSktPnNycC5jbWQsIGlibXZzY3Npc19yZG1hLCAxLAogCQkJICAgICAgIDEpOwogCWlmIChyYykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2luMjAwMC5jIGIvZHJpdmVycy9zY3NpL2luMjAwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODgyZDlmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2NzaS9pbjIwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDIzMDIgKzAsMCBAQAotLyoKLSAqICAgIGluMjAwMC5jIC0gIExpbnV4IGRldmljZSBkcml2ZXIgZm9yIHRoZQotICogICAgICAgICAgICAgICAgQWx3YXlzIElOMjAwMCBJU0EgU0NTSSBjYXJkLgotICoKLSAqIENvcHlyaWdodCAoYykgMTk5NiBKb2huIFNoaWZmbGV0dCwgR2VvTG9nIENvbnN1bHRpbmcKLSAqICAgIGpvaG5AZ2VvbG9nLmNvbQotICogICAganNoaWZmbGVAbmV0Y29tLmNvbQotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBGb3IgdGhlIGF2b2lkYW5jZSBvZiBkb3VidCB0aGUgInByZWZlcnJlZCBmb3JtIiBvZiB0aGlzIGNvZGUgaXMgb25lIHdoaWNoCi0gKiBpcyBpbiBhbiBvcGVuIG5vbiBwYXRlbnQgZW5jdW1iZXJlZCBmb3JtYXQuIFdoZXJlIGNyeXB0b2dyYXBoaWMga2V5IHNpZ25pbmcKLSAqIGZvcm1zIHBhcnQgb2YgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gZXhlY3V0YWJsZSB0aGUgaW5mb3JtYXRpb24KLSAqIGluY2x1ZGluZyBrZXlzIG5lZWRlZCB0byBnZW5lcmF0ZSBhbiBlcXVpdmFsZW50bHkgZnVuY3Rpb25hbCBleGVjdXRhYmxlCi0gKiBhcmUgZGVlbWVkIHRvIGJlIHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlLgotICoKLSAqIERyZXcgRWNraGFyZHQncyBleGNlbGxlbnQgJ0dlbmVyaWMgTkNSNTM4MCcgc291cmNlcyBwcm92aWRlZAotICogbXVjaCBvZiB0aGUgaW5zcGlyYXRpb24gYW5kIHNvbWUgb2YgdGhlIGNvZGUgZm9yIHRoaXMgZHJpdmVyLgotICogVGhlIExpbnV4IElOMjAwMCBkcml2ZXIgZGlzdHJpYnV0ZWQgaW4gdGhlIExpbnV4IGtlcm5lbHMgdGhyb3VnaAotICogdmVyc2lvbiAxLjIuMTMgd2FzIGFuIGV4dHJlbWVseSB2YWx1YWJsZSByZWZlcmVuY2Ugb24gdGhlIGFyY2FuZQotICogKGFuZCBzdGlsbCBteXN0ZXJpb3VzKSB3b3JraW5ncyBvZiB0aGUgSU4yMDAwJ3MgZmlmby4gSXQgYWxzbwotICogaXMgd2hlcmUgSSBsaWZ0ZWQgaW4yMDAwX2Jpb3NwYXJhbSgpLCB0aGUgZ2lzdCBvZiB0aGUgY2FyZAotICogZGV0ZWN0aW9uIHNjaGVtZSwgYW5kIG90aGVyIGJpdHMgb2YgY29kZS4gTWFueSB0aGFua3MgdG8gdGhlCi0gKiB0YWxlbnRlZCBhbmQgY291cmFnZW91cyBwZW9wbGUgd2hvIHdyb3RlLCBjb250cmlidXRlZCB0bywgYW5kCi0gKiBtYWludGFpbmVkIHRoYXQgZHJpdmVyIChpbmNsdWRpbmcgQnJhZCBNY0xlYW4sIFNoYXVuIFNhdmFnZSwKLSAqIEJpbGwgRWFybmVzdCwgTGFycnkgRG9vbGl0dGxlLCBSb2dlciBTdW5zaGluZSwgSm9obiBMdWNrZXksCi0gKiBNYXR0IFBvc3RpZmYsIFBldGVyIEx1LCB6ZXJ1Y2hhQHNoZWxsLnBvcnRhbC5jb20sIGFuZCBFcmljCi0gKiBZb3VuZ2RhbGUpLiBJIHNob3VsZCBhbHNvIG1lbnRpb24gdGhlIGRyaXZlciB3cml0dGVuIGJ5Ci0gKiBIYW1pc2ggTWFjZG9uYWxkIGZvciB0aGUgKEdBU1AhKSBBbWlnYSBBMjA5MSBjYXJkLCBpbmNsdWRlZAotICogaW4gdGhlIExpbnV4LW02OGsgZGlzdHJpYnV0aW9uOyBpdCBnYXZlIG1lIGEgZ29vZCBpbml0aWFsCi0gKiB1bmRlcnN0YW5kaW5nIG9mIHRoZSBwcm9wZXIgd2F5IHRvIHJ1biBhIFdEMzNjOTMgY2hpcCwgYW5kIEkKLSAqIGVuZGVkIHVwIHN0ZWFsaW5nIGxvdHMgb2YgY29kZSBmcm9tIGl0LgotICoKLSAqIF9UaGlzXyBkcml2ZXIgaXMgKEkgZmVlbCkgYW4gaW1wcm92ZW1lbnQgb3ZlciB0aGUgb2xkIG9uZSBpbgotICogc2V2ZXJhbCByZXNwZWN0czoKLSAqICAgIC0gIEFsbCBwcm9ibGVtcyByZWxhdGluZyB0byB0aGUgZGF0YSBzaXplIG9mIGEgU0NTSSByZXF1ZXN0IGFyZQotICogICAgICAgICAgZ29uZSAoYXMgZmFyIGFzIEkga25vdykuIFRoZSBvbGQgZHJpdmVyIGNvdWxkbid0IGhhbmRsZQotICogICAgICAgICAgc3dhcHBpbmcgdG8gcGFydGl0aW9ucyBiZWNhdXNlIHRoYXQgaW52b2x2ZWQgNGsgYmxvY2tzLCBub3IKLSAqICAgICAgICAgIGNvdWxkIGl0IGRlYWwgd2l0aCB0aGUgc3QuYyB0YXBlIGRyaXZlciB1bm1vZGlmaWVkLCBiZWNhdXNlCi0gKiAgICAgICAgICB0aGF0IHVzdWFsbHkgaW52b2x2ZWQgNGsgLSAzMmsgYmxvY2tzLiBUaGUgb2xkIGRyaXZlciBuZXZlcgotICogICAgICAgICAgcXVpdGUgZ290IGF3YXkgZnJvbSBhIG1vcmJpZCBkZXBlbmRlbmNlIG9uIDJrIGJsb2NrIHNpemVzIC0KLSAqICAgICAgICAgIHdoaWNoIG9mIGNvdXJzZSBpcyB0aGUgc2l6ZSBvZiB0aGUgY2FyZCdzIGZpZm8uCi0gKgotICogICAgLSAgVGFyZ2V0IERpc2Nvbm5lY3Rpb24vUmVjb25uZWN0aW9uIGlzIG5vdyBzdXBwb3J0ZWQuIEFueQotICogICAgICAgICAgc3lzdGVtIHdpdGggbW9yZSB0aGFuIG9uZSBkZXZpY2UgYWN0aXZlIG9uIHRoZSBTQ1NJIGJ1cwotICogICAgICAgICAgd2lsbCBiZW5lZml0IGZyb20gdGhpcy4gVGhlIGRyaXZlciBkZWZhdWx0cyB0byB3aGF0IEknbQotICogICAgICAgICAgY2FsbGluZyAnYWRhcHRpdmUgZGlzY29ubmVjdCcgLSBtZWFuaW5nIHRoYXQgZWFjaCBjb21tYW5kCi0gKiAgICAgICAgICBpcyBldmFsdWF0ZWQgaW5kaXZpZHVhbGx5IGFzIHRvIHdoZXRoZXIgb3Igbm90IGl0IHNob3VsZAotICogICAgICAgICAgYmUgcnVuIHdpdGggdGhlIG9wdGlvbiB0byBkaXNjb25uZWN0L3Jlc2VsZWN0IChpZiB0aGUKLSAqICAgICAgICAgIGRldmljZSBjaG9vc2VzKSwgb3IgYXMgYSAiU0NTSS1idXMtaG9nIi4KLSAqCi0gKiAgICAtICBTeW5jaHJvbm91cyBkYXRhIHRyYW5zZmVycyBhcmUgbm93IHN1cHBvcnRlZC4gQmVjYXVzZSB0aGVyZQotICogICAgICAgICAgYXJlIGEgZmV3IGRldmljZXMgKGFuZCBtYW55IGltcHJvcGVybHkgdGVybWluYXRlZCBzeXN0ZW1zKQotICogICAgICAgICAgdGhhdCBjaG9rZSB3aGVuIGRvaW5nIHN5bmMsIHRoZSBkZWZhdWx0IGlzIHN5bmMgRElTQUJMRUQKLSAqICAgICAgICAgIGZvciBhbGwgZGV2aWNlcy4gVGhpcyBmYXN0ZXIgcHJvdG9jb2wgY2FuIChhbmQgc2hvdWxkISkKLSAqICAgICAgICAgIGJlIGVuYWJsZWQgb24gc2VsZWN0ZWQgZGV2aWNlcyB2aWEgdGhlIGNvbW1hbmQtbGluZS4KLSAqCi0gKiAgICAtICBSdW50aW1lIG9wZXJhdGluZyBwYXJhbWV0ZXJzIGNhbiBub3cgYmUgc3BlY2lmaWVkIHRocm91Z2gKLSAqICAgICAgIGVpdGhlciB0aGUgTElMTyBvciB0aGUgJ2luc21vZCcgY29tbWFuZCBsaW5lLiBGb3IgTElMTyBkbzoKLSAqICAgICAgICAgICJpbjIwMDA9YmxhaCxibGFoLGJsYWgiCi0gKiAgICAgICBhbmQgd2l0aCBpbnNtb2QgZ28gbGlrZToKLSAqICAgICAgICAgICJpbnNtb2QgL3Vzci9zcmMvbGludXgvbW9kdWxlcy9pbjIwMDAubyBzZXR1cF9zdHJpbmdzPWJsYWgsYmxhaCIKLSAqICAgICAgIFRoZSBkZWZhdWx0cyBzaG91bGQgYmUgZ29vZCBmb3IgbW9zdCBwZW9wbGUuIFNlZSB0aGUgY29tbWVudAotICogICAgICAgZm9yICdzZXR1cF9zdHJpbmdzJyBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICAgIC0gIFRoZSBvbGQgZHJpdmVyIHJlbGllZCBleGNsdXNpdmVseSBvbiB3aGF0IHRoZSBXZXN0ZXJuIERpZ2l0YWwKLSAqICAgICAgICAgIGRvY3MgY2FsbCAiQ29tYmluYXRpb24gTGV2ZWwgMiBDb21tYW5kcyIsIHdoaWNoIGFyZSBhIGdyZWF0Ci0gKiAgICAgICAgICBpZGVhIGluIHRoYXQgdGhlIENQVSBpcyByZWxpZXZlZCBvZiBhIGxvdCBvZiBpbnRlcnJ1cHQKLSAqICAgICAgICAgIG92ZXJoZWFkLiBIb3dldmVyLCBieSBhY2NlcHRpbmcgYSBjZXJ0YWluICh1c2VyLXNldHRhYmxlKQotICogICAgICAgICAgYW1vdW50IG9mIGFkZGl0aW9uYWwgaW50ZXJydXB0cywgdGhpcyBkcml2ZXIgYWNoaWV2ZXMKLSAqICAgICAgICAgIGJldHRlciBjb250cm9sIG92ZXIgdGhlIFNDU0kgYnVzLCBhbmQgZGF0YSB0cmFuc2ZlcnMgYXJlCi0gKiAgICAgICAgICBhbG1vc3QgYXMgZmFzdCB3aGlsZSBiZWluZyBtdWNoIGVhc2llciB0byBkZWZpbmUsIHRyYWNrLAotICogICAgICAgICAgYW5kIGRlYnVnLgotICoKLSAqICAgIC0gIFlvdSBjYW4gZm9yY2UgZGV0ZWN0aW9uIG9mIGEgY2FyZCB3aG9zZSBCSU9TIGhhcyBiZWVuIGRpc2FibGVkLgotICoKLSAqICAgIC0gIE11bHRpcGxlIElOMjAwMCBjYXJkcyBtaWdodCBhbG1vc3QgYmUgc3VwcG9ydGVkLiBJJ3ZlIHRyaWVkIHRvCi0gKiAgICAgICBrZWVwIGl0IGluIG1pbmQsIGJ1dCBoYXZlIG5vIHdheSB0byB0ZXN0Li4uCi0gKgotICoKLSAqIFRPRE86Ci0gKiAgICAgICB0YWdnZWQgcXVldWluZy4gbXVsdGlwbGUgY2FyZHMuCi0gKgotICoKLSAqIE5PVEU6Ci0gKiAgICAgICBXaGVuIHVzaW5nIHRoaXMgb3IgYW55IG90aGVyIFNDU0kgZHJpdmVyIGFzIGEgbW9kdWxlLCB5b3UnbGwKLSAqICAgICAgIGZpbmQgdGhhdCB3aXRoIHRoZSBzdG9jayBrZXJuZWwsIGF0IG1vc3QgX3R3b18gU0NTSSBoYXJkCi0gKiAgICAgICBkcml2ZXMgd2lsbCBiZSBsaW5rZWQgaW50byB0aGUgZGV2aWNlIGxpc3QgKGllLCB1c2FibGUpLgotICogICAgICAgSWYgeW91ciBJTjIwMDAgY2FyZCBoYXMgbW9yZSB0aGFuIDIgZGlza3Mgb24gaXRzIGJ1cywgeW91Ci0gKiAgICAgICBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGUgZGVmaW5lIG9mICdTRF9FWFRSQV9ERVZTJyBpbiB0aGUKLSAqICAgICAgICdob3N0cy5oJyBmaWxlIGZyb20gMiB0byB3aGF0ZXZlciBpcyBhcHByb3ByaWF0ZS4gSXQgdG9vawotICogICAgICAgbWUgYSB3aGlsZSB0byB0cmFjayBkb3duIHRoaXMgc3VycHJpc2luZ2x5IG9ic2N1cmUgYW5kCi0gKiAgICAgICB1bmRvY3VtZW50ZWQgbGl0dGxlICJmZWF0dXJlIi4KLSAqCi0gKgotICogUGVvcGxlIHdpdGggYnVnIHJlcG9ydHMsIHdpc2gtbGlzdHMsIGNvbXBsYWludHMsIGNvbW1lbnRzLAotICogb3IgaW1wcm92ZW1lbnRzIGFyZSBhc2tlZCB0byBwYWgtbGVlZXogZW1haWwgbWUgKEpvaG4gU2hpZmZsZXR0KQotICogYXQgam9obkBnZW9sb2cuY29tIG9yIGpzaGlmZmxlQG5ldGNvbS5jb20hIEknbSBhbnhpb3VzIHRvIGdldAotICogdGhpcyB0aGluZyBpbnRvIGFzIGdvb2QgYSBzaGFwZSBhcyBwb3NzaWJsZSwgYW5kIEknbSBwb3NpdGl2ZQotICogdGhlcmUgYXJlIGxvdHMgb2YgbHVya2luZyBidWdzIGFuZCAiU3R1cGlkIFBsYWNlcyIuCi0gKgotICogVXBkYXRlZCBmb3IgTGludXggMi41IGJ5IEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+Ci0gKgktIFVzaW5nIG5ld19laCBoYW5kbGVyCi0gKgktIEhvcGVmdWxseSBnb3QgYWxsIHRoZSBsb2NraW5nIHJpZ2h0IGFnYWluCi0gKglTZWUgIkZJWE1FIiBub3RlcyBmb3IgaXRlbXMgdGhhdCBjb3VsZCBkbyB3aXRoIG1vcmUgd29yawotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgInNjc2kuaCIKLSNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgotCi0jZGVmaW5lIElOMjAwMF9WRVJTSU9OICAgICIxLjMzLTIuNSIKLSNkZWZpbmUgSU4yMDAwX0RBVEUgICAgICAgIjIwMDIvMTEvMDMiCi0KLSNpbmNsdWRlICJpbjIwMDAuaCIKLQotCi0vKgotICogJ3NldHVwX3N0cmluZ3MnIGlzIGEgc2luZ2xlIHN0cmluZyB1c2VkIHRvIHBhc3Mgb3BlcmF0aW5nIHBhcmFtZXRlcnMgYW5kCi0gKiBzZXR0aW5ncyBmcm9tIHRoZSBrZXJuZWwvbW9kdWxlIGNvbW1hbmQtbGluZSB0byB0aGUgZHJpdmVyLiAnc2V0dXBfYXJnc1tdJwotICogaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IGRlZmluZSB0aGUgY29tcGlsZS10aW1lIGRlZmF1bHQgdmFsdWVzIGZvcgotICogdGhlc2Ugc2V0dGluZ3MuIElmIExpbnV4IGJvb3RzIHdpdGggYSBMSUxPIG9yIGluc21vZCBjb21tYW5kLWxpbmUsIHRob3NlCi0gKiBzZXR0aW5ncyBhcmUgY29tYmluZWQgd2l0aCAnc2V0dXBfYXJnc1tdJy4gTm90ZSB0aGF0IExJTE8gY29tbWFuZC1saW5lcwotICogYXJlIHByZWZpeGVkIHdpdGggImluMjAwMD0iIHdoaWxlIGluc21vZCB1c2VzIGEgInNldHVwX3N0cmluZ3M9IiBwcmVmaXguCi0gKiBUaGUgZHJpdmVyIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBrZXl3b3JkcyAobG93ZXIgY2FzZSByZXF1aXJlZCkgYW5kCi0gKiBhcmd1bWVudHM6Ci0gKgotICogLSAgaW9wb3J0OmFkZHIgICAgLVdoZXJlIGFkZHIgaXMgSU8gYWRkcmVzcyBvZiBhICh1c3VhbGx5IFJPTS1sZXNzKSBjYXJkLgotICogLSAgbm9yZXNldCAgICAgICAgLU5vIG9wdGlvbmFsIGFyZ3MuIFByZXZlbnRzIFNDU0kgYnVzIHJlc2V0IGF0IGJvb3QgdGltZS4KLSAqIC0gIG5vc3luYzp4ICAgICAgIC14IGlzIGEgYml0bWFzayB3aGVyZSB0aGUgMXN0IDcgYml0cyBjb3JyZXNwb25kIHdpdGgKLSAqICAgICAgICAgICAgICAgICAgICB0aGUgNyBwb3NzaWJsZSBTQ1NJIGRldmljZXMgKGJpdCAwIGZvciBkZXZpY2UgIzAsIGV0YykuCi0gKiAgICAgICAgICAgICAgICAgICAgU2V0IGEgYml0IHRvIFBSRVZFTlQgc3luYyBuZWdvdGlhdGlvbiBvbiB0aGF0IGRldmljZS4KLSAqICAgICAgICAgICAgICAgICAgICBUaGUgZHJpdmVyIGRlZmF1bHQgaXMgc3luYyBESVNBQkxFRCBvbiBhbGwgZGV2aWNlcy4KLSAqIC0gIHBlcmlvZDpucyAgICAgIC1ucyBpcyB0aGUgbWluaW11bSAjIG9mIG5hbm9zZWNvbmRzIGluIGEgU0NTSSBkYXRhIHRyYW5zZmVyCi0gKiAgICAgICAgICAgICAgICAgICAgcGVyaW9kLiBEZWZhdWx0IGlzIDUwMDsgYWNjZXB0YWJsZSB2YWx1ZXMgYXJlIDI1MCAtIDEwMDAuCi0gKiAtICBkaXNjb25uZWN0OnggICAteCA9IDAgdG8gbmV2ZXIgYWxsb3cgZGlzY29ubmVjdHMsIDIgdG8gYWx3YXlzIGFsbG93IHRoZW0uCi0gKiAgICAgICAgICAgICAgICAgICAgeCA9IDEgZG9lcyAnYWRhcHRpdmUnIGRpc2Nvbm5lY3RzLCB3aGljaCBpcyB0aGUgZGVmYXVsdAotICogICAgICAgICAgICAgICAgICAgIGFuZCBnZW5lcmFsbHkgdGhlIGJlc3QgY2hvaWNlLgotICogLSAgZGVidWc6eCAgICAgICAgLUlmICdERUJVR0dJTkdfT04nIGlzIGRlZmluZWQsIHggaXMgYSBiaXRtYXNrIHRoYXQgY2F1c2VzCi0gKiAgICAgICAgICAgICAgICAgICAgdmFyaW91cyB0eXBlcyBvZiBkZWJ1ZyBvdXRwdXQgdG8gcHJpbnRlZCAtIHNlZSB0aGUgREJfeHh4Ci0gKiAgICAgICAgICAgICAgICAgICAgZGVmaW5lcyBpbiBpbjIwMDAuaAotICogLSAgcHJvYzp4ICAgICAgICAgLUlmICdQUk9DX0lOVEVSRkFDRScgaXMgZGVmaW5lZCwgeCBpcyBhIGJpdG1hc2sgdGhhdAotICogICAgICAgICAgICAgICAgICAgIGRldGVybWluZXMgaG93IHRoZSAvcHJvYyBpbnRlcmZhY2Ugd29ya3MgYW5kIHdoYXQgaXQKLSAqICAgICAgICAgICAgICAgICAgICBkb2VzIC0gc2VlIHRoZSBQUl94eHggZGVmaW5lcyBpbiBpbjIwMDAuaAotICoKLSAqIFN5bnRheCBOb3RlczoKLSAqIC0gIE51bWVyaWMgYXJndW1lbnRzIGNhbiBiZSBkZWNpbWFsIG9yIHRoZSAnMHgnIGZvcm0gb2YgaGV4IG5vdGF0aW9uLiBUaGVyZQotICogICAgX211c3RfIGJlIGEgY29sb24gYmV0d2VlbiBhIGtleXdvcmQgYW5kIGl0cyBudW1lcmljIGFyZ3VtZW50LCB3aXRoIG5vCi0gKiAgICBzcGFjZXMuCi0gKiAtICBLZXl3b3JkcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcywgbm8gc3BhY2VzLCBpbiB0aGUgc3RhbmRhcmQga2VybmVsCi0gKiAgICBjb21tYW5kLWxpbmUgbWFubmVyLgotICogLSAgQSBrZXl3b3JkIGluIHRoZSAnbnRoJyBjb21tYS1zZXBhcmF0ZWQgY29tbWFuZC1saW5lIG1lbWJlciB3aWxsIG92ZXJ3cml0ZQotICogICAgdGhlICdudGgnIGVsZW1lbnQgb2Ygc2V0dXBfYXJnc1tdLiBBIGJsYW5rIGNvbW1hbmQtbGluZSBtZW1iZXIgKGluCi0gKiAgICBvdGhlciB3b3JkcywgYSBjb21tYSB3aXRoIG5vIHByZWNlZGluZyBrZXl3b3JkKSB3aWxsIF9ub3RfIG92ZXJ3cml0ZQotICogICAgdGhlIGNvcnJlc3BvbmRpbmcgc2V0dXBfYXJnc1tdIGVsZW1lbnQuCi0gKgotICogQSBmZXcgTElMTyBleGFtcGxlcyAoZm9yIGluc21vZCwgdXNlICdzZXR1cF9zdHJpbmdzJyBpbnN0ZWFkIG9mICdpbjIwMDAnKToKLSAqIC0gIGluMjAwMD1pb3BvcnQ6MHgyMjAsbm9yZXNldAotICogLSAgaW4yMDAwPXBlcmlvZDoyNTAsZGlzY29ubmVjdDoyLG5vc3luYzoweDAzCi0gKiAtICBpbjIwMDA9ZGVidWc6MHgxZQotICogLSAgaW4yMDAwPXByb2M6MwotICovCi0KLS8qIE5vcm1hbGx5LCBubyBkZWZhdWx0cyBhcmUgc3BlY2lmaWVkLi4uICovCi1zdGF0aWMgY2hhciAqc2V0dXBfYXJnc1tdID0geyAiIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsICIiIH07Ci0KLS8qIGZpbGxlZCBpbiBieSAnaW5zbW9kJyAqLwotc3RhdGljIGNoYXIgKnNldHVwX3N0cmluZ3M7Ci0KLW1vZHVsZV9wYXJhbShzZXR1cF9zdHJpbmdzLCBjaGFycCwgMCk7Ci0KLXN0YXRpYyBpbmxpbmUgdWNoYXIgcmVhZF8zMzkzKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhvc3RkYXRhLCB1Y2hhciByZWdfbnVtKQotewotCXdyaXRlMV9pbyhyZWdfbnVtLCBJT19XRF9BRERSKTsKLQlyZXR1cm4gcmVhZDFfaW8oSU9fV0RfREFUQSk7Ci19Ci0KLQotI2RlZmluZSBSRUFEX0FVWF9TVEFUKCkgcmVhZDFfaW8oSU9fV0RfQVNSKQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV8zMzkzKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhvc3RkYXRhLCB1Y2hhciByZWdfbnVtLCB1Y2hhciB2YWx1ZSkKLXsKLQl3cml0ZTFfaW8ocmVnX251bSwgSU9fV0RfQUREUik7Ci0Jd3JpdGUxX2lvKHZhbHVlLCBJT19XRF9EQVRBKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfMzM5M19jbWQoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGEsIHVjaGFyIGNtZCkKLXsKLS8qICAgd2hpbGUgKFJFQURfQVVYX1NUQVQoKSAmIEFTUl9DSVApCi0gICAgICBwcmludGsoInwiKTsqLwotCXdyaXRlMV9pbyhXRF9DT01NQU5ELCBJT19XRF9BRERSKTsKLQl3cml0ZTFfaW8oY21kLCBJT19XRF9EQVRBKTsKLX0KLQotCi1zdGF0aWMgdWNoYXIgcmVhZF8xX2J5dGUoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGEpCi17Ci0JdWNoYXIgYXNyLCB4ID0gMDsKLQotCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTlRST0wsIENUUkxfSURJIHwgQ1RSTF9FREkgfCBDVFJMX1BPTExFRCk7Ci0Jd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9UUkFOU19JTkZPIHwgMHg4MCk7Ci0JZG8gewotCQlhc3IgPSBSRUFEX0FVWF9TVEFUKCk7Ci0JCWlmIChhc3IgJiBBU1JfREJSKQotCQkJeCA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfREFUQSk7Ci0JfSB3aGlsZSAoIShhc3IgJiBBU1JfSU5UKSk7Ci0JcmV0dXJuIHg7Ci19Ci0KLQotc3RhdGljIHZvaWQgd3JpdGVfMzM5M19jb3VudChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKLXsKLQl3cml0ZTFfaW8oV0RfVFJBTlNGRVJfQ09VTlRfTVNCLCBJT19XRF9BRERSKTsKLQl3cml0ZTFfaW8oKHZhbHVlID4+IDE2KSwgSU9fV0RfREFUQSk7Ci0Jd3JpdGUxX2lvKCh2YWx1ZSA+PiA4KSwgSU9fV0RfREFUQSk7Ci0Jd3JpdGUxX2lvKHZhbHVlLCBJT19XRF9EQVRBKTsKLX0KLQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkXzMzOTNfY291bnQoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQotCXdyaXRlMV9pbyhXRF9UUkFOU0ZFUl9DT1VOVF9NU0IsIElPX1dEX0FERFIpOwotCXZhbHVlID0gcmVhZDFfaW8oSU9fV0RfREFUQSkgPDwgMTY7Ci0JdmFsdWUgfD0gcmVhZDFfaW8oSU9fV0RfREFUQSkgPDwgODsKLQl2YWx1ZSB8PSByZWFkMV9pbyhJT19XRF9EQVRBKTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLQotLyogVGhlIDMzYzkzIG5lZWRzIHRvIGJlIHRvbGQgd2hpY2ggZGlyZWN0aW9uIGEgY29tbWFuZCB0cmFuc2ZlcnMgaXRzCi0gKiBkYXRhOyB3ZSB1c2UgdGhpcyBmdW5jdGlvbiB0byBmaWd1cmUgaXQgb3V0LiBSZXR1cm5zIHRydWUgaWYgdGhlcmUKLSAqIHdpbGwgYmUgYSBEQVRBX09VVCBwaGFzZSB3aXRoIHRoaXMgY29tbWFuZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICogKFRoYW5rcyB0byBKb2VyZyBEb3JjaGFpbiBmb3IgdGhlIHJlc2VhcmNoIGFuZCBzdWdnZXN0aW9uLikKLSAqLwotc3RhdGljIGludCBpc19kaXJfb3V0KFNjc2lfQ21uZCAqIGNtZCkKLXsKLQlzd2l0Y2ggKGNtZC0+Y21uZFswXSkgewotCWNhc2UgV1JJVEVfNjoKLQljYXNlIFdSSVRFXzEwOgotCWNhc2UgV1JJVEVfMTI6Ci0JY2FzZSBXUklURV9MT05HOgotCWNhc2UgV1JJVEVfU0FNRToKLQljYXNlIFdSSVRFX0JVRkZFUjoKLQljYXNlIFdSSVRFX1ZFUklGWToKLQljYXNlIFdSSVRFX1ZFUklGWV8xMjoKLQljYXNlIENPTVBBUkU6Ci0JY2FzZSBDT1BZOgotCWNhc2UgQ09QWV9WRVJJRlk6Ci0JY2FzZSBTRUFSQ0hfRVFVQUw6Ci0JY2FzZSBTRUFSQ0hfSElHSDoKLQljYXNlIFNFQVJDSF9MT1c6Ci0JY2FzZSBTRUFSQ0hfRVFVQUxfMTI6Ci0JY2FzZSBTRUFSQ0hfSElHSF8xMjoKLQljYXNlIFNFQVJDSF9MT1dfMTI6Ci0JY2FzZSBGT1JNQVRfVU5JVDoKLQljYXNlIFJFQVNTSUdOX0JMT0NLUzoKLQljYXNlIFJFU0VSVkU6Ci0JY2FzZSBNT0RFX1NFTEVDVDoKLQljYXNlIE1PREVfU0VMRUNUXzEwOgotCWNhc2UgTE9HX1NFTEVDVDoKLQljYXNlIFNFTkRfRElBR05PU1RJQzoKLQljYXNlIENIQU5HRV9ERUZJTklUSU9OOgotCWNhc2UgVVBEQVRFX0JMT0NLOgotCWNhc2UgU0VUX1dJTkRPVzoKLQljYXNlIE1FRElVTV9TQ0FOOgotCWNhc2UgU0VORF9WT0xVTUVfVEFHOgotCWNhc2UgMHhlYToKLQkJcmV0dXJuIDE7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0KLQotc3RhdGljIHN0cnVjdCBzeF9wZXJpb2Qgc3hfdGFibGVbXSA9IHsKLQl7MSwgMHgyMH0sCi0JezI1MiwgMHgyMH0sCi0JezM3NiwgMHgzMH0sCi0JezUwMCwgMHg0MH0sCi0JezYyNCwgMHg1MH0sCi0Jezc1MiwgMHg2MH0sCi0Jezg3NiwgMHg3MH0sCi0JezEwMDAsIDB4MDB9LAotCXswLCAwfQotfTsKLQotc3RhdGljIGludCByb3VuZF9wZXJpb2QodW5zaWduZWQgaW50IHBlcmlvZCkKLXsKLQlpbnQgeDsKLQotCWZvciAoeCA9IDE7IHN4X3RhYmxlW3hdLnBlcmlvZF9uczsgeCsrKSB7Ci0JCWlmICgocGVyaW9kIDw9IHN4X3RhYmxlW3ggLSAwXS5wZXJpb2RfbnMpICYmIChwZXJpb2QgPiBzeF90YWJsZVt4IC0gMV0ucGVyaW9kX25zKSkgewotCQkJcmV0dXJuIHg7Ci0JCX0KLQl9Ci0JcmV0dXJuIDc7Ci19Ci0KLXN0YXRpYyB1Y2hhciBjYWxjX3N5bmNfeGZlcih1bnNpZ25lZCBpbnQgcGVyaW9kLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCXVjaGFyIHJlc3VsdDsKLQotCXBlcmlvZCAqPSA0OwkJLyogY29udmVydCBTRFRSIGNvZGUgdG8gbnMgKi8KLQlyZXN1bHQgPSBzeF90YWJsZVtyb3VuZF9wZXJpb2QocGVyaW9kKV0ucmVnX3ZhbHVlOwotCXJlc3VsdCB8PSAob2Zmc2V0IDwgT1BUSU1VTV9TWF9PRkYpID8gb2Zmc2V0IDogT1BUSU1VTV9TWF9PRkY7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIGluMjAwMF9leGVjdXRlKHN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlKTsKLQotc3RhdGljIGludCBpbjIwMDBfcXVldWVjb21tYW5kX2xjayhTY3NpX0NtbmQgKiBjbWQsIHZvaWQgKCpkb25lKSAoU2NzaV9DbW5kICopKQotewotCXN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlOwotCXN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhvc3RkYXRhOwotCVNjc2lfQ21uZCAqdG1wOwotCi0JaW5zdGFuY2UgPSBjbWQtPmRldmljZS0+aG9zdDsKLQlob3N0ZGF0YSA9IChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKLQotCURCKERCX1FVRVVFX0NPTU1BTkQsIHNjbWRfcHJpbnRrKEtFUk5fREVCVUcsIGNtZCwgIlEtJTAyeCgiLCBjbWQtPmNtbmRbMF0pKQotCi0vKiBTZXQgdXAgYSBmZXcgZmllbGRzIGluIHRoZSBTY3NpX0NtbmQgc3RydWN0dXJlIGZvciBvdXIgb3duIHVzZToKLSAqICAtIGhvc3Rfc2NyaWJibGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIG5leHQgY21kIGluIHRoZSBpbnB1dCBxdWV1ZQotICogIC0gc2NzaV9kb25lIHBvaW50cyB0byB0aGUgcm91dGluZSB3ZSBjYWxsIHdoZW4gYSBjbWQgaXMgZmluaXNoZWQKLSAqICAtIHJlc3VsdCBpcyB3aGF0IHlvdSdkIGV4cGVjdAotICovCi0JICAgIGNtZC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7Ci0JY21kLT5zY3NpX2RvbmUgPSBkb25lOwotCWNtZC0+cmVzdWx0ID0gMDsKLQotLyogV2UgdXNlIHRoZSBTY3NpX1BvaW50ZXIgc3RydWN0dXJlIHRoYXQncyBpbmNsdWRlZCB3aXRoIGVhY2ggY29tbWFuZAotICogYXMgYSBzY3JhdGNocGFkIChhcyBpdCdzIGludGVuZGVkIHRvIGJlIHVzZWQhKS4gVGhlIGhhbmR5IHRoaW5nIGFib3V0Ci0gKiB0aGUgU0NwLnh4eCBmaWVsZHMgaXMgdGhhdCB0aGV5J3JlIGFsd2F5cyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgotICogY21kLCBhbmQgYXJlIHByZXNlcnZlZCBhY3Jvc3MgZGlzY29ubmVjdC1yZXNlbGVjdC4gVGhpcyBtZWFucyB3ZQotICogY2FuIHByZXR0eSBtdWNoIGlnbm9yZSBTQVZFX1BPSU5URVJTIGFuZCBSRVNUT1JFX1BPSU5URVJTIG1lc3NhZ2VzCi0gKiBpZiB3ZSBrZWVwIGFsbCB0aGUgY3JpdGljYWwgcG9pbnRlcnMgYW5kIGNvdW50ZXJzIGluIFNDcDoKLSAqICAtIFNDcC5wdHIgaXMgdGhlIHBvaW50ZXIgaW50byB0aGUgUkFNIGJ1ZmZlcgotICogIC0gU0NwLnRoaXNfcmVzaWR1YWwgaXMgdGhlIHNpemUgb2YgdGhhdCBidWZmZXIKLSAqICAtIFNDcC5idWZmZXIgcG9pbnRzIHRvIHRoZSBjdXJyZW50IHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcgotICogIC0gU0NwLmJ1ZmZlcnNfcmVzaWR1YWwgdGVsbHMgdXMgaG93IG1hbnkgUy5HLiBidWZmZXJzIHRoZXJlIGFyZQotICogIC0gU0NwLmhhdmVfZGF0YV9pbiBoZWxwcyBrZWVwIHRyYWNrIG9mID4yMDQ4IGJ5dGUgdHJhbnNmZXJzCi0gKiAgLSBTQ3Auc2VudF9jb21tYW5kIGlzIG5vdCB1c2VkCi0gKiAgLSBTQ3AucGhhc2UgcmVjb3JkcyB0aGlzIGNvbW1hbmQncyBTUkNJRF9FUiBiaXQgc2V0dGluZwotICovCi0KLQlpZiAoc2NzaV9idWZmbGVuKGNtZCkpIHsKLQkJY21kLT5TQ3AuYnVmZmVyID0gc2NzaV9zZ2xpc3QoY21kKTsKLQkJY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCA9IHNjc2lfc2dfY291bnQoY21kKSAtIDE7Ci0JCWNtZC0+U0NwLnB0ciA9IHNnX3ZpcnQoY21kLT5TQ3AuYnVmZmVyKTsKLQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IGNtZC0+U0NwLmJ1ZmZlci0+bGVuZ3RoOwotCX0gZWxzZSB7Ci0JCWNtZC0+U0NwLmJ1ZmZlciA9IE5VTEw7Ci0JCWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwgPSAwOwotCQljbWQtPlNDcC5wdHIgPSBOVUxMOwotCQljbWQtPlNDcC50aGlzX3Jlc2lkdWFsID0gMDsKLQl9Ci0JY21kLT5TQ3AuaGF2ZV9kYXRhX2luID0gMDsKLQotLyogV2UgZG9uJ3Qgc2V0IFNDcC5waGFzZSBoZXJlIC0gdGhhdCdzIGRvbmUgaW4gaW4yMDAwX2V4ZWN1dGUoKSAqLwotCi0vKiBXRCBkb2NzIHN0YXRlIHRoYXQgYXQgdGhlIGNvbmNsdXNpb24gb2YgYSAiTEVWRUwyIiBjb21tYW5kLCB0aGUKLSAqIHN0YXR1cyBieXRlIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgTFVOIHJlZ2lzdGVyLiBBcHBhcmVudGx5LAotICogdGhpcyBpcyB0aGUgY2FzZSBvbmx5IGZvciAqdW5pbnRlcnJ1cHRlZCogTEVWRUwyIGNvbW1hbmRzISBJZgotICogdGhlcmUgYXJlIGFueSB1bmV4cGVjdGVkIHBoYXNlcyBlbnRlcmVkLCBldmVuIGlmIHRoZXkgYXJlIDEwMCUKLSAqIGxlZ2FsIChkaWZmZXJlbnQgZGV2aWNlcyBtYXkgY2hvb3NlIHRvIGRvIHRoaW5ncyBkaWZmZXJlbnRseSksCi0gKiB0aGUgTEVWRUwyIGNvbW1hbmQgc2VxdWVuY2UgaXMgZXhpdGVkLiBUaGlzIG9mdGVuIG9jY3VycyBwcmlvcgotICogdG8gcmVjZWl2aW5nIHRoZSBzdGF0dXMgYnl0ZSwgaW4gd2hpY2ggY2FzZSB0aGUgZHJpdmVyIGRvZXMgYQotICogc3RhdHVzIHBoYXNlIGludGVycnVwdCBhbmQgZ2V0cyB0aGUgc3RhdHVzIGJ5dGUgb24gaXRzIG93bi4KLSAqIFdoaWxlIHN1Y2ggYSBjb21tYW5kIGNhbiB0aGVuIGJlICJyZXN1bWVkIiAoaWUgcmVzdGFydGVkIHRvCi0gKiBmaW5pc2ggdXAgYXMgYSBMRVZFTDIgY29tbWFuZCksIHRoZSBMVU4gcmVnaXN0ZXIgd2lsbCBOT1QgYmUKLSAqIGEgdmFsaWQgc3RhdHVzIGJ5dGUgYXQgdGhlIGNvbW1hbmQncyBjb25jbHVzaW9uLCBhbmQgd2UgbXVzdAotICogdXNlIHRoZSBieXRlIG9idGFpbmVkIGR1cmluZyB0aGUgZWFybGllciBpbnRlcnJ1cHQuIEhlcmUsIHdlCi0gKiBwcmVzZXQgU0NwLlN0YXR1cyB0byBhbiBpbGxlZ2FsIHZhbHVlICgweGZmKSBzbyB0aGF0IHdoZW4KLSAqIHRoaXMgY29tbWFuZCBmaW5hbGx5IGNvbXBsZXRlcywgd2UgY2FuIHRlbGwgd2hlcmUgdGhlIGFjdHVhbAotICogc3RhdHVzIGJ5dGUgaXMgc3RvcmVkLgotICovCi0KLQljbWQtPlNDcC5TdGF0dXMgPSBJTExFR0FMX1NUQVRVU19CWVRFOwotCi0vKiBXZSBuZWVkIHRvIGRpc2FibGUgaW50ZXJydXB0cyBiZWZvcmUgbWVzc2luZyB3aXRoIHRoZSBpbnB1dAotICogcXVldWUgYW5kIGNhbGxpbmcgaW4yMDAwX2V4ZWN1dGUoKS4KLSAqLwotCi0JLyoKLQkgKiBBZGQgdGhlIGNtZCB0byB0aGUgZW5kIG9mICdpbnB1dF9RJy4gTm90ZSB0aGF0IFJFUVVFU1RfU0VOU0UKLQkgKiBjb21tYW5kcyBhcmUgYWRkZWQgdG8gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIHNvIHRoYXQgdGhlIGRlc2lyZWQKLQkgKiBzZW5zZSBkYXRhIGlzIG5vdCBsb3N0IGJlZm9yZSBSRVFVRVNUX1NFTlNFIGV4ZWN1dGVzLgotCSAqLwotCi0JaWYgKCEoaG9zdGRhdGEtPmlucHV0X1EpIHx8IChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSkpIHsKLQkJY21kLT5ob3N0X3NjcmliYmxlID0gKHVjaGFyICopIGhvc3RkYXRhLT5pbnB1dF9ROwotCQlob3N0ZGF0YS0+aW5wdXRfUSA9IGNtZDsKLQl9IGVsc2UgewkJLyogZmluZCB0aGUgZW5kIG9mIHRoZSBxdWV1ZSAqLwotCQlmb3IgKHRtcCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlucHV0X1E7IHRtcC0+aG9zdF9zY3JpYmJsZTsgdG1wID0gKFNjc2lfQ21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGUpOwotCQl0bXAtPmhvc3Rfc2NyaWJibGUgPSAodWNoYXIgKikgY21kOwotCX0KLQotLyogV2Uga25vdyB0aGF0IHRoZXJlJ3MgYXQgbGVhc3Qgb25lIGNvbW1hbmQgaW4gJ2lucHV0X1EnIG5vdy4KLSAqIEdvIHNlZSBpZiBhbnkgb2YgdGhlbSBhcmUgcnVubmFibGUhCi0gKi8KLQotCWluMjAwMF9leGVjdXRlKGNtZC0+ZGV2aWNlLT5ob3N0KTsKLQotCURCKERCX1FVRVVFX0NPTU1BTkQsIHByaW50aygiKVEgIikpCi0JICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgREVGX1NDU0lfUUNNRChpbjIwMDBfcXVldWVjb21tYW5kKQotCi0KLQotLyoKLSAqIFRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBzdGFydCBhIHNjc2kgY29tbWFuZC4gSWYgdGhlIGhvc3RfY2FyZCBpcwotICogYWxyZWFkeSBjb25uZWN0ZWQsIHdlIGdpdmUgdXAgaW1tZWRpYXRlbHkuIE90aGVyd2lzZSwgbG9vayB0aHJvdWdoCi0gKiB0aGUgaW5wdXRfUSwgdXNpbmcgdGhlIGZpcnN0IGNvbW1hbmQgd2UgZmluZCB0aGF0J3MgaW50ZW5kZWQKLSAqIGZvciBhIGN1cnJlbnRseSBub24tYnVzeSB0YXJnZXQvbHVuLgotICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCB3aXRoIGludGVycnVwdHMgYWxyZWFkeQotICogZGlzYWJsZWQgKGVpdGhlciBmcm9tIGluMjAwMF9xdWV1ZWNvbW1hbmQoKSBvciBpbjIwMDBfaW50cigpKS4KLSAqLwotc3RhdGljIHZvaWQgaW4yMDAwX2V4ZWN1dGUoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCi17Ci0Jc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7Ci0JU2NzaV9DbW5kICpjbWQsICpwcmV2OwotCWludCBpOwotCXVuc2lnbmVkIHNob3J0ICpzcDsKLQl1bnNpZ25lZCBzaG9ydCBmOwotCXVuc2lnbmVkIHNob3J0IGZsdXNoYnVmWzE2XTsKLQotCi0JaG9zdGRhdGEgPSAoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7Ci0KLQlEQihEQl9FWEVDVVRFLCBwcmludGsoIkVYKCIpKQotCi0JICAgIGlmIChob3N0ZGF0YS0+c2VsZWN0aW5nIHx8IGhvc3RkYXRhLT5jb25uZWN0ZWQpIHsKLQotCQlEQihEQl9FWEVDVVRFLCBwcmludGsoIilFWC0wICIpKQotCi0JCSAgICByZXR1cm47Ci0JfQotCi0JLyoKLQkgKiBTZWFyY2ggdGhyb3VnaCB0aGUgaW5wdXRfUSBmb3IgYSBjb21tYW5kIGRlc3RpbmVkCi0JICogZm9yIGFuIGlkbGUgdGFyZ2V0L2x1bi4KLQkgKi8KLQotCWNtZCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmlucHV0X1E7Ci0JcHJldiA9IE5VTEw7Ci0Jd2hpbGUgKGNtZCkgewotCQlpZiAoIShob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICYgKDEgPDwgY21kLT5kZXZpY2UtPmx1bikpKQotCQkJYnJlYWs7Ci0JCXByZXYgPSBjbWQ7Ci0JCWNtZCA9IChTY3NpX0NtbmQgKikgY21kLT5ob3N0X3NjcmliYmxlOwotCX0KLQotCS8qIHF1aXQgaWYgcXVldWUgZW1wdHkgb3IgYWxsIHBvc3NpYmxlIHRhcmdldHMgYXJlIGJ1c3kgKi8KLQotCWlmICghY21kKSB7Ci0KLQkJREIoREJfRVhFQ1VURSwgcHJpbnRrKCIpRVgtMSAiKSkKLQotCQkgICAgcmV0dXJuOwotCX0KLQotCS8qICByZW1vdmUgY29tbWFuZCBmcm9tIHF1ZXVlICovCi0KLQlpZiAocHJldikKLQkJcHJldi0+aG9zdF9zY3JpYmJsZSA9IGNtZC0+aG9zdF9zY3JpYmJsZTsKLQllbHNlCi0JCWhvc3RkYXRhLT5pbnB1dF9RID0gKFNjc2lfQ21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7Ci0KLSNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKLQlob3N0ZGF0YS0+Y21kX2NudFtjbWQtPmRldmljZS0+aWRdKys7Ci0jZW5kaWYKLQotLyoKLSAqIFN0YXJ0IHRoZSBzZWxlY3Rpb24gcHJvY2VzcwotICovCi0KLQlpZiAoaXNfZGlyX291dChjbWQpKQotCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9ERVNUSU5BVElPTl9JRCwgY21kLT5kZXZpY2UtPmlkKTsKLQllbHNlCi0JCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0RFU1RJTkFUSU9OX0lELCBjbWQtPmRldmljZS0+aWQgfCBEU1RJRF9EUEQpOwotCi0vKiBOb3cgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoZXRoZXIgb3Igbm90IHRoaXMgY29tbWFuZCBpcyBhIGdvb2QKLSAqIGNhbmRpZGF0ZSBmb3IgZGlzY29ubmVjdC9yZXNlbGVjdC4gV2UgZ3Vlc3MgdG8gdGhlIGJlc3Qgb2Ygb3VyCi0gKiBhYmlsaXR5LCBiYXNlZCBvbiBhIHNldCBvZiBoaWVyYXJjaGljYWwgcnVsZXMuIFdoZW4gc2V2ZXJhbAotICogZGV2aWNlcyBhcmUgb3BlcmF0aW5nIHNpbXVsdGFuZW91c2x5LCBkaXNjb25uZWN0cyBhcmUgdXN1YWxseQotICogYW4gYWR2YW50YWdlLiBJbiBhIHNpbmdsZSBkZXZpY2Ugc3lzdGVtLCBvciBpZiBvbmx5IDEgZGV2aWNlCi0gKiBpcyBiZWluZyBhY2Nlc3NlZCwgdHJhbnNmZXJzIHVzdWFsbHkgZ28gZmFzdGVyIGlmIGRpc2Nvbm5lY3RzCi0gKiBhcmUgbm90IGFsbG93ZWQ6Ci0gKgotICogKyBDb21tYW5kcyBzaG91bGQgTkVWRVIgZGlzY29ubmVjdCBpZiBob3N0ZGF0YS0+ZGlzY29ubmVjdCA9Ci0gKiAgIERJU19ORVZFUiAodGhpcyBob2xkcyBmb3IgdGFwZSBkcml2ZXMgYWxzbyksIGFuZCBBTFdBWVMKLSAqICAgZGlzY29ubmVjdCBpZiBob3N0ZGF0YS0+ZGlzY29ubmVjdCA9IERJU19BTFdBWVMuCi0gKiArIFRhcGUgZHJpdmUgY29tbWFuZHMgc2hvdWxkIGFsd2F5cyBiZSBhbGxvd2VkIHRvIGRpc2Nvbm5lY3QuCi0gKiArIERpc2Nvbm5lY3Qgc2hvdWxkIGJlIGFsbG93ZWQgaWYgZGlzY29ubmVjdGVkX1EgaXNuJ3QgZW1wdHkuCi0gKiArIENvbW1hbmRzIHNob3VsZCBOT1QgZGlzY29ubmVjdCBpZiBpbnB1dF9RIGlzIGVtcHR5LgotICogKyBEaXNjb25uZWN0IHNob3VsZCBiZSBhbGxvd2VkIGlmIHRoZXJlIGFyZSBjb21tYW5kcyBpbiBpbnB1dF9RCi0gKiAgIGZvciBhIGRpZmZlcmVudCB0YXJnZXQvbHVuLiBJbiB0aGlzIGNhc2UsIHRoZSBvdGhlciBjb21tYW5kcwotICogICBzaG91bGQgYmUgbWFkZSBkaXNjb25uZWN0LWFibGUsIGlmIG5vdCBhbHJlYWR5LgotICoKLSAqIEkga25vdywgSSBrbm93IC0gdGhpcyBjb2RlIHdvdWxkIGZsdW5rIG1lIG91dCBvZiBhbnkKLSAqICJDIFByb2dyYW1taW5nIDEwMSIgY2xhc3MgZXZlciBvZmZlcmVkLiBCdXQgaXQncyBlYXN5Ci0gKiB0byBjaGFuZ2UgYXJvdW5kIGFuZCBleHBlcmltZW50IHdpdGggZm9yIG5vdy4KLSAqLwotCi0JY21kLT5TQ3AucGhhc2UgPSAwOwkvKiBhc3N1bWUgbm8gZGlzY29ubmVjdCAqLwotCWlmIChob3N0ZGF0YS0+ZGlzY29ubmVjdCA9PSBESVNfTkVWRVIpCi0JCWdvdG8gbm87Ci0JaWYgKGhvc3RkYXRhLT5kaXNjb25uZWN0ID09IERJU19BTFdBWVMpCi0JCWdvdG8geWVzOwotCWlmIChjbWQtPmRldmljZS0+dHlwZSA9PSAxKQkvKiB0YXBlIGRyaXZlPyAqLwotCQlnb3RvIHllczsKLQlpZiAoaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9RKQkvKiBvdGhlciBjb21tYW5kcyBkaXNjb25uZWN0ZWQ/ICovCi0JCWdvdG8geWVzOwotCWlmICghKGhvc3RkYXRhLT5pbnB1dF9RKSkJLyogaW5wdXRfUSBlbXB0eT8gKi8KLQkJZ290byBubzsKLQlmb3IgKHByZXYgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pbnB1dF9ROyBwcmV2OyBwcmV2ID0gKFNjc2lfQ21uZCAqKSBwcmV2LT5ob3N0X3NjcmliYmxlKSB7Ci0JCWlmICgocHJldi0+ZGV2aWNlLT5pZCAhPSBjbWQtPmRldmljZS0+aWQpIHx8IChwcmV2LT5kZXZpY2UtPmx1biAhPSBjbWQtPmRldmljZS0+bHVuKSkgewotCQkJZm9yIChwcmV2ID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+aW5wdXRfUTsgcHJldjsgcHJldiA9IChTY3NpX0NtbmQgKikgcHJldi0+aG9zdF9zY3JpYmJsZSkKLQkJCQlwcmV2LT5TQ3AucGhhc2UgPSAxOwotCQkJZ290byB5ZXM7Ci0JCX0KLQl9Ci0JZ290byBubzsKLQotICAgICAgeWVzOgotCWNtZC0+U0NwLnBoYXNlID0gMTsKLQotI2lmZGVmIFBST0NfU1RBVElTVElDUwotCWhvc3RkYXRhLT5kaXNjX2FsbG93ZWRfY250W2NtZC0+ZGV2aWNlLT5pZF0rKzsKLSNlbmRpZgotCi0gICAgICBubzoKLQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9TT1VSQ0VfSUQsICgoY21kLT5TQ3AucGhhc2UpID8gU1JDSURfRVIgOiAwKSk7Ci0KLQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9UQVJHRVRfTFVOLCBjbWQtPmRldmljZS0+bHVuKTsKLQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9TWU5DSFJPTk9VU19UUkFOU0ZFUiwgaG9zdGRhdGEtPnN5bmNfeGZlcltjbWQtPmRldmljZS0+aWRdKTsKLQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdIHw9ICgxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOwotCi0JaWYgKChob3N0ZGF0YS0+bGV2ZWwyIDw9IEwyX05PTkUpIHx8IChob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPT0gU1NfVU5TRVQpKSB7Ci0KLQkJLyoKLQkJICogRG8gYSAnU2VsZWN0LVdpdGgtQVROJyBjb21tYW5kLiBUaGlzIHdpbGwgZW5kIHdpdGgKLQkJICogb25lIG9mIHRoZSBmb2xsb3dpbmcgaW50ZXJydXB0czoKLQkJICogICAgQ1NSX1JFU0VMX0FNOiAgZmFpbHVyZSAtIGNhbiB0cnkgYWdhaW4gbGF0ZXIuCi0JCSAqICAgIENTUl9USU1FT1VUOiAgIGZhaWx1cmUgLSBnaXZlIHVwLgotCQkgKiAgICBDU1JfU0VMRUNUOiAgICBzdWNjZXNzIC0gcHJvY2VlZC4KLQkJICovCi0KLQkJaG9zdGRhdGEtPnNlbGVjdGluZyA9IGNtZDsKLQotLyogRXZlcnkgdGFyZ2V0IGhhcyBpdHMgb3duIHN5bmNocm9ub3VzIHRyYW5zZmVyIHNldHRpbmcsIGtlcHQgaW4KLSAqIHRoZSBzeW5jX3hmZXIgYXJyYXksIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3RhdHVzIGJ5dGUgaW4gc3luY19zdGF0W10uCi0gKiBFYWNoIHRhcmdldCdzIHN5bmNfc3RhdFtdIGVudHJ5IGlzIGluaXRpYWxpemVkIHRvIFNTX1VOU0VULCBhbmQgaXRzCi0gKiBzeW5jX3hmZXJbXSBlbnRyeSBpcyBpbml0aWFsaXplZCB0byB0aGUgZGVmYXVsdC9zYWZlIHZhbHVlLiBTU19VTlNFVAotICogbWVhbnMgdGhhdCB0aGUgcGFyYW1ldGVycyBhcmUgdW5kZXRlcm1pbmVkIGFzIHlldCwgYW5kIHRoYXQgd2UKLSAqIG5lZWQgdG8gc2VuZCBhbiBTRFRSIG1lc3NhZ2UgdG8gdGhpcyBkZXZpY2UgYWZ0ZXIgc2VsZWN0aW9uIGlzCi0gKiBjb21wbGV0ZS4gV2Ugc2V0IFNTX0ZJUlNUIHRvIHRlbGwgdGhlIGludGVycnVwdCByb3V0aW5lIHRvIGRvIHNvLAotICogdW5sZXNzIHdlIGRvbid0IHdhbnQgdG8gZXZlbiBfdHJ5XyBzeW5jaHJvbm91cyB0cmFuc2ZlcnM6IEluIHRoaXMKLSAqIGNhc2Ugd2Ugc2V0IFNTX1NFVCB0byBtYWtlIHRoZSBkZWZhdWx0cyBmaW5hbC4KLSAqLwotCQlpZiAoaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID09IFNTX1VOU0VUKSB7Ci0JCQlpZiAoaG9zdGRhdGEtPnN5bmNfb2ZmICYgKDEgPDwgY21kLT5kZXZpY2UtPmlkKSkKLQkJCQlob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPSBTU19TRVQ7Ci0JCQllbHNlCi0JCQkJaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID0gU1NfRklSU1Q7Ci0JCX0KLQkJaG9zdGRhdGEtPnN0YXRlID0gU19TRUxFQ1RJTkc7Ci0JCXdyaXRlXzMzOTNfY291bnQoaG9zdGRhdGEsIDApOwkvKiB0aGlzIGd1YXJhbnRlZXMgYSBEQVRBX1BIQVNFIGludGVycnVwdCAqLwotCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1NFTF9BVE4pOwotCX0KLQotCWVsc2UgewotCi0JCS8qCi0JCSAqIERvIGEgJ1NlbGVjdC1XaXRoLUFUTi1YZmVyJyBjb21tYW5kLiBUaGlzIHdpbGwgZW5kIHdpdGgKLQkJICogb25lIG9mIHRoZSBmb2xsb3dpbmcgaW50ZXJydXB0czoKLQkJICogICAgQ1NSX1JFU0VMX0FNOiAgZmFpbHVyZSAtIGNhbiB0cnkgYWdhaW4gbGF0ZXIuCi0JCSAqICAgIENTUl9USU1FT1VUOiAgIGZhaWx1cmUgLSBnaXZlIHVwLgotCQkgKiAgICBhbnl0aGluZyBlbHNlOiBzdWNjZXNzIC0gcHJvY2VlZC4KLQkJICovCi0KLQkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IGNtZDsKLQkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09NTUFORF9QSEFTRSwgMCk7Ci0KLQkJLyogY29weSBjb21tYW5kX2Rlc2NyaXB0b3JfYmxvY2sgaW50byBXRCBjaGlwCi0JCSAqICh0YWtlIGFkdmFudGFnZSBvZiBhdXRvLWluY3JlbWVudGluZykKLQkJICovCi0KLQkJd3JpdGUxX2lvKFdEX0NEQl8xLCBJT19XRF9BRERSKTsKLQkJZm9yIChpID0gMDsgaSA8IGNtZC0+Y21kX2xlbjsgaSsrKQotCQkJd3JpdGUxX2lvKGNtZC0+Y21uZFtpXSwgSU9fV0RfREFUQSk7Ci0KLQkJLyogVGhlIHdkMzNjOTMgb25seSBrbm93cyBhYm91dCBHcm91cCAwLCAxLCBhbmQgNSBjb21tYW5kcyB3aGVuCi0JCSAqIGl0J3MgZG9pbmcgYSAnc2VsZWN0LWFuZC10cmFuc2ZlcicuIFRvIGJlIHNhZmUsIHdlIHdyaXRlIHRoZQotCQkgKiBzaXplIG9mIHRoZSBDREIgaW50byB0aGUgT1dOX0lEIHJlZ2lzdGVyIGZvciBldmVyeSBjYXNlLiBUaGlzCi0JCSAqIHdheSB0aGVyZSB3b24ndCBiZSBwcm9ibGVtcyB3aXRoIHZlbmRvci11bmlxdWUsIGF1ZGlvLCBldGMuCi0JCSAqLwotCi0JCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX09XTl9JRCwgY21kLT5jbWRfbGVuKTsKLQotCQkvKiBXaGVuIGRvaW5nIGEgbm9uLWRpc2Nvbm5lY3QgY29tbWFuZCwgd2UgY2FuIHNhdmUgb3Vyc2VsdmVzIGEgREFUQQotCQkgKiBwaGFzZSBpbnRlcnJ1cHQgbGF0ZXIgYnkgc2V0dGluZyBldmVyeXRoaW5nIHVwIG5vdy4gV2l0aCB3cml0ZXMgd2UKLQkJICogbmVlZCB0byBwcmUtZmlsbCB0aGUgZmlmbzsgaWYgdGhlcmUncyByb29tIGZvciB0aGUgMzIgZmx1c2ggYnl0ZXMsCi0JCSAqIHB1dCB0aGVtIGluIHRoZXJlIHRvbyAtIHRoYXQnbGwgYXZvaWQgYSBmaWZvIGludGVycnVwdC4gUmVhZHMgYXJlCi0JCSAqIHNvbWV3aGF0IHNpbXBsZXIuCi0JCSAqIEtMVURHRSBOT1RFOiBJdCBzZWVtcyB0aGF0IHlvdSBjYW4ndCBjb21wbGV0ZWx5IGZpbGwgdGhlIGZpZm8gaGVyZToKLQkJICogVGhpcyByZXN1bHRzIGluIHRoZSBJT19GSUZPX0NPVU5UIHJlZ2lzdGVyIHJvbGxpbmcgb3ZlciB0byB6ZXJvLAotCQkgKiBhbmQgYXBwYXJlbnRseSB0aGUgZ2F0ZSBhcnJheSBsb2dpYyBzZWVzIHRoaXMgYXMgZW1wdHksIG5vdCBmdWxsLAotCQkgKiBzbyB0aGUgMzM5MyBjaGlwIGlzIG5ldmVyIHNpZ25hbGxlZCB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlCi0JCSAqIGZpZm8uIE9yIG1heWJlIGl0J3Mgc2VlbiBhcyBhIHBlcm1hbmVudCBmaWZvIGludGVycnVwdCBjb25kaXRpb24uCi0JCSAqIFJlZ2FyZGxlc3MsIHdlIGZpeCB0aGlzIGJ5IHRlbXBvcmFyaWx5IHByZXRlbmRpbmcgdGhhdCB0aGUgZmlmbwotCQkgKiBpcyAxNiBieXRlcyBzbWFsbGVyLiAoSSBzZWUgbm93IHRoYXQgdGhlIG9sZCBkcml2ZXIgaGFzIGEgY29tbWVudAotCQkgKiBhYm91dCAiZG9uJ3QgZmlsbCBjb21wbGV0ZWx5IiBpbiBhbiBhbmFsb2dvdXMgcGxhY2UgLSBtdXN0IGJlIHRoZQotCQkgKiBzYW1lIGRlYWwuKSBUaGlzIHJlc3VsdHMgaW4gQ0RST00sIHN3YXAgcGFydGl0aW9ucywgYW5kIHRhcGUgZHJpdmVzCi0JCSAqIG5lZWRpbmcgYW4gZXh0cmEgaW50ZXJydXB0IHBlciB3cml0ZSBjb21tYW5kIC0gSSB0aGluayB3ZSBjYW4gbGl2ZQotCQkgKiB3aXRoIHRoYXQhCi0JCSAqLwotCi0JCWlmICghKGNtZC0+U0NwLnBoYXNlKSkgewotCQkJd3JpdGVfMzM5M19jb3VudChob3N0ZGF0YSwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7Ci0JCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9DT05UUk9MLCBDVFJMX0lESSB8IENUUkxfRURJIHwgQ1RSTF9CVVMpOwotCQkJd3JpdGUxX2lvKDAsIElPX0ZJRk9fV1JJVEUpOwkvKiBjbGVhciBmaWZvIGNvdW50ZXIsIHdyaXRlIG1vZGUgKi8KLQotCQkJaWYgKGlzX2Rpcl9vdXQoY21kKSkgewotCQkJCWhvc3RkYXRhLT5maWZvID0gRklfRklGT19XUklUSU5HOwotCQkJCWlmICgoaSA9IGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwpID4gKElOMjAwMF9GSUZPX1NJWkUgLSAxNikpCi0JCQkJCWkgPSBJTjIwMDBfRklGT19TSVpFIC0gMTY7Ci0JCQkJY21kLT5TQ3AuaGF2ZV9kYXRhX2luID0gaTsJLyogdGhpcyBtdWNoIGRhdGEgaW4gZmlmbyAqLwotCQkJCWkgPj49IDE7CS8qIEd1bHAuIEFzc3VtaW5nIG1vZHVsbyAyLiAqLwotCQkJCXNwID0gKHVuc2lnbmVkIHNob3J0ICopIGNtZC0+U0NwLnB0cjsKLQkJCQlmID0gaG9zdGRhdGEtPmlvX2Jhc2UgKyBJT19GSUZPOwotCi0jaWZkZWYgRkFTVF9XUklURV9JTwotCi0JCQkJRkFTVF9XUklURTJfSU8oKTsKLSNlbHNlCi0JCQkJd2hpbGUgKGktLSkKLQkJCQkJd3JpdGUyX2lvKCpzcCsrLCBJT19GSUZPKTsKLQotI2VuZGlmCi0KLQkJCQkvKiBJcyB0aGVyZSByb29tIGZvciB0aGUgZmx1c2ggYnl0ZXM/ICovCi0KLQkJCQlpZiAoY21kLT5TQ3AuaGF2ZV9kYXRhX2luIDw9ICgoSU4yMDAwX0ZJRk9fU0laRSAtIDE2KSAtIDMyKSkgewotCQkJCQlzcCA9IGZsdXNoYnVmOwotCQkJCQlpID0gMTY7Ci0KLSNpZmRlZiBGQVNUX1dSSVRFX0lPCi0KLQkJCQkJRkFTVF9XUklURTJfSU8oKTsKLSNlbHNlCi0JCQkJCXdoaWxlIChpLS0pCi0JCQkJCQl3cml0ZTJfaW8oMCwgSU9fRklGTyk7Ci0KLSNlbmRpZgotCi0JCQkJfQotCQkJfQotCi0JCQllbHNlIHsKLQkJCQl3cml0ZTFfaW8oMCwgSU9fRklGT19SRUFEKTsJLyogcHV0IGZpZm8gaW4gcmVhZCBtb2RlICovCi0JCQkJaG9zdGRhdGEtPmZpZm8gPSBGSV9GSUZPX1JFQURJTkc7Ci0JCQkJY21kLT5TQ3AuaGF2ZV9kYXRhX2luID0gMDsJLyogbm90aGluZyB0cmFuc2ZlcnJlZCB5ZXQgKi8KLQkJCX0KLQotCQl9IGVsc2UgewotCQkJd3JpdGVfMzM5M19jb3VudChob3N0ZGF0YSwgMCk7CS8qIHRoaXMgZ3VhcmFudGVlcyBhIERBVEFfUEhBU0UgaW50ZXJydXB0ICovCi0JCX0KLQkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKLQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9TRUxfQVROX1hGRVIpOwotCX0KLQotCS8qCi0JICogU2luY2UgdGhlIFNDU0kgYnVzIGNhbiBoYW5kbGUgb25seSAxIGNvbm5lY3Rpb24gYXQgYSB0aW1lLAotCSAqIHdlIGdldCBvdXQgb2YgaGVyZSBub3cuIElmIHRoZSBzZWxlY3Rpb24gZmFpbHMsIG9yIHdoZW4KLQkgKiB0aGUgY29tbWFuZCBkaXNjb25uZWN0cywgd2UnbGwgY29tZSBiYWNrIHRvIHRoaXMgcm91dGluZQotCSAqIHRvIHNlYXJjaCB0aGUgaW5wdXRfUSBhZ2Fpbi4uLgotCSAqLwotCi0JREIoREJfRVhFQ1VURSwgcHJpbnRrKCIlcylFWC0yICIsIChjbWQtPlNDcC5waGFzZSkgPyAiZDoiIDogIiIpKQotCi19Ci0KLQotCi1zdGF0aWMgdm9pZCB0cmFuc2Zlcl9waW8odWNoYXIgKiBidWYsIGludCBjbnQsIGludCBkYXRhX2luX2Rpciwgc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGEpCi17Ci0JdWNoYXIgYXNyOwotCi0JREIoREJfVFJBTlNGRVIsIHByaW50aygiKCVwLCVkLCVzKSIsIGJ1ZiwgY250LCBkYXRhX2luX2RpciA/ICJpbiIgOiAib3V0IikpCi0KLQkgICAgd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfUE9MTEVEKTsKLQl3cml0ZV8zMzkzX2NvdW50KGhvc3RkYXRhLCBjbnQpOwotCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfVFJBTlNfSU5GTyk7Ci0JaWYgKGRhdGFfaW5fZGlyKSB7Ci0JCWRvIHsKLQkJCWFzciA9IFJFQURfQVVYX1NUQVQoKTsKLQkJCWlmIChhc3IgJiBBU1JfREJSKQotCQkJCSpidWYrKyA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfREFUQSk7Ci0JCX0gd2hpbGUgKCEoYXNyICYgQVNSX0lOVCkpOwotCX0gZWxzZSB7Ci0JCWRvIHsKLQkJCWFzciA9IFJFQURfQVVYX1NUQVQoKTsKLQkJCWlmIChhc3IgJiBBU1JfREJSKQotCQkJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0RBVEEsICpidWYrKyk7Ci0JCX0gd2hpbGUgKCEoYXNyICYgQVNSX0lOVCkpOwotCX0KLQotCS8qIE5vdGU6IHdlIGFyZSByZXR1cm5pbmcgd2l0aCB0aGUgaW50ZXJydXB0IFVOLWNsZWFyZWQuCi0JICogU2luY2UgKHByZXN1bWFibHkpIGFuIGVudGlyZSBJL08gb3BlcmF0aW9uIGhhcwotCSAqIGNvbXBsZXRlZCwgdGhlIGJ1cyBwaGFzZSBpcyBwcm9iYWJseSBkaWZmZXJlbnQsIGFuZAotCSAqIHRoZSBpbnRlcnJ1cHQgcm91dGluZSB3aWxsIGRpc2NvdmVyIHRoaXMgd2hlbiBpdAotCSAqIHJlc3BvbmRzIHRvIHRoZSB1bmNsZWFyZWQgaW50LgotCSAqLwotCi19Ci0KLQotCi1zdGF0aWMgdm9pZCB0cmFuc2Zlcl9ieXRlcyhTY3NpX0NtbmQgKiBjbWQsIGludCBkYXRhX2luX2RpcikKLXsKLQlzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKLQl1bnNpZ25lZCBzaG9ydCAqc3A7Ci0JdW5zaWduZWQgc2hvcnQgZjsKLQlpbnQgaTsKLQotCWhvc3RkYXRhID0gKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKikgY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwotCi0vKiBOb3JtYWxseSwgeW91J2QgZXhwZWN0ICd0aGlzX3Jlc2lkdWFsJyB0byBiZSBub24temVybyBoZXJlLgotICogSW4gYSBzZXJpZXMgb2Ygc2NhdHRlci1nYXRoZXIgdHJhbnNmZXJzLCBob3dldmVyLCB0aGlzCi0gKiByb3V0aW5lIHdpbGwgdXN1YWxseSBiZSBjYWxsZWQgd2l0aCAndGhpc19yZXNpZHVhbCcgZXF1YWwKLSAqIHRvIDAgYW5kICdidWZmZXJzX3Jlc2lkdWFsJyBub24temVyby4gVGhpcyBtZWFucyB0aGF0IGEKLSAqIHByZXZpb3VzIHRyYW5zZmVyIGNvbXBsZXRlZCwgY2xlYXJpbmcgJ3RoaXNfcmVzaWR1YWwnLCBhbmQKLSAqIG5vdyB3ZSBuZWVkIHRvIHNldHVwIHRoZSBuZXh0IHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlciBhcyB0aGUKLSAqIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBmb3IgVEhJUyB0cmFuc2Zlci4KLSAqLwotCWlmICghY21kLT5TQ3AudGhpc19yZXNpZHVhbCAmJiBjbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsKSB7Ci0JCSsrY21kLT5TQ3AuYnVmZmVyOwotCQktLWNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWw7Ci0JCWNtZC0+U0NwLnRoaXNfcmVzaWR1YWwgPSBjbWQtPlNDcC5idWZmZXItPmxlbmd0aDsKLQkJY21kLT5TQ3AucHRyID0gc2dfdmlydChjbWQtPlNDcC5idWZmZXIpOwotCX0KLQotLyogU2V0IHVwIGhhcmR3YXJlIHJlZ2lzdGVycyAqLwotCi0Jd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfU1lOQ0hST05PVVNfVFJBTlNGRVIsIGhvc3RkYXRhLT5zeW5jX3hmZXJbY21kLT5kZXZpY2UtPmlkXSk7Ci0Jd3JpdGVfMzM5M19jb3VudChob3N0ZGF0YSwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7Ci0Jd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfQlVTKTsKLQl3cml0ZTFfaW8oMCwgSU9fRklGT19XUklURSk7CS8qIHplcm8gY291bnRlciwgYXNzdW1lIHdyaXRlICovCi0KLS8qIFJlYWRpbmcgaXMgZWFzeS4gSnVzdCBpc3N1ZSB0aGUgY29tbWFuZCBhbmQgcmV0dXJuIC0gd2UnbGwKLSAqIGdldCBhbiBpbnRlcnJ1cHQgbGF0ZXIgd2hlbiB3ZSBoYXZlIGFjdHVhbCBkYXRhIHRvIHdvcnJ5IGFib3V0LgotICovCi0KLQlpZiAoZGF0YV9pbl9kaXIpIHsKLQkJd3JpdGUxX2lvKDAsIElPX0ZJRk9fUkVBRCk7Ci0JCWlmICgoaG9zdGRhdGEtPmxldmVsMiA+PSBMMl9EQVRBKSB8fCAoaG9zdGRhdGEtPmxldmVsMiA9PSBMMl9CQVNJQyAmJiBjbWQtPlNDcC5waGFzZSA9PSAwKSkgewotCQkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09NTUFORF9QSEFTRSwgMHg0NSk7Ci0JCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1NFTF9BVE5fWEZFUik7Ci0JCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOwotCQl9IGVsc2UKLQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfVFJBTlNfSU5GTyk7Ci0JCWhvc3RkYXRhLT5maWZvID0gRklfRklGT19SRUFESU5HOwotCQljbWQtPlNDcC5oYXZlX2RhdGFfaW4gPSAwOwotCQlyZXR1cm47Ci0JfQotCi0vKiBXcml0aW5nIGlzIG1vcmUgaW52b2x2ZWQgLSB3ZSdsbCBzdGFydCB0aGUgV0QgY2hpcCBhbmQgd3JpdGUgYXMKLSAqIG11Y2ggZGF0YSB0byB0aGUgZmlmbyBhcyB3ZSBjYW4gcmlnaHQgbm93LiBMYXRlciBpbnRlcnJ1cHRzIHdpbGwKLSAqIHdyaXRlIGFueSBieXRlcyB0aGF0IGRvbid0IG1ha2UgaXQgYXQgdGhpcyBzdGFnZS4KLSAqLwotCi0JaWYgKChob3N0ZGF0YS0+bGV2ZWwyID49IEwyX0RBVEEpIHx8IChob3N0ZGF0YS0+bGV2ZWwyID09IEwyX0JBU0lDICYmIGNtZC0+U0NwLnBoYXNlID09IDApKSB7Ci0JCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NDUpOwotCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1NFTF9BVE5fWEZFUik7Ci0JCWhvc3RkYXRhLT5zdGF0ZSA9IFNfUlVOTklOR19MRVZFTDI7Ci0JfSBlbHNlCi0JCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfVFJBTlNfSU5GTyk7Ci0JaG9zdGRhdGEtPmZpZm8gPSBGSV9GSUZPX1dSSVRJTkc7Ci0Jc3AgPSAodW5zaWduZWQgc2hvcnQgKikgY21kLT5TQ3AucHRyOwotCi0JaWYgKChpID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCkgPiBJTjIwMDBfRklGT19TSVpFKQotCQlpID0gSU4yMDAwX0ZJRk9fU0laRTsKLQljbWQtPlNDcC5oYXZlX2RhdGFfaW4gPSBpOwotCWkgPj49IDE7CQkvKiBHdWxwLiBXZSBhc3N1bWUgdGhpc19yZXNpZHVhbCBpcyBtb2R1bG8gMiAqLwotCWYgPSBob3N0ZGF0YS0+aW9fYmFzZSArIElPX0ZJRk87Ci0KLSNpZmRlZiBGQVNUX1dSSVRFX0lPCi0KLQlGQVNUX1dSSVRFMl9JTygpOwotI2Vsc2UKLQl3aGlsZSAoaS0tKQotCQl3cml0ZTJfaW8oKnNwKyssIElPX0ZJRk8pOwotCi0jZW5kaWYKLQotfQotCi0KLS8qIFdlIG5lZWQgdG8gdXNlIHNwaW5fbG9ja19pcnFzYXZlKCkgJiBzcGluX3VubG9ja19pcnFyZXN0b3JlKCkgaW4gdGhpcwotICogZnVuY3Rpb24gaW4gb3JkZXIgdG8gd29yayBpbiBhbiBTTVAgZW52aXJvbm1lbnQuIChJJ2QgYmUgc3VycHJpc2VkCi0gKiBpZiB0aGUgZHJpdmVyIGlzIGV2ZXIgdXNlZCBieSBhbnlvbmUgb24gYSByZWFsIG11bHRpLUNQVSBtb3RoZXJib2FyZCwKLSAqIGJ1dCBpdCBfZG9lc18gbmVlZCB0byBiZSBhYmxlIHRvIGNvbXBpbGUgYW5kIHJ1biBpbiBhbiBTTVAga2VybmVsLikKLSAqLwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW4yMDAwX2ludHIoaW50IGlycW51bSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBTY3NpX0hvc3QgKmluc3RhbmNlID0gZGV2X2lkOwotCXN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhvc3RkYXRhOwotCVNjc2lfQ21uZCAqcGF0Y2gsICpjbWQ7Ci0JdWNoYXIgYXNyLCBzciwgcGhzLCBpZCwgbHVuLCAqdWNwLCBtc2c7Ci0JaW50IGksIGo7Ci0JdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0JdW5zaWduZWQgc2hvcnQgKnNwOwotCXVuc2lnbmVkIHNob3J0IGY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWhvc3RkYXRhID0gKHN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKikgaW5zdGFuY2UtPmhvc3RkYXRhOwotCi0vKiBHZXQgdGhlIHNwaW5fbG9jayBhbmQgZGlzYWJsZSBmdXJ0aGVyIGludHMsIGZvciBTTVAgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKLQotI2lmZGVmIFBST0NfU1RBVElTVElDUwotCWhvc3RkYXRhLT5pbnRfY250Kys7Ci0jZW5kaWYKLQotLyogVGhlIElOMjAwMCBjYXJkIGhhcyAyIGludGVycnVwdCBzb3VyY2VzIE9SJ2VkIG9udG8gaXRzIElSUSBsaW5lIC0gdGhlCi0gKiBXRDMzOTMgY2hpcCBhbmQgdGhlIDJrIGZpZm8gKHdoaWNoIGlzIGFjdHVhbGx5IGEgZHVhbC1wb3J0IFJBTSBjb21iaW5lZAotICogd2l0aCBhIGJpZyBsb2dpYyBhcnJheSwgc28gaXQncyBhIGxpdHRsZSBkaWZmZXJlbnQgdGhhbiB3aGF0IHlvdSBtaWdodAotICogZXhwZWN0KS4gQXMgZmFyIGFzIEkga25vdywgdGhlcmUncyBubyByZWFzb24gdGhhdCBCT1RIIGNhbid0IGJlIGFjdGl2ZQotICogYXQgdGhlIHNhbWUgdGltZSwgYnV0IHRoZXJlJ3MgYSBwcm9ibGVtOiB3aGlsZSB3ZSBjYW4gcmVhZCB0aGUgMzM5MwotICogdG8gdGVsbCBpZiBfaXRfIHdhbnRzIGFuIGludGVycnVwdCwgSSBkb24ndCBrbm93IG9mIGEgd2F5IHRvIGFzayB0aGUKLSAqIGZpZm8gdGhlIHNhbWUgcXVlc3Rpb24uIFRoZSBiZXN0IHdlIGNhbiBkbyBpcyBjaGVjayB0aGUgMzM5MyBhbmQgaWYKLSAqIGl0IF9pc24ndF8gdGhlIHNvdXJjZSBvZiB0aGUgaW50ZXJydXB0LCB0aGVuIHdlIGNhbiBiZSBwcmV0dHkgc3VyZQotICogdGhhdCB0aGUgZmlmbyBpcyB0aGUgY3VscHJpdC4KLSAqICBVUERBVEU6IEkgaGF2ZSBpdCBvbiBnb29kIGF1dGhvcml0eSAoQmlsbCBFYXJuZXN0KSB0aGF0IGJpdCAwIG9mIHRoZQotICogICAgICAgICAgSU9fRklGT19DT1VOVCByZWdpc3RlciBtaXJyb3JzIHRoZSBmaWZvIGludGVycnVwdCBzdGF0ZS4gSQotICogICAgICAgICAgYXNzdW1lIHRoYXQgYml0IGNsZWFyIG1lYW5zIGludGVycnVwdCBhY3RpdmUuIEFzIGl0IHR1cm5zCi0gKiAgICAgICAgICBvdXQsIHRoZSBkcml2ZXIgcmVhbGx5IGRvZXNuJ3QgbmVlZCB0byBjaGVjayBmb3IgdGhpcyBhZnRlcgotICogICAgICAgICAgYWxsLCBzbyBteSByZW1hcmtzIGFib3ZlIGFib3V0IGEgJ3Byb2JsZW0nIGNhbiBzYWZlbHkgYmUKLSAqICAgICAgICAgIGlnbm9yZWQuIFRoZSB3YXkgdGhlIGxvZ2ljIGlzIHNldCB1cCwgdGhlcmUncyBubyBhZHZhbnRhZ2UKLSAqICAgICAgICAgICh0aGF0IEkgY2FuIHNlZSkgdG8gd29ycnlpbmcgYWJvdXQgaXQuCi0gKgotICogSXQgc2VlbXMgdGhhdCB0aGUgZmlmbyBpbnRlcnJ1cHQgc2lnbmFsIGlzIG5lZ2F0ZWQgd2hlbiB3ZSBleHRyYWN0Ci0gKiBieXRlcyBkdXJpbmcgcmVhZCBvciB3cml0ZSBieXRlcyBkdXJpbmcgd3JpdGUuCi0gKiAgLSBmaWZvIHdpbGwgaW50ZXJydXB0IHdoZW4gZGF0YSBpcyBtb3ZpbmcgZnJvbSBpdCB0byB0aGUgMzM5MywgYW5kCi0gKiAgICB0aGVyZSBhcmUgMzEgKG9yIGxlc3M/KSBieXRlcyBsZWZ0IHRvIGdvLiBUaGlzIGlzIHNvcnQgb2Ygc2hvcnQtCi0gKiAgICBzaWdodGVkOiB3aGF0IGlmIHlvdSBkb24ndCBXQU5UIHRvIGRvIG1vcmU/IEluIGFueSBjYXNlLCBvdXIKLSAqICAgIHJlc3BvbnNlIGlzIHRvIHB1c2ggbW9yZSBpbnRvIHRoZSBmaWZvIC0gZWl0aGVyIGFjdHVhbCBkYXRhIG9yCi0gKiAgICBkdW1teSBieXRlcyBpZiBuZWVkIGJlLiBOb3RlIHRoYXQgd2UgYXBwYXJlbnRseSBoYXZlIHRvIHdyaXRlIGF0Ci0gKiAgICBsZWFzdCAzMiBhZGRpdGlvbmFsIGJ5dGVzIHRvIHRoZSBmaWZvIGFmdGVyIGFuIGludGVycnVwdCBpbiBvcmRlcgotICogICAgdG8gZ2V0IGl0IHRvIHJlbGVhc2UgdGhlIG9uZXMgaXQgd2FzIGhvbGRpbmcgb24gdG8gLSB3cml0aW5nIGZld2VyCi0gKiAgICB0aGFuIDMyIHdpbGwgcmVzdWx0IGluIGFub3RoZXIgZmlmbyBpbnQuCi0gKiAgVVBEQVRFOiBBZ2FpbiwgaW5mbyBmcm9tIEJpbGwgRWFybmVzdCBtYWtlcyB0aGlzIG1vcmUgdW5kZXJzdGFuZGFibGU6Ci0gKiAgICAgICAgICAzMiBieXRlcyA9IHR3byBjb3VudHMgb2YgdGhlIGZpZm8gY291bnRlciByZWdpc3Rlci4gSGUgdGVsbHMKLSAqICAgICAgICAgIG1lIHRoYXQgdGhlIGZpZm8gaW50ZXJydXB0IGlzIGEgbm9uLWxhdGNoaW5nIHNpZ25hbCBkZXJpdmVkCi0gKiAgICAgICAgICBmcm9tIGEgc3RyYWlnaHRmb3J3YXJkIGJvb2xlYW4gaW50ZXJwcmV0YXRpb24gb2YgdGhlIDcKLSAqICAgICAgICAgIGhpZ2hlc3QgYml0cyBvZiB0aGUgZmlmbyBjb3VudGVyIGFuZCB0aGUgZmlmby1yZWFkL2ZpZm8td3JpdGUKLSAqICAgICAgICAgIHN0YXRlLiBXaG8nZCBhIHRob3VnaHQ/Ci0gKi8KLQotCXdyaXRlMV9pbygwLCBJT19MRURfT04pOwotCWFzciA9IFJFQURfQVVYX1NUQVQoKTsKLQlpZiAoIShhc3IgJiBBU1JfSU5UKSkgewkvKiBubyBXRDMzYzkzIGludGVycnVwdD8gKi8KLQotLyogT2suIFRoaXMgaXMgZGVmaW5pdGVseSBhIEZJRk8tb25seSBpbnRlcnJ1cHQuCi0gKgotICogSWYgRklfRklGT19SRUFESU5HIGlzIHNldCwgdGhlcmUgYXJlIHVwIHRvIDIwNDggYnl0ZXMgd2FpdGluZyB0byBiZSByZWFkLAotICogbWF5YmUgbW9yZSB0byBjb21lIGZyb20gdGhlIFNDU0kgYnVzLiBSZWFkIGFzIG1hbnkgYXMgd2UgY2FuIG91dCBvZiB0aGUKLSAqIGZpZm8gYW5kIGludG8gbWVtb3J5IGF0IHRoZSBsb2NhdGlvbiBvZiBTQ3AucHRyW1NDcC5oYXZlX2RhdGFfaW5dLCBhbmQKLSAqIHVwZGF0ZSBoYXZlX2RhdGFfaW4gYWZ0ZXJ3YXJkcy4KLSAqCi0gKiBJZiB3ZSBoYXZlIEZJX0ZJRk9fV1JJVElORywgdGhlIEZJRk8gaGFzIGFsbW9zdCBydW4gb3V0IG9mIGJ5dGVzIHRvIG1vdmUKLSAqIGludG8gdGhlIFdEMzM5MyBjaGlwIChJIHRoaW5rIHRoZSBpbnRlcnJ1cHQgaGFwcGVucyB3aGVuIHRoZXJlIGFyZSAzMQotICogYnl0ZXMgbGVmdCwgYnV0IGl0IG1heSBiZSBmZXdlci4uLikuIFRoZSAzMzkzIGlzIHN0aWxsIHdhaXRpbmcsIHNvIHdlCi0gKiBzaG92ZSBzb21lIG1vcmUgaW50byB0aGUgZmlmbywgd2hpY2ggZ2V0cyB0aGluZ3MgbW92aW5nIGFnYWluLiBJZiB0aGUKLSAqIG9yaWdpbmFsIFNDU0kgY29tbWFuZCBzcGVjaWZpZWQgbW9yZSB0aGFuIDIwNDggYnl0ZXMsIHRoZXJlIG1heSBzdGlsbAotICogYmUgc29tZSBvZiB0aGF0IGRhdGEgbGVmdDogZmluZSAtIHVzZSBpdCAoZnJvbSBTQ3AucHRyW1NDcC5oYXZlX2RhdGFfaW5dKS4KLSAqIERvbid0IGZvcmdldCB0byB1cGRhdGUgaGF2ZV9kYXRhX2luLiBJZiB3ZSd2ZSBhbHJlYWR5IHdyaXR0ZW4gb3V0IHRoZQotICogZW50aXJlIGJ1ZmZlciwgZmVlZCAzMiBkdW1teSBieXRlcyB0byB0aGUgZmlmbyAtIHRoZXkncmUgbmVlZGVkIHRvCi0gKiBwdXNoIG91dCB0aGUgcmVtYWluaW5nIHJlYWwgZGF0YS4KLSAqICAgIChCaWcgdGhhbmtzIHRvIEJpbGwgRWFybmVzdCBmb3IgZ2V0dGluZyBtZSBvdXQgb2YgdGhlIG11ZCBpbiBoZXJlLikKLSAqLwotCi0JCWNtZCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPmNvbm5lY3RlZDsJLyogYXNzdW1lIHdlJ3JlIGNvbm5lY3RlZCAqLwotCQlDSEVDS19OVUxMKGNtZCwgImZpZm9faW50IikKLQotCQkgICAgaWYgKGhvc3RkYXRhLT5maWZvID09IEZJX0ZJRk9fUkVBRElORykgewotCi0JCQlEQihEQl9GSUZPLCBwcmludGsoIntSOiUwMnh9ICIsIHJlYWQxX2lvKElPX0ZJRk9fQ09VTlQpKSkKLQotCQkJICAgIHNwID0gKHVuc2lnbmVkIHNob3J0ICopIChjbWQtPlNDcC5wdHIgKyBjbWQtPlNDcC5oYXZlX2RhdGFfaW4pOwotCQkJaSA9IHJlYWQxX2lvKElPX0ZJRk9fQ09VTlQpICYgMHhmZTsKLQkJCWkgPDw9IDI7CS8qICMgb2Ygd29yZHMgd2FpdGluZyBpbiB0aGUgZmlmbyAqLwotCQkJZiA9IGhvc3RkYXRhLT5pb19iYXNlICsgSU9fRklGTzsKLQotI2lmZGVmIEZBU1RfUkVBRF9JTwotCi0JCQlGQVNUX1JFQUQyX0lPKCk7Ci0jZWxzZQotCQkJd2hpbGUgKGktLSkKLQkJCQkqc3ArKyA9IHJlYWQyX2lvKElPX0ZJRk8pOwotCi0jZW5kaWYKLQotCQkJaSA9IHNwIC0gKHVuc2lnbmVkIHNob3J0ICopIChjbWQtPlNDcC5wdHIgKyBjbWQtPlNDcC5oYXZlX2RhdGFfaW4pOwotCQkJaSA8PD0gMTsKLQkJCWNtZC0+U0NwLmhhdmVfZGF0YV9pbiArPSBpOwotCQl9Ci0KLQkJZWxzZSBpZiAoaG9zdGRhdGEtPmZpZm8gPT0gRklfRklGT19XUklUSU5HKSB7Ci0KLQkJCURCKERCX0ZJRk8sIHByaW50aygie1c6JTAyeH0gIiwgcmVhZDFfaW8oSU9fRklGT19DT1VOVCkpKQotCi0vKiBJZiBhbGwgYnl0ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpZm8sIGZsdXNoIG91dCB0aGUgc3RyYWdnbGVycy4KLSAqIE5vdGUgdGhhdCB3aGlsZSB3cml0aW5nIDE2IGR1bW15IHdvcmRzIHNlZW1zIGFyYml0cmFyeSwgd2UgZG9uJ3QKLSAqIGhhdmUgYW5vdGhlciBjaG9pY2UgdGhhdCBJIGNhbiBzZWUuIFdoYXQgd2UgcmVhbGx5IHdhbnQgaXMgdG8gcmVhZAotICogdGhlIDMzOTMgdHJhbnNmZXIgY291bnQgcmVnaXN0ZXIgKHRoYXQgd291bGQgdGVsbCB1cyBob3cgbWFueSBieXRlcwotICogbmVlZGVkIGZsdXNoaW5nKSwgYnV0IHRoZSBUUkFOU0ZFUl9JTkZPIGNvbW1hbmQgaGFzbid0IGNvbXBsZXRlZAotICogeWV0IChub3QgZW5vdWdoIGJ5dGVzISkgYW5kIHRoYXQgcmVnaXN0ZXIgd29uJ3QgYmUgYWNjZXNzaWJsZS4gU28sCi0gKiB3ZSB1c2UgMTYgd29yZHMgLSBhIG51bWJlciBvYnRhaW5lZCB0aHJvdWdoIHRyaWFsIGFuZCBlcnJvci4KLSAqICBVUERBVEU6IEJpbGwgc2F5cyB0aGlzIGlzIGV4YWN0bHkgd2hhdCBBbHdheXMgZG9lcywgc28gdGhlcmUuCi0gKiAgICAgICAgICBNb3JlIHRoYW5rcyBkdWUgaGltIGZvciBoZWxwIGluIHRoaXMgc2VjdGlvbi4KLSAqLwotCQkJICAgIGlmIChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsID09IGNtZC0+U0NwLmhhdmVfZGF0YV9pbikgewotCQkJCWkgPSAxNjsKLQkJCQl3aGlsZSAoaS0tKQkvKiB3cml0ZSAzMiBkdW1teSBieXRlcyAqLwotCQkJCQl3cml0ZTJfaW8oMCwgSU9fRklGTyk7Ci0JCQl9Ci0KLS8qIElmIHRoZXJlIGFyZSBzdGlsbCBieXRlcyBsZWZ0IGluIHRoZSBTQ1NJIGJ1ZmZlciwgd3JpdGUgYXMgbWFueSBhcyB3ZQotICogY2FuIG91dCB0byB0aGUgZmlmby4KLSAqLwotCi0JCQllbHNlIHsKLQkJCQlzcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoY21kLT5TQ3AucHRyICsgY21kLT5TQ3AuaGF2ZV9kYXRhX2luKTsKLQkJCQlpID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCAtIGNtZC0+U0NwLmhhdmVfZGF0YV9pbjsJLyogYnl0ZXMgeWV0IHRvIGdvICovCi0JCQkJaiA9IHJlYWQxX2lvKElPX0ZJRk9fQ09VTlQpICYgMHhmZTsKLQkJCQlqIDw8PSAyOwkvKiBob3cgbWFueSB3b3JkcyB0aGUgZmlmbyBoYXMgcm9vbSBmb3IgKi8KLQkJCQlpZiAoKGogPDwgMSkgPiBpKQotCQkJCQlqID0gKGkgPj4gMSk7Ci0JCQkJd2hpbGUgKGotLSkKLQkJCQkJd3JpdGUyX2lvKCpzcCsrLCBJT19GSUZPKTsKLQotCQkJCWkgPSBzcCAtICh1bnNpZ25lZCBzaG9ydCAqKSAoY21kLT5TQ3AucHRyICsgY21kLT5TQ3AuaGF2ZV9kYXRhX2luKTsKLQkJCQlpIDw8PSAxOwotCQkJCWNtZC0+U0NwLmhhdmVfZGF0YV9pbiArPSBpOwotCQkJfQotCQl9Ci0KLQkJZWxzZSB7Ci0JCQlwcmludGsoIioqKiBTcHVyaW91cyBGSUZPIGludGVycnVwdCAqKioiKTsKLQkJfQotCi0JCXdyaXRlMV9pbygwLCBJT19MRURfT0ZGKTsKLQotLyogcmVsZWFzZSB0aGUgU01QIHNwaW5fbG9jayBhbmQgcmVzdG9yZSBpcnEgc3RhdGUgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0KLS8qIFRoaXMgaW50ZXJydXB0IHdhcyB0cmlnZ2VyZWQgYnkgdGhlIFdEMzNjOTMgY2hpcC4gVGhlIGZpZm8gaW50ZXJydXB0Ci0gKiBtYXkgYWxzbyBiZSBhc3NlcnRlZCwgYnV0IHdlIGRvbid0IGJvdGhlciB0byBjaGVjayBpdDogd2UgZ2V0IG1vcmUKLSAqIGRldGFpbGVkIGluZm8gZnJvbSBGSUZPX1JFQURJTkcgYW5kIEZJRk9fV1JJVElORyAoc2VlIGJlbG93KS4KLSAqLwotCi0JY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+Y29ubmVjdGVkOwkvKiBhc3N1bWUgd2UncmUgY29ubmVjdGVkICovCi0Jc3IgPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX1NDU0lfU1RBVFVTKTsJLyogY2xlYXIgdGhlIGludGVycnVwdCAqLwotCXBocyA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfQ09NTUFORF9QSEFTRSk7Ci0KLQlpZiAoIWNtZCAmJiAoc3IgIT0gQ1NSX1JFU0VMX0FNICYmIHNyICE9IENTUl9USU1FT1VUICYmIHNyICE9IENTUl9TRUxFQ1QpKSB7Ci0JCXByaW50aygiXG5OUjp3ZC1pbnRyLTFcbiIpOwotCQl3cml0ZTFfaW8oMCwgSU9fTEVEX09GRik7Ci0KLS8qIHJlbGVhc2UgdGhlIFNNUCBzcGluX2xvY2sgYW5kIHJlc3RvcmUgaXJxIHN0YXRlICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JREIoREJfSU5UUiwgcHJpbnRrKCJ7JTAyeDolMDJ4LSIsIGFzciwgc3IpKQotCi0vKiBBZnRlciBzdGFydGluZyBhIEZJRk8tYmFzZWQgdHJhbnNmZXIsIHRoZSBuZXh0IF9XRDMzOTNfIGludGVycnVwdCBpcwotICogZ3VhcmFudGVlZCB0byBiZSBpbiByZXNwb25zZSB0byB0aGUgY29tcGxldGlvbiBvZiB0aGUgdHJhbnNmZXIuCi0gKiBJZiB3ZSB3ZXJlIHJlYWRpbmcsIHRoZXJlJ3MgcHJvYmFibHkgZGF0YSBpbiB0aGUgZmlmbyB0aGF0IG5lZWRzCi0gKiB0byBiZSBjb3BpZWQgaW50byBSQU0gLSBkbyB0aGF0IGhlcmUuIEFsc28sIHdlIGhhdmUgdG8gdXBkYXRlCi0gKiAndGhpc19yZXNpZHVhbCcgYW5kICdwdHInIGJhc2VkIG9uIHRoZSBjb250ZW50cyBvZiB0aGUKLSAqIFRSQU5TRkVSX0NPVU5UIHJlZ2lzdGVyLCBpbiBjYXNlIHRoZSBkZXZpY2UgZGVjaWRlZCB0byBkbyBhbgotICogaW50ZXJtZWRpYXRlIGRpc2Nvbm5lY3QgKGEgZGV2aWNlIG1heSBkbyB0aGlzIGlmIGl0IGhhcyB0bwotICogZG8gYSBzZWVrLCAgb3IganVzdCB0byBiZSBuaWNlIGFuZCBsZXQgb3RoZXIgZGV2aWNlcyBoYXZlCi0gKiBzb21lIGJ1cyB0aW1lIGR1cmluZyBsb25nIHRyYW5zZmVycykuCi0gKiBBZnRlciBkb2luZyB3aGF0ZXZlciBpcyBuZWNlc3Nhcnkgd2l0aCB0aGUgZmlmbywgd2UgZ28gb24gYW5kCi0gKiBzZXJ2aWNlIHRoZSBXRDMzOTMgaW50ZXJydXB0IG5vcm1hbGx5LgotICovCi0JICAgIGlmIChob3N0ZGF0YS0+ZmlmbyA9PSBGSV9GSUZPX1JFQURJTkcpIHsKLQotLyogYnVmZmVyIGluZGV4ID0gc3RhcnQtb2YtYnVmZmVyICsgIy1vZi1ieXRlcy1hbHJlYWR5LXJlYWQgKi8KLQotCQlzcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoY21kLT5TQ3AucHRyICsgY21kLT5TQ3AuaGF2ZV9kYXRhX2luKTsKLQotLyogYnl0ZXMgcmVtYWluaW5nIGluIGZpZm8gPSAodG90YWwtd2FudGVkIC0gIy1ub3QtZ290KSAtICMtYWxyZWFkeS1yZWFkICovCi0KLQkJaSA9IChjbWQtPlNDcC50aGlzX3Jlc2lkdWFsIC0gcmVhZF8zMzkzX2NvdW50KGhvc3RkYXRhKSkgLSBjbWQtPlNDcC5oYXZlX2RhdGFfaW47Ci0JCWkgPj49IDE7CS8qIEd1bHAuIFdlIGFzc3VtZSB0aGlzIHdpbGwgYWx3YXlzIGJlIG1vZHVsbyAyICovCi0JCWYgPSBob3N0ZGF0YS0+aW9fYmFzZSArIElPX0ZJRk87Ci0KLSNpZmRlZiBGQVNUX1JFQURfSU8KLQotCQlGQVNUX1JFQUQyX0lPKCk7Ci0jZWxzZQotCQl3aGlsZSAoaS0tKQotCQkJKnNwKysgPSByZWFkMl9pbyhJT19GSUZPKTsKLQotI2VuZGlmCi0KLQkJaG9zdGRhdGEtPmZpZm8gPSBGSV9GSUZPX1VOVVNFRDsKLQkJbGVuZ3RoID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbDsKLQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IHJlYWRfMzM5M19jb3VudChob3N0ZGF0YSk7Ci0JCWNtZC0+U0NwLnB0ciArPSAobGVuZ3RoIC0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7Ci0KLQkJREIoREJfVFJBTlNGRVIsIHByaW50aygiKCVwLCVkKSIsIGNtZC0+U0NwLnB0ciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCkpCi0KLQl9Ci0KLQllbHNlIGlmIChob3N0ZGF0YS0+ZmlmbyA9PSBGSV9GSUZPX1dSSVRJTkcpIHsKLQkJaG9zdGRhdGEtPmZpZm8gPSBGSV9GSUZPX1VOVVNFRDsKLQkJbGVuZ3RoID0gY21kLT5TQ3AudGhpc19yZXNpZHVhbDsKLQkJY21kLT5TQ3AudGhpc19yZXNpZHVhbCA9IHJlYWRfMzM5M19jb3VudChob3N0ZGF0YSk7Ci0JCWNtZC0+U0NwLnB0ciArPSAobGVuZ3RoIC0gY21kLT5TQ3AudGhpc19yZXNpZHVhbCk7Ci0KLQkJREIoREJfVFJBTlNGRVIsIHByaW50aygiKCVwLCVkKSIsIGNtZC0+U0NwLnB0ciwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCkpCi0KLQl9Ci0KLS8qIFJlc3BvbmQgdG8gdGhlIHNwZWNpZmljIFdEMzM5MyBpbnRlcnJ1cHQgLSB0aGVyZSBhcmUgcXVpdGUgYSBmZXchICovCi0KLQlzd2l0Y2ggKHNyKSB7Ci0KLQljYXNlIENTUl9USU1FT1VUOgotCQlEQihEQl9JTlRSLCBwcmludGsoIlRJTUVPVVQiKSkKLQotCQkgICAgaWYgKGhvc3RkYXRhLT5zdGF0ZSA9PSBTX1JVTk5JTkdfTEVWRUwyKQotCQkJaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7Ci0JCWVsc2UgewotCQkJY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+c2VsZWN0aW5nOwkvKiBnZXQgYSB2YWxpZCBjbWQgKi8KLQkJCUNIRUNLX05VTEwoY21kLCAiY3NyX3RpbWVvdXQiKQotCQkJICAgIGhvc3RkYXRhLT5zZWxlY3RpbmcgPSBOVUxMOwotCQl9Ci0KLQkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKLQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7Ci0JCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7Ci0JCWNtZC0+c2NzaV9kb25lKGNtZCk7Ci0KLS8qIFdlIGFyZSBub3QgY29ubmVjdGVkIHRvIGEgdGFyZ2V0IC0gY2hlY2sgdG8gc2VlIGlmIHRoZXJlCi0gKiBhcmUgY29tbWFuZHMgd2FpdGluZyB0byBiZSBleGVjdXRlZC4KLSAqLwotCi0JCWluMjAwMF9leGVjdXRlKGluc3RhbmNlKTsKLQkJYnJlYWs7Ci0KLQotLyogTm90ZTogdGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG5vdCBvY2N1ciBpbiBhIExFVkVMMiBjb21tYW5kICovCi0KLQljYXNlIENTUl9TRUxFQ1Q6Ci0JCURCKERCX0lOVFIsIHByaW50aygiU0VMRUNUIikpCi0JCSAgICBob3N0ZGF0YS0+Y29ubmVjdGVkID0gY21kID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+c2VsZWN0aW5nOwotCQlDSEVDS19OVUxMKGNtZCwgImNzcl9zZWxlY3QiKQotCQkgICAgaG9zdGRhdGEtPnNlbGVjdGluZyA9IE5VTEw7Ci0KLQkJLyogY29uc3RydWN0IGFuIElERU5USUZZIG1lc3NhZ2Ugd2l0aCBjb3JyZWN0IGRpc2Nvbm5lY3QgYml0ICovCi0KLQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSA9ICgweDgwIHwgMHgwMCB8IGNtZC0+ZGV2aWNlLT5sdW4pOwotCQlpZiAoY21kLT5TQ3AucGhhc2UpCi0JCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdIHw9IDB4NDA7Ci0KLQkJaWYgKGhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9PSBTU19GSVJTVCkgewotI2lmZGVmIFNZTkNfREVCVUcKLQkJCXByaW50aygiIHNlbmRpbmcgU0RUUiAiKTsKLSNlbmRpZgotCi0JCQlob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gPSBTU19XQUlUSU5HOwotCi0JCQkvKiB0YWNrIG9uIGEgMm5kIG1lc3NhZ2UgdG8gYXNrIGFib3V0IHN5bmNocm9ub3VzIHRyYW5zZmVycyAqLwotCi0JCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzFdID0gRVhURU5ERURfTUVTU0FHRTsKLQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMl0gPSAzOwotCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1szXSA9IEVYVEVOREVEX1NEVFI7Ci0JCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzRdID0gT1BUSU1VTV9TWF9QRVIgLyA0OwotCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1s1XSA9IE9QVElNVU1fU1hfT0ZGOwotCQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDY7Ci0JCX0gZWxzZQotCQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDE7Ci0KLQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7Ci0JCWJyZWFrOwotCi0KLQljYXNlIENTUl9YRkVSX0RPTkUgfCBQSFNfREFUQV9JTjoKLQljYXNlIENTUl9VTkVYUCB8IFBIU19EQVRBX0lOOgotCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfREFUQV9JTjoKLQkJREIoREJfSU5UUiwgcHJpbnRrKCJJTi0lZC4lZCIsIGNtZC0+U0NwLnRoaXNfcmVzaWR1YWwsIGNtZC0+U0NwLmJ1ZmZlcnNfcmVzaWR1YWwpKQotCQkgICAgdHJhbnNmZXJfYnl0ZXMoY21kLCBEQVRBX0lOX0RJUik7Ci0JCWlmIChob3N0ZGF0YS0+c3RhdGUgIT0gU19SVU5OSU5HX0xFVkVMMikKLQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOwotCQlicmVhazsKLQotCi0JY2FzZSBDU1JfWEZFUl9ET05FIHwgUEhTX0RBVEFfT1VUOgotCWNhc2UgQ1NSX1VORVhQIHwgUEhTX0RBVEFfT1VUOgotCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfREFUQV9PVVQ6Ci0JCURCKERCX0lOVFIsIHByaW50aygiT1VULSVkLiVkIiwgY21kLT5TQ3AudGhpc19yZXNpZHVhbCwgY21kLT5TQ3AuYnVmZmVyc19yZXNpZHVhbCkpCi0JCSAgICB0cmFuc2Zlcl9ieXRlcyhjbWQsIERBVEFfT1VUX0RJUik7Ci0JCWlmIChob3N0ZGF0YS0+c3RhdGUgIT0gU19SVU5OSU5HX0xFVkVMMikKLQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOwotCQlicmVhazsKLQotCi0vKiBOb3RlOiB0aGlzIGludGVycnVwdCBzaG91bGQgbm90IG9jY3VyIGluIGEgTEVWRUwyIGNvbW1hbmQgKi8KLQotCWNhc2UgQ1NSX1hGRVJfRE9ORSB8IFBIU19DT01NQU5EOgotCWNhc2UgQ1NSX1VORVhQIHwgUEhTX0NPTU1BTkQ6Ci0JY2FzZSBDU1JfU1JWX1JFUSB8IFBIU19DT01NQU5EOgotCQlEQihEQl9JTlRSLCBwcmludGsoIkNNTkQtJTAyeCIsIGNtZC0+Y21uZFswXSkpCi0JCSAgICB0cmFuc2Zlcl9waW8oY21kLT5jbW5kLCBjbWQtPmNtZF9sZW4sIERBVEFfT1VUX0RJUiwgaG9zdGRhdGEpOwotCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKLQkJYnJlYWs7Ci0KLQotCWNhc2UgQ1NSX1hGRVJfRE9ORSB8IFBIU19TVEFUVVM6Ci0JY2FzZSBDU1JfVU5FWFAgfCBQSFNfU1RBVFVTOgotCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfU1RBVFVTOgotCQlEQihEQl9JTlRSLCBwcmludGsoIlNUQVRVUz0iKSkKLQotCQkgICAgY21kLT5TQ3AuU3RhdHVzID0gcmVhZF8xX2J5dGUoaG9zdGRhdGEpOwotCQlEQihEQl9JTlRSLCBwcmludGsoIiUwMngiLCBjbWQtPlNDcC5TdGF0dXMpKQotCQkgICAgaWYgKGhvc3RkYXRhLT5sZXZlbDIgPj0gTDJfQkFTSUMpIHsKLQkJCXNyID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9TQ1NJX1NUQVRVUyk7CS8qIGNsZWFyIGludGVycnVwdCAqLwotCQkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKLQkJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NTApOwotCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9TRUxfQVROX1hGRVIpOwotCQl9IGVsc2UgewotCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7Ci0JCX0KLQkJYnJlYWs7Ci0KLQotCWNhc2UgQ1NSX1hGRVJfRE9ORSB8IFBIU19NRVNTX0lOOgotCWNhc2UgQ1NSX1VORVhQIHwgUEhTX01FU1NfSU46Ci0JY2FzZSBDU1JfU1JWX1JFUSB8IFBIU19NRVNTX0lOOgotCQlEQihEQl9JTlRSLCBwcmludGsoIk1TR19JTj0iKSkKLQotCQkgICAgbXNnID0gcmVhZF8xX2J5dGUoaG9zdGRhdGEpOwotCQlzciA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfU0NTSV9TVEFUVVMpOwkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KLQotCQlob3N0ZGF0YS0+aW5jb21pbmdfbXNnW2hvc3RkYXRhLT5pbmNvbWluZ19wdHJdID0gbXNnOwotCQlpZiAoaG9zdGRhdGEtPmluY29taW5nX21zZ1swXSA9PSBFWFRFTkRFRF9NRVNTQUdFKQotCQkJbXNnID0gRVhURU5ERURfTUVTU0FHRTsKLQkJZWxzZQotCQkJaG9zdGRhdGEtPmluY29taW5nX3B0ciA9IDA7Ci0KLQkJY21kLT5TQ3AuTWVzc2FnZSA9IG1zZzsKLQkJc3dpdGNoIChtc2cpIHsKLQotCQljYXNlIENPTU1BTkRfQ09NUExFVEU6Ci0JCQlEQihEQl9JTlRSLCBwcmludGsoIkNDTVAiKSkKLQkJCSAgICB3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOwotCQkJaG9zdGRhdGEtPnN0YXRlID0gU19QUkVfQ01QX0RJU0M7Ci0JCQlicmVhazsKLQotCQljYXNlIFNBVkVfUE9JTlRFUlM6Ci0JCQlEQihEQl9JTlRSLCBwcmludGsoIlNEUCIpKQotCQkJICAgIHdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfTkVHQVRFX0FDSyk7Ci0JCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUkVTVE9SRV9QT0lOVEVSUzoKLQkJCURCKERCX0lOVFIsIHByaW50aygiUkRQIikpCi0JCQkgICAgaWYgKGhvc3RkYXRhLT5sZXZlbDIgPj0gTDJfQkFTSUMpIHsKLQkJCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9DT01NQU5EX1BIQVNFLCAweDQ1KTsKLQkJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX1NFTF9BVE5fWEZFUik7Ci0JCQkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKLQkJCX0gZWxzZSB7Ci0JCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9ORUdBVEVfQUNLKTsKLQkJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgRElTQ09OTkVDVDoKLQkJCURCKERCX0lOVFIsIHByaW50aygiRElTIikpCi0JCQkgICAgY21kLT5kZXZpY2UtPmRpc2Nvbm5lY3QgPSAxOwotCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9ORUdBVEVfQUNLKTsKLQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfUFJFX1RNUF9ESVNDOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNRVNTQUdFX1JFSkVDVDoKLQkJCURCKERCX0lOVFIsIHByaW50aygiUkVKIikpCi0jaWZkZWYgU1lOQ19ERUJVRwotCQkJICAgIHByaW50aygiLVJFSi0iKTsKLSNlbmRpZgotCQkJaWYgKGhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9PSBTU19XQUlUSU5HKQotCQkJCWhvc3RkYXRhLT5zeW5jX3N0YXRbY21kLT5kZXZpY2UtPmlkXSA9IFNTX1NFVDsKLQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfTkVHQVRFX0FDSyk7Ci0JCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRVhURU5ERURfTUVTU0FHRToKLQkJCURCKERCX0lOVFIsIHByaW50aygiRVhUIikpCi0KLQkJCSAgICB1Y3AgPSBob3N0ZGF0YS0+aW5jb21pbmdfbXNnOwotCi0jaWZkZWYgU1lOQ19ERUJVRwotCQkJcHJpbnRrKCIlMDJ4IiwgdWNwW2hvc3RkYXRhLT5pbmNvbWluZ19wdHJdKTsKLSNlbmRpZgotCQkJLyogSXMgdGhpcyB0aGUgbGFzdCBieXRlIG9mIHRoZSBleHRlbmRlZCBtZXNzYWdlPyAqLwotCi0JCQlpZiAoKGhvc3RkYXRhLT5pbmNvbWluZ19wdHIgPj0gMikgJiYgKGhvc3RkYXRhLT5pbmNvbWluZ19wdHIgPT0gKHVjcFsxXSArIDEpKSkgewotCi0JCQkJc3dpdGNoICh1Y3BbMl0pIHsJLyogd2hhdCdzIHRoZSBFWFRFTkRFRCBjb2RlPyAqLwotCQkJCWNhc2UgRVhURU5ERURfU0RUUjoKLQkJCQkJaWQgPSBjYWxjX3N5bmNfeGZlcih1Y3BbM10sIHVjcFs0XSk7Ci0JCQkJCWlmIChob3N0ZGF0YS0+c3luY19zdGF0W2NtZC0+ZGV2aWNlLT5pZF0gIT0gU1NfV0FJVElORykgewotCi0vKiBBIGRldmljZSBoYXMgc2VudCBhbiB1bnNvbGljaXRlZCBTRFRSIG1lc3NhZ2U7IHJhdGhlciB0aGFuIGdvCi0gKiB0aHJvdWdoIHRoZSBlZmZvcnQgb2YgZGVjb2RpbmcgaXQgYW5kIHRoZW4gZmlndXJpbmcgb3V0IHdoYXQKLSAqIG91ciByZXBseSBzaG91bGQgYmUsIHdlJ3JlIGp1c3QgZ29ubmEgc2F5IHRoYXQgd2UgaGF2ZSBhCi0gKiBzeW5jaHJvbm91cyBmaWZvIGRlcHRoIG9mIDAuIFRoaXMgd2lsbCByZXN1bHQgaW4gYXN5bmNocm9ub3VzCi0gKiB0cmFuc2ZlcnMgLSBub3QgaWRlYWwgYnV0IHNvIG11Y2ggZWFzaWVyLgotICogQWN0dWFsbHksIHRoaXMgaXMgT0sgYmVjYXVzZSBpdCBhc3N1cmVzIHVzIHRoYXQgaWYgd2UgZG9uJ3QKLSAqIHNwZWNpZmljYWxseSBhc2sgZm9yIHN5bmMgdHJhbnNmZXJzLCB3ZSB3b24ndCBkbyBhbnkuCi0gKi8KLQotCQkJCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9BU1NFUlRfQVROKTsJLyogd2FudCBNRVNTX09VVCAqLwotCQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSA9IEVYVEVOREVEX01FU1NBR0U7Ci0JCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzFdID0gMzsKLQkJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMl0gPSBFWFRFTkRFRF9TRFRSOwotCQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1szXSA9IGhvc3RkYXRhLT5kZWZhdWx0X3N4X3BlciAvIDQ7Ci0JCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzRdID0gMDsKLQkJCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSA1OwotCQkJCQkJaG9zdGRhdGEtPnN5bmNfeGZlcltjbWQtPmRldmljZS0+aWRdID0gY2FsY19zeW5jX3hmZXIoaG9zdGRhdGEtPmRlZmF1bHRfc3hfcGVyIC8gNCwgMCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlob3N0ZGF0YS0+c3luY194ZmVyW2NtZC0+ZGV2aWNlLT5pZF0gPSBpZDsKLQkJCQkJfQotI2lmZGVmIFNZTkNfREVCVUcKLQkJCQkJcHJpbnRrKCJzeW5jX3hmZXI9JTAyeCIsIGhvc3RkYXRhLT5zeW5jX3hmZXJbY21kLT5kZXZpY2UtPmlkXSk7Ci0jZW5kaWYKLQkJCQkJaG9zdGRhdGEtPnN5bmNfc3RhdFtjbWQtPmRldmljZS0+aWRdID0gU1NfU0VUOwotCQkJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOwotCQkJCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBFWFRFTkRFRF9XRFRSOgotCQkJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX0FTU0VSVF9BVE4pOwkvKiB3YW50IE1FU1NfT1VUICovCi0JCQkJCXByaW50aygic2VuZGluZyBXRFRSICIpOwotCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdID0gRVhURU5ERURfTUVTU0FHRTsKLQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1sxXSA9IDI7Ci0JCQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMl0gPSBFWFRFTkRFRF9XRFRSOwotCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzNdID0gMDsJLyogOCBiaXQgdHJhbnNmZXIgd2lkdGggKi8KLQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDQ7Ci0JCQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfTkVHQVRFX0FDSyk7Ci0JCQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfQ09OTkVDVEVEOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX0FTU0VSVF9BVE4pOwkvKiB3YW50IE1FU1NfT1VUICovCi0JCQkJCXByaW50aygiUmVqZWN0aW5nIFVua25vd24gRXh0ZW5kZWQgTWVzc2FnZSglMDJ4KS4gIiwgdWNwWzJdKTsKLQkJCQkJaG9zdGRhdGEtPm91dGdvaW5nX21zZ1swXSA9IE1FU1NBR0VfUkVKRUNUOwotCQkJCQlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gMTsKLQkJCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9ORUdBVEVfQUNLKTsKLQkJCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlob3N0ZGF0YS0+aW5jb21pbmdfcHRyID0gMDsKLQkJCX0KLQotCQkJLyogV2UgbmVlZCB0byByZWFkIG1vcmUgTUVTU19JTiBieXRlcyBmb3IgdGhlIGV4dGVuZGVkIG1lc3NhZ2UgKi8KLQotCQkJZWxzZSB7Ci0JCQkJaG9zdGRhdGEtPmluY29taW5nX3B0cisrOwotCQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfTkVHQVRFX0FDSyk7Ci0JCQkJaG9zdGRhdGEtPnN0YXRlID0gU19DT05ORUNURUQ7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJSZWplY3RpbmcgVW5rbm93biBNZXNzYWdlKCUwMngpICIsIG1zZyk7Ci0JCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX0FTU0VSVF9BVE4pOwkvKiB3YW50IE1FU1NfT1VUICovCi0JCQlob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdID0gTUVTU0FHRV9SRUpFQ1Q7Ci0JCQlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gMTsKLQkJCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfTkVHQVRFX0FDSyk7Ci0JCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKLQkJfQotCQlicmVhazsKLQotCi0vKiBOb3RlOiB0aGlzIGludGVycnVwdCB3aWxsIG9jY3VyIG9ubHkgYWZ0ZXIgYSBMRVZFTDIgY29tbWFuZCAqLwotCi0JY2FzZSBDU1JfU0VMX1hGRVJfRE9ORToKLQotLyogTWFrZSBzdXJlIHRoYXQgcmVzZWxlY3Rpb24gaXMgZW5hYmxlZCBhdCB0aGlzIHBvaW50IC0gaXQgbWF5Ci0gKiBoYXZlIGJlZW4gdHVybmVkIG9mZiBmb3IgdGhlIGNvbW1hbmQgdGhhdCBqdXN0IGNvbXBsZXRlZC4KLSAqLwotCi0JCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX1NPVVJDRV9JRCwgU1JDSURfRVIpOwotCQlpZiAocGhzID09IDB4NjApIHsKLQkJCURCKERCX0lOVFIsIHByaW50aygiU1gtRE9ORSIpKQotCQkJICAgIGNtZC0+U0NwLk1lc3NhZ2UgPSBDT01NQU5EX0NPTVBMRVRFOwotCQkJbHVuID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9UQVJHRVRfTFVOKTsKLQkJCURCKERCX0lOVFIsIHByaW50aygiOiVkLiVkIiwgY21kLT5TQ3AuU3RhdHVzLCBsdW4pKQotCQkJICAgIGhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOwotCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7Ci0JCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOwotCQkJaWYgKGNtZC0+U0NwLlN0YXR1cyA9PSBJTExFR0FMX1NUQVRVU19CWVRFKQotCQkJCWNtZC0+U0NwLlN0YXR1cyA9IGx1bjsKLQkJCWlmIChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSAmJiBjbWQtPlNDcC5TdGF0dXMgIT0gR09PRCkKLQkJCQljbWQtPnJlc3VsdCA9IChjbWQtPnJlc3VsdCAmIDB4MDBmZmZmKSB8IChESURfRVJST1IgPDwgMTYpOwotCQkJZWxzZQotCQkJCWNtZC0+cmVzdWx0ID0gY21kLT5TQ3AuU3RhdHVzIHwgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7Ci0JCQljbWQtPnNjc2lfZG9uZShjbWQpOwotCi0vKiBXZSBhcmUgbm8gbG9uZ2VyIGNvbm5lY3RlZCB0byBhIHRhcmdldCAtIGNoZWNrIHRvIHNlZSBpZgotICogdGhlcmUgYXJlIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZXhlY3V0ZWQuCi0gKi8KLQotCQkJaW4yMDAwX2V4ZWN1dGUoaW5zdGFuY2UpOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKCIlMDJ4OiUwMng6JTAyeDogVW5rbm93biBTRUxfWEZFUl9ET05FIHBoYXNlISEtLS0iLCBhc3IsIHNyLCBwaHMpOwotCQl9Ci0JCWJyZWFrOwotCi0KLS8qIE5vdGU6IHRoaXMgaW50ZXJydXB0IHdpbGwgb2NjdXIgb25seSBhZnRlciBhIExFVkVMMiBjb21tYW5kICovCi0KLQljYXNlIENTUl9TRFA6Ci0JCURCKERCX0lOVFIsIHByaW50aygiU0RQIikpCi0JCSAgICBob3N0ZGF0YS0+c3RhdGUgPSBTX1JVTk5JTkdfTEVWRUwyOwotCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9DT01NQU5EX1BIQVNFLCAweDQxKTsKLQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9TRUxfQVROX1hGRVIpOwotCQlicmVhazsKLQotCi0JY2FzZSBDU1JfWEZFUl9ET05FIHwgUEhTX01FU1NfT1VUOgotCWNhc2UgQ1NSX1VORVhQIHwgUEhTX01FU1NfT1VUOgotCWNhc2UgQ1NSX1NSVl9SRVEgfCBQSFNfTUVTU19PVVQ6Ci0JCURCKERCX0lOVFIsIHByaW50aygiTVNHX09VVD0iKSkKLQotLyogVG8gZ2V0IGhlcmUsIHdlJ3ZlIHByb2JhYmx5IHJlcXVlc3RlZCBNRVNTQUdFX09VVCBhbmQgaGF2ZQotICogYWxyZWFkeSBwdXQgdGhlIGNvcnJlY3QgYnl0ZXMgaW4gb3V0Z29pbmdfbXNnW10gYW5kIGZpbGxlZAotICogaW4gb3V0Z29pbmdfbGVuLiBXZSBzaW1wbHkgc2VuZCB0aGVtIG91dCB0byB0aGUgU0NTSSBidXMuCi0gKiBTb21ldGltZXMgd2UgZ2V0IE1FU1NBR0VfT1VUIHBoYXNlIHdoZW4gd2UncmUgbm90IGV4cGVjdGluZwotICogaXQgLSBsaWtlIHdoZW4gb3VyIFNEVFIgbWVzc2FnZSBpcyByZWplY3RlZCBieSBhIHRhcmdldC4gU29tZQotICogdGFyZ2V0cyBzZW5kIHRoZSBSRUpFQ1QgYmVmb3JlIHJlY2VpdmluZyBhbGwgb2YgdGhlIGV4dGVuZGVkCi0gKiBtZXNzYWdlLCBhbmQgdGhlbiBzZWVtIHRvIGdvIGJhY2sgdG8gTUVTU0FHRV9PVVQgZm9yIGEgYnl0ZQotICogb3IgdHdvLiBOb3Qgc3VyZSB3aHksIG9yIGlmIEknbSBkb2luZyBzb21ldGhpbmcgd3JvbmcgdG8KLSAqIGNhdXNlIHRoaXMgdG8gaGFwcGVuLiBSZWdhcmRsZXNzLCBpdCBzZWVtcyB0aGF0IHNlbmRpbmcKLSAqIE5PUCBtZXNzYWdlcyBpbiB0aGVzZSBzaXR1YXRpb25zIHJlc3VsdHMgaW4gbm8gaGFybSBhbmQKLSAqIG1ha2VzIGV2ZXJ5b25lIGhhcHB5LgotICovCi0JCSAgICBpZiAoaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9PSAwKSB7Ci0JCQlob3N0ZGF0YS0+b3V0Z29pbmdfbGVuID0gMTsKLQkJCWhvc3RkYXRhLT5vdXRnb2luZ19tc2dbMF0gPSBOT1A7Ci0JCX0KLQkJdHJhbnNmZXJfcGlvKGhvc3RkYXRhLT5vdXRnb2luZ19tc2csIGhvc3RkYXRhLT5vdXRnb2luZ19sZW4sIERBVEFfT1VUX0RJUiwgaG9zdGRhdGEpOwotCQlEQihEQl9JTlRSLCBwcmludGsoIiUwMngiLCBob3N0ZGF0YS0+b3V0Z29pbmdfbXNnWzBdKSkKLQkJICAgIGhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAwOwotCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKLQkJYnJlYWs7Ci0KLQotCWNhc2UgQ1NSX1VORVhQX0RJU0M6Ci0KLS8qIEkgdGhpbmsgSSd2ZSBzZWVuIHRoaXMgYWZ0ZXIgYSByZXF1ZXN0LXNlbnNlIHRoYXQgd2FzIGluIHJlc3BvbnNlCi0gKiB0byBhbiBlcnJvciBjb25kaXRpb24sIGJ1dCBub3Qgc3VyZS4gV2UgY2VydGFpbmx5IG5lZWQgdG8gZG8KLSAqIHNvbWV0aGluZyB3aGVuIHdlIGdldCB0aGlzIGludGVycnVwdCAtIHRoZSBxdWVzdGlvbiBpcyAnd2hhdD8nLgotICogTGV0J3MgdGhpbmsgcG9zaXRpdmVseSwgYW5kIGFzc3VtZSBzb21lIGNvbW1hbmQgaGFzIGZpbmlzaGVkCi0gKiBpbiBhIGxlZ2FsIG1hbm5lciAobGlrZSBhIGNvbW1hbmQgdGhhdCBwcm92b2tlcyBhIHJlcXVlc3Qtc2Vuc2UpLAotICogc28gd2UgdHJlYXQgaXQgYXMgYSBub3JtYWwgY29tbWFuZC1jb21wbGV0ZS1kaXNjb25uZWN0LgotICovCi0KLQotLyogTWFrZSBzdXJlIHRoYXQgcmVzZWxlY3Rpb24gaXMgZW5hYmxlZCBhdCB0aGlzIHBvaW50IC0gaXQgbWF5Ci0gKiBoYXZlIGJlZW4gdHVybmVkIG9mZiBmb3IgdGhlIGNvbW1hbmQgdGhhdCBqdXN0IGNvbXBsZXRlZC4KLSAqLwotCi0JCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX1NPVVJDRV9JRCwgU1JDSURfRVIpOwotCQlpZiAoY21kID09IE5VTEwpIHsKLQkJCXByaW50aygiIC0gQWxyZWFkeSBkaXNjb25uZWN0ZWQhICIpOwotCQkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKLQotLyogcmVsZWFzZSB0aGUgU01QIHNwaW5fbG9jayBhbmQgcmVzdG9yZSBpcnEgc3RhdGUgKi8KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9Ci0JCURCKERCX0lOVFIsIHByaW50aygiVU5FWFBfRElTQyIpKQotCQkgICAgaG9zdGRhdGEtPmNvbm5lY3RlZCA9IE5VTEw7Ci0JCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOwotCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOwotCQlpZiAoY21kLT5jbW5kWzBdID09IFJFUVVFU1RfU0VOU0UgJiYgY21kLT5TQ3AuU3RhdHVzICE9IEdPT0QpCi0JCQljbWQtPnJlc3VsdCA9IChjbWQtPnJlc3VsdCAmIDB4MDBmZmZmKSB8IChESURfRVJST1IgPDwgMTYpOwotCQllbHNlCi0JCQljbWQtPnJlc3VsdCA9IGNtZC0+U0NwLlN0YXR1cyB8IChjbWQtPlNDcC5NZXNzYWdlIDw8IDgpOwotCQljbWQtPnNjc2lfZG9uZShjbWQpOwotCi0vKiBXZSBhcmUgbm8gbG9uZ2VyIGNvbm5lY3RlZCB0byBhIHRhcmdldCAtIGNoZWNrIHRvIHNlZSBpZgotICogdGhlcmUgYXJlIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZXhlY3V0ZWQuCi0gKi8KLQotCQlpbjIwMDBfZXhlY3V0ZShpbnN0YW5jZSk7Ci0JCWJyZWFrOwotCi0KLQljYXNlIENTUl9ESVNDOgotCi0vKiBNYWtlIHN1cmUgdGhhdCByZXNlbGVjdGlvbiBpcyBlbmFibGVkIGF0IHRoaXMgcG9pbnQgLSBpdCBtYXkKLSAqIGhhdmUgYmVlbiB0dXJuZWQgb2ZmIGZvciB0aGUgY29tbWFuZCB0aGF0IGp1c3QgY29tcGxldGVkLgotICovCi0KLQkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfU09VUkNFX0lELCBTUkNJRF9FUik7Ci0JCURCKERCX0lOVFIsIHByaW50aygiRElTQyIpKQotCQkgICAgaWYgKGNtZCA9PSBOVUxMKSB7Ci0JCQlwcmludGsoIiAtIEFscmVhZHkgZGlzY29ubmVjdGVkISAiKTsKLQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7Ci0JCX0KLQkJc3dpdGNoIChob3N0ZGF0YS0+c3RhdGUpIHsKLQkJY2FzZSBTX1BSRV9DTVBfRElTQzoKLQkJCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOwotCQkJaG9zdGRhdGEtPmJ1c3lbY21kLT5kZXZpY2UtPmlkXSAmPSB+KDEgPDwgY21kLT5kZXZpY2UtPmx1bik7Ci0JCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOwotCQkJREIoREJfSU5UUiwgcHJpbnRrKCI6JWQiLCBjbWQtPlNDcC5TdGF0dXMpKQotCQkJICAgIGlmIChjbWQtPmNtbmRbMF0gPT0gUkVRVUVTVF9TRU5TRSAmJiBjbWQtPlNDcC5TdGF0dXMgIT0gR09PRCkKLQkJCQljbWQtPnJlc3VsdCA9IChjbWQtPnJlc3VsdCAmIDB4MDBmZmZmKSB8IChESURfRVJST1IgPDwgMTYpOwotCQkJZWxzZQotCQkJCWNtZC0+cmVzdWx0ID0gY21kLT5TQ3AuU3RhdHVzIHwgKGNtZC0+U0NwLk1lc3NhZ2UgPDwgOCk7Ci0JCQljbWQtPnNjc2lfZG9uZShjbWQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU19QUkVfVE1QX0RJU0M6Ci0JCWNhc2UgU19SVU5OSU5HX0xFVkVMMjoKLQkJCWNtZC0+aG9zdF9zY3JpYmJsZSA9ICh1Y2hhciAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1E7Ci0JCQlob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1EgPSBjbWQ7Ci0JCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKLQkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfVU5DT05ORUNURUQ7Ci0KLSNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKLQkJCWhvc3RkYXRhLT5kaXNjX2RvbmVfY250W2NtZC0+ZGV2aWNlLT5pZF0rKzsKLSNlbmRpZgotCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50aygiKioqIFVuZXhwZWN0ZWQgRElTQ09OTkVDVCBpbnRlcnJ1cHQhICoqKiIpOwotCQkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKLQkJfQotCi0vKiBXZSBhcmUgbm8gbG9uZ2VyIGNvbm5lY3RlZCB0byBhIHRhcmdldCAtIGNoZWNrIHRvIHNlZSBpZgotICogdGhlcmUgYXJlIGNvbW1hbmRzIHdhaXRpbmcgdG8gYmUgZXhlY3V0ZWQuCi0gKi8KLQotCQlpbjIwMDBfZXhlY3V0ZShpbnN0YW5jZSk7Ci0JCWJyZWFrOwotCi0KLQljYXNlIENTUl9SRVNFTF9BTToKLQkJREIoREJfSU5UUiwgcHJpbnRrKCJSRVNFTCIpKQotCi0JCSAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGlzIHJlc2VsZWN0aW9uIGRpZG4ndCAqLwotCQkgICAgLyogaGFwcGVuIGR1cmluZyBBcmJpdHJhdGlvbi9TZWxlY3Rpb24gb2Ygc29tZSBvdGhlciBkZXZpY2UuICovCi0JCSAgICAvKiBJZiB5ZXMsIHB1dCBsb3NpbmcgY29tbWFuZCBiYWNrIG9uIHRvcCBvZiBpbnB1dF9RLiAqLwotCQkgICAgaWYgKGhvc3RkYXRhLT5sZXZlbDIgPD0gTDJfTk9ORSkgewotCi0JCQlpZiAoaG9zdGRhdGEtPnNlbGVjdGluZykgewotCQkJCWNtZCA9IChTY3NpX0NtbmQgKikgaG9zdGRhdGEtPnNlbGVjdGluZzsKLQkJCQlob3N0ZGF0YS0+c2VsZWN0aW5nID0gTlVMTDsKLQkJCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKLQkJCQljbWQtPmhvc3Rfc2NyaWJibGUgPSAodWNoYXIgKikgaG9zdGRhdGEtPmlucHV0X1E7Ci0JCQkJaG9zdGRhdGEtPmlucHV0X1EgPSBjbWQ7Ci0JCQl9Ci0JCX0KLQotCQllbHNlIHsKLQotCQkJaWYgKGNtZCkgewotCQkJCWlmIChwaHMgPT0gMHgwMCkgewotCQkJCQlob3N0ZGF0YS0+YnVzeVtjbWQtPmRldmljZS0+aWRdICY9IH4oMSA8PCBjbWQtPmRldmljZS0+bHVuKTsKLQkJCQkJY21kLT5ob3N0X3NjcmliYmxlID0gKHVjaGFyICopIGhvc3RkYXRhLT5pbnB1dF9ROwotCQkJCQlob3N0ZGF0YS0+aW5wdXRfUSA9IGNtZDsKLQkJCQl9IGVsc2UgewotCQkJCQlwcmludGsoIi0tLSUwMng6JTAyeDolMDJ4LVRST1VCTEU6IEludHJ1c2l2ZSBSZVNlbGVjdCEtLS0iLCBhc3IsIHNyLCBwaHMpOwotCQkJCQl3aGlsZSAoMSkKLQkJCQkJCXByaW50aygiXHIiKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCS8qIE9LIC0gZmluZCBvdXQgd2hpY2ggZGV2aWNlIHJlc2VsZWN0ZWQgdXMuICovCi0KLQkJaWQgPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX1NPVVJDRV9JRCk7Ci0JCWlkICY9IFNSQ0lEX01BU0s7Ci0KLQkJLyogYW5kIGV4dHJhY3QgdGhlIGx1biBmcm9tIHRoZSBJRCBtZXNzYWdlLiAoTm90ZSB0aGF0IHdlIGRvbid0Ci0JCSAqIGJvdGhlciB0byBjaGVjayBmb3IgYSB2YWxpZCBtZXNzYWdlIGhlcmUgLSBJIGd1ZXNzIHRoaXMgaXMKLQkJICogbm90IHRoZSByaWdodCB3YXkgdG8gZ28sIGJ1dC4uLi4pCi0JCSAqLwotCi0JCWx1biA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfREFUQSk7Ci0JCWlmIChob3N0ZGF0YS0+bGV2ZWwyIDwgTDJfUkVTRUxFQ1QpCi0JCQl3cml0ZV8zMzkzX2NtZChob3N0ZGF0YSwgV0RfQ01EX05FR0FURV9BQ0spOwotCQlsdW4gJj0gNzsKLQotCQkvKiBOb3cgd2UgbG9vayBmb3IgdGhlIGNvbW1hbmQgdGhhdCdzIHJlY29ubmVjdGluZy4gKi8KLQotCQljbWQgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUTsKLQkJcGF0Y2ggPSBOVUxMOwotCQl3aGlsZSAoY21kKSB7Ci0JCQlpZiAoaWQgPT0gY21kLT5kZXZpY2UtPmlkICYmIGx1biA9PSBjbWQtPmRldmljZS0+bHVuKQotCQkJCWJyZWFrOwotCQkJcGF0Y2ggPSBjbWQ7Ci0JCQljbWQgPSAoU2NzaV9DbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKLQkJfQotCi0JCS8qIEhtbS4gQ291bGRuJ3QgZmluZCBhIHZhbGlkIGNvbW1hbmQuLi4uIFdoYXQgdG8gZG8/ICovCi0KLQkJaWYgKCFjbWQpIHsKLQkJCXByaW50aygiLS0tVFJPVUJMRTogdGFyZ2V0ICVkLiVkIG5vdCBpbiBkaXNjb25uZWN0IHF1ZXVlLS0tIiwgaWQsIGx1bik7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIE9rLCBmb3VuZCB0aGUgY29tbWFuZCAtIG5vdyBzdGFydCBpdCB1cCBhZ2Fpbi4gKi8KLQotCQlpZiAocGF0Y2gpCi0JCQlwYXRjaC0+aG9zdF9zY3JpYmJsZSA9IGNtZC0+aG9zdF9zY3JpYmJsZTsKLQkJZWxzZQotCQkJaG9zdGRhdGEtPmRpc2Nvbm5lY3RlZF9RID0gKFNjc2lfQ21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7Ci0JCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBjbWQ7Ci0KLQkJLyogV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCAnaW5pdGlhbGl6ZV9TQ3AoKScgb3IgJ2hvc3RkYXRhLT5idXN5W10nCi0JCSAqIGJlY2F1c2UgdGhlc2UgdGhpbmdzIGFyZSBwcmVzZXJ2ZWQgb3ZlciBhIGRpc2Nvbm5lY3QuCi0JCSAqIEJ1dCB3ZSBETyBuZWVkIHRvIGZpeCB0aGUgRFBEIGJpdCBzbyBpdCdzIGNvcnJlY3QgZm9yIHRoaXMgY29tbWFuZC4KLQkJICovCi0KLQkJaWYgKGlzX2Rpcl9vdXQoY21kKSkKLQkJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0RFU1RJTkFUSU9OX0lELCBjbWQtPmRldmljZS0+aWQpOwotCQllbHNlCi0JCQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9ERVNUSU5BVElPTl9JRCwgY21kLT5kZXZpY2UtPmlkIHwgRFNUSURfRFBEKTsKLQkJaWYgKGhvc3RkYXRhLT5sZXZlbDIgPj0gTDJfUkVTRUxFQ1QpIHsKLQkJCXdyaXRlXzMzOTNfY291bnQoaG9zdGRhdGEsIDApOwkvKiB3ZSB3YW50IGEgREFUQV9QSEFTRSBpbnRlcnJ1cHQgKi8KLQkJCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NDUpOwotCQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9TRUxfQVROX1hGRVIpOwotCQkJaG9zdGRhdGEtPnN0YXRlID0gU19SVU5OSU5HX0xFVkVMMjsKLQkJfSBlbHNlCi0JCQlob3N0ZGF0YS0+c3RhdGUgPSBTX0NPTk5FQ1RFRDsKLQotCQkgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlwcmludGsoIi0tVU5LTk9XTiBJTlRFUlJVUFQ6JTAyeDolMDJ4OiUwMngtLSIsIGFzciwgc3IsIHBocyk7Ci0JfQotCi0Jd3JpdGUxX2lvKDAsIElPX0xFRF9PRkYpOwotCi0JREIoREJfSU5UUiwgcHJpbnRrKCJ9ICIpKQotCi0vKiByZWxlYXNlIHRoZSBTTVAgc3Bpbl9sb2NrIGFuZCByZXN0b3JlIGlycSBzdGF0ZSAqLwotCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLQotCi0jZGVmaW5lIFJFU0VUX0NBUkQgICAgICAgICAwCi0jZGVmaW5lIFJFU0VUX0NBUkRfQU5EX0JVUyAxCi0jZGVmaW5lIEJfRkxBRyAweDgwCi0KLS8qCi0gKglDYWxsZXIgbXVzdCBob2xkIGluc3RhbmNlIGxvY2shCi0gKi8KLQotc3RhdGljIGludCByZXNldF9oYXJkd2FyZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgaW50IHR5cGUpCi17Ci0Jc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7Ci0JaW50IHF0LCB4OwotCi0JaG9zdGRhdGEgPSAoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7Ci0KLQl3cml0ZTFfaW8oMCwgSU9fTEVEX09OKTsKLQlpZiAodHlwZSA9PSBSRVNFVF9DQVJEX0FORF9CVVMpIHsKLQkJd3JpdGUxX2lvKDAsIElPX0NBUkRfUkVTRVQpOwotCQl4ID0gcmVhZDFfaW8oSU9fSEFSRFdBUkUpOwotCX0KLQl4ID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9TQ1NJX1NUQVRVUyk7CS8qIGNsZWFyIGFueSBXRCBpbnRycHQgKi8KLQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9PV05fSUQsIGluc3RhbmNlLT50aGlzX2lkIHwgT1dOSURfRUFGIHwgT1dOSURfUkFGIHwgT1dOSURfRlNfOCk7Ci0Jd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfUE9MTEVEKTsKLQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9TWU5DSFJPTk9VU19UUkFOU0ZFUiwgY2FsY19zeW5jX3hmZXIoaG9zdGRhdGEtPmRlZmF1bHRfc3hfcGVyIC8gNCwgREVGQVVMVF9TWF9PRkYpKTsKLQotCXdyaXRlMV9pbygwLCBJT19GSUZPX1dSSVRFKTsJLyogY2xlYXIgZmlmbyBjb3VudGVyICovCi0Jd3JpdGUxX2lvKDAsIElPX0ZJRk9fUkVBRCk7CS8qIHN0YXJ0IGZpZm8gb3V0IGluIHJlYWQgbW9kZSAqLwotCXdyaXRlXzMzOTMoaG9zdGRhdGEsIFdEX0NPTU1BTkQsIFdEX0NNRF9SRVNFVCk7Ci0JLyogRklYTUU6IHRpbWVvdXQgPz8gKi8KLQl3aGlsZSAoIShSRUFEX0FVWF9TVEFUKCkgJiBBU1JfSU5UKSkKLQkJY3B1X3JlbGF4KCk7CS8qIHdhaXQgZm9yIFJFU0VUIHRvIGNvbXBsZXRlICovCi0KLQl4ID0gcmVhZF8zMzkzKGhvc3RkYXRhLCBXRF9TQ1NJX1NUQVRVUyk7CS8qIGNsZWFyIGludGVycnVwdCAqLwotCi0Jd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfUVVFVUVfVEFHLCAweGE1KTsJLyogYW55IHJhbmRvbSBudW1iZXIgKi8KLQlxdCA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfUVVFVUVfVEFHKTsKLQlpZiAocXQgPT0gMHhhNSkgewotCQl4IHw9IEJfRkxBRzsKLQkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfUVVFVUVfVEFHLCAwKTsKLQl9Ci0Jd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfVElNRU9VVF9QRVJJT0QsIFRJTUVPVVRfUEVSSU9EX1ZBTFVFKTsKLQl3cml0ZV8zMzkzKGhvc3RkYXRhLCBXRF9DT05UUk9MLCBDVFJMX0lESSB8IENUUkxfRURJIHwgQ1RSTF9QT0xMRUQpOwotCXdyaXRlMV9pbygwLCBJT19MRURfT0ZGKTsKLQlyZXR1cm4geDsKLX0KLQotCi0KLXN0YXRpYyBpbnQgaW4yMDAwX2J1c19yZXNldChTY3NpX0NtbmQgKiBjbWQpCi17Ci0Jc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7Ci0Jc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7Ci0JaW50IHg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWluc3RhbmNlID0gY21kLT5kZXZpY2UtPmhvc3Q7Ci0JaG9zdGRhdGEgPSAoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7Ci0KLQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQ6IFJlc2V0LiAiLCBpbnN0YW5jZS0+aG9zdF9ubyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7Ci0KLQkvKiBkbyBzY3NpLXJlc2V0IGhlcmUgKi8KLQlyZXNldF9oYXJkd2FyZShpbnN0YW5jZSwgUkVTRVRfQ0FSRF9BTkRfQlVTKTsKLQlmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7Ci0JCWhvc3RkYXRhLT5idXN5W3hdID0gMDsKLQkJaG9zdGRhdGEtPnN5bmNfeGZlclt4XSA9IGNhbGNfc3luY194ZmVyKERFRkFVTFRfU1hfUEVSIC8gNCwgREVGQVVMVF9TWF9PRkYpOwotCQlob3N0ZGF0YS0+c3luY19zdGF0W3hdID0gU1NfVU5TRVQ7CS8qIHVzaW5nIGRlZmF1bHQgc3luYyB2YWx1ZXMgKi8KLQl9Ci0JaG9zdGRhdGEtPmlucHV0X1EgPSBOVUxMOwotCWhvc3RkYXRhLT5zZWxlY3RpbmcgPSBOVUxMOwotCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOwotCWhvc3RkYXRhLT5kaXNjb25uZWN0ZWRfUSA9IE5VTEw7Ci0JaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKLQlob3N0ZGF0YS0+ZmlmbyA9IEZJX0ZJRk9fVU5VU0VEOwotCWhvc3RkYXRhLT5pbmNvbWluZ19wdHIgPSAwOwotCWhvc3RkYXRhLT5vdXRnb2luZ19sZW4gPSAwOwotCi0JY21kLT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBfX2luMjAwMF9hYm9ydChTY3NpX0NtbmQgKiBjbWQpCi17Ci0Jc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2U7Ci0Jc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaG9zdGRhdGE7Ci0JU2NzaV9DbW5kICp0bXAsICpwcmV2OwotCXVjaGFyIHNyLCBhc3I7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCi0JaW5zdGFuY2UgPSBjbWQtPmRldmljZS0+aG9zdDsKLQlob3N0ZGF0YSA9IChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKLQotCXByaW50ayhLRVJOX0RFQlVHICJzY3NpJWQ6IEFib3J0LSIsIGluc3RhbmNlLT5ob3N0X25vKTsKLQlwcmludGsoIihhc3I9JTAyeCxjb3VudD0lbGQscmVzaWQ9JWQsYnVmX3Jlc2lkPSVkLGhhdmVfZGF0YT0lZCxGQz0lMDJ4KS0gIiwgUkVBRF9BVVhfU1RBVCgpLCByZWFkXzMzOTNfY291bnQoaG9zdGRhdGEpLCBjbWQtPlNDcC50aGlzX3Jlc2lkdWFsLCBjbWQtPlNDcC5idWZmZXJzX3Jlc2lkdWFsLCBjbWQtPlNDcC5oYXZlX2RhdGFfaW4sIHJlYWQxX2lvKElPX0ZJRk9fQ09VTlQpKTsKLQotLyoKLSAqIENhc2UgMSA6IElmIHRoZSBjb21tYW5kIGhhc24ndCBiZWVuIGlzc3VlZCB5ZXQsIHdlIHNpbXBseSByZW1vdmUgaXQKLSAqICAgICBmcm9tIHRoZSBpbm91dF9RLgotICovCi0KLQl0bXAgPSAoU2NzaV9DbW5kICopIGhvc3RkYXRhLT5pbnB1dF9ROwotCXByZXYgPSBOVUxMOwotCXdoaWxlICh0bXApIHsKLQkJaWYgKHRtcCA9PSBjbWQpIHsKLQkJCWlmIChwcmV2KQotCQkJCXByZXYtPmhvc3Rfc2NyaWJibGUgPSBjbWQtPmhvc3Rfc2NyaWJibGU7Ci0JCQljbWQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOwotCQkJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQ6IEFib3J0IC0gcmVtb3ZpbmcgY29tbWFuZCBmcm9tIGlucHV0X1EuICIsIGluc3RhbmNlLT5ob3N0X25vKTsKLQkJCWNtZC0+c2NzaV9kb25lKGNtZCk7Ci0JCQlyZXR1cm4gU1VDQ0VTUzsKLQkJfQotCQlwcmV2ID0gdG1wOwotCQl0bXAgPSAoU2NzaV9DbW5kICopIHRtcC0+aG9zdF9zY3JpYmJsZTsKLQl9Ci0KLS8qCi0gKiBDYXNlIDIgOiBJZiB0aGUgY29tbWFuZCBpcyBjb25uZWN0ZWQsIHdlJ3JlIGdvaW5nIHRvIGZhaWwgdGhlIGFib3J0Ci0gKiAgICAgYW5kIGxldCB0aGUgaGlnaCBsZXZlbCBTQ1NJIGRyaXZlciByZXRyeSBhdCBhIGxhdGVyIHRpbWUgb3IKLSAqICAgICBpc3N1ZSBhIHJlc2V0LgotICoKLSAqICAgICBUaW1lb3V0cywgYW5kIHRoZXJlZm9yZSBhYm9ydGVkIGNvbW1hbmRzLCB3aWxsIGJlIGhpZ2hseSB1bmxpa2VseQotICogICAgIGFuZCBoYW5kbGluZyB0aGVtIGNsZWFubHkgaW4gdGhpcyBzaXR1YXRpb24gd291bGQgbWFrZSB0aGUgY29tbW9uCi0gKiAgICAgY2FzZSBvZiBub3Jlc2V0cyBsZXNzIGVmZmljaWVudCwgYW5kIHdvdWxkIHBvbGx1dGUgb3VyIGNvZGUuICBTbywKLSAqICAgICB3ZSBmYWlsLgotICovCi0KLQlpZiAoaG9zdGRhdGEtPmNvbm5lY3RlZCA9PSBjbWQpIHsKLQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpJWQ6IEFib3J0aW5nIGNvbm5lY3RlZCBjb21tYW5kIC0gIiwgaW5zdGFuY2UtPmhvc3Rfbm8pOwotCi0JCXByaW50aygic2VuZGluZyB3ZDMzYzkzIEFCT1JUIGNvbW1hbmQgLSAiKTsKLQkJd3JpdGVfMzM5Myhob3N0ZGF0YSwgV0RfQ09OVFJPTCwgQ1RSTF9JREkgfCBDVFJMX0VESSB8IENUUkxfUE9MTEVEKTsKLQkJd3JpdGVfMzM5M19jbWQoaG9zdGRhdGEsIFdEX0NNRF9BQk9SVCk7Ci0KLS8qIE5vdyB3ZSBoYXZlIHRvIGF0dGVtcHQgdG8gZmx1c2ggb3V0IHRoZSBGSUZPLi4uICovCi0KLQkJcHJpbnRrKCJmbHVzaGluZyBmaWZvIC0gIik7Ci0JCXRpbWVvdXQgPSAxMDAwMDAwOwotCQlkbyB7Ci0JCQlhc3IgPSBSRUFEX0FVWF9TVEFUKCk7Ci0JCQlpZiAoYXNyICYgQVNSX0RCUikKLQkJCQlyZWFkXzMzOTMoaG9zdGRhdGEsIFdEX0RBVEEpOwotCQl9IHdoaWxlICghKGFzciAmIEFTUl9JTlQpICYmIHRpbWVvdXQtLSA+IDApOwotCQlzciA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfU0NTSV9TVEFUVVMpOwotCQlwcmludGsoImFzcj0lMDJ4LCBzcj0lMDJ4LCAlbGQgYnl0ZXMgdW4tdHJhbnNmZXJyZWQgKHRpbWVvdXQ9JWxkKSAtICIsIGFzciwgc3IsIHJlYWRfMzM5M19jb3VudChob3N0ZGF0YSksIHRpbWVvdXQpOwotCi0JCS8qCi0JCSAqIEFib3J0IGNvbW1hbmQgcHJvY2Vzc2VkLgotCQkgKiBTdGlsbCBjb25uZWN0ZWQuCi0JCSAqIFdlIG11c3QgZGlzY29ubmVjdC4KLQkJICovCi0KLQkJcHJpbnRrKCJzZW5kaW5nIHdkMzNjOTMgRElTQ09OTkVDVCBjb21tYW5kIC0gIik7Ci0JCXdyaXRlXzMzOTNfY21kKGhvc3RkYXRhLCBXRF9DTURfRElTQ09OTkVDVCk7Ci0KLQkJdGltZW91dCA9IDEwMDAwMDA7Ci0JCWFzciA9IFJFQURfQVVYX1NUQVQoKTsKLQkJd2hpbGUgKChhc3IgJiBBU1JfQ0lQKSAmJiB0aW1lb3V0LS0gPiAwKQotCQkJYXNyID0gUkVBRF9BVVhfU1RBVCgpOwotCQlzciA9IHJlYWRfMzM5Myhob3N0ZGF0YSwgV0RfU0NTSV9TVEFUVVMpOwotCQlwcmludGsoImFzcj0lMDJ4LCBzcj0lMDJ4LiIsIGFzciwgc3IpOwotCi0JCWhvc3RkYXRhLT5idXN5W2NtZC0+ZGV2aWNlLT5pZF0gJj0gfigxIDw8IGNtZC0+ZGV2aWNlLT5sdW4pOwotCQlob3N0ZGF0YS0+Y29ubmVjdGVkID0gTlVMTDsKLQkJaG9zdGRhdGEtPnN0YXRlID0gU19VTkNPTk5FQ1RFRDsKLQkJY21kLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7Ci0JCWNtZC0+c2NzaV9kb25lKGNtZCk7Ci0KLQkJaW4yMDAwX2V4ZWN1dGUoaW5zdGFuY2UpOwotCi0JCXJldHVybiBTVUNDRVNTOwotCX0KLQotLyoKLSAqIENhc2UgMzogSWYgdGhlIGNvbW1hbmQgaXMgY3VycmVudGx5IGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBidXMsCi0gKiB3ZSdyZSBub3QgZ29pbmcgdG8gZXhwZW5kIG11Y2ggZWZmb3J0IGhlcmU6IExldCdzIGp1c3QgcmV0dXJuCi0gKiBhbiBBQk9SVF9TTk9PWkUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0Li4uCi0gKi8KLQotCWZvciAodG1wID0gKFNjc2lfQ21uZCAqKSBob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1E7IHRtcDsgdG1wID0gKFNjc2lfQ21uZCAqKSB0bXAtPmhvc3Rfc2NyaWJibGUpCi0JCWlmIChjbWQgPT0gdG1wKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAic2NzaSVkOiB1bmFibGUgdG8gYWJvcnQgZGlzY29ubmVjdGVkIGNvbW1hbmQuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7Ci0JCQlyZXR1cm4gRkFJTEVEOwotCQl9Ci0KLS8qCi0gKiBDYXNlIDQgOiBJZiB3ZSByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZSBjb21tYW5kIHdhcyBub3QgZm91bmQgaW4gYW55IG9mCi0gKiAgICAgdGhlIHF1ZXVlcy4KLSAqCi0gKiBXZSBwcm9iYWJseSByZWFjaGVkIHRoaXMgcG9pbnQgYmVjYXVzZSBvZiBhbiB1bmxpa2VseSByYWNlIGNvbmRpdGlvbgotICogYmV0d2VlbiB0aGUgY29tbWFuZCBjb21wbGV0aW5nIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGFib3J0aW9uIGNvZGUsCi0gKiBzbyB3ZSB3b24ndCBwYW5pYywgYnV0IHdlIHdpbGwgbm90aWZ5IHRoZSB1c2VyIGluIGNhc2Ugc29tZXRoaW5nIHJlYWxseQotICogYnJva2UuCi0gKi8KLQotCWluMjAwMF9leGVjdXRlKGluc3RhbmNlKTsKLQotCXByaW50aygic2NzaSVkOiB3YXJuaW5nIDogU0NTSSBjb21tYW5kIHByb2JhYmx5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiICIgICAgICAgICBiZWZvcmUgYWJvcnRpb24uICIsIGluc3RhbmNlLT5ob3N0X25vKTsKLQlyZXR1cm4gU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCBpbjIwMDBfYWJvcnQoU2NzaV9DbW5kICogY21kKQotewotCWludCByYzsKLQotCXNwaW5fbG9ja19pcnEoY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jayk7Ci0JcmMgPSBfX2luMjAwMF9hYm9ydChjbWQpOwotCXNwaW5fdW5sb2NrX2lycShjbWQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotCi0jZGVmaW5lIE1BWF9JTjIwMDBfSE9TVFMgMwotI2RlZmluZSBNQVhfU0VUVVBfQVJHUyBBUlJBWV9TSVpFKHNldHVwX2FyZ3MpCi0jZGVmaW5lIFNFVFVQX0JVRkZFUl9TSVpFIDIwMAotc3RhdGljIGNoYXIgc2V0dXBfYnVmZmVyW1NFVFVQX0JVRkZFUl9TSVpFXTsKLXN0YXRpYyBjaGFyIHNldHVwX3VzZWRbTUFYX1NFVFVQX0FSR1NdOwotc3RhdGljIGludCBkb25lX3NldHVwID0gMDsKLQotc3RhdGljIHZvaWQgX19pbml0IGluMjAwMF9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKLXsKLQlpbnQgaTsKLQljaGFyICpwMSwgKnAyOwotCi0Jc3RybGNweShzZXR1cF9idWZmZXIsIHN0ciwgU0VUVVBfQlVGRkVSX1NJWkUpOwotCXAxID0gc2V0dXBfYnVmZmVyOwotCWkgPSAwOwotCXdoaWxlICgqcDEgJiYgKGkgPCBNQVhfU0VUVVBfQVJHUykpIHsKLQkJcDIgPSBzdHJjaHIocDEsICcsJyk7Ci0JCWlmIChwMikgewotCQkJKnAyID0gJ1wwJzsKLQkJCWlmIChwMSAhPSBwMikKLQkJCQlzZXR1cF9hcmdzW2ldID0gcDE7Ci0JCQlwMSA9IHAyICsgMTsKLQkJCWkrKzsKLQkJfSBlbHNlIHsKLQkJCXNldHVwX2FyZ3NbaV0gPSBwMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBNQVhfU0VUVVBfQVJHUzsgaSsrKQotCQlzZXR1cF91c2VkW2ldID0gMDsKLQlkb25lX3NldHVwID0gMTsKLX0KLQotCi0vKiBjaGVja19zZXR1cF9hcmdzKCkgcmV0dXJucyBpbmRleCBpZiBrZXkgZm91bmQsIDAgaWYgbm90Ci0gKi8KLQotc3RhdGljIGludCBfX2luaXQgY2hlY2tfc2V0dXBfYXJncyhjaGFyICprZXksIGludCAqdmFsLCBjaGFyICpidWYpCi17Ci0JaW50IHg7Ci0JY2hhciAqY3A7Ci0KLQlmb3IgKHggPSAwOyB4IDwgTUFYX1NFVFVQX0FSR1M7IHgrKykgewotCQlpZiAoc2V0dXBfdXNlZFt4XSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoIXN0cm5jbXAoc2V0dXBfYXJnc1t4XSwga2V5LCBzdHJsZW4oa2V5KSkpCi0JCQlicmVhazsKLQl9Ci0JaWYgKHggPT0gTUFYX1NFVFVQX0FSR1MpCi0JCXJldHVybiAwOwotCXNldHVwX3VzZWRbeF0gPSAxOwotCWNwID0gc2V0dXBfYXJnc1t4XSArIHN0cmxlbihrZXkpOwotCSp2YWwgPSAtMTsKLQlpZiAoKmNwICE9ICc6JykKLQkJcmV0dXJuICsreDsKLQljcCsrOwotCWlmICgoKmNwID49ICcwJykgJiYgKCpjcCA8PSAnOScpKSB7Ci0JCSp2YWwgPSBzaW1wbGVfc3RydG91bChjcCwgTlVMTCwgMCk7Ci0JfQotCXJldHVybiArK3g7Ci19Ci0KLQotCi0vKiBUaGUgImNvcnJlY3QiIChpZSBwb3J0YWJsZSkgd2F5IHRvIGFjY2VzcyBtZW1vcnktbWFwcGVkIGhhcmR3YXJlCi0gKiBzdWNoIGFzIHRoZSBJTjIwMDAgRVBST00gYW5kIGRpcCBzd2l0Y2ggaXMgdGhyb3VnaCB0aGUgdXNlIG9mCi0gKiBzcGVjaWFsIG1hY3JvcyBkZWNsYXJlZCBpbiAnYXNtL2lvLmgnLiBXZSB1c2UgcmVhZGIoKSBhbmQgcmVhZGwoKQotICogd2hlbiByZWFkaW5nIGZyb20gdGhlIGNhcmQncyBCSU9TIGFyZWEgaW4gaW4yMDAwX2RldGVjdCgpLgotICovCi1zdGF0aWMgdTMyIGJpb3NfdGFiW10gaW4yMDAwX19JTklUREFUQSA9IHsKLQkweGM4MDAwLAotCTB4ZDAwMDAsCi0JMHhkODAwMCwKLQkwCi19OwotCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgYmFzZV90YWJbXSBpbjIwMDBfX0lOSVREQVRBID0gewotCTB4MjIwLAotCTB4MjAwLAotCTB4MTEwLAotCTB4MTAwLAotfTsKLQotc3RhdGljIGludCBpbnRfdGFiW10gaW4yMDAwX19JTklUREFUQSA9IHsKLQkxNSwKLQkxNCwKLQkxMSwKLQkxMAotfTsKLQotc3RhdGljIGludCBwcm9iZV9iaW9zKHUzMiBhZGRyLCB1MzIgKnMxLCB1Y2hhciAqc3dpdGNoZXMpCi17Ci0Jdm9pZCBfX2lvbWVtICpwID0gaW9yZW1hcChhZGRyLCAweDM0KTsKLQlpZiAoIXApCi0JCXJldHVybiAwOwotCSpzMSA9IHJlYWRsKHAgKyAweDEwKTsKLQlpZiAoKnMxID09IDB4NDE1NjRmNGUgfHwgcmVhZGwocCArIDB4MzApID09IDB4NjE3NzZjNDEpIHsKLQkJLyogUmVhZCB0aGUgc3dpdGNoIGltYWdlIHRoYXQncyBtYXBwZWQgaW50byBFUFJPTSBzcGFjZSAqLwotCQkqc3dpdGNoZXMgPSB+cmVhZGIocCArIDB4MjApOwotCQlpb3VubWFwKHApOwotCQlyZXR1cm4gMTsKLQl9Ci0JaW91bm1hcChwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgaW4yMDAwX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKLXsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKLQlzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICpob3N0ZGF0YTsKLQlpbnQgZGV0ZWN0X2NvdW50OwotCWludCBiaW9zOwotCWludCB4OwotCXVuc2lnbmVkIHNob3J0IGJhc2U7Ci0JdWNoYXIgc3dpdGNoZXM7Ci0JdWNoYXIgaHJldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB2YWw7Ci0JY2hhciBidWZbMzJdOwotCi0vKiBUaGFua3MgdG8gaGVscCBmcm9tIEJpbGwgRWFybmVzdCwgcHJvYmluZyBmb3IgSU4yMDAwIGNhcmRzIGlzIGEKLSAqIHByZXR0eSBzdHJhaWdodGZvcndhcmQgYW5kIGZvb2wtcHJvb2Ygb3BlcmF0aW9uLiBUaGVyZSBhcmUgMwotICogcG9zc2libGUgbG9jYXRpb25zIGZvciB0aGUgSU4yMDAwIEVQUk9NIGluIG1lbW9yeSBzcGFjZSAtIGlmIHdlCi0gKiBmaW5kIGEgQklPUyBzaWduYXR1cmUsIHdlIGNhbiByZWFkIHRoZSBkaXAgc3dpdGNoIHNldHRpbmdzIGZyb20KLSAqIHRoZSBieXRlIGF0IEJJT1MrMzIgKHNoYWRvd2VkIGluIGJ5IGxvZ2ljIG9uIHRoZSBjYXJkKS4gRnJvbSAyCi0gKiBvZiB0aGUgc3dpdGNoIGJpdHMgd2UgZ2V0IHRoZSBjYXJkJ3MgYWRkcmVzcyBpbiBJTyBzcGFjZS4gVGhlcmUncwotICogYW4gaW1hZ2Ugb2YgdGhlIGRpcCBzd2l0Y2ggdGhlcmUsIGFsc28sIHNvIHdlIGhhdmUgYSB3YXkgdG8gYmFjay0KLSAqIGNoZWNrIHRoYXQgdGhpcyByZWFsbHkgaXMgYW4gSU4yMDAwIGNhcmQuIFZlcnkgbmlmdHkuIFVzZSB0aGUKLSAqICdpb3BvcnQ6eHgnIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXIgaWYgeW91ciBCSU9TIEVQUk9NIGlzIGFic2VudAotICogb3IgZGlzYWJsZWQuCi0gKi8KLQotCWlmICghZG9uZV9zZXR1cCAmJiBzZXR1cF9zdHJpbmdzKQotCQlpbjIwMDBfc2V0dXAoc2V0dXBfc3RyaW5ncywgTlVMTCk7Ci0KLQlkZXRlY3RfY291bnQgPSAwOwotCWZvciAoYmlvcyA9IDA7IGJpb3NfdGFiW2Jpb3NdOyBiaW9zKyspIHsKLQkJdTMyIHMxID0gMDsKLQkJaWYgKGNoZWNrX3NldHVwX2FyZ3MoImlvcG9ydCIsICZ2YWwsIGJ1ZikpIHsKLQkJCWJhc2UgPSB2YWw7Ci0JCQlzd2l0Y2hlcyA9IH5pbmIoYmFzZSArIElPX1NXSVRDSEVTKSAmIDB4ZmY7Ci0JCQlwcmludGsoIkZvcmNpbmcgSU4yMDAwIGRldGVjdGlvbiBhdCBJT3BvcnQgMHgleCAiLCBiYXNlKTsKLQkJCWJpb3MgPSAyOwotCQl9Ci0vKgotICogVGhlcmUgaGF2ZSBiZWVuIGEgY291cGxlIG9mIEJJT1MgdmVyc2lvbnMgd2l0aCBkaWZmZXJlbnQgbGF5b3V0cwotICogZm9yIHRoZSBvYnZpb3VzIElEIHN0cmluZ3MuIFdlIGxvb2sgZm9yIHRoZSAyIG1vc3QgY29tbW9uIG9uZXMgYW5kCi0gKiBob3BlIHRoYXQgdGhleSBjb3ZlciBhbGwgdGhlIGNhc2VzLi4uCi0gKi8KLQkJZWxzZSBpZiAocHJvYmVfYmlvcyhiaW9zX3RhYltiaW9zXSwgJnMxLCAmc3dpdGNoZXMpKSB7Ci0JCQlwcmludGsoIkZvdW5kIElOMjAwMCBCSU9TIGF0IDB4JXggIiwgKHVuc2lnbmVkIGludCkgYmlvc190YWJbYmlvc10pOwotCi0vKiBGaW5kIG91dCB3aGVyZSB0aGUgSU8gc3BhY2UgaXMgKi8KLQotCQkJeCA9IHN3aXRjaGVzICYgKFNXX0FERFIwIHwgU1dfQUREUjEpOwotCQkJYmFzZSA9IGJhc2VfdGFiW3hdOwotCi0vKiBDaGVjayBmb3IgdGhlIElOMjAwMCBzaWduYXR1cmUgaW4gSU8gc3BhY2UuICovCi0KLQkJCXggPSB+aW5iKGJhc2UgKyBJT19TV0lUQ0hFUykgJiAweGZmOwotCQkJaWYgKHggIT0gc3dpdGNoZXMpIHsKLQkJCQlwcmludGsoIkJhZCBJTyBzaWduYXR1cmU6ICUwMnggdnMgJTAyeC5cbiIsIHgsIHN3aXRjaGVzKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfSBlbHNlCi0JCQljb250aW51ZTsKLQotLyogT0suIFdlIGhhdmUgYSBiYXNlIGFkZHJlc3MgZm9yIHRoZSBJTyBwb3J0cyAtIHJ1biBhIGZldyBzYWZldHkgY2hlY2tzICovCi0KLQkJaWYgKCEoc3dpdGNoZXMgJiBTV19CSVQ3KSkgewkvKiBJIF90aGlua18gYWxsIGNhcmRzIGRvIHRoaXMgKi8KLQkJCXByaW50aygiVGhlcmUgaXMgbm8gSU4tMjAwMCBTQ1NJIGNhcmQgYXQgSU9wb3J0IDB4JTAzeCFcbiIsIGJhc2UpOwotCQkJY29udGludWU7Ci0JCX0KLQotLyogTGV0J3MgYXNzdW1lIGFueSBoYXJkd2FyZSB2ZXJzaW9uIHdpbGwgd29yaywgYWx0aG91Z2ggdGhlIGRyaXZlcgotICogaGFzIG9ubHkgYmVlbiB0ZXN0ZWQgb24gMHgyMSwgMHgyMiwgMHgyNSwgMHgyNiwgYW5kIDB4MjcuIFdlJ2xsCi0gKiBwcmludCBvdXQgdGhlIHJldiBudW1iZXIgZm9yIHJlZmVyZW5jZSBsYXRlciwgYnV0IGFjY2VwdCB0aGVtIGFsbC4KLSAqLwotCi0JCWhyZXYgPSBpbmIoYmFzZSArIElPX0hBUkRXQVJFKTsKLQotCQkvKiBCaXQgMiB0ZWxscyB1cyBpZiBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAqLwotCQlpZiAoc3dpdGNoZXMgJiBTV19ESVNJTlQpIHsKLQkJCXByaW50aygiVGhlIElOLTIwMDAgU0NTSSBjYXJkIGF0IElPcG9ydCAweCUwM3ggIiwgYmFzZSk7Ci0JCQlwcmludGsoImlzIG5vdCBjb25maWd1cmVkIGZvciBpbnRlcnJ1cHQgb3BlcmF0aW9uIVxuIik7Ci0JCQlwcmludGsoIlRoaXMgZHJpdmVyIHJlcXVpcmVzIGFuIGludGVycnVwdDogY2FuY2VsbGluZyBkZXRlY3Rpb24uXG4iKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLS8qIE9rLiBXZSBhY2NlcHQgdGhhdCB0aGVyZSdzIGFuIElOMjAwMCBhdCBpb2FkZHIgJ2Jhc2UnLiBOb3cKLSAqIGluaXRpYWxpemUgaXQuCi0gKi8KLQotCQl0cG50LT5wcm9jX25hbWUgPSAiaW4yMDAwIjsKLQkJaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhKSk7Ci0JCWlmIChpbnN0YW5jZSA9PSBOVUxMKQotCQkJY29udGludWU7Ci0JCWRldGVjdF9jb3VudCsrOwotCQlob3N0ZGF0YSA9IChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKLQkJaW5zdGFuY2UtPmlvX3BvcnQgPSBob3N0ZGF0YS0+aW9fYmFzZSA9IGJhc2U7Ci0JCWhvc3RkYXRhLT5kaXBfc3dpdGNoID0gc3dpdGNoZXM7Ci0JCWhvc3RkYXRhLT5ocmV2ID0gaHJldjsKLQotCQl3cml0ZTFfaW8oMCwgSU9fRklGT19XUklURSk7CS8qIGNsZWFyIGZpZm8gY291bnRlciAqLwotCQl3cml0ZTFfaW8oMCwgSU9fRklGT19SRUFEKTsJLyogc3RhcnQgZmlmbyBvdXQgaW4gcmVhZCBtb2RlICovCi0JCXdyaXRlMV9pbygwLCBJT19JTlRSX01BU0spOwkvKiBhbGxvdyBhbGwgaW50cyAqLwotCQl4ID0gaW50X3RhYlsoc3dpdGNoZXMgJiAoU1dfSU5UMCB8IFNXX0lOVDEpKSA+PiBTV19JTlRfU0hJRlRdOwotCQlpZiAocmVxdWVzdF9pcnEoeCwgaW4yMDAwX2ludHIsIDAsICJpbjIwMDAiLCBpbnN0YW5jZSkpIHsKLQkJCXByaW50aygiaW4yMDAwX2RldGVjdDogVW5hYmxlIHRvIGFsbG9jYXRlIElSUS5cbiIpOwotCQkJZGV0ZWN0X2NvdW50LS07Ci0JCQljb250aW51ZTsKLQkJfQotCQlpbnN0YW5jZS0+aXJxID0geDsKLQkJaW5zdGFuY2UtPm5faW9fcG9ydCA9IDEzOwotCQlyZXF1ZXN0X3JlZ2lvbihiYXNlLCAxMywgImluMjAwMCIpOwkvKiBsb2NrIGluIHRoaXMgSU8gc3BhY2UgZm9yIG91ciB1c2UgKi8KLQotCQlmb3IgKHggPSAwOyB4IDwgODsgeCsrKSB7Ci0JCQlob3N0ZGF0YS0+YnVzeVt4XSA9IDA7Ci0JCQlob3N0ZGF0YS0+c3luY194ZmVyW3hdID0gY2FsY19zeW5jX3hmZXIoREVGQVVMVF9TWF9QRVIgLyA0LCBERUZBVUxUX1NYX09GRik7Ci0JCQlob3N0ZGF0YS0+c3luY19zdGF0W3hdID0gU1NfVU5TRVQ7CS8qIHVzaW5nIGRlZmF1bHQgc3luYyB2YWx1ZXMgKi8KLSNpZmRlZiBQUk9DX1NUQVRJU1RJQ1MKLQkJCWhvc3RkYXRhLT5jbWRfY250W3hdID0gMDsKLQkJCWhvc3RkYXRhLT5kaXNjX2FsbG93ZWRfY250W3hdID0gMDsKLQkJCWhvc3RkYXRhLT5kaXNjX2RvbmVfY250W3hdID0gMDsKLSNlbmRpZgotCQl9Ci0JCWhvc3RkYXRhLT5pbnB1dF9RID0gTlVMTDsKLQkJaG9zdGRhdGEtPnNlbGVjdGluZyA9IE5VTEw7Ci0JCWhvc3RkYXRhLT5jb25uZWN0ZWQgPSBOVUxMOwotCQlob3N0ZGF0YS0+ZGlzY29ubmVjdGVkX1EgPSBOVUxMOwotCQlob3N0ZGF0YS0+c3RhdGUgPSBTX1VOQ09OTkVDVEVEOwotCQlob3N0ZGF0YS0+ZmlmbyA9IEZJX0ZJRk9fVU5VU0VEOwotCQlob3N0ZGF0YS0+bGV2ZWwyID0gTDJfQkFTSUM7Ci0JCWhvc3RkYXRhLT5kaXNjb25uZWN0ID0gRElTX0FEQVBUSVZFOwotCQlob3N0ZGF0YS0+YXJncyA9IERFQlVHX0RFRkFVTFRTOwotCQlob3N0ZGF0YS0+aW5jb21pbmdfcHRyID0gMDsKLQkJaG9zdGRhdGEtPm91dGdvaW5nX2xlbiA9IDA7Ci0JCWhvc3RkYXRhLT5kZWZhdWx0X3N4X3BlciA9IERFRkFVTFRfU1hfUEVSOwotCi0vKiBPbGRlciBCSU9TJ3MgaGFkIGEgJ3N5bmMgb24vb2ZmJyBzd2l0Y2ggLSB1c2UgaXRzIHNldHRpbmcgKi8KLQotCQlpZiAoczEgPT0gMHg0MTU2NGY0ZSAmJiAoc3dpdGNoZXMgJiBTV19TWU5DX0RPUzUpKQotCQkJaG9zdGRhdGEtPnN5bmNfb2ZmID0gMHgwMDsJLyogc3luYyBkZWZhdWx0cyB0byBvbiAqLwotCQllbHNlCi0JCQlob3N0ZGF0YS0+c3luY19vZmYgPSAweGZmOwkvKiBzeW5jIGRlZmF1bHRzIHRvIG9mZiAqLwotCi0jaWZkZWYgUFJPQ19JTlRFUkZBQ0UKLQkJaG9zdGRhdGEtPnByb2MgPSBQUl9WRVJTSU9OIHwgUFJfSU5GTyB8IFBSX1NUQVRJU1RJQ1MgfCBQUl9DT05ORUNURUQgfCBQUl9JTlBVVFEgfCBQUl9ESVNDUSB8IFBSX1NUT1A7Ci0jaWZkZWYgUFJPQ19TVEFUSVNUSUNTCi0JCWhvc3RkYXRhLT5pbnRfY250ID0gMDsKLSNlbmRpZgotI2VuZGlmCi0KLQkJaWYgKGNoZWNrX3NldHVwX2FyZ3MoIm5vc3luYyIsICZ2YWwsIGJ1ZikpCi0JCQlob3N0ZGF0YS0+c3luY19vZmYgPSB2YWw7Ci0KLQkJaWYgKGNoZWNrX3NldHVwX2FyZ3MoInBlcmlvZCIsICZ2YWwsIGJ1ZikpCi0JCQlob3N0ZGF0YS0+ZGVmYXVsdF9zeF9wZXIgPSBzeF90YWJsZVtyb3VuZF9wZXJpb2QoKHVuc2lnbmVkIGludCkgdmFsKV0ucGVyaW9kX25zOwotCi0JCWlmIChjaGVja19zZXR1cF9hcmdzKCJkaXNjb25uZWN0IiwgJnZhbCwgYnVmKSkgewotCQkJaWYgKCh2YWwgPj0gRElTX05FVkVSKSAmJiAodmFsIDw9IERJU19BTFdBWVMpKQotCQkJCWhvc3RkYXRhLT5kaXNjb25uZWN0ID0gdmFsOwotCQkJZWxzZQotCQkJCWhvc3RkYXRhLT5kaXNjb25uZWN0ID0gRElTX0FEQVBUSVZFOwotCQl9Ci0KLQkJaWYgKGNoZWNrX3NldHVwX2FyZ3MoIm5vcmVzZXQiLCAmdmFsLCBidWYpKQotCQkJaG9zdGRhdGEtPmFyZ3MgXj0gQV9OT19TQ1NJX1JFU0VUOwotCi0JCWlmIChjaGVja19zZXR1cF9hcmdzKCJsZXZlbDIiLCAmdmFsLCBidWYpKQotCQkJaG9zdGRhdGEtPmxldmVsMiA9IHZhbDsKLQotCQlpZiAoY2hlY2tfc2V0dXBfYXJncygiZGVidWciLCAmdmFsLCBidWYpKQotCQkJaG9zdGRhdGEtPmFyZ3MgPSAodmFsICYgREJfTUFTSyk7Ci0KLSNpZmRlZiBQUk9DX0lOVEVSRkFDRQotCQlpZiAoY2hlY2tfc2V0dXBfYXJncygicHJvYyIsICZ2YWwsIGJ1ZikpCi0JCQlob3N0ZGF0YS0+cHJvYyA9IHZhbDsKLSNlbmRpZgotCi0KLQkJLyogRklYTUU6IG5vdCBzdHJpY3RseSBuZWVkZWQgSSB0aGluayBidXQgdGhlIGNhbGxlZCBjb2RlIGV4cGVjdHMKLQkJICAgdG8gYmUgbG9ja2VkICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKLQkJeCA9IHJlc2V0X2hhcmR3YXJlKGluc3RhbmNlLCAoaG9zdGRhdGEtPmFyZ3MgJiBBX05PX1NDU0lfUkVTRVQpID8gUkVTRVRfQ0FSRCA6IFJFU0VUX0NBUkRfQU5EX0JVUyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW5zdGFuY2UtPmhvc3RfbG9jaywgZmxhZ3MpOwotCi0JCWhvc3RkYXRhLT5taWNyb2NvZGUgPSByZWFkXzMzOTMoaG9zdGRhdGEsIFdEX0NEQl8xKTsKLQkJaWYgKHggJiAweDAxKSB7Ci0JCQlpZiAoeCAmIEJfRkxBRykKLQkJCQlob3N0ZGF0YS0+Y2hpcCA9IENfV0QzM0M5M0I7Ci0JCQllbHNlCi0JCQkJaG9zdGRhdGEtPmNoaXAgPSBDX1dEMzNDOTNBOwotCQl9IGVsc2UKLQkJCWhvc3RkYXRhLT5jaGlwID0gQ19XRDMzQzkzOwotCi0JCXByaW50aygiZGlwX3N3aXRjaD0lMDJ4IGlycT0lZCBpb3BvcnQ9JTAyeCBmbG9wcHk9JXMgc3luYy9ET1M1PSVzICIsIChzd2l0Y2hlcyAmIDB4N2YpLCBpbnN0YW5jZS0+aXJxLCBob3N0ZGF0YS0+aW9fYmFzZSwgKHN3aXRjaGVzICYgU1dfRkxPUFBZKSA/ICJZZXMiIDogIk5vIiwgKHN3aXRjaGVzICYgU1dfU1lOQ19ET1M1KSA/ICJZZXMiIDogIk5vIik7Ci0JCXByaW50aygiaGFyZHdhcmVfdmVyPSUwMnggY2hpcD0lcyBtaWNyb2NvZGU9JTAyeFxuIiwgaHJldiwgKGhvc3RkYXRhLT5jaGlwID09IENfV0QzM0M5MykgPyAiV0QzM2M5MyIgOiAoaG9zdGRhdGEtPmNoaXAgPT0gQ19XRDMzQzkzQSkgPyAiV0QzM2M5M0EiIDogKGhvc3RkYXRhLT5jaGlwID09IENfV0QzM0M5M0IpID8gIldEMzNjOTNCIiA6ICJ1bmtub3duIiwgaG9zdGRhdGEtPm1pY3JvY29kZSk7Ci0jaWZkZWYgREVCVUdHSU5HX09OCi0JCXByaW50aygic2V0dXBfYXJncyA9ICIpOwotCQlmb3IgKHggPSAwOyB4IDwgTUFYX1NFVFVQX0FSR1M7IHgrKykKLQkJCXByaW50aygiJXMsIiwgc2V0dXBfYXJnc1t4XSk7Ci0JCXByaW50aygiXG4iKTsKLSNlbmRpZgotCQlpZiAoaG9zdGRhdGEtPnN5bmNfb2ZmID09IDB4ZmYpCi0JCQlwcmludGsoIlN5bmMtdHJhbnNmZXIgRElTQUJMRUQgb24gYWxsIGRldmljZXM6IEVOQUJMRSBmcm9tIGNvbW1hbmQtbGluZVxuIik7Ci0JCXByaW50aygiSU4yMDAwIGRyaXZlciB2ZXJzaW9uICVzIC0gJXNcbiIsIElOMjAwMF9WRVJTSU9OLCBJTjIwMDBfREFURSk7Ci0JfQotCi0JcmV0dXJuIGRldGVjdF9jb3VudDsKLX0KLQotc3RhdGljIGludCBpbjIwMDBfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKLXsKLQlpZiAoc2hvc3QtPmlycSkKLQkJZnJlZV9pcnEoc2hvc3QtPmlycSwgc2hvc3QpOwotCWlmIChzaG9zdC0+aW9fcG9ydCAmJiBzaG9zdC0+bl9pb19wb3J0KQotCQlyZWxlYXNlX3JlZ2lvbihzaG9zdC0+aW9fcG9ydCwgc2hvc3QtPm5faW9fcG9ydCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIE5PVEU6IEkgbGlmdGVkIHRoaXMgZnVuY3Rpb24gc3RyYWlnaHQgb3V0IG9mIHRoZSBvbGQgZHJpdmVyLAotICogICAgICAgYW5kIGhhdmUgbm90IHRlc3RlZCBpdC4gUHJlc3VtYWJseSBpdCBkb2VzIHdoYXQgaXQncwotICogICAgICAgc3VwcG9zZWQgdG8gZG8uLi4KLSAqLwotCi1zdGF0aWMgaW50IGluMjAwMF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppaW5mbykKLXsKLQlpbnQgc2l6ZTsKLQotCXNpemUgPSBjYXBhY2l0eTsKLQlpaW5mb1swXSA9IDY0OwotCWlpbmZvWzFdID0gMzI7Ci0JaWluZm9bMl0gPSBzaXplID4+IDExOwotCi0vKiBUaGlzIHNob3VsZCBhcHByb3hpbWF0ZSB0aGUgbGFyZ2UgZHJpdmUgaGFuZGxpbmcgdGhhdCB0aGUgRE9TIEFTUEkgbWFuYWdlcgotICAgdXNlcy4gIERyaXZlcyB2ZXJ5IG5lYXIgdGhlIGJvdW5kYXJpZXMgbWF5IG5vdCBiZSBoYW5kbGVkIGNvcnJlY3RseSAoaS5lLgotICAgbmVhciAyLjAgR2IgYW5kIDQuMCBHYikgKi8KLQotCWlmIChpaW5mb1syXSA+IDEwMjQpIHsKLQkJaWluZm9bMF0gPSA2NDsKLQkJaWluZm9bMV0gPSA2MzsKLQkJaWluZm9bMl0gPSAodW5zaWduZWQgbG9uZykgY2FwYWNpdHkgLyAoaWluZm9bMF0gKiBpaW5mb1sxXSk7Ci0JfQotCWlmIChpaW5mb1syXSA+IDEwMjQpIHsKLQkJaWluZm9bMF0gPSAxMjg7Ci0JCWlpbmZvWzFdID0gNjM7Ci0JCWlpbmZvWzJdID0gKHVuc2lnbmVkIGxvbmcpIGNhcGFjaXR5IC8gKGlpbmZvWzBdICogaWluZm9bMV0pOwotCX0KLQlpZiAoaWluZm9bMl0gPiAxMDI0KSB7Ci0JCWlpbmZvWzBdID0gMjU1OwotCQlpaW5mb1sxXSA9IDYzOwotCQlpaW5mb1syXSA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvIChpaW5mb1swXSAqIGlpbmZvWzFdKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBpbjIwMDBfd3JpdGVfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwgY2hhciAqYnVmLCBpbnQgbGVuKQotewotCi0jaWZkZWYgUFJPQ19JTlRFUkZBQ0UKLQotCWNoYXIgKmJwOwotCXN0cnVjdCBJTjIwMDBfaG9zdGRhdGEgKmhkOwotCWludCB4LCBpOwotCi0JaGQgPSAoc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqKSBpbnN0YW5jZS0+aG9zdGRhdGE7Ci0KLQlidWZbbGVuXSA9ICdcMCc7Ci0JYnAgPSBidWY7Ci0JaWYgKCFzdHJuY21wKGJwLCAiZGVidWc6IiwgNikpIHsKLQkJYnAgKz0gNjsKLQkJaGQtPmFyZ3MgPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCkgJiBEQl9NQVNLOwotCX0gZWxzZSBpZiAoIXN0cm5jbXAoYnAsICJkaXNjb25uZWN0OiIsIDExKSkgewotCQlicCArPSAxMTsKLQkJeCA9IHNpbXBsZV9zdHJ0b3VsKGJwLCBOVUxMLCAwKTsKLQkJaWYgKHggPCBESVNfTkVWRVIgfHwgeCA+IERJU19BTFdBWVMpCi0JCQl4ID0gRElTX0FEQVBUSVZFOwotCQloZC0+ZGlzY29ubmVjdCA9IHg7Ci0JfSBlbHNlIGlmICghc3RybmNtcChicCwgInBlcmlvZDoiLCA3KSkgewotCQlicCArPSA3OwotCQl4ID0gc2ltcGxlX3N0cnRvdWwoYnAsIE5VTEwsIDApOwotCQloZC0+ZGVmYXVsdF9zeF9wZXIgPSBzeF90YWJsZVtyb3VuZF9wZXJpb2QoKHVuc2lnbmVkIGludCkgeCldLnBlcmlvZF9uczsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKGJwLCAicmVzeW5jOiIsIDcpKSB7Ci0JCWJwICs9IDc7Ci0JCXggPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCk7Ci0JCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCi0JCQlpZiAoeCAmICgxIDw8IGkpKQotCQkJCWhkLT5zeW5jX3N0YXRbaV0gPSBTU19VTlNFVDsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKGJwLCAicHJvYzoiLCA1KSkgewotCQlicCArPSA1OwotCQloZC0+cHJvYyA9IHNpbXBsZV9zdHJ0b3VsKGJwLCBOVUxMLCAwKTsKLQl9IGVsc2UgaWYgKCFzdHJuY21wKGJwLCAibGV2ZWwyOiIsIDcpKSB7Ci0JCWJwICs9IDc7Ci0JCWhkLT5sZXZlbDIgPSBzaW1wbGVfc3RydG91bChicCwgTlVMTCwgMCk7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGludCBpbjIwMDBfc2hvd19pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UpCi17Ci0KLSNpZmRlZiBQUk9DX0lOVEVSRkFDRQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IElOMjAwMF9ob3N0ZGF0YSAqaGQ7Ci0JU2NzaV9DbW5kICpjbWQ7Ci0JaW50IHg7Ci0KLQloZCA9IChzdHJ1Y3QgSU4yMDAwX2hvc3RkYXRhICopIGluc3RhbmNlLT5ob3N0ZGF0YTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKGluc3RhbmNlLT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlpZiAoaGQtPnByb2MgJiBQUl9WRVJTSU9OKQotCQlzZXFfcHJpbnRmKG0sICJcblZlcnNpb24gJXMgLSAlcy4iLCBJTjIwMDBfVkVSU0lPTiwgSU4yMDAwX0RBVEUpOwotCi0JaWYgKGhkLT5wcm9jICYgUFJfSU5GTykgewotCQlzZXFfcHJpbnRmKG0sICJcbmRpcF9zd2l0Y2g9JTAyeDogaXJxPSVkIGlvPSUwMnggZmxvcHB5PSVzIHN5bmMvRE9TNT0lcyIsIChoZC0+ZGlwX3N3aXRjaCAmIDB4N2YpLCBpbnN0YW5jZS0+aXJxLCBoZC0+aW9fYmFzZSwgKGhkLT5kaXBfc3dpdGNoICYgMHg0MCkgPyAiWWVzIiA6ICJObyIsIChoZC0+ZGlwX3N3aXRjaCAmIDB4MjApID8gIlllcyIgOiAiTm8iKTsKLQkJc2VxX3B1dHMobSwgIlxuc3luY194ZmVyW10gPSAgICAgICAiKTsKLQkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykKLQkJCXNlcV9wcmludGYobSwgIlx0JTAyeCIsIGhkLT5zeW5jX3hmZXJbeF0pOwotCQlzZXFfcHV0cyhtLCAiXG5zeW5jX3N0YXRbXSA9ICAgICAgICIpOwotCQlmb3IgKHggPSAwOyB4IDwgNzsgeCsrKQotCQkJc2VxX3ByaW50ZihtLCAiXHQlMDJ4IiwgaGQtPnN5bmNfc3RhdFt4XSk7Ci0JfQotI2lmZGVmIFBST0NfU1RBVElTVElDUwotCWlmIChoZC0+cHJvYyAmIFBSX1NUQVRJU1RJQ1MpIHsKLQkJc2VxX3B1dHMobSwgIlxuY29tbWFuZHMgaXNzdWVkOiAgICAiKTsKLQkJZm9yICh4ID0gMDsgeCA8IDc7IHgrKykKLQkJCXNlcV9wcmludGYobSwgIlx0JWxkIiwgaGQtPmNtZF9jbnRbeF0pOwotCQlzZXFfcHV0cyhtLCAiXG5kaXNjb25uZWN0cyBhbGxvd2VkOiIpOwotCQlmb3IgKHggPSAwOyB4IDwgNzsgeCsrKQotCQkJc2VxX3ByaW50ZihtLCAiXHQlbGQiLCBoZC0+ZGlzY19hbGxvd2VkX2NudFt4XSk7Ci0JCXNlcV9wdXRzKG0sICJcbmRpc2Nvbm5lY3RzIGRvbmU6ICAgIik7Ci0JCWZvciAoeCA9IDA7IHggPCA3OyB4KyspCi0JCQlzZXFfcHJpbnRmKG0sICJcdCVsZCIsIGhkLT5kaXNjX2RvbmVfY250W3hdKTsKLQkJc2VxX3ByaW50ZihtLCAiXG5pbnRlcnJ1cHRzOiAgICAgIFx0JWxkIiwgaGQtPmludF9jbnQpOwotCX0KLSNlbmRpZgotCWlmIChoZC0+cHJvYyAmIFBSX0NPTk5FQ1RFRCkgewotCQlzZXFfcHV0cyhtLCAiXG5jb25uZWN0ZWQ6ICAgICAiKTsKLQkJaWYgKGhkLT5jb25uZWN0ZWQpIHsKLQkJCWNtZCA9IChTY3NpX0NtbmQgKikgaGQtPmNvbm5lY3RlZDsKLQkJCXNlcV9wcmludGYobSwgIiAlZDolbGx1KCUwMngpIiwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBjbWQtPmNtbmRbMF0pOwotCQl9Ci0JfQotCWlmIChoZC0+cHJvYyAmIFBSX0lOUFVUUSkgewotCQlzZXFfcHV0cyhtLCAiXG5pbnB1dF9ROiAgICAgICAiKTsKLQkJY21kID0gKFNjc2lfQ21uZCAqKSBoZC0+aW5wdXRfUTsKLQkJd2hpbGUgKGNtZCkgewotCQkJc2VxX3ByaW50ZihtLCAiICVkOiVsbHUoJTAyeCkiLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZC0+Y21uZFswXSk7Ci0JCQljbWQgPSAoU2NzaV9DbW5kICopIGNtZC0+aG9zdF9zY3JpYmJsZTsKLQkJfQotCX0KLQlpZiAoaGQtPnByb2MgJiBQUl9ESVNDUSkgewotCQlzZXFfcHV0cyhtLCAiXG5kaXNjb25uZWN0ZWRfUToiKTsKLQkJY21kID0gKFNjc2lfQ21uZCAqKSBoZC0+ZGlzY29ubmVjdGVkX1E7Ci0JCXdoaWxlIChjbWQpIHsKLQkJCXNlcV9wcmludGYobSwgIiAlZDolbGx1KCUwMngpIiwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBjbWQtPmNtbmRbMF0pOwotCQkJY21kID0gKFNjc2lfQ21uZCAqKSBjbWQtPmhvc3Rfc2NyaWJibGU7Ci0JCX0KLQl9Ci0JaWYgKGhkLT5wcm9jICYgUFJfVEVTVCkgewotCQk7CQkvKiBpbnNlcnQgeW91ciBvd24gY3VzdG9tIGZ1bmN0aW9uIGhlcmUgKi8KLQl9Ci0Jc2VxX3B1dGMobSwgJ1xuJyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpbnN0YW5jZS0+aG9zdF9sb2NrLCBmbGFncyk7Ci0jZW5kaWYJCQkJLyogUFJPQ19JTlRFUkZBQ0UgKi8KLQlyZXR1cm4gMDsKLX0KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKLQkucHJvY19uYW1lICAgICAgIAkJPSAiaW4yMDAwIiwKLQkud3JpdGVfaW5mbyAgICAgICAJCT0gaW4yMDAwX3dyaXRlX2luZm8sCi0JLnNob3dfaW5mbyAgICAgICAJCT0gaW4yMDAwX3Nob3dfaW5mbywKLQkubmFtZSAgICAgICAgICAgIAkJPSAiQWx3YXlzIElOMjAwMCIsCi0JLmRldGVjdCAgICAgICAgICAJCT0gaW4yMDAwX2RldGVjdCwgCi0JLnJlbGVhc2UJCQk9IGluMjAwMF9yZWxlYXNlLAotCS5xdWV1ZWNvbW1hbmQgICAgCQk9IGluMjAwMF9xdWV1ZWNvbW1hbmQsCi0JLmVoX2Fib3J0X2hhbmRsZXIJCT0gaW4yMDAwX2Fib3J0LAotCS5laF9idXNfcmVzZXRfaGFuZGxlcgkJPSBpbjIwMDBfYnVzX3Jlc2V0LAotCS5iaW9zX3BhcmFtICAgICAgCQk9IGluMjAwMF9iaW9zcGFyYW0sIAotCS5jYW5fcXVldWUgICAgICAgCQk9IElOMjAwMF9DQU5fUSwKLQkudGhpc19pZCAgICAgICAgIAkJPSBJTjIwMDBfSE9TVF9JRCwKLQkuc2dfdGFibGVzaXplICAgIAkJPSBJTjIwMDBfU0csCi0JLmNtZF9wZXJfbHVuICAgICAJCT0gSU4yMDAwX0NQTCwKLQkudXNlX2NsdXN0ZXJpbmcgIAkJPSBESVNBQkxFX0NMVVNURVJJTkcsCi19OwotI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaW4yMDAwLmggYi9kcml2ZXJzL3Njc2kvaW4yMDAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjFlMWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zY3NpL2luMjAwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qCi0gKiAgICBpbjIwMDAuaCAtICBMaW51eCBkZXZpY2UgZHJpdmVyIGRlZmluaXRpb25zIGZvciB0aGUKLSAqICAgICAgICAgICAgICAgIEFsd2F5cyBJTjIwMDAgSVNBIFNDU0kgY2FyZC4KLSAqCi0gKiAgICBJTVBPUlRBTlQ6IFRoaXMgZmlsZSBpcyBmb3IgdmVyc2lvbiAxLjMzIC0gMjYvQXVnLzE5OTgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTYgSm9obiBTaGlmZmxldHQsIEdlb0xvZyBDb25zdWx0aW5nCi0gKiAgICBqb2huQGdlb2xvZy5jb20KLSAqICAgIGpzaGlmZmxlQG5ldGNvbS5jb20KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKLSAqIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgSU4yMDAwX0gKLSNkZWZpbmUgSU4yMDAwX0gKLQotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jZGVmaW5lIFBST0NfSU5URVJGQUNFICAgICAvKiBhZGQgY29kZSBmb3IgL3Byb2Mvc2NzaS9pbjIwMDAveHh4IGludGVyZmFjZSAqLwotI2lmZGVmICBQUk9DX0lOVEVSRkFDRQotI2RlZmluZSBQUk9DX1NUQVRJU1RJQ1MgICAgLyogYWRkIGNvZGUgZm9yIGtlZXBpbmcgdmFyaW91cyByZWFsIHRpbWUgc3RhdHMgKi8KLSNlbmRpZgotCi0jZGVmaW5lIFNZTkNfREVCVUcgICAgICAgICAvKiBleHRyYSBpbmZvIG9uIHN5bmMgbmVnb3RpYXRpb24gcHJpbnRlZCAqLwotI2RlZmluZSBERUJVR0dJTkdfT04gICAgICAgLyogZW5hYmxlIGNvbW1hbmQtbGluZSBkZWJ1Z2dpbmcgYml0bWFzayAqLwotI2RlZmluZSBERUJVR19ERUZBVUxUUyAwICAgLyogZGVmYXVsdCBiaXRtYXNrIC0gY2hhbmdlIGZyb20gY29tbWFuZC1saW5lICovCi0KLSNpZmRlZiBfX2kzODZfXwotI2RlZmluZSBGQVNUX1JFQURfSU8gICAgICAgLyogTm8gcHJvYmxlbXMgd2l0aCB0aGVzZSBvbiBteSBtYWNoaW5lICovCi0jZGVmaW5lIEZBU1RfV1JJVEVfSU8KLSNlbmRpZgotCi0jaWZkZWYgREVCVUdHSU5HX09OCi0jZGVmaW5lIERCKGYsYSkgaWYgKGhvc3RkYXRhLT5hcmdzICYgKGYpKSBhOwotI2RlZmluZSBDSEVDS19OVUxMKHAscykgLyogaWYgKCEocCkpIHtwcmludGsoIlxuIik7IHdoaWxlICgxKSBwcmludGsoIk5QOiVzXHIiLChzKSk7fSAqLwotI2Vsc2UKLSNkZWZpbmUgREIoZixhKQotI2RlZmluZSBDSEVDS19OVUxMKHAscykKLSNlbmRpZgotCi0jZGVmaW5lIHVjaGFyIHVuc2lnbmVkIGNoYXIKLQotI2RlZmluZSByZWFkMV9pbyhhKSAgICAgKGluYihob3N0ZGF0YS0+aW9fYmFzZSsoYSkpKQotI2RlZmluZSByZWFkMl9pbyhhKSAgICAgKGludyhob3N0ZGF0YS0+aW9fYmFzZSsoYSkpKQotI2RlZmluZSB3cml0ZTFfaW8oYixhKSAgKG91dGIoKGIpLGhvc3RkYXRhLT5pb19iYXNlKyhhKSkpCi0jZGVmaW5lIHdyaXRlMl9pbyh3LGEpICAob3V0dygodyksaG9zdGRhdGEtPmlvX2Jhc2UrKGEpKSkKLQotI2lmZGVmIF9faTM4Nl9fCi0vKiBUaGVzZSBpbmxpbmUgYXNzZW1ibHkgZGVmaW5lcyBhcmUgZGVyaXZlZCBmcm9tIGEgcGF0Y2gKLSAqIHNlbnQgdG8gbWUgYnkgQmlsbCBFYXJuZXN0LiBIZSdzIGRvbmUgYSBsb3Qgb2YgdmVyeQotICogdmFsdWFibGUgdGhpbmtpbmcsIHRlc3RpbmcsIGFuZCBjb2RpbmcgZHVyaW5nIGhpcyBlZmZvcnQKLSAqIHRvIHNxdWVlemUgbW9yZSBzcGVlZCBvdXQgb2YgdGhpcyBkcml2ZXIuIEkgcmVhbGx5IHRoaW5rCi0gKiB0aGF0IHdlIGFyZSBkb2luZyBJTyBhdCBjbG9zZSB0byB0aGUgbWF4aW11bSBub3cgd2l0aAotICogdGhlIGZpZm8uIChBbmQgeWVzLCBpbnN3IHVzZXMgJ2VkaScgd2hpbGUgb3V0c3cgdXNlcwotICogJ2VzaScuIFRoYW5rcyBCaWxsISkKLSAqLwotCi0jZGVmaW5lIEZBU1RfUkVBRDJfSU8oKSAgICBcCi0oeyBcCi1pbnQgX19kdW1teV8xLF9fZHVtbXlfMjsgXAotICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJcbiBcCi0gICBjbGQgICAgICAgICAgICAgICAgICAgIFxuIFwKLSAgIG9ybCAlJWVjeCwgJSVlY3ggICAgICAgXG4gXAotICAganogMWYgICAgICAgICAgICAgICAgICBcbiBcCi0gICByZXAgICAgICAgICAgICAgICAgICAgIFxuIFwKLSAgIGluc3cgKCUlZHgpLCUlZXM6KCUlZWRpKSBcbiBcCi0xOiAiICAgICAgICAgICAgICAgICAgICAgICBcCi0gICA6ICI9RCIgKHNwKSAsIj1jIiAoX19kdW1teV8xKSAsIj1kIiAoX19kdW1teV8yKSAgLyogb3V0cHV0ICovICAgXAotICAgOiAiMiIgKGYpLCAiMCIgKHNwKSwgIjEiIChpKSAgLyogaW5wdXQgKi8gICAgXAotICAgKTsgICAgICAgLyogdHJhc2hlZCAqLyBcCi19KQotCi0jZGVmaW5lIEZBU1RfV1JJVEUyX0lPKCkgICBcCi0oeyBcCi1pbnQgX19kdW1teV8xLF9fZHVtbXlfMjsgXAotICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJcbiBcCi0gICBjbGQgICAgICAgICAgICAgICAgICAgIFxuIFwKLSAgIG9ybCAlJWVjeCwgJSVlY3ggICAgICAgXG4gXAotICAganogMWYgICAgICAgICAgICAgICAgICBcbiBcCi0gICByZXAgICAgICAgICAgICAgICAgICAgIFxuIFwKLSAgIG91dHN3ICUlZHM6KCUlZXNpKSwoJSVkeCkgXG4gXAotMTogIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgOiAiPVMiIChzcCkgLCI9YyIgKF9fZHVtbXlfMSkgLCI9ZCIgKF9fZHVtbXlfMikvKiBvdXRwdXQgKi8gICBcCi0gICA6ICIyIiAoZiksICIwIiAoc3ApLCAiMSIgKGkpICAvKiBpbnB1dCAqLyAgICBcCi0gICApOyAgICAgICAvKiB0cmFzaGVkICovIFwKLX0pCi0jZW5kaWYKLQotLyogSU4yMDAwIGlvX3BvcnQgb2Zmc2V0cyAqLwotI2RlZmluZSBJT19XRF9BU1IgICAgICAgMHgwMCAgICAgLyogUiAtIDMzOTMgYXV4c3RhdCByZWcgKi8KLSNkZWZpbmUgICAgIEFTUl9JTlQgICAgICAgIDB4ODAKLSNkZWZpbmUgICAgIEFTUl9MQ0kgICAgICAgIDB4NDAKLSNkZWZpbmUgICAgIEFTUl9CU1kgICAgICAgIDB4MjAKLSNkZWZpbmUgICAgIEFTUl9DSVAgICAgICAgIDB4MTAKLSNkZWZpbmUgICAgIEFTUl9QRSAgICAgICAgIDB4MDIKLSNkZWZpbmUgICAgIEFTUl9EQlIgICAgICAgIDB4MDEKLSNkZWZpbmUgSU9fV0RfQUREUiAgICAgIDB4MDAgICAgIC8qIFcgLSAzMzkzIGFkZHJlc3MgcmVnICovCi0jZGVmaW5lIElPX1dEX0RBVEEgICAgICAweDAxICAgICAvKiBSL1cgLSByZXN0IG9mIDMzOTMgcmVncyAqLwotI2RlZmluZSBJT19GSUZPICAgICAgICAgMHgwMiAgICAgLyogUi9XIC0gaW4yMDAwIGR1YWwtcG9ydCBmaWZvICgxNiBiaXRzKSAqLwotI2RlZmluZSBJTjIwMDBfRklGT19TSVpFICAgMjA0OCAgLyogICAgZmlmbyBjYXBhY2l0eSBpbiBieXRlcyAqLwotI2RlZmluZSBJT19DQVJEX1JFU0VUICAgMHgwMyAgICAgLyogVyAtIGluMjAwMCBzdGFydCBtYXN0ZXIgcmVzZXQgKi8KLSNkZWZpbmUgSU9fRklGT19DT1VOVCAgIDB4MDQgICAgIC8qIFIgLSBpbjIwMDAgZmlmbyBjb3VudGVyICovCi0jZGVmaW5lIElPX0ZJRk9fV1JJVEUgICAweDA1ICAgICAvKiBXIC0gY2xlYXIgZmlmbyBjb3VudGVyLCBzdGFydCB3cml0ZSAqLwotI2RlZmluZSBJT19GSUZPX1JFQUQgICAgMHgwNyAgICAgLyogVyAtIHN0YXJ0IGZpZm8gcmVhZCAqLwotI2RlZmluZSBJT19MRURfT0ZGICAgICAgMHgwOCAgICAgLyogVyAtIHR1cm4gb2ZmIGluMjAwMCBhY3Rpdml0eSBMRUQgKi8KLSNkZWZpbmUgSU9fU1dJVENIRVMgICAgIDB4MDggICAgIC8qIFIgLSByZWFkIGluMjAwMCBkaXAgc3dpdGNoICovCi0jZGVmaW5lICAgICBTV19BRERSMCAgICAgICAweDAxICAvKiAgICBiaXQgMCA9IGJpdCAwIG9mIGluZGV4IHRvIGlvIGFkZHIgKi8KLSNkZWZpbmUgICAgIFNXX0FERFIxICAgICAgIDB4MDIgIC8qICAgIGJpdCAxID0gYml0IDEgb2YgaW5kZXggaW8gYWRkciAqLwotI2RlZmluZSAgICAgU1dfRElTSU5UICAgICAgMHgwNCAgLyogICAgYml0IDIgdHJ1ZSBpZiBpbnRzIGRpc2FibGVkICovCi0jZGVmaW5lICAgICBTV19JTlQwICAgICAgICAweDA4ICAvKiAgICBiaXQgMyA9IGJpdCAwIG9mIGluZGV4IHRvIGludGVycnVwdCAqLwotI2RlZmluZSAgICAgU1dfSU5UMSAgICAgICAgMHgxMCAgLyogICAgYml0IDQgPSBiaXQgMSBvZiBpbmRleCB0byBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgICAgIFNXX0lOVF9TSElGVCAgIDMgICAgIC8qICAgIHNoaWZ0IHJpZ2h0IHRoaXMgYW1vdW50IHRvIHJpZ2h0IGp1c3RpZnkgaW50IGJpdHMgKi8KLSNkZWZpbmUgICAgIFNXX1NZTkNfRE9TNSAgIDB4MjAgIC8qICAgIGJpdCA1IHVzZWQgYnkgQWx3YXlzIEJJT1MgKi8KLSNkZWZpbmUgICAgIFNXX0ZMT1BQWSAgICAgIDB4NDAgIC8qICAgIGJpdCA2IHRydWUgaWYgZmxvcHB5IGVuYWJsZWQgKi8KLSNkZWZpbmUgICAgIFNXX0JJVDcgICAgICAgIDB4ODAgIC8qICAgIGJpdCA3IGhhcmR3aXJlZCB0cnVlIChncm91bmQpICovCi0jZGVmaW5lIElPX0xFRF9PTiAgICAgICAweDA5ICAgICAvKiBXIC0gdHVybiBvbiBpbjIwMDAgYWN0aXZpdHkgTEVEICovCi0jZGVmaW5lIElPX0hBUkRXQVJFICAgICAweDBhICAgICAvKiBSIC0gcmVhZCBpbjIwMDAgaGFyZHdhcmUgcmV2LCBzdG9wIHJlc2V0ICovCi0jZGVmaW5lIElPX0lOVFJfTUFTSyAgICAweDBjICAgICAvKiBXIC0gaW4yMDAwIGludGVycnVwdCBtYXNrIHJlZyAqLwotI2RlZmluZSAgICAgSU1BU0tfV0QgICAgICAgMHgwMSAgLyogICAgV0QzM2M5MyBpbnRlcnJ1cHQgbWFzayAqLwotI2RlZmluZSAgICAgSU1BU0tfRklGTyAgICAgMHgwMiAgLyogICAgRklGTyBpbnRlcnJ1cHQgbWFzayAqLwotCi0vKiB3ZCByZWdpc3RlciBuYW1lcyAqLwotI2RlZmluZSBXRF9PV05fSUQgICAgMHgwMAotI2RlZmluZSBXRF9DT05UUk9MICAgMHgwMQotI2RlZmluZSBXRF9USU1FT1VUX1BFUklPRCAgMHgwMgotI2RlZmluZSBXRF9DREJfMSAgICAgMHgwMwotI2RlZmluZSBXRF9DREJfMiAgICAgMHgwNAotI2RlZmluZSBXRF9DREJfMyAgICAgMHgwNQotI2RlZmluZSBXRF9DREJfNCAgICAgMHgwNgotI2RlZmluZSBXRF9DREJfNSAgICAgMHgwNwotI2RlZmluZSBXRF9DREJfNiAgICAgMHgwOAotI2RlZmluZSBXRF9DREJfNyAgICAgMHgwOQotI2RlZmluZSBXRF9DREJfOCAgICAgMHgwYQotI2RlZmluZSBXRF9DREJfOSAgICAgMHgwYgotI2RlZmluZSBXRF9DREJfMTAgICAgMHgwYwotI2RlZmluZSBXRF9DREJfMTEgICAgMHgwZAotI2RlZmluZSBXRF9DREJfMTIgICAgMHgwZQotI2RlZmluZSBXRF9UQVJHRVRfTFVOICAgICAgMHgwZgotI2RlZmluZSBXRF9DT01NQU5EX1BIQVNFICAgMHgxMAotI2RlZmluZSBXRF9TWU5DSFJPTk9VU19UUkFOU0ZFUiAgMHgxMQotI2RlZmluZSBXRF9UUkFOU0ZFUl9DT1VOVF9NU0IgMHgxMgotI2RlZmluZSBXRF9UUkFOU0ZFUl9DT1VOVCAgMHgxMwotI2RlZmluZSBXRF9UUkFOU0ZFUl9DT1VOVF9MU0IgMHgxNAotI2RlZmluZSBXRF9ERVNUSU5BVElPTl9JRCAgMHgxNQotI2RlZmluZSBXRF9TT1VSQ0VfSUQgICAgMHgxNgotI2RlZmluZSBXRF9TQ1NJX1NUQVRVUyAgICAgMHgxNwotI2RlZmluZSBXRF9DT01NQU5EICAgICAgMHgxOAotI2RlZmluZSBXRF9EQVRBICAgICAgMHgxOQotI2RlZmluZSBXRF9RVUVVRV9UQUcgICAgMHgxYQotI2RlZmluZSBXRF9BVVhJTElBUllfU1RBVFVTICAgMHgxZgotCi0vKiBXRCBjb21tYW5kcyAqLwotI2RlZmluZSBXRF9DTURfUkVTRVQgICAgMHgwMAotI2RlZmluZSBXRF9DTURfQUJPUlQgICAgMHgwMQotI2RlZmluZSBXRF9DTURfQVNTRVJUX0FUTiAgMHgwMgotI2RlZmluZSBXRF9DTURfTkVHQVRFX0FDSyAgMHgwMwotI2RlZmluZSBXRF9DTURfRElTQ09OTkVDVCAgMHgwNAotI2RlZmluZSBXRF9DTURfUkVTRUxFQ1QgICAgMHgwNQotI2RlZmluZSBXRF9DTURfU0VMX0FUTiAgICAgMHgwNgotI2RlZmluZSBXRF9DTURfU0VMICAgICAgMHgwNwotI2RlZmluZSBXRF9DTURfU0VMX0FUTl9YRkVSICAgMHgwOAotI2RlZmluZSBXRF9DTURfU0VMX1hGRVIgICAgMHgwOQotI2RlZmluZSBXRF9DTURfUkVTRUxfUkVDRUlWRSAgMHgwYQotI2RlZmluZSBXRF9DTURfUkVTRUxfU0VORCAgMHgwYgotI2RlZmluZSBXRF9DTURfV0FJVF9TRUxfUkVDRUlWRSAweDBjCi0jZGVmaW5lIFdEX0NNRF9UUkFOU19BRERSICAweDE4Ci0jZGVmaW5lIFdEX0NNRF9UUkFOU19JTkZPICAweDIwCi0jZGVmaW5lIFdEX0NNRF9UUkFOU0ZFUl9QQUQgICAweDIxCi0jZGVmaW5lIFdEX0NNRF9TQlRfTU9ERSAgICAweDgwCi0KLS8qIFNDU0kgQnVzIFBoYXNlcyAqLwotI2RlZmluZSBQSFNfREFUQV9PVVQgICAgMHgwMAotI2RlZmluZSBQSFNfREFUQV9JTiAgICAgMHgwMQotI2RlZmluZSBQSFNfQ09NTUFORCAgICAgMHgwMgotI2RlZmluZSBQSFNfU1RBVFVTICAgICAgMHgwMwotI2RlZmluZSBQSFNfTUVTU19PVVQgICAgMHgwNgotI2RlZmluZSBQSFNfTUVTU19JTiAgICAgMHgwNwotCi0vKiBDb21tYW5kIFN0YXR1cyBSZWdpc3RlciBkZWZpbml0aW9ucyAqLwotCi0gIC8qIHJlc2V0IHN0YXRlIGludGVycnVwdHMgKi8KLSNkZWZpbmUgQ1NSX1JFU0VUICAgIDB4MDAKLSNkZWZpbmUgQ1NSX1JFU0VUX0FGICAgIDB4MDEKLQotICAvKiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gaW50ZXJydXB0cyAqLwotI2RlZmluZSBDU1JfUkVTRUxFQ1QgICAgMHgxMAotI2RlZmluZSBDU1JfU0VMRUNUICAgICAgMHgxMQotI2RlZmluZSBDU1JfU0VMX1hGRVJfRE9ORSAgMHgxNgotI2RlZmluZSBDU1JfWEZFUl9ET05FICAgICAgMHgxOAotCi0gIC8qIHBhdXNlZCBvciBhYm9ydGVkIGludGVycnVwdHMgKi8KLSNkZWZpbmUgQ1NSX01TR0lOICAgIDB4MjAKLSNkZWZpbmUgQ1NSX1NEUCAgICAgICAgIDB4MjEKLSNkZWZpbmUgQ1NSX1NFTF9BQk9SVCAgICAgIDB4MjIKLSNkZWZpbmUgQ1NSX1JFU0VMX0FCT1JUICAgIDB4MjUKLSNkZWZpbmUgQ1NSX1JFU0VMX0FCT1JUX0FNIDB4MjcKLSNkZWZpbmUgQ1NSX0FCT1JUICAgIDB4MjgKLQotICAvKiB0ZXJtaW5hdGVkIGludGVycnVwdHMgKi8KLSNkZWZpbmUgQ1NSX0lOVkFMSUQgICAgIDB4NDAKLSNkZWZpbmUgQ1NSX1VORVhQX0RJU0MgICAgIDB4NDEKLSNkZWZpbmUgQ1NSX1RJTUVPVVQgICAgIDB4NDIKLSNkZWZpbmUgQ1NSX1BBUklUWSAgICAgIDB4NDMKLSNkZWZpbmUgQ1NSX1BBUklUWV9BVE4gICAgIDB4NDQKLSNkZWZpbmUgQ1NSX0JBRF9TVEFUVVMgICAgIDB4NDUKLSNkZWZpbmUgQ1NSX1VORVhQICAgIDB4NDgKLQotICAvKiBzZXJ2aWNlIHJlcXVpcmVkIGludGVycnVwdHMgKi8KLSNkZWZpbmUgQ1NSX1JFU0VMICAgIDB4ODAKLSNkZWZpbmUgQ1NSX1JFU0VMX0FNICAgIDB4ODEKLSNkZWZpbmUgQ1NSX0RJU0MgICAgIDB4ODUKLSNkZWZpbmUgQ1NSX1NSVl9SRVEgICAgIDB4ODgKLQotICAgLyogT3duIElEL0NEQiBTaXplIHJlZ2lzdGVyICovCi0jZGVmaW5lIE9XTklEX0VBRiAgICAweDA4Ci0jZGVmaW5lIE9XTklEX0VIUCAgICAweDEwCi0jZGVmaW5lIE9XTklEX1JBRiAgICAweDIwCi0jZGVmaW5lIE9XTklEX0ZTXzggICAweDAwCi0jZGVmaW5lIE9XTklEX0ZTXzEyICAweDQwCi0jZGVmaW5lIE9XTklEX0ZTXzE2ICAweDgwCi0KLSAgIC8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQ1RSTF9IU1AgICAgIDB4MDEKLSNkZWZpbmUgQ1RSTF9IQSAgICAgIDB4MDIKLSNkZWZpbmUgQ1RSTF9JREkgICAgIDB4MDQKLSNkZWZpbmUgQ1RSTF9FREkgICAgIDB4MDgKLSNkZWZpbmUgQ1RSTF9ISFAgICAgIDB4MTAKLSNkZWZpbmUgQ1RSTF9QT0xMRUQgIDB4MDAKLSNkZWZpbmUgQ1RSTF9CVVJTVCAgIDB4MjAKLSNkZWZpbmUgQ1RSTF9CVVMgICAgIDB4NDAKLSNkZWZpbmUgQ1RSTF9ETUEgICAgIDB4ODAKLQotICAgLyogVGltZW91dCBQZXJpb2QgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgVElNRU9VVF9QRVJJT0RfVkFMVUUgIDIwICAgIC8qIHJlc3VsdHMgaW4gMjAwIG1zLiAqLwotCi0gICAvKiBTeW5jaHJvbm91cyBUcmFuc2ZlciBSZWdpc3RlciAqLwotI2RlZmluZSBTVFJfRlNTICAgICAgMHg4MAotCi0gICAvKiBEZXN0aW5hdGlvbiBJRCByZWdpc3RlciAqLwotI2RlZmluZSBEU1RJRF9EUEQgICAgMHg0MAotI2RlZmluZSBEQVRBX09VVF9ESVIgMAotI2RlZmluZSBEQVRBX0lOX0RJUiAgMQotI2RlZmluZSBEU1RJRF9TQ0MgICAgMHg4MAotCi0gICAvKiBTb3VyY2UgSUQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU1JDSURfTUFTSyAgIDB4MDcKLSNkZWZpbmUgU1JDSURfU0lWICAgIDB4MDgKLSNkZWZpbmUgU1JDSURfRFNQICAgIDB4MjAKLSNkZWZpbmUgU1JDSURfRVMgICAgIDB4NDAKLSNkZWZpbmUgU1JDSURfRVIgICAgIDB4ODAKLQotCi0KLSNkZWZpbmUgSUxMRUdBTF9TVEFUVVNfQllURSAgIDB4ZmYKLQotCi0jZGVmaW5lIERFRkFVTFRfU1hfUEVSICAgICA1MDAgICAvKiAobnMpIGZhaXJseSBzYWZlICovCi0jZGVmaW5lIERFRkFVTFRfU1hfT0ZGICAgICAwICAgICAvKiBha2EgYXN5bmMgKi8KLQotI2RlZmluZSBPUFRJTVVNX1NYX1BFUiAgICAgMjUyICAgLyogKG5zKSBiZXN0IHdlIGNhbiBkbyAobXVsdC1vZi00KSAqLwotI2RlZmluZSBPUFRJTVVNX1NYX09GRiAgICAgMTIgICAgLyogc2l6ZSBvZiBpbjIwMDAgZmlmbyAqLwotCi1zdHJ1Y3Qgc3hfcGVyaW9kIHsKLSAgIHVuc2lnbmVkIGludCAgIHBlcmlvZF9uczsKLSAgIHVjaGFyICAgICAgICAgIHJlZ192YWx1ZTsKLSAgIH07Ci0KLQotc3RydWN0IElOMjAwMF9ob3N0ZGF0YSB7Ci0gICAgc3RydWN0IFNjc2lfSG9zdCAqbmV4dDsKLSAgICB1Y2hhciAgICAgICAgICAgIGNoaXA7ICAgICAgICAgICAgIC8qIHdoYXQga2luZCBvZiB3ZDMzYzkzIGNoaXA/ICovCi0gICAgdWNoYXIgICAgICAgICAgICBtaWNyb2NvZGU7ICAgICAgICAvKiBtaWNyb2NvZGUgcmV2IGlmICdCJyAqLwotICAgIHVuc2lnbmVkIHNob3J0ICAgaW9fYmFzZTsgICAgICAgICAgLyogSU8gcG9ydCBiYXNlICovCi0gICAgdW5zaWduZWQgaW50ICAgICBkaXBfc3dpdGNoOyAgICAgICAvKiBkaXAgc3dpdGNoIHNldHRpbmdzICovCi0gICAgdW5zaWduZWQgaW50ICAgICBocmV2OyAgICAgICAgICAgICAvKiBoYXJkd2FyZSByZXZpc2lvbiBvZiBjYXJkICovCi0gICAgdm9sYXRpbGUgdWNoYXIgICBidXN5WzhdOyAgICAgICAgICAvKiBpbmRleCA9IHRhcmdldCwgYml0ID0gbHVuICovCi0gICAgdm9sYXRpbGUgU2NzaV9DbW5kICppbnB1dF9ROyAgICAgICAvKiBjb21tYW5kcyB3YWl0aW5nIHRvIGJlIHN0YXJ0ZWQgKi8KLSAgICB2b2xhdGlsZSBTY3NpX0NtbmQgKnNlbGVjdGluZzsgICAgIC8qIHRyeWluZyB0byBzZWxlY3QgdGhpcyBjb21tYW5kICovCi0gICAgdm9sYXRpbGUgU2NzaV9DbW5kICpjb25uZWN0ZWQ7ICAgICAvKiBjdXJyZW50bHkgY29ubmVjdGVkIGNvbW1hbmQgKi8KLSAgICB2b2xhdGlsZSBTY3NpX0NtbmQgKmRpc2Nvbm5lY3RlZF9ROy8qIGNvbW1hbmRzIHdhaXRpbmcgZm9yIHJlY29ubmVjdCAqLwotICAgIHVjaGFyICAgICAgICAgICAgc3RhdGU7ICAgICAgICAgICAgLyogd2hhdCB3ZSBhcmUgY3VycmVudGx5IGRvaW5nICovCi0gICAgdWNoYXIgICAgICAgICAgICBmaWZvOyAgICAgICAgICAgICAvKiB3aGF0IHRoZSBGSUZPIGlzIHVwIHRvICovCi0gICAgdWNoYXIgICAgICAgICAgICBsZXZlbDI7ICAgICAgICAgICAvKiBleHRlbnQgdG8gd2hpY2ggTGV2ZWwtMiBjb21tYW5kcyBhcmUgdXNlZCAqLwotICAgIHVjaGFyICAgICAgICAgICAgZGlzY29ubmVjdDsgICAgICAgLyogZGlzY29ubmVjdC9yZXNlbGVjdCBwb2xpY3kgKi8KLSAgICB1bnNpZ25lZCBpbnQgICAgIGFyZ3M7ICAgICAgICAgICAgIC8qIHNldCBmcm9tIGNvbW1hbmQtbGluZSBhcmd1bWVudCAqLwotICAgIHVjaGFyICAgICAgICAgICAgaW5jb21pbmdfbXNnWzhdOyAgLyogZmlsbGVkIGR1cmluZyBtZXNzYWdlX2luIHBoYXNlICovCi0gICAgaW50ICAgICAgICAgICAgICBpbmNvbWluZ19wdHI7ICAgICAvKiBtYWlubHkgdXNlZCB3aXRoIEVYVEVOREVEIG1lc3NhZ2VzICovCi0gICAgdWNoYXIgICAgICAgICAgICBvdXRnb2luZ19tc2dbOF07ICAvKiBzZW5kIHRoaXMgZHVyaW5nIG5leHQgbWVzc2FnZV9vdXQgKi8KLSAgICBpbnQgICAgICAgICAgICAgIG91dGdvaW5nX2xlbjsgICAgIC8qIGxlbmd0aCBvZiBvdXRnb2luZyBtZXNzYWdlICovCi0gICAgdW5zaWduZWQgaW50ICAgICBkZWZhdWx0X3N4X3BlcjsgICAvKiBkZWZhdWx0IHRyYW5zZmVyIHBlcmlvZCBmb3IgU0NTSSBidXMgKi8KLSAgICB1Y2hhciAgICAgICAgICAgIHN5bmNfeGZlcls4XTsgICAgIC8qIHN5bmNfeGZlciByZWcgc2V0dGluZ3MgcGVyIHRhcmdldCAqLwotICAgIHVjaGFyICAgICAgICAgICAgc3luY19zdGF0WzhdOyAgICAgLyogc3RhdHVzIG9mIHN5bmMgbmVnb3RpYXRpb24gcGVyIHRhcmdldCAqLwotICAgIHVjaGFyICAgICAgICAgICAgc3luY19vZmY7ICAgICAgICAgLyogYml0IG1hc2s6IGRvbid0IHVzZSBzeW5jIHdpdGggdGhlc2UgdGFyZ2V0cyAqLwotI2lmZGVmIFBST0NfSU5URVJGQUNFCi0gICAgdWNoYXIgICAgICAgICAgICBwcm9jOyAgICAgICAgICAgICAvKiBiaXQgbWFzazogd2hhdCdzIGluIHByb2Mgb3V0cHV0ICovCi0jaWZkZWYgUFJPQ19TVEFUSVNUSUNTCi0gICAgdW5zaWduZWQgbG9uZyAgICBjbWRfY250WzhdOyAgICAgICAvKiAjIG9mIGNvbW1hbmRzIGlzc3VlZCBwZXIgdGFyZ2V0ICovCi0gICAgdW5zaWduZWQgbG9uZyAgICBpbnRfY250OyAgICAgICAgICAvKiAjIG9mIGludGVycnVwdHMgc2VydmljZWQgKi8KLSAgICB1bnNpZ25lZCBsb25nICAgIGRpc2NfYWxsb3dlZF9jbnRbOF07IC8qICMgb2YgZGlzY29ubmVjdHMgYWxsb3dlZCBwZXIgdGFyZ2V0ICovCi0gICAgdW5zaWduZWQgbG9uZyAgICBkaXNjX2RvbmVfY250WzhdOyAvKiAjIG9mIGRpc2Nvbm5lY3RzIGRvbmUgcGVyIHRhcmdldCovCi0jZW5kaWYKLSNlbmRpZgotICAgIH07Ci0KLQotLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPmNoaXAgKi8KLQotI2RlZmluZSBDX1dEMzNDOTMgICAgICAgMAotI2RlZmluZSBDX1dEMzNDOTNBICAgICAgMQotI2RlZmluZSBDX1dEMzNDOTNCICAgICAgMgotI2RlZmluZSBDX1VOS05PV05fQ0hJUCAgMTAwCi0KLS8qIGRlZmluZXMgZm9yIGhvc3RkYXRhLT5zdGF0ZSAqLwotCi0jZGVmaW5lIFNfVU5DT05ORUNURUQgICAgICAgICAwCi0jZGVmaW5lIFNfU0VMRUNUSU5HICAgICAgICAgICAxCi0jZGVmaW5lIFNfUlVOTklOR19MRVZFTDIgICAgICAyCi0jZGVmaW5lIFNfQ09OTkVDVEVEICAgICAgICAgICAzCi0jZGVmaW5lIFNfUFJFX1RNUF9ESVNDICAgICAgICA0Ci0jZGVmaW5lIFNfUFJFX0NNUF9ESVNDICAgICAgICA1Ci0KLS8qIGRlZmluZXMgZm9yIGhvc3RkYXRhLT5maWZvICovCi0KLSNkZWZpbmUgRklfRklGT19VTlVTRUQgICAgICAgIDAKLSNkZWZpbmUgRklfRklGT19SRUFESU5HICAgICAgIDEKLSNkZWZpbmUgRklfRklGT19XUklUSU5HICAgICAgIDIKLQotLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPmxldmVsMiAqLwotLyogTk9URTogb25seSB0aGUgZmlyc3QgMyBhcmUgdHJ1c3R3b3J0aHkgYXQgdGhpcyBwb2ludCAtCi0gKiBoYXZpbmcgdHJvdWJsZSB3aGVuIG1vcmUgdGhhbiAxIGRldmljZSBpcyByZWFkaW5nL3dyaXRpbmcKLSAqIGF0IHRoZSBzYW1lIHRpbWUuLi4KLSAqLwotCi0jZGVmaW5lIEwyX05PTkUgICAgICAwICAvKiBubyBjb21iaW5hdGlvbiBjb21tYW5kcyAtIHdlIGdldCBsb3RzIG9mIGludHMgKi8KLSNkZWZpbmUgTDJfU0VMRUNUICAgIDEgIC8qIHN0YXJ0IHdpdGggU0VMX0FUTl9YRkVSLCBidXQgbmV2ZXIgcmVzdW1lIGl0ICovCi0jZGVmaW5lIEwyX0JBU0lDICAgICAyICAvKiByZXN1bWUgYWZ0ZXIgU1RBVFVTIGludHMgJiBSRFAgbWVzc2FnZXMgKi8KLSNkZWZpbmUgTDJfREFUQSAgICAgIDMgIC8qIHJlc3VtZSBhZnRlciBEQVRBX0lOL09VVCBpbnRzICovCi0jZGVmaW5lIEwyX01PU1QgICAgICA0ICAvKiByZXN1bWUgYWZ0ZXIgYW55dGhpbmcgZXhjZXB0IGEgUkVTRUxFQ1QgaW50ICovCi0jZGVmaW5lIEwyX1JFU0VMRUNUICA1ICAvKiByZXN1bWUgYWZ0ZXIgZXZlcnl0aGluZywgaW5jbHVkaW5nIFJFU0VMRUNUIGludHMgKi8KLSNkZWZpbmUgTDJfQUxMICAgICAgIDYgIC8qIGFsd2F5cyByZXN1bWUgKi8KLQotLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPmRpc2Nvbm5lY3QgKi8KLQotI2RlZmluZSBESVNfTkVWRVIgICAgMAotI2RlZmluZSBESVNfQURBUFRJVkUgMQotI2RlZmluZSBESVNfQUxXQVlTICAgMgotCi0vKiBkZWZpbmVzIGZvciBob3N0ZGF0YS0+YXJncyAqLwotCi0jZGVmaW5lIERCX1RFU1QgICAgICAgICAgICAgICAxPDwwCi0jZGVmaW5lIERCX0ZJRk8gICAgICAgICAgICAgICAxPDwxCi0jZGVmaW5lIERCX1FVRVVFX0NPTU1BTkQgICAgICAxPDwyCi0jZGVmaW5lIERCX0VYRUNVVEUgICAgICAgICAgICAxPDwzCi0jZGVmaW5lIERCX0lOVFIgICAgICAgICAgICAgICAxPDw0Ci0jZGVmaW5lIERCX1RSQU5TRkVSICAgICAgICAgICAxPDw1Ci0jZGVmaW5lIERCX01BU0sgICAgICAgICAgICAgICAweDNmCi0KLSNkZWZpbmUgQV9OT19TQ1NJX1JFU0VUICAgICAgIDE8PDE1Ci0KLQotLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPnN5bmNfeGZlcltdICovCi0KLSNkZWZpbmUgU1NfVU5TRVQgICAgIDAKLSNkZWZpbmUgU1NfRklSU1QgICAgIDEKLSNkZWZpbmUgU1NfV0FJVElORyAgIDIKLSNkZWZpbmUgU1NfU0VUICAgICAgIDMKLQotLyogZGVmaW5lcyBmb3IgaG9zdGRhdGEtPnByb2MgKi8KLQotI2RlZmluZSBQUl9WRVJTSU9OICAgMTw8MAotI2RlZmluZSBQUl9JTkZPICAgICAgMTw8MQotI2RlZmluZSBQUl9TVEFUSVNUSUNTIDE8PDIKLSNkZWZpbmUgUFJfQ09OTkVDVEVEIDE8PDMKLSNkZWZpbmUgUFJfSU5QVVRRICAgIDE8PDQKLSNkZWZpbmUgUFJfRElTQ1EgICAgIDE8PDUKLSNkZWZpbmUgUFJfVEVTVCAgICAgIDE8PDYKLSNkZWZpbmUgUFJfU1RPUCAgICAgIDE8PDcKLQotCi0jIGluY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSMgaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSMgZGVmaW5lIGluMjAwMF9fSU5JVEZVTkMoZnVuY3Rpb24pIF9faW5pdGZ1bmMoZnVuY3Rpb24pCi0jIGRlZmluZSBpbjIwMDBfX0lOSVQgX19pbml0Ci0jIGRlZmluZSBpbjIwMDBfX0lOSVREQVRBIF9faW5pdGRhdGEKLSMgZGVmaW5lIENMSVNQSU5fTE9DSyhob3N0LGZsYWdzKSAgIHNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpCi0jIGRlZmluZSBDTElTUElOX1VOTE9DSyhob3N0LGZsYWdzKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgXAotCQkJCQkJCSAgIGZsYWdzKQotCi1zdGF0aWMgaW50IGluMjAwMF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqKSBpbjIwMDBfX0lOSVQ7Ci1zdGF0aWMgaW50IGluMjAwMF9xdWV1ZWNvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICopOwotc3RhdGljIGludCBpbjIwMDBfYWJvcnQoU2NzaV9DbW5kICopOwotc3RhdGljIHZvaWQgaW4yMDAwX3NldHVwKGNoYXIgKiwgaW50ICopIGluMjAwMF9fSU5JVDsKLXN0YXRpYyBpbnQgaW4yMDAwX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqLAotCQlzZWN0b3JfdCwgaW50ICopOwotc3RhdGljIGludCBpbjIwMDBfYnVzX3Jlc2V0KFNjc2lfQ21uZCAqKTsKLQotCi0jZGVmaW5lIElOMjAwMF9DQU5fUSAgICAxNgotI2RlZmluZSBJTjIwMDBfU0cgICAgICAgU0dfQUxMCi0jZGVmaW5lIElOMjAwMF9DUEwgICAgICAyCi0jZGVmaW5lIElOMjAwMF9IT1NUX0lEICA3Ci0KLSNlbmRpZiAvKiBJTjIwMDBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5jIGIvZHJpdmVycy9zY3NpL2lwci5jCmluZGV4IDE3ZDA0YzcuLmE4NzYyYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuYworKysgYi9kcml2ZXJzL3Njc2kvaXByLmMKQEAgLTQ5MywxNSArNDkzLDE1IEBACiAJIjkwNzI6IExpbmsgbm90IG9wZXJhdGlvbmFsIHRyYW5zaXRpb24ifSwKIAl7MHgwNjZCODIwMCwgMCwgSVBSX0RFRkFVTFRfTE9HX0xFVkVMLAogCSI5MDMyOiBBcnJheSBleHBvc2VkIGJ1dCBzdGlsbCBwcm90ZWN0ZWQifSwKLQl7MHgwNjZCODMwMCwgMCwgSVBSX0RFRkFVTFRfTE9HX0xFVkVMICsgMSwKKwl7MHgwNjZCODMwMCwgMCwgSVBSX0RFQlVHX0xPR19MRVZFTCwKIAkiNzBERDogRGV2aWNlIGZvcmNlZCBmYWlsZWQgYnkgZGlzcnVwdCBkZXZpY2UgY29tbWFuZCJ9LAogCXsweDA2NkI5MTAwLCAwLCBJUFJfREVGQVVMVF9MT0dfTEVWRUwsCiAJIjQwNjE6IE11bHRpcGF0aCByZWR1bmRhbmN5IGxldmVsIGdvdCBiZXR0ZXIifSwKIAl7MHgwNjZCOTIwMCwgMCwgSVBSX0RFRkFVTFRfTE9HX0xFVkVMLAogCSI0MDYwOiBNdWx0aXBhdGggcmVkdW5kYW5jeSBsZXZlbCBnb3Qgd29yc2UifSwKLQl7MHgwNjgwODEwMCwgMCwgSVBSX0RFRkFVTFRfTE9HX0xFVkVMLAorCXsweDA2ODA4MTAwLCAwLCBJUFJfREVCVUdfTE9HX0xFVkVMLAogCSI5MDgzOiBEZXZpY2UgcmF3IG1vZGUgZW5hYmxlZCJ9LAotCXsweDA2ODA4MjAwLCAwLCBJUFJfREVGQVVMVF9MT0dfTEVWRUwsCisJezB4MDY4MDgyMDAsIDAsIElQUl9ERUJVR19MT0dfTEVWRUwsCiAJIjkwODQ6IERldmljZSByYXcgbW9kZSBkaXNhYmxlZCJ9LAogCXsweDA3MjcwMDAwLCAwLCAwLAogCSJGYWlsdXJlIGR1ZSB0byBvdGhlciBkZXZpY2UifSwKQEAgLTE0NzMsNyArMTQ3Myw3IEBACiAJc3RydWN0IGlwcl9ob3N0cmNiICpob3N0cmNiID0gaXByX2NtZC0+dS5ob3N0cmNiOwogCXUzMiBpb2FzYyA9IGJlMzJfdG9fY3B1KGlwcl9jbWQtPnMuaW9hc2EuaGRyLmlvYXNjKTsKIAotCWxpc3RfZGVsKCZob3N0cmNiLT5xdWV1ZSk7CisJbGlzdF9kZWxfaW5pdCgmaG9zdHJjYi0+cXVldWUpOwogCWxpc3RfYWRkX3RhaWwoJmlwcl9jbWQtPnF1ZXVlLCAmaXByX2NtZC0+aHJycS0+aHJycV9mcmVlX3EpOwogCiAJaWYgKGlvYXNjKSB7CkBAIC0yNTUyLDYgKzI1NTIsMjMgQEAKIAl9CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaXByX2hvc3RyY2IgKmlwcl9nZXRfZnJlZV9ob3N0cmNiKHN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hKQoreworCXN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYjsKKworCWhvc3RyY2IgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmlvYS0+aG9zdHJjYl9mcmVlX3EsCisJCQkJCXN0cnVjdCBpcHJfaG9zdHJjYiwgcXVldWUpOworCisJaWYgKHVubGlrZWx5KCFob3N0cmNiKSkgeworCQlkZXZfaW5mbygmaW9hLT5wZGV2LT5kZXYsICJSZWNsYWltaW5nIGFzeW5jIGVycm9yIGJ1ZmZlcnMuIik7CisJCWhvc3RyY2IgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmlvYS0+aG9zdHJjYl9yZXBvcnRfcSwKKwkJCQkJCXN0cnVjdCBpcHJfaG9zdHJjYiwgcXVldWUpOworCX0KKworCWxpc3RfZGVsX2luaXQoJmhvc3RyY2ItPnF1ZXVlKTsKKwlyZXR1cm4gaG9zdHJjYjsKK30KKwogLyoqCiAgKiBpcHJfcHJvY2Vzc19lcnJvciAtIE9wIGRvbmUgZnVuY3Rpb24gZm9yIGFuIGFkYXB0ZXIgZXJyb3IgbG9nLgogICogQGlwcl9jbWQ6CWlwciBjb21tYW5kIHN0cnVjdApAQCAtMjU2OSwxMyArMjU4NiwxNCBAQAogCXN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYiA9IGlwcl9jbWQtPnUuaG9zdHJjYjsKIAl1MzIgaW9hc2MgPSBiZTMyX3RvX2NwdShpcHJfY21kLT5zLmlvYXNhLmhkci5pb2FzYyk7CiAJdTMyIGZkX2lvYXNjOworCWNoYXIgKmVudnBbXSA9IHsgIkFTWU5DX0VSUl9MT0c9MSIsIE5VTEwgfTsKIAogCWlmIChpb2FfY2ZnLT5zaXM2NCkKIAkJZmRfaW9hc2MgPSBiZTMyX3RvX2NwdShob3N0cmNiLT5oY2FtLnUuZXJyb3I2NC5mZF9pb2FzYyk7CiAJZWxzZQogCQlmZF9pb2FzYyA9IGJlMzJfdG9fY3B1KGhvc3RyY2ItPmhjYW0udS5lcnJvci5mZF9pb2FzYyk7CiAKLQlsaXN0X2RlbCgmaG9zdHJjYi0+cXVldWUpOworCWxpc3RfZGVsX2luaXQoJmhvc3RyY2ItPnF1ZXVlKTsKIAlsaXN0X2FkZF90YWlsKCZpcHJfY21kLT5xdWV1ZSwgJmlwcl9jbWQtPmhycnEtPmhycnFfZnJlZV9xKTsKIAogCWlmICghaW9hc2MpIHsKQEAgLTI1ODgsNiArMjYwNiwxMCBAQAogCQkJIkhvc3QgUkNCIGZhaWxlZCB3aXRoIElPQVNDOiAweCUwOFhcbiIsIGlvYXNjKTsKIAl9CiAKKwlsaXN0X2FkZF90YWlsKCZob3N0cmNiLT5xdWV1ZSwgJmlvYV9jZmctPmhvc3RyY2JfcmVwb3J0X3EpOworCWhvc3RyY2IgPSBpcHJfZ2V0X2ZyZWVfaG9zdHJjYihpb2FfY2ZnKTsKKwlrb2JqZWN0X3VldmVudF9lbnYoJmlvYV9jZmctPmhvc3QtPnNob3N0X2Rldi5rb2JqLCBLT0JKX0NIQU5HRSwgZW52cCk7CisKIAlpcHJfc2VuZF9oY2FtKGlvYV9jZmcsIElQUl9IQ0FNX0NEQl9PUF9DT0RFX0xPR19EQVRBLCBob3N0cmNiKTsKIH0KIApAQCAtNDA5NSw2ICs0MTE3LDY0IEBACiAJLnNob3cgPSBpcHJfc2hvd19md190eXBlCiB9OwogCitzdGF0aWMgc3NpemVfdCBpcHJfcmVhZF9hc3luY19lcnJfbG9nKHN0cnVjdCBmaWxlICpmaWxlcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLCBjaGFyICpidWYsCisJCQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBkZXZpY2UgKmNkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2hvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYjsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCWhvc3RyY2IgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmlvYV9jZmctPmhvc3RyY2JfcmVwb3J0X3EsCisJCQkJCXN0cnVjdCBpcHJfaG9zdHJjYiwgcXVldWUpOworCWlmICghaG9zdHJjYikgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGlvYV9jZmctPmhvc3QtPmhvc3RfbG9jaywgbG9ja19mbGFncyk7CisJCXJldHVybiAwOworCX0KKwlyZXQgPSBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmb2ZmLCAmaG9zdHJjYi0+aGNhbSwKKwkJCQlzaXplb2YoaG9zdHJjYi0+aGNhbSkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBpcHJfbmV4dF9hc3luY19lcnJfbG9nKHN0cnVjdCBmaWxlICpmaWxlcCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLCBjaGFyICpidWYsCisJCQkJbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBkZXZpY2UgKmNkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3QgaXByX2lvYV9jZmcgKmlvYV9jZmcgPSAoc3RydWN0IGlwcl9pb2FfY2ZnICopc2hvc3QtPmhvc3RkYXRhOworCXN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYjsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlob3N0cmNiID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZpb2FfY2ZnLT5ob3N0cmNiX3JlcG9ydF9xLAorCQkJCQlzdHJ1Y3QgaXByX2hvc3RyY2IsIHF1ZXVlKTsKKwlpZiAoIWhvc3RyY2IpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShpb2FfY2ZnLT5ob3N0LT5ob3N0X2xvY2ssIGxvY2tfZmxhZ3MpOworCQlyZXR1cm4gY291bnQ7CisJfQorCisJLyogUmVjbGFpbSBob3N0cmNiIGJlZm9yZSBleGl0ICovCisJbGlzdF9tb3ZlX3RhaWwoJmhvc3RyY2ItPnF1ZXVlLCAmaW9hX2NmZy0+aG9zdHJjYl9mcmVlX3EpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaW9hX2NmZy0+aG9zdC0+aG9zdF9sb2NrLCBsb2NrX2ZsYWdzKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBpcHJfaW9hX2FzeW5jX2Vycl9sb2cgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0JCSJhc3luY19lcnJfbG9nIiwKKwkJLm1vZGUgPQkJU19JUlVHTyB8IFNfSVdVU1IsCisJfSwKKwkuc2l6ZSA9IDAsCisJLnJlYWQgPSBpcHJfcmVhZF9hc3luY19lcnJfbG9nLAorCS53cml0ZSA9IGlwcl9uZXh0X2FzeW5jX2Vycl9sb2cKK307CisKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqaXByX2lvYV9hdHRyc1tdID0gewogCSZpcHJfZndfdmVyc2lvbl9hdHRyLAogCSZpcHJfbG9nX2xldmVsX2F0dHIsCkBAIC03MDI2LDggKzcxMDYsNyBAQAogewogCXN0cnVjdCBpcHJfaW9hX2NmZyAqaW9hX2NmZyA9IGlwcl9jbWQtPmlvYV9jZmc7CiAJc3RydWN0IGlwcl9yZXNvdXJjZV9lbnRyeSAqcmVzOwotCXN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYiwgKnRlbXA7Ci0JaW50IGkgPSAwLCBqOworCWludCBqOwogCiAJRU5URVI7CiAJaW9hX2NmZy0+aW5fcmVzZXRfcmVsb2FkID0gMDsKQEAgLTcwNDgsMTIgKzcxMjcsMTYgQEAKIAl9CiAJc2NoZWR1bGVfd29yaygmaW9hX2NmZy0+d29ya19xKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3N0cmNiLCB0ZW1wLCAmaW9hX2NmZy0+aG9zdHJjYl9mcmVlX3EsIHF1ZXVlKSB7Ci0JCWxpc3RfZGVsKCZob3N0cmNiLT5xdWV1ZSk7Ci0JCWlmIChpKysgPCBJUFJfTlVNX0xPR19IQ0FNUykKLQkJCWlwcl9zZW5kX2hjYW0oaW9hX2NmZywgSVBSX0hDQU1fQ0RCX09QX0NPREVfTE9HX0RBVEEsIGhvc3RyY2IpOworCWZvciAoaiA9IDA7IGogPCBJUFJfTlVNX0hDQU1TOyBqKyspIHsKKwkJbGlzdF9kZWxfaW5pdCgmaW9hX2NmZy0+aG9zdHJjYltqXS0+cXVldWUpOworCQlpZiAoaiA8IElQUl9OVU1fTE9HX0hDQU1TKQorCQkJaXByX3NlbmRfaGNhbShpb2FfY2ZnLAorCQkJCUlQUl9IQ0FNX0NEQl9PUF9DT0RFX0xPR19EQVRBLAorCQkJCWlvYV9jZmctPmhvc3RyY2Jbal0pOwogCQllbHNlCi0JCQlpcHJfc2VuZF9oY2FtKGlvYV9jZmcsIElQUl9IQ0FNX0NEQl9PUF9DT0RFX0NPTkZJR19DSEFOR0UsIGhvc3RyY2IpOworCQkJaXByX3NlbmRfaGNhbShpb2FfY2ZnLAorCQkJCUlQUl9IQ0FNX0NEQl9PUF9DT0RFX0NPTkZJR19DSEFOR0UsCisJCQkJaW9hX2NmZy0+aG9zdHJjYltqXSk7CiAJfQogCiAJc2NzaV9yZXBvcnRfYnVzX3Jlc2V0KGlvYV9jZmctPmhvc3QsIElQUl9WU0VUX0JVUyk7CkBAIC03OTY2LDcgKzgwNDksOCBAQAogCiAJRU5URVI7CiAJaXByX2NtZC0+am9iX3N0ZXAgPSBpcHJfaW9hZnBfc3RkX2lucXVpcnk7Ci0JZGV2X2luZm8oJmlvYV9jZmctPnBkZXYtPmRldiwgIlN0YXJ0aW5nIElPQSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS5cbiIpOworCWlmIChpb2FfY2ZnLT5pZGVudGlmeV9ocnJxX2luZGV4ID09IDApCisJCWRldl9pbmZvKCZpb2FfY2ZnLT5wZGV2LT5kZXYsICJTdGFydGluZyBJT0EgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UuXG4iKTsKIAogCWlmIChpb2FfY2ZnLT5pZGVudGlmeV9ocnJxX2luZGV4IDwgaW9hX2NmZy0+aHJycV9udW0pIHsKIAkJaHJycSA9ICZpb2FfY2ZnLT5ocnJxW2lvYV9jZmctPmlkZW50aWZ5X2hycnFfaW5kZXhdOwpAQCAtODMzNSw3ICs4NDE5LDcgQEAKIAogCWhvc3RyY2IgPSBsaXN0X2VudHJ5KGlvYV9jZmctPmhvc3RyY2JfZnJlZV9xLm5leHQsCiAJCQkgICAgIHN0cnVjdCBpcHJfaG9zdHJjYiwgcXVldWUpOwotCWxpc3RfZGVsKCZob3N0cmNiLT5xdWV1ZSk7CisJbGlzdF9kZWxfaW5pdCgmaG9zdHJjYi0+cXVldWUpOwogCW1lbXNldCgmaG9zdHJjYi0+aGNhbSwgMCwgc2l6ZW9mKGhvc3RyY2ItPmhjYW0pKTsKIAogCXJjID0gaXByX2dldF9sZHVtcF9kYXRhX3NlY3Rpb24oaW9hX2NmZywKQEAgLTkzMzIsNyArOTQxNiw3IEBACiAJZG1hX2ZyZWVfY29oZXJlbnQoJmlvYV9jZmctPnBkZXYtPmRldiwgaW9hX2NmZy0+Y2ZnX3RhYmxlX3NpemUsCiAJCQkgIGlvYV9jZmctPnUuY2ZnX3RhYmxlLCBpb2FfY2ZnLT5jZmdfdGFibGVfZG1hKTsKIAotCWZvciAoaSA9IDA7IGkgPCBJUFJfTlVNX0hDQU1TOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgSVBSX01BWF9IQ0FNUzsgaSsrKSB7CiAJCWRtYV9mcmVlX2NvaGVyZW50KCZpb2FfY2ZnLT5wZGV2LT5kZXYsCiAJCQkJICBzaXplb2Yoc3RydWN0IGlwcl9ob3N0cmNiKSwKIAkJCQkgIGlvYV9jZmctPmhvc3RyY2JbaV0sCkBAIC05NTcyLDcgKzk2NTYsNyBAQAogCWlmICghaW9hX2NmZy0+dS5jZmdfdGFibGUpCiAJCWdvdG8gb3V0X2ZyZWVfaG9zdF9ycnE7CiAKLQlmb3IgKGkgPSAwOyBpIDwgSVBSX05VTV9IQ0FNUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IElQUl9NQVhfSENBTVM7IGkrKykgewogCQlpb2FfY2ZnLT5ob3N0cmNiW2ldID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsCiAJCQkJCQkJIHNpemVvZihzdHJ1Y3QgaXByX2hvc3RyY2IpLAogCQkJCQkJCSAmaW9hX2NmZy0+aG9zdHJjYl9kbWFbaV0sCkBAIC05NzE0LDYgKzk3OTgsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPmhvc3RyY2JfZnJlZV9xKTsKIAlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+aG9zdHJjYl9wZW5kaW5nX3EpOworCUlOSVRfTElTVF9IRUFEKCZpb2FfY2ZnLT5ob3N0cmNiX3JlcG9ydF9xKTsKIAlJTklUX0xJU1RfSEVBRCgmaW9hX2NmZy0+ZnJlZV9yZXNfcSk7CiAJSU5JVF9MSVNUX0hFQUQoJmlvYV9jZmctPnVzZWRfcmVzX3EpOwogCUlOSVRfV09SSygmaW9hX2NmZy0+d29ya19xLCBpcHJfd29ya2VyX3RocmVhZCk7CkBAIC0xMDM1Miw2ICsxMDQzNyw4IEBACiAJCQkgICAgICAmaXByX3RyYWNlX2F0dHIpOwogCWlwcl9yZW1vdmVfZHVtcF9maWxlKCZpb2FfY2ZnLT5ob3N0LT5zaG9zdF9kZXYua29iaiwKIAkJCSAgICAgJmlwcl9kdW1wX2F0dHIpOworCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW9hX2NmZy0+aG9zdC0+c2hvc3RfZGV2LmtvYmosCisJCQkmaXByX2lvYV9hc3luY19lcnJfbG9nKTsKIAlzY3NpX3JlbW92ZV9ob3N0KGlvYV9jZmctPmhvc3QpOwogCiAJX19pcHJfcmVtb3ZlKHBkZXYpOwpAQCAtMTA0MDAsMTAgKzEwNDg3LDI1IEBACiAJCXJldHVybiByYzsKIAl9CiAKKwlyYyA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaW9hX2NmZy0+aG9zdC0+c2hvc3RfZGV2LmtvYmosCisJCQkmaXByX2lvYV9hc3luY19lcnJfbG9nKTsKKworCWlmIChyYykgeworCQlpcHJfcmVtb3ZlX2R1bXBfZmlsZSgmaW9hX2NmZy0+aG9zdC0+c2hvc3RfZGV2LmtvYmosCisJCQkJJmlwcl9kdW1wX2F0dHIpOworCQlpcHJfcmVtb3ZlX3RyYWNlX2ZpbGUoJmlvYV9jZmctPmhvc3QtPnNob3N0X2Rldi5rb2JqLAorCQkJCSZpcHJfdHJhY2VfYXR0cik7CisJCXNjc2lfcmVtb3ZlX2hvc3QoaW9hX2NmZy0+aG9zdCk7CisJCV9faXByX3JlbW92ZShwZGV2KTsKKwkJcmV0dXJuIHJjOworCX0KKwogCXJjID0gaXByX2NyZWF0ZV9kdW1wX2ZpbGUoJmlvYV9jZmctPmhvc3QtPnNob3N0X2Rldi5rb2JqLAogCQkJCSAgICZpcHJfZHVtcF9hdHRyKTsKIAogCWlmIChyYykgeworCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmlvYV9jZmctPmhvc3QtPnNob3N0X2Rldi5rb2JqLAorCQkJCSAgICAgICZpcHJfaW9hX2FzeW5jX2Vycl9sb2cpOwogCQlpcHJfcmVtb3ZlX3RyYWNlX2ZpbGUoJmlvYV9jZmctPmhvc3QtPnNob3N0X2Rldi5rb2JqLAogCQkJCSAgICAgICZpcHJfdHJhY2VfYXR0cik7CiAJCXNjc2lfcmVtb3ZlX2hvc3QoaW9hX2NmZy0+aG9zdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvaXByLmggYi9kcml2ZXJzL3Njc2kvaXByLmgKaW5kZXggY2RiNTE5Ni4uODk5NTA1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2lwci5oCisrKyBiL2RyaXZlcnMvc2NzaS9pcHIuaApAQCAtMTU0LDcgKzE1NCw5IEBACiAjZGVmaW5lIElQUl9ERUZBVUxUX01BWF9FUlJPUl9EVU1QCQkJOTg0CiAjZGVmaW5lIElQUl9OVU1fTE9HX0hDQU1TCQkJCTIKICNkZWZpbmUgSVBSX05VTV9DRkdfQ0hHX0hDQU1TCQkJCTIKKyNkZWZpbmUgSVBSX05VTV9IQ0FNX1FVRVVFCQkJCTEyCiAjZGVmaW5lIElQUl9OVU1fSENBTVMJKElQUl9OVU1fTE9HX0hDQU1TICsgSVBSX05VTV9DRkdfQ0hHX0hDQU1TKQorI2RlZmluZSBJUFJfTUFYX0hDQU1TCShJUFJfTlVNX0hDQU1TICsgSVBSX05VTV9IQ0FNX1FVRVVFKQogCiAjZGVmaW5lIElQUl9NQVhfU0lTNjRfVEFSR0VUU19QRVJfQlVTCQkJMTAyNAogI2RlZmluZSBJUFJfTUFYX1NJUzY0X0xVTlNfUEVSX1RBUkdFVAkJCTB4ZmZmZmZmZmYKQEAgLTE1MDQsNiArMTUwNiw3IEBACiAJdTggbG9nX2xldmVsOwogI2RlZmluZSBJUFJfTUFYX0xPR19MRVZFTAkJCTQKICNkZWZpbmUgSVBSX0RFRkFVTFRfTE9HX0xFVkVMCQkyCisjZGVmaW5lIElQUl9ERUJVR19MT0dfTEVWRUwJCTMKIAogI2RlZmluZSBJUFJfTlVNX1RSQUNFX0lOREVYX0JJVFMJOAogI2RlZmluZSBJUFJfTlVNX1RSQUNFX0VOVFJJRVMJCSgxIDw8IElQUl9OVU1fVFJBQ0VfSU5ERVhfQklUUykKQEAgLTE1MzIsMTAgKzE1MzUsMTEgQEAKIAogCWNoYXIgaXByX2hjYW1fbGFiZWxbOF07CiAjZGVmaW5lIElQUl9IQ0FNX0xBQkVMCQkJImhjYW1zIgotCXN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYltJUFJfTlVNX0hDQU1TXTsKLQlkbWFfYWRkcl90IGhvc3RyY2JfZG1hW0lQUl9OVU1fSENBTVNdOworCXN0cnVjdCBpcHJfaG9zdHJjYiAqaG9zdHJjYltJUFJfTUFYX0hDQU1TXTsKKwlkbWFfYWRkcl90IGhvc3RyY2JfZG1hW0lQUl9NQVhfSENBTVNdOwogCXN0cnVjdCBsaXN0X2hlYWQgaG9zdHJjYl9mcmVlX3E7CiAJc3RydWN0IGxpc3RfaGVhZCBob3N0cmNiX3BlbmRpbmdfcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhvc3RyY2JfcmVwb3J0X3E7CiAKIAlzdHJ1Y3QgaXByX2hycl9xdWV1ZSBocnJxW0lQUl9NQVhfSFJSUV9OVU1dOwogCXUzMiBocnJxX251bTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19leGNoLmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZXhjaC5jCmluZGV4IGU3MjY3M2IuLjE2Y2EzMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19leGNoLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYwpAQCAtMTgzNyw3ICsxODM3LDYgQEAKIAlpbnQgcmMgPSAxOwogCiAJc3Bpbl9sb2NrX2JoKCZlcC0+ZXhfbG9jayk7Ci0JZmNfZXhjaF9hYm9ydF9sb2NrZWQoZXAsIDApOwogCWVwLT5zdGF0ZSB8PSBGQ19FWF9SU1RfQ0xFQU5VUDsKIAlmY19leGNoX3RpbWVyX2NhbmNlbChlcCk7CiAJaWYgKGVwLT5lc2Jfc3RhdCAmIEVTQl9TVF9SRUNfUVVBTCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19ycG9ydC5jIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMKaW5kZXggOTNmNTk2MS4uOTdhZWFkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX3Jwb3J0LmMKQEAgLTQ1Nyw2ICs0NTcsOSBAQAogICovCiBzdGF0aWMgaW50IGZjX3Jwb3J0X2xvZ29mZihzdHJ1Y3QgZmNfcnBvcnRfcHJpdiAqcmRhdGEpCiB7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHJkYXRhLT5sb2NhbF9wb3J0OworCXUzMiBwb3J0X2lkID0gcmRhdGEtPmlkcy5wb3J0X2lkOworCiAJbXV0ZXhfbG9jaygmcmRhdGEtPnJwX211dGV4KTsKIAogCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlbW92ZSBwb3J0XG4iKTsKQEAgLTQ2Niw2ICs0NjksMTUgQEAKIAkJRkNfUlBPUlRfREJHKHJkYXRhLCAiUG9ydCBpbiBEZWxldGUgc3RhdGUsIG5vdCByZW1vdmluZ1xuIik7CiAJCWdvdG8gb3V0OwogCX0KKwkvKgorCSAqIEZDLUxTIHN0YXRlczoKKwkgKiBUbyBleHBsaWNpdGx5IExvZ291dCwgdGhlIGluaXRpYXRpbmcgTnhfUG9ydCBzaGFsbCB0ZXJtaW5hdGUKKwkgKiBvdGhlciBvcGVuIFNlcXVlbmNlcyB0aGF0IGl0IGluaXRpYXRlZCB3aXRoIHRoZSBkZXN0aW5hdGlvbgorCSAqIE54X1BvcnQgcHJpb3IgdG8gcGVyZm9ybWluZyBMb2dvdXQuCisJICovCisJbHBvcnQtPnR0LmV4Y2hfbWdyX3Jlc2V0KGxwb3J0LCAwLCBwb3J0X2lkKTsKKwlscG9ydC0+dHQuZXhjaF9tZ3JfcmVzZXQobHBvcnQsIHBvcnRfaWQsIDApOworCiAJZmNfcnBvcnRfZW50ZXJfbG9nbyhyZGF0YSk7CiAKIAkvKgpAQCAtNTQ3LDE2ICs1NTksMjQgQEAKICAqLwogc3RhdGljIHZvaWQgZmNfcnBvcnRfZXJyb3Ioc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhLCBzdHJ1Y3QgZmNfZnJhbWUgKmZwKQogeworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSByZGF0YS0+bG9jYWxfcG9ydDsKKwogCUZDX1JQT1JUX0RCRyhyZGF0YSwgIkVycm9yICVsZCBpbiBzdGF0ZSAlcywgcmV0cmllcyAlZFxuIiwKIAkJICAgICBJU19FUlIoZnApID8gLVBUUl9FUlIoZnApIDogMCwKIAkJICAgICBmY19ycG9ydF9zdGF0ZShyZGF0YSksIHJkYXRhLT5yZXRyaWVzKTsKIAogCXN3aXRjaCAocmRhdGEtPnJwX3N0YXRlKSB7CiAJY2FzZSBSUE9SVF9TVF9GTE9HSToKLQljYXNlIFJQT1JUX1NUX1BMT0dJOgogCQlyZGF0YS0+ZmxhZ3MgJj0gfkZDX1JQX1NUQVJURUQ7CiAJCWZjX3Jwb3J0X2VudGVyX2RlbGV0ZShyZGF0YSwgUlBPUlRfRVZfRkFJTEVEKTsKIAkJYnJlYWs7CisJY2FzZSBSUE9SVF9TVF9QTE9HSToKKwkJaWYgKGxwb3J0LT5wb2ludF90b19tdWx0aXBvaW50KSB7CisJCQlyZGF0YS0+ZmxhZ3MgJj0gfkZDX1JQX1NUQVJURUQ7CisJCQlmY19ycG9ydF9lbnRlcl9kZWxldGUocmRhdGEsIFJQT1JUX0VWX0ZBSUxFRCk7CisJCX0gZWxzZQorCQkJZmNfcnBvcnRfZW50ZXJfbG9nbyhyZGF0YSk7CisJCWJyZWFrOwogCWNhc2UgUlBPUlRfU1RfUlRWOgogCQlmY19ycG9ydF9lbnRlcl9yZWFkeShyZGF0YSk7CiAJCWJyZWFrOwpAQCAtMTg3Nyw3ICsxODk3LDcgQEAKIAlzcHAtPnNwcF90eXBlX2V4dCA9IHJzcHAtPnNwcF90eXBlX2V4dDsKIAlzcHAtPnNwcF9mbGFncyA9IEZDX1NQUF9SRVNQX0FDSzsKIAotCWZjX3Jwb3J0X2VudGVyX2RlbGV0ZShyZGF0YSwgUlBPUlRfRVZfTE9HTyk7CisJZmNfcnBvcnRfZW50ZXJfcHJsaShyZGF0YSk7CiAKIAlmY19maWxsX3JlcGx5X2hkcihmcCwgcnhfZnAsIEZDX1JDVExfRUxTX1JFUCwgMCk7CiAJbHBvcnQtPnR0LmZyYW1lX3NlbmQobHBvcnQsIGZwKTsKQEAgLTE5MTUsNyArMTkzNSw3IEBACiAJCUZDX1JQT1JUX0RCRyhyZGF0YSwgIlJlY2VpdmVkIExPR08gcmVxdWVzdCB3aGlsZSBpbiBzdGF0ZSAlc1xuIiwKIAkJCSAgICAgZmNfcnBvcnRfc3RhdGUocmRhdGEpKTsKIAotCQlmY19ycG9ydF9lbnRlcl9kZWxldGUocmRhdGEsIFJQT1JUX0VWX0xPR08pOworCQlmY19ycG9ydF9lbnRlcl9kZWxldGUocmRhdGEsIFJQT1JUX0VWX1NUT1ApOwogCQltdXRleF91bmxvY2soJnJkYXRhLT5ycF9tdXRleCk7CiAJCWtyZWZfcHV0KCZyZGF0YS0+a3JlZiwgcmRhdGEtPmxvY2FsX3BvcnQtPnR0LnJwb3J0X2Rlc3Ryb3kpOwogCX0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jdC5jCmluZGV4IDYzZTQ4ZDQuLjRhYzAzYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfY3QuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2N0LmMKQEAgLTE1MzUsNyArMTUzNSw3IEBACiB9CiAKIC8qIFJvdXRpbmVzIGZvciBhbGwgaW5kaXZpZHVhbCBIQkEgYXR0cmlidXRlcyAqLwotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfaGJhX2F0dHJfd3dubihzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewogCXN0cnVjdCBscGZjX2ZkbWlfYXR0cl9lbnRyeSAqYWU7CkBAIC0xNTUxLDcgKzE1NTEsNyBAQAogCWFkLT5BdHRyVHlwZSA9IGNwdV90b19iZTE2KFJIQkFfTk9ERU5BTUUpOwogCXJldHVybiBzaXplOwogfQotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfaGJhX2F0dHJfbWFudWZhY3R1cmVyKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwKIAkJCQlzdHJ1Y3QgbHBmY19mZG1pX2F0dHJfZGVmICphZCkKIHsKQEAgLTE1NzMsNyArMTU3Myw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWludAorc3RhdGljIGludAogbHBmY19mZG1pX2hiYV9hdHRyX3NuKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CiAJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gdnBvcnQtPnBoYmE7CkBAIC0xNTk0LDcgKzE1OTQsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9oYmFfYXR0cl9tb2RlbChzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0xNjE1LDcgKzE2MTUsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9oYmFfYXR0cl9kZXNjcmlwdGlvbihzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgICAgICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0xNjM3LDcgKzE2MzcsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9oYmFfYXR0cl9oZHdfdmVyKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwKIAkJCSAgIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMTY2OSw3ICsxNjY5LDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfaGJhX2F0dHJfZHJ2cl92ZXIoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJICAgIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMTY5MCw3ICsxNjkwLDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfaGJhX2F0dHJfcm9tX3ZlcihzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgICBzdHJ1Y3QgbHBmY19mZG1pX2F0dHJfZGVmICphZCkKIHsKQEAgLTE3MTUsNyArMTcxNSw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWludAorc3RhdGljIGludAogbHBmY19mZG1pX2hiYV9hdHRyX2Ztd192ZXIoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0xNzM2LDcgKzE3MzYsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9oYmFfYXR0cl9vc192ZXIoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJICBzdHJ1Y3QgbHBmY19mZG1pX2F0dHJfZGVmICphZCkKIHsKQEAgLTE3NTksNyArMTc1OSw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWludAorc3RhdGljIGludAogbHBmY19mZG1pX2hiYV9hdHRyX2N0X2xlbihzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMTc3NSw3ICsxNzc1LDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfaGJhX2F0dHJfc3ltYm9saWNfbmFtZShzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkJIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMTc5NCw3ICsxNzk0LDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfaGJhX2F0dHJfdmVuZG9yX2luZm8oc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJICAgICAgIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMTgxMSw3ICsxODExLDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfaGJhX2F0dHJfbnVtX3BvcnRzKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwKIAkJCSAgICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0xODI4LDcgKzE4MjgsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9oYmFfYXR0cl9mYWJyaWNfd3dubihzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgICAgICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0xODQ2LDcgKzE4NDYsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9oYmFfYXR0cl9iaW9zX3ZlcihzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0xODY3LDcgKzE4NjcsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9oYmFfYXR0cl9iaW9zX3N0YXRlKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwKIAkJCSAgICAgIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMTg4NCw3ICsxODg0LDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfaGJhX2F0dHJfdmVuZG9yX2lkKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwKIAkJCSAgICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0xOTA2LDcgKzE5MDYsNyBAQAogfQogCiAvKiBSb3V0aW5lcyBmb3IgYWxsIGluZGl2aWR1YWwgUE9SVCBhdHRyaWJ1dGVzICovCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9wb3J0X2F0dHJfZmM0dHlwZShzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0xOTI1LDcgKzE5MjUsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9wb3J0X2F0dHJfc3VwcG9ydF9zcGVlZChzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkJICBzdHJ1Y3QgbHBmY19mZG1pX2F0dHJfZGVmICphZCkKIHsKQEAgLTE5NzUsNyArMTk3NSw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWludAorc3RhdGljIGludAogbHBmY19mZG1pX3BvcnRfYXR0cl9zcGVlZChzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMjAzOSw3ICsyMDM5LDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfcG9ydF9hdHRyX21heF9mcmFtZShzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgICAgICBzdHJ1Y3QgbHBmY19mZG1pX2F0dHJfZGVmICphZCkKIHsKQEAgLTIwNTksNyArMjA1OSw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWludAorc3RhdGljIGludAogbHBmY19mZG1pX3BvcnRfYXR0cl9vc19kZXZuYW1lKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwKIAkJCSAgICAgICBzdHJ1Y3QgbHBmY19mZG1pX2F0dHJfZGVmICphZCkKIHsKQEAgLTIwODEsNyArMjA4MSw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWludAorc3RhdGljIGludAogbHBmY19mZG1pX3BvcnRfYXR0cl9ob3N0X25hbWUoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJICAgICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0yMTAyLDcgKzIxMDIsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9wb3J0X2F0dHJfd3dubihzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0yMTIwLDcgKzIxMjAsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9wb3J0X2F0dHJfd3dwbihzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0yMTM4LDcgKzIxMzgsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9wb3J0X2F0dHJfc3ltYm9saWNfbmFtZShzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkJICBzdHJ1Y3QgbHBmY19mZG1pX2F0dHJfZGVmICphZCkKIHsKQEAgLTIxNTYsNyArMjE1Niw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWludAorc3RhdGljIGludAogbHBmY19mZG1pX3BvcnRfYXR0cl9wb3J0X3R5cGUoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJICAgICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0yMTc1LDcgKzIxNzUsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9wb3J0X2F0dHJfY2xhc3Moc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJICBzdHJ1Y3QgbHBmY19mZG1pX2F0dHJfZGVmICphZCkKIHsKQEAgLTIxOTAsNyArMjE5MCw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWludAorc3RhdGljIGludAogbHBmY19mZG1pX3BvcnRfYXR0cl9mYWJyaWNfd3dwbihzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkJc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0yMjA4LDcgKzIyMDgsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9wb3J0X2F0dHJfYWN0aXZlX2ZjNHR5cGUoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJCSAgIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMjIyNyw3ICsyMjI3LDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfcG9ydF9hdHRyX3BvcnRfc3RhdGUoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJICAgICAgIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMjI0Myw3ICsyMjQzLDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfcG9ydF9hdHRyX251bV9kaXNjKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwKIAkJCSAgICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0yMjU5LDcgKzIyNTksNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9wb3J0X2F0dHJfbnBvcnRpZChzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0yMjc0LDcgKzIyNzQsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9zbWFydF9hdHRyX3NlcnZpY2Uoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJICAgICBzdHJ1Y3QgbHBmY19mZG1pX2F0dHJfZGVmICphZCkKIHsKQEAgLTIyOTUsNyArMjI5NSw3IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWludAorc3RhdGljIGludAogbHBmY19mZG1pX3NtYXJ0X2F0dHJfZ3VpZChzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMjMxNiw3ICsyMzE2LDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfc21hcnRfYXR0cl92ZXJzaW9uKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwKIAkJCSAgICAgc3RydWN0IGxwZmNfZmRtaV9hdHRyX2RlZiAqYWQpCiB7CkBAIC0yMzM3LDcgKzIzMzcsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIGxwZmNfZmRtaV9zbWFydF9hdHRyX21vZGVsKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCwKIAkJCSAgIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMjM1OCw3ICsyMzU4LDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfc21hcnRfYXR0cl9wb3J0X2luZm8oc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJICAgICAgIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMjM3OCw3ICsyMzc4LDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfc21hcnRfYXR0cl9xb3Moc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LAogCQkJIHN0cnVjdCBscGZjX2ZkbWlfYXR0cl9kZWYgKmFkKQogewpAQCAtMjM5Myw3ICsyMzkzLDcgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotaW50CitzdGF0aWMgaW50CiBscGZjX2ZkbWlfc21hcnRfYXR0cl9zZWN1cml0eShzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsCiAJCQkgICAgICBzdHJ1Y3QgbHBmY19mZG1pX2F0dHJfZGVmICphZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCmluZGV4IGMwYWYzMmYuLmI3ZDU0YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYwpAQCAtNDYxNyw3ICs0NjE3LDcgQEAKIAlyZXR1cm4gc2VudHBsb2dpOwogfQogCi11aW50MzJfdAorc3RhdGljIHVpbnQzMl90CiBscGZjX3JkcF9yZXNfbGlua19zZXJ2aWNlKHN0cnVjdCBmY19yZHBfbGlua19zZXJ2aWNlX2Rlc2MgKmRlc2MsCiAJCXVpbnQzMl90IHdvcmQwKQogewpAQCAtNDYyOSw3ICs0NjI5LDcgQEAKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19yZHBfbGlua19zZXJ2aWNlX2Rlc2MpOwogfQogCi11aW50MzJfdAorc3RhdGljIHVpbnQzMl90CiBscGZjX3JkcF9yZXNfc2ZwX2Rlc2Moc3RydWN0IGZjX3JkcF9zZnBfZGVzYyAqZGVzYywKIAkJdWludDhfdCAqcGFnZV9hMCwgdWludDhfdCAqcGFnZV9hMikKIHsKQEAgLTQ2OTQsNyArNDY5NCw3IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfcmRwX3NmcF9kZXNjKTsKIH0KIAotdWludDMyX3QKK3N0YXRpYyB1aW50MzJfdAogbHBmY19yZHBfcmVzX2xpbmtfZXJyb3Ioc3RydWN0IGZjX3JkcF9saW5rX2Vycm9yX3N0YXR1c19kZXNjICpkZXNjLAogCQlSRUFEX0xOS19WQVIgKnN0YXQpCiB7CkBAIC00NzIzLDcgKzQ3MjMsNyBAQAogCXJldHVybiBzaXplb2Yoc3RydWN0IGZjX3JkcF9saW5rX2Vycm9yX3N0YXR1c19kZXNjKTsKIH0KIAotdWludDMyX3QKK3N0YXRpYyB1aW50MzJfdAogbHBmY19yZHBfcmVzX2JiY19kZXNjKHN0cnVjdCBmY19yZHBfYmJjX2Rlc2MgKmRlc2MsIFJFQURfTE5LX1ZBUiAqc3RhdCwKIAkJICAgICAgc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0KQogewpAQCAtNDc0OCw3ICs0NzQ4LDcgQEAKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19yZHBfYmJjX2Rlc2MpOwogfQogCi11aW50MzJfdAorc3RhdGljIHVpbnQzMl90CiBscGZjX3JkcF9yZXNfb2VkX3RlbXBfZGVzYyhzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsCiAJCQkgICBzdHJ1Y3QgZmNfcmRwX29lZF9zZnBfZGVzYyAqZGVzYywgdWludDhfdCAqcGFnZV9hMikKIHsKQEAgLTQ3NzYsNyArNDc3Niw3IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfcmRwX29lZF9zZnBfZGVzYyk7CiB9CiAKLXVpbnQzMl90CitzdGF0aWMgdWludDMyX3QKIGxwZmNfcmRwX3Jlc19vZWRfdm9sdGFnZV9kZXNjKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwKIAkJCSAgICAgIHN0cnVjdCBmY19yZHBfb2VkX3NmcF9kZXNjICpkZXNjLAogCQkJICAgICAgdWludDhfdCAqcGFnZV9hMikKQEAgLTQ4MDUsNyArNDgwNSw3IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfcmRwX29lZF9zZnBfZGVzYyk7CiB9CiAKLXVpbnQzMl90CitzdGF0aWMgdWludDMyX3QKIGxwZmNfcmRwX3Jlc19vZWRfdHhiaWFzX2Rlc2Moc3RydWN0IGxwZmNfaGJhICpwaGJhLAogCQkJICAgICBzdHJ1Y3QgZmNfcmRwX29lZF9zZnBfZGVzYyAqZGVzYywKIAkJCSAgICAgdWludDhfdCAqcGFnZV9hMikKQEAgLTQ4MzQsNyArNDgzNCw3IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfcmRwX29lZF9zZnBfZGVzYyk7CiB9CiAKLXVpbnQzMl90CitzdGF0aWMgdWludDMyX3QKIGxwZmNfcmRwX3Jlc19vZWRfdHhwb3dlcl9kZXNjKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwKIAkJCSAgICAgIHN0cnVjdCBmY19yZHBfb2VkX3NmcF9kZXNjICpkZXNjLAogCQkJICAgICAgdWludDhfdCAqcGFnZV9hMikKQEAgLTQ4NjQsNyArNDg2NCw3IEBACiB9CiAKIAotdWludDMyX3QKK3N0YXRpYyB1aW50MzJfdAogbHBmY19yZHBfcmVzX29lZF9yeHBvd2VyX2Rlc2Moc3RydWN0IGxwZmNfaGJhICpwaGJhLAogCQkJICAgICAgc3RydWN0IGZjX3JkcF9vZWRfc2ZwX2Rlc2MgKmRlc2MsCiAJCQkgICAgICB1aW50OF90ICpwYWdlX2EyKQpAQCAtNDg5Myw3ICs0ODkzLDcgQEAKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19yZHBfb2VkX3NmcF9kZXNjKTsKIH0KIAotdWludDMyX3QKK3N0YXRpYyB1aW50MzJfdAogbHBmY19yZHBfcmVzX29wZF9kZXNjKHN0cnVjdCBmY19yZHBfb3BkX3NmcF9kZXNjICpkZXNjLAogCQkgICAgICB1aW50OF90ICpwYWdlX2EwLCBzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQpCiB7CkBAIC00OTA3LDcgKzQ5MDcsNyBAQAogCXJldHVybiBzaXplb2Yoc3RydWN0IGZjX3JkcF9vcGRfc2ZwX2Rlc2MpOwogfQogCi11aW50MzJfdAorc3RhdGljIHVpbnQzMl90CiBscGZjX3JkcF9yZXNfZmVjX2Rlc2Moc3RydWN0IGZjX2ZlY19yZHBfZGVzYyAqZGVzYywgUkVBRF9MTktfVkFSICpzdGF0KQogewogCWlmIChiZl9nZXQobHBmY19yZWFkX2xpbmtfc3RhdF9nZWMyLCBzdGF0KSA9PSAwKQpAQCAtNDkyNCw3ICs0OTI0LDcgQEAKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19mZWNfcmRwX2Rlc2MpOwogfQogCi11aW50MzJfdAorc3RhdGljIHVpbnQzMl90CiBscGZjX3JkcF9yZXNfc3BlZWQoc3RydWN0IGZjX3JkcF9wb3J0X3NwZWVkX2Rlc2MgKmRlc2MsIHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKIAl1aW50MTZfdCByZHBfY2FwID0gMDsKQEAgLTQ5ODYsNyArNDk4Niw3IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfcmRwX3BvcnRfc3BlZWRfZGVzYyk7CiB9CiAKLXVpbnQzMl90CitzdGF0aWMgdWludDMyX3QKIGxwZmNfcmRwX3Jlc19kaWFnX3BvcnRfbmFtZXMoc3RydWN0IGZjX3JkcF9wb3J0X25hbWVfZGVzYyAqZGVzYywKIAkJc3RydWN0IGxwZmNfaGJhICpwaGJhKQogewpAQCAtNTAwMyw3ICs1MDAzLDcgQEAKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBmY19yZHBfcG9ydF9uYW1lX2Rlc2MpOwogfQogCi11aW50MzJfdAorc3RhdGljIHVpbnQzMl90CiBscGZjX3JkcF9yZXNfYXR0YWNoX3BvcnRfbmFtZXMoc3RydWN0IGZjX3JkcF9wb3J0X25hbWVfZGVzYyAqZGVzYywKIAkJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LCBzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqbmRscCkKIHsKQEAgLTUwMjcsNyArNTAyNyw3IEBACiAJcmV0dXJuIHNpemVvZihzdHJ1Y3QgZmNfcmRwX3BvcnRfbmFtZV9kZXNjKTsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGxwZmNfZWxzX3JkcF9jbXBsKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgc3RydWN0IGxwZmNfcmRwX2NvbnRleHQgKnJkcF9jb250ZXh0LAogCQlpbnQgc3RhdHVzKQogewpAQCAtNTE2NSw3ICs1MTY1LDcgQEAKIAlrZnJlZShyZHBfY29udGV4dCk7CiB9CiAKLWludAorc3RhdGljIGludAogbHBmY19nZXRfcmRwX2luZm8oc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgbHBmY19yZHBfY29udGV4dCAqcmRwX2NvbnRleHQpCiB7CiAJTFBGQ19NQk9YUV90ICptYm94ID0gTlVMTDsKQEAgLTc5OTUsNyArNzk5NSw3IEBACiAJfQogfQogCi12b2lkCitzdGF0aWMgdm9pZAogbHBmY19zdGFydF9mZG1pKHN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCkKIHsKIAlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSB2cG9ydC0+cGhiYTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWJveC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMKaW5kZXggMTJkYmU5OS4uYjIzNGM1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19tYm94LmMKQEAgLTIyNjAsNyArMjI2MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBscGZjX21ieF9jbXBsX3JkcF9saW5rX3N0YXQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBMUEZDX01CT1hRX3QgKm1ib3hxKQogewogCU1BSUxCT1hfdCAqbWI7CkBAIC0yMjgxLDcgKzIyODEsNyBAQAogCXJkcF9jb250ZXh0LT5jbXBsKHBoYmEsIHJkcF9jb250ZXh0LCByYyk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBscGZjX21ieF9jbXBsX3JkcF9wYWdlX2EyKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgTFBGQ19NQk9YUV90ICptYm94KQogewogCXN0cnVjdCBscGZjX2RtYWJ1ZiAqbXAgPSAoc3RydWN0IGxwZmNfZG1hYnVmICopIG1ib3gtPmNvbnRleHQxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKaW5kZXggNzA4MGNlMi4uYzUzMjYwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCkBAIC01Njg5LDcgKzU2ODksNyBAQAogCXJldHVybiByYzsKIH0KIAotdm9pZAorc3RhdGljIHZvaWQKIGxwZmNfc2V0X2ZlYXR1cmVzKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgTFBGQ19NQk9YUV90ICptYm94LAogCQkgIHVpbnQzMl90IGZlYXR1cmUpCiB7CkBAIC04OTY4LDcgKzg5NjgsNyBAQAogICogU2luY2UgQUJPUlRTIG11c3QgZ28gb24gdGhlIHNhbWUgV1Egb2YgdGhlIGNvbW1hbmQgdGhleSBhcmUKICAqIGFib3J0aW5nLCB3ZSB1c2UgY29tbWFuZCdzIGZjcF93cWlkeC4KICAqLwotaW50CitzdGF0aWMgaW50CiBscGZjX3NsaV9jYWxjX3Jpbmcoc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50MzJfdCByaW5nX251bWJlciwKIAkJICAgIHN0cnVjdCBscGZjX2lvY2JxICpwaW9jYikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfYmFzZS5jIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKaW5kZXggYzFlZDI1YS4uOWZmNTdkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMKQEAgLTE4OSwyNSArMTg5LDEyIEBACiBtZWdhc2FzX2J1aWxkX2FuZF9pc3N1ZV9jbWQoc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlLAogCQkJICAgIHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpOwogc3RhdGljIHZvaWQgbWVnYXNhc19jb21wbGV0ZV9jbWRfZHBjKHVuc2lnbmVkIGxvbmcgaW5zdGFuY2VfYWRkcik7Ci12b2lkCi1tZWdhc2FzX3JlbGVhc2VfZnVzaW9uKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7Ci1pbnQKLW1lZ2FzYXNfaW9jX2luaXRfZnVzaW9uKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7Ci12b2lkCi1tZWdhc2FzX2ZyZWVfY21kc19mdXNpb24oc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKTsKLXU4Ci1tZWdhc2FzX2dldF9tYXBfaW5mbyhzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOwotaW50Ci1tZWdhc2FzX3N5bmNfbWFwX2luZm8oc3RydWN0IG1lZ2FzYXNfaW5zdGFuY2UgKmluc3RhbmNlKTsKIGludAogd2FpdF9hbmRfcG9sbChzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsIHN0cnVjdCBtZWdhc2FzX2NtZCAqY21kLAogCWludCBzZWNvbmRzKTsKLXZvaWQgbWVnYXNhc19yZXNldF9yZXBseV9kZXNjKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7CiB2b2lkIG1lZ2FzYXNfZnVzaW9uX29jcl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RhdGljIGludCBtZWdhc2FzX2dldF9sZF92Zl9hZmZpbGlhdGlvbihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCiAJCQkJCSBpbnQgaW5pdGlhbCk7Ci1pbnQgbWVnYXNhc19jaGVja19tcGlvX3BhdGhzKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwKLQkJCSAgICAgc3RydWN0IHNjc2lfY21uZCAqc2NtZCk7CiAKIGludAogbWVnYXNhc19pc3N1ZV9kY21kKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSwgc3RydWN0IG1lZ2FzYXNfY21kICpjbWQpCkBAIC01MDM2LDcgKzUwMjMsNyBAQAogCiAJLyogRmluZCBmaXJzdCBtZW1vcnkgYmFyICovCiAJYmFyX2xpc3QgPSBwY2lfc2VsZWN0X2JhcnMoaW5zdGFuY2UtPnBkZXYsIElPUkVTT1VSQ0VfTUVNKTsKLQlpbnN0YW5jZS0+YmFyID0gZmluZF9maXJzdF9iaXQoJmJhcl9saXN0LCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWluc3RhbmNlLT5iYXIgPSBmaW5kX2ZpcnN0X2JpdCgmYmFyX2xpc3QsIEJJVFNfUEVSX0xPTkcpOwogCWlmIChwY2lfcmVxdWVzdF9zZWxlY3RlZF9yZWdpb25zKGluc3RhbmNlLT5wZGV2LCAxPDxpbnN0YW5jZS0+YmFyLAogCQkJCQkgIm1lZ2FzYXM6IExTSSIpKSB7CiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmluc3RhbmNlLT5wZGV2LT5kZXYsICJJTyBtZW1vcnkgcmVnaW9uIGJ1c3khXG4iKTsKQEAgLTU3ODIsNyArNTc2OSw3IEBACiAJCQkJCSAgICAgJmluc3RhbmNlLT5jb25zdW1lcl9oKTsKIAogCQlpZiAoIWluc3RhbmNlLT5wcm9kdWNlciB8fCAhaW5zdGFuY2UtPmNvbnN1bWVyKSB7Ci0JCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUiCisJCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgIgogCQkJICAgICAgICJtZW1vcnkgZm9yIHByb2R1Y2VyLCBjb25zdW1lclxuIik7CiAJCQlnb3RvIGZhaWxfYWxsb2NfZG1hX2J1ZjsKIAkJfQpAQCAtNjcxMSwxNCArNjY5OCw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgd2FpdF90aW1lID0gTUVHQVNBU19SRVNFVF9XQUlUX1RJTUU7CiAKLQlpb2MgPSBrbWFsbG9jKHNpemVvZigqaW9jKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpb2MpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGlvYywgdXNlcl9pb2MsIHNpemVvZigqaW9jKSkpIHsKLQkJZXJyb3IgPSAtRUZBVUxUOwotCQlnb3RvIG91dF9rZnJlZV9pb2M7Ci0JfQorCWlvYyA9IG1lbWR1cF91c2VyKHVzZXJfaW9jLCBzaXplb2YoKmlvYykpOworCWlmIChJU19FUlIoaW9jKSkKKwkJcmV0dXJuIFBUUl9FUlIoaW9jKTsKIAogCWluc3RhbmNlID0gbWVnYXNhc19sb29rdXBfaW5zdGFuY2UoaW9jLT5ob3N0X25vKTsKIAlpZiAoIWluc3RhbmNlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5oIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mdXNpb24uaAppbmRleCA4MGVhZWUyLi5lM2JlZTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Z1c2lvbi5oCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnVzaW9uLmgKQEAgLTk5MSw1ICs5OTEsMTQgQEAKIAl9IHU7CiB9OwogCit2b2lkIG1lZ2FzYXNfZnJlZV9jbWRzX2Z1c2lvbihzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOworaW50IG1lZ2FzYXNfaW9jX2luaXRfZnVzaW9uKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7Cit1OCBtZWdhc2FzX2dldF9tYXBfaW5mbyhzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOworaW50IG1lZ2FzYXNfc3luY19tYXBfaW5mbyhzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOwordm9pZCBtZWdhc2FzX3JlbGVhc2VfZnVzaW9uKHN0cnVjdCBtZWdhc2FzX2luc3RhbmNlICppbnN0YW5jZSk7Cit2b2lkIG1lZ2FzYXNfcmVzZXRfcmVwbHlfZGVzYyhzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UpOworaW50IG1lZ2FzYXNfY2hlY2tfbXBpb19wYXRocyhzdHJ1Y3QgbWVnYXNhc19pbnN0YW5jZSAqaW5zdGFuY2UsCisJCQkgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKTsKK3ZvaWQgbWVnYXNhc19mdXNpb25fb2NyX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKICNlbmRpZiAvKiBfTUVHQVJBSURfU0FTX0ZVU0lPTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDNzYXMvbXB0M3Nhc19iYXNlLmMgYi9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX2Jhc2UuYwppbmRleCA3NTBmODJjLi5hMWE1Y2ViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX2Jhc2UuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX2Jhc2UuYwpAQCAtOTgsNyArOTgsNyBAQAogCSIgZW5hYmxlIGRldGVjdGlvbiBvZiBmaXJtd2FyZSBmYXVsdCBhbmQgaGFsdCBmaXJtd2FyZSAtIChkZWZhdWx0PTApIik7CiAKIHN0YXRpYyBpbnQKLV9iYXNlX2dldF9pb2NfZmFjdHMoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBfZmxhZyk7CitfYmFzZV9nZXRfaW9jX2ZhY3RzKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYyk7CiAKIC8qKgogICogX3Njc2loX3NldF9md2ZhdWx0X2RlYnVnIC0gZ2xvYmFsIHNldHRpbmcgb2YgaW9jLT5md2ZhdWx0X2RlYnVnLgpAQCAtMjE4LDggKzIxOCw3IEBACiAJaW9jLT5ub25fb3BlcmF0aW9uYWxfbG9vcCA9IDA7CiAKIAlpZiAoKGRvb3JiZWxsICYgTVBJMl9JT0NfU1RBVEVfTUFTSykgIT0gTVBJMl9JT0NfU1RBVEVfT1BFUkFUSU9OQUwpIHsKLQkJcmMgPSBtcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgQ0FOX1NMRUVQLAotCQkgICAgRk9SQ0VfQklHX0hBTU1FUik7CisJCXJjID0gbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIEZPUkNFX0JJR19IQU1NRVIpOwogCQlwcl93YXJuKE1QVDNTQVNfRk1UICIlczogaGFyZCByZXNldDogJXNcbiIsIGlvYy0+bmFtZSwKIAkJICAgIF9fZnVuY19fLCAocmMgPT0gMCkgPyAic3VjY2VzcyIgOiAiZmFpbGVkIik7CiAJCWRvb3JiZWxsID0gbXB0M3Nhc19iYXNlX2dldF9pb2NzdGF0ZShpb2MsIDApOwpAQCAtMjA0MCw3ICsyMDM5LDcgQEAKICAqIG1wdDNzYXNfYmFzZV91bm1hcF9yZXNvdXJjZXMgLSBmcmVlIGNvbnRyb2xsZXIgcmVzb3VyY2VzCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqLwotdm9pZAorc3RhdGljIHZvaWQKIG1wdDNzYXNfYmFzZV91bm1hcF9yZXNvdXJjZXMoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaW9jLT5wZGV2OwpAQCAtMjE0NSw3ICsyMTQ0LDcgQEAKIAogCV9iYXNlX21hc2tfaW50ZXJydXB0cyhpb2MpOwogCi0JciA9IF9iYXNlX2dldF9pb2NfZmFjdHMoaW9jLCBDQU5fU0xFRVApOworCXIgPSBfYmFzZV9nZXRfaW9jX2ZhY3RzKGlvYyk7CiAJaWYgKHIpCiAJCWdvdG8gb3V0X2ZhaWw7CiAKQEAgLTMxODMsMTIgKzMxODIsMTEgQEAKIC8qKgogICogX2Jhc2VfYWxsb2NhdGVfbWVtb3J5X3Bvb2xzIC0gYWxsb2NhdGUgc3RhcnQgb2YgZGF5IG1lbW9yeSBwb29scwogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAc2xlZXBfZmxhZzogQ0FOX1NMRUVQIG9yIE5PX1NMRUVQCiAgKgogICogUmV0dXJucyAwIHN1Y2Nlc3MsIGFueXRoaW5nIGVsc2UgZXJyb3IKICAqLwogc3RhdGljIGludAotX2Jhc2VfYWxsb2NhdGVfbWVtb3J5X3Bvb2xzKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgIGludCBzbGVlcF9mbGFnKQorX2Jhc2VfYWxsb2NhdGVfbWVtb3J5X3Bvb2xzKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYykKIHsKIAlzdHJ1Y3QgbXB0M3Nhc19mYWN0cyAqZmFjdHM7CiAJdTE2IG1heF9zZ2VfZWxlbWVudHM7CkBAIC0zNjU4LDI5ICszNjU2LDI1IEBACiAgKiBfYmFzZV93YWl0X29uX2lvY3N0YXRlIC0gd2FpdGluZyBvbiBhIHBhcnRpY3VsYXIgaW9jIHN0YXRlCiAgKiBAaW9jX3N0YXRlOiBjb250cm9sbGVyIHN0YXRlIHsgUkVBRFksIE9QRVJBVElPTkFMLCBvciBSRVNFVCB9CiAgKiBAdGltZW91dDogdGltZW91dCBpbiBzZWNvbmQKLSAqIEBzbGVlcF9mbGFnOiBDQU5fU0xFRVAgb3IgTk9fU0xFRVAKICAqCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50Ci1fYmFzZV93YWl0X29uX2lvY3N0YXRlKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgdTMyIGlvY19zdGF0ZSwgaW50IHRpbWVvdXQsCi0JaW50IHNsZWVwX2ZsYWcpCitfYmFzZV93YWl0X29uX2lvY3N0YXRlKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgdTMyIGlvY19zdGF0ZSwgaW50IHRpbWVvdXQpCiB7CiAJdTMyIGNvdW50LCBjbnRkbjsKIAl1MzIgY3VycmVudF9zdGF0ZTsKIAogCWNvdW50ID0gMDsKLQljbnRkbiA9IChzbGVlcF9mbGFnID09IENBTl9TTEVFUCkgPyAxMDAwKnRpbWVvdXQgOiAyMDAwKnRpbWVvdXQ7CisJY250ZG4gPSAxMDAwICogdGltZW91dDsKIAlkbyB7CiAJCWN1cnJlbnRfc3RhdGUgPSBtcHQzc2FzX2Jhc2VfZ2V0X2lvY3N0YXRlKGlvYywgMSk7CiAJCWlmIChjdXJyZW50X3N0YXRlID09IGlvY19zdGF0ZSkKIAkJCXJldHVybiAwOwogCQlpZiAoY291bnQgJiYgY3VycmVudF9zdGF0ZSA9PSBNUEkyX0lPQ19TVEFURV9GQVVMVCkKIAkJCWJyZWFrOwotCQlpZiAoc2xlZXBfZmxhZyA9PSBDQU5fU0xFRVApCi0JCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7Ci0JCWVsc2UKLQkJCXVkZWxheSg1MDApOworCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKIAkJY291bnQrKzsKIAl9IHdoaWxlICgtLWNudGRuKTsKIApAQCAtMzY5MiwyNCArMzY4NiwyMiBAQAogICogYSB3cml0ZSB0byB0aGUgZG9vcmJlbGwpCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEB0aW1lb3V0OiB0aW1lb3V0IGluIHNlY29uZAotICogQHNsZWVwX2ZsYWc6IENBTl9TTEVFUCBvciBOT19TTEVFUAogICoKICAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCiAgKgogICogTm90ZXM6IE1QSTJfSElTX0lPQzJTWVNfREJfU1RBVFVTIC0gc2V0IHRvIG9uZSB3aGVuIElPQyB3cml0ZXMgdG8gZG9vcmJlbGwuCiAgKi8KIHN0YXRpYyBpbnQKLV9iYXNlX2RpYWdfcmVzZXQoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBfZmxhZyk7CitfYmFzZV9kaWFnX3Jlc2V0KHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYyk7CiAKIHN0YXRpYyBpbnQKLV9iYXNlX3dhaXRfZm9yX2Rvb3JiZWxsX2ludChzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIGludCB0aW1lb3V0LAotCWludCBzbGVlcF9mbGFnKQorX2Jhc2Vfd2FpdF9mb3JfZG9vcmJlbGxfaW50KHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgaW50IHRpbWVvdXQpCiB7CiAJdTMyIGNudGRuLCBjb3VudDsKIAl1MzIgaW50X3N0YXR1czsKIAogCWNvdW50ID0gMDsKLQljbnRkbiA9IChzbGVlcF9mbGFnID09IENBTl9TTEVFUCkgPyAxMDAwKnRpbWVvdXQgOiAyMDAwKnRpbWVvdXQ7CisJY250ZG4gPSAxMDAwICogdGltZW91dDsKIAlkbyB7CiAJCWludF9zdGF0dXMgPSByZWFkbCgmaW9jLT5jaGlwLT5Ib3N0SW50ZXJydXB0U3RhdHVzKTsKIAkJaWYgKGludF9zdGF0dXMgJiBNUEkyX0hJU19JT0MyU1lTX0RCX1NUQVRVUykgewpAQCAtMzcxOCwxMCArMzcxMCw4IEBACiAJCQkJaW9jLT5uYW1lLCBfX2Z1bmNfXywgY291bnQsIHRpbWVvdXQpKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCWlmIChzbGVlcF9mbGFnID09IENBTl9TTEVFUCkKLQkJCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKLQkJZWxzZQotCQkJdWRlbGF5KDUwMCk7CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCQljb3VudCsrOwogCX0gd2hpbGUgKC0tY250ZG4pOwogCkBAIC0zNzMxLDExICszNzIxLDM4IEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKK3N0YXRpYyBpbnQKK19iYXNlX3NwaW5fb25fZG9vcmJlbGxfaW50KHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgaW50IHRpbWVvdXQpCit7CisJdTMyIGNudGRuLCBjb3VudDsKKwl1MzIgaW50X3N0YXR1czsKKworCWNvdW50ID0gMDsKKwljbnRkbiA9IDIwMDAgKiB0aW1lb3V0OworCWRvIHsKKwkJaW50X3N0YXR1cyA9IHJlYWRsKCZpb2MtPmNoaXAtPkhvc3RJbnRlcnJ1cHRTdGF0dXMpOworCQlpZiAoaW50X3N0YXR1cyAmIE1QSTJfSElTX0lPQzJTWVNfREJfU1RBVFVTKSB7CisJCQlkaHNwcmludGsoaW9jLCBwcl9pbmZvKE1QVDNTQVNfRk1UCisJCQkJIiVzOiBzdWNjZXNzZnVsIGNvdW50KCVkKSwgdGltZW91dCglZClcbiIsCisJCQkJaW9jLT5uYW1lLCBfX2Z1bmNfXywgY291bnQsIHRpbWVvdXQpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdWRlbGF5KDUwMCk7CisJCWNvdW50Kys7CisJfSB3aGlsZSAoLS1jbnRkbik7CisKKwlwcl9lcnIoTVBUM1NBU19GTVQKKwkJIiVzOiBmYWlsZWQgZHVlIHRvIHRpbWVvdXQgY291bnQoJWQpLCBpbnRfc3RhdHVzKCV4KSFcbiIsCisJCWlvYy0+bmFtZSwgX19mdW5jX18sIGNvdW50LCBpbnRfc3RhdHVzKTsKKwlyZXR1cm4gLUVGQVVMVDsKKworfQorCiAvKioKICAqIF9iYXNlX3dhaXRfZm9yX2Rvb3JiZWxsX2FjayAtIHdhaXRpbmcgZm9yIGNvbnRyb2xsZXIgdG8gcmVhZCB0aGUgZG9vcmJlbGwuCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEB0aW1lb3V0OiB0aW1lb3V0IGluIHNlY29uZAotICogQHNsZWVwX2ZsYWc6IENBTl9TTEVFUCBvciBOT19TTEVFUAogICoKICAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCiAgKgpAQCAtMzc0MywxNSArMzc2MCwxNCBAQAogICogZG9vcmJlbGwuCiAgKi8KIHN0YXRpYyBpbnQKLV9iYXNlX3dhaXRfZm9yX2Rvb3JiZWxsX2FjayhzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIGludCB0aW1lb3V0LAotCWludCBzbGVlcF9mbGFnKQorX2Jhc2Vfd2FpdF9mb3JfZG9vcmJlbGxfYWNrKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgaW50IHRpbWVvdXQpCiB7CiAJdTMyIGNudGRuLCBjb3VudDsKIAl1MzIgaW50X3N0YXR1czsKIAl1MzIgZG9vcmJlbGw7CiAKIAljb3VudCA9IDA7Ci0JY250ZG4gPSAoc2xlZXBfZmxhZyA9PSBDQU5fU0xFRVApID8gMTAwMCp0aW1lb3V0IDogMjAwMCp0aW1lb3V0OworCWNudGRuID0gMTAwMCAqIHRpbWVvdXQ7CiAJZG8gewogCQlpbnRfc3RhdHVzID0gcmVhZGwoJmlvYy0+Y2hpcC0+SG9zdEludGVycnVwdFN0YXR1cyk7CiAJCWlmICghKGludF9zdGF0dXMgJiBNUEkyX0hJU19TWVMySU9DX0RCX1NUQVRVUykpIHsKQEAgLTM3NjksMTAgKzM3ODUsNyBAQAogCQl9IGVsc2UgaWYgKGludF9zdGF0dXMgPT0gMHhGRkZGRkZGRikKIAkJCWdvdG8gb3V0OwogCi0JCWlmIChzbGVlcF9mbGFnID09IENBTl9TTEVFUCkKLQkJCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKLQkJZWxzZQotCQkJdWRlbGF5KDUwMCk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKIAkJY291bnQrKzsKIAl9IHdoaWxlICgtLWNudGRuKTsKIApAQCAtMzc4NywyMCArMzgwMCwxOCBAQAogICogX2Jhc2Vfd2FpdF9mb3JfZG9vcmJlbGxfbm90X3VzZWQgLSB3YWl0aW5nIGZvciBkb29yYmVsbCB0byBub3QgYmUgaW4gdXNlCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKICAqIEB0aW1lb3V0OiB0aW1lb3V0IGluIHNlY29uZAotICogQHNsZWVwX2ZsYWc6IENBTl9TTEVFUCBvciBOT19TTEVFUAogICoKICAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCiAgKgogICovCiBzdGF0aWMgaW50Ci1fYmFzZV93YWl0X2Zvcl9kb29yYmVsbF9ub3RfdXNlZChzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIGludCB0aW1lb3V0LAotCWludCBzbGVlcF9mbGFnKQorX2Jhc2Vfd2FpdF9mb3JfZG9vcmJlbGxfbm90X3VzZWQoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jLCBpbnQgdGltZW91dCkKIHsKIAl1MzIgY250ZG4sIGNvdW50OwogCXUzMiBkb29yYmVsbF9yZWc7CiAKIAljb3VudCA9IDA7Ci0JY250ZG4gPSAoc2xlZXBfZmxhZyA9PSBDQU5fU0xFRVApID8gMTAwMCp0aW1lb3V0IDogMjAwMCp0aW1lb3V0OworCWNudGRuID0gMTAwMCAqIHRpbWVvdXQ7CiAJZG8gewogCQlkb29yYmVsbF9yZWcgPSByZWFkbCgmaW9jLT5jaGlwLT5Eb29yYmVsbCk7CiAJCWlmICghKGRvb3JiZWxsX3JlZyAmIE1QSTJfRE9PUkJFTExfVVNFRCkpIHsKQEAgLTM4MDksMTAgKzM4MjAsOCBAQAogCQkJCWlvYy0+bmFtZSwgX19mdW5jX18sIGNvdW50LCB0aW1lb3V0KSk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlpZiAoc2xlZXBfZmxhZyA9PSBDQU5fU0xFRVApCi0JCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7Ci0JCWVsc2UKLQkJCXVkZWxheSg1MDApOworCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKIAkJY291bnQrKzsKIAl9IHdoaWxlICgtLWNudGRuKTsKIApAQCAtMzgyNywxMyArMzgzNiwxMSBAQAogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0CiAgKiBAcmVzZXRfdHlwZTogY3VycmVudGx5IG9ubHkgc3VwcG9ydHM6IE1QSTJfRlVOQ1RJT05fSU9DX01FU1NBR0VfVU5JVF9SRVNFVAogICogQHRpbWVvdXQ6IHRpbWVvdXQgaW4gc2Vjb25kCi0gKiBAc2xlZXBfZmxhZzogQ0FOX1NMRUVQIG9yIE5PX1NMRUVQCiAgKgogICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotX2Jhc2Vfc2VuZF9pb2NfcmVzZXQoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jLCB1OCByZXNldF90eXBlLCBpbnQgdGltZW91dCwKLQlpbnQgc2xlZXBfZmxhZykKK19iYXNlX3NlbmRfaW9jX3Jlc2V0KHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgdTggcmVzZXRfdHlwZSwgaW50IHRpbWVvdXQpCiB7CiAJdTMyIGlvY19zdGF0ZTsKIAlpbnQgciA9IDA7CkBAIC0zODUyLDEyICszODU5LDExIEBACiAKIAl3cml0ZWwocmVzZXRfdHlwZSA8PCBNUEkyX0RPT1JCRUxMX0ZVTkNUSU9OX1NISUZULAogCSAgICAmaW9jLT5jaGlwLT5Eb29yYmVsbCk7Ci0JaWYgKChfYmFzZV93YWl0X2Zvcl9kb29yYmVsbF9hY2soaW9jLCAxNSwgc2xlZXBfZmxhZykpKSB7CisJaWYgKChfYmFzZV93YWl0X2Zvcl9kb29yYmVsbF9hY2soaW9jLCAxNSkpKSB7CiAJCXIgPSAtRUZBVUxUOwogCQlnb3RvIG91dDsKIAl9Ci0JaW9jX3N0YXRlID0gX2Jhc2Vfd2FpdF9vbl9pb2NzdGF0ZShpb2MsIE1QSTJfSU9DX1NUQVRFX1JFQURZLAotCSAgICB0aW1lb3V0LCBzbGVlcF9mbGFnKTsKKwlpb2Nfc3RhdGUgPSBfYmFzZV93YWl0X29uX2lvY3N0YXRlKGlvYywgTVBJMl9JT0NfU1RBVEVfUkVBRFksIHRpbWVvdXQpOwogCWlmIChpb2Nfc3RhdGUpIHsKIAkJcHJfZXJyKE1QVDNTQVNfRk1UCiAJCQkiJXM6IGZhaWxlZCBnb2luZyB0byByZWFkeSBzdGF0ZSAoaW9jX3N0YXRlPTB4JXgpXG4iLApAQCAtMzg3OSwxOCArMzg4NSwxNiBAQAogICogQHJlcGx5X2J5dGVzOiByZXBseSBsZW5ndGgKICAqIEByZXBseTogcG9pbnRlciB0byByZXBseSBwYXlsb2FkCiAgKiBAdGltZW91dDogdGltZW91dCBpbiBzZWNvbmQKLSAqIEBzbGVlcF9mbGFnOiBDQU5fU0xFRVAgb3IgTk9fU0xFRVAKICAqCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50CiBfYmFzZV9oYW5kc2hha2VfcmVxX3JlcGx5X3dhaXQoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jLCBpbnQgcmVxdWVzdF9ieXRlcywKLQl1MzIgKnJlcXVlc3QsIGludCByZXBseV9ieXRlcywgdTE2ICpyZXBseSwgaW50IHRpbWVvdXQsIGludCBzbGVlcF9mbGFnKQorCXUzMiAqcmVxdWVzdCwgaW50IHJlcGx5X2J5dGVzLCB1MTYgKnJlcGx5LCBpbnQgdGltZW91dCkKIHsKIAlNUEkyRGVmYXVsdFJlcGx5X3QgKmRlZmF1bHRfcmVwbHkgPSAoTVBJMkRlZmF1bHRSZXBseV90ICopcmVwbHk7CiAJaW50IGk7CiAJdTggZmFpbGVkOwotCXUxNiBkdW1teTsKIAlfX2xlMzIgKm1mcDsKIAogCS8qIG1ha2Ugc3VyZSBkb29yYmVsbCBpcyBub3QgaW4gdXNlICovCkBAIC0zOTExLDcgKzM5MTUsNyBAQAogCSAgICAoKHJlcXVlc3RfYnl0ZXMvNCk8PE1QSTJfRE9PUkJFTExfQUREX0RXT1JEU19TSElGVCkpLAogCSAgICAmaW9jLT5jaGlwLT5Eb29yYmVsbCk7CiAKLQlpZiAoKF9iYXNlX3dhaXRfZm9yX2Rvb3JiZWxsX2ludChpb2MsIDUsIE5PX1NMRUVQKSkpIHsKKwlpZiAoKF9iYXNlX3NwaW5fb25fZG9vcmJlbGxfaW50KGlvYywgNSkpKSB7CiAJCXByX2VycihNUFQzU0FTX0ZNVAogCQkJImRvb3JiZWxsIGhhbmRzaGFrZSBpbnQgZmFpbGVkIChsaW5lPSVkKVxuIiwKIAkJCWlvYy0+bmFtZSwgX19MSU5FX18pOwpAQCAtMzkxOSw3ICszOTIzLDcgQEAKIAl9CiAJd3JpdGVsKDAsICZpb2MtPmNoaXAtPkhvc3RJbnRlcnJ1cHRTdGF0dXMpOwogCi0JaWYgKChfYmFzZV93YWl0X2Zvcl9kb29yYmVsbF9hY2soaW9jLCA1LCBzbGVlcF9mbGFnKSkpIHsKKwlpZiAoKF9iYXNlX3dhaXRfZm9yX2Rvb3JiZWxsX2Fjayhpb2MsIDUpKSkgewogCQlwcl9lcnIoTVBUM1NBU19GTVQKIAkJCSJkb29yYmVsbCBoYW5kc2hha2UgYWNrIGZhaWxlZCAobGluZT0lZClcbiIsCiAJCQlpb2MtPm5hbWUsIF9fTElORV9fKTsKQEAgLTM5MjksNyArMzkzMyw3IEBACiAJLyogc2VuZCBtZXNzYWdlIDMyLWJpdHMgYXQgYSB0aW1lICovCiAJZm9yIChpID0gMCwgZmFpbGVkID0gMDsgaSA8IHJlcXVlc3RfYnl0ZXMvNCAmJiAhZmFpbGVkOyBpKyspIHsKIAkJd3JpdGVsKGNwdV90b19sZTMyKHJlcXVlc3RbaV0pLCAmaW9jLT5jaGlwLT5Eb29yYmVsbCk7Ci0JCWlmICgoX2Jhc2Vfd2FpdF9mb3JfZG9vcmJlbGxfYWNrKGlvYywgNSwgc2xlZXBfZmxhZykpKQorCQlpZiAoKF9iYXNlX3dhaXRfZm9yX2Rvb3JiZWxsX2Fjayhpb2MsIDUpKSkKIAkJCWZhaWxlZCA9IDE7CiAJfQogCkBAIC0zOTQxLDcgKzM5NDUsNyBAQAogCX0KIAogCS8qIG5vdyB3YWl0IGZvciB0aGUgcmVwbHkgKi8KLQlpZiAoKF9iYXNlX3dhaXRfZm9yX2Rvb3JiZWxsX2ludChpb2MsIHRpbWVvdXQsIHNsZWVwX2ZsYWcpKSkgeworCWlmICgoX2Jhc2Vfd2FpdF9mb3JfZG9vcmJlbGxfaW50KGlvYywgdGltZW91dCkpKSB7CiAJCXByX2VycihNUFQzU0FTX0ZNVAogCQkJImRvb3JiZWxsIGhhbmRzaGFrZSBpbnQgZmFpbGVkIChsaW5lPSVkKVxuIiwKIAkJCWlvYy0+bmFtZSwgX19MSU5FX18pOwpAQCAtMzk1Miw3ICszOTU2LDcgQEAKIAlyZXBseVswXSA9IGxlMTZfdG9fY3B1KHJlYWRsKCZpb2MtPmNoaXAtPkRvb3JiZWxsKQogCSAgICAmIE1QSTJfRE9PUkJFTExfREFUQV9NQVNLKTsKIAl3cml0ZWwoMCwgJmlvYy0+Y2hpcC0+SG9zdEludGVycnVwdFN0YXR1cyk7Ci0JaWYgKChfYmFzZV93YWl0X2Zvcl9kb29yYmVsbF9pbnQoaW9jLCA1LCBzbGVlcF9mbGFnKSkpIHsKKwlpZiAoKF9iYXNlX3dhaXRfZm9yX2Rvb3JiZWxsX2ludChpb2MsIDUpKSkgewogCQlwcl9lcnIoTVBUM1NBU19GTVQKIAkJCSJkb29yYmVsbCBoYW5kc2hha2UgaW50IGZhaWxlZCAobGluZT0lZClcbiIsCiAJCQlpb2MtPm5hbWUsIF9fTElORV9fKTsKQEAgLTM5NjMsMjIgKzM5NjcsMjIgQEAKIAl3cml0ZWwoMCwgJmlvYy0+Y2hpcC0+SG9zdEludGVycnVwdFN0YXR1cyk7CiAKIAlmb3IgKGkgPSAyOyBpIDwgZGVmYXVsdF9yZXBseS0+TXNnTGVuZ3RoICogMjsgaSsrKSAgewotCQlpZiAoKF9iYXNlX3dhaXRfZm9yX2Rvb3JiZWxsX2ludChpb2MsIDUsIHNsZWVwX2ZsYWcpKSkgeworCQlpZiAoKF9iYXNlX3dhaXRfZm9yX2Rvb3JiZWxsX2ludChpb2MsIDUpKSkgewogCQkJcHJfZXJyKE1QVDNTQVNfRk1UCiAJCQkJImRvb3JiZWxsIGhhbmRzaGFrZSBpbnQgZmFpbGVkIChsaW5lPSVkKVxuIiwKIAkJCQlpb2MtPm5hbWUsIF9fTElORV9fKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAJCWlmIChpID49ICByZXBseV9ieXRlcy8yKSAvKiBvdmVyZmxvdyBjYXNlICovCi0JCQlkdW1teSA9IHJlYWRsKCZpb2MtPmNoaXAtPkRvb3JiZWxsKTsKKwkJCXJlYWRsKCZpb2MtPmNoaXAtPkRvb3JiZWxsKTsKIAkJZWxzZQogCQkJcmVwbHlbaV0gPSBsZTE2X3RvX2NwdShyZWFkbCgmaW9jLT5jaGlwLT5Eb29yYmVsbCkKIAkJCSAgICAmIE1QSTJfRE9PUkJFTExfREFUQV9NQVNLKTsKIAkJd3JpdGVsKDAsICZpb2MtPmNoaXAtPkhvc3RJbnRlcnJ1cHRTdGF0dXMpOwogCX0KIAotCV9iYXNlX3dhaXRfZm9yX2Rvb3JiZWxsX2ludChpb2MsIDUsIHNsZWVwX2ZsYWcpOwotCWlmIChfYmFzZV93YWl0X2Zvcl9kb29yYmVsbF9ub3RfdXNlZChpb2MsIDUsIHNsZWVwX2ZsYWcpICE9IDApIHsKKwlfYmFzZV93YWl0X2Zvcl9kb29yYmVsbF9pbnQoaW9jLCA1KTsKKwlpZiAoX2Jhc2Vfd2FpdF9mb3JfZG9vcmJlbGxfbm90X3VzZWQoaW9jLCA1KSAhPSAwKSB7CiAJCWRoc3ByaW50ayhpb2MsIHByX2luZm8oTVBUM1NBU19GTVQKIAkJCSJkb29yYmVsbCBpcyBpbiB1c2UgKGxpbmU9JWQpXG4iLCBpb2MtPm5hbWUsIF9fTElORV9fKSk7CiAJfQpAQCAtNDAxNSw3ICs0MDE5LDYgQEAKIHsKIAl1MTYgc21pZDsKIAl1MzIgaW9jX3N0YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZWxlZnQ7CiAJYm9vbCBpc3N1ZV9yZXNldCA9IGZhbHNlOwogCWludCByYzsKIAl2b2lkICpyZXF1ZXN0OwpAQCAtNDA2OCw3ICs0MDcxLDcgQEAKIAkJaW9jLT5pb2NfbGlua19yZXNldF9pbl9wcm9ncmVzcyA9IDE7CiAJaW5pdF9jb21wbGV0aW9uKCZpb2MtPmJhc2VfY21kcy5kb25lKTsKIAltcHQzc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQpOwotCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPmJhc2VfY21kcy5kb25lLAorCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5iYXNlX2NtZHMuZG9uZSwKIAkgICAgbXNlY3NfdG9famlmZmllcygxMDAwMCkpOwogCWlmICgobXBpX3JlcXVlc3QtPk9wZXJhdGlvbiA9PSBNUEkyX1NBU19PUF9QSFlfSEFSRF9SRVNFVCB8fAogCSAgICBtcGlfcmVxdWVzdC0+T3BlcmF0aW9uID09IE1QSTJfU0FTX09QX1BIWV9MSU5LX1JFU0VUKSAmJgpAQCAtNDA5Myw4ICs0MDk2LDcgQEAKIAogIGlzc3VlX2hvc3RfcmVzZXQ6CiAJaWYgKGlzc3VlX3Jlc2V0KQotCQltcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgQ0FOX1NMRUVQLAotCQkgICAgRk9SQ0VfQklHX0hBTU1FUik7CisJCW1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBGT1JDRV9CSUdfSEFNTUVSKTsKIAlpb2MtPmJhc2VfY21kcy5zdGF0dXMgPSBNUFQzX0NNRF9OT1RfVVNFRDsKIAlyYyA9IC1FRkFVTFQ7CiAgb3V0OgpAQCAtNDExOSw3ICs0MTIxLDYgQEAKIHsKIAl1MTYgc21pZDsKIAl1MzIgaW9jX3N0YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZWxlZnQ7CiAJYm9vbCBpc3N1ZV9yZXNldCA9IGZhbHNlOwogCWludCByYzsKIAl2b2lkICpyZXF1ZXN0OwpAQCAtNDE3MCw3ICs0MTcxLDcgQEAKIAltZW1jcHkocmVxdWVzdCwgbXBpX3JlcXVlc3QsIHNpemVvZihNcGkyU2VwUmVwbHlfdCkpOwogCWluaXRfY29tcGxldGlvbigmaW9jLT5iYXNlX2NtZHMuZG9uZSk7CiAJbXB0M3Nhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKLQl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5iYXNlX2NtZHMuZG9uZSwKKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+YmFzZV9jbWRzLmRvbmUsCiAJICAgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMDApKTsKIAlpZiAoIShpb2MtPmJhc2VfY21kcy5zdGF0dXMgJiBNUFQzX0NNRF9DT01QTEVURSkpIHsKIAkJcHJfZXJyKE1QVDNTQVNfRk1UICIlczogdGltZW91dFxuIiwKQEAgLTQxOTEsOCArNDE5Miw3IEBACiAKICBpc3N1ZV9ob3N0X3Jlc2V0OgogCWlmIChpc3N1ZV9yZXNldCkKLQkJbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwKLQkJICAgIEZPUkNFX0JJR19IQU1NRVIpOworCQltcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgRk9SQ0VfQklHX0hBTU1FUik7CiAJaW9jLT5iYXNlX2NtZHMuc3RhdHVzID0gTVBUM19DTURfTk9UX1VTRUQ7CiAJcmMgPSAtRUZBVUxUOwogIG91dDoKQEAgLTQyMDMsMTIgKzQyMDMsMTEgQEAKIC8qKgogICogX2Jhc2VfZ2V0X3BvcnRfZmFjdHMgLSBvYnRhaW4gcG9ydCBmYWN0cyByZXBseSBhbmQgc2F2ZSBpbiBpb2MKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICogQHNsZWVwX2ZsYWc6IENBTl9TTEVFUCBvciBOT19TTEVFUAogICoKICAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQKLV9iYXNlX2dldF9wb3J0X2ZhY3RzKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgaW50IHBvcnQsIGludCBzbGVlcF9mbGFnKQorX2Jhc2VfZ2V0X3BvcnRfZmFjdHMoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jLCBpbnQgcG9ydCkKIHsKIAlNcGkyUG9ydEZhY3RzUmVxdWVzdF90IG1waV9yZXF1ZXN0OwogCU1waTJQb3J0RmFjdHNSZXBseV90IG1waV9yZXBseTsKQEAgLTQyMjQsNyArNDIyMyw3IEBACiAJbXBpX3JlcXVlc3QuRnVuY3Rpb24gPSBNUEkyX0ZVTkNUSU9OX1BPUlRfRkFDVFM7CiAJbXBpX3JlcXVlc3QuUG9ydE51bWJlciA9IHBvcnQ7CiAJciA9IF9iYXNlX2hhbmRzaGFrZV9yZXFfcmVwbHlfd2FpdChpb2MsIG1waV9yZXF1ZXN0X3N6LAotCSAgICAodTMyICopJm1waV9yZXF1ZXN0LCBtcGlfcmVwbHlfc3osICh1MTYgKikmbXBpX3JlcGx5LCA1LCBDQU5fU0xFRVApOworCSAgICAodTMyICopJm1waV9yZXF1ZXN0LCBtcGlfcmVwbHlfc3osICh1MTYgKikmbXBpX3JlcGx5LCA1KTsKIAogCWlmIChyICE9IDApIHsKIAkJcHJfZXJyKE1QVDNTQVNfRk1UICIlczogaGFuZHNoYWtlIGZhaWxlZCAocj0lZClcbiIsCkBAIC00MjQ3LDEzICs0MjQ2LDExIEBACiAgKiBfYmFzZV93YWl0X2Zvcl9pb2NzdGF0ZSAtIFdhaXQgdW50aWwgdGhlIGNhcmQgaXMgaW4gUkVBRFkgb3IgT1BFUkFUSU9OQUwKICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAogICogQHRpbWVvdXQ6Ci0gKiBAc2xlZXBfZmxhZzogQ0FOX1NMRUVQIG9yIE5PX1NMRUVQCiAgKgogICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotX2Jhc2Vfd2FpdF9mb3JfaW9jc3RhdGUoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jLCBpbnQgdGltZW91dCwKLQlpbnQgc2xlZXBfZmxhZykKK19iYXNlX3dhaXRfZm9yX2lvY3N0YXRlKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgaW50IHRpbWVvdXQpCiB7CiAJdTMyIGlvY19zdGF0ZTsKIAlpbnQgcmM7CkBAIC00Mjg3LDggKzQyODQsNyBAQAogCQlnb3RvIGlzc3VlX2RpYWdfcmVzZXQ7CiAJfQogCi0JaW9jX3N0YXRlID0gX2Jhc2Vfd2FpdF9vbl9pb2NzdGF0ZShpb2MsIE1QSTJfSU9DX1NUQVRFX1JFQURZLAotCSAgICB0aW1lb3V0LCBzbGVlcF9mbGFnKTsKKwlpb2Nfc3RhdGUgPSBfYmFzZV93YWl0X29uX2lvY3N0YXRlKGlvYywgTVBJMl9JT0NfU1RBVEVfUkVBRFksIHRpbWVvdXQpOwogCWlmIChpb2Nfc3RhdGUpIHsKIAkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVBUM1NBU19GTVQKIAkJICAgICIlczogZmFpbGVkIGdvaW5nIHRvIHJlYWR5IHN0YXRlIChpb2Nfc3RhdGU9MHgleClcbiIsCkBAIC00Mjk3LDE5ICs0MjkzLDE4IEBACiAJfQogCiAgaXNzdWVfZGlhZ19yZXNldDoKLQlyYyA9IF9iYXNlX2RpYWdfcmVzZXQoaW9jLCBzbGVlcF9mbGFnKTsKKwlyYyA9IF9iYXNlX2RpYWdfcmVzZXQoaW9jKTsKIAlyZXR1cm4gcmM7CiB9CiAKIC8qKgogICogX2Jhc2VfZ2V0X2lvY19mYWN0cyAtIG9idGFpbiBpb2MgZmFjdHMgcmVwbHkgYW5kIHNhdmUgaW4gaW9jCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBzbGVlcF9mbGFnOiBDQU5fU0xFRVAgb3IgTk9fU0xFRVAKICAqCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50Ci1fYmFzZV9nZXRfaW9jX2ZhY3RzKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgaW50IHNsZWVwX2ZsYWcpCitfYmFzZV9nZXRfaW9jX2ZhY3RzKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYykKIHsKIAlNcGkySU9DRmFjdHNSZXF1ZXN0X3QgbXBpX3JlcXVlc3Q7CiAJTXBpMklPQ0ZhY3RzUmVwbHlfdCBtcGlfcmVwbHk7CkBAIC00MzE5LDcgKzQzMTQsNyBAQAogCWRpbml0cHJpbnRrKGlvYywgcHJfaW5mbyhNUFQzU0FTX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAotCXIgPSBfYmFzZV93YWl0X2Zvcl9pb2NzdGF0ZShpb2MsIDEwLCBzbGVlcF9mbGFnKTsKKwlyID0gX2Jhc2Vfd2FpdF9mb3JfaW9jc3RhdGUoaW9jLCAxMCk7CiAJaWYgKHIpIHsKIAkJZGZhaWxwcmludGsoaW9jLCBwcmludGsoTVBUM1NBU19GTVQKIAkJICAgICIlczogZmFpbGVkIGdldHRpbmcgdG8gY29ycmVjdCBzdGF0ZVxuIiwKQEAgLTQzMzEsNyArNDMyNiw3IEBACiAJbWVtc2V0KCZtcGlfcmVxdWVzdCwgMCwgbXBpX3JlcXVlc3Rfc3opOwogCW1waV9yZXF1ZXN0LkZ1bmN0aW9uID0gTVBJMl9GVU5DVElPTl9JT0NfRkFDVFM7CiAJciA9IF9iYXNlX2hhbmRzaGFrZV9yZXFfcmVwbHlfd2FpdChpb2MsIG1waV9yZXF1ZXN0X3N6LAotCSAgICAodTMyICopJm1waV9yZXF1ZXN0LCBtcGlfcmVwbHlfc3osICh1MTYgKikmbXBpX3JlcGx5LCA1LCBDQU5fU0xFRVApOworCSAgICAodTMyICopJm1waV9yZXF1ZXN0LCBtcGlfcmVwbHlfc3osICh1MTYgKikmbXBpX3JlcGx5LCA1KTsKIAogCWlmIChyICE9IDApIHsKIAkJcHJfZXJyKE1QVDNTQVNfRk1UICIlczogaGFuZHNoYWtlIGZhaWxlZCAocj0lZClcbiIsCkBAIC00MzkxLDEyICs0Mzg2LDExIEBACiAvKioKICAqIF9iYXNlX3NlbmRfaW9jX2luaXQgLSBzZW5kIGlvY19pbml0IHRvIGZpcm13YXJlCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBzbGVlcF9mbGFnOiBDQU5fU0xFRVAgb3IgTk9fU0xFRVAKICAqCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50Ci1fYmFzZV9zZW5kX2lvY19pbml0KHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgaW50IHNsZWVwX2ZsYWcpCitfYmFzZV9zZW5kX2lvY19pbml0KHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYykKIHsKIAlNcGkySU9DSW5pdFJlcXVlc3RfdCBtcGlfcmVxdWVzdDsKIAlNcGkySU9DSW5pdFJlcGx5X3QgbXBpX3JlcGx5OwpAQCAtNDQ3OSw4ICs0NDczLDcgQEAKIAogCXIgPSBfYmFzZV9oYW5kc2hha2VfcmVxX3JlcGx5X3dhaXQoaW9jLAogCSAgICBzaXplb2YoTXBpMklPQ0luaXRSZXF1ZXN0X3QpLCAodTMyICopJm1waV9yZXF1ZXN0LAotCSAgICBzaXplb2YoTXBpMklPQ0luaXRSZXBseV90KSwgKHUxNiAqKSZtcGlfcmVwbHksIDEwLAotCSAgICBzbGVlcF9mbGFnKTsKKwkgICAgc2l6ZW9mKE1waTJJT0NJbml0UmVwbHlfdCksICh1MTYgKikmbXBpX3JlcGx5LCAxMCk7CiAKIAlpZiAociAhPSAwKSB7CiAJCXByX2VycihNUFQzU0FTX0ZNVCAiJXM6IGhhbmRzaGFrZSBmYWlsZWQgKHI9JWQpXG4iLApAQCAtNDU1NSwxNiArNDU0OCwxNCBAQAogLyoqCiAgKiBfYmFzZV9zZW5kX3BvcnRfZW5hYmxlIC0gc2VuZCBwb3J0X2VuYWJsZShkaXNjb3Zlcnkgc3R1ZmYpIHRvIGZpcm13YXJlCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBzbGVlcF9mbGFnOiBDQU5fU0xFRVAgb3IgTk9fU0xFRVAKICAqCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50Ci1fYmFzZV9zZW5kX3BvcnRfZW5hYmxlKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgaW50IHNsZWVwX2ZsYWcpCitfYmFzZV9zZW5kX3BvcnRfZW5hYmxlKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYykKIHsKIAlNcGkyUG9ydEVuYWJsZVJlcXVlc3RfdCAqbXBpX3JlcXVlc3Q7CiAJTXBpMlBvcnRFbmFibGVSZXBseV90ICptcGlfcmVwbHk7Ci0JdW5zaWduZWQgbG9uZyB0aW1lbGVmdDsKIAlpbnQgciA9IDA7CiAJdTE2IHNtaWQ7CiAJdTE2IGlvY19zdGF0dXM7CkBAIC00NTkyLDggKzQ1ODMsNyBAQAogCiAJaW5pdF9jb21wbGV0aW9uKCZpb2MtPnBvcnRfZW5hYmxlX2NtZHMuZG9uZSk7CiAJbXB0M3Nhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKLQl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5wb3J0X2VuYWJsZV9jbWRzLmRvbmUsCi0JICAgIDMwMCpIWik7CisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPnBvcnRfZW5hYmxlX2NtZHMuZG9uZSwgMzAwKkhaKTsKIAlpZiAoIShpb2MtPnBvcnRfZW5hYmxlX2NtZHMuc3RhdHVzICYgTVBUM19DTURfQ09NUExFVEUpKSB7CiAJCXByX2VycihNUFQzU0FTX0ZNVCAiJXM6IHRpbWVvdXRcbiIsCiAJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKQEAgLTQ3MzcsMTUgKzQ3MjcsMTMgQEAKIC8qKgogICogX2Jhc2VfZXZlbnRfbm90aWZpY2F0aW9uIC0gc2VuZCBldmVudCBub3RpZmljYXRpb24KICAqIEBpb2M6IHBlciBhZGFwdGVyIG9iamVjdAotICogQHNsZWVwX2ZsYWc6IENBTl9TTEVFUCBvciBOT19TTEVFUAogICoKICAqIFJldHVybnMgMCBmb3Igc3VjY2Vzcywgbm9uLXplcm8gZm9yIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQKLV9iYXNlX2V2ZW50X25vdGlmaWNhdGlvbihzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIGludCBzbGVlcF9mbGFnKQorX2Jhc2VfZXZlbnRfbm90aWZpY2F0aW9uKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYykKIHsKIAlNcGkyRXZlbnROb3RpZmljYXRpb25SZXF1ZXN0X3QgKm1waV9yZXF1ZXN0OwotCXVuc2lnbmVkIGxvbmcgdGltZWxlZnQ7CiAJdTE2IHNtaWQ7CiAJaW50IHIgPSAwOwogCWludCBpOwpAQCAtNDc3Nyw3ICs0NzY1LDcgQEAKIAkJICAgIGNwdV90b19sZTMyKGlvYy0+ZXZlbnRfbWFza3NbaV0pOwogCWluaXRfY29tcGxldGlvbigmaW9jLT5iYXNlX2NtZHMuZG9uZSk7CiAJbXB0M3Nhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKLQl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5iYXNlX2NtZHMuZG9uZSwgMzAqSFopOworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5iYXNlX2NtZHMuZG9uZSwgMzAqSFopOwogCWlmICghKGlvYy0+YmFzZV9jbWRzLnN0YXR1cyAmIE1QVDNfQ01EX0NPTVBMRVRFKSkgewogCQlwcl9lcnIoTVBUM1NBU19GTVQgIiVzOiB0aW1lb3V0XG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CkBAIC00ODI3LDE5ICs0ODE1LDE4IEBACiAJCXJldHVybjsKIAogCW11dGV4X2xvY2soJmlvYy0+YmFzZV9jbWRzLm11dGV4KTsKLQlfYmFzZV9ldmVudF9ub3RpZmljYXRpb24oaW9jLCBDQU5fU0xFRVApOworCV9iYXNlX2V2ZW50X25vdGlmaWNhdGlvbihpb2MpOwogCW11dGV4X3VubG9jaygmaW9jLT5iYXNlX2NtZHMubXV0ZXgpOwogfQogCiAvKioKICAqIF9iYXNlX2RpYWdfcmVzZXQgLSB0aGUgImJpZyBoYW1tZXIiIHN0YXJ0IG9mIGRheSByZXNldAogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAc2xlZXBfZmxhZzogQ0FOX1NMRUVQIG9yIE5PX1NMRUVQCiAgKgogICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotX2Jhc2VfZGlhZ19yZXNldChzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIGludCBzbGVlcF9mbGFnKQorX2Jhc2VfZGlhZ19yZXNldChzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MpCiB7CiAJdTMyIGhvc3RfZGlhZ25vc3RpYzsKIAl1MzIgaW9jX3N0YXRlOwpAQCAtNDg2NywxMCArNDg1NCw3IEBACiAJCXdyaXRlbChNUEkyX1dSU0VRXzZUSF9LRVlfVkFMVUUsICZpb2MtPmNoaXAtPldyaXRlU2VxdWVuY2UpOwogCiAJCS8qIHdhaXQgMTAwIG1zZWMgKi8KLQkJaWYgKHNsZWVwX2ZsYWcgPT0gQ0FOX1NMRUVQKQotCQkJbXNsZWVwKDEwMCk7Ci0JCWVsc2UKLQkJCW1kZWxheSgxMDApOworCQltc2xlZXAoMTAwKTsKIAogCQlpZiAoY291bnQrKyA+IDIwKQogCQkJZ290byBvdXQ7CkBAIC00ODkwLDEwICs0ODc0LDcgQEAKIAkgICAgICZpb2MtPmNoaXAtPkhvc3REaWFnbm9zdGljKTsKIAogCS8qVGhpcyBkZWxheSBhbGxvd3MgdGhlIGNoaXAgUENJZSBoYXJkd2FyZSB0aW1lIHRvIGZpbmlzaCByZXNldCB0YXNrcyovCi0JaWYgKHNsZWVwX2ZsYWcgPT0gQ0FOX1NMRUVQKQotCQltc2xlZXAoTVBJMl9IQVJEX1JFU0VUX1BDSUVfRklSU1RfUkVBRF9ERUxBWV9NSUNST19TRUMvMTAwMCk7Ci0JZWxzZQotCQltZGVsYXkoTVBJMl9IQVJEX1JFU0VUX1BDSUVfRklSU1RfUkVBRF9ERUxBWV9NSUNST19TRUMvMTAwMCk7CisJbXNsZWVwKE1QSTJfSEFSRF9SRVNFVF9QQ0lFX0ZJUlNUX1JFQURfREVMQVlfTUlDUk9fU0VDLzEwMDApOwogCiAJLyogQXBwcm94aW1hdGVseSAzMDAgc2Vjb25kIG1heCB3YWl0ICovCiAJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgKDMwMDAwMDAwMCAvCkBAIC00OTA2LDEzICs0ODg3LDcgQEAKIAkJaWYgKCEoaG9zdF9kaWFnbm9zdGljICYgTVBJMl9ESUFHX1JFU0VUX0FEQVBURVIpKQogCQkJYnJlYWs7CiAKLQkJLyogV2FpdCB0byBwYXNzIHRoZSBzZWNvbmQgcmVhZCBkZWxheSB3aW5kb3cgKi8KLQkJaWYgKHNsZWVwX2ZsYWcgPT0gQ0FOX1NMRUVQKQotCQkJbXNsZWVwKE1QSTJfSEFSRF9SRVNFVF9QQ0lFX1NFQ09ORF9SRUFEX0RFTEFZX01JQ1JPX1NFQwotCQkJCQkJCQkvIDEwMDApOwotCQllbHNlCi0JCQltZGVsYXkoTVBJMl9IQVJEX1JFU0VUX1BDSUVfU0VDT05EX1JFQURfREVMQVlfTUlDUk9fU0VDCi0JCQkJCQkJCS8gMTAwMCk7CisJCW1zbGVlcChNUEkyX0hBUkRfUkVTRVRfUENJRV9TRUNPTkRfUkVBRF9ERUxBWV9NSUNST19TRUMgLyAxMDAwKTsKIAl9CiAKIAlpZiAoaG9zdF9kaWFnbm9zdGljICYgTVBJMl9ESUFHX0hDQl9NT0RFKSB7CkBAIC00OTQxLDggKzQ5MTYsNyBAQAogCiAJZHJzcHJpbnRrKGlvYywgcHJfaW5mbyhNUFQzU0FTX0ZNVAogCQkiV2FpdCBmb3IgRlcgdG8gZ28gdG8gdGhlIFJFQURZIHN0YXRlXG4iLCBpb2MtPm5hbWUpKTsKLQlpb2Nfc3RhdGUgPSBfYmFzZV93YWl0X29uX2lvY3N0YXRlKGlvYywgTVBJMl9JT0NfU1RBVEVfUkVBRFksIDIwLAotCSAgICBzbGVlcF9mbGFnKTsKKwlpb2Nfc3RhdGUgPSBfYmFzZV93YWl0X29uX2lvY3N0YXRlKGlvYywgTVBJMl9JT0NfU1RBVEVfUkVBRFksIDIwKTsKIAlpZiAoaW9jX3N0YXRlKSB7CiAJCXByX2VycihNUFQzU0FTX0ZNVAogCQkJIiVzOiBmYWlsZWQgZ29pbmcgdG8gcmVhZHkgc3RhdGUgKGlvY19zdGF0ZT0weCV4KVxuIiwKQEAgLTQ5NjEsMTQgKzQ5MzUsMTIgQEAKIC8qKgogICogX2Jhc2VfbWFrZV9pb2NfcmVhZHkgLSBwdXQgY29udHJvbGxlciBpbiBSRUFEWSBzdGF0ZQogICogQGlvYzogcGVyIGFkYXB0ZXIgb2JqZWN0Ci0gKiBAc2xlZXBfZmxhZzogQ0FOX1NMRUVQIG9yIE5PX1NMRUVQCiAgKiBAdHlwZTogRk9SQ0VfQklHX0hBTU1FUiBvciBTT0ZUX1JFU0VUCiAgKgogICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KICAqLwogc3RhdGljIGludAotX2Jhc2VfbWFrZV9pb2NfcmVhZHkoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jLCBpbnQgc2xlZXBfZmxhZywKLQllbnVtIHJlc2V0X3R5cGUgdHlwZSkKK19iYXNlX21ha2VfaW9jX3JlYWR5KHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgZW51bSByZXNldF90eXBlIHR5cGUpCiB7CiAJdTMyIGlvY19zdGF0ZTsKIAlpbnQgcmM7CkBAIC00OTk1LDEwICs0OTY3LDcgQEAKIAkJCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXywgaW9jX3N0YXRlKTsKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KLQkJCWlmIChzbGVlcF9mbGFnID09IENBTl9TTEVFUCkKLQkJCQlzc2xlZXAoMSk7Ci0JCQllbHNlCi0JCQkJbWRlbGF5KDEwMDApOworCQkJc3NsZWVwKDEpOwogCQkJaW9jX3N0YXRlID0gbXB0M3Nhc19iYXNlX2dldF9pb2NzdGF0ZShpb2MsIDApOwogCQl9CiAJfQpAQCAtNTAyNCwyNCArNDk5MywyMyBAQAogCiAJaWYgKChpb2Nfc3RhdGUgJiBNUEkyX0lPQ19TVEFURV9NQVNLKSA9PSBNUEkyX0lPQ19TVEFURV9PUEVSQVRJT05BTCkKIAkJaWYgKCEoX2Jhc2Vfc2VuZF9pb2NfcmVzZXQoaW9jLAotCQkgICAgTVBJMl9GVU5DVElPTl9JT0NfTUVTU0FHRV9VTklUX1JFU0VULCAxNSwgQ0FOX1NMRUVQKSkpIHsKKwkJICAgIE1QSTJfRlVOQ1RJT05fSU9DX01FU1NBR0VfVU5JVF9SRVNFVCwgMTUpKSkgewogCQkJcmV0dXJuIDA7CiAJfQogCiAgaXNzdWVfZGlhZ19yZXNldDoKLQlyYyA9IF9iYXNlX2RpYWdfcmVzZXQoaW9jLCBDQU5fU0xFRVApOworCXJjID0gX2Jhc2VfZGlhZ19yZXNldChpb2MpOwogCXJldHVybiByYzsKIH0KIAogLyoqCiAgKiBfYmFzZV9tYWtlX2lvY19vcGVyYXRpb25hbCAtIHB1dCBjb250cm9sbGVyIGluIE9QRVJBVElPTkFMIHN0YXRlCiAgKiBAaW9jOiBwZXIgYWRhcHRlciBvYmplY3QKLSAqIEBzbGVlcF9mbGFnOiBDQU5fU0xFRVAgb3IgTk9fU0xFRVAKICAqCiAgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG5vbi16ZXJvIGZvciBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50Ci1fYmFzZV9tYWtlX2lvY19vcGVyYXRpb25hbChzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIGludCBzbGVlcF9mbGFnKQorX2Jhc2VfbWFrZV9pb2Nfb3BlcmF0aW9uYWwoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jKQogewogCWludCByLCBpLCBpbmRleDsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwpAQCAtNTE2MCw3ICs1MTI4LDcgQEAKIAl9CiAgc2tpcF9pbml0X3JlcGx5X3Bvc3RfZnJlZV9xdWV1ZToKIAotCXIgPSBfYmFzZV9zZW5kX2lvY19pbml0KGlvYywgc2xlZXBfZmxhZyk7CisJciA9IF9iYXNlX3NlbmRfaW9jX2luaXQoaW9jKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKQEAgLTUxODYsMTMgKzUxNTQsMTEgQEAKICBza2lwX2luaXRfcmVwbHlfcG9zdF9ob3N0X2luZGV4OgogCiAJX2Jhc2VfdW5tYXNrX2ludGVycnVwdHMoaW9jKTsKLQlyID0gX2Jhc2VfZXZlbnRfbm90aWZpY2F0aW9uKGlvYywgc2xlZXBfZmxhZyk7CisJciA9IF9iYXNlX2V2ZW50X25vdGlmaWNhdGlvbihpb2MpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIAotCWlmIChzbGVlcF9mbGFnID09IENBTl9TTEVFUCkKLQkJX2Jhc2Vfc3RhdGljX2NvbmZpZ19wYWdlcyhpb2MpOwotCisJX2Jhc2Vfc3RhdGljX2NvbmZpZ19wYWdlcyhpb2MpOwogCiAJaWYgKGlvYy0+aXNfZHJpdmVyX2xvYWRpbmcpIHsKIApAQCAtNTIxMSw3ICs1MTc3LDcgQEAKIAkJcmV0dXJuIHI7IC8qIHNjYW5fc3RhcnQgYW5kIHNjYW5fZmluaXNoZWQgc3VwcG9ydCAqLwogCX0KIAotCXIgPSBfYmFzZV9zZW5kX3BvcnRfZW5hYmxlKGlvYywgc2xlZXBfZmxhZyk7CisJciA9IF9iYXNlX3NlbmRfcG9ydF9lbmFibGUoaW9jKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKQEAgLTUyMzUsNyArNTIwMSw3IEBACiAJaWYgKGlvYy0+Y2hpcF9waHlzICYmIGlvYy0+Y2hpcCkgewogCQlfYmFzZV9tYXNrX2ludGVycnVwdHMoaW9jKTsKIAkJaW9jLT5zaG9zdF9yZWNvdmVyeSA9IDE7Ci0JCV9iYXNlX21ha2VfaW9jX3JlYWR5KGlvYywgQ0FOX1NMRUVQLCBTT0ZUX1JFU0VUKTsKKwkJX2Jhc2VfbWFrZV9pb2NfcmVhZHkoaW9jLCBTT0ZUX1JFU0VUKTsKIAkJaW9jLT5zaG9zdF9yZWNvdmVyeSA9IDA7CiAJfQogCkBAIC01MjkyLDcgKzUyNTgsNyBAQAogCQlnb3RvIG91dF9mcmVlX3Jlc291cmNlczsKIAogCXBjaV9zZXRfZHJ2ZGF0YShpb2MtPnBkZXYsIGlvYy0+c2hvc3QpOwotCXIgPSBfYmFzZV9nZXRfaW9jX2ZhY3RzKGlvYywgQ0FOX1NMRUVQKTsKKwlyID0gX2Jhc2VfZ2V0X2lvY19mYWN0cyhpb2MpOwogCWlmIChyKQogCQlnb3RvIG91dF9mcmVlX3Jlc291cmNlczsKIApAQCAtNTMyNiw3ICs1MjkyLDcgQEAKIAlpb2MtPmJ1aWxkX3NnX21waSA9ICZfYmFzZV9idWlsZF9zZzsKIAlpb2MtPmJ1aWxkX3plcm9fbGVuX3NnZV9tcGkgPSAmX2Jhc2VfYnVpbGRfemVyb19sZW5fc2dlOwogCi0JciA9IF9iYXNlX21ha2VfaW9jX3JlYWR5KGlvYywgQ0FOX1NMRUVQLCBTT0ZUX1JFU0VUKTsKKwlyID0gX2Jhc2VfbWFrZV9pb2NfcmVhZHkoaW9jLCBTT0ZUX1JFU0VUKTsKIAlpZiAocikKIAkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CiAKQEAgLTUzMzgsMTIgKzUzMDQsMTIgQEAKIAl9CiAKIAlmb3IgKGkgPSAwIDsgaSA8IGlvYy0+ZmFjdHMuTnVtYmVyT2ZQb3J0czsgaSsrKSB7Ci0JCXIgPSBfYmFzZV9nZXRfcG9ydF9mYWN0cyhpb2MsIGksIENBTl9TTEVFUCk7CisJCXIgPSBfYmFzZV9nZXRfcG9ydF9mYWN0cyhpb2MsIGkpOwogCQlpZiAocikKIAkJCWdvdG8gb3V0X2ZyZWVfcmVzb3VyY2VzOwogCX0KIAotCXIgPSBfYmFzZV9hbGxvY2F0ZV9tZW1vcnlfcG9vbHMoaW9jLCBDQU5fU0xFRVApOworCXIgPSBfYmFzZV9hbGxvY2F0ZV9tZW1vcnlfcG9vbHMoaW9jKTsKIAlpZiAocikKIAkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CiAKQEAgLTU0MjksNyArNTM5NSw3IEBACiAJaWYgKGlvYy0+aGJhX21waV92ZXJzaW9uX2JlbG9uZ2VkID09IE1QSTI2X1ZFUlNJT04pCiAJCV9iYXNlX3VubWFza19ldmVudHMoaW9jLCBNUEkyX0VWRU5UX0FDVElWRV9DQUJMRV9FWENFUFRJT04pOwogCi0JciA9IF9iYXNlX21ha2VfaW9jX29wZXJhdGlvbmFsKGlvYywgQ0FOX1NMRUVQKTsKKwlyID0gX2Jhc2VfbWFrZV9pb2Nfb3BlcmF0aW9uYWwoaW9jKTsKIAlpZiAocikKIAkJZ290byBvdXRfZnJlZV9yZXNvdXJjZXM7CiAKQEAgLTU1NjUsMjEgKzU1MzEsMTggQEAKIC8qKgogICogX3dhaXRfZm9yX2NvbW1hbmRzX3RvX2NvbXBsZXRlIC0gcmVzZXQgY29udHJvbGxlcgogICogQGlvYzogUG9pbnRlciB0byBNUFRfQURBUFRFUiBzdHJ1Y3R1cmUKLSAqIEBzbGVlcF9mbGFnOiBDQU5fU0xFRVAgb3IgTk9fU0xFRVAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdhaXRpbmcoM3MpIGZvciBhbGwgcGVuZGluZyBjb21tYW5kcyB0byBjb21wbGV0ZQogICogcHJpb3IgdG8gcHV0dGluZyBjb250cm9sbGVyIGluIHJlc2V0LgogICovCiBzdGF0aWMgdm9pZAotX3dhaXRfZm9yX2NvbW1hbmRzX3RvX2NvbXBsZXRlKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgaW50IHNsZWVwX2ZsYWcpCitfd2FpdF9mb3JfY29tbWFuZHNfdG9fY29tcGxldGUoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jKQogewogCXUzMiBpb2Nfc3RhdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MTYgaTsKIAogCWlvYy0+cGVuZGluZ19pb19jb3VudCA9IDA7Ci0JaWYgKHNsZWVwX2ZsYWcgIT0gQ0FOX1NMRUVQKQotCQlyZXR1cm47CiAKIAlpb2Nfc3RhdGUgPSBtcHQzc2FzX2Jhc2VfZ2V0X2lvY3N0YXRlKGlvYywgMCk7CiAJaWYgKChpb2Nfc3RhdGUgJiBNUEkyX0lPQ19TVEFURV9NQVNLKSAhPSBNUEkyX0lPQ19TVEFURV9PUEVSQVRJT05BTCkKQEAgLTU2MDIsMTMgKzU1NjUsMTIgQEAKIC8qKgogICogbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlciAtIHJlc2V0IGNvbnRyb2xsZXIKICAqIEBpb2M6IFBvaW50ZXIgdG8gTVBUX0FEQVBURVIgc3RydWN0dXJlCi0gKiBAc2xlZXBfZmxhZzogQ0FOX1NMRUVQIG9yIE5PX1NMRUVQCiAgKiBAdHlwZTogRk9SQ0VfQklHX0hBTU1FUiBvciBTT0ZUX1JFU0VUCiAgKgogICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub24temVybyBmb3IgZmFpbHVyZS4KICAqLwogaW50Ci1tcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgaW50IHNsZWVwX2ZsYWcsCittcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywKIAllbnVtIHJlc2V0X3R5cGUgdHlwZSkKIHsKIAlpbnQgcjsKQEAgLTU2MjksMTMgKzU1OTEsNiBAQAogCWlmIChtcHQzc2FzX2Z3ZmF1bHRfZGVidWcpCiAJCW1wdDNzYXNfaGFsdF9maXJtd2FyZShpb2MpOwogCi0JLyogVE9ETyAtIFdoYXQgd2UgcmVhbGx5IHNob3VsZCBiZSBkb2luZyBpcyBwdWxsaW5nCi0JICogb3V0IGFsbCB0aGUgY29kZSBhc3NvY2lhdGVkIHdpdGggTk9fU0xFRVA7IGl0cyBuZXZlciB1c2VkLgotCSAqIFRoYXQgaXMgbGVnYWN5IGNvZGUgZnJvbSBtcHQgZnVzaW9uIGRyaXZlciwgcG9ydGVkIG92ZXIuCi0JICogSSB3aWxsIGxlYXZlIHRoaXMgQlVHX09OIGhlcmUgZm9yIG5vdyB0aWxsIGl0cyBiZWVuIHJlc29sdmVkLgotCSAqLwotCUJVR19PTihzbGVlcF9mbGFnID09IE5PX1NMRUVQKTsKLQogCS8qIHdhaXQgZm9yIGFuIGFjdGl2ZSByZXNldCBpbiBwcm9ncmVzcyB0byBjb21wbGV0ZSAqLwogCWlmICghbXV0ZXhfdHJ5bG9jaygmaW9jLT5yZXNldF9pbl9wcm9ncmVzc19tdXRleCkpIHsKIAkJZG8gewpAQCAtNTY2MCw5ICs1NjE1LDkgQEAKIAkJCWlzX2ZhdWx0ID0gMTsKIAl9CiAJX2Jhc2VfcmVzZXRfaGFuZGxlcihpb2MsIE1QVDNfSU9DX1BSRV9SRVNFVCk7Ci0JX3dhaXRfZm9yX2NvbW1hbmRzX3RvX2NvbXBsZXRlKGlvYywgc2xlZXBfZmxhZyk7CisJX3dhaXRfZm9yX2NvbW1hbmRzX3RvX2NvbXBsZXRlKGlvYyk7CiAJX2Jhc2VfbWFza19pbnRlcnJ1cHRzKGlvYyk7Ci0JciA9IF9iYXNlX21ha2VfaW9jX3JlYWR5KGlvYywgc2xlZXBfZmxhZywgdHlwZSk7CisJciA9IF9iYXNlX21ha2VfaW9jX3JlYWR5KGlvYywgdHlwZSk7CiAJaWYgKHIpCiAJCWdvdG8gb3V0OwogCV9iYXNlX3Jlc2V0X2hhbmRsZXIoaW9jLCBNUFQzX0lPQ19BRlRFUl9SRVNFVCk7CkBAIC01Njc1LDcgKzU2MzAsNyBAQAogCQlyID0gLUVGQVVMVDsKIAkJZ290byBvdXQ7CiAJfQotCXIgPSBfYmFzZV9nZXRfaW9jX2ZhY3RzKGlvYywgQ0FOX1NMRUVQKTsKKwlyID0gX2Jhc2VfZ2V0X2lvY19mYWN0cyhpb2MpOwogCWlmIChyKQogCQlnb3RvIG91dDsKIApAQCAtNTY4NCw3ICs1NjM5LDcgQEAKIAkJICAgICAgIlBsZWFzZSByZWJvb3QgdGhlIHN5c3RlbSBhbmQgZW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QiCiAJCSAgICAgICIgZmlybXdhcmUgdmVyc2lvbiBpcyBydW5uaW5nXG4iLCBpb2MtPm5hbWUpOwogCi0JciA9IF9iYXNlX21ha2VfaW9jX29wZXJhdGlvbmFsKGlvYywgc2xlZXBfZmxhZyk7CisJciA9IF9iYXNlX21ha2VfaW9jX29wZXJhdGlvbmFsKGlvYyk7CiAJaWYgKCFyKQogCQlfYmFzZV9yZXNldF9oYW5kbGVyKGlvYywgTVBUM19JT0NfRE9ORV9SRVNFVCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQzc2FzL21wdDNzYXNfYmFzZS5oIGIvZHJpdmVycy9zY3NpL21wdDNzYXMvbXB0M3Nhc19iYXNlLmgKaW5kZXggODkyYzliZS4uM2U3MWJjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDNzYXMvbXB0M3Nhc19iYXNlLmgKKysrIGIvZHJpdmVycy9zY3NpL21wdDNzYXMvbXB0M3Nhc19iYXNlLmgKQEAgLTExOSwxMCArMTE5LDYgQEAKIAogI2RlZmluZSBNUFRfTUFYX0NBTExCQUNLUwkJMzIKIAotCi0jZGVmaW5lCSBDQU5fU0xFRVAJCQkxCi0jZGVmaW5lICBOT19TTEVFUAkJCTAKLQogI2RlZmluZSBJTlRFUk5BTF9DTURTX0NPVU5UCQkxMAkvKiByZXNlcnZlZCBjbWRzICovCiAvKiByZXNlcnZlZCBmb3IgaXNzdWluZyBpbnRlcm5hbGx5IGZyYW1lZCBzY3NpIGlvIGNtZHMgKi8KICNkZWZpbmUgSU5URVJOQUxfU0NTSUlPX0NNRFNfQ09VTlQJMwpAQCAtNDc4LDcgKzQ3NCw3IEBACiAJdTgJcGZhX2xlZF9vbjsKIAl1OAlwZW5kX3Nhc19ycGh5X2FkZDsKIAl1OAllbmNsb3N1cmVfbGV2ZWw7Ci0JdTgJY29ubmVjdG9yX25hbWVbNF07CisJdTgJY29ubmVjdG9yX25hbWVbNV07CiAJc3RydWN0IGtyZWYgcmVmY291bnQ7CiB9OwogCkBAIC03OTQsMTYgKzc5MCw2IEBACiAJZG1hX2FkZHJfdAkJCXJlcGx5X3Bvc3RfZnJlZV9kbWE7CiB9OwogCi0vKioKLSAqIGVudW0gbXV0ZXhfdHlwZSAtIHRhc2sgbWFuYWdlbWVudCBtdXRleCB0eXBlCi0gKiBAVE1fTVVURVhfT0ZGOiBtdXRleCBpcyBub3QgcmVxdWlyZWQgYmVjdWFzZSBjYWxsaW5nIGZ1bmN0aW9uIGlzIGFjcXVpcmluZyBpdAotICogQFRNX01VVEVYX09OOiBtdXRleCBpcyByZXF1aXJlZAotICovCi1lbnVtIG11dGV4X3R5cGUgewotCVRNX01VVEVYX09GRiA9IDAsCi0JVE1fTVVURVhfT04gPSAxLAotfTsKLQogdHlwZWRlZiB2b2lkICgqTVBUM1NBU19GTFVTSF9SVU5OSU5HX0NNRFMpKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYyk7CiAvKioKICAqIHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgLSBwZXIgYWRhcHRlciBzdHJ1Y3QKQEAgLTEyMjksNyArMTIxNSw3IEBACiB2b2lkIG1wdDNzYXNfYmFzZV9kZXRhY2goc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jKTsKIGludCBtcHQzc2FzX2Jhc2VfbWFwX3Jlc291cmNlcyhzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MpOwogdm9pZCBtcHQzc2FzX2Jhc2VfZnJlZV9yZXNvdXJjZXMoc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jKTsKLWludCBtcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgaW50IHNsZWVwX2ZsYWcsCitpbnQgbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsCiAJZW51bSByZXNldF90eXBlIHR5cGUpOwogCiB2b2lkICptcHQzc2FzX2Jhc2VfZ2V0X21zZ19mcmFtZShzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIHUxNiBzbWlkKTsKQEAgLTEyOTEsNyArMTI3NywxMSBAQAogCiBpbnQgbXB0M3Nhc19zY3NpaF9pc3N1ZV90bShzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUsCiAJdWludCBjaGFubmVsLCB1aW50IGlkLCB1aW50IGx1biwgdTggdHlwZSwgdTE2IHNtaWRfdGFzaywKLQl1bG9uZyB0aW1lb3V0LCBlbnVtIG11dGV4X3R5cGUgbV90eXBlKTsKKwl1bG9uZyB0aW1lb3V0KTsKK2ludCBtcHQzc2FzX3Njc2loX2lzc3VlX2xvY2tlZF90bShzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUsCisJdWludCBjaGFubmVsLCB1aW50IGlkLCB1aW50IGx1biwgdTggdHlwZSwgdTE2IHNtaWRfdGFzaywKKwl1bG9uZyB0aW1lb3V0KTsKKwogdm9pZCBtcHQzc2FzX3Njc2loX3NldF90bV9mbGFnKHN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYywgdTE2IGhhbmRsZSk7CiB2b2lkIG1wdDNzYXNfc2NzaWhfY2xlYXJfdG1fZmxhZyhzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUpOwogdm9pZCBtcHQzc2FzX2V4cGFuZGVyX3JlbW92ZShzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIHU2NCBzYXNfYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX2NvbmZpZy5jIGIvZHJpdmVycy9zY3NpL21wdDNzYXMvbXB0M3Nhc19jb25maWcuYwppbmRleCBhNjkxNGVjLi5jZWJmZDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQzc2FzL21wdDNzYXNfY29uZmlnLmMKQEAgLTI4NSw3ICsyODUsNiBAQAogewogCXUxNiBzbWlkOwogCXUzMiBpb2Nfc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lbGVmdDsKIAlNcGkyQ29uZmlnUmVxdWVzdF90ICpjb25maWdfcmVxdWVzdDsKIAlpbnQgcjsKIAl1OCByZXRyeV9jb3VudCwgaXNzdWVfaG9zdF9yZXNldCA9IDA7CkBAIC0zODYsOCArMzg1LDcgQEAKIAlfY29uZmlnX2Rpc3BsYXlfc29tZV9kZWJ1Zyhpb2MsIHNtaWQsICJjb25maWdfcmVxdWVzdCIsIE5VTEwpOwogCWluaXRfY29tcGxldGlvbigmaW9jLT5jb25maWdfY21kcy5kb25lKTsKIAltcHQzc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQpOwotCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPmNvbmZpZ19jbWRzLmRvbmUsCi0JICAgIHRpbWVvdXQqSFopOworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5jb25maWdfY21kcy5kb25lLCB0aW1lb3V0KkhaKTsKIAlpZiAoIShpb2MtPmNvbmZpZ19jbWRzLnN0YXR1cyAmIE1QVDNfQ01EX0NPTVBMRVRFKSkgewogCQlwcl9lcnIoTVBUM1NBU19GTVQgIiVzOiB0aW1lb3V0XG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CkBAIC00OTEsOCArNDg5LDcgQEAKIAltdXRleF91bmxvY2soJmlvYy0+Y29uZmlnX2NtZHMubXV0ZXgpOwogCiAJaWYgKGlzc3VlX2hvc3RfcmVzZXQpCi0JCW1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBDQU5fU0xFRVAsCi0JCSAgICBGT1JDRV9CSUdfSEFNTUVSKTsKKwkJbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIEZPUkNFX0JJR19IQU1NRVIpOwogCXJldHVybiByOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX2N0bC5jIGIvZHJpdmVycy9zY3NpL21wdDNzYXMvbXB0M3Nhc19jdGwuYwppbmRleCA3ZDAwZjA5Li4yNmNkYzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX2N0bC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQzc2FzL21wdDNzYXNfY3RsLmMKQEAgLTUxOCw3ICs1MTgsNyBAQAogICoKICAqIENhbGxlZCB3aGVuIGFwcGxpY2F0aW9uIHJlcXVlc3QgZmFzeW4gY2FsbGJhY2sgaGFuZGxlci4KICAqLwotaW50CitzdGF0aWMgaW50CiBfY3RsX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxlcCwgaW50IG1vZGUpCiB7CiAJcmV0dXJuIGZhc3luY19oZWxwZXIoZmQsIGZpbGVwLCBtb2RlLCAmYXN5bmNfcXVldWUpOwpAQCAtNTMwLDcgKzUzMCw3IEBACiAgKiBAd2FpdCAtCiAgKgogICovCi11bnNpZ25lZCBpbnQKK3N0YXRpYyB1bnNpZ25lZCBpbnQKIF9jdGxfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAJc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jOwpAQCAtNjQxLDkgKzY0MSw4IEBACiAJTVBJMlJlcXVlc3RIZWFkZXJfdCAqbXBpX3JlcXVlc3QgPSBOVUxMLCAqcmVxdWVzdDsKIAlNUEkyRGVmYXVsdFJlcGx5X3QgKm1waV9yZXBseTsKIAl1MzIgaW9jX3N0YXRlOwotCXUxNiBpb2Nfc3RhdHVzOwogCXUxNiBzbWlkOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dCwgdGltZWxlZnQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCXU4IGlzc3VlX3Jlc2V0OwogCXUzMiBzejsKIAl2b2lkICpwc2dlOwpAQCAtOTE0LDggKzkxMyw3IEBACiAJCXRpbWVvdXQgPSBNUFQzX0lPQ1RMX0RFRkFVTFRfVElNRU9VVDsKIAllbHNlCiAJCXRpbWVvdXQgPSBrYXJnLnRpbWVvdXQ7Ci0JdGltZWxlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+Y3RsX2NtZHMuZG9uZSwKLQkgICAgdGltZW91dCpIWik7CisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPmN0bF9jbWRzLmRvbmUsIHRpbWVvdXQqSFopOwogCWlmIChtcGlfcmVxdWVzdC0+RnVuY3Rpb24gPT0gTVBJMl9GVU5DVElPTl9TQ1NJX1RBU0tfTUdNVCkgewogCQlNcGkyU0NTSVRhc2tNYW5hZ2VtZW50UmVxdWVzdF90ICp0bV9yZXF1ZXN0ID0KIAkJICAgIChNcGkyU0NTSVRhc2tNYW5hZ2VtZW50UmVxdWVzdF90ICopbXBpX3JlcXVlc3Q7CkBAIC05MzgsNyArOTM2LDYgQEAKIAl9CiAKIAltcGlfcmVwbHkgPSBpb2MtPmN0bF9jbWRzLnJlcGx5OwotCWlvY19zdGF0dXMgPSBsZTE2X3RvX2NwdShtcGlfcmVwbHktPklPQ1N0YXR1cykgJiBNUEkyX0lPQ1NUQVRVU19NQVNLOwogCiAJaWYgKG1waV9yZXBseS0+RnVuY3Rpb24gPT0gTVBJMl9GVU5DVElPTl9TQ1NJX1RBU0tfTUdNVCAmJgogCSAgICAoaW9jLT5sb2dnaW5nX2xldmVsICYgTVBUX0RFQlVHX1RNKSkgewpAQCAtMTAwMSwxMyArOTk4LDExIEBACiAJCQkJaW9jLT5uYW1lLAogCQkJCWxlMTZfdG9fY3B1KG1waV9yZXF1ZXN0LT5GdW5jdGlvbkRlcGVuZGVudDEpKTsKIAkJCW1wdDNzYXNfaGFsdF9maXJtd2FyZShpb2MpOwotCQkJbXB0M3Nhc19zY3NpaF9pc3N1ZV90bShpb2MsCisJCQltcHQzc2FzX3Njc2loX2lzc3VlX2xvY2tlZF90bShpb2MsCiAJCQkgICAgbGUxNl90b19jcHUobXBpX3JlcXVlc3QtPkZ1bmN0aW9uRGVwZW5kZW50MSksIDAsIDAsCi0JCQkgICAgMCwgTVBJMl9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfVEFSR0VUX1JFU0VULCAwLCAzMCwKLQkJCSAgICBUTV9NVVRFWF9PTik7CisJCQkgICAgMCwgTVBJMl9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfVEFSR0VUX1JFU0VULCAwLCAzMCk7CiAJCX0gZWxzZQotCQkJbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwKLQkJCSAgICBGT1JDRV9CSUdfSEFNTUVSKTsKKwkJCW1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBGT1JDRV9CSUdfSEFNTUVSKTsKIAl9CiAKICBvdXQ6CkBAIC0xMjIwLDggKzEyMTUsNyBAQAogCWRjdGxwcmludGsoaW9jLCBwcl9pbmZvKE1QVDNTQVNfRk1UICIlczogZW50ZXJcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKIAotCXJldHZhbCA9IG1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBDQU5fU0xFRVAsCi0JICAgIEZPUkNFX0JJR19IQU1NRVIpOworCXJldHZhbCA9IG1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBGT1JDRV9CSUdfSEFNTUVSKTsKIAlwcl9pbmZvKE1QVDNTQVNfRk1UICJob3N0IHJlc2V0OiAlc1xuIiwKIAkgICAgaW9jLT5uYW1lLCAoKCFyZXR2YWwpID8gIlNVQ0NFU1MiIDogIkZBSUxFRCIpKTsKIAlyZXR1cm4gMDsKQEAgLTEzODEsNyArMTM3NSw2IEBACiAJTXBpMkRpYWdCdWZmZXJQb3N0UmVxdWVzdF90ICptcGlfcmVxdWVzdDsKIAlNcGkyRGlhZ0J1ZmZlclBvc3RSZXBseV90ICptcGlfcmVwbHk7CiAJdTggYnVmZmVyX3R5cGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lbGVmdDsKIAl1MTYgc21pZDsKIAl1MTYgaW9jX3N0YXR1czsKIAl1MzIgaW9jX3N0YXRlOwpAQCAtMTQ5OSw3ICsxNDkyLDcgQEAKIAogCWluaXRfY29tcGxldGlvbigmaW9jLT5jdGxfY21kcy5kb25lKTsKIAltcHQzc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQpOwotCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPmN0bF9jbWRzLmRvbmUsCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPmN0bF9jbWRzLmRvbmUsCiAJICAgIE1QVDNfSU9DVExfREVGQVVMVF9USU1FT1VUKkhaKTsKIAogCWlmICghKGlvYy0+Y3RsX2NtZHMuc3RhdHVzICYgTVBUM19DTURfQ09NUExFVEUpKSB7CkBAIC0xNTM4LDggKzE1MzEsNyBAQAogCiAgaXNzdWVfaG9zdF9yZXNldDoKIAlpZiAoaXNzdWVfcmVzZXQpCi0JCW1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBDQU5fU0xFRVAsCi0JCSAgICBGT1JDRV9CSUdfSEFNTUVSKTsKKwkJbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIEZPUkNFX0JJR19IQU1NRVIpOwogCiAgb3V0OgogCkBAIC0xODAwLDcgKzE3OTIsNiBAQAogCXUxNiBpb2Nfc3RhdHVzOwogCXUzMiBpb2Nfc3RhdGU7CiAJaW50IHJjOwotCXVuc2lnbmVkIGxvbmcgdGltZWxlZnQ7CiAKIAlkY3RscHJpbnRrKGlvYywgcHJfaW5mbyhNUFQzU0FTX0ZNVCAiJXNcbiIsIGlvYy0+bmFtZSwKIAkgICAgX19mdW5jX18pKTsKQEAgLTE4NDgsNyArMTgzOSw3IEBACiAKIAlpbml0X2NvbXBsZXRpb24oJmlvYy0+Y3RsX2NtZHMuZG9uZSk7CiAJbXB0M3Nhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKLQl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5jdGxfY21kcy5kb25lLAorCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT5jdGxfY21kcy5kb25lLAogCSAgICBNUFQzX0lPQ1RMX0RFRkFVTFRfVElNRU9VVCpIWik7CiAKIAlpZiAoIShpb2MtPmN0bF9jbWRzLnN0YXR1cyAmIE1QVDNfQ01EX0NPTVBMRVRFKSkgewpAQCAtMTk3NCw4ICsxOTY1LDcgQEAKIAlyYyA9IG1wdDNzYXNfc2VuZF9kaWFnX3JlbGVhc2UoaW9jLCBidWZmZXJfdHlwZSwgJmlzc3VlX3Jlc2V0KTsKIAogCWlmIChpc3N1ZV9yZXNldCkKLQkJbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwKLQkJICAgIEZPUkNFX0JJR19IQU1NRVIpOworCQltcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgRk9SQ0VfQklHX0hBTU1FUik7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0xOTk1LDcgKzE5ODUsNyBAQAogCU1waTJEaWFnQnVmZmVyUG9zdFJlcGx5X3QgKm1waV9yZXBseTsKIAlpbnQgcmMsIGk7CiAJdTggYnVmZmVyX3R5cGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lbGVmdCwgcmVxdWVzdF9zaXplLCBjb3B5X3NpemU7CisJdW5zaWduZWQgbG9uZyByZXF1ZXN0X3NpemUsIGNvcHlfc2l6ZTsKIAl1MTYgc21pZDsKIAl1MTYgaW9jX3N0YXR1czsKIAl1OCBpc3N1ZV9yZXNldCA9IDA7CkBAIC0yMTE2LDcgKzIxMDYsNyBAQAogCiAJaW5pdF9jb21wbGV0aW9uKCZpb2MtPmN0bF9jbWRzLmRvbmUpOwogCW1wdDNzYXNfYmFzZV9wdXRfc21pZF9kZWZhdWx0KGlvYywgc21pZCk7Ci0JdGltZWxlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+Y3RsX2NtZHMuZG9uZSwKKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+Y3RsX2NtZHMuZG9uZSwKIAkgICAgTVBUM19JT0NUTF9ERUZBVUxUX1RJTUVPVVQqSFopOwogCiAJaWYgKCEoaW9jLT5jdGxfY21kcy5zdGF0dXMgJiBNUFQzX0NNRF9DT01QTEVURSkpIHsKQEAgLTIxNTUsOCArMjE0NSw3IEBACiAKICBpc3N1ZV9ob3N0X3Jlc2V0OgogCWlmIChpc3N1ZV9yZXNldCkKLQkJbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwKLQkJICAgIEZPUkNFX0JJR19IQU1NRVIpOworCQltcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgRk9SQ0VfQklHX0hBTU1FUik7CiAKICBvdXQ6CiAKQEAgLTIzNTIsNyArMjM0MSw3IEBACiAgKiBAY21kIC0gaW9jdGwgb3Bjb2RlCiAgKiBAYXJnIC0KICAqLwotbG9uZworc3RhdGljIGxvbmcKIF9jdGxfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWxvbmcgcmV0OwpAQCAtMjM3Miw3ICsyMzYxLDcgQEAKICAqIEBjbWQgLSBpb2N0bCBvcGNvZGUKICAqIEBhcmcgLQogICovCi1sb25nCitzdGF0aWMgbG9uZwogX2N0bF9tcHQyX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlsb25nIHJldDsKQEAgLTIzOTIsNyArMjM4MSw3IEBACiAgKgogICogVGhpcyByb3V0aW5lIGhhbmRsZXMgMzIgYml0IGFwcGxpY2F0aW9ucyBpbiA2NGJpdCBvcy4KICAqLwotbG9uZworc3RhdGljIGxvbmcKIF9jdGxfaW9jdGxfY29tcGF0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWxvbmcgcmV0OwpAQCAtMjQxMCw3ICsyMzk5LDcgQEAKICAqCiAgKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyAzMiBiaXQgYXBwbGljYXRpb25zIGluIDY0Yml0IG9zLgogICovCi1sb25nCitzdGF0aWMgbG9uZwogX2N0bF9tcHQyX2lvY3RsX2NvbXBhdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlsb25nIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQzc2FzL21wdDNzYXNfc2NzaWguYyBiL2RyaXZlcnMvc2NzaS9tcHQzc2FzL21wdDNzYXNfc2NzaWguYwppbmRleCBjZDkxYTY4Li4yMDlhOTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX3Njc2loLmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDNzYXMvbXB0M3Nhc19zY3NpaC5jCkBAIC0xMTk1LDcgKzExOTUsNyBAQAogICoKICAqIFJldHVybnMgcXVldWUgZGVwdGguCiAgKi8KLWludAorc3RhdGljIGludAogc2NzaWhfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHFkZXB0aCkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNkZXYtPmhvc3Q7CkBAIC0xMjQ0LDcgKzEyNDQsNyBAQAogICogUmV0dXJucyAwIGlmIG9rLiBBbnkgb3RoZXIgcmV0dXJuIGlzIGFzc3VtZWQgdG8gYmUgYW4gZXJyb3IgYW5kCiAgKiB0aGUgZGV2aWNlIGlzIGlnbm9yZWQuCiAgKi8KLWludAorc3RhdGljIGludAogc2NzaWhfdGFyZ2V0X2FsbG9jKHN0cnVjdCBzY3NpX3RhcmdldCAqc3RhcmdldCkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGRldl90b19zaG9zdCgmc3RhcmdldC0+ZGV2KTsKQEAgLTEzMTEsNyArMTMxMSw3IEBACiAgKgogICogUmV0dXJucyBub3RoaW5nLgogICovCi12b2lkCitzdGF0aWMgdm9pZAogc2NzaWhfdGFyZ2V0X2Rlc3Ryb3koc3RydWN0IHNjc2lfdGFyZ2V0ICpzdGFyZ2V0KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KCZzdGFyZ2V0LT5kZXYpOwpAQCAtMTMyMCw3ICsxMzIwLDYgQEAKIAlzdHJ1Y3QgX3Nhc19kZXZpY2UgKnNhc19kZXZpY2U7CiAJc3RydWN0IF9yYWlkX2RldmljZSAqcmFpZF9kZXZpY2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHk7CiAKIAlzYXNfdGFyZ2V0X3ByaXZfZGF0YSA9IHN0YXJnZXQtPmhvc3RkYXRhOwogCWlmICghc2FzX3RhcmdldF9wcml2X2RhdGEpCkBAIC0xMzM5LDcgKzEzMzgsNiBAQAogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNhc19kZXZpY2VfbG9jaywgZmxhZ3MpOwotCXJwaHkgPSBkZXZfdG9fcnBoeShzdGFyZ2V0LT5kZXYucGFyZW50KTsKIAlzYXNfZGV2aWNlID0gX19tcHQzc2FzX2dldF9zZGV2X2Zyb21fdGFyZ2V0KGlvYywgc2FzX3RhcmdldF9wcml2X2RhdGEpOwogCWlmIChzYXNfZGV2aWNlICYmIChzYXNfZGV2aWNlLT5zdGFyZ2V0ID09IHN0YXJnZXQpICYmCiAJICAgIChzYXNfZGV2aWNlLT5pZCA9PSBzdGFyZ2V0LT5pZCkgJiYKQEAgLTEzNjksNyArMTM2Nyw3IEBACiAgKiBSZXR1cm5zIDAgaWYgb2suIEFueSBvdGhlciByZXR1cm4gaXMgYXNzdW1lZCB0byBiZSBhbiBlcnJvciBhbmQKICAqIHRoZSBkZXZpY2UgaXMgaWdub3JlZC4KICAqLwotaW50CitzdGF0aWMgaW50CiBzY3NpaF9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CkBAIC0xNDM0LDcgKzE0MzIsNyBAQAogICoKICAqIFJldHVybnMgbm90aGluZy4KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIHNjc2loX3NsYXZlX2Rlc3Ryb3koc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewogCXN0cnVjdCBNUFQzU0FTX1RBUkdFVCAqc2FzX3RhcmdldF9wcml2X2RhdGE7CkBAIC0xNTI3LDcgKzE1MjUsNyBAQAogICogc2NzaWhfaXNfcmFpZCAtIHJldHVybiBib29sZWFuIGluZGljYXRpbmcgZGV2aWNlIGlzIHJhaWQgdm9sdW1lCiAgKiBAZGV2IHRoZSBkZXZpY2Ugc3RydWN0IG9iamVjdAogICovCi1pbnQKK3N0YXRpYyBpbnQKIHNjc2loX2lzX3JhaWQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CkBAIC0xNTQyLDcgKzE1NDAsNyBAQAogICogc2NzaWhfZ2V0X3Jlc3luYyAtIGdldCByYWlkIHZvbHVtZSByZXN5bmMgcGVyY2VudCBjb21wbGV0ZQogICogQGRldiB0aGUgZGV2aWNlIHN0cnVjdCBvYmplY3QKICAqLwotdm9pZAorc3RhdGljIHZvaWQKIHNjc2loX2dldF9yZXN5bmMoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldiA9IHRvX3Njc2lfZGV2aWNlKGRldik7CkBAIC0xNjAzLDcgKzE2MDEsNyBAQAogICogc2NzaWhfZ2V0X3N0YXRlIC0gZ2V0IHJhaWQgdm9sdW1lIGxldmVsCiAgKiBAZGV2IHRoZSBkZXZpY2Ugc3RydWN0IG9iamVjdAogICovCi12b2lkCitzdGF0aWMgdm9pZAogc2NzaWhfZ2V0X3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOwpAQCAtMTgwNSw3ICsxODAzLDcgQEAKICAqIFJldHVybnMgMCBpZiBvay4gQW55IG90aGVyIHJldHVybiBpcyBhc3N1bWVkIHRvIGJlIGFuIGVycm9yIGFuZAogICogdGhlIGRldmljZSBpcyBpZ25vcmVkLgogICovCi1pbnQKK3N0YXRpYyBpbnQKIHNjc2loX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzZGV2LT5ob3N0OwpAQCAtMjAyMSw3ICsyMDE5LDcgQEAKICAqCiAgKiBSZXR1cm4gbm90aGluZy4KICAqLwotaW50CitzdGF0aWMgaW50CiBzY3NpaF9iaW9zX3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAlzZWN0b3JfdCBjYXBhY2l0eSwgaW50IHBhcmFtc1tdKQogewpAQCAtMjIwMSw3ICsyMTk5LDYgQEAKICAqIEB0eXBlOiBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9fWFhYIChkZWZpbmVkIGluIG1waTJfaW5pdC5oKQogICogQHNtaWRfdGFzazogc21pZCBhc3NpZ25lZCB0byB0aGUgdGFzawogICogQHRpbWVvdXQ6IHRpbWVvdXQgaW4gc2Vjb25kcwotICogQG1fdHlwZTogVE1fTVVURVhfT04gb3IgVE1fTVVURVhfT0ZGCiAgKiBDb250ZXh0OiB1c2VyCiAgKgogICogQSBnZW5lcmljIEFQSSBmb3Igc2VuZGluZyB0YXNrIG1hbmFnZW1lbnQgcmVxdWVzdHMgdG8gZmlybXdhcmUuCkBAIC0yMjEyLDYwICsyMjA5LDUxIEBACiAgKi8KIGludAogbXB0M3Nhc19zY3NpaF9pc3N1ZV90bShzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUsIHVpbnQgY2hhbm5lbCwKLQl1aW50IGlkLCB1aW50IGx1biwgdTggdHlwZSwgdTE2IHNtaWRfdGFzaywgdWxvbmcgdGltZW91dCwKLQllbnVtIG11dGV4X3R5cGUgbV90eXBlKQorCXVpbnQgaWQsIHVpbnQgbHVuLCB1OCB0eXBlLCB1MTYgc21pZF90YXNrLCB1bG9uZyB0aW1lb3V0KQogewogCU1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXF1ZXN0X3QgKm1waV9yZXF1ZXN0OwogCU1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXBseV90ICptcGlfcmVwbHk7CiAJdTE2IHNtaWQgPSAwOwogCXUzMiBpb2Nfc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lbGVmdDsKIAlzdHJ1Y3Qgc2NzaWlvX3RyYWNrZXIgKnNjc2lfbG9va3VwID0gTlVMTDsKIAlpbnQgcmM7CiAJdTE2IG1zaXhfdGFzayA9IDA7CiAKLQlpZiAobV90eXBlID09IFRNX01VVEVYX09OKQotCQltdXRleF9sb2NrKCZpb2MtPnRtX2NtZHMubXV0ZXgpOworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlvYy0+dG1fY21kcy5tdXRleCk7CisKIAlpZiAoaW9jLT50bV9jbWRzLnN0YXR1cyAhPSBNUFQzX0NNRF9OT1RfVVNFRCkgewogCQlwcl9pbmZvKE1QVDNTQVNfRk1UICIlczogdG1fY21kIGJ1c3khISFcbiIsCiAJCSAgICBfX2Z1bmNfXywgaW9jLT5uYW1lKTsKLQkJcmMgPSBGQUlMRUQ7Ci0JCWdvdG8gZXJyX291dDsKKwkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKIAlpZiAoaW9jLT5zaG9zdF9yZWNvdmVyeSB8fCBpb2MtPnJlbW92ZV9ob3N0IHx8CiAJICAgIGlvYy0+cGNpX2Vycm9yX3JlY292ZXJ5KSB7CiAJCXByX2luZm8oTVBUM1NBU19GTVQgIiVzOiBob3N0IHJlc2V0IGluIHByb2dyZXNzIVxuIiwKIAkJICAgIF9fZnVuY19fLCBpb2MtPm5hbWUpOwotCQlyYyA9IEZBSUxFRDsKLQkJZ290byBlcnJfb3V0OworCQlyZXR1cm4gRkFJTEVEOwogCX0KIAogCWlvY19zdGF0ZSA9IG1wdDNzYXNfYmFzZV9nZXRfaW9jc3RhdGUoaW9jLCAwKTsKIAlpZiAoaW9jX3N0YXRlICYgTVBJMl9ET09SQkVMTF9VU0VEKSB7CiAJCWRoc3ByaW50ayhpb2MsIHByX2luZm8oTVBUM1NBU19GTVQKIAkJCSJ1bmV4cGVjdGVkIGRvb3JiZWxsIGFjdGl2ZSFcbiIsIGlvYy0+bmFtZSkpOwotCQlyYyA9IG1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBDQU5fU0xFRVAsCi0JCSAgICBGT1JDRV9CSUdfSEFNTUVSKTsKLQkJcmMgPSAoIXJjKSA/IFNVQ0NFU1MgOiBGQUlMRUQ7Ci0JCWdvdG8gZXJyX291dDsKKwkJcmMgPSBtcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgRk9SQ0VfQklHX0hBTU1FUik7CisJCXJldHVybiAoIXJjKSA/IFNVQ0NFU1MgOiBGQUlMRUQ7CiAJfQogCiAJaWYgKChpb2Nfc3RhdGUgJiBNUEkyX0lPQ19TVEFURV9NQVNLKSA9PSBNUEkyX0lPQ19TVEFURV9GQVVMVCkgewogCQltcHQzc2FzX2Jhc2VfZmF1bHRfaW5mbyhpb2MsIGlvY19zdGF0ZSAmCiAJCSAgICBNUEkyX0RPT1JCRUxMX0RBVEFfTUFTSyk7Ci0JCXJjID0gbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwKLQkJICAgIEZPUkNFX0JJR19IQU1NRVIpOwotCQlyYyA9ICghcmMpID8gU1VDQ0VTUyA6IEZBSUxFRDsKLQkJZ290byBlcnJfb3V0OworCQlyYyA9IG1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBGT1JDRV9CSUdfSEFNTUVSKTsKKwkJcmV0dXJuICghcmMpID8gU1VDQ0VTUyA6IEZBSUxFRDsKIAl9CiAKIAlzbWlkID0gbXB0M3Nhc19iYXNlX2dldF9zbWlkX2hwcihpb2MsIGlvYy0+dG1fY2JfaWR4KTsKIAlpZiAoIXNtaWQpIHsKIAkJcHJfZXJyKE1QVDNTQVNfRk1UICIlczogZmFpbGVkIG9idGFpbmluZyBhIHNtaWRcbiIsCiAJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKLQkJcmMgPSBGQUlMRUQ7Ci0JCWdvdG8gZXJyX291dDsKKwkJcmV0dXJuIEZBSUxFRDsKIAl9CiAKIAlpZiAodHlwZSA9PSBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9BQk9SVF9UQVNLKQpAQCAtMjI5MiwxOSArMjI4MCwxNyBAQAogCWVsc2UKIAkJbXNpeF90YXNrID0gMDsKIAltcHQzc2FzX2Jhc2VfcHV0X3NtaWRfaGlfcHJpb3JpdHkoaW9jLCBzbWlkLCBtc2l4X3Rhc2spOwotCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPnRtX2NtZHMuZG9uZSwgdGltZW91dCpIWik7CisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPnRtX2NtZHMuZG9uZSwgdGltZW91dCpIWik7CiAJaWYgKCEoaW9jLT50bV9jbWRzLnN0YXR1cyAmIE1QVDNfQ01EX0NPTVBMRVRFKSkgewogCQlwcl9lcnIoTVBUM1NBU19GTVQgIiVzOiB0aW1lb3V0XG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXyk7CiAJCV9kZWJ1Z19kdW1wX21mKG1waV9yZXF1ZXN0LAogCQkgICAgc2l6ZW9mKE1waTJTQ1NJVGFza01hbmFnZW1lbnRSZXF1ZXN0X3QpLzQpOwogCQlpZiAoIShpb2MtPnRtX2NtZHMuc3RhdHVzICYgTVBUM19DTURfUkVTRVQpKSB7Ci0JCQlyYyA9IG1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBDQU5fU0xFRVAsCi0JCQkgICAgRk9SQ0VfQklHX0hBTU1FUik7CisJCQlyYyA9IG1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLAorCQkJCQlGT1JDRV9CSUdfSEFNTUVSKTsKIAkJCXJjID0gKCFyYykgPyBTVUNDRVNTIDogRkFJTEVEOwotCQkJaW9jLT50bV9jbWRzLnN0YXR1cyA9IE1QVDNfQ01EX05PVF9VU0VEOwotCQkJbXB0M3Nhc19zY3NpaF9jbGVhcl90bV9mbGFnKGlvYywgaGFuZGxlKTsKLQkJCWdvdG8gZXJyX291dDsKKwkJCWdvdG8gb3V0OwogCQl9CiAJfQogCkBAIC0yMzU2LDE3ICsyMzQyLDIzIEBACiAJCWJyZWFrOwogCX0KIAorb3V0OgogCW1wdDNzYXNfc2NzaWhfY2xlYXJfdG1fZmxhZyhpb2MsIGhhbmRsZSk7CiAJaW9jLT50bV9jbWRzLnN0YXR1cyA9IE1QVDNfQ01EX05PVF9VU0VEOwotCWlmIChtX3R5cGUgPT0gVE1fTVVURVhfT04pCi0JCW11dGV4X3VubG9jaygmaW9jLT50bV9jbWRzLm11dGV4KTsKLQogCXJldHVybiByYzsKK30KIAotIGVycl9vdXQ6Ci0JaWYgKG1fdHlwZSA9PSBUTV9NVVRFWF9PTikKLQkJbXV0ZXhfdW5sb2NrKCZpb2MtPnRtX2NtZHMubXV0ZXgpOwotCXJldHVybiByYzsKK2ludCBtcHQzc2FzX3Njc2loX2lzc3VlX2xvY2tlZF90bShzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsIHUxNiBoYW5kbGUsCisJdWludCBjaGFubmVsLCB1aW50IGlkLCB1aW50IGx1biwgdTggdHlwZSwgdTE2IHNtaWRfdGFzaywgdWxvbmcgdGltZW91dCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmaW9jLT50bV9jbWRzLm11dGV4KTsKKwlyZXQgPSBtcHQzc2FzX3Njc2loX2lzc3VlX3RtKGlvYywgaGFuZGxlLCBjaGFubmVsLCBpZCwgbHVuLCB0eXBlLAorCQkJc21pZF90YXNrLCB0aW1lb3V0KTsKKwltdXRleF91bmxvY2soJmlvYy0+dG1fY21kcy5tdXRleCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTI0MzksNyArMjQzMSw3IEBACiAgKgogICogUmV0dXJucyBTVUNDRVNTIGlmIGNvbW1hbmQgYWJvcnRlZCBlbHNlIEZBSUxFRAogICovCi1pbnQKK3N0YXRpYyBpbnQKIHNjc2loX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCiB7CiAJc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jID0gc2hvc3RfcHJpdihzY21kLT5kZXZpY2UtPmhvc3QpOwpAQCAtMjQ4Miw5ICsyNDc0LDkgQEAKIAltcHQzc2FzX2hhbHRfZmlybXdhcmUoaW9jKTsKIAogCWhhbmRsZSA9IHNhc19kZXZpY2VfcHJpdl9kYXRhLT5zYXNfdGFyZ2V0LT5oYW5kbGU7Ci0JciA9IG1wdDNzYXNfc2NzaWhfaXNzdWVfdG0oaW9jLCBoYW5kbGUsIHNjbWQtPmRldmljZS0+Y2hhbm5lbCwKKwlyID0gbXB0M3Nhc19zY3NpaF9pc3N1ZV9sb2NrZWRfdG0oaW9jLCBoYW5kbGUsIHNjbWQtPmRldmljZS0+Y2hhbm5lbCwKIAkgICAgc2NtZC0+ZGV2aWNlLT5pZCwgc2NtZC0+ZGV2aWNlLT5sdW4sCi0JICAgIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0FCT1JUX1RBU0ssIHNtaWQsIDMwLCBUTV9NVVRFWF9PTik7CisJICAgIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0FCT1JUX1RBU0ssIHNtaWQsIDMwKTsKIAogIG91dDoKIAlzZGV2X3ByaW50ayhLRVJOX0lORk8sIHNjbWQtPmRldmljZSwgInRhc2sgYWJvcnQ6ICVzIHNjbWQoJXApXG4iLApAQCAtMjQ5OCw3ICsyNDkwLDcgQEAKICAqCiAgKiBSZXR1cm5zIFNVQ0NFU1MgaWYgY29tbWFuZCBhYm9ydGVkIGVsc2UgRkFJTEVECiAgKi8KLWludAorc3RhdGljIGludAogc2NzaWhfZGV2X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCiB7CiAJc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jID0gc2hvc3RfcHJpdihzY21kLT5kZXZpY2UtPmhvc3QpOwpAQCAtMjU0MSw5ICsyNTMzLDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JciA9IG1wdDNzYXNfc2NzaWhfaXNzdWVfdG0oaW9jLCBoYW5kbGUsIHNjbWQtPmRldmljZS0+Y2hhbm5lbCwKKwlyID0gbXB0M3Nhc19zY3NpaF9pc3N1ZV9sb2NrZWRfdG0oaW9jLCBoYW5kbGUsIHNjbWQtPmRldmljZS0+Y2hhbm5lbCwKIAkgICAgc2NtZC0+ZGV2aWNlLT5pZCwgc2NtZC0+ZGV2aWNlLT5sdW4sCi0JICAgIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0xPR0lDQUxfVU5JVF9SRVNFVCwgMCwgMzAsIFRNX01VVEVYX09OKTsKKwkgICAgTVBJMl9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfTE9HSUNBTF9VTklUX1JFU0VULCAwLCAzMCk7CiAKICBvdXQ6CiAJc2Rldl9wcmludGsoS0VSTl9JTkZPLCBzY21kLT5kZXZpY2UsICJkZXZpY2UgcmVzZXQ6ICVzIHNjbWQoJXApXG4iLApAQCAtMjU2MSw3ICsyNTUzLDcgQEAKICAqCiAgKiBSZXR1cm5zIFNVQ0NFU1MgaWYgY29tbWFuZCBhYm9ydGVkIGVsc2UgRkFJTEVECiAgKi8KLWludAorc3RhdGljIGludAogc2NzaWhfdGFyZ2V0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCiB7CiAJc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jID0gc2hvc3RfcHJpdihzY21kLT5kZXZpY2UtPmhvc3QpOwpAQCAtMjYwMyw5ICsyNTk1LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JciA9IG1wdDNzYXNfc2NzaWhfaXNzdWVfdG0oaW9jLCBoYW5kbGUsIHNjbWQtPmRldmljZS0+Y2hhbm5lbCwKKwlyID0gbXB0M3Nhc19zY3NpaF9pc3N1ZV9sb2NrZWRfdG0oaW9jLCBoYW5kbGUsIHNjbWQtPmRldmljZS0+Y2hhbm5lbCwKIAkgICAgc2NtZC0+ZGV2aWNlLT5pZCwgMCwgTVBJMl9TQ1NJVEFTS01HTVRfVEFTS1RZUEVfVEFSR0VUX1JFU0VULCAwLAotCSAgICAzMCwgVE1fTVVURVhfT04pOworCSAgICAzMCk7CiAKICBvdXQ6CiAJc3RhcmdldF9wcmludGsoS0VSTl9JTkZPLCBzdGFyZ2V0LCAidGFyZ2V0IHJlc2V0OiAlcyBzY21kKCVwKVxuIiwKQEAgLTI2MjQsNyArMjYxNiw3IEBACiAgKgogICogUmV0dXJucyBTVUNDRVNTIGlmIGNvbW1hbmQgYWJvcnRlZCBlbHNlIEZBSUxFRAogICovCi1pbnQKK3N0YXRpYyBpbnQKIHNjc2loX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKIHsKIAlzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MgPSBzaG9zdF9wcml2KHNjbWQtPmRldmljZS0+aG9zdCk7CkBAIC0yNjQxLDggKzI2MzMsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXR2YWwgPSBtcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgQ0FOX1NMRUVQLAotCSAgICBGT1JDRV9CSUdfSEFNTUVSKTsKKwlyZXR2YWwgPSBtcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgRk9SQ0VfQklHX0hBTU1FUik7CiAJciA9IChyZXR2YWwgPCAwKSA/IEZBSUxFRCA6IFNVQ0NFU1M7CiBvdXQ6CiAJcHJfaW5mbyhNUFQzU0FTX0ZNVCAiaG9zdCByZXNldDogJXMgc2NtZCglcClcbiIsCkBAIC0zNDU1LDcgKzM0NDYsNyBAQAogICoKICAqIENvbnRleHQgLSBwcm9jZXNzZWQgaW4gaW50ZXJydXB0IGNvbnRleHQuCiAgKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBfc2NzaWhfaXNzdWVfZGVsYXllZF9ldmVudF9hY2soc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jLCB1MTYgc21pZCwgdTE2IGV2ZW50LAogCQkJCXUzMiBldmVudF9jb250ZXh0KQogewpAQCAtMzQ5NCw3ICszNDg1LDcgQEAKICAqCiAgKiBDb250ZXh0IC0gcHJvY2Vzc2VkIGluIGludGVycnVwdCBjb250ZXh0LgogICovCi12b2lkCitzdGF0aWMgdm9pZAogX3Njc2loX2lzc3VlX2RlbGF5ZWRfc2FzX2lvX3VuaXRfY3RybChzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MsCiAJCQkJCXUxNiBzbWlkLCB1MTYgaGFuZGxlKQogCXsKQEAgLTQwMzIsNyArNDAyMyw3IEBACiAgKiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kgaWYgdGhlIGRldmljZSBxdWV1ZSBpcyBmdWxsLCBvcgogICogU0NTSV9NTFFVRVVFX0hPU1RfQlVTWSBpZiB0aGUgZW50aXJlIGhvc3QgcXVldWUgaXMgZnVsbAogICovCi1pbnQKK3N0YXRpYyBpbnQKIHNjc2loX3FjbWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCiB7CiAJc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jID0gc2hvc3RfcHJpdihzaG9zdCk7CkBAIC00NzAxLDcgKzQ2OTIsNyBAQAogCQkJICAgIGxlMTZfdG9fY3B1KG1waV9yZXBseS0+RGV2SGFuZGxlKSk7CiAJCW1wdDNzYXNfdHJpZ2dlcl9zY3NpKGlvYywgZGF0YS5za2V5LCBkYXRhLmFzYywgZGF0YS5hc2NxKTsKIAotCQlpZiAoIShpb2MtPmxvZ2dpbmdfbGV2ZWwgJiBNUFRfREVCVUdfUkVQTFkpICYmCisJCWlmICgoaW9jLT5sb2dnaW5nX2xldmVsICYgTVBUX0RFQlVHX1JFUExZKSAmJgogCQkgICAgICgoc2NtZC0+c2Vuc2VfYnVmZmVyWzJdID09IFVOSVRfQVRURU5USU9OKSB8fAogCQkgICAgIChzY21kLT5zZW5zZV9idWZmZXJbMl0gPT0gTUVESVVNX0VSUk9SKSB8fAogCQkgICAgIChzY21kLT5zZW5zZV9idWZmZXJbMl0gPT0gSEFSRFdBUkVfRVJST1IpKSkKQEAgLTUzODAsOCArNTM3MSw5IEBACiAJCSAgICAgTVBJMl9TQVNfREVWSUNFMF9GTEFHU19FTkNMX0xFVkVMX1ZBTElEKSB7CiAJCQlzYXNfZGV2aWNlLT5lbmNsb3N1cmVfbGV2ZWwgPQogCQkJCWxlMTZfdG9fY3B1KHNhc19kZXZpY2VfcGcwLkVuY2xvc3VyZUxldmVsKTsKLQkJCW1lbWNweSgmc2FzX2RldmljZS0+Y29ubmVjdG9yX25hbWVbMF0sCi0JCQkJJnNhc19kZXZpY2VfcGcwLkNvbm5lY3Rvck5hbWVbMF0sIDQpOworCQkJbWVtY3B5KHNhc19kZXZpY2UtPmNvbm5lY3Rvcl9uYW1lLAorCQkJCXNhc19kZXZpY2VfcGcwLkNvbm5lY3Rvck5hbWUsIDQpOworCQkJc2FzX2RldmljZS0+Y29ubmVjdG9yX25hbWVbNF0gPSAnXDAnOwogCQl9IGVsc2UgewogCQkJc2FzX2RldmljZS0+ZW5jbG9zdXJlX2xldmVsID0gMDsKIAkJCXNhc19kZXZpY2UtPmNvbm5lY3Rvcl9uYW1lWzBdID0gJ1wwJzsKQEAgLTU1MDgsOCArNTUwMCw5IEBACiAJaWYgKHNhc19kZXZpY2VfcGcwLkZsYWdzICYgTVBJMl9TQVNfREVWSUNFMF9GTEFHU19FTkNMX0xFVkVMX1ZBTElEKSB7CiAJCXNhc19kZXZpY2UtPmVuY2xvc3VyZV9sZXZlbCA9CiAJCQlsZTE2X3RvX2NwdShzYXNfZGV2aWNlX3BnMC5FbmNsb3N1cmVMZXZlbCk7Ci0JCW1lbWNweSgmc2FzX2RldmljZS0+Y29ubmVjdG9yX25hbWVbMF0sCi0JCQkmc2FzX2RldmljZV9wZzAuQ29ubmVjdG9yTmFtZVswXSwgNCk7CisJCW1lbWNweShzYXNfZGV2aWNlLT5jb25uZWN0b3JfbmFtZSwKKwkJCXNhc19kZXZpY2VfcGcwLkNvbm5lY3Rvck5hbWUsIDQpOworCQlzYXNfZGV2aWNlLT5jb25uZWN0b3JfbmFtZVs0XSA9ICdcMCc7CiAJfSBlbHNlIHsKIAkJc2FzX2RldmljZS0+ZW5jbG9zdXJlX2xldmVsID0gMDsKIAkJc2FzX2RldmljZS0+Y29ubmVjdG9yX25hbWVbMF0gPSAnXDAnOwpAQCAtNjA4Nyw4ICs2MDgwLDcgQEAKIAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKIAkJciA9IG1wdDNzYXNfc2NzaWhfaXNzdWVfdG0oaW9jLCBoYW5kbGUsIDAsIDAsIGx1biwKLQkJICAgIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1FVRVJZX1RBU0ssIHNtaWQsIDMwLAotCQkgICAgVE1fTVVURVhfT0ZGKTsKKwkJICAgIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX1FVRVJZX1RBU0ssIHNtaWQsIDMwKTsKIAkJaWYgKHIgPT0gRkFJTEVEKSB7CiAJCQlzZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsIHNkZXYsCiAJCQkgICAgIm1wdDNzYXNfc2NzaWhfaXNzdWVfdG06IEZBSUxFRCB3aGVuIHNlbmRpbmcgIgpAQCAtNjEyOCw4ICs2MTIwLDggQEAKIAkJCWdvdG8gb3V0X25vX2xvY2s7CiAKIAkJciA9IG1wdDNzYXNfc2NzaWhfaXNzdWVfdG0oaW9jLCBoYW5kbGUsIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLAotCQkgICAgc2Rldi0+bHVuLCBNUEkyX1NDU0lUQVNLTUdNVF9UQVNLVFlQRV9BQk9SVF9UQVNLLCBzbWlkLCAzMCwKLQkJICAgIFRNX01VVEVYX09GRik7CisJCSAgICBzZGV2LT5sdW4sIE1QSTJfU0NTSVRBU0tNR01UX1RBU0tUWVBFX0FCT1JUX1RBU0ssIHNtaWQsCisJCSAgICAzMCk7CiAJCWlmIChyID09IEZBSUxFRCkgewogCQkJc2Rldl9wcmludGsoS0VSTl9XQVJOSU5HLCBzZGV2LAogCQkJICAgICJtcHQzc2FzX3Njc2loX2lzc3VlX3RtOiBBQk9SVF9UQVNLOiBGQUlMRUQgOiAiCkBAIC02Mjk3LDggKzYyODksNyBAQAogCW11dGV4X3VubG9jaygmaW9jLT5zY3NpaF9jbWRzLm11dGV4KTsKIAogCWlmIChpc3N1ZV9yZXNldCkKLQkJbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwKLQkJICAgIEZPUkNFX0JJR19IQU1NRVIpOworCQltcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgRk9SQ0VfQklHX0hBTU1FUik7CiAJcmV0dXJuIHJjOwogfQogCkBAIC02MzExLDExICs2MzAyLDEwIEBACiBzdGF0aWMgdm9pZAogX3Njc2loX3JlcHJvYmVfbHVuKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgdm9pZCAqbm9fdWxkX2F0dGFjaCkKIHsKLQlpbnQgcmM7CiAJc2Rldi0+bm9fdWxkX2F0dGFjaCA9IG5vX3VsZF9hdHRhY2ggPyAxIDogMDsKIAlzZGV2X3ByaW50ayhLRVJOX0lORk8sIHNkZXYsICIlcyByYWlkIGNvbXBvbmVudFxuIiwKIAkgICAgc2Rldi0+bm9fdWxkX2F0dGFjaCA/ICJoaWRkaW5nIiA6ICJleHBvc2luZyIpOwotCXJjID0gc2NzaV9kZXZpY2VfcmVwcm9iZShzZGV2KTsKKwlXQVJOX09OKHNjc2lfZGV2aWNlX3JlcHJvYmUoc2RldikpOwogfQogCiAvKioKQEAgLTgxMzcsNyArODEyNyw3IEBACiAgKiBSb3V0aW5lIGNhbGxlZCB3aGVuIHVubG9hZGluZyB0aGUgZHJpdmVyLgogICogUmV0dXJuIG5vdGhpbmcuCiAgKi8KLXZvaWQgc2NzaWhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIHZvaWQgc2NzaWhfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBNUFQzU0FTX0FEQVBURVIgKmlvYyA9IHNob3N0X3ByaXYoc2hvc3QpOwpAQCAtODIxMCw3ICs4MjAwLDcgQEAKICAqCiAgKiBSZXR1cm4gbm90aGluZy4KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIHNjc2loX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtODQ1MSw3ICs4NDQxLDcgQEAKICAqIG9mIHNjYW5uaW5nIHRoZSBlbnRpcmUgYnVzLiAgSW4gb3VyIGltcGxlbWVudGlvbiwgd2Ugd2lsbCBraWNrIG9mZgogICogZmlybXdhcmUgZGlzY292ZXJ5LgogICovCi12b2lkCitzdGF0aWMgdm9pZAogc2NzaWhfc2Nhbl9zdGFydChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKIHsKIAlzdHJ1Y3QgTVBUM1NBU19BREFQVEVSICppb2MgPSBzaG9zdF9wcml2KHNob3N0KTsKQEAgLTg0NzgsNyArODQ2OCw3IEBACiAgKiBzY3NpX2hvc3QgYW5kIHRoZSBlbGFwc2VkIHRpbWUgb2YgdGhlIHNjYW4gaW4gamlmZmllcy4gSW4gb3VyIGltcGxlbWVudGlvbiwKICAqIHdlIHdhaXQgZm9yIGZpcm13YXJlIGRpc2NvdmVyeSB0byBjb21wbGV0ZSwgdGhlbiByZXR1cm4gMS4KICAqLwotaW50CitzdGF0aWMgaW50CiBzY3NpaF9zY2FuX2ZpbmlzaGVkKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1bnNpZ25lZCBsb25nIHRpbWUpCiB7CiAJc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jID0gc2hvc3RfcHJpdihzaG9zdCk7CkBAIC04NjA4LDcgKzg1OTgsNyBAQAogICoJTVBJMjVfVkVSU0lPTiBmb3IgU0FTIDMuMCBIQkEgZGV2aWNlcywgYW5kCiAgKglNUEkyNiBWRVJTSU9OIGZvciBDdXRsYXNzICYgSW52YWRlciBTQVMgMy4wIEhCQSBkZXZpY2VzCiAgKi8KLXUxNgorc3RhdGljIHUxNgogX3Njc2loX2RldGVybWluZV9oYmFfbXBpX3ZlcnNpb24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAKQEAgLTg2NjAsNyArODY1MCw3IEBACiAgKgogICogUmV0dXJucyAwIHN1Y2Nlc3MsIGFueXRoaW5nIGVsc2UgZXJyb3IuCiAgKi8KLWludAorc3RhdGljIGludAogX3Njc2loX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IE1QVDNTQVNfQURBUFRFUiAqaW9jOwpAQCAtODg2OSw3ICs4ODU5LDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgc3VjY2VzcywgYW55dGhpbmcgZWxzZSBlcnJvci4KICAqLwotaW50CitzdGF0aWMgaW50CiBzY3NpaF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CkBAIC04ODk2LDcgKzg4ODYsNyBAQAogICoKICAqIFJldHVybnMgMCBzdWNjZXNzLCBhbnl0aGluZyBlbHNlIGVycm9yLgogICovCi1pbnQKK3N0YXRpYyBpbnQKIHNjc2loX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTg5MTYsNyArODkwNiw3IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCi0JbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwgU09GVF9SRVNFVCk7CisJbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIFNPRlRfUkVTRVQpOwogCXNjc2lfdW5ibG9ja19yZXF1ZXN0cyhzaG9zdCk7CiAJbXB0M3Nhc19iYXNlX3N0YXJ0X3dhdGNoZG9nKGlvYyk7CiAJcmV0dXJuIDA7CkBAIC04OTMzLDcgKzg5MjMsNyBAQAogICogUmV0dXJuIHZhbHVlOgogICogICAgICBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUIG9yIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1QKICAqLwotcGNpX2Vyc19yZXN1bHRfdAorc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QKIHNjc2loX3BjaV9lcnJvcl9kZXRlY3RlZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcGNpX2NoYW5uZWxfc3RhdGVfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTg5NzAsNyArODk2MCw3IEBACiAgKiBjb2RlIGFmdGVyIHRoZSBQQ0kgc2xvdCBoYXMgYmVlbiByZXNldCwganVzdCBiZWZvcmUgd2UKICAqIHNob3VsZCByZXN1bWUgbm9ybWFsIG9wZXJhdGlvbnMuCiAgKi8KLXBjaV9lcnNfcmVzdWx0X3QKK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90CiBzY3NpaF9wY2lfc2xvdF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTg5ODcsOCArODk3Nyw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKIAotCXJjID0gbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwKLQkgICAgRk9SQ0VfQklHX0hBTU1FUik7CisJcmMgPSBtcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgRk9SQ0VfQklHX0hBTU1FUik7CiAKIAlwcl93YXJuKE1QVDNTQVNfRk1UICJoYXJkIHJlc2V0OiAlc1xuIiwgaW9jLT5uYW1lLAogCSAgICAocmMgPT0gMCkgPyAic3VjY2VzcyIgOiAiZmFpbGVkIik7CkBAIC05MDA3LDcgKzg5OTYsNyBAQAogICogT0sgdG8gcmVzdW1lIG5vcm1hbCBvcGVyYXRpb24uIFVzZSBjb21wbGV0aW9uIHRvIGFsbG93CiAgKiBoYWx0ZWQgc2NzaSBvcHMgdG8gcmVzdW1lLgogICovCi12b2lkCitzdGF0aWMgdm9pZAogc2NzaWhfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTkwMjQsNyArOTAxMyw3IEBACiAgKiBzY3NpaF9wY2lfbW1pb19lbmFibGVkIC0gRW5hYmxlIE1NSU8gYW5kIGR1bXAgZGVidWcgcmVnaXN0ZXJzCiAgKiBAcGRldjogcG9pbnRlciB0byBQQ0kgZGV2aWNlCiAgKi8KLXBjaV9lcnNfcmVzdWx0X3QKK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90CiBzY3NpaF9wY2lfbW1pb19lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtOTE1Miw3ICs5MTQxLDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgc3VjY2VzcywgYW55dGhpbmcgZWxzZSBlcnJvci4KICAqLwotaW50CitzdGF0aWMgaW50CiBzY3NpaF9pbml0KHZvaWQpCiB7CiAJbXB0Ml9pZHMgPSAwOwpAQCAtOTIwMiw3ICs5MTkxLDcgQEAKICAqCiAgKiBSZXR1cm5zIDAgc3VjY2VzcywgYW55dGhpbmcgZWxzZSBlcnJvci4KICAqLwotdm9pZAorc3RhdGljIHZvaWQKIHNjc2loX2V4aXQodm9pZCkKIHsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21wdDNzYXMvbXB0M3Nhc190cmFuc3BvcnQuYyBiL2RyaXZlcnMvc2NzaS9tcHQzc2FzL21wdDNzYXNfdHJhbnNwb3J0LmMKaW5kZXggZmY5MzI4Ni4uYjc0ZmFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDNzYXMvbXB0M3Nhc190cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvbXB0M3Nhcy9tcHQzc2FzX3RyYW5zcG9ydC5jCkBAIC0zMDAsNyArMzAwLDYgQEAKIAlpbnQgcmM7CiAJdTE2IHNtaWQ7CiAJdTMyIGlvY19zdGF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVsZWZ0OwogCXZvaWQgKnBzZ2U7CiAJdTggaXNzdWVfcmVzZXQgPSAwOwogCXZvaWQgKmRhdGFfb3V0ID0gTlVMTDsKQEAgLTM5NCw4ICszOTMsNyBAQAogCQlpb2MtPm5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpc2FzX2FkZHJlc3MpKTsKIAlpbml0X2NvbXBsZXRpb24oJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSk7CiAJbXB0M3Nhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKLQl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT50cmFuc3BvcnRfY21kcy5kb25lLAotCSAgICAxMCpIWik7CisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPnRyYW5zcG9ydF9jbWRzLmRvbmUsIDEwKkhaKTsKIAogCWlmICghKGlvYy0+dHJhbnNwb3J0X2NtZHMuc3RhdHVzICYgTVBUM19DTURfQ09NUExFVEUpKSB7CiAJCXByX2VycihNUFQzU0FTX0ZNVCAiJXM6IHRpbWVvdXRcbiIsCkBAIC00NDYsOCArNDQ0LDcgQEAKIAogIGlzc3VlX2hvc3RfcmVzZXQ6CiAJaWYgKGlzc3VlX3Jlc2V0KQotCQltcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgQ0FOX1NMRUVQLAotCQkgICAgRk9SQ0VfQklHX0hBTU1FUik7CisJCW1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBGT1JDRV9CSUdfSEFNTUVSKTsKICBvdXQ6CiAJaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgPSBNUFQzX0NNRF9OT1RfVVNFRDsKIAlpZiAoZGF0YV9vdXQpCkBAIC0xMTA3LDcgKzExMDQsNiBAQAogCWludCByYzsKIAl1MTYgc21pZDsKIAl1MzIgaW9jX3N0YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZWxlZnQ7CiAJdm9pZCAqcHNnZTsKIAl1OCBpc3N1ZV9yZXNldCA9IDA7CiAJdm9pZCAqZGF0YV9vdXQgPSBOVUxMOwpAQCAtMTIwMyw4ICsxMTk5LDcgQEAKIAkJcGh5LT5udW1iZXIpKTsKIAlpbml0X2NvbXBsZXRpb24oJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSk7CiAJbXB0M3Nhc19iYXNlX3B1dF9zbWlkX2RlZmF1bHQoaW9jLCBzbWlkKTsKLQl0aW1lbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaW9jLT50cmFuc3BvcnRfY21kcy5kb25lLAotCSAgICAxMCpIWik7CisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPnRyYW5zcG9ydF9jbWRzLmRvbmUsIDEwKkhaKTsKIAogCWlmICghKGlvYy0+dHJhbnNwb3J0X2NtZHMuc3RhdHVzICYgTVBUM19DTURfQ09NUExFVEUpKSB7CiAJCXByX2VycihNUFQzU0FTX0ZNVCAiJXM6IHRpbWVvdXRcbiIsCkBAIC0xMjUzLDggKzEyNDgsNyBAQAogCiAgaXNzdWVfaG9zdF9yZXNldDoKIAlpZiAoaXNzdWVfcmVzZXQpCi0JCW1wdDNzYXNfYmFzZV9oYXJkX3Jlc2V0X2hhbmRsZXIoaW9jLCBDQU5fU0xFRVAsCi0JCSAgICBGT1JDRV9CSUdfSEFNTUVSKTsKKwkJbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIEZPUkNFX0JJR19IQU1NRVIpOwogIG91dDoKIAlpb2MtPnRyYW5zcG9ydF9jbWRzLnN0YXR1cyA9IE1QVDNfQ01EX05PVF9VU0VEOwogCWlmIChkYXRhX291dCkKQEAgLTE0MjEsNyArMTQxNSw2IEBACiAJaW50IHJjOwogCXUxNiBzbWlkOwogCXUzMiBpb2Nfc3RhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lbGVmdDsKIAl2b2lkICpwc2dlOwogCXU4IGlzc3VlX3Jlc2V0ID0gMDsKIAl2b2lkICpkYXRhX291dCA9IE5VTEw7CkBAIC0xNTIyLDggKzE1MTUsNyBAQAogCQlwaHktPm51bWJlciwgcGh5X29wZXJhdGlvbikpOwogCWluaXRfY29tcGxldGlvbigmaW9jLT50cmFuc3BvcnRfY21kcy5kb25lKTsKIAltcHQzc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQpOwotCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPnRyYW5zcG9ydF9jbWRzLmRvbmUsCi0JICAgIDEwKkhaKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSwgMTAqSFopOwogCiAJaWYgKCEoaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgJiBNUFQzX0NNRF9DT01QTEVURSkpIHsKIAkJcHJfZXJyKE1QVDNTQVNfRk1UICIlczogdGltZW91dFxuIiwKQEAgLTE1NjQsOCArMTU1Niw3IEBACiAKICBpc3N1ZV9ob3N0X3Jlc2V0OgogCWlmIChpc3N1ZV9yZXNldCkKLQkJbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwKLQkJICAgIEZPUkNFX0JJR19IQU1NRVIpOworCQltcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgRk9SQ0VfQklHX0hBTU1FUik7CiAgb3V0OgogCWlvYy0+dHJhbnNwb3J0X2NtZHMuc3RhdHVzID0gTVBUM19DTURfTk9UX1VTRUQ7CiAJaWYgKGRhdGFfb3V0KQpAQCAtMTg5OSw3ICsxODkwLDYgQEAKIAlpbnQgcmM7CiAJdTE2IHNtaWQ7CiAJdTMyIGlvY19zdGF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVsZWZ0OwogCXZvaWQgKnBzZ2U7CiAJdTggaXNzdWVfcmVzZXQgPSAwOwogCWRtYV9hZGRyX3QgZG1hX2FkZHJfaW4gPSAwOwpAQCAtMjA0Myw4ICsyMDMzLDcgQEAKIAogCWluaXRfY29tcGxldGlvbigmaW9jLT50cmFuc3BvcnRfY21kcy5kb25lKTsKIAltcHQzc2FzX2Jhc2VfcHV0X3NtaWRfZGVmYXVsdChpb2MsIHNtaWQpOwotCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpb2MtPnRyYW5zcG9ydF9jbWRzLmRvbmUsCi0JICAgIDEwKkhaKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlvYy0+dHJhbnNwb3J0X2NtZHMuZG9uZSwgMTAqSFopOwogCiAJaWYgKCEoaW9jLT50cmFuc3BvcnRfY21kcy5zdGF0dXMgJiBNUFQzX0NNRF9DT01QTEVURSkpIHsKIAkJcHJfZXJyKE1QVDNTQVNfRk1UICIlcyA6IHRpbWVvdXRcbiIsCkBAIC0yMTAzLDggKzIwOTIsNyBAQAogCiAgaXNzdWVfaG9zdF9yZXNldDoKIAlpZiAoaXNzdWVfcmVzZXQpIHsKLQkJbXB0M3Nhc19iYXNlX2hhcmRfcmVzZXRfaGFuZGxlcihpb2MsIENBTl9TTEVFUCwKLQkJICAgIEZPUkNFX0JJR19IQU1NRVIpOworCQltcHQzc2FzX2Jhc2VfaGFyZF9yZXNldF9oYW5kbGVyKGlvYywgRk9SQ0VfQklHX0hBTU1FUik7CiAJCXJjID0gLUVUSU1FRE9VVDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl82NHh4LmMgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfNjR4eC5jCmluZGV4IDhiYjA2OTkuLmI3NTdkMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl82NHh4LmMKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212XzY0eHguYwpAQCAtMTM2LDcgKzEzNiw4IEBACiAJfQogfQogCi12b2lkIG12c182NHh4X2NsZWFyX3Nyc19pcnEoc3RydWN0IG12c19pbmZvICptdmksIHU4IHJlZ19zZXQsIHU4IGNsZWFyX2FsbCkKK3N0YXRpYyB2b2lkCittdnNfNjR4eF9jbGVhcl9zcnNfaXJxKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1OCByZWdfc2V0LCB1OCBjbGVhcl9hbGwpCiB7CiAJdm9pZCBfX2lvbWVtICpyZWdzID0gbXZpLT5yZWdzOwogCXUzMiB0bXA7CkBAIC01NjMsNyArNTY0LDcgQEAKIAlyZXR1cm4gTVZTX0lEX05PVF9NQVBQRUQ7CiB9CiAKLXZvaWQgbXZzXzY0eHhfbWFrZV9wcmQoc3RydWN0IHNjYXR0ZXJsaXN0ICpzY2F0dGVyLCBpbnQgbnIsIHZvaWQgKnByZCkKK3N0YXRpYyB2b2lkIG12c182NHh4X21ha2VfcHJkKHN0cnVjdCBzY2F0dGVybGlzdCAqc2NhdHRlciwgaW50IG5yLCB2b2lkICpwcmQpCiB7CiAJaW50IGk7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKQEAgLTYzMyw3ICs2MzQsNyBAQAogCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgaSwgdG1wKTsKIH0KIAotdm9pZCBtdnNfNjR4eF9waHlfc2V0X2xpbmtfcmF0ZShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHBoeV9pZCwKK3N0YXRpYyB2b2lkIG12c182NHh4X3BoeV9zZXRfbGlua19yYXRlKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgcGh5X2lkLAogCQkJc3RydWN0IHNhc19waHlfbGlua3JhdGVzICpyYXRlcykKIHsKIAl1MzIgbHJtaW4gPSAwLCBscm1heCA9IDA7CkBAIC02NjgsMjAgKzY2OSwyMCBAQAogfQogCiAKLXUzMiBtdnNfNjR4eF9zcGlfcmVhZF9kYXRhKHN0cnVjdCBtdnNfaW5mbyAqbXZpKQorc3RhdGljIHUzMiBtdnNfNjR4eF9zcGlfcmVhZF9kYXRhKHN0cnVjdCBtdnNfaW5mbyAqbXZpKQogewogCXZvaWQgX19pb21lbSAqcmVncyA9IG12aS0+cmVnc19leDsKIAlyZXR1cm4gaW9yMzIoU1BJX0RBVEFfUkVHXzY0WFgpOwogfQogCi12b2lkIG12c182NHh4X3NwaV93cml0ZV9kYXRhKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgZGF0YSkKK3N0YXRpYyB2b2lkIG12c182NHh4X3NwaV93cml0ZV9kYXRhKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgZGF0YSkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3NfZXg7CiAJIGlvdzMyKFNQSV9EQVRBX1JFR182NFhYLCBkYXRhKTsKIH0KIAogCi1pbnQgbXZzXzY0eHhfc3BpX2J1aWxkY21kKHN0cnVjdCBtdnNfaW5mbyAqbXZpLAorc3RhdGljIGludCBtdnNfNjR4eF9zcGlfYnVpbGRjbWQoc3RydWN0IG12c19pbmZvICptdmksCiAJCQl1MzIgICAgICAqZHdDbWQsCiAJCQl1OCAgICAgICBjbWQsCiAJCQl1OCAgICAgICByZWFkLApAQCAtNzA1LDcgKzcwNiw3IEBACiB9CiAKIAotaW50IG12c182NHh4X3NwaV9pc3N1ZWNtZChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIGNtZCkKK3N0YXRpYyBpbnQgbXZzXzY0eHhfc3BpX2lzc3VlY21kKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgY21kKQogewogCXZvaWQgX19pb21lbSAqcmVncyA9IG12aS0+cmVnc19leDsKIAlpbnQgICAgIHJldHJ5OwpAQCAtNzIwLDcgKzcyMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBtdnNfNjR4eF9zcGlfd2FpdGRhdGFyZWFkeShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHRpbWVvdXQpCitzdGF0aWMgaW50IG12c182NHh4X3NwaV93YWl0ZGF0YXJlYWR5KHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgdGltZW91dCkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3NfZXg7CiAJdTMyIGksIGR3VG1wOwpAQCAtNzM1LDcgKzczNiw3IEBACiAJcmV0dXJuIC0xOwogfQogCi12b2lkIG12c182NHh4X2ZpeF9kbWEoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwaHlfbWFzaywKK3N0YXRpYyB2b2lkIG12c182NHh4X2ZpeF9kbWEoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwaHlfbWFzaywKIAkJCQlpbnQgYnVmX2xlbiwgaW50IGZyb20sIHZvaWQgKnByZCkKIHsKIAlpbnQgaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl85NHh4LmMgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfOTR4eC5jCmluZGV4IGY2ZmM0YTcuLjRjNTdkOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl85NHh4LmMKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212Xzk0eHguYwpAQCAtNDgsOCArNDgsOCBAQAogCX0KIH0KIAotdm9pZCBzZXRfcGh5X3R1bmluZyhzdHJ1Y3QgbXZzX2luZm8gKm12aSwgaW50IHBoeV9pZCwKLQkJCXN0cnVjdCBwaHlfdHVuaW5nIHBoeV90dW5pbmcpCitzdGF0aWMgdm9pZCBzZXRfcGh5X3R1bmluZyhzdHJ1Y3QgbXZzX2luZm8gKm12aSwgaW50IHBoeV9pZCwKKwkJCSAgIHN0cnVjdCBwaHlfdHVuaW5nIHBoeV90dW5pbmcpCiB7CiAJdTMyIHRtcCwgc2V0dGluZ18wID0gMCwgc2V0dGluZ18xID0gMDsKIAl1OCBpOwpAQCAtMTEwLDggKzExMCw4IEBACiAJfQogfQogCi12b2lkIHNldF9waHlfZmZlX3R1bmluZyhzdHJ1Y3QgbXZzX2luZm8gKm12aSwgaW50IHBoeV9pZCwKLQkJCQlzdHJ1Y3QgZmZlX2NvbnRyb2wgZmZlKQorc3RhdGljIHZvaWQgc2V0X3BoeV9mZmVfdHVuaW5nKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBpbnQgcGh5X2lkLAorCQkJICAgICAgIHN0cnVjdCBmZmVfY29udHJvbCBmZmUpCiB7CiAJdTMyIHRtcDsKIApAQCAtMTc3LDcgKzE3Nyw3IEBACiB9CiAKIC8qTm90aWNlOiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdoZW4gcGh5IGlzIGRpc2FibGVkKi8KLXZvaWQgc2V0X3BoeV9yYXRlKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBpbnQgcGh5X2lkLCB1OCByYXRlKQorc3RhdGljIHZvaWQgc2V0X3BoeV9yYXRlKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBpbnQgcGh5X2lkLCB1OCByYXRlKQogewogCXVuaW9uIHJlZ19waHlfY2ZnIHBoeV9jZmcsIHBoeV9jZmdfdG1wOwogCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBWU1JfUEhZX01PREUyKTsKQEAgLTY3OSw3ICs2NzksOCBAQAogCX0KIH0KIAotdm9pZCBtdnNfOTR4eF9jbGVhcl9zcnNfaXJxKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1OCByZWdfc2V0LCB1OCBjbGVhcl9hbGwpCitzdGF0aWMgdm9pZAorbXZzXzk0eHhfY2xlYXJfc3JzX2lycShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTggcmVnX3NldCwgdTggY2xlYXJfYWxsKQogewogCXZvaWQgX19pb21lbSAqcmVncyA9IG12aS0+cmVnczsKIAl1MzIgdG1wOwpAQCAtOTA2LDggKzkwNyw4IEBACiAKIH0KIAotdm9pZCBtdnNfOTR4eF9waHlfc2V0X2xpbmtfcmF0ZShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHBoeV9pZCwKLQkJCXN0cnVjdCBzYXNfcGh5X2xpbmtyYXRlcyAqcmF0ZXMpCitzdGF0aWMgdm9pZCBtdnNfOTR4eF9waHlfc2V0X2xpbmtfcmF0ZShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHBoeV9pZCwKKwkJCQkgICAgICAgc3RydWN0IHNhc19waHlfbGlua3JhdGVzICpyYXRlcykKIHsKIAl1MzIgbHJtYXggPSAwOwogCXUzMiB0bXA7CkBAIC05MzYsMjUgKzkzNywyNSBAQAogfQogCiAKLXUzMiBtdnNfOTR4eF9zcGlfcmVhZF9kYXRhKHN0cnVjdCBtdnNfaW5mbyAqbXZpKQorc3RhdGljIHUzMiBtdnNfOTR4eF9zcGlfcmVhZF9kYXRhKHN0cnVjdCBtdnNfaW5mbyAqbXZpKQogewogCXZvaWQgX19pb21lbSAqcmVncyA9IG12aS0+cmVnc19leCAtIDB4MTAyMDA7CiAJcmV0dXJuIG1yMzIoU1BJX1JEX0RBVEFfUkVHXzk0WFgpOwogfQogCi12b2lkIG12c185NHh4X3NwaV93cml0ZV9kYXRhKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgZGF0YSkKK3N0YXRpYyB2b2lkIG12c185NHh4X3NwaV93cml0ZV9kYXRhKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgZGF0YSkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3NfZXggLSAweDEwMjAwOwogCSBtdzMyKFNQSV9SRF9EQVRBX1JFR185NFhYLCBkYXRhKTsKIH0KIAogCi1pbnQgbXZzXzk0eHhfc3BpX2J1aWxkY21kKHN0cnVjdCBtdnNfaW5mbyAqbXZpLAotCQkJCXUzMiAgICAgICpkd0NtZCwKLQkJCQl1OCAgICAgICBjbWQsCi0JCQkJdTggICAgICAgcmVhZCwKLQkJCQl1OCAgICAgICBsZW5ndGgsCi0JCQkJdTMyICAgICAgYWRkcgorc3RhdGljIGludCBtdnNfOTR4eF9zcGlfYnVpbGRjbWQoc3RydWN0IG12c19pbmZvICptdmksCisJCQkJIHUzMiAgICAgICpkd0NtZCwKKwkJCQkgdTggICAgICAgY21kLAorCQkJCSB1OCAgICAgICByZWFkLAorCQkJCSB1OCAgICAgICBsZW5ndGgsCisJCQkJIHUzMiAgICAgIGFkZHIKIAkJCQkpCiB7CiAJdm9pZCBfX2lvbWVtICpyZWdzID0gbXZpLT5yZWdzX2V4IC0gMHgxMDIwMDsKQEAgLTk3NCw3ICs5NzUsNyBAQAogfQogCiAKLWludCBtdnNfOTR4eF9zcGlfaXNzdWVjbWQoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBjbWQpCitzdGF0aWMgaW50IG12c185NHh4X3NwaV9pc3N1ZWNtZChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIGNtZCkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3NfZXggLSAweDEwMjAwOwogCW13MzIoU1BJX0NUUkxfUkVHXzk0WFgsIGNtZCB8IFNQSV9DVFJMX1NwaVN0YXJ0Xzk0WFgpOwpAQCAtOTgyLDcgKzk4Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBtdnNfOTR4eF9zcGlfd2FpdGRhdGFyZWFkeShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHRpbWVvdXQpCitzdGF0aWMgaW50IG12c185NHh4X3NwaV93YWl0ZGF0YXJlYWR5KHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgdGltZW91dCkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3NfZXggLSAweDEwMjAwOwogCXUzMiAgIGksIGR3VG1wOwpAQCAtOTk3LDggKzk5OCw4IEBACiAJcmV0dXJuIC0xOwogfQogCi12b2lkIG12c185NHh4X2ZpeF9kbWEoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwaHlfbWFzaywKLQkJCQlpbnQgYnVmX2xlbiwgaW50IGZyb20sIHZvaWQgKnByZCkKK3N0YXRpYyB2b2lkIG12c185NHh4X2ZpeF9kbWEoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwaHlfbWFzaywKKwkJCSAgICAgaW50IGJ1Zl9sZW4sIGludCBmcm9tLCB2b2lkICpwcmQpCiB7CiAJaW50IGk7CiAJc3RydWN0IG12c19wcmQgKmJ1Zl9wcmQgPSBwcmQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmMgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmMKaW5kZXggNWI5ZmNmZi4uODZlYjE5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuYwpAQCAtNzQsNyArNzQsNyBAQAogCQltdnNfdGFnX2NsZWFyKG12aSwgaSk7CiB9CiAKLXN0cnVjdCBtdnNfaW5mbyAqbXZzX2ZpbmRfZGV2X212aShzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBtdnNfaW5mbyAqbXZzX2ZpbmRfZGV2X212aShzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgaSA9IDAsIGogPSAwLCBoaSA9IDA7CiAJc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNoYSA9IGRldi0+cG9ydC0+aGE7CkBAIC0xMDIsNyArMTAyLDcgQEAKIAogfQogCi1pbnQgbXZzX2ZpbmRfZGV2X3BoeW5vKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsIGludCAqcGh5bm8pCitzdGF0aWMgaW50IG12c19maW5kX2Rldl9waHlubyhzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCBpbnQgKnBoeW5vKQogewogCXVuc2lnbmVkIGxvbmcgaSA9IDAsIGogPSAwLCBuID0gMCwgbnVtID0gMDsKIAlzdHJ1Y3QgbXZzX2RldmljZSAqbXZpX2RldiA9IChzdHJ1Y3QgbXZzX2RldmljZSAqKWRldi0+bGxkZF9kZXY7CkBAIC0xMTU4LDcgKzExNTgsNyBAQAogCW12c19wb3J0X25vdGlmeV9kZWZvcm1lZChzYXNfcGh5LCAxKTsKIH0KIAotc3RydWN0IG12c19kZXZpY2UgKm12c19hbGxvY19kZXYoc3RydWN0IG12c19pbmZvICptdmkpCitzdGF0aWMgc3RydWN0IG12c19kZXZpY2UgKm12c19hbGxvY19kZXYoc3RydWN0IG12c19pbmZvICptdmkpCiB7CiAJdTMyIGRldjsKIAlmb3IgKGRldiA9IDA7IGRldiA8IE1WU19NQVhfREVWSUNFUzsgZGV2KyspIHsKQEAgLTExNzUsNyArMTE3NSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgbXZzX2ZyZWVfZGV2KHN0cnVjdCBtdnNfZGV2aWNlICptdmlfZGV2KQorc3RhdGljIHZvaWQgbXZzX2ZyZWVfZGV2KHN0cnVjdCBtdnNfZGV2aWNlICptdmlfZGV2KQogewogCXUzMiBpZCA9IG12aV9kZXYtPmRldmljZV9pZDsKIAltZW1zZXQobXZpX2RldiwgMCwgc2l6ZW9mKCptdmlfZGV2KSk7CkBAIC0xMTg1LDcgKzExODUsNyBAQAogCW12aV9kZXYtPnRhc2tmaWxlc2V0ID0gTVZTX0lEX05PVF9NQVBQRUQ7CiB9CiAKLWludCBtdnNfZGV2X2ZvdW5kX25vdGlmeShzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCBpbnQgbG9jaykKK3N0YXRpYyBpbnQgbXZzX2Rldl9mb3VuZF9ub3RpZnkoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldiwgaW50IGxvY2spCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJaW50IHJlcyA9IDA7CkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogCXJldHVybiBtdnNfZGV2X2ZvdW5kX25vdGlmeShkZXYsIDEpOwogfQogCi12b2lkIG12c19kZXZfZ29uZV9ub3RpZnkoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG12c19kZXZfZ29uZV9ub3RpZnkoc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAlzdHJ1Y3QgbXZzX2RldmljZSAqbXZpX2RldiA9IGRldi0+bGxkZF9kZXY7CkBAIC0xNjExLDcgKzE2MTEsNyBAQAogCXJldHVybiBzdGF0OwogfQogCi12b2lkIG12c19zZXRfc2Vuc2UodTggKmJ1ZmZlciwgaW50IGxlbiwgaW50IGRfc2Vuc2UsCitzdGF0aWMgdm9pZCBtdnNfc2V0X3NlbnNlKHU4ICpidWZmZXIsIGludCBsZW4sIGludCBkX3NlbnNlLAogCQlpbnQga2V5LCBpbnQgYXNjLCBpbnQgYXNjcSkKIHsKIAltZW1zZXQoYnVmZmVyLCAwLCBsZW4pOwpAQCAtMTY1MCw3ICsxNjUwLDcgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQgbXZzX2ZpbGxfc3NwX3Jlc3BfaXUoc3RydWN0IHNzcF9yZXNwb25zZV9pdSAqaXUsCitzdGF0aWMgdm9pZCBtdnNfZmlsbF9zc3BfcmVzcF9pdShzdHJ1Y3Qgc3NwX3Jlc3BvbnNlX2l1ICppdSwKIAkJCQl1OCBrZXksIHU4IGFzYywgdTggYXNjX3EpCiB7CiAJaXUtPmRhdGFwcmVzID0gMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wYXMxNi5jIGIvZHJpdmVycy9zY3NpL3BhczE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjg5YWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zY3NpL3BhczE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NjUgKzAsMCBAQAotLyoKLSAqIFRoaXMgZHJpdmVyIGFkYXB0ZWQgZnJvbSBEcmV3IEVja2hhcmR0J3MgVHJhbnRvciBUMTI4IGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0Ci0gKglWaXNpb25hcnkgQ29tcHV0aW5nCi0gKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQotICoJZHJld0Bjb2xvcmFkby5lZHUKLSAqICAgICAgKzEgKDMwMykgNjY2LTU4MzYKLSAqCi0gKiAgKCBCYXNlZCBvbiBUMTI4IC0gRElTVFJJQlVUSU9OIFJFTEVBU0UgMy4gKSAKLSAqCi0gKiBNb2RpZmllZCB0byB3b3JrIHdpdGggdGhlIFBybyBBdWRpbyBTcGVjdHJ1bS9TdHVkaW8gMTYKLSAqIGJ5IEpvaG4gV2VpZG1hbi4KLSAqCi0gKgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IAotICoKLSAqIE1lZGlhIFZpc2lvbgotICogKDUxMCkgNzcwLTg2MDAKLSAqICg4MDApIDM0OC03MTE2Ci0gKi8KLQotLyoKLSAqIFRoZSBjYXJkIGlzIGRldGVjdGVkIGFuZCBpbml0aWFsaXplZCBpbiBvbmUgb2Ygc2V2ZXJhbCB3YXlzIDogCi0gKiAxLiAgQXV0b3Byb2JlIChkZWZhdWx0KSAtIFRoZXJlIGFyZSBtYW55IGRpZmZlcmVudCBtb2RlbHMgb2YKLSAqICAgICB0aGUgUHJvIEF1ZGlvIFNwZWN0cnVtL1N0dWRpbyAxNiwgYW5kIEkgb25seSBoYXZlIG9uZSBvZgotICogICAgIHRoZW0sIHNvIHRoaXMgbWF5IHJlcXVpcmUgYSBsaXR0bGUgdHdlYWtpbmcuICBBbiBpbnRlcnJ1cHQKLSAqICAgICBpcyB0cmlnZ2VyZWQgdG8gYXV0b3Byb2JlIGZvciB0aGUgaW50ZXJydXB0IGxpbmUuICBOb3RlOgotICogICAgIHdpdGggdGhlIG5ld2VyIG1vZGVsIGJvYXJkcywgdGhlIGludGVycnVwdCBpcyBzZXQgdmlhCi0gKiAgICAgc29mdHdhcmUgYWZ0ZXIgcmVzZXQgdXNpbmcgdGhlIGRlZmF1bHRfaXJxIGZvciB0aGUKLSAqICAgICBjdXJyZW50IGJvYXJkIG51bWJlci4KLSAqCi0gKiAyLiAgV2l0aCBjb21tYW5kIGxpbmUgb3ZlcnJpZGVzIC0gcGFzMTY9cG9ydCxpcnEgbWF5IGJlIAotICogICAgIHVzZWQgb24gdGhlIExJTE8gY29tbWFuZCBsaW5lIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0cy4KLSAqCi0gKiAzLiAgV2l0aCB0aGUgUEFTMTZfT1ZFUlJJREUgY29tcGlsZSB0aW1lIGRlZmluZS4gIFRoaXMgaXMgCi0gKiAgICAgc3BlY2lmaWVkIGFzIGFuIGFycmF5IG9mIGFkZHJlc3MsIGlycSB0dXBsZXMuICBJZSwgZm9yCi0gKiAgICAgb25lIGJvYXJkIGF0IHRoZSBkZWZhdWx0IDB4Mzg4IGFkZHJlc3MsIElSUTEwLCBJIGNvdWxkIHNheSAKLSAqICAgICAtRFBBUzE2X09WRVJSSURFPXt7MHgzODgsIDEwfX0KLSAqICAgICBOT1RFOiAgVW50ZXN0ZWQuCi0gKgkKLSAqIDQuICBXaGVuIGluY2x1ZGVkIGFzIGEgbW9kdWxlLCB3aXRoIGFyZ3VtZW50cyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZToKLSAqICAgICAgICAgcGFzMTZfaXJxPXh4CQl0aGUgaW50ZXJydXB0Ci0gKiAgICAgICAgIHBhczE2X2FkZHI9eHgJdGhlIHBvcnQKLSAqICAgICBlLmcuICJtb2Rwcm9iZSBwYXMxNiBwYXMxNl9hZGRyPTB4Mzg4IHBhczE2X2lycT01IgotICoKLSAqICAgICBOb3RlIHRoYXQgaWYgdGhlIG92ZXJyaWRlIG1ldGhvZHMgYXJlIHVzZWQsIHBsYWNlIGhvbGRlcnMgbXVzdAotICogICAgIGJlIHNwZWNpZmllZCBmb3Igb3RoZXIgYm9hcmRzIGluIHRoZSBzeXN0ZW0uCi0gKgotICoKLSAqIENvbmZpZ3VyYXRpb24gbm90ZXMgOgotICogICBUaGUgY3VycmVudCBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcnJ1cHQgc2hhcmluZyB3aXRoIHRoZQotICogICBzb3VuZCBwb3J0aW9uIG9mIHRoZSBjYXJkLiAgSWYgeW91IHVzZSB0aGUgc2FtZSBpcnEgZm9yIHRoZQotICogICBzY3NpIHBvcnQgYW5kIHNvdW5kIHlvdSB3aWxsIGhhdmUgcHJvYmxlbXMuICBFaXRoZXIgdXNlCi0gKiAgIGEgZGlmZmVyZW50IGlycSBmb3IgdGhlIHNjc2kgcG9ydCBvciBkb24ndCB1c2UgaW50ZXJydXB0cwotICogICBmb3IgdGhlIHNjc2kgcG9ydC4KLSAqCi0gKiAgIElmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggeW91ciBjYXJkIG5vdCBiZWluZyByZWNvZ25pemVkLCB1c2UKLSAqICAgdGhlIExJTE8gY29tbWFuZCBsaW5lIG92ZXJyaWRlLiAgVHJ5IHRvIGdldCBpdCByZWNvZ25pemVkIHdpdGhvdXQKLSAqICAgaW50ZXJydXB0cy4gIEllLCBmb3IgYSBib2FyZCBhdCB0aGUgZGVmYXVsdCAweDM4OCBiYXNlIHBvcnQsCi0gKiAgIGJvb3Q6IGxpbnV4IHBhczE2PTB4Mzg4LDAKLSAqCi0gKiAgIE5PX0lSUSAoMCkgc2hvdWxkIGJlIHNwZWNpZmllZCBmb3Igbm8gaW50ZXJydXB0LAotICogICBJUlFfQVVUTyAoMjU0KSB0byBhdXRvcHJvYmUgZm9yIGFuIElSUSBsaW5lIGlmIG92ZXJyaWRkZW4KLSAqICAgb24gdGhlIGNvbW1hbmQgbGluZS4KLSAqLwotIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2RtYS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+Ci0jaW5jbHVkZSAicGFzMTYuaCIKLSNpbmNsdWRlICJOQ1I1MzgwLmgiCi0KLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IHBhczE2X2FkZHI7Ci1zdGF0aWMgaW50IHBhczE2X2lycTsKLSAKLQotc3RhdGljIGNvbnN0IGludCBzY3NpX2lycV90cmFuc2xhdGVbXSA9Ci0JeyAwLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgMCwgIDAsICA3LCAgOCwgIDksICAwLCAxMCwgMTEgfTsKLQotLyogVGhlIGRlZmF1bHRfaXJxcyBhcnJheSBjb250YWlucyB2YWx1ZXMgdXNlZCB0byBzZXQgdGhlIGlycSBpbnRvIHRoZQotICogYm9hcmQgdmlhIHNvZnR3YXJlIChhcyBtdXN0IGJlIGRvbmUgb24gbmV3ZXIgbW9kZWwgYm9hcmRzIHdpdGhvdXQKLSAqIGlycSBqdW1wZXJzIG9uIHRoZSBib2FyZCkuICBUaGUgZmlyc3QgdmFsdWUgaW4gdGhlIGFycmF5IHdpbGwgYmUKLSAqIGFzc2lnbmVkIHRvIGxvZ2ljYWwgYm9hcmQgMCwgdGhlIG5leHQgdG8gYm9hcmQgMSwgZXRjLgotICovCi1zdGF0aWMgaW50IGRlZmF1bHRfaXJxc1tdIF9faW5pdGRhdGEgPQotCXsgIFBBUzE2X0RFRkFVTFRfQk9BUkRfMV9JUlEsCi0JICAgUEFTMTZfREVGQVVMVF9CT0FSRF8yX0lSUSwKLQkgICBQQVMxNl9ERUZBVUxUX0JPQVJEXzNfSVJRLAotCSAgIFBBUzE2X0RFRkFVTFRfQk9BUkRfNF9JUlEKLQl9OwotCi1zdGF0aWMgc3RydWN0IG92ZXJyaWRlIHsKLSAgICB1bnNpZ25lZCBzaG9ydCBpb19wb3J0OwotICAgIGludCAgaXJxOwotfSBvdmVycmlkZXMKLSNpZmRlZiBQQVMxNl9PVkVSUklERQotICAgIFtdIF9faW5pdGRhdGEgPSBQQVMxNl9PVkVSUklERTsKLSNlbHNlCi0gICAgWzRdIF9faW5pdGRhdGEgPSB7ezAsSVJRX0FVVE99LCB7MCxJUlFfQVVUT30sIHswLElSUV9BVVRPfSwKLQl7MCxJUlFfQVVUT319OwotI2VuZGlmCi0KLSNkZWZpbmUgTk9fT1ZFUlJJREVTIEFSUkFZX1NJWkUob3ZlcnJpZGVzKQotCi1zdGF0aWMgc3RydWN0IGJhc2UgewotICAgIHVuc2lnbmVkIHNob3J0IGlvX3BvcnQ7Ci0gICAgaW50IG5vYXV0bzsKLX0gYmFzZXNbXSBfX2luaXRkYXRhID0KLQl7IHtQQVMxNl9ERUZBVUxUX0JBU0VfMSwgMH0sCi0JICB7UEFTMTZfREVGQVVMVF9CQVNFXzIsIDB9LAotCSAge1BBUzE2X0RFRkFVTFRfQkFTRV8zLCAwfSwKLQkgIHtQQVMxNl9ERUZBVUxUX0JBU0VfNCwgMH0KLQl9OwotCi0jZGVmaW5lIE5PX0JBU0VTIEFSUkFZX1NJWkUoYmFzZXMpCi0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCAgcGFzMTZfb2Zmc2V0WyA4IF0gPQotICAgIHsKLQkweDFjMDAsICAgIC8qIE9VVFBVVF9EQVRBX1JFRyAqLwotCTB4MWMwMSwgICAgLyogSU5JVElBVE9SX0NPTU1BTkRfUkVHICovCi0JMHgxYzAyLCAgICAvKiBNT0RFX1JFRyAqLwotCTB4MWMwMywgICAgLyogVEFSR0VUX0NPTU1BTkRfUkVHICovCi0JMHgzYzAwLCAgICAvKiBTVEFUVVNfUkVHIHJvLCBTRUxFQ1RfRU5BQkxFX1JFRyB3byAqLwotCTB4M2MwMSwgICAgLyogQlVTX0FORF9TVEFUVVNfUkVHIHJvLCBTVEFSVF9ETUFfU0VORF9SRUcgd28gKi8KLQkweDNjMDIsICAgIC8qIElOUFVUX0RBVEFfUkVHSVNURVIgcm8sIChOL0Egb24gUEFTMTYgPykKLQkJICAgICogU1RBUlRfRE1BX1RBUkdFVF9SRUNFSVZFX1JFRyB3bwotCQkgICAgKi8KLQkweDNjMDMsICAgIC8qIFJFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHIHJvLAotCQkgICAgKiBTVEFSVF9ETUFfSU5JVElBVE9SX1JFQ0VJVkVfUkVHIHdvCi0JCSAgICAqLwotICAgIH07Ci0KLQotLyoKLSAqIEZ1bmN0aW9uIDogZW5hYmxlX2JvYXJkKCBpbnQgIGJvYXJkX251bSwgdW5zaWduZWQgc2hvcnQgcG9ydCApCi0gKgotICogUHVycG9zZSA6ICBzZXQgYWRkcmVzcyBpbiBuZXcgbW9kZWwgYm9hcmQKLSAqCi0gKiBJbnB1dHMgOiBib2FyZF9udW0gLSBsb2dpY2FsIGJvYXJkIG51bWJlciAwLTMsIHBvcnQgLSBiYXNlIGFkZHJlc3MKLSAqCi0gKi8KLQotc3RhdGljIHZvaWQgX19pbml0Ci0JZW5hYmxlX2JvYXJkKCBpbnQgIGJvYXJkX251bSwgIHVuc2lnbmVkIHNob3J0IHBvcnQgKQotewotICAgIG91dGIoIDB4YmMgKyBib2FyZF9udW0sIE1BU1RFUl9BRERSRVNTX1BUUiApOwotICAgIG91dGIoIHBvcnQgPj4gMiwgTUFTVEVSX0FERFJFU1NfUFRSICk7Ci19Ci0KLQotCi0vKgotICogRnVuY3Rpb24gOiBpbml0X2JvYXJkKCB1bnNpZ25lZCBzaG9ydCBwb3J0LCBpbnQgaXJxICkKLSAqCi0gKiBQdXJwb3NlIDogIFNldCB0aGUgYm9hcmQgdXAgdG8gaGFuZGxlIHRoZSBTQ1NJIGludGVyZmFjZQotICoKLSAqIElucHV0cyA6IHBvcnQgLSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGJvYXJkLAotICoJICAgIGlycSAtIGlycSB0byBhc3NpZ24gdG8gdGhlIFNDU0kgcG9ydAotICoJICAgIGZvcmNlX2lycSAtIHNldCBpdCBldmVuIGlmIGl0IGNvbmZsaWN0cyB3aXRoIHNvdW5kIGRyaXZlcgotICoKLSAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgCi0JaW5pdF9ib2FyZCggdW5zaWduZWQgc2hvcnQgaW9fcG9ydCwgaW50IGlycSwgaW50IGZvcmNlX2lycSApCi17Ci0JdW5zaWduZWQgaW50CXRtcDsKLQl1bnNpZ25lZCBpbnQJcGFzX2lycV9jb2RlOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgU0NTSSBwYXJ0IG9mIHRoZSBib2FyZCAqLwotCi0Jb3V0YiggMHgzMCwgaW9fcG9ydCArIFBfVElNRU9VVF9DT1VOVEVSX1JFRyApOyAgLyogVGltZW91dCBjb3VudGVyICovCi0Jb3V0YiggMHgwMSwgaW9fcG9ydCArIFBfVElNRU9VVF9TVEFUVVNfUkVHX09GRlNFVCApOyAgIC8qIFJlc2V0IFRDICovCi0Jb3V0YiggMHgwMSwgaW9fcG9ydCArIFdBSVRfU1RBVEUgKTsgICAvKiAxIFdhaXQgc3RhdGUgKi8KLQotCWluYihpb19wb3J0ICsgcGFzMTZfb2Zmc2V0W1JFU0VUX1BBUklUWV9JTlRFUlJVUFRfUkVHXSk7Ci0KLQkvKiBTZXQgdGhlIFNDU0kgaW50ZXJydXB0IHBvaW50ZXIgd2l0aG91dCBtdWNraW5nIHVwIHRoZSBzb3VuZAotCSAqIGludGVycnVwdCBwb2ludGVyIGluIHRoZSBzYW1lIGJ5dGUuCi0JICovCi0JcGFzX2lycV9jb2RlID0gKCBpcnEgPCAxNiApID8gc2NzaV9pcnFfdHJhbnNsYXRlW2lycV0gOiAwOwotCXRtcCA9IGluYiggaW9fcG9ydCArIElPX0NPTkZJR18zICk7Ci0KLQlpZiggKCggdG1wICYgMHgwZiApID09IHBhc19pcnFfY29kZSkgJiYgcGFzX2lycV9jb2RlID4gMCAKLQkgICAgJiYgIWZvcmNlX2lycSApCi0JewotCSAgICBwcmludGsoICJwYXMxNjogV0FSTklORzogQ2FuJ3QgdXNlIHNhbWUgaXJxIGFzIHNvdW5kICIKLQkJICAgICJkcml2ZXIgLS0gaW50ZXJydXB0cyBkaXNhYmxlZFxuIiApOwotCSAgICAvKiBTZXQgdXAgdGhlIGRyaXZlIHBhcmFtZXRlcnMsIGRpc2FibGUgNTM4MCBpbnRlcnJ1cHRzICovCi0JICAgIG91dGIoIDB4NGQsIGlvX3BvcnQgKyBTWVNfQ09ORklHXzQgKTsKLQl9Ci0JZWxzZQotCXsKLQkgICAgdG1wID0gKCAgdG1wICYgMHgwZiApIHwgKCBwYXNfaXJxX2NvZGUgPDwgNCApOwotCSAgICBvdXRiKCB0bXAsIGlvX3BvcnQgKyBJT19DT05GSUdfMyApOwotCi0JICAgIC8qIFNldCB1cCB0aGUgZHJpdmUgcGFyYW1ldGVycyBhbmQgZW5hYmxlIDUzODAgaW50ZXJydXB0cyAqLwotCSAgICBvdXRiKCAweDZkLCBpb19wb3J0ICsgU1lTX0NPTkZJR180ICk7Ci0JfQotfQotCi0KLS8qCi0gKiBGdW5jdGlvbiA6IHBhczE2X2h3X2RldGVjdCggdW5zaWduZWQgc2hvcnQgYm9hcmRfbnVtICkKLSAqCi0gKiBQdXJwb3NlIDogZGV0ZXJtaW5lIGlmIGEgcGFzMTYgYm9hcmQgaXMgcHJlc2VudAotICogCi0gKiBJbnB1dHMgOiBib2FyZF9udW0gLSBsb2dpY2FsIGJvYXJkIG51bWJlciAoIDAgLSAzICkKLSAqCi0gKiBSZXR1cm5zIDogMCBpZiBib2FyZCBub3QgZm91bmQsIDEgaWYgZm91bmQuCi0gKi8KLQotc3RhdGljIGludCBfX2luaXQgCi0gICAgIHBhczE2X2h3X2RldGVjdCggdW5zaWduZWQgc2hvcnQgIGJvYXJkX251bSApCi17Ci0gICAgdW5zaWduZWQgY2hhcglib2FyZF9yZXYsIHRtcDsKLSAgICB1bnNpZ25lZCBzaG9ydAlpb19wb3J0ID0gYmFzZXNbIGJvYXJkX251bSBdLmlvX3BvcnQ7Ci0KLSAgICAvKiBTZWUgaWYgd2UgY2FuIGZpbmQgYSBQQVMxNiBib2FyZCBhdCB0aGUgYWRkcmVzcyBhc3NvY2lhdGVkCi0gICAgICogd2l0aCB0aGlzIGxvZ2ljYWwgYm9hcmQgbnVtYmVyLgotICAgICAqLwotCi0gICAgLyogRmlyc3QsIGF0dGVtcHQgdG8gdGFrZSBhIG5ld2VyIG1vZGVsIGJvYXJkIG91dCBvZiByZXNldCBhbmQKLSAgICAgKiBnaXZlIGl0IGEgYmFzZSBhZGRyZXNzLiAgVGhpcyBzaG91bGRuJ3QgYWZmZWN0IG9sZGVyIGJvYXJkcy4KLSAgICAgKi8KLSAgICBlbmFibGVfYm9hcmQoIGJvYXJkX251bSwgaW9fcG9ydCApOwotCi0gICAgLyogTm93IHNlZSBpZiBpdCBsb29rcyBsaWtlIGEgUEFTMTYgYm9hcmQgKi8KLSAgICBib2FyZF9yZXYgPSBpbmIoIGlvX3BvcnQgKyBQQ0JfQ09ORklHICk7Ci0KLSAgICBpZiggYm9hcmRfcmV2ID09IDB4ZmYgKQotCXJldHVybiAwOwotCi0gICAgdG1wID0gYm9hcmRfcmV2IF4gMHhlMDsKLQotICAgIG91dGIoIHRtcCwgaW9fcG9ydCArIFBDQl9DT05GSUcgKTsKLSAgICB0bXAgPSBpbmIoIGlvX3BvcnQgKyBQQ0JfQ09ORklHICk7Ci0gICAgb3V0YiggYm9hcmRfcmV2LCBpb19wb3J0ICsgUENCX0NPTkZJRyApOwotCi0gICAgaWYoIGJvYXJkX3JldiAhPSB0bXAgKSAJLyogTm90IGEgUEFTLTE2ICovCi0JcmV0dXJuIDA7Ci0KLSAgICBpZiggKCBpbmIoIGlvX3BvcnQgKyBPUEVSQVRJT05fTU9ERV8xICkgJiAweDAzICkgIT0gMHgwMyApIAotCXJldHVybiAwOyAgCS8qIHJldHVybiBpZiBubyBTQ1NJIGludGVyZmFjZSBmb3VuZCAqLwotCi0gICAgLyogTWVkaWF2aXNpb24gaGFzIHNvbWUgbmV3IG1vZGVsIGJvYXJkcyB0aGF0IHJldHVybiBJRCBiaXRzCi0gICAgICogdGhhdCBpbmRpY2F0ZSBhIFNDU0kgaW50ZXJmYWNlLCBidXQgdGhleSdyZSBub3QgKExNUykuICBXZSdsbAotICAgICAqIHB1dCBpbiBhbiBhZGRpdGlvbmFsIHRlc3QgdG8gdHJ5IHRvIHdlZWQgdGhlbSBvdXQuCi0gICAgICovCi0KLQlvdXRiKDB4MDEsIGlvX3BvcnQgKyBXQUlUX1NUQVRFKTsgICAgICAgICAgICAgLyogMSBXYWl0IHN0YXRlICovCi0Jb3V0YigweDIwLCBpb19wb3J0ICsgcGFzMTZfb2Zmc2V0W01PREVfUkVHXSk7IC8qIElzIGl0IHJlYWxseSBTQ1NJPyAqLwotCWlmIChpbmIoaW9fcG9ydCArIHBhczE2X29mZnNldFtNT0RFX1JFR10pICE9IDB4MjApIC8qIFdyaXRlIHRvIGEgcmVnLiAqLwotCQlyZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHRyeSB0byByZWFkICovCi0Jb3V0YigweDAwLCBpb19wb3J0ICsgcGFzMTZfb2Zmc2V0W01PREVfUkVHXSk7ICAgICAgLyogaXQgYmFjay4gKi8KLQlpZiAoaW5iKGlvX3BvcnQgKyBwYXMxNl9vZmZzZXRbTU9ERV9SRUddKSAhPSAweDAwKQotCQlyZXR1cm4gMDsKLQotICAgIHJldHVybiAxOwotfQotCi0KLSNpZm5kZWYgTU9EVUxFCi0vKgotICogRnVuY3Rpb24gOiBwYXMxNl9zZXR1cChjaGFyICpzdHIsIGludCAqaW50cykKLSAqCi0gKiBQdXJwb3NlIDogTElMTyBjb21tYW5kIGxpbmUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG92ZXJyaWRlcyBhcnJheSwKLSAqIAotICogSW5wdXRzIDogc3RyIC0gdW51c2VkLCBpbnRzIC0gYXJyYXkgb2YgaW50ZWdlciBwYXJhbWV0ZXJzIHdpdGggaW50c1swXQotICoJZXF1YWwgdG8gdGhlIG51bWJlciBvZiBpbnRzLgotICoKLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBwYXMxNl9zZXR1cChjaGFyICpzdHIpCi17Ci0Jc3RhdGljIGludCBjb21tYW5kbGluZV9jdXJyZW50OwotICAgIGludCBpOwotICAgIGludCBpbnRzWzEwXTsKLQotICAgIGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7Ci0gICAgaWYgKGludHNbMF0gIT0gMikgCi0JcHJpbnRrKCJwYXMxNl9zZXR1cCA6IHVzYWdlIHBhczE2PWlvX3BvcnQsaXJxXG4iKTsKLSAgICBlbHNlIAotCWlmIChjb21tYW5kbGluZV9jdXJyZW50IDwgTk9fT1ZFUlJJREVTKSB7Ci0JICAgIG92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5pb19wb3J0ID0gKHVuc2lnbmVkIHNob3J0KSBpbnRzWzFdOwotCSAgICBvdmVycmlkZXNbY29tbWFuZGxpbmVfY3VycmVudF0uaXJxID0gaW50c1syXTsKLQkgICAgZm9yIChpID0gMDsgaSA8IE5PX0JBU0VTOyArK2kpCi0JCWlmIChiYXNlc1tpXS5pb19wb3J0ID09ICh1bnNpZ25lZCBzaG9ydCkgaW50c1sxXSkgewotIAkJICAgIGJhc2VzW2ldLm5vYXV0byA9IDE7Ci0JCSAgICBicmVhazsKLQkJfQotCSAgICArK2NvbW1hbmRsaW5lX2N1cnJlbnQ7Ci0JfQotICAgIHJldHVybiAxOwotfQotCi1fX3NldHVwKCJwYXMxNj0iLCBwYXMxNl9zZXR1cCk7Ci0jZW5kaWYKLQotLyogCi0gKiBGdW5jdGlvbiA6IGludCBwYXMxNl9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqIHRwbnQpCi0gKgotICogUHVycG9zZSA6IGRldGVjdHMgYW5kIGluaXRpYWxpemVzIFBBUzE2IGNvbnRyb2xsZXJzCi0gKgl0aGF0IHdlcmUgYXV0b3Byb2JlZCwgb3ZlcnJpZGRlbiBvbiB0aGUgTElMTyBjb21tYW5kIGxpbmUsIAotICoJb3Igc3BlY2lmaWVkIGF0IGNvbXBpbGUgdGltZS4KLSAqCi0gKiBJbnB1dHMgOiB0cG50IC0gdGVtcGxhdGUgZm9yIHRoaXMgU0NTSSBhZGFwdGVyLgotICogCi0gKiBSZXR1cm5zIDogMSBpZiBhIGhvc3QgYWRhcHRlciB3YXMgZm91bmQsIDAgaWYgbm90LgotICoKLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBwYXMxNl9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKLXsKLQlzdGF0aWMgaW50IGN1cnJlbnRfb3ZlcnJpZGU7Ci0Jc3RhdGljIHVuc2lnbmVkIHNob3J0IGN1cnJlbnRfYmFzZTsKLSAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKLSAgICB1bnNpZ25lZCBzaG9ydCBpb19wb3J0OwotICAgIGludCAgY291bnQ7Ci0KLSAgICBpZiAocGFzMTZfYWRkciAhPSAwKSB7Ci0Jb3ZlcnJpZGVzWzBdLmlvX3BvcnQgPSBwYXMxNl9hZGRyOwotCS8qCi0JKiAgVGhpcyBpcyBob3cgd2UgYXZvaWQgc2VlaW5nIG1vcmUgdGhhbgotCSogIG9uZSBob3N0IGFkYXB0ZXIgYXQgdGhlIHNhbWUgSS9PIHBvcnQuCi0JKiAgQ3JpYmJlZCBzaGFtZWxlc3NseSBmcm9tIHBhczE2X3NldHVwKCkuCi0JKi8KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBOT19CQVNFUzsgKytjb3VudCkKLQkgICAgaWYgKGJhc2VzW2NvdW50XS5pb19wb3J0ID09IHBhczE2X2FkZHIpIHsKLSAJCSAgICBiYXNlc1tjb3VudF0ubm9hdXRvID0gMTsKLQkJICAgIGJyZWFrOwotCX0KLSAgICB9Ci0gICAgaWYgKHBhczE2X2lycSAhPSAwKQotCW92ZXJyaWRlc1swXS5pcnEgPSBwYXMxNl9pcnE7Ci0KLSAgICBmb3IgKGNvdW50ID0gMDsgY3VycmVudF9vdmVycmlkZSA8IE5PX09WRVJSSURFUzsgKytjdXJyZW50X292ZXJyaWRlKSB7Ci0JaW9fcG9ydCA9IDA7Ci0KLQlpZiAob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlvX3BvcnQpCi0JewotCSAgICBpb19wb3J0ID0gb3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlvX3BvcnQ7Ci0JICAgIGVuYWJsZV9ib2FyZCggY3VycmVudF9vdmVycmlkZSwgaW9fcG9ydCApOwotCSAgICBpbml0X2JvYXJkKCBpb19wb3J0LCBvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uaXJxLCAxICk7Ci0JfQotCWVsc2UKLQkgICAgZm9yICg7ICFpb19wb3J0ICYmIChjdXJyZW50X2Jhc2UgPCBOT19CQVNFUyk7ICsrY3VycmVudF9iYXNlKSB7Ci0JCWRwcmludGsoTkRFQlVHX0lOSVQsICJwYXMxNjogcHJvYmluZyBpb19wb3J0IDB4JTA0eFxuIiwKLQkJICAgICAgICAodW5zaWduZWQgaW50KWJhc2VzW2N1cnJlbnRfYmFzZV0uaW9fcG9ydCk7Ci0JCWlmICggIWJhc2VzW2N1cnJlbnRfYmFzZV0ubm9hdXRvICYmCi0JCSAgICAgcGFzMTZfaHdfZGV0ZWN0KCBjdXJyZW50X2Jhc2UgKSApewotCQkJaW9fcG9ydCA9IGJhc2VzW2N1cnJlbnRfYmFzZV0uaW9fcG9ydDsKLQkJCWluaXRfYm9hcmQoIGlvX3BvcnQsIGRlZmF1bHRfaXJxc1sgY3VycmVudF9iYXNlIF0sIDAgKTsgCi0JCQlkcHJpbnRrKE5ERUJVR19JTklULCAicGFzMTY6IGRldGVjdGVkIGJvYXJkXG4iKTsKLQkJfQotICAgIH0KLQotCWRwcmludGsoTkRFQlVHX0lOSVQsICJwYXMxNjogaW9fcG9ydCA9IDB4JTA0eFxuIiwKLQkgICAgICAgICh1bnNpZ25lZCBpbnQpaW9fcG9ydCk7Ci0KLQlpZiAoIWlvX3BvcnQpCi0JICAgIGJyZWFrOwotCi0JaW5zdGFuY2UgPSBzY3NpX3JlZ2lzdGVyICh0cG50LCBzaXplb2Yoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEpKTsKLQlpZihpbnN0YW5jZSA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQkJCi0JaW5zdGFuY2UtPmlvX3BvcnQgPSBpb19wb3J0OwotCi0JaWYgKE5DUjUzODBfaW5pdChpbnN0YW5jZSwgRkxBR19ETUFfRklYVVAgfCBGTEFHX0xBVEVfRE1BX1NFVFVQKSkKLQkJZ290byBvdXRfdW5yZWdpc3RlcjsKLQotCU5DUjUzODBfbWF5YmVfcmVzZXRfYnVzKGluc3RhbmNlKTsKLQotCWlmIChvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uaXJxICE9IElSUV9BVVRPKQotCSAgICBpbnN0YW5jZS0+aXJxID0gb3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlycTsKLQllbHNlIAotCSAgICBpbnN0YW5jZS0+aXJxID0gTkNSNTM4MF9wcm9iZV9pcnEoaW5zdGFuY2UsIFBBUzE2X0lSUVMpOwotCi0JLyogQ29tcGF0aWJpbGl0eSB3aXRoIGRvY3VtZW50ZWQgTkNSNTM4MCBrZXJuZWwgcGFyYW1ldGVycyAqLwotCWlmIChpbnN0YW5jZS0+aXJxID09IDI1NSkKLQkJaW5zdGFuY2UtPmlycSA9IE5PX0lSUTsKLQotCWlmIChpbnN0YW5jZS0+aXJxICE9IE5PX0lSUSkKLQkgICAgaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIHBhczE2X2ludHIsIDAsCi0JCQkgICAgInBhczE2IiwgaW5zdGFuY2UpKSB7Ci0JCXByaW50aygic2NzaSVkIDogSVJRJWQgbm90IGZyZWUsIGludGVycnVwdHMgZGlzYWJsZWRcbiIsIAotCQkgICAgaW5zdGFuY2UtPmhvc3Rfbm8sIGluc3RhbmNlLT5pcnEpOwotCQlpbnN0YW5jZS0+aXJxID0gTk9fSVJROwotCSAgICB9IAotCi0JaWYgKGluc3RhbmNlLT5pcnEgPT0gTk9fSVJRKSB7Ci0JICAgIHByaW50aygic2NzaSVkIDogaW50ZXJydXB0cyBub3QgZW5hYmxlZC4gZm9yIGJldHRlciBpbnRlcmFjdGl2ZSBwZXJmb3JtYW5jZSxcbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKLQkgICAgcHJpbnRrKCJzY3NpJWQgOiBwbGVhc2UganVtcGVyIHRoZSBib2FyZCBmb3IgYSBmcmVlIElSUS5cbiIsIGluc3RhbmNlLT5ob3N0X25vKTsKLQkgICAgLyogRGlzYWJsZSA1MzgwIGludGVycnVwdHMsIGxlYXZlIGRyaXZlIHBhcmFtcyB0aGUgc2FtZSAqLwotCSAgICBvdXRiKCAweDRkLCBpb19wb3J0ICsgU1lTX0NPTkZJR180ICk7Ci0JICAgIG91dGIoIChpbmIoaW9fcG9ydCArIElPX0NPTkZJR18zKSAmIDB4MGYpLCBpb19wb3J0ICsgSU9fQ09ORklHXzMgKTsKLQl9Ci0KLQlkcHJpbnRrKE5ERUJVR19JTklULCAic2NzaSVkIDogaXJxID0gJWRcbiIsCi0JICAgICAgICBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7Ci0KLQkrK2N1cnJlbnRfb3ZlcnJpZGU7Ci0JKytjb3VudDsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotCi1vdXRfdW5yZWdpc3RlcjoKLQlzY3NpX3VucmVnaXN0ZXIoaW5zdGFuY2UpOwotb3V0OgotCXJldHVybiBjb3VudDsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uIDogaW50IHBhczE2X2Jpb3NwYXJhbShEaXNrICpkaXNrLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsIGludCAqaXApCi0gKgotICogUHVycG9zZSA6IEdlbmVyYXRlcyBhIEJJT1MgLyBET1MgY29tcGF0aWJsZSBILUMtUyBtYXBwaW5nIGZvciAKLSAqCXRoZSBzcGVjaWZpZWQgZGV2aWNlIC8gc2l6ZS4KLSAqIAotICogSW5wdXRzIDogc2l6ZSA9IHNpemUgb2YgZGV2aWNlIGluIHNlY3RvcnMgKDUxMiBieXRlcyksIGRldiA9IGJsb2NrIGRldmljZQotICoJbWFqb3IgLyBtaW5vciwgaXBbXSA9IHtoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzfSAgCi0gKgotICogUmV0dXJucyA6IGFsd2F5cyAwIChzdWNjZXNzKSwgaW5pdGlhbGl6ZXMgaXAKLSAqCQotICovCi0KLS8qIAotICogWFhYIE1vc3QgU0NTSSBib2FyZHMgdXNlIHRoaXMgbWFwcGluZywgSSBjb3VsZCBiZSBpbmNvcnJlY3QuICBTb21lIG9uZQotICogdXNpbmcgaGFyZCBkaXNrcyBvbiBhIHRyYW50b3Igc2hvdWxkIHZlcmlmeSB0aGF0IHRoaXMgbWFwcGluZyBjb3JyZXNwb25kcwotICogdG8gdGhhdCB1c2VkIGJ5IHRoZSBCSU9TIC8gQVNQSSBkcml2ZXIgYnkgcnVubmluZyB0aGUgbGludXggZmRpc2sgcHJvZ3JhbQotICogYW5kIG1hdGNoaW5nIHRoZSBIX0NfUyBjb29yZGluYXRlcyB0byB3aGF0IERPUyB1c2VzLgotICovCi0KLXN0YXRpYyBpbnQgcGFzMTZfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdG9yX3QgY2FwYWNpdHksIGludCAqaXApCi17Ci0gIGludCBzaXplID0gY2FwYWNpdHk7Ci0gIGlwWzBdID0gNjQ7Ci0gIGlwWzFdID0gMzI7Ci0gIGlwWzJdID0gc2l6ZSA+PiAxMTsJCS8qIEkgdGhpbmsgSSBoYXZlIGl0IGFzIC8oMzIqNjQpICovCi0gIGlmKCBpcFsyXSA+IDEwMjQgKSB7CQkvKiB5ZXMsID4sIG5vdCA+PSAqLwotCWlwWzBdPTI1NTsKLQlpcFsxXT02MzsKLQlpcFsyXT1zaXplLyg2MyoyNTUpOwotCWlmKCBpcFsyXSA+IDEwMjMgKQkvKiB5ZXMgPjEwMjMuLi4gKi8KLQkJaXBbMl0gPSAxMDIzOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbiA6IGludCBwYXMxNl9wcmVhZCAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsCi0gKgl1bnNpZ25lZCBjaGFyICpkc3QsIGludCBsZW4pCi0gKgotICogUHVycG9zZSA6IEZhc3QgNTM4MCBwc2V1ZG8tZG1hIHJlYWQgZnVuY3Rpb24sIHRyYW5zZmVycyBsZW4gYnl0ZXMgdG8gCi0gKglkc3QKLSAqIAotICogSW5wdXRzIDogZHN0ID0gZGVzdGluYXRpb24sIGxlbiA9IGxlbmd0aCBpbiBieXRlcwotICoKLSAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3MsIG5vbiB6ZXJvIG9uIGEgZmFpbHVyZSBzdWNoIGFzIGEgd2F0Y2hkb2cgCi0gKiAJdGltZW91dC4KLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCBwYXMxNl9wcmVhZChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbikKLXsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyICAqZCA9IGRzdDsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBzaG9ydCByZWcgPSAodW5zaWduZWQgc2hvcnQpIChpbnN0YW5jZS0+aW9fcG9ydCArIAotCVBfREFUQV9SRUdfT0ZGU0VUKTsKLSAgICByZWdpc3RlciBpbnQgaSA9IGxlbjsKLSAgICBpbnQgaWkgPSAwOwotCi0gICAgd2hpbGUgKCAhKGluYihpbnN0YW5jZS0+aW9fcG9ydCArIFBfU1RBVFVTX1JFR19PRkZTRVQpICYgUF9TVF9SRFkpICkKLQkgKytpaTsKLQotICAgIGluc2IoIHJlZywgZCwgaSApOwotCi0gICAgaWYgKCBpbmIoaW5zdGFuY2UtPmlvX3BvcnQgKyBQX1RJTUVPVVRfU1RBVFVTX1JFR19PRkZTRVQpICYgUF9UU19USU0pIHsKLQlvdXRiKCBQX1RTX0NULCBpbnN0YW5jZS0+aW9fcG9ydCArIFBfVElNRU9VVF9TVEFUVVNfUkVHX09GRlNFVCk7Ci0JcHJpbnRrKCJzY3NpJWQgOiB3YXRjaGRvZyB0aW1lciBmaXJlZCBpbiBOQ1I1MzgwX3ByZWFkKClcbiIsCi0JICAgIGluc3RhbmNlLT5ob3N0X25vKTsKLQlyZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKgotICogRnVuY3Rpb24gOiBpbnQgcGFzMTZfcHdyaXRlIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwKLSAqCXVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKLSAqCi0gKiBQdXJwb3NlIDogRmFzdCA1MzgwIHBzZXVkby1kbWEgd3JpdGUgZnVuY3Rpb24sIHRyYW5zZmVycyBsZW4gYnl0ZXMgZnJvbQotICoJc3JjCi0gKiAKLSAqIElucHV0cyA6IHNyYyA9IHNvdXJjZSwgbGVuID0gbGVuZ3RoIGluIGJ5dGVzCi0gKgotICogUmV0dXJucyA6IDAgb24gc3VjY2Vzcywgbm9uIHplcm8gb24gYSBmYWlsdXJlIHN1Y2ggYXMgYSB3YXRjaGRvZyAKLSAqIAl0aW1lb3V0LgotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHBhczE2X3B3cml0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBsZW4pCi17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqcyA9IHNyYzsKLSAgICByZWdpc3RlciB1bnNpZ25lZCBzaG9ydCByZWcgPSAoaW5zdGFuY2UtPmlvX3BvcnQgKyBQX0RBVEFfUkVHX09GRlNFVCk7Ci0gICAgcmVnaXN0ZXIgaW50IGkgPSBsZW47Ci0gICAgaW50IGlpID0gMDsKLQotICAgIHdoaWxlICggISgoaW5iKGluc3RhbmNlLT5pb19wb3J0ICsgUF9TVEFUVVNfUkVHX09GRlNFVCkpICYgUF9TVF9SRFkpICkKLQkgKytpaTsKLSAKLSAgICBvdXRzYiggcmVnLCBzLCBpICk7Ci0KLSAgICBpZiAoaW5iKGluc3RhbmNlLT5pb19wb3J0ICsgUF9USU1FT1VUX1NUQVRVU19SRUdfT0ZGU0VUKSAmIFBfVFNfVElNKSB7Ci0Jb3V0YiggUF9UU19DVCwgaW5zdGFuY2UtPmlvX3BvcnQgKyBQX1RJTUVPVVRfU1RBVFVTX1JFR19PRkZTRVQpOwotCXByaW50aygic2NzaSVkIDogd2F0Y2hkb2cgdGltZXIgZmlyZWQgaW4gTkNSNTM4MF9wd3JpdGUoKVxuIiwKLQkgICAgaW5zdGFuY2UtPmhvc3Rfbm8pOwotCXJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNpbmNsdWRlICJOQ1I1MzgwLmMiCi0KLXN0YXRpYyBpbnQgcGFzMTZfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKLXsKLQlpZiAoc2hvc3QtPmlycSAhPSBOT19JUlEpCi0JCWZyZWVfaXJxKHNob3N0LT5pcnEsIHNob3N0KTsKLQlOQ1I1MzgwX2V4aXQoc2hvc3QpOwotCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKLQkubmFtZQkJCT0gIlBybyBBdWRpbyBTcGVjdHJ1bS0xNiBTQ1NJIiwKLQkuZGV0ZWN0CQkJPSBwYXMxNl9kZXRlY3QsCi0JLnJlbGVhc2UJCT0gcGFzMTZfcmVsZWFzZSwKLQkucHJvY19uYW1lCQk9ICJwYXMxNiIsCi0JLmluZm8JCQk9IHBhczE2X2luZm8sCi0JLnF1ZXVlY29tbWFuZAkJPSBwYXMxNl9xdWV1ZV9jb21tYW5kLAotCS5laF9hYm9ydF9oYW5kbGVyCT0gcGFzMTZfYWJvcnQsCi0JLmVoX2J1c19yZXNldF9oYW5kbGVyCT0gcGFzMTZfYnVzX3Jlc2V0LAotCS5iaW9zX3BhcmFtCQk9IHBhczE2X2Jpb3NwYXJhbSwKLQkuY2FuX3F1ZXVlCQk9IDMyLAotCS50aGlzX2lkCQk9IDcsCi0JLnNnX3RhYmxlc2l6ZQkJPSBTR19BTEwsCi0JLmNtZF9wZXJfbHVuCQk9IDIsCi0JLnVzZV9jbHVzdGVyaW5nCQk9IERJU0FCTEVfQ0xVU1RFUklORywKLQkuY21kX3NpemUJCT0gTkNSNTM4MF9DTURfU0laRSwKLQkubWF4X3NlY3RvcnMJCT0gMTI4LAotfTsKLSNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgotCi0jaWZkZWYgTU9EVUxFCi1tb2R1bGVfcGFyYW0ocGFzMTZfYWRkciwgdXNob3J0LCAwKTsKLW1vZHVsZV9wYXJhbShwYXMxNl9pcnEsIGludCwgMCk7Ci0jZW5kaWYKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wYXMxNi5oIGIvZHJpdmVycy9zY3NpL3BhczE2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTdmMzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zY3NpL3BhczE2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIFRoaXMgZHJpdmVyIGFkYXB0ZWQgZnJvbSBEcmV3IEVja2hhcmR0J3MgVHJhbnRvciBUMTI4IGRyaXZlcgotICoKLSAqIENvcHlyaWdodCAxOTkzLCBEcmV3IEVja2hhcmR0Ci0gKglWaXNpb25hcnkgQ29tcHV0aW5nCi0gKgkoVW5peCBhbmQgTGludXggY29uc3VsdGluZyBhbmQgY3VzdG9tIHByb2dyYW1taW5nKQotICoJZHJld0Bjb2xvcmFkby5lZHUKLSAqICAgICAgKzEgKDMwMykgNjY2LTU4MzYKLSAqCi0gKiAgKCBCYXNlZCBvbiBUMTI4IC0gRElTVFJJQlVUSU9OIFJFTEVBU0UgMy4gKSAKLSAqCi0gKiBNb2RpZmllZCB0byB3b3JrIHdpdGggdGhlIFBybyBBdWRpbyBTcGVjdHJ1bS9TdHVkaW8gMTYKLSAqIGJ5IEpvaG4gV2VpZG1hbi4KLSAqCi0gKgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IAotICoKLSAqIE1lZGlhIFZpc2lvbgotICogKDUxMCkgNzcwLTg2MDAKLSAqICg4MDApIDM0OC03MTE2Ci0gKi8KLQotCi0jaWZuZGVmIFBBUzE2X0gKLSNkZWZpbmUgUEFTMTZfSAotCi0jZGVmaW5lIFBBUzE2X0RFRkFVTFRfQkFTRV8xICAweDM4OAotI2RlZmluZSBQQVMxNl9ERUZBVUxUX0JBU0VfMiAgMHgzODQKLSNkZWZpbmUgUEFTMTZfREVGQVVMVF9CQVNFXzMgIDB4MzhjCi0jZGVmaW5lIFBBUzE2X0RFRkFVTFRfQkFTRV80ICAweDI4OAotCi0jZGVmaW5lIFBBUzE2X0RFRkFVTFRfQk9BUkRfMV9JUlEgMTAKLSNkZWZpbmUgUEFTMTZfREVGQVVMVF9CT0FSRF8yX0lSUSAxMgotI2RlZmluZSBQQVMxNl9ERUZBVUxUX0JPQVJEXzNfSVJRIDE0Ci0jZGVmaW5lIFBBUzE2X0RFRkFVTFRfQk9BUkRfNF9JUlEgMTUKLQotCi0vKgotICogVGhlIFBybyBBdWRpbyBTcGVjdHJ1bSBib2FyZHMgYXJlIEkvTyBtYXBwZWQuIFRoZXkgdXNlIGEgWmlsb2cgNTM4MAotICogU0NTSSBjb250cm9sbGVyLCB3aGljaCBpcyB0aGUgZXF1aXZhbGVudCBvZiBOQ1IncyA1MzgwLiAgIlBzZXVkby1ETUEiCi0gKiBhcmNoaXRlY3R1cmUgaXMgdXNlZCwgd2hlcmUgYSBQQUwgZHJpdmVzIHRoZSBETUEgc2lnbmFscyBvbiB0aGUgNTM4MAotICogYWxsb3dpbmcgZmFzdCwgYmxpbmQgdHJhbnNmZXJzIHdpdGggcHJvcGVyIGhhbmRzaGFraW5nLiAKLSAqLwotCi0KLS8qIFRoZSBUaW1lLW91dCBDb3VudGVyIHJlZ2lzdGVyIGlzIHVzZWQgdG8gc2FmZS1ndWFyZCBhZ2FpbnN0IGEgc3R1Y2sKLSAqIGJ1cyAoaW4gdGhlIGNhc2Ugb2YgUkRZIGRyaXZlbiBoYW5kc2hha2UpIG9yIGEgc3R1Y2sgYnl0ZSAoaWYgMTYtQml0Ci0gKiBETUEgY29udmVyc2lvbiBpcyB1c2VkKS4gIFRoZSBjb3VudGVyIHVzZXMgYSAyOC4yMjRNSHogY2xvY2sKLSAqIGRpdmlkZWQgYnkgMTQgYXMgaXRzIGNsb2NrIHNvdXJjZS4gIEluIHRoZSBjYXNlIG9mIGEgc3R1Y2sgYnl0ZSBpbgotICogdGhlIGhvbGRpbmcgcmVnaXN0ZXIsIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgKGFuZCBtaXhlZCB3aXRoIHRoZQotICogb25lIHdpdGggdGhlIGRyaXZlKSB1c2luZyB0aGUgQ0QtUk9NIGludGVycnVwdCBwb2ludGVyLgotICovCi0gCi0jZGVmaW5lIFBfVElNRU9VVF9DT1VOVEVSX1JFRwkweDQwMDAKLSNkZWZpbmUgUF9UQ19ESVNBQkxFCTB4ODAJLyogU2V0IHRvIDAgdG8gZW5hYmxlIHRpbWVvdXQgaW50LiAqLwotCQkJCS8qIEJpdHMgRDYtRDAgY29udGFpbiB0aW1lb3V0IGNvdW50ICovCi0KLQotI2RlZmluZSBQX1RJTUVPVVRfU1RBVFVTX1JFR19PRkZTRVQJMHg0MDAxCi0jZGVmaW5lIFBfVFNfVElNCQkweDgwCS8qIGNoZWNrIHRpbWVvdXQgc3RhdHVzICovCi0JCQkJCS8qIEJpdHMgRDYtRDQgTi9VICovCi0jZGVmaW5lIFBfVFNfQVJNX0RSUV9JTlQJMHgwOAkvKiBBcm0gRFJRIEludC4gIFdoZW4gc2V0IGhpZ2gsCi0JCQkJCSAqIHRoZSBuZXh0IHJpc2luZyBlZGdlIHdpbGwKLQkJCQkJICogY2F1c2UgYSBDRC1ST00gaW50ZXJydXB0LgotCQkJCQkgKiBXaGVuIHNldCBsb3csIHRoZSBpbnRlcnJ1cHQKLQkJCQkJICogd2lsbCBiZSBjbGVhcmVkLiAgVGhlcmUgaXMKLQkJCQkJICogbm8gc3RhdHVzIGF2YWlsYWJsZSBmb3IKLQkJCQkJICogdGhpcyBpbnRlcnJ1cHQuCi0JCQkJCSAqLwotI2RlZmluZSBQX1RTX0VOQUJMRV9UT19FUlJfSU5URVJSVVBUCS8qIEVuYWJsZSB0aW1lb3V0IGVycm9yIGludC4gKi8KLSNkZWZpbmUgUF9UU19FTkFCTEVfV0FJVAkJLyogRW5hYmxlIFdhaXQgKi8KLQotI2RlZmluZSBQX1RTX0NUCQkJMHgwMQkvKiBjbGVhciB0aW1lb3V0LiBOb3RlOiB3cml0aW5nCi0JCQkJCSAqIHRvIHRoaXMgcmVnaXN0ZXIgY2xlYXJzIHRoZQotCQkJCQkgKiB0aW1lb3V0IGVycm9yIGludC4gb3Igc3RhdHVzCi0JCQkJCSAqLwotCi0KLS8qCi0gKiBUaGUgZGF0YSByZWdpc3RlciByZWFkcy93cml0ZXMgdG8vZnJvbSB0aGUgNTM4MCBpbiBwc2V1ZG8tRE1BIG1vZGUKLSAqLyAKLQotI2RlZmluZSBQX0RBVEFfUkVHX09GRlNFVAkweDVjMDAJLyogcncgKi8KLQotI2RlZmluZSBQX1NUQVRVU19SRUdfT0ZGU0VUCTB4NWMwMQkvKiBybyAqLwotI2RlZmluZSBQX1NUX1JEWQkJMHg4MAkvKiA1MzgwIEREUlEgU3RhdHVzICovCi0KLSNkZWZpbmUgUF9JUlFfU1RBVFVTCQkweDVjMDMKLSNkZWZpbmUgUF9JU19JUlEJCTB4ODAJLyogRElSUSBzdGF0dXMgKi8KLQotI2RlZmluZSBQQ0JfQ09ORklHIDB4ODAzCi0jZGVmaW5lIE1BU1RFUl9BRERSRVNTX1BUUiAweDlhMDEgIC8qIEZpeGVkIHBvc2l0aW9uIC0gbm8gcmVsbyAqLwotI2RlZmluZSBTWVNfQ09ORklHXzQgMHg4MDAzCi0jZGVmaW5lIFdBSVRfU1RBVEUgMHhiYzAwCi0jZGVmaW5lIE9QRVJBVElPTl9NT0RFXzEgMHhlYzAzCi0jZGVmaW5lIElPX0NPTkZJR18zIDB4ZjAwMgotCi0jZGVmaW5lIE5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzIC8qIG5vbmUgKi8KLQotI2RlZmluZSBQQVMxNl9pb19wb3J0KHJlZykgKGluc3RhbmNlLT5pb19wb3J0ICsgcGFzMTZfb2Zmc2V0WyhyZWcpXSkKLQotI2RlZmluZSBOQ1I1MzgwX3JlYWQocmVnKSAoIGluYihQQVMxNl9pb19wb3J0KHJlZykpICkKLSNkZWZpbmUgTkNSNTM4MF93cml0ZShyZWcsIHZhbHVlKSAoIG91dGIoKHZhbHVlKSxQQVMxNl9pb19wb3J0KHJlZykpICkKLQotI2RlZmluZSBOQ1I1MzgwX2RtYV94ZmVyX2xlbihpbnN0YW5jZSwgY21kLCBwaGFzZSkJKGNtZC0+dHJhbnNmZXJzaXplKQotI2RlZmluZSBOQ1I1MzgwX2RtYV9yZWN2X3NldHVwCQlwYXMxNl9wcmVhZAotI2RlZmluZSBOQ1I1MzgwX2RtYV9zZW5kX3NldHVwCQlwYXMxNl9wd3JpdGUKLSNkZWZpbmUgTkNSNTM4MF9kbWFfcmVzaWR1YWwoaW5zdGFuY2UpCSgwKQotCi0jZGVmaW5lIE5DUjUzODBfaW50ciBwYXMxNl9pbnRyCi0jZGVmaW5lIE5DUjUzODBfcXVldWVfY29tbWFuZCBwYXMxNl9xdWV1ZV9jb21tYW5kCi0jZGVmaW5lIE5DUjUzODBfYWJvcnQgcGFzMTZfYWJvcnQKLSNkZWZpbmUgTkNSNTM4MF9idXNfcmVzZXQgcGFzMTZfYnVzX3Jlc2V0Ci0jZGVmaW5lIE5DUjUzODBfaW5mbyBwYXMxNl9pbmZvCi0KLS8qIDE1IDE0IDEyIDEwIDcgNSAzIAotICAgMTEwMSAwMTAwIDEwMTAgMTAwMCAqLwotICAgCi0jZGVmaW5lIFBBUzE2X0lSUVMgMHhkNGE4IAotCi0jZW5kaWYgLyogUEFTMTZfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfaHdpLmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYwppbmRleCAwNGU2N2ExLi4xMDU0NmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYworKysgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9od2kuYwpAQCAtNDQ5Miw4ICs0NDkyLDggQEAKICAqIEBudW06IHRoZSBpbmJvdW5kIHF1ZXVlIG51bWJlcgogICogQHBoeV9pZDogdGhlIHBoeSBpZCB3aGljaCB3ZSB3YW50ZWQgdG8gc3RhcnQgdXAuCiAgKi8KLWludCBwbTgwMDFfY2hpcF9waHlfc3RvcF9yZXEoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhLAotCXU4IHBoeV9pZCkKK3N0YXRpYyBpbnQgcG04MDAxX2NoaXBfcGh5X3N0b3BfcmVxKHN0cnVjdCBwbTgwMDFfaGJhX2luZm8gKnBtODAwMV9oYSwKKwkJCQkgICAgdTggcGh5X2lkKQogewogCXN0cnVjdCBwaHlfc3RvcF9yZXEgcGF5bG9hZDsKIAlzdHJ1Y3QgaW5ib3VuZF9xdWV1ZV90YWJsZSAqY2lyY3VsYXJROwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3BtODAwMS9wbTgwMDFfc2FzLmMgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYwppbmRleCBkYzMzZGZhLi5jZTU4NGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYworKysgYi9kcml2ZXJzL3Njc2kvcG04MDAxL3BtODAwMV9zYXMuYwpAQCAtNTI3LDcgKzUyNyw3IEBACiAgICogcG04MDAxX2FsbG9jX2RldiAtIGZpbmQgYSBlbXB0eSBwbTgwMDFfZGV2aWNlCiAgICogQHBtODAwMV9oYTogb3VyIGhiYSBjYXJkIGluZm9ybWF0aW9uCiAgICovCi1zdHJ1Y3QgcG04MDAxX2RldmljZSAqcG04MDAxX2FsbG9jX2RldihzdHJ1Y3QgcG04MDAxX2hiYV9pbmZvICpwbTgwMDFfaGEpCitzdGF0aWMgc3RydWN0IHBtODAwMV9kZXZpY2UgKnBtODAwMV9hbGxvY19kZXYoc3RydWN0IHBtODAwMV9oYmFfaW5mbyAqcG04MDAxX2hhKQogewogCXUzMiBkZXY7CiAJZm9yIChkZXYgPSAwOyBkZXYgPCBQTTgwMDFfTUFYX0RFVklDRVM7IGRldisrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcG1jcmFpZC5jIGIvZHJpdmVycy9zY3NpL3BtY3JhaWQuYwppbmRleCBiMmE4ODIwLi42OGE1YzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcG1jcmFpZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMKQEAgLTMwNiw3ICszMDYsNyBAQAogICogUmV0dXJuIFZhbHVlCiAgKgkgTm9uZQogICovCi12b2lkIHBtY3JhaWRfaW5pdF9jbWRibGsoc3RydWN0IHBtY3JhaWRfY21kICpjbWQsIGludCBpbmRleCkKK3N0YXRpYyB2b2lkIHBtY3JhaWRfaW5pdF9jbWRibGsoc3RydWN0IHBtY3JhaWRfY21kICpjbWQsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgcG1jcmFpZF9pb2FyY2IgKmlvYXJjYiA9ICYoY21kLT5pb2FfY2ItPmlvYXJjYik7CiAJZG1hX2FkZHJfdCBkbWFfYWRkciA9IGNtZC0+aW9hX2NiX2J1c19hZGRyOwpAQCAtNDAxLDcgKzQwMSw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKglub3RoaW5nCiAgKi8KLXZvaWQgcG1jcmFpZF9yZXR1cm5fY21kKHN0cnVjdCBwbWNyYWlkX2NtZCAqY21kKQorc3RhdGljIHZvaWQgcG1jcmFpZF9yZXR1cm5fY21kKHN0cnVjdCBwbWNyYWlkX2NtZCAqY21kKQogewogCXN0cnVjdCBwbWNyYWlkX2luc3RhbmNlICpwaW5zdGFuY2UgPSBjbWQtPmRydl9pbnN0OwogCXVuc2lnbmVkIGxvbmcgbG9ja19mbGFnczsKQEAgLTE3MTAsNyArMTcxMCw3IEBACiAgKiBAaW9hc2M6IGlvYXNjIGNvZGUKICAqIEBjbWQ6IHBvaW50ZXIgdG8gY29tbWFuZCB0aGF0IHJlc3VsdGVkIGluICdpb2FzYycKICAqLwotdm9pZCBwbWNyYWlkX2lvYXNjX2xvZ2dlcih1MzIgaW9hc2MsIHN0cnVjdCBwbWNyYWlkX2NtZCAqY21kKQorc3RhdGljIHZvaWQgcG1jcmFpZF9pb2FzY19sb2dnZXIodTMyIGlvYXNjLCBzdHJ1Y3QgcG1jcmFpZF9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3QgcG1jcmFpZF9pb2FzY19lcnJvciAqZXJyb3JfaW5mbyA9IHBtY3JhaWRfZ2V0X2Vycm9yX2luZm8oaW9hc2MpOwogCkBAIC0zMTM3LDcgKzMxMzcsNyBAQAogICogICByZXR1cm5zIHBvaW50ZXIgcG1jcmFpZF9pb2FkbF9kZXNjLCBpbml0aWFsaXplZCB0byBwb2ludCB0byBpbnRlcm5hbAogICogICBvciBleHRlcm5hbCBJT0FETHMKICAqLwotc3RydWN0IHBtY3JhaWRfaW9hZGxfZGVzYyAqCitzdGF0aWMgc3RydWN0IHBtY3JhaWRfaW9hZGxfZGVzYyAqCiBwbWNyYWlkX2luaXRfaW9hZGxzKHN0cnVjdCBwbWNyYWlkX2NtZCAqY21kLCBpbnQgc2djb3VudCkKIHsKIAlzdHJ1Y3QgcG1jcmFpZF9pb2FkbF9kZXNjICppb2FkbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZWYuaAppbmRleCBhZTRhNzQ3Li43M2IxMmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RlZi5oCkBAIC0yNzksMTYgKzI3OSw2IEBACiBzdHJ1Y3QgcWxhX3RndF9zZXNzOwogCiAvKgotICogKHNkLmggaXMgbm90IGV4cG9ydGVkLCBoZW5jZSBsb2NhbCBpbmNsdXNpb24pCi0gKiBEYXRhIEludGVncml0eSBGaWVsZCB0dXBsZS4KLSAqLwotc3RydWN0IHNkX2RpZl90dXBsZSB7Ci0JX19iZTE2IGd1YXJkX3RhZzsJLyogQ2hlY2tzdW0gKi8KLQlfX2JlMTYgYXBwX3RhZzsJCS8qIE9wYXF1ZSBzdG9yYWdlICovCi0JX19iZTMyIHJlZl90YWc7CQkvKiBUYXJnZXQgTEJBIG9yIGluZGlyZWN0IExCQSAqLwotfTsKLQotLyoKICAqIFNDU0kgUmVxdWVzdCBCbG9jawogICovCiBzdHJ1Y3Qgc3JiX2NtZCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKaW5kZXggOTg3ZjFjNy4uMDY4YzRlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpAQCAtMTgyOCw3ICsxODI4LDcgQEAKIAkJaWYgKHNjc2lfcHJvdF9zZ19jb3VudChjbWQpKSB7CiAJCQl1aW50MzJfdCBpLCBqID0gMCwgayA9IDAsIG51bV9lbnQ7CiAJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCQkJc3RydWN0IHNkX2RpZl90dXBsZSAqc3B0OworCQkJc3RydWN0IHQxMF9waV90dXBsZSAqc3B0OwogCiAJCQkvKiBQYXRjaCB0aGUgY29ycmVzcG9uZGluZyBwcm90ZWN0aW9uIHRhZ3MgKi8KIAkJCXNjc2lfZm9yX2VhY2hfcHJvdF9zZyhjbWQsIHNnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCAyNjc0ZjRjLi5hY2U2NWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtODk5LDEyICs4OTksMTIgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzY3NpX3FsYV9ob3N0X3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAotCXdoaWxlICgoKHFsYTJ4MDBfcmVzZXRfYWN0aXZlKHZoYSkpIHx8IGhhLT5kcGNfYWN0aXZlIHx8Ci0JICAgIGhhLT5mbGFncy5tYm94X2J1c3kpIHx8Ci0JCXRlc3RfYml0KEZYMDBfUkVTRVRfUkVDT1ZFUlksICZ2aGEtPmRwY19mbGFncykgfHwKLQkJdGVzdF9iaXQoRlgwMF9UQVJHRVRfU0NBTiwgJnZoYS0+ZHBjX2ZsYWdzKSkgewotCQkJaWYgKHRlc3RfYml0KFVOTE9BRElORywgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpKQotCQkJCWJyZWFrOworCXdoaWxlICgocWxhMngwMF9yZXNldF9hY3RpdmUodmhhKSB8fCBoYS0+ZHBjX2FjdGl2ZSB8fAorCQloYS0+ZmxhZ3MubWJveF9idXN5KSB8fAorCSAgICAgICB0ZXN0X2JpdChGWDAwX1JFU0VUX1JFQ09WRVJZLCAmdmhhLT5kcGNfZmxhZ3MpIHx8CisJICAgICAgIHRlc3RfYml0KEZYMDBfVEFSR0VUX1NDQU4sICZ2aGEtPmRwY19mbGFncykpIHsKKwkJaWYgKHRlc3RfYml0KFVOTE9BRElORywgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpKQorCQkJYnJlYWs7CiAJCW1zbGVlcCgxMDAwKTsKIAl9CiB9CkBAIC00Njk0LDcgKzQ2OTQsNyBAQAogCQkJcWxhODN4eF93YWl0X2xvZ2ljKCk7CiAJCQlyZXRyeSsrOwogCQkJcWxfZGJnKHFsX2RiZ19wM3AsIGJhc2VfdmhhLCAweGIwNjQsCi0JCQkgICAgIkZhaWxlZCB0byByZWxlYXNlIElEQyBsb2NrLCByZXR5cmluZz0lZFxuIiwgcmV0cnkpOworCQkJICAgICJGYWlsZWQgdG8gcmVsZWFzZSBJREMgbG9jaywgcmV0cnlpbmc9JWRcbiIsIHJldHJ5KTsKIAkJCWdvdG8gcmV0cnlfdW5sb2NrOwogCQl9CiAJfSBlbHNlIGlmIChyZXRyeSA8IDEwKSB7CkBAIC00NzAyLDcgKzQ3MDIsNyBAQAogCQlxbGE4M3h4X3dhaXRfbG9naWMoKTsKIAkJcmV0cnkrKzsKIAkJcWxfZGJnKHFsX2RiZ19wM3AsIGJhc2VfdmhhLCAweGIwNjUsCi0JCSAgICAiRmFpbGVkIHRvIHJlYWQgZHJ2LWxvY2tpZCwgcmV0eXJpbmc9JWRcbiIsIHJldHJ5KTsKKwkJICAgICJGYWlsZWQgdG8gcmVhZCBkcnYtbG9ja2lkLCByZXRyeWluZz0lZFxuIiwgcmV0cnkpOwogCQlnb3RvIHJldHJ5X3VubG9jazsKIAl9CiAKQEAgLTQ3MTgsNyArNDcxOCw3IEBACiAJCQlxbGE4M3h4X3dhaXRfbG9naWMoKTsKIAkJCXJldHJ5Kys7CiAJCQlxbF9kYmcocWxfZGJnX3AzcCwgYmFzZV92aGEsIDB4YjA2NiwKLQkJCSAgICAiRmFpbGVkIHRvIHJlbGVhc2UgSURDIGxvY2ssIHJldHlyaW5nPSVkXG4iLCByZXRyeSk7CisJCQkgICAgIkZhaWxlZCB0byByZWxlYXNlIElEQyBsb2NrLCByZXRyeWluZz0lZFxuIiwgcmV0cnkpOwogCQkJZ290byByZXRyeV91bmxvY2syOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X254LmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYwppbmRleCBhZTg3ZDZjLi4wNmRkZDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbnguYwpAQCAtMTg0Myw3ICsxODQzLDcgQEAKIAlyZXR1cm4gcnZhbDsKIH0KIAotdWludDMyX3QgcWw0Xzg0eHhfaXBtZGlvX3JkX3JlZyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGFkZHIxLAorc3RhdGljIHVpbnQzMl90IHFsNF84NHh4X2lwbWRpb19yZF9yZWcoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBhZGRyMSwKIAkJCQl1aW50MzJfdCBhZGRyMywgdWludDMyX3QgbWFzaywgdWludDMyX3QgYWRkciwKIAkJCQl1aW50MzJfdCAqZGF0YV9wdHIpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaS5jIGIvZHJpdmVycy9zY3NpL3Njc2kuYwppbmRleCAxZjM2YWNhLi4xZGViNmFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKQEAgLTExNjAsNyArMTE2MCw2IEBACiBib29sIHNjc2lfdXNlX2Jsa19tcSA9IGZhbHNlOwogI2VuZGlmCiBtb2R1bGVfcGFyYW1fbmFtZWQodXNlX2Jsa19tcSwgc2NzaV91c2VfYmxrX21xLCBib29sLCBTX0lXVVNSIHwgU19JUlVHTyk7Ci1FWFBPUlRfU1lNQk9MX0dQTChzY3NpX3VzZV9ibGtfbXEpOwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3Njc2kodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9kZWJ1Zy5jCmluZGV4IDZhMjE5YTAuLmM5MDU3MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZGVidWcuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC91dWlkLmg+CisjaW5jbHVkZSA8bGludXgvdDEwLXBpLmg+CiAKICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KIApAQCAtNjI3LDcgKzYyOCw3IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNkZWJ1Z19ob3N0X2xpc3RfbG9jayk7CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICpmYWtlX3N0b3JlcDsJLyogcmFtZGlzayBzdG9yYWdlICovCi1zdGF0aWMgc3RydWN0IHNkX2RpZl90dXBsZSAqZGlmX3N0b3JlcDsJLyogcHJvdGVjdGlvbiBpbmZvICovCitzdGF0aWMgc3RydWN0IHQxMF9waV90dXBsZSAqZGlmX3N0b3JlcDsJLyogcHJvdGVjdGlvbiBpbmZvICovCiBzdGF0aWMgdm9pZCAqbWFwX3N0b3JlcDsJCS8qIHByb3Zpc2lvbmluZyBtYXAgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFwX3NpemU7CkBAIC02ODIsNyArNjgzLDcgQEAKIAlyZXR1cm4gZmFrZV9zdG9yZXAgKyBsYmEgKiBzZGVidWdfc2VjdG9yX3NpemU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2RfZGlmX3R1cGxlICpkaWZfc3RvcmUoc2VjdG9yX3Qgc2VjdG9yKQorc3RhdGljIHN0cnVjdCB0MTBfcGlfdHVwbGUgKmRpZl9zdG9yZShzZWN0b3JfdCBzZWN0b3IpCiB7CiAJc2VjdG9yID0gc2VjdG9yX2RpdihzZWN0b3IsIHNkZWJ1Z19zdG9yZV9zZWN0b3JzKTsKIApAQCAtMTM0OSw3ICsxMzUwLDcgQEAKIAkJfSBlbHNlIGlmICgweDg2ID09IGNtZFsyXSkgeyAvKiBleHRlbmRlZCBpbnF1aXJ5ICovCiAJCQlhcnJbMV0gPSBjbWRbMl07CS8qc2FuaXR5ICovCiAJCQlhcnJbM10gPSAweDNjOwkvKiBudW1iZXIgb2YgZm9sbG93aW5nIGVudHJpZXMgKi8KLQkJCWlmIChzZGVidWdfZGlmID09IFNEX0RJRl9UWVBFM19QUk9URUNUSU9OKQorCQkJaWYgKHNkZWJ1Z19kaWYgPT0gVDEwX1BJX1RZUEUzX1BST1RFQ1RJT04pCiAJCQkJYXJyWzRdID0gMHg0OwkvKiBTUFQ6IEdSRF9DSEs6MSAqLwogCQkJZWxzZSBpZiAoaGF2ZV9kaWZfcHJvdCkKIAkJCQlhcnJbNF0gPSAweDU7ICAgLyogU1BUOiBHUkRfQ0hLOjEsIFJFRl9DSEs6MSAqLwpAQCAtMjQzMCw3ICsyNDMxLDcgQEAKIAlyZXR1cm4gY3N1bTsKIH0KIAotc3RhdGljIGludCBkaWZfdmVyaWZ5KHN0cnVjdCBzZF9kaWZfdHVwbGUgKnNkdCwgY29uc3Qgdm9pZCAqZGF0YSwKK3N0YXRpYyBpbnQgZGlmX3ZlcmlmeShzdHJ1Y3QgdDEwX3BpX3R1cGxlICpzZHQsIGNvbnN0IHZvaWQgKmRhdGEsCiAJCSAgICAgIHNlY3Rvcl90IHNlY3RvciwgdTMyIGVpX2xiYSkKIHsKIAlfX2JlMTYgY3N1bSA9IGRpZl9jb21wdXRlX2NzdW0oZGF0YSwgc2RlYnVnX3NlY3Rvcl9zaXplKTsKQEAgLTI0NDIsMTMgKzI0NDMsMTMgQEAKIAkJCWJlMTZfdG9fY3B1KGNzdW0pKTsKIAkJcmV0dXJuIDB4MDE7CiAJfQotCWlmIChzZGVidWdfZGlmID09IFNEX0RJRl9UWVBFMV9QUk9URUNUSU9OICYmCisJaWYgKHNkZWJ1Z19kaWYgPT0gVDEwX1BJX1RZUEUxX1BST1RFQ1RJT04gJiYKIAkgICAgYmUzMl90b19jcHUoc2R0LT5yZWZfdGFnKSAhPSAoc2VjdG9yICYgMHhmZmZmZmZmZikpIHsKIAkJcHJfZXJyKCJSRUYgY2hlY2sgZmFpbGVkIG9uIHNlY3RvciAlbHVcbiIsCiAJCQkodW5zaWduZWQgbG9uZylzZWN0b3IpOwogCQlyZXR1cm4gMHgwMzsKIAl9Ci0JaWYgKHNkZWJ1Z19kaWYgPT0gU0RfRElGX1RZUEUyX1BST1RFQ1RJT04gJiYKKwlpZiAoc2RlYnVnX2RpZiA9PSBUMTBfUElfVFlQRTJfUFJPVEVDVElPTiAmJgogCSAgICBiZTMyX3RvX2NwdShzZHQtPnJlZl90YWcpICE9IGVpX2xiYSkgewogCQlwcl9lcnIoIlJFRiBjaGVjayBmYWlsZWQgb24gc2VjdG9yICVsdVxuIiwKIAkJCSh1bnNpZ25lZCBsb25nKXNlY3Rvcik7CkBAIC0yNTA0LDcgKzI1MDUsNyBAQAogCQkJICAgIHVuc2lnbmVkIGludCBzZWN0b3JzLCB1MzIgZWlfbGJhKQogewogCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBzZF9kaWZfdHVwbGUgKnNkdDsKKwlzdHJ1Y3QgdDEwX3BpX3R1cGxlICpzZHQ7CiAJc2VjdG9yX3Qgc2VjdG9yOwogCiAJZm9yIChpID0gMDsgaSA8IHNlY3RvcnM7IGkrKywgZWlfbGJhKyspIHsKQEAgLTI1ODAsMTMgKzI1ODEsMTMgQEAKIAkJYnJlYWs7CiAJfQogCWlmICh1bmxpa2VseShoYXZlX2RpZl9wcm90ICYmIGNoZWNrX3Byb3QpKSB7Ci0JCWlmIChzZGVidWdfZGlmID09IFNEX0RJRl9UWVBFMl9QUk9URUNUSU9OICYmCisJCWlmIChzZGVidWdfZGlmID09IFQxMF9QSV9UWVBFMl9QUk9URUNUSU9OICYmCiAJCSAgICAoY21kWzFdICYgMHhlMCkpIHsKIAkJCW1rX3NlbnNlX2ludmFsaWRfb3Bjb2RlKHNjcCk7CiAJCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKIAkJfQotCQlpZiAoKHNkZWJ1Z19kaWYgPT0gU0RfRElGX1RZUEUxX1BST1RFQ1RJT04gfHwKLQkJICAgICBzZGVidWdfZGlmID09IFNEX0RJRl9UWVBFM19QUk9URUNUSU9OKSAmJgorCQlpZiAoKHNkZWJ1Z19kaWYgPT0gVDEwX1BJX1RZUEUxX1BST1RFQ1RJT04gfHwKKwkJICAgICBzZGVidWdfZGlmID09IFQxMF9QSV9UWVBFM19QUk9URUNUSU9OKSAmJgogCQkgICAgKGNtZFsxXSAmIDB4ZTApID09IDApCiAJCQlzZGV2X3ByaW50ayhLRVJOX0VSUiwgc2NwLT5kZXZpY2UsICJVbnByb3RlY3RlZCBSRCAiCiAJCQkJICAgICJ0byBESUYgZGV2aWNlXG4iKTsKQEAgLTI2OTYsNyArMjY5Nyw3IEBACiAJCQkgICAgIHVuc2lnbmVkIGludCBzZWN0b3JzLCB1MzIgZWlfbGJhKQogewogCWludCByZXQ7Ci0Jc3RydWN0IHNkX2RpZl90dXBsZSAqc2R0OworCXN0cnVjdCB0MTBfcGlfdHVwbGUgKnNkdDsKIAl2b2lkICpkYWRkcjsKIAlzZWN0b3JfdCBzZWN0b3IgPSBzdGFydF9zZWM7CiAJaW50IHBwYWdlX29mZnNldDsKQEAgLTI3MjIsNyArMjcyMyw3IEBACiAJCX0KIAogCQlmb3IgKHBwYWdlX29mZnNldCA9IDA7IHBwYWdlX29mZnNldCA8IHBpdGVyLmxlbmd0aDsKLQkJICAgICBwcGFnZV9vZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBzZF9kaWZfdHVwbGUpKSB7CisJCSAgICAgcHBhZ2Vfb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgdDEwX3BpX3R1cGxlKSkgewogCQkJLyogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudAogCQkJICogZGF0YSBwYWdlIGFkdmFuY2UgdG8gdGhlIG5leHQgb25lCiAJCQkgKi8KQEAgLTI4OTMsMTMgKzI4OTQsMTMgQEAKIAkJYnJlYWs7CiAJfQogCWlmICh1bmxpa2VseShoYXZlX2RpZl9wcm90ICYmIGNoZWNrX3Byb3QpKSB7Ci0JCWlmIChzZGVidWdfZGlmID09IFNEX0RJRl9UWVBFMl9QUk9URUNUSU9OICYmCisJCWlmIChzZGVidWdfZGlmID09IFQxMF9QSV9UWVBFMl9QUk9URUNUSU9OICYmCiAJCSAgICAoY21kWzFdICYgMHhlMCkpIHsKIAkJCW1rX3NlbnNlX2ludmFsaWRfb3Bjb2RlKHNjcCk7CiAJCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKIAkJfQotCQlpZiAoKHNkZWJ1Z19kaWYgPT0gU0RfRElGX1RZUEUxX1BST1RFQ1RJT04gfHwKLQkJICAgICBzZGVidWdfZGlmID09IFNEX0RJRl9UWVBFM19QUk9URUNUSU9OKSAmJgorCQlpZiAoKHNkZWJ1Z19kaWYgPT0gVDEwX1BJX1RZUEUxX1BST1RFQ1RJT04gfHwKKwkJICAgICBzZGVidWdfZGlmID09IFQxMF9QSV9UWVBFM19QUk9URUNUSU9OKSAmJgogCQkgICAgKGNtZFsxXSAmIDB4ZTApID09IDApCiAJCQlzZGV2X3ByaW50ayhLRVJOX0VSUiwgc2NwLT5kZXZpY2UsICJVbnByb3RlY3RlZCBXUiAiCiAJCQkJICAgICJ0byBESUYgZGV2aWNlXG4iKTsKQEAgLTMxMzUsMTMgKzMxMzYsMTMgQEAKIAludW0gPSBjbWRbMTNdOwkJLyogMSB0byBhIG1heGltdW0gb2YgMjU1IGxvZ2ljYWwgYmxvY2tzICovCiAJaWYgKDAgPT0gbnVtKQogCQlyZXR1cm4gMDsJLyogZGVnZW5lcmF0ZSBjYXNlLCBub3QgYW4gZXJyb3IgKi8KLQlpZiAoc2RlYnVnX2RpZiA9PSBTRF9ESUZfVFlQRTJfUFJPVEVDVElPTiAmJgorCWlmIChzZGVidWdfZGlmID09IFQxMF9QSV9UWVBFMl9QUk9URUNUSU9OICYmCiAJICAgIChjbWRbMV0gJiAweGUwKSkgewogCQlta19zZW5zZV9pbnZhbGlkX29wY29kZShzY3ApOwogCQlyZXR1cm4gY2hlY2tfY29uZGl0aW9uX3Jlc3VsdDsKIAl9Ci0JaWYgKChzZGVidWdfZGlmID09IFNEX0RJRl9UWVBFMV9QUk9URUNUSU9OIHx8Ci0JICAgICBzZGVidWdfZGlmID09IFNEX0RJRl9UWVBFM19QUk9URUNUSU9OKSAmJgorCWlmICgoc2RlYnVnX2RpZiA9PSBUMTBfUElfVFlQRTFfUFJPVEVDVElPTiB8fAorCSAgICAgc2RlYnVnX2RpZiA9PSBUMTBfUElfVFlQRTNfUFJPVEVDVElPTikgJiYKIAkgICAgKGNtZFsxXSAmIDB4ZTApID09IDApCiAJCXNkZXZfcHJpbnRrKEtFUk5fRVJSLCBzY3AtPmRldmljZSwgIlVucHJvdGVjdGVkIFdSICIKIAkJCSAgICAidG8gRElGIGRldmljZVxuIik7CkBAIC00OTM5LDEyICs0OTQwLDExIEBACiAJfQogCiAJc3dpdGNoIChzZGVidWdfZGlmKSB7Ci0KLQljYXNlIFNEX0RJRl9UWVBFMF9QUk9URUNUSU9OOgorCWNhc2UgVDEwX1BJX1RZUEUwX1BST1RFQ1RJT046CiAJCWJyZWFrOwotCWNhc2UgU0RfRElGX1RZUEUxX1BST1RFQ1RJT046Ci0JY2FzZSBTRF9ESUZfVFlQRTJfUFJPVEVDVElPTjoKLQljYXNlIFNEX0RJRl9UWVBFM19QUk9URUNUSU9OOgorCWNhc2UgVDEwX1BJX1RZUEUxX1BST1RFQ1RJT046CisJY2FzZSBUMTBfUElfVFlQRTJfUFJPVEVDVElPTjoKKwljYXNlIFQxMF9QSV9UWVBFM19QUk9URUNUSU9OOgogCQloYXZlX2RpZl9wcm90ID0gdHJ1ZTsKIAkJYnJlYWs7CiAKQEAgLTUwMjYsNyArNTAyNiw3IEBACiAJaWYgKHNkZWJ1Z19kaXgpIHsKIAkJaW50IGRpZl9zaXplOwogCi0JCWRpZl9zaXplID0gc2RlYnVnX3N0b3JlX3NlY3RvcnMgKiBzaXplb2Yoc3RydWN0IHNkX2RpZl90dXBsZSk7CisJCWRpZl9zaXplID0gc2RlYnVnX3N0b3JlX3NlY3RvcnMgKiBzaXplb2Yoc3RydWN0IHQxMF9waV90dXBsZSk7CiAJCWRpZl9zdG9yZXAgPSB2bWFsbG9jKGRpZl9zaXplKTsKIAogCQlwcl9lcnIoImRpZl9zdG9yZXAgJXUgYnl0ZXMgQCAlcFxuIiwgZGlmX3NpemUsIGRpZl9zdG9yZXApOwpAQCAtNTQ4MCwxOSArNTQ4MCwxOSBAQAogCiAJc3dpdGNoIChzZGVidWdfZGlmKSB7CiAKLQljYXNlIFNEX0RJRl9UWVBFMV9QUk9URUNUSU9OOgorCWNhc2UgVDEwX1BJX1RZUEUxX1BST1RFQ1RJT046CiAJCWhwcm90ID0gU0hPU1RfRElGX1RZUEUxX1BST1RFQ1RJT047CiAJCWlmIChzZGVidWdfZGl4KQogCQkJaHByb3QgfD0gU0hPU1RfRElYX1RZUEUxX1BST1RFQ1RJT047CiAJCWJyZWFrOwogCi0JY2FzZSBTRF9ESUZfVFlQRTJfUFJPVEVDVElPTjoKKwljYXNlIFQxMF9QSV9UWVBFMl9QUk9URUNUSU9OOgogCQlocHJvdCA9IFNIT1NUX0RJRl9UWVBFMl9QUk9URUNUSU9OOwogCQlpZiAoc2RlYnVnX2RpeCkKIAkJCWhwcm90IHw9IFNIT1NUX0RJWF9UWVBFMl9QUk9URUNUSU9OOwogCQlicmVhazsKIAotCWNhc2UgU0RfRElGX1RZUEUzX1BST1RFQ1RJT046CisJY2FzZSBUMTBfUElfVFlQRTNfUFJPVEVDVElPTjoKIAkJaHByb3QgPSBTSE9TVF9ESUZfVFlQRTNfUFJPVEVDVElPTjsKIAkJaWYgKHNkZWJ1Z19kaXgpCiAJCQlocHJvdCB8PSBTSE9TVF9ESVhfVFlQRTNfUFJPVEVDVElPTjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2RldmluZm8uYwppbmRleCBlYWNjZDY1Li4yNDY0NTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9kZXZpbmZvLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZGV2aW5mby5jCkBAIC0yNDYsNiArMjQ2LDEwIEBACiAJeyJJQk0iLCAiVW5pdmVyc2FsIFhwb3J0IiwgIioiLCBCTElTVF9OT19VTERfQVRUQUNIfSwKIAl7IlNVTiIsICJVbml2ZXJzYWwgWHBvcnQiLCAiKiIsIEJMSVNUX05PX1VMRF9BVFRBQ0h9LAogCXsiREVMTCIsICJVbml2ZXJzYWwgWHBvcnQiLCAiKiIsIEJMSVNUX05PX1VMRF9BVFRBQ0h9LAorCXsiU1RLIiwgIlVuaXZlcnNhbCBYcG9ydCIsICIqIiwgQkxJU1RfTk9fVUxEX0FUVEFDSH0sCisJeyJORVRBUFAiLCAiVW5pdmVyc2FsIFhwb3J0IiwgIioiLCBCTElTVF9OT19VTERfQVRUQUNIfSwKKwl7IkxTSSIsICJVbml2ZXJzYWwgWHBvcnQiLCAiKiIsIEJMSVNUX05PX1VMRF9BVFRBQ0h9LAorCXsiRU5HRU5JTyIsICJVbml2ZXJzYWwgWHBvcnQiLCAiKiIsIEJMSVNUX05PX1VMRF9BVFRBQ0h9LAogCXsiU01TQyIsICJVU0IgMiBIUy1DRiIsIE5VTEwsIEJMSVNUX1NQQVJTRUxVTiB8IEJMSVNUX0lOUVVJUllfMzZ9LAogCXsiU09OWSIsICJDRC1ST00gQ0RVLTgwMDEiLCBOVUxMLCBCTElTVF9CT1JLRU59LAogCXsiU09OWSIsICJUU0wiLCBOVUxMLCBCTElTVF9GT1JDRUxVTn0sCQkvKiBERFMzICYgRERTNCBhdXRvbG9hZGVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oIGIvZHJpdmVycy9zY3NpL3Njc2lfcHJpdi5oCmluZGV4IDU3YTRiOTkuLjE5MzYzNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3ByaXYuaAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9wcml2LmgKQEAgLTI5LDYgKzI5LDcgQEAKIGV4dGVybiB2b2lkIHNjc2lfZXhpdF9ob3N0cyh2b2lkKTsKIAogLyogc2NzaS5jICovCitleHRlcm4gYm9vbCBzY3NpX3VzZV9ibGtfbXE7CiBleHRlcm4gaW50IHNjc2lfc2V0dXBfY29tbWFuZF9mcmVlbGlzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CiBleHRlcm4gdm9pZCBzY3NpX2Rlc3Ryb3lfY29tbWFuZF9mcmVlbGlzdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CiAjaWZkZWYgQ09ORklHX1NDU0lfTE9HR0lORwpAQCAtODUsMTIgKzg2LDE0IEBACiBleHRlcm4gdm9pZCBzY3NpX3F1ZXVlX2luc2VydChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIGludCByZWFzb24pOwogZXh0ZXJuIHZvaWQgc2NzaV9pb19jb21wbGV0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKiwgdW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIHNjc2lfcnVuX2hvc3RfcXVldWVzKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKK2V4dGVybiB2b2lkIHNjc2lfcmVxdWV1ZV9ydW5fcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIGV4dGVybiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqc2NzaV9hbGxvY19xdWV1ZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOwogZXh0ZXJuIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpzY3NpX21xX2FsbG9jX3F1ZXVlKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldik7CiBleHRlcm4gaW50IHNjc2lfbXFfc2V0dXBfdGFncyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CiBleHRlcm4gdm9pZCBzY3NpX21xX2Rlc3Ryb3lfdGFncyhzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CiBleHRlcm4gaW50IHNjc2lfaW5pdF9xdWV1ZSh2b2lkKTsKIGV4dGVybiB2b2lkIHNjc2lfZXhpdF9xdWV1ZSh2b2lkKTsKK2V4dGVybiB2b2lkIHNjc2lfZXZ0X3RocmVhZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogc3RydWN0IHJlcXVlc3RfcXVldWU7CiBzdHJ1Y3QgcmVxdWVzdDsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqc2NzaV9zZGJfY2FjaGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9zY2FuLmMKaW5kZXggZTBhNzhmNS4uMjEyZTk4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfc2Nhbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX3NjYW4uYwpAQCAtMjE3LDggKzIxNyw2IEBACiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OwogCWludCBkaXNwbGF5X2ZhaWx1cmVfbXNnID0gMSwgcmV0OwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gZGV2X3RvX3Nob3N0KHN0YXJnZXQtPmRldi5wYXJlbnQpOwotCWV4dGVybiB2b2lkIHNjc2lfZXZ0X3RocmVhZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotCWV4dGVybiB2b2lkIHNjc2lfcmVxdWV1ZV9ydW5fcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogCXNkZXYgPSBremFsbG9jKHNpemVvZigqc2RldikgKyBzaG9zdC0+dHJhbnNwb3J0dC0+ZGV2aWNlX3NpemUsCiAJCSAgICAgICBHRlBfQVRPTUlDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYwppbmRleCAzZjBmZjA3Li42MGI2NTFiZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKQEAgLTM0MSwyMiArMzQxLDYgQEAKIH0KIAogLyoqCi0gKiBpc19zYXNfYXR0YWNoZWQgLSBjaGVjayBpZiBkZXZpY2UgaXMgU0FTIGF0dGFjaGVkCi0gKiBAc2Rldjogc2NzaSBkZXZpY2UgdG8gY2hlY2sKLSAqCi0gKiByZXR1cm5zIHRydWUgaWYgdGhlIGRldmljZSBpcyBTQVMgYXR0YWNoZWQKLSAqLwotaW50IGlzX3Nhc19hdHRhY2hlZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCi17Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzZGV2LT5ob3N0OwotCi0JcmV0dXJuIHNob3N0LT50cmFuc3BvcnR0LT5ob3N0X2F0dHJzLmFjLmNsYXNzID09Ci0JCSZzYXNfaG9zdF9jbGFzcy5jbGFzczsKLX0KLUVYUE9SVF9TWU1CT0woaXNfc2FzX2F0dGFjaGVkKTsKLQotCi0vKioKICAqIHNhc19yZW1vdmVfY2hpbGRyZW4gIC0gIHRlYXIgZG93biBhIGRldmljZXMgU0FTIGRhdGEgc3RydWN0dXJlcwogICogQGRldjoJZGV2aWNlIGJlbG9uZ2luZyB0byB0aGUgc2FzIG9iamVjdAogICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZC5jIGIvZHJpdmVycy9zY3NpL3NkLmMKaW5kZXggZDNlODUyYS4uNTFlNTYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkLmMKKysrIGIvZHJpdmVycy9zY3NpL3NkLmMKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ByLmg+CisjaW5jbHVkZSA8bGludXgvdDEwLXBpLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKQEAgLTMxNCw3ICszMTUsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKLQlpZiAodmFsID49IDAgJiYgdmFsIDw9IFNEX0RJRl9UWVBFM19QUk9URUNUSU9OKQorCWlmICh2YWwgPj0gMCAmJiB2YWwgPD0gVDEwX1BJX1RZUEUzX1BST1RFQ1RJT04pCiAJCXNka3AtPnByb3RlY3Rpb25fdHlwZSA9IHZhbDsKIAogCXJldHVybiBjb3VudDsKQEAgLTMzMiw3ICszMzMsNyBAQAogCWRpZiA9IHNjc2lfaG9zdF9kaWZfY2FwYWJsZShzZHAtPmhvc3QsIHNka3AtPnByb3RlY3Rpb25fdHlwZSk7CiAJZGl4ID0gc2NzaV9ob3N0X2RpeF9jYXBhYmxlKHNkcC0+aG9zdCwgc2RrcC0+cHJvdGVjdGlvbl90eXBlKTsKIAotCWlmICghZGl4ICYmIHNjc2lfaG9zdF9kaXhfY2FwYWJsZShzZHAtPmhvc3QsIFNEX0RJRl9UWVBFMF9QUk9URUNUSU9OKSkgeworCWlmICghZGl4ICYmIHNjc2lfaG9zdF9kaXhfY2FwYWJsZShzZHAtPmhvc3QsIFQxMF9QSV9UWVBFMF9QUk9URUNUSU9OKSkgewogCQlkaWYgPSAwOwogCQlkaXggPSAxOwogCX0KQEAgLTYwOCw3ICs2MDksNyBAQAogCQkJc2NtZC0+cHJvdF9mbGFncyB8PSBTQ1NJX1BST1RfR1VBUkRfQ0hFQ0s7CiAJfQogCi0JaWYgKGRpZiAhPSBTRF9ESUZfVFlQRTNfUFJPVEVDVElPTikgewkvKiBESVgvRElGIFR5cGUgMCwgMSwgMiAqLworCWlmIChkaWYgIT0gVDEwX1BJX1RZUEUzX1BST1RFQ1RJT04pIHsJLyogRElYL0RJRiBUeXBlIDAsIDEsIDIgKi8KIAkJc2NtZC0+cHJvdF9mbGFncyB8PSBTQ1NJX1BST1RfUkVGX0lOQ1JFTUVOVDsKIAogCQlpZiAoYmlvX2ludGVncml0eV9mbGFnZ2VkKGJpbywgQklQX0NUUkxfTk9DSEVDSykgPT0gZmFsc2UpCkBAIC0xMDMxLDcgKzEwMzIsNyBAQAogCWVsc2UKIAkJcHJvdGVjdCA9IDA7CiAKLQlpZiAocHJvdGVjdCAmJiBzZGtwLT5wcm90ZWN0aW9uX3R5cGUgPT0gU0RfRElGX1RZUEUyX1BST1RFQ1RJT04pIHsKKwlpZiAocHJvdGVjdCAmJiBzZGtwLT5wcm90ZWN0aW9uX3R5cGUgPT0gVDEwX1BJX1RZUEUyX1BST1RFQ1RJT04pIHsKIAkJU0NwbnQtPmNtbmQgPSBtZW1wb29sX2FsbG9jKHNkX2NkYl9wb29sLCBHRlBfQVRPTUlDKTsKIAogCQlpZiAodW5saWtlbHkoU0NwbnQtPmNtbmQgPT0gTlVMTCkpIHsKQEAgLTE5OTcsNyArMTk5OCw3IEBACiAKIAl0eXBlID0gKChidWZmZXJbMTJdID4+IDEpICYgNykgKyAxOyAvKiBQX1RZUEUgMCA9IFR5cGUgMSAqLwogCi0JaWYgKHR5cGUgPiBTRF9ESUZfVFlQRTNfUFJPVEVDVElPTikKKwlpZiAodHlwZSA+IFQxMF9QSV9UWVBFM19QUk9URUNUSU9OKQogCQlyZXQgPSAtRU5PREVWOwogCWVsc2UgaWYgKHNjc2lfaG9zdF9kaWZfY2FwYWJsZShzZHAtPmhvc3QsIHR5cGUpKQogCQlyZXQgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmggYi9kcml2ZXJzL3Njc2kvc2QuaAppbmRleCA3NjVhNmYxLi5jOGQ5ODYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuaAorKysgYi9kcml2ZXJzL3Njc2kvc2QuaApAQCAtMTU3LDI3ICsxNTcsNiBAQAogfQogCiAvKgotICogQSBESUYtY2FwYWJsZSB0YXJnZXQgZGV2aWNlIGNhbiBiZSBmb3JtYXR0ZWQgd2l0aCBkaWZmZXJlbnQKLSAqIHByb3RlY3Rpb24gc2NoZW1lcy4gIEN1cnJlbnRseSAwIHRocm91Z2ggMyBhcmUgZGVmaW5lZDoKLSAqCi0gKiBUeXBlIDAgaXMgcmVndWxhciAodW5wcm90ZWN0ZWQpIEkvTwotICoKLSAqIFR5cGUgMSBkZWZpbmVzIHRoZSBjb250ZW50cyBvZiB0aGUgZ3VhcmQgYW5kIHJlZmVyZW5jZSB0YWdzCi0gKgotICogVHlwZSAyIGRlZmluZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBndWFyZCBhbmQgcmVmZXJlbmNlIHRhZ3MgYW5kCi0gKiB1c2VzIDMyLWJ5dGUgY29tbWFuZHMgdG8gc2VlZCB0aGUgbGF0dGVyCi0gKgotICogVHlwZSAzIGRlZmluZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBndWFyZCB0YWcgb25seQotICovCi0KLWVudW0gc2RfZGlmX3RhcmdldF9wcm90ZWN0aW9uX3R5cGVzIHsKLQlTRF9ESUZfVFlQRTBfUFJPVEVDVElPTiA9IDB4MCwKLQlTRF9ESUZfVFlQRTFfUFJPVEVDVElPTiA9IDB4MSwKLQlTRF9ESUZfVFlQRTJfUFJPVEVDVElPTiA9IDB4MiwKLQlTRF9ESUZfVFlQRTNfUFJPVEVDVElPTiA9IDB4MywKLX07Ci0KLS8qCiAgKiBMb29rIHVwIHRoZSBESVggb3BlcmF0aW9uIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGNvbW1hbmQgaXMgcmVhZCBvcgogICogd3JpdGUgYW5kIHdoZXRoZXIgZGl4IGFuZCBkaWYgYXJlIGVuYWJsZWQuCiAgKi8KQEAgLTIzOSwxNSArMjE4LDYgQEAKIAlyZXR1cm4gZmxhZ19tYXNrW3Byb3Rfb3BdOwogfQogCi0vKgotICogRGF0YSBJbnRlZ3JpdHkgRmllbGQgdHVwbGUuCi0gKi8KLXN0cnVjdCBzZF9kaWZfdHVwbGUgewotICAgICAgIF9fYmUxNiBndWFyZF90YWc7CS8qIENoZWNrc3VtICovCi0gICAgICAgX19iZTE2IGFwcF90YWc7CQkvKiBPcGFxdWUgc3RvcmFnZSAqLwotICAgICAgIF9fYmUzMiByZWZfdGFnOwkJLyogVGFyZ2V0IExCQSBvciBpbmRpcmVjdCBMQkEgKi8KLX07Ci0KICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkKIAogZXh0ZXJuIHZvaWQgc2RfZGlmX2NvbmZpZ19ob3N0KHN0cnVjdCBzY3NpX2Rpc2sgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2RfZGlmLmMgYi9kcml2ZXJzL3Njc2kvc2RfZGlmLmMKaW5kZXggOTg3YmYzOS4uOTAzNTM4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkX2RpZi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZF9kaWYuYwpAQCAtNjAsMTQgKzYwLDE0IEBACiAKIAkvKiBFbmFibGUgRE1BIG9mIHByb3RlY3Rpb24gaW5mb3JtYXRpb24gKi8KIAlpZiAoc2NzaV9ob3N0X2dldF9ndWFyZChzZGtwLT5kZXZpY2UtPmhvc3QpICYgU0hPU1RfRElYX0dVQVJEX0lQKSB7Ci0JCWlmICh0eXBlID09IFNEX0RJRl9UWVBFM19QUk9URUNUSU9OKQorCQlpZiAodHlwZSA9PSBUMTBfUElfVFlQRTNfUFJPVEVDVElPTikKIAkJCWJpLnByb2ZpbGUgPSAmdDEwX3BpX3R5cGUzX2lwOwogCQllbHNlCiAJCQliaS5wcm9maWxlID0gJnQxMF9waV90eXBlMV9pcDsKIAogCQliaS5mbGFncyB8PSBCTEtfSU5URUdSSVRZX0lQX0NIRUNLU1VNOwogCX0gZWxzZQotCQlpZiAodHlwZSA9PSBTRF9ESUZfVFlQRTNfUFJPVEVDVElPTikKKwkJaWYgKHR5cGUgPT0gVDEwX1BJX1RZUEUzX1BST1RFQ1RJT04pCiAJCQliaS5wcm9maWxlID0gJnQxMF9waV90eXBlM19jcmM7CiAJCWVsc2UKIAkJCWJpLnByb2ZpbGUgPSAmdDEwX3BpX3R5cGUxX2NyYzsKQEAgLTgyLDcgKzgyLDcgQEAKIAkJaWYgKCFzZGtwLT5BVE8pCiAJCQlnb3RvIG91dDsKIAotCQlpZiAodHlwZSA9PSBTRF9ESUZfVFlQRTNfUFJPVEVDVElPTikKKwkJaWYgKHR5cGUgPT0gVDEwX1BJX1RZUEUzX1BST1RFQ1RJT04pCiAJCQliaS50YWdfc2l6ZSA9IHNpemVvZih1MTYpICsgc2l6ZW9mKHUzMik7CiAJCWVsc2UKIAkJCWJpLnRhZ19zaXplID0gc2l6ZW9mKHUxNik7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAogCXNka3AgPSBzY3NpX2Rpc2soc2NtZC0+cmVxdWVzdC0+cnFfZGlzayk7CiAKLQlpZiAoc2RrcC0+cHJvdGVjdGlvbl90eXBlID09IFNEX0RJRl9UWVBFM19QUk9URUNUSU9OKQorCWlmIChzZGtwLT5wcm90ZWN0aW9uX3R5cGUgPT0gVDEwX1BJX1RZUEUzX1BST1RFQ1RJT04pCiAJCXJldHVybjsKIAogCXBoeXMgPSBzY3NpX3Byb3RfcmVmX3RhZyhzY21kKTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogCiAJc2RrcCA9IHNjc2lfZGlzayhzY21kLT5yZXF1ZXN0LT5ycV9kaXNrKTsKIAotCWlmIChzZGtwLT5wcm90ZWN0aW9uX3R5cGUgPT0gU0RfRElGX1RZUEUzX1BST1RFQ1RJT04gfHwgZ29vZF9ieXRlcyA9PSAwKQorCWlmIChzZGtwLT5wcm90ZWN0aW9uX3R5cGUgPT0gVDEwX1BJX1RZUEUzX1BST1RFQ1RJT04gfHwgZ29vZF9ieXRlcyA9PSAwKQogCQlyZXR1cm47CiAKIAlpbnRlcnZhbHMgPSBnb29kX2J5dGVzIC8gc2NzaV9wcm90X2ludGVydmFsKHNjbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Nlcy5jIGIvZHJpdmVycy9zY3NpL3Nlcy5jCmluZGV4IDBlODYwMWEuLjhjOWEzNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zZXMuYworKysgYi9kcml2ZXJzL3Njc2kvc2VzLmMKQEAgLTU4Nyw3ICs1ODcsNyBAQAogCiAJc2VzX2VuY2xvc3VyZV9kYXRhX3Byb2Nlc3MoZWRldiwgdG9fc2NzaV9kZXZpY2UoZWRldi0+ZWRldi5wYXJlbnQpLCAwKTsKIAotCWlmIChpc19zYXNfYXR0YWNoZWQoc2RldikpCisJaWYgKHNjc2lfaXNfc2FzX3JwaHkoJnNkZXYtPnNkZXZfZ2VuZGV2KSkKIAkJZWZkLmFkZHIgPSBzYXNfZ2V0X2FkZHJlc3Moc2Rldik7CiAKIAlpZiAoZWZkLmFkZHIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZy5jIGIvZHJpdmVycy9zY3NpL3NnLmMKaW5kZXggYWU3ZDliZC4uMDcwMzMyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NnLmMKKysrIGIvZHJpdmVycy9zY3NpL3NnLmMKQEAgLTc5LDE4ICs3OSw3IEBACiAgKi8KICNkZWZpbmUgU0dfTUFYX0NEQl9TSVpFIDI1MgogCi0vKgotICogU3VwcG9zZSB5b3Ugd2FudCB0byBjYWxjdWxhdGUgdGhlIGZvcm11bGEgbXVsZGl2KHgsbSxkKT1pbnQoeCAqIG0gLyBkKQotICogVGhlbiB3aGVuIHVzaW5nIDMyIGJpdCBpbnRlZ2VycyB4ICogbSBtYXkgb3ZlcmZsb3cgZHVyaW5nIHRoZSBjYWxjdWxhdGlvbi4KLSAqIFJlcGxhY2luZyBtdWxkaXYoeCkgYnkgbXVsZGl2KHgpPSgoeCAlIGQpICogbSkgLyBkICsgaW50KHggLyBkKSAqIG0KLSAqIGNhbGN1bGF0ZXMgdGhlIHNhbWUsIGJ1dCBwcmV2ZW50cyB0aGUgb3ZlcmZsb3cgd2hlbiBib3RoIG0gYW5kIGQKLSAqIGFyZSAic21hbGwiIG51bWJlcnMgKGxpa2UgSFogYW5kIFVTRVJfSFopLgotICogT2YgY291cnNlIGFuIG92ZXJmbG93IGlzIGluYXZvaWRhYmxlIGlmIHRoZSByZXN1bHQgb2YgbXVsZGl2IGRvZXNuJ3QgZml0Ci0gKiBpbiAzMiBiaXRzLgotICovCi0jZGVmaW5lIE1VTERJVihYLE1VTCxESVYpICgoKChYICUgRElWKSAqIE1VTCkgLyBESVYpICsgKChYIC8gRElWKSAqIE1VTCkpCi0KLSNkZWZpbmUgU0dfREVGQVVMVF9USU1FT1VUIE1VTERJVihTR19ERUZBVUxUX1RJTUVPVVRfVVNFUiwgSFosIFVTRVJfSFopCisjZGVmaW5lIFNHX0RFRkFVTFRfVElNRU9VVCBtdWx0X2ZyYWMoU0dfREVGQVVMVF9USU1FT1VUX1VTRVIsIEhaLCBVU0VSX0haKQogCiBpbnQgc2dfYmlnX2J1ZmYgPSBTR19ERUZfUkVTRVJWRURfU0laRTsKIC8qIE4uQi4gVGhpcyB2YXJpYWJsZSBpcyByZWFkYWJsZSBhbmQgd3JpdGVhYmxlIHZpYQpAQCAtODg0LDEwICs4NzMsMTEgQEAKIAkJCXJldHVybiByZXN1bHQ7CiAJCWlmICh2YWwgPCAwKQogCQkJcmV0dXJuIC1FSU87Ci0JCWlmICh2YWwgPj0gTVVMRElWIChJTlRfTUFYLCBVU0VSX0haLCBIWikpCi0JCSAgICB2YWwgPSBNVUxESVYgKElOVF9NQVgsIFVTRVJfSFosIEhaKTsKKwkJaWYgKHZhbCA+PSBtdWx0X2ZyYWMoKHM2NClJTlRfTUFYLCBVU0VSX0haLCBIWikpCisJCQl2YWwgPSBtaW5fdChzNjQsIG11bHRfZnJhYygoczY0KUlOVF9NQVgsIFVTRVJfSFosIEhaKSwKKwkJCQkgICAgSU5UX01BWCk7CiAJCXNmcC0+dGltZW91dF91c2VyID0gdmFsOwotCQlzZnAtPnRpbWVvdXQgPSBNVUxESVYgKHZhbCwgSFosIFVTRVJfSFopOworCQlzZnAtPnRpbWVvdXQgPSBtdWx0X2ZyYWModmFsLCBIWiwgVVNFUl9IWik7CiAKIAkJcmV0dXJuIDA7CiAJY2FzZSBTR19HRVRfVElNRU9VVDoJLyogTi5CLiBVc2VyIHJlY2VpdmVzIHRpbWVvdXQgYXMgcmV0dXJuIHZhbHVlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc21hcnRwcWkvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9zbWFydHBxaS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZTE1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc21hcnRwcWkvS2NvbmZpZwpAQCAtMCwwICsxLDU0IEBACisjCisjIEtlcm5lbCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBTTUFSVFBRSQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTYgTWljcm9zZW1pIENvcnBvcmF0aW9uCisjIENvcHlyaWdodCAoYykgMjAxNiBQTUMtU2llcnJhLCBJbmMuCisjICAobWFpbHRvOmVzYy5zdG9yYWdlZGV2QG1pY3Jvc2VtaS5jb20pCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyCisjIG9mIHRoZSBMaWNlbnNlLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgTk8gV0FSUkFOVFkKKyMgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCisjIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUCisjIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCisjIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMKKyMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorIyBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKKyMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisjIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsCisjIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCisjIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisjIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCisjIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORAorIyBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyMgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRQorIyBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKKyMgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUworCitjb25maWcgU0NTSV9TTUFSVFBRSQorCXRyaXN0YXRlICJNaWNyb3NlbWkgUFFJIERyaXZlciIKKwlkZXBlbmRzIG9uIFBDSSAmJiBTQ1NJICYmICFTMzkwCisJc2VsZWN0IFNDU0lfU0FTX0FUVFJTCisJc2VsZWN0IFJBSURfQVRUUlMKKwktLS1oZWxwLS0tCisJVGhpcyBkcml2ZXIgc3VwcG9ydHMgTWljcm9zZW1pIFBRSSBjb250cm9sbGVycy4KKworCTxodHRwOi8vd3d3Lm1pY3Jvc2VtaS5jb20+CisKKwlUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwltb2R1bGUgd2lsbCBiZSBjYWxsZWQgc21hcnRwcWkuCisKKyAgICAgICAgTm90ZTogdGhlIGFhY3JhaWQgZHJpdmVyIHdpbGwgbm90IG1hbmFnZSBhIHNtYXJ0cHFpCisgICAgICAgICAgICAgIGNvbnRyb2xsZXIuIFlvdSBuZWVkIHRvIGVuYWJsZSBzbWFydHBxaSBmb3Igc21hcnRwcWkKKyAgICAgICAgICAgICAgY29udHJvbGxlcnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlCisgICAgICAgICAgICAgIERvY3VtZW50YXRpb24vc2NzaS9zbWFydHBxaS50eHQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zbWFydHBxaS9NYWtlZmlsZSBiL2RyaXZlcnMvc2NzaS9zbWFydHBxaS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQyYTIyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NtYXJ0cHFpL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorY2NmbGFncy15ICs9IC1JLgorb2JqLW0JCSs9IHNtYXJ0cHFpLm8KK3NtYXJ0cHFpLW9ianMgOj0gc21hcnRwcWlfaW5pdC5vIHNtYXJ0cHFpX3Npcy5vIHNtYXJ0cHFpX3Nhc190cmFuc3BvcnQubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NtYXJ0cHFpL3NtYXJ0cHFpLmggYi9kcml2ZXJzL3Njc2kvc21hcnRwcWkvc21hcnRwcWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I2NDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NtYXJ0cHFpL3NtYXJ0cHFpLmgKQEAgLTAsMCArMSwxMTM2IEBACisvKgorICogICAgZHJpdmVyIGZvciBNaWNyb3NlbWkgUFFJLWJhc2VkIHN0b3JhZ2UgY29udHJvbGxlcnMKKyAqICAgIENvcHlyaWdodCAoYykgMjAxNiBNaWNyb3NlbWkgQ29ycG9yYXRpb24KKyAqICAgIENvcHlyaWdodCAoYykgMjAxNiBQTUMtU2llcnJhLCBJbmMuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiAgICBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFF1ZXN0aW9ucy9Db21tZW50cy9CdWdmaXhlcyB0byBlc2Muc3RvcmFnZWRldkBtaWNyb3NlbWkuY29tCisgKgorICovCisKKyNpZiAhZGVmaW5lZChfU01BUlRQUUlfSCkKKyNkZWZpbmUgX1NNQVJUUFFJX0gKKworI3ByYWdtYSBwYWNrKDEpCisKKyNkZWZpbmUgUFFJX0RFVklDRV9TSUdOQVRVUkUJIlBRSSBEUkVHIgorCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGJ5IHRoZSBQUUkgc3BlY2lmaWNhdGlvbi4gKi8KK3N0cnVjdCBwcWlfZGV2aWNlX3JlZ2lzdGVycyB7CisJX19sZTY0CXNpZ25hdHVyZTsKKwl1OAlmdW5jdGlvbl9hbmRfc3RhdHVzX2NvZGU7CisJdTgJcmVzZXJ2ZWRbN107CisJdTgJbWF4X2FkbWluX2lxX2VsZW1lbnRzOworCXU4CW1heF9hZG1pbl9vcV9lbGVtZW50czsKKwl1OAlhZG1pbl9pcV9lbGVtZW50X2xlbmd0aDsJLyogaW4gMTYtYnl0ZSB1bml0cyAqLworCXU4CWFkbWluX29xX2VsZW1lbnRfbGVuZ3RoOwkvKiBpbiAxNi1ieXRlIHVuaXRzICovCisJX19sZTE2CW1heF9yZXNldF90aW1lb3V0OwkJLyogaW4gMTAwLW1pbGxpc2Vjb25kIHVuaXRzICovCisJdTgJcmVzZXJ2ZWQxWzJdOworCV9fbGUzMglsZWdhY3lfaW50eF9zdGF0dXM7CisJX19sZTMyCWxlZ2FjeV9pbnR4X21hc2tfc2V0OworCV9fbGUzMglsZWdhY3lfaW50eF9tYXNrX2NsZWFyOworCXU4CXJlc2VydmVkMlsyOF07CisJX19sZTMyCWRldmljZV9zdGF0dXM7CisJdTgJcmVzZXJ2ZWQzWzRdOworCV9fbGU2NAlhZG1pbl9pcV9waV9vZmZzZXQ7CisJX19sZTY0CWFkbWluX29xX2NpX29mZnNldDsKKwlfX2xlNjQJYWRtaW5faXFfZWxlbWVudF9hcnJheV9hZGRyOworCV9fbGU2NAlhZG1pbl9vcV9lbGVtZW50X2FycmF5X2FkZHI7CisJX19sZTY0CWFkbWluX2lxX2NpX2FkZHI7CisJX19sZTY0CWFkbWluX29xX3BpX2FkZHI7CisJdTgJYWRtaW5faXFfbnVtX2VsZW1lbnRzOworCXU4CWFkbWluX29xX251bV9lbGVtZW50czsKKwlfX2xlMTYJYWRtaW5fcXVldWVfaW50X21zZ19udW07CisJdTgJcmVzZXJ2ZWQ0WzRdOworCV9fbGUzMglkZXZpY2VfZXJyb3I7CisJdTgJcmVzZXJ2ZWQ1WzRdOworCV9fbGU2NAllcnJvcl9kZXRhaWxzOworCV9fbGUzMglkZXZpY2VfcmVzZXQ7CisJX19sZTMyCXBvd2VyX2FjdGlvbjsKKwl1OAlyZXNlcnZlZDZbMTA0XTsKK307CisKKy8qCisgKiBjb250cm9sbGVyIHJlZ2lzdGVycworICoKKyAqIFRoZXNlIGFyZSBkZWZpbmVkIGJ5IHRoZSBQTUMgaW1wbGVtZW50YXRpb24uCisgKgorICogU29tZSByZWdpc3RlcnMgKHRob3NlIG5hbWVkIHNpc18qKSBhcmUgb25seSB1c2VkIHdoZW4gaW4KKyAqIGxlZ2FjeSBTSVMgbW9kZSBiZWZvcmUgd2UgdHJhbnNpdGlvbiB0aGUgY29udHJvbGxlciBpbnRvCisgKiBQUUkgbW9kZS4gIFRoZXJlIGFyZSBhIG51bWJlciBvZiBvdGhlciBTSVMgbW9kZSByZWdpc3RlcnMsCisgKiBidXQgd2UgZG9uJ3QgdXNlIHRoZW0sIHNvIG9ubHkgdGhlIFNJUyByZWdpc3RlcnMgdGhhdCB3ZQorICogY2FyZSBhYm91dCBhcmUgZGVmaW5lZCBoZXJlLiAgVGhlIG9mZnNldHMgbWVudGlvbmVkIGluIHRoZQorICogY29tbWVudHMgYXJlIHRoZSBvZmZzZXRzIGZyb20gdGhlIFBDSWUgQkFSIDAuCisgKi8KK3N0cnVjdCBwcWlfY3RybF9yZWdpc3RlcnMgeworCXU4CXJlc2VydmVkWzB4MjBdOworCV9fbGUzMglzaXNfaG9zdF90b19jdHJsX2Rvb3JiZWxsOwkJLyogMjBoICovCisJdTgJcmVzZXJ2ZWQxWzB4MzQgLSAoMHgyMCArIHNpemVvZihfX2xlMzIpKV07CisJX19sZTMyCXNpc19pbnRlcnJ1cHRfbWFzazsJCQkvKiAzNGggKi8KKwl1OAlyZXNlcnZlZDJbMHg5YyAtICgweDM0ICsgc2l6ZW9mKF9fbGUzMikpXTsKKwlfX2xlMzIJc2lzX2N0cmxfdG9faG9zdF9kb29yYmVsbDsJCS8qIDlDaCAqLworCXU4CXJlc2VydmVkM1sweGEwIC0gKDB4OWMgKyBzaXplb2YoX19sZTMyKSldOworCV9fbGUzMglzaXNfY3RybF90b19ob3N0X2Rvb3JiZWxsX2NsZWFyOwkvKiBBMGggKi8KKwl1OAlyZXNlcnZlZDRbMHhiMCAtICgweGEwICsgc2l6ZW9mKF9fbGUzMikpXTsKKwlfX2xlMzIJc2lzX2RyaXZlcl9zY3JhdGNoOwkJCS8qIEIwaCAqLworCXU4CXJlc2VydmVkNVsweGJjIC0gKDB4YjAgKyBzaXplb2YoX19sZTMyKSldOworCV9fbGUzMglzaXNfZmlybXdhcmVfc3RhdHVzOwkJCS8qIEJDaCAqLworCXU4CXJlc2VydmVkNlsweDEwMDAgLSAoMHhiYyArIHNpemVvZihfX2xlMzIpKV07CisJX19sZTMyCXNpc19tYWlsYm94WzhdOwkJCQkvKiAxMDAwaCAqLworCXU4CXJlc2VydmVkN1sweDQwMDAgLSAoMHgxMDAwICsgKHNpemVvZihfX2xlMzIpICogOCkpXTsKKwkvKgorCSAqIFRoZSBQUUkgc3BlYyBzdGF0ZXMgdGhhdCB0aGUgUFFJIHJlZ2lzdGVycyBzaG91bGQgYmUgYXQKKwkgKiBvZmZzZXQgMCBmcm9tIHRoZSBQQ0llIEJBUiAwLiAgSG93ZXZlciwgd2UgY2FuJ3QgbWFwCisJICogdGhlbSBhdCBvZmZzZXQgMCBiZWNhdXNlIHRoYXQgd291bGQgYnJlYWsgY29tcGF0aWJpbGl0eQorCSAqIHdpdGggdGhlIFNJUyByZWdpc3RlcnMuICBTbyB3ZSBtYXAgdGhlbSBhdCBvZmZzZXQgNDAwMGguCisJICovCisJc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzIHBxaV9yZWdpc3RlcnM7CS8qIDQwMDBoICovCit9OworCisjZGVmaW5lIFBRSV9ERVZJQ0VfUkVHSVNURVJTX09GRlNFVAkweDQwMDAKKworZW51bSBwcWlfaW9fcGF0aCB7CisJUkFJRF9QQVRIID0gMCwKKwlBSU9fUEFUSCA9IDEKK307CisKK3N0cnVjdCBwcWlfc2dfZGVzY3JpcHRvciB7CisJX19sZTY0CWFkZHJlc3M7CisJX19sZTMyCWxlbmd0aDsKKwlfX2xlMzIJZmxhZ3M7Cit9OworCisvKiBtYW5pZmVzdCBjb25zdGFudHMgZm9yIHRoZSBmbGFncyBmaWVsZCBvZiBwcWlfc2dfZGVzY3JpcHRvciAqLworI2RlZmluZSBDSVNTX1NHX0xBU1QJMHg0MDAwMDAwMAorI2RlZmluZSBDSVNTX1NHX0NIQUlOCTB4ODAwMDAwMDAKKworc3RydWN0IHBxaV9pdV9oZWFkZXIgeworCXU4CWl1X3R5cGU7CisJdTgJcmVzZXJ2ZWQ7CisJX19sZTE2CWl1X2xlbmd0aDsJLyogaW4gYnl0ZXMgLSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBsZW5ndGggKi8KKwkJCQkvKiBvZiB0aGlzIGhlYWRlciAqLworCV9fbGUxNglyZXNwb25zZV9xdWV1ZV9pZDsJLyogc3BlY2lmaWVzIHRoZSBPUSB3aGVyZSB0aGUgKi8KKwkJCQkJLyogICByZXNwb25zZSBJVSBpcyB0byBiZSBkZWxpdmVyZWQgKi8KKwl1OAl3b3JrX2FyZWFbMl07CS8qIHJlc2VydmVkIGZvciBkcml2ZXIgdXNlICovCit9OworCisvKgorICogQWNjb3JkaW5nIHRvIHRoZSBQUUkgc3BlYywgdGhlIElVIGhlYWRlciBpcyBvbmx5IHRoZSBmaXJzdCA0IGJ5dGVzIG9mIG91cgorICogcHFpX2l1X2hlYWRlciBzdHJ1Y3R1cmUuCisgKi8KKyNkZWZpbmUgUFFJX1JFUVVFU1RfSEVBREVSX0xFTkdUSAk0CisKK3N0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXF1ZXN0IHsKKwlzdHJ1Y3QgcHFpX2l1X2hlYWRlciBoZWFkZXI7CisJX19sZTE2CXJlcXVlc3RfaWQ7CisJdTgJZnVuY3Rpb25fY29kZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OAlyZXNlcnZlZFszM107CisJCQlfX2xlMzIJYnVmZmVyX2xlbmd0aDsKKwkJCXN0cnVjdCBwcWlfc2dfZGVzY3JpcHRvciBzZ19kZXNjcmlwdG9yOworCQl9IHJlcG9ydF9kZXZpY2VfY2FwYWJpbGl0eTsKKworCQlzdHJ1Y3QgeworCQkJdTgJcmVzZXJ2ZWQ7CisJCQlfX2xlMTYJcXVldWVfaWQ7CisJCQl1OAlyZXNlcnZlZDFbMl07CisJCQlfX2xlNjQJZWxlbWVudF9hcnJheV9hZGRyOworCQkJX19sZTY0CWNpX2FkZHI7CisJCQlfX2xlMTYJbnVtX2VsZW1lbnRzOworCQkJX19sZTE2CWVsZW1lbnRfbGVuZ3RoOworCQkJdTgJcXVldWVfcHJvdG9jb2w7CisJCQl1OAlyZXNlcnZlZDJbMjNdOworCQkJX19sZTMyCXZlbmRvcl9zcGVjaWZpYzsKKwkJfSBjcmVhdGVfb3BlcmF0aW9uYWxfaXE7CisKKwkJc3RydWN0IHsKKwkJCXU4CXJlc2VydmVkOworCQkJX19sZTE2CXF1ZXVlX2lkOworCQkJdTgJcmVzZXJ2ZWQxWzJdOworCQkJX19sZTY0CWVsZW1lbnRfYXJyYXlfYWRkcjsKKwkJCV9fbGU2NAlwaV9hZGRyOworCQkJX19sZTE2CW51bV9lbGVtZW50czsKKwkJCV9fbGUxNgllbGVtZW50X2xlbmd0aDsKKwkJCXU4CXF1ZXVlX3Byb3RvY29sOworCQkJdTgJcmVzZXJ2ZWQyWzNdOworCQkJX19sZTE2CWludF9tc2dfbnVtOworCQkJX19sZTE2CWNvYWxlc2NpbmdfY291bnQ7CisJCQlfX2xlMzIJbWluX2NvYWxlc2NpbmdfdGltZTsKKwkJCV9fbGUzMgltYXhfY29hbGVzY2luZ190aW1lOworCQkJdTgJcmVzZXJ2ZWQzWzhdOworCQkJX19sZTMyCXZlbmRvcl9zcGVjaWZpYzsKKwkJfSBjcmVhdGVfb3BlcmF0aW9uYWxfb3E7CisKKwkJc3RydWN0IHsKKwkJCXU4CXJlc2VydmVkOworCQkJX19sZTE2CXF1ZXVlX2lkOworCQkJdTgJcmVzZXJ2ZWQxWzUwXTsKKwkJfSBkZWxldGVfb3BlcmF0aW9uYWxfcXVldWU7CisKKwkJc3RydWN0IHsKKwkJCXU4CXJlc2VydmVkOworCQkJX19sZTE2CXF1ZXVlX2lkOworCQkJdTgJcmVzZXJ2ZWQxWzQ2XTsKKwkJCV9fbGUzMgl2ZW5kb3Jfc3BlY2lmaWM7CisJCX0gY2hhbmdlX29wZXJhdGlvbmFsX2lxX3Byb3BlcnRpZXM7CisKKwl9IGRhdGE7Cit9OworCitzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVzcG9uc2UgeworCXN0cnVjdCBwcWlfaXVfaGVhZGVyIGhlYWRlcjsKKwlfX2xlMTYJcmVxdWVzdF9pZDsKKwl1OAlmdW5jdGlvbl9jb2RlOworCXU4CXN0YXR1czsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OAlzdGF0dXNfZGVzY3JpcHRvcls0XTsKKwkJCV9fbGU2NAlpcV9waV9vZmZzZXQ7CisJCQl1OAlyZXNlcnZlZFs0MF07CisJCX0gY3JlYXRlX29wZXJhdGlvbmFsX2lxOworCisJCXN0cnVjdCB7CisJCQl1OAlzdGF0dXNfZGVzY3JpcHRvcls0XTsKKwkJCV9fbGU2NAlvcV9jaV9vZmZzZXQ7CisJCQl1OAlyZXNlcnZlZFs0MF07CisJCX0gY3JlYXRlX29wZXJhdGlvbmFsX29xOworCX0gZGF0YTsKK307CisKK3N0cnVjdCBwcWlfaXVfbGF5ZXJfZGVzY3JpcHRvciB7CisJdTgJaW5ib3VuZF9zcGFubmluZ19zdXBwb3J0ZWQgOiAxOworCXU4CXJlc2VydmVkIDogNzsKKwl1OAlyZXNlcnZlZDFbNV07CisJX19sZTE2CW1heF9pbmJvdW5kX2l1X2xlbmd0aDsKKwl1OAlvdXRib3VuZF9zcGFubmluZ19zdXBwb3J0ZWQgOiAxOworCXU4CXJlc2VydmVkMiA6IDc7CisJdTgJcmVzZXJ2ZWQzWzVdOworCV9fbGUxNgltYXhfb3V0Ym91bmRfaXVfbGVuZ3RoOworfTsKKworc3RydWN0IHBxaV9kZXZpY2VfY2FwYWJpbGl0eSB7CisJX19sZTE2CWRhdGFfbGVuZ3RoOworCXU4CXJlc2VydmVkWzZdOworCXU4CWlxX2FyYml0cmF0aW9uX3ByaW9yaXR5X3N1cHBvcnRfYml0bWFzazsKKwl1OAltYXhpbXVtX2F3X2E7CisJdTgJbWF4aW11bV9hd19iOworCXU4CW1heGltdW1fYXdfYzsKKwl1OAltYXhfYXJiaXRyYXRpb25fYnVyc3QgOiAzOworCXU4CXJlc2VydmVkMSA6IDQ7CisJdTgJaXFhIDogMTsKKwl1OAlyZXNlcnZlZDJbMl07CisJdTgJaXFfZnJlZXplIDogMTsKKwl1OAlyZXNlcnZlZDMgOiA3OworCV9fbGUxNgltYXhfaW5ib3VuZF9xdWV1ZXM7CisJX19sZTE2CW1heF9lbGVtZW50c19wZXJfaXE7CisJdTgJcmVzZXJ2ZWQ0WzRdOworCV9fbGUxNgltYXhfaXFfZWxlbWVudF9sZW5ndGg7CisJX19sZTE2CW1pbl9pcV9lbGVtZW50X2xlbmd0aDsKKwl1OAlyZXNlcnZlZDVbMl07CisJX19sZTE2CW1heF9vdXRib3VuZF9xdWV1ZXM7CisJX19sZTE2CW1heF9lbGVtZW50c19wZXJfb3E7CisJX19sZTE2CWludHJfY29hbGVzY2luZ190aW1lX2dyYW51bGFyaXR5OworCV9fbGUxNgltYXhfb3FfZWxlbWVudF9sZW5ndGg7CisJX19sZTE2CW1pbl9vcV9lbGVtZW50X2xlbmd0aDsKKwl1OAlyZXNlcnZlZDZbMjRdOworCXN0cnVjdCBwcWlfaXVfbGF5ZXJfZGVzY3JpcHRvciBpdV9sYXllcl9kZXNjcmlwdG9yc1szMl07Cit9OworCisjZGVmaW5lIFBRSV9NQVhfRU1CRURERURfU0dfREVTQ1JJUFRPUlMJCTQKKworc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCB7CisJc3RydWN0IHBxaV9pdV9oZWFkZXIgaGVhZGVyOworCV9fbGUxNglyZXF1ZXN0X2lkOworCV9fbGUxNgluZXh1c19pZDsKKwlfX2xlMzIJYnVmZmVyX2xlbmd0aDsKKwl1OAlsdW5fbnVtYmVyWzhdOworCV9fbGUxNglwcm90b2NvbF9zcGVjaWZpYzsKKwl1OAlkYXRhX2RpcmVjdGlvbiA6IDI7CisJdTgJcGFydGlhbCA6IDE7CisJdTgJcmVzZXJ2ZWQxIDogNDsKKwl1OAlmZW5jZSA6IDE7CisJX19sZTE2CWVycm9yX2luZGV4OworCXU4CXJlc2VydmVkMjsKKwl1OAl0YXNrX2F0dHJpYnV0ZSA6IDM7CisJdTgJY29tbWFuZF9wcmlvcml0eSA6IDQ7CisJdTgJcmVzZXJ2ZWQzIDogMTsKKwl1OAlyZXNlcnZlZDQgOiAyOworCXU4CWFkZGl0aW9uYWxfY2RiX2J5dGVzX3VzYWdlIDogMzsKKwl1OAlyZXNlcnZlZDUgOiAzOworCXU4CWNkYlszMl07CisJc3RydWN0IHBxaV9zZ19kZXNjcmlwdG9yCisJCXNnX2Rlc2NyaXB0b3JzW1BRSV9NQVhfRU1CRURERURfU0dfREVTQ1JJUFRPUlNdOworfTsKKworc3RydWN0IHBxaV9haW9fcGF0aF9yZXF1ZXN0IHsKKwlzdHJ1Y3QgcHFpX2l1X2hlYWRlciBoZWFkZXI7CisJX19sZTE2CXJlcXVlc3RfaWQ7CisJdTgJcmVzZXJ2ZWQxWzJdOworCV9fbGUzMgluZXh1c19pZDsKKwlfX2xlMzIJYnVmZmVyX2xlbmd0aDsKKwl1OAlkYXRhX2RpcmVjdGlvbiA6IDI7CisJdTgJcGFydGlhbCA6IDE7CisJdTgJbWVtb3J5X3R5cGUgOiAxOworCXU4CWZlbmNlIDogMTsKKwl1OAllbmNyeXB0aW9uX2VuYWJsZSA6IDE7CisJdTgJcmVzZXJ2ZWQyIDogMjsKKwl1OAl0YXNrX2F0dHJpYnV0ZSA6IDM7CisJdTgJY29tbWFuZF9wcmlvcml0eSA6IDQ7CisJdTgJcmVzZXJ2ZWQzIDogMTsKKwlfX2xlMTYJZGF0YV9lbmNyeXB0aW9uX2tleV9pbmRleDsKKwlfX2xlMzIJZW5jcnlwdF90d2Vha19sb3dlcjsKKwlfX2xlMzIJZW5jcnlwdF90d2Vha191cHBlcjsKKwl1OAljZGJbMTZdOworCV9fbGUxNgllcnJvcl9pbmRleDsKKwl1OAludW1fc2dfZGVzY3JpcHRvcnM7CisJdTgJY2RiX2xlbmd0aDsKKwl1OAlsdW5fbnVtYmVyWzhdOworCXU4CXJlc2VydmVkNFs0XTsKKwlzdHJ1Y3QgcHFpX3NnX2Rlc2NyaXB0b3IKKwkJc2dfZGVzY3JpcHRvcnNbUFFJX01BWF9FTUJFRERFRF9TR19ERVNDUklQVE9SU107Cit9OworCitzdHJ1Y3QgcHFpX2lvX3Jlc3BvbnNlIHsKKwlzdHJ1Y3QgcHFpX2l1X2hlYWRlciBoZWFkZXI7CisJX19sZTE2CXJlcXVlc3RfaWQ7CisJX19sZTE2CWVycm9yX2luZGV4OworCXU4CXJlc2VydmVkMls0XTsKK307CisKK3N0cnVjdCBwcWlfZ2VuZXJhbF9tYW5hZ2VtZW50X3JlcXVlc3QgeworCXN0cnVjdCBwcWlfaXVfaGVhZGVyIGhlYWRlcjsKKwlfX2xlMTYJcmVxdWVzdF9pZDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OAlyZXNlcnZlZFsyXTsKKwkJCV9fbGUzMglidWZmZXJfbGVuZ3RoOworCQkJc3RydWN0IHBxaV9zZ19kZXNjcmlwdG9yIHNnX2Rlc2NyaXB0b3JzWzNdOworCQl9IHJlcG9ydF9ldmVudF9jb25maWd1cmF0aW9uOworCisJCXN0cnVjdCB7CisJCQlfX2xlMTYJZ2xvYmFsX2V2ZW50X29xX2lkOworCQkJX19sZTMyCWJ1ZmZlcl9sZW5ndGg7CisJCQlzdHJ1Y3QgcHFpX3NnX2Rlc2NyaXB0b3Igc2dfZGVzY3JpcHRvcnNbM107CisJCX0gc2V0X2V2ZW50X2NvbmZpZ3VyYXRpb247CisJfSBkYXRhOworfTsKKworc3RydWN0IHBxaV9ldmVudF9kZXNjcmlwdG9yIHsKKwl1OAlldmVudF90eXBlOworCXU4CXJlc2VydmVkOworCV9fbGUxNglvcV9pZDsKK307CisKK3N0cnVjdCBwcWlfZXZlbnRfY29uZmlnIHsKKwl1OAlyZXNlcnZlZFsyXTsKKwl1OAludW1fZXZlbnRfZGVzY3JpcHRvcnM7CisJdTgJcmVzZXJ2ZWQxOworCXN0cnVjdCBwcWlfZXZlbnRfZGVzY3JpcHRvciBkZXNjcmlwdG9yc1sxXTsKK307CisKKyNkZWZpbmUgUFFJX01BWF9FVkVOVF9ERVNDUklQVE9SUwkyNTUKKworc3RydWN0IHBxaV9ldmVudF9yZXNwb25zZSB7CisJc3RydWN0IHBxaV9pdV9oZWFkZXIgaGVhZGVyOworCXU4CWV2ZW50X3R5cGU7CisJdTgJcmVzZXJ2ZWQyIDogNzsKKwl1OAlyZXF1ZXN0X2Fja25vd2xlZ2UgOiAxOworCV9fbGUxNglldmVudF9pZDsKKwlfX2xlMzIJYWRkaXRpb25hbF9ldmVudF9pZDsKKwl1OAlkYXRhWzE2XTsKK307CisKK3N0cnVjdCBwcWlfZXZlbnRfYWNrbm93bGVkZ2VfcmVxdWVzdCB7CisJc3RydWN0IHBxaV9pdV9oZWFkZXIgaGVhZGVyOworCXU4CWV2ZW50X3R5cGU7CisJdTgJcmVzZXJ2ZWQyOworCV9fbGUxNglldmVudF9pZDsKKwlfX2xlMzIJYWRkaXRpb25hbF9ldmVudF9pZDsKK307CisKK3N0cnVjdCBwcWlfdGFza19tYW5hZ2VtZW50X3JlcXVlc3QgeworCXN0cnVjdCBwcWlfaXVfaGVhZGVyIGhlYWRlcjsKKwlfX2xlMTYJcmVxdWVzdF9pZDsKKwlfX2xlMTYJbmV4dXNfaWQ7CisJdTgJcmVzZXJ2ZWRbNF07CisJdTgJbHVuX251bWJlcls4XTsKKwlfX2xlMTYJcHJvdG9jb2xfc3BlY2lmaWM7CisJX19sZTE2CW91dGJvdW5kX3F1ZXVlX2lkX3RvX21hbmFnZTsKKwlfX2xlMTYJcmVxdWVzdF9pZF90b19tYW5hZ2U7CisJdTgJdGFza19tYW5hZ2VtZW50X2Z1bmN0aW9uOworCXU4CXJlc2VydmVkMiA6IDc7CisJdTgJZmVuY2UgOiAxOworfTsKKworI2RlZmluZSBTT1BfVEFTS19NQU5BR0VNRU5UX0xVTl9SRVNFVAkweDgKKworc3RydWN0IHBxaV90YXNrX21hbmFnZW1lbnRfcmVzcG9uc2UgeworCXN0cnVjdCBwcWlfaXVfaGVhZGVyIGhlYWRlcjsKKwlfX2xlMTYJcmVxdWVzdF9pZDsKKwlfX2xlMTYJbmV4dXNfaWQ7CisJdTgJYWRkaXRpb25hbF9yZXNwb25zZV9pbmZvWzNdOworCXU4CXJlc3BvbnNlX2NvZGU7Cit9OworCitzdHJ1Y3QgcHFpX2Fpb19lcnJvcl9pbmZvIHsKKwl1OAlzdGF0dXM7CisJdTgJc2VydmljZV9yZXNwb25zZTsKKwl1OAlkYXRhX3ByZXNlbnQ7CisJdTgJcmVzZXJ2ZWQ7CisJX19sZTMyCXJlc2lkdWFsX2NvdW50OworCV9fbGUxNglkYXRhX2xlbmd0aDsKKwlfX2xlMTYJcmVzZXJ2ZWQxOworCXU4CWRhdGFbMjU2XTsKK307CisKK3N0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvIHsKKwl1OAlkYXRhX2luX3Jlc3VsdDsKKwl1OAlkYXRhX291dF9yZXN1bHQ7CisJdTgJcmVzZXJ2ZWRbM107CisJdTgJc3RhdHVzOworCV9fbGUxNglzdGF0dXNfcXVhbGlmaWVyOworCV9fbGUxNglzZW5zZV9kYXRhX2xlbmd0aDsKKwlfX2xlMTYJcmVzcG9uc2VfZGF0YV9sZW5ndGg7CisJX19sZTMyCWRhdGFfaW5fdHJhbnNmZXJyZWQ7CisJX19sZTMyCWRhdGFfb3V0X3RyYW5zZmVycmVkOworCXU4CWRhdGFbMjU2XTsKK307CisKKyNkZWZpbmUgUFFJX1JFUVVFU1RfSVVfVEFTS19NQU5BR0VNRU5UCQkJMHgxMworI2RlZmluZSBQUUlfUkVRVUVTVF9JVV9SQUlEX1BBVEhfSU8JCQkweDE0CisjZGVmaW5lIFBRSV9SRVFVRVNUX0lVX0FJT19QQVRIX0lPCQkJMHgxNQorI2RlZmluZSBQUUlfUkVRVUVTVF9JVV9HRU5FUkFMX0FETUlOCQkJMHg2MAorI2RlZmluZSBQUUlfUkVRVUVTVF9JVV9SRVBPUlRfVkVORE9SX0VWRU5UX0NPTkZJRwkweDcyCisjZGVmaW5lIFBRSV9SRVFVRVNUX0lVX1NFVF9WRU5ET1JfRVZFTlRfQ09ORklHCQkweDczCisjZGVmaW5lIFBRSV9SRVFVRVNUX0lVX0FDS05PV0xFREdFX1ZFTkRPUl9FVkVOVAkJMHhmNgorCisjZGVmaW5lIFBRSV9SRVNQT05TRV9JVV9HRU5FUkFMX01BTkFHRU1FTlQJCTB4ODEKKyNkZWZpbmUgUFFJX1JFU1BPTlNFX0lVX1RBU0tfTUFOQUdFTUVOVAkJCTB4OTMKKyNkZWZpbmUgUFFJX1JFU1BPTlNFX0lVX0dFTkVSQUxfQURNSU4JCQkweGUwCisjZGVmaW5lIFBRSV9SRVNQT05TRV9JVV9SQUlEX1BBVEhfSU9fU1VDQ0VTUwkJMHhmMAorI2RlZmluZSBQUUlfUkVTUE9OU0VfSVVfQUlPX1BBVEhfSU9fU1VDQ0VTUwkJMHhmMQorI2RlZmluZSBQUUlfUkVTUE9OU0VfSVVfUkFJRF9QQVRIX0lPX0VSUk9SCQkweGYyCisjZGVmaW5lIFBRSV9SRVNQT05TRV9JVV9BSU9fUEFUSF9JT19FUlJPUgkJMHhmMworI2RlZmluZSBQUUlfUkVTUE9OU0VfSVVfQUlPX1BBVEhfRElTQUJMRUQJCTB4ZjQKKyNkZWZpbmUgUFFJX1JFU1BPTlNFX0lVX1ZFTkRPUl9FVkVOVAkJCTB4ZjUKKworI2RlZmluZSBQUUlfR0VORVJBTF9BRE1JTl9GVU5DVElPTl9SRVBPUlRfREVWSUNFX0NBUEFCSUxJVFkJMHgwCisjZGVmaW5lIFBRSV9HRU5FUkFMX0FETUlOX0ZVTkNUSU9OX0NSRUFURV9JUQkJCTB4MTAKKyNkZWZpbmUgUFFJX0dFTkVSQUxfQURNSU5fRlVOQ1RJT05fQ1JFQVRFX09RCQkJMHgxMQorI2RlZmluZSBQUUlfR0VORVJBTF9BRE1JTl9GVU5DVElPTl9ERUxFVEVfSVEJCQkweDEyCisjZGVmaW5lIFBRSV9HRU5FUkFMX0FETUlOX0ZVTkNUSU9OX0RFTEVURV9PUQkJCTB4MTMKKyNkZWZpbmUgUFFJX0dFTkVSQUxfQURNSU5fRlVOQ1RJT05fQ0hBTkdFX0lRX1BST1BFUlRZCQkweDE0CisKKyNkZWZpbmUgUFFJX0dFTkVSQUxfQURNSU5fU1RBVFVTX1NVQ0NFU1MJMHgwCisKKyNkZWZpbmUgUFFJX0lRX1BST1BFUlRZX0lTX0FJT19RVUVVRQkweDEKKworI2RlZmluZSBQUUlfR0VORVJBTF9BRE1JTl9JVV9MRU5HVEgJCTB4M2MKKyNkZWZpbmUgUFFJX1BST1RPQ09MX1NPUAkJCTB4MAorCisjZGVmaW5lIFBRSV9EQVRBX0lOX09VVF9HT09ECQkJCQkweDAKKyNkZWZpbmUgUFFJX0RBVEFfSU5fT1VUX1VOREVSRkxPVwkJCQkweDEKKyNkZWZpbmUgUFFJX0RBVEFfSU5fT1VUX0JVRkZFUl9FUlJPUgkJCQkweDQwCisjZGVmaW5lIFBRSV9EQVRBX0lOX09VVF9CVUZGRVJfT1ZFUkZMT1cJCQkJMHg0MQorI2RlZmluZSBQUUlfREFUQV9JTl9PVVRfQlVGRkVSX09WRVJGTE9XX0RFU0NSSVBUT1JfQVJFQQkJMHg0MgorI2RlZmluZSBQUUlfREFUQV9JTl9PVVRfQlVGRkVSX09WRVJGTE9XX0JSSURHRQkJCTB4NDMKKyNkZWZpbmUgUFFJX0RBVEFfSU5fT1VUX1BDSUVfRkFCUklDX0VSUk9SCQkJMHg2MAorI2RlZmluZSBQUUlfREFUQV9JTl9PVVRfUENJRV9DT01QTEVUSU9OX1RJTUVPVVQJCQkweDYxCisjZGVmaW5lIFBRSV9EQVRBX0lOX09VVF9QQ0lFX0NPTVBMRVRFUl9BQk9SVF9SRUNFSVZFRAkJMHg2MgorI2RlZmluZSBQUUlfREFUQV9JTl9PVVRfUENJRV9VTlNVUFBPUlRFRF9SRVFVRVNUX1JFQ0VJVkVECTB4NjMKKyNkZWZpbmUgUFFJX0RBVEFfSU5fT1VUX1BDSUVfRUNSQ19DSEVDS19GQUlMRUQJCQkweDY0CisjZGVmaW5lIFBRSV9EQVRBX0lOX09VVF9QQ0lFX1VOU1VQUE9SVEVEX1JFUVVFU1QJCTB4NjUKKyNkZWZpbmUgUFFJX0RBVEFfSU5fT1VUX1BDSUVfQUNTX1ZJT0xBVElPTgkJCTB4NjYKKyNkZWZpbmUgUFFJX0RBVEFfSU5fT1VUX1BDSUVfVExQX1BSRUZJWF9CTE9DS0VECQkJMHg2NworI2RlZmluZSBQUUlfREFUQV9JTl9PVVRfUENJRV9QT0lTT05FRF9NRU1PUllfUkVBRAkJMHg2RgorI2RlZmluZSBQUUlfREFUQV9JTl9PVVRfRVJST1IJCQkJCTB4ZjAKKyNkZWZpbmUgUFFJX0RBVEFfSU5fT1VUX1BST1RPQ09MX0VSUk9SCQkJCTB4ZjEKKyNkZWZpbmUgUFFJX0RBVEFfSU5fT1VUX0hBUkRXQVJFX0VSUk9SCQkJCTB4ZjIKKyNkZWZpbmUgUFFJX0RBVEFfSU5fT1VUX1VOU09MSUNJVEVEX0FCT1JUCQkJMHhmMworI2RlZmluZSBQUUlfREFUQV9JTl9PVVRfQUJPUlRFRAkJCQkJMHhmNAorI2RlZmluZSBQUUlfREFUQV9JTl9PVVRfVElNRU9VVAkJCQkJMHhmNQorCisjZGVmaW5lIENJU1NfQ01EX1NUQVRVU19TVUNDRVNTCQkJMHgwCisjZGVmaW5lIENJU1NfQ01EX1NUQVRVU19UQVJHRVRfU1RBVFVTCQkweDEKKyNkZWZpbmUgQ0lTU19DTURfU1RBVFVTX0RBVEFfVU5ERVJSVU4JCTB4MgorI2RlZmluZSBDSVNTX0NNRF9TVEFUVVNfREFUQV9PVkVSUlVOCQkweDMKKyNkZWZpbmUgQ0lTU19DTURfU1RBVFVTX0lOVkFMSUQJCQkweDQKKyNkZWZpbmUgQ0lTU19DTURfU1RBVFVTX1BST1RPQ09MX0VSUk9SCQkweDUKKyNkZWZpbmUgQ0lTU19DTURfU1RBVFVTX0hBUkRXQVJFX0VSUk9SCQkweDYKKyNkZWZpbmUgQ0lTU19DTURfU1RBVFVTX0NPTk5FQ1RJT05fTE9TVAkJMHg3CisjZGVmaW5lIENJU1NfQ01EX1NUQVRVU19BQk9SVEVECQkJMHg4CisjZGVmaW5lIENJU1NfQ01EX1NUQVRVU19BQk9SVF9GQUlMRUQJCTB4OQorI2RlZmluZSBDSVNTX0NNRF9TVEFUVVNfVU5TT0xJQ0lURURfQUJPUlQJMHhhCisjZGVmaW5lIENJU1NfQ01EX1NUQVRVU19USU1FT1VUCQkJMHhiCisjZGVmaW5lIENJU1NfQ01EX1NUQVRVU19VTkFCT1JUQUJMRQkJMHhjCisjZGVmaW5lIENJU1NfQ01EX1NUQVRVU19UTUYJCQkweGQKKyNkZWZpbmUgQ0lTU19DTURfU1RBVFVTX0FJT19ESVNBQkxFRAkJMHhlCisKKyNkZWZpbmUgUFFJX05VTV9FVkVOVF9RVUVVRV9FTEVNRU5UUwkzMgorI2RlZmluZSBQUUlfRVZFTlRfT1FfRUxFTUVOVF9MRU5HVEgJc2l6ZW9mKHN0cnVjdCBwcWlfZXZlbnRfcmVzcG9uc2UpCisKKyNkZWZpbmUgUFFJX0VWRU5UX1RZUEVfSE9UUExVRwkJCTB4MQorI2RlZmluZSBQUUlfRVZFTlRfVFlQRV9IQVJEV0FSRQkJCTB4MgorI2RlZmluZSBQUUlfRVZFTlRfVFlQRV9QSFlTSUNBTF9ERVZJQ0UJCTB4NAorI2RlZmluZSBQUUlfRVZFTlRfVFlQRV9MT0dJQ0FMX0RFVklDRQkJMHg1CisjZGVmaW5lIFBRSV9FVkVOVF9UWVBFX0FJT19TVEFURV9DSEFOR0UJCTB4ZmQKKyNkZWZpbmUgUFFJX0VWRU5UX1RZUEVfQUlPX0NPTkZJR19DSEFOR0UJMHhmZQorI2RlZmluZSBQUUlfRVZFTlRfVFlQRV9IRUFSVEJFQVQJCTB4ZmYKKworI3ByYWdtYSBwYWNrKCkKKworI2RlZmluZSBQUUlfRVJST1JfQlVGRkVSX0VMRU1FTlRfTEVOR1RICQlcCisJc2l6ZW9mKHN0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvKQorCisvKiB0aGVzZSB2YWx1ZXMgYXJlIGJhc2VkIG9uIG91ciBpbXBsZW1lbnRhdGlvbiAqLworI2RlZmluZSBQUUlfQURNSU5fSVFfTlVNX0VMRU1FTlRTCQk4CisjZGVmaW5lIFBRSV9BRE1JTl9PUV9OVU1fRUxFTUVOVFMJCTIwCisjZGVmaW5lIFBRSV9BRE1JTl9JUV9FTEVNRU5UX0xFTkdUSAkJNjQKKyNkZWZpbmUgUFFJX0FETUlOX09RX0VMRU1FTlRfTEVOR1RICQk2NAorCisjZGVmaW5lIFBRSV9PUEVSQVRJT05BTF9JUV9FTEVNRU5UX0xFTkdUSAkxMjgKKyNkZWZpbmUgUFFJX09QRVJBVElPTkFMX09RX0VMRU1FTlRfTEVOR1RICTE2CisKKyNkZWZpbmUgUFFJX01JTl9NU0lYX1ZFQ1RPUlMJCTEKKyNkZWZpbmUgUFFJX01BWF9NU0lYX1ZFQ1RPUlMJCTY0CisKKy8qIHRoZXNlIHZhbHVlcyBhcmUgZGVmaW5lZCBieSB0aGUgUFFJIHNwZWMgKi8KKyNkZWZpbmUgUFFJX01BWF9OVU1fRUxFTUVOVFNfQURNSU5fUVVFVUUJMjU1CisjZGVmaW5lIFBRSV9NQVhfTlVNX0VMRU1FTlRTX09QRVJBVElPTkFMX1FVRVVFCTY1NTM1CisjZGVmaW5lIFBRSV9RVUVVRV9FTEVNRU5UX0FSUkFZX0FMSUdOTUVOVAk2NAorI2RlZmluZSBQUUlfUVVFVUVfRUxFTUVOVF9MRU5HVEhfQUxJR05NRU5UCTE2CisjZGVmaW5lIFBRSV9BRE1JTl9JTkRFWF9BTElHTk1FTlQJCTY0CisjZGVmaW5lIFBRSV9PUEVSQVRJT05BTF9JTkRFWF9BTElHTk1FTlQJCTQKKworI2RlZmluZSBQUUlfTUlOX09QRVJBVElPTkFMX1FVRVVFX0lECQkxCisjZGVmaW5lIFBRSV9NQVhfT1BFUkFUSU9OQUxfUVVFVUVfSUQJCTY1NTM1CisKKyNkZWZpbmUgUFFJX0FJT19TRVJWX1JFU1BPTlNFX0NPTVBMRVRFCQkwCisjZGVmaW5lIFBRSV9BSU9fU0VSVl9SRVNQT05TRV9GQUlMVVJFCQkxCisjZGVmaW5lIFBRSV9BSU9fU0VSVl9SRVNQT05TRV9UTUZfQ09NUExFVEUJMgorI2RlZmluZSBQUUlfQUlPX1NFUlZfUkVTUE9OU0VfVE1GX1NVQ0NFRURFRAkzCisjZGVmaW5lIFBRSV9BSU9fU0VSVl9SRVNQT05TRV9UTUZfUkVKRUNURUQJNAorI2RlZmluZSBQUUlfQUlPX1NFUlZfUkVTUE9OU0VfVE1GX0lOQ09SUkVDVF9MVU4JNQorCisjZGVmaW5lIFBRSV9BSU9fU1RBVFVTX0lPX0VSUk9SCQkJMHgxCisjZGVmaW5lIFBRSV9BSU9fU1RBVFVTX0lPX0FCT1JURUQJCTB4MgorI2RlZmluZSBQUUlfQUlPX1NUQVRVU19OT19QQVRIX1RPX0RFVklDRQkweDMKKyNkZWZpbmUgUFFJX0FJT19TVEFUVVNfSU5WQUxJRF9ERVZJQ0UJCTB4NAorI2RlZmluZSBQUUlfQUlPX1NUQVRVU19BSU9fUEFUSF9ESVNBQkxFRAkweGUKKyNkZWZpbmUgUFFJX0FJT19TVEFUVVNfVU5ERVJSVU4JCQkweDUxCisjZGVmaW5lIFBRSV9BSU9fU1RBVFVTX09WRVJSVU4JCQkweDc1CisKK3R5cGVkZWYgdTMyIHBxaV9pbmRleF90OworCisvKiBTT1AgZGF0YSBkaXJlY3Rpb24gZmxhZ3MgKi8KKyNkZWZpbmUgU09QX05PX0RJUkVDVElPTl9GTEFHCTAKKyNkZWZpbmUgU09QX1dSSVRFX0ZMQUcJCTEJLyogaG9zdCB3cml0ZXMgZGF0YSB0byBEYXRhLU91dCAqLworCQkJCQkvKiBidWZmZXIgKi8KKyNkZWZpbmUgU09QX1JFQURfRkxBRwkJMgkvKiBob3N0IHJlY2VpdmVzIGRhdGEgZnJvbSBEYXRhLUluICovCisJCQkJCS8qIGJ1ZmZlciAqLworI2RlZmluZSBTT1BfQklESVJFQ1RJT05BTAkzCS8qIGRhdGEgaXMgdHJhbnNmZXJyZWQgZnJvbSB0aGUgKi8KKwkJCQkJLyogRGF0YS1PdXQgYnVmZmVyIGFuZCBkYXRhIGlzICovCisJCQkJCS8qIHRyYW5zZmVycmVkIHRvIHRoZSBEYXRhLUluIGJ1ZmZlciAqLworCisjZGVmaW5lIFNPUF9UQVNLX0FUVFJJQlVURV9TSU1QTEUJCTAKKyNkZWZpbmUgU09QX1RBU0tfQVRUUklCVVRFX0hFQURfT0ZfUVVFVUUJMQorI2RlZmluZSBTT1BfVEFTS19BVFRSSUJVVEVfT1JERVJFRAkJMgorI2RlZmluZSBTT1BfVEFTS19BVFRSSUJVVEVfQUNBCQkJNAorCisjZGVmaW5lIFNPUF9UTUZfQ09NUExFVEUJCTB4MAorI2RlZmluZSBTT1BfVE1GX0ZVTkNUSU9OX1NVQ0NFRURFRAkweDgKKworLyogYWRkaXRpb25hbCBDREIgYnl0ZXMgdXNhZ2UgZmllbGQgY29kZXMgKi8KKyNkZWZpbmUgU09QX0FERElUSU9OQUxfQ0RCX0JZVEVTXzAJMAkvKiAxNi1ieXRlIENEQiAqLworI2RlZmluZSBTT1BfQURESVRJT05BTF9DREJfQllURVNfNAkxCS8qIDIwLWJ5dGUgQ0RCICovCisjZGVmaW5lIFNPUF9BRERJVElPTkFMX0NEQl9CWVRFU184CTIJLyogMjQtYnl0ZSBDREIgKi8KKyNkZWZpbmUgU09QX0FERElUSU9OQUxfQ0RCX0JZVEVTXzEyCTMJLyogMjgtYnl0ZSBDREIgKi8KKyNkZWZpbmUgU09QX0FERElUSU9OQUxfQ0RCX0JZVEVTXzE2CTQJLyogMzItYnl0ZSBDREIgKi8KKworLyoKKyAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3RydWN0dXJlIGlzIHRvIG9idGFpbiBwcm9wZXIgYWxpZ25tZW50IG9mIG9iamVjdHMgaW4KKyAqIGFuIGFkbWluIHF1ZXVlIHBhaXIuCisgKi8KK3N0cnVjdCBwcWlfYWRtaW5fcXVldWVzX2FsaWduZWQgeworCV9fYWxpZ25lZChQUUlfUVVFVUVfRUxFTUVOVF9BUlJBWV9BTElHTk1FTlQpCisJCXU4CWlxX2VsZW1lbnRfYXJyYXlbUFFJX0FETUlOX0lRX0VMRU1FTlRfTEVOR1RIXQorCQkJCQlbUFFJX0FETUlOX0lRX05VTV9FTEVNRU5UU107CisJX19hbGlnbmVkKFBRSV9RVUVVRV9FTEVNRU5UX0FSUkFZX0FMSUdOTUVOVCkKKwkJdTgJb3FfZWxlbWVudF9hcnJheVtQUUlfQURNSU5fT1FfRUxFTUVOVF9MRU5HVEhdCisJCQkJCVtQUUlfQURNSU5fT1FfTlVNX0VMRU1FTlRTXTsKKwlfX2FsaWduZWQoUFFJX0FETUlOX0lOREVYX0FMSUdOTUVOVCkgcHFpX2luZGV4X3QgaXFfY2k7CisJX19hbGlnbmVkKFBRSV9BRE1JTl9JTkRFWF9BTElHTk1FTlQpIHBxaV9pbmRleF90IG9xX3BpOworfTsKKworc3RydWN0IHBxaV9hZG1pbl9xdWV1ZXMgeworCXZvaWQJCSppcV9lbGVtZW50X2FycmF5OworCXZvaWQJCSpvcV9lbGVtZW50X2FycmF5OworCXZvbGF0aWxlIHBxaV9pbmRleF90ICppcV9jaTsKKwl2b2xhdGlsZSBwcWlfaW5kZXhfdCAqb3FfcGk7CisJZG1hX2FkZHJfdAlpcV9lbGVtZW50X2FycmF5X2J1c19hZGRyOworCWRtYV9hZGRyX3QJb3FfZWxlbWVudF9hcnJheV9idXNfYWRkcjsKKwlkbWFfYWRkcl90CWlxX2NpX2J1c19hZGRyOworCWRtYV9hZGRyX3QJb3FfcGlfYnVzX2FkZHI7CisJX19sZTMyIF9faW9tZW0JKmlxX3BpOworCXBxaV9pbmRleF90CWlxX3BpX2NvcHk7CisJX19sZTMyIF9faW9tZW0JKm9xX2NpOworCXBxaV9pbmRleF90CW9xX2NpX2NvcHk7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXUxNgkJaW50X21zZ19udW07Cit9OworCitzdHJ1Y3QgcHFpX3F1ZXVlX2dyb3VwIHsKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvOwkvKiBiYWNrcG9pbnRlciAqLworCXUxNgkJaXFfaWRbMl07CisJdTE2CQlvcV9pZDsKKwl1MTYJCWludF9tc2dfbnVtOworCXZvaWQJCSppcV9lbGVtZW50X2FycmF5WzJdOworCXZvaWQJCSpvcV9lbGVtZW50X2FycmF5OworCWRtYV9hZGRyX3QJaXFfZWxlbWVudF9hcnJheV9idXNfYWRkclsyXTsKKwlkbWFfYWRkcl90CW9xX2VsZW1lbnRfYXJyYXlfYnVzX2FkZHI7CisJX19sZTMyIF9faW9tZW0JKmlxX3BpWzJdOworCXBxaV9pbmRleF90CWlxX3BpX2NvcHlbMl07CisJdm9sYXRpbGUgcHFpX2luZGV4X3QgKmlxX2NpWzJdOworCXZvbGF0aWxlIHBxaV9pbmRleF90ICpvcV9waTsKKwlkbWFfYWRkcl90CWlxX2NpX2J1c19hZGRyWzJdOworCWRtYV9hZGRyX3QJb3FfcGlfYnVzX2FkZHI7CisJX19sZTMyIF9faW9tZW0JKm9xX2NpOworCXBxaV9pbmRleF90CW9xX2NpX2NvcHk7CisJc3BpbmxvY2tfdAlzdWJtaXRfbG9ja1syXTsJLyogcHJvdGVjdCBzdWJtaXNzaW9uIHF1ZXVlICovCisJc3RydWN0IGxpc3RfaGVhZCByZXF1ZXN0X2xpc3RbMl07Cit9OworCitzdHJ1Y3QgcHFpX2V2ZW50X3F1ZXVlIHsKKwl1MTYJCW9xX2lkOworCXUxNgkJaW50X21zZ19udW07CisJdm9pZAkJKm9xX2VsZW1lbnRfYXJyYXk7CisJdm9sYXRpbGUgcHFpX2luZGV4X3QgKm9xX3BpOworCWRtYV9hZGRyX3QJb3FfZWxlbWVudF9hcnJheV9idXNfYWRkcjsKKwlkbWFfYWRkcl90CW9xX3BpX2J1c19hZGRyOworCV9fbGUzMiBfX2lvbWVtCSpvcV9jaTsKKwlwcWlfaW5kZXhfdAlvcV9jaV9jb3B5OworfTsKKworI2RlZmluZSBQUUlfREVGQVVMVF9RVUVVRV9HUk9VUAkJMAorI2RlZmluZSBQUUlfTUFYX1FVRVVFX0dST1VQUwkJUFFJX01BWF9NU0lYX1ZFQ1RPUlMKKworc3RydWN0IHBxaV9lbmNyeXB0aW9uX2luZm8geworCXUxNglkYXRhX2VuY3J5cHRpb25fa2V5X2luZGV4OworCXUzMgllbmNyeXB0X3R3ZWFrX2xvd2VyOworCXUzMgllbmNyeXB0X3R3ZWFrX3VwcGVyOworfTsKKworI2RlZmluZSBQUUlfTUFYX09VVFNUQU5ESU5HX1JFUVVFU1RTCSgodTMyKX4wKQorI2RlZmluZSBQUUlfTUFYX1RSQU5TRkVSX1NJWkUJCSg0ICogMTAyNFUgKiAxMDI0VSkKKworI2RlZmluZSBSQUlEX01BUF9NQVhfRU5UUklFUwkJMTAyNAorCisjZGVmaW5lIFBRSV9QSFlTSUNBTF9ERVZJQ0VfQlVTCQkwCisjZGVmaW5lIFBRSV9SQUlEX1ZPTFVNRV9CVVMJCTEKKyNkZWZpbmUgUFFJX0hCQV9CVVMJCQkyCisjZGVmaW5lIFBRSV9NQVhfQlVTCQkJUFFJX0hCQV9CVVMKKworI3ByYWdtYSBwYWNrKDEpCisKK3N0cnVjdCByZXBvcnRfbHVuX2hlYWRlciB7CisJX19iZTMyCWxpc3RfbGVuZ3RoOworCXU4CWV4dGVuZGVkX3Jlc3BvbnNlOworCXU4CXJlc2VydmVkWzNdOworfTsKKworc3RydWN0IHJlcG9ydF9sb2dfbHVuX2V4dGVuZGVkX2VudHJ5IHsKKwl1OAlsdW5pZFs4XTsKKwl1OAl2b2x1bWVfaWRbMTZdOworfTsKKworc3RydWN0IHJlcG9ydF9sb2dfbHVuX2V4dGVuZGVkIHsKKwlzdHJ1Y3QgcmVwb3J0X2x1bl9oZWFkZXIgaGVhZGVyOworCXN0cnVjdCByZXBvcnRfbG9nX2x1bl9leHRlbmRlZF9lbnRyeSBsdW5fZW50cmllc1sxXTsKK307CisKK3N0cnVjdCByZXBvcnRfcGh5c19sdW5fZXh0ZW5kZWRfZW50cnkgeworCXU4CWx1bmlkWzhdOworCV9fYmU2NAl3d2lkOworCXU4CWRldmljZV90eXBlOworCXU4CWRldmljZV9mbGFnczsKKwl1OAlsdW5fY291bnQ7CS8qIG51bWJlciBvZiBMVU5zIGluIGEgbXVsdGktTFVOIGRldmljZSAqLworCXU4CXJlZHVuZGFudF9wYXRoczsKKwl1MzIJYWlvX2hhbmRsZTsKK307CisKKy8qIGZvciBkZXZpY2VfZmxhZ3MgZmllbGQgb2Ygc3RydWN0IHJlcG9ydF9waHlzX2x1bl9leHRlbmRlZF9lbnRyeSAqLworI2RlZmluZSBSRVBPUlRfUEhZU19MVU5fREVWX0ZMQUdfTk9OX0RJU0sJMHgxCisjZGVmaW5lIFJFUE9SVF9QSFlTX0xVTl9ERVZfRkxBR19BSU9fRU5BQkxFRAkweDgKKworc3RydWN0IHJlcG9ydF9waHlzX2x1bl9leHRlbmRlZCB7CisJc3RydWN0IHJlcG9ydF9sdW5faGVhZGVyIGhlYWRlcjsKKwlzdHJ1Y3QgcmVwb3J0X3BoeXNfbHVuX2V4dGVuZGVkX2VudHJ5IGx1bl9lbnRyaWVzWzFdOworfTsKKworc3RydWN0IHJhaWRfbWFwX2Rpc2tfZGF0YSB7CisJdTMyCWFpb19oYW5kbGU7CisJdTgJeG9yX211bHRbMl07CisJdTgJcmVzZXJ2ZWRbMl07Cit9OworCisvKiBjb25zdGFudHMgZm9yIGZsYWdzIGZpZWxkIG9mIFJBSUQgbWFwICovCisjZGVmaW5lIFJBSURfTUFQX0VOQ1JZUFRJT05fRU5BQkxFRAkweDEKKworc3RydWN0IHJhaWRfbWFwIHsKKwlfX2xlMzIJc3RydWN0dXJlX3NpemU7CQkvKiBzaXplIG9mIGVudGlyZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKwlfX2xlMzIJdm9sdW1lX2Jsa19zaXplOwkvKiBieXRlcyAvIGJsb2NrIGluIHRoZSB2b2x1bWUgKi8KKwlfX2xlNjQJdm9sdW1lX2Jsa19jbnQ7CQkvKiBsb2dpY2FsIGJsb2NrcyBvbiB0aGUgdm9sdW1lICovCisJdTgJcGh5c19ibGtfc2hpZnQ7CQkvKiBzaGlmdCBmYWN0b3IgdG8gY29udmVydCBiZXR3ZWVuICovCisJCQkJCS8qIHVuaXRzIG9mIGxvZ2ljYWwgYmxvY2tzIGFuZCAqLworCQkJCQkvKiBwaHlzaWNhbCBkaXNrIGJsb2NrcyAqLworCXU4CXBhcml0eV9yb3RhdGlvbl9zaGlmdDsJLyogc2hpZnQgZmFjdG9yIHRvIGNvbnZlcnQgYmV0d2VlbiAqLworCQkJCQkvKiB1bml0cyBvZiBsb2dpY2FsIHN0cmlwZXMgYW5kICovCisJCQkJCS8qIHBoeXNpY2FsIHN0cmlwZXMgKi8KKwlfX2xlMTYJc3RyaXBfc2l6ZTsJCS8qIGJsb2NrcyB1c2VkIG9uIGVhY2ggZGlzayAvIHN0cmlwZSAqLworCV9fbGU2NAlkaXNrX3N0YXJ0aW5nX2JsazsJLyogZmlyc3QgZGlzayBibG9jayB1c2VkIGluIHZvbHVtZSAqLworCV9fbGU2NAlkaXNrX2Jsa19jbnQ7CQkvKiBkaXNrIGJsb2NrcyB1c2VkIGJ5IHZvbHVtZSAvIGRpc2sgKi8KKwlfX2xlMTYJZGF0YV9kaXNrc19wZXJfcm93OwkvKiBkYXRhIGRpc2sgZW50cmllcyAvIHJvdyBpbiB0aGUgbWFwICovCisJX19sZTE2CW1ldGFkYXRhX2Rpc2tzX3Blcl9yb3c7CS8qIG1pcnJvci9wYXJpdHkgZGlzayBlbnRyaWVzIC8gcm93ICovCisJCQkJCS8qIGluIHRoZSBtYXAgKi8KKwlfX2xlMTYJcm93X2NudDsJCS8qIHJvd3MgaW4gZWFjaCBsYXlvdXQgbWFwICovCisJX19sZTE2CWxheW91dF9tYXBfY291bnQ7CS8qIGxheW91dCBtYXBzICgxIG1hcCBwZXIgKi8KKwkJCQkJLyogbWlycm9yIHBhcml0eSBncm91cCkgKi8KKwlfX2xlMTYJZmxhZ3M7CisJX19sZTE2CWRhdGFfZW5jcnlwdGlvbl9rZXlfaW5kZXg7CisJdTgJcmVzZXJ2ZWRbMTZdOworCXN0cnVjdCByYWlkX21hcF9kaXNrX2RhdGEgZGlza19kYXRhW1JBSURfTUFQX01BWF9FTlRSSUVTXTsKK307CisKKyNwcmFnbWEgcGFjaygpCisKKyNkZWZpbmUgUkFJRF9DVExSX0xVTklECQkiXDBcMFwwXDBcMFwwXDBcMCIKKworc3RydWN0IHBxaV9zY3NpX2RldiB7CisJaW50CWRldnR5cGU7CQkvKiBhcyByZXBvcnRlZCBieSBJTlFVSVJZIGNvbW1tYW5kICovCisJdTgJZGV2aWNlX3R5cGU7CQkvKiBhcyByZXBvcnRlZCBieSAqLworCQkJCQkvKiBCTUlDX0lERU5USUZZX1BIWVNJQ0FMX0RFVklDRSAqLworCQkJCQkvKiBvbmx5IHZhbGlkIGZvciBkZXZ0eXBlID0gVFlQRV9ESVNLICovCisJaW50CWJ1czsKKwlpbnQJdGFyZ2V0OworCWludAlsdW47CisJdTgJc2NzaTNhZGRyWzhdOworCV9fYmU2NAl3d2lkOworCXU4CXZvbHVtZV9pZFsxNl07CisJdTgJaXNfcGh5c2ljYWxfZGV2aWNlIDogMTsKKwl1OAl0YXJnZXRfbHVuX3ZhbGlkIDogMTsKKwl1OAlleHBvc2VfZGV2aWNlIDogMTsKKwl1OAlub191bGRfYXR0YWNoIDogMTsKKwl1OAlhaW9fZW5hYmxlZCA6IDE7CS8qIG9ubHkgdmFsaWQgZm9yIHBoeXNpY2FsIGRpc2tzICovCisJdTgJZGV2aWNlX2dvbmUgOiAxOworCXU4CW5ld19kZXZpY2UgOiAxOworCXU4CWtlZXBfZGV2aWNlIDogMTsKKwl1OAl2b2x1bWVfb2ZmbGluZSA6IDE7CisJdTgJdmVuZG9yWzhdOwkJLyogYnl0ZXMgOC0xNSBvZiBpbnF1aXJ5IGRhdGEgKi8KKwl1OAltb2RlbFsxNl07CQkvKiBieXRlcyAxNi0zMSBvZiBpbnF1aXJ5IGRhdGEgKi8KKwl1NjQJc2FzX2FkZHJlc3M7CisJdTgJcmFpZF9sZXZlbDsKKwl1MTYJcXVldWVfZGVwdGg7CQkvKiBtYXguIHF1ZXVlX2RlcHRoIGZvciB0aGlzIGRldmljZSAqLworCXUxNglhZHZlcnRpc2VkX3F1ZXVlX2RlcHRoOworCXUzMglhaW9faGFuZGxlOworCXU4CXZvbHVtZV9zdGF0dXM7CisJdTgJYWN0aXZlX3BhdGhfaW5kZXg7CisJdTgJcGF0aF9tYXA7CisJdTgJYmF5OworCXU4CWJveFs4XTsKKwl1MTYJcGh5c19jb25uZWN0b3JbOF07CisJaW50CW9mZmxvYWRfY29uZmlndXJlZDsJLyogSS9PIGFjY2VsIFJBSUQgb2ZmbG9hZCBjb25maWd1cmVkICovCisJaW50CW9mZmxvYWRfZW5hYmxlZDsJLyogSS9PIGFjY2VsIFJBSUQgb2ZmbG9hZCBlbmFibGVkICovCisJaW50CW9mZmxvYWRfZW5hYmxlZF9wZW5kaW5nOworCWludAlvZmZsb2FkX3RvX21pcnJvcjsJLyogU2VuZCBuZXh0IEkvTyBhY2NlbGVyYXRvciBSQUlEICovCisJCQkJCS8qIG9mZmxvYWQgcmVxdWVzdCB0byBtaXJyb3IgZHJpdmUuICovCisJc3RydWN0IHJhaWRfbWFwICpyYWlkX21hcDsJLyogSS9PIGFjY2VsZXJhdG9yIFJBSUQgbWFwICovCisKKwlzdHJ1Y3QgcHFpX3Nhc19wb3J0ICpzYXNfcG9ydDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXY7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNjc2lfZGV2aWNlX2xpc3RfZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCBuZXdfZGV2aWNlX2xpc3RfZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCBhZGRfbGlzdF9lbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlbGV0ZV9saXN0X2VudHJ5OworfTsKKworLyogVlBEIGlucXVpcnkgcGFnZXMgKi8KKyNkZWZpbmUgU0NTSV9WUERfU1VQUE9SVEVEX1BBR0VTCTB4MAkvKiBzdGFuZGFyZCBwYWdlICovCisjZGVmaW5lIFNDU0lfVlBEX0RFVklDRV9JRAkJMHg4MwkvKiBzdGFuZGFyZCBwYWdlICovCisjZGVmaW5lIENJU1NfVlBEX0xWX0RFVklDRV9HRU9NRVRSWQkweGMxCS8qIHZlbmRvci1zcGVjaWZpYyBwYWdlICovCisjZGVmaW5lIENJU1NfVlBEX0xWX09GRkxPQURfU1RBVFVTCTB4YzIJLyogdmVuZG9yLXNwZWNpZmljIHBhZ2UgKi8KKyNkZWZpbmUgQ0lTU19WUERfTFZfU1RBVFVTCQkweGMzCS8qIHZlbmRvci1zcGVjaWZpYyBwYWdlICovCisKKyNkZWZpbmUgVlBEX1BBR0UJKDEgPDwgOCkKKworI3ByYWdtYSBwYWNrKDEpCisKKy8qIHN0cnVjdHVyZSBmb3IgQ0lTU19WUERfTFZfU1RBVFVTICovCitzdHJ1Y3QgY2lzc192cGRfbG9naWNhbF92b2x1bWVfc3RhdHVzIHsKKwl1OAlwZXJpcGhlcmFsX2luZm87CisJdTgJcGFnZV9jb2RlOworCXU4CXJlc2VydmVkOworCXU4CXBhZ2VfbGVuZ3RoOworCXU4CXZvbHVtZV9zdGF0dXM7CisJdTgJcmVzZXJ2ZWQyWzNdOworCV9fYmUzMglmbGFnczsKK307CisKKyNwcmFnbWEgcGFjaygpCisKKy8qIGNvbnN0YW50cyBmb3Igdm9sdW1lX3N0YXR1cyBmaWVsZCBvZiBjaXNzX3ZwZF9sb2dpY2FsX3ZvbHVtZV9zdGF0dXMgKi8KKyNkZWZpbmUgQ0lTU19MVl9PSwkJCQkJMAorI2RlZmluZSBDSVNTX0xWX0ZBSUxFRAkJCQkJMQorI2RlZmluZSBDSVNTX0xWX05PVF9DT05GSUdVUkVECQkJCTIKKyNkZWZpbmUgQ0lTU19MVl9ERUdSQURFRAkJCQkzCisjZGVmaW5lIENJU1NfTFZfUkVBRFlfRk9SX1JFQ09WRVJZCQkJNAorI2RlZmluZSBDSVNTX0xWX1VOREVSR09JTkdfUkVDT1ZFUlkJCQk1CisjZGVmaW5lIENJU1NfTFZfV1JPTkdfUEhZU0lDQUxfRFJJVkVfUkVQTEFDRUQJCTYKKyNkZWZpbmUgQ0lTU19MVl9QSFlTSUNBTF9EUklWRV9DT05ORUNUSU9OX1BST0JMRU0JNworI2RlZmluZSBDSVNTX0xWX0hBUkRXQVJFX09WRVJIRUFUSU5HCQkJOAorI2RlZmluZSBDSVNTX0xWX0hBUkRXQVJFX0hBU19PVkVSSEVBVEVECQkJOQorI2RlZmluZSBDSVNTX0xWX1VOREVSR09JTkdfRVhQQU5TSU9OCQkJMTAKKyNkZWZpbmUgQ0lTU19MVl9OT1RfQVZBSUxBQkxFCQkJCTExCisjZGVmaW5lIENJU1NfTFZfUVVFVUVEX0ZPUl9FWFBBTlNJT04JCQkxMgorI2RlZmluZSBDSVNTX0xWX0RJU0FCTEVEX1NDU0lfSURfQ09ORkxJQ1QJCTEzCisjZGVmaW5lIENJU1NfTFZfRUpFQ1RFRAkJCQkJMTQKKyNkZWZpbmUgQ0lTU19MVl9VTkRFUkdPSU5HX0VSQVNFCQkJMTUKKy8qIHN0YXRlIDE2IG5vdCB1c2VkICovCisjZGVmaW5lIENJU1NfTFZfUkVBRFlfRk9SX1BSRURJQ1RJVkVfU1BBUkVfUkVCVUlMRAkxNworI2RlZmluZSBDSVNTX0xWX1VOREVSR09JTkdfUlBJCQkJCTE4CisjZGVmaW5lIENJU1NfTFZfUEVORElOR19SUEkJCQkJMTkKKyNkZWZpbmUgQ0lTU19MVl9FTkNSWVBURURfTk9fS0VZCQkJMjAKKy8qIHN0YXRlIDIxIG5vdCB1c2VkICovCisjZGVmaW5lIENJU1NfTFZfVU5ERVJHT0lOR19FTkNSWVBUSU9OCQkJMjIKKyNkZWZpbmUgQ0lTU19MVl9VTkRFUkdPSU5HX0VOQ1JZUFRJT05fUkVLRVlJTkcJCTIzCisjZGVmaW5lIENJU1NfTFZfRU5DUllQVEVEX0lOX05PTl9FTkNSWVBURURfQ09OVFJPTExFUgkyNAorI2RlZmluZSBDSVNTX0xWX1BFTkRJTkdfRU5DUllQVElPTgkJCTI1CisjZGVmaW5lIENJU1NfTFZfUEVORElOR19FTkNSWVBUSU9OX1JFS0VZSU5HCQkyNgorI2RlZmluZSBDSVNTX0xWX05PVF9TVVBQT1JURUQJCQkJMjcKKyNkZWZpbmUgQ0lTU19MVl9TVEFUVVNfVU5BVkFJTEFCTEUJCQkyNTUKKworLyogY29uc3RhbnRzIGZvciBmbGFncyBmaWVsZCBvZiBjaXNzX3ZwZF9sb2dpY2FsX3ZvbHVtZV9zdGF0dXMgKi8KKyNkZWZpbmUgQ0lTU19MVl9GTEFHU19OT19IT1NUX0lPCTB4MQkvKiB2b2x1bWUgbm90IGF2YWlsYWJsZSBmb3IgKi8KKwkJCQkJCS8qIGhvc3QgSS9PICovCisKKy8qIGZvciBTQVMgaG9zdHMgYW5kIFNBUyBleHBhbmRlcnMgKi8KK3N0cnVjdCBwcWlfc2FzX25vZGUgeworCXN0cnVjdCBkZXZpY2UgKnBhcmVudF9kZXY7CisJc3RydWN0IGxpc3RfaGVhZCBwb3J0X2xpc3RfaGVhZDsKK307CisKK3N0cnVjdCBwcWlfc2FzX3BvcnQgeworCXN0cnVjdCBsaXN0X2hlYWQgcG9ydF9saXN0X2VudHJ5OworCXU2NAlzYXNfYWRkcmVzczsKKwlzdHJ1Y3Qgc2FzX3BvcnQgKnBvcnQ7CisJaW50CW5leHRfcGh5X2luZGV4OworCXN0cnVjdCBsaXN0X2hlYWQgcGh5X2xpc3RfaGVhZDsKKwlzdHJ1Y3QgcHFpX3Nhc19ub2RlICpwYXJlbnRfbm9kZTsKKwlzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHk7Cit9OworCitzdHJ1Y3QgcHFpX3Nhc19waHkgeworCXN0cnVjdCBsaXN0X2hlYWQgcGh5X2xpc3RfZW50cnk7CisJc3RydWN0IHNhc19waHkgKnBoeTsKKwlzdHJ1Y3QgcHFpX3Nhc19wb3J0ICpwYXJlbnRfcG9ydDsKKwlib29sCWFkZGVkX3RvX3BvcnQ7Cit9OworCitzdHJ1Y3QgcHFpX2lvX3JlcXVlc3QgeworCWF0b21pY190CXJlZmNvdW50OworCXUxNgkJaW5kZXg7CisJdm9pZCAoKmlvX2NvbXBsZXRlX2NhbGxiYWNrKShzdHJ1Y3QgcHFpX2lvX3JlcXVlc3QgKmlvX3JlcXVlc3QsCisJCXZvaWQgKmNvbnRleHQpOworCXZvaWQJCSpjb250ZXh0OworCWludAkJc3RhdHVzOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQ7CisJdm9pZAkJKmVycm9yX2luZm87CisJc3RydWN0IHBxaV9zZ19kZXNjcmlwdG9yICpzZ19jaGFpbl9idWZmZXI7CisJZG1hX2FkZHJfdAlzZ19jaGFpbl9idWZmZXJfZG1hX2hhbmRsZTsKKwl2b2lkCQkqaXU7CisJc3RydWN0IGxpc3RfaGVhZCByZXF1ZXN0X2xpc3RfZW50cnk7Cit9OworCisvKiBmb3IgaW5kZXhpbmcgaW50byB0aGUgcGVuZGluZ19ldmVudHNbXSBmaWVsZCBvZiBzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqLworI2RlZmluZSBQUUlfRVZFTlRfSEVBUlRCRUFUCQkwCisjZGVmaW5lIFBRSV9FVkVOVF9IT1RQTFVHCQkxCisjZGVmaW5lIFBRSV9FVkVOVF9IQVJEV0FSRQkJMgorI2RlZmluZSBQUUlfRVZFTlRfUEhZU0lDQUxfREVWSUNFCTMKKyNkZWZpbmUgUFFJX0VWRU5UX0xPR0lDQUxfREVWSUNFCTQKKyNkZWZpbmUgUFFJX0VWRU5UX0FJT19TVEFURV9DSEFOR0UJNQorI2RlZmluZSBQUUlfRVZFTlRfQUlPX0NPTkZJR19DSEFOR0UJNgorI2RlZmluZSBQUUlfTlVNX1NVUFBPUlRFRF9FVkVOVFMJNworCitzdHJ1Y3QgcHFpX2V2ZW50IHsKKwlib29sCXBlbmRpbmc7CisJdTgJZXZlbnRfdHlwZTsKKwlfX2xlMTYJZXZlbnRfaWQ7CisJX19sZTMyCWFkZGl0aW9uYWxfZXZlbnRfaWQ7Cit9OworCisjZGVmaW5lIFBRSV9SRVNFUlZFRF9JT19TTE9UU19MVU5fUkVTRVQJCQkxCisjZGVmaW5lIFBRSV9SRVNFUlZFRF9JT19TTE9UU19FVkVOVF9BQ0sJCQlQUUlfTlVNX1NVUFBPUlRFRF9FVkVOVFMKKyNkZWZpbmUgUFFJX1JFU0VSVkVEX0lPX1NMT1RTX1NZTkNIUk9OT1VTX1JFUVVFU1RTCTMKKyNkZWZpbmUgUFFJX1JFU0VSVkVEX0lPX1NMT1RTCQkJCVwKKwkoUFFJX1JFU0VSVkVEX0lPX1NMT1RTX0xVTl9SRVNFVCArIFBRSV9SRVNFUlZFRF9JT19TTE9UU19FVkVOVF9BQ0sgKyBcCisJUFFJX1JFU0VSVkVEX0lPX1NMT1RTX1NZTkNIUk9OT1VTX1JFUVVFU1RTKQorCitzdHJ1Y3QgcHFpX2N0cmxfaW5mbyB7CisJdW5zaWduZWQgaW50CWN0cmxfaWQ7CisJc3RydWN0IHBjaV9kZXYJKnBjaV9kZXY7CisJY2hhcgkJZmlybXdhcmVfdmVyc2lvblsxMV07CisJdm9pZCBfX2lvbWVtCSppb21lbV9iYXNlOworCXN0cnVjdCBwcWlfY3RybF9yZWdpc3RlcnMgX19pb21lbSAqcmVnaXN0ZXJzOworCXN0cnVjdCBwcWlfZGV2aWNlX3JlZ2lzdGVycyBfX2lvbWVtICpwcWlfcmVnaXN0ZXJzOworCXUzMgkJbWF4X3NnX2VudHJpZXM7CisJdTMyCQljb25maWdfdGFibGVfb2Zmc2V0OworCXUzMgkJY29uZmlnX3RhYmxlX2xlbmd0aDsKKwl1MTYJCW1heF9pbmJvdW5kX3F1ZXVlczsKKwl1MTYJCW1heF9lbGVtZW50c19wZXJfaXE7CisJdTE2CQltYXhfaXFfZWxlbWVudF9sZW5ndGg7CisJdTE2CQltYXhfb3V0Ym91bmRfcXVldWVzOworCXUxNgkJbWF4X2VsZW1lbnRzX3Blcl9vcTsKKwl1MTYJCW1heF9vcV9lbGVtZW50X2xlbmd0aDsKKwl1MzIJCW1heF90cmFuc2Zlcl9zaXplOworCXUzMgkJbWF4X291dHN0YW5kaW5nX3JlcXVlc3RzOworCXUzMgkJbWF4X2lvX3Nsb3RzOworCXVuc2lnbmVkIGludAlzY3NpX21sX2Nhbl9xdWV1ZTsKKwl1bnNpZ25lZCBzaG9ydAlzZ190YWJsZXNpemU7CisJdW5zaWduZWQgaW50CW1heF9zZWN0b3JzOworCXUzMgkJZXJyb3JfYnVmZmVyX2xlbmd0aDsKKwl2b2lkCQkqZXJyb3JfYnVmZmVyOworCWRtYV9hZGRyX3QJZXJyb3JfYnVmZmVyX2RtYV9oYW5kbGU7CisJc2l6ZV90CQlzZ19jaGFpbl9idWZmZXJfbGVuZ3RoOworCXVuc2lnbmVkIGludAludW1fcXVldWVfZ3JvdXBzOworCXVuc2lnbmVkIGludAludW1fYWN0aXZlX3F1ZXVlX2dyb3VwczsKKwl1MTYJCW51bV9lbGVtZW50c19wZXJfaXE7CisJdTE2CQludW1fZWxlbWVudHNfcGVyX29xOworCXUxNgkJbWF4X2luYm91bmRfaXVfbGVuZ3RoX3Blcl9maXJtd2FyZTsKKwl1MTYJCW1heF9pbmJvdW5kX2l1X2xlbmd0aDsKKwl1bnNpZ25lZCBpbnQJbWF4X3NnX3Blcl9pdTsKKwl2b2lkCQkqYWRtaW5fcXVldWVfbWVtb3J5X2Jhc2U7CisJdTMyCQlhZG1pbl9xdWV1ZV9tZW1vcnlfbGVuZ3RoOworCWRtYV9hZGRyX3QJYWRtaW5fcXVldWVfbWVtb3J5X2Jhc2VfZG1hX2hhbmRsZTsKKwl2b2lkCQkqcXVldWVfbWVtb3J5X2Jhc2U7CisJdTMyCQlxdWV1ZV9tZW1vcnlfbGVuZ3RoOworCWRtYV9hZGRyX3QJcXVldWVfbWVtb3J5X2Jhc2VfZG1hX2hhbmRsZTsKKwlzdHJ1Y3QgcHFpX2FkbWluX3F1ZXVlcyBhZG1pbl9xdWV1ZXM7CisJc3RydWN0IHBxaV9xdWV1ZV9ncm91cCBxdWV1ZV9ncm91cHNbUFFJX01BWF9RVUVVRV9HUk9VUFNdOworCXN0cnVjdCBwcWlfZXZlbnRfcXVldWUgZXZlbnRfcXVldWU7CisJaW50CQltYXhfbXNpeF92ZWN0b3JzOworCWludAkJbnVtX21zaXhfdmVjdG9yc19lbmFibGVkOworCWludAkJbnVtX21zaXhfdmVjdG9yc19pbml0aWFsaXplZDsKKwl1MzIJCW1zaXhfdmVjdG9yc1tQUUlfTUFYX01TSVhfVkVDVE9SU107CisJdm9pZAkJKmludHJfZGF0YVtQUUlfTUFYX01TSVhfVkVDVE9SU107CisJaW50CQlldmVudF9pcnE7CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0OworCisJc3RydWN0IG11dGV4CXNjYW5fbXV0ZXg7CisJdTgJCWluYm91bmRfc3Bhbm5pbmdfc3VwcG9ydGVkIDogMTsKKwl1OAkJb3V0Ym91bmRfc3Bhbm5pbmdfc3VwcG9ydGVkIDogMTsKKwl1OAkJcHFpX21vZGVfZW5hYmxlZCA6IDE7CisJdTgJCWNvbnRyb2xsZXJfb25saW5lIDogMTsKKwl1OAkJaGVhcnRiZWF0X3RpbWVyX3N0YXJ0ZWQgOiAxOworCisJc3RydWN0IGxpc3RfaGVhZCBzY3NpX2RldmljZV9saXN0OworCXNwaW5sb2NrX3QJc2NzaV9kZXZpY2VfbGlzdF9sb2NrOworCisJc3RydWN0IGRlbGF5ZWRfd29yayByZXNjYW5fd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHVwZGF0ZV90aW1lX3dvcms7CisKKwlzdHJ1Y3QgcHFpX3Nhc19ub2RlICpzYXNfaG9zdDsKKwl1NjQJCXNhc19hZGRyZXNzOworCisJc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0X3Bvb2w7CisJdTE2CQluZXh0X2lvX3JlcXVlc3Rfc2xvdDsKKworCXN0cnVjdCBwcWlfZXZlbnQgcGVuZGluZ19ldmVudHNbUFFJX05VTV9TVVBQT1JURURfRVZFTlRTXTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZXZlbnRfd29yazsKKworCWF0b21pY190CW51bV9pbnRlcnJ1cHRzOworCWludAkJcHJldmlvdXNfbnVtX2ludGVycnVwdHM7CisJdW5zaWduZWQgaW50CW51bV9oZWFydGJlYXRzX3JlcXVlc3RlZDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBoZWFydGJlYXRfdGltZXI7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHN5bmNfcmVxdWVzdF9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBsdW5fcmVzZXRfc2VtOworfTsKKworZW51bSBwcWlfY3RybF9tb2RlIHsKKwlVTktOT1dOLAorCVBRSV9NT0RFCit9OworCisvKgorICogYXNzdW1lIHdvcnN0IGNhc2U6IFNBVEEgcXVldWUgZGVwdGggb2YgMzEgbWludXMgNCBpbnRlcm5hbCBmaXJtd2FyZSBjb21tYW5kcworICovCisjZGVmaW5lIFBRSV9QSFlTSUNBTF9ESVNLX0RFRkFVTFRfTUFYX1FVRVVFX0RFUFRICTI3CisKKy8qIDAgPSBubyBsaW1pdCAqLworI2RlZmluZSBQUUlfTE9HSUNBTF9EUklWRV9ERUZBVUxUX01BWF9RVUVVRV9ERVBUSAkwCisKKy8qIENJU1MgY29tbWFuZHMgKi8KKyNkZWZpbmUgQ0lTU19SRUFECQkweGMwCisjZGVmaW5lIENJU1NfUkVQT1JUX0xPRwkJMHhjMgkvKiBSZXBvcnQgTG9naWNhbCBMVU5zICovCisjZGVmaW5lIENJU1NfUkVQT1JUX1BIWVMJMHhjMwkvKiBSZXBvcnQgUGh5c2ljYWwgTFVOcyAqLworI2RlZmluZSBDSVNTX0dFVF9SQUlEX01BUAkweGM4CisKKy8qIGNvbnN0YW50cyBmb3IgQ0lTU19SRVBPUlRfTE9HL0NJU1NfUkVQT1JUX1BIWVMgY29tbWFuZHMgKi8KKyNkZWZpbmUgQ0lTU19SRVBPUlRfTE9HX0VYVEVOREVECQkweDEKKyNkZWZpbmUgQ0lTU19SRVBPUlRfUEhZU19FWFRFTkRFRAkJMHgyCisKKy8qIEJNSUMgY29tbWFuZHMgKi8KKyNkZWZpbmUgQk1JQ19JREVOVElGWV9DT05UUk9MTEVSCQkweDExCisjZGVmaW5lIEJNSUNfSURFTlRJRllfUEhZU0lDQUxfREVWSUNFCQkweDE1CisjZGVmaW5lIEJNSUNfUkVBRAkJCQkweDI2CisjZGVmaW5lIEJNSUNfV1JJVEUJCQkJMHgyNworI2RlZmluZSBCTUlDX1NFTlNFX0NPTlRST0xMRVJfUEFSQU1FVEVSUwkweDY0CisjZGVmaW5lIEJNSUNfU0VOU0VfU1VCU1lTVEVNX0lORk9STUFUSU9OCTB4NjYKKyNkZWZpbmUgQk1JQ19XUklURV9IT1NUX1dFTExORVNTCQkweGE1CisjZGVmaW5lIEJNSUNfQ0FDSEVfRkxVU0gJCQkweGMyCisKKyNkZWZpbmUgU0FfQ0FDSEVfRkxVU0gJCQkJMHgwMQorCisjZGVmaW5lIE1BU0tFRF9ERVZJQ0UobHVuaWQpCQkJKChsdW5pZClbM10gJiAweGMwKQorI2RlZmluZSBDSVNTX0dFVF9CVVMobHVuaWQpCQkJKChsdW5pZClbN10gJiAweDNmKQorI2RlZmluZSBDSVNTX0dFVF9MRVZFTF8yX1RBUkdFVChsdW5pZCkJCSgobHVuaWQpWzZdKQorI2RlZmluZSBDSVNTX0dFVF9EUklWRV9OVU1CRVIobHVuaWQpCQlcCisJKCgoQ0lTU19HRVRfQlVTKChsdW5pZCkpIC0gMSkgPDwgOCkgKwlcCisJQ0lTU19HRVRfTEVWRUxfMl9UQVJHRVQoKGx1bmlkKSkpCisKKyNkZWZpbmUgTk9fVElNRU9VVAkJKCh1bnNpZ25lZCBsb25nKSAtMSkKKworI3ByYWdtYSBwYWNrKDEpCisKK3N0cnVjdCBibWljX2lkZW50aWZ5X2NvbnRyb2xsZXIgeworCXU4CWNvbmZpZ3VyZWRfbG9naWNhbF9kcml2ZV9jb3VudDsKKwlfX2xlMzIJY29uZmlndXJhdGlvbl9zaWduYXR1cmU7CisJdTgJZmlybXdhcmVfdmVyc2lvbls0XTsKKwl1OAlyZXNlcnZlZFsxNDVdOworCV9fbGUxNglleHRlbmRlZF9sb2dpY2FsX3VuaXRfY291bnQ7CisJdTgJcmVzZXJ2ZWQxWzM0XTsKKwlfX2xlMTYJZmlybXdhcmVfYnVpbGRfbnVtYmVyOworCXU4CXJlc2VydmVkMlsxMDBdOworCXU4CWNvbnRyb2xsZXJfbW9kZTsKKwl1OAlyZXNlcnZlZDNbMzJdOworfTsKKworc3RydWN0IGJtaWNfaWRlbnRpZnlfcGh5c2ljYWxfZGV2aWNlIHsKKwl1OAlzY3NpX2J1czsJCS8qIFNDU0kgQnVzIG51bWJlciBvbiBjb250cm9sbGVyICovCisJdTgJc2NzaV9pZDsJCS8qIFNDU0kgSUQgb24gdGhpcyBidXMgKi8KKwlfX2xlMTYJYmxvY2tfc2l6ZTsJCS8qIHNlY3RvciBzaXplIGluIGJ5dGVzICovCisJX19sZTMyCXRvdGFsX2Jsb2NrczsJCS8qIG51bWJlciBmb3Igc2VjdG9ycyBvbiBkcml2ZSAqLworCV9fbGUzMglyZXNlcnZlZF9ibG9ja3M7CS8qIGNvbnRyb2xsZXIgcmVzZXJ2ZWQgKFJJUykgKi8KKwl1OAltb2RlbFs0MF07CQkvKiBQaHlzaWNhbCBEcml2ZSBNb2RlbCAqLworCXU4CXNlcmlhbF9udW1iZXJbNDBdOwkvKiBEcml2ZSBTZXJpYWwgTnVtYmVyICovCisJdTgJZmlybXdhcmVfcmV2aXNpb25bOF07CS8qIGRyaXZlIGZpcm13YXJlIHJldmlzaW9uICovCisJdTgJc2NzaV9pbnF1aXJ5X2JpdHM7CS8qIGlucXVpcnkgYnl0ZSA3IGJpdHMgKi8KKwl1OAljb21wYXFfZHJpdmVfc3RhbXA7CS8qIDAgbWVhbnMgZHJpdmUgbm90IHN0YW1wZWQgKi8KKwl1OAlsYXN0X2ZhaWx1cmVfcmVhc29uOworCXU4CWZsYWdzOworCXU4CW1vcmVfZmxhZ3M7CisJdTgJc2NzaV9sdW47CQkvKiBTQ1NJIExVTiBmb3IgcGh5cyBkcml2ZSAqLworCXU4CXlldF9tb3JlX2ZsYWdzOworCXU4CWV2ZW5fbW9yZV9mbGFnczsKKwlfX2xlMzIJc3BpX3NwZWVkX3J1bGVzOworCXU4CXBoeXNfY29ubmVjdG9yWzJdOwkvKiBjb25uZWN0b3IgbnVtYmVyIG9uIGNvbnRyb2xsZXIgKi8KKwl1OAlwaHlzX2JveF9vbl9idXM7CS8qIHBoeXMgZW5jbG9zdXJlIHRoaXMgZHJpdmUgcmVzaWRlcyAqLworCXU4CXBoeXNfYmF5X2luX2JveDsJLyogcGh5cyBkcnYgYmF5IHRoaXMgZHJpdmUgcmVzaWRlcyAqLworCV9fbGUzMglycG07CQkJLyogZHJpdmUgcm90YXRpb25hbCBzcGVlZCBpbiBSUE0gKi8KKwl1OAlkZXZpY2VfdHlwZTsJCS8qIHR5cGUgb2YgZHJpdmUgKi8KKwl1OAlzYXRhX3ZlcnNpb247CQkvKiBvbmx5IHZhbGlkIHdoZW4gZGV2aWNlX3R5cGUgPSAqLworCQkJCQkvKiBCTUlDX0RFVklDRV9UWVBFX1NBVEEgKi8KKwlfX2xlNjQJYmlnX3RvdGFsX2Jsb2NrX2NvdW50OworCV9fbGU2NAlyaXNfc3RhcnRpbmdfbGJhOworCV9fbGUzMglyaXNfc2l6ZTsKKwl1OAl3d2lkWzIwXTsKKwl1OAljb250cm9sbGVyX3BoeV9tYXBbMzJdOworCV9fbGUxNglwaHlfY291bnQ7CisJdTgJcGh5X2Nvbm5lY3RlZF9kZXZfdHlwZVsyNTZdOworCXU4CXBoeV90b19kcml2ZV9iYXlfbnVtWzI1Nl07CisJX19sZTE2CXBoeV90b19hdHRhY2hlZF9kZXZfaW5kZXhbMjU2XTsKKwl1OAlib3hfaW5kZXg7CisJdTgJcmVzZXJ2ZWQ7CisJX19sZTE2CWV4dHJhX3BoeXNpY2FsX2RyaXZlX2ZsYWdzOworCXU4CW5lZ290aWF0ZWRfbGlua19yYXRlWzI1Nl07CisJdTgJcGh5X3RvX3BoeV9tYXBbMjU2XTsKKwl1OAlyZWR1bmRhbnRfcGF0aF9wcmVzZW50X21hcDsKKwl1OAlyZWR1bmRhbnRfcGF0aF9mYWlsdXJlX21hcDsKKwl1OAlhY3RpdmVfcGF0aF9udW1iZXI7CisJX19sZTE2CWFsdGVybmF0ZV9wYXRoc19waHlzX2Nvbm5lY3Rvcls4XTsKKwl1OAlhbHRlcm5hdGVfcGF0aHNfcGh5c19ib3hfb25fcG9ydFs4XTsKKwl1OAltdWx0aV9sdW5fZGV2aWNlX2x1bl9jb3VudDsKKwl1OAltaW5pbXVtX2dvb2RfZndfcmV2aXNpb25bOF07CisJdTgJdW5pcXVlX2lucXVpcnlfYnl0ZXNbMjBdOworCXU4CWN1cnJlbnRfdGVtcGVyYXR1cmVfZGVncmVlc0M7CisJdTgJdGVtcGVyYXR1cmVfdGhyZXNob2xkX2RlZ3JlZXNDOworCXU4CW1heF90ZW1wZXJhdHVyZV9kZWdyZWVzQzsKKwl1OAlsb2dpY2FsX2Jsb2Nrc19wZXJfcGh5c19ibG9ja19leHA7CisJX19sZTE2CWN1cnJlbnRfcXVldWVfZGVwdGhfbGltaXQ7CisJdTgJc3dpdGNoX25hbWVbMTBdOworCV9fbGUxNglzd2l0Y2hfcG9ydDsKKwl1OAlhbHRlcm5hdGVfcGF0aHNfc3dpdGNoX25hbWVbNDBdOworCXU4CWFsdGVybmF0ZV9wYXRoc19zd2l0Y2hfcG9ydFs4XTsKKwlfX2xlMTYJcG93ZXJfb25faG91cnM7CisJX19sZTE2CXBlcmNlbnRfZW5kdXJhbmNlX3VzZWQ7CisJdTgJZHJpdmVfYXV0aGVudGljYXRpb247CisJdTgJc21hcnRfY2Fycmllcl9hdXRoZW50aWNhdGlvbjsKKwl1OAlzbWFydF9jYXJyaWVyX2FwcF9md192ZXJzaW9uOworCXU4CXNtYXJ0X2NhcnJpZXJfYm9vdGxvYWRlcl9md192ZXJzaW9uOworCXU4CWVuY3J5cHRpb25fa2V5X25hbWVbNjRdOworCV9fbGUzMgltaXNjX2RyaXZlX2ZsYWdzOworCV9fbGUxNglkZWtfaW5kZXg7CisJdTgJcGFkZGluZ1sxMTJdOworfTsKKworI3ByYWdtYSBwYWNrKCkKKworaW50IHBxaV9hZGRfc2FzX2hvc3Qoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pOwordm9pZCBwcWlfZGVsZXRlX3Nhc19ob3N0KHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pOworaW50IHBxaV9hZGRfc2FzX2RldmljZShzdHJ1Y3QgcHFpX3Nhc19ub2RlICpwcWlfc2FzX25vZGUsCisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlKTsKK3ZvaWQgcHFpX3JlbW92ZV9zYXNfZGV2aWNlKHN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZSk7CitzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpwcWlfZmluZF9kZXZpY2VfYnlfc2FzX3JwaHkoCisJc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywgc3RydWN0IHNhc19ycGh5ICpycGh5KTsKKworZXh0ZXJuIHN0cnVjdCBzYXNfZnVuY3Rpb25fdGVtcGxhdGUgcHFpX3Nhc190cmFuc3BvcnRfZnVuY3Rpb25zOworCisjaWYgIWRlZmluZWQocmVhZHEpCisjZGVmaW5lIHJlYWRxIHJlYWRxCitzdGF0aWMgaW5saW5lIHU2NCByZWFkcShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJdTMyIGxvd2VyMzI7CisJdTMyIHVwcGVyMzI7CisKKwlsb3dlcjMyID0gcmVhZGwoYWRkcik7CisJdXBwZXIzMiA9IHJlYWRsKGFkZHIgKyA0KTsKKworCXJldHVybiAoKHU2NCl1cHBlcjMyIDw8IDMyKSB8IGxvd2VyMzI7Cit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKHdyaXRlcSkKKyNkZWZpbmUgd3JpdGVxIHdyaXRlcQorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcSh1NjQgdmFsdWUsIHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1MzIgbG93ZXIzMjsKKwl1MzIgdXBwZXIzMjsKKworCWxvd2VyMzIgPSBsb3dlcl8zMl9iaXRzKHZhbHVlKTsKKwl1cHBlcjMyID0gdXBwZXJfMzJfYml0cyh2YWx1ZSk7CisKKwl3cml0ZWwobG93ZXIzMiwgYWRkcik7CisJd3JpdGVsKHVwcGVyMzIsIGFkZHIgKyA0KTsKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1NNQVJUUFFJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zbWFydHBxaS9zbWFydHBxaV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvc21hcnRwcWkvc21hcnRwcWlfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MzViMjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc21hcnRwcWkvc21hcnRwcWlfaW5pdC5jCkBAIC0wLDAgKzEsNjMwMyBAQAorLyoKKyAqICAgIGRyaXZlciBmb3IgTWljcm9zZW1pIFBRSS1iYXNlZCBzdG9yYWdlIGNvbnRyb2xsZXJzCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTYgTWljcm9zZW1pIENvcnBvcmF0aW9uCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTYgUE1DLVNpZXJyYSwgSW5jLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogICAgTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBRdWVzdGlvbnMvQ29tbWVudHMvQnVnZml4ZXMgdG8gZXNjLnN0b3JhZ2VkZXZAbWljcm9zZW1pLmNvbQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NjaXNzX2lvY3RsLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlICJzbWFydHBxaS5oIgorI2luY2x1ZGUgInNtYXJ0cHFpX3Npcy5oIgorCisjaWYgIWRlZmluZWQoQlVJTERfVElNRVNUQU1QKQorI2RlZmluZSBCVUlMRF9USU1FU1RBTVAKKyNlbmRpZgorCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMC45LjEzLTM3MCIKKyNkZWZpbmUgRFJJVkVSX01BSk9SCQkwCisjZGVmaW5lIERSSVZFUl9NSU5PUgkJOQorI2RlZmluZSBEUklWRVJfUkVMRUFTRQkJMTMKKyNkZWZpbmUgRFJJVkVSX1JFVklTSU9OCQkzNzAKKworI2RlZmluZSBEUklWRVJfTkFNRQkJIk1pY3Jvc2VtaSBQUUkgRHJpdmVyICh2IiBEUklWRVJfVkVSU0lPTiAiKSIKKyNkZWZpbmUgRFJJVkVSX05BTUVfU0hPUlQJInNtYXJ0cHFpIgorCitNT0RVTEVfQVVUSE9SKCJNaWNyb3NlbWkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBNaWNyb3NlbWkgU21hcnQgRmFtaWx5IENvbnRyb2xsZXIgdmVyc2lvbiAiCisJRFJJVkVSX1ZFUlNJT04pOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIk1pY3Jvc2VtaSBTbWFydCBGYW1pbHkgQ29udHJvbGxlcnMiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBQUUlfRU5BQkxFX01VTFRJX1FVRVVFX1NVUFBPUlQJMAorCitzdGF0aWMgY2hhciAqaHBlX2JyYW5kZWRfY29udHJvbGxlciA9ICJIUEUgU21hcnQgQXJyYXkgQ29udHJvbGxlciI7CitzdGF0aWMgY2hhciAqbWljcm9zZW1pX2JyYW5kZWRfY29udHJvbGxlciA9ICJNaWNyb3NlbWkgU21hcnQgRmFtaWx5IENvbnRyb2xsZXIiOworCitzdGF0aWMgdm9pZCBwcWlfdGFrZV9jdHJsX29mZmxpbmUoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbyk7CitzdGF0aWMgaW50IHBxaV9zY2FuX3Njc2lfZGV2aWNlcyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKTsKK3N0YXRpYyB2b2lkIHBxaV9zY2FuX3N0YXJ0KHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKK3N0YXRpYyB2b2lkIHBxaV9zdGFydF9pbyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfcXVldWVfZ3JvdXAgKnF1ZXVlX2dyb3VwLCBlbnVtIHBxaV9pb19wYXRoIHBhdGgsCisJc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0KTsKK3N0YXRpYyBpbnQgcHFpX3N1Ym1pdF9yYWlkX3JlcXVlc3Rfc3luY2hyb25vdXMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX2l1X2hlYWRlciAqcmVxdWVzdCwgdW5zaWduZWQgaW50IGZsYWdzLAorCXN0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvICplcnJvcl9pbmZvLCB1bnNpZ25lZCBsb25nIHRpbWVvdXRfbXNlY3MpOworc3RhdGljIGludCBwcWlfYWlvX3N1Ym1pdF9pbyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsIHUzMiBhaW9faGFuZGxlLCB1OCAqY2RiLAorCXVuc2lnbmVkIGludCBjZGJfbGVuZ3RoLCBzdHJ1Y3QgcHFpX3F1ZXVlX2dyb3VwICpxdWV1ZV9ncm91cCwKKwlzdHJ1Y3QgcHFpX2VuY3J5cHRpb25faW5mbyAqZW5jcnlwdGlvbl9pbmZvKTsKKworLyogZm9yIGZsYWdzIGFyZ3VtZW50IHRvIHBxaV9zdWJtaXRfcmFpZF9yZXF1ZXN0X3N5bmNocm9ub3VzKCkgKi8KKyNkZWZpbmUgUFFJX1NZTkNfRkxBR1NfSU5URVJSVVBUQUJMRQkweDEKKworc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqcHFpX3Nhc190cmFuc3BvcnRfdGVtcGxhdGU7CisKK3N0YXRpYyBhdG9taWNfdCBwcWlfY29udHJvbGxlcl9jb3VudCA9IEFUT01JQ19JTklUKDApOworCitzdGF0aWMgaW50IHBxaV9kaXNhYmxlX2RldmljZV9pZF93aWxkY2FyZHM7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGlzYWJsZV9kZXZpY2VfaWRfd2lsZGNhcmRzLAorCXBxaV9kaXNhYmxlX2RldmljZV9pZF93aWxkY2FyZHMsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX2RldmljZV9pZF93aWxkY2FyZHMsCisJIkRpc2FibGUgZGV2aWNlIElEIHdpbGRjYXJkcy4iKTsKKworc3RhdGljIGNoYXIgKnJhaWRfbGV2ZWxzW10gPSB7CisJIlJBSUQtMCIsCisJIlJBSUQtNCIsCisJIlJBSUQtMSgxKzApIiwKKwkiUkFJRC01IiwKKwkiUkFJRC01KzEiLAorCSJSQUlELUFERyIsCisJIlJBSUQtMShBRE0pIiwKK307CisKK3N0YXRpYyBjaGFyICpwcWlfcmFpZF9sZXZlbF90b19zdHJpbmcodTggcmFpZF9sZXZlbCkKK3sKKwlpZiAocmFpZF9sZXZlbCA8IEFSUkFZX1NJWkUocmFpZF9sZXZlbHMpKQorCQlyZXR1cm4gcmFpZF9sZXZlbHNbcmFpZF9sZXZlbF07CisKKwlyZXR1cm4gIiI7Cit9CisKKyNkZWZpbmUgU0FfUkFJRF8wCQkwCisjZGVmaW5lIFNBX1JBSURfNAkJMQorI2RlZmluZSBTQV9SQUlEXzEJCTIJLyogYWxzbyB1c2VkIGZvciBSQUlEIDEwICovCisjZGVmaW5lIFNBX1JBSURfNQkJMwkvKiBhbHNvIHVzZWQgZm9yIFJBSUQgNTAgKi8KKyNkZWZpbmUgU0FfUkFJRF81MQkJNAorI2RlZmluZSBTQV9SQUlEXzYJCTUJLyogYWxzbyB1c2VkIGZvciBSQUlEIDYwICovCisjZGVmaW5lIFNBX1JBSURfQURNCQk2CS8qIGFsc28gdXNlZCBmb3IgUkFJRCAxKzAgQURNICovCisjZGVmaW5lIFNBX1JBSURfTUFYCQlTQV9SQUlEX0FETQorI2RlZmluZSBTQV9SQUlEX1VOS05PV04JCTB4ZmYKKworc3RhdGljIGlubGluZSB2b2lkIHBxaV9zY3NpX2RvbmUoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwlzY21kLT5zY3NpX2RvbmUoc2NtZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwcWlfc2NzaTNhZGRyX2VxdWFsKHU4ICpzY3NpM2FkZHIxLCB1OCAqc2NzaTNhZGRyMikKK3sKKwlyZXR1cm4gbWVtY21wKHNjc2kzYWRkcjEsIHNjc2kzYWRkcjIsIDgpID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBxaV9jdHJsX2luZm8gKnNob3N0X3RvX2hiYShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKK3sKKwl2b2lkICpob3N0ZGF0YSA9IHNob3N0X3ByaXYoc2hvc3QpOworCisJcmV0dXJuICooKHN0cnVjdCBwcWlfY3RybF9pbmZvICoqKWhvc3RkYXRhKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHBxaV9pc19sb2dpY2FsX2RldmljZShzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UpCit7CisJcmV0dXJuICFkZXZpY2UtPmlzX3BoeXNpY2FsX2RldmljZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHBxaV9jdHJsX29mZmxpbmUoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlyZXR1cm4gIWN0cmxfaW5mby0+Y29udHJvbGxlcl9vbmxpbmU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcWlfY2hlY2tfY3RybF9oZWFsdGgoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlpZiAoY3RybF9pbmZvLT5jb250cm9sbGVyX29ubGluZSkKKwkJaWYgKCFzaXNfaXNfZmlybXdhcmVfcnVubmluZyhjdHJsX2luZm8pKQorCQkJcHFpX3Rha2VfY3RybF9vZmZsaW5lKGN0cmxfaW5mbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwcWlfaXNfaGJhX2x1bmlkKHU4ICpzY3NpM2FkZHIpCit7CisJcmV0dXJuIHBxaV9zY3NpM2FkZHJfZXF1YWwoc2NzaTNhZGRyLCBSQUlEX0NUTFJfTFVOSUQpOworfQorCitzdGF0aWMgaW5saW5lIGVudW0gcHFpX2N0cmxfbW9kZSBwcWlfZ2V0X2N0cmxfbW9kZSgKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXJldHVybiBzaXNfcmVhZF9kcml2ZXJfc2NyYXRjaChjdHJsX2luZm8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHFpX3NhdmVfY3RybF9tb2RlKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJZW51bSBwcWlfY3RybF9tb2RlIG1vZGUpCit7CisJc2lzX3dyaXRlX2RyaXZlcl9zY3JhdGNoKGN0cmxfaW5mbywgbW9kZSk7Cit9CisKKyNkZWZpbmUgUFFJX1JFU0NBTl9XT1JLX0lOVEVSVkFMCSgxMCAqIEhaKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHFpX3NjaGVkdWxlX3Jlc2Nhbl93b3JrZXIoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmN0cmxfaW5mby0+cmVzY2FuX3dvcmssCisJCVBRSV9SRVNDQU5fV09SS19JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyBpbnQgcHFpX21hcF9zaW5nbGUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCisJc3RydWN0IHBxaV9zZ19kZXNjcmlwdG9yICpzZ19kZXNjcmlwdG9yLCB2b2lkICpidWZmZXIsCisJc2l6ZV90IGJ1ZmZlcl9sZW5ndGgsIGludCBkYXRhX2RpcmVjdGlvbikKK3sKKwlkbWFfYWRkcl90IGJ1c19hZGRyZXNzOworCisJaWYgKCFidWZmZXIgfHwgYnVmZmVyX2xlbmd0aCA9PSAwIHx8IGRhdGFfZGlyZWN0aW9uID09IFBDSV9ETUFfTk9ORSkKKwkJcmV0dXJuIDA7CisKKwlidXNfYWRkcmVzcyA9IHBjaV9tYXBfc2luZ2xlKHBjaV9kZXYsIGJ1ZmZlciwgYnVmZmVyX2xlbmd0aCwKKwkJZGF0YV9kaXJlY3Rpb24pOworCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocGNpX2RldiwgYnVzX2FkZHJlc3MpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXB1dF91bmFsaWduZWRfbGU2NCgodTY0KWJ1c19hZGRyZXNzLCAmc2dfZGVzY3JpcHRvci0+YWRkcmVzcyk7CisJcHV0X3VuYWxpZ25lZF9sZTMyKGJ1ZmZlcl9sZW5ndGgsICZzZ19kZXNjcmlwdG9yLT5sZW5ndGgpOworCXB1dF91bmFsaWduZWRfbGUzMihDSVNTX1NHX0xBU1QsICZzZ19kZXNjcmlwdG9yLT5mbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHFpX3BjaV91bm1hcChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwlzdHJ1Y3QgcHFpX3NnX2Rlc2NyaXB0b3IgKmRlc2NyaXB0b3JzLCBpbnQgbnVtX2Rlc2NyaXB0b3JzLAorCWludCBkYXRhX2RpcmVjdGlvbikKK3sKKwlpbnQgaTsKKworCWlmIChkYXRhX2RpcmVjdGlvbiA9PSBQQ0lfRE1BX05PTkUpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZGVzY3JpcHRvcnM7IGkrKykKKwkJcGNpX3VubWFwX3NpbmdsZShwY2lfZGV2LAorCQkJKGRtYV9hZGRyX3QpZ2V0X3VuYWxpZ25lZF9sZTY0KCZkZXNjcmlwdG9yc1tpXS5hZGRyZXNzKSwKKwkJCWdldF91bmFsaWduZWRfbGUzMigmZGVzY3JpcHRvcnNbaV0ubGVuZ3RoKSwKKwkJCWRhdGFfZGlyZWN0aW9uKTsKK30KKworc3RhdGljIGludCBwcWlfYnVpbGRfcmFpZF9wYXRoX3JlcXVlc3Qoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX3JhaWRfcGF0aF9yZXF1ZXN0ICpyZXF1ZXN0LCB1OCBjbWQsCisJdTggKnNjc2kzYWRkciwgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX2xlbmd0aCwKKwl1MTYgdnBkX3BhZ2UsIGludCAqcGNpX2RpcmVjdGlvbikKK3sKKwl1OCAqY2RiOworCWludCBwY2lfZGlyOworCisJbWVtc2V0KHJlcXVlc3QsIDAsIHNpemVvZigqcmVxdWVzdCkpOworCisJcmVxdWVzdC0+aGVhZGVyLml1X3R5cGUgPSBQUUlfUkVRVUVTVF9JVV9SQUlEX1BBVEhfSU87CisJcHV0X3VuYWxpZ25lZF9sZTE2KG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QsCisJCXNnX2Rlc2NyaXB0b3JzWzFdKSAtIFBRSV9SRVFVRVNUX0hFQURFUl9MRU5HVEgsCisJCSZyZXF1ZXN0LT5oZWFkZXIuaXVfbGVuZ3RoKTsKKwlwdXRfdW5hbGlnbmVkX2xlMzIoYnVmZmVyX2xlbmd0aCwgJnJlcXVlc3QtPmJ1ZmZlcl9sZW5ndGgpOworCW1lbWNweShyZXF1ZXN0LT5sdW5fbnVtYmVyLCBzY3NpM2FkZHIsIHNpemVvZihyZXF1ZXN0LT5sdW5fbnVtYmVyKSk7CisJcmVxdWVzdC0+dGFza19hdHRyaWJ1dGUgPSBTT1BfVEFTS19BVFRSSUJVVEVfU0lNUExFOworCXJlcXVlc3QtPmFkZGl0aW9uYWxfY2RiX2J5dGVzX3VzYWdlID0gU09QX0FERElUSU9OQUxfQ0RCX0JZVEVTXzA7CisKKwljZGIgPSByZXF1ZXN0LT5jZGI7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSU5RVUlSWToKKwkJcmVxdWVzdC0+ZGF0YV9kaXJlY3Rpb24gPSBTT1BfUkVBRF9GTEFHOworCQljZGJbMF0gPSBJTlFVSVJZOworCQlpZiAodnBkX3BhZ2UgJiBWUERfUEFHRSkgeworCQkJY2RiWzFdID0gMHgxOworCQkJY2RiWzJdID0gKHU4KXZwZF9wYWdlOworCQl9CisJCWNkYls0XSA9ICh1OClidWZmZXJfbGVuZ3RoOworCQlicmVhazsKKwljYXNlIENJU1NfUkVQT1JUX0xPRzoKKwljYXNlIENJU1NfUkVQT1JUX1BIWVM6CisJCXJlcXVlc3QtPmRhdGFfZGlyZWN0aW9uID0gU09QX1JFQURfRkxBRzsKKwkJY2RiWzBdID0gY21kOworCQlpZiAoY21kID09IENJU1NfUkVQT1JUX1BIWVMpCisJCQljZGJbMV0gPSBDSVNTX1JFUE9SVF9QSFlTX0VYVEVOREVEOworCQllbHNlCisJCQljZGJbMV0gPSBDSVNTX1JFUE9SVF9MT0dfRVhURU5ERUQ7CisJCXB1dF91bmFsaWduZWRfYmUzMihidWZmZXJfbGVuZ3RoLCAmY2RiWzZdKTsKKwkJYnJlYWs7CisJY2FzZSBDSVNTX0dFVF9SQUlEX01BUDoKKwkJcmVxdWVzdC0+ZGF0YV9kaXJlY3Rpb24gPSBTT1BfUkVBRF9GTEFHOworCQljZGJbMF0gPSBDSVNTX1JFQUQ7CisJCWNkYlsxXSA9IENJU1NfR0VUX1JBSURfTUFQOworCQlwdXRfdW5hbGlnbmVkX2JlMzIoYnVmZmVyX2xlbmd0aCwgJmNkYls2XSk7CisJCWJyZWFrOworCWNhc2UgU0FfQ0FDSEVfRkxVU0g6CisJCXJlcXVlc3QtPmRhdGFfZGlyZWN0aW9uID0gU09QX1dSSVRFX0ZMQUc7CisJCWNkYlswXSA9IEJNSUNfV1JJVEU7CisJCWNkYls2XSA9IEJNSUNfQ0FDSEVfRkxVU0g7CisJCXB1dF91bmFsaWduZWRfYmUxNihidWZmZXJfbGVuZ3RoLCAmY2RiWzddKTsKKwkJYnJlYWs7CisJY2FzZSBCTUlDX0lERU5USUZZX0NPTlRST0xMRVI6CisJY2FzZSBCTUlDX0lERU5USUZZX1BIWVNJQ0FMX0RFVklDRToKKwkJcmVxdWVzdC0+ZGF0YV9kaXJlY3Rpb24gPSBTT1BfUkVBRF9GTEFHOworCQljZGJbMF0gPSBCTUlDX1JFQUQ7CisJCWNkYls2XSA9IGNtZDsKKwkJcHV0X3VuYWxpZ25lZF9iZTE2KGJ1ZmZlcl9sZW5ndGgsICZjZGJbN10pOworCQlicmVhazsKKwljYXNlIEJNSUNfV1JJVEVfSE9TVF9XRUxMTkVTUzoKKwkJcmVxdWVzdC0+ZGF0YV9kaXJlY3Rpb24gPSBTT1BfV1JJVEVfRkxBRzsKKwkJY2RiWzBdID0gQk1JQ19XUklURTsKKwkJY2RiWzZdID0gY21kOworCQlwdXRfdW5hbGlnbmVkX2JlMTYoYnVmZmVyX2xlbmd0aCwgJmNkYls3XSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LCAidW5rbm93biBjb21tYW5kIDB4JWNcbiIsCisJCQljbWQpOworCQlXQVJOX09OKGNtZCk7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAocmVxdWVzdC0+ZGF0YV9kaXJlY3Rpb24pIHsKKwljYXNlIFNPUF9SRUFEX0ZMQUc6CisJCXBjaV9kaXIgPSBQQ0lfRE1BX0ZST01ERVZJQ0U7CisJCWJyZWFrOworCWNhc2UgU09QX1dSSVRFX0ZMQUc6CisJCXBjaV9kaXIgPSBQQ0lfRE1BX1RPREVWSUNFOworCQlicmVhazsKKwljYXNlIFNPUF9OT19ESVJFQ1RJT05fRkxBRzoKKwkJcGNpX2RpciA9IFBDSV9ETUFfTk9ORTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcGNpX2RpciA9IFBDSV9ETUFfQklESVJFQ1RJT05BTDsKKwkJYnJlYWs7CisJfQorCisJKnBjaV9kaXJlY3Rpb24gPSBwY2lfZGlyOworCisJcmV0dXJuIHBxaV9tYXBfc2luZ2xlKGN0cmxfaW5mby0+cGNpX2RldiwgJnJlcXVlc3QtPnNnX2Rlc2NyaXB0b3JzWzBdLAorCQlidWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIHBjaV9kaXIpOworfQorCitzdGF0aWMgc3RydWN0IHBxaV9pb19yZXF1ZXN0ICpwcWlfYWxsb2NfaW9fcmVxdWVzdCgKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXN0cnVjdCBwcWlfaW9fcmVxdWVzdCAqaW9fcmVxdWVzdDsKKwl1MTYgaSA9IGN0cmxfaW5mby0+bmV4dF9pb19yZXF1ZXN0X3Nsb3Q7CS8qIGJlbmlnbmx5IHJhY3kgKi8KKworCXdoaWxlICgxKSB7CisJCWlvX3JlcXVlc3QgPSAmY3RybF9pbmZvLT5pb19yZXF1ZXN0X3Bvb2xbaV07CisJCWlmIChhdG9taWNfaW5jX3JldHVybigmaW9fcmVxdWVzdC0+cmVmY291bnQpID09IDEpCisJCQlicmVhazsKKwkJYXRvbWljX2RlYygmaW9fcmVxdWVzdC0+cmVmY291bnQpOworCQlpID0gKGkgKyAxKSAlIGN0cmxfaW5mby0+bWF4X2lvX3Nsb3RzOworCX0KKworCS8qIGJlbmlnbmx5IHJhY3kgKi8KKwljdHJsX2luZm8tPm5leHRfaW9fcmVxdWVzdF9zbG90ID0gKGkgKyAxKSAlIGN0cmxfaW5mby0+bWF4X2lvX3Nsb3RzOworCisJaW9fcmVxdWVzdC0+c2NtZCA9IE5VTEw7CisJaW9fcmVxdWVzdC0+c3RhdHVzID0gMDsKKwlpb19yZXF1ZXN0LT5lcnJvcl9pbmZvID0gTlVMTDsKKworCXJldHVybiBpb19yZXF1ZXN0OworfQorCitzdGF0aWMgdm9pZCBwcWlfZnJlZV9pb19yZXF1ZXN0KHN0cnVjdCBwcWlfaW9fcmVxdWVzdCAqaW9fcmVxdWVzdCkKK3sKKwlhdG9taWNfZGVjKCZpb19yZXF1ZXN0LT5yZWZjb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgcHFpX2lkZW50aWZ5X2NvbnRyb2xsZXIoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgYm1pY19pZGVudGlmeV9jb250cm9sbGVyICpidWZmZXIpCit7CisJaW50IHJjOworCWludCBwY2lfZGlyZWN0aW9uOworCXN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QgcmVxdWVzdDsKKworCXJjID0gcHFpX2J1aWxkX3JhaWRfcGF0aF9yZXF1ZXN0KGN0cmxfaW5mbywgJnJlcXVlc3QsCisJCUJNSUNfSURFTlRJRllfQ09OVFJPTExFUiwgUkFJRF9DVExSX0xVTklELCBidWZmZXIsCisJCXNpemVvZigqYnVmZmVyKSwgMCwgJnBjaV9kaXJlY3Rpb24pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwcWlfc3VibWl0X3JhaWRfcmVxdWVzdF9zeW5jaHJvbm91cyhjdHJsX2luZm8sICZyZXF1ZXN0LmhlYWRlciwgMCwKKwkJTlVMTCwgTk9fVElNRU9VVCk7CisKKwlwcWlfcGNpX3VubWFwKGN0cmxfaW5mby0+cGNpX2RldiwgcmVxdWVzdC5zZ19kZXNjcmlwdG9ycywgMSwKKwkJcGNpX2RpcmVjdGlvbik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3Njc2lfaW5xdWlyeShzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXU4ICpzY3NpM2FkZHIsIHUxNiB2cGRfcGFnZSwgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX2xlbmd0aCkKK3sKKwlpbnQgcmM7CisJaW50IHBjaV9kaXJlY3Rpb247CisJc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCByZXF1ZXN0OworCisJcmMgPSBwcWlfYnVpbGRfcmFpZF9wYXRoX3JlcXVlc3QoY3RybF9pbmZvLCAmcmVxdWVzdCwKKwkJSU5RVUlSWSwgc2NzaTNhZGRyLCBidWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIHZwZF9wYWdlLAorCQkmcGNpX2RpcmVjdGlvbik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHBxaV9zdWJtaXRfcmFpZF9yZXF1ZXN0X3N5bmNocm9ub3VzKGN0cmxfaW5mbywgJnJlcXVlc3QuaGVhZGVyLCAwLAorCQlOVUxMLCBOT19USU1FT1VUKTsKKworCXBxaV9wY2lfdW5tYXAoY3RybF9pbmZvLT5wY2lfZGV2LCByZXF1ZXN0LnNnX2Rlc2NyaXB0b3JzLCAxLAorCQlwY2lfZGlyZWN0aW9uKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwcWlfaWRlbnRpZnlfcGh5c2ljYWxfZGV2aWNlKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlLAorCXN0cnVjdCBibWljX2lkZW50aWZ5X3BoeXNpY2FsX2RldmljZSAqYnVmZmVyLAorCXNpemVfdCBidWZmZXJfbGVuZ3RoKQoreworCWludCByYzsKKwlpbnQgcGNpX2RpcmVjdGlvbjsKKwl1MTYgYm1pY19kZXZpY2VfaW5kZXg7CisJc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCByZXF1ZXN0OworCisJcmMgPSBwcWlfYnVpbGRfcmFpZF9wYXRoX3JlcXVlc3QoY3RybF9pbmZvLCAmcmVxdWVzdCwKKwkJQk1JQ19JREVOVElGWV9QSFlTSUNBTF9ERVZJQ0UsIFJBSURfQ1RMUl9MVU5JRCwgYnVmZmVyLAorCQlidWZmZXJfbGVuZ3RoLCAwLCAmcGNpX2RpcmVjdGlvbik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlibWljX2RldmljZV9pbmRleCA9IENJU1NfR0VUX0RSSVZFX05VTUJFUihkZXZpY2UtPnNjc2kzYWRkcik7CisJcmVxdWVzdC5jZGJbMl0gPSAodTgpYm1pY19kZXZpY2VfaW5kZXg7CisJcmVxdWVzdC5jZGJbOV0gPSAodTgpKGJtaWNfZGV2aWNlX2luZGV4ID4+IDgpOworCisJcmMgPSBwcWlfc3VibWl0X3JhaWRfcmVxdWVzdF9zeW5jaHJvbm91cyhjdHJsX2luZm8sICZyZXF1ZXN0LmhlYWRlciwKKwkJMCwgTlVMTCwgTk9fVElNRU9VVCk7CisKKwlwcWlfcGNpX3VubWFwKGN0cmxfaW5mby0+cGNpX2RldiwgcmVxdWVzdC5zZ19kZXNjcmlwdG9ycywgMSwKKwkJcGNpX2RpcmVjdGlvbik7CisKKwlyZXR1cm4gcmM7Cit9CisKKyNkZWZpbmUgU0FfQ0FDSEVfRkxVU0hfQlVGRkVSX0xFTkdUSAk0CisKK3N0YXRpYyBpbnQgcHFpX2ZsdXNoX2NhY2hlKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJaW50IHJjOworCXN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QgcmVxdWVzdDsKKwlpbnQgcGNpX2RpcmVjdGlvbjsKKwl1OCAqYnVmZmVyOworCisJLyoKKwkgKiBEb24ndCBib3RoZXIgdHJ5aW5nIHRvIGZsdXNoIHRoZSBjYWNoZSBpZiB0aGUgY29udHJvbGxlciBpcworCSAqIGxvY2tlZCB1cC4KKwkgKi8KKwlpZiAocHFpX2N0cmxfb2ZmbGluZShjdHJsX2luZm8pKQorCQlyZXR1cm4gLUVOWElPOworCisJYnVmZmVyID0ga3phbGxvYyhTQV9DQUNIRV9GTFVTSF9CVUZGRVJfTEVOR1RILCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyYyA9IHBxaV9idWlsZF9yYWlkX3BhdGhfcmVxdWVzdChjdHJsX2luZm8sICZyZXF1ZXN0LAorCQlTQV9DQUNIRV9GTFVTSCwgUkFJRF9DVExSX0xVTklELCBidWZmZXIsCisJCVNBX0NBQ0hFX0ZMVVNIX0JVRkZFUl9MRU5HVEgsIDAsICZwY2lfZGlyZWN0aW9uKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJcmMgPSBwcWlfc3VibWl0X3JhaWRfcmVxdWVzdF9zeW5jaHJvbm91cyhjdHJsX2luZm8sICZyZXF1ZXN0LmhlYWRlciwKKwkJMCwgTlVMTCwgTk9fVElNRU9VVCk7CisKKwlwcWlfcGNpX3VubWFwKGN0cmxfaW5mby0+cGNpX2RldiwgcmVxdWVzdC5zZ19kZXNjcmlwdG9ycywgMSwKKwkJcGNpX2RpcmVjdGlvbik7CisKK291dDoKKwlrZnJlZShidWZmZXIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBxaV93cml0ZV9ob3N0X3dlbGxuZXNzKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX2xlbmd0aCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCByZXF1ZXN0OworCWludCBwY2lfZGlyZWN0aW9uOworCisJcmMgPSBwcWlfYnVpbGRfcmFpZF9wYXRoX3JlcXVlc3QoY3RybF9pbmZvLCAmcmVxdWVzdCwKKwkJQk1JQ19XUklURV9IT1NUX1dFTExORVNTLCBSQUlEX0NUTFJfTFVOSUQsIGJ1ZmZlciwKKwkJYnVmZmVyX2xlbmd0aCwgMCwgJnBjaV9kaXJlY3Rpb24pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwcWlfc3VibWl0X3JhaWRfcmVxdWVzdF9zeW5jaHJvbm91cyhjdHJsX2luZm8sICZyZXF1ZXN0LmhlYWRlciwKKwkJMCwgTlVMTCwgTk9fVElNRU9VVCk7CisKKwlwcWlfcGNpX3VubWFwKGN0cmxfaW5mby0+cGNpX2RldiwgcmVxdWVzdC5zZ19kZXNjcmlwdG9ycywgMSwKKwkJcGNpX2RpcmVjdGlvbik7CisKKwlyZXR1cm4gcmM7Cit9CisKKyNwcmFnbWEgcGFjaygxKQorCitzdHJ1Y3QgYm1pY19ob3N0X3dlbGxuZXNzX2RyaXZlcl92ZXJzaW9uIHsKKwl1OAlzdGFydF90YWdbNF07CisJdTgJZHJpdmVyX3ZlcnNpb25fdGFnWzJdOworCV9fbGUxNglkcml2ZXJfdmVyc2lvbl9sZW5ndGg7CisJY2hhcglkcml2ZXJfdmVyc2lvblszMl07CisJdTgJZW5kX3RhZ1syXTsKK307CisKKyNwcmFnbWEgcGFjaygpCisKK3N0YXRpYyBpbnQgcHFpX3dyaXRlX2RyaXZlcl92ZXJzaW9uX3RvX2hvc3Rfd2VsbG5lc3MoCisJc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGJtaWNfaG9zdF93ZWxsbmVzc19kcml2ZXJfdmVyc2lvbiAqYnVmZmVyOworCXNpemVfdCBidWZmZXJfbGVuZ3RoOworCisJYnVmZmVyX2xlbmd0aCA9IHNpemVvZigqYnVmZmVyKTsKKworCWJ1ZmZlciA9IGttYWxsb2MoYnVmZmVyX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJYnVmZmVyLT5zdGFydF90YWdbMF0gPSAnPCc7CisJYnVmZmVyLT5zdGFydF90YWdbMV0gPSAnSCc7CisJYnVmZmVyLT5zdGFydF90YWdbMl0gPSAnVyc7CisJYnVmZmVyLT5zdGFydF90YWdbM10gPSAnPic7CisJYnVmZmVyLT5kcml2ZXJfdmVyc2lvbl90YWdbMF0gPSAnRCc7CisJYnVmZmVyLT5kcml2ZXJfdmVyc2lvbl90YWdbMV0gPSAnVic7CisJcHV0X3VuYWxpZ25lZF9sZTE2KHNpemVvZihidWZmZXItPmRyaXZlcl92ZXJzaW9uKSwKKwkJJmJ1ZmZlci0+ZHJpdmVyX3ZlcnNpb25fbGVuZ3RoKTsKKwlzdHJuY3B5KGJ1ZmZlci0+ZHJpdmVyX3ZlcnNpb24sIERSSVZFUl9WRVJTSU9OLAorCQlzaXplb2YoYnVmZmVyLT5kcml2ZXJfdmVyc2lvbikgLSAxKTsKKwlidWZmZXItPmRyaXZlcl92ZXJzaW9uW3NpemVvZihidWZmZXItPmRyaXZlcl92ZXJzaW9uKSAtIDFdID0gJ1wwJzsKKwlidWZmZXItPmVuZF90YWdbMF0gPSAnWic7CisJYnVmZmVyLT5lbmRfdGFnWzFdID0gJ1onOworCisJcmMgPSBwcWlfd3JpdGVfaG9zdF93ZWxsbmVzcyhjdHJsX2luZm8sIGJ1ZmZlciwgYnVmZmVyX2xlbmd0aCk7CisKKwlrZnJlZShidWZmZXIpOworCisJcmV0dXJuIHJjOworfQorCisjcHJhZ21hIHBhY2soMSkKKworc3RydWN0IGJtaWNfaG9zdF93ZWxsbmVzc190aW1lIHsKKwl1OAlzdGFydF90YWdbNF07CisJdTgJdGltZV90YWdbMl07CisJX19sZTE2CXRpbWVfbGVuZ3RoOworCXU4CXRpbWVbOF07CisJdTgJZG9udF93cml0ZV90YWdbMl07CisJdTgJZW5kX3RhZ1syXTsKK307CisKKyNwcmFnbWEgcGFjaygpCisKK3N0YXRpYyBpbnQgcHFpX3dyaXRlX2N1cnJlbnRfdGltZV90b19ob3N0X3dlbGxuZXNzKAorCXN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJaW50IHJjOworCXN0cnVjdCBibWljX2hvc3Rfd2VsbG5lc3NfdGltZSAqYnVmZmVyOworCXNpemVfdCBidWZmZXJfbGVuZ3RoOworCXRpbWU2NF90IGxvY2FsX3RpbWU7CisJdW5zaWduZWQgaW50IHllYXI7CisJc3RydWN0IHRpbWV2YWwgdGltZTsKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwlidWZmZXJfbGVuZ3RoID0gc2l6ZW9mKCpidWZmZXIpOworCisJYnVmZmVyID0ga21hbGxvYyhidWZmZXJfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlidWZmZXItPnN0YXJ0X3RhZ1swXSA9ICc8JzsKKwlidWZmZXItPnN0YXJ0X3RhZ1sxXSA9ICdIJzsKKwlidWZmZXItPnN0YXJ0X3RhZ1syXSA9ICdXJzsKKwlidWZmZXItPnN0YXJ0X3RhZ1szXSA9ICc+JzsKKwlidWZmZXItPnRpbWVfdGFnWzBdID0gJ1QnOworCWJ1ZmZlci0+dGltZV90YWdbMV0gPSAnRCc7CisJcHV0X3VuYWxpZ25lZF9sZTE2KHNpemVvZihidWZmZXItPnRpbWUpLAorCQkmYnVmZmVyLT50aW1lX2xlbmd0aCk7CisKKwlkb19nZXR0aW1lb2ZkYXkoJnRpbWUpOworCWxvY2FsX3RpbWUgPSB0aW1lLnR2X3NlYyAtIChzeXNfdHoudHpfbWludXRlc3dlc3QgKiA2MCk7CisJcnRjX3RpbWU2NF90b190bShsb2NhbF90aW1lLCAmdG0pOworCXllYXIgPSB0bS50bV95ZWFyICsgMTkwMDsKKworCWJ1ZmZlci0+dGltZVswXSA9IGJpbjJiY2QodG0udG1faG91cik7CisJYnVmZmVyLT50aW1lWzFdID0gYmluMmJjZCh0bS50bV9taW4pOworCWJ1ZmZlci0+dGltZVsyXSA9IGJpbjJiY2QodG0udG1fc2VjKTsKKwlidWZmZXItPnRpbWVbM10gPSAwOworCWJ1ZmZlci0+dGltZVs0XSA9IGJpbjJiY2QodG0udG1fbW9uICsgMSk7CisJYnVmZmVyLT50aW1lWzVdID0gYmluMmJjZCh0bS50bV9tZGF5KTsKKwlidWZmZXItPnRpbWVbNl0gPSBiaW4yYmNkKHllYXIgLyAxMDApOworCWJ1ZmZlci0+dGltZVs3XSA9IGJpbjJiY2QoeWVhciAlIDEwMCk7CisKKwlidWZmZXItPmRvbnRfd3JpdGVfdGFnWzBdID0gJ0QnOworCWJ1ZmZlci0+ZG9udF93cml0ZV90YWdbMV0gPSAnVyc7CisJYnVmZmVyLT5lbmRfdGFnWzBdID0gJ1onOworCWJ1ZmZlci0+ZW5kX3RhZ1sxXSA9ICdaJzsKKworCXJjID0gcHFpX3dyaXRlX2hvc3Rfd2VsbG5lc3MoY3RybF9pbmZvLCBidWZmZXIsIGJ1ZmZlcl9sZW5ndGgpOworCisJa2ZyZWUoYnVmZmVyKTsKKworCXJldHVybiByYzsKK30KKworI2RlZmluZSBQUUlfVVBEQVRFX1RJTUVfV09SS19JTlRFUlZBTAkoMjRVTCAqIDYwICogNjAgKiBIWikKKworc3RhdGljIHZvaWQgcHFpX3VwZGF0ZV90aW1lX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJaW50IHJjOworCXN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm87CisKKwljdHJsX2luZm8gPSBjb250YWluZXJfb2YodG9fZGVsYXllZF93b3JrKHdvcmspLCBzdHJ1Y3QgcHFpX2N0cmxfaW5mbywKKwkJdXBkYXRlX3RpbWVfd29yayk7CisKKwlyYyA9IHBxaV93cml0ZV9jdXJyZW50X3RpbWVfdG9faG9zdF93ZWxsbmVzcyhjdHJsX2luZm8pOworCWlmIChyYykKKwkJZGV2X3dhcm4oJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJImVycm9yIHVwZGF0aW5nIHRpbWUgb24gY29udHJvbGxlclxuIik7CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmN0cmxfaW5mby0+dXBkYXRlX3RpbWVfd29yaywKKwkJUFFJX1VQREFURV9USU1FX1dPUktfSU5URVJWQUwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHFpX3NjaGVkdWxlX3VwZGF0ZV90aW1lX3dvcmtlcigKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY3RybF9pbmZvLT51cGRhdGVfdGltZV93b3JrLCAwKTsKK30KKworc3RhdGljIGludCBwcWlfcmVwb3J0X2x1bnMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywgdTggY21kLAorCXZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9sZW5ndGgpCit7CisJaW50IHJjOworCWludCBwY2lfZGlyZWN0aW9uOworCXN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QgcmVxdWVzdDsKKworCXJjID0gcHFpX2J1aWxkX3JhaWRfcGF0aF9yZXF1ZXN0KGN0cmxfaW5mbywgJnJlcXVlc3QsCisJCWNtZCwgUkFJRF9DVExSX0xVTklELCBidWZmZXIsIGJ1ZmZlcl9sZW5ndGgsIDAsICZwY2lfZGlyZWN0aW9uKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcHFpX3N1Ym1pdF9yYWlkX3JlcXVlc3Rfc3luY2hyb25vdXMoY3RybF9pbmZvLCAmcmVxdWVzdC5oZWFkZXIsIDAsCisJCU5VTEwsIE5PX1RJTUVPVVQpOworCisJcHFpX3BjaV91bm1hcChjdHJsX2luZm8tPnBjaV9kZXYsIHJlcXVlc3Quc2dfZGVzY3JpcHRvcnMsIDEsCisJCXBjaV9kaXJlY3Rpb24pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBxaV9yZXBvcnRfcGh5c19sb2dpY2FsX2x1bnMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywgdTggY21kLAorCXZvaWQgKipidWZmZXIpCit7CisJaW50IHJjOworCXNpemVfdCBsdW5fbGlzdF9sZW5ndGg7CisJc2l6ZV90IGx1bl9kYXRhX2xlbmd0aDsKKwlzaXplX3QgbmV3X2x1bl9saXN0X2xlbmd0aDsKKwl2b2lkICpsdW5fZGF0YSA9IE5VTEw7CisJc3RydWN0IHJlcG9ydF9sdW5faGVhZGVyICpyZXBvcnRfbHVuX2hlYWRlcjsKKworCXJlcG9ydF9sdW5faGVhZGVyID0ga21hbGxvYyhzaXplb2YoKnJlcG9ydF9sdW5faGVhZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXBvcnRfbHVuX2hlYWRlcikgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gcHFpX3JlcG9ydF9sdW5zKGN0cmxfaW5mbywgY21kLCByZXBvcnRfbHVuX2hlYWRlciwKKwkJc2l6ZW9mKCpyZXBvcnRfbHVuX2hlYWRlcikpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisKKwlsdW5fbGlzdF9sZW5ndGggPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnJlcG9ydF9sdW5faGVhZGVyLT5saXN0X2xlbmd0aCk7CisKK2FnYWluOgorCWx1bl9kYXRhX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgcmVwb3J0X2x1bl9oZWFkZXIpICsgbHVuX2xpc3RfbGVuZ3RoOworCisJbHVuX2RhdGEgPSBrbWFsbG9jKGx1bl9kYXRhX2xlbmd0aCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsdW5fZGF0YSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWlmIChsdW5fbGlzdF9sZW5ndGggPT0gMCkgeworCQltZW1jcHkobHVuX2RhdGEsIHJlcG9ydF9sdW5faGVhZGVyLCBzaXplb2YoKnJlcG9ydF9sdW5faGVhZGVyKSk7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gcHFpX3JlcG9ydF9sdW5zKGN0cmxfaW5mbywgY21kLCBsdW5fZGF0YSwgbHVuX2RhdGFfbGVuZ3RoKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJbmV3X2x1bl9saXN0X2xlbmd0aCA9IGdldF91bmFsaWduZWRfYmUzMigKKwkJJigoc3RydWN0IHJlcG9ydF9sdW5faGVhZGVyICopbHVuX2RhdGEpLT5saXN0X2xlbmd0aCk7CisKKwlpZiAobmV3X2x1bl9saXN0X2xlbmd0aCA+IGx1bl9saXN0X2xlbmd0aCkgeworCQlsdW5fbGlzdF9sZW5ndGggPSBuZXdfbHVuX2xpc3RfbGVuZ3RoOworCQlrZnJlZShsdW5fZGF0YSk7CisJCWdvdG8gYWdhaW47CisJfQorCitvdXQ6CisJa2ZyZWUocmVwb3J0X2x1bl9oZWFkZXIpOworCisJaWYgKHJjKSB7CisJCWtmcmVlKGx1bl9kYXRhKTsKKwkJbHVuX2RhdGEgPSBOVUxMOworCX0KKworCSpidWZmZXIgPSBsdW5fZGF0YTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHFpX3JlcG9ydF9waHlzX2x1bnMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwl2b2lkICoqYnVmZmVyKQoreworCXJldHVybiBwcWlfcmVwb3J0X3BoeXNfbG9naWNhbF9sdW5zKGN0cmxfaW5mbywgQ0lTU19SRVBPUlRfUEhZUywKKwkJYnVmZmVyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHFpX3JlcG9ydF9sb2dpY2FsX2x1bnMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwl2b2lkICoqYnVmZmVyKQoreworCXJldHVybiBwcWlfcmVwb3J0X3BoeXNfbG9naWNhbF9sdW5zKGN0cmxfaW5mbywgQ0lTU19SRVBPUlRfTE9HLCBidWZmZXIpOworfQorCitzdGF0aWMgaW50IHBxaV9nZXRfZGV2aWNlX2xpc3RzKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJc3RydWN0IHJlcG9ydF9waHlzX2x1bl9leHRlbmRlZCAqKnBoeXNkZXZfbGlzdCwKKwlzdHJ1Y3QgcmVwb3J0X2xvZ19sdW5fZXh0ZW5kZWQgKipsb2dkZXZfbGlzdCkKK3sKKwlpbnQgcmM7CisJc2l6ZV90IGxvZ2Rldl9saXN0X2xlbmd0aDsKKwlzaXplX3QgbG9nZGV2X2RhdGFfbGVuZ3RoOworCXN0cnVjdCByZXBvcnRfbG9nX2x1bl9leHRlbmRlZCAqaW50ZXJuYWxfbG9nZGV2X2xpc3Q7CisJc3RydWN0IHJlcG9ydF9sb2dfbHVuX2V4dGVuZGVkICpsb2dkZXZfZGF0YTsKKwlzdHJ1Y3QgcmVwb3J0X2x1bl9oZWFkZXIgcmVwb3J0X2x1bl9oZWFkZXI7CisKKwlyYyA9IHBxaV9yZXBvcnRfcGh5c19sdW5zKGN0cmxfaW5mbywgKHZvaWQgKiopcGh5c2Rldl9saXN0KTsKKwlpZiAocmMpCisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJInJlcG9ydCBwaHlzaWNhbCBMVU5zIGZhaWxlZFxuIik7CisKKwlyYyA9IHBxaV9yZXBvcnRfbG9naWNhbF9sdW5zKGN0cmxfaW5mbywgKHZvaWQgKiopbG9nZGV2X2xpc3QpOworCWlmIChyYykKKwkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkicmVwb3J0IGxvZ2ljYWwgTFVOcyBmYWlsZWRcbiIpOworCisJLyoKKwkgKiBUYWNrIHRoZSBjb250cm9sbGVyIGl0c2VsZiBvbnRvIHRoZSBlbmQgb2YgdGhlIGxvZ2ljYWwgZGV2aWNlIGxpc3QuCisJICovCisKKwlsb2dkZXZfZGF0YSA9ICpsb2dkZXZfbGlzdDsKKworCWlmIChsb2dkZXZfZGF0YSkgeworCQlsb2dkZXZfbGlzdF9sZW5ndGggPQorCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKCZsb2dkZXZfZGF0YS0+aGVhZGVyLmxpc3RfbGVuZ3RoKTsKKwl9IGVsc2UgeworCQltZW1zZXQoJnJlcG9ydF9sdW5faGVhZGVyLCAwLCBzaXplb2YocmVwb3J0X2x1bl9oZWFkZXIpKTsKKwkJbG9nZGV2X2RhdGEgPQorCQkJKHN0cnVjdCByZXBvcnRfbG9nX2x1bl9leHRlbmRlZCAqKSZyZXBvcnRfbHVuX2hlYWRlcjsKKwkJbG9nZGV2X2xpc3RfbGVuZ3RoID0gMDsKKwl9CisKKwlsb2dkZXZfZGF0YV9sZW5ndGggPSBzaXplb2Yoc3RydWN0IHJlcG9ydF9sdW5faGVhZGVyKSArCisJCWxvZ2Rldl9saXN0X2xlbmd0aDsKKworCWludGVybmFsX2xvZ2Rldl9saXN0ID0ga21hbGxvYyhsb2dkZXZfZGF0YV9sZW5ndGggKworCQlzaXplb2Yoc3RydWN0IHJlcG9ydF9sb2dfbHVuX2V4dGVuZGVkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnRlcm5hbF9sb2dkZXZfbGlzdCkgeworCQlrZnJlZSgqbG9nZGV2X2xpc3QpOworCQkqbG9nZGV2X2xpc3QgPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkoaW50ZXJuYWxfbG9nZGV2X2xpc3QsIGxvZ2Rldl9kYXRhLCBsb2dkZXZfZGF0YV9sZW5ndGgpOworCW1lbXNldCgodTggKilpbnRlcm5hbF9sb2dkZXZfbGlzdCArIGxvZ2Rldl9kYXRhX2xlbmd0aCwgMCwKKwkJc2l6ZW9mKHN0cnVjdCByZXBvcnRfbG9nX2x1bl9leHRlbmRlZF9lbnRyeSkpOworCXB1dF91bmFsaWduZWRfYmUzMihsb2dkZXZfbGlzdF9sZW5ndGggKworCQlzaXplb2Yoc3RydWN0IHJlcG9ydF9sb2dfbHVuX2V4dGVuZGVkX2VudHJ5KSwKKwkJJmludGVybmFsX2xvZ2Rldl9saXN0LT5oZWFkZXIubGlzdF9sZW5ndGgpOworCisJa2ZyZWUoKmxvZ2Rldl9saXN0KTsKKwkqbG9nZGV2X2xpc3QgPSBpbnRlcm5hbF9sb2dkZXZfbGlzdDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHFpX3NldF9idXNfdGFyZ2V0X2x1bihzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UsCisJaW50IGJ1cywgaW50IHRhcmdldCwgaW50IGx1bikKK3sKKwlkZXZpY2UtPmJ1cyA9IGJ1czsKKwlkZXZpY2UtPnRhcmdldCA9IHRhcmdldDsKKwlkZXZpY2UtPmx1biA9IGx1bjsKK30KKworc3RhdGljIHZvaWQgcHFpX2Fzc2lnbl9idXNfdGFyZ2V0X2x1bihzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UpCit7CisJdTggKnNjc2kzYWRkcjsKKwl1MzIgbHVuaWQ7CisKKwlzY3NpM2FkZHIgPSBkZXZpY2UtPnNjc2kzYWRkcjsKKwlsdW5pZCA9IGdldF91bmFsaWduZWRfbGUzMihzY3NpM2FkZHIpOworCisJaWYgKHBxaV9pc19oYmFfbHVuaWQoc2NzaTNhZGRyKSkgeworCQkvKiBUaGUgc3BlY2lmaWVkIGRldmljZSBpcyB0aGUgY29udHJvbGxlci4gKi8KKwkJcHFpX3NldF9idXNfdGFyZ2V0X2x1bihkZXZpY2UsIFBRSV9IQkFfQlVTLCAwLCBsdW5pZCAmIDB4M2ZmZik7CisJCWRldmljZS0+dGFyZ2V0X2x1bl92YWxpZCA9IHRydWU7CisJCXJldHVybjsKKwl9CisKKwlpZiAocHFpX2lzX2xvZ2ljYWxfZGV2aWNlKGRldmljZSkpIHsKKwkJcHFpX3NldF9idXNfdGFyZ2V0X2x1bihkZXZpY2UsIFBRSV9SQUlEX1ZPTFVNRV9CVVMsIDAsCisJCQlsdW5pZCAmIDB4M2ZmZik7CisJCWRldmljZS0+dGFyZ2V0X2x1bl92YWxpZCA9IHRydWU7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIERlZmVyIHRhcmdldCBhbmQgTFVOIGFzc2lnbm1lbnQgZm9yIG5vbi1jb250cm9sbGVyIHBoeXNpY2FsIGRldmljZXMKKwkgKiBiZWNhdXNlIHRoZSBTQVMgdHJhbnNwb3J0IGxheWVyIHdpbGwgbWFrZSB0aGVzZSBhc3NpZ25tZW50cyBsYXRlci4KKwkgKi8KKwlwcWlfc2V0X2J1c190YXJnZXRfbHVuKGRldmljZSwgUFFJX1BIWVNJQ0FMX0RFVklDRV9CVVMsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBwcWlfZ2V0X3JhaWRfbGV2ZWwoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UpCit7CisJaW50IHJjOworCXU4IHJhaWRfbGV2ZWw7CisJdTggKmJ1ZmZlcjsKKworCXJhaWRfbGV2ZWwgPSBTQV9SQUlEX1VOS05PV047CisKKwlidWZmZXIgPSBrbWFsbG9jKDY0LCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmZmVyKSB7CisJCXJjID0gcHFpX3Njc2lfaW5xdWlyeShjdHJsX2luZm8sIGRldmljZS0+c2NzaTNhZGRyLAorCQkJVlBEX1BBR0UgfCBDSVNTX1ZQRF9MVl9ERVZJQ0VfR0VPTUVUUlksIGJ1ZmZlciwgNjQpOworCQlpZiAocmMgPT0gMCkgeworCQkJcmFpZF9sZXZlbCA9IGJ1ZmZlcls4XTsKKwkJCWlmIChyYWlkX2xldmVsID4gU0FfUkFJRF9NQVgpCisJCQkJcmFpZF9sZXZlbCA9IFNBX1JBSURfVU5LTk9XTjsKKwkJfQorCQlrZnJlZShidWZmZXIpOworCX0KKworCWRldmljZS0+cmFpZF9sZXZlbCA9IHJhaWRfbGV2ZWw7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3ZhbGlkYXRlX3JhaWRfbWFwKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlLCBzdHJ1Y3QgcmFpZF9tYXAgKnJhaWRfbWFwKQoreworCWNoYXIgKmVycl9tc2c7CisJdTMyIHJhaWRfbWFwX3NpemU7CisJdTMyIHI1b3I2X2Jsb2Nrc19wZXJfcm93OworCXVuc2lnbmVkIGludCBudW1fcGh5c19kaXNrczsKKwl1bnNpZ25lZCBpbnQgbnVtX3JhaWRfbWFwX2VudHJpZXM7CisKKwlyYWlkX21hcF9zaXplID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZyYWlkX21hcC0+c3RydWN0dXJlX3NpemUpOworCisJaWYgKHJhaWRfbWFwX3NpemUgPCBvZmZzZXRvZihzdHJ1Y3QgcmFpZF9tYXAsIGRpc2tfZGF0YSkpIHsKKwkJZXJyX21zZyA9ICJSQUlEIG1hcCB0b28gc21hbGwiOworCQlnb3RvIGJhZF9yYWlkX21hcDsKKwl9CisKKwlpZiAocmFpZF9tYXBfc2l6ZSA+IHNpemVvZigqcmFpZF9tYXApKSB7CisJCWVycl9tc2cgPSAiUkFJRCBtYXAgdG9vIGxhcmdlIjsKKwkJZ290byBiYWRfcmFpZF9tYXA7CisJfQorCisJbnVtX3BoeXNfZGlza3MgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJnJhaWRfbWFwLT5sYXlvdXRfbWFwX2NvdW50KSAqCisJCShnZXRfdW5hbGlnbmVkX2xlMTYoJnJhaWRfbWFwLT5kYXRhX2Rpc2tzX3Blcl9yb3cpICsKKwkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+bWV0YWRhdGFfZGlza3NfcGVyX3JvdykpOworCW51bV9yYWlkX21hcF9lbnRyaWVzID0gbnVtX3BoeXNfZGlza3MgKgorCQlnZXRfdW5hbGlnbmVkX2xlMTYoJnJhaWRfbWFwLT5yb3dfY250KTsKKworCWlmIChudW1fcmFpZF9tYXBfZW50cmllcyA+IFJBSURfTUFQX01BWF9FTlRSSUVTKSB7CisJCWVycl9tc2cgPSAiaW52YWxpZCBudW1iZXIgb2YgbWFwIGVudHJpZXMgaW4gUkFJRCBtYXAiOworCQlnb3RvIGJhZF9yYWlkX21hcDsKKwl9CisKKwlpZiAoZGV2aWNlLT5yYWlkX2xldmVsID09IFNBX1JBSURfMSkgeworCQlpZiAoZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+bGF5b3V0X21hcF9jb3VudCkgIT0gMikgeworCQkJZXJyX21zZyA9ICJpbnZhbGlkIFJBSUQtMSBtYXAiOworCQkJZ290byBiYWRfcmFpZF9tYXA7CisJCX0KKwl9IGVsc2UgaWYgKGRldmljZS0+cmFpZF9sZXZlbCA9PSBTQV9SQUlEX0FETSkgeworCQlpZiAoZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+bGF5b3V0X21hcF9jb3VudCkgIT0gMykgeworCQkJZXJyX21zZyA9ICJpbnZhbGlkIFJBSUQtMShBRE0pIG1hcCI7CisJCQlnb3RvIGJhZF9yYWlkX21hcDsKKwkJfQorCX0gZWxzZSBpZiAoKGRldmljZS0+cmFpZF9sZXZlbCA9PSBTQV9SQUlEXzUgfHwKKwkJZGV2aWNlLT5yYWlkX2xldmVsID09IFNBX1JBSURfNikgJiYKKwkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+bGF5b3V0X21hcF9jb3VudCkgPiAxKSB7CisJCS8qIFJBSUQgNTAvNjAgKi8KKwkJcjVvcjZfYmxvY2tzX3Blcl9yb3cgPQorCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+c3RyaXBfc2l6ZSkgKgorCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+ZGF0YV9kaXNrc19wZXJfcm93KTsKKwkJaWYgKHI1b3I2X2Jsb2Nrc19wZXJfcm93ID09IDApIHsKKwkJCWVycl9tc2cgPSAiaW52YWxpZCBSQUlELTUgb3IgUkFJRC02IG1hcCI7CisJCQlnb3RvIGJhZF9yYWlkX21hcDsKKwkJfQorCX0KKworCXJldHVybiAwOworCitiYWRfcmFpZF9tYXA6CisJZGV2X3dhcm4oJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LCAiJXNcbiIsIGVycl9tc2cpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgcHFpX2dldF9yYWlkX21hcChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZSkKK3sKKwlpbnQgcmM7CisJaW50IHBjaV9kaXJlY3Rpb247CisJc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCByYWlkX21hcCAqcmFpZF9tYXA7CisKKwlyYWlkX21hcCA9IGttYWxsb2Moc2l6ZW9mKCpyYWlkX21hcCksIEdGUF9LRVJORUwpOworCWlmICghcmFpZF9tYXApCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSBwcWlfYnVpbGRfcmFpZF9wYXRoX3JlcXVlc3QoY3RybF9pbmZvLCAmcmVxdWVzdCwKKwkJQ0lTU19HRVRfUkFJRF9NQVAsIGRldmljZS0+c2NzaTNhZGRyLCByYWlkX21hcCwKKwkJc2l6ZW9mKCpyYWlkX21hcCksIDAsICZwY2lfZGlyZWN0aW9uKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyb3I7CisKKwlyYyA9IHBxaV9zdWJtaXRfcmFpZF9yZXF1ZXN0X3N5bmNocm9ub3VzKGN0cmxfaW5mbywgJnJlcXVlc3QuaGVhZGVyLCAwLAorCQlOVUxMLCBOT19USU1FT1VUKTsKKworCXBxaV9wY2lfdW5tYXAoY3RybF9pbmZvLT5wY2lfZGV2LCByZXF1ZXN0LnNnX2Rlc2NyaXB0b3JzLCAxLAorCQlwY2lfZGlyZWN0aW9uKTsKKworCWlmIChyYykKKwkJZ290byBlcnJvcjsKKworCXJjID0gcHFpX3ZhbGlkYXRlX3JhaWRfbWFwKGN0cmxfaW5mbywgZGV2aWNlLCByYWlkX21hcCk7CisJaWYgKHJjKQorCQlnb3RvIGVycm9yOworCisJZGV2aWNlLT5yYWlkX21hcCA9IHJhaWRfbWFwOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWtmcmVlKHJhaWRfbWFwKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgcHFpX2dldF9vZmZsb2FkX3N0YXR1cyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZSkKK3sKKwlpbnQgcmM7CisJdTggKmJ1ZmZlcjsKKwl1OCBvZmZsb2FkX3N0YXR1czsKKworCWJ1ZmZlciA9IGttYWxsb2MoNjQsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm47CisKKwlyYyA9IHBxaV9zY3NpX2lucXVpcnkoY3RybF9pbmZvLCBkZXZpY2UtPnNjc2kzYWRkciwKKwkJVlBEX1BBR0UgfCBDSVNTX1ZQRF9MVl9PRkZMT0FEX1NUQVRVUywgYnVmZmVyLCA2NCk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworI2RlZmluZSBPRkZMT0FEX1NUQVRVU19CWVRFCTQKKyNkZWZpbmUgT0ZGTE9BRF9DT05GSUdVUkVEX0JJVAkweDEKKyNkZWZpbmUgT0ZGTE9BRF9FTkFCTEVEX0JJVAkweDIKKworCW9mZmxvYWRfc3RhdHVzID0gYnVmZmVyW09GRkxPQURfU1RBVFVTX0JZVEVdOworCWRldmljZS0+b2ZmbG9hZF9jb25maWd1cmVkID0KKwkJISEob2ZmbG9hZF9zdGF0dXMgJiBPRkZMT0FEX0NPTkZJR1VSRURfQklUKTsKKwlpZiAoZGV2aWNlLT5vZmZsb2FkX2NvbmZpZ3VyZWQpIHsKKwkJZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWRfcGVuZGluZyA9CisJCQkhIShvZmZsb2FkX3N0YXR1cyAmIE9GRkxPQURfRU5BQkxFRF9CSVQpOworCQlpZiAocHFpX2dldF9yYWlkX21hcChjdHJsX2luZm8sIGRldmljZSkpCisJCQlkZXZpY2UtPm9mZmxvYWRfZW5hYmxlZF9wZW5kaW5nID0gZmFsc2U7CisJfQorCitvdXQ6CisJa2ZyZWUoYnVmZmVyKTsKK30KKworLyoKKyAqIFVzZSB2ZW5kb3Itc3BlY2lmaWMgVlBEIHRvIGRldGVybWluZSBvbmxpbmUvb2ZmbGluZSBzdGF0dXMgb2YgYSB2b2x1bWUuCisgKi8KKworc3RhdGljIHZvaWQgcHFpX2dldF92b2x1bWVfc3RhdHVzKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlKQoreworCWludCByYzsKKwlzaXplX3QgcGFnZV9sZW5ndGg7CisJdTggdm9sdW1lX3N0YXR1cyA9IENJU1NfTFZfU1RBVFVTX1VOQVZBSUxBQkxFOworCWJvb2wgdm9sdW1lX29mZmxpbmUgPSB0cnVlOworCXUzMiB2b2x1bWVfZmxhZ3M7CisJc3RydWN0IGNpc3NfdnBkX2xvZ2ljYWxfdm9sdW1lX3N0YXR1cyAqdnBkOworCisJdnBkID0ga21hbGxvYyhzaXplb2YoKnZwZCksIEdGUF9LRVJORUwpOworCWlmICghdnBkKQorCQlnb3RvIG5vX2J1ZmZlcjsKKworCXJjID0gcHFpX3Njc2lfaW5xdWlyeShjdHJsX2luZm8sIGRldmljZS0+c2NzaTNhZGRyLAorCQlWUERfUEFHRSB8IENJU1NfVlBEX0xWX1NUQVRVUywgdnBkLCBzaXplb2YoKnZwZCkpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisKKwlwYWdlX2xlbmd0aCA9IG9mZnNldG9mKHN0cnVjdCBjaXNzX3ZwZF9sb2dpY2FsX3ZvbHVtZV9zdGF0dXMsCisJCXZvbHVtZV9zdGF0dXMpICsgdnBkLT5wYWdlX2xlbmd0aDsKKwlpZiAocGFnZV9sZW5ndGggPCBzaXplb2YoKnZwZCkpCisJCWdvdG8gb3V0OworCisJdm9sdW1lX3N0YXR1cyA9IHZwZC0+dm9sdW1lX3N0YXR1czsKKwl2b2x1bWVfZmxhZ3MgPSBnZXRfdW5hbGlnbmVkX2JlMzIoJnZwZC0+ZmxhZ3MpOworCXZvbHVtZV9vZmZsaW5lID0gKHZvbHVtZV9mbGFncyAmIENJU1NfTFZfRkxBR1NfTk9fSE9TVF9JTykgIT0gMDsKKworb3V0OgorCWtmcmVlKHZwZCk7Citub19idWZmZXI6CisJZGV2aWNlLT52b2x1bWVfc3RhdHVzID0gdm9sdW1lX3N0YXR1czsKKwlkZXZpY2UtPnZvbHVtZV9vZmZsaW5lID0gdm9sdW1lX29mZmxpbmU7Cit9CisKK3N0YXRpYyBpbnQgcHFpX2dldF9kZXZpY2VfaW5mbyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZSkKK3sKKwlpbnQgcmM7CisJdTggKmJ1ZmZlcjsKKworCWJ1ZmZlciA9IGttYWxsb2MoNjQsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFNlbmQgYW4gaW5xdWlyeSB0byB0aGUgZGV2aWNlIHRvIHNlZSB3aGF0IGl0IGlzLiAqLworCXJjID0gcHFpX3Njc2lfaW5xdWlyeShjdHJsX2luZm8sIGRldmljZS0+c2NzaTNhZGRyLCAwLCBidWZmZXIsIDY0KTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJc2NzaV9zYW5pdGl6ZV9pbnF1aXJ5X3N0cmluZygmYnVmZmVyWzhdLCA4KTsKKwlzY3NpX3Nhbml0aXplX2lucXVpcnlfc3RyaW5nKCZidWZmZXJbMTZdLCAxNik7CisKKwlkZXZpY2UtPmRldnR5cGUgPSBidWZmZXJbMF0gJiAweDFmOworCW1lbWNweShkZXZpY2UtPnZlbmRvciwgJmJ1ZmZlcls4XSwKKwkJc2l6ZW9mKGRldmljZS0+dmVuZG9yKSk7CisJbWVtY3B5KGRldmljZS0+bW9kZWwsICZidWZmZXJbMTZdLAorCQlzaXplb2YoZGV2aWNlLT5tb2RlbCkpOworCisJaWYgKHBxaV9pc19sb2dpY2FsX2RldmljZShkZXZpY2UpICYmIGRldmljZS0+ZGV2dHlwZSA9PSBUWVBFX0RJU0spIHsKKwkJcHFpX2dldF9yYWlkX2xldmVsKGN0cmxfaW5mbywgZGV2aWNlKTsKKwkJcHFpX2dldF9vZmZsb2FkX3N0YXR1cyhjdHJsX2luZm8sIGRldmljZSk7CisJCXBxaV9nZXRfdm9sdW1lX3N0YXR1cyhjdHJsX2luZm8sIGRldmljZSk7CisJfQorCitvdXQ6CisJa2ZyZWUoYnVmZmVyKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgcHFpX2dldF9waHlzaWNhbF9kaXNrX2luZm8oc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UsCisJc3RydWN0IGJtaWNfaWRlbnRpZnlfcGh5c2ljYWxfZGV2aWNlICppZF9waHlzKQoreworCWludCByYzsKKworCW1lbXNldChpZF9waHlzLCAwLCBzaXplb2YoKmlkX3BoeXMpKTsKKworCXJjID0gcHFpX2lkZW50aWZ5X3BoeXNpY2FsX2RldmljZShjdHJsX2luZm8sIGRldmljZSwKKwkJaWRfcGh5cywgc2l6ZW9mKCppZF9waHlzKSk7CisJaWYgKHJjKSB7CisJCWRldmljZS0+cXVldWVfZGVwdGggPSBQUUlfUEhZU0lDQUxfRElTS19ERUZBVUxUX01BWF9RVUVVRV9ERVBUSDsKKwkJcmV0dXJuOworCX0KKworCWRldmljZS0+cXVldWVfZGVwdGggPQorCQlnZXRfdW5hbGlnbmVkX2xlMTYoJmlkX3BoeXMtPmN1cnJlbnRfcXVldWVfZGVwdGhfbGltaXQpOworCWRldmljZS0+ZGV2aWNlX3R5cGUgPSBpZF9waHlzLT5kZXZpY2VfdHlwZTsKKwlkZXZpY2UtPmFjdGl2ZV9wYXRoX2luZGV4ID0gaWRfcGh5cy0+YWN0aXZlX3BhdGhfbnVtYmVyOworCWRldmljZS0+cGF0aF9tYXAgPSBpZF9waHlzLT5yZWR1bmRhbnRfcGF0aF9wcmVzZW50X21hcDsKKwltZW1jcHkoJmRldmljZS0+Ym94LAorCQkmaWRfcGh5cy0+YWx0ZXJuYXRlX3BhdGhzX3BoeXNfYm94X29uX3BvcnQsCisJCXNpemVvZihkZXZpY2UtPmJveCkpOworCW1lbWNweSgmZGV2aWNlLT5waHlzX2Nvbm5lY3RvciwKKwkJJmlkX3BoeXMtPmFsdGVybmF0ZV9wYXRoc19waHlzX2Nvbm5lY3RvciwKKwkJc2l6ZW9mKGRldmljZS0+cGh5c19jb25uZWN0b3IpKTsKKwlkZXZpY2UtPmJheSA9IGlkX3BoeXMtPnBoeXNfYmF5X2luX2JveDsKK30KKworc3RhdGljIHZvaWQgcHFpX3Nob3dfdm9sdW1lX3N0YXR1cyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZSkKK3sKKwljaGFyICpzdGF0dXM7CisJc3RhdGljIGNvbnN0IGNoYXIgdW5rbm93bl9zdGF0ZV9zdHJbXSA9CisJCSJWb2x1bWUgaXMgaW4gYW4gdW5rbm93biBzdGF0ZSAoJXUpIjsKKwljaGFyIHVua25vd25fc3RhdGVfYnVmZmVyW3NpemVvZih1bmtub3duX3N0YXRlX3N0cikgKyAxMF07CisKKwlzd2l0Y2ggKGRldmljZS0+dm9sdW1lX3N0YXR1cykgeworCWNhc2UgQ0lTU19MVl9PSzoKKwkJc3RhdHVzID0gIlZvbHVtZSBvbmxpbmUiOworCQlicmVhazsKKwljYXNlIENJU1NfTFZfRkFJTEVEOgorCQlzdGF0dXMgPSAiVm9sdW1lIGZhaWxlZCI7CisJCWJyZWFrOworCWNhc2UgQ0lTU19MVl9OT1RfQ09ORklHVVJFRDoKKwkJc3RhdHVzID0gIlZvbHVtZSBub3QgY29uZmlndXJlZCI7CisJCWJyZWFrOworCWNhc2UgQ0lTU19MVl9ERUdSQURFRDoKKwkJc3RhdHVzID0gIlZvbHVtZSBkZWdyYWRlZCI7CisJCWJyZWFrOworCWNhc2UgQ0lTU19MVl9SRUFEWV9GT1JfUkVDT1ZFUlk6CisJCXN0YXR1cyA9ICJWb2x1bWUgcmVhZHkgZm9yIHJlY292ZXJ5IG9wZXJhdGlvbiI7CisJCWJyZWFrOworCWNhc2UgQ0lTU19MVl9VTkRFUkdPSU5HX1JFQ09WRVJZOgorCQlzdGF0dXMgPSAiVm9sdW1lIHVuZGVyZ29pbmcgcmVjb3ZlcnkiOworCQlicmVhazsKKwljYXNlIENJU1NfTFZfV1JPTkdfUEhZU0lDQUxfRFJJVkVfUkVQTEFDRUQ6CisJCXN0YXR1cyA9ICJXcm9uZyBwaHlzaWNhbCBkcml2ZSB3YXMgcmVwbGFjZWQiOworCQlicmVhazsKKwljYXNlIENJU1NfTFZfUEhZU0lDQUxfRFJJVkVfQ09OTkVDVElPTl9QUk9CTEVNOgorCQlzdGF0dXMgPSAiQSBwaHlzaWNhbCBkcml2ZSBub3QgcHJvcGVybHkgY29ubmVjdGVkIjsKKwkJYnJlYWs7CisJY2FzZSBDSVNTX0xWX0hBUkRXQVJFX09WRVJIRUFUSU5HOgorCQlzdGF0dXMgPSAiSGFyZHdhcmUgaXMgb3ZlcmhlYXRpbmciOworCQlicmVhazsKKwljYXNlIENJU1NfTFZfSEFSRFdBUkVfSEFTX09WRVJIRUFURUQ6CisJCXN0YXR1cyA9ICJIYXJkd2FyZSBoYXMgb3ZlcmhlYXRlZCI7CisJCWJyZWFrOworCWNhc2UgQ0lTU19MVl9VTkRFUkdPSU5HX0VYUEFOU0lPTjoKKwkJc3RhdHVzID0gIlZvbHVtZSB1bmRlcmdvaW5nIGV4cGFuc2lvbiI7CisJCWJyZWFrOworCWNhc2UgQ0lTU19MVl9OT1RfQVZBSUxBQkxFOgorCQlzdGF0dXMgPSAiVm9sdW1lIHdhaXRpbmcgZm9yIHRyYW5zZm9ybWluZyB2b2x1bWUiOworCQlicmVhazsKKwljYXNlIENJU1NfTFZfUVVFVUVEX0ZPUl9FWFBBTlNJT046CisJCXN0YXR1cyA9ICJWb2x1bWUgcXVldWVkIGZvciBleHBhbnNpb24iOworCQlicmVhazsKKwljYXNlIENJU1NfTFZfRElTQUJMRURfU0NTSV9JRF9DT05GTElDVDoKKwkJc3RhdHVzID0gIlZvbHVtZSBkaXNhYmxlZCBkdWUgdG8gU0NTSSBJRCBjb25mbGljdCI7CisJCWJyZWFrOworCWNhc2UgQ0lTU19MVl9FSkVDVEVEOgorCQlzdGF0dXMgPSAiVm9sdW1lIGhhcyBiZWVuIGVqZWN0ZWQiOworCQlicmVhazsKKwljYXNlIENJU1NfTFZfVU5ERVJHT0lOR19FUkFTRToKKwkJc3RhdHVzID0gIlZvbHVtZSB1bmRlcmdvaW5nIGJhY2tncm91bmQgZXJhc2UiOworCQlicmVhazsKKwljYXNlIENJU1NfTFZfUkVBRFlfRk9SX1BSRURJQ1RJVkVfU1BBUkVfUkVCVUlMRDoKKwkJc3RhdHVzID0gIlZvbHVtZSByZWFkeSBmb3IgcHJlZGljdGl2ZSBzcGFyZSByZWJ1aWxkIjsKKwkJYnJlYWs7CisJY2FzZSBDSVNTX0xWX1VOREVSR09JTkdfUlBJOgorCQlzdGF0dXMgPSAiVm9sdW1lIHVuZGVyZ29pbmcgcmFwaWQgcGFyaXR5IGluaXRpYWxpemF0aW9uIjsKKwkJYnJlYWs7CisJY2FzZSBDSVNTX0xWX1BFTkRJTkdfUlBJOgorCQlzdGF0dXMgPSAiVm9sdW1lIHF1ZXVlZCBmb3IgcmFwaWQgcGFyaXR5IGluaXRpYWxpemF0aW9uIjsKKwkJYnJlYWs7CisJY2FzZSBDSVNTX0xWX0VOQ1JZUFRFRF9OT19LRVk6CisJCXN0YXR1cyA9ICJFbmNyeXB0ZWQgdm9sdW1lIGluYWNjZXNzaWJsZSAtIGtleSBub3QgcHJlc2VudCI7CisJCWJyZWFrOworCWNhc2UgQ0lTU19MVl9VTkRFUkdPSU5HX0VOQ1JZUFRJT046CisJCXN0YXR1cyA9ICJWb2x1bWUgdW5kZXJnb2luZyBlbmNyeXB0aW9uIHByb2Nlc3MiOworCQlicmVhazsKKwljYXNlIENJU1NfTFZfVU5ERVJHT0lOR19FTkNSWVBUSU9OX1JFS0VZSU5HOgorCQlzdGF0dXMgPSAiVm9sdW1lIHVuZGVyZ29pbmcgZW5jcnlwdGlvbiByZS1rZXlpbmcgcHJvY2VzcyI7CisJCWJyZWFrOworCWNhc2UgQ0lTU19MVl9FTkNSWVBURURfSU5fTk9OX0VOQ1JZUFRFRF9DT05UUk9MTEVSOgorCQlzdGF0dXMgPQorCQkJIkVuY3J5cHRlZCB2b2x1bWUgaW5hY2Nlc3NpYmxlIC0gZGlzYWJsZWQgb24gY3RybCI7CisJCWJyZWFrOworCWNhc2UgQ0lTU19MVl9QRU5ESU5HX0VOQ1JZUFRJT046CisJCXN0YXR1cyA9ICJWb2x1bWUgcGVuZGluZyBtaWdyYXRpb24gdG8gZW5jcnlwdGVkIHN0YXRlIjsKKwkJYnJlYWs7CisJY2FzZSBDSVNTX0xWX1BFTkRJTkdfRU5DUllQVElPTl9SRUtFWUlORzoKKwkJc3RhdHVzID0gIlZvbHVtZSBwZW5kaW5nIGVuY3J5cHRpb24gcmVrZXlpbmciOworCQlicmVhazsKKwljYXNlIENJU1NfTFZfTk9UX1NVUFBPUlRFRDoKKwkJc3RhdHVzID0gIlZvbHVtZSBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgY29udHJvbGxlciI7CisJCWJyZWFrOworCWNhc2UgQ0lTU19MVl9TVEFUVVNfVU5BVkFJTEFCTEU6CisJCXN0YXR1cyA9ICJWb2x1bWUgc3RhdHVzIG5vdCBhdmFpbGFibGUiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzbnByaW50Zih1bmtub3duX3N0YXRlX2J1ZmZlciwgc2l6ZW9mKHVua25vd25fc3RhdGVfYnVmZmVyKSwKKwkJCXVua25vd25fc3RhdGVfc3RyLCBkZXZpY2UtPnZvbHVtZV9zdGF0dXMpOworCQlzdGF0dXMgPSB1bmtub3duX3N0YXRlX2J1ZmZlcjsKKwkJYnJlYWs7CisJfQorCisJZGV2X2luZm8oJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkic2NzaSAlZDolZDolZDolZCAlc1xuIiwKKwkJY3RybF9pbmZvLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCWRldmljZS0+YnVzLCBkZXZpY2UtPnRhcmdldCwgZGV2aWNlLT5sdW4sIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpwcWlfZmluZF9kaXNrX2J5X2Fpb19oYW5kbGUoCisJc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywgdTMyIGFpb19oYW5kbGUpCit7CisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZjdHJsX2luZm8tPnNjc2lfZGV2aWNlX2xpc3QsCisJCXNjc2lfZGV2aWNlX2xpc3RfZW50cnkpIHsKKwkJaWYgKGRldmljZS0+ZGV2dHlwZSAhPSBUWVBFX0RJU0sgJiYgZGV2aWNlLT5kZXZ0eXBlICE9IFRZUEVfWkJDKQorCQkJY29udGludWU7CisJCWlmIChwcWlfaXNfbG9naWNhbF9kZXZpY2UoZGV2aWNlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGV2aWNlLT5haW9faGFuZGxlID09IGFpb19oYW5kbGUpCisJCQlyZXR1cm4gZGV2aWNlOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwcWlfdXBkYXRlX2xvZ2ljYWxfZHJpdmVfcXVldWVfZGVwdGgoCisJc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywgc3RydWN0IHBxaV9zY3NpX2RldiAqbG9naWNhbF9kcml2ZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgcmFpZF9tYXAgKnJhaWRfbWFwOworCXN0cnVjdCByYWlkX21hcF9kaXNrX2RhdGEgKmRpc2tfZGF0YTsKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpwaHlzX2Rpc2s7CisJdW5zaWduZWQgaW50IG51bV9waHlzX2Rpc2tzOworCXVuc2lnbmVkIGludCBudW1fcmFpZF9tYXBfZW50cmllczsKKwl1bnNpZ25lZCBpbnQgcXVldWVfZGVwdGg7CisKKwlsb2dpY2FsX2RyaXZlLT5xdWV1ZV9kZXB0aCA9IFBRSV9MT0dJQ0FMX0RSSVZFX0RFRkFVTFRfTUFYX1FVRVVFX0RFUFRIOworCisJcmFpZF9tYXAgPSBsb2dpY2FsX2RyaXZlLT5yYWlkX21hcDsKKwlpZiAoIXJhaWRfbWFwKQorCQlyZXR1cm47CisKKwlkaXNrX2RhdGEgPSByYWlkX21hcC0+ZGlza19kYXRhOworCW51bV9waHlzX2Rpc2tzID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+bGF5b3V0X21hcF9jb3VudCkgKgorCQkoZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+ZGF0YV9kaXNrc19wZXJfcm93KSArCisJCWdldF91bmFsaWduZWRfbGUxNigmcmFpZF9tYXAtPm1ldGFkYXRhX2Rpc2tzX3Blcl9yb3cpKTsKKwludW1fcmFpZF9tYXBfZW50cmllcyA9IG51bV9waHlzX2Rpc2tzICoKKwkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+cm93X2NudCk7CisKKwlxdWV1ZV9kZXB0aCA9IDA7CisJZm9yIChpID0gMDsgaSA8IG51bV9yYWlkX21hcF9lbnRyaWVzOyBpKyspIHsKKwkJcGh5c19kaXNrID0gcHFpX2ZpbmRfZGlza19ieV9haW9faGFuZGxlKGN0cmxfaW5mbywKKwkJCWRpc2tfZGF0YVtpXS5haW9faGFuZGxlKTsKKworCQlpZiAoIXBoeXNfZGlzaykgeworCQkJZGV2X3dhcm4oJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJCSJmYWlsZWQgdG8gZmluZCBwaHlzaWNhbCBkaXNrIGZvciBsb2dpY2FsIGRyaXZlICUwMTZsbHhcbiIsCisJCQkJZ2V0X3VuYWxpZ25lZF9iZTY0KGxvZ2ljYWxfZHJpdmUtPnNjc2kzYWRkcikpOworCQkJbG9naWNhbF9kcml2ZS0+b2ZmbG9hZF9lbmFibGVkID0gZmFsc2U7CisJCQlsb2dpY2FsX2RyaXZlLT5vZmZsb2FkX2VuYWJsZWRfcGVuZGluZyA9IGZhbHNlOworCQkJa2ZyZWUocmFpZF9tYXApOworCQkJbG9naWNhbF9kcml2ZS0+cmFpZF9tYXAgPSBOVUxMOworCQkJcmV0dXJuOworCQl9CisKKwkJcXVldWVfZGVwdGggKz0gcGh5c19kaXNrLT5xdWV1ZV9kZXB0aDsKKwl9CisKKwlsb2dpY2FsX2RyaXZlLT5xdWV1ZV9kZXB0aCA9IHF1ZXVlX2RlcHRoOworfQorCitzdGF0aWMgdm9pZCBwcWlfdXBkYXRlX2FsbF9sb2dpY2FsX2RyaXZlX3F1ZXVlX2RlcHRocygKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmY3RybF9pbmZvLT5zY3NpX2RldmljZV9saXN0LAorCQlzY3NpX2RldmljZV9saXN0X2VudHJ5KSB7CisJCWlmIChkZXZpY2UtPmRldnR5cGUgIT0gVFlQRV9ESVNLICYmIGRldmljZS0+ZGV2dHlwZSAhPSBUWVBFX1pCQykKKwkJCWNvbnRpbnVlOworCQlpZiAoIXBxaV9pc19sb2dpY2FsX2RldmljZShkZXZpY2UpKQorCQkJY29udGludWU7CisJCXBxaV91cGRhdGVfbG9naWNhbF9kcml2ZV9xdWV1ZV9kZXB0aChjdHJsX2luZm8sIGRldmljZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcWlfcmVzY2FuX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbzsKKworCWN0cmxfaW5mbyA9IGNvbnRhaW5lcl9vZih0b19kZWxheWVkX3dvcmsod29yayksIHN0cnVjdCBwcWlfY3RybF9pbmZvLAorCQlyZXNjYW5fd29yayk7CisKKwlwcWlfc2Nhbl9zY3NpX2RldmljZXMoY3RybF9pbmZvKTsKK30KKworc3RhdGljIGludCBwcWlfYWRkX2RldmljZShzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZSkKK3sKKwlpbnQgcmM7CisKKwlpZiAocHFpX2lzX2xvZ2ljYWxfZGV2aWNlKGRldmljZSkpCisJCXJjID0gc2NzaV9hZGRfZGV2aWNlKGN0cmxfaW5mby0+c2NzaV9ob3N0LCBkZXZpY2UtPmJ1cywKKwkJCWRldmljZS0+dGFyZ2V0LCBkZXZpY2UtPmx1bik7CisJZWxzZQorCQlyYyA9IHBxaV9hZGRfc2FzX2RldmljZShjdHJsX2luZm8tPnNhc19ob3N0LCBkZXZpY2UpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHFpX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UpCit7CisJaWYgKHBxaV9pc19sb2dpY2FsX2RldmljZShkZXZpY2UpKQorCQlzY3NpX3JlbW92ZV9kZXZpY2UoZGV2aWNlLT5zZGV2KTsKKwllbHNlCisJCXBxaV9yZW1vdmVfc2FzX2RldmljZShkZXZpY2UpOworfQorCisvKiBBc3N1bWVzIHRoZSBTQ1NJIGRldmljZSBsaXN0IGxvY2sgaXMgaGVsZC4gKi8KKworc3RhdGljIHN0cnVjdCBwcWlfc2NzaV9kZXYgKnBxaV9maW5kX3Njc2lfZGV2KHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJaW50IGJ1cywgaW50IHRhcmdldCwgaW50IGx1bikKK3sKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmN0cmxfaW5mby0+c2NzaV9kZXZpY2VfbGlzdCwKKwkJc2NzaV9kZXZpY2VfbGlzdF9lbnRyeSkKKwkJaWYgKGRldmljZS0+YnVzID09IGJ1cyAmJiBkZXZpY2UtPnRhcmdldCA9PSB0YXJnZXQgJiYKKwkJCWRldmljZS0+bHVuID09IGx1bikKKwkJCXJldHVybiBkZXZpY2U7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBib29sIHBxaV9kZXZpY2VfZXF1YWwoc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2MSwKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXYyKQoreworCWlmIChkZXYxLT5pc19waHlzaWNhbF9kZXZpY2UgIT0gZGV2Mi0+aXNfcGh5c2ljYWxfZGV2aWNlKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoZGV2MS0+aXNfcGh5c2ljYWxfZGV2aWNlKQorCQlyZXR1cm4gZGV2MS0+d3dpZCA9PSBkZXYyLT53d2lkOworCisJcmV0dXJuIG1lbWNtcChkZXYxLT52b2x1bWVfaWQsIGRldjItPnZvbHVtZV9pZCwKKwkJc2l6ZW9mKGRldjEtPnZvbHVtZV9pZCkpID09IDA7Cit9CisKK2VudW0gcHFpX2ZpbmRfcmVzdWx0IHsKKwlERVZJQ0VfTk9UX0ZPVU5ELAorCURFVklDRV9DSEFOR0VELAorCURFVklDRV9TQU1FLAorfTsKKworc3RhdGljIGVudW0gcHFpX2ZpbmRfcmVzdWx0IHBxaV9zY3NpX2ZpbmRfZW50cnkoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2VfdG9fZmluZCwKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICoqbWF0Y2hpbmdfZGV2aWNlKQoreworCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmY3RybF9pbmZvLT5zY3NpX2RldmljZV9saXN0LAorCQlzY3NpX2RldmljZV9saXN0X2VudHJ5KSB7CisJCWlmIChwcWlfc2NzaTNhZGRyX2VxdWFsKGRldmljZV90b19maW5kLT5zY3NpM2FkZHIsCisJCQlkZXZpY2UtPnNjc2kzYWRkcikpIHsKKwkJCSptYXRjaGluZ19kZXZpY2UgPSBkZXZpY2U7CisJCQlpZiAocHFpX2RldmljZV9lcXVhbChkZXZpY2VfdG9fZmluZCwgZGV2aWNlKSkgeworCQkJCWlmIChkZXZpY2VfdG9fZmluZC0+dm9sdW1lX29mZmxpbmUpCisJCQkJCXJldHVybiBERVZJQ0VfQ0hBTkdFRDsKKwkJCQlyZXR1cm4gREVWSUNFX1NBTUU7CisJCQl9CisJCQlyZXR1cm4gREVWSUNFX0NIQU5HRUQ7CisJCX0KKwl9CisKKwlyZXR1cm4gREVWSUNFX05PVF9GT1VORDsKK30KKworc3RhdGljIHZvaWQgcHFpX2Rldl9pbmZvKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJY2hhciAqYWN0aW9uLCBzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UpCit7CisJZGV2X2luZm8oJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkiJXMgc2NzaSAlZDolZDolZDolZDogJXMgJS44cyAlLjE2cyAlLTEycyBTU0RTbWFydFBhdGhDYXAlYyBFbiVjIEV4cCVjIHFkPSVkXG4iLAorCQlhY3Rpb24sCisJCWN0cmxfaW5mby0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQlkZXZpY2UtPmJ1cywKKwkJZGV2aWNlLT50YXJnZXQsCisJCWRldmljZS0+bHVuLAorCQlzY3NpX2RldmljZV90eXBlKGRldmljZS0+ZGV2dHlwZSksCisJCWRldmljZS0+dmVuZG9yLAorCQlkZXZpY2UtPm1vZGVsLAorCQlwcWlfcmFpZF9sZXZlbF90b19zdHJpbmcoZGV2aWNlLT5yYWlkX2xldmVsKSwKKwkJZGV2aWNlLT5vZmZsb2FkX2NvbmZpZ3VyZWQgPyAnKycgOiAnLScsCisJCWRldmljZS0+b2ZmbG9hZF9lbmFibGVkX3BlbmRpbmcgPyAnKycgOiAnLScsCisJCWRldmljZS0+ZXhwb3NlX2RldmljZSA/ICcrJyA6ICctJywKKwkJZGV2aWNlLT5xdWV1ZV9kZXB0aCk7Cit9CisKKy8qIEFzc3VtZXMgdGhlIFNDU0kgZGV2aWNlIGxpc3QgbG9jayBpcyBoZWxkLiAqLworCitzdGF0aWMgdm9pZCBwcWlfc2NzaV91cGRhdGVfZGV2aWNlKHN0cnVjdCBwcWlfc2NzaV9kZXYgKmV4aXN0aW5nX2RldmljZSwKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpuZXdfZGV2aWNlKQoreworCWV4aXN0aW5nX2RldmljZS0+ZGV2dHlwZSA9IG5ld19kZXZpY2UtPmRldnR5cGU7CisJZXhpc3RpbmdfZGV2aWNlLT5kZXZpY2VfdHlwZSA9IG5ld19kZXZpY2UtPmRldmljZV90eXBlOworCWV4aXN0aW5nX2RldmljZS0+YnVzID0gbmV3X2RldmljZS0+YnVzOworCWlmIChuZXdfZGV2aWNlLT50YXJnZXRfbHVuX3ZhbGlkKSB7CisJCWV4aXN0aW5nX2RldmljZS0+dGFyZ2V0ID0gbmV3X2RldmljZS0+dGFyZ2V0OworCQlleGlzdGluZ19kZXZpY2UtPmx1biA9IG5ld19kZXZpY2UtPmx1bjsKKwkJZXhpc3RpbmdfZGV2aWNlLT50YXJnZXRfbHVuX3ZhbGlkID0gdHJ1ZTsKKwl9CisKKwkvKiBCeSBkZWZpbml0aW9uLCB0aGUgc2NzaTNhZGRyIGFuZCB3d2lkIGZpZWxkcyBhcmUgYWxyZWFkeSB0aGUgc2FtZS4gKi8KKworCWV4aXN0aW5nX2RldmljZS0+aXNfcGh5c2ljYWxfZGV2aWNlID0gbmV3X2RldmljZS0+aXNfcGh5c2ljYWxfZGV2aWNlOworCWV4aXN0aW5nX2RldmljZS0+ZXhwb3NlX2RldmljZSA9IG5ld19kZXZpY2UtPmV4cG9zZV9kZXZpY2U7CisJZXhpc3RpbmdfZGV2aWNlLT5ub191bGRfYXR0YWNoID0gbmV3X2RldmljZS0+bm9fdWxkX2F0dGFjaDsKKwlleGlzdGluZ19kZXZpY2UtPmFpb19lbmFibGVkID0gbmV3X2RldmljZS0+YWlvX2VuYWJsZWQ7CisJbWVtY3B5KGV4aXN0aW5nX2RldmljZS0+dmVuZG9yLCBuZXdfZGV2aWNlLT52ZW5kb3IsCisJCXNpemVvZihleGlzdGluZ19kZXZpY2UtPnZlbmRvcikpOworCW1lbWNweShleGlzdGluZ19kZXZpY2UtPm1vZGVsLCBuZXdfZGV2aWNlLT5tb2RlbCwKKwkJc2l6ZW9mKGV4aXN0aW5nX2RldmljZS0+bW9kZWwpKTsKKwlleGlzdGluZ19kZXZpY2UtPnNhc19hZGRyZXNzID0gbmV3X2RldmljZS0+c2FzX2FkZHJlc3M7CisJZXhpc3RpbmdfZGV2aWNlLT5yYWlkX2xldmVsID0gbmV3X2RldmljZS0+cmFpZF9sZXZlbDsKKwlleGlzdGluZ19kZXZpY2UtPnF1ZXVlX2RlcHRoID0gbmV3X2RldmljZS0+cXVldWVfZGVwdGg7CisJZXhpc3RpbmdfZGV2aWNlLT5haW9faGFuZGxlID0gbmV3X2RldmljZS0+YWlvX2hhbmRsZTsKKwlleGlzdGluZ19kZXZpY2UtPnZvbHVtZV9zdGF0dXMgPSBuZXdfZGV2aWNlLT52b2x1bWVfc3RhdHVzOworCWV4aXN0aW5nX2RldmljZS0+YWN0aXZlX3BhdGhfaW5kZXggPSBuZXdfZGV2aWNlLT5hY3RpdmVfcGF0aF9pbmRleDsKKwlleGlzdGluZ19kZXZpY2UtPnBhdGhfbWFwID0gbmV3X2RldmljZS0+cGF0aF9tYXA7CisJZXhpc3RpbmdfZGV2aWNlLT5iYXkgPSBuZXdfZGV2aWNlLT5iYXk7CisJbWVtY3B5KGV4aXN0aW5nX2RldmljZS0+Ym94LCBuZXdfZGV2aWNlLT5ib3gsCisJCXNpemVvZihleGlzdGluZ19kZXZpY2UtPmJveCkpOworCW1lbWNweShleGlzdGluZ19kZXZpY2UtPnBoeXNfY29ubmVjdG9yLCBuZXdfZGV2aWNlLT5waHlzX2Nvbm5lY3RvciwKKwkJc2l6ZW9mKGV4aXN0aW5nX2RldmljZS0+cGh5c19jb25uZWN0b3IpKTsKKwlleGlzdGluZ19kZXZpY2UtPm9mZmxvYWRfY29uZmlndXJlZCA9IG5ld19kZXZpY2UtPm9mZmxvYWRfY29uZmlndXJlZDsKKwlleGlzdGluZ19kZXZpY2UtPm9mZmxvYWRfZW5hYmxlZCA9IGZhbHNlOworCWV4aXN0aW5nX2RldmljZS0+b2ZmbG9hZF9lbmFibGVkX3BlbmRpbmcgPQorCQluZXdfZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWRfcGVuZGluZzsKKwlleGlzdGluZ19kZXZpY2UtPm9mZmxvYWRfdG9fbWlycm9yID0gMDsKKwlrZnJlZShleGlzdGluZ19kZXZpY2UtPnJhaWRfbWFwKTsKKwlleGlzdGluZ19kZXZpY2UtPnJhaWRfbWFwID0gbmV3X2RldmljZS0+cmFpZF9tYXA7CisKKwkvKiBUbyBwcmV2ZW50IHRoaXMgZnJvbSBiZWluZyBmcmVlZCBsYXRlci4gKi8KKwluZXdfZGV2aWNlLT5yYWlkX21hcCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcWlfZnJlZV9kZXZpY2Uoc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlKQoreworCWlmIChkZXZpY2UpIHsKKwkJa2ZyZWUoZGV2aWNlLT5yYWlkX21hcCk7CisJCWtmcmVlKGRldmljZSk7CisJfQorfQorCisvKgorICogQ2FsbGVkIHdoZW4gZXhwb3NpbmcgYSBuZXcgZGV2aWNlIHRvIHRoZSBPUyBmYWlscyBpbiBvcmRlciB0byByZS1hZGp1c3QKKyAqIG91ciBpbnRlcm5hbCBTQ1NJIGRldmljZSBsaXN0IHRvIG1hdGNoIHRoZSBTQ1NJIE1MJ3Mgdmlldy4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcHFpX2ZpeHVwX2JvdGNoZWRfYWRkKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3RybF9pbmZvLT5zY3NpX2RldmljZV9saXN0X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmZGV2aWNlLT5zY3NpX2RldmljZV9saXN0X2VudHJ5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsX2luZm8tPnNjc2lfZGV2aWNlX2xpc3RfbG9jaywgZmxhZ3MpOworCisJLyogQWxsb3cgdGhlIGRldmljZSBzdHJ1Y3R1cmUgdG8gYmUgZnJlZWQgbGF0ZXIuICovCisJZGV2aWNlLT5rZWVwX2RldmljZSA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBwcWlfdXBkYXRlX2RldmljZV9saXN0KHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJc3RydWN0IHBxaV9zY3NpX2RldiAqbmV3X2RldmljZV9saXN0W10sIHVuc2lnbmVkIGludCBudW1fbmV3X2RldmljZXMpCit7CisJaW50IHJjOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZW51bSBwcWlfZmluZF9yZXN1bHQgZmluZF9yZXN1bHQ7CisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlOworCXN0cnVjdCBwcWlfc2NzaV9kZXYgKm5leHQ7CisJc3RydWN0IHBxaV9zY3NpX2RldiAqbWF0Y2hpbmdfZGV2aWNlOworCXN0cnVjdCBsaXN0X2hlYWQgYWRkX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBkZWxldGVfbGlzdDsKKworCUlOSVRfTElTVF9IRUFEKCZhZGRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmRlbGV0ZV9saXN0KTsKKworCS8qCisJICogVGhlIGlkZWEgaGVyZSBpcyB0byBkbyBhcyBsaXR0bGUgd29yayBhcyBwb3NzaWJsZSB3aGlsZSBob2xkaW5nIHRoZQorCSAqIHNwaW5sb2NrLiAgVGhhdCdzIHdoeSB3ZSBnbyB0byBncmVhdCBwYWlucyB0byBkZWZlciBhbnl0aGluZyBvdGhlcgorCSAqIHRoYW4gdXBkYXRpbmcgdGhlIGludGVybmFsIGRldmljZSBsaXN0IHVudGlsIGFmdGVyIHdlIHJlbGVhc2UgdGhlCisJICogc3BpbmxvY2suCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3RybF9pbmZvLT5zY3NpX2RldmljZV9saXN0X2xvY2ssIGZsYWdzKTsKKworCS8qIEFzc3VtZSB0aGF0IGFsbCBkZXZpY2VzIGluIHRoZSBleGlzdGluZyBsaXN0IGhhdmUgZ29uZSBhd2F5LiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2aWNlLCAmY3RybF9pbmZvLT5zY3NpX2RldmljZV9saXN0LAorCQlzY3NpX2RldmljZV9saXN0X2VudHJ5KQorCQlkZXZpY2UtPmRldmljZV9nb25lID0gdHJ1ZTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbmV3X2RldmljZXM7IGkrKykgeworCQlkZXZpY2UgPSBuZXdfZGV2aWNlX2xpc3RbaV07CisKKwkJZmluZF9yZXN1bHQgPSBwcWlfc2NzaV9maW5kX2VudHJ5KGN0cmxfaW5mbywgZGV2aWNlLAorCQkJCQkJJm1hdGNoaW5nX2RldmljZSk7CisKKwkJc3dpdGNoIChmaW5kX3Jlc3VsdCkgeworCQljYXNlIERFVklDRV9TQU1FOgorCQkJLyoKKwkJCSAqIFRoZSBuZXdseSBmb3VuZCBkZXZpY2UgaXMgYWxyZWFkeSBpbiB0aGUgZXhpc3RpbmcKKwkJCSAqIGRldmljZSBsaXN0LgorCQkJICovCisJCQlkZXZpY2UtPm5ld19kZXZpY2UgPSBmYWxzZTsKKwkJCW1hdGNoaW5nX2RldmljZS0+ZGV2aWNlX2dvbmUgPSBmYWxzZTsKKwkJCXBxaV9zY3NpX3VwZGF0ZV9kZXZpY2UobWF0Y2hpbmdfZGV2aWNlLCBkZXZpY2UpOworCQkJYnJlYWs7CisJCWNhc2UgREVWSUNFX05PVF9GT1VORDoKKwkJCS8qCisJCQkgKiBUaGUgbmV3bHkgZm91bmQgZGV2aWNlIGlzIE5PVCBpbiB0aGUgZXhpc3RpbmcgZGV2aWNlCisJCQkgKiBsaXN0LgorCQkJICovCisJCQlkZXZpY2UtPm5ld19kZXZpY2UgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgREVWSUNFX0NIQU5HRUQ6CisJCQkvKgorCQkJICogVGhlIG9yaWdpbmFsIGRldmljZSBoYXMgZ29uZSBhd2F5IGFuZCB3ZSBuZWVkIHRvIGFkZAorCQkJICogdGhlIG5ldyBkZXZpY2UuCisJCQkgKi8KKwkJCWRldmljZS0+bmV3X2RldmljZSA9IHRydWU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVdBUk5fT04oZmluZF9yZXN1bHQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBQcm9jZXNzIGFsbCBkZXZpY2VzIHRoYXQgaGF2ZSBnb25lIGF3YXkuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldmljZSwgbmV4dCwgJmN0cmxfaW5mby0+c2NzaV9kZXZpY2VfbGlzdCwKKwkJc2NzaV9kZXZpY2VfbGlzdF9lbnRyeSkgeworCQlpZiAoZGV2aWNlLT5kZXZpY2VfZ29uZSkgeworCQkJbGlzdF9kZWwoJmRldmljZS0+c2NzaV9kZXZpY2VfbGlzdF9lbnRyeSk7CisJCQlsaXN0X2FkZF90YWlsKCZkZXZpY2UtPmRlbGV0ZV9saXN0X2VudHJ5LCAmZGVsZXRlX2xpc3QpOworCQl9CisJfQorCisJLyogUHJvY2VzcyBhbGwgbmV3IGRldmljZXMuICovCisJZm9yIChpID0gMDsgaSA8IG51bV9uZXdfZGV2aWNlczsgaSsrKSB7CisJCWRldmljZSA9IG5ld19kZXZpY2VfbGlzdFtpXTsKKwkJaWYgKCFkZXZpY2UtPm5ld19kZXZpY2UpCisJCQljb250aW51ZTsKKwkJaWYgKGRldmljZS0+dm9sdW1lX29mZmxpbmUpCisJCQljb250aW51ZTsKKwkJbGlzdF9hZGRfdGFpbCgmZGV2aWNlLT5zY3NpX2RldmljZV9saXN0X2VudHJ5LAorCQkJJmN0cmxfaW5mby0+c2NzaV9kZXZpY2VfbGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+YWRkX2xpc3RfZW50cnksICZhZGRfbGlzdCk7CisJCS8qIFRvIHByZXZlbnQgdGhpcyBkZXZpY2Ugc3RydWN0dXJlIGZyb20gYmVpbmcgZnJlZWQgbGF0ZXIuICovCisJCWRldmljZS0+a2VlcF9kZXZpY2UgPSB0cnVlOworCX0KKworCXBxaV91cGRhdGVfYWxsX2xvZ2ljYWxfZHJpdmVfcXVldWVfZGVwdGhzKGN0cmxfaW5mbyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldmljZSwgJmN0cmxfaW5mby0+c2NzaV9kZXZpY2VfbGlzdCwKKwkJc2NzaV9kZXZpY2VfbGlzdF9lbnRyeSkKKwkJZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWQgPQorCQkJZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWRfcGVuZGluZzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0cmxfaW5mby0+c2NzaV9kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisKKwkvKiBSZW1vdmUgYWxsIGRldmljZXMgdGhhdCBoYXZlIGdvbmUgYXdheS4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2aWNlLCBuZXh0LCAmZGVsZXRlX2xpc3QsCisJCWRlbGV0ZV9saXN0X2VudHJ5KSB7CisJCWlmIChkZXZpY2UtPnNkZXYpCisJCQlwcWlfcmVtb3ZlX2RldmljZShjdHJsX2luZm8sIGRldmljZSk7CisJCWlmIChkZXZpY2UtPnZvbHVtZV9vZmZsaW5lKSB7CisJCQlwcWlfZGV2X2luZm8oY3RybF9pbmZvLCAib2ZmbGluZSIsIGRldmljZSk7CisJCQlwcWlfc2hvd192b2x1bWVfc3RhdHVzKGN0cmxfaW5mbywgZGV2aWNlKTsKKwkJfSBlbHNlIHsKKwkJCXBxaV9kZXZfaW5mbyhjdHJsX2luZm8sICJyZW1vdmVkIiwgZGV2aWNlKTsKKwkJfQorCQlsaXN0X2RlbCgmZGV2aWNlLT5kZWxldGVfbGlzdF9lbnRyeSk7CisJCXBxaV9mcmVlX2RldmljZShkZXZpY2UpOworCX0KKworCS8qCisJICogTm90aWZ5IHRoZSBTQ1NJIE1MIGlmIHRoZSBxdWV1ZSBkZXB0aCBvZiBhbnkgZXhpc3RpbmcgZGV2aWNlIGhhcworCSAqIGNoYW5nZWQuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZjdHJsX2luZm8tPnNjc2lfZGV2aWNlX2xpc3QsCisJCXNjc2lfZGV2aWNlX2xpc3RfZW50cnkpIHsKKwkJaWYgKGRldmljZS0+c2RldiAmJiBkZXZpY2UtPnF1ZXVlX2RlcHRoICE9CisJCQlkZXZpY2UtPmFkdmVydGlzZWRfcXVldWVfZGVwdGgpIHsKKwkJCWRldmljZS0+YWR2ZXJ0aXNlZF9xdWV1ZV9kZXB0aCA9IGRldmljZS0+cXVldWVfZGVwdGg7CisJCQlzY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aChkZXZpY2UtPnNkZXYsCisJCQkJZGV2aWNlLT5hZHZlcnRpc2VkX3F1ZXVlX2RlcHRoKTsKKwkJfQorCX0KKworCS8qIEV4cG9zZSBhbnkgbmV3IGRldmljZXMuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldmljZSwgbmV4dCwgJmFkZF9saXN0LCBhZGRfbGlzdF9lbnRyeSkgeworCQlpZiAoZGV2aWNlLT5leHBvc2VfZGV2aWNlICYmICFkZXZpY2UtPnNkZXYpIHsKKwkJCXJjID0gcHFpX2FkZF9kZXZpY2UoY3RybF9pbmZvLCBkZXZpY2UpOworCQkJaWYgKHJjKSB7CisJCQkJZGV2X3dhcm4oJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJCQkic2NzaSAlZDolZDolZDolZCBhZGRpdGlvbiBmYWlsZWQsIGRldmljZSBub3QgYWRkZWRcbiIsCisJCQkJCWN0cmxfaW5mby0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQkJCQlkZXZpY2UtPmJ1cywgZGV2aWNlLT50YXJnZXQsCisJCQkJCWRldmljZS0+bHVuKTsKKwkJCQlwcWlfZml4dXBfYm90Y2hlZF9hZGQoY3RybF9pbmZvLCBkZXZpY2UpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXBxaV9kZXZfaW5mbyhjdHJsX2luZm8sICJhZGRlZCIsIGRldmljZSk7CisJfQorfQorCitzdGF0aWMgYm9vbCBwcWlfaXNfc3VwcG9ydGVkX2RldmljZShzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UpCit7CisJYm9vbCBpc19zdXBwb3J0ZWQgPSBmYWxzZTsKKworCXN3aXRjaCAoZGV2aWNlLT5kZXZ0eXBlKSB7CisJY2FzZSBUWVBFX0RJU0s6CisJY2FzZSBUWVBFX1pCQzoKKwljYXNlIFRZUEVfVEFQRToKKwljYXNlIFRZUEVfTUVESVVNX0NIQU5HRVI6CisJY2FzZSBUWVBFX0VOQ0xPU1VSRToKKwkJaXNfc3VwcG9ydGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBUWVBFX1JBSUQ6CisJCS8qCisJCSAqIE9ubHkgc3VwcG9ydCB0aGUgSEJBIGNvbnRyb2xsZXIgaXRzZWxmIGFzIGEgUkFJRAorCQkgKiBjb250cm9sbGVyLiAgSWYgaXQncyBhIFJBSUQgY29udHJvbGxlciBvdGhlciB0aGFuCisJCSAqIHRoZSBIQkEgaXRzZWxmIChhbiBleHRlcm5hbCBSQUlEIGNvbnRyb2xsZXIsIE1TQTUwMAorCQkgKiBvciBzaW1pbGFyKSwgd2UgZG9uJ3Qgc3VwcG9ydCBpdC4KKwkJICovCisJCWlmIChwcWlfaXNfaGJhX2x1bmlkKGRldmljZS0+c2NzaTNhZGRyKSkKKwkJCWlzX3N1cHBvcnRlZCA9IHRydWU7CisJCWJyZWFrOworCX0KKworCXJldHVybiBpc19zdXBwb3J0ZWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwcWlfc2tpcF9kZXZpY2UodTggKnNjc2kzYWRkciwKKwlzdHJ1Y3QgcmVwb3J0X3BoeXNfbHVuX2V4dGVuZGVkX2VudHJ5ICpwaHlzX2x1bl9leHRfZW50cnkpCit7CisJdTggZGV2aWNlX2ZsYWdzOworCisJaWYgKCFNQVNLRURfREVWSUNFKHNjc2kzYWRkcikpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFRoZSBkZXZpY2UgaXMgbWFza2VkLiAqLworCisJZGV2aWNlX2ZsYWdzID0gcGh5c19sdW5fZXh0X2VudHJ5LT5kZXZpY2VfZmxhZ3M7CisKKwlpZiAoZGV2aWNlX2ZsYWdzICYgUkVQT1JUX1BIWVNfTFVOX0RFVl9GTEFHX05PTl9ESVNLKSB7CisJCS8qCisJCSAqIEl0J3MgYSBub24tZGlzayBkZXZpY2UuICBXZSBpZ25vcmUgYWxsIGRldmljZXMgb2YgdGhpcyB0eXBlCisJCSAqIHdoZW4gdGhleSdyZSBtYXNrZWQuCisJCSAqLworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwcWlfZXhwb3NlX2RldmljZShzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UpCit7CisJLyogRXhwb3NlIGFsbCBkZXZpY2VzIGV4Y2VwdCBmb3IgcGh5c2ljYWwgZGV2aWNlcyB0aGF0IGFyZSBtYXNrZWQuICovCisJaWYgKGRldmljZS0+aXNfcGh5c2ljYWxfZGV2aWNlICYmIE1BU0tFRF9ERVZJQ0UoZGV2aWNlLT5zY3NpM2FkZHIpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBwcWlfdXBkYXRlX3Njc2lfZGV2aWNlcyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCWludCBpOworCWludCByYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5ld19kZXZpY2VfbGlzdF9oZWFkOworCXN0cnVjdCByZXBvcnRfcGh5c19sdW5fZXh0ZW5kZWQgKnBoeXNkZXZfbGlzdCA9IE5VTEw7CisJc3RydWN0IHJlcG9ydF9sb2dfbHVuX2V4dGVuZGVkICpsb2dkZXZfbGlzdCA9IE5VTEw7CisJc3RydWN0IHJlcG9ydF9waHlzX2x1bl9leHRlbmRlZF9lbnRyeSAqcGh5c19sdW5fZXh0X2VudHJ5OworCXN0cnVjdCByZXBvcnRfbG9nX2x1bl9leHRlbmRlZF9lbnRyeSAqbG9nX2x1bl9leHRfZW50cnk7CisJc3RydWN0IGJtaWNfaWRlbnRpZnlfcGh5c2ljYWxfZGV2aWNlICppZF9waHlzID0gTlVMTDsKKwl1MzIgbnVtX3BoeXNpY2FsczsKKwl1MzIgbnVtX2xvZ2ljYWxzOworCXN0cnVjdCBwcWlfc2NzaV9kZXYgKipuZXdfZGV2aWNlX2xpc3QgPSBOVUxMOworCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZTsKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpuZXh0OworCXVuc2lnbmVkIGludCBudW1fbmV3X2RldmljZXM7CisJdW5zaWduZWQgaW50IG51bV92YWxpZF9kZXZpY2VzOworCWJvb2wgaXNfcGh5c2ljYWxfZGV2aWNlOworCXU4ICpzY3NpM2FkZHI7CisJc3RhdGljIGNoYXIgKm91dF9vZl9tZW1vcnlfbXNnID0KKwkJIm91dCBvZiBtZW1vcnksIGRldmljZSBkaXNjb3Zlcnkgc3RvcHBlZCI7CisKKwlJTklUX0xJU1RfSEVBRCgmbmV3X2RldmljZV9saXN0X2hlYWQpOworCisJcmMgPSBwcWlfZ2V0X2RldmljZV9saXN0cyhjdHJsX2luZm8sICZwaHlzZGV2X2xpc3QsICZsb2dkZXZfbGlzdCk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCWlmIChwaHlzZGV2X2xpc3QpCisJCW51bV9waHlzaWNhbHMgPQorCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKCZwaHlzZGV2X2xpc3QtPmhlYWRlci5saXN0X2xlbmd0aCkKKwkJCQkvIHNpemVvZihwaHlzZGV2X2xpc3QtPmx1bl9lbnRyaWVzWzBdKTsKKwllbHNlCisJCW51bV9waHlzaWNhbHMgPSAwOworCisJaWYgKGxvZ2Rldl9saXN0KQorCQludW1fbG9naWNhbHMgPQorCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKCZsb2dkZXZfbGlzdC0+aGVhZGVyLmxpc3RfbGVuZ3RoKQorCQkJCS8gc2l6ZW9mKGxvZ2Rldl9saXN0LT5sdW5fZW50cmllc1swXSk7CisJZWxzZQorCQludW1fbG9naWNhbHMgPSAwOworCisJaWYgKG51bV9waHlzaWNhbHMpIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0aGlzIGJ1ZmZlciBmb3IgY2FsbHMgdG8gcHFpX2dldF9waHlzaWNhbF9kaXNrX2luZm8oKQorCQkgKiBiZWxvdy4gIFdlIGFsbG9jYXRlIGl0IGhlcmUgaW5zdGVhZCBvZiBpbnNpZGUKKwkJICogcHFpX2dldF9waHlzaWNhbF9kaXNrX2luZm8oKSBiZWNhdXNlIGl0J3MgYSBmYWlybHkgbGFyZ2UKKwkJICogYnVmZmVyLgorCQkgKi8KKwkJaWRfcGh5cyA9IGttYWxsb2Moc2l6ZW9mKCppZF9waHlzKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaWRfcGh5cykgeworCQkJZGV2X3dhcm4oJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LCAiJXNcbiIsCisJCQkJb3V0X29mX21lbW9yeV9tc2cpOworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwludW1fbmV3X2RldmljZXMgPSBudW1fcGh5c2ljYWxzICsgbnVtX2xvZ2ljYWxzOworCisJbmV3X2RldmljZV9saXN0ID0ga21hbGxvYyhzaXplb2YoKm5ld19kZXZpY2VfbGlzdCkgKgorCQludW1fbmV3X2RldmljZXMsIEdGUF9LRVJORUwpOworCWlmICghbmV3X2RldmljZV9saXN0KSB7CisJCWRldl93YXJuKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwgIiVzXG4iLCBvdXRfb2ZfbWVtb3J5X21zZyk7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV9uZXdfZGV2aWNlczsgaSsrKSB7CisJCWRldmljZSA9IGt6YWxsb2Moc2l6ZW9mKCpkZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkZXZpY2UpIHsKKwkJCWRldl93YXJuKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwgIiVzXG4iLAorCQkJCW91dF9vZl9tZW1vcnlfbXNnKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+bmV3X2RldmljZV9saXN0X2VudHJ5LAorCQkJJm5ld19kZXZpY2VfbGlzdF9oZWFkKTsKKwl9CisKKwlkZXZpY2UgPSBOVUxMOworCW51bV92YWxpZF9kZXZpY2VzID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbmV3X2RldmljZXM7IGkrKykgeworCisJCWlmIChpIDwgbnVtX3BoeXNpY2FscykgeworCQkJaXNfcGh5c2ljYWxfZGV2aWNlID0gdHJ1ZTsKKwkJCXBoeXNfbHVuX2V4dF9lbnRyeSA9ICZwaHlzZGV2X2xpc3QtPmx1bl9lbnRyaWVzW2ldOworCQkJbG9nX2x1bl9leHRfZW50cnkgPSBOVUxMOworCQkJc2NzaTNhZGRyID0gcGh5c19sdW5fZXh0X2VudHJ5LT5sdW5pZDsKKwkJfSBlbHNlIHsKKwkJCWlzX3BoeXNpY2FsX2RldmljZSA9IGZhbHNlOworCQkJcGh5c19sdW5fZXh0X2VudHJ5ID0gTlVMTDsKKwkJCWxvZ19sdW5fZXh0X2VudHJ5ID0KKwkJCQkmbG9nZGV2X2xpc3QtPmx1bl9lbnRyaWVzW2kgLSBudW1fcGh5c2ljYWxzXTsKKwkJCXNjc2kzYWRkciA9IGxvZ19sdW5fZXh0X2VudHJ5LT5sdW5pZDsKKwkJfQorCisJCWlmIChpc19waHlzaWNhbF9kZXZpY2UgJiYKKwkJCXBxaV9za2lwX2RldmljZShzY3NpM2FkZHIsIHBoeXNfbHVuX2V4dF9lbnRyeSkpCisJCQljb250aW51ZTsKKworCQlpZiAoZGV2aWNlKQorCQkJZGV2aWNlID0gbGlzdF9uZXh0X2VudHJ5KGRldmljZSwgbmV3X2RldmljZV9saXN0X2VudHJ5KTsKKwkJZWxzZQorCQkJZGV2aWNlID0gbGlzdF9maXJzdF9lbnRyeSgmbmV3X2RldmljZV9saXN0X2hlYWQsCisJCQkJc3RydWN0IHBxaV9zY3NpX2RldiwgbmV3X2RldmljZV9saXN0X2VudHJ5KTsKKworCQltZW1jcHkoZGV2aWNlLT5zY3NpM2FkZHIsIHNjc2kzYWRkciwgc2l6ZW9mKGRldmljZS0+c2NzaTNhZGRyKSk7CisJCWRldmljZS0+aXNfcGh5c2ljYWxfZGV2aWNlID0gaXNfcGh5c2ljYWxfZGV2aWNlOworCQlkZXZpY2UtPnJhaWRfbGV2ZWwgPSBTQV9SQUlEX1VOS05PV047CisKKwkJLyogR2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UuICovCisJCXJjID0gcHFpX2dldF9kZXZpY2VfaW5mbyhjdHJsX2luZm8sIGRldmljZSk7CisJCWlmIChyYyA9PSAtRU5PTUVNKSB7CisJCQlkZXZfd2FybigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsICIlc1xuIiwKKwkJCQlvdXRfb2ZfbWVtb3J5X21zZyk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAocmMpIHsKKwkJCWRldl93YXJuKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCQkib2J0YWluaW5nIGRldmljZSBpbmZvIGZhaWxlZCwgc2tpcHBpbmcgZGV2aWNlICUwMTZsbHhcbiIsCisJCQkJZ2V0X3VuYWxpZ25lZF9iZTY0KGRldmljZS0+c2NzaTNhZGRyKSk7CisJCQlyYyA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghcHFpX2lzX3N1cHBvcnRlZF9kZXZpY2UoZGV2aWNlKSkKKwkJCWNvbnRpbnVlOworCisJCXBxaV9hc3NpZ25fYnVzX3RhcmdldF9sdW4oZGV2aWNlKTsKKworCQlkZXZpY2UtPmV4cG9zZV9kZXZpY2UgPSBwcWlfZXhwb3NlX2RldmljZShkZXZpY2UpOworCisJCWlmIChkZXZpY2UtPmlzX3BoeXNpY2FsX2RldmljZSkgeworCQkJZGV2aWNlLT53d2lkID0gcGh5c19sdW5fZXh0X2VudHJ5LT53d2lkOworCQkJaWYgKChwaHlzX2x1bl9leHRfZW50cnktPmRldmljZV9mbGFncyAmCisJCQkJUkVQT1JUX1BIWVNfTFVOX0RFVl9GTEFHX0FJT19FTkFCTEVEKSAmJgorCQkJCXBoeXNfbHVuX2V4dF9lbnRyeS0+YWlvX2hhbmRsZSkKKwkJCQlkZXZpY2UtPmFpb19lbmFibGVkID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShkZXZpY2UtPnZvbHVtZV9pZCwgbG9nX2x1bl9leHRfZW50cnktPnZvbHVtZV9pZCwKKwkJCQlzaXplb2YoZGV2aWNlLT52b2x1bWVfaWQpKTsKKwkJfQorCisJCXN3aXRjaCAoZGV2aWNlLT5kZXZ0eXBlKSB7CisJCWNhc2UgVFlQRV9ESVNLOgorCQljYXNlIFRZUEVfWkJDOgorCQljYXNlIFRZUEVfRU5DTE9TVVJFOgorCQkJaWYgKGRldmljZS0+aXNfcGh5c2ljYWxfZGV2aWNlKSB7CisJCQkJZGV2aWNlLT5zYXNfYWRkcmVzcyA9CisJCQkJCWdldF91bmFsaWduZWRfYmU2NCgmZGV2aWNlLT53d2lkKTsKKwkJCQlpZiAoZGV2aWNlLT5kZXZ0eXBlID09IFRZUEVfRElTSyB8fAorCQkJCQlkZXZpY2UtPmRldnR5cGUgPT0gVFlQRV9aQkMpIHsKKwkJCQkJZGV2aWNlLT5haW9faGFuZGxlID0KKwkJCQkJCXBoeXNfbHVuX2V4dF9lbnRyeS0+YWlvX2hhbmRsZTsKKwkJCQkJcHFpX2dldF9waHlzaWNhbF9kaXNrX2luZm8oY3RybF9pbmZvLAorCQkJCQkJZGV2aWNlLCBpZF9waHlzKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCW5ld19kZXZpY2VfbGlzdFtudW1fdmFsaWRfZGV2aWNlcysrXSA9IGRldmljZTsKKwl9CisKKwlwcWlfdXBkYXRlX2RldmljZV9saXN0KGN0cmxfaW5mbywgbmV3X2RldmljZV9saXN0LCBudW1fdmFsaWRfZGV2aWNlcyk7CisKK291dDoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2aWNlLCBuZXh0LCAmbmV3X2RldmljZV9saXN0X2hlYWQsCisJCW5ld19kZXZpY2VfbGlzdF9lbnRyeSkgeworCQlpZiAoZGV2aWNlLT5rZWVwX2RldmljZSkKKwkJCWNvbnRpbnVlOworCQlsaXN0X2RlbCgmZGV2aWNlLT5uZXdfZGV2aWNlX2xpc3RfZW50cnkpOworCQlwcWlfZnJlZV9kZXZpY2UoZGV2aWNlKTsKKwl9CisKKwlrZnJlZShuZXdfZGV2aWNlX2xpc3QpOworCWtmcmVlKHBoeXNkZXZfbGlzdCk7CisJa2ZyZWUobG9nZGV2X2xpc3QpOworCWtmcmVlKGlkX3BoeXMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBwcWlfcmVtb3ZlX2FsbF9zY3NpX2RldmljZXMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZTsKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpuZXh0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmxfaW5mby0+c2NzaV9kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2aWNlLCBuZXh0LCAmY3RybF9pbmZvLT5zY3NpX2RldmljZV9saXN0LAorCQlzY3NpX2RldmljZV9saXN0X2VudHJ5KSB7CisJCWlmIChkZXZpY2UtPnNkZXYpCisJCQlwcWlfcmVtb3ZlX2RldmljZShjdHJsX2luZm8sIGRldmljZSk7CisJCWxpc3RfZGVsKCZkZXZpY2UtPnNjc2lfZGV2aWNlX2xpc3RfZW50cnkpOworCQlwcWlfZnJlZV9kZXZpY2UoZGV2aWNlKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsX2luZm8tPnNjc2lfZGV2aWNlX2xpc3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHBxaV9zY2FuX3Njc2lfZGV2aWNlcyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCWludCByYzsKKworCWlmIChwcWlfY3RybF9vZmZsaW5lKGN0cmxfaW5mbykpCisJCXJldHVybiAtRU5YSU87CisKKwltdXRleF9sb2NrKCZjdHJsX2luZm8tPnNjYW5fbXV0ZXgpOworCisJcmMgPSBwcWlfdXBkYXRlX3Njc2lfZGV2aWNlcyhjdHJsX2luZm8pOworCWlmIChyYykKKwkJcHFpX3NjaGVkdWxlX3Jlc2Nhbl93b3JrZXIoY3RybF9pbmZvKTsKKworCW11dGV4X3VubG9jaygmY3RybF9pbmZvLT5zY2FuX211dGV4KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgcHFpX3NjYW5fc3RhcnQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJcHFpX3NjYW5fc2NzaV9kZXZpY2VzKHNob3N0X3RvX2hiYShzaG9zdCkpOworfQorCisvKiBSZXR1cm5zIFRSVUUgaWYgc2NhbiBpcyBmaW5pc2hlZC4gKi8KKworc3RhdGljIGludCBwcWlfc2Nhbl9maW5pc2hlZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwl1bnNpZ25lZCBsb25nIGVsYXBzZWRfdGltZSkKK3sKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvOworCisJY3RybF9pbmZvID0gc2hvc3RfcHJpdihzaG9zdCk7CisKKwlyZXR1cm4gIW11dGV4X2lzX2xvY2tlZCgmY3RybF9pbmZvLT5zY2FuX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBxaV9zZXRfZW5jcnlwdGlvbl9pbmZvKAorCXN0cnVjdCBwcWlfZW5jcnlwdGlvbl9pbmZvICplbmNyeXB0aW9uX2luZm8sIHN0cnVjdCByYWlkX21hcCAqcmFpZF9tYXAsCisJdTY0IGZpcnN0X2Jsb2NrKQoreworCXUzMiB2b2x1bWVfYmxrX3NpemU7CisKKwkvKgorCSAqIFNldCB0aGUgZW5jcnlwdGlvbiB0d2VhayB2YWx1ZXMgYmFzZWQgb24gbG9naWNhbCBibG9jayBhZGRyZXNzLgorCSAqIElmIHRoZSBibG9jayBzaXplIGlzIDUxMiwgdGhlIHR3ZWFrIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSBMQkEuCisJICogRm9yIG90aGVyIGJsb2NrIHNpemVzLCB0d2VhayB2YWx1ZSBpcyAoTEJBICogYmxvY2sgc2l6ZSkgLyA1MTIuCisJICovCisJdm9sdW1lX2Jsa19zaXplID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZyYWlkX21hcC0+dm9sdW1lX2Jsa19zaXplKTsKKwlpZiAodm9sdW1lX2Jsa19zaXplICE9IDUxMikKKwkJZmlyc3RfYmxvY2sgPSAoZmlyc3RfYmxvY2sgKiB2b2x1bWVfYmxrX3NpemUpIC8gNTEyOworCisJZW5jcnlwdGlvbl9pbmZvLT5kYXRhX2VuY3J5cHRpb25fa2V5X2luZGV4ID0KKwkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+ZGF0YV9lbmNyeXB0aW9uX2tleV9pbmRleCk7CisJZW5jcnlwdGlvbl9pbmZvLT5lbmNyeXB0X3R3ZWFrX2xvd2VyID0gbG93ZXJfMzJfYml0cyhmaXJzdF9ibG9jayk7CisJZW5jcnlwdGlvbl9pbmZvLT5lbmNyeXB0X3R3ZWFrX3VwcGVyID0gdXBwZXJfMzJfYml0cyhmaXJzdF9ibG9jayk7Cit9CisKKy8qCisgKiBBdHRlbXB0IHRvIHBlcmZvcm0gb2ZmbG9hZCBSQUlEIG1hcHBpbmcgZm9yIGEgbG9naWNhbCB2b2x1bWUgSS9PLgorICovCisKKyNkZWZpbmUgUFFJX1JBSURfQllQQVNTX0lORUxJR0lCTEUJMQorCitzdGF0aWMgaW50IHBxaV9yYWlkX2J5cGFzc19zdWJtaXRfc2NzaV9jbWQoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UsIHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsCisJc3RydWN0IHBxaV9xdWV1ZV9ncm91cCAqcXVldWVfZ3JvdXApCit7CisJc3RydWN0IHJhaWRfbWFwICpyYWlkX21hcDsKKwlib29sIGlzX3dyaXRlID0gZmFsc2U7CisJdTMyIG1hcF9pbmRleDsKKwl1NjQgZmlyc3RfYmxvY2s7CisJdTY0IGxhc3RfYmxvY2s7CisJdTMyIGJsb2NrX2NudDsKKwl1MzIgYmxvY2tzX3Blcl9yb3c7CisJdTY0IGZpcnN0X3JvdzsKKwl1NjQgbGFzdF9yb3c7CisJdTMyIGZpcnN0X3Jvd19vZmZzZXQ7CisJdTMyIGxhc3Rfcm93X29mZnNldDsKKwl1MzIgZmlyc3RfY29sdW1uOworCXUzMiBsYXN0X2NvbHVtbjsKKwl1NjQgcjBfZmlyc3Rfcm93OworCXU2NCByMF9sYXN0X3JvdzsKKwl1MzIgcjVvcjZfYmxvY2tzX3Blcl9yb3c7CisJdTY0IHI1b3I2X2ZpcnN0X3JvdzsKKwl1NjQgcjVvcjZfbGFzdF9yb3c7CisJdTMyIHI1b3I2X2ZpcnN0X3Jvd19vZmZzZXQ7CisJdTMyIHI1b3I2X2xhc3Rfcm93X29mZnNldDsKKwl1MzIgcjVvcjZfZmlyc3RfY29sdW1uOworCXUzMiByNW9yNl9sYXN0X2NvbHVtbjsKKwl1MTYgZGF0YV9kaXNrc19wZXJfcm93OworCXUzMiB0b3RhbF9kaXNrc19wZXJfcm93OworCXUxNiBsYXlvdXRfbWFwX2NvdW50OworCXUzMiBzdHJpcGVzaXplOworCXUxNiBzdHJpcF9zaXplOworCXUzMiBmaXJzdF9ncm91cDsKKwl1MzIgbGFzdF9ncm91cDsKKwl1MzIgY3VycmVudF9ncm91cDsKKwl1MzIgbWFwX3JvdzsKKwl1MzIgYWlvX2hhbmRsZTsKKwl1NjQgZGlza19ibG9jazsKKwl1MzIgZGlza19ibG9ja19jbnQ7CisJdTggY2RiWzE2XTsKKwl1OCBjZGJfbGVuZ3RoOworCWludCBvZmZsb2FkX3RvX21pcnJvcjsKKwlzdHJ1Y3QgcHFpX2VuY3J5cHRpb25faW5mbyAqZW5jcnlwdGlvbl9pbmZvX3B0cjsKKwlzdHJ1Y3QgcHFpX2VuY3J5cHRpb25faW5mbyBlbmNyeXB0aW9uX2luZm87CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCXU2NCB0bXBkaXY7CisjZW5kaWYKKworCS8qIENoZWNrIGZvciB2YWxpZCBvcGNvZGUsIGdldCBMQkEgYW5kIGJsb2NrIGNvdW50LiAqLworCXN3aXRjaCAoc2NtZC0+Y21uZFswXSkgeworCWNhc2UgV1JJVEVfNjoKKwkJaXNfd3JpdGUgPSB0cnVlOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFJFQURfNjoKKwkJZmlyc3RfYmxvY2sgPSAodTY0KSgoKHNjbWQtPmNtbmRbMV0gJiAweDFmKSA8PCAxNikgfAorCQkJKHNjbWQtPmNtbmRbMl0gPDwgOCkgfCBzY21kLT5jbW5kWzNdKTsKKwkJYmxvY2tfY250ID0gKHUzMilzY21kLT5jbW5kWzRdOworCQlpZiAoYmxvY2tfY250ID09IDApCisJCQlibG9ja19jbnQgPSAyNTY7CisJCWJyZWFrOworCWNhc2UgV1JJVEVfMTA6CisJCWlzX3dyaXRlID0gdHJ1ZTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBSRUFEXzEwOgorCQlmaXJzdF9ibG9jayA9ICh1NjQpZ2V0X3VuYWxpZ25lZF9iZTMyKCZzY21kLT5jbW5kWzJdKTsKKwkJYmxvY2tfY250ID0gKHUzMilnZXRfdW5hbGlnbmVkX2JlMTYoJnNjbWQtPmNtbmRbN10pOworCQlicmVhazsKKwljYXNlIFdSSVRFXzEyOgorCQlpc193cml0ZSA9IHRydWU7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgUkVBRF8xMjoKKwkJZmlyc3RfYmxvY2sgPSAodTY0KWdldF91bmFsaWduZWRfYmUzMigmc2NtZC0+Y21uZFsyXSk7CisJCWJsb2NrX2NudCA9IGdldF91bmFsaWduZWRfYmUzMigmc2NtZC0+Y21uZFs2XSk7CisJCWJyZWFrOworCWNhc2UgV1JJVEVfMTY6CisJCWlzX3dyaXRlID0gdHJ1ZTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBSRUFEXzE2OgorCQlmaXJzdF9ibG9jayA9IGdldF91bmFsaWduZWRfYmU2NCgmc2NtZC0+Y21uZFsyXSk7CisJCWJsb2NrX2NudCA9IGdldF91bmFsaWduZWRfYmUzMigmc2NtZC0+Y21uZFsxMF0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBQcm9jZXNzIHZpYSBub3JtYWwgSS9PIHBhdGguICovCisJCXJldHVybiBQUUlfUkFJRF9CWVBBU1NfSU5FTElHSUJMRTsKKwl9CisKKwkvKiBDaGVjayBmb3Igd3JpdGUgdG8gbm9uLVJBSUQtMC4gKi8KKwlpZiAoaXNfd3JpdGUgJiYgZGV2aWNlLT5yYWlkX2xldmVsICE9IFNBX1JBSURfMCkKKwkJcmV0dXJuIFBRSV9SQUlEX0JZUEFTU19JTkVMSUdJQkxFOworCisJaWYgKHVubGlrZWx5KGJsb2NrX2NudCA9PSAwKSkKKwkJcmV0dXJuIFBRSV9SQUlEX0JZUEFTU19JTkVMSUdJQkxFOworCisJbGFzdF9ibG9jayA9IGZpcnN0X2Jsb2NrICsgYmxvY2tfY250IC0gMTsKKwlyYWlkX21hcCA9IGRldmljZS0+cmFpZF9tYXA7CisKKwkvKiBDaGVjayBmb3IgaW52YWxpZCBibG9jayBvciB3cmFwYXJvdW5kLiAqLworCWlmIChsYXN0X2Jsb2NrID49IGdldF91bmFsaWduZWRfbGU2NCgmcmFpZF9tYXAtPnZvbHVtZV9ibGtfY250KSB8fAorCQlsYXN0X2Jsb2NrIDwgZmlyc3RfYmxvY2spCisJCXJldHVybiBQUUlfUkFJRF9CWVBBU1NfSU5FTElHSUJMRTsKKworCWRhdGFfZGlza3NfcGVyX3JvdyA9IGdldF91bmFsaWduZWRfbGUxNigmcmFpZF9tYXAtPmRhdGFfZGlza3NfcGVyX3Jvdyk7CisJc3RyaXBfc2l6ZSA9IGdldF91bmFsaWduZWRfbGUxNigmcmFpZF9tYXAtPnN0cmlwX3NpemUpOworCWxheW91dF9tYXBfY291bnQgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJnJhaWRfbWFwLT5sYXlvdXRfbWFwX2NvdW50KTsKKworCS8qIENhbGN1bGF0ZSBzdHJpcGUgaW5mb3JtYXRpb24gZm9yIHRoZSByZXF1ZXN0LiAqLworCWJsb2Nrc19wZXJfcm93ID0gZGF0YV9kaXNrc19wZXJfcm93ICogc3RyaXBfc2l6ZTsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJdG1wZGl2ID0gZmlyc3RfYmxvY2s7CisJZG9fZGl2KHRtcGRpdiwgYmxvY2tzX3Blcl9yb3cpOworCWZpcnN0X3JvdyA9IHRtcGRpdjsKKwl0bXBkaXYgPSBsYXN0X2Jsb2NrOworCWRvX2Rpdih0bXBkaXYsIGJsb2Nrc19wZXJfcm93KTsKKwlsYXN0X3JvdyA9IHRtcGRpdjsKKwlmaXJzdF9yb3dfb2Zmc2V0ID0gKHUzMikoZmlyc3RfYmxvY2sgLSAoZmlyc3Rfcm93ICogYmxvY2tzX3Blcl9yb3cpKTsKKwlsYXN0X3Jvd19vZmZzZXQgPSAodTMyKShsYXN0X2Jsb2NrIC0gKGxhc3Rfcm93ICogYmxvY2tzX3Blcl9yb3cpKTsKKwl0bXBkaXYgPSBmaXJzdF9yb3dfb2Zmc2V0OworCWRvX2Rpdih0bXBkaXYsIHN0cmlwX3NpemUpOworCWZpcnN0X2NvbHVtbiA9IHRtcGRpdjsKKwl0bXBkaXYgPSBsYXN0X3Jvd19vZmZzZXQ7CisJZG9fZGl2KHRtcGRpdiwgc3RyaXBfc2l6ZSk7CisJbGFzdF9jb2x1bW4gPSB0bXBkaXY7CisjZWxzZQorCWZpcnN0X3JvdyA9IGZpcnN0X2Jsb2NrIC8gYmxvY2tzX3Blcl9yb3c7CisJbGFzdF9yb3cgPSBsYXN0X2Jsb2NrIC8gYmxvY2tzX3Blcl9yb3c7CisJZmlyc3Rfcm93X29mZnNldCA9ICh1MzIpKGZpcnN0X2Jsb2NrIC0gKGZpcnN0X3JvdyAqIGJsb2Nrc19wZXJfcm93KSk7CisJbGFzdF9yb3dfb2Zmc2V0ID0gKHUzMikobGFzdF9ibG9jayAtIChsYXN0X3JvdyAqIGJsb2Nrc19wZXJfcm93KSk7CisJZmlyc3RfY29sdW1uID0gZmlyc3Rfcm93X29mZnNldCAvIHN0cmlwX3NpemU7CisJbGFzdF9jb2x1bW4gPSBsYXN0X3Jvd19vZmZzZXQgLyBzdHJpcF9zaXplOworI2VuZGlmCisKKwkvKiBJZiB0aGlzIGlzbid0IGEgc2luZ2xlIHJvdy9jb2x1bW4gdGhlbiBnaXZlIHRvIHRoZSBjb250cm9sbGVyLiAqLworCWlmIChmaXJzdF9yb3cgIT0gbGFzdF9yb3cgfHwgZmlyc3RfY29sdW1uICE9IGxhc3RfY29sdW1uKQorCQlyZXR1cm4gUFFJX1JBSURfQllQQVNTX0lORUxJR0lCTEU7CisKKwkvKiBQcm9jZWVkaW5nIHdpdGggZHJpdmVyIG1hcHBpbmcuICovCisJdG90YWxfZGlza3NfcGVyX3JvdyA9IGRhdGFfZGlza3NfcGVyX3JvdyArCisJCWdldF91bmFsaWduZWRfbGUxNigmcmFpZF9tYXAtPm1ldGFkYXRhX2Rpc2tzX3Blcl9yb3cpOworCW1hcF9yb3cgPSAoKHUzMikoZmlyc3Rfcm93ID4+IHJhaWRfbWFwLT5wYXJpdHlfcm90YXRpb25fc2hpZnQpKSAlCisJCWdldF91bmFsaWduZWRfbGUxNigmcmFpZF9tYXAtPnJvd19jbnQpOworCW1hcF9pbmRleCA9IChtYXBfcm93ICogdG90YWxfZGlza3NfcGVyX3JvdykgKyBmaXJzdF9jb2x1bW47CisKKwkvKiBSQUlEIDEgKi8KKwlpZiAoZGV2aWNlLT5yYWlkX2xldmVsID09IFNBX1JBSURfMSkgeworCQlpZiAoZGV2aWNlLT5vZmZsb2FkX3RvX21pcnJvcikKKwkJCW1hcF9pbmRleCArPSBkYXRhX2Rpc2tzX3Blcl9yb3c7CisJCWRldmljZS0+b2ZmbG9hZF90b19taXJyb3IgPSAhZGV2aWNlLT5vZmZsb2FkX3RvX21pcnJvcjsKKwl9IGVsc2UgaWYgKGRldmljZS0+cmFpZF9sZXZlbCA9PSBTQV9SQUlEX0FETSkgeworCQkvKiBSQUlEIEFETSAqLworCQkvKgorCQkgKiBIYW5kbGVzIE4td2F5IG1pcnJvcnMgIChSMS1BRE0pIGFuZCBSMTAgd2l0aCAjIG9mIGRyaXZlcworCQkgKiBkaXZpc2libGUgYnkgMy4KKwkJICovCisJCW9mZmxvYWRfdG9fbWlycm9yID0gZGV2aWNlLT5vZmZsb2FkX3RvX21pcnJvcjsKKwkJaWYgKG9mZmxvYWRfdG9fbWlycm9yID09IDApICB7CisJCQkvKiB1c2UgcGh5c2ljYWwgZGlzayBpbiB0aGUgZmlyc3QgbWlycm9yZWQgZ3JvdXAuICovCisJCQltYXBfaW5kZXggJT0gZGF0YV9kaXNrc19wZXJfcm93OworCQl9IGVsc2UgeworCQkJZG8geworCQkJCS8qCisJCQkJICogRGV0ZXJtaW5lIG1pcnJvciBncm91cCB0aGF0IG1hcF9pbmRleAorCQkJCSAqIGluZGljYXRlcy4KKwkJCQkgKi8KKwkJCQljdXJyZW50X2dyb3VwID0gbWFwX2luZGV4IC8gZGF0YV9kaXNrc19wZXJfcm93OworCisJCQkJaWYgKG9mZmxvYWRfdG9fbWlycm9yICE9IGN1cnJlbnRfZ3JvdXApIHsKKwkJCQkJaWYgKGN1cnJlbnRfZ3JvdXAgPAorCQkJCQkJbGF5b3V0X21hcF9jb3VudCAtIDEpIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBTZWxlY3QgcmFpZCBpbmRleCBmcm9tCisJCQkJCQkgKiBuZXh0IGdyb3VwLgorCQkJCQkJICovCisJCQkJCQltYXBfaW5kZXggKz0gZGF0YV9kaXNrc19wZXJfcm93OworCQkJCQkJY3VycmVudF9ncm91cCsrOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyoKKwkJCQkJCSAqIFNlbGVjdCByYWlkIGluZGV4IGZyb20gZmlyc3QKKwkJCQkJCSAqIGdyb3VwLgorCQkJCQkJICovCisJCQkJCQltYXBfaW5kZXggJT0gZGF0YV9kaXNrc19wZXJfcm93OworCQkJCQkJY3VycmVudF9ncm91cCA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9IHdoaWxlIChvZmZsb2FkX3RvX21pcnJvciAhPSBjdXJyZW50X2dyb3VwKTsKKwkJfQorCisJCS8qIFNldCBtaXJyb3IgZ3JvdXAgdG8gdXNlIG5leHQgdGltZS4gKi8KKwkJb2ZmbG9hZF90b19taXJyb3IgPQorCQkJKG9mZmxvYWRfdG9fbWlycm9yID49IGxheW91dF9tYXBfY291bnQgLSAxKSA/CisJCQkJMCA6IG9mZmxvYWRfdG9fbWlycm9yICsgMTsKKwkJV0FSTl9PTihvZmZsb2FkX3RvX21pcnJvciA+PSBsYXlvdXRfbWFwX2NvdW50KTsKKwkJZGV2aWNlLT5vZmZsb2FkX3RvX21pcnJvciA9IG9mZmxvYWRfdG9fbWlycm9yOworCQkvKgorCQkgKiBBdm9pZCBkaXJlY3QgdXNlIG9mIGRldmljZS0+b2ZmbG9hZF90b19taXJyb3Igd2l0aGluIHRoaXMKKwkJICogZnVuY3Rpb24gc2luY2UgbXVsdGlwbGUgdGhyZWFkcyBtaWdodCBzaW11bHRhbmVvdXNseQorCQkgKiBpbmNyZW1lbnQgaXQgYmV5b25kIHRoZSByYW5nZSBvZiBkZXZpY2UtPmxheW91dF9tYXBfY291bnQgLTEuCisJCSAqLworCX0gZWxzZSBpZiAoKGRldmljZS0+cmFpZF9sZXZlbCA9PSBTQV9SQUlEXzUgfHwKKwkJZGV2aWNlLT5yYWlkX2xldmVsID09IFNBX1JBSURfNikgJiYgbGF5b3V0X21hcF9jb3VudCA+IDEpIHsKKwkJLyogUkFJRCA1MC82MCAqLworCQkvKiBWZXJpZnkgZmlyc3QgYW5kIGxhc3QgYmxvY2sgYXJlIGluIHNhbWUgUkFJRCBncm91cCAqLworCQlyNW9yNl9ibG9ja3NfcGVyX3JvdyA9IHN0cmlwX3NpemUgKiBkYXRhX2Rpc2tzX3Blcl9yb3c7CisJCXN0cmlwZXNpemUgPSByNW9yNl9ibG9ja3NfcGVyX3JvdyAqIGxheW91dF9tYXBfY291bnQ7CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCQl0bXBkaXYgPSBmaXJzdF9ibG9jazsKKwkJZmlyc3RfZ3JvdXAgPSBkb19kaXYodG1wZGl2LCBzdHJpcGVzaXplKTsKKwkJdG1wZGl2ID0gZmlyc3RfZ3JvdXA7CisJCWRvX2Rpdih0bXBkaXYsIHI1b3I2X2Jsb2Nrc19wZXJfcm93KTsKKwkJZmlyc3RfZ3JvdXAgPSB0bXBkaXY7CisJCXRtcGRpdiA9IGxhc3RfYmxvY2s7CisJCWxhc3RfZ3JvdXAgPSBkb19kaXYodG1wZGl2LCBzdHJpcGVzaXplKTsKKwkJdG1wZGl2ID0gbGFzdF9ncm91cDsKKwkJZG9fZGl2KHRtcGRpdiwgcjVvcjZfYmxvY2tzX3Blcl9yb3cpOworCQlsYXN0X2dyb3VwID0gdG1wZGl2OworI2Vsc2UKKwkJZmlyc3RfZ3JvdXAgPSAoZmlyc3RfYmxvY2sgJSBzdHJpcGVzaXplKSAvIHI1b3I2X2Jsb2Nrc19wZXJfcm93OworCQlsYXN0X2dyb3VwID0gKGxhc3RfYmxvY2sgJSBzdHJpcGVzaXplKSAvIHI1b3I2X2Jsb2Nrc19wZXJfcm93OworI2VuZGlmCisJCWlmIChmaXJzdF9ncm91cCAhPSBsYXN0X2dyb3VwKQorCQkJcmV0dXJuIFBRSV9SQUlEX0JZUEFTU19JTkVMSUdJQkxFOworCisJCS8qIFZlcmlmeSByZXF1ZXN0IGlzIGluIGEgc2luZ2xlIHJvdyBvZiBSQUlEIDUvNiAqLworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwkJdG1wZGl2ID0gZmlyc3RfYmxvY2s7CisJCWRvX2Rpdih0bXBkaXYsIHN0cmlwZXNpemUpOworCQlmaXJzdF9yb3cgPSByNW9yNl9maXJzdF9yb3cgPSByMF9maXJzdF9yb3cgPSB0bXBkaXY7CisJCXRtcGRpdiA9IGxhc3RfYmxvY2s7CisJCWRvX2Rpdih0bXBkaXYsIHN0cmlwZXNpemUpOworCQlyNW9yNl9sYXN0X3JvdyA9IHIwX2xhc3Rfcm93ID0gdG1wZGl2OworI2Vsc2UKKwkJZmlyc3Rfcm93ID0gcjVvcjZfZmlyc3Rfcm93ID0gcjBfZmlyc3Rfcm93ID0KKwkJCWZpcnN0X2Jsb2NrIC8gc3RyaXBlc2l6ZTsKKwkJcjVvcjZfbGFzdF9yb3cgPSByMF9sYXN0X3JvdyA9IGxhc3RfYmxvY2sgLyBzdHJpcGVzaXplOworI2VuZGlmCisJCWlmIChyNW9yNl9maXJzdF9yb3cgIT0gcjVvcjZfbGFzdF9yb3cpCisJCQlyZXR1cm4gUFFJX1JBSURfQllQQVNTX0lORUxJR0lCTEU7CisKKwkJLyogVmVyaWZ5IHJlcXVlc3QgaXMgaW4gYSBzaW5nbGUgY29sdW1uICovCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCQl0bXBkaXYgPSBmaXJzdF9ibG9jazsKKwkJZmlyc3Rfcm93X29mZnNldCA9IGRvX2Rpdih0bXBkaXYsIHN0cmlwZXNpemUpOworCQl0bXBkaXYgPSBmaXJzdF9yb3dfb2Zmc2V0OworCQlmaXJzdF9yb3dfb2Zmc2V0ID0gKHUzMilkb19kaXYodG1wZGl2LCByNW9yNl9ibG9ja3NfcGVyX3Jvdyk7CisJCXI1b3I2X2ZpcnN0X3Jvd19vZmZzZXQgPSBmaXJzdF9yb3dfb2Zmc2V0OworCQl0bXBkaXYgPSBsYXN0X2Jsb2NrOworCQlyNW9yNl9sYXN0X3Jvd19vZmZzZXQgPSBkb19kaXYodG1wZGl2LCBzdHJpcGVzaXplKTsKKwkJdG1wZGl2ID0gcjVvcjZfbGFzdF9yb3dfb2Zmc2V0OworCQlyNW9yNl9sYXN0X3Jvd19vZmZzZXQgPSBkb19kaXYodG1wZGl2LCByNW9yNl9ibG9ja3NfcGVyX3Jvdyk7CisJCXRtcGRpdiA9IHI1b3I2X2ZpcnN0X3Jvd19vZmZzZXQ7CisJCWRvX2Rpdih0bXBkaXYsIHN0cmlwX3NpemUpOworCQlmaXJzdF9jb2x1bW4gPSByNW9yNl9maXJzdF9jb2x1bW4gPSB0bXBkaXY7CisJCXRtcGRpdiA9IHI1b3I2X2xhc3Rfcm93X29mZnNldDsKKwkJZG9fZGl2KHRtcGRpdiwgc3RyaXBfc2l6ZSk7CisJCXI1b3I2X2xhc3RfY29sdW1uID0gdG1wZGl2OworI2Vsc2UKKwkJZmlyc3Rfcm93X29mZnNldCA9IHI1b3I2X2ZpcnN0X3Jvd19vZmZzZXQgPQorCQkJKHUzMikoKGZpcnN0X2Jsb2NrICUgc3RyaXBlc2l6ZSkgJQorCQkJcjVvcjZfYmxvY2tzX3Blcl9yb3cpOworCisJCXI1b3I2X2xhc3Rfcm93X29mZnNldCA9CisJCQkodTMyKSgobGFzdF9ibG9jayAlIHN0cmlwZXNpemUpICUKKwkJCXI1b3I2X2Jsb2Nrc19wZXJfcm93KTsKKworCQlmaXJzdF9jb2x1bW4gPSByNW9yNl9maXJzdF9yb3dfb2Zmc2V0IC8gc3RyaXBfc2l6ZTsKKwkJcjVvcjZfZmlyc3RfY29sdW1uID0gZmlyc3RfY29sdW1uOworCQlyNW9yNl9sYXN0X2NvbHVtbiA9IHI1b3I2X2xhc3Rfcm93X29mZnNldCAvIHN0cmlwX3NpemU7CisjZW5kaWYKKwkJaWYgKHI1b3I2X2ZpcnN0X2NvbHVtbiAhPSByNW9yNl9sYXN0X2NvbHVtbikKKwkJCXJldHVybiBQUUlfUkFJRF9CWVBBU1NfSU5FTElHSUJMRTsKKworCQkvKiBSZXF1ZXN0IGlzIGVsaWdpYmxlICovCisJCW1hcF9yb3cgPQorCQkJKCh1MzIpKGZpcnN0X3JvdyA+PiByYWlkX21hcC0+cGFyaXR5X3JvdGF0aW9uX3NoaWZ0KSkgJQorCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+cm93X2NudCk7CisKKwkJbWFwX2luZGV4ID0gKGZpcnN0X2dyb3VwICoKKwkJCShnZXRfdW5hbGlnbmVkX2xlMTYoJnJhaWRfbWFwLT5yb3dfY250KSAqCisJCQl0b3RhbF9kaXNrc19wZXJfcm93KSkgKworCQkJKG1hcF9yb3cgKiB0b3RhbF9kaXNrc19wZXJfcm93KSArIGZpcnN0X2NvbHVtbjsKKwl9CisKKwlpZiAodW5saWtlbHkobWFwX2luZGV4ID49IFJBSURfTUFQX01BWF9FTlRSSUVTKSkKKwkJcmV0dXJuIFBRSV9SQUlEX0JZUEFTU19JTkVMSUdJQkxFOworCisJYWlvX2hhbmRsZSA9IHJhaWRfbWFwLT5kaXNrX2RhdGFbbWFwX2luZGV4XS5haW9faGFuZGxlOworCWRpc2tfYmxvY2sgPSBnZXRfdW5hbGlnbmVkX2xlNjQoJnJhaWRfbWFwLT5kaXNrX3N0YXJ0aW5nX2JsaykgKworCQlmaXJzdF9yb3cgKiBzdHJpcF9zaXplICsKKwkJKGZpcnN0X3Jvd19vZmZzZXQgLSBmaXJzdF9jb2x1bW4gKiBzdHJpcF9zaXplKTsKKwlkaXNrX2Jsb2NrX2NudCA9IGJsb2NrX2NudDsKKworCS8qIEhhbmRsZSBkaWZmZXJpbmcgbG9naWNhbC9waHlzaWNhbCBibG9jayBzaXplcy4gKi8KKwlpZiAocmFpZF9tYXAtPnBoeXNfYmxrX3NoaWZ0KSB7CisJCWRpc2tfYmxvY2sgPDw9IHJhaWRfbWFwLT5waHlzX2Jsa19zaGlmdDsKKwkJZGlza19ibG9ja19jbnQgPDw9IHJhaWRfbWFwLT5waHlzX2Jsa19zaGlmdDsKKwl9CisKKwlpZiAodW5saWtlbHkoZGlza19ibG9ja19jbnQgPiAweGZmZmYpKQorCQlyZXR1cm4gUFFJX1JBSURfQllQQVNTX0lORUxJR0lCTEU7CisKKwkvKiBCdWlsZCB0aGUgbmV3IENEQiBmb3IgdGhlIHBoeXNpY2FsIGRpc2sgSS9PLiAqLworCWlmIChkaXNrX2Jsb2NrID4gMHhmZmZmZmZmZikgeworCQljZGJbMF0gPSBpc193cml0ZSA/IFdSSVRFXzE2IDogUkVBRF8xNjsKKwkJY2RiWzFdID0gMDsKKwkJcHV0X3VuYWxpZ25lZF9iZTY0KGRpc2tfYmxvY2ssICZjZGJbMl0pOworCQlwdXRfdW5hbGlnbmVkX2JlMzIoZGlza19ibG9ja19jbnQsICZjZGJbMTBdKTsKKwkJY2RiWzE0XSA9IDA7CisJCWNkYlsxNV0gPSAwOworCQljZGJfbGVuZ3RoID0gMTY7CisJfSBlbHNlIHsKKwkJY2RiWzBdID0gaXNfd3JpdGUgPyBXUklURV8xMCA6IFJFQURfMTA7CisJCWNkYlsxXSA9IDA7CisJCXB1dF91bmFsaWduZWRfYmUzMigodTMyKWRpc2tfYmxvY2ssICZjZGJbMl0pOworCQljZGJbNl0gPSAwOworCQlwdXRfdW5hbGlnbmVkX2JlMTYoKHUxNilkaXNrX2Jsb2NrX2NudCwgJmNkYls3XSk7CisJCWNkYls5XSA9IDA7CisJCWNkYl9sZW5ndGggPSAxMDsKKwl9CisKKwlpZiAoZ2V0X3VuYWxpZ25lZF9sZTE2KCZyYWlkX21hcC0+ZmxhZ3MpICYKKwkJUkFJRF9NQVBfRU5DUllQVElPTl9FTkFCTEVEKSB7CisJCXBxaV9zZXRfZW5jcnlwdGlvbl9pbmZvKCZlbmNyeXB0aW9uX2luZm8sIHJhaWRfbWFwLAorCQkJZmlyc3RfYmxvY2spOworCQllbmNyeXB0aW9uX2luZm9fcHRyID0gJmVuY3J5cHRpb25faW5mbzsKKwl9IGVsc2UgeworCQllbmNyeXB0aW9uX2luZm9fcHRyID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gcHFpX2Fpb19zdWJtaXRfaW8oY3RybF9pbmZvLCBzY21kLCBhaW9faGFuZGxlLAorCQljZGIsIGNkYl9sZW5ndGgsIHF1ZXVlX2dyb3VwLCBlbmNyeXB0aW9uX2luZm9fcHRyKTsKK30KKworI2RlZmluZSBQUUlfU1RBVFVTX0lETEUJCTB4MAorCisjZGVmaW5lIFBRSV9DUkVBVEVfQURNSU5fUVVFVUVfUEFJUgkxCisjZGVmaW5lIFBRSV9ERUxFVEVfQURNSU5fUVVFVUVfUEFJUgkyCisKKyNkZWZpbmUgUFFJX0RFVklDRV9TVEFURV9QT1dFUl9PTl9BTkRfUkVTRVQJCTB4MAorI2RlZmluZSBQUUlfREVWSUNFX1NUQVRFX1NUQVRVU19BVkFJTEFCTEUJCTB4MQorI2RlZmluZSBQUUlfREVWSUNFX1NUQVRFX0FMTF9SRUdJU1RFUlNfUkVBRFkJCTB4MgorI2RlZmluZSBQUUlfREVWSUNFX1NUQVRFX0FETUlOX1FVRVVFX1BBSVJfUkVBRFkJCTB4MworI2RlZmluZSBQUUlfREVWSUNFX1NUQVRFX0VSUk9SCQkJCTB4NAorCisjZGVmaW5lIFBRSV9NT0RFX1JFQURZX1RJTUVPVVRfU0VDUwkJMzAKKyNkZWZpbmUgUFFJX01PREVfUkVBRFlfUE9MTF9JTlRFUlZBTF9NU0VDUwkxCisKK3N0YXRpYyBpbnQgcHFpX3dhaXRfZm9yX3BxaV9tb2RlX3JlYWR5KHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzIF9faW9tZW0gKnBxaV9yZWdpc3RlcnM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXU2NCBzaWduYXR1cmU7CisJdTggc3RhdHVzOworCisJcHFpX3JlZ2lzdGVycyA9IGN0cmxfaW5mby0+cHFpX3JlZ2lzdGVyczsKKwl0aW1lb3V0ID0gKFBRSV9NT0RFX1JFQURZX1RJTUVPVVRfU0VDUyAqIEhaKSArIGppZmZpZXM7CisKKwl3aGlsZSAoMSkgeworCQlzaWduYXR1cmUgPSByZWFkcSgmcHFpX3JlZ2lzdGVycy0+c2lnbmF0dXJlKTsKKwkJaWYgKG1lbWNtcCgmc2lnbmF0dXJlLCBQUUlfREVWSUNFX1NJR05BVFVSRSwKKwkJCXNpemVvZihzaWduYXR1cmUpKSA9PSAwKQorCQkJYnJlYWs7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCQkidGltZWQgb3V0IHdhaXRpbmcgZm9yIFBRSSBzaWduYXR1cmVcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJbXNsZWVwKFBRSV9NT0RFX1JFQURZX1BPTExfSU5URVJWQUxfTVNFQ1MpOworCX0KKworCXdoaWxlICgxKSB7CisJCXN0YXR1cyA9IHJlYWRiKCZwcWlfcmVnaXN0ZXJzLT5mdW5jdGlvbl9hbmRfc3RhdHVzX2NvZGUpOworCQlpZiAoc3RhdHVzID09IFBRSV9TVEFUVVNfSURMRSkKKwkJCWJyZWFrOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkJInRpbWVkIG91dCB3YWl0aW5nIGZvciBQUUkgSURMRVxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQltc2xlZXAoUFFJX01PREVfUkVBRFlfUE9MTF9JTlRFUlZBTF9NU0VDUyk7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaWYgKHJlYWRsKCZwcWlfcmVnaXN0ZXJzLT5kZXZpY2Vfc3RhdHVzKSA9PQorCQkJUFFJX0RFVklDRV9TVEFURV9BTExfUkVHSVNURVJTX1JFQURZKQorCQkJYnJlYWs7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCQkidGltZWQgb3V0IHdhaXRpbmcgZm9yIFBRSSBhbGwgcmVnaXN0ZXJzIHJlYWR5XG4iKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCW1zbGVlcChQUUlfTU9ERV9SRUFEWV9QT0xMX0lOVEVSVkFMX01TRUNTKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBxaV9haW9fcGF0aF9kaXNhYmxlZChzdHJ1Y3QgcHFpX2lvX3JlcXVlc3QgKmlvX3JlcXVlc3QpCit7CisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlOworCisJZGV2aWNlID0gaW9fcmVxdWVzdC0+c2NtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKKwlkZXZpY2UtPm9mZmxvYWRfZW5hYmxlZCA9IGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHFpX3Rha2VfZGV2aWNlX29mZmxpbmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCXN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm87CisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlOworCisJaWYgKHNjc2lfZGV2aWNlX29ubGluZShzZGV2KSkgeworCQlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9PRkZMSU5FKTsKKwkJY3RybF9pbmZvID0gc2hvc3RfdG9faGJhKHNkZXYtPmhvc3QpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmN0cmxfaW5mby0+cmVzY2FuX3dvcmssIDApOworCQlkZXZpY2UgPSBzZGV2LT5ob3N0ZGF0YTsKKwkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsICJvZmZsaW5lZCBzY3NpICVkOiVkOiVkOiVkXG4iLAorCQkJY3RybF9pbmZvLT5zY3NpX2hvc3QtPmhvc3Rfbm8sIGRldmljZS0+YnVzLAorCQkJZGV2aWNlLT50YXJnZXQsIGRldmljZS0+bHVuKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBxaV9wcm9jZXNzX3JhaWRfaW9fZXJyb3Ioc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0KQoreworCXU4IHNjc2lfc3RhdHVzOworCXU4IGhvc3RfYnl0ZTsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOworCXN0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvICplcnJvcl9pbmZvOworCXNpemVfdCBzZW5zZV9kYXRhX2xlbmd0aDsKKwlpbnQgcmVzaWR1YWxfY291bnQ7CisJaW50IHhmZXJfY291bnQ7CisJc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNzaGRyOworCisJc2NtZCA9IGlvX3JlcXVlc3QtPnNjbWQ7CisJaWYgKCFzY21kKQorCQlyZXR1cm47CisKKwllcnJvcl9pbmZvID0gaW9fcmVxdWVzdC0+ZXJyb3JfaW5mbzsKKwlzY3NpX3N0YXR1cyA9IGVycm9yX2luZm8tPnN0YXR1czsKKwlob3N0X2J5dGUgPSBESURfT0s7CisKKwlpZiAoZXJyb3JfaW5mby0+ZGF0YV9vdXRfcmVzdWx0ID09IFBRSV9EQVRBX0lOX09VVF9VTkRFUkZMT1cpIHsKKwkJeGZlcl9jb3VudCA9CisJCQlnZXRfdW5hbGlnbmVkX2xlMzIoJmVycm9yX2luZm8tPmRhdGFfb3V0X3RyYW5zZmVycmVkKTsKKwkJcmVzaWR1YWxfY291bnQgPSBzY3NpX2J1ZmZsZW4oc2NtZCkgLSB4ZmVyX2NvdW50OworCQlzY3NpX3NldF9yZXNpZChzY21kLCByZXNpZHVhbF9jb3VudCk7CisJCWlmICh4ZmVyX2NvdW50IDwgc2NtZC0+dW5kZXJmbG93KQorCQkJaG9zdF9ieXRlID0gRElEX1NPRlRfRVJST1I7CisJfQorCisJc2Vuc2VfZGF0YV9sZW5ndGggPSBnZXRfdW5hbGlnbmVkX2xlMTYoJmVycm9yX2luZm8tPnNlbnNlX2RhdGFfbGVuZ3RoKTsKKwlpZiAoc2Vuc2VfZGF0YV9sZW5ndGggPT0gMCkKKwkJc2Vuc2VfZGF0YV9sZW5ndGggPQorCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZlcnJvcl9pbmZvLT5yZXNwb25zZV9kYXRhX2xlbmd0aCk7CisJaWYgKHNlbnNlX2RhdGFfbGVuZ3RoKSB7CisJCWlmIChzZW5zZV9kYXRhX2xlbmd0aCA+IHNpemVvZihlcnJvcl9pbmZvLT5kYXRhKSkKKwkJCXNlbnNlX2RhdGFfbGVuZ3RoID0gc2l6ZW9mKGVycm9yX2luZm8tPmRhdGEpOworCisJCWlmIChzY3NpX3N0YXR1cyA9PSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04gJiYKKwkJCXNjc2lfbm9ybWFsaXplX3NlbnNlKGVycm9yX2luZm8tPmRhdGEsCisJCQkJc2Vuc2VfZGF0YV9sZW5ndGgsICZzc2hkcikgJiYKKwkJCQlzc2hkci5zZW5zZV9rZXkgPT0gSEFSRFdBUkVfRVJST1IgJiYKKwkJCQlzc2hkci5hc2MgPT0gMHgzZSAmJgorCQkJCXNzaGRyLmFzY3EgPT0gMHgxKSB7CisJCQlwcWlfdGFrZV9kZXZpY2Vfb2ZmbGluZShzY21kLT5kZXZpY2UpOworCQkJaG9zdF9ieXRlID0gRElEX05PX0NPTk5FQ1Q7CisJCX0KKworCQlpZiAoc2Vuc2VfZGF0YV9sZW5ndGggPiBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpCisJCQlzZW5zZV9kYXRhX2xlbmd0aCA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKKwkJbWVtY3B5KHNjbWQtPnNlbnNlX2J1ZmZlciwgZXJyb3JfaW5mby0+ZGF0YSwKKwkJCXNlbnNlX2RhdGFfbGVuZ3RoKTsKKwl9CisKKwlzY21kLT5yZXN1bHQgPSBzY3NpX3N0YXR1czsKKwlzZXRfaG9zdF9ieXRlKHNjbWQsIGhvc3RfYnl0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBxaV9wcm9jZXNzX2Fpb19pb19lcnJvcihzdHJ1Y3QgcHFpX2lvX3JlcXVlc3QgKmlvX3JlcXVlc3QpCit7CisJdTggc2NzaV9zdGF0dXM7CisJdTggaG9zdF9ieXRlOworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQ7CisJc3RydWN0IHBxaV9haW9fZXJyb3JfaW5mbyAqZXJyb3JfaW5mbzsKKwlzaXplX3Qgc2Vuc2VfZGF0YV9sZW5ndGg7CisJaW50IHJlc2lkdWFsX2NvdW50OworCWludCB4ZmVyX2NvdW50OworCWJvb2wgZGV2aWNlX29mZmxpbmU7CisKKwlzY21kID0gaW9fcmVxdWVzdC0+c2NtZDsKKwllcnJvcl9pbmZvID0gaW9fcmVxdWVzdC0+ZXJyb3JfaW5mbzsKKwlob3N0X2J5dGUgPSBESURfT0s7CisJc2Vuc2VfZGF0YV9sZW5ndGggPSAwOworCWRldmljZV9vZmZsaW5lID0gZmFsc2U7CisKKwlzd2l0Y2ggKGVycm9yX2luZm8tPnNlcnZpY2VfcmVzcG9uc2UpIHsKKwljYXNlIFBRSV9BSU9fU0VSVl9SRVNQT05TRV9DT01QTEVURToKKwkJc2NzaV9zdGF0dXMgPSBlcnJvcl9pbmZvLT5zdGF0dXM7CisJCWJyZWFrOworCWNhc2UgUFFJX0FJT19TRVJWX1JFU1BPTlNFX0ZBSUxVUkU6CisJCXN3aXRjaCAoZXJyb3JfaW5mby0+c3RhdHVzKSB7CisJCWNhc2UgUFFJX0FJT19TVEFUVVNfSU9fQUJPUlRFRDoKKwkJCXNjc2lfc3RhdHVzID0gU0FNX1NUQVRfVEFTS19BQk9SVEVEOworCQkJYnJlYWs7CisJCWNhc2UgUFFJX0FJT19TVEFUVVNfVU5ERVJSVU46CisJCQlzY3NpX3N0YXR1cyA9IFNBTV9TVEFUX0dPT0Q7CisJCQlyZXNpZHVhbF9jb3VudCA9IGdldF91bmFsaWduZWRfbGUzMigKKwkJCQkJCSZlcnJvcl9pbmZvLT5yZXNpZHVhbF9jb3VudCk7CisJCQlzY3NpX3NldF9yZXNpZChzY21kLCByZXNpZHVhbF9jb3VudCk7CisJCQl4ZmVyX2NvdW50ID0gc2NzaV9idWZmbGVuKHNjbWQpIC0gcmVzaWR1YWxfY291bnQ7CisJCQlpZiAoeGZlcl9jb3VudCA8IHNjbWQtPnVuZGVyZmxvdykKKwkJCQlob3N0X2J5dGUgPSBESURfU09GVF9FUlJPUjsKKwkJCWJyZWFrOworCQljYXNlIFBRSV9BSU9fU1RBVFVTX09WRVJSVU46CisJCQlzY3NpX3N0YXR1cyA9IFNBTV9TVEFUX0dPT0Q7CisJCQlicmVhazsKKwkJY2FzZSBQUUlfQUlPX1NUQVRVU19BSU9fUEFUSF9ESVNBQkxFRDoKKwkJCXBxaV9haW9fcGF0aF9kaXNhYmxlZChpb19yZXF1ZXN0KTsKKwkJCXNjc2lfc3RhdHVzID0gU0FNX1NUQVRfR09PRDsKKwkJCWlvX3JlcXVlc3QtPnN0YXR1cyA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJY2FzZSBQUUlfQUlPX1NUQVRVU19OT19QQVRIX1RPX0RFVklDRToKKwkJY2FzZSBQUUlfQUlPX1NUQVRVU19JTlZBTElEX0RFVklDRToKKwkJCWRldmljZV9vZmZsaW5lID0gdHJ1ZTsKKwkJCXBxaV90YWtlX2RldmljZV9vZmZsaW5lKHNjbWQtPmRldmljZSk7CisJCQlob3N0X2J5dGUgPSBESURfTk9fQ09OTkVDVDsKKwkJCXNjc2lfc3RhdHVzID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQkJYnJlYWs7CisJCWNhc2UgUFFJX0FJT19TVEFUVVNfSU9fRVJST1I6CisJCWRlZmF1bHQ6CisJCQlzY3NpX3N0YXR1cyA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgUFFJX0FJT19TRVJWX1JFU1BPTlNFX1RNRl9DT01QTEVURToKKwljYXNlIFBRSV9BSU9fU0VSVl9SRVNQT05TRV9UTUZfU1VDQ0VFREVEOgorCQlzY3NpX3N0YXR1cyA9IFNBTV9TVEFUX0dPT0Q7CisJCWJyZWFrOworCWNhc2UgUFFJX0FJT19TRVJWX1JFU1BPTlNFX1RNRl9SRUpFQ1RFRDoKKwljYXNlIFBRSV9BSU9fU0VSVl9SRVNQT05TRV9UTUZfSU5DT1JSRUNUX0xVTjoKKwlkZWZhdWx0OgorCQlzY3NpX3N0YXR1cyA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJYnJlYWs7CisJfQorCisJaWYgKGVycm9yX2luZm8tPmRhdGFfcHJlc2VudCkgeworCQlzZW5zZV9kYXRhX2xlbmd0aCA9CisJCQlnZXRfdW5hbGlnbmVkX2xlMTYoJmVycm9yX2luZm8tPmRhdGFfbGVuZ3RoKTsKKwkJaWYgKHNlbnNlX2RhdGFfbGVuZ3RoKSB7CisJCQlpZiAoc2Vuc2VfZGF0YV9sZW5ndGggPiBzaXplb2YoZXJyb3JfaW5mby0+ZGF0YSkpCisJCQkJc2Vuc2VfZGF0YV9sZW5ndGggPSBzaXplb2YoZXJyb3JfaW5mby0+ZGF0YSk7CisJCQlpZiAoc2Vuc2VfZGF0YV9sZW5ndGggPiBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpCisJCQkJc2Vuc2VfZGF0YV9sZW5ndGggPSBTQ1NJX1NFTlNFX0JVRkZFUlNJWkU7CisJCQltZW1jcHkoc2NtZC0+c2Vuc2VfYnVmZmVyLCBlcnJvcl9pbmZvLT5kYXRhLAorCQkJCXNlbnNlX2RhdGFfbGVuZ3RoKTsKKwkJfQorCX0KKworCWlmIChkZXZpY2Vfb2ZmbGluZSAmJiBzZW5zZV9kYXRhX2xlbmd0aCA9PSAwKQorCQlzY3NpX2J1aWxkX3NlbnNlX2J1ZmZlcigwLCBzY21kLT5zZW5zZV9idWZmZXIsIEhBUkRXQVJFX0VSUk9SLAorCQkJMHgzZSwgMHgxKTsKKworCXNjbWQtPnJlc3VsdCA9IHNjc2lfc3RhdHVzOworCXNldF9ob3N0X2J5dGUoc2NtZCwgaG9zdF9ieXRlKTsKK30KKworc3RhdGljIHZvaWQgcHFpX3Byb2Nlc3NfaW9fZXJyb3IodW5zaWduZWQgaW50IGl1X3R5cGUsCisJc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0KQoreworCXN3aXRjaCAoaXVfdHlwZSkgeworCWNhc2UgUFFJX1JFU1BPTlNFX0lVX1JBSURfUEFUSF9JT19FUlJPUjoKKwkJcHFpX3Byb2Nlc3NfcmFpZF9pb19lcnJvcihpb19yZXF1ZXN0KTsKKwkJYnJlYWs7CisJY2FzZSBQUUlfUkVTUE9OU0VfSVVfQUlPX1BBVEhfSU9fRVJST1I6CisJCXBxaV9wcm9jZXNzX2Fpb19pb19lcnJvcihpb19yZXF1ZXN0KTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHBxaV9pbnRlcnByZXRfdGFza19tYW5hZ2VtZW50X3Jlc3BvbnNlKAorCXN0cnVjdCBwcWlfdGFza19tYW5hZ2VtZW50X3Jlc3BvbnNlICpyZXNwb25zZSkKK3sKKwlpbnQgcmM7CisKKwlzd2l0Y2ggKHJlc3BvbnNlLT5yZXNwb25zZV9jb2RlKSB7CisJY2FzZSBTT1BfVE1GX0NPTVBMRVRFOgorCWNhc2UgU09QX1RNRl9GVU5DVElPTl9TVUNDRUVERUQ6CisJCXJjID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlPOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHFpX3Byb2Nlc3NfaW9faW50cihzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfcXVldWVfZ3JvdXAgKnF1ZXVlX2dyb3VwKQoreworCXVuc2lnbmVkIGludCBudW1fcmVzcG9uc2VzOworCXBxaV9pbmRleF90IG9xX3BpOworCXBxaV9pbmRleF90IG9xX2NpOworCXN0cnVjdCBwcWlfaW9fcmVxdWVzdCAqaW9fcmVxdWVzdDsKKwlzdHJ1Y3QgcHFpX2lvX3Jlc3BvbnNlICpyZXNwb25zZTsKKwl1MTYgcmVxdWVzdF9pZDsKKworCW51bV9yZXNwb25zZXMgPSAwOworCW9xX2NpID0gcXVldWVfZ3JvdXAtPm9xX2NpX2NvcHk7CisKKwl3aGlsZSAoMSkgeworCQlvcV9waSA9ICpxdWV1ZV9ncm91cC0+b3FfcGk7CisJCWlmIChvcV9waSA9PSBvcV9jaSkKKwkJCWJyZWFrOworCisJCW51bV9yZXNwb25zZXMrKzsKKwkJcmVzcG9uc2UgPSBxdWV1ZV9ncm91cC0+b3FfZWxlbWVudF9hcnJheSArCisJCQkob3FfY2kgKiBQUUlfT1BFUkFUSU9OQUxfT1FfRUxFTUVOVF9MRU5HVEgpOworCisJCXJlcXVlc3RfaWQgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJnJlc3BvbnNlLT5yZXF1ZXN0X2lkKTsKKwkJV0FSTl9PTihyZXF1ZXN0X2lkID49IGN0cmxfaW5mby0+bWF4X2lvX3Nsb3RzKTsKKworCQlpb19yZXF1ZXN0ID0gJmN0cmxfaW5mby0+aW9fcmVxdWVzdF9wb29sW3JlcXVlc3RfaWRdOworCQlXQVJOX09OKGF0b21pY19yZWFkKCZpb19yZXF1ZXN0LT5yZWZjb3VudCkgPT0gMCk7CisKKwkJc3dpdGNoIChyZXNwb25zZS0+aGVhZGVyLml1X3R5cGUpIHsKKwkJY2FzZSBQUUlfUkVTUE9OU0VfSVVfUkFJRF9QQVRIX0lPX1NVQ0NFU1M6CisJCWNhc2UgUFFJX1JFU1BPTlNFX0lVX0FJT19QQVRIX0lPX1NVQ0NFU1M6CisJCWNhc2UgUFFJX1JFU1BPTlNFX0lVX0dFTkVSQUxfTUFOQUdFTUVOVDoKKwkJCWJyZWFrOworCQljYXNlIFBRSV9SRVNQT05TRV9JVV9UQVNLX01BTkFHRU1FTlQ6CisJCQlpb19yZXF1ZXN0LT5zdGF0dXMgPQorCQkJCXBxaV9pbnRlcnByZXRfdGFza19tYW5hZ2VtZW50X3Jlc3BvbnNlKAorCQkJCQkodm9pZCAqKXJlc3BvbnNlKTsKKwkJCWJyZWFrOworCQljYXNlIFBRSV9SRVNQT05TRV9JVV9BSU9fUEFUSF9ESVNBQkxFRDoKKwkJCXBxaV9haW9fcGF0aF9kaXNhYmxlZChpb19yZXF1ZXN0KTsKKwkJCWlvX3JlcXVlc3QtPnN0YXR1cyA9IC1FQUdBSU47CisJCQlicmVhazsKKwkJY2FzZSBQUUlfUkVTUE9OU0VfSVVfUkFJRF9QQVRIX0lPX0VSUk9SOgorCQljYXNlIFBRSV9SRVNQT05TRV9JVV9BSU9fUEFUSF9JT19FUlJPUjoKKwkJCWlvX3JlcXVlc3QtPmVycm9yX2luZm8gPSBjdHJsX2luZm8tPmVycm9yX2J1ZmZlciArCisJCQkJKGdldF91bmFsaWduZWRfbGUxNigmcmVzcG9uc2UtPmVycm9yX2luZGV4KSAqCisJCQkJUFFJX0VSUk9SX0JVRkZFUl9FTEVNRU5UX0xFTkdUSCk7CisJCQlwcWlfcHJvY2Vzc19pb19lcnJvcihyZXNwb25zZS0+aGVhZGVyLml1X3R5cGUsCisJCQkJaW9fcmVxdWVzdCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJCSJ1bmV4cGVjdGVkIElVIHR5cGU6IDB4JXhcbiIsCisJCQkJcmVzcG9uc2UtPmhlYWRlci5pdV90eXBlKTsKKwkJCVdBUk5fT04ocmVzcG9uc2UtPmhlYWRlci5pdV90eXBlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaW9fcmVxdWVzdC0+aW9fY29tcGxldGVfY2FsbGJhY2soaW9fcmVxdWVzdCwKKwkJCWlvX3JlcXVlc3QtPmNvbnRleHQpOworCisJCS8qCisJCSAqIE5vdGUgdGhhdCB0aGUgSS9PIHJlcXVlc3Qgc3RydWN0dXJlIENBTk5PVCBCRSBUT1VDSEVEIGFmdGVyCisJCSAqIHJldHVybmluZyBmcm9tIHRoZSBJL08gY29tcGxldGlvbiBjYWxsYmFjayEKKwkJICovCisKKwkJb3FfY2kgPSAob3FfY2kgKyAxKSAlIGN0cmxfaW5mby0+bnVtX2VsZW1lbnRzX3Blcl9vcTsKKwl9CisKKwlpZiAobnVtX3Jlc3BvbnNlcykgeworCQlxdWV1ZV9ncm91cC0+b3FfY2lfY29weSA9IG9xX2NpOworCQl3cml0ZWwob3FfY2ksIHF1ZXVlX2dyb3VwLT5vcV9jaSk7CisJfQorCisJcmV0dXJuIG51bV9yZXNwb25zZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBxaV9udW1fZWxlbWVudHNfZnJlZSh1bnNpZ25lZCBpbnQgcGksCisJdW5zaWduZWQgaW50IGNpLCB1bnNpZ25lZCBpbnQgZWxlbWVudHNfaW5fcXVldWUpCit7CisJdW5zaWduZWQgaW50IG51bV9lbGVtZW50c191c2VkOworCisJaWYgKHBpID49IGNpKQorCQludW1fZWxlbWVudHNfdXNlZCA9IHBpIC0gY2k7CisJZWxzZQorCQludW1fZWxlbWVudHNfdXNlZCA9IGVsZW1lbnRzX2luX3F1ZXVlIC0gY2kgKyBwaTsKKworCXJldHVybiBlbGVtZW50c19pbl9xdWV1ZSAtIG51bV9lbGVtZW50c191c2VkIC0gMTsKK30KKworI2RlZmluZSBQUUlfRVZFTlRfQUNLX1RJTUVPVVQJMzAKKworc3RhdGljIHZvaWQgcHFpX3N0YXJ0X2V2ZW50X2FjayhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfZXZlbnRfYWNrbm93bGVkZ2VfcmVxdWVzdCAqaXUsIHNpemVfdCBpdV9sZW5ndGgpCit7CisJcHFpX2luZGV4X3QgaXFfcGk7CisJcHFpX2luZGV4X3QgaXFfY2k7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICpuZXh0X2VsZW1lbnQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXN0cnVjdCBwcWlfcXVldWVfZ3JvdXAgKnF1ZXVlX2dyb3VwOworCisJcXVldWVfZ3JvdXAgPSAmY3RybF9pbmZvLT5xdWV1ZV9ncm91cHNbUFFJX0RFRkFVTFRfUVVFVUVfR1JPVVBdOworCXB1dF91bmFsaWduZWRfbGUxNihxdWV1ZV9ncm91cC0+b3FfaWQsICZpdS0+aGVhZGVyLnJlc3BvbnNlX3F1ZXVlX2lkKTsKKworCXRpbWVvdXQgPSAoUFFJX0VWRU5UX0FDS19USU1FT1VUICogSFopICsgamlmZmllczsKKworCXdoaWxlICgxKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZV9ncm91cC0+c3VibWl0X2xvY2tbUkFJRF9QQVRIXSwgZmxhZ3MpOworCisJCWlxX3BpID0gcXVldWVfZ3JvdXAtPmlxX3BpX2NvcHlbUkFJRF9QQVRIXTsKKwkJaXFfY2kgPSAqcXVldWVfZ3JvdXAtPmlxX2NpW1JBSURfUEFUSF07CisKKwkJaWYgKHBxaV9udW1fZWxlbWVudHNfZnJlZShpcV9waSwgaXFfY2ksCisJCQljdHJsX2luZm8tPm51bV9lbGVtZW50c19wZXJfaXEpKQorCQkJYnJlYWs7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKKwkJCSZxdWV1ZV9ncm91cC0+c3VibWl0X2xvY2tbUkFJRF9QQVRIXSwgZmxhZ3MpOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCQkic2VuZGluZyBldmVudCBhY2tub3dsZWRnZSB0aW1lZCBvdXRcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJbmV4dF9lbGVtZW50ID0gcXVldWVfZ3JvdXAtPmlxX2VsZW1lbnRfYXJyYXlbUkFJRF9QQVRIXSArCisJCShpcV9waSAqIFBRSV9PUEVSQVRJT05BTF9JUV9FTEVNRU5UX0xFTkdUSCk7CisKKwltZW1jcHkobmV4dF9lbGVtZW50LCBpdSwgaXVfbGVuZ3RoKTsKKworCWlxX3BpID0gKGlxX3BpICsgMSkgJSBjdHJsX2luZm8tPm51bV9lbGVtZW50c19wZXJfaXE7CisKKwlxdWV1ZV9ncm91cC0+aXFfcGlfY29weVtSQUlEX1BBVEhdID0gaXFfcGk7CisKKwkvKgorCSAqIFRoaXMgd3JpdGUgbm90aWZpZXMgdGhlIGNvbnRyb2xsZXIgdGhhdCBhbiBJVSBpcyBhdmFpbGFibGUgdG8gYmUKKwkgKiBwcm9jZXNzZWQuCisJICovCisJd3JpdGVsKGlxX3BpLCBxdWV1ZV9ncm91cC0+aXFfcGlbUkFJRF9QQVRIXSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZV9ncm91cC0+c3VibWl0X2xvY2tbUkFJRF9QQVRIXSwgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwcWlfYWNrbm93bGVkZ2VfZXZlbnQoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgcHFpX2V2ZW50X2Fja25vd2xlZGdlX3JlcXVlc3QgcmVxdWVzdDsKKworCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKworCXJlcXVlc3QuaGVhZGVyLml1X3R5cGUgPSBQUUlfUkVRVUVTVF9JVV9BQ0tOT1dMRURHRV9WRU5ET1JfRVZFTlQ7CisJcHV0X3VuYWxpZ25lZF9sZTE2KHNpemVvZihyZXF1ZXN0KSAtIFBRSV9SRVFVRVNUX0hFQURFUl9MRU5HVEgsCisJCSZyZXF1ZXN0LmhlYWRlci5pdV9sZW5ndGgpOworCXJlcXVlc3QuZXZlbnRfdHlwZSA9IGV2ZW50LT5ldmVudF90eXBlOworCXJlcXVlc3QuZXZlbnRfaWQgPSBldmVudC0+ZXZlbnRfaWQ7CisJcmVxdWVzdC5hZGRpdGlvbmFsX2V2ZW50X2lkID0gZXZlbnQtPmFkZGl0aW9uYWxfZXZlbnRfaWQ7CisKKwlwcWlfc3RhcnRfZXZlbnRfYWNrKGN0cmxfaW5mbywgJnJlcXVlc3QsIHNpemVvZihyZXF1ZXN0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHBxaV9ldmVudF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm87CisJc3RydWN0IHBxaV9ldmVudCAqcGVuZGluZ19ldmVudDsKKwlib29sIGdvdF9ub25faGVhcnRiZWF0X2V2ZW50ID0gZmFsc2U7CisKKwljdHJsX2luZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBxaV9jdHJsX2luZm8sIGV2ZW50X3dvcmspOworCisJcGVuZGluZ19ldmVudCA9IGN0cmxfaW5mby0+cGVuZGluZ19ldmVudHM7CisJZm9yIChpID0gMDsgaSA8IFBRSV9OVU1fU1VQUE9SVEVEX0VWRU5UUzsgaSsrKSB7CisJCWlmIChwZW5kaW5nX2V2ZW50LT5wZW5kaW5nKSB7CisJCQlwZW5kaW5nX2V2ZW50LT5wZW5kaW5nID0gZmFsc2U7CisJCQlwcWlfYWNrbm93bGVkZ2VfZXZlbnQoY3RybF9pbmZvLCBwZW5kaW5nX2V2ZW50KTsKKwkJCWlmIChpICE9IFBRSV9FVkVOVF9IRUFSVEJFQVQpCisJCQkJZ290X25vbl9oZWFydGJlYXRfZXZlbnQgPSB0cnVlOworCQl9CisJCXBlbmRpbmdfZXZlbnQrKzsKKwl9CisKKwlpZiAoZ290X25vbl9oZWFydGJlYXRfZXZlbnQpCisJCXBxaV9zY2hlZHVsZV9yZXNjYW5fd29ya2VyKGN0cmxfaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIHBxaV90YWtlX2N0cmxfb2ZmbGluZShzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBwYXRoOworCXN0cnVjdCBwcWlfcXVldWVfZ3JvdXAgKnF1ZXVlX2dyb3VwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0OworCXN0cnVjdCBwcWlfaW9fcmVxdWVzdCAqbmV4dDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kOworCisJY3RybF9pbmZvLT5jb250cm9sbGVyX29ubGluZSA9IGZhbHNlOworCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LCAiY29udHJvbGxlciBvZmZsaW5lXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBjdHJsX2luZm8tPm51bV9xdWV1ZV9ncm91cHM7IGkrKykgeworCQlxdWV1ZV9ncm91cCA9ICZjdHJsX2luZm8tPnF1ZXVlX2dyb3Vwc1tpXTsKKworCQlmb3IgKHBhdGggPSAwOyBwYXRoIDwgMjsgcGF0aCsrKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgKKwkJCQkmcXVldWVfZ3JvdXAtPnN1Ym1pdF9sb2NrW3BhdGhdLCBmbGFncyk7CisKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpb19yZXF1ZXN0LCBuZXh0LAorCQkJCSZxdWV1ZV9ncm91cC0+cmVxdWVzdF9saXN0W3BhdGhdLAorCQkJCXJlcXVlc3RfbGlzdF9lbnRyeSkgeworCisJCQkJc2NtZCA9IGlvX3JlcXVlc3QtPnNjbWQ7CisJCQkJaWYgKHNjbWQpIHsKKwkJCQkJc2V0X2hvc3RfYnl0ZShzY21kLCBESURfTk9fQ09OTkVDVCk7CisJCQkJCXBxaV9zY3NpX2RvbmUoc2NtZCk7CisJCQkJfQorCisJCQkJbGlzdF9kZWwoJmlvX3JlcXVlc3QtPnJlcXVlc3RfbGlzdF9lbnRyeSk7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCisJCQkJJnF1ZXVlX2dyb3VwLT5zdWJtaXRfbG9ja1twYXRoXSwgZmxhZ3MpOworCQl9CisJfQorfQorCisjZGVmaW5lIFBRSV9IRUFSVEJFQVRfVElNRVJfSU5URVJWQUwJKDUgKiBIWikKKyNkZWZpbmUgUFFJX01BWF9IRUFSVEJFQVRfUkVRVUVTVFMJNQorCitzdGF0aWMgdm9pZCBwcWlfaGVhcnRiZWF0X3RpbWVyX2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCWludCBudW1faW50ZXJydXB0czsKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvID0gKHN0cnVjdCBwcWlfY3RybF9pbmZvICopZGF0YTsKKworCW51bV9pbnRlcnJ1cHRzID0gYXRvbWljX3JlYWQoJmN0cmxfaW5mby0+bnVtX2ludGVycnVwdHMpOworCisJaWYgKG51bV9pbnRlcnJ1cHRzID09IGN0cmxfaW5mby0+cHJldmlvdXNfbnVtX2ludGVycnVwdHMpIHsKKwkJY3RybF9pbmZvLT5udW1faGVhcnRiZWF0c19yZXF1ZXN0ZWQrKzsKKwkJaWYgKGN0cmxfaW5mby0+bnVtX2hlYXJ0YmVhdHNfcmVxdWVzdGVkID4KKwkJCVBRSV9NQVhfSEVBUlRCRUFUX1JFUVVFU1RTKSB7CisJCQlwcWlfdGFrZV9jdHJsX29mZmxpbmUoY3RybF9pbmZvKTsKKwkJCXJldHVybjsKKwkJfQorCQljdHJsX2luZm8tPnBlbmRpbmdfZXZlbnRzW1BRSV9FVkVOVF9IRUFSVEJFQVRdLnBlbmRpbmcgPSB0cnVlOworCQlzY2hlZHVsZV93b3JrKCZjdHJsX2luZm8tPmV2ZW50X3dvcmspOworCX0gZWxzZSB7CisJCWN0cmxfaW5mby0+bnVtX2hlYXJ0YmVhdHNfcmVxdWVzdGVkID0gMDsKKwl9CisKKwljdHJsX2luZm8tPnByZXZpb3VzX251bV9pbnRlcnJ1cHRzID0gbnVtX2ludGVycnVwdHM7CisJbW9kX3RpbWVyKCZjdHJsX2luZm8tPmhlYXJ0YmVhdF90aW1lciwKKwkJamlmZmllcyArIFBRSV9IRUFSVEJFQVRfVElNRVJfSU5URVJWQUwpOworfQorCitzdGF0aWMgdm9pZCBwcWlfc3RhcnRfaGVhcnRiZWF0X3RpbWVyKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJY3RybF9pbmZvLT5wcmV2aW91c19udW1faW50ZXJydXB0cyA9CisJCWF0b21pY19yZWFkKCZjdHJsX2luZm8tPm51bV9pbnRlcnJ1cHRzKTsKKworCWluaXRfdGltZXIoJmN0cmxfaW5mby0+aGVhcnRiZWF0X3RpbWVyKTsKKwljdHJsX2luZm8tPmhlYXJ0YmVhdF90aW1lci5leHBpcmVzID0KKwkJamlmZmllcyArIFBRSV9IRUFSVEJFQVRfVElNRVJfSU5URVJWQUw7CisJY3RybF9pbmZvLT5oZWFydGJlYXRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWN0cmxfaW5mbzsKKwljdHJsX2luZm8tPmhlYXJ0YmVhdF90aW1lci5mdW5jdGlvbiA9IHBxaV9oZWFydGJlYXRfdGltZXJfaGFuZGxlcjsKKwlhZGRfdGltZXIoJmN0cmxfaW5mby0+aGVhcnRiZWF0X3RpbWVyKTsKKwljdHJsX2luZm8tPmhlYXJ0YmVhdF90aW1lcl9zdGFydGVkID0gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBxaV9zdG9wX2hlYXJ0YmVhdF90aW1lcihzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCWlmIChjdHJsX2luZm8tPmhlYXJ0YmVhdF90aW1lcl9zdGFydGVkKQorCQlkZWxfdGltZXJfc3luYygmY3RybF9pbmZvLT5oZWFydGJlYXRfdGltZXIpOworfQorCitzdGF0aWMgaW50IHBxaV9ldmVudF90eXBlX3RvX2V2ZW50X2luZGV4KHVuc2lnbmVkIGludCBldmVudF90eXBlKQoreworCWludCBpbmRleDsKKworCXN3aXRjaCAoZXZlbnRfdHlwZSkgeworCWNhc2UgUFFJX0VWRU5UX1RZUEVfSEVBUlRCRUFUOgorCQlpbmRleCA9IFBRSV9FVkVOVF9IRUFSVEJFQVQ7CisJCWJyZWFrOworCWNhc2UgUFFJX0VWRU5UX1RZUEVfSE9UUExVRzoKKwkJaW5kZXggPSBQUUlfRVZFTlRfSE9UUExVRzsKKwkJYnJlYWs7CisJY2FzZSBQUUlfRVZFTlRfVFlQRV9IQVJEV0FSRToKKwkJaW5kZXggPSBQUUlfRVZFTlRfSEFSRFdBUkU7CisJCWJyZWFrOworCWNhc2UgUFFJX0VWRU5UX1RZUEVfUEhZU0lDQUxfREVWSUNFOgorCQlpbmRleCA9IFBRSV9FVkVOVF9QSFlTSUNBTF9ERVZJQ0U7CisJCWJyZWFrOworCWNhc2UgUFFJX0VWRU5UX1RZUEVfTE9HSUNBTF9ERVZJQ0U6CisJCWluZGV4ID0gUFFJX0VWRU5UX0xPR0lDQUxfREVWSUNFOworCQlicmVhazsKKwljYXNlIFBRSV9FVkVOVF9UWVBFX0FJT19TVEFURV9DSEFOR0U6CisJCWluZGV4ID0gUFFJX0VWRU5UX0FJT19TVEFURV9DSEFOR0U7CisJCWJyZWFrOworCWNhc2UgUFFJX0VWRU5UX1RZUEVfQUlPX0NPTkZJR19DSEFOR0U6CisJCWluZGV4ID0gUFFJX0VWRU5UX0FJT19DT05GSUdfQ0hBTkdFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpbmRleCA9IC0xOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHFpX3Byb2Nlc3NfZXZlbnRfaW50cihzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXVuc2lnbmVkIGludCBudW1fZXZlbnRzOworCXBxaV9pbmRleF90IG9xX3BpOworCXBxaV9pbmRleF90IG9xX2NpOworCXN0cnVjdCBwcWlfZXZlbnRfcXVldWUgKmV2ZW50X3F1ZXVlOworCXN0cnVjdCBwcWlfZXZlbnRfcmVzcG9uc2UgKnJlc3BvbnNlOworCXN0cnVjdCBwcWlfZXZlbnQgKnBlbmRpbmdfZXZlbnQ7CisJYm9vbCBuZWVkX2RlbGF5ZWRfd29yazsKKwlpbnQgZXZlbnRfaW5kZXg7CisKKwlldmVudF9xdWV1ZSA9ICZjdHJsX2luZm8tPmV2ZW50X3F1ZXVlOworCW51bV9ldmVudHMgPSAwOworCW5lZWRfZGVsYXllZF93b3JrID0gZmFsc2U7CisJb3FfY2kgPSBldmVudF9xdWV1ZS0+b3FfY2lfY29weTsKKworCXdoaWxlICgxKSB7CisJCW9xX3BpID0gKmV2ZW50X3F1ZXVlLT5vcV9waTsKKwkJaWYgKG9xX3BpID09IG9xX2NpKQorCQkJYnJlYWs7CisKKwkJbnVtX2V2ZW50cysrOworCQlyZXNwb25zZSA9IGV2ZW50X3F1ZXVlLT5vcV9lbGVtZW50X2FycmF5ICsKKwkJCShvcV9jaSAqIFBRSV9FVkVOVF9PUV9FTEVNRU5UX0xFTkdUSCk7CisKKwkJZXZlbnRfaW5kZXggPQorCQkJcHFpX2V2ZW50X3R5cGVfdG9fZXZlbnRfaW5kZXgocmVzcG9uc2UtPmV2ZW50X3R5cGUpOworCisJCWlmIChldmVudF9pbmRleCA+PSAwKSB7CisJCQlpZiAocmVzcG9uc2UtPnJlcXVlc3RfYWNrbm93bGVnZSkgeworCQkJCXBlbmRpbmdfZXZlbnQgPQorCQkJCQkmY3RybF9pbmZvLT5wZW5kaW5nX2V2ZW50c1tldmVudF9pbmRleF07CisJCQkJcGVuZGluZ19ldmVudC0+ZXZlbnRfdHlwZSA9CisJCQkJCXJlc3BvbnNlLT5ldmVudF90eXBlOworCQkJCXBlbmRpbmdfZXZlbnQtPmV2ZW50X2lkID0gcmVzcG9uc2UtPmV2ZW50X2lkOworCQkJCXBlbmRpbmdfZXZlbnQtPmFkZGl0aW9uYWxfZXZlbnRfaWQgPQorCQkJCQlyZXNwb25zZS0+YWRkaXRpb25hbF9ldmVudF9pZDsKKwkJCQlpZiAoZXZlbnRfaW5kZXggIT0gUFFJX0VWRU5UX0hFQVJUQkVBVCkgeworCQkJCQlwZW5kaW5nX2V2ZW50LT5wZW5kaW5nID0gdHJ1ZTsKKwkJCQkJbmVlZF9kZWxheWVkX3dvcmsgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCW9xX2NpID0gKG9xX2NpICsgMSkgJSBQUUlfTlVNX0VWRU5UX1FVRVVFX0VMRU1FTlRTOworCX0KKworCWlmIChudW1fZXZlbnRzKSB7CisJCWV2ZW50X3F1ZXVlLT5vcV9jaV9jb3B5ID0gb3FfY2k7CisJCXdyaXRlbChvcV9jaSwgZXZlbnRfcXVldWUtPm9xX2NpKTsKKworCQlpZiAobmVlZF9kZWxheWVkX3dvcmspCisJCQlzY2hlZHVsZV93b3JrKCZjdHJsX2luZm8tPmV2ZW50X3dvcmspOworCX0KKworCXJldHVybiBudW1fZXZlbnRzOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgcHFpX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbzsKKwlzdHJ1Y3QgcHFpX3F1ZXVlX2dyb3VwICpxdWV1ZV9ncm91cDsKKwl1bnNpZ25lZCBpbnQgbnVtX3Jlc3BvbnNlc19oYW5kbGVkOworCisJcXVldWVfZ3JvdXAgPSBkYXRhOworCWN0cmxfaW5mbyA9IHF1ZXVlX2dyb3VwLT5jdHJsX2luZm87CisKKwlpZiAoIWN0cmxfaW5mbyB8fCAhcXVldWVfZ3JvdXAtPm9xX2NpKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwludW1fcmVzcG9uc2VzX2hhbmRsZWQgPSBwcWlfcHJvY2Vzc19pb19pbnRyKGN0cmxfaW5mbywgcXVldWVfZ3JvdXApOworCisJaWYgKGlycSA9PSBjdHJsX2luZm8tPmV2ZW50X2lycSkKKwkJbnVtX3Jlc3BvbnNlc19oYW5kbGVkICs9IHBxaV9wcm9jZXNzX2V2ZW50X2ludHIoY3RybF9pbmZvKTsKKworCWlmIChudW1fcmVzcG9uc2VzX2hhbmRsZWQpCisJCWF0b21pY19pbmMoJmN0cmxfaW5mby0+bnVtX2ludGVycnVwdHMpOworCisJcHFpX3N0YXJ0X2lvKGN0cmxfaW5mbywgcXVldWVfZ3JvdXAsIFJBSURfUEFUSCwgTlVMTCk7CisJcHFpX3N0YXJ0X2lvKGN0cmxfaW5mbywgcXVldWVfZ3JvdXAsIEFJT19QQVRILCBOVUxMKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBwcWlfcmVxdWVzdF9pcnFzKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJaW50IGk7CisJaW50IHJjOworCisJY3RybF9pbmZvLT5ldmVudF9pcnEgPSBjdHJsX2luZm8tPm1zaXhfdmVjdG9yc1swXTsKKworCWZvciAoaSA9IDA7IGkgPCBjdHJsX2luZm8tPm51bV9tc2l4X3ZlY3RvcnNfZW5hYmxlZDsgaSsrKSB7CisJCXJjID0gcmVxdWVzdF9pcnEoY3RybF9pbmZvLT5tc2l4X3ZlY3RvcnNbaV0sCisJCQlwcWlfaXJxX2hhbmRsZXIsIDAsCisJCQlEUklWRVJfTkFNRV9TSE9SVCwgY3RybF9pbmZvLT5pbnRyX2RhdGFbaV0pOworCQlpZiAocmMpIHsKKwkJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJCSJpcnEgJXUgaW5pdCBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwKKwkJCQljdHJsX2luZm8tPm1zaXhfdmVjdG9yc1tpXSwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJCWN0cmxfaW5mby0+bnVtX21zaXhfdmVjdG9yc19pbml0aWFsaXplZCsrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcWlfZnJlZV9pcnFzKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3RybF9pbmZvLT5udW1fbXNpeF92ZWN0b3JzX2luaXRpYWxpemVkOyBpKyspCisJCWZyZWVfaXJxKGN0cmxfaW5mby0+bXNpeF92ZWN0b3JzW2ldLAorCQkJY3RybF9pbmZvLT5pbnRyX2RhdGFbaV0pOworfQorCitzdGF0aWMgaW50IHBxaV9lbmFibGVfbXNpeF9pbnRlcnJ1cHRzKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IG1heF92ZWN0b3JzOworCWludCBudW1fdmVjdG9yc19lbmFibGVkOworCXN0cnVjdCBtc2l4X2VudHJ5IG1zaXhfZW50cmllc1tQUUlfTUFYX01TSVhfVkVDVE9SU107CisKKwltYXhfdmVjdG9ycyA9IGN0cmxfaW5mby0+bnVtX3F1ZXVlX2dyb3VwczsKKworCWZvciAoaSA9IDA7IGkgPCBtYXhfdmVjdG9yczsgaSsrKQorCQltc2l4X2VudHJpZXNbaV0uZW50cnkgPSBpOworCisJbnVtX3ZlY3RvcnNfZW5hYmxlZCA9IHBjaV9lbmFibGVfbXNpeF9yYW5nZShjdHJsX2luZm8tPnBjaV9kZXYsCisJCW1zaXhfZW50cmllcywgUFFJX01JTl9NU0lYX1ZFQ1RPUlMsIG1heF92ZWN0b3JzKTsKKworCWlmIChudW1fdmVjdG9yc19lbmFibGVkIDwgMCkgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJNU0ktWCBpbml0IGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLAorCQkJbnVtX3ZlY3RvcnNfZW5hYmxlZCk7CisJCXJldHVybiBudW1fdmVjdG9yc19lbmFibGVkOworCX0KKworCWN0cmxfaW5mby0+bnVtX21zaXhfdmVjdG9yc19lbmFibGVkID0gbnVtX3ZlY3RvcnNfZW5hYmxlZDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3ZlY3RvcnNfZW5hYmxlZDsgaSsrKSB7CisJCWN0cmxfaW5mby0+bXNpeF92ZWN0b3JzW2ldID0gbXNpeF9lbnRyaWVzW2ldLnZlY3RvcjsKKwkJY3RybF9pbmZvLT5pbnRyX2RhdGFbaV0gPSAmY3RybF9pbmZvLT5xdWV1ZV9ncm91cHNbaV07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBxaV9pcnFfc2V0X2FmZmluaXR5X2hpbnQoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlpbnQgaTsKKwlpbnQgcmM7CisJaW50IGNwdTsKKworCWNwdSA9IGNwdW1hc2tfZmlyc3QoY3B1X29ubGluZV9tYXNrKTsKKwlmb3IgKGkgPSAwOyBpIDwgY3RybF9pbmZvLT5udW1fbXNpeF92ZWN0b3JzX2luaXRpYWxpemVkOyBpKyspIHsKKwkJcmMgPSBpcnFfc2V0X2FmZmluaXR5X2hpbnQoY3RybF9pbmZvLT5tc2l4X3ZlY3RvcnNbaV0sCisJCQlnZXRfY3B1X21hc2soY3B1KSk7CisJCWlmIChyYykKKwkJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJCSJlcnJvciAlZCBzZXR0aW5nIGFmZmluaXR5IGhpbnQgZm9yIGlycSB2ZWN0b3IgJXVcbiIsCisJCQkJcmMsIGN0cmxfaW5mby0+bXNpeF92ZWN0b3JzW2ldKTsKKwkJY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgY3B1X29ubGluZV9tYXNrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBxaV9pcnFfdW5zZXRfYWZmaW5pdHlfaGludChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGN0cmxfaW5mby0+bnVtX21zaXhfdmVjdG9yc19pbml0aWFsaXplZDsgaSsrKQorCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQoY3RybF9pbmZvLT5tc2l4X3ZlY3RvcnNbaV0sIE5VTEwpOworfQorCitzdGF0aWMgaW50IHBxaV9hbGxvY19vcGVyYXRpb25hbF9xdWV1ZXMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzaXplX3QgYWxsb2NfbGVuZ3RoOworCXNpemVfdCBlbGVtZW50X2FycmF5X2xlbmd0aF9wZXJfaXE7CisJc2l6ZV90IGVsZW1lbnRfYXJyYXlfbGVuZ3RoX3Blcl9vcTsKKwl2b2lkICplbGVtZW50X2FycmF5OworCXZvaWQgKm5leHRfcXVldWVfaW5kZXg7CisJdm9pZCAqYWxpZ25lZF9wb2ludGVyOworCXVuc2lnbmVkIGludCBudW1faW5ib3VuZF9xdWV1ZXM7CisJdW5zaWduZWQgaW50IG51bV9vdXRib3VuZF9xdWV1ZXM7CisJdW5zaWduZWQgaW50IG51bV9xdWV1ZV9pbmRleGVzOworCXN0cnVjdCBwcWlfcXVldWVfZ3JvdXAgKnF1ZXVlX2dyb3VwOworCisJZWxlbWVudF9hcnJheV9sZW5ndGhfcGVyX2lxID0KKwkJUFFJX09QRVJBVElPTkFMX0lRX0VMRU1FTlRfTEVOR1RIICoKKwkJY3RybF9pbmZvLT5udW1fZWxlbWVudHNfcGVyX2lxOworCWVsZW1lbnRfYXJyYXlfbGVuZ3RoX3Blcl9vcSA9CisJCVBRSV9PUEVSQVRJT05BTF9PUV9FTEVNRU5UX0xFTkdUSCAqCisJCWN0cmxfaW5mby0+bnVtX2VsZW1lbnRzX3Blcl9vcTsKKwludW1faW5ib3VuZF9xdWV1ZXMgPSBjdHJsX2luZm8tPm51bV9xdWV1ZV9ncm91cHMgKiAyOworCW51bV9vdXRib3VuZF9xdWV1ZXMgPSBjdHJsX2luZm8tPm51bV9xdWV1ZV9ncm91cHM7CisJbnVtX3F1ZXVlX2luZGV4ZXMgPSAoY3RybF9pbmZvLT5udW1fcXVldWVfZ3JvdXBzICogMykgKyAxOworCisJYWxpZ25lZF9wb2ludGVyID0gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1faW5ib3VuZF9xdWV1ZXM7IGkrKykgeworCQlhbGlnbmVkX3BvaW50ZXIgPSBQVFJfQUxJR04oYWxpZ25lZF9wb2ludGVyLAorCQkJUFFJX1FVRVVFX0VMRU1FTlRfQVJSQVlfQUxJR05NRU5UKTsKKwkJYWxpZ25lZF9wb2ludGVyICs9IGVsZW1lbnRfYXJyYXlfbGVuZ3RoX3Blcl9pcTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX291dGJvdW5kX3F1ZXVlczsgaSsrKSB7CisJCWFsaWduZWRfcG9pbnRlciA9IFBUUl9BTElHTihhbGlnbmVkX3BvaW50ZXIsCisJCQlQUUlfUVVFVUVfRUxFTUVOVF9BUlJBWV9BTElHTk1FTlQpOworCQlhbGlnbmVkX3BvaW50ZXIgKz0gZWxlbWVudF9hcnJheV9sZW5ndGhfcGVyX29xOworCX0KKworCWFsaWduZWRfcG9pbnRlciA9IFBUUl9BTElHTihhbGlnbmVkX3BvaW50ZXIsCisJCVBRSV9RVUVVRV9FTEVNRU5UX0FSUkFZX0FMSUdOTUVOVCk7CisJYWxpZ25lZF9wb2ludGVyICs9IFBRSV9OVU1fRVZFTlRfUVVFVUVfRUxFTUVOVFMgKgorCQlQUUlfRVZFTlRfT1FfRUxFTUVOVF9MRU5HVEg7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3F1ZXVlX2luZGV4ZXM7IGkrKykgeworCQlhbGlnbmVkX3BvaW50ZXIgPSBQVFJfQUxJR04oYWxpZ25lZF9wb2ludGVyLAorCQkJUFFJX09QRVJBVElPTkFMX0lOREVYX0FMSUdOTUVOVCk7CisJCWFsaWduZWRfcG9pbnRlciArPSBzaXplb2YocHFpX2luZGV4X3QpOworCX0KKworCWFsbG9jX2xlbmd0aCA9IChzaXplX3QpYWxpZ25lZF9wb2ludGVyICsKKwkJUFFJX1FVRVVFX0VMRU1FTlRfQVJSQVlfQUxJR05NRU5UOworCisJY3RybF9pbmZvLT5xdWV1ZV9tZW1vcnlfYmFzZSA9CisJCWRtYV96YWxsb2NfY29oZXJlbnQoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJYWxsb2NfbGVuZ3RoLAorCQkJJmN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2VfZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2UpIHsKKwkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgUFFJIGFkbWluIHF1ZXVlc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2xlbmd0aCA9IGFsbG9jX2xlbmd0aDsKKworCWVsZW1lbnRfYXJyYXkgPSBQVFJfQUxJR04oY3RybF9pbmZvLT5xdWV1ZV9tZW1vcnlfYmFzZSwKKwkJUFFJX1FVRVVFX0VMRU1FTlRfQVJSQVlfQUxJR05NRU5UKTsKKworCWZvciAoaSA9IDA7IGkgPCBjdHJsX2luZm8tPm51bV9xdWV1ZV9ncm91cHM7IGkrKykgeworCQlxdWV1ZV9ncm91cCA9ICZjdHJsX2luZm8tPnF1ZXVlX2dyb3Vwc1tpXTsKKwkJcXVldWVfZ3JvdXAtPmlxX2VsZW1lbnRfYXJyYXlbUkFJRF9QQVRIXSA9IGVsZW1lbnRfYXJyYXk7CisJCXF1ZXVlX2dyb3VwLT5pcV9lbGVtZW50X2FycmF5X2J1c19hZGRyW1JBSURfUEFUSF0gPQorCQkJY3RybF9pbmZvLT5xdWV1ZV9tZW1vcnlfYmFzZV9kbWFfaGFuZGxlICsKKwkJCQkoZWxlbWVudF9hcnJheSAtIGN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2UpOworCQllbGVtZW50X2FycmF5ICs9IGVsZW1lbnRfYXJyYXlfbGVuZ3RoX3Blcl9pcTsKKwkJZWxlbWVudF9hcnJheSA9IFBUUl9BTElHTihlbGVtZW50X2FycmF5LAorCQkJUFFJX1FVRVVFX0VMRU1FTlRfQVJSQVlfQUxJR05NRU5UKTsKKwkJcXVldWVfZ3JvdXAtPmlxX2VsZW1lbnRfYXJyYXlbQUlPX1BBVEhdID0gZWxlbWVudF9hcnJheTsKKwkJcXVldWVfZ3JvdXAtPmlxX2VsZW1lbnRfYXJyYXlfYnVzX2FkZHJbQUlPX1BBVEhdID0KKwkJCWN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2VfZG1hX2hhbmRsZSArCisJCQkoZWxlbWVudF9hcnJheSAtIGN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2UpOworCQllbGVtZW50X2FycmF5ICs9IGVsZW1lbnRfYXJyYXlfbGVuZ3RoX3Blcl9pcTsKKwkJZWxlbWVudF9hcnJheSA9IFBUUl9BTElHTihlbGVtZW50X2FycmF5LAorCQkJUFFJX1FVRVVFX0VMRU1FTlRfQVJSQVlfQUxJR05NRU5UKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY3RybF9pbmZvLT5udW1fcXVldWVfZ3JvdXBzOyBpKyspIHsKKwkJcXVldWVfZ3JvdXAgPSAmY3RybF9pbmZvLT5xdWV1ZV9ncm91cHNbaV07CisJCXF1ZXVlX2dyb3VwLT5vcV9lbGVtZW50X2FycmF5ID0gZWxlbWVudF9hcnJheTsKKwkJcXVldWVfZ3JvdXAtPm9xX2VsZW1lbnRfYXJyYXlfYnVzX2FkZHIgPQorCQkJY3RybF9pbmZvLT5xdWV1ZV9tZW1vcnlfYmFzZV9kbWFfaGFuZGxlICsKKwkJCShlbGVtZW50X2FycmF5IC0gY3RybF9pbmZvLT5xdWV1ZV9tZW1vcnlfYmFzZSk7CisJCWVsZW1lbnRfYXJyYXkgKz0gZWxlbWVudF9hcnJheV9sZW5ndGhfcGVyX29xOworCQllbGVtZW50X2FycmF5ID0gUFRSX0FMSUdOKGVsZW1lbnRfYXJyYXksCisJCQlQUUlfUVVFVUVfRUxFTUVOVF9BUlJBWV9BTElHTk1FTlQpOworCX0KKworCWN0cmxfaW5mby0+ZXZlbnRfcXVldWUub3FfZWxlbWVudF9hcnJheSA9IGVsZW1lbnRfYXJyYXk7CisJY3RybF9pbmZvLT5ldmVudF9xdWV1ZS5vcV9lbGVtZW50X2FycmF5X2J1c19hZGRyID0KKwkJY3RybF9pbmZvLT5xdWV1ZV9tZW1vcnlfYmFzZV9kbWFfaGFuZGxlICsKKwkJKGVsZW1lbnRfYXJyYXkgLSBjdHJsX2luZm8tPnF1ZXVlX21lbW9yeV9iYXNlKTsKKwllbGVtZW50X2FycmF5ICs9IFBRSV9OVU1fRVZFTlRfUVVFVUVfRUxFTUVOVFMgKgorCQlQUUlfRVZFTlRfT1FfRUxFTUVOVF9MRU5HVEg7CisKKwluZXh0X3F1ZXVlX2luZGV4ID0gUFRSX0FMSUdOKGVsZW1lbnRfYXJyYXksCisJCVBRSV9PUEVSQVRJT05BTF9JTkRFWF9BTElHTk1FTlQpOworCisJZm9yIChpID0gMDsgaSA8IGN0cmxfaW5mby0+bnVtX3F1ZXVlX2dyb3VwczsgaSsrKSB7CisJCXF1ZXVlX2dyb3VwID0gJmN0cmxfaW5mby0+cXVldWVfZ3JvdXBzW2ldOworCQlxdWV1ZV9ncm91cC0+aXFfY2lbUkFJRF9QQVRIXSA9IG5leHRfcXVldWVfaW5kZXg7CisJCXF1ZXVlX2dyb3VwLT5pcV9jaV9idXNfYWRkcltSQUlEX1BBVEhdID0KKwkJCWN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2VfZG1hX2hhbmRsZSArCisJCQkobmV4dF9xdWV1ZV9pbmRleCAtIGN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2UpOworCQluZXh0X3F1ZXVlX2luZGV4ICs9IHNpemVvZihwcWlfaW5kZXhfdCk7CisJCW5leHRfcXVldWVfaW5kZXggPSBQVFJfQUxJR04obmV4dF9xdWV1ZV9pbmRleCwKKwkJCVBRSV9PUEVSQVRJT05BTF9JTkRFWF9BTElHTk1FTlQpOworCQlxdWV1ZV9ncm91cC0+aXFfY2lbQUlPX1BBVEhdID0gbmV4dF9xdWV1ZV9pbmRleDsKKwkJcXVldWVfZ3JvdXAtPmlxX2NpX2J1c19hZGRyW0FJT19QQVRIXSA9CisJCQljdHJsX2luZm8tPnF1ZXVlX21lbW9yeV9iYXNlX2RtYV9oYW5kbGUgKworCQkJKG5leHRfcXVldWVfaW5kZXggLSBjdHJsX2luZm8tPnF1ZXVlX21lbW9yeV9iYXNlKTsKKwkJbmV4dF9xdWV1ZV9pbmRleCArPSBzaXplb2YocHFpX2luZGV4X3QpOworCQluZXh0X3F1ZXVlX2luZGV4ID0gUFRSX0FMSUdOKG5leHRfcXVldWVfaW5kZXgsCisJCQlQUUlfT1BFUkFUSU9OQUxfSU5ERVhfQUxJR05NRU5UKTsKKwkJcXVldWVfZ3JvdXAtPm9xX3BpID0gbmV4dF9xdWV1ZV9pbmRleDsKKwkJcXVldWVfZ3JvdXAtPm9xX3BpX2J1c19hZGRyID0KKwkJCWN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2VfZG1hX2hhbmRsZSArCisJCQkobmV4dF9xdWV1ZV9pbmRleCAtIGN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2UpOworCQluZXh0X3F1ZXVlX2luZGV4ICs9IHNpemVvZihwcWlfaW5kZXhfdCk7CisJCW5leHRfcXVldWVfaW5kZXggPSBQVFJfQUxJR04obmV4dF9xdWV1ZV9pbmRleCwKKwkJCVBRSV9PUEVSQVRJT05BTF9JTkRFWF9BTElHTk1FTlQpOworCX0KKworCWN0cmxfaW5mby0+ZXZlbnRfcXVldWUub3FfcGkgPSBuZXh0X3F1ZXVlX2luZGV4OworCWN0cmxfaW5mby0+ZXZlbnRfcXVldWUub3FfcGlfYnVzX2FkZHIgPQorCQljdHJsX2luZm8tPnF1ZXVlX21lbW9yeV9iYXNlX2RtYV9oYW5kbGUgKworCQkobmV4dF9xdWV1ZV9pbmRleCAtIGN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBxaV9pbml0X29wZXJhdGlvbmFsX3F1ZXVlcyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXVuc2lnbmVkIGludCBpOworCXUxNiBuZXh0X2lxX2lkID0gUFFJX01JTl9PUEVSQVRJT05BTF9RVUVVRV9JRDsKKwl1MTYgbmV4dF9vcV9pZCA9IFBRSV9NSU5fT1BFUkFUSU9OQUxfUVVFVUVfSUQ7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGJhY2twb2ludGVycyB0byB0aGUgY29udHJvbGxlciBzdHJ1Y3R1cmUgaW4KKwkgKiBlYWNoIG9wZXJhdGlvbmFsIHF1ZXVlIGdyb3VwIHN0cnVjdHVyZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3RybF9pbmZvLT5udW1fcXVldWVfZ3JvdXBzOyBpKyspCisJCWN0cmxfaW5mby0+cXVldWVfZ3JvdXBzW2ldLmN0cmxfaW5mbyA9IGN0cmxfaW5mbzsKKworCS8qCisJICogQXNzaWduIElEcyB0byBhbGwgb3BlcmF0aW9uYWwgcXVldWVzLiAgTm90ZSB0aGF0IHRoZSBJRHMKKwkgKiBhc3NpZ25lZCB0byBvcGVyYXRpb25hbCBJUXMgYXJlIGluZGVwZW5kZW50IG9mIHRoZSBJRHMKKwkgKiBhc3NpZ25lZCB0byBvcGVyYXRpb25hbCBPUXMuCisJICovCisJY3RybF9pbmZvLT5ldmVudF9xdWV1ZS5vcV9pZCA9IG5leHRfb3FfaWQrKzsKKwlmb3IgKGkgPSAwOyBpIDwgY3RybF9pbmZvLT5udW1fcXVldWVfZ3JvdXBzOyBpKyspIHsKKwkJY3RybF9pbmZvLT5xdWV1ZV9ncm91cHNbaV0uaXFfaWRbUkFJRF9QQVRIXSA9IG5leHRfaXFfaWQrKzsKKwkJY3RybF9pbmZvLT5xdWV1ZV9ncm91cHNbaV0uaXFfaWRbQUlPX1BBVEhdID0gbmV4dF9pcV9pZCsrOworCQljdHJsX2luZm8tPnF1ZXVlX2dyb3Vwc1tpXS5vcV9pZCA9IG5leHRfb3FfaWQrKzsKKwl9CisKKwkvKgorCSAqIEFzc2lnbiBNU0ktWCB0YWJsZSBlbnRyeSBpbmRleGVzIHRvIGFsbCBxdWV1ZXMuICBOb3RlIHRoYXQgdGhlCisJICogaW50ZXJydXB0IGZvciB0aGUgZXZlbnQgcXVldWUgaXMgc2hhcmVkIHdpdGggdGhlIGZpcnN0IHF1ZXVlIGdyb3VwLgorCSAqLworCWN0cmxfaW5mby0+ZXZlbnRfcXVldWUuaW50X21zZ19udW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBjdHJsX2luZm8tPm51bV9xdWV1ZV9ncm91cHM7IGkrKykKKwkJY3RybF9pbmZvLT5xdWV1ZV9ncm91cHNbaV0uaW50X21zZ19udW0gPSBpOworCisJZm9yIChpID0gMDsgaSA8IGN0cmxfaW5mby0+bnVtX3F1ZXVlX2dyb3VwczsgaSsrKSB7CisJCXNwaW5fbG9ja19pbml0KCZjdHJsX2luZm8tPnF1ZXVlX2dyb3Vwc1tpXS5zdWJtaXRfbG9ja1swXSk7CisJCXNwaW5fbG9ja19pbml0KCZjdHJsX2luZm8tPnF1ZXVlX2dyb3Vwc1tpXS5zdWJtaXRfbG9ja1sxXSk7CisJCUlOSVRfTElTVF9IRUFEKCZjdHJsX2luZm8tPnF1ZXVlX2dyb3Vwc1tpXS5yZXF1ZXN0X2xpc3RbMF0pOworCQlJTklUX0xJU1RfSEVBRCgmY3RybF9pbmZvLT5xdWV1ZV9ncm91cHNbaV0ucmVxdWVzdF9saXN0WzFdKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcHFpX2FsbG9jX2FkbWluX3F1ZXVlcyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXNpemVfdCBhbGxvY19sZW5ndGg7CisJc3RydWN0IHBxaV9hZG1pbl9xdWV1ZXNfYWxpZ25lZCAqYWRtaW5fcXVldWVzX2FsaWduZWQ7CisJc3RydWN0IHBxaV9hZG1pbl9xdWV1ZXMgKmFkbWluX3F1ZXVlczsKKworCWFsbG9jX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgcHFpX2FkbWluX3F1ZXVlc19hbGlnbmVkKSArCisJCVBRSV9RVUVVRV9FTEVNRU5UX0FSUkFZX0FMSUdOTUVOVDsKKworCWN0cmxfaW5mby0+YWRtaW5fcXVldWVfbWVtb3J5X2Jhc2UgPQorCQlkbWFfemFsbG9jX2NvaGVyZW50KCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCWFsbG9jX2xlbmd0aCwKKwkJCSZjdHJsX2luZm8tPmFkbWluX3F1ZXVlX21lbW9yeV9iYXNlX2RtYV9oYW5kbGUsCisJCQlHRlBfS0VSTkVMKTsKKworCWlmICghY3RybF9pbmZvLT5hZG1pbl9xdWV1ZV9tZW1vcnlfYmFzZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljdHJsX2luZm8tPmFkbWluX3F1ZXVlX21lbW9yeV9sZW5ndGggPSBhbGxvY19sZW5ndGg7CisKKwlhZG1pbl9xdWV1ZXMgPSAmY3RybF9pbmZvLT5hZG1pbl9xdWV1ZXM7CisJYWRtaW5fcXVldWVzX2FsaWduZWQgPSBQVFJfQUxJR04oY3RybF9pbmZvLT5hZG1pbl9xdWV1ZV9tZW1vcnlfYmFzZSwKKwkJUFFJX1FVRVVFX0VMRU1FTlRfQVJSQVlfQUxJR05NRU5UKTsKKwlhZG1pbl9xdWV1ZXMtPmlxX2VsZW1lbnRfYXJyYXkgPQorCQkmYWRtaW5fcXVldWVzX2FsaWduZWQtPmlxX2VsZW1lbnRfYXJyYXk7CisJYWRtaW5fcXVldWVzLT5vcV9lbGVtZW50X2FycmF5ID0KKwkJJmFkbWluX3F1ZXVlc19hbGlnbmVkLT5vcV9lbGVtZW50X2FycmF5OworCWFkbWluX3F1ZXVlcy0+aXFfY2kgPSAmYWRtaW5fcXVldWVzX2FsaWduZWQtPmlxX2NpOworCWFkbWluX3F1ZXVlcy0+b3FfcGkgPSAmYWRtaW5fcXVldWVzX2FsaWduZWQtPm9xX3BpOworCisJYWRtaW5fcXVldWVzLT5pcV9lbGVtZW50X2FycmF5X2J1c19hZGRyID0KKwkJY3RybF9pbmZvLT5hZG1pbl9xdWV1ZV9tZW1vcnlfYmFzZV9kbWFfaGFuZGxlICsKKwkJKGFkbWluX3F1ZXVlcy0+aXFfZWxlbWVudF9hcnJheSAtCisJCWN0cmxfaW5mby0+YWRtaW5fcXVldWVfbWVtb3J5X2Jhc2UpOworCWFkbWluX3F1ZXVlcy0+b3FfZWxlbWVudF9hcnJheV9idXNfYWRkciA9CisJCWN0cmxfaW5mby0+YWRtaW5fcXVldWVfbWVtb3J5X2Jhc2VfZG1hX2hhbmRsZSArCisJCShhZG1pbl9xdWV1ZXMtPm9xX2VsZW1lbnRfYXJyYXkgLQorCQljdHJsX2luZm8tPmFkbWluX3F1ZXVlX21lbW9yeV9iYXNlKTsKKwlhZG1pbl9xdWV1ZXMtPmlxX2NpX2J1c19hZGRyID0KKwkJY3RybF9pbmZvLT5hZG1pbl9xdWV1ZV9tZW1vcnlfYmFzZV9kbWFfaGFuZGxlICsKKwkJKCh2b2lkICopYWRtaW5fcXVldWVzLT5pcV9jaSAtCisJCWN0cmxfaW5mby0+YWRtaW5fcXVldWVfbWVtb3J5X2Jhc2UpOworCWFkbWluX3F1ZXVlcy0+b3FfcGlfYnVzX2FkZHIgPQorCQljdHJsX2luZm8tPmFkbWluX3F1ZXVlX21lbW9yeV9iYXNlX2RtYV9oYW5kbGUgKworCQkoKHZvaWQgKilhZG1pbl9xdWV1ZXMtPm9xX3BpIC0KKwkJY3RybF9pbmZvLT5hZG1pbl9xdWV1ZV9tZW1vcnlfYmFzZSk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBQUUlfQURNSU5fUVVFVUVfQ1JFQVRFX1RJTUVPVVRfSklGRklFUwkJSFoKKyNkZWZpbmUgUFFJX0FETUlOX1FVRVVFX0NSRUFURV9QT0xMX0lOVEVSVkFMX01TRUNTCTEKKworc3RhdGljIGludCBwcWlfY3JlYXRlX2FkbWluX3F1ZXVlcyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXN0cnVjdCBwcWlfZGV2aWNlX3JlZ2lzdGVycyBfX2lvbWVtICpwcWlfcmVnaXN0ZXJzOworCXN0cnVjdCBwcWlfYWRtaW5fcXVldWVzICphZG1pbl9xdWV1ZXM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXU4IHN0YXR1czsKKwl1MzIgcmVnOworCisJcHFpX3JlZ2lzdGVycyA9IGN0cmxfaW5mby0+cHFpX3JlZ2lzdGVyczsKKwlhZG1pbl9xdWV1ZXMgPSAmY3RybF9pbmZvLT5hZG1pbl9xdWV1ZXM7CisKKwl3cml0ZXEoKHU2NClhZG1pbl9xdWV1ZXMtPmlxX2VsZW1lbnRfYXJyYXlfYnVzX2FkZHIsCisJCSZwcWlfcmVnaXN0ZXJzLT5hZG1pbl9pcV9lbGVtZW50X2FycmF5X2FkZHIpOworCXdyaXRlcSgodTY0KWFkbWluX3F1ZXVlcy0+b3FfZWxlbWVudF9hcnJheV9idXNfYWRkciwKKwkJJnBxaV9yZWdpc3RlcnMtPmFkbWluX29xX2VsZW1lbnRfYXJyYXlfYWRkcik7CisJd3JpdGVxKCh1NjQpYWRtaW5fcXVldWVzLT5pcV9jaV9idXNfYWRkciwKKwkJJnBxaV9yZWdpc3RlcnMtPmFkbWluX2lxX2NpX2FkZHIpOworCXdyaXRlcSgodTY0KWFkbWluX3F1ZXVlcy0+b3FfcGlfYnVzX2FkZHIsCisJCSZwcWlfcmVnaXN0ZXJzLT5hZG1pbl9vcV9waV9hZGRyKTsKKworCXJlZyA9IFBRSV9BRE1JTl9JUV9OVU1fRUxFTUVOVFMgfAorCQkoUFFJX0FETUlOX09RX05VTV9FTEVNRU5UUykgPDwgOCB8CisJCShhZG1pbl9xdWV1ZXMtPmludF9tc2dfbnVtIDw8IDE2KTsKKwl3cml0ZWwocmVnLCAmcHFpX3JlZ2lzdGVycy0+YWRtaW5faXFfbnVtX2VsZW1lbnRzKTsKKwl3cml0ZWwoUFFJX0NSRUFURV9BRE1JTl9RVUVVRV9QQUlSLAorCQkmcHFpX3JlZ2lzdGVycy0+ZnVuY3Rpb25fYW5kX3N0YXR1c19jb2RlKTsKKworCXRpbWVvdXQgPSBQUUlfQURNSU5fUVVFVUVfQ1JFQVRFX1RJTUVPVVRfSklGRklFUyArIGppZmZpZXM7CisJd2hpbGUgKDEpIHsKKwkJc3RhdHVzID0gcmVhZGIoJnBxaV9yZWdpc3RlcnMtPmZ1bmN0aW9uX2FuZF9zdGF0dXNfY29kZSk7CisJCWlmIChzdGF0dXMgPT0gUFFJX1NUQVRVU19JRExFKQorCQkJYnJlYWs7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCW1zbGVlcChQUUlfQURNSU5fUVVFVUVfQ1JFQVRFX1BPTExfSU5URVJWQUxfTVNFQ1MpOworCX0KKworCS8qCisJICogVGhlIG9mZnNldCByZWdpc3RlcnMgYXJlIG5vdCBpbml0aWFsaXplZCB0byB0aGUgY29ycmVjdAorCSAqIG9mZnNldHMgdW50aWwgKmFmdGVyKiB0aGUgY3JlYXRlIGFkbWluIHF1ZXVlIHBhaXIgY29tbWFuZAorCSAqIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHkuCisJICovCisJYWRtaW5fcXVldWVzLT5pcV9waSA9IGN0cmxfaW5mby0+aW9tZW1fYmFzZSArCisJCVBRSV9ERVZJQ0VfUkVHSVNURVJTX09GRlNFVCArCisJCXJlYWRxKCZwcWlfcmVnaXN0ZXJzLT5hZG1pbl9pcV9waV9vZmZzZXQpOworCWFkbWluX3F1ZXVlcy0+b3FfY2kgPSBjdHJsX2luZm8tPmlvbWVtX2Jhc2UgKworCQlQUUlfREVWSUNFX1JFR0lTVEVSU19PRkZTRVQgKworCQlyZWFkcSgmcHFpX3JlZ2lzdGVycy0+YWRtaW5fb3FfY2lfb2Zmc2V0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcWlfc3VibWl0X2FkbWluX3JlcXVlc3Qoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgcHFpX2FkbWluX3F1ZXVlcyAqYWRtaW5fcXVldWVzOworCXZvaWQgKm5leHRfZWxlbWVudDsKKwlwcWlfaW5kZXhfdCBpcV9waTsKKworCWFkbWluX3F1ZXVlcyA9ICZjdHJsX2luZm8tPmFkbWluX3F1ZXVlczsKKwlpcV9waSA9IGFkbWluX3F1ZXVlcy0+aXFfcGlfY29weTsKKworCW5leHRfZWxlbWVudCA9IGFkbWluX3F1ZXVlcy0+aXFfZWxlbWVudF9hcnJheSArCisJCShpcV9waSAqIFBRSV9BRE1JTl9JUV9FTEVNRU5UX0xFTkdUSCk7CisKKwltZW1jcHkobmV4dF9lbGVtZW50LCByZXF1ZXN0LCBzaXplb2YoKnJlcXVlc3QpKTsKKworCWlxX3BpID0gKGlxX3BpICsgMSkgJSBQUUlfQURNSU5fSVFfTlVNX0VMRU1FTlRTOworCWFkbWluX3F1ZXVlcy0+aXFfcGlfY29weSA9IGlxX3BpOworCisJLyoKKwkgKiBUaGlzIHdyaXRlIG5vdGlmaWVzIHRoZSBjb250cm9sbGVyIHRoYXQgYW4gSVUgaXMgYXZhaWxhYmxlIHRvIGJlCisJICogcHJvY2Vzc2VkLgorCSAqLworCXdyaXRlbChpcV9waSwgYWRtaW5fcXVldWVzLT5pcV9waSk7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3BvbGxfZm9yX2FkbWluX3Jlc3BvbnNlKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3Jlc3BvbnNlICpyZXNwb25zZSkKK3sKKwlzdHJ1Y3QgcHFpX2FkbWluX3F1ZXVlcyAqYWRtaW5fcXVldWVzOworCXBxaV9pbmRleF90IG9xX3BpOworCXBxaV9pbmRleF90IG9xX2NpOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKworCWFkbWluX3F1ZXVlcyA9ICZjdHJsX2luZm8tPmFkbWluX3F1ZXVlczsKKwlvcV9jaSA9IGFkbWluX3F1ZXVlcy0+b3FfY2lfY29weTsKKworCXRpbWVvdXQgPSAoMyAqIEhaKSArIGppZmZpZXM7CisKKwl3aGlsZSAoMSkgeworCQlvcV9waSA9ICphZG1pbl9xdWV1ZXMtPm9xX3BpOworCQlpZiAob3FfcGkgIT0gb3FfY2kpCisJCQlicmVhazsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJCSJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgYWRtaW4gcmVzcG9uc2VcbiIpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0KKworCW1lbWNweShyZXNwb25zZSwgYWRtaW5fcXVldWVzLT5vcV9lbGVtZW50X2FycmF5ICsKKwkJKG9xX2NpICogUFFJX0FETUlOX09RX0VMRU1FTlRfTEVOR1RIKSwgc2l6ZW9mKCpyZXNwb25zZSkpOworCisJb3FfY2kgPSAob3FfY2kgKyAxKSAlIFBRSV9BRE1JTl9PUV9OVU1fRUxFTUVOVFM7CisJYWRtaW5fcXVldWVzLT5vcV9jaV9jb3B5ID0gb3FfY2k7CisJd3JpdGVsKG9xX2NpLCBhZG1pbl9xdWV1ZXMtPm9xX2NpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcWlfc3RhcnRfaW8oc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX3F1ZXVlX2dyb3VwICpxdWV1ZV9ncm91cCwgZW51bSBwcWlfaW9fcGF0aCBwYXRoLAorCXN0cnVjdCBwcWlfaW9fcmVxdWVzdCAqaW9fcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgcHFpX2lvX3JlcXVlc3QgKm5leHQ7CisJdm9pZCAqbmV4dF9lbGVtZW50OworCXBxaV9pbmRleF90IGlxX3BpOworCXBxaV9pbmRleF90IGlxX2NpOworCXNpemVfdCBpdV9sZW5ndGg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbnVtX2VsZW1lbnRzX25lZWRlZDsKKwl1bnNpZ25lZCBpbnQgbnVtX2VsZW1lbnRzX3RvX2VuZF9vZl9xdWV1ZTsKKwlzaXplX3QgY29weV9jb3VudDsKKwlzdHJ1Y3QgcHFpX2l1X2hlYWRlciAqcmVxdWVzdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZV9ncm91cC0+c3VibWl0X2xvY2tbcGF0aF0sIGZsYWdzKTsKKworCWlmIChpb19yZXF1ZXN0KQorCQlsaXN0X2FkZF90YWlsKCZpb19yZXF1ZXN0LT5yZXF1ZXN0X2xpc3RfZW50cnksCisJCQkmcXVldWVfZ3JvdXAtPnJlcXVlc3RfbGlzdFtwYXRoXSk7CisKKwlpcV9waSA9IHF1ZXVlX2dyb3VwLT5pcV9waV9jb3B5W3BhdGhdOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvX3JlcXVlc3QsIG5leHQsCisJCSZxdWV1ZV9ncm91cC0+cmVxdWVzdF9saXN0W3BhdGhdLCByZXF1ZXN0X2xpc3RfZW50cnkpIHsKKworCQlyZXF1ZXN0ID0gaW9fcmVxdWVzdC0+aXU7CisKKwkJaXVfbGVuZ3RoID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZyZXF1ZXN0LT5pdV9sZW5ndGgpICsKKwkJCVBRSV9SRVFVRVNUX0hFQURFUl9MRU5HVEg7CisJCW51bV9lbGVtZW50c19uZWVkZWQgPQorCQkJRElWX1JPVU5EX1VQKGl1X2xlbmd0aCwKKwkJCQlQUUlfT1BFUkFUSU9OQUxfSVFfRUxFTUVOVF9MRU5HVEgpOworCisJCWlxX2NpID0gKnF1ZXVlX2dyb3VwLT5pcV9jaVtwYXRoXTsKKworCQlpZiAobnVtX2VsZW1lbnRzX25lZWRlZCA+IHBxaV9udW1fZWxlbWVudHNfZnJlZShpcV9waSwgaXFfY2ksCisJCQljdHJsX2luZm8tPm51bV9lbGVtZW50c19wZXJfaXEpKQorCQkJYnJlYWs7CisKKwkJcHV0X3VuYWxpZ25lZF9sZTE2KHF1ZXVlX2dyb3VwLT5vcV9pZCwKKwkJCSZyZXF1ZXN0LT5yZXNwb25zZV9xdWV1ZV9pZCk7CisKKwkJbmV4dF9lbGVtZW50ID0gcXVldWVfZ3JvdXAtPmlxX2VsZW1lbnRfYXJyYXlbcGF0aF0gKworCQkJKGlxX3BpICogUFFJX09QRVJBVElPTkFMX0lRX0VMRU1FTlRfTEVOR1RIKTsKKworCQludW1fZWxlbWVudHNfdG9fZW5kX29mX3F1ZXVlID0KKwkJCWN0cmxfaW5mby0+bnVtX2VsZW1lbnRzX3Blcl9pcSAtIGlxX3BpOworCisJCWlmIChudW1fZWxlbWVudHNfbmVlZGVkIDw9IG51bV9lbGVtZW50c190b19lbmRfb2ZfcXVldWUpIHsKKwkJCW1lbWNweShuZXh0X2VsZW1lbnQsIHJlcXVlc3QsIGl1X2xlbmd0aCk7CisJCX0gZWxzZSB7CisJCQljb3B5X2NvdW50ID0gbnVtX2VsZW1lbnRzX3RvX2VuZF9vZl9xdWV1ZSAqCisJCQkJUFFJX09QRVJBVElPTkFMX0lRX0VMRU1FTlRfTEVOR1RIOworCQkJbWVtY3B5KG5leHRfZWxlbWVudCwgcmVxdWVzdCwgY29weV9jb3VudCk7CisJCQltZW1jcHkocXVldWVfZ3JvdXAtPmlxX2VsZW1lbnRfYXJyYXlbcGF0aF0sCisJCQkJKHU4ICopcmVxdWVzdCArIGNvcHlfY291bnQsCisJCQkJaXVfbGVuZ3RoIC0gY29weV9jb3VudCk7CisJCX0KKworCQlpcV9waSA9IChpcV9waSArIG51bV9lbGVtZW50c19uZWVkZWQpICUKKwkJCWN0cmxfaW5mby0+bnVtX2VsZW1lbnRzX3Blcl9pcTsKKworCQlsaXN0X2RlbCgmaW9fcmVxdWVzdC0+cmVxdWVzdF9saXN0X2VudHJ5KTsKKwl9CisKKwlpZiAoaXFfcGkgIT0gcXVldWVfZ3JvdXAtPmlxX3BpX2NvcHlbcGF0aF0pIHsKKwkJcXVldWVfZ3JvdXAtPmlxX3BpX2NvcHlbcGF0aF0gPSBpcV9waTsKKwkJLyoKKwkJICogVGhpcyB3cml0ZSBub3RpZmllcyB0aGUgY29udHJvbGxlciB0aGF0IG9uZSBvciBtb3JlIElVcyBhcmUKKwkJICogYXZhaWxhYmxlIHRvIGJlIHByb2Nlc3NlZC4KKwkJICovCisJCXdyaXRlbChpcV9waSwgcXVldWVfZ3JvdXAtPmlxX3BpW3BhdGhdKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZV9ncm91cC0+c3VibWl0X2xvY2tbcGF0aF0sIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcHFpX3JhaWRfc3luY2hyb25vdXNfY29tcGxldGUoc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0LAorCXZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmcgPSBjb250ZXh0OworCisJY29tcGxldGUod2FpdGluZyk7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3N1Ym1pdF9yYWlkX3JlcXVlc3Rfc3luY2hyb25vdXNfd2l0aF9pb19yZXF1ZXN0KAorCXN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sIHN0cnVjdCBwcWlfaW9fcmVxdWVzdCAqaW9fcmVxdWVzdCwKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXRfbXNlY3MpCit7CisJaW50IHJjID0gMDsKKwlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyh3YWl0KTsKKworCWlvX3JlcXVlc3QtPmlvX2NvbXBsZXRlX2NhbGxiYWNrID0gcHFpX3JhaWRfc3luY2hyb25vdXNfY29tcGxldGU7CisJaW9fcmVxdWVzdC0+Y29udGV4dCA9ICZ3YWl0OworCisJcHFpX3N0YXJ0X2lvKGN0cmxfaW5mbywKKwkJJmN0cmxfaW5mby0+cXVldWVfZ3JvdXBzW1BRSV9ERUZBVUxUX1FVRVVFX0dST1VQXSwgUkFJRF9QQVRILAorCQlpb19yZXF1ZXN0KTsKKworCWlmICh0aW1lb3V0X21zZWNzID09IE5PX1RJTUVPVVQpIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbl9pbygmd2FpdCk7CisJfSBlbHNlIHsKKwkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX2lvX3RpbWVvdXQoJndhaXQsCisJCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfbXNlY3MpKSkgeworCQkJZGV2X3dhcm4oJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJCSJjb21tYW5kIHRpbWVkIG91dFxuIik7CisJCQlyYyA9IC1FVElNRURPVVQ7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3N1Ym1pdF9yYWlkX3JlcXVlc3Rfc3luY2hyb25vdXMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX2l1X2hlYWRlciAqcmVxdWVzdCwgdW5zaWduZWQgaW50IGZsYWdzLAorCXN0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvICplcnJvcl9pbmZvLCB1bnNpZ25lZCBsb25nIHRpbWVvdXRfbXNlY3MpCit7CisJaW50IHJjOworCXN0cnVjdCBwcWlfaW9fcmVxdWVzdCAqaW9fcmVxdWVzdDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2ppZmZpZXM7CisJdW5zaWduZWQgbG9uZyBtc2Vjc19ibG9ja2VkOworCXNpemVfdCBpdV9sZW5ndGg7CisKKwkvKgorCSAqIE5vdGUgdGhhdCBzcGVjaWZ5aW5nIFBRSV9TWU5DX0ZMQUdTX0lOVEVSUlVQVEFCTEUgYW5kIGEgdGltZW91dCB2YWx1ZQorCSAqIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuCisJICovCisKKwlpZiAoZmxhZ3MgJiBQUUlfU1lOQ19GTEFHU19JTlRFUlJVUFRBQkxFKSB7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmN0cmxfaW5mby0+c3luY19yZXF1ZXN0X3NlbSkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0gZWxzZSB7CisJCWlmICh0aW1lb3V0X21zZWNzID09IE5PX1RJTUVPVVQpIHsKKwkJCWRvd24oJmN0cmxfaW5mby0+c3luY19yZXF1ZXN0X3NlbSk7CisJCX0gZWxzZSB7CisJCQlzdGFydF9qaWZmaWVzID0gamlmZmllczsKKwkJCWlmIChkb3duX3RpbWVvdXQoJmN0cmxfaW5mby0+c3luY19yZXF1ZXN0X3NlbSwKKwkJCQltc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfbXNlY3MpKSkKKwkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJCW1zZWNzX2Jsb2NrZWQgPQorCQkJCWppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0X2ppZmZpZXMpOworCQkJaWYgKG1zZWNzX2Jsb2NrZWQgPj0gdGltZW91dF9tc2VjcykKKwkJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJCXRpbWVvdXRfbXNlY3MgLT0gbXNlY3NfYmxvY2tlZDsKKwkJfQorCX0KKworCWlvX3JlcXVlc3QgPSBwcWlfYWxsb2NfaW9fcmVxdWVzdChjdHJsX2luZm8pOworCisJcHV0X3VuYWxpZ25lZF9sZTE2KGlvX3JlcXVlc3QtPmluZGV4LAorCQkmKCgoc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCAqKXJlcXVlc3QpLT5yZXF1ZXN0X2lkKSk7CisKKwlpZiAocmVxdWVzdC0+aXVfdHlwZSA9PSBQUUlfUkVRVUVTVF9JVV9SQUlEX1BBVEhfSU8pCisJCSgoc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCAqKXJlcXVlc3QpLT5lcnJvcl9pbmRleCA9CisJCQkoKHN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QgKilyZXF1ZXN0KS0+cmVxdWVzdF9pZDsKKworCWl1X2xlbmd0aCA9IGdldF91bmFsaWduZWRfbGUxNigmcmVxdWVzdC0+aXVfbGVuZ3RoKSArCisJCVBRSV9SRVFVRVNUX0hFQURFUl9MRU5HVEg7CisJbWVtY3B5KGlvX3JlcXVlc3QtPml1LCByZXF1ZXN0LCBpdV9sZW5ndGgpOworCisJcmMgPSBwcWlfc3VibWl0X3JhaWRfcmVxdWVzdF9zeW5jaHJvbm91c193aXRoX2lvX3JlcXVlc3QoY3RybF9pbmZvLAorCQlpb19yZXF1ZXN0LCB0aW1lb3V0X21zZWNzKTsKKworCWlmIChlcnJvcl9pbmZvKSB7CisJCWlmIChpb19yZXF1ZXN0LT5lcnJvcl9pbmZvKQorCQkJbWVtY3B5KGVycm9yX2luZm8sIGlvX3JlcXVlc3QtPmVycm9yX2luZm8sCisJCQkJc2l6ZW9mKCplcnJvcl9pbmZvKSk7CisJCWVsc2UKKwkJCW1lbXNldChlcnJvcl9pbmZvLCAwLCBzaXplb2YoKmVycm9yX2luZm8pKTsKKwl9IGVsc2UgaWYgKHJjID09IDAgJiYgaW9fcmVxdWVzdC0+ZXJyb3JfaW5mbykgeworCQl1OCBzY3NpX3N0YXR1czsKKwkJc3RydWN0IHBxaV9yYWlkX2Vycm9yX2luZm8gKnJhaWRfZXJyb3JfaW5mbzsKKworCQlyYWlkX2Vycm9yX2luZm8gPSBpb19yZXF1ZXN0LT5lcnJvcl9pbmZvOworCQlzY3NpX3N0YXR1cyA9IHJhaWRfZXJyb3JfaW5mby0+c3RhdHVzOworCisJCWlmIChzY3NpX3N0YXR1cyA9PSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04gJiYKKwkJCXJhaWRfZXJyb3JfaW5mby0+ZGF0YV9vdXRfcmVzdWx0ID09CisJCQlQUUlfREFUQV9JTl9PVVRfVU5ERVJGTE9XKQorCQkJc2NzaV9zdGF0dXMgPSBTQU1fU1RBVF9HT09EOworCisJCWlmIChzY3NpX3N0YXR1cyAhPSBTQU1fU1RBVF9HT09EKQorCQkJcmMgPSAtRUlPOworCX0KKworCXBxaV9mcmVlX2lvX3JlcXVlc3QoaW9fcmVxdWVzdCk7CisKKwl1cCgmY3RybF9pbmZvLT5zeW5jX3JlcXVlc3Rfc2VtKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwcWlfdmFsaWRhdGVfYWRtaW5fcmVzcG9uc2UoCisJc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3Jlc3BvbnNlICpyZXNwb25zZSwgdTggZXhwZWN0ZWRfZnVuY3Rpb25fY29kZSkKK3sKKwlpZiAocmVzcG9uc2UtPmhlYWRlci5pdV90eXBlICE9IFBRSV9SRVNQT05TRV9JVV9HRU5FUkFMX0FETUlOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnZXRfdW5hbGlnbmVkX2xlMTYoJnJlc3BvbnNlLT5oZWFkZXIuaXVfbGVuZ3RoKSAhPQorCQlQUUlfR0VORVJBTF9BRE1JTl9JVV9MRU5HVEgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJlc3BvbnNlLT5mdW5jdGlvbl9jb2RlICE9IGV4cGVjdGVkX2Z1bmN0aW9uX2NvZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJlc3BvbnNlLT5zdGF0dXMgIT0gUFFJX0dFTkVSQUxfQURNSU5fU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3N1Ym1pdF9hZG1pbl9yZXF1ZXN0X3N5bmNocm9ub3VzKAorCXN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3JlcXVlc3QgKnJlcXVlc3QsCisJc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3Jlc3BvbnNlICpyZXNwb25zZSkKK3sKKwlpbnQgcmM7CisKKwlwcWlfc3VibWl0X2FkbWluX3JlcXVlc3QoY3RybF9pbmZvLCByZXF1ZXN0KTsKKworCXJjID0gcHFpX3BvbGxfZm9yX2FkbWluX3Jlc3BvbnNlKGN0cmxfaW5mbywgcmVzcG9uc2UpOworCisJaWYgKHJjID09IDApCisJCXJjID0gcHFpX3ZhbGlkYXRlX2FkbWluX3Jlc3BvbnNlKHJlc3BvbnNlLAorCQkJcmVxdWVzdC0+ZnVuY3Rpb25fY29kZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3JlcG9ydF9kZXZpY2VfY2FwYWJpbGl0eShzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCWludCByYzsKKwlzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXNwb25zZSByZXNwb25zZTsKKwlzdHJ1Y3QgcHFpX2RldmljZV9jYXBhYmlsaXR5ICpjYXBhYmlsaXR5OworCXN0cnVjdCBwcWlfaXVfbGF5ZXJfZGVzY3JpcHRvciAqc29wX2l1X2xheWVyX2Rlc2NyaXB0b3I7CisKKwljYXBhYmlsaXR5ID0ga21hbGxvYyhzaXplb2YoKmNhcGFiaWxpdHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhcGFiaWxpdHkpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCisJcmVxdWVzdC5oZWFkZXIuaXVfdHlwZSA9IFBRSV9SRVFVRVNUX0lVX0dFTkVSQUxfQURNSU47CisJcHV0X3VuYWxpZ25lZF9sZTE2KFBRSV9HRU5FUkFMX0FETUlOX0lVX0xFTkdUSCwKKwkJJnJlcXVlc3QuaGVhZGVyLml1X2xlbmd0aCk7CisJcmVxdWVzdC5mdW5jdGlvbl9jb2RlID0KKwkJUFFJX0dFTkVSQUxfQURNSU5fRlVOQ1RJT05fUkVQT1JUX0RFVklDRV9DQVBBQklMSVRZOworCXB1dF91bmFsaWduZWRfbGUzMihzaXplb2YoKmNhcGFiaWxpdHkpLAorCQkmcmVxdWVzdC5kYXRhLnJlcG9ydF9kZXZpY2VfY2FwYWJpbGl0eS5idWZmZXJfbGVuZ3RoKTsKKworCXJjID0gcHFpX21hcF9zaW5nbGUoY3RybF9pbmZvLT5wY2lfZGV2LAorCQkmcmVxdWVzdC5kYXRhLnJlcG9ydF9kZXZpY2VfY2FwYWJpbGl0eS5zZ19kZXNjcmlwdG9yLAorCQljYXBhYmlsaXR5LCBzaXplb2YoKmNhcGFiaWxpdHkpLAorCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWlmIChyYykKKwkJZ290byBvdXQ7CisKKwlyYyA9IHBxaV9zdWJtaXRfYWRtaW5fcmVxdWVzdF9zeW5jaHJvbm91cyhjdHJsX2luZm8sICZyZXF1ZXN0LAorCQkmcmVzcG9uc2UpOworCisJcHFpX3BjaV91bm1hcChjdHJsX2luZm8tPnBjaV9kZXYsCisJCSZyZXF1ZXN0LmRhdGEucmVwb3J0X2RldmljZV9jYXBhYmlsaXR5LnNnX2Rlc2NyaXB0b3IsIDEsCisJCVBDSV9ETUFfRlJPTURFVklDRSk7CisKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJaWYgKHJlc3BvbnNlLnN0YXR1cyAhPSBQUUlfR0VORVJBTF9BRE1JTl9TVEFUVVNfU1VDQ0VTUykgeworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWN0cmxfaW5mby0+bWF4X2luYm91bmRfcXVldWVzID0KKwkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZjYXBhYmlsaXR5LT5tYXhfaW5ib3VuZF9xdWV1ZXMpOworCWN0cmxfaW5mby0+bWF4X2VsZW1lbnRzX3Blcl9pcSA9CisJCWdldF91bmFsaWduZWRfbGUxNigmY2FwYWJpbGl0eS0+bWF4X2VsZW1lbnRzX3Blcl9pcSk7CisJY3RybF9pbmZvLT5tYXhfaXFfZWxlbWVudF9sZW5ndGggPQorCQlnZXRfdW5hbGlnbmVkX2xlMTYoJmNhcGFiaWxpdHktPm1heF9pcV9lbGVtZW50X2xlbmd0aCkKKwkJKiAxNjsKKwljdHJsX2luZm8tPm1heF9vdXRib3VuZF9xdWV1ZXMgPQorCQlnZXRfdW5hbGlnbmVkX2xlMTYoJmNhcGFiaWxpdHktPm1heF9vdXRib3VuZF9xdWV1ZXMpOworCWN0cmxfaW5mby0+bWF4X2VsZW1lbnRzX3Blcl9vcSA9CisJCWdldF91bmFsaWduZWRfbGUxNigmY2FwYWJpbGl0eS0+bWF4X2VsZW1lbnRzX3Blcl9vcSk7CisJY3RybF9pbmZvLT5tYXhfb3FfZWxlbWVudF9sZW5ndGggPQorCQlnZXRfdW5hbGlnbmVkX2xlMTYoJmNhcGFiaWxpdHktPm1heF9vcV9lbGVtZW50X2xlbmd0aCkKKwkJKiAxNjsKKworCXNvcF9pdV9sYXllcl9kZXNjcmlwdG9yID0KKwkJJmNhcGFiaWxpdHktPml1X2xheWVyX2Rlc2NyaXB0b3JzW1BRSV9QUk9UT0NPTF9TT1BdOworCisJY3RybF9pbmZvLT5tYXhfaW5ib3VuZF9pdV9sZW5ndGhfcGVyX2Zpcm13YXJlID0KKwkJZ2V0X3VuYWxpZ25lZF9sZTE2KAorCQkJJnNvcF9pdV9sYXllcl9kZXNjcmlwdG9yLT5tYXhfaW5ib3VuZF9pdV9sZW5ndGgpOworCWN0cmxfaW5mby0+aW5ib3VuZF9zcGFubmluZ19zdXBwb3J0ZWQgPQorCQlzb3BfaXVfbGF5ZXJfZGVzY3JpcHRvci0+aW5ib3VuZF9zcGFubmluZ19zdXBwb3J0ZWQ7CisJY3RybF9pbmZvLT5vdXRib3VuZF9zcGFubmluZ19zdXBwb3J0ZWQgPQorCQlzb3BfaXVfbGF5ZXJfZGVzY3JpcHRvci0+b3V0Ym91bmRfc3Bhbm5pbmdfc3VwcG9ydGVkOworCitvdXQ6CisJa2ZyZWUoY2FwYWJpbGl0eSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3ZhbGlkYXRlX2RldmljZV9jYXBhYmlsaXR5KHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJaWYgKGN0cmxfaW5mby0+bWF4X2lxX2VsZW1lbnRfbGVuZ3RoIDwKKwkJUFFJX09QRVJBVElPTkFMX0lRX0VMRU1FTlRfTEVOR1RIKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJIm1heC4gaW5ib3VuZCBxdWV1ZSBlbGVtZW50IGxlbmd0aCBvZiAlZCBpcyBsZXNzIHRoYW4gdGhlIHJlcXVpcmVkIGxlbmd0aCBvZiAlZFxuIiwKKwkJCWN0cmxfaW5mby0+bWF4X2lxX2VsZW1lbnRfbGVuZ3RoLAorCQkJUFFJX09QRVJBVElPTkFMX0lRX0VMRU1FTlRfTEVOR1RIKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGN0cmxfaW5mby0+bWF4X29xX2VsZW1lbnRfbGVuZ3RoIDwKKwkJUFFJX09QRVJBVElPTkFMX09RX0VMRU1FTlRfTEVOR1RIKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJIm1heC4gb3V0Ym91bmQgcXVldWUgZWxlbWVudCBsZW5ndGggb2YgJWQgaXMgbGVzcyB0aGFuIHRoZSByZXF1aXJlZCBsZW5ndGggb2YgJWRcbiIsCisJCQljdHJsX2luZm8tPm1heF9vcV9lbGVtZW50X2xlbmd0aCwKKwkJCVBRSV9PUEVSQVRJT05BTF9PUV9FTEVNRU5UX0xFTkdUSCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjdHJsX2luZm8tPm1heF9pbmJvdW5kX2l1X2xlbmd0aF9wZXJfZmlybXdhcmUgPAorCQlQUUlfT1BFUkFUSU9OQUxfSVFfRUxFTUVOVF9MRU5HVEgpIHsKKwkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkibWF4LiBpbmJvdW5kIElVIGxlbmd0aCBvZiAldSBpcyBsZXNzIHRoYW4gdGhlIG1pbi4gcmVxdWlyZWQgbGVuZ3RoIG9mICVkXG4iLAorCQkJY3RybF9pbmZvLT5tYXhfaW5ib3VuZF9pdV9sZW5ndGhfcGVyX2Zpcm13YXJlLAorCQkJUFFJX09QRVJBVElPTkFMX0lRX0VMRU1FTlRfTEVOR1RIKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFjdHJsX2luZm8tPmluYm91bmRfc3Bhbm5pbmdfc3VwcG9ydGVkKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJInRoZSBjb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgaW5ib3VuZCBzcGFubmluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjdHJsX2luZm8tPm91dGJvdW5kX3NwYW5uaW5nX3N1cHBvcnRlZCkgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJ0aGUgY29udHJvbGxlciBzdXBwb3J0cyBvdXRib3VuZCBzcGFubmluZyBidXQgdGhpcyBkcml2ZXIgZG9lcyBub3RcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcWlfZGVsZXRlX29wZXJhdGlvbmFsX3F1ZXVlKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sCisJYm9vbCBpbmJvdW5kX3F1ZXVlLCB1MTYgcXVldWVfaWQpCit7CisJc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVzcG9uc2UgcmVzcG9uc2U7CisKKwltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisJcmVxdWVzdC5oZWFkZXIuaXVfdHlwZSA9IFBRSV9SRVFVRVNUX0lVX0dFTkVSQUxfQURNSU47CisJcHV0X3VuYWxpZ25lZF9sZTE2KFBRSV9HRU5FUkFMX0FETUlOX0lVX0xFTkdUSCwKKwkJJnJlcXVlc3QuaGVhZGVyLml1X2xlbmd0aCk7CisJaWYgKGluYm91bmRfcXVldWUpCisJCXJlcXVlc3QuZnVuY3Rpb25fY29kZSA9CisJCQlQUUlfR0VORVJBTF9BRE1JTl9GVU5DVElPTl9ERUxFVEVfSVE7CisJZWxzZQorCQlyZXF1ZXN0LmZ1bmN0aW9uX2NvZGUgPQorCQkJUFFJX0dFTkVSQUxfQURNSU5fRlVOQ1RJT05fREVMRVRFX09ROworCXB1dF91bmFsaWduZWRfbGUxNihxdWV1ZV9pZCwKKwkJJnJlcXVlc3QuZGF0YS5kZWxldGVfb3BlcmF0aW9uYWxfcXVldWUucXVldWVfaWQpOworCisJcmV0dXJuIHBxaV9zdWJtaXRfYWRtaW5fcmVxdWVzdF9zeW5jaHJvbm91cyhjdHJsX2luZm8sICZyZXF1ZXN0LAorCQkmcmVzcG9uc2UpOworfQorCitzdGF0aWMgaW50IHBxaV9jcmVhdGVfZXZlbnRfcXVldWUoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlpbnQgcmM7CisJc3RydWN0IHBxaV9ldmVudF9xdWV1ZSAqZXZlbnRfcXVldWU7CisJc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3JlcXVlc3QgcmVxdWVzdDsKKwlzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVzcG9uc2UgcmVzcG9uc2U7CisKKwlldmVudF9xdWV1ZSA9ICZjdHJsX2luZm8tPmV2ZW50X3F1ZXVlOworCisJLyoKKwkgKiBDcmVhdGUgT1EgKE91dGJvdW5kIFF1ZXVlIC0gZGV2aWNlIHRvIGhvc3QgcXVldWUpIHRvIGRlZGljYXRlCisJICogdG8gZXZlbnRzLgorCSAqLworCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKwlyZXF1ZXN0LmhlYWRlci5pdV90eXBlID0gUFFJX1JFUVVFU1RfSVVfR0VORVJBTF9BRE1JTjsKKwlwdXRfdW5hbGlnbmVkX2xlMTYoUFFJX0dFTkVSQUxfQURNSU5fSVVfTEVOR1RILAorCQkmcmVxdWVzdC5oZWFkZXIuaXVfbGVuZ3RoKTsKKwlyZXF1ZXN0LmZ1bmN0aW9uX2NvZGUgPSBQUUlfR0VORVJBTF9BRE1JTl9GVU5DVElPTl9DUkVBVEVfT1E7CisJcHV0X3VuYWxpZ25lZF9sZTE2KGV2ZW50X3F1ZXVlLT5vcV9pZCwKKwkJJnJlcXVlc3QuZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfb3EucXVldWVfaWQpOworCXB1dF91bmFsaWduZWRfbGU2NCgodTY0KWV2ZW50X3F1ZXVlLT5vcV9lbGVtZW50X2FycmF5X2J1c19hZGRyLAorCQkmcmVxdWVzdC5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9vcS5lbGVtZW50X2FycmF5X2FkZHIpOworCXB1dF91bmFsaWduZWRfbGU2NCgodTY0KWV2ZW50X3F1ZXVlLT5vcV9waV9idXNfYWRkciwKKwkJJnJlcXVlc3QuZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfb3EucGlfYWRkcik7CisJcHV0X3VuYWxpZ25lZF9sZTE2KFBRSV9OVU1fRVZFTlRfUVVFVUVfRUxFTUVOVFMsCisJCSZyZXF1ZXN0LmRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX29xLm51bV9lbGVtZW50cyk7CisJcHV0X3VuYWxpZ25lZF9sZTE2KFBRSV9FVkVOVF9PUV9FTEVNRU5UX0xFTkdUSCAvIDE2LAorCQkmcmVxdWVzdC5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9vcS5lbGVtZW50X2xlbmd0aCk7CisJcmVxdWVzdC5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9vcS5xdWV1ZV9wcm90b2NvbCA9IFBRSV9QUk9UT0NPTF9TT1A7CisJcHV0X3VuYWxpZ25lZF9sZTE2KGV2ZW50X3F1ZXVlLT5pbnRfbXNnX251bSwKKwkJJnJlcXVlc3QuZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfb3EuaW50X21zZ19udW0pOworCisJcmMgPSBwcWlfc3VibWl0X2FkbWluX3JlcXVlc3Rfc3luY2hyb25vdXMoY3RybF9pbmZvLCAmcmVxdWVzdCwKKwkJJnJlc3BvbnNlKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWV2ZW50X3F1ZXVlLT5vcV9jaSA9IGN0cmxfaW5mby0+aW9tZW1fYmFzZSArCisJCVBRSV9ERVZJQ0VfUkVHSVNURVJTX09GRlNFVCArCisJCWdldF91bmFsaWduZWRfbGU2NCgKKwkJCSZyZXNwb25zZS5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9vcS5vcV9jaV9vZmZzZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHFpX2NyZWF0ZV9xdWV1ZV9ncm91cChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKwlzdHJ1Y3QgcHFpX3F1ZXVlX2dyb3VwICpxdWV1ZV9ncm91cDsKKwlzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCByZXF1ZXN0OworCXN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXNwb25zZSByZXNwb25zZTsKKworCWkgPSBjdHJsX2luZm8tPm51bV9hY3RpdmVfcXVldWVfZ3JvdXBzOworCXF1ZXVlX2dyb3VwID0gJmN0cmxfaW5mby0+cXVldWVfZ3JvdXBzW2ldOworCisJLyoKKwkgKiBDcmVhdGUgSVEgKEluYm91bmQgUXVldWUgLSBob3N0IHRvIGRldmljZSBxdWV1ZSkgZm9yCisJICogUkFJRCBwYXRoLgorCSAqLworCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKwlyZXF1ZXN0LmhlYWRlci5pdV90eXBlID0gUFFJX1JFUVVFU1RfSVVfR0VORVJBTF9BRE1JTjsKKwlwdXRfdW5hbGlnbmVkX2xlMTYoUFFJX0dFTkVSQUxfQURNSU5fSVVfTEVOR1RILAorCQkmcmVxdWVzdC5oZWFkZXIuaXVfbGVuZ3RoKTsKKwlyZXF1ZXN0LmZ1bmN0aW9uX2NvZGUgPSBQUUlfR0VORVJBTF9BRE1JTl9GVU5DVElPTl9DUkVBVEVfSVE7CisJcHV0X3VuYWxpZ25lZF9sZTE2KHF1ZXVlX2dyb3VwLT5pcV9pZFtSQUlEX1BBVEhdLAorCQkmcmVxdWVzdC5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9pcS5xdWV1ZV9pZCk7CisJcHV0X3VuYWxpZ25lZF9sZTY0KAorCQkodTY0KXF1ZXVlX2dyb3VwLT5pcV9lbGVtZW50X2FycmF5X2J1c19hZGRyW1JBSURfUEFUSF0sCisJCSZyZXF1ZXN0LmRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX2lxLmVsZW1lbnRfYXJyYXlfYWRkcik7CisJcHV0X3VuYWxpZ25lZF9sZTY0KCh1NjQpcXVldWVfZ3JvdXAtPmlxX2NpX2J1c19hZGRyW1JBSURfUEFUSF0sCisJCSZyZXF1ZXN0LmRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX2lxLmNpX2FkZHIpOworCXB1dF91bmFsaWduZWRfbGUxNihjdHJsX2luZm8tPm51bV9lbGVtZW50c19wZXJfaXEsCisJCSZyZXF1ZXN0LmRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX2lxLm51bV9lbGVtZW50cyk7CisJcHV0X3VuYWxpZ25lZF9sZTE2KFBRSV9PUEVSQVRJT05BTF9JUV9FTEVNRU5UX0xFTkdUSCAvIDE2LAorCQkmcmVxdWVzdC5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9pcS5lbGVtZW50X2xlbmd0aCk7CisJcmVxdWVzdC5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9pcS5xdWV1ZV9wcm90b2NvbCA9IFBRSV9QUk9UT0NPTF9TT1A7CisKKwlyYyA9IHBxaV9zdWJtaXRfYWRtaW5fcmVxdWVzdF9zeW5jaHJvbm91cyhjdHJsX2luZm8sICZyZXF1ZXN0LAorCQkmcmVzcG9uc2UpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJlcnJvciBjcmVhdGluZyBpbmJvdW5kIFJBSUQgcXVldWVcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcXVldWVfZ3JvdXAtPmlxX3BpW1JBSURfUEFUSF0gPSBjdHJsX2luZm8tPmlvbWVtX2Jhc2UgKworCQlQUUlfREVWSUNFX1JFR0lTVEVSU19PRkZTRVQgKworCQlnZXRfdW5hbGlnbmVkX2xlNjQoCisJCQkmcmVzcG9uc2UuZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfaXEuaXFfcGlfb2Zmc2V0KTsKKworCS8qCisJICogQ3JlYXRlIElRIChJbmJvdW5kIFF1ZXVlIC0gaG9zdCB0byBkZXZpY2UgcXVldWUpIGZvcgorCSAqIEFkdmFuY2VkIEkvTyAoQUlPKSBwYXRoLgorCSAqLworCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKwlyZXF1ZXN0LmhlYWRlci5pdV90eXBlID0gUFFJX1JFUVVFU1RfSVVfR0VORVJBTF9BRE1JTjsKKwlwdXRfdW5hbGlnbmVkX2xlMTYoUFFJX0dFTkVSQUxfQURNSU5fSVVfTEVOR1RILAorCQkmcmVxdWVzdC5oZWFkZXIuaXVfbGVuZ3RoKTsKKwlyZXF1ZXN0LmZ1bmN0aW9uX2NvZGUgPSBQUUlfR0VORVJBTF9BRE1JTl9GVU5DVElPTl9DUkVBVEVfSVE7CisJcHV0X3VuYWxpZ25lZF9sZTE2KHF1ZXVlX2dyb3VwLT5pcV9pZFtBSU9fUEFUSF0sCisJCSZyZXF1ZXN0LmRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX2lxLnF1ZXVlX2lkKTsKKwlwdXRfdW5hbGlnbmVkX2xlNjQoKHU2NClxdWV1ZV9ncm91cC0+CisJCWlxX2VsZW1lbnRfYXJyYXlfYnVzX2FkZHJbQUlPX1BBVEhdLAorCQkmcmVxdWVzdC5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9pcS5lbGVtZW50X2FycmF5X2FkZHIpOworCXB1dF91bmFsaWduZWRfbGU2NCgodTY0KXF1ZXVlX2dyb3VwLT5pcV9jaV9idXNfYWRkcltBSU9fUEFUSF0sCisJCSZyZXF1ZXN0LmRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX2lxLmNpX2FkZHIpOworCXB1dF91bmFsaWduZWRfbGUxNihjdHJsX2luZm8tPm51bV9lbGVtZW50c19wZXJfaXEsCisJCSZyZXF1ZXN0LmRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX2lxLm51bV9lbGVtZW50cyk7CisJcHV0X3VuYWxpZ25lZF9sZTE2KFBRSV9PUEVSQVRJT05BTF9JUV9FTEVNRU5UX0xFTkdUSCAvIDE2LAorCQkmcmVxdWVzdC5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9pcS5lbGVtZW50X2xlbmd0aCk7CisJcmVxdWVzdC5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9pcS5xdWV1ZV9wcm90b2NvbCA9IFBRSV9QUk9UT0NPTF9TT1A7CisKKwlyYyA9IHBxaV9zdWJtaXRfYWRtaW5fcmVxdWVzdF9zeW5jaHJvbm91cyhjdHJsX2luZm8sICZyZXF1ZXN0LAorCQkmcmVzcG9uc2UpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJlcnJvciBjcmVhdGluZyBpbmJvdW5kIEFJTyBxdWV1ZVxuIik7CisJCWdvdG8gZGVsZXRlX2luYm91bmRfcXVldWVfcmFpZDsKKwl9CisKKwlxdWV1ZV9ncm91cC0+aXFfcGlbQUlPX1BBVEhdID0gY3RybF9pbmZvLT5pb21lbV9iYXNlICsKKwkJUFFJX0RFVklDRV9SRUdJU1RFUlNfT0ZGU0VUICsKKwkJZ2V0X3VuYWxpZ25lZF9sZTY0KAorCQkJJnJlc3BvbnNlLmRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX2lxLmlxX3BpX29mZnNldCk7CisKKwkvKgorCSAqIERlc2lnbmF0ZSB0aGUgMm5kIElRIGFzIHRoZSBBSU8gcGF0aC4gIEJ5IGRlZmF1bHQsIGFsbCBJUXMgYXJlCisJICogYXNzdW1lZCB0byBiZSBmb3IgUkFJRCBwYXRoIEkvTyB1bmxlc3Mgd2UgY2hhbmdlIHRoZSBxdWV1ZSdzCisJICogcHJvcGVydHkuCisJICovCisJbWVtc2V0KCZyZXF1ZXN0LCAwLCBzaXplb2YocmVxdWVzdCkpOworCXJlcXVlc3QuaGVhZGVyLml1X3R5cGUgPSBQUUlfUkVRVUVTVF9JVV9HRU5FUkFMX0FETUlOOworCXB1dF91bmFsaWduZWRfbGUxNihQUUlfR0VORVJBTF9BRE1JTl9JVV9MRU5HVEgsCisJCSZyZXF1ZXN0LmhlYWRlci5pdV9sZW5ndGgpOworCXJlcXVlc3QuZnVuY3Rpb25fY29kZSA9IFBRSV9HRU5FUkFMX0FETUlOX0ZVTkNUSU9OX0NIQU5HRV9JUV9QUk9QRVJUWTsKKwlwdXRfdW5hbGlnbmVkX2xlMTYocXVldWVfZ3JvdXAtPmlxX2lkW0FJT19QQVRIXSwKKwkJJnJlcXVlc3QuZGF0YS5jaGFuZ2Vfb3BlcmF0aW9uYWxfaXFfcHJvcGVydGllcy5xdWV1ZV9pZCk7CisJcHV0X3VuYWxpZ25lZF9sZTMyKFBRSV9JUV9QUk9QRVJUWV9JU19BSU9fUVVFVUUsCisJCSZyZXF1ZXN0LmRhdGEuY2hhbmdlX29wZXJhdGlvbmFsX2lxX3Byb3BlcnRpZXMudmVuZG9yX3NwZWNpZmljKTsKKworCXJjID0gcHFpX3N1Ym1pdF9hZG1pbl9yZXF1ZXN0X3N5bmNocm9ub3VzKGN0cmxfaW5mbywgJnJlcXVlc3QsCisJCSZyZXNwb25zZSk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJImVycm9yIGNoYW5naW5nIHF1ZXVlIHByb3BlcnR5XG4iKTsKKwkJZ290byBkZWxldGVfaW5ib3VuZF9xdWV1ZV9haW87CisJfQorCisJLyoKKwkgKiBDcmVhdGUgT1EgKE91dGJvdW5kIFF1ZXVlIC0gZGV2aWNlIHRvIGhvc3QgcXVldWUpLgorCSAqLworCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKwlyZXF1ZXN0LmhlYWRlci5pdV90eXBlID0gUFFJX1JFUVVFU1RfSVVfR0VORVJBTF9BRE1JTjsKKwlwdXRfdW5hbGlnbmVkX2xlMTYoUFFJX0dFTkVSQUxfQURNSU5fSVVfTEVOR1RILAorCQkmcmVxdWVzdC5oZWFkZXIuaXVfbGVuZ3RoKTsKKwlyZXF1ZXN0LmZ1bmN0aW9uX2NvZGUgPSBQUUlfR0VORVJBTF9BRE1JTl9GVU5DVElPTl9DUkVBVEVfT1E7CisJcHV0X3VuYWxpZ25lZF9sZTE2KHF1ZXVlX2dyb3VwLT5vcV9pZCwKKwkJJnJlcXVlc3QuZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfb3EucXVldWVfaWQpOworCXB1dF91bmFsaWduZWRfbGU2NCgodTY0KXF1ZXVlX2dyb3VwLT5vcV9lbGVtZW50X2FycmF5X2J1c19hZGRyLAorCQkmcmVxdWVzdC5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9vcS5lbGVtZW50X2FycmF5X2FkZHIpOworCXB1dF91bmFsaWduZWRfbGU2NCgodTY0KXF1ZXVlX2dyb3VwLT5vcV9waV9idXNfYWRkciwKKwkJJnJlcXVlc3QuZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfb3EucGlfYWRkcik7CisJcHV0X3VuYWxpZ25lZF9sZTE2KGN0cmxfaW5mby0+bnVtX2VsZW1lbnRzX3Blcl9vcSwKKwkJJnJlcXVlc3QuZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfb3EubnVtX2VsZW1lbnRzKTsKKwlwdXRfdW5hbGlnbmVkX2xlMTYoUFFJX09QRVJBVElPTkFMX09RX0VMRU1FTlRfTEVOR1RIIC8gMTYsCisJCSZyZXF1ZXN0LmRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX29xLmVsZW1lbnRfbGVuZ3RoKTsKKwlyZXF1ZXN0LmRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX29xLnF1ZXVlX3Byb3RvY29sID0gUFFJX1BST1RPQ09MX1NPUDsKKwlwdXRfdW5hbGlnbmVkX2xlMTYocXVldWVfZ3JvdXAtPmludF9tc2dfbnVtLAorCQkmcmVxdWVzdC5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9vcS5pbnRfbXNnX251bSk7CisKKwlyYyA9IHBxaV9zdWJtaXRfYWRtaW5fcmVxdWVzdF9zeW5jaHJvbm91cyhjdHJsX2luZm8sICZyZXF1ZXN0LAorCQkmcmVzcG9uc2UpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJlcnJvciBjcmVhdGluZyBvdXRib3VuZCBxdWV1ZVxuIik7CisJCWdvdG8gZGVsZXRlX2luYm91bmRfcXVldWVfYWlvOworCX0KKworCXF1ZXVlX2dyb3VwLT5vcV9jaSA9IGN0cmxfaW5mby0+aW9tZW1fYmFzZSArCisJCVBRSV9ERVZJQ0VfUkVHSVNURVJTX09GRlNFVCArCisJCWdldF91bmFsaWduZWRfbGU2NCgKKwkJCSZyZXNwb25zZS5kYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9vcS5vcV9jaV9vZmZzZXQpOworCisJY3RybF9pbmZvLT5udW1fYWN0aXZlX3F1ZXVlX2dyb3VwcysrOworCisJcmV0dXJuIDA7CisKK2RlbGV0ZV9pbmJvdW5kX3F1ZXVlX2FpbzoKKwlwcWlfZGVsZXRlX29wZXJhdGlvbmFsX3F1ZXVlKGN0cmxfaW5mbywgdHJ1ZSwKKwkJcXVldWVfZ3JvdXAtPmlxX2lkW0FJT19QQVRIXSk7CisKK2RlbGV0ZV9pbmJvdW5kX3F1ZXVlX3JhaWQ6CisJcHFpX2RlbGV0ZV9vcGVyYXRpb25hbF9xdWV1ZShjdHJsX2luZm8sIHRydWUsCisJCXF1ZXVlX2dyb3VwLT5pcV9pZFtSQUlEX1BBVEhdKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwcWlfY3JlYXRlX3F1ZXVlcyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCWludCByYzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXJjID0gcHFpX2NyZWF0ZV9ldmVudF9xdWV1ZShjdHJsX2luZm8pOworCWlmIChyYykgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJlcnJvciBjcmVhdGluZyBldmVudCBxdWV1ZVxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY3RybF9pbmZvLT5udW1fcXVldWVfZ3JvdXBzOyBpKyspIHsKKwkJcmMgPSBwcWlfY3JlYXRlX3F1ZXVlX2dyb3VwKGN0cmxfaW5mbyk7CisJCWlmIChyYykgeworCQkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkJImVycm9yIGNyZWF0aW5nIHF1ZXVlIGdyb3VwIG51bWJlciAldS8ldVxuIiwKKwkJCQlpLCBjdHJsX2luZm8tPm51bV9xdWV1ZV9ncm91cHMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgUFFJX1JFUE9SVF9FVkVOVF9DT05GSUdfQlVGRkVSX0xFTkdUSAlcCisJKG9mZnNldG9mKHN0cnVjdCBwcWlfZXZlbnRfY29uZmlnLCBkZXNjcmlwdG9ycykgKyBcCisJKFBRSV9NQVhfRVZFTlRfREVTQ1JJUFRPUlMgKiBzaXplb2Yoc3RydWN0IHBxaV9ldmVudF9kZXNjcmlwdG9yKSkpCisKK3N0YXRpYyBpbnQgcHFpX2NvbmZpZ3VyZV9ldmVudHMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHBxaV9ldmVudF9jb25maWcgKmV2ZW50X2NvbmZpZzsKKwlzdHJ1Y3QgcHFpX2dlbmVyYWxfbWFuYWdlbWVudF9yZXF1ZXN0IHJlcXVlc3Q7CisKKwlldmVudF9jb25maWcgPSBrbWFsbG9jKFBRSV9SRVBPUlRfRVZFTlRfQ09ORklHX0JVRkZFUl9MRU5HVEgsCisJCUdGUF9LRVJORUwpOworCWlmICghZXZlbnRfY29uZmlnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKworCXJlcXVlc3QuaGVhZGVyLml1X3R5cGUgPSBQUUlfUkVRVUVTVF9JVV9SRVBPUlRfVkVORE9SX0VWRU5UX0NPTkZJRzsKKwlwdXRfdW5hbGlnbmVkX2xlMTYob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX21hbmFnZW1lbnRfcmVxdWVzdCwKKwkJZGF0YS5yZXBvcnRfZXZlbnRfY29uZmlndXJhdGlvbi5zZ19kZXNjcmlwdG9yc1sxXSkgLQorCQlQUUlfUkVRVUVTVF9IRUFERVJfTEVOR1RILCAmcmVxdWVzdC5oZWFkZXIuaXVfbGVuZ3RoKTsKKwlwdXRfdW5hbGlnbmVkX2xlMzIoUFFJX1JFUE9SVF9FVkVOVF9DT05GSUdfQlVGRkVSX0xFTkdUSCwKKwkJJnJlcXVlc3QuZGF0YS5yZXBvcnRfZXZlbnRfY29uZmlndXJhdGlvbi5idWZmZXJfbGVuZ3RoKTsKKworCXJjID0gcHFpX21hcF9zaW5nbGUoY3RybF9pbmZvLT5wY2lfZGV2LAorCQlyZXF1ZXN0LmRhdGEucmVwb3J0X2V2ZW50X2NvbmZpZ3VyYXRpb24uc2dfZGVzY3JpcHRvcnMsCisJCWV2ZW50X2NvbmZpZywgUFFJX1JFUE9SVF9FVkVOVF9DT05GSUdfQlVGRkVSX0xFTkdUSCwKKwkJUENJX0RNQV9GUk9NREVWSUNFKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJcmMgPSBwcWlfc3VibWl0X3JhaWRfcmVxdWVzdF9zeW5jaHJvbm91cyhjdHJsX2luZm8sICZyZXF1ZXN0LmhlYWRlciwKKwkJMCwgTlVMTCwgTk9fVElNRU9VVCk7CisKKwlwcWlfcGNpX3VubWFwKGN0cmxfaW5mby0+cGNpX2RldiwKKwkJcmVxdWVzdC5kYXRhLnJlcG9ydF9ldmVudF9jb25maWd1cmF0aW9uLnNnX2Rlc2NyaXB0b3JzLCAxLAorCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCWZvciAoaSA9IDA7IGkgPCBldmVudF9jb25maWctPm51bV9ldmVudF9kZXNjcmlwdG9yczsgaSsrKQorCQlwdXRfdW5hbGlnbmVkX2xlMTYoY3RybF9pbmZvLT5ldmVudF9xdWV1ZS5vcV9pZCwKKwkJCSZldmVudF9jb25maWctPmRlc2NyaXB0b3JzW2ldLm9xX2lkKTsKKworCW1lbXNldCgmcmVxdWVzdCwgMCwgc2l6ZW9mKHJlcXVlc3QpKTsKKworCXJlcXVlc3QuaGVhZGVyLml1X3R5cGUgPSBQUUlfUkVRVUVTVF9JVV9TRVRfVkVORE9SX0VWRU5UX0NPTkZJRzsKKwlwdXRfdW5hbGlnbmVkX2xlMTYob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX21hbmFnZW1lbnRfcmVxdWVzdCwKKwkJZGF0YS5yZXBvcnRfZXZlbnRfY29uZmlndXJhdGlvbi5zZ19kZXNjcmlwdG9yc1sxXSkgLQorCQlQUUlfUkVRVUVTVF9IRUFERVJfTEVOR1RILCAmcmVxdWVzdC5oZWFkZXIuaXVfbGVuZ3RoKTsKKwlwdXRfdW5hbGlnbmVkX2xlMzIoUFFJX1JFUE9SVF9FVkVOVF9DT05GSUdfQlVGRkVSX0xFTkdUSCwKKwkJJnJlcXVlc3QuZGF0YS5yZXBvcnRfZXZlbnRfY29uZmlndXJhdGlvbi5idWZmZXJfbGVuZ3RoKTsKKworCXJjID0gcHFpX21hcF9zaW5nbGUoY3RybF9pbmZvLT5wY2lfZGV2LAorCQlyZXF1ZXN0LmRhdGEucmVwb3J0X2V2ZW50X2NvbmZpZ3VyYXRpb24uc2dfZGVzY3JpcHRvcnMsCisJCWV2ZW50X2NvbmZpZywgUFFJX1JFUE9SVF9FVkVOVF9DT05GSUdfQlVGRkVSX0xFTkdUSCwKKwkJUENJX0RNQV9UT0RFVklDRSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCXJjID0gcHFpX3N1Ym1pdF9yYWlkX3JlcXVlc3Rfc3luY2hyb25vdXMoY3RybF9pbmZvLCAmcmVxdWVzdC5oZWFkZXIsIDAsCisJCU5VTEwsIE5PX1RJTUVPVVQpOworCisJcHFpX3BjaV91bm1hcChjdHJsX2luZm8tPnBjaV9kZXYsCisJCXJlcXVlc3QuZGF0YS5yZXBvcnRfZXZlbnRfY29uZmlndXJhdGlvbi5zZ19kZXNjcmlwdG9ycywgMSwKKwkJUENJX0RNQV9UT0RFVklDRSk7CisKK291dDoKKwlrZnJlZShldmVudF9jb25maWcpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBwcWlfZnJlZV9hbGxfaW9fcmVxdWVzdHMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc2l6ZV90IHNnX2NoYWluX2J1ZmZlcl9sZW5ndGg7CisJc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0OworCisJaWYgKCFjdHJsX2luZm8tPmlvX3JlcXVlc3RfcG9vbCkKKwkJcmV0dXJuOworCisJZGV2ID0gJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2OworCXNnX2NoYWluX2J1ZmZlcl9sZW5ndGggPSBjdHJsX2luZm8tPnNnX2NoYWluX2J1ZmZlcl9sZW5ndGg7CisJaW9fcmVxdWVzdCA9IGN0cmxfaW5mby0+aW9fcmVxdWVzdF9wb29sOworCisJZm9yIChpID0gMDsgaSA8IGN0cmxfaW5mby0+bWF4X2lvX3Nsb3RzOyBpKyspIHsKKwkJa2ZyZWUoaW9fcmVxdWVzdC0+aXUpOworCQlpZiAoIWlvX3JlcXVlc3QtPnNnX2NoYWluX2J1ZmZlcikKKwkJCWJyZWFrOworCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIHNnX2NoYWluX2J1ZmZlcl9sZW5ndGgsCisJCQlpb19yZXF1ZXN0LT5zZ19jaGFpbl9idWZmZXIsCisJCQlpb19yZXF1ZXN0LT5zZ19jaGFpbl9idWZmZXJfZG1hX2hhbmRsZSk7CisJCWlvX3JlcXVlc3QrKzsKKwl9CisKKwlrZnJlZShjdHJsX2luZm8tPmlvX3JlcXVlc3RfcG9vbCk7CisJY3RybF9pbmZvLT5pb19yZXF1ZXN0X3Bvb2wgPSBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcWlfYWxsb2NfZXJyb3JfYnVmZmVyKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJY3RybF9pbmZvLT5lcnJvcl9idWZmZXIgPSBkbWFfemFsbG9jX2NvaGVyZW50KCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJY3RybF9pbmZvLT5lcnJvcl9idWZmZXJfbGVuZ3RoLAorCQkmY3RybF9pbmZvLT5lcnJvcl9idWZmZXJfZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWN0cmxfaW5mby0+ZXJyb3JfYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBxaV9hbGxvY19pb19yZXNvdXJjZXMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl2b2lkICpzZ19jaGFpbl9idWZmZXI7CisJc2l6ZV90IHNnX2NoYWluX2J1ZmZlcl9sZW5ndGg7CisJZG1hX2FkZHJfdCBzZ19jaGFpbl9idWZmZXJfZG1hX2hhbmRsZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0OworCisJY3RybF9pbmZvLT5pb19yZXF1ZXN0X3Bvb2wgPSBremFsbG9jKGN0cmxfaW5mby0+bWF4X2lvX3Nsb3RzICoKKwkJc2l6ZW9mKGN0cmxfaW5mby0+aW9fcmVxdWVzdF9wb29sWzBdKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWN0cmxfaW5mby0+aW9fcmVxdWVzdF9wb29sKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBJL08gcmVxdWVzdCBwb29sXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYgPSAmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXY7CisJc2dfY2hhaW5fYnVmZmVyX2xlbmd0aCA9IGN0cmxfaW5mby0+c2dfY2hhaW5fYnVmZmVyX2xlbmd0aDsKKwlpb19yZXF1ZXN0ID0gY3RybF9pbmZvLT5pb19yZXF1ZXN0X3Bvb2w7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3RybF9pbmZvLT5tYXhfaW9fc2xvdHM7IGkrKykgeworCQlpb19yZXF1ZXN0LT5pdSA9CisJCQlrbWFsbG9jKGN0cmxfaW5mby0+bWF4X2luYm91bmRfaXVfbGVuZ3RoLCBHRlBfS0VSTkVMKTsKKworCQlpZiAoIWlvX3JlcXVlc3QtPml1KSB7CisJCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCQkiZmFpbGVkIHRvIGFsbG9jYXRlIElVIGJ1ZmZlcnNcbiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXNnX2NoYWluX2J1ZmZlciA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsCisJCQlzZ19jaGFpbl9idWZmZXJfbGVuZ3RoLCAmc2dfY2hhaW5fYnVmZmVyX2RtYV9oYW5kbGUsCisJCQlHRlBfS0VSTkVMKTsKKworCQlpZiAoIXNnX2NoYWluX2J1ZmZlcikgeworCQkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBQUUkgc2NhdHRlci1nYXRoZXIgY2hhaW4gYnVmZmVyc1xuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJaW9fcmVxdWVzdC0+aW5kZXggPSBpOworCQlpb19yZXF1ZXN0LT5zZ19jaGFpbl9idWZmZXIgPSBzZ19jaGFpbl9idWZmZXI7CisJCWlvX3JlcXVlc3QtPnNnX2NoYWluX2J1ZmZlcl9kbWFfaGFuZGxlID0KKwkJCXNnX2NoYWluX2J1ZmZlcl9kbWFfaGFuZGxlOworCQlpb19yZXF1ZXN0Kys7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXBxaV9mcmVlX2FsbF9pb19yZXF1ZXN0cyhjdHJsX2luZm8pOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgcmVxdWlyZWQgcmVzb3VyY2VzIHRoYXQgYXJlIHNpemVkIGJhc2VkIG9uIG1heC4gb3V0c3RhbmRpbmcKKyAqIHJlcXVlc3RzIGFuZCBtYXguIHRyYW5zZmVyIHNpemUuCisgKi8KKworc3RhdGljIHZvaWQgcHFpX2NhbGN1bGF0ZV9pb19yZXNvdXJjZXMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwl1MzIgbWF4X3RyYW5zZmVyX3NpemU7CisJdTMyIG1heF9zZ19lbnRyaWVzOworCisJY3RybF9pbmZvLT5zY3NpX21sX2Nhbl9xdWV1ZSA9CisJCWN0cmxfaW5mby0+bWF4X291dHN0YW5kaW5nX3JlcXVlc3RzIC0gUFFJX1JFU0VSVkVEX0lPX1NMT1RTOworCWN0cmxfaW5mby0+bWF4X2lvX3Nsb3RzID0gY3RybF9pbmZvLT5tYXhfb3V0c3RhbmRpbmdfcmVxdWVzdHM7CisKKwljdHJsX2luZm8tPmVycm9yX2J1ZmZlcl9sZW5ndGggPQorCQljdHJsX2luZm8tPm1heF9pb19zbG90cyAqIFBRSV9FUlJPUl9CVUZGRVJfRUxFTUVOVF9MRU5HVEg7CisKKwltYXhfdHJhbnNmZXJfc2l6ZSA9CisJCW1pbihjdHJsX2luZm8tPm1heF90cmFuc2Zlcl9zaXplLCBQUUlfTUFYX1RSQU5TRkVSX1NJWkUpOworCisJbWF4X3NnX2VudHJpZXMgPSBtYXhfdHJhbnNmZXJfc2l6ZSAvIFBBR0VfU0laRTsKKworCS8qICsxIHRvIGNvdmVyIHdoZW4gdGhlIGJ1ZmZlciBpcyBub3QgcGFnZS1hbGlnbmVkLiAqLworCW1heF9zZ19lbnRyaWVzKys7CisKKwltYXhfc2dfZW50cmllcyA9IG1pbihjdHJsX2luZm8tPm1heF9zZ19lbnRyaWVzLCBtYXhfc2dfZW50cmllcyk7CisKKwltYXhfdHJhbnNmZXJfc2l6ZSA9IChtYXhfc2dfZW50cmllcyAtIDEpICogUEFHRV9TSVpFOworCisJY3RybF9pbmZvLT5zZ19jaGFpbl9idWZmZXJfbGVuZ3RoID0KKwkJbWF4X3NnX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IHBxaV9zZ19kZXNjcmlwdG9yKTsKKwljdHJsX2luZm8tPnNnX3RhYmxlc2l6ZSA9IG1heF9zZ19lbnRyaWVzOworCWN0cmxfaW5mby0+bWF4X3NlY3RvcnMgPSBtYXhfdHJhbnNmZXJfc2l6ZSAvIDUxMjsKK30KKworc3RhdGljIHZvaWQgcHFpX2NhbGN1bGF0ZV9xdWV1ZV9yZXNvdXJjZXMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlpbnQgbnVtX2NwdXM7CisJaW50IG1heF9xdWV1ZV9ncm91cHM7CisJaW50IG51bV9xdWV1ZV9ncm91cHM7CisJdTE2IG51bV9lbGVtZW50c19wZXJfaXE7CisJdTE2IG51bV9lbGVtZW50c19wZXJfb3E7CisKKwltYXhfcXVldWVfZ3JvdXBzID0gbWluKGN0cmxfaW5mby0+bWF4X2luYm91bmRfcXVldWVzIC8gMiwKKwkJY3RybF9pbmZvLT5tYXhfb3V0Ym91bmRfcXVldWVzIC0gMSk7CisJbWF4X3F1ZXVlX2dyb3VwcyA9IG1pbihtYXhfcXVldWVfZ3JvdXBzLCBQUUlfTUFYX1FVRVVFX0dST1VQUyk7CisKKwludW1fY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpOworCW51bV9xdWV1ZV9ncm91cHMgPSBtaW4obnVtX2NwdXMsIGN0cmxfaW5mby0+bWF4X21zaXhfdmVjdG9ycyk7CisJbnVtX3F1ZXVlX2dyb3VwcyA9IG1pbihudW1fcXVldWVfZ3JvdXBzLCBtYXhfcXVldWVfZ3JvdXBzKTsKKworCWN0cmxfaW5mby0+bnVtX3F1ZXVlX2dyb3VwcyA9IG51bV9xdWV1ZV9ncm91cHM7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBtYXguIGluYm91bmQgSVUgbGVuZ3RoIGlzIGFuIGV2ZW4gbXVsdGlwbGUKKwkgKiBvZiBvdXIgaW5ib3VuZCBlbGVtZW50IGxlbmd0aC4KKwkgKi8KKwljdHJsX2luZm8tPm1heF9pbmJvdW5kX2l1X2xlbmd0aCA9CisJCShjdHJsX2luZm8tPm1heF9pbmJvdW5kX2l1X2xlbmd0aF9wZXJfZmlybXdhcmUgLworCQlQUUlfT1BFUkFUSU9OQUxfSVFfRUxFTUVOVF9MRU5HVEgpICoKKwkJUFFJX09QRVJBVElPTkFMX0lRX0VMRU1FTlRfTEVOR1RIOworCisJbnVtX2VsZW1lbnRzX3Blcl9pcSA9CisJCShjdHJsX2luZm8tPm1heF9pbmJvdW5kX2l1X2xlbmd0aCAvCisJCVBRSV9PUEVSQVRJT05BTF9JUV9FTEVNRU5UX0xFTkdUSCk7CisKKwkvKiBBZGQgb25lIGJlY2F1c2Ugb25lIGVsZW1lbnQgaW4gZWFjaCBxdWV1ZSBpcyB1bnVzYWJsZS4gKi8KKwludW1fZWxlbWVudHNfcGVyX2lxKys7CisKKwludW1fZWxlbWVudHNfcGVyX2lxID0gbWluKG51bV9lbGVtZW50c19wZXJfaXEsCisJCWN0cmxfaW5mby0+bWF4X2VsZW1lbnRzX3Blcl9pcSk7CisKKwludW1fZWxlbWVudHNfcGVyX29xID0gKChudW1fZWxlbWVudHNfcGVyX2lxIC0gMSkgKiAyKSArIDE7CisJbnVtX2VsZW1lbnRzX3Blcl9vcSA9IG1pbihudW1fZWxlbWVudHNfcGVyX29xLAorCQljdHJsX2luZm8tPm1heF9lbGVtZW50c19wZXJfb3EpOworCisJY3RybF9pbmZvLT5udW1fZWxlbWVudHNfcGVyX2lxID0gbnVtX2VsZW1lbnRzX3Blcl9pcTsKKwljdHJsX2luZm8tPm51bV9lbGVtZW50c19wZXJfb3EgPSBudW1fZWxlbWVudHNfcGVyX29xOworCisJY3RybF9pbmZvLT5tYXhfc2dfcGVyX2l1ID0KKwkJKChjdHJsX2luZm8tPm1heF9pbmJvdW5kX2l1X2xlbmd0aCAtCisJCVBRSV9PUEVSQVRJT05BTF9JUV9FTEVNRU5UX0xFTkdUSCkgLworCQlzaXplb2Yoc3RydWN0IHBxaV9zZ19kZXNjcmlwdG9yKSkgKworCQlQUUlfTUFYX0VNQkVEREVEX1NHX0RFU0NSSVBUT1JTOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHFpX3NldF9zZ19kZXNjcmlwdG9yKAorCXN0cnVjdCBwcWlfc2dfZGVzY3JpcHRvciAqc2dfZGVzY3JpcHRvciwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwl1NjQgYWRkcmVzcyA9ICh1NjQpc2dfZG1hX2FkZHJlc3Moc2cpOworCXVuc2lnbmVkIGludCBsZW5ndGggPSBzZ19kbWFfbGVuKHNnKTsKKworCXB1dF91bmFsaWduZWRfbGU2NChhZGRyZXNzLCAmc2dfZGVzY3JpcHRvci0+YWRkcmVzcyk7CisJcHV0X3VuYWxpZ25lZF9sZTMyKGxlbmd0aCwgJnNnX2Rlc2NyaXB0b3ItPmxlbmd0aCk7CisJcHV0X3VuYWxpZ25lZF9sZTMyKDAsICZzZ19kZXNjcmlwdG9yLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcHFpX2J1aWxkX3JhaWRfc2dfbGlzdChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QgKnJlcXVlc3QsIHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsCisJc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0KQoreworCWludCBpOworCXUxNiBpdV9sZW5ndGg7CisJaW50IHNnX2NvdW50OworCWJvb2wgY2hhaW5lZDsKKwl1bnNpZ25lZCBpbnQgbnVtX3NnX2luX2l1OworCXVuc2lnbmVkIGludCBtYXhfc2dfcGVyX2l1OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IHBxaV9zZ19kZXNjcmlwdG9yICpzZ19kZXNjcmlwdG9yOworCisJc2dfY291bnQgPSBzY3NpX2RtYV9tYXAoc2NtZCk7CisJaWYgKHNnX2NvdW50IDwgMCkKKwkJcmV0dXJuIHNnX2NvdW50OworCisJaXVfbGVuZ3RoID0gb2Zmc2V0b2Yoc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCwgc2dfZGVzY3JpcHRvcnMpIC0KKwkJUFFJX1JFUVVFU1RfSEVBREVSX0xFTkdUSDsKKworCWlmIChzZ19jb3VudCA9PSAwKQorCQlnb3RvIG91dDsKKworCXNnID0gc2NzaV9zZ2xpc3Qoc2NtZCk7CisJc2dfZGVzY3JpcHRvciA9IHJlcXVlc3QtPnNnX2Rlc2NyaXB0b3JzOworCW1heF9zZ19wZXJfaXUgPSBjdHJsX2luZm8tPm1heF9zZ19wZXJfaXUgLSAxOworCWNoYWluZWQgPSBmYWxzZTsKKwludW1fc2dfaW5faXUgPSAwOworCWkgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJcHFpX3NldF9zZ19kZXNjcmlwdG9yKHNnX2Rlc2NyaXB0b3IsIHNnKTsKKwkJaWYgKCFjaGFpbmVkKQorCQkJbnVtX3NnX2luX2l1Kys7CisJCWkrKzsKKwkJaWYgKGkgPT0gc2dfY291bnQpCisJCQlicmVhazsKKwkJc2dfZGVzY3JpcHRvcisrOworCQlpZiAoaSA9PSBtYXhfc2dfcGVyX2l1KSB7CisJCQlwdXRfdW5hbGlnbmVkX2xlNjQoCisJCQkJKHU2NClpb19yZXF1ZXN0LT5zZ19jaGFpbl9idWZmZXJfZG1hX2hhbmRsZSwKKwkJCQkmc2dfZGVzY3JpcHRvci0+YWRkcmVzcyk7CisJCQlwdXRfdW5hbGlnbmVkX2xlMzIoKHNnX2NvdW50IC0gbnVtX3NnX2luX2l1KQorCQkJCSogc2l6ZW9mKCpzZ19kZXNjcmlwdG9yKSwKKwkJCQkmc2dfZGVzY3JpcHRvci0+bGVuZ3RoKTsKKwkJCXB1dF91bmFsaWduZWRfbGUzMihDSVNTX1NHX0NIQUlOLAorCQkJCSZzZ19kZXNjcmlwdG9yLT5mbGFncyk7CisJCQljaGFpbmVkID0gdHJ1ZTsKKwkJCW51bV9zZ19pbl9pdSsrOworCQkJc2dfZGVzY3JpcHRvciA9IGlvX3JlcXVlc3QtPnNnX2NoYWluX2J1ZmZlcjsKKwkJfQorCQlzZyA9IHNnX25leHQoc2cpOworCX0KKworCXB1dF91bmFsaWduZWRfbGUzMihDSVNTX1NHX0xBU1QsICZzZ19kZXNjcmlwdG9yLT5mbGFncyk7CisJcmVxdWVzdC0+cGFydGlhbCA9IGNoYWluZWQ7CisJaXVfbGVuZ3RoICs9IG51bV9zZ19pbl9pdSAqIHNpemVvZigqc2dfZGVzY3JpcHRvcik7CisKK291dDoKKwlwdXRfdW5hbGlnbmVkX2xlMTYoaXVfbGVuZ3RoLCAmcmVxdWVzdC0+aGVhZGVyLml1X2xlbmd0aCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcWlfYnVpbGRfYWlvX3NnX2xpc3Qoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX2Fpb19wYXRoX3JlcXVlc3QgKnJlcXVlc3QsIHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsCisJc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0KQoreworCWludCBpOworCXUxNiBpdV9sZW5ndGg7CisJaW50IHNnX2NvdW50OworCWJvb2wgY2hhaW5lZDsKKwl1bnNpZ25lZCBpbnQgbnVtX3NnX2luX2l1OworCXVuc2lnbmVkIGludCBtYXhfc2dfcGVyX2l1OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IHBxaV9zZ19kZXNjcmlwdG9yICpzZ19kZXNjcmlwdG9yOworCisJc2dfY291bnQgPSBzY3NpX2RtYV9tYXAoc2NtZCk7CisJaWYgKHNnX2NvdW50IDwgMCkKKwkJcmV0dXJuIHNnX2NvdW50OworCisJaXVfbGVuZ3RoID0gb2Zmc2V0b2Yoc3RydWN0IHBxaV9haW9fcGF0aF9yZXF1ZXN0LCBzZ19kZXNjcmlwdG9ycykgLQorCQlQUUlfUkVRVUVTVF9IRUFERVJfTEVOR1RIOworCW51bV9zZ19pbl9pdSA9IDA7CisKKwlpZiAoc2dfY291bnQgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlzZyA9IHNjc2lfc2dsaXN0KHNjbWQpOworCXNnX2Rlc2NyaXB0b3IgPSByZXF1ZXN0LT5zZ19kZXNjcmlwdG9yczsKKwltYXhfc2dfcGVyX2l1ID0gY3RybF9pbmZvLT5tYXhfc2dfcGVyX2l1IC0gMTsKKwljaGFpbmVkID0gZmFsc2U7CisJaSA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlwcWlfc2V0X3NnX2Rlc2NyaXB0b3Ioc2dfZGVzY3JpcHRvciwgc2cpOworCQlpZiAoIWNoYWluZWQpCisJCQludW1fc2dfaW5faXUrKzsKKwkJaSsrOworCQlpZiAoaSA9PSBzZ19jb3VudCkKKwkJCWJyZWFrOworCQlzZ19kZXNjcmlwdG9yKys7CisJCWlmIChpID09IG1heF9zZ19wZXJfaXUpIHsKKwkJCXB1dF91bmFsaWduZWRfbGU2NCgKKwkJCQkodTY0KWlvX3JlcXVlc3QtPnNnX2NoYWluX2J1ZmZlcl9kbWFfaGFuZGxlLAorCQkJCSZzZ19kZXNjcmlwdG9yLT5hZGRyZXNzKTsKKwkJCXB1dF91bmFsaWduZWRfbGUzMigoc2dfY291bnQgLSBudW1fc2dfaW5faXUpCisJCQkJKiBzaXplb2YoKnNnX2Rlc2NyaXB0b3IpLAorCQkJCSZzZ19kZXNjcmlwdG9yLT5sZW5ndGgpOworCQkJcHV0X3VuYWxpZ25lZF9sZTMyKENJU1NfU0dfQ0hBSU4sCisJCQkJJnNnX2Rlc2NyaXB0b3ItPmZsYWdzKTsKKwkJCWNoYWluZWQgPSB0cnVlOworCQkJbnVtX3NnX2luX2l1Kys7CisJCQlzZ19kZXNjcmlwdG9yID0gaW9fcmVxdWVzdC0+c2dfY2hhaW5fYnVmZmVyOworCQl9CisJCXNnID0gc2dfbmV4dChzZyk7CisJfQorCisJcHV0X3VuYWxpZ25lZF9sZTMyKENJU1NfU0dfTEFTVCwgJnNnX2Rlc2NyaXB0b3ItPmZsYWdzKTsKKwlyZXF1ZXN0LT5wYXJ0aWFsID0gY2hhaW5lZDsKKwlpdV9sZW5ndGggKz0gbnVtX3NnX2luX2l1ICogc2l6ZW9mKCpzZ19kZXNjcmlwdG9yKTsKKworb3V0OgorCXB1dF91bmFsaWduZWRfbGUxNihpdV9sZW5ndGgsICZyZXF1ZXN0LT5oZWFkZXIuaXVfbGVuZ3RoKTsKKwlyZXF1ZXN0LT5udW1fc2dfZGVzY3JpcHRvcnMgPSBudW1fc2dfaW5faXU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHFpX3JhaWRfaW9fY29tcGxldGUoc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0LAorCXZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHNjc2lfY21uZCAqc2NtZDsKKworCXNjbWQgPSBpb19yZXF1ZXN0LT5zY21kOworCXBxaV9mcmVlX2lvX3JlcXVlc3QoaW9fcmVxdWVzdCk7CisJc2NzaV9kbWFfdW5tYXAoc2NtZCk7CisJcHFpX3Njc2lfZG9uZShzY21kKTsKK30KKworc3RhdGljIGludCBwcWlfcmFpZF9zdWJtaXRfc2NzaV9jbWQoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UsIHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsCisJc3RydWN0IHBxaV9xdWV1ZV9ncm91cCAqcXVldWVfZ3JvdXApCit7CisJaW50IHJjOworCXNpemVfdCBjZGJfbGVuZ3RoOworCXN0cnVjdCBwcWlfaW9fcmVxdWVzdCAqaW9fcmVxdWVzdDsKKwlzdHJ1Y3QgcHFpX3JhaWRfcGF0aF9yZXF1ZXN0ICpyZXF1ZXN0OworCisJaW9fcmVxdWVzdCA9IHBxaV9hbGxvY19pb19yZXF1ZXN0KGN0cmxfaW5mbyk7CisJaW9fcmVxdWVzdC0+aW9fY29tcGxldGVfY2FsbGJhY2sgPSBwcWlfcmFpZF9pb19jb21wbGV0ZTsKKwlpb19yZXF1ZXN0LT5zY21kID0gc2NtZDsKKworCXNjbWQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKWlvX3JlcXVlc3Q7CisKKwlyZXF1ZXN0ID0gaW9fcmVxdWVzdC0+aXU7CisJbWVtc2V0KHJlcXVlc3QsIDAsCisJCW9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QsIHNnX2Rlc2NyaXB0b3JzKSk7CisKKwlyZXF1ZXN0LT5oZWFkZXIuaXVfdHlwZSA9IFBRSV9SRVFVRVNUX0lVX1JBSURfUEFUSF9JTzsKKwlwdXRfdW5hbGlnbmVkX2xlMzIoc2NzaV9idWZmbGVuKHNjbWQpLCAmcmVxdWVzdC0+YnVmZmVyX2xlbmd0aCk7CisJcmVxdWVzdC0+dGFza19hdHRyaWJ1dGUgPSBTT1BfVEFTS19BVFRSSUJVVEVfU0lNUExFOworCXB1dF91bmFsaWduZWRfbGUxNihpb19yZXF1ZXN0LT5pbmRleCwgJnJlcXVlc3QtPnJlcXVlc3RfaWQpOworCXJlcXVlc3QtPmVycm9yX2luZGV4ID0gcmVxdWVzdC0+cmVxdWVzdF9pZDsKKwltZW1jcHkocmVxdWVzdC0+bHVuX251bWJlciwgZGV2aWNlLT5zY3NpM2FkZHIsCisJCXNpemVvZihyZXF1ZXN0LT5sdW5fbnVtYmVyKSk7CisKKwljZGJfbGVuZ3RoID0gbWluX3Qoc2l6ZV90LCBzY21kLT5jbWRfbGVuLCBzaXplb2YocmVxdWVzdC0+Y2RiKSk7CisJbWVtY3B5KHJlcXVlc3QtPmNkYiwgc2NtZC0+Y21uZCwgY2RiX2xlbmd0aCk7CisKKwlzd2l0Y2ggKGNkYl9sZW5ndGgpIHsKKwljYXNlIDY6CisJY2FzZSAxMDoKKwljYXNlIDEyOgorCWNhc2UgMTY6CisJCS8qIE5vIGJ5dGVzIGluIHRoZSBBZGRpdGlvbmFsIENEQiBieXRlcyBmaWVsZCAqLworCQlyZXF1ZXN0LT5hZGRpdGlvbmFsX2NkYl9ieXRlc191c2FnZSA9CisJCQlTT1BfQURESVRJT05BTF9DREJfQllURVNfMDsKKwkJYnJlYWs7CisJY2FzZSAyMDoKKwkJLyogNCBieXRlcyBpbiB0aGUgQWRkaXRpb25hbCBjZGIgZmllbGQgKi8KKwkJcmVxdWVzdC0+YWRkaXRpb25hbF9jZGJfYnl0ZXNfdXNhZ2UgPQorCQkJU09QX0FERElUSU9OQUxfQ0RCX0JZVEVTXzQ7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCS8qIDggYnl0ZXMgaW4gdGhlIEFkZGl0aW9uYWwgY2RiIGZpZWxkICovCisJCXJlcXVlc3QtPmFkZGl0aW9uYWxfY2RiX2J5dGVzX3VzYWdlID0KKwkJCVNPUF9BRERJVElPTkFMX0NEQl9CWVRFU184OworCQlicmVhazsKKwljYXNlIDI4OgorCQkvKiAxMiBieXRlcyBpbiB0aGUgQWRkaXRpb25hbCBjZGIgZmllbGQgKi8KKwkJcmVxdWVzdC0+YWRkaXRpb25hbF9jZGJfYnl0ZXNfdXNhZ2UgPQorCQkJU09QX0FERElUSU9OQUxfQ0RCX0JZVEVTXzEyOworCQlicmVhazsKKwljYXNlIDMyOgorCWRlZmF1bHQ6CisJCS8qIDE2IGJ5dGVzIGluIHRoZSBBZGRpdGlvbmFsIGNkYiBmaWVsZCAqLworCQlyZXF1ZXN0LT5hZGRpdGlvbmFsX2NkYl9ieXRlc191c2FnZSA9CisJCQlTT1BfQURESVRJT05BTF9DREJfQllURVNfMTY7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24pIHsKKwljYXNlIERNQV9UT19ERVZJQ0U6CisJCXJlcXVlc3QtPmRhdGFfZGlyZWN0aW9uID0gU09QX1JFQURfRkxBRzsKKwkJYnJlYWs7CisJY2FzZSBETUFfRlJPTV9ERVZJQ0U6CisJCXJlcXVlc3QtPmRhdGFfZGlyZWN0aW9uID0gU09QX1dSSVRFX0ZMQUc7CisJCWJyZWFrOworCWNhc2UgRE1BX05PTkU6CisJCXJlcXVlc3QtPmRhdGFfZGlyZWN0aW9uID0gU09QX05PX0RJUkVDVElPTl9GTEFHOworCQlicmVhazsKKwljYXNlIERNQV9CSURJUkVDVElPTkFMOgorCQlyZXF1ZXN0LT5kYXRhX2RpcmVjdGlvbiA9IFNPUF9CSURJUkVDVElPTkFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJ1bmtub3duIGRhdGEgZGlyZWN0aW9uOiAlZFxuIiwKKwkJCXNjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwkJV0FSTl9PTihzY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCWJyZWFrOworCX0KKworCXJjID0gcHFpX2J1aWxkX3JhaWRfc2dfbGlzdChjdHJsX2luZm8sIHJlcXVlc3QsIHNjbWQsIGlvX3JlcXVlc3QpOworCWlmIChyYykgeworCQlwcWlfZnJlZV9pb19yZXF1ZXN0KGlvX3JlcXVlc3QpOworCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwl9CisKKwlwcWlfc3RhcnRfaW8oY3RybF9pbmZvLCBxdWV1ZV9ncm91cCwgUkFJRF9QQVRILCBpb19yZXF1ZXN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcWlfYWlvX2lvX2NvbXBsZXRlKHN0cnVjdCBwcWlfaW9fcmVxdWVzdCAqaW9fcmVxdWVzdCwKKwl2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQ7CisKKwlzY21kID0gaW9fcmVxdWVzdC0+c2NtZDsKKwlzY3NpX2RtYV91bm1hcChzY21kKTsKKwlpZiAoaW9fcmVxdWVzdC0+c3RhdHVzID09IC1FQUdBSU4pCisJCXNldF9ob3N0X2J5dGUoc2NtZCwgRElEX0lNTV9SRVRSWSk7CisJcHFpX2ZyZWVfaW9fcmVxdWVzdChpb19yZXF1ZXN0KTsKKwlwcWlfc2NzaV9kb25lKHNjbWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcWlfYWlvX3N1Ym1pdF9zY3NpX2NtZChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZSwgc3RydWN0IHNjc2lfY21uZCAqc2NtZCwKKwlzdHJ1Y3QgcHFpX3F1ZXVlX2dyb3VwICpxdWV1ZV9ncm91cCkKK3sKKwlyZXR1cm4gcHFpX2Fpb19zdWJtaXRfaW8oY3RybF9pbmZvLCBzY21kLCBkZXZpY2UtPmFpb19oYW5kbGUsCisJCXNjbWQtPmNtbmQsIHNjbWQtPmNtZF9sZW4sIHF1ZXVlX2dyb3VwLCBOVUxMKTsKK30KKworc3RhdGljIGludCBwcWlfYWlvX3N1Ym1pdF9pbyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQsIHUzMiBhaW9faGFuZGxlLCB1OCAqY2RiLAorCXVuc2lnbmVkIGludCBjZGJfbGVuZ3RoLCBzdHJ1Y3QgcHFpX3F1ZXVlX2dyb3VwICpxdWV1ZV9ncm91cCwKKwlzdHJ1Y3QgcHFpX2VuY3J5cHRpb25faW5mbyAqZW5jcnlwdGlvbl9pbmZvKQoreworCWludCByYzsKKwlzdHJ1Y3QgcHFpX2lvX3JlcXVlc3QgKmlvX3JlcXVlc3Q7CisJc3RydWN0IHBxaV9haW9fcGF0aF9yZXF1ZXN0ICpyZXF1ZXN0OworCisJaW9fcmVxdWVzdCA9IHBxaV9hbGxvY19pb19yZXF1ZXN0KGN0cmxfaW5mbyk7CisJaW9fcmVxdWVzdC0+aW9fY29tcGxldGVfY2FsbGJhY2sgPSBwcWlfYWlvX2lvX2NvbXBsZXRlOworCWlvX3JlcXVlc3QtPnNjbWQgPSBzY21kOworCisJc2NtZC0+aG9zdF9zY3JpYmJsZSA9ICh1bnNpZ25lZCBjaGFyICopaW9fcmVxdWVzdDsKKworCXJlcXVlc3QgPSBpb19yZXF1ZXN0LT5pdTsKKwltZW1zZXQocmVxdWVzdCwgMCwKKwkJb2Zmc2V0b2Yoc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCwgc2dfZGVzY3JpcHRvcnMpKTsKKworCXJlcXVlc3QtPmhlYWRlci5pdV90eXBlID0gUFFJX1JFUVVFU1RfSVVfQUlPX1BBVEhfSU87CisJcHV0X3VuYWxpZ25lZF9sZTMyKGFpb19oYW5kbGUsICZyZXF1ZXN0LT5uZXh1c19pZCk7CisJcHV0X3VuYWxpZ25lZF9sZTMyKHNjc2lfYnVmZmxlbihzY21kKSwgJnJlcXVlc3QtPmJ1ZmZlcl9sZW5ndGgpOworCXJlcXVlc3QtPnRhc2tfYXR0cmlidXRlID0gU09QX1RBU0tfQVRUUklCVVRFX1NJTVBMRTsKKwlwdXRfdW5hbGlnbmVkX2xlMTYoaW9fcmVxdWVzdC0+aW5kZXgsICZyZXF1ZXN0LT5yZXF1ZXN0X2lkKTsKKwlyZXF1ZXN0LT5lcnJvcl9pbmRleCA9IHJlcXVlc3QtPnJlcXVlc3RfaWQ7CisJaWYgKGNkYl9sZW5ndGggPiBzaXplb2YocmVxdWVzdC0+Y2RiKSkKKwkJY2RiX2xlbmd0aCA9IHNpemVvZihyZXF1ZXN0LT5jZGIpOworCXJlcXVlc3QtPmNkYl9sZW5ndGggPSBjZGJfbGVuZ3RoOworCW1lbWNweShyZXF1ZXN0LT5jZGIsIGNkYiwgY2RiX2xlbmd0aCk7CisKKwlzd2l0Y2ggKHNjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKSB7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQlyZXF1ZXN0LT5kYXRhX2RpcmVjdGlvbiA9IFNPUF9SRUFEX0ZMQUc7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQlyZXF1ZXN0LT5kYXRhX2RpcmVjdGlvbiA9IFNPUF9XUklURV9GTEFHOworCQlicmVhazsKKwljYXNlIERNQV9OT05FOgorCQlyZXF1ZXN0LT5kYXRhX2RpcmVjdGlvbiA9IFNPUF9OT19ESVJFQ1RJT05fRkxBRzsKKwkJYnJlYWs7CisJY2FzZSBETUFfQklESVJFQ1RJT05BTDoKKwkJcmVxdWVzdC0+ZGF0YV9kaXJlY3Rpb24gPSBTT1BfQklESVJFQ1RJT05BTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkidW5rbm93biBkYXRhIGRpcmVjdGlvbjogJWRcbiIsCisJCQlzY21kLT5zY19kYXRhX2RpcmVjdGlvbik7CisJCVdBUk5fT04oc2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQlicmVhazsKKwl9CisKKwlpZiAoZW5jcnlwdGlvbl9pbmZvKSB7CisJCXJlcXVlc3QtPmVuY3J5cHRpb25fZW5hYmxlID0gdHJ1ZTsKKwkJcHV0X3VuYWxpZ25lZF9sZTE2KGVuY3J5cHRpb25faW5mby0+ZGF0YV9lbmNyeXB0aW9uX2tleV9pbmRleCwKKwkJCSZyZXF1ZXN0LT5kYXRhX2VuY3J5cHRpb25fa2V5X2luZGV4KTsKKwkJcHV0X3VuYWxpZ25lZF9sZTMyKGVuY3J5cHRpb25faW5mby0+ZW5jcnlwdF90d2Vha19sb3dlciwKKwkJCSZyZXF1ZXN0LT5lbmNyeXB0X3R3ZWFrX2xvd2VyKTsKKwkJcHV0X3VuYWxpZ25lZF9sZTMyKGVuY3J5cHRpb25faW5mby0+ZW5jcnlwdF90d2Vha191cHBlciwKKwkJCSZyZXF1ZXN0LT5lbmNyeXB0X3R3ZWFrX3VwcGVyKTsKKwl9CisKKwlyYyA9IHBxaV9idWlsZF9haW9fc2dfbGlzdChjdHJsX2luZm8sIHJlcXVlc3QsIHNjbWQsIGlvX3JlcXVlc3QpOworCWlmIChyYykgeworCQlwcWlfZnJlZV9pb19yZXF1ZXN0KGlvX3JlcXVlc3QpOworCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKwl9CisKKwlwcWlfc3RhcnRfaW8oY3RybF9pbmZvLCBxdWV1ZV9ncm91cCwgQUlPX1BBVEgsIGlvX3JlcXVlc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3Njc2lfcXVldWVfY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQoreworCWludCByYzsKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvOworCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZTsKKwl1MTYgaHdxOworCXN0cnVjdCBwcWlfcXVldWVfZ3JvdXAgKnF1ZXVlX2dyb3VwOworCWJvb2wgcmFpZF9ieXBhc3NlZDsKKworCWRldmljZSA9IHNjbWQtPmRldmljZS0+aG9zdGRhdGE7CisJY3RybF9pbmZvID0gc2hvc3RfdG9faGJhKHNob3N0KTsKKworCWlmIChwcWlfY3RybF9vZmZsaW5lKGN0cmxfaW5mbykpIHsKKwkJc2V0X2hvc3RfYnl0ZShzY21kLCBESURfTk9fQ09OTkVDVCk7CisJCXBxaV9zY3NpX2RvbmUoc2NtZCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgU01MIGRvZXNuJ3QgemVybyBvdXQgdGhpcyBmaWVsZCBkdXJpbmcKKwkgKiBlcnJvciByZWNvdmVyeS4KKwkgKi8KKwlzY21kLT5yZXN1bHQgPSAwOworCisJaHdxID0gYmxrX21xX3VuaXF1ZV90YWdfdG9faHdxKGJsa19tcV91bmlxdWVfdGFnKHNjbWQtPnJlcXVlc3QpKTsKKwlpZiAoaHdxID49IGN0cmxfaW5mby0+bnVtX3F1ZXVlX2dyb3VwcykKKwkJaHdxID0gMDsKKworCXF1ZXVlX2dyb3VwID0gJmN0cmxfaW5mby0+cXVldWVfZ3JvdXBzW2h3cV07CisKKwlpZiAocHFpX2lzX2xvZ2ljYWxfZGV2aWNlKGRldmljZSkpIHsKKwkJcmFpZF9ieXBhc3NlZCA9IGZhbHNlOworCQlpZiAoZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWQgJiYKKwkJCXNjbWQtPnJlcXVlc3QtPmNtZF90eXBlID09IFJFUV9UWVBFX0ZTKSB7CisJCQlyYyA9IHBxaV9yYWlkX2J5cGFzc19zdWJtaXRfc2NzaV9jbWQoY3RybF9pbmZvLCBkZXZpY2UsCisJCQkJc2NtZCwgcXVldWVfZ3JvdXApOworCQkJaWYgKHJjID09IDAgfHwKKwkJCQlyYyA9PSBTQ1NJX01MUVVFVUVfSE9TVF9CVVNZIHx8CisJCQkJcmMgPT0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OIHx8CisJCQkJcmMgPT0gU0FNX1NUQVRfUkVTRVJWQVRJT05fQ09ORkxJQ1QpCisJCQkJcmFpZF9ieXBhc3NlZCA9IHRydWU7CisJCX0KKwkJaWYgKCFyYWlkX2J5cGFzc2VkKQorCQkJcmMgPSBwcWlfcmFpZF9zdWJtaXRfc2NzaV9jbWQoY3RybF9pbmZvLCBkZXZpY2UsIHNjbWQsCisJCQkJcXVldWVfZ3JvdXApOworCX0gZWxzZSB7CisJCWlmIChkZXZpY2UtPmFpb19lbmFibGVkKQorCQkJcmMgPSBwcWlfYWlvX3N1Ym1pdF9zY3NpX2NtZChjdHJsX2luZm8sIGRldmljZSwgc2NtZCwKKwkJCQlxdWV1ZV9ncm91cCk7CisJCWVsc2UKKwkJCXJjID0gcHFpX3JhaWRfc3VibWl0X3Njc2lfY21kKGN0cmxfaW5mbywgZGV2aWNlLCBzY21kLAorCQkJCXF1ZXVlX2dyb3VwKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHBxaV9sdW5fcmVzZXRfY29tcGxldGUoc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0LAorCXZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmcgPSBjb250ZXh0OworCisJY29tcGxldGUod2FpdGluZyk7Cit9CisKKyNkZWZpbmUgUFFJX0xVTl9SRVNFVF9USU1FT1VUX1NFQ1MJMTAKKworc3RhdGljIGludCBwcWlfd2FpdF9mb3JfbHVuX3Jlc2V0X2NvbXBsZXRpb24oc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UsIHN0cnVjdCBjb21wbGV0aW9uICp3YWl0KQoreworCWludCByYzsKKwl1bnNpZ25lZCBpbnQgd2FpdF9zZWNzID0gMDsKKworCXdoaWxlICgxKSB7CisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2lvX3RpbWVvdXQod2FpdCwKKwkJCVBRSV9MVU5fUkVTRVRfVElNRU9VVF9TRUNTICogSFopKSB7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXBxaV9jaGVja19jdHJsX2hlYWx0aChjdHJsX2luZm8pOworCQlpZiAocHFpX2N0cmxfb2ZmbGluZShjdHJsX2luZm8pKSB7CisJCQlyYyA9IC1FVElNRURPVVQ7CisJCQlicmVhazsKKwkJfQorCisJCXdhaXRfc2VjcyArPSBQUUlfTFVOX1JFU0VUX1RJTUVPVVRfU0VDUzsKKworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJyZXNldHRpbmcgc2NzaSAlZDolZDolZDolZCAtIHdhaXRpbmcgJXUgc2Vjb25kc1xuIiwKKwkJCWN0cmxfaW5mby0+c2NzaV9ob3N0LT5ob3N0X25vLCBkZXZpY2UtPmJ1cywKKwkJCWRldmljZS0+dGFyZ2V0LCBkZXZpY2UtPmx1biwgd2FpdF9zZWNzKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcHFpX2x1bl9yZXNldChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZSkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHBxaV9pb19yZXF1ZXN0ICppb19yZXF1ZXN0OworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKHdhaXQpOworCXN0cnVjdCBwcWlfdGFza19tYW5hZ2VtZW50X3JlcXVlc3QgKnJlcXVlc3Q7CisKKwlkb3duKCZjdHJsX2luZm8tPmx1bl9yZXNldF9zZW0pOworCisJaW9fcmVxdWVzdCA9IHBxaV9hbGxvY19pb19yZXF1ZXN0KGN0cmxfaW5mbyk7CisJaW9fcmVxdWVzdC0+aW9fY29tcGxldGVfY2FsbGJhY2sgPSBwcWlfbHVuX3Jlc2V0X2NvbXBsZXRlOworCWlvX3JlcXVlc3QtPmNvbnRleHQgPSAmd2FpdDsKKworCXJlcXVlc3QgPSBpb19yZXF1ZXN0LT5pdTsKKwltZW1zZXQocmVxdWVzdCwgMCwgc2l6ZW9mKCpyZXF1ZXN0KSk7CisKKwlyZXF1ZXN0LT5oZWFkZXIuaXVfdHlwZSA9IFBRSV9SRVFVRVNUX0lVX1RBU0tfTUFOQUdFTUVOVDsKKwlwdXRfdW5hbGlnbmVkX2xlMTYoc2l6ZW9mKCpyZXF1ZXN0KSAtIFBRSV9SRVFVRVNUX0hFQURFUl9MRU5HVEgsCisJCSZyZXF1ZXN0LT5oZWFkZXIuaXVfbGVuZ3RoKTsKKwlwdXRfdW5hbGlnbmVkX2xlMTYoaW9fcmVxdWVzdC0+aW5kZXgsICZyZXF1ZXN0LT5yZXF1ZXN0X2lkKTsKKwltZW1jcHkocmVxdWVzdC0+bHVuX251bWJlciwgZGV2aWNlLT5zY3NpM2FkZHIsCisJCXNpemVvZihyZXF1ZXN0LT5sdW5fbnVtYmVyKSk7CisJcmVxdWVzdC0+dGFza19tYW5hZ2VtZW50X2Z1bmN0aW9uID0gU09QX1RBU0tfTUFOQUdFTUVOVF9MVU5fUkVTRVQ7CisKKwlwcWlfc3RhcnRfaW8oY3RybF9pbmZvLAorCQkmY3RybF9pbmZvLT5xdWV1ZV9ncm91cHNbUFFJX0RFRkFVTFRfUVVFVUVfR1JPVVBdLCBSQUlEX1BBVEgsCisJCWlvX3JlcXVlc3QpOworCisJcmMgPSBwcWlfd2FpdF9mb3JfbHVuX3Jlc2V0X2NvbXBsZXRpb24oY3RybF9pbmZvLCBkZXZpY2UsICZ3YWl0KTsKKwlpZiAocmMgPT0gMCkKKwkJcmMgPSBpb19yZXF1ZXN0LT5zdGF0dXM7CisKKwlwcWlfZnJlZV9pb19yZXF1ZXN0KGlvX3JlcXVlc3QpOworCXVwKCZjdHJsX2luZm8tPmx1bl9yZXNldF9zZW0pOworCisJcmV0dXJuIHJjOworfQorCisvKiBQZXJmb3JtcyBhIHJlc2V0IGF0IHRoZSBMVU4gbGV2ZWwuICovCisKK3N0YXRpYyBpbnQgcHFpX2RldmljZV9yZXNldChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXN0cnVjdCBwcWlfc2NzaV9kZXYgKmRldmljZSkKK3sKKwlpbnQgcmM7CisKKwlwcWlfY2hlY2tfY3RybF9oZWFsdGgoY3RybF9pbmZvKTsKKwlpZiAocHFpX2N0cmxfb2ZmbGluZShjdHJsX2luZm8pKQorCQlyZXR1cm4gRkFJTEVEOworCisJcmMgPSBwcWlfbHVuX3Jlc2V0KGN0cmxfaW5mbywgZGV2aWNlKTsKKworCXJldHVybiByYyA9PSAwID8gU1VDQ0VTUyA6IEZBSUxFRDsKK30KKworc3RhdGljIGludCBwcWlfZWhfZGV2aWNlX3Jlc2V0X2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbzsKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2U7CisKKwljdHJsX2luZm8gPSBzaG9zdF90b19oYmEoc2NtZC0+ZGV2aWNlLT5ob3N0KTsKKwlkZXZpY2UgPSBzY21kLT5kZXZpY2UtPmhvc3RkYXRhOworCisJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCSJyZXNldHRpbmcgc2NzaSAlZDolZDolZDolZFxuIiwKKwkJY3RybF9pbmZvLT5zY3NpX2hvc3QtPmhvc3Rfbm8sCisJCWRldmljZS0+YnVzLCBkZXZpY2UtPnRhcmdldCwgZGV2aWNlLT5sdW4pOworCisJcmMgPSBwcWlfZGV2aWNlX3Jlc2V0KGN0cmxfaW5mbywgZGV2aWNlKTsKKworCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkicmVzZXQgb2Ygc2NzaSAlZDolZDolZDolZDogJXNcbiIsCisJCWN0cmxfaW5mby0+c2NzaV9ob3N0LT5ob3N0X25vLAorCQlkZXZpY2UtPmJ1cywgZGV2aWNlLT50YXJnZXQsIGRldmljZS0+bHVuLAorCQlyYyA9PSBTVUNDRVNTID8gIlNVQ0NFU1MiIDogIkZBSUxFRCIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBxaV9zbGF2ZV9hbGxvYyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCit7CisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbzsKKwlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQ7CisJc3RydWN0IHNhc19ycGh5ICpycGh5OworCisJY3RybF9pbmZvID0gc2hvc3RfdG9faGJhKHNkZXYtPmhvc3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN0cmxfaW5mby0+c2NzaV9kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoc2Rldl9jaGFubmVsKHNkZXYpID09IFBRSV9QSFlTSUNBTF9ERVZJQ0VfQlVTKSB7CisJCXN0YXJnZXQgPSBzY3NpX3RhcmdldChzZGV2KTsKKwkJcnBoeSA9IHRhcmdldF90b19ycGh5KHN0YXJnZXQpOworCQlkZXZpY2UgPSBwcWlfZmluZF9kZXZpY2VfYnlfc2FzX3JwaHkoY3RybF9pbmZvLCBycGh5KTsKKwkJaWYgKGRldmljZSkgeworCQkJZGV2aWNlLT50YXJnZXQgPSBzZGV2X2lkKHNkZXYpOworCQkJZGV2aWNlLT5sdW4gPSBzZGV2LT5sdW47CisJCQlkZXZpY2UtPnRhcmdldF9sdW5fdmFsaWQgPSB0cnVlOworCQl9CisJfSBlbHNlIHsKKwkJZGV2aWNlID0gcHFpX2ZpbmRfc2NzaV9kZXYoY3RybF9pbmZvLCBzZGV2X2NoYW5uZWwoc2RldiksCisJCQlzZGV2X2lkKHNkZXYpLCBzZGV2LT5sdW4pOworCX0KKworCWlmIChkZXZpY2UgJiYgZGV2aWNlLT5leHBvc2VfZGV2aWNlKSB7CisJCXNkZXYtPmhvc3RkYXRhID0gZGV2aWNlOworCQlkZXZpY2UtPnNkZXYgPSBzZGV2OworCQlpZiAoZGV2aWNlLT5xdWV1ZV9kZXB0aCkgeworCQkJZGV2aWNlLT5hZHZlcnRpc2VkX3F1ZXVlX2RlcHRoID0gZGV2aWNlLT5xdWV1ZV9kZXB0aDsKKwkJCXNjc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKHNkZXYsCisJCQkJZGV2aWNlLT5hZHZlcnRpc2VkX3F1ZXVlX2RlcHRoKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0cmxfaW5mby0+c2NzaV9kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcWlfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2U7CisKKwlkZXZpY2UgPSBzZGV2LT5ob3N0ZGF0YTsKKwlpZiAoIWRldmljZS0+ZXhwb3NlX2RldmljZSkKKwkJc2Rldi0+bm9fdWxkX2F0dGFjaCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcWlfZ2V0cGNpaW5mb19pb2N0bChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLAorCXZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7CisJdTMyIHN1YnN5c3RlbV92ZW5kb3I7CisJdTMyIHN1YnN5c3RlbV9kZXZpY2U7CisJY2Npc3NfcGNpX2luZm9fc3RydWN0IHBjaWluZm87CisKKwlpZiAoIWFyZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwY2lfZGV2ID0gY3RybF9pbmZvLT5wY2lfZGV2OworCisJcGNpaW5mby5kb21haW4gPSBwY2lfZG9tYWluX25yKHBjaV9kZXYtPmJ1cyk7CisJcGNpaW5mby5idXMgPSBwY2lfZGV2LT5idXMtPm51bWJlcjsKKwlwY2lpbmZvLmRldl9mbiA9IHBjaV9kZXYtPmRldmZuOworCXN1YnN5c3RlbV92ZW5kb3IgPSBwY2lfZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOworCXN1YnN5c3RlbV9kZXZpY2UgPSBwY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworCXBjaWluZm8uYm9hcmRfaWQgPSAoKHN1YnN5c3RlbV9kZXZpY2UgPDwgMTYpICYgMHhmZmZmMDAwMCkgfAorCQlzdWJzeXN0ZW1fdmVuZG9yOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZwY2lpbmZvLCBzaXplb2YocGNpaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBxaV9nZXRkcml2dmVyX2lvY3RsKHZvaWQgX191c2VyICphcmcpCit7CisJdTMyIHZlcnNpb247CisKKwlpZiAoIWFyZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2ZXJzaW9uID0gKERSSVZFUl9NQUpPUiA8PCAyOCkgfCAoRFJJVkVSX01JTk9SIDw8IDI0KSB8CisJCShEUklWRVJfUkVMRUFTRSA8PCAxNikgfCBEUklWRVJfUkVWSVNJT047CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJnZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjaXNzX2Vycm9yX2luZm8geworCXU4CXNjc2lfc3RhdHVzOworCWludAljb21tYW5kX3N0YXR1czsKKwlzaXplX3QJc2Vuc2VfZGF0YV9sZW5ndGg7Cit9OworCitzdGF0aWMgdm9pZCBwcWlfZXJyb3JfaW5mb190b19jaXNzKHN0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvICpwcWlfZXJyb3JfaW5mbywKKwlzdHJ1Y3QgY2lzc19lcnJvcl9pbmZvICpjaXNzX2Vycm9yX2luZm8pCit7CisJaW50IGNpc3NfY21kX3N0YXR1czsKKwlzaXplX3Qgc2Vuc2VfZGF0YV9sZW5ndGg7CisKKwlzd2l0Y2ggKHBxaV9lcnJvcl9pbmZvLT5kYXRhX291dF9yZXN1bHQpIHsKKwljYXNlIFBRSV9EQVRBX0lOX09VVF9HT09EOgorCQljaXNzX2NtZF9zdGF0dXMgPSBDSVNTX0NNRF9TVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisJY2FzZSBQUUlfREFUQV9JTl9PVVRfVU5ERVJGTE9XOgorCQljaXNzX2NtZF9zdGF0dXMgPSBDSVNTX0NNRF9TVEFUVVNfREFUQV9VTkRFUlJVTjsKKwkJYnJlYWs7CisJY2FzZSBQUUlfREFUQV9JTl9PVVRfQlVGRkVSX09WRVJGTE9XOgorCQljaXNzX2NtZF9zdGF0dXMgPSBDSVNTX0NNRF9TVEFUVVNfREFUQV9PVkVSUlVOOworCQlicmVhazsKKwljYXNlIFBRSV9EQVRBX0lOX09VVF9QUk9UT0NPTF9FUlJPUjoKKwljYXNlIFBRSV9EQVRBX0lOX09VVF9CVUZGRVJfRVJST1I6CisJY2FzZSBQUUlfREFUQV9JTl9PVVRfQlVGRkVSX09WRVJGTE9XX0RFU0NSSVBUT1JfQVJFQToKKwljYXNlIFBRSV9EQVRBX0lOX09VVF9CVUZGRVJfT1ZFUkZMT1dfQlJJREdFOgorCWNhc2UgUFFJX0RBVEFfSU5fT1VUX0VSUk9SOgorCQljaXNzX2NtZF9zdGF0dXMgPSBDSVNTX0NNRF9TVEFUVVNfUFJPVE9DT0xfRVJST1I7CisJCWJyZWFrOworCWNhc2UgUFFJX0RBVEFfSU5fT1VUX0hBUkRXQVJFX0VSUk9SOgorCWNhc2UgUFFJX0RBVEFfSU5fT1VUX1BDSUVfRkFCUklDX0VSUk9SOgorCWNhc2UgUFFJX0RBVEFfSU5fT1VUX1BDSUVfQ09NUExFVElPTl9USU1FT1VUOgorCWNhc2UgUFFJX0RBVEFfSU5fT1VUX1BDSUVfQ09NUExFVEVSX0FCT1JUX1JFQ0VJVkVEOgorCWNhc2UgUFFJX0RBVEFfSU5fT1VUX1BDSUVfVU5TVVBQT1JURURfUkVRVUVTVF9SRUNFSVZFRDoKKwljYXNlIFBRSV9EQVRBX0lOX09VVF9QQ0lFX0VDUkNfQ0hFQ0tfRkFJTEVEOgorCWNhc2UgUFFJX0RBVEFfSU5fT1VUX1BDSUVfVU5TVVBQT1JURURfUkVRVUVTVDoKKwljYXNlIFBRSV9EQVRBX0lOX09VVF9QQ0lFX0FDU19WSU9MQVRJT046CisJY2FzZSBQUUlfREFUQV9JTl9PVVRfUENJRV9UTFBfUFJFRklYX0JMT0NLRUQ6CisJY2FzZSBQUUlfREFUQV9JTl9PVVRfUENJRV9QT0lTT05FRF9NRU1PUllfUkVBRDoKKwkJY2lzc19jbWRfc3RhdHVzID0gQ0lTU19DTURfU1RBVFVTX0hBUkRXQVJFX0VSUk9SOworCQlicmVhazsKKwljYXNlIFBRSV9EQVRBX0lOX09VVF9VTlNPTElDSVRFRF9BQk9SVDoKKwkJY2lzc19jbWRfc3RhdHVzID0gQ0lTU19DTURfU1RBVFVTX1VOU09MSUNJVEVEX0FCT1JUOworCQlicmVhazsKKwljYXNlIFBRSV9EQVRBX0lOX09VVF9BQk9SVEVEOgorCQljaXNzX2NtZF9zdGF0dXMgPSBDSVNTX0NNRF9TVEFUVVNfQUJPUlRFRDsKKwkJYnJlYWs7CisJY2FzZSBQUUlfREFUQV9JTl9PVVRfVElNRU9VVDoKKwkJY2lzc19jbWRfc3RhdHVzID0gQ0lTU19DTURfU1RBVFVTX1RJTUVPVVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNpc3NfY21kX3N0YXR1cyA9IENJU1NfQ01EX1NUQVRVU19UQVJHRVRfU1RBVFVTOworCQlicmVhazsKKwl9CisKKwlzZW5zZV9kYXRhX2xlbmd0aCA9CisJCWdldF91bmFsaWduZWRfbGUxNigmcHFpX2Vycm9yX2luZm8tPnNlbnNlX2RhdGFfbGVuZ3RoKTsKKwlpZiAoc2Vuc2VfZGF0YV9sZW5ndGggPT0gMCkKKwkJc2Vuc2VfZGF0YV9sZW5ndGggPQorCQlnZXRfdW5hbGlnbmVkX2xlMTYoJnBxaV9lcnJvcl9pbmZvLT5yZXNwb25zZV9kYXRhX2xlbmd0aCk7CisJaWYgKHNlbnNlX2RhdGFfbGVuZ3RoKQorCQlpZiAoc2Vuc2VfZGF0YV9sZW5ndGggPiBzaXplb2YocHFpX2Vycm9yX2luZm8tPmRhdGEpKQorCQkJc2Vuc2VfZGF0YV9sZW5ndGggPSBzaXplb2YocHFpX2Vycm9yX2luZm8tPmRhdGEpOworCisJY2lzc19lcnJvcl9pbmZvLT5zY3NpX3N0YXR1cyA9IHBxaV9lcnJvcl9pbmZvLT5zdGF0dXM7CisJY2lzc19lcnJvcl9pbmZvLT5jb21tYW5kX3N0YXR1cyA9IGNpc3NfY21kX3N0YXR1czsKKwljaXNzX2Vycm9yX2luZm8tPnNlbnNlX2RhdGFfbGVuZ3RoID0gc2Vuc2VfZGF0YV9sZW5ndGg7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3Bhc3N0aHJ1X2lvY3RsKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHJjOworCWNoYXIgKmtlcm5lbF9idWZmZXIgPSBOVUxMOworCXUxNiBpdV9sZW5ndGg7CisJc2l6ZV90IHNlbnNlX2RhdGFfbGVuZ3RoOworCUlPQ1RMX0NvbW1hbmRfc3RydWN0IGlvY29tbWFuZDsKKwlzdHJ1Y3QgcHFpX3JhaWRfcGF0aF9yZXF1ZXN0IHJlcXVlc3Q7CisJc3RydWN0IHBxaV9yYWlkX2Vycm9yX2luZm8gcHFpX2Vycm9yX2luZm87CisJc3RydWN0IGNpc3NfZXJyb3JfaW5mbyBjaXNzX2Vycm9yX2luZm87CisKKwlpZiAocHFpX2N0cmxfb2ZmbGluZShjdHJsX2luZm8pKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYXJnKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCXJldHVybiAtRVBFUk07CisJaWYgKGNvcHlfZnJvbV91c2VyKCZpb2NvbW1hbmQsIGFyZywgc2l6ZW9mKGlvY29tbWFuZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoaW9jb21tYW5kLmJ1Zl9zaXplIDwgMSAmJgorCQlpb2NvbW1hbmQuUmVxdWVzdC5UeXBlLkRpcmVjdGlvbiAhPSBYRkVSX05PTkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpb2NvbW1hbmQuUmVxdWVzdC5DREJMZW4gPiBzaXplb2YocmVxdWVzdC5jZGIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaW9jb21tYW5kLlJlcXVlc3QuVHlwZS5UeXBlICE9IFRZUEVfQ01EKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoaW9jb21tYW5kLlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24pIHsKKwljYXNlIFhGRVJfTk9ORToKKwljYXNlIFhGRVJfV1JJVEU6CisJY2FzZSBYRkVSX1JFQUQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpb2NvbW1hbmQuYnVmX3NpemUgPiAwKSB7CisJCWtlcm5lbF9idWZmZXIgPSBrbWFsbG9jKGlvY29tbWFuZC5idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICgha2VybmVsX2J1ZmZlcikKKwkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoaW9jb21tYW5kLlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gJiBYRkVSX1dSSVRFKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoa2VybmVsX2J1ZmZlciwgaW9jb21tYW5kLmJ1ZiwKKwkJCQlpb2NvbW1hbmQuYnVmX3NpemUpKSB7CisJCQkJcmMgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgeworCQkJbWVtc2V0KGtlcm5lbF9idWZmZXIsIDAsIGlvY29tbWFuZC5idWZfc2l6ZSk7CisJCX0KKwl9CisKKwltZW1zZXQoJnJlcXVlc3QsIDAsIHNpemVvZihyZXF1ZXN0KSk7CisKKwlyZXF1ZXN0LmhlYWRlci5pdV90eXBlID0gUFFJX1JFUVVFU1RfSVVfUkFJRF9QQVRIX0lPOworCWl1X2xlbmd0aCA9IG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QsIHNnX2Rlc2NyaXB0b3JzKSAtCisJCVBRSV9SRVFVRVNUX0hFQURFUl9MRU5HVEg7CisJbWVtY3B5KHJlcXVlc3QubHVuX251bWJlciwgaW9jb21tYW5kLkxVTl9pbmZvLkx1bkFkZHJCeXRlcywKKwkJc2l6ZW9mKHJlcXVlc3QubHVuX251bWJlcikpOworCW1lbWNweShyZXF1ZXN0LmNkYiwgaW9jb21tYW5kLlJlcXVlc3QuQ0RCLCBpb2NvbW1hbmQuUmVxdWVzdC5DREJMZW4pOworCXJlcXVlc3QuYWRkaXRpb25hbF9jZGJfYnl0ZXNfdXNhZ2UgPSBTT1BfQURESVRJT05BTF9DREJfQllURVNfMDsKKworCXN3aXRjaCAoaW9jb21tYW5kLlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24pIHsKKwljYXNlIFhGRVJfTk9ORToKKwkJcmVxdWVzdC5kYXRhX2RpcmVjdGlvbiA9IFNPUF9OT19ESVJFQ1RJT05fRkxBRzsKKwkJYnJlYWs7CisJY2FzZSBYRkVSX1dSSVRFOgorCQlyZXF1ZXN0LmRhdGFfZGlyZWN0aW9uID0gU09QX1dSSVRFX0ZMQUc7CisJCWJyZWFrOworCWNhc2UgWEZFUl9SRUFEOgorCQlyZXF1ZXN0LmRhdGFfZGlyZWN0aW9uID0gU09QX1JFQURfRkxBRzsKKwkJYnJlYWs7CisJfQorCisJcmVxdWVzdC50YXNrX2F0dHJpYnV0ZSA9IFNPUF9UQVNLX0FUVFJJQlVURV9TSU1QTEU7CisKKwlpZiAoaW9jb21tYW5kLmJ1Zl9zaXplID4gMCkgeworCQlwdXRfdW5hbGlnbmVkX2xlMzIoaW9jb21tYW5kLmJ1Zl9zaXplLCAmcmVxdWVzdC5idWZmZXJfbGVuZ3RoKTsKKworCQlyYyA9IHBxaV9tYXBfc2luZ2xlKGN0cmxfaW5mby0+cGNpX2RldiwKKwkJCSZyZXF1ZXN0LnNnX2Rlc2NyaXB0b3JzWzBdLCBrZXJuZWxfYnVmZmVyLAorCQkJaW9jb21tYW5kLmJ1Zl9zaXplLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKKworCQlpdV9sZW5ndGggKz0gc2l6ZW9mKHJlcXVlc3Quc2dfZGVzY3JpcHRvcnNbMF0pOworCX0KKworCXB1dF91bmFsaWduZWRfbGUxNihpdV9sZW5ndGgsICZyZXF1ZXN0LmhlYWRlci5pdV9sZW5ndGgpOworCisJcmMgPSBwcWlfc3VibWl0X3JhaWRfcmVxdWVzdF9zeW5jaHJvbm91cyhjdHJsX2luZm8sICZyZXF1ZXN0LmhlYWRlciwKKwkJUFFJX1NZTkNfRkxBR1NfSU5URVJSVVBUQUJMRSwgJnBxaV9lcnJvcl9pbmZvLCBOT19USU1FT1VUKTsKKworCWlmIChpb2NvbW1hbmQuYnVmX3NpemUgPiAwKQorCQlwcWlfcGNpX3VubWFwKGN0cmxfaW5mby0+cGNpX2RldiwgcmVxdWVzdC5zZ19kZXNjcmlwdG9ycywgMSwKKwkJCVBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwltZW1zZXQoJmlvY29tbWFuZC5lcnJvcl9pbmZvLCAwLCBzaXplb2YoaW9jb21tYW5kLmVycm9yX2luZm8pKTsKKworCWlmIChyYyA9PSAwKSB7CisJCXBxaV9lcnJvcl9pbmZvX3RvX2Npc3MoJnBxaV9lcnJvcl9pbmZvLCAmY2lzc19lcnJvcl9pbmZvKTsKKwkJaW9jb21tYW5kLmVycm9yX2luZm8uU2NzaVN0YXR1cyA9IGNpc3NfZXJyb3JfaW5mby5zY3NpX3N0YXR1czsKKwkJaW9jb21tYW5kLmVycm9yX2luZm8uQ29tbWFuZFN0YXR1cyA9CisJCQljaXNzX2Vycm9yX2luZm8uY29tbWFuZF9zdGF0dXM7CisJCXNlbnNlX2RhdGFfbGVuZ3RoID0gY2lzc19lcnJvcl9pbmZvLnNlbnNlX2RhdGFfbGVuZ3RoOworCQlpZiAoc2Vuc2VfZGF0YV9sZW5ndGgpIHsKKwkJCWlmIChzZW5zZV9kYXRhX2xlbmd0aCA+CisJCQkJc2l6ZW9mKGlvY29tbWFuZC5lcnJvcl9pbmZvLlNlbnNlSW5mbykpCisJCQkJc2Vuc2VfZGF0YV9sZW5ndGggPQorCQkJCQlzaXplb2YoaW9jb21tYW5kLmVycm9yX2luZm8uU2Vuc2VJbmZvKTsKKwkJCW1lbWNweShpb2NvbW1hbmQuZXJyb3JfaW5mby5TZW5zZUluZm8sCisJCQkJcHFpX2Vycm9yX2luZm8uZGF0YSwgc2Vuc2VfZGF0YV9sZW5ndGgpOworCQkJaW9jb21tYW5kLmVycm9yX2luZm8uU2Vuc2VMZW4gPSBzZW5zZV9kYXRhX2xlbmd0aDsKKwkJfQorCX0KKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW9jb21tYW5kLCBzaXplb2YoaW9jb21tYW5kKSkpIHsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocmMgPT0gMCAmJiBpb2NvbW1hbmQuYnVmX3NpemUgPiAwICYmCisJCShpb2NvbW1hbmQuUmVxdWVzdC5UeXBlLkRpcmVjdGlvbiAmIFhGRVJfUkVBRCkpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcihpb2NvbW1hbmQuYnVmLCBrZXJuZWxfYnVmZmVyLAorCQkJaW9jb21tYW5kLmJ1Zl9zaXplKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQl9CisJfQorCitvdXQ6CisJa2ZyZWUoa2VybmVsX2J1ZmZlcik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcHFpX2lvY3RsKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbzsKKworCWN0cmxfaW5mbyA9IHNob3N0X3RvX2hiYShzZGV2LT5ob3N0KTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDQ0lTU19ERVJFR0RJU0s6CisJY2FzZSBDQ0lTU19SRUdORVdESVNLOgorCWNhc2UgQ0NJU1NfUkVHTkVXRDoKKwkJcmMgPSBwcWlfc2Nhbl9zY3NpX2RldmljZXMoY3RybF9pbmZvKTsKKwkJYnJlYWs7CisJY2FzZSBDQ0lTU19HRVRQQ0lJTkZPOgorCQlyYyA9IHBxaV9nZXRwY2lpbmZvX2lvY3RsKGN0cmxfaW5mbywgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBDQ0lTU19HRVREUklWVkVSOgorCQlyYyA9IHBxaV9nZXRkcml2dmVyX2lvY3RsKGFyZyk7CisJCWJyZWFrOworCWNhc2UgQ0NJU1NfUEFTU1RIUlU6CisJCXJjID0gcHFpX3Bhc3N0aHJ1X2lvY3RsKGN0cmxfaW5mbywgYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBxaV92ZXJzaW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmZXIpCit7CisJc3NpemVfdCBjb3VudCA9IDA7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3Q7CisJc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbzsKKworCXNob3N0ID0gY2xhc3NfdG9fc2hvc3QoZGV2KTsKKwljdHJsX2luZm8gPSBzaG9zdF90b19oYmEoc2hvc3QpOworCisJY291bnQgKz0gc25wcmludGYoYnVmZmVyICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkiICBkcml2ZXI6ICVzXG4iLCBEUklWRVJfVkVSU0lPTiBCVUlMRF9USU1FU1RBTVApOworCisJY291bnQgKz0gc25wcmludGYoYnVmZmVyICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkiZmlybXdhcmU6ICVzXG4iLCBjdHJsX2luZm8tPmZpcm13YXJlX3ZlcnNpb24pOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBwcWlfaG9zdF9yZXNjYW5fc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGNsYXNzX3RvX3Nob3N0KGRldik7CisKKwlwcWlfc2Nhbl9zdGFydChzaG9zdCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih2ZXJzaW9uLCBTX0lSVUdPLCBwcWlfdmVyc2lvbl9zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXNjYW4sIFNfSVdVU1IsIE5VTEwsIHBxaV9ob3N0X3Jlc2Nhbl9zdG9yZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqcHFpX3Nob3N0X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3ZlcnNpb24sCisJJmRldl9hdHRyX3Jlc2NhbiwKKwlOVUxMCit9OworCitzdGF0aWMgc3NpemVfdCBwcWlfc2FzX2FkZHJlc3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgc2FzX2FkZHJlc3M7CisKKwlzZGV2ID0gdG9fc2NzaV9kZXZpY2UoZGV2KTsKKwljdHJsX2luZm8gPSBzaG9zdF90b19oYmEoc2Rldi0+aG9zdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3RybF9pbmZvLT5zY3NpX2RldmljZV9saXN0X2xvY2ssIGZsYWdzKTsKKworCWRldmljZSA9IHNkZXYtPmhvc3RkYXRhOworCWlmIChwcWlfaXNfbG9naWNhbF9kZXZpY2UoZGV2aWNlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHJsX2luZm8tPnNjc2lfZGV2aWNlX2xpc3RfbG9jaywKKwkJCWZsYWdzKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXNhc19hZGRyZXNzID0gZGV2aWNlLT5zYXNfYWRkcmVzczsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0cmxfaW5mby0+c2NzaV9kZXZpY2VfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmZmVyLCBQQUdFX1NJWkUsICIweCUwMTZsbHhcbiIsIHNhc19hZGRyZXNzKTsKK30KKworc3RhdGljIHNzaXplX3QgcHFpX3NzZF9zbWFydF9wYXRoX2VuYWJsZWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwlzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOworCWN0cmxfaW5mbyA9IHNob3N0X3RvX2hiYShzZGV2LT5ob3N0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdHJsX2luZm8tPnNjc2lfZGV2aWNlX2xpc3RfbG9jaywgZmxhZ3MpOworCisJZGV2aWNlID0gc2Rldi0+aG9zdGRhdGE7CisJYnVmZmVyWzBdID0gZGV2aWNlLT5vZmZsb2FkX2VuYWJsZWQgPyAnMScgOiAnMCc7CisJYnVmZmVyWzFdID0gJ1xuJzsKKwlidWZmZXJbMl0gPSAnXDAnOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3RybF9pbmZvLT5zY3NpX2RldmljZV9saXN0X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAyOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoc2FzX2FkZHJlc3MsIFNfSVJVR08sIHBxaV9zYXNfYWRkcmVzc19zaG93LCBOVUxMKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihzc2Rfc21hcnRfcGF0aF9lbmFibGVkLCBTX0lSVUdPLAorCXBxaV9zc2Rfc21hcnRfcGF0aF9lbmFibGVkX3Nob3csIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKnBxaV9zZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3Nhc19hZGRyZXNzLAorCSZkZXZfYXR0cl9zc2Rfc21hcnRfcGF0aF9lbmFibGVkLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHBxaV9kcml2ZXJfdGVtcGxhdGUgPSB7CisJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAorCS5uYW1lID0gRFJJVkVSX05BTUVfU0hPUlQsCisJLnByb2NfbmFtZSA9IERSSVZFUl9OQU1FX1NIT1JULAorCS5xdWV1ZWNvbW1hbmQgPSBwcWlfc2NzaV9xdWV1ZV9jb21tYW5kLAorCS5zY2FuX3N0YXJ0ID0gcHFpX3NjYW5fc3RhcnQsCisJLnNjYW5fZmluaXNoZWQgPSBwcWlfc2Nhbl9maW5pc2hlZCwKKwkudGhpc19pZCA9IC0xLAorCS51c2VfY2x1c3RlcmluZyA9IEVOQUJMRV9DTFVTVEVSSU5HLAorCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IHBxaV9laF9kZXZpY2VfcmVzZXRfaGFuZGxlciwKKwkuaW9jdGwgPSBwcWlfaW9jdGwsCisJLnNsYXZlX2FsbG9jID0gcHFpX3NsYXZlX2FsbG9jLAorCS5zbGF2ZV9jb25maWd1cmUgPSBwcWlfc2xhdmVfY29uZmlndXJlLAorCS5zZGV2X2F0dHJzID0gcHFpX3NkZXZfYXR0cnMsCisJLnNob3N0X2F0dHJzID0gcHFpX3Nob3N0X2F0dHJzLAorfTsKKworc3RhdGljIGludCBwcWlfcmVnaXN0ZXJfc2NzaShzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCWludCByYzsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKKworCXNob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZwcWlfZHJpdmVyX3RlbXBsYXRlLCBzaXplb2YoY3RybF9pbmZvKSk7CisJaWYgKCFzaG9zdCkgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJzY3NpX2hvc3RfYWxsb2MgZmFpbGVkIGZvciBjb250cm9sbGVyICV1XG4iLAorCQkJY3RybF9pbmZvLT5jdHJsX2lkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc2hvc3QtPmlvX3BvcnQgPSAwOworCXNob3N0LT5uX2lvX3BvcnQgPSAwOworCXNob3N0LT50aGlzX2lkID0gLTE7CisJc2hvc3QtPm1heF9jaGFubmVsID0gUFFJX01BWF9CVVM7CisJc2hvc3QtPm1heF9jbWRfbGVuID0gTUFYX0NPTU1BTkRfU0laRTsKKwlzaG9zdC0+bWF4X2x1biA9IH4wOworCXNob3N0LT5tYXhfaWQgPSB+MDsKKwlzaG9zdC0+bWF4X3NlY3RvcnMgPSBjdHJsX2luZm8tPm1heF9zZWN0b3JzOworCXNob3N0LT5jYW5fcXVldWUgPSBjdHJsX2luZm8tPnNjc2lfbWxfY2FuX3F1ZXVlOworCXNob3N0LT5jbWRfcGVyX2x1biA9IHNob3N0LT5jYW5fcXVldWU7CisJc2hvc3QtPnNnX3RhYmxlc2l6ZSA9IGN0cmxfaW5mby0+c2dfdGFibGVzaXplOworCXNob3N0LT50cmFuc3BvcnR0ID0gcHFpX3Nhc190cmFuc3BvcnRfdGVtcGxhdGU7CisJc2hvc3QtPmlycSA9IGN0cmxfaW5mby0+bXNpeF92ZWN0b3JzWzBdOworCXNob3N0LT51bmlxdWVfaWQgPSBzaG9zdC0+aXJxOworCXNob3N0LT5ucl9od19xdWV1ZXMgPSBjdHJsX2luZm8tPm51bV9xdWV1ZV9ncm91cHM7CisJc2hvc3QtPmhvc3RkYXRhWzBdID0gKHVuc2lnbmVkIGxvbmcpY3RybF9pbmZvOworCisJcmMgPSBzY3NpX2FkZF9ob3N0KHNob3N0LCAmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJzY3NpX2FkZF9ob3N0IGZhaWxlZCBmb3IgY29udHJvbGxlciAldVxuIiwKKwkJCWN0cmxfaW5mby0+Y3RybF9pZCk7CisJCWdvdG8gZnJlZV9ob3N0OworCX0KKworCXJjID0gcHFpX2FkZF9zYXNfaG9zdChzaG9zdCwgY3RybF9pbmZvKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkiYWRkIFNBUyBob3N0IGZhaWxlZCBmb3IgY29udHJvbGxlciAldVxuIiwKKwkJCWN0cmxfaW5mby0+Y3RybF9pZCk7CisJCWdvdG8gcmVtb3ZlX2hvc3Q7CisJfQorCisJY3RybF9pbmZvLT5zY3NpX2hvc3QgPSBzaG9zdDsKKworCXJldHVybiAwOworCityZW1vdmVfaG9zdDoKKwlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKK2ZyZWVfaG9zdDoKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgcHFpX3VucmVnaXN0ZXJfc2NzaShzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0OworCisJcHFpX2RlbGV0ZV9zYXNfaG9zdChjdHJsX2luZm8pOworCisJc2hvc3QgPSBjdHJsX2luZm8tPnNjc2lfaG9zdDsKKwlpZiAoIXNob3N0KQorCQlyZXR1cm47CisKKwlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKKwlzY3NpX2hvc3RfcHV0KHNob3N0KTsKK30KKworI2RlZmluZSBQUUlfUkVTRVRfQUNUSU9OX1JFU0VUCQkweDEKKworI2RlZmluZSBQUUlfUkVTRVRfVFlQRV9OT19SRVNFVAkJMHgwCisjZGVmaW5lIFBRSV9SRVNFVF9UWVBFX1NPRlRfUkVTRVQJMHgxCisjZGVmaW5lIFBRSV9SRVNFVF9UWVBFX0ZJUk1fUkVTRVQJMHgyCisjZGVmaW5lIFBRSV9SRVNFVF9UWVBFX0hBUkRfUkVTRVQJMHgzCisKK3N0YXRpYyBpbnQgcHFpX3Jlc2V0KHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJaW50IHJjOworCXUzMiByZXNldF9wYXJhbXM7CisKKwlyZXNldF9wYXJhbXMgPSAoUFFJX1JFU0VUX0FDVElPTl9SRVNFVCA8PCA1KSB8CisJCVBRSV9SRVNFVF9UWVBFX0hBUkRfUkVTRVQ7CisKKwl3cml0ZWwocmVzZXRfcGFyYW1zLAorCQkmY3RybF9pbmZvLT5wcWlfcmVnaXN0ZXJzLT5kZXZpY2VfcmVzZXQpOworCisJcmMgPSBwcWlfd2FpdF9mb3JfcHFpX21vZGVfcmVhZHkoY3RybF9pbmZvKTsKKwlpZiAocmMpCisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJIlBRSSByZXNldCBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBxaV9nZXRfY3RybF9maXJtd2FyZV92ZXJzaW9uKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJaW50IHJjOworCXN0cnVjdCBibWljX2lkZW50aWZ5X2NvbnRyb2xsZXIgKmlkZW50aWZ5OworCisJaWRlbnRpZnkgPSBrbWFsbG9jKHNpemVvZigqaWRlbnRpZnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlkZW50aWZ5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJjID0gcHFpX2lkZW50aWZ5X2NvbnRyb2xsZXIoY3RybF9pbmZvLCBpZGVudGlmeSk7CisJaWYgKHJjKQorCQlnb3RvIG91dDsKKworCW1lbWNweShjdHJsX2luZm8tPmZpcm13YXJlX3ZlcnNpb24sIGlkZW50aWZ5LT5maXJtd2FyZV92ZXJzaW9uLAorCQlzaXplb2YoaWRlbnRpZnktPmZpcm13YXJlX3ZlcnNpb24pKTsKKwljdHJsX2luZm8tPmZpcm13YXJlX3ZlcnNpb25bc2l6ZW9mKGlkZW50aWZ5LT5maXJtd2FyZV92ZXJzaW9uKV0gPSAnXDAnOworCXNucHJpbnRmKGN0cmxfaW5mby0+ZmlybXdhcmVfdmVyc2lvbiArCisJCXN0cmxlbihjdHJsX2luZm8tPmZpcm13YXJlX3ZlcnNpb24pLAorCQlzaXplb2YoY3RybF9pbmZvLT5maXJtd2FyZV92ZXJzaW9uKSwKKwkJIi0ldSIsIGdldF91bmFsaWduZWRfbGUxNigmaWRlbnRpZnktPmZpcm13YXJlX2J1aWxkX251bWJlcikpOworCitvdXQ6CisJa2ZyZWUoaWRlbnRpZnkpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBxaV9rZHVtcF9pbml0KHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJaWYgKCFzaXNfaXNfZmlybXdhcmVfcnVubmluZyhjdHJsX2luZm8pKQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKHBxaV9nZXRfY3RybF9tb2RlKGN0cmxfaW5mbykgPT0gUFFJX01PREUpIHsKKwkJc2lzX2Rpc2FibGVfbXNpeChjdHJsX2luZm8pOworCQlpZiAocHFpX3Jlc2V0KGN0cmxfaW5mbykgPT0gMCkKKwkJCXNpc19yZWVuYWJsZV9zaXNfbW9kZShjdHJsX2luZm8pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBxaV9jdHJsX2luaXQoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlpbnQgcmM7CisKKwlpZiAocmVzZXRfZGV2aWNlcykgeworCQlyYyA9IHBxaV9rZHVtcF9pbml0KGN0cmxfaW5mbyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKKwkvKgorCSAqIFdoZW4gdGhlIGNvbnRyb2xsZXIgY29tZXMgb3V0IG9mIHJlc2V0LCBpdCBpcyBhbHdheXMgcnVubmluZworCSAqIGluIGxlZ2FjeSBTSVMgbW9kZS4gIFRoaXMgaXMgc28gdGhhdCBpdCBjYW4gYmUgY29tcGF0aWJsZQorCSAqIHdpdGggbGVnYWN5IGRyaXZlcnMgc2hpcHBlZCB3aXRoIE9TZXMuICBTbyB3ZSBoYXZlIHRvIHRhbGsKKwkgKiB0byBpdCB1c2luZyBTSVMgY29tbWFuZHMgYXQgZmlyc3QuICBPbmNlIHdlIGFyZSBzYXRpc2lmaWVkCisJICogdGhhdCB0aGUgY29udHJvbGxlciBzdXBwb3J0cyBQUUksIHdlIHRyYW5zaXRpb24gaXQgaW50byBQUUkKKwkgKiBtb2RlLgorCSAqLworCisJLyoKKwkgKiBXYWl0IHVudGlsIHRoZSBjb250cm9sbGVyIGlzIHJlYWR5IHRvIHN0YXJ0IGFjY2VwdGluZyBTSVMKKwkgKiBjb21tYW5kcy4KKwkgKi8KKwlyYyA9IHNpc193YWl0X2Zvcl9jdHJsX3JlYWR5KGN0cmxfaW5mbyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJImVycm9yIGluaXRpYWxpemluZyBTSVMgaW50ZXJmYWNlXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qCisJICogR2V0IHRoZSBjb250cm9sbGVyIHByb3BlcnRpZXMuICBUaGlzIGFsbG93cyB1cyB0byBkZXRlcm1pbmUKKwkgKiB3aGV0aGVyIG9yIG5vdCBpdCBzdXBwb3J0cyBQUUkgbW9kZS4KKwkgKi8KKwlyYyA9IHNpc19nZXRfY3RybF9wcm9wZXJ0aWVzKGN0cmxfaW5mbyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJImVycm9yIG9idGFpbmluZyBjb250cm9sbGVyIHByb3BlcnRpZXNcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBzaXNfZ2V0X3BxaV9jYXBhYmlsaXRpZXMoY3RybF9pbmZvKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkiZXJyb3Igb2J0YWluaW5nIGNvbnRyb2xsZXIgY2FwYWJpbGl0aWVzXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChjdHJsX2luZm8tPm1heF9vdXRzdGFuZGluZ19yZXF1ZXN0cyA+IFBRSV9NQVhfT1VUU1RBTkRJTkdfUkVRVUVTVFMpCisJCWN0cmxfaW5mby0+bWF4X291dHN0YW5kaW5nX3JlcXVlc3RzID0KKwkJCVBRSV9NQVhfT1VUU1RBTkRJTkdfUkVRVUVTVFM7CisKKwlwcWlfY2FsY3VsYXRlX2lvX3Jlc291cmNlcyhjdHJsX2luZm8pOworCisJcmMgPSBwcWlfYWxsb2NfZXJyb3JfYnVmZmVyKGN0cmxfaW5mbyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJImZhaWxlZCB0byBhbGxvY2F0ZSBQUUkgZXJyb3IgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qCisJICogSWYgdGhlIGZ1bmN0aW9uIHdlIGFyZSBhYm91dCB0byBjYWxsIHN1Y2NlZWRzLCB0aGUKKwkgKiBjb250cm9sbGVyIHdpbGwgdHJhbnNpdGlvbiBmcm9tIGxlZ2FjeSBTSVMgbW9kZQorCSAqIGludG8gUFFJIG1vZGUuCisJICovCisJcmMgPSBzaXNfaW5pdF9iYXNlX3N0cnVjdF9hZGRyKGN0cmxfaW5mbyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJImVycm9yIGluaXRpYWxpemluZyBQUUkgbW9kZVxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgY29udHJvbGxlciB0byBjb21wbGV0ZSB0aGUgU0lTIC0+IFBRSSB0cmFuc2l0aW9uLiAqLworCXJjID0gcHFpX3dhaXRfZm9yX3BxaV9tb2RlX3JlYWR5KGN0cmxfaW5mbyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJInRyYW5zaXRpb24gdG8gUFFJIG1vZGUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIEZyb20gaGVyZSBvbiwgd2UgYXJlIHJ1bm5pbmcgaW4gUFFJIG1vZGUuICovCisJY3RybF9pbmZvLT5wcWlfbW9kZV9lbmFibGVkID0gdHJ1ZTsKKwlwcWlfc2F2ZV9jdHJsX21vZGUoY3RybF9pbmZvLCBQUUlfTU9ERSk7CisKKwlyYyA9IHBxaV9hbGxvY19hZG1pbl9xdWV1ZXMoY3RybF9pbmZvKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkiZXJyb3IgYWxsb2NhdGluZyBhZG1pbiBxdWV1ZXNcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBwcWlfY3JlYXRlX2FkbWluX3F1ZXVlcyhjdHJsX2luZm8pOworCWlmIChyYykgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJlcnJvciBjcmVhdGluZyBhZG1pbiBxdWV1ZXNcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBwcWlfcmVwb3J0X2RldmljZV9jYXBhYmlsaXR5KGN0cmxfaW5mbyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJIm9idGFpbmluZyBkZXZpY2UgY2FwYWJpbGl0eSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBwcWlfdmFsaWRhdGVfZGV2aWNlX2NhcGFiaWxpdHkoY3RybF9pbmZvKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBxaV9jYWxjdWxhdGVfcXVldWVfcmVzb3VyY2VzKGN0cmxfaW5mbyk7CisKKwlyYyA9IHBxaV9lbmFibGVfbXNpeF9pbnRlcnJ1cHRzKGN0cmxfaW5mbyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoY3RybF9pbmZvLT5udW1fbXNpeF92ZWN0b3JzX2VuYWJsZWQgPCBjdHJsX2luZm8tPm51bV9xdWV1ZV9ncm91cHMpIHsKKwkJY3RybF9pbmZvLT5tYXhfbXNpeF92ZWN0b3JzID0KKwkJCWN0cmxfaW5mby0+bnVtX21zaXhfdmVjdG9yc19lbmFibGVkOworCQlwcWlfY2FsY3VsYXRlX3F1ZXVlX3Jlc291cmNlcyhjdHJsX2luZm8pOworCX0KKworCXJjID0gcHFpX2FsbG9jX2lvX3Jlc291cmNlcyhjdHJsX2luZm8pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwcWlfYWxsb2Nfb3BlcmF0aW9uYWxfcXVldWVzKGN0cmxfaW5mbyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwcWlfaW5pdF9vcGVyYXRpb25hbF9xdWV1ZXMoY3RybF9pbmZvKTsKKworCXJjID0gcHFpX3JlcXVlc3RfaXJxcyhjdHJsX2luZm8pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcHFpX2lycV9zZXRfYWZmaW5pdHlfaGludChjdHJsX2luZm8pOworCisJcmMgPSBwcWlfY3JlYXRlX3F1ZXVlcyhjdHJsX2luZm8pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJc2lzX2VuYWJsZV9tc2l4KGN0cmxfaW5mbyk7CisKKwlyYyA9IHBxaV9jb25maWd1cmVfZXZlbnRzKGN0cmxfaW5mbyk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJImVycm9yIGNvbmZpZ3VyaW5nIGV2ZW50c1xuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlwcWlfc3RhcnRfaGVhcnRiZWF0X3RpbWVyKGN0cmxfaW5mbyk7CisKKwljdHJsX2luZm8tPmNvbnRyb2xsZXJfb25saW5lID0gdHJ1ZTsKKworCS8qIFJlZ2lzdGVyIHdpdGggdGhlIFNDU0kgc3Vic3lzdGVtLiAqLworCXJjID0gcHFpX3JlZ2lzdGVyX3Njc2koY3RybF9pbmZvKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcHFpX2dldF9jdHJsX2Zpcm13YXJlX3ZlcnNpb24oY3RybF9pbmZvKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkiZXJyb3Igb2J0YWluaW5nIGZpcm13YXJlIHZlcnNpb25cbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBwcWlfd3JpdGVfZHJpdmVyX3ZlcnNpb25fdG9faG9zdF93ZWxsbmVzcyhjdHJsX2luZm8pOworCWlmIChyYykgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJlcnJvciB1cGRhdGluZyBob3N0IHdlbGxuZXNzXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXBxaV9zY2hlZHVsZV91cGRhdGVfdGltZV93b3JrZXIoY3RybF9pbmZvKTsKKworCXBxaV9zY2FuX3Njc2lfZGV2aWNlcyhjdHJsX2luZm8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3BjaV9pbml0KHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJaW50IHJjOworCXU2NCBtYXNrOworCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShjdHJsX2luZm8tPnBjaV9kZXYpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJmYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2VcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKHNpemVvZihkbWFfYWRkcl90KSA+IDQpCisJCW1hc2sgPSBETUFfQklUX01BU0soNjQpOworCWVsc2UKKwkJbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisKKwlyYyA9IGRtYV9zZXRfbWFzaygmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsIG1hc2spOworCWlmIChyYykgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwgImZhaWxlZCB0byBzZXQgRE1BIG1hc2tcbiIpOworCQlnb3RvIGRpc2FibGVfZGV2aWNlOworCX0KKworCXJjID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhjdHJsX2luZm8tPnBjaV9kZXYsIERSSVZFUl9OQU1FX1NIT1JUKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkiZmFpbGVkIHRvIG9idGFpbiBQQ0kgcmVzb3VyY2VzXG4iKTsKKwkJZ290byBkaXNhYmxlX2RldmljZTsKKwl9CisKKwljdHJsX2luZm8tPmlvbWVtX2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KAorCQljdHJsX2luZm8tPnBjaV9kZXYsIDApLAorCQlzaXplb2Yoc3RydWN0IHBxaV9jdHJsX3JlZ2lzdGVycykpOworCWlmICghY3RybF9pbmZvLT5pb21lbV9iYXNlKSB7CisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJImZhaWxlZCB0byBtYXAgbWVtb3J5IGZvciBjb250cm9sbGVyIHJlZ2lzdGVyc1xuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byByZWxlYXNlX3JlZ2lvbnM7CisJfQorCisJY3RybF9pbmZvLT5yZWdpc3RlcnMgPSBjdHJsX2luZm8tPmlvbWVtX2Jhc2U7CisJY3RybF9pbmZvLT5wcWlfcmVnaXN0ZXJzID0gJmN0cmxfaW5mby0+cmVnaXN0ZXJzLT5wcWlfcmVnaXN0ZXJzOworCisJLyogRW5hYmxlIGJ1cyBtYXN0ZXJpbmcuICovCisJcGNpX3NldF9tYXN0ZXIoY3RybF9pbmZvLT5wY2lfZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShjdHJsX2luZm8tPnBjaV9kZXYsIGN0cmxfaW5mbyk7CisKKwlyZXR1cm4gMDsKKworcmVsZWFzZV9yZWdpb25zOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMoY3RybF9pbmZvLT5wY2lfZGV2KTsKK2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShjdHJsX2luZm8tPnBjaV9kZXYpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBwcWlfY2xlYW51cF9wY2lfaW5pdChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCWlvdW5tYXAoY3RybF9pbmZvLT5pb21lbV9iYXNlKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGN0cmxfaW5mby0+cGNpX2Rldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGN0cmxfaW5mby0+cGNpX2Rldik7CisJcGNpX3NldF9kcnZkYXRhKGN0cmxfaW5mby0+cGNpX2RldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqcHFpX2FsbG9jX2N0cmxfaW5mbyhpbnQgbnVtYV9ub2RlKQoreworCXN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm87CisKKwljdHJsX2luZm8gPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBwcWlfY3RybF9pbmZvKSwKKwkJCUdGUF9LRVJORUwsIG51bWFfbm9kZSk7CisJaWYgKCFjdHJsX2luZm8pCisJCXJldHVybiBOVUxMOworCisJbXV0ZXhfaW5pdCgmY3RybF9pbmZvLT5zY2FuX211dGV4KTsKKworCUlOSVRfTElTVF9IRUFEKCZjdHJsX2luZm8tPnNjc2lfZGV2aWNlX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZjdHJsX2luZm8tPnNjc2lfZGV2aWNlX2xpc3RfbG9jayk7CisKKwlJTklUX1dPUksoJmN0cmxfaW5mby0+ZXZlbnRfd29yaywgcHFpX2V2ZW50X3dvcmtlcik7CisJYXRvbWljX3NldCgmY3RybF9pbmZvLT5udW1faW50ZXJydXB0cywgMCk7CisKKwlJTklUX0RFTEFZRURfV09SSygmY3RybF9pbmZvLT5yZXNjYW5fd29yaywgcHFpX3Jlc2Nhbl93b3JrZXIpOworCUlOSVRfREVMQVlFRF9XT1JLKCZjdHJsX2luZm8tPnVwZGF0ZV90aW1lX3dvcmssIHBxaV91cGRhdGVfdGltZV93b3JrZXIpOworCisJc2VtYV9pbml0KCZjdHJsX2luZm8tPnN5bmNfcmVxdWVzdF9zZW0sCisJCVBRSV9SRVNFUlZFRF9JT19TTE9UU19TWU5DSFJPTk9VU19SRVFVRVNUUyk7CisJc2VtYV9pbml0KCZjdHJsX2luZm8tPmx1bl9yZXNldF9zZW0sIFBRSV9SRVNFUlZFRF9JT19TTE9UU19MVU5fUkVTRVQpOworCisJY3RybF9pbmZvLT5jdHJsX2lkID0gYXRvbWljX2luY19yZXR1cm4oJnBxaV9jb250cm9sbGVyX2NvdW50KSAtIDE7CisJY3RybF9pbmZvLT5tYXhfbXNpeF92ZWN0b3JzID0gUFFJX01BWF9NU0lYX1ZFQ1RPUlM7CisKKwlyZXR1cm4gY3RybF9pbmZvOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHFpX2ZyZWVfY3RybF9pbmZvKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJa2ZyZWUoY3RybF9pbmZvKTsKK30KKworc3RhdGljIHZvaWQgcHFpX2ZyZWVfaW50ZXJydXB0cyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXBxaV9pcnFfdW5zZXRfYWZmaW5pdHlfaGludChjdHJsX2luZm8pOworCXBxaV9mcmVlX2lycXMoY3RybF9pbmZvKTsKKwlpZiAoY3RybF9pbmZvLT5udW1fbXNpeF92ZWN0b3JzX2VuYWJsZWQpCisJCXBjaV9kaXNhYmxlX21zaXgoY3RybF9pbmZvLT5wY2lfZGV2KTsKK30KKworc3RhdGljIHZvaWQgcHFpX2ZyZWVfY3RybF9yZXNvdXJjZXMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlwcWlfc3RvcF9oZWFydGJlYXRfdGltZXIoY3RybF9pbmZvKTsKKwlwcWlfZnJlZV9pbnRlcnJ1cHRzKGN0cmxfaW5mbyk7CisJaWYgKGN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2UpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCWN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2xlbmd0aCwKKwkJCWN0cmxfaW5mby0+cXVldWVfbWVtb3J5X2Jhc2UsCisJCQljdHJsX2luZm8tPnF1ZXVlX21lbW9yeV9iYXNlX2RtYV9oYW5kbGUpOworCWlmIChjdHJsX2luZm8tPmFkbWluX3F1ZXVlX21lbW9yeV9iYXNlKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQljdHJsX2luZm8tPmFkbWluX3F1ZXVlX21lbW9yeV9sZW5ndGgsCisJCQljdHJsX2luZm8tPmFkbWluX3F1ZXVlX21lbW9yeV9iYXNlLAorCQkJY3RybF9pbmZvLT5hZG1pbl9xdWV1ZV9tZW1vcnlfYmFzZV9kbWFfaGFuZGxlKTsKKwlwcWlfZnJlZV9hbGxfaW9fcmVxdWVzdHMoY3RybF9pbmZvKTsKKwlpZiAoY3RybF9pbmZvLT5lcnJvcl9idWZmZXIpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCWN0cmxfaW5mby0+ZXJyb3JfYnVmZmVyX2xlbmd0aCwKKwkJCWN0cmxfaW5mby0+ZXJyb3JfYnVmZmVyLAorCQkJY3RybF9pbmZvLT5lcnJvcl9idWZmZXJfZG1hX2hhbmRsZSk7CisJaWYgKGN0cmxfaW5mby0+aW9tZW1fYmFzZSkKKwkJcHFpX2NsZWFudXBfcGNpX2luaXQoY3RybF9pbmZvKTsKKwlwcWlfZnJlZV9jdHJsX2luZm8oY3RybF9pbmZvKTsKK30KKworc3RhdGljIHZvaWQgcHFpX3JlbW92ZV9jdHJsKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjdHJsX2luZm8tPnJlc2Nhbl93b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmN0cmxfaW5mby0+dXBkYXRlX3RpbWVfd29yayk7CisJcHFpX3JlbW92ZV9hbGxfc2NzaV9kZXZpY2VzKGN0cmxfaW5mbyk7CisJcHFpX3VucmVnaXN0ZXJfc2NzaShjdHJsX2luZm8pOworCisJaWYgKGN0cmxfaW5mby0+cHFpX21vZGVfZW5hYmxlZCkgeworCQlzaXNfZGlzYWJsZV9tc2l4KGN0cmxfaW5mbyk7CisJCWlmIChwcWlfcmVzZXQoY3RybF9pbmZvKSA9PSAwKQorCQkJc2lzX3JlZW5hYmxlX3Npc19tb2RlKGN0cmxfaW5mbyk7CisJfQorCXBxaV9mcmVlX2N0cmxfcmVzb3VyY2VzKGN0cmxfaW5mbyk7Cit9CisKK3N0YXRpYyB2b2lkIHBxaV9wcmludF9jdHJsX2luZm8oc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWNoYXIgKmN0cmxfZGVzY3JpcHRpb247CisKKwlpZiAoaWQtPmRyaXZlcl9kYXRhKSB7CisJCWN0cmxfZGVzY3JpcHRpb24gPSAoY2hhciAqKWlkLT5kcml2ZXJfZGF0YTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGlkLT5zdWJ2ZW5kb3IpIHsKKwkJY2FzZSBQQ0lfVkVORE9SX0lEX0hQOgorCQkJY3RybF9kZXNjcmlwdGlvbiA9IGhwZV9icmFuZGVkX2NvbnRyb2xsZXI7CisJCQlicmVhazsKKwkJY2FzZSBQQ0lfVkVORE9SX0lEX0FEQVBURUMyOgorCQlkZWZhdWx0OgorCQkJY3RybF9kZXNjcmlwdGlvbiA9IG1pY3Jvc2VtaV9icmFuZGVkX2NvbnRyb2xsZXI7CisJCQlicmVhazsKKwkJfQorCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcyBmb3VuZFxuIiwgY3RybF9kZXNjcmlwdGlvbik7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByYzsKKwlpbnQgbm9kZTsKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvOworCisJcHFpX3ByaW50X2N0cmxfaW5mbyhwZGV2LCBpZCk7CisKKwlpZiAocHFpX2Rpc2FibGVfZGV2aWNlX2lkX3dpbGRjYXJkcyAmJgorCQlpZC0+c3VidmVuZG9yID09IFBDSV9BTllfSUQgJiYKKwkJaWQtPnN1YmRldmljZSA9PSBQQ0lfQU5ZX0lEKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkiY29udHJvbGxlciBub3QgcHJvYmVkIGJlY2F1c2UgZGV2aWNlIElEIHdpbGRjYXJkcyBhcmUgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoaWQtPnN1YnZlbmRvciA9PSBQQ0lfQU5ZX0lEIHx8IGlkLT5zdWJkZXZpY2UgPT0gUENJX0FOWV9JRCkKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSJjb250cm9sbGVyIGRldmljZSBJRCBtYXRjaGVkIHVzaW5nIHdpbGRjYXJkc1xuIik7CisKKwlub2RlID0gZGV2X3RvX25vZGUoJnBkZXYtPmRldik7CisJaWYgKG5vZGUgPT0gTlVNQV9OT19OT0RFKQorCQlzZXRfZGV2X25vZGUoJnBkZXYtPmRldiwgMCk7CisKKwljdHJsX2luZm8gPSBwcWlfYWxsb2NfY3RybF9pbmZvKG5vZGUpOworCWlmICghY3RybF9pbmZvKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgY29udHJvbGxlciBpbmZvIGJsb2NrXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY3RybF9pbmZvLT5wY2lfZGV2ID0gcGRldjsKKworCXJjID0gcHFpX3BjaV9pbml0KGN0cmxfaW5mbyk7CisJaWYgKHJjKQorCQlnb3RvIGVycm9yOworCisJcmMgPSBwcWlfY3RybF9pbml0KGN0cmxfaW5mbyk7CisJaWYgKHJjKQorCQlnb3RvIGVycm9yOworCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCXBxaV9yZW1vdmVfY3RybChjdHJsX2luZm8pOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBwcWlfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvOworCisJY3RybF9pbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWlmICghY3RybF9pbmZvKQorCQlyZXR1cm47CisKKwlwcWlfcmVtb3ZlX2N0cmwoY3RybF9pbmZvKTsKK30KKworc3RhdGljIHZvaWQgcHFpX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCByYzsKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvOworCisJY3RybF9pbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWlmICghY3RybF9pbmZvKQorCQlnb3RvIGVycm9yOworCisJLyoKKwkgKiBXcml0ZSBhbGwgZGF0YSBpbiB0aGUgY29udHJvbGxlcidzIGJhdHRlcnktYmFja2VkIGNhY2hlIHRvCisJICogc3RvcmFnZS4KKwkgKi8KKwlyYyA9IHBxaV9mbHVzaF9jYWNoZShjdHJsX2luZm8pOworCWlmIChyYyA9PSAwKQorCQlyZXR1cm47CisKK2Vycm9yOgorCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCSJ1bmFibGUgdG8gZmx1c2ggY29udHJvbGxlciBjYWNoZVxuIik7Cit9CisKKy8qIERlZmluZSB0aGUgUENJIElEcyBmb3IgdGhlIGNvbnRyb2xsZXJzIHRoYXQgd2Ugc3VwcG9ydC4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwcWlfcGNpX2lkX3RhYmxlW10gPSB7CisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwMTEwKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNjAwKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNjAxKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNjAyKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNjAzKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNjUwKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNjUxKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNjUyKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNjUzKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNjU0KQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNjU1KQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNzAwKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgwNzAxKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwODAwKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwODAxKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwODAyKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwODAzKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwODA0KQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwODA1KQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwOTAwKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwOTAxKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwOTAyKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwOTAzKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwOTA0KQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwOTA1KQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9BREFQVEVDMiwgMHgwOTA2KQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgxMDAxKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgxMTAwKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgxMTAxKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgxMTAyKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX1ZFTkRPUl9JRF9IUCwgMHgxMTUwKQorCX0sCisJeworCQlQQ0lfREVWSUNFX1NVQihQQ0lfVkVORE9SX0lEX0FEQVBURUMyLCAweDAyOGYsCisJCQkgICAgICAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCkKKwl9LAorCXsgMCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcHFpX3BjaV9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBwcWlfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9IERSSVZFUl9OQU1FX1NIT1JULAorCS5pZF90YWJsZSA9IHBxaV9wY2lfaWRfdGFibGUsCisJLnByb2JlID0gcHFpX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gcHFpX3BjaV9yZW1vdmUsCisJLnNodXRkb3duID0gcHFpX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHFpX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlwcl9pbmZvKERSSVZFUl9OQU1FICJcbiIpOworCisJcHFpX3Nhc190cmFuc3BvcnRfdGVtcGxhdGUgPQorCQlzYXNfYXR0YWNoX3RyYW5zcG9ydCgmcHFpX3Nhc190cmFuc3BvcnRfZnVuY3Rpb25zKTsKKwlpZiAoIXBxaV9zYXNfdHJhbnNwb3J0X3RlbXBsYXRlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJjID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcHFpX3BjaV9kcml2ZXIpOworCWlmIChyYykKKwkJc2FzX3JlbGVhc2VfdHJhbnNwb3J0KHBxaV9zYXNfdHJhbnNwb3J0X3RlbXBsYXRlKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBxaV9jbGVhbnVwKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwcWlfcGNpX2RyaXZlcik7CisJc2FzX3JlbGVhc2VfdHJhbnNwb3J0KHBxaV9zYXNfdHJhbnNwb3J0X3RlbXBsYXRlKTsKK30KKworbW9kdWxlX2luaXQocHFpX2luaXQpOworbW9kdWxlX2V4aXQocHFpX2NsZWFudXApOworCitzdGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSB2ZXJpZnlfc3RydWN0dXJlcyh2b2lkKQoreworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2N0cmxfcmVnaXN0ZXJzLAorCQlzaXNfaG9zdF90b19jdHJsX2Rvb3JiZWxsKSAhPSAweDIwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9jdHJsX3JlZ2lzdGVycywKKwkJc2lzX2ludGVycnVwdF9tYXNrKSAhPSAweDM0KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9jdHJsX3JlZ2lzdGVycywKKwkJc2lzX2N0cmxfdG9faG9zdF9kb29yYmVsbCkgIT0gMHg5Yyk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfY3RybF9yZWdpc3RlcnMsCisJCXNpc19jdHJsX3RvX2hvc3RfZG9vcmJlbGxfY2xlYXIpICE9IDB4YTApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2N0cmxfcmVnaXN0ZXJzLAorCQlzaXNfZHJpdmVyX3NjcmF0Y2gpICE9IDB4YjApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2N0cmxfcmVnaXN0ZXJzLAorCQlzaXNfZmlybXdhcmVfc3RhdHVzKSAhPSAweGJjKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9jdHJsX3JlZ2lzdGVycywKKwkJc2lzX21haWxib3gpICE9IDB4MTAwMCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfY3RybF9yZWdpc3RlcnMsCisJCXBxaV9yZWdpc3RlcnMpICE9IDB4NDAwMCk7CisKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9pdV9oZWFkZXIsCisJCWl1X3R5cGUpICE9IDB4MCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfaXVfaGVhZGVyLAorCQlpdV9sZW5ndGgpICE9IDB4Mik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfaXVfaGVhZGVyLAorCQlyZXNwb25zZV9xdWV1ZV9pZCkgIT0gMHg0KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9pdV9oZWFkZXIsCisJCXdvcmtfYXJlYSkgIT0gMHg2KTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBwcWlfaXVfaGVhZGVyKSAhPSAweDgpOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfYWlvX2Vycm9yX2luZm8sCisJCXN0YXR1cykgIT0gMHgwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9haW9fZXJyb3JfaW5mbywKKwkJc2VydmljZV9yZXNwb25zZSkgIT0gMHgxKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9haW9fZXJyb3JfaW5mbywKKwkJZGF0YV9wcmVzZW50KSAhPSAweDIpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2Fpb19lcnJvcl9pbmZvLAorCQlyZXNlcnZlZCkgIT0gMHgzKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9haW9fZXJyb3JfaW5mbywKKwkJcmVzaWR1YWxfY291bnQpICE9IDB4NCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfYWlvX2Vycm9yX2luZm8sCisJCWRhdGFfbGVuZ3RoKSAhPSAweDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2Fpb19lcnJvcl9pbmZvLAorCQlyZXNlcnZlZDEpICE9IDB4YSk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfYWlvX2Vycm9yX2luZm8sCisJCWRhdGEpICE9IDB4Yyk7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgcHFpX2Fpb19lcnJvcl9pbmZvKSAhPSAweDEwYyk7CisKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9yYWlkX2Vycm9yX2luZm8sCisJCWRhdGFfaW5fcmVzdWx0KSAhPSAweDApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX3JhaWRfZXJyb3JfaW5mbywKKwkJZGF0YV9vdXRfcmVzdWx0KSAhPSAweDEpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX3JhaWRfZXJyb3JfaW5mbywKKwkJcmVzZXJ2ZWQpICE9IDB4Mik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvLAorCQlzdGF0dXMpICE9IDB4NSk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvLAorCQlzdGF0dXNfcXVhbGlmaWVyKSAhPSAweDYpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX3JhaWRfZXJyb3JfaW5mbywKKwkJc2Vuc2VfZGF0YV9sZW5ndGgpICE9IDB4OCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvLAorCQlyZXNwb25zZV9kYXRhX2xlbmd0aCkgIT0gMHhhKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9yYWlkX2Vycm9yX2luZm8sCisJCWRhdGFfaW5fdHJhbnNmZXJyZWQpICE9IDB4Yyk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvLAorCQlkYXRhX291dF90cmFuc2ZlcnJlZCkgIT0gMHgxMCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvLAorCQlkYXRhKSAhPSAweDE0KTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBwcWlfcmFpZF9lcnJvcl9pbmZvKSAhPSAweDExNCk7CisKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzLAorCQlzaWduYXR1cmUpICE9IDB4MCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX3JlZ2lzdGVycywKKwkJZnVuY3Rpb25fYW5kX3N0YXR1c19jb2RlKSAhPSAweDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9yZWdpc3RlcnMsCisJCW1heF9hZG1pbl9pcV9lbGVtZW50cykgIT0gMHgxMCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX3JlZ2lzdGVycywKKwkJbWF4X2FkbWluX29xX2VsZW1lbnRzKSAhPSAweDExKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzLAorCQlhZG1pbl9pcV9lbGVtZW50X2xlbmd0aCkgIT0gMHgxMik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX3JlZ2lzdGVycywKKwkJYWRtaW5fb3FfZWxlbWVudF9sZW5ndGgpICE9IDB4MTMpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9yZWdpc3RlcnMsCisJCW1heF9yZXNldF90aW1lb3V0KSAhPSAweDE0KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzLAorCQlsZWdhY3lfaW50eF9zdGF0dXMpICE9IDB4MTgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9yZWdpc3RlcnMsCisJCWxlZ2FjeV9pbnR4X21hc2tfc2V0KSAhPSAweDFjKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzLAorCQlsZWdhY3lfaW50eF9tYXNrX2NsZWFyKSAhPSAweDIwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzLAorCQlkZXZpY2Vfc3RhdHVzKSAhPSAweDQwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzLAorCQlhZG1pbl9pcV9waV9vZmZzZXQpICE9IDB4NDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9yZWdpc3RlcnMsCisJCWFkbWluX29xX2NpX29mZnNldCkgIT0gMHg1MCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX3JlZ2lzdGVycywKKwkJYWRtaW5faXFfZWxlbWVudF9hcnJheV9hZGRyKSAhPSAweDU4KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzLAorCQlhZG1pbl9vcV9lbGVtZW50X2FycmF5X2FkZHIpICE9IDB4NjApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9yZWdpc3RlcnMsCisJCWFkbWluX2lxX2NpX2FkZHIpICE9IDB4NjgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9yZWdpc3RlcnMsCisJCWFkbWluX29xX3BpX2FkZHIpICE9IDB4NzApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9yZWdpc3RlcnMsCisJCWFkbWluX2lxX251bV9lbGVtZW50cykgIT0gMHg3OCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX3JlZ2lzdGVycywKKwkJYWRtaW5fb3FfbnVtX2VsZW1lbnRzKSAhPSAweDc5KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzLAorCQlhZG1pbl9xdWV1ZV9pbnRfbXNnX251bSkgIT0gMHg3YSk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX3JlZ2lzdGVycywKKwkJZGV2aWNlX2Vycm9yKSAhPSAweDgwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzLAorCQllcnJvcl9kZXRhaWxzKSAhPSAweDg4KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfcmVnaXN0ZXJzLAorCQlkZXZpY2VfcmVzZXQpICE9IDB4OTApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9yZWdpc3RlcnMsCisJCXBvd2VyX2FjdGlvbikgIT0gMHg5NCk7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgcHFpX2RldmljZV9yZWdpc3RlcnMpICE9IDB4MTAwKTsKKworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJaGVhZGVyLml1X3R5cGUpICE9IDApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJaGVhZGVyLml1X2xlbmd0aCkgIT0gMik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXF1ZXN0LAorCQloZWFkZXIud29ya19hcmVhKSAhPSA2KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3JlcXVlc3QsCisJCXJlcXVlc3RfaWQpICE9IDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZnVuY3Rpb25fY29kZSkgIT0gMTApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5yZXBvcnRfZGV2aWNlX2NhcGFiaWxpdHkuYnVmZmVyX2xlbmd0aCkgIT0gNDQpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5yZXBvcnRfZGV2aWNlX2NhcGFiaWxpdHkuc2dfZGVzY3JpcHRvcikgIT0gNDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfaXEucXVldWVfaWQpICE9IDEyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3JlcXVlc3QsCisJCWRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX2lxLmVsZW1lbnRfYXJyYXlfYWRkcikgIT0gMTYpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfaXEuY2lfYWRkcikgIT0gMjQpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfaXEubnVtX2VsZW1lbnRzKSAhPSAzMik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXF1ZXN0LAorCQlkYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9pcS5lbGVtZW50X2xlbmd0aCkgIT0gMzQpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfaXEucXVldWVfcHJvdG9jb2wpICE9IDM2KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3JlcXVlc3QsCisJCWRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX29xLnF1ZXVlX2lkKSAhPSAxMik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXF1ZXN0LAorCQlkYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9vcS5lbGVtZW50X2FycmF5X2FkZHIpICE9IDE2KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3JlcXVlc3QsCisJCWRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX29xLnBpX2FkZHIpICE9IDI0KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3JlcXVlc3QsCisJCWRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX29xLm51bV9lbGVtZW50cykgIT0gMzIpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfb3EuZWxlbWVudF9sZW5ndGgpICE9IDM0KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3JlcXVlc3QsCisJCWRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX29xLnF1ZXVlX3Byb3RvY29sKSAhPSAzNik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXF1ZXN0LAorCQlkYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9vcS5pbnRfbXNnX251bSkgIT0gNDApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfb3EuY29hbGVzY2luZ19jb3VudCkgIT0gNDIpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfb3EubWluX2NvYWxlc2NpbmdfdGltZSkgIT0gNDQpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfb3EubWF4X2NvYWxlc2NpbmdfdGltZSkgIT0gNDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5kZWxldGVfb3BlcmF0aW9uYWxfcXVldWUucXVldWVfaWQpICE9IDEyKTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXF1ZXN0KSAhPSA2NCk7CisJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVxdWVzdCwKKwkJZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfaXEpICE9IDY0IC0gMTEpOworCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3JlcXVlc3QsCisJCWRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX29xKSAhPSA2NCAtIDExKTsKKwlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXF1ZXN0LAorCQlkYXRhLmRlbGV0ZV9vcGVyYXRpb25hbF9xdWV1ZSkgIT0gNjQgLSAxMSk7CisKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3Jlc3BvbnNlLAorCQloZWFkZXIuaXVfdHlwZSkgIT0gMCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXNwb25zZSwKKwkJaGVhZGVyLml1X2xlbmd0aCkgIT0gMik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXNwb25zZSwKKwkJaGVhZGVyLndvcmtfYXJlYSkgIT0gNik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXNwb25zZSwKKwkJcmVxdWVzdF9pZCkgIT0gOCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXNwb25zZSwKKwkJZnVuY3Rpb25fY29kZSkgIT0gMTApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVzcG9uc2UsCisJCXN0YXR1cykgIT0gMTEpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfYWRtaW5fcmVzcG9uc2UsCisJCWRhdGEuY3JlYXRlX29wZXJhdGlvbmFsX2lxLnN0YXR1c19kZXNjcmlwdG9yKSAhPSAxMik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXNwb25zZSwKKwkJZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfaXEuaXFfcGlfb2Zmc2V0KSAhPSAxNik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXNwb25zZSwKKwkJZGF0YS5jcmVhdGVfb3BlcmF0aW9uYWxfb3Euc3RhdHVzX2Rlc2NyaXB0b3IpICE9IDEyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX2FkbWluX3Jlc3BvbnNlLAorCQlkYXRhLmNyZWF0ZV9vcGVyYXRpb25hbF9vcS5vcV9jaV9vZmZzZXQpICE9IDE2KTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9hZG1pbl9yZXNwb25zZSkgIT0gNjQpOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QsCisJCWhlYWRlci5pdV90eXBlKSAhPSAwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCwKKwkJaGVhZGVyLml1X2xlbmd0aCkgIT0gMik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QsCisJCWhlYWRlci5yZXNwb25zZV9xdWV1ZV9pZCkgIT0gNCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QsCisJCWhlYWRlci53b3JrX2FyZWEpICE9IDYpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX3JhaWRfcGF0aF9yZXF1ZXN0LAorCQlyZXF1ZXN0X2lkKSAhPSA4KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCwKKwkJbmV4dXNfaWQpICE9IDEwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCwKKwkJYnVmZmVyX2xlbmd0aCkgIT0gMTIpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX3JhaWRfcGF0aF9yZXF1ZXN0LAorCQlsdW5fbnVtYmVyKSAhPSAxNik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QsCisJCXByb3RvY29sX3NwZWNpZmljKSAhPSAyNCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QsCisJCWVycm9yX2luZGV4KSAhPSAyNyk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfcmFpZF9wYXRoX3JlcXVlc3QsCisJCWNkYikgIT0gMzIpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX3JhaWRfcGF0aF9yZXF1ZXN0LAorCQlzZ19kZXNjcmlwdG9ycykgIT0gNjQpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHBxaV9yYWlkX3BhdGhfcmVxdWVzdCkgIT0KKwkJUFFJX09QRVJBVElPTkFMX0lRX0VMRU1FTlRfTEVOR1RIKTsKKworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2Fpb19wYXRoX3JlcXVlc3QsCisJCWhlYWRlci5pdV90eXBlKSAhPSAwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9haW9fcGF0aF9yZXF1ZXN0LAorCQloZWFkZXIuaXVfbGVuZ3RoKSAhPSAyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9haW9fcGF0aF9yZXF1ZXN0LAorCQloZWFkZXIucmVzcG9uc2VfcXVldWVfaWQpICE9IDQpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2Fpb19wYXRoX3JlcXVlc3QsCisJCWhlYWRlci53b3JrX2FyZWEpICE9IDYpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2Fpb19wYXRoX3JlcXVlc3QsCisJCXJlcXVlc3RfaWQpICE9IDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2Fpb19wYXRoX3JlcXVlc3QsCisJCW5leHVzX2lkKSAhPSAxMik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfYWlvX3BhdGhfcmVxdWVzdCwKKwkJYnVmZmVyX2xlbmd0aCkgIT0gMTYpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2Fpb19wYXRoX3JlcXVlc3QsCisJCWRhdGFfZW5jcnlwdGlvbl9rZXlfaW5kZXgpICE9IDIyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9haW9fcGF0aF9yZXF1ZXN0LAorCQllbmNyeXB0X3R3ZWFrX2xvd2VyKSAhPSAyNCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfYWlvX3BhdGhfcmVxdWVzdCwKKwkJZW5jcnlwdF90d2Vha191cHBlcikgIT0gMjgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2Fpb19wYXRoX3JlcXVlc3QsCisJCWNkYikgIT0gMzIpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2Fpb19wYXRoX3JlcXVlc3QsCisJCWVycm9yX2luZGV4KSAhPSA0OCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfYWlvX3BhdGhfcmVxdWVzdCwKKwkJbnVtX3NnX2Rlc2NyaXB0b3JzKSAhPSA1MCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfYWlvX3BhdGhfcmVxdWVzdCwKKwkJY2RiX2xlbmd0aCkgIT0gNTEpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2Fpb19wYXRoX3JlcXVlc3QsCisJCWx1bl9udW1iZXIpICE9IDUyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9haW9fcGF0aF9yZXF1ZXN0LAorCQlzZ19kZXNjcmlwdG9ycykgIT0gNjQpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHBxaV9haW9fcGF0aF9yZXF1ZXN0KSAhPQorCQlQUUlfT1BFUkFUSU9OQUxfSVFfRUxFTUVOVF9MRU5HVEgpOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfaW9fcmVzcG9uc2UsCisJCWhlYWRlci5pdV90eXBlKSAhPSAwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9pb19yZXNwb25zZSwKKwkJaGVhZGVyLml1X2xlbmd0aCkgIT0gMik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfaW9fcmVzcG9uc2UsCisJCXJlcXVlc3RfaWQpICE9IDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2lvX3Jlc3BvbnNlLAorCQllcnJvcl9pbmRleCkgIT0gMTApOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9tYW5hZ2VtZW50X3JlcXVlc3QsCisJCWhlYWRlci5pdV90eXBlKSAhPSAwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX21hbmFnZW1lbnRfcmVxdWVzdCwKKwkJaGVhZGVyLml1X2xlbmd0aCkgIT0gMik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9tYW5hZ2VtZW50X3JlcXVlc3QsCisJCWhlYWRlci5yZXNwb25zZV9xdWV1ZV9pZCkgIT0gNCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZ2VuZXJhbF9tYW5hZ2VtZW50X3JlcXVlc3QsCisJCXJlcXVlc3RfaWQpICE9IDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfbWFuYWdlbWVudF9yZXF1ZXN0LAorCQlkYXRhLnJlcG9ydF9ldmVudF9jb25maWd1cmF0aW9uLmJ1ZmZlcl9sZW5ndGgpICE9IDEyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX21hbmFnZW1lbnRfcmVxdWVzdCwKKwkJZGF0YS5yZXBvcnRfZXZlbnRfY29uZmlndXJhdGlvbi5zZ19kZXNjcmlwdG9ycykgIT0gMTYpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfbWFuYWdlbWVudF9yZXF1ZXN0LAorCQlkYXRhLnNldF9ldmVudF9jb25maWd1cmF0aW9uLmdsb2JhbF9ldmVudF9vcV9pZCkgIT0gMTApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2dlbmVyYWxfbWFuYWdlbWVudF9yZXF1ZXN0LAorCQlkYXRhLnNldF9ldmVudF9jb25maWd1cmF0aW9uLmJ1ZmZlcl9sZW5ndGgpICE9IDEyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9nZW5lcmFsX21hbmFnZW1lbnRfcmVxdWVzdCwKKwkJZGF0YS5zZXRfZXZlbnRfY29uZmlndXJhdGlvbi5zZ19kZXNjcmlwdG9ycykgIT0gMTYpOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfaXVfbGF5ZXJfZGVzY3JpcHRvciwKKwkJbWF4X2luYm91bmRfaXVfbGVuZ3RoKSAhPSA2KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9pdV9sYXllcl9kZXNjcmlwdG9yLAorCQltYXhfb3V0Ym91bmRfaXVfbGVuZ3RoKSAhPSAxNCk7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgcHFpX2l1X2xheWVyX2Rlc2NyaXB0b3IpICE9IDE2KTsKKworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9jYXBhYmlsaXR5LAorCQlkYXRhX2xlbmd0aCkgIT0gMCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX2NhcGFiaWxpdHksCisJCWlxX2FyYml0cmF0aW9uX3ByaW9yaXR5X3N1cHBvcnRfYml0bWFzaykgIT0gOCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX2NhcGFiaWxpdHksCisJCW1heGltdW1fYXdfYSkgIT0gOSk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX2NhcGFiaWxpdHksCisJCW1heGltdW1fYXdfYikgIT0gMTApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9jYXBhYmlsaXR5LAorCQltYXhpbXVtX2F3X2MpICE9IDExKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfY2FwYWJpbGl0eSwKKwkJbWF4X2luYm91bmRfcXVldWVzKSAhPSAxNik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX2NhcGFiaWxpdHksCisJCW1heF9lbGVtZW50c19wZXJfaXEpICE9IDE4KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfY2FwYWJpbGl0eSwKKwkJbWF4X2lxX2VsZW1lbnRfbGVuZ3RoKSAhPSAyNCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX2NhcGFiaWxpdHksCisJCW1pbl9pcV9lbGVtZW50X2xlbmd0aCkgIT0gMjYpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9jYXBhYmlsaXR5LAorCQltYXhfb3V0Ym91bmRfcXVldWVzKSAhPSAzMCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX2NhcGFiaWxpdHksCisJCW1heF9lbGVtZW50c19wZXJfb3EpICE9IDMyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfY2FwYWJpbGl0eSwKKwkJaW50cl9jb2FsZXNjaW5nX3RpbWVfZ3JhbnVsYXJpdHkpICE9IDM0KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9kZXZpY2VfY2FwYWJpbGl0eSwKKwkJbWF4X29xX2VsZW1lbnRfbGVuZ3RoKSAhPSAzNik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZGV2aWNlX2NhcGFiaWxpdHksCisJCW1pbl9vcV9lbGVtZW50X2xlbmd0aCkgIT0gMzgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2RldmljZV9jYXBhYmlsaXR5LAorCQlpdV9sYXllcl9kZXNjcmlwdG9ycykgIT0gNjQpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHBxaV9kZXZpY2VfY2FwYWJpbGl0eSkgIT0gNTc2KTsKKworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2V2ZW50X2Rlc2NyaXB0b3IsCisJCWV2ZW50X3R5cGUpICE9IDApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2V2ZW50X2Rlc2NyaXB0b3IsCisJCW9xX2lkKSAhPSAyKTsKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBwcWlfZXZlbnRfZGVzY3JpcHRvcikgIT0gNCk7CisKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9ldmVudF9jb25maWcsCisJCW51bV9ldmVudF9kZXNjcmlwdG9ycykgIT0gMik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZXZlbnRfY29uZmlnLAorCQlkZXNjcmlwdG9ycykgIT0gNCk7CisKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9ldmVudF9yZXNwb25zZSwKKwkJaGVhZGVyLml1X3R5cGUpICE9IDApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2V2ZW50X3Jlc3BvbnNlLAorCQloZWFkZXIuaXVfbGVuZ3RoKSAhPSAyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9ldmVudF9yZXNwb25zZSwKKwkJZXZlbnRfdHlwZSkgIT0gOCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZXZlbnRfcmVzcG9uc2UsCisJCWV2ZW50X2lkKSAhPSAxMCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZXZlbnRfcmVzcG9uc2UsCisJCWFkZGl0aW9uYWxfZXZlbnRfaWQpICE9IDEyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV9ldmVudF9yZXNwb25zZSwKKwkJZGF0YSkgIT0gMTYpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHBxaV9ldmVudF9yZXNwb25zZSkgIT0gMzIpOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZXZlbnRfYWNrbm93bGVkZ2VfcmVxdWVzdCwKKwkJaGVhZGVyLml1X3R5cGUpICE9IDApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2V2ZW50X2Fja25vd2xlZGdlX3JlcXVlc3QsCisJCWhlYWRlci5pdV9sZW5ndGgpICE9IDIpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2V2ZW50X2Fja25vd2xlZGdlX3JlcXVlc3QsCisJCWV2ZW50X3R5cGUpICE9IDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX2V2ZW50X2Fja25vd2xlZGdlX3JlcXVlc3QsCisJCWV2ZW50X2lkKSAhPSAxMCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfZXZlbnRfYWNrbm93bGVkZ2VfcmVxdWVzdCwKKwkJYWRkaXRpb25hbF9ldmVudF9pZCkgIT0gMTIpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHBxaV9ldmVudF9hY2tub3dsZWRnZV9yZXF1ZXN0KSAhPSAxNik7CisKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV90YXNrX21hbmFnZW1lbnRfcmVxdWVzdCwKKwkJaGVhZGVyLml1X3R5cGUpICE9IDApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX3Rhc2tfbWFuYWdlbWVudF9yZXF1ZXN0LAorCQloZWFkZXIuaXVfbGVuZ3RoKSAhPSAyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV90YXNrX21hbmFnZW1lbnRfcmVxdWVzdCwKKwkJcmVxdWVzdF9pZCkgIT0gOCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfdGFza19tYW5hZ2VtZW50X3JlcXVlc3QsCisJCW5leHVzX2lkKSAhPSAxMCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfdGFza19tYW5hZ2VtZW50X3JlcXVlc3QsCisJCWx1bl9udW1iZXIpICE9IDE2KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV90YXNrX21hbmFnZW1lbnRfcmVxdWVzdCwKKwkJcHJvdG9jb2xfc3BlY2lmaWMpICE9IDI0KTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV90YXNrX21hbmFnZW1lbnRfcmVxdWVzdCwKKwkJb3V0Ym91bmRfcXVldWVfaWRfdG9fbWFuYWdlKSAhPSAyNik7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfdGFza19tYW5hZ2VtZW50X3JlcXVlc3QsCisJCXJlcXVlc3RfaWRfdG9fbWFuYWdlKSAhPSAyOCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfdGFza19tYW5hZ2VtZW50X3JlcXVlc3QsCisJCXRhc2tfbWFuYWdlbWVudF9mdW5jdGlvbikgIT0gMzApOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHBxaV90YXNrX21hbmFnZW1lbnRfcmVxdWVzdCkgIT0gMzIpOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfdGFza19tYW5hZ2VtZW50X3Jlc3BvbnNlLAorCQloZWFkZXIuaXVfdHlwZSkgIT0gMCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBwcWlfdGFza19tYW5hZ2VtZW50X3Jlc3BvbnNlLAorCQloZWFkZXIuaXVfbGVuZ3RoKSAhPSAyKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV90YXNrX21hbmFnZW1lbnRfcmVzcG9uc2UsCisJCXJlcXVlc3RfaWQpICE9IDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX3Rhc2tfbWFuYWdlbWVudF9yZXNwb25zZSwKKwkJbmV4dXNfaWQpICE9IDEwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHBxaV90YXNrX21hbmFnZW1lbnRfcmVzcG9uc2UsCisJCWFkZGl0aW9uYWxfcmVzcG9uc2VfaW5mbykgIT0gMTIpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgcHFpX3Rhc2tfbWFuYWdlbWVudF9yZXNwb25zZSwKKwkJcmVzcG9uc2VfY29kZSkgIT0gMTUpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHBxaV90YXNrX21hbmFnZW1lbnRfcmVzcG9uc2UpICE9IDE2KTsKKworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYm1pY19pZGVudGlmeV9jb250cm9sbGVyLAorCQljb25maWd1cmVkX2xvZ2ljYWxfZHJpdmVfY291bnQpICE9IDApOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYm1pY19pZGVudGlmeV9jb250cm9sbGVyLAorCQljb25maWd1cmF0aW9uX3NpZ25hdHVyZSkgIT0gMSk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBibWljX2lkZW50aWZ5X2NvbnRyb2xsZXIsCisJCWZpcm13YXJlX3ZlcnNpb24pICE9IDUpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgYm1pY19pZGVudGlmeV9jb250cm9sbGVyLAorCQlleHRlbmRlZF9sb2dpY2FsX3VuaXRfY291bnQpICE9IDE1NCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBibWljX2lkZW50aWZ5X2NvbnRyb2xsZXIsCisJCWZpcm13YXJlX2J1aWxkX251bWJlcikgIT0gMTkwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGJtaWNfaWRlbnRpZnlfY29udHJvbGxlciwKKwkJY29udHJvbGxlcl9tb2RlKSAhPSAyOTIpOworCisJQlVJTERfQlVHX09OKFBRSV9BRE1JTl9JUV9OVU1fRUxFTUVOVFMgPiAyNTUpOworCUJVSUxEX0JVR19PTihQUUlfQURNSU5fT1FfTlVNX0VMRU1FTlRTID4gMjU1KTsKKwlCVUlMRF9CVUdfT04oUFFJX0FETUlOX0lRX0VMRU1FTlRfTEVOR1RIICUKKwkJUFFJX1FVRVVFX0VMRU1FTlRfTEVOR1RIX0FMSUdOTUVOVCAhPSAwKTsKKwlCVUlMRF9CVUdfT04oUFFJX0FETUlOX09RX0VMRU1FTlRfTEVOR1RIICUKKwkJUFFJX1FVRVVFX0VMRU1FTlRfTEVOR1RIX0FMSUdOTUVOVCAhPSAwKTsKKwlCVUlMRF9CVUdfT04oUFFJX09QRVJBVElPTkFMX0lRX0VMRU1FTlRfTEVOR1RIID4gMTA0ODU2MCk7CisJQlVJTERfQlVHX09OKFBRSV9PUEVSQVRJT05BTF9JUV9FTEVNRU5UX0xFTkdUSCAlCisJCVBRSV9RVUVVRV9FTEVNRU5UX0xFTkdUSF9BTElHTk1FTlQgIT0gMCk7CisJQlVJTERfQlVHX09OKFBRSV9PUEVSQVRJT05BTF9PUV9FTEVNRU5UX0xFTkdUSCA+IDEwNDg1NjApOworCUJVSUxEX0JVR19PTihQUUlfT1BFUkFUSU9OQUxfT1FfRUxFTUVOVF9MRU5HVEggJQorCQlQUUlfUVVFVUVfRUxFTUVOVF9MRU5HVEhfQUxJR05NRU5UICE9IDApOworCisJQlVJTERfQlVHX09OKFBRSV9SRVNFUlZFRF9JT19TTE9UUyA+PSBQUUlfTUFYX09VVFNUQU5ESU5HX1JFUVVFU1RTKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zbWFydHBxaS9zbWFydHBxaV9zYXNfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3Njc2kvc21hcnRwcWkvc21hcnRwcWlfc2FzX3RyYW5zcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyY2E0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc21hcnRwcWkvc21hcnRwcWlfc2FzX3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogICAgZHJpdmVyIGZvciBNaWNyb3NlbWkgUFFJLWJhc2VkIHN0b3JhZ2UgY29udHJvbGxlcnMKKyAqICAgIENvcHlyaWdodCAoYykgMjAxNiBNaWNyb3NlbWkgQ29ycG9yYXRpb24KKyAqICAgIENvcHlyaWdodCAoYykgMjAxNiBQTUMtU2llcnJhLCBJbmMuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiAgICBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgIFF1ZXN0aW9ucy9Db21tZW50cy9CdWdmaXhlcyB0byBlc2Muc3RvcmFnZWRldkBtaWNyb3NlbWkuY29tCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaD4KKyNpbmNsdWRlICJzbWFydHBxaS5oIgorCitzdGF0aWMgc3RydWN0IHBxaV9zYXNfcGh5ICpwcWlfYWxsb2Nfc2FzX3BoeShzdHJ1Y3QgcHFpX3Nhc19wb3J0ICpwcWlfc2FzX3BvcnQpCit7CisJc3RydWN0IHBxaV9zYXNfcGh5ICpwcWlfc2FzX3BoeTsKKwlzdHJ1Y3Qgc2FzX3BoeSAqcGh5OworCisJcHFpX3Nhc19waHkgPSBremFsbG9jKHNpemVvZigqcHFpX3Nhc19waHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBxaV9zYXNfcGh5KQorCQlyZXR1cm4gTlVMTDsKKworCXBoeSA9IHNhc19waHlfYWxsb2MocHFpX3Nhc19wb3J0LT5wYXJlbnRfbm9kZS0+cGFyZW50X2RldiwKKwkJcHFpX3Nhc19wb3J0LT5uZXh0X3BoeV9pbmRleCk7CisJaWYgKCFwaHkpIHsKKwkJa2ZyZWUocHFpX3Nhc19waHkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwcWlfc2FzX3BvcnQtPm5leHRfcGh5X2luZGV4Kys7CisJcHFpX3Nhc19waHktPnBoeSA9IHBoeTsKKwlwcWlfc2FzX3BoeS0+cGFyZW50X3BvcnQgPSBwcWlfc2FzX3BvcnQ7CisKKwlyZXR1cm4gcHFpX3Nhc19waHk7Cit9CisKK3N0YXRpYyB2b2lkIHBxaV9mcmVlX3Nhc19waHkoc3RydWN0IHBxaV9zYXNfcGh5ICpwcWlfc2FzX3BoeSkKK3sKKwlzdHJ1Y3Qgc2FzX3BoeSAqcGh5ID0gcHFpX3Nhc19waHktPnBoeTsKKworCXNhc19wb3J0X2RlbGV0ZV9waHkocHFpX3Nhc19waHktPnBhcmVudF9wb3J0LT5wb3J0LCBwaHkpOworCXNhc19waHlfZnJlZShwaHkpOworCWlmIChwcWlfc2FzX3BoeS0+YWRkZWRfdG9fcG9ydCkKKwkJbGlzdF9kZWwoJnBxaV9zYXNfcGh5LT5waHlfbGlzdF9lbnRyeSk7CisJa2ZyZWUocHFpX3Nhc19waHkpOworfQorCitzdGF0aWMgaW50IHBxaV9zYXNfcG9ydF9hZGRfcGh5KHN0cnVjdCBwcWlfc2FzX3BoeSAqcHFpX3Nhc19waHkpCit7CisJaW50IHJjOworCXN0cnVjdCBwcWlfc2FzX3BvcnQgKnBxaV9zYXNfcG9ydDsKKwlzdHJ1Y3Qgc2FzX3BoeSAqcGh5OworCXN0cnVjdCBzYXNfaWRlbnRpZnkgKmlkZW50aWZ5OworCisJcHFpX3Nhc19wb3J0ID0gcHFpX3Nhc19waHktPnBhcmVudF9wb3J0OworCXBoeSA9IHBxaV9zYXNfcGh5LT5waHk7CisKKwlpZGVudGlmeSA9ICZwaHktPmlkZW50aWZ5OworCW1lbXNldChpZGVudGlmeSwgMCwgc2l6ZW9mKCppZGVudGlmeSkpOworCWlkZW50aWZ5LT5zYXNfYWRkcmVzcyA9IHBxaV9zYXNfcG9ydC0+c2FzX2FkZHJlc3M7CisJaWRlbnRpZnktPmRldmljZV90eXBlID0gU0FTX0VORF9ERVZJQ0U7CisJaWRlbnRpZnktPmluaXRpYXRvcl9wb3J0X3Byb3RvY29scyA9IFNBU19QUk9UT0NPTF9TVFA7CisJaWRlbnRpZnktPnRhcmdldF9wb3J0X3Byb3RvY29scyA9IFNBU19QUk9UT0NPTF9TVFA7CisJcGh5LT5taW5pbXVtX2xpbmtyYXRlX2h3ID0gU0FTX0xJTktfUkFURV9VTktOT1dOOworCXBoeS0+bWF4aW11bV9saW5rcmF0ZV9odyA9IFNBU19MSU5LX1JBVEVfVU5LTk9XTjsKKwlwaHktPm1pbmltdW1fbGlua3JhdGUgPSBTQVNfTElOS19SQVRFX1VOS05PV047CisJcGh5LT5tYXhpbXVtX2xpbmtyYXRlID0gU0FTX0xJTktfUkFURV9VTktOT1dOOworCXBoeS0+bmVnb3RpYXRlZF9saW5rcmF0ZSA9IFNBU19MSU5LX1JBVEVfVU5LTk9XTjsKKworCXJjID0gc2FzX3BoeV9hZGQocHFpX3Nhc19waHktPnBoeSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlzYXNfcG9ydF9hZGRfcGh5KHBxaV9zYXNfcG9ydC0+cG9ydCwgcHFpX3Nhc19waHktPnBoeSk7CisJbGlzdF9hZGRfdGFpbCgmcHFpX3Nhc19waHktPnBoeV9saXN0X2VudHJ5LAorCQkmcHFpX3Nhc19wb3J0LT5waHlfbGlzdF9oZWFkKTsKKwlwcWlfc2FzX3BoeS0+YWRkZWRfdG9fcG9ydCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcWlfc2FzX3BvcnRfYWRkX3JwaHkoc3RydWN0IHBxaV9zYXNfcG9ydCAqcHFpX3Nhc19wb3J0LAorCXN0cnVjdCBzYXNfcnBoeSAqcnBoeSkKK3sKKwlzdHJ1Y3Qgc2FzX2lkZW50aWZ5ICppZGVudGlmeTsKKworCWlkZW50aWZ5ID0gJnJwaHktPmlkZW50aWZ5OworCWlkZW50aWZ5LT5zYXNfYWRkcmVzcyA9IHBxaV9zYXNfcG9ydC0+c2FzX2FkZHJlc3M7CisJaWRlbnRpZnktPmluaXRpYXRvcl9wb3J0X3Byb3RvY29scyA9IFNBU19QUk9UT0NPTF9TVFA7CisJaWRlbnRpZnktPnRhcmdldF9wb3J0X3Byb3RvY29scyA9IFNBU19QUk9UT0NPTF9TVFA7CisKKwlyZXR1cm4gc2FzX3JwaHlfYWRkKHJwaHkpOworfQorCitzdGF0aWMgc3RydWN0IHBxaV9zYXNfcG9ydCAqcHFpX2FsbG9jX3Nhc19wb3J0KAorCXN0cnVjdCBwcWlfc2FzX25vZGUgKnBxaV9zYXNfbm9kZSwgdTY0IHNhc19hZGRyZXNzKQoreworCWludCByYzsKKwlzdHJ1Y3QgcHFpX3Nhc19wb3J0ICpwcWlfc2FzX3BvcnQ7CisJc3RydWN0IHNhc19wb3J0ICpwb3J0OworCisJcHFpX3Nhc19wb3J0ID0ga3phbGxvYyhzaXplb2YoKnBxaV9zYXNfcG9ydCksIEdGUF9LRVJORUwpOworCWlmICghcHFpX3Nhc19wb3J0KQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTElTVF9IRUFEKCZwcWlfc2FzX3BvcnQtPnBoeV9saXN0X2hlYWQpOworCXBxaV9zYXNfcG9ydC0+cGFyZW50X25vZGUgPSBwcWlfc2FzX25vZGU7CisKKwlwb3J0ID0gc2FzX3BvcnRfYWxsb2NfbnVtKHBxaV9zYXNfbm9kZS0+cGFyZW50X2Rldik7CisJaWYgKCFwb3J0KQorCQlnb3RvIGZyZWVfcHFpX3BvcnQ7CisKKwlyYyA9IHNhc19wb3J0X2FkZChwb3J0KTsKKwlpZiAocmMpCisJCWdvdG8gZnJlZV9zYXNfcG9ydDsKKworCXBxaV9zYXNfcG9ydC0+cG9ydCA9IHBvcnQ7CisJcHFpX3Nhc19wb3J0LT5zYXNfYWRkcmVzcyA9IHNhc19hZGRyZXNzOworCWxpc3RfYWRkX3RhaWwoJnBxaV9zYXNfcG9ydC0+cG9ydF9saXN0X2VudHJ5LAorCQkmcHFpX3Nhc19ub2RlLT5wb3J0X2xpc3RfaGVhZCk7CisKKwlyZXR1cm4gcHFpX3Nhc19wb3J0OworCitmcmVlX3Nhc19wb3J0OgorCXNhc19wb3J0X2ZyZWUocG9ydCk7CitmcmVlX3BxaV9wb3J0OgorCWtmcmVlKHBxaV9zYXNfcG9ydCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcHFpX2ZyZWVfc2FzX3BvcnQoc3RydWN0IHBxaV9zYXNfcG9ydCAqcHFpX3Nhc19wb3J0KQoreworCXN0cnVjdCBwcWlfc2FzX3BoeSAqcHFpX3Nhc19waHk7CisJc3RydWN0IHBxaV9zYXNfcGh5ICpuZXh0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBxaV9zYXNfcGh5LCBuZXh0LAorCQkJJnBxaV9zYXNfcG9ydC0+cGh5X2xpc3RfaGVhZCwgcGh5X2xpc3RfZW50cnkpCisJCXBxaV9mcmVlX3Nhc19waHkocHFpX3Nhc19waHkpOworCisJc2FzX3BvcnRfZGVsZXRlKHBxaV9zYXNfcG9ydC0+cG9ydCk7CisJbGlzdF9kZWwoJnBxaV9zYXNfcG9ydC0+cG9ydF9saXN0X2VudHJ5KTsKKwlrZnJlZShwcWlfc2FzX3BvcnQpOworfQorCitzdGF0aWMgc3RydWN0IHBxaV9zYXNfbm9kZSAqcHFpX2FsbG9jX3Nhc19ub2RlKHN0cnVjdCBkZXZpY2UgKnBhcmVudF9kZXYpCit7CisJc3RydWN0IHBxaV9zYXNfbm9kZSAqcHFpX3Nhc19ub2RlOworCisJcHFpX3Nhc19ub2RlID0ga3phbGxvYyhzaXplb2YoKnBxaV9zYXNfbm9kZSksIEdGUF9LRVJORUwpOworCWlmIChwcWlfc2FzX25vZGUpIHsKKwkJcHFpX3Nhc19ub2RlLT5wYXJlbnRfZGV2ID0gcGFyZW50X2RldjsKKwkJSU5JVF9MSVNUX0hFQUQoJnBxaV9zYXNfbm9kZS0+cG9ydF9saXN0X2hlYWQpOworCX0KKworCXJldHVybiBwcWlfc2FzX25vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHBxaV9mcmVlX3Nhc19ub2RlKHN0cnVjdCBwcWlfc2FzX25vZGUgKnBxaV9zYXNfbm9kZSkKK3sKKwlzdHJ1Y3QgcHFpX3Nhc19wb3J0ICpwcWlfc2FzX3BvcnQ7CisJc3RydWN0IHBxaV9zYXNfcG9ydCAqbmV4dDsKKworCWlmICghcHFpX3Nhc19ub2RlKQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHFpX3Nhc19wb3J0LCBuZXh0LAorCQkJJnBxaV9zYXNfbm9kZS0+cG9ydF9saXN0X2hlYWQsIHBvcnRfbGlzdF9lbnRyeSkKKwkJcHFpX2ZyZWVfc2FzX3BvcnQocHFpX3Nhc19wb3J0KTsKKworCWtmcmVlKHBxaV9zYXNfbm9kZSk7Cit9CisKK3N0cnVjdCBwcWlfc2NzaV9kZXYgKnBxaV9maW5kX2RldmljZV9ieV9zYXNfcnBoeSgKKwlzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvLCBzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHkpCit7CisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXZpY2UsICZjdHJsX2luZm8tPnNjc2lfZGV2aWNlX2xpc3QsCisJCXNjc2lfZGV2aWNlX2xpc3RfZW50cnkpIHsKKwkJaWYgKCFkZXZpY2UtPnNhc19wb3J0KQorCQkJY29udGludWU7CisJCWlmIChkZXZpY2UtPnNhc19wb3J0LT5ycGh5ID09IHJwaHkpCisJCQlyZXR1cm4gZGV2aWNlOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQgcHFpX2FkZF9zYXNfaG9zdChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGRldmljZSAqcGFyZW50X2RldjsKKwlzdHJ1Y3QgcHFpX3Nhc19ub2RlICpwcWlfc2FzX25vZGU7CisJc3RydWN0IHBxaV9zYXNfcG9ydCAqcHFpX3Nhc19wb3J0OworCXN0cnVjdCBwcWlfc2FzX3BoeSAqcHFpX3Nhc19waHk7CisKKwlwYXJlbnRfZGV2ID0gJnNob3N0LT5zaG9zdF9nZW5kZXY7CisKKwlwcWlfc2FzX25vZGUgPSBwcWlfYWxsb2Nfc2FzX25vZGUocGFyZW50X2Rldik7CisJaWYgKCFwcWlfc2FzX25vZGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcHFpX3Nhc19wb3J0ID0gcHFpX2FsbG9jX3Nhc19wb3J0KHBxaV9zYXNfbm9kZSwgY3RybF9pbmZvLT5zYXNfYWRkcmVzcyk7CisJaWYgKCFwcWlfc2FzX3BvcnQpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfc2FzX25vZGU7CisJfQorCisJcHFpX3Nhc19waHkgPSBwcWlfYWxsb2Nfc2FzX3BoeShwcWlfc2FzX3BvcnQpOworCWlmICghcHFpX3Nhc19waHkpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfc2FzX3BvcnQ7CisJfQorCisJcmMgPSBwcWlfc2FzX3BvcnRfYWRkX3BoeShwcWlfc2FzX3BoeSk7CisJaWYgKHJjKQorCQlnb3RvIGZyZWVfc2FzX3BoeTsKKworCWN0cmxfaW5mby0+c2FzX2hvc3QgPSBwcWlfc2FzX25vZGU7CisKKwlyZXR1cm4gMDsKKworZnJlZV9zYXNfcGh5OgorCXBxaV9mcmVlX3Nhc19waHkocHFpX3Nhc19waHkpOworZnJlZV9zYXNfcG9ydDoKKwlwcWlfZnJlZV9zYXNfcG9ydChwcWlfc2FzX3BvcnQpOworZnJlZV9zYXNfbm9kZToKKwlwcWlfZnJlZV9zYXNfbm9kZShwcWlfc2FzX25vZGUpOworCisJcmV0dXJuIHJjOworfQorCit2b2lkIHBxaV9kZWxldGVfc2FzX2hvc3Qoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlwcWlfZnJlZV9zYXNfbm9kZShjdHJsX2luZm8tPnNhc19ob3N0KTsKK30KKworaW50IHBxaV9hZGRfc2FzX2RldmljZShzdHJ1Y3QgcHFpX3Nhc19ub2RlICpwcWlfc2FzX25vZGUsCisJc3RydWN0IHBxaV9zY3NpX2RldiAqZGV2aWNlKQoreworCWludCByYzsKKwlzdHJ1Y3QgcHFpX3Nhc19wb3J0ICpwcWlfc2FzX3BvcnQ7CisJc3RydWN0IHNhc19ycGh5ICpycGh5OworCisJcHFpX3Nhc19wb3J0ID0gcHFpX2FsbG9jX3Nhc19wb3J0KHBxaV9zYXNfbm9kZSwgZGV2aWNlLT5zYXNfYWRkcmVzcyk7CisJaWYgKCFwcWlfc2FzX3BvcnQpCisJCXJldHVybiAtRU5PTUVNOworCisJcnBoeSA9IHNhc19lbmRfZGV2aWNlX2FsbG9jKHBxaV9zYXNfcG9ydC0+cG9ydCk7CisJaWYgKCFycGh5KSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBmcmVlX3Nhc19wb3J0OworCX0KKworCXBxaV9zYXNfcG9ydC0+cnBoeSA9IHJwaHk7CisJZGV2aWNlLT5zYXNfcG9ydCA9IHBxaV9zYXNfcG9ydDsKKworCXJjID0gcHFpX3Nhc19wb3J0X2FkZF9ycGh5KHBxaV9zYXNfcG9ydCwgcnBoeSk7CisJaWYgKHJjKQorCQlnb3RvIGZyZWVfc2FzX3BvcnQ7CisKKwlyZXR1cm4gMDsKKworZnJlZV9zYXNfcG9ydDoKKwlwcWlfZnJlZV9zYXNfcG9ydChwcWlfc2FzX3BvcnQpOworCWRldmljZS0+c2FzX3BvcnQgPSBOVUxMOworCisJcmV0dXJuIHJjOworfQorCit2b2lkIHBxaV9yZW1vdmVfc2FzX2RldmljZShzdHJ1Y3QgcHFpX3Njc2lfZGV2ICpkZXZpY2UpCit7CisJaWYgKGRldmljZS0+c2FzX3BvcnQpIHsKKwkJcHFpX2ZyZWVfc2FzX3BvcnQoZGV2aWNlLT5zYXNfcG9ydCk7CisJCWRldmljZS0+c2FzX3BvcnQgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBwcWlfc2FzX2dldF9saW5rZXJyb3JzKHN0cnVjdCBzYXNfcGh5ICpwaHkpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3Nhc19nZXRfZW5jbG9zdXJlX2lkZW50aWZpZXIoc3RydWN0IHNhc19ycGh5ICpycGh5LAorCXU2NCAqaWRlbnRpZmllcikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcWlfc2FzX2dldF9iYXlfaWRlbnRpZmllcihzdHJ1Y3Qgc2FzX3JwaHkgKnJwaHkpCit7CisJcmV0dXJuIC1FTlhJTzsKK30KKworc3RhdGljIGludCBwcWlfc2FzX3BoeV9yZXNldChzdHJ1Y3Qgc2FzX3BoeSAqcGh5LCBpbnQgaGFyZF9yZXNldCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcWlfc2FzX3BoeV9lbmFibGUoc3RydWN0IHNhc19waHkgKnBoeSwgaW50IGVuYWJsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcWlfc2FzX3BoeV9zZXR1cChzdHJ1Y3Qgc2FzX3BoeSAqcGh5KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcWlfc2FzX3BoeV9yZWxlYXNlKHN0cnVjdCBzYXNfcGh5ICpwaHkpCit7Cit9CisKK3N0YXRpYyBpbnQgcHFpX3Nhc19waHlfc3BlZWQoc3RydWN0IHNhc19waHkgKnBoeSwKKwlzdHJ1Y3Qgc2FzX3BoeV9saW5rcmF0ZXMgKnJhdGVzKQoreworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBTTVAgPSBTZXJpYWwgTWFuYWdlbWVudCBQcm90b2NvbCAqLworCitzdGF0aWMgaW50IHBxaV9zYXNfc21wX2hhbmRsZXIoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHN0cnVjdCBzYXNfcnBoeSAqcnBoeSwKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdHJ1Y3Qgc2FzX2Z1bmN0aW9uX3RlbXBsYXRlIHBxaV9zYXNfdHJhbnNwb3J0X2Z1bmN0aW9ucyA9IHsKKwkuZ2V0X2xpbmtlcnJvcnMgPSBwcWlfc2FzX2dldF9saW5rZXJyb3JzLAorCS5nZXRfZW5jbG9zdXJlX2lkZW50aWZpZXIgPSBwcWlfc2FzX2dldF9lbmNsb3N1cmVfaWRlbnRpZmllciwKKwkuZ2V0X2JheV9pZGVudGlmaWVyID0gcHFpX3Nhc19nZXRfYmF5X2lkZW50aWZpZXIsCisJLnBoeV9yZXNldCA9IHBxaV9zYXNfcGh5X3Jlc2V0LAorCS5waHlfZW5hYmxlID0gcHFpX3Nhc19waHlfZW5hYmxlLAorCS5waHlfc2V0dXAgPSBwcWlfc2FzX3BoeV9zZXR1cCwKKwkucGh5X3JlbGVhc2UgPSBwcWlfc2FzX3BoeV9yZWxlYXNlLAorCS5zZXRfcGh5X3NwZWVkID0gcHFpX3Nhc19waHlfc3BlZWQsCisJLnNtcF9oYW5kbGVyID0gcHFpX3Nhc19zbXBfaGFuZGxlciwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc21hcnRwcWkvc21hcnRwcWlfc2lzLmMgYi9kcml2ZXJzL3Njc2kvc21hcnRwcWkvc21hcnRwcWlfc2lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0MDhmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2NzaS9zbWFydHBxaS9zbWFydHBxaV9zaXMuYwpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqICAgIGRyaXZlciBmb3IgTWljcm9zZW1pIFBRSS1iYXNlZCBzdG9yYWdlIGNvbnRyb2xsZXJzCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTYgTWljcm9zZW1pIENvcnBvcmF0aW9uCisgKiAgICBDb3B5cmlnaHQgKGMpIDIwMTYgUE1DLVNpZXJyYSwgSW5jLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogICAgTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICBRdWVzdGlvbnMvQ29tbWVudHMvQnVnZml4ZXMgdG8gZXNjLnN0b3JhZ2VkZXZAbWljcm9zZW1pLmNvbQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgInNtYXJ0cHFpLmgiCisjaW5jbHVkZSAic21hcnRwcWlfc2lzLmgiCisKKy8qIGxlZ2FjeSBTSVMgaW50ZXJmYWNlIGNvbW1hbmRzICovCisjZGVmaW5lIFNJU19DTURfR0VUX0FEQVBURVJfUFJPUEVSVElFUwkJMHgxOQorI2RlZmluZSBTSVNfQ01EX0lOSVRfQkFTRV9TVFJVQ1RfQUREUkVTUwkweDFiCisjZGVmaW5lIFNJU19DTURfR0VUX1BRSV9DQVBBQklMSVRJRVMJCTB4MzAwMAorCisvKiBmb3Igc3VibWlzc2lvbiBvZiBsZWdhY3kgU0lTIGNvbW1hbmRzICovCisjZGVmaW5lIFNJU19SRUVOQUJMRV9TSVNfTU9ERQkJCTB4MQorI2RlZmluZSBTSVNfRU5BQkxFX01TSVgJCQkJMHg0MAorI2RlZmluZSBTSVNfU09GVF9SRVNFVAkJCQkweDEwMAorI2RlZmluZSBTSVNfQ01EX1JFQURZCQkJCTB4MjAwCisjZGVmaW5lIFNJU19DTURfQ09NUExFVEUJCQkweDEwMDAKKyNkZWZpbmUgU0lTX0NMRUFSX0NUUkxfVE9fSE9TVF9ET09SQkVMTAkJMHgxMDAwCisjZGVmaW5lIFNJU19DTURfU1RBVFVTX1NVQ0NFU1MJCQkweDEKKyNkZWZpbmUgU0lTX0NNRF9DT01QTEVURV9USU1FT1VUX1NFQ1MJCTMwCisjZGVmaW5lIFNJU19DTURfQ09NUExFVEVfUE9MTF9JTlRFUlZBTF9NU0VDUwkxMAorCisvKiB1c2VkIHdpdGggU0lTX0NNRF9HRVRfQURBUFRFUl9QUk9QRVJUSUVTIGNvbW1hbmQgKi8KKyNkZWZpbmUgU0lTX0VYVEVOREVEX1BST1BFUlRJRVNfU1VQUE9SVEVECTB4ODAwMDAwCisjZGVmaW5lIFNJU19TTUFSVEFSUkFZX0ZFQVRVUkVTX1NVUFBPUlRFRAkweDIKKyNkZWZpbmUgU0lTX1BRSV9NT0RFX1NVUFBPUlRFRAkJCTB4NAorI2RlZmluZSBTSVNfUkVRVUlSRURfRVhURU5ERURfUFJPUEVSVElFUwlcCisJKFNJU19TTUFSVEFSUkFZX0ZFQVRVUkVTX1NVUFBPUlRFRCB8IFNJU19QUUlfTU9ERV9TVVBQT1JURUQpCisKKy8qIHVzZWQgd2l0aCBTSVNfQ01EX0lOSVRfQkFTRV9TVFJVQ1RfQUREUkVTUyBjb21tYW5kICovCisjZGVmaW5lIFNJU19CQVNFX1NUUlVDVF9SRVZJU0lPTgkJOQorI2RlZmluZSBTSVNfQkFTRV9TVFJVQ1RfQUxJR05NRU5UCQkxNgorCisjZGVmaW5lIFNJU19DVFJMX0tFUk5FTF9VUAkJCTB4ODAKKyNkZWZpbmUgU0lTX0NUUkxfS0VSTkVMX1BBTklDCQkJMHgxMDAKKyNkZWZpbmUgU0lTX0NUUkxfUkVBRFlfVElNRU9VVF9TRUNTCQkzMAorI2RlZmluZSBTSVNfQ1RSTF9SRUFEWV9QT0xMX0lOVEVSVkFMX01TRUNTCTEwCisKKyNwcmFnbWEgcGFjaygxKQorCisvKiBmb3IgdXNlIHdpdGggU0lTX0NNRF9JTklUX0JBU0VfU1RSVUNUX0FERFJFU1MgY29tbWFuZCAqLworc3RydWN0IHNpc19iYXNlX3N0cnVjdCB7CisJX19sZTMyCXJldmlzaW9uOwkJLyogcmV2aXNpb24gb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlfX2xlMzIJZmxhZ3M7CQkJLyogcmVzZXJ2ZWQgKi8KKwlfX2xlMzIJZXJyb3JfYnVmZmVyX3BhZGRyX2xvdzsJLyogbG93ZXIgMzIgYml0cyBvZiBwaHlzaWNhbCBtZW1vcnkgKi8KKwkJCQkJLyogYnVmZmVyIGZvciBQUUkgZXJyb3IgcmVzcG9uc2UgKi8KKwkJCQkJLyogZGF0YSAqLworCV9fbGUzMgllcnJvcl9idWZmZXJfcGFkZHJfaGlnaDsJLyogdXBwZXIgMzIgYml0cyBvZiBwaHlzaWNhbCAqLworCQkJCQkJLyogbWVtb3J5IGJ1ZmZlciBmb3IgUFFJICovCisJCQkJCQkvKiBlcnJvciByZXNwb25zZSBkYXRhICovCisJX19sZTMyCWVycm9yX2J1ZmZlcl9lbGVtZW50X2xlbmd0aDsJLyogbGVuZ3RoIG9mIGVhY2ggUFFJIGVycm9yICovCisJCQkJCQkvKiByZXNwb25zZSBidWZmZXIgZWxlbWVudCAqLworCQkJCQkJLyogICBpbiBieXRlcyAqLworCV9fbGUzMgllcnJvcl9idWZmZXJfbnVtX2VsZW1lbnRzOwkvKiB0b3RhbCBudW1iZXIgb2YgUFFJIGVycm9yICovCisJCQkJCQkvKiByZXNwb25zZSBidWZmZXJzIGF2YWlsYWJsZSAqLworfTsKKworI3ByYWdtYSBwYWNrKCkKKworaW50IHNpc193YWl0X2Zvcl9jdHJsX3JlYWR5KHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXUzMiBzdGF0dXM7CisKKwl0aW1lb3V0ID0gKFNJU19DVFJMX1JFQURZX1RJTUVPVVRfU0VDUyAqIEhaKSArIGppZmZpZXM7CisKKwl3aGlsZSAoMSkgeworCQlzdGF0dXMgPSByZWFkbCgmY3RybF9pbmZvLT5yZWdpc3RlcnMtPnNpc19maXJtd2FyZV9zdGF0dXMpOworCQlpZiAoc3RhdHVzICE9IH4wKSB7CisJCQlpZiAoc3RhdHVzICYgU0lTX0NUUkxfS0VSTkVMX1BBTklDKSB7CisJCQkJZGV2X2VycigmY3RybF9pbmZvLT5wY2lfZGV2LT5kZXYsCisJCQkJCSJjb250cm9sbGVyIGlzIG9mZmxpbmU6IHN0YXR1cyBjb2RlIDB4JXhcbiIsCisJCQkJCXJlYWRsKAorCQkJCQkmY3RybF9pbmZvLT5yZWdpc3RlcnMtPnNpc19tYWlsYm94WzddKSk7CisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQl9CisJCQlpZiAoc3RhdHVzICYgU0lTX0NUUkxfS0VSTkVMX1VQKQorCQkJCWJyZWFrOworCQl9CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCW1zbGVlcChTSVNfQ1RSTF9SRUFEWV9QT0xMX0lOVEVSVkFMX01TRUNTKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworYm9vbCBzaXNfaXNfZmlybXdhcmVfcnVubmluZyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCWJvb2wgcnVubmluZzsKKwl1MzIgc3RhdHVzOworCisJc3RhdHVzID0gcmVhZGwoJmN0cmxfaW5mby0+cmVnaXN0ZXJzLT5zaXNfZmlybXdhcmVfc3RhdHVzKTsKKworCWlmIChzdGF0dXMgJiBTSVNfQ1RSTF9LRVJORUxfUEFOSUMpCisJCXJ1bm5pbmcgPSBmYWxzZTsKKwllbHNlCisJCXJ1bm5pbmcgPSB0cnVlOworCisJaWYgKCFydW5uaW5nKQorCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJjb250cm9sbGVyIGlzIG9mZmxpbmU6IHN0YXR1cyBjb2RlIDB4JXhcbiIsCisJCQlyZWFkbCgmY3RybF9pbmZvLT5yZWdpc3RlcnMtPnNpc19tYWlsYm94WzddKSk7CisKKwlyZXR1cm4gcnVubmluZzsKK30KKworLyogdXNlZCBmb3IgcGFzc2luZyBjb21tYW5kIHBhcmFtZXRlcnMvcmVzdWx0cyB3aGVuIGlzc3VpbmcgU0lTIGNvbW1hbmRzICovCitzdHJ1Y3Qgc2lzX3N5bmNfY21kX3BhcmFtcyB7CisJdTMyCW1haWxib3hbNl07CS8qIG1haWxib3hlcyAwLTUgKi8KK307CisKK3N0YXRpYyBpbnQgc2lzX3NlbmRfc3luY19jbWQoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywKKwl1MzIgY21kLCBzdHJ1Y3Qgc2lzX3N5bmNfY21kX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBwcWlfY3RybF9yZWdpc3RlcnMgX19pb21lbSAqcmVnaXN0ZXJzOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1MzIgZG9vcmJlbGw7CisJdTMyIGNtZF9zdGF0dXM7CisKKwlyZWdpc3RlcnMgPSBjdHJsX2luZm8tPnJlZ2lzdGVyczsKKworCS8qIFdyaXRlIHRoZSBjb21tYW5kIHRvIG1haWxib3ggMC4gKi8KKwl3cml0ZWwoY21kLCAmcmVnaXN0ZXJzLT5zaXNfbWFpbGJveFswXSk7CisKKwkvKgorCSAqIFdyaXRlIHRoZSBjb21tYW5kIHBhcmFtZXRlcnMgdG8gbWFpbGJveGVzIDEtNCAobWFpbGJveCA1IGlzIG5vdCB1c2VkCisJICogd2hlbiBzZW5kaW5nIGEgY29tbWFuZCB0byB0aGUgY29udHJvbGxlcikuCisJICovCisJZm9yIChpID0gMTsgaSA8PSA0OyBpKyspCisJCXdyaXRlbChwYXJhbXMtPm1haWxib3hbaV0sICZyZWdpc3RlcnMtPnNpc19tYWlsYm94W2ldKTsKKworCS8qIENsZWFyIHRoZSBjb21tYW5kIGRvb3JiZWxsLiAqLworCXdyaXRlbChTSVNfQ0xFQVJfQ1RSTF9UT19IT1NUX0RPT1JCRUxMLAorCQkmcmVnaXN0ZXJzLT5zaXNfY3RybF90b19ob3N0X2Rvb3JiZWxsX2NsZWFyKTsKKworCS8qIERpc2FibGUgZG9vcmJlbGwgaW50ZXJydXB0cyBieSBtYXNraW5nIGFsbCBpbnRlcnJ1cHRzLiAqLworCXdyaXRlbCh+MCwgJnJlZ2lzdGVycy0+c2lzX2ludGVycnVwdF9tYXNrKTsKKworCS8qCisJICogRm9yY2UgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIHdyaXRlIGJlZm9yZQorCSAqIHN1Ym1pdHRpbmcgdGhlIGNvbW1hbmQuCisJICovCisJcmVhZGwoJnJlZ2lzdGVycy0+c2lzX2ludGVycnVwdF9tYXNrKTsKKworCS8qIFN1Ym1pdCB0aGUgY29tbWFuZCB0byB0aGUgY29udHJvbGxlci4gKi8KKwl3cml0ZWwoU0lTX0NNRF9SRUFEWSwgJnJlZ2lzdGVycy0+c2lzX2hvc3RfdG9fY3RybF9kb29yYmVsbCk7CisKKwkvKgorCSAqIFBvbGwgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4gIE5vdGUgdGhhdCB0aGUgY2FsbCB0byBtc2xlZXAoKSBpcyBhdAorCSAqIHRoZSB0b3Agb2YgdGhlIGxvb3AgaW4gb3JkZXIgdG8gZ2l2ZSB0aGUgY29udHJvbGxlciB0aW1lIHRvIHN0YXJ0CisJICogcHJvY2Vzc2luZyB0aGUgY29tbWFuZCBiZWZvcmUgd2Ugc3RhcnQgcG9sbGluZy4KKwkgKi8KKwl0aW1lb3V0ID0gKFNJU19DTURfQ09NUExFVEVfVElNRU9VVF9TRUNTICogSFopICsgamlmZmllczsKKwl3aGlsZSAoMSkgeworCQltc2xlZXAoU0lTX0NNRF9DT01QTEVURV9QT0xMX0lOVEVSVkFMX01TRUNTKTsKKwkJZG9vcmJlbGwgPSByZWFkbCgmcmVnaXN0ZXJzLT5zaXNfY3RybF90b19ob3N0X2Rvb3JiZWxsKTsKKwkJaWYgKGRvb3JiZWxsICYgU0lTX0NNRF9DT01QTEVURSkKKwkJCWJyZWFrOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCS8qIFJlYWQgdGhlIGNvbW1hbmQgc3RhdHVzIGZyb20gbWFpbGJveCAwLiAqLworCWNtZF9zdGF0dXMgPSByZWFkbCgmcmVnaXN0ZXJzLT5zaXNfbWFpbGJveFswXSk7CisJaWYgKGNtZF9zdGF0dXMgIT0gU0lTX0NNRF9TVEFUVVNfU1VDQ0VTUykgeworCQlkZXZfZXJyKCZjdHJsX2luZm8tPnBjaV9kZXYtPmRldiwKKwkJCSJTSVMgY29tbWFuZCBmYWlsZWQgZm9yIGNvbW1hbmQgMHgleDogc3RhdHVzID0gMHgleFxuIiwKKwkJCWNtZCwgY21kX3N0YXR1cyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogVGhlIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgc28gc2F2ZSB0aGUgY29tbWFuZCBzdGF0dXMgYW5kCisJICogcmVhZCB0aGUgdmFsdWVzIHJldHVybmVkIGluIG1haWxib3hlcyAxLTUuCisJICovCisJcGFyYW1zLT5tYWlsYm94WzBdID0gY21kX3N0YXR1czsKKwlmb3IgKGkgPSAxOyBpIDwgQVJSQVlfU0laRShwYXJhbXMtPm1haWxib3gpOyBpKyspCisJCXBhcmFtcy0+bWFpbGJveFtpXSA9IHJlYWRsKCZyZWdpc3RlcnMtPnNpc19tYWlsYm94W2ldKTsKKworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyB0aGF0IHdlIGFyZSB0YWxraW5nIHRvIGEgY29udHJvbGxlciB0aGF0IHNwZWFrcyBQUUkuCisgKi8KKworaW50IHNpc19nZXRfY3RybF9wcm9wZXJ0aWVzKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJaW50IHJjOworCXUzMiBwcm9wZXJ0aWVzOworCXUzMiBleHRlbmRlZF9wcm9wZXJ0aWVzOworCXN0cnVjdCBzaXNfc3luY19jbWRfcGFyYW1zIHBhcmFtczsKKworCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisKKwlyYyA9IHNpc19zZW5kX3N5bmNfY21kKGN0cmxfaW5mbywgU0lTX0NNRF9HRVRfQURBUFRFUl9QUk9QRVJUSUVTLAorCQkmcGFyYW1zKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXByb3BlcnRpZXMgPSBwYXJhbXMubWFpbGJveFsxXTsKKworCWlmICghKHByb3BlcnRpZXMgJiBTSVNfRVhURU5ERURfUFJPUEVSVElFU19TVVBQT1JURUQpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWV4dGVuZGVkX3Byb3BlcnRpZXMgPSBwYXJhbXMubWFpbGJveFs0XTsKKworCWlmICgoZXh0ZW5kZWRfcHJvcGVydGllcyAmIFNJU19SRVFVSVJFRF9FWFRFTkRFRF9QUk9QRVJUSUVTKSAhPQorCQlTSVNfUkVRVUlSRURfRVhURU5ERURfUFJPUEVSVElFUykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNpc19nZXRfcHFpX2NhcGFiaWxpdGllcyhzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc2lzX3N5bmNfY21kX3BhcmFtcyBwYXJhbXM7CisKKwltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOworCisJcmMgPSBzaXNfc2VuZF9zeW5jX2NtZChjdHJsX2luZm8sIFNJU19DTURfR0VUX1BRSV9DQVBBQklMSVRJRVMsCisJCSZwYXJhbXMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJY3RybF9pbmZvLT5tYXhfc2dfZW50cmllcyA9IHBhcmFtcy5tYWlsYm94WzFdOworCWN0cmxfaW5mby0+bWF4X3RyYW5zZmVyX3NpemUgPSBwYXJhbXMubWFpbGJveFsyXTsKKwljdHJsX2luZm8tPm1heF9vdXRzdGFuZGluZ19yZXF1ZXN0cyA9IHBhcmFtcy5tYWlsYm94WzNdOworCWN0cmxfaW5mby0+Y29uZmlnX3RhYmxlX29mZnNldCA9IHBhcmFtcy5tYWlsYm94WzRdOworCWN0cmxfaW5mby0+Y29uZmlnX3RhYmxlX2xlbmd0aCA9IHBhcmFtcy5tYWlsYm94WzVdOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzaXNfaW5pdF9iYXNlX3N0cnVjdF9hZGRyKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJaW50IHJjOworCXZvaWQgKmJhc2Vfc3RydWN0X3VuYWxpZ25lZDsKKwlzdHJ1Y3Qgc2lzX2Jhc2Vfc3RydWN0ICpiYXNlX3N0cnVjdDsKKwlzdHJ1Y3Qgc2lzX3N5bmNfY21kX3BhcmFtcyBwYXJhbXM7CisJdW5zaWduZWQgbG9uZyBlcnJvcl9idWZmZXJfcGFkZHI7CisJZG1hX2FkZHJfdCBidXNfYWRkcmVzczsKKworCWJhc2Vfc3RydWN0X3VuYWxpZ25lZCA9IGt6YWxsb2Moc2l6ZW9mKCpiYXNlX3N0cnVjdCkKKwkJKyBTSVNfQkFTRV9TVFJVQ1RfQUxJR05NRU5UIC0gMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiYXNlX3N0cnVjdF91bmFsaWduZWQpCisJCXJldHVybiAtRU5PTUVNOworCisJYmFzZV9zdHJ1Y3QgPSBQVFJfQUxJR04oYmFzZV9zdHJ1Y3RfdW5hbGlnbmVkLAorCQlTSVNfQkFTRV9TVFJVQ1RfQUxJR05NRU5UKTsKKwllcnJvcl9idWZmZXJfcGFkZHIgPSAodW5zaWduZWQgbG9uZyljdHJsX2luZm8tPmVycm9yX2J1ZmZlcl9kbWFfaGFuZGxlOworCisJcHV0X3VuYWxpZ25lZF9sZTMyKFNJU19CQVNFX1NUUlVDVF9SRVZJU0lPTiwgJmJhc2Vfc3RydWN0LT5yZXZpc2lvbik7CisJcHV0X3VuYWxpZ25lZF9sZTMyKGxvd2VyXzMyX2JpdHMoZXJyb3JfYnVmZmVyX3BhZGRyKSwKKwkJJmJhc2Vfc3RydWN0LT5lcnJvcl9idWZmZXJfcGFkZHJfbG93KTsKKwlwdXRfdW5hbGlnbmVkX2xlMzIodXBwZXJfMzJfYml0cyhlcnJvcl9idWZmZXJfcGFkZHIpLAorCQkmYmFzZV9zdHJ1Y3QtPmVycm9yX2J1ZmZlcl9wYWRkcl9oaWdoKTsKKwlwdXRfdW5hbGlnbmVkX2xlMzIoUFFJX0VSUk9SX0JVRkZFUl9FTEVNRU5UX0xFTkdUSCwKKwkJJmJhc2Vfc3RydWN0LT5lcnJvcl9idWZmZXJfZWxlbWVudF9sZW5ndGgpOworCXB1dF91bmFsaWduZWRfbGUzMihjdHJsX2luZm8tPm1heF9pb19zbG90cywKKwkJJmJhc2Vfc3RydWN0LT5lcnJvcl9idWZmZXJfbnVtX2VsZW1lbnRzKTsKKworCWJ1c19hZGRyZXNzID0gcGNpX21hcF9zaW5nbGUoY3RybF9pbmZvLT5wY2lfZGV2LCBiYXNlX3N0cnVjdCwKKwkJc2l6ZW9mKCpiYXNlX3N0cnVjdCksIFBDSV9ETUFfVE9ERVZJQ0UpOworCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IoY3RybF9pbmZvLT5wY2lfZGV2LCBidXNfYWRkcmVzcykpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOworCXBhcmFtcy5tYWlsYm94WzFdID0gbG93ZXJfMzJfYml0cygodTY0KWJ1c19hZGRyZXNzKTsKKwlwYXJhbXMubWFpbGJveFsyXSA9IHVwcGVyXzMyX2JpdHMoKHU2NClidXNfYWRkcmVzcyk7CisJcGFyYW1zLm1haWxib3hbM10gPSBzaXplb2YoKmJhc2Vfc3RydWN0KTsKKworCXJjID0gc2lzX3NlbmRfc3luY19jbWQoY3RybF9pbmZvLCBTSVNfQ01EX0lOSVRfQkFTRV9TVFJVQ1RfQUREUkVTUywKKwkJJnBhcmFtcyk7CisKKwlwY2lfdW5tYXBfc2luZ2xlKGN0cmxfaW5mby0+cGNpX2RldiwgYnVzX2FkZHJlc3MsIHNpemVvZigqYmFzZV9zdHJ1Y3QpLAorCQlQQ0lfRE1BX1RPREVWSUNFKTsKKworb3V0OgorCWtmcmVlKGJhc2Vfc3RydWN0X3VuYWxpZ25lZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIEVuYWJsZSBNU0ktWCBpbnRlcnJ1cHRzIG9uIHRoZSBjb250cm9sbGVyLiAqLworCit2b2lkIHNpc19lbmFibGVfbXNpeChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKQoreworCXUzMiBkb29yYmVsbF9yZWdpc3RlcjsKKworCWRvb3JiZWxsX3JlZ2lzdGVyID0KKwkJcmVhZGwoJmN0cmxfaW5mby0+cmVnaXN0ZXJzLT5zaXNfaG9zdF90b19jdHJsX2Rvb3JiZWxsKTsKKwlkb29yYmVsbF9yZWdpc3RlciB8PSBTSVNfRU5BQkxFX01TSVg7CisKKwl3cml0ZWwoZG9vcmJlbGxfcmVnaXN0ZXIsCisJCSZjdHJsX2luZm8tPnJlZ2lzdGVycy0+c2lzX2hvc3RfdG9fY3RybF9kb29yYmVsbCk7Cit9CisKKy8qIERpc2FibGUgTVNJLVggaW50ZXJydXB0cyBvbiB0aGUgY29udHJvbGxlci4gKi8KKwordm9pZCBzaXNfZGlzYWJsZV9tc2l4KHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJdTMyIGRvb3JiZWxsX3JlZ2lzdGVyOworCisJZG9vcmJlbGxfcmVnaXN0ZXIgPQorCQlyZWFkbCgmY3RybF9pbmZvLT5yZWdpc3RlcnMtPnNpc19ob3N0X3RvX2N0cmxfZG9vcmJlbGwpOworCWRvb3JiZWxsX3JlZ2lzdGVyICY9IH5TSVNfRU5BQkxFX01TSVg7CisKKwl3cml0ZWwoZG9vcmJlbGxfcmVnaXN0ZXIsCisJCSZjdHJsX2luZm8tPnJlZ2lzdGVycy0+c2lzX2hvc3RfdG9fY3RybF9kb29yYmVsbCk7Cit9CisKK3ZvaWQgc2lzX3NvZnRfcmVzZXQoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwl3cml0ZWwoU0lTX1NPRlRfUkVTRVQsCisJCSZjdHJsX2luZm8tPnJlZ2lzdGVycy0+c2lzX2hvc3RfdG9fY3RybF9kb29yYmVsbCk7Cit9CisKKyNkZWZpbmUgU0lTX01PREVfUkVBRFlfVElNRU9VVF9TRUNTCTMwCisKK2ludCBzaXNfcmVlbmFibGVfc2lzX21vZGUoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbykKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXN0cnVjdCBwcWlfY3RybF9yZWdpc3RlcnMgX19pb21lbSAqcmVnaXN0ZXJzOworCXUzMiBkb29yYmVsbDsKKworCXJlZ2lzdGVycyA9IGN0cmxfaW5mby0+cmVnaXN0ZXJzOworCisJd3JpdGVsKFNJU19SRUVOQUJMRV9TSVNfTU9ERSwKKwkJJnJlZ2lzdGVycy0+c2lzX2hvc3RfdG9fY3RybF9kb29yYmVsbCk7CisKKwlyYyA9IDA7CisJdGltZW91dCA9IChTSVNfTU9ERV9SRUFEWV9USU1FT1VUX1NFQ1MgKiBIWikgKyBqaWZmaWVzOworCisJd2hpbGUgKDEpIHsKKwkJZG9vcmJlbGwgPSByZWFkbCgmcmVnaXN0ZXJzLT5zaXNfY3RybF90b19ob3N0X2Rvb3JiZWxsKTsKKwkJaWYgKChkb29yYmVsbCAmIFNJU19SRUVOQUJMRV9TSVNfTU9ERSkgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcmMgPSAtRVRJTUVET1VUOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocmMpCisJCWRldl9lcnIoJmN0cmxfaW5mby0+cGNpX2Rldi0+ZGV2LAorCQkJInJlLWVuYWJsaW5nIFNJUyBtb2RlIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgc2lzX3dyaXRlX2RyaXZlcl9zY3JhdGNoKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8sIHUzMiB2YWx1ZSkKK3sKKwl3cml0ZWwodmFsdWUsICZjdHJsX2luZm8tPnJlZ2lzdGVycy0+c2lzX2RyaXZlcl9zY3JhdGNoKTsKK30KKwordTMyIHNpc19yZWFkX2RyaXZlcl9zY3JhdGNoKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pCit7CisJcmV0dXJuIHJlYWRsKCZjdHJsX2luZm8tPnJlZ2lzdGVycy0+c2lzX2RyaXZlcl9zY3JhdGNoKTsKK30KKworc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgdmVyaWZ5X3N0cnVjdHVyZXModm9pZCkKK3sKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHNpc19iYXNlX3N0cnVjdCwKKwkJcmV2aXNpb24pICE9IDB4MCk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBzaXNfYmFzZV9zdHJ1Y3QsCisJCWZsYWdzKSAhPSAweDQpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3Qgc2lzX2Jhc2Vfc3RydWN0LAorCQllcnJvcl9idWZmZXJfcGFkZHJfbG93KSAhPSAweDgpOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3Qgc2lzX2Jhc2Vfc3RydWN0LAorCQllcnJvcl9idWZmZXJfcGFkZHJfaGlnaCkgIT0gMHhjKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHNpc19iYXNlX3N0cnVjdCwKKwkJZXJyb3JfYnVmZmVyX2VsZW1lbnRfbGVuZ3RoKSAhPSAweDEwKTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHNpc19iYXNlX3N0cnVjdCwKKwkJZXJyb3JfYnVmZmVyX251bV9lbGVtZW50cykgIT0gMHgxNCk7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3Qgc2lzX2Jhc2Vfc3RydWN0KSAhPSAweDE4KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zbWFydHBxaS9zbWFydHBxaV9zaXMuaCBiL2RyaXZlcnMvc2NzaS9zbWFydHBxaS9zbWFydHBxaV9zaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDZlN2IwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL3NtYXJ0cHFpL3NtYXJ0cHFpX3Npcy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiAgICBkcml2ZXIgZm9yIE1pY3Jvc2VtaSBQUUktYmFzZWQgc3RvcmFnZSBjb250cm9sbGVycworICogICAgQ29weXJpZ2h0IChjKSAyMDE2IE1pY3Jvc2VtaSBDb3Jwb3JhdGlvbgorICogICAgQ29weXJpZ2h0IChjKSAyMDE2IFBNQy1TaWVycmEsIEluYy4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKKyAqICAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgUXVlc3Rpb25zL0NvbW1lbnRzL0J1Z2ZpeGVzIHRvIGVzYy5zdG9yYWdlZGV2QG1pY3Jvc2VtaS5jb20KKyAqCisgKi8KKworI2lmICFkZWZpbmVkKF9TTUFSVFBRSV9TSVNfSCkKKyNkZWZpbmUgX1NNQVJUUFFJX1NJU19ICisKK2ludCBzaXNfd2FpdF9mb3JfY3RybF9yZWFkeShzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKTsKK2Jvb2wgc2lzX2lzX2Zpcm13YXJlX3J1bm5pbmcoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbyk7CitpbnQgc2lzX2dldF9jdHJsX3Byb3BlcnRpZXMoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbyk7CitpbnQgc2lzX2dldF9wcWlfY2FwYWJpbGl0aWVzKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pOworaW50IHNpc19pbml0X2Jhc2Vfc3RydWN0X2FkZHIoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbyk7Cit2b2lkIHNpc19lbmFibGVfbXNpeChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKTsKK3ZvaWQgc2lzX2Rpc2FibGVfbXNpeChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKTsKK3ZvaWQgc2lzX3NvZnRfcmVzZXQoc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbyk7CitpbnQgc2lzX3JlZW5hYmxlX3Npc19tb2RlKHN0cnVjdCBwcWlfY3RybF9pbmZvICpjdHJsX2luZm8pOwordm9pZCBzaXNfd3JpdGVfZHJpdmVyX3NjcmF0Y2goc3RydWN0IHBxaV9jdHJsX2luZm8gKmN0cmxfaW5mbywgdTMyIHZhbHVlKTsKK3UzMiBzaXNfcmVhZF9kcml2ZXJfc2NyYXRjaChzdHJ1Y3QgcHFpX2N0cmxfaW5mbyAqY3RybF9pbmZvKTsKKworI2VuZGlmCS8qIF9TTUFSVFBRSV9TSVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NyLmMgYi9kcml2ZXJzL3Njc2kvc3IuYwppbmRleCBlZDE3OTM0Li5iZWQyYmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3IuYworKysgYi9kcml2ZXJzL3Njc2kvc3IuYwpAQCAtODMsNyArODMsNyBAQAogc3RhdGljIGludCBzcl9kb25lKHN0cnVjdCBzY3NpX2NtbmQgKik7CiBzdGF0aWMgaW50IHNyX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCi1zdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgc3JfcG1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNyX3BtX29wcyA9IHsKIAkucnVudGltZV9zdXNwZW5kCT0gc3JfcnVudGltZV9zdXNwZW5kLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N5bTUzYzh4eF8yL3N5bV9nbHVlLmMgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuYwppbmRleCA1ZDAwZTUxLi5kMzJlM2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuYworKysgYi9kcml2ZXJzL3Njc2kvc3ltNTNjOHh4XzIvc3ltX2dsdWUuYwpAQCAtMTg3NCw3ICsxODc0LDcgQEAKIAogCXNwaW5fbG9ja19pcnEoc2hvc3QtPmhvc3RfbG9jayk7CiAJaWYgKHN5bV9kYXRhLT5pb19yZXNldCkKLQkJY29tcGxldGVfYWxsKHN5bV9kYXRhLT5pb19yZXNldCk7CisJCWNvbXBsZXRlKHN5bV9kYXRhLT5pb19yZXNldCk7CiAJc3Bpbl91bmxvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdDEyOC5jIGIvZHJpdmVycy9zY3NpL3QxMjguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE4NjA4YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvdDEyOC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLS8qCi0gKiBUcmFudG9yIFQxMjgvVDEyOEYvVDIyOCBkcml2ZXIKLSAqCU5vdGUgOiBhcmNoaXRlY3R1cmFsbHksIHRoZSBUMTAwIGFuZCBUMTMwIGFyZSBkaWZmZXJlbnQgYW5kIHdvbid0IAotICogCXdvcmsKLSAqCi0gKiBDb3B5cmlnaHQgMTk5MywgRHJldyBFY2toYXJkdAotICoJVmlzaW9uYXJ5IENvbXB1dGluZwotICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKLSAqCWRyZXdAY29sb3JhZG8uZWR1Ci0gKiAgICAgICsxICgzMDMpIDQ0MC00ODk0Ci0gKgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0IAotICoKLSAqIFRyYW50b3IgU3lzdGVtcywgTHRkLgotICogVDEyOC9UMTI4Ri9UMjI4IFNDU0kgSG9zdCBBZGFwdGVyCi0gKiBIYXJkd2FyZSBTcGVjaWZpY2F0aW9ucwotICogCi0gKiBUcmFudG9yIFN5c3RlbXMsIEx0ZC4gCi0gKiA1NDE1IFJhbmRhbGwgUGxhY2UKLSAqIEZyZW1vbnQsIENBIDk0NTM4Ci0gKiAxKyAoNDE1KSA3NzAtMTQwMCwgRkFYIDErICg0MTUpIDc3MC05OTEwCi0gKi8KLQotLyoKLSAqIFRoZSBjYXJkIGlzIGRldGVjdGVkIGFuZCBpbml0aWFsaXplZCBpbiBvbmUgb2Ygc2V2ZXJhbCB3YXlzIDogCi0gKiAxLiAgQXV0b3Byb2JlIChkZWZhdWx0KSAtIHNpbmNlIHRoZSBib2FyZCBpcyBtZW1vcnkgbWFwcGVkLCAKLSAqICAgICBhIEJJT1Mgc2lnbmF0dXJlIGlzIHNjYW5uZWQgZm9yIHRvIGxvY2F0ZSB0aGUgcmVnaXN0ZXJzLgotICogICAgIEFuIGludGVycnVwdCBpcyB0cmlnZ2VyZWQgdG8gYXV0b3Byb2JlIGZvciB0aGUgaW50ZXJydXB0Ci0gKiAgICAgbGluZS4KLSAqCi0gKiAyLiAgV2l0aCBjb21tYW5kIGxpbmUgb3ZlcnJpZGVzIC0gdDEyOD1hZGRyZXNzLGlycSBtYXkgYmUgCi0gKiAgICAgdXNlZCBvbiB0aGUgTElMTyBjb21tYW5kIGxpbmUgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLgotICoKLSAqIDMuICBXaXRoIHRoZSBUMTI4X09WRVJSSURFIGNvbXBpbGUgdGltZSBkZWZpbmUuICBUaGlzIGlzIAotICogICAgIHNwZWNpZmllZCBhcyBhbiBhcnJheSBvZiBhZGRyZXNzLCBpcnEgdHVwbGVzLiAgSWUsIGZvcgotICogICAgIG9uZSBib2FyZCBhdCB0aGUgZGVmYXVsdCAweGNjMDAwIGFkZHJlc3MsIElSUTUsIEkgY291bGQgc2F5IAotICogICAgIC1EVDEyOF9PVkVSUklERT17ezB4Y2MwMDAsIDV9fQotICoJCi0gKiAgICAgTm90ZSB0aGF0IGlmIHRoZSBvdmVycmlkZSBtZXRob2RzIGFyZSB1c2VkLCBwbGFjZSBob2xkZXJzIG11c3QKLSAqICAgICBiZSBzcGVjaWZpZWQgZm9yIG90aGVyIGJvYXJkcyBpbiB0aGUgc3lzdGVtLgotICogCi0gKiBUMTI4L1QxMjhGIGp1bXBlci9kaXBzd2l0Y2ggc2V0dGluZ3MgKG5vdGUgOiBvbiBteSBzYW1wbGUsIHRoZSBzd2l0Y2hlcyAKLSAqIHdlcmUgZXBveHknZCBzaHV0LCBtZWFuaW5nIEkgY291bGRuJ3QgY2hhbmdlIHRoZSAweGNjMDAwIGJhc2UgYWRkcmVzcykgOgotICoKLSAqIFQxMjggICAgU3c3IFN3OCBTdzYgPSAwd3MgU3c1ID0gYm9vdCAKLSAqIFQxMjhGICAgU3c2IFN3NyBTdzUgPSAwd3MgU3c0ID0gYm9vdCBTdzggPSBmbG9wcHkgZGlzYWJsZQotICogY2MwMDAgICBvZmYgb2ZmICAgICAgCi0gKiBjODAwMCAgIG9mZiBvbgotICogZGMwMDAgICBvbiAgb2ZmCi0gKiBkODAwMCAgIG9uICBvbgotICoKLSAqIAotICogSW50ZXJydXB0cyAKLSAqIFRoZXJlIGlzIGEgMTIgcGluIGp1bXBlciBibG9jaywganAxLCBudW1iZXJlZCBhcyBmb2xsb3dzIDogCi0gKiAgIFQxMjggKEpQMSkgIAkgVDEyOEYgKEo1KQotICogMiA0IDYgOCAxMCAxMgkxMSA5ICA3IDUgMyAxCi0gKiAxIDMgNSA3IDkgIDExCTEyIDEwIDggNiA0IDIKLSAqCi0gKiAzICAgMi00Ci0gKiA1ICAgMS0zCi0gKiA3ICAgMy01Ci0gKiBUMTI4RiBvbmx5IAotICogMTAgOC0xMAotICogMTIgNy05Ci0gKiAxNCAxMC0xMgotICogMTUgOS0xMQotICovCi0gCi0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgotI2luY2x1ZGUgInQxMjguaCIKLSNpbmNsdWRlICJOQ1I1MzgwLmgiCi0KLXN0YXRpYyBzdHJ1Y3Qgb3ZlcnJpZGUgewotICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzczsKLSAgICBpbnQgaXJxOwotfSBvdmVycmlkZXMKLSNpZmRlZiBUMTI4X09WRVJSSURFCi0gICAgW10gX19pbml0ZGF0YSA9IFQxMjhfT1ZFUlJJREU7Ci0jZWxzZQotICAgIFs0XSBfX2luaXRkYXRhID0ge3swLCBJUlFfQVVUT30sIHswLCBJUlFfQVVUT30sCi0gICAgICAgIHswICxJUlFfQVVUT30sIHswLCBJUlFfQVVUT319OwotI2VuZGlmCi0KLSNkZWZpbmUgTk9fT1ZFUlJJREVTIEFSUkFZX1NJWkUob3ZlcnJpZGVzKQotCi1zdGF0aWMgc3RydWN0IGJhc2UgewotICAgIHVuc2lnbmVkIGludCBhZGRyZXNzOwotICAgIGludCBub2F1dG87Ci19IGJhc2VzW10gX19pbml0ZGF0YSA9IHsKLSAgICB7IDB4Y2MwMDAsIDB9LCB7IDB4YzgwMDAsIDB9LCB7IDB4ZGMwMDAsIDB9LCB7IDB4ZDgwMDAsIDB9Ci19OwotCi0jZGVmaW5lIE5PX0JBU0VTIEFSUkFZX1NJWkUoYmFzZXMpCi0KLXN0YXRpYyBzdHJ1Y3Qgc2lnbmF0dXJlIHsKLSAgICBjb25zdCBjaGFyICpzdHJpbmc7Ci0gICAgaW50IG9mZnNldDsKLX0gc2lnbmF0dXJlc1tdIF9faW5pdGRhdGEgPSB7Ci17IlRTUk9NOiBTQ1NJIEJJT1MsIFZlcnNpb24gMS4xMiIsIDB4MzZ9LAotfTsKLQotI2RlZmluZSBOT19TSUdOQVRVUkVTIEFSUkFZX1NJWkUoc2lnbmF0dXJlcykKLQotI2lmbmRlZiBNT0RVTEUKLS8qCi0gKiBGdW5jdGlvbiA6IHQxMjhfc2V0dXAoY2hhciAqc3RyLCBpbnQgKmludHMpCi0gKgotICogUHVycG9zZSA6IExJTE8gY29tbWFuZCBsaW5lIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdmVycmlkZXMgYXJyYXksCi0gKiAKLSAqIElucHV0cyA6IHN0ciAtIHVudXNlZCwgaW50cyAtIGFycmF5IG9mIGludGVnZXIgcGFyYW1ldGVycyB3aXRoIGludHNbMF0KLSAqCWVxdWFsIHRvIHRoZSBudW1iZXIgb2YgaW50cy4KLSAqCi0gKi8KLQotc3RhdGljIGludCBfX2luaXQgdDEyOF9zZXR1cChjaGFyICpzdHIpCi17Ci0Jc3RhdGljIGludCBjb21tYW5kbGluZV9jdXJyZW50OwotICAgIGludCBpOwotICAgIGludCBpbnRzWzEwXTsKLQotICAgIGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7Ci0gICAgaWYgKGludHNbMF0gIT0gMikgCi0JcHJpbnRrKCJ0MTI4X3NldHVwIDogdXNhZ2UgdDEyOD1hZGRyZXNzLGlycVxuIik7Ci0gICAgZWxzZSAKLQlpZiAoY29tbWFuZGxpbmVfY3VycmVudCA8IE5PX09WRVJSSURFUykgewotCSAgICBvdmVycmlkZXNbY29tbWFuZGxpbmVfY3VycmVudF0uYWRkcmVzcyA9IGludHNbMV07Ci0JICAgIG92ZXJyaWRlc1tjb21tYW5kbGluZV9jdXJyZW50XS5pcnEgPSBpbnRzWzJdOwotCSAgICBmb3IgKGkgPSAwOyBpIDwgTk9fQkFTRVM7ICsraSkKLQkJaWYgKGJhc2VzW2ldLmFkZHJlc3MgPT0gaW50c1sxXSkgewotCQkgICAgYmFzZXNbaV0ubm9hdXRvID0gMTsKLQkJICAgIGJyZWFrOwotCQl9Ci0JICAgICsrY29tbWFuZGxpbmVfY3VycmVudDsKLQl9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoInQxMjg9IiwgdDEyOF9zZXR1cCk7Ci0jZW5kaWYKLQotLyogCi0gKiBGdW5jdGlvbiA6IGludCB0MTI4X2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKLSAqCi0gKiBQdXJwb3NlIDogZGV0ZWN0cyBhbmQgaW5pdGlhbGl6ZXMgVDEyOCxUMTI4Riwgb3IgVDIyOCBjb250cm9sbGVycwotICoJdGhhdCB3ZXJlIGF1dG9wcm9iZWQsIG92ZXJyaWRkZW4gb24gdGhlIExJTE8gY29tbWFuZCBsaW5lLCAKLSAqCW9yIHNwZWNpZmllZCBhdCBjb21waWxlIHRpbWUuCi0gKgotICogSW5wdXRzIDogdHBudCAtIHRlbXBsYXRlIGZvciB0aGlzIFNDU0kgYWRhcHRlci4KLSAqIAotICogUmV0dXJucyA6IDEgaWYgYSBob3N0IGFkYXB0ZXIgd2FzIGZvdW5kLCAwIGlmIG5vdC4KLSAqCi0gKi8KLQotc3RhdGljIGludCBfX2luaXQgdDEyOF9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkKLXsKLQlzdGF0aWMgaW50IGN1cnJlbnRfb3ZlcnJpZGUsIGN1cnJlbnRfYmFzZTsKLSAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZTsKLSAgICB1bnNpZ25lZCBsb25nIGJhc2U7Ci0gICAgdm9pZCBfX2lvbWVtICpwOwotICAgIGludCBzaWcsIGNvdW50OwotCi0gICAgZm9yIChjb3VudCA9IDA7IGN1cnJlbnRfb3ZlcnJpZGUgPCBOT19PVkVSUklERVM7ICsrY3VycmVudF9vdmVycmlkZSkgewotCWJhc2UgPSAwOwotCXAgPSBOVUxMOwotCi0JaWYgKG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5hZGRyZXNzKSB7Ci0JICAgIGJhc2UgPSBvdmVycmlkZXNbY3VycmVudF9vdmVycmlkZV0uYWRkcmVzczsKLQkgICAgcCA9IGlvcmVtYXAoYmFzZXNbY3VycmVudF9iYXNlXS5hZGRyZXNzLCAweDIwMDApOwotCSAgICBpZiAoIXApCi0JCWJhc2UgPSAwOwotCX0gZWxzZSAKLQkgICAgZm9yICg7ICFiYXNlICYmIChjdXJyZW50X2Jhc2UgPCBOT19CQVNFUyk7ICsrY3VycmVudF9iYXNlKSB7Ci0JCWRwcmludGsoTkRFQlVHX0lOSVQsICJ0MTI4OiBwcm9iaW5nIGFkZHJlc3MgMHglMDh4XG4iLAotCQkgICAgICAgIGJhc2VzW2N1cnJlbnRfYmFzZV0uYWRkcmVzcyk7Ci0JCWlmIChiYXNlc1tjdXJyZW50X2Jhc2VdLm5vYXV0bykKLQkJCWNvbnRpbnVlOwotCQlwID0gaW9yZW1hcChiYXNlc1tjdXJyZW50X2Jhc2VdLmFkZHJlc3MsIDB4MjAwMCk7Ci0JCWlmICghcCkKLQkJCWNvbnRpbnVlOwotCQlmb3IgKHNpZyA9IDA7IHNpZyA8IE5PX1NJR05BVFVSRVM7ICsrc2lnKSAKLQkJICAgIGlmIChjaGVja19zaWduYXR1cmUocCArIHNpZ25hdHVyZXNbc2lnXS5vZmZzZXQsCi0JCQkJCXNpZ25hdHVyZXNbc2lnXS5zdHJpbmcsCi0JCQkJCXN0cmxlbihzaWduYXR1cmVzW3NpZ10uc3RyaW5nKSkpIHsKLQkJCWJhc2UgPSBiYXNlc1tjdXJyZW50X2Jhc2VdLmFkZHJlc3M7Ci0JCQlkcHJpbnRrKE5ERUJVR19JTklULCAidDEyODogZGV0ZWN0ZWQgYm9hcmRcbiIpOwotCQkJZ290byBmb3VuZDsKLQkJICAgIH0KLQkJaW91bm1hcChwKTsKLQkgICAgfQotCi0JZHByaW50ayhOREVCVUdfSU5JVCwgInQxMjg6IGJhc2UgPSAweCUwOHhcbiIsICh1bnNpZ25lZCBpbnQpYmFzZSk7Ci0KLQlpZiAoIWJhc2UpCi0JICAgIGJyZWFrOwotCi1mb3VuZDoKLQlpbnN0YW5jZSA9IHNjc2lfcmVnaXN0ZXIgKHRwbnQsIHNpemVvZihzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSkpOwotCWlmKGluc3RhbmNlID09IE5VTEwpCi0JCWdvdG8gb3V0X3VubWFwOwotCi0JaW5zdGFuY2UtPmJhc2UgPSBiYXNlOwotCSgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilpbnN0YW5jZS0+aG9zdGRhdGEpLT5iYXNlID0gcDsKLQotCWlmIChOQ1I1MzgwX2luaXQoaW5zdGFuY2UsIEZMQUdfRE1BX0ZJWFVQIHwgRkxBR19MQVRFX0RNQV9TRVRVUCkpCi0JCWdvdG8gb3V0X3VucmVnaXN0ZXI7Ci0KLQlOQ1I1MzgwX21heWJlX3Jlc2V0X2J1cyhpbnN0YW5jZSk7Ci0KLQlpZiAob3ZlcnJpZGVzW2N1cnJlbnRfb3ZlcnJpZGVdLmlycSAhPSBJUlFfQVVUTykKLQkgICAgaW5zdGFuY2UtPmlycSA9IG92ZXJyaWRlc1tjdXJyZW50X292ZXJyaWRlXS5pcnE7Ci0JZWxzZSAKLQkgICAgaW5zdGFuY2UtPmlycSA9IE5DUjUzODBfcHJvYmVfaXJxKGluc3RhbmNlLCBUMTI4X0lSUVMpOwotCi0JLyogQ29tcGF0aWJpbGl0eSB3aXRoIGRvY3VtZW50ZWQgTkNSNTM4MCBrZXJuZWwgcGFyYW1ldGVycyAqLwotCWlmIChpbnN0YW5jZS0+aXJxID09IDI1NSkKLQkJaW5zdGFuY2UtPmlycSA9IE5PX0lSUTsKLQotCWlmIChpbnN0YW5jZS0+aXJxICE9IE5PX0lSUSkKLQkgICAgaWYgKHJlcXVlc3RfaXJxKGluc3RhbmNlLT5pcnEsIHQxMjhfaW50ciwgMCwgInQxMjgiLAotCQkJICAgIGluc3RhbmNlKSkgewotCQlwcmludGsoInNjc2klZCA6IElSUSVkIG5vdCBmcmVlLCBpbnRlcnJ1cHRzIGRpc2FibGVkXG4iLCAKLQkJICAgIGluc3RhbmNlLT5ob3N0X25vLCBpbnN0YW5jZS0+aXJxKTsKLQkJaW5zdGFuY2UtPmlycSA9IE5PX0lSUTsKLQkgICAgfSAKLQotCWlmIChpbnN0YW5jZS0+aXJxID09IE5PX0lSUSkgewotCSAgICBwcmludGsoInNjc2klZCA6IGludGVycnVwdHMgbm90IGVuYWJsZWQuIGZvciBiZXR0ZXIgaW50ZXJhY3RpdmUgcGVyZm9ybWFuY2UsXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7Ci0JICAgIHByaW50aygic2NzaSVkIDogcGxlYXNlIGp1bXBlciB0aGUgYm9hcmQgZm9yIGEgZnJlZSBJUlEuXG4iLCBpbnN0YW5jZS0+aG9zdF9ubyk7Ci0JfQotCi0JZHByaW50ayhOREVCVUdfSU5JVCwgInNjc2klZDogaXJxID0gJWRcbiIsCi0JICAgICAgICBpbnN0YW5jZS0+aG9zdF9ubywgaW5zdGFuY2UtPmlycSk7Ci0KLQkrK2N1cnJlbnRfb3ZlcnJpZGU7Ci0JKytjb3VudDsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotCi1vdXRfdW5yZWdpc3RlcjoKLQlzY3NpX3VucmVnaXN0ZXIoaW5zdGFuY2UpOwotb3V0X3VubWFwOgotCWlvdW5tYXAocCk7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IHQxMjhfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKLXsKLQlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSBzaG9zdF9wcml2KHNob3N0KTsKLQotCWlmIChzaG9zdC0+aXJxICE9IE5PX0lSUSkKLQkJZnJlZV9pcnEoc2hvc3QtPmlycSwgc2hvc3QpOwotCU5DUjUzODBfZXhpdChzaG9zdCk7Ci0Jc2NzaV91bnJlZ2lzdGVyKHNob3N0KTsKLQlpb3VubWFwKGhvc3RkYXRhLT5iYXNlKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uIDogaW50IHQxMjhfYmlvc3BhcmFtKERpc2sgKiBkaXNrLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsIGludCAqaXApCi0gKgotICogUHVycG9zZSA6IEdlbmVyYXRlcyBhIEJJT1MgLyBET1MgY29tcGF0aWJsZSBILUMtUyBtYXBwaW5nIGZvciAKLSAqCXRoZSBzcGVjaWZpZWQgZGV2aWNlIC8gc2l6ZS4KLSAqIAotICogSW5wdXRzIDogc2l6ZSA9IHNpemUgb2YgZGV2aWNlIGluIHNlY3RvcnMgKDUxMiBieXRlcyksIGRldiA9IGJsb2NrIGRldmljZQotICoJbWFqb3IgLyBtaW5vciwgaXBbXSA9IHtoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzfSAgCi0gKgotICogUmV0dXJucyA6IGFsd2F5cyAwIChzdWNjZXNzKSwgaW5pdGlhbGl6ZXMgaXAKLSAqCQotICovCi0KLS8qIAotICogWFhYIE1vc3QgU0NTSSBib2FyZHMgdXNlIHRoaXMgbWFwcGluZywgSSBjb3VsZCBiZSBpbmNvcnJlY3QuICBTb21lIG9uZQotICogdXNpbmcgaGFyZCBkaXNrcyBvbiBhIHRyYW50b3Igc2hvdWxkIHZlcmlmeSB0aGF0IHRoaXMgbWFwcGluZyBjb3JyZXNwb25kcwotICogdG8gdGhhdCB1c2VkIGJ5IHRoZSBCSU9TIC8gQVNQSSBkcml2ZXIgYnkgcnVubmluZyB0aGUgbGludXggZmRpc2sgcHJvZ3JhbQotICogYW5kIG1hdGNoaW5nIHRoZSBIX0NfUyBjb29yZGluYXRlcyB0byB3aGF0IERPUyB1c2VzLgotICovCi0KLXN0YXRpYyBpbnQgdDEyOF9iaW9zcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICppcCkKLXsKLSAgaXBbMF0gPSA2NDsKLSAgaXBbMV0gPSAzMjsKLSAgaXBbMl0gPSBjYXBhY2l0eSA+PiAxMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbiA6IGludCB0MTI4X3ByZWFkIChzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwKLSAqCXVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbikKLSAqCi0gKiBQdXJwb3NlIDogRmFzdCA1MzgwIHBzZXVkby1kbWEgcmVhZCBmdW5jdGlvbiwgdHJhbnNmZXJzIGxlbiBieXRlcyB0byAKLSAqCWRzdAotICogCi0gKiBJbnB1dHMgOiBkc3QgPSBkZXN0aW5hdGlvbiwgbGVuID0gbGVuZ3RoIGluIGJ5dGVzCi0gKgotICogUmV0dXJucyA6IDAgb24gc3VjY2Vzcywgbm9uIHplcm8gb24gYSBmYWlsdXJlIHN1Y2ggYXMgYSB3YXRjaGRvZyAKLSAqIAl0aW1lb3V0LgotICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHQxMjhfcHJlYWQoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGxlbikKLXsKLQlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSBzaG9zdF9wcml2KGluc3RhbmNlKTsKLQl2b2lkIF9faW9tZW0gKnJlZywgKmJhc2UgPSBob3N0ZGF0YS0+YmFzZTsKLSAgICB1bnNpZ25lZCBjaGFyICpkID0gZHN0OwotICAgIHJlZ2lzdGVyIGludCBpID0gbGVuOwotCi0gICAgcmVnID0gYmFzZSArIFRfREFUQV9SRUdfT0ZGU0VUOwotCi0jaWYgMAotICAgIGZvciAoOyBpOyAtLWkpIHsKLQl3aGlsZSAoIShyZWFkYihiYXNlK1RfU1RBVFVTX1JFR19PRkZTRVQpICYgVF9TVF9SRFkpKSBiYXJyaWVyKCk7Ci0jZWxzZQotICAgIHdoaWxlICghKHJlYWRiKGJhc2UrVF9TVEFUVVNfUkVHX09GRlNFVCkgJiBUX1NUX1JEWSkpIGJhcnJpZXIoKTsKLSAgICBmb3IgKDsgaTsgLS1pKSB7Ci0jZW5kaWYKLQkqZCsrID0gcmVhZGIocmVnKTsKLSAgICB9Ci0KLSAgICBpZiAocmVhZGIoYmFzZSArIFRfU1RBVFVTX1JFR19PRkZTRVQpICYgVF9TVF9USU0pIHsKLQl1bnNpZ25lZCBjaGFyIHRtcDsKLQl2b2lkIF9faW9tZW0gKmZvbyA9IGJhc2UgKyBUX0NPTlRST0xfUkVHX09GRlNFVDsKLQl0bXAgPSByZWFkYihmb28pOwotCXdyaXRlYih0bXAgfCBUX0NSX0NULCBmb28pOwotCXdyaXRlYih0bXAsIGZvbyk7Ci0JcHJpbnRrKCJzY3NpJWQgOiB3YXRjaGRvZyB0aW1lciBmaXJlZCBpbiBOQ1I1MzgwX3ByZWFkKClcbiIsCi0JICAgIGluc3RhbmNlLT5ob3N0X25vKTsKLQlyZXR1cm4gLTE7Ci0gICAgfSBlbHNlCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbiA6IGludCB0MTI4X3B3cml0ZSAoc3RydWN0IFNjc2lfSG9zdCAqaW5zdGFuY2UsCi0gKgl1bnNpZ25lZCBjaGFyICpzcmMsIGludCBsZW4pCi0gKgotICogUHVycG9zZSA6IEZhc3QgNTM4MCBwc2V1ZG8tZG1hIHdyaXRlIGZ1bmN0aW9uLCB0cmFuc2ZlcnMgbGVuIGJ5dGVzIGZyb20KLSAqCXNyYwotICogCi0gKiBJbnB1dHMgOiBzcmMgPSBzb3VyY2UsIGxlbiA9IGxlbmd0aCBpbiBieXRlcwotICoKLSAqIFJldHVybnMgOiAwIG9uIHN1Y2Nlc3MsIG5vbiB6ZXJvIG9uIGEgZmFpbHVyZSBzdWNoIGFzIGEgd2F0Y2hkb2cgCi0gKiAJdGltZW91dC4KLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCB0MTI4X3B3cml0ZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKLXsKLQlzdHJ1Y3QgTkNSNTM4MF9ob3N0ZGF0YSAqaG9zdGRhdGEgPSBzaG9zdF9wcml2KGluc3RhbmNlKTsKLQl2b2lkIF9faW9tZW0gKnJlZywgKmJhc2UgPSBob3N0ZGF0YS0+YmFzZTsKLSAgICB1bnNpZ25lZCBjaGFyICpzID0gc3JjOwotICAgIHJlZ2lzdGVyIGludCBpID0gbGVuOwotCi0gICAgcmVnID0gYmFzZSArIFRfREFUQV9SRUdfT0ZGU0VUOwotCi0jaWYgMAotICAgIGZvciAoOyBpOyAtLWkpIHsKLQl3aGlsZSAoIShyZWFkYihiYXNlK1RfU1RBVFVTX1JFR19PRkZTRVQpICYgVF9TVF9SRFkpKSBiYXJyaWVyKCk7Ci0jZWxzZQotICAgIHdoaWxlICghKHJlYWRiKGJhc2UrVF9TVEFUVVNfUkVHX09GRlNFVCkgJiBUX1NUX1JEWSkpIGJhcnJpZXIoKTsKLSAgICBmb3IgKDsgaTsgLS1pKSB7Ci0jZW5kaWYKLQl3cml0ZWIoKnMrKywgcmVnKTsKLSAgICB9Ci0KLSAgICBpZiAocmVhZGIoYmFzZSArIFRfU1RBVFVTX1JFR19PRkZTRVQpICYgVF9TVF9USU0pIHsKLQl1bnNpZ25lZCBjaGFyIHRtcDsKLQl2b2lkIF9faW9tZW0gKmZvbyA9IGJhc2UgKyBUX0NPTlRST0xfUkVHX09GRlNFVDsKLQl0bXAgPSByZWFkYihmb28pOwotCXdyaXRlYih0bXAgfCBUX0NSX0NULCBmb28pOwotCXdyaXRlYih0bXAsIGZvbyk7Ci0JcHJpbnRrKCJzY3NpJWQgOiB3YXRjaGRvZyB0aW1lciBmaXJlZCBpbiBOQ1I1MzgwX3B3cml0ZSgpXG4iLAotCSAgICBpbnN0YW5jZS0+aG9zdF9ubyk7Ci0JcmV0dXJuIC0xOwotICAgIH0gZWxzZSAKLQlyZXR1cm4gMDsKLX0KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0jaW5jbHVkZSAiTkNSNTM4MC5jIgotCi1zdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7Ci0JLm5hbWUJCQk9ICJUcmFudG9yIFQxMjgvVDEyOEYvVDIyOCIsCi0JLmRldGVjdAkJCT0gdDEyOF9kZXRlY3QsCi0JLnJlbGVhc2UJCT0gdDEyOF9yZWxlYXNlLAotCS5wcm9jX25hbWUJCT0gInQxMjgiLAotCS5pbmZvCQkJPSB0MTI4X2luZm8sCi0JLnF1ZXVlY29tbWFuZAkJPSB0MTI4X3F1ZXVlX2NvbW1hbmQsCi0JLmVoX2Fib3J0X2hhbmRsZXIJPSB0MTI4X2Fib3J0LAotCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IHQxMjhfYnVzX3Jlc2V0LAotCS5iaW9zX3BhcmFtCQk9IHQxMjhfYmlvc3BhcmFtLAotCS5jYW5fcXVldWUJCT0gMzIsCi0JLnRoaXNfaWQJCT0gNywKLQkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKLQkuY21kX3Blcl9sdW4JCT0gMiwKLQkudXNlX2NsdXN0ZXJpbmcJCT0gRElTQUJMRV9DTFVTVEVSSU5HLAotCS5jbWRfc2l6ZQkJPSBOQ1I1MzgwX0NNRF9TSVpFLAotCS5tYXhfc2VjdG9ycwkJPSAxMjgsCi19OwotI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdDEyOC5oIGIvZHJpdmVycy9zY3NpL3QxMjguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1YmNkOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvdDEyOC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIFRyYW50b3IgVDEyOC9UMTI4Ri9UMjI4IGRlZmluZXMKLSAqCU5vdGUgOiBhcmNoaXRlY3R1cmFsbHksIHRoZSBUMTAwIGFuZCBUMTI4IGFyZSBkaWZmZXJlbnQgYW5kIHdvbid0IHdvcmsKLSAqCi0gKiBDb3B5cmlnaHQgMTk5MywgRHJldyBFY2toYXJkdAotICoJVmlzaW9uYXJ5IENvbXB1dGluZwotICoJKFVuaXggYW5kIExpbnV4IGNvbnN1bHRpbmcgYW5kIGN1c3RvbSBwcm9ncmFtbWluZykKLSAqCWRyZXdAY29sb3JhZG8uZWR1Ci0gKiAgICAgICsxICgzMDMpIDQ0MC00ODk0Ci0gKgotICogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjb25zdWx0Ci0gKgotICogVHJhbnRvciBTeXN0ZW1zLCBMdGQuCi0gKiBUMTI4L1QxMjhGL1QyMjggU0NTSSBIb3N0IEFkYXB0ZXIKLSAqIEhhcmR3YXJlIFNwZWNpZmljYXRpb25zCi0gKgotICogVHJhbnRvciBTeXN0ZW1zLCBMdGQuCi0gKiA1NDE1IFJhbmRhbGwgUGxhY2UKLSAqIEZyZW1vbnQsIENBIDk0NTM4Ci0gKiAxKyAoNDE1KSA3NzAtMTQwMCwgRkFYIDErICg0MTUpIDc3MC05OTEwCi0gKi8KLQotI2lmbmRlZiBUMTI4X0gKLSNkZWZpbmUgVDEyOF9ICi0KLS8qCi0gKiBUaGUgdHJhbnRvciBib2FyZHMgYXJlIG1lbW9yeSBtYXBwZWQuIFRoZXkgdXNlIGFuIE5DUjUzODAgb3IKLSAqIGVxdWl2YWxlbnQgKG15IHNhbXBsZSBib2FyZCBoYWQgcGFydCBzZWNvbmQgc291cmNlZCBmcm9tIFpJTE9HKS4KLSAqIE5DUidzIHJlY29tbWVuZGVkICJQc2V1ZG8tRE1BIiBhcmNoaXRlY3R1cmUgaXMgdXNlZCwgd2hlcmUKLSAqIGEgUEFMIGRyaXZlcyB0aGUgRE1BIHNpZ25hbHMgb24gdGhlIDUzODAgYWxsb3dpbmcgZmFzdCwgYmxpbmQKLSAqIHRyYW5zZmVycyB3aXRoIHByb3BlciBoYW5kc2hha2luZy4KLSAqLwotCi0vKgotICogTm90ZSA6IGEgYm9vdCBzd2l0Y2ggaXMgcHJvdmlkZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGluZm9ybWluZyB0aGUKLSAqIGZpcm13YXJlIHRvIGJvb3Qgb3Igbm90IGJvb3QgZnJvbSBhdHRhY2hlZCBTQ1NJIGRldmljZXMuICBTbywgSSBpbWFnaW5lCi0gKiB0aGVyZSBhcmUgZmV3ZXIgcGVvcGxlIHdobyd2ZSB5YW5rZWQgdGhlIFJPTSBsaWtlIHRoZXkgZG8gb24gdGhlIFNlYWdhdGUKLSAqIHRvIG1ha2UgYm9vdHVwIGZhc3RlciwgYW5kIEknbGwgcHJvYmFibHkgdXNlIHRoaXMgZm9yIGF1dG9kZXRlY3Rpb24uCi0gKi8KLSNkZWZpbmUgVF9ST01fT0ZGU0VUCQkwCi0KLS8qCi0gKiBOb3RlIDogbXkgc2FtcGxlIGJvYXJkICpXQVMgTk9UKiBwb3B1bGF0ZWQgd2l0aCB0aGUgU1JBTSwgc28gdGhpcwotICogY2FuJ3QgYmUgdXNlZCBmb3IgYXV0b2RldGVjdGlvbiB3aXRob3V0IGEgUk9NIHByZXNlbnQuCi0gKi8KLSNkZWZpbmUgVF9SQU1fT0ZGU0VUCQkweDE4MDAKLQotLyoKLSAqIEFsbCBvZiB0aGUgcmVnaXN0ZXJzIGFyZSBhbGxvY2F0ZWQgMzIgYnl0ZXMgb2YgYWRkcmVzcyBzcGFjZSwgZXhjZXB0Ci0gKiBmb3IgdGhlIGRhdGEgcmVnaXN0ZXIgKHJlYWQvd3JpdGUgdG8vZnJvbSB0aGUgNTM4MCBpbiBwc2V1ZG8tRE1BIG1vZGUpCi0gKi8gCi0jZGVmaW5lIFRfQ09OVFJPTF9SRUdfT0ZGU0VUCTB4MWMwMAkvKiBydyAqLwotI2RlZmluZSBUX0NSX0lOVAkJMHgxMAkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwotI2RlZmluZSBUX0NSX0NUCQkJMHgwMgkvKiBSZXNldCB3YXRjaGRvZyB0aW1lciAqLwotCi0jZGVmaW5lIFRfU1RBVFVTX1JFR19PRkZTRVQJMHgxYzIwCS8qIHJvICovCi0jZGVmaW5lIFRfU1RfQk9PVAkJMHg4MAkvKiBCb290IHN3aXRjaCAqLwotI2RlZmluZSBUX1NUX1MzCQkJMHg0MAkvKiBVc2VyIHNldHRhYmxlIHN3aXRjaGVzLCAqLwotI2RlZmluZSBUX1NUX1MyCQkJMHgyMAkvKiByZWFkIDAgd2hlbiBzd2l0Y2ggaXMgb24sIDEgb2ZmICovCi0jZGVmaW5lIFRfU1RfUzEJCQkweDEwCi0jZGVmaW5lIFRfU1RfUFMyCQkweDA4CS8qIFNldCBmb3IgTWljcm9jaGFubmVsIDIyOCAqLwotI2RlZmluZSBUX1NUX1JEWQkJMHgwNAkvKiA1MzgwIERSUSAqLwotI2RlZmluZSBUX1NUX1RJTQkJMHgwMgkvKiBpbmRpY2F0ZXMgNDB1cyB3YXRjaGRvZyB0aW1lciBmaXJlZCAqLwotI2RlZmluZSBUX1NUX1pFUk8JCTB4MDEJLyogQWx3YXlzIHplcm8gKi8KLQotI2RlZmluZSBUXzUzODBfT0ZGU0VUCQkweDFkMDAJLyogOCByZWdpc3RlcnMgaGVyZSwgc2VlIE5DUjUzODAuaCAqLwotCi0jZGVmaW5lIFRfREFUQV9SRUdfT0ZGU0VUCTB4MWUwMAkvKiBydyA1MTIgYnl0ZXMgbG9uZyAqLwotCi0jZGVmaW5lIE5DUjUzODBfaW1wbGVtZW50YXRpb25fZmllbGRzIFwKLSAgICB2b2lkIF9faW9tZW0gKmJhc2UKLQotI2RlZmluZSBUMTI4X2FkZHJlc3MocmVnKSBcCi0JKCgoc3RydWN0IE5DUjUzODBfaG9zdGRhdGEgKilzaG9zdF9wcml2KGluc3RhbmNlKSktPmJhc2UgKyBUXzUzODBfT0ZGU0VUICsgKChyZWcpICogMHgyMCkpCi0KLSNkZWZpbmUgTkNSNTM4MF9yZWFkKHJlZykgcmVhZGIoVDEyOF9hZGRyZXNzKHJlZykpCi0jZGVmaW5lIE5DUjUzODBfd3JpdGUocmVnLCB2YWx1ZSkgd3JpdGViKCh2YWx1ZSksKFQxMjhfYWRkcmVzcyhyZWcpKSkKLQotI2RlZmluZSBOQ1I1MzgwX2RtYV94ZmVyX2xlbihpbnN0YW5jZSwgY21kLCBwaGFzZSkJKGNtZC0+dHJhbnNmZXJzaXplKQotI2RlZmluZSBOQ1I1MzgwX2RtYV9yZWN2X3NldHVwCQl0MTI4X3ByZWFkCi0jZGVmaW5lIE5DUjUzODBfZG1hX3NlbmRfc2V0dXAJCXQxMjhfcHdyaXRlCi0jZGVmaW5lIE5DUjUzODBfZG1hX3Jlc2lkdWFsKGluc3RhbmNlKQkoMCkKLQotI2RlZmluZSBOQ1I1MzgwX2ludHIgdDEyOF9pbnRyCi0jZGVmaW5lIE5DUjUzODBfcXVldWVfY29tbWFuZCB0MTI4X3F1ZXVlX2NvbW1hbmQKLSNkZWZpbmUgTkNSNTM4MF9hYm9ydCB0MTI4X2Fib3J0Ci0jZGVmaW5lIE5DUjUzODBfYnVzX3Jlc2V0IHQxMjhfYnVzX3Jlc2V0Ci0jZGVmaW5lIE5DUjUzODBfaW5mbyB0MTI4X2luZm8KLQotI2RlZmluZSBOQ1I1MzgwX2lvX2RlbGF5KHgpCQl1ZGVsYXkoeCkKLQotLyogMTUgMTQgMTIgMTAgNyA1IDMKLSAgIDExMDEgMDEwMCAxMDEwIDEwMDAgKi8KLQotI2RlZmluZSBUMTI4X0lSUVMgMHhjNGE4Ci0KLSNlbmRpZiAvKiBUMTI4X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMgYi9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGViNTBiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcxICswLDAgQEAKLS8qCi0gKiAgICAgIHUxNC0zNGYuYyAtIExvdy1sZXZlbCBkcml2ZXIgZm9yIFVsdHJhU3RvciAxNEYvMzRGIFNDU0kgaG9zdCBhZGFwdGVycy4KLSAqCi0gKiAgICAgIDAzIEp1biAyMDAzIFJldi4gOC4xMCBmb3IgbGludXgtMi41LjcwCi0gKiAgICAgICAgKyBVcGRhdGUgZm9yIG5ldyBJUlEgQVBJLgotICogICAgICAgICsgVXNlICJnb3RvIiB3aGVuIGFwcHJvcHJpYXRlLgotICogICAgICAgICsgRHJvcCB1MTQtMzRmLmguCi0gKiAgICAgICAgKyBVcGRhdGUgZm9yIG5ldyBtb2R1bGVfcGFyYW0gQVBJLgotICogICAgICAgICsgTW9kdWxlIHBhcmFtZXRlcnMgIGNhbiBub3cgYmUgc3BlY2lmaWVkIG9ubHkgaW4gdGhlCi0gKiAgICAgICAgICBzYW1lIGZvcm1hdCBhcyB0aGUga2VybmVsIGJvb3Qgb3B0aW9ucy4KLSAqCi0gKiAgICAgICAgICAgICBib290IG9wdGlvbiAgICBvbGQgbW9kdWxlIHBhcmFtIAotICogICAgICAgICAgICAgLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgICAgICAgICAgICBhZGRyLC4uLiAgICAgICBpb19wb3J0PWFkZHIsLi4uCi0gKiAgICAgICAgICAgICBsYzpbeXxuXSAgICAgICBsaW5rZWRfY29tbT1bMXwwXQotICogICAgICAgICAgICAgbXE6eHggICAgICAgICAgbWF4X3F1ZXVlX2RlcHRoPXh4Ci0gKiAgICAgICAgICAgICB0bTpbMHwxfDJdICAgICB0YWdfbW9kZT1bMHwxfDJdCi0gKiAgICAgICAgICAgICBldDpbeXxuXSAgICAgICBleHRfdHJhbj1bMXwwXQotICogICAgICAgICAgICAgb2Y6W3l8bl0gICAgICAgaGF2ZV9vbGRfZmlybXdhcmU9WzF8MF0KLSAqCi0gKiAgICAgICAgICBBIHZhbGlkIGV4YW1wbGUgdXNpbmcgdGhlIG5ldyBwYXJhbWV0ZXIgZm9ybWF0IGlzOgotICogICAgICAgICAgbW9kcHJvYmUgdTE0LTM0ZiAidTE0LTM0Zj0weDM0MCwweDMzMCxsYzp5LHRtOjAsbXE6NCIKLSAqCi0gKiAgICAgICAgICB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBvbGQgZm9ybWF0OgotICogICAgICAgICAgbW9kcHJvYmUgdTE0LTM0ZiBpb19wb3J0PTB4MzQwLDB4MzMwIGxpbmtlZF9jb21tPTEgdGFnX21vZGU9MCBcCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIG1heF9xdWV1ZV9kZXB0aD00Ci0gKgotICogICAgICAgICAgV2l0aCBhY3R1YWwgbW9kdWxlIGNvZGUsIHUxNC0zNGYgYW5kIHUxNF8zNGYgYXJlIGVxdWl2YWxlbnQKLSAqICAgICAgICAgIGFzIG1vZHVsZSBwYXJhbWV0ZXIgbmFtZXMuCi0gKgotICogICAgICAxMiBGZWIgMjAwMyBSZXYuIDguMDQgZm9yIGxpbnV4IDIuNS42MAotICogICAgICAgICsgUmVsZWFzZSBpcnEgYmVmb3JlIGNhbGxpbmcgc2NzaV9yZWdpc3Rlci4KLSAqCi0gKiAgICAgIDEyIE5vdiAyMDAyIFJldi4gOC4wMiBmb3IgbGludXggMi41LjQ3Ci0gKiAgICAgICAgKyBSZWxlYXNlIGRyaXZlcl9sb2NrIGJlZm9yZSBjYWxsaW5nIHNjc2lfcmVnaXN0ZXIuCi0gKgotICogICAgICAxMSBOb3YgMjAwMiBSZXYuIDguMDEgZm9yIGxpbnV4IDIuNS40NwotICogICAgICAgICsgRml4ZWQgYmlvc19wYXJhbSBhbmQgc2NzaWNhbV9iaW9zX3BhcmFtIGNhbGxpbmcgcGFyYW1ldGVycy4KLSAqCi0gKiAgICAgIDI4IE9jdCAyMDAyIFJldi4gOC4wMCBmb3IgbGludXggMi41LjQ0LWFjNAotICogICAgICAgICsgVXNlIG5ldyB0Y3EgYW5kIGFkanVzdF9xdWV1ZV9kZXB0aCBhcGkuCi0gKiAgICAgICAgKyBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAodG06WzAtMl0pIHRvIGNob29zZSB0aGUgdHlwZSBvZiB0YWdzOgotICogICAgICAgICAgMCAtPiBkaXNhYmxlIHRhZ2dpbmcgOyAxIC0+IHNpbXBsZSB0YWdzICA7IDIgLT4gb3JkZXJlZCB0YWdzLgotICogICAgICAgICAgRGVmYXVsdCBpcyB0bTowICh0YWdnZWQgY29tbWFuZHMgZGlzYWJsZWQpLgotICogICAgICAgICAgRm9yIGNvbXBhdGliaWxpdHkgdGhlICJ0YzoiIG9wdGlvbiBpcyBhbiBhbGlhcyBvZiB0aGUgInRtOiIKLSAqICAgICAgICAgIG9wdGlvbjsgdGM6biBpcyBlcXVpdmFsZW50IHRvIHRtOjAgYW5kIHRjOnkgaXMgZXF1aXZhbGVudCB0bwotICogICAgICAgICAgdG06MS4KLSAqCi0gKiAgICAgIDEwIE9jdCAyMDAyIFJldi4gNy43MCBmb3IgbGludXggMi41LjQyCi0gKiAgICAgICAgKyBGb3JlcG9ydCBmcm9tIHJldmlzaW9uIDYuNzAuCi0gKgotICogICAgICAyNSBKdW4gMjAwMiBSZXYuIDYuNzAgZm9yIGxpbnV4IDIuNC4xOQotICogICAgICAgICsgRml4ZWQgZW5kaWFuLW5lc3MgcHJvYmxlbSBkdWUgdG8gYml0ZmllbGRzLgotICoKLSAqICAgICAgMjEgRmViIDIwMDIgUmV2LiA2LjUyIGZvciBsaW51eCAyLjQuMTgKLSAqICAgICAgICArIEJhY2twb3J0IGZyb20gcmV2LiA3LjIyICh1c2UgaW9fcmVxdWVzdF9sb2NrKS4KLSAqCi0gKiAgICAgIDIwIEZlYiAyMDAyIFJldi4gNy4yMiBmb3IgbGludXggMi41LjUKLSAqICAgICAgICArIFJlbW92ZSBhbnkgcmVmZXJlbmNlIHRvIHZpcnRfdG9fYnVzKCkuCi0gKiAgICAgICAgKyBGaXggcGlvIGhhbmcgd2hpbGUgZGV0ZWN0aW5nIG11bHRpcGxlIEhCQXMuCi0gKgotICogICAgICAwMSBKYW4gMjAwMiBSZXYuIDcuMjAgZm9yIGxpbnV4IDIuNS4xCi0gKiAgICAgICAgKyBVc2UgdGhlIGR5bmFtaWMgRE1BIG1hcHBpbmcgQVBJLgotICoKLSAqICAgICAgMTkgRGVjIDIwMDEgUmV2LiA3LjAyIGZvciBsaW51eCAyLjUuMQotICogICAgICAgICsgVXNlIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiBpZiBzZXQuCi0gKiAgICAgICAgKyBVc2Ugc2dsaXN0LnBhZ2UgaW5zdGVhZCBvZiBzZ2xpc3QuYWRkcmVzcy4KLSAqCi0gKiAgICAgIDExIERlYyAyMDAxIFJldi4gNy4wMCBmb3IgbGludXggMi41LjEKLSAqICAgICAgICArIFVzZSBob3N0LT5ob3N0X2xvY2sgaW5zdGVhZCBvZiBpb19yZXF1ZXN0X2xvY2suCi0gKgotICogICAgICAgMSBNYXkgMjAwMSBSZXYuIDYuMDUgZm9yIGxpbnV4IDIuNC40Ci0gKiAgICAgICAgKyBGaXggZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gZm9yIG9wY29kZSBTRU5EX0NVRV9TSEVFVCAoMHg1ZCkKLSAqCi0gKiAgICAgIDI1IEphbiAyMDAxIFJldi4gNi4wMyBmb3IgbGludXggMi40LjAKLSAqICAgICAgICArICJjaGVja19yZWdpb24iIGNhbGwgcmVwbGFjZWQgYnkgInJlcXVlc3RfcmVnaW9uIi4KLSAqCi0gKiAgICAgIDIyIE5vdiAyMDAwIFJldi4gNi4wMiBmb3IgbGludXggMi40LjAtdGVzdDExCi0gKiAgICAgICAgKyBSZW1vdmVkIG9sZCBzY3NpIGVycm9yIGhhbmRsaW5nIHN1cHBvcnQuCi0gKiAgICAgICAgKyBUaGUgb2Jzb2xldGUgYm9vdCBvcHRpb24gZmxhZyBlaDpuIGlzIHNpbGVudGx5IGlnbm9yZWQuCi0gKiAgICAgICAgKyBSZW1vdmVkIGVycm9yIG1lc3NhZ2VzIHdoaWxlIGEgZGlzayBkcml2ZSBpcyBwb3dlcmVkIHVwIGF0Ci0gKiAgICAgICAgICBib290IHRpbWUuCi0gKiAgICAgICAgKyBJbXByb3ZlZCBib290IG1lc3NhZ2VzOiBhbGwgdGFnZ2VkIGNhcGFibGUgZGV2aWNlIGFyZQotICogICAgICAgICAgaW5kaWNhdGVkIGFzICJ0YWdnZWQiLgotICoKLSAqICAgICAgMTYgU2VwIDE5OTkgUmV2LiA1LjExIGZvciBsaW51eCAyLjIuMTIgYW5kIDIuMy4xOAotICogICAgICAgICsgVXBkYXRlZCB0byB0aGUgbmV3IF9fc2V0dXAgaW50ZXJmYWNlIGZvciBib290IGNvbW1hbmQgbGluZSBvcHRpb25zLgotICogICAgICAgICsgV2hlbiBsb2FkZWQgYXMgYSBtb2R1bGUsIGFjY2VwdHMgdGhlIG5ldyBwYXJhbWV0ZXIgYm9vdF9vcHRpb25zCi0gKiAgICAgICAgICB3aGljaCB2YWx1ZSBpcyBhIHN0cmluZyB3aXRoIHRoZSBzYW1lIGZvcm1hdCBvZiB0aGUga2VybmVsIGJvb3QKLSAqICAgICAgICAgIGNvbW1hbmQgbGluZSBvcHRpb25zLiBBIHZhbGlkIGV4YW1wbGUgaXM6Ci0gKiAgICAgICAgICBtb2Rwcm9iZSB1MTQtMzRmICdib290X29wdGlvbnM9IjB4MjMwLDB4MzQwLGxjOnksbXE6NCInCi0gKgotICogICAgICAyMiBKdWwgMTk5OSBSZXYuIDUuMDAgZm9yIGxpbnV4IDIuMi4xMCBhbmQgMi4zLjExCi0gKiAgICAgICAgKyBSZW1vdmVkIHByZS0yLjIgc291cmNlIGNvZGUgY29tcGF0aWJpbGl0eS4KLSAqCi0gKiAgICAgIDI2IEp1bCAxOTk4IFJldi4gNC4zMyBmb3IgbGludXggMi4wLjM1IGFuZCAyLjEuMTExCi0gKiAgICAgICAgICBBZGRlZCBjb21tYW5kIGxpbmUgb3B0aW9uIChldDpbeXxuXSkgdG8gdXNlIHRoZSBleGlzdGluZwotICogICAgICAgICAgdHJhbnNsYXRpb24gKHJldHVybmVkIGJ5IHNjc2ljYW1fYmlvc19wYXJhbSkgYXMgZGlzayBnZW9tZXRyeS4KLSAqICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIGV0Om4sIHdoaWNoIHVzZXMgdGhlIGRpc2sgZ2VvbWV0cnkganVtcGVyZWQKLSAqICAgICAgICAgIG9uIHRoZSBib2FyZC4KLSAqICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGV0Om4gaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBwcmV2aW91cyByZXZpc2lvbnMKLSAqICAgICAgICAgIG9mIHRoaXMgZHJpdmVyLgotICoKLSAqICAgICAgMjggTWF5IDE5OTggUmV2LiA0LjMyIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS4xMDQKLSAqICAgICAgICAgIEluY3JlYXNlZCBidXN5IHRpbWVvdXQgZnJvbSAxMCBtc2VjLiB0byAyMDAgbXNlYy4gd2hpbGUKLSAqICAgICAgICAgIHByb2Nlc3NpbmcgaW50ZXJydXB0cy4KLSAqCi0gKiAgICAgIDE4IE1heSAxOTk4IFJldi4gNC4zMSBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuMTAyCi0gKiAgICAgICAgICBJbXByb3ZlZCBhYm9ydCBoYW5kbGluZyBkdXJpbmcgdGhlIGVoIHJlY292ZXJ5IHByb2Nlc3MuCi0gKgotICogICAgICAxMyBNYXkgMTk5OCBSZXYuIDQuMzAgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjEwMQotICogICAgICAgICAgVGhlIGRyaXZlciBpcyBub3cgZnVsbHkgU01QIHNhZmUsIGluY2x1ZGluZyB0aGUKLSAqICAgICAgICAgIGFib3J0IGFuZCByZXNldCByb3V0aW5lcy4KLSAqICAgICAgICAgIEFkZGVkIGNvbW1hbmQgbGluZSBvcHRpb25zIChlaDpbeXxuXSkgdG8gY2hvb3NlIGJldHdlZW4KLSAqICAgICAgICAgIG5ld19laF9jb2RlIGFuZCB0aGUgb2xkIHNjc2kgY29kZS4KLSAqICAgICAgICAgIElmIGxpbnV4IHZlcnNpb24gPj0gMi4xLjEwMSB0aGUgZGVmYXVsdCBpcyBlaDp5LCB3aGlsZSB0aGUgZWgKLSAqICAgICAgICAgIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBwcmV2aW91cyByZWxlYXNlcyBhbmQgdGhlIG9sZCBzY3NpIGNvZGUKLSAqICAgICAgICAgIGlzIHVzZWQuCi0gKgotICogICAgICAxOCBBcHIgMTk5OCBSZXYuIDQuMjAgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjk3Ci0gKiAgICAgICAgICBSZXdvcmtlZCBpbnRlcnJ1cHQgaGFuZGxlci4KLSAqCi0gKiAgICAgIDExIEFwciAxOTk4IHJldi4gNC4wNSBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuOTUKLSAqICAgICAgICAgIE1ham9yIHJlbGlhYmlsaXR5IGltcHJvdmVtZW50OiB3aGVuIGEgYmF0Y2ggd2l0aCBvdmVybGFwcGluZwotICogICAgICAgICAgcmVxdWVzdHMgaXMgZGV0ZWN0ZWQsIHJlcXVlc3RzIGFyZSBxdWV1ZWQgb25lIGF0IGEgdGltZQotICogICAgICAgICAgZWxpbWluYXRpbmcgYW55IHBvc3NpYmxlIGJvYXJkIG9yIGRyaXZlIHJlb3JkZXJpbmcuCi0gKgotICogICAgICAxMCBBcHIgMTk5OCByZXYuIDQuMDQgZm9yIGxpbnV4IDIuMC4zMyBhbmQgMi4xLjk1Ci0gKiAgICAgICAgICBJbXByb3ZlZCBTTVAgc3VwcG9ydCAoaWYgbGludXggdmVyc2lvbiA+PSAyLjEuOTUpLgotICoKLSAqICAgICAgIDkgQXByIDE5OTggcmV2LiA0LjAzIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS45NAotICogICAgICAgICAgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQ6IHdoZW4gc2VxdWVudGlhbCBpL28gaXMgZGV0ZWN0ZWQsCi0gKiAgICAgICAgICBhbHdheXMgdXNlIGRpcmVjdCBzb3J0IGluc3RlYWQgb2YgcmV2ZXJzZSBzb3J0LgotICoKLSAqICAgICAgIDQgQXByIDE5OTggcmV2LiA0LjAyIGZvciBsaW51eCAyLjAuMzMgYW5kIDIuMS45MgotICogICAgICAgICAgaW9fcG9ydCBpcyBub3cgdW5zaWduZWQgbG9uZy4KLSAqCi0gKiAgICAgIDE3IE1hciAxOTk4IHJldi4gNC4wMSBmb3IgbGludXggMi4wLjMzIGFuZCAyLjEuODgKLSAqICAgICAgICAgIFVzZSBuZXcgc2NzaSBlcnJvciBoYW5kbGluZyBjb2RlIChpZiBsaW51eCB2ZXJzaW9uID49IDIuMS44OCkuCi0gKiAgICAgICAgICBVc2UgbmV3IGludGVycnVwdCBjb2RlLgotICoKLSAqICAgICAgMTIgU2VwIDE5OTcgcmV2LiAzLjExIGZvciBsaW51eCAyLjAuMzAgYW5kIDIuMS41NQotICogICAgICAgICAgVXNlIG9mIHVkZWxheSBpbnNpZGUgdGhlIHdhaXQgbG9vcHMgdG8gYXZvaWQgdGltZW91dAotICogICAgICAgICAgcHJvYmxlbXMgd2l0aCBmYXN0IGNwdXMuCi0gKiAgICAgICAgICBSZW1vdmVkIGNoZWNrIGFib3V0IHVzZWxlc3MgY2FsbHMgdG8gdGhlIGludGVycnVwdCBzZXJ2aWNlCi0gKiAgICAgICAgICByb3V0aW5lIChyZXBvcnRlZCBvbiBTTVAgc3lzdGVtcyBvbmx5KS4KLSAqICAgICAgICAgIEF0IGluaXRpYWxpemF0aW9uIHRpbWUgInNvcnRlZC91bnNvcnRlZCIgaXMgZGlzcGxheWVkIGluc3RlYWQKLSAqICAgICAgICAgIG9mICJsaW5rZWQvdW5saW5rZWQiIHRvIHJlaW5mb3JjZSB0aGUgZmFjdCB0aGF0ICJsaW5raW5nIiBpcwotICogICAgICAgICAgbm90aGluZyBidXQgImVsZXZhdG9yIHNvcnRpbmciIGluIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24uCi0gKgotICogICAgICAxNyBNYXkgMTk5NyByZXYuIDMuMTAgZm9yIGxpbnV4IDIuMC4zMCBhbmQgMi4xLjM4Ci0gKiAgICAgICAgICBVc2Ugb2Ygc2VyaWFsX251bWJlcl9hdF90aW1lb3V0IGluIGFib3J0IGFuZCByZXNldCBwcm9jZXNzaW5nLgotICogICAgICAgICAgVXNlIG9mIHRoZSBfX2luaXRmdW5jIGFuZCBfX2luaXRkYXRhIG1hY3JvIGluIHNldHVwIGNvZGUuCi0gKiAgICAgICAgICBNaW5vciBjbGVhbnVwcyBpbiB0aGUgbGlzdF9zdGF0aXN0aWNzIGNvZGUuCi0gKgotICogICAgICAyNCBGZWIgMTk5NyByZXYuIDMuMDAgZm9yIGxpbnV4IDIuMC4yOSBhbmQgMi4xLjI2Ci0gKiAgICAgICAgICBXaGVuIGxvYWRpbmcgYXMgYSBtb2R1bGUsIHBhcmFtZXRlciBwYXNzaW5nIGlzIG5vdyBzdXBwb3J0ZWQKLSAqICAgICAgICAgIGJvdGggaW4gMi4wIGFuZCBpbiAyLjEgc3R5bGUuCi0gKiAgICAgICAgICBGaXhlZCBkYXRhIHRyYW5zZmVyIGRpcmVjdGlvbiBmb3Igc29tZSBTQ1NJIG9wY29kZXMuCi0gKiAgICAgICAgICBJbW1lZGlhdGUgYWNrbm93bGVkZ2UgdG8gcmVxdWVzdCBzZW5zZSBjb21tYW5kcy4KLSAqICAgICAgICAgIExpbmtlZCBjb21tYW5kcyB0byBlYWNoIGRpc2sgZGV2aWNlIGFyZSBub3cgcmVvcmRlcmVkIGJ5IGVsZXZhdG9yCi0gKiAgICAgICAgICBzb3J0aW5nLiBSYXJlIGNhc2VzIGluIHdoaWNoIHJlb3JkZXJpbmcgb2Ygd3JpdGUgcmVxdWVzdHMgY291bGQKLSAqICAgICAgICAgIGNhdXNlIHdyb25nIHJlc3VsdHMgYXJlIG1hbmFnZWQuCi0gKgotICogICAgICAxOCBKYW4gMTk5NyByZXYuIDIuNjAgZm9yIGxpbnV4IDIuMS4yMSBhbmQgMi4wLjI4Ci0gKiAgICAgICAgICBBZGRlZCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZSBsaW5rZWQgY29tbWFuZHMKLSAqICAgICAgICAgIChsYzpbeXxuXSksIG9sZCBmaXJtd2FyZSBzdXBwb3J0IChvZjpbeXxuXSkgYW5kIHRvIHNldCB0aGUgbWF4Ci0gKiAgICAgICAgICBxdWV1ZSBkZXB0aCAobXE6eHgpLiBEZWZhdWx0IGlzICJ1MTQtMzRmPWxjOm4sb2Y6bixtcTo4Ii4KLSAqICAgICAgICAgIEltcHJvdmVkIGNvbW1hbmQgbGlua2luZy4KLSAqCi0gKiAgICAgICA4IEphbiAxOTk3IHJldi4gMi41MCBmb3IgbGludXggMi4xLjIwIGFuZCAyLjAuMjcKLSAqICAgICAgICAgIEFkZGVkIGxpbmtlZCBjb21tYW5kIHN1cHBvcnQuCi0gKgotICogICAgICAgMyBEZWMgMTk5NiByZXYuIDIuNDAgZm9yIGxpbnV4IDIuMS4xNCBhbmQgMi4wLjI3Ci0gKiAgICAgICAgICBBZGRlZCBxdWV1ZSBkZXB0aCBhZGp1c3RtZW50LgotICoKLSAqICAgICAgMjIgTm92IDE5OTYgcmV2LiAyLjMwIGZvciBsaW51eCAyLjEuMTIgYW5kIDIuMC4yNgotICogICAgICAgICAgVGhlIGxpc3Qgb2YgaS9vIHBvcnRzIHRvIGJlIHByb2JlZCBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCi0gKiAgICAgICAgICAidTE0LTM0Zj1wb3J0MCxwb3J0MSwuLi4uIiBib290IGNvbW1hbmQgbGluZSBvcHRpb24uCi0gKiAgICAgICAgICBTY2F0dGVyL2dhdGhlciBsaXN0cyBhcmUgbm93IGFsbG9jYXRlZCBieSBhIG51bWJlciBvZiBrbWFsbG9jCi0gKiAgICAgICAgICBjYWxscywgaW4gb3JkZXIgdG8gYXZvaWQgdGhlIHByZXZpb3VzIHNpemUgbGltaXQgb2YgNjRLYi4KLSAqCi0gKiAgICAgIDE2IE5vdiAxOTk2IHJldi4gMi4yMCBmb3IgbGludXggMi4xLjEwIGFuZCAyLjAuMjUKLSAqICAgICAgICAgIEFkZGVkIG11bHRpY2hhbm5lbCBzdXBwb3J0LgotICoKLSAqICAgICAgMjcgU2VwIDE5OTYgcmV2LiAyLjEyIGZvciBsaW51eCAyLjEuMAotICogICAgICAgICAgUG9ydGFiaWxpdHkgY2xlYW51cHMgKHZpcnR1YWwvYnVzIGFkZHJlc3NpbmcsIGxpdHRsZS9iaWcgZW5kaWFuCi0gKiAgICAgICAgICBzdXBwb3J0KS4KLSAqCi0gKiAgICAgIDA5IEp1bCAxOTk2IHJldi4gMi4xMSBmb3IgbGludXggMi4wLjQKLSAqICAgICAgICAgICJEYXRhIG92ZXIvdW5kZXItcnVuIiBubyBsb25nZXIgaW1wbGllcyBhIHJlZG8gb24gYWxsIHRhcmdldHMuCi0gKiAgICAgICAgICBOdW1iZXIgb2YgaW50ZXJuYWwgcmV0cmllcyBpcyBub3cgbGltaXRlZC4KLSAqCi0gKiAgICAgIDE2IEFwciAxOTk2IHJldi4gMi4xMCBmb3IgbGludXggMS4zLjkwCi0gKiAgICAgICAgICBOZXcgYXJndW1lbnQgInJlc2V0X2ZsYWdzIiB0byB0aGUgcmVzZXQgcm91dGluZS4KLSAqCi0gKiAgICAgIDIxIEp1bCAxOTk1IHJldi4gMi4wMiBmb3IgbGludXggMS4zLjExCi0gKiAgICAgICAgICBGaXhlZCBEYXRhIFRyYW5zZmVyIERpcmVjdGlvbiBmb3Igc29tZSBTQ1NJIGNvbW1hbmRzLgotICoKLSAqICAgICAgMTMgSnVuIDE5OTUgcmV2LiAyLjAxIGZvciBsaW51eCAxLjIuMTAKLSAqICAgICAgICAgIEhBVkVfT0xEX1VYNEZfRklSTVdBUkUgc2hvdWxkIGJlIGRlZmluZWQgZm9yIFUzNEYgYm9hcmRzIHdoZW4KLSAqICAgICAgICAgIHRoZSBmaXJtd2FyZSBwcm9tIGlzIG5vdCB0aGUgbGF0ZXN0IG9uZSAoMjgwMDgtMDA2KS4KLSAqCi0gKiAgICAgIDExIE1hciAxOTk1IHJldi4gMi4wMCBmb3IgbGludXggMS4yLjAKLSAqICAgICAgICAgIEZpeGVkIGEgYnVnIHdoaWNoIHByZXZlbnRlZCBtZWRpYSBjaGFuZ2UgZGV0ZWN0aW9uIGZvciByZW1vdmFibGUKLSAqICAgICAgICAgIGRpc2sgZHJpdmVzLgotICoKLSAqICAgICAgMjMgRmViIDE5OTUgcmV2LiAxLjE4IGZvciBsaW51eCAxLjEuOTQKLSAqICAgICAgICAgIEFkZGVkIGEgY2hlY2sgZm9yIHNjc2lfcmVnaXN0ZXIgcmV0dXJuaW5nIE5VTEwuCi0gKgotICogICAgICAxMSBGZWIgMTk5NSByZXYuIDEuMTcgZm9yIGxpbnV4IDEuMS45MQotICogICAgICAgICAgVTE0RiBxdWFsaWZpZWQgdG8gcnVuIHdpdGggMzIgc2dsaXN0cy4KLSAqICAgICAgICAgIE5vdyBERUJVR19SRVNFVCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgotICoKLSAqICAgICAgIDkgRmViIDE5OTUgcmV2LiAxLjE2IGZvciBsaW51eCAxLjEuOTAKLSAqICAgICAgICAgIFVzZSBob3N0LT53aXNoX2Jsb2NrIGluc3RlYWQgb2YgaG9zdC0+YmxvY2suCi0gKgotICogICAgICAgOCBGZWIgMTk5NSByZXYuIDEuMTUgZm9yIGxpbnV4IDEuMS44OQotICogICAgICAgICAgQ2xlYXJlZCB0YXJnZXRfdGltZV9vdXQgY291bnRlciB3aGlsZSBwZXJmb3JtaW5nIGEgcmVzZXQuCi0gKgotICogICAgICAyOCBKYW4gMTk5NSByZXYuIDEuMTQgZm9yIGxpbnV4IDEuMS44NgotICogICAgICAgICAgQWRkZWQgbW9kdWxlIHN1cHBvcnQuCi0gKiAgICAgICAgICBMb2cgYW5kIGRvIGEgcmV0cnkgd2hlbiBhIGRpc2sgZHJpdmUgcmV0dXJucyBhIHRhcmdldCBzdGF0dXMKLSAqICAgICAgICAgIGRpZmZlcmVudCBmcm9tIHplcm8gb24gYSByZWNvdmVyZWQgZXJyb3IuCi0gKiAgICAgICAgICBBdXRvIGRldGVjdHMgaWYgVTE0RiBib2FyZHMgaGF2ZSBhbiBvbGQgZmlybXdhcmUgcmV2aXNpb24uCi0gKiAgICAgICAgICBNYXggbnVtYmVyIG9mIHNjYXR0ZXIvZ2F0aGVyIGxpc3RzIHNldCB0byAxNiBmb3IgYWxsIGJvYXJkcwotICogICAgICAgICAgKG1vc3QgaW5zdGFsbGF0aW9uIHJ1biBmaW5lIHVzaW5nIDMzIHNnbGlzdHMsIHdoaWxlIG90aGVyCi0gKiAgICAgICAgICBoYXMgcHJvYmxlbXMgd2hlbiB1c2luZyBtb3JlIHRoYW4gMTYpLgotICoKLSAqICAgICAgMTYgSmFuIDE5OTUgcmV2LiAxLjEzIGZvciBsaW51eCAxLjEuODEKLSAqICAgICAgICAgIERpc3BsYXkgYSBtZXNzYWdlIGlmIGNoZWNrX3JlZ2lvbiBkZXRlY3RzIGEgcG9ydCBhZGRyZXNzCi0gKiAgICAgICAgICBhbHJlYWR5IGluIHVzZS4KLSAqCi0gKiAgICAgIDE1IERlYyAxOTk0IHJldi4gMS4xMiBmb3IgbGludXggMS4xLjc0Ci0gKiAgICAgICAgICBUaGUgaG9zdC0+YmxvY2sgZmxhZyBpcyBzZXQgZm9yIGFsbCB0aGUgZGV0ZWN0ZWQgSVNBIGJvYXJkcy4KLSAqCi0gKiAgICAgIDMwIE5vdiAxOTk0IHJldi4gMS4xMSBmb3IgbGludXggMS4xLjY4Ci0gKiAgICAgICAgICBSZWRvIGkvbyBvbiB0YXJnZXQgc3RhdHVzIENIRUNLX0NPTkRJVElPTiBmb3IgVFlQRV9ESVNLIG9ubHkuCi0gKiAgICAgICAgICBBZGRlZCBvcHRpb25hbCBzdXBwb3J0IGZvciB1c2luZyBhIHNpbmdsZSBib2FyZCBhdCBhIHRpbWUuCi0gKgotICogICAgICAxNCBOb3YgMTk5NCByZXYuIDEuMTAgZm9yIGxpbnV4IDEuMS42MwotICoKLSAqICAgICAgMjggT2N0IDE5OTQgcmV2LiAxLjA5IGZvciBsaW51eCAxLjEuNTggIEZpbmFsIEJFVEEgcmVsZWFzZS4KLSAqICAgICAgMTYgSnVsIDE5OTQgcmV2LiAxLjAwIGZvciBsaW51eCAxLjEuMjkgIEluaXRpYWwgQUxQSEEgcmVsZWFzZS4KLSAqCi0gKiAgICAgICAgICBUaGlzIGRyaXZlciBpcyBhIHRvdGFsIHJlcGxhY2VtZW50IG9mIHRoZSBvcmlnaW5hbCBVbHRyYVN0b3IKLSAqICAgICAgICAgIHNjc2kgZHJpdmVyLCBidXQgaXQgc3VwcG9ydHMgT05MWSB0aGUgMTRGIGFuZCAzNEYgYm9hcmRzLgotICogICAgICAgICAgSXQgY2FuIGJlIGNvbmZpZ3VyZWQgaW4gdGhlIHNhbWUga2VybmVsIGluIHdoaWNoIHRoZSBvcmlnaW5hbAotICogICAgICAgICAgdWx0cmFzdG9yIGRyaXZlciBpcyBjb25maWd1cmVkIHRvIGFsbG93IHRoZSBvcmlnaW5hbCBVMjRGCi0gKiAgICAgICAgICBzdXBwb3J0LgotICoKLSAqICAgICAgICAgIE11bHRpcGxlIFUxNEYgYW5kL29yIFUzNEYgaG9zdCBhZGFwdGVycyBhcmUgc3VwcG9ydGVkLgotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMyBEYXJpbyBCYWxsYWJpbyAoYmFsbGFiaW9fZGFyaW9AZW1jLmNvbSkKLSAqCi0gKiAgQWx0ZXJuYXRlIGVtYWlsOiBkYXJpby5iYWxsYWJpb0BpbndpbmQuaXQsIGRhcmlvLmJhbGxhYmlvQHRpc2NhbGluZXQuaXQKLSAqCi0gKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgcmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZQotICogIGNvZGUgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIGNvbW1lbnQgd2l0aG91dAotICogIG1vZGlmaWNhdGlvbi4KLSAqCi0gKiAgICAgIFdBUk5JTkc6IGlmIHlvdXIgMTQvMzRGIGJvYXJkIGhhcyBhbiBvbGQgZmlybXdhcmUgcmV2aXNpb24gKHNlZSBiZWxvdykKLSAqICAgICAgICAgICAgICAgeW91IG11c3QgY2hhbmdlICIjdW5kZWYiIGludG8gIiNkZWZpbmUiIGluIHRoZSBmb2xsb3dpbmcKLSAqICAgICAgICAgICAgICAgc3RhdGVtZW50LgotICovCi0jdW5kZWYgSEFWRV9PTERfVVg0Rl9GSVJNV0FSRQotLyoKLSAqICBUaGUgVWx0cmFTdG9yIDE0RiwgMjRGLCBhbmQgMzRGIGFyZSBhIGZhbWlseSBvZiBpbnRlbGxpZ2VudCwgaGlnaAotICogIHBlcmZvcm1hbmNlIFNDU0ktMiBob3N0IGFkYXB0ZXJzLgotICogIEhlcmUgaXMgdGhlIHNjb29wIG9uIHRoZSB2YXJpb3VzIG1vZGVsczoKLSAqCi0gKiAgMTRGIC0gSVNBIGZpcnN0LXBhcnR5IERNQSBIQSB3aXRoIGZsb3BweSBzdXBwb3J0IGFuZCBXRDEwMDMgZW11bGF0aW9uLgotICogIDI0RiAtIEVJU0EgQnVzIE1hc3RlciBIQSB3aXRoIGZsb3BweSBzdXBwb3J0IGFuZCBXRDEwMDMgZW11bGF0aW9uLgotICogIDM0RiAtIFZFU0EgTG9jYWwtQnVzIEJ1cyBNYXN0ZXIgSEEgKG5vIFdEMTAwMyBlbXVsYXRpb24pLgotICoKLSAqICBUaGlzIGNvZGUgaGFzIGJlZW4gdGVzdGVkIHdpdGggdXAgdG8gdHdvIFUxNEYgYm9hcmRzLCB1c2luZyBib3RoCi0gKiAgZmlybXdhcmUgMjgwMDQtMDA1LzM4MDA0LTAwNCAoQklPUyByZXYuIDIuMDApIGFuZCB0aGUgbGF0ZXN0IGZpcm13YXJlCi0gKiAgMjgwMDQtMDA2LzM4MDA0LTAwNSAoQklPUyByZXYuIDIuMDEpLgotICoKLSAqICBUaGUgbGF0ZXN0IGZpcm13YXJlIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIGdldCByZWxpYWJsZSBvcGVyYXRpb25zIHdoZW4KLSAqICBjbHVzdGVyaW5nIGlzIGVuYWJsZWQuIEVOQUJMRV9DTFVTVEVSSU5HIHByb3ZpZGVzIGEgcGVyZm9ybWFuY2UgaW5jcmVhc2UKLSAqICB1cCB0byA1MCUgb24gc2VxdWVudGlhbCBhY2Nlc3MuCi0gKgotICogIFNpbmNlIHRoZSBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHN0cnVjdHVyZSBpcyBzaGFyZWQgYW1vbmcgYWxsIDE0RiBhbmQgMzRGLAotICogIHRoZSBsYXN0IHNldHRpbmcgb2YgdXNlX2NsdXN0ZXJpbmcgaXMgaW4gZWZmZWN0IGZvciBhbGwgb2YgdGhlc2UgYm9hcmRzLgotICoKLSAqICBIZXJlIGEgc2FtcGxlIGNvbmZpZ3VyYXRpb24gdXNpbmcgdHdvIFUxNEYgYm9hcmRzOgotICoKLSBVMTRGMDogSVNBIDB4MzMwLCBCSU9TIDB4YzgwMDAsIElSUSAxMSwgRE1BIDUsIFNHIDMyLCBNQiAxNiwgb2Y6biwgbGM6eSwgbXE6OC4KLSBVMTRGMTogSVNBIDB4MzQwLCBCSU9TIDB4MDAwMDAsIElSUSAxMCwgRE1BIDYsIFNHIDMyLCBNQiAxNiwgb2Y6biwgbGM6eSwgbXE6OC4KLSAqCi0gKiAgVGhlIGJvb3QgY29udHJvbGxlciBtdXN0IGhhdmUgaXRzIEJJT1MgZW5hYmxlZCwgd2hpbGUgb3RoZXIgYm9hcmRzIGNhbgotICogIGhhdmUgdGhlaXIgQklPUyBkaXNhYmxlZCwgb3IgZW5hYmxlZCB0byBhbiBoaWdoZXIgYWRkcmVzcy4KLSAqICBCb2FyZHMgYXJlIG5hbWVkIFV4NEYwLCBVeDRGMS4uLiwgYWNjb3JkaW5nIHRvIHRoZSBwb3J0IGFkZHJlc3Mgb3JkZXIgaW4KLSAqICB0aGUgaW9fcG9ydFtdIGFycmF5LgotICoKLSAqICBUaGUgZm9sbG93aW5nIGZhY3RzIGFyZSBiYXNlZCBvbiByZWFsIHRlc3RpbmcgcmVzdWx0cyAobm90IG9uCi0gKiAgZG9jdW1lbnRhdGlvbikgb24gdGhlIGFib3ZlIFUxNEYgYm9hcmQuCi0gKgotICogIC0gVGhlIFUxNEYgYm9hcmQgc2hvdWxkIGJlIGp1bXBlcmVkIGZvciBidXMgb24gdGltZSBsZXNzIG9yIGVxdWFsIHRvIDcKLSAqICAgIG1pY3Jvc2Vjb25kcywgd2hpbGUgdGhlIGRlZmF1bHQgaXMgMTEgbWljcm9zZWNvbmRzLiBUaGlzIGlzIG9yZGVyIHRvCi0gKiAgICBnZXQgYWNjZXB0YWJsZSBwZXJmb3JtYW5jZSB3aGlsZSB1c2luZyBmbG9wcHkgZHJpdmUgYW5kIGhhcmQgZGlzawotICogICAgdG9nZXRoZXIuIFRoZSBqdW1wZXJpbmcgZm9yIDcgbWljcm9zZWNvbmRzIGlzOiBKUDEzIHBpbiAxNS0xNiwKLSAqICAgIEpQMTQgcGluIDctOCBhbmQgcGluIDktMTAuCi0gKiAgICBUaGUgcmVkdWN0aW9uIGhhcyBhIGxpdHRsZSBpbXBhY3Qgb24gc2NzaSBwZXJmb3JtYW5jZS4KLSAqCi0gKiAgLSBJZiBzY3NpIGJ1cyBsZW5ndGggZXhjZWVkcyAzbS4sIHRoZSBzY3NpIGJ1cyBzcGVlZCBuZWVkcyB0byBiZSByZWR1Y2VkCi0gKiAgICBmcm9tIDEwTWh6IHRvIDVNaHogKGRvIHRoaXMgYnkgaW5zZXJ0aW5nIGEganVtcGVyIG9uIEpQMTMgcGluIDctOCkuCi0gKgotICogIC0gSWYgVTE0RiBvbiBib2FyZCBmaXJtd2FyZSBpcyBvbGRlciB0aGFuIDI4MDA0LTAwNi8zODAwNC0wMDUsCi0gKiAgICB0aGUgVTE0RiBib2FyZCBpcyB1bmFibGUgdG8gcHJvdmlkZSByZWxpYWJsZSBvcGVyYXRpb25zIGlmIHRoZSBzY3NpCi0gKiAgICByZXF1ZXN0IGxlbmd0aCBleGNlZWRzIDE2S2J5dGUuIFdoZW4gdGhpcyBsZW5ndGggaXMgZXhjZWVkZWQgdGhlCi0gKiAgICBiZWhhdmlvciBpczoKLSAqICAgIC0gYWRhcHRlcl9zdGF0dXMgZXF1YWwgMHg5NiBvciAweGEzIG9yIDB4OTMgb3IgMHg5NDsKLSAqICAgIC0gYWRhcHRlcl9zdGF0dXMgZXF1YWwgMCBhbmQgdGFyZ2V0X3N0YXR1cyBlcXVhbCAyIG9uIGZvciBhbGwgdGFyZ2V0cwotICogICAgICBpbiB0aGUgbmV4dCBvcGVyYXRpb24gZm9sbG93aW5nIHRoZSByZXNldC4KLSAqICAgIFRoaXMgc2VxdWVuY2UgdGFrZXMgYSBsb25nIHRpbWUgKD4zIHNlY29uZHMpLCBzbyBpbiB0aGUgbWVhbnRpbWUKLSAqICAgIHRoZSBTRF9USU1FT1VUIGluIHNkLmMgY291bGQgZXhwaXJlIGdpdmluZyByaXNlIHRvIHNjc2kgYWJvcnRzCi0gKiAgICAoU0RfVElNRU9VVCBoYXMgYmVlbiBpbmNyZWFzZWQgZnJvbSAzIHRvIDYgc2Vjb25kcyBpbiAxLjEuMzEpLgotICogICAgQmVjYXVzZSBvZiB0aGlzIEkgaGFkIHRvIERJU0FCTEVfQ0xVU1RFUklORyBhbmQgdG8gd29yayBhcm91bmQgdGhlCi0gKiAgICBidXMgcmVzZXQgaW4gdGhlIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUsIHJldHVybmluZyBESURfQlVTX0JVU1kKLSAqICAgIHNvIHRoYXQgdGhlIG9wZXJhdGlvbnMgYXJlIHJldHJpZWQgd2l0aG91dCBjb21wbGFpbnMgZnJvbSB0aGUgc2NzaS5jCi0gKiAgICBjb2RlLgotICogICAgQW55IHJlc2V0IG9mIHRoZSBzY3NpIGJ1cyBpcyBnb2luZyB0byBraWxsIHRhcGUgb3BlcmF0aW9ucywgc2luY2UKLSAqICAgIG5vIHJldHJ5IGlzIGFsbG93ZWQgZm9yIHRhcGVzLiBCdXMgcmVzZXRzIGFyZSBtb3JlIGxpa2VseSB3aGVuIHRoZQotICogICAgc2NzaSBidXMgaXMgdW5kZXIgaGVhdnkgbG9hZC4KLSAqICAgIFJlcXVlc3RzIHVzaW5nIHNjYXR0ZXIvZ2F0aGVyIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxNiB4IDEwMjQgYnl0ZXMKLSAqICAgIHdoZW4gRElTQUJMRV9DTFVTVEVSSU5HIGlzIGluIGVmZmVjdCwgYnV0IHVuc2NhdHRlcmVkIHJlcXVlc3RzIGNvdWxkIGJlCi0gKiAgICBsYXJnZXIgdGhhbiAxNktieXRlLgotICoKLSAqICAgIFRoZSBuZXcgZmlybXdhcmUgaGFzIGZpeGVkIGFsbCB0aGUgYWJvdmUgcHJvYmxlbXMuCi0gKgotICogIEZvciBVMzRGIGJvYXJkcyB0aGUgbGF0ZXN0IGJpb3MgcHJvbSBpcyAzODAwOC0wMDIgKEJJT1MgcmV2LiAyLjAxKSwKLSAqICB0aGUgbGF0ZXN0IGZpcm13YXJlIHByb20gaXMgMjgwMDgtMDA2LiBPbGRlciBmaXJtd2FyZSAyODAwOC0wMDUgaGFzCi0gKiAgcHJvYmxlbXMgd2hlbiB1c2luZyBtb3JlIHRoYW4gMTYgc2NhdHRlci9nYXRoZXIgbGlzdHMuCi0gKgotICogIFRoZSBsaXN0IG9mIGkvbyBwb3J0cyB0byBiZSBwcm9iZWQgY2FuIGJlIHRvdGFsbHkgcmVwbGFjZWQgYnkgdGhlCi0gKiAgYm9vdCBjb21tYW5kIGxpbmUgb3B0aW9uOiAidTE0LTM0Zj1wb3J0MCxwb3J0MSxwb3J0MiwuLi4iLCB3aGVyZSB0aGUKLSAqICBwb3J0MCwgcG9ydDEuLi4gYXJndW1lbnRzIGFyZSBJU0EvVkVTQSBhZGRyZXNzZXMgdG8gYmUgcHJvYmVkLgotICogIEZvciBleGFtcGxlIHVzaW5nICJ1MTQtMzRmPTB4MjMwLDB4MzQwIiwgdGhlIGRyaXZlciBwcm9iZXMgb25seSB0aGUgdHdvCi0gKiAgYWRkcmVzc2VzIDB4MjMwIGFuZCAweDM0MCBpbiB0aGlzIG9yZGVyOyAidTE0LTM0Zj0wIiB0b3RhbGx5IGRpc2FibGVzCi0gKiAgdGhpcyBkcml2ZXIuCi0gKgotICogIEFmdGVyIHRoZSBvcHRpb25hbCBsaXN0IG9mIGRldGVjdGlvbiBwcm9iZXMsIG90aGVyIHBvc3NpYmxlIGNvbW1hbmQgbGluZQotICogIG9wdGlvbnMgYXJlOgotICoKLSAqICBldDp5ICB1c2UgZGlzayBnZW9tZXRyeSByZXR1cm5lZCBieSBzY3NpY2FtX2Jpb3NfcGFyYW07Ci0gKiAgZXQ6biAgdXNlIGRpc2sgZ2VvbWV0cnkganVtcGVyZWQgb24gdGhlIGJvYXJkOwotICogIGxjOnkgIGVuYWJsZXMgbGlua2VkIGNvbW1hbmRzOwotICogIGxjOm4gIGRpc2FibGVzIGxpbmtlZCBjb21tYW5kczsKLSAqICB0bTowICBkaXNhYmxlcyB0YWdnZWQgY29tbWFuZHMgKHNhbWUgYXMgdGM6bik7Ci0gKiAgdG06MSAgdXNlIHNpbXBsZSBxdWV1ZSB0YWdzIChzYW1lIGFzIHRjOnkpOwotICogIHRtOjIgIHVzZSBvcmRlcmVkIHF1ZXVlIHRhZ3MgKHNhbWUgYXMgdGM6Mik7Ci0gKiAgb2Y6eSAgZW5hYmxlcyBvbGQgZmlybXdhcmUgc3VwcG9ydDsKLSAqICBvZjpuICBkaXNhYmxlcyBvbGQgZmlybXdhcmUgc3VwcG9ydDsKLSAqICBtcTp4eCBzZXQgdGhlIG1heCBxdWV1ZSBkZXB0aCB0byB0aGUgdmFsdWUgeHggKDIgPD0geHggPD0gOCkuCi0gKgotICogIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAidTE0LTM0Zj1sYzpuLG9mOm4sbXE6OCx0bTowLGV0Om4iLgotICogIEFuIGV4YW1wbGUgdXNpbmcgdGhlIGxpc3Qgb2YgZGV0ZWN0aW9uIHByb2JlcyBjb3VsZCBiZToKLSAqICAidTE0LTM0Zj0weDIzMCwweDM0MCxsYzp5LHRtOjIsb2Y6bixtcTo0LGV0Om4iLgotICoKLSAqICBXaGVuIGxvYWRpbmcgYXMgYSBtb2R1bGUsIHBhcmFtZXRlcnMgY2FuIGJlIHNwZWNpZmllZCBhcyB3ZWxsLgotICogIFRoZSBhYm92ZSBleGFtcGxlIHdvdWxkIGJlICh1c2UgMSBpbiBwbGFjZSBvZiB5IGFuZCAwIGluIHBsYWNlIG9mIG4pOgotICoKLSAqICBtb2Rwcm9iZSB1MTQtMzRmIGlvX3BvcnQ9MHgyMzAsMHgzNDAgbGlua2VkX2NvbW09MSBoYXZlX29sZF9maXJtd2FyZT0wIFwKLSAqICAgICAgICAgICAgICAgIG1heF9xdWV1ZV9kZXB0aD00IGV4dF90cmFuPTAgdGFnX21vZGU9MgotICoKLSAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgbGlua2VkIGNvbW1hbmRzIGFyZSBkZXNpZ25lZCB0byB3b3JrIHdpdGggYW55IERJU0sKLSAqICBvciBDRC1ST00sIHNpbmNlIHRoaXMgbGlua2luZyBoYXMgb25seSB0aGUgaW50ZW50IG9mIGNsdXN0ZXJpbmcgKHRpbWUtd2lzZSkKLSAqICBhbmQgcmVvcmRlcmluZyBieSBlbGV2YXRvciBzb3J0aW5nIGNvbW1hbmRzIGRpcmVjdGVkIHRvIGVhY2ggZGV2aWNlLAotICogIHdpdGhvdXQgYW55IHJlbGF0aW9uIHdpdGggdGhlIGFjdHVhbCBTQ1NJIHByb3RvY29sIGJldHdlZW4gdGhlIGNvbnRyb2xsZXIKLSAqICBhbmQgdGhlIGRldmljZS4KLSAqICBJZiBRIGlzIHRoZSBxdWV1ZSBkZXB0aCByZXBvcnRlZCBhdCBib290IHRpbWUgZm9yIGVhY2ggZGV2aWNlIChhbHNvIG5hbWVkCi0gKiAgY21kcy9sdW4pIGFuZCBRID4gMiwgd2hlbmV2ZXIgdGhlcmUgaXMgYWxyZWFkeSBhbiBhY3RpdmUgY29tbWFuZCB0byB0aGUKLSAqICBkZXZpY2UgYWxsIG90aGVyIGNvbW1hbmRzIHRvIHRoZSBzYW1lIGRldmljZSAgKHVwIHRvIFEtMSkgYXJlIGtlcHQgd2FpdGluZwotICogIGluIHRoZSBlbGV2YXRvciBzb3J0aW5nIHF1ZXVlLiBXaGVuIHRoZSBhY3RpdmUgY29tbWFuZCBjb21wbGV0ZXMsIHRoZQotICogIGNvbW1hbmRzIGluIHRoaXMgcXVldWUgYXJlIHNvcnRlZCBieSBzZWN0b3IgYWRkcmVzcy4gVGhlIHNvcnQgaXMgY2hvc2VuCi0gKiAgYmV0d2VlbiBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgYnkgbWluaW1pemluZyB0aGUgc2VlayBkaXN0YW5jZSBiZXR3ZWVuCi0gKiAgdGhlIHNlY3RvciBvZiB0aGUgY29tbWFuZHMganVzdCBjb21wbGV0ZWQgYW5kIHRoZSBzZWN0b3Igb2YgdGhlIGZpcnN0Ci0gKiAgY29tbWFuZCBpbiB0aGUgbGlzdCB0byBiZSBzb3J0ZWQuCi0gKiAgVHJpdmlhbCBtYXRoIGFzc3VyZXMgdGhhdCB0aGUgdW5zb3J0ZWQgYXZlcmFnZSBzZWVrIGRpc3RhbmNlIHdoZW4gZG9pbmcKLSAqICByYW5kb20gc2Vla3Mgb3ZlciBTIHNlY3RvcnMgaXMgUy8zLgotICogIFdoZW4gKFEtMSkgcmVxdWVzdHMgYXJlIHVuaWZvcm1seSBkaXN0cmlidXRlZCBvdmVyIFMgc2VjdG9ycywgdGhlIGF2ZXJhZ2UKLSAqICBkaXN0YW5jZSBiZXR3ZWVuIHR3byBhZGphY2VudCByZXF1ZXN0cyBpcyBTLygoUS0xKSArIDEpLCBzbyB0aGUgc29ydGVkCi0gKiAgYXZlcmFnZSBzZWVrIGRpc3RhbmNlIGZvciAoUS0xKSByYW5kb20gcmVxdWVzdHMgb3ZlciBTIHNlY3RvcnMgaXMgUy9RLgotICogIFRoZSBlbGV2YXRvciBzb3J0aW5nIGhlbmNlIGRpdmlkZXMgdGhlIHNlZWsgZGlzdGFuY2UgYnkgYSBmYWN0b3IgUS8zLgotICogIFRoZSBhYm92ZSBwdXJlIGdlb21ldHJpYyByZW1hcmtzIGFyZSB2YWxpZCBpbiBhbGwgY2FzZXMgYW5kIHRoZQotICogIGRyaXZlciBlZmZlY3RpdmVseSByZWR1Y2VzIHRoZSBzZWVrIGRpc3RhbmNlIGJ5IHRoZSBwcmVkaWN0ZWQgZmFjdG9yCi0gKiAgd2hlbiB0aGVyZSBhcmUgUSBjb25jdXJyZW50IHJlYWQgaS9vIG9wZXJhdGlvbnMgb24gdGhlIGRldmljZSwgYnV0IHRoaXMKLSAqICBkb2VzIG5vdCBuZWNlc3NhcmlseSByZXN1bHRzIGluIGEgbm90aWNlYWJsZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudDoKLSAqICB5b3VyIG1pbGVhZ2UgbWF5IHZhcnkuLi4uCi0gKgotICogIE5vdGU6IGNvbW1hbmQgcmVvcmRlcmluZyBpbnNpZGUgYSBiYXRjaCBvZiBxdWV1ZWQgY29tbWFuZHMgY291bGQgY2F1c2UKLSAqICAgICAgICB3cm9uZyByZXN1bHRzIG9ubHkgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHdyaXRlIHJlcXVlc3QgYW5kIHRoZQotICogICAgICAgIGludGVyc2VjdGlvbiAoc2VjdG9yLXdpc2UpIG9mIGFsbCByZXF1ZXN0cyBpcyBub3QgZW1wdHkuCi0gKiAgICAgICAgV2hlbiB0aGUgZHJpdmVyIGRldGVjdHMgYSBiYXRjaCBpbmNsdWRpbmcgb3ZlcmxhcHBpbmcgcmVxdWVzdHMKLSAqICAgICAgICAoYSByZWFsbHkgcmFyZSBldmVudCkgc3RyaWN0IHNlcmlhbCAocGlkKSBvcmRlciBpcyBlbmZvcmNlZC4KLSAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogIFRoZSBib2FyZHMgYXJlIG5hbWVkIFV4NEYwLCBVeDRGMSwuLi4gYWNjb3JkaW5nIHRvIHRoZSBkZXRlY3Rpb24gb3JkZXIuCi0gKgotICogIEluIG9yZGVyIHRvIHN1cHBvcnQgbXVsdGlwbGUgSVNBIGJvYXJkcyBpbiBhIHJlbGlhYmxlIHdheSwKLSAqICB0aGUgZHJpdmVyIHNldHMgaG9zdC0+d2lzaF9ibG9jayA9IFRSVUUgZm9yIGFsbCBJU0EgYm9hcmRzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLSNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgotI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgotI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KLQotc3RhdGljIGludCB1MTRfMzRmX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICopOwotc3RhdGljIGludCB1MTRfMzRmX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqKTsKLXN0YXRpYyBpbnQgdTE0XzM0Zl9xdWV1ZWNvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqLCBzdHJ1Y3Qgc2NzaV9jbW5kICopOwotc3RhdGljIGludCB1MTRfMzRmX2VoX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKik7Ci1zdGF0aWMgaW50IHUxNF8zNGZfZWhfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOwotc3RhdGljIGludCB1MTRfMzRmX2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICosIHN0cnVjdCBibG9ja19kZXZpY2UgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rvcl90LCBpbnQgKik7Ci1zdGF0aWMgaW50IHUxNF8zNGZfc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqKTsKLQotc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgZHJpdmVyX3RlbXBsYXRlID0gewotICAgICAgICAgICAgICAgIC5uYW1lICAgICAgICAgICAgICAgICAgICA9ICJVbHRyYVN0b3IgMTRGLzM0RiByZXYuIDguMTAuMDAgIiwKLSAgICAgICAgICAgICAgICAuZGV0ZWN0ICAgICAgICAgICAgICAgICAgPSB1MTRfMzRmX2RldGVjdCwKLSAgICAgICAgICAgICAgICAucmVsZWFzZSAgICAgICAgICAgICAgICAgPSB1MTRfMzRmX3JlbGVhc2UsCi0gICAgICAgICAgICAgICAgLnF1ZXVlY29tbWFuZCAgICAgICAgICAgID0gdTE0XzM0Zl9xdWV1ZWNvbW1hbmQsCi0gICAgICAgICAgICAgICAgLmVoX2Fib3J0X2hhbmRsZXIgICAgICAgID0gdTE0XzM0Zl9laF9hYm9ydCwKLSAgICAgICAgICAgICAgICAuZWhfaG9zdF9yZXNldF9oYW5kbGVyICAgPSB1MTRfMzRmX2VoX2hvc3RfcmVzZXQsCi0gICAgICAgICAgICAgICAgLmJpb3NfcGFyYW0gICAgICAgICAgICAgID0gdTE0XzM0Zl9iaW9zX3BhcmFtLAotICAgICAgICAgICAgICAgIC5zbGF2ZV9jb25maWd1cmUgICAgICAgICA9IHUxNF8zNGZfc2xhdmVfY29uZmlndXJlLAotICAgICAgICAgICAgICAgIC50aGlzX2lkICAgICAgICAgICAgICAgICA9IDcsCi0gICAgICAgICAgICAgICAgLnVuY2hlY2tlZF9pc2FfZG1hICAgICAgID0gMSwKLSAgICAgICAgICAgICAgICAudXNlX2NsdXN0ZXJpbmcgICAgICAgICAgPSBFTkFCTEVfQ0xVU1RFUklORywKLSAgICAgICAgICAgICAgICB9OwotCi0jaWYgIWRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKSAmJiAhZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCi0jZXJyb3IgIkFkanVzdCB5b3VyIDxhc20vYnl0ZW9yZGVyLmg+IGRlZmluZXMiCi0jZW5kaWYKLQotLyogVmFsdWVzIGZvciB0aGUgUFJPRFVDVF9JRCBwb3J0cyBmb3IgdGhlIDE0LzM0RiAqLwotI2RlZmluZSBQUk9EVUNUX0lEMSAgMHg1NgotI2RlZmluZSBQUk9EVUNUX0lEMiAgMHg0MCAgICAgICAgLyogTk9URTogT25seSB1cHBlciBuaWJibGUgaXMgdXNlZCAqLwotCi0vKiBTdWJ2ZXJzaW9uIHZhbHVlcyAqLwotI2RlZmluZSBJU0EgIDAKLSNkZWZpbmUgRVNBIDEKLQotI2RlZmluZSBPUF9IT1NUX0FEQVBURVIgICAweDEKLSNkZWZpbmUgT1BfU0NTSSAgICAgICAgICAgMHgyCi0jZGVmaW5lIE9QX1JFU0VUICAgICAgICAgIDB4NAotI2RlZmluZSBEVERfU0NTSSAgICAgICAgICAweDAKLSNkZWZpbmUgRFREX0lOICAgICAgICAgICAgMHgxCi0jZGVmaW5lIERURF9PVVQgICAgICAgICAgIDB4MgotI2RlZmluZSBEVERfTk9ORSAgICAgICAgICAweDMKLSNkZWZpbmUgSEFfQ01EX0lOUVVJUlkgICAgMHgxCi0jZGVmaW5lIEhBX0NNRF9TRUxGX0RJQUcgIDB4MgotI2RlZmluZSBIQV9DTURfUkVBRF9CVUZGICAweDMKLSNkZWZpbmUgSEFfQ01EX1dSSVRFX0JVRkYgMHg0Ci0KLSN1bmRlZiAgREVCVUdfTElOS0VEX0NPTU1BTkRTCi0jdW5kZWYgIERFQlVHX0RFVEVDVAotI3VuZGVmICBERUJVR19JTlRFUlJVUFQKLSN1bmRlZiAgREVCVUdfUkVTRVQKLSN1bmRlZiAgREVCVUdfR0VORVJBVEVfRVJST1JTCi0jdW5kZWYgIERFQlVHX0dFTkVSQVRFX0FCT1JUUwotI3VuZGVmICBERUJVR19HRU9NRVRSWQotCi0jZGVmaW5lIE1BWF9JU0EgMwotI2RlZmluZSBNQVhfVkVTQSAxCi0jZGVmaW5lIE1BWF9FSVNBIDAKLSNkZWZpbmUgTUFYX1BDSSAwCi0jZGVmaW5lIE1BWF9CT0FSRFMgKE1BWF9JU0EgKyBNQVhfVkVTQSArIE1BWF9FSVNBICsgTUFYX1BDSSkKLSNkZWZpbmUgTUFYX0NIQU5ORUwgMQotI2RlZmluZSBNQVhfTFVOIDgKLSNkZWZpbmUgTUFYX1RBUkdFVCA4Ci0jZGVmaW5lIE1BWF9NQUlMQk9YRVMgMTYKLSNkZWZpbmUgTUFYX1NHTElTVCAzMgotI2RlZmluZSBNQVhfU0FGRV9TR0xJU1QgMTYKLSNkZWZpbmUgTUFYX0lOVEVSTkFMX1JFVFJJRVMgNjQKLSNkZWZpbmUgTUFYX0NNRF9QRVJfTFVOIDIKLSNkZWZpbmUgTUFYX1RBR0dFRF9DTURfUEVSX0xVTiAoTUFYX01BSUxCT1hFUyAtIE1BWF9DTURfUEVSX0xVTikKLQotI2RlZmluZSBTS0lQIFVMT05HX01BWAotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIFRSVUUgMQotI2RlZmluZSBGUkVFIDAKLSNkZWZpbmUgSU5fVVNFICAgMQotI2RlZmluZSBMT0NLRUQgICAyCi0jZGVmaW5lIElOX1JFU0VUIDMKLSNkZWZpbmUgSUdOT1JFICAgNAotI2RlZmluZSBSRUFEWSAgICA1Ci0jZGVmaW5lIEFCT1JUSU5HIDYKLSNkZWZpbmUgTk9fRE1BICAweGZmCi0jZGVmaW5lIE1BWExPT1AgIDEwMDAwCi0jZGVmaW5lIFRBR19ESVNBQkxFRCAwCi0jZGVmaW5lIFRBR19TSU1QTEUgICAxCi0jZGVmaW5lIFRBR19PUkRFUkVEICAyCi0KLSNkZWZpbmUgUkVHX0xDTF9NQVNLICAgICAgMAotI2RlZmluZSBSRUdfTENMX0lOVFIgICAgICAxCi0jZGVmaW5lIFJFR19TWVNfTUFTSyAgICAgIDIKLSNkZWZpbmUgUkVHX1NZU19JTlRSICAgICAgMwotI2RlZmluZSBSRUdfUFJPRFVDVF9JRDEgICA0Ci0jZGVmaW5lIFJFR19QUk9EVUNUX0lEMiAgIDUKLSNkZWZpbmUgUkVHX0NPTkZJRzEgICAgICAgNgotI2RlZmluZSBSRUdfQ09ORklHMiAgICAgICA3Ci0jZGVmaW5lIFJFR19PR00gICAgICAgICAgIDgKLSNkZWZpbmUgUkVHX0lDTSAgICAgICAgICAgMTIKLSNkZWZpbmUgUkVHSU9OX1NJWkUgICAgICAgMTNVTAotI2RlZmluZSBCU1lfQVNTRVJURUQgICAgICAweDAxCi0jZGVmaW5lIElSUV9BU1NFUlRFRCAgICAgIDB4MDEKLSNkZWZpbmUgQ01EX1JFU0VUICAgICAgICAgMHhjMAotI2RlZmluZSBDTURfT0dNX0lOVFIgICAgICAweDAxCi0jZGVmaW5lIENNRF9DTFJfSU5UUiAgICAgIDB4MDEKLSNkZWZpbmUgQ01EX0VOQV9JTlRSICAgICAgMHg4MQotI2RlZmluZSBBU09LICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIEFTU1QgICAgICAgICAgICAgIDB4OTEKLQotI2RlZmluZSBZRVNOTyhhKSAoKGEpID8gJ3knIDogJ24nKQotI2RlZmluZSBUTERFVih0eXBlKSAoKHR5cGUpID09IFRZUEVfRElTSyB8fCAodHlwZSkgPT0gVFlQRV9ST00pCi0KLSNkZWZpbmUgUEFDS0VEICAgICAgICAgIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCi0KLXN0cnVjdCBzZ19saXN0IHsKLSAgIHVuc2lnbmVkIGludCBhZGRyZXNzOyAgICAgICAgICAgICAgICAvKiBTZWdtZW50IEFkZHJlc3MgKi8KLSAgIHVuc2lnbmVkIGludCBudW1fYnl0ZXM7ICAgICAgICAgICAgICAvKiBTZWdtZW50IExlbmd0aCAqLwotICAgfTsKLQotLyogTWFpbEJveCBTQ1NJIENvbW1hbmQgUGFja2V0ICovCi1zdHJ1Y3QgbXNjcCB7Ci0KLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKLSAgIHVuc2lnbmVkIGNoYXIgc2c6MSwgY2E6MSwgZGNuOjEsIHhkaXI6Miwgb3Bjb2RlOjM7Ci0gICB1bnNpZ25lZCBjaGFyIGx1bjogMywgY2hhbm5lbDoyLCB0YXJnZXQ6MzsKLSNlbHNlCi0gICB1bnNpZ25lZCBjaGFyIG9wY29kZTogMywgICAgICAgICAgICAgLyogdHlwZSBvZiBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgIHhkaXI6IDIsICAgICAgICAgICAgICAgLyogZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgZGNuOiAxLCAgICAgICAgICAgICAgICAvKiBkaXNhYmxlIGRpc2Nvbm5lY3QgKi8KLSAgICAgICAgICAgICAgICAgY2E6IDEsICAgICAgICAgICAgICAgICAvKiB1c2UgY2FjaGUgKGlmIGF2YWlsYWJsZSkgKi8KLSAgICAgICAgICAgICAgICAgc2c6IDE7ICAgICAgICAgICAgICAgICAvKiBzY2F0dGVyL2dhdGhlciBvcGVyYXRpb24gKi8KLSAgIHVuc2lnbmVkIGNoYXIgdGFyZ2V0OiAzLCAgICAgICAgICAgICAvKiBTQ1NJIHRhcmdldCBpZCAqLwotICAgICAgICAgICAgICAgICBjaGFubmVsOiAyLCAgICAgICAgICAgIC8qIFNDU0kgY2hhbm5lbCBudW1iZXIgKi8KLSAgICAgICAgICAgICAgICAgbHVuOiAzOyAgICAgICAgICAgICAgICAvKiBTQ1NJIGxvZ2ljYWwgdW5pdCBudW1iZXIgKi8KLSNlbmRpZgotCi0gICB1bnNpZ25lZCBpbnQgZGF0YV9hZGRyZXNzIFBBQ0tFRDsgICAgLyogdHJhbnNmZXIgZGF0YSBwb2ludGVyICovCi0gICB1bnNpZ25lZCBpbnQgZGF0YV9sZW4gUEFDS0VEOyAgICAgICAgLyogbGVuZ3RoIGluIGJ5dGVzICovCi0gICB1bnNpZ25lZCBpbnQgbGlua19hZGRyZXNzIFBBQ0tFRDsgICAgLyogZm9yIGxpbmtpbmcgY29tbWFuZCBjaGFpbnMgKi8KLSAgIHVuc2lnbmVkIGNoYXIgY2xpbmtfaWQ7ICAgICAgICAgICAgICAvKiBpZGVudGlmaWVzIGNvbW1hbmQgaW4gY2hhaW4gKi8KLSAgIHVuc2lnbmVkIGNoYXIgdXNlX3NnOyAgICAgICAgICAgICAgICAvKiAoaWYgc2cgaXMgc2V0KSA4IGJ5dGVzIHBlciBsaXN0ICovCi0gICB1bnNpZ25lZCBjaGFyIHNlbnNlX2xlbjsKLSAgIHVuc2lnbmVkIGNoYXIgY2RiX2xlbjsgICAgICAgICAgICAgICAvKiA2LCAxMCwgb3IgMTIgKi8KLSAgIHVuc2lnbmVkIGNoYXIgY2RiWzEyXTsgICAgICAgICAgICAgICAvKiBTQ1NJIENvbW1hbmQgRGVzY3JpcHRvciBCbG9jayAqLwotICAgdW5zaWduZWQgY2hhciBhZGFwdGVyX3N0YXR1czsgICAgICAgIC8qIG5vbi16ZXJvIGluZGljYXRlcyBIQSBlcnJvciAqLwotICAgdW5zaWduZWQgY2hhciB0YXJnZXRfc3RhdHVzOyAgICAgICAgIC8qIG5vbi16ZXJvIGluZGljYXRlcyB0YXJnZXQgZXJyb3IgKi8KLSAgIHVuc2lnbmVkIGludCBzZW5zZV9hZGRyIFBBQ0tFRDsKLQotICAgLyogQWRkaXRpb25hbCBmaWVsZHMgYmVnaW4gaGVyZS4gKi8KLSAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OwotICAgdW5zaWduZWQgaW50IGNwcF9pbmRleDsgICAgICAgICAgICAgIC8qIGNwIGluZGV4ICovCi0KLSAgIC8qIEFsbCB0aGUgY3Agc3RydWN0dXJlIGlzIHplcm8gZmlsbGVkIGJ5IHF1ZXVlY29tbWFuZCBleGNlcHQgdGhlCi0gICAgICBmb2xsb3dpbmcgQ1BfVEFJTF9TSVpFIGJ5dGVzLCBpbml0aWFsaXplZCBieSBkZXRlY3QgKi8KLSAgIGRtYV9hZGRyX3QgY3BfZG1hX2FkZHI7IC8qIGRtYSBoYW5kbGUgZm9yIHRoaXMgY3Agc3RydWN0dXJlICovCi0gICBzdHJ1Y3Qgc2dfbGlzdCAqc2dsaXN0OyAvKiBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgU0cgbGlzdCAqLwotICAgfTsKLQotI2RlZmluZSBDUF9UQUlMX1NJWkUgKHNpemVvZihzdHJ1Y3Qgc2dsaXN0ICopICsgc2l6ZW9mKGRtYV9hZGRyX3QpKQotCi1zdHJ1Y3QgaG9zdGRhdGEgewotICAgc3RydWN0IG1zY3AgY3BbTUFYX01BSUxCT1hFU107ICAgICAgIC8qIE1haWxib3hlcyBmb3IgdGhpcyBib2FyZCAqLwotICAgdW5zaWduZWQgaW50IGNwX3N0YXRbTUFYX01BSUxCT1hFU107IC8qIEZSRUUsIElOX1VTRSwgTE9DS0VELCBJTl9SRVNFVCAqLwotICAgdW5zaWduZWQgaW50IGxhc3RfY3BfdXNlZDsgICAgICAgICAgIC8qIEluZGV4IG9mIGxhc3QgbWFpbGJveCB1c2VkICovCi0gICB1bnNpZ25lZCBpbnQgaW9jb3VudDsgICAgICAgICAgICAgICAgLyogVG90YWwgaS9vIGRvbmUgZm9yIHRoaXMgYm9hcmQgKi8KLSAgIGludCBib2FyZF9udW1iZXI7ICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgdGhpcyBib2FyZCAqLwotICAgY2hhciBib2FyZF9uYW1lWzE2XTsgICAgICAgICAgICAgICAgIC8qIE5hbWUgb2YgdGhpcyBib2FyZCAqLwotICAgaW50IGluX3Jlc2V0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRydWUgaWYgYm9hcmQgaXMgZG9pbmcgYSByZXNldCAqLwotICAgaW50IHRhcmdldF90b1tNQVhfVEFSR0VUXVtNQVhfQ0hBTk5FTF07IC8qIE4uIG9mIHRpbWVvdXQgZXJyb3JzIG9uIHRhcmdldCAqLwotICAgaW50IHRhcmdldF9yZWRvW01BWF9UQVJHRVRdW01BWF9DSEFOTkVMXTsgLyogSWYgVFJVRSByZWRvIGkvbyBvbiB0YXJnZXQgKi8KLSAgIHVuc2lnbmVkIGludCByZXRyaWVzOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW50ZXJuYWwgcmV0cmllcyAqLwotICAgdW5zaWduZWQgbG9uZyBsYXN0X3JldHJpZWRfcGlkOyAgICAgIC8qIFBpZCBvZiBsYXN0IHJldHJpZWQgY29tbWFuZCAqLwotICAgdW5zaWduZWQgY2hhciBzdWJ2ZXJzaW9uOyAgICAgICAgICAgIC8qIEJ1cyB0eXBlLCBlaXRoZXIgSVNBIG9yIEVTQSAqLwotICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7ICAgICAgICAgICAgICAgIC8qIEFsd2F5cyBOVUxMICovCi0gICB1bnNpZ25lZCBjaGFyIGhlYWRzOwotICAgdW5zaWduZWQgY2hhciBzZWN0b3JzOwotICAgY2hhciBib2FyZF9pZFsyNTZdOyAgICAgICAgICAgICAgICAgIC8qIGRhdGEgZnJvbSBJTlFVSVJZIG9uIHRoaXMgYm9hcmQgKi8KLSAgIH07Ci0KLXN0YXRpYyBzdHJ1Y3QgU2NzaV9Ib3N0ICpzaFtNQVhfQk9BUkRTICsgMV07Ci1zdGF0aWMgY29uc3QgY2hhciAqZHJpdmVyX25hbWUgPSAiVXg0RiI7Ci1zdGF0aWMgY2hhciBzaGFbTUFYX0JPQVJEU107Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRyaXZlcl9sb2NrKTsKLQotLyogSW5pdGlhbGl6ZSBudW1fYm9hcmRzIHNvIHRoYXQgaWhkbHIgY2FuIHdvcmsgd2hpbGUgZGV0ZWN0IGlzIGluIHByb2dyZXNzICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG51bV9ib2FyZHMgPSBNQVhfQk9BUkRTOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBpb19wb3J0W10gPSB7Ci0KLSAgIC8qIFNwYWNlIGZvciBNQVhfSU5UX1BBUkFNIHBvcnRzIHVzYWJsZSB3aGlsZSBsb2FkaW5nIGFzIGEgbW9kdWxlICovCi0gICBTS0lQLCAgICBTS0lQLCAgIFNLSVAsICAgU0tJUCwgICBTS0lQLCAgIFNLSVAsICAgU0tJUCwgICBTS0lQLAotICAgU0tJUCwgICAgU0tJUCwKLQotICAgLyogUG9zc2libGUgSVNBL1ZFU0EgcG9ydHMgKi8KLSAgIDB4MzMwLCAweDM0MCwgMHgyMzAsIDB4MjQwLCAweDIxMCwgMHgxMzAsIDB4MTQwLAotCi0gICAvKiBFbmQgb2YgbGlzdCAqLwotICAgMHgwCi0gICB9OwotCi0jZGVmaW5lIEhEKGJvYXJkKSAoKHN0cnVjdCBob3N0ZGF0YSAqKSAmc2hbYm9hcmRdLT5ob3N0ZGF0YSkKLSNkZWZpbmUgQk4oYm9hcmQpIChIRChib2FyZCktPmJvYXJkX25hbWUpCi0KLS8qIERldmljZSBpcyBMaXR0bGUgRW5kaWFuICovCi0jZGVmaW5lIEgyREVWKHgpIGNwdV90b19sZTMyKHgpCi0jZGVmaW5lIERFVjJIKHgpIGxlMzJfdG9fY3B1KHgpCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBkb19pbnRlcnJ1cHRfaGFuZGxlcihpbnQsIHZvaWQgKik7Ci1zdGF0aWMgdm9pZCBmbHVzaF9kZXYoc3RydWN0IHNjc2lfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKLXN0YXRpYyBpbnQgZG9fdHJhY2UgPSBGQUxTRTsKLXN0YXRpYyBpbnQgc2V0dXBfZG9uZSA9IEZBTFNFOwotc3RhdGljIGludCBsaW5rX3N0YXRpc3RpY3M7Ci1zdGF0aWMgaW50IGV4dF90cmFuID0gRkFMU0U7Ci0KLSNpZiBkZWZpbmVkKEhBVkVfT0xEX1VYNEZfRklSTVdBUkUpCi1zdGF0aWMgaW50IGhhdmVfb2xkX2Zpcm13YXJlID0gVFJVRTsKLSNlbHNlCi1zdGF0aWMgaW50IGhhdmVfb2xkX2Zpcm13YXJlID0gRkFMU0U7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NDU0lfVTE0XzM0Rl9UQUdHRURfUVVFVUUpCi1zdGF0aWMgaW50IHRhZ19tb2RlID0gVEFHX1NJTVBMRTsKLSNlbHNlCi1zdGF0aWMgaW50IHRhZ19tb2RlID0gVEFHX0RJU0FCTEVEOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX1UxNF8zNEZfTElOS0VEX0NPTU1BTkRTKQotc3RhdGljIGludCBsaW5rZWRfY29tbSA9IFRSVUU7Ci0jZWxzZQotc3RhdGljIGludCBsaW5rZWRfY29tbSA9IEZBTFNFOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TQ1NJX1UxNF8zNEZfTUFYX1RBR1MpCi1zdGF0aWMgaW50IG1heF9xdWV1ZV9kZXB0aCA9IENPTkZJR19TQ1NJX1UxNF8zNEZfTUFYX1RBR1M7Ci0jZWxzZQotc3RhdGljIGludCBtYXhfcXVldWVfZGVwdGggPSBNQVhfQ01EX1BFUl9MVU47Ci0jZW5kaWYKLQotI2RlZmluZSBNQVhfSU5UX1BBUkFNIDEwCi0jZGVmaW5lIE1BWF9CT09UX09QVElPTlNfU0laRSAyNTYKLXN0YXRpYyBjaGFyIGJvb3Rfb3B0aW9uc1tNQVhfQk9PVF9PUFRJT05TX1NJWkVdOwotCi0jaWYgZGVmaW5lZChNT0RVTEUpCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLQotbW9kdWxlX3BhcmFtX3N0cmluZyh1MTRfMzRmLCBib290X29wdGlvbnMsIE1BWF9CT09UX09QVElPTlNfU0laRSwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHUxNF8zNGYsICIgZXF1aXZhbGVudCB0byB0aGUgXCJ1MTQtMzRmPS4uLlwiIGtlcm5lbCBib290ICIgXAotIm9wdGlvbi4iIFwKLSIgICAgICBFeGFtcGxlOiBtb2Rwcm9iZSB1MTQtMzRmIFwidTE0XzM0Zj0weDM0MCwweDMzMCxsYzp5LHRtOjAsbXE6NFwiIik7Ci1NT0RVTEVfQVVUSE9SKCJEYXJpbyBCYWxsYWJpbyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJVbHRyYVN0b3IgMTRGLzM0RiBTQ1NJIERyaXZlciIpOwotCi0jZW5kaWYKLQotc3RhdGljIGludCB1MTRfMzRmX3NsYXZlX2NvbmZpZ3VyZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldikgewotICAgaW50IGosIHRxZCwgdXRxZDsKLSAgIGNoYXIgKnRhZ19zdWZmaXgsICpsaW5rX3N1ZmZpeDsKLSAgIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBkZXYtPmhvc3Q7Ci0KLSAgIGogPSAoKHN0cnVjdCBob3N0ZGF0YSAqKSBob3N0LT5ob3N0ZGF0YSktPmJvYXJkX251bWJlcjsKLQotICAgdXRxZCA9IE1BWF9DTURfUEVSX0xVTjsKLSAgIHRxZCA9IG1heF9xdWV1ZV9kZXB0aDsKLQotICAgaWYgKFRMREVWKGRldi0+dHlwZSkgJiYgZGV2LT50YWdnZWRfc3VwcG9ydGVkKQotCi0gICAgICBpZiAodGFnX21vZGUgPT0gVEFHX1NJTVBMRSkgewotICAgICAgICAgc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoZGV2LCB0cWQpOwotICAgICAgICAgdGFnX3N1ZmZpeCA9ICIsIHNpbXBsZSB0YWdzIjsKLSAgICAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHRhZ19tb2RlID09IFRBR19PUkRFUkVEKSB7Ci0gICAgICAgICBzY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aChkZXYsIHRxZCk7Ci0gICAgICAgICB0YWdfc3VmZml4ID0gIiwgb3JkZXJlZCB0YWdzIjsKLSAgICAgICAgIH0KLSAgICAgIGVsc2UgewotICAgICAgICAgc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoZGV2LCB0cWQpOwotICAgICAgICAgdGFnX3N1ZmZpeCA9ICIsIG5vIHRhZ3MiOwotICAgICAgICAgfQotCi0gICBlbHNlIGlmIChUTERFVihkZXYtPnR5cGUpICYmIGxpbmtlZF9jb21tKSB7Ci0gICAgICBzY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aChkZXYsIHRxZCk7Ci0gICAgICB0YWdfc3VmZml4ID0gIiwgdW50YWdnZWQiOwotICAgICAgfQotCi0gICBlbHNlIHsKLSAgICAgIHNjc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKGRldiwgdXRxZCk7Ci0gICAgICB0YWdfc3VmZml4ID0gIiI7Ci0gICAgICB9Ci0KLSAgIGlmIChUTERFVihkZXYtPnR5cGUpICYmIGxpbmtlZF9jb21tICYmIGRldi0+cXVldWVfZGVwdGggPiAyKQotICAgICAgbGlua19zdWZmaXggPSAiLCBzb3J0ZWQiOwotICAgZWxzZSBpZiAoVExERVYoZGV2LT50eXBlKSkKLSAgICAgIGxpbmtfc3VmZml4ID0gIiwgdW5zb3J0ZWQiOwotICAgZWxzZQotICAgICAgbGlua19zdWZmaXggPSAiIjsKLQotICAgc2Rldl9wcmludGsoS0VSTl9JTkZPLCBkZXYsICJjbWRzL2x1biAlZCVzJXMuXG4iLAotICAgICAgICAgIGRldi0+cXVldWVfZGVwdGgsIGxpbmtfc3VmZml4LCB0YWdfc3VmZml4KTsKLQotICAgcmV0dXJuIEZBTFNFOwotfQotCi1zdGF0aWMgaW50IHdhaXRfb25fYnVzeSh1bnNpZ25lZCBsb25nIGlvYmFzZSwgdW5zaWduZWQgaW50IGxvb3ApIHsKLQotICAgd2hpbGUgKGluYihpb2Jhc2UgKyBSRUdfTENMX0lOVFIpICYgQlNZX0FTU0VSVEVEKSB7Ci0gICAgICB1ZGVsYXkoMUwpOwotICAgICAgaWYgKC0tbG9vcCA9PSAwKSByZXR1cm4gVFJVRTsKLSAgICAgIH0KLQotICAgcmV0dXJuIEZBTFNFOwotfQotCi1zdGF0aWMgaW50IGJvYXJkX2lucXVpcnkodW5zaWduZWQgaW50IGopIHsKLSAgIHN0cnVjdCBtc2NwICpjcHA7Ci0gICBkbWFfYWRkcl90IGlkX2RtYV9hZGRyOwotICAgdW5zaWduZWQgaW50IGxpbWl0ID0gMDsKLSAgIHVuc2lnbmVkIGxvbmcgdGltZTsKLQotICAgaWRfZG1hX2FkZHIgPSBwY2lfbWFwX3NpbmdsZShIRChqKS0+cGRldiwgSEQoaiktPmJvYXJkX2lkLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoSEQoaiktPmJvYXJkX2lkKSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLSAgIGNwcCA9ICZIRChqKS0+Y3BbMF07Ci0gICBjcHAtPmNwX2RtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoSEQoaiktPnBkZXYsIGNwcCwgc2l6ZW9mKHN0cnVjdCBtc2NwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotICAgbWVtc2V0KGNwcCwgMCwgc2l6ZW9mKHN0cnVjdCBtc2NwKSAtIENQX1RBSUxfU0laRSk7Ci0gICBjcHAtPm9wY29kZSA9IE9QX0hPU1RfQURBUFRFUjsKLSAgIGNwcC0+eGRpciA9IERURF9JTjsKLSAgIGNwcC0+ZGF0YV9hZGRyZXNzID0gSDJERVYoaWRfZG1hX2FkZHIpOwotICAgY3BwLT5kYXRhX2xlbiA9IEgyREVWKHNpemVvZihIRChqKS0+Ym9hcmRfaWQpKTsKLSAgIGNwcC0+Y2RiX2xlbiA9IDY7Ci0gICBjcHAtPmNkYlswXSA9IEhBX0NNRF9JTlFVSVJZOwotCi0gICBpZiAod2FpdF9vbl9idXN5KHNoW2pdLT5pb19wb3J0LCBNQVhMT09QKSkgewotICAgICAgcHJpbnRrKCIlczogYm9hcmRfaW5xdWlyeSwgYWRhcHRlciBidXN5LlxuIiwgQk4oaikpOwotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICB9Ci0KLSAgIEhEKGopLT5jcF9zdGF0WzBdID0gSUdOT1JFOwotCi0gICAvKiBDbGVhciB0aGUgaW50ZXJydXB0IGluZGljYXRpb24gKi8KLSAgIG91dGIoQ01EX0NMUl9JTlRSLCBzaFtqXS0+aW9fcG9ydCArIFJFR19TWVNfSU5UUik7Ci0KLSAgIC8qIFN0b3JlIHBvaW50ZXIgaW4gT0dNIGFkZHJlc3MgYnl0ZXMgKi8KLSAgIG91dGwoSDJERVYoY3BwLT5jcF9kbWFfYWRkciksIHNoW2pdLT5pb19wb3J0ICsgUkVHX09HTSk7Ci0KLSAgIC8qIElzc3VlIE9HTSBpbnRlcnJ1cHQgKi8KLSAgIG91dGIoQ01EX09HTV9JTlRSLCBzaFtqXS0+aW9fcG9ydCArIFJFR19MQ0xfSU5UUik7Ci0KLSAgIHNwaW5fdW5sb2NrX2lycSgmZHJpdmVyX2xvY2spOwotICAgdGltZSA9IGppZmZpZXM7Ci0gICB3aGlsZSAoKGppZmZpZXMgLSB0aW1lKSA8IEhaICYmIGxpbWl0KysgPCAyMDAwMCkgdWRlbGF5KDEwMEwpOwotICAgc3Bpbl9sb2NrX2lycSgmZHJpdmVyX2xvY2spOwotCi0gICBpZiAoY3BwLT5hZGFwdGVyX3N0YXR1cyB8fCBIRChqKS0+Y3Bfc3RhdFswXSAhPSBGUkVFKSB7Ci0gICAgICBIRChqKS0+Y3Bfc3RhdFswXSA9IEZSRUU7Ci0gICAgICBwcmludGsoIiVzOiBib2FyZF9pbnF1aXJ5LCBlcnIgMHgleC5cbiIsIEJOKGopLCBjcHAtPmFkYXB0ZXJfc3RhdHVzKTsKLSAgICAgIHJldHVybiBUUlVFOwotICAgICAgfQotCi0gICBwY2lfdW5tYXBfc2luZ2xlKEhEKGopLT5wZGV2LCBjcHAtPmNwX2RtYV9hZGRyLCBzaXplb2Yoc3RydWN0IG1zY3ApLAotICAgICAgICAgICAgICAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotICAgcGNpX3VubWFwX3NpbmdsZShIRChqKS0+cGRldiwgaWRfZG1hX2FkZHIsIHNpemVvZihIRChqKS0+Ym9hcmRfaWQpLAotICAgICAgICAgICAgICAgICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotICAgcmV0dXJuIEZBTFNFOwotfQotCi1zdGF0aWMgaW50IHBvcnRfZGV0ZWN0IFwKLSAgICAgICh1bnNpZ25lZCBsb25nIHBvcnRfYmFzZSwgdW5zaWduZWQgaW50IGosIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpIHsKLSAgIHVuc2lnbmVkIGNoYXIgaXJxLCBkbWFfY2hhbm5lbCwgc3VidmVyc2lvbiwgaTsKLSAgIHVuc2lnbmVkIGNoYXIgaW5fYnl0ZTsKLSAgIGNoYXIgKmJ1c190eXBlLCBkbWFfbmFtZVsxNl07Ci0KLSAgIC8qIEFsbG93ZWQgQklPUyBiYXNlIGFkZHJlc3NlcyAoTlVMTCBpbmRpY2F0ZXMgcmVzZXJ2ZWQpICovCi0gICB1bnNpZ25lZCBsb25nIGJpb3Nfc2VnbWVudF90YWJsZVs4XSA9IHsKLSAgICAgIDAsCi0gICAgICAweGM0MDAwLCAweGM4MDAwLCAweGNjMDAwLCAweGQwMDAwLAotICAgICAgMHhkNDAwMCwgMHhkODAwMCwgMHhkYzAwMAotICAgICAgfTsKLQotICAgLyogQWxsb3dlZCBJUlFzICovCi0gICB1bnNpZ25lZCBjaGFyIGludGVycnVwdF90YWJsZVs0XSA9IHsgMTUsIDE0LCAxMSwgMTAgfTsKLQotICAgLyogQWxsb3dlZCBETUEgY2hhbm5lbHMgZm9yIElTQSAoMCBpbmRpY2F0ZXMgcmVzZXJ2ZWQpICovCi0gICB1bnNpZ25lZCBjaGFyIGRtYV9jaGFubmVsX3RhYmxlWzRdID0geyA1LCA2LCA3LCAwIH07Ci0KLSAgIC8qIEhlYWQvc2VjdG9yIG1hcHBpbmdzICovCi0gICBzdHJ1Y3QgewotICAgICAgdW5zaWduZWQgY2hhciBoZWFkczsKLSAgICAgIHVuc2lnbmVkIGNoYXIgc2VjdG9yczsKLSAgICAgIH0gbWFwcGluZ190YWJsZVs0XSA9IHsKLSAgICAgICAgICAgeyAxNiwgNjMgfSwgeyA2NCwgMzIgfSwgeyA2NCwgNjMgfSwgeyA2NCwgMzIgfQotICAgICAgICAgICB9OwotCi0gICBzdHJ1Y3QgY29uZmlnXzEgewotCi0jaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCi0gICAgICB1bnNpZ25lZCBjaGFyIGRtYV9jaGFubmVsOiAyLCBpbnRlcnJ1cHQ6MiwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZhYmxlX2Rpc2tzX2FzX2ZpeGVkOjEsIGJpb3Nfc2VnbWVudDogMzsKLSNlbHNlCi0gICAgICB1bnNpZ25lZCBjaGFyIGJpb3Nfc2VnbWVudDogMywgcmVtb3ZhYmxlX2Rpc2tzX2FzX2ZpeGVkOiAxLAotICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQ6IDIsIGRtYV9jaGFubmVsOiAyOwotI2VuZGlmCi0KLSAgICAgIH0gY29uZmlnXzE7Ci0KLSAgIHN0cnVjdCBjb25maWdfMiB7Ci0KLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKLSAgICAgIHVuc2lnbmVkIGNoYXIgdGZyX3BvcnQ6IDIsIGJpb3NfZHJpdmVfbnVtYmVyOiAxLAotICAgICAgICAgICAgICAgICAgICBtYXBwaW5nX21vZGU6IDIsIGhhX3Njc2lfaWQ6IDM7Ci0jZWxzZQotICAgICAgdW5zaWduZWQgY2hhciBoYV9zY3NpX2lkOiAzLCBtYXBwaW5nX21vZGU6IDIsCi0gICAgICAgICAgICAgICAgICAgIGJpb3NfZHJpdmVfbnVtYmVyOiAxLCB0ZnJfcG9ydDogMjsKLSNlbmRpZgotCi0gICAgICB9IGNvbmZpZ18yOwotCi0gICBjaGFyIG5hbWVbMTZdOwotCi0gICBzcHJpbnRmKG5hbWUsICIlcyVkIiwgZHJpdmVyX25hbWUsIGopOwotCi0gICBpZiAoIXJlcXVlc3RfcmVnaW9uKHBvcnRfYmFzZSwgUkVHSU9OX1NJWkUsIGRyaXZlcl9uYW1lKSkgewotI2lmIGRlZmluZWQoREVCVUdfREVURUNUKQotICAgICAgcHJpbnRrKCIlczogYWRkcmVzcyAweCUwM2x4IGluIHVzZSwgc2tpcHBpbmcgcHJvYmUuXG4iLCBuYW1lLCBwb3J0X2Jhc2UpOwotI2VuZGlmCi0gICAgICBnb3RvIGZhaWw7Ci0gICAgICB9Ci0KLSAgIHNwaW5fbG9ja19pcnEoJmRyaXZlcl9sb2NrKTsKLQotICAgaWYgKGluYihwb3J0X2Jhc2UgKyBSRUdfUFJPRFVDVF9JRDEpICE9IFBST0RVQ1RfSUQxKSBnb3RvIGZyZWVsb2NrOwotCi0gICBpbl9ieXRlID0gaW5iKHBvcnRfYmFzZSArIFJFR19QUk9EVUNUX0lEMik7Ci0KLSAgIGlmICgoaW5fYnl0ZSAmIDB4ZjApICE9IFBST0RVQ1RfSUQyKSBnb3RvIGZyZWVsb2NrOwotCi0gICAqKGNoYXIgKikmY29uZmlnXzEgPSBpbmIocG9ydF9iYXNlICsgUkVHX0NPTkZJRzEpOwotICAgKihjaGFyICopJmNvbmZpZ18yID0gaW5iKHBvcnRfYmFzZSArIFJFR19DT05GSUcyKTsKLQotICAgaXJxID0gaW50ZXJydXB0X3RhYmxlW2NvbmZpZ18xLmludGVycnVwdF07Ci0gICBkbWFfY2hhbm5lbCA9IGRtYV9jaGFubmVsX3RhYmxlW2NvbmZpZ18xLmRtYV9jaGFubmVsXTsKLSAgIHN1YnZlcnNpb24gPSAoaW5fYnl0ZSAmIDB4MGYpOwotCi0gICAvKiBCb2FyZCBkZXRlY3RlZCwgYWxsb2NhdGUgaXRzIElSUSAqLwotICAgaWYgKHJlcXVlc3RfaXJxKGlycSwgZG9faW50ZXJydXB0X2hhbmRsZXIsCi0gICAgICAgICAgICAgKHN1YnZlcnNpb24gPT0gRVNBKSA/IElSUUZfU0hBUkVEIDogMCwKLSAgICAgICAgICAgICBkcml2ZXJfbmFtZSwgKHZvaWQgKikgJnNoYVtqXSkpIHsKLSAgICAgIHByaW50aygiJXM6IHVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgJXUsIGRldGFjaGluZy5cbiIsIG5hbWUsIGlycSk7Ci0gICAgICBnb3RvIGZyZWVsb2NrOwotICAgICAgfQotCi0gICBpZiAoc3VidmVyc2lvbiA9PSBJU0EgJiYgcmVxdWVzdF9kbWEoZG1hX2NoYW5uZWwsIGRyaXZlcl9uYW1lKSkgewotICAgICAgcHJpbnRrKCIlczogdW5hYmxlIHRvIGFsbG9jYXRlIERNQSBjaGFubmVsICV1LCBkZXRhY2hpbmcuXG4iLAotICAgICAgICAgICAgIG5hbWUsIGRtYV9jaGFubmVsKTsKLSAgICAgIGdvdG8gZnJlZWlycTsKLSAgICAgIH0KLQotICAgaWYgKGhhdmVfb2xkX2Zpcm13YXJlKSB0cG50LT51c2VfY2x1c3RlcmluZyA9IERJU0FCTEVfQ0xVU1RFUklORzsKLQotICAgc3Bpbl91bmxvY2tfaXJxKCZkcml2ZXJfbG9jayk7Ci0gICBzaFtqXSA9IHNjc2lfcmVnaXN0ZXIodHBudCwgc2l6ZW9mKHN0cnVjdCBob3N0ZGF0YSkpOwotICAgc3Bpbl9sb2NrX2lycSgmZHJpdmVyX2xvY2spOwotCi0gICBpZiAoc2hbal0gPT0gTlVMTCkgewotICAgICAgcHJpbnRrKCIlczogdW5hYmxlIHRvIHJlZ2lzdGVyIGhvc3QsIGRldGFjaGluZy5cbiIsIG5hbWUpOwotICAgICAgZ290byBmcmVlZG1hOwotICAgICAgfQotCi0gICBzaFtqXS0+aW9fcG9ydCA9IHBvcnRfYmFzZTsKLSAgIHNoW2pdLT51bmlxdWVfaWQgPSBwb3J0X2Jhc2U7Ci0gICBzaFtqXS0+bl9pb19wb3J0ID0gUkVHSU9OX1NJWkU7Ci0gICBzaFtqXS0+YmFzZSA9IGJpb3Nfc2VnbWVudF90YWJsZVtjb25maWdfMS5iaW9zX3NlZ21lbnRdOwotICAgc2hbal0tPmlycSA9IGlycTsKLSAgIHNoW2pdLT5zZ190YWJsZXNpemUgPSBNQVhfU0dMSVNUOwotICAgc2hbal0tPnRoaXNfaWQgPSBjb25maWdfMi5oYV9zY3NpX2lkOwotICAgc2hbal0tPmNhbl9xdWV1ZSA9IE1BWF9NQUlMQk9YRVM7Ci0gICBzaFtqXS0+Y21kX3Blcl9sdW4gPSBNQVhfQ01EX1BFUl9MVU47Ci0KLSNpZiBkZWZpbmVkKERFQlVHX0RFVEVDVCkKLSAgIHsKLSAgIHVuc2lnbmVkIGNoYXIgc3lzX21hc2ssIGxjbF9tYXNrOwotCi0gICBzeXNfbWFzayA9IGluYihzaFtqXS0+aW9fcG9ydCArIFJFR19TWVNfTUFTSyk7Ci0gICBsY2xfbWFzayA9IGluYihzaFtqXS0+aW9fcG9ydCArIFJFR19MQ0xfTUFTSyk7Ci0gICBwcmludGsoIlNZU19NQVNLIDB4JXgsIExDTF9NQVNLIDB4JXguXG4iLCBzeXNfbWFzaywgbGNsX21hc2spOwotICAgfQotI2VuZGlmCi0KLSAgIC8qIFByb2JhYmx5IGEgYm9ndXMgaG9zdCBzY3NpIGlkLCBzZXQgaXQgdG8gdGhlIGR1bW15IHZhbHVlICovCi0gICBpZiAoc2hbal0tPnRoaXNfaWQgPT0gMCkgc2hbal0tPnRoaXNfaWQgPSAtMTsKLQotICAgLyogSWYgQklPUyBpcyBkaXNhYmxlZCwgZm9yY2UgZW5hYmxlIGludGVycnVwdHMgKi8KLSAgIGlmIChzaFtqXS0+YmFzZSA9PSAwKSBvdXRiKENNRF9FTkFfSU5UUiwgc2hbal0tPmlvX3BvcnQgKyBSRUdfU1lTX01BU0spOwotCi0gICBtZW1zZXQoSEQoaiksIDAsIHNpemVvZihzdHJ1Y3QgaG9zdGRhdGEpKTsKLSAgIEhEKGopLT5oZWFkcyA9IG1hcHBpbmdfdGFibGVbY29uZmlnXzIubWFwcGluZ19tb2RlXS5oZWFkczsKLSAgIEhEKGopLT5zZWN0b3JzID0gbWFwcGluZ190YWJsZVtjb25maWdfMi5tYXBwaW5nX21vZGVdLnNlY3RvcnM7Ci0gICBIRChqKS0+c3VidmVyc2lvbiA9IHN1YnZlcnNpb247Ci0gICBIRChqKS0+cGRldiA9IE5VTEw7Ci0gICBIRChqKS0+Ym9hcmRfbnVtYmVyID0gajsKLQotICAgaWYgKGhhdmVfb2xkX2Zpcm13YXJlKSBzaFtqXS0+c2dfdGFibGVzaXplID0gTUFYX1NBRkVfU0dMSVNUOwotCi0gICBpZiAoSEQoaiktPnN1YnZlcnNpb24gPT0gRVNBKSB7Ci0gICAgICBzaFtqXS0+dW5jaGVja2VkX2lzYV9kbWEgPSBGQUxTRTsKLSAgICAgIHNoW2pdLT5kbWFfY2hhbm5lbCA9IE5PX0RNQTsKLSAgICAgIHNwcmludGYoQk4oaiksICJVMzRGJWQiLCBqKTsKLSAgICAgIGJ1c190eXBlID0gIlZFU0EiOwotICAgICAgfQotICAgZWxzZSB7Ci0gICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgc2hbal0tPnVuY2hlY2tlZF9pc2FfZG1hID0gVFJVRTsKLQotICAgICAgZmxhZ3M9Y2xhaW1fZG1hX2xvY2soKTsKLSAgICAgIGRpc2FibGVfZG1hKGRtYV9jaGFubmVsKTsKLSAgICAgIGNsZWFyX2RtYV9mZihkbWFfY2hhbm5lbCk7Ci0gICAgICBzZXRfZG1hX21vZGUoZG1hX2NoYW5uZWwsIERNQV9NT0RFX0NBU0NBREUpOwotICAgICAgZW5hYmxlX2RtYShkbWFfY2hhbm5lbCk7Ci0gICAgICByZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKLQotICAgICAgc2hbal0tPmRtYV9jaGFubmVsID0gZG1hX2NoYW5uZWw7Ci0gICAgICBzcHJpbnRmKEJOKGopLCAiVTE0RiVkIiwgaik7Ci0gICAgICBidXNfdHlwZSA9ICJJU0EiOwotICAgICAgfQotCi0gICBzaFtqXS0+bWF4X2NoYW5uZWwgPSBNQVhfQ0hBTk5FTCAtIDE7Ci0gICBzaFtqXS0+bWF4X2lkID0gTUFYX1RBUkdFVDsKLSAgIHNoW2pdLT5tYXhfbHVuID0gTUFYX0xVTjsKLQotICAgaWYgKEhEKGopLT5zdWJ2ZXJzaW9uID09IElTQSAmJiAhYm9hcmRfaW5xdWlyeShqKSkgewotICAgICAgSEQoaiktPmJvYXJkX2lkWzQwXSA9IDA7Ci0KLSAgICAgIGlmIChzdHJjbXAoJkhEKGopLT5ib2FyZF9pZFszMl0sICIwNjAwMDYwMCIpKSB7Ci0gICAgICAgICBwcmludGsoIiVzOiAlcy5cbiIsIEJOKGopLCAmSEQoaiktPmJvYXJkX2lkWzhdKTsKLSAgICAgICAgIHByaW50aygiJXM6IGZpcm13YXJlICVzIGlzIG91dGRhdGVkLCBGVyBQUk9NIHNob3VsZCBiZSAyODAwNC0wMDYuXG4iLAotICAgICAgICAgICAgICAgIEJOKGopLCAmSEQoaiktPmJvYXJkX2lkWzMyXSk7Ci0gICAgICAgICBzaFtqXS0+aG9zdHQtPnVzZV9jbHVzdGVyaW5nID0gRElTQUJMRV9DTFVTVEVSSU5HOwotICAgICAgICAgc2hbal0tPnNnX3RhYmxlc2l6ZSA9IE1BWF9TQUZFX1NHTElTVDsKLSAgICAgICAgIH0KLSAgICAgIH0KLQotICAgaWYgKGRtYV9jaGFubmVsID09IE5PX0RNQSkgc3ByaW50ZihkbWFfbmFtZSwgIiVzIiwgIkJNU1QiKTsKLSAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoZG1hX25hbWUsICJETUEgJXUiLCBkbWFfY2hhbm5lbCk7Ci0KLSAgIHNwaW5fdW5sb2NrX2lycSgmZHJpdmVyX2xvY2spOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgc2hbal0tPmNhbl9xdWV1ZTsgaSsrKQotICAgICAgSEQoaiktPmNwW2ldLmNwX2RtYV9hZGRyID0gcGNpX21hcF9zaW5nbGUoSEQoaiktPnBkZXYsCi0gICAgICAgICAgICAmSEQoaiktPmNwW2ldLCBzaXplb2Yoc3RydWN0IG1zY3ApLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCi0gICBmb3IgKGkgPSAwOyBpIDwgc2hbal0tPmNhbl9xdWV1ZTsgaSsrKQotICAgICAgaWYgKCEgKCgmSEQoaiktPmNwW2ldKS0+c2dsaXN0ID0ga21hbGxvYygKLSAgICAgICAgICAgIHNoW2pdLT5zZ190YWJsZXNpemUgKiBzaXplb2Yoc3RydWN0IHNnX2xpc3QpLAotICAgICAgICAgICAgKHNoW2pdLT51bmNoZWNrZWRfaXNhX2RtYSA/IEdGUF9ETUEgOiAwKSB8IEdGUF9BVE9NSUMpKSkgewotICAgICAgICAgcHJpbnRrKCIlczoga21hbGxvYyBTR2xpc3QgZmFpbGVkLCBtYm94ICVkLCBkZXRhY2hpbmcuXG4iLCBCTihqKSwgaSk7Ci0gICAgICAgICBnb3RvIHJlbGVhc2U7Ci0gICAgICAgICB9Ci0KLSAgIGlmIChtYXhfcXVldWVfZGVwdGggPiBNQVhfVEFHR0VEX0NNRF9QRVJfTFVOKQotICAgICAgIG1heF9xdWV1ZV9kZXB0aCA9IE1BWF9UQUdHRURfQ01EX1BFUl9MVU47Ci0KLSAgIGlmIChtYXhfcXVldWVfZGVwdGggPCBNQVhfQ01EX1BFUl9MVU4pIG1heF9xdWV1ZV9kZXB0aCA9IE1BWF9DTURfUEVSX0xVTjsKLQotICAgaWYgKHRhZ19tb2RlICE9IFRBR19ESVNBQkxFRCAmJiB0YWdfbW9kZSAhPSBUQUdfU0lNUExFKQotICAgICAgdGFnX21vZGUgPSBUQUdfT1JERVJFRDsKLQotICAgaWYgKGogPT0gMCkgewotICAgICAgcHJpbnRrKCJVbHRyYVN0b3IgMTRGLzM0RjogQ29weXJpZ2h0IChDKSAxOTk0LTIwMDMgRGFyaW8gQmFsbGFiaW8uXG4iKTsKLSAgICAgIHByaW50aygiJXMgY29uZmlnIG9wdGlvbnMgLT4gb2Y6JWMsIHRtOiVkLCBsYzolYywgbXE6JWQsIGV0OiVjLlxuIiwKLSAgICAgICAgICAgICBkcml2ZXJfbmFtZSwgWUVTTk8oaGF2ZV9vbGRfZmlybXdhcmUpLCB0YWdfbW9kZSwKLSAgICAgICAgICAgICBZRVNOTyhsaW5rZWRfY29tbSksIG1heF9xdWV1ZV9kZXB0aCwgWUVTTk8oZXh0X3RyYW4pKTsKLSAgICAgIH0KLQotICAgcHJpbnRrKCIlczogJXMgMHglMDNseCwgQklPUyAweCUwNXgsIElSUSAldSwgJXMsIFNHICVkLCBNQiAlZC5cbiIsCi0gICAgICAgICAgQk4oaiksIGJ1c190eXBlLCAodW5zaWduZWQgbG9uZylzaFtqXS0+aW9fcG9ydCwgKGludClzaFtqXS0+YmFzZSwKLSAgICAgICAgICBzaFtqXS0+aXJxLCBkbWFfbmFtZSwgc2hbal0tPnNnX3RhYmxlc2l6ZSwgc2hbal0tPmNhbl9xdWV1ZSk7Ci0KLSAgIGlmIChzaFtqXS0+bWF4X2lkID4gOCB8fCBzaFtqXS0+bWF4X2x1biA+IDgpCi0gICAgICBwcmludGsoIiVzOiB3aWRlIFNDU0kgc3VwcG9ydCBlbmFibGVkLCBtYXhfaWQgJXUsIG1heF9sdW4gJWxsdS5cbiIsCi0gICAgICAgICAgICAgQk4oaiksIHNoW2pdLT5tYXhfaWQsIHNoW2pdLT5tYXhfbHVuKTsKLQotICAgZm9yIChpID0gMDsgaSA8PSBzaFtqXS0+bWF4X2NoYW5uZWw7IGkrKykKLSAgICAgIHByaW50aygiJXM6IFNDU0kgY2hhbm5lbCAldSBlbmFibGVkLCBob3N0IHRhcmdldCBJRCAlZC5cbiIsCi0gICAgICAgICAgICAgQk4oaiksIGksIHNoW2pdLT50aGlzX2lkKTsKLQotICAgcmV0dXJuIFRSVUU7Ci0KLWZyZWVkbWE6Ci0gICBpZiAoc3VidmVyc2lvbiA9PSBJU0EpIGZyZWVfZG1hKGRtYV9jaGFubmVsKTsKLWZyZWVpcnE6Ci0gICBmcmVlX2lycShpcnEsICZzaGFbal0pOwotZnJlZWxvY2s6Ci0gICBzcGluX3VubG9ja19pcnEoJmRyaXZlcl9sb2NrKTsKLSAgIHJlbGVhc2VfcmVnaW9uKHBvcnRfYmFzZSwgUkVHSU9OX1NJWkUpOwotZmFpbDoKLSAgIHJldHVybiBGQUxTRTsKLQotcmVsZWFzZToKLSAgIHUxNF8zNGZfcmVsZWFzZShzaFtqXSk7Ci0gICByZXR1cm4gRkFMU0U7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVybmFsX3NldHVwKGNoYXIgKnN0ciwgaW50ICppbnRzKSB7Ci0gICBpbnQgaSwgYXJnYyA9IGludHNbMF07Ci0gICBjaGFyICpjdXIgPSBzdHIsICpwYzsKLQotICAgaWYgKGFyZ2MgPiAwKSB7Ci0KLSAgICAgIGlmIChhcmdjID4gTUFYX0lOVF9QQVJBTSkgYXJnYyA9IE1BWF9JTlRfUEFSQU07Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIGlvX3BvcnRbaV0gPSBpbnRzW2kgKyAxXTsKLQotICAgICAgaW9fcG9ydFtpXSA9IDA7Ci0gICAgICBzZXR1cF9kb25lID0gVFJVRTsKLSAgICAgIH0KLQotICAgd2hpbGUgKGN1ciAmJiAocGMgPSBzdHJjaHIoY3VyLCAnOicpKSkgewotICAgICAgaW50IHZhbCA9IDAsIGMgPSAqKytwYzsKLQotICAgICAgaWYgKGMgPT0gJ24nIHx8IGMgPT0gJ04nKSB2YWwgPSBGQUxTRTsKLSAgICAgIGVsc2UgaWYgKGMgPT0gJ3knIHx8IGMgPT0gJ1knKSB2YWwgPSBUUlVFOwotICAgICAgZWxzZSB2YWwgPSAoaW50KSBzaW1wbGVfc3RydG91bChwYywgTlVMTCwgMCk7Ci0KLSAgICAgIGlmICghc3RybmNtcChjdXIsICJsYzoiLCAzKSkgbGlua2VkX2NvbW0gPSB2YWw7Ci0gICAgICBlbHNlIGlmICghc3RybmNtcChjdXIsICJvZjoiLCAzKSkgaGF2ZV9vbGRfZmlybXdhcmUgPSB2YWw7Ci0gICAgICBlbHNlIGlmICghc3RybmNtcChjdXIsICJ0bToiLCAzKSkgdGFnX21vZGUgPSB2YWw7Ci0gICAgICBlbHNlIGlmICghc3RybmNtcChjdXIsICJ0YzoiLCAzKSkgdGFnX21vZGUgPSB2YWw7Ci0gICAgICBlbHNlIGlmICghc3RybmNtcChjdXIsICJtcToiLCAzKSkgIG1heF9xdWV1ZV9kZXB0aCA9IHZhbDsKLSAgICAgIGVsc2UgaWYgKCFzdHJuY21wKGN1ciwgImxzOiIsIDMpKSAgbGlua19zdGF0aXN0aWNzID0gdmFsOwotICAgICAgZWxzZSBpZiAoIXN0cm5jbXAoY3VyLCAiZXQ6IiwgMykpICBleHRfdHJhbiA9IHZhbDsKLQotICAgICAgaWYgKChjdXIgPSBzdHJjaHIoY3VyLCAnLCcpKSkgKytjdXI7Ci0gICAgICB9Ci0KLSAgIHJldHVybjsKLX0KLQotc3RhdGljIGludCBvcHRpb25fc2V0dXAoY2hhciAqc3RyKSB7Ci0gICBpbnQgaW50c1tNQVhfSU5UX1BBUkFNXTsKLSAgIGNoYXIgKmN1ciA9IHN0cjsKLSAgIGludCBpID0gMTsKLQotICAgd2hpbGUgKGN1ciAmJiBpc2RpZ2l0KCpjdXIpICYmIGkgPCBNQVhfSU5UX1BBUkFNKSB7Ci0gICAgICBpbnRzW2krK10gPSBzaW1wbGVfc3RydG91bChjdXIsIE5VTEwsIDApOwotCi0gICAgICBpZiAoKGN1ciA9IHN0cmNocihjdXIsICcsJykpICE9IE5VTEwpIGN1cisrOwotICAgfQotCi0gICBpbnRzWzBdID0gaSAtIDE7Ci0gICBpbnRlcm5hbF9zZXR1cChjdXIsIGludHMpOwotICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgdTE0XzM0Zl9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCkgewotICAgdW5zaWduZWQgaW50IGogPSAwLCBrOwotCi0gICB0cG50LT5wcm9jX25hbWUgPSAidTE0LTM0ZiI7Ci0KLSAgIGlmKHN0cmxlbihib290X29wdGlvbnMpKSBvcHRpb25fc2V0dXAoYm9vdF9vcHRpb25zKTsKLQotI2lmIGRlZmluZWQoTU9EVUxFKQotICAgLyogaW9fcG9ydCBjb3VsZCBoYXZlIGJlZW4gbW9kaWZpZWQgd2hlbiBsb2FkaW5nIGFzIGEgbW9kdWxlICovCi0gICBpZihpb19wb3J0WzBdICE9IFNLSVApIHsKLSAgICAgIHNldHVwX2RvbmUgPSBUUlVFOwotICAgICAgaW9fcG9ydFtNQVhfSU5UX1BBUkFNXSA9IDA7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgZm9yIChrID0gMDsgayA8IE1BWF9CT0FSRFMgKyAxOyBrKyspIHNoW2tdID0gTlVMTDsKLQotICAgZm9yIChrID0gMDsgaW9fcG9ydFtrXTsgaysrKSB7Ci0KLSAgICAgIGlmIChpb19wb3J0W2tdID09IFNLSVApIGNvbnRpbnVlOwotCi0gICAgICBpZiAoaiA8IE1BWF9CT0FSRFMgJiYgcG9ydF9kZXRlY3QoaW9fcG9ydFtrXSwgaiwgdHBudCkpIGorKzsKLSAgICAgIH0KLQotICAgbnVtX2JvYXJkcyA9IGo7Ci0gICByZXR1cm4gajsKLX0KLQotc3RhdGljIHZvaWQgbWFwX2RtYSh1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IGopIHsKLSAgIHVuc2lnbmVkIGludCBkYXRhX2xlbiA9IDA7Ci0gICB1bnNpZ25lZCBpbnQgaywgcGNpX2RpcjsKLSAgIGludCBjb3VudDsKLSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2c7Ci0gICBzdHJ1Y3QgbXNjcCAqY3BwOwotICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7Ci0KLSAgIGNwcCA9ICZIRChqKS0+Y3BbaV07IFNDcG50ID0gY3BwLT5TQ3BudDsKLSAgIHBjaV9kaXIgPSBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb247Ci0KLSAgIGlmIChTQ3BudC0+c2Vuc2VfYnVmZmVyKQotICAgICAgY3BwLT5zZW5zZV9hZGRyID0gSDJERVYocGNpX21hcF9zaW5nbGUoSEQoaiktPnBkZXYsIFNDcG50LT5zZW5zZV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsIFBDSV9ETUFfRlJPTURFVklDRSkpOwotCi0gICBjcHAtPnNlbnNlX2xlbiA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKLQotICAgaWYgKHNjc2lfYnVmZmxlbihTQ3BudCkpIHsKLQkgICBjb3VudCA9IHNjc2lfZG1hX21hcChTQ3BudCk7Ci0JICAgQlVHX09OKGNvdW50IDwgMCk7Ci0KLQkgICBzY3NpX2Zvcl9lYWNoX3NnKFNDcG50LCBzZywgY291bnQsIGspIHsKLQkJICAgY3BwLT5zZ2xpc3Rba10uYWRkcmVzcyA9IEgyREVWKHNnX2RtYV9hZGRyZXNzKHNnKSk7Ci0JCSAgIGNwcC0+c2dsaXN0W2tdLm51bV9ieXRlcyA9IEgyREVWKHNnX2RtYV9sZW4oc2cpKTsKLQkJICAgZGF0YV9sZW4gKz0gc2ctPmxlbmd0aDsKLQkgICB9Ci0KLQkgICBjcHAtPnNnID0gVFJVRTsKLQkgICBjcHAtPnVzZV9zZyA9IHNjc2lfc2dfY291bnQoU0NwbnQpOwotCSAgIGNwcC0+ZGF0YV9hZGRyZXNzID0KLQkJICAgSDJERVYocGNpX21hcF9zaW5nbGUoSEQoaiktPnBkZXYsIGNwcC0+c2dsaXN0LAotCQkJCQljcHAtPnVzZV9zZyAqIHNpemVvZihzdHJ1Y3Qgc2dfbGlzdCksCi0JCQkJCXBjaV9kaXIpKTsKLQkgICBjcHAtPmRhdGFfbGVuID0gSDJERVYoZGF0YV9sZW4pOwotCi0gICB9IGVsc2UgewotCSAgIHBjaV9kaXIgPSBQQ0lfRE1BX0JJRElSRUNUSU9OQUw7Ci0JICAgY3BwLT5kYXRhX2xlbiA9IEgyREVWKHNjc2lfYnVmZmxlbihTQ3BudCkpOwotICAgfQotfQotCi1zdGF0aWMgdm9pZCB1bm1hcF9kbWEodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBqKSB7Ci0gICB1bnNpZ25lZCBpbnQgcGNpX2RpcjsKLSAgIHN0cnVjdCBtc2NwICpjcHA7Ci0gICBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKLQotICAgY3BwID0gJkhEKGopLT5jcFtpXTsgU0NwbnQgPSBjcHAtPlNDcG50OwotICAgcGNpX2RpciA9IFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbjsKLQotICAgaWYgKERFVjJIKGNwcC0+c2Vuc2VfYWRkcikpCi0gICAgICBwY2lfdW5tYXBfc2luZ2xlKEhEKGopLT5wZGV2LCBERVYySChjcHAtPnNlbnNlX2FkZHIpLAotICAgICAgICAgICAgICAgICAgICAgICBERVYySChjcHAtPnNlbnNlX2xlbiksIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0KLSAgIHNjc2lfZG1hX3VubWFwKFNDcG50KTsKLQotICAgaWYgKCFERVYySChjcHAtPmRhdGFfbGVuKSkgcGNpX2RpciA9IFBDSV9ETUFfQklESVJFQ1RJT05BTDsKLQotICAgaWYgKERFVjJIKGNwcC0+ZGF0YV9hZGRyZXNzKSkKLSAgICAgIHBjaV91bm1hcF9zaW5nbGUoSEQoaiktPnBkZXYsIERFVjJIKGNwcC0+ZGF0YV9hZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgREVWMkgoY3BwLT5kYXRhX2xlbiksIHBjaV9kaXIpOwotfQotCi1zdGF0aWMgdm9pZCBzeW5jX2RtYSh1bnNpZ25lZCBpbnQgaSwgdW5zaWduZWQgaW50IGopIHsKLSAgIHVuc2lnbmVkIGludCBwY2lfZGlyOwotICAgc3RydWN0IG1zY3AgKmNwcDsKLSAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OwotCi0gICBjcHAgPSAmSEQoaiktPmNwW2ldOyBTQ3BudCA9IGNwcC0+U0NwbnQ7Ci0gICBwY2lfZGlyID0gU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uOwotCi0gICBpZiAoREVWMkgoY3BwLT5zZW5zZV9hZGRyKSkKLSAgICAgIHBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShIRChqKS0+cGRldiwgREVWMkgoY3BwLT5zZW5zZV9hZGRyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgREVWMkgoY3BwLT5zZW5zZV9sZW4pLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCi0gICBpZiAoc2NzaV9zZ19jb3VudChTQ3BudCkpCi0JICAgcGNpX2RtYV9zeW5jX3NnX2Zvcl9jcHUoSEQoaiktPnBkZXYsIHNjc2lfc2dsaXN0KFNDcG50KSwKLQkJCQkgICBzY3NpX3NnX2NvdW50KFNDcG50KSwgcGNpX2Rpcik7Ci0KLSAgIGlmICghREVWMkgoY3BwLT5kYXRhX2xlbikpIHBjaV9kaXIgPSBQQ0lfRE1BX0JJRElSRUNUSU9OQUw7Ci0KLSAgIGlmIChERVYySChjcHAtPmRhdGFfYWRkcmVzcykpCi0gICAgICBwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoSEQoaiktPnBkZXYsIERFVjJIKGNwcC0+ZGF0YV9hZGRyZXNzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgREVWMkgoY3BwLT5kYXRhX2xlbiksIHBjaV9kaXIpOwotfQotCi1zdGF0aWMgdm9pZCBzY3NpX3RvX2Rldl9kaXIodW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBqKSB7Ci0gICB1bnNpZ25lZCBpbnQgazsKLQotICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGF0YV9vdXRfY21kc1tdID0gewotICAgICAgMHgwYSwgMHgyYSwgMHgxNSwgMHg1NSwgMHgwNCwgMHgwNywgMHgxOCwgMHgxZCwgMHgyNCwgMHgyZSwKLSAgICAgIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2QsIDB4M2YsIDB4NDAsCi0gICAgICAweDQxLCAweDRjLCAweGFhLCAweGFlLCAweGIwLCAweGIxLCAweGIyLCAweGI2LCAweGVhLCAweDFiLCAweDVkCi0gICAgICB9OwotCi0gICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkYXRhX25vbmVfY21kc1tdID0gewotICAgICAgMHgwMSwgMHgwYiwgMHgxMCwgMHgxMSwgMHgxMywgMHgxNiwgMHgxNywgMHgxOSwgMHgyYiwgMHgxZSwKLSAgICAgIDB4MmMsIDB4YWMsIDB4MmYsIDB4YWYsIDB4MzMsIDB4YjMsIDB4MzUsIDB4MzYsIDB4NDUsIDB4NDcsCi0gICAgICAweDQ4LCAweDQ5LCAweGE5LCAweDRiLCAweGE1LCAweGE2LCAweGI1LCAweDAwCi0gICAgICB9OwotCi0gICBzdHJ1Y3QgbXNjcCAqY3BwOwotICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7Ci0KLSAgIGNwcCA9ICZIRChqKS0+Y3BbaV07IFNDcG50ID0gY3BwLT5TQ3BudDsKLQotICAgaWYgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKLSAgICAgIGNwcC0+eGRpciA9IERURF9JTjsKLSAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgIGVsc2UgaWYgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7Ci0gICAgICBjcHAtPnhkaXIgPSBEVERfT1VUOwotICAgICAgcmV0dXJuOwotICAgICAgfQotICAgZWxzZSBpZiAoU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9OT05FKSB7Ci0gICAgICBjcHAtPnhkaXIgPSBEVERfTk9ORTsKLSAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgaWYgKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiAhPSBETUFfQklESVJFQ1RJT05BTCkKLSAgICAgIHBhbmljKCIlczogcWNvbW0sIGludmFsaWQgU0NwbnQtPnNjX2RhdGFfZGlyZWN0aW9uLlxuIiwgQk4oaikpOwotCi0gICBjcHAtPnhkaXIgPSBEVERfSU47Ci0KLSAgIGZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKGRhdGFfb3V0X2NtZHMpOyBrKyspCi0gICAgICBpZiAoU0NwbnQtPmNtbmRbMF0gPT0gZGF0YV9vdXRfY21kc1trXSkgewotICAgICAgICAgY3BwLT54ZGlyID0gRFREX09VVDsKLSAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotCi0gICBpZiAoY3BwLT54ZGlyID09IERURF9JTikKLSAgICAgIGZvciAoayA9IDA7IGsgPCBBUlJBWV9TSVpFKGRhdGFfbm9uZV9jbWRzKTsgaysrKQotICAgICAgICAgaWYgKFNDcG50LT5jbW5kWzBdID09IGRhdGFfbm9uZV9jbWRzW2tdKSB7Ci0gICAgICAgICAgICBjcHAtPnhkaXIgPSBEVERfTk9ORTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi19Ci0KLXN0YXRpYyBpbnQgdTE0XzM0Zl9xdWV1ZWNvbW1hbmRfbGNrKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkgewotICAgdW5zaWduZWQgaW50IGksIGosIGs7Ci0gICBzdHJ1Y3QgbXNjcCAqY3BwOwotCi0gICAvKiBqIGlzIHRoZSBib2FyZCBudW1iZXIgKi8KLSAgIGogPSAoKHN0cnVjdCBob3N0ZGF0YSAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YSktPmJvYXJkX251bWJlcjsKLQotICAgaWYgKFNDcG50LT5ob3N0X3NjcmliYmxlKQotICAgICAgcGFuaWMoIiVzOiBxY29tbSwgU0NwbnQgJXAgYWxyZWFkeSBhY3RpdmUuXG4iLAotICAgICAgICAgICAgQk4oaiksIFNDcG50KTsKLQotICAgLyogaSBpcyB0aGUgbWFpbGJveCBudW1iZXIsIGxvb2sgZm9yIHRoZSBmaXJzdCBmcmVlIG1haWxib3gKLSAgICAgIHN0YXJ0aW5nIGZyb20gbGFzdF9jcF91c2VkICovCi0gICBpID0gSEQoaiktPmxhc3RfY3BfdXNlZCArIDE7Ci0KLSAgIGZvciAoayA9IDA7IGsgPCBzaFtqXS0+Y2FuX3F1ZXVlOyBrKyssIGkrKykgewotCi0gICAgICBpZiAoaSA+PSBzaFtqXS0+Y2FuX3F1ZXVlKSBpID0gMDsKLQotICAgICAgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IEZSRUUpIHsKLSAgICAgICAgIEhEKGopLT5sYXN0X2NwX3VzZWQgPSBpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICB9Ci0KLSAgIGlmIChrID09IHNoW2pdLT5jYW5fcXVldWUpIHsKLSAgICAgIHByaW50aygiJXM6IHFjb21tLCBubyBmcmVlIG1haWxib3guXG4iLCBCTihqKSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICAgIH0KLQotICAgLyogU2V0IHBvaW50ZXIgdG8gY29udHJvbCBwYWNrZXQgc3RydWN0dXJlICovCi0gICBjcHAgPSAmSEQoaiktPmNwW2ldOwotCi0gICBtZW1zZXQoY3BwLCAwLCBzaXplb2Yoc3RydWN0IG1zY3ApIC0gQ1BfVEFJTF9TSVpFKTsKLSAgIFNDcG50LT5zY3NpX2RvbmUgPSBkb25lOwotICAgY3BwLT5jcHBfaW5kZXggPSBpOwotICAgU0NwbnQtPmhvc3Rfc2NyaWJibGUgPSAodW5zaWduZWQgY2hhciAqKSAmY3BwLT5jcHBfaW5kZXg7Ci0KLSAgIGlmIChkb190cmFjZSkgcHJpbnRrKCIlczogcWNvbW0sIG1ib3ggJWQsIHRhcmdldCAlZC4lZDoldS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBCTihqKSwgaSwgU0NwbnQtPmRldmljZS0+Y2hhbm5lbCwgU0NwbnQtPmRldmljZS0+aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAodTgpU0NwbnQtPmRldmljZS0+bHVuKTsKLQotICAgY3BwLT5vcGNvZGUgPSBPUF9TQ1NJOwotICAgY3BwLT5jaGFubmVsID0gU0NwbnQtPmRldmljZS0+Y2hhbm5lbDsKLSAgIGNwcC0+dGFyZ2V0ID0gU0NwbnQtPmRldmljZS0+aWQ7Ci0gICBjcHAtPmx1biA9ICh1OClTQ3BudC0+ZGV2aWNlLT5sdW47Ci0gICBjcHAtPlNDcG50ID0gU0NwbnQ7Ci0gICBjcHAtPmNkYl9sZW4gPSBTQ3BudC0+Y21kX2xlbjsKLSAgIG1lbWNweShjcHAtPmNkYiwgU0NwbnQtPmNtbmQsIFNDcG50LT5jbWRfbGVuKTsKLQotICAgLyogVXNlIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbiAqLwotICAgc2NzaV90b19kZXZfZGlyKGksIGopOwotCi0gICAvKiBNYXAgRE1BIGJ1ZmZlcnMgYW5kIFNHIGxpc3QgKi8KLSAgIG1hcF9kbWEoaSwgaik7Ci0KLSAgIGlmIChsaW5rZWRfY29tbSAmJiBTQ3BudC0+ZGV2aWNlLT5xdWV1ZV9kZXB0aCA+IDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBUTERFVihTQ3BudC0+ZGV2aWNlLT50eXBlKSkgewotICAgICAgSEQoaiktPmNwX3N0YXRbaV0gPSBSRUFEWTsKLSAgICAgIGZsdXNoX2RldihTQ3BudC0+ZGV2aWNlLCBibGtfcnFfcG9zKFNDcG50LT5yZXF1ZXN0KSwgaiwgRkFMU0UpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgIGlmICh3YWl0X29uX2J1c3koc2hbal0tPmlvX3BvcnQsIE1BWExPT1ApKSB7Ci0gICAgICB1bm1hcF9kbWEoaSwgaik7Ci0gICAgICBTQ3BudC0+aG9zdF9zY3JpYmJsZSA9IE5VTEw7Ci0gICAgICBzY21kX3ByaW50ayhLRVJOX0lORk8sIFNDcG50LAotICAgICAgCQkicWNvbW0sIGFkYXB0ZXIgYnVzeS5cbiIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0KLSAgIC8qIFN0b3JlIHBvaW50ZXIgaW4gT0dNIGFkZHJlc3MgYnl0ZXMgKi8KLSAgIG91dGwoSDJERVYoY3BwLT5jcF9kbWFfYWRkciksIHNoW2pdLT5pb19wb3J0ICsgUkVHX09HTSk7Ci0KLSAgIC8qIElzc3VlIE9HTSBpbnRlcnJ1cHQgKi8KLSAgIG91dGIoQ01EX09HTV9JTlRSLCBzaFtqXS0+aW9fcG9ydCArIFJFR19MQ0xfSU5UUik7Ci0KLSAgIEhEKGopLT5jcF9zdGF0W2ldID0gSU5fVVNFOwotICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBERUZfU0NTSV9RQ01EKHUxNF8zNGZfcXVldWVjb21tYW5kKQotCi1zdGF0aWMgaW50IHUxNF8zNGZfZWhfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqU0NhcmcpIHsKLSAgIHVuc2lnbmVkIGludCBpLCBqOwotCi0gICBqID0gKChzdHJ1Y3QgaG9zdGRhdGEgKikgU0NhcmctPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpLT5ib2FyZF9udW1iZXI7Ci0KLSAgIGlmIChTQ2FyZy0+aG9zdF9zY3JpYmJsZSA9PSBOVUxMKSB7Ci0gICAgICBzY21kX3ByaW50ayhLRVJOX0lORk8sIFNDYXJnLCAiYWJvcnQsIGNvbW1hbmQgaW5hY3RpdmUuXG4iKTsKLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgICAgfQotCi0gICBpID0gKih1bnNpZ25lZCBpbnQgKilTQ2FyZy0+aG9zdF9zY3JpYmJsZTsKLSAgIHNjbWRfcHJpbnRrKEtFUk5fSU5GTywgU0NhcmcsICJhYm9ydCwgbWJveCAlZC5cbiIsIGkpOwotCi0gICBpZiAoaSA+PSBzaFtqXS0+Y2FuX3F1ZXVlKQotICAgICAgcGFuaWMoIiVzOiBhYm9ydCwgaW52YWxpZCBTQ2FyZy0+aG9zdF9zY3JpYmJsZS5cbiIsIEJOKGopKTsKLQotICAgaWYgKHdhaXRfb25fYnVzeShzaFtqXS0+aW9fcG9ydCwgTUFYTE9PUCkpIHsKLSAgICAgIHByaW50aygiJXM6IGFib3J0LCB0aW1lb3V0IGVycm9yLlxuIiwgQk4oaikpOwotICAgICAgcmV0dXJuIEZBSUxFRDsKLSAgICAgIH0KLQotICAgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IEZSRUUpIHsKLSAgICAgIHByaW50aygiJXM6IGFib3J0LCBtYm94ICVkIGlzIGZyZWUuXG4iLCBCTihqKSwgaSk7Ci0gICAgICByZXR1cm4gU1VDQ0VTUzsKLSAgICAgIH0KLQotICAgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IElOX1VTRSkgewotICAgICAgcHJpbnRrKCIlczogYWJvcnQsIG1ib3ggJWQgaXMgaW4gdXNlLlxuIiwgQk4oaiksIGkpOwotCi0gICAgICBpZiAoU0NhcmcgIT0gSEQoaiktPmNwW2ldLlNDcG50KQotICAgICAgICAgcGFuaWMoIiVzOiBhYm9ydCwgbWJveCAlZCwgU0NhcmcgJXAsIGNwIFNDcG50ICVwLlxuIiwKLSAgICAgICAgICAgICAgIEJOKGopLCBpLCBTQ2FyZywgSEQoaiktPmNwW2ldLlNDcG50KTsKLQotICAgICAgaWYgKGluYihzaFtqXS0+aW9fcG9ydCArIFJFR19TWVNfSU5UUikgJiBJUlFfQVNTRVJURUQpCi0gICAgICAgICBwcmludGsoIiVzOiBhYm9ydCwgbWJveCAlZCwgaW50ZXJydXB0IHBlbmRpbmcuXG4iLCBCTihqKSwgaSk7Ci0KLSAgICAgIHJldHVybiBGQUlMRUQ7Ci0gICAgICB9Ci0KLSAgIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBJTl9SRVNFVCkgewotICAgICAgcHJpbnRrKCIlczogYWJvcnQsIG1ib3ggJWQgaXMgaW4gcmVzZXQuXG4iLCBCTihqKSwgaSk7Ci0gICAgICByZXR1cm4gRkFJTEVEOwotICAgICAgfQotCi0gICBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gTE9DS0VEKSB7Ci0gICAgICBwcmludGsoIiVzOiBhYm9ydCwgbWJveCAlZCBpcyBsb2NrZWQuXG4iLCBCTihqKSwgaSk7Ci0gICAgICByZXR1cm4gU1VDQ0VTUzsKLSAgICAgIH0KLQotICAgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IFJFQURZIHx8IEhEKGopLT5jcF9zdGF0W2ldID09IEFCT1JUSU5HKSB7Ci0gICAgICB1bm1hcF9kbWEoaSwgaik7Ci0gICAgICBTQ2FyZy0+cmVzdWx0ID0gRElEX0FCT1JUIDw8IDE2OwotICAgICAgU0NhcmctPmhvc3Rfc2NyaWJibGUgPSBOVUxMOwotICAgICAgSEQoaiktPmNwX3N0YXRbaV0gPSBGUkVFOwotICAgICAgcHJpbnRrKCIlcywgYWJvcnQsIG1ib3ggJWQgcmVhZHksIERJRF9BQk9SVCwgZG9uZS5cbiIsIEJOKGopLCBpKTsKLSAgICAgIFNDYXJnLT5zY3NpX2RvbmUoU0NhcmcpOwotICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgICB9Ci0KLSAgIHBhbmljKCIlczogYWJvcnQsIG1ib3ggJWQsIGludmFsaWQgY3Bfc3RhdC5cbiIsIEJOKGopLCBpKTsKLX0KLQotc3RhdGljIGludCB1MTRfMzRmX2VoX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqU0NhcmcpIHsKLSAgIHVuc2lnbmVkIGludCBpLCBqLCBrLCBjLCBsaW1pdCA9IDA7Ci0gICB1bnNpZ25lZCBsb25nIHRpbWU7Ci0gICBpbnQgYXJnX2RvbmUgPSBGQUxTRTsKLSAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OwotCi0gICBqID0gKChzdHJ1Y3QgaG9zdGRhdGEgKikgU0NhcmctPmRldmljZS0+aG9zdC0+aG9zdGRhdGEpLT5ib2FyZF9udW1iZXI7Ci0gICBzY21kX3ByaW50ayhLRVJOX0lORk8sIFNDYXJnLCAicmVzZXQsIGVudGVyLlxuIik7Ci0KLSAgIHNwaW5fbG9ja19pcnEoc2hbal0tPmhvc3RfbG9jayk7Ci0KLSAgIGlmIChTQ2FyZy0+aG9zdF9zY3JpYmJsZSA9PSBOVUxMKQotICAgICAgcHJpbnRrKCIlczogcmVzZXQsIGluYWN0aXZlLlxuIiwgQk4oaikpOwotCi0gICBpZiAoSEQoaiktPmluX3Jlc2V0KSB7Ci0gICAgICBwcmludGsoIiVzOiByZXNldCwgZXhpdCwgYWxyZWFkeSBpbiByZXNldC5cbiIsIEJOKGopKTsKLSAgICAgIHNwaW5fdW5sb2NrX2lycShzaFtqXS0+aG9zdF9sb2NrKTsKLSAgICAgIHJldHVybiBGQUlMRUQ7Ci0gICAgICB9Ci0KLSAgIGlmICh3YWl0X29uX2J1c3koc2hbal0tPmlvX3BvcnQsIE1BWExPT1ApKSB7Ci0gICAgICBwcmludGsoIiVzOiByZXNldCwgZXhpdCwgdGltZW91dCBlcnJvci5cbiIsIEJOKGopKTsKLSAgICAgIHNwaW5fdW5sb2NrX2lycShzaFtqXS0+aG9zdF9sb2NrKTsKLSAgICAgIHJldHVybiBGQUlMRUQ7Ci0gICAgICB9Ci0KLSAgIEhEKGopLT5yZXRyaWVzID0gMDsKLQotICAgZm9yIChjID0gMDsgYyA8PSBzaFtqXS0+bWF4X2NoYW5uZWw7IGMrKykKLSAgICAgIGZvciAoayA9IDA7IGsgPCBzaFtqXS0+bWF4X2lkOyBrKyspIHsKLSAgICAgICAgIEhEKGopLT50YXJnZXRfcmVkb1trXVtjXSA9IFRSVUU7Ci0gICAgICAgICBIRChqKS0+dGFyZ2V0X3RvW2tdW2NdID0gMDsKLSAgICAgICAgIH0KLQotICAgZm9yIChpID0gMDsgaSA8IHNoW2pdLT5jYW5fcXVldWU7IGkrKykgewotCi0gICAgICBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gRlJFRSkgY29udGludWU7Ci0KLSAgICAgIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBMT0NLRUQpIHsKLSAgICAgICAgIEhEKGopLT5jcF9zdGF0W2ldID0gRlJFRTsKLSAgICAgICAgIHByaW50aygiJXM6IHJlc2V0LCBsb2NrZWQgbWJveCAlZCBmb3JjZWQgZnJlZS5cbiIsIEJOKGopLCBpKTsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgfQotCi0gICAgICBpZiAoIShTQ3BudCA9IEhEKGopLT5jcFtpXS5TQ3BudCkpCi0gICAgICAgICBwYW5pYygiJXM6IHJlc2V0LCBtYm94ICVkLCBTQ3BudCA9PSBOVUxMLlxuIiwgQk4oaiksIGkpOwotCi0gICAgICBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gUkVBRFkgfHwgSEQoaiktPmNwX3N0YXRbaV0gPT0gQUJPUlRJTkcpIHsKLSAgICAgICAgIEhEKGopLT5jcF9zdGF0W2ldID0gQUJPUlRJTkc7Ci0gICAgICAgICBwcmludGsoIiVzOiByZXNldCwgbWJveCAlZCBhYm9ydGluZy5cbiIsIEJOKGopLCBpKTsKLSAgICAgICAgIH0KLQotICAgICAgZWxzZSB7Ci0gICAgICAgICBIRChqKS0+Y3Bfc3RhdFtpXSA9IElOX1JFU0VUOwotICAgICAgICAgcHJpbnRrKCIlczogcmVzZXQsIG1ib3ggJWQgaW4gcmVzZXQuXG4iLCBCTihqKSwgaSk7Ci0gICAgICAgICB9Ci0KLSAgICAgIGlmIChTQ3BudC0+aG9zdF9zY3JpYmJsZSA9PSBOVUxMKQotICAgICAgICAgcGFuaWMoIiVzOiByZXNldCwgbWJveCAlZCwgZ2FyYmxlZCBTQ3BudC5cbiIsIEJOKGopLCBpKTsKLQotICAgICAgaWYgKCoodW5zaWduZWQgaW50ICopU0NwbnQtPmhvc3Rfc2NyaWJibGUgIT0gaSkKLSAgICAgICAgIHBhbmljKCIlczogcmVzZXQsIG1ib3ggJWQsIGluZGV4IG1pc21hdGNoLlxuIiwgQk4oaiksIGkpOwotCi0gICAgICBpZiAoU0NwbnQtPnNjc2lfZG9uZSA9PSBOVUxMKQotICAgICAgICAgcGFuaWMoIiVzOiByZXNldCwgbWJveCAlZCwgU0NwbnQtPnNjc2lfZG9uZSA9PSBOVUxMLlxuIiwgQk4oaiksIGkpOwotCi0gICAgICBpZiAoU0NwbnQgPT0gU0NhcmcpIGFyZ19kb25lID0gVFJVRTsKLSAgICAgIH0KLQotICAgaWYgKHdhaXRfb25fYnVzeShzaFtqXS0+aW9fcG9ydCwgTUFYTE9PUCkpIHsKLSAgICAgIHByaW50aygiJXM6IHJlc2V0LCBjYW5ub3QgcmVzZXQsIHRpbWVvdXQgZXJyb3IuXG4iLCBCTihqKSk7Ci0gICAgICBzcGluX3VubG9ja19pcnEoc2hbal0tPmhvc3RfbG9jayk7Ci0gICAgICByZXR1cm4gRkFJTEVEOwotICAgICAgfQotCi0gICBvdXRiKENNRF9SRVNFVCwgc2hbal0tPmlvX3BvcnQgKyBSRUdfTENMX0lOVFIpOwotICAgcHJpbnRrKCIlczogcmVzZXQsIGJvYXJkIHJlc2V0IGRvbmUsIGVuYWJsaW5nIGludGVycnVwdHMuXG4iLCBCTihqKSk7Ci0KLSNpZiBkZWZpbmVkKERFQlVHX1JFU0VUKQotICAgZG9fdHJhY2UgPSBUUlVFOwotI2VuZGlmCi0KLSAgIEhEKGopLT5pbl9yZXNldCA9IFRSVUU7Ci0KLSAgIHNwaW5fdW5sb2NrX2lycShzaFtqXS0+aG9zdF9sb2NrKTsKLSAgIHRpbWUgPSBqaWZmaWVzOwotICAgd2hpbGUgKChqaWZmaWVzIC0gdGltZSkgPCAoMTAgKiBIWikgJiYgbGltaXQrKyA8IDIwMDAwMCkgdWRlbGF5KDEwMEwpOwotICAgc3Bpbl9sb2NrX2lycShzaFtqXS0+aG9zdF9sb2NrKTsKLQotICAgcHJpbnRrKCIlczogcmVzZXQsIGludGVycnVwdHMgZGlzYWJsZWQsIGxvb3BzICVkLlxuIiwgQk4oaiksIGxpbWl0KTsKLQotICAgZm9yIChpID0gMDsgaSA8IHNoW2pdLT5jYW5fcXVldWU7IGkrKykgewotCi0gICAgICBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gSU5fUkVTRVQpIHsKLSAgICAgICAgIFNDcG50ID0gSEQoaiktPmNwW2ldLlNDcG50OwotICAgICAgICAgdW5tYXBfZG1hKGksIGopOwotICAgICAgICAgU0NwbnQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKLSAgICAgICAgIFNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKLQotICAgICAgICAgLyogVGhpcyBtYWlsYm94IGlzIHN0aWxsIHdhaXRpbmcgZm9yIGl0cyBpbnRlcnJ1cHQgKi8KLSAgICAgICAgIEhEKGopLT5jcF9zdGF0W2ldID0gTE9DS0VEOwotCi0gICAgICAgICBwcmludGsoIiVzLCByZXNldCwgbWJveCAlZCBsb2NrZWQsIERJRF9SRVNFVCwgZG9uZS5cbiIsIEJOKGopLCBpKTsKLSAgICAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gQUJPUlRJTkcpIHsKLSAgICAgICAgIFNDcG50ID0gSEQoaiktPmNwW2ldLlNDcG50OwotICAgICAgICAgdW5tYXBfZG1hKGksIGopOwotICAgICAgICAgU0NwbnQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKLSAgICAgICAgIFNDcG50LT5ob3N0X3NjcmliYmxlID0gTlVMTDsKLQotICAgICAgICAgLyogVGhpcyBtYWlsYm94IHdhcyBuZXZlciBxdWV1ZWQgdG8gdGhlIGFkYXB0ZXIgKi8KLSAgICAgICAgIEhEKGopLT5jcF9zdGF0W2ldID0gRlJFRTsKLQotICAgICAgICAgcHJpbnRrKCIlcywgcmVzZXQsIG1ib3ggJWQgYWJvcnRpbmcsIERJRF9SRVNFVCwgZG9uZS5cbiIsIEJOKGopLCBpKTsKLSAgICAgICAgIH0KLQotICAgICAgZWxzZQotCi0gICAgICAgICAvKiBBbnkgb3RoZXIgbWFpbGJveCBoYXMgYWxyZWFkeSBiZWVuIHNldCBmcmVlIGJ5IGludGVycnVwdCAqLwotICAgICAgICAgY29udGludWU7Ci0KLSAgICAgIFNDcG50LT5zY3NpX2RvbmUoU0NwbnQpOwotICAgICAgfQotCi0gICBIRChqKS0+aW5fcmVzZXQgPSBGQUxTRTsKLSAgIGRvX3RyYWNlID0gRkFMU0U7Ci0KLSAgIGlmIChhcmdfZG9uZSkgcHJpbnRrKCIlczogcmVzZXQsIGV4aXQsIGRvbmUuXG4iLCBCTihqKSk7Ci0gICBlbHNlICAgICAgICAgIHByaW50aygiJXM6IHJlc2V0LCBleGl0LlxuIiwgQk4oaikpOwotCi0gICBzcGluX3VubG9ja19pcnEoc2hbal0tPmhvc3RfbG9jayk7Ci0gICByZXR1cm4gU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCB1MTRfMzRmX2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpkaXNrLAotICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBjYXBhY2l0eSwgaW50ICpka2luZm8pIHsKLSAgIHVuc2lnbmVkIGludCBqID0gMDsKLSAgIHVuc2lnbmVkIGludCBzaXplID0gY2FwYWNpdHk7Ci0KLSAgIGRraW5mb1swXSA9IEhEKGopLT5oZWFkczsKLSAgIGRraW5mb1sxXSA9IEhEKGopLT5zZWN0b3JzOwotICAgZGtpbmZvWzJdID0gc2l6ZSAvIChIRChqKS0+aGVhZHMgKiBIRChqKS0+c2VjdG9ycyk7Ci0KLSAgIGlmIChleHRfdHJhbiAmJiAoc2NzaWNhbV9iaW9zX3BhcmFtKGJkZXYsIGNhcGFjaXR5LCBka2luZm8pIDwgMCkpIHsKLSAgICAgIGRraW5mb1swXSA9IDI1NTsKLSAgICAgIGRraW5mb1sxXSA9IDYzOwotICAgICAgZGtpbmZvWzJdID0gc2l6ZSAvIChka2luZm9bMF0gKiBka2luZm9bMV0pOwotICAgICAgfQotCi0jaWYgZGVmaW5lZCAoREVCVUdfR0VPTUVUUlkpCi0gICBwcmludGsgKCIlczogYmlvc19wYXJhbSwgaGVhZD0lZCwgc2VjPSVkLCBjeWw9JWQuXG4iLCBkcml2ZXJfbmFtZSwKLSAgICAgICAgICAgZGtpbmZvWzBdLCBka2luZm9bMV0sIGRraW5mb1syXSk7Ci0jZW5kaWYKLQotICAgcmV0dXJuIEZBTFNFOwotfQotCi1zdGF0aWMgdm9pZCBzb3J0KHVuc2lnbmVkIGxvbmcgc2tbXSwgdW5zaWduZWQgaW50IGRhW10sIHVuc2lnbmVkIGludCBuLAotICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmV2KSB7Ci0gICB1bnNpZ25lZCBpbnQgaSwgaiwgaywgeTsKLSAgIHVuc2lnbmVkIGxvbmcgeDsKLQotICAgZm9yIChpID0gMDsgaSA8IG4gLSAxOyBpKyspIHsKLSAgICAgIGsgPSBpOwotCi0gICAgICBmb3IgKGogPSBrICsgMTsgaiA8IG47IGorKykKLSAgICAgICAgIGlmIChyZXYpIHsKLSAgICAgICAgICAgIGlmIChza1tqXSA+IHNrW2tdKSBrID0gajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKHNrW2pdIDwgc2tba10pIGsgPSBqOwotICAgICAgICAgICAgfQotCi0gICAgICBpZiAoayAhPSBpKSB7Ci0gICAgICAgICB4ID0gc2tba107IHNrW2tdID0gc2tbaV07IHNrW2ldID0geDsKLSAgICAgICAgIHkgPSBkYVtrXTsgZGFba10gPSBkYVtpXTsgZGFbaV0gPSB5OwotICAgICAgICAgfQotICAgICAgfQotCi0gICByZXR1cm47Ci0gICB9Ci0KLXN0YXRpYyBpbnQgcmVvcmRlcih1bnNpZ25lZCBpbnQgaiwgdW5zaWduZWQgbG9uZyBjdXJzZWMsCi0gICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpaGRsciwgdW5zaWduZWQgaW50IGlsW10sIHVuc2lnbmVkIGludCBuX3JlYWR5KSB7Ci0gICBzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudDsKLSAgIHN0cnVjdCBtc2NwICpjcHA7Ci0gICB1bnNpZ25lZCBpbnQgaywgbjsKLSAgIHVuc2lnbmVkIGludCByZXYgPSBGQUxTRSwgcyA9IFRSVUUsIHIgPSBUUlVFOwotICAgdW5zaWduZWQgaW50IGlucHV0X29ubHkgPSBUUlVFLCBvdmVybGFwID0gRkFMU0U7Ci0gICB1bnNpZ25lZCBsb25nIHNsW25fcmVhZHldLCBwbFtuX3JlYWR5XSwgbGxbbl9yZWFkeV07Ci0gICB1bnNpZ25lZCBsb25nIG1heHNlYyA9IDAsIG1pbnNlYyA9IFVMT05HX01BWCwgc2VlayA9IDAsIGlzZWVrID0gMDsKLSAgIHVuc2lnbmVkIGxvbmcgaW9zZWVrID0gMDsKLQotICAgc3RhdGljIHVuc2lnbmVkIGludCBmbHVzaGNvdW50ID0gMCwgYmF0Y2hjb3VudCA9IDAsIHNvcnRjb3VudCA9IDA7Ci0gICBzdGF0aWMgdW5zaWduZWQgaW50IHJlYWR5Y291bnQgPSAwLCBvdmxjb3VudCA9IDAsIGlucHV0Y291bnQgPSAwOwotICAgc3RhdGljIHVuc2lnbmVkIGludCByZWFkeXNvcnRlZCA9IDAsIHJldmNvdW50ID0gMDsKLSAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNlZWtzb3J0ZWQgPSAwLCBzZWVrbm9zb3J0ID0gMDsKLQotICAgaWYgKGxpbmtfc3RhdGlzdGljcyAmJiAhKCsrZmx1c2hjb3VudCAlIGxpbmtfc3RhdGlzdGljcykpCi0gICAgICBwcmludGsoImZjICVkIGJjICVkIGljICVkIG9jICVkIHJjICVkIHJzICVkIHNjICVkIHJlICVkIlwKLSAgICAgICAgICAgICAiIGF2ICVsZEsgYXMgJWxkSy5cbiIsIGZsdXNoY291bnQsIGJhdGNoY291bnQsIGlucHV0Y291bnQsCi0gICAgICAgICAgICAgb3ZsY291bnQsIHJlYWR5Y291bnQsIHJlYWR5c29ydGVkLCBzb3J0Y291bnQsIHJldmNvdW50LAotICAgICAgICAgICAgIHNlZWtub3NvcnQgLyAocmVhZHljb3VudCArIDEpLAotICAgICAgICAgICAgIHNlZWtzb3J0ZWQgLyAocmVhZHljb3VudCArIDEpKTsKLQotICAgaWYgKG5fcmVhZHkgPD0gMSkgcmV0dXJuIEZBTFNFOwotCi0gICBmb3IgKG4gPSAwOyBuIDwgbl9yZWFkeTsgbisrKSB7Ci0gICAgICBrID0gaWxbbl07IGNwcCA9ICZIRChqKS0+Y3Bba107IFNDcG50ID0gY3BwLT5TQ3BudDsKLQotICAgICAgaWYgKCEoY3BwLT54ZGlyID09IERURF9JTikpIGlucHV0X29ubHkgPSBGQUxTRTsKLQotICAgICAgaWYgKGJsa19ycV9wb3MoU0NwbnQtPnJlcXVlc3QpIDwgbWluc2VjKQotCSBtaW5zZWMgPSBibGtfcnFfcG9zKFNDcG50LT5yZXF1ZXN0KTsKLSAgICAgIGlmIChibGtfcnFfcG9zKFNDcG50LT5yZXF1ZXN0KSA+IG1heHNlYykKLQkgbWF4c2VjID0gYmxrX3JxX3BvcyhTQ3BudC0+cmVxdWVzdCk7Ci0KLSAgICAgIHNsW25dID0gYmxrX3JxX3BvcyhTQ3BudC0+cmVxdWVzdCk7Ci0gICAgICBpb3NlZWsgKz0gYmxrX3JxX3NlY3RvcnMoU0NwbnQtPnJlcXVlc3QpOwotCi0gICAgICBpZiAoIW4pIGNvbnRpbnVlOwotCi0gICAgICBpZiAoc2xbbl0gPCBzbFtuIC0gMV0pIHMgPSBGQUxTRTsKLSAgICAgIGlmIChzbFtuXSA+IHNsW24gLSAxXSkgciA9IEZBTFNFOwotCi0gICAgICBpZiAobGlua19zdGF0aXN0aWNzKSB7Ci0gICAgICAgICBpZiAoc2xbbl0gPiBzbFtuIC0gMV0pCi0gICAgICAgICAgICBzZWVrICs9IHNsW25dIC0gc2xbbiAtIDFdOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2VlayArPSBzbFtuIC0gMV0gLSBzbFtuXTsKLSAgICAgICAgIH0KLQotICAgICAgfQotCi0gICBpZiAobGlua19zdGF0aXN0aWNzKSB7Ci0gICAgICBpZiAoY3Vyc2VjID4gc2xbMF0pIHNlZWsgKz0gY3Vyc2VjIC0gc2xbMF07IGVsc2Ugc2VlayArPSBzbFswXSAtIGN1cnNlYzsKLSAgICAgIH0KLQotICAgaWYgKGN1cnNlYyA+ICgobWF4c2VjICsgbWluc2VjKSAvIDIpKSByZXYgPSBUUlVFOwotCi0gICBpZiAoaW9zZWVrID4gKChtYXhzZWMgLSBtaW5zZWMpIC8gMikpIHJldiA9IEZBTFNFOwotCi0gICBpZiAoISgocmV2ICYmIHIpIHx8ICghcmV2ICYmIHMpKSkgc29ydChzbCwgaWwsIG5fcmVhZHksIHJldik7Ci0KLSAgIGlmICghaW5wdXRfb25seSkgZm9yIChuID0gMDsgbiA8IG5fcmVhZHk7IG4rKykgewotICAgICAgayA9IGlsW25dOyBjcHAgPSAmSEQoaiktPmNwW2tdOyBTQ3BudCA9IGNwcC0+U0NwbnQ7Ci0gICAgICBsbFtuXSA9IGJsa19ycV9zZWN0b3JzKFNDcG50LT5yZXF1ZXN0KTsgcGxbbl0gPSBTQ3BudC0+c2VyaWFsX251bWJlcjsKLQotICAgICAgaWYgKCFuKSBjb250aW51ZTsKLQotICAgICAgaWYgKChzbFtuXSA9PSBzbFtuIC0gMV0pIHx8ICghcmV2ICYmICgoc2xbbiAtIDFdICsgbGxbbiAtIDFdKSA+IHNsW25dKSkKLSAgICAgICAgICB8fCAocmV2ICYmICgoc2xbbl0gKyBsbFtuXSkgPiBzbFtuIC0gMV0pKSkgb3ZlcmxhcCA9IFRSVUU7Ci0gICAgICB9Ci0KLSAgIGlmIChvdmVybGFwKSBzb3J0KHBsLCBpbCwgbl9yZWFkeSwgRkFMU0UpOwotCi0gICBpZiAobGlua19zdGF0aXN0aWNzKSB7Ci0gICAgICBpZiAoY3Vyc2VjID4gc2xbMF0pIGlzZWVrID0gY3Vyc2VjIC0gc2xbMF07IGVsc2UgaXNlZWsgPSBzbFswXSAtIGN1cnNlYzsKLSAgICAgIGJhdGNoY291bnQrKzsgcmVhZHljb3VudCArPSBuX3JlYWR5OyBzZWVrbm9zb3J0ICs9IHNlZWsgLyAxMDI0OwotICAgICAgaWYgKGlucHV0X29ubHkpIGlucHV0Y291bnQrKzsKLSAgICAgIGlmIChvdmVybGFwKSB7IG92bGNvdW50Kys7IHNlZWtzb3J0ZWQgKz0gaXNlZWsgLyAxMDI0OyB9Ci0gICAgICBlbHNlIHNlZWtzb3J0ZWQgKz0gKGlzZWVrICsgbWF4c2VjIC0gbWluc2VjKSAvIDEwMjQ7Ci0gICAgICBpZiAocmV2ICYmICFyKSAgICAgeyAgcmV2Y291bnQrKzsgcmVhZHlzb3J0ZWQgKz0gbl9yZWFkeTsgfQotICAgICAgaWYgKCFyZXYgJiYgIXMpICAgIHsgc29ydGNvdW50Kys7IHJlYWR5c29ydGVkICs9IG5fcmVhZHk7IH0KLSAgICAgIH0KLQotI2lmIGRlZmluZWQoREVCVUdfTElOS0VEX0NPTU1BTkRTKQotICAgaWYgKGxpbmtfc3RhdGlzdGljcyAmJiAob3ZlcmxhcCB8fCAhKGZsdXNoY291bnQgJSBsaW5rX3N0YXRpc3RpY3MpKSkKLSAgICAgIGZvciAobiA9IDA7IG4gPCBuX3JlYWR5OyBuKyspIHsKLSAgICAgICAgIGsgPSBpbFtuXTsgY3BwID0gJkhEKGopLT5jcFtrXTsgU0NwbnQgPSBjcHAtPlNDcG50OwotICAgICAgICAgcHJpbnRrKCIlcyAlZC4lZDolbGx1IG1iICVkIGZjICVkIG5yICVkIHNlYyAlbGQgbnMgJXUiXAotICAgICAgICAgICAgICAgICIgY3VyICVsZCBzOiVjIHI6JWMgcmV2OiVjIGluOiVjIG92OiVjIHhkICVkLlxuIiwKLSAgICAgICAgICAgICAgICAoaWhkbHIgPyAiaWhkbHIiIDogInFjb21tIiksIFNDcG50LT5jaGFubmVsLCBTQ3BudC0+dGFyZ2V0LAotICAgICAgICAgICAgICAgICh1OClTQ3BudC0+bHVuLCBrLCBmbHVzaGNvdW50LCBuX3JlYWR5LAotICAgICAgICAgICAgICAgIGJsa19ycV9wb3MoU0NwbnQtPnJlcXVlc3QpLCBibGtfcnFfc2VjdG9ycyhTQ3BudC0+cmVxdWVzdCksCi0JCWN1cnNlYywgWUVTTk8ocyksIFlFU05PKHIpLCBZRVNOTyhyZXYpLCBZRVNOTyhpbnB1dF9vbmx5KSwKLSAgICAgICAgICAgICAgICBZRVNOTyhvdmVybGFwKSwgY3BwLT54ZGlyKTsKLSAgICAgICAgIH0KLSNlbmRpZgotICAgcmV0dXJuIG92ZXJsYXA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZsdXNoX2RldihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBjdXJzZWMsIHVuc2lnbmVkIGludCBqLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpaGRscikgewotICAgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQ7Ci0gICBzdHJ1Y3QgbXNjcCAqY3BwOwotICAgdW5zaWduZWQgaW50IGssIG4sIG5fcmVhZHkgPSAwLCBpbFtNQVhfTUFJTEJPWEVTXTsKLQotICAgZm9yIChrID0gMDsgayA8IHNoW2pdLT5jYW5fcXVldWU7IGsrKykgewotCi0gICAgICBpZiAoSEQoaiktPmNwX3N0YXRba10gIT0gUkVBRFkgJiYgSEQoaiktPmNwX3N0YXRba10gIT0gSU5fVVNFKSBjb250aW51ZTsKLQotICAgICAgY3BwID0gJkhEKGopLT5jcFtrXTsgU0NwbnQgPSBjcHAtPlNDcG50OwotCi0gICAgICBpZiAoU0NwbnQtPmRldmljZSAhPSBkZXYpIGNvbnRpbnVlOwotCi0gICAgICBpZiAoSEQoaiktPmNwX3N0YXRba10gPT0gSU5fVVNFKSByZXR1cm47Ci0KLSAgICAgIGlsW25fcmVhZHkrK10gPSBrOwotICAgICAgfQotCi0gICBpZiAocmVvcmRlcihqLCBjdXJzZWMsIGloZGxyLCBpbCwgbl9yZWFkeSkpIG5fcmVhZHkgPSAxOwotCi0gICBmb3IgKG4gPSAwOyBuIDwgbl9yZWFkeTsgbisrKSB7Ci0gICAgICBrID0gaWxbbl07IGNwcCA9ICZIRChqKS0+Y3Bba107IFNDcG50ID0gY3BwLT5TQ3BudDsKLQotICAgICAgaWYgKHdhaXRfb25fYnVzeShzaFtqXS0+aW9fcG9ydCwgTUFYTE9PUCkpIHsKLSAgICAgICAgIHNjbWRfcHJpbnRrKEtFUk5fSU5GTywgU0NwbnQsCi0JIAkiJXMsIG1ib3ggJWQsIGFkYXB0ZXIiCi0gICAgICAgICAgICAgICAgIiBidXN5LCB3aWxsIGFib3J0LlxuIiwgKGloZGxyID8gImloZGxyIiA6ICJxY29tbSIpLAotICAgICAgICAgICAgICAgIGspOwotICAgICAgICAgSEQoaiktPmNwX3N0YXRba10gPSBBQk9SVElORzsKLSAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgfQotCi0gICAgICBvdXRsKEgyREVWKGNwcC0+Y3BfZG1hX2FkZHIpLCBzaFtqXS0+aW9fcG9ydCArIFJFR19PR00pOwotICAgICAgb3V0YihDTURfT0dNX0lOVFIsIHNoW2pdLT5pb19wb3J0ICsgUkVHX0xDTF9JTlRSKTsKLSAgICAgIEhEKGopLT5jcF9zdGF0W2tdID0gSU5fVVNFOwotICAgICAgfQotCi19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBpaGRscih1bnNpZ25lZCBpbnQgaikKLXsKLSAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OwotICAgdW5zaWduZWQgaW50IGksIGssIGMsIHN0YXR1cywgdHN0YXR1cywgcmVnLCByZXQ7Ci0gICBzdHJ1Y3QgbXNjcCAqc3BwLCAqY3BwOwotICAgaW50IGlycSA9IHNoW2pdLT5pcnE7Ci0KLSAgIC8qIENoZWNrIGlmIHRoaXMgYm9hcmQgbmVlZCB0byBiZSBzZXJ2aWNlZCAqLwotICAgaWYgKCEoKHJlZyA9IGluYihzaFtqXS0+aW9fcG9ydCArIFJFR19TWVNfSU5UUikpICYgSVJRX0FTU0VSVEVEKSkgZ290byBub25lOwotCi0gICBIRChqKS0+aW9jb3VudCsrOwotCi0gICBpZiAoZG9fdHJhY2UpIHByaW50aygiJXM6IGloZGxyLCBlbnRlciwgaXJxICVkLCBjb3VudCAlZC5cbiIsIEJOKGopLCBpcnEsCi0gICAgICAgICAgICAgICAgICAgICAgICBIRChqKS0+aW9jb3VudCk7Ci0KLSAgIC8qIENoZWNrIGlmIHRoaXMgYm9hcmQgaXMgc3RpbGwgYnVzeSAqLwotICAgaWYgKHdhaXRfb25fYnVzeShzaFtqXS0+aW9fcG9ydCwgMjAgKiBNQVhMT09QKSkgewotICAgICAgb3V0YihDTURfQ0xSX0lOVFIsIHNoW2pdLT5pb19wb3J0ICsgUkVHX1NZU19JTlRSKTsKLSAgICAgIHByaW50aygiJXM6IGloZGxyLCBidXN5IHRpbWVvdXQgZXJyb3IsICBpcnEgJWQsIHJlZyAweCV4LCBjb3VudCAlZC5cbiIsCi0gICAgICAgICAgICAgQk4oaiksIGlycSwgcmVnLCBIRChqKS0+aW9jb3VudCk7Ci0gICAgICBnb3RvIG5vbmU7Ci0gICAgICB9Ci0KLSAgIHJldCA9IGlubChzaFtqXS0+aW9fcG9ydCArIFJFR19JQ00pOwotCi0gICAvKiBDbGVhciBpbnRlcnJ1cHQgcGVuZGluZyBmbGFnICovCi0gICBvdXRiKENNRF9DTFJfSU5UUiwgc2hbal0tPmlvX3BvcnQgKyBSRUdfU1lTX0lOVFIpOwotCi0gICAvKiBGaW5kIHRoZSBtYWlsYm94IHRvIGJlIHNlcnZpY2VkIG9uIHRoaXMgYm9hcmQgKi8KLSAgIGZvciAoaSA9IDA7IGkgPCBzaFtqXS0+Y2FuX3F1ZXVlOyBpKyspCi0gICAgICBpZiAoSDJERVYoSEQoaiktPmNwW2ldLmNwX2RtYV9hZGRyKSA9PSByZXQpIGJyZWFrOwotCi0gICBpZiAoaSA+PSBzaFtqXS0+Y2FuX3F1ZXVlKQotICAgICAgcGFuaWMoIiVzOiBpaGRsciwgaW52YWxpZCBtc2NwIGJ1cyBhZGRyZXNzICVwLCBjcDAgJXAuXG4iLCBCTihqKSwKLSAgICAgICAgICAgICh2b2lkICopcmV0LCAodm9pZCAqKUgyREVWKEhEKGopLT5jcFswXS5jcF9kbWFfYWRkcikpOwotCi0gICBjcHAgPSAmKEhEKGopLT5jcFtpXSk7Ci0gICBzcHAgPSBjcHA7Ci0KLSNpZiBkZWZpbmVkKERFQlVHX0dFTkVSQVRFX0FCT1JUUykKLSAgIGlmICgoSEQoaiktPmlvY291bnQgPiA1MDApICYmICgoSEQoaiktPmlvY291bnQgJSA1MDApIDwgMykpIGdvdG8gaGFuZGxlZDsKLSNlbmRpZgotCi0gICBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gSUdOT1JFKSB7Ci0gICAgICBIRChqKS0+Y3Bfc3RhdFtpXSA9IEZSRUU7Ci0gICAgICBnb3RvIGhhbmRsZWQ7Ci0gICAgICB9Ci0gICBlbHNlIGlmIChIRChqKS0+Y3Bfc3RhdFtpXSA9PSBMT0NLRUQpIHsKLSAgICAgIEhEKGopLT5jcF9zdGF0W2ldID0gRlJFRTsKLSAgICAgIHByaW50aygiJXM6IGloZGxyLCBtYm94ICVkIHVubG9ja2VkLCBjb3VudCAlZC5cbiIsIEJOKGopLCBpLAotICAgICAgICAgICAgIEhEKGopLT5pb2NvdW50KTsKLSAgICAgIGdvdG8gaGFuZGxlZDsKLSAgICAgIH0KLSAgIGVsc2UgaWYgKEhEKGopLT5jcF9zdGF0W2ldID09IEZSRUUpIHsKLSAgICAgIHByaW50aygiJXM6IGloZGxyLCBtYm94ICVkIGlzIGZyZWUsIGNvdW50ICVkLlxuIiwgQk4oaiksIGksCi0gICAgICAgICAgICAgSEQoaiktPmlvY291bnQpOwotICAgICAgZ290byBoYW5kbGVkOwotICAgICAgfQotICAgZWxzZSBpZiAoSEQoaiktPmNwX3N0YXRbaV0gPT0gSU5fUkVTRVQpCi0gICAgICBwcmludGsoIiVzOiBpaGRsciwgbWJveCAlZCBpcyBpbiByZXNldC5cbiIsIEJOKGopLCBpKTsKLSAgIGVsc2UgaWYgKEhEKGopLT5jcF9zdGF0W2ldICE9IElOX1VTRSkKLSAgICAgIHBhbmljKCIlczogaWhkbHIsIG1ib3ggJWQsIGludmFsaWQgY3Bfc3RhdDogJWQuXG4iLAotICAgICAgICAgICAgQk4oaiksIGksIEhEKGopLT5jcF9zdGF0W2ldKTsKLQotICAgSEQoaiktPmNwX3N0YXRbaV0gPSBGUkVFOwotICAgU0NwbnQgPSBjcHAtPlNDcG50OwotCi0gICBpZiAoU0NwbnQgPT0gTlVMTCkgcGFuaWMoIiVzOiBpaGRsciwgbWJveCAlZCwgU0NwbnQgPT0gTlVMTC5cbiIsIEJOKGopLCBpKTsKLQotICAgaWYgKFNDcG50LT5ob3N0X3NjcmliYmxlID09IE5VTEwpCi0gICAgICBwYW5pYygiJXM6IGloZGxyLCBtYm94ICVkLCBTQ3BudCAlcCBnYXJibGVkLlxuIiwgQk4oaiksIGksCi0gICAgICAgICAgICBTQ3BudCk7Ci0KLSAgIGlmICgqKHVuc2lnbmVkIGludCAqKVNDcG50LT5ob3N0X3NjcmliYmxlICE9IGkpCi0gICAgICBwYW5pYygiJXM6IGloZGxyLCBtYm94ICVkLCBpbmRleCBtaXNtYXRjaCAlZC5cbiIsCi0gICAgICAgICAgICBCTihqKSwgaSwgKih1bnNpZ25lZCBpbnQgKilTQ3BudC0+aG9zdF9zY3JpYmJsZSk7Ci0KLSAgIHN5bmNfZG1hKGksIGopOwotCi0gICBpZiAobGlua2VkX2NvbW0gJiYgU0NwbnQtPmRldmljZS0+cXVldWVfZGVwdGggPiAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVExERVYoU0NwbnQtPmRldmljZS0+dHlwZSkpCi0gICAgICBmbHVzaF9kZXYoU0NwbnQtPmRldmljZSwgYmxrX3JxX3BvcyhTQ3BudC0+cmVxdWVzdCksIGosIFRSVUUpOwotCi0gICB0c3RhdHVzID0gc3RhdHVzX2J5dGUoc3BwLT50YXJnZXRfc3RhdHVzKTsKLQotI2lmIGRlZmluZWQoREVCVUdfR0VORVJBVEVfRVJST1JTKQotICAgaWYgKChIRChqKS0+aW9jb3VudCA+IDUwMCkgJiYgKChIRChqKS0+aW9jb3VudCAlIDIwMCkgPCAyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHAtPmFkYXB0ZXJfc3RhdHVzID0gMHgwMTsKLSNlbmRpZgotCi0gICBzd2l0Y2ggKHNwcC0+YWRhcHRlcl9zdGF0dXMpIHsKLSAgICAgIGNhc2UgQVNPSzogICAgIC8qIHN0YXR1cyBPSyAqLwotCi0gICAgICAgICAvKiBGb3JjZXMgYSByZXNldCBpZiBhIGRpc2sgZHJpdmUga2VlcHMgcmV0dXJuaW5nIEJVU1kgKi8KLSAgICAgICAgIGlmICh0c3RhdHVzID09IEJVU1kgJiYgU0NwbnQtPmRldmljZS0+dHlwZSAhPSBUWVBFX1RBUEUpCi0gICAgICAgICAgICBzdGF0dXMgPSBESURfRVJST1IgPDwgMTY7Ci0KLSAgICAgICAgIC8qIElmIHRoZXJlIHdhcyBhIGJ1cyByZXNldCwgcmVkbyBvcGVyYXRpb24gb24gZWFjaCB0YXJnZXQgKi8KLSAgICAgICAgIGVsc2UgaWYgKHRzdGF0dXMgIT0gR09PRCAmJiBTQ3BudC0+ZGV2aWNlLT50eXBlID09IFRZUEVfRElTSwotICAgICAgICAgICAgICAgICAgJiYgSEQoaiktPnRhcmdldF9yZWRvW3NjbWRfaWQoU0NwbnQpXVtzY21kX2NoYW5uZWwoU0NwbnQpXSkKLSAgICAgICAgICAgIHN0YXR1cyA9IERJRF9CVVNfQlVTWSA8PCAxNjsKLQotICAgICAgICAgLyogV29ya3MgYXJvdW5kIGEgZmxhdyBpbiBzY3NpLmMgKi8KLSAgICAgICAgIGVsc2UgaWYgKHRzdGF0dXMgPT0gQ0hFQ0tfQ09ORElUSU9OCi0gICAgICAgICAgICAgICAgICAmJiBTQ3BudC0+ZGV2aWNlLT50eXBlID09IFRZUEVfRElTSwotICAgICAgICAgICAgICAgICAgJiYgKFNDcG50LT5zZW5zZV9idWZmZXJbMl0gJiAweGYpID09IFJFQ09WRVJFRF9FUlJPUikKLSAgICAgICAgICAgIHN0YXR1cyA9IERJRF9CVVNfQlVTWSA8PCAxNjsKLQotICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RhdHVzID0gRElEX09LIDw8IDE2OwotCi0gICAgICAgICBpZiAodHN0YXR1cyA9PSBHT09EKQotICAgICAgICAgICAgSEQoaiktPnRhcmdldF9yZWRvW3NjbWRfaWQoU0NwbnQpXVtzY21kX2NoYW5uZWwoU0NwbnQpXSA9IEZBTFNFOwotCi0gICAgICAgICBpZiAoc3BwLT50YXJnZXRfc3RhdHVzICYmIFNDcG50LT5kZXZpY2UtPnR5cGUgPT0gVFlQRV9ESVNLICYmCi0gICAgICAgICAgICAgKCEodHN0YXR1cyA9PSBDSEVDS19DT05ESVRJT04gJiYgSEQoaiktPmlvY291bnQgPD0gMTAwMCAmJgotICAgICAgICAgICAgICAgKFNDcG50LT5zZW5zZV9idWZmZXJbMl0gJiAweGYpID09IE5PVF9SRUFEWSkpKQotICAgICAgICAgICAgc2NtZF9wcmludGsoS0VSTl9JTkZPLCBTQ3BudCwKLQkgICAgCSJpaGRsciwgdGFyZ2V0X3N0YXR1cyAweCV4LCBzZW5zZSBrZXkgMHgleC5cbiIsCi0gICAgICAgICAgICAgICAgICAgc3BwLT50YXJnZXRfc3RhdHVzLAotICAgICAgICAgICAgICAgICAgIFNDcG50LT5zZW5zZV9idWZmZXJbMl0pOwotCi0gICAgICAgICBIRChqKS0+dGFyZ2V0X3RvW3NjbWRfaWQoU0NwbnQpXVtzY21kX2NoYW5uZWwoU0NwbnQpXSA9IDA7Ci0KLSAgICAgICAgIGlmIChIRChqKS0+bGFzdF9yZXRyaWVkX3BpZCA9PSBTQ3BudC0+c2VyaWFsX251bWJlcikgSEQoaiktPnJldHJpZXMgPSAwOwotCi0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQVNTVDogICAgIC8qIFNlbGVjdGlvbiBUaW1lIE91dCAqLwotCi0gICAgICAgICBpZiAoSEQoaiktPnRhcmdldF90b1tzY21kX2lkKFNDcG50KV1bc2NtZF9jaGFubmVsKFNDcG50KV0gPiAxKQotICAgICAgICAgICAgc3RhdHVzID0gRElEX0VSUk9SIDw8IDE2OwotICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBESURfVElNRV9PVVQgPDwgMTY7Ci0gICAgICAgICAgICBIRChqKS0+dGFyZ2V0X3RvW3NjbWRfaWQoU0NwbnQpXVtzY21kX2NoYW5uZWwoU0NwbnQpXSsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICBicmVhazsKLQotICAgICAgLyogUGVyZm9ybSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGludGVybmFsIHJldHJpZXMgKi8KLSAgICAgIGNhc2UgMHg5MzogICAgIC8qIFVuZXhwZWN0ZWQgYnVzIGZyZWUgKi8KLSAgICAgIGNhc2UgMHg5NDogICAgIC8qIFRhcmdldCBidXMgcGhhc2Ugc2VxdWVuY2UgZmFpbHVyZSAqLwotICAgICAgY2FzZSAweDk2OiAgICAgLyogSWxsZWdhbCBTQ1NJIGNvbW1hbmQgKi8KLSAgICAgIGNhc2UgMHhhMzogICAgIC8qIFNDU0kgYnVzIHJlc2V0IGVycm9yICovCi0KLSAgICAgICAgIGZvciAoYyA9IDA7IGMgPD0gc2hbal0tPm1heF9jaGFubmVsOyBjKyspCi0gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgc2hbal0tPm1heF9pZDsgaysrKQotICAgICAgICAgICAgICAgSEQoaiktPnRhcmdldF9yZWRvW2tdW2NdID0gVFJVRTsKLQotCi0gICAgICBjYXNlIDB4OTI6ICAgICAvKiBEYXRhIG92ZXIvdW5kZXItcnVuICovCi0KLSAgICAgICAgIGlmIChTQ3BudC0+ZGV2aWNlLT50eXBlICE9IFRZUEVfVEFQRQotICAgICAgICAgICAgICYmIEhEKGopLT5yZXRyaWVzIDwgTUFYX0lOVEVSTkFMX1JFVFJJRVMpIHsKLQotI2lmIGRlZmluZWQoRElEX1NPRlRfRVJST1IpCi0gICAgICAgICAgICBzdGF0dXMgPSBESURfU09GVF9FUlJPUiA8PCAxNjsKLSNlbHNlCi0gICAgICAgICAgICBzdGF0dXMgPSBESURfQlVTX0JVU1kgPDwgMTY7Ci0jZW5kaWYKLQotICAgICAgICAgICAgSEQoaiktPnJldHJpZXMrKzsKLSAgICAgICAgICAgIEhEKGopLT5sYXN0X3JldHJpZWRfcGlkID0gU0NwbnQtPnNlcmlhbF9udW1iZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdGF0dXMgPSBESURfRVJST1IgPDwgMTY7Ci0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAweDAxOiAgICAgLyogSW52YWxpZCBjb21tYW5kICovCi0gICAgICBjYXNlIDB4MDI6ICAgICAvKiBJbnZhbGlkIHBhcmFtZXRlcnMgKi8KLSAgICAgIGNhc2UgMHgwMzogICAgIC8qIEludmFsaWQgZGF0YSBsaXN0ICovCi0gICAgICBjYXNlIDB4ODQ6ICAgICAvKiBTQ1NJIGJ1cyBhYm9ydCBlcnJvciAqLwotICAgICAgY2FzZSAweDliOiAgICAgLyogQXV0byByZXF1ZXN0IHNlbnNlIGVycm9yICovCi0gICAgICBjYXNlIDB4OWY6ICAgICAvKiBVbmV4cGVjdGVkIGNvbW1hbmQgY29tcGxldGUgbWVzc2FnZSBlcnJvciAqLwotICAgICAgY2FzZSAweGZmOiAgICAgLyogSW52YWxpZCBwYXJhbWV0ZXIgaW4gdGhlIFMvRyBsaXN0ICovCi0gICAgICBkZWZhdWx0OgotICAgICAgICAgc3RhdHVzID0gRElEX0VSUk9SIDw8IDE2OwotICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgIFNDcG50LT5yZXN1bHQgPSBzdGF0dXMgfCBzcHAtPnRhcmdldF9zdGF0dXM7Ci0KLSNpZiBkZWZpbmVkKERFQlVHX0lOVEVSUlVQVCkKLSAgIGlmIChTQ3BudC0+cmVzdWx0IHx8IGRvX3RyYWNlKQotI2Vsc2UKLSAgIGlmICgoc3BwLT5hZGFwdGVyX3N0YXR1cyAhPSBBU09LICYmIEhEKGopLT5pb2NvdW50ID4gIDEwMDApIHx8Ci0gICAgICAgKHNwcC0+YWRhcHRlcl9zdGF0dXMgIT0gQVNPSyAmJgotICAgICAgICBzcHAtPmFkYXB0ZXJfc3RhdHVzICE9IEFTU1QgJiYgSEQoaiktPmlvY291bnQgPD0gMTAwMCkgfHwKLSAgICAgICAgZG9fdHJhY2UgfHwgbXNnX2J5dGUoc3BwLT50YXJnZXRfc3RhdHVzKSkKLSNlbmRpZgotICAgICAgc2NtZF9wcmludGsoS0VSTl9JTkZPLCBTQ3BudCwgImloZGxyLCBtYm94ICUyZCwgZXJyIDB4JXg6JXgsIlwKLSAgICAgICAgICAgICAiIHJlZyAweCV4LCBjb3VudCAlZC5cbiIsCi0gICAgICAgICAgICAgaSwgc3BwLT5hZGFwdGVyX3N0YXR1cywgc3BwLT50YXJnZXRfc3RhdHVzLAotICAgICAgICAgICAgIHJlZywgSEQoaiktPmlvY291bnQpOwotCi0gICB1bm1hcF9kbWEoaSwgaik7Ci0KLSAgIC8qIFNldCB0aGUgY29tbWFuZCBzdGF0ZSB0byBpbmFjdGl2ZSAqLwotICAgU0NwbnQtPmhvc3Rfc2NyaWJibGUgPSBOVUxMOwotCi0gICBTQ3BudC0+c2NzaV9kb25lKFNDcG50KTsKLQotICAgaWYgKGRvX3RyYWNlKSBwcmludGsoIiVzOiBpaGRsciwgZXhpdCwgaXJxICVkLCBjb3VudCAlZC5cbiIsIEJOKGopLCBpcnEsCi0gICAgICAgICAgICAgICAgICAgICAgICBIRChqKS0+aW9jb3VudCk7Ci0KLWhhbmRsZWQ6Ci0gICByZXR1cm4gSVJRX0hBTkRMRUQ7Ci1ub25lOgotICAgcmV0dXJuIElSUV9OT05FOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgZG9faW50ZXJydXB0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqc2hhcCkgewotICAgdW5zaWduZWQgaW50IGo7Ci0gICB1bnNpZ25lZCBsb25nIHNwaW5fZmxhZ3M7Ci0gICBpcnFyZXR1cm5fdCByZXQ7Ci0KLSAgIC8qIENoZWNrIGlmIHRoZSBpbnRlcnJ1cHQgbXVzdCBiZSBwcm9jZXNzZWQgYnkgdGhpcyBoYW5kbGVyICovCi0gICBpZiAoKGogPSAodW5zaWduZWQgaW50KSgoY2hhciAqKXNoYXAgLSBzaGEpKSA+PSBudW1fYm9hcmRzKSByZXR1cm4gSVJRX05PTkU7Ci0KLSAgIHNwaW5fbG9ja19pcnFzYXZlKHNoW2pdLT5ob3N0X2xvY2ssIHNwaW5fZmxhZ3MpOwotICAgcmV0ID0gaWhkbHIoaik7Ci0gICBzcGluX3VubG9ja19pcnFyZXN0b3JlKHNoW2pdLT5ob3N0X2xvY2ssIHNwaW5fZmxhZ3MpOwotICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB1MTRfMzRmX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hwbnQpIHsKLSAgIHVuc2lnbmVkIGludCBpLCBqOwotCi0gICBmb3IgKGogPSAwOyBzaFtqXSAhPSBOVUxMICYmIHNoW2pdICE9IHNocG50OyBqKyspOwotCi0gICBpZiAoc2hbal0gPT0gTlVMTCkKLSAgICAgIHBhbmljKCIlczogcmVsZWFzZSwgaW52YWxpZCBTY3NpX0hvc3QgcG9pbnRlci5cbiIsIGRyaXZlcl9uYW1lKTsKLQotICAgZm9yIChpID0gMDsgaSA8IHNoW2pdLT5jYW5fcXVldWU7IGkrKykKLSAgICAgIGtmcmVlKCgmSEQoaiktPmNwW2ldKS0+c2dsaXN0KTsKLQotICAgZm9yIChpID0gMDsgaSA8IHNoW2pdLT5jYW5fcXVldWU7IGkrKykKLSAgICAgIHBjaV91bm1hcF9zaW5nbGUoSEQoaiktPnBkZXYsIEhEKGopLT5jcFtpXS5jcF9kbWFfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbXNjcCksIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0KLSAgIGZyZWVfaXJxKHNoW2pdLT5pcnEsICZzaGFbal0pOwotCi0gICBpZiAoc2hbal0tPmRtYV9jaGFubmVsICE9IE5PX0RNQSkKLSAgICAgIGZyZWVfZG1hKHNoW2pdLT5kbWFfY2hhbm5lbCk7Ci0KLSAgIHJlbGVhc2VfcmVnaW9uKHNoW2pdLT5pb19wb3J0LCBzaFtqXS0+bl9pb19wb3J0KTsKLSAgIHNjc2lfdW5yZWdpc3RlcihzaFtqXSk7Ci0gICByZXR1cm4gRkFMU0U7Ci19Ci0KLSNpbmNsdWRlICJzY3NpX21vZHVsZS5jIgotCi0jaWZuZGVmIE1PRFVMRQotX19zZXR1cCgidTE0LTM0Zj0iLCBvcHRpb25fc2V0dXApOwotI2VuZGlmIC8qIGVuZCBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS91ZnMvdGMtZHdjLWcyMTAuYyBiL2RyaXZlcnMvc2NzaS91ZnMvdGMtZHdjLWcyMTAuYwppbmRleCA3MGRiNmQ5Li5kYzAzZTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdWZzL3RjLWR3Yy1nMjEwLmMKKysrIGIvZHJpdmVycy9zY3NpL3Vmcy90Yy1kd2MtZzIxMC5jCkBAIC0xNSw2ICsxNSw3IEBACiAKICNpbmNsdWRlICJ1ZnNoY2QtZHdjLmgiCiAjaW5jbHVkZSAidWZzaGNpLWR3Yy5oIgorI2luY2x1ZGUgInRjLWR3Yy1nMjEwLmgiCiAKIC8qKgogICogdGNfZHdjX2cyMTBfc2V0dXBfNDBiaXRfcm1taSgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdWZzL3Vmcy5oIGIvZHJpdmVycy9zY3NpL3Vmcy91ZnMuaAppbmRleCBiMjkxZmE2Li44NDViODc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdWZzL3Vmcy5oCisrKyBiL2RyaXZlcnMvc2NzaS91ZnMvdWZzLmgKQEAgLTMyNyw2ICszMjcsNyBAQAogCU1BU0tfUVVFUllfREFUQV9TRUdfTEVOICAgICAgICAgPSAweEZGRkYsCiAJTUFTS19SU1BfVVBJVV9EQVRBX1NFR19MRU4JPSAweEZGRkYsCiAJTUFTS19SU1BfRVhDRVBUSU9OX0VWRU5UICAgICAgICA9IDB4MTAwMDAsCisJTUFTS19UTV9TRVJWSUNFX1JFU1AJCT0gMHhGRiwKIH07CiAKIC8qIFRhc2sgbWFuYWdlbWVudCBzZXJ2aWNlIHJlc3BvbnNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdWZzL3Vmc2hjZC5jIGIvZHJpdmVycy9zY3NpL3Vmcy91ZnNoY2QuYwppbmRleCBmMDhkNDFhLi4zN2YzYzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdWZzL3Vmc2hjZC5jCisrKyBiL2RyaXZlcnMvc2NzaS91ZnMvdWZzaGNkLmMKQEAgLTI1NjgsNyArMjU2OCw3IEBACiAJc3RhdHVzID0gdWZzaGNkX2dldF91cG1jcnMoaGJhKTsKIAlpZiAoc3RhdHVzICE9IFBXUl9MT0NBTCkgewogCQlkZXZfZXJyKGhiYS0+ZGV2LAotCQkJInB3ciBjdHJsIGNtZCAweCUweCBmYWlsZWQsIGhvc3QgdW1wY3JzOjB4JXhcbiIsCisJCQkicHdyIGN0cmwgY21kIDB4JTB4IGZhaWxlZCwgaG9zdCB1cG1jcnM6MHgleFxuIiwKIAkJCWNtZC0+Y29tbWFuZCwgc3RhdHVzKTsKIAkJcmV0ID0gKHN0YXR1cyAhPSBQV1JfT0spID8gc3RhdHVzIDogLTE7CiAJfQpAQCAtMzM2NCw4ICszMzY0LDggQEAKIAlpZiAob2NzX3ZhbHVlID09IE9DU19TVUNDRVNTKSB7CiAJCXRhc2tfcnNwX3VwaXVwID0gKHN0cnVjdCB1dHBfdXBpdV90YXNrX3JzcCAqKQogCQkJCXRhc2tfcmVxX2Rlc2NwW2luZGV4XS50YXNrX3JzcF91cGl1OwotCQl0YXNrX3Jlc3VsdCA9IGJlMzJfdG9fY3B1KHRhc2tfcnNwX3VwaXVwLT5oZWFkZXIuZHdvcmRfMSk7Ci0JCXRhc2tfcmVzdWx0ID0gKCh0YXNrX3Jlc3VsdCAmIE1BU0tfVEFTS19SRVNQT05TRSkgPj4gOCk7CisJCXRhc2tfcmVzdWx0ID0gYmUzMl90b19jcHUodGFza19yc3BfdXBpdXAtPm91dHB1dF9wYXJhbTEpOworCQl0YXNrX3Jlc3VsdCA9IHRhc2tfcmVzdWx0ICYgTUFTS19UTV9TRVJWSUNFX1JFU1A7CiAJCWlmIChyZXNwKQogCQkJKnJlc3AgPSAodTgpdGFza19yZXN1bHQ7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS91bHRyYXN0b3IuYyBiL2RyaXZlcnMvc2NzaS91bHRyYXN0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRlMGM0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvdWx0cmFzdG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEwICswLDAgQEAKLS8qCi0gKgl1bHRyYXN0b3IuYwlDb3B5cmlnaHQgKEMpIDE5OTIgRGF2aWQgQi4gR2VudHplbAotICoJTG93LWxldmVsIFNDU0kgZHJpdmVyIGZvciBVbHRyYVN0b3IgMTRGLCAyNEYsIGFuZCAzNEYKLSAqCWJ5IERhdmlkIEIuIEdlbnR6ZWwsIFdoaXRmaWVsZCBTb2Z0d2FyZSBTZXJ2aWNlcywgQ2FybmVnaWUsIFBBCi0gKgkgICAgKGdlbnR6ZWxAbm92YS5lbmV0LmRlYy5jb20pCi0gKiAgc2NhdHRlci9nYXRoZXIgYWRkZWQgYnkgU2NvdHQgVGF5bG9yIChuMjE3Y2dAdGFtdXRzLnRhbXUuZWR1KQotICogIDI0RiBhbmQgbXVsdGlwbGUgY29tbWFuZCBzdXBwb3J0IGJ5IEpvaG4gRi4gQ2FyciAoamZjQGF0aGVuYS5taXQuZWR1KQotICogICAgSm9obidzIHdvcmsgbW9kaWZpZWQgYnkgQ2FsZWIgRXBzdGVpbiAoY2FlQGpwbW9yZ2FuLmNvbSkgYW5kIAotICogICAgRXJpYyBZb3VuZ2RhbGUgKGVyaWN5QGNhaXMuY29tKS4KLSAqCVRoYW5rcyB0byBVbHRyYVN0b3IgZm9yIHByb3ZpZGluZyB0aGUgbmVjZXNzYXJ5IGRvY3VtZW50YXRpb24KLSAqCi0gKiAgVGhpcyBpcyBhbiBvbGQgZHJpdmVyLCBmb3IgdGhlIDE0RiBhbmQgMzRGIHlvdSBzaG91bGQgYmUgdXNpbmcgdGhlCi0gKiAgdTE0LTM0ZiBkcml2ZXIgaW5zdGVhZC4KLSAqLwotCi0vKgotICogVE9ETzoKLSAqCTEuIEZpbmQgb3V0IHdoeSBzY2F0dGVyL2dhdGhlciBpcyBsaW1pdGVkIHRvIDE2IHJlcXVlc3RzIHBlciBjb21tYW5kLgotICogICAgICAgICBUaGlzIGlzIGZpeGVkLCBhdCBsZWFzdCBvbiB0aGUgMjRGLCBhcyBvZiB2ZXJzaW9uIDEuMTIgLSBDQUUuCi0gKgkyLiBMb29rIGF0IGNvbW1hbmQgbGlua2luZyAobXNjcC5jb21tYW5kX2xpbmsgYW5kCi0gKgkgICBtc2NwLmNvbW1hbmRfbGlua19pZCkuICAoRG9lcyBub3Qgd29yayB3aXRoIG1hbnkgZGlza3MsIAotICoJCQkJYW5kIG5vIHBlcmZvcm1hbmNlIGluY3JlYXNlLiAgRVJZKS4KLSAqCTMuIEFsbG93IG11bHRpcGxlIGFkYXB0ZXJzLgotICovCi0KLS8qCi0gKiBOT1RFUzoKLSAqICAgIFRoZSBVbHRyYVN0b3IgMTRGLCAyNEYsIGFuZCAzNEYgYXJlIGEgZmFtaWx5IG9mIGludGVsbGlnZW50LCBoaWdoCi0gKiAgICBwZXJmb3JtYW5jZSBTQ1NJLTIgaG9zdCBhZGFwdGVycy4gIFRoZXkgYWxsIHN1cHBvcnQgY29tbWFuZCBxdWV1ZWluZwotICogICAgYW5kIHNjYXR0ZXIvZ2F0aGVyIEkvTy4gIFNvbWUgb2YgdGhlbSBjYW4gYWxzbyBlbXVsYXRlIHRoZSBzdGFuZGFyZAotICogICAgV0QxMDAzIGludGVyZmFjZSBmb3IgdXNlIHdpdGggT1MncyB3aGljaCBkb24ndCBzdXBwb3J0IFNDU0kuICBIZXJlCi0gKiAgICBpcyB0aGUgc2Nvb3Agb24gdGhlIHZhcmlvdXMgbW9kZWxzOgotICoJMTRGIC0gSVNBIGZpcnN0LXBhcnR5IERNQSBIQSB3aXRoIGZsb3BweSBzdXBwb3J0IGFuZCBXRDEwMDMgZW11bGF0aW9uLgotICoJMTROIC0gSVNBIEhBIHdpdGggZmxvcHB5IHN1cHBvcnQuICBJIHRoaW5rIHRoYXQgdGhpcyBpcyBhIG5vbi1ETUEKLSAqCSAgICAgIEhBLiAgTm90aGluZyBmdXJ0aGVyIGtub3duLgotICoJMjRGIC0gRUlTQSBCdXMgTWFzdGVyIEhBIHdpdGggZmxvcHB5IHN1cHBvcnQgYW5kIFdEMTAwMyBlbXVsYXRpb24uCi0gKgkzNEYgLSBWTC1CdXMgQnVzIE1hc3RlciBIQSB3aXRoIGZsb3BweSBzdXBwb3J0IChubyBXRDEwMDMgZW11bGF0aW9uKS4KLSAqCi0gKiAgICBUaGUgMTRGLCAyNEYsIGFuZCAzNEYgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KLSAqCi0gKiAgICBQbGFjZXMgZmxhZ2dlZCB3aXRoIGEgdHJpcGxlIHF1ZXN0aW9uLW1hcmsgYXJlIHRoaW5ncyB3aGljaCBhcmUgZWl0aGVyCi0gKiAgICB1bmZpbmlzaGVkLCBxdWVzdGlvbmFibGUsIG9yIHdyb25nLgotICovCi0KLS8qIENoYW5nZXMgZnJvbSB2ZXJzaW9uIDEuMTEgYWxwaGEgdG8gMS4xMgotICoKLSAqIEluY3JlYXNlZCB0aGUgc2l6ZSBvZiB0aGUgc2NhdHRlci1nYXRoZXIgbGlzdCB0byAzMyBlbnRyaWVzIGZvcgotICogdGhlIDI0RiBhZGFwdGVyIChpdCB3YXMgMTYpLiAgSSBkb24ndCBoYXZlIHRoZSBzcGVjcyBmb3IgdGhlIDE0RgotICogb3IgdGhlIDM0Riwgc28gdGhleSBtYXkgc3VwcG9ydCBsYXJnZXIgcy1nIGxpc3RzIGFzIHdlbGwuCi0gKgotICogQ2FsZWIgRXBzdGVpbiA8Y2FlQGpwbW9yZ2FuLmNvbT4KLSAqLwotCi0vKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjkgdG8gMS4xMQotICoKLSAqIFBhdGNoZXMgdG8gYnJpbmcgdGhpcyBkcml2ZXIgdXAgdG8gc3BlZWQgd2l0aCB0aGUgZGVmYXVsdCBrZXJuZWwKLSAqIGRyaXZlciB3aGljaCBzdXBwb3J0cyBvbmx5IHRoZSAxNEYgYW5kIDM0RiBhZGFwdGVycy4gIFRoaXMgdmVyc2lvbgotICogc2hvdWxkIGNvbXBpbGUgY2xlYW5seSBpbnRvIDAuOTkuMTMsIDAuOTkuMTIgYW5kIHByb2JhYmx5IDAuOTkuMTEuCi0gKgotICogRml4ZXMgZnJvbSBFcmljIFlvdW5nZGFsZSB0byBmaXggYSBmZXcgcG9zc2libGUgcmFjZSBjb25kaXRpb25zIGFuZAotICogc2V2ZXJhbCBwcm9ibGVtcyB3aXRoIGJpdCB0ZXN0aW5nIG9wZXJhdGlvbnMgKGluc3VmZmljaWVudAotICogcGFyZW50aGVzZXMpLgotICoKLSAqIFJlbW92ZWQgdGhlIHVsdHJhc3Rvcl9hYm9ydCgpIGFuZCB1bHRyYXN0b3JfcmVzZXQoKSBmdW5jdGlvbnMKLSAqIChlbmNsb3NlZCB0aGVtIGluICNpZiAwIC8gI2VuZGlmKS4gIFRoZXNlIGZ1bmN0aW9ucywgYXQgbGVhc3Qgb24KLSAqIHRoZSAyNEYsIGNhdXNlIHRoZSBTQ1NJIGJ1cyB0byBkbyBvZGQgdGhpbmdzIGFuZCBnZW5lcmFsbHkgbGVhZCB0bwotICoga2VybmVsIHBhbmljcyBhbmQgbWFjaGluZSBoYW5ncy4gIFRoaXMgaXMgbGlrZSB0aGUgQWRhcHRlYyBjb2RlLgotICoKLSAqIFVzZSBjaGVjay9zbmFyZl9yZWdpb24gZm9yIDE0ZiwgMzRmIHRvIGF2b2lkIEkvTyBzcGFjZSBhZGRyZXNzIGNvbmZsaWN0cy4KLSAqLwotCi0vKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjggdG8gdmVyc2lvbiAxLjkKLSAqCi0gKiAgMC45OS4xMSBwYXRjaGVzIChjYWVAanBtb3JnYW4uY29tKSAqLwotCi0vKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjcgdG8gdmVyc2lvbiAxLjgKLSAqCi0gKiBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nLgotICovCi0KLS8qIENoYW5nZXMgZnJvbSB2ZXJzaW9uIDEuNiB0byB2ZXJzaW9uIDEuNwotICoKLSAqIFJlbW92ZWQgQ1NJUiBjb21tYW5kIGNvZGUuCi0gKgotICogQmV0dGVyIHJhY2UgY29uZGl0aW9uIGF2b2lkYW5jZSAoeGNoZ2IgZnVuY3Rpb24gYWRkZWQpLgotICoKLSAqIFNldCBJQ00gYW5kIE9HTSBzdGF0dXMgdG8gemVybyBhdCBwcm9iZSAoMjRGKQotICoKLSAqIHJlc2V0IHNlbmRzIHNvZnQgcmVzZXQgdG8gVWx0cmFTdG9yIGFkYXB0ZXIKLSAqCi0gKiByZXNldCBhZGFwdGVyIGlmIGFkYXB0ZXIgaW50ZXJydXB0cyB3aXRoIGFuIGludmFsaWQgTVNDUCBhZGRyZXNzCi0gKgotICogaGFuZGxlIGFib3J0ZWQgY29tbWFuZCBpbnRlcnJ1cHQgKDI0RikKLSAqCi0gKi8KLQotLyogQ2hhbmdlcyBmcm9tIHZlcnNpb24gMS41IHRvIHZlcnNpb24gMS42OgotICoKLSAqIFJlYWQgTVNDUCBhZGRyZXNzIGZyb20gSUNNIF9iZWZvcmVfIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgZmxhZy4KLSAqIFRoaXMgZml4ZXMgYSByYWNlIGNvbmRpdGlvbi4KLSAqLwotCi0vKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjQgdG8gdmVyc2lvbiAxLjU6Ci0gKgotICogQWJvcnQgbm93IGNhbGxzIGRvbmUgd2hlbiBtdWx0aXBsZSBjb21tYW5kcyBhcmUgZW5hYmxlZC4KLSAqCi0gKiBDbGVhciBidXN5IHdoZW4gYWJvcnRlZCBjb21tYW5kIGZpbmlzaGVzLCBub3Qgd2hlbiBhYm9ydCBpcyBjYWxsZWQuCi0gKgotICogTW9yZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgZm9yIGFib3J0cy4KLSAqLwotCi0vKiBDaGFuZ2VzIGZyb20gdmVyc2lvbiAxLjMgdG8gdmVyc2lvbiAxLjQ6Ci0gKgotICogRW5hYmxlIGF1dG9tYXRpYyByZXF1ZXN0IG9mIHNlbnNlIGRhdGEgb24gZXJyb3IgKHJlcXVpcmVzIG5ld2VyIHZlcnNpb24KLSAqIG9mIHNjc2kuYyB0byBiZSB1c2VmdWwpLgotICoKLSAqIEZpeCBQT1JUX09WRVJSSURFIGZvciAxNEYuCi0gKgotICogRml4IGFib3J0IGFuZCByZXNldCB0byB3b3JrIHByb3Blcmx5IChjb25maWcuYWJvcnRlZCB3YXNuJ3QgY2xlYXJlZAotICogYWZ0ZXIgaXQgd2FzIHRlc3RlZCwgc28gYWZ0ZXIgYSBjb21tYW5kIGFib3J0IG5vIGZ1cnRoZXIgY29tbWFuZHMgd291bGQKLSAqIHdvcmspLgotICoKLSAqIEJvb3QgdGltZSB0ZXN0IHRvIGVuYWJsZSBTQ1NJIGJ1cyByZXNldCAoZGVmYXVsdHMgdG8gbm90IGFsbG93aW5nIHJlc2V0KS4KLSAqCi0gKiBGaXggdGVzdCBmb3IgT0dNIGJ1c3kgLS0gdGhlIGJ1c3kgYml0IGlzIGluIGRpZmZlcmVudCBwbGFjZXMgb24gdGhlIDI0Ri4KLSAqCi0gKiBSZWxlYXNlIElDTSBzbG90IGJ5IGNsZWFyaW5nIGZpcnN0IGJ5dGUgb24gMjRGLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLQotI2RlZmluZSBVTFRSQVNUT1JfUFJJVkFURQkvKiBHZXQgdGhlIHByaXZhdGUgc3R1ZmYgZnJvbSB1bHRyYXN0b3IuaCAqLwotI2luY2x1ZGUgInNjc2kuaCIKLSNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgotI2luY2x1ZGUgInVsdHJhc3Rvci5oIgotCi0jZGVmaW5lIEZBTFNFIDAKLSNkZWZpbmUgVFJVRSAxCi0KLSNpZm5kZWYgVUxUUkFTVE9SX0RFQlVHCi0jZGVmaW5lIFVMVFJBU1RPUl9ERUJVRyAoVURfQUJPUlR8VURfQ1NJUnxVRF9SRVNFVCkKLSNlbmRpZgotCi0jZGVmaW5lIFZFUlNJT04gIjEuMTIiCi0KLSNkZWZpbmUgUEFDS0VECQlfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQotI2RlZmluZSBBTElHTkVEKHgpCV9fYXR0cmlidXRlX18oKGFsaWduZWQoeCkpKQotCi0KLS8qIFRoZSAxNEYgdXNlcyBhbiBhcnJheSBvZiA0LWJ5dGUgaW50cyBmb3IgaXRzIHNjYXR0ZXIvZ2F0aGVyIGxpc3QuCi0gICBUaGUgZGF0YSBjYW4gYmUgdW5hbGlnbmVkLCBidXQgbmVlZCBub3QgYmUuICBJdCdzIGVhc2llciB0byBnaXZlCi0gICB0aGUgbGlzdCBub3JtYWwgYWxpZ25tZW50IHNpbmNlIGl0IGRvZXNuJ3QgbmVlZCB0byBmaXQgaW50byBhCi0gICBwYWNrZWQgc3RydWN0dXJlLiAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1MzIgYWRkcmVzczsKLSAgdTMyIG51bV9ieXRlczsKLX0gdWx0cmFzdG9yX3NnX2xpc3Q7Ci0KLQotLyogTWFpbEJveCBTQ1NJIENvbW1hbmQgUGFja2V0LiAgQmFzaWMgY29tbWFuZCBzdHJ1Y3R1cmUgZm9yIGNvbW11bmljYXRpbmcKLSAgIHdpdGggY29udHJvbGxlci4gKi8KLXN0cnVjdCBtc2NwIHsKLSAgdW5zaWduZWQgY2hhciBvcGNvZGU6IDM7CQkvKiB0eXBlIG9mIGNvbW1hbmQgKi8KLSAgdW5zaWduZWQgY2hhciB4ZGlyOiAyOwkJLyogZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gKi8KLSAgdW5zaWduZWQgY2hhciBkY246IDE7CQkvKiBkaXNhYmxlIGRpc2Nvbm5lY3QgKi8KLSAgdW5zaWduZWQgY2hhciBjYTogMTsJCS8qIHVzZSBjYWNoZSAoaWYgYXZhaWxhYmxlKSAqLwotICB1bnNpZ25lZCBjaGFyIHNnOiAxOwkJLyogc2NhdHRlci9nYXRoZXIgb3BlcmF0aW9uICovCi0gIHVuc2lnbmVkIGNoYXIgdGFyZ2V0X2lkOiAzOwkJLyogdGFyZ2V0IFNDU0kgaWQgKi8KLSAgdW5zaWduZWQgY2hhciBjaF9ubzogMjsJCS8qIFNDU0kgY2hhbm5lbCAoYWx3YXlzIDAgZm9yIDE0ZikgKi8KLSAgdW5zaWduZWQgY2hhciBsdW46IDM7CQkvKiBsb2dpY2FsIHVuaXQgbnVtYmVyICovCi0gIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9kYXRhIFBBQ0tFRDsJLyogdHJhbnNmZXIgZGF0YSBwb2ludGVyICovCi0gIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9kYXRhX2xlbmd0aCBQQUNLRUQ7CS8qIGxlbmd0aCBpbiBieXRlcyAqLwotICB1bnNpZ25lZCBpbnQgY29tbWFuZF9saW5rIFBBQ0tFRDsJLyogZm9yIGxpbmtpbmcgY29tbWFuZCBjaGFpbnMgKi8KLSAgdW5zaWduZWQgY2hhciBzY3NpX2NvbW1hbmRfbGlua19pZDsJLyogaWRlbnRpZmllcyBjb21tYW5kIGluIGNoYWluICovCi0gIHVuc2lnbmVkIGNoYXIgbnVtYmVyX29mX3NnX2xpc3Q7CS8qIChpZiBzZyBpcyBzZXQpIDggYnl0ZXMgcGVyIGxpc3QgKi8KLSAgdW5zaWduZWQgY2hhciBsZW5ndGhfb2Zfc2Vuc2VfYnl0ZTsKLSAgdW5zaWduZWQgY2hhciBsZW5ndGhfb2Zfc2NzaV9jZGJzOwkvKiA2LCAxMCwgb3IgMTIgKi8KLSAgdW5zaWduZWQgY2hhciBzY3NpX2NkYnNbMTJdOwkvKiBTQ1NJIGNvbW1hbmRzICovCi0gIHVuc2lnbmVkIGNoYXIgYWRhcHRlcl9zdGF0dXM7CS8qIG5vbi16ZXJvIGluZGljYXRlcyBIQSBlcnJvciAqLwotICB1bnNpZ25lZCBjaGFyIHRhcmdldF9zdGF0dXM7CS8qIG5vbi16ZXJvIGluZGljYXRlcyB0YXJnZXQgZXJyb3IgKi8KLSAgdTMyIHNlbnNlX2RhdGEgUEFDS0VEOwotICAvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgZm9yIHNvZnR3YXJlIG9ubHkuICBUaGV5IGFyZSBpbmNsdWRlZCBpbgotICAgICB0aGUgTVNDUCBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGV5IGFyZSBhc3NvY2lhdGVkIHdpdGggU0NTSSByZXF1ZXN0cy4gICovCi0gIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKTsKLSAgc3RydWN0IHNjc2lfY21uZCAqU0NpbnQ7Ci0gIHVsdHJhc3Rvcl9zZ19saXN0IHNnbGlzdFtVTFRSQVNUT1JfMjRGX01BWF9TR107IC8qIHVzZSBsYXJnZXIgc2l6ZSBmb3IgMjRGICovCi19OwotCi0KLS8qIFBvcnQgYWRkcmVzc2VzIChyZWxhdGl2ZSB0byB0aGUgYmFzZSBhZGRyZXNzKSAqLwotI2RlZmluZSBVMTRGX1BST0RVQ1RfSUQocG9ydCkgKChwb3J0KSArIDB4NCkKLSNkZWZpbmUgQ09ORklHKHBvcnQpICgocG9ydCkgKyAweDYpCi0KLS8qIFBvcnQgYWRkcmVzc2VzIHJlbGF0aXZlIHRvIHRoZSBkb29yYmVsbCBiYXNlIGFkZHJlc3MuICAqLwotI2RlZmluZSBMQ0xfRE9PUkJFTExfTUFTSyhwb3J0KSAoKHBvcnQpICsgMHgwKQotI2RlZmluZSBMQ0xfRE9PUkJFTExfSU5UUihwb3J0KSAoKHBvcnQpICsgMHgxKQotI2RlZmluZSBTWVNfRE9PUkJFTExfTUFTSyhwb3J0KSAoKHBvcnQpICsgMHgyKQotI2RlZmluZSBTWVNfRE9PUkJFTExfSU5UUihwb3J0KSAoKHBvcnQpICsgMHgzKQotCi0KLS8qIFVzZWQgdG8gc3RvcmUgY29uZmlndXJhdGlvbiBpbmZvIHJlYWQgZnJvbSBjb25maWcgaS9vIHJlZ2lzdGVycy4gIE1vc3Qgb2YKLSAgIHRoaXMgaXMgbm90IHVzZWQgeWV0LCBidXQgbWlnaHQgYXMgd2VsbCBzYXZlIGl0LgotICAgCi0gICBUaGlzIHN0cnVjdHVyZSBhbHNvIGhvbGRzIHBvcnQgYWRkcmVzc2VzIHRoYXQgYXJlIG5vdCBhdCB0aGUgc2FtZSBvZmZzZXQKLSAgIG9uIHRoZSAxNEYgYW5kIDI0Ri4KLSAgIAotICAgVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgYWxsIGRhdGEgdGhhdCBtdXN0IGJlIGR1cGxpY2F0ZWQgdG8gc3VwcG9ydCBtdWx0aXBsZQotICAgYWRhcHRlcnMuICAqLwotCi1zdGF0aWMgc3RydWN0IHVsdHJhc3Rvcl9jb25maWcKLXsKLSAgdW5zaWduZWQgc2hvcnQgcG9ydF9hZGRyZXNzOwkJLyogYmFzZSBhZGRyZXNzIG9mIGNhcmQgKi8KLSAgdW5zaWduZWQgc2hvcnQgZG9vcmJlbGxfYWRkcmVzczsJLyogYmFzZSBhZGRyZXNzIG9mIGRvb3JiZWxsIENTUnMgKi8KLSAgdW5zaWduZWQgc2hvcnQgb2dtX2FkZHJlc3M7CQkvKiBiYXNlIGFkZHJlc3Mgb2YgT0dNICovCi0gIHVuc2lnbmVkIHNob3J0IGljbV9hZGRyZXNzOwkJLyogYmFzZSBhZGRyZXNzIG9mIElDTSAqLwotICBjb25zdCB2b2lkICpiaW9zX3NlZ21lbnQ7Ci0gIHVuc2lnbmVkIGNoYXIgaW50ZXJydXB0OiA0OwotICB1bnNpZ25lZCBjaGFyIGRtYV9jaGFubmVsOiAzOwotICB1bnNpZ25lZCBjaGFyIGJpb3NfZHJpdmVfbnVtYmVyOiAxOwotICB1bnNpZ25lZCBjaGFyIGhlYWRzOwotICB1bnNpZ25lZCBjaGFyIHNlY3RvcnM7Ci0gIHVuc2lnbmVkIGNoYXIgaGFfc2NzaV9pZDogMzsKLSAgdW5zaWduZWQgY2hhciBzdWJ2ZXJzaW9uOiA0OwotICB1bnNpZ25lZCBjaGFyIHJldmlzaW9uOwotICAvKiBUaGUgc2xvdCBudW1iZXIgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCB0aGUgMjRGIChzbG90ICE9IDApIGZyb20KLSAgICAgdGhlIDE0RiBhbmQgMzRGIChzbG90ID09IDApLiAqLwotICB1bnNpZ25lZCBjaGFyIHNsb3Q7Ci0KLSNpZmRlZiBQUklOVF9VMjRGX1ZFUlNJT04KLSAgdm9sYXRpbGUgaW50IGNzaXJfZG9uZTsKLSNlbmRpZgotCi0gIC8qIEEgcG9vbCBvZiBNU0NQIHN0cnVjdHVyZXMgZm9yIHRoaXMgYWRhcHRlciwgYW5kIGEgYml0bWFzayBvZgotICAgICBidXN5IHN0cnVjdHVyZXMuICAoSWYgVUxUUkFTVE9SXzE0Rl9NQVhfQ01EUyA9PSAxLCBhIDEgYnl0ZQotICAgICBidXN5IGZsYWcgaXMgdXNlZCBpbnN0ZWFkLikgICovCi0KLSNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPT0gMQotICB1bnNpZ25lZCBjaGFyIG1zY3BfYnVzeTsKLSNlbHNlCi0gIHVuc2lnbmVkIGxvbmcgbXNjcF9mcmVlOwotI2VuZGlmCi0gIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgYWJvcnRlZFtVTFRSQVNUT1JfTUFYX0NNRFNdOwotICBzdHJ1Y3QgbXNjcCBtc2NwW1VMVFJBU1RPUl9NQVhfQ01EU107Ci19IGNvbmZpZyA9IHswfTsKLQotLyogU2V0IHRoaXMgdG8gMSB0byByZXNldCB0aGUgU0NTSSBidXMgb24gZXJyb3IuICAqLwotc3RhdGljIGludCB1bHRyYXN0b3JfYnVzX3Jlc2V0OwotCi0KLS8qIEFsbG93ZWQgQklPUyBiYXNlIGFkZHJlc3NlcyAoTlVMTCBpbmRpY2F0ZXMgcmVzZXJ2ZWQpICovCi1zdGF0aWMgY29uc3Qgdm9pZCAqY29uc3QgYmlvc19zZWdtZW50X3RhYmxlWzhdID0gewotICBOVUxMLAkgICAgICh2b2lkICopMHhDNDAwMCwgKHZvaWQgKikweEM4MDAwLCAodm9pZCAqKTB4Q0MwMDAsCi0gICh2b2lkICopMHhEMDAwMCwgKHZvaWQgKikweEQ0MDAwLCAodm9pZCAqKTB4RDgwMDAsICh2b2lkICopMHhEQzAwMCwKLX07Ci0KLS8qIEFsbG93ZWQgSVJRcyBmb3IgMTRmICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbnRlcnJ1cHRfdGFibGVfMTRmWzRdID0geyAxNSwgMTQsIDExLCAxMCB9OwotCi0vKiBBbGxvd2VkIERNQSBjaGFubmVscyBmb3IgMTRmICgwIGluZGljYXRlcyByZXNlcnZlZCkgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRtYV9jaGFubmVsX3RhYmxlXzE0Zls0XSA9IHsgNSwgNiwgNywgMCB9OwotCi0vKiBIZWFkL3NlY3RvciBtYXBwaW5ncyBhbGxvd2VkIGJ5IDE0ZiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGNoYXIgaGVhZHM7Ci0gIHVuc2lnbmVkIGNoYXIgc2VjdG9yczsKLX0gbWFwcGluZ190YWJsZVs0XSA9IHsgeyAxNiwgNjMgfSwgeyA2NCwgMzIgfSwgeyA2NCwgNjMgfSwgeyA2NCwgMzIgfSB9OwotCi0jaWZuZGVmIFBPUlRfT1ZFUlJJREUKLS8qID8/PyBBIHByb2JlIG9mIGFkZHJlc3MgMHgzMTAgc2NyZXdzIHVwIE5FMjAwMCBjYXJkcyAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHVsdHJhc3Rvcl9wb3J0c18xNGZbXSA9IHsKLSAgMHgzMzAsIDB4MzQwLCAvKjB4MzEwLCovIDB4MjMwLCAweDI0MCwgMHgyMTAsIDB4MTMwLCAweDE0MCwKLX07Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgdWx0cmFzdG9yX2ludGVycnVwdCh2b2lkICopOwotc3RhdGljIGlycXJldHVybl90IGRvX3VsdHJhc3Rvcl9pbnRlcnJ1cHQoaW50LCB2b2lkICopOwotc3RhdGljIGlubGluZSB2b2lkIGJ1aWxkX3NnX2xpc3Qoc3RydWN0IG1zY3AgKiwgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpOwotCi0KLS8qIEFsd2F5cyBjYWxsZWQgd2l0aCBob3N0IGxvY2sgaGVsZCAqLwotCi1zdGF0aWMgaW5saW5lIGludCBmaW5kX2FuZF9jbGVhcl9iaXRfMTYodW5zaWduZWQgbG9uZyAqZmllbGQpCi17Ci0gIGludCBydjsKLQotICBpZiAoKmZpZWxkID09IDApCi0gICAgcGFuaWMoIk5vIGZyZWUgbXNjcCIpOwotCi0gIGFzbSB2b2xhdGlsZSAoCi0JInhvcmwgJTAsJTBcblx0IgotCSIwOiBic2Z3ICUxLCV3MFxuXHQiCi0JImJ0ciAlMCwlMVxuXHQiCi0JImpuYyAwYiIKLQk6ICI9JnIiIChydiksICIrbSIgKCpmaWVsZCkgOik7Ci0KLSAgcmV0dXJuIHJ2OwotfQotCi0vKiBUaGlzIGhhcyBiZWVuIHJlLWltcGxlbWVudGVkIHdpdGggdGhlIGhlbHAgb2YgUmljaGFyZCBFYXJuc2hhdywKLSAgIDxyd2VAcGVnYXN1cy5lc3ByaXQuZWMub3JnPiBhbmQgd29ya3Mgd2l0aCBnY2MtMi41LjggYW5kIGdjYy0yLjYuMC4KLSAgIFRoZSBpbnN0YWJpbGl0eSBub3RlZCBieSBqZmMgYmVsb3cgYXBwZWFycyB0byBiZSBhIGJ1ZyBpbgotICAgZ2NjLTIuNS54IHdoZW4gY29tcGlsaW5nIHcvbyBvcHRpbWl6YXRpb24uICAtLUNhbGViCi0KLSAgIFRoaXMgYXNtIGlzIGZyYWdpbGU6IGl0IGRvZXNuJ3Qgd29yayB3aXRob3V0IHRoZSBjYXN0cyBhbmQgaXQgbWF5Ci0gICBub3Qgd29yayB3aXRob3V0IG9wdGltaXphdGlvbi4gIE1heWJlIEkgc2hvdWxkIGFkZCBhIHN3YXAgYnVpbHRpbgotICAgdG8gZ2NjLiAgLS1qZmMgICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgeGNoZ2IodW5zaWduZWQgY2hhciByZWcsCi0JCQkJICB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICptZW0pCi17Ci0gIF9fYXNtX18gKCJ4Y2hnYiAlMCwlMSIgOiAiPXEiIChyZWcpLCAiPW0iICgqbWVtKSA6ICIwIiAocmVnKSk7Ci0gIHJldHVybiByZWc7Ci19Ci0KLSNpZiBVTFRSQVNUT1JfREVCVUcgJiAoVURfQ09NTUFORCB8IFVEX0FCT1JUKQotCi0vKiBBbHdheXMgY2FsbGVkIHdpdGggdGhlIGhvc3QgbG9jayBoZWxkICovCi1zdGF0aWMgdm9pZCBsb2dfdWx0cmFzdG9yX2Fib3J0KHN0cnVjdCB1bHRyYXN0b3JfY29uZmlnICpjb25maWcsCi0JCQkJaW50IGNvbW1hbmQpCi17Ci0gIHN0YXRpYyBjaGFyIGZtdFs4MF0gPSAiYWJvcnQgJWQgKCV4KTsgTVNDUCBmcmVlIHBvb2w6ICV4OyI7Ci0gIGludCBpOwotCi0gIGZvciAoaSA9IDA7IGkgPCBVTFRSQVNUT1JfTUFYX0NNRFM7IGkrKykKLSAgICB7Ci0gICAgICBmbXRbMjAgKyBpKjJdID0gJyAnOwotICAgICAgaWYgKCEgKGNvbmZpZy0+bXNjcF9mcmVlICYgKDEgPDwgaSkpKQotCWZtdFsyMSArIGkqMl0gPSAnMCcgKyBjb25maWctPm1zY3BbaV0udGFyZ2V0X2lkOwotICAgICAgZWxzZQotCWZtdFsyMSArIGkqMl0gPSAnLSc7Ci0gICAgfQotICBmbXRbMjAgKyBVTFRSQVNUT1JfTUFYX0NNRFMgKiAyXSA9ICdcbic7Ci0gIGZtdFsyMSArIFVMVFJBU1RPUl9NQVhfQ01EUyAqIDJdID0gMDsKLSAgcHJpbnRrKGZtdCwgY29tbWFuZCwgJmNvbmZpZy0+bXNjcFtjb21tYW5kXSwgY29uZmlnLT5tc2NwX2ZyZWUpOwotCi19Ci0jZW5kaWYKLQotc3RhdGljIGludCB1bHRyYXN0b3JfMTRmX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKLXsKLSAgICBzaXplX3QgaTsKLSAgICB1bnNpZ25lZCBjaGFyIGluX2J5dGUsIHZlcnNpb25fYnl0ZSA9IDA7Ci0gICAgc3RydWN0IGNvbmZpZ18xIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgYmlvc19zZWdtZW50OiAzOwotICAgICAgdW5zaWduZWQgY2hhciByZW1vdmFibGVfZGlza3NfYXNfZml4ZWQ6IDE7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGludGVycnVwdDogMjsKLSAgICB1bnNpZ25lZCBjaGFyIGRtYV9jaGFubmVsOiAyOwotICAgIH0gY29uZmlnXzE7Ci0gICAgc3RydWN0IGNvbmZpZ18yIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgaGFfc2NzaV9pZDogMzsKLSAgICAgIHVuc2lnbmVkIGNoYXIgbWFwcGluZ19tb2RlOiAyOwotICAgICAgdW5zaWduZWQgY2hhciBiaW9zX2RyaXZlX251bWJlcjogMTsKLSAgICAgIHVuc2lnbmVkIGNoYXIgdGZyX3BvcnQ6IDI7Ci0gICAgfSBjb25maWdfMjsKLQotI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCi0gICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiBjYWxsZWRcbiIpOwotI2VuZGlmCi0KLSAgICAvKiBJZiBhIDI0RiBoYXMgYWxyZWFkeSBiZWVuIGNvbmZpZ3VyZWQsIGRvbid0IGxvb2sgZm9yIGEgMTRGLiAgKi8KLSAgICBpZiAoY29uZmlnLmJpb3Nfc2VnbWVudCkKLQlyZXR1cm4gRkFMU0U7Ci0KLSNpZmRlZiBQT1JUX09WRVJSSURFCi0gICAgaWYoIXJlcXVlc3RfcmVnaW9uKFBPUlRfT1ZFUlJJREUsIDB4YywgInVsdHJhc3RvciIpKSB7Ci0gICAgICBwcmludGsoIlVsdHJhc3RvciBJL08gc3BhY2UgYWxyZWFkeSBpbiB1c2VcbiIpOwotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH07Ci0gICAgY29uZmlnLnBvcnRfYWRkcmVzcyA9IFBPUlRfT1ZFUlJJREU7Ci0jZWxzZQotICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHVsdHJhc3Rvcl9wb3J0c18xNGYpOyBpKyspIHsKLSAgICAgIGlmKCFyZXF1ZXN0X3JlZ2lvbih1bHRyYXN0b3JfcG9ydHNfMTRmW2ldLCAweDBjLCAidWx0cmFzdG9yIikpIGNvbnRpbnVlOwotICAgICAgY29uZmlnLnBvcnRfYWRkcmVzcyA9IHVsdHJhc3Rvcl9wb3J0c18xNGZbaV07Ci0jZW5kaWYKLQotI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCi0JcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiB0ZXN0aW5nIHBvcnQgYWRkcmVzcyAlMDNYXG4iLCBjb25maWcucG9ydF9hZGRyZXNzKTsKLSNlbmRpZgotCi0JaW5fYnl0ZSA9IGluYihVMTRGX1BST0RVQ1RfSUQoY29uZmlnLnBvcnRfYWRkcmVzcykpOwotCWlmIChpbl9ieXRlICE9IFVTMTRGX1BST0RVQ1RfSURfMCkgewotI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCi0jIGlmZGVmIFBPUlRfT1ZFUlJJREUKLQkgICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiB3cm9uZyBwcm9kdWN0IElEIDAgLSAlMDJYXG4iLCBpbl9ieXRlKTsKLSMgZWxzZQotCSAgICBwcmludGsoIlVTMTRGOiBkZXRlY3Q6IG5vIGFkYXB0ZXIgYXQgcG9ydCAlMDNYXG4iLCBjb25maWcucG9ydF9hZGRyZXNzKTsKLSMgZW5kaWYKLSNlbmRpZgotI2lmZGVmIFBPUlRfT1ZFUlJJREUKLQkgICAgZ290byBvdXRfcmVsZWFzZV9wb3J0OwotI2Vsc2UKLQkgICAgcmVsZWFzZV9yZWdpb24oY29uZmlnLnBvcnRfYWRkcmVzcywgMHgwYyk7Ci0JICAgIGNvbnRpbnVlOwotI2VuZGlmCi0JfQotCWluX2J5dGUgPSBpbmIoVTE0Rl9QUk9EVUNUX0lEKGNvbmZpZy5wb3J0X2FkZHJlc3MpICsgMSk7Ci0JLyogT25seSB1cHBlciBuaWJibGUgaXMgc2lnbmlmaWNhbnQgZm9yIFByb2R1Y3QgSUQgMSAqLwotCWlmICgoaW5fYnl0ZSAmIDB4RjApICE9IFVTMTRGX1BST0RVQ1RfSURfMSkgewotI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCi0jIGlmZGVmIFBPUlRfT1ZFUlJJREUKLQkgICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiB3cm9uZyBwcm9kdWN0IElEIDEgLSAlMDJYXG4iLCBpbl9ieXRlKTsKLSMgZWxzZQotCSAgICBwcmludGsoIlVTMTRGOiBkZXRlY3Q6IG5vIGFkYXB0ZXIgYXQgcG9ydCAlMDNYXG4iLCBjb25maWcucG9ydF9hZGRyZXNzKTsKLSMgZW5kaWYKLSNlbmRpZgotI2lmZGVmIFBPUlRfT1ZFUlJJREUKLQkgICAgZ290byBvdXRfcmVsZWFzZV9wb3J0OwotI2Vsc2UKLQkgICAgcmVsZWFzZV9yZWdpb24oY29uZmlnLnBvcnRfYWRkcmVzcywgMHgwYyk7Ci0JICAgIGNvbnRpbnVlOwotI2VuZGlmCi0JfQotCXZlcnNpb25fYnl0ZSA9IGluX2J5dGU7Ci0jaWZuZGVmIFBPUlRfT1ZFUlJJREUKLQlicmVhazsKLSAgICB9Ci0gICAgaWYgKGkgPT0gQVJSQVlfU0laRSh1bHRyYXN0b3JfcG9ydHNfMTRmKSkgewotIyBpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfREVURUNUKQotCXByaW50aygiVVMxNEY6IGRldGVjdDogbm8gcG9ydCBhZGRyZXNzIGZvdW5kIVxuIik7Ci0jIGVuZGlmCi0JLyogYWxsIHBvcnRzIHByb2JlZCBhbHJlYWR5IHJlbGVhc2VkIC0gd2UgY2FuIGp1c3QgZ28gc3RyYWlnaHQgb3V0ICovCi0JcmV0dXJuIEZBTFNFOwotICAgIH0KLSNlbmRpZgotCi0jaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKLSAgICBwcmludGsoIlVTMTRGOiBkZXRlY3Q6IGFkYXB0ZXIgZm91bmQgYXQgcG9ydCBhZGRyZXNzICUwM1hcbiIsCi0JICAgY29uZmlnLnBvcnRfYWRkcmVzcyk7Ci0jZW5kaWYKLQotICAgIC8qIFNldCBsb2NhbCBkb29yYmVsbCBtYXNrIHRvIGRpc2FsbG93IGJ1cyByZXNldCB1bmxlc3MKLSAgICAgICB1bHRyYXN0b3JfYnVzX3Jlc2V0IGlzIHRydWUuICAqLwotICAgIG91dGIodWx0cmFzdG9yX2J1c19yZXNldCA/IDB4YzIgOiAweDgyLCBMQ0xfRE9PUkJFTExfTUFTSyhjb25maWcucG9ydF9hZGRyZXNzKSk7Ci0KLSAgICAvKiBBbGwgYWJvdmUgdGVzdHMgcGFzc2VkLCBtdXN0IGJlIHRoZSByaWdodCB0aGluZy4gIEdldCBzb21lIHVzZWZ1bAotICAgICAgIGluZm8uICovCi0KLSAgICAvKiBSZWdpc3RlciB0aGUgSS9PIHNwYWNlIHRoYXQgd2UgdXNlICovCi0KLSAgICAqKGNoYXIgKikmY29uZmlnXzEgPSBpbmIoQ09ORklHKGNvbmZpZy5wb3J0X2FkZHJlc3MgKyAwKSk7Ci0gICAgKihjaGFyICopJmNvbmZpZ18yID0gaW5iKENPTkZJRyhjb25maWcucG9ydF9hZGRyZXNzICsgMSkpOwotICAgIGNvbmZpZy5iaW9zX3NlZ21lbnQgPSBiaW9zX3NlZ21lbnRfdGFibGVbY29uZmlnXzEuYmlvc19zZWdtZW50XTsKLSAgICBjb25maWcuZG9vcmJlbGxfYWRkcmVzcyA9IGNvbmZpZy5wb3J0X2FkZHJlc3M7Ci0gICAgY29uZmlnLm9nbV9hZGRyZXNzID0gY29uZmlnLnBvcnRfYWRkcmVzcyArIDB4ODsKLSAgICBjb25maWcuaWNtX2FkZHJlc3MgPSBjb25maWcucG9ydF9hZGRyZXNzICsgMHhDOwotICAgIGNvbmZpZy5pbnRlcnJ1cHQgPSBpbnRlcnJ1cHRfdGFibGVfMTRmW2NvbmZpZ18xLmludGVycnVwdF07Ci0gICAgY29uZmlnLmhhX3Njc2lfaWQgPSBjb25maWdfMi5oYV9zY3NpX2lkOwotICAgIGNvbmZpZy5oZWFkcyA9IG1hcHBpbmdfdGFibGVbY29uZmlnXzIubWFwcGluZ19tb2RlXS5oZWFkczsKLSAgICBjb25maWcuc2VjdG9ycyA9IG1hcHBpbmdfdGFibGVbY29uZmlnXzIubWFwcGluZ19tb2RlXS5zZWN0b3JzOwotICAgIGNvbmZpZy5iaW9zX2RyaXZlX251bWJlciA9IGNvbmZpZ18yLmJpb3NfZHJpdmVfbnVtYmVyOwotICAgIGNvbmZpZy5zdWJ2ZXJzaW9uID0gKHZlcnNpb25fYnl0ZSAmIDB4MEYpOwotICAgIGlmIChjb25maWcuc3VidmVyc2lvbiA9PSBVMzRGKQotCWNvbmZpZy5kbWFfY2hhbm5lbCA9IDA7Ci0gICAgZWxzZQotCWNvbmZpZy5kbWFfY2hhbm5lbCA9IGRtYV9jaGFubmVsX3RhYmxlXzE0Zltjb25maWdfMS5kbWFfY2hhbm5lbF07Ci0KLSAgICBpZiAoIWNvbmZpZy5iaW9zX3NlZ21lbnQpIHsKLSNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfREVURUNUKQotCXByaW50aygiVVMxNEY6IGRldGVjdDogbm90IGRldGVjdGVkLlxuIik7Ci0jZW5kaWYKLQlnb3RvIG91dF9yZWxlYXNlX3BvcnQ7Ci0gICAgfQotCi0gICAgLyogRmluYWwgY29uc2lzdGVuY3kgY2hlY2ssIHZlcmlmeSBwcmV2aW91cyBpbmZvLiAqLwotICAgIGlmIChjb25maWcuc3VidmVyc2lvbiAhPSBVMzRGKQotCWlmICghY29uZmlnLmRtYV9jaGFubmVsIHx8ICEoY29uZmlnXzIudGZyX3BvcnQgJiAweDIpKSB7Ci0jaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKLQkgICAgcHJpbnRrKCJVUzE0RjogZGV0ZWN0OiBjb25zaXN0ZW5jeSBjaGVjayBmYWlsZWRcbiIpOwotI2VuZGlmCi0gICAgICAgICAgIGdvdG8gb3V0X3JlbGVhc2VfcG9ydDsKLQl9Ci0KLSAgICAvKiBJZiB3ZSB3ZXJlIFRSVUxZIHBhcmFub2lkLCB3ZSBjb3VsZCBpc3N1ZSBhIGhvc3QgYWRhcHRlciBpbnF1aXJ5Ci0gICAgICAgY29tbWFuZCBoZXJlIGFuZCB2ZXJpZnkgdGhlIGRhdGEgcmV0dXJuZWQuICBCdXQgZnJhbmtseSwgSSdtCi0gICAgICAgZXhoYXVzdGVkISAqLwotCi0gICAgLyogRmluYWxseSEgIE5vdyBJJ20gc2F0aXNmaWVkLi4uICovCi0jaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKLSAgICBwcmludGsoIlVTMTRGOiBkZXRlY3Q6IGRldGVjdCBzdWNjZWVkZWRcbiIKLQkgICAiICBQb3J0IGFkZHJlc3M6ICUwM1hcbiIKLQkgICAiICBCSU9TIHNlZ21lbnQ6ICUwNVhcbiIKLQkgICAiICBJbnRlcnJ1cHQ6ICV1XG4iCi0JICAgIiAgRE1BIGNoYW5uZWw6ICV1XG4iCi0JICAgIiAgSC9BIFNDU0kgSUQ6ICV1XG4iCi0JICAgIiAgU3VidmVyc2lvbjogJXVcbiIsCi0JICAgY29uZmlnLnBvcnRfYWRkcmVzcywgY29uZmlnLmJpb3Nfc2VnbWVudCwgY29uZmlnLmludGVycnVwdCwKLQkgICBjb25maWcuZG1hX2NoYW5uZWwsIGNvbmZpZy5oYV9zY3NpX2lkLCBjb25maWcuc3VidmVyc2lvbik7Ci0jZW5kaWYKLSAgICB0cG50LT50aGlzX2lkID0gY29uZmlnLmhhX3Njc2lfaWQ7Ci0gICAgdHBudC0+dW5jaGVja2VkX2lzYV9kbWEgPSAoY29uZmlnLnN1YnZlcnNpb24gIT0gVTM0Rik7Ci0KLSNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPiAxCi0gICAgY29uZmlnLm1zY3BfZnJlZSA9IH4wOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIEJycnIsICZjb25maWcubXNjcFswXS5TQ2ludC0+aG9zdCkgaXQgaXMgc29tZXRoaW5nIG1hZ2ljYWwuLi4uCi0gICAgICogWFhYIGFuZCBGSVhNRQotICAgICAqLwotICAgIGlmIChyZXF1ZXN0X2lycShjb25maWcuaW50ZXJydXB0LCBkb191bHRyYXN0b3JfaW50ZXJydXB0LCAwLCAiVWx0cmFzdG9yIiwgJmNvbmZpZy5tc2NwWzBdLlNDaW50LT5kZXZpY2UtPmhvc3QpKSB7Ci0JcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgSVJRJXUgZm9yIFVsdHJhU3RvciBjb250cm9sbGVyLlxuIiwKLQkgICAgICAgY29uZmlnLmludGVycnVwdCk7Ci0JZ290byBvdXRfcmVsZWFzZV9wb3J0OwotICAgIH0KLSAgICBpZiAoY29uZmlnLmRtYV9jaGFubmVsICYmIHJlcXVlc3RfZG1hKGNvbmZpZy5kbWFfY2hhbm5lbCwiVWx0cmFzdG9yIikpIHsKLQlwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBETUEgY2hhbm5lbCAldSBmb3IgVWx0cmFTdG9yIGNvbnRyb2xsZXIuXG4iLAotCSAgICAgICBjb25maWcuZG1hX2NoYW5uZWwpOwotCWZyZWVfaXJxKGNvbmZpZy5pbnRlcnJ1cHQsIE5VTEwpOwotCWdvdG8gb3V0X3JlbGVhc2VfcG9ydDsKLSAgICB9Ci0gICAgdHBudC0+c2dfdGFibGVzaXplID0gVUxUUkFTVE9SXzE0Rl9NQVhfU0c7Ci0gICAgcHJpbnRrKCJVbHRyYVN0b3IgZHJpdmVyIHZlcnNpb24iIFZFUlNJT04gIi4gIFVzaW5nICVkIFNHIGxpc3RzLlxuIiwKLQkgICBVTFRSQVNUT1JfMTRGX01BWF9TRyk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLW91dF9yZWxlYXNlX3BvcnQ6Ci0gICAgcmVsZWFzZV9yZWdpb24oY29uZmlnLnBvcnRfYWRkcmVzcywgMHgwYyk7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi1zdGF0aWMgaW50IHVsdHJhc3Rvcl8yNGZfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKiB0cG50KQotewotICBpbnQgaTsKLSAgc3RydWN0IFNjc2lfSG9zdCAqIHNocG50ID0gTlVMTDsKLQotI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCi0gIHByaW50aygiVVMyNEY6IGRldGVjdCIpOwotI2VuZGlmCi0KLSAgLyogcHJvYmUgZWFjaCBFSVNBIHNsb3QgYXQgc2xvdCBhZGRyZXNzIEM4MCAqLwotICBmb3IgKGkgPSAxOyBpIDwgMTU7IGkrKykKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyIGNvbmZpZ18xLCBjb25maWdfMjsKLSAgICAgIHVuc2lnbmVkIHNob3J0IGFkZHIgPSAoaSA8PCAxMikgfCBVTFRSQVNUT1JfMjRGX1BPUlQ7Ci0KLSAgICAgIGlmIChpbmIoYWRkcikgIT0gVVMyNEZfUFJPRFVDVF9JRF8wICYmCi0JICBpbmIoYWRkcisxKSAhPSBVUzI0Rl9QUk9EVUNUX0lEXzEgJiYKLQkgIGluYihhZGRyKzIpICE9IFVTMjRGX1BST0RVQ1RfSURfMikKLQljb250aW51ZTsKLQotICAgICAgY29uZmlnLnJldmlzaW9uID0gaW5iKGFkZHIrMyk7Ci0gICAgICBjb25maWcuc2xvdCA9IGk7Ci0gICAgICBpZiAoISAoaW5iKGFkZHIrNCkgJiAxKSkKLQl7Ci0jaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX0RFVEVDVCkKLQkgIHByaW50aygiVTI0RjogZm91bmQgZGlzYWJsZWQgY2FyZCBpbiBzbG90ICV1XG4iLCBpKTsKLSNlbmRpZgotCSAgY29udGludWU7Ci0JfQotI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCi0gICAgICBwcmludGsoIlUyNEY6IGZvdW5kIGNhcmQgaW4gc2xvdCAldVxuIiwgaSk7Ci0jZW5kaWYKLSAgICAgIGNvbmZpZ18xID0gaW5iKGFkZHIgKyA1KTsKLSAgICAgIGNvbmZpZy5iaW9zX3NlZ21lbnQgPSBiaW9zX3NlZ21lbnRfdGFibGVbY29uZmlnXzEgJiA3XTsKLSAgICAgIHN3aXRjaChjb25maWdfMSA+PiA0KQotCXsKLQljYXNlIDE6Ci0JICBjb25maWcuaW50ZXJydXB0ID0gMTU7Ci0JICBicmVhazsKLQljYXNlIDI6Ci0JICBjb25maWcuaW50ZXJydXB0ID0gMTQ7Ci0JICBicmVhazsKLQljYXNlIDQ6Ci0JICBjb25maWcuaW50ZXJydXB0ID0gMTE7Ci0JICBicmVhazsKLQljYXNlIDg6Ci0JICBjb25maWcuaW50ZXJydXB0ID0gMTA7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgcHJpbnRrKCJVMjRGOiBpbnZhbGlkIElSUVxuIik7Ci0JICByZXR1cm4gRkFMU0U7Ci0JfQotCi0gICAgICAvKiBCSU9TIGFkZHIgc2V0ICovCi0gICAgICAvKiBiYXNlIHBvcnQgc2V0ICovCi0gICAgICBjb25maWcucG9ydF9hZGRyZXNzID0gYWRkcjsKLSAgICAgIGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzID0gYWRkciArIDEyOwotICAgICAgY29uZmlnLm9nbV9hZGRyZXNzID0gYWRkciArIDB4MTc7Ci0gICAgICBjb25maWcuaWNtX2FkZHJlc3MgPSBhZGRyICsgMHgxQzsKLSAgICAgIGNvbmZpZ18yID0gaW5iKGFkZHIgKyA3KTsKLSAgICAgIGNvbmZpZy5oYV9zY3NpX2lkID0gY29uZmlnXzIgJiA3OwotICAgICAgY29uZmlnLmhlYWRzID0gbWFwcGluZ190YWJsZVsoY29uZmlnXzIgPj4gMykgJiAzXS5oZWFkczsKLSAgICAgIGNvbmZpZy5zZWN0b3JzID0gbWFwcGluZ190YWJsZVsoY29uZmlnXzIgPj4gMykgJiAzXS5zZWN0b3JzOwotI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9ERVRFQ1QpCi0gICAgICBwcmludGsoIlVTMjRGOiBkZXRlY3Q6IGRldGVjdCBzdWNjZWVkZWRcbiIKLQkgICAgICIgIFBvcnQgYWRkcmVzczogJTAzWFxuIgotCSAgICAgIiAgQklPUyBzZWdtZW50OiAlMDVYXG4iCi0JICAgICAiICBJbnRlcnJ1cHQ6ICV1XG4iCi0JICAgICAiICBIL0EgU0NTSSBJRDogJXVcbiIsCi0JICAgICBjb25maWcucG9ydF9hZGRyZXNzLCBjb25maWcuYmlvc19zZWdtZW50LAotCSAgICAgY29uZmlnLmludGVycnVwdCwgY29uZmlnLmhhX3Njc2lfaWQpOwotI2VuZGlmCi0gICAgICB0cG50LT50aGlzX2lkID0gY29uZmlnLmhhX3Njc2lfaWQ7Ci0gICAgICB0cG50LT51bmNoZWNrZWRfaXNhX2RtYSA9IDA7Ci0gICAgICB0cG50LT5zZ190YWJsZXNpemUgPSBVTFRSQVNUT1JfMjRGX01BWF9TRzsKLQotICAgICAgc2hwbnQgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIDApOwotICAgICAgaWYgKCFzaHBudCkgewotICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIih1bHRyYXN0b3I6KSBDb3VsZCBub3QgcmVnaXN0ZXIgc2NzaSBkZXZpY2UuIEFib3J0aW5nIHJlZ2lzdHJhdGlvbi5cbiIpOwotICAgICAgICAgICAgIGZyZWVfaXJxKGNvbmZpZy5pbnRlcnJ1cHQsIGRvX3VsdHJhc3Rvcl9pbnRlcnJ1cHQpOwotICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKHJlcXVlc3RfaXJxKGNvbmZpZy5pbnRlcnJ1cHQsIGRvX3VsdHJhc3Rvcl9pbnRlcnJ1cHQsIDAsICJVbHRyYXN0b3IiLCBzaHBudCkpCi0JewotCSAgcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgSVJRJXUgZm9yIFVsdHJhU3RvciBjb250cm9sbGVyLlxuIiwKLQkJIGNvbmZpZy5pbnRlcnJ1cHQpOwotCSAgcmV0dXJuIEZBTFNFOwotCX0KLQotICAgICAgc2hwbnQtPmlycSA9IGNvbmZpZy5pbnRlcnJ1cHQ7Ci0gICAgICBzaHBudC0+ZG1hX2NoYW5uZWwgPSBjb25maWcuZG1hX2NoYW5uZWw7Ci0gICAgICBzaHBudC0+aW9fcG9ydCA9IGNvbmZpZy5wb3J0X2FkZHJlc3M7Ci0KLSNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPiAxCi0gICAgICBjb25maWcubXNjcF9mcmVlID0gfjA7Ci0jZW5kaWYKLSAgICAgIC8qIE1hcmsgSUNNIGFuZCBPR00gZnJlZSAqLwotICAgICAgb3V0YigwLCBhZGRyICsgMHgxNik7Ci0gICAgICBvdXRiKDAsIGFkZHIgKyAweDFCKTsKLQotICAgICAgLyogU2V0IGxvY2FsIGRvb3JiZWxsIG1hc2sgdG8gZGlzYWxsb3cgYnVzIHJlc2V0IHVubGVzcwotCSB1bHRyYXN0b3JfYnVzX3Jlc2V0IGlzIHRydWUuICAqLwotICAgICAgb3V0Yih1bHRyYXN0b3JfYnVzX3Jlc2V0ID8gMHhjMiA6IDB4ODIsIExDTF9ET09SQkVMTF9NQVNLKGFkZHIrMTIpKTsKLSAgICAgIG91dGIoMHgwMiwgU1lTX0RPT1JCRUxMX01BU0soYWRkcisxMikpOwotICAgICAgcHJpbnRrKCJVbHRyYVN0b3IgZHJpdmVyIHZlcnNpb24gIiBWRVJTSU9OICIuICBVc2luZyAlZCBTRyBsaXN0cy5cbiIsCi0JICAgICB0cG50LT5zZ190YWJsZXNpemUpOwotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICByZXR1cm4gRkFMU0U7Ci19Ci0KLXN0YXRpYyBpbnQgdWx0cmFzdG9yX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICogdHBudCkKLXsKLQl0cG50LT5wcm9jX25hbWUgPSAidWx0cmFzdG9yIjsKLQlyZXR1cm4gdWx0cmFzdG9yXzE0Zl9kZXRlY3QodHBudCkgfHwgdWx0cmFzdG9yXzI0Zl9kZXRlY3QodHBudCk7Ci19Ci0KLXN0YXRpYyBpbnQgdWx0cmFzdG9yX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCi17Ci0JaWYgKHNob3N0LT5pcnEpCi0JCWZyZWVfaXJxKHNob3N0LT5pcnEsIE5VTEwpOwotCWlmIChzaG9zdC0+ZG1hX2NoYW5uZWwgIT0gMHhmZikKLQkJZnJlZV9kbWEoc2hvc3QtPmRtYV9jaGFubmVsKTsKLQlpZiAoc2hvc3QtPmlvX3BvcnQgJiYgc2hvc3QtPm5faW9fcG9ydCkKLQkJcmVsZWFzZV9yZWdpb24oc2hvc3QtPmlvX3BvcnQsIHNob3N0LT5uX2lvX3BvcnQpOwotCXNjc2lfdW5yZWdpc3RlcihzaG9zdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp1bHRyYXN0b3JfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICogc2hwbnQpCi17Ci0gICAgc3RhdGljIGNoYXIgYnVmWzY0XTsKLQotICAgIGlmIChjb25maWcuc2xvdCkKLSAgICAgIHNwcmludGYoYnVmLCAiVWx0cmFTdG9yIDI0RiBTQ1NJIEAgU2xvdCAldSBJUlEldSIsCi0JICAgICAgY29uZmlnLnNsb3QsIGNvbmZpZy5pbnRlcnJ1cHQpOwotICAgIGVsc2UgaWYgKGNvbmZpZy5zdWJ2ZXJzaW9uKQotICAgICAgc3ByaW50ZihidWYsICJVbHRyYVN0b3IgMzRGIFNDU0kgQCBQb3J0ICUwM1ggQklPUyAlMDVYIElSUSV1IiwKLQkgICAgICBjb25maWcucG9ydF9hZGRyZXNzLCAoaW50KWNvbmZpZy5iaW9zX3NlZ21lbnQsCi0JICAgICAgY29uZmlnLmludGVycnVwdCk7Ci0gICAgZWxzZQotICAgICAgc3ByaW50ZihidWYsICJVbHRyYVN0b3IgMTRGIFNDU0kgQCBQb3J0ICUwM1ggQklPUyAlMDVYIElSUSV1IERNQSV1IiwKLQkgICAgICBjb25maWcucG9ydF9hZGRyZXNzLCAoaW50KWNvbmZpZy5iaW9zX3NlZ21lbnQsCi0JICAgICAgY29uZmlnLmludGVycnVwdCwgY29uZmlnLmRtYV9jaGFubmVsKTsKLSAgICByZXR1cm4gYnVmOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYnVpbGRfc2dfbGlzdChzdHJ1Y3QgbXNjcCAqbXNjcCwgc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCi17Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKLQlsb25nIHRyYW5zZmVyX2xlbmd0aCA9IDA7Ci0JaW50IGksIG1heDsKLQotCW1heCA9IHNjc2lfc2dfY291bnQoU0NwbnQpOwotCXNjc2lfZm9yX2VhY2hfc2coU0NwbnQsIHNnLCBtYXgsIGkpIHsKLQkJbXNjcC0+c2dsaXN0W2ldLmFkZHJlc3MgPSBpc2FfcGFnZV90b19idXMoc2dfcGFnZShzZykpICsgc2ctPm9mZnNldDsKLQkJbXNjcC0+c2dsaXN0W2ldLm51bV9ieXRlcyA9IHNnLT5sZW5ndGg7Ci0JCXRyYW5zZmVyX2xlbmd0aCArPSBzZy0+bGVuZ3RoOwotCX0KLQltc2NwLT5udW1iZXJfb2Zfc2dfbGlzdCA9IG1heDsKLQltc2NwLT50cmFuc2Zlcl9kYXRhID0gaXNhX3ZpcnRfdG9fYnVzKG1zY3AtPnNnbGlzdCk7Ci0JLyogPz8/IE1heSBub3QgYmUgbmVjZXNzYXJ5LiAgRG9jcyBhcmUgdW5jbGVhciBhcyB0byB3aGV0aGVyIHRyYW5zZmVyCi0JICAgbGVuZ3RoIGZpZWxkIGlzIGlnbm9yZWQgb3Igd2hldGhlciBpdCBzaG91bGQgYmUgc2V0IHRvIHRoZSB0b3RhbAotCSAgIG51bWJlciBvZiBieXRlcyBvZiB0aGUgdHJhbnNmZXIuICAqLwotCW1zY3AtPnRyYW5zZmVyX2RhdGFfbGVuZ3RoID0gdHJhbnNmZXJfbGVuZ3RoOwotfQotCi1zdGF0aWMgaW50IHVsdHJhc3Rvcl9xdWV1ZWNvbW1hbmRfbGNrKHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50LAotCQkJCXZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKLXsKLSAgICBzdHJ1Y3QgbXNjcCAqbXlfbXNjcDsKLSNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPiAxCi0gICAgaW50IG1zY3BfaW5kZXg7Ci0jZW5kaWYKLSAgICB1bnNpZ25lZCBpbnQgc3RhdHVzOwotCi0gICAgLyogTmV4dCB0ZXN0IGlzIGZvciBkZWJ1Z2dpbmc7ICJjYW4ndCBoYXBwZW4iICovCi0gICAgaWYgKChjb25maWcubXNjcF9mcmVlICYgKCgxVSA8PCBVTFRSQVNUT1JfTUFYX0NNRFMpIC0gMSkpID09IDApCi0JcGFuaWMoInVsdHJhc3Rvcl9xdWV1ZWNvbW1hbmQ6IG5vIGZyZWUgTVNDUFxuIik7Ci0gICAgbXNjcF9pbmRleCA9IGZpbmRfYW5kX2NsZWFyX2JpdF8xNigmY29uZmlnLm1zY3BfZnJlZSk7Ci0KLSAgICAvKiBIYXMgdGhlIGNvbW1hbmQgYmVlbiBhYm9ydGVkPyAgKi8KLSAgICBpZiAoeGNoZ2IoMHhmZiwgJmNvbmZpZy5hYm9ydGVkW21zY3BfaW5kZXhdKSAhPSAwKQotICAgICAgewotCXN0YXR1cyA9IERJRF9BQk9SVCA8PCAxNjsKLQlnb3RvIGFib3J0ZWQ7Ci0gICAgICB9Ci0KLSAgICBteV9tc2NwID0gJmNvbmZpZy5tc2NwW21zY3BfaW5kZXhdOwotCi0gICAgKih1bnNpZ25lZCBjaGFyICopbXlfbXNjcCA9IE9QX1NDU0kgfCAoRFREX1NDU0kgPDwgMyk7Ci0KLSAgICAvKiBUYXBlIGRyaXZlcyBkb24ndCB3b3JrIHByb3Blcmx5IGlmIHRoZSBjYWNoZSBpcyB1c2VkLiAgVGhlIFNDU0kKLSAgICAgICBSRUFEIGNvbW1hbmQgZm9yIGEgdGFwZSBkb2Vzbid0IGhhdmUgYSBibG9jayBvZmZzZXQsIGFuZCB0aGUgYWRhcHRlcgotICAgICAgIGluY29ycmVjdGx5IGFzc3VtZXMgdGhhdCBhbGwgcmVhZHMgZnJvbSB0aGUgdGFwZSByZWFkIHRoZSBzYW1lCi0gICAgICAgYmxvY2tzLiAgUmVzdWx0cyB3aWxsIGRlcGVuZCBvbiByZWFkIGJ1ZmZlciBzaXplIGFuZCBvdGhlciBkaXNrCi0gICAgICAgYWN0aXZpdHkuIAotCi0gICAgICAgPz8/ICBXaGljaCBvdGhlciBkZXZpY2UgdHlwZXMgc2hvdWxkIG5ldmVyIHVzZSB0aGUgY2FjaGU/ICAgKi8KLSAgICBteV9tc2NwLT5jYSA9IFNDcG50LT5kZXZpY2UtPnR5cGUgIT0gVFlQRV9UQVBFOwotICAgIG15X21zY3AtPnRhcmdldF9pZCA9IFNDcG50LT5kZXZpY2UtPmlkOwotICAgIG15X21zY3AtPmNoX25vID0gMDsKLSAgICBteV9tc2NwLT5sdW4gPSBTQ3BudC0+ZGV2aWNlLT5sdW47Ci0gICAgaWYgKHNjc2lfc2dfY291bnQoU0NwbnQpKSB7Ci0JLyogU2V0IHNjYXR0ZXIvZ2F0aGVyIGZsYWcgaW4gU0NTSSBjb21tYW5kIHBhY2tldCAqLwotCW15X21zY3AtPnNnID0gVFJVRTsKLQlidWlsZF9zZ19saXN0KG15X21zY3AsIFNDcG50KTsKLSAgICB9IGVsc2UgewotCS8qIFVuc2V0IHNjYXR0ZXIvZ2F0aGVyIGZsYWcgaW4gU0NTSSBjb21tYW5kIHBhY2tldCAqLwotCW15X21zY3AtPnNnID0gRkFMU0U7Ci0JbXlfbXNjcC0+dHJhbnNmZXJfZGF0YSA9IGlzYV92aXJ0X3RvX2J1cyhzY3NpX3NnbGlzdChTQ3BudCkpOwotCW15X21zY3AtPnRyYW5zZmVyX2RhdGFfbGVuZ3RoID0gc2NzaV9idWZmbGVuKFNDcG50KTsKLSAgICB9Ci0gICAgbXlfbXNjcC0+Y29tbWFuZF9saW5rID0gMDsJCS8qPz8/Ki8KLSAgICBteV9tc2NwLT5zY3NpX2NvbW1hbmRfbGlua19pZCA9IDA7CS8qPz8/Ki8KLSAgICBteV9tc2NwLT5sZW5ndGhfb2Zfc2Vuc2VfYnl0ZSA9IFNDU0lfU0VOU0VfQlVGRkVSU0laRTsKLSAgICBteV9tc2NwLT5sZW5ndGhfb2Zfc2NzaV9jZGJzID0gU0NwbnQtPmNtZF9sZW47Ci0gICAgbWVtY3B5KG15X21zY3AtPnNjc2lfY2RicywgU0NwbnQtPmNtbmQsIG15X21zY3AtPmxlbmd0aF9vZl9zY3NpX2NkYnMpOwotICAgIG15X21zY3AtPmFkYXB0ZXJfc3RhdHVzID0gMDsKLSAgICBteV9tc2NwLT50YXJnZXRfc3RhdHVzID0gMDsKLSAgICBteV9tc2NwLT5zZW5zZV9kYXRhID0gaXNhX3ZpcnRfdG9fYnVzKCZTQ3BudC0+c2Vuc2VfYnVmZmVyKTsKLSAgICBteV9tc2NwLT5kb25lID0gZG9uZTsKLSAgICBteV9tc2NwLT5TQ2ludCA9IFNDcG50OwotICAgIFNDcG50LT5ob3N0X3NjcmliYmxlID0gKHVuc2lnbmVkIGNoYXIgKilteV9tc2NwOwotCi0gICAgLyogRmluZCBmcmVlIE9HTSBzbG90LiAgT24gMjRGLCBsb29rIGZvciBPR00gc3RhdHVzIGJ5dGUgPT0gMC4KLSAgICAgICBPbiAxNEYgYW5kIDM0Riwgd2FpdCBmb3IgbG9jYWwgaW50ZXJydXB0IHBlbmRpbmcgZmxhZyB0byBjbGVhci4gCi0gICAgICAgCi0gICAgICAgRklYTUU6IG5vdyB3ZSBhcmUgdXNpbmcgbmV3X2VoIHdlIHNob3VsZCBwdW50IGhlcmUgYW5kIGxldCB0aGUKLSAgICAgICBtaWRsYXllciBzb3J0IGl0IG91dCAqLwotCi1yZXRyeToKLSAgICBpZiAoY29uZmlnLnNsb3QpCi0Jd2hpbGUgKGluYihjb25maWcub2dtX2FkZHJlc3MgLSAxKSAhPSAwICYmIGNvbmZpZy5hYm9ydGVkW21zY3BfaW5kZXhdID09IDB4ZmYpCi0JCWJhcnJpZXIoKTsKLQotICAgIC8qIGVsc2U/Pz8gKi8KLQotICAgIHdoaWxlICgoaW5iKExDTF9ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSkgJiAoY29uZmlnLnNsb3QgPyAyIDogMSkpICAmJiBjb25maWcuYWJvcnRlZFttc2NwX2luZGV4XSA9PSAweGZmKQotICAgIAliYXJyaWVyKCk7Ci0KLSAgICAvKiBUbyBhdm9pZCByYWNlIGNvbmRpdGlvbnMsIGtlZXAgdGhlIGNvZGUgdG8gd3JpdGUgdG8gdGhlIGFkYXB0ZXIKLSAgICAgICBhdG9taWMuICBUaGlzIHNpbXBsaWZpZXMgdGhlIGFib3J0IGNvZGUuICBSaWdodCBub3cgdGhlCi0gICAgICAgc2NzaSBtaWQgbGF5ZXIgaGFzIHRoZSBob3N0X2xvY2sgYWxyZWFkeSBoZWxkCi0gICAgICovCi0KLSAgICBpZiAoaW5iKExDTF9ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSkgJiAoY29uZmlnLnNsb3QgPyAyIDogMSkpCi0gICAgICBnb3RvIHJldHJ5OwotCi0gICAgc3RhdHVzID0geGNoZ2IoMCwgJmNvbmZpZy5hYm9ydGVkW21zY3BfaW5kZXhdKTsKLSAgICBpZiAoc3RhdHVzICE9IDB4ZmYpIHsKLQotI2lmIFVMVFJBU1RPUl9ERUJVRyAmIChVRF9DT01NQU5EIHwgVURfQUJPUlQpCi0JcHJpbnRrKCJVU3g0RjogcXVldWVjb21tYW5kOiBhYm9ydGVkXG4iKTsKLSNpZiBVTFRSQVNUT1JfTUFYX0NNRFMgPiAxCi0JbG9nX3VsdHJhc3Rvcl9hYm9ydCgmY29uZmlnLCBtc2NwX2luZGV4KTsKLSNlbmRpZgotI2VuZGlmCi0Jc3RhdHVzIDw8PSAxNjsKLQotICAgICAgYWJvcnRlZDoKLQlzZXRfYml0KG1zY3BfaW5kZXgsICZjb25maWcubXNjcF9mcmVlKTsKLQkvKiBJZiB0aGUgZHJpdmVyIHF1ZXVlcyBjb21tYW5kcywgY2FsbCB0aGUgZG9uZSBwcm9jIGhlcmUuICBPdGhlcndpc2UKLQkgICByZXR1cm4gYW4gZXJyb3IuICAqLwotI2lmIFVMVFJBU1RPUl9NQVhfQ01EUyA+IDEKLQlTQ3BudC0+cmVzdWx0ID0gc3RhdHVzOwotCWRvbmUoU0NwbnQpOwotCXJldHVybiAwOwotI2Vsc2UKLQlyZXR1cm4gc3RhdHVzOwotI2VuZGlmCi0gICAgfQotCi0gICAgLyogU3RvcmUgcG9pbnRlciBpbiBPR00gYWRkcmVzcyBieXRlcyAqLwotICAgIG91dGwoaXNhX3ZpcnRfdG9fYnVzKG15X21zY3ApLCBjb25maWcub2dtX2FkZHJlc3MpOwotCi0gICAgLyogSXNzdWUgT0dNIGludGVycnVwdCAqLwotICAgIGlmIChjb25maWcuc2xvdCkgewotCS8qIFdyaXRlIE9HTSBjb21tYW5kIHJlZ2lzdGVyIG9uIDI0RiAqLwotCW91dGIoMSwgY29uZmlnLm9nbV9hZGRyZXNzIC0gMSk7Ci0Jb3V0YigweDIsIExDTF9ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSk7Ci0gICAgfSBlbHNlIHsKLQlvdXRiKDB4MSwgTENMX0RPT1JCRUxMX0lOVFIoY29uZmlnLmRvb3JiZWxsX2FkZHJlc3MpKTsKLSAgICB9Ci0KLSNpZiAoVUxUUkFTVE9SX0RFQlVHICYgVURfQ09NTUFORCkKLSAgICBwcmludGsoIlVTeDRGOiBxdWV1ZWNvbW1hbmQ6IHJldHVybmluZ1xuIik7Ci0jZW5kaWYKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgREVGX1NDU0lfUUNNRCh1bHRyYXN0b3JfcXVldWVjb21tYW5kKQotCi0vKiBUaGlzIGNvZGUgbXVzdCBkZWFsIHdpdGggMiBjYXNlczoKLQotICAgMS4gVGhlIGNvbW1hbmQgaGFzIG5vdCBiZWVuIHdyaXR0ZW4gdG8gdGhlIE9HTS4gIEluIHRoaXMgY2FzZSwgc2V0Ci0gICB0aGUgYWJvcnQgZmxhZyBhbmQgcmV0dXJuLgotCi0gICAyLiBUaGUgY29tbWFuZCBoYXMgYmVlbiB3cml0dGVuIHRvIHRoZSBPR00gYW5kIGlzIHN0dWNrIHNvbWV3aGVyZSBpbgotICAgdGhlIGFkYXB0ZXIuCi0KLSAgIDJhLiAgT24gYSAyNEYsIGFzayB0aGUgYWRhcHRlciB0byBhYm9ydCB0aGUgY29tbWFuZC4gIEl0IHdpbGwgaW50ZXJydXB0Ci0gICB3aGVuIGl0IGRvZXMuCi0KLSAgIDJiLiAgQ2FsbCB0aGUgY29tbWFuZCdzIGRvbmUgcHJvY2VkdXJlLgotCi0gKi8KLQotc3RhdGljIGludCB1bHRyYXN0b3JfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQpCi17Ci0jaWYgVUxUUkFTVE9SX0RFQlVHICYgVURfQUJPUlQKLSAgICBjaGFyIG91dFsxMDhdOwotICAgIHVuc2lnbmVkIGNoYXIgaWNtX3N0YXR1cyA9IDAsIG9nbV9zdGF0dXMgPSAwOwotICAgIHVuc2lnbmVkIGludCBpY21fYWRkciA9IDAsIG9nbV9hZGRyID0gMDsKLSNlbmRpZgotICAgIHVuc2lnbmVkIGludCBtc2NwX2luZGV4OwotICAgIHVuc2lnbmVkIGNoYXIgb2xkX2Fib3J0ZWQ7Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLSAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKTsKLSAgICBzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gU0NwbnQtPmRldmljZS0+aG9zdDsKLQotICAgIGlmKGNvbmZpZy5zbG90KSAKLSAgICAgIHJldHVybiBGQUlMRUQ7ICAvKiBEbyBub3QgYXR0ZW1wdCBhbiBhYm9ydCBmb3IgdGhlIDI0ZiAqLwotICAgICAgCi0gICAgLyogU2ltcGxlIGNvbnNpc3RlbmN5IGNoZWNraW5nICovCi0gICAgaWYoIVNDcG50LT5ob3N0X3NjcmliYmxlKQotICAgICAgcmV0dXJuIEZBSUxFRDsKLQotICAgIG1zY3BfaW5kZXggPSAoKHN0cnVjdCBtc2NwICopU0NwbnQtPmhvc3Rfc2NyaWJibGUpIC0gY29uZmlnLm1zY3A7Ci0gICAgaWYgKG1zY3BfaW5kZXggPj0gVUxUUkFTVE9SX01BWF9DTURTKQotCXBhbmljKCJVeDRGIGFib3J0aW5nIGludmFsaWQgTVNDUCIpOwotCi0jaWYgVUxUUkFTVE9SX0RFQlVHICYgVURfQUJPUlQKLSAgICBpZiAoY29uZmlnLnNsb3QpCi0gICAgICB7Ci0JaW50IHBvcnQwID0gKGNvbmZpZy5zbG90IDw8IDEyKSB8IDB4YzgwOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCi0Jc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0Jc3RyY3B5KG91dCwgIk9HTSAlZDoleCBJQ00gJWQ6JXggcG9ydHM6ICAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkgIHsKLQkgICAgdW5zaWduZWQgY2hhciBwID0gaW5iKHBvcnQwICsgaSk7Ci0JICAgIG91dFsyOCArIGkgKiAzXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIltwID4+IDRdOwotCSAgICBvdXRbMjkgKyBpICogM10gPSAiMDEyMzQ1Njc4OWFiY2RlZiJbcCAmIDE1XTsKLQkgICAgb3V0WzMwICsgaSAqIDNdID0gJyAnOwotCSAgfQotCW91dFsyOCArIGkgKiAzXSA9ICdcbic7Ci0Jb3V0WzI5ICsgaSAqIDNdID0gMDsKLQlvZ21fc3RhdHVzID0gaW5iKHBvcnQwICsgMjIpOwotCW9nbV9hZGRyID0gKHVuc2lnbmVkIGludClpc2FfYnVzX3RvX3ZpcnQoaW5sKHBvcnQwICsgMjMpKTsKLQlpY21fc3RhdHVzID0gaW5iKHBvcnQwICsgMjcpOwotCWljbV9hZGRyID0gKHVuc2lnbmVkIGludClpc2FfYnVzX3RvX3ZpcnQoaW5sKHBvcnQwICsgMjgpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotICAgICAgfQotCi0gICAgLyogRmlyc3QgY2hlY2sgdG8gc2VlIGlmIGFuIGludGVycnVwdCBpcyBwZW5kaW5nLiAgSSBzdXNwZWN0IHRoZSBTaVMKLSAgICAgICBjaGlwc2V0IGxvc2VzIGludGVycnVwdHMuICAoSSBhbHNvIHN1c3BlY3QgaXMgbWFuZ2xlcyBkYXRhLCBidXQKLSAgICAgICBvbmUgYnVnIGF0IGEgdGltZS4uLiAqLwotICAgIGlmIChjb25maWcuc2xvdCA/IGluYihjb25maWcuaWNtX2FkZHJlc3MgLSAxKSA9PSAyIDoKLQkoaW5iKFNZU19ET09SQkVMTF9JTlRSKGNvbmZpZy5kb29yYmVsbF9hZGRyZXNzKSkgJiAxKSkKLSAgICAgIHsKLQlwcmludGsoIlV4NEY6IGFib3J0IHdoaWxlIGNvbXBsZXRlZCBjb21tYW5kIHBlbmRpbmdcbiIpOwotCQotCXNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotCS8qIEZJWE1FOiBFd3d3Li4uIG5lZWQgdG8gdGhpbmsgYWJvdXQgcGFzc2luZyBob3N0IGFyb3VuZCBwcm9wZXJseSAqLwotCXVsdHJhc3Rvcl9pbnRlcnJ1cHQoTlVMTCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gU1VDQ0VTUzsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgb2xkX2Fib3J0ZWQgPSB4Y2hnYihESURfQUJPUlQsICZjb25maWcuYWJvcnRlZFttc2NwX2luZGV4XSk7Ci0KLSAgICAvKiBhYm9ydGVkID09IDB4ZmYgaXMgdGhlIHNpZ25hbCB0aGF0IHF1ZXVlY29tbWFuZCBoYXMgbm90IHlldCBzZW50Ci0gICAgICAgdGhlIGNvbW1hbmQuICBJdCB3aWxsIG5vdGljZSB0aGUgbmV3IGFib3J0IGZsYWcgYW5kIGZhaWwuICAqLwotICAgIGlmIChvbGRfYWJvcnRlZCA9PSAweGZmKQotCXJldHVybiBTVUNDRVNTOwotCi0gICAgLyogT24gMjRGLCBzZW5kIGFuIGFib3J0IE1TQ1AgcmVxdWVzdC4gIFRoZSBhZGFwdGVyIHdpbGwgaW50ZXJydXB0Ci0gICAgICAgYW5kIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB3aWxsIGNhbGwgZG9uZS4gICovCi0gICAgaWYgKGNvbmZpZy5zbG90ICYmIGluYihjb25maWcub2dtX2FkZHJlc3MgLSAxKSA9PSAwKQotICAgICAgewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlvdXRsKGlzYV92aXJ0X3RvX2J1cygmY29uZmlnLm1zY3BbbXNjcF9pbmRleF0pLCBjb25maWcub2dtX2FkZHJlc3MpOwotCXVkZWxheSg4KTsKLQlvdXRiKDB4ODAsIGNvbmZpZy5vZ21fYWRkcmVzcyAtIDEpOwotCW91dGIoMHgyLCBMQ0xfRE9PUkJFTExfSU5UUihjb25maWcuZG9vcmJlbGxfYWRkcmVzcykpOwotI2lmIFVMVFJBU1RPUl9ERUJVRyAmIFVEX0FCT1JUCi0JbG9nX3VsdHJhc3Rvcl9hYm9ydCgmY29uZmlnLCBtc2NwX2luZGV4KTsKLQlwcmludGsob3V0LCBvZ21fc3RhdHVzLCBvZ21fYWRkciwgaWNtX3N0YXR1cywgaWNtX2FkZHIpOwotI2VuZGlmCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQkvKiBGSVhNRTogYWRkIGEgd2FpdCBmb3IgdGhlIGFib3J0IHRvIGNvbXBsZXRlICovCi0JcmV0dXJuIFNVQ0NFU1M7Ci0gICAgICB9Ci0KLSNpZiBVTFRSQVNUT1JfREVCVUcgJiBVRF9BQk9SVAotICAgIGxvZ191bHRyYXN0b3JfYWJvcnQoJmNvbmZpZywgbXNjcF9pbmRleCk7Ci0jZW5kaWYKLQotICAgIC8qIENhbid0IHJlcXVlc3QgYSBncmFjZWZ1bCBhYm9ydC4gIEVpdGhlciB0aGlzIGlzIG5vdCBhIDI0RiBvcgotICAgICAgIHRoZSBPR00gaXMgYnVzeS4gIERvbid0IGZyZWUgdGhlIGNvbW1hbmQgLS0gdGhlIGFkYXB0ZXIgbWlnaHQKLSAgICAgICBzdGlsbCBiZSB1c2luZyBpdC4gIFNldHRpbmcgU0NpbnQgPSAwIGNhdXNlcyB0aGUgaW50ZXJydXB0Ci0gICAgICAgaGFuZGxlciB0byBpZ25vcmUgdGhlIGNvbW1hbmQuICAqLwotCi0gICAgLyogRklYTUUgLSBkZXZpY2VzIHRoYXQgaW1wbGVtZW50IHNvZnQgcmVzZXRzIHdpbGwgc3RpbGwgYmUgcnVubmluZwotICAgICAgIHRoZSBjb21tYW5kIGFmdGVyIGEgYnVzIHJlc2V0LiAgV2Ugd291bGQgcHJvYmFibHkgcmF0aGVyIGxlYXZlCi0gICAgICAgdGhlIGNvbW1hbmQgaW4gdGhlIHF1ZXVlLiAgVGhlIHVwcGVyIGxldmVsIGNvZGUgd2lsbCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgbGVhdmUgdGhlIGNvbW1hbmQgaW4gdGhlIGFjdGl2ZSBzdGF0ZSBpbnN0ZWFkIG9mIHJlcXVldWVpbmcgaXQuIEVSWSAqLwotCi0jaWYgVUxUUkFTVE9SX0RFQlVHICYgVURfQUJPUlQKLSAgICBpZiAoY29uZmlnLm1zY3BbbXNjcF9pbmRleF0uU0NpbnQgIT0gU0NwbnQpCi0JcHJpbnRrKCJhYm9ydDogY29tbWFuZCBtaXNtYXRjaCwgJXAgIT0gJXBcbiIsCi0JICAgICAgIGNvbmZpZy5tc2NwW21zY3BfaW5kZXhdLlNDaW50LCBTQ3BudCk7Ci0jZW5kaWYKLSAgICBpZiAoY29uZmlnLm1zY3BbbXNjcF9pbmRleF0uU0NpbnQgPT0gTlVMTCkKLQlyZXR1cm4gRkFJTEVEOwotCi0gICAgaWYgKGNvbmZpZy5tc2NwW21zY3BfaW5kZXhdLlNDaW50ICE9IFNDcG50KSBwYW5pYygiQmFkIGFib3J0Iik7Ci0gICAgY29uZmlnLm1zY3BbbXNjcF9pbmRleF0uU0NpbnQgPSBOVUxMOwotICAgIGRvbmUgPSBjb25maWcubXNjcFttc2NwX2luZGV4XS5kb25lOwotICAgIGNvbmZpZy5tc2NwW21zY3BfaW5kZXhdLmRvbmUgPSBOVUxMOwotICAgIFNDcG50LT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7Ci0gICAgCi0gICAgLyogVGFrZSB0aGUgaG9zdCBsb2NrIHRvIGd1YXJkIGFnYWluc3Qgc2NzaSBsYXllciByZS1lbnRyeSAqLwotICAgIGRvbmUoU0NwbnQpOwotCi0gICAgLyogTmVlZCB0byBzZXQgYSB0aW1lb3V0IGhlcmUgaW4gY2FzZSBjb21tYW5kIG5ldmVyIGNvbXBsZXRlcy4gICovCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgdWx0cmFzdG9yX2hvc3RfcmVzZXQoc3RydWN0IHNjc2lfY21uZCAqIFNDcG50KQotewotICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7Ci0gICAgCi0jaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX1JFU0VUKQotICAgIHByaW50aygiVVMxNEY6IHJlc2V0OiBjYWxsZWRcbiIpOwotI2VuZGlmCi0KLSAgICBpZihjb25maWcuc2xvdCkKLSAgICAJcmV0dXJuIEZBSUxFRDsKLQotICAgIHNwaW5fbG9ja19pcnFzYXZlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotICAgIC8qIFJlc2V0IHRoZSBhZGFwdGVyIGFuZCBTQ1NJIGJ1cy4gIFRoZSBTQ1NJIGJ1cyByZXNldCBjYW4gYmUKLSAgICAgICBpbmhpYml0ZWQgYnkgY2xlYXJpbmcgdWx0cmFzdG9yX2J1c19yZXNldCBiZWZvcmUgcHJvYmUuICAqLwotICAgIG91dGIoMHhjMCwgTENMX0RPT1JCRUxMX0lOVFIoY29uZmlnLmRvb3JiZWxsX2FkZHJlc3MpKTsKLSAgICBpZiAoY29uZmlnLnNsb3QpCi0gICAgICB7Ci0Jb3V0YigwLCBjb25maWcub2dtX2FkZHJlc3MgLSAxKTsKLQlvdXRiKDAsIGNvbmZpZy5pY21fYWRkcmVzcyAtIDEpOwotICAgICAgfQotCi0jaWYgVUxUUkFTVE9SX01BWF9DTURTID09IDEKLSAgICBpZiAoY29uZmlnLm1zY3BfYnVzeSAmJiBjb25maWcubXNjcC0+ZG9uZSAmJiBjb25maWcubXNjcC0+U0NpbnQpCi0gICAgICB7Ci0JY29uZmlnLm1zY3AtPlNDaW50LT5yZXN1bHQgPSBESURfUkVTRVQgPDwgMTY7Ci0JY29uZmlnLm1zY3AtPmRvbmUoY29uZmlnLm1zY3AtPlNDaW50KTsKLSAgICAgIH0KLSAgICBjb25maWcubXNjcC0+U0NpbnQgPSAwOwotI2Vsc2UKLSAgICBmb3IgKGkgPSAwOyBpIDwgVUxUUkFTVE9SX01BWF9DTURTOyBpKyspCi0gICAgICB7Ci0JaWYgKCEgKGNvbmZpZy5tc2NwX2ZyZWUgJiAoMSA8PCBpKSkgJiYKLQkgICAgY29uZmlnLm1zY3BbaV0uZG9uZSAmJiBjb25maWcubXNjcFtpXS5TQ2ludCkKLQkgIHsKLQkgICAgY29uZmlnLm1zY3BbaV0uU0NpbnQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKLQkgICAgY29uZmlnLm1zY3BbaV0uZG9uZShjb25maWcubXNjcFtpXS5TQ2ludCk7Ci0JICAgIGNvbmZpZy5tc2NwW2ldLmRvbmUgPSBOVUxMOwotCSAgfQotCWNvbmZpZy5tc2NwW2ldLlNDaW50ID0gTlVMTDsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgLyogRklYTUUgLSBpZiB0aGUgZGV2aWNlIGltcGxlbWVudHMgc29mdCByZXNldHMsIHRoZW4gdGhlIGNvbW1hbmQKLSAgICAgICB3aWxsIHN0aWxsIGJlIHJ1bm5pbmcuICBFUlkgIAotICAgICAgIAotICAgICAgIEV2ZW4gYmlnZ2VyIGRlYWwgd2l0aCBuZXdfZWghIAotICAgICAqLwotCi0gICAgbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopY29uZmlnLmFib3J0ZWQsIDAsIHNpemVvZiBjb25maWcuYWJvcnRlZCk7Ci0jaWYgVUxUUkFTVE9SX01BWF9DTURTID09IDEKLSAgICBjb25maWcubXNjcF9idXN5ID0gMDsKLSNlbHNlCi0gICAgY29uZmlnLm1zY3BfZnJlZSA9IH4wOwotI2VuZGlmCi0KLSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwotICAgIHJldHVybiBTVUNDRVNTOwotCi19Ci0KLWludCB1bHRyYXN0b3JfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldiwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKLQkJc2VjdG9yX3QgY2FwYWNpdHksIGludCAqIGRraW5mbykKLXsKLSAgICBpbnQgc2l6ZSA9IGNhcGFjaXR5OwotICAgIHVuc2lnbmVkIGludCBzID0gY29uZmlnLmhlYWRzICogY29uZmlnLnNlY3RvcnM7Ci0KLSAgICBka2luZm9bMF0gPSBjb25maWcuaGVhZHM7Ci0gICAgZGtpbmZvWzFdID0gY29uZmlnLnNlY3RvcnM7Ci0gICAgZGtpbmZvWzJdID0gc2l6ZSAvIHM7CS8qIElnbm9yZSBwYXJ0aWFsIGN5bGluZGVycyAqLwotI2lmIDAKLSAgICBpZiAoZGtpbmZvWzJdID4gMTAyNCkKLQlka2luZm9bMl0gPSAxMDI0OwotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHVsdHJhc3Rvcl9pbnRlcnJ1cHQodm9pZCAqZGV2X2lkKQotewotICAgIHVuc2lnbmVkIGludCBzdGF0dXM7Ci0jaWYgVUxUUkFTVE9SX01BWF9DTURTID4gMQotICAgIHVuc2lnbmVkIGludCBtc2NwX2luZGV4OwotI2VuZGlmCi0gICAgc3RydWN0IG1zY3AgKm1zY3A7Ci0gICAgdm9pZCAoKmRvbmUpIChzdHJ1Y3Qgc2NzaV9jbW5kICopOwotICAgIHN0cnVjdCBzY3NpX2NtbmQgKlNDdG1wOwotCi0jaWYgVUxUUkFTVE9SX01BWF9DTURTID09IDEKLSAgICBtc2NwID0gJmNvbmZpZy5tc2NwWzBdOwotI2Vsc2UKLSAgICBtc2NwID0gKHN0cnVjdCBtc2NwICopaXNhX2J1c190b192aXJ0KGlubChjb25maWcuaWNtX2FkZHJlc3MpKTsKLSAgICBtc2NwX2luZGV4ID0gbXNjcCAtIGNvbmZpZy5tc2NwOwotICAgIGlmIChtc2NwX2luZGV4ID49IFVMVFJBU1RPUl9NQVhfQ01EUykgewotCXByaW50aygiVXg0RiBpbnRlcnJ1cHQ6IGJhZCBNU0NQIGFkZHJlc3MgJXhcbiIsICh1bnNpZ25lZCBpbnQpIG1zY3ApOwotCS8qIEEgY29tbWFuZCBoYXMgYmVlbiBsb3N0LiAgUmVzZXQgYW5kIHJlcG9ydCBhbiBlcnJvcgotCSAgIGZvciBhbGwgY29tbWFuZHMuICAqLwotCXVsdHJhc3Rvcl9ob3N0X3Jlc2V0KGRldl9pZCk7Ci0JcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogQ2xlYW4gSUNNIHNsb3QgKHNldCBJQ01JTlQgYml0IHRvIDApICovCi0gICAgaWYgKGNvbmZpZy5zbG90KSB7Ci0JdW5zaWduZWQgY2hhciBpY21fc3RhdHVzID0gaW5iKGNvbmZpZy5pY21fYWRkcmVzcyAtIDEpOwotI2lmIFVMVFJBU1RPUl9ERUJVRyAmIChVRF9JTlRFUlJVUFR8VURfRVJST1J8VURfQUJPUlQpCi0JaWYgKGljbV9zdGF0dXMgIT0gMSAmJiBpY21fc3RhdHVzICE9IDIpCi0JICAgIHByaW50aygiVVMyNEY6IElDTSBzdGF0dXMgJXggZm9yIE1TQ1AgJWQgKCV4KVxuIiwgaWNtX3N0YXR1cywKLQkJICAgbXNjcF9pbmRleCwgKHVuc2lnbmVkIGludCkgbXNjcCk7Ci0jZW5kaWYKLQkvKiBUaGUgbWFudWFsIHNheXMgY2xlYXIgaW50ZXJydXB0IHRoZW4gd3JpdGUgMCB0byBJQ00gc3RhdHVzLgotCSAgIFRoaXMgc2VlbXMgYmFja3dhcmRzLCBidXQgSSdsbCBkbyBpdCBhbnl3YXkuICAtLWpmYyAqLwotCW91dGIoMiwgU1lTX0RPT1JCRUxMX0lOVFIoY29uZmlnLmRvb3JiZWxsX2FkZHJlc3MpKTsKLQlvdXRiKDAsIGNvbmZpZy5pY21fYWRkcmVzcyAtIDEpOwotCWlmIChpY21fc3RhdHVzID09IDQpIHsKLQkgICAgcHJpbnRrKCJVbHRyYVN0b3IgYWJvcnQgY29tbWFuZCBmYWlsZWRcbiIpOwotCSAgICByZXR1cm47Ci0JfQotCWlmIChpY21fc3RhdHVzID09IDMpIHsKLQkgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikgPSBtc2NwLT5kb25lOwotCSAgICBpZiAoZG9uZSkgewotCQltc2NwLT5kb25lID0gTlVMTDsKLQkJbXNjcC0+U0NpbnQtPnJlc3VsdCA9IERJRF9BQk9SVCA8PCAxNjsKLQkJZG9uZShtc2NwLT5TQ2ludCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuOwotCX0KLSAgICB9IGVsc2UgewotCW91dGIoMSwgU1lTX0RPT1JCRUxMX0lOVFIoY29uZmlnLmRvb3JiZWxsX2FkZHJlc3MpKTsKLSAgICB9Ci0KLSAgICBTQ3RtcCA9IG1zY3AtPlNDaW50OwotICAgIG1zY3AtPlNDaW50ID0gTlVMTDsKLQotICAgIGlmICghU0N0bXApCi0gICAgICB7Ci0jaWYgVUxUUkFTVE9SX0RFQlVHICYgKFVEX0FCT1JUfFVEX0lOVEVSUlVQVCkKLQlwcmludGsoIk1TQ1AgJWQgKCV4KTogbm8gY29tbWFuZFxuIiwgbXNjcF9pbmRleCwgKHVuc2lnbmVkIGludCkgbXNjcCk7Ci0jZW5kaWYJCi0jaWYgVUxUUkFTVE9SX01BWF9DTURTID09IDEKLQljb25maWcubXNjcF9idXN5ID0gRkFMU0U7Ci0jZWxzZQotCXNldF9iaXQobXNjcF9pbmRleCwgJmNvbmZpZy5tc2NwX2ZyZWUpOwotI2VuZGlmCi0JY29uZmlnLmFib3J0ZWRbbXNjcF9pbmRleF0gPSAwOwotCXJldHVybjsKLSAgICAgIH0KLQotICAgIC8qIFNhdmUgZG9uZSBsb2NhbGx5IGFuZCB6ZXJvIGJlZm9yZSBjYWxsaW5nLiAgVGhpcyBpcyBuZWVkZWQgYXMKLSAgICAgICBvbmNlIHdlIGNhbGwgZG9uZSwgd2UgbWF5IGdldCBhbm90aGVyIGNvbW1hbmQgcXVldWVkIGJlZm9yZSB0aGlzCi0gICAgICAgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBjYW4gcmV0dXJuLiAqLwotICAgIGRvbmUgPSBtc2NwLT5kb25lOwotICAgIG1zY3AtPmRvbmUgPSBOVUxMOwotCi0gICAgLyogTGV0IHRoZSBoaWdoZXIgbGV2ZWxzIGtub3cgdGhhdCB3ZSdyZSBkb25lICovCi0gICAgc3dpdGNoIChtc2NwLT5hZGFwdGVyX3N0YXR1cykKLSAgICAgIHsKLSAgICAgIGNhc2UgMDoKLQlzdGF0dXMgPSBESURfT0sgPDwgMTY7Ci0JYnJlYWs7Ci0gICAgICBjYXNlIDB4MDE6CS8qIGludmFsaWQgY29tbWFuZCAqLwotICAgICAgY2FzZSAweDAyOgkvKiBpbnZhbGlkIHBhcmFtZXRlcnMgKi8KLSAgICAgIGNhc2UgMHgwMzoJLyogaW52YWxpZCBkYXRhIGxpc3QgKi8KLSAgICAgIGRlZmF1bHQ6Ci0Jc3RhdHVzID0gRElEX0VSUk9SIDw8IDE2OwotCWJyZWFrOwotICAgICAgY2FzZSAweDg0OgkvKiBTQ1NJIGJ1cyBhYm9ydCAqLwotCXN0YXR1cyA9IERJRF9BQk9SVCA8PCAxNjsKLQlicmVhazsKLSAgICAgIGNhc2UgMHg5MToKLQlzdGF0dXMgPSBESURfVElNRV9PVVQgPDwgMTY7Ci0JYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBTQ3RtcC0+cmVzdWx0ID0gc3RhdHVzIHwgbXNjcC0+dGFyZ2V0X3N0YXR1czsKLQotICAgIFNDdG1wLT5ob3N0X3NjcmliYmxlID0gTlVMTDsKLQotICAgIC8qIEZyZWUgdXAgbXNjcCBibG9jayBmb3IgbmV4dCBjb21tYW5kICovCi0jaWYgVUxUUkFTVE9SX01BWF9DTURTID09IDEKLSAgICBjb25maWcubXNjcF9idXN5ID0gRkFMU0U7Ci0jZWxzZQotICAgIHNldF9iaXQobXNjcF9pbmRleCwgJmNvbmZpZy5tc2NwX2ZyZWUpOwotI2VuZGlmCi0KLSNpZiBVTFRSQVNUT1JfREVCVUcgJiAoVURfQUJPUlR8VURfSU5URVJSVVBUKQotICAgIGlmIChjb25maWcuYWJvcnRlZFttc2NwX2luZGV4XSkKLQlwcmludGsoIlV4NCBpbnRlcnJ1cHQ6IE1TQ1AgJWQgKCV4KSBhYm9ydGVkID0gJWRcbiIsCi0JICAgICAgIG1zY3BfaW5kZXgsICh1bnNpZ25lZCBpbnQpIG1zY3AsIGNvbmZpZy5hYm9ydGVkW21zY3BfaW5kZXhdKTsKLSNlbmRpZgotICAgIGNvbmZpZy5hYm9ydGVkW21zY3BfaW5kZXhdID0gMDsKLQotICAgIGlmIChkb25lKQotCWRvbmUoU0N0bXApOwotICAgIGVsc2UKLQlwcmludGsoIlVTMTRGOiBpbnRlcnJ1cHQ6IHVuZXhwZWN0ZWQgaW50ZXJydXB0XG4iKTsKLQotICAgIGlmIChjb25maWcuc2xvdCA/IGluYihjb25maWcuaWNtX2FkZHJlc3MgLSAxKSA6Ci0gICAgICAgKGluYihTWVNfRE9PUkJFTExfSU5UUihjb25maWcuZG9vcmJlbGxfYWRkcmVzcykpICYgMSkpCi0jaWYgKFVMVFJBU1RPUl9ERUJVRyAmIFVEX01VTFRJX0NNRCkKLSAgICAgIHByaW50aygiVXg0RjogbXVsdGlwbGUgY29tbWFuZHMgY29tcGxldGVkXG4iKTsKLSNlbHNlCi0gICAgICA7Ci0jZW5kaWYKLQotI2lmIChVTFRSQVNUT1JfREVCVUcgJiBVRF9JTlRFUlJVUFQpCi0gICAgcHJpbnRrKCJVU3g0RjogaW50ZXJydXB0OiByZXR1cm5pbmdcbiIpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBkb191bHRyYXN0b3JfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLSAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgIHN0cnVjdCBTY3NpX0hvc3QgKmRldiA9IGRldl9pZDsKLSAgICAKLSAgICBzcGluX2xvY2tfaXJxc2F2ZShkZXYtPmhvc3RfbG9jaywgZmxhZ3MpOwotICAgIHVsdHJhc3Rvcl9pbnRlcnJ1cHQoZGV2X2lkKTsKLSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGRldi0+aG9zdF9sb2NrLCBmbGFncyk7Ci0gICAgcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKLQkubmFtZSAgICAgICAgICAgICAgPSAiVWx0cmFTdG9yIDE0Ri8yNEYvMzRGIiwKLQkuZGV0ZWN0ICAgICAgICAgICAgPSB1bHRyYXN0b3JfZGV0ZWN0LAotCS5yZWxlYXNlCSAgID0gdWx0cmFzdG9yX3JlbGVhc2UsCi0JLmluZm8gICAgICAgICAgICAgID0gdWx0cmFzdG9yX2luZm8sCi0JLnF1ZXVlY29tbWFuZCAgICAgID0gdWx0cmFzdG9yX3F1ZXVlY29tbWFuZCwKLQkuZWhfYWJvcnRfaGFuZGxlciAgPSB1bHRyYXN0b3JfYWJvcnQsCi0JLmVoX2hvc3RfcmVzZXRfaGFuZGxlciAgPSB1bHRyYXN0b3JfaG9zdF9yZXNldCwJCi0JLmJpb3NfcGFyYW0gICAgICAgID0gdWx0cmFzdG9yX2Jpb3NwYXJhbSwKLQkuY2FuX3F1ZXVlICAgICAgICAgPSBVTFRSQVNUT1JfTUFYX0NNRFMsCi0JLnNnX3RhYmxlc2l6ZSAgICAgID0gVUxUUkFTVE9SXzE0Rl9NQVhfU0csCi0JLmNtZF9wZXJfbHVuICAgICAgID0gVUxUUkFTVE9SX01BWF9DTURTX1BFUl9MVU4sCi0JLnVuY2hlY2tlZF9pc2FfZG1hID0gMSwKLQkudXNlX2NsdXN0ZXJpbmcgICAgPSBFTkFCTEVfQ0xVU1RFUklORywKLX07Ci0jaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS91bHRyYXN0b3IuaCBiL2RyaXZlcnMvc2NzaS91bHRyYXN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1YzE4Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3Njc2kvdWx0cmFzdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICoJdWx0cmFzdG9yLmMJKEMpIDE5OTEgRGF2aWQgQi4gR2VudHplbAotICoJTG93LWxldmVsIHNjc2kgZHJpdmVyIGZvciBVbHRyYVN0b3IgMTRGCi0gKglieSBEYXZpZCBCLiBHZW50emVsLCBXaGl0ZmllbGQgU29mdHdhcmUgU2VydmljZXMsIENhcm5lZ2llLCBQQQotICoJICAgIChnZW50emVsQG5vdmEuZW5ldC5kZWMuY29tKQotICogIHNjYXR0ZXIvZ2F0aGVyIGFkZGVkIGJ5IFNjb3R0IFRheWxvciAobjIxN2NnQHRhbXV0cy50YW11LmVkdSkKLSAqICAyNEYgc3VwcG9ydCBieSBKb2huIEYuIENhcnIgKGpmY0BhdGhlbmEubWl0LmVkdSkKLSAqICAgIEpvaG4ncyB3b3JrIG1vZGlmaWVkIGJ5IENhbGViIEVwc3RlaW4gKGNhZUBqcG1vcmdhbi5jb20pIGFuZCAKLSAqICAgIEVyaWMgWW91bmdkYWxlIChlcmljQHRhbnRhbHVzLm5ybC5uYXZ5Lm1pbCkuCi0gKglUaGFua3MgdG8gVWx0cmFTdG9yIGZvciBwcm92aWRpbmcgdGhlIG5lY2Vzc2FyeSBkb2N1bWVudGF0aW9uCi0gKi8KLQotI2lmbmRlZiBfVUxUUkFTVE9SX0gKLSNkZWZpbmUgX1VMVFJBU1RPUl9ICi0KLXN0YXRpYyBpbnQgdWx0cmFzdG9yX2RldGVjdChzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICopOwotc3RhdGljIGNvbnN0IGNoYXIgKnVsdHJhc3Rvcl9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKnNocG50KTsKLXN0YXRpYyBpbnQgdWx0cmFzdG9yX3F1ZXVlY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHN0cnVjdCBzY3NpX2NtbmQgKik7Ci1zdGF0aWMgaW50IHVsdHJhc3Rvcl9hYm9ydChzdHJ1Y3Qgc2NzaV9jbW5kICopOwotc3RhdGljIGludCB1bHRyYXN0b3JfaG9zdF9yZXNldChzdHJ1Y3Qgc2NzaV9jbW5kICopOwotc3RhdGljIGludCB1bHRyYXN0b3JfYmlvc3BhcmFtKHN0cnVjdCBzY3NpX2RldmljZSAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosCi0JCQkJc2VjdG9yX3QsIGludCAqKTsKLQotCi0jZGVmaW5lIFVMVFJBU1RPUl8xNEZfTUFYX1NHIDE2Ci0jZGVmaW5lIFVMVFJBU1RPUl8yNEZfTUFYX1NHIDMzCi0KLSNkZWZpbmUgVUxUUkFTVE9SX01BWF9DTURTX1BFUl9MVU4gNQotI2RlZmluZSBVTFRSQVNUT1JfTUFYX0NNRFMgMTYKLQotI2RlZmluZSBVTFRSQVNUT1JfMjRGX1BPUlQgMHhDODAKLQotCi0jaWZkZWYgVUxUUkFTVE9SX1BSSVZBVEUKLQotI2RlZmluZSBVRF9BQk9SVAkweDAwMDEKLSNkZWZpbmUgVURfQ09NTUFORAkweDAwMDIKLSNkZWZpbmUgVURfREVURUNUCTB4MDAwNAotI2RlZmluZSBVRF9JTlRFUlJVUFQJMHgwMDA4Ci0jZGVmaW5lIFVEX1JFU0VUCTB4MDAxMAotI2RlZmluZSBVRF9NVUxUSV9DTUQJMHgwMDIwCi0jZGVmaW5lIFVEX0NTSVIJCTB4MDA0MAotI2RlZmluZSBVRF9FUlJPUgkweDAwODAKLQotLyogI2RlZmluZSBQT1JUX09WRVJSSURFIDB4MzMwICovCi0KLS8qIFZhbHVlcyBmb3IgdGhlIFBST0RVQ1RfSUQgcG9ydHMgZm9yIHRoZSAxNEYgKi8KLSNkZWZpbmUgVVMxNEZfUFJPRFVDVF9JRF8wIDB4NTYKLSNkZWZpbmUgVVMxNEZfUFJPRFVDVF9JRF8xIDB4NDAJCS8qIE5PVEU6IE9ubHkgdXBwZXIgbmliYmxlIGlzIHVzZWQgKi8KLQotI2RlZmluZSBVUzI0Rl9QUk9EVUNUX0lEXzAgMHg1NgotI2RlZmluZSBVUzI0Rl9QUk9EVUNUX0lEXzEgMHg2MwotI2RlZmluZSBVUzI0Rl9QUk9EVUNUX0lEXzIgMHgwMgotCi0vKiBTdWJ2ZXJzaW9uIHZhbHVlcyAqLwotI2RlZmluZSBVMTRGIDAKLSNkZWZpbmUgVTM0RiAxCi0KLS8qIE1TQ1AgZmllbGQgdmFsdWVzICovCi0KLS8qIE9wY29kZSAqLwotI2RlZmluZSBPUF9IT1NUX0FEQVBURVIgMHgxCi0jZGVmaW5lIE9QX1NDU0kgMHgyCi0jZGVmaW5lIE9QX1JFU0VUIDB4NAotCi0vKiBEYXRlIFRyYW5zZmVyIERpcmVjdGlvbiAqLwotI2RlZmluZSBEVERfU0NTSSAweDAKLSNkZWZpbmUgRFREX0lOIDB4MQotI2RlZmluZSBEVERfT1VUIDB4MgotI2RlZmluZSBEVERfTk9ORSAweDMKLQotLyogSG9zdCBBZGFwdGVyIGNvbW1hbmQgc3ViY29kZXMgKi8KLSNkZWZpbmUgSEFfQ01EX0lOUVVJUlkgMHgxCi0jZGVmaW5lIEhBX0NNRF9TRUxGX0RJQUcgMHgyCi0jZGVmaW5lIEhBX0NNRF9SRUFEX0JVRkYgMHgzCi0jZGVmaW5lIEhBX0NNRF9XUklURV9CVUZGIDB4NAotCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvdmlydGlvX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS92aXJ0aW9fc2NzaS5jCmluZGV4IDdkYmJiMjkuLmVjOTFiZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS92aXJ0aW9fc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS92aXJ0aW9fc2NzaS5jCkBAIC0xMDcsOCArMTA3LDggQEAKIAkvKiBJZiB0aGUgYWZmaW5pdHkgaGludCBpcyBzZXQgZm9yIHZpcnRxdWV1ZXMgKi8KIAlib29sIGFmZmluaXR5X2hpbnRfc2V0OwogCi0JLyogQ1BVIGhvdHBsdWcgbm90aWZpZXIgKi8KLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbmI7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlX2RlYWQ7CiAKIAkvKiBQcm90ZWN0ZWQgYnkgZXZlbnRfdnEgbG9jayAqLwogCWJvb2wgc3RvcF9ldmVudHM7CkBAIC0xMTgsNiArMTE4LDcgQEAKIAlzdHJ1Y3QgdmlydGlvX3Njc2lfdnEgcmVxX3Zxc1tdOwogfTsKIAorc3RhdGljIGVudW0gY3B1aHBfc3RhdGUgdmlydGlvc2NzaV9vbmxpbmU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnZpcnRzY3NpX2NtZF9jYWNoZTsKIHN0YXRpYyBtZW1wb29sX3QgKnZpcnRzY3NpX2NtZF9wb29sOwogCkBAIC0yNTgsNyArMjU5LDcgQEAKIAlzdHJ1Y3QgdmlydGlvX3Njc2lfY21kICpjbWQgPSBidWY7CiAKIAlpZiAoY21kLT5jb21wKQotCQljb21wbGV0ZV9hbGwoY21kLT5jb21wKTsKKwkJY29tcGxldGUoY21kLT5jb21wKTsKIH0KIAogc3RhdGljIHZvaWQgdmlydHNjc2lfY3RybF9kb25lKHN0cnVjdCB2aXJ0cXVldWUgKnZxKQpAQCAtODUyLDIxICs4NTMsMzMgQEAKIAlwdXRfb25saW5lX2NwdXMoKTsKIH0KIAotc3RhdGljIGludCB2aXJ0c2NzaV9jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQorc3RhdGljIGludCB2aXJ0c2NzaV9jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQogewotCXN0cnVjdCB2aXJ0aW9fc2NzaSAqdnNjc2kgPSBjb250YWluZXJfb2YobmZiLCBzdHJ1Y3QgdmlydGlvX3Njc2ksIG5iKTsKLQlzd2l0Y2goYWN0aW9uKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JY2FzZSBDUFVfREVBRDoKLQljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQkJX192aXJ0c2NzaV9zZXRfYWZmaW5pdHkodnNjc2ksIHRydWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKKwlzdHJ1Y3QgdmlydGlvX3Njc2kgKnZzY3NpID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgdmlydGlvX3Njc2ksCisJCQkJCQkgICAgIG5vZGUpOworCV9fdmlydHNjc2lfc2V0X2FmZmluaXR5KHZzY3NpLCB0cnVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aXJ0c2NzaV9jcHVfbm90aWZfYWRkKHN0cnVjdCB2aXJ0aW9fc2NzaSAqdmkpCit7CisJaW50IHJldDsKKworCXJldCA9IGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZSh2aXJ0aW9zY3NpX29ubGluZSwgJnZpLT5ub2RlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlKENQVUhQX1ZJUlRfU0NTSV9ERUFELCAmdmktPm5vZGVfZGVhZCk7CisJaWYgKHJldCkKKwkJY3B1aHBfc3RhdGVfcmVtb3ZlX2luc3RhbmNlKHZpcnRpb3Njc2lfb25saW5lLCAmdmktPm5vZGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZpcnRzY3NpX2NwdV9ub3RpZl9yZW1vdmUoc3RydWN0IHZpcnRpb19zY3NpICp2aSkKK3sKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyh2aXJ0aW9zY3NpX29ubGluZSwgJnZpLT5ub2RlKTsKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhDUFVIUF9WSVJUX1NDU0lfREVBRCwKKwkJCQkJICAgICZ2aS0+bm9kZV9kZWFkKTsKIH0KIAogc3RhdGljIHZvaWQgdmlydHNjc2lfaW5pdF92cShzdHJ1Y3QgdmlydGlvX3Njc2lfdnEgKnZpcnRzY3NpX3ZxLApAQCAtOTI5LDggKzk0Miw2IEBACiAJCXZpcnRzY3NpX2luaXRfdnEoJnZzY3NpLT5yZXFfdnFzW2kgLSBWSVJUSU9fU0NTSV9WUV9CQVNFXSwKIAkJCQkgdnFzW2ldKTsKIAotCXZpcnRzY3NpX3NldF9hZmZpbml0eSh2c2NzaSwgdHJ1ZSk7Ci0KIAl2aXJ0c2NzaV9jb25maWdfc2V0KHZkZXYsIGNkYl9zaXplLCBWSVJUSU9fU0NTSV9DREJfU0laRSk7CiAJdmlydHNjc2lfY29uZmlnX3NldCh2ZGV2LCBzZW5zZV9zaXplLCBWSVJUSU9fU0NTSV9TRU5TRV9TSVpFKTsKIApAQCAtOTg3LDEyICs5OTgsOSBAQAogCWlmIChlcnIpCiAJCWdvdG8gdmlydHNjc2lfaW5pdF9mYWlsZWQ7CiAKLQl2c2NzaS0+bmIubm90aWZpZXJfY2FsbCA9ICZ2aXJ0c2NzaV9jcHVfY2FsbGJhY2s7Ci0JZXJyID0gcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZ2c2NzaS0+bmIpOwotCWlmIChlcnIpIHsKLQkJcHJfZXJyKCJyZWdpc3RlcmluZyBjcHUgbm90aWZpZXIgZmFpbGVkXG4iKTsKKwllcnIgPSB2aXJ0c2NzaV9jcHVfbm90aWZfYWRkKHZzY3NpKTsKKwlpZiAoZXJyKQogCQlnb3RvIHNjc2lfYWRkX2hvc3RfZmFpbGVkOwotCX0KIAogCWNtZF9wZXJfbHVuID0gdmlydHNjc2lfY29uZmlnX2dldCh2ZGV2LCBjbWRfcGVyX2x1bikgPzogMTsKIAlzaG9zdC0+Y21kX3Blcl9sdW4gPSBtaW5fdCh1MzIsIGNtZF9wZXJfbHVuLCBzaG9zdC0+Y2FuX3F1ZXVlKTsKQEAgLTEwNDksNyArMTA1Nyw3IEBACiAKIAlzY3NpX3JlbW92ZV9ob3N0KHNob3N0KTsKIAotCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZ2c2NzaS0+bmIpOworCXZpcnRzY3NpX2NwdV9ub3RpZl9yZW1vdmUodnNjc2kpOwogCiAJdmlydHNjc2lfcmVtb3ZlX3Zxcyh2ZGV2KTsKIAlzY3NpX2hvc3RfcHV0KHNob3N0KTsKQEAgLTEwNjEsNyArMTA2OSw3IEBACiAJc3RydWN0IFNjc2lfSG9zdCAqc2ggPSB2aXJ0aW9fc2NzaV9ob3N0KHZkZXYpOwogCXN0cnVjdCB2aXJ0aW9fc2NzaSAqdnNjc2kgPSBzaG9zdF9wcml2KHNoKTsKIAotCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZ2c2NzaS0+bmIpOworCXZpcnRzY3NpX2NwdV9ub3RpZl9yZW1vdmUodnNjc2kpOwogCXZpcnRzY3NpX3JlbW92ZV92cXModmRldik7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDc2LDEyICsxMDg0LDExIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IHJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmdnNjc2ktPm5iKTsKKwllcnIgPSB2aXJ0c2NzaV9jcHVfbm90aWZfYWRkKHZzY3NpKTsKIAlpZiAoZXJyKSB7CiAJCXZkZXYtPmNvbmZpZy0+ZGVsX3Zxcyh2ZGV2KTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0KIAl2aXJ0aW9fZGV2aWNlX3JlYWR5KHZkZXYpOwogCiAJaWYgKHZpcnRpb19oYXNfZmVhdHVyZSh2ZGV2LCBWSVJUSU9fU0NTSV9GX0hPVFBMVUcpKQpAQCAtMTEzNiw2ICsxMTQzLDE2IEBACiAJCXByX2VycigibWVtcG9vbF9jcmVhdGUoKSBmb3IgdmlydHNjc2lfY21kX3Bvb2wgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfT05MSU5FX0RZTiwKKwkJCQkgICAgICAic2NzaS92aXJ0aW86b25saW5lIiwKKwkJCQkgICAgICB2aXJ0c2NzaV9jcHVfb25saW5lLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKwl2aXJ0aW9zY3NpX29ubGluZSA9IHJldDsKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShDUFVIUF9WSVJUX1NDU0lfREVBRCwgInNjc2kvdmlydGlvOmRlYWQiLAorCQkJCSAgICAgIE5VTEwsIHZpcnRzY3NpX2NwdV9vbmxpbmUpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CiAJcmV0ID0gcmVnaXN0ZXJfdmlydGlvX2RyaXZlcigmdmlydGlvX3Njc2lfZHJpdmVyKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKQEAgLTExNTEsMTIgKzExNjgsMTcgQEAKIAkJa21lbV9jYWNoZV9kZXN0cm95KHZpcnRzY3NpX2NtZF9jYWNoZSk7CiAJCXZpcnRzY3NpX2NtZF9jYWNoZSA9IE5VTEw7CiAJfQorCWlmICh2aXJ0aW9zY3NpX29ubGluZSkKKwkJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKHZpcnRpb3Njc2lfb25saW5lKTsKKwljcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUoQ1BVSFBfVklSVF9TQ1NJX0RFQUQpOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBmaW5pKHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl92aXJ0aW9fZHJpdmVyKCZ2aXJ0aW9fc2NzaV9kcml2ZXIpOworCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZSh2aXJ0aW9zY3NpX29ubGluZSk7CisJY3B1aHBfcmVtb3ZlX211bHRpX3N0YXRlKENQVUhQX1ZJUlRfU0NTSV9ERUFEKTsKIAltZW1wb29sX2Rlc3Ryb3kodmlydHNjc2lfY21kX3Bvb2wpOwogCWttZW1fY2FjaGVfZGVzdHJveSh2aXJ0c2NzaV9jbWRfY2FjaGUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3dkNzAwMC5jIGIvZHJpdmVycy9zY3NpL3dkNzAwMC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDlmOTU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc2NzaS93ZDcwMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NTcgKzAsMCBAQAotLyogJElkOiAkCi0gKiAgbGludXgvZHJpdmVycy9zY3NpL3dkNzAwMC5jCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5MiAgVGhvbWFzIFd1ZW5zY2hlCi0gKgljbG9zZWx5IHJlbGF0ZWQgdG8gdGhlIGFoYTE1NDIgZHJpdmVyIGZyb20gVG9tbXkgVGhvcm4KLSAqCSggYXMgY2xvc2UgYXMgZGlmZmVyZW50IGhhcmR3YXJlIGFsbG93cyBvbiBhIGxvd2xldmVsLWRyaXZlciA6LSkgKQotICoKLSAqICBSZXZpc2VkIChhbmQgcmVuYW1lZCkgYnkgSm9obiBCb3lkIDxib3lkQGNpcy5vaGlvLXN0YXRlLmVkdT4gdG8KLSAqICBhY2NvbW1vZGF0ZSBFcmljIFlvdW5nZGFsZSdzIG1vZGlmaWNhdGlvbnMgdG8gc2NzaS5jLiAgTm92IDE5OTIuCi0gKgotICogIEFkZGl0aW9uYWwgY2hhbmdlcyB0byBzdXBwb3J0IHNjYXR0ZXIvZ2F0aGVyLiAgRGVjLiAxOTkyLiAgdHcvamIKLSAqCi0gKiAgTm8gbG9uZ2VyIHRyaWVzIHRvIHJlc2V0IFNDU0kgYnVzIGF0IGJvb3QgKGl0IHdhc24ndCB3b3JraW5nIGFueXdheSkuCi0gKiAgUmV3cml0dGVuIHRvIHN1cHBvcnQgbXVsdGlwbGUgaG9zdCBhZGFwdGVycy4KLSAqICBNaXNjZWxsYW5lb3VzIGNsZWFudXAuCi0gKiAgU28gZmFyLCBzdGlsbCBkb2Vzbid0IGRvIHJlc2V0IG9yIGFib3J0IGNvcnJlY3RseSwgc2luY2UgSSBoYXZlIG5vIGlkZWEKLSAqICBob3cgdG8gZG8gdGhlbSB3aXRoIHRoaXMgYm9hcmQgKDheKC4gICAgICAgICAgICAgICAgICAgICAgSmFuIDE5OTQgamIKLSAqCi0gKiBUaGlzIGRyaXZlciBub3cgc3VwcG9ydHMgYm90aCBvZiB0aGUgdHdvIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb25zIChwZXIKLSAqIHRoZSAzLjM2IE93bmVyJ3MgTWFudWFsLCBteSBsYXRlc3QgcmVmZXJlbmNlKSBieSB0aGUgc2FtZSBtZXRob2QgYXMKLSAqIGJlZm9yZTsgbmFtZWx5LCBieSBsb29raW5nIGZvciBhIEJJT1Mgc2lnbmF0dXJlLiAgVGh1cywgdGhlIGxvY2F0aW9uIG9mCi0gKiB0aGUgQklPUyBzaWduYXR1cmUgZGV0ZXJtaW5lcyB0aGUgYm9hcmQgY29uZmlndXJhdGlvbi4gIFVudGlsIEkgaGF2ZQotICogdGltZSB0byBkbyBzb21ldGhpbmcgbW9yZSBmbGV4aWJsZSwgdXNlcnMgc2hvdWxkIHN0aWNrIHRvIG9uZSBvZiB0aGUKLSAqIGZvbGxvd2luZzoKLSAqCi0gKiBTdGFuZGFyZCBjb25maWd1cmF0aW9uIGZvciBzaW5nbGUtYWRhcHRlciBzeXN0ZW1zOgotICogICAgLSBCSU9TIGF0IENFMDBoCi0gKiAgICAtIEkvTyBiYXNlIGFkZHJlc3MgMzUwaAotICogICAgLSBJUlEgbGV2ZWwgMTUKLSAqICAgIC0gRE1BIGNoYW5uZWwgNgotICogU3RhbmRhcmQgY29uZmlndXJhdGlvbiBmb3IgYSBzZWNvbmQgYWRhcHRlciBpbiBhIHN5c3RlbToKLSAqICAgIC0gQklPUyBhdCBDODAwaAotICogICAgLSBJL08gYmFzZSBhZGRyZXNzIDMzMGgKLSAqICAgIC0gSVJRIGxldmVsIDExCi0gKiAgICAtIERNQSBjaGFubmVsIDUKLSAqCi0gKiBBbnlvbmUgd2hvIGNhbiByZWNvbXBpbGUgdGhlIGtlcm5lbCBpcyB3ZWxjb21lIHRvIGFkZCBvdGhlcnMgYXMgbmVlZAotICogYXJpc2VzLCBidXQgdW5wcmVkaWN0YWJsZSByZXN1bHRzIG1heSBvY2N1ciBpZiB0aGVyZSBhcmUgY29uZmxpY3RzLgotICogSW4gYW55IGV2ZW50LCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgYWRhcHRlcnMgaW4gYSBzeXN0ZW0sIHRoZXkgTVVTVAotICogdXNlIGRpZmZlcmVudCBJL08gYmFzZXMsIElSUSBsZXZlbHMsIGFuZCBETUEgY2hhbm5lbHMsIHNpbmNlIHRoZXkgd2lsbCBiZQotICogaW5kaXN0aW5ndWlzaGFibGUgKGFuZCBpbiBkaXJlY3QgY29uZmxpY3QpIG90aGVyd2lzZS4KLSAqCi0gKiAgIEFzIGEgcG9pbnQgb2YgaW5mb3JtYXRpb24sIHRoZSBOT19PUCBjb21tYW5kIHRvZ2dsZXMgdGhlIENNRF9SRFkgYml0Ci0gKiBvZiB0aGUgc3RhdHVzIHBvcnQsIGFuZCB0aGlzIGZhY3QgY291bGQgYmUgdXNlZCBhcyBhIHRlc3QgZm9yIHRoZSBJL08KLSAqIGJhc2UgYWRkcmVzcyAob3IgbW9yZSBnZW5lcmFsbHksIGJvYXJkIGRldGVjdGlvbikuICBUaGVyZSBpcyBhbiBpbnRlcnJ1cHQKLSAqIHN0YXR1cyBwb3J0LCBzbyBJUlEgcHJvYmluZyBjb3VsZCBhbHNvIGJlIGRvbmUuICBJIHN1cHBvc2UgdGhlIGZ1bGwKLSAqIERNQSBkaWFnbm9zdGljIGNvdWxkIGJlIHVzZWQgdG8gZGV0ZWN0IHRoZSBETUEgY2hhbm5lbCBiZWluZyB1c2VkLiAgSQotICogaGF2ZW4ndCBkb25lIGFueSBvZiB0aGlzLCB0aG91Z2gsIGJlY2F1c2UgSSB0aGluayB0aGVyZSdzIHRvbyBtdWNoIG9mCi0gKiBhIGNoYW5jZSB0aGF0IHN1Y2ggZXhwbG9yYXRpb25zIGNvdWxkIGJlIGRlc3RydWN0aXZlLCBpZiBzb21lIG90aGVyCi0gKiBib2FyZCdzIHJlc291cmNlcyBhcmUgdXNlZCBpbmFkdmVydGVudGx5LiAgU28sIGNhbGwgbWUgYSB3aW1wLCBidXQgSQotICogZG9uJ3Qgd2FudCB0byB0cnkgaXQuICBUaGUgb25seSBraW5kIG9mIGV4cGxvcmF0aW9uIEkgdHJ1c3QgaXMgbWVtb3J5Ci0gKiBleHBsb3JhdGlvbiwgc2luY2UgaXQncyBtb3JlIGNlcnRhaW4gdGhhdCByZWFkaW5nIG1lbW9yeSB3b24ndCBiZQotICogZGVzdHJ1Y3RpdmUuCi0gKgotICogTW9yZSB0byBteSBsaWtpbmcgd291bGQgYmUgYSBMSUxPIGJvb3QgY29tbWFuZCBsaW5lIHNwZWNpZmljYXRpb24sIHN1Y2gKLSAqIGFzIGlzIHVzZWQgYnkgdGhlIGFoYTE1MnggZHJpdmVyIChhbmQgcG9zc2libHkgb3RoZXJzKS4gIEknbGwgbG9vayBpbnRvCi0gKiBpdCwgYXMgSSBoYXZlIHRpbWUuLi4KLSAqCi0gKiAgIEkgZ2V0IG1haWwgb2NjYXNpb25hbGx5IGZyb20gcGVvcGxlIHdobyBlaXRoZXIgYXJlIHVzaW5nIG9yIGFyZQotICogY29uc2lkZXJpbmcgdXNpbmcgYSBXRDcwMDAgd2l0aCBMaW51eC4gIFRoZXJlIGlzIGEgdmFyaWV0eSBvZgotICogbm9tZW5jbGF0dXJlIGRlc2NyaWJpbmcgV0Q3MDAwJ3MuICBUbyB0aGUgYmVzdCBvZiBteSBrbm93bGVkZ2UsIHRoZQotICogZm9sbG93aW5nIGlzIGEgYnJpZWYgc3VtbWFyeSAoZnJvbSBhbiBvbGQgV0QgZG9jIC0gSSBkb24ndCB3b3JrIGZvcgotICogdGhlbSBvciBhbnl0aGluZyBsaWtlIHRoYXQpOgotICoKLSAqIFdENzAwMC1GQVNTVDI6IFRoaXMgaXMgYSBXRDcwMDAgYm9hcmQgd2l0aCB0aGUgcmVhbC1tb2RlIFNTVCBST00gQklPUwotICogICAgICAgIGluc3RhbGxlZC4gIExhc3QgSSBoZWFyZCwgdGhlIEJJT1Mgd2FzIGFjdHVhbGx5IGRvbmUgYnkgQ29sdW1iaWEKLSAqICAgICAgICBEYXRhIFByb2R1Y3RzLiAgVGhlIEJJT1MgaXMgb25seSB1c2VkIGJ5IHRoaXMgZHJpdmVyIChhbmQgdGh1cwotICogICAgICAgIGJ5IExpbnV4KSB0byBpZGVudGlmeSB0aGUgYm9hcmQ7IG5vbmUgb2YgaXQgY2FuIGJlIGV4ZWN1dGVkIHVuZGVyCi0gKiAgICAgICAgTGludXguCi0gKgotICogV0Q3MDAwLUFTQzogVGhpcyBpcyB0aGUgb3JpZ2luYWwgYWRhcHRlciBib2FyZCwgd2l0aCBvciB3aXRob3V0IEJJT1MuCi0gKiAgICAgICAgVGhlIGJvYXJkIHVzZXMgYSBXRDMzQzkzIG9yIFdEMzNDOTNBIFNCSUMsIHdoaWNoIGluIHR1cm4gaXMKLSAqICAgICAgICBjb250cm9sbGVkIGJ5IGFuIG9uYm9hcmQgWjgwIHByb2Nlc3Nvci4gIFRoZSBib2FyZCBpbnRlcmZhY2UKLSAqICAgICAgICB2aXNpYmxlIHRvIHRoZSBob3N0IENQVSBpcyBkZWZpbmVkIGVmZmVjdGl2ZWx5IGJ5IHRoZSBaODAncwotICogICAgICAgIGZpcm13YXJlLCBhbmQgaXQgaXMgdGhpcyBmaXJtd2FyZSdzIHJldmlzaW9uIGxldmVsIHRoYXQgaXMKLSAqICAgICAgICBkZXRlcm1pbmVkIGFuZCByZXBvcnRlZCBieSB0aGlzIGRyaXZlci4gIChUaGUgdmVyc2lvbiBvZiB0aGUKLSAqICAgICAgICBvbi1ib2FyZCBCSU9TIGlzIG9mIG5vIGludGVyZXN0IHdoYXRzb2V2ZXIuKSAgVGhlIGhvc3QgQ1BVIGhhcwotICogICAgICAgIG5vIGFjY2VzcyB0byB0aGUgU0JJQzsgaGVuY2UgdGhlIGZhY3QgdGhhdCBpdCBpcyBhIFdEMzNDOTMgaXMKLSAqICAgICAgICBhbHNvIG9mIG5vIGludGVyZXN0IHRvIHRoaXMgZHJpdmVyLgotICoKLSAqIFdENzAwMC1BWDoKLSAqIFdENzAwMC1NWDoKLSAqIFdENzAwMC1FWDogVGhlc2UgYXJlIG5ld2VyIHZlcnNpb25zIG9mIHRoZSBXRDcwMDAtQVNDLiAgVGhlIC1BU0MgaXMKLSAqICAgICAgICBsYXJnZWx5IGJ1aWx0IGZyb20gZGlzY3JldGUgY29tcG9uZW50czsgdGhlc2UgYm9hcmRzIHVzZSBtb3JlCi0gKiAgICAgICAgaW50ZWdyYXRpb24uICBUaGUgLUFYIGlzIGFuIElTQSBidXMgYm9hcmQgKGxpa2UgdGhlIC1BU0MpLAotICogICAgICAgIHRoZSAtTVggaXMgYW4gTUNBIChpLmUuLCBQUy8yKSBidXMgYm9hcmQpLCBhbmQgdGhlIC1FWCBpcyBhbgotICogICAgICAgIEVJU0EgYnVzIGJvYXJkLgotICoKLSAqICBBdCB0aGUgdGltZSBvZiBteSBkb2N1bWVudGF0aW9uLCB0aGUgLT9YIGJvYXJkcyB3ZXJlICJmdXR1cmUiIHByb2R1Y3RzLAotICogIGFuZCB3ZXJlIG5vdCB5ZXQgYXZhaWxhYmxlLiAgSG93ZXZlciwgSSB2YWd1ZWx5IHJlY2FsbCB0aGF0IFRob21hcwotICogIFd1ZW5zY2hlIGhhZCBhbiAtQVgsIHNvIEkgYmVsaWV2ZSBhdCBsZWFzdCBpdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcwotICogIGRyaXZlci4gIEkgaGF2ZSBubyBwZXJzb25hbCBrbm93bGVkZ2Ugb2YgZWl0aGVyIC1NWCBvciAtRVggYm9hcmRzLgotICoKLSAqICBQLlMuIEp1c3QgcmVjZW50bHksIEkndmUgZGlzY292ZXJlZCAoZGlyZWN0bHkgZnJvbSBXRCBhbmQgRnV0dXJlCi0gKiAgRG9tYWluKSB0aGF0IGFsbCBidXQgdGhlIFdENzAwMC1FWCBoYXZlIGJlZW4gb3V0IG9mIHByb2R1Y3Rpb24gZm9yCi0gKiAgdHdvIHllYXJzIG5vdy4gIEZEIGhhcyBwcm9kdWN0aW9uIHJpZ2h0cyB0byB0aGUgNzAwMC1FWCwgYW5kIGFyZQotICogIHByb2R1Y2luZyBpdCB1bmRlciBhIG5ldyBuYW1lLCBhbmQgd2l0aCBhIG5ldyBCSU9TLiAgSWYgYW55b25lIGhhcwotICogIG9uZSBvZiB0aGUgRkQgYm9hcmRzLCBpdCB3b3VsZCBiZSBuaWNlIHRvIGNvbWUgdXAgd2l0aCBhIHNpZ25hdHVyZQotICogIGZvciBpdC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKLkIuIEphbiAxOTk0LgotICoKLSAqCi0gKiAgUmV2aXNpb25zIGJ5IE1pcm9zbGF2IFphZ29yYWMgPHphZ2FAZmx5LmNjLmZlci5ocj4KLSAqCi0gKiAgMDgvMjQvMTk5Ni4KLSAqCi0gKiAgRW5oYW5jZW1lbnQgZm9yIHdkNzAwMF9kZXRlY3QgZnVuY3Rpb24gaGFzIGJlZW4gbWFkZSwgc28geW91IGRvbid0IGhhdmUKLSAqICB0byBlbnRlciBCSU9TIFJPTSBhZGRyZXNzIGluIGluaXRpYWxpc2F0aW9uIGRhdGEgKHNlZSBzdHJ1Y3QgQ29uZmlnKS4KLSAqICBXZSBjYW5ub3QgZGV0ZWN0IElSUSwgRE1BIGFuZCBJL08gYmFzZSBhZGRyZXNzIGZvciBub3csIHNvIHdlIGhhdmUgdG8KLSAqICBlbnRlciB0aGVtIGFzIGFyZ3VtZW50cyB3aGlsZSB3ZF83MDAwIGlzIGRldGVjdGVkLiBJZiBzb21lb25lIGhhcyBJUlEsCi0gKiAgRE1BIG9yIEkvTyBiYXNlIGFkZHJlc3Mgc2V0IHRvIHNvbWUgb3RoZXIgdmFsdWUsIGhlIGNhbiBlbnRlciB0aGVtIGluCi0gKiAgY29uZmlndXJhdGlvbiB3aXRob3V0IGFueSBwcm9ibGVtLiBBbHNvIEkgd3JvdGUgYSBmdW5jdGlvbiB3ZDcwMDBfc2V0dXAsCi0gKiAgc28gbm93IHlvdSBjYW4gZW50ZXIgV0QtNzAwMCBkZWZpbml0aW9uIGFzIGtlcm5lbCBhcmd1bWVudHMsCi0gKiAgYXMgaW4gbGlsby5jb25mOgotICoKLSAqICAgICBhcHBlbmQ9IndkNzAwMD1JUlEsRE1BLElPIgotICoKLSAqICBQUzogSWYgY2FyZCBCSU9TIFJPTSBpcyBkaXNhYmxlZCwgZnVuY3Rpb24gd2Q3MDAwX2RldGVjdCBub3cgd2lsbCByZWNvZ25pemUKLSAqICAgICAgYWRhcHRlciwgdW5saWtlIHRoZSBvbGQgb25lLiBBbnl3YXksIEJJT1MgUk9NIGZyb20gV0Q3MDAwIGFkYXB0ZXIgaXMKLSAqICAgICAgdXNlbGVzcyBmb3IgTGludXguIEJeKQotICoKLSAqCi0gKiAgMDkvMDYvMTk5Ni4KLSAqCi0gKiAgQXV0b2RldGVjdGluZyBvZiBJL08gYmFzZSBhZGRyZXNzIGZyb20gd2Q3MDAwX2RldGVjdCBmdW5jdGlvbiBpcyByZW1vdmVkLAotICogIHNvbWUgbGl0dGxlIGJ1Z3MgcmVtb3ZlZCwgZXRjLi4uCi0gKgotICogIFRoYW5rcyB0byBSb2dlciBTY290dCBmb3IgZHJpdmVyIGRlYnVnZ2luZy4KLSAqCi0gKiAgMDYvMDcvMTk5NwotICoKLSAqICBBZGRlZCBzdXBwb3J0IGZvciAvcHJvYyBmaWxlIHN5c3RlbSAoL3Byb2Mvc2NzaS93ZDcwMDAvWzAuLi5dIGZpbGVzKS4KLSAqICBOb3csIGRyaXZlciBjYW4gaGFuZGxlIGhhcmQgZGlza3Mgd2l0aCBjYXBhY2l0eSA+MUdCLgotICoKLSAqICAwMS8xNS8xOTk4Ci0gKgotICogIEFkZGVkIHN1cHBvcnQgZm9yIEJVU19PTiBhbmQgQlVTX09GRiBwYXJhbWV0ZXJzIGluIGNvbmZpZyBsaW5lLgotICogIE1pc2NlbGxhbmVvdXMgY2xlYW51cC4KLSAqCi0gKiAgMDMvMDEvMTk5OAotICoKLSAqICBXRDcwMDAgZHJpdmVyIG5vdyB3b3JrIG9uIGtlcm5lbHMgPj0gMi4xLngKLSAqCi0gKgotICogMTIvMzEvMjAwMSAtIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgotICoKLSAqIHVzZSBob3N0LT5ob3N0X2xvY2ssIG5vdCBpb19yZXF1ZXN0X2xvY2ssIGNsZWFudXBzCi0gKgotICogMjAwMi8xMC8wNCAtIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+Ci0gKgotICogVXNlIGRldl9pZCBmb3IgaW50ZXJydXB0cywga2lsbCBfX2Z1bmNfXyBwYXN0aW5nCi0gKiBBZGQgYSBsb2NrIGZvciB0aGUgc2NiIHBvb2wsIGNsZWFuIHVwIGFsbCBvdGhlciBjbGkvc3RpIHVzYWdlIHN0dWZmCi0gKiBVc2UgdGhlIGFkYXB0ZXIgbG9jayBmb3IgdGhlIG90aGVyIHBsYWNlcyB3ZSBoYWQgdGhlIGNsaSdzCi0gKgotICogMjAwMi8xMC8wNiAtIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+Ci0gKgotICogU3dpdGNoIHRvIG5ldyBzdHlsZSBlcnJvciBoYW5kbGluZwotICogQ2xlYW4gdXAgZGVsYXkgdG8gdWRlbGF5LCBhbmQgeWllbGRpbmcgc2xlZXBzCi0gKiBNYWtlIGhvc3QgcmVzZXQgYWN0dWFsbHkgcmVzZXQgdGhlIGNhcmQKLSAqIE1ha2UgZXZlcnl0aGluZyBzdGF0aWMKLSAqCi0gKiAyMDAzLzAyLzEyIC0gQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgotICoKLSAqIENsZWFuZWQgdXAgaG9zdCB0ZW1wbGF0ZSBkZWZpbml0aW9uCi0gKiBSZW1vdmVkIG5vdyBvYnNvbGV0ZSB3ZDcwMDAuaAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0jaW5jbHVkZSA8YXNtL2RtYS5oPgotCi0jaW5jbHVkZSA8c2NzaS9zY3NpLmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KLQotCi0jdW5kZWYgIFdENzAwMF9ERUJVRwkJLyogZ2VuZXJhbCBkZWJ1ZyAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFdENzAwMF9ERUJVRwotI2RlZmluZSBkcHJpbnRrIHByaW50awotI2Vsc2UKLSNkZWZpbmUgZHByaW50awlub19wcmludGsKLSNlbmRpZgotCi0vKgotICogIE1haWxib3ggc3RydWN0dXJlIHNpemVzLgotICogIEkgcHJlZmVyIHRvIGtlZXAgdGhlIG51bWJlciBvZiBJQ01CcyBtdWNoIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YKLSAqICBPR01Ccy4gIE9HTUJzIGFyZSB1c2VkIHZlcnkgcXVpY2tseSBieSB0aGUgZHJpdmVyIHRvIHN0YXJ0IG9uZSBvcgotICogIG1vcmUgY29tbWFuZHMsIHdoaWxlIElDTUJzIGFyZSB1c2VkIGJ5IHRoZSBob3N0IGFkYXB0ZXIgcGVyIGNvbW1hbmQuCi0gKi8KLSNkZWZpbmUgT0dNQl9DTlQJMTYKLSNkZWZpbmUgSUNNQl9DTlQJMzIKLQotLyoKLSAqICBTY2IncyBhcmUgc2hhcmVkIGJ5IGFsbCBhY3RpdmUgYWRhcHRlcnMuICBTbywgaWYgdGhleSBhbGwgYmVjb21lIGJ1c3ksCi0gKiAgY2FsbGVycyBtYXkgYmUgbWFkZSB0byB3YWl0IGluIGFsbG9jX3NjYnMgZm9yIHRoZW0gdG8gZnJlZS4gIFRoYXQgY2FuCi0gKiAgYmUgYXZvaWRlZCBieSBzZXR0aW5nIE1BWF9TQ0JTIHRvIE5VTV9DT05GSUcgKiBXRDcwMDBfUS4gIElmIHlvdSdkCi0gKiAgcmF0aGVyIGNvbnNlcnZlIG1lbW9yeSwgdXNlIGEgc21hbGxlciBudW1iZXIgKD4gMCwgb2YgY291cnNlKSAtIHRoaW5ncwotICogIHdpbGwgc2hvdWxkIHN0aWxsIHdvcmsgT0suCi0gKi8KLSNkZWZpbmUgTUFYX1NDQlMgICAgICAgIDMyCi0KLS8qCi0gKiAgSW4gdGhpcyB2ZXJzaW9uLCBzZ190YWJsZXNpemUgbm93IGRlZmF1bHRzIHRvIFdENzAwMF9TRywgYW5kIHdpbGwKLSAqICBiZSBzZXQgdG8gU0dfTk9ORSBmb3Igb2xkZXIgYm9hcmRzLiAgVGhpcyBpcyB0aGUgcmV2ZXJzZSBvZiB0aGUKLSAqICBwcmV2aW91cyBkZWZhdWx0LCBhbmQgd2FzIGNoYW5nZWQgc28gdGhhdCB0aGUgZHJpdmVyLWxldmVsCi0gKiAgc2NzaV9ob3N0X3RlbXBsYXRlIHdvdWxkIHJlZmxlY3QgdGhlIGRyaXZlcidzIHN1cHBvcnQgZm9yIHNjYXR0ZXIvCi0gKiAgZ2F0aGVyLgotICoKLSAqICBBbHNvLCBpdCBoYXMgYmVlbiByZXBvcnRlZCB0aGF0IGJvYXJkcyBhdCBSZXZpc2lvbiA2IHN1cHBvcnQgc2NhdHRlci8KLSAqICBnYXRoZXIsIHNvIHRoZSBuZXcgZGVmaW5pdGlvbiBvZiBhbiAib2xkZXIiIGJvYXJkIGhhcyBiZWVuIGNoYW5nZWQKLSAqICBhY2NvcmRpbmdseS4KLSAqLwotI2RlZmluZSBXRDcwMDBfUQkxNgotI2RlZmluZSBXRDcwMDBfU0cJMTYKLQotCi0vKgotICogIFdENzAwMC1zcGVjaWZpYyBtYWlsYm94IHN0cnVjdHVyZQotICoKLSAqLwotdHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgbWFpbGJveCB7Ci0JdW5jaGFyIHN0YXR1czsKLQl1bmNoYXIgc2NicHRyWzNdOwkvKiBTQ1NJLXN0eWxlIC0gTVNCIGZpcnN0IChiaWcgZW5kaWFuKSAqLwotfSBNYWlsYm94OwotCi0vKgotICogIFRoaXMgc3RydWN0dXJlIHNob3VsZCBjb250YWluIGFsbCBwZXItYWRhcHRlciBnbG9iYWwgZGF0YS4gIEkuZS4sIGFueQotICogIG5ldyBnbG9iYWwgcGVyLWFkYXB0ZXIgZGF0YSBzaG91bGQgcHV0IGluIGhlcmUuCi0gKi8KLXR5cGVkZWYgc3RydWN0IGFkYXB0ZXIgewotCXN0cnVjdCBTY3NpX0hvc3QgKnNoOwkvKiBQb2ludGVyIHRvIFNjc2lfSG9zdCBzdHJ1Y3R1cmUgICAgKi8KLQlpbnQgaW9iYXNlOwkJLyogVGhpcyBhZGFwdGVyJ3MgSS9PIGJhc2UgYWRkcmVzcyAgICovCi0JaW50IGlycTsJCS8qIFRoaXMgYWRhcHRlcidzIElSUSBsZXZlbCAgICAgICAgICAqLwotCWludCBkbWE7CQkvKiBUaGlzIGFkYXB0ZXIncyBETUEgY2hhbm5lbCAgICAgICAgKi8KLQlpbnQgaW50X2NvdW50ZXI7CS8qIFRoaXMgYWRhcHRlcidzIGludGVycnVwdCBjb3VudGVyICAqLwotCWludCBidXNfb247CQkvKiBUaGlzIGFkYXB0ZXIncyBCVVNfT04gdGltZSAgICAgICAgKi8KLQlpbnQgYnVzX29mZjsJCS8qIFRoaXMgYWRhcHRlcidzIEJVU19PRkYgdGltZSAgICAgICAqLwotCXN0cnVjdCB7CQkvKiBUaGlzIGFkYXB0ZXIncyBtYWlsYm94ZXMgICAgICAgICAgKi8KLQkJTWFpbGJveCBvZ21iW09HTUJfQ05UXTsJLyogT3V0Z29pbmcgbWFpbGJveGVzICAgICAgICAgICAgICAgICovCi0JCU1haWxib3ggaWNtYltJQ01CX0NOVF07CS8qIEluY29taW5nIG1haWxib3hlcyAgICAgICAgICAgICAgICAqLwotCX0gbWI7Ci0JaW50IG5leHRfb2dtYjsJCS8qIHRvIHJlZHVjZSBjb250ZW50aW9uIGF0IG1haWxib3hlcyAqLwotCXVuY2hhciBjb250cm9sOwkJLyogc2hhZG93cyBDT05UUk9MIHBvcnQgdmFsdWUgICAgICAgICovCi0JdW5jaGFyIHJldjEsIHJldjI7CS8qIGZpbGxlZCBpbiBieSB3ZDcwMDBfcmV2aXNpb24gICAgICAqLwotfSBBZGFwdGVyOwotCi0vKgotICogKGxpbmVhcikgYmFzZSBhZGRyZXNzIGZvciBST00gQklPUwotICovCi1zdGF0aWMgY29uc3QgbG9uZyB3ZDcwMDBfYmlvc2FkZHJbXSA9IHsKLQkweGMwMDAwLCAweGMyMDAwLCAweGM0MDAwLCAweGM2MDAwLCAweGM4MDAwLCAweGNhMDAwLCAweGNjMDAwLCAweGNlMDAwLAotCTB4ZDAwMDAsIDB4ZDIwMDAsIDB4ZDQwMDAsIDB4ZDYwMDAsIDB4ZDgwMDAsIDB4ZGEwMDAsIDB4ZGMwMDAsIDB4ZGUwMDAKLX07Ci0jZGVmaW5lIE5VTV9BRERSUyBBUlJBWV9TSVpFKHdkNzAwMF9iaW9zYWRkcikKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdkNzAwMF9pb2Jhc2VbXSA9IHsKLQkweDAzMDAsIDB4MDMwOCwgMHgwMzEwLCAweDAzMTgsIDB4MDMyMCwgMHgwMzI4LCAweDAzMzAsIDB4MDMzOCwKLQkweDAzNDAsIDB4MDM0OCwgMHgwMzUwLCAweDAzNTgsIDB4MDM2MCwgMHgwMzY4LCAweDAzNzAsIDB4MDM3OCwKLQkweDAzODAsIDB4MDM4OCwgMHgwMzkwLCAweDAzOTgsIDB4MDNhMCwgMHgwM2E4LCAweDAzYjAsIDB4MDNiOCwKLQkweDAzYzAsIDB4MDNjOCwgMHgwM2QwLCAweDAzZDgsIDB4MDNlMCwgMHgwM2U4LCAweDAzZjAsIDB4MDNmOAotfTsKLSNkZWZpbmUgTlVNX0lPUE9SVFMgQVJSQVlfU0laRSh3ZDcwMDBfaW9iYXNlKQotCi1zdGF0aWMgY29uc3Qgc2hvcnQgd2Q3MDAwX2lycVtdID0geyAzLCA0LCA1LCA3LCA5LCAxMCwgMTEsIDEyLCAxNCwgMTUgfTsKLSNkZWZpbmUgTlVNX0lSUVMgQVJSQVlfU0laRSh3ZDcwMDBfaXJxKQotCi1zdGF0aWMgY29uc3Qgc2hvcnQgd2Q3MDAwX2RtYVtdID0geyA1LCA2LCA3IH07Ci0jZGVmaW5lIE5VTV9ETUFTIEFSUkFZX1NJWkUod2Q3MDAwX2RtYSkKLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgaXMgc2V0IHVwIGJ5IHdkNzAwMF9kZXRlY3QsIGFuZCB1c2VkIHRoZXJlYWZ0ZXIgZm9yCi0gKiBwcm9jIGFuZCBvdGhlciBnbG9iYWwgb29rdXBzCi0gKi8KLQotI2RlZmluZSBVTklUUwk4Ci1zdGF0aWMgc3RydWN0IFNjc2lfSG9zdCAqd2Q3MDAwX2hvc3RbVU5JVFNdOwotCi0jZGVmaW5lIEJVU19PTiAgICA2NAkJLyogeCAxMjVucyA9IDgwMDBucyAoQklPUyBkZWZhdWx0KSAqLwotI2RlZmluZSBCVVNfT0ZGICAgMTUJCS8qIHggMTI1bnMgPSAxODc1bnMgKEJJT1MgZGVmYXVsdCkgKi8KLQotLyoKLSAqICBTdGFuZGFyZCBBZGFwdGVyIENvbmZpZ3VyYXRpb25zIC0gdXNlZCBieSB3ZDcwMDBfZGV0ZWN0Ci0gKi8KLXR5cGVkZWYgc3RydWN0IHsKLQlzaG9ydCBpcnE7CQkvKiBJUlEgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQlzaG9ydCBkbWE7CQkvKiBETUEgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBpb2Jhc2U7CS8qIEkvTyBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXNob3J0IGJ1c19vbjsJCS8qIFRpbWUgdGhhdCBXRDcwMDAgc3BlbmRzIG9uIHRoZSBBVC1idXMgd2hlbiAqLwotCS8qIHRyYW5zZmVycmluZyBkYXRhLiBCSU9TIGRlZmF1bHQgaXMgODAwMG5zLiAqLwotCXNob3J0IGJ1c19vZmY7CQkvKiBUaW1lIHRoYXQgV0Q3MDAwIHNwZW5kcyBPRkYgVEhFIEJVUyBhZnRlciAgKi8KLQkvKiB3aGlsZSBpdCBpcyB0cmFuc2ZlcnJpbmcgZGF0YS4gICAgICAgICAgICAgKi8KLQkvKiBCSU9TIGRlZmF1bHQgaXMgMTg3NW5zICAgICAgICAgICAgICAgICAgICAgKi8KLX0gQ29uZmlnOwotCi0vKgotICogQWRkIGhlcmUgeW91ciBjb25maWd1cmF0aW9uLi4uCi0gKi8KLXN0YXRpYyBDb25maWcgY29uZmlnc1tdID0gewotCXsxNSwgNiwgMHgzNTAsIEJVU19PTiwgQlVTX09GRn0sCS8qIGRlZmF1bHRzIGZvciBzaW5nbGUgYWRhcHRlciAqLwotCXsxMSwgNSwgMHgzMjAsIEJVU19PTiwgQlVTX09GRn0sCS8qIGRlZmF1bHRzIGZvciBzZWNvbmQgYWRhcHRlciAqLwotCXs3LCA2LCAweDM1MCwgQlVTX09OLCBCVVNfT0ZGfSwJLyogTXkgY29uZmlndXJhdGlvbiAoWmFnYSkgICAgICovCi0Jey0xLCAtMSwgMHgwLCBCVVNfT04sIEJVU19PRkZ9CS8qIEVtcHR5IHNsb3QgICAgICAgICAgICAgICAgICAqLwotfTsKLSNkZWZpbmUgTlVNX0NPTkZJR1MgQVJSQVlfU0laRShjb25maWdzKQotCi0vKgotICogIFRoZSBmb2xsb3dpbmcgbGlzdCBkZWZpbmVzIHN0cmluZ3MgdG8gbG9vayBmb3IgaW4gdGhlIEJJT1MgdGhhdCBpZGVudGlmeQotICogIGl0IGFzIHRoZSBXRDcwMDAtRkFTU1QyIFNTVCBCSU9TLiAgSSBzdXNwZWN0IHRoYXQgc29tZXRoaW5nIHNob3VsZCBiZQotICogIGFkZGVkIGZvciB0aGUgRnV0dXJlIERvbWFpbiB2ZXJzaW9uLgotICovCi10eXBlZGVmIHN0cnVjdCBzaWduYXR1cmUgewotCWNvbnN0IGNoYXIgKnNpZzsJLyogU3RyaW5nIHRvIGxvb2sgZm9yICAgICAgICAgICAgKi8KLQl1bnNpZ25lZCBsb25nIG9mczsJLyogb2Zmc2V0IGZyb20gQklPUyBiYXNlIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBsZW47CQkvKiBsZW5ndGggb2Ygc3RyaW5nICAgICAgICAgICAgICAqLwotfSBTaWduYXR1cmU7Ci0KLXN0YXRpYyBjb25zdCBTaWduYXR1cmUgc2lnbmF0dXJlc1tdID0gewotCXsiU1NUQklPUyIsIDB4MDAwMGQsIDd9CS8qICJTU1RCSU9TIiBAIG9mZnNldCAweDAwMDBkICovCi19OwotI2RlZmluZSBOVU1fU0lHTkFUVVJFUyBBUlJBWV9TSVpFKHNpZ25hdHVyZXMpCi0KLQotLyoKLSAqICBJL08gUG9ydCBPZmZzZXRzIGFuZCBCaXQgRGVmaW5pdGlvbnMKLSAqICA0IGFkZHJlc3NlcyBhcmUgdXNlZC4gIFRob3NlIG5vdCBkZWZpbmVkIGhlcmUgYXJlIHJlc2VydmVkLgotICovCi0jZGVmaW5lIEFTQ19TVEFUICAgICAgICAwCS8qIFN0YXR1cywgIFJlYWQgICAgICAgICAgKi8KLSNkZWZpbmUgQVNDX0NPTU1BTkQgICAgIDAJLyogQ29tbWFuZCwgV3JpdGUgICAgICAgICAqLwotI2RlZmluZSBBU0NfSU5UUl9TVEFUICAgMQkvKiBJbnRlcnJ1cHQgU3RhdHVzLCBSZWFkICovCi0jZGVmaW5lIEFTQ19JTlRSX0FDSyAgICAxCS8qIEFja25vd2xlZGdlLCBXcml0ZSAgICAgKi8KLSNkZWZpbmUgQVNDX0NPTlRST0wgICAgIDIJLyogQ29udHJvbCwgV3JpdGUgICAgICAgICAqLwotCi0vKgotICogQVNDIFN0YXR1cyBQb3J0Ci0gKi8KLSNkZWZpbmUgSU5UX0lNCQkweDgwCS8qIEludGVycnVwdCBJbWFnZSBGbGFnICAgICAgICAgICAqLwotI2RlZmluZSBDTURfUkRZCQkweDQwCS8qIENvbW1hbmQgUG9ydCBSZWFkeSAgICAgICAgICAgICAqLwotI2RlZmluZSBDTURfUkVKCQkweDIwCS8qIENvbW1hbmQgUG9ydCBCeXRlIFJlamVjdGVkICAgICAqLwotI2RlZmluZSBBU0NfSU5JVCAgICAgICAgMHgxMAkvKiBBU0MgSW5pdGlhbGl6ZWQgRmxhZyAgICAgICAgICAgKi8KLSNkZWZpbmUgQVNDX1NUQVRNQVNLICAgIDB4ZjAJLyogVGhlIGxvd2VyIDQgQnl0ZXMgYXJlIHJlc2VydmVkICovCi0KLS8qCi0gKiBDT01NQU5EIG9wY29kZXMKLSAqCi0gKiAgVW5mb3J0dW5hdGVseSwgSSBoYXZlIG5vIGlkZWEgaG93IHRvIHByb3Blcmx5IHVzZSBzb21lIG9mIHRoZXNlIGNvbW1hbmRzLAotICogIGFzIHRoZSBPRU0gbWFudWFsIGRvZXMgbm90IG1ha2UgaXQgY2xlYXIuICBJIGhhdmUgbm90IGJlZW4gYWJsZSB0byB1c2UKLSAqICBlbmFibGUvZGlzYWJsZSB1bnNvbGljaXRlZCBpbnRlcnJ1cHRzIG9yIHRoZSByZXNldCBjb21tYW5kcyB3aXRoIGFueQotICogIGRpc2Nlcm5pYmxlIGVmZmVjdCB3aGF0c29ldmVyLiAgSSB0aGluayB0aGV5IG1heSBiZSByZWxhdGVkIHRvIGNlcnRhaW4KLSAqICBJQ0IgY29tbWFuZHMsIGJ1dCBhZ2FpbiwgdGhlIE9FTSBtYW51YWwgZG9lc24ndCBtYWtlIHRoYXQgY2xlYXIuCi0gKi8KLSNkZWZpbmUgTk9fT1AgICAgICAgICAgICAgMAkvKiBOTy1PUCB0b2dnbGVzIENNRF9SRFkgYml0IGluIEFTQ19TVEFUICAqLwotI2RlZmluZSBJTklUSUFMSVpBVElPTiAgICAxCS8qIGluaXRpYWxpemF0aW9uICgxMCBieXRlcykgICAgICAgICAgICAgICovCi0jZGVmaW5lIERJU0FCTEVfVU5TX0lOVFIgIDIJLyogZGlzYWJsZSB1bnNvbGljaXRlZCBpbnRlcnJ1cHRzICAgICAgICAgKi8KLSNkZWZpbmUgRU5BQkxFX1VOU19JTlRSICAgMwkvKiBlbmFibGUgdW5zb2xpY2l0ZWQgaW50ZXJydXB0cyAgICAgICAgICAqLwotI2RlZmluZSBJTlRSX09OX0ZSRUVfT0dNQiA0CS8qIGludGVycnVwdCBvbiBmcmVlIE9HTUIgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNPRlRfUkVTRVQgICAgICAgIDUJLyogU0NTSSBidXMgc29mdCByZXNldCAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSEFSRF9SRVNFVF9BQ0sgICAgNgkvKiBTQ1NJIGJ1cyBoYXJkIHJlc2V0IGFja25vd2xlZGdlICAgICAgICAqLwotI2RlZmluZSBTVEFSVF9PR01CICAgICAgICAweDgwCS8qIHN0YXJ0IGNvbW1hbmQgaW4gT0dNQiAobikgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNDQU5fT0dNQlMgICAgICAgIDB4YzAJLyogc3RhcnQgbXVsdGlwbGUgY29tbWFuZHMsIHNpZ25hdHVyZSAobikgKi8KLQkJCQkvKiAgICB3aGVyZSAobikgPSBsb3dlciA2IGJpdHMgICAgICAgICAgICAqLwotLyoKLSAqIEZvciBJTklUSUFMSVpBVElPTjoKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgaW5pdENtZCB7Ci0JdW5jaGFyIG9wOwkJLyogY29tbWFuZCBvcGNvZGUgKD0gMSkgICAgICAgICAgICAgICAgICAgICovCi0JdW5jaGFyIElEOwkJLyogQWRhcHRlcidzIFNDU0kgSUQgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5jaGFyIGJ1c19vbjsJCS8qIEJ1cyBvbiB0aW1lLCB4IDEyNW5zIChzZWUgYmVsb3cpICAgICAgICAqLwotCXVuY2hhciBidXNfb2ZmOwkJLyogQnVzIG9mZiB0aW1lLCAiIiAgICAgICAgICIiICAgICAgICAgICAgICovCi0JdW5jaGFyIHJzdmQ7CQkvKiBSZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl1bmNoYXIgbWFpbGJveGVzWzNdOwkvKiBBZGRyZXNzIG9mIE1haWxib3hlcywgTVNCIGZpcnN0ICAgICAgICAgKi8KLQl1bmNoYXIgb2dtYnM7CQkvKiBOdW1iZXIgb2Ygb3V0Z29pbmcgTUJzLCBtYXggNjQsIDAsMSA9IDEgKi8KLQl1bmNoYXIgaWNtYnM7CQkvKiBOdW1iZXIgb2YgaW5jb21pbmcgTUJzLCAgICIiICAgICAgICIiICAgKi8KLX0gSW5pdENtZDsKLQotLyoKLSAqIEludGVycnVwdCBTdGF0dXMgUG9ydCAtIGFsc28gcmV0dXJucyBkaWFnbm9zdGljIGNvZGVzIGF0IEFTQyByZXNldAotICoKLSAqIGlmIG1zYiBpcyB6ZXJvLCB0aGUgbG93ZXIgYml0cyBhcmUgZGlhZ25vc3RpYyBzdGF0dXMKLSAqIERpYWdub3N0aWNzOgotICogMDEgICBObyBkaWFnbm9zdGljIGVycm9yIG9jY3VycmVkCi0gKiAwMiAgIFJBTSBmYWlsdXJlCi0gKiAwMyAgIEZJRk8gUi9XIGZhaWxlZAotICogMDQgICBTQklDIHJlZ2lzdGVyIHJlYWQvd3JpdGUgZmFpbGVkCi0gKiAwNSAgIEluaXRpYWxpemF0aW9uIEQtRkYgZmFpbGVkCi0gKiAwNiAgIEhvc3QgSVJRIEQtRkYgZmFpbGVkCi0gKiAwNyAgIFJPTSBjaGVja3N1bSBlcnJvcgotICogSW50ZXJydXB0IHN0YXR1cyAoYml0d2lzZSk6Ci0gKiAxME5OTk5OTiAgIG91dGdvaW5nIG1haWxib3ggTk5OTk5OIGlzIGZyZWUKLSAqIDExTk5OTk5OICAgaW5jb21pbmcgbWFpbGJveCBOTk5OTk4gbmVlZHMgc2VydmljZQotICovCi0jZGVmaW5lIE1CX0lOVFIgICAgMHhDMAkJLyogTWFpbGJveCBTZXJ2aWNlIHBvc3NpYmxlL3JlcXVpcmVkICovCi0jZGVmaW5lIElNQl9JTlRSICAgMHg0MAkJLyogMSBJbmNvbWluZyAvIDAgT3V0Z29pbmcgICAgICAgICAgICovCi0jZGVmaW5lIE1CX01BU0sgICAgMHgzZgkJLyogbWFzayBmb3IgbWFpbGJveCBudW1iZXIgICAgICAgICAgICovCi0KLS8qCi0gKiBDT05UUk9MIHBvcnQgYml0cwotICovCi0jZGVmaW5lIElOVF9FTiAgICAgMHgwOAkJLyogSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBETUFfRU4gICAgIDB4MDQJCS8qIERNQSBFbmFibGUgICAgICAgKi8KLSNkZWZpbmUgU0NTSV9SRVMgICAweDAyCQkvKiBTQ1NJIFJlc2V0ICAgICAgICovCi0jZGVmaW5lIEFTQ19SRVMgICAgMHgwMQkJLyogQVNDIFJlc2V0ICAgICAgICAqLwotCi0vKgotICogRHJpdmVyIGRhdGEgc3RydWN0dXJlczoKLSAqICAgLSBtYiBhbmQgc2NicyBhcmUgcmVxdWlyZWQgZm9yIGludGVyZmFjaW5nIHdpdGggdGhlIGhvc3QgYWRhcHRlci4KLSAqICAgICBBbiBTQ0IgaGFzIGV4dHJhIGZpZWxkcyBub3QgdmlzaWJsZSB0byB0aGUgYWRhcHRlcjsgbWIncwotICogICAgIF9jYW5ub3RfIGRvIHRoaXMsIHNpbmNlIHRoZSBhZGFwdGVyIGFzc3VtZXMgdGhleSBhcmUgY29udGlndW91cyBpbgotICogICAgIG1lbW9yeSwgNCBieXRlcyBlYWNoLCB3aXRoIElDTUJzIGZvbGxvd2luZyBPR01CcywgYW5kIHVzZXMgdGhpcyBmYWN0Ci0gKiAgICAgdG8gYWNjZXNzIHRoZW0uCi0gKiAgIC0gQW4gaWNiIGlzIGZvciBob3N0LW9ubHkgKG5vbi1TQ1NJKSBjb21tYW5kcy4gIElDQnMgYXJlIDE2IGJ5dGVzIGVhY2g7Ci0gKiAgICAgdGhlIGFkZGl0aW9uYWwgYnl0ZXMgYXJlIHVzZWQgb25seSBieSB0aGUgZHJpdmVyLgotICogICAtIEZvciBub3csIGEgcG9vbCBvZiBTQ0JzIGFyZSBrZXB0IGluIGdsb2JhbCBzdG9yYWdlIGJ5IHRoaXMgZHJpdmVyLAotICogICAgIGFuZCBhcmUgYWxsb2NhdGVkIGFuZCBmcmVlZCBhcyBuZWVkZWQuCi0gKgotICogIFRoZSA3MDAwLUZBU1NUMiBtYXJrcyBPR01CcyBlbXB0eSBhcyBzb29uIGFzIGl0IGhhcyBfc3RhcnRlZF8gYSBjb21tYW5kLAotICogIG5vdCB3aGVuIGl0IGhhcyBmaW5pc2hlZC4gIFNpbmNlIHRoZSBTQ0IgbXVzdCBiZSBhcm91bmQgZm9yIGNvbXBsZXRpb24sCi0gKiAgcHJvYmxlbXMgYXJpc2Ugd2hlbiBTQ0JzIGNvcnJlc3BvbmQgdG8gT0dNQnMsIHdoaWNoIG1heSBiZSByZWFsbG9jYXRlZAotICogIGVhcmxpZXIgKG9yIGRlbGF5ZWQgdW5uZWNlc3NhcmlseSB1bnRpbCBhIGNvbW1hbmQgY29tcGxldGVzKS4KLSAqICBNYWlsYm94ZXMgYXJlIHVzZWQgYXMgdHJhbnNpZW50IGRhdGEgc3RydWN0dXJlcywgc2ltcGx5IGZvcgotICogIGNhcnJ5aW5nIFNDQiBhZGRyZXNzZXMgdG8vZnJvbSB0aGUgNzAwMC1GQVNTVDIuCi0gKgotICogIE5vdGUgYWxzbyBzaW5jZSBTQ0JzIGFyZSBub3QgInBlcm1hbmVudGx5IiBhc3NvY2lhdGVkIHdpdGggbWFpbGJveGVzLAotICogIHRoZXJlIGlzIG5vIG5lZWQgdG8ga2VlcCBhIGdsb2JhbCBsaXN0IG9mIHNjc2lfY21uZCBwb2ludGVycyBpbmRleGVkCi0gKiAgYnkgT0dNQi4gICBBZ2FpbiwgU0NCcyByZWZlcmVuY2UgdGhlaXIgc2NzaV9jbW5kcyBkaXJlY3RseSwgc28gbWFpbGJveAotICogIGluZGljZXMgbmVlZCBub3QgYmUgaW52b2x2ZWQuCi0gKi8KLQotLyoKLSAqICBXRDcwMDAtc3BlY2lmaWMgc2NhdHRlci9nYXRoZXIgZWxlbWVudCBzdHJ1Y3R1cmUKLSAqLwotdHlwZWRlZiBzdHJ1Y3Qgc2diIHsKLQl1bmNoYXIgbGVuWzNdOwotCXVuY2hhciBwdHJbM107CQkvKiBBbHNvIFNDU0ktc3R5bGUgLSBNU0IgZmlyc3QgKi8KLX0gU2diOwotCi10eXBlZGVmIHN0cnVjdCBzY2IgewkJLyogQ29tbWFuZCBDb250cm9sIEJsb2NrIDUuNC4xICAgICAgICAgICAgICAgKi8KLQl1bmNoYXIgb3A7CQkvKiBDb21tYW5kIENvbnRyb2wgQmxvY2sgT3BlcmF0aW9uIENvZGUgICAgICAqLwotCXVuY2hhciBpZGx1bjsJCS8qIG9wPTAsMjpUYXJnZXQgSWQsIG9wPTE6SW5pdGlhdG9yIElkICAgICAgICovCi0JLyogT3V0Ym91bmQgZGF0YSB0cmFuc2ZlciwgbGVuZ3RoIGlzIGNoZWNrZWQgKi8KLQkvKiBJbmJvdW5kIGRhdGEgdHJhbnNmZXIsIGxlbmd0aCBpcyBjaGVja2VkICAqLwotCS8qIExvZ2ljYWwgVW5pdCBOdW1iZXIgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5jaGFyIGNkYlsxMl07CQkvKiBTQ1NJIENvbW1hbmQgQmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIFNDU0kgUmV0dXJuIFN0YXR1cyAgICAgICAgICAgICAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5jaGFyIHZ1ZTsJLyogVmVuZG9yIFVuaXF1ZSBFcnJvciBDb2RlICAgICAgICAgICAgICAgICAgKi8KLQl1bmNoYXIgbWF4bGVuWzNdOwkvKiBNYXhpbXVtIERhdGEgVHJhbnNmZXIgTGVuZ3RoICAgICAgICAgICAgICAqLwotCXVuY2hhciBkYXRhcHRyWzNdOwkvKiBTQ1NJIERhdGEgQmxvY2sgUG9pbnRlciAgICAgICAgICAgICAgICAgICAqLwotCXVuY2hhciBsaW5rcHRyWzNdOwkvKiBOZXh0IENvbW1hbmQgTGluayBQb2ludGVyICAgICAgICAgICAgICAgICAqLwotCXVuY2hhciBkaXJlYzsJCS8qIFRyYW5zZmVyIERpcmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICovCi0JdW5jaGFyIHJlc2VydmVkMls2XTsJLyogU0NTSSBDb21tYW5kIERlc2NyaXB0b3IgQmxvY2sgICAgICAgICAgICAgKi8KLQkvKiBlbmQgb2YgaGFyZHdhcmUgU0NCICAgICAgICAgICAgICAgICAgICAgICAqLwotCXN0cnVjdCBzY3NpX2NtbmQgKlNDcG50Oy8qIHNjc2lfY21uZCB1c2luZyB0aGlzIFNDQiAgICAgICAgICAgICAgICAgICovCi0JU2diIHNnYltXRDcwMDBfU0ddOwkvKiBTY2F0dGVyL2dhdGhlciBsaXN0IGZvciB0aGlzIFNDQiAgICAgICAgICAqLwotCUFkYXB0ZXIgKmhvc3Q7CQkvKiBob3N0IGFkYXB0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXN0cnVjdCBzY2IgKm5leHQ7CS8qIGZvciBsaXN0cyBvZiBzY2JzICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IFNjYjsKLQotLyoKLSAqICBUaGlzIGRyaXZlciBpcyB3cml0dGVuIHRvIGFsbG93IGhvc3Qtb25seSBjb21tYW5kcyB0byBiZSBleGVjdXRlZC4KLSAqICBUaGVzZSB1c2UgYSAxNi1ieXRlIGJsb2NrIGNhbGxlZCBhbiBJQ0IuICBUaGUgZm9ybWF0IGlzIGV4dGVuZGVkIGJ5IHRoZQotICogIGRyaXZlciB0byAxOCBieXRlcywgdG8gc3VwcG9ydCB0aGUgc3RhdHVzIHJldHVybmVkIGluIHRoZSBJQ01CIGFuZAotICogIGFuIGV4ZWN1dGlvbiBwaGFzZSBjb2RlLgotICoKLSAqICBUaGVyZSBhcmUgb3RoZXIgZm9ybWF0cyBiZXNpZGVzIHRoZXNlOyB0aGVzZSBhcmUgdGhlIG9uZXMgSSd2ZSB0cmllZAotICogIHRvIHVzZS4gIEZvcm1hdHMgZm9yIHNvbWUgb2YgdGhlIGRlZmluZWQgSUNCIG9wY29kZXMgYXJlIG5vdCBkZWZpbmVkCi0gKiAgKG5vdGFibHksIGdldC9zZXQgdW5zb2xpY2l0ZWQgaW50ZXJydXB0IHN0YXR1cykgaW4gbXkgY29weSBvZiB0aGUgT0VNCi0gKiAgbWFudWFsLCBhbmQgb3RoZXJzIGFyZSBhbWJpZ3VvdXMvaGFyZCB0byBmb2xsb3cuCi0gKi8KLSNkZWZpbmUgSUNCX09QX01BU0sgICAgICAgICAgIDB4ODAJLyogZGlzdGluZ3Vpc2hlcyBzY2JzIGZyb20gaWNicyAgICAgICAgKi8KLSNkZWZpbmUgSUNCX09QX09QRU5fUkJVRiAgICAgIDB4ODAJLyogb3BlbiByZWNlaXZlIGJ1ZmZlciAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUNCX09QX1JFQ1ZfQ01EICAgICAgIDB4ODEJLyogcmVjZWl2ZSBjb21tYW5kIGZyb20gaW5pdGlhdG9yICAgICAgKi8KLSNkZWZpbmUgSUNCX09QX1JFQ1ZfREFUQSAgICAgIDB4ODIJLyogcmVjZWl2ZSBkYXRhIGZyb20gaW5pdGlhdG9yICAgICAgICAgKi8KLSNkZWZpbmUgSUNCX09QX1JFQ1ZfU0RBVEEgICAgIDB4ODMJLyogcmVjZWl2ZSBkYXRhIHdpdGggc3RhdHVzIGZyb20gaW5pdC4gKi8KLSNkZWZpbmUgSUNCX09QX1NFTkRfREFUQSAgICAgIDB4ODQJLyogc2VuZCBkYXRhIHdpdGggc3RhdHVzIHRvIGluaXRpYXRvciAgKi8KLSNkZWZpbmUgSUNCX09QX1NFTkRfU1RBVCAgICAgIDB4ODYJLyogc2VuZCBjb21tYW5kIHN0YXR1cyB0byBpbml0aWF0b3IgICAgKi8KLQkJCQkJLyogMHg4NyBpcyByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUNCX09QX1JFQURfSU5JVCAgICAgIDB4ODgJLyogcmVhZCBpbml0aWFsaXphdGlvbiBieXRlcyAgICAgICAgICAgKi8KLSNkZWZpbmUgSUNCX09QX1JFQURfSUQgICAgICAgIDB4ODkJLyogcmVhZCBhZGFwdGVyJ3MgU0NTSSBJRCAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUNCX09QX1NFVF9VTUFTSyAgICAgIDB4OEEJLyogc2V0IHVuc29saWNpdGVkIGludGVycnVwdCBtYXNrICAgICAgKi8KLSNkZWZpbmUgSUNCX09QX0dFVF9VTUFTSyAgICAgIDB4OEIJLyogcmVhZCB1bnNvbGljaXRlZCBpbnRlcnJ1cHQgbWFzayAgICAgKi8KLSNkZWZpbmUgSUNCX09QX0dFVF9SRVZJU0lPTiAgIDB4OEMJLyogcmVhZCBmaXJtd2FyZSByZXZpc2lvbiBsZXZlbCAgICAgICAgKi8KLSNkZWZpbmUgSUNCX09QX0RJQUdOT1NUSUNTICAgIDB4OEQJLyogZXhlY3V0ZSBkaWFnbm9zdGljcyAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUNCX09QX1NFVF9FUEFSTVMgICAgIDB4OEUJLyogc2V0IGV4ZWN1dGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgKi8KLSNkZWZpbmUgSUNCX09QX0dFVF9FUEFSTVMgICAgIDB4OEYJLyogcmVhZCBleGVjdXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaWNiUmVjdkNtZCB7Ci0JdW5jaGFyIG9wOwotCXVuY2hhciBJRGx1bjsJCS8qIEluaXRpYXRvciBTQ1NJIElEL2x1biAgICAgKi8KLQl1bmNoYXIgbGVuWzNdOwkJLyogY29tbWFuZCBidWZmZXIgbGVuZ3RoICAgICAqLwotCXVuY2hhciBwdHJbM107CQkvKiBjb21tYW5kIGJ1ZmZlciBhZGRyZXNzICAgICovCi0JdW5jaGFyIHJzdmRbN107CQkvKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5jaGFyIHZ1ZTsJLyogdmVuZG9yLXVuaXF1ZSBlcnJvciBjb2RlICAqLwotCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIHJldHVybmVkIChpY21iKSBzdGF0dXMgICAgKi8KLQl2b2xhdGlsZSB1bmNoYXIgcGhhc2U7CS8qIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgKi8KLX0gSWNiUmVjdkNtZDsKLQotdHlwZWRlZiBzdHJ1Y3QgaWNiU2VuZFN0YXQgewotCXVuY2hhciBvcDsKLQl1bmNoYXIgSURsdW47CQkvKiBUYXJnZXQgU0NTSSBJRC9sdW4gICAgICAgICAgICAgICAgICAqLwotCXVuY2hhciBzdGF0OwkJLyogKG91dGdvaW5nKSBjb21wbGV0aW9uIHN0YXR1cyBieXRlIDEgKi8KLQl1bmNoYXIgcnN2ZFsxMl07CS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5jaGFyIHZ1ZTsJLyogdmVuZG9yLXVuaXF1ZSBlcnJvciBjb2RlICAgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bmNoYXIgc3RhdHVzOwkvKiByZXR1cm5lZCAoaWNtYikgc3RhdHVzICAgICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuY2hhciBwaGFzZTsJLyogdXNlZCBieSBpbnRlcnJ1cHQgaGFuZGxlciAgICAgICAgICAgKi8KLX0gSWNiU2VuZFN0YXQ7Ci0KLXR5cGVkZWYgc3RydWN0IGljYlJldkx2bCB7Ci0JdW5jaGFyIG9wOwotCXZvbGF0aWxlIHVuY2hhciBwcmltYXJ5OwkvKiBwcmltYXJ5IHJldmlzaW9uIGxldmVsIChyZXR1cm5lZCkgICAqLwotCXZvbGF0aWxlIHVuY2hhciBzZWNvbmRhcnk7CS8qIHNlY29uZGFyeSByZXZpc2lvbiBsZXZlbCAocmV0dXJuZWQpICovCi0JdW5jaGFyIHJzdmRbMTJdOwkvKiByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuY2hhciB2dWU7CS8qIHZlbmRvci11bmlxdWUgZXJyb3IgY29kZSAgICAgICAgICAgICovCi0Jdm9sYXRpbGUgdW5jaGFyIHN0YXR1czsJLyogcmV0dXJuZWQgKGljbWIpIHN0YXR1cyAgICAgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bmNoYXIgcGhhc2U7CS8qIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgICAgICAgICAgICovCi19IEljYlJldkx2bDsKLQotdHlwZWRlZiBzdHJ1Y3QgaWNiVW5zTWFzayB7CS8qIEknbSB0b3RhbGx5IGd1ZXNzaW5nIGhlcmUgKi8KLQl1bmNoYXIgb3A7Ci0Jdm9sYXRpbGUgdW5jaGFyIG1hc2tbMTRdOwkvKiBtYXNrIGJpdHMgICAgICAgICAgICAgICAgICovCi0jaWYgMAotCXVuY2hhciByc3ZkWzEyXTsJLyogcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAqLwotI2VuZGlmCi0Jdm9sYXRpbGUgdW5jaGFyIHZ1ZTsJLyogdmVuZG9yLXVuaXF1ZSBlcnJvciBjb2RlICAqLwotCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIHJldHVybmVkIChpY21iKSBzdGF0dXMgICAgKi8KLQl2b2xhdGlsZSB1bmNoYXIgcGhhc2U7CS8qIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgKi8KLX0gSWNiVW5zTWFzazsKLQotdHlwZWRlZiBzdHJ1Y3QgaWNiRGlhZyB7Ci0JdW5jaGFyIG9wOwotCXVuY2hhciB0eXBlOwkJLyogZGlhZ25vc3RpY3MgdHlwZSBjb2RlICgwLTMpICovCi0JdW5jaGFyIGxlblszXTsJCS8qIGJ1ZmZlciBsZW5ndGggICAgICAgICAgICAgICAqLwotCXVuY2hhciBwdHJbM107CQkvKiBidWZmZXIgYWRkcmVzcyAgICAgICAgICAgICAgKi8KLQl1bmNoYXIgcnN2ZFs3XTsJCS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAqLwotCXZvbGF0aWxlIHVuY2hhciB2dWU7CS8qIHZlbmRvci11bmlxdWUgZXJyb3IgY29kZSAgICAqLwotCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIHJldHVybmVkIChpY21iKSBzdGF0dXMgICAgICAqLwotCXZvbGF0aWxlIHVuY2hhciBwaGFzZTsJLyogdXNlZCBieSBpbnRlcnJ1cHQgaGFuZGxlciAgICovCi19IEljYkRpYWc7Ci0KLSNkZWZpbmUgSUNCX0RJQUdfUE9XRVJVUCAgIDAJLyogUG93ZXItdXAgZGlhZ3Mgb25seSAgICAgICAqLwotI2RlZmluZSBJQ0JfRElBR19XQUxLSU5HICAgMQkvKiB3YWxraW5nIDEncyBwYXR0ZXJuICAgICAgICovCi0jZGVmaW5lIElDQl9ESUFHX0RNQSAgICAgICAyCS8qIERNQSAtIHN5c3RlbSBtZW1vcnkgZGlhZ3MgKi8KLSNkZWZpbmUgSUNCX0RJQUdfRlVMTCAgICAgIDMJLyogZG8gYm90aCAxICYgMiAgICAgICAgICAgICAqLwotCi10eXBlZGVmIHN0cnVjdCBpY2JQYXJtcyB7Ci0JdW5jaGFyIG9wOwotCXVuY2hhciByc3ZkMTsJCS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgKi8KLQl1bmNoYXIgbGVuWzNdOwkJLyogcGFybXMgYnVmZmVyIGxlbmd0aCAgICAgICAqLwotCXVuY2hhciBwdHJbM107CQkvKiBwYXJtcyBidWZmZXIgYWRkcmVzcyAgICAgICovCi0JdW5jaGFyIGlkeFsyXTsJCS8qIGluZGV4IChNU0ItTFNCKSAgICAgICAgICAgKi8KLQl1bmNoYXIgcnN2ZDJbNV07CS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgKi8KLQl2b2xhdGlsZSB1bmNoYXIgdnVlOwkvKiB2ZW5kb3ItdW5pcXVlIGVycm9yIGNvZGUgICovCi0Jdm9sYXRpbGUgdW5jaGFyIHN0YXR1czsJLyogcmV0dXJuZWQgKGljbWIpIHN0YXR1cyAgICAqLwotCXZvbGF0aWxlIHVuY2hhciBwaGFzZTsJLyogdXNlZCBieSBpbnRlcnJ1cHQgaGFuZGxlciAqLwotfSBJY2JQYXJtczsKLQotdHlwZWRlZiBzdHJ1Y3QgaWNiQW55IHsKLQl1bmNoYXIgb3A7Ci0JdW5jaGFyIGRhdGFbMTRdOwkvKiBmb3JtYXQtc3BlY2lmaWMgZGF0YSAgICAgICovCi0Jdm9sYXRpbGUgdW5jaGFyIHZ1ZTsJLyogdmVuZG9yLXVuaXF1ZSBlcnJvciBjb2RlICAqLwotCXZvbGF0aWxlIHVuY2hhciBzdGF0dXM7CS8qIHJldHVybmVkIChpY21iKSBzdGF0dXMgICAgKi8KLQl2b2xhdGlsZSB1bmNoYXIgcGhhc2U7CS8qIHVzZWQgYnkgaW50ZXJydXB0IGhhbmRsZXIgKi8KLX0gSWNiQW55OwotCi10eXBlZGVmIHVuaW9uIGljYiB7Ci0JdW5jaGFyIG9wOwkJLyogSUNCIG9wY29kZSAgICAgICAgICAgICAgICAgICAgICovCi0JSWNiUmVjdkNtZCByZWN2X2NtZDsJLyogZm9ybWF0IGZvciByZWNlaXZlIGNvbW1hbmQgICAgICovCi0JSWNiU2VuZFN0YXQgc2VuZF9zdGF0OwkvKiBmb3JtYXQgZm9yIHNlbmQgc3RhdHVzICAgICAgICAgKi8KLQlJY2JSZXZMdmwgcmV2X2x2bDsJLyogZm9ybWF0IGZvciBnZXQgcmV2aXNpb24gbGV2ZWwgICovCi0JSWNiRGlhZyBkaWFnOwkJLyogZm9ybWF0IGZvciBleGVjdXRlIGRpYWdub3N0aWNzICovCi0JSWNiUGFybXMgZXBhcm1zOwkvKiBmb3JtYXQgZm9yIGdldC9zZXQgZXhlYyBwYXJtcyAgKi8KLQlJY2JBbnkgaWNiOwkJLyogZ2VuZXJpYyBmb3JtYXQgICAgICAgICAgICAgICAgICovCi0JdW5jaGFyIGRhdGFbMThdOwotfSBJY2I7Ci0KLSNpZmRlZiBNT0RVTEUKLXN0YXRpYyBjaGFyICp3ZDcwMDA7Ci1tb2R1bGVfcGFyYW0od2Q3MDAwLCBjaGFycCwgMCk7Ci0jZW5kaWYKLQotLyoKLSAqICBEcml2ZXIgU0NCIHN0cnVjdHVyZSBwb29sLgotICoKLSAqICBUaGUgU0NCcyBkZWNsYXJlZCBoZXJlIGFyZSBzaGFyZWQgYnkgYWxsIGhvc3QgYWRhcHRlcnM7IGhlbmNlLCB0aGlzCi0gKiAgc3RydWN0dXJlIGlzIG5vdCBwYXJ0IG9mIHRoZSBBZGFwdGVyIHN0cnVjdHVyZS4KLSAqLwotc3RhdGljIFNjYiBzY2JzW01BWF9TQ0JTXTsKLXN0YXRpYyBTY2IgKnNjYmZyZWU7CQkvKiBmcmVlIGxpc3QgICAgICAgICAqLwotc3RhdGljIGludCBmcmVlc2NicyA9IE1BWF9TQ0JTOwkvKiBmcmVlIGxpc3QgY291bnRlciAqLwotc3RhdGljIHNwaW5sb2NrX3Qgc2NicG9vbF9sb2NrOwkvKiBndWFyZHMgdGhlIHNjYiBmcmVlIGxpc3QgYW5kIGNvdW50ICovCi0KLS8qCi0gKiAgRU5EIG9mIGRhdGEvZGVjbGFyYXRpb25zIC0gY29kZSBmb2xsb3dzLgotICovCi1zdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfZXJyb3IoY2hhciAqbWVzZywgaW50ICppbnRzKQotewotCWlmIChpbnRzWzBdID09IDMpCi0JCXByaW50ayhLRVJOX0VSUiAid2Q3MDAwX3NldHVwOiBcIndkNzAwMD0lZCwlZCwweCV4XCIgLT4gJXNcbiIsIGludHNbMV0sIGludHNbMl0sIGludHNbM10sIG1lc2cpOwotCWVsc2UgaWYgKGludHNbMF0gPT0gNCkKLQkJcHJpbnRrKEtFUk5fRVJSICJ3ZDcwMDBfc2V0dXA6IFwid2Q3MDAwPSVkLCVkLDB4JXgsJWRcIiAtPiAlc1xuIiwgaW50c1sxXSwgaW50c1syXSwgaW50c1szXSwgaW50c1s0XSwgbWVzZyk7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9FUlIgIndkNzAwMF9zZXR1cDogXCJ3ZDcwMDA9JWQsJWQsMHgleCwlZCwlZFwiIC0+ICVzXG4iLCBpbnRzWzFdLCBpbnRzWzJdLCBpbnRzWzNdLCBpbnRzWzRdLCBpbnRzWzVdLCBtZXNnKTsKLX0KLQotCi0vKgotICogTm90ZTogWW91IGNhbiBub3cgc2V0IHRoZXNlIG9wdGlvbnMgZnJvbSB0aGUga2VybmVsJ3MgImNvbW1hbmQgbGluZSIuCi0gKiBUaGUgc3ludGF4IGlzOgotICoKLSAqICAgICB3ZDcwMDA9PElSUT4sPERNQT4sPElPPlssPEJVU19PTj5bLDxCVVNfT0ZGPl1dCi0gKgotICogLCB3aGVyZSBCVVNfT04gYW5kIEJVU19PRkYgYXJlIGluIG5hbm9zZWNvbmRzLiBCSU9TIGRlZmF1bHQgdmFsdWVzCi0gKiBhcmUgODAwMG5zIGZvciBCVVNfT04gYW5kIDE4NzVucyBmb3IgQlVTX09GRi4KLSAqIGVnOgotICogICAgIHdkNzAwMD03LDYsMHgzNTAKLSAqCi0gKiB3aWxsIGNvbmZpZ3VyZSB0aGUgZHJpdmVyIGZvciBhIFdELTcwMDAgY29udHJvbGxlcgotICogdXNpbmcgSVJRIDE1IHdpdGggYSBETUEgY2hhbm5lbCA2LCBhdCBJTyBiYXNlIGFkZHJlc3MgMHgzNTAuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHdkNzAwMF9zZXR1cChjaGFyICpzdHIpCi17Ci0Jc3RhdGljIHNob3J0IHdkNzAwMF9jYXJkX251bTsJLyogLmJzcyB3aWxsIHplcm8gdGhpcyAqLwotCXNob3J0IGk7Ci0JaW50IGludHNbNl07Ci0KLQkodm9pZCkgZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKLQotCWlmICh3ZDcwMDBfY2FyZF9udW0gPj0gTlVNX0NPTkZJR1MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogVG9vIG1hbnkgXCJ3ZDcwMDA9XCIgY29uZmlndXJhdGlvbnMgaW4gIiAiY29tbWFuZCBsaW5lIVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoKGludHNbMF0gPCAzKSB8fCAoaW50c1swXSA+IDUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGluIGNvbW1hbmQgbGluZSEgICIgIlVzYWdlOiB3ZDcwMDA9PElSUT4sPERNQT4sSU8+Wyw8QlVTX09OPiIgIlssPEJVU19PRkY+XV1cbiIsIF9fZnVuY19fKTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lSUVM7IGkrKykKLQkJCWlmIChpbnRzWzFdID09IHdkNzAwMF9pcnFbaV0pCi0JCQkJYnJlYWs7Ci0KLQkJaWYgKGkgPT0gTlVNX0lSUVMpIHsKLQkJCXNldHVwX2Vycm9yKCJpbnZhbGlkIElSUS4iLCBpbnRzKTsKLQkJCXJldHVybiAwOwotCQl9IGVsc2UKLQkJCWNvbmZpZ3Nbd2Q3MDAwX2NhcmRfbnVtXS5pcnEgPSBpbnRzWzFdOwotCi0JCWZvciAoaSA9IDA7IGkgPCBOVU1fRE1BUzsgaSsrKQotCQkJaWYgKGludHNbMl0gPT0gd2Q3MDAwX2RtYVtpXSkKLQkJCQlicmVhazsKLQotCQlpZiAoaSA9PSBOVU1fRE1BUykgewotCQkJc2V0dXBfZXJyb3IoImludmFsaWQgRE1BIGNoYW5uZWwuIiwgaW50cyk7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlCi0JCQljb25maWdzW3dkNzAwMF9jYXJkX251bV0uZG1hID0gaW50c1syXTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lPUE9SVFM7IGkrKykKLQkJCWlmIChpbnRzWzNdID09IHdkNzAwMF9pb2Jhc2VbaV0pCi0JCQkJYnJlYWs7Ci0KLQkJaWYgKGkgPT0gTlVNX0lPUE9SVFMpIHsKLQkJCXNldHVwX2Vycm9yKCJpbnZhbGlkIEkvTyBiYXNlIGFkZHJlc3MuIiwgaW50cyk7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlCi0JCQljb25maWdzW3dkNzAwMF9jYXJkX251bV0uaW9iYXNlID0gaW50c1szXTsKLQotCQlpZiAoaW50c1swXSA+IDMpIHsKLQkJCWlmICgoaW50c1s0XSA8IDUwMCkgfHwgKGludHNbNF0gPiAzMTg3NSkpIHsKLQkJCQlzZXR1cF9lcnJvcigiQlVTX09OIHZhbHVlIGlzIG91dCBvZiByYW5nZSAoNTAwIiAiIHRvIDMxODc1IG5hbm9zZWNvbmRzKSEiLCBpbnRzKTsKLQkJCQljb25maWdzW3dkNzAwMF9jYXJkX251bV0uYnVzX29uID0gQlVTX09OOwotCQkJfSBlbHNlCi0JCQkJY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vbiA9IGludHNbNF0gLyAxMjU7Ci0JCX0gZWxzZQotCQkJY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vbiA9IEJVU19PTjsKLQotCQlpZiAoaW50c1swXSA+IDQpIHsKLQkJCWlmICgoaW50c1s1XSA8IDUwMCkgfHwgKGludHNbNV0gPiAzMTg3NSkpIHsKLQkJCQlzZXR1cF9lcnJvcigiQlVTX09GRiB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UgKDUwMCIgIiB0byAzMTg3NSBuYW5vc2Vjb25kcykhIiwgaW50cyk7Ci0JCQkJY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vZmYgPSBCVVNfT0ZGOwotCQkJfSBlbHNlCi0JCQkJY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vZmYgPSBpbnRzWzVdIC8gMTI1OwotCQl9IGVsc2UKLQkJCWNvbmZpZ3Nbd2Q3MDAwX2NhcmRfbnVtXS5idXNfb2ZmID0gQlVTX09GRjsKLQotCQlpZiAod2Q3MDAwX2NhcmRfbnVtKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgKHdkNzAwMF9jYXJkX251bSAtIDEpOyBpKyspIHsKLQkJCQlpbnQgaiA9IGkgKyAxOwotCi0JCQkJZm9yICg7IGogPCB3ZDcwMDBfY2FyZF9udW07IGorKykKLQkJCQkJaWYgKGNvbmZpZ3NbaV0uaXJxID09IGNvbmZpZ3Nbal0uaXJxKSB7Ci0JCQkJCQlzZXR1cF9lcnJvcigiZHVwbGljYXRlZCBJUlEhIiwgaW50cyk7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQkJCWlmIChjb25maWdzW2ldLmRtYSA9PSBjb25maWdzW2pdLmRtYSkgewotCQkJCQlzZXR1cF9lcnJvcigiZHVwbGljYXRlZCBETUEgIiAiY2hhbm5lbCEiLCBpbnRzKTsKLQkJCQkJcmV0dXJuIDA7Ci0JCQkJfQotCQkJCWlmIChjb25maWdzW2ldLmlvYmFzZSA9PSBjb25maWdzW2pdLmlvYmFzZSkgewotCQkJCQlzZXR1cF9lcnJvcigiZHVwbGljYXRlZCBJL08gIiAiYmFzZSBhZGRyZXNzISIsIGludHMpOwotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlkcHJpbnRrKEtFUk5fREVCVUcgIndkNzAwMF9zZXR1cDogSVJRPSVkLCBETUE9JWQsIEkvTz0weCV4LCAiCi0JCQkiQlVTX09OPSVkbnMsIEJVU19PRkY9JWRuc1xuIiwgY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmlycSwgY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmRtYSwgY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmlvYmFzZSwgY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vbiAqIDEyNSwgY29uZmlnc1t3ZDcwMDBfY2FyZF9udW1dLmJ1c19vZmYgKiAxMjUpOwotCi0JCXdkNzAwMF9jYXJkX251bSsrOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgid2Q3MDAwPSIsIHdkNzAwMF9zZXR1cCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhbnkyc2NzaSh1bmNoYXIgKiBzY3NpLCBpbnQgYW55KQotewotCSpzY3NpKysgPSAodW5zaWduZWQpYW55ID4+IDE2OwotCSpzY3NpKysgPSAodW5zaWduZWQpYW55ID4+IDg7Ci0JKnNjc2krKyA9IGFueTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc2NzaTJpbnQodW5jaGFyICogc2NzaSkKLXsKLQlyZXR1cm4gKHNjc2lbMF0gPDwgMTYpIHwgKHNjc2lbMV0gPDwgOCkgfCBzY3NpWzJdOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd2Q3MDAwX2VuYWJsZV9pbnRyKEFkYXB0ZXIgKiBob3N0KQotewotCWhvc3QtPmNvbnRyb2wgfD0gSU5UX0VOOwotCW91dGIoaG9zdC0+Y29udHJvbCwgaG9zdC0+aW9iYXNlICsgQVNDX0NPTlRST0wpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3ZDcwMDBfZW5hYmxlX2RtYShBZGFwdGVyICogaG9zdCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWhvc3QtPmNvbnRyb2wgfD0gRE1BX0VOOwotCW91dGIoaG9zdC0+Y29udHJvbCwgaG9zdC0+aW9iYXNlICsgQVNDX0NPTlRST0wpOwotCi0JZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOwotCXNldF9kbWFfbW9kZShob3N0LT5kbWEsIERNQV9NT0RFX0NBU0NBREUpOwotCWVuYWJsZV9kbWEoaG9zdC0+ZG1hKTsKLQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKLQotfQotCi0KLSNkZWZpbmUgV0FJVG5leHR0aW1lb3V0IDIwMAkvKiAyIHNlY29uZHMgKi8KLQotc3RhdGljIGlubGluZSBzaG9ydCBXQUlUKHVuc2lnbmVkIHBvcnQsIHVuc2lnbmVkIG1hc2ssIHVuc2lnbmVkIGFsbG9mLCB1bnNpZ25lZCBub25lb2YpCi17Ci0JdW5zaWduZWQgV0FJVGJpdHM7Ci0JdW5zaWduZWQgbG9uZyBXQUlUdGltZW91dCA9IGppZmZpZXMgKyBXQUlUbmV4dHRpbWVvdXQ7Ci0KLQl3aGlsZSAodGltZV9iZWZvcmVfZXEoamlmZmllcywgV0FJVHRpbWVvdXQpKSB7Ci0JCVdBSVRiaXRzID0gaW5iKHBvcnQpICYgbWFzazsKLQotCQlpZiAoKChXQUlUYml0cyAmIGFsbG9mKSA9PSBhbGxvZikgJiYgKChXQUlUYml0cyAmIG5vbmVvZikgPT0gMCkpCi0JCQlyZXR1cm4gKDApOwotCX0KLQotCXJldHVybiAoMSk7Ci19Ci0KLQotc3RhdGljIGlubGluZSBpbnQgY29tbWFuZF9vdXQoQWRhcHRlciAqIGhvc3QsIHVuY2hhciAqIGNtZCwgaW50IGxlbikKLXsKLQlpZiAoIVdBSVQoaG9zdC0+aW9iYXNlICsgQVNDX1NUQVQsIEFTQ19TVEFUTUFTSywgQ01EX1JEWSwgMCkpIHsKLQkJd2hpbGUgKGxlbi0tKSB7Ci0JCQlkbyB7Ci0JCQkJb3V0YigqY21kLCBob3N0LT5pb2Jhc2UgKyBBU0NfQ09NTUFORCk7Ci0JCQkJV0FJVChob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCwgQVNDX1NUQVRNQVNLLCBDTURfUkRZLCAwKTsKLQkJCX0gd2hpbGUgKGluYihob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCkgJiBDTURfUkVKKTsKLQotCQkJY21kKys7Ci0JCX0KLQotCQlyZXR1cm4gKDEpOwotCX0KLQotCXByaW50ayhLRVJOX1dBUk5JTkcgIndkNzAwMCBjb21tYW5kX291dDogV0FJVCBmYWlsZWQoJWQpXG4iLCBsZW4gKyAxKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLQotLyoKLSAqICBUaGlzIHZlcnNpb24gb2YgYWxsb2Nfc2NicyBpcyBpbiBwcmVwYXJhdGlvbiBmb3Igc3VwcG9ydGluZyBtdWx0aXBsZQotICogIGNvbW1hbmRzIHBlciBsdW4gYW5kIGNvbW1hbmQgY2hhaW5pbmcsIGJ5IHF1ZXVlaW5nIHBlbmRpbmcgY29tbWFuZHMuCi0gKiAgV2Ugd2lsbCBuZWVkIHRvIGFsbG9jYXRlIFNjYnMgaW4gYmxvY2tzIHNpbmNlIHRoZXkgd2lsbCB3YWl0IHRvIGJlCi0gKiAgZXhlY3V0ZWQgc28gdGhlcmUgaXMgdGhlIHBvc3NpYmlsaXR5IG9mIGRlYWRsb2NrIG90aGVyd2lzZS4KLSAqICBBbHNvLCB0byBrZWVwIGxhcmdlciByZXF1ZXN0cyBmcm9tIGJlaW5nIHN0YXJ2ZWQgYnkgc21hbGxlciByZXF1ZXN0cywKLSAqICB3ZSBsaW1pdCBhY2Nlc3MgdG8gdGhpcyByb3V0aW5lIHdpdGggYW4gaW50ZXJuYWwgYnVzeSBmbGFnLCBzbyB0aGF0Ci0gKiAgdGhlIHNhdGlzZmlhYmlsaXR5IG9mIGEgcmVxdWVzdCBpcyBub3QgZGVwZW5kZW50IG9uIHRoZSBzaXplIG9mIHRoZQotICogIHJlcXVlc3QuCi0gKi8KLXN0YXRpYyBpbmxpbmUgU2NiICphbGxvY19zY2JzKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGludCBuZWVkZWQpCi17Ci0JU2NiICpzY2IsICpwID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBXQUlUbmV4dHRpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyBub3c7Ci0JaW50IGk7Ci0KLQlpZiAobmVlZGVkIDw9IDApCi0JCXJldHVybiAoTlVMTCk7CS8qIHNhbml0eSBjaGVjayAqLwotCi0Jc3Bpbl91bmxvY2tfaXJxKGhvc3QtPmhvc3RfbG9jayk7Ci0KLSAgICAgIHJldHJ5OgotCXdoaWxlIChmcmVlc2NicyA8IG5lZWRlZCkgewotCQl0aW1lb3V0ID0gamlmZmllcyArIFdBSVRuZXh0dGltZW91dDsKLQkJZG8gewotCQkJLyogRklYTUU6IGNhbiB3ZSBhY3R1YWxseSBqdXN0IHlpZWxkIGhlcmUgPz8gKi8KLQkJCWZvciAobm93ID0gamlmZmllczsgbm93ID09IGppZmZpZXM7KQotCQkJCWNwdV9yZWxheCgpOwkvKiB3YWl0IGEgamlmZnkgKi8KLQkJfSB3aGlsZSAoZnJlZXNjYnMgPCBuZWVkZWQgJiYgdGltZV9iZWZvcmVfZXEoamlmZmllcywgdGltZW91dCkpOwotCQkvKgotCQkgKiAgSWYgd2UgZ2V0IGhlcmUgd2l0aCBlbm91Z2ggZnJlZSBTY2JzLCB3ZSBjYW4gdGFrZSB0aGVtLgotCQkgKiAgT3RoZXJ3aXNlLCB3ZSB0aW1lZCBvdXQgYW5kIGRpZG4ndCBnZXQgZW5vdWdoLgotCQkgKi8KLQkJaWYgKGZyZWVzY2JzIDwgbmVlZGVkKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIndkNzAwMDogY2FuJ3QgZ2V0IGVub3VnaCBmcmVlIFNDQnMuXG4iKTsKLQkJCXJldHVybiAoTlVMTCk7Ci0JCX0KLQl9Ci0KLQkvKiBUYWtlIHRoZSBsb2NrLCB0aGVuIGNoZWNrIHdlIGRpZG4ndCBnZXQgYmVhdGVuLCBpZiBzbyB0cnkgYWdhaW4gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2NicG9vbF9sb2NrLCBmbGFncyk7Ci0JaWYgKGZyZWVzY2JzIDwgbmVlZGVkKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYnBvb2xfbG9jaywgZmxhZ3MpOwotCQlnb3RvIHJldHJ5OwotCX0KLQotCXNjYiA9IHNjYmZyZWU7Ci0JZnJlZXNjYnMgLT0gbmVlZGVkOwotCWZvciAoaSA9IDA7IGkgPCBuZWVkZWQ7IGkrKykgewotCQlwID0gc2NiZnJlZTsKLQkJc2NiZnJlZSA9IHAtPm5leHQ7Ci0JfQotCXAtPm5leHQgPSBOVUxMOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2NicG9vbF9sb2NrLCBmbGFncyk7Ci0KLQlzcGluX2xvY2tfaXJxKGhvc3QtPmhvc3RfbG9jayk7Ci0JcmV0dXJuIChzY2IpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3NjYihTY2IgKiBzY2IpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzY2Jwb29sX2xvY2ssIGZsYWdzKTsKLQotCW1lbXNldChzY2IsIDAsIHNpemVvZihTY2IpKTsKLQlzY2ItPm5leHQgPSBzY2JmcmVlOwotCXNjYmZyZWUgPSBzY2I7Ci0JZnJlZXNjYnMrKzsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjYnBvb2xfbG9jaywgZmxhZ3MpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X3NjYnModm9pZCkKLXsKLQlpbnQgaTsKLQotCXNwaW5fbG9ja19pbml0KCZzY2Jwb29sX2xvY2spOwotCi0JLyogVGhpcyBpcyBvbmx5IGV2ZXIgY2FsbGVkIGJlZm9yZSB0aGUgU0NCIHBvb2wgaXMgYWN0aXZlICovCi0KLQlzY2JmcmVlID0gJihzY2JzWzBdKTsKLQltZW1zZXQoc2NicywgMCwgc2l6ZW9mKHNjYnMpKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1NDQlMgLSAxOyBpKyspIHsKLQkJc2Nic1tpXS5uZXh0ID0gJihzY2JzW2kgKyAxXSk7Ci0JCXNjYnNbaV0uU0NwbnQgPSBOVUxMOwotCX0KLQlzY2JzW01BWF9TQ0JTIC0gMV0ubmV4dCA9IE5VTEw7Ci0Jc2Nic1tNQVhfU0NCUyAtIDFdLlNDcG50ID0gTlVMTDsKLX0KLQotCi1zdGF0aWMgaW50IG1haWxfb3V0KEFkYXB0ZXIgKiBob3N0LCBTY2IgKiBzY2JwdHIpCi0vKgotICogIE5vdGU6IHRoaXMgY2FuIGFsc28gYmUgdXNlZCBmb3IgSUNCczsganVzdCBjYXN0IHRvIHRoZSBwYXJtIHR5cGUuCi0gKi8KLXsKLQlpbnQgaSwgb2dtYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuY2hhciBzdGFydF9vZ21iOwotCU1haWxib3ggKm9nbWJzID0gaG9zdC0+bWIub2dtYjsKLQlpbnQgKm5leHRfb2dtYiA9ICYoaG9zdC0+bmV4dF9vZ21iKTsKLQotCWRwcmludGsoIndkNzAwMF9tYWlsX291dDogMHglMDZseCIsIChsb25nKSBzY2JwdHIpOwotCi0JLyogV2UgZmlyc3QgbG9vayBmb3IgYSBmcmVlIG91dGdvaW5nIG1haWxib3ggKi8KLQlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5zaC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0Jb2dtYiA9ICpuZXh0X29nbWI7Ci0JZm9yIChpID0gMDsgaSA8IE9HTUJfQ05UOyBpKyspIHsKLQkJaWYgKG9nbWJzW29nbWJdLnN0YXR1cyA9PSAwKSB7Ci0JCQlkcHJpbnRrKCIgdXNpbmcgT0dNQiAweCV4Iiwgb2dtYik7Ci0JCQlvZ21ic1tvZ21iXS5zdGF0dXMgPSAxOwotCQkJYW55MnNjc2koKHVuY2hhciAqKSBvZ21ic1tvZ21iXS5zY2JwdHIsIChpbnQpIHNjYnB0cik7Ci0KLQkJCSpuZXh0X29nbWIgPSAob2dtYiArIDEpICUgT0dNQl9DTlQ7Ci0JCQlicmVhazsKLQkJfSBlbHNlCi0JCQlvZ21iID0gKG9nbWIgKyAxKSAlIE9HTUJfQ05UOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGhvc3QtPnNoLT5ob3N0X2xvY2ssIGZsYWdzKTsKLQotCWRwcmludGsoIiwgc2NiIGlzIDB4JTA2bHgiLCAobG9uZykgc2NicHRyKTsKLQotCWlmIChpID49IE9HTUJfQ05UKSB7Ci0JCS8qCi0JCSAqICBBbHRlcm5hdGl2ZWx5LCB3ZSBtaWdodCBpc3N1ZSB0aGUgImludGVycnVwdCBvbiBmcmVlIE9HTUIiLAotCQkgKiAgYW5kIHNsZWVwLCBidXQgaXQgbXVzdCBiZSBlbnN1cmVkIHRoYXQgaXQgaXNuJ3QgdGhlIGluaXQKLQkJICogIHRhc2sgcnVubmluZy4gIEluc3RlYWQsIHRoaXMgdmVyc2lvbiBhc3N1bWVzIHRoYXQgdGhlIGNhbGxlcgotCQkgKiAgd2lsbCBiZSBwZXJzaXN0ZW50LCBhbmQgdHJ5IGFnYWluLiAgU2luY2UgaXQncyB0aGUgYWRhcHRlcgotCQkgKiAgdGhhdCBtYXJrcyBPR01CJ3MgZnJlZSwgd2FpdGluZyBldmVuIHdpdGggaW50ZXJydXB0cyBvZmYKLQkJICogIHNob3VsZCB3b3JrLCBzaW5jZSB0aGV5IGFyZSBmcmVlZCB2ZXJ5IHF1aWNrbHkgaW4gbW9zdCBjYXNlcy4KLQkJICovCi0JCWRwcmludGsoIiwgbm8gZnJlZSBPR01Ccy5cbiIpOwotCQlyZXR1cm4gKDApOwotCX0KLQotCXdkNzAwMF9lbmFibGVfaW50cihob3N0KTsKLQotCXN0YXJ0X29nbWIgPSBTVEFSVF9PR01CIHwgb2dtYjsKLQljb21tYW5kX291dChob3N0LCAmc3RhcnRfb2dtYiwgMSk7Ci0KLQlkcHJpbnRrKCIsIGF3YWl0aW5nIGludGVycnVwdC5cbiIpOwotCi0JcmV0dXJuICgxKTsKLX0KLQotCi1zdGF0aWMgaW50IG1ha2VfY29kZSh1bnNpZ25lZCBob3N0ZXJyLCB1bnNpZ25lZCBzY3NpZXJyKQotewotI2lmZGVmIFdENzAwMF9ERUJVRwotCWludCBpbl9lcnJvciA9IGhvc3RlcnI7Ci0jZW5kaWYKLQotCXN3aXRjaCAoKGhvc3RlcnIgPj4gOCkgJiAweGZmKSB7Ci0JY2FzZSAwOgkJLyogUmVzZXJ2ZWQgKi8KLQkJaG9zdGVyciA9IERJRF9FUlJPUjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgkJLyogQ29tbWFuZCBDb21wbGV0ZSwgbm8gZXJyb3JzICovCi0JCWhvc3RlcnIgPSBESURfT0s7Ci0JCWJyZWFrOwotCWNhc2UgMjoJCS8qIENvbW1hbmQgY29tcGxldGUsIGVycm9yIGxvZ2dlZCBpbiBzY2Igc3RhdHVzIChzY3NpZXJyKSAqLwotCQlob3N0ZXJyID0gRElEX09LOwotCQlicmVhazsKLQljYXNlIDQ6CQkvKiBDb21tYW5kIGZhaWxlZCB0byBjb21wbGV0ZSAtIHRpbWVvdXQgKi8KLQkJaG9zdGVyciA9IERJRF9USU1FX09VVDsKLQkJYnJlYWs7Ci0JY2FzZSA1OgkJLyogQ29tbWFuZCB0ZXJtaW5hdGVkOyBCdXMgcmVzZXQgYnkgZXh0ZXJuYWwgZGV2aWNlICovCi0JCWhvc3RlcnIgPSBESURfUkVTRVQ7Ci0JCWJyZWFrOwotCWNhc2UgNjoJCS8qIFVuZXhwZWN0ZWQgQ29tbWFuZCBSZWNlaXZlZCB3LyBob3N0IGFzIHRhcmdldCAqLwotCQlob3N0ZXJyID0gRElEX0JBRF9UQVJHRVQ7Ci0JCWJyZWFrOwotCWNhc2UgODA6CQkvKiBVbmV4cGVjdGVkIFJlc2VsZWN0aW9uICovCi0JY2FzZSA4MToJCS8qIFVuZXhwZWN0ZWQgU2VsZWN0aW9uICovCi0JCWhvc3RlcnIgPSBESURfQkFEX0lOVFI7Ci0JCWJyZWFrOwotCWNhc2UgODI6CQkvKiBBYm9ydCBDb21tYW5kIE1lc3NhZ2UgICovCi0JCWhvc3RlcnIgPSBESURfQUJPUlQ7Ci0JCWJyZWFrOwotCWNhc2UgODM6CQkvKiBTQ1NJIEJ1cyBTb2Z0d2FyZSBSZXNldCAqLwotCWNhc2UgODQ6CQkvKiBTQ1NJIEJ1cyBIYXJkd2FyZSBSZXNldCAqLwotCQlob3N0ZXJyID0gRElEX1JFU0VUOwotCQlicmVhazsKLQlkZWZhdWx0OgkJLyogUmVzZXJ2ZWQgKi8KLQkJaG9zdGVyciA9IERJRF9FUlJPUjsKLQl9Ci0jaWZkZWYgV0Q3MDAwX0RFQlVHCi0JaWYgKHNjc2llcnIgfHwgaG9zdGVycikKLQkJZHByaW50aygiXG5TQ1NJIGNvbW1hbmQgZXJyb3I6IFNDU0kgMHglMDJ4IGhvc3QgMHglMDR4IHJldHVybiAlZFxuIiwgc2NzaWVyciwgaW5fZXJyb3IsIGhvc3RlcnIpOwotI2VuZGlmCi0JcmV0dXJuIChzY3NpZXJyIHwgKGhvc3RlcnIgPDwgMTYpKTsKLX0KLQotI2RlZmluZSB3ZDcwMDBfaW50cl9hY2soaG9zdCkgICBvdXRiICgwLCBob3N0LT5pb2Jhc2UgKyBBU0NfSU5UUl9BQ0spCi0KLQotc3RhdGljIGlycXJldHVybl90IHdkNzAwMF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlBZGFwdGVyICpob3N0ID0gKEFkYXB0ZXIgKikgZGV2X2lkOwotCWludCBmbGFnLCBpY21iLCBlcnJzdGF0dXMsIGljbWJfc3RhdHVzOwotCWludCBob3N0X2Vycm9yLCBzY3NpX2Vycm9yOwotCVNjYiAqc2NiOwkvKiBmb3IgU0NTSSBjb21tYW5kcyAqLwotCUljYkFueSAqaWNiOwkvKiBmb3IgaG9zdCBjb21tYW5kcyAqLwotCXN0cnVjdCBzY3NpX2NtbmQgKlNDcG50OwotCU1haWxib3ggKmljbWJzID0gaG9zdC0+bWIuaWNtYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoaG9zdC0+c2gtPmhvc3RfbG9jaywgZmxhZ3MpOwotCWhvc3QtPmludF9jb3VudGVyKys7Ci0KLQlkcHJpbnRrKCJ3ZDcwMDBfaW50cjogaXJxID0gJWQsIGhvc3QgPSAweCUwNmx4XG4iLCBpcnEsIChsb25nKSBob3N0KTsKLQotCWZsYWcgPSBpbmIoaG9zdC0+aW9iYXNlICsgQVNDX0lOVFJfU1RBVCk7Ci0KLQlkcHJpbnRrKCJ3ZDcwMDBfaW50cjogaW50ciBzdGF0ID0gMHglMDJ4XG4iLCBmbGFnKTsKLQotCWlmICghKGluYihob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCkgJiBJTlRfSU0pKSB7Ci0JCS8qIE5COiB0aGVzZSBhcmUgX3ZlcnlfIHBvc3NpYmxlIGlmIElSUSAxNSBpcyBiZWluZyB1c2VkLCBzaW5jZQotCQkgKiBpdCdzIHRoZSAiZ2FyYmFnZSBjb2xsZWN0b3IiIG9uIHRoZSAybmQgODI1OSBQSUMuICBTcGVjaWZpY2FsbHksCi0JCSAqIGFueSBpbnRlcnJ1cHQgc2lnbmFsIGludG8gdGhlIDgyNTkgd2hpY2ggY2FuJ3QgYmUgaWRlbnRpZmllZAotCQkgKiBjb21lcyBvdXQgYXMgNyBmcm9tIHRoZSA4MjU5LCB3aGljaCBpcyAxNSB0byB0aGUgaG9zdC4gIFRodXMsIGl0Ci0JCSAqIGlzIGEgZ29vZCB0aGluZyB0aGUgV0Q3MDAwIGhhcyBhbiBpbnRlcnJ1cHQgc3RhdHVzIHBvcnQsIHNvIHdlCi0JCSAqIGNhbiBzb3J0IHRoZXNlIG91dC4gIE90aGVyd2lzZSwgZWxlY3RyaWNhbCBub2lzZSBhbmQgb3RoZXIgc3VjaAotCQkgKiBwcm9ibGVtcyB3b3VsZCBiZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHZhbGlkIGludGVycnVwdHMuLi4KLQkJICovCi0JCWRwcmludGsoIndkNzAwMF9pbnRyOiBwaGFudG9tIGludGVycnVwdC4uLlxuIik7Ci0JCWdvdG8gYWNrOwotCX0KLQotCWlmICghKGZsYWcgJiBNQl9JTlRSKSkKLQkJZ290byBhY2s7Ci0KLQkvKiBUaGUgaW50ZXJydXB0IGlzIGZvciBhIG1haWxib3ggKi8KLQlpZiAoIShmbGFnICYgSU1CX0lOVFIpKSB7Ci0JCWRwcmludGsoIndkNzAwMF9pbnRyOiBmcmVlIG91dGdvaW5nIG1haWxib3hcbiIpOwotCQkvKgotCQkgKiBJZiBzbGVlcF9vbigpIGFuZCB0aGUgImludGVycnVwdCBvbiBmcmVlIE9HTUIiIGNvbW1hbmQgYXJlCi0JCSAqIHVzZWQgaW4gbWFpbF9vdXQoKSwgd2FrZV91cCgpIHNob3VsZCBjb3JyZXNwb25kaW5nbHkgYmUgY2FsbGVkCi0JCSAqIGhlcmUuICBGb3Igbm93LCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuCi0JCSAqLwotCQlnb3RvIGFjazsKLQl9Ci0KLQkvKiBUaGUgaW50ZXJydXB0IGlzIGZvciBhbiBpbmNvbWluZyBtYWlsYm94ICovCi0JaWNtYiA9IGZsYWcgJiBNQl9NQVNLOwotCWljbWJfc3RhdHVzID0gaWNtYnNbaWNtYl0uc3RhdHVzOwotCWlmIChpY21iX3N0YXR1cyAmIDB4ODApIHsJLyogdW5zb2xpY2l0ZWQgLSByZXN1bHQgaW4gSUNNQiAqLwotCQlkcHJpbnRrKCJ3ZDcwMDBfaW50cjogdW5zb2xpY2l0ZWQgaW50ZXJydXB0IDB4JTAyeFxuIiwgaWNtYl9zdGF0dXMpOwotCQlnb3RvIGFjazsKLQl9Ci0KLQkvKiBBYWFhcmdoISAoWmFnYSkgKi8KLQlzY2IgPSBpc2FfYnVzX3RvX3ZpcnQoc2NzaTJpbnQoKHVuY2hhciAqKSBpY21ic1tpY21iXS5zY2JwdHIpKTsKLQlpY21ic1tpY21iXS5zdGF0dXMgPSAwOwotCWlmIChzY2ItPm9wICYgSUNCX09QX01BU0spIHsJLyogYW4gU0NCIGlzIGRvbmUgKi8KLQkJaWNiID0gKEljYkFueSAqKSBzY2I7Ci0JCWljYi0+c3RhdHVzID0gaWNtYl9zdGF0dXM7Ci0JCWljYi0+cGhhc2UgPSAwOwotCQlnb3RvIGFjazsKLQl9Ci0KLQlTQ3BudCA9IHNjYi0+U0NwbnQ7Ci0JaWYgKC0tKFNDcG50LT5TQ3AucGhhc2UpIDw9IDApIHsJLyogYWxsIHNjYnMgYXJlIGRvbmUgKi8KLQkJaG9zdF9lcnJvciA9IHNjYi0+dnVlIHwgKGljbWJfc3RhdHVzIDw8IDgpOwotCQlzY3NpX2Vycm9yID0gc2NiLT5zdGF0dXM7Ci0JCWVycnN0YXR1cyA9IG1ha2VfY29kZShob3N0X2Vycm9yLCBzY3NpX2Vycm9yKTsKLQkJU0NwbnQtPnJlc3VsdCA9IGVycnN0YXR1czsKLQotCQlmcmVlX3NjYihzY2IpOwotCi0JCVNDcG50LT5zY3NpX2RvbmUoU0NwbnQpOwotCX0KLQotIGFjazoKLQlkcHJpbnRrKCJ3ZDcwMDBfaW50cjogcmV0dXJuIGZyb20gaW50ZXJydXB0IGhhbmRsZXJcbiIpOwotCXdkNzAwMF9pbnRyX2Fjayhob3N0KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+c2gtPmhvc3RfbG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCB3ZDcwMDBfcXVldWVjb21tYW5kX2xjayhzdHJ1Y3Qgc2NzaV9jbW5kICpTQ3BudCwKLQkJdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCi17Ci0JU2NiICpzY2I7Ci0JU2diICpzZ2I7Ci0JdW5jaGFyICpjZGIgPSAodW5jaGFyICopIFNDcG50LT5jbW5kOwotCXVuY2hhciBpZGx1bjsKLQlzaG9ydCBjZGJsZW47Ci0JaW50IG5zZWc7Ci0JQWRhcHRlciAqaG9zdCA9IChBZGFwdGVyICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwotCi0JY2RibGVuID0gU0NwbnQtPmNtZF9sZW47Ci0JaWRsdW4gPSAoKFNDcG50LT5kZXZpY2UtPmlkIDw8IDUpICYgMHhlMCkgfCAoU0NwbnQtPmRldmljZS0+bHVuICYgNyk7Ci0JU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7Ci0JU0NwbnQtPlNDcC5waGFzZSA9IDE7Ci0Jc2NiID0gYWxsb2Nfc2NicyhTQ3BudC0+ZGV2aWNlLT5ob3N0LCAxKTsKLQlzY2ItPmlkbHVuID0gaWRsdW47Ci0JbWVtY3B5KHNjYi0+Y2RiLCBjZGIsIGNkYmxlbik7Ci0Jc2NiLT5kaXJlYyA9IDB4NDA7CS8qIERpc2FibGUgZGlyZWN0aW9uIGNoZWNrICovCi0KLQlzY2ItPlNDcG50ID0gU0NwbnQ7CS8qIHNvIHdlIGNhbiBmaW5kIHN0dWZmIGxhdGVyICovCi0JU0NwbnQtPmhvc3Rfc2NyaWJibGUgPSAodW5jaGFyICopIHNjYjsKLQlzY2ItPmhvc3QgPSBob3N0OwotCi0JbnNlZyA9IHNjc2lfc2dfY291bnQoU0NwbnQpOwotCWlmIChuc2VnID4gMSkgewotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCQl1bnNpZ25lZCBpOwotCi0JCWRwcmludGsoIlVzaW5nIHNjYXR0ZXIvZ2F0aGVyIHdpdGggJWQgZWxlbWVudHMuXG4iLCBuc2VnKTsKLQotCQlzZ2IgPSBzY2ItPnNnYjsKLQkJc2NiLT5vcCA9IDE7Ci0JCWFueTJzY3NpKHNjYi0+ZGF0YXB0ciwgKGludCkgc2diKTsKLQkJYW55MnNjc2koc2NiLT5tYXhsZW4sIG5zZWcgKiBzaXplb2YoU2diKSk7Ci0KLQkJc2NzaV9mb3JfZWFjaF9zZyhTQ3BudCwgc2csIG5zZWcsIGkpIHsKLQkJCWFueTJzY3NpKHNnYltpXS5wdHIsIGlzYV9wYWdlX3RvX2J1cyhzZ19wYWdlKHNnKSkgKyBzZy0+b2Zmc2V0KTsKLQkJCWFueTJzY3NpKHNnYltpXS5sZW4sIHNnLT5sZW5ndGgpOwotCQl9Ci0JfSBlbHNlIHsKLQkJc2NiLT5vcCA9IDA7Ci0JCWlmIChuc2VnKSB7Ci0JCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gc2NzaV9zZ2xpc3QoU0NwbnQpOwotCQkJYW55MnNjc2koc2NiLT5kYXRhcHRyLCBpc2FfcGFnZV90b19idXMoc2dfcGFnZShzZykpICsgc2ctPm9mZnNldCk7Ci0JCX0KLQkJYW55MnNjc2koc2NiLT5tYXhsZW4sIHNjc2lfYnVmZmxlbihTQ3BudCkpOwotCX0KLQotCS8qIEZJWE1FOiBkcm9wIGxvY2sgYW5kIHlpZWxkIGhlcmUgPyAqLwotCi0Jd2hpbGUgKCFtYWlsX291dChob3N0LCBzY2IpKQotCQljcHVfcmVsYXgoKTsJLyoga2VlcCB0cnlpbmcgKi8KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgREVGX1NDU0lfUUNNRCh3ZDcwMDBfcXVldWVjb21tYW5kKQotCi1zdGF0aWMgaW50IHdkNzAwMF9kaWFnbm9zdGljcyhBZGFwdGVyICogaG9zdCwgaW50IGNvZGUpCi17Ci0Jc3RhdGljIEljYkRpYWcgaWNiID0geyBJQ0JfT1BfRElBR05PU1RJQ1MgfTsKLQlzdGF0aWMgdW5jaGFyIGJ1ZlsyNTZdOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQotCWljYi50eXBlID0gY29kZTsKLQlhbnkyc2NzaShpY2IubGVuLCBzaXplb2YoYnVmKSk7Ci0JYW55MnNjc2koaWNiLnB0ciwgKGludCkgJmJ1Zik7Ci0JaWNiLnBoYXNlID0gMTsKLQkvKgotCSAqIFRoaXMgcm91dGluZSBpcyBvbmx5IGNhbGxlZCBhdCBpbml0LCBzbyB0aGVyZSBzaG91bGQgYmUgT0dNQnMKLQkgKiBhdmFpbGFibGUuICBJJ20gYXNzdW1pbmcgc28gaGVyZS4gIElmIHRoaXMgaXMgZ29pbmcgdG8KLQkgKiBmYWlsLCBJIGNhbiBqdXN0IGxldCB0aGUgdGltZW91dCBjYXRjaCB0aGUgZmFpbHVyZS4KLQkgKi8KLQltYWlsX291dChob3N0LCAoc3RydWN0IHNjYiAqKSAmaWNiKTsKLQl0aW1lb3V0ID0gamlmZmllcyArIFdBSVRuZXh0dGltZW91dDsJLyogd2FpdCB1cCB0byAyIHNlY29uZHMgKi8KLQl3aGlsZSAoaWNiLnBoYXNlICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCWNwdV9yZWxheCgpOwkvKiB3YWl0IGZvciBjb21wbGV0aW9uICovCi0JCWJhcnJpZXIoKTsKLQl9Ci0KLQlpZiAoaWNiLnBoYXNlKSB7Ci0JCXByaW50aygid2Q3MDAwX2RpYWdub3N0aWNzOiB0aW1lZCBvdXQuXG4iKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JaWYgKG1ha2VfY29kZShpY2IudnVlIHwgKGljYi5zdGF0dXMgPDwgOCksIDApKSB7Ci0JCXByaW50aygid2Q3MDAwX2RpYWdub3N0aWNzOiBmYWlsZWQgKDB4JTAyeCwweCUwMngpXG4iLCBpY2IudnVlLCBpY2Iuc3RhdHVzKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0KLQlyZXR1cm4gKDEpOwotfQotCi0KLXN0YXRpYyBpbnQgd2Q3MDAwX2FkYXB0ZXJfcmVzZXQoQWRhcHRlciAqIGhvc3QpCi17Ci0JSW5pdENtZCBpbml0X2NtZCA9IHsKLQkJSU5JVElBTElaQVRJT04sCi0JCTcsCi0JCWhvc3QtPmJ1c19vbiwKLQkJaG9zdC0+YnVzX29mZiwKLQkJMCwKLQkJezAsIDAsIDB9LAotCQlPR01CX0NOVCwKLQkJSUNNQl9DTlQKLQl9OwotCWludCBkaWFnOwotCS8qCi0JICogIFJlc2V0IHRoZSBhZGFwdGVyIC0gb25seS4gIFRoZSBTQ1NJIGJ1cyB3YXMgaW5pdGlhbGl6ZWQgYXQgcG93ZXItdXAsCi0JICogIGFuZCB3ZSBuZWVkIHRvIGRvIHRoaXMganVzdCBzbyB3ZSBjb250cm9sIHRoZSBtYWlsYm94ZXMsIGV0Yy4KLQkgKi8KLQlvdXRiKEFTQ19SRVMsIGhvc3QtPmlvYmFzZSArIEFTQ19DT05UUk9MKTsKLQl1ZGVsYXkoNDApOwkJLyogcmVzZXQgcHVsc2U6IHRoaXMgaXMgNDB1cywgb25seSBuZWVkIDI1dXMgKi8KLQlvdXRiKDAsIGhvc3QtPmlvYmFzZSArIEFTQ19DT05UUk9MKTsKLQlob3N0LT5jb250cm9sID0gMDsJLyogdGhpcyBtdXN0IGFsd2F5cyBzaGFkb3cgQVNDX0NPTlRST0wgKi8KLQotCWlmIChXQUlUKGhvc3QtPmlvYmFzZSArIEFTQ19TVEFULCBBU0NfU1RBVE1BU0ssIENNRF9SRFksIDApKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAid2Q3MDAwX2luaXQ6IFdBSVQgdGltZWQgb3V0LlxuIik7Ci0JCXJldHVybiAtMTsJLyogLTEgPSBub3Qgb2sgKi8KLQl9Ci0KLQlpZiAoKGRpYWcgPSBpbmIoaG9zdC0+aW9iYXNlICsgQVNDX0lOVFJfU1RBVCkpICE9IDEpIHsKLQkJcHJpbnRrKCJ3ZDcwMDBfaW5pdDogIik7Ci0KLQkJc3dpdGNoIChkaWFnKSB7Ci0JCWNhc2UgMjoKLQkJCXByaW50ayhLRVJOX0VSUiAiUkFNIGZhaWx1cmUuXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlwcmludGsoS0VSTl9FUlIgIkZJRk8gUi9XIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJTQklDIHJlZ2lzdGVyIFIvVyBmYWlsZWRcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNToKLQkJCXByaW50ayhLRVJOX0VSUiAiSW5pdGlhbGl6YXRpb24gRC1GRiBmYWlsZWQuXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIDY6Ci0JCQlwcmludGsoS0VSTl9FUlIgIkhvc3QgSVJRIEQtRkYgZmFpbGVkLlxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSA3OgotCQkJcHJpbnRrKEtFUk5fRVJSICJST00gY2hlY2tzdW0gZXJyb3IuXG4iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fRVJSICJkaWFnbm9zdGljIGNvZGUgMHglMDJYaCByZWNlaXZlZC5cbiIsIGRpYWcpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JLyogQ2xlYXIgbWFpbGJveGVzICovCi0JbWVtc2V0KCYoaG9zdC0+bWIpLCAwLCBzaXplb2YoaG9zdC0+bWIpKTsKLQotCS8qIEV4ZWN1dGUgaW5pdCBjb21tYW5kICovCi0JYW55MnNjc2koKHVuY2hhciAqKSAmIChpbml0X2NtZC5tYWlsYm94ZXMpLCAoaW50KSAmKGhvc3QtPm1iKSk7Ci0JaWYgKCFjb21tYW5kX291dChob3N0LCAodW5jaGFyICopICYgaW5pdF9jbWQsIHNpemVvZihpbml0X2NtZCkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAid2Q3MDAwX2FkYXB0ZXJfcmVzZXQ6IGFkYXB0ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoV0FJVChob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCwgQVNDX1NUQVRNQVNLLCBBU0NfSU5JVCwgMCkpIHsKLQkJcHJpbnRrKCJ3ZDcwMDBfYWRhcHRlcl9yZXNldDogV0FJVCB0aW1lZCBvdXQuXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3ZDcwMDBfaW5pdChBZGFwdGVyICogaG9zdCkKLXsKLQlpZiAod2Q3MDAwX2FkYXB0ZXJfcmVzZXQoaG9zdCkgPT0gLTEpCi0JCXJldHVybiAwOwotCi0KLQlpZiAocmVxdWVzdF9pcnEoaG9zdC0+aXJxLCB3ZDcwMDBfaW50ciwgMCwgIndkNzAwMCIsIGhvc3QpKSB7Ci0JCXByaW50aygid2Q3MDAwX2luaXQ6IGNhbid0IGdldCBJUlEgJWQuXG4iLCBob3N0LT5pcnEpOwotCQlyZXR1cm4gKDApOwotCX0KLQlpZiAocmVxdWVzdF9kbWEoaG9zdC0+ZG1hLCAid2Q3MDAwIikpIHsKLQkJcHJpbnRrKCJ3ZDcwMDBfaW5pdDogY2FuJ3QgZ2V0IERNQSBjaGFubmVsICVkLlxuIiwgaG9zdC0+ZG1hKTsKLQkJZnJlZV9pcnEoaG9zdC0+aXJxLCBob3N0KTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0Jd2Q3MDAwX2VuYWJsZV9kbWEoaG9zdCk7Ci0Jd2Q3MDAwX2VuYWJsZV9pbnRyKGhvc3QpOwotCi0JaWYgKCF3ZDcwMDBfZGlhZ25vc3RpY3MoaG9zdCwgSUNCX0RJQUdfRlVMTCkpIHsKLQkJZnJlZV9kbWEoaG9zdC0+ZG1hKTsKLQkJZnJlZV9pcnEoaG9zdC0+aXJxLCBOVUxMKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0KLQlyZXR1cm4gKDEpOwotfQotCi0KLXN0YXRpYyB2b2lkIHdkNzAwMF9yZXZpc2lvbihBZGFwdGVyICogaG9zdCkKLXsKLQlzdGF0aWMgSWNiUmV2THZsIGljYiA9IHsgSUNCX09QX0dFVF9SRVZJU0lPTiB9OwotCi0JaWNiLnBoYXNlID0gMTsKLQkvKgotCSAqIExpa2UgZGlhZ25vc3RpY3MsIHRoaXMgaXMgb25seSBkb25lIGF0IGluaXQgdGltZSwgaW4gZmFjdCwgZnJvbQotCSAqIHdkNzAwMF9kZXRlY3QsIHNvIHRoZXJlIHNob3VsZCBiZSBPR01CcyBhdmFpbGFibGUuICBJZiBpdCBmYWlscywKLQkgKiB0aGUgb25seSBkYW1hZ2Ugd2lsbCBiZSB0aGF0IHRoZSByZXZpc2lvbiB3aWxsIHNob3cgdXAgYXMgMC4wLAotCSAqIHdoaWNoIGluIHR1cm4gbWVhbnMgdGhhdCBzY2F0dGVyL2dhdGhlciB3aWxsIGJlIGRpc2FibGVkLgotCSAqLwotCW1haWxfb3V0KGhvc3QsIChzdHJ1Y3Qgc2NiICopICZpY2IpOwotCXdoaWxlIChpY2IucGhhc2UpIHsKLQkJY3B1X3JlbGF4KCk7CS8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQkJYmFycmllcigpOwotCX0KLQlob3N0LT5yZXYxID0gaWNiLnByaW1hcnk7Ci0JaG9zdC0+cmV2MiA9IGljYi5zZWNvbmRhcnk7Ci19Ci0KLQotc3RhdGljIGludCB3ZDcwMDBfc2V0X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQotewotCWRwcmludGsoIkJ1ZmZlciA9IDwlLipzPiwgbGVuZ3RoID0gJWRcbiIsIGxlbmd0aCwgYnVmZmVyLCBsZW5ndGgpOwotCi0JLyoKLQkgKiBDdXJyZW50bHkgdGhpcyBpcyBhIG5vLW9wCi0JICovCi0JZHByaW50aygiU29ycnksIHRoaXMgZnVuY3Rpb24gaXMgY3VycmVudGx5IG91dCBvZiBvcmRlci4uLlxuIik7Ci0JcmV0dXJuIChsZW5ndGgpOwotfQotCi0KLXN0YXRpYyBpbnQgd2Q3MDAwX3Nob3dfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCi17Ci0JQWRhcHRlciAqYWRhcHRlciA9IChBZGFwdGVyICopaG9zdC0+aG9zdGRhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLSNpZmRlZiBXRDcwMDBfREVCVUcKLQlNYWlsYm94ICpvZ21icywgKmljbWJzOwotCXNob3J0IGNvdW50OwotI2VuZGlmCi0KLQlzcGluX2xvY2tfaXJxc2F2ZShob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKLQlzZXFfcHJpbnRmKG0sICJIb3N0IHNjc2klZDogV2VzdGVybiBEaWdpdGFsIFdELTcwMDAgKHJldiAlZC4lZClcbiIsIGhvc3QtPmhvc3Rfbm8sIGFkYXB0ZXItPnJldjEsIGFkYXB0ZXItPnJldjIpOwotCXNlcV9wcmludGYobSwgIiAgSU8gYmFzZTogICAgICAweCV4XG4iLCBhZGFwdGVyLT5pb2Jhc2UpOwotCXNlcV9wcmludGYobSwgIiAgSVJROiAgICAgICAgICAlZFxuIiwgYWRhcHRlci0+aXJxKTsKLQlzZXFfcHJpbnRmKG0sICIgIERNQSBjaGFubmVsOiAgJWRcbiIsIGFkYXB0ZXItPmRtYSk7Ci0Jc2VxX3ByaW50ZihtLCAiICBJbnRlcnJ1cHRzOiAgICVkXG4iLCBhZGFwdGVyLT5pbnRfY291bnRlcik7Ci0Jc2VxX3ByaW50ZihtLCAiICBCVVNfT04gdGltZTogICVkIG5hbm9zZWNvbmRzXG4iLCBhZGFwdGVyLT5idXNfb24gKiAxMjUpOwotCXNlcV9wcmludGYobSwgIiAgQlVTX09GRiB0aW1lOiAlZCBuYW5vc2Vjb25kc1xuIiwgYWRhcHRlci0+YnVzX29mZiAqIDEyNSk7Ci0KLSNpZmRlZiBXRDcwMDBfREVCVUcKLQlvZ21icyA9IGFkYXB0ZXItPm1iLm9nbWI7Ci0JaWNtYnMgPSBhZGFwdGVyLT5tYi5pY21iOwotCi0Jc2VxX3ByaW50ZihtLCAiXG5Db250cm9sIHBvcnQgdmFsdWU6IDB4JXhcbiIsIGFkYXB0ZXItPmNvbnRyb2wpOwotCXNlcV9wdXRzKG0sICJJbmNvbWluZyBtYWlsYm94OlxuIik7Ci0Jc2VxX3ByaW50ZihtLCAiICBzaXplOiAlZFxuIiwgSUNNQl9DTlQpOwotCXNlcV9wdXRzKG0sICIgIHF1ZXVlZCBtZXNzYWdlczogIik7Ci0KLQlmb3IgKGkgPSBjb3VudCA9IDA7IGkgPCBJQ01CX0NOVDsgaSsrKQotCQlpZiAoaWNtYnNbaV0uc3RhdHVzKSB7Ci0JCQljb3VudCsrOwotCQkJc2VxX3ByaW50ZihtLCAiMHgleCAiLCBpKTsKLQkJfQotCi0Jc2VxX3B1dHMobSwgY291bnQgPyAiXG4iIDogIm5vbmVcbiIpOwotCi0Jc2VxX3B1dHMobSwgIk91dGdvaW5nIG1haWxib3g6XG4iKTsKLQlzZXFfcHJpbnRmKG0sICIgIHNpemU6ICVkXG4iLCBPR01CX0NOVCk7Ci0Jc2VxX3ByaW50ZihtLCAiICBuZXh0IG1lc3NhZ2U6IDB4JXhcbiIsIGFkYXB0ZXItPm5leHRfb2dtYik7Ci0Jc2VxX3B1dHMobSwgIiAgcXVldWVkIG1lc3NhZ2VzOiAiKTsKLQotCWZvciAoaSA9IGNvdW50ID0gMDsgaSA8IE9HTUJfQ05UOyBpKyspCi0JCWlmIChvZ21ic1tpXS5zdGF0dXMpIHsKLQkJCWNvdW50Kys7Ci0JCQlzZXFfcHJpbnRmKG0sICIweCV4ICIsIGkpOwotCQl9Ci0KLQlzZXFfcHV0cyhtLCBjb3VudCA/ICJcbiIgOiAibm9uZVxuIik7Ci0jZW5kaWYKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogIFJldHVybnMgdGhlIG51bWJlciBvZiBhZGFwdGVycyB0aGlzIGRyaXZlciBpcyBzdXBwb3J0aW5nLgotICoKLSAqICBUaGUgc291cmNlIGZvciBob3N0cy5jIHNheXMgdG8gd2FpdCB0byBjYWxsIHNjc2lfcmVnaXN0ZXIgdW50aWwgMTAwJQotICogIHN1cmUgYWJvdXQgYW4gYWRhcHRlci4gIFdlIG5lZWQgdG8gZG8gaXQgYSBsaXR0bGUgc29vbmVyIGhlcmU7IHdlCi0gKiAgbmVlZCB0aGUgc3RvcmFnZSBzZXQgdXAgYnkgc2NzaV9yZWdpc3RlciBiZWZvcmUgd2Q3MDAwX2luaXQsIGFuZAotICogIGNoYW5naW5nIHRoZSBsb2NhdGlvbiBvZiBhbiBBZGFwdGVyIHN0cnVjdHVyZSBpcyBtb3JlIHRyb3VibGUgdGhhbgotICogIGNhbGxpbmcgc2NzaV91bnJlZ2lzdGVyLgotICoKLSAqLwotCi1zdGF0aWMgX19pbml0IGludCB3ZDcwMDBfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCi17Ci0Jc2hvcnQgcHJlc2VudCA9IDAsIGJpb3NhZGRyX3B0ciwgc2lnX3B0ciwgaSwgcGFzczsKLQlzaG9ydCBiaW9zcHRyW05VTV9DT05GSUdTXTsKLQl1bnNpZ25lZCBpb2Jhc2U7Ci0JQWRhcHRlciAqaG9zdCA9IE5VTEw7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqc2g7Ci0JaW50IHVuaXQgPSAwOwotCi0JZHByaW50aygid2Q3MDAwX2RldGVjdDogc3RhcnRlZFxuIik7Ci0KLSNpZmRlZiBNT0RVTEUKLQlpZiAod2Q3MDAwKQotCQl3ZDcwMDBfc2V0dXAod2Q3MDAwKTsKLSNlbmRpZgotCi0JZm9yIChpID0gMDsgaSA8IFVOSVRTOyB3ZDcwMDBfaG9zdFtpKytdID0gTlVMTCk7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9DT05GSUdTOyBiaW9zcHRyW2krK10gPSAtMSk7Ci0KLQl0cG50LT5wcm9jX25hbWUgPSAid2Q3MDAwIjsKLQl0cG50LT5zaG93X2luZm8gPSAmd2Q3MDAwX3Nob3dfaW5mbzsKLQl0cG50LT53cml0ZV9pbmZvID0gd2Q3MDAwX3NldF9pbmZvOwotCi0JLyoKLQkgKiBTZXQgdXAgU0NCIGZyZWUgbGlzdCwgd2hpY2ggaXMgc2hhcmVkIGJ5IGFsbCBhZGFwdGVycwotCSAqLwotCWluaXRfc2NicygpOwotCi0JZm9yIChwYXNzID0gMDsgcGFzcyA8IE5VTV9DT05GSUdTOyBwYXNzKyspIHsKLQkJLyoKLQkJICogRmlyc3QsIHNlYXJjaCBmb3IgQklPUyBTSUdOQVRVUkUuLi4KLQkJICovCi0JCWZvciAoYmlvc2FkZHJfcHRyID0gMDsgYmlvc2FkZHJfcHRyIDwgTlVNX0FERFJTOyBiaW9zYWRkcl9wdHIrKykKLQkJCWZvciAoc2lnX3B0ciA9IDA7IHNpZ19wdHIgPCBOVU1fU0lHTkFUVVJFUzsgc2lnX3B0cisrKSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IHBhc3M7IGkrKykKLQkJCQkJaWYgKGJpb3NwdHJbaV0gPT0gYmlvc2FkZHJfcHRyKQotCQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAoaSA9PSBwYXNzKSB7Ci0JCQkJCXZvaWQgX19pb21lbSAqYmlvc2FkZHIgPSBpb3JlbWFwKHdkNzAwMF9iaW9zYWRkcltiaW9zYWRkcl9wdHJdICsgc2lnbmF0dXJlc1tzaWdfcHRyXS5vZnMsCi0JCQkJCQkJCSBzaWduYXR1cmVzW3NpZ19wdHJdLmxlbik7Ci0JCQkJCXNob3J0IGJpb3NfbWF0Y2ggPSAxOwotCi0JCQkJCWlmIChiaW9zYWRkcikKLQkJCQkJCWJpb3NfbWF0Y2ggPSBjaGVja19zaWduYXR1cmUoYmlvc2FkZHIsIHNpZ25hdHVyZXNbc2lnX3B0cl0uc2lnLCBzaWduYXR1cmVzW3NpZ19wdHJdLmxlbik7Ci0KLQkJCQkJaW91bm1hcChiaW9zYWRkcik7Ci0KLQkJCQkJaWYgKGJpb3NfbWF0Y2gpCi0JCQkJCQlnb3RvIGJpb3NfbWF0Y2hlZDsKLQkJCQl9Ci0JCQl9Ci0KLQkgICAgICBiaW9zX21hdGNoZWQ6Ci0JCS8qCi0JCSAqIEJJT1MgU0lHTkFUVVJFIGhhcyBiZWVuIGZvdW5kLgotCQkgKi8KLSNpZmRlZiBXRDcwMDBfREVCVUcKLQkJZHByaW50aygid2Q3MDAwX2RldGVjdDogcGFzcyAlZFxuIiwgcGFzcyArIDEpOwotCi0JCWlmIChiaW9zYWRkcl9wdHIgPT0gTlVNX0FERFJTKQotCQkJZHByaW50aygiV0QtNzAwMCBTU1QgQklPUyBub3QgZGV0ZWN0ZWQuLi5cbiIpOwotCQllbHNlCi0JCQlkcHJpbnRrKCJXRC03MDAwIFNTVCBCSU9TIGRldGVjdGVkIGF0IDB4JWx4OiBjaGVja2luZy4uLlxuIiwgd2Q3MDAwX2Jpb3NhZGRyW2Jpb3NhZGRyX3B0cl0pOwotI2VuZGlmCi0KLQkJaWYgKGNvbmZpZ3NbcGFzc10uaXJxIDwgMCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICh1bml0ID09IFVOSVRTKQotCQkJY29udGludWU7Ci0KLQkJaW9iYXNlID0gY29uZmlnc1twYXNzXS5pb2Jhc2U7Ci0KLQkJZHByaW50aygid2Q3MDAwX2RldGVjdDogY2hlY2sgSU8gMHgleCByZWdpb24uLi5cbiIsIGlvYmFzZSk7Ci0KLQkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgNCwgIndkNzAwMCIpKSB7Ci0KLQkJCWRwcmludGsoIndkNzAwMF9kZXRlY3Q6IEFTQyByZXNldCAoSU8gMHgleCkgLi4uIiwgaW9iYXNlKTsKLQkJCS8qCi0JCQkgKiBBU0MgcmVzZXQuLi4KLQkJCSAqLwotCQkJb3V0YihBU0NfUkVTLCBpb2Jhc2UgKyBBU0NfQ09OVFJPTCk7Ci0JCQltc2xlZXAoMTApOwotCQkJb3V0YigwLCBpb2Jhc2UgKyBBU0NfQ09OVFJPTCk7Ci0KLQkJCWlmIChXQUlUKGlvYmFzZSArIEFTQ19TVEFULCBBU0NfU1RBVE1BU0ssIENNRF9SRFksIDApKSB7Ci0JCQkJZHByaW50aygiZmFpbGVkIVxuIik7Ci0JCQkJZ290byBlcnJfcmVsZWFzZTsKLQkJCX0gZWxzZQotCQkJCWRwcmludGsoIm9rIVxuIik7Ci0KLQkJCWlmIChpbmIoaW9iYXNlICsgQVNDX0lOVFJfU1RBVCkgPT0gMSkgewotCQkJCS8qCi0JCQkJICogIFdlIHJlZ2lzdGVyIGhlcmUsIHRvIGdldCBhIHBvaW50ZXIgdG8gdGhlIGV4dHJhIHNwYWNlLAotCQkJCSAqICB3aGljaCB3ZSdsbCB1c2UgYXMgdGhlIEFkYXB0ZXIgc3RydWN0dXJlIChob3N0KSBmb3IKLQkJCQkgKiAgdGhpcyBhZGFwdGVyLiAgSXQgaXMgbG9jYXRlZCBqdXN0IGFmdGVyIHRoZSByZWdpc3RlcmVkCi0JCQkJICogIFNjc2lfSG9zdCBzdHJ1Y3R1cmUgKHNoKSwgYW5kIGlzIGxvY2F0ZWQgYnkgdGhlIGVtcHR5Ci0JCQkJICogIGFycmF5IGhvc3RkYXRhLgotCQkJCSAqLwotCQkJCXNoID0gc2NzaV9yZWdpc3Rlcih0cG50LCBzaXplb2YoQWRhcHRlcikpOwotCQkJCWlmIChzaCA9PSBOVUxMKQotCQkJCQlnb3RvIGVycl9yZWxlYXNlOwotCi0JCQkJaG9zdCA9IChBZGFwdGVyICopIHNoLT5ob3N0ZGF0YTsKLQotCQkJCWRwcmludGsoIndkNzAwMF9kZXRlY3Q6IGFkYXB0ZXIgYWxsb2NhdGVkIGF0IDB4JXhcbiIsIChpbnQpIGhvc3QpOwotCQkJCW1lbXNldChob3N0LCAwLCBzaXplb2YoQWRhcHRlcikpOwotCi0JCQkJaG9zdC0+aXJxID0gY29uZmlnc1twYXNzXS5pcnE7Ci0JCQkJaG9zdC0+ZG1hID0gY29uZmlnc1twYXNzXS5kbWE7Ci0JCQkJaG9zdC0+aW9iYXNlID0gaW9iYXNlOwotCQkJCWhvc3QtPmludF9jb3VudGVyID0gMDsKLQkJCQlob3N0LT5idXNfb24gPSBjb25maWdzW3Bhc3NdLmJ1c19vbjsKLQkJCQlob3N0LT5idXNfb2ZmID0gY29uZmlnc1twYXNzXS5idXNfb2ZmOwotCQkJCWhvc3QtPnNoID0gd2Q3MDAwX2hvc3RbdW5pdF0gPSBzaDsKLQkJCQl1bml0Kys7Ci0KLQkJCQlkcHJpbnRrKCJ3ZDcwMDBfZGV0ZWN0OiBUcnlpbmcgaW5pdCBXRC03MDAwIGNhcmQgYXQgSU8gIiAiMHgleCwgSVJRICVkLCBETUEgJWQuLi5cbiIsIGhvc3QtPmlvYmFzZSwgaG9zdC0+aXJxLCBob3N0LT5kbWEpOwotCi0JCQkJaWYgKCF3ZDcwMDBfaW5pdChob3N0KSkJLyogSW5pdGlhbGl6YXRpb24gZmFpbGVkICovCi0JCQkJCWdvdG8gZXJyX3VucmVnaXN0ZXI7Ci0KLQkJCQkvKgotCQkJCSAqICBPSyBmcm9tIGhlcmUgLSB3ZSdsbCB1c2UgdGhpcyBhZGFwdGVyL2NvbmZpZ3VyYXRpb24uCi0JCQkJICovCi0JCQkJd2Q3MDAwX3JldmlzaW9uKGhvc3QpOwkvKiBpbXBvcnRhbnQgZm9yIHNjYXR0ZXIvZ2F0aGVyICovCi0KLQkJCQkvKgotCQkJCSAqICBGb3IgYm9hcmRzIGJlZm9yZSByZXYgNi4wLCBzY2F0dGVyL2dhdGhlciBpc24ndCBzdXBwb3J0ZWQuCi0JCQkJICovCi0JCQkJaWYgKGhvc3QtPnJldjEgPCA2KQotCQkJCQlzaC0+c2dfdGFibGVzaXplID0gMTsKLQotCQkJCXByZXNlbnQrKzsJLyogY291bnQgaXQgKi8KLQotCQkJCWlmIChiaW9zYWRkcl9wdHIgIT0gTlVNX0FERFJTKQotCQkJCQliaW9zcHRyW3Bhc3NdID0gYmlvc2FkZHJfcHRyOwotCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiV2VzdGVybiBEaWdpdGFsIFdELTcwMDAgKHJldiAlZC4lZCkgIiwgaG9zdC0+cmV2MSwgaG9zdC0+cmV2Mik7Ci0JCQkJcHJpbnRrKCJ1c2luZyBJTyAweCV4LCBJUlEgJWQsIERNQSAlZC5cbiIsIGhvc3QtPmlvYmFzZSwgaG9zdC0+aXJxLCBob3N0LT5kbWEpOwotCQkJCXByaW50aygiICBCVVNfT04gdGltZTogJWRucywgQlVTX09GRiB0aW1lOiAlZG5zXG4iLCBob3N0LT5idXNfb24gKiAxMjUsIGhvc3QtPmJ1c19vZmYgKiAxMjUpOwotCQkJfQotCQl9IGVsc2UKLQkJCWRwcmludGsoIndkNzAwMF9kZXRlY3Q6IElPIDB4JXggcmVnaW9uIGFscmVhZHkgYWxsb2NhdGVkIVxuIiwgaW9iYXNlKTsKLQotCQljb250aW51ZTsKLQotCSAgICAgIGVycl91bnJlZ2lzdGVyOgotCQlzY3NpX3VucmVnaXN0ZXIoc2gpOwotCSAgICAgIGVycl9yZWxlYXNlOgotCQlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIDQpOwotCi0JfQotCi0JaWYgKCFwcmVzZW50KQotCQlwcmludGsoIkZhaWxlZCBpbml0aWFsaXphdGlvbiBvZiBXRC03MDAwIFNDU0kgY2FyZCFcbiIpOwotCi0JcmV0dXJuIChwcmVzZW50KTsKLX0KLQotc3RhdGljIGludCB3ZDcwMDBfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCkKLXsKLQlpZiAoc2hvc3QtPmlycSkKLQkJZnJlZV9pcnEoc2hvc3QtPmlycSwgTlVMTCk7Ci0JaWYgKHNob3N0LT5pb19wb3J0ICYmIHNob3N0LT5uX2lvX3BvcnQpCi0JCXJlbGVhc2VfcmVnaW9uKHNob3N0LT5pb19wb3J0LCBzaG9zdC0+bl9pb19wb3J0KTsKLQlzY3NpX3VucmVnaXN0ZXIoc2hvc3QpOwotCXJldHVybiAwOwotfQotCi0jaWYgMAotLyoKLSAqICBJIGhhdmUgYWJzb2x1dGVseSBOTyBpZGVhIGhvdyB0byBkbyBhbiBhYm9ydCB3aXRoIHRoZSBXRDcwMDAuLi4KLSAqLwotc3RhdGljIGludCB3ZDcwMDBfYWJvcnQoU2NzaV9DbW5kICogU0NwbnQpCi17Ci0JQWRhcHRlciAqaG9zdCA9IChBZGFwdGVyICopIFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwotCi0JaWYgKGluYihob3N0LT5pb2Jhc2UgKyBBU0NfU1RBVCkgJiBJTlRfSU0pIHsKLQkJcHJpbnRrKCJ3ZDcwMDBfYWJvcnQ6IGxvc3QgaW50ZXJydXB0XG4iKTsKLQkJd2Q3MDAwX2ludHJfaGFuZGxlKGhvc3QtPmlycSwgTlVMTCwgTlVMTCk7Ci0JCXJldHVybiBGQUlMRUQ7Ci0JfQotCXJldHVybiBGQUlMRUQ7Ci19Ci0jZW5kaWYKLQotLyoKLSAqICBMYXN0IHJlc29ydC4gUmVpbml0aWFsaXplIHRoZSBib2FyZC4KLSAqLwotCi1zdGF0aWMgaW50IHdkNzAwMF9ob3N0X3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQotewotCUFkYXB0ZXIgKmhvc3QgPSAoQWRhcHRlciAqKSBTQ3BudC0+ZGV2aWNlLT5ob3N0LT5ob3N0ZGF0YTsKLQotCXNwaW5fbG9ja19pcnEoU0NwbnQtPmRldmljZS0+aG9zdC0+aG9zdF9sb2NrKTsKLQotCWlmICh3ZDcwMDBfYWRhcHRlcl9yZXNldChob3N0KSA8IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxKFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jayk7Ci0JCXJldHVybiBGQUlMRUQ7Ci0JfQotCi0Jd2Q3MDAwX2VuYWJsZV9pbnRyKGhvc3QpOwotCi0Jc3Bpbl91bmxvY2tfaXJxKFNDcG50LT5kZXZpY2UtPmhvc3QtPmhvc3RfbG9jayk7Ci0JcmV0dXJuIFNVQ0NFU1M7Ci19Ci0KLS8qCi0gKiAgVGhpcyB3YXMgYm9ycm93ZWQgZGlyZWN0bHkgZnJvbSBhaGExNTQyLmMuIChaYWdhKQotICovCi0KLXN0YXRpYyBpbnQgd2Q3MDAwX2Jpb3NwYXJhbShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCi0JCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgKmlwKQotewotCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKLQotCWRwcmludGsoIndkNzAwMF9iaW9zcGFyYW06IGRldj0lcywgc2l6ZT0lbGx1LCAiLAotCQliZGV2bmFtZShiZGV2LCBiKSwgKHU2NCljYXBhY2l0eSk7Ci0JKHZvaWQpYjsJLyogdW51c2VkIHZhciB3YXJuaW5nPyAqLwotCi0JLyoKLQkgKiB0cnkgZGVmYXVsdCB0cmFuc2xhdGlvbgotCSAqLwotCWlwWzBdID0gNjQ7Ci0JaXBbMV0gPSAzMjsKLQlpcFsyXSA9IGNhcGFjaXR5ID4+IDExOwotCi0JLyoKLQkgKiBmb3IgZGlza3MgPjFHQiBkbyBzb21lIGd1ZXNzaW5nCi0JICovCi0JaWYgKGlwWzJdID49IDEwMjQpIHsKLQkJaW50IGluZm9bM107Ci0KLQkJLyoKLQkJICogdHJ5IHRvIGZpZ3VyZSBvdXQgdGhlIGdlb21ldHJ5IGZyb20gdGhlIHBhcnRpdGlvbiB0YWJsZQotCQkgKi8KLQkJaWYgKChzY3NpY2FtX2Jpb3NfcGFyYW0oYmRldiwgY2FwYWNpdHksIGluZm8pIDwgMCkgfHwgISgoKGluZm9bMF0gPT0gNjQpICYmIChpbmZvWzFdID09IDMyKSkgfHwgKChpbmZvWzBdID09IDI1NSkgJiYgKGluZm9bMV0gPT0gNjMpKSkpIHsKLQkJCXByaW50aygid2Q3MDAwX2Jpb3NwYXJhbTogdW5hYmxlIHRvIHZlcmlmeSBnZW9tZXRyeSBmb3IgZGlzayB3aXRoID4xR0IuXG4iICIgICAgICAgICAgICAgICAgICB1c2luZyBleHRlbmRlZCB0cmFuc2xhdGlvbi5cbiIpOwotCi0JCQlpcFswXSA9IDI1NTsKLQkJCWlwWzFdID0gNjM7Ci0JCQlpcFsyXSA9ICh1bnNpZ25lZCBsb25nKSBjYXBhY2l0eSAvICgyNTUgKiA2Myk7Ci0JCX0gZWxzZSB7Ci0JCQlpcFswXSA9IGluZm9bMF07Ci0JCQlpcFsxXSA9IGluZm9bMV07Ci0JCQlpcFsyXSA9IGluZm9bMl07Ci0KLQkJCWlmIChpbmZvWzBdID09IDI1NSkKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogY3VycmVudCBwYXJ0aXRpb24gdGFibGUgaXMgIiAidXNpbmcgZXh0ZW5kZWQgdHJhbnNsYXRpb24uXG4iLCBfX2Z1bmNfXyk7Ci0JCX0KLQl9Ci0KLQlkcHJpbnRrKCJiaW9zIGdlb21ldHJ5OiBoZWFkPSVkLCBzZWM9JWQsIGN5bD0lZFxuIiwgaXBbMF0sIGlwWzFdLCBpcFsyXSk7Ci0JZHByaW50aygiV0FSTklORzogY2hlY2ssIGlmIHRoZSBiaW9zIGdlb21ldHJ5IGlzIGNvcnJlY3QuXG4iKTsKLQotCXJldHVybiAoMCk7Ci19Ci0KLU1PRFVMRV9BVVRIT1IoIlRob21hcyBXdWVuc2NoZSwgSm9obiBCb3lkLCBNaXJvc2xhdiBaYWdvcmFjIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgdGhlIFdENzAwMCBzZXJpZXMgSVNBIGNvbnRyb2xsZXJzIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGRyaXZlcl90ZW1wbGF0ZSA9IHsKLQkucHJvY19uYW1lCQk9ICJ3ZDcwMDAiLAotCS5zaG93X2luZm8JCT0gd2Q3MDAwX3Nob3dfaW5mbywKLQkud3JpdGVfaW5mbwkJPSB3ZDcwMDBfc2V0X2luZm8sCi0JLm5hbWUJCQk9ICJXZXN0ZXJuIERpZ2l0YWwgV0QtNzAwMCIsCi0JLmRldGVjdAkJCT0gd2Q3MDAwX2RldGVjdCwKLQkucmVsZWFzZQkJPSB3ZDcwMDBfcmVsZWFzZSwKLQkucXVldWVjb21tYW5kCQk9IHdkNzAwMF9xdWV1ZWNvbW1hbmQsCi0JLmVoX2hvc3RfcmVzZXRfaGFuZGxlcgk9IHdkNzAwMF9ob3N0X3Jlc2V0LAotCS5iaW9zX3BhcmFtCQk9IHdkNzAwMF9iaW9zcGFyYW0sCi0JLmNhbl9xdWV1ZQkJPSBXRDcwMDBfUSwKLQkudGhpc19pZAkJPSA3LAotCS5zZ190YWJsZXNpemUJCT0gV0Q3MDAwX1NHLAotCS51bmNoZWNrZWRfaXNhX2RtYQk9IDEsCi0JLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAotfTsKLQotI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvd2Q3MTl4LmMgYi9kcml2ZXJzL3Njc2kvd2Q3MTl4LmMKaW5kZXggZTNkYTFhMi4uMmE5ZGEyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3dkNzE5eC5jCisrKyBiL2RyaXZlcnMvc2NzaS93ZDcxOXguYwpAQCAtOTYyLDcgKzk2Miw3IEBACiAJc2NzaV9ob3N0X3B1dChzaCk7CiB9CiAKLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRSh3ZDcxOXhfcGNpX3RhYmxlKSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCB3ZDcxOXhfcGNpX3RhYmxlW10gPSB7CiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfV0QsIDB4MzI5NikgfSwKIAl7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL3NhbXN1bmcvcG1fZG9tYWlucy5jIGIvZHJpdmVycy9zb2Mvc2Ftc3VuZy9wbV9kb21haW5zLmMKaW5kZXggNDgyMjM0Ni4uNzExMjAwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zb2Mvc2Ftc3VuZy9wbV9kb21haW5zLmMKKysrIGIvZHJpdmVycy9zb2Mvc2Ftc3VuZy9wbV9kb21haW5zLmMKQEAgLTIxNSwyOSArMjE1LDIyIEBACiAKIAkvKiBBc3NpZ24gdGhlIGNoaWxkIHBvd2VyIGRvbWFpbnMgdG8gdGhlaXIgcGFyZW50cyAqLwogCWZvcl9lYWNoX21hdGNoaW5nX25vZGUobnAsIGV4eW5vc19wbV9kb21haW5fb2ZfbWF0Y2gpIHsKLQkJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpjaGlsZF9kb21haW4sICpwYXJlbnRfZG9tYWluOwotCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGFyZ3M7CisJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgY2hpbGQsIHBhcmVudDsKIAotCQlhcmdzLm5wID0gbnA7Ci0JCWFyZ3MuYXJnc19jb3VudCA9IDA7Ci0JCWNoaWxkX2RvbWFpbiA9IG9mX2dlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKCZhcmdzKTsKLQkJaWYgKElTX0VSUihjaGlsZF9kb21haW4pKQotCQkJY29udGludWU7CisJCWNoaWxkLm5wID0gbnA7CisJCWNoaWxkLmFyZ3NfY291bnQgPSAwOwogCiAJCWlmIChvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhucCwgInBvd2VyLWRvbWFpbnMiLAotCQkJCQkgIiNwb3dlci1kb21haW4tY2VsbHMiLCAwLCAmYXJncykgIT0gMCkKKwkJCQkJICAgICAgICIjcG93ZXItZG9tYWluLWNlbGxzIiwgMCwKKwkJCQkJICAgICAgICZwYXJlbnQpICE9IDApCiAJCQljb250aW51ZTsKIAotCQlwYXJlbnRfZG9tYWluID0gb2ZfZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoJmFyZ3MpOwotCQlpZiAoSVNfRVJSKHBhcmVudF9kb21haW4pKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHBtX2dlbnBkX2FkZF9zdWJkb21haW4ocGFyZW50X2RvbWFpbiwgY2hpbGRfZG9tYWluKSkKKwkJaWYgKG9mX2dlbnBkX2FkZF9zdWJkb21haW4oJnBhcmVudCwgJmNoaWxkKSkKIAkJCXByX3dhcm4oIiVzIGZhaWxlZCB0byBhZGQgc3ViZG9tYWluOiAlc1xuIiwKLQkJCQlwYXJlbnRfZG9tYWluLT5uYW1lLCBjaGlsZF9kb21haW4tPm5hbWUpOworCQkJCXBhcmVudC5ucC0+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+aW9jX2lubGxlbjE7CisJCWlmIChuYW1lbGVuIDwgMSB8fCBuYW1lbGVuICE9IHN0cmxlbihmaWxlbmFtZSkgKyAxKSB7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG1pZ3JhdGVfZnJlZTsKKwkJfQorCisJCWlmIChkYXRhLT5pb2NfaW5sbGVuMiAhPSBzaXplb2YobWR0aWR4KSkgeworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBtaWdyYXRlX2ZyZWU7CisJCX0KKwkJbWR0aWR4ID0gKihpbnQgKilkYXRhLT5pb2NfaW5sYnVmMjsKKworCQlyYyA9IGxsX21pZ3JhdGUoaW5vZGUsIGZpbGUsIG1kdGlkeCwgZmlsZW5hbWUsIG5hbWVsZW4gLSAxKTsKK21pZ3JhdGVfZnJlZToKKwkJb2JkX2lvY3RsX2ZyZWVkYXRhKGJ1ZiwgbGVuKTsKKworCQlyZXR1cm4gcmM7CisJfQorCiAJZGVmYXVsdDoKIAkJcmV0dXJuIG9iZF9pb2NvbnRyb2woY21kLCBzYmktPmxsX2R0X2V4cCwgMCwgTlVMTCwKIAkJCQkgICAgICh2b2lkIF9fdXNlciAqKWFyZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMKaW5kZXggNTcyODFiOS4uZDU2ODYzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZmlsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYwpAQCAtMzgsMTQgKzM4LDE1IEBACiAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+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+bGxfbWRfZXhwLAorCQkJCQkgaW5vZGUsIG9jaCwgTlVMTCk7CiB9CiAKIC8qIEZpbGxzIHRoZSBvYmRvIHdpdGggdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBsc20gKi8KQEAgLTExMzgsMTAgKzExMTcsMTEgQEAKIHsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGZpbGVfaW5vZGUoZmlsZSkpOwogCXN0cnVjdCBsbF9maWxlX2RhdGEgICpmZCAgPSBMVVNUUkVfRlBSSVZBVEUoZmlsZSk7CisJc3RydWN0IHJhbmdlX2xvY2sgcmFuZ2U7CiAJc3RydWN0IGNsX2lvCSAqaW87CiAJc3NpemVfdAkgICAgICAgcmVzdWx0OwogCi0JQ0RFQlVHKERfVkZTVFJBQ0UsICJmaWxlOiAlcywgdHlwZTogJWQgcHBvczogJWxsdSwgY291bnQ6ICV6ZFxuIiwKKwlDREVCVUcoRF9WRlNUUkFDRSwgImZpbGU6ICVzLCB0eXBlOiAlZCBwcG9zOiAlbGx1LCBjb3VudDogJXp1XG4iLAogCSAgICAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSwgaW90LCAqcHBvcywgY291bnQpOwogCiByZXN0YXJ0OgpAQCAtMTE1MCw0MSArMTEzMCw0NSBAQAogCiAJaWYgKGNsX2lvX3J3X2luaXQoZW52LCBpbywgaW90LCAqcHBvcywgY291bnQpID09IDApIHsKIAkJc3RydWN0IHZ2cF9pbyAqdmlvID0gdnZwX2Vudl9pbyhlbnYpOwotCQlpbnQgd3JpdGVfbXV0ZXhfbG9ja2VkID0gMDsKKwkJYm9vbCByYW5nZV9sb2NrZWQgPSBmYWxzZTsKKworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKQorCQkJcmFuZ2VfbG9ja19pbml0KCZyYW5nZSwgMCwgTFVTVFJFX0VPRik7CisJCWVsc2UKKwkJCXJhbmdlX2xvY2tfaW5pdCgmcmFuZ2UsICpwcG9zLCAqcHBvcyArIGNvdW50IC0gMSk7CiAKIAkJdmlvLT52dWlfZmQgID0gTFVTVFJFX0ZQUklWQVRFKGZpbGUpOwotCQl2aW8tPnZ1aV9pb19zdWJ0eXBlID0gYXJncy0+dmlhX2lvX3N1YnR5cGU7CisJCXZpby0+dnVpX2l0ZXIgPSBhcmdzLT51Lm5vcm1hbC52aWFfaXRlcjsKKwkJdmlvLT52dWlfaW9jYiA9IGFyZ3MtPnUubm9ybWFsLnZpYV9pb2NiOworCQkvKgorCQkgKiBEaXJlY3QgSU8gcmVhZHMgbXVzdCBhbHNvIHRha2UgcmFuZ2UgbG9jaywKKwkJICogb3IgbXVsdGlwbGUgcmVhZHMgd2lsbCB0cnkgdG8gd29yayBvbiB0aGUgc2FtZSBwYWdlcworCQkgKiBTZWUgTFUtNjIyNyBmb3IgZGV0YWlscy4KKwkJICovCisJCWlmICgoKGlvdCA9PSBDSVRfV1JJVEUpIHx8CisJCSAgICAgKGlvdCA9PSBDSVRfUkVBRCAmJiAoZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSkpICYmCisJCSAgICAhKHZpby0+dnVpX2ZkLT5mZF9mbGFncyAmIExMX0ZJTEVfR1JPVVBfTE9DS0VEKSkgeworCQkJQ0RFQlVHKERfVkZTVFJBQ0UsICJSYW5nZSBsb2NrIFslbGx1LCAlbGx1XVxuIiwKKwkJCSAgICAgICByYW5nZS5ybF9ub2RlLmluX2V4dGVudC5zdGFydCwKKwkJCSAgICAgICByYW5nZS5ybF9ub2RlLmluX2V4dGVudC5lbmQpOworCQkJcmVzdWx0ID0gcmFuZ2VfbG9jaygmbGxpLT5sbGlfd3JpdGVfdHJlZSwKKwkJCQkJICAgICZyYW5nZSk7CisJCQlpZiAocmVzdWx0IDwgMCkKKwkJCQlnb3RvIG91dDsKIAotCQlzd2l0Y2ggKHZpby0+dnVpX2lvX3N1YnR5cGUpIHsKLQkJY2FzZSBJT19OT1JNQUw6Ci0JCQl2aW8tPnZ1aV9pdGVyID0gYXJncy0+dS5ub3JtYWwudmlhX2l0ZXI7Ci0JCQl2aW8tPnZ1aV9pb2NiID0gYXJncy0+dS5ub3JtYWwudmlhX2lvY2I7Ci0JCQlpZiAoKGlvdCA9PSBDSVRfV1JJVEUpICYmCi0JCQkgICAgISh2aW8tPnZ1aV9mZC0+ZmRfZmxhZ3MgJiBMTF9GSUxFX0dST1VQX0xPQ0tFRCkpIHsKLQkJCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZsbGktPgotCQkJCQkJCSAgICAgICBsbGlfd3JpdGVfbXV0ZXgpKSB7Ci0JCQkJCXJlc3VsdCA9IC1FUkVTVEFSVFNZUzsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJCXdyaXRlX211dGV4X2xvY2tlZCA9IDE7Ci0JCQl9Ci0JCQlkb3duX3JlYWQoJmxsaS0+bGxpX3RydW5jX3NlbSk7Ci0JCQlicmVhazsKLQkJY2FzZSBJT19TUExJQ0U6Ci0JCQl2aW8tPnUuc3BsaWNlLnZ1aV9waXBlID0gYXJncy0+dS5zcGxpY2UudmlhX3BpcGU7Ci0JCQl2aW8tPnUuc3BsaWNlLnZ1aV9mbGFncyA9IGFyZ3MtPnUuc3BsaWNlLnZpYV9mbGFnczsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQ0VSUk9SKCJVbmtub3duIElPIHR5cGUgLSAldVxuIiwgdmlvLT52dWlfaW9fc3VidHlwZSk7Ci0JCQlMQlVHKCk7CisJCQlyYW5nZV9sb2NrZWQgPSB0cnVlOwogCQl9CisJCWRvd25fcmVhZCgmbGxpLT5sbGlfdHJ1bmNfc2VtKTsKIAkJbGxfY2xfYWRkKGZpbGUsIGVudiwgaW8pOwogCQlyZXN1bHQgPSBjbF9pb19sb29wKGVudiwgaW8pOwogCQlsbF9jbF9yZW1vdmUoZmlsZSwgZW52KTsKLQkJaWYgKGFyZ3MtPnZpYV9pb19zdWJ0eXBlID09IElPX05PUk1BTCkKLQkJCXVwX3JlYWQoJmxsaS0+bGxpX3RydW5jX3NlbSk7Ci0JCWlmICh3cml0ZV9tdXRleF9sb2NrZWQpCi0JCQltdXRleF91bmxvY2soJmxsaS0+bGxpX3dyaXRlX211dGV4KTsKKwkJdXBfcmVhZCgmbGxpLT5sbGlfdHJ1bmNfc2VtKTsKKwkJaWYgKHJhbmdlX2xvY2tlZCkgeworCQkJQ0RFQlVHKERfVkZTVFJBQ0UsICJSYW5nZSB1bmxvY2sgWyVsbHUsICVsbHVdXG4iLAorCQkJICAgICAgIHJhbmdlLnJsX25vZGUuaW5fZXh0ZW50LnN0YXJ0LAorCQkJICAgICAgIHJhbmdlLnJsX25vZGUuaW5fZXh0ZW50LmVuZCk7CisJCQlyYW5nZV91bmxvY2soJmxsaS0+bGxpX3dyaXRlX3RyZWUsICZyYW5nZSk7CisJCX0KIAl9IGVsc2UgewogCQkvKiBjbF9pb19yd19pbml0KCkgaGFuZGxlZCBJTyAqLwogCQlyZXN1bHQgPSBpby0+Y2lfcmVzdWx0OwpAQCAtMTIwMSw3ICsxMTg1LDcgQEAKIAkgKiBzaG9ydCByZWFkL3dyaXRlIGluc3RlYWQgb2YgcmVzdGFydCBpby4KIAkgKi8KIAlpZiAoKHJlc3VsdCA9PSAwIHx8IHJlc3VsdCA9PSAtRU5PREFUQSkgJiYgaW8tPmNpX25lZWRfcmVzdGFydCkgewotCQlDREVCVUcoRF9WRlNUUkFDRSwgIlJlc3RhcnQgJXMgb24gJXBEIGZyb20gJWxsZCwgY291bnQ6JXpkXG4iLAorCQlDREVCVUcoRF9WRlNUUkFDRSwgIlJlc3RhcnQgJXMgb24gJXBEIGZyb20gJWxsZCwgY291bnQ6JXp1XG4iLAogCQkgICAgICAgaW90ID09IENJVF9SRUFEID8gInJlYWQiIDogIndyaXRlIiwKIAkJICAgICAgIGZpbGUsICpwcG9zLCBjb3VudCk7CiAJCUxBU1NFUlRGKGlvLT5jaV9ub2IgPT0gMCwgIiV6ZFxuIiwgaW8tPmNpX25vYik7CkBAIC0xMjM3LDcgKzEyMjEsNyBAQAogCWlmIChJU19FUlIoZW52KSkKIAkJcmV0dXJuIFBUUl9FUlIoZW52KTsKIAotCWFyZ3MgPSBsbF9lbnZfYXJncyhlbnYsIElPX05PUk1BTCk7CisJYXJncyA9IGxsX2Vudl9hcmdzKGVudik7CiAJYXJncy0+dS5ub3JtYWwudmlhX2l0ZXIgPSB0bzsKIAlhcmdzLT51Lm5vcm1hbC52aWFfaW9jYiA9IGlvY2I7CiAKQEAgLTEyNjEsNyArMTI0NSw3IEBACiAJaWYgKElTX0VSUihlbnYpKQogCQlyZXR1cm4gUFRSX0VSUihlbnYpOwogCi0JYXJncyA9IGxsX2Vudl9hcmdzKGVudiwgSU9fTk9STUFMKTsKKwlhcmdzID0gbGxfZW52X2FyZ3MoZW52KTsKIAlhcmdzLT51Lm5vcm1hbC52aWFfaXRlciA9IGZyb207CiAJYXJncy0+dS5ub3JtYWwudmlhX2lvY2IgPSBpb2NiOwogCkBAIC0xMjcxLDExOSArMTI1NSwxNSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8qCi0gKiBTZW5kIGZpbGUgY29udGVudCAodGhyb3VnaCBwYWdlY2FjaGUpIHNvbWV3aGVyZSB3aXRoIGhlbHBlcgotICovCi1zdGF0aWMgc3NpemVfdCBsbF9maWxlX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICppbl9maWxlLCBsb2ZmX3QgKnBwb3MsCi0JCQkJICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGNvdW50LAotCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgbHVfZW52ICAgICAgKmVudjsKLQlzdHJ1Y3QgdnZwX2lvX2FyZ3MgKmFyZ3M7Ci0Jc3NpemVfdAkgICAgIHJlc3VsdDsKLQlpbnQJCSByZWZjaGVjazsKLQotCWVudiA9IGNsX2Vudl9nZXQoJnJlZmNoZWNrKTsKLQlpZiAoSVNfRVJSKGVudikpCi0JCXJldHVybiBQVFJfRVJSKGVudik7Ci0KLQlhcmdzID0gbGxfZW52X2FyZ3MoZW52LCBJT19TUExJQ0UpOwotCWFyZ3MtPnUuc3BsaWNlLnZpYV9waXBlID0gcGlwZTsKLQlhcmdzLT51LnNwbGljZS52aWFfZmxhZ3MgPSBmbGFnczsKLQotCXJlc3VsdCA9IGxsX2ZpbGVfaW9fZ2VuZXJpYyhlbnYsIGFyZ3MsIGluX2ZpbGUsIENJVF9SRUFELCBwcG9zLCBjb3VudCk7Ci0JY2xfZW52X3B1dChlbnYsICZyZWZjaGVjayk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludCBsbF9sb3ZfcmVjcmVhdGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG9zdF9pZCAqb2ksIHUzMiBvc3RfaWR4KQotewotCXN0cnVjdCBvYmRfZXhwb3J0ICpleHAgPSBsbF9pMmR0ZXhwKGlub2RlKTsKLQlzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gb3RpID0geyAwIH07Ci0Jc3RydWN0IG9iZG8gKm9hID0gTlVMTDsKLQlpbnQgbHNtX3NpemU7Ci0JaW50IHJjID0gMDsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtID0gTlVMTCwgKmxzbTI7Ci0KLQlvYSA9IGttZW1fY2FjaGVfemFsbG9jKG9iZG9fY2FjaGVwLCBHRlBfTk9GUyk7Ci0JaWYgKCFvYSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlsc20gPSBjY2NfaW5vZGVfbHNtX2dldChpbm9kZSk7Ci0JaWYgKCFsc21faGFzX29iamVjdHMobHNtKSkgewotCQlyYyA9IC1FTk9FTlQ7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWxzbV9zaXplID0gc2l6ZW9mKCpsc20pICsgKHNpemVvZihzdHJ1Y3QgbG92X29pbmZvKSAqCi0JCSAgIChsc20tPmxzbV9zdHJpcGVfY291bnQpKTsKLQotCWxzbTIgPSBsaWJjZnNfa3Z6YWxsb2MobHNtX3NpemUsIEdGUF9OT0ZTKTsKLQlpZiAoIWxzbTIpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlvYS0+b19vaSA9ICpvaTsKLQlvYS0+b19ubGluayA9IG9zdF9pZHg7Ci0Jb2EtPm9fZmxhZ3MgfD0gT0JEX0ZMX1JFQ1JFQVRFX09CSlM7Ci0Jb2EtPm9fdmFsaWQgPSBPQkRfTURfRkxJRCB8IE9CRF9NRF9GTEZMQUdTIHwgT0JEX01EX0ZMR1JPVVA7Ci0Jb2Jkb19mcm9tX2lub2RlKG9hLCBpbm9kZSwgT0JEX01EX0ZMVFlQRSB8IE9CRF9NRF9GTEFUSU1FIHwKLQkJCQkgICBPQkRfTURfRkxNVElNRSB8IE9CRF9NRF9GTENUSU1FKTsKLQlvYmRvX3NldF9wYXJlbnRfZmlkKG9hLCAmbGxfaTJpbmZvKGlub2RlKS0+bGxpX2ZpZCk7Ci0JbWVtY3B5KGxzbTIsIGxzbSwgbHNtX3NpemUpOwotCWxsX2lub2RlX3NpemVfbG9jayhpbm9kZSk7Ci0JcmMgPSBvYmRfY3JlYXRlKE5VTEwsIGV4cCwgb2EsICZsc20yLCAmb3RpKTsKLQlsbF9pbm9kZV9zaXplX3VubG9jayhpbm9kZSk7Ci0KLQlrdmZyZWUobHNtMik7Ci0JZ290byBvdXQ7Ci1vdXQ6Ci0JY2NjX2lub2RlX2xzbV9wdXQoaW5vZGUsIGxzbSk7Ci0Ja21lbV9jYWNoZV9mcmVlKG9iZG9fY2FjaGVwLCBvYSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IGxsX2xvdl9yZWNyZWF0ZV9vYmooc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IGxsX3JlY3JlYXRlX29iaiB1Y3JlYXQ7Ci0Jc3RydWN0IG9zdF9pZAkJb2k7Ci0KLQlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9TWVNfQURNSU4pKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZ1Y3JlYXQsIChzdHJ1Y3QgbGxfcmVjcmVhdGVfb2JqIF9fdXNlciAqKWFyZywKLQkJCSAgIHNpemVvZih1Y3JlYXQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlvc3RpZF9zZXRfc2VxX21kdDAoJm9pKTsKLQlvc3RpZF9zZXRfaWQoJm9pLCB1Y3JlYXQubHJjX2lkKTsKLQlyZXR1cm4gbGxfbG92X3JlY3JlYXRlKGlub2RlLCAmb2ksIHVjcmVhdC5scmNfb3N0X2lkeCk7Ci19Ci0KLXN0YXRpYyBpbnQgbGxfbG92X3JlY3JlYXRlX2ZpZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzdHJ1Y3QgbHVfZmlkCWZpZDsKLQlzdHJ1Y3Qgb3N0X2lkCW9pOwotCXUzMgkJb3N0X2lkeDsKLQotCWlmICghY2FwYWJsZShDRlNfQ0FQX1NZU19BRE1JTikpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmZpZCwgKHN0cnVjdCBsdV9maWQgX191c2VyICopYXJnLCBzaXplb2YoZmlkKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JZmlkX3RvX29zdGlkKCZmaWQsICZvaSk7Ci0Jb3N0X2lkeCA9IChmaWRfc2VxKCZmaWQpID4+IDE2KSAmIDB4ZmZmZjsKLQlyZXR1cm4gbGxfbG92X3JlY3JlYXRlKGlub2RlLCAmb2ksIG9zdF9pZHgpOwotfQotCiBpbnQgbGxfbG92X3NldHN0cmlwZV9lYV9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJCSAgICAgX191NjQgZmxhZ3MsIHN0cnVjdCBsb3ZfdXNlcl9tZCAqbHVtLAogCQkJICAgICBpbnQgbHVtX3NpemUpCiB7CiAJc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSA9IE5VTEw7Ci0Jc3RydWN0IGxvb2t1cF9pbnRlbnQgb2l0ID0gey5pdF9vcCA9IElUX09QRU4sIC5pdF9mbGFncyA9IGZsYWdzfTsKKwlzdHJ1Y3QgbG9va3VwX2ludGVudCBvaXQgPSB7CisJCS5pdF9vcCA9IElUX09QRU4sCisJCS5pdF9mbGFncyA9IGZsYWdzIHwgTURTX09QRU5fQllfRklELAorCX07CiAJaW50IHJjID0gMDsKIAogCWxzbSA9IGNjY19pbm9kZV9sc21fZ2V0KGlub2RlKTsKQEAgLTEzOTcsMTEgKzEyNzcsMTEgQEAKIAogCWxsX2lub2RlX3NpemVfbG9jayhpbm9kZSk7CiAJcmMgPSBsbF9pbnRlbnRfZmlsZV9vcGVuKGRlbnRyeSwgbHVtLCBsdW1fc2l6ZSwgJm9pdCk7Ci0JaWYgKHJjKQorCWlmIChyYyA8IDApCiAJCWdvdG8gb3V0X3VubG9jazsKIAlyYyA9IG9pdC5pdF9zdGF0dXM7CiAJaWYgKHJjIDwgMCkKLQkJZ290byBvdXRfcmVxX2ZyZWU7CisJCWdvdG8gb3V0X3VubG9jazsKIAogCWxsX3JlbGVhc2Vfb3BlbmhhbmRsZShpbm9kZSwgJm9pdCk7CiAKQEAgLTE0MTEsOSArMTI5MSw2IEBACiAJY2NjX2lub2RlX2xzbV9wdXQoaW5vZGUsIGxzbSk7CiBvdXQ6CiAJcmV0dXJuIHJjOwotb3V0X3JlcV9mcmVlOgotCXB0bHJwY19yZXFfZmluaXNoZWQoKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKW9pdC5pdF9yZXF1ZXN0KTsKLQlnb3RvIG91dDsKIH0KIAogaW50IGxsX2xvdl9nZXRzdHJpcGVfZWFfaW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwKQEAgLTE0NDgsOSArMTMyNSw5IEBACiAKIAlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKIAotCWxtbXNpemUgPSBib2R5LT5lYWRhdGFzaXplOworCWxtbXNpemUgPSBib2R5LT5tYm9fZWFkYXRhc2l6ZTsKIAotCWlmICghKGJvZHktPnZhbGlkICYgKE9CRF9NRF9GTEVBU0laRSB8IE9CRF9NRF9GTERJUkVBKSkgfHwKKwlpZiAoIShib2R5LT5tYm9fdmFsaWQgJiAoT0JEX01EX0ZMRUFTSVpFIHwgT0JEX01EX0ZMRElSRUEpKSB8fAogCSAgICBsbW1zaXplID09IDApIHsKIAkJcmMgPSAtRU5PREFUQTsKIAkJZ290byBvdXQ7CkBAIC0xNDgxLDEzICsxMzU4LDEzIEBACiAJCSAqLwogCQlpZiAobG1tLT5sbW1fbWFnaWMgPT0gY3B1X3RvX2xlMzIoTE9WX01BR0lDX1YxKSkgewogCQkJbHVzdHJlX3N3YWJfbG92X3VzZXJfbWRfdjEoKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSAqKWxtbSk7Ci0JCQlpZiAoU19JU1JFRyhib2R5LT5tb2RlKSkKKwkJCWlmIChTX0lTUkVHKGJvZHktPm1ib19tb2RlKSkKIAkJCQlsdXN0cmVfc3dhYl9sb3ZfdXNlcl9tZF9vYmplY3RzKAogCQkJCSAoKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSAqKWxtbSktPmxtbV9vYmplY3RzLAogCQkJCSBzdHJpcGVfY291bnQpOwogCQl9IGVsc2UgaWYgKGxtbS0+bG1tX21hZ2ljID09IGNwdV90b19sZTMyKExPVl9NQUdJQ19WMykpIHsKIAkJCWx1c3RyZV9zd2FiX2xvdl91c2VyX21kX3YzKChzdHJ1Y3QgbG92X3VzZXJfbWRfdjMgKilsbW0pOwotCQkJaWYgKFNfSVNSRUcoYm9keS0+bW9kZSkpCisJCQlpZiAoU19JU1JFRyhib2R5LT5tYm9fbW9kZSkpCiAJCQkJbHVzdHJlX3N3YWJfbG92X3VzZXJfbWRfb2JqZWN0cygKIAkJCQkgKChzdHJ1Y3QgbG92X3VzZXJfbWRfdjMgKilsbW0pLT5sbW1fb2JqZWN0cywKIAkJCQkgc3RyaXBlX2NvdW50KTsKQEAgLTE1MzAsNTUgKzE0MDcsNDggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgbGxfbG92X3NldHN0cmlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgbGxfZmlsZV9nZXRzdHJpcGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqbHVtKQogewotCXN0cnVjdCBsb3ZfdXNlcl9tZF92MyBsdW12MzsKLQlzdHJ1Y3QgbG92X3VzZXJfbWRfdjEgKmx1bXYxID0gKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSAqKSZsdW12MzsKLQlzdHJ1Y3QgbG92X3VzZXJfbWRfdjEgX191c2VyICpsdW12MXAgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0Jc3RydWN0IGxvdl91c2VyX21kX3YzIF9fdXNlciAqbHVtdjNwID0gKHZvaWQgX191c2VyICopYXJnOwotCWludCBsdW1fc2l6ZSwgcmM7Ci0JX191NjQgZmxhZ3MgPSBGTU9ERV9XUklURTsKKwlzdHJ1Y3QgbHVfZW52ICplbnY7CisJaW50IHJlZmNoZWNrOworCWludCByYzsKIAotCS8qIGZpcnN0IHRyeSB3aXRoIHYxIHdoaWNoIGlzIHNtYWxsZXIgdGhhbiB2MyAqLwotCWx1bV9zaXplID0gc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGx1bXYxLCBsdW12MXAsIGx1bV9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CisJZW52ID0gY2xfZW52X2dldCgmcmVmY2hlY2spOworCWlmIChJU19FUlIoZW52KSkKKwkJcmV0dXJuIFBUUl9FUlIoZW52KTsKIAotCWlmIChsdW12MS0+bG1tX21hZ2ljID09IExPVl9VU0VSX01BR0lDX1YzKSB7Ci0JCWx1bV9zaXplID0gc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92Myk7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmbHVtdjMsIGx1bXYzcCwgbHVtX3NpemUpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmMgPSBsbF9sb3Zfc2V0c3RyaXBlX2VhX2luZm8oaW5vZGUsIGZpbGUtPmZfcGF0aC5kZW50cnksIGZsYWdzLCBsdW12MSwKLQkJCQkgICAgICBsdW1fc2l6ZSk7Ci0JY2xfbG92X2RlbGF5X2NyZWF0ZV9jbGVhcigmZmlsZS0+Zl9mbGFncyk7Ci0JaWYgKHJjID09IDApIHsKLQkJc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbTsKLQkJX191MzIgZ2VuOwotCi0JCXB1dF91c2VyKDAsICZsdW12MXAtPmxtbV9zdHJpcGVfY291bnQpOwotCi0JCWxsX2xheW91dF9yZWZyZXNoKGlub2RlLCAmZ2VuKTsKLQkJbHNtID0gY2NjX2lub2RlX2xzbV9nZXQoaW5vZGUpOwotCQlyYyA9IG9iZF9pb2NvbnRyb2woTExfSU9DX0xPVl9HRVRTVFJJUEUsIGxsX2kyZHRleHAoaW5vZGUpLAotCQkJCSAgIDAsIGxzbSwgKHZvaWQgX191c2VyICopYXJnKTsKLQkJY2NjX2lub2RlX2xzbV9wdXQoaW5vZGUsIGxzbSk7Ci0JfQorCXJjID0gY2xfb2JqZWN0X2dldHN0cmlwZShlbnYsIGxsX2kyaW5mbyhpbm9kZSktPmxsaV9jbG9iLCBsdW0pOworCWNsX2Vudl9wdXQoZW52LCAmcmVmY2hlY2spOwogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBsbF9sb3ZfZ2V0c3RyaXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBsbF9sb3Zfc2V0c3RyaXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc207Ci0JaW50IHJjID0gLUVOT0RBVEE7CisJc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqbHVtID0gKHN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGxvdl91c2VyX21kICprbHVtOworCWludCBsdW1fc2l6ZSwgcmM7CisJX191NjQgZmxhZ3MgPSBGTU9ERV9XUklURTsKIAotCWxzbSA9IGNjY19pbm9kZV9sc21fZ2V0KGlub2RlKTsKLQlpZiAobHNtKQotCQlyYyA9IG9iZF9pb2NvbnRyb2woTExfSU9DX0xPVl9HRVRTVFJJUEUsIGxsX2kyZHRleHAoaW5vZGUpLCAwLAotCQkJCSAgIGxzbSwgKHZvaWQgX191c2VyICopYXJnKTsKLQljY2NfaW5vZGVfbHNtX3B1dChpbm9kZSwgbHNtKTsKKwlyYyA9IGxsX2NvcHlfdXNlcl9tZChsdW0sICZrbHVtKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlsdW1fc2l6ZSA9IHJjOworCXJjID0gbGxfbG92X3NldHN0cmlwZV9lYV9pbmZvKGlub2RlLCBmaWxlLT5mX3BhdGguZGVudHJ5LCBmbGFncywga2x1bSwKKwkJCQkgICAgICBsdW1fc2l6ZSk7CisJY2xfbG92X2RlbGF5X2NyZWF0ZV9jbGVhcigmZmlsZS0+Zl9mbGFncyk7CisJaWYgKHJjID09IDApIHsKKwkJX191MzIgZ2VuOworCisJCXB1dF91c2VyKDAsICZsdW0tPmxtbV9zdHJpcGVfY291bnQpOworCisJCWxsX2xheW91dF9yZWZyZXNoKGlub2RlLCAmZ2VuKTsKKwkJcmMgPSBsbF9maWxlX2dldHN0cmlwZShpbm9kZSwgKHN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKilhcmcpOworCX0KKworCWtmcmVlKGtsdW0pOwogCXJldHVybiByYzsKIH0KIApAQCAtMjI0Nyw2ICsyMTE3LDEyIEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW5saW5lIGxvbmcgbGxfbGVhc2VfdHlwZV9mcm9tX2Ztb2RlKGZtb2RlX3QgZm1vZGUpCit7CisJcmV0dXJuICgoZm1vZGUgJiBGTU9ERV9SRUFEKSA/IExMX0xFQVNFX1JETENLIDogMCkgfAorCSAgICAgICAoKGZtb2RlICYgRk1PREVfV1JJVEUpID8gTExfTEVBU0VfV1JMQ0sgOiAwKTsKK30KKwogc3RhdGljIGxvbmcKIGxsX2ZpbGVfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtMjMxNCwxMSArMjE5MCw4IEBACiAJCXJldHVybiByYzsKIAl9CiAJY2FzZSBMTF9JT0NfTE9WX0dFVFNUUklQRToKLQkJcmV0dXJuIGxsX2xvdl9nZXRzdHJpcGUoaW5vZGUsIGFyZyk7Ci0JY2FzZSBMTF9JT0NfUkVDUkVBVEVfT0JKOgotCQlyZXR1cm4gbGxfbG92X3JlY3JlYXRlX29iaihpbm9kZSwgYXJnKTsKLQljYXNlIExMX0lPQ19SRUNSRUFURV9GSUQ6Ci0JCXJldHVybiBsbF9sb3ZfcmVjcmVhdGVfZmlkKGlub2RlLCBhcmcpOworCQlyZXR1cm4gbGxfZmlsZV9nZXRzdHJpcGUoaW5vZGUsCisJCQkJCSAoc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqKWFyZyk7CiAJY2FzZSBGU0ZJTFRfSU9DX0ZJRU1BUDoKIAkJcmV0dXJuIGxsX2lvY3RsX2ZpZW1hcChpbm9kZSwgYXJnKTsKIAljYXNlIEZTRklMVF9JT0NfR0VURkxBR1M6CkBAIC0yMzQ5LDYgKzIyMjIsOCBAQAogCiAJCXJldHVybiAwOwogCX0KKwljYXNlIExMX0lPQ19HRVRQQVJFTlQ6CisJCXJldHVybiBsbF9nZXRwYXJlbnQoZmlsZSwgKHN0cnVjdCBnZXRwYXJlbnQgX191c2VyICopYXJnKTsKIAljYXNlIE9CRF9JT0NfRklEMlBBVEg6CiAJCXJldHVybiBsbF9maWQycGF0aChpbm9kZSwgKHZvaWQgX191c2VyICopYXJnKTsKIAljYXNlIExMX0lPQ19EQVRBX1ZFUlNJT046IHsKQEAgLTI0NTEsMjAgKzIzMjYsMjAgQEAKIAkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CiAJCXN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSAqb2NoID0gTlVMTDsKIAkJYm9vbCBsZWFzZV9icm9rZW47Ci0JCWZtb2RlX3QgbW9kZSA9IDA7CisJCWZtb2RlX3QgZm1vZGU7CiAKIAkJc3dpdGNoIChhcmcpIHsKLQkJY2FzZSBGX1dSTENLOgorCQljYXNlIExMX0xFQVNFX1dSTENLOgogCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQogCQkJCXJldHVybiAtRVBFUk07Ci0JCQltb2RlID0gRk1PREVfV1JJVEU7CisJCQlmbW9kZSA9IEZNT0RFX1dSSVRFOwogCQkJYnJlYWs7Ci0JCWNhc2UgRl9SRExDSzoKKwkJY2FzZSBMTF9MRUFTRV9SRExDSzoKIAkJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQogCQkJCXJldHVybiAtRVBFUk07Ci0JCQltb2RlID0gRk1PREVfUkVBRDsKKwkJCWZtb2RlID0gRk1PREVfUkVBRDsKIAkJCWJyZWFrOwotCQljYXNlIEZfVU5MQ0s6CisJCWNhc2UgTExfTEVBU0VfVU5MQ0s6CiAJCQltdXRleF9sb2NrKCZsbGktPmxsaV9vY2hfbXV0ZXgpOwogCQkJaWYgKGZkLT5mZF9sZWFzZV9vY2gpIHsKIAkJCQlvY2ggPSBmZC0+ZmRfbGVhc2Vfb2NoOwpAQCAtMjQ3MiwyNiArMjM0NywyNiBAQAogCQkJfQogCQkJbXV0ZXhfdW5sb2NrKCZsbGktPmxsaV9vY2hfbXV0ZXgpOwogCi0JCQlpZiAob2NoKSB7Ci0JCQkJbW9kZSA9IG9jaC0+b2NoX2ZsYWdzICYKLQkJCQkgICAgICAgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOwotCQkJCXJjID0gbGxfbGVhc2VfY2xvc2Uob2NoLCBpbm9kZSwgJmxlYXNlX2Jyb2tlbik7Ci0JCQkJaWYgKHJjID09IDAgJiYgbGVhc2VfYnJva2VuKQotCQkJCQltb2RlID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmMgPSAtRU5PTENLOwotCQkJfQorCQkJaWYgKCFvY2gpCisJCQkJcmV0dXJuIC1FTk9MQ0s7CiAKLQkJCS8qIHJldHVybiB0aGUgdHlwZSBvZiBsZWFzZSBvciBlcnJvciAqLwotCQkJcmV0dXJuIHJjIDwgMCA/IHJjIDogKGludCltb2RlOworCQkJZm1vZGUgPSBvY2gtPm9jaF9mbGFnczsKKwkJCXJjID0gbGxfbGVhc2VfY2xvc2Uob2NoLCBpbm9kZSwgJmxlYXNlX2Jyb2tlbik7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKworCQkJaWYgKGxlYXNlX2Jyb2tlbikKKwkJCQlmbW9kZSA9IDA7CisKKwkJCXJldHVybiBsbF9sZWFzZV90eXBlX2Zyb21fZm1vZGUoZm1vZGUpOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlDREVCVUcoRF9JTk9ERSwgIlNldCBsZWFzZSB3aXRoIG1vZGUgJWRcbiIsIG1vZGUpOworCQlDREVCVUcoRF9JTk9ERSwgIlNldCBsZWFzZSB3aXRoIG1vZGUgJXVcbiIsIGZtb2RlKTsKIAogCQkvKiBhcHBseSBmb3IgbGVhc2UgKi8KLQkJb2NoID0gbGxfbGVhc2Vfb3Blbihpbm9kZSwgZmlsZSwgbW9kZSwgMCk7CisJCW9jaCA9IGxsX2xlYXNlX29wZW4oaW5vZGUsIGZpbGUsIGZtb2RlLCAwKTsKIAkJaWYgKElTX0VSUihvY2gpKQogCQkJcmV0dXJuIFBUUl9FUlIob2NoKTsKIApAQCAtMjUxMiw4ICsyMzg3LDggQEAKIAljYXNlIExMX0lPQ19HRVRfTEVBU0U6IHsKIAkJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CiAJCXN0cnVjdCBsZGxtX2xvY2sgKmxvY2sgPSBOVUxMOworCQlmbW9kZV90IGZtb2RlID0gMDsKIAotCQlyYyA9IDA7CiAJCW11dGV4X2xvY2soJmxsaS0+bGxpX29jaF9tdXRleCk7CiAJCWlmIChmZC0+ZmRfbGVhc2Vfb2NoKSB7CiAJCQlzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUgKm9jaCA9IGZkLT5mZF9sZWFzZV9vY2g7CkBAIC0yNTIyLDE0ICsyMzk3LDEzIEBACiAJCQlpZiAobG9jaykgewogCQkJCWxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCQkJCWlmICghbGRsbV9pc19jYW5jZWwobG9jaykpCi0JCQkJCXJjID0gb2NoLT5vY2hfZmxhZ3MgJgotCQkJCQkJKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJCQkJCWZtb2RlID0gb2NoLT5vY2hfZmxhZ3M7CiAJCQkJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKIAkJCQlMRExNX0xPQ0tfUFVUKGxvY2spOwogCQkJfQogCQl9CiAJCW11dGV4X3VubG9jaygmbGxpLT5sbGlfb2NoX211dGV4KTsKLQkJcmV0dXJuIHJjOworCQlyZXR1cm4gbGxfbGVhc2VfdHlwZV9mcm9tX2Ztb2RlKGZtb2RlKTsKIAl9CiAJY2FzZSBMTF9JT0NfSFNNX0lNUE9SVDogewogCQlzdHJ1Y3QgaHNtX3VzZXJfaW1wb3J0ICpodWk7CkBAIC0yNTc0LDkgKzI0NDgsOCBAQAogCQllb2YgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJfQogCi0JcmV0dmFsID0gZ2VuZXJpY19maWxlX2xsc2Vla19zaXplKGZpbGUsIG9mZnNldCwgb3JpZ2luLAotCQkJCQkgIGxsX2ZpbGVfbWF4Ynl0ZXMoaW5vZGUpLCBlb2YpOwotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGdlbmVyaWNfZmlsZV9sbHNlZWtfc2l6ZShmaWxlLCBvZmZzZXQsIG9yaWdpbiwKKwkJCQkJbGxfZmlsZV9tYXhieXRlcyhpbm9kZSksIGVvZik7CiB9CiAKIHN0YXRpYyBpbnQgbGxfZmx1c2goc3RydWN0IGZpbGUgKmZpbGUsIGZsX293bmVyX3QgaWQpCkBAIC0yNTkzLDkgKzI0NjYsMTEgQEAKIAkgKi8KIAlyYyA9IGxsaS0+bGxpX2FzeW5jX3JjOwogCWxsaS0+bGxpX2FzeW5jX3JjID0gMDsKLQllcnIgPSBsb3ZfcmVhZF9hbmRfY2xlYXJfYXN5bmNfcmMobGxpLT5sbGlfY2xvYik7Ci0JaWYgKHJjID09IDApCi0JCXJjID0gZXJyOworCWlmIChsbGktPmxsaV9jbG9iKSB7CisJCWVyciA9IGxvdl9yZWFkX2FuZF9jbGVhcl9hc3luY19yYyhsbGktPmxsaV9jbG9iKTsKKwkJaWYgKCFyYykKKwkJCXJjID0gZXJyOworCX0KIAogCS8qIFRoZSBhcHBsaWNhdGlvbiBoYXMgYmVlbiB0b2xkIGFib3V0IHdyaXRlIGZhaWx1cmUgYWxyZWFkeS4KIAkgKiBEbyBub3QgcmVwb3J0IGZhaWx1cmUgYWdhaW4uCkBAIC0yNzE0LDYgKzI1ODksNyBAQAogCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwogCXN0cnVjdCBsdXN0cmVfaGFuZGxlIGxvY2toID0gezB9OwogCWxkbG1fcG9saWN5X2RhdGFfdCBmbG9jayA9IHsgezB9IH07CisJaW50IGZsX3R5cGUgPSBmaWxlX2xvY2stPmZsX3R5cGU7CiAJX191NjQgZmxhZ3MgPSAwOwogCWludCByYzsKIAlpbnQgcmMyID0gMDsKQEAgLTI3NDQsNyArMjYyMCw3IEBACiAJaWYgKGZpbGVfbG9jay0+ZmxfbG1vcHMgJiYgZmlsZV9sb2NrLT5mbF9sbW9wcy0+bG1fY29tcGFyZV9vd25lcikKIAkJZmxvY2subF9mbG9jay5vd25lciA9ICh1bnNpZ25lZCBsb25nKWZpbGVfbG9jay0+ZmxfcGlkOwogCi0Jc3dpdGNoIChmaWxlX2xvY2stPmZsX3R5cGUpIHsKKwlzd2l0Y2ggKGZsX3R5cGUpIHsKIAljYXNlIEZfUkRMQ0s6CiAJCWVpbmZvLmVpX21vZGUgPSBMQ0tfUFI7CiAJCWJyZWFrOwpAQCAtMjc2NCw4ICsyNjQwLDcgQEAKIAkJZWluZm8uZWlfbW9kZSA9IExDS19QVzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJQ0RFQlVHKERfSU5GTywgIlVua25vd24gZmNudGwgbG9jayB0eXBlOiAlZFxuIiwKLQkJICAgICAgIGZpbGVfbG9jay0+ZmxfdHlwZSk7CisJCUNERUJVRyhEX0lORk8sICJVbmtub3duIGZjbnRsIGxvY2sgdHlwZTogJWRcbiIsIGZsX3R5cGUpOwogCQlyZXR1cm4gLUVOT1RTVVBQOwogCX0KIApAQCAtMjc4NywxNiArMjY2MiwxOCBAQAogCWNhc2UgRl9HRVRMSzY0OgogI2VuZGlmCiAJCWZsYWdzID0gTERMTV9GTF9URVNUX0xPQ0s7Ci0JCS8qIFNhdmUgdGhlIG9sZCBtb2RlIHNvIHRoYXQgaWYgdGhlIG1vZGUgaW4gdGhlIGxvY2sgY2hhbmdlcyB3ZQotCQkgKiBjYW4gZGVjcmVtZW50IHRoZSBhcHByb3ByaWF0ZSByZWFkZXIgb3Igd3JpdGVyIHJlZmNvdW50LgotCQkgKi8KLQkJZmlsZV9sb2NrLT5mbF90eXBlID0gZWluZm8uZWlfbW9kZTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQ0VSUk9SKCJ1bmtub3duIGZjbnRsIGxvY2sgY29tbWFuZDogJWRcbiIsIGNtZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qCisJICogU2F2ZSB0aGUgb2xkIG1vZGUgc28gdGhhdCBpZiB0aGUgbW9kZSBpbiB0aGUgbG9jayBjaGFuZ2VzIHdlCisJICogY2FuIGRlY3JlbWVudCB0aGUgYXBwcm9wcmlhdGUgcmVhZGVyIG9yIHdyaXRlciByZWZjb3VudC4KKwkgKi8KKwlmaWxlX2xvY2stPmZsX3R5cGUgPSBlaW5mby5laV9tb2RlOworCiAJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBpbm9kZSwgTlVMTCwgTlVMTCwgMCwgMCwKIAkJCQkgICAgIExVU1RSRV9PUENfQU5ZLCBOVUxMKTsKIAlpZiAoSVNfRVJSKG9wX2RhdGEpKQpAQCAtMjgwNiw4ICsyNjgzLDEyIEBACiAJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGZsb2NrLmxfZmxvY2sucGlkLCBmbGFncywKIAkgICAgICAgZWluZm8uZWlfbW9kZSwgZmxvY2subF9mbG9jay5zdGFydCwgZmxvY2subF9mbG9jay5lbmQpOwogCi0JcmMgPSBtZF9lbnF1ZXVlKHNiaS0+bGxfbWRfZXhwLCAmZWluZm8sIE5VTEwsCi0JCQlvcF9kYXRhLCAmbG9ja2gsICZmbG9jaywgMCwgTlVMTCAvKiByZXEgKi8sIGZsYWdzKTsKKwlyYyA9IG1kX2VucXVldWUoc2JpLT5sbF9tZF9leHAsICZlaW5mbywgJmZsb2NrLCBOVUxMLCBvcF9kYXRhLCAmbG9ja2gsCisJCQlmbGFncyk7CisKKwkvKiBSZXN0b3JlIHRoZSBmaWxlIGxvY2sgdHlwZSBpZiBub3QgVEVTVCBsb2NrLiAqLworCWlmICghKGZsYWdzICYgTERMTV9GTF9URVNUX0xPQ0spKQorCQlmaWxlX2xvY2stPmZsX3R5cGUgPSBmbF90eXBlOwogCiAJaWYgKChyYyA9PSAwIHx8IGZpbGVfbG9jay0+ZmxfdHlwZSA9PSBGX1VOTENLKSAmJgogCSAgICAhKGZsYWdzICYgTERMTV9GTF9URVNUX0xPQ0spKQpAQCAtMjgxNSw4ICsyNjk2LDggQEAKIAogCWlmIChyYzIgJiYgZmlsZV9sb2NrLT5mbF90eXBlICE9IEZfVU5MQ0spIHsKIAkJZWluZm8uZWlfbW9kZSA9IExDS19OTDsKLQkJbWRfZW5xdWV1ZShzYmktPmxsX21kX2V4cCwgJmVpbmZvLCBOVUxMLAotCQkJICAgb3BfZGF0YSwgJmxvY2toLCAmZmxvY2ssIDAsIE5VTEwgLyogcmVxICovLCBmbGFncyk7CisJCW1kX2VucXVldWUoc2JpLT5sbF9tZF9leHAsICZlaW5mbywgJmZsb2NrLCBOVUxMLCBvcF9kYXRhLAorCQkJICAgJmxvY2toLCBmbGFncyk7CiAJCXJjID0gcmMyOwogCX0KIApAQCAtMjgyNSw2ICsyNzA2LDExNyBAQAogCXJldHVybiByYzsKIH0KIAoraW50IGxsX2dldF9maWRfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIGludCBuYW1lbGVuLCBzdHJ1Y3QgbHVfZmlkICpmaWQpCit7CisJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEgPSBOVUxMOworCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBtZHRfYm9keSAqYm9keTsKKwlpbnQgcmM7CisKKwlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIHBhcmVudCwgTlVMTCwgbmFtZSwgbmFtZWxlbiwgMCwKKwkJCQkgICAgIExVU1RSRV9PUENfQU5ZLCBOVUxMKTsKKwlpZiAoSVNfRVJSKG9wX2RhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKKworCW9wX2RhdGEtPm9wX3ZhbGlkID0gT0JEX01EX0ZMSUQ7CisJcmMgPSBtZF9nZXRhdHRyX25hbWUobGxfaTJzYmkocGFyZW50KS0+bGxfbWRfZXhwLCBvcF9kYXRhLCAmcmVxKTsKKwlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKKwlpZiAoIWJvZHkpIHsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIG91dF9yZXE7CisJfQorCWlmIChmaWQpCisJCSpmaWQgPSBib2R5LT5tYm9fZmlkMTsKK291dF9yZXE6CisJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOworCXJldHVybiByYzsKK30KKworaW50IGxsX21pZ3JhdGUoc3RydWN0IGlub2RlICpwYXJlbnQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbWR0aWR4LAorCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqY2hpbGRfaW5vZGUgPSBOVUxMOworCXN0cnVjdCBkZW50cnkgKmRjaGlsZCA9IE5VTEw7CisJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CisJc3RydWN0IHFzdHIgcXN0cjsKKwlpbnQgcmM7CisKKwlDREVCVUcoRF9WRlNUUkFDRSwgIm1pZ3JhdGUgJXMgdW5kZXIgIkRGSUQiIHRvIE1EVCVkXG4iLAorCSAgICAgICBuYW1lLCBQRklEKGxsX2lub2RlMmZpZChwYXJlbnQpKSwgbWR0aWR4KTsKKworCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgcGFyZW50LCBOVUxMLCBuYW1lLCBuYW1lbGVuLAorCQkJCSAgICAgMCwgTFVTVFJFX09QQ19BTlksIE5VTEwpOworCWlmIChJU19FUlIob3BfZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOworCisJLyogR2V0IGNoaWxkIEZJRCBmaXJzdCAqLworCXFzdHIuaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKHBhcmVudCwgbmFtZSwgbmFtZWxlbik7CisJcXN0ci5uYW1lID0gbmFtZTsKKwlxc3RyLmxlbiA9IG5hbWVsZW47CisJZGNoaWxkID0gZF9sb29rdXAoZmlsZV9kZW50cnkoZmlsZSksICZxc3RyKTsKKwlpZiAoZGNoaWxkKSB7CisJCW9wX2RhdGEtPm9wX2ZpZDMgPSAqbGxfaW5vZGUyZmlkKGRjaGlsZC0+ZF9pbm9kZSk7CisJCWlmIChkY2hpbGQtPmRfaW5vZGUpIHsKKwkJCWNoaWxkX2lub2RlID0gaWdyYWIoZGNoaWxkLT5kX2lub2RlKTsKKwkJCWlmIChjaGlsZF9pbm9kZSkgeworCQkJCWlub2RlX2xvY2soY2hpbGRfaW5vZGUpOworCQkJCW9wX2RhdGEtPm9wX2ZpZDMgPSAqbGxfaW5vZGUyZmlkKGNoaWxkX2lub2RlKTsKKwkJCQlsbF9pbnZhbGlkYXRlX2FsaWFzZXMoY2hpbGRfaW5vZGUpOworCQkJfQorCQl9CisJCWRwdXQoZGNoaWxkKTsKKwl9IGVsc2UgeworCQlyYyA9IGxsX2dldF9maWRfYnlfbmFtZShwYXJlbnQsIG5hbWUsIG5hbWVsZW4sCisJCQkJCSZvcF9kYXRhLT5vcF9maWQzKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlpZiAoIWZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQzKSkgeworCQlDRVJST1IoIiVzOiBtaWdyYXRlICVzLCBidXQgZmlkICJERklEIiBpcyBpbnNhbmVcbiIsCisJCSAgICAgICBsbF9nZXRfZnNuYW1lKHBhcmVudC0+aV9zYiwgTlVMTCwgMCksIG5hbWUsCisJCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQzKSk7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlyYyA9IGxsX2dldF9tZHRfaWR4X2J5X2ZpZChsbF9pMnNiaShwYXJlbnQpLCAmb3BfZGF0YS0+b3BfZmlkMyk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmIChyYyA9PSBtZHRpZHgpIHsKKwkJQ0RFQlVHKERfSU5GTywgIiVzOiJERklEIiBpcyBhbHJlYWR5IG9uIE1EVCVkLlxuIiwgbmFtZSwKKwkJICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDMpLCBtZHRpZHgpOworCQlyYyA9IDA7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJb3BfZGF0YS0+b3BfbWRzID0gbWR0aWR4OworCW9wX2RhdGEtPm9wX2NsaV9mbGFncyA9IENMSV9NSUdSQVRFOworCXJjID0gbWRfcmVuYW1lKGxsX2kyc2JpKHBhcmVudCktPmxsX21kX2V4cCwgb3BfZGF0YSwgbmFtZSwKKwkJICAgICAgIG5hbWVsZW4sIG5hbWUsIG5hbWVsZW4sICZyZXF1ZXN0KTsKKwlpZiAoIXJjKQorCQlsbF91cGRhdGVfdGltZXMocmVxdWVzdCwgcGFyZW50KTsKKworCXB0bHJwY19yZXFfZmluaXNoZWQocmVxdWVzdCk7CisKK291dF9mcmVlOgorCWlmIChjaGlsZF9pbm9kZSkgeworCQljbGVhcl9ubGluayhjaGlsZF9pbm9kZSk7CisJCWlub2RlX3VubG9jayhjaGlsZF9pbm9kZSk7CisJCWlwdXQoY2hpbGRfaW5vZGUpOworCX0KKworCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOworCXJldHVybiByYzsKK30KKwogc3RhdGljIGludAogbGxfZmlsZV9ub2Zsb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmaWxlX2xvY2spCiB7CkBAIC0yODQ3LDcgKzI4MzksNyBAQAogCXN0cnVjdCBsdXN0cmVfaGFuZGxlIGxvY2toOwogCWxkbG1fcG9saWN5X2RhdGFfdCBwb2xpY3k7CiAJZW51bSBsZGxtX21vZGUgbW9kZSA9IChsX3JlcV9tb2RlID09IExDS19NSU5NT0RFKSA/Ci0JCQkJKExDS19DUnxMQ0tfQ1d8TENLX1BSfExDS19QVykgOiBsX3JlcV9tb2RlOworCQkJICAgICAgKExDS19DUiB8IExDS19DVyB8IExDS19QUiB8IExDS19QVykgOiBsX3JlcV9tb2RlOwogCXN0cnVjdCBsdV9maWQgKmZpZDsKIAlfX3U2NCBmbGFnczsKIAlpbnQgaTsKQEAgLTI4ODgsMTUgKzI4ODAsMTIgQEAKIHsKIAlsZGxtX3BvbGljeV9kYXRhX3QgcG9saWN5ID0geyAubF9pbm9kZWJpdHMgPSB7Yml0c30gfTsKIAlzdHJ1Y3QgbHVfZmlkICpmaWQ7Ci0JZW51bSBsZGxtX21vZGUgcmM7CiAKIAlmaWQgPSAmbGxfaTJpbmZvKGlub2RlKS0+bGxpX2ZpZDsKIAlDREVCVUcoRF9JTkZPLCAidHJ5aW5nIHRvIG1hdGNoIHJlcyAiREZJRCJcbiIsIFBGSUQoZmlkKSk7CiAKLQlyYyA9IG1kX2xvY2tfbWF0Y2gobGxfaTJtZGV4cChpbm9kZSksIGZsYWdzIHwgTERMTV9GTF9CTE9DS19HUkFOVEVELAotCQkJICAgZmlkLCBMRExNX0lCSVRTLCAmcG9saWN5LCBtb2RlLCBsb2NraCk7Ci0KLQlyZXR1cm4gcmM7CisJcmV0dXJuIG1kX2xvY2tfbWF0Y2gobGxfaTJtZGV4cChpbm9kZSksIGZsYWdzIHwgTERMTV9GTF9CTE9DS19HUkFOVEVELAorCQkJICAgICBmaWQsIExETE1fSUJJVFMsICZwb2xpY3ksIG1vZGUsIGxvY2toKTsKIH0KIAogc3RhdGljIGludCBsbF9pbm9kZV9yZXZhbGlkYXRlX2Zpbmkoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHJjKQpAQCAtMjk0OSwxNSArMjkzOCw5IEBACiAJCWlmIChJU19FUlIob3BfZGF0YSkpCiAJCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKIAotCQlvaXQuaXRfY3JlYXRlX21vZGUgfD0gTV9DSEVDS19TVEFMRTsKLQkJcmMgPSBtZF9pbnRlbnRfbG9jayhleHAsIG9wX2RhdGEsIE5VTEwsIDAsCi0JCQkJICAgIC8qIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBuYW1lCi0JCQkJICAgICAqIGJhc2VkIGxvb2t1cAotCQkJCSAgICAgKi8KLQkJCQkgICAgJm9pdCwgMCwgJnJlcSwKLQkJCQkgICAgbGxfbWRfYmxvY2tpbmdfYXN0LCAwKTsKKwkJcmMgPSBtZF9pbnRlbnRfbG9jayhleHAsIG9wX2RhdGEsICZvaXQsICZyZXEsCisJCQkJICAgICZsbF9tZF9ibG9ja2luZ19hc3QsIDApOwogCQlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKLQkJb2l0Lml0X2NyZWF0ZV9tb2RlICY9IH5NX0NIRUNLX1NUQUxFOwogCQlpZiAocmMgPCAwKSB7CiAJCQlyYyA9IGxsX2lub2RlX3JldmFsaWRhdGVfZmluaShpbm9kZSwgcmMpOwogCQkJZ290byBvdXQ7CkBAIC0zMDAzLDEwICsyOTg2LDggQEAKIAkJb3BfZGF0YS0+b3BfdmFsaWQgPSB2YWxpZDsKIAkJcmMgPSBtZF9nZXRhdHRyKHNiaS0+bGxfbWRfZXhwLCBvcF9kYXRhLCAmcmVxKTsKIAkJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7Ci0JCWlmIChyYykgewotCQkJcmMgPSBsbF9pbm9kZV9yZXZhbGlkYXRlX2ZpbmkoaW5vZGUsIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQorCQlpZiAocmMpCisJCQlyZXR1cm4gbGxfaW5vZGVfcmV2YWxpZGF0ZV9maW5pKGlub2RlLCByYyk7CiAKIAkJcmMgPSBsbF9wcmVwX2lub2RlKCZpbm9kZSwgcmVxLCBOVUxMLCBOVUxMKTsKIAl9CkBAIC0zMDE1LDYgKzI5OTYsMjggQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgbGxfbWVyZ2VfbWRfYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBjbF9hdHRyIGF0dHIgPSB7IDAgfTsKKwlpbnQgcmM7CisKKwlMQVNTRVJUKGxsX2kyaW5mbyhpbm9kZSktPmxsaV9sc21fbWQpOworCXJjID0gbWRfbWVyZ2VfYXR0cihsbF9pMm1kZXhwKGlub2RlKSwgbGxfaTJpbmZvKGlub2RlKS0+bGxpX2xzbV9tZCwKKwkJCSAgICZhdHRyLCBsbF9tZF9ibG9ja2luZ19hc3QpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJc2V0X25saW5rKGlub2RlLCBhdHRyLmNhdF9ubGluayk7CisJaW5vZGUtPmlfYmxvY2tzID0gYXR0ci5jYXRfYmxvY2tzOworCWlfc2l6ZV93cml0ZShpbm9kZSwgYXR0ci5jYXRfc2l6ZSk7CisKKwlsbF9pMmluZm8oaW5vZGUpLT5sbGlfYXRpbWUgPSBhdHRyLmNhdF9hdGltZTsKKwlsbF9pMmluZm8oaW5vZGUpLT5sbGlfbXRpbWUgPSBhdHRyLmNhdF9tdGltZTsKKwlsbF9pMmluZm8oaW5vZGUpLT5sbGlfY3RpbWUgPSBhdHRyLmNhdF9jdGltZTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGxsX2lub2RlX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3U2NCBpYml0cykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZF9pbm9kZShkZW50cnkpOwpAQCAtMzAyNiw2ICszMDI5LDEzIEBACiAKIAkvKiBpZiBvYmplY3QgaXNuJ3QgcmVndWxhciBmaWxlLCBkb24ndCB2YWxpZGF0ZSBzaXplICovCiAJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmCisJCSAgICBsbF9pMmluZm8oaW5vZGUpLT5sbGlfbHNtX21kKSB7CisJCQlyYyA9IGxsX21lcmdlX21kX2F0dHIoaW5vZGUpOworCQkJaWYgKHJjKQorCQkJCXJldHVybiByYzsKKwkJfQorCiAJCUxUSU1FX1MoaW5vZGUtPmlfYXRpbWUpID0gbGxfaTJpbmZvKGlub2RlKS0+bGxpX2F0aW1lOwogCQlMVElNRV9TKGlub2RlLT5pX210aW1lKSA9IGxsX2kyaW5mbyhpbm9kZSktPmxsaV9tdGltZTsKIAkJTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkgPSBsbF9pMmluZm8oaW5vZGUpLT5sbGlfY3RpbWU7CkBAIC0zMDU3LDEzICszMDY3LDE0IEBACiAJaWYgKHJlcykKIAkJcmV0dXJuIHJlczsKIAorCU9CRF9GQUlMX1RJTUVPVVQoT0JEX0ZBSUxfR0VUQVRUUl9ERUxBWSwgMzApOworCiAJc3RhdC0+ZGV2ID0gaW5vZGUtPmlfc2ItPnNfZGV2OwogCWlmIChsbF9uZWVkXzMyYml0X2FwaShzYmkpKQogCQlzdGF0LT5pbm8gPSBjbF9maWRfYnVpbGRfaW5vKCZsbGktPmxsaV9maWQsIDEpOwogCWVsc2UKIAkJc3RhdC0+aW5vID0gaW5vZGUtPmlfaW5vOwogCXN0YXQtPm1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCXN0YXQtPm5saW5rID0gaW5vZGUtPmlfbmxpbms7CiAJc3RhdC0+dWlkID0gaW5vZGUtPmlfdWlkOwogCXN0YXQtPmdpZCA9IGlub2RlLT5pX2dpZDsKIAlzdGF0LT5yZGV2ID0gaW5vZGUtPmlfcmRldjsKQEAgLTMwNzIsNiArMzA4Myw3IEBACiAJc3RhdC0+Y3RpbWUgPSBpbm9kZS0+aV9jdGltZTsKIAlzdGF0LT5ibGtzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOwogCisJc3RhdC0+bmxpbmsgPSBpbm9kZS0+aV9ubGluazsKIAlzdGF0LT5zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCXN0YXQtPmJsb2NrcyA9IGlub2RlLT5pX2Jsb2NrczsKIApAQCAtMzEzOSw2ICszMTUxLDEyIEBACiAKIGludCBsbF9pbm9kZV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQogeworCXN0cnVjdCBsbF9zYl9pbmZvICpzYmk7CisJc3RydWN0IHJvb3Rfc3F1YXNoX2luZm8gKnNxdWFzaDsKKwljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkX2NyZWQgPSBOVUxMOworCXN0cnVjdCBjcmVkICpjcmVkID0gTlVMTDsKKwlib29sIHNxdWFzaF9pZCA9IGZhbHNlOworCWNmc19jYXBfdCBjYXA7CiAJaW50IHJjID0gMDsKIAogCWlmIChtYXNrICYgTUFZX05PVF9CTE9DSykKQEAgLTMxNTgsOSArMzE3Niw0NiBAQAogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcCksIGlub2RlIG1vZGUgJXggbWFzayAlb1xuIiwKIAkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUsIGlub2RlLT5pX21vZGUsIG1hc2spOwogCisJLyogc3F1YXNoIGZzdWlkL2ZzZ2lkIGlmIG5lZWRlZCAqLworCXNiaSA9IGxsX2kyc2JpKGlub2RlKTsKKwlzcXVhc2ggPSAmc2JpLT5sbF9zcXVhc2g7CisJaWYgKHVubGlrZWx5KHNxdWFzaC0+cnNpX3VpZCAmJgorCQkgICAgIHVpZF9lcShjdXJyZW50X2ZzdWlkKCksIEdMT0JBTF9ST09UX1VJRCkgJiYKKwkJICAgICAhKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfTk9ST09UU1FVQVNIKSkpIHsKKwkJc3F1YXNoX2lkID0gdHJ1ZTsKKwl9CisKKwlpZiAoc3F1YXNoX2lkKSB7CisJCUNERUJVRyhEX09USEVSLCAic3F1YXNoIGNyZWRzICglZDolZCk9PiglZDolZClcbiIsCisJCSAgICAgICBfX2t1aWRfdmFsKGN1cnJlbnRfZnN1aWQoKSksIF9fa2dpZF92YWwoY3VycmVudF9mc2dpZCgpKSwKKwkJICAgICAgIHNxdWFzaC0+cnNpX3VpZCwgc3F1YXNoLT5yc2lfZ2lkKTsKKworCQkvKgorCQkgKiB1cGRhdGUgY3VycmVudCBwcm9jZXNzJ3MgY3JlZGVudGlhbHMKKwkJICogYW5kIEZTIGNhcGFiaWxpdHkKKwkJICovCisJCWNyZWQgPSBwcmVwYXJlX2NyZWRzKCk7CisJCWlmICghY3JlZCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWNyZWQtPmZzdWlkID0gbWFrZV9rdWlkKCZpbml0X3VzZXJfbnMsIHNxdWFzaC0+cnNpX3VpZCk7CisJCWNyZWQtPmZzZ2lkID0gbWFrZV9rZ2lkKCZpbml0X3VzZXJfbnMsIHNxdWFzaC0+cnNpX2dpZCk7CisJCWZvciAoY2FwID0gMDsgY2FwIDwgc2l6ZW9mKGNmc19jYXBfdCkgKiA4OyBjYXArKykgeworCQkJaWYgKCgxIDw8IGNhcCkgJiBDRlNfQ0FQX0ZTX01BU0spCisJCQkJY2FwX2xvd2VyKGNyZWQtPmNhcF9lZmZlY3RpdmUsIGNhcCk7CisJCX0KKwkJb2xkX2NyZWQgPSBvdmVycmlkZV9jcmVkcyhjcmVkKTsKKwl9CisKIAlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9JTk9ERV9QRVJNLCAxKTsKIAlyYyA9IGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzayk7CiAKKwkvKiByZXN0b3JlIGN1cnJlbnQgcHJvY2VzcydzIGNyZWRlbnRpYWxzIGFuZCBGUyBjYXBhYmlsaXR5ICovCisJaWYgKHNxdWFzaF9pZCkgeworCQlyZXZlcnRfY3JlZHMob2xkX2NyZWQpOworCQlwdXRfY3JlZChjcmVkKTsKKwl9CisKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTMxNzMsNyArMzIyOCw3IEBACiAJLnJlbGVhc2UJPSBsbF9maWxlX3JlbGVhc2UsCiAJLm1tYXAJICAgPSBsbF9maWxlX21tYXAsCiAJLmxsc2VlawkgPSBsbF9maWxlX3NlZWssCi0JLnNwbGljZV9yZWFkICAgID0gbGxfZmlsZV9zcGxpY2VfcmVhZCwKKwkuc3BsaWNlX3JlYWQgICAgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiAJLmZzeW5jCSAgPSBsbF9mc3luYywKIAkuZmx1c2gJICA9IGxsX2ZsdXNoCiB9OwpAQCAtMzE4Niw3ICszMjQxLDcgQEAKIAkucmVsZWFzZQk9IGxsX2ZpbGVfcmVsZWFzZSwKIAkubW1hcAkgICA9IGxsX2ZpbGVfbW1hcCwKIAkubGxzZWVrCSA9IGxsX2ZpbGVfc2VlaywKLQkuc3BsaWNlX3JlYWQgICAgPSBsbF9maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2VfcmVhZCAgICA9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIAkuZnN5bmMJICA9IGxsX2ZzeW5jLAogCS5mbHVzaAkgID0gbGxfZmx1c2gsCiAJLmZsb2NrCSAgPSBsbF9maWxlX2Zsb2NrLApAQCAtMzIwMiw3ICszMjU3LDcgQEAKIAkucmVsZWFzZQk9IGxsX2ZpbGVfcmVsZWFzZSwKIAkubW1hcAkgICA9IGxsX2ZpbGVfbW1hcCwKIAkubGxzZWVrCSA9IGxsX2ZpbGVfc2VlaywKLQkuc3BsaWNlX3JlYWQgICAgPSBsbF9maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2VfcmVhZCAgICA9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIAkuZnN5bmMJICA9IGxsX2ZzeW5jLAogCS5mbHVzaAkgID0gbGxfZmx1c2gsCiAJLmZsb2NrCSAgPSBsbF9maWxlX25vZmxvY2ssCkBAIC0zMjEzLDEwICszMjY4LDEwIEBACiAJLnNldGF0dHIJPSBsbF9zZXRhdHRyLAogCS5nZXRhdHRyCT0gbGxfZ2V0YXR0ciwKIAkucGVybWlzc2lvbgk9IGxsX2lub2RlX3Blcm1pc3Npb24sCi0JLnNldHhhdHRyCT0gbGxfc2V0eGF0dHIsCi0JLmdldHhhdHRyCT0gbGxfZ2V0eGF0dHIsCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBsbF9saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyCT0gbGxfcmVtb3ZleGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIAkuZmllbWFwCQk9IGxsX2ZpZW1hcCwKIAkuZ2V0X2FjbAk9IGxsX2dldF9hY2wsCiB9OwpAQCAtMzI1MSw3ICszMzA2LDYgQEAKIAlpZiAoIWluX2RhdGEpCiAJCXJldHVybiBOVUxMOwogCi0JbWVtc2V0KGluX2RhdGEsIDAsIHNpemVvZigqaW5fZGF0YSkpOwogCWluX2RhdGEtPmlvY2Rfc2l6ZSA9IHNpemU7CiAJaW5fZGF0YS0+aW9jZF9jYiA9IGNiOwogCWluX2RhdGEtPmlvY2RfY291bnQgPSBjb3VudDsKQEAgLTMzODksNyArMzQ0Myw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWxtbXNpemUgPSBib2R5LT5lYWRhdGFzaXplOworCWxtbXNpemUgPSBib2R5LT5tYm9fZWFkYXRhc2l6ZTsKIAlpZiAobG1tc2l6ZSA9PSAwKSAvKiBlbXB0eSBsYXlvdXQgKi8gewogCQlyYyA9IDA7CiAJCWdvdG8gb3V0OwpAQCAtMzQ0Nyw3ICszNTAxLDcgQEAKIAkJICAgUEZJRCgmbGxpLT5sbGlfZmlkKSwgaW5vZGUsIHJlY29uZik7CiAKIAkvKiBpbiBjYXNlIHRoaXMgaXMgYSBjYWNoaW5nIGxvY2sgYW5kIHJlaW5zdGF0ZSB3aXRoIG5ldyBpbm9kZSAqLwotCW1kX3NldF9sb2NrX2RhdGEoc2JpLT5sbF9tZF9leHAsICZsb2NraC0+Y29va2llLCBpbm9kZSwgTlVMTCk7CisJbWRfc2V0X2xvY2tfZGF0YShzYmktPmxsX21kX2V4cCwgbG9ja2gsIGlub2RlLCBOVUxMKTsKIAogCWxvY2tfcmVzX2FuZF9sb2NrKGxvY2spOwogCWx2Yl9yZWFkeSA9IGxkbG1faXNfbHZiX3JlYWR5KGxvY2spOwpAQCAtMzU1Nyw4ICszNjExLDggQEAKIAlzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gZWluZm8gPSB7CiAJCS5laV90eXBlID0gTERMTV9JQklUUywKIAkJLmVpX21vZGUgPSBMQ0tfQ1IsCi0JCS5laV9jYl9ibCA9IGxsX21kX2Jsb2NraW5nX2FzdCwKLQkJLmVpX2NiX2NwID0gbGRsbV9jb21wbGV0aW9uX2FzdCwKKwkJLmVpX2NiX2JsID0gJmxsX21kX2Jsb2NraW5nX2FzdCwKKwkJLmVpX2NiX2NwID0gJmxkbG1fY29tcGxldGlvbl9hc3QsCiAJfTsKIAlpbnQgcmM7CiAKQEAgLTM2MDQsOCArMzY1OCw3IEBACiAJCQkgIGxsX2dldF9mc25hbWUoaW5vZGUtPmlfc2IsIE5VTEwsIDApLAogCQkJICBQRklEKCZsbGktPmxsaV9maWQpLCBpbm9kZSk7CiAKLQlyYyA9IG1kX2VucXVldWUoc2JpLT5sbF9tZF9leHAsICZlaW5mbywgJml0LCBvcF9kYXRhLCAmbG9ja2gsCi0JCQlOVUxMLCAwLCBOVUxMLCAwKTsKKwlyYyA9IG1kX2VucXVldWUoc2JpLT5sbF9tZF9leHAsICZlaW5mbywgTlVMTCwgJml0LCBvcF9kYXRhLCAmbG9ja2gsIDApOwogCXB0bHJwY19yZXFfZmluaXNoZWQoaXQuaXRfcmVxdWVzdCk7CiAJaXQuaXRfcmVxdWVzdCA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2dsaW1wc2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2dsaW1wc2UuYwppbmRleCA5MjAwNGEwNS4uMjI1MDdiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZ2xpbXBzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2dsaW1wc2UuYwpAQCAtNDIsNyArNDIsNiBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbWRjLmgiCiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fY2wuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fY2wuYwppbmRleCAzOTZlNGU0Zi4uMDg0MzMwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGNvbW1vbl9jbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fY2wuYwpAQCAtNDksNyArNDksNiBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2ZpZC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV92ZXIuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9tZGMuaCIKQEAgLTEwMCw2ICs5OSw3IEBACiAJaW8tPnUuY2lfc2V0YXR0ci5zYV9hdHRyLmx2Yl9jdGltZSA9IExUSU1FX1MoYXR0ci0+aWFfY3RpbWUpOwogCWlvLT51LmNpX3NldGF0dHIuc2FfYXR0ci5sdmJfc2l6ZSA9IGF0dHItPmlhX3NpemU7CiAJaW8tPnUuY2lfc2V0YXR0ci5zYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCWlvLT51LmNpX3NldGF0dHIuc2FfcGFyZW50X2ZpZCA9IGxsX2lub2RlMmZpZChpbm9kZSk7CiAKIGFnYWluOgogCWlmIChjbF9pb19pbml0KGVudiwgaW8sIENJVF9TRVRBVFRSLCBpby0+Y2lfb2JqKSA9PSAwKSB7CkBAIC0xNTQsNyArMTU0LDcgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgcmVmY2hlY2s7CiAKLQlMQVNTRVJUKG1kLT5ib2R5LT52YWxpZCAmIE9CRF9NRF9GTElEKTsKKwlMQVNTRVJUKG1kLT5ib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxJRCk7CiAJTEFTU0VSVChTX0lTUkVHKGlub2RlLT5pX21vZGUpKTsKIAogCWVudiA9IGNsX2Vudl9nZXQoJnJlZmNoZWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xjb21tb25fbWlzYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGNvbW1vbl9taXNjLmMKaW5kZXggZjZiZTEwNS4uZmIzNDZjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGNvbW1vbl9taXNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGNvbW1vbl9taXNjLmMKQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvY2xfb2JqZWN0LmgiCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKIAogLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBhbmQgbWF4aW11bSBMT1YgRUEgYW5kIGNvb2tpZSBzaXplcy4gIFRoaXMgYWxsb3dzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfY2xvc2UuYwppbmRleCAyMzI2YjQwLi44NjQ0NjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2Nsb3NlLmMKQEAgLTM4LDcgKzM4LDYgQEAKIAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAKIC8qKiByZWNvcmRzIHRoYXQgYSB3cml0ZSBpcyBpbiBmbGlnaHQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9pbnRlcm5hbC5oCmluZGV4IDRkNmQ1ODkuLjRiYzU1MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfaW50ZXJuYWwuaApAQCAtMzYsMTQgKzM2LDIxIEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfdmVyLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGlzay5oIgkvKiBmb3IgczJzYmkgKi8KICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9lYWNsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGlua2VhLmgiCiAKIC8qIGZvciBzdHJ1Y3QgY2xfbG9ja19kZXNjciBhbmQgc3RydWN0IGNsX2lvICovCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfcGF0Y2hsZXNzX2NvbXBhdC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2NvbXBhdC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvY2xfb2JqZWN0LmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbG12LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbWRjLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfaW50ZW50LmgiCiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbF94YXR0ci5oPgogI2luY2x1ZGUgInZ2cF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInJhbmdlX2xvY2suaCIKIAogI2lmbmRlZiBGTU9ERV9FWEVDCiAjZGVmaW5lIEZNT0RFX0VYRUMgMApAQCAtNTcsNiArNjQsOSBAQAogI2RlZmluZSBMTF9ESVJfRU5EX09GRgkgIDB4N2ZmZmZmZmZmZmZmZmZmZlVMTAogI2RlZmluZSBMTF9ESVJfRU5EX09GRl8zMkJJVCAgICAweDdmZmZmZmZmVUwKIAorLyogNFVMICogMTAyNCAqIDEwMjQgKi8KKyNkZWZpbmUgTExfTUFYX0JMS1NJWkVfQklUUyAyMgorCiAjZGVmaW5lIExMX0lUMlNUUihpdCkgKChpdCkgPyBsZGxtX2l0MnN0cigoaXQpLT5pdF9vcCkgOiAiMCIpCiAjZGVmaW5lIExVU1RSRV9GUFJJVkFURShmaWxlKSAoKGZpbGUpLT5wcml2YXRlX2RhdGEpCiAKQEAgLTExNiw5ICsxMjYsNyBAQAogCiAJLyogaWRlbnRpZnlpbmcgZmllbGRzIGZvciBib3RoIG1ldGFkYXRhIGFuZCBkYXRhIHN0YWNrcy4gKi8KIAlzdHJ1Y3QgbHVfZmlkCQkgICBsbGlfZmlkOwotCS8qIFBhcmVudCBmaWQgZm9yIGFjY2Vzc2luZyBkZWZhdWx0IHN0cmlwZSBkYXRhIG9uIHBhcmVudCBkaXJlY3RvcnkKLQkgKiBmb3IgYWxsb2NhdGluZyBPU1Qgb2JqZWN0cyBhZnRlciBhIG1rbm9kKCkgYW5kIGxhdGVyIG9wZW4tYnktRklELgotCSAqLworCS8qIG1hc3RlciBpbm9kZSBmaWQgZm9yIHN0cmlwZSBkaXJlY3RvcnkgKi8KIAlzdHJ1Y3QgbHVfZmlkCQkgICBsbGlfcGZpZDsKIAogCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgbGxpX2Nsb3NlX2xpc3Q7CkBAIC0xNTYsNyArMTY0LDcgQEAKIAkJLyogZm9yIGRpcmVjdG9yeSAqLwogCQlzdHJ1Y3QgewogCQkJLyogc2VyaWFsaXplIG5vcm1hbCByZWFkZGlyIGFuZCBzdGF0YWhlYWQtcmVhZGRpci4gKi8KLQkJCXN0cnVjdCBtdXRleAkJCWRfcmVhZGRpcl9tdXRleDsKKwkJCXN0cnVjdCBtdXRleAkJCWxsaV9yZWFkZGlyX211dGV4OwogCiAJCQkvKiBtZXRhZGF0YSBzdGF0YWhlYWQgKi8KIAkJCS8qIHNpbmNlIHBhcmVudC1jaGlsZCB0aHJlYWRzIGNhbiBzaGFyZSB0aGUgc2FtZSBAZmlsZQpAQCAtMTY0LDI3ICsxNzIsMzkgQEAKIAkJCSAqIGNhc2Ugb2YgcGFyZW50IGV4aXQgYmVmb3JlIGNoaWxkIC0tIGl0IGlzIG1lIHNob3VsZAogCQkJICogY2xlYW51cCB0aGUgZGlyIHJlYWRhaGVhZC4KIAkJCSAqLwotCQkJdm9pZAkJCSAgICpkX29wZW5kaXJfa2V5OwotCQkJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICAgICAgICpkX3NhaTsKKwkJCXZvaWQJCQkgICAgICAgKmxsaV9vcGVuZGlyX2tleTsKKwkJCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAgICAgICAqbGxpX3NhaTsKIAkJCS8qIHByb3RlY3Qgc3RhdGFoZWFkIHN0dWZmLiAqLwotCQkJc3BpbmxvY2tfdAkJCWRfc2FfbG9jazsKKwkJCXNwaW5sb2NrX3QJCQlsbGlfc2FfbG9jazsKIAkJCS8qICJvcGVuZGlyX3BpZCIgaXMgdGhlIHRva2VuIHdoZW4gbG9va3VwL3JldmFsaWRhdGUKIAkJCSAqIC0tIEkgYW0gdGhlIG93bmVyIG9mIGRpciBzdGF0YWhlYWQuCiAJCQkgKi8KLQkJCXBpZF90CQkJICAgZF9vcGVuZGlyX3BpZDsKLQkJfSBkOwotCi0jZGVmaW5lIGxsaV9yZWFkZGlyX211dGV4ICAgICAgIHUuZC5kX3JlYWRkaXJfbXV0ZXgKLSNkZWZpbmUgbGxpX29wZW5kaXJfa2V5CSB1LmQuZF9vcGVuZGlyX2tleQotI2RlZmluZSBsbGlfc2FpCQkgdS5kLmRfc2FpCi0jZGVmaW5lIGxsaV9zYV9sb2NrCSAgICAgdS5kLmRfc2FfbG9jawotI2RlZmluZSBsbGlfb3BlbmRpcl9waWQJIHUuZC5kX29wZW5kaXJfcGlkCisJCQlwaWRfdAkJCQlsbGlfb3BlbmRpcl9waWQ7CisJCQkvKiBzdGF0IHdpbGwgdHJ5IHRvIGFjY2VzcyBzdGF0YWhlYWQgZW50cmllcyBvciBzdGFydAorCQkJICogc3RhdGFoZWFkIGlmIHRoaXMgZmxhZyBpcyBzZXQsIGFuZCB0aGlzIGZsYWcgd2lsbCBiZQorCQkJICogc2V0IHVwb24gZGlyIG9wZW4sIGFuZCBjbGVhcmVkIHdoZW4gZGlyIGlzIGNsb3NlZCwKKwkJCSAqIHN0YXRhaGVhZCBoaXQgcmF0aW8gaXMgdG9vIGxvdywgb3Igc3RhcnQgc3RhdGFoZWFkCisJCQkgKiB0aHJlYWQgZmFpbGVkLgorCQkJICovCisJCQl1bnNpZ25lZCBpbnQJCQlsbGlfc2FfZW5hYmxlZDoxOworCQkJLyogZ2VuZXJhdGlvbiBmb3Igc3RhdGFoZWFkICovCisJCQl1bnNpZ25lZCBpbnQJCQlsbGlfc2FfZ2VuZXJhdGlvbjsKKwkJCS8qIGRpcmVjdG9yeSBzdHJpcGUgaW5mb3JtYXRpb24gKi8KKwkJCXN0cnVjdCBsbXZfc3RyaXBlX21kCSAgICAgICAqbGxpX2xzbV9tZDsKKwkJCS8qIGRlZmF1bHQgZGlyZWN0b3J5IHN0cmlwZSBvZmZzZXQuICBUaGlzIGlzIGV4dHJhY3RlZAorCQkJICogZnJvbSB0aGUgImRtdiIgeGF0dHIgaW4gb3JkZXIgdG8gZGVjaWRlIHdoaWNoIE1EVCB0bworCQkJICogY3JlYXRlIGEgc3ViZGlyZWN0b3J5IG9uLiAgVGhlIE1EUyBpdHNlbGYgZmV0Y2hlcworCQkJICogImRtdiIgYW5kIGdldHMgdGhlIHJlc3Qgb2YgdGhlIGRlZmF1bHQgbGF5b3V0IGl0c2VsZgorCQkJICogKGNvdW50LCBoYXNoLCBldGMpLgorCQkJICovCisJCQlfX3UzMgkJCQlsbGlfZGVmX3N0cmlwZV9vZmZzZXQ7CisJCX07CiAKIAkJLyogZm9yIG5vbi1kaXJlY3RvcnkgKi8KIAkJc3RydWN0IHsKLQkJCXN0cnVjdCBtdXRleAkJCWZfc2l6ZV9tdXRleDsKLQkJCWNoYXIJCQkJKmZfc3ltbGlua19uYW1lOwotCQkJX191NjQJCQkJZl9tYXhieXRlczsKKwkJCXN0cnVjdCBtdXRleAkJCWxsaV9zaXplX211dGV4OworCQkJY2hhcgkJCSAgICAgICAqbGxpX3N5bWxpbmtfbmFtZTsKKwkJCV9fdTY0CQkJCWxsaV9tYXhieXRlczsKIAkJCS8qCiAJCQkgKiBzdHJ1Y3Qgcndfc2VtYXBob3JlIHsKIAkJCSAqICAgIHNpZ25lZCBsb25nCWNvdW50OyAgICAgLy8gYWxpZ24gZC5kX2RlZl9hY2wKQEAgLTE5MiwxNiArMjEyLDE2IEBACiAJCQkgKiAgICBzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRfbGlzdDsKIAkJCSAqIH0KIAkJCSAqLwotCQkJc3RydWN0IHJ3X3NlbWFwaG9yZQkJZl90cnVuY19zZW07Ci0JCQlzdHJ1Y3QgbXV0ZXgJCQlmX3dyaXRlX211dGV4OworCQkJc3RydWN0IHJ3X3NlbWFwaG9yZQkJbGxpX3RydW5jX3NlbTsKKwkJCXN0cnVjdCByYW5nZV9sb2NrX3RyZWUJCWxsaV93cml0ZV90cmVlOwogCi0JCQlzdHJ1Y3Qgcndfc2VtYXBob3JlCQlmX2dsaW1wc2Vfc2VtOwotCQkJdW5zaWduZWQgbG9uZwkJCWZfZ2xpbXBzZV90aW1lOwotCQkJc3RydWN0IGxpc3RfaGVhZAkJCWZfYWdsX2xpc3Q7Ci0JCQlfX3U2NAkJCQlmX2FnbF9pbmRleDsKKwkJCXN0cnVjdCByd19zZW1hcGhvcmUJCWxsaV9nbGltcHNlX3NlbTsKKwkJCXVuc2lnbmVkIGxvbmcJCQlsbGlfZ2xpbXBzZV90aW1lOworCQkJc3RydWN0IGxpc3RfaGVhZAkJbGxpX2FnbF9saXN0OworCQkJX191NjQJCQkJbGxpX2FnbF9pbmRleDsKIAogCQkJLyogZm9yIHdyaXRlcGFnZSgpIG9ubHkgdG8gY29tbXVuaWNhdGUgdG8gZnN5bmMgKi8KLQkJCWludAkJCQlmX2FzeW5jX3JjOworCQkJaW50CQkJCWxsaV9hc3luY19yYzsKIAogCQkJLyoKIAkJCSAqIHdoZW5ldmVyIGEgcHJvY2VzcyB0cnkgdG8gcmVhZC93cml0ZSB0aGUgZmlsZSwgdGhlCkBAIC0yMTEsMjIgKzIzMSw5IEBACiAJCQkgKiBzbyB0aGUgcmVhZC93cml0ZSBzdGF0aXN0aWNzIGZvciBqb2JpZCB3aWxsIG5vdCBiZQogCQkJICogYWNjdXJhdGUgaWYgdGhlIGZpbGUgaXMgc2hhcmVkIGJ5IGRpZmZlcmVudCBqb2JzLgogCQkJICovCi0JCQljaGFyCQkgICAgIGZfam9iaWRbSk9CU1RBVFNfSk9CSURfU0laRV07Ci0JCX0gZjsKLQotI2RlZmluZSBsbGlfc2l6ZV9tdXRleCAgICAgICAgICB1LmYuZl9zaXplX211dGV4Ci0jZGVmaW5lIGxsaV9zeW1saW5rX25hbWUJdS5mLmZfc3ltbGlua19uYW1lCi0jZGVmaW5lIGxsaV9tYXhieXRlcwkgICAgdS5mLmZfbWF4Ynl0ZXMKLSNkZWZpbmUgbGxpX3RydW5jX3NlbQkgICB1LmYuZl90cnVuY19zZW0KLSNkZWZpbmUgbGxpX3dyaXRlX211dGV4CSB1LmYuZl93cml0ZV9tdXRleAotI2RlZmluZSBsbGlfZ2xpbXBzZV9zZW0JCXUuZi5mX2dsaW1wc2Vfc2VtCi0jZGVmaW5lIGxsaV9nbGltcHNlX3RpbWUJdS5mLmZfZ2xpbXBzZV90aW1lCi0jZGVmaW5lIGxsaV9hZ2xfbGlzdAkJdS5mLmZfYWdsX2xpc3QKLSNkZWZpbmUgbGxpX2FnbF9pbmRleAkJdS5mLmZfYWdsX2luZGV4Ci0jZGVmaW5lIGxsaV9hc3luY19yYwkJdS5mLmZfYXN5bmNfcmMKLSNkZWZpbmUgbGxpX2pvYmlkCQl1LmYuZl9qb2JpZAotCi0JfSB1OworCQkJY2hhcgkJCQlsbGlfam9iaWRbTFVTVFJFX0pPQklEX1NJWkVdOworCQl9OworCX07CiAKIAkvKiBYWFg6IEZvciBmb2xsb3dpbmcgZnJlcXVlbnQgdXNlZCBtZW1iZXJzLCBhbHRob3VnaCB0aGV5IG1heWJlIHNwZWNpYWwKIAkgKiAgICAgIHVzZWQgZm9yIG5vbi1kaXJlY3Rvcnkgb2JqZWN0LCBpdCBpcyBzb21lIHRpbWUtd2FzdGluZyB0byBjaGVjawpAQCAtNDAxLDEyICs0MDgsMTMgQEAKICNkZWZpbmUgTExfU0JJX0xBWU9VVF9MT0NLICAgIDB4MjAwMDAgLyogbGF5b3V0IGxvY2sgc3VwcG9ydCAqLwogI2RlZmluZSBMTF9TQklfVVNFUl9GSUQyUEFUSCAgMHg0MDAwMCAvKiBhbGxvdyBmaWQycGF0aCBieSB1bnByaXZpbGVnZWQgdXNlcnMgKi8KICNkZWZpbmUgTExfU0JJX1hBVFRSX0NBQ0hFICAgIDB4ODAwMDAgLyogc3VwcG9ydCBmb3IgeGF0dHIgY2FjaGUgKi8KKyNkZWZpbmUgTExfU0JJX05PUk9PVFNRVUFTSAkweDEwMDAwMCAvKiBkbyBub3QgYXBwbHkgcm9vdCBzcXVhc2ggKi8KIAogI2RlZmluZSBMTF9TQklfRkxBR1MgewlcCiAJIm5vbGNrIiwJXAogCSJjaGVja3N1bSIsCVwKIAkiZmxvY2siLAlcCi0JInhhdHRyIiwJXAorCSJ1c2VyX3hhdHRyIiwJXAogCSJhY2wiLAkJXAogCSI/Pz8iLAkJXAogCSI/Pz8iLAkJXApAQCAtNDIyLDkgKzQzMCwyNyBAQAogCSJ2ZXJib3NlIiwJXAogCSJsYXlvdXQiLAlcCiAJInVzZXJfZmlkMnBhdGgiLFwKLQkieGF0dHIiLAlcCisJInhhdHRyX2NhY2hlIiwJXAorCSJub3Jvb3RzcXVhc2giLAlcCiB9CiAKKy8qCisgKiBUaGlzIGlzIGVtYmVkZGVkIGludG8gbGxpdGUgc3VwZXItYmxvY2tzIHRvIGtlZXAgdHJhY2sgb2YgY29ubmVjdAorICogZmxhZ3MgKGNhcGFiaWxpdGllcykgc3VwcG9ydGVkIGJ5IGFsbCBpbXBvcnRzIGdpdmVuIG1vdW50IGlzCisgKiBjb25uZWN0ZWQgdG8uCisgKi8KK3N0cnVjdCBsdXN0cmVfY2xpZW50X29jZCB7CisJLyoKKwkgKiBUaGlzIGlzIGNvbmp1bmN0aW9uIG9mIGNvbm5lY3RfZmxhZ3MgYWNyb3NzIGFsbCBpbXBvcnRzCisJICogKExPVnMpIHRoaXMgbW91bnQgaXMgY29ubmVjdGVkIHRvLiBUaGlzIGZpZWxkIGlzIHVwZGF0ZWQgYnkKKwkgKiBjbF9vY2RfdXBkYXRlKCkgdW5kZXIgLT5sY29fbG9jay4KKwkgKi8KKwlfX3U2NAkJCSBsY29fZmxhZ3M7CisJc3RydWN0IG11dGV4CQkgbGNvX2xvY2s7CisJc3RydWN0IG9iZF9leHBvcnQJKmxjb19tZF9leHA7CisJc3RydWN0IG9iZF9leHBvcnQJKmxjb19kdF9leHA7Cit9OworCiBzdHJ1Y3QgbGxfc2JfaW5mbyB7CiAJLyogdGhpcyBwcm90ZWN0cyBwZ2xpc3QgYW5kIHJhX2luZm8uICBJdCBpc24ndCBzYWZlIHRvCiAJICogZ3JhYiBmcm9tIGludGVycnVwdCBjb250ZXh0cwpAQCAtNDYxLDcgKzQ4Nyw3IEBACiAJdW5zaWduZWQgaW50CSAgICAgIGxsX25hbWVsZW47CiAJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAgICpsbF9mb3A7CiAKLQl1bnNpZ25lZCBpbnQJICAgICAgbGxfbWRfYnJ3X3NpemU7IC8qIHVzZWQgYnkgcmVhZGRpciAqLworCXVuc2lnbmVkIGludAkJICBsbF9tZF9icndfcGFnZXM7IC8qIHJlYWRkaXIgcGFnZXMgcGVyIFJQQyAqLwogCiAJc3RydWN0IGx1X3NpdGUJICAgKmxsX3NpdGU7CiAJc3RydWN0IGNsX2RldmljZQkgKmxsX2NsOwpAQCAtNDg0LDExICs1MTAsMTcgQEAKIAlhdG9taWNfdAkJICBsbF9zYV93cm9uZzsgICAvKiBzdGF0YWhlYWQgdGhyZWFkIHN0b3BwZWQgZm9yCiAJCQkJCQkgICogbG93IGhpdCByYXRpbwogCQkJCQkJICAqLworCWF0b21pY190CQlsbF9zYV9ydW5uaW5nOwkvKiBydW5uaW5nIHN0YXRhaGVhZCB0aHJlYWQKKwkJCQkJCSAqIGNvdW50CisJCQkJCQkgKi8KIAlhdG9taWNfdAkJICBsbF9hZ2xfdG90YWw7ICAvKiBBR0wgdGhyZWFkIHN0YXJ0ZWQgY291bnQgKi8KIAogCWRldl90CQkJICBsbF9zZGV2X29yaWc7IC8qIHNhdmUgc19kZXYgYmVmb3JlIGFzc2lnbiBmb3IKIAkJCQkJCSAqIGNsdXN0ZXJlZCBuZnMKIAkJCQkJCSAqLworCS8qIHJvb3Qgc3F1YXNoICovCisJc3RydWN0IHJvb3Rfc3F1YXNoX2luZm8JICBsbF9zcXVhc2g7CisKIAlfX2tlcm5lbF9mc2lkX3QJCSAgbGxfZnNpZDsKIAlzdHJ1Y3Qga29iamVjdAkJIGxsX2tvYmo7IC8qIHN5c2ZzIG9iamVjdCAqLwogCXN0cnVjdCBzdXBlcl9ibG9jawkqbGxfc2I7IC8qIHN0cnVjdCBzdXBlcl9ibG9jayAoZm9yIHN5c2ZzIGNvZGUpKi8KQEAgLTY0MywyNSArNjc1LDY2IEBACiAJCSAgICAgICBzdHJ1Y3QgbGxfZmlsZV9kYXRhICpmaWxlLCBsb2ZmX3QgcG9zLAogCQkgICAgICAgc2l6ZV90IGNvdW50LCBpbnQgcncpOwogCitlbnVtIHsKKwlMUFJPQ19MTF9ESVJUWV9ISVRTLAorCUxQUk9DX0xMX0RJUlRZX01JU1NFUywKKwlMUFJPQ19MTF9SRUFEX0JZVEVTLAorCUxQUk9DX0xMX1dSSVRFX0JZVEVTLAorCUxQUk9DX0xMX0JSV19SRUFELAorCUxQUk9DX0xMX0JSV19XUklURSwKKwlMUFJPQ19MTF9PU0NfUkVBRCwKKwlMUFJPQ19MTF9PU0NfV1JJVEUsCisJTFBST0NfTExfSU9DVEwsCisJTFBST0NfTExfT1BFTiwKKwlMUFJPQ19MTF9SRUxFQVNFLAorCUxQUk9DX0xMX01BUCwKKwlMUFJPQ19MTF9MTFNFRUssCisJTFBST0NfTExfRlNZTkMsCisJTFBST0NfTExfUkVBRERJUiwKKwlMUFJPQ19MTF9TRVRBVFRSLAorCUxQUk9DX0xMX1RSVU5DLAorCUxQUk9DX0xMX0ZMT0NLLAorCUxQUk9DX0xMX0dFVEFUVFIsCisJTFBST0NfTExfQ1JFQVRFLAorCUxQUk9DX0xMX0xJTkssCisJTFBST0NfTExfVU5MSU5LLAorCUxQUk9DX0xMX1NZTUxJTkssCisJTFBST0NfTExfTUtESVIsCisJTFBST0NfTExfUk1ESVIsCisJTFBST0NfTExfTUtOT0QsCisJTFBST0NfTExfUkVOQU1FLAorCUxQUk9DX0xMX1NUQUZTLAorCUxQUk9DX0xMX0FMTE9DX0lOT0RFLAorCUxQUk9DX0xMX1NFVFhBVFRSLAorCUxQUk9DX0xMX0dFVFhBVFRSLAorCUxQUk9DX0xMX0dFVFhBVFRSX0hJVFMsCisJTFBST0NfTExfTElTVFhBVFRSLAorCUxQUk9DX0xMX1JFTU9WRVhBVFRSLAorCUxQUk9DX0xMX0lOT0RFX1BFUk0sCisJTFBST0NfTExfRklMRV9PUENPREVTCit9OworCiAvKiBsbGl0ZS9kaXIuYyAqLwotdm9pZCBsbF9yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCByZW1vdmUpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGxfZGlyX29wZXJhdGlvbnM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbGxfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci1zdHJ1Y3QgcGFnZSAqbGxfZ2V0X2Rpcl9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCBfX3U2NCBoYXNoLAotCQkJICAgICBzdHJ1Y3QgbGxfZGlyX2NoYWluICpjaGFpbik7Ci1pbnQgbGxfZGlyX3JlYWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRpcl9jb250ZXh0ICpjdHgpOwotCitpbnQgbGxfZGlyX3JlYWQoc3RydWN0IGlub2RlICppbm9kZSwgX191NjQgKnBwb3MsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCQlzdHJ1Y3QgZGlyX2NvbnRleHQgKmN0eCk7CiBpbnQgbGxfZ2V0X21kdF9pZHgoc3RydWN0IGlub2RlICppbm9kZSk7CitpbnQgbGxfZ2V0X21kdF9pZHhfYnlfZmlkKHN0cnVjdCBsbF9zYl9pbmZvICpzYmksIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCk7CitzdHJ1Y3QgcGFnZSAqbGxfZ2V0X2Rpcl9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKKwkJCSAgICAgX191NjQgb2Zmc2V0KTsKK3ZvaWQgbGxfcmVsZWFzZV9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLCBib29sIHJlbW92ZSk7CisKIC8qIGxsaXRlL25hbWVpLmMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBsbF9zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CiAKLWludCBsbF9vYmplY3RzX2Rlc3Ryb3koc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LAotCQkgICAgICAgc3RydWN0IGlub2RlICpkaXIpOwogc3RydWN0IGlub2RlICpsbF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGlub190IGhhc2gsCiAJCSAgICAgIHN0cnVjdCBsdXN0cmVfbWQgKmxpYyk7CitpbnQgbGxfdGVzdF9pbm9kZV9ieV9maWQoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKTsKIGludCBsbF9tZF9ibG9ja2luZ19hc3Qoc3RydWN0IGxkbG1fbG9jayAqLCBzdHJ1Y3QgbGRsbV9sb2NrX2Rlc2MgKiwKIAkJICAgICAgIHZvaWQgKmRhdGEsIGludCBmbGFnKTsKIHN0cnVjdCBkZW50cnkgKmxsX3NwbGljZV9hbGlhcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZSk7Cit2b2lkIGxsX3VwZGF0ZV90aW1lcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiAvKiBsbGl0ZS9ydy5jICovCiBpbnQgbGxfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CkBAIC03MDQsNyArNzc3LDEwIEBACiAJCQkgIHN0cnVjdCBsdXN0cmVfaGFuZGxlICpmaCk7CiBpbnQgbGxfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGUsIHN0cnVjdCBrc3RhdCAqc3RhdCk7CiBzdHJ1Y3QgcG9zaXhfYWNsICpsbF9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKLQoraW50IGxsX21pZ3JhdGUoc3RydWN0IGlub2RlICpwYXJlbnQsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbWR0aWR4LAorCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CitpbnQgbGxfZ2V0X2ZpZF9ieV9uYW1lKHN0cnVjdCBpbm9kZSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgaW50IG5hbWVsZW4sIHN0cnVjdCBsdV9maWQgKmZpZCk7CiBpbnQgbGxfaW5vZGVfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiAKIGludCBsbF9sb3Zfc2V0c3RyaXBlX2VhX2luZm8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LApAQCAtNzE1LDggKzc5MSw4IEBACiAJCQkgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpOwogaW50IGxsX2Rpcl9zZXRzdHJpcGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGxvdl91c2VyX21kICpsdW1wLAogCQkgICAgIGludCBzZXRfZGVmYXVsdCk7Ci1pbnQgbGxfZGlyX2dldHN0cmlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbG92X21kc19tZCAqKmxtbXAsCi0JCSAgICAgaW50ICpsbW1fc2l6ZSwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCk7CitpbnQgbGxfZGlyX2dldHN0cmlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICoqbG1tcCwgaW50ICpsbW1fc2l6ZSwKKwkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0LCB1NjQgdmFsaWQpOwogaW50IGxsX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsIGludCBkYXRhKTsKIGludCBsbF9tZXJnZV9hdHRyKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgbGxfZmlkMnBhdGgoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCBfX3VzZXIgKmFyZyk7CkBAIC03NDgsOCArODI0LDggQEAKIGludCBsbF9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGUsIHN0cnVjdCBrc3RhdGZzICpzZnMpOwogaW50IGxsX3N0YXRmc19pbnRlcm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgb2JkX3N0YXRmcyAqb3NmcywKIAkJICAgICAgIF9fdTY0IG1heF9hZ2UsIF9fdTMyIGZsYWdzKTsKLXZvaWQgbGxfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsdXN0cmVfbWQgKm1kKTsKLXZvaWQgbGxfcmVhZF9pbm9kZTIoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKTsKK2ludCBsbF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGx1c3RyZV9tZCAqbWQpOworaW50IGxsX3JlYWRfaW5vZGUyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSk7CiB2b2lkIGxsX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGludCBsbF9pb2NvbnRyb2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CkBAIC03NjMsMTUgKzgzOSw0NiBAQAogaW50IGxsX29iZF9zdGF0ZnMoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCBfX3VzZXIgKmFyZyk7CiBpbnQgbGxfZ2V0X21heF9tZHNpemUoc3RydWN0IGxsX3NiX2luZm8gKnNiaSwgaW50ICptYXhfbWRzaXplKTsKIGludCBsbF9nZXRfZGVmYXVsdF9tZHNpemUoc3RydWN0IGxsX3NiX2luZm8gKnNiaSwgaW50ICpkZWZhdWx0X21kc2l6ZSk7CitpbnQgbGxfc2V0X2RlZmF1bHRfbWRzaXplKHN0cnVjdCBsbF9zYl9pbmZvICpzYmksIGludCBkZWZhdWx0X21kc2l6ZSk7CiBpbnQgbGxfcHJvY2Vzc19jb25maWcoc3RydWN0IGx1c3RyZV9jZmcgKmxjZmcpOworCitlbnVtIHsKKwlMVVNUUkVfT1BDX01LRElSCT0gMCwKKwlMVVNUUkVfT1BDX1NZTUxJTksJPSAxLAorCUxVU1RSRV9PUENfTUtOT0QJPSAyLAorCUxVU1RSRV9PUENfQ1JFQVRFCT0gMywKKwlMVVNUUkVfT1BDX0FOWQkJPSA1LAorfTsKKwogc3RydWN0IG1kX29wX2RhdGEgKmxsX3ByZXBfbWRfb3BfZGF0YShzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKIAkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmkxLCBzdHJ1Y3QgaW5vZGUgKmkyLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAotCQkJCSAgICAgIGludCBtb2RlLCBfX3UzMiBvcGMsIHZvaWQgKmRhdGEpOworCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAorCQkJCSAgICAgIHUzMiBtb2RlLCBfX3UzMiBvcGMsIHZvaWQgKmRhdGEpOwogdm9pZCBsbF9maW5pc2hfbWRfb3BfZGF0YShzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7CiBpbnQgbGxfZ2V0X29iZF9uYW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGNoYXIgKmxsX2dldF9mc25hbWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKK3ZvaWQgbGxfY29tcHV0ZV9yb290c3F1YXNoX3N0YXRlKHN0cnVjdCBsbF9zYl9pbmZvICpzYmkpOwogdm9pZCBsbF9vcGVuX2NsZWFudXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpvcGVuX3JlcSk7Citzc2l6ZV90IGxsX2NvcHlfdXNlcl9tZChjb25zdCBzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICptZCwKKwkJCXN0cnVjdCBsb3ZfdXNlcl9tZCAqKmtidWYpOworCisvKiBDb21wdXRlIGV4cGVjdGVkIHVzZXIgbWQgc2l6ZSB3aGVuIHBhc3NpbmcgaW4gYSBtZCBmcm9tIHVzZXIgc3BhY2UgKi8KK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBsbF9sb3ZfdXNlcl9tZF9zaXplKGNvbnN0IHN0cnVjdCBsb3ZfdXNlcl9tZCAqbHVtKQoreworCXN3aXRjaCAobHVtLT5sbW1fbWFnaWMpIHsKKwljYXNlIExPVl9VU0VSX01BR0lDX1YxOgorCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSk7CisJY2FzZSBMT1ZfVVNFUl9NQUdJQ19WMzoKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjMpOworCWNhc2UgTE9WX1VTRVJfTUFHSUNfU1BFQ0lGSUM6CisJCWlmIChsdW0tPmxtbV9zdHJpcGVfY291bnQgPiBMT1ZfTUFYX1NUUklQRV9DT1VOVCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldHVybiBsb3ZfdXNlcl9tZF9zaXplKGx1bS0+bG1tX3N0cmlwZV9jb3VudCwKKwkJCQkJTE9WX1VTRVJfTUFHSUNfU1BFQ0lGSUMpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KIAogLyogbGxpdGUvbGxpdGVfbmZzLmMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgbHVzdHJlX2V4cG9ydF9vcGVyYXRpb25zOwpAQCAtNzc5LDYgKzg4Niw3IEBACiB2b2lkIGdldF91dWlkMmZzaWQoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbiwgX19rZXJuZWxfZnNpZF90ICpmc2lkKTsKIHN0cnVjdCBpbm9kZSAqc2VhcmNoX2lub2RlX2Zvcl9sdXN0cmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpOworaW50IGxsX2Rpcl9nZXRfcGFyZW50X2ZpZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGx1X2ZpZCAqcGFyZW50X2ZpZCk7CiAKIC8qIGxsaXRlL3N5bWxpbmsuYyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGxsX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwpAQCAtODAwLDE3ICs5MDgsMTEgQEAKICAqLwogc3RydWN0IHZ2cF9pb19hcmdzIHsKIAkvKiogbm9ybWFsL3NwbGljZSAqLwotCWVudW0gdnZwX2lvX3N1YnR5cGUgdmlhX2lvX3N1YnR5cGU7Ci0KIAl1bmlvbiB7CiAJCXN0cnVjdCB7CiAJCQlzdHJ1Y3Qga2lvY2IgICAgICAqdmlhX2lvY2I7CiAJCQlzdHJ1Y3QgaW92X2l0ZXIgICAqdmlhX2l0ZXI7CiAJCX0gbm9ybWFsOwotCQlzdHJ1Y3QgewotCQkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAgKnZpYV9waXBlOwotCQkJdW5zaWduZWQgaW50ICAgICAgIHZpYV9mbGFnczsKLQkJfSBzcGxpY2U7CiAJfSB1OwogfTsKIApAQCAtODM4LDE0ICs5NDAsOSBAQAogCXJldHVybiBsdGk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZ2cF9pb19hcmdzICpsbF9lbnZfYXJncyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCi0JCQkJCSAgICAgIGVudW0gdnZwX2lvX3N1YnR5cGUgdHlwZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZ2cF9pb19hcmdzICpsbF9lbnZfYXJncyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYpCiB7Ci0Jc3RydWN0IHZ2cF9pb19hcmdzICp2aWEgPSAmbGxfZW52X2luZm8oZW52KS0+bHRpX2FyZ3M7Ci0KLQl2aWEtPnZpYV9pb19zdWJ0eXBlID0gdHlwZTsKLQotCXJldHVybiB2aWE7CisJcmV0dXJuICZsbF9lbnZfaW5mbyhlbnYpLT5sdGlfYXJnczsKIH0KIAogdm9pZCBsbF9xdWV1ZV9kb25lX3dyaXRpbmcoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CkBAIC05MzMsMTIgKzEwMzAsMTkgQEAKIH0KIAogLyogbGxpdGUveGF0dHIuYyAqLwotaW50IGxsX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOwotc3NpemVfdCBsbF9nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCSAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqbGxfeGF0dHJfaGFuZGxlcnNbXTsKKworI2RlZmluZSBYQVRUUl9VU0VSX1QJCTEKKyNkZWZpbmUgWEFUVFJfVFJVU1RFRF9UCQkyCisjZGVmaW5lIFhBVFRSX1NFQ1VSSVRZX1QJMworI2RlZmluZSBYQVRUUl9BQ0xfQUNDRVNTX1QJNAorI2RlZmluZSBYQVRUUl9BQ0xfREVGQVVMVF9UCTUKKyNkZWZpbmUgWEFUVFJfTFVTVFJFX1QJCTYKKyNkZWZpbmUgWEFUVFJfT1RIRVJfVAkJNworCiBzc2l6ZV90IGxsX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotaW50IGxsX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSk7CitpbnQgbGxfeGF0dHJfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgdHlwZSwKKwkJICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBfX3U2NCB2YWxpZCk7CiAKIC8qKgogICogQ29tbW9uIElPIGFyZ3VtZW50cyBmb3IgdmFyaW91cyBWRlMgSS9PIGludGVyZmFjZXMuCkBAIC05NjQsMTEgKzEwNjgsMTAgQEAKIAogLyogcGVyIGlub2RlIHN0cnVjdCwgZm9yIGRpciBvbmx5ICovCiBzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gewotCXN0cnVjdCBpbm9kZQkgICAqc2FpX2lub2RlOworCXN0cnVjdCBkZW50cnkJICAgKnNhaV9kZW50cnk7CiAJYXRvbWljX3QJICAgIHNhaV9yZWZjb3VudDsgICAvKiB3aGVuIGFjY2VzcyB0aGlzIHN0cnVjdCwgaG9sZAogCQkJCQkgICAgICogcmVmY291bnQKIAkJCQkJICAgICAqLwotCXVuc2lnbmVkIGludAkgICAgc2FpX2dlbmVyYXRpb247IC8qIGdlbmVyYXRpb24gZm9yIHN0YXRhaGVhZCAqLwogCXVuc2lnbmVkIGludAkgICAgc2FpX21heDsJLyogbWF4IGFoZWFkIG9mIGxvb2t1cCAqLwogCV9fdTY0CQkgICBzYWlfc2VudDsgICAgICAgLyogc3RhdCByZXF1ZXN0cyBzZW50IGNvdW50ICovCiAJX191NjQJCSAgIHNhaV9yZXBsaWVkOyAgICAvKiBzdGF0IHJlcXVlc3RzIHdoaWNoIHJlY2VpdmVkCkBAIC05OTUsMjIgKzEwOTgsMjUgQEAKIAl1bnNpZ25lZCBpbnQJICAgIHNhaV9sc19hbGw6MSwgICAvKiAibHMgLWFsIiwgZG8gc3RhdC1haGVhZCBmb3IKIAkJCQkJICAgICAqIGhpZGRlbiBlbnRyaWVzCiAJCQkJCSAgICAgKi8KLQkJCQlzYWlfYWdsX3ZhbGlkOjE7LyogQUdMIGlzIHZhbGlkIGZvciB0aGUgZGlyICovCisJCQkJc2FpX2FnbF92YWxpZDoxLC8qIEFHTCBpcyB2YWxpZCBmb3IgdGhlIGRpciAqLworCQkJCXNhaV9pbl9yZWFkcGFnZToxOy8qIHN0YXRhaGVhZCBpcyBpbiByZWFkZGlyKCkgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdAlzYWlfd2FpdHE7ICAgICAgLyogc3RhdC1haGVhZCB3YWl0IHF1ZXVlICovCiAJc3RydWN0IHB0bHJwY190aHJlYWQgICAgc2FpX3RocmVhZDsgICAgIC8qIHN0YXQtYWhlYWQgdGhyZWFkICovCiAJc3RydWN0IHB0bHJwY190aHJlYWQgICAgc2FpX2FnbF90aHJlYWQ7IC8qIEFHTCB0aHJlYWQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXNhaV9lbnRyaWVzOyAgICAvKiBlbnRyeSBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlzYWlfZW50cmllc19yZWNlaXZlZDsgLyogZW50cmllcyByZXR1cm5lZCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJc2FpX2VudHJpZXNfc3RhdGVkOyAgIC8qIGVudHJpZXMgc3RhdGVkICovCi0Jc3RydWN0IGxpc3RfaGVhZAlzYWlfZW50cmllc19hZ2w7IC8qIEFHTCBlbnRyaWVzIHRvIGJlIHNlbnQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXNhaV9pbnRlcmltX2VudHJpZXM7IC8qIGVudHJpZXMgd2hpY2ggZ290IGFzeW5jCisJCQkJCQkgICAgICAqIHN0YXQgcmVwbHksIGJ1dCBub3QKKwkJCQkJCSAgICAgICogaW5zdGFudGlhdGVkCisJCQkJCQkgICAgICAqLworCXN0cnVjdCBsaXN0X2hlYWQJc2FpX2VudHJpZXM7CS8qIGNvbXBsZXRlZCBlbnRyaWVzICovCisJc3RydWN0IGxpc3RfaGVhZAlzYWlfYWdsczsJLyogQUdMcyB0byBiZSBzZW50ICovCiAJc3RydWN0IGxpc3RfaGVhZAlzYWlfY2FjaGVbTExfU0FfQ0FDSEVfU0laRV07CiAJc3BpbmxvY2tfdAkJc2FpX2NhY2hlX2xvY2tbTExfU0FfQ0FDSEVfU0laRV07CiAJYXRvbWljX3QJCXNhaV9jYWNoZV9jb3VudDsgLyogZW50cnkgY291bnQgaW4gY2FjaGUgKi8KIH07CiAKLWludCBkb19zdGF0YWhlYWRfZW50ZXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKipkZW50cnksCi0JCSAgICAgICBpbnQgb25seV91bnBsdWcpOwotdm9pZCBsbF9zdG9wX3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgdm9pZCAqa2V5KTsKK2ludCBsbF9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKipkZW50cnksIGJvb2wgdW5wbHVnKTsKK3ZvaWQgbGxfYXV0aG9yaXplX3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgdm9pZCAqa2V5KTsKK3ZvaWQgbGxfZGVhdXRob3JpemVfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICprZXkpOwogCiBibGtjbnRfdCBkaXJ0eV9jbnQoc3RydWN0IGlub2RlICppbm9kZSk7CiAKQEAgLTEwNDAsNzMgKzExNDYsNTMgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZAotbGxfc3RhdGFoZWFkX21hcmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKLXsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKmxsaSA9IGxsX2kyaW5mbyhkaXIpOwotCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpID0gbGxpLT5sbGlfc2FpOwotCXN0cnVjdCBsbF9kZW50cnlfZGF0YSAgICAqbGRkID0gbGxfZDJkKGRlbnRyeSk7Ci0KLQkvKiBub3QgdGhlIHNhbWUgcHJvY2VzcywgZG9uJ3QgbWFyayAqLwotCWlmIChsbGktPmxsaV9vcGVuZGlyX3BpZCAhPSBjdXJyZW50X3BpZCgpKQotCQlyZXR1cm47Ci0KLQlMQVNTRVJUKGxkZCk7Ci0JaWYgKHNhaSkKLQkJbGRkLT5sbGRfc2FfZ2VuZXJhdGlvbiA9IHNhaS0+c2FpX2dlbmVyYXRpb247Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1kX25lZWRfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnlwKQorLyoKKyAqIGRlbnRyeSBtYXkgc3RhdGFoZWFkIHdoZW4gc3RhdGFoZWFkIGlzIGVuYWJsZWQgYW5kIGN1cnJlbnQgcHJvY2VzcyBoYXMgb3BlbmVkCisgKiBwYXJlbnQgZGlyZWN0b3J5LCBhbmQgdGhpcyBkZW50cnkgaGFzbid0IGFjY2Vzc2VkIHN0YXRhaGVhZCBjYWNoZSBiZWZvcmUKKyAqLworc3RhdGljIGlubGluZSBib29sCitkZW50cnlfbWF5X3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAqbGxpOwogCXN0cnVjdCBsbF9kZW50cnlfZGF0YSAqbGRkOwogCiAJaWYgKGxsX2kyc2JpKGRpciktPmxsX3NhX21heCA9PSAwKQotCQlyZXR1cm4gLUVBR0FJTjsKKwkJcmV0dXJuIGZhbHNlOwogCiAJbGxpID0gbGxfaTJpbmZvKGRpcik7CisKKwkvKgorCSAqIHN0YXRhaGVhZCBpcyBub3QgYWxsb3dlZCBmb3IgdGhpcyBkaXIsIHRoZXJlIG1heSBiZSB0aHJlZSBjYXVzZXM6CisJICogMS4gZGlyIGlzIG5vdCBvcGVuZWQuCisJICogMi4gc3RhdGFoZWFkIGhpdCByYXRpbyBpcyB0b28gbG93LgorCSAqIDMuIHByZXZpb3VzIHN0YXQgc3RhcnRlZCBzdGF0YWhlYWQgdGhyZWFkIGZhaWxlZC4KKwkgKi8KKwlpZiAoIWxsaS0+bGxpX3NhX2VuYWJsZWQpCisJCXJldHVybiBmYWxzZTsKKwogCS8qIG5vdCB0aGUgc2FtZSBwcm9jZXNzLCBkb24ndCBzdGF0YWhlYWQgKi8KIAlpZiAobGxpLT5sbGlfb3BlbmRpcl9waWQgIT0gY3VycmVudF9waWQoKSkKLQkJcmV0dXJuIC1FQUdBSU47CisJCXJldHVybiBmYWxzZTsKIAotCS8qIHN0YXRhaGVhZCBoYXMgYmVlbiBzdG9wcGVkICovCi0JaWYgKCFsbGktPmxsaV9vcGVuZGlyX2tleSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlsZGQgPSBsbF9kMmQoZGVudHJ5cCk7CiAJLyoKLQkgKiBXaGVuIHN0YXRzIGEgZGVudHJ5LCB0aGUgc3lzdGVtIHRyaWdnZXIgbW9yZSB0aGFuIG9uY2UgInJldmFsaWRhdGUiCi0JICogb3IgImxvb2t1cCIsIGZvciAiZ2V0YXR0ciIsIGZvciAiZ2V0eGF0dHIiLCBhbmQgbWF5YmUgZm9yIG90aGVycy4KLQkgKiBVbmRlciBwYXRjaGxlc3MgY2xpZW50IG1vZGUsIHRoZSBvcGVyYXRpb24gaW50ZW50IGlzIG5vdCBhY2N1cmF0ZSwKLQkgKiB3aGljaCBtYXliZSBtaXNndWlkZSB0aGUgc3RhdGFoZWFkIHRocmVhZC4gRm9yIGV4YW1wbGU6Ci0JICogVGhlICJyZXZhbGlkYXRlIiBjYWxsIGZvciAiZ2V0YXR0ciIgYW5kICJnZXR4YXR0ciIgb2YgYSBkZW50cnkgbWF5YmUKLQkgKiBoYXZlIHRoZSBzYW1lIG9wZXJhdGlvbiBpbnRlbnQgLS0gIklUX0dFVEFUVFIiLgotCSAqIEluIGZhY3QsIG9uZSBkZW50cnkgc2hvdWxkIGhhcyBvbmx5IG9uZSBjaGFuY2UgdG8gaW50ZXJhY3Qgd2l0aCB0aGUKLQkgKiBzdGF0YWhlYWQgdGhyZWFkLCBvdGhlcndpc2UgdGhlIHN0YXRhaGVhZCB3aW5kb3dzIHdpbGwgYmUgY29uZnVzZWQuCisJICogV2hlbiBzdGF0aW5nIGEgZGVudHJ5LCBrZXJuZWwgbWF5IHRyaWdnZXIgJ3JldmFsaWRhdGUnIG9yICdsb29rdXAnCisJICogbXVsdGlwbGUgdGltZXMsIGVnLiBmb3IgJ2dldGF0dHInLCAnZ2V0eGF0dHInIGFuZCBldGMuCisJICogRm9yIHBhdGNobGVzcyBjbGllbnQsIGxvb2t1cCBpbnRlbnQgaXMgbm90IGFjY3VyYXRlLCB3aGljaCBtYXkKKwkgKiBtaXNndWlkZSBzdGF0YWhlYWQuIEZvciBleGFtcGxlOgorCSAqIFRoZSAncmV2YWxpZGF0ZScgY2FsbCBmb3IgJ2dldGF0dHInIGFuZCAnZ2V0eGF0dHInIG9mIGEgZGVudHJ5IHdpbGwKKwkgKiBoYXZlIHRoZSBzYW1lIGludGVudCAtLSBJVF9HRVRBVFRSLCB3aGlsZSBvbmUgZGVudHJ5IHNob3VsZCBhY2Nlc3MKKwkgKiBzdGF0YWhlYWQgY2FjaGUgb25jZSwgb3RoZXJ3aXNlIHN0YXRhaGVhZCB3aW5kb3dzIGlzIG1lc3NlZCB1cC4KIAkgKiBUaGUgc29sdXRpb24gaXMgYXMgZm9sbG93aW5nOgotCSAqIEFzc2lnbiAibGxkX3NhX2dlbmVyYXRpb24iIHdpdGggInNhaV9nZW5lcmF0aW9uIiB3aGVuIGEgZGVudHJ5Ci0JICogIklUX0dFVEFUVFIiIGZvciB0aGUgZmlyc3QgdGltZSwgYW5kIHRoZSBzdWJzZXF1ZW50ICJJVF9HRVRBVFRSIgotCSAqIHdpbGwgYnlwYXNzIGludGVyYWN0aW5nIHdpdGggc3RhdGFoZWFkIHRocmVhZCBmb3IgY2hlY2tpbmc6Ci0JICogImxsZF9zYV9nZW5lcmF0aW9uID09IGxsaV9zYWktPnNhaV9nZW5lcmF0aW9uIgorCSAqIEFzc2lnbiAnbGxkX3NhX2dlbmVyYXRpb24nIHdpdGggJ2xsaV9zYV9nZW5lcmF0aW9uJyB3aGVuIGEgZGVudHJ5CisJICogSVRfR0VUQVRUUiBmb3IgdGhlIGZpcnN0IHRpbWUsIGFuZCBzdWJzZXF1ZW50IElUX0dFVEFUVFIgd2lsbAorCSAqIGJ5cGFzcyBpbnRlcmFjdGluZyB3aXRoIHN0YXRhaGVhZCBjYWNoZSBieSBjaGVja2luZworCSAqICdsbGRfc2FfZ2VuZXJhdGlvbiA9PSBsbGktPmxsaV9zYV9nZW5lcmF0aW9uJy4KIAkgKi8KLQlpZiAobGRkICYmIGxsaS0+bGxpX3NhaSAmJgotCSAgICBsZGQtPmxsZF9zYV9nZW5lcmF0aW9uID09IGxsaS0+bGxpX3NhaS0+c2FpX2dlbmVyYXRpb24pCi0JCXJldHVybiAtRUFHQUlOOworCWxkZCA9IGxsX2QyZChkZW50cnkpOworCWlmIChsZGQgJiYgbGRkLT5sbGRfc2FfZ2VuZXJhdGlvbiA9PSBsbGktPmxsaV9zYV9nZW5lcmF0aW9uKQorCQlyZXR1cm4gZmFsc2U7CiAKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWxsX3N0YXRhaGVhZF9lbnRlcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeXAsIGludCBvbmx5X3VucGx1ZykKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZF9uZWVkX3N0YXRhaGVhZChkaXIsICpkZW50cnlwKTsKLQlpZiAocmV0IDw9IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gZG9fc3RhdGFoZWFkX2VudGVyKGRpciwgZGVudHJ5cCwgb25seV91bnBsdWcpOworCXJldHVybiB0cnVlOwogfQogCiAvKiBsbGl0ZSBpb2N0bCByZWdpc3RlciBzdXBwb3J0IHJvdXRpbmUgKi8KQEAgLTEyMTMsNyArMTI5OSw3IEBACiAJCQlDREVCVUcoRF9ETE1UUkFDRSwgInNldHRpbmcgbF9kYXRhIHRvIGlub2RlICJERklEIiVwIGZvciByZW1vdGUgbG9jayAlI2xseFxuIiwKIAkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwKIAkJCSAgICAgICBoYW5kbGUuY29va2llKTsKLQkJCW1kX3NldF9sb2NrX2RhdGEoZXhwLCAmaGFuZGxlLmNvb2tpZSwgaW5vZGUsIE5VTEwpOworCQkJbWRfc2V0X2xvY2tfZGF0YShleHAsICZoYW5kbGUsIGlub2RlLCBOVUxMKTsKIAkJfQogCiAJCWhhbmRsZS5jb29raWUgPSBpdC0+aXRfbG9ja19oYW5kbGU7CkBAIC0xMjIxLDggKzEzMDcsNyBAQAogCQlDREVCVUcoRF9ETE1UUkFDRSwgInNldHRpbmcgbF9kYXRhIHRvIGlub2RlICJERklEIiVwIGZvciBsb2NrICUjbGx4XG4iLAogCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUsIGhhbmRsZS5jb29raWUpOwogCi0JCW1kX3NldF9sb2NrX2RhdGEoZXhwLCAmaGFuZGxlLmNvb2tpZSwgaW5vZGUsCi0JCQkJICZpdC0+aXRfbG9ja19iaXRzKTsKKwkJbWRfc2V0X2xvY2tfZGF0YShleHAsICZoYW5kbGUsIGlub2RlLCAmaXQtPml0X2xvY2tfYml0cyk7CiAJCWl0LT5pdF9sb2NrX3NldCA9IDE7CiAJfQogCkBAIC0xMjk1LDYgKzEzODAsOCBAQAogaW50IGxsX3BhZ2Vfc3luY19pbyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9pbyAqaW8sCiAJCSAgICBzdHJ1Y3QgY2xfcGFnZSAqcGFnZSwgZW51bSBjbF9yZXFfdHlwZSBjcnQpOwogCitpbnQgbGxfZ2V0cGFyZW50KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZ2V0cGFyZW50IF9fdXNlciAqYXJnKTsKKwogLyogbGNvbW1vbl9jbC5jICovCiBpbnQgY2xfc2V0YXR0cl9vc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3Qgc3RydWN0IGlhdHRyICphdHRyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9saWIuYwppbmRleCA1NDYwNjNlLi42YmI0MWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9saWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9saWIuYwpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaW9jdGwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9oYS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2RsbS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKQEAgLTExNSw5ICsxMTUsMTYgQEAKIAlzYmktPmxsX3NhX21heCA9IExMX1NBX1JQQ19ERUY7CiAJYXRvbWljX3NldCgmc2JpLT5sbF9zYV90b3RhbCwgMCk7CiAJYXRvbWljX3NldCgmc2JpLT5sbF9zYV93cm9uZywgMCk7CisJYXRvbWljX3NldCgmc2JpLT5sbF9zYV9ydW5uaW5nLCAwKTsKIAlhdG9taWNfc2V0KCZzYmktPmxsX2FnbF90b3RhbCwgMCk7CiAJc2JpLT5sbF9mbGFncyB8PSBMTF9TQklfQUdMX0VOQUJMRUQ7CiAKKwkvKiByb290IHNxdWFzaCAqLworCXNiaS0+bGxfc3F1YXNoLnJzaV91aWQgPSAwOworCXNiaS0+bGxfc3F1YXNoLnJzaV9naWQgPSAwOworCUlOSVRfTElTVF9IRUFEKCZzYmktPmxsX3NxdWFzaC5yc2lfbm9zcXVhc2hfbmlkcyk7CisJaW5pdF9yd3NlbSgmc2JpLT5sbF9zcXVhc2gucnNpX3NlbSk7CisKIAlzYmktPmxsX3NiID0gc2I7CiAKIAlyZXR1cm4gc2JpOwpAQCAtMTI4LDYgKzEzNSw4IEBACiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKIAogCWlmIChzYmktPmxsX2NhY2hlKSB7CisJCWlmICghbGlzdF9lbXB0eSgmc2JpLT5sbF9zcXVhc2gucnNpX25vc3F1YXNoX25pZHMpKQorCQkJY2ZzX2ZyZWVfbmlkbGlzdCgmc2JpLT5sbF9zcXVhc2gucnNpX25vc3F1YXNoX25pZHMpOwogCQljbF9jYWNoZV9kZWNyZWYoc2JpLT5sbF9jYWNoZSk7CiAJCXNiaS0+bGxfY2FjaGUgPSBOVUxMOwogCX0KQEAgLTE4MCw3ICsxODksOSBAQAogCQkJCSAgT0JEX0NPTk5FQ1RfUElOR0xFU1MgfAogCQkJCSAgT0JEX0NPTk5FQ1RfTUFYX0VBU0laRSB8CiAJCQkJICBPQkRfQ09OTkVDVF9GTE9DS19ERUFEIHwKLQkJCQkgIE9CRF9DT05ORUNUX0RJU1BfU1RSSVBFOworCQkJCSAgT0JEX0NPTk5FQ1RfRElTUF9TVFJJUEUgfCBPQkRfQ09OTkVDVF9MRlNDSyB8CisJCQkJICBPQkRfQ09OTkVDVF9PUEVOX0JZX0ZJRCB8CisJCQkJICBPQkRfQ09OTkVDVF9ESVJfU1RSSVBFOwogCiAJaWYgKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfU09NX1BSRVZJRVcpCiAJCWRhdGEtPm9jZF9jb25uZWN0X2ZsYWdzIHw9IE9CRF9DT05ORUNUX1NPTTsKQEAgLTMxMCw5ICszMjEsOSBAQAogCQlzYmktPmxsX2ZsYWdzIHw9IExMX1NCSV82NEJJVF9IQVNIOwogCiAJaWYgKGRhdGEtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfQlJXX1NJWkUpCi0JCXNiaS0+bGxfbWRfYnJ3X3NpemUgPSBkYXRhLT5vY2RfYnJ3X3NpemU7CisJCXNiaS0+bGxfbWRfYnJ3X3BhZ2VzID0gZGF0YS0+b2NkX2Jyd19zaXplID4+IFBBR0VfU0hJRlQ7CiAJZWxzZQotCQlzYmktPmxsX21kX2Jyd19zaXplID0gUEFHRV9TSVpFOworCQlzYmktPmxsX21kX2Jyd19wYWdlcyA9IDE7CiAKIAlpZiAoZGF0YS0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9MQVlPVVRMT0NLKQogCQlzYmktPmxsX2ZsYWdzIHw9IExMX1NCSV9MQVlPVVRfTE9DSzsKQEAgLTQxOCw2ICs0MjksNyBAQAogCUNERUJVRyhEX1NVUEVSLCAicm9vdGZpZCAiREZJRCJcbiIsIFBGSUQoJnNiaS0+bGxfcm9vdF9maWQpKTsKIAogCXNiLT5zX29wID0gJmx1c3RyZV9zdXBlcl9vcGVyYXRpb25zOworCXNiLT5zX3hhdHRyID0gbGxfeGF0dHJfaGFuZGxlcnM7CiAjaWYgVEhSRUFEX1NJWkUgPj0gODE5MiAvKmI9MTc2MzAqLwogCXNiLT5zX2V4cG9ydF9vcCA9ICZsdXN0cmVfZXhwb3J0X29wZXJhdGlvbnM7CiAjZW5kaWYKQEAgLTQ2Miw3ICs0NzQsNyBAQAogCW1kX2ZyZWVfbHVzdHJlX21kKHNiaS0+bGxfbWRfZXhwLCAmbG1kKTsKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOwogCi0JaWYgKCEocm9vdCkpIHsKKwlpZiAoSVNfRVJSKHJvb3QpKSB7CiAJCWlmIChsbWQubHNtKQogCQkJb2JkX2ZyZWVfbWVtbWQoc2JpLT5sbF9kdF9leHAsICZsbWQubHNtKTsKICNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCkBAIC00ODYsMTEgKzQ5OCwyMSBAQAogCWVyciA9IG9iZF9zZXRfaW5mb19hc3luYyhOVUxMLCBzYmktPmxsX2R0X2V4cCwgc2l6ZW9mKEtFWV9DSEVDS1NVTSksCiAJCQkJIEtFWV9DSEVDS1NVTSwgc2l6ZW9mKGNoZWNrc3VtKSwgJmNoZWNrc3VtLAogCQkJCSBOVUxMKTsKKwlpZiAoZXJyKSB7CisJCUNFUlJPUigiJXM6IFNldCBjaGVja3N1bSBmYWlsZWQ6IHJjID0gJWRcbiIsCisJCSAgICAgICBzYmktPmxsX2R0X2V4cC0+ZXhwX29iZC0+b2JkX25hbWUsIGVycik7CisJCWdvdG8gb3V0X3Jvb3Q7CisJfQogCWNsX3NiX2luaXQoc2IpOwogCiAJZXJyID0gb2JkX3NldF9pbmZvX2FzeW5jKE5VTEwsIHNiaS0+bGxfZHRfZXhwLCBzaXplb2YoS0VZX0NBQ0hFX1NFVCksCiAJCQkJIEtFWV9DQUNIRV9TRVQsIHNpemVvZigqc2JpLT5sbF9jYWNoZSksCiAJCQkJIHNiaS0+bGxfY2FjaGUsIE5VTEwpOworCWlmIChlcnIpIHsKKwkJQ0VSUk9SKCIlczogU2V0IGNhY2hlX3NldCBmYWlsZWQ6IHJjID0gJWRcbiIsCisJCSAgICAgICBzYmktPmxsX2R0X2V4cC0+ZXhwX29iZC0+b2JkX25hbWUsIGVycik7CisJCWdvdG8gb3V0X3Jvb3Q7CisJfQogCiAJc2ItPnNfcm9vdCA9IGRfbWFrZV9yb290KHJvb3QpOwogCWlmICghc2ItPnNfcm9vdCkgewpAQCAtNTYwLDYgKzU4MiwxNyBAQAogCXJldHVybiByYzsKIH0KIAorLyoqCisgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0X2Vhc2l6ZSBwYXJhbWV0ZXIuCisgKgorICogXHNlZSBjbGllbnRfb2JkOjpjbF9kZWZhdWx0X21kc19lYXNpemUKKyAqCisgKiBccGFyYW1baW5dICBzYmkJc3VwZXJibG9jayBpbmZvIGZvciB0aGlzIGZpbGVzeXN0ZW0KKyAqIFxwYXJhbVtvdXRdIGxtbXNpemUJcG9pbnRlciB0byBzdG9yYWdlIGxvY2F0aW9uIGZvciB2YWx1ZQorICoKKyAqIFxyZXR2YWwgMAkJb24gc3VjY2VzcworICogXHJldHZhbCBuZWdhdGl2ZQluZWdhdGVkIGVycm5vIG9uIGZhaWx1cmUKKyAqLwogaW50IGxsX2dldF9kZWZhdWx0X21kc2l6ZShzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpLCBpbnQgKmxtbXNpemUpCiB7CiAJaW50IHNpemUsIHJjOwpAQCAtNTczLDYgKzYwNiwyOSBAQAogCXJldHVybiByYzsKIH0KIAorLyoqCisgKiBTZXQgdGhlIGRlZmF1bHRfZWFzaXplIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgKgorICogXHNlZSBjbGllbnRfb2JkOjpjbF9kZWZhdWx0X21kc19lYXNpemUKKyAqCisgKiBccGFyYW1baW5dIHNiaQlzdXBlcmJsb2NrIGluZm8gZm9yIHRoaXMgZmlsZXN5c3RlbQorICogXHBhcmFtW2luXSBsbW1zaXplCXRoZSBzaXplIHRvIHNldAorICoKKyAqIFxyZXR2YWwgMAkJb24gc3VjY2VzcworICogXHJldHZhbCBuZWdhdGl2ZQluZWdhdGVkIGVycm5vIG9uIGZhaWx1cmUKKyAqLworaW50IGxsX3NldF9kZWZhdWx0X21kc2l6ZShzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpLCBpbnQgbG1tc2l6ZSkKK3sKKwlpZiAobG1tc2l6ZSA8IHNpemVvZihzdHJ1Y3QgbG92X21kc19tZCkgfHwKKwkgICAgbG1tc2l6ZSA+IE9CRF9NQVhfREVGQVVMVF9FQV9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBvYmRfc2V0X2luZm9fYXN5bmMoTlVMTCwgc2JpLT5sbF9tZF9leHAsCisJCQkJICBzaXplb2YoS0VZX0RFRkFVTFRfRUFTSVpFKSwKKwkJCQkgIEtFWV9ERUZBVUxUX0VBU0laRSwKKwkJCQkgIHNpemVvZihpbnQpLCAmbG1tc2l6ZSwgTlVMTCk7Cit9CisKIHN0YXRpYyB2b2lkIGNsaWVudF9jb21tb25fcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX3Myc2JpKHNiKTsKQEAgLTYwOCw2ICs2NjQsMTIgQEAKIAlpZiAoc2JpKSB7CiAJCXNiLT5zX2RldiA9IHNiaS0+bGxfc2Rldl9vcmlnOwogCQlzYmktPmxsX3Vtb3VudGluZyA9IDE7CisKKwkJLyogd2FpdCBydW5uaW5nIHN0YXRhaGVhZCB0aHJlYWRzIHRvIHF1aXQgKi8KKwkJd2hpbGUgKGF0b21pY19yZWFkKCZzYmktPmxsX3NhX3J1bm5pbmcpID4gMCkgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKE1TRUNfUEVSX1NFQyA+PiAzKSk7CisJCX0KIAl9CiB9CiAKQEAgLTY0Nyw3ICs3MDksOCBAQAogCQkJKmZsYWdzIHw9IHRtcDsKIAkJCWdvdG8gbmV4dDsKIAkJfQotCQl0bXAgPSBsbF9zZXRfb3B0KCJub2Zsb2NrIiwgczEsIExMX1NCSV9GTE9DS3xMTF9TQklfTE9DQUxGTE9DSyk7CisJCXRtcCA9IGxsX3NldF9vcHQoIm5vZmxvY2siLCBzMSwKKwkJCQkgTExfU0JJX0ZMT0NLIHwgTExfU0JJX0xPQ0FMRkxPQ0spOwogCQlpZiAodG1wKSB7CiAJCQkqZmxhZ3MgJj0gfnRtcDsKIAkJCWdvdG8gbmV4dDsKQEAgLTc3MiwxMSArODM1LDEzIEBACiAJCWxsaS0+bGxpX3NhaSA9IE5VTEw7CiAJCXNwaW5fbG9ja19pbml0KCZsbGktPmxsaV9zYV9sb2NrKTsKIAkJbGxpLT5sbGlfb3BlbmRpcl9waWQgPSAwOworCQlsbGktPmxsaV9zYV9lbmFibGVkID0gMDsKKwkJbGxpLT5sbGlfZGVmX3N0cmlwZV9vZmZzZXQgPSAtMTsKIAl9IGVsc2UgewogCQltdXRleF9pbml0KCZsbGktPmxsaV9zaXplX211dGV4KTsKIAkJbGxpLT5sbGlfc3ltbGlua19uYW1lID0gTlVMTDsKIAkJaW5pdF9yd3NlbSgmbGxpLT5sbGlfdHJ1bmNfc2VtKTsKLQkJbXV0ZXhfaW5pdCgmbGxpLT5sbGlfd3JpdGVfbXV0ZXgpOworCQlyYW5nZV9sb2NrX3RyZWVfaW5pdCgmbGxpLT5sbGlfd3JpdGVfdHJlZSk7CiAJCWluaXRfcndzZW0oJmxsaS0+bGxpX2dsaW1wc2Vfc2VtKTsKIAkJbGxpLT5sbGlfZ2xpbXBzZV90aW1lID0gMDsKIAkJSU5JVF9MSVNUX0hFQUQoJmxsaS0+bGxpX2FnbF9saXN0KTsKQEAgLTg5Niw3ICs5NjEsOCBAQAogCXN0cnVjdCBsdXN0cmVfc2JfaW5mbyAqbHNpID0gczJsc2koc2IpOwogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7CiAJY2hhciAqcHJvZmlsZW5tID0gZ2V0X3Byb2ZpbGVfbmFtZShzYik7Ci0JaW50IGNjY19jb3VudCwgbmV4dCwgZm9yY2UgPSAxLCByYyA9IDA7CisJaW50IG5leHQsIGZvcmNlID0gMSwgcmMgPSAwOworCWxvbmcgY2NjX2NvdW50OwogCiAJQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6IHNiICVwIC0gJXNcbiIsIHNiLCBwcm9maWxlbm0pOwogCkBAIC05MTcsMTMgKzk4MywxMyBAQAogCQlzdHJ1Y3QgbF93YWl0X2luZm8gbHdpID0gTFdJX0lOVFIoTFdJX09OX1NJR05BTF9OT09QLCBOVUxMKTsKIAogCQlyYyA9IGxfd2FpdF9ldmVudChzYmktPmxsX2NhY2hlLT5jY2NfdW5zdGFibGVfd2FpdHEsCi0JCQkJICAhYXRvbWljX3JlYWQoJnNiaS0+bGxfY2FjaGUtPmNjY191bnN0YWJsZV9uciksCisJCQkJICAhYXRvbWljX2xvbmdfcmVhZCgmc2JpLT5sbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKSwKIAkJCQkgICZsd2kpOwogCX0KIAotCWNjY19jb3VudCA9IGF0b21pY19yZWFkKCZzYmktPmxsX2NhY2hlLT5jY2NfdW5zdGFibGVfbnIpOworCWNjY19jb3VudCA9IGF0b21pY19sb25nX3JlYWQoJnNiaS0+bGxfY2FjaGUtPmNjY191bnN0YWJsZV9ucik7CiAJaWYgKCFmb3JjZSAmJiByYyAhPSAtRUlOVFIpCi0JCUxBU1NFUlRGKCFjY2NfY291bnQsICJjb3VudDogJWlcbiIsIGNjY19jb3VudCk7CisJCUxBU1NFUlRGKCFjY2NfY291bnQsICJjb3VudDogJWxpXG4iLCBjY2NfY291bnQpOwogCiAJLyogV2UgbmVlZCB0byBzZXQgZm9yY2UgYmVmb3JlIHRoZSBsb3ZfZGlzY29ubmVjdCBpbgogCSAqIGx1c3RyZV9jb21tb25fcHV0X3N1cGVyLCBzaW5jZSBsX2QgY2xlYW5zIHVwIG9zYydzIGFzIHdlbGwuCkBAIC05OTEsNiArMTA1NywyMDYgQEAKIAlyZXR1cm4gaW5vZGU7CiB9CiAKK3N0YXRpYyB2b2lkIGxsX2Rpcl9jbGVhcl9sc21fbWQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKKworCUxBU1NFUlQoU19JU0RJUihpbm9kZS0+aV9tb2RlKSk7CisKKwlpZiAobGxpLT5sbGlfbHNtX21kKSB7CisJCWxtdl9mcmVlX21lbW1kKGxsaS0+bGxpX2xzbV9tZCk7CisJCWxsaS0+bGxpX2xzbV9tZCA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGlub2RlICpsbF9pZ2V0X2Fub25fZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAorCQkJCSAgICAgIHN0cnVjdCBsdXN0cmVfbWQgKm1kKQoreworCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7CisJc3RydWN0IG1kdF9ib2R5ICpib2R5ID0gbWQtPmJvZHk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbm9fdCBpbm87CisKKwlpbm8gPSBjbF9maWRfYnVpbGRfaW5vKGZpZCwgc2JpLT5sbF9mbGFncyAmIExMX1NCSV8zMkJJVF9BUEkpOworCWlub2RlID0gaWdldF9sb2NrZWQoc2IsIGlubyk7CisJaWYgKCFpbm9kZSkgeworCQlDRVJST1IoIiVzOiBmYWlsZWQgZ2V0IHNpbXBsZSBpbm9kZSAiREZJRCI6IHJjID0gLUVOT0VOVFxuIiwKKwkJICAgICAgIGxsX2dldF9mc25hbWUoc2IsIE5VTEwsIDApLCBQRklEKGZpZCkpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwl9CisKKwlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgeworCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKKwkJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG1kLT5sbXY7CisKKwkJaW5vZGUtPmlfbW9kZSA9IChpbm9kZS0+aV9tb2RlICYgflNfSUZNVCkgfAorCQkJCShib2R5LT5tYm9fbW9kZSAmIFNfSUZNVCk7CisJCUxBU1NFUlRGKFNfSVNESVIoaW5vZGUtPmlfbW9kZSksICJOb3Qgc2xhdmUgaW5vZGUgIkRGSUQiXG4iLAorCQkJIFBGSUQoZmlkKSk7CisKKwkJTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkgPSAwOworCQlMVElNRV9TKGlub2RlLT5pX2F0aW1lKSA9IDA7CisJCUxUSU1FX1MoaW5vZGUtPmlfY3RpbWUpID0gMDsKKwkJaW5vZGUtPmlfcmRldiA9IDA7CisKKwkJaW5vZGUtPmlfb3AgPSAmbGxfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZsbF9kaXJfb3BlcmF0aW9uczsKKwkJbGxpLT5sbGlfZmlkID0gKmZpZDsKKwkJbGxfbGxpX2luaXQobGxpKTsKKworCQlMQVNTRVJUKGxzbSk7CisJCS8qIG1hc3RlciBvYmplY3QgRklEICovCisJCWxsaS0+bGxpX3BmaWQgPSBib2R5LT5tYm9fZmlkMTsKKwkJQ0RFQlVHKERfSU5PREUsICJsbGkgJXAgc2xhdmUgIkRGSUQiIG1hc3RlciAiREZJRCJcbiIsCisJCSAgICAgICBsbGksIFBGSUQoZmlkKSwgUEZJRCgmbGxpLT5sbGlfcGZpZCkpOworCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwl9CisKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyBpbnQgbGxfaW5pdF9sc21fbWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGx1c3RyZV9tZCAqbWQpCit7CisJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG1kLT5sbXY7CisJc3RydWN0IGx1X2ZpZCAqZmlkOworCWludCBpOworCisJTEFTU0VSVChsc20pOworCS8qCisJICogWFhYIHNpZ2gsIHRoaXMgbHNtX3Jvb3QgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGJlIGluCisJICogTE1WIGxheWVyLCBidXQgaXQgbmVlZHMgbGxfaWdldCByaWdodCBub3csIHNvIHdlCisJICogcHV0IHRoaXMgaGVyZSByaWdodCBub3cuCisJICovCisJZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudDsgaSsrKSB7CisJCWZpZCA9ICZsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fZmlkOworCQlMQVNTRVJUKCFsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fcm9vdCk7CisJCS8qIFVuZm9ydHVuYXRlbHkgbGxfaWdldCB3aWxsIGNhbGwgbGxfdXBkYXRlX2lub2RlLAorCQkgKiB3aGVyZSB0aGUgaW5pdGlhbGl6YXRpb24gb2Ygc2xhdmUgaW5vZGUgaXMgc2xpZ2h0bHkKKwkJICogZGlmZmVyZW50LCBzbyBpdCByZXNldCBsc21fbWQgdG8gTlVMTCB0byBhdm9pZAorCQkgKiBpbml0aWFsaXppbmcgbHNtIGZvciBzbGF2ZSBpbm9kZS4KKwkJICovCisJCS8qIEZvciBtaWdyYXRpbmcgaW5vZGUsIG1hc3RlciBzdHJpcGUgYW5kIG1hc3RlciBvYmplY3Qgd2lsbAorCQkgKiBiZSBzYW1lLCBzbyB3ZSBvbmx5IG5lZWQgYXNzaWduIHRoaXMgaW5vZGUKKwkJICovCisJCWlmIChsc20tPmxzbV9tZF9oYXNoX3R5cGUgJiBMTVZfSEFTSF9GTEFHX01JR1JBVElPTiAmJiAhaSkKKwkJCWxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290ID0gaW5vZGU7CisJCWVsc2UKKwkJCWxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290ID0KKwkJCQlsbF9pZ2V0X2Fub25fZGlyKGlub2RlLT5pX3NiLCBmaWQsIG1kKTsKKwkJaWYgKElTX0VSUihsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fcm9vdCkpIHsKKwkJCWludCByYyA9IFBUUl9FUlIobHNtLT5sc21fbWRfb2luZm9baV0ubG1vX3Jvb3QpOworCisJCQlsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fcm9vdCA9IE5VTEw7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbGxpX2xzbV9tZF9lcShjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtX21kMSwKKwkJCQljb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtX21kMikKK3sKKwlyZXR1cm4gbHNtX21kMS0+bHNtX21kX21hZ2ljID09IGxzbV9tZDItPmxzbV9tZF9tYWdpYyAmJgorCSAgICAgICBsc21fbWQxLT5sc21fbWRfc3RyaXBlX2NvdW50ID09IGxzbV9tZDItPmxzbV9tZF9zdHJpcGVfY291bnQgJiYKKwkgICAgICAgbHNtX21kMS0+bHNtX21kX21hc3Rlcl9tZHRfaW5kZXggPT0KKwkJCWxzbV9tZDItPmxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4ICYmCisJICAgICAgIGxzbV9tZDEtPmxzbV9tZF9oYXNoX3R5cGUgPT0gbHNtX21kMi0+bHNtX21kX2hhc2hfdHlwZSAmJgorCSAgICAgICBsc21fbWQxLT5sc21fbWRfbGF5b3V0X3ZlcnNpb24gPT0KKwkJCWxzbV9tZDItPmxzbV9tZF9sYXlvdXRfdmVyc2lvbiAmJgorCSAgICAgICAhc3RyY21wKGxzbV9tZDEtPmxzbV9tZF9wb29sX25hbWUsCisJCSAgICAgICBsc21fbWQyLT5sc21fbWRfcG9vbF9uYW1lKTsKK30KKworc3RhdGljIGludCBsbF91cGRhdGVfbHNtX21kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsdXN0cmVfbWQgKm1kKQoreworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOworCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBtZC0+bG12OworCWludCByYzsKKworCUxBU1NFUlQoU19JU0RJUihpbm9kZS0+aV9tb2RlKSk7CisJQ0RFQlVHKERfSU5PREUsICJ1cGRhdGUgbHNtICVwIG9mICJERklEIlxuIiwgbGxpLT5sbGlfbHNtX21kLAorCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpKTsKKworCS8qIG5vIHN0cmlwZWQgaW5mb3JtYXRpb24gZnJvbSByZXF1ZXN0LiAqLworCWlmICghbHNtKSB7CisJCWlmICghbGxpLT5sbGlfbHNtX21kKSB7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChsbGktPmxsaV9sc21fbWQtPmxzbV9tZF9oYXNoX3R5cGUgJgorCQkJICAgTE1WX0hBU0hfRkxBR19NSUdSQVRJT04pIHsKKwkJCS8qCisJCQkgKiBtaWdyYXRpb24gaXMgZG9uZSwgdGhlIHRlbXBvcmF5IE1JR1JBVEUgbGF5b3V0IGhhcworCQkJICogYmVlbiByZW1vdmVkCisJCQkgKi8KKwkJCUNERUJVRyhEX0lOT0RFLCBERklEIiBmaW5pc2ggbWlncmF0aW9uLlxuIiwKKwkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpKTsKKwkJCWxtdl9mcmVlX21lbW1kKGxsaS0+bGxpX2xzbV9tZCk7CisJCQlsbGktPmxsaV9sc21fbWQgPSBOVUxMOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIGx1c3RyZV9tZCBmcm9tIHJlcSBkb2VzIG5vdCBpbmNsdWRlIHN0cmlwZUVBLAorCQkJICogc2VlIGxsX21kX3NldGF0dHIKKwkJCSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBzZXQgdGhlIGRpcmVjdG9yeSBsYXlvdXQgKi8KKwlpZiAoIWxsaS0+bGxpX2xzbV9tZCkgeworCQlyYyA9IGxsX2luaXRfbHNtX21kKGlub2RlLCBtZCk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlsbGktPmxsaV9sc21fbWQgPSBsc207CisJCS8qCisJCSAqIHNldCBsc21fbWQgdG8gTlVMTCwgc28gdGhlIGZvbGxvd2luZyBmcmVlIGx1c3RyZV9tZAorCQkgKiB3aWxsIG5vdCBmcmVlIHRoaXMgbHNtCisJCSAqLworCQltZC0+bG12ID0gTlVMTDsKKwkJQ0RFQlVHKERfSU5PREUsICJTZXQgbHNtICVwIG1hZ2ljICV4IHRvICJERklEIlxuIiwgbHNtLAorCQkgICAgICAgbHNtLT5sc21fbWRfbWFnaWMsIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDb21wYXJlIHRoZSBvbGQgYW5kIG5ldyBzdHJpcGUgaW5mb3JtYXRpb24gKi8KKwlpZiAoIWxzbV9tZF9lcShsbGktPmxsaV9sc21fbWQsIGxzbSkpIHsKKwkJc3RydWN0IGxtdl9zdHJpcGVfbWQgKm9sZF9sc20gPSBsbGktPmxsaV9sc21fbWQ7CisJCWludCBpZHg7CisKKwkJQ0VSUk9SKCIlczogaW5vZGUgIkRGSUQiKCVwKSdzIGxtdiBsYXlvdXQgbWlzbWF0Y2ggKCVwKS8oJXApIG1hZ2ljOjB4JXgvMHgleCBzdHJpcGUgY291bnQ6ICVkLyVkIG1hc3Rlcl9tZHQ6ICVkLyVkIGhhc2hfdHlwZToweCV4LzB4JXggbGF5b3V0OiAweCV4LzB4JXggcG9vbDolcy8lc1xuIiwKKwkJICAgICAgIGxsX2dldF9mc25hbWUoaW5vZGUtPmlfc2IsIE5VTEwsIDApLCBQRklEKCZsbGktPmxsaV9maWQpLAorCQkgICAgICAgaW5vZGUsIGxzbSwgb2xkX2xzbSwKKwkJICAgICAgIGxzbS0+bHNtX21kX21hZ2ljLCBvbGRfbHNtLT5sc21fbWRfbWFnaWMsCisJCSAgICAgICBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQsCisJCSAgICAgICBvbGRfbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50LAorCQkgICAgICAgbHNtLT5sc21fbWRfbWFzdGVyX21kdF9pbmRleCwKKwkJICAgICAgIG9sZF9sc20tPmxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4LAorCQkgICAgICAgbHNtLT5sc21fbWRfaGFzaF90eXBlLCBvbGRfbHNtLT5sc21fbWRfaGFzaF90eXBlLAorCQkgICAgICAgbHNtLT5sc21fbWRfbGF5b3V0X3ZlcnNpb24sCisJCSAgICAgICBvbGRfbHNtLT5sc21fbWRfbGF5b3V0X3ZlcnNpb24sCisJCSAgICAgICBsc20tPmxzbV9tZF9wb29sX25hbWUsCisJCSAgICAgICBvbGRfbHNtLT5sc21fbWRfcG9vbF9uYW1lKTsKKworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG9sZF9sc20tPmxzbV9tZF9zdHJpcGVfY291bnQ7IGlkeCsrKSB7CisJCQlDRVJST1IoIiVzOiBzdWIgRklEcyBpbiBvbGQgbHNtIGlkeCAlZCwgb2xkOiAiREZJRCJcbiIsCisJCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShpbm9kZS0+aV9zYiwgTlVMTCwgMCksIGlkeCwKKwkJCSAgICAgICBQRklEKCZvbGRfbHNtLT5sc21fbWRfb2luZm9baWR4XS5sbW9fZmlkKSk7CisJCX0KKworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudDsgaWR4KyspIHsKKwkJCUNFUlJPUigiJXM6IHN1YiBGSURzIGluIG5ldyBsc20gaWR4ICVkLCBuZXc6ICJERklEIlxuIiwKKwkJCSAgICAgICBsbF9nZXRfZnNuYW1lKGlub2RlLT5pX3NiLCBOVUxMLCAwKSwgaWR4LAorCQkJICAgICAgIFBGSUQoJmxzbS0+bHNtX21kX29pbmZvW2lkeF0ubG1vX2ZpZCkpOworCQl9CisKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHZvaWQgbGxfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKQEAgLTEwMzEsMTQgKzEyOTcsMTUgQEAKIAogI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKIAlpZiAobGxpLT5sbGlfcG9zaXhfYWNsKSB7Ci0JCUxBU1NFUlQoYXRvbWljX3JlYWQoJmxsaS0+bGxpX3Bvc2l4X2FjbC0+YV9yZWZjb3VudCkgPT0gMSk7CiAJCXBvc2l4X2FjbF9yZWxlYXNlKGxsaS0+bGxpX3Bvc2l4X2FjbCk7CiAJCWxsaS0+bGxpX3Bvc2l4X2FjbCA9IE5VTEw7CiAJfQogI2VuZGlmCiAJbGxpLT5sbGlfaW5vZGVfbWFnaWMgPSBMTElfSU5PREVfREVBRDsKIAotCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJbGxfZGlyX2NsZWFyX2xzbV9tZChpbm9kZSk7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgIWlzX2JhZF9pbm9kZShpbm9kZSkpCiAJCUxBU1NFUlQobGlzdF9lbXB0eSgmbGxpLT5sbGlfYWdsX2xpc3QpKTsKIAogCS8qCkBAIC0xMTAzLDEwICsxMzcwLDEwIEBACiAJb3BfZGF0YS0+b3BfYXR0ci5pYV92YWxpZCA9IGlhX3ZhbGlkOwogCiAJLyogRXh0cmFjdCBlcG9jaCBkYXRhIGlmIG9idGFpbmVkLiAqLwotCW9wX2RhdGEtPm9wX2hhbmRsZSA9IG1kLmJvZHktPmhhbmRsZTsKLQlvcF9kYXRhLT5vcF9pb2Vwb2NoID0gbWQuYm9keS0+aW9lcG9jaDsKKwlvcF9kYXRhLT5vcF9oYW5kbGUgPSBtZC5ib2R5LT5tYm9faGFuZGxlOworCW9wX2RhdGEtPm9wX2lvZXBvY2ggPSBtZC5ib2R5LT5tYm9faW9lcG9jaDsKIAotCWxsX3VwZGF0ZV9pbm9kZShpbm9kZSwgJm1kKTsKKwlyYyA9IGxsX3VwZGF0ZV9pbm9kZShpbm9kZSwgJm1kKTsKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOwogCiAJcmV0dXJuIHJjOwpAQCAtMTEzOCw4ICsxNDA1LDggQEAKIAkJcmMgPSBsbF9zb21fdXBkYXRlKGlub2RlLCBvcF9kYXRhKTsKIAllbHNlIGlmIChyYykgewogCQlDRVJST1IoIiVzOiBpbm9kZSAiREZJRCIgbWRjIHRydW5jYXRlIGZhaWxlZDogcmMgPSAlZFxuIiwKLQkJICAgICAgbGxfaTJzYmkoaW5vZGUpLT5sbF9tZF9leHAtPmV4cF9vYmQtPm9iZF9uYW1lLAotCQkgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCByYyk7CisJCSAgICAgICBsbF9pMnNiaShpbm9kZSktPmxsX21kX2V4cC0+ZXhwX29iZC0+b2JkX25hbWUsCisJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCByYyk7CiAJfQogCXJldHVybiByYzsKIH0KQEAgLTEzMzEsMTQgKzE1OTgsMTQgQEAKIHsKIAlpbnQgbW9kZSA9IGRfaW5vZGUoZGUpLT5pX21vZGU7CiAKLQlpZiAoKGF0dHItPmlhX3ZhbGlkICYgKEFUVFJfQ1RJTUV8QVRUUl9TSVpFfEFUVFJfTU9ERSkpID09Ci0JCQkgICAgICAoQVRUUl9DVElNRXxBVFRSX1NJWkV8QVRUUl9NT0RFKSkKKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgKEFUVFJfQ1RJTUUgfCBBVFRSX1NJWkUgfCBBVFRSX01PREUpKSA9PQorCQkJICAgICAgKEFUVFJfQ1RJTUUgfCBBVFRSX1NJWkUgfCBBVFRSX01PREUpKQogCQlhdHRyLT5pYV92YWxpZCB8PSBNRFNfT1BFTl9PV05FUk9WRVJSSURFOwogCi0JaWYgKCgoYXR0ci0+aWFfdmFsaWQgJiAoQVRUUl9NT0RFfEFUVFJfRk9SQ0V8QVRUUl9TSVpFKSkgPT0KLQkJCSAgICAgICAoQVRUUl9TSVpFfEFUVFJfTU9ERSkpICYmCisJaWYgKCgoYXR0ci0+aWFfdmFsaWQgJiAoQVRUUl9NT0RFIHwgQVRUUl9GT1JDRSB8IEFUVFJfU0laRSkpID09CisJCQkgICAgICAgKEFUVFJfU0laRSB8IEFUVFJfTU9ERSkpICYmCiAJICAgICgoKG1vZGUgJiBTX0lTVUlEKSAmJiAhKGF0dHItPmlhX21vZGUgJiBTX0lTVUlEKSkgfHwKLQkgICAgICgoKG1vZGUgJiAoU19JU0dJRHxTX0lYR1JQKSkgPT0gKFNfSVNHSUR8U19JWEdSUCkpICYmCisJICAgICAoKChtb2RlICYgKFNfSVNHSUQgfCBTX0lYR1JQKSkgPT0gKFNfSVNHSUQgfCBTX0lYR1JQKSkgJiYKIAkgICAgICAhKGF0dHItPmlhX21vZGUgJiBTX0lTR0lEKSkpKQogCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX0ZPUkNFOwogCkBAIC0xMzQ5LDcgKzE2MTYsNyBAQAogCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX0tJTExfU1VJRDsKIAogCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpICYmCi0JICAgICgobW9kZSAmIChTX0lTR0lEfFNfSVhHUlApKSA9PSAoU19JU0dJRHxTX0lYR1JQKSkgJiYKKwkgICAgKChtb2RlICYgKFNfSVNHSUQgfCBTX0lYR1JQKSkgPT0gKFNfSVNHSUQgfCBTX0lYR1JQKSkgJiYKIAkgICAgIShhdHRyLT5pYV9tb2RlICYgU19JU0dJRCkgJiYKIAkgICAgIShhdHRyLT5pYV92YWxpZCAmIEFUVFJfS0lMTF9TR0lEKSkKIAkJYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9LSUxMX1NHSUQ7CkBAIC0xNDY1LDE0ICsxNzMyLDE0IEBACiAJbXV0ZXhfdW5sb2NrKCZsbGktPmxsaV9zaXplX211dGV4KTsKIH0KIAotdm9pZCBsbF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGx1c3RyZV9tZCAqbWQpCitpbnQgbGxfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsdXN0cmVfbWQgKm1kKQogewogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwogCXN0cnVjdCBtZHRfYm9keSAqYm9keSA9IG1kLT5ib2R5OwogCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20gPSBtZC0+bHNtOwogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9pMnNiaShpbm9kZSk7CiAKLQlMQVNTRVJUKChsc20gIT0gTlVMTCkgPT0gKChib2R5LT52YWxpZCAmIE9CRF9NRF9GTEVBU0laRSkgIT0gMCkpOworCUxBU1NFUlQoKGxzbSAhPSBOVUxMKSA9PSAoKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTEVBU0laRSkgIT0gMCkpOwogCWlmIChsc20pIHsKIAkJaWYgKCFsbGktPmxsaV9oYXNfc21kICYmCiAJCSAgICAhKHNiaS0+bGxfZmxhZ3MgJiBMTF9TQklfTEFZT1VUX0xPQ0spKQpAQCAtMTQ4Myw4ICsxNzUwLDE2IEBACiAJCQlsbGktPmxsaV9tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7CiAJfQogCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW50IHJjOworCisJCXJjID0gbGxfdXBkYXRlX2xzbV9tZChpbm9kZSwgbWQpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCiAjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTEFDTCkgeworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxBQ0wpIHsKIAkJc3Bpbl9sb2NrKCZsbGktPmxsaV9sb2NrKTsKIAkJaWYgKGxsaS0+bGxpX3Bvc2l4X2FjbCkKIAkJCXBvc2l4X2FjbF9yZWxlYXNlKGxsaS0+bGxpX3Bvc2l4X2FjbCk7CkBAIC0xNDkyLDY1ICsxNzY3LDY3IEBACiAJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9sb2NrKTsKIAl9CiAjZW5kaWYKLQlpbm9kZS0+aV9pbm8gPSBjbF9maWRfYnVpbGRfaW5vKCZib2R5LT5maWQxLAorCWlub2RlLT5pX2lubyA9IGNsX2ZpZF9idWlsZF9pbm8oJmJvZHktPm1ib19maWQxLAogCQkJCQlzYmktPmxsX2ZsYWdzICYgTExfU0JJXzMyQklUX0FQSSk7Ci0JaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGNsX2ZpZF9idWlsZF9nZW4oJmJvZHktPmZpZDEpOworCWlub2RlLT5pX2dlbmVyYXRpb24gPSBjbF9maWRfYnVpbGRfZ2VuKCZib2R5LT5tYm9fZmlkMSk7CiAKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxBVElNRSkgewotCQlpZiAoYm9keS0+YXRpbWUgPiBMVElNRV9TKGlub2RlLT5pX2F0aW1lKSkKLQkJCUxUSU1FX1MoaW5vZGUtPmlfYXRpbWUpID0gYm9keS0+YXRpbWU7Ci0JCWxsaS0+bGxpX2F0aW1lID0gYm9keS0+YXRpbWU7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTEFUSU1FKSB7CisJCWlmIChib2R5LT5tYm9fYXRpbWUgPiBMVElNRV9TKGlub2RlLT5pX2F0aW1lKSkKKwkJCUxUSU1FX1MoaW5vZGUtPmlfYXRpbWUpID0gYm9keS0+bWJvX2F0aW1lOworCQlsbGktPmxsaV9hdGltZSA9IGJvZHktPm1ib19hdGltZTsKIAl9Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMTVRJTUUpIHsKLQkJaWYgKGJvZHktPm10aW1lID4gTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkpIHsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMTVRJTUUpIHsKKwkJaWYgKGJvZHktPm1ib19tdGltZSA+IExUSU1FX1MoaW5vZGUtPmlfbXRpbWUpKSB7CiAJCQlDREVCVUcoRF9JTk9ERSwgInNldHRpbmcgaW5vICVsdSBtdGltZSBmcm9tICVsdSB0byAlbGx1XG4iLAogCQkJICAgICAgIGlub2RlLT5pX2lubywgTFRJTUVfUyhpbm9kZS0+aV9tdGltZSksCi0JCQkgICAgICAgYm9keS0+bXRpbWUpOwotCQkJTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkgPSBib2R5LT5tdGltZTsKKwkJCSAgICAgICBib2R5LT5tYm9fbXRpbWUpOworCQkJTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkgPSBib2R5LT5tYm9fbXRpbWU7CiAJCX0KLQkJbGxpLT5sbGlfbXRpbWUgPSBib2R5LT5tdGltZTsKKwkJbGxpLT5sbGlfbXRpbWUgPSBib2R5LT5tYm9fbXRpbWU7CiAJfQotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTENUSU1FKSB7Ci0JCWlmIChib2R5LT5jdGltZSA+IExUSU1FX1MoaW5vZGUtPmlfY3RpbWUpKQotCQkJTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkgPSBib2R5LT5jdGltZTsKLQkJbGxpLT5sbGlfY3RpbWUgPSBib2R5LT5jdGltZTsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMQ1RJTUUpIHsKKwkJaWYgKGJvZHktPm1ib19jdGltZSA+IExUSU1FX1MoaW5vZGUtPmlfY3RpbWUpKQorCQkJTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkgPSBib2R5LT5tYm9fY3RpbWU7CisJCWxsaS0+bGxpX2N0aW1lID0gYm9keS0+bWJvX2N0aW1lOwogCX0KLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxNT0RFKQotCQlpbm9kZS0+aV9tb2RlID0gKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpfChib2R5LT5tb2RlICYgflNfSUZNVCk7Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMVFlQRSkKLQkJaW5vZGUtPmlfbW9kZSA9IChpbm9kZS0+aV9tb2RlICYgflNfSUZNVCl8KGJvZHktPm1vZGUgJiBTX0lGTVQpOworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxNT0RFKQorCQlpbm9kZS0+aV9tb2RlID0gKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHwKKwkJCQkoYm9keS0+bWJvX21vZGUgJiB+U19JRk1UKTsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMVFlQRSkKKwkJaW5vZGUtPmlfbW9kZSA9IChpbm9kZS0+aV9tb2RlICYgflNfSUZNVCkgfAorCQkJCShib2R5LT5tYm9fbW9kZSAmIFNfSUZNVCk7CiAJTEFTU0VSVChpbm9kZS0+aV9tb2RlICE9IDApOwogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlpbm9kZS0+aV9ibGtiaXRzID0gbWluKFBUTFJQQ19NQVhfQlJXX0JJVFMgKyAxLAogCQkJCSAgICAgICBMTF9NQVhfQkxLU0laRV9CSVRTKTsKIAllbHNlCiAJCWlub2RlLT5pX2Jsa2JpdHMgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxVSUQpCi0JCWlub2RlLT5pX3VpZCA9IG1ha2Vfa3VpZCgmaW5pdF91c2VyX25zLCBib2R5LT51aWQpOwotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTEdJRCkKLQkJaW5vZGUtPmlfZ2lkID0gbWFrZV9rZ2lkKCZpbml0X3VzZXJfbnMsIGJvZHktPmdpZCk7Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMRkxBR1MpCi0JCWlub2RlLT5pX2ZsYWdzID0gbGxfZXh0X3RvX2lub2RlX2ZsYWdzKGJvZHktPmZsYWdzKTsKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxOTElOSykKLQkJc2V0X25saW5rKGlub2RlLCBib2R5LT5ubGluayk7Ci0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMUkRFVikKLQkJaW5vZGUtPmlfcmRldiA9IG9sZF9kZWNvZGVfZGV2KGJvZHktPnJkZXYpOworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxVSUQpCisJCWlub2RlLT5pX3VpZCA9IG1ha2Vfa3VpZCgmaW5pdF91c2VyX25zLCBib2R5LT5tYm9fdWlkKTsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMR0lEKQorCQlpbm9kZS0+aV9naWQgPSBtYWtlX2tnaWQoJmluaXRfdXNlcl9ucywgYm9keS0+bWJvX2dpZCk7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTEZMQUdTKQorCQlpbm9kZS0+aV9mbGFncyA9IGxsX2V4dF90b19pbm9kZV9mbGFncyhib2R5LT5tYm9fZmxhZ3MpOworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxOTElOSykKKwkJc2V0X25saW5rKGlub2RlLCBib2R5LT5tYm9fbmxpbmspOworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxSREVWKQorCQlpbm9kZS0+aV9yZGV2ID0gb2xkX2RlY29kZV9kZXYoYm9keS0+bWJvX3JkZXYpOwogCi0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMSUQpIHsKKwlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMSUQpIHsKIAkJLyogRklEIHNob3VsZG4ndCBiZSBjaGFuZ2VkISAqLwogCQlpZiAoZmlkX2lzX3NhbmUoJmxsaS0+bGxpX2ZpZCkpIHsKLQkJCUxBU1NFUlRGKGx1X2ZpZF9lcSgmbGxpLT5sbGlfZmlkLCAmYm9keS0+ZmlkMSksCisJCQlMQVNTRVJURihsdV9maWRfZXEoJmxsaS0+bGxpX2ZpZCwgJmJvZHktPm1ib19maWQxKSwKIAkJCQkgIlRyeWluZyB0byBjaGFuZ2UgRklEICJERklEIiB0byB0aGUgIkRGSUQiLCBpbm9kZSAiREZJRCIoJXApXG4iLAotCQkJCSBQRklEKCZsbGktPmxsaV9maWQpLCBQRklEKCZib2R5LT5maWQxKSwKKwkJCQkgUEZJRCgmbGxpLT5sbGlfZmlkKSwgUEZJRCgmYm9keS0+bWJvX2ZpZDEpLAogCQkJCSBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSk7CiAJCX0gZWxzZSB7Ci0JCQlsbGktPmxsaV9maWQgPSBib2R5LT5maWQxOworCQkJbGxpLT5sbGlfZmlkID0gYm9keS0+bWJvX2ZpZDE7CiAJCX0KIAl9CiAKIAlMQVNTRVJUKGZpZF9zZXEoJmxsaS0+bGxpX2ZpZCkgIT0gMCk7CiAKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxTSVpFKSB7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTFNJWkUpIHsKIAkJaWYgKGV4cF9jb25uZWN0X3NvbShsbF9pMm1kZXhwKGlub2RlKSkgJiYKIAkJICAgIFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKIAkJCXN0cnVjdCBsdXN0cmVfaGFuZGxlIGxvY2toOwpAQCAtMTU3Nyw3ICsxODU0LDcgQEAKIAkJCQkJLyogVXNlIG9sZCBzaXplIGFzc2lnbm1lbnQgdG8gYXZvaWQKIAkJCQkJICogZGVhZGxvY2sgYnoxNDEzOCAmIGJ6MTQzMjYKIAkJCQkJICovCi0JCQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgYm9keS0+c2l6ZSk7CisJCQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgYm9keS0+bWJvX3NpemUpOwogCQkJCQlzcGluX2xvY2soJmxsaS0+bGxpX2xvY2spOwogCQkJCQlsbGktPmxsaV9mbGFncyB8PSBMTElGX01EU19TSVpFX0xPQ0s7CiAJCQkJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9sb2NrKTsKQEAgLTE1ODgsMjYgKzE4NjUsMjkgQEAKIAkJCS8qIFVzZSBvbGQgc2l6ZSBhc3NpZ25tZW50IHRvIGF2b2lkCiAJCQkgKiBkZWFkbG9jayBiejE0MTM4ICYgYnoxNDMyNgogCQkJICovCi0JCQlpX3NpemVfd3JpdGUoaW5vZGUsIGJvZHktPnNpemUpOworCQkJaV9zaXplX3dyaXRlKGlub2RlLCBib2R5LT5tYm9fc2l6ZSk7CiAKIAkJCUNERUJVRyhEX1ZGU1RSQUNFLCAiaW5vZGU9JWx1LCB1cGRhdGluZyBpX3NpemUgJWxsdVxuIiwKLQkJCSAgICAgICBpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpYm9keS0+c2l6ZSk7CisJCQkgICAgICAgaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZyBsb25nKWJvZHktPm1ib19zaXplKTsKIAkJfQogCi0JCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTEJMT0NLUykKLQkJCWlub2RlLT5pX2Jsb2NrcyA9IGJvZHktPmJsb2NrczsKKwkJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTEJMT0NLUykKKwkJCWlub2RlLT5pX2Jsb2NrcyA9IGJvZHktPm1ib19ibG9ja3M7CiAJfQogCi0JaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX1RTVEFURSkgewotCQlpZiAoYm9keS0+dF9zdGF0ZSAmIE1TX1JFU1RPUkUpCisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9UU1RBVEUpIHsKKwkJaWYgKGJvZHktPm1ib190X3N0YXRlICYgTVNfUkVTVE9SRSkKIAkJCWxsaS0+bGxpX2ZsYWdzIHw9IExMSUZfRklMRV9SRVNUT1JJTkc7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbGxfcmVhZF9pbm9kZTIoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQoraW50IGxsX3JlYWRfaW5vZGUyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKIHsKIAlzdHJ1Y3QgbHVzdHJlX21kICptZCA9IG9wYXF1ZTsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKKwlpbnQgcmM7CiAKIAlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDppbm9kZT0iREZJRCIoJXApXG4iLAogCSAgICAgICBQRklEKCZsbGktPmxsaV9maWQpLCBpbm9kZSk7CkBAIC0xNjIzLDcgKzE5MDMsOSBAQAogCUxUSU1FX1MoaW5vZGUtPmlfYXRpbWUpID0gMDsKIAlMVElNRV9TKGlub2RlLT5pX2N0aW1lKSA9IDA7CiAJaW5vZGUtPmlfcmRldiA9IDA7Ci0JbGxfdXBkYXRlX2lub2RlKGlub2RlLCBtZCk7CisJcmMgPSBsbF91cGRhdGVfaW5vZGUoaW5vZGUsIG1kKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAogCS8qIE9JREVCVUcoaW5vZGUpOyAqLwogCkBAIC0xNjQ0LDYgKzE5MjYsOCBAQAogCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCiAJCQkJICAgaW5vZGUtPmlfcmRldik7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgbGxfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCkBAIC0xNjU1LDIwICsxOTM5LDEzIEBACiAJCSAqIG9zY19leHRlbnQgaW1wbGVtZW50YXRpb24gYXQgTFUtMTAzMC4KIAkJICovCiAJCWNsX3N5bmNfZmlsZV9yYW5nZShpbm9kZSwgMCwgT0JEX09CSkVDVF9FT0YsCi0JCQkJICAgQ0xfRlNZTkNfRElTQ0FSRCwgMSk7CisJCQkJICAgQ0xfRlNZTkNfTE9DQUwsIDEpOwogCiAJdHJ1bmNhdGVfaW5vZGVfcGFnZXNfZmluYWwoJmlub2RlLT5pX2RhdGEpOwogCi0JLyogV29ya2Fyb3VuZCBmb3IgTFUtMTE4ICovCi0JaWYgKGlub2RlLT5pX2RhdGEubnJwYWdlcykgewotCQlzcGluX2xvY2tfaXJxKCZpbm9kZS0+aV9kYXRhLnRyZWVfbG9jayk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmaW5vZGUtPmlfZGF0YS50cmVlX2xvY2spOwotCQlMQVNTRVJURihpbm9kZS0+aV9kYXRhLm5ycGFnZXMgPT0gMCwKLQkJCSAiaW5vZGU9IkRGSUQiKCVwKSBucnBhZ2VzPSVsdSwgc2VlIGh0dHA6Ly9qaXJhLndoYW1jbG91ZC5jb20vYnJvd3NlL0xVLTExOFxuIiwKLQkJCSBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwKLQkJCSBpbm9kZS0+aV9kYXRhLm5ycGFnZXMpOwotCX0KLQkvKiBXb3JrYXJvdW5kIGVuZCAqLworCUxBU1NFUlRGKCFpbm9kZS0+aV9kYXRhLm5ycGFnZXMsCisJCSAiaW5vZGU9IiBERklEICIoJXApIG5ycGFnZXM9JWx1LCBzZWUgaHR0cDovL2ppcmEud2hhbWNsb3VkLmNvbS9icm93c2UvTFUtMTE4XG4iLAorCQkgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUsIGlub2RlLT5pX2RhdGEubnJwYWdlcyk7CiAKIAlsbF9jbGVhcl9pbm9kZShpbm9kZSk7CiAJY2xlYXJfaW5vZGUoaW5vZGUpOwpAQCAtMTcwNCw3ICsxOTgxLDcgQEAKIAogCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKIAotCQlmbGFncyA9IGJvZHktPmZsYWdzOworCQlmbGFncyA9IGJvZHktPm1ib19mbGFnczsKIAogCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CiAKQEAgLTE4ODYsOSArMjE2Myw5IEBACiAJaWYgKCFvcF9kYXRhKQogCQlyZXR1cm47CiAKLQlvcF9kYXRhLT5vcF9maWQxID0gYm9keS0+ZmlkMTsKLQlvcF9kYXRhLT5vcF9pb2Vwb2NoID0gYm9keS0+aW9lcG9jaDsKLQlvcF9kYXRhLT5vcF9oYW5kbGUgPSBib2R5LT5oYW5kbGU7CisJb3BfZGF0YS0+b3BfZmlkMSA9IGJvZHktPm1ib19maWQxOworCW9wX2RhdGEtPm9wX2lvZXBvY2ggPSBib2R5LT5tYm9faW9lcG9jaDsKKwlvcF9kYXRhLT5vcF9oYW5kbGUgPSBib2R5LT5tYm9faGFuZGxlOwogCW9wX2RhdGEtPm9wX21vZF90aW1lID0gZ2V0X3NlY29uZHMoKTsKIAltZF9jbG9zZShleHAsIG9wX2RhdGEsIE5VTEwsICZjbG9zZV9yZXEpOwogCXB0bHJwY19yZXFfZmluaXNoZWQoY2xvc2VfcmVxKTsKQEAgLTE5MTAsNyArMjE4Nyw5IEBACiAJCWdvdG8gY2xlYW51cDsKIAogCWlmICgqaW5vZGUpIHsKLQkJbGxfdXBkYXRlX2lub2RlKCppbm9kZSwgJm1kKTsKKwkJcmMgPSBsbF91cGRhdGVfaW5vZGUoKmlub2RlLCAmbWQpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKIAl9IGVsc2UgewogCQlMQVNTRVJUKHNiKTsKIApAQCAtMTkxOCwxOCArMjE5NywxOCBAQAogCQkgKiBBdCB0aGlzIHBvaW50IHNlcnZlciByZXR1cm5zIHRvIGNsaWVudCdzIHNhbWUgZmlkIGFzIGNsaWVudAogCQkgKiBnZW5lcmF0ZWQgZm9yIGNyZWF0aW5nLiBTbyB1c2luZyAtPmZpZDEgaXMgb2theSBoZXJlLgogCQkgKi8KLQkJaWYgKCFmaWRfaXNfc2FuZSgmbWQuYm9keS0+ZmlkMSkpIHsKKwkJaWYgKCFmaWRfaXNfc2FuZSgmbWQuYm9keS0+bWJvX2ZpZDEpKSB7CiAJCQlDRVJST1IoIiVzOiBGaWQgaXMgaW5zYW5lICIgREZJRCAiXG4iLAogCQkJICAgICAgIGxsX2dldF9mc25hbWUoc2IsIE5VTEwsIDApLAotCQkJICAgICAgIFBGSUQoJm1kLmJvZHktPmZpZDEpKTsKKwkJCSAgICAgICBQRklEKCZtZC5ib2R5LT5tYm9fZmlkMSkpOwogCQkJcmMgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQkqaW5vZGUgPSBsbF9pZ2V0KHNiLCBjbF9maWRfYnVpbGRfaW5vKCZtZC5ib2R5LT5maWQxLAorCQkqaW5vZGUgPSBsbF9pZ2V0KHNiLCBjbF9maWRfYnVpbGRfaW5vKCZtZC5ib2R5LT5tYm9fZmlkMSwKIAkJCQkJICAgICBzYmktPmxsX2ZsYWdzICYgTExfU0JJXzMyQklUX0FQSSksCiAJCQkJICZtZCk7Ci0JCWlmICghKmlub2RlKSB7CisJCWlmIChJU19FUlIoKmlub2RlKSkgewogI2lmZGVmIENPTkZJR19GU19QT1NJWF9BQ0wKIAkJCWlmIChtZC5wb3NpeF9hY2wpIHsKIAkJCQlwb3NpeF9hY2xfcmVsZWFzZShtZC5wb3NpeF9hY2wpOwpAQCAtMjA3NSwxMSArMjM1NCwyMCBAQAogLyogdGhpcyBmdW5jdGlvbiBwcmVwYXJlcyBtZF9vcF9kYXRhIGhpbnQgZm9yIHBhc3Npbmcgb3QgZG93biB0byBNRCBzdGFjay4gKi8KIHN0cnVjdCBtZF9vcF9kYXRhICpsbF9wcmVwX21kX29wX2RhdGEoc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCiAJCQkJICAgICAgc3RydWN0IGlub2RlICppMSwgc3RydWN0IGlub2RlICppMiwKLQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKLQkJCQkgICAgICBpbnQgbW9kZSwgX191MzIgb3BjLCB2b2lkICpkYXRhKQorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAorCQkJCSAgICAgIHUzMiBtb2RlLCBfX3UzMiBvcGMsIHZvaWQgKmRhdGEpCiB7Ci0JaWYgKG5hbWVsZW4gPiBsbF9pMnNiaShpMSktPmxsX25hbWVsZW4pCi0JCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCWlmICghbmFtZSkgeworCQkvKiBEbyBub3QgcmV1c2UgbmFtZWxlbiBmb3Igc29tZXRoaW5nIGVsc2UuICovCisJCWlmIChuYW1lbGVuKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfSBlbHNlIHsKKwkJaWYgKG5hbWVsZW4gPiBsbF9pMnNiaShpMSktPmxsX25hbWVsZW4pCisJCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKworCQlpZiAoIWx1X25hbWVfaXNfdmFsaWRfMihuYW1lLCBuYW1lbGVuKSkKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KIAogCWlmICghb3BfZGF0YSkKIAkJb3BfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpvcF9kYXRhKSwgR0ZQX05PRlMpOwpAQCAtMjA4OSwxMSArMjM3NywyNiBAQAogCiAJbGxfaTJnaWRzKG9wX2RhdGEtPm9wX3N1cHBnaWRzLCBpMSwgaTIpOwogCW9wX2RhdGEtPm9wX2ZpZDEgPSAqbGxfaW5vZGUyZmlkKGkxKTsKKwlvcF9kYXRhLT5vcF9kZWZhdWx0X3N0cmlwZV9vZmZzZXQgPSAtMTsKKwlpZiAoU19JU0RJUihpMS0+aV9tb2RlKSkgeworCQlvcF9kYXRhLT5vcF9tZWExID0gbGxfaTJpbmZvKGkxKS0+bGxpX2xzbV9tZDsKKwkJb3BfZGF0YS0+b3BfZGVmYXVsdF9zdHJpcGVfb2Zmc2V0ID0KKwkJCWxsX2kyaW5mbyhpMSktPmxsaV9kZWZfc3RyaXBlX29mZnNldDsKKwl9CiAKLQlpZiAoaTIpCisJaWYgKGkyKSB7CiAJCW9wX2RhdGEtPm9wX2ZpZDIgPSAqbGxfaW5vZGUyZmlkKGkyKTsKLQllbHNlCisJCWlmIChTX0lTRElSKGkyLT5pX21vZGUpKQorCQkJb3BfZGF0YS0+b3BfbWVhMiA9IGxsX2kyaW5mbyhpMiktPmxsaV9sc21fbWQ7CisJfSBlbHNlIHsKIAkJZmlkX3plcm8oJm9wX2RhdGEtPm9wX2ZpZDIpOworCX0KKworCWlmIChsbF9pMnNiaShpMSktPmxsX2ZsYWdzICYgTExfU0JJXzY0QklUX0hBU0gpCisJCW9wX2RhdGEtPm9wX2NsaV9mbGFncyB8PSBDTElfSEFTSDY0OworCisJaWYgKGxsX25lZWRfMzJiaXRfYXBpKGxsX2kyc2JpKGkxKSkpCisJCW9wX2RhdGEtPm9wX2NsaV9mbGFncyB8PSBDTElfQVBJMzI7CiAKIAlvcF9kYXRhLT5vcF9uYW1lID0gbmFtZTsKIAlvcF9kYXRhLT5vcF9uYW1lbGVuID0gbmFtZWxlbjsKQEAgLTIxMDUsMjYgKzI0MDgsMTIgQEAKIAlvcF9kYXRhLT5vcF9iaWFzID0gMDsKIAlvcF9kYXRhLT5vcF9jbGlfZmxhZ3MgPSAwOwogCWlmICgob3BjID09IExVU1RSRV9PUENfQ1JFQVRFKSAmJiBuYW1lICYmCi0JICAgIGZpbGVuYW1lX2lzX3ZvbGF0aWxlKG5hbWUsIG5hbWVsZW4sIE5VTEwpKQorCSAgICBmaWxlbmFtZV9pc192b2xhdGlsZShuYW1lLCBuYW1lbGVuLCAmb3BfZGF0YS0+b3BfbWRzKSkKIAkJb3BfZGF0YS0+b3BfYmlhcyB8PSBNRFNfQ1JFQVRFX1ZPTEFUSUxFOwotCW9wX2RhdGEtPm9wX29wYyA9IG9wYzsKLQlvcF9kYXRhLT5vcF9tZHMgPSAwOworCWVsc2UKKwkJb3BfZGF0YS0+b3BfbWRzID0gMDsKIAlvcF9kYXRhLT5vcF9kYXRhID0gZGF0YTsKIAotCS8qIElmIHRoZSBmaWxlIGlzIGJlaW5nIG9wZW5lZCBhZnRlciBta25vZCgpIChub3JtYWxseSBkdWUgdG8gTkZTKQotCSAqIHRyeSB0byB1c2UgdGhlIGRlZmF1bHQgc3RyaXBlIGRhdGEgZnJvbSBwYXJlbnQgZGlyZWN0b3J5IGZvcgotCSAqIGFsbG9jYXRpbmcgT1NUIG9iamVjdHMuICBUcnkgdG8gcGFzcyB0aGUgcGFyZW50IEZJRCB0byBNRFMuCi0JICovCi0JaWYgKG9wYyA9PSBMVVNUUkVfT1BDX0NSRUFURSAmJiBpMSA9PSBpMiAmJiBTX0lTUkVHKGkyLT5pX21vZGUpICYmCi0JICAgICFsbF9pMmluZm8oaTIpLT5sbGlfaGFzX3NtZCkgewotCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGkyKTsKLQotCQlzcGluX2xvY2soJmxsaS0+bGxpX2xvY2spOwotCQlpZiAobGlrZWx5KCFsbGktPmxsaV9oYXNfc21kICYmICFmaWRfaXNfemVybygmbGxpLT5sbGlfcGZpZCkpKQotCQkJb3BfZGF0YS0+b3BfZmlkMSA9IGxsaS0+bGxpX3BmaWQ7Ci0JCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9sb2NrKTsKLQl9Ci0KIAkvKiBXaGVuIGNhbGxlZCBieSBsbF9zZXRhdHRyX3JhdywgZmlsZSBpcyBpMS4gKi8KIAlpZiAobGxfaTJpbmZvKGkxKS0+bGxpX2ZsYWdzICYgTExJRl9EQVRBX01PRElGSUVEKQogCQlvcF9kYXRhLT5vcF9iaWFzIHw9IE1EU19EQVRBX01PRElGSUVEOwpAQCAtMjI1MSwzICsyNTQwLDE5NyBAQAogCWlmIChidWYpCiAJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWYpOwogfQorCitzc2l6ZV90IGxsX2NvcHlfdXNlcl9tZChjb25zdCBzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICptZCwKKwkJCXN0cnVjdCBsb3ZfdXNlcl9tZCAqKmtidWYpCit7CisJc3RydWN0IGxvdl91c2VyX21kIGx1bTsKKwlzc2l6ZV90IGx1bV9zaXplOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZsdW0sIG1kLCBzaXplb2YobHVtKSkpIHsKKwkJbHVtX3NpemUgPSAtRUZBVUxUOworCQlnb3RvIG5vX2tidWY7CisJfQorCisJbHVtX3NpemUgPSBsbF9sb3ZfdXNlcl9tZF9zaXplKCZsdW0pOworCWlmIChsdW1fc2l6ZSA8IDApCisJCWdvdG8gbm9fa2J1ZjsKKworCSprYnVmID0ga3phbGxvYyhsdW1fc2l6ZSwgR0ZQX05PRlMpOworCWlmICghKmtidWYpIHsKKwkJbHVtX3NpemUgPSAtRU5PTUVNOworCQlnb3RvIG5vX2tidWY7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKCprYnVmLCBtZCwgbHVtX3NpemUpICE9IDApIHsKKwkJa2ZyZWUoKmtidWYpOworCQkqa2J1ZiA9IE5VTEw7CisJCWx1bV9zaXplID0gLUVGQVVMVDsKKwl9Citub19rYnVmOgorCXJldHVybiBsdW1fc2l6ZTsKK30KKworLyoKKyAqIENvbXB1dGUgbGxpdGUgcm9vdCBzcXVhc2ggc3RhdGUgYWZ0ZXIgYSBjaGFuZ2Ugb2Ygcm9vdCBzcXVhc2gKKyAqIGNvbmZpZ3VyYXRpb24gc2V0dGluZyBvciBhZGQvcmVtb3ZlIG9mIGEgbG5ldCBuaWQKKyAqLwordm9pZCBsbF9jb21wdXRlX3Jvb3RzcXVhc2hfc3RhdGUoc3RydWN0IGxsX3NiX2luZm8gKnNiaSkKK3sKKwlzdHJ1Y3Qgcm9vdF9zcXVhc2hfaW5mbyAqc3F1YXNoID0gJnNiaS0+bGxfc3F1YXNoOworCWxuZXRfcHJvY2Vzc19pZF90IGlkOworCWJvb2wgbWF0Y2hlZDsKKwlpbnQgaTsKKworCS8qIFVwZGF0ZSBub3Jvb3RzcXVhc2ggZmxhZyAqLworCWRvd25fd3JpdGUoJnNxdWFzaC0+cnNpX3NlbSk7CisJaWYgKGxpc3RfZW1wdHkoJnNxdWFzaC0+cnNpX25vc3F1YXNoX25pZHMpKSB7CisJCXNiaS0+bGxfZmxhZ3MgJj0gfkxMX1NCSV9OT1JPT1RTUVVBU0g7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRG8gbm90IGFwcGx5IHJvb3Qgc3F1YXNoIGFzIHNvb24gYXMgb25lIG9mIG91ciBOSURzIGlzCisJCSAqIGluIHRoZSBub3NxdWFzaF9uaWRzIGxpc3QKKwkJICovCisJCW1hdGNoZWQgPSBmYWxzZTsKKwkJaSA9IDA7CisKKwkJd2hpbGUgKExOZXRHZXRJZChpKyssICZpZCkgIT0gLUVOT0VOVCkgeworCQkJaWYgKExORVRfTkVUVFlQKExORVRfTklETkVUKGlkLm5pZCkpID09IExPTE5EKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNmc19tYXRjaF9uaWQoaWQubmlkLCAmc3F1YXNoLT5yc2lfbm9zcXVhc2hfbmlkcykpIHsKKwkJCQltYXRjaGVkID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAobWF0Y2hlZCkKKwkJCXNiaS0+bGxfZmxhZ3MgfD0gTExfU0JJX05PUk9PVFNRVUFTSDsKKwkJZWxzZQorCQkJc2JpLT5sbF9mbGFncyAmPSB+TExfU0JJX05PUk9PVFNRVUFTSDsKKwl9CisJdXBfd3JpdGUoJnNxdWFzaC0+cnNpX3NlbSk7Cit9CisKKy8qKgorICogUGFyc2UgbGlua2VhIGNvbnRlbnQgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIGhhcmRsaW5rCisgKgorICogXHBhcmFtW2luXQlsZGF0YQkJLSBJbml0aWFsaXplZCBsaW5rZWEgZGF0YQorICogXHBhcmFtW2luXQlsaW5rbm8JCS0gTGluayBpZGVudGlmaWVyCisgKiBccGFyYW1bb3V0XQlwYXJlbnRfZmlkCS0gVGhlIGVudHJ5J3MgcGFyZW50IEZJRAorICogXHBhcmFtW2luXQlzaXplCQktIEVudHJ5IG5hbWUgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogXHJldHZhbCAwIG9uIHN1Y2Nlc3MKKyAqIFxyZXR2YWwgQXBwcm9wcmlhdGUgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgbGxfbGlua2VhX2RlY29kZShzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhLCB1bnNpZ25lZCBpbnQgbGlua25vLAorCQkJICAgIHN0cnVjdCBsdV9maWQgKnBhcmVudF9maWQsIHN0cnVjdCBsdV9uYW1lICpsbikKK3sKKwl1bnNpZ25lZCBpbnQgaWR4OworCWludCByYzsKKworCXJjID0gbGlua2VhX2luaXQobGRhdGEpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmIChsaW5rbm8gPj0gbGRhdGEtPmxkX2xlaC0+bGVoX3JlY2NvdW50KQorCQkvKiBiZXlvbmQgbGFzdCBsaW5rICovCisJCXJldHVybiAtRU5PREFUQTsKKworCWxpbmtlYV9maXJzdF9lbnRyeShsZGF0YSk7CisJZm9yIChpZHggPSAwOyBsZGF0YS0+bGRfbGVlOyBpZHgrKykgeworCQlsaW5rZWFfZW50cnlfdW5wYWNrKGxkYXRhLT5sZF9sZWUsICZsZGF0YS0+bGRfcmVjbGVuLCBsbiwKKwkJCQkgICAgcGFyZW50X2ZpZCk7CisJCWlmIChpZHggPT0gbGlua25vKQorCQkJYnJlYWs7CisKKwkJbGlua2VhX25leHRfZW50cnkobGRhdGEpOworCX0KKworCWlmIChpZHggPCBsaW5rbm8pCisJCXJldHVybiAtRU5PREFUQTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIEdldCBwYXJlbnQgRklEIGFuZCBuYW1lIG9mIGFuIGlkZW50aWZpZWQgbGluay4gT3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBmb3IKKyAqIGEgZ2l2ZW4gbGluayBudW1iZXIsIGxldHRpbmcgdGhlIGNhbGxlciBpdGVyYXRlIG92ZXIgbGlua25vIHRvIGxpc3Qgb25lIG9yCisgKiBhbGwgbGlua3Mgb2YgYW4gZW50cnkuCisgKgorICogXHBhcmFtW2luXQkgIGZpbGUJLSBGaWxlIGRlc2NyaXB0b3IgYWdhaW5zdCB3aGljaCB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24KKyAqIFxwYXJhbVtpbixvdXRdIGFyZwktIFVzZXItZmlsbGVkIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBsaW5rbm8gdG8gb3BlcmF0ZQorICoJCQkgIG9uIGFuZCB0aGUgYXZhaWxhYmxlIHNpemUuIEl0IGlzIGV2ZW50dWFsbHkgZmlsbGVkIHdpdGgKKyAqCQkJICB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uIG9yIGxlZnQgdW50b3VjaGVkIG9uIGVycm9yCisgKgorICogXHJldHZhbCAtIDAgb24gc3VjY2VzcworICogXHJldHZhbCAtIEFwcHJvcHJpYXRlIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgbGxfZ2V0cGFyZW50KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZ2V0cGFyZW50IF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpOworCXN0cnVjdCBsaW5rZWFfZGF0YSAqbGRhdGE7CisJc3RydWN0IGx1X2ZpZCBwYXJlbnRfZmlkOworCXN0cnVjdCBsdV9idWYgYnVmID0geworCQkubGJfYnVmID0gTlVMTCwKKwkJLmxiX2xlbiA9IDAKKwl9OworCXN0cnVjdCBsdV9uYW1lIGxuOworCXUzMiBuYW1lX3NpemU7CisJdTMyIGxpbmtubzsKKwlpbnQgcmM7CisKKwlpZiAoIWNhcGFibGUoQ0ZTX0NBUF9EQUNfUkVBRF9TRUFSQ0gpICYmCisJICAgICEobGxfaTJzYmkoaW5vZGUpLT5sbF9mbGFncyAmIExMX1NCSV9VU0VSX0ZJRDJQQVRIKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChnZXRfdXNlcihuYW1lX3NpemUsICZhcmctPmdwX25hbWVfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKGxpbmtubywgJmFyZy0+Z3BfbGlua25vKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobmFtZV9zaXplID4gUEFUSF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJbGRhdGEgPSBremFsbG9jKHNpemVvZigqbGRhdGEpLCBHRlBfTk9GUyk7CisJaWYgKCFsZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyYyA9IGxpbmtlYV9kYXRhX25ldyhsZGF0YSwgJmJ1Zik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBsZGF0YV9mcmVlOworCisJcmMgPSBsbF94YXR0cl9saXN0KGlub2RlLCBYQVRUUl9OQU1FX0xJTkssIFhBVFRSX1RSVVNURURfVCwgYnVmLmxiX2J1ZiwKKwkJCSAgIGJ1Zi5sYl9sZW4sIE9CRF9NRF9GTFhBVFRSKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGxiX2ZyZWU7CisKKwlyYyA9IGxsX2xpbmtlYV9kZWNvZGUobGRhdGEsIGxpbmtubywgJnBhcmVudF9maWQsICZsbik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBsYl9mcmVlOworCisJaWYgKGxuLmxuX25hbWVsZW4gPj0gbmFtZV9zaXplKSB7CisJCXJjID0gLUVPVkVSRkxPVzsKKwkJZ290byBsYl9mcmVlOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIoJmFyZy0+Z3BfZmlkLCAmcGFyZW50X2ZpZCwgc2l6ZW9mKGFyZy0+Z3BfZmlkKSkpIHsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIGxiX2ZyZWU7CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcigmYXJnLT5ncF9uYW1lLCBsbi5sbl9uYW1lLCBsbi5sbl9uYW1lbGVuKSkgeworCQlyYyA9IC1FRkFVTFQ7CisJCWdvdG8gbGJfZnJlZTsKKwl9CisKKwlpZiAocHV0X3VzZXIoJ1wwJywgYXJnLT5ncF9uYW1lICsgbG4ubG5fbmFtZWxlbikpIHsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIGxiX2ZyZWU7CisJfQorCitsYl9mcmVlOgorCWx1X2J1Zl9mcmVlKCZidWYpOworbGRhdGFfZnJlZToKKwlrZnJlZShsZGF0YSk7CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbW1hcC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbW1hcC5jCmluZGV4IDY2ZWU1ZGIuLjQzNjY5MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX21tYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9tbWFwLmMKQEAgLTQzLDkgKzQzLDcgQEAKIAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9saW51eC9sdXN0cmVfY29tcGF0MjUuaCIKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBsbF9maWxlX3ZtX29wczsKIApAQCAtMTI2LDcgKzEyNCw3IEBACiAKIAlmaW8gPSAmaW8tPnUuY2lfZmF1bHQ7CiAJZmlvLT5mdF9pbmRleCAgICAgID0gaW5kZXg7Ci0JZmlvLT5mdF9leGVjdXRhYmxlID0gdm1hLT52bV9mbGFncyZWTV9FWEVDOworCWZpby0+ZnRfZXhlY3V0YWJsZSA9IHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDOwogCiAJLyoKIAkgKiBkaXNhYmxlIFZNX1NFUV9SRUFEIGFuZCB1c2UgVk1fUkFORF9SRUFEIHRvIG1ha2Ugc3VyZSB0aGF0CkBAIC0xMzQsNyArMTMyLDcgQEAKIAkgKiBmaWxlbWFwX25vcGFnZS4gd2UgZG8gb3VyIHJlYWRhaGVhZCBpbiBsbF9yZWFkcGFnZS4KIAkgKi8KIAlpZiAocmFfZmxhZ3MpCi0JCSpyYV9mbGFncyA9IHZtYS0+dm1fZmxhZ3MgJiAoVk1fUkFORF9SRUFEfFZNX1NFUV9SRUFEKTsKKwkJKnJhX2ZsYWdzID0gdm1hLT52bV9mbGFncyAmIChWTV9SQU5EX1JFQUQgfCBWTV9TRVFfUkVBRCk7CiAJdm1hLT52bV9mbGFncyAmPSB+Vk1fU0VRX1JFQUQ7CiAJdm1hLT52bV9mbGFncyB8PSBWTV9SQU5EX1JFQUQ7CiAKQEAgLTQyOSw3ICs0MjcsNiBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgICAgPSBmaWxlX2lub2RlKHZtYS0+dm1fZmlsZSk7CiAJc3RydWN0IHZ2cF9vYmplY3QgKnZvYiA9IGNsX2lub2RlMnZ2cChpbm9kZSk7CiAKLQlMQVNTRVJUKHZtYS0+dm1fZmlsZSk7CiAJTEFTU0VSVChhdG9taWNfcmVhZCgmdm9iLT52b2JfbW1hcF9jbnQpID49IDApOwogCWF0b21pY19pbmMoJnZvYi0+dm9iX21tYXBfY250KTsKIH0KQEAgLTQ0Miw3ICs0MzksNiBAQAogCXN0cnVjdCBpbm9kZSAgICAgICppbm9kZSA9IGZpbGVfaW5vZGUodm1hLT52bV9maWxlKTsKIAlzdHJ1Y3QgdnZwX29iamVjdCAqdm9iICAgPSBjbF9pbm9kZTJ2dnAoaW5vZGUpOwogCi0JTEFTU0VSVCh2bWEtPnZtX2ZpbGUpOwogCWF0b21pY19kZWMoJnZvYi0+dm9iX21tYXBfY250KTsKIAlMQVNTRVJUKGF0b21pY19yZWFkKCZ2b2ItPnZvYl9tbWFwX2NudCkgPj0gMCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9uZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX25mcy5jCmluZGV4IDY1OTcyYzguLjcwOTIzMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX25mcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX25mcy5jCkBAIC0zOCw3ICszOCw2IEBACiAgKi8KIAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydGZzLmg+CiAKQEAgLTczLDExICs3Miw2IEBACiAJZnNpZC0+dmFsWzFdID0ga2V5ID4+IDMyOwogfQogCi1zdGF0aWMgaW50IGxsX25mc190ZXN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKLXsKLQlyZXR1cm4gbHVfZmlkX2VxKCZsbF9pMmluZm8oaW5vZGUpLT5sbGlfZmlkLCBvcGFxdWUpOwotfQotCiBzdHJ1Y3QgaW5vZGUgKnNlYXJjaF9pbm9kZV9mb3JfbHVzdHJlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQogewpAQCAtOTIsNyArODYsNyBAQAogCiAJQ0RFQlVHKERfSU5GTywgInNlYXJjaGluZyBpbm9kZSBmb3I6KCVsdSwiREZJRCIpXG4iLCBoYXNoLCBQRklEKGZpZCkpOwogCi0JaW5vZGUgPSBpbG9va3VwNShzYiwgaGFzaCwgbGxfbmZzX3Rlc3RfaW5vZGUsICh2b2lkICopZmlkKTsKKwlpbm9kZSA9IGlsb29rdXA1KHNiLCBoYXNoLCBsbF90ZXN0X2lub2RlX2J5X2ZpZCwgKHZvaWQgKilmaWQpOwogCWlmIChpbm9kZSkKIAkJcmV0dXJuIGlub2RlOwogCkBAIC0xNTMsMTIgKzE0NywxOCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKIAl9CiAKKwlyZXN1bHQgPSBkX29idGFpbl9hbGlhcyhpbm9kZSk7CisJaWYgKElTX0VSUihyZXN1bHQpKSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwogCS8qKgotCSAqIEl0IGlzIGFuIGFub255bW91cyBkZW50cnkgd2l0aG91dCBPU1Qgb2JqZWN0cyBjcmVhdGVkIHlldC4KLQkgKiBXZSBoYXZlIHRvIGZpbmQgdGhlIHBhcmVudCB0byB0ZWxsIE1EUyBob3cgdG8gaW5pdCBsb3Ygb2JqZWN0cy4KKwkgKiBJbiBjYXNlIGRfb2J0YWluX2FsaWFzKCkgZm91bmQgYSBkaXNjb25uZWN0ZWQgZGVudHJ5LCBhbHdheXMgdXBkYXRlCisJICogbGxpX3BmaWQgdG8gYWxsb3cgbGF0ZXIgb3BlcmF0aW9uIChub3JtYWxseSBvcGVuKSBoYXZlIHBhcmVudCBmaWQsCisJICogd2hpY2ggbWF5IGJlIHVzZWQgYnkgTURTIHRvIGNyZWF0ZSBkYXRhLgogCSAqLwotCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmICFsbF9pMmluZm8oaW5vZGUpLT5sbGlfaGFzX3NtZCAmJgotCSAgICBwYXJlbnQgJiYgIWZpZF9pc196ZXJvKHBhcmVudCkpIHsKKwlpZiAocGFyZW50KSB7CiAJCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOwogCiAJCXNwaW5fbG9jaygmbGxpLT5sbGlfbG9jayk7CkBAIC0yNTUsNiArMjU1LDggQEAKIAkJLmxnZF9maWQgPSBsbF9pMmluZm8oZF9pbm9kZShjaGlsZCkpLT5sbGlfZmlkLAogCQkuY3R4LmFjdG9yID0gbGxfbmZzX2dldF9uYW1lX2ZpbGxkaXIsCiAJfTsKKwlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKKwlfX3U2NCBwb3MgPSAwOwogCiAJaWYgKCFkaXIgfHwgIVNfSVNESVIoZGlyLT5pX21vZGUpKSB7CiAJCXJjID0gLUVOT1RESVI7CkBAIC0yNjYsOSArMjY4LDE4IEBACiAJCWdvdG8gb3V0OwogCX0KIAorCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZGlyLCBkaXIsIE5VTEwsIDAsIDAsCisJCQkJICAgICBMVVNUUkVfT1BDX0FOWSwgZGlyKTsKKwlpZiAoSVNfRVJSKG9wX2RhdGEpKSB7CisJCXJjID0gUFRSX0VSUihvcF9kYXRhKTsKKwkJZ290byBvdXQ7CisJfQorCisJb3BfZGF0YS0+b3BfbWF4X3BhZ2VzID0gbGxfaTJzYmkoZGlyKS0+bGxfbWRfYnJ3X3BhZ2VzOwogCWlub2RlX2xvY2soZGlyKTsKLQlyYyA9IGxsX2Rpcl9yZWFkKGRpciwgJmxnZC5jdHgpOworCXJjID0gbGxfZGlyX3JlYWQoZGlyLCAmcG9zLCBvcF9kYXRhLCAmbGdkLmN0eCk7CiAJaW5vZGVfdW5sb2NrKGRpcik7CisJbGxfZmluaXNoX21kX29wX2RhdGEob3BfZGF0YSk7CiAJaWYgKCFyYyAmJiAhbGdkLmxnZF9mb3VuZCkKIAkJcmMgPSAtRU5PRU5UOwogb3V0OgpAQCAtMjk3LDE0ICszMDgsMTIgQEAKIAlyZXR1cm4gbGxfaWdldF9mb3JfbmZzKHNiLCAmbmZzX2ZpZC0+bG5mX3BhcmVudCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpsbF9nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmRjaGlsZCkKK2ludCBsbF9kaXJfZ2V0X3BhcmVudF9maWQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBsdV9maWQgKnBhcmVudF9maWQpCiB7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEgPSBOVUxMOwotCXN0cnVjdCBpbm9kZQkgICpkaXIgPSBkX2lub2RlKGRjaGlsZCk7CiAJc3RydWN0IGxsX3NiX2luZm8gICAgICpzYmk7Ci0Jc3RydWN0IGRlbnRyeQkgKnJlc3VsdCA9IE5VTEw7CiAJc3RydWN0IG1kdF9ib2R5ICAgICAgICpib2R5OwotCXN0YXRpYyBjaGFyCSAgIGRvdGRvdFtdID0gIi4uIjsKKwlzdGF0aWMgY29uc3QgY2hhciBkb3Rkb3RbXSA9ICIuLiI7CiAJc3RydWN0IG1kX29wX2RhdGEgICAgICpvcF9kYXRhOwogCWludAkJICAgcmM7CiAJaW50CQkgICAgICBsbW1zaXplOwpAQCAtMzE5LDEzICszMjgsMTMgQEAKIAogCXJjID0gbGxfZ2V0X2RlZmF1bHRfbWRzaXplKHNiaSwgJmxtbXNpemUpOwogCWlmIChyYyAhPSAwKQotCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJCXJldHVybiByYzsKIAogCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZGlyLCBOVUxMLCBkb3Rkb3QsCiAJCQkJICAgICBzdHJsZW4oZG90ZG90KSwgbG1tc2l6ZSwKIAkJCQkgICAgIExVU1RSRV9PUENfQU5ZLCBOVUxMKTsKIAlpZiAoSVNfRVJSKG9wX2RhdGEpKQotCQlyZXR1cm4gKHZvaWQgKilvcF9kYXRhOworCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKIAogCXJjID0gbWRfZ2V0YXR0cl9uYW1lKHNiaS0+bGxfbWRfZXhwLCBvcF9kYXRhLCAmcmVxKTsKIAlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKQEAgLTMzMywyMSArMzQyLDM2IEBACiAJCUNFUlJPUigiJXM6IGZhaWx1cmUgaW5vZGUgIkRGSUQiIGdldCBwYXJlbnQ6IHJjID0gJWRcbiIsCiAJCSAgICAgICBsbF9nZXRfZnNuYW1lKGRpci0+aV9zYiwgTlVMTCwgMCksCiAJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChkaXIpKSwgcmMpOwotCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJCXJldHVybiByYzsKIAl9CiAJYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAJLyoKIAkgKiBMVS0zOTUyOiBNRFQgbWF5IGxvc3QgdGhlIEZJRCBvZiBpdHMgcGFyZW50LCB3ZSBzaG91bGQgbm90IGNyYXNoCiAJICogdGhlIE5GUyBzZXJ2ZXIsIGxsX2lnZXRfZm9yX25mcygpIHdpbGwgaGFuZGxlIHRoZSBlcnJvci4KIAkgKi8KLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxJRCkgeworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxJRCkgewogCQlDREVCVUcoRF9JTkZPLCAicGFyZW50IGZvciAiIERGSUQgIiBpcyAiIERGSUQgIlxuIiwKLQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGRpcikpLCBQRklEKCZib2R5LT5maWQxKSk7CisJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChkaXIpKSwgUEZJRCgmYm9keS0+bWJvX2ZpZDEpKTsKKwkJKnBhcmVudF9maWQgPSBib2R5LT5tYm9fZmlkMTsKIAl9Ci0JcmVzdWx0ID0gbGxfaWdldF9mb3JfbmZzKGRpci0+aV9zYiwgJmJvZHktPmZpZDEsIE5VTEwpOwogCiAJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpsbF9nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmRjaGlsZCkKK3sKKwlzdHJ1Y3QgbHVfZmlkIHBhcmVudF9maWQgPSB7IDAgfTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJaW50IHJjOworCisJcmMgPSBsbF9kaXJfZ2V0X3BhcmVudF9maWQoZGNoaWxkLT5kX2lub2RlLCAmcGFyZW50X2ZpZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gRVJSX1BUUihyYyk7CisKKwlkZW50cnkgPSBsbF9pZ2V0X2Zvcl9uZnMoZGNoaWxkLT5kX2lub2RlLT5pX3NiLCAmcGFyZW50X2ZpZCwgTlVMTCk7CisKKwlyZXR1cm4gZGVudHJ5OwogfQogCiBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgbHVzdHJlX2V4cG9ydF9vcGVyYXRpb25zID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbHByb2NfbGxpdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xwcm9jX2xsaXRlLmMKaW5kZXggZTg2YmYzYy4uNmVhZTYwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbHByb2NfbGxpdGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9scHJvY19sbGl0ZS5jCkBAIC0zMSw3ICszMSw2IEBACiAgKi8KICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCkBAIC0zNTgsMTYgKzM1NywxNiBAQAogCXN0cnVjdCBsbF9zYl9pbmZvICAgICAgKnNiaSAgID0gbGxfczJzYmkoc2IpOwogCXN0cnVjdCBjbF9jbGllbnRfY2FjaGUgKmNhY2hlID0gc2JpLT5sbF9jYWNoZTsKIAlpbnQgc2hpZnQgPSAyMCAtIFBBR0VfU0hJRlQ7Ci0JaW50IG1heF9jYWNoZWRfbWI7Ci0JaW50IHVudXNlZF9tYjsKKwlsb25nIG1heF9jYWNoZWRfbWI7CisJbG9uZyB1bnVzZWRfbWI7CiAKIAltYXhfY2FjaGVkX21iID0gY2FjaGUtPmNjY19scnVfbWF4ID4+IHNoaWZ0OwotCXVudXNlZF9tYiA9IGF0b21pY19yZWFkKCZjYWNoZS0+Y2NjX2xydV9sZWZ0KSA+PiBzaGlmdDsKKwl1bnVzZWRfbWIgPSBhdG9taWNfbG9uZ19yZWFkKCZjYWNoZS0+Y2NjX2xydV9sZWZ0KSA+PiBzaGlmdDsKIAlzZXFfcHJpbnRmKG0sCiAJCSAgICJ1c2VyczogJWRcbiIKLQkJICAgIm1heF9jYWNoZWRfbWI6ICVkXG4iCi0JCSAgICJ1c2VkX21iOiAlZFxuIgotCQkgICAidW51c2VkX21iOiAlZFxuIgorCQkgICAibWF4X2NhY2hlZF9tYjogJWxkXG4iCisJCSAgICJ1c2VkX21iOiAlbGRcbiIKKwkJICAgInVudXNlZF9tYjogJWxkXG4iCiAJCSAgICJyZWNsYWltX2NvdW50OiAldVxuIiwKIAkJICAgYXRvbWljX3JlYWQoJmNhY2hlLT5jY2NfdXNlcnMpLAogCQkgICBtYXhfY2FjaGVkX21iLApAQCAtMzg1LDEwICszODQsMTMgQEAKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwogCXN0cnVjdCBjbF9jbGllbnRfY2FjaGUgKmNhY2hlID0gc2JpLT5sbF9jYWNoZTsKIAlzdHJ1Y3QgbHVfZW52ICplbnY7CisJbG9uZyBkaWZmID0gMDsKKwlsb25nIG5ycGFnZXMgPSAwOwogCWludCByZWZjaGVjazsKLQlpbnQgbXVsdCwgcmMsIHBhZ2VzX251bWJlcjsKLQlpbnQgZGlmZiA9IDA7Ci0JaW50IG5ycGFnZXMgPSAwOworCWxvbmcgcGFnZXNfbnVtYmVyOworCWludCBtdWx0OworCWxvbmcgcmM7CisJdTY0IHZhbDsKIAljaGFyIGtlcm5idWZbMTI4XTsKIAogCWlmIChjb3VudCA+PSBzaXplb2Yoa2VybmJ1ZikpCkBAIC00MDEsMTAgKzQwMywxNCBAQAogCW11bHQgPSAxIDw8ICgyMCAtIFBBR0VfU0hJRlQpOwogCWJ1ZmZlciArPSBscHJvY2ZzX2ZpbmRfbmFtZWRfdmFsdWUoa2VybmJ1ZiwgIm1heF9jYWNoZWRfbWI6IiwgJmNvdW50KSAtCiAJCSAga2VybmJ1ZjsKLQlyYyA9IGxwcm9jZnNfd3JpdGVfZnJhY19oZWxwZXIoYnVmZmVyLCBjb3VudCwgJnBhZ2VzX251bWJlciwgbXVsdCk7CisJcmMgPSBscHJvY2ZzX3dyaXRlX2ZyYWNfdTY0X2hlbHBlcihidWZmZXIsIGNvdW50LCAmdmFsLCBtdWx0KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAorCWlmICh2YWwgPiBMT05HX01BWCkKKwkJcmV0dXJuIC1FUkFOR0U7CisJcGFnZXNfbnVtYmVyID0gKGxvbmcpdmFsOworCiAJaWYgKHBhZ2VzX251bWJlciA8IDAgfHwgcGFnZXNfbnVtYmVyID4gdG90YWxyYW1fcGFnZXMpIHsKIAkJQ0VSUk9SKCIlczogY2FuJ3Qgc2V0IG1heCBjYWNoZSBtb3JlIHRoYW4gJWx1IE1CXG4iLAogCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShzYiwgTlVMTCwgMCksCkBAIC00MTgsNyArNDI0LDcgQEAKIAogCS8qIGVhc3kgLSBhZGQgbW9yZSBMUlUgc2xvdHMuICovCiAJaWYgKGRpZmYgPj0gMCkgewotCQlhdG9taWNfYWRkKGRpZmYsICZjYWNoZS0+Y2NjX2xydV9sZWZ0KTsKKwkJYXRvbWljX2xvbmdfYWRkKGRpZmYsICZjYWNoZS0+Y2NjX2xydV9sZWZ0KTsKIAkJcmMgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC00MjksMTggKzQzNSwxOCBAQAogCiAJZGlmZiA9IC1kaWZmOwogCXdoaWxlIChkaWZmID4gMCkgewotCQlpbnQgdG1wOworCQlsb25nIHRtcDsKIAogCQkvKiByZWR1Y2UgTFJVIGJ1ZGdldCBmcm9tIGZyZWUgc2xvdHMuICovCiAJCWRvIHsKLQkJCWludCBvdiwgbnY7CisJCQlsb25nIG92LCBudjsKIAotCQkJb3YgPSBhdG9taWNfcmVhZCgmY2FjaGUtPmNjY19scnVfbGVmdCk7CisJCQlvdiA9IGF0b21pY19sb25nX3JlYWQoJmNhY2hlLT5jY2NfbHJ1X2xlZnQpOwogCQkJaWYgKG92ID09IDApCiAJCQkJYnJlYWs7CiAKIAkJCW52ID0gb3YgPiBkaWZmID8gb3YgLSBkaWZmIDogMDsKLQkJCXJjID0gYXRvbWljX2NtcHhjaGcoJmNhY2hlLT5jY2NfbHJ1X2xlZnQsIG92LCBudik7CisJCQlyYyA9IGF0b21pY19sb25nX2NtcHhjaGcoJmNhY2hlLT5jY2NfbHJ1X2xlZnQsIG92LCBudik7CiAJCQlpZiAobGlrZWx5KG92ID09IHJjKSkgewogCQkJCWRpZmYgLT0gb3YgLSBudjsKIAkJCQlucnBhZ2VzICs9IG92IC0gbnY7CkBAIC00NzQsNyArNDgwLDcgQEAKIAkJc3Bpbl91bmxvY2soJnNiaS0+bGxfbG9jayk7CiAJCXJjID0gY291bnQ7CiAJfSBlbHNlIHsKLQkJYXRvbWljX2FkZChucnBhZ2VzLCAmY2FjaGUtPmNjY19scnVfbGVmdCk7CisJCWF0b21pY19sb25nX2FkZChucnBhZ2VzLCAmY2FjaGUtPmNjY19scnVfbGVmdCk7CiAJfQogCXJldHVybiByYzsKIH0KQEAgLTczOCw2ICs3NDQsMTggQEAKIH0KIExVU1RSRV9ST19BVFRSKG1heF9lYXNpemUpOwogCisvKioKKyAqIEdldCBkZWZhdWx0X2Vhc2l6ZS4KKyAqCisgKiBcc2VlIGNsaWVudF9vYmQ6OmNsX2RlZmF1bHRfbWRzX2Vhc2l6ZQorICoKKyAqIFxwYXJhbVtpbl0ga29iaglrZXJuZWwgb2JqZWN0IGZvciBzeXNmcyB0cmVlCisgKiBccGFyYW1baW5dIGF0dHIJYXR0cmlidXRlIG9mIHRoaXMga2VybmVsIG9iamVjdAorICogXHBhcmFtW2luXSBidWYJYnVmZmVyIHRvIHdyaXRlIGRhdGEgaW50bworICoKKyAqIFxyZXR2YWwgcG9zaXRpdmUJXGEgY291bnQgb24gc3VjY2VzcworICogXHJldHZhbCBuZWdhdGl2ZQluZWdhdGVkIGVycm5vIG9uIGZhaWx1cmUKKyAqLwogc3RhdGljIHNzaXplX3QgZGVmYXVsdF9lYXNpemVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQkgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAogCQkJCSAgIGNoYXIgKmJ1ZikKQEAgLTc1Myw3ICs3NzEsNDQgQEAKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBlYWxlbik7CiB9Ci1MVVNUUkVfUk9fQVRUUihkZWZhdWx0X2Vhc2l6ZSk7CisKKy8qKgorICogU2V0IGRlZmF1bHRfZWFzaXplLgorICoKKyAqIFJhbmdlIGNoZWNraW5nIG9uIHRoZSBwYXNzZWQgdmFsdWUgaXMgaGFuZGxlZCBieQorICogbGxfc2V0X2RlZmF1bHRfbWRzaXplKCkuCisgKgorICogXHNlZSBjbGllbnRfb2JkOjpjbF9kZWZhdWx0X21kc19lYXNpemUKKyAqCisgKiBccGFyYW1baW5dIGtvYmoJa2VybmVsIG9iamVjdCBmb3Igc3lzZnMgdHJlZQorICogXHBhcmFtW2luXSBhdHRyCWF0dHJpYnV0ZSBvZiB0aGlzIGtlcm5lbCBvYmplY3QKKyAqIFxwYXJhbVtpbl0gYnVmZmVyCXN0cmluZyBwYXNzZWQgZnJvbSB1c2VyIHNwYWNlCisgKiBccGFyYW1baW5dIGNvdW50CVxhIGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBccmV0dmFsIHBvc2l0aXZlCVxhIGNvdW50IG9uIHN1Y2Nlc3MKKyAqIFxyZXR2YWwgbmVnYXRpdmUJbmVnYXRlZCBlcnJubyBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBzc2l6ZV90IGRlZmF1bHRfZWFzaXplX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWZmZXIsCisJCQkJICAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBsbF9zYl9pbmZvLAorCQkJCQkgICAgICBsbF9rb2JqKTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmM7CisKKwlyYyA9IGtzdHJ0b3VsKGJ1ZmZlciwgMTAsICZ2YWwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBsbF9zZXRfZGVmYXVsdF9tZHNpemUoc2JpLCB2YWwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGNvdW50OworfQorTFVTVFJFX1JXX0FUVFIoZGVmYXVsdF9lYXNpemUpOwogCiBzdGF0aWMgaW50IGxsX3NiaV9mbGFnc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CkBAIC03NzQsNyArODI5LDcgQEAKIAkJZmxhZ3MgPj49IDE7CiAJCSsraTsKIAl9Ci0Jc2VxX3ByaW50ZihtLCAiXGJcbiIpOworCXNlcV9wdXRzKG0sICJcYlxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgyMywxNSArODc4LDExNiBAQAogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGxsX3NiX2luZm8sCiAJCQkJCSAgICAgIGxsX2tvYmopOwogCXN0cnVjdCBjbF9jbGllbnRfY2FjaGUgKmNhY2hlID0gc2JpLT5sbF9jYWNoZTsKLQlpbnQgcGFnZXMsIG1iOworCWxvbmcgcGFnZXM7CisJaW50IG1iOwogCi0JcGFnZXMgPSBhdG9taWNfcmVhZCgmY2FjaGUtPmNjY191bnN0YWJsZV9ucik7CisJcGFnZXMgPSBhdG9taWNfbG9uZ19yZWFkKCZjYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKTsKIAltYiA9IChwYWdlcyAqIFBBR0VfU0laRSkgPj4gMjA7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICJ1bnN0YWJsZV9wYWdlczogJThkXG4iCi0JCQkgICAgInVuc3RhYmxlX21iOiAgICAlOGRcbiIsIHBhZ2VzLCBtYik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAidW5zdGFibGVfY2hlY2s6ICAgICAlOGRcbiIKKwkJCSAgICAidW5zdGFibGVfcGFnZXM6ICUxMmxkXG4iCisJCQkgICAgInVuc3RhYmxlX21iOiAgICAgICAgJThkXG4iLAorCQkJICAgIGNhY2hlLT5jY2NfdW5zdGFibGVfY2hlY2ssIHBhZ2VzLCBtYik7CiB9Ci1MVVNUUkVfUk9fQVRUUih1bnN0YWJsZV9zdGF0cyk7CisKK3N0YXRpYyBzc2l6ZV90IHVuc3RhYmxlX3N0YXRzX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCSAgICBjb25zdCBjaGFyICpidWZmZXIsCisJCQkJICAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBsbF9zYl9pbmZvLAorCQkJCQkgICAgICBsbF9rb2JqKTsKKwljaGFyIGtlcm5idWZbMTI4XTsKKwlpbnQgdmFsLCByYzsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCWlmIChjb3VudCA+PSBzaXplb2Yoa2VybmJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGtlcm5idWYsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlrZXJuYnVmW2NvdW50XSA9IDA7CisKKwlidWZmZXIgKz0gbHByb2Nmc19maW5kX25hbWVkX3ZhbHVlKGtlcm5idWYsICJ1bnN0YWJsZV9jaGVjazoiLCAmY291bnQpIC0KKwkJICBrZXJuYnVmOworCXJjID0gbHByb2Nmc193cml0ZV9oZWxwZXIoYnVmZmVyLCBjb3VudCwgJnZhbCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogYm9ycm93IGxydSBsb2NrIHRvIHNldCB0aGUgdmFsdWUgKi8KKwlzcGluX2xvY2soJnNiaS0+bGxfY2FjaGUtPmNjY19scnVfbG9jayk7CisJc2JpLT5sbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX2NoZWNrID0gISF2YWw7CisJc3Bpbl91bmxvY2soJnNiaS0+bGxfY2FjaGUtPmNjY19scnVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CitMVVNUUkVfUldfQVRUUih1bnN0YWJsZV9zdGF0cyk7CisKK3N0YXRpYyBzc2l6ZV90IHJvb3Rfc3F1YXNoX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGxsX3NiX2luZm8sCisJCQkJCSAgICAgIGxsX2tvYmopOworCXN0cnVjdCByb290X3NxdWFzaF9pbmZvICpzcXVhc2ggPSAmc2JpLT5sbF9zcXVhc2g7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldToldVxuIiwgc3F1YXNoLT5yc2lfdWlkLCBzcXVhc2gtPnJzaV9naWQpOworfQorCitzdGF0aWMgc3NpemVfdCByb290X3NxdWFzaF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgbGxfc2JfaW5mbywKKwkJCQkJICAgICAgbGxfa29iaik7CisJc3RydWN0IHJvb3Rfc3F1YXNoX2luZm8gKnNxdWFzaCA9ICZzYmktPmxsX3NxdWFzaDsKKworCXJldHVybiBscHJvY2ZzX3dyX3Jvb3Rfc3F1YXNoKGJ1ZmZlciwgY291bnQsIHNxdWFzaCwKKwkJCQkgICAgICBsbF9nZXRfZnNuYW1lKHNiaS0+bGxfc2IsIE5VTEwsIDApKTsKK30KK0xVU1RSRV9SV19BVFRSKHJvb3Rfc3F1YXNoKTsKKworc3RhdGljIGludCBsbF9ub3NxdWFzaF9uaWRzX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOworCXN0cnVjdCByb290X3NxdWFzaF9pbmZvICpzcXVhc2ggPSAmc2JpLT5sbF9zcXVhc2g7CisJaW50IGxlbjsKKworCWRvd25fcmVhZCgmc3F1YXNoLT5yc2lfc2VtKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnNxdWFzaC0+cnNpX25vc3F1YXNoX25pZHMpKSB7CisJCWxlbiA9IGNmc19wcmludF9uaWRsaXN0KG0tPmJ1ZiArIG0tPmNvdW50LCBtLT5zaXplIC0gbS0+Y291bnQsCisJCQkJCSZzcXVhc2gtPnJzaV9ub3NxdWFzaF9uaWRzKTsKKwkJbS0+Y291bnQgKz0gbGVuOworCQlzZXFfcHV0cyhtLCAiXG4iKTsKKwl9IGVsc2UgeworCQlzZXFfcHV0cyhtLCAiTk9ORVxuIik7CisJfQorCXVwX3JlYWQoJnNxdWFzaC0+cnNpX3NlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgbGxfbm9zcXVhc2hfbmlkc19zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQoreworCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOworCXN0cnVjdCByb290X3NxdWFzaF9pbmZvICpzcXVhc2ggPSAmc2JpLT5sbF9zcXVhc2g7CisJaW50IHJjOworCisJcmMgPSBscHJvY2ZzX3dyX25vc3F1YXNoX25pZHMoYnVmZmVyLCBjb3VudCwgc3F1YXNoLAorCQkJCSAgICAgIGxsX2dldF9mc25hbWUoc2IsIE5VTEwsIDApKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlsbF9jb21wdXRlX3Jvb3RzcXVhc2hfc3RhdGUoc2JpKTsKKworCXJldHVybiByYzsKK30KKworTFBST0NfU0VRX0ZPUFMobGxfbm9zcXVhc2hfbmlkcyk7CiAKIHN0YXRpYyBzdHJ1Y3QgbHByb2Nmc192YXJzIGxwcm9jZnNfbGxpdGVfb2JkX3ZhcnNbXSA9IHsKIAkvKiB7ICJtbnRwdF9wYXRoIiwgICBsbF9yZF9wYXRoLAkgICAgIDAsIDAgfSwgKi8KQEAgLTg0MCw2ICs5OTYsOCBAQAogCXsgIm1heF9jYWNoZWRfbWIiLCAgICAmbGxfbWF4X2NhY2hlZF9tYl9mb3BzLCBOVUxMIH0sCiAJeyAic3RhdGFoZWFkX3N0YXRzIiwgICZsbF9zdGF0YWhlYWRfc3RhdHNfZm9wcywgTlVMTCwgMCB9LAogCXsgInNiaV9mbGFncyIsCSAgICAgICZsbF9zYmlfZmxhZ3NfZm9wcywgTlVMTCwgMCB9LAorCXsgLm5hbWUgPQkJIm5vc3F1YXNoX25pZHMiLAorCSAgLmZvcHMgPQkJJmxsX25vc3F1YXNoX25pZHNfZm9wcwkJfSwKIAl7IE5VTEwgfQogfTsKIApAQCAtODY5LDYgKzEwMjcsNyBAQAogCSZsdXN0cmVfYXR0cl9kZWZhdWx0X2Vhc2l6ZS5hdHRyLAogCSZsdXN0cmVfYXR0cl94YXR0cl9jYWNoZS5hdHRyLAogCSZsdXN0cmVfYXR0cl91bnN0YWJsZV9zdGF0cy5hdHRyLAorCSZsdXN0cmVfYXR0cl9yb290X3NxdWFzaC5hdHRyLAogCU5VTEwsCiB9OwogCkBAIC04OTMsMTcgKzEwNTIsMTcgQEAKIAkvKiBmaWxlIG9wZXJhdGlvbiAqLwogCXsgTFBST0NfTExfRElSVFlfSElUUywgICAgIExQUk9DRlNfVFlQRV9SRUdTLCAiZGlydHlfcGFnZXNfaGl0cyIgfSwKIAl7IExQUk9DX0xMX0RJUlRZX01JU1NFUywgICBMUFJPQ0ZTX1RZUEVfUkVHUywgImRpcnR5X3BhZ2VzX21pc3NlcyIgfSwKLQl7IExQUk9DX0xMX1JFQURfQllURVMsICAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYfExQUk9DRlNfVFlQRV9CWVRFUywKKwl7IExQUk9DX0xMX1JFQURfQllURVMsICAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYIHwgTFBST0NGU19UWVBFX0JZVEVTLAogCQkJCSAgICJyZWFkX2J5dGVzIiB9LAotCXsgTFBST0NfTExfV1JJVEVfQllURVMsICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVh8TFBST0NGU19UWVBFX0JZVEVTLAorCXsgTFBST0NfTExfV1JJVEVfQllURVMsICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVggfCBMUFJPQ0ZTX1RZUEVfQllURVMsCiAJCQkJICAgIndyaXRlX2J5dGVzIiB9LAotCXsgTFBST0NfTExfQlJXX1JFQUQsICAgICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVh8TFBST0NGU19UWVBFX1BBR0VTLAorCXsgTFBST0NfTExfQlJXX1JFQUQsICAgICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVggfCBMUFJPQ0ZTX1RZUEVfUEFHRVMsCiAJCQkJICAgImJyd19yZWFkIiB9LAotCXsgTFBST0NfTExfQlJXX1dSSVRFLCAgICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVh8TFBST0NGU19UWVBFX1BBR0VTLAorCXsgTFBST0NfTExfQlJXX1dSSVRFLCAgICAgIExQUk9DRlNfQ05UUl9BVkdNSU5NQVggfCBMUFJPQ0ZTX1RZUEVfUEFHRVMsCiAJCQkJICAgImJyd193cml0ZSIgfSwKLQl7IExQUk9DX0xMX09TQ19SRUFELCAgICAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYfExQUk9DRlNfVFlQRV9CWVRFUywKKwl7IExQUk9DX0xMX09TQ19SRUFELCAgICAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYIHwgTFBST0NGU19UWVBFX0JZVEVTLAogCQkJCSAgICJvc2NfcmVhZCIgfSwKLQl7IExQUk9DX0xMX09TQ19XUklURSwgICAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYfExQUk9DRlNfVFlQRV9CWVRFUywKKwl7IExQUk9DX0xMX09TQ19XUklURSwgICAgICBMUFJPQ0ZTX0NOVFJfQVZHTUlOTUFYIHwgTFBST0NGU19UWVBFX0JZVEVTLAogCQkJCSAgICJvc2Nfd3JpdGUiIH0sCiAJeyBMUFJPQ19MTF9JT0NUTCwJICBMUFJPQ0ZTX1RZUEVfUkVHUywgImlvY3RsIiB9LAogCXsgTFBST0NfTExfT1BFTiwJICAgTFBST0NGU19UWVBFX1JFR1MsICJvcGVuIiB9LApAQCAtMTE1MCw3ICsxMzA5LDcgQEAKIAkJCSAgIHIsIHBjdChyLCByZWFkX3RvdCksIHBjdChyZWFkX2N1bSwgcmVhZF90b3QpLAogCQkJICAgdywgcGN0KHcsIHdyaXRlX3RvdCksIHBjdCh3cml0ZV9jdW0sIHdyaXRlX3RvdCkpOwogCQlzdGFydCA9IGVuZDsKLQkJaWYgKHN0YXJ0ID09IDE8PDEwKSB7CisJCWlmIChzdGFydCA9PSAxIDw8IDEwKSB7CiAJCQlzdGFydCA9IDE7CiAJCQl1bml0cyArPSAxMDsKIAkJCXVuaXRwKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9uYW1laS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbmFtZWkuYwppbmRleCAzNjY0YmZkLi5kZmEzNmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9uYW1laS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL25hbWVpLmMKQEAgLTQyLDEzICs0MiwxMiBAQAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2ZpZC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV92ZXIuaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogCi1zdGF0aWMgaW50IGxsX2NyZWF0ZV9pdChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLAotCQkJaW50LCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqKTsKK3N0YXRpYyBpbnQgbGxfY3JlYXRlX2l0KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQlzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpOwogCiAvKiBjYWxsZWQgZnJvbSBpZ2V0NV9sb2NrZWQtPmZpbmRfaW5vZGUoKSB1bmRlciBpbm9kZV9oYXNoX2xvY2sgc3BpbmxvY2sgKi8KIHN0YXRpYyBpbnQgbGxfdGVzdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpvcGFxdWUpCkBAIC01NiwxMiArNTUsMTIgQEAKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAlzdHJ1Y3QgbHVzdHJlX21kICAgICAqbWQgPSBvcGFxdWU7CiAKLQlpZiAodW5saWtlbHkoIShtZC0+Ym9keS0+dmFsaWQgJiBPQkRfTURfRkxJRCkpKSB7CisJaWYgKHVubGlrZWx5KCEobWQtPmJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTElEKSkpIHsKIAkJQ0VSUk9SKCJNRFMgYm9keSBtaXNzaW5nIEZJRFxuIik7CiAJCXJldHVybiAwOwogCX0KIAotCWlmICghbHVfZmlkX2VxKCZsbGktPmxsaV9maWQsICZtZC0+Ym9keS0+ZmlkMSkpCisJaWYgKCFsdV9maWRfZXEoJmxsaS0+bGxpX2ZpZCwgJm1kLT5ib2R5LT5tYm9fZmlkMSkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIDE7CkBAIC03MiwyMCArNzEsMjAgQEAKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHkgPSAoKHN0cnVjdCBsdXN0cmVfbWQgKilvcGFxdWUpLT5ib2R5OwogCi0JaWYgKHVubGlrZWx5KCEoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxJRCkpKSB7CisJaWYgKHVubGlrZWx5KCEoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMSUQpKSkgewogCQlDRVJST1IoIk1EUyBib2R5IG1pc3NpbmcgRklEXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JbGxpLT5sbGlfZmlkID0gYm9keS0+ZmlkMTsKLQlpZiAodW5saWtlbHkoIShib2R5LT52YWxpZCAmIE9CRF9NRF9GTFRZUEUpKSkgeworCWxsaS0+bGxpX2ZpZCA9IGJvZHktPm1ib19maWQxOworCWlmICh1bmxpa2VseSghKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTFRZUEUpKSkgewogCQlDRVJST1IoIkNhbiBub3QgaW5pdGlhbGl6ZSBpbm9kZSAiIERGSUQKIAkJICAgICAgICIgd2l0aG91dCBvYmplY3QgdHlwZTogdmFsaWQgPSAlI2xseFxuIiwKLQkJICAgICAgIFBGSUQoJmxsaS0+bGxpX2ZpZCksIGJvZHktPnZhbGlkKTsKKwkJICAgICAgIFBGSUQoJmxsaS0+bGxpX2ZpZCksIGJvZHktPm1ib192YWxpZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlub2RlLT5pX21vZGUgPSAoaW5vZGUtPmlfbW9kZSAmIH5TX0lGTVQpIHwgKGJvZHktPm1vZGUgJiBTX0lGTVQpOworCWlub2RlLT5pX21vZGUgPSAoaW5vZGUtPmlfbW9kZSAmIH5TX0lGTVQpIHwgKGJvZHktPm1ib19tb2RlICYgU19JRk1UKTsKIAlpZiAodW5saWtlbHkoaW5vZGUtPmlfbW9kZSA9PSAwKSkgewogCQlDRVJST1IoIkludmFsaWQgaW5vZGUgIkRGSUQiIHR5cGVcbiIsIFBGSUQoJmxsaS0+bGxpX2ZpZCkpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk2LDQxICs5NSw0NSBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogR2V0IGFuIGlub2RlIGJ5IGlub2RlIG51bWJlciAoYWxyZWFkeSBpbnN0YW50aWF0ZWQgYnkgdGhlIGludGVudCBsb29rdXApLgotICogUmV0dXJucyBpbm9kZSBvciBOVUxMCisvKioKKyAqIEdldCBhbiBpbm9kZSBieSBpbm9kZSBudW1iZXIoQGhhc2gpLCB3aGljaCBpcyBhbHJlYWR5IGluc3RhbnRpYXRlZCBieQorICogdGhlIGludGVudCBsb29rdXApLgogICovCiBzdHJ1Y3QgaW5vZGUgKmxsX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW5vX3QgaGFzaCwKIAkJICAgICAgc3RydWN0IGx1c3RyZV9tZCAqbWQpCiB7CiAJc3RydWN0IGlub2RlCSAqaW5vZGU7CisJaW50IHJjID0gMDsKIAogCUxBU1NFUlQoaGFzaCAhPSAwKTsKIAlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgaGFzaCwgbGxfdGVzdF9pbm9kZSwgbGxfc2V0X2lub2RlLCBtZCk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlpZiAoaW5vZGUpIHsKLQkJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKLQkJCWludCByYyA9IDA7Ci0KLQkJCWxsX3JlYWRfaW5vZGUyKGlub2RlLCBtZCk7Ci0JCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgotCQkJICAgICFsbF9pMmluZm8oaW5vZGUpLT5sbGlfY2xvYikgewotCQkJCUNERUJVRyhEX0lOT0RFLAotCQkJCSAgICAgICAiJXM6IGFwcGx5IGxzbSAlcCB0byBpbm9kZSAiIERGSUQgIi5cbiIsCi0JCQkJICAgICAgIGxsX2dldF9mc25hbWUoc2IsIE5VTEwsIDApLCBtZC0+bHNtLAotCQkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpKTsKLQkJCQlyYyA9IGNsX2ZpbGVfaW5vZGVfaW5pdChpbm9kZSwgbWQpOwotCQkJfQotCQkJaWYgKHJjICE9IDApIHsKLQkJCQlpZ2V0X2ZhaWxlZChpbm9kZSk7Ci0JCQkJaW5vZGUgPSBOVUxMOwotCQkJfSBlbHNlIHsKLQkJCQl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKLQkJCX0KLQkJfSBlbHNlIGlmICghKGlub2RlLT5pX3N0YXRlICYgKElfRlJFRUlORyB8IElfQ0xFQVIpKSkgewotCQkJbGxfdXBkYXRlX2lub2RlKGlub2RlLCBtZCk7Ci0JCQlDREVCVUcoRF9WRlNUUkFDRSwgImdvdCBpbm9kZTogIkRGSUQiKCVwKVxuIiwKLQkJCSAgICAgICBQRklEKCZtZC0+Ym9keS0+ZmlkMSksIGlub2RlKTsKKwlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgeworCQlyYyA9IGxsX3JlYWRfaW5vZGUyKGlub2RlLCBtZCk7CisJCWlmICghcmMgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgorCQkgICAgIWxsX2kyaW5mbyhpbm9kZSktPmxsaV9jbG9iKSB7CisJCQlDREVCVUcoRF9JTk9ERSwgIiVzOiBhcHBseSBsc20gJXAgdG8gaW5vZGUgIkRGSUQiXG4iLAorCQkJICAgICAgIGxsX2dldF9mc25hbWUoc2IsIE5VTEwsIDApLCBtZC0+bHNtLAorCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSkpOworCQkJcmMgPSBjbF9maWxlX2lub2RlX2luaXQoaW5vZGUsIG1kKTsKKwkJfQorCQlpZiAocmMpIHsKKwkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCQkJaXB1dChpbm9kZSk7CisJCQlpbm9kZSA9IEVSUl9QVFIocmMpOworCQl9IGVsc2UgeworCQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJCX0KKwl9IGVsc2UgaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiAoSV9GUkVFSU5HIHwgSV9DTEVBUikpKSB7CisJCXJjID0gbGxfdXBkYXRlX2lub2RlKGlub2RlLCBtZCk7CisJCUNERUJVRyhEX1ZGU1RSQUNFLCAiZ290IGlub2RlOiAiREZJRCIoJXApOiByYyA9ICVkXG4iLAorCQkgICAgICAgUEZJRCgmbWQtPmJvZHktPm1ib19maWQxKSwgaW5vZGUsIHJjKTsKKwkJaWYgKHJjKSB7CisJCQlpcHV0KGlub2RlKTsKKwkJCWlub2RlID0gRVJSX1BUUihyYyk7CiAJCX0KIAl9CiAJcmV0dXJuIGlub2RlOwpAQCAtMTU4LDYgKzE2MSwxMSBAQAogCXNwaW5fdW5sb2NrKCZkaXItPmlfbG9jayk7CiB9CiAKK2ludCBsbF90ZXN0X2lub2RlX2J5X2ZpZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpvcGFxdWUpCit7CisJcmV0dXJuIGx1X2ZpZF9lcSgmbGxfaTJpbmZvKGlub2RlKS0+bGxpX2ZpZCwgb3BhcXVlKTsKK30KKwogaW50IGxsX21kX2Jsb2NraW5nX2FzdChzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrLCBzdHJ1Y3QgbGRsbV9sb2NrX2Rlc2MgKmRlc2MsCiAJCSAgICAgICB2b2lkICpkYXRhLCBpbnQgZmxhZykKIHsKQEAgLTE5Niw2ICsyMDQsOCBAQAogCQl9CiAKIAkJaWYgKGJpdHMgJiBNRFNfSU5PREVMT0NLX1hBVFRSKSB7CisJCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCQlsbF9pMmluZm8oaW5vZGUpLT5sbGlfZGVmX3N0cmlwZV9vZmZzZXQgPSAtMTsKIAkJCWxsX3hhdHRyX2NhY2hlX2Rlc3Ryb3koaW5vZGUpOwogCQkJYml0cyAmPSB+TURTX0lOT0RFTE9DS19YQVRUUjsKIAkJfQpAQCAtMjUzLDEwICsyNjMsNDEgQEAKIAkJfQogCiAJCWlmICgoYml0cyAmIE1EU19JTk9ERUxPQ0tfVVBEQVRFKSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCQlDREVCVUcoRF9JTk9ERSwgImludmFsaWRhdGluZyBpbm9kZSAiREZJRCJcbiIsCi0JCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSk7CisJCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKKworCQkJQ0RFQlVHKERfSU5PREUsICJpbnZhbGlkYXRpbmcgaW5vZGUgIkRGSUQiIGxsaSA9ICVwLCBwZmlkICA9ICJERklEIlxuIiwKKwkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBsbGksCisJCQkgICAgICAgUEZJRCgmbGxpLT5sbGlfcGZpZCkpOworCiAJCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nLCAwKTsKLQkJCWxsX2ludmFsaWRhdGVfbmVnYXRpdmVfY2hpbGRyZW4oaW5vZGUpOworCisJCQlpZiAodW5saWtlbHkoIWZpZF9pc196ZXJvKCZsbGktPmxsaV9wZmlkKSkpIHsKKwkJCQlzdHJ1Y3QgaW5vZGUgKm1hc3Rlcl9pbm9kZSA9IE5VTEw7CisJCQkJdW5zaWduZWQgbG9uZyBoYXNoOworCisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIHNsYXZlIGlub2RlLCBzaW5jZSBhbGwgb2YgdGhlIGNoaWxkCisJCQkJICogZGVudHJ5IGlzIGNvbm5lY3RlZCBvbiB0aGUgbWFzdGVyIGlub2RlLCBzbworCQkJCSAqIHdlIGhhdmUgdG8gaW52YWxpZGF0ZSB0aGUgbmVnYXRpdmUgY2hpbGRyZW4KKwkJCQkgKiBvbiBtYXN0ZXIgaW5vZGUKKwkJCQkgKi8KKwkJCQlDREVCVUcoRF9JTk9ERSwgIkludmFsaWRhdGUgcyJERklEIiBtIkRGSUQiXG4iLAorCQkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLAorCQkJCSAgICAgICBQRklEKCZsbGktPmxsaV9wZmlkKSk7CisKKwkJCQloYXNoID0gY2xfZmlkX2J1aWxkX2lubygmbGxpLT5sbGlfcGZpZCwKKwkJCQkJCQlsbF9uZWVkXzMyYml0X2FwaShsbF9pMnNiaShpbm9kZSkpKTsKKworCQkJCW1hc3Rlcl9pbm9kZSA9IGlsb29rdXA1KGlub2RlLT5pX3NiLCBoYXNoLAorCQkJCQkJCWxsX3Rlc3RfaW5vZGVfYnlfZmlkLAorCQkJCQkJCSh2b2lkICopJmxsaS0+bGxpX3BmaWQpOworCQkJCWlmIChtYXN0ZXJfaW5vZGUgJiYgIUlTX0VSUihtYXN0ZXJfaW5vZGUpKSB7CisJCQkJCWxsX2ludmFsaWRhdGVfbmVnYXRpdmVfY2hpbGRyZW4obWFzdGVyX2lub2RlKTsKKwkJCQkJaXB1dChtYXN0ZXJfaW5vZGUpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbGxfaW52YWxpZGF0ZV9uZWdhdGl2ZV9jaGlsZHJlbihpbm9kZSk7CisJCQl9CiAJCX0KIAogCQlpZiAoKGJpdHMgJiAoTURTX0lOT0RFTE9DS19MT09LVVAgfCBNRFNfSU5PREVMT0NLX1BFUk0pKSAmJgpAQCAtMzIyLDcgKzM2Myw4IEBACiAJCUxBU1NFUlQoYWxpYXMgIT0gZGVudHJ5KTsKIAogCQlzcGluX2xvY2soJmFsaWFzLT5kX2xvY2spOwotCQlpZiAoYWxpYXMtPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEKQorCQlpZiAoKGFsaWFzLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkgJiYKKwkJICAgIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCiAJCQkvKiBMQVNTRVJUKGxhc3RfZGlzY29uID09IE5VTEwpOyBMVS00MDUsIGJ6IDIwMDU1ICovCiAJCQlkaXNjb25fYWxpYXMgPSBhbGlhczsKIAkJZWxzZSBpZiAoYWxpYXMtPmRfcGFyZW50ID09IGRlbnRyeS0+ZF9wYXJlbnQJICAgICAmJgpAQCAtMzg4LDYgKzQzMCw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAJX191NjQgYml0cyA9IDA7CiAJaW50IHJjID0gMDsKKwlzdHJ1Y3QgZGVudHJ5ICphbGlhczsKIAogCS8qIE5CIDEgcmVxdWVzdCByZWZlcmVuY2Ugd2lsbCBiZSB0YWtlbiBhd2F5IGJ5IGxsX2ludGVudF9sb2NrKCkKIAkgKiB3aGVuIEkgcmV0dXJuCkBAIC00MTIsMjYgKzQ1NSwxMiBAQAogCQkgKi8KIAl9CiAKLQkvKiBPbmx5IGhhc2ggKmRlIGlmIGl0IGlzIHVuaGFzaGVkIChuZXcgZGVudHJ5KS4KLQkgKiBBdG9pbWNfb3BlbiBtYXkgcGFzc2luZyBoYXNoZWQgZGVudHJpZXMgZm9yIG9wZW4uCi0JICovCi0JaWYgKGRfdW5oYXNoZWQoKmRlKSkgewotCQlzdHJ1Y3QgZGVudHJ5ICphbGlhczsKLQotCQlhbGlhcyA9IGxsX3NwbGljZV9hbGlhcyhpbm9kZSwgKmRlKTsKLQkJaWYgKElTX0VSUihhbGlhcykpIHsKLQkJCXJjID0gUFRSX0VSUihhbGlhcyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQkqZGUgPSBhbGlhczsKLQl9IGVsc2UgaWYgKCFpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9MT09LVVBfTkVHKSAgJiYKLQkJICAgIWl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX09QRU5fQ1JFQVRFKSkgewotCQkvKiBXaXRoIERJU1BfT1BFTl9DUkVBVEUgZGVudHJ5IHdpbGwgYmUKLQkJICogaW5zdGFudGlhdGVkIGluIGxsX2NyZWF0ZV9pdC4KLQkJICovCi0JCUxBU1NFUlQoIWRfaW5vZGUoKmRlKSk7Ci0JCWRfaW5zdGFudGlhdGUoKmRlLCBpbm9kZSk7CisJYWxpYXMgPSBsbF9zcGxpY2VfYWxpYXMoaW5vZGUsICpkZSk7CisJaWYgKElTX0VSUihhbGlhcykpIHsKKwkJcmMgPSBQVFJfRVJSKGFsaWFzKTsKKwkJZ290byBvdXQ7CiAJfQorCSpkZSA9IGFsaWFzOwogCiAJaWYgKCFpdF9kaXNwb3NpdGlvbihpdCwgRElTUF9MT09LVVBfTkVHKSkgewogCQkvKiB3ZSBoYXZlIGxvb2t1cCBsb29rIC0gdW5oaWRlIGRlbnRyeSAqLwpAQCAtNDQ2LDkgKzQ3NSwyMCBAQAogCQlzdHJ1Y3QgbG9va3VwX2ludGVudCBwYXJlbnRfaXQgPSB7CiAJCQkJCS5pdF9vcCA9IElUX0dFVEFUVFIsCiAJCQkJCS5pdF9sb2NrX2hhbmRsZSA9IDAgfTsKKwkJc3RydWN0IGx1X2ZpZCBmaWQgPSBsbF9pMmluZm8ocGFyZW50KS0+bGxpX2ZpZDsKIAotCQlpZiAobWRfcmV2YWxpZGF0ZV9sb2NrKGxsX2kybWRleHAocGFyZW50KSwgJnBhcmVudF9pdCwKLQkJCQkgICAgICAgJmxsX2kyaW5mbyhwYXJlbnQpLT5sbGlfZmlkLCBOVUxMKSkgeworCQkvKiBJZiBpdCBpcyBzdHJpcGVkIGRpcmVjdG9yeSwgZ2V0IHRoZSByZWFsIHN0cmlwZSBwYXJlbnQgKi8KKwkJaWYgKHVubGlrZWx5KGxsX2kyaW5mbyhwYXJlbnQpLT5sbGlfbHNtX21kKSkgeworCQkJcmMgPSBtZF9nZXRfZmlkX2Zyb21fbHNtKGxsX2kybWRleHAocGFyZW50KSwKKwkJCQkJCSBsbF9pMmluZm8ocGFyZW50KS0+bGxpX2xzbV9tZCwKKwkJCQkJCSAoKmRlKS0+ZF9uYW1lLm5hbWUsCisJCQkJCQkgKCpkZSktPmRfbmFtZS5sZW4sICZmaWQpOworCQkJaWYgKHJjKQorCQkJCXJldHVybiByYzsKKwkJfQorCisJCWlmIChtZF9yZXZhbGlkYXRlX2xvY2sobGxfaTJtZGV4cChwYXJlbnQpLCAmcGFyZW50X2l0LCAmZmlkLAorCQkJCSAgICAgICBOVUxMKSkgewogCQkJZF9sdXN0cmVfcmV2YWxpZGF0ZSgqZGUpOwogCQkJbGxfaW50ZW50X3JlbGVhc2UoJnBhcmVudF9pdCk7CiAJCX0KQEAgLTQ2MiwxMyArNTAyLDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpsbF9sb29rdXBfaXQoc3RydWN0IGlub2RlICpwYXJlbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJCQkgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsIGludCBsb29rdXBfZmxhZ3MpCisJCQkJICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0KQogewogCXN0cnVjdCBsb29rdXBfaW50ZW50IGxvb2t1cF9pdCA9IHsgLml0X29wID0gSVRfTE9PS1VQIH07CiAJc3RydWN0IGRlbnRyeSAqc2F2ZSA9IGRlbnRyeSwgKnJldHZhbDsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSA9IE5VTEw7CisJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEgPSBOVUxMOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CiAJX191MzIgb3BjOwogCWludCByYzsKIApAQCAtNDg0LDggKzUyNCw4IEBACiAJaWYgKCFpdCB8fCBpdC0+aXRfb3AgPT0gSVRfR0VUWEFUVFIpCiAJCWl0ID0gJmxvb2t1cF9pdDsKIAotCWlmIChpdC0+aXRfb3AgPT0gSVRfR0VUQVRUUikgewotCQlyYyA9IGxsX3N0YXRhaGVhZF9lbnRlcihwYXJlbnQsICZkZW50cnksIDApOworCWlmIChpdC0+aXRfb3AgPT0gSVRfR0VUQVRUUiAmJiBkZW50cnlfbWF5X3N0YXRhaGVhZChwYXJlbnQsIGRlbnRyeSkpIHsKKwkJcmMgPSBsbF9zdGF0YWhlYWQocGFyZW50LCAmZGVudHJ5LCAwKTsKIAkJaWYgKHJjID09IDEpIHsKIAkJCWlmIChkZW50cnkgPT0gc2F2ZSkKIAkJCQlyZXR2YWwgPSBOVUxMOwpAQCAtNTAxLDggKzU0MSw3IEBACiAJCW9wYyA9IExVU1RSRV9PUENfQU5ZOwogCiAJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBwYXJlbnQsIE5VTEwsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCi0JCQkJICAgICBkZW50cnktPmRfbmFtZS5sZW4sIGxvb2t1cF9mbGFncywgb3BjLAotCQkJCSAgICAgTlVMTCk7CisJCQkJICAgICBkZW50cnktPmRfbmFtZS5sZW4sIDAsIG9wYywgTlVMTCk7CiAJaWYgKElTX0VSUihvcF9kYXRhKSkKIAkJcmV0dXJuICh2b2lkICopb3BfZGF0YTsKIApAQCAtNTEwLDkgKzU0OSwzOCBAQAogCWlmICghSVNfUE9TSVhBQ0wocGFyZW50KSB8fCAhZXhwX2Nvbm5lY3RfdW1hc2sobGxfaTJtZGV4cChwYXJlbnQpKSkKIAkJaXQtPml0X2NyZWF0ZV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAKLQlyYyA9IG1kX2ludGVudF9sb2NrKGxsX2kybWRleHAocGFyZW50KSwgb3BfZGF0YSwgTlVMTCwgMCwgaXQsCi0JCQkgICAgbG9va3VwX2ZsYWdzLCAmcmVxLCBsbF9tZF9ibG9ja2luZ19hc3QsIDApOwotCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOworCXJjID0gbWRfaW50ZW50X2xvY2sobGxfaTJtZGV4cChwYXJlbnQpLCBvcF9kYXRhLCBpdCwgJnJlcSwKKwkJCSAgICAmbGxfbWRfYmxvY2tpbmdfYXN0LCAwKTsKKwkvKgorCSAqIElmIHRoZSBNRFMgYWxsb3dzIHRoZSBjbGllbnQgdG8gY2hncnAgKENGU19TRVRHUlBfUEVSTSksIGJ1dCB0aGUKKwkgKiBjbGllbnQgZG9lcyBub3Qga25vdyB3aGljaCBzdXBwZ2lkIHNob3VsZCBiZSBzZW50IHRvIHRoZSBNRFMsIG9yCisJICogc29tZSBvdGhlcihzKSBjaGFuZ2VkIHRoZSB0YXJnZXQgZmlsZSdzIEdJRCBhZnRlciB0aGlzIFJQQyBzZW50CisJICogdG8gdGhlIE1EUyB3aXRoIHRoZSBzdXBwZ2lkIGFzIHRoZSBvcmlnaW5hbCBHSUQsIHRoZW4gd2Ugc2hvdWxkCisJICogdHJ5IGFnYWluIHdpdGggcmlnaHQgc3VwcGdpZC4KKwkgKi8KKwlpZiAocmMgPT0gLUVBQ0NFUyAmJiBpdC0+aXRfb3AgJiBJVF9PUEVOICYmCisJICAgIGl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX09QRU5fREVOWSkpIHsKKwkJc3RydWN0IG1kdF9ib2R5ICpib2R5OworCisJCUxBU1NFUlQocmVxKTsKKworCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKKwkJaWYgKG9wX2RhdGEtPm9wX3N1cHBnaWRzWzBdID09IGJvZHktPm1ib19naWQgfHwKKwkJICAgIG9wX2RhdGEtPm9wX3N1cHBnaWRzWzFdID09IGJvZHktPm1ib19naWQgfHwKKwkJICAgICFpbl9ncm91cF9wKG1ha2Vfa2dpZCgmaW5pdF91c2VyX25zLCBib2R5LT5tYm9fZ2lkKSkpIHsKKwkJCXJldHZhbCA9IEVSUl9QVFIoLUVBQ0NFUyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWZpZF96ZXJvKCZvcF9kYXRhLT5vcF9maWQyKTsKKwkJb3BfZGF0YS0+b3Bfc3VwcGdpZHNbMV0gPSBib2R5LT5tYm9fZ2lkOworCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CisJCXJlcSA9IE5VTEw7CisJCWxsX2ludGVudF9yZWxlYXNlKGl0KTsKKwkJcmMgPSBtZF9pbnRlbnRfbG9jayhsbF9pMm1kZXhwKHBhcmVudCksIG9wX2RhdGEsIGl0LCAmcmVxLAorCQkJCSAgICBsbF9tZF9ibG9ja2luZ19hc3QsIDApOworCX0KKwogCWlmIChyYyA8IDApIHsKIAkJcmV0dmFsID0gRVJSX1BUUihyYyk7CiAJCWdvdG8gb3V0OwpAQCAtNTM3LDExICs2MDUsMTEgQEAKIAkJcmV0dmFsID0gTlVMTDsKIAllbHNlCiAJCXJldHZhbCA9IGRlbnRyeTsKLSBvdXQ6Ci0JaWYgKHJlcSkKLQkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwotCWlmIChpdC0+aXRfb3AgPT0gSVRfR0VUQVRUUiAmJiAoIXJldHZhbCB8fCByZXR2YWwgPT0gZGVudHJ5KSkKLQkJbGxfc3RhdGFoZWFkX21hcmsocGFyZW50LCBkZW50cnkpOworb3V0OgorCWlmIChvcF9kYXRhICYmICFJU19FUlIob3BfZGF0YSkpCisJCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOworCisJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTU1NCwxNSArNjIyLDE5IEBACiAJQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6bmFtZT0lcGQsIGRpcj0iREZJRCIoJXApLGZsYWdzPSV1XG4iLAogCSAgICAgICBkZW50cnksIFBGSUQobGxfaW5vZGUyZmlkKHBhcmVudCkpLCBwYXJlbnQsIGZsYWdzKTsKIAotCS8qIE9wdGltaXplIGF3YXkgKENSRUFURSAmJiAhT1BFTikuIExldCAuY3JlYXRlIGhhbmRsZSB0aGUgcmFjZS4gKi8KLQlpZiAoKGZsYWdzICYgTE9PS1VQX0NSRUFURSkgJiYgIShmbGFncyAmIExPT0tVUF9PUEVOKSkKKwkvKiBPcHRpbWl6ZSBhd2F5IChDUkVBVEUgJiYgIU9QRU4pLiBMZXQgLmNyZWF0ZSBoYW5kbGUgdGhlIHJhY2UuCisJICogYnV0IG9ubHkgaWYgd2UgaGF2ZSB3cml0ZSBwZXJtaXNzaW9ucyB0aGVyZSwgb3RoZXJ3aXNlIHdlIG5lZWQKKwkgKiB0byBwcm9jZWVkIHdpdGggbG9va3VwLiBMVS00MTg1CisJICovCisJaWYgKChmbGFncyAmIExPT0tVUF9DUkVBVEUpICYmICEoZmxhZ3MgJiBMT09LVVBfT1BFTikgJiYKKwkgICAgKGlub2RlX3Blcm1pc3Npb24ocGFyZW50LCBNQVlfV1JJVEUgfCBNQVlfRVhFQykgPT0gMCkpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKGZsYWdzICYgKExPT0tVUF9QQVJFTlR8TE9PS1VQX09QRU58TE9PS1VQX0NSRUFURSkpCisJaWYgKGZsYWdzICYgKExPT0tVUF9QQVJFTlQgfCBMT09LVVBfT1BFTiB8IExPT0tVUF9DUkVBVEUpKQogCQlpdHAgPSBOVUxMOwogCWVsc2UKIAkJaXRwID0gJml0OwotCWRlID0gbGxfbG9va3VwX2l0KHBhcmVudCwgZGVudHJ5LCBpdHAsIDApOworCWRlID0gbGxfbG9va3VwX2l0KHBhcmVudCwgZGVudHJ5LCBpdHApOwogCiAJaWYgKGl0cCkKIAkJbGxfaW50ZW50X3JlbGVhc2UoaXRwKTsKQEAgLTU4MCwyNyArNjUyLDQzIEBACiB7CiAJc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0OwogCXN0cnVjdCBkZW50cnkgKmRlOwotCWxvbmcgbG9uZyBsb29rdXBfZmxhZ3MgPSBMT09LVVBfT1BFTjsKIAlpbnQgcmMgPSAwOwogCiAJQ0RFQlVHKERfVkZTVFJBQ0UsICJWRlMgT3A6bmFtZT0lcGQsIGRpcj0iREZJRCIoJXApLGZpbGUgJXAsb3Blbl9mbGFncyAleCxtb2RlICV4IG9wZW5lZCAlZFxuIiwKIAkgICAgICAgZGVudHJ5LCBQRklEKGxsX2lub2RlMmZpZChkaXIpKSwgZGlyLCBmaWxlLCBvcGVuX2ZsYWdzLCBtb2RlLAogCSAgICAgICAqb3BlbmVkKTsKIAorCS8qIE9ubHkgbmVnYXRpdmUgZGVudHJpZXMgZW50ZXIgaGVyZSAqLworCUxBU1NFUlQoIWRfaW5vZGUoZGVudHJ5KSk7CisKKwlpZiAoIWRfaW5fbG9va3VwKGRlbnRyeSkpIHsKKwkJLyogQSB2YWxpZCBuZWdhdGl2ZSBkZW50cnkgdGhhdCBqdXN0IHBhc3NlZCByZXZhbGlkYXRpb24sCisJCSAqIHRoZXJlJ3MgbGl0dGxlIHBvaW50IHRvIHRyeSBhbmQgb3BlbiBpdCBzZXJ2ZXItc2lkZSwKKwkJICogZXZlbiB0aG91Z2ggdGhlcmUncyBhIG1pbnVzY2xlIGNoYW5jZSBpdCBtaWdodCBzdWNjZWVkLgorCQkgKiBFaXRoZXIgd2F5IGl0J3MgYSB2YWxpZCByYWNlIHRvIGp1c3QgcmV0dXJuIC1FTk9FTlQgaGVyZS4KKwkJICovCisJCWlmICghKG9wZW5fZmxhZ3MgJiBPX0NSRUFUKSkKKwkJCXJldHVybiAtRU5PRU5UOworCisJCS8qIE90aGVyd2lzZSB3ZSBqdXN0IHVuaGFzaCBpdCB0byBiZSByZWhhc2hlZCBhZnJlc2ggdmlhCisJCSAqIGxvb2t1cCBpZiBuZWNlc3NhcnkKKwkJICovCisJCWRfZHJvcChkZW50cnkpOworCX0KKwogCWl0ID0ga3phbGxvYyhzaXplb2YoKml0KSwgR0ZQX05PRlMpOwogCWlmICghaXQpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaXQtPml0X29wID0gSVRfT1BFTjsKLQlpZiAob3Blbl9mbGFncyAmIE9fQ1JFQVQpIHsKKwlpZiAob3Blbl9mbGFncyAmIE9fQ1JFQVQpCiAJCWl0LT5pdF9vcCB8PSBJVF9DUkVBVDsKLQkJbG9va3VwX2ZsYWdzIHw9IExPT0tVUF9DUkVBVEU7Ci0JfQogCWl0LT5pdF9jcmVhdGVfbW9kZSA9IChtb2RlICYgU19JQUxMVUdPKSB8IFNfSUZSRUc7CiAJaXQtPml0X2ZsYWdzID0gKG9wZW5fZmxhZ3MgJiB+T19BQ0NNT0RFKSB8IE9QRU5fRk1PREUob3Blbl9mbGFncyk7CisJaXQtPml0X2ZsYWdzICY9IH5NRFNfT1BFTl9GTF9JTlRFUk5BTDsKIAogCS8qIERlbnRyeSBhZGRlZCB0byBkY2FjaGUgdHJlZSBpbiBsbF9sb29rdXBfaXQgKi8KLQlkZSA9IGxsX2xvb2t1cF9pdChkaXIsIGRlbnRyeSwgaXQsIGxvb2t1cF9mbGFncyk7CisJZGUgPSBsbF9sb29rdXBfaXQoZGlyLCBkZW50cnksIGl0KTsKIAlpZiAoSVNfRVJSKGRlKSkKIAkJcmMgPSBQVFJfRVJSKGRlKTsKIAllbHNlIGlmIChkZSkKQEAgLTYwOSw3ICs2OTcsNyBAQAogCWlmICghcmMpIHsKIAkJaWYgKGl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX09QRU5fQ1JFQVRFKSkgewogCQkJLyogRGVudHJ5IGluc3RhbnRpYXRlZCBpbiBsbF9jcmVhdGVfaXQuICovCi0JCQlyYyA9IGxsX2NyZWF0ZV9pdChkaXIsIGRlbnRyeSwgbW9kZSwgaXQpOworCQkJcmMgPSBsbF9jcmVhdGVfaXQoZGlyLCBkZW50cnksIGl0KTsKIAkJCWlmIChyYykgewogCQkJCS8qIFdlIGRnZXQgaW4gbGxfc3BsaWNlX2FsaWFzLiAqLwogCQkJCWlmIChkZSkKQEAgLTY5NSw3ICs3ODMsNyBAQAogICogSWYgdGhlIGNyZWF0ZSBzdWNjZWVkcywgd2UgZmlsbCBpbiB0aGUgaW5vZGUgaW5mb3JtYXRpb24KICAqIHdpdGggZF9pbnN0YW50aWF0ZSgpLgogICovCi1zdGF0aWMgaW50IGxsX2NyZWF0ZV9pdChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKK3N0YXRpYyBpbnQgbGxfY3JlYXRlX2l0KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQlzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZTsKQEAgLTcxNiwyNyArODA0LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGxsX3VwZGF0ZV90aW1lcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QsCi0JCQkgICAgc3RydWN0IGlub2RlICppbm9kZSkKK3ZvaWQgbGxfdXBkYXRlX3RpbWVzKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCwgc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXF1ZXN0LT5ycV9waWxsLAogCQkJCQkJICAgICAgICZSTUZfTURUX0JPRFkpOwogCiAJTEFTU0VSVChib2R5KTsKLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxNVElNRSAmJgotCSAgICBib2R5LT5tdGltZSA+IExUSU1FX1MoaW5vZGUtPmlfbXRpbWUpKSB7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTE1USU1FICYmCisJICAgIGJvZHktPm1ib19tdGltZSA+IExUSU1FX1MoaW5vZGUtPmlfbXRpbWUpKSB7CiAJCUNERUJVRyhEX0lOT0RFLCAic2V0dGluZyBmaWQgIkRGSUQiIG10aW1lIGZyb20gJWx1IHRvICVsbHVcbiIsCiAJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBMVElNRV9TKGlub2RlLT5pX210aW1lKSwKLQkJICAgICAgIGJvZHktPm10aW1lKTsKLQkJTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkgPSBib2R5LT5tdGltZTsKKwkJICAgICAgIGJvZHktPm1ib19tdGltZSk7CisJCUxUSU1FX1MoaW5vZGUtPmlfbXRpbWUpID0gYm9keS0+bWJvX210aW1lOwogCX0KLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxDVElNRSAmJgotCSAgICBib2R5LT5jdGltZSA+IExUSU1FX1MoaW5vZGUtPmlfY3RpbWUpKQotCQlMVElNRV9TKGlub2RlLT5pX2N0aW1lKSA9IGJvZHktPmN0aW1lOworCWlmIChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxDVElNRSAmJgorCSAgICBib2R5LT5tYm9fY3RpbWUgPiBMVElNRV9TKGlub2RlLT5pX2N0aW1lKSkKKwkJTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkgPSBib2R5LT5tYm9fY3RpbWU7CiB9CiAKIHN0YXRpYyBpbnQgbGxfbmV3X25vZGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKLQkJICAgICAgIGNvbnN0IGNoYXIgKnRndCwgaW50IG1vZGUsIGludCByZGV2LAorCQkgICAgICAgY29uc3QgY2hhciAqdGd0LCB1bW9kZV90IG1vZGUsIGludCByZGV2LAogCQkgICAgICAgX191MzIgb3BjKQogewogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCA9IE5VTEw7CkBAIC03NDgsNyArODM1LDcgQEAKIAogCWlmICh1bmxpa2VseSh0Z3QpKQogCQl0Z3RfbGVuID0gc3RybGVuKHRndCkgKyAxOwotCithZ2FpbjoKIAlvcF9kYXRhID0gbGxfcHJlcF9tZF9vcF9kYXRhKE5VTEwsIGRpciwgTlVMTCwKIAkJCQkgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkJICAgICBkZW50cnktPmRfbmFtZS5sZW4sCkBAIC03NjMsOSArODUwLDQ1IEBACiAJCQlmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgY3VycmVudF9mc2dpZCgpKSwKIAkJCWNmc19jdXJwcm9jX2NhcF9wYWNrKCksIHJkZXYsICZyZXF1ZXN0KTsKIAlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKLQlpZiAoZXJyKQorCWlmIChlcnIgPCAwICYmIGVyciAhPSAtRVJFTU9URSkKIAkJZ290byBlcnJfZXhpdDsKIAorCS8qCisJICogSWYgdGhlIGNsaWVudCBkb2Vzbid0IGtub3cgd2hlcmUgdG8gY3JlYXRlIGEgc3ViZGlyZWN0b3J5IChvcgorCSAqIGluIGNhc2Ugb2YgYSByYWNlIHRoYXQgc2VuZHMgdGhlIFJQQyB0byB0aGUgd3JvbmcgTURTKSwgdGhlCisJICogTURTIHdpbGwgcmV0dXJuIC1FUkVNT1RFIGFuZCB0aGUgY2xpZW50IHdpbGwgZmV0Y2ggdGhlIGxheW91dAorCSAqIG9mIHRoZSBkaXJlY3RvcnksIHRoZW4gY3JlYXRlIHRoZSBkaXJlY3Rvcnkgb24gdGhlIHJpZ2h0IE1EVC4KKwkgKi8KKwlpZiAodW5saWtlbHkoZXJyID09IC1FUkVNT1RFKSkgeworCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGRpcik7CisJCXN0cnVjdCBsbXZfdXNlcl9tZCAqbHVtOworCQlpbnQgbHVtc2l6ZSwgZXJyMjsKKworCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOworCQlyZXF1ZXN0ID0gTlVMTDsKKworCQllcnIyID0gbGxfZGlyX2dldHN0cmlwZShkaXIsICh2b2lkICoqKSZsdW0sICZsdW1zaXplLCAmcmVxdWVzdCwKKwkJCQkJT0JEX01EX0RFRkFVTFRfTUVBKTsKKwkJaWYgKCFlcnIyKSB7CisJCQkvKiBVcGRhdGUgc3RyaXBlX29mZnNldCBhbmQgcmV0cnkgKi8KKwkJCWxsaS0+bGxpX2RlZl9zdHJpcGVfb2Zmc2V0ID0gbHVtLT5sdW1fc3RyaXBlX29mZnNldDsKKwkJfSBlbHNlIGlmIChlcnIyID09IC1FTk9EQVRBICYmCisJCQkgICBsbGktPmxsaV9kZWZfc3RyaXBlX29mZnNldCAhPSAtMSkgeworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGFyZSBubyBkZWZhdWx0IHN0cmlwZSBFQSBvbiB0aGUgTURULCBidXQgdGhlCisJCQkgKiBjbGllbnQgaGFzIGRlZmF1bHQgc3RyaXBlLCB0aGVuIGl0IHByb2JhYmx5IG1lYW5zCisJCQkgKiBkZWZhdWx0IHN0cmlwZSBFQSBoYXMganVzdCBiZWVuIGRlbGV0ZWQuCisJCQkgKi8KKwkJCWxsaS0+bGxpX2RlZl9zdHJpcGVfb2Zmc2V0ID0gLTE7CisJCX0gZWxzZSB7CisJCQlnb3RvIGVycl9leGl0OworCQl9CisKKwkJcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKKwkJcmVxdWVzdCA9IE5VTEw7CisJCWdvdG8gYWdhaW47CisJfQorCiAJbGxfdXBkYXRlX3RpbWVzKHJlcXVlc3QsIGRpcik7CiAKIAllcnIgPSBsbF9wcmVwX2lub2RlKCZpbm9kZSwgcmVxdWVzdCwgZGlyLT5pX3NiLCBOVUxMKTsKQEAgLTc3NCw3ICs4OTcsOCBAQAogCiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIGVycl9leGl0OgotCXB0bHJwY19yZXFfZmluaXNoZWQocmVxdWVzdCk7CisJaWYgKHJlcXVlc3QpCisJCXB0bHJwY19yZXFfZmluaXNoZWQocmVxdWVzdCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtODM3LDc3ICs5NjEsNiBAQAogCXJldHVybiByYzsKIH0KIAotaW50IGxsX29iamVjdHNfZGVzdHJveShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QsIHN0cnVjdCBpbm9kZSAqZGlyKQotewotCXN0cnVjdCBtZHRfYm9keSAqYm9keTsKLQlzdHJ1Y3QgbG92X21kc19tZCAqZWFkYXRhOwotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20gPSBOVUxMOwotCXN0cnVjdCBvYmRfdHJhbnNfaW5mbyBvdGkgPSB7IDAgfTsKLQlzdHJ1Y3Qgb2JkbyAqb2E7Ci0JaW50IHJjOwotCi0JLyogcmVxIGlzIHN3YWJiZWQgc28gdGhpcyBpcyBzYWZlICovCi0JYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcXVlc3QtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwotCWlmICghKGJvZHktPnZhbGlkICYgT0JEX01EX0ZMRUFTSVpFKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYm9keS0+ZWFkYXRhc2l6ZSA9PSAwKSB7Ci0JCUNFUlJPUigiT0JEX01EX0ZMRUFTSVpFIHNldCBidXQgZWFkYXRhc2l6ZSB6ZXJvXG4iKTsKLQkJcmMgPSAtRVBST1RPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBUaGUgTURTIHNlbnQgYmFjayB0aGUgRUEgYmVjYXVzZSB3ZSB1bmxpbmtlZCB0aGUgbGFzdCByZWZlcmVuY2UKLQkgKiB0byB0aGlzIGZpbGUuIFVzZSB0aGlzIEVBIHRvIHVubGluayB0aGUgb2JqZWN0cyBvbiB0aGUgT1NULgotCSAqIEl0J3Mgb3BhcXVlIHNvIHdlIGRvbid0IHN3YWIgaGVyZTsgd2UgbGVhdmUgaXQgdG8gb2JkX3VucGFja21kKCkgdG8KLQkgKiBjaGVjayBpdCBpcyBjb21wbGV0ZSBhbmQgc2Vuc2libGUuCi0JICovCi0JZWFkYXRhID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldCgmcmVxdWVzdC0+cnFfcGlsbCwgJlJNRl9NRFRfTUQsCi0JCQkJCSAgICAgIGJvZHktPmVhZGF0YXNpemUpOwotCUxBU1NFUlQoZWFkYXRhKTsKLQotCXJjID0gb2JkX3VucGFja21kKGxsX2kyZHRleHAoZGlyKSwgJmxzbSwgZWFkYXRhLCBib2R5LT5lYWRhdGFzaXplKTsKLQlpZiAocmMgPCAwKSB7Ci0JCUNFUlJPUigib2JkX3VucGFja21kOiAlZFxuIiwgcmMpOwotCQlnb3RvIG91dDsKLQl9Ci0JTEFTU0VSVChyYyA+PSBzaXplb2YoKmxzbSkpOwotCi0Jb2EgPSBrbWVtX2NhY2hlX3phbGxvYyhvYmRvX2NhY2hlcCwgR0ZQX05PRlMpOwotCWlmICghb2EpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9mcmVlX21lbW1kOwotCX0KLQotCW9hLT5vX29pID0gbHNtLT5sc21fb2k7Ci0Jb2EtPm9fbW9kZSA9IGJvZHktPm1vZGUgJiBTX0lGTVQ7Ci0Jb2EtPm9fdmFsaWQgPSBPQkRfTURfRkxJRCB8IE9CRF9NRF9GTFRZUEUgfCBPQkRfTURfRkxHUk9VUDsKLQotCWlmIChib2R5LT52YWxpZCAmIE9CRF9NRF9GTENPT0tJRSkgewotCQlvYS0+b192YWxpZCB8PSBPQkRfTURfRkxDT09LSUU7Ci0JCW90aS5vdGlfbG9nY29va2llcyA9Ci0JCQlyZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KCZyZXF1ZXN0LT5ycV9waWxsLAotCQkJCQkJICAgICAmUk1GX0xPR0NPT0tJRVMsCi0JCQkJCQkgICBzaXplb2Yoc3RydWN0IGxsb2dfY29va2llKSAqCi0JCQkJCQkgICAgIGxzbS0+bHNtX3N0cmlwZV9jb3VudCk7Ci0JCWlmICghb3RpLm90aV9sb2djb29raWVzKSB7Ci0JCQlvYS0+b192YWxpZCAmPSB+T0JEX01EX0ZMQ09PS0lFOwotCQkJYm9keS0+dmFsaWQgJj0gfk9CRF9NRF9GTENPT0tJRTsKLQkJfQotCX0KLQotCXJjID0gb2JkX2Rlc3Ryb3koTlVMTCwgbGxfaTJkdGV4cChkaXIpLCBvYSwgbHNtLCAmb3RpLAotCQkJIGxsX2kybWRleHAoZGlyKSk7Ci0JaWYgKHJjKQotCQlDRVJST1IoIm9iZCBkZXN0cm95IG9iamlkICJET1NUSUQiIGVycm9yICVkXG4iLAotCQkgICAgICAgUE9TVElEKCZsc20tPmxzbV9vaSksIHJjKTsKLW91dF9mcmVlX21lbW1kOgotCW9iZF9mcmVlX21lbW1kKGxsX2kyZHRleHAoZGlyKSwgJmxzbSk7Ci0Ja21lbV9jYWNoZV9mcmVlKG9iZG9fY2FjaGVwLCBvYSk7Ci1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCiAvKiBsbF91bmxpbmsoKSBkb2Vzbid0IHVwZGF0ZSB0aGUgaW5vZGUgd2l0aCB0aGUgbmV3IGxpbmsgY291bnQuCiAgKiBJbnN0ZWFkLCBsbF9kZGVsZXRlKCkgYW5kIGxsX2RfaXB1dCgpIHdpbGwgdXBkYXRlIGl0IGJhc2VkIHVwb24gaWYgdGhlcmUKICAqIGlzIGFueSBsb2NrIGV4aXN0aW5nLiBUaGV5IHdpbGwgcmVjeWNsZSBkZW50cmllcyBhbmQgaW5vZGVzIGJhc2VkIHVwb24gbG9ja3MKQEAgLTkyOSw3ICs5ODIsNyBAQAogCWlmIChJU19FUlIob3BfZGF0YSkpCiAJCXJldHVybiBQVFJfRVJSKG9wX2RhdGEpOwogCi0JaWYgKGRjaGlsZCAmJiBkY2hpbGQtPmRfaW5vZGUpCisJaWYgKGRjaGlsZC0+ZF9pbm9kZSkKIAkJb3BfZGF0YS0+b3BfZmlkMyA9ICpsbF9pbm9kZTJmaWQoZGNoaWxkLT5kX2lub2RlKTsKIAogCW9wX2RhdGEtPm9wX2ZpZDIgPSBvcF9kYXRhLT5vcF9maWQzOwpAQCAtOTQxLDcgKzk5NCw2IEBACiAJbGxfdXBkYXRlX3RpbWVzKHJlcXVlc3QsIGRpcik7CiAJbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGRpciksIExQUk9DX0xMX1VOTElOSywgMSk7CiAKLQlyYyA9IGxsX29iamVjdHNfZGVzdHJveShyZXF1ZXN0LCBkaXIpOwogIG91dDoKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcXVlc3QpOwogCXJldHVybiByYzsKQEAgLTk1Niw5ICsxMDA4LDkgQEAKIAogCWlmICghSVNfUE9TSVhBQ0woZGlyKSB8fCAhZXhwX2Nvbm5lY3RfdW1hc2sobGxfaTJtZGV4cChkaXIpKSkKIAkJbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwotCW1vZGUgPSAobW9kZSAmIChTX0lSV1hVR098U19JU1ZUWCkpIHwgU19JRkRJUjsKLQllcnIgPSBsbF9uZXdfbm9kZShkaXIsIGRlbnRyeSwgTlVMTCwgbW9kZSwgMCwgTFVTVFJFX09QQ19NS0RJUik7CisJbW9kZSA9IChtb2RlICYgKFNfSVJXWFVHTyB8IFNfSVNWVFgpKSB8IFNfSUZESVI7CiAKKwllcnIgPSBsbF9uZXdfbm9kZShkaXIsIGRlbnRyeSwgTlVMTCwgbW9kZSwgMCwgTFVTVFJFX09QQ19NS0RJUik7CiAJaWYgKCFlcnIpCiAJCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShkaXIpLCBMUFJPQ19MTF9NS0RJUiwgMSk7CiAKQEAgLTk4MSw3ICsxMDMzLDcgQEAKIAlpZiAoSVNfRVJSKG9wX2RhdGEpKQogCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKIAotCWlmIChkY2hpbGQgJiYgZGNoaWxkLT5kX2lub2RlKQorCWlmIChkY2hpbGQtPmRfaW5vZGUpCiAJCW9wX2RhdGEtPm9wX2ZpZDMgPSAqbGxfaW5vZGUyZmlkKGRjaGlsZC0+ZF9pbm9kZSk7CiAKIAlvcF9kYXRhLT5vcF9maWQyID0gb3BfZGF0YS0+b3BfZmlkMzsKQEAgLTEwNjIsOSArMTExNCw5IEBACiAJaWYgKElTX0VSUihvcF9kYXRhKSkKIAkJcmV0dXJuIFBUUl9FUlIob3BfZGF0YSk7CiAKLQlpZiAoc3JjX2RjaGlsZCAmJiBzcmNfZGNoaWxkLT5kX2lub2RlKQorCWlmIChzcmNfZGNoaWxkLT5kX2lub2RlKQogCQlvcF9kYXRhLT5vcF9maWQzID0gKmxsX2lub2RlMmZpZChzcmNfZGNoaWxkLT5kX2lub2RlKTsKLQlpZiAodGd0X2RjaGlsZCAmJiB0Z3RfZGNoaWxkLT5kX2lub2RlKQorCWlmICh0Z3RfZGNoaWxkLT5kX2lub2RlKQogCQlvcF9kYXRhLT5vcF9maWQ0ID0gKmxsX2lub2RlMmZpZCh0Z3RfZGNoaWxkLT5kX2lub2RlKTsKIAogCWVyciA9IG1kX3JlbmFtZShzYmktPmxsX21kX2V4cCwgb3BfZGF0YSwKQEAgLTEwNzcsNyArMTEyOSw2IEBACiAJCWxsX3VwZGF0ZV90aW1lcyhyZXF1ZXN0LCBzcmMpOwogCQlsbF91cGRhdGVfdGltZXMocmVxdWVzdCwgdGd0KTsKIAkJbGxfc3RhdHNfb3BzX3RhbGx5KHNiaSwgTFBST0NfTExfUkVOQU1FLCAxKTsKLQkJZXJyID0gbGxfb2JqZWN0c19kZXN0cm95KHJlcXVlc3QsIHNyYyk7CiAJfQogCiAJcHRscnBjX3JlcV9maW5pc2hlZChyZXF1ZXN0KTsKQEAgLTExMDEsMTAgKzExNTIsMTAgQEAKIAkuc2V0YXR0cgkgICAgPSBsbF9zZXRhdHRyLAogCS5nZXRhdHRyCSAgICA9IGxsX2dldGF0dHIsCiAJLnBlcm1pc3Npb24JID0gbGxfaW5vZGVfcGVybWlzc2lvbiwKLQkuc2V0eGF0dHIJICAgPSBsbF9zZXR4YXR0ciwKLQkuZ2V0eGF0dHIJICAgPSBsbF9nZXR4YXR0ciwKKwkuc2V0eGF0dHIJICAgPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgkgICA9IGdlbmVyaWNfZ2V0eGF0dHIsCiAJLmxpc3R4YXR0cgkgID0gbGxfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0cgk9IGxsX3JlbW92ZXhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAJLmdldF9hY2wJICAgID0gbGxfZ2V0X2FjbCwKIH07CiAKQEAgLTExMTIsOSArMTE2Myw5IEBACiAJLnNldGF0dHIJPSBsbF9zZXRhdHRyLAogCS5nZXRhdHRyCT0gbGxfZ2V0YXR0ciwKIAkucGVybWlzc2lvbiAgICAgPSBsbF9pbm9kZV9wZXJtaXNzaW9uLAotCS5zZXR4YXR0ciAgICAgICA9IGxsX3NldHhhdHRyLAotCS5nZXR4YXR0ciAgICAgICA9IGxsX2dldHhhdHRyLAorCS5zZXR4YXR0ciAgICAgICA9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyICAgICAgID0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyICAgICAgPSBsbF9saXN0eGF0dHIsCi0JLnJlbW92ZXhhdHRyICAgID0gbGxfcmVtb3ZleGF0dHIsCisJLnJlbW92ZXhhdHRyICAgID0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIAkuZ2V0X2FjbAkgICAgPSBsbF9nZXRfYWNsLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3JhbmdlX2xvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3JhbmdlX2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGM4MThmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcmFuZ2VfbG9jay5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogR1BMIEhFQURFUiBTVEFSVAorICoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQKKyAqIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlCisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sCisgKgorICogR1BMIEhFQURFUiBFTkQKKyAqLworLyoKKyAqIFJhbmdlIGxvY2sgaXMgdXNlZCB0byBhbGxvdyBtdWx0aXBsZSB0aHJlYWRzIHdyaXRpbmcgYSBzaW5nbGUgc2hhcmVkCisgKiBmaWxlIGdpdmVuIGVhY2ggdGhyZWFkIGlzIHdyaXRpbmcgdG8gYSBub24tb3ZlcmxhcHBpbmcgcG9ydGlvbiBvZiB0aGUKKyAqIGZpbGUuCisgKgorICogUmVmZXIgdG8gdGhlIHBvc3NpYmxlIHVwc3RyZWFtIGtlcm5lbCB2ZXJzaW9uIG9mIHJhbmdlIGxvY2sgYnkKKyAqIEphbiBLYXJhIDxqYWNrQHN1c2UuY3o+OiBodHRwczovL2xrbWwub3JnL2xrbWwvMjAxMy8xLzMxLzQ4MAorICoKKyAqIFRoaXMgZmlsZSBjb3VsZCBsYXRlciByZXBsYWNlZCBieSB0aGUgdXBzdHJlYW0ga2VybmVsIHZlcnNpb24uCisgKi8KKy8qCisgKiBBdXRob3I6IFByYWthc2ggU3VyeWEgPHN1cnlhMUBsbG5sLmdvdj4KKyAqIEF1dGhvcjogQm9iaSBKYW0gPGJvYmlqYW0ueHVAaW50ZWwuY29tPgorICovCisjaW5jbHVkZSAicmFuZ2VfbG9jay5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV91c2VyLmgiCisKKy8qKgorICogSW5pdGlhbGl6ZSBhIHJhbmdlIGxvY2sgdHJlZQorICoKKyAqIFxwYXJhbSB0cmVlIFtpbl0JYW4gZW1wdHkgcmFuZ2UgbG9jayB0cmVlCisgKgorICogUHJlOiAgQ2FsbGVyIHNob3VsZCBoYXZlIGFsbG9jYXRlZCB0aGUgcmFuZ2UgbG9jayB0cmVlLgorICogUG9zdDogVGhlIHJhbmdlIGxvY2sgdHJlZSBpcyByZWFkeSB0byBmdW5jdGlvbi4KKyAqLwordm9pZCByYW5nZV9sb2NrX3RyZWVfaW5pdChzdHJ1Y3QgcmFuZ2VfbG9ja190cmVlICp0cmVlKQoreworCXRyZWUtPnJsdF9yb290ID0gTlVMTDsKKwl0cmVlLT5ybHRfc2VxdWVuY2UgPSAwOworCXNwaW5fbG9ja19pbml0KCZ0cmVlLT5ybHRfbG9jayk7Cit9CisKKy8qKgorICogSW5pdGlhbGl6ZSBhIHJhbmdlIGxvY2sgbm9kZQorICoKKyAqIFxwYXJhbSBsb2NrICBbaW5dCWFuIGVtcHR5IHJhbmdlIGxvY2sgbm9kZQorICogXHBhcmFtIHN0YXJ0IFtpbl0Jc3RhcnQgb2YgdGhlIGNvdmVyaW5nIHJlZ2lvbgorICogXHBhcmFtIGVuZCAgIFtpbl0JZW5kIG9mIHRoZSBjb3ZlcmluZyByZWdpb24KKyAqCisgKiBQcmU6ICBDYWxsZXIgc2hvdWxkIGhhdmUgYWxsb2NhdGVkIHRoZSByYW5nZSBsb2NrIG5vZGUuCisgKiBQb3N0OiBUaGUgcmFuZ2UgbG9jayBub2RlIGlzIG1lYW50IHRvIGNvdmVyIFtzdGFydCwgZW5kXSByZWdpb24KKyAqLwordm9pZCByYW5nZV9sb2NrX2luaXQoc3RydWN0IHJhbmdlX2xvY2sgKmxvY2ssIF9fdTY0IHN0YXJ0LCBfX3U2NCBlbmQpCit7CisJbWVtc2V0KCZsb2NrLT5ybF9ub2RlLCAwLCBzaXplb2YobG9jay0+cmxfbm9kZSkpOworCWlmIChlbmQgIT0gTFVTVFJFX0VPRikKKwkJZW5kID4+PSBQQUdFX1NISUZUOworCWludGVydmFsX3NldCgmbG9jay0+cmxfbm9kZSwgc3RhcnQgPj4gUEFHRV9TSElGVCwgZW5kKTsKKwlJTklUX0xJU1RfSEVBRCgmbG9jay0+cmxfbmV4dF9sb2NrKTsKKwlsb2NrLT5ybF90YXNrID0gTlVMTDsKKwlsb2NrLT5ybF9sb2NrX2NvdW50ID0gMDsKKwlsb2NrLT5ybF9ibG9ja2luZ19yYW5nZXMgPSAwOworCWxvY2stPnJsX3NlcXVlbmNlID0gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmFuZ2VfbG9jayAqbmV4dF9sb2NrKHN0cnVjdCByYW5nZV9sb2NrICpsb2NrKQoreworCXJldHVybiBsaXN0X2VudHJ5KGxvY2stPnJsX25leHRfbG9jay5uZXh0LCB0eXBlb2YoKmxvY2spLCBybF9uZXh0X2xvY2spOworfQorCisvKioKKyAqIEhlbHBlciBmdW5jdGlvbiBvZiByYW5nZV91bmxvY2soKQorICoKKyAqIFxwYXJhbSBub2RlIFtpbl0JYSByYW5nZSBsb2NrIGZvdW5kIG92ZXJsYXBwZWQgZHVyaW5nIGludGVydmFsIG5vZGUKKyAqCQkJc2VhcmNoCisgKiBccGFyYW0gYXJnIFtpbl0JdGhlIHJhbmdlIGxvY2sgdG8gYmUgdGVzdGVkCisgKgorICogXHJldHZhbCBJTlRFUlZBTF9JVEVSX0NPTlQJaW5kaWNhdGUgdG8gY29udGludWUgdGhlIHNlYXJjaCBmb3IgbmV4dAorICoJCQkJb3ZlcmxhcHBpbmcgcmFuZ2Ugbm9kZQorICogXHJldHZhbCBJTlRFUlZBTF9JVEVSX1NUT1AJaW5kaWNhdGUgdG8gc3RvcCB0aGUgc2VhcmNoCisgKi8KK3N0YXRpYyBlbnVtIGludGVydmFsX2l0ZXIgcmFuZ2VfdW5sb2NrX2NiKHN0cnVjdCBpbnRlcnZhbF9ub2RlICpub2RlLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJhbmdlX2xvY2sgKmxvY2sgPSBhcmc7CisJc3RydWN0IHJhbmdlX2xvY2sgKm92ZXJsYXAgPSBub2RlMnJhbmdlbG9jayhub2RlKTsKKwlzdHJ1Y3QgcmFuZ2VfbG9jayAqaXRlcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRlciwgJm92ZXJsYXAtPnJsX25leHRfbG9jaywgcmxfbmV4dF9sb2NrKSB7CisJCWlmIChpdGVyLT5ybF9zZXF1ZW5jZSA+IGxvY2stPnJsX3NlcXVlbmNlKSB7CisJCQktLWl0ZXItPnJsX2Jsb2NraW5nX3JhbmdlczsKKwkJCUxBU1NFUlQoaXRlci0+cmxfYmxvY2tpbmdfcmFuZ2VzID4gMCk7CisJCX0KKwl9CisJaWYgKG92ZXJsYXAtPnJsX3NlcXVlbmNlID4gbG9jay0+cmxfc2VxdWVuY2UpIHsKKwkJLS1vdmVybGFwLT5ybF9ibG9ja2luZ19yYW5nZXM7CisJCWlmIChvdmVybGFwLT5ybF9ibG9ja2luZ19yYW5nZXMgPT0gMCkKKwkJCXdha2VfdXBfcHJvY2VzcyhvdmVybGFwLT5ybF90YXNrKTsKKwl9CisJcmV0dXJuIElOVEVSVkFMX0lURVJfQ09OVDsKK30KKworLyoqCisgKiBVbmxvY2sgYSByYW5nZSBsb2NrLCB3YWtlIHVwIGxvY2tzIGJsb2NrZWQgYnkgdGhpcyBsb2NrLgorICoKKyAqIFxwYXJhbSB0cmVlIFtpbl0JcmFuZ2UgbG9jayB0cmVlCisgKiBccGFyYW0gbG9jayBbaW5dCXJhbmdlIGxvY2sgdG8gYmUgZGVsZXRlZAorICoKKyAqIElmIHRoaXMgbG9jayBoYXMgYmVlbiBncmFudGVkLCByZWxhc2UgaXQ7IGlmIG5vdCwganVzdCBkZWxldGUgaXQgZnJvbQorICogdGhlIHRyZWUgb3IgdGhlIHNhbWUgcmVnaW9uIGxvY2sgbGlzdC4gV2FrZSB1cCB0aG9zZSBsb2NrcyBvbmx5IGJsb2NrZWQKKyAqIGJ5IHRoaXMgbG9jayB0aHJvdWdoIHJhbmdlX3VubG9ja19jYigpLgorICovCit2b2lkIHJhbmdlX3VubG9jayhzdHJ1Y3QgcmFuZ2VfbG9ja190cmVlICp0cmVlLCBzdHJ1Y3QgcmFuZ2VfbG9jayAqbG9jaykKK3sKKwlzcGluX2xvY2soJnRyZWUtPnJsdF9sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmxvY2stPnJsX25leHRfbG9jaykpIHsKKwkJc3RydWN0IHJhbmdlX2xvY2sgKm5leHQ7CisKKwkJaWYgKGludGVydmFsX2lzX2ludHJlZSgmbG9jay0+cmxfbm9kZSkpIHsgLyogZmlyc3QgbG9jayAqLworCQkJLyogSW5zZXJ0IHRoZSBuZXh0IHNhbWUgcmFuZ2UgbG9jayBpbnRvIHRoZSB0cmVlICovCisJCQluZXh0ID0gbmV4dF9sb2NrKGxvY2spOworCQkJbmV4dC0+cmxfbG9ja19jb3VudCA9IGxvY2stPnJsX2xvY2tfY291bnQgLSAxOworCQkJaW50ZXJ2YWxfZXJhc2UoJmxvY2stPnJsX25vZGUsICZ0cmVlLT5ybHRfcm9vdCk7CisJCQlpbnRlcnZhbF9pbnNlcnQoJm5leHQtPnJsX25vZGUsICZ0cmVlLT5ybHRfcm9vdCk7CisJCX0gZWxzZSB7CisJCQkvKiBmaW5kIHRoZSBmaXJzdCBsb2NrIGluIHRyZWUgKi8KKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkobmV4dCwgJmxvY2stPnJsX25leHRfbG9jaywKKwkJCQkJICAgIHJsX25leHRfbG9jaykgeworCQkJCWlmICghaW50ZXJ2YWxfaXNfaW50cmVlKCZuZXh0LT5ybF9ub2RlKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlMQVNTRVJUKG5leHQtPnJsX2xvY2tfY291bnQgPiAwKTsKKwkJCQluZXh0LT5ybF9sb2NrX2NvdW50LS07CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbGlzdF9kZWxfaW5pdCgmbG9jay0+cmxfbmV4dF9sb2NrKTsKKwl9IGVsc2UgeworCQlMQVNTRVJUKGludGVydmFsX2lzX2ludHJlZSgmbG9jay0+cmxfbm9kZSkpOworCQlpbnRlcnZhbF9lcmFzZSgmbG9jay0+cmxfbm9kZSwgJnRyZWUtPnJsdF9yb290KTsKKwl9CisKKwlpbnRlcnZhbF9zZWFyY2godHJlZS0+cmx0X3Jvb3QsICZsb2NrLT5ybF9ub2RlLmluX2V4dGVudCwKKwkJCXJhbmdlX3VubG9ja19jYiwgbG9jayk7CisJc3Bpbl91bmxvY2soJnRyZWUtPnJsdF9sb2NrKTsKK30KKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb24gb2YgcmFuZ2VfbG9jaygpCisgKgorICogXHBhcmFtIG5vZGUgW2luXQlhIHJhbmdlIGxvY2sgZm91bmQgb3ZlcmxhcHBlZCBkdXJpbmcgaW50ZXJ2YWwgbm9kZQorICoJCQlzZWFyY2gKKyAqIFxwYXJhbSBhcmcgW2luXQl0aGUgcmFuZ2UgbG9jayB0byBiZSB0ZXN0ZWQKKyAqCisgKiBccmV0dmFsIElOVEVSVkFMX0lURVJfQ09OVAlpbmRpY2F0ZSB0byBjb250aW51ZSB0aGUgc2VhcmNoIGZvciBuZXh0CisgKgkJCQlvdmVybGFwcGluZyByYW5nZSBub2RlCisgKiBccmV0dmFsIElOVEVSVkFMX0lURVJfU1RPUAlpbmRpY2F0ZSB0byBzdG9wIHRoZSBzZWFyY2gKKyAqLworc3RhdGljIGVudW0gaW50ZXJ2YWxfaXRlciByYW5nZV9sb2NrX2NiKHN0cnVjdCBpbnRlcnZhbF9ub2RlICpub2RlLCB2b2lkICphcmcpCit7CisJc3RydWN0IHJhbmdlX2xvY2sgKmxvY2sgPSAoc3RydWN0IHJhbmdlX2xvY2sgKilhcmc7CisJc3RydWN0IHJhbmdlX2xvY2sgKm92ZXJsYXAgPSBub2RlMnJhbmdlbG9jayhub2RlKTsKKworCWxvY2stPnJsX2Jsb2NraW5nX3JhbmdlcyArPSBvdmVybGFwLT5ybF9sb2NrX2NvdW50ICsgMTsKKwlyZXR1cm4gSU5URVJWQUxfSVRFUl9DT05UOworfQorCisvKioKKyAqIExvY2sgYSByZWdpb24KKyAqCisgKiBccGFyYW0gdHJlZSBbaW5dCXJhbmdlIGxvY2sgdHJlZQorICogXHBhcmFtIGxvY2sgW2luXQlyYW5nZSBsb2NrIG5vZGUgY29udGFpbmluZyB0aGUgcmVnaW9uIHNwYW4KKyAqCisgKiBccmV0dmFsIDAJZ2V0IHRoZSByYW5nZSBsb2NrCisgKiBccmV0dmFsIDwwCWVycm9yIGNvZGUgd2hpbGUgbm90IGdldHRpbmcgdGhlIHJhbmdlIGxvY2sKKyAqCisgKiBJZiB0aGVyZSBleGlzdHMgb3ZlcmxhcHBpbmcgcmFuZ2UgbG9jaywgdGhlIG5ldyBsb2NrIHdpbGwgd2FpdCBhbmQKKyAqIHJldHJ5LCBpZiBsYXRlciBpdCBmaW5kIHRoYXQgaXQgaXMgbm90IHRoZSBjaG9zZW4gb25lIHRvIHdha2UgdXAsCisgKiBpdCB3YWl0IGFnYWluLgorICovCitpbnQgcmFuZ2VfbG9jayhzdHJ1Y3QgcmFuZ2VfbG9ja190cmVlICp0cmVlLCBzdHJ1Y3QgcmFuZ2VfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgaW50ZXJ2YWxfbm9kZSAqbm9kZTsKKwlpbnQgcmMgPSAwOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5ybHRfbG9jayk7CisJLyoKKwkgKiBXZSBuZWVkIHRvIGNoZWNrIGZvciBhbGwgY29uZmxpY3RpbmcgaW50ZXJ2YWxzCisJICogYWxyZWFkeSBpbiB0aGUgdHJlZS4KKwkgKi8KKwlpbnRlcnZhbF9zZWFyY2godHJlZS0+cmx0X3Jvb3QsICZsb2NrLT5ybF9ub2RlLmluX2V4dGVudCwKKwkJCXJhbmdlX2xvY2tfY2IsIGxvY2spOworCS8qCisJICogSW5zZXJ0IHRvIHRoZSB0cmVlIGlmIEkgYW0gdW5pcXVlLCBvdGhlcndpc2UgSSd2ZSBiZWVuIGxpbmtlZCB0bworCSAqIHRoZSBybF9uZXh0X2xvY2sgb2YgYW5vdGhlciBsb2NrIHdoaWNoIGhhcyB0aGUgc2FtZSByYW5nZSBhcyBtaW5lCisJICogaW4gcmFuZ2VfbG9ja19jYigpLgorCSAqLworCW5vZGUgPSBpbnRlcnZhbF9pbnNlcnQoJmxvY2stPnJsX25vZGUsICZ0cmVlLT5ybHRfcm9vdCk7CisJaWYgKG5vZGUpIHsKKwkJc3RydWN0IHJhbmdlX2xvY2sgKnRtcCA9IG5vZGUycmFuZ2Vsb2NrKG5vZGUpOworCisJCWxpc3RfYWRkX3RhaWwoJmxvY2stPnJsX25leHRfbG9jaywgJnRtcC0+cmxfbmV4dF9sb2NrKTsKKwkJdG1wLT5ybF9sb2NrX2NvdW50Kys7CisJfQorCWxvY2stPnJsX3NlcXVlbmNlID0gKyt0cmVlLT5ybHRfc2VxdWVuY2U7CisKKwl3aGlsZSAobG9jay0+cmxfYmxvY2tpbmdfcmFuZ2VzID4gMCkgeworCQlsb2NrLT5ybF90YXNrID0gY3VycmVudDsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9jaygmdHJlZS0+cmx0X2xvY2spOworCQlzY2hlZHVsZSgpOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmFuZ2VfdW5sb2NrKHRyZWUsIGxvY2spOworCQkJcmMgPSAtRUlOVFI7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzcGluX2xvY2soJnRyZWUtPnJsdF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJnRyZWUtPnJsdF9sb2NrKTsKK291dDoKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9yYW5nZV9sb2NrLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9yYW5nZV9sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkMDRhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3JhbmdlX2xvY2suaApAQCAtMCwwICsxLDgyIEBACisvKgorICogR1BMIEhFQURFUiBTVEFSVAorICoKKyAqIERPIE5PVCBBTFRFUiBPUiBSRU1PVkUgQ09QWVJJR0hUIE5PVElDRVMgT1IgVEhJUyBGSUxFIEhFQURFUi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb25seSwKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBmb3IgbW9yZSBkZXRhaWxzIChhIGNvcHkgaXMgaW5jbHVkZWQKKyAqIGluIHRoZSBMSUNFTlNFIGZpbGUgdGhhdCBhY2NvbXBhbmllZCB0aGlzIGNvZGUpLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5vdCwgc2VlCisgKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC5odG1sCisgKgorICogR1BMIEhFQURFUiBFTkQKKyAqLworLyoKKyAqIFJhbmdlIGxvY2sgaXMgdXNlZCB0byBhbGxvdyBtdWx0aXBsZSB0aHJlYWRzIHdyaXRpbmcgYSBzaW5nbGUgc2hhcmVkCisgKiBmaWxlIGdpdmVuIGVhY2ggdGhyZWFkIGlzIHdyaXRpbmcgdG8gYSBub24tb3ZlcmxhcHBpbmcgcG9ydGlvbiBvZiB0aGUKKyAqIGZpbGUuCisgKgorICogUmVmZXIgdG8gdGhlIHBvc3NpYmxlIHVwc3RyZWFtIGtlcm5lbCB2ZXJzaW9uIG9mIHJhbmdlIGxvY2sgYnkKKyAqIEphbiBLYXJhIDxqYWNrQHN1c2UuY3o+OiBodHRwczovL2xrbWwub3JnL2xrbWwvMjAxMy8xLzMxLzQ4MAorICoKKyAqIFRoaXMgZmlsZSBjb3VsZCBsYXRlciByZXBsYWNlZCBieSB0aGUgdXBzdHJlYW0ga2VybmVsIHZlcnNpb24uCisgKi8KKy8qCisgKiBBdXRob3I6IFByYWthc2ggU3VyeWEgPHN1cnlhMUBsbG5sLmdvdj4KKyAqIEF1dGhvcjogQm9iaSBKYW0gPGJvYmlqYW0ueHVAaW50ZWwuY29tPgorICovCisjaWZuZGVmIF9SQU5HRV9MT0NLX0gKKyNkZWZpbmUgX1JBTkdFX0xPQ0tfSAorCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9pbnRlcnZhbF90cmVlLmgiCisKK3N0cnVjdCByYW5nZV9sb2NrIHsKKwlzdHJ1Y3QgaW50ZXJ2YWxfbm9kZQlybF9ub2RlOworCS8qKgorCSAqIFByb2Nlc3MgdG8gZW5xdWV1ZSB0aGlzIGxvY2suCisJICovCisJc3RydWN0IHRhc2tfc3RydWN0CSpybF90YXNrOworCS8qKgorCSAqIExpc3Qgb2YgbG9ja3Mgd2l0aCB0aGUgc2FtZSByYW5nZS4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXJsX25leHRfbG9jazsKKwkvKioKKwkgKiBOdW1iZXIgb2YgbG9ja3MgaW4gdGhlIGxpc3QgcmxfbmV4dF9sb2NrCisJICovCisJdW5zaWduZWQgaW50CQlybF9sb2NrX2NvdW50OworCS8qKgorCSAqIE51bWJlciBvZiByYW5nZXMgd2hpY2ggYXJlIGJsb2NraW5nIGFjcXVpc2l0aW9uIG9mIHRoZSBsb2NrCisJICovCisJdW5zaWduZWQgaW50CQlybF9ibG9ja2luZ19yYW5nZXM7CisJLyoqCisJICogU2VxdWVuY2UgbnVtYmVyIG9mIHJhbmdlIGxvY2suIFRoaXMgbnVtYmVyIGlzIHVzZWQgdG8gZ2V0IHRvIGtub3cKKwkgKiB0aGUgb3JkZXIgdGhlIGxvY2tzIGFyZSBxdWV1ZWQ7IHRoaXMgaXMgcmVxdWlyZWQgZm9yIHJhbmdlX2NhbmNlbCgpLgorCSAqLworCV9fdTY0CQkJcmxfc2VxdWVuY2U7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCByYW5nZV9sb2NrICpub2RlMnJhbmdlbG9jayhjb25zdCBzdHJ1Y3QgaW50ZXJ2YWxfbm9kZSAqbikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKG4sIHN0cnVjdCByYW5nZV9sb2NrLCBybF9ub2RlKTsKK30KKworc3RydWN0IHJhbmdlX2xvY2tfdHJlZSB7CisJc3RydWN0IGludGVydmFsX25vZGUJKnJsdF9yb290OworCXNwaW5sb2NrX3QJCSBybHRfbG9jazsJLyogcHJvdGVjdCByYW5nZSBsb2NrIHRyZWUgKi8KKwlfX3U2NAkJCSBybHRfc2VxdWVuY2U7Cit9OworCit2b2lkIHJhbmdlX2xvY2tfdHJlZV9pbml0KHN0cnVjdCByYW5nZV9sb2NrX3RyZWUgKnRyZWUpOwordm9pZCByYW5nZV9sb2NrX2luaXQoc3RydWN0IHJhbmdlX2xvY2sgKmxvY2ssIF9fdTY0IHN0YXJ0LCBfX3U2NCBlbmQpOworaW50ICByYW5nZV9sb2NrKHN0cnVjdCByYW5nZV9sb2NrX3RyZWUgKnRyZWUsIHN0cnVjdCByYW5nZV9sb2NrICpsb2NrKTsKK3ZvaWQgcmFuZ2VfdW5sb2NrKHN0cnVjdCByYW5nZV9sb2NrX3RyZWUgKnRyZWUsIHN0cnVjdCByYW5nZV9sb2NrICpsb2NrKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMKaW5kZXggODczOTNjNC4uNTBjMDE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jCkBAIC01MCwxMCArNTAsOCBAQAogCiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCiAKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saXRlLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfY2tzdW0uaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbGludXgvbHVzdHJlX2NvbXBhdDI1LmgiCiAKIHN0YXRpYyB2b2lkIGxsX3JhX3N0YXRzX2luY19zYmkoc3RydWN0IGxsX3NiX2luZm8gKnNiaSwgZW51bSByYV9zdGF0IHdoaWNoKTsKIApAQCAtNDEzLDcgKzQxMSw3IEBACiAJCQkgKiBmb3J3YXJkIHJlYWQtYWhlYWQsIGl0IHdpbGwgYmUgZml4ZWQgd2hlbiBiYWNrd2FyZAogCQkJICogcmVhZC1haGVhZCBpcyBpbXBsZW1lbnRlZAogCQkJICovCi0JCQlMQVNTRVJURihwYWdlX2lkeCA+IHJpYS0+cmlhX3N0b2ZmLCAiSW52YWxpZCBwYWdlX2lkeCAlbHUgcnMgJWx1IHJlICVsdSBybyAlbHUgcmwgJWx1IHJwICVsdVxuIiwKKwkJCUxBU1NFUlRGKHBhZ2VfaWR4ID49IHJpYS0+cmlhX3N0b2ZmLCAiSW52YWxpZCBwYWdlX2lkeCAlbHUgcnMgJWx1IHJlICVsdSBybyAlbHUgcmwgJWx1IHJwICVsdVxuIiwKIAkJCQkgcGFnZV9pZHgsCiAJCQkJIHJpYS0+cmlhX3N0YXJ0LCByaWEtPnJpYV9lbmQsIHJpYS0+cmlhX3N0b2ZmLAogCQkJCSByaWEtPnJpYV9sZW5ndGgsIHJpYS0+cmlhX3BhZ2VzKTsKQEAgLTQ3NCwxMCArNDcyLDIyIEBACiAJfQogCiAJLyogUmVzZXJ2ZSBhIHBhcnQgb2YgdGhlIHJlYWQtYWhlYWQgd2luZG93IHRoYXQgd2UnbGwgYmUgaXNzdWluZyAqLwotCWlmIChyYXMtPnJhc193aW5kb3dfbGVuKSB7Ci0JCXN0YXJ0ID0gcmFzLT5yYXNfbmV4dF9yZWFkYWhlYWQ7CisJaWYgKHJhcy0+cmFzX3dpbmRvd19sZW4gPiAwKSB7CisJCS8qCisJCSAqIE5vdGU6IG90aGVyIHRocmVhZCBtaWdodCByb2xsYmFjayB0aGUgcmFzX25leHRfcmVhZGFoZWFkLAorCQkgKiBpZiBpdCBjYW4gbm90IGdldCB0aGUgZnVsbCBzaXplIG9mIHByZXBhcmVkIHBhZ2VzLCBzZWUgdGhlCisJCSAqIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLiBGb3Igc3RyaWRlIHJlYWQgYWhlYWQsIGl0IG5lZWRzIHRvCisJCSAqIG1ha2Ugc3VyZSB0aGUgb2Zmc2V0IGlzIG5vIGxlc3MgdGhhbiByYXNfc3RyaWRlX29mZnNldCwKKwkJICogc28gdGhhdCBzdHJpZGUgcmVhZCBhaGVhZCBjYW4gd29yayBjb3JyZWN0bHkuCisJCSAqLworCQlpZiAoc3RyaWRlX2lvX21vZGUocmFzKSkKKwkJCXN0YXJ0ID0gbWF4KHJhcy0+cmFzX25leHRfcmVhZGFoZWFkLAorCQkJCSAgICByYXMtPnJhc19zdHJpZGVfb2Zmc2V0KTsKKwkJZWxzZQorCQkJc3RhcnQgPSByYXMtPnJhc19uZXh0X3JlYWRhaGVhZDsKIAkJZW5kID0gcmFzLT5yYXNfd2luZG93X3N0YXJ0ICsgcmFzLT5yYXNfd2luZG93X2xlbiAtIDE7CiAJfQorCiAJaWYgKGVuZCAhPSAwKSB7CiAJCXVuc2lnbmVkIGxvbmcgcnBjX2JvdW5kYXJ5OwogCQkvKgpAQCAtNjQ4LDEwICs2NTgsMTEgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHN0cmlkZV9nYXAgPSBpbmRleCAtIHJhcy0+cmFzX2xhc3RfcmVhZHBhZ2UgLSAxOwogCi0JaWYgKCFzdHJpZGVfaW9fbW9kZShyYXMpICYmIChzdHJpZGVfZ2FwICE9IDAgfHwKLQkgICAgcmFzLT5yYXNfY29uc2VjdXRpdmVfc3RyaWRlX3JlcXVlc3RzID09IDApKSB7CisJaWYgKChzdHJpZGVfZ2FwICE9IDAgfHwgcmFzLT5yYXNfY29uc2VjdXRpdmVfc3RyaWRlX3JlcXVlc3RzID09IDApICYmCisJICAgICFzdHJpZGVfaW9fbW9kZShyYXMpKSB7CiAJCXJhcy0+cmFzX3N0cmlkZV9wYWdlcyA9IHJhcy0+cmFzX2NvbnNlY3V0aXZlX3BhZ2VzOwotCQlyYXMtPnJhc19zdHJpZGVfbGVuZ3RoID0gc3RyaWRlX2dhcCtyYXMtPnJhc19jb25zZWN1dGl2ZV9wYWdlczsKKwkJcmFzLT5yYXNfc3RyaWRlX2xlbmd0aCA9IHJhcy0+cmFzX2NvbnNlY3V0aXZlX3BhZ2VzICsKKwkJCQkJIHN0cmlkZV9nYXA7CiAJfQogCUxBU1NFUlQocmFzLT5yYXNfcmVxdWVzdF9pbmRleCA9PSAwKTsKIAlMQVNTRVJUKHJhcy0+cmFzX2NvbnNlY3V0aXZlX3N0cmlkZV9yZXF1ZXN0cyA9PSAwKTsKQEAgLTY2MywxMCArNjc0LDkgQEAKIAl9CiAKIAlyYXMtPnJhc19zdHJpZGVfcGFnZXMgPSByYXMtPnJhc19jb25zZWN1dGl2ZV9wYWdlczsKLQlyYXMtPnJhc19zdHJpZGVfbGVuZ3RoID0gc3RyaWRlX2dhcCtyYXMtPnJhc19jb25zZWN1dGl2ZV9wYWdlczsKKwlyYXMtPnJhc19zdHJpZGVfbGVuZ3RoID0gc3RyaWRlX2dhcCArIHJhcy0+cmFzX2NvbnNlY3V0aXZlX3BhZ2VzOwogCiAJUkFTX0NERUJVRyhyYXMpOwotCXJldHVybjsKIH0KIAogLyogU3RyaWRlIFJlYWQtYWhlYWQgd2luZG93IHdpbGwgYmUgaW5jcmVhc2VkIGluY19sZW4gYWNjb3JkaW5nIHRvCkBAIC04ODIsNyArODkyLDYgQEAKIAlSQVNfQ0RFQlVHKHJhcyk7CiAJcmFzLT5yYXNfcmVxdWVzdF9pbmRleCsrOwogCXNwaW5fdW5sb2NrKCZyYXMtPnJhc19sb2NrKTsKLQlyZXR1cm47CiB9CiAKIGludCBsbF93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnZtcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCkBAIC0xMDE1LDExICsxMDI0LDE1IEBACiAJCSAqIGlzIGNhbGxlZCBsYXRlciBvbi4KIAkJICovCiAJCWlnbm9yZV9sYXlvdXQgPSAxOworCisJaWYgKCFsbF9pMmluZm8oaW5vZGUpLT5sbGlfY2xvYikKKwkJcmV0dXJuIDA7CisKIAlyZXN1bHQgPSBjbF9zeW5jX2ZpbGVfcmFuZ2UoaW5vZGUsIHN0YXJ0LCBlbmQsIG1vZGUsIGlnbm9yZV9sYXlvdXQpOwogCWlmIChyZXN1bHQgPiAwKSB7CiAJCXdiYy0+bnJfdG9fd3JpdGUgLT0gcmVzdWx0OwogCQlyZXN1bHQgPSAwOwotCSB9CisJfQogCiAJaWYgKHdiYy0+cmFuZ2VfY3ljbGljIHx8IChyYW5nZV93aG9sZSAmJiB3YmMtPm5yX3RvX3dyaXRlID4gMCkpIHsKIAkJaWYgKGVuZCA9PSBPQkRfT0JKRUNUX0VPRikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3MjYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3MjYuYwppbmRleCBkOThjN2FjLi4yNmYzYTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydzI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncyNi5jCkBAIC01MSw5ICs1MSw3IEBACiAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbGludXgvbHVzdHJlX2NvbXBhdDI1LmgiCiAKIC8qKgogICogSW1wbGVtZW50cyBMaW51eCBWTSBhZGRyZXNzX3NwYWNlOjppbnZhbGlkYXRlcGFnZSgpIG1ldGhvZC4gVGhpcyBtZXRob2QgaXMKQEAgLTE2MSw3ICsxNTksNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLSNkZWZpbmUgTUFYX0RJUkVDVElPX1NJWkUgKDIqMTAyNCoxMDI0KjEwMjRVTCkKKyNkZWZpbmUgTUFYX0RJUkVDVElPX1NJWkUgKDIgKiAxMDI0ICogMTAyNCAqIDEwMjRVTCkKIAogc3RhdGljIGlubGluZSBpbnQgbGxfZ2V0X3VzZXJfcGFnZXMoaW50IHJ3LCB1bnNpZ25lZCBsb25nIHVzZXJfYWRkciwKIAkJCQkgICAgc2l6ZV90IHNpemUsIHN0cnVjdCBwYWdlICoqKnBhZ2VzLApAQCAtMjE0LDEwICsyMTIsMTAgQEAKIAlpbnQgaTsKIAlzc2l6ZV90IHJjID0gMDsKIAlsb2ZmX3QgZmlsZV9vZmZzZXQgID0gcHYtPmxkcF9zdGFydF9vZmZzZXQ7Ci0JbG9uZyBzaXplCSAgID0gcHYtPmxkcF9zaXplOworCXNpemVfdCBzaXplID0gcHYtPmxkcF9zaXplOwogCWludCBwYWdlX2NvdW50ICAgICAgPSBwdi0+bGRwX25yOwogCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBwdi0+bGRwX3BhZ2VzOwotCWxvbmcgcGFnZV9zaXplICAgICAgPSBjbF9wYWdlX3NpemUob2JqKTsKKwlzaXplX3QgcGFnZV9zaXplID0gY2xfcGFnZV9zaXplKG9iaik7CiAJYm9vbCBkb19pbzsKIAlpbnQgIGlvX3BhZ2VzICAgICAgID0gMDsKIApAQCAtMzQ2LDcgKzM0NCw2IEBACiAJc3RydWN0IGNsX2lvICppbzsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKLQlzdHJ1Y3QgdnZwX29iamVjdCAqb2JqID0gY2xfaW5vZGUydnZwKGlub2RlKTsKIAlsb2ZmX3QgZmlsZV9vZmZzZXQgPSBpb2NiLT5raV9wb3M7CiAJc3NpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCXNzaXplX3QgdG90X2J5dGVzID0gMCwgcmVzdWx0ID0gMDsKQEAgLTM3NSwxNCArMzcyLDYgQEAKIAlpbyA9IHZ2cF9lbnZfaW8oZW52KS0+dnVpX2NsLmNpc19pbzsKIAlMQVNTRVJUKGlvKTsKIAotCS8qIDAuIE5lZWQgbG9ja2luZyBiZXR3ZWVuIGJ1ZmZlcmVkIGFuZCBkaXJlY3QgYWNjZXNzLiBhbmQgcmFjZSB3aXRoCi0JICogICAgc2l6ZSBjaGFuZ2luZyBieSBjb25jdXJyZW50IHRydW5jYXRlcyBhbmQgd3JpdGVzLgotCSAqIDEuIE5lZWQgaW5vZGUgbXV0ZXggdG8gb3BlcmF0ZSB0cmFuc2llbnQgcGFnZXMuCi0JICovCi0JaWYgKGlvdl9pdGVyX3J3KGl0ZXIpID09IFJFQUQpCi0JCWlub2RlX2xvY2soaW5vZGUpOwotCi0JTEFTU0VSVChvYmotPnZvYl90cmFuc2llbnRfcGFnZXMgPT0gMCk7CiAJd2hpbGUgKGlvdl9pdGVyX2NvdW50KGl0ZXIpKSB7CiAJCXN0cnVjdCBwYWdlICoqcGFnZXM7CiAJCXNpemVfdCBvZmZzOwpAQCAtNDMwLDEwICs0MTksNiBAQAogCQlmaWxlX29mZnNldCArPSByZXN1bHQ7CiAJfQogb3V0OgotCUxBU1NFUlQob2JqLT52b2JfdHJhbnNpZW50X3BhZ2VzID09IDApOwotCWlmIChpb3ZfaXRlcl9ydyhpdGVyKSA9PSBSRUFEKQotCQlpbm9kZV91bmxvY2soaW5vZGUpOwotCiAJaWYgKHRvdF9ieXRlcyA+IDApIHsKIAkJc3RydWN0IHZ2cF9pbyAqdmlvID0gdnZwX2Vudl9pbyhlbnYpOwogCkBAIC02MTYsNiArNjAxLDEzIEBACiAJCQlMQVNTRVJUKGZyb20gPT0gMCk7CiAJCXZpby0+dS53cml0ZS52dWlfdG8gPSBmcm9tICsgY29waWVkOwogCisJCS8qCisJCSAqIFRvIGFkZHJlc3MgdGhlIGRlYWRsb2NrIGluIGJhbGFuY2VfZGlydHlfcGFnZXMoKSB3aGVyZQorCQkgKiB0aGlzIGRpcnR5IHBhZ2UgbWF5IGJlIHdyaXR0ZW4gYmFjayBpbiB0aGUgc2FtZSB0aHJlYWQuCisJCSAqLworCQlpZiAoUGFnZURpcnR5KHZtcGFnZSkpCisJCQl1bnBsdWcgPSB0cnVlOworCiAJCS8qIFdlIG1heSBoYXZlIG9uZSBmdWxsIFJQQywgY29tbWl0IGl0IHNvb24gKi8KIAkJaWYgKHBsaXN0LT5wbF9uciA+PSBQVExSUENfTUFYX0JSV19QQUdFUykKIAkJCXVucGx1ZyA9IHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdGF0YWhlYWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N0YXRhaGVhZC5jCmluZGV4IGMxY2I2YjEuLjA2Nzc1MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N0YXRhaGVhZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N0YXRhaGVhZC5jCkBAIC0zOSw3ICszOSw2IEBACiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2RsbS5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAKQEAgLTUwLDI0ICs0OSwyNiBAQAogCVNBX0VOVFJZX0lOSVQgPSAwLCAgICAgIC8qKiBpbml0IGVudHJ5ICovCiAJU0FfRU5UUllfU1VDQyA9IDEsICAgICAgLyoqIHN0YXQgc3VjY2VlZCAqLwogCVNBX0VOVFJZX0lOVkEgPSAyLCAgICAgIC8qKiBpbnZhbGlkIGVudHJ5ICovCi0JU0FfRU5UUllfREVTVCA9IDMsICAgICAgLyoqIGVudHJ5IHRvIGJlIGRlc3Ryb3llZCAqLwogfTsKIAotc3RydWN0IGxsX3NhX2VudHJ5IHsKLQkvKiBsaW5rIGludG8gc2FpLT5zYWlfZW50cmllcyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgc2VfbGluazsKLQkvKiBsaW5rIGludG8gc2FpLT5zYWlfZW50cmllc197cmVjZWl2ZWQsc3RhdGVkfSAqLworLyoKKyAqIHNhX2VudHJ5IGlzIG5vdCByZWZjb3VudGVkOiBzdGF0YWhlYWQgdGhyZWFkIGFsbG9jYXRlcyBpdCBhbmQgZG8gYXN5bmMgc3RhdCwKKyAqIGFuZCBpbiBhc3luYyBzdGF0IGNhbGxiYWNrIGxsX3N0YXRhaGVhZF9pbnRlcnByZXQoKSB3aWxsIGFkZCBpdCBpbnRvCisgKiBzYWlfaW50ZXJpbV9lbnRyaWVzLCBsYXRlciBzdGF0YWhlYWQgdGhyZWFkIHdpbGwgY2FsbCBzYV9oYW5kbGVfY2FsbGJhY2soKSB0bworICogaW5zdGFudGlhdGUgZW50cnkgYW5kIG1vdmUgaXQgaW50byBzYWlfZW50cmllcywgYW5kIHRoZW4gb25seSBzY2FubmVyIHByb2Nlc3MKKyAqIGNhbiBhY2Nlc3MgYW5kIGZyZWUgaXQuCisgKi8KK3N0cnVjdCBzYV9lbnRyeSB7CisJLyogbGluayBpbnRvIHNhaV9pbnRlcmltX2VudHJpZXMgb3Igc2FpX2VudHJpZXMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgIHNlX2xpc3Q7CiAJLyogbGluayBpbnRvIHNhaSBoYXNoIHRhYmxlIGxvY2FsbHkgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgIHNlX2hhc2g7Ci0JLyogZW50cnkgcmVmZXJlbmNlIGNvdW50ICovCi0JYXRvbWljX3QJICAgIHNlX3JlZmNvdW50OwogCS8qIGVudHJ5IGluZGV4IGluIHRoZSBzYWkgKi8KIAlfX3U2NAkJICAgc2VfaW5kZXg7CiAJLyogbG93IGxheWVyIGxkbG0gbG9jayBoYW5kbGUgKi8KIAlfX3U2NAkJICAgc2VfaGFuZGxlOwogCS8qIGVudHJ5IHN0YXR1cyAqLwotCWVudW0gc2Vfc3RhdAkgICBzZV9zdGF0OworCWVudW0gc2Vfc3RhdAkJc2Vfc3RhdGU7CiAJLyogZW50cnkgc2l6ZSwgY29udGFpbnMgbmFtZSAqLwogCWludAkJICAgICBzZV9zaXplOwogCS8qIHBvaW50ZXIgdG8gYXN5bmMgZ2V0YXR0ciBlbnF1ZXVlIGluZm8gKi8KQEAgLTgzLDI3ICs4NCwyNCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzYWlfZ2VuZXJhdGlvbjsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2FpX2dlbmVyYXRpb25fbG9jayk7CiAKLS8qCi0gKiBUaGUgZW50cnkgb25seSBjYW4gYmUgcmVsZWFzZWQgYnkgdGhlIGNhbGxlciwgaXQgaXMgbmVjZXNzYXJ5IHRvIGhvbGQgbG9jay4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgbGxfc2FfZW50cnlfc3RhdGVkKHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnkpCisvKiBzYV9lbnRyeSBpcyByZWFkeSB0byB1c2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNhX3JlYWR5KHN0cnVjdCBzYV9lbnRyeSAqZW50cnkpCiB7CiAJc21wX3JtYigpOwotCXJldHVybiAoZW50cnktPnNlX3N0YXQgIT0gU0FfRU5UUllfSU5JVCk7CisJcmV0dXJuIChlbnRyeS0+c2Vfc3RhdGUgIT0gU0FfRU5UUllfSU5JVCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGxsX3NhX2VudHJ5X2hhc2goaW50IHZhbCkKKy8qIGhhc2ggdmFsdWUgdG8gcHV0IGluIHNhaV9jYWNoZSAqLworc3RhdGljIGlubGluZSBpbnQgc2FfaGFzaChpbnQgdmFsKQogewogCXJldHVybiB2YWwgJiBMTF9TQV9DQUNIRV9NQVNLOwogfQogCi0vKgotICogSW5zZXJ0IGVudHJ5IHRvIGhhc2ggU0EgdGFibGUuCi0gKi8KKy8qIGhhc2ggZW50cnkgaW50byBzYWlfY2FjaGUgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZAotbGxfc2FfZW50cnlfZW5oYXNoKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5KQorc2FfcmVoYXNoKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5KQogewotCWludCBpID0gbGxfc2FfZW50cnlfaGFzaChlbnRyeS0+c2VfcXN0ci5oYXNoKTsKKwlpbnQgaSA9IHNhX2hhc2goZW50cnktPnNlX3FzdHIuaGFzaCk7CiAKIAlzcGluX2xvY2soJnNhaS0+c2FpX2NhY2hlX2xvY2tbaV0pOwogCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5zZV9oYXNoLCAmc2FpLT5zYWlfY2FjaGVbaV0pOwpAQCAtMTE0LDkgKzExMiw5IEBACiAgKiBSZW1vdmUgZW50cnkgZnJvbSBTQSB0YWJsZS4KICAqLwogc3RhdGljIGlubGluZSB2b2lkCi1sbF9zYV9lbnRyeV91bmhhc2goc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnkpCitzYV91bmhhc2goc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBzYV9lbnRyeSAqZW50cnkpCiB7Ci0JaW50IGkgPSBsbF9zYV9lbnRyeV9oYXNoKGVudHJ5LT5zZV9xc3RyLmhhc2gpOworCWludCBpID0gc2FfaGFzaChlbnRyeS0+c2VfcXN0ci5oYXNoKTsKIAogCXNwaW5fbG9jaygmc2FpLT5zYWlfY2FjaGVfbG9ja1tpXSk7CiAJbGlzdF9kZWxfaW5pdCgmZW50cnktPnNlX2hhc2gpOwpAQCAtMTI5LDE5ICsxMjcsMjEgQEAKIAlyZXR1cm4gKGlub2RlICYmIFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgc2FpLT5zYWlfYWdsX3ZhbGlkKTsKIH0KIAorLyogc3RhdGFoZWFkIHdpbmRvdyBpcyBmdWxsICovCiBzdGF0aWMgaW5saW5lIGludCBzYV9zZW50X2Z1bGwoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkpCiB7CiAJcmV0dXJuIGF0b21pY19yZWFkKCZzYWktPnNhaV9jYWNoZV9jb3VudCkgPj0gc2FpLT5zYWlfbWF4OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzYV9yZWNlaXZlZF9lbXB0eShzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSkKKy8qIGdvdCBhc3luYyBzdGF0IHJlcGxpZXMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNhX2hhc19jYWxsYmFjayhzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSkKIHsKLQlyZXR1cm4gbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCk7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZzYWktPnNhaV9pbnRlcmltX2VudHJpZXMpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBhZ2xfbGlzdF9lbXB0eShzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSkKIHsKLQlyZXR1cm4gbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19hZ2wpOworCXJldHVybiBsaXN0X2VtcHR5KCZzYWktPnNhaV9hZ2xzKTsKIH0KIAogLyoqCkBAIC0xNTcsNyArMTU3LDcgQEAKIH0KIAogLyoKLSAqIElmIHRoZSBnaXZlbiBpbmRleCBpcyBiZWhpbmQgb2Ygc3RhdGFoZWFkIHdpbmRvdyBtb3JlIHRoYW4KKyAqIGlmIHRoZSBnaXZlbiBpbmRleCBpcyBiZWhpbmQgb2Ygc3RhdGFoZWFkIHdpbmRvdyBtb3JlIHRoYW4KICAqIFNBX09NSVRURURfRU5UUllfTUFYLCB0aGVuIGl0IGlzIG9sZC4KICAqLwogc3RhdGljIGlubGluZSBpbnQgaXNfb21pdHRlZF9lbnRyeShzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgX191NjQgaW5kZXgpCkBAIC0xNjYsMjAgKzE2NiwxNyBAQAogCQkgc2FpLT5zYWlfaW5kZXgpOwogfQogCi0vKgotICogSW5zZXJ0IGl0IGludG8gc2FpX2VudHJpZXMgdGFpbCB3aGVuIGluaXQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbGxfc2FfZW50cnkgKgotbGxfc2FfZW50cnlfYWxsb2Moc3RydWN0IGRlbnRyeSAqcGFyZW50LAotCQkgIHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBfX3U2NCBpbmRleCwKLQkJICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQorLyogYWxsb2NhdGUgc2FfZW50cnkgYW5kIGhhc2ggaXQgdG8gYWxsb3cgc2Nhbm5lciBwcm9jZXNzIHRvIGZpbmQgaXQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2FfZW50cnkgKgorc2FfYWxsb2Moc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgX191NjQgaW5kZXgsCisJIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCiB7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaTsKLQlzdHJ1Y3QgbGxfc2FfZW50cnkgICAqZW50cnk7CisJc3RydWN0IHNhX2VudHJ5ICAgKmVudHJ5OwogCWludAkJICAgZW50cnlfc2l6ZTsKIAljaGFyCQkgKmRuYW1lOwogCi0JZW50cnlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbGxfc2FfZW50cnkpICsgKGxlbiAmIH4zKSArIDQ7CisJZW50cnlfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2FfZW50cnkpICsgKGxlbiAmIH4zKSArIDQ7CiAJZW50cnkgPSBremFsbG9jKGVudHJ5X3NpemUsIEdGUF9OT0ZTKTsKIAlpZiAodW5saWtlbHkoIWVudHJ5KSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CkBAIC0xODgsMzQgKzE4NSw5IEBACiAJICAgICAgIGxlbiwgbmFtZSwgZW50cnksIGluZGV4KTsKIAogCWVudHJ5LT5zZV9pbmRleCA9IGluZGV4OwotCi0JLyoKLQkgKiBTdGF0YWhlYWQgZW50cnkgcmVmZXJlbmNlIHJ1bGVzOgotCSAqCi0JICogMSkgV2hlbiBzdGF0YWhlYWQgZW50cnkgaXMgaW5pdGlhbGl6ZWQsIGl0cyByZWZlcmVuY2UgaXMgc2V0IGFzIDIuCi0JICogICAgT25lIHJlZmVyZW5jZSBpcyB1c2VkIGJ5IHRoZSBkaXJlY3Rvcnkgc2Nhbm5lci4gV2hlbiB0aGUgc2Nhbm5lcgotCSAqICAgIHNlYXJjaGVzIHRoZSBzdGF0YWhlYWQgY2FjaGUgZm9yIHRoZSBnaXZlbiBuYW1lLCBpdCBjYW4gcGVyZm9ybQotCSAqICAgIGxvY2tsZXNzIGhhc2ggbG9va3VwIChvbmx5IHRoZSBzY2FubmVyIGNhbiByZW1vdmUgZW50cnkgZnJvbSBoYXNoCi0JICogICAgbGlzdCksIGFuZCBvbmNlIGZvdW5kLCBpdCBuZWVkbid0IHRvIGNhbGwgImF0b21pY19pbmMoKSIgZm9yIHRoZQotCSAqICAgIGVudHJ5IHJlZmVyZW5jZS4gU28gdGhlIHBlcmZvcm1hbmNlIGlzIGltcHJvdmVkLiBBZnRlciB1c2luZyB0aGUKLQkgKiAgICBzdGF0YWhlYWQgZW50cnksIHRoZSBzY2FubmVyIHdpbGwgY2FsbCAiYXRvbWljX2RlYygpIiB0byBkcm9wIHRoZQotCSAqICAgIHJlZmVyZW5jZSBoZWxkIHdoZW4gaW5pdGlhbGl6YXRpb24uIElmIGl0IGlzIHRoZSBsYXN0IHJlZmVyZW5jZSwKLQkgKiAgICB0aGUgc3RhdGFoZWFkIGVudHJ5IHdpbGwgYmUgZnJlZWQuCi0JICoKLQkgKiAyKSBBbGwgb3RoZXIgdGhyZWFkcywgaW5jbHVkaW5nIHN0YXRhaGVhZCB0aHJlYWQgYW5kIHB0bHJwY2QgdGhyZWFkLAotCSAqICAgIHdoZW4gdGhleSBwcm9jZXNzIHRoZSBzdGF0YWhlYWQgZW50cnksIHRoZSByZWZlcmVuY2UgZm9yIHRhcmdldAotCSAqICAgIHNob3VsZCBiZSBoZWxkIHRvIGd1YXJhbnRlZSB0aGUgZW50cnkgd2lsbCBub3QgYmUgcmVsZWFzZWQgYnkgdGhlCi0JICogICAgZGlyZWN0b3J5IHNjYW5uZXIuIEFmdGVyIHByb2Nlc3NpbmcgdGhlIGVudHJ5LCB0aGVzZSB0aHJlYWRzIHdpbGwKLQkgKiAgICBkcm9wIHRoZSBlbnRyeSByZWZlcmVuY2UuIElmIGl0IGlzIHRoZSBsYXN0IHJlZmVyZW5jZSwgdGhlIGVudHJ5Ci0JICogICAgd2lsbCBiZSBmcmVlZC4KLQkgKgotCSAqICAgIFRoZSBzZWNvbmQgcmVmZXJlbmNlIHdoZW4gaW5pdGlhbGl6ZXMgdGhlIHN0YXRhaGVhZCBlbnRyeSBpcyB1c2VkCi0JICogICAgYnkgdGhlIHN0YXRhaGVhZCB0aHJlYWQsIGZvbGxvd2luZyB0aGUgcnVsZSAyKS4KLQkgKi8KLQlhdG9taWNfc2V0KCZlbnRyeS0+c2VfcmVmY291bnQsIDIpOwotCWVudHJ5LT5zZV9zdGF0ID0gU0FfRU5UUllfSU5JVDsKKwllbnRyeS0+c2Vfc3RhdGUgPSBTQV9FTlRSWV9JTklUOwogCWVudHJ5LT5zZV9zaXplID0gZW50cnlfc2l6ZTsKLQlkbmFtZSA9IChjaGFyICopZW50cnkgKyBzaXplb2Yoc3RydWN0IGxsX3NhX2VudHJ5KTsKKwlkbmFtZSA9IChjaGFyICopZW50cnkgKyBzaXplb2Yoc3RydWN0IHNhX2VudHJ5KTsKIAltZW1jcHkoZG5hbWUsIG5hbWUsIGxlbik7CiAJZG5hbWVbbGVuXSA9IDA7CiAKQEAgLTIyMywxMSArMTk1LDEwIEBACiAJZW50cnktPnNlX3FzdHIubGVuID0gbGVuOwogCWVudHJ5LT5zZV9xc3RyLm5hbWUgPSBkbmFtZTsKIAotCWxsaSA9IGxsX2kyaW5mbyhzYWktPnNhaV9pbm9kZSk7CisJbGxpID0gbGxfaTJpbmZvKHNhaS0+c2FpX2RlbnRyeS0+ZF9pbm9kZSk7CiAJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZlbnRyeS0+c2VfbGluaywgJnNhaS0+c2FpX2VudHJpZXMpOwogCUlOSVRfTElTVF9IRUFEKCZlbnRyeS0+c2VfbGlzdCk7Ci0JbGxfc2FfZW50cnlfZW5oYXNoKHNhaSwgZW50cnkpOworCXNhX3JlaGFzaChzYWksIGVudHJ5KTsKIAlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CiAKIAlhdG9taWNfaW5jKCZzYWktPnNhaV9jYWNoZV9jb3VudCk7CkBAIC0yMzUsMTggKzIwNiwyOSBAQAogCXJldHVybiBlbnRyeTsKIH0KIAotLyoKLSAqIFVzZWQgYnkgdGhlIGRpcmVjdG9yeSBzY2FubmVyIHRvIHNlYXJjaCBlbnRyeSB3aXRoIG5hbWUuCi0gKgotICogT25seSB0aGUgY2FsbGVyIGNhbiByZW1vdmUgdGhlIGVudHJ5IGZyb20gaGFzaCwgc28gaXQgaXMgdW5uZWNlc3NhcnkgdG8gaG9sZAotICogaGFzaCBsb2NrLiBJdCBpcyBjYWxsZXIncyBkdXR5IHRvIHJlbGVhc2UgdGhlIGluaXQgcmVmY291bnQgb24gdGhlIGVudHJ5LCBzbwotICogaXQgaXMgYWxzbyB1bm5lY2Vzc2FyeSB0byBpbmNyZWFzZSByZWZjb3VudCBvbiB0aGUgZW50cnkuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbGxfc2FfZW50cnkgKgotbGxfc2FfZW50cnlfZ2V0X2J5bmFtZShzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgY29uc3Qgc3RydWN0IHFzdHIgKnFzdHIpCisvKiBmcmVlIHNhX2VudHJ5LCB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIHVuaGFzaGVkIGFuZCBub3QgaW4gYW55IGxpc3QgKi8KK3N0YXRpYyB2b2lkIHNhX2ZyZWUoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBzYV9lbnRyeSAqZW50cnkpCiB7Ci0Jc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeTsKLQlpbnQgaSA9IGxsX3NhX2VudHJ5X2hhc2gocXN0ci0+aGFzaCk7CisJQ0RFQlVHKERfUkVBREEsICJmcmVlIHNhIGVudHJ5ICUuKnMoJXApIGluZGV4ICVsbHVcbiIsCisJICAgICAgIGVudHJ5LT5zZV9xc3RyLmxlbiwgZW50cnktPnNlX3FzdHIubmFtZSwgZW50cnksCisJICAgICAgIGVudHJ5LT5zZV9pbmRleCk7CisKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmVudHJ5LT5zZV9saXN0KSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZlbnRyeS0+c2VfaGFzaCkpOworCisJa2ZyZWUoZW50cnkpOworCWF0b21pY19kZWMoJnNhaS0+c2FpX2NhY2hlX2NvdW50KTsKK30KKworLyoKKyAqIGZpbmQgc2FfZW50cnkgYnkgbmFtZSwgdXNlZCBieSBkaXJlY3Rvcnkgc2Nhbm5lciwgbG9jayBpcyBub3QgbmVlZGVkIGJlY2F1c2UKKyAqIG9ubHkgc2Nhbm5lciBjYW4gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIGNhY2hlLgorICovCitzdGF0aWMgc3RydWN0IHNhX2VudHJ5ICoKK3NhX2dldChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgY29uc3Qgc3RydWN0IHFzdHIgKnFzdHIpCit7CisJc3RydWN0IHNhX2VudHJ5ICplbnRyeTsKKwlpbnQgaSA9IHNhX2hhc2gocXN0ci0+aGFzaCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmc2FpLT5zYWlfY2FjaGVbaV0sIHNlX2hhc2gpIHsKIAkJaWYgKGVudHJ5LT5zZV9xc3RyLmhhc2ggPT0gcXN0ci0+aGFzaCAmJgpAQCAtMjU3LDM2ICsyMzksMTAwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qCi0gKiBVc2VkIGJ5IHRoZSBhc3luYyBnZXRhdHRyIHJlcXVlc3QgY2FsbGJhY2sgdG8gZmluZCBlbnRyeSB3aXRoIGluZGV4LgotICoKLSAqIEluc2lkZSBsbGlfc2FfbG9jayB0byBwcmV2ZW50IG90aGVycyB0byBjaGFuZ2UgdGhlIGxpc3QgZHVyaW5nIHRoZSBzZWFyY2guCi0gKiBJdCBuZWVkcyB0byBpbmNyZWFzZSBlbnRyeSByZWZjb3VudCBiZWZvcmUgcmV0dXJuaW5nIHRvIGd1YXJhbnRlZSB0aGF0IHRoZQotICogZW50cnkgY2Fubm90IGJlIGZyZWVkIGJ5IG90aGVycy4KLSAqLwotc3RhdGljIHN0cnVjdCBsbF9zYV9lbnRyeSAqCi1sbF9zYV9lbnRyeV9nZXRfYnlpbmRleChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgX191NjQgaW5kZXgpCisvKiB1bmhhc2ggYW5kIHVubGluayBzYV9lbnRyeSwgYW5kIHRoZW4gZnJlZSBpdCAqLworc3RhdGljIGlubGluZSB2b2lkCitzYV9raWxsKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5KQogewotCXN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnk7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhzYWktPnNhaV9kZW50cnktPmRfaW5vZGUpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJnNhaS0+c2FpX2VudHJpZXMsIHNlX2xpbmspIHsKLQkJaWYgKGVudHJ5LT5zZV9pbmRleCA9PSBpbmRleCkgewotCQkJTEFTU0VSVChhdG9taWNfcmVhZCgmZW50cnktPnNlX3JlZmNvdW50KSA+IDApOwotCQkJYXRvbWljX2luYygmZW50cnktPnNlX3JlZmNvdW50KTsKLQkJCXJldHVybiBlbnRyeTsKLQkJfQotCQlpZiAoZW50cnktPnNlX2luZGV4ID4gaW5kZXgpCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5VTEw7CisJTEFTU0VSVCghbGlzdF9lbXB0eSgmZW50cnktPnNlX2hhc2gpKTsKKwlMQVNTRVJUKCFsaXN0X2VtcHR5KCZlbnRyeS0+c2VfbGlzdCkpOworCUxBU1NFUlQoc2FfcmVhZHkoZW50cnkpKTsKKworCXNhX3VuaGFzaChzYWksIGVudHJ5KTsKKworCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmZW50cnktPnNlX2xpc3QpOworCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKworCWlmIChlbnRyeS0+c2VfaW5vZGUpCisJCWlwdXQoZW50cnktPnNlX2lub2RlKTsKKworCXNhX2ZyZWUoc2FpLCBlbnRyeSk7CiB9CiAKLXN0YXRpYyB2b2lkIGxsX3NhX2VudHJ5X2NsZWFudXAoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksCi0JCQkJc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSkKKy8qIGNhbGxlZCBieSBzY2FubmVyIGFmdGVyIHVzZSwgc2FfZW50cnkgd2lsbCBiZSBraWxsZWQgKi8KK3N0YXRpYyB2b2lkCitzYV9wdXQoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBzYV9lbnRyeSAqZW50cnkpCiB7Ci0Jc3RydWN0IG1kX2VucXVldWVfaW5mbyAqbWluZm8gPSBlbnRyeS0+c2VfbWluZm87Ci0Jc3RydWN0IHB0bHJwY19yZXF1ZXN0ICAqcmVxICAgPSBlbnRyeS0+c2VfcmVxOworCXN0cnVjdCBzYV9lbnRyeSAqdG1wLCAqbmV4dDsKIAorCWlmIChlbnRyeSAmJiBlbnRyeS0+c2Vfc3RhdGUgPT0gU0FfRU5UUllfU1VDQykgeworCQlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoc2FpLT5zYWlfZGVudHJ5LT5kX2lub2RlKTsKKworCQlzYWktPnNhaV9oaXQrKzsKKwkJc2FpLT5zYWlfY29uc2VjdXRpdmVfbWlzcyA9IDA7CisJCXNhaS0+c2FpX21heCA9IG1pbigyICogc2FpLT5zYWlfbWF4LCBzYmktPmxsX3NhX21heCk7CisJfSBlbHNlIHsKKwkJc2FpLT5zYWlfbWlzcysrOworCQlzYWktPnNhaV9jb25zZWN1dGl2ZV9taXNzKys7CisJfQorCisJaWYgKGVudHJ5KQorCQlzYV9raWxsKHNhaSwgZW50cnkpOworCisJLyoKKwkgKiBraWxsIG9sZCBjb21wbGV0ZWQgZW50cmllcywgb25seSBzY2FubmVyIHByb2Nlc3MgZG9lcyB0aGlzLCBubyBuZWVkCisJICogdG8gbG9jaworCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0bXAsIG5leHQsICZzYWktPnNhaV9lbnRyaWVzLCBzZV9saXN0KSB7CisJCWlmICghaXNfb21pdHRlZF9lbnRyeShzYWksIHRtcC0+c2VfaW5kZXgpKQorCQkJYnJlYWs7CisJCXNhX2tpbGwoc2FpLCB0bXApOworCX0KKworCXdha2VfdXAoJnNhaS0+c2FpX3RocmVhZC50X2N0bF93YWl0cSk7Cit9CisKKy8qCisgKiB1cGRhdGUgc3RhdGUgYW5kIHNvcnQgYWRkIGVudHJ5IHRvIHNhaV9lbnRyaWVzIGJ5IGluZGV4LCByZXR1cm4gdHJ1ZSBpZgorICogc2Nhbm5lciBpcyB3YWl0aW5nIG9uIHRoaXMgZW50cnkuCisgKi8KK3N0YXRpYyBib29sCitfX3NhX21ha2VfcmVhZHkoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBzYV9lbnRyeSAqZW50cnksIGludCByZXQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zID0gJnNhaS0+c2FpX2VudHJpZXM7CisJX191NjQgaW5kZXggPSBlbnRyeS0+c2VfaW5kZXg7CisJc3RydWN0IHNhX2VudHJ5ICpzZTsKKworCUxBU1NFUlQoIXNhX3JlYWR5KGVudHJ5KSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZlbnRyeS0+c2VfbGlzdCkpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHNlLCAmc2FpLT5zYWlfZW50cmllcywgc2VfbGlzdCkgeworCQlpZiAoc2UtPnNlX2luZGV4IDwgZW50cnktPnNlX2luZGV4KSB7CisJCQlwb3MgPSAmc2UtPnNlX2xpc3Q7CisJCQlicmVhazsKKwkJfQorCX0KKwlsaXN0X2FkZCgmZW50cnktPnNlX2xpc3QsIHBvcyk7CisJZW50cnktPnNlX3N0YXRlID0gcmV0IDwgMCA/IFNBX0VOVFJZX0lOVkEgOiBTQV9FTlRSWV9TVUNDOworCisJcmV0dXJuIChpbmRleCA9PSBzYWktPnNhaV9pbmRleF93YWl0KTsKK30KKworLyoKKyAqIHJlbGVhc2UgcmVzb3VyY2VzIHVzZWQgaW4gYXN5bmMgc3RhdCBSUEMsIHVwZGF0ZSBlbnRyeSBzdGF0ZSBhbmQgd2FrZXVwIGlmCisgKiBzY2FubmVyIHByb2Nlc3MgaXQgd2FpdGluZyBvbiB0aGlzIGVudHJ5LgorICovCitzdGF0aWMgdm9pZAorc2FfbWFrZV9yZWFkeShzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwgc3RydWN0IHNhX2VudHJ5ICplbnRyeSwgaW50IHJldCkKK3sKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKHNhaS0+c2FpX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3RydWN0IG1kX2VucXVldWVfaW5mbyAqbWluZm8gPSBlbnRyeS0+c2VfbWluZm87CisJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEgPSBlbnRyeS0+c2VfcmVxOworCWJvb2wgd2FrZXVwOworCisJLyogcmVsZWFzZSByZXNvdXJjZXMgdXNlZCBpbiBSUEMgKi8KIAlpZiAobWluZm8pIHsKIAkJZW50cnktPnNlX21pbmZvID0gTlVMTDsKIAkJbGxfaW50ZW50X3JlbGVhc2UoJm1pbmZvLT5taV9pdCk7CkBAIC0yOTgsMTIzICszNDQsMjEgQEAKIAkJZW50cnktPnNlX3JlcSA9IE5VTEw7CiAJCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKIAl9Ci19Ci0KLXN0YXRpYyB2b2lkIGxsX3NhX2VudHJ5X3B1dChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwKLQkJCSAgICBzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5KQotewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZlbnRyeS0+c2VfcmVmY291bnQpKSB7Ci0JCUNERUJVRyhEX1JFQURBLCAiZnJlZSBzYSBlbnRyeSAlLipzKCVwKSBpbmRleCAlbGx1XG4iLAotCQkgICAgICAgZW50cnktPnNlX3FzdHIubGVuLCBlbnRyeS0+c2VfcXN0ci5uYW1lLCBlbnRyeSwKLQkJICAgICAgIGVudHJ5LT5zZV9pbmRleCk7Ci0KLQkJTEFTU0VSVChsaXN0X2VtcHR5KCZlbnRyeS0+c2VfbGluaykpOwotCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmVudHJ5LT5zZV9saXN0KSk7Ci0JCUxBU1NFUlQobGlzdF9lbXB0eSgmZW50cnktPnNlX2hhc2gpKTsKLQotCQlsbF9zYV9lbnRyeV9jbGVhbnVwKHNhaSwgZW50cnkpOwotCQlpcHV0KGVudHJ5LT5zZV9pbm9kZSk7Ci0KLQkJa2ZyZWUoZW50cnkpOwotCQlhdG9taWNfZGVjKCZzYWktPnNhaV9jYWNoZV9jb3VudCk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWRvX3NhX2VudHJ5X2Zpbmkoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWksIHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnkpCi17Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhzYWktPnNhaV9pbm9kZSk7Ci0KLQlMQVNTRVJUKCFsaXN0X2VtcHR5KCZlbnRyeS0+c2VfaGFzaCkpOwotCUxBU1NFUlQoIWxpc3RfZW1wdHkoJmVudHJ5LT5zZV9saW5rKSk7Ci0KLQlsbF9zYV9lbnRyeV91bmhhc2goc2FpLCBlbnRyeSk7CiAKIAlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCWVudHJ5LT5zZV9zdGF0ID0gU0FfRU5UUllfREVTVDsKLQlsaXN0X2RlbF9pbml0KCZlbnRyeS0+c2VfbGluayk7Ci0JaWYgKGxpa2VseSghbGlzdF9lbXB0eSgmZW50cnktPnNlX2xpc3QpKSkKLQkJbGlzdF9kZWxfaW5pdCgmZW50cnktPnNlX2xpc3QpOworCXdha2V1cCA9IF9fc2FfbWFrZV9yZWFkeShzYWksIGVudHJ5LCByZXQpOwogCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKIAotCWxsX3NhX2VudHJ5X3B1dChzYWksIGVudHJ5KTsKKwlpZiAod2FrZXVwKQorCQl3YWtlX3VwKCZzYWktPnNhaV93YWl0cSk7CiB9CiAKLS8qCi0gKiBEZWxldGUgaXQgZnJvbSBzYWlfZW50cmllc19zdGF0ZWQgbGlzdCB3aGVuIGZpbmkuCi0gKi8KLXN0YXRpYyB2b2lkCi1sbF9zYV9lbnRyeV9maW5pKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5KQotewotCXN0cnVjdCBsbF9zYV9lbnRyeSAqcG9zLCAqbmV4dDsKLQotCWlmIChlbnRyeSkKLQkJZG9fc2FfZW50cnlfZmluaShzYWksIGVudHJ5KTsKLQotCS8qIGRyb3Agb2xkIGVudHJ5LCBvbmx5ICdzY2FubmVyJyBwcm9jZXNzIGRvZXMgdGhpcywgbm8gbmVlZCB0byBsb2NrICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgbmV4dCwgJnNhaS0+c2FpX2VudHJpZXMsIHNlX2xpbmspIHsKLQkJaWYgKCFpc19vbWl0dGVkX2VudHJ5KHNhaSwgcG9zLT5zZV9pbmRleCkpCi0JCQlicmVhazsKLQkJZG9fc2FfZW50cnlfZmluaShzYWksIHBvcyk7Ci0JfQotfQotCi0vKgotICogSW5zaWRlIGxsaV9zYV9sb2NrLgotICovCi1zdGF0aWMgdm9pZAotZG9fc2FfZW50cnlfdG9fc3RhdGVkKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLAotCQkgICAgICBzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5LCBlbnVtIHNlX3N0YXQgc3RhdCkKLXsKLQlzdHJ1Y3QgbGxfc2FfZW50cnkgKnNlOwotCXN0cnVjdCBsaXN0X2hlYWQJICpwb3MgPSAmc2FpLT5zYWlfZW50cmllc19zdGF0ZWQ7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJmVudHJ5LT5zZV9saXN0KSkKLQkJbGlzdF9kZWxfaW5pdCgmZW50cnktPnNlX2xpc3QpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHNlLCAmc2FpLT5zYWlfZW50cmllc19zdGF0ZWQsIHNlX2xpc3QpIHsKLQkJaWYgKHNlLT5zZV9pbmRleCA8IGVudHJ5LT5zZV9pbmRleCkgewotCQkJcG9zID0gJnNlLT5zZV9saXN0OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlsaXN0X2FkZCgmZW50cnktPnNlX2xpc3QsIHBvcyk7Ci0JZW50cnktPnNlX3N0YXQgPSBzdGF0OwotfQotCi0vKgotICogTW92ZSBlbnRyeSB0byBzYWlfZW50cmllc19zdGF0ZWQgYW5kIHNvcnQgd2l0aCB0aGUgaW5kZXguCi0gKiBccmV0dmFsIDEgICAgLS0gZW50cnkgdG8gYmUgZGVzdHJveWVkLgotICogXHJldHZhbCAwICAgIC0tIGVudHJ5IGlzIGluc2VydGVkIGludG8gc3RhdGVkIGxpc3QuCi0gKi8KLXN0YXRpYyBpbnQKLWxsX3NhX2VudHJ5X3RvX3N0YXRlZChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwKLQkJICAgICAgc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSwgZW51bSBzZV9zdGF0IHN0YXQpCi17Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhzYWktPnNhaV9pbm9kZSk7Ci0JaW50CQkgICByZXQgPSAxOwotCi0JbGxfc2FfZW50cnlfY2xlYW51cChzYWksIGVudHJ5KTsKLQotCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JaWYgKGxpa2VseShlbnRyeS0+c2Vfc3RhdCAhPSBTQV9FTlRSWV9ERVNUKSkgewotCQlkb19zYV9lbnRyeV90b19zdGF0ZWQoc2FpLCBlbnRyeSwgc3RhdCk7Ci0JCXJldCA9IDA7Ci0JfQotCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBJbnNlcnQgaW5vZGUgaW50byB0aGUgbGlzdCBvZiBzYWlfZW50cmllc19hZ2wuCi0gKi8KKy8qIEluc2VydCBpbm9kZSBpbnRvIHRoZSBsaXN0IG9mIHNhaV9hZ2xzLiAqLwogc3RhdGljIHZvaWQgbGxfYWdsX2FkZChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwKIAkJICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqY2hpbGQgID0gbGxfaTJpbmZvKGlub2RlKTsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqcGFyZW50ID0gbGxfaTJpbmZvKHNhaS0+c2FpX2lub2RlKTsKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqcGFyZW50ID0gbGxfaTJpbmZvKHNhaS0+c2FpX2RlbnRyeS0+ZF9pbm9kZSk7CiAJaW50CQkgICBhZGRlZCAgPSAwOwogCiAJc3Bpbl9sb2NrKCZjaGlsZC0+bGxpX2FnbF9sb2NrKTsKQEAgLTQyNiw5ICszNzAsOSBAQAogCiAJCWlncmFiKGlub2RlKTsKIAkJc3Bpbl9sb2NrKCZwYXJlbnQtPmxsaV9hZ2xfbG9jayk7Ci0JCWlmIChsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX2FnbCkpCisJCWlmIChsaXN0X2VtcHR5KCZzYWktPnNhaV9hZ2xzKSkKIAkJCWFkZGVkID0gMTsKLQkJbGlzdF9hZGRfdGFpbCgmY2hpbGQtPmxsaV9hZ2xfbGlzdCwgJnNhaS0+c2FpX2VudHJpZXNfYWdsKTsKKwkJbGlzdF9hZGRfdGFpbCgmY2hpbGQtPmxsaV9hZ2xfbGlzdCwgJnNhaS0+c2FpX2FnbHMpOwogCQlzcGluX3VubG9jaygmcGFyZW50LT5sbGlfYWdsX2xvY2spOwogCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrKCZjaGlsZC0+bGxpX2FnbF9sb2NrKTsKQEAgLTQzOCw4ICszODIsMTAgQEAKIAkJd2FrZV91cCgmc2FpLT5zYWlfYWdsX3RocmVhZC50X2N0bF93YWl0cSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKmxsX3NhaV9hbGxvYyh2b2lkKQorLyogYWxsb2NhdGUgc2FpICovCitzdGF0aWMgc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpsbF9zYWlfYWxsb2Moc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogeworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oZGVudHJ5LT5kX2lub2RlKTsKIAlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaTsKIAlpbnQJCSAgICAgICBpOwogCkBAIC00NDcsMjQgKzM5MywxOCBAQAogCWlmICghc2FpKQogCQlyZXR1cm4gTlVMTDsKIAorCXNhaS0+c2FpX2RlbnRyeSA9IGRnZXQoZGVudHJ5KTsKIAlhdG9taWNfc2V0KCZzYWktPnNhaV9yZWZjb3VudCwgMSk7CiAKLQlzcGluX2xvY2soJnNhaV9nZW5lcmF0aW9uX2xvY2spOwotCXNhaS0+c2FpX2dlbmVyYXRpb24gPSArK3NhaV9nZW5lcmF0aW9uOwotCWlmICh1bmxpa2VseShzYWlfZ2VuZXJhdGlvbiA9PSAwKSkKLQkJc2FpLT5zYWlfZ2VuZXJhdGlvbiA9ICsrc2FpX2dlbmVyYXRpb247Ci0Jc3Bpbl91bmxvY2soJnNhaV9nZW5lcmF0aW9uX2xvY2spOwotCiAJc2FpLT5zYWlfbWF4ID0gTExfU0FfUlBDX01JTjsKIAlzYWktPnNhaV9pbmRleCA9IDE7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc2FpLT5zYWlfd2FpdHEpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNhaS0+c2FpX3RocmVhZC50X2N0bF93YWl0cSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmc2FpLT5zYWlfYWdsX3RocmVhZC50X2N0bF93YWl0cSk7CiAKKwlJTklUX0xJU1RfSEVBRCgmc2FpLT5zYWlfaW50ZXJpbV9lbnRyaWVzKTsKIAlJTklUX0xJU1RfSEVBRCgmc2FpLT5zYWlfZW50cmllcyk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpOwotCUlOSVRfTElTVF9IRUFEKCZzYWktPnNhaV9lbnRyaWVzX3N0YXRlZCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNhaS0+c2FpX2VudHJpZXNfYWdsKTsKKwlJTklUX0xJU1RfSEVBRCgmc2FpLT5zYWlfYWdscyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTExfU0FfQ0FDSEVfU0laRTsgaSsrKSB7CiAJCUlOSVRfTElTVF9IRUFEKCZzYWktPnNhaV9jYWNoZVtpXSk7CkBAIC00NzIsNjMgKzQxMiw3NCBAQAogCX0KIAlhdG9taWNfc2V0KCZzYWktPnNhaV9jYWNoZV9jb3VudCwgMCk7CiAKKwlzcGluX2xvY2soJnNhaV9nZW5lcmF0aW9uX2xvY2spOworCWxsaS0+bGxpX3NhX2dlbmVyYXRpb24gPSArK3NhaV9nZW5lcmF0aW9uOworCWlmICh1bmxpa2VseSghc2FpX2dlbmVyYXRpb24pKQorCQlsbGktPmxsaV9zYV9nZW5lcmF0aW9uID0gKytzYWlfZ2VuZXJhdGlvbjsKKwlzcGluX3VubG9jaygmc2FpX2dlbmVyYXRpb25fbG9jayk7CisKIAlyZXR1cm4gc2FpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqCi1sbF9zYWlfZ2V0KHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpKQorLyogZnJlZSBzYWkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsbF9zYWlfZnJlZShzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSkKIHsKLQlhdG9taWNfaW5jKCZzYWktPnNhaV9yZWZjb3VudCk7CisJTEFTU0VSVChzYWktPnNhaV9kZW50cnkpOworCWRwdXQoc2FpLT5zYWlfZGVudHJ5KTsKKwlrZnJlZShzYWkpOworfQorCisvKgorICogdGFrZSByZWZjb3VudCBvZiBzYWkgaWYgc2FpIGZvciBAZGlyIGV4aXN0cywgd2hpY2ggbWVhbnMgc3RhdGFoZWFkIGlzIG9uIGZvcgorICogdGhpcyBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpsbF9zYWlfZ2V0KHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oZGlyKTsKKwlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSA9IE5VTEw7CisKKwlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCXNhaSA9IGxsaS0+bGxpX3NhaTsKKwlpZiAoc2FpKQorCQlhdG9taWNfaW5jKCZzYWktPnNhaV9yZWZjb3VudCk7CisJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCiAJcmV0dXJuIHNhaTsKIH0KIAorLyoKKyAqIHB1dCBzYWkgcmVmY291bnQgYWZ0ZXIgdXNlLCBpZiByZWZjb3VudCByZWFjaGVzIHplcm8sIGZyZWUgc2FpIGFuZCBzYV9lbnRyaWVzCisgKiBhdHRhY2hlZCB0byBpdC4KKyAqLwogc3RhdGljIHZvaWQgbGxfc2FpX3B1dChzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSkKIHsKLQlzdHJ1Y3QgaW5vZGUJICppbm9kZSA9IHNhaS0+c2FpX2lub2RlOwotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgICA9IGxsX2kyaW5mbyhpbm9kZSk7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhzYWktPnNhaV9kZW50cnktPmRfaW5vZGUpOwogCiAJaWYgKGF0b21pY19kZWNfYW5kX2xvY2soJnNhaS0+c2FpX3JlZmNvdW50LCAmbGxpLT5sbGlfc2FfbG9jaykpIHsKLQkJc3RydWN0IGxsX3NhX2VudHJ5ICplbnRyeSwgKm5leHQ7Ci0KLQkJaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZzYWktPnNhaV9yZWZjb3VudCkgPiAwKSkgewotCQkJLyogSXQgaXMgcmFjZSBjYXNlLCB0aGUgaW50ZXJwcmV0IGNhbGxiYWNrIGp1c3QgaG9sZAotCQkJICogYSByZWZlcmVuY2UgY291bnQKLQkJCSAqLwotCQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTEFTU0VSVCghbGxpLT5sbGlfb3BlbmRpcl9rZXkpOwotCQlMQVNTRVJUKHRocmVhZF9pc19zdG9wcGVkKCZzYWktPnNhaV90aHJlYWQpKTsKLQkJTEFTU0VSVCh0aHJlYWRfaXNfc3RvcHBlZCgmc2FpLT5zYWlfYWdsX3RocmVhZCkpOworCQlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoc2FpLT5zYWlfZGVudHJ5LT5kX2lub2RlKTsKKwkJc3RydWN0IHNhX2VudHJ5ICplbnRyeSwgKm5leHQ7CiAKIAkJbGxpLT5sbGlfc2FpID0gTlVMTDsKLQkJbGxpLT5sbGlfb3BlbmRpcl9waWQgPSAwOwogCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CiAKLQkJaWYgKHNhaS0+c2FpX3NlbnQgPiBzYWktPnNhaV9yZXBsaWVkKQotCQkJQ0RFQlVHKERfUkVBREEsICJzdGF0YWhlYWQgZm9yIGRpciAiREZJRAotCQkJICAgICAgIiBkb2VzIG5vdCBmaW5pc2g6IFtzZW50OiVsbHVdIFtyZXBsaWVkOiVsbHVdXG4iLAotCQkJICAgICAgUEZJRCgmbGxpLT5sbGlfZmlkKSwKLQkJCSAgICAgIHNhaS0+c2FpX3NlbnQsIHNhaS0+c2FpX3JlcGxpZWQpOworCQlMQVNTRVJUKHRocmVhZF9pc19zdG9wcGVkKCZzYWktPnNhaV90aHJlYWQpKTsKKwkJTEFTU0VSVCh0aHJlYWRfaXNfc3RvcHBlZCgmc2FpLT5zYWlfYWdsX3RocmVhZCkpOworCQlMQVNTRVJUKHNhaS0+c2FpX3NlbnQgPT0gc2FpLT5zYWlfcmVwbGllZCk7CisJCUxBU1NFUlQoIXNhX2hhc19jYWxsYmFjayhzYWkpKTsKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHQsICZzYWktPnNhaV9lbnRyaWVzLAotCQkJCQkgc2VfbGluaykKLQkJCWRvX3NhX2VudHJ5X2Zpbmkoc2FpLCBlbnRyeSk7Ci0KLQkJTEFTU0VSVChsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzKSk7Ci0JCUxBU1NFUlQobGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCkpOwotCQlMQVNTRVJUKGxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfc3RhdGVkKSk7CisJCQkJCSBzZV9saXN0KQorCQkJc2Ffa2lsbChzYWksIGVudHJ5KTsKIAogCQlMQVNTRVJUKGF0b21pY19yZWFkKCZzYWktPnNhaV9jYWNoZV9jb3VudCkgPT0gMCk7Ci0JCUxBU1NFUlQobGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19hZ2wpKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZzYWktPnNhaV9hZ2xzKSk7CiAKLQkJaXB1dChpbm9kZSk7Ci0JCWtmcmVlKHNhaSk7CisJCWxsX3NhaV9mcmVlKHNhaSk7CisJCWF0b21pY19kZWMoJnNiaS0+bGxfc2FfcnVubmluZyk7CiAJfQogfQogCi0vKiBEbyBOT1QgZm9yZ2V0IHRvIGRyb3AgaW5vZGUgcmVmY291bnQgd2hlbiBpbnRvIHNhaV9lbnRyaWVzX2FnbC4gKi8KKy8qIERvIE5PVCBmb3JnZXQgdG8gZHJvcCBpbm9kZSByZWZjb3VudCB3aGVuIGludG8gc2FpX2FnbHMuICovCiBzdGF0aWMgdm9pZCBsbF9hZ2xfdHJpZ2dlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSkKIHsKIAlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpICAgPSBsbF9pMmluZm8oaW5vZGUpOwpAQCAtNTg4LDI5ICs1MzksMjEgQEAKIAlpcHV0KGlub2RlKTsKIH0KIAotc3RhdGljIHZvaWQgbGxfcG9zdF9zdGF0YWhlYWQoc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkpCisvKgorICogcHJlcGFyZSBpbm9kZSBmb3Igc2EgZW50cnksIGFkZCBpdCBpbnRvIGFnbCBsaXN0LCBub3cgc2FfZW50cnkgaXMgcmVhZHkKKyAqIHRvIGJlIHVzZWQgYnkgc2Nhbm5lciBwcm9jZXNzLgorICovCitzdGF0aWMgdm9pZCBzYV9pbnN0YW50aWF0ZShzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSwKKwkJCSAgIHN0cnVjdCBzYV9lbnRyeSAqZW50cnkpCiB7Ci0Jc3RydWN0IGlub2RlCSAgICpkaXIgICA9IHNhaS0+c2FpX2lub2RlOworCXN0cnVjdCBpbm9kZSAqZGlyID0gc2FpLT5zYWlfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBpbm9kZQkgICAqY2hpbGQ7Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gICAqbGxpICAgPSBsbF9pMmluZm8oZGlyKTsKLQlzdHJ1Y3QgbGxfc2FfZW50cnkgICAgICplbnRyeTsKIAlzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICptaW5mbzsKIAlzdHJ1Y3QgbG9va3VwX2ludGVudCAgICppdDsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgICpyZXE7CiAJc3RydWN0IG1kdF9ib2R5CSpib2R5OwogCWludAkJICAgICByYyAgICA9IDA7CiAKLQlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCWlmICh1bmxpa2VseShsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKSkpIHsKLQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5ID0gbGlzdF9lbnRyeShzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkLm5leHQsCi0JCQkgICBzdHJ1Y3QgbGxfc2FfZW50cnksIHNlX2xpc3QpOwotCWF0b21pY19pbmMoJmVudHJ5LT5zZV9yZWZjb3VudCk7Ci0JbGlzdF9kZWxfaW5pdCgmZW50cnktPnNlX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQogCUxBU1NFUlQoZW50cnktPnNlX2hhbmRsZSAhPSAwKTsKIAogCW1pbmZvID0gZW50cnktPnNlX21pbmZvOwpAQCAtNjMyLDcgKzU3NSw3IEBACiAJCS8qIFhYWDogTm8gZmlkIGluIHJlcGx5LCB0aGlzIGlzIHByb2JhYmx5IGNyb3NzLXJlZiBjYXNlLgogCQkgKiBTQSBjYW4ndCBoYW5kbGUgaXQgeWV0LgogCQkgKi8KLQkJaWYgKGJvZHktPnZhbGlkICYgT0JEX01EX01EUykgeworCQlpZiAoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX01EUykgewogCQkJcmMgPSAtRUFHQUlOOwogCQkJZ290byBvdXQ7CiAJCX0KQEAgLTY0MSw3ICs1ODQsNyBAQAogCQkgKiByZXZhbGlkYXRlLgogCQkgKi8KIAkJLyogdW5saW5rZWQgYW5kIHJlLWNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBuYW1lICovCi0JCWlmICh1bmxpa2VseSghbHVfZmlkX2VxKCZtaW5mby0+bWlfZGF0YS5vcF9maWQyLCAmYm9keS0+ZmlkMSkpKSB7CisJCWlmICh1bmxpa2VseSghbHVfZmlkX2VxKCZtaW5mby0+bWlfZGF0YS5vcF9maWQyLCAmYm9keS0+bWJvX2ZpZDEpKSkgewogCQkJZW50cnktPnNlX2lub2RlID0gTlVMTDsKIAkJCWlwdXQoY2hpbGQpOwogCQkJY2hpbGQgPSBOVUxMOwpAQCAtNjU5LDggKzYwMiw5IEBACiAJaWYgKHJjKQogCQlnb3RvIG91dDsKIAotCUNERUJVRyhEX0RMTVRSQUNFLCAiJXM6IHNldHRpbmcgbF9kYXRhIHRvIGlub2RlICJERklEIiVwXG4iLAorCUNERUJVRyhEX1JFQURBLCAiJXM6IHNldHRpbmcgJS4qcyIgREZJRCAiIGxfZGF0YSB0byBpbm9kZSAlcFxuIiwKIAkgICAgICAgbGxfZ2V0X2ZzbmFtZShjaGlsZC0+aV9zYiwgTlVMTCwgMCksCisJICAgICAgIGVudHJ5LT5zZV9xc3RyLmxlbiwgZW50cnktPnNlX3FzdHIubmFtZSwKIAkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoY2hpbGQpKSwgY2hpbGQpOwogCWxsX3NldF9sb2NrX2RhdGEobGxfaTJzYmkoZGlyKS0+bGxfbWRfZXhwLCBjaGlsZCwgaXQsIE5VTEwpOwogCkBAIC02NzAsMzQgKzYxNCw3NSBAQAogCQlsbF9hZ2xfYWRkKHNhaSwgY2hpbGQsIGVudHJ5LT5zZV9pbmRleCk7CiAKIG91dDoKLQkvKiBUaGUgImxsX3NhX2VudHJ5X3RvX3N0YXRlZCgpIiB3aWxsIGRyb3AgcmVsYXRlZCBsZGxtIGliaXRzIGxvY2sKLQkgKiByZWZlcmVuY2UgY291bnQgYnkgY2FsbGluZyAibGxfaW50ZW50X2Ryb3BfbG9jaygpIiBpbiBzcGl0ZSBvZiB0aGUKLQkgKiBhYm92ZSBvcGVyYXRpb25zIGZhaWxlZCBvciBub3QuIERvIG5vdCB3b3JyeSBhYm91dCBjYWxsaW5nCi0JICogImxsX2ludGVudF9kcm9wX2xvY2soKSIgbW9yZSB0aGFuIG9uY2UuCisJLyoKKwkgKiBzYV9tYWtlX3JlYWR5KCkgd2lsbCBkcm9wIGxkbG0gaWJpdHMgbG9jayByZWZjb3VudCBieSBjYWxsaW5nCisJICogbGxfaW50ZW50X2Ryb3BfbG9jaygpIGluIHNwaXRlIG9mIGZhaWx1cmVzLiBEbyBub3Qgd29ycnkgYWJvdXQKKwkgKiBjYWxsaW5nIGxsX2ludGVudF9kcm9wX2xvY2soKSBtb3JlIHRoYW4gb25jZS4KIAkgKi8KLQlyYyA9IGxsX3NhX2VudHJ5X3RvX3N0YXRlZChzYWksIGVudHJ5LAotCQkJCSAgIHJjIDwgMCA/IFNBX0VOVFJZX0lOVkEgOiBTQV9FTlRSWV9TVUNDKTsKLQlpZiAocmMgPT0gMCAmJiBlbnRyeS0+c2VfaW5kZXggPT0gc2FpLT5zYWlfaW5kZXhfd2FpdCkKLQkJd2FrZV91cCgmc2FpLT5zYWlfd2FpdHEpOwotCWxsX3NhX2VudHJ5X3B1dChzYWksIGVudHJ5KTsKKwlzYV9tYWtlX3JlYWR5KHNhaSwgZW50cnksIHJjKTsKIH0KIAorLyogb25jZSB0aGVyZSBhcmUgYXN5bmMgc3RhdCByZXBsaWVzLCBpbnN0YW50aWF0ZSBzYV9lbnRyeSBmcm9tIHJlcGxpZXMgKi8KK3N0YXRpYyB2b2lkIHNhX2hhbmRsZV9jYWxsYmFjayhzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSkKK3sKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpOworCisJbGxpID0gbGxfaTJpbmZvKHNhaS0+c2FpX2RlbnRyeS0+ZF9pbm9kZSk7CisKKwl3aGlsZSAoc2FfaGFzX2NhbGxiYWNrKHNhaSkpIHsKKwkJc3RydWN0IHNhX2VudHJ5ICplbnRyeTsKKworCQlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCQlpZiAodW5saWtlbHkoIXNhX2hhc19jYWxsYmFjayhzYWkpKSkgeworCQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCQkJYnJlYWs7CisJCX0KKwkJZW50cnkgPSBsaXN0X2VudHJ5KHNhaS0+c2FpX2ludGVyaW1fZW50cmllcy5uZXh0LAorCQkJCSAgIHN0cnVjdCBzYV9lbnRyeSwgc2VfbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5zZV9saXN0KTsKKwkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCisJCXNhX2luc3RhbnRpYXRlKHNhaSwgZW50cnkpOworCX0KK30KKworLyoKKyAqIGNhbGxiYWNrIGZvciBhc3luYyBzdGF0LCBiZWNhdXNlIHRoaXMgaXMgY2FsbGVkIGluIHB0bHJwY2QgY29udGV4dCwgd2Ugb25seQorICogcHV0IHNhX2VudHJ5IGluIHNhaV9jYl9lbnRyaWVzIGxpc3QsIGFuZCBsZXQgc2FfaGFuZGxlX2NhbGxiYWNrKCkgdG8gcmVhbGx5CisgKiBwcmVwYXJlIGlub2RlIGFuZCBpbnN0YW50aWF0ZSBzYV9lbnRyeSBsYXRlci4KKyAqLwogc3RhdGljIGludCBsbF9zdGF0YWhlYWRfaW50ZXJwcmV0KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLAogCQkJCSAgc3RydWN0IG1kX2VucXVldWVfaW5mbyAqbWluZm8sIGludCByYykKIHsKIAlzdHJ1Y3QgbG9va3VwX2ludGVudCAgICAgKml0ICA9ICZtaW5mby0+bWlfaXQ7CiAJc3RydWN0IGlub2RlCSAgICAgKmRpciA9IG1pbmZvLT5taV9kaXI7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gICAgICpsbGkgPSBsbF9pMmluZm8oZGlyKTsKLQlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSA9IE5VTEw7Ci0Jc3RydWN0IGxsX3NhX2VudHJ5ICAgICAgICplbnRyeTsKLQlfX3U2NAkJCSAgaGFuZGxlID0gMDsKLQlpbnQJCSAgICAgICB3YWtldXA7CisJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkgPSBsbGktPmxsaV9zYWk7CisJc3RydWN0IHNhX2VudHJ5ICplbnRyeSA9IChzdHJ1Y3Qgc2FfZW50cnkgKiltaW5mby0+bWlfY2JkYXRhOworCV9fdTY0IGhhbmRsZSA9IDA7CisJYm9vbCB3YWtldXA7CiAKIAlpZiAoaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfTE9PS1VQX05FRykpCiAJCXJjID0gLUVOT0VOVDsKIAotCWlmIChyYyA9PSAwKSB7Ci0JCS8qIHJlbGVhc2UgaWJpdHMgbG9jayBBU0FQIHRvIGF2b2lkIGRlYWRsb2NrIHdoZW4gc3RhdGFoZWFkCisJLyoKKwkgKiBiZWNhdXNlIHN0YXRhaGVhZCB0aHJlYWQgd2lsbCB3YWl0IGZvciBhbGwgaW5mbGlnaHQgUlBDIHRvIGZpbmlzaCwKKwkgKiBzYWkgc2hvdWxkIGJlIGFsd2F5cyB2YWxpZCwgbm8gbmVlZCB0byByZWZjb3VudAorCSAqLworCUxBU1NFUlQoc2FpKTsKKwlMQVNTRVJUKCF0aHJlYWRfaXNfc3RvcHBlZCgmc2FpLT5zYWlfdGhyZWFkKSk7CisJTEFTU0VSVChlbnRyeSk7CisKKwlDREVCVUcoRF9SRUFEQSwgInNhX2VudHJ5ICUuKnMgcmMgJWRcbiIsCisJICAgICAgIGVudHJ5LT5zZV9xc3RyLmxlbiwgZW50cnktPnNlX3FzdHIubmFtZSwgcmMpOworCisJaWYgKHJjKSB7CisJCWxsX2ludGVudF9yZWxlYXNlKGl0KTsKKwkJaXB1dChkaXIpOworCQlrZnJlZShtaW5mbyk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogcmVsZWFzZSBpYml0cyBsb2NrIEFTQVAgdG8gYXZvaWQgZGVhZGxvY2sgd2hlbiBzdGF0YWhlYWQKIAkJICogdGhyZWFkIGVucXVldWVzIGxvY2sgb24gcGFyZW50IGluIHJlYWRkaXIgYW5kIGFub3RoZXIKIAkJICogcHJvY2VzcyBlbnF1ZXVlcyBsb2NrIG9uIGNoaWxkIHdpdGggcGFyZW50IGxvY2sgaGVsZCwgZWcuCiAJCSAqIHVubGluay4KQEAgLTcwNyw2NSArNjkyLDMyIEBACiAJfQogCiAJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQkvKiBzdGFsZSBlbnRyeSAqLwotCWlmICh1bmxpa2VseSghbGxpLT5sbGlfc2FpIHx8Ci0JCSAgICAgbGxpLT5sbGlfc2FpLT5zYWlfZ2VuZXJhdGlvbiAhPSBtaW5mby0+bWlfZ2VuZXJhdGlvbikpIHsKLQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCQlyYyA9IC1FU1RBTEU7Ci0JCWdvdG8gb3V0OworCWlmIChyYykgeworCQl3YWtldXAgPSBfX3NhX21ha2VfcmVhZHkoc2FpLCBlbnRyeSwgcmMpOwogCX0gZWxzZSB7Ci0JCXNhaSA9IGxsX3NhaV9nZXQobGxpLT5sbGlfc2FpKTsKLQkJaWYgKHVubGlrZWx5KCF0aHJlYWRfaXNfcnVubmluZygmc2FpLT5zYWlfdGhyZWFkKSkpIHsKLQkJCXNhaS0+c2FpX3JlcGxpZWQrKzsKLQkJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQkJCXJjID0gLUVCQURGRDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJZW50cnkgPSBsbF9zYV9lbnRyeV9nZXRfYnlpbmRleChzYWksIG1pbmZvLT5taV9jYmRhdGEpOwotCQlpZiAoIWVudHJ5KSB7Ci0JCQlzYWktPnNhaV9yZXBsaWVkKys7Ci0JCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JCQlyYyA9IC1FSURSTTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKHJjICE9IDApIHsKLQkJCWRvX3NhX2VudHJ5X3RvX3N0YXRlZChzYWksIGVudHJ5LCBTQV9FTlRSWV9JTlZBKTsKLQkJCXdha2V1cCA9IChlbnRyeS0+c2VfaW5kZXggPT0gc2FpLT5zYWlfaW5kZXhfd2FpdCk7Ci0JCX0gZWxzZSB7Ci0JCQllbnRyeS0+c2VfbWluZm8gPSBtaW5mbzsKLQkJCWVudHJ5LT5zZV9yZXEgPSBwdGxycGNfcmVxdWVzdF9hZGRyZWYocmVxKTsKLQkJCS8qIFJlbGVhc2UgdGhlIGFzeW5jIGliaXRzIGxvY2sgQVNBUCB0byBhdm9pZCBkZWFkbG9jawotCQkJICogd2hlbiBzdGF0YWhlYWQgdGhyZWFkIHRyaWVzIHRvIGVucXVldWUgbG9jayBvbiBwYXJlbnQKLQkJCSAqIGZvciByZWFkcGFnZSBhbmQgb3RoZXIgdHJpZXMgdG8gZW5xdWV1ZSBsb2NrIG9uIGNoaWxkCi0JCQkgKiB3aXRoIHBhcmVudCdzIGxvY2sgaGVsZCwgZm9yIGV4YW1wbGU6IHVubGluay4KLQkJCSAqLwotCQkJZW50cnktPnNlX2hhbmRsZSA9IGhhbmRsZTsKLQkJCXdha2V1cCA9IGxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpOwotCQkJbGlzdF9hZGRfdGFpbCgmZW50cnktPnNlX2xpc3QsCi0JCQkJICAgICAgJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpOwotCQl9Ci0JCXNhaS0+c2FpX3JlcGxpZWQrKzsKLQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCi0JCWxsX3NhX2VudHJ5X3B1dChzYWksIGVudHJ5KTsKLQkJaWYgKHdha2V1cCkKLQkJCXdha2VfdXAoJnNhaS0+c2FpX3RocmVhZC50X2N0bF93YWl0cSk7CisJCWVudHJ5LT5zZV9taW5mbyA9IG1pbmZvOworCQllbnRyeS0+c2VfcmVxID0gcHRscnBjX3JlcXVlc3RfYWRkcmVmKHJlcSk7CisJCS8qCisJCSAqIFJlbGVhc2UgdGhlIGFzeW5jIGliaXRzIGxvY2sgQVNBUCB0byBhdm9pZCBkZWFkbG9jaworCQkgKiB3aGVuIHN0YXRhaGVhZCB0aHJlYWQgdHJpZXMgdG8gZW5xdWV1ZSBsb2NrIG9uIHBhcmVudAorCQkgKiBmb3IgcmVhZHBhZ2UgYW5kIG90aGVyIHRyaWVzIHRvIGVucXVldWUgbG9jayBvbiBjaGlsZAorCQkgKiB3aXRoIHBhcmVudCdzIGxvY2sgaGVsZCwgZm9yIGV4YW1wbGU6IHVubGluay4KKwkJICovCisJCWVudHJ5LT5zZV9oYW5kbGUgPSBoYW5kbGU7CisJCXdha2V1cCA9ICFzYV9oYXNfY2FsbGJhY2soc2FpKTsKKwkJbGlzdF9hZGRfdGFpbCgmZW50cnktPnNlX2xpc3QsICZzYWktPnNhaV9pbnRlcmltX2VudHJpZXMpOwogCX0KKwlzYWktPnNhaV9yZXBsaWVkKys7CiAKLW91dDoKLQlpZiAocmMgIT0gMCkgewotCQlsbF9pbnRlbnRfcmVsZWFzZShpdCk7Ci0JCWlwdXQoZGlyKTsKLQkJa2ZyZWUobWluZm8pOwotCX0KLQlpZiAoc2FpKQotCQlsbF9zYWlfcHV0KHNhaSk7CisJaWYgKHdha2V1cCkKKwkJd2FrZV91cCgmc2FpLT5zYWlfdGhyZWFkLnRfY3RsX3dhaXRxKTsKKwlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIHNhX2FyZ3NfZmluaShzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICptaW5mbywKKy8qIGZpbmlzaCBhc3luYyBzdGF0IFJQQyBhcmd1bWVudHMgKi8KK3N0YXRpYyB2b2lkIHNhX2ZpbmlfZGF0YShzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICptaW5mbywKIAkJCSBzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gKmVpbmZvKQogewogCUxBU1NFUlQobWluZm8gJiYgZWluZm8pOwpAQCAtNzc3LDEyICs3MjksMTEgQEAKIC8qKgogICogcHJlcGFyZSBhcmd1bWVudHMgZm9yIGFzeW5jIHN0YXQgUlBDLgogICovCi1zdGF0aWMgaW50IHNhX2FyZ3NfaW5pdChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICpjaGlsZCwKLQkJCXN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnksIHN0cnVjdCBtZF9lbnF1ZXVlX2luZm8gKipwbWksCitzdGF0aWMgaW50IHNhX3ByZXBfZGF0YShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICpjaGlsZCwKKwkJCXN0cnVjdCBzYV9lbnRyeSAqZW50cnksIHN0cnVjdCBtZF9lbnF1ZXVlX2luZm8gKipwbWksCiAJCQlzdHJ1Y3QgbGRsbV9lbnF1ZXVlX2luZm8gKipwZWkpCiB7CiAJY29uc3Qgc3RydWN0IHFzdHIgICAgICAqcXN0ciA9ICZlbnRyeS0+c2VfcXN0cjsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKmxsaSAgPSBsbF9pMmluZm8oZGlyKTsKIAlzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICAgKm1pbmZvOwogCXN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyAqZWluZm87CiAJc3RydWN0IG1kX29wX2RhdGEJKm9wX2RhdGE7CkBAIC04MDgsOCArNzU5LDcgQEAKIAltaW5mby0+bWlfaXQuaXRfb3AgPSBJVF9HRVRBVFRSOwogCW1pbmZvLT5taV9kaXIgPSBpZ3JhYihkaXIpOwogCW1pbmZvLT5taV9jYiA9IGxsX3N0YXRhaGVhZF9pbnRlcnByZXQ7Ci0JbWluZm8tPm1pX2dlbmVyYXRpb24gPSBsbGktPmxsaV9zYWktPnNhaV9nZW5lcmF0aW9uOwotCW1pbmZvLT5taV9jYmRhdGEgPSBlbnRyeS0+c2VfaW5kZXg7CisJbWluZm8tPm1pX2NiZGF0YSA9IGVudHJ5OwogCiAJZWluZm8tPmVpX3R5cGUgICA9IExETE1fSUJJVFM7CiAJZWluZm8tPmVpX21vZGUgICA9IGl0X3RvX2xvY2tfbW9kZSgmbWluZm8tPm1pX2l0KTsKQEAgLTgyNCwzMSArNzc0LDMzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG9fc2FfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5KQorLyogYXN5bmMgc3RhdCBmb3IgZmlsZSBub3QgZm91bmQgaW4gZGNhY2hlICovCitzdGF0aWMgaW50IHNhX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHNhX2VudHJ5ICplbnRyeSkKIHsKIAlzdHJ1Y3QgbWRfZW5xdWV1ZV9pbmZvICAgKm1pbmZvOwogCXN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyAqZWluZm87CiAJaW50CQkgICAgICAgcmM7CiAKLQlyYyA9IHNhX2FyZ3NfaW5pdChkaXIsIE5VTEwsIGVudHJ5LCAmbWluZm8sICZlaW5mbyk7CisJcmMgPSBzYV9wcmVwX2RhdGEoZGlyLCBOVUxMLCBlbnRyeSwgJm1pbmZvLCAmZWluZm8pOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCiAJcmMgPSBtZF9pbnRlbnRfZ2V0YXR0cl9hc3luYyhsbF9pMm1kZXhwKGRpciksIG1pbmZvLCBlaW5mbyk7Ci0JaWYgKHJjIDwgMCkKLQkJc2FfYXJnc19maW5pKG1pbmZvLCBlaW5mbyk7CisJaWYgKHJjKQorCQlzYV9maW5pX2RhdGEobWluZm8sIGVpbmZvKTsKIAogCXJldHVybiByYzsKIH0KIAogLyoqCi0gKiBzaW1pbGFyIHRvIGxsX3JldmFsaWRhdGVfaXQoKS4KLSAqIFxyZXR2YWwgICAgICAxIC0tIGRlbnRyeSB2YWxpZAotICogXHJldHZhbCAgICAgIDAgLS0gd2lsbCBzZW5kIHN0YXQtYWhlYWQgcmVxdWVzdAotICogXHJldHZhbCBvdGhlcnMgLS0gcHJlcGFyZSBzdGF0LWFoZWFkIHJlcXVlc3QgZmFpbGVkCisgKiBhc3luYyBzdGF0IGZvciBmaWxlIGZvdW5kIGluIGRjYWNoZSwgc2ltaWxhciB0byAucmV2YWxpZGF0ZQorICoKKyAqIFxyZXR2YWwJMSBkZW50cnkgdmFsaWQsIG5vIFJQQyBzZW50CisgKiBccmV0dmFsCTAgZGVudHJ5IGludmFsaWQsIHdpbGwgc2VuZCBhc3luYyBzdGF0IFJQQworICogXHJldHZhbAluZWdhdGl2ZSBudW1iZXIgdXBvbiBlcnJvcgogICovCi1zdGF0aWMgaW50IGRvX3NhX3JldmFsaWRhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnksCi0JCQkgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQorc3RhdGljIGludCBzYV9yZXZhbGlkYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5LAorCQkJIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3QgaW5vZGUJICAgICAqaW5vZGUgPSBkX2lub2RlKGRlbnRyeSk7CiAJc3RydWN0IGxvb2t1cF9pbnRlbnQgICAgICBpdCA9IHsgLml0X29wID0gSVRfR0VUQVRUUiwKQEAgLTg3Miw3ICs4MjQsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlyYyA9IHNhX2FyZ3NfaW5pdChkaXIsIGlub2RlLCBlbnRyeSwgJm1pbmZvLCAmZWluZm8pOworCXJjID0gc2FfcHJlcF9kYXRhKGRpciwgaW5vZGUsIGVudHJ5LCAmbWluZm8sICZlaW5mbyk7CiAJaWYgKHJjKSB7CiAJCWVudHJ5LT5zZV9pbm9kZSA9IE5VTEw7CiAJCWlwdXQoaW5vZGUpOwpAQCAtODgwLDU2ICs4MzIsNTAgQEAKIAl9CiAKIAlyYyA9IG1kX2ludGVudF9nZXRhdHRyX2FzeW5jKGxsX2kybWRleHAoZGlyKSwgbWluZm8sIGVpbmZvKTsKLQlpZiAocmMgPCAwKSB7CisJaWYgKHJjKSB7CiAJCWVudHJ5LT5zZV9pbm9kZSA9IE5VTEw7CiAJCWlwdXQoaW5vZGUpOwotCQlzYV9hcmdzX2ZpbmkobWluZm8sIGVpbmZvKTsKKwkJc2FfZmluaV9kYXRhKG1pbmZvLCBlaW5mbyk7CiAJfQogCiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCBsbF9zdGF0YWhlYWRfb25lKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgY29uc3QgY2hhciAqZW50cnlfbmFtZSwKLQkJCSAgICAgaW50IGVudHJ5X25hbWVfbGVuKQorLyogYXN5bmMgc3RhdCBmb3IgZmlsZSB3aXRoIEBuYW1lICovCitzdGF0aWMgdm9pZCBzYV9zdGF0YWhlYWQoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQogewogCXN0cnVjdCBpbm9kZQkgICAgICpkaXIgICAgPSBkX2lub2RlKHBhcmVudCk7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gICAgICpsbGkgICAgPSBsbF9pMmluZm8oZGlyKTsKIAlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaSAgICA9IGxsaS0+bGxpX3NhaTsKIAlzdHJ1Y3QgZGVudHJ5CSAgICAqZGVudHJ5ID0gTlVMTDsKLQlzdHJ1Y3QgbGxfc2FfZW50cnkgICAgICAgKmVudHJ5OworCXN0cnVjdCBzYV9lbnRyeSAqZW50cnk7CiAJaW50CQkgICAgICAgcmM7Ci0JaW50CQkgICAgICAgcmMxOwogCi0JZW50cnkgPSBsbF9zYV9lbnRyeV9hbGxvYyhwYXJlbnQsIHNhaSwgc2FpLT5zYWlfaW5kZXgsIGVudHJ5X25hbWUsCi0JCQkJICBlbnRyeV9uYW1lX2xlbik7CisJZW50cnkgPSBzYV9hbGxvYyhwYXJlbnQsIHNhaSwgc2FpLT5zYWlfaW5kZXgsIG5hbWUsIGxlbik7CiAJaWYgKElTX0VSUihlbnRyeSkpCiAJCXJldHVybjsKIAogCWRlbnRyeSA9IGRfbG9va3VwKHBhcmVudCwgJmVudHJ5LT5zZV9xc3RyKTsKIAlpZiAoIWRlbnRyeSkgewotCQlyYyA9IGRvX3NhX2xvb2t1cChkaXIsIGVudHJ5KTsKKwkJcmMgPSBzYV9sb29rdXAoZGlyLCBlbnRyeSk7CiAJfSBlbHNlIHsKLQkJcmMgPSBkb19zYV9yZXZhbGlkYXRlKGRpciwgZW50cnksIGRlbnRyeSk7CisJCXJjID0gc2FfcmV2YWxpZGF0ZShkaXIsIGVudHJ5LCBkZW50cnkpOwogCQlpZiAocmMgPT0gMSAmJiBhZ2xfc2hvdWxkX3J1bihzYWksIGRfaW5vZGUoZGVudHJ5KSkpCiAJCQlsbF9hZ2xfYWRkKHNhaSwgZF9pbm9kZShkZW50cnkpLCBlbnRyeS0+c2VfaW5kZXgpOworCX0KIAorCWlmIChkZW50cnkpCiAJCWRwdXQoZGVudHJ5KTsKLQl9CiAKLQlpZiAocmMpIHsKLQkJcmMxID0gbGxfc2FfZW50cnlfdG9fc3RhdGVkKHNhaSwgZW50cnksCi0JCQkJCXJjIDwgMCA/IFNBX0VOVFJZX0lOVkEgOiBTQV9FTlRSWV9TVUNDKTsKLQkJaWYgKHJjMSA9PSAwICYmIGVudHJ5LT5zZV9pbmRleCA9PSBzYWktPnNhaV9pbmRleF93YWl0KQotCQkJd2FrZV91cCgmc2FpLT5zYWlfd2FpdHEpOwotCX0gZWxzZSB7CisJaWYgKHJjKQorCQlzYV9tYWtlX3JlYWR5KHNhaSwgZW50cnksIHJjKTsKKwllbHNlCiAJCXNhaS0+c2FpX3NlbnQrKzsKLQl9CiAKIAlzYWktPnNhaV9pbmRleCsrOwotCS8qIGRyb3Agb25lIHJlZmNvdW50IG9uIGVudHJ5IGJ5IGxsX3NhX2VudHJ5X2FsbG9jICovCi0JbGxfc2FfZW50cnlfcHV0KHNhaSwgZW50cnkpOwogfQogCisvKiBhc3luYyBnbGltcHNlIChhZ2wpIHRocmVhZCBtYWluIGZ1bmN0aW9uICovCiBzdGF0aWMgaW50IGxsX2FnbF90aHJlYWQodm9pZCAqYXJnKQogewogCXN0cnVjdCBkZW50cnkJICAgICpwYXJlbnQgPSBhcmc7CkBAIC05MzcsMTAgKzg4MywxMiBAQAogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqcGxsaSAgID0gbGxfaTJpbmZvKGRpcik7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gICAgICpjbGxpOwogCXN0cnVjdCBsbF9zYl9pbmZvCSpzYmkgICAgPSBsbF9pMnNiaShkaXIpOwotCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpICAgID0gbGxfc2FpX2dldChwbGxpLT5sbGlfc2FpKTsKLQlzdHJ1Y3QgcHRscnBjX3RocmVhZCAgICAgKnRocmVhZCA9ICZzYWktPnNhaV9hZ2xfdGhyZWFkOworCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpOworCXN0cnVjdCBwdGxycGNfdGhyZWFkICp0aHJlYWQ7CiAJc3RydWN0IGxfd2FpdF9pbmZvCWx3aSAgICA9IHsgMCB9OwogCisJc2FpID0gbGxfc2FpX2dldChkaXIpOworCXRocmVhZCA9ICZzYWktPnNhaV9hZ2xfdGhyZWFkOwogCXRocmVhZC0+dF9waWQgPSBjdXJyZW50X3BpZCgpOwogCUNERUJVRyhEX1JFQURBLCAiYWdsIHRocmVhZCBzdGFydGVkOiBzYWkgJXAsIHBhcmVudCAlcGRcbiIsCiAJICAgICAgIHNhaSwgcGFyZW50KTsKQEAgLTk1OSw3ICs5MDcsNyBAQAogCiAJd2hpbGUgKDEpIHsKIAkJbF93YWl0X2V2ZW50KHRocmVhZC0+dF9jdGxfd2FpdHEsCi0JCQkgICAgICFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX2FnbCkgfHwKKwkJCSAgICAgIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2FnbHMpIHx8CiAJCQkgICAgICF0aHJlYWRfaXNfcnVubmluZyh0aHJlYWQpLAogCQkJICAgICAmbHdpKTsKIApAQCAtOTcwLDggKzkxOCw4IEBACiAJCS8qIFRoZSBzdGF0YWhlYWQgdGhyZWFkIG1heWJlIGhlbHAgdG8gcHJvY2VzcyBBR0wgZW50cmllcywKIAkJICogc28gY2hlY2sgd2hldGhlciBsaXN0IGVtcHR5IGFnYWluLgogCQkgKi8KLQkJaWYgKCFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX2FnbCkpIHsKLQkJCWNsbGkgPSBsaXN0X2VudHJ5KHNhaS0+c2FpX2VudHJpZXNfYWdsLm5leHQsCisJCWlmICghbGlzdF9lbXB0eSgmc2FpLT5zYWlfYWdscykpIHsKKwkJCWNsbGkgPSBsaXN0X2VudHJ5KHNhaS0+c2FpX2FnbHMubmV4dCwKIAkJCQkJICBzdHJ1Y3QgbGxfaW5vZGVfaW5mbywgbGxpX2FnbF9saXN0KTsKIAkJCWxpc3RfZGVsX2luaXQoJmNsbGktPmxsaV9hZ2xfbGlzdCk7CiAJCQlzcGluX3VubG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKQEAgLTk4Myw4ICs5MzEsOCBAQAogCiAJc3Bpbl9sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOwogCXNhaS0+c2FpX2FnbF92YWxpZCA9IDA7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX2FnbCkpIHsKLQkJY2xsaSA9IGxpc3RfZW50cnkoc2FpLT5zYWlfZW50cmllc19hZ2wubmV4dCwKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2FnbHMpKSB7CisJCWNsbGkgPSBsaXN0X2VudHJ5KHNhaS0+c2FpX2FnbHMubmV4dCwKIAkJCQkgIHN0cnVjdCBsbF9pbm9kZV9pbmZvLCBsbGlfYWdsX2xpc3QpOwogCQlsaXN0X2RlbF9pbml0KCZjbGxpLT5sbGlfYWdsX2xpc3QpOwogCQlzcGluX3VubG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKQEAgLTEwMDEsNiArOTQ5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogc3RhcnQgYWdsIHRocmVhZCAqLwogc3RhdGljIHZvaWQgbGxfc3RhcnRfYWdsKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkpCiB7CiAJc3RydWN0IHB0bHJwY190aHJlYWQgKnRocmVhZCA9ICZzYWktPnNhaV9hZ2xfdGhyZWFkOwpAQCAtMTAyNSw1OCArOTc0LDcxIEBACiAJCSAgICAgJmx3aSk7CiB9CiAKKy8qIHN0YXRhaGVhZCB0aHJlYWQgbWFpbiBmdW5jdGlvbiAqLwogc3RhdGljIGludCBsbF9zdGF0YWhlYWRfdGhyZWFkKHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgZGVudHJ5CSAgICAqcGFyZW50ID0gYXJnOwogCXN0cnVjdCBpbm9kZQkgICAgICpkaXIgICAgPSBkX2lub2RlKHBhcmVudCk7Ci0Jc3RydWN0IGxsX2lub2RlX2luZm8gICAgICpwbGxpICAgPSBsbF9pMmluZm8oZGlyKTsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKmNsbGk7CisJc3RydWN0IGxsX2lub2RlX2luZm8gICAgICpsbGkgICA9IGxsX2kyaW5mbyhkaXIpOwogCXN0cnVjdCBsbF9zYl9pbmZvCSpzYmkgICAgPSBsbF9pMnNiaShkaXIpOwotCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpICAgID0gbGxfc2FpX2dldChwbGxpLT5sbGlfc2FpKTsKLQlzdHJ1Y3QgcHRscnBjX3RocmVhZCAgICAgKnRocmVhZCA9ICZzYWktPnNhaV90aHJlYWQ7Ci0Jc3RydWN0IHB0bHJwY190aHJlYWQgKmFnbF90aHJlYWQgPSAmc2FpLT5zYWlfYWdsX3RocmVhZDsKLQlzdHJ1Y3QgcGFnZQkgICAgICAqcGFnZTsKKwlzdHJ1Y3QgbGxfc3RhdGFoZWFkX2luZm8gKnNhaTsKKwlzdHJ1Y3QgcHRscnBjX3RocmVhZCAqc2FfdGhyZWFkOworCXN0cnVjdCBwdGxycGNfdGhyZWFkICphZ2xfdGhyZWFkOworCXN0cnVjdCBwYWdlCSAgICAgICpwYWdlID0gTlVMTDsKIAlfX3U2NAkJICAgICBwb3MgICAgPSAwOwogCWludAkJICAgICAgIGZpcnN0ICA9IDA7CiAJaW50CQkgICAgICAgcmMgICAgID0gMDsKLQlzdHJ1Y3QgbGxfZGlyX2NoYWluICAgICAgIGNoYWluOworCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwogCXN0cnVjdCBsX3dhaXRfaW5mbwlsd2kgICAgPSB7IDAgfTsKIAotCXRocmVhZC0+dF9waWQgPSBjdXJyZW50X3BpZCgpOworCXNhaSA9IGxsX3NhaV9nZXQoZGlyKTsKKwlzYV90aHJlYWQgPSAmc2FpLT5zYWlfdGhyZWFkOworCWFnbF90aHJlYWQgPSAmc2FpLT5zYWlfYWdsX3RocmVhZDsKKwlzYV90aHJlYWQtPnRfcGlkID0gY3VycmVudF9waWQoKTsKIAlDREVCVUcoRF9SRUFEQSwgInN0YXRhaGVhZCB0aHJlYWQgc3RhcnRpbmc6IHNhaSAlcCwgcGFyZW50ICVwZFxuIiwKIAkgICAgICAgc2FpLCBwYXJlbnQpOwogCisJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkaXIsIGRpciwgTlVMTCwgMCwgMCwKKwkJCQkgICAgIExVU1RSRV9PUENfQU5ZLCBkaXIpOworCWlmIChJU19FUlIob3BfZGF0YSkpIHsKKwkJcmMgPSBQVFJfRVJSKG9wX2RhdGEpOworCQlnb3RvIG91dDsKKwl9CisKKwlvcF9kYXRhLT5vcF9tYXhfcGFnZXMgPSBsbF9pMnNiaShkaXIpLT5sbF9tZF9icndfcGFnZXM7CisKIAlpZiAoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9BR0xfRU5BQkxFRCkKIAkJbGxfc3RhcnRfYWdsKHBhcmVudCwgc2FpKTsKIAogCWF0b21pY19pbmMoJnNiaS0+bGxfc2FfdG90YWwpOwotCXNwaW5fbG9jaygmcGxsaS0+bGxpX3NhX2xvY2spOwotCWlmICh0aHJlYWRfaXNfaW5pdCh0aHJlYWQpKQorCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJaWYgKHRocmVhZF9pc19pbml0KHNhX3RocmVhZCkpCiAJCS8qIElmIHNvbWVvbmUgZWxzZSBoYXMgY2hhbmdlZCB0aGUgdGhyZWFkIHN0YXRlCiAJCSAqIChlLmcuIGFscmVhZHkgY2hhbmdlZCB0byBTVkNfU1RPUFBJTkcpLCB3ZSBjYW4ndCBqdXN0CiAJCSAqIGJsaW5kbHkgb3ZlcndyaXRlIHRoYXQgc2V0dGluZy4KIAkJICovCi0JCXRocmVhZF9zZXRfZmxhZ3ModGhyZWFkLCBTVkNfUlVOTklORyk7Ci0Jc3Bpbl91bmxvY2soJnBsbGktPmxsaV9zYV9sb2NrKTsKLQl3YWtlX3VwKCZ0aHJlYWQtPnRfY3RsX3dhaXRxKTsKKwkJdGhyZWFkX3NldF9mbGFncyhzYV90aHJlYWQsIFNWQ19SVU5OSU5HKTsKKwlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJd2FrZV91cCgmc2FfdGhyZWFkLT50X2N0bF93YWl0cSk7CiAKLQlsbF9kaXJfY2hhaW5faW5pdCgmY2hhaW4pOwotCXBhZ2UgPSBsbF9nZXRfZGlyX3BhZ2UoZGlyLCBwb3MsICZjaGFpbik7Ci0KLQl3aGlsZSAoMSkgeworCXdoaWxlIChwb3MgIT0gTURTX0RJUl9FTkRfT0ZGICYmIHRocmVhZF9pc19ydW5uaW5nKHNhX3RocmVhZCkpIHsKIAkJc3RydWN0IGx1X2RpcnBhZ2UgKmRwOwogCQlzdHJ1Y3QgbHVfZGlyZW50ICAqZW50OwogCisJCXNhaS0+c2FpX2luX3JlYWRwYWdlID0gMTsKKwkJcGFnZSA9IGxsX2dldF9kaXJfcGFnZShkaXIsIG9wX2RhdGEsIHBvcyk7CisJCXNhaS0+c2FpX2luX3JlYWRwYWdlID0gMDsKIAkJaWYgKElTX0VSUihwYWdlKSkgewogCQkJcmMgPSBQVFJfRVJSKHBhZ2UpOwotCQkJQ0RFQlVHKERfUkVBREEsICJlcnJvciByZWFkaW5nIGRpciAiREZJRCIgYXQgJWxsdS8lbGx1OiBbcmMgJWRdIFtwYXJlbnQgJXVdXG4iLAorCQkJQ0RFQlVHKERfUkVBREEsICJlcnJvciByZWFkaW5nIGRpciAiREZJRCIgYXQgJWxsdS8lbGx1OiBvcGVuZGlyX3BpZCA9ICV1OiByYyA9ICVkXG4iLAogCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGRpcikpLCBwb3MsIHNhaS0+c2FpX2luZGV4LAotCQkJICAgICAgIHJjLCBwbGxpLT5sbGlfb3BlbmRpcl9waWQpOwotCQkJZ290byBvdXQ7CisJCQkgICAgICAgbGxpLT5sbGlfb3BlbmRpcl9waWQsIHJjKTsKKwkJCWJyZWFrOwogCQl9CiAKIAkJZHAgPSBwYWdlX2FkZHJlc3MocGFnZSk7Ci0JCWZvciAoZW50ID0gbHVfZGlyZW50X3N0YXJ0KGRwKTsgZW50OworCQlmb3IgKGVudCA9IGx1X2RpcmVudF9zdGFydChkcCk7CisJCSAgICAgZW50ICYmIHRocmVhZF9pc19ydW5uaW5nKHNhX3RocmVhZCkgJiYgIXNhX2xvd19oaXQoc2FpKTsKIAkJICAgICBlbnQgPSBsdV9kaXJlbnRfbmV4dChlbnQpKSB7CiAJCQlfX3U2NCBoYXNoOwogCQkJaW50IG5hbWVsZW47CkBAIC0xMTIzLDEyMyArMTA4NSw3OSBAQAogCQkJaWYgKHVubGlrZWx5KCsrZmlyc3QgPT0gMSkpCiAJCQkJY29udGludWU7CiAKLWtlZXBfaXQ6Ci0JCQlsX3dhaXRfZXZlbnQodGhyZWFkLT50X2N0bF93YWl0cSwKLQkJCQkgICAgICFzYV9zZW50X2Z1bGwoc2FpKSB8fAotCQkJCSAgICAgIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpIHx8Ci0JCQkJICAgICAhbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19hZ2wpIHx8Ci0JCQkJICAgICAhdGhyZWFkX2lzX3J1bm5pbmcodGhyZWFkKSwKLQkJCQkgICAgICZsd2kpOworCQkJLyogd2FpdCBmb3Igc3BhcmUgc3RhdGFoZWFkIHdpbmRvdyAqLworCQkJZG8geworCQkJCWxfd2FpdF9ldmVudChzYV90aHJlYWQtPnRfY3RsX3dhaXRxLAorCQkJCQkgICAgICFzYV9zZW50X2Z1bGwoc2FpKSB8fAorCQkJCQkgICAgIHNhX2hhc19jYWxsYmFjayhzYWkpIHx8CisJCQkJCSAgICAgIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2FnbHMpIHx8CisJCQkJCSAgICAgIXRocmVhZF9pc19ydW5uaW5nKHNhX3RocmVhZCksCisJCQkJCSAgICAgJmx3aSk7CisJCQkJc2FfaGFuZGxlX2NhbGxiYWNrKHNhaSk7CiAKLWludGVycHJldF9pdDoKLQkJCXdoaWxlICghbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCkpCi0JCQkJbGxfcG9zdF9zdGF0YWhlYWQoc2FpKTsKKwkJCQlzcGluX2xvY2soJmxsaS0+bGxpX2FnbF9sb2NrKTsKKwkJCQl3aGlsZSAoc2Ffc2VudF9mdWxsKHNhaSkgJiYKKwkJCQkgICAgICAgIWFnbF9saXN0X2VtcHR5KHNhaSkpIHsKKwkJCQkJc3RydWN0IGxsX2lub2RlX2luZm8gKmNsbGk7CiAKLQkJCWlmICh1bmxpa2VseSghdGhyZWFkX2lzX3J1bm5pbmcodGhyZWFkKSkpIHsKLQkJCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgMCk7Ci0JCQkJcmMgPSAwOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQkvKiBJZiBubyB3aW5kb3cgZm9yIG1ldGFkYXRhIHN0YXRhaGVhZCwgYnV0IHRoZXJlIGFyZQotCQkJICogc29tZSBBR0wgZW50cmllcyB0byBiZSB0cmlnZ2VyZWQsIHRoZW4gdHJ5IHRvIGhlbHAKLQkJCSAqIHRvIHByb2Nlc3MgdGhlIEFHTCBlbnRyaWVzLgotCQkJICovCi0JCQlpZiAoc2Ffc2VudF9mdWxsKHNhaSkpIHsKLQkJCQlzcGluX2xvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7Ci0JCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX2FnbCkpIHsKLQkJCQkJY2xsaSA9IGxpc3RfZW50cnkoc2FpLT5zYWlfZW50cmllc19hZ2wubmV4dCwKKwkJCQkJY2xsaSA9IGxpc3RfZW50cnkoc2FpLT5zYWlfYWdscy5uZXh0LAogCQkJCQkJCSAgc3RydWN0IGxsX2lub2RlX2luZm8sIGxsaV9hZ2xfbGlzdCk7CiAJCQkJCWxpc3RfZGVsX2luaXQoJmNsbGktPmxsaV9hZ2xfbGlzdCk7Ci0JCQkJCXNwaW5fdW5sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOworCQkJCQlzcGluX3VubG9jaygmbGxpLT5sbGlfYWdsX2xvY2spOworCiAJCQkJCWxsX2FnbF90cmlnZ2VyKCZjbGxpLT5sbGlfdmZzX2lub2RlLAogCQkJCQkJICAgICAgIHNhaSk7CiAKLQkJCQkJaWYgKCFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKSkKLQkJCQkJCWdvdG8gaW50ZXJwcmV0X2l0OwotCi0JCQkJCWlmICh1bmxpa2VseSgKLQkJCQkJCSF0aHJlYWRfaXNfcnVubmluZyh0aHJlYWQpKSkgewotCQkJCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIDApOwotCQkJCQkJcmMgPSAwOwotCQkJCQkJZ290byBvdXQ7Ci0JCQkJCX0KLQotCQkJCQlpZiAoIXNhX3NlbnRfZnVsbChzYWkpKQotCQkJCQkJZ290byBkb19pdDsKLQotCQkJCQlzcGluX2xvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7CisJCQkJCXNwaW5fbG9jaygmbGxpLT5sbGlfYWdsX2xvY2spOwogCQkJCX0KLQkJCQlzcGluX3VubG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKKwkJCQlzcGluX3VubG9jaygmbGxpLT5sbGlfYWdsX2xvY2spOworCQkJfSB3aGlsZSAoc2Ffc2VudF9mdWxsKHNhaSkgJiYKKwkJCQkgdGhyZWFkX2lzX3J1bm5pbmcoc2FfdGhyZWFkKSk7CiAKLQkJCQlnb3RvIGtlZXBfaXQ7Ci0JCQl9Ci0KLWRvX2l0OgotCQkJbGxfc3RhdGFoZWFkX29uZShwYXJlbnQsIG5hbWUsIG5hbWVsZW4pOworCQkJc2Ffc3RhdGFoZWFkKHBhcmVudCwgbmFtZSwgbmFtZWxlbik7CiAJCX0KKwogCQlwb3MgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfZW5kKTsKLQkJaWYgKHBvcyA9PSBNRFNfRElSX0VORF9PRkYpIHsKLQkJCS8qCi0JCQkgKiBFbmQgb2YgZGlyZWN0b3J5IHJlYWNoZWQuCi0JCQkgKi8KLQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCAwKTsKLQkJCXdoaWxlICgxKSB7Ci0JCQkJbF93YWl0X2V2ZW50KHRocmVhZC0+dF9jdGxfd2FpdHEsCi0JCQkJCSAgICAgIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpIHx8Ci0JCQkJCSAgICAgc2FpLT5zYWlfc2VudCA9PSBzYWktPnNhaV9yZXBsaWVkIHx8Ci0JCQkJCSAgICAgIXRocmVhZF9pc19ydW5uaW5nKHRocmVhZCksCi0JCQkJCSAgICAgJmx3aSk7CisJCWxsX3JlbGVhc2VfcGFnZShkaXIsIHBhZ2UsCisJCQkJbGUzMl90b19jcHUoZHAtPmxkcF9mbGFncykgJiBMREZfQ09MTElERSk7CiAKLQkJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpKQotCQkJCQlsbF9wb3N0X3N0YXRhaGVhZChzYWkpOwotCi0JCQkJaWYgKHVubGlrZWx5KCF0aHJlYWRfaXNfcnVubmluZyh0aHJlYWQpKSkgewotCQkJCQlyYyA9IDA7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQotCQkJCWlmIChzYWktPnNhaV9zZW50ID09IHNhaS0+c2FpX3JlcGxpZWQgJiYKLQkJCQkgICAgbGlzdF9lbXB0eSgmc2FpLT5zYWlfZW50cmllc19yZWNlaXZlZCkpCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlzcGluX2xvY2soJnBsbGktPmxsaV9hZ2xfbG9jayk7Ci0JCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfYWdsKSAmJgotCQkJICAgICAgIHRocmVhZF9pc19ydW5uaW5nKHRocmVhZCkpIHsKLQkJCQljbGxpID0gbGlzdF9lbnRyeShzYWktPnNhaV9lbnRyaWVzX2FnbC5uZXh0LAotCQkJCQkJICBzdHJ1Y3QgbGxfaW5vZGVfaW5mbywgbGxpX2FnbF9saXN0KTsKLQkJCQlsaXN0X2RlbF9pbml0KCZjbGxpLT5sbGlfYWdsX2xpc3QpOwotCQkJCXNwaW5fdW5sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOwotCQkJCWxsX2FnbF90cmlnZ2VyKCZjbGxpLT5sbGlfdmZzX2lub2RlLCBzYWkpOwotCQkJCXNwaW5fbG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOwotCi0JCQlyYyA9IDA7Ci0JCQlnb3RvIG91dDsKLQkJfSBlbHNlIGlmICgxKSB7Ci0JCQkvKgotCQkJICogY2hhaW4gaXMgZXhoYXVzdGVkLgotCQkJICogTm9ybWFsIGNhc2U6IGNvbnRpbnVlIHRvIHRoZSBuZXh0IHBhZ2UuCi0JCQkgKi8KLQkJCWxsX3JlbGVhc2VfcGFnZShwYWdlLCBsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKSAmCi0JCQkJCSAgICAgIExERl9DT0xMSURFKTsKLQkJCXBhZ2UgPSBsbF9nZXRfZGlyX3BhZ2UoZGlyLCBwb3MsICZjaGFpbik7Ci0JCX0gZWxzZSB7Ci0JCQlMQVNTRVJUKGxlMzJfdG9fY3B1KGRwLT5sZHBfZmxhZ3MpICYgTERGX0NPTExJREUpOwotCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIDEpOwotCQkJLyoKLQkJCSAqIGdvIGludG8gb3ZlcmZsb3cgcGFnZS4KLQkJCSAqLworCQlpZiAoc2FfbG93X2hpdChzYWkpKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlhdG9taWNfaW5jKCZzYmktPmxsX3NhX3dyb25nKTsKKwkJCUNERUJVRyhEX1JFQURBLCAiU3RhdGFoZWFkIGZvciBkaXIgIkRGSUQiIGhpdCByYXRpbyB0b28gbG93OiBoaXQvbWlzcyAlbGx1LyVsbHUsIHNlbnQvcmVwbGllZCAlbGx1LyVsbHUsIHN0b3BwaW5nIHN0YXRhaGVhZCB0aHJlYWQ6IHBpZCAlZFxuIiwKKwkJCSAgICAgICBQRklEKCZsbGktPmxsaV9maWQpLCBzYWktPnNhaV9oaXQsCisJCQkgICAgICAgc2FpLT5zYWlfbWlzcywgc2FpLT5zYWlfc2VudCwKKwkJCSAgICAgICBzYWktPnNhaV9yZXBsaWVkLCBjdXJyZW50X3BpZCgpKTsKKwkJCWJyZWFrOwogCQl9CiAJfQorCWxsX2ZpbmlzaF9tZF9vcF9kYXRhKG9wX2RhdGEpOwogCisJaWYgKHJjIDwgMCkgeworCQlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOworCQl0aHJlYWRfc2V0X2ZsYWdzKHNhX3RocmVhZCwgU1ZDX1NUT1BQSU5HKTsKKwkJbGxpLT5sbGlfc2FfZW5hYmxlZCA9IDA7CisJCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwl9CisKKwkvKgorCSAqIHN0YXRhaGVhZCBpcyBmaW5pc2hlZCwgYnV0IHN0YXRhaGVhZCBlbnRyaWVzIG5lZWQgdG8gYmUgY2FjaGVkLCB3YWl0CisJICogZm9yIGZpbGUgcmVsZWFzZSB0byBzdG9wIG1lLgorCSAqLworCXdoaWxlICh0aHJlYWRfaXNfcnVubmluZyhzYV90aHJlYWQpKSB7CisJCWxfd2FpdF9ldmVudChzYV90aHJlYWQtPnRfY3RsX3dhaXRxLAorCQkJICAgICBzYV9oYXNfY2FsbGJhY2soc2FpKSB8fAorCQkJICAgICAhYWdsX2xpc3RfZW1wdHkoc2FpKSB8fAorCQkJICAgICAhdGhyZWFkX2lzX3J1bm5pbmcoc2FfdGhyZWFkKSwKKwkJCSAgICAgJmx3aSk7CisKKwkJc2FfaGFuZGxlX2NhbGxiYWNrKHNhaSk7CisJfQogb3V0OgogCWlmIChzYWktPnNhaV9hZ2xfdmFsaWQpIHsKLQkJc3Bpbl9sb2NrKCZwbGxpLT5sbGlfYWdsX2xvY2spOworCQlzcGluX2xvY2soJmxsaS0+bGxpX2FnbF9sb2NrKTsKIAkJdGhyZWFkX3NldF9mbGFncyhhZ2xfdGhyZWFkLCBTVkNfU1RPUFBJTkcpOwotCQlzcGluX3VubG9jaygmcGxsaS0+bGxpX2FnbF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX2FnbF9sb2NrKTsKIAkJd2FrZV91cCgmYWdsX3RocmVhZC0+dF9jdGxfd2FpdHEpOwogCiAJCUNERUJVRyhEX1JFQURBLCAic3RvcCBhZ2wgdGhyZWFkOiBzYWkgJXAgcGlkICV1XG4iLApAQCAtMTI0OSw4NCArMTE2Nyw5MyBAQAogCQkJICAgICAmbHdpKTsKIAl9IGVsc2UgewogCQkvKiBTZXQgYWdsX3RocmVhZCBmbGFncyBhbnl3YXkuICovCi0JCXRocmVhZF9zZXRfZmxhZ3MoJnNhaS0+c2FpX2FnbF90aHJlYWQsIFNWQ19TVE9QUEVEKTsKKwkJdGhyZWFkX3NldF9mbGFncyhhZ2xfdGhyZWFkLCBTVkNfU1RPUFBFRCk7CiAJfQotCWxsX2Rpcl9jaGFpbl9maW5pKCZjaGFpbik7Ci0Jc3Bpbl9sb2NrKCZwbGxpLT5sbGlfc2FfbG9jayk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZzYWktPnNhaV9lbnRyaWVzX3JlY2VpdmVkKSkgewotCQl0aHJlYWRfc2V0X2ZsYWdzKHRocmVhZCwgU1ZDX1NUT1BQSU5HKTsKLQkJc3Bpbl91bmxvY2soJnBsbGktPmxsaV9zYV9sb2NrKTsKIAotCQkvKiBUbyByZWxlYXNlIHRoZSByZXNvdXJjZXMgaGVsZCBieSByZWNlaXZlZCBlbnRyaWVzLiAqLwotCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpKQotCQkJbGxfcG9zdF9zdGF0YWhlYWQoc2FpKTsKLQotCQlzcGluX2xvY2soJnBsbGktPmxsaV9zYV9sb2NrKTsKKwkvKgorCSAqIHdhaXQgZm9yIGluZmxpZ2h0IHN0YXRhaGVhZCBSUENzIHRvIGZpbmlzaCwgYW5kIHRoZW4gd2UgY2FuIGZyZWUgc2FpCisJICogc2FmZWx5IGJlY2F1c2Ugc3RhdGFoZWFkIFJQQyB3aWxsIGFjY2VzcyBzYWkgZGF0YQorCSAqLworCXdoaWxlIChzYWktPnNhaV9zZW50ICE9IHNhaS0+c2FpX3JlcGxpZWQpIHsKKwkJLyogaW4gY2FzZSB3ZSdyZSBub3Qgd29rZW4gdXAsIHRpbWVvdXQgd2FpdCAqLworCQlsd2kgPSBMV0lfVElNRU9VVChtc2Vjc190b19qaWZmaWVzKE1TRUNfUEVSX1NFQyA+PiAzKSwKKwkJCQkgIE5VTEwsIE5VTEwpOworCQlsX3dhaXRfZXZlbnQoc2FfdGhyZWFkLT50X2N0bF93YWl0cSwKKwkJCSAgICAgc2FpLT5zYWlfc2VudCA9PSBzYWktPnNhaV9yZXBsaWVkLCAmbHdpKTsKIAl9Ci0JdGhyZWFkX3NldF9mbGFncyh0aHJlYWQsIFNWQ19TVE9QUEVEKTsKLQlzcGluX3VubG9jaygmcGxsaS0+bGxpX3NhX2xvY2spOwotCXdha2VfdXAoJnNhaS0+c2FpX3dhaXRxKTsKLQl3YWtlX3VwKCZ0aHJlYWQtPnRfY3RsX3dhaXRxKTsKLQlsbF9zYWlfcHV0KHNhaSk7Ci0JZHB1dChwYXJlbnQpOworCisJLyogcmVsZWFzZSByZXNvdXJjZXMgaGVsZCBieSBzdGF0YWhlYWQgUlBDcyAqLworCXNhX2hhbmRsZV9jYWxsYmFjayhzYWkpOworCisJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwl0aHJlYWRfc2V0X2ZsYWdzKHNhX3RocmVhZCwgU1ZDX1NUT1BQRUQpOworCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwogCUNERUJVRyhEX1JFQURBLCAic3RhdGFoZWFkIHRocmVhZCBzdG9wcGVkOiBzYWkgJXAsIHBhcmVudCAlcGRcbiIsCiAJICAgICAgIHNhaSwgcGFyZW50KTsKKworCXdha2VfdXAoJnNhaS0+c2FpX3dhaXRxKTsKKwl3YWtlX3VwKCZzYV90aHJlYWQtPnRfY3RsX3dhaXRxKTsKKwlsbF9zYWlfcHV0KHNhaSk7CisKIAlyZXR1cm4gcmM7CiB9CiAKLS8qKgotICogY2FsbGVkIGluIGxsX2ZpbGVfcmVsZWFzZSgpLgotICovCi12b2lkIGxsX3N0b3Bfc3RhdGFoZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICprZXkpCisvKiBhdXRob3JpemUgb3BlbmVkIGRpciBoYW5kbGUgQGtleSB0byBzdGF0YWhlYWQgKi8KK3ZvaWQgbGxfYXV0aG9yaXplX3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgdm9pZCAqa2V5KQogewogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oZGlyKTsKIAotCWlmICh1bmxpa2VseSgha2V5KSkKLQkJcmV0dXJuOworCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJaWYgKCFsbGktPmxsaV9vcGVuZGlyX2tleSAmJiAhbGxpLT5sbGlfc2FpKSB7CisJCS8qCisJCSAqIGlmIGxsaV9zYWkgaXMgbm90IE5VTEwsIGl0IG1lYW5zIHByZXZpb3VzIHN0YXRhaGVhZCBpcyBub3QKKwkJICogZmluaXNoZWQgeWV0LCB3ZSdkIGJldHRlciBub3Qgc3RhcnQgYSBuZXcgc3RhdGFoZWFkIGZvciBub3cuCisJCSAqLworCQlMQVNTRVJUKCFsbGktPmxsaV9vcGVuZGlyX3BpZCk7CisJCWxsaS0+bGxpX29wZW5kaXJfa2V5ID0ga2V5OworCQlsbGktPmxsaV9vcGVuZGlyX3BpZCA9IGN1cnJlbnRfcGlkKCk7CisJCWxsaS0+bGxpX3NhX2VuYWJsZWQgPSAxOworCX0KKwlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Cit9CisKKy8qCisgKiBkZWF1dGhvcml6ZSBvcGVuZWQgZGlyIGhhbmRsZSBAa2V5IHRvIHN0YXRhaGVhZCwgYnV0IHN0YXRhaGVhZCB0aHJlYWQgbWF5CisgKiBzdGlsbCBiZSBydW5uaW5nLCBub3RpZnkgaXQgdG8gcXVpdC4KKyAqLwordm9pZCBsbF9kZWF1dGhvcml6ZV9zdGF0YWhlYWQoc3RydWN0IGlub2RlICpkaXIsIHZvaWQgKmtleSkKK3sKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGRpcik7CisJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWk7CisKKwlMQVNTRVJUKGxsaS0+bGxpX29wZW5kaXJfa2V5ID09IGtleSk7CisJTEFTU0VSVChsbGktPmxsaV9vcGVuZGlyX3BpZCk7CisKKwlDREVCVUcoRF9SRUFEQSwgImRlYXV0aG9yaXplIHN0YXRhaGVhZCBmb3IgIkRGSUQiXG4iLAorCSAgICAgICBQRklEKCZsbGktPmxsaV9maWQpKTsKIAogCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JaWYgKGxsaS0+bGxpX29wZW5kaXJfa2V5ICE9IGtleSB8fCBsbGktPmxsaV9vcGVuZGlyX3BpZCA9PSAwKSB7Ci0JCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQogCWxsaS0+bGxpX29wZW5kaXJfa2V5ID0gTlVMTDsKLQotCWlmIChsbGktPmxsaV9zYWkpIHsKLQkJc3RydWN0IGxfd2FpdF9pbmZvIGx3aSA9IHsgMCB9OwotCQlzdHJ1Y3QgcHRscnBjX3RocmVhZCAqdGhyZWFkID0gJmxsaS0+bGxpX3NhaS0+c2FpX3RocmVhZDsKLQotCQlpZiAoIXRocmVhZF9pc19zdG9wcGVkKHRocmVhZCkpIHsKLQkJCXRocmVhZF9zZXRfZmxhZ3ModGhyZWFkLCBTVkNfU1RPUFBJTkcpOwotCQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCQkJd2FrZV91cCgmdGhyZWFkLT50X2N0bF93YWl0cSk7Ci0KLQkJCUNERUJVRyhEX1JFQURBLCAic3RvcCBzdGF0YWhlYWQgdGhyZWFkOiBzYWkgJXAgcGlkICV1XG4iLAotCQkJICAgICAgIGxsaS0+bGxpX3NhaSwgKHVuc2lnbmVkIGludCl0aHJlYWQtPnRfcGlkKTsKLQkJCWxfd2FpdF9ldmVudCh0aHJlYWQtPnRfY3RsX3dhaXRxLAotCQkJCSAgICAgdGhyZWFkX2lzX3N0b3BwZWQodGhyZWFkKSwKLQkJCQkgICAgICZsd2kpOwotCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCQl9Ci0KKwlsbGktPmxsaV9vcGVuZGlyX3BpZCA9IDA7CisJbGxpLT5sbGlfc2FfZW5hYmxlZCA9IDA7CisJc2FpID0gbGxpLT5sbGlfc2FpOworCWlmIChzYWkgJiYgdGhyZWFkX2lzX3J1bm5pbmcoJnNhaS0+c2FpX3RocmVhZCkpIHsKIAkJLyoKLQkJICogUHV0IHRoZSByZWYgd2hpY2ggd2FzIGhlbGQgd2hlbiBmaXJzdCBzdGF0YWhlYWRfZW50ZXIuCi0JCSAqIEl0IG1heWJlIG5vdCB0aGUgbGFzdCByZWYgZm9yIHNvbWUgc3RhdGFoZWFkIHJlcXVlc3RzCi0JCSAqIG1heWJlIGluZmxpZ2h0LgorCQkgKiBzdGF0YWhlYWQgdGhyZWFkIG1heSBub3QgcXVpdCB5ZXQgYmVjYXVzZSBpdCBuZWVkcyB0byBjYWNoZQorCQkgKiBlbnRyaWVzLCBub3cgaXQncyB0aW1lIHRvIHRlbGwgaXQgdG8gcXVpdC4KIAkJICovCi0JCWxsX3NhaV9wdXQobGxpLT5sbGlfc2FpKTsKLQl9IGVsc2UgewotCQlsbGktPmxsaV9vcGVuZGlyX3BpZCA9IDA7Ci0JCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwkJdGhyZWFkX3NldF9mbGFncygmc2FpLT5zYWlfdGhyZWFkLCBTVkNfU1RPUFBJTkcpOworCQl3YWtlX3VwKCZzYWktPnNhaV90aHJlYWQudF9jdGxfd2FpdHEpOwogCX0KKwlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CiB9CiAKIGVudW0gewogCS8qKgogCSAqIG5vdCBmaXJzdCBkaXJlbnQsIG9yIGlzICIuIgogCSAqLwotCUxTX05PTkVfRklSU1RfREUgPSAwLAorCUxTX05PVF9GSVJTVF9ERSA9IDAsCiAJLyoqCiAJICogdGhlIGZpcnN0IG5vbi1oaWRkZW4gZGlyZW50CiAJICovCkBAIC0xMzM3LDE3ICsxMjY0LDI2IEBACiAJTFNfRklSU1RfRE9UX0RFCiB9OwogCisvKiBmaWxlIGlzIGZpcnN0IGRpcmVudCB1bmRlciBAZGlyICovCiBzdGF0aWMgaW50IGlzX2ZpcnN0X2RpcmVudChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewotCXN0cnVjdCBsbF9kaXJfY2hhaW4gICBjaGFpbjsKIAljb25zdCBzdHJ1Y3QgcXN0ciAgKnRhcmdldCA9ICZkZW50cnktPmRfbmFtZTsKKwlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKIAlzdHJ1Y3QgcGFnZQkgICpwYWdlOwogCV9fdTY0CQkgcG9zICAgID0gMDsKIAlpbnQJCSAgIGRvdF9kZTsKLQlpbnQJCSAgIHJjICAgICA9IExTX05PTkVfRklSU1RfREU7CisJaW50IHJjID0gTFNfTk9UX0ZJUlNUX0RFOwogCi0JbGxfZGlyX2NoYWluX2luaXQoJmNoYWluKTsKLQlwYWdlID0gbGxfZ2V0X2Rpcl9wYWdlKGRpciwgcG9zLCAmY2hhaW4pOworCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgZGlyLCBkaXIsIE5VTEwsIDAsIDAsCisJCQkJICAgICBMVVNUUkVfT1BDX0FOWSwgZGlyKTsKKwlpZiAoSVNfRVJSKG9wX2RhdGEpKQorCQlyZXR1cm4gUFRSX0VSUihvcF9kYXRhKTsKKwkvKioKKwkgKiBGSVhNRSBjaG9vc2UgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgcmVhZGRpcgorCSAqLworCW9wX2RhdGEtPm9wX21heF9wYWdlcyA9IGxsX2kyc2JpKGRpciktPmxsX21kX2Jyd19wYWdlczsKKworCXBhZ2UgPSBsbF9nZXRfZGlyX3BhZ2UoZGlyLCBvcF9kYXRhLCBwb3MpOwogCiAJd2hpbGUgKDEpIHsKIAkJc3RydWN0IGx1X2RpcnBhZ2UgKmRwOwpAQCAtMTM1Nyw5ICsxMjkzLDEwIEBACiAJCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGRpcik7CiAKIAkJCXJjID0gUFRSX0VSUihwYWdlKTsKLQkJCUNFUlJPUigiZXJyb3IgcmVhZGluZyBkaXIgIkRGSUQiIGF0ICVsbHU6IFtyYyAlZF0gW3BhcmVudCAldV1cbiIsCisJCQlDRVJST1IoIiVzOiBlcnJvciByZWFkaW5nIGRpciAiREZJRCIgYXQgJWxsdTogb3BlbmRpcl9waWQgPSAldSA6IHJjID0gJWRcbiIsCisJCQkgICAgICAgbGxfZ2V0X2ZzbmFtZShkaXItPmlfc2IsIE5VTEwsIDApLAogCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGRpcikpLCBwb3MsCi0JCQkgICAgICAgcmMsIGxsaS0+bGxpX29wZW5kaXJfcGlkKTsKKwkJCSAgICAgICBsbGktPmxsaV9vcGVuZGlyX3BpZCwgcmMpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTQxMSwxMyArMTM0OCwxMyBAQAogCiAJCQlpZiAodGFyZ2V0LT5sZW4gIT0gbmFtZWxlbiB8fAogCQkJICAgIG1lbWNtcCh0YXJnZXQtPm5hbWUsIG5hbWUsIG5hbWVsZW4pICE9IDApCi0JCQkJcmMgPSBMU19OT05FX0ZJUlNUX0RFOworCQkJCXJjID0gTFNfTk9UX0ZJUlNUX0RFOwogCQkJZWxzZSBpZiAoIWRvdF9kZSkKIAkJCQlyYyA9IExTX0ZJUlNUX0RFOwogCQkJZWxzZQogCQkJCXJjID0gTFNfRklSU1RfRE9UX0RFOwogCi0JCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgMCk7CisJCQlsbF9yZWxlYXNlX3BhZ2UoZGlyLCBwYWdlLCBmYWxzZSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCQlwb3MgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfZW5kKTsKQEAgLTE0MjUsMjYxICsxMzYyLDIyOCBAQAogCQkJLyoKIAkJCSAqIEVuZCBvZiBkaXJlY3RvcnkgcmVhY2hlZC4KIAkJCSAqLwotCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIDApOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoMSkgeworCQkJbGxfcmVsZWFzZV9wYWdlKGRpciwgcGFnZSwgZmFsc2UpOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CiAJCQkvKgogCQkJICogY2hhaW4gaXMgZXhoYXVzdGVkCiAJCQkgKiBOb3JtYWwgY2FzZTogY29udGludWUgdG8gdGhlIG5leHQgcGFnZS4KIAkJCSAqLwotCQkJbGxfcmVsZWFzZV9wYWdlKHBhZ2UsIGxlMzJfdG9fY3B1KGRwLT5sZHBfZmxhZ3MpICYKLQkJCQkJICAgICAgTERGX0NPTExJREUpOwotCQkJcGFnZSA9IGxsX2dldF9kaXJfcGFnZShkaXIsIHBvcywgJmNoYWluKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBnbyBpbnRvIG92ZXJmbG93IHBhZ2UuCi0JCQkgKi8KLQkJCUxBU1NFUlQobGUzMl90b19jcHUoZHAtPmxkcF9mbGFncykgJiBMREZfQ09MTElERSk7Ci0JCQlsbF9yZWxlYXNlX3BhZ2UocGFnZSwgMSk7CisJCQlsbF9yZWxlYXNlX3BhZ2UoZGlyLCBwYWdlLAorCQkJCQlsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKSAmCisJCQkJCUxERl9DT0xMSURFKTsKKwkJCXBhZ2UgPSBsbF9nZXRfZGlyX3BhZ2UoZGlyLCBvcF9kYXRhLCBwb3MpOwogCQl9CiAJfQotCiBvdXQ6Ci0JbGxfZGlyX2NoYWluX2ZpbmkoJmNoYWluKTsKKwlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkCi1sbF9zYWlfdW5wbHVnKHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLCBzdHJ1Y3QgbGxfc2FfZW50cnkgKmVudHJ5KQorLyoqCisgKiByZXZhbGlkYXRlIEBkZW50cnlwIGZyb20gc3RhdGFoZWFkIGNhY2hlCisgKgorICogXHBhcmFtW2luXSAgZGlyCXBhcmVudCBkaXJlY3RvcnkKKyAqIFxwYXJhbVtpbl0gIHNhaQlzYWkgc3RydWN0dXJlCisgKiBccGFyYW1bb3V0XSBkZW50cnlwCXBvaW50ZXIgdG8gZGVudHJ5IHdoaWNoIHdpbGwgYmUgcmV2YWxpZGF0ZWQKKyAqIFxwYXJhbVtpbl0gIHVucGx1Zwl1bnBsdWcgc3RhdGFoZWFkIHdpbmRvdyBvbmx5IChub3JtYWxseSBmb3IgbmVnYXRpdmUKKyAqCQkJZGVudHJ5KQorICogXHJldHZhbAkJMSBvbiBzdWNjZXNzLCBkZW50cnkgaXMgc2F2ZWQgaW4gQGRlbnRyeXAKKyAqIFxyZXR2YWwJCTAgaWYgcmV2YWxpZGF0aW9uIGZhaWxlZCAobm8gcHJvcGVyIGxvY2sgb24gY2xpZW50KQorICogXHJldHZhbAkJbmVnYXRpdmUgbnVtYmVyIHVwb24gZXJyb3IKKyAqLworc3RhdGljIGludCByZXZhbGlkYXRlX3N0YXRhaGVhZF9kZW50cnkoc3RydWN0IGlub2RlICpkaXIsCisJCQkJICAgICAgIHN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpLAorCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5cCwKKwkJCQkgICAgICAgYm9vbCB1bnBsdWcpCiB7Ci0Jc3RydWN0IHB0bHJwY190aHJlYWQgKnRocmVhZCA9ICZzYWktPnNhaV90aHJlYWQ7Ci0Jc3RydWN0IGxsX3NiX2luZm8gICAgKnNiaSAgICA9IGxsX2kyc2JpKHNhaS0+c2FpX2lub2RlKTsKLQlpbnQJCSAgIGhpdDsKKwlzdHJ1Y3Qgc2FfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgbF93YWl0X2luZm8gbHdpID0geyAwIH07CisJc3RydWN0IGxsX2RlbnRyeV9kYXRhICpsZGQ7CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaTsKKwlpbnQgcmMgPSAwOwogCi0JaWYgKGVudHJ5ICYmIGVudHJ5LT5zZV9zdGF0ID09IFNBX0VOVFJZX1NVQ0MpCi0JCWhpdCA9IDE7Ci0JZWxzZQotCQloaXQgPSAwOworCWlmICgoKmRlbnRyeXApLT5kX25hbWUubmFtZVswXSA9PSAnLicpIHsKKwkJaWYgKHNhaS0+c2FpX2xzX2FsbCB8fAorCQkgICAgc2FpLT5zYWlfbWlzc19oaWRkZW4gPj0gc2FpLT5zYWlfc2tpcF9oaWRkZW4pIHsKKwkJCS8qCisJCQkgKiBIaWRkZW4gZGVudHJ5IGlzIHRoZSBmaXJzdCBvbmUsIG9yIHN0YXRhaGVhZAorCQkJICogdGhyZWFkIGRvZXMgbm90IHNraXAgc28gbWFueSBoaWRkZW4gZGVudHJpZXMKKwkJCSAqIGJlZm9yZSAic2FpX2xzX2FsbCIgZW5hYmxlZCBhcyBiZWxvdy4KKwkJCSAqLworCQl9IGVsc2UgeworCQkJaWYgKCFzYWktPnNhaV9sc19hbGwpCisJCQkJLyoKKwkJCQkgKiBJdCBtYXliZSBiZWNhdXNlIGhpZGRlbiBkZW50cnkgaXMgbm90CisJCQkJICogdGhlIGZpcnN0IG9uZSwgInNhaV9sc19hbGwiIHdhcyBub3QKKwkJCQkgKiBzZXQsIHRoZW4gImxzIC1hbCIgbWlzc2VkLiBFbmFibGUKKwkJCQkgKiAic2FpX2xzX2FsbCIgZm9yIHN1Y2ggY2FzZS4KKwkJCQkgKi8KKwkJCQlzYWktPnNhaV9sc19hbGwgPSAxOwogCi0JbGxfc2FfZW50cnlfZmluaShzYWksIGVudHJ5KTsKLQlpZiAoaGl0KSB7Ci0JCXNhaS0+c2FpX2hpdCsrOwotCQlzYWktPnNhaV9jb25zZWN1dGl2ZV9taXNzID0gMDsKLQkJc2FpLT5zYWlfbWF4ID0gbWluKDIgKiBzYWktPnNhaV9tYXgsIHNiaS0+bGxfc2FfbWF4KTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKHNhaS0+c2FpX2lub2RlKTsKLQotCQlzYWktPnNhaV9taXNzKys7Ci0JCXNhaS0+c2FpX2NvbnNlY3V0aXZlX21pc3MrKzsKLQkJaWYgKHNhX2xvd19oaXQoc2FpKSAmJiB0aHJlYWRfaXNfcnVubmluZyh0aHJlYWQpKSB7Ci0JCQlhdG9taWNfaW5jKCZzYmktPmxsX3NhX3dyb25nKTsKLQkJCUNERUJVRyhEX1JFQURBLCAiU3RhdGFoZWFkIGZvciBkaXIgIiBERklEICIgaGl0IHJhdGlvIHRvbyBsb3c6IGhpdC9taXNzICVsbHUvJWxsdSwgc2VudC9yZXBsaWVkICVsbHUvJWxsdSwgc3RvcHBpbmcgc3RhdGFoZWFkIHRocmVhZFxuIiwKLQkJCSAgICAgICBQRklEKCZsbGktPmxsaV9maWQpLCBzYWktPnNhaV9oaXQsCi0JCQkgICAgICAgc2FpLT5zYWlfbWlzcywgc2FpLT5zYWlfc2VudCwKLQkJCSAgICAgICBzYWktPnNhaV9yZXBsaWVkKTsKLQkJCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7Ci0JCQlpZiAoIXRocmVhZF9pc19zdG9wcGVkKHRocmVhZCkpCi0JCQkJdGhyZWFkX3NldF9mbGFncyh0aHJlYWQsIFNWQ19TVE9QUElORyk7Ci0JCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJCQkvKgorCQkJICogU3VjaCAiZ2V0YXR0ciIgaGFzIGJlZW4gc2tpcHBlZCBiZWZvcmUKKwkJCSAqICJzYWlfbHNfYWxsIiBlbmFibGVkIGFzIGFib3ZlLgorCQkJICovCisJCQlzYWktPnNhaV9taXNzX2hpZGRlbisrOworCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0KIAl9CiAKLQlpZiAoIXRocmVhZF9pc19zdG9wcGVkKHRocmVhZCkpCi0JCXdha2VfdXAoJnRocmVhZC0+dF9jdGxfd2FpdHEpOworCWlmICh1bnBsdWcpIHsKKwkJcmMgPSAxOworCQlnb3RvIG91dF91bnBsdWc7CisJfQorCisJZW50cnkgPSBzYV9nZXQoc2FpLCAmKCpkZW50cnlwKS0+ZF9uYW1lKTsKKwlpZiAoIWVudHJ5KSB7CisJCXJjID0gLUVBR0FJTjsKKwkJZ290byBvdXRfdW5wbHVnOworCX0KKworCS8qIGlmIHN0YXRhaGVhZCBpcyBidXN5IGluIHJlYWRkaXIsIGhlbHAgaXQgZG8gcG9zdC13b3JrICovCisJaWYgKCFzYV9yZWFkeShlbnRyeSkgJiYgc2FpLT5zYWlfaW5fcmVhZHBhZ2UpCisJCXNhX2hhbmRsZV9jYWxsYmFjayhzYWkpOworCisJaWYgKCFzYV9yZWFkeShlbnRyeSkpIHsKKwkJc2FpLT5zYWlfaW5kZXhfd2FpdCA9IGVudHJ5LT5zZV9pbmRleDsKKwkJbHdpID0gTFdJX1RJTUVPVVRfSU5UUihjZnNfdGltZV9zZWNvbmRzKDMwKSwgTlVMTCwKKwkJCQkgICAgICAgTFdJX09OX1NJR05BTF9OT09QLCBOVUxMKTsKKwkJcmMgPSBsX3dhaXRfZXZlbnQoc2FpLT5zYWlfd2FpdHEsIHNhX3JlYWR5KGVudHJ5KSwgJmx3aSk7CisJCWlmIChyYyA8IDApIHsKKwkJCS8qCisJCQkgKiBlbnRyeSBtYXkgbm90IGJlIHJlYWR5LCBzbyBpdCBtYXkgYmUgdXNlZCBieSBpbmZsaWdodAorCQkJICogc3RhdGFoZWFkIFJQQywgZG9uJ3QgZnJlZSBpdC4KKwkJCSAqLworCQkJZW50cnkgPSBOVUxMOworCQkJcmMgPSAtRUFHQUlOOworCQkJZ290byBvdXRfdW5wbHVnOworCQl9CisJfQorCisJaWYgKGVudHJ5LT5zZV9zdGF0ZSA9PSBTQV9FTlRSWV9TVUNDICYmIGVudHJ5LT5zZV9pbm9kZSkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZW50cnktPnNlX2lub2RlOworCQlzdHJ1Y3QgbG9va3VwX2ludGVudCBpdCA9IHsgLml0X29wID0gSVRfR0VUQVRUUiwKKwkJCQkJICAgIC5pdF9sb2NrX2hhbmRsZSA9IGVudHJ5LT5zZV9oYW5kbGUgfTsKKwkJX191NjQgYml0czsKKworCQlyYyA9IG1kX3JldmFsaWRhdGVfbG9jayhsbF9pMm1kZXhwKGRpciksICZpdCwKKwkJCQkJbGxfaW5vZGUyZmlkKGlub2RlKSwgJmJpdHMpOworCQlpZiAocmMgPT0gMSkgeworCQkJaWYgKCEoKmRlbnRyeXApLT5kX2lub2RlKSB7CisJCQkJc3RydWN0IGRlbnRyeSAqYWxpYXM7CisKKwkJCQlhbGlhcyA9IGxsX3NwbGljZV9hbGlhcyhpbm9kZSwgKmRlbnRyeXApOworCQkJCWlmIChJU19FUlIoYWxpYXMpKSB7CisJCQkJCXJjID0gUFRSX0VSUihhbGlhcyk7CisJCQkJCWdvdG8gb3V0X3VucGx1ZzsKKwkJCQl9CisJCQkJKmRlbnRyeXAgPSBhbGlhczsKKwkJCQkvKioKKwkJCQkgKiBzdGF0YWhlYWQgcHJlcGFyZWQgdGhpcyBpbm9kZSwgdHJhbnNmZXIgaW5vZGUKKwkJCQkgKiByZWZjb3VudCBmcm9tIHNhX2VudHJ5IHRvIGRlbnRyeQorCQkJCSAqLworCQkJCWVudHJ5LT5zZV9pbm9kZSA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCgqZGVudHJ5cCktPmRfaW5vZGUgIT0gaW5vZGUpIHsKKwkJCQkvKiByZXZhbGlkYXRlLCBidXQgaW5vZGUgaXMgcmVjcmVhdGVkICovCisJCQkJQ0RFQlVHKERfUkVBREEsCisJCQkJICAgICAgICIlczogc3RhbGUgZGVudHJ5ICVwZCBpbm9kZSAiREZJRCIsIHN0YXRhaGVhZCBpbm9kZSAiREZJRCJcbiIsCisJCQkJICAgICAgIGxsX2dldF9mc25hbWUoKCpkZW50cnlwKS0+ZF9pbm9kZS0+aV9zYiwKKwkJCQkJCSAgICAgTlVMTCwgMCksCisJCQkJICAgICAgICpkZW50cnlwLAorCQkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZCgoKmRlbnRyeXApLT5kX2lub2RlKSksCisJCQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSkpOworCQkJCXJjID0gLUVTVEFMRTsKKwkJCQlnb3RvIG91dF91bnBsdWc7CisJCQl9CisKKwkJCWlmICgoYml0cyAmIE1EU19JTk9ERUxPQ0tfTE9PS1VQKSAmJgorCQkJICAgIGRfbHVzdHJlX2ludmFsaWQoKmRlbnRyeXApKQorCQkJCWRfbHVzdHJlX3JldmFsaWRhdGUoKmRlbnRyeXApOworCQkJbGxfaW50ZW50X3JlbGVhc2UoJml0KTsKKwkJfQorCX0KK291dF91bnBsdWc6CisJLyoKKwkgKiBzdGF0YWhlYWQgY2FjaGVkIHNhX2VudHJ5IGNhbiBiZSB1c2VkIG9ubHkgb25jZSwgYW5kIHdpbGwgYmUga2lsbGVkCisJICogcmlnaHQgYWZ0ZXIgdXNlLCBzbyBpZiBsb29rdXAvcmV2YWxpZGF0ZSBhY2Nlc3NlZCBzdGF0YWhlYWQgY2FjaGUsCisJICogc2V0IGRlbnRyeSBsZGRfc2FfZ2VuZXJhdGlvbiB0byBwYXJlbnQgbGxpX3NhX2dlbmVyYXRpb24sIGxhdGVyIGlmIHdlCisJICogc3RhdCB0aGlzIGZpbGUgYWdhaW4sIHdlIGtub3cgd2UndmUgZG9uZSBzdGF0YWhlYWQgYmVmb3JlLCBzZWUKKwkgKiBkZW50cnlfbWF5X3N0YXRhaGVhZCgpLgorCSAqLworCWxkZCA9IGxsX2QyZCgqZGVudHJ5cCk7CisJbGxpID0gbGxfaTJpbmZvKGRpcik7CisJLyogbGRkIGNhbiBiZSBOVUxMIGlmIGxsaXRlIGxvb2t1cCBmYWlsZWQuICovCisJaWYgKGxkZCkKKwkJbGRkLT5sbGRfc2FfZ2VuZXJhdGlvbiA9IGxsaS0+bGxpX3NhX2dlbmVyYXRpb247CisJc2FfcHV0KHNhaSwgZW50cnkpOworCXJldHVybiByYzsKIH0KIAogLyoqCi0gKiBTdGFydCBzdGF0YWhlYWQgdGhyZWFkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGRpciBlbnRyeS4KLSAqIE90aGVyd2lzZSBpZiBhIHRocmVhZCBpcyBzdGFydGVkIGFscmVhZHksIHdhaXQgaXQgdW50aWwgaXQgaXMgYWhlYWQgb2YgbWUuCi0gKiBccmV0dmFsIDEgICAgICAgLS0gZmluZCBlbnRyeSB3aXRoIGxvY2sgaW4gY2FjaGUsIHRoZSBjYWxsZXIgbmVlZHMgdG8gZG8KLSAqCQkgICAgbm90aGluZy4KLSAqIFxyZXR2YWwgMCAgICAgICAtLSBmaW5kIGVudHJ5IGluIGNhY2hlLCBidXQgd2l0aG91dCBsb2NrLCB0aGUgY2FsbGVyIG5lZWRzCi0gKgkJICAgIHJlZnJlc2ggZnJvbSBNRFMuCi0gKiBccmV0dmFsIG90aGVycyAgLS0gdGhlIGNhbGxlciBuZWVkIHRvIHByb2Nlc3MgYXMgbm9uLXN0YXRhaGVhZC4KKyAqIHN0YXJ0IHN0YXRhaGVhZCB0aHJlYWQKKyAqCisgKiBccGFyYW1baW5dIGRpcglwYXJlbnQgZGlyZWN0b3J5CisgKiBccGFyYW1baW5dIGRlbnRyeQlkZW50cnkgdGhhdCB0cmlnZ2VycyBzdGF0YWhlYWQsIG5vcm1hbGx5IHRoZSBmaXJzdAorICoJCQlkaXJlbnQgdW5kZXIgQGRpcgorICogXHJldHZhbAkJLUVBR0FJTiBvbiBzdWNjZXNzLCBiZWNhdXNlIHdoZW4gdGhpcyBmdW5jdGlvbiBpcworICoJCQljYWxsZWQsIGl0J3MgYWxyZWFkeSBpbiBsb29rdXAgY2FsbCwgc28gY2xpZW50IHNob3VsZAorICoJCQlkbyBpdCBpdHNlbGYgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciBzdGF0YWhlYWQgdGhyZWFkCisgKgkJCXRvIGRvIGl0IGFzeW5jaHJvbm91c2x5LgorICogXHJldHZhbAkJbmVnYXRpdmUgbnVtYmVyIHVwb24gZXJyb3IKICAqLwotaW50IGRvX3N0YXRhaGVhZF9lbnRlcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeXAsCi0JCSAgICAgICBpbnQgb25seV91bnBsdWcpCitzdGF0aWMgaW50IHN0YXJ0X3N0YXRhaGVhZF90aHJlYWQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKLQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAgICAgKmxsaSAgID0gbGxfaTJpbmZvKGRpcik7Ci0Jc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkgICA9IGxsaS0+bGxpX3NhaTsKLQlzdHJ1Y3QgZGVudHJ5CSAgICAqcGFyZW50OwotCXN0cnVjdCBsbF9zYV9lbnRyeSAgICAgICAqZW50cnk7Ci0Jc3RydWN0IHB0bHJwY190aHJlYWQgICAgICp0aHJlYWQ7Ci0Jc3RydWN0IGxfd2FpdF9pbmZvCWx3aSAgID0geyAwIH07CisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhkaXIpOworCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpID0gTlVMTDsKKwlzdHJ1Y3QgbF93YWl0X2luZm8gbHdpID0geyAwIH07CisJc3RydWN0IHB0bHJwY190aHJlYWQgKnRocmVhZDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci0JaW50CQkgICAgICAgcmMgICAgPSAwOwotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqcGxsaTsKLQotCUxBU1NFUlQobGxpLT5sbGlfb3BlbmRpcl9waWQgPT0gY3VycmVudF9waWQoKSk7Ci0KLQlpZiAoc2FpKSB7Ci0JCXRocmVhZCA9ICZzYWktPnNhaV90aHJlYWQ7Ci0JCWlmICh1bmxpa2VseSh0aHJlYWRfaXNfc3RvcHBlZCh0aHJlYWQpICYmCi0JCQkgICAgIGxpc3RfZW1wdHkoJnNhaS0+c2FpX2VudHJpZXNfc3RhdGVkKSkpIHsKLQkJCS8qIHRvIHJlbGVhc2UgcmVzb3VyY2UgKi8KLQkJCWxsX3N0b3Bfc3RhdGFoZWFkKGRpciwgbGxpLT5sbGlfb3BlbmRpcl9rZXkpOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQotCQlpZiAoKCpkZW50cnlwKS0+ZF9uYW1lLm5hbWVbMF0gPT0gJy4nKSB7Ci0JCQlpZiAoc2FpLT5zYWlfbHNfYWxsIHx8Ci0JCQkgICAgc2FpLT5zYWlfbWlzc19oaWRkZW4gPj0gc2FpLT5zYWlfc2tpcF9oaWRkZW4pIHsKLQkJCQkvKgotCQkJCSAqIEhpZGRlbiBkZW50cnkgaXMgdGhlIGZpcnN0IG9uZSwgb3Igc3RhdGFoZWFkCi0JCQkJICogdGhyZWFkIGRvZXMgbm90IHNraXAgc28gbWFueSBoaWRkZW4gZGVudHJpZXMKLQkJCQkgKiBiZWZvcmUgInNhaV9sc19hbGwiIGVuYWJsZWQgYXMgYmVsb3cuCi0JCQkJICovCi0JCQl9IGVsc2UgewotCQkJCWlmICghc2FpLT5zYWlfbHNfYWxsKQotCQkJCQkvKgotCQkJCQkgKiBJdCBtYXliZSBiZWNhdXNlIGhpZGRlbiBkZW50cnkgaXMgbm90Ci0JCQkJCSAqIHRoZSBmaXJzdCBvbmUsICJzYWlfbHNfYWxsIiB3YXMgbm90Ci0JCQkJCSAqIHNldCwgdGhlbiAibHMgLWFsIiBtaXNzZWQuIEVuYWJsZQotCQkJCQkgKiAic2FpX2xzX2FsbCIgZm9yIHN1Y2ggY2FzZS4KLQkJCQkJICovCi0JCQkJCXNhaS0+c2FpX2xzX2FsbCA9IDE7Ci0KLQkJCQkvKgotCQkJCSAqIFN1Y2ggImdldGF0dHIiIGhhcyBiZWVuIHNraXBwZWQgYmVmb3JlCi0JCQkJICogInNhaV9sc19hbGwiIGVuYWJsZWQgYXMgYWJvdmUuCi0JCQkJICovCi0JCQkJc2FpLT5zYWlfbWlzc19oaWRkZW4rKzsKLQkJCQlyZXR1cm4gLUVBR0FJTjsKLQkJCX0KLQkJfQotCi0JCWVudHJ5ID0gbGxfc2FfZW50cnlfZ2V0X2J5bmFtZShzYWksICYoKmRlbnRyeXApLT5kX25hbWUpOwotCQlpZiAoIWVudHJ5IHx8IG9ubHlfdW5wbHVnKSB7Ci0JCQlsbF9zYWlfdW5wbHVnKHNhaSwgZW50cnkpOwotCQkJcmV0dXJuIGVudHJ5ID8gMSA6IC1FQUdBSU47Ci0JCX0KLQotCQlpZiAoIWxsX3NhX2VudHJ5X3N0YXRlZChlbnRyeSkpIHsKLQkJCXNhaS0+c2FpX2luZGV4X3dhaXQgPSBlbnRyeS0+c2VfaW5kZXg7Ci0JCQlsd2kgPSBMV0lfVElNRU9VVF9JTlRSKGNmc190aW1lX3NlY29uZHMoMzApLCBOVUxMLAotCQkJCQkgICAgICAgTFdJX09OX1NJR05BTF9OT09QLCBOVUxMKTsKLQkJCXJjID0gbF93YWl0X2V2ZW50KHNhaS0+c2FpX3dhaXRxLAotCQkJCQkgIGxsX3NhX2VudHJ5X3N0YXRlZChlbnRyeSkgfHwKLQkJCQkJICB0aHJlYWRfaXNfc3RvcHBlZCh0aHJlYWQpLAotCQkJCQkgICZsd2kpOwotCQkJaWYgKHJjIDwgMCkgewotCQkJCWxsX3NhaV91bnBsdWcoc2FpLCBlbnRyeSk7Ci0JCQkJcmV0dXJuIC1FQUdBSU47Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZW50cnktPnNlX3N0YXQgPT0gU0FfRU5UUllfU1VDQyAmJiBlbnRyeS0+c2VfaW5vZGUpIHsKLQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBlbnRyeS0+c2VfaW5vZGU7Ci0JCQlzdHJ1Y3QgbG9va3VwX2ludGVudCBpdCA9IHsgLml0X29wID0gSVRfR0VUQVRUUiwKLQkJCQkJCSAgICAuaXRfbG9ja19oYW5kbGUgPQotCQkJCQkJICAgICBlbnRyeS0+c2VfaGFuZGxlIH07Ci0JCQlfX3U2NCBiaXRzOwotCi0JCQlyYyA9IG1kX3JldmFsaWRhdGVfbG9jayhsbF9pMm1kZXhwKGRpciksICZpdCwKLQkJCQkJCWxsX2lub2RlMmZpZChpbm9kZSksICZiaXRzKTsKLQkJCWlmIChyYyA9PSAxKSB7Ci0JCQkJaWYgKCFkX2lub2RlKCpkZW50cnlwKSkgewotCQkJCQlzdHJ1Y3QgZGVudHJ5ICphbGlhczsKLQotCQkJCQlhbGlhcyA9IGxsX3NwbGljZV9hbGlhcyhpbm9kZSwKLQkJCQkJCQkJKmRlbnRyeXApOwotCQkJCQlpZiAoSVNfRVJSKGFsaWFzKSkgewotCQkJCQkJbGxfc2FpX3VucGx1ZyhzYWksIGVudHJ5KTsKLQkJCQkJCXJldHVybiBQVFJfRVJSKGFsaWFzKTsKLQkJCQkJfQotCQkJCQkqZGVudHJ5cCA9IGFsaWFzOwotCQkJCX0gZWxzZSBpZiAoZF9pbm9kZSgqZGVudHJ5cCkgIT0gaW5vZGUpIHsKLQkJCQkJLyogcmV2YWxpZGF0ZSwgYnV0IGlub2RlIGlzIHJlY3JlYXRlZCAqLwotCQkJCQlDREVCVUcoRF9SRUFEQSwgIiVzOiBzdGFsZSBkZW50cnkgJXBkIGlub2RlICJERklEIiwgc3RhdGFoZWFkIGlub2RlICJERklEIlxuIiwKLQkJCQkJICAgICAgIGxsX2dldF9mc25hbWUoZF9pbm9kZSgqZGVudHJ5cCktPmlfc2IsIE5VTEwsIDApLAotCQkJCQkgICAgICAgKmRlbnRyeXAsCi0JCQkJCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChkX2lub2RlKCpkZW50cnlwKSkpLAotCQkJCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSk7Ci0JCQkJCWxsX3NhaV91bnBsdWcoc2FpLCBlbnRyeSk7Ci0JCQkJCXJldHVybiAtRVNUQUxFOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlwdXQoaW5vZGUpOwotCQkJCX0KLQkJCQllbnRyeS0+c2VfaW5vZGUgPSBOVUxMOwotCi0JCQkJaWYgKChiaXRzICYgTURTX0lOT0RFTE9DS19MT09LVVApICYmCi0JCQkJICAgIGRfbHVzdHJlX2ludmFsaWQoKmRlbnRyeXApKQotCQkJCQlkX2x1c3RyZV9yZXZhbGlkYXRlKCpkZW50cnlwKTsKLQkJCQlsbF9pbnRlbnRfcmVsZWFzZSgmaXQpOwotCQkJfQotCQl9Ci0KLQkJbGxfc2FpX3VucGx1ZyhzYWksIGVudHJ5KTsKLQkJcmV0dXJuIHJjOwotCX0KKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OworCWludCByYzsKIAogCS8qIEkgYW0gdGhlICJsbGlfb3BlbmRpcl9waWQiIG93bmVyLCBvbmx5IG1lIGNhbiBzZXQgImxsaV9zYWkiLiAqLwotCXJjID0gaXNfZmlyc3RfZGlyZW50KGRpciwgKmRlbnRyeXApOwotCWlmIChyYyA9PSBMU19OT05FX0ZJUlNUX0RFKSB7CisJcmMgPSBpc19maXJzdF9kaXJlbnQoZGlyLCBkZW50cnkpOworCWlmIChyYyA9PSBMU19OT1RfRklSU1RfREUpIHsKIAkJLyogSXQgaXMgbm90ICJscyAte2F9bCIgb3BlcmF0aW9uLCBubyBuZWVkIHN0YXRhaGVhZCBmb3IgaXQuICovCi0JCXJjID0gLUVBR0FJTjsKKwkJcmMgPSAtRUZBVUxUOwogCQlnb3RvIG91dDsKIAl9CiAKLQlzYWkgPSBsbF9zYWlfYWxsb2MoKTsKKwlzYWkgPSBsbF9zYWlfYWxsb2MocGFyZW50KTsKIAlpZiAoIXNhaSkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIAogCXNhaS0+c2FpX2xzX2FsbCA9IChyYyA9PSBMU19GSVJTVF9ET1RfREUpOwotCXNhaS0+c2FpX2lub2RlID0gaWdyYWIoZGlyKTsKLQlpZiAodW5saWtlbHkoIXNhaS0+c2FpX2lub2RlKSkgewotCQlDV0FSTigiRG8gbm90IHN0YXJ0IHN0YXQgYWhlYWQgb24gZHlpbmcgaW5vZGUgIkRGSUQiXG4iLAotCQkgICAgICBQRklEKCZsbGktPmxsaV9maWQpKTsKLQkJcmMgPSAtRVNUQUxFOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBnZXQgcGFyZW50IHJlZmVyZW5jZSBjb3VudCBoZXJlLCBhbmQgcHV0IGl0IGluIGxsX3N0YXRhaGVhZF90aHJlYWQgKi8KLQlwYXJlbnQgPSBkZ2V0KCgqZGVudHJ5cCktPmRfcGFyZW50KTsKLQlpZiAodW5saWtlbHkoc2FpLT5zYWlfaW5vZGUgIT0gZF9pbm9kZShwYXJlbnQpKSkgewotCQlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbmxsaSA9IGxsX2kyaW5mbyhkX2lub2RlKHBhcmVudCkpOwotCi0JCUNXQVJOKCJSYWNlIGNvbmRpdGlvbiwgc29tZW9uZSBjaGFuZ2VkICVwZCBqdXN0IG5vdzogb2xkIHBhcmVudCAiREZJRCIsIG5ldyBwYXJlbnQgIkRGSUQiXG4iLAotCQkgICAgICAqZGVudHJ5cCwKLQkJICAgICAgUEZJRCgmbGxpLT5sbGlfZmlkKSwgUEZJRCgmbmxsaS0+bGxpX2ZpZCkpOwotCQlkcHV0KHBhcmVudCk7Ci0JCWlwdXQoc2FpLT5zYWlfaW5vZGUpOwotCQlyYyA9IC1FQUdBSU47Ci0JCWdvdG8gb3V0OwotCX0KLQotCUNERUJVRyhEX1JFQURBLCAic3RhcnQgc3RhdGFoZWFkIHRocmVhZDogc2FpICVwLCBwYXJlbnQgJXBkXG4iLAotCSAgICAgICBzYWksIHBhcmVudCk7Ci0KLQkvKiBUaGUgc2FpIGJ1ZmZlciBhbHJlYWR5IGhhcyBvbmUgcmVmZXJlbmNlIHRha2VuIGF0IGFsbG9jYXRpb24gdGltZSwKLQkgKiBidXQgYXMgc29vbiBhcyB3ZSBleHBvc2UgdGhlIHNhaSBieSBhdHRhY2hpbmcgaXQgdG8gdGhlIGxsaSB0aGF0Ci0JICogZGVmYXVsdCByZWZlcmVuY2UgY2FuIGJlIGRyb3BwZWQgYnkgYW5vdGhlciB0aHJlYWQgY2FsbGluZwotCSAqIGxsX3N0b3Bfc3RhdGFoZWFkLiBXZSBuZWVkIHRvIHRha2UgYSBsb2NhbCByZWZlcmVuY2UgdG8gcHJvdGVjdAotCSAqIHRoZSBzYWkgYnVmZmVyIHdoaWxlIHdlIGludGVuZCB0byBhY2Nlc3MgaXQuCisJLyoKKwkgKiBpZiBjdXJyZW50IGxsaV9vcGVuZGlyX2tleSB3YXMgZGVhdXRob3JpemVkLCBvciBkaXIgcmUtb3BlbmVkIGJ5CisJICogYW5vdGhlciBwcm9jZXNzLCBkb24ndCBzdGFydCBzdGF0YWhlYWQsIG90aGVyd2lzZSB0aGUgbmV3bHkgc3Bhd25lZAorCSAqIHN0YXRhaGVhZCB0aHJlYWQgd29uJ3QgYmUgbm90aWZpZWQgdG8gcXVpdC4KIAkgKi8KLQlsbF9zYWlfZ2V0KHNhaSk7CisJc3Bpbl9sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKKwlpZiAodW5saWtlbHkobGxpLT5sbGlfc2FpIHx8IGxsaS0+bGxpX29wZW5kaXJfa2V5IHx8CisJCSAgICAgbGxpLT5sbGlfb3BlbmRpcl9waWQgIT0gY3VycmVudC0+cGlkKSkgeworCQlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJCXJjID0gLUVQRVJNOworCQlnb3RvIG91dDsKKwl9CiAJbGxpLT5sbGlfc2FpID0gc2FpOworCXNwaW5fdW5sb2NrKCZsbGktPmxsaV9zYV9sb2NrKTsKIAotCXBsbGkgPSBsbF9pMmluZm8oZF9pbm9kZShwYXJlbnQpKTsKKwlhdG9taWNfaW5jKCZsbF9pMnNiaShwYXJlbnQtPmRfaW5vZGUpLT5sbF9zYV9ydW5uaW5nKTsKKworCUNERUJVRyhEX1JFQURBLCAic3RhcnQgc3RhdGFoZWFkIHRocmVhZDogW3BpZCAlZF0gW3BhcmVudCAlcGRdXG4iLAorCSAgICAgICBjdXJyZW50X3BpZCgpLCBwYXJlbnQpOworCiAJdGFzayA9IGt0aHJlYWRfcnVuKGxsX3N0YXRhaGVhZF90aHJlYWQsIHBhcmVudCwgImxsX3NhXyV1IiwKLQkJCSAgIHBsbGktPmxsaV9vcGVuZGlyX3BpZCk7CisJCQkgICBsbGktPmxsaV9vcGVuZGlyX3BpZCk7CiAJdGhyZWFkID0gJnNhaS0+c2FpX3RocmVhZDsKIAlpZiAoSVNfRVJSKHRhc2spKSB7CiAJCXJjID0gUFRSX0VSUih0YXNrKTsKLQkJQ0VSUk9SKCJjYW4ndCBzdGFydCBsbF9zYSB0aHJlYWQsIHJjOiAlZFxuIiwgcmMpOwotCQlkcHV0KHBhcmVudCk7Ci0JCWxsaS0+bGxpX29wZW5kaXJfa2V5ID0gTlVMTDsKLQkJdGhyZWFkX3NldF9mbGFncyh0aHJlYWQsIFNWQ19TVE9QUEVEKTsKLQkJdGhyZWFkX3NldF9mbGFncygmc2FpLT5zYWlfYWdsX3RocmVhZCwgU1ZDX1NUT1BQRUQpOwotCQkvKiBEcm9wIGJvdGggb3VyIG93biBsb2NhbCByZWZlcmVuY2UgYW5kIHRoZSBkZWZhdWx0Ci0JCSAqIHJlZmVyZW5jZSBmcm9tIGFsbG9jYXRpb24gdGltZS4KLQkJICovCi0JCWxsX3NhaV9wdXQoc2FpKTsKLQkJbGxfc2FpX3B1dChzYWkpOwotCQlMQVNTRVJUKCFsbGktPmxsaV9zYWkpOwotCQlyZXR1cm4gLUVBR0FJTjsKKwkJQ0VSUk9SKCJjYW4ndCBzdGFydCBsbF9zYSB0aHJlYWQsIHJjIDogJWRcbiIsIHJjKTsKKwkJZ290byBvdXQ7CiAJfQogCiAJbF93YWl0X2V2ZW50KHRocmVhZC0+dF9jdGxfd2FpdHEsCkBAIC0xNjk0LDEwICsxNTk4LDQ3IEBACiAJcmV0dXJuIC1FQUdBSU47CiAKIG91dDoKLQlrZnJlZShzYWkpOworCS8qCisJICogb25jZSB3ZSBzdGFydCBzdGF0YWhlYWQgdGhyZWFkIGZhaWxlZCwgZGlzYWJsZSBzdGF0YWhlYWQgc28KKwkgKiB0aGF0IHN1YnNlcXVlbnQgc3RhdCB3b24ndCB3YXN0ZSB0aW1lIHRvIHRyeSBpdC4KKwkgKi8KIAlzcGluX2xvY2soJmxsaS0+bGxpX3NhX2xvY2spOwotCWxsaS0+bGxpX29wZW5kaXJfa2V5ID0gTlVMTDsKLQlsbGktPmxsaV9vcGVuZGlyX3BpZCA9IDA7CisJbGxpLT5sbGlfc2FfZW5hYmxlZCA9IDA7CisJbGxpLT5sbGlfc2FpID0gTlVMTDsKIAlzcGluX3VubG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CisJaWYgKHNhaSkKKwkJbGxfc2FpX2ZyZWUoc2FpKTsKIAlyZXR1cm4gcmM7CiB9CisKKy8qKgorICogc3RhdGFoZWFkIGVudHJ5IGZ1bmN0aW9uLCB0aGlzIGlzIGNhbGxlZCB3aGVuIGNsaWVudCBnZXRhdHRyIG9uIGEgZmlsZSwgaXQKKyAqIHdpbGwgc3RhcnQgc3RhdGFoZWFkIHRocmVhZCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBkaXIgZW50cnksIGVsc2UgcmV2YWxpZGF0ZQorICogZGVudHJ5IGZyb20gc3RhdGFoZWFkIGNhY2hlLgorICoKKyAqIFxwYXJhbVtpbl0gIGRpcglwYXJlbnQgZGlyZWN0b3J5CisgKiBccGFyYW1bb3V0XSBkZW50cnlwCWRlbnRyeSB0byBnZXRhdHRyCisgKiBccGFyYW1baW5dICB1bnBsdWcJdW5wbHVnIHN0YXRhaGVhZCB3aW5kb3cgb25seSAobm9ybWFsbHkgZm9yIG5lZ2F0aXZlCisgKgkJCWRlbnRyeSkKKyAqIFxyZXR2YWwJCTEgb24gc3VjY2VzcworICogXHJldHZhbAkJMCByZXZhbGlkYXRpb24gZnJvbSBzdGF0YWhlYWQgY2FjaGUgZmFpbGVkLCBjYWxsZXIgbmVlZHMKKyAqCQkJdG8gZ2V0YXR0ciBmcm9tIHNlcnZlciBkaXJlY3RseQorICogXHJldHZhbAkJbmVnYXRpdmUgbnVtYmVyIG9uIGVycm9yLCBjYWxsZXIgb2Z0ZW4gaWdub3JlcyB0aGlzIGFuZAorICoJCQl0aGVuIGdldGF0dHIgZnJvbSBzZXJ2ZXIKKyAqLworaW50IGxsX3N0YXRhaGVhZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeXAsIGJvb2wgdW5wbHVnKQoreworCXN0cnVjdCBsbF9zdGF0YWhlYWRfaW5mbyAqc2FpOworCisJc2FpID0gbGxfc2FpX2dldChkaXIpOworCWlmIChzYWkpIHsKKwkJaW50IHJjOworCisJCXJjID0gcmV2YWxpZGF0ZV9zdGF0YWhlYWRfZGVudHJ5KGRpciwgc2FpLCBkZW50cnlwLCB1bnBsdWcpOworCQlDREVCVUcoRF9SRUFEQSwgInJldmFsaWRhdGUgc3RhdGFoZWFkICVwZDogJWQuXG4iLAorCQkgICAgICAgKmRlbnRyeXAsIHJjKTsKKwkJbGxfc2FpX3B1dChzYWkpOworCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiBzdGFydF9zdGF0YWhlYWRfdGhyZWFkKGRpciwgKmRlbnRyeXApOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3VwZXIyNS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3VwZXIyNS5jCmluZGV4IDNkZDdlMGUuLjEwNmNkMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N1cGVyMjUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdXBlcjI1LmMKQEAgLTM0LDcgKzM0LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2hhLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZGxtLmgiCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtODMsOCArODIsNiBAQAogfTsKIE1PRFVMRV9BTElBU19GUygibHVzdHJlIik7CiAKLXZvaWQgbHVzdHJlX3JlZ2lzdGVyX2NsaWVudF9wcm9jZXNzX2NvbmZpZyhpbnQgKCpjcGMpKHN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnKSk7Ci0KIHN0YXRpYyBpbnQgX19pbml0IGx1c3RyZV9pbml0KHZvaWQpCiB7CiAJbG5ldF9wcm9jZXNzX2lkX3QgbG5ldF9pZDsKQEAgLTEwMiw4ICs5OSw4IEBACiAKIAlyYyA9IC1FTk9NRU07CiAJbGxfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImx1c3RyZV9pbm9kZV9jYWNoZSIsCi0JCQkJCSAgICBzaXplb2Yoc3RydWN0IGxsX2lub2RlX2luZm8pLAotCQkJCQkgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfQUNDT1VOVCwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3QgbGxfaW5vZGVfaW5mbyksIDAsCisJCQkJCSAgICBTTEFCX0hXQ0FDSEVfQUxJR04gfCBTTEFCX0FDQ09VTlQsCiAJCQkJCSAgICBOVUxMKTsKIAlpZiAoIWxsX2lub2RlX2NhY2hlcCkKIAkJZ290byBvdXRfY2FjaGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zeW1saW5rLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zeW1saW5rLmMKaW5kZXggOGM4YmRmZS4uZjhiYzdlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3ltbGluay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N5bWxpbmsuYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKIAotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogCiBzdGF0aWMgaW50IGxsX3JlYWRsaW5rX2ludGVybmFsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC04MCwxNyArNzksMTcgQEAKIAl9CiAKIAlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpyZXF1ZXN0KS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7Ci0JaWYgKChib2R5LT52YWxpZCAmIE9CRF9NRF9MSU5LTkFNRSkgPT0gMCkgeworCWlmICgoYm9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0xJTktOQU1FKSA9PSAwKSB7CiAJCUNFUlJPUigiT0JEX01EX0xJTktOQU1FIG5vdCBzZXQgb24gcmVwbHlcbiIpOwogCQlyYyA9IC1FUFJPVE87CiAJCWdvdG8gZmFpbGVkOwogCX0KIAogCUxBU1NFUlQoc3ltbGVuICE9IDApOwotCWlmIChib2R5LT5lYWRhdGFzaXplICE9IHN5bWxlbikgeworCWlmIChib2R5LT5tYm9fZWFkYXRhc2l6ZSAhPSBzeW1sZW4pIHsKIAkJQ0VSUk9SKCIlczogaW5vZGUgIkRGSUQiOiBzeW1saW5rIGxlbmd0aCAlZCBub3QgZXhwZWN0ZWQgJWRcbiIsCiAJCSAgICAgICBsbF9nZXRfZnNuYW1lKGlub2RlLT5pX3NiLCBOVUxMLCAwKSwKLQkJICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGJvZHktPmVhZGF0YXNpemUgLSAxLAorCQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgYm9keS0+bWJvX2VhZGF0YXNpemUgLSAxLAogCQkgICAgICAgc3ltbGVuIC0gMSk7CiAJCXJjID0gLUVQUk9UTzsKIAkJZ290byBmYWlsZWQ7CkBAIC0xNTUsOCArMTU0LDggQEAKIAkuZ2V0X2xpbmsJPSBsbF9nZXRfbGluaywKIAkuZ2V0YXR0cgk9IGxsX2dldGF0dHIsCiAJLnBlcm1pc3Npb24JPSBsbF9pbm9kZV9wZXJtaXNzaW9uLAotCS5zZXR4YXR0cgk9IGxsX3NldHhhdHRyLAotCS5nZXR4YXR0cgk9IGxsX2dldHhhdHRyLAorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyCT0gbGxfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0cgk9IGxsX3JlbW92ZXhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2Rldi5jCmluZGV4IGU2MjMyMTYuLjhhYThlY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfZGV2LmMKQEAgLTM4LDcgKzM4LDYgQEAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTExJVEUKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAjaW5jbHVkZSAidnZwX2ludGVybmFsLmgiCiAKQEAgLTM2OCwxMiArMzY3LDYgQEAKIAkJQ0VSUk9SKCJDYW5ub3QgY2xlYW51cCBjbC1zdGFjayBkdWUgdG8gbWVtb3J5IHNob3J0YWdlLlxuIik7CiAJCXJlc3VsdCA9IFBUUl9FUlIoZW52KTsKIAl9Ci0JLyoKLQkgKiBJZiBtb3VudCBmYWlsZWQgKHNiaS0+bGxfY2wgPT0gTlVMTCksIGFuZCB0aGlzIHRoZXJlIGFyZSBubyBvdGhlcgotCSAqIG1vdW50cywgc3RvcCBkZXZpY2UgdHlwZXMgbWFudWFsbHkgKHRoaXMgdXN1YWxseSBoYXBwZW5zCi0JICogYXV0b21hdGljYWxseSB3aGVuIGxhc3QgZGV2aWNlIGlzIGRlc3Ryb3llZCkuCi0JICovCi0JbHVfdHlwZXNfc3RvcCgpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2ludGVybmFsLmgKaW5kZXggNzlmYzQyOC4uNDQ2NGFkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2ludGVybmFsLmgKQEAgLTQ5LDE0ICs0OSw2IEBACiBzdHJ1Y3Qgb2JkX2V4cG9ydDsKIHN0cnVjdCBwYWdlOwogCi0vKiBzcGVjaWZpYyBhcmNoaXRlY3R1cmUgY2FuIGltcGxlbWVudCBvbmx5IHBhcnQgb2YgdGhpcyBsaXN0ICovCi1lbnVtIHZ2cF9pb19zdWJ0eXBlIHsKLQkvKiogbm9ybWFsIElPICovCi0JSU9fTk9STUFMLAotCS8qKiBpbyBzdGFydGVkIGZyb20gc3BsaWNlX3tyZWFkfHdyaXRlfSAqLwotCUlPX1NQTElDRQotfTsKLQogLyoqCiAgKiBJTyBzdGF0ZSBwcml2YXRlIHRvIElPIHN0YXRlIHByaXZhdGUgdG8gVlZQIGxheWVyLgogICovCkBAIC05OSwxMCArOTEsNiBAQAogCQkJYm9vbAkJZnRfZmxhZ3NfdmFsaWQ7CiAJCX0gZmF1bHQ7CiAJCXN0cnVjdCB7Ci0JCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvCSp2dWlfcGlwZTsKLQkJCXVuc2lnbmVkIGludAkJIHZ1aV9mbGFnczsKLQkJfSBzcGxpY2U7Ci0JCXN0cnVjdCB7CiAJCQlzdHJ1Y3QgY2xfcGFnZV9saXN0IHZ1aV9xdWV1ZTsKIAkJCXVuc2lnbmVkIGxvbmcgdnVpX3dyaXR0ZW47CiAJCQlpbnQgdnVpX2Zyb207CkBAIC0xMTAsOCArOTgsNiBAQAogCQl9IHdyaXRlOwogCX0gdTsKIAotCWVudW0gdnZwX2lvX3N1YnR5cGUJdnVpX2lvX3N1YnR5cGU7Ci0KIAkvKioKIAkgKiBMYXlvdXQgdmVyc2lvbiB3aGVuIHRoaXMgSU8gaXMgaW5pdGlhbGl6ZWQKIAkgKi8KQEAgLTIxNywxMSArMjAzLDEyIEBACiAJc3RydWN0IGxpc3RfaGVhZAl2b2JfcGVuZGluZ19saXN0OwogCiAJLyoqCi0JICogQWNjZXNzIHRoaXMgY291bnRlciBpcyBwcm90ZWN0ZWQgYnkgaW5vZGUtPmlfc2VtLiBOb3cgdGhhdAotCSAqIHRoZSBsaWZldGltZSBvZiB0cmFuc2llbnQgcGFnZXMgbXVzdCBiZSBjb3ZlcmVkIGJ5IGlub2RlIHNlbSwKLQkgKiB3ZSBkb24ndCBuZWVkIHRvIGhvbGQgYW55IGxvY2suLgorCSAqIE51bWJlciBvZiB0cmFuc2llbnQgcGFnZXMuICBUaGlzIGlzIG5vIGxvbmdlciBwcm90ZWN0ZWQgYnkgaV9zZW0sCisJICogYW5kIG5lZWRzIHRvIGJlIGF0b21pYy4gIFRoaXMgaXMgbm90IGFjdHVhbGx5IHVzZWQgZm9yIGFueXRoaW5nLAorCSAqIGFuZCBjYW4gcHJvYmFibHkgYmUgcmVtb3ZlZC4KIAkgKi8KLQlpbnQJCQl2b2JfdHJhbnNpZW50X3BhZ2VzOworCWF0b21pY190CQl2b2JfdHJhbnNpZW50X3BhZ2VzOworCiAJLyoqCiAJICogTnVtYmVyIG9mIG91dHN0YW5kaW5nIG1tYXBzIG9uIHRoaXMgZmlsZS4KIAkgKgpAQCAtMjQ3LDkgKzIzNCw5IEBACiAgKi8KIHN0cnVjdCB2dnBfcGFnZSB7CiAJc3RydWN0IGNsX3BhZ2Vfc2xpY2UgdnBnX2NsOwotCWludAkJICB2cGdfZGVmZXJfdXB0b2RhdGU7Ci0JaW50CQkgIHZwZ19yYV91c2VkOwotCWludAkJICB2cGdfd3JpdGVfcXVldWVkOworCXVuc2lnbmVkIGludAl2cGdfZGVmZXJfdXB0b2RhdGU6MSwKKwkJCXZwZ19yYV91c2VkOjEsCisJCQl2cGdfd3JpdGVfcXVldWVkOjE7CiAJLyoqCiAJICogTm9uLWVtcHR5IGlmZiB0aGlzIHBhZ2UgaXMgYWxyZWFkeSBjb3VudGVkIGluCiAJICogdnZwX29iamVjdDo6dm9iX3BlbmRpbmdfbGlzdC4gVGhpcyBsaXN0IGlzIG9ubHkgdXNlZCBhcyBhIGZsYWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pby5jCmluZGV4IDk0OTE2ZGMuLjJiN2YxODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9pby5jCkBAIC0zOCw3ICszOCw2IEBACiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKIAogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAjaW5jbHVkZSAidnZwX2ludGVybmFsLmgiCkBAIC01NSwxOCArNTQsNiBAQAogfQogCiAvKioKLSAqIFRydWUsIGlmIFxhIGlvIGlzIGEgbm9ybWFsIGlvLCBGYWxzZSBmb3Igc3BsaWNlX3tyZWFkLHdyaXRlfQotICovCi1zdGF0aWMgaW50IGNsX2lzX25vcm1hbGlvKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgY29uc3Qgc3RydWN0IGNsX2lvICppbykKLXsKLQlzdHJ1Y3QgdnZwX2lvICp2aW8gPSB2dnBfZW52X2lvKGVudik7Ci0KLQlMQVNTRVJUKGlvLT5jaV90eXBlID09IENJVF9SRUFEIHx8IGlvLT5jaV90eXBlID09IENJVF9XUklURSk7Ci0KLQlyZXR1cm4gdmlvLT52dWlfaW9fc3VidHlwZSA9PSBJT19OT1JNQUw7Ci19Ci0KLS8qKgogICogRm9yIHN3YXBwaW5nIGxheW91dC4gVGhlIGZpbGUncyBsYXlvdXQgbWF5IGhhdmUgY2hhbmdlZC4KICAqIFRvIGF2b2lkIHBvcHVsYXRpbmcgcGFnZXMgdG8gYSB3cm9uZyBzdHJpcGUsIHdlIGhhdmUgdG8gdmVyaWZ5IHRoZQogICogY29ycmVjdG5lc3Mgb2YgbGF5b3V0LiBJdCB3b3JrcyBiZWNhdXNlIHN3YXBwaW5nIGxheW91dCBwcm9jZXNzZXMKQEAgLTM5MSw5ICszNzgsNiBAQAogCiAJTEFTU0VSVChpby0+Y2lfdHlwZSA9PSBDSVRfUkVBRCB8fCBpby0+Y2lfdHlwZSA9PSBDSVRfV1JJVEUpOwogCi0JaWYgKCFjbF9pc19ub3JtYWxpbyhlbnYsIGlvKSkKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoIXZpby0+dnVpX2l0ZXIpIC8qIG5mcyBvciBsb29wIGJhY2sgZGV2aWNlIHdyaXRlICovCiAJCXJldHVybiAwOwogCkBAIC00NjIsMTUgKzQ0NiwxMCBAQAogCQkJICAgY29uc3Qgc3RydWN0IGNsX2lvX3NsaWNlICppb3MsCiAJCQkgICBzaXplX3Qgbm9iKQogewotCXN0cnVjdCB2dnBfaW8gICAgKnZpbyA9IGNsMnZ2cF9pbyhlbnYsIGlvcyk7Ci0Jc3RydWN0IGNsX2lvICAgICAqaW8gID0gaW9zLT5jaXNfaW87CiAJc3RydWN0IGNsX29iamVjdCAqb2JqID0gaW9zLT5jaXNfaW8tPmNpX29iajsKLQorCXN0cnVjdCB2dnBfaW8JICp2aW8gPSBjbDJ2dnBfaW8oZW52LCBpb3MpOwogCUNMT0JJTlZSTlQoZW52LCBvYmosIHZ2cF9vYmplY3RfaW52YXJpYW50KG9iaikpOwogCi0JaWYgKCFjbF9pc19ub3JtYWxpbyhlbnYsIGlvKSkKLQkJcmV0dXJuOwotCiAJaW92X2l0ZXJfcmVleHBhbmQodmlvLT52dWlfaXRlciwgdmlvLT52dWlfdG90X2NvdW50ICAtPSBub2IpOwogfQogCkBAIC00NzksNyArNDU4LDcgQEAKIHsKIAlzaXplX3Qgc2l6ZSA9IGlvLT51LmNpX3J3LmNyd19jb3VudDsKIAotCWlmICghY2xfaXNfbm9ybWFsaW8oZW52LCBpbykgfHwgIXZpby0+dnVpX2l0ZXIpCisJaWYgKCF2aW8tPnZ1aV9pdGVyKQogCQlyZXR1cm47CiAKIAlpb3ZfaXRlcl90cnVuY2F0ZSh2aW8tPnZ1aV9pdGVyLCBzaXplKTsKQEAgLTYyOCw3ICs2MDcsNyBAQAogCQlhdHRyLT5jYXRfbXRpbWUgPSBpby0+dS5jaV9zZXRhdHRyLnNhX2F0dHIubHZiX210aW1lOwogCQl2YWxpZCB8PSBDQVRfTVRJTUU7CiAJfQotCXJlc3VsdCA9IGNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgdmFsaWQpOworCXJlc3VsdCA9IGNsX29iamVjdF9hdHRyX3VwZGF0ZShlbnYsIG9iaiwgYXR0ciwgdmFsaWQpOwogCWNsX29iamVjdF9hdHRyX3VubG9jayhvYmopOwogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTcxNiwyNSArNjk1LDggQEAKIAogCS8qIEJVRzogNTk3MiAqLwogCWZpbGVfYWNjZXNzZWQoZmlsZSk7Ci0Jc3dpdGNoICh2aW8tPnZ1aV9pb19zdWJ0eXBlKSB7Ci0JY2FzZSBJT19OT1JNQUw6Ci0JCUxBU1NFUlQodmlvLT52dWlfaW9jYi0+a2lfcG9zID09IHBvcyk7Ci0JCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIodmlvLT52dWlfaW9jYiwgdmlvLT52dWlfaXRlcik7Ci0JCWJyZWFrOwotCWNhc2UgSU9fU1BMSUNFOgotCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQoZmlsZSwgJnBvcywKLQkJCQkJCSAgdmlvLT51LnNwbGljZS52dWlfcGlwZSwgY250LAotCQkJCQkJICB2aW8tPnUuc3BsaWNlLnZ1aV9mbGFncyk7Ci0JCS8qIExVLTExMDk6IGRvIHNwbGljZSByZWFkIHN0cmlwZSBieSBzdHJpcGUgb3RoZXJ3aXNlIGlmIGl0Ci0JCSAqIG1heSBtYWtlIG5mc2Qgc3R1Y2sgaWYgdGhpcyByZWFkIG9jY3VwaWVkIGFsbCBpbnRlcm5hbCBwaXBlCi0JCSAqIGJ1ZmZlcnMuCi0JCSAqLwotCQlpby0+Y2lfY29udGludWUgPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlDRVJST1IoIldyb25nIElPIHR5cGUgJXVcbiIsIHZpby0+dnVpX2lvX3N1YnR5cGUpOwotCQlMQlVHKCk7Ci0JfQorCUxBU1NFUlQodmlvLT52dWlfaW9jYi0+a2lfcG9zID09IHBvcyk7CisJcmVzdWx0ID0gZ2VuZXJpY19maWxlX3JlYWRfaXRlcih2aW8tPnZ1aV9pb2NiLCB2aW8tPnZ1aV9pdGVyKTsKIAogb3V0OgogCWlmIChyZXN1bHQgPj0gMCkgewpAQCAtODIxLDcgKzc4Myw3IEBACiAJY2xfcGFnZV9kaXNvd24oZW52LCBpbywgcGFnZSk7CiAKIAkvKiBoZWxkIGluIGxsX2NsX2luaXQoKSAqLwotCWx1X3JlZl9kZWwoJnBhZ2UtPmNwX3JlZmVyZW5jZSwgImNsX2lvIiwgaW8pOworCWx1X3JlZl9kZWwoJnBhZ2UtPmNwX3JlZmVyZW5jZSwgImNsX2lvIiwgY2xfaW9fdG9wKGlvKSk7CiAJY2xfcGFnZV9wdXQoZW52LCBwYWdlKTsKIH0KIApAQCAtOTU5LDEwICs5MjEsMzAgQEAKIAogCUNERUJVRyhEX1ZGU1RSQUNFLCAid3JpdGU6IFslbGxpLCAlbGxpKVxuIiwgcG9zLCBwb3MgKyAobG9uZyBsb25nKWNudCk7CiAKLQlpZiAoIXZpby0+dnVpX2l0ZXIpIC8qIGZyb20gYSB0ZW1wIGlvIGluIGxsX2NsX2luaXQoKS4gKi8KKwlpZiAoIXZpby0+dnVpX2l0ZXIpIHsKKwkJLyogZnJvbSBhIHRlbXAgaW8gaW4gbGxfY2xfaW5pdCgpLiAqLwogCQlyZXN1bHQgPSAwOwotCWVsc2UKLQkJcmVzdWx0ID0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIodmlvLT52dWlfaW9jYiwgdmlvLT52dWlfaXRlcik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2hlbiB1c2luZyB0aGUgbG9ja2VkIEFJTyBmdW5jdGlvbiAoZ2VuZXJpY19maWxlX2Fpb193cml0ZSgpKQorCQkgKiB0ZXN0aW5nIGhhcyBzaG93biB0aGUgaW5vZGUgbXV0ZXggdG8gYmUgYSBsaW1pdGluZyBmYWN0b3IKKwkJICogd2l0aCBtdWx0aS10aHJlYWRlZCBzaW5nbGUgc2hhcmVkIGZpbGUgcGVyZm9ybWFuY2UuIFRvIGdldAorCQkgKiBhcm91bmQgdGhpcywgd2Ugbm93IHVzZSB0aGUgbG9ja2xlc3MgdmVyc2lvbi4gVG8gbWFpbnRhaW4KKwkJICogY29uc2lzdGVuY3ksIHByb3BlciBsb2NraW5nIHRvIHByb3RlY3QgYWdhaW5zdCB3cml0ZXMsCisJCSAqIHRydWNhdGVzLCBldGMuIGlzIGhhbmRsZWQgaW4gdGhlIGhpZ2hlciBsYXllcnMgb2YgbHVzdHJlLgorCQkgKi8KKwkJYm9vbCBsb2NrX25vZGUgPSAhSVNfTk9TRUMoaW5vZGUpOworCisJCWlmIChsb2NrX25vZGUpCisJCQlpbm9kZV9sb2NrKGlub2RlKTsKKwkJcmVzdWx0ID0gX19nZW5lcmljX2ZpbGVfd3JpdGVfaXRlcih2aW8tPnZ1aV9pb2NiLAorCQkJCQkJICAgdmlvLT52dWlfaXRlcik7CisJCWlmIChsb2NrX25vZGUpCisJCQlpbm9kZV91bmxvY2soaW5vZGUpOworCisJCWlmIChyZXN1bHQgPiAwIHx8IHJlc3VsdCA9PSAtRUlPQ0JRVUVVRUQpCisJCQlyZXN1bHQgPSBnZW5lcmljX3dyaXRlX3N5bmModmlvLT52dWlfaW9jYiwgcmVzdWx0KTsKKwl9CiAKIAlpZiAocmVzdWx0ID4gMCkgewogCQlyZXN1bHQgPSB2dnBfaW9fd3JpdGVfY29tbWl0KGVudiwgaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2xvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9sb2NrLmMKaW5kZXggNjRiZTBjOS4uMDdlYjI2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2xvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfbG9jay5jCkBAIC0zNyw3ICszNyw2IEBACiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xMSVRFCiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogCiAjaW5jbHVkZSAidnZwX2ludGVybmFsLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9vYmplY3QuYwppbmRleCAyYzUyMGIwLi5iNTcxOTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX29iamVjdC5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzLmgiCiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKIAogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCiAjaW5jbHVkZSAidnZwX2ludGVybmFsLmgiCkBAIC02OCw4ICs2Nyw4IEBACiAKIAkoKnApKGVudiwgY29va2llLCAiKCVzICVkICVkKSBpbm9kZTogJXAgIiwKIAkgICAgIGxpc3RfZW1wdHkoJm9iai0+dm9iX3BlbmRpbmdfbGlzdCkgPyAiLSIgOiAiKyIsCi0JICAgICBvYmotPnZvYl90cmFuc2llbnRfcGFnZXMsIGF0b21pY19yZWFkKCZvYmotPnZvYl9tbWFwX2NudCksCi0JICAgICBpbm9kZSk7CisJICAgICBhdG9taWNfcmVhZCgmb2JqLT52b2JfdHJhbnNpZW50X3BhZ2VzKSwKKwkgICAgIGF0b21pY19yZWFkKCZvYmotPnZvYl9tbWFwX2NudCksIGlub2RlKTsKIAlpZiAoaW5vZGUpIHsKIAkJbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAkJKCpwKShlbnYsIGNvb2tpZSwgIiVsdS8ldSAlbyAldSAlZCAlcCAiREZJRCwKQEAgLTEwMiw4ICsxMDEsOCBAQAogCXJldHVybiAwOyAvKiBsYXllcnMgYmVsb3cgaGF2ZSB0byBmaWxsIGluIHRoZSByZXN0ICovCiB9CiAKLXN0YXRpYyBpbnQgdnZwX2F0dHJfc2V0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAotCQkJY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIHZhbGlkKQorc3RhdGljIGludCB2dnBfYXR0cl91cGRhdGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCisJCQkgICBjb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IHZhbGlkKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2dnBfb2JqZWN0X2lub2RlKG9iaik7CiAKQEAgLTEyMCw3ICsxMTksNyBAQAogCWlmICgwICYmIHZhbGlkICYgQ0FUX1NJWkUpCiAJCWlfc2l6ZV93cml0ZShpbm9kZSwgYXR0ci0+Y2F0X3NpemUpOwogCS8qIG5vdCBjdXJyZW50bHkgbmVjZXNzYXJ5ICovCi0JaWYgKDAgJiYgdmFsaWQgJiAoQ0FUX1VJRHxDQVRfR0lEfENBVF9TSVpFKSkKKwlpZiAoMCAmJiB2YWxpZCAmIChDQVRfVUlEIHwgQ0FUX0dJRCB8IENBVF9TSVpFKSkKIAkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTAsNyArMjA5LDcgQEAKIAkuY29vX2xvY2tfaW5pdCA9IHZ2cF9sb2NrX2luaXQsCiAJLmNvb19pb19pbml0ICAgPSB2dnBfaW9faW5pdCwKIAkuY29vX2F0dHJfZ2V0ICA9IHZ2cF9hdHRyX2dldCwKLQkuY29vX2F0dHJfc2V0ICA9IHZ2cF9hdHRyX3NldCwKKwkuY29vX2F0dHJfdXBkYXRlID0gdnZwX2F0dHJfdXBkYXRlLAogCS5jb29fY29uZl9zZXQgID0gdnZwX2NvbmZfc2V0LAogCS5jb29fcHJ1bmUgICAgID0gdnZwX3BydW5lLAogCS5jb29fZ2xpbXBzZSAgID0gdnZwX29iamVjdF9nbGltcHNlCkBAIC0yMjEsNyArMjIwLDcgQEAKIAkJCSAgICBjb25zdCBzdHJ1Y3QgY2xfb2JqZWN0X2NvbmYgKmNvbmYpCiB7CiAJdm9iLT52b2JfaW5vZGUgPSBjb25mLT5jb2NfaW5vZGU7Ci0Jdm9iLT52b2JfdHJhbnNpZW50X3BhZ2VzID0gMDsKKwlhdG9taWNfc2V0KCZ2b2ItPnZvYl90cmFuc2llbnRfcGFnZXMsIDApOwogCWNsX29iamVjdF9wYWdlX2luaXQoJnZvYi0+dm9iX2NsLCBzaXplb2Yoc3RydWN0IHZ2cF9wYWdlKSk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfcGFnZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX3BhZ2UuYwppbmRleCAyZTU2NmQ5Li41ZDc5ZWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfcGFnZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9wYWdlLmMKQEAgLTQ0LDggKzQ0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgotCiAjaW5jbHVkZSAibGxpdGVfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2dnBfaW50ZXJuYWwuaCIKIApAQCAtMjQ5LDcgKzI0Nyw3IEBACiAJCQlzZXRfYml0KEFTX0VJTywgJmlub2RlLT5pX21hcHBpbmctPmZsYWdzKTsKIAogCQlpZiAoKGlvcmV0ID09IC1FU0hVVERPV04gfHwgaW9yZXQgPT0gLUVJTlRSKSAmJgotCQkgICAgIG9iai0+dm9iX2Rpc2NhcmRfcGFnZV93YXJuZWQgPT0gMCkgeworCQkgICAgb2JqLT52b2JfZGlzY2FyZF9wYWdlX3dhcm5lZCA9PSAwKSB7CiAJCQlvYmotPnZvYl9kaXNjYXJkX3BhZ2Vfd2FybmVkID0gMTsKIAkJCWxsX2RpcnR5X3BhZ2VfZGlzY2FyZF93YXJuKHZtcGFnZSwgaW9yZXQpOwogCQl9CkBAIC00NDQsMTggKzQ0MiwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB2dnBfdHJhbnNpZW50X3BhZ2VfdmVyaWZ5KGNvbnN0IHN0cnVjdCBjbF9wYWdlICpwYWdlKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2dnBfb2JqZWN0X2lub2RlKHBhZ2UtPmNwX29iaik7Ci0KLQlMQVNTRVJUKCFpbm9kZV90cnlsb2NrKGlub2RlKSk7Ci19Ci0KIHN0YXRpYyBpbnQgdnZwX3RyYW5zaWVudF9wYWdlX293bihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkJICBjb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2UsCiAJCQkJICBzdHJ1Y3QgY2xfaW8gKnVudXNlZCwgaW50IG5vbmJsb2NrKQogewotCXZ2cF90cmFuc2llbnRfcGFnZV92ZXJpZnkoc2xpY2UtPmNwbF9wYWdlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDYzLDIxICs0NTMsMTggQEAKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2UsCiAJCQkJICAgICAgc3RydWN0IGNsX2lvICp1bnVzZWQpCiB7Ci0JdnZwX3RyYW5zaWVudF9wYWdlX3ZlcmlmeShzbGljZS0+Y3BsX3BhZ2UpOwogfQogCiBzdGF0aWMgdm9pZCB2dnBfdHJhbnNpZW50X3BhZ2VfdW5hc3N1bWUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkJCQljb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2UsCiAJCQkJCXN0cnVjdCBjbF9pbyAqdW51c2VkKQogewotCXZ2cF90cmFuc2llbnRfcGFnZV92ZXJpZnkoc2xpY2UtPmNwbF9wYWdlKTsKIH0KIAogc3RhdGljIHZvaWQgdnZwX3RyYW5zaWVudF9wYWdlX2Rpc293bihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IGNsX3BhZ2Vfc2xpY2UgKnNsaWNlLAogCQkJCSAgICAgIHN0cnVjdCBjbF9pbyAqdW51c2VkKQogewotCXZ2cF90cmFuc2llbnRfcGFnZV92ZXJpZnkoc2xpY2UtPmNwbF9wYWdlKTsKIH0KIAogc3RhdGljIHZvaWQgdnZwX3RyYW5zaWVudF9wYWdlX2Rpc2NhcmQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LApAQCAtNDg2LDggKzQ3Myw2IEBACiB7CiAJc3RydWN0IGNsX3BhZ2UgKnBhZ2UgPSBzbGljZS0+Y3BsX3BhZ2U7CiAKLQl2dnBfdHJhbnNpZW50X3BhZ2VfdmVyaWZ5KHNsaWNlLT5jcGxfcGFnZSk7Ci0KIAkvKgogCSAqIEZvciB0cmFuc2llbnQgcGFnZXMsIHJlbW92ZSBpdCBmcm9tIHRoZSByYWRpeCB0cmVlLgogCSAqLwpAQCAtNTExLDcgKzQ5Niw2IEBACiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2UsCiAJCQkgICAgICBpbnQgaW9yZXQpCiB7Ci0JdnZwX3RyYW5zaWVudF9wYWdlX3ZlcmlmeShzbGljZS0+Y3BsX3BhZ2UpOwogfQogCiBzdGF0aWMgdm9pZCB2dnBfdHJhbnNpZW50X3BhZ2VfZmluaShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCkBAIC01MjIsOCArNTA2LDcgQEAKIAlzdHJ1Y3QgdnZwX29iamVjdCAqY2xvYmogPSBjbDJ2dnAoY2xwLT5jcF9vYmopOwogCiAJdnZwX3BhZ2VfZmluaV9jb21tb24odnBnKTsKLQlMQVNTRVJUKCFpbm9kZV90cnlsb2NrKGNsb2JqLT52b2JfaW5vZGUpKTsKLQljbG9iai0+dm9iX3RyYW5zaWVudF9wYWdlcy0tOworCWF0b21pY19kZWMoJmNsb2JqLT52b2JfdHJhbnNpZW50X3BhZ2VzKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjbF9wYWdlX29wZXJhdGlvbnMgdnZwX3RyYW5zaWVudF9wYWdlX29wcyA9IHsKQEAgLTU0OSw3ICs1MzIsNyBAQAogfTsKIAogaW50IHZ2cF9wYWdlX2luaXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCi0JCXN0cnVjdCBjbF9wYWdlICpwYWdlLCBwZ29mZl90IGluZGV4KQorCQkgIHN0cnVjdCBjbF9wYWdlICpwYWdlLCBwZ29mZl90IGluZGV4KQogewogCXN0cnVjdCB2dnBfcGFnZSAqdnBnID0gY2xfb2JqZWN0X3BhZ2Vfc2xpY2Uob2JqLCBwYWdlKTsKIAlzdHJ1Y3QgcGFnZSAgICAgKnZtcGFnZSA9IHBhZ2UtPmNwX3ZtcGFnZTsKQEAgLTU3MCwxMCArNTUzLDkgQEAKIAl9IGVsc2UgewogCQlzdHJ1Y3QgdnZwX29iamVjdCAqY2xvYmogPSBjbDJ2dnAob2JqKTsKIAotCQlMQVNTRVJUKCFpbm9kZV90cnlsb2NrKGNsb2JqLT52b2JfaW5vZGUpKTsKIAkJY2xfcGFnZV9zbGljZV9hZGQocGFnZSwgJnZwZy0+dnBnX2NsLCBvYmosIGluZGV4LAogCQkJCSAgJnZ2cF90cmFuc2llbnRfcGFnZV9vcHMpOwotCQljbG9iai0+dm9iX3RyYW5zaWVudF9wYWdlcysrOworCQlhdG9taWNfaW5jKCZjbG9iai0+dm9iX3RyYW5zaWVudF9wYWdlcyk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX3JlcS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX3JlcS5jCmluZGV4IDlmZTlkNmMuLmUzZjRjNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9yZXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfcmVxLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2NsX29iamVjdC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInZ2cF9pbnRlcm5hbC5oIgogCkBAIC04Myw4ICs4MiwxMCBAQAogCX0KIAlvYmRvX2Zyb21faW5vZGUob2EsIGlub2RlLCB2YWxpZF9mbGFncyAmIGZsYWdzKTsKIAlvYmRvX3NldF9wYXJlbnRfZmlkKG9hLCAmbGxfaTJpbmZvKGlub2RlKS0+bGxpX2ZpZCk7CisJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX0xGU0NLX0lOVkFMSURfUEZJRCkpCisJCW9hLT5vX3BhcmVudF9vaWQrKzsKIAltZW1jcHkoYXR0ci0+Y3JhX2pvYmlkLCBsbF9pMmluZm8oaW5vZGUpLT5sbGlfam9iaWQsCi0JICAgICAgIEpPQlNUQVRTX0pPQklEX1NJWkUpOworCSAgICAgICBMVVNUUkVfSk9CSURfU0laRSk7CiB9CiAKIHN0YXRpYyB2b2lkIHZ2cF9yZXFfY29tcGxldGlvbihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0ci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHIuYwppbmRleCA5ODMwM2NmLi5lMDcwYWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0ci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyLmMKQEAgLTM4LDIxICszOCwxMiBAQAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTElURQogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgotI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpdGUuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kbG0uaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV92ZXIuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9lYWNsLmgiCiAKICNpbmNsdWRlICJsbGl0ZV9pbnRlcm5hbC5oIgogCi0jZGVmaW5lIFhBVFRSX1VTRVJfVAkgICAgKDEpCi0jZGVmaW5lIFhBVFRSX1RSVVNURURfVAkgKDIpCi0jZGVmaW5lIFhBVFRSX1NFQ1VSSVRZX1QJKDMpCi0jZGVmaW5lIFhBVFRSX0FDTF9BQ0NFU1NfVCAgICAgICg0KQotI2RlZmluZSBYQVRUUl9BQ0xfREVGQVVMVF9UICAgICAoNSkKLSNkZWZpbmUgWEFUVFJfTFVTVFJFX1QJICAoNikKLSNkZWZpbmUgWEFUVFJfT1RIRVJfVAkgICAoNykKLQogc3RhdGljCiBpbnQgZ2V0X3hhdHRyX3R5cGUoY29uc3QgY2hhciAqbmFtZSkKIHsKQEAgLTk5LDQ2ICs5MCw1NyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMKLWludCBsbF9zZXR4YXR0cl9jb21tb24oc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKLQkJICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwKLQkJICAgICAgIGludCBmbGFncywgX191NjQgdmFsaWQpCitzdGF0aWMgaW50CitsbF94YXR0cl9zZXRfY29tbW9uKGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLAorCQkgICAgaW50IGZsYWdzKQogeworCWNoYXIgZnVsbG5hbWVbc3RybGVuKGhhbmRsZXItPnByZWZpeCkgKyBzdHJsZW4obmFtZSkgKyAxXTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKLQlpbnQgeGF0dHJfdHlwZSwgcmM7CiAJY29uc3QgY2hhciAqcHYgPSB2YWx1ZTsKKwlfX3U2NCB2YWxpZDsKKwlpbnQgcmM7CiAKLQl4YXR0cl90eXBlID0gZ2V0X3hhdHRyX3R5cGUobmFtZSk7Ci0JcmMgPSB4YXR0cl90eXBlX2ZpbHRlcihzYmksIHhhdHRyX3R5cGUpOworCWlmIChmbGFncyA9PSBYQVRUUl9SRVBMQUNFKSB7CisJCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIExQUk9DX0xMX1JFTU9WRVhBVFRSLCAxKTsKKwkJdmFsaWQgPSBPQkRfTURfRkxYQVRUUlJNOworCX0gZWxzZSB7CisJCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIExQUk9DX0xMX1NFVFhBVFRSLCAxKTsKKwkJdmFsaWQgPSBPQkRfTURfRkxYQVRUUjsKKwl9CisKKwlyYyA9IHhhdHRyX3R5cGVfZmlsdGVyKHNiaSwgaGFuZGxlci0+ZmxhZ3MpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JaWYgKCh4YXR0cl90eXBlID09IFhBVFRSX0FDTF9BQ0NFU1NfVCB8fAotCSAgICAgeGF0dHJfdHlwZSA9PSBYQVRUUl9BQ0xfREVGQVVMVF9UKSAmJgorCWlmICgoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfQUNMX0FDQ0VTU19UIHx8CisJICAgICBoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9BQ0xfREVGQVVMVF9UKSAmJgogCSAgICAhaW5vZGVfb3duZXJfb3JfY2FwYWJsZShpbm9kZSkpCiAJCXJldHVybiAtRVBFUk07CiAKIAkvKiBiMTA2Njc6IGlnbm9yZSBsdXN0cmUgc3BlY2lhbCB4YXR0ciBmb3Igbm93ICovCi0JaWYgKCh4YXR0cl90eXBlID09IFhBVFRSX1RSVVNURURfVCAmJiBzdHJjbXAobmFtZSwgInRydXN0ZWQubG92IikgPT0gMCkgfHwKLQkgICAgKHhhdHRyX3R5cGUgPT0gWEFUVFJfTFVTVFJFX1QgJiYgc3RyY21wKG5hbWUsICJsdXN0cmUubG92IikgPT0gMCkpCisJaWYgKChoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9UUlVTVEVEX1QgJiYgIXN0cmNtcChuYW1lLCAibG92IikpIHx8CisJICAgIChoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9MVVNUUkVfVCAmJiAhc3RyY21wKG5hbWUsICJsb3YiKSkpCiAJCXJldHVybiAwOwogCiAJLyogYjE1NTg3OiBpZ25vcmUgc2VjdXJpdHkuY2FwYWJpbGl0eSB4YXR0ciBmb3Igbm93ICovCi0JaWYgKCh4YXR0cl90eXBlID09IFhBVFRSX1NFQ1VSSVRZX1QgJiYKLQkgICAgIHN0cmNtcChuYW1lLCAic2VjdXJpdHkuY2FwYWJpbGl0eSIpID09IDApKQorCWlmICgoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfU0VDVVJJVFlfVCAmJgorCSAgICAgIXN0cmNtcChuYW1lLCAiY2FwYWJpbGl0eSIpKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBMVS01NDk6ICBEaXNhYmxlIHNlY3VyaXR5LnNlbGludXggd2hlbiBzZWxpbnV4IGlzIGRpc2FibGVkICovCi0JaWYgKHhhdHRyX3R5cGUgPT0gWEFUVFJfU0VDVVJJVFlfVCAmJiAhc2VsaW51eF9pc19lbmFibGVkKCkgJiYKLQkgICAgc3RyY21wKG5hbWUsICJzZWN1cml0eS5zZWxpbnV4IikgPT0gMCkKKwlpZiAoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfU0VDVVJJVFlfVCAmJiAhc2VsaW51eF9pc19lbmFibGVkKCkgJiYKKwkgICAgc3RyY21wKG5hbWUsICJzZWxpbnV4IikgPT0gMCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCisJc3ByaW50ZihmdWxsbmFtZSwgIiVzJXNcbiIsIGhhbmRsZXItPnByZWZpeCwgbmFtZSk7CiAJcmMgPSBtZF9zZXR4YXR0cihzYmktPmxsX21kX2V4cCwgbGxfaW5vZGUyZmlkKGlub2RlKSwKLQkJCSB2YWxpZCwgbmFtZSwgcHYsIHNpemUsIDAsIGZsYWdzLAorCQkJIHZhbGlkLCBmdWxsbmFtZSwgcHYsIHNpemUsIDAsIGZsYWdzLAogCQkJIGxsX2kyc3VwcGdpZChpbm9kZSksICZyZXEpOwogCWlmIChyYykgewotCQlpZiAocmMgPT0gLUVPUE5PVFNVUFAgJiYgeGF0dHJfdHlwZSA9PSBYQVRUUl9VU0VSX1QpIHsKKwkJaWYgKHJjID09IC1FT1BOT1RTVVBQICYmIGhhbmRsZXItPmZsYWdzID09IFhBVFRSX1VTRVJfVCkgewogCQkJTENPTlNPTEVfSU5GTygiRGlzYWJsaW5nIHVzZXJfeGF0dHIgZmVhdHVyZSBiZWNhdXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNlcnZlclxuIik7CiAJCQlzYmktPmxsX2ZsYWdzICY9IH5MTF9TQklfVVNFUl9YQVRUUjsKIAkJfQpAQCAtMTQ5LDggKzE1MSwxMCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgbGxfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQljb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3N0YXRpYyBpbnQgbGxfeGF0dHJfc2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLAorCQkJaW50IGZsYWdzKQogewogCUxBU1NFUlQoaW5vZGUpOwogCUxBU1NFUlQobmFtZSk7CkBAIC0xNTgsMjAgKzE2MiwyNCBAQAogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcCksIHhhdHRyICVzXG4iLAogCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwgbmFtZSk7CiAKLQlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9TRVRYQVRUUiwgMSk7Ci0KLQlpZiAoKHN0cm5jbXAobmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsCi0JCSAgICAgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEpID09IDAgJiYKLQkgICAgIHN0cmNtcChuYW1lICsgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEsICJsb3YiKSA9PSAwKSB8fAotCSAgICAoc3RybmNtcChuYW1lLCBYQVRUUl9MVVNUUkVfUFJFRklYLAotCQkgICAgIHNpemVvZihYQVRUUl9MVVNUUkVfUFJFRklYKSAtIDEpID09IDAgJiYKLQkgICAgIHN0cmNtcChuYW1lICsgc2l6ZW9mKFhBVFRSX0xVU1RSRV9QUkVGSVgpIC0gMSwgImxvdiIpID09IDApKSB7CisJaWYgKCFzdHJjbXAobmFtZSwgImxvdiIpKSB7CiAJCXN0cnVjdCBsb3ZfdXNlcl9tZCAqbHVtcCA9IChzdHJ1Y3QgbG92X3VzZXJfbWQgKil2YWx1ZTsKKwkJaW50IG9wX3R5cGUgPSBmbGFncyA9PSBYQVRUUl9SRVBMQUNFID8gTFBST0NfTExfUkVNT1ZFWEFUVFIgOgorCQkJCQkJICAgICAgIExQUk9DX0xMX1NFVFhBVFRSOwogCQlpbnQgcmMgPSAwOwogCisJCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIG9wX3R5cGUsIDEpOworCiAJCWlmIChzaXplICE9IDAgJiYgc2l6ZSA8IHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKKwkJLyoKKwkJICogSXQgaXMgcG9zc2libGUgdG8gc2V0IGFuIHhhdHRyIHRvIGEgIiIgdmFsdWUgb2YgemVybyBzaXplLgorCQkgKiBGb3IgdGhpcyBjYXNlIHdlIGFyZSBnb2luZyB0byB0cmVhdCBpdCBhcyBhIHJlbW92YWwuCisJCSAqLworCQlpZiAoIXNpemUgJiYgbHVtcCkKKwkJCWx1bXAgPSBOVUxMOworCiAJCS8qIEF0dHJpYnV0ZXMgdGhhdCBhcmUgc2F2ZWQgdmlhIGdldHhhdHRyIHdpbGwgYWx3YXlzIGhhdmUKIAkJICogdGhlIHN0cmlwZV9vZmZzZXQgYXMgMC4gIEluc3RlYWQsIHRoZSBNRFMgc2hvdWxkIGJlCiAJCSAqIGFsbG93ZWQgdG8gcGljayB0aGUgc3RhcnRpbmcgT1NUIGluZGV4LiAgIGI9MTc4NDYKQEAgLTE4MSwxMiArMTg5LDE1IEBACiAKIAkJaWYgKGx1bXAgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQkJX191NjQgaXRfZmxhZ3MgPSBGTU9ERV9XUklURTsKLQkJCWludCBsdW1fc2l6ZSA9IChsdW1wLT5sbW1fbWFnaWMgPT0gTE9WX1VTRVJfTUFHSUNfVjEpID8KLQkJCQlzaXplb2YoKmx1bXApIDogc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92Myk7CisJCQlpbnQgbHVtX3NpemU7CisKKwkJCWx1bV9zaXplID0gbGxfbG92X3VzZXJfbWRfc2l6ZShsdW1wKTsKKwkJCWlmIChsdW1fc2l6ZSA8IDAgfHwgc2l6ZSA8IGx1bV9zaXplKQorCQkJCXJldHVybiAwOyAvKiBiPTEwNjY3OiBpZ25vcmUgZXJyb3IgKi8KIAogCQkJcmMgPSBsbF9sb3Zfc2V0c3RyaXBlX2VhX2luZm8oaW5vZGUsIGRlbnRyeSwgaXRfZmxhZ3MsCiAJCQkJCQkgICAgICBsdW1wLCBsdW1fc2l6ZSk7Ci0JCQkvKiBiMTA2Njc6IHJjIGFsd2F5cyBiZSAwIGhlcmUgZm9yIG5vdyAqLworCQkJLyogYj0xMDY2NzogcmMgYWx3YXlzIGJlIDAgaGVyZSBmb3Igbm93ICovCiAJCQlyYyA9IDA7CiAJCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJcmMgPSBsbF9kaXJfc2V0c3RyaXBlKGlub2RlLCBsdW1wLCAwKTsKQEAgLTE5NCw5MiArMjA1LDI3IEBACiAKIAkJcmV0dXJuIHJjOwogCi0JfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9MTUEpID09IDAgfHwKLQkJICAgc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfTElOSykgPT0gMCkKKwl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImxtYSIpIHx8ICFzdHJjbXAobmFtZSwgImxpbmsiKSkgeworCQlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9TRVRYQVRUUiwgMSk7CiAJCXJldHVybiAwOworCX0KIAotCXJldHVybiBsbF9zZXR4YXR0cl9jb21tb24oaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncywKLQkJCQkgIE9CRF9NRF9GTFhBVFRSKTsKKwlyZXR1cm4gbGxfeGF0dHJfc2V0X2NvbW1vbihoYW5kbGVyLCBkZW50cnksIGlub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwKKwkJCQkgICBmbGFncyk7CiB9CiAKLWludCBsbF9yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCitpbnQKK2xsX3hhdHRyX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUsIHZvaWQgKmJ1ZmZlciwKKwkgICAgICBzaXplX3Qgc2l6ZSwgX191NjQgdmFsaWQpCiB7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGRfaW5vZGUoZGVudHJ5KTsKLQotCUxBU1NFUlQoaW5vZGUpOwotCUxBU1NFUlQobmFtZSk7Ci0KLQlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDppbm9kZT0iREZJRCIoJXApLCB4YXR0ciAlc1xuIiwKLQkgICAgICAgUEZJRChsbF9pbm9kZTJmaWQoaW5vZGUpKSwgaW5vZGUsIG5hbWUpOwotCi0JbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGlub2RlKSwgTFBST0NfTExfUkVNT1ZFWEFUVFIsIDEpOwotCXJldHVybiBsbF9zZXR4YXR0cl9jb21tb24oaW5vZGUsIG5hbWUsIE5VTEwsIDAsIDAsCi0JCQkJICBPQkRfTURfRkxYQVRUUlJNKTsKLX0KLQotc3RhdGljCi1pbnQgbGxfZ2V0eGF0dHJfY29tbW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCBfX3U2NCB2YWxpZCkKLXsKKwlzdHJ1Y3QgbGxfaW5vZGVfaW5mbyAqbGxpID0gbGxfaTJpbmZvKGlub2RlKTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfaTJzYmkoaW5vZGUpOwogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKIAlzdHJ1Y3QgbWR0X2JvZHkgKmJvZHk7Ci0JaW50IHhhdHRyX3R5cGUsIHJjOwogCXZvaWQgKnhkYXRhOwotCXN0cnVjdCBsbF9pbm9kZV9pbmZvICpsbGkgPSBsbF9pMmluZm8oaW5vZGUpOworCWludCByYzsKIAotCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcClcbiIsCi0JICAgICAgIFBGSUQobGxfaW5vZGUyZmlkKGlub2RlKSksIGlub2RlKTsKLQotCS8qIGxpc3R4YXR0ciBoYXZlIHNsaWdodGx5IGRpZmZlcmVudCBiZWhhdmlvciBmcm9tIG9mIGV4dDM6Ci0JICogd2l0aG91dCAndXNlcl94YXR0cicgZXh0MyB3aWxsIGxpc3QgYWxsIHhhdHRyIG5hbWVzIGJ1dAotCSAqIGZpbHRlcmVkIG91dCAiXnVzZXIuLioiOyB3ZSBsaXN0IHRoZW0gYWxsIGZvciBzaW1wbGljaXR5LgotCSAqLwotCWlmICghbmFtZSkgewotCQl4YXR0cl90eXBlID0gWEFUVFJfT1RIRVJfVDsKLQkJZ290byBkb19nZXR4YXR0cjsKLQl9Ci0KLQl4YXR0cl90eXBlID0gZ2V0X3hhdHRyX3R5cGUobmFtZSk7Ci0JcmMgPSB4YXR0cl90eXBlX2ZpbHRlcihzYmksIHhhdHRyX3R5cGUpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JLyogYjE1NTg3OiBpZ25vcmUgc2VjdXJpdHkuY2FwYWJpbGl0eSB4YXR0ciBmb3Igbm93ICovCi0JaWYgKCh4YXR0cl90eXBlID09IFhBVFRSX1NFQ1VSSVRZX1QgJiYKLQkgICAgIHN0cmNtcChuYW1lLCAic2VjdXJpdHkuY2FwYWJpbGl0eSIpID09IDApKQotCQlyZXR1cm4gLUVOT0RBVEE7Ci0KLQkvKiBMVS01NDk6ICBEaXNhYmxlIHNlY3VyaXR5LnNlbGludXggd2hlbiBzZWxpbnV4IGlzIGRpc2FibGVkICovCi0JaWYgKHhhdHRyX3R5cGUgPT0gWEFUVFJfU0VDVVJJVFlfVCAmJiAhc2VsaW51eF9pc19lbmFibGVkKCkgJiYKLQkgICAgc3RyY21wKG5hbWUsICJzZWN1cml0eS5zZWxpbnV4IikgPT0gMCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0jaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAotCS8qIHBvc2l4IGFjbCBpcyB1bmRlciBwcm90ZWN0aW9uIG9mIExPT0tVUCBsb2NrLiB3aGVuIGNhbGxpbmcgdG8gdGhpcywKLQkgKiB3ZSBqdXN0IGhhdmUgcGF0aCByZXNvbHV0aW9uIHRvIHRoZSB0YXJnZXQgaW5vZGUsIHNvIHdlIGhhdmUgZ3JlYXQKLQkgKiBjaGFuY2UgdGhhdCBjYWNoZWQgQUNMIGlzIHVwdG9kYXRlLgotCSAqLwotCWlmICh4YXR0cl90eXBlID09IFhBVFRSX0FDTF9BQ0NFU1NfVCkgewotCQlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7Ci0KLQkJc3Bpbl9sb2NrKCZsbGktPmxsaV9sb2NrKTsKLQkJYWNsID0gcG9zaXhfYWNsX2R1cChsbGktPmxsaV9wb3NpeF9hY2wpOwotCQlzcGluX3VubG9jaygmbGxpLT5sbGlfbG9jayk7Ci0KLQkJaWYgKCFhY2wpCi0JCQlyZXR1cm4gLUVOT0RBVEE7Ci0KLQkJcmMgPSBwb3NpeF9hY2xfdG9feGF0dHIoJmluaXRfdXNlcl9ucywgYWNsLCBidWZmZXIsIHNpemUpOwotCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwotCQlyZXR1cm4gcmM7Ci0JfQotCWlmICh4YXR0cl90eXBlID09IFhBVFRSX0FDTF9ERUZBVUxUX1QgJiYgIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCXJldHVybiAtRU5PREFUQTsKLSNlbmRpZgotCi1kb19nZXR4YXR0cjoKLQlpZiAoc2JpLT5sbF94YXR0cl9jYWNoZV9lbmFibGVkICYmIHhhdHRyX3R5cGUgIT0gWEFUVFJfQUNMX0FDQ0VTU19UKSB7CisJaWYgKHNiaS0+bGxfeGF0dHJfY2FjaGVfZW5hYmxlZCAmJiB0eXBlICE9IFhBVFRSX0FDTF9BQ0NFU1NfVCkgewogCQlyYyA9IGxsX3hhdHRyX2NhY2hlX2dldChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplLCB2YWxpZCk7CiAJCWlmIChyYyA9PSAtRUFHQUlOKQogCQkJZ290byBnZXR4YXR0cl9ub2NhY2hlOwpAQCAtMzExLDM2ICsyNTcsMzYgQEAKIAogCQkvKiBvbmx5IGRldGVjdCB0aGUgeGF0dHIgc2l6ZSAqLwogCQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlyYyA9IGJvZHktPmVhZGF0YXNpemU7CisJCQlyYyA9IGJvZHktPm1ib19lYWRhdGFzaXplOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAoc2l6ZSA8IGJvZHktPmVhZGF0YXNpemUpIHsKKwkJaWYgKHNpemUgPCBib2R5LT5tYm9fZWFkYXRhc2l6ZSkgewogCQkJQ0VSUk9SKCJzZXJ2ZXIgYnVnOiByZXBsaWVkIHNpemUgJXUgPiAldVxuIiwKLQkJCSAgICAgICBib2R5LT5lYWRhdGFzaXplLCAoaW50KXNpemUpOworCQkJICAgICAgIGJvZHktPm1ib19lYWRhdGFzaXplLCAoaW50KXNpemUpOwogCQkJcmMgPSAtRVJBTkdFOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAoYm9keS0+ZWFkYXRhc2l6ZSA9PSAwKSB7CisJCWlmIChib2R5LT5tYm9fZWFkYXRhc2l6ZSA9PSAwKSB7CiAJCQlyYyA9IC1FTk9EQVRBOwogCQkJZ290byBvdXQ7CiAJCX0KIAogCQkvKiBkbyBub3QgbmVlZCBzd2FiIHhhdHRyIGRhdGEgKi8KIAkJeGRhdGEgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfRUFEQVRBLAotCQkJCQkJICAgICBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJCSAgICAgYm9keS0+bWJvX2VhZGF0YXNpemUpOwogCQlpZiAoIXhkYXRhKSB7CiAJCQlyYyA9IC1FRkFVTFQ7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCW1lbWNweShidWZmZXIsIHhkYXRhLCBib2R5LT5lYWRhdGFzaXplKTsKLQkJcmMgPSBib2R5LT5lYWRhdGFzaXplOworCQltZW1jcHkoYnVmZmVyLCB4ZGF0YSwgYm9keS0+bWJvX2VhZGF0YXNpemUpOworCQlyYyA9IGJvZHktPm1ib19lYWRhdGFzaXplOwogCX0KIAogb3V0X3hhdHRyOgotCWlmIChyYyA9PSAtRU9QTk9UU1VQUCAmJiB4YXR0cl90eXBlID09IFhBVFRSX1VTRVJfVCkgeworCWlmIChyYyA9PSAtRU9QTk9UU1VQUCAmJiB0eXBlID09IFhBVFRSX1VTRVJfVCkgewogCQlMQ09OU09MRV9JTkZPKAogCQkJIiVzOiBkaXNhYmxpbmcgdXNlcl94YXR0ciBmZWF0dXJlIGJlY2F1c2UgaXQgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc2VydmVyOiByYyA9ICVkXG4iLAogCQkJbGxfZ2V0X2ZzbmFtZShpbm9kZS0+aV9zYiwgTlVMTCwgMCksIHJjKTsKQEAgLTM1MSw4ICsyOTcsNjUgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXNzaXplX3QgbGxfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBpbnQgbGxfeGF0dHJfZ2V0X2NvbW1vbihjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKKwkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwljaGFyIGZ1bGxuYW1lW3N0cmxlbihoYW5kbGVyLT5wcmVmaXgpICsgc3RybGVuKG5hbWUpICsgMV07CisJc3RydWN0IGxsX3NiX2luZm8gKnNiaSA9IGxsX2kyc2JpKGlub2RlKTsKKyNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCisJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7CisjZW5kaWYKKwlpbnQgcmM7CisKKwlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDppbm9kZT0iREZJRCIoJXApXG4iLAorCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSk7CisKKwlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9HRVRYQVRUUiwgMSk7CisKKwlyYyA9IHhhdHRyX3R5cGVfZmlsdGVyKHNiaSwgaGFuZGxlci0+ZmxhZ3MpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogYjE1NTg3OiBpZ25vcmUgc2VjdXJpdHkuY2FwYWJpbGl0eSB4YXR0ciBmb3Igbm93ICovCisJaWYgKChoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9TRUNVUklUWV9UICYmICFzdHJjbXAobmFtZSwgImNhcGFiaWxpdHkiKSkpCisJCXJldHVybiAtRU5PREFUQTsKKworCS8qIExVLTU0OTogIERpc2FibGUgc2VjdXJpdHkuc2VsaW51eCB3aGVuIHNlbGludXggaXMgZGlzYWJsZWQgKi8KKwlpZiAoaGFuZGxlci0+ZmxhZ3MgPT0gWEFUVFJfU0VDVVJJVFlfVCAmJiAhc2VsaW51eF9pc19lbmFibGVkKCkgJiYKKwkgICAgIXN0cmNtcChuYW1lLCAic2VsaW51eCIpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKyNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCisJLyogcG9zaXggYWNsIGlzIHVuZGVyIHByb3RlY3Rpb24gb2YgTE9PS1VQIGxvY2suIHdoZW4gY2FsbGluZyB0byB0aGlzLAorCSAqIHdlIGp1c3QgaGF2ZSBwYXRoIHJlc29sdXRpb24gdG8gdGhlIHRhcmdldCBpbm9kZSwgc28gd2UgaGF2ZSBncmVhdAorCSAqIGNoYW5jZSB0aGF0IGNhY2hlZCBBQ0wgaXMgdXB0b2RhdGUuCisJICovCisJaWYgKGhhbmRsZXItPmZsYWdzID09IFhBVFRSX0FDTF9BQ0NFU1NfVCkgeworCQlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisKKwkJc3Bpbl9sb2NrKCZsbGktPmxsaV9sb2NrKTsKKwkJYWNsID0gcG9zaXhfYWNsX2R1cChsbGktPmxsaV9wb3NpeF9hY2wpOworCQlzcGluX3VubG9jaygmbGxpLT5sbGlfbG9jayk7CisKKwkJaWYgKCFhY2wpCisJCQlyZXR1cm4gLUVOT0RBVEE7CisKKwkJcmMgPSBwb3NpeF9hY2xfdG9feGF0dHIoJmluaXRfdXNlcl9ucywgYWNsLCBidWZmZXIsIHNpemUpOworCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCQlyZXR1cm4gcmM7CisJfQorCWlmIChoYW5kbGVyLT5mbGFncyA9PSBYQVRUUl9BQ0xfREVGQVVMVF9UICYmICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT0RBVEE7CisjZW5kaWYKKwlzcHJpbnRmKGZ1bGxuYW1lLCAiJXMlc1xuIiwgaGFuZGxlci0+cHJlZml4LCBuYW1lKTsKKwlyZXR1cm4gbGxfeGF0dHJfbGlzdChpbm9kZSwgZnVsbG5hbWUsIGhhbmRsZXItPmZsYWdzLCBidWZmZXIsIHNpemUsCisJCQkgICAgIE9CRF9NRF9GTFhBVFRSKTsKK30KKworc3RhdGljIGludCBsbF94YXR0cl9nZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCisJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQljb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQogewogCUxBU1NFUlQoaW5vZGUpOwogCUxBU1NFUlQobmFtZSk7CkBAIC0zNjAsMzYgKzM2MywyMyBAQAogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOmlub2RlPSJERklEIiglcCksIHhhdHRyICVzXG4iLAogCSAgICAgICBQRklEKGxsX2lub2RlMmZpZChpbm9kZSkpLCBpbm9kZSwgbmFtZSk7CiAKLQlsbF9zdGF0c19vcHNfdGFsbHkobGxfaTJzYmkoaW5vZGUpLCBMUFJPQ19MTF9HRVRYQVRUUiwgMSk7Ci0KLQlpZiAoKHN0cm5jbXAobmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsCi0JCSAgICAgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEpID09IDAgJiYKLQkgICAgIHN0cmNtcChuYW1lICsgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEsICJsb3YiKSA9PSAwKSB8fAotCSAgICAoc3RybmNtcChuYW1lLCBYQVRUUl9MVVNUUkVfUFJFRklYLAotCQkgICAgIHNpemVvZihYQVRUUl9MVVNUUkVfUFJFRklYKSAtIDEpID09IDAgJiYKLQkgICAgIHN0cmNtcChuYW1lICsgc2l6ZW9mKFhBVFRSX0xVU1RSRV9QUkVGSVgpIC0gMSwgImxvdiIpID09IDApKSB7CisJaWYgKCFzdHJjbXAobmFtZSwgImxvdiIpKSB7CiAJCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc207CiAJCXN0cnVjdCBsb3ZfdXNlcl9tZCAqbHVtcDsKIAkJc3RydWN0IGxvdl9tZHNfbWQgKmxtbSA9IE5VTEw7CiAJCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCA9IE5VTEw7CiAJCWludCByYyA9IDAsIGxtbXNpemUgPSAwOwogCisJCWxsX3N0YXRzX29wc190YWxseShsbF9pMnNiaShpbm9kZSksIExQUk9DX0xMX0dFVFhBVFRSLCAxKTsKKwogCQlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCiAJCQlyZXR1cm4gLUVOT0RBVEE7CiAKLQkJaWYgKHNpemUgPT0gMCAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCQkvKiBYWFggZGlyZWN0b3J5IEVBIGlzIGZpeCBmb3Igbm93LCBvcHRpbWl6ZSB0byBzYXZlCi0JCQkgKiBSUEMgdHJhbnNmZXIKLQkJCSAqLwotCQkJcmMgPSBzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KIAkJbHNtID0gY2NjX2lub2RlX2xzbV9nZXQoaW5vZGUpOwogCQlpZiAoIWxzbSkgewogCQkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKLQkJCQlyYyA9IGxsX2Rpcl9nZXRzdHJpcGUoaW5vZGUsICZsbW0sCi0JCQkJCQkgICAgICAmbG1tc2l6ZSwgJnJlcXVlc3QpOworCQkJCXJjID0gbGxfZGlyX2dldHN0cmlwZShpbm9kZSwgKHZvaWQgKiopJmxtbSwKKwkJCQkJCSAgICAgICZsbW1zaXplLCAmcmVxdWVzdCwgMCk7CiAJCQl9IGVsc2UgewogCQkJCXJjID0gLUVOT0RBVEE7CiAJCQl9CkBAIC00MzksNyArNDI5LDcgQEAKIAkJcmV0dXJuIHJjOwogCX0KIAotCXJldHVybiBsbF9nZXR4YXR0cl9jb21tb24oaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSwgT0JEX01EX0ZMWEFUVFIpOworCXJldHVybiBsbF94YXR0cl9nZXRfY29tbW9uKGhhbmRsZXIsIGRlbnRyeSwgaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7CiB9CiAKIHNzaXplX3QgbGxfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKQEAgLTQ1Nyw3ICs0NDcsOCBAQAogCiAJbGxfc3RhdHNfb3BzX3RhbGx5KGxsX2kyc2JpKGlub2RlKSwgTFBST0NfTExfTElTVFhBVFRSLCAxKTsKIAotCXJjID0gbGxfZ2V0eGF0dHJfY29tbW9uKGlub2RlLCBOVUxMLCBidWZmZXIsIHNpemUsIE9CRF9NRF9GTFhBVFRSTFMpOworCXJjID0gbGxfeGF0dHJfbGlzdChpbm9kZSwgTlVMTCwgWEFUVFJfT1RIRVJfVCwgYnVmZmVyLCBzaXplLAorCQkJICAgT0JEX01EX0ZMWEFUVFJMUyk7CiAJaWYgKHJjIDwgMCkKIAkJZ290byBvdXQ7CiAKQEAgLTQ4OCw3ICs0NzksOCBAQAogCQlpZiAoIWxsX2kyaW5mbyhpbm9kZSktPmxsaV9oYXNfc21kKQogCQkJcmMyID0gLTE7CiAJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCXJjMiA9IGxsX2Rpcl9nZXRzdHJpcGUoaW5vZGUsICZsbW0sICZsbW1zaXplLCAmcmVxdWVzdCk7CisJCXJjMiA9IGxsX2Rpcl9nZXRzdHJpcGUoaW5vZGUsICh2b2lkICoqKSZsbW0sICZsbW1zaXplLAorCQkJCSAgICAgICAmcmVxdWVzdCwgMCk7CiAJfQogCiAJaWYgKHJjMiA8IDApIHsKQEAgLTUxOCwzICs1MTAsNTcgQEAKIAogCXJldHVybiByYzsKIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIGxsX3VzZXJfeGF0dHJfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfVVNFUl9QUkVGSVgsCisJLmZsYWdzID0gWEFUVFJfVVNFUl9ULAorCS5nZXQgPSBsbF94YXR0cl9nZXRfY29tbW9uLAorCS5zZXQgPSBsbF94YXR0cl9zZXRfY29tbW9uLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIGxsX3RydXN0ZWRfeGF0dHJfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfVFJVU1RFRF9QUkVGSVgsCisJLmZsYWdzID0gWEFUVFJfVFJVU1RFRF9ULAorCS5nZXQgPSBsbF94YXR0cl9nZXQsCisJLnNldCA9IGxsX3hhdHRyX3NldCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBsbF9zZWN1cml0eV94YXR0cl9oYW5kbGVyID0geworCS5wcmVmaXggPSBYQVRUUl9TRUNVUklUWV9QUkVGSVgsCisJLmZsYWdzID0gWEFUVFJfU0VDVVJJVFlfVCwKKwkuZ2V0ID0gbGxfeGF0dHJfZ2V0X2NvbW1vbiwKKwkuc2V0ID0gbGxfeGF0dHJfc2V0X2NvbW1vbiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBsbF9hY2xfYWNjZXNzX3hhdHRyX2hhbmRsZXIgPSB7CisJLnByZWZpeCA9IFhBVFRSX05BTUVfUE9TSVhfQUNMX0FDQ0VTUywKKwkuZmxhZ3MgPSBYQVRUUl9BQ0xfQUNDRVNTX1QsCisJLmdldCA9IGxsX3hhdHRyX2dldF9jb21tb24sCisJLnNldCA9IGxsX3hhdHRyX3NldF9jb21tb24sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgbGxfYWNsX2RlZmF1bHRfeGF0dHJfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfTkFNRV9QT1NJWF9BQ0xfREVGQVVMVCwKKwkuZmxhZ3MgPSBYQVRUUl9BQ0xfREVGQVVMVF9ULAorCS5nZXQgPSBsbF94YXR0cl9nZXRfY29tbW9uLAorCS5zZXQgPSBsbF94YXR0cl9zZXRfY29tbW9uLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIGxsX2x1c3RyZV94YXR0cl9oYW5kbGVyID0geworCS5wcmVmaXggPSBYQVRUUl9MVVNUUkVfUFJFRklYLAorCS5mbGFncyA9IFhBVFRSX0xVU1RSRV9ULAorCS5nZXQgPSBsbF94YXR0cl9nZXQsCisJLnNldCA9IGxsX3hhdHRyX3NldCwKK307CisKK2NvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpsbF94YXR0cl9oYW5kbGVyc1tdID0geworCSZsbF91c2VyX3hhdHRyX2hhbmRsZXIsCisJJmxsX3RydXN0ZWRfeGF0dHJfaGFuZGxlciwKKwkmbGxfc2VjdXJpdHlfeGF0dHJfaGFuZGxlciwKKyNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCisJJmxsX2FjbF9hY2Nlc3NfeGF0dHJfaGFuZGxlciwKKwkmbGxfYWNsX2RlZmF1bHRfeGF0dHJfaGFuZGxlciwKKyNlbmRpZgorCSZsbF9sdXN0cmVfeGF0dHJfaGFuZGxlciwKKwlOVUxMLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0cl9jYWNoZS5jCmluZGV4IDgwODlkYTguLjUwYTE5YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHJfY2FjaGUuYwpAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2RsbS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX3Zlci5oIgogI2luY2x1ZGUgImxsaXRlX2ludGVybmFsLmgiCkBAIC0yNzAsMTAgKzI2OSwxMiBAQAogCXN0cnVjdCBsdXN0cmVfaGFuZGxlIGxvY2toID0geyAwIH07CiAJc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGE7CiAJc3RydWN0IGxsX2lub2RlX2luZm8gKmxsaSA9IGxsX2kyaW5mbyhpbm9kZSk7Ci0Jc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvIGVpbmZvID0geyAuZWlfdHlwZSA9IExETE1fSUJJVFMsCi0JCQkJCSAgIC5laV9tb2RlID0gaXRfdG9fbG9ja19tb2RlKG9pdCksCi0JCQkJCSAgIC5laV9jYl9ibCA9IGxsX21kX2Jsb2NraW5nX2FzdCwKLQkJCQkJICAgLmVpX2NiX2NwID0gbGRsbV9jb21wbGV0aW9uX2FzdCB9OworCXN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyBlaW5mbyA9IHsKKwkJLmVpX3R5cGUgPSBMRExNX0lCSVRTLAorCQkuZWlfbW9kZSA9IGl0X3RvX2xvY2tfbW9kZShvaXQpLAorCQkuZWlfY2JfYmwgPSAmbGxfbWRfYmxvY2tpbmdfYXN0LAorCQkuZWlfY2JfY3AgPSAmbGRsbV9jb21wbGV0aW9uX2FzdCwKKwl9OwogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9pMnNiaShpbm9kZSk7CiAJc3RydWN0IG9iZF9leHBvcnQgKmV4cCA9IHNiaS0+bGxfbWRfZXhwOwogCWludCByYzsKQEAgLTMwNCw3ICszMDUsNyBAQAogCiAJb3BfZGF0YS0+b3BfdmFsaWQgPSBPQkRfTURfRkxYQVRUUiB8IE9CRF9NRF9GTFhBVFRSTFM7CiAKLQlyYyA9IG1kX2VucXVldWUoZXhwLCAmZWluZm8sIG9pdCwgb3BfZGF0YSwgJmxvY2toLCBOVUxMLCAwLCBOVUxMLCAwKTsKKwlyYyA9IG1kX2VucXVldWUoZXhwLCAmZWluZm8sIE5VTEwsIG9pdCwgb3BfZGF0YSwgJmxvY2toLCAwKTsKIAlsbF9maW5pc2hfbWRfb3BfZGF0YShvcF9kYXRhKTsKIAogCWlmIChyYyA8IDApIHsKQEAgLTM4MCwyNSArMzgxLDI1IEBACiAJfQogCS8qIGRvIG5vdCBuZWVkIHN3YWIgeGF0dHIgZGF0YSAqLwogCXhkYXRhID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX0VBREFUQSwKLQkJCQkJICAgICBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJICAgICBib2R5LT5tYm9fZWFkYXRhc2l6ZSk7CiAJeHZhbCA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9FQVZBTFMsCi0JCQkJCSAgICBib2R5LT5hY2xzaXplKTsKKwkJCQkJICAgIGJvZHktPm1ib19hY2xzaXplKTsKIAl4c2l6ZXMgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfRUFWQUxTX0xFTlMsCi0JCQkJCSAgICAgIGJvZHktPm1heF9tZHNpemUgKiBzaXplb2YoX191MzIpKTsKKwkJCQkJICAgICAgYm9keS0+bWJvX21heF9tZHNpemUgKiBzaXplb2YoX191MzIpKTsKIAlpZiAoIXhkYXRhIHx8ICF4dmFsIHx8ICF4c2l6ZXMpIHsKIAkJQ0VSUk9SKCJ3cm9uZyBzZXR4YXR0ciByZXBseVxuIik7CiAJCXJjID0gLUVQUk9UTzsKIAkJZ290byBvdXRfZGVzdHJveTsKIAl9CiAKLQl4dGFpbCA9IHhkYXRhICsgYm9keS0+ZWFkYXRhc2l6ZTsKLQl4dnRhaWwgPSB4dmFsICsgYm9keS0+YWNsc2l6ZTsKKwl4dGFpbCA9IHhkYXRhICsgYm9keS0+bWJvX2VhZGF0YXNpemU7CisJeHZ0YWlsID0geHZhbCArIGJvZHktPm1ib19hY2xzaXplOwogCiAJQ0RFQlVHKERfQ0FDSEUsICJjYWNoaW5nOiB4ZGF0YT0lcCB4dGFpbD0lcFxuIiwgeGRhdGEsIHh0YWlsKTsKIAogCWxsX3hhdHRyX2NhY2hlX2luaXQobGxpKTsKIAotCWZvciAoaSA9IDA7IGkgPCBib2R5LT5tYXhfbWRzaXplOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgYm9keS0+bWJvX21heF9tZHNpemU7IGkrKykgewogCQlDREVCVUcoRF9DQUNIRSwgImNhY2hpbmcgWyVzXT0lLipzXG4iLCB4ZGF0YSwgKnhzaXplcywgeHZhbCk7CiAJCS8qIFBlcmZvcm0gY29uc2lzdGVuY3kgY2hlY2tzOiBhdHRyIG5hbWVzIGFuZCB2YWxzIGluIHBpbGwgKi8KIAkJaWYgKCFtZW1jaHIoeGRhdGEsIDAsIHh0YWlsIC0geGRhdGEpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ZsZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9mbGQuYwppbmRleCBhM2QxNzBhLi5hNTI2NWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ZsZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfZmxkLmMKQEAgLTQ3LDE4ICs0NywyMCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKICNpbmNsdWRlICJsbXZfaW50ZXJuYWwuaCIKIAotaW50IGxtdl9mbGRfbG9va3VwKHN0cnVjdCBsbXZfb2JkICpsbXYsCi0JCSAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwKLQkJICAgdTMyICptZHMpCitpbnQgbG12X2ZsZF9sb29rdXAoc3RydWN0IGxtdl9vYmQgKmxtdiwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLCB1MzIgKm1kcykKIHsKKwlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gbG12Mm9iZF9kZXYobG12KTsKIAlpbnQgcmM7CiAKLQkvKiBGSVhNRTogQ3VycmVudGx5IFpGUyBzdGlsbCB1c2UgbG9jYWwgc2VxIGZvciBST09UIHVuZm9ydHVuYXRlbHksIGFuZAorCS8qCisJICogRklYTUU6IEN1cnJlbnRseSBaRlMgc3RpbGwgdXNlIGxvY2FsIHNlcSBmb3IgUk9PVCB1bmZvcnR1bmF0ZWx5LCBhbmQKIAkgKiB0aGlzIGZpZF9pc19sb2NhbCBjaGVjayBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIExVLTIyNDAgaXMgZml4ZWQKIAkgKi8KLQlMQVNTRVJURigoZmlkX3NlcV9pbl9mbGRiKGZpZF9zZXEoZmlkKSkgfHwKLQkJICBmaWRfc2VxX2lzX2xvY2FsX2ZpbGUoZmlkX3NlcShmaWQpKSkgJiYKLQkJIGZpZF9pc19zYW5lKGZpZCksIERGSUQiIGlzIGluc2FuZSFcbiIsIFBGSUQoZmlkKSk7CisJaWYgKCFmaWRfaXNfc2FuZShmaWQpIHx8ICEoZmlkX3NlcV9pbl9mbGRiKGZpZF9zZXEoZmlkKSkgfHwKKwkJCQkgICBmaWRfc2VxX2lzX2xvY2FsX2ZpbGUoZmlkX3NlcShmaWQpKSkpIHsKKwkJQ0VSUk9SKCIlczogaW52YWxpZCBGSUQgIiBERklEICJcbiIsIG9iZC0+b2JkX25hbWUsIFBGSUQoZmlkKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXJjID0gZmxkX2NsaWVudF9sb29rdXAoJmxtdi0+bG12X2ZsZCwgZmlkX3NlcShmaWQpLCBtZHMsCiAJCQkgICAgICAgTFVfU0VRX1JBTkdFX01EVCwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlbnQuYwppbmRleCAyZjU4ZmRhLi45ZjRlODI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfaW50ZW50LmMKQEAgLTQzLDEzICs0MywxMyBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpYi5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX25ldC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2RsbS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX21kYy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgogI2luY2x1ZGUgImxtdl9pbnRlcm5hbC5oIgogCi1zdGF0aWMgaW50IGxtdl9pbnRlbnRfcmVtb3RlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHZvaWQgKmxtbSwKLQkJCSAgICAgaW50IGxtbXNpemUsIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqcGFyZW50X2ZpZCwgaW50IGZsYWdzLAorc3RhdGljIGludCBsbXZfaW50ZW50X3JlbW90ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKnBhcmVudF9maWQsCiAJCQkgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCiAJCQkgICAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCiAJCQkgICAgIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCkBAIC02OCw3ICs2OCw3IEBACiAJaWYgKCFib2R5KQogCQlyZXR1cm4gLUVQUk9UTzsKIAotCUxBU1NFUlQoKGJvZHktPnZhbGlkICYgT0JEX01EX01EUykpOworCUxBU1NFUlQoKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9NRFMpKTsKIAogCS8qCiAJICogVW5mb3J0dW5hdGVseSwgd2UgaGF2ZSB0byBsaWUgdG8gTURDL01EUyB0byByZXRyaWV2ZQpAQCAtODcsOSArODcsOSBAQAogCQlpdC0+aXRfcmVxdWVzdCA9IE5VTEw7CiAJfQogCi0JTEFTU0VSVChmaWRfaXNfc2FuZSgmYm9keS0+ZmlkMSkpOworCUxBU1NFUlQoZmlkX2lzX3NhbmUoJmJvZHktPm1ib19maWQxKSk7CiAKLQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmYm9keS0+ZmlkMSk7CisJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJmJvZHktPm1ib19maWQxKTsKIAlpZiAoSVNfRVJSKHRndCkpIHsKIAkJcmMgPSBQVFJfRVJSKHRndCk7CiAJCWdvdG8gb3V0OwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCW9wX2RhdGEtPm9wX2ZpZDEgPSBib2R5LT5maWQxOworCW9wX2RhdGEtPm9wX2ZpZDEgPSBib2R5LT5tYm9fZmlkMTsKIAkvKiBTZW50IHRoZSBwYXJlbnQgRklEIHRvIHRoZSByZW1vdGUgTURUICovCiAJaWYgKHBhcmVudF9maWQpIHsKIAkJLyogVGhlIHBhcmVudCBmaWQgaXMgb25seSBmb3IgcmVtb3RlIG9wZW4gdG8KQEAgLTExMCwxOCArMTEwLDE0IEBACiAJCSAqLwogCQlMQVNTRVJUKGl0LT5pdF9vcCAmIElUX09QRU4pOwogCQlvcF9kYXRhLT5vcF9maWQyID0gKnBhcmVudF9maWQ7Ci0JCS8qIEFkZCBvYmplY3QgRklEIHRvIG9wX2ZpZDMsIGluIGNhc2UgaXQgbmVlZHMgdG8gY2hlY2sgc3RhbGUKLQkJICogKE1fQ0hFQ0tfU1RBTEUpLCBzZWUgbWRjX2ZpbmlzaF9pbnRlbnRfbG9jawotCQkgKi8KLQkJb3BfZGF0YS0+b3BfZmlkMyA9IGJvZHktPmZpZDE7CiAJfQogCiAJb3BfZGF0YS0+b3BfYmlhcyA9IE1EU19DUk9TU19SRUY7Ci0JQ0RFQlVHKERfSU5PREUsICJSRU1PVEVfSU5URU5UIHdpdGggZmlkPSJERklEIiAtPiBtZHMgIyVkXG4iLAotCSAgICAgICBQRklEKCZib2R5LT5maWQxKSwgdGd0LT5sdGRfaWR4KTsKKwlDREVCVUcoRF9JTk9ERSwgIlJFTU9URV9JTlRFTlQgd2l0aCBmaWQ9IiBERklEICIgLT4gbWRzICMldVxuIiwKKwkgICAgICAgUEZJRCgmYm9keS0+bWJvX2ZpZDEpLCB0Z3QtPmx0ZF9pZHgpOwogCi0JcmMgPSBtZF9pbnRlbnRfbG9jayh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGxtbSwgbG1tc2l6ZSwgaXQsCi0JCQkgICAgZmxhZ3MsICZyZXEsIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKKwlyYyA9IG1kX2ludGVudF9sb2NrKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgaXQsICZyZXEsIGNiX2Jsb2NraW5nLAorCQkJICAgIGV4dHJhX2xvY2tfZmxhZ3MpOwogCWlmIChyYykKIAkJZ290byBvdXRfZnJlZV9vcF9kYXRhOwogCkBAIC0xMzYsOCArMTMyLDEwIEBACiAJCWl0LT5pdF9yZW1vdGVfbG9ja19tb2RlID0gaXQtPml0X2xvY2tfbW9kZTsKIAl9CiAKLQlpdC0+aXRfbG9ja19oYW5kbGUgPSBwbG9jay5jb29raWU7Ci0JaXQtPml0X2xvY2tfbW9kZSA9IHBtb2RlOworCWlmIChwbW9kZSkgeworCQlpdC0+aXRfbG9ja19oYW5kbGUgPSBwbG9jay5jb29raWU7CisJCWl0LT5pdF9sb2NrX21vZGUgPSBwbW9kZTsKKwl9CiAKIG91dF9mcmVlX29wX2RhdGE6CiAJa2ZyZWUob3BfZGF0YSk7CkBAIC0xNTAsMTMgKzE0OCwxMjYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK2ludCBsbXZfcmV2YWxpZGF0ZV9zbGF2ZXMoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJCSAgY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJCSAgbGRsbV9ibG9ja2luZ19jYWxsYmFjayBjYl9ibG9ja2luZywKKwkJCSAgaW50IGV4dHJhX2xvY2tfZmxhZ3MpCit7CisJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGV4cC0+ZXhwX29iZDsKKwlzdHJ1Y3QgbG12X29iZCAqbG12ID0gJm9iZC0+dS5sbXY7CisJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEgPSBOVUxMOworCXN0cnVjdCBtZHRfYm9keSAqYm9keTsKKwlzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YTsKKwlpbnQgcmMgPSAwLCBpOworCisJLyoqCisJICogcmV2YWxpZGF0ZSBzbGF2ZXMgaGFzIHNvbWUgcHJvYmxlbXMsIHRlbXBvcmFyaWx5IHJldHVybiwKKwkgKiB3ZSBtYXkgbm90IG5lZWQgdGhhdAorCSAqLworCW9wX2RhdGEgPSBremFsbG9jKHNpemVvZigqb3BfZGF0YSksIEdGUF9OT0ZTKTsKKwlpZiAoIW9wX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoqCisJICogTG9vcCBvdmVyIHRoZSBzdHJpcGUgaW5mb3JtYXRpb24sIGNoZWNrIHZhbGlkaXR5IGFuZCB1cGRhdGUgdGhlbQorCSAqIGZyb20gTURTIGlmIG5lZWRlZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGxvb2t1cF9pbnRlbnQgaXQgPSB7IC5pdF9vcCA9IElUX0dFVEFUVFIgfTsKKwkJc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toID0gTlVMTDsKKwkJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0ID0gTlVMTDsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKwkJc3RydWN0IGx1X2ZpZCBmaWQ7CisKKwkJZmlkID0gbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZDsKKwkJaW5vZGUgPSBsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fcm9vdDsKKworCQkvKgorCQkgKiBQcmVwYXJlIG9wX2RhdGEgZm9yIHJldmFsaWRhdGluZy4gTm90ZSB0aGF0IEBmaWQyIHNobHVsZCBiZQorCQkgKiBkZWZpbmVkIG90aGVyd2lzZSBpdCB3aWxsIGdvIHRvIHNlcnZlciBhbmQgdGFrZSBuZXcgbG9jaworCQkgKiB3aGljaCBpcyBub3QgbmVlZGVkIGhlcmUuCisJCSAqLworCQltZW1zZXQob3BfZGF0YSwgMCwgc2l6ZW9mKCpvcF9kYXRhKSk7CisJCW9wX2RhdGEtPm9wX2ZpZDEgPSBmaWQ7CisJCW9wX2RhdGEtPm9wX2ZpZDIgPSBmaWQ7CisKKwkJdGd0ID0gbG12X2xvY2F0ZV9tZHMobG12LCBvcF9kYXRhLCAmZmlkKTsKKwkJaWYgKElTX0VSUih0Z3QpKSB7CisJCQlyYyA9IFBUUl9FUlIodGd0KTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCisJCUNERUJVRyhEX0lOT0RFLCAiUmV2YWxpZGF0ZSBzbGF2ZSAiIERGSUQgIiAtPiBtZHMgIyV1XG4iLAorCQkgICAgICAgUEZJRCgmZmlkKSwgdGd0LT5sdGRfaWR4KTsKKworCQlpZiAocmVxKSB7CisJCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CisJCQlyZXEgPSBOVUxMOworCQl9CisKKwkJcmMgPSBtZF9pbnRlbnRfbG9jayh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsICZpdCwgJnJlcSwKKwkJCQkgICAgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBjbGVhbnVwOworCisJCWxvY2toID0gKHN0cnVjdCBsdXN0cmVfaGFuZGxlICopJml0Lml0X2xvY2tfaGFuZGxlOworCQlpZiAocmMgPiAwICYmICFyZXEpIHsKKwkJCS8qIHNsYXZlIGlub2RlIGlzIHN0aWxsIHZhbGlkICovCisJCQlDREVCVUcoRF9JTk9ERSwgInNsYXZlICJERklEIiBpcyBzdGlsbCB2YWxpZC5cbiIsCisJCQkgICAgICAgUEZJRCgmZmlkKSk7CisJCQlyYyA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiByZWZyZXNoIHNsYXZlIGZyb20gc2VydmVyICovCisJCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLAorCQkJCQkJICAgICAgJlJNRl9NRFRfQk9EWSk7CisJCQlMQVNTRVJUKGJvZHkpOworCisJCQlpZiAodW5saWtlbHkoYm9keS0+bWJvX25saW5rIDwgMikpIHsKKwkJCQlDRVJST1IoIiVzOiBubGluayAlZCA8IDIgY29ycnVwdCBzdHJpcGUgJWQgIkRGSUQiOiIgREZJRCJcbiIsCisJCQkJICAgICAgIG9iZC0+b2JkX25hbWUsIGJvZHktPm1ib19ubGluaywgaSwKKwkJCQkgICAgICAgUEZJRCgmbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZCksCisJCQkJICAgICAgIFBGSUQoJmxzbS0+bHNtX21kX29pbmZvWzBdLmxtb19maWQpKTsKKworCQkJCWlmIChpdC5pdF9sb2NrX21vZGUgJiYgbG9ja2gpIHsKKwkJCQkJbGRsbV9sb2NrX2RlY3JlZihsb2NraCwgaXQuaXRfbG9ja19tb2RlKTsKKwkJCQkJaXQuaXRfbG9ja19tb2RlID0gMDsKKwkJCQl9CisKKwkJCQlyYyA9IC1FSU87CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCisJCQlpX3NpemVfd3JpdGUoaW5vZGUsIGJvZHktPm1ib19zaXplKTsKKwkJCWlub2RlLT5pX2Jsb2NrcyA9IGJvZHktPm1ib19ibG9ja3M7CisJCQlzZXRfbmxpbmsoaW5vZGUsIGJvZHktPm1ib19ubGluayk7CisJCQlMVElNRV9TKGlub2RlLT5pX2F0aW1lKSA9IGJvZHktPm1ib19hdGltZTsKKwkJCUxUSU1FX1MoaW5vZGUtPmlfY3RpbWUpID0gYm9keS0+bWJvX2N0aW1lOworCQkJTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkgPSBib2R5LT5tYm9fbXRpbWU7CisJCX0KKworCQltZF9zZXRfbG9ja19kYXRhKHRndC0+bHRkX2V4cCwgbG9ja2gsIGlub2RlLCBOVUxMKTsKKworCQlpZiAoaXQuaXRfbG9ja19tb2RlICYmIGxvY2toKSB7CisJCQlsZGxtX2xvY2tfZGVjcmVmKGxvY2toLCBpdC5pdF9sb2NrX21vZGUpOworCQkJaXQuaXRfbG9ja19tb2RlID0gMDsKKwkJfQorCX0KKworY2xlYW51cDoKKwlpZiAocmVxKQorCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CisKKwlrZnJlZShvcF9kYXRhKTsKKwlyZXR1cm4gcmM7Cit9CisKIC8qCiAgKiBJVF9PUEVOIGlzIGludGVuZGVkIHRvIG9wZW4gKGFuZCBjcmVhdGUsIHBvc3NpYmxlKSBhbiBvYmplY3QuIFBhcmVudCAocGlkKQogICogbWF5IGJlIHNwbGl0IGRpci4KICAqLwogc3RhdGljIGludCBsbXZfaW50ZW50X29wZW4oc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCQkgICB2b2lkICpsbW0sIGludCBsbW1zaXplLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCi0JCQkgICBpbnQgZmxhZ3MsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCisJCQkgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCisJCQkgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXFwLAogCQkJICAgbGRsbV9ibG9ja2luZ19jYWxsYmFjayBjYl9ibG9ja2luZywKIAkJCSAgIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCiB7CkBAIC0xNjYsMzUgKzI3Nyw1NSBAQAogCXN0cnVjdCBtZHRfYm9keQkJKmJvZHk7CiAJaW50CQkJcmM7CiAKLQl0Z3QgPSBsbXZfbG9jYXRlX21kcyhsbXYsIG9wX2RhdGEsICZvcF9kYXRhLT5vcF9maWQxKTsKLQlpZiAoSVNfRVJSKHRndCkpCi0JCXJldHVybiBQVFJfRVJSKHRndCk7CisJaWYgKGl0LT5pdF9mbGFncyAmIE1EU19PUEVOX0JZX0ZJRCkgeworCQlMQVNTRVJUKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQyKSk7CisKKwkJLyoKKwkJICogZm9yIHN0cmlwZWQgZGlyZWN0b3J5LCB3ZSBjYW4ndCBrbm93IHBhcmVudCBzdHJpcGUgZmlkCisJCSAqIHdpdGhvdXQgbmFtZSwgYnV0IHdlIGNhbiBzZXQgaXQgdG8gY2hpbGQgZmlkLCBhbmQgTURUCisJCSAqIHdpbGwgb2J0YWluIGl0IGZyb20gbGlua2VhIGluIG9wZW4gaW4gc3VjaCBjYXNlLgorCQkgKi8KKwkJaWYgKG9wX2RhdGEtPm9wX21lYTEpCisJCQlvcF9kYXRhLT5vcF9maWQxID0gb3BfZGF0YS0+b3BfZmlkMjsKKworCQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmb3BfZGF0YS0+b3BfZmlkMik7CisJCWlmIChJU19FUlIodGd0KSkKKwkJCXJldHVybiBQVFJfRVJSKHRndCk7CisKKwkJb3BfZGF0YS0+b3BfbWRzID0gdGd0LT5sdGRfaWR4OworCX0gZWxzZSB7CisJCUxBU1NFUlQoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDEpKTsKKwkJTEFTU0VSVChmaWRfaXNfemVybygmb3BfZGF0YS0+b3BfZmlkMikpOworCQlMQVNTRVJUKG9wX2RhdGEtPm9wX25hbWUpOworCisJCXRndCA9IGxtdl9sb2NhdGVfbWRzKGxtdiwgb3BfZGF0YSwgJm9wX2RhdGEtPm9wX2ZpZDEpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCX0KIAogCS8qIElmIGl0IGlzIHJlYWR5IHRvIG9wZW4gdGhlIGZpbGUgYnkgRklELCBkbyBub3QgbmVlZAogCSAqIGFsbG9jYXRlIEZJRCBhdCBhbGwsIG90aGVyd2lzZSBpdCB3aWxsIGNvbmZ1c2UgTURUCiAJICovCi0JaWYgKChpdC0+aXRfb3AgJiBJVF9DUkVBVCkgJiYKLQkgICAgIShpdC0+aXRfZmxhZ3MgJiBNRFNfT1BFTl9CWV9GSUQpKSB7CisJaWYgKChpdC0+aXRfb3AgJiBJVF9DUkVBVCkgJiYgIShpdC0+aXRfZmxhZ3MgJiBNRFNfT1BFTl9CWV9GSUQpKSB7CiAJCS8qCi0JCSAqIEZvciBvcGVuIHdpdGggSVRfQ1JFQVRFIGFuZCBmb3IgSVRfQ1JFQVRFIGNhc2VzIGFsbG9jYXRlIG5ldwotCQkgKiBmaWQgYW5kIHNldHVwIEZMRCBmb3IgaXQuCisJCSAqIEZvciBsb29rdXAoSVRfQ1JFQVRFKSBjYXNlcyBhbGxvY2F0ZSBuZXcgZmlkIGFuZCBzZXR1cCBGTEQKKwkJICogZm9yIGl0LgogCQkgKi8KLQkJb3BfZGF0YS0+b3BfZmlkMyA9IG9wX2RhdGEtPm9wX2ZpZDI7Ci0JCXJjID0gbG12X2ZpZF9hbGxvYyhleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKKwkJcmMgPSBsbXZfZmlkX2FsbG9jKE5VTEwsIGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOwogCQlpZiAocmMgIT0gMCkKIAkJCXJldHVybiByYzsKIAl9CiAKLQlDREVCVUcoRF9JTk9ERSwgIk9QRU5fSU5URU5UIHdpdGggZmlkMT0iIERGSUQgIiwgZmlkMj0iIERGSUQgIiwgbmFtZT0nJXMnIC0+IG1kcyAjJWRcbiIsCisJQ0RFQlVHKERfSU5PREUsICJPUEVOX0lOVEVOVCB3aXRoIGZpZDE9IiBERklEICIsIGZpZDI9IiBERklEICIsIG5hbWU9JyVzJyAtPiBtZHMgIyV1XG4iLAogCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKIAkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMiksIG9wX2RhdGEtPm9wX25hbWUsIHRndC0+bHRkX2lkeCk7CiAKLQlyYyA9IG1kX2ludGVudF9sb2NrKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgbG1tLCBsbW1zaXplLCBpdCwgZmxhZ3MsCi0JCQkgICAgcmVxcCwgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOworCXJjID0gbWRfaW50ZW50X2xvY2sodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBpdCwgcmVxcCwgY2JfYmxvY2tpbmcsCisJCQkgICAgZXh0cmFfbG9ja19mbGFncyk7CiAJaWYgKHJjICE9IDApCiAJCXJldHVybiByYzsKIAkvKgotCSAqIE5vdGhpbmcgaXMgZm91bmQsIGRvIG5vdCBhY2Nlc3MgYm9keS0+ZmlkMSBhcyBpdCBpcyB6ZXJvIGFuZCB0aHVzCisJICogTm90aGluZyBpcyBmb3VuZCwgZG8gbm90IGFjY2VzcyBib2R5LT5tYm9fZmlkMSBhcyBpdCBpcyB6ZXJvIGFuZCB0aHVzCiAJICogcG9pbnRsZXNzLgogCSAqLwogCWlmICgoaXQtPml0X2Rpc3Bvc2l0aW9uICYgRElTUF9MT09LVVBfTkVHKSAmJgpAQCAtMjA1LDMxICszMzYsMTcgQEAKIAlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpyZXFwKS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAJaWYgKCFib2R5KQogCQlyZXR1cm4gLUVQUk9UTzsKLQkvKgotCSAqIE5vdCBjcm9zcy1yZWYgY2FzZSwganVzdCBnZXQgb3V0IG9mIGhlcmUuCi0JICovCi0JaWYgKGxpa2VseSghKGJvZHktPnZhbGlkICYgT0JEX01EX01EUykpKQotCQlyZXR1cm4gMDsKIAotCS8qCi0JICogT2theSwgTURTIGhhcyByZXR1cm5lZCBzdWNjZXNzLiBQcm9iYWJseSBuYW1lIGhhcyBiZWVuIHJlc29sdmVkIGluCi0JICogcmVtb3RlIGlub2RlLgotCSAqLwotCXJjID0gbG12X2ludGVudF9yZW1vdGUoZXhwLCBsbW0sIGxtbXNpemUsIGl0LCAmb3BfZGF0YS0+b3BfZmlkMSwgZmxhZ3MsCi0JCQkgICAgICAgcmVxcCwgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOwotCWlmIChyYyAhPSAwKSB7Ci0JCUxBU1NFUlQocmMgPCAwKTsKLQkJLyoKLQkJICogVGhpcyBpcyBwb3NzaWJsZSwgdGhhdCBzb21lIHVzZXJzcGFjZSBhcHBsaWNhdGlvbiB3aWxsIHRyeSB0bwotCQkgKiBvcGVuIGZpbGUgYXMgZGlyZWN0b3J5IGFuZCB3ZSB3aWxsIGhhdmUgLUVOT1RESVIgaGVyZS4gQXMKLQkJICogdGhpcyBpcyBub3JtYWwgc2l0dWF0aW9uLCB3ZSBzaG91bGQgbm90IHByaW50IGVycm9yIGhlcmUsCi0JCSAqIG9ubHkgZGVidWcgaW5mby4KLQkJICovCi0JCUNERUJVRyhEX0lOT0RFLCAiQ2FuJ3QgaGFuZGxlIHJlbW90ZSAlczogZGlyICIgREZJRCAiKCIgREZJRCAiKTolKnM6ICVkXG4iLAotCQkgICAgICAgTExfSVQyU1RSKGl0KSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMiksCi0JCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgb3BfZGF0YS0+b3BfbmFtZWxlbiwKLQkJICAgICAgIG9wX2RhdGEtPm9wX25hbWUsIHJjKTsKLQkJcmV0dXJuIHJjOworCS8qIE5vdCBjcm9zcy1yZWYgY2FzZSwganVzdCBnZXQgb3V0IG9mIGhlcmUuICovCisJaWYgKHVubGlrZWx5KChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfTURTKSkpIHsKKwkJcmMgPSBsbXZfaW50ZW50X3JlbW90ZShleHAsIGl0LCAmb3BfZGF0YS0+b3BfZmlkMSwgcmVxcCwKKwkJCQkgICAgICAgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOworCQlpZiAocmMgIT0gMCkKKwkJCXJldHVybiByYzsKKworCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpyZXFwKS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CisJCWlmICghYm9keSkKKwkJCXJldHVybiAtRVBST1RPOwogCX0KIAogCXJldHVybiByYzsKQEAgLTI0MCwzOCArMzU3LDEwMyBAQAogICovCiBzdGF0aWMgaW50IGxtdl9pbnRlbnRfbG9va3VwKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQkgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkJICAgICB2b2lkICpsbW0sIGludCBsbW1zaXplLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCi0JCQkgICAgIGludCBmbGFncywgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKKwkJCSAgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAorCQkJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXFwLAogCQkJICAgICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLAogCQkJICAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQogeworCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWExOwogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgKm9iZCA9IGV4cC0+ZXhwX29iZDsKIAlzdHJ1Y3QgbG12X29iZAkgKmxtdiA9ICZvYmQtPnUubG12OwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgICAgKnRndCA9IE5VTEw7CiAJc3RydWN0IG1kdF9ib2R5CSpib2R5OwogCWludAkJICAgICByYyA9IDA7CiAKKwkvKgorCSAqIElmIGl0IHJldHVybnMgRVJSX1BUUigtRUJBREZEKSB0aGVuIGl0IGlzIGFuIHVua25vd24gaGFzaCB0eXBlCisJICogaXQgd2lsbCB0cnkgYWxsIHN0cmlwZXMgdG8gbG9jYXRlIHRoZSBvYmplY3QKKwkgKi8KIAl0Z3QgPSBsbXZfbG9jYXRlX21kcyhsbXYsIG9wX2RhdGEsICZvcF9kYXRhLT5vcF9maWQxKTsKLQlpZiAoSVNfRVJSKHRndCkpCisJaWYgKElTX0VSUih0Z3QpICYmIChQVFJfRVJSKHRndCkgIT0gLUVCQURGRCkpCiAJCXJldHVybiBQVFJfRVJSKHRndCk7CiAKKwkvKgorCSAqIEJvdGggbWlncmF0aW5nIGRpciBhbmQgdW5rbm93biBoYXNoIGRpciBuZWVkIHRvIHRyeQorCSAqIGFsbCBvZiBzdWItc3RyaXBlcworCSAqLworCWlmIChsc20gJiYgIWxtdl9pc19rbm93bl9oYXNoX3R5cGUobHNtLT5sc21fbWRfaGFzaF90eXBlKSkgeworCQlzdHJ1Y3QgbG12X29pbmZvICpvaW5mbyA9ICZsc20tPmxzbV9tZF9vaW5mb1swXTsKKworCQlvcF9kYXRhLT5vcF9maWQxID0gb2luZm8tPmxtb19maWQ7CisJCW9wX2RhdGEtPm9wX21kcyA9IG9pbmZvLT5sbW9fbWRzOworCQl0Z3QgPSBsbXZfZ2V0X3RhcmdldChsbXYsIG9pbmZvLT5sbW9fbWRzLCBOVUxMKTsKKwkJaWYgKElTX0VSUih0Z3QpKQorCQkJcmV0dXJuIFBUUl9FUlIodGd0KTsKKwl9CisKIAlpZiAoIWZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQyKSkKIAkJZmlkX3plcm8oJm9wX2RhdGEtPm9wX2ZpZDIpOwogCi0JQ0RFQlVHKERfSU5PREUsICJMT09LVVBfSU5URU5UIHdpdGggZmlkMT0iREZJRCIsIGZpZDI9IkRGSUQKLQkgICAgICAgIiwgbmFtZT0nJXMnIC0+IG1kcyAjJWRcbiIsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLAotCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSwKKwlDREVCVUcoRF9JTk9ERSwgIkxPT0tVUF9JTlRFTlQgd2l0aCBmaWQxPSIgREZJRCAiLCBmaWQyPSIgREZJRCAiLCBuYW1lPSclcycgLT4gbWRzICMldSBsc209JXAgbHNtX21hZ2ljPSV4XG4iLAorCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMiksCiAJICAgICAgIG9wX2RhdGEtPm9wX25hbWUgPyBvcF9kYXRhLT5vcF9uYW1lIDogIjxOVUxMPiIsCi0JICAgICAgIHRndC0+bHRkX2lkeCk7CisJICAgICAgIHRndC0+bHRkX2lkeCwgbHNtLCAhbHNtID8gLTEgOiBsc20tPmxzbV9tZF9tYWdpYyk7CiAKIAlvcF9kYXRhLT5vcF9iaWFzICY9IH5NRFNfQ1JPU1NfUkVGOwogCi0JcmMgPSBtZF9pbnRlbnRfbG9jayh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGxtbSwgbG1tc2l6ZSwgaXQsCi0JCQkgICAgZmxhZ3MsIHJlcXAsIGNiX2Jsb2NraW5nLCBleHRyYV9sb2NrX2ZsYWdzKTsKLQotCWlmIChyYyA8IDAgfHwgISpyZXFwKQorCXJjID0gbWRfaW50ZW50X2xvY2sodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBpdCwgcmVxcCwgY2JfYmxvY2tpbmcsCisJCQkgICAgZXh0cmFfbG9ja19mbGFncyk7CisJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCisJaWYgKCEqcmVxcCkgeworCQkvKgorCQkgKiBJZiBSUEMgaGFwcGVucywgbHNtIGluZm9ybWF0aW9uIHdpbGwgYmUgcmV2YWxpZGF0ZWQKKwkJICogZHVyaW5nIHVwZGF0ZV9pbm9kZSBwcm9jZXNzIChzZWUgbGxfdXBkYXRlX2xzbV9tZCkKKwkJICovCisJCWlmIChvcF9kYXRhLT5vcF9tZWEyKSB7CisJCQlyYyA9IGxtdl9yZXZhbGlkYXRlX3NsYXZlcyhleHAsIG9wX2RhdGEtPm9wX21lYTIsCisJCQkJCQkgICBjYl9ibG9ja2luZywKKwkJCQkJCSAgIGV4dHJhX2xvY2tfZmxhZ3MpOworCQkJaWYgKHJjICE9IDApCisJCQkJcmV0dXJuIHJjOworCQl9CisJCXJldHVybiByYzsKKwl9IGVsc2UgaWYgKGl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0xPT0tVUF9ORUcpICYmIGxzbSAmJgorCQkgICBsbXZfbmVlZF90cnlfYWxsX3N0cmlwZXMobHNtKSkgeworCQkvKgorCQkgKiBGb3IgbWlncmF0aW5nIGFuZCB1bmtub3duIGhhc2ggdHlwZSBkaXJlY3RvcnksIGl0IHdpbGwKKwkJICogdHJ5IHRvIHRhcmdldCB0aGUgZW50cnkgb24gb3RoZXIgc3RyaXBlcworCQkgKi8KKwkJaW50IHN0cmlwZV9pbmRleDsKKworCQlmb3IgKHN0cmlwZV9pbmRleCA9IDE7CisJCSAgICAgc3RyaXBlX2luZGV4IDwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50ICYmCisJCSAgICAgaXRfZGlzcG9zaXRpb24oaXQsIERJU1BfTE9PS1VQX05FRyk7IHN0cmlwZV9pbmRleCsrKSB7CisJCQlzdHJ1Y3QgbG12X29pbmZvICpvaW5mbzsKKworCQkJLyogcmVsZWFzZSB0aGUgcHJldmlvdXMgcmVxdWVzdCAqLworCQkJcHRscnBjX3JlcV9maW5pc2hlZCgqcmVxcCk7CisJCQlpdC0+aXRfcmVxdWVzdCA9IE5VTEw7CisJCQkqcmVxcCA9IE5VTEw7CisKKwkJCW9pbmZvID0gJmxzbS0+bHNtX21kX29pbmZvW3N0cmlwZV9pbmRleF07CisJCQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmb2luZm8tPmxtb19maWQpOworCQkJaWYgKElTX0VSUih0Z3QpKQorCQkJCXJldHVybiBQVFJfRVJSKHRndCk7CisKKwkJCUNERUJVRyhEX0lOT0RFLCAiVHJ5IG90aGVyIHN0cmlwZXMgIiBERklEIlxuIiwKKwkJCSAgICAgICBQRklEKCZvaW5mby0+bG1vX2ZpZCkpOworCisJCQlvcF9kYXRhLT5vcF9maWQxID0gb2luZm8tPmxtb19maWQ7CisJCQlpdC0+aXRfZGlzcG9zaXRpb24gJj0gfkRJU1BfRU5RX0NPTVBMRVRFOworCQkJcmMgPSBtZF9pbnRlbnRfbG9jayh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGl0LCByZXFwLAorCQkJCQkgICAgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOworCQkJaWYgKHJjKQorCQkJCXJldHVybiByYzsKKwkJfQorCX0KKwogCS8qCiAJICogTURTIGhhcyByZXR1cm5lZCBzdWNjZXNzLiBQcm9iYWJseSBuYW1lIGhhcyBiZWVuIHJlc29sdmVkIGluCiAJICogcmVtb3RlIGlub2RlLiBMZXQncyBjaGVjayB0aGlzLgpAQCAtMjc5LDE5ICs0NjEsMjMgQEAKIAlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpyZXFwKS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAJaWYgKCFib2R5KQogCQlyZXR1cm4gLUVQUk9UTzsKLQkvKiBOb3QgY3Jvc3MtcmVmIGNhc2UsIGp1c3QgZ2V0IG91dCBvZiBoZXJlLiAqLwotCWlmIChsaWtlbHkoIShib2R5LT52YWxpZCAmIE9CRF9NRF9NRFMpKSkKLQkJcmV0dXJuIDA7CiAKLQlyYyA9IGxtdl9pbnRlbnRfcmVtb3RlKGV4cCwgbG1tLCBsbW1zaXplLCBpdCwgTlVMTCwgZmxhZ3MsIHJlcXAsCi0JCQkgICAgICAgY2JfYmxvY2tpbmcsIGV4dHJhX2xvY2tfZmxhZ3MpOworCS8qIE5vdCBjcm9zcy1yZWYgY2FzZSwganVzdCBnZXQgb3V0IG9mIGhlcmUuICovCisJaWYgKHVubGlrZWx5KChib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfTURTKSkpIHsKKwkJcmMgPSBsbXZfaW50ZW50X3JlbW90ZShleHAsIGl0LCBOVUxMLCByZXFwLCBjYl9ibG9ja2luZywKKwkJCQkgICAgICAgZXh0cmFfbG9ja19mbGFncyk7CisJCWlmIChyYyAhPSAwKQorCQkJcmV0dXJuIHJjOworCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpyZXFwKS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CisJCWlmICghYm9keSkKKwkJCXJldHVybiAtRVBST1RPOworCX0KIAogCXJldHVybiByYzsKIH0KIAogaW50IGxtdl9pbnRlbnRfbG9jayhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgIHZvaWQgKmxtbSwgaW50IGxtbXNpemUsIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKLQkJICAgIGludCBmbGFncywgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKKwkJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKIAkJICAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCiAJCSAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQogewpAQCAtMzAwLDggKzQ4Niw5IEBACiAKIAlMQVNTRVJUKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQxKSk7CiAKLQlDREVCVUcoRF9JTk9ERSwgIklOVEVOVCBMT0NLICclcycgZm9yICclKnMnIG9uICJERklEIlxuIiwKLQkgICAgICAgTExfSVQyU1RSKGl0KSwgb3BfZGF0YS0+b3BfbmFtZWxlbiwgb3BfZGF0YS0+b3BfbmFtZSwKKwlDREVCVUcoRF9JTk9ERSwgIklOVEVOVCBMT0NLICclcycgZm9yICJERklEIiAnJSpzJyBvbiAiREZJRCJcbiIsCisJICAgICAgIExMX0lUMlNUUihpdCksIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLAorCSAgICAgICAoaW50KW9wX2RhdGEtPm9wX25hbWVsZW4sIG9wX2RhdGEtPm9wX25hbWUsCiAJICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpKTsKIAogCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKQEAgLTMwOSwxNCArNDk2LDM0IEBACiAJCXJldHVybiByYzsKIAogCWlmIChpdC0+aXRfb3AgJiAoSVRfTE9PS1VQIHwgSVRfR0VUQVRUUiB8IElUX0xBWU9VVCkpCi0JCXJjID0gbG12X2ludGVudF9sb29rdXAoZXhwLCBvcF9kYXRhLCBsbW0sIGxtbXNpemUsIGl0LAotCQkJCSAgICAgICBmbGFncywgcmVxcCwgY2JfYmxvY2tpbmcsCisJCXJjID0gbG12X2ludGVudF9sb29rdXAoZXhwLCBvcF9kYXRhLCBpdCwgcmVxcCwgY2JfYmxvY2tpbmcsCiAJCQkJICAgICAgIGV4dHJhX2xvY2tfZmxhZ3MpOwogCWVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX09QRU4pCi0JCXJjID0gbG12X2ludGVudF9vcGVuKGV4cCwgb3BfZGF0YSwgbG1tLCBsbW1zaXplLCBpdCwKLQkJCQkgICAgIGZsYWdzLCByZXFwLCBjYl9ibG9ja2luZywKKwkJcmMgPSBsbXZfaW50ZW50X29wZW4oZXhwLCBvcF9kYXRhLCBpdCwgcmVxcCwgY2JfYmxvY2tpbmcsCiAJCQkJICAgICBleHRyYV9sb2NrX2ZsYWdzKTsKIAllbHNlCiAJCUxCVUcoKTsKKworCWlmIChyYyA8IDApIHsKKwkJc3RydWN0IGx1c3RyZV9oYW5kbGUgbG9ja19oYW5kbGU7CisKKwkJaWYgKGl0LT5pdF9sb2NrX21vZGUpIHsKKwkJCWxvY2tfaGFuZGxlLmNvb2tpZSA9IGl0LT5pdF9sb2NrX2hhbmRsZTsKKwkJCWxkbG1fbG9ja19kZWNyZWYoJmxvY2tfaGFuZGxlLCBpdC0+aXRfbG9ja19tb2RlKTsKKwkJfQorCisJCWl0LT5pdF9sb2NrX2hhbmRsZSA9IDA7CisJCWl0LT5pdF9sb2NrX21vZGUgPSAwOworCisJCWlmIChpdC0+aXRfcmVtb3RlX2xvY2tfbW9kZSkgeworCQkJbG9ja19oYW5kbGUuY29va2llID0gaXQtPml0X3JlbW90ZV9sb2NrX2hhbmRsZTsKKwkJCWxkbG1fbG9ja19kZWNyZWYoJmxvY2tfaGFuZGxlLAorCQkJCQkgaXQtPml0X3JlbW90ZV9sb2NrX21vZGUpOworCQl9CisKKwkJaXQtPml0X3JlbW90ZV9sb2NrX2hhbmRsZSA9IDA7CisJCWl0LT5pdF9yZW1vdGVfbG9ja19tb2RlID0gMDsKKwl9CisKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X2ludGVybmFsLmgKaW5kZXggMGJlYWZjNC4uNTJiMDM3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfaW50ZXJuYWwuaApAQCAtMzUsNiArMzUsNyBAQAogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lkbC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbG12LmgiCiAKICNkZWZpbmUgTE1WX01BWF9UR1RfQ09VTlQgMTI4CiAKQEAgLTQ0LDc3ICs0NSwxMTYgQEAKIGludCBsbXZfY2hlY2tfY29ubmVjdChzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkKTsKIAogaW50IGxtdl9pbnRlbnRfbG9jayhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgIHZvaWQgKmxtbSwgaW50IGxtbXNpemUsIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwKLQkJICAgIGludCBmbGFncywgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKKwkJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKIAkJICAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCiAJCSAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKTsKIAogaW50IGxtdl9mbGRfbG9va3VwKHN0cnVjdCBsbXZfb2JkICpsbXYsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwgdTMyICptZHMpOwogaW50IF9fbG12X2ZpZF9hbGxvYyhzdHJ1Y3QgbG12X29iZCAqbG12LCBzdHJ1Y3QgbHVfZmlkICpmaWQsIHUzMiBtZHMpOwotaW50IGxtdl9maWRfYWxsb2Moc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGx1X2ZpZCAqZmlkLAotCQkgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKK2ludCBsbXZfZmlkX2FsbG9jKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJICBzdHJ1Y3QgbHVfZmlkICpmaWQsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbG12X2dldF9tZWEoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCitpbnQgbG12X3VucGFja19tZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKmxzbXAsCisJCSAgY29uc3QgdW5pb24gbG12X21kc19tZCAqbG1tLCBpbnQgc3RyaXBlX2NvdW50KTsKKworaW50IGxtdl9yZXZhbGlkYXRlX3NsYXZlcyhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAorCQkJICBjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkJICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLAorCQkJICBpbnQgZXh0cmFfbG9ja19mbGFncyk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9iZF9kZXZpY2UgKmxtdjJvYmRfZGV2KHN0cnVjdCBsbXZfb2JkICpsbXYpCiB7Ci0Jc3RydWN0IG1kdF9ib2R5CSAqYm9keTsKLQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAgICAqbWVhOwotCi0JTEFTU0VSVChyZXEpOwotCi0JYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7Ci0KLQlpZiAoIWJvZHkgfHwgIVNfSVNESVIoYm9keS0+bW9kZSkgfHwgIWJvZHktPmVhZGF0YXNpemUpCi0JCXJldHVybiBOVUxMOwotCi0JbWVhID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9NRCwKLQkJCQkJICAgYm9keS0+ZWFkYXRhc2l6ZSk7Ci0JaWYgKG1lYS0+bWVhX2NvdW50ID09IDApCi0JCXJldHVybiBOVUxMOwotCWlmIChtZWEtPm1lYV9tYWdpYyAhPSBNRUFfTUFHSUNfTEFTVF9DSEFSICYmCi0JICAgIG1lYS0+bWVhX21hZ2ljICE9IE1FQV9NQUdJQ19BTExfQ0hBUlMgJiYKLQkgICAgbWVhLT5tZWFfbWFnaWMgIT0gTUVBX01BR0lDX0hBU0hfU0VHTUVOVCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gbWVhOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBsbXZfZ2V0X2Vhc2l6ZShzdHJ1Y3QgbG12X29iZCAqbG12KQotewotCXJldHVybiBzaXplb2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQpICsKLQkJbG12LT5kZXNjLmxkX3RndF9jb3VudCAqCi0JCXNpemVvZihzdHJ1Y3QgbHVfZmlkKTsKKwlyZXR1cm4gY29udGFpbmVyX29mMChsbXYsIHN0cnVjdCBvYmRfZGV2aWNlLCB1Lmxtdik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGxtdl90Z3RfZGVzYyAqCi1sbXZfZ2V0X3RhcmdldChzdHJ1Y3QgbG12X29iZCAqbG12LCB1MzIgbWRzKQorbG12X2dldF90YXJnZXQoc3RydWN0IGxtdl9vYmQgKmxtdiwgdTMyIG1kdF9pZHgsIGludCAqaW5kZXgpCiB7Ci0JaW50IGNvdW50ID0gbG12LT5kZXNjLmxkX3RndF9jb3VudDsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7IGkrKykgewogCQlpZiAoIWxtdi0+dGd0c1tpXSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChsbXYtPnRndHNbaV0tPmx0ZF9pZHggPT0gbWRzKQorCQlpZiAobG12LT50Z3RzW2ldLT5sdGRfaWR4ID09IG1kdF9pZHgpIHsKKwkJCWlmIChpbmRleCkKKwkJCQkqaW5kZXggPSBpOwogCQkJcmV0dXJuIGxtdi0+dGd0c1tpXTsKKwkJfQogCX0KIAogCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogfQogCitzdGF0aWMgaW5saW5lIGludAorbG12X2ZpbmRfdGFyZ2V0X2luZGV4KHN0cnVjdCBsbXZfb2JkICpsbXYsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKK3sKKwlzdHJ1Y3QgbG12X3RndF9kZXNjICpsdGQ7CisJdTMyIG1kdF9pZHggPSAwOworCWludCBpbmRleCA9IDA7CisKKwlpZiAobG12LT5kZXNjLmxkX3RndF9jb3VudCA+IDEpIHsKKwkJaW50IHJjOworCisJCXJjID0gbG12X2ZsZF9sb29rdXAobG12LCBmaWQsICZtZHRfaWR4KTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9CisKKwlsdGQgPSBsbXZfZ2V0X3RhcmdldChsbXYsIG1kdF9pZHgsICZpbmRleCk7CisJaWYgKElTX0VSUihsdGQpKQorCQlyZXR1cm4gUFRSX0VSUihsdGQpOworCisJcmV0dXJuIGluZGV4OworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBsbXZfdGd0X2Rlc2MgKgogbG12X2ZpbmRfdGFyZ2V0KHN0cnVjdCBsbXZfb2JkICpsbXYsIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCkKIHsKLQl1MzIgbWRzID0gMDsKLQlpbnQgcmM7CisJaW50IGluZGV4OwogCi0JaWYgKGxtdi0+ZGVzYy5sZF90Z3RfY291bnQgPiAxKSB7Ci0JCXJjID0gbG12X2ZsZF9sb29rdXAobG12LCBmaWQsICZtZHMpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gRVJSX1BUUihyYyk7Ci0JfQorCWluZGV4ID0gbG12X2ZpbmRfdGFyZ2V0X2luZGV4KGxtdiwgZmlkKTsKKwlpZiAoaW5kZXggPCAwKQorCQlyZXR1cm4gRVJSX1BUUihpbmRleCk7CiAKLQlyZXR1cm4gbG12X2dldF90YXJnZXQobG12LCBtZHMpOworCXJldHVybiBsbXYtPnRndHNbaW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIGludCBsbXZfc3RyaXBlX21kX3NpemUoaW50IHN0cmlwZV9jb3VudCkKK3sKKwlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtOworCisJcmV0dXJuIHNpemVvZigqbHNtKSArIHN0cmlwZV9jb3VudCAqIHNpemVvZihsc20tPmxzbV9tZF9vaW5mb1swXSk7Cit9CisKK2ludCBsbXZfbmFtZV90b19zdHJpcGVfaW5kZXgoZW51bSBsbXZfaGFzaF90eXBlIGhhc2h0eXBlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgbWF4X21kdF9pbmRleCwKKwkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBsbXZfb2luZm8gKgorbHNtX25hbWVfdG9fc3RyaXBlX2luZm8oY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCWludCBuYW1lbGVuKQoreworCWludCBzdHJpcGVfaW5kZXg7CisKKwlzdHJpcGVfaW5kZXggPSBsbXZfbmFtZV90b19zdHJpcGVfaW5kZXgobHNtLT5sc21fbWRfaGFzaF90eXBlLAorCQkJCQkJbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50LAorCQkJCQkJbmFtZSwgbmFtZWxlbik7CisJaWYgKHN0cmlwZV9pbmRleCA8IDApCisJCXJldHVybiBFUlJfUFRSKHN0cmlwZV9pbmRleCk7CisKKwlMQVNTRVJURihzdHJpcGVfaW5kZXggPCBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQsCisJCSAic3RyaXBlX2luZGV4ID0gJWQsIHN0cmlwZV9jb3VudCA9ICVkIGhhc2hfdHlwZSA9ICV4IG5hbWUgPSAlLipzXG4iLAorCQkgc3RyaXBlX2luZGV4LCBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQsCisJCSBsc20tPmxzbV9tZF9oYXNoX3R5cGUsIG5hbWVsZW4sIG5hbWUpOworCisJcmV0dXJuICZsc20tPmxzbV9tZF9vaW5mb1tzdHJpcGVfaW5kZXhdOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbG12X25lZWRfdHJ5X2FsbF9zdHJpcGVzKGNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20pCit7CisJcmV0dXJuICFsbXZfaXNfa25vd25faGFzaF90eXBlKGxzbS0+bHNtX21kX2hhc2hfdHlwZSkgfHwKKwkgICAgICAgbHNtLT5sc21fbWRfaGFzaF90eXBlICYgTE1WX0hBU0hfRkxBR19NSUdSQVRJT047CiB9CiAKIHN0cnVjdCBsbXZfdGd0X2Rlc2MKQEAgLTEyMyw2ICsxNjMsNiBAQAogLyogbHByb2NfbG12LmMgKi8KIHZvaWQgbHByb2Nmc19sbXZfaW5pdF92YXJzKHN0cnVjdCBscHJvY2ZzX3N0YXRpY192YXJzICpsdmFycyk7CiAKLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxtdl9wcm9jX3RhcmdldF9mb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbG12X3Byb2NfdGFyZ2V0X2ZvcHM7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfb2JkLmMKaW5kZXggMGUxNTg4YS4uN2RiYjJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X29iZC5jCkBAIC00MywxMiArNDMsMTMgQEAKIAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGliLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbmV0LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfY2xhc3MuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9sbXYuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCi0jaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvY2xfb2JqZWN0LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZmlkLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfa2VybmVsY29tbS5oIgogI2luY2x1ZGUgImxtdl9pbnRlcm5hbC5oIgogCkBAIC03MCwxMiArNzEsMTIgQEAKICAqICAtRU5PVENPTk46IFRoZSBVVUlEIGlzIGZvdW5kLCBidXQgdGhlIHRhcmdldCBjb25uZWN0aW9uIGlzIGJhZCAoISkKICAqICAtRUJBREYgICA6IFRoZSBVVUlEIGlzIGZvdW5kLCBidXQgdGhlIE9CRCBvZiB0aGUgd3JvbmcgdHlwZSAoISkKICAqLwotc3RhdGljIGludCBsbXZfc2V0X21kY19hY3RpdmUoc3RydWN0IGxtdl9vYmQgKmxtdiwgc3RydWN0IG9iZF91dWlkICp1dWlkLAorc3RhdGljIGludCBsbXZfc2V0X21kY19hY3RpdmUoc3RydWN0IGxtdl9vYmQgKmxtdiwgY29uc3Qgc3RydWN0IG9iZF91dWlkICp1dWlkLAogCQkJICAgICAgaW50IGFjdGl2YXRlKQogewogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgICAgKnVuaW5pdGlhbGl6ZWRfdmFyKHRndCk7CiAJc3RydWN0IG9iZF9kZXZpY2UgICAgICAqb2JkOwotCWludAkJICAgICBpOworCXUzMgkJICAgICBpOwogCWludAkJICAgICByYyA9IDA7CiAKIAlDREVCVUcoRF9JTkZPLCAiU2VhcmNoaW5nIGluIGxtdiAlcCBmb3IgdXVpZCAlcyAoYWN0aXZhdGU9JWQpXG4iLApAQCAtMjQ0LDM2ICsyNDUsMTIgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGxtdl9zZXRfdGltZW91dHMoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCkKLXsKLQlzdHJ1Y3QgbG12X29iZAkqbG12OwotCWludAkJICAgIGk7Ci0KLQlsbXYgPSAmb2JkLT51LmxtdjsKLQlpZiAobG12LT5zZXJ2ZXJfdGltZW91dCA9PSAwKQotCQlyZXR1cm47Ci0KLQlpZiAobG12LT5jb25uZWN0ZWQgPT0gMCkKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7IGkrKykgewotCQlzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3QgPSBsbXYtPnRndHNbaV07Ci0KLQkJdGd0ID0gbG12LT50Z3RzW2ldOwotCQlpZiAoIXRndCB8fCAhdGd0LT5sdGRfZXhwIHx8ICF0Z3QtPmx0ZF9hY3RpdmUpCi0JCQljb250aW51ZTsKLQotCQlvYmRfc2V0X2luZm9fYXN5bmMoTlVMTCwgdGd0LT5sdGRfZXhwLCBzaXplb2YoS0VZX0lOVEVSTURTKSwKLQkJCQkgICBLRVlfSU5URVJNRFMsIDAsIE5VTEwsIE5VTEwpOwotCX0KLX0KLQotc3RhdGljIGludCBsbXZfaW5pdF9lYV9zaXplKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGludCBlYXNpemUsCi0JCQkgICAgaW50IGRlZl9lYXNpemUsIGludCBjb29raWVzaXplLCBpbnQgZGVmX2Nvb2tpZXNpemUpCitzdGF0aWMgaW50IGxtdl9pbml0X2VhX3NpemUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgdTMyIGVhc2l6ZSwgdTMyIGRlZl9lYXNpemUsCisJCQkgICAgdTMyIGNvb2tpZXNpemUsIHUzMiBkZWZfY29va2llc2l6ZSkKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQgICAgICAqbG12ID0gJm9iZC0+dS5sbXY7Ci0JaW50CQkgIGk7CisJdTMyIGk7CiAJaW50CQkgIHJjID0gMDsKIAlpbnQJCSAgY2hhbmdlID0gMDsKIApAQCAtNDIwLDYgKzM5Nyw3IEBACiB7CiAJc3RydWN0IGxtdl9vYmQgICAgICAqbG12ID0gJm9iZC0+dS5sbXY7CiAJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0OworCWludCBvcmlnX3RndF9jb3VudCA9IDA7CiAJaW50CQkgIHJjID0gMDsKIAogCUNERUJVRyhEX0NPTkZJRywgIlRhcmdldCB1dWlkOiAlcy4gaW5kZXggJWRcbiIsIHV1aWRwLT51dWlkLCBpbmRleCk7CkBAIC00ODksMTQgKzQ2NywxNyBAQAogCXRndC0+bHRkX3V1aWQgPSAqdXVpZHA7CiAJdGd0LT5sdGRfYWN0aXZlID0gMDsKIAlsbXYtPnRndHNbaW5kZXhdID0gdGd0OwotCWlmIChpbmRleCA+PSBsbXYtPmRlc2MubGRfdGd0X2NvdW50KQorCWlmIChpbmRleCA+PSBsbXYtPmRlc2MubGRfdGd0X2NvdW50KSB7CisJCW9yaWdfdGd0X2NvdW50ID0gbG12LT5kZXNjLmxkX3RndF9jb3VudDsKIAkJbG12LT5kZXNjLmxkX3RndF9jb3VudCA9IGluZGV4ICsgMTsKKwl9CiAKIAlpZiAobG12LT5jb25uZWN0ZWQpIHsKIAkJcmMgPSBsbXZfY29ubmVjdF9tZGMob2JkLCB0Z3QpOwogCQlpZiAocmMpIHsKIAkJCXNwaW5fbG9jaygmbG12LT5sbXZfbG9jayk7Ci0JCQlsbXYtPmRlc2MubGRfdGd0X2NvdW50LS07CisJCQlpZiAobG12LT5kZXNjLmxkX3RndF9jb3VudCA9PSBpbmRleCArIDEpCisJCQkJbG12LT5kZXNjLmxkX3RndF9jb3VudCA9IG9yaWdfdGd0X2NvdW50OwogCQkJbWVtc2V0KHRndCwgMCwgc2l6ZW9mKCp0Z3QpKTsKIAkJCXNwaW5fdW5sb2NrKCZsbXYtPmxtdl9sb2NrKTsKIAkJfSBlbHNlIHsKQEAgLTUxNCw3ICs0OTUsNyBAQAogewogCXN0cnVjdCBsbXZfb2JkICAgICAgICpsbXYgPSAmb2JkLT51LmxtdjsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICAqdGd0OwotCWludAkJICAgaTsKKwl1MzIgaTsKIAlpbnQJCSAgIHJjOwogCWludAkJICAgZWFzaXplOwogCkBAIC01NTQsMTAgKzUzNSw5IEBACiAJCQlnb3RvIG91dF9kaXNjOwogCX0KIAotCWxtdl9zZXRfdGltZW91dHMob2JkKTsKIAljbGFzc19leHBvcnRfcHV0KGxtdi0+ZXhwKTsKIAlsbXYtPmNvbm5lY3RlZCA9IDE7Ci0JZWFzaXplID0gbG12X2dldF9lYXNpemUobG12KTsKKwllYXNpemUgPSBsbXZfbWRzX21kX3NpemUobG12LT5kZXNjLmxkX3RndF9jb3VudCwgTE1WX01BR0lDKTsKIAlsbXZfaW5pdF9lYV9zaXplKG9iZC0+b2JkX3NlbGZfZXhwb3J0LCBlYXNpemUsIDAsIDAsIDApOwogCW11dGV4X3VubG9jaygmbG12LT5sbXZfaW5pdF9tdXRleCk7CiAJcmV0dXJuIDA7CkBAIC02MjksNyArNjA5LDcgQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgKm9iZCA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKIAlzdHJ1Y3QgbG12X29iZAkqbG12ID0gJm9iZC0+dS5sbXY7CiAJaW50CQkgICAgcmM7Ci0JaW50CQkgICAgaTsKKwl1MzIgaTsKIAogCWlmICghbG12LT50Z3RzKQogCQlnb3RvIG91dF9sb2NhbDsKQEAgLTc1OCw3ICs3MzgsNyBAQAogCQkJICAgICBjb25zdCBzdHJ1Y3QgaHNtX3VzZXJfcmVxdWVzdCAqaHVyLAogCQkJICAgICBjb25zdCBzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3RfbWRzKQogewotCWludAkJCWksIG5yID0gMDsKKwl1MzIgaSwgbnIgPSAwOwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgICAgKmN1cnJfdGd0OwogCiAJLyogY291bnQgaG93IG1hbnkgcmVxdWVzdHMgbXVzdCBiZSBzZW50IHRvIHRoZSBnaXZlbiB0YXJnZXQgKi8KQEAgLTg4NSwxMCArODY1LDggQEAKIAogCXJjID0gbGliY2ZzX2trdWNfZ3JvdXBfYWRkKGZpbHAsIGxrLT5sa191aWQsIGxrLT5sa19ncm91cCwKIAkJCQkgICAma2NkLCBzaXplb2Yoa2NkKSk7Ci0JaWYgKHJjKSB7Ci0JCWlmIChmaWxwKQotCQkJZnB1dChmaWxwKTsKLQl9CisJaWYgKHJjKQorCQlmcHV0KGZpbHApOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtODk5LDEwICs4NzcsMTAgQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAqb2JkZGV2ID0gY2xhc3NfZXhwMm9iZChleHApOwogCXN0cnVjdCBsbXZfb2JkICAgICAgICpsbXYgPSAmb2JkZGV2LT51LmxtdjsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3QgPSBOVUxMOwotCWludAkJICAgaSA9IDA7CisJdTMyIGkgPSAwOwogCWludAkJICAgcmMgPSAwOwogCWludAkJICAgc2V0ID0gMDsKLQlpbnQJCSAgIGNvdW50ID0gbG12LT5kZXNjLmxkX3RndF9jb3VudDsKKwl1MzIgY291bnQgPSBsbXYtPmRlc2MubGRfdGd0X2NvdW50OwogCiAJaWYgKGNvdW50ID09IDApCiAJCXJldHVybiAtRU5PVFRZOwpAQCAtMTAxMSw2ICs5ODksMjEgQEAKIAkJcmMgPSBvYmRfaW9jb250cm9sKGNtZCwgdGd0LT5sdGRfZXhwLCBsZW4sIGthcmcsIHVhcmcpOwogCQlicmVhazsKIAl9CisJY2FzZSBMTF9JT0NfRklEMk1EVElEWDogeworCQlzdHJ1Y3QgbHVfZmlkICpmaWQgPSBrYXJnOworCQlpbnQgbWR0X2luZGV4OworCisJCXJjID0gbG12X2ZsZF9sb29rdXAobG12LCBmaWQsICZtZHRfaW5kZXgpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyoKKwkJICogTm90ZTogdGhpcyBpcyBmcm9tIGxsaXRlKHNlZSBsbF9kaXJfaW9jdGwoKSksIEB1YXJnIGRvZXMgbm90CisJCSAqIHBvaW50IHRvIHVzZXIgc3BhY2UgbWVtb3J5IGZvciBGSUQyTURUSURYLgorCQkgKi8KKwkJKihfX3UzMiAqKXVhcmcgPSBtZHRfaW5kZXg7CisJCWJyZWFrOworCX0KIAljYXNlIE9CRF9JT0NfRklEMlBBVEg6IHsKIAkJcmMgPSBsbXZfZmlkMnBhdGgoZXhwLCBsZW4sIGthcmcsIHVhcmcpOwogCQlicmVhazsKQEAgLTExNjksMzIgKzExNjIsMzcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJaWYgKG9wX2RhdGEtPm9wX2RlZmF1bHRfc3RyaXBlX29mZnNldCAhPSAtMSkgeworCQkqbWRzID0gb3BfZGF0YS0+b3BfZGVmYXVsdF9zdHJpcGVfb2Zmc2V0OworCQlyZXR1cm4gMDsKKwl9CisKIAkvKioKIAkgKiBJZiBzdHJpcGVfb2Zmc2V0IGlzIHByb3ZpZGVkIGR1cmluZyBzZXRkaXJzdHJpcGUKIAkgKiAoc2V0ZGlyc3RyaXBlIC1pIHh4KSwgeHggTURTIHdpbGwgYmUgY2hvc2VuLgogCSAqLwotCWlmIChvcF9kYXRhLT5vcF9jbGlfZmxhZ3MgJiBDTElfU0VUX01FQSkgeworCWlmIChvcF9kYXRhLT5vcF9jbGlfZmxhZ3MgJiBDTElfU0VUX01FQSAmJiBvcF9kYXRhLT5vcF9kYXRhKSB7CiAJCXN0cnVjdCBsbXZfdXNlcl9tZCAqbHVtOwogCi0JCWx1bSA9IChzdHJ1Y3QgbG12X3VzZXJfbWQgKilvcF9kYXRhLT5vcF9kYXRhOwotCQlpZiAobHVtLT5sdW1fdHlwZSA9PSBMTVZfU1RSSVBFX1RZUEUgJiYKLQkJICAgIGx1bS0+bHVtX3N0cmlwZV9vZmZzZXQgIT0gLTEpIHsKLQkJCWlmIChsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0ID49IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQpIHsKLQkJCQlDRVJST1IoIiVzOiBTdHJpcGVfb2Zmc2V0ICVkID4gTURUIGNvdW50ICVkOiByYyA9ICVkXG4iLAotCQkJCSAgICAgICBvYmQtPm9iZF9uYW1lLAotCQkJCSAgICAgICBsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0LAotCQkJCSAgICAgICBsbXYtPmRlc2MubGRfdGd0X2NvdW50LCAtRVJBTkdFKTsKLQkJCQlyZXR1cm4gLUVSQU5HRTsKLQkJCX0KLQkJCSptZHMgPSBsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0OwotCQkJcmV0dXJuIDA7CisJCWx1bSA9IG9wX2RhdGEtPm9wX2RhdGE7CisJCWlmIChsZTMyX3RvX2NwdShsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0KSAhPSAoX191MzIpLTEpIHsKKwkJCSptZHMgPSBsZTMyX3RvX2NwdShsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0KTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiAtMSBtZWFucyBkZWZhdWx0LCB3aGljaCB3aWxsIGJlIGluIHRoZSBzYW1lIE1EVCB3aXRoCisJCQkgKiB0aGUgc3RyaXBlCisJCQkgKi8KKwkJCSptZHMgPSBvcF9kYXRhLT5vcF9tZHM7CisJCQlsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0ID0gY3B1X3RvX2xlMzIob3BfZGF0YS0+b3BfbWRzKTsKIAkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIG5ldyBmaWQgb24gdGFyZ2V0IGFjY29yZGluZyB0byBvcGVyYXRpb24gdHlwZSBhbmQKKwkJICogcGFyZW50IGhvbWUgbWRzLgorCQkgKi8KKwkJKm1kcyA9IG9wX2RhdGEtPm9wX21kczsKIAl9CiAKLQkvKiBBbGxvY2F0ZSBuZXcgZmlkIG9uIHRhcmdldCBhY2NvcmRpbmcgdG8gb3BlcmF0aW9uIHR5cGUgYW5kIHBhcmVudAotCSAqIGhvbWUgbWRzLgotCSAqLwotCSptZHMgPSBvcF9kYXRhLT5vcF9tZHM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyMDMsNyArMTIwMSw3IEBACiAJc3RydWN0IGxtdl90Z3RfZGVzYwkqdGd0OwogCWludAkJCSByYzsKIAotCXRndCA9IGxtdl9nZXRfdGFyZ2V0KGxtdiwgbWRzKTsKKwl0Z3QgPSBsbXZfZ2V0X3RhcmdldChsbXYsIG1kcywgTlVMTCk7CiAJaWYgKElTX0VSUih0Z3QpKQogCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwogCkBAIC0xMjIxLDcgKzEyMTksNyBAQAogCS8qCiAJICogQXNraW5nIHVuZGVybGF5aW5nIHRndCBsYXllciB0byBhbGxvY2F0ZSBuZXcgZmlkLgogCSAqLwotCXJjID0gb2JkX2ZpZF9hbGxvYyh0Z3QtPmx0ZF9leHAsIGZpZCwgTlVMTCk7CisJcmMgPSBvYmRfZmlkX2FsbG9jKE5VTEwsIHRndC0+bHRkX2V4cCwgZmlkLCBOVUxMKTsKIAlpZiAocmMgPiAwKSB7CiAJCUxBU1NFUlQoZmlkX2lzX3NhbmUoZmlkKSk7CiAJCXJjID0gMDsKQEAgLTEyMzIsOCArMTIzMCw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1pbnQgbG12X2ZpZF9hbGxvYyhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEpCitpbnQgbG12X2ZpZF9hbGxvYyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCSAgc3RydWN0IGx1X2ZpZCAqZmlkLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSkKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgKm9iZCA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKIAlzdHJ1Y3QgbG12X29iZAkqbG12ID0gJm9iZC0+dS5sbXY7CkBAIC0xMjc4LDEwICsxMjc2LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWxtdi0+dGd0cyA9IGtjYWxsb2MoMzIsIHNpemVvZigqbG12LT50Z3RzKSwgR0ZQX05PRlMpOworCWxtdi0+dGd0c19zaXplID0gMzJVOworCWxtdi0+dGd0cyA9IGtjYWxsb2MobG12LT50Z3RzX3NpemUsIHNpemVvZigqbG12LT50Z3RzKSwgR0ZQX05PRlMpOwogCWlmICghbG12LT50Z3RzKQogCQlyZXR1cm4gLUVOT01FTTsKLQlsbXYtPnRndHNfc2l6ZSA9IDMyOwogCiAJb2JkX3N0cjJ1dWlkKCZsbXYtPmRlc2MubGRfdXVpZCwgZGVzYy0+bGRfdXVpZC51dWlkKTsKIAlsbXYtPmRlc2MubGRfdGd0X2NvdW50ID0gMDsKQEAgLTEzNTQsNyArMTM1Miw3IEBACiAKIAkJb2JkX3N0cjJ1dWlkKCZvYmRfdXVpZCwgIGx1c3RyZV9jZmdfYnVmKGxjZmcsIDEpKTsKIAotCQlpZiAoc3NjYW5mKGx1c3RyZV9jZmdfYnVmKGxjZmcsIDIpLCAiJWQiLCAmaW5kZXgpICE9IDEpIHsKKwkJaWYgKHNzY2FuZihsdXN0cmVfY2ZnX2J1ZihsY2ZnLCAyKSwgIiV1IiwgJmluZGV4KSAhPSAxKSB7CiAJCQlyYyA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTM4MCw3ICsxMzc4LDcgQEAKIAlzdHJ1Y3QgbG12X29iZAkqbG12ID0gJm9iZC0+dS5sbXY7CiAJc3RydWN0IG9iZF9zdGF0ZnMgICAgICp0ZW1wOwogCWludAkJICAgIHJjID0gMDsKLQlpbnQJCSAgICBpOworCXUzMiBpOwogCiAJcmMgPSBsbXZfY2hlY2tfY29ubmVjdChvYmQpOwogCWlmIChyYykKQEAgLTE1MjIsNyArMTUyMCw3IEBACiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgICAqb2JkID0gZXhwLT5leHBfb2JkOwogCXN0cnVjdCBsbXZfb2JkICAgICAgKmxtdiA9ICZvYmQtPnUubG12OwotCWludAkJICBpOworCXUzMiBpOwogCWludAkJICByYzsKIAogCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKQEAgLTE1NDUsMzYgKzE1NDMsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxtdl9maW5kX2NiZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCQkgICBsZGxtX2l0ZXJhdG9yX3QgaXQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG9iZF9kZXZpY2UgICAqb2JkID0gZXhwLT5leHBfb2JkOwotCXN0cnVjdCBsbXZfb2JkICAgICAgKmxtdiA9ICZvYmQtPnUubG12OwotCWludAkJICBpOwotCWludAkJICByYzsKLQotCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCUNERUJVRyhEX0lOT0RFLCAiQ0JEQVRBIGZvciAiREZJRCJcbiIsIFBGSUQoZmlkKSk7Ci0KLQkvKgotCSAqIFdpdGggRE5FIGV2ZXJ5IG9iamVjdCBjYW4gaGF2ZSB0d28gbG9ja3MgaW4gZGlmZmVyZW50IG5hbWVzcGFjZXM6Ci0JICogbG9va3VwIGxvY2sgaW4gc3BhY2Ugb2YgTURUIHN0b3JpbmcgZGlyZW50cnkgYW5kIHVwZGF0ZS9vcGVuIGxvY2sgaW4KLQkgKiBzcGFjZSBvZiBNRFQgc3RvcmluZyBpbm9kZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbG12LT5kZXNjLmxkX3RndF9jb3VudDsgaSsrKSB7Ci0JCWlmICghbG12LT50Z3RzW2ldIHx8ICFsbXYtPnRndHNbaV0tPmx0ZF9leHApCi0JCQljb250aW51ZTsKLQkJcmMgPSBtZF9maW5kX2NiZGF0YShsbXYtPnRndHNbaV0tPmx0ZF9leHAsIGZpZCwgaXQsIGRhdGEpOwotCQlpZiAocmMpCi0JCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IGxtdl9jbG9zZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKIAkJICAgICBzdHJ1Y3QgbWRfb3Blbl9kYXRhICptb2QsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCiB7CkBAIC0xNTk2LDI1ICsxNTY0LDExNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RydWN0IGxtdl90Z3RfZGVzYwotKmxtdl9sb2NhdGVfbWRzKHN0cnVjdCBsbXZfb2JkICpsbXYsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQlzdHJ1Y3QgbHVfZmlkICpmaWQpCisvKioKKyAqIENob29zaW5nIHRoZSBNRFQgYnkgbmFtZSBvciBGSUQgaW4gQG9wX2RhdGEuCisgKiBGb3Igbm9uLXN0cmlwZWQgZGlyZWN0b3J5LCBpdCB3aWxsIGxvY2F0ZSBNRFQgYnkgZmlkLgorICogRm9yIHN0cmlwZWQtZGlyZWN0b3J5LCBpdCB3aWxsIGxvY2F0ZSBNRFQgYnkgbmFtZS4gQW5kIGFsc28KKyAqIGl0IHdpbGwgcmVzZXQgb3BfZmlkMSB3aXRoIHRoZSBGSUQgb2YgdGhlIGNob3NlbiBzdHJpcGUuCisgKiovCitzdGF0aWMgc3RydWN0IGxtdl90Z3RfZGVzYyAqCitsbXZfbG9jYXRlX3RhcmdldF9mb3JfbmFtZShzdHJ1Y3QgbG12X29iZCAqbG12LCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVjdCBsdV9maWQgKmZpZCwKKwkJCSAgIHUzMiAqbWRzKQogeworCWNvbnN0IHN0cnVjdCBsbXZfb2luZm8gKm9pbmZvOwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndDsKIAotCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsIGZpZCk7Ci0JaWYgKElTX0VSUih0Z3QpKQotCQlyZXR1cm4gdGd0OworCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRlNDS19CQURfTkFNRV9IQVNIKSkgeworCQlpZiAoY2ZzX2ZhaWxfdmFsID49IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCkKKwkJCXJldHVybiBFUlJfUFRSKC1FQkFERik7CisJCW9pbmZvID0gJmxzbS0+bHNtX21kX29pbmZvW2Nmc19mYWlsX3ZhbF07CisJfSBlbHNlIHsKKwkJb2luZm8gPSBsc21fbmFtZV90b19zdHJpcGVfaW5mbyhsc20sIG5hbWUsIG5hbWVsZW4pOworCQlpZiAoSVNfRVJSKG9pbmZvKSkKKwkJCXJldHVybiBFUlJfQ0FTVChvaW5mbyk7CisJfQogCi0Jb3BfZGF0YS0+b3BfbWRzID0gdGd0LT5sdGRfaWR4OworCWlmIChmaWQpCisJCSpmaWQgPSBvaW5mby0+bG1vX2ZpZDsKKwlpZiAobWRzKQorCQkqbWRzID0gb2luZm8tPmxtb19tZHM7CiAKKwl0Z3QgPSBsbXZfZ2V0X3RhcmdldChsbXYsIG9pbmZvLT5sbW9fbWRzLCBOVUxMKTsKKworCUNERUJVRyhEX0lORk8sICJsb2NhdGUgb24gbWRzICV1ICIgREZJRCAiXG4iLCBvaW5mby0+bG1vX21kcywKKwkgICAgICAgUEZJRCgmb2luZm8tPmxtb19maWQpKTsKIAlyZXR1cm4gdGd0OwogfQogCisvKioKKyAqIExvY2F0ZSBtZHMgYnkgZmlkIG9yIG5hbWUKKyAqCisgKiBGb3Igc3RyaXBlZCBkaXJlY3RvcnkgKGxzbSAhPSBOVUxMKSwgaXQgd2lsbCBsb2NhdGUgdGhlIHN0cmlwZQorICogYnkgbmFtZSBoYXNoIChzZWUgbHNtX25hbWVfdG9fc3RyaXBlX2luZm8oKSkuIE5vdGU6IGlmIHRoZSBoYXNoX3R5cGUKKyAqIGlzIHVua25vd24sIGl0IHdpbGwgcmV0dXJuIC1FQkFERkQsIGFuZCBsbXZfaW50ZW50X2xvb2t1cCBtaWdodCBuZWVkCisgKiB3YWxrIHRocm91Z2ggYWxsIG9mIHN0cmlwZXMgdG8gbG9jYXRlIHRoZSBlbnRyeS4KKyAqCisgKiBGb3Igbm9ybWFsIGRpcmVjb3RyeSwgaXQgd2lsbCBsb2NhdGUgTURTIGJ5IEZJRCBkaXJlY3RseS4KKyAqIFxwYXJhbVtpbl0gbG12CUxNViBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gb3BfZGF0YQljbGllbnQgTUQgc3RhY2sgcGFyYW1ldGVycywgbmFtZSwgbmFtZWxlbgorICoJCQltZHNfbnVtIGV0Yy4KKyAqIFxwYXJhbVtpbl0gZmlkCW9iamVjdCBGSUQgdXNlZCB0byBsb2NhdGUgTURTLgorICoKKyAqIHJldHZhbAkJcG9pbnRlciB0byB0aGUgbG12X3RndF9kZXNjIGlmIHN1Y2NlZWQuCisgKgkJCUVSUl9QVFIoZXJybm8pIGlmIGZhaWxlZC4KKyAqLworc3RydWN0IGxtdl90Z3RfZGVzYyoKK2xtdl9sb2NhdGVfbWRzKHN0cnVjdCBsbXZfb2JkICpsbXYsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCSAgICAgICBzdHJ1Y3QgbHVfZmlkICpmaWQpCit7CisJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG9wX2RhdGEtPm9wX21lYTE7CisJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0OworCisJLyoKKwkgKiBEdXJpbmcgY3JlYXRpbmcgVk9MQVRJTEUgZmlsZSwgaXQgc2hvdWxkIGhvbm9yIHRoZSBtZHQKKwkgKiBpbmRleCBpZiB0aGUgZmlsZSB1bmRlciBzdHJpcGVkIGRpciBpcyBiZWluZyByZXN0b3JlZCwgc2VlCisJICogY3RfcmVzdG9yZSgpLgorCSAqLworCWlmIChvcF9kYXRhLT5vcF9iaWFzICYgTURTX0NSRUFURV9WT0xBVElMRSAmJgorCSAgICAoaW50KW9wX2RhdGEtPm9wX21kcyAhPSAtMSAmJiBsc20pIHsKKwkJaW50IGk7CisKKwkJdGd0ID0gbG12X2dldF90YXJnZXQobG12LCBvcF9kYXRhLT5vcF9tZHMsIE5VTEwpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gdGd0OworCisJCS8qIHJlZmlsbCB0aGUgcmlnaHQgcGFyZW50IGZpZCAqLworCQlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50OyBpKyspIHsKKwkJCXN0cnVjdCBsbXZfb2luZm8gKm9pbmZvOworCisJCQlvaW5mbyA9ICZsc20tPmxzbV9tZF9vaW5mb1tpXTsKKwkJCWlmIChvaW5mby0+bG1vX21kcyA9PSBvcF9kYXRhLT5vcF9tZHMpIHsKKwkJCQkqZmlkID0gb2luZm8tPmxtb19maWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBIbW0sIGNhbiBub3QgZmluZCB0aGUgc3RyaXBlIGJ5IG1kdF9pbmRleChvcF9tZHMpICovCisJCWlmIChpID09IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCkKKwkJCXRndCA9IEVSUl9QVFIoLUVJTlZBTCk7CisKKwkJcmV0dXJuIHRndDsKKwl9CisKKwlpZiAoIWxzbSB8fCAhb3BfZGF0YS0+b3BfbmFtZWxlbikgeworCQl0Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCBmaWQpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gdGd0OworCisJCW9wX2RhdGEtPm9wX21kcyA9IHRndC0+bHRkX2lkeDsKKworCQlyZXR1cm4gdGd0OworCX0KKworCXJldHVybiBsbXZfbG9jYXRlX3RhcmdldF9mb3JfbmFtZShsbXYsIGxzbSwgb3BfZGF0YS0+b3BfbmFtZSwKKwkJCQkJICBvcF9kYXRhLT5vcF9uYW1lbGVuLCBmaWQsCisJCQkJCSAgJm9wX2RhdGEtPm9wX21kcyk7Cit9CisKIHN0YXRpYyBpbnQgbG12X2NyZWF0ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFsZW4sIGludCBtb2RlLCBfX3UzMiB1aWQsCi0JCSAgICAgIF9fdTMyIGdpZCwgY2ZzX2NhcF90IGNhcF9lZmZlY3RpdmUsIF9fdTY0IHJkZXYsCi0JCSAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCisJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCB1bW9kZV90IG1vZGUsCisJCSAgICAgIHVpZF90IHVpZCwgZ2lkX3QgZ2lkLCBjZnNfY2FwX3QgY2FwX2VmZmVjdGl2ZSwKKwkJICAgICAgX191NjQgcmRldiwgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgICAqb2JkID0gZXhwLT5leHBfb2JkOwogCXN0cnVjdCBsbXZfb2JkCSAgKmxtdiA9ICZvYmQtPnUubG12OwpAQCAtMTYzMiwxMyArMTY5MSwzMCBAQAogCWlmIChJU19FUlIodGd0KSkKIAkJcmV0dXJuIFBUUl9FUlIodGd0KTsKIAotCXJjID0gbG12X2ZpZF9hbGxvYyhleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKKwlDREVCVUcoRF9JTk9ERSwgIkNSRUFURSBuYW1lICclLipzJyBvbiAiREZJRCIgLT4gbWRzICMleFxuIiwKKwkgICAgICAgKGludClvcF9kYXRhLT5vcF9uYW1lbGVuLCBvcF9kYXRhLT5vcF9uYW1lLAorCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgb3BfZGF0YS0+b3BfbWRzKTsKKworCXJjID0gbG12X2ZpZF9hbGxvYyhOVUxMLCBleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCUNERUJVRyhEX0lOT0RFLCAiQ1JFQVRFICclKnMnIG9uICJERklEIiAtPiBtZHMgIyV4XG4iLAotCSAgICAgICBvcF9kYXRhLT5vcF9uYW1lbGVuLCBvcF9kYXRhLT5vcF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKLQkgICAgICAgb3BfZGF0YS0+b3BfbWRzKTsKKwlpZiAoZXhwX2Nvbm5lY3RfZmxhZ3MoZXhwKSAmIE9CRF9DT05ORUNUX0RJUl9TVFJJUEUpIHsKKwkJLyoKKwkJICogU2VuZCB0aGUgY3JlYXRlIHJlcXVlc3QgdG8gdGhlIE1EVCB3aGVyZSB0aGUgb2JqZWN0CisJCSAqIHdpbGwgYmUgbG9jYXRlZAorCQkgKi8KKwkJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJm9wX2RhdGEtPm9wX2ZpZDIpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCisJCW9wX2RhdGEtPm9wX21kcyA9IHRndC0+bHRkX2lkeDsKKwl9IGVsc2UgeworCQlDREVCVUcoRF9DT05GSUcsICJTZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHN0cmlwZWQgZGlyc1xuIik7CisJfQorCisJQ0RFQlVHKERfSU5PREUsICJDUkVBVEUgb2JqICJERklEIiAtPiBtZHMgIyV4XG4iLAorCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgb3BfZGF0YS0+b3BfbWRzKTsKIAogCW9wX2RhdGEtPm9wX2ZsYWdzIHw9IE1GX01EQ19DQU5DRUxfRklEMTsKIAlyYyA9IG1kX2NyZWF0ZSh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGRhdGEsIGRhdGFsZW4sIG1vZGUsIHVpZCwgZ2lkLApAQCAtMTY3NCw3MCArMTc1MCwxMCBAQAogfQogCiBzdGF0aWMgaW50Ci1sbXZfZW5xdWV1ZV9yZW1vdGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICplaW5mbywKLQkJICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toLCB2b2lkICpsbW0sIGludCBsbW1zaXplLAotCQkgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQotewotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAgICAgICpyZXEgPSBpdC0+aXRfcmVxdWVzdDsKLQlzdHJ1Y3Qgb2JkX2RldmljZQkgICpvYmQgPSBleHAtPmV4cF9vYmQ7Ci0Jc3RydWN0IGxtdl9vYmQJICAgICAqbG12ID0gJm9iZC0+dS5sbXY7Ci0Jc3RydWN0IGx1c3RyZV9oYW5kbGUJcGxvY2s7Ci0Jc3RydWN0IGxtdl90Z3RfZGVzYwkqdGd0OwotCXN0cnVjdCBtZF9vcF9kYXRhCSAgKnJkYXRhOwotCXN0cnVjdCBsdV9maWQJICAgICAgIGZpZDE7Ci0Jc3RydWN0IG1kdF9ib2R5CSAgICAqYm9keTsKLQlpbnQJCQkgcmMgPSAwOwotCWludAkJCSBwbW9kZTsKLQotCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTURUX0JPRFkpOwotCi0JaWYgKCEoYm9keS0+dmFsaWQgJiBPQkRfTURfTURTKSkKLQkJcmV0dXJuIDA7Ci0KLQlDREVCVUcoRF9JTk9ERSwgIlJFTU9URV9FTlFVRVVFICclcycgb24gIkRGSUQiIC0+ICJERklEIlxuIiwKLQkgICAgICAgTExfSVQyU1RSKGl0KSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIFBGSUQoJmJvZHktPmZpZDEpKTsKLQotCS8qCi0JICogV2UgZ290IExPT0tVUCBsb2NrLCBidXQgd2UgcmVhbGx5IG5lZWQgYXR0cnMuCi0JICovCi0JcG1vZGUgPSBpdC0+aXRfbG9ja19tb2RlOwotCUxBU1NFUlQocG1vZGUgIT0gMCk7Ci0JbWVtY3B5KCZwbG9jaywgbG9ja2gsIHNpemVvZihwbG9jaykpOwotCWl0LT5pdF9sb2NrX21vZGUgPSAwOwotCWl0LT5pdF9yZXF1ZXN0ID0gTlVMTDsKLQlmaWQxID0gYm9keS0+ZmlkMTsKLQotCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKLQotCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZmaWQxKTsKLQlpZiAoSVNfRVJSKHRndCkpIHsKLQkJcmMgPSBQVFJfRVJSKHRndCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJkYXRhID0ga3phbGxvYyhzaXplb2YoKnJkYXRhKSwgR0ZQX05PRlMpOwotCWlmICghcmRhdGEpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZGF0YS0+b3BfZmlkMSA9IGZpZDE7Ci0JcmRhdGEtPm9wX2JpYXMgPSBNRFNfQ1JPU1NfUkVGOwotCi0JcmMgPSBtZF9lbnF1ZXVlKHRndC0+bHRkX2V4cCwgZWluZm8sIGl0LCByZGF0YSwgbG9ja2gsCi0JCQlsbW0sIGxtbXNpemUsIE5VTEwsIGV4dHJhX2xvY2tfZmxhZ3MpOwotCWtmcmVlKHJkYXRhKTsKLW91dDoKLQlsZGxtX2xvY2tfZGVjcmVmKCZwbG9jaywgcG1vZGUpOwotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludAogbG12X2VucXVldWUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICplaW5mbywKKwkgICAgY29uc3QgbGRsbV9wb2xpY3lfZGF0YV90ICpwb2xpY3ksCiAJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JICAgIHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwKLQkgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxLCBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQorCSAgICBzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCiB7CiAJc3RydWN0IG9iZF9kZXZpY2UJKm9iZCA9IGV4cC0+ZXhwX29iZDsKIAlzdHJ1Y3QgbG12X29iZAkgICAqbG12ID0gJm9iZC0+dS5sbXY7CkBAIC0xNzU1LDIyICsxNzcxLDE4IEBACiAJaWYgKElTX0VSUih0Z3QpKQogCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwogCi0JQ0RFQlVHKERfSU5PREUsICJFTlFVRVVFICclcycgb24gIkRGSUQiIC0+IG1kcyAjJWRcbiIsCisJQ0RFQlVHKERfSU5PREUsICJFTlFVRVVFICclcycgb24gIiBERklEICIgLT4gbWRzICMldVxuIiwKIAkgICAgICAgTExfSVQyU1RSKGl0KSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIHRndC0+bHRkX2lkeCk7CiAKLQlyYyA9IG1kX2VucXVldWUodGd0LT5sdGRfZXhwLCBlaW5mbywgaXQsIG9wX2RhdGEsIGxvY2toLAotCQkJbG1tLCBsbW1zaXplLCByZXEsIGV4dHJhX2xvY2tfZmxhZ3MpOworCXJjID0gbWRfZW5xdWV1ZSh0Z3QtPmx0ZF9leHAsIGVpbmZvLCBwb2xpY3ksIGl0LCBvcF9kYXRhLCBsb2NraCwKKwkJCWV4dHJhX2xvY2tfZmxhZ3MpOwogCi0JaWYgKHJjID09IDAgJiYgaXQgJiYgaXQtPml0X29wID09IElUX09QRU4pIHsKLQkJcmMgPSBsbXZfZW5xdWV1ZV9yZW1vdGUoZXhwLCBlaW5mbywgaXQsIG9wX2RhdGEsIGxvY2toLAotCQkJCQlsbW0sIGxtbXNpemUsIGV4dHJhX2xvY2tfZmxhZ3MpOwotCX0KIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQKIGxtdl9nZXRhdHRyX25hbWUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQorCQkgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcHJlcSkKIHsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgICAqcmVxID0gTlVMTDsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgICAqb2JkID0gZXhwLT5leHBfb2JkOwpAQCAtMTc4NywyNiArMTc5OSwyNSBAQAogCWlmIChJU19FUlIodGd0KSkKIAkJcmV0dXJuIFBUUl9FUlIodGd0KTsKIAotCUNERUJVRyhEX0lOT0RFLCAiR0VUQVRUUl9OQU1FIGZvciAlKnMgb24gIkRGSUQiIC0+IG1kcyAjJWRcbiIsCi0JICAgICAgIG9wX2RhdGEtPm9wX25hbWVsZW4sIG9wX2RhdGEtPm9wX25hbWUsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLAotCSAgICAgICB0Z3QtPmx0ZF9pZHgpOworCUNERUJVRyhEX0lOT0RFLCAiR0VUQVRUUl9OQU1FIGZvciAlKnMgb24gIiBERklEICIgLT4gbWRzICMldVxuIiwKKwkgICAgICAgKGludClvcF9kYXRhLT5vcF9uYW1lbGVuLCBvcF9kYXRhLT5vcF9uYW1lLAorCSAgICAgICBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgdGd0LT5sdGRfaWR4KTsKIAotCXJjID0gbWRfZ2V0YXR0cl9uYW1lKHRndC0+bHRkX2V4cCwgb3BfZGF0YSwgcmVxdWVzdCk7CisJcmMgPSBtZF9nZXRhdHRyX25hbWUodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBwcmVxKTsKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCi0JYm9keSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9nZXQoJigqcmVxdWVzdCktPnJxX3BpbGwsCi0JCQkJICAgICAgJlJNRl9NRFRfQk9EWSk7Ci0KLQlpZiAoYm9keS0+dmFsaWQgJiBPQkRfTURfTURTKSB7Ci0JCXN0cnVjdCBsdV9maWQgcmlkID0gYm9keS0+ZmlkMTsKKwlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmKCpwcmVxKS0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CisJaWYgKGJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9NRFMpIHsKKwkJc3RydWN0IGx1X2ZpZCByaWQgPSBib2R5LT5tYm9fZmlkMTsKIAogCQlDREVCVUcoRF9JTk9ERSwgIlJlcXVlc3QgYXR0cnMgZm9yICJERklEIlxuIiwKIAkJICAgICAgIFBGSUQoJnJpZCkpOwogCiAJCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZyaWQpOwogCQlpZiAoSVNfRVJSKHRndCkpIHsKLQkJCXB0bHJwY19yZXFfZmluaXNoZWQoKnJlcXVlc3QpOworCQkJcHRscnBjX3JlcV9maW5pc2hlZCgqcHJlcSk7CisJCQkqcHJlcSA9IE5VTEw7CiAJCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwogCQl9CiAKQEAgLTE4MTUsOCArMTgyNiw4IEBACiAJCW9wX2RhdGEtPm9wX25hbWVsZW4gPSAwOwogCQlvcF9kYXRhLT5vcF9uYW1lID0gTlVMTDsKIAkJcmMgPSBtZF9nZXRhdHRyX25hbWUodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCAmcmVxKTsKLQkJcHRscnBjX3JlcV9maW5pc2hlZCgqcmVxdWVzdCk7Ci0JCSpyZXF1ZXN0ID0gcmVxOworCQlwdGxycGNfcmVxX2ZpbmlzaGVkKCpwcmVxKTsKKwkJKnByZXEgPSByZXE7CiAJfQogCiAJcmV0dXJuIHJjOwpAQCAtMTgyOSwyMyArMTg0MCwyNCBAQAogCSBmbCA9PSBNRl9NRENfQ0FOQ0VMX0ZJRDQgPyAmb3BfZGF0YS0+b3BfZmlkNCA6IFwKIAkgTlVMTCkKIAotc3RhdGljIGludCBsbXZfZWFybHlfY2FuY2VsKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkJICAgIGludCBvcF90Z3QsIGVudW0gbGRsbV9tb2RlIG1vZGUsIGludCBiaXRzLAotCQkJICAgIGludCBmbGFnKQorc3RhdGljIGludCBsbXZfZWFybHlfY2FuY2VsKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndCwKKwkJCSAgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwgaW50IG9wX3RndCwKKwkJCSAgICBlbnVtIGxkbG1fbW9kZSBtb2RlLCBpbnQgYml0cywgaW50IGZsYWcpCiB7CiAJc3RydWN0IGx1X2ZpZAkgICpmaWQgPSBtZF9vcF9kYXRhX2ZpZChvcF9kYXRhLCBmbGFnKTsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQJICpsbXYgPSAmb2JkLT51LmxtdjsKLQlzdHJ1Y3QgbG12X3RndF9kZXNjICAgICp0Z3Q7CiAJbGRsbV9wb2xpY3lfZGF0YV90ICAgICAgcG9saWN5ID0geyB7MH0gfTsKIAlpbnQJCSAgICAgcmMgPSAwOwogCiAJaWYgKCFmaWRfaXNfc2FuZShmaWQpKQogCQlyZXR1cm4gMDsKIAotCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsIGZpZCk7Ci0JaWYgKElTX0VSUih0Z3QpKQotCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCWlmICghdGd0KSB7CisJCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsIGZpZCk7CisJCWlmIChJU19FUlIodGd0KSkKKwkJCXJldHVybiBQVFJfRVJSKHRndCk7CisJfQogCiAJaWYgKHRndC0+bHRkX2lkeCAhPSBvcF90Z3QpIHsKIAkJQ0RFQlVHKERfSU5PREUsICJFQVJMWV9DQU5DRUwgb24gIkRGSUQiXG4iLCBQRklEKGZpZCkpOwpAQCAtMTg4MiwxMiArMTg5NCwyNCBAQAogCUxBU1NFUlQob3BfZGF0YS0+b3BfbmFtZWxlbiAhPSAwKTsKIAogCUNERUJVRyhEX0lOT0RFLCAiTElOSyAiREZJRCI6JSpzIHRvICJERklEIlxuIiwKLQkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMiksIG9wX2RhdGEtPm9wX25hbWVsZW4sCisJICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLCAoaW50KW9wX2RhdGEtPm9wX25hbWVsZW4sCiAJICAgICAgIG9wX2RhdGEtPm9wX25hbWUsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpKTsKIAogCW9wX2RhdGEtPm9wX2ZzdWlkID0gZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnN1aWQoKSk7CiAJb3BfZGF0YS0+b3BfZnNnaWQgPSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgY3VycmVudF9mc2dpZCgpKTsKIAlvcF9kYXRhLT5vcF9jYXAgPSBjZnNfY3VycHJvY19jYXBfcGFjaygpOworCWlmIChvcF9kYXRhLT5vcF9tZWEyKSB7CisJCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWEyOworCQljb25zdCBzdHJ1Y3QgbG12X29pbmZvICpvaW5mbzsKKworCQlvaW5mbyA9IGxzbV9uYW1lX3RvX3N0cmlwZV9pbmZvKGxzbSwgb3BfZGF0YS0+b3BfbmFtZSwKKwkJCQkJCW9wX2RhdGEtPm9wX25hbWVsZW4pOworCQlpZiAoSVNfRVJSKG9pbmZvKSkKKwkJCXJldHVybiBQVFJfRVJSKG9pbmZvKTsKKworCQlvcF9kYXRhLT5vcF9maWQyID0gb2luZm8tPmxtb19maWQ7CisJfQorCiAJdGd0ID0gbG12X2xvY2F0ZV9tZHMobG12LCBvcF9kYXRhLCAmb3BfZGF0YS0+b3BfZmlkMik7CiAJaWYgKElTX0VSUih0Z3QpKQogCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwpAQCAtMTg5Niw3ICsxOTIwLDcgQEAKIAkgKiBDYW5jZWwgVVBEQVRFIGxvY2sgb24gY2hpbGQgKGZpZDEpLgogCSAqLwogCW9wX2RhdGEtPm9wX2ZsYWdzIHw9IE1GX01EQ19DQU5DRUxfRklEMjsKLQlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBvcF9kYXRhLCB0Z3QtPmx0ZF9pZHgsIExDS19FWCwKKwlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBOVUxMLCBvcF9kYXRhLCB0Z3QtPmx0ZF9pZHgsIExDS19FWCwKIAkJCSAgICAgIE1EU19JTk9ERUxPQ0tfVVBEQVRFLCBNRl9NRENfQ0FOQ0VMX0ZJRDEpOwogCWlmIChyYyAhPSAwKQogCQlyZXR1cm4gcmM7CkBAIC0xOTA3LDIwICsxOTMxLDIyIEBACiB9CiAKIHN0YXRpYyBpbnQgbG12X3JlbmFtZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgICAgY29uc3QgY2hhciAqb2xkLCBpbnQgb2xkbGVuLCBjb25zdCBjaGFyICpuZXcsIGludCBuZXdsZW4sCisJCSAgICAgIGNvbnN0IGNoYXIgKm9sZCwgc2l6ZV90IG9sZGxlbiwKKwkJICAgICAgY29uc3QgY2hhciAqbmV3LCBzaXplX3QgbmV3bGVuLAogCQkgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQogewogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQJICAqbG12ID0gJm9iZC0+dS5sbXY7CiAJc3RydWN0IGxtdl90Z3RfZGVzYyAgICAgKnNyY190Z3Q7Ci0Jc3RydWN0IGxtdl90Z3RfZGVzYyAgICAgKnRndF90Z3Q7CiAJaW50CQkJcmM7CiAKIAlMQVNTRVJUKG9sZGxlbiAhPSAwKTsKIAotCUNERUJVRyhEX0lOT0RFLCAiUkVOQU1FICUqcyBpbiAiREZJRCIgdG8gJSpzIGluICJERklEIlxuIiwKLQkgICAgICAgb2xkbGVuLCBvbGQsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLAotCSAgICAgICBuZXdsZW4sIG5ldywgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMikpOworCUNERUJVRyhEX0lOT0RFLCAiUkVOQU1FICUuKnMgaW4gIkRGSUQiOiVkIHRvICUuKnMgaW4gIkRGSUQiOiVkXG4iLAorCSAgICAgICAoaW50KW9sZGxlbiwgb2xkLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKKwkgICAgICAgb3BfZGF0YS0+b3BfbWVhMSA/IG9wX2RhdGEtPm9wX21lYTEtPmxzbV9tZF9zdHJpcGVfY291bnQgOiAwLAorCSAgICAgICAoaW50KW5ld2xlbiwgbmV3LCBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSwKKwkgICAgICAgb3BfZGF0YS0+b3BfbWVhMiA/IG9wX2RhdGEtPm9wX21lYTItPmxzbV9tZF9zdHJpcGVfY291bnQgOiAwKTsKIAogCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKIAlpZiAocmMpCkBAIC0xOTI5LDEzICsxOTU1LDYwIEBACiAJb3BfZGF0YS0+b3BfZnN1aWQgPSBmcm9tX2t1aWQoJmluaXRfdXNlcl9ucywgY3VycmVudF9mc3VpZCgpKTsKIAlvcF9kYXRhLT5vcF9mc2dpZCA9IGZyb21fa2dpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2ZzZ2lkKCkpOwogCW9wX2RhdGEtPm9wX2NhcCA9IGNmc19jdXJwcm9jX2NhcF9wYWNrKCk7Ci0Jc3JjX3RndCA9IGxtdl9sb2NhdGVfbWRzKGxtdiwgb3BfZGF0YSwgJm9wX2RhdGEtPm9wX2ZpZDEpOworCisJaWYgKG9wX2RhdGEtPm9wX2NsaV9mbGFncyAmIENMSV9NSUdSQVRFKSB7CisJCUxBU1NFUlRGKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQzKSwgImludmFsaWQgRklEICJERklEIlxuIiwKKwkJCSBQRklEKCZvcF9kYXRhLT5vcF9maWQzKSk7CisKKwkJaWYgKG9wX2RhdGEtPm9wX21lYTEpIHsKKwkJCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWExOworCQkJc3RydWN0IGxtdl90Z3RfZGVzYyAqdG1wOworCisJCQkvKiBGaXggdGhlIHBhcmVudCBmaWQgZm9yIHN0cmlwZWQgZGlyICovCisJCQl0bXAgPSBsbXZfbG9jYXRlX3RhcmdldF9mb3JfbmFtZShsbXYsIGxzbSwgb2xkLAorCQkJCQkJCSBvbGRsZW4sCisJCQkJCQkJICZvcF9kYXRhLT5vcF9maWQxLAorCQkJCQkJCSBOVUxMKTsKKwkJCWlmIChJU19FUlIodG1wKSkKKwkJCQlyZXR1cm4gUFRSX0VSUih0bXApOworCQl9CisKKwkJcmMgPSBsbXZfZmlkX2FsbG9jKE5VTEwsIGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCXNyY190Z3QgPSBsbXZfZmluZF90YXJnZXQobG12LCAmb3BfZGF0YS0+b3BfZmlkMyk7CisJfSBlbHNlIHsKKwkJaWYgKG9wX2RhdGEtPm9wX21lYTEpIHsKKwkJCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc20gPSBvcF9kYXRhLT5vcF9tZWExOworCisJCQlzcmNfdGd0ID0gbG12X2xvY2F0ZV90YXJnZXRfZm9yX25hbWUobG12LCBsc20sIG9sZCwKKwkJCQkJCQkgICAgIG9sZGxlbiwKKwkJCQkJCQkgICAgICZvcF9kYXRhLT5vcF9maWQxLAorCQkJCQkJCSAgICAgJm9wX2RhdGEtPm9wX21kcyk7CisJCQlpZiAoSVNfRVJSKHNyY190Z3QpKQorCQkJCXJldHVybiBQVFJfRVJSKHNyY190Z3QpOworCQl9IGVsc2UgeworCQkJc3JjX3RndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZvcF9kYXRhLT5vcF9maWQxKTsKKwkJCWlmIChJU19FUlIoc3JjX3RndCkpCisJCQkJcmV0dXJuIFBUUl9FUlIoc3JjX3RndCk7CisKKwkJCW9wX2RhdGEtPm9wX21kcyA9IHNyY190Z3QtPmx0ZF9pZHg7CisJCX0KKworCQlpZiAob3BfZGF0YS0+b3BfbWVhMikgeworCQkJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG9wX2RhdGEtPm9wX21lYTI7CisJCQljb25zdCBzdHJ1Y3QgbG12X29pbmZvICpvaW5mbzsKKworCQkJb2luZm8gPSBsc21fbmFtZV90b19zdHJpcGVfaW5mbyhsc20sIG5ldywgbmV3bGVuKTsKKwkJCWlmIChJU19FUlIob2luZm8pKQorCQkJCXJldHVybiBQVFJfRVJSKG9pbmZvKTsKKworCQkJb3BfZGF0YS0+b3BfZmlkMiA9IG9pbmZvLT5sbW9fZmlkOworCQl9CisJfQogCWlmIChJU19FUlIoc3JjX3RndCkpCiAJCXJldHVybiBQVFJfRVJSKHNyY190Z3QpOwogCi0JdGd0X3RndCA9IGxtdl9sb2NhdGVfbWRzKGxtdiwgb3BfZGF0YSwgJm9wX2RhdGEtPm9wX2ZpZDIpOwotCWlmIChJU19FUlIodGd0X3RndCkpCi0JCXJldHVybiBQVFJfRVJSKHRndF90Z3QpOwogCS8qCiAJICogTE9PS1VQIGxvY2sgb24gc3JjIGNoaWxkIChmaWQzKSBzaG91bGQgYWxzbyBiZSBjYW5jZWxsZWQgZm9yCiAJICogc3JjX3RndCBpbiBtZGNfcmVuYW1lLgpAQCAtMTk0NiwzNSArMjAxOSw1MyBAQAogCSAqIENhbmNlbCBVUERBVEUgbG9ja3Mgb24gdGd0IHBhcmVudCAoZmlkMiksIHRndF90Z3QgaXMgaXRzCiAJICogb3duIHRhcmdldC4KIAkgKi8KLQlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBvcF9kYXRhLCBzcmNfdGd0LT5sdGRfaWR4LAorCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIE5VTEwsIG9wX2RhdGEsIHNyY190Z3QtPmx0ZF9pZHgsCiAJCQkgICAgICBMQ0tfRVgsIE1EU19JTk9ERUxPQ0tfVVBEQVRFLAogCQkJICAgICAgTUZfTURDX0NBTkNFTF9GSUQyKTsKLQorCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCS8qCi0JICogQ2FuY2VsIExPT0tVUCBsb2NrcyBvbiB0Z3QgY2hpbGQgKGZpZDQpIGZvciBwYXJlbnQgdGd0X3RndC4KKwkgKiBDYW5jZWwgTE9PS1VQIGxvY2tzIG9uIHNvdXJjZSBjaGlsZCAoZmlkMykgZm9yIHBhcmVudCB0Z3RfdGd0LgogCSAqLwotCWlmIChyYyA9PSAwKSB7Ci0JCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIG9wX2RhdGEsIHNyY190Z3QtPmx0ZF9pZHgsCisJaWYgKGZpZF9pc19zYW5lKCZvcF9kYXRhLT5vcF9maWQzKSkgeworCQlzdHJ1Y3QgbG12X3RndF9kZXNjICp0Z3Q7CisKKwkJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJm9wX2RhdGEtPm9wX2ZpZDEpOworCQlpZiAoSVNfRVJSKHRndCkpCisJCQlyZXR1cm4gUFRSX0VSUih0Z3QpOworCisJCS8qIENhbmNlbCBMT09LVVAgbG9jayBvbiBpdHMgcGFyZW50ICovCisJCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIHRndCwgb3BfZGF0YSwgc3JjX3RndC0+bHRkX2lkeCwKIAkJCQkgICAgICBMQ0tfRVgsIE1EU19JTk9ERUxPQ0tfTE9PS1VQLAotCQkJCSAgICAgIE1GX01EQ19DQU5DRUxfRklENCk7CisJCQkJICAgICAgTUZfTURDX0NBTkNFTF9GSUQzKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIE5VTEwsIG9wX2RhdGEsIHNyY190Z3QtPmx0ZF9pZHgsCisJCQkJICAgICAgTENLX0VYLCBNRFNfSU5PREVMT0NLX0ZVTEwsCisJCQkJICAgICAgTUZfTURDX0NBTkNFTF9GSUQzKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOwogCX0KIAogCS8qCiAJICogQ2FuY2VsIGFsbCB0aGUgbG9ja3Mgb24gdGd0IGNoaWxkIChmaWQ0KS4KIAkgKi8KLQlpZiAocmMgPT0gMCkKLQkJcmMgPSBsbXZfZWFybHlfY2FuY2VsKGV4cCwgb3BfZGF0YSwgc3JjX3RndC0+bHRkX2lkeCwKKwlpZiAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDQpKQorCQlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBOVUxMLCBvcF9kYXRhLCBzcmNfdGd0LT5sdGRfaWR4LAogCQkJCSAgICAgIExDS19FWCwgTURTX0lOT0RFTE9DS19GVUxMLAogCQkJCSAgICAgIE1GX01EQ19DQU5DRUxfRklENCk7CiAKLQlpZiAocmMgPT0gMCkKLQkJcmMgPSBtZF9yZW5hbWUoc3JjX3RndC0+bHRkX2V4cCwgb3BfZGF0YSwgb2xkLCBvbGRsZW4sCi0JCQkgICAgICAgbmV3LCBuZXdsZW4sIHJlcXVlc3QpOworCUNERUJVRyhEX0lOT0RFLCBERklEIjptJWQgdG8gIkRGSUQiXG4iLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKKwkgICAgICAgb3BfZGF0YS0+b3BfbWRzLCBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSk7CisKKwlyYyA9IG1kX3JlbmFtZShzcmNfdGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBvbGQsIG9sZGxlbiwKKwkJICAgICAgIG5ldywgbmV3bGVuLCByZXF1ZXN0KTsKIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgbG12X3NldGF0dHIoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICAgICB2b2lkICplYSwgaW50IGVhbGVuLCB2b2lkICplYTIsIGludCBlYTJsZW4sCisJCSAgICAgICB2b2lkICplYSwgc2l6ZV90IGVhbGVuLCB2b2lkICplYTIsIHNpemVfdCBlYTJsZW4sCiAJCSAgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0LAogCQkgICAgICAgc3RydWN0IG1kX29wZW5fZGF0YSAqKm1vZCkKIHsKQEAgLTIwMjEsMTY5ICsyMTEyLDQxOSBAQAogCXJldHVybiByYzsKIH0KIAotLyoKLSAqIEFkanVzdCBhIHNldCBvZiBwYWdlcywgZWFjaCBwYWdlIGNvbnRhaW5pbmcgYW4gYXJyYXkgb2YgbHVfZGlycGFnZXMsCi0gKiBzbyB0aGF0IGVhY2ggcGFnZSBjYW4gYmUgdXNlZCBhcyBhIHNpbmdsZSBsb2dpY2FsIGx1X2RpcnBhZ2UuCisvKioKKyAqIEdldCBjdXJyZW50IG1pbmltdW0gZW50cnkgZnJvbSBzdHJpcGVkIGRpcmVjdG9yeQogICoKLSAqIEEgbHVfZGlycGFnZSBpcyBsYWlkIG91dCBhcyBmb2xsb3dzLCB3aGVyZSBzID0gbGRwX2hhc2hfc3RhcnQsCi0gKiBlID0gbGRwX2hhc2hfZW5kLCBmID0gbGRwX2ZsYWdzLCBwID0gcGFkZGluZywgYW5kIGVhY2ggImVudCIgaXMgYQotICogc3RydWN0IGx1X2RpcmVudC4gIEl0IGhhcyBzaXplIHVwIHRvIExVX1BBR0VfU0laRS4gVGhlIGxkcF9oYXNoX2VuZAotICogdmFsdWUgaXMgdXNlZCBhcyBhIGNvb2tpZSB0byByZXF1ZXN0IHRoZSBuZXh0IGx1X2RpcnBhZ2UgaW4gYQotICogZGlyZWN0b3J5IGxpc3RpbmcgdGhhdCBzcGFucyBtdWx0aXBsZSBwYWdlcyAodHdvIGluIHRoaXMgZXhhbXBsZSk6Ci0gKiAgIF9fX19fX19fCi0gKiAgfAl8Ci0gKiAufC0tLS0tLS0tdi0tLS0tLS0gICAtLS0tLS4KLSAqIHxzfGV8ZnxwfGVudHxlbnR8IC4uLiB8ZW50fAotICogJy0tfC0tLS0tLS0tLS0tLS0tICAgLS0tLS0nICAgRWFjaCBDRlNfUEFHRSBjb250YWlucyBhIHNpbmdsZQotICogICAgJy0tLS0tLS4JCSAgIGx1X2RpcnBhZ2UuCi0gKiAuLS0tLS0tLS0tdi0tLS0tLS0gICAtLS0tLS4KLSAqIHxzfGV8ZnxwfGVudHwgMCB8IC4uLiB8IDAgfAotICogJy0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0nCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VhcmNoIHRoZSBkaXIgZW50cnksIHdob3NlIGhhc2ggdmFsdWUgaXMgdGhlCisgKiBjbG9zZXN0KD49KSB0byBAaGFzaF9vZmZzZXQsIGZyb20gYWxsIG9mIHN1Yi1zdHJpcGVzLCBhbmQgaXQgaXMKKyAqIG9ubHkgYmVpbmcgY2FsbGVkIGZvciBzdHJpcGVkIGRpcmVjdG9yeS4KICAqCi0gKiBIb3dldmVyLCBvbiBob3N0cyB3aGVyZSB0aGUgbmF0aXZlIFZNIHBhZ2Ugc2l6ZSAoUEFHRV9TSVpFKSBpcwotICogbGFyZ2VyIHRoYW4gTFVfUEFHRV9TSVpFLCBhIHNpbmdsZSBob3N0IHBhZ2UgbWF5IGNvbnRhaW4gbXVsdGlwbGUKLSAqIGx1X2RpcnBhZ2VzLiBBZnRlciByZWFkaW5nIHRoZSBsdV9kaXJwYWdlcyBmcm9tIHRoZSBNRFMsIHRoZQotICogbGRwX2hhc2hfZW5kIG9mIHRoZSBmaXJzdCBsdV9kaXJwYWdlIHJlZmVycyB0byB0aGUgb25lIGltbWVkaWF0ZWx5Ci0gKiBhZnRlciBpdCBpbiB0aGUgc2FtZSBDRlNfUEFHRSAoYXJyb3dzIHNpbXBsaWZpZWQgZm9yIGJyZXZpdHksIGJ1dAotICogaW4gZ2VuZXJhbCBlMD09czEsIGUxPT1zMiwgZXRjLik6CisgKiBccGFyYW1baW5dIGV4cAkJZXhwb3J0IG9mIExNVgorICogXHBhcmFtW2luXSBvcF9kYXRhCQlwYXJhbWV0ZXJzIHRyYW5zZmVycmVkIGJld2VlbiBjbGllbnQgTUQgc3RhY2sKKyAqCQkJCXN0cmlwZV9pbmZvcm1hdGlvbiB3aWxsIGJlIGluY2x1ZGVkIGluIHRoaXMKKyAqCQkJCXBhcmFtZXRlcgorICogXHBhcmFtW2luXSBjYl9vcAkJbGRsbSBjYWxsYmFjayBiZWluZyB1c2VkIGluIGVucXVldWUgaW4KKyAqCQkJCW1kY19yZWFkX3BhZ2UKKyAqIFxwYXJhbVtpbl0gaGFzaF9vZmZzZXQJdGhlIGhhc2ggdmFsdWUsIHdoaWNoIGlzIHVzZWQgdG8gbG9jYXRlCisgKgkJCQltaW51bShjbG9zZXQpIGRpciBlbnRyeQorICogXHBhcmFtW2lufG91dF0gc3RyaXBlX29mZnNldAl0aGUgY2FsbGVyIHVzZSB0aGlzIHRvIGluZGljYXRlIHRoZSBzdHJpcGUKKyAqCQkJCWluZGV4IG9mIGxhc3QgZW50cnksIHNvIHRvIGF2b2lkIGhhc2ggY29uZmxpY3QKKyAqCQkJCWJldHdlZW4gc3RyaXBlcy4gSXQgd2lsbCBhbHNvIGJlIHVzZWQgdG8KKyAqCQkJCXJldHVybiB0aGUgc3RyaXBlIGluZGV4IG9mIGN1cnJlbnQgZGlyIGVudHJ5LgorICogXHBhcmFtW2lufG91dF0gZW50cAkJdGhlIG1pbnVtIGVudHJ5IGFuZCBpdCBhbHNvIGlzIGJlaW5nIHVzZWQKKyAqCQkJCXRvIGlucHV0IHRoZSBsYXN0IGRpciBlbnRyeSB0byByZXNvbHZlIHRoZQorICoJCQkJaGFzaCBjb25mbGljdAogICoKLSAqIC4tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLgotICogfHMwfGUwfGYwfHB8ZW50fGVudHwgLi4uIHxlbnR8Ci0gKiB8LS0tdi0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLXwKLSAqIHxzMXxlMXxmMXxwfGVudHxlbnR8IC4uLiB8ZW50fAotICogfC0tLXYtLS0tLS0tLS0tLS0tLS0tICAgLS0tLS18ICBIZXJlLCBlYWNoIENGU19QQUdFIGNvbnRhaW5zCi0gKgkgICAgIC4uLgkJIG11bHRpcGxlIGx1X2RpcnBhZ2VzLgotICogfC0tLXYtLS0tLS0tLS0tLS0tLS0tICAgLS0tLS18Ci0gKiB8cyd8ZSd8Zid8cHxlbnR8ZW50fCAuLi4gfGVudHwKLSAqICctLS18LS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tJwotICogICAgIHYKLSAqIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotICogfAluZXh0IENGU19QQUdFICAgICAgIHwKKyAqIFxwYXJhbVtvdXRdIHBwYWdlCQl0aGUgcGFnZSB3aGljaCBob2xkcyB0aGUgbWludW0gZW50cnkKICAqCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyB0cmFuc2Zvcm1lZCBpbnRvIGEgc2luZ2xlIGxvZ2ljYWwgbHVfZGlycGFnZSBhcyBmb2xsb3dzOgotICoKLSAqIC0gUmVwbGFjZSBlMCB3aXRoIGUnIHNvIHRoZSByZXF1ZXN0IGZvciB0aGUgbmV4dCBsdV9kaXJwYWdlIGdldHMgdGhlIHBhZ2UKLSAqICAgbGFiZWxlZCAnbmV4dCBDRlNfUEFHRScuCi0gKgotICogLSBDb3B5IHRoZSBMREZfQ09MTElERSBmbGFnIGZyb20gZicgdG8gZjAgdG8gY29ycmVjdGx5IHJlZmxlY3Qgd2hldGhlcgotICogICBhIGhhc2ggY29sbGlzaW9uIHdpdGggdGhlIG5leHQgcGFnZSBleGlzdHMuCi0gKgotICogLSBBZGp1c3QgdGhlIGxkZV9yZWNsZW4gb2YgdGhlIGVuZGluZyBlbnRyeSBvZiBlYWNoIGx1X2RpcnBhZ2UgdG8gc3BhbgotICogICB0byB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIG5leHQgbHVfZGlycGFnZS4KKyAqIFxyZXR2YWwJCQk9IDAgZ2V0IHRoZSBlbnRyeSBzdWNjZXNzZnVsbHkKKyAqCQkJCW5lZ2F0aXZlIGVycm5vICg8IDApIGRvZXMgbm90IGdldCB0aGUgZW50cnkKICAqLwotI2lmIFBBR0VfU0laRSA+IExVX1BBR0VfU0laRQotc3RhdGljIHZvaWQgbG12X2FkanVzdF9kaXJwYWdlcyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbmNmc3BncywgaW50IG5sdXBncykKK3N0YXRpYyBpbnQgbG12X2dldF9taW5fc3RyaXBlZF9lbnRyeShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAorCQkJCSAgICAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCisJCQkJICAgICBzdHJ1Y3QgbWRfY2FsbGJhY2sgKmNiX29wLAorCQkJCSAgICAgX191NjQgaGFzaF9vZmZzZXQsIGludCAqc3RyaXBlX29mZnNldCwKKwkJCQkgICAgIHN0cnVjdCBsdV9kaXJlbnQgKiplbnRwLAorCQkJCSAgICAgc3RydWN0IHBhZ2UgKipwcGFnZSkKIHsKKwlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtID0gb3BfZGF0YS0+b3BfbWVhMTsKKwlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gZXhwLT5leHBfb2JkOworCXN0cnVjdCBsbXZfb2JkICpsbXYgPSAmb2JkLT51LmxtdjsKKwlzdHJ1Y3QgbHVfZGlyZW50ICptaW5fZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqbWluX3BhZ2UgPSBOVUxMOworCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndDsKKwlpbnQgc3RyaXBlX2NvdW50OworCWludCBtaW5faWR4ID0gMDsKKwlpbnQgcmMgPSAwOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG5jZnNwZ3M7IGkrKykgewotCQlzdHJ1Y3QgbHVfZGlycGFnZQkqZHAgPSBrbWFwKHBhZ2VzW2ldKTsKLQkJc3RydWN0IGx1X2RpcnBhZ2UJKmZpcnN0ID0gZHA7Ci0JCXN0cnVjdCBsdV9kaXJlbnQJKmVuZF9kaXJlbnQgPSBOVUxMOwotCQlzdHJ1Y3QgbHVfZGlyZW50CSplbnQ7Ci0JCV9fdTY0CQkJaGFzaF9lbmQgPSBkcC0+bGRwX2hhc2hfZW5kOwotCQlfX3UzMgkJCWZsYWdzID0gZHAtPmxkcF9mbGFnczsKKwlzdHJpcGVfY291bnQgPSBsc20tPmxzbV9tZF9zdHJpcGVfY291bnQ7CisJZm9yIChpID0gMDsgaSA8IHN0cmlwZV9jb3VudDsgaSsrKSB7CisJCV9fdTY0IHN0cmlwZV9oYXNoID0gaGFzaF9vZmZzZXQ7CisJCXN0cnVjdCBsdV9kaXJlbnQgKmVudCA9IE5VTEw7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwkJc3RydWN0IGx1X2RpcnBhZ2UgKmRwOwogCi0JCXdoaWxlICgtLW5sdXBncyA+IDApIHsKLQkJCWVudCA9IGx1X2RpcmVudF9zdGFydChkcCk7Ci0JCQlmb3IgKGVuZF9kaXJlbnQgPSBlbnQ7IGVudDsKLQkJCSAgICAgZW5kX2RpcmVudCA9IGVudCwgZW50ID0gbHVfZGlyZW50X25leHQoZW50KSkKLQkJCQk7Ci0KLQkJCS8qIEFkdmFuY2UgZHAgdG8gbmV4dCBsdV9kaXJwYWdlLiAqLwotCQkJZHAgPSAoc3RydWN0IGx1X2RpcnBhZ2UgKikoKGNoYXIgKilkcCArIExVX1BBR0VfU0laRSk7Ci0KLQkJCS8qIENoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgQ0ZTX1BBR0UuICovCi0JCQlpZiAoISgodW5zaWduZWQgbG9uZylkcCAmIH5QQUdFX01BU0spKQotCQkJCWJyZWFrOwotCi0JCQkvKiBTYXZlIHRoZSBoYXNoIGFuZCBmbGFncyBvZiB0aGlzIGx1X2RpcnBhZ2UuICovCi0JCQloYXNoX2VuZCA9IGRwLT5sZHBfaGFzaF9lbmQ7Ci0JCQlmbGFncyA9IGRwLT5sZHBfZmxhZ3M7Ci0KLQkJCS8qIENoZWNrIGlmIGx1X2RpcnBhZ2UgY29udGFpbnMgbm8gZW50cmllcy4gKi8KLQkJCWlmICghZW5kX2RpcmVudCkKLQkJCQlicmVhazsKLQotCQkJLyogRW5sYXJnZSB0aGUgZW5kIGVudHJ5IGxkZV9yZWNsZW4gZnJvbSAwIHRvCi0JCQkgKiBmaXJzdCBlbnRyeSBvZiBuZXh0IGx1X2RpcnBhZ2UuCi0JCQkgKi8KLQkJCUxBU1NFUlQobGUxNl90b19jcHUoZW5kX2RpcmVudC0+bGRlX3JlY2xlbikgPT0gMCk7Ci0JCQllbmRfZGlyZW50LT5sZGVfcmVjbGVuID0KLQkJCQljcHVfdG9fbGUxNigoY2hhciAqKShkcC0+bGRwX2VudHJpZXMpIC0KLQkJCQkJICAgIChjaGFyICopZW5kX2RpcmVudCk7CisJCXRndCA9IGxtdl9nZXRfdGFyZ2V0KGxtdiwgbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX21kcywgTlVMTCk7CisJCWlmIChJU19FUlIodGd0KSkgeworCQkJcmMgPSBQVFJfRVJSKHRndCk7CisJCQlnb3RvIG91dDsKIAkJfQogCi0JCWZpcnN0LT5sZHBfaGFzaF9lbmQgPSBoYXNoX2VuZDsKLQkJZmlyc3QtPmxkcF9mbGFncyAmPSB+Y3B1X3RvX2xlMzIoTERGX0NPTExJREUpOwotCQlmaXJzdC0+bGRwX2ZsYWdzIHw9IGZsYWdzICYgY3B1X3RvX2xlMzIoTERGX0NPTExJREUpOworCQkvKgorCQkgKiBvcF9kYXRhIHdpbGwgYmUgc2hhcmVkIGJ5IGVhY2ggc3RyaXBlLCBzbyB3ZSBuZWVkCisJCSAqIHJlc2V0IHRoZXNlIHZhbHVlIGZvciBlYWNoIHN0cmlwZQorCQkgKi8KKwkJb3BfZGF0YS0+b3BfZmlkMSA9IGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19maWQ7CisJCW9wX2RhdGEtPm9wX2ZpZDIgPSBsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fZmlkOworCQlvcF9kYXRhLT5vcF9kYXRhID0gbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX3Jvb3Q7CituZXh0OgorCQlyYyA9IG1kX3JlYWRfcGFnZSh0Z3QtPmx0ZF9leHAsIG9wX2RhdGEsIGNiX29wLCBzdHJpcGVfaGFzaCwKKwkJCQkgICZwYWdlKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CiAKLQkJa3VubWFwKHBhZ2VzW2ldKTsKKwkJZHAgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWZvciAoZW50ID0gbHVfZGlyZW50X3N0YXJ0KGRwKTsgZW50OworCQkgICAgIGVudCA9IGx1X2RpcmVudF9uZXh0KGVudCkpIHsKKwkJCS8qIFNraXAgZHVtbXkgZW50cnkgKi8KKwkJCWlmICghbGUxNl90b19jcHUoZW50LT5sZGVfbmFtZWxlbikpCisJCQkJY29udGludWU7CisKKwkJCWlmIChsZTY0X3RvX2NwdShlbnQtPmxkZV9oYXNoKSA8IGhhc2hfb2Zmc2V0KQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAobGU2NF90b19jcHUoZW50LT5sZGVfaGFzaCkgPT0gaGFzaF9vZmZzZXQgJiYKKwkJCSAgICAoKmVudHAgPT0gZW50IHx8IGkgPCAqc3RyaXBlX29mZnNldCkpCisJCQkJY29udGludWU7CisKKwkJCS8qIHNraXAgLiBhbmQgLi4gZm9yIG90aGVyIHN0cmlwZXMgKi8KKwkJCWlmIChpICYmICghc3RybmNtcChlbnQtPmxkZV9uYW1lLCAiLiIsCisJCQkJCSAgIGxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pKSB8fAorCQkJCSAgIXN0cm5jbXAoZW50LT5sZGVfbmFtZSwgIi4uIiwKKwkJCQkJICAgbGUxNl90b19jcHUoZW50LT5sZGVfbmFtZWxlbikpKSkKKwkJCQljb250aW51ZTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFlbnQpIHsKKwkJCXN0cmlwZV9oYXNoID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCk7CisKKwkJCWt1bm1hcChwYWdlKTsKKwkJCXB1dF9wYWdlKHBhZ2UpOworCQkJcGFnZSA9IE5VTEw7CisKKwkJCS8qCisJCQkgKiByZWFjaCB0aGUgZW5kIG9mIGN1cnJlbnQgc3RyaXBlLCBnbyB0byBuZXh0IHN0cmlwZQorCQkJICovCisJCQlpZiAoc3RyaXBlX2hhc2ggPT0gTURTX0RJUl9FTkRfT0ZGKQorCQkJCWNvbnRpbnVlOworCQkJZWxzZQorCQkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWlmIChtaW5fZW50KSB7CisJCQlpZiAobGU2NF90b19jcHUobWluX2VudC0+bGRlX2hhc2gpID4KKwkJCSAgICBsZTY0X3RvX2NwdShlbnQtPmxkZV9oYXNoKSkgeworCQkJCW1pbl9lbnQgPSBlbnQ7CisJCQkJa3VubWFwKG1pbl9wYWdlKTsKKwkJCQlwdXRfcGFnZShtaW5fcGFnZSk7CisJCQkJbWluX2lkeCA9IGk7CisJCQkJbWluX3BhZ2UgPSBwYWdlOworCQkJfSBlbHNlIHsKKwkJCQlrdW5tYXAocGFnZSk7CisJCQkJcHV0X3BhZ2UocGFnZSk7CisJCQkJcGFnZSA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQltaW5fZW50ID0gZW50OworCQkJbWluX3BhZ2UgPSBwYWdlOworCQkJbWluX2lkeCA9IGk7CisJCX0KIAl9Ci0JTEFTU0VSVEYobmx1cGdzID09IDAsICJsZWZ0ID0gJWQiLCBubHVwZ3MpOwotfQotI2Vsc2UKLSNkZWZpbmUgbG12X2FkanVzdF9kaXJwYWdlcyhwYWdlcywgbmNmc3Bncywgbmx1cGdzKSBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgkvKiBQQUdFX1NJWkUgPiBMVV9QQUdFX1NJWkUgKi8KIAotc3RhdGljIGludCBsbXZfcmVhZHBhZ2Uoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQorb3V0OgorCWlmICgqcHBhZ2UpIHsKKwkJa3VubWFwKCpwcGFnZSk7CisJCXB1dF9wYWdlKCpwcGFnZSk7CisJfQorCSpzdHJpcGVfb2Zmc2V0ID0gbWluX2lkeDsKKwkqZW50cCA9IG1pbl9lbnQ7CisJKnBwYWdlID0gbWluX3BhZ2U7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIEJ1aWxkIGRpciBlbnRyeSBwYWdlIGZyb20gYSBzdHJpcGVkIGRpcmVjdG9yeQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBvbmUgZW50cnkgYnkgQG9mZnNldCBmcm9tIGEgc3RyaXBlZCBkaXJlY3RvcnkuIEl0IHdpbGwKKyAqIHJlYWQgZW50cmllcyBmcm9tIGFsbCBvZiBzdHJpcGVzLCBhbmQgY2hvb3NlIG9uZSBjbG9zZXN0IHRvIHRoZSByZXF1aXJlZAorICogb2Zmc2V0KCZvZmZzZXQpLiBBIGZldyBub3RlcworICogMS4gc2tpcCAuIGFuZCAuLiBmb3Igbm9uLXplcm8gc3RyaXBlcywgYmVjYXVzZSB0aGVyZSBjYW4gb25seSBoYXZlIG9uZSAuCisgKiBhbmQgLi4gaW4gYSBkaXJlY3RvcnkuCisgKiAyLiBvcF9kYXRhIHdpbGwgYmUgc2hhcmVkIGJ5IGFsbCBvZiBzdHJpcGVzLCBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgbmV3CisgKiBvbmUsIHNvIG5lZWQgdG8gcmVzdG9yZSBiZWZvcmUgcmV1c2luZy4KKyAqIDMuIHJlbGVhc2UgdGhlIGVudHJ5IHBhZ2UgaWYgdGhhdCBpcyBub3QgYmVpbmcgY2hvc2VuLgorICoKKyAqIFxwYXJhbVtpbl0gZXhwCW9iZCBleHBvcnQgcmVmZXIgdG8gTE1WCisgKiBccGFyYW1baW5dIG9wX2RhdGEJaG9sZCB0aG9zZSBNRCBwYXJhbWV0ZXJzIG9mIHJlYWRfZW50cnkKKyAqIFxwYXJhbVtpbl0gY2Jfb3AJbGRsbSBjYWxsYmFjayBiZWluZyB1c2VkIGluIGVucXVldWUgaW4gbWRjX3JlYWRfZW50cnkKKyAqIFxwYXJhbVtvdXRdIGxkcAl0aGUgZW50cnkgYmVpbmcgcmVhZAorICogXHBhcmFtW291dF0gcHBhZ2UJdGhlIHBhZ2UgaG9sZGluZyB0aGUgZW50cnkuIE5vdGU6IGJlY2F1c2UgdGhlIGVudHJ5CisgKgkJCXdpbGwgYmUgYWNjZXNzZWQgaW4gdXBwZXIgbGF5ZXIsIHNvIHdlIG5lZWQgaG9sZCB0aGUKKyAqCQkJcGFnZSB1bnRpbCB0aGUgdXNhZ2VzIG9mIGVudHJ5IGlzIGZpbmlzaGVkLCBzZWUKKyAqCQkJbGxfZGlyX2VudHJ5X25leHQuCisgKgorICogcmV0dmFsCQk9MCBpZiBnZXQgZW50cnkgc3VjY2Vzc2Z1bGx5CisgKgkJCTwwIGNhbm5vdCBnZXQgZW50cnkKKyAqLworc3RhdGljIGludCBsbXZfcmVhZF9zdHJpcGVkX3BhZ2Uoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJCQkgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCisJCQkJIHN0cnVjdCBtZF9jYWxsYmFjayAqY2Jfb3AsCisJCQkJIF9fdTY0IG9mZnNldCwgc3RydWN0IHBhZ2UgKipwcGFnZSkKIHsKLQlzdHJ1Y3Qgb2JkX2RldmljZQkqb2JkID0gZXhwLT5leHBfb2JkOwotCXN0cnVjdCBsbXZfb2JkCQkqbG12ID0gJm9iZC0+dS5sbXY7Ci0JX191NjQJCQlvZmZzZXQgPSBvcF9kYXRhLT5vcF9vZmZzZXQ7Ci0JaW50CQkJcmM7Ci0JaW50CQkJbmNmc3BnczsgLyogcGFnZXMgcmVhZCBpbiBQQUdFX1NJWkUgKi8KLQlpbnQJCQlubHVwZ3M7IC8qIHBhZ2VzIHJlYWQgaW4gTFVfUEFHRV9TSVpFICovCi0Jc3RydWN0IGxtdl90Z3RfZGVzYwkqdGd0OworCXN0cnVjdCBpbm9kZSAqbWFzdGVyX2lub2RlID0gb3BfZGF0YS0+b3BfZGF0YTsKKwlzdHJ1Y3QgbHVfZmlkIG1hc3Rlcl9maWQgPSBvcF9kYXRhLT5vcF9maWQxOworCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBleHAtPmV4cF9vYmQ7CisJX191NjQgaGFzaF9vZmZzZXQgPSBvZmZzZXQ7CisJc3RydWN0IHBhZ2UgKm1pbl9lbnRfcGFnZSA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKmVudF9wYWdlID0gTlVMTDsKKwlzdHJ1Y3QgbHVfZGlyZW50ICptaW5fZW50ID0gTlVMTDsKKwlzdHJ1Y3QgbHVfZGlyZW50ICpsYXN0X2VudDsKKwlzdHJ1Y3QgbHVfZGlyZW50ICplbnQ7CisJc3RydWN0IGx1X2RpcnBhZ2UgKmRwOworCXNpemVfdCBsZWZ0X2J5dGVzOworCWludCBlbnRfaWR4ID0gMDsKKwl2b2lkICphcmVhOworCWludCByYzsKIAogCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCUNERUJVRyhEX0lOT0RFLCAiUkVBRFBBR0UgYXQgJSNsbHggZnJvbSAiREZJRCJcbiIsCi0JICAgICAgIG9mZnNldCwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSkpOworCS8qCisJICogQWxsb2NhdGUgYSBwYWdlIGFuZCByZWFkIGVudHJpZXMgZnJvbSBhbGwgb2Ygc3RyaXBlcyBhbmQgZmlsbAorCSAqIHRoZSBwYWdlIGJ5IGhhc2ggb3JkZXIKKwkgKi8KKwllbnRfcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnRfcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBJbml0aWFsaXplIHRoZSBlbnRyeSBwYWdlICovCisJZHAgPSBrbWFwKGVudF9wYWdlKTsKKwltZW1zZXQoZHAsIDAsIHNpemVvZigqZHApKTsKKwlkcC0+bGRwX2hhc2hfc3RhcnQgPSBjcHVfdG9fbGU2NChvZmZzZXQpOworCWRwLT5sZHBfZmxhZ3MgfD0gTERGX0NPTExJREU7CisKKwlhcmVhID0gZHAgKyAxOworCWxlZnRfYnl0ZXMgPSBQQUdFX1NJWkUgLSBzaXplb2YoKmRwKTsKKwllbnQgPSBhcmVhOworCWxhc3RfZW50ID0gZW50OworCWRvIHsKKwkJX191MTYgZW50X3NpemU7CisKKwkJLyogRmluZCB0aGUgbWludW0gZW50cnkgZnJvbSBhbGwgc3ViLXN0cmlwZXMgKi8KKwkJcmMgPSBsbXZfZ2V0X21pbl9zdHJpcGVkX2VudHJ5KGV4cCwgb3BfZGF0YSwgY2Jfb3AsIGhhc2hfb2Zmc2V0LAorCQkJCQkgICAgICAgJmVudF9pZHgsICZtaW5fZW50LAorCQkJCQkgICAgICAgJm1pbl9lbnRfcGFnZSk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OworCisJCS8qCisJCSAqIElmIGl0IGNhbiBub3QgZ2V0IG1pbnVtIGVudHJ5LCBpdCBtZWFucyBpdCBhbHJlYWR5IHJlYWNoZXMKKwkJICogdGhlIGVuZCBvZiB0aGlzIGRpcmVjdG9yeQorCQkgKi8KKwkJaWYgKCFtaW5fZW50KSB7CisJCQlsYXN0X2VudC0+bGRlX3JlY2xlbiA9IDA7CisJCQloYXNoX29mZnNldCA9IE1EU19ESVJfRU5EX09GRjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZW50X3NpemUgPSBsZTE2X3RvX2NwdShtaW5fZW50LT5sZGVfcmVjbGVuKTsKKworCQkvKgorCQkgKiB0aGUgbGFzdCBlbnRyeSBsZGVfcmVjbGVuIGlzIDAsIGJ1dCBpdCBtaWdodCBub3QKKwkJICogdGhlIGVuZCBvZiB0aGlzIGVudHJ5IG9mIHRoaXMgdGVtcG9yYXkgZW50cnkKKwkJICovCisJCWlmICghZW50X3NpemUpCisJCQllbnRfc2l6ZSA9IGx1X2RpcmVudF9jYWxjX3NpemUoCisJCQkJCWxlMTZfdG9fY3B1KG1pbl9lbnQtPmxkZV9uYW1lbGVuKSwKKwkJCQkJbGUzMl90b19jcHUobWluX2VudC0+bGRlX2F0dHJzKSk7CisJCWlmIChlbnRfc2l6ZSA+IGxlZnRfYnl0ZXMpIHsKKwkJCWxhc3RfZW50LT5sZGVfcmVjbGVuID0gY3B1X3RvX2xlMTYoMCk7CisJCQloYXNoX29mZnNldCA9IGxlNjRfdG9fY3B1KG1pbl9lbnQtPmxkZV9oYXNoKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbWVtY3B5KGVudCwgbWluX2VudCwgZW50X3NpemUpOworCisJCS8qCisJCSAqIFJlcGxhY2UgLiB3aXRoIG1hc3RlciBGSUQgYW5kIFJlcGxhY2UgLi4gd2l0aCB0aGUgcGFyZW50IEZJRAorCQkgKiBvZiBtYXN0ZXIgb2JqZWN0CisJCSAqLworCQlpZiAoIXN0cm5jbXAoZW50LT5sZGVfbmFtZSwgIi4iLAorCQkJICAgICBsZTE2X3RvX2NwdShlbnQtPmxkZV9uYW1lbGVuKSkgJiYKKwkJICAgIGxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pID09IDEpCisJCQlmaWRfY3B1X3RvX2xlKCZlbnQtPmxkZV9maWQsICZtYXN0ZXJfZmlkKTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAoZW50LT5sZGVfbmFtZSwgIi4uIiwKKwkJCQkgIGxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pKSAmJgorCQkJIGxlMTZfdG9fY3B1KGVudC0+bGRlX25hbWVsZW4pID09IDIpCisJCQlmaWRfY3B1X3RvX2xlKCZlbnQtPmxkZV9maWQsICZvcF9kYXRhLT5vcF9maWQzKTsKKworCQlsZWZ0X2J5dGVzIC09IGVudF9zaXplOworCQllbnQtPmxkZV9yZWNsZW4gPSBjcHVfdG9fbGUxNihlbnRfc2l6ZSk7CisJCWxhc3RfZW50ID0gZW50OworCQllbnQgPSAodm9pZCAqKWVudCArIGVudF9zaXplOworCQloYXNoX29mZnNldCA9IGxlNjRfdG9fY3B1KG1pbl9lbnQtPmxkZV9oYXNoKTsKKwkJaWYgKGhhc2hfb2Zmc2V0ID09IE1EU19ESVJfRU5EX09GRikgeworCQkJbGFzdF9lbnQtPmxkZV9yZWNsZW4gPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKK291dDoKKwlpZiAobWluX2VudF9wYWdlKSB7CisJCWt1bm1hcChtaW5fZW50X3BhZ2UpOworCQlwdXRfcGFnZShtaW5fZW50X3BhZ2UpOworCX0KKworCWlmICh1bmxpa2VseShyYykpIHsKKwkJX19mcmVlX3BhZ2UoZW50X3BhZ2UpOworCQllbnRfcGFnZSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJaWYgKGVudCA9PSBhcmVhKQorCQkJZHAtPmxkcF9mbGFncyB8PSBMREZfRU1QVFk7CisJCWRwLT5sZHBfZmxhZ3MgPSBjcHVfdG9fbGUzMihkcC0+bGRwX2ZsYWdzKTsKKwkJZHAtPmxkcF9oYXNoX2VuZCA9IGNwdV90b19sZTY0KGhhc2hfb2Zmc2V0KTsKKwl9CisKKwkvKgorCSAqIFdlIGRvIG5vdCB3YW50IHRvIGFsbG9jYXRlIG1kX29wX2RhdGEgZHVyaW5nIGVhY2gKKwkgKiBkaXIgZW50cnkgcmVhZGluZywgc28gb3BfZGF0YSB3aWxsIGJlIHNoYXJlZCBieSBldmVyeSBzdHJpcGUsCisJICogdGhlbiB3ZSBuZWVkIHRvIHJlc3RvcmUgaXQgYmFjayB0byBvcmlnaW5hbCB2YWx1ZSBiZWZvcmUKKwkgKiByZXR1cm4gdG8gdGhlIHVwcGVyIGxheWVyCisJICovCisJb3BfZGF0YS0+b3BfZmlkMSA9IG1hc3Rlcl9maWQ7CisJb3BfZGF0YS0+b3BfZmlkMiA9IG1hc3Rlcl9maWQ7CisJb3BfZGF0YS0+b3BfZGF0YSA9IG1hc3Rlcl9pbm9kZTsKKworCSpwcGFnZSA9IGVudF9wYWdlOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGxtdl9yZWFkX3BhZ2Uoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCisJCQkgc3RydWN0IG1kX2NhbGxiYWNrICpjYl9vcCwgX191NjQgb2Zmc2V0LAorCQkJIHN0cnVjdCBwYWdlICoqcHBhZ2UpCit7CisJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG9wX2RhdGEtPm9wX21lYTE7CisJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGV4cC0+ZXhwX29iZDsKKwlzdHJ1Y3QgbG12X29iZCAqbG12ID0gJm9iZC0+dS5sbXY7CisJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0OworCWludCByYzsKKworCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmICh1bmxpa2VseShsc20pKSB7CisJCXJjID0gbG12X3JlYWRfc3RyaXBlZF9wYWdlKGV4cCwgb3BfZGF0YSwgY2Jfb3AsIG9mZnNldCwgcHBhZ2UpOworCQlyZXR1cm4gcmM7CisJfQogCiAJdGd0ID0gbG12X2ZpbmRfdGFyZ2V0KGxtdiwgJm9wX2RhdGEtPm9wX2ZpZDEpOwogCWlmIChJU19FUlIodGd0KSkKIAkJcmV0dXJuIFBUUl9FUlIodGd0KTsKIAotCXJjID0gbWRfcmVhZHBhZ2UodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBwYWdlcywgcmVxdWVzdCk7Ci0JaWYgKHJjICE9IDApCi0JCXJldHVybiByYzsKLQotCW5jZnNwZ3MgPSAoKCpyZXF1ZXN0KS0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkICsgUEFHRV9TSVpFIC0gMSkKLQkJID4+IFBBR0VfU0hJRlQ7Ci0Jbmx1cGdzID0gKCpyZXF1ZXN0KS0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkID4+IExVX1BBR0VfU0hJRlQ7Ci0JTEFTU0VSVCghKCgqcmVxdWVzdCktPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZCAmIH5MVV9QQUdFX01BU0spKTsKLQlMQVNTRVJUKG5jZnNwZ3MgPiAwICYmIG5jZnNwZ3MgPD0gb3BfZGF0YS0+b3BfbnBhZ2VzKTsKLQotCUNERUJVRyhEX0lOT0RFLCAicmVhZCAlZCglZCkvJWQgcGFnZXNcbiIsIG5jZnNwZ3MsIG5sdXBncywKLQkgICAgICAgb3BfZGF0YS0+b3BfbnBhZ2VzKTsKLQotCWxtdl9hZGp1c3RfZGlycGFnZXMocGFnZXMsIG5jZnNwZ3MsIG5sdXBncyk7CisJcmMgPSBtZF9yZWFkX3BhZ2UodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCBjYl9vcCwgb2Zmc2V0LCBwcGFnZSk7CiAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qKgorICogVW5saW5rIGEgZmlsZS9kaXJlY3RvcnkKKyAqCisgKiBVbmxpbmsgYSBmaWxlIG9yIGRpcmVjdG9yeSB1bmRlciB0aGUgcGFyZW50IGRpci4gVGhlIHVubGluayByZXF1ZXN0CisgKiB1c3VhbGx5IHdpbGwgYmUgc2VudCB0byB0aGUgTURUIHdoZXJlIHRoZSBjaGlsZCBpcyBsb2NhdGVkLCBidXQgaWYKKyAqIHRoZSBjbGllbnQgZG9lcyBub3QgaGF2ZSB0aGUgY2hpbGQgRklEIHRoZW4gcmVxdWVzdCB3aWxsIGJlIHNlbnQgdG8gdGhlCisgKiBNRFQgd2hlcmUgdGhlIHBhcmVudCBpcyBsb2NhdGVkLgorICoKKyAqIElmIHRoZSBwYXJlbnQgaXMgYSBzdHJpcGVkIGRpcmVjdG9yeSB0aGVuIGl0IGFsc28gbmVlZHMgdG8gbG9jYXRlIHdoaWNoCisgKiBzdHJpcGUgdGhlIG5hbWUgb2YgdGhlIGNoaWxkIGlzIGxvY2F0ZWQsIGFuZCByZXBsYWNlIHRoZSBwYXJlbnQgRklECisgKiAoQG9wLT5vcF9maWQxKSB3aXRoIHRoZSBzdHJpcGUgRklELiBOb3RlOiBpZiB0aGUgc3RyaXBlIGlzIHVua25vd24sCisgKiBpdCB3aWxsIHdhbGsgdGhyb3VnaCBhbGwgb2Ygc3ViLXN0cmlwZXMgdW50aWwgdGhlIGNoaWxkIGlzIGJlaW5nCisgKiB1bmxpbmtlZCBmaW5hbGx5LgorICoKKyAqIFxwYXJhbVtpbl0gZXhwCWV4cG9ydCByZWZlciB0byBMTVYKKyAqIFxwYXJhbVtpbl0gb3BfZGF0YQlkaWZmZXJlbnQgcGFyYW1ldGVycyB0cmFuc2ZlcnJlZCBiZXdlZW4gY2xpZW50CisgKgkJCU1EIHN0YWNrcywgbmFtZSwgbmFtZWxlbiwgRklEcyBldGMuCisgKgkJCW9wX2ZpZDEgaXMgdGhlIHBhcmVudCBGSUQsIG9wX2ZpZDIgaXMgdGhlIGNoaWxkCisgKgkJCUZJRC4KKyAqIFxwYXJhbVtvdXRdIHJlcXVlc3QgcG9pbnQgdG8gdGhlIHJlcXVlc3Qgb2YgdW5saW5rLgorICoKKyAqIHJldHZhbAkJMCBpZiBzdWNjZWVkCisgKgkJCW5lZ2F0aXZlIGVycm5vIGlmIGZhaWxlZC4KKyAqLwogc3RhdGljIGludCBsbXZfdW5saW5rKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAogCQkgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQogewotCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CisJc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSA9IG9wX2RhdGEtPm9wX21lYTE7CisJc3RydWN0IG9iZF9kZXZpY2UgICAgKm9iZCA9IGV4cC0+ZXhwX29iZDsKIAlzdHJ1Y3QgbG12X29iZAkgICpsbXYgPSAmb2JkLT51LmxtdjsKKwlzdHJ1Y3QgbG12X3RndF9kZXNjICpwYXJlbnRfdGd0ID0gTlVMTDsKIAlzdHJ1Y3QgbG12X3RndF9kZXNjICAgICAqdGd0ID0gTlVMTDsKIAlzdHJ1Y3QgbWR0X2JvZHkJCSpib2R5OworCWludCBzdHJpcGVfaW5kZXggPSAwOwogCWludAkJICAgICByYzsKIAogCXJjID0gbG12X2NoZWNrX2Nvbm5lY3Qob2JkKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLXJldHJ5OgorcmV0cnlfdW5saW5rOgorCS8qIEZvciBzdHJpcGVkIGRpciwgd2UgbmVlZCB0byBsb2NhdGUgdGhlIHBhcmVudCBhcyB3ZWxsICovCisJaWYgKGxzbSkgeworCQlzdHJ1Y3QgbG12X3RndF9kZXNjICp0bXA7CisKKwkJTEFTU0VSVChvcF9kYXRhLT5vcF9uYW1lICYmIG9wX2RhdGEtPm9wX25hbWVsZW4pOworCisJCXRtcCA9IGxtdl9sb2NhdGVfdGFyZ2V0X2Zvcl9uYW1lKGxtdiwgbHNtLAorCQkJCQkJIG9wX2RhdGEtPm9wX25hbWUsCisJCQkJCQkgb3BfZGF0YS0+b3BfbmFtZWxlbiwKKwkJCQkJCSAmb3BfZGF0YS0+b3BfZmlkMSwKKwkJCQkJCSAmb3BfZGF0YS0+b3BfbWRzKTsKKworCQkvKgorCQkgKiByZXR1cm4gLUVCQURGRCBtZWFucyB1bmtub3duIGhhc2ggdHlwZSwgbWlnaHQKKwkJICogbmVlZCB0cnkgYWxsIHN1Yi1zdHJpcGUgaGVyZQorCQkgKi8KKwkJaWYgKElTX0VSUih0bXApICYmIFBUUl9FUlIodG1wKSAhPSAtRUJBREZEKQorCQkJcmV0dXJuIFBUUl9FUlIodG1wKTsKKworCQkvKgorCQkgKiBOb3RlOiBib3RoIG1pZ3JhdGluZyBkaXIgYW5kIHVua25vd24gaGFzaCBkaXIgbmVlZCB0bworCQkgKiB0cnkgYWxsIG9mIHN1Yi1zdHJpcGVzLCBzbyB3ZSBuZWVkIHN0YXJ0IHNlYXJjaCB0aGUKKwkJICogbmFtZSBmcm9tIHN0cmlwZSAwLCBidXQgbWlncmF0aW5nIGRpciBpcyBhbHJlYWR5IGhhbmRsZWQKKwkJICogaW5zaWRlIGxtdl9sb2NhdGVfdGFyZ2V0X2Zvcl9uYW1lKCksIHNvIHdlIG9ubHkgY2hlY2sKKwkJICogdW5rbm93biBoYXNoIHR5cGUgZGlyZWN0b3J5IGhlcmUKKwkJICovCisJCWlmICghbG12X2lzX2tub3duX2hhc2hfdHlwZShsc20tPmxzbV9tZF9oYXNoX3R5cGUpKSB7CisJCQlzdHJ1Y3QgbG12X29pbmZvICpvaW5mbzsKKworCQkJb2luZm8gPSAmbHNtLT5sc21fbWRfb2luZm9bc3RyaXBlX2luZGV4XTsKKworCQkJb3BfZGF0YS0+b3BfZmlkMSA9IG9pbmZvLT5sbW9fZmlkOworCQkJb3BfZGF0YS0+b3BfbWRzID0gb2luZm8tPmxtb19tZHM7CisJCX0KKwl9CisKK3RyeV9uZXh0X3N0cmlwZToKIAkvKiBTZW5kIHVubGluayByZXF1ZXN0cyB0byB0aGUgTURUIHdoZXJlIHRoZSBjaGlsZCBpcyBsb2NhdGVkICovCiAJaWYgKGxpa2VseSghZmlkX2lzX3plcm8oJm9wX2RhdGEtPm9wX2ZpZDIpKSkKLQkJdGd0ID0gbG12X2xvY2F0ZV9tZHMobG12LCBvcF9kYXRhLCAmb3BfZGF0YS0+b3BfZmlkMik7CisJCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZvcF9kYXRhLT5vcF9maWQyKTsKKwllbHNlIGlmIChsc20pCisJCXRndCA9IGxtdl9nZXRfdGFyZ2V0KGxtdiwgb3BfZGF0YS0+b3BfbWRzLCBOVUxMKTsKIAllbHNlCiAJCXRndCA9IGxtdl9sb2NhdGVfbWRzKGxtdiwgb3BfZGF0YSwgJm9wX2RhdGEtPm9wX2ZpZDEpOworCiAJaWYgKElTX0VSUih0Z3QpKQogCQlyZXR1cm4gUFRSX0VSUih0Z3QpOwogCkBAIC0yMjAzLDI5ICsyNTQ0LDU3IEBACiAJLyoKIAkgKiBDYW5jZWwgRlVMTCBsb2NrcyBvbiBjaGlsZCAoZmlkMykuCiAJICovCi0JcmMgPSBsbXZfZWFybHlfY2FuY2VsKGV4cCwgb3BfZGF0YSwgdGd0LT5sdGRfaWR4LCBMQ0tfRVgsCi0JCQkgICAgICBNRFNfSU5PREVMT0NLX0ZVTEwsIE1GX01EQ19DQU5DRUxfRklEMyk7CisJcGFyZW50X3RndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZvcF9kYXRhLT5vcF9maWQxKTsKKwlpZiAoSVNfRVJSKHBhcmVudF90Z3QpKQorCQlyZXR1cm4gUFRSX0VSUihwYXJlbnRfdGd0KTsKIAorCWlmIChwYXJlbnRfdGd0ICE9IHRndCkgeworCQlyYyA9IGxtdl9lYXJseV9jYW5jZWwoZXhwLCBwYXJlbnRfdGd0LCBvcF9kYXRhLCB0Z3QtPmx0ZF9pZHgsCisJCQkJICAgICAgTENLX0VYLCBNRFNfSU5PREVMT0NLX0xPT0tVUCwKKwkJCQkgICAgICBNRl9NRENfQ0FOQ0VMX0ZJRDMpOworCX0KKworCXJjID0gbG12X2Vhcmx5X2NhbmNlbChleHAsIE5VTEwsIG9wX2RhdGEsIHRndC0+bHRkX2lkeCwgTENLX0VYLAorCQkJICAgICAgTURTX0lOT0RFTE9DS19GVUxMLCBNRl9NRENfQ0FOQ0VMX0ZJRDMpOwogCWlmIChyYyAhPSAwKQogCQlyZXR1cm4gcmM7CiAKLQlDREVCVUcoRF9JTk9ERSwgInVubGluayB3aXRoIGZpZD0iREZJRCIvIkRGSUQiIC0+IG1kcyAjJWRcbiIsCisJQ0RFQlVHKERfSU5PREUsICJ1bmxpbmsgd2l0aCBmaWQ9IiBERklEICIvIiBERklEICIgLT4gbWRzICMldVxuIiwKIAkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLCB0Z3QtPmx0ZF9pZHgpOwogCiAJcmMgPSBtZF91bmxpbmsodGd0LT5sdGRfZXhwLCBvcF9kYXRhLCByZXF1ZXN0KTsKLQlpZiAocmMgIT0gMCAmJiByYyAhPSAtRVJFTU9URSkKKwlpZiAocmMgIT0gMCAmJiByYyAhPSAtRVJFTU9URSAgJiYgcmMgIT0gLUVOT0VOVCkKIAkJcmV0dXJuIHJjOwogCisJLyogVHJ5IG5leHQgc3RyaXBlIGlmIGl0IGlzIG5lZWRlZC4gKi8KKwlpZiAocmMgPT0gLUVOT0VOVCAmJiBsc20gJiYgbG12X25lZWRfdHJ5X2FsbF9zdHJpcGVzKGxzbSkpIHsKKwkJc3RydWN0IGxtdl9vaW5mbyAqb2luZm87CisKKwkJc3RyaXBlX2luZGV4Kys7CisJCWlmIChzdHJpcGVfaW5kZXggPj0gbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50KQorCQkJcmV0dXJuIHJjOworCisJCW9pbmZvID0gJmxzbS0+bHNtX21kX29pbmZvW3N0cmlwZV9pbmRleF07CisKKwkJb3BfZGF0YS0+b3BfZmlkMSA9IG9pbmZvLT5sbW9fZmlkOworCQlvcF9kYXRhLT5vcF9tZHMgPSBvaW5mby0+bG1vX21kczsKKworCQlwdGxycGNfcmVxX2ZpbmlzaGVkKCpyZXF1ZXN0KTsKKwkJKnJlcXVlc3QgPSBOVUxMOworCisJCWdvdG8gdHJ5X25leHRfc3RyaXBlOworCX0KKwogCWJvZHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCYoKnJlcXVlc3QpLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKIAlpZiAoIWJvZHkpCiAJCXJldHVybiAtRVBST1RPOwogCiAJLyogTm90IGNyb3NzLXJlZiBjYXNlLCBqdXN0IGdldCBvdXQgb2YgaGVyZS4gKi8KLQlpZiAobGlrZWx5KCEoYm9keS0+dmFsaWQgJiBPQkRfTURfTURTKSkpCi0JCXJldHVybiAwOworCWlmIChsaWtlbHkoIShib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfTURTKSkpCisJCXJldHVybiByYzsKIAogCUNERUJVRyhEX0lOT0RFLCAiJXM6IHRyeSB1bmxpbmsgdG8gYW5vdGhlciBNRFQgZm9yICJERklEIlxuIiwKLQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgUEZJRCgmYm9keS0+ZmlkMSkpOworCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCBQRklEKCZib2R5LT5tYm9fZmlkMSkpOwogCiAJLyogVGhpcyBpcyBhIHJlbW90ZSBvYmplY3QsIHRyeSByZW1vdGUgTURULCBOb3RlOiBpdCBtYXkKIAkgKiB0cnkgbW9yZSB0aGFuIDEgdGltZSBoZXJlLCBDb25zaWRlcmluZyBmb2xsb3dpbmcgY2FzZQpAQCAtMjI0NywxMSArMjYxNiwxMSBAQAogCSAqIEluIHRoZW9yeSwgaXQgbWlnaHQgdHJ5IHVubGltaXRlZCB0aW1lIGhlcmUsIGJ1dCBpdCBzaG91bGQKIAkgKiBiZSB2ZXJ5IHJhcmUgY2FzZS4KIAkgKi8KLQlvcF9kYXRhLT5vcF9maWQyID0gYm9keS0+ZmlkMTsKKwlvcF9kYXRhLT5vcF9maWQyID0gYm9keS0+bWJvX2ZpZDE7CiAJcHRscnBjX3JlcV9maW5pc2hlZCgqcmVxdWVzdCk7CiAJKnJlcXVlc3QgPSBOVUxMOwogCi0JZ290byByZXRyeTsKKwlnb3RvIHJldHJ5X3VubGluazsKIH0KIAogc3RhdGljIGludCBsbXZfcHJlY2xlYW51cChzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkLCBlbnVtIG9iZF9jbGVhbnVwX3N0YWdlIHN0YWdlKQpAQCAtMjI3NCw2ICsyNjQzLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogR2V0IGJ5IGtleSBhIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIExNViBkZXZpY2UuCisgKgorICogRGlzcGF0Y2ggcmVxdWVzdCB0byBsb3dlci1sYXllciBkZXZpY2VzIGFzIG5lZWRlZC4KKyAqCisgKiBccGFyYW1baW5dICBlbnYJZXhlY3V0aW9uIGVudmlyb25tZW50IGZvciB0aGlzIHRocmVhZAorICogXHBhcmFtW2luXSAgZXhwCWV4cG9ydCBmb3IgdGhlIExNViBkZXZpY2UKKyAqIFxwYXJhbVtpbl0gIGtleWxlbglsZW5ndGggb2Yga2V5IGlkZW50aWZpZXIKKyAqIFxwYXJhbVtpbl0gIGtleQlpZGVudGlmaWVyIG9mIGtleSB0byBnZXQgdmFsdWUgZm9yCisgKiBccGFyYW1baW5dICB2YWxsZW4Jc2l6ZSBvZiBcYSB2YWwKKyAqIFxwYXJhbVtvdXRdIHZhbAlwb2ludGVyIHRvIHN0b3JhZ2UgbG9jYXRpb24gZm9yIHZhbHVlCisgKiBccGFyYW1baW5dICBsc20Jb3B0aW9uYWwgc3RyaXBpbmcgbWV0YWRhdGEgb2Ygb2JqZWN0CisgKgorICogXHJldHZhbCAwCQlvbiBzdWNjZXNzCisgKiBccmV0dmFsIG5lZ2F0aXZlCW5lZ2F0ZWQgZXJybm8gb24gZmFpbHVyZQorICovCiBzdGF0aWMgaW50IGxtdl9nZXRfaW5mbyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCQlfX3UzMiBrZXlsZW4sIHZvaWQgKmtleSwgX191MzIgKnZhbGxlbiwgdm9pZCAqdmFsLAogCQkJc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSkKQEAgLTIzMzcsNiArMjcyMiwyMiBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCisvKioKKyAqIEFzeW5jaHJvbm91c2x5IHNldCBieSBrZXkgYSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBMTVYgZGV2aWNlLgorICoKKyAqIERpc3BhdGNoIHJlcXVlc3QgdG8gbG93ZXItbGF5ZXIgZGV2aWNlcyBhcyBuZWVkZWQuCisgKgorICogXHBhcmFtW2luXSBlbnYJZXhlY3V0aW9uIGVudmlyb25tZW50IGZvciB0aGlzIHRocmVhZAorICogXHBhcmFtW2luXSBleHAJZXhwb3J0IGZvciB0aGUgTE1WIGRldmljZQorICogXHBhcmFtW2luXSBrZXlsZW4JbGVuZ3RoIG9mIGtleSBpZGVudGlmaWVyCisgKiBccGFyYW1baW5dIGtleQlpZGVudGlmaWVyIG9mIGtleSB0byBzdG9yZSB2YWx1ZSBmb3IKKyAqIFxwYXJhbVtpbl0gdmFsbGVuCXNpemUgb2YgdmFsdWUgdG8gc3RvcmUKKyAqIFxwYXJhbVtpbl0gdmFsCXBvaW50ZXIgdG8gZGF0YSB0byBiZSBzdG9yZWQKKyAqIFxwYXJhbVtpbl0gc2V0CW9wdGlvbmFsIGxpc3Qgb2YgcmVsYXRlZCBwdGxycGMgcmVxdWVzdHMKKyAqCisgKiBccmV0dmFsIDAJCW9uIHN1Y2Nlc3MKKyAqIFxyZXR2YWwgbmVnYXRpdmUJbmVnYXRlZCBlcnJubyBvbiBmYWlsdXJlCisgKi8KIHN0YXRpYyBpbnQgbG12X3NldF9pbmZvX2FzeW5jKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCSAgICAgIHUzMiBrZXlsZW4sIHZvaWQgKmtleSwgdTMyIHZhbGxlbiwKIAkJCSAgICAgIHZvaWQgKnZhbCwgc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqc2V0KQpAQCAtMjM1NCw3ICsyNzU1LDggQEAKIAl9CiAJbG12ID0gJm9iZC0+dS5sbXY7CiAKLQlpZiAoS0VZX0lTKEtFWV9SRUFEX09OTFkpIHx8IEtFWV9JUyhLRVlfRkxVU0hfQ1RYKSkgeworCWlmIChLRVlfSVMoS0VZX1JFQURfT05MWSkgfHwgS0VZX0lTKEtFWV9GTFVTSF9DVFgpIHx8CisJICAgIEtFWV9JUyhLRVlfREVGQVVMVF9FQVNJWkUpKSB7CiAJCWludCBpLCBlcnIgPSAwOwogCiAJCWZvciAoaSA9IDA7IGkgPCBsbXYtPmRlc2MubGRfdGd0X2NvdW50OyBpKyspIHsKQEAgLTIzNzUsMTA1ICsyNzc3LDI0NyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IGxtdl9wYWNrbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAotCQkgICAgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQorc3RhdGljIGludCBsbXZfcGFja19tZF92MShjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkJICBzdHJ1Y3QgbG12X21kc19tZF92MSAqbG1tMSkKIHsKLQlzdHJ1Y3Qgb2JkX2RldmljZQkgKm9iZCA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKLQlzdHJ1Y3QgbG12X29iZAkgICAgKmxtdiA9ICZvYmQtPnUubG12OwotCXN0cnVjdCBsbXZfc3RyaXBlX21kICAgICAgKm1lYXA7Ci0Jc3RydWN0IGxtdl9zdHJpcGVfbWQgICAgICAqbHNtcDsKLQlpbnQJCQltZWFfc2l6ZTsKLQlpbnQJCQlpOworCWludCBjcGxlbjsKKwlpbnQgaTsKIAotCW1lYV9zaXplID0gbG12X2dldF9lYXNpemUobG12KTsKLQlpZiAoIWxtbXApCi0JCXJldHVybiBtZWFfc2l6ZTsKKwlsbW0xLT5sbXZfbWFnaWMgPSBjcHVfdG9fbGUzMihsc20tPmxzbV9tZF9tYWdpYyk7CisJbG1tMS0+bG12X3N0cmlwZV9jb3VudCA9IGNwdV90b19sZTMyKGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCk7CisJbG1tMS0+bG12X21hc3Rlcl9tZHRfaW5kZXggPSBjcHVfdG9fbGUzMihsc20tPmxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4KTsKKwlsbW0xLT5sbXZfaGFzaF90eXBlID0gY3B1X3RvX2xlMzIobHNtLT5sc21fbWRfaGFzaF90eXBlKTsKKwljcGxlbiA9IHN0cmxjcHkobG1tMS0+bG12X3Bvb2xfbmFtZSwgbHNtLT5sc21fbWRfcG9vbF9uYW1lLAorCQkJc2l6ZW9mKGxtbTEtPmxtdl9wb29sX25hbWUpKTsKKwlpZiAoY3BsZW4gPj0gc2l6ZW9mKGxtbTEtPmxtdl9wb29sX25hbWUpKQorCQlyZXR1cm4gLUUyQklHOwogCisJZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudDsgaSsrKQorCQlmaWRfY3B1X3RvX2xlKCZsbW0xLT5sbXZfc3RyaXBlX2ZpZHNbaV0sCisJCQkgICAgICAmbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2xtdl9wYWNrX21kKHVuaW9uIGxtdl9tZHNfbWQgKipsbW1wLCBjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCSAgICBpbnQgc3RyaXBlX2NvdW50KQoreworCWludCBsbW1fc2l6ZSA9IDAsIHJjID0gMDsKKwlib29sIGFsbG9jYXRlZCA9IGZhbHNlOworCisJTEFTU0VSVChsbW1wKTsKKworCS8qIEZyZWUgbG1tICovCiAJaWYgKCpsbW1wICYmICFsc20pIHsKKwkJaW50IHN0cmlwZV9jbnQ7CisKKwkJc3RyaXBlX2NudCA9IGxtdl9tZHNfbWRfc3RyaXBlX2NvdW50X2dldCgqbG1tcCk7CisJCWxtbV9zaXplID0gbG12X21kc19tZF9zaXplKHN0cmlwZV9jbnQsCisJCQkJCSAgIGxlMzJfdG9fY3B1KCgqbG1tcCktPmxtdl9tYWdpYykpOworCQlpZiAoIWxtbV9zaXplKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWt2ZnJlZSgqbG1tcCk7CiAJCSpsbW1wID0gTlVMTDsKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKCEqbG1tcCkgewotCQkqbG1tcCA9IGxpYmNmc19rdnphbGxvYyhtZWFfc2l6ZSwgR0ZQX05PRlMpOworCS8qIEFsbG9jIGxtbSAqLworCWlmICghKmxtbXAgJiYgIWxzbSkgeworCQlsbW1fc2l6ZSA9IGxtdl9tZHNfbWRfc2l6ZShzdHJpcGVfY291bnQsIExNVl9NQUdJQyk7CisJCUxBU1NFUlQobG1tX3NpemUgPiAwKTsKKwkJKmxtbXAgPSBsaWJjZnNfa3Z6YWxsb2MobG1tX3NpemUsIEdGUF9OT0ZTKTsKIAkJaWYgKCEqbG1tcCkKIAkJCXJldHVybiAtRU5PTUVNOworCQlsbXZfbWRzX21kX3N0cmlwZV9jb3VudF9zZXQoKmxtbXAsIHN0cmlwZV9jb3VudCk7CisJCSgqbG1tcCktPmxtdl9tYWdpYyA9IGNwdV90b19sZTMyKExNVl9NQUdJQyk7CisJCXJldHVybiBsbW1fc2l6ZTsKIAl9CiAKLQlpZiAoIWxzbSkKLQkJcmV0dXJuIG1lYV9zaXplOwotCi0JbHNtcCA9IChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKWxzbTsKLQltZWFwID0gKHN0cnVjdCBsbXZfc3RyaXBlX21kICopKmxtbXA7Ci0KLQlpZiAobHNtcC0+bWVhX21hZ2ljICE9IE1FQV9NQUdJQ19MQVNUX0NIQVIgJiYKLQkgICAgbHNtcC0+bWVhX21hZ2ljICE9IE1FQV9NQUdJQ19BTExfQ0hBUlMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbWVhcC0+bWVhX21hZ2ljID0gY3B1X3RvX2xlMzIobHNtcC0+bWVhX21hZ2ljKTsKLQltZWFwLT5tZWFfY291bnQgPSBjcHVfdG9fbGUzMihsc21wLT5tZWFfY291bnQpOwotCW1lYXAtPm1lYV9tYXN0ZXIgPSBjcHVfdG9fbGUzMihsc21wLT5tZWFfbWFzdGVyKTsKLQotCWZvciAoaSA9IDA7IGkgPCBsbXYtPmRlc2MubGRfdGd0X2NvdW50OyBpKyspIHsKLQkJbWVhcC0+bWVhX2lkc1tpXSA9IGxzbXAtPm1lYV9pZHNbaV07Ci0JCWZpZF9jcHVfdG9fbGUoJm1lYXAtPm1lYV9pZHNbaV0sICZsc21wLT5tZWFfaWRzW2ldKTsKKwkvKiBwYWNrIGxtbSAqLworCUxBU1NFUlQobHNtKTsKKwlsbW1fc2l6ZSA9IGxtdl9tZHNfbWRfc2l6ZShsc20tPmxzbV9tZF9zdHJpcGVfY291bnQsCisJCQkJICAgbHNtLT5sc21fbWRfbWFnaWMpOworCWlmICghKmxtbXApIHsKKwkJKmxtbXAgPSBsaWJjZnNfa3Z6YWxsb2MobG1tX3NpemUsIEdGUF9OT0ZTKTsKKwkJaWYgKCEqbG1tcCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlhbGxvY2F0ZWQgPSB0cnVlOwogCX0KIAotCXJldHVybiBtZWFfc2l6ZTsKKwlzd2l0Y2ggKGxzbS0+bHNtX21kX21hZ2ljKSB7CisJY2FzZSBMTVZfTUFHSUNfVjE6CisJCXJjID0gbG12X3BhY2tfbWRfdjEobHNtLCAmKCpsbW1wKS0+bG12X21kX3YxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlpZiAocmMgJiYgYWxsb2NhdGVkKSB7CisJCWt2ZnJlZSgqbG1tcCk7CisJCSpsbW1wID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gbG1tX3NpemU7CiB9CiAKLXN0YXRpYyBpbnQgbG12X3VucGFja21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCwKLQkJCXN0cnVjdCBsb3ZfbWRzX21kICpsbW0sIGludCBsbW1fc2l6ZSkKK3N0YXRpYyBpbnQgbG12X3VucGFja19tZF92MShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkJICAgIGNvbnN0IHN0cnVjdCBsbXZfbWRzX21kX3YxICpsbW0xKQogewotCXN0cnVjdCBvYmRfZGV2aWNlCSAgKm9iZCA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKLQlzdHJ1Y3QgbG12X3N0cmlwZV9tZCAgICAgICoqdG1lYSA9IChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKilsc21wOwotCXN0cnVjdCBsbXZfc3RyaXBlX21kICAgICAgICptZWEgPSAoc3RydWN0IGxtdl9zdHJpcGVfbWQgKilsbW07Ci0Jc3RydWN0IGxtdl9vYmQJICAgICAqbG12ID0gJm9iZC0+dS5sbXY7Ci0JaW50CQkJIG1lYV9zaXplOwotCWludAkJCSBpOwotCV9fdTMyCQkgICAgICAgbWFnaWM7CisJc3RydWN0IGxtdl9vYmQgKmxtdiA9ICZleHAtPmV4cF9vYmQtPnUubG12OworCWludCBzdHJpcGVfY291bnQ7CisJaW50IHJjID0gMDsKKwlpbnQgY3BsZW47CisJaW50IGk7CiAKLQltZWFfc2l6ZSA9IGxtdl9nZXRfZWFzaXplKGxtdik7Ci0JaWYgKCFsc21wKQotCQlyZXR1cm4gbWVhX3NpemU7CisJbHNtLT5sc21fbWRfbWFnaWMgPSBsZTMyX3RvX2NwdShsbW0xLT5sbXZfbWFnaWMpOworCWxzbS0+bHNtX21kX3N0cmlwZV9jb3VudCA9IGxlMzJfdG9fY3B1KGxtbTEtPmxtdl9zdHJpcGVfY291bnQpOworCWxzbS0+bHNtX21kX21hc3Rlcl9tZHRfaW5kZXggPSBsZTMyX3RvX2NwdShsbW0xLT5sbXZfbWFzdGVyX21kdF9pbmRleCk7CisJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX1VOS05PV05fTE1WX1NUUklQRSkpCisJCWxzbS0+bHNtX21kX2hhc2hfdHlwZSA9IExNVl9IQVNIX1RZUEVfVU5LTk9XTjsKKwllbHNlCisJCWxzbS0+bHNtX21kX2hhc2hfdHlwZSA9IGxlMzJfdG9fY3B1KGxtbTEtPmxtdl9oYXNoX3R5cGUpOworCWxzbS0+bHNtX21kX2xheW91dF92ZXJzaW9uID0gbGUzMl90b19jcHUobG1tMS0+bG12X2xheW91dF92ZXJzaW9uKTsKKwljcGxlbiA9IHN0cmxjcHkobHNtLT5sc21fbWRfcG9vbF9uYW1lLCBsbW0xLT5sbXZfcG9vbF9uYW1lLAorCQkJc2l6ZW9mKGxzbS0+bHNtX21kX3Bvb2xfbmFtZSkpOwogCi0JaWYgKCpsc21wICYmICFsbW0pIHsKLQkJa3ZmcmVlKCp0bWVhKTsKKwlpZiAoY3BsZW4gPj0gc2l6ZW9mKGxzbS0+bHNtX21kX3Bvb2xfbmFtZSkpCisJCXJldHVybiAtRTJCSUc7CisKKwlDREVCVUcoRF9JTkZPLCAidW5wYWNrIGxzbSBjb3VudCAlZCwgbWFzdGVyICVkIGhhc2hfdHlwZSAlZCBsYXlvdXRfdmVyc2lvbiAlZFxuIiwKKwkgICAgICAgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50LCBsc20tPmxzbV9tZF9tYXN0ZXJfbWR0X2luZGV4LAorCSAgICAgICBsc20tPmxzbV9tZF9oYXNoX3R5cGUsIGxzbS0+bHNtX21kX2xheW91dF92ZXJzaW9uKTsKKworCXN0cmlwZV9jb3VudCA9IGxlMzJfdG9fY3B1KGxtbTEtPmxtdl9zdHJpcGVfY291bnQpOworCWZvciAoaSA9IDA7IGkgPCBzdHJpcGVfY291bnQ7IGkrKykgeworCQlmaWRfbGVfdG9fY3B1KCZsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fZmlkLAorCQkJICAgICAgJmxtbTEtPmxtdl9zdHJpcGVfZmlkc1tpXSk7CisJCXJjID0gbG12X2ZsZF9sb29rdXAobG12LCAmbHNtLT5sc21fbWRfb2luZm9baV0ubG1vX2ZpZCwKKwkJCQkgICAgJmxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19tZHMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJCUNERUJVRyhEX0lORk8sICJ1bnBhY2sgZmlkICMlZCAiREZJRCJcbiIsIGksCisJCSAgICAgICBQRklEKCZsc20tPmxzbV9tZF9vaW5mb1tpXS5sbW9fZmlkKSk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgbG12X3VucGFja19tZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKmxzbXAsCisJCSAgY29uc3QgdW5pb24gbG12X21kc19tZCAqbG1tLCBpbnQgc3RyaXBlX2NvdW50KQoreworCXN0cnVjdCBsbXZfc3RyaXBlX21kICpsc207CisJYm9vbCBhbGxvY2F0ZWQgPSBmYWxzZTsKKwlpbnQgbHNtX3NpemUsIHJjOworCisJTEFTU0VSVChsc21wKTsKKworCWxzbSA9ICpsc21wOworCS8qIEZyZWUgbWVtbWQgKi8KKwlpZiAobHNtICYmICFsbW0pIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMTsgaSA8IGxzbS0+bHNtX21kX3N0cmlwZV9jb3VudDsgaSsrKSB7CisJCQkvKgorCQkJICogRm9yIG1pZ3JhdGluZyBpbm9kZSwgdGhlIG1hc3RlciBzdHJpcGUgYW5kIG1hc3RlcgorCQkJICogb2JqZWN0IHdpbGwgYmUgdGhlIHNhbWUsIHNvIGRvIG5vdCBuZWVkIGlwdXQsIHNlZQorCQkJICogbGxfdXBkYXRlX2xzbV9tZAorCQkJICovCisJCQlpZiAoIShsc20tPmxzbV9tZF9oYXNoX3R5cGUgJiBMTVZfSEFTSF9GTEFHX01JR1JBVElPTiAmJgorCQkJICAgICAgIWkpICYmIGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290KQorCQkJCWlwdXQobHNtLT5sc21fbWRfb2luZm9baV0ubG1vX3Jvb3QpOworCQl9CisKKwkJa3ZmcmVlKGxzbSk7CiAJCSpsc21wID0gTlVMTDsKIAkJcmV0dXJuIDA7CiAJfQogCi0JTEFTU0VSVChtZWFfc2l6ZSA9PSBsbW1fc2l6ZSk7CisJLyogQWxsb2MgbWVtbWQgKi8KKwlpZiAoIWxzbSAmJiAhbG1tKSB7CisJCWxzbV9zaXplID0gbG12X3N0cmlwZV9tZF9zaXplKHN0cmlwZV9jb3VudCk7CisJCWxzbSA9IGxpYmNmc19rdnphbGxvYyhsc21fc2l6ZSwgR0ZQX05PRlMpOworCQlpZiAoIWxzbSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlsc20tPmxzbV9tZF9zdHJpcGVfY291bnQgPSBzdHJpcGVfY291bnQ7CisJCSpsc21wID0gbHNtOworCQlyZXR1cm4gMDsKKwl9CiAKLQkqdG1lYSA9IGxpYmNmc19rdnphbGxvYyhtZWFfc2l6ZSwgR0ZQX05PRlMpOwotCWlmICghKnRtZWEpCi0JCXJldHVybiAtRU5PTUVNOworCWlmIChsZTMyX3RvX2NwdShsbW0tPmxtdl9tYWdpYykgPT0gTE1WX01BR0lDX1NUUklQRSkKKwkJcmV0dXJuIC1FUEVSTTsKIAotCWlmICghbG1tKQotCQlyZXR1cm4gbWVhX3NpemU7CisJLyogVW5wYWNrIG1lbW1kICovCisJaWYgKGxlMzJfdG9fY3B1KGxtbS0+bG12X21hZ2ljKSAhPSBMTVZfTUFHSUNfVjEgJiYKKwkgICAgbGUzMl90b19jcHUobG1tLT5sbXZfbWFnaWMpICE9IExNVl9VU0VSX01BR0lDKSB7CisJCUNFUlJPUigiJXM6IGludmFsaWQgbG12IG1hZ2ljICV4OiByYyA9ICVkXG4iLAorCQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgbGUzMl90b19jcHUobG1tLT5sbXZfbWFnaWMpLAorCQkgICAgICAgLUVJTyk7CisJCXJldHVybiAtRUlPOworCX0KIAotCWlmIChtZWEtPm1lYV9tYWdpYyA9PSBNRUFfTUFHSUNfTEFTVF9DSEFSIHx8Ci0JICAgIG1lYS0+bWVhX21hZ2ljID09IE1FQV9NQUdJQ19BTExfQ0hBUlMgfHwKLQkgICAgbWVhLT5tZWFfbWFnaWMgPT0gTUVBX01BR0lDX0hBU0hfU0VHTUVOVCkgewotCQltYWdpYyA9IGxlMzJfdG9fY3B1KG1lYS0+bWVhX21hZ2ljKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBPbGQgbWVhIGlzIG5vdCBoYW5kbGVkIGhlcmUuCisJaWYgKGxlMzJfdG9fY3B1KGxtbS0+bG12X21hZ2ljKSA9PSBMTVZfTUFHSUNfVjEpCisJCWxzbV9zaXplID0gbG12X3N0cmlwZV9tZF9zaXplKGxtdl9tZHNfbWRfc3RyaXBlX2NvdW50X2dldChsbW0pKTsKKwllbHNlCisJCS8qKgorCQkgKiBVbnBhY2sgZGVmYXVsdCBkaXJzdHJpcGUobG12X3VzZXJfbWQpIHRvIGxtdl9zdHJpcGVfbWQsCisJCSAqIHN0cmlwZWNvdW50IHNob3VsZCBiZSAwIHRoZW4uCiAJCSAqLwotCQlDRVJST1IoIk9sZCBub3Qgc3VwcG9ydGFibGUgRUEgaXMgZm91bmRcbiIpOwotCQlMQlVHKCk7CisJCWxzbV9zaXplID0gbG12X3N0cmlwZV9tZF9zaXplKDApOworCisJaWYgKCFsc20pIHsKKwkJbHNtID0gbGliY2ZzX2t2emFsbG9jKGxzbV9zaXplLCBHRlBfTk9GUyk7CisJCWlmICghbHNtKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWFsbG9jYXRlZCA9IHRydWU7CisJCSpsc21wID0gbHNtOwogCX0KIAotCSgqdG1lYSktPm1lYV9tYWdpYyA9IG1hZ2ljOwotCSgqdG1lYSktPm1lYV9jb3VudCA9IGxlMzJfdG9fY3B1KG1lYS0+bWVhX2NvdW50KTsKLQkoKnRtZWEpLT5tZWFfbWFzdGVyID0gbGUzMl90b19jcHUobWVhLT5tZWFfbWFzdGVyKTsKLQotCWZvciAoaSA9IDA7IGkgPCAoKnRtZWEpLT5tZWFfY291bnQ7IGkrKykgewotCQkoKnRtZWEpLT5tZWFfaWRzW2ldID0gbWVhLT5tZWFfaWRzW2ldOwotCQlmaWRfbGVfdG9fY3B1KCYoKnRtZWEpLT5tZWFfaWRzW2ldLCAmKCp0bWVhKS0+bWVhX2lkc1tpXSk7CisJc3dpdGNoIChsZTMyX3RvX2NwdShsbW0tPmxtdl9tYWdpYykpIHsKKwljYXNlIExNVl9NQUdJQ19WMToKKwkJcmMgPSBsbXZfdW5wYWNrX21kX3YxKGV4cCwgbHNtLCAmbG1tLT5sbXZfbWRfdjEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlDRVJST1IoIiVzOiB1bnJlY29nbml6ZWQgbWFnaWMgJXhcbiIsIGV4cC0+ZXhwX29iZC0+b2JkX25hbWUsCisJCSAgICAgICBsZTMyX3RvX2NwdShsbW0tPmxtdl9tYWdpYykpOworCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOwogCX0KLQlyZXR1cm4gbWVhX3NpemU7CisKKwlpZiAocmMgJiYgYWxsb2NhdGVkKSB7CisJCWt2ZnJlZShsc20pOworCQkqbHNtcCA9IE5VTEw7CisJCWxzbV9zaXplID0gcmM7CisJfQorCXJldHVybiBsc21fc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0wobG12X3VucGFja19tZCk7CisKK3N0YXRpYyBpbnQgbG12X3VucGFja21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCwKKwkJCXN0cnVjdCBsb3ZfbWRzX21kICpsbW0sIGludCBkaXNrX2xlbikKK3sKKwlyZXR1cm4gbG12X3VucGFja19tZChleHAsIChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKilsc21wLAorCQkJICAgICAodW5pb24gbG12X21kc19tZCAqKWxtbSwgZGlza19sZW4pOworfQorCitzdGF0aWMgaW50IGxtdl9wYWNrbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAorCQkgICAgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQoreworCWNvbnN0IHN0cnVjdCBsbXZfc3RyaXBlX21kICpsbXYgPSAoc3RydWN0IGxtdl9zdHJpcGVfbWQgKilsc207CisJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGV4cC0+ZXhwX29iZDsKKwlzdHJ1Y3QgbG12X29iZCAqbG12X29iZCA9ICZvYmQtPnUubG12OworCWludCBzdHJpcGVfY291bnQ7CisKKwlpZiAoIWxtbXApIHsKKwkJaWYgKGxzbSkKKwkJCXN0cmlwZV9jb3VudCA9IGxtdi0+bHNtX21kX3N0cmlwZV9jb3VudDsKKwkJZWxzZQorCQkJc3RyaXBlX2NvdW50ID0gbG12X29iZC0+ZGVzYy5sZF90Z3RfY291bnQ7CisKKwkJcmV0dXJuIGxtdl9tZHNfbWRfc2l6ZShzdHJpcGVfY291bnQsIExNVl9NQUdJQ19WMSk7CisJfQorCisJcmV0dXJuIGxtdl9wYWNrX21kKCh1bmlvbiBsbXZfbWRzX21kICoqKWxtbXAsIGxtdiwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgbG12X2NhbmNlbF91bnVzZWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLApAQCAtMjQ4NCw3ICszMDI4LDcgQEAKIAlzdHJ1Y3QgbG12X29iZAkgICpsbXYgPSAmb2JkLT51LmxtdjsKIAlpbnQJCSAgICAgIHJjID0gMDsKIAlpbnQJCSAgICAgIGVycjsKLQlpbnQJCSAgICAgIGk7CisJdTMyIGk7CiAKIAlMQVNTRVJUKGZpZCk7CiAKQEAgLTI1MDIsOCArMzA0Niw5IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGxtdl9zZXRfbG9ja19kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIF9fdTY0ICpsb2NraCwgdm9pZCAqZGF0YSwKLQkJCSAgICAgX191NjQgKmJpdHMpCitzdGF0aWMgaW50IGxtdl9zZXRfbG9ja19kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwKKwkJCSAgICAgdm9pZCAqZGF0YSwgX191NjQgKmJpdHMpCiB7CiAJc3RydWN0IGxtdl9vYmQJICAqbG12ID0gJmV4cC0+ZXhwX29iZC0+dS5sbXY7CiAJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0ID0gbG12LT50Z3RzWzBdOwpAQCAtMjUyNiwyNCArMzA3MSwzMiBAQAogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgICpvYmQgPSBleHAtPmV4cF9vYmQ7CiAJc3RydWN0IGxtdl9vYmQJICAqbG12ID0gJm9iZC0+dS5sbXY7CiAJZW51bSBsZGxtX21vZGUJICAgICAgcmM7Ci0JaW50CQkgICAgICBpOworCWludCB0Z3Q7CisJdTMyIGk7CiAKIAlDREVCVUcoRF9JTk9ERSwgIkxvY2sgbWF0Y2ggZm9yICJERklEIlxuIiwgUEZJRChmaWQpKTsKIAogCS8qCi0JICogV2l0aCBDTUQgZXZlcnkgb2JqZWN0IGNhbiBoYXZlIHR3byBsb2NrcyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlczoKLQkgKiBsb29rdXAgbG9jayBpbiBzcGFjZSBvZiBtZHMgc3RvcmluZyBkaXJlbnRyeSBhbmQgdXBkYXRlL29wZW4gbG9jayBpbgotCSAqIHNwYWNlIG9mIG1kcyBzdG9yaW5nIGlub2RlLiBUaHVzIHdlIGNoZWNrIGFsbCB0YXJnZXRzLCBub3Qgb25seSB0aGF0Ci0JICogb25lIGZpZCB3YXMgY3JlYXRlZCBpbi4KKwkgKiBXaXRoIERORSBldmVyeSBvYmplY3QgY2FuIGhhdmUgdHdvIGxvY2tzIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzOgorCSAqIGxvb2t1cCBsb2NrIGluIHNwYWNlIG9mIE1EVCBzdG9yaW5nIGRpcmVudHJ5IGFuZCB1cGRhdGUvb3BlbiBsb2NrIGluCisJICogc3BhY2Ugb2YgTURUIHN0b3JpbmcgaW5vZGUuICBUcnkgdGhlIE1EVCB0aGF0IHRoZSBGSUQgbWFwcyB0byBmaXJzdCwKKwkgKiBzaW5jZSB0aGlzIGNhbiBiZSBlYXNpbHkgZm91bmQsIGFuZCBvbmx5IHRyeSBvdGhlcnMgaWYgdGhhdCBmYWlscy4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbG12LT5kZXNjLmxkX3RndF9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndCA9IGxtdi0+dGd0c1tpXTsKKwlmb3IgKGkgPSAwLCB0Z3QgPSBsbXZfZmluZF90YXJnZXRfaW5kZXgobG12LCBmaWQpOworCSAgICAgaSA8IGxtdi0+ZGVzYy5sZF90Z3RfY291bnQ7CisJICAgICBpKyssIHRndCA9ICh0Z3QgKyAxKSAlIGxtdi0+ZGVzYy5sZF90Z3RfY291bnQpIHsKKwkJaWYgKHRndCA8IDApIHsKKwkJCUNERUJVRyhEX0hBLCAiJXM6ICJERklEIiBpcyBpbmFjY2Vzc2libGU6IHJjID0gJWRcbiIsCisJCQkgICAgICAgb2JkLT5vYmRfbmFtZSwgUEZJRChmaWQpLCB0Z3QpOworCQkJdGd0ID0gMDsKKwkJfQogCi0JCWlmICghdGd0IHx8ICF0Z3QtPmx0ZF9leHAgfHwgIXRndC0+bHRkX2FjdGl2ZSkKKwkJaWYgKCFsbXYtPnRndHNbdGd0XSB8fCAhbG12LT50Z3RzW3RndF0tPmx0ZF9leHAgfHwKKwkJICAgICFsbXYtPnRndHNbdGd0XS0+bHRkX2FjdGl2ZSkKIAkJCWNvbnRpbnVlOwogCi0JCXJjID0gbWRfbG9ja19tYXRjaCh0Z3QtPmx0ZF9leHAsIGZsYWdzLCBmaWQsIHR5cGUsIHBvbGljeSwgbW9kZSwKLQkJCQkgICBsb2NraCk7CisJCXJjID0gbWRfbG9ja19tYXRjaChsbXYtPnRndHNbdGd0XS0+bHRkX2V4cCwgZmxhZ3MsIGZpZCwKKwkJCQkgICB0eXBlLCBwb2xpY3ksIG1vZGUsIGxvY2toKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCX0KQEAgLTI1NzEsOCArMzEyNCwxMCBAQAogCXN0cnVjdCBsbXZfb2JkCSAgKmxtdiA9ICZvYmQtPnUubG12OwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndCA9IGxtdi0+dGd0c1swXTsKIAotCWlmIChtZC0+bWVhKQotCQlvYmRfZnJlZV9tZW1tZChleHAsICh2b2lkICopJm1kLT5tZWEpOworCWlmIChtZC0+bG12KSB7CisJCWxtdl9mcmVlX21lbW1kKG1kLT5sbXYpOworCQltZC0+bG12ID0gTlVMTDsKKwl9CiAJaWYgKCF0Z3QgfHwgIXRndC0+bHRkX2V4cCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIG1kX2ZyZWVfbHVzdHJlX21kKHRndC0+bHRkX2V4cCwgbWQpOwpAQCAtMjYyMSw3ICszMTc2LDcgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXRndCA9IGxtdl9maW5kX3RhcmdldChsbXYsICZvcF9kYXRhLT5vcF9maWQxKTsKKwl0Z3QgPSBsbXZfbG9jYXRlX21kcyhsbXYsIG9wX2RhdGEsICZvcF9kYXRhLT5vcF9maWQxKTsKIAlpZiAoSVNfRVJSKHRndCkpCiAJCXJldHVybiBQVFJfRVJSKHRndCk7CiAKQEAgLTI2NDksNiArMzIwNCwyMyBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIGludAorbG12X2dldF9maWRfZnJvbV9sc20oc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqbHNtLAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgbHVfZmlkICpmaWQpCit7CisJY29uc3Qgc3RydWN0IGxtdl9vaW5mbyAqb2luZm87CisKKwlMQVNTRVJUKGxzbSk7CisJb2luZm8gPSBsc21fbmFtZV90b19zdHJpcGVfaW5mbyhsc20sIG5hbWUsIG5hbWVsZW4pOworCWlmIChJU19FUlIob2luZm8pKQorCQlyZXR1cm4gUFRSX0VSUihvaW5mbyk7CisKKwkqZmlkID0gb2luZm8tPmxtb19maWQ7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBGb3IgbG12LCBvbmx5IG5lZWQgdG8gc2VuZCByZXF1ZXN0IHRvIG1hc3RlciBNRFQsIGFuZCB0aGUgbWFzdGVyIE1EVCB3aWxsCiAgKiBwcm9jZXNzIHdpdGggb3RoZXIgc2xhdmUgTURUcy4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIFFfR0VUT1FVT1RBIGZvciB3aGljaApAQCAtMjY2MCw4ICszMjMyLDkgQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAgICpvYmQgPSBjbGFzc19leHAyb2JkKGV4cCk7CiAJc3RydWN0IGxtdl9vYmQgICAgICAqbG12ID0gJm9iZC0+dS5sbXY7CiAJc3RydWN0IGxtdl90Z3RfZGVzYyAqdGd0ID0gbG12LT50Z3RzWzBdOwotCWludAkJICByYyA9IDAsIGk7CisJaW50IHJjID0gMDsKIAlfX3U2NCBjdXJzcGFjZSA9IDAsIGN1cmlub2RlcyA9IDA7CisJdTMyIGk7CiAKIAlpZiAoIXRndCB8fCAhdGd0LT5sdGRfZXhwIHx8ICF0Z3QtPmx0ZF9hY3RpdmUgfHwKIAkgICAgIWxtdi0+ZGVzYy5sZF90Z3RfY291bnQpIHsKQEAgLTI3MDQsNyArMzI3Nyw4IEBACiAJc3RydWN0IG9iZF9kZXZpY2UgICAqb2JkID0gY2xhc3NfZXhwMm9iZChleHApOwogCXN0cnVjdCBsbXZfb2JkICAgICAgKmxtdiA9ICZvYmQtPnUubG12OwogCXN0cnVjdCBsbXZfdGd0X2Rlc2MgKnRndDsKLQlpbnQJCSAgaSwgcmMgPSAwOworCWludCByYyA9IDA7CisJdTMyIGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbG12LT5kZXNjLmxkX3RndF9jb3VudDsgaSsrKSB7CiAJCWludCBlcnI7CkBAIC0yNzIzLDYgKzMyOTcsNDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3N0YXRpYyBpbnQgbG12X21lcmdlX2F0dHIoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJCSAgY29uc3Qgc3RydWN0IGxtdl9zdHJpcGVfbWQgKmxzbSwKKwkJCSAgc3RydWN0IGNsX2F0dHIgKmF0dHIsCisJCQkgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcpCit7CisJaW50IHJjLCBpOworCisJcmMgPSBsbXZfcmV2YWxpZGF0ZV9zbGF2ZXMoZXhwLCBsc20sIGNiX2Jsb2NraW5nLCAwKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fbWRfc3RyaXBlX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19yb290OworCisJCUNERUJVRyhEX0lORk8sICIiREZJRCIgc2l6ZSAlbGx1LCBibG9ja3MgJWxsdSBubGluayAldSwgYXRpbWUgJWx1IGN0aW1lICVsdSwgbXRpbWUgJWx1LlxuIiwKKwkJICAgICAgIFBGSUQoJmxzbS0+bHNtX21kX29pbmZvW2ldLmxtb19maWQpLAorCQkgICAgICAgaV9zaXplX3JlYWQoaW5vZGUpLCAodW5zaWduZWQgbG9uZyBsb25nKWlub2RlLT5pX2Jsb2NrcywKKwkJICAgICAgIGlub2RlLT5pX25saW5rLCBMVElNRV9TKGlub2RlLT5pX2F0aW1lKSwKKwkJICAgICAgIExUSU1FX1MoaW5vZGUtPmlfY3RpbWUpLCBMVElNRV9TKGlub2RlLT5pX210aW1lKSk7CisKKwkJLyogZm9yIHNsYXZlIHN0cmlwZSwgaXQgbmVlZHMgdG8gc3VidHJhY3QgbmxpbmsgZm9yIC4gYW5kIC4uICovCisJCWlmIChpKQorCQkJYXR0ci0+Y2F0X25saW5rICs9IGlub2RlLT5pX25saW5rIC0gMjsKKwkJZWxzZQorCQkJYXR0ci0+Y2F0X25saW5rID0gaW5vZGUtPmlfbmxpbms7CisKKwkJYXR0ci0+Y2F0X3NpemUgKz0gaV9zaXplX3JlYWQoaW5vZGUpOworCQlhdHRyLT5jYXRfYmxvY2tzICs9IGlub2RlLT5pX2Jsb2NrczsKKworCQlpZiAoYXR0ci0+Y2F0X2F0aW1lIDwgTFRJTUVfUyhpbm9kZS0+aV9hdGltZSkpCisJCQlhdHRyLT5jYXRfYXRpbWUgPSBMVElNRV9TKGlub2RlLT5pX2F0aW1lKTsKKworCQlpZiAoYXR0ci0+Y2F0X2N0aW1lIDwgTFRJTUVfUyhpbm9kZS0+aV9jdGltZSkpCisJCQlhdHRyLT5jYXRfY3RpbWUgPSBMVElNRV9TKGlub2RlLT5pX2N0aW1lKTsKKworCQlpZiAoYXR0ci0+Y2F0X210aW1lIDwgTFRJTUVfUyhpbm9kZS0+aV9tdGltZSkpCisJCQlhdHRyLT5jYXRfbXRpbWUgPSBMVElNRV9TKGlub2RlLT5pX210aW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgb2JkX29wcyBsbXZfb2JkX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLnNldHVwCQk9IGxtdl9zZXR1cCwKQEAgLTI3NDYsNyArMzM2MSw2IEBACiBzdGF0aWMgc3RydWN0IG1kX29wcyBsbXZfbWRfb3BzID0gewogCS5nZXRzdGF0dXMJCT0gbG12X2dldHN0YXR1cywKIAkubnVsbF9pbm9kZQkJPSBsbXZfbnVsbF9pbm9kZSwKLQkuZmluZF9jYmRhdGEJCT0gbG12X2ZpbmRfY2JkYXRhLAogCS5jbG9zZQkJCT0gbG12X2Nsb3NlLAogCS5jcmVhdGUJCQk9IGxtdl9jcmVhdGUsCiAJLmRvbmVfd3JpdGluZwkJPSBsbXZfZG9uZV93cml0aW5nLApAQCAtMjc2MCw3ICszMzc0LDcgQEAKIAkuc2V0YXR0cgkJPSBsbXZfc2V0YXR0ciwKIAkuc2V0eGF0dHIJCT0gbG12X3NldHhhdHRyLAogCS5zeW5jCQkJPSBsbXZfc3luYywKLQkucmVhZHBhZ2UJCT0gbG12X3JlYWRwYWdlLAorCS5yZWFkX3BhZ2UJCT0gbG12X3JlYWRfcGFnZSwKIAkudW5saW5rCQkJPSBsbXZfdW5saW5rLAogCS5pbml0X2VhX3NpemUJCT0gbG12X2luaXRfZWFfc2l6ZSwKIAkuY2FuY2VsX3VudXNlZAkJPSBsbXZfY2FuY2VsX3VudXNlZCwKQEAgLTI3NjgsMTAgKzMzODIsMTIgQEAKIAkubG9ja19tYXRjaAkJPSBsbXZfbG9ja19tYXRjaCwKIAkuZ2V0X2x1c3RyZV9tZAkJPSBsbXZfZ2V0X2x1c3RyZV9tZCwKIAkuZnJlZV9sdXN0cmVfbWQJCT0gbG12X2ZyZWVfbHVzdHJlX21kLAorCS5tZXJnZV9hdHRyCQk9IGxtdl9tZXJnZV9hdHRyLAogCS5zZXRfb3Blbl9yZXBsYXlfZGF0YQk9IGxtdl9zZXRfb3Blbl9yZXBsYXlfZGF0YSwKIAkuY2xlYXJfb3Blbl9yZXBsYXlfZGF0YQk9IGxtdl9jbGVhcl9vcGVuX3JlcGxheV9kYXRhLAogCS5pbnRlbnRfZ2V0YXR0cl9hc3luYwk9IGxtdl9pbnRlbnRfZ2V0YXR0cl9hc3luYywKLQkucmV2YWxpZGF0ZV9sb2NrCT0gbG12X3JldmFsaWRhdGVfbG9jaworCS5yZXZhbGlkYXRlX2xvY2sJPSBsbXZfcmV2YWxpZGF0ZV9sb2NrLAorCS5nZXRfZmlkX2Zyb21fbHNtCT0gbG12X2dldF9maWRfZnJvbV9sc20sCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBsbXZfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xwcm9jX2xtdi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xwcm9jX2xtdi5jCmluZGV4IGMyOWMzNjEuLjIwYmJkZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9scHJvY19sbXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbHByb2NfbG12LmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCiAJaWYgKCF0Z3QpCiAJCXJldHVybiAwOwotCXNlcV9wcmludGYocCwgIiVkOiAlcyAlc0FDVElWRVxuIiwKKwlzZXFfcHJpbnRmKHAsICIldTogJXMgJXNBQ1RJVkVcbiIsCiAJCSAgIHRndC0+bHRkX2lkeCwgdGd0LT5sdGRfdXVpZC51dWlkLAogCQkgICB0Z3QtPmx0ZF9hY3RpdmUgPyAiIiA6ICJJTiIpOwogCXJldHVybiAwOwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJeyBOVUxMIH0KIH07CiAKLXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbG12X3Byb2NfdGFyZ2V0X2ZvcHMgPSB7Citjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxtdl9wcm9jX3RhcmdldF9mb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJID0gbG12X3RhcmdldF9zZXFfb3BlbiwKIAkucmVhZAkJID0gc2VxX3JlYWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2NsX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2NsX2ludGVybmFsLmgKaW5kZXggOTc0MDU2OC4uNGQyYjdkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9jbF9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfY2xfaW50ZXJuYWwuaApAQCAtMjg5LDggKzI4OSw4IEBACiB9OwogCiBzdHJ1Y3QgbG92X3BhZ2UgewotCXN0cnVjdCBjbF9wYWdlX3NsaWNlIGxwc19jbDsKLQlpbnQJCSAgbHBzX2ludmFsaWQ7CisJc3RydWN0IGNsX3BhZ2Vfc2xpY2UJbHBzX2NsOworCXVuc2lnbmVkIGludAkJbHBzX3N0cmlwZTsgLyogc3RyaXBlIGluZGV4ICovCiB9OwogCiAvKgpAQCAtNTU2LDYgKzU1Niw4IEBACiAJCQkJCSBzdHJ1Y3QgbG92c3ViX2xvY2sgKnN1Yik7CiBzdHJ1Y3QgbG92X2lvX3N1YiAqbG92X3BhZ2Vfc3ViaW8oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgbG92X2lvICpsaW8sCiAJCQkJICBjb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2UpOworCitzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbG92X2xzbV9hZGRyZWYoc3RydWN0IGxvdl9vYmplY3QgKmxvdik7CiBpbnQgbG92X3BhZ2Vfc3RyaXBlKGNvbnN0IHN0cnVjdCBjbF9wYWdlICpwYWdlKTsKIAogI2RlZmluZSBsb3ZfZm9yZWFjaF90YXJnZXQobG92LCB2YXIpCQkgICAgXApAQCAtNzQyLDExICs3NDQsMTUgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGxvdl9sYXlvdXRfcmFpZDAgKmxvdl9yMChzdHJ1Y3QgbG92X29iamVjdCAqbG92KQogewogCUxBU1NFUlQobG92LT5sb190eXBlID09IExMVF9SQUlEMCk7Ci0JTEFTU0VSVChsb3YtPmxvX2xzbS0+bHNtX3dpcmUubHdfbWFnaWMgPT0gTE9WX01BR0lDIHx8Ci0JCWxvdi0+bG9fbHNtLT5sc21fd2lyZS5sd19tYWdpYyA9PSBMT1ZfTUFHSUNfVjMpOworCUxBU1NFUlQobG92LT5sb19sc20tPmxzbV9tYWdpYyA9PSBMT1ZfTUFHSUMgfHwKKwkJbG92LT5sb19sc20tPmxzbV9tYWdpYyA9PSBMT1ZfTUFHSUNfVjMpOwogCXJldHVybiAmbG92LT51LnJhaWQwOwogfQogCisvKiBsb3ZfcGFjay5jICovCitpbnQgbG92X2dldHN0cmlwZShzdHJ1Y3QgbG92X29iamVjdCAqb2JqLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAorCQkgIHN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKmx1bXApOworCiAvKiogQH0gbG92ICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZGV2LmMKaW5kZXggYjFmMjYwZC4uMDU2YWUyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2Rldi5jCkBAIC01MTYsNiArNTE2LDUgQEAKIAkubGR0X29wcyAgICAgID0gJmxvdl9kZXZpY2VfdHlwZV9vcHMsCiAJLmxkdF9jdHhfdGFncyA9IExDVF9DTF9USFJFQUQKIH07Ci1FWFBPUlRfU1lNQk9MKGxvdl9kZXZpY2VfdHlwZSk7CiAKIC8qKiBAfSBsb3YgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYwppbmRleCA1MDUzZGVhLi4yMTRjNTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2VhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9lYS5jCkBAIC02Niw3ICs2Niw4IEBACiAJfQogCiAJaWYgKGxtbS0+bG1tX3N0cmlwZV9zaXplID09IDAgfHwKLQkgICAgKGxlMzJfdG9fY3B1KGxtbS0+bG1tX3N0cmlwZV9zaXplKSYoTE9WX01JTl9TVFJJUEVfU0laRS0xKSkgIT0gMCkgeworCSAgICAobGUzMl90b19jcHUobG1tLT5sbW1fc3RyaXBlX3NpemUpICYKKwkgICAgIChMT1ZfTUlOX1NUUklQRV9TSVpFIC0gMSkpICE9IDApIHsKIAkJQ0VSUk9SKCJiYWQgc3RyaXBlIHNpemUgJXVcbiIsCiAJCSAgICAgICBsZTMyX3RvX2NwdShsbW0tPmxtbV9zdHJpcGVfc2l6ZSkpOwogCQlsb3ZfZHVtcF9sbW1fY29tbW9uKERfV0FSTklORywgbG1tKTsKQEAgLTE0NiwyMSArMTQ3LDE1IEBACiAJCSpzd2lkdGggPSAodTY0KWxzbS0+bHNtX3N0cmlwZV9zaXplICogbHNtLT5sc21fc3RyaXBlX2NvdW50OwogfQogCi1zdGF0aWMgaW50IGxzbV9kZXN0cm95X3BsYWluKHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sIHN0cnVjdCBvYmRvICpvYSwKLQkJCSAgICAgc3RydWN0IG9iZF9leHBvcnQgKm1kX2V4cCkKLXsKLQlyZXR1cm4gMDsKLX0KLQogLyogRmluZCBtaW5pbXVtIHN0cmlwZSBtYXhieXRlcyB2YWx1ZS4gIEZvciBpbmFjdGl2ZSBvcgotICogcmVjb25uZWN0aW5nIHRhcmdldHMgdXNlIExVU1RSRV9TVFJJUEVfTUFYQllURVMuCisgKiByZWNvbm5lY3RpbmcgdGFyZ2V0cyB1c2UgTFVTVFJFX0VYVDNfU1RSSVBFX01BWEJZVEVTLgogICovCiBzdGF0aWMgdm9pZCBsb3ZfdGd0X21heGJ5dGVzKHN0cnVjdCBsb3ZfdGd0X2Rlc2MgKnRndCwgX191NjQgKnN0cmlwZV9tYXhieXRlcykKIHsKIAlzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wID0gdGd0LT5sdGRfb2JkLT51LmNsaS5jbF9pbXBvcnQ7CiAKIAlpZiAoIWltcCB8fCAhdGd0LT5sdGRfYWN0aXZlKSB7Ci0JCSpzdHJpcGVfbWF4Ynl0ZXMgPSBMVVNUUkVfU1RSSVBFX01BWEJZVEVTOworCQkqc3RyaXBlX21heGJ5dGVzID0gTFVTVFJFX0VYVDNfU1RSSVBFX01BWEJZVEVTOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNzEsNyArMTY2LDcgQEAKIAkJaWYgKCpzdHJpcGVfbWF4Ynl0ZXMgPiBpbXAtPmltcF9jb25uZWN0X2RhdGEub2NkX21heGJ5dGVzKQogCQkJKnN0cmlwZV9tYXhieXRlcyA9IGltcC0+aW1wX2Nvbm5lY3RfZGF0YS5vY2RfbWF4Ynl0ZXM7CiAJfSBlbHNlIHsKLQkJKnN0cmlwZV9tYXhieXRlcyA9IExVU1RSRV9TVFJJUEVfTUFYQllURVM7CisJCSpzdHJpcGVfbWF4Ynl0ZXMgPSBMVVNUUkVfRVhUM19TVFJJUEVfTUFYQllURVM7CiAJfQogCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKIH0KQEAgLTI0NSw3ICsyNDAsNiBAQAogCiBjb25zdCBzdHJ1Y3QgbHNtX29wZXJhdGlvbnMgbHNtX3YxX29wcyA9IHsKIAkubHNtX2ZyZWUJICAgID0gbHNtX2ZyZWVfcGxhaW4sCi0JLmxzbV9kZXN0cm95CSA9IGxzbV9kZXN0cm95X3BsYWluLAogCS5sc21fc3RyaXBlX2J5X2luZGV4ICAgID0gbHNtX3N0cmlwZV9ieV9pbmRleF9wbGFpbiwKIAkubHNtX3N0cmlwZV9ieV9vZmZzZXQgICA9IGxzbV9zdHJpcGVfYnlfb2Zmc2V0X3BsYWluLAogCS5sc21fbG1tX3ZlcmlmeQkgPSBsc21fbG1tX3ZlcmlmeV92MSwKQEAgLTMzNSw3ICszMjksNiBAQAogCiBjb25zdCBzdHJ1Y3QgbHNtX29wZXJhdGlvbnMgbHNtX3YzX29wcyA9IHsKIAkubHNtX2ZyZWUJICAgID0gbHNtX2ZyZWVfcGxhaW4sCi0JLmxzbV9kZXN0cm95CSA9IGxzbV9kZXN0cm95X3BsYWluLAogCS5sc21fc3RyaXBlX2J5X2luZGV4ICAgID0gbHNtX3N0cmlwZV9ieV9pbmRleF9wbGFpbiwKIAkubHNtX3N0cmlwZV9ieV9vZmZzZXQgICA9IGxzbV9zdHJpcGVfYnlfb2Zmc2V0X3BsYWluLAogCS5sc21fbG1tX3ZlcmlmeQkgPSBsc21fbG1tX3ZlcmlmeV92MywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW50ZXJuYWwuaAppbmRleCAxMmJkNTExLi4wN2U1ZWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pbnRlcm5hbC5oCkBAIC0xMzQsOCArMTM0LDYgQEAKIC8qIGxvdl9tZXJnZS5jICovCiB2b2lkIGxvdl9tZXJnZV9hdHRycyhzdHJ1Y3Qgb2JkbyAqdGd0LCBzdHJ1Y3Qgb2JkbyAqc3JjLCB1NjQgdmFsaWQsCiAJCSAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwgaW50IHN0cmlwZW5vLCBpbnQgKnNldCk7Ci1pbnQgbG92X2FkanVzdF9rbXMoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJICAgdTY0IHNpemUsIGludCBzaHJpbmspOwogaW50IGxvdl9tZXJnZV9sdmJfa21zKHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCiAJCSAgICAgIHN0cnVjdCBvc3RfbHZiICpsdmIsIF9fdTY0ICprbXNfcGxhY2UpOwogCkBAIC0xNTcsMTEgKzE1NSw2IEBACiBpbnQgbG92X3ByZXBfZ2V0YXR0cl9zZXQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG9iZF9pbmZvICpvaW5mbywKIAkJCSBzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICoqcmVxc2V0KTsKIGludCBsb3ZfZmluaV9nZXRhdHRyX3NldChzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICpzZXQpOwotaW50IGxvdl9wcmVwX2Rlc3Ryb3lfc2V0KHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRfaW5mbyAqb2luZm8sCi0JCQkgc3RydWN0IG9iZG8gKnNyY19vYSwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJCSBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSwKLQkJCSBzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICoqcmVxc2V0KTsKLWludCBsb3ZfZmluaV9kZXN0cm95X3NldChzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICpzZXQpOwogaW50IGxvdl9wcmVwX3NldGF0dHJfc2V0KHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRfaW5mbyAqb2luZm8sCiAJCQkgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGksCiAJCQkgc3RydWN0IGxvdl9yZXF1ZXN0X3NldCAqKnJlcXNldCk7CkBAIC0xOTcsOCArMTkwLDYgQEAKIAkgICAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSk7CiBpbnQgbG92X3VucGFja21kKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCwKIAkJIHN0cnVjdCBsb3ZfbWRzX21kICpsbW0sIGludCBsbW1fYnl0ZXMpOwotaW50IGxvdl9nZXRzdHJpcGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLCBzdHJ1Y3QgbG92X3VzZXJfbWQgX191c2VyICpsdW1wKTsKIGludCBsb3ZfYWxsb2NfbWVtbWQoc3RydWN0IGxvdl9zdHJpcGVfbWQgKipsc21wLCBfX3UxNiBzdHJpcGVfY291bnQsCiAJCSAgICBpbnQgcGF0dGVybiwgaW50IG1hZ2ljKTsKIGludCBsb3ZfZnJlZV9tZW1tZChzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmxzbXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jCmluZGV4IDg0MDMyYTUuLmQxMDE1NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2lvLmMKQEAgLTg3LDYgKzg3LDkgQEAKIAljYXNlIENJVF9TRVRBVFRSOiB7CiAJCWlvLT51LmNpX3NldGF0dHIuc2FfYXR0ciA9IHBhcmVudC0+dS5jaV9zZXRhdHRyLnNhX2F0dHI7CiAJCWlvLT51LmNpX3NldGF0dHIuc2FfdmFsaWQgPSBwYXJlbnQtPnUuY2lfc2V0YXR0ci5zYV92YWxpZDsKKwkJaW8tPnUuY2lfc2V0YXR0ci5zYV9zdHJpcGVfaW5kZXggPSBzdHJpcGU7CisJCWlvLT51LmNpX3NldGF0dHIuc2FfcGFyZW50X2ZpZCA9CisJCQkJCXBhcmVudC0+dS5jaV9zZXRhdHRyLnNhX3BhcmVudF9maWQ7CiAJCWlmIChjbF9pb19pc190cnVuYyhpbykpIHsKIAkJCWxvZmZfdCBuZXdfc2l6ZSA9IHBhcmVudC0+dS5jaV9zZXRhdHRyLnNhX2F0dHIubHZiX3NpemU7CiAKQEAgLTI0NCwxNCArMjQ3LDEyIEBACiAKIGludCBsb3ZfcGFnZV9zdHJpcGUoY29uc3Qgc3RydWN0IGNsX3BhZ2UgKnBhZ2UpCiB7Ci0Jc3RydWN0IGxvdnN1Yl9vYmplY3QgKnN1Ym9iajsKIAljb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqc2xpY2U7CiAKLQlzbGljZSA9IGNsX3BhZ2VfYXQocGFnZSwgJmxvdnN1Yl9kZXZpY2VfdHlwZSk7CisJc2xpY2UgPSBjbF9wYWdlX2F0KHBhZ2UsICZsb3ZfZGV2aWNlX3R5cGUpOwogCUxBU1NFUlQoc2xpY2UtPmNwbF9vYmopOwogCi0Jc3Vib2JqID0gY2wybG92c3ViKHNsaWNlLT5jcGxfb2JqKTsKLQlyZXR1cm4gc3Vib2JqLT5sc29faW5kZXg7CisJcmV0dXJuIGNsMmxvdl9wYWdlKHNsaWNlKS0+bHBzX3N0cmlwZTsKIH0KIAogc3RydWN0IGxvdl9pb19zdWIgKmxvdl9wYWdlX3N1YmlvKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGxvdl9pbyAqbGlvLApAQCAtMjk4LDggKzI5OSw4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgbG92X2lvX3NsaWNlX2luaXQoc3RydWN0IGxvdl9pbyAqbGlvLAotCQkJICAgICAgc3RydWN0IGxvdl9vYmplY3QgKm9iaiwgc3RydWN0IGNsX2lvICppbykKK3N0YXRpYyBpbnQgbG92X2lvX3NsaWNlX2luaXQoc3RydWN0IGxvdl9pbyAqbGlvLCBzdHJ1Y3QgbG92X29iamVjdCAqb2JqLAorCQkJICAgICBzdHJ1Y3QgY2xfaW8gKmlvKQogewogCWlvLT5jaV9yZXN1bHQgPSAwOwogCWxpby0+bGlzX29iamVjdCA9IG9iajsKQEAgLTMxNCw2ICszMTUsMTUgQEAKIAkJbGlvLT5saXNfaW9fZW5kcG9zID0gbGlvLT5saXNfZW5kcG9zOwogCQlpZiAoY2xfaW9faXNfYXBwZW5kKGlvKSkgewogCQkJTEFTU0VSVChpby0+Y2lfdHlwZSA9PSBDSVRfV1JJVEUpOworCisJCQkvKgorCQkJICogSWYgdGhlcmUgaXMgTE9WIEVBIGhvbGUsIHRoZW4gd2UgbWF5IGNhbm5vdCBsb2NhdGUKKwkJCSAqIHRoZSBjdXJyZW50IGZpbGUtdGFpbCBleGFjdGx5LgorCQkJICovCisJCQlpZiAodW5saWtlbHkob2JqLT5sb19sc20tPmxzbV9wYXR0ZXJuICYKKwkJCQkgICAgIExPVl9QQVRURVJOX0ZfSE9MRSkpCisJCQkJcmV0dXJuIC1FSU87CisKIAkJCWxpby0+bGlzX3BvcyA9IDA7CiAJCQlsaW8tPmxpc19lbmRwb3MgPSBPQkRfT0JKRUNUX0VPRjsKIAkJfQpAQCAtMzQ5LDYgKzM1OSw3IEBACiAJZGVmYXVsdDoKIAkJTEJVRygpOwogCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbG92X2lvX2ZpbmkoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBjb25zdCBzdHJ1Y3QgY2xfaW9fc2xpY2UgKmlvcykKQEAgLTg3MCw3ICs4ODEsNyBAQAogCXN0cnVjdCBsb3Zfb2JqZWN0ICAgKmxvdiA9IGNsMmxvdihvYmopOwogCiAJSU5JVF9MSVNUX0hFQUQoJmxpby0+bGlzX2FjdGl2ZSk7Ci0JbG92X2lvX3NsaWNlX2luaXQobGlvLCBsb3YsIGlvKTsKKwlpby0+Y2lfcmVzdWx0ID0gbG92X2lvX3NsaWNlX2luaXQobGlvLCBsb3YsIGlvKTsKIAlpZiAoaW8tPmNpX3Jlc3VsdCA9PSAwKSB7CiAJCWlvLT5jaV9yZXN1bHQgPSBsb3ZfaW9fc3ViaW9faW5pdChlbnYsIGxpbywgaW8pOwogCQlpZiAoaW8tPmNpX3Jlc3VsdCA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X21lcmdlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X21lcmdlLmMKaW5kZXggYjljOTA4Ni4uNjc0YWYxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9tZXJnZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfbWVyZ2UuYwpAQCAtMTA1LDQ1ICsxMDUsNiBAQAogCXJldHVybiByYzsKIH0KIAotLyogTXVzdCBiZSBjYWxsZWQgdW5kZXIgdGhlIGxvdl9zdHJpcGVfbG9jaygpICovCi1pbnQgbG92X2FkanVzdF9rbXMoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJICAgdTY0IHNpemUsIGludCBzaHJpbmspCi17Ci0Jc3RydWN0IGxvdl9vaW5mbyAqbG9pOwotCWludCBzdHJpcGUgPSAwOwotCV9fdTY0IGttczsKLQotCWFzc2VydF9zcGluX2xvY2tlZCgmbHNtLT5sc21fbG9jayk7Ci0JTEFTU0VSVChsc20tPmxzbV9sb2NrX293bmVyID09IGN1cnJlbnRfcGlkKCkpOwotCi0JaWYgKHNocmluaykgewotCQlmb3IgKDsgc3RyaXBlIDwgbHNtLT5sc21fc3RyaXBlX2NvdW50OyBzdHJpcGUrKykgewotCQkJc3RydWN0IGxvdl9vaW5mbyAqbG9pID0gbHNtLT5sc21fb2luZm9bc3RyaXBlXTsKLQotCQkJa21zID0gbG92X3NpemVfdG9fc3RyaXBlKGxzbSwgc2l6ZSwgc3RyaXBlKTsKLQkJCUNERUJVRyhEX0lOT0RFLAotCQkJICAgICAgICJzdHJpcGUgJWQgS01TICVzaW5nICVsbHUtPiVsbHVcbiIsCi0JCQkgICAgICAgc3RyaXBlLCBrbXMgPiBsb2ktPmxvaV9rbXMgPyAiaW5jcmVhc2UiOiJzaHJpbmsiLAotCQkJICAgICAgIGxvaS0+bG9pX2ttcywga21zKTsKLQkJCWxvaS0+bG9pX2x2Yi5sdmJfc2l6ZSA9IGttczsKLQkJCWxvaV9rbXNfc2V0KGxvaSwgbG9pLT5sb2lfbHZiLmx2Yl9zaXplKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc2l6ZSA+IDApCi0JCXN0cmlwZSA9IGxvdl9zdHJpcGVfbnVtYmVyKGxzbSwgc2l6ZSAtIDEpOwotCWttcyA9IGxvdl9zaXplX3RvX3N0cmlwZShsc20sIHNpemUsIHN0cmlwZSk7Ci0JbG9pID0gbHNtLT5sc21fb2luZm9bc3RyaXBlXTsKLQotCUNERUJVRyhEX0lOT0RFLCAic3RyaXBlICVkIEtNUyAlc2luY3JlYXNpbmcgJWxsdS0+JWxsdVxuIiwKLQkgICAgICAgc3RyaXBlLCBrbXMgPiBsb2ktPmxvaV9rbXMgPyAiIiA6ICJub3QgIiwgbG9pLT5sb2lfa21zLCBrbXMpOwotCWlmIChrbXMgPiBsb2ktPmxvaV9rbXMpCi0JCWxvaV9rbXNfc2V0KGxvaSwga21zKTsKLQotCXJldHVybiAwOwotfQotCiB2b2lkIGxvdl9tZXJnZV9hdHRycyhzdHJ1Y3Qgb2JkbyAqdGd0LCBzdHJ1Y3Qgb2JkbyAqc3JjLCB1NjQgdmFsaWQsCiAJCSAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwgaW50IHN0cmlwZW5vLCBpbnQgKnNldCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iZC5jCmluZGV4IDliOTJkNTUuLmIyMzAxNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmQuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmcy5oIgogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfc3VwcG9ydC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pb2N0bC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2xpYi5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX25ldC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlL2x1c3RyZV9pZGwuaCIKQEAgLTk0MCw3ICs5NDEsNyBAQAogCX0KIAljYXNlIExDRkdfUEFSQU06IHsKIAkJc3RydWN0IGxwcm9jZnNfc3RhdGljX3ZhcnMgbHZhcnMgPSB7IE5VTEwgfTsKLQkJc3RydWN0IGxvdl9kZXNjICpkZXNjID0gJihvYmQtPnUubG92LmRlc2MpOworCQlzdHJ1Y3QgbG92X2Rlc2MgKmRlc2MgPSAmb2JkLT51Lmxvdi5kZXNjOwogCiAJCWlmICghZGVzYykgewogCQkJcmMgPSAtRUlOVkFMOwpAQCAtOTcxLDkyICs5NzIsNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBsb3ZfcmVjcmVhdGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG9iZG8gKnNyY19vYSwKLQkJCXN0cnVjdCBsb3Zfc3RyaXBlX21kICoqZWEsIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpKQotewotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpvYmpfbWRwLCAqbHNtOwotCXN0cnVjdCBsb3Zfb2JkICpsb3YgPSAmZXhwLT5leHBfb2JkLT51LmxvdjsKLQl1bnNpZ25lZCBvc3RfaWR4OwotCWludCByYywgaTsKLQotCUxBU1NFUlQoc3JjX29hLT5vX3ZhbGlkICYgT0JEX01EX0ZMRkxBR1MgJiYKLQkJc3JjX29hLT5vX2ZsYWdzICYgT0JEX0ZMX1JFQ1JFQVRFX09CSlMpOwotCi0Jb2JqX21kcCA9IGt6YWxsb2Moc2l6ZW9mKCpvYmpfbWRwKSwgR0ZQX05PRlMpOwotCWlmICghb2JqX21kcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlvc3RfaWR4ID0gc3JjX29hLT5vX25saW5rOwotCWxzbSA9ICplYTsKLQlpZiAoIWxzbSkgewotCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAob3N0X2lkeCA+PSBsb3YtPmRlc2MubGRfdGd0X2NvdW50IHx8Ci0JICAgICFsb3YtPmxvdl90Z3RzW29zdF9pZHhdKSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBsb3Zfb2luZm8gKmxvaSA9IGxzbS0+bHNtX29pbmZvW2ldOwotCi0JCWlmIChsb3Zfb2luZm9faXNfZHVtbXkobG9pKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChsb2ktPmxvaV9vc3RfaWR4ID09IG9zdF9pZHgpIHsKLQkJCWlmIChvc3RpZF9pZCgmbG9pLT5sb2lfb2kpICE9IG9zdGlkX2lkKCZzcmNfb2EtPm9fb2kpKSB7Ci0JCQkJcmMgPSAtRUlOVkFMOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKGkgPT0gbHNtLT5sc21fc3RyaXBlX2NvdW50KSB7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBvYmRfY3JlYXRlKE5VTEwsIGxvdi0+bG92X3RndHNbb3N0X2lkeF0tPmx0ZF9leHAsCi0JCQlzcmNfb2EsICZvYmpfbWRwLCBvdGkpOwotb3V0OgotCWtmcmVlKG9ial9tZHApOwotCXJldHVybiByYzsKLX0KLQotLyogdGhlIExPViBleHBlY3RzIG9hLT5vX2lkIHRvIGJlIHNldCB0byB0aGUgTE9WIG9iamVjdCBpZCAqLwotc3RhdGljIGludCBsb3ZfY3JlYXRlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJICAgICAgc3RydWN0IG9iZG8gKnNyY19vYSwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKiplYSwKLQkJICAgICAgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpCi17Ci0Jc3RydWN0IGxvdl9vYmQgKmxvdjsKLQlpbnQgcmMgPSAwOwotCi0JTEFTU0VSVChlYSk7Ci0JaWYgKCFleHApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKChzcmNfb2EtPm9fdmFsaWQgJiBPQkRfTURfRkxGTEFHUykgJiYKLQkgICAgc3JjX29hLT5vX2ZsYWdzID09IE9CRF9GTF9ERUxPUlBIQU4pIHsKLQkJLyogc2hvdWxkIGJlIHVzZWQgd2l0aCBMT1YgYW55bW9yZSAqLwotCQlMQlVHKCk7Ci0JfQotCi0JbG92ID0gJmV4cC0+ZXhwX29iZC0+dS5sb3Y7Ci0JaWYgKCFsb3YtPmRlc2MubGRfYWN0aXZlX3RndF9jb3VudCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlvYmRfZ2V0cmVmKGV4cC0+ZXhwX29iZCk7Ci0JLyogUmVjcmVhdGUgYSBzcGVjaWZpYyBvYmplY3QgaWQgYXQgdGhlIGdpdmVuIE9TVCBpbmRleCAqLwotCWlmICgoc3JjX29hLT5vX3ZhbGlkICYgT0JEX01EX0ZMRkxBR1MpICYmCi0JICAgIChzcmNfb2EtPm9fZmxhZ3MgJiBPQkRfRkxfUkVDUkVBVEVfT0JKUykpIHsKLQkJcmMgPSBsb3ZfcmVjcmVhdGUoZXhwLCBzcmNfb2EsIGVhLCBvdGkpOwotCX0KLQotCW9iZF9wdXRyZWYoZXhwLT5leHBfb2JkKTsKLQlyZXR1cm4gcmM7Ci19Ci0KICNkZWZpbmUgQVNTRVJUX0xTTV9NQUdJQyhsc21wKQkJCQkJCSAgXAogZG8gewkJCQkJCQkJCSAgICBcCiAJTEFTU0VSVCgobHNtcCkpOwkJCQkJCVwKQEAgLTEwNjUsNTkgKzk4MCw2IEBACiAJCSAiJXAtPmxzbV9tYWdpYz0leFxuIiwgKGxzbXApLCAobHNtcCktPmxzbV9tYWdpYyk7CSAgICAgIFwKIH0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbnQgbG92X2Rlc3Ryb3koY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkgICAgICAgc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAotCQkgICAgICAgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGksIHN0cnVjdCBvYmRfZXhwb3J0ICptZF9leHApCi17Ci0Jc3RydWN0IGxvdl9yZXF1ZXN0X3NldCAqc2V0OwotCXN0cnVjdCBvYmRfaW5mbyBvaW5mbzsKLQlzdHJ1Y3QgbG92X3JlcXVlc3QgKnJlcTsKLQlzdHJ1Y3QgbG92X29iZCAqbG92OwotCWludCByYyA9IDAsIGVyciA9IDA7Ci0KLQlBU1NFUlRfTFNNX01BR0lDKGxzbSk7Ci0KLQlpZiAoIWV4cCB8fCAhZXhwLT5leHBfb2JkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmIChvYS0+b192YWxpZCAmIE9CRF9NRF9GTENPT0tJRSkgewotCQlMQVNTRVJUKG90aSk7Ci0JCUxBU1NFUlQob3RpLT5vdGlfbG9nY29va2llcyk7Ci0JfQotCi0JbG92ID0gJmV4cC0+ZXhwX29iZC0+dS5sb3Y7Ci0Jb2JkX2dldHJlZihleHAtPmV4cF9vYmQpOwotCXJjID0gbG92X3ByZXBfZGVzdHJveV9zZXQoZXhwLCAmb2luZm8sIG9hLCBsc20sIG90aSwgJnNldCk7Ci0JaWYgKHJjKQotCQlnb3RvIG91dDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmc2V0LT5zZXRfbGlzdCwgcnFfbGluaykgewotCQlpZiAob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxDT09LSUUpCi0JCQlvdGktPm90aV9sb2djb29raWVzID0gc2V0LT5zZXRfY29va2llcyArIHJlcS0+cnFfc3RyaXBlOwotCi0JCWVyciA9IG9iZF9kZXN0cm95KGVudiwgbG92LT5sb3ZfdGd0c1tyZXEtPnJxX2lkeF0tPmx0ZF9leHAsCi0JCQkJICByZXEtPnJxX29pLm9pX29hLCBOVUxMLCBvdGksIE5VTEwpOwotCQllcnIgPSBsb3ZfdXBkYXRlX2NvbW1vbl9zZXQoc2V0LCByZXEsIGVycik7Ci0JCWlmIChlcnIpIHsKLQkJCUNFUlJPUigiJXM6IGRlc3Ryb3lpbmcgb2JqaWQgIkRPU1RJRCIgc3Vib2JqICIKLQkJCSAgICAgICBET1NUSUQiIG9uIE9TVCBpZHggJWQ6IHJjID0gJWRcbiIsCi0JCQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgUE9TVElEKCZvYS0+b19vaSksCi0JCQkgICAgICAgUE9TVElEKCZyZXEtPnJxX29pLm9pX29hLT5vX29pKSwKLQkJCSAgICAgICByZXEtPnJxX2lkeCwgZXJyKTsKLQkJCWlmICghcmMpCi0JCQkJcmMgPSBlcnI7Ci0JCX0KLQl9Ci0KLQlpZiAocmMgPT0gMCkKLQkJcmMgPSBsc21fb3BfZmluZChsc20tPmxzbV9tYWdpYyktPmxzbV9kZXN0cm95KGxzbSwgb2EsIG1kX2V4cCk7Ci0KLQllcnIgPSBsb3ZfZmluaV9kZXN0cm95X3NldChzZXQpOwotb3V0OgotCW9iZF9wdXRyZWYoZXhwLT5leHBfb2JkKTsKLQlyZXR1cm4gcmMgPyByYyA6IGVycjsKLX0KLQogc3RhdGljIGludCBsb3ZfZ2V0YXR0cl9pbnRlcnByZXQoc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqcnFzZXQsCiAJCQkJIHZvaWQgKmRhdGEsIGludCByYykKIHsKQEAgLTEyNjcsNDYgKzExMjksNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBmaW5kIGFueSBsZGxtIGxvY2sgb2YgdGhlIGlub2RlIGluIGxvdgotICogcmV0dXJuIDAgICAgbm90IGZpbmQKLSAqCTEgICAgZmluZCBvbmUKLSAqICAgICAgPCAwICAgIGVycm9yCi0gKi8KLXN0YXRpYyBpbnQgbG92X2ZpbmRfY2JkYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCQkgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLCBsZGxtX2l0ZXJhdG9yX3QgaXQsCi0JCQkgICB2b2lkICpkYXRhKQotewotCXN0cnVjdCBsb3Zfb2JkICpsb3Y7Ci0JaW50IHJjID0gMCwgaTsKLQotCUFTU0VSVF9MU01fTUFHSUMobHNtKTsKLQotCWlmICghZXhwIHx8ICFleHAtPmV4cF9vYmQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JbG92ID0gJmV4cC0+ZXhwX29iZC0+dS5sb3Y7Ci0JZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBsb3Zfc3RyaXBlX21kIHN1Ym1kOwotCQlzdHJ1Y3QgbG92X29pbmZvICpsb2kgPSBsc20tPmxzbV9vaW5mb1tpXTsKLQotCQlpZiAobG92X29pbmZvX2lzX2R1bW15KGxvaSkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoIWxvdi0+bG92X3RndHNbbG9pLT5sb2lfb3N0X2lkeF0pIHsKLQkJCUNERUJVRyhEX0hBLCAibG92IGlkeCAlZCBOVUxMXG4iLCBsb2ktPmxvaV9vc3RfaWR4KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJc3VibWQubHNtX29pID0gbG9pLT5sb2lfb2k7Ci0JCXN1Ym1kLmxzbV9zdHJpcGVfY291bnQgPSAwOwotCQlyYyA9IG9iZF9maW5kX2NiZGF0YShsb3YtPmxvdl90Z3RzW2xvaS0+bG9pX29zdF9pZHhdLT5sdGRfZXhwLAotCQkJCSAgICAgJnN1Ym1kLCBpdCwgZGF0YSk7Ci0JCWlmIChyYyAhPSAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQlyZXR1cm4gcmM7Ci19Ci0KIGludCBsb3Zfc3RhdGZzX2ludGVycHJldChzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICpycXNldCwgdm9pZCAqZGF0YSwgaW50IHJjKQogewogCXN0cnVjdCBsb3ZfcmVxdWVzdF9zZXQgKmxvdnNldCA9IChzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICopZGF0YTsKQEAgLTE0NjAsNyArMTI4Miw3IEBACiAJCX0KIAogCQlkZXNjID0gKHN0cnVjdCBsb3ZfZGVzYyAqKWRhdGEtPmlvY19pbmxidWYxOwotCQltZW1jcHkoZGVzYywgJihsb3YtPmRlc2MpLCBzaXplb2YoKmRlc2MpKTsKKwkJbWVtY3B5KGRlc2MsICZsb3YtPmRlc2MsIHNpemVvZigqZGVzYykpOwogCiAJCXV1aWRwID0gKHN0cnVjdCBvYmRfdXVpZCAqKWRhdGEtPmlvY19pbmxidWYyOwogCQlnZW5wID0gKF9fdTMyICopZGF0YS0+aW9jX2lubGJ1ZjM7CkBAIC0xNDc3LDkgKzEyOTksNiBAQAogCQlvYmRfaW9jdGxfZnJlZWRhdGEoYnVmLCBsZW4pOwogCQlicmVhazsKIAl9Ci0JY2FzZSBMTF9JT0NfTE9WX0dFVFNUUklQRToKLQkJcmMgPSBsb3ZfZ2V0c3RyaXBlKGV4cCwga2FyZywgdWFyZyk7Ci0JCWJyZWFrOwogCWNhc2UgT0JEX0lPQ19RVU9UQUNUTDogewogCQlzdHJ1Y3QgaWZfcXVvdGFjdGwgKnFjdGwgPSBrYXJnOwogCQlzdHJ1Y3QgbG92X3RndF9kZXNjICp0Z3QgPSBOVUxMOwpAQCAtMTcyNiw2ICsxNTQ1LDggQEAKIAl1NjQgZm1fc3RhcnQsIGZtX2VuZCwgZm1fbGVuZ3RoLCBmbV9lbmRfb2Zmc2V0OwogCXU2NCBjdXJyX2xvYzsKIAlpbnQgY3VycmVudF9leHRlbnQgPSAwLCByYyA9IDAsIGk7CisJLyogV2hldGhlciBoYXZlIHdlIGNvbGxlY3RlZCBlbm91Z2ggZXh0ZW50cyAqLworCWJvb2wgZW5vdWdoID0gZmFsc2U7CiAJaW50IG9zdF9lb2YgPSAwOyAvKiBFT0YgZm9yIG9iamVjdCAqLwogCWludCBvc3RfZG9uZSA9IDA7IC8qIGRvbmUgd2l0aCByZXF1aXJlZCBtYXBwaW5nIGZvciB0aGlzIE9TVD8gKi8KIAlpbnQgbGFzdF9zdHJpcGU7CkBAIC0xODYwLDcgKzE2ODEsNyBAQAogCQkJbHVuX3N0YXJ0ICs9IGxlbl9tYXBwZWRfc2luZ2xlX2NhbGw7CiAJCQlmbV9sb2NhbC0+Zm1fbGVuZ3RoID0gcmVxX2ZtX2xlbiAtIGxlbl9tYXBwZWRfc2luZ2xlX2NhbGw7CiAJCQlyZXFfZm1fbGVuID0gZm1fbG9jYWwtPmZtX2xlbmd0aDsKLQkJCWZtX2xvY2FsLT5mbV9leHRlbnRfY291bnQgPSBjb3VudF9sb2NhbDsKKwkJCWZtX2xvY2FsLT5mbV9leHRlbnRfY291bnQgPSBlbm91Z2ggPyAxIDogY291bnRfbG9jYWw7CiAJCQlmbV9sb2NhbC0+Zm1fbWFwcGVkX2V4dGVudHMgPSAwOwogCQkJZm1fbG9jYWwtPmZtX2ZsYWdzID0gZmllbWFwLT5mbV9mbGFnczsKIApAQCAtMTkwOCw2ICsxNzI5LDEyIEBACiAJCQkJCWdvdG8gZmluaXNoOwogCQkJCX0KIAkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoZW5vdWdoKSB7CisJCQkJLyoKKwkJCQkgKiBXZSd2ZSBjb2xsZWN0ZWQgZW5vdWdoIGV4dGVudHMgYW5kIHRoZXJlIGFyZQorCQkJCSAqIG1vcmUgZXh0ZW50cyBhZnRlciBpdC4KKwkJCQkgKi8KKwkJCQlnb3RvIGZpbmlzaDsKIAkJCX0KIAogCQkJLyogSWYgd2UganVzdCBuZWVkIG51bSBvZiBleHRlbnRzIHRoZW4gZ28gdG8gbmV4dCBkZXZpY2UgKi8KQEAgLTE5MTYsOCArMTc0Myw5IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCWxlbl9tYXBwZWRfc2luZ2xlX2NhbGwgPSBsY2xfZm1fZXh0W2V4dF9jb3VudC0xXS5mZV9sb2dpY2FsIC0KLQkJCQkgIGx1bl9zdGFydCArIGxjbF9mbV9leHRbZXh0X2NvdW50IC0gMV0uZmVfbGVuZ3RoOworCQkJbGVuX21hcHBlZF9zaW5nbGVfY2FsbCA9CisJCQkJbGNsX2ZtX2V4dFtleHRfY291bnQgLSAxXS5mZV9sb2dpY2FsIC0KKwkJCQlsdW5fc3RhcnQgKyBsY2xfZm1fZXh0W2V4dF9jb3VudCAtIDFdLmZlX2xlbmd0aDsKIAogCQkJLyogSGF2ZSB3ZSBmaW5pc2hlZCBtYXBwaW5nIG9uIHRoaXMgZGV2aWNlPyAqLwogCQkJaWYgKHJlcV9mbV9sZW4gPD0gbGVuX21hcHBlZF9zaW5nbGVfY2FsbCkKQEAgLTE5MjYsMTQgKzE3NTQsMTUgQEAKIAkJCS8qIENsZWFyIHRoZSBFWFRFTlRfTEFTVCBmbGFnIHdoaWNoIGNhbiBiZSBwcmVzZW50IG9uCiAJCQkgKiBsYXN0IGV4dGVudAogCQkJICovCi0JCQlpZiAobGNsX2ZtX2V4dFtleHRfY291bnQtMV0uZmVfZmxhZ3MgJiBGSUVNQVBfRVhURU5UX0xBU1QpCisJCQlpZiAobGNsX2ZtX2V4dFtleHRfY291bnQgLSAxXS5mZV9mbGFncyAmCisJCQkgICAgRklFTUFQX0VYVEVOVF9MQVNUKQogCQkJCWxjbF9mbV9leHRbZXh0X2NvdW50IC0gMV0uZmVfZmxhZ3MgJj0KIAkJCQkJCQkgICAgfkZJRU1BUF9FWFRFTlRfTEFTVDsKIAogCQkJY3Vycl9sb2MgPSBsb3Zfc3RyaXBlX3NpemUobHNtLAotCQkJCQkgICBsY2xfZm1fZXh0W2V4dF9jb3VudCAtIDFdLmZlX2xvZ2ljYWwrCi0JCQkJCSAgIGxjbF9mbV9leHRbZXh0X2NvdW50IC0gMV0uZmVfbGVuZ3RoLAotCQkJCQkgICBjdXJfc3RyaXBlKTsKKwkJCQkJbGNsX2ZtX2V4dFtleHRfY291bnQgLSAxXS5mZV9sb2dpY2FsICsKKwkJCQkJbGNsX2ZtX2V4dFtleHRfY291bnQgLSAxXS5mZV9sZW5ndGgsCisJCQkJCWN1cl9zdHJpcGUpOwogCQkJaWYgKGN1cnJfbG9jID49IGZtX2tleS0+b2Eub19zaXplKQogCQkJCW9zdF9lb2YgPSAxOwogCkBAIC0xOTQ1LDcgKzE3NzQsNyBAQAogCiAJCQkvKiBSYW4gb3V0IG9mIGF2YWlsYWJsZSBleHRlbnRzPyAqLwogCQkJaWYgKGN1cnJlbnRfZXh0ZW50ID49IGZpZW1hcC0+Zm1fZXh0ZW50X2NvdW50KQotCQkJCWdvdG8gZmluaXNoOworCQkJCWVub3VnaCA9IHRydWU7CiAJCX0gd2hpbGUgKG9zdF9kb25lID09IDAgJiYgb3N0X2VvZiA9PSAwKTsKIAogCQlpZiAoY3VyX3N0cmlwZV93cmFwID09IGxhc3Rfc3RyaXBlKQpAQCAtMTk4NSw3MyArMTgxNCwxNCBAQAogewogCXN0cnVjdCBvYmRfZGV2aWNlICpvYmRkZXYgPSBjbGFzc19leHAyb2JkKGV4cCk7CiAJc3RydWN0IGxvdl9vYmQgKmxvdiA9ICZvYmRkZXYtPnUubG92OwotCWludCBpLCByYzsKKwlpbnQgcmM7CiAKIAlpZiAoIXZhbGxlbiB8fCAhdmFsKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCW9iZF9nZXRyZWYob2JkZGV2KTsKIAotCWlmIChLRVlfSVMoS0VZX0xPQ0tfVE9fU1RSSVBFKSkgewotCQlzdHJ1Y3QgewotCQkJY2hhciBuYW1lWzE2XTsKLQkJCXN0cnVjdCBsZGxtX2xvY2sgKmxvY2s7Ci0JCX0gKmRhdGEgPSBrZXk7Ci0JCXN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzX2lkID0gJmRhdGEtPmxvY2stPmxfcmVzb3VyY2UtPmxyX25hbWU7Ci0JCXN0cnVjdCBsb3Zfb2luZm8gKmxvaTsKLQkJX191MzIgKnN0cmlwZSA9IHZhbDsKLQotCQlpZiAoKnZhbGxlbiA8IHNpemVvZigqc3RyaXBlKSkgewotCQkJcmMgPSAtRUZBVUxUOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJKnZhbGxlbiA9IHNpemVvZigqc3RyaXBlKTsKLQotCQkvKiBYWFggVGhpcyBpcyBhbm90aGVyIG9uZSBvZiB0aG9zZSBiaXRzIHRoYXQgd2lsbCBuZWVkIHRvCi0JCSAqIGNoYW5nZSBpZiB3ZSBldmVyIGFjdHVhbGx5IHN1cHBvcnQgbmVzdGVkIExPVnMuICBJdCB1c2VzCi0JCSAqIHRoZSBsb2NrJ3MgZXhwb3J0IHRvIGZpbmQgb3V0IHdoaWNoIHN0cmlwZSBpdCBpcy4KLQkJICovCi0JCS8qIFhYWCAtIGl0J3MgYXNzdW1lZCBhbGwgdGhlIGxvY2tzIGZvciBkZWxldGVkIE9TVHMgaGF2ZQotCQkgKiBiZWVuIGNhbmNlbGxlZC4gQWxzbywgdGhlIGV4cG9ydCBmb3IgZGVsZXRlZCBPU1RzIHdpbGwKLQkJICogYmUgTlVMTCBhbmQgd29uJ3QgbWF0Y2ggdGhlIGxvY2sncyBleHBvcnQuCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fc3RyaXBlX2NvdW50OyBpKyspIHsKLQkJCWxvaSA9IGxzbS0+bHNtX29pbmZvW2ldOwotCQkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoIWxvdi0+bG92X3RndHNbbG9pLT5sb2lfb3N0X2lkeF0pCi0JCQkJY29udGludWU7Ci0JCQlpZiAobG92LT5sb3ZfdGd0c1tsb2ktPmxvaV9vc3RfaWR4XS0+bHRkX2V4cCA9PQotCQkJICAgIGRhdGEtPmxvY2stPmxfY29ubl9leHBvcnQgJiYKLQkJCSAgICBvc3RpZF9yZXNfbmFtZV9lcSgmbG9pLT5sb2lfb2ksIHJlc19pZCkpIHsKLQkJCQkqc3RyaXBlID0gaTsKLQkJCQlyYyA9IDA7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQkJTERMTV9FUlJPUihkYXRhLT5sb2NrLCAibG9jayBvbiBpbm9kZSB3aXRob3V0IHN1Y2ggb2JqZWN0Iik7Ci0JCWR1bXBfbHNtKERfRVJST1IsIGxzbSk7Ci0JCXJjID0gLUVOWElPOwotCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfTEFTVF9JRCkpIHsKLQkJc3RydWN0IG9iZF9pZF9pbmZvICppbmZvID0gdmFsOwotCQlfX3UzMiBzaXplID0gc2l6ZW9mKHU2NCk7Ci0JCXN0cnVjdCBsb3ZfdGd0X2Rlc2MgKnRndDsKLQotCQlMQVNTRVJUKCp2YWxsZW4gPT0gc2l6ZW9mKHN0cnVjdCBvYmRfaWRfaW5mbykpOwotCQl0Z3QgPSBsb3YtPmxvdl90Z3RzW2luZm8tPmlkeF07Ci0KLQkJaWYgKCF0Z3QgfHwgIXRndC0+bHRkX2FjdGl2ZSkgewotCQkJcmMgPSAtRVNSQ0g7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCXJjID0gb2JkX2dldF9pbmZvKGVudiwgdGd0LT5sdGRfZXhwLCBrZXlsZW4sIGtleSwKLQkJCQkgICZzaXplLCBpbmZvLT5kYXRhLCBOVUxMKTsKLQkJcmMgPSAwOwotCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfTE9WREVTQykpIHsKKwlpZiAoS0VZX0lTKEtFWV9MT1ZERVNDKSkgewogCQlzdHJ1Y3QgbG92X2Rlc2MgKmRlc2NfcmV0ID0gdmFsOwogCQkqZGVzY19yZXQgPSBsb3YtPmRlc2M7CiAKQEAgLTIwNjAsMjIgKzE4MzAsNiBAQAogCX0gZWxzZSBpZiAoS0VZX0lTKEtFWV9GSUVNQVApKSB7CiAJCXJjID0gbG92X2ZpZW1hcChsb3YsIGtleWxlbiwga2V5LCB2YWxsZW4sIHZhbCwgbHNtKTsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmIChLRVlfSVMoS0VZX0NPTk5FQ1RfRkxBRykpIHsKLQkJc3RydWN0IGxvdl90Z3RfZGVzYyAqdGd0OwotCQlfX3U2NCBvc3RfaWR4ID0gKigoX191NjQgKil2YWwpOwotCi0JCUxBU1NFUlQoKnZhbGxlbiA9PSBzaXplb2YoX191NjQpKTsKLQkJTEFTU0VSVChvc3RfaWR4IDwgbG92LT5kZXNjLmxkX3RndF9jb3VudCk7Ci0JCXRndCA9IGxvdi0+bG92X3RndHNbb3N0X2lkeF07Ci0KLQkJaWYgKCF0Z3QgfHwgIXRndC0+bHRkX2V4cCkgewotCQkJcmMgPSAtRVNSQ0g7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCSooKF9fdTY0ICopdmFsKSA9IGV4cF9jb25uZWN0X2ZsYWdzKHRndC0+bHRkX2V4cCk7Ci0JCXJjID0gMDsKLQkJZ290byBvdXQ7CiAJfSBlbHNlIGlmIChLRVlfSVMoS0VZX1RHVF9DT1VOVCkpIHsKIAkJKigoaW50ICopdmFsKSA9IGxvdi0+ZGVzYy5sZF90Z3RfY291bnQ7CiAJCXJjID0gMDsKQEAgLTIwOTgsOCArMTg1Miw3IEBACiAJdTMyIGNvdW50OwogCWludCBpLCByYyA9IDAsIGVycjsKIAlzdHJ1Y3QgbG92X3RndF9kZXNjICp0Z3Q7Ci0JdW5zaWduZWQgaW50IGluY3IgPSAwLCBjaGVja191dWlkID0gMCwgZG9faW5hY3RpdmUgPSAwLCBub19zZXQgPSAwOwotCXVuc2lnbmVkIGludCBuZXh0X2lkID0gMCwgbWRzX2NvbiA9IDA7CisJaW50IGRvX2luYWN0aXZlID0gMCwgbm9fc2V0ID0gMDsKIAogCWlmICghc2V0KSB7CiAJCW5vX3NldCA9IDE7CkBAIC0yMTExLDE4ICsxODY0LDggQEAKIAlvYmRfZ2V0cmVmKG9iZGRldik7CiAJY291bnQgPSBsb3YtPmRlc2MubGRfdGd0X2NvdW50OwogCi0JaWYgKEtFWV9JUyhLRVlfTkVYVF9JRCkpIHsKLQkJY291bnQgPSB2YWxsZW4gLyBzaXplb2Yoc3RydWN0IG9iZF9pZF9pbmZvKTsKLQkJdmFsbGVuID0gc2l6ZW9mKHU2NCk7Ci0JCWluY3IgPSBzaXplb2Yoc3RydWN0IG9iZF9pZF9pbmZvKTsKKwlpZiAoS0VZX0lTKEtFWV9DSEVDS1NVTSkpIHsKIAkJZG9faW5hY3RpdmUgPSAxOwotCQluZXh0X2lkID0gMTsKLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfQ0hFQ0tTVU0pKSB7Ci0JCWRvX2luYWN0aXZlID0gMTsKLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfRVZJQ1RfQllfTklEKSkgewotCQkvKiB1c2UgZGVmYXVsdHM6ICBkb19pbmFjdGl2ZSA9IGluY3IgPSAwOyAqLwotCX0gZWxzZSBpZiAoS0VZX0lTKEtFWV9NRFNfQ09OTikpIHsKLQkJbWRzX2NvbiA9IDE7CiAJfSBlbHNlIGlmIChLRVlfSVMoS0VZX0NBQ0hFX1NFVCkpIHsKIAkJTEFTU0VSVCghbG92LT5sb3ZfY2FjaGUpOwogCQlsb3YtPmxvdl9jYWNoZSA9IHZhbDsKQEAgLTIxMzAsMTEgKzE4NzMsOSBAQAogCQljbF9jYWNoZV9pbmNyZWYobG92LT5sb3ZfY2FjaGUpOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCB2YWwgPSAoY2hhciAqKXZhbCArIGluY3IpIHsKLQkJaWYgKG5leHRfaWQpCi0JCQl0Z3QgPSBsb3YtPmxvdl90Z3RzWygoc3RydWN0IG9iZF9pZF9pbmZvICopdmFsKS0+aWR4XTsKLQkJZWxzZQotCQkJdGd0ID0gbG92LT5sb3ZfdGd0c1tpXTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl0Z3QgPSBsb3YtPmxvdl90Z3RzW2ldOworCiAJCS8qIE9TVCB3YXMgZGlzY29ubmVjdGVkICovCiAJCWlmICghdGd0IHx8ICF0Z3QtPmx0ZF9leHApCiAJCQljb250aW51ZTsKQEAgLTIxNDMsMzQgKzE4ODQsOCBAQAogCQlpZiAoIXRndC0+bHRkX2FjdGl2ZSAmJiAhZG9faW5hY3RpdmUpCiAJCQljb250aW51ZTsKIAotCQlpZiAobWRzX2NvbikgewotCQkJc3RydWN0IG1kc19ncm91cF9pbmZvICptZ2k7Ci0KLQkJCUxBU1NFUlQodmFsbGVuID09IHNpemVvZigqbWdpKSk7Ci0JCQltZ2kgPSAoc3RydWN0IG1kc19ncm91cF9pbmZvICopdmFsOwotCi0JCQkvKiBPbmx5IHdhbnQgYSBzcGVjaWZpYyBPU0MgKi8KLQkJCWlmIChtZ2ktPnV1aWQgJiYgIW9iZF91dWlkX2VxdWFscyhtZ2ktPnV1aWQsCi0JCQkJCQkJICAmdGd0LT5sdGRfdXVpZCkpCi0JCQkJY29udGludWU7Ci0KLQkJCWVyciA9IG9iZF9zZXRfaW5mb19hc3luYyhlbnYsIHRndC0+bHRkX2V4cCwKLQkJCQkJCSBrZXlsZW4sIGtleSwgc2l6ZW9mKGludCksCi0JCQkJCQkgJm1naS0+Z3JvdXAsIHNldCk7Ci0JCX0gZWxzZSBpZiAobmV4dF9pZCkgewotCQkJZXJyID0gb2JkX3NldF9pbmZvX2FzeW5jKGVudiwgdGd0LT5sdGRfZXhwLAotCQkJCQkga2V5bGVuLCBrZXksIHZhbGxlbiwKLQkJCQkJICgoc3RydWN0IG9iZF9pZF9pbmZvICopdmFsKS0+ZGF0YSwgc2V0KTsKLQkJfSBlbHNlIHsKLQkJCS8qIE9ubHkgd2FudCBhIHNwZWNpZmljIE9TQyAqLwotCQkJaWYgKGNoZWNrX3V1aWQgJiYKLQkJCSAgICAhb2JkX3V1aWRfZXF1YWxzKHZhbCwgJnRndC0+bHRkX3V1aWQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQllcnIgPSBvYmRfc2V0X2luZm9fYXN5bmMoZW52LCB0Z3QtPmx0ZF9leHAsCi0JCQkJCQkga2V5bGVuLCBrZXksIHZhbGxlbiwgdmFsLCBzZXQpOwotCQl9Ci0KKwkJZXJyID0gb2JkX3NldF9pbmZvX2FzeW5jKGVudiwgdGd0LT5sdGRfZXhwLCBrZXlsZW4sIGtleSwKKwkJCQkJIHZhbGxlbiwgdmFsLCBzZXQpOwogCQlpZiAoIXJjKQogCQkJcmMgPSBlcnI7CiAJfQpAQCAtMjMxOCwxMiArMjAzMyw4IEBACiAJLnN0YXRmc19hc3luYyAgID0gbG92X3N0YXRmc19hc3luYywKIAkucGFja21kICAgICAgICAgPSBsb3ZfcGFja21kLAogCS51bnBhY2ttZCAgICAgICA9IGxvdl91bnBhY2ttZCwKLQkuY3JlYXRlICAgICAgICAgPSBsb3ZfY3JlYXRlLAotCS5kZXN0cm95ICAgICAgICA9IGxvdl9kZXN0cm95LAogCS5nZXRhdHRyX2FzeW5jICA9IGxvdl9nZXRhdHRyX2FzeW5jLAogCS5zZXRhdHRyX2FzeW5jICA9IGxvdl9zZXRhdHRyX2FzeW5jLAotCS5hZGp1c3Rfa21zICAgICA9IGxvdl9hZGp1c3Rfa21zLAotCS5maW5kX2NiZGF0YSAgICA9IGxvdl9maW5kX2NiZGF0YSwKIAkuaW9jb250cm9sICAgICAgPSBsb3ZfaW9jb250cm9sLAogCS5nZXRfaW5mbyAgICAgICA9IGxvdl9nZXRfaW5mbywKIAkuc2V0X2luZm9fYXN5bmMgPSBsb3Zfc2V0X2luZm9fYXN5bmMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmplY3QuYwppbmRleCBmOTYyMWIwLi41MmY3MzYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JqZWN0LmMKQEAgLTc1LDYgKzc1LDEzIEBACiAKIHN0YXRpYyBpbnQgbG92X2xheW91dF93YWl0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGxvdl9vYmplY3QgKmxvdik7CiAKK3ZvaWQgbG92X2xzbV9wdXQoc3RydWN0IGNsX29iamVjdCAqdW51c2VkLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQoreworCWlmIChsc20pCisJCWxvdl9mcmVlX21lbW1kKCZsc20pOworfQorRVhQT1JUX1NZTUJPTChsb3ZfbHNtX3B1dCk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIExvdiBvYmplY3QgbGF5b3V0IG9wZXJhdGlvbnMuCkBAIC0xOTUsNiArMjAyLDEwIEBACiAJc3RydWN0IGNsX29iamVjdF9oZWFkZXIgKmhkciA9IGNsX29iamVjdF9oZWFkZXIoJmxvdi0+bG9fY2wpOwogCXN0cnVjdCBjbF9vYmplY3QgKm87CiAKKwlpZiAoIXN0cmlwZSkKKwkJcmV0dXJuIGhkci0+Y29oX3BhZ2VfYnVmc2l6ZSAtIGxvdi0+bG9fY2wuY29fc2xpY2Vfb2ZmIC0KKwkJICAgICAgIGNmc19zaXplX3JvdW5kKHNpemVvZihzdHJ1Y3QgbG92X3BhZ2UpKTsKKwogCWNsX29iamVjdF9mb3JfZWFjaChvLCBzdHJpcGUpCiAJCW8tPmNvX3NsaWNlX29mZiArPSBoZHItPmNvaF9wYWdlX2J1ZnNpemU7CiAKQEAgLTIyNCw2ICsyMzUsNyBAQAogCiAJTEFTU0VSVCghbG92LT5sb19sc20pOwogCWxvdi0+bG9fbHNtID0gbHNtX2FkZHJlZihsc20pOworCWxvdi0+bG9fbGF5b3V0X2ludmFsaWQgPSB0cnVlOwogCXIwLT5sb19uciAgPSBsc20tPmxzbV9zdHJpcGVfY291bnQ7CiAJTEFTU0VSVChyMC0+bG9fbnIgPD0gbG92X3RhcmdldHNfbnIoZGV2KSk7CiAKQEAgLTcxOSw2ICs3MzEsMTAgQEAKIAkJTEFTU0VSVChhdG9taWNfcmVhZCgmbG92LT5sb19hY3RpdmVfaW9zKSA9PSAwKTsKIAogCQlsb3YtPmxvX3R5cGUgPSBMTFRfRU1QVFk7CisJCS8qIHBhZ2UgYnVmc2l6ZSBmaXh1cCAqLworCQljbF9vYmplY3RfaGVhZGVyKCZsb3YtPmxvX2NsKS0+Y29oX3BhZ2VfYnVmc2l6ZSAtPQorCQkJbG92X3BhZ2Vfc2xpY2VfZml4dXAobG92LCBOVUxMKTsKKwogCQlyZXN1bHQgPSBuZXdfb3BzLT5sbG9faW5pdChlbnYsCiAJCQkJCWx1Mmxvdl9kZXYobG92LT5sb19jbC5jb19sdS5sb19kZXYpLAogCQkJCQlsb3YsIGNvbmYsIHN0YXRlKTsKQEAgLTg3OCw4ICs4OTQsOCBAQAogCXJldHVybiBMT1ZfMkRJU1BBVENIX05PTE9DSyhjbDJsb3Yob2JqKSwgbGxvX2dldGF0dHIsIGVudiwgb2JqLCBhdHRyKTsKIH0KIAotc3RhdGljIGludCBsb3ZfYXR0cl9zZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCi0JCQljb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgdmFsaWQpCitzdGF0aWMgaW50IGxvdl9hdHRyX3VwZGF0ZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgdmFsaWQpCiB7CiAJLyoKIAkgKiBObyBkaXNwYXRjaCBpcyByZXF1aXJlZCBoZXJlLCBhcyBubyBsYXlvdXQgaW1wbGVtZW50cyB0aGlzLgpAQCAtODk1LDEzICs5MTEsMzAgQEAKIAkJCQkgICAgaW8pOwogfQogCitzdGF0aWMgaW50IGxvdl9vYmplY3RfZ2V0c3RyaXBlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAorCQkJCXN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKmx1bSkKK3sKKwlzdHJ1Y3QgbG92X29iamVjdCAqbG92ID0gY2wybG92KG9iaik7CisJc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbTsKKwlpbnQgcmMgPSAwOworCisJbHNtID0gbG92X2xzbV9hZGRyZWYobG92KTsKKwlpZiAoIWxzbSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJcmMgPSBsb3ZfZ2V0c3RyaXBlKGNsMmxvdihvYmopLCBsc20sIGx1bSk7CisJbG92X2xzbV9wdXQob2JqLCBsc20pOworCXJldHVybiByYzsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBjbF9vYmplY3Rfb3BlcmF0aW9ucyBsb3Zfb3BzID0gewogCS5jb29fcGFnZV9pbml0ID0gbG92X3BhZ2VfaW5pdCwKIAkuY29vX2xvY2tfaW5pdCA9IGxvdl9sb2NrX2luaXQsCiAJLmNvb19pb19pbml0ICAgPSBsb3ZfaW9faW5pdCwKIAkuY29vX2F0dHJfZ2V0ICA9IGxvdl9hdHRyX2dldCwKLQkuY29vX2F0dHJfc2V0ICA9IGxvdl9hdHRyX3NldCwKLQkuY29vX2NvbmZfc2V0ICA9IGxvdl9jb25mX3NldAorCS5jb29fYXR0cl91cGRhdGUgPSBsb3ZfYXR0cl91cGRhdGUsCisJLmNvb19jb25mX3NldCAgPSBsb3ZfY29uZl9zZXQsCisJLmNvb19nZXRzdHJpcGUgPSBsb3Zfb2JqZWN0X2dldHN0cmlwZQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBsdV9vYmplY3Rfb3BlcmF0aW9ucyBsb3ZfbHVfb2JqX29wcyA9IHsKQEAgLTkzOCw3ICs5NzEsNyBAQAogCXJldHVybiBvYmo7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbG92X2xzbV9hZGRyZWYoc3RydWN0IGxvdl9vYmplY3QgKmxvdikKK3N0cnVjdCBsb3Zfc3RyaXBlX21kICpsb3ZfbHNtX2FkZHJlZihzdHJ1Y3QgbG92X29iamVjdCAqbG92KQogewogCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20gPSBOVUxMOwogCkBAIC05NjksMTMgKzEwMDIsNiBAQAogfQogRVhQT1JUX1NZTUJPTChsb3ZfbHNtX2dldCk7CiAKLXZvaWQgbG92X2xzbV9wdXQoc3RydWN0IGNsX29iamVjdCAqdW51c2VkLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQotewotCWlmIChsc20pCi0JCWxvdl9mcmVlX21lbW1kKCZsc20pOwotfQotRVhQT1JUX1NZTUJPTChsb3ZfbHNtX3B1dCk7Ci0KIGludCBsb3ZfcmVhZF9hbmRfY2xlYXJfYXN5bmNfcmMoc3RydWN0IGNsX29iamVjdCAqY2xvYikKIHsKIAlzdHJ1Y3QgbHVfb2JqZWN0ICpsdW9iajsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFjay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wYWNrLmMKaW5kZXggODY5ZWY0MS4uYmU2ZTk4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wYWNrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wYWNrLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfdXNlci5oIgogCiAjaW5jbHVkZSAibG92X2ludGVybmFsLmgiCisjaW5jbHVkZSAibG92X2NsX2ludGVybmFsLmgiCiAKIHZvaWQgbG92X2R1bXBfbG1tX2NvbW1vbihpbnQgbGV2ZWwsIHZvaWQgKmxtbXApCiB7CkBAIC0xMDQsMTEgKzEwNSw5IEBACiAgKiAgICAgTE9WcyBwcm9wZXJseS4gIEZvciBub3cgbG92X21kc19tZF9zaXplKCkganVzdCBhc3N1bWVzIG9uZSB1NjQKICAqICAgICBwZXIgc3RyaXBlLgogICovCi1pbnQgbG92X3BhY2ttZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbG92X21kc19tZCAqKmxtbXAsCi0JICAgICAgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20pCitpbnQgbG92X29iZF9wYWNrbWQoc3RydWN0IGxvdl9vYmQgKmxvdiwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAorCQkgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQogewotCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBjbGFzc19leHAyb2JkKGV4cCk7Ci0Jc3RydWN0IGxvdl9vYmQgKmxvdiA9ICZvYmQtPnUubG92OwogCXN0cnVjdCBsb3ZfbWRzX21kX3YxICpsbW12MTsKIAlzdHJ1Y3QgbG92X21kc19tZF92MyAqbG1tdjM7CiAJX191MTYgc3RyaXBlX2NvdW50OwpAQCAtMTQ4LDE2ICsxNDcsMTEgQEAKIAkJCXN0cmlwZV9jb3VudCA9IDA7CiAJCX0KIAl9IGVsc2UgewotCQkvKiBObyBuZWVkIHRvIGFsbG9jYXRlIG1vcmUgdGhhbiBtYXhpbXVtIHN1cHBvcnRlZCBzdHJpcGVzLgotCQkgKiBBbnl3YXksIHRoaXMgaXMgcHJldHR5IGluYWNjdXJhdGUgc2luY2UgbGRfdGd0X2NvdW50IG5vdwotCQkgKiByZXByZXNlbnRzIG1heCBpbmRleCBhbmQgd2Ugc2hvdWxkIHJlbHkgb24gdGhlIGFjdHVhbCBudW1iZXIKLQkJICogb2YgT1NUcyBpbnN0ZWFkCisJCS8qCisJCSAqIFRvIGNhbGN1bGF0ZSBtYXhpbXVtIGVhc2l6ZSBieSBhY3RpdmUgdGFyZ2V0cyBhdCBwcmVzZW50LAorCQkgKiB3aGljaCBpcyBleGFjdGx5IHRoZSBtYXhpbXVtIGVhc2l6ZSB0byBiZSBzZWVuIGJ5IExPVgogCQkgKi8KLQkJc3RyaXBlX2NvdW50ID0gbG92X21kc19tZF9tYXhfc3RyaXBlX2NvdW50KAotCQkJbG92LT5sb3Zfb2NkLm9jZF9tYXhfZWFzaXplLCBsbW1fbWFnaWMpOwotCi0JCWlmIChzdHJpcGVfY291bnQgPiBsb3YtPmRlc2MubGRfdGd0X2NvdW50KQotCQkJc3RyaXBlX2NvdW50ID0gbG92LT5kZXNjLmxkX3RndF9jb3VudDsKKwkJc3RyaXBlX2NvdW50ID0gbG92LT5kZXNjLmxkX2FjdGl2ZV90Z3RfY291bnQ7CiAJfQogCiAJLyogWFhYIExPViBTVEFDS0lORyBjYWxsIGludG8gb3NjIGZvciBzaXplcyAqLwpAQCAtMjI1LDYgKzIxOSwxNSBAQAogCXJldHVybiBsbW1fc2l6ZTsKIH0KIAoraW50IGxvdl9wYWNrbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAorCSAgICAgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQoreworCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBjbGFzc19leHAyb2JkKGV4cCk7CisJc3RydWN0IGxvdl9vYmQgKmxvdiA9ICZvYmQtPnUubG92OworCisJcmV0dXJuIGxvdl9vYmRfcGFja21kKGxvdiwgbG1tcCwgbHNtKTsKK30KKwogLyogRmluZCB0aGUgbWF4IHN0cmlwZWNvdW50IHdlIHNob3VsZCB1c2UgKi8KIF9fdTE2IGxvdl9nZXRfc3RyaXBlY250KHN0cnVjdCBsb3Zfb2JkICpsb3YsIF9fdTMyIG1hZ2ljLCBfX3UxNiBzdHJpcGVfY291bnQpCiB7CkBAIC0yODQsNyArMjg3LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmKCpsc21wKS0+bHNtX2xvY2spOwogCSgqbHNtcCktPmxzbV9tYWdpYyA9IG1hZ2ljOwogCSgqbHNtcCktPmxzbV9zdHJpcGVfY291bnQgPSBzdHJpcGVfY291bnQ7Ci0JKCpsc21wKS0+bHNtX21heGJ5dGVzID0gTFVTVFJFX1NUUklQRV9NQVhCWVRFUyAqIHN0cmlwZV9jb3VudDsKKwkoKmxzbXApLT5sc21fbWF4Ynl0ZXMgPSBMVVNUUkVfRVhUM19TVFJJUEVfTUFYQllURVMgKiBzdHJpcGVfY291bnQ7CiAJKCpsc21wKS0+bHNtX3BhdHRlcm4gPSBwYXR0ZXJuOwogCSgqbHNtcCktPmxzbV9wb29sX25hbWVbMF0gPSAnXDAnOwogCSgqbHNtcCktPmxzbV9sYXlvdXRfZ2VuID0gMDsKQEAgLTM3MiwxNiArMzc1LDE3IEBACiAgKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgT1NUIGluZGljZXMgd2hpY2ggd2lsbCBmaXQgaW4gdGhlIHVzZXIgYnVmZmVyLgogICogbG1tX21hZ2ljIG11c3QgYmUgTE9WX1VTRVJfTUFHSUMuCiAgKi8KLWludCBsb3ZfZ2V0c3RyaXBlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCitpbnQgbG92X2dldHN0cmlwZShzdHJ1Y3QgbG92X29iamVjdCAqb2JqLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAogCQkgIHN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKmx1bXApCiB7CiAJLyoKIAkgKiBYWFggaHVnZSBzdHJ1Y3QgYWxsb2NhdGVkIG9uIHN0YWNrLgogCSAqLwogCS8qIHdlIHVzZSBsb3ZfdXNlcl9tZF92MyBiZWNhdXNlIGl0IGlzIGxhcmdlciB0aGFuIGxvdl91c2VyX21kX3YxICovCisJc3RydWN0IGxvdl9vYmQgKmxvdjsKIAlzdHJ1Y3QgbG92X3VzZXJfbWRfdjMgbHVtOwogCXN0cnVjdCBsb3ZfbWRzX21kICpsbW1rID0gTlVMTDsKLQlpbnQgcmMsIGxtbV9zaXplOworCWludCByYywgbG1ta19zaXplLCBsbW1fc2l6ZTsKIAlpbnQgbHVtX3NpemU7CiAJbW1fc2VnbWVudF90IHNlZzsKIApAQCAtNDAxLDEyICs0MDUsMTMgQEAKIAlsdW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbG92X3VzZXJfbWRfdjEpOwogCWlmIChjb3B5X2Zyb21fdXNlcigmbHVtLCBsdW1wLCBsdW1fc2l6ZSkpIHsKIAkJcmMgPSAtRUZBVUxUOwotCQlnb3RvIG91dF9zZXQ7CisJCWdvdG8gb3V0OwogCX0KLQlpZiAoKGx1bS5sbW1fbWFnaWMgIT0gTE9WX1VTRVJfTUFHSUMpICYmCi0JICAgIChsdW0ubG1tX21hZ2ljICE9IExPVl9VU0VSX01BR0lDX1YzKSkgeworCWlmIChsdW0ubG1tX21hZ2ljICE9IExPVl9VU0VSX01BR0lDX1YxICYmCisJICAgIGx1bS5sbW1fbWFnaWMgIT0gTE9WX1VTRVJfTUFHSUNfVjMgJiYKKwkgICAgbHVtLmxtbV9tYWdpYyAhPSBMT1ZfVVNFUl9NQUdJQ19TUEVDSUZJQykgewogCQlyYyA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X3NldDsKKwkJZ290byBvdXQ7CiAJfQogCiAJaWYgKGx1bS5sbW1fc3RyaXBlX2NvdW50ICYmCkBAIC00MTUsMTEgKzQyMCwxMyBAQAogCQlsdW0ubG1tX3N0cmlwZV9jb3VudCA9IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsKIAkJcmMgPSBjb3B5X3RvX3VzZXIobHVtcCwgJmx1bSwgbHVtX3NpemUpOwogCQlyYyA9IC1FT1ZFUkZMT1c7Ci0JCWdvdG8gb3V0X3NldDsKKwkJZ290byBvdXQ7CiAJfQotCXJjID0gbG92X3BhY2ttZChleHAsICZsbW1rLCBsc20pOworCWxvdiA9IGx1Mmxvdl9kZXYob2JqLT5sb19jbC5jb19sdS5sb19kZXYpLT5sZF9sb3Y7CisJcmMgPSBsb3Zfb2JkX3BhY2ttZChsb3YsICZsbW1rLCBsc20pOwogCWlmIChyYyA8IDApCi0JCWdvdG8gb3V0X3NldDsKKwkJZ290byBvdXQ7CisJbG1ta19zaXplID0gcmM7CiAJbG1tX3NpemUgPSByYzsKIAlyYyA9IDA7CiAKQEAgLTQ1NSw3ICs0NjIsNyBAQAogCQlsbW1fc2l6ZSA9IGx1bV9zaXplOwogCX0gZWxzZSBpZiAobHVtLmxtbV9zdHJpcGVfY291bnQgPCBsbW1rLT5sbW1fc3RyaXBlX2NvdW50KSB7CiAJCXJjID0gLUVPVkVSRkxPVzsKLQkJZ290byBvdXRfc2V0OworCQlnb3RvIG91dF9mcmVlOwogCX0KIAkvKgogCSAqIEhhdmUgYSBkaWZmZXJlbmNlIGJldHdlZW4gbG92X21kc19tZCAmIGxvdl91c2VyX21kLgpAQCAtNDY4LDggKzQ3NSw5IEBACiAJaWYgKGNvcHlfdG9fdXNlcihsdW1wLCBsbW1rLCBsbW1fc2l6ZSkpCiAJCXJjID0gLUVGQVVMVDsKIAotCW9iZF9mcmVlX2Rpc2ttZChleHAsICZsbW1rKTsKLW91dF9zZXQ6CitvdXRfZnJlZToKKwlrZnJlZShsbW1rKTsKK291dDoKIAlzZXRfZnMoc2VnKTsKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3BhZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFnZS5jCmluZGV4IGMxNzAyNmYuLjAwYmZhYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFnZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcGFnZS5jCkBAIC02NSw3ICs2NSw5IEBACiAJcGdvZmZfdCBpbmRleCA9ICptYXhfaW5kZXg7CiAJdW5zaWduZWQgaW50IHBwczsgLyogcGFnZXMgcGVyIHN0cmlwZSAqLwogCi0JQ0RFQlVHKERfUkVBREEsICIqbWF4X2luZGV4ID0gJWx1LCBuciA9ICVkXG4iLCBpbmRleCwgcjAtPmxvX25yKTsKKwlDREVCVUcoRF9SRUFEQSwgREZJRCAiKm1heF9pbmRleCA9ICVsdSwgbnIgPSAlZFxuIiwKKwkgICAgICAgUEZJRChsdV9vYmplY3RfZmlkKGxvdjJsdShsb28pKSksIGluZGV4LCByMC0+bG9fbnIpOworCiAJaWYgKGluZGV4ID09IDApIC8qIHRoZSBwYWdlIGlzIG5vdCBjb3ZlcmVkIGJ5IGFueSBsb2NrICovCiAJCXJldHVybiAwOwogCkBAIC04MCw3ICs4MiwxMiBAQAogCiAJLyogY2FsY3VsYXRlIHRoZSBlbmQgb2YgY3VycmVudCBzdHJpcGUgKi8KIAlwcHMgPSBsb28tPmxvX2xzbS0+bHNtX3N0cmlwZV9zaXplID4+IFBBR0VfU0hJRlQ7Ci0JaW5kZXggPSAoKHNsaWNlLT5jcGxfaW5kZXggKyBwcHMpICYgfihwcHMgLSAxKSkgLSAxOworCWluZGV4ID0gc2xpY2UtPmNwbF9pbmRleCArIHBwcyAtIHNsaWNlLT5jcGxfaW5kZXggJSBwcHMgLSAxOworCisJQ0RFQlVHKERfUkVBREEsIERGSUQgIiptYXhfaW5kZXggPSAlbHUsIGluZGV4ID0gJWx1LCBwcHMgPSAldSwgc3RyaXBlX3NpemUgPSAldSwgc3RyaXBlIG5vID0gJXUsIHBhZ2UgaW5kZXggPSAlbHVcbiIsCisJICAgICAgIFBGSUQobHVfb2JqZWN0X2ZpZChsb3YybHUobG9vKSkpLCAqbWF4X2luZGV4LCBpbmRleCwgcHBzLAorCSAgICAgICBsb28tPmxvX2xzbS0+bHNtX3N0cmlwZV9zaXplLCBsb3ZfcGFnZV9zdHJpcGUoc2xpY2UtPmNwbF9wYWdlKSwKKwkgICAgICAgc2xpY2UtPmNwbF9pbmRleCk7CiAKIAkvKiBuZXZlciBleGNlZWQgdGhlIGVuZCBvZiB0aGUgc3RyaXBlICovCiAJKm1heF9pbmRleCA9IG1pbl90KHBnb2ZmX3QsICptYXhfaW5kZXgsIGluZGV4KTsKQEAgLTEyMiw2ICsxMjksNyBAQAogCXJjID0gbG92X3N0cmlwZV9vZmZzZXQobG9vLT5sb19sc20sIG9mZnNldCwgc3RyaXBlLCAmc3Vib2ZmKTsKIAlMQVNTRVJUKHJjID09IDApOwogCisJbHBnLT5scHNfc3RyaXBlID0gc3RyaXBlOwogCWNsX3BhZ2Vfc2xpY2VfYWRkKHBhZ2UsICZscGctPmxwc19jbCwgb2JqLCBpbmRleCwgJmxvdl9yYWlkMF9wYWdlX29wcyk7CiAKIAlzdWIgPSBsb3Zfc3ViX2dldChlbnYsIGxpbywgc3RyaXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcG9vbC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wb29sLmMKaW5kZXggNGMyZDIxNy4uZjhjOGEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wb29sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wb29sLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJTEFTU0VSVChobGlzdF91bmhhc2hlZCgmcG9vbC0+cG9vbF9oYXNoKSk7CiAJCUxBU1NFUlQobGlzdF9lbXB0eSgmcG9vbC0+cG9vbF9saXN0KSk7CiAJCUxBU1NFUlQoIXBvb2wtPnBvb2xfZGVidWdmc19lbnRyeSk7Ci0JCWxvdl9vc3RfcG9vbF9mcmVlKCYocG9vbC0+cG9vbF9vYmRzKSk7CisJCWxvdl9vc3RfcG9vbF9mcmVlKCZwb29sLT5wb29sX29iZHMpOwogCQlrZnJlZShwb29sKTsKIAl9CiB9CkBAIC05Miw3ICs5Miw3IEBACiAJZm9yIChpID0gMDsgaSA8IExPVl9NQVhQT09MTkFNRTsgaSsrKSB7CiAJCWlmIChwb29sbmFtZVtpXSA9PSAnXDAnKQogCQkJYnJlYWs7Ci0JCXJlc3VsdCA9IChyZXN1bHQgPDwgNCleKHJlc3VsdCA+PiAyOCkgXiAgcG9vbG5hbWVbaV07CisJCXJlc3VsdCA9IChyZXN1bHQgPDwgNCkgXiAocmVzdWx0ID4+IDI4KSBeICBwb29sbmFtZVtpXTsKIAl9CiAJcmV0dXJuIChyZXN1bHQgJSBtYXNrKTsKIH0KQEAgLTI2MCw3ICsyNjAsNyBAQAogCXRndCA9IHBvb2xfdGd0KGl0ZXItPnBvb2wsIGl0ZXItPmlkeCk7CiAJdXBfcmVhZCgmcG9vbF90Z3Rfcndfc2VtKGl0ZXItPnBvb2wpKTsKIAlpZiAodGd0KQotCQlzZXFfcHJpbnRmKHMsICIlc1xuIiwgb2JkX3V1aWQyc3RyKCYodGd0LT5sdGRfdXVpZCkpKTsKKwkJc2VxX3ByaW50ZihzLCAiJXNcbiIsIG9iZF91dWlkMnN0cigmdGd0LT5sdGRfdXVpZCkpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDAsNyArNDAwLDcgQEAKIAlzdHJ1Y3QgcG9vbF9kZXNjICpuZXdfcG9vbDsKIAlpbnQgcmM7CiAKLQlsb3YgPSAmKG9iZC0+dS5sb3YpOworCWxvdiA9ICZvYmQtPnUubG92OwogCiAJaWYgKHN0cmxlbihwb29sbmFtZSkgPiBMT1ZfTUFYUE9PTE5BTUUpCiAJCXJldHVybiAtRU5BTUVUT09MT05HOwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAJc3RydWN0IGxvdl9vYmQgKmxvdjsKIAlzdHJ1Y3QgcG9vbF9kZXNjICpwb29sOwogCi0JbG92ID0gJihvYmQtPnUubG92KTsKKwlsb3YgPSAmb2JkLT51LmxvdjsKIAogCS8qIGxvb2t1cCBhbmQga2lsbCBoYXNoIHJlZmVyZW5jZSAqLwogCXBvb2wgPSBjZnNfaGFzaF9kZWxfa2V5KGxvdi0+bG92X3Bvb2xzX2hhc2hfYm9keSwgcG9vbG5hbWUpOwpAQCAtNTAzLDcgKzUwMyw3IEBACiAJdW5zaWduZWQgaW50IGxvdl9pZHg7CiAJaW50IHJjOwogCi0JbG92ID0gJihvYmQtPnUubG92KTsKKwlsb3YgPSAmb2JkLT51LmxvdjsKIAogCXBvb2wgPSBjZnNfaGFzaF9sb29rdXAobG92LT5sb3ZfcG9vbHNfaGFzaF9ib2R5LCBwb29sbmFtZSk7CiAJaWYgKCFwb29sKQpAQCAtNTE3LDcgKzUxNyw3IEBACiAJCWlmICghbG92LT5sb3ZfdGd0c1tsb3ZfaWR4XSkKIAkJCWNvbnRpbnVlOwogCQlpZiAob2JkX3V1aWRfZXF1YWxzKCZvc3RfdXVpZCwKLQkJCQkgICAgJihsb3YtPmxvdl90Z3RzW2xvdl9pZHhdLT5sdGRfdXVpZCkpKQorCQkJCSAgICAmbG92LT5sb3ZfdGd0c1tsb3ZfaWR4XS0+bHRkX3V1aWQpKQogCQkJYnJlYWs7CiAJfQogCS8qIHRlc3QgaWYgb3N0IGZvdW5kIGluIGxvdiAqLwpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAJdW5zaWduZWQgaW50IGxvdl9pZHg7CiAJaW50IHJjID0gMDsKIAotCWxvdiA9ICYob2JkLT51Lmxvdik7CisJbG92ID0gJm9iZC0+dS5sb3Y7CiAKIAlwb29sID0gY2ZzX2hhc2hfbG9va3VwKGxvdi0+bG92X3Bvb2xzX2hhc2hfYm9keSwgcG9vbG5hbWUpOwogCWlmICghcG9vbCkKQEAgLTU2Miw3ICs1NjIsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKG9iZF91dWlkX2VxdWFscygmb3N0X3V1aWQsCi0JCQkJICAgICYobG92LT5sb3ZfdGd0c1tsb3ZfaWR4XS0+bHRkX3V1aWQpKSkKKwkJCQkgICAgJmxvdi0+bG92X3RndHNbbG92X2lkeF0tPmx0ZF91dWlkKSkKIAkJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3JlcXVlc3QuYwppbmRleCA0MDk5YjUxLi4wOWRjYWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3JlcXVlc3QuYwpAQCAtMzI1LDg0ICszMjUsNiBAQAogCXJldHVybiByYzsKIH0KIAotaW50IGxvdl9maW5pX2Rlc3Ryb3lfc2V0KHN0cnVjdCBsb3ZfcmVxdWVzdF9zZXQgKnNldCkKLXsKLQlpZiAoIXNldCkKLQkJcmV0dXJuIDA7Ci0JTEFTU0VSVChzZXQtPnNldF9leHApOwotCWlmIChhdG9taWNfcmVhZCgmc2V0LT5zZXRfY29tcGxldGVzKSkgewotCQkvKiBGSVhNRSB1cGRhdGUgcW9zIGRhdGEgaGVyZSAqLwotCX0KLQotCWxvdl9wdXRfcmVxc2V0KHNldCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGxvdl9wcmVwX2Rlc3Ryb3lfc2V0KHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRfaW5mbyAqb2luZm8sCi0JCQkgc3RydWN0IG9iZG8gKnNyY19vYSwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJCSBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSwKLQkJCSBzdHJ1Y3QgbG92X3JlcXVlc3Rfc2V0ICoqcmVxc2V0KQotewotCXN0cnVjdCBsb3ZfcmVxdWVzdF9zZXQgKnNldDsKLQlzdHJ1Y3QgbG92X29iZCAqbG92ID0gJmV4cC0+ZXhwX29iZC0+dS5sb3Y7Ci0JaW50IHJjID0gMCwgaTsKLQotCXNldCA9IGt6YWxsb2Moc2l6ZW9mKCpzZXQpLCBHRlBfTk9GUyk7Ci0JaWYgKCFzZXQpCi0JCXJldHVybiAtRU5PTUVNOwotCWxvdl9pbml0X3NldChzZXQpOwotCi0Jc2V0LT5zZXRfZXhwID0gZXhwOwotCXNldC0+c2V0X29pID0gb2luZm87Ci0Jc2V0LT5zZXRfb2ktPm9pX21kID0gbHNtOwotCXNldC0+c2V0X29pLT5vaV9vYSA9IHNyY19vYTsKLQlpZiAob3RpICYmIHNyY19vYS0+b192YWxpZCAmIE9CRF9NRF9GTENPT0tJRSkKLQkJc2V0LT5zZXRfY29va2llcyA9IG90aS0+b3RpX2xvZ2Nvb2tpZXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fc3RyaXBlX2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGxvdl9vaW5mbyAqbG9pOwotCQlzdHJ1Y3QgbG92X3JlcXVlc3QgKnJlcTsKLQotCQlsb2kgPSBsc20tPmxzbV9vaW5mb1tpXTsKLQkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFsb3ZfY2hlY2tfYW5kX3dhaXRfYWN0aXZlKGxvdiwgbG9pLT5sb2lfb3N0X2lkeCkpIHsKLQkJCUNERUJVRyhEX0hBLCAibG92IGlkeCAlZCBpbmFjdGl2ZVxuIiwgbG9pLT5sb2lfb3N0X2lkeCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXJlcSA9IGt6YWxsb2Moc2l6ZW9mKCpyZXEpLCBHRlBfTk9GUyk7Ci0JCWlmICghcmVxKSB7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dF9zZXQ7Ci0JCX0KLQotCQlyZXEtPnJxX3N0cmlwZSA9IGk7Ci0JCXJlcS0+cnFfaWR4ID0gbG9pLT5sb2lfb3N0X2lkeDsKLQotCQlyZXEtPnJxX29pLm9pX29hID0ga21lbV9jYWNoZV96YWxsb2Mob2Jkb19jYWNoZXAsIEdGUF9OT0ZTKTsKLQkJaWYgKCFyZXEtPnJxX29pLm9pX29hKSB7Ci0JCQlrZnJlZShyZXEpOwotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBvdXRfc2V0OwotCQl9Ci0JCW1lbWNweShyZXEtPnJxX29pLm9pX29hLCBzcmNfb2EsIHNpemVvZigqcmVxLT5ycV9vaS5vaV9vYSkpOwotCQlyZXEtPnJxX29pLm9pX29hLT5vX29pID0gbG9pLT5sb2lfb2k7Ci0JCWxvdl9zZXRfYWRkX3JlcShyZXEsIHNldCk7Ci0JfQotCWlmICghc2V0LT5zZXRfY291bnQpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dF9zZXQ7Ci0JfQotCSpyZXFzZXQgPSBzZXQ7Ci0JcmV0dXJuIHJjOwotb3V0X3NldDoKLQlsb3ZfZmluaV9kZXN0cm95X3NldChzZXQpOwotCXJldHVybiByYzsKLX0KLQogaW50IGxvdl9maW5pX3NldGF0dHJfc2V0KHN0cnVjdCBsb3ZfcmVxdWVzdF9zZXQgKnNldCkKIHsKIAlpbnQgcmMgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdnN1Yl9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZzdWJfb2JqZWN0LmMKaW5kZXggZmIyZjI2Ni4uYTJiYWM3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdnN1Yl9vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92c3ViX29iamVjdC5jCkBAIC05OCw4ICs5OCw4IEBACiAJcmV0dXJuICgqcCkoZW52LCBjb29raWUsICJbJWRdIiwgbG9zLT5sc29faW5kZXgpOwogfQogCi1zdGF0aWMgaW50IGxvdnN1Yl9hdHRyX3NldChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKLQkJCSAgIGNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCB2YWxpZCkKK3N0YXRpYyBpbnQgbG92c3ViX2F0dHJfdXBkYXRlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIGludCB2YWxpZCkKIHsKIAlzdHJ1Y3QgbG92X29iamVjdCAqbG92ID0gY2wybG92c3ViKG9iaiktPmxzb19zdXBlcjsKIApAQCAtMTE5LDcgKzExOSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGNsX29iamVjdF9vcGVyYXRpb25zIGxvdnN1Yl9vcHMgPSB7CiAJLmNvb19wYWdlX2luaXQgPSBsb3ZzdWJfcGFnZV9pbml0LAogCS5jb29fbG9ja19pbml0ID0gbG92c3ViX2xvY2tfaW5pdCwKLQkuY29vX2F0dHJfc2V0ICA9IGxvdnN1Yl9hdHRyX3NldCwKKwkuY29vX2F0dHJfdXBkYXRlID0gbG92c3ViX2F0dHJfdXBkYXRlLAogCS5jb29fZ2xpbXBzZSAgID0gbG92c3ViX29iamVjdF9nbGltcHNlCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbHByb2NfbWRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbHByb2NfbWRjLmMKaW5kZXggOThkMTVmYi4uZmNhOTQ1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL2xwcm9jX21kYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9scHJvY19tZGMuYwpAQCAtNDMsMTEgKzQzLDEwIEBACiAJaW50IGxlbjsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBvYmRfZGV2aWNlLAogCQkJCQkgICAgICBvYmRfa29iaik7Ci0Jc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZkZXYtPnUuY2xpOworCV9fdTMyIG1heDsKIAotCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCk7Ci0Jc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJbWF4ID0gb2JkX2dldF9tYXhfcnBjc19pbl9mbGlnaHQoJmRldi0+dS5jbGkpOworCWxlbiA9IHNwcmludGYoYnVmLCAiJXVcbiIsIG1heCk7CiAKIAlyZXR1cm4gbGVuOwogfQpAQCAtNTksNyArNTgsNiBAQAogewogCXN0cnVjdCBvYmRfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG9iZF9kZXZpY2UsCiAJCQkJCSAgICAgIG9iZF9rb2JqKTsKLQlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmRldi0+dS5jbGk7CiAJaW50IHJjOwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCkBAIC02NywxMiArNjUsOSBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JaWYgKHZhbCA8IDEgfHwgdmFsID4gTURDX01BWF9SSUZfTUFYKQotCQlyZXR1cm4gLUVSQU5HRTsKLQotCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQljbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCA9IHZhbDsKLQlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKwlyYyA9IG9iZF9zZXRfbWF4X3JwY3NfaW5fZmxpZ2h0KCZkZXYtPnUuY2xpLCB2YWwpOworCWlmIChyYykKKwkJY291bnQgPSByYzsKIAogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfaW50ZXJuYWwuaAppbmRleCA1OGYyODQxLi5mNDQ2YzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19pbnRlcm5hbC5oCkBAIC0zNCw2MyArMzQsNTcgQEAKICNkZWZpbmUgX01EQ19JTlRFUk5BTF9ICiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9tZGMuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9tZHMuaCIKIAogdm9pZCBscHJvY2ZzX21kY19pbml0X3ZhcnMoc3RydWN0IGxwcm9jZnNfc3RhdGljX3ZhcnMgKmx2YXJzKTsKIAogdm9pZCBtZGNfcGFja19ib2R5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgIF9fdTY0IHZhbGlkLCBpbnQgZWFfc2l6ZSwgX191MzIgc3VwcGdpZCwgaW50IGZsYWdzKTsKLXZvaWQgbWRjX2lzX3N1YmRpcl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpwZmlkLAotCQkJY29uc3Qgc3RydWN0IGx1X2ZpZCAqY2ZpZCwgaW50IGZsYWdzKTsKKwkJICAgX191NjQgdmFsaWQsIHNpemVfdCBlYV9zaXplLCBfX3UzMiBzdXBwZ2lkLCB1MzIgZmxhZ3MpOwogdm9pZCBtZGNfc3dhcF9sYXlvdXRzX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCiAJCQkgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSk7Ci12b2lkIG1kY19yZWFkZGlyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIF9fdTY0IHBnb2ZmLCBfX3UzMiBzaXplLAordm9pZCBtZGNfcmVhZGRpcl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBfX3U2NCBwZ29mZiwgc2l6ZV90IHNpemUsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCk7Ci12b2lkIG1kY19nZXRhdHRyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIF9fdTY0IHZhbGlkLCBpbnQgZmxhZ3MsCi0JCSAgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpkYXRhLCBpbnQgZWFfc2l6ZSk7Cit2b2lkIG1kY19nZXRhdHRyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIF9fdTY0IHZhbGlkLCB1MzIgZmxhZ3MsCisJCSAgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpkYXRhLCBzaXplX3QgZWFfc2l6ZSk7CiB2b2lkIG1kY19zZXRhdHRyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICAgICB2b2lkICplYSwgaW50IGVhbGVuLCB2b2lkICplYTIsIGludCBlYTJsZW4pOworCQkgICAgICB2b2lkICplYSwgc2l6ZV90IGVhbGVuLCB2b2lkICplYTIsIHNpemVfdCBlYTJsZW4pOwogdm9pZCBtZGNfY3JlYXRlX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhbGVuLCBfX3UzMiBtb2RlLCBfX3UzMiB1aWQsCi0JCSAgICAgX191MzIgZ2lkLCBjZnNfY2FwX3QgY2FwYWJpbGl0eSwgX191NjQgcmRldik7CisJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFsZW4sIHVtb2RlX3QgbW9kZSwgdWlkX3QgdWlkLAorCQkgICAgIGdpZF90IGdpZCwgY2ZzX2NhcF90IGNhcGFiaWxpdHksIF9fdTY0IHJkZXYpOwogdm9pZCBtZGNfb3Blbl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgX191MzIgbW9kZSwgX191NjQgcmRldiwgX191NjQgZmxhZ3MsIGNvbnN0IHZvaWQgKmRhdGEsCi0JCSAgIGludCBkYXRhbGVuKTsKKwkJICAgdW1vZGVfdCBtb2RlLCBfX3U2NCByZGV2LCBfX3U2NCBmbGFncywgY29uc3Qgdm9pZCAqZGF0YSwKKwkJICAgc2l6ZV90IGRhdGFsZW4pOwogdm9pZCBtZGNfdW5saW5rX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKIHZvaWQgbWRjX2xpbmtfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEpOwogdm9pZCBtZGNfcmVuYW1lX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICAgIGNvbnN0IGNoYXIgKm9sZCwgaW50IG9sZGxlbiwgY29uc3QgY2hhciAqbmV3LCBpbnQgbmV3bGVuKTsKKwkJICAgICBjb25zdCBjaGFyICpvbGQsIHNpemVfdCBvbGRsZW4sCisJCSAgICAgY29uc3QgY2hhciAqbmV3LCBzaXplX3QgbmV3bGVuKTsKIHZvaWQgbWRjX2Nsb3NlX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKLWludCBtZGNfZW50ZXJfcmVxdWVzdChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKTsKLXZvaWQgbWRjX2V4aXRfcmVxdWVzdChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKTsKIAogLyogbWRjL21kY19sb2Nrcy5jICovCiBpbnQgbWRjX3NldF9sb2NrX2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJICAgICAgX191NjQgKmxvY2toLCB2b2lkICpkYXRhLCBfX3U2NCAqYml0cyk7CisJCSAgICAgIGNvbnN0IHN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwKKwkJICAgICAgdm9pZCAqZGF0YSwgX191NjQgKmJpdHMpOwogCiBpbnQgbWRjX251bGxfaW5vZGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKTsKIAotaW50IG1kY19maW5kX2NiZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgICBsZGxtX2l0ZXJhdG9yX3QgaXQsIHZvaWQgKmRhdGEpOwotCiBpbnQgbWRjX2ludGVudF9sb2NrKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCSAgICBzdHJ1Y3QgbWRfb3BfZGF0YSAqLAotCQkgICAgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwKLQkJICAgIHN0cnVjdCBsb29rdXBfaW50ZW50ICosIGludCwKKwkJICAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAorCQkgICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAogCQkgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwKIAkJICAgIGxkbG1fYmxvY2tpbmdfY2FsbGJhY2sgY2JfYmxvY2tpbmcsCiAJCSAgICBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKTsKKwogaW50IG1kY19lbnF1ZXVlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyAqZWluZm8sCisJCWNvbnN0IGxkbG1fcG9saWN5X2RhdGFfdCAqcG9saWN5LAogCQlzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqbG9ja2gsIHZvaWQgKmxtbSwgaW50IGxtbXNpemUsCi0JCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcSwgX191NjQgZXh0cmFfbG9ja19mbGFncyk7CisJCXN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwgX191NjQgZXh0cmFfbG9ja19mbGFncyk7CiAKIGludCBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCiAJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqY2FuY2VscywgZW51bSBsZGxtX21vZGUgIG1vZGUsCiAJCQkgICAgX191NjQgYml0cyk7CiAvKiBtZGMvbWRjX3JlcXVlc3QuYyAqLwotaW50IG1kY19maWRfYWxsb2Moc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGx1X2ZpZCAqZmlkLAotCQkgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKK2ludCBtZGNfZmlkX2FsbG9jKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJICBzdHJ1Y3QgbHVfZmlkICpmaWQsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKTsKIHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZTsKIAogaW50IG1kY19zZXRfb3Blbl9yZXBsYXlfZGF0YShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLApAQCAtMTAxLDE2ICs5NSwxNyBAQAogdm9pZCBtZGNfcmVwbGF5X29wZW4oc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwogCiBpbnQgbWRjX2NyZWF0ZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFsZW4sIGludCBtb2RlLCBfX3UzMiB1aWQsIF9fdTMyIGdpZCwKLQkgICAgICAgY2ZzX2NhcF90IGNhcGFiaWxpdHksIF9fdTY0IHJkZXYsCisJICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCB1bW9kZV90IG1vZGUsIHVpZF90IHVpZCwKKwkgICAgICAgZ2lkX3QgZ2lkLCBjZnNfY2FwX3QgY2FwYWJpbGl0eSwgX191NjQgcmRldiwKIAkgICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCk7CiBpbnQgbWRjX2xpbmsoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCiAJICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KTsKIGludCBtZGNfcmVuYW1lKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCSAgICAgICBjb25zdCBjaGFyICpvbGQsIGludCBvbGRsZW4sIGNvbnN0IGNoYXIgKm5ldywgaW50IG5ld2xlbiwKKwkgICAgICAgY29uc3QgY2hhciAqb2xkLCBzaXplX3Qgb2xkbGVuLAorCSAgICAgICBjb25zdCBjaGFyICpuZXcsIHNpemVfdCBuZXdsZW4sCiAJICAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpOwogaW50IG1kY19zZXRhdHRyKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQl2b2lkICplYSwgaW50IGVhbGVuLCB2b2lkICplYTIsIGludCBlYTJsZW4sCisJCXZvaWQgKmVhLCBzaXplX3QgZWFsZW4sIHZvaWQgKmVhMiwgc2l6ZV90IGVhMmxlbiwKIAkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCwgc3RydWN0IG1kX29wZW5fZGF0YSAqKm1vZCk7CiBpbnQgbWRjX3VubGluayhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKIAkgICAgICAgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCk7CkBAIC0xMzgsNCArMTMzLDEyIEBACiAJCQkJIGNvdW50KTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhhc2hfeF9pbmRleChfX3U2NCBoYXNoLCBpbnQgaGFzaDY0KQoreworCWlmIChCSVRTX1BFUl9MT05HID09IDMyICYmIGhhc2g2NCkKKwkJaGFzaCA+Pj0gMzI7CisJLyogc2F2ZSBoYXNoIDAgd2l0aCBoYXNoIDEgKi8KKwlyZXR1cm4gfjBVTCAtIChoYXNoICsgIWhhc2gpOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xpYi5jCmluZGV4IDE0M2JkNzYuLmFhYzdlMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbGliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19saWIuYwpAQCAtMzcsMjcgKzM3LDEyIEBACiAKIHN0YXRpYyB2b2lkIF9fbWRjX3BhY2tfYm9keShzdHJ1Y3QgbWR0X2JvZHkgKmIsIF9fdTMyIHN1cHBnaWQpCiB7Ci0JYi0+c3VwcGdpZCA9IHN1cHBnaWQ7Ci0JYi0+dWlkID0gZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfdWlkKCkpOwotCWItPmdpZCA9IGZyb21fa2dpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2dpZCgpKTsKLQliLT5mc3VpZCA9IGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBjdXJyZW50X2ZzdWlkKCkpOwotCWItPmZzZ2lkID0gZnJvbV9rZ2lkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnNnaWQoKSk7Ci0JYi0+Y2FwYWJpbGl0eSA9IGNmc19jdXJwcm9jX2NhcF9wYWNrKCk7Ci19Ci0KLXZvaWQgbWRjX2lzX3N1YmRpcl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpwZmlkLAotCQkJY29uc3Qgc3RydWN0IGx1X2ZpZCAqY2ZpZCwgaW50IGZsYWdzKQotewotCXN0cnVjdCBtZHRfYm9keSAqYiA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwKLQkJCQkJCSAgICAmUk1GX01EVF9CT0RZKTsKLQotCWlmIChwZmlkKSB7Ci0JCWItPmZpZDEgPSAqcGZpZDsKLQkJYi0+dmFsaWQgPSBPQkRfTURfRkxJRDsKLQl9Ci0JaWYgKGNmaWQpCi0JCWItPmZpZDIgPSAqY2ZpZDsKLQliLT5mbGFncyA9IGZsYWdzOworCWItPm1ib19zdXBwZ2lkID0gc3VwcGdpZDsKKwliLT5tYm9fdWlkID0gZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfdWlkKCkpOworCWItPm1ib19naWQgPSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgY3VycmVudF9naWQoKSk7CisJYi0+bWJvX2ZzdWlkID0gZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnN1aWQoKSk7CisJYi0+bWJvX2ZzZ2lkID0gZnJvbV9rZ2lkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnNnaWQoKSk7CisJYi0+bWJvX2NhcGFiaWxpdHkgPSBjZnNfY3VycHJvY19jYXBfcGFjaygpOwogfQogCiB2b2lkIG1kY19zd2FwX2xheW91dHNfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKQEAgLTY3LDQzICs1Miw3NCBAQAogCQkJCQkJICAgICZSTUZfTURUX0JPRFkpOwogCiAJX19tZGNfcGFja19ib2R5KGIsIG9wX2RhdGEtPm9wX3N1cHBnaWRzWzBdKTsKLQliLT5maWQxID0gb3BfZGF0YS0+b3BfZmlkMTsKLQliLT5maWQyID0gb3BfZGF0YS0+b3BfZmlkMjsKLQliLT52YWxpZCB8PSBPQkRfTURfRkxJRDsKKwliLT5tYm9fZmlkMSA9IG9wX2RhdGEtPm9wX2ZpZDE7CisJYi0+bWJvX2ZpZDIgPSBvcF9kYXRhLT5vcF9maWQyOworCWItPm1ib192YWxpZCB8PSBPQkRfTURfRkxJRDsKIH0KIAogdm9pZCBtZGNfcGFja19ib2R5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgIF9fdTY0IHZhbGlkLCBpbnQgZWFfc2l6ZSwgX191MzIgc3VwcGdpZCwgaW50IGZsYWdzKQorCQkgICBfX3U2NCB2YWxpZCwgc2l6ZV90IGVhX3NpemUsIF9fdTMyIHN1cHBnaWQsIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgbWR0X2JvZHkgKmIgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsCiAJCQkJCQkgICAgJlJNRl9NRFRfQk9EWSk7Ci0JYi0+dmFsaWQgPSB2YWxpZDsKLQliLT5lYWRhdGFzaXplID0gZWFfc2l6ZTsKLQliLT5mbGFncyA9IGZsYWdzOworCWItPm1ib192YWxpZCA9IHZhbGlkOworCWItPm1ib19lYWRhdGFzaXplID0gZWFfc2l6ZTsKKwliLT5tYm9fZmxhZ3MgPSBmbGFnczsKIAlfX21kY19wYWNrX2JvZHkoYiwgc3VwcGdpZCk7CiAJaWYgKGZpZCkgewotCQliLT5maWQxID0gKmZpZDsKLQkJYi0+dmFsaWQgfD0gT0JEX01EX0ZMSUQ7CisJCWItPm1ib19maWQxID0gKmZpZDsKKwkJYi0+bWJvX3ZhbGlkIHw9IE9CRF9NRF9GTElEOwogCX0KIH0KIAotdm9pZCBtZGNfcmVhZGRpcl9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBfX3U2NCBwZ29mZiwKLQkJICAgICAgX191MzIgc2l6ZSwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkKQorLyoqCisgKiBQYWNrIGEgbmFtZSAocGF0aCBjb21wb25lbnQpIGludG8gYSByZXF1ZXN0CisgKgorICogXHBhcmFtW2luXSByZXEJcmVxdWVzdAorICogXHBhcmFtW2luXSBmaWVsZAlyZXF1ZXN0IGZpZWxkICh1c3VhbGx5IFJNRl9OQU1FKQorICogXHBhcmFtW2luXSBuYW1lCXBhdGggY29tcG9uZW50CisgKiBccGFyYW1baW5dIG5hbWVfbGVuCWxlbmd0aCBvZiBwYXRoIGNvbXBvbmVudAorICoKKyAqIFxhIGZpZWxkIG11c3QgYmUgcHJlc2VudCBpbiBcYSByZXEgYW5kIG9mIHNpemUgXGEgbmFtZV9sZW4gKyAxLgorICoKKyAqIFxhIG5hbWUgbXVzdCBiZSAnXDAnIHRlcm1pbmF0ZWQgb2YgbGVuZ3RoIFxhIG5hbWVfbGVuIGFuZCByZXByZXNlbnQKKyAqIGEgc2luZ2xlIHBhdGggY29tcG9uZW50IChub3QgY29udGFpbiAnLycpLgorICovCitzdGF0aWMgdm9pZCBtZGNfcGFja19uYW1lKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLAorCQkJICBjb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCisJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwlzaXplX3QgYnVmX3NpemU7CisJc2l6ZV90IGNweV9sZW47CisJY2hhciAqYnVmOworCisJYnVmID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCBmaWVsZCk7CisJYnVmX3NpemUgPSByZXFfY2Fwc3VsZV9nZXRfc2l6ZSgmcmVxLT5ycV9waWxsLCBmaWVsZCwgUkNMX0NMSUVOVCk7CisKKwlMQVNTRVJUKG5hbWUgJiYgbmFtZV9sZW4gJiYgYnVmICYmIGJ1Zl9zaXplID09IG5hbWVfbGVuICsgMSk7CisKKwljcHlfbGVuID0gc3RybGNweShidWYsIG5hbWUsIGJ1Zl9zaXplKTsKKworCUxBU1NFUlQoY3B5X2xlbiA9PSBuYW1lX2xlbiAmJiBsdV9uYW1lX2lzX3ZhbGlkXzIoYnVmLCBjcHlfbGVuKSk7Cit9CisKK3ZvaWQgbWRjX3JlYWRkaXJfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgX191NjQgcGdvZmYsIHNpemVfdCBzaXplLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQpCiB7CiAJc3RydWN0IG1kdF9ib2R5ICpiID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLAogCQkJCQkJICAgICZSTUZfTURUX0JPRFkpOwotCWItPmZpZDEgPSAqZmlkOwotCWItPnZhbGlkIHw9IE9CRF9NRF9GTElEOwotCWItPnNpemUgPSBwZ29mZjsJCSAgICAgICAvKiAhISAqLwotCWItPm5saW5rID0gc2l6ZTsJCQkvKiAhISAqLworCWItPm1ib19maWQxID0gKmZpZDsKKwliLT5tYm9fdmFsaWQgfD0gT0JEX01EX0ZMSUQ7CisJYi0+bWJvX3NpemUgPSBwZ29mZjsJCSAgICAgICAvKiAhISAqLworCWItPm1ib19ubGluayA9IHNpemU7CQkJLyogISEgKi8KIAlfX21kY19wYWNrX2JvZHkoYiwgLTEpOwotCWItPm1vZGUgPSBMVURBX0ZJRCB8IExVREFfVFlQRTsKKwliLT5tYm9fbW9kZSA9IExVREFfRklEIHwgTFVEQV9UWVBFOwogfQogCiAvKiBwYWNraW5nIG9mIE1EUyByZWNvcmRzICovCiB2b2lkIG1kY19jcmVhdGVfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFsZW4sIF9fdTMyIG1vZGUsCi0JCSAgICAgX191MzIgdWlkLCBfX3UzMiBnaWQsIGNmc19jYXBfdCBjYXBfZWZmZWN0aXZlLCBfX3U2NCByZGV2KQorCQkgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhbGVuLCB1bW9kZV90IG1vZGUsCisJCSAgICAgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIGNmc19jYXBfdCBjYXBfZWZmZWN0aXZlLCBfX3U2NCByZGV2KQogewogCXN0cnVjdCBtZHRfcmVjX2NyZWF0ZQkqcmVjOwogCWNoYXIJCQkqdG1wOwpAQCAtMTMwLDIyICsxNDYsMTcgQEAKIAlyZWMtPmNyX2JpYXMgICAgID0gb3BfZGF0YS0+b3BfYmlhczsKIAlyZWMtPmNyX3VtYXNrICAgID0gY3VycmVudF91bWFzaygpOwogCi0JdG1wID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX05BTUUpOwotCUxPR0wwKG9wX2RhdGEtPm9wX25hbWUsIG9wX2RhdGEtPm9wX25hbWVsZW4sIHRtcCk7Ci0KKwltZGNfcGFja19uYW1lKHJlcSwgJlJNRl9OQU1FLCBvcF9kYXRhLT5vcF9uYW1lLCBvcF9kYXRhLT5vcF9uYW1lbGVuKTsKIAlpZiAoZGF0YSkgewogCQl0bXAgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfRUFEQVRBKTsKIAkJbWVtY3B5KHRtcCwgZGF0YSwgZGF0YWxlbik7CiAJfQogfQogCi1zdGF0aWMgX191NjQgbWRzX3BhY2tfb3Blbl9mbGFncyhfX3U2NCBmbGFncywgX191MzIgbW9kZSkKK3N0YXRpYyBpbmxpbmUgX191NjQgbWRzX3BhY2tfb3Blbl9mbGFncyhfX3U2NCBmbGFncykKIHsKIAlfX3U2NCBjcl9mbGFncyA9IChmbGFncyAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUgfAotCQkJCSAgIE1EU19PUEVOX0hBU19FQSB8IE1EU19PUEVOX0hBU19PQkpTIHwKLQkJCQkgICBNRFNfT1BFTl9PV05FUk9WRVJSSURFIHwgTURTX09QRU5fTE9DSyB8Ci0JCQkJICAgTURTX09QRU5fQllfRklEIHwgTURTX09QRU5fTEVBU0UgfAotCQkJCSAgIE1EU19PUEVOX1JFTEVBU0UpKTsKKwkJCQkgICBNRFNfT1BFTl9GTF9JTlRFUk5BTCkpOwogCWlmIChmbGFncyAmIE9fQ1JFQVQpCiAJCWNyX2ZsYWdzIHw9IE1EU19PUEVOX0NSRUFUOwogCWlmIChmbGFncyAmIE9fRVhDTCkKQEAgLTE3MSw4ICsxODIsOCBAQAogCiAvKiBwYWNraW5nIG9mIE1EUyByZWNvcmRzICovCiB2b2lkIG1kY19vcGVuX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkgICBfX3UzMiBtb2RlLCBfX3U2NCByZGV2LCBfX3U2NCBmbGFncywgY29uc3Qgdm9pZCAqbG1tLAotCQkgICBpbnQgbG1tbGVuKQorCQkgICB1bW9kZV90IG1vZGUsIF9fdTY0IHJkZXYsIF9fdTY0IGZsYWdzLCBjb25zdCB2b2lkICpsbW0sCisJCSAgIHNpemVfdCBsbW1sZW4pCiB7CiAJc3RydWN0IG1kdF9yZWNfY3JlYXRlICpyZWM7CiAJY2hhciAqdG1wOwpAQCAtMTkwLDcgKzIwMSw3IEBACiAJcmVjLT5jcl9maWQyID0gb3BfZGF0YS0+b3BfZmlkMjsKIAogCXJlYy0+Y3JfbW9kZSAgICAgPSBtb2RlOwotCWNyX2ZsYWdzID0gbWRzX3BhY2tfb3Blbl9mbGFncyhmbGFncywgbW9kZSk7CisJY3JfZmxhZ3MgPSBtZHNfcGFja19vcGVuX2ZsYWdzKGZsYWdzKTsKIAlyZWMtPmNyX3JkZXYgICAgID0gcmRldjsKIAlyZWMtPmNyX3RpbWUgICAgID0gb3BfZGF0YS0+b3BfbW9kX3RpbWU7CiAJcmVjLT5jcl9zdXBwZ2lkMSA9IG9wX2RhdGEtPm9wX3N1cHBnaWRzWzBdOwpAQCAtMjAwLDggKzIxMSw5IEBACiAJcmVjLT5jcl9vbGRfaGFuZGxlID0gb3BfZGF0YS0+b3BfaGFuZGxlOwogCiAJaWYgKG9wX2RhdGEtPm9wX25hbWUpIHsKLQkJdG1wID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX05BTUUpOwotCQlMT0dMMChvcF9kYXRhLT5vcF9uYW1lLCBvcF9kYXRhLT5vcF9uYW1lbGVuLCB0bXApOworCQltZGNfcGFja19uYW1lKHJlcSwgJlJNRl9OQU1FLCBvcF9kYXRhLT5vcF9uYW1lLAorCQkJICAgICAgb3BfZGF0YS0+b3BfbmFtZWxlbik7CisKIAkJaWYgKG9wX2RhdGEtPm9wX2JpYXMgJiBNRFNfQ1JFQVRFX1ZPTEFUSUxFKQogCQkJY3JfZmxhZ3MgfD0gTURTX09QRU5fVk9MQVRJTEU7CiAJfQpAQCAtMjk1LDcgKzMwNyw3IEBACiB9CiAKIHZvaWQgbWRjX3NldGF0dHJfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICAgIHZvaWQgKmVhLCBpbnQgZWFsZW4sIHZvaWQgKmVhMiwgaW50IGVhMmxlbikKKwkJICAgICAgdm9pZCAqZWEsIHNpemVfdCBlYWxlbiwgdm9pZCAqZWEyLCBzaXplX3QgZWEybGVuKQogewogCXN0cnVjdCBtZHRfcmVjX3NldGF0dHIgKnJlYzsKIAlzdHJ1Y3QgbWR0X2lvZXBvY2ggKmVwb2NoOwpAQCAtMzE2LDcgKzMyOCw3IEBACiAKIAlsdW0gPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfRUFEQVRBKTsKIAlpZiAoIWVhKSB7IC8qIFJlbW92ZSBMT1YgRUEgKi8KLQkJbHVtLT5sbW1fbWFnaWMgPSBMT1ZfVVNFUl9NQUdJQ19WMTsKKwkJbHVtLT5sbW1fbWFnaWMgPSBjcHVfdG9fbGUzMihMT1ZfVVNFUl9NQUdJQ19WMSk7CiAJCWx1bS0+bG1tX3N0cmlwZV9zaXplID0gMDsKIAkJbHVtLT5sbW1fc3RyaXBlX2NvdW50ID0gMDsKIAkJbHVtLT5sbW1fc3RyaXBlX29mZnNldCA9ICh0eXBlb2YobHVtLT5sbW1fc3RyaXBlX29mZnNldCkpKC0xKTsKQEAgLTMzNCw3ICszNDYsNiBAQAogdm9pZCBtZGNfdW5saW5rX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKQogewogCXN0cnVjdCBtZHRfcmVjX3VubGluayAqcmVjOwotCWNoYXIgKnRtcDsKIAogCUNMQVNTRVJUKHNpemVvZihzdHJ1Y3QgbWR0X3JlY19yZWludCkgPT0gc2l6ZW9mKHN0cnVjdCBtZHRfcmVjX3VubGluaykpOwogCXJlYyA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9SRUNfUkVJTlQpOwpAQCAtMzUyLDE1ICszNjMsMTIgQEAKIAlyZWMtPnVsX3RpbWUgICAgID0gb3BfZGF0YS0+b3BfbW9kX3RpbWU7CiAJcmVjLT51bF9iaWFzICAgICA9IG9wX2RhdGEtPm9wX2JpYXM7CiAKLQl0bXAgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTkFNRSk7Ci0JTEFTU0VSVCh0bXApOwotCUxPR0wwKG9wX2RhdGEtPm9wX25hbWUsIG9wX2RhdGEtPm9wX25hbWVsZW4sIHRtcCk7CisJbWRjX3BhY2tfbmFtZShyZXEsICZSTUZfTkFNRSwgb3BfZGF0YS0+b3BfbmFtZSwgb3BfZGF0YS0+b3BfbmFtZWxlbik7CiB9CiAKIHZvaWQgbWRjX2xpbmtfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEpCiB7CiAJc3RydWN0IG1kdF9yZWNfbGluayAqcmVjOwotCWNoYXIgKnRtcDsKIAogCUNMQVNTRVJUKHNpemVvZihzdHJ1Y3QgbWR0X3JlY19yZWludCkgPT0gc2l6ZW9mKHN0cnVjdCBtZHRfcmVjX2xpbmspKTsKIAlyZWMgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfUkVDX1JFSU5UKTsKQEAgLTM3NiwyMCArMzg0LDIxIEBACiAJcmVjLT5sa190aW1lICAgICA9IG9wX2RhdGEtPm9wX21vZF90aW1lOwogCXJlYy0+bGtfYmlhcyAgICAgPSBvcF9kYXRhLT5vcF9iaWFzOwogCi0JdG1wID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX05BTUUpOwotCUxPR0wwKG9wX2RhdGEtPm9wX25hbWUsIG9wX2RhdGEtPm9wX25hbWVsZW4sIHRtcCk7CisJbWRjX3BhY2tfbmFtZShyZXEsICZSTUZfTkFNRSwgb3BfZGF0YS0+b3BfbmFtZSwgb3BfZGF0YS0+b3BfbmFtZWxlbik7CiB9CiAKIHZvaWQgbWRjX3JlbmFtZV9wYWNrKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkJICAgICBjb25zdCBjaGFyICpvbGQsIGludCBvbGRsZW4sIGNvbnN0IGNoYXIgKm5ldywgaW50IG5ld2xlbikKKwkJICAgICBjb25zdCBjaGFyICpvbGQsIHNpemVfdCBvbGRsZW4sCisJCSAgICAgY29uc3QgY2hhciAqbmV3LCBzaXplX3QgbmV3bGVuKQogewogCXN0cnVjdCBtZHRfcmVjX3JlbmFtZSAqcmVjOwotCWNoYXIgKnRtcDsKIAogCUNMQVNTRVJUKHNpemVvZihzdHJ1Y3QgbWR0X3JlY19yZWludCkgPT0gc2l6ZW9mKHN0cnVjdCBtZHRfcmVjX3JlbmFtZSkpOwogCXJlYyA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9SRUNfUkVJTlQpOwogCiAJLyogWFhYIGRvIHNvbWV0aGluZyBhYm91dCB0aW1lLCB1aWQsIGdpZCAqLworCXJlYy0+cm5fb3Bjb2RlCSA9IG9wX2RhdGEtPm9wX2NsaV9mbGFncyAmIENMSV9NSUdSQVRFID8KKwkJCQlSRUlOVF9NSUdSQVRFIDogUkVJTlRfUkVOQU1FOwogCXJlYy0+cm5fb3Bjb2RlICAgPSBSRUlOVF9SRU5BTUU7CiAJcmVjLT5ybl9mc3VpZCAgICA9IG9wX2RhdGEtPm9wX2ZzdWlkOwogCXJlYy0+cm5fZnNnaWQgICAgPSBvcF9kYXRhLT5vcF9mc2dpZDsKQEAgLTQwMiwzOSArNDExLDM0IEBACiAJcmVjLT5ybl9tb2RlICAgICA9IG9wX2RhdGEtPm9wX21vZGU7CiAJcmVjLT5ybl9iaWFzICAgICA9IG9wX2RhdGEtPm9wX2JpYXM7CiAKLQl0bXAgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTkFNRSk7Ci0JTE9HTDAob2xkLCBvbGRsZW4sIHRtcCk7CisJbWRjX3BhY2tfbmFtZShyZXEsICZSTUZfTkFNRSwgb2xkLCBvbGRsZW4pOwogCi0JaWYgKG5ldykgewotCQl0bXAgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfU1lNVEdUKTsKLQkJTE9HTDAobmV3LCBuZXdsZW4sIHRtcCk7Ci0JfQorCWlmIChuZXcpCisJCW1kY19wYWNrX25hbWUocmVxLCAmUk1GX1NZTVRHVCwgbmV3LCBuZXdsZW4pOwogfQogCi12b2lkIG1kY19nZXRhdHRyX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIF9fdTY0IHZhbGlkLCBpbnQgZmxhZ3MsCi0JCSAgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLCBpbnQgZWFfc2l6ZSkKK3ZvaWQgbWRjX2dldGF0dHJfcGFjayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgX191NjQgdmFsaWQsIHUzMiBmbGFncywKKwkJICAgICAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsIHNpemVfdCBlYV9zaXplKQogewogCXN0cnVjdCBtZHRfYm9keSAqYiA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwKIAkJCQkJCSAgICAmUk1GX01EVF9CT0RZKTsKIAotCWItPnZhbGlkID0gdmFsaWQ7CisJYi0+bWJvX3ZhbGlkID0gdmFsaWQ7CiAJaWYgKG9wX2RhdGEtPm9wX2JpYXMgJiBNRFNfQ0hFQ0tfU1BMSVQpCi0JCWItPnZhbGlkIHw9IE9CRF9NRF9GTENLU1BMSVQ7CisJCWItPm1ib192YWxpZCB8PSBPQkRfTURfRkxDS1NQTElUOwogCWlmIChvcF9kYXRhLT5vcF9iaWFzICYgTURTX0NST1NTX1JFRikKLQkJYi0+dmFsaWQgfD0gT0JEX01EX0ZMQ1JPU1NSRUY7Ci0JYi0+ZWFkYXRhc2l6ZSA9IGVhX3NpemU7Ci0JYi0+ZmxhZ3MgPSBmbGFnczsKKwkJYi0+bWJvX3ZhbGlkIHw9IE9CRF9NRF9GTENST1NTUkVGOworCWItPm1ib19lYWRhdGFzaXplID0gZWFfc2l6ZTsKKwliLT5tYm9fZmxhZ3MgPSBmbGFnczsKIAlfX21kY19wYWNrX2JvZHkoYiwgb3BfZGF0YS0+b3Bfc3VwcGdpZHNbMF0pOwogCi0JYi0+ZmlkMSA9IG9wX2RhdGEtPm9wX2ZpZDE7Ci0JYi0+ZmlkMiA9IG9wX2RhdGEtPm9wX2ZpZDI7Ci0JYi0+dmFsaWQgfD0gT0JEX01EX0ZMSUQ7CisJYi0+bWJvX2ZpZDEgPSBvcF9kYXRhLT5vcF9maWQxOworCWItPm1ib19maWQyID0gb3BfZGF0YS0+b3BfZmlkMjsKKwliLT5tYm9fdmFsaWQgfD0gT0JEX01EX0ZMSUQ7CiAKLQlpZiAob3BfZGF0YS0+b3BfbmFtZSkgewotCQljaGFyICp0bXAgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfTkFNRSk7Ci0KLQkJTE9HTDAob3BfZGF0YS0+b3BfbmFtZSwgb3BfZGF0YS0+b3BfbmFtZWxlbiwgdG1wKTsKLQl9CisJaWYgKG9wX2RhdGEtPm9wX25hbWUpCisJCW1kY19wYWNrX25hbWUocmVxLCAmUk1GX05BTUUsIG9wX2RhdGEtPm9wX25hbWUsCisJCQkgICAgICBvcF9kYXRhLT5vcF9uYW1lbGVuKTsKIH0KIAogc3RhdGljIHZvaWQgbWRjX2hzbV9yZWxlYXNlX3BhY2soc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCkBAIC00ODIsNjcgKzQ4NiwzIEBACiAJbWRjX2lvZXBvY2hfcGFjayhlcG9jaCwgb3BfZGF0YSk7CiAJbWRjX2hzbV9yZWxlYXNlX3BhY2socmVxLCBvcF9kYXRhKTsKIH0KLQotc3RhdGljIGludCBtZGNfcmVxX2F2YWlsKHN0cnVjdCBjbGllbnRfb2JkICpjbGksIHN0cnVjdCBtZGNfY2FjaGVfd2FpdGVyICptY3cpCi17Ci0JaW50IHJjOwotCi0Jc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJjID0gbGlzdF9lbXB0eSgmbWN3LT5tY3dfZW50cnkpOwotCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJldHVybiByYzsKLX07Ci0KLS8qIFdlIHJlY29yZCByZXF1ZXN0cyBpbiBmbGlnaHQgaW4gY2xpLT5jbF9yX2luX2ZsaWdodCBoZXJlLgotICogVGhlcmUgaXMgb25seSBvbmUgd3JpdGUgcnBjIHBvc3NpYmxlIGluIG1kYyBhbnl3YXkuIElmIHRoaXMgdG8gY2hhbmdlCi0gKiBpbiB0aGUgZnV0dXJlIC0gdGhlIGNvZGUgbWF5IG5lZWQgdG8gYmUgcmV2aXNpdGVkLgotICovCi1pbnQgbWRjX2VudGVyX3JlcXVlc3Qoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBtZGNfY2FjaGVfd2FpdGVyIG1jdzsKLQlzdHJ1Y3QgbF93YWl0X2luZm8gbHdpID0gTFdJX0lOVFIoTFdJX09OX1NJR05BTF9OT09QLCBOVUxMKTsKLQotCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlpZiAoY2xpLT5jbF9yX2luX2ZsaWdodCA+PSBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCkgewotCQlsaXN0X2FkZF90YWlsKCZtY3cubWN3X2VudHJ5LCAmY2xpLT5jbF9jYWNoZV93YWl0ZXJzKTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmbWN3Lm1jd193YWl0cSk7Ci0JCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCQlyYyA9IGxfd2FpdF9ldmVudChtY3cubWN3X3dhaXRxLCBtZGNfcmVxX2F2YWlsKGNsaSwgJm1jdyksCi0JCQkJICAmbHdpKTsKLQkJaWYgKHJjKSB7Ci0JCQlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JCQlpZiAobGlzdF9lbXB0eSgmbWN3Lm1jd19lbnRyeSkpCi0JCQkJY2xpLT5jbF9yX2luX2ZsaWdodC0tOwotCQkJbGlzdF9kZWxfaW5pdCgmbWN3Lm1jd19lbnRyeSk7Ci0JCQlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWNsaS0+Y2xfcl9pbl9mbGlnaHQrKzsKLQkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JfQotCXJldHVybiByYzsKLX0KLQotdm9pZCBtZGNfZXhpdF9yZXF1ZXN0KHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbCwgKnRtcDsKLQlzdHJ1Y3QgbWRjX2NhY2hlX3dhaXRlciAqbWN3OwotCi0Jc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCWNsaS0+Y2xfcl9pbl9mbGlnaHQtLTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUobCwgdG1wLCAmY2xpLT5jbF9jYWNoZV93YWl0ZXJzKSB7Ci0JCWlmIChjbGktPmNsX3JfaW5fZmxpZ2h0ID49IGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0KSB7Ci0JCQkvKiBObyBmcmVlIHJlcXVlc3Qgc2xvdHMgYW55bW9yZSAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQltY3cgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBtZGNfY2FjaGVfd2FpdGVyLCBtY3dfZW50cnkpOwotCQlsaXN0X2RlbF9pbml0KCZtY3ctPm1jd19lbnRyeSk7Ci0JCWNsaS0+Y2xfcl9pbl9mbGlnaHQrKzsKLQkJd2FrZV91cCgmbWN3LT5tY3dfd2FpdHEpOwotCX0KLQkvKiBFbXB0eSB3YWl0aW5nIGxpc3Q/IERlY3JlYXNlIHJlcXMgaW4tZmxpZ2h0IG51bWJlciAqLwotCi0Jc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xvY2tzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX2xvY2tzLmMKaW5kZXggZjQ4YjU4NC4uZjFmNmMwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19sb2Nrcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfbG9ja3MuYwpAQCAtOTMsOCArOTMsOCBAQAogRVhQT1JUX1NZTUJPTChpdF9vcGVuX2Vycm9yKTsKIAogLyogdGhpcyBtdXN0IGJlIGNhbGxlZCBvbiBhIGxvY2toIHRoYXQgaXMga25vd24gdG8gaGF2ZSBhIHJlZmVyZW5jZWQgbG9jayAqLwotaW50IG1kY19zZXRfbG9ja19kYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIF9fdTY0ICpsb2NraCwgdm9pZCAqZGF0YSwKLQkJICAgICAgX191NjQgKmJpdHMpCitpbnQgbWRjX3NldF9sb2NrX2RhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toLAorCQkgICAgICB2b2lkICpkYXRhLCBfX3U2NCAqYml0cykKIHsKIAlzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrOwogCXN0cnVjdCBpbm9kZSAqbmV3X2lub2RlID0gZGF0YTsKQEAgLTEwMiwxMCArMTAyLDEwIEBACiAJaWYgKGJpdHMpCiAJCSpiaXRzID0gMDsKIAotCWlmICghKmxvY2toKQorCWlmICghbHVzdHJlX2hhbmRsZV9pc191c2VkKGxvY2toKSkKIAkJcmV0dXJuIDA7CiAKLQlsb2NrID0gbGRsbV9oYW5kbGUybG9jaygoc3RydWN0IGx1c3RyZV9oYW5kbGUgKilsb2NraCk7CisJbG9jayA9IGxkbG1faGFuZGxlMmxvY2sobG9ja2gpOwogCiAJTEFTU0VSVChsb2NrKTsKIAlsb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKQEAgLTE3NCw3ICsxNzQsNyBAQAogCWZpZF9idWlsZF9yZWdfcmVzX25hbWUoZmlkLCAmcmVzX2lkKTsKIAogCXJlcyA9IGxkbG1fcmVzb3VyY2VfZ2V0KG5zLCBOVUxMLCAmcmVzX2lkLCAwLCAwKTsKLQlpZiAoIXJlcykKKwlpZiAoSVNfRVJSKHJlcykpCiAJCXJldHVybiAwOwogCiAJbG9ja19yZXMocmVzKTsKQEAgLTE4NSwyOCArMTg1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogZmluZCBhbnkgbGRsbSBsb2NrIG9mIHRoZSBpbm9kZSBpbiBtZGMKLSAqIHJldHVybiAwICAgIG5vdCBmaW5kCi0gKgkxICAgIGZpbmQgb25lCi0gKiAgICAgIDwgMCAgICBlcnJvcgotICovCi1pbnQgbWRjX2ZpbmRfY2JkYXRhKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCSAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmaWQsCi0JCSAgICBsZGxtX2l0ZXJhdG9yX3QgaXQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGxkbG1fcmVzX2lkIHJlc19pZDsKLQlpbnQgcmMgPSAwOwotCi0JZmlkX2J1aWxkX3JlZ19yZXNfbmFtZSgoc3RydWN0IGx1X2ZpZCAqKWZpZCwgJnJlc19pZCk7Ci0JcmMgPSBsZGxtX3Jlc291cmNlX2l0ZXJhdGUoY2xhc3NfZXhwMm9iZChleHApLT5vYmRfbmFtZXNwYWNlLCAmcmVzX2lkLAotCQkJCSAgIGl0LCBkYXRhKTsKLQlpZiAocmMgPT0gTERMTV9JVEVSX1NUT1ApCi0JCXJldHVybiAxOwotCWVsc2UgaWYgKHJjID09IExETE1fSVRFUl9DT05USU5VRSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgbWRjX2NsZWFyX3JlcGxheV9mbGFnKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgcmMpCiB7CiAJLyogRG9uJ3QgaG9sZCBlcnJvciByZXF1ZXN0cyBmb3IgcmVwbGF5LiAqLwpAQCAtMjQwLDI0ICsyMTgsMjQgQEAKIAogCS8qIEZJWE1FOiByZW1vdmUgdGhpcyBleHBsaWNpdCBvZmZzZXQuICovCiAJcmMgPSBzcHRscnBjX2NsaV9lbmxhcmdlX3JlcWJ1ZihyZXEsIERMTV9JTlRFTlRfUkVDX09GRiArIDQsCi0JCQkJCWJvZHktPmVhZGF0YXNpemUpOworCQkJCQlib2R5LT5tYm9fZWFkYXRhc2l6ZSk7CiAJaWYgKHJjKSB7CiAJCUNFUlJPUigiQ2FuJ3QgZW5sYXJnZSBzZWdtZW50ICVkIHNpemUgdG8gJWRcbiIsCi0JCSAgICAgICBETE1fSU5URU5UX1JFQ19PRkYgKyA0LCBib2R5LT5lYWRhdGFzaXplKTsKLQkJYm9keS0+dmFsaWQgJj0gfk9CRF9NRF9GTEVBU0laRTsKLQkJYm9keS0+ZWFkYXRhc2l6ZSA9IDA7CisJCSAgICAgICBETE1fSU5URU5UX1JFQ19PRkYgKyA0LCBib2R5LT5tYm9fZWFkYXRhc2l6ZSk7CisJCWJvZHktPm1ib192YWxpZCAmPSB+T0JEX01EX0ZMRUFTSVpFOworCQlib2R5LT5tYm9fZWFkYXRhc2l6ZSA9IDA7CiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICptZGNfaW50ZW50X29wZW5fcGFjayhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkJCQkJICAgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAotCQkJCQkJICAgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCQkJCQkgICB2b2lkICpsbW0sIGludCBsbW1zaXplLAotCQkJCQkJICAgdm9pZCAqY2JfZGF0YSkKK3N0YXRpYyBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKgorbWRjX2ludGVudF9vcGVuX3BhY2soc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvb2t1cF9pbnRlbnQgKml0LAorCQkgICAgIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKQogewogCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOwogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAqb2JkZGV2ID0gY2xhc3NfZXhwMm9iZChleHApOwogCXN0cnVjdCBsZGxtX2ludGVudCAgICAqbGl0OworCWNvbnN0IHZvaWQgKmxtbSA9IG9wX2RhdGEtPm9wX2RhdGE7CisJdTMyIGxtbXNpemUgPSBvcF9kYXRhLT5vcF9kYXRhX3NpemU7CiAJTElTVF9IRUFEKGNhbmNlbHMpOwogCWludAkJICAgIGNvdW50ID0gMDsKIAlpbnQJCSAgICBtb2RlOwpAQCAtMjc0LDcgKzI1Miw3IEBACiAJCQllbHNlCiAJCQkJbW9kZSA9IExDS19QUjsKIAkJfSBlbHNlIHsKLQkJCWlmIChpdC0+aXRfZmxhZ3MgJiAoRk1PREVfV1JJVEV8TURTX09QRU5fVFJVTkMpKQorCQkJaWYgKGl0LT5pdF9mbGFncyAmIChGTU9ERV9XUklURSB8IE1EU19PUEVOX1RSVU5DKSkKIAkJCQltb2RlID0gTENLX0NXOwogCQkJZWxzZSBpZiAoaXQtPml0X2ZsYWdzICYgX19GTU9ERV9FWEVDKQogCQkJCW1vZGUgPSBMQ0tfUFI7CkBAIC0zMjUsNiArMzAzLDkgQEAKIAltZGNfb3Blbl9wYWNrKHJlcSwgb3BfZGF0YSwgaXQtPml0X2NyZWF0ZV9tb2RlLCAwLCBpdC0+aXRfZmxhZ3MsIGxtbSwKIAkJICAgICAgbG1tc2l6ZSk7CiAKKwlyZXFfY2Fwc3VsZV9zZXRfc2l6ZSgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9NRCwgUkNMX1NFUlZFUiwKKwkJCSAgICAgb2JkZGV2LT51LmNsaS5jbF9tYXhfbWRzX2Vhc2l6ZSk7CisKIAlwdGxycGNfcmVxdWVzdF9zZXRfcmVwbGVuKHJlcSk7CiAJcmV0dXJuIHJlcTsKIH0KQEAgLTMzNiw3ICszMTcsOCBAQAogewogCXN0cnVjdCBwdGxycGNfcmVxdWVzdAkqcmVxOwogCXN0cnVjdCBsZGxtX2ludGVudAkqbGl0OwotCWludAkJCXJjLCBjb3VudCA9IDAsIG1heGRhdGE7CisJaW50IHJjLCBjb3VudCA9IDA7CisJdTMyIG1heGRhdGE7CiAJTElTVF9IRUFEKGNhbmNlbHMpOwogCiAJcmVxID0gcHRscnBjX3JlcXVlc3RfYWxsb2MoY2xhc3NfZXhwMmNsaWltcChleHApLApAQCAtNDIxLDcgKzQwMyw3IEBACiAJCQkJICAgICAgIE9CRF9NRF9NRUEgfCBPQkRfTURfRkxBQ0w7CiAJc3RydWN0IGxkbG1faW50ZW50ICAgICpsaXQ7CiAJaW50CQkgICAgcmM7Ci0JaW50CQkgICAgZWFzaXplOworCXUzMiBlYXNpemU7CiAKIAlyZXEgPSBwdGxycGNfcmVxdWVzdF9hbGxvYyhjbGFzc19leHAyY2xpaW1wKGV4cCksCiAJCQkJICAgJlJRRl9MRExNX0lOVEVOVF9HRVRBVFRSKTsKQEAgLTUyNiw3ICs1MDgsNyBAQAogCXN0cnVjdCBsZGxtX3JlcGx5ICAgKmxvY2tyZXA7CiAJc3RydWN0IGxkbG1fbG9jayAgICAqbG9jazsKIAl2b2lkCQkqbHZiX2RhdGEgPSBOVUxMOwotCWludAkJICBsdmJfbGVuID0gMDsKKwl1MzIgbHZiX2xlbiA9IDA7CiAKIAlMQVNTRVJUKHJjID49IDApOwogCS8qIFNpbWlsYXJseSwgaWYgd2UncmUgZ29pbmcgdG8gcmVwbGF5IHRoaXMgcmVxdWVzdCwgd2UgZG9uJ3Qgd2FudCB0bwpAQCAtNjA1LDcgKzU4Nyw3IEBACiAJCQltZGNfc2V0X29wZW5fcmVwbGF5X2RhdGEoTlVMTCwgTlVMTCwgaXQpOwogCQl9CiAKLQkJaWYgKChib2R5LT52YWxpZCAmIChPQkRfTURfRkxESVJFQSB8IE9CRF9NRF9GTEVBU0laRSkpICE9IDApIHsKKwkJaWYgKChib2R5LT5tYm9fdmFsaWQgJiAoT0JEX01EX0ZMRElSRUEgfCBPQkRfTURfRkxFQVNJWkUpKSAhPSAwKSB7CiAJCQl2b2lkICplYWRhdGE7CiAKIAkJCW1kY191cGRhdGVfbWF4X2VhX2Zyb21fYm9keShleHAsIGJvZHkpOwpAQCAtNjE1LDcgKzU5Nyw3IEBACiAJCQkgKiBFdmVudHVhbGx5LCBvYmRfdW5wYWNrbWQoKSB3aWxsIGNoZWNrIHRoZSBjb250ZW50cy4KIAkJCSAqLwogCQkJZWFkYXRhID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldChwaWxsLCAmUk1GX01EVF9NRCwKLQkJCQkJCQkgICAgICBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJCQkgICAgICBib2R5LT5tYm9fZWFkYXRhc2l6ZSk7CiAJCQlpZiAoIWVhZGF0YSkKIAkJCQlyZXR1cm4gLUVQUk9UTzsKIApAQCAtNjIzLDcgKzYwNSw3IEBACiAJCQkgKiBsb2NrCiAJCQkgKi8KIAkJCWx2Yl9kYXRhID0gZWFkYXRhOwotCQkJbHZiX2xlbiA9IGJvZHktPmVhZGF0YXNpemU7CisJCQlsdmJfbGVuID0gYm9keS0+bWJvX2VhZGF0YXNpemU7CiAKIAkJCS8qCiAJCQkgKiBXZSBzYXZlIHRoZSByZXBseSBMT1YgRUEgaW4gY2FzZSB3ZSBoYXZlIHRvIHJlcGxheSBhCkBAIC02MzksMjAgKzYyMSwyMCBAQAogCiAJCQkJaWYgKHJlcV9jYXBzdWxlX2dldF9zaXplKHBpbGwsICZSTUZfRUFEQVRBLAogCQkJCQkJCSBSQ0xfQ0xJRU5UKSA8Ci0JCQkJICAgIGJvZHktPmVhZGF0YXNpemUpCisJCQkJICAgIGJvZHktPm1ib19lYWRhdGFzaXplKQogCQkJCQltZGNfcmVhbGxvY19vcGVubXNnKHJlcSwgYm9keSk7CiAJCQkJZWxzZQogCQkJCQlyZXFfY2Fwc3VsZV9zaHJpbmsocGlsbCwgJlJNRl9FQURBVEEsCi0JCQkJCQkJICAgYm9keS0+ZWFkYXRhc2l6ZSwKKwkJCQkJCQkgICBib2R5LT5tYm9fZWFkYXRhc2l6ZSwKIAkJCQkJCQkgICBSQ0xfQ0xJRU5UKTsKIAogCQkJCXJlcV9jYXBzdWxlX3NldF9zaXplKHBpbGwsICZSTUZfRUFEQVRBLAogCQkJCQkJICAgICBSQ0xfQ0xJRU5ULAotCQkJCQkJICAgICBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJCSAgICAgYm9keS0+bWJvX2VhZGF0YXNpemUpOwogCiAJCQkJbG1tID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldChwaWxsLCAmUk1GX0VBREFUQSk7CiAJCQkJaWYgKGxtbSkKLQkJCQkJbWVtY3B5KGxtbSwgZWFkYXRhLCBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJbWVtY3B5KGxtbSwgZWFkYXRhLCBib2R5LT5tYm9fZWFkYXRhc2l6ZSk7CiAJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX0xBWU9VVCkgewpAQCAtNjYyLDcgKzY0NCw4IEBACiAJCWx2Yl9sZW4gPSByZXFfY2Fwc3VsZV9nZXRfc2l6ZShwaWxsLCAmUk1GX0RMTV9MVkIsIFJDTF9TRVJWRVIpOwogCQlpZiAobHZiX2xlbiA+IDApIHsKIAkJCWx2Yl9kYXRhID0gcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldChwaWxsLAotCQkJCQkJCSZSTUZfRExNX0xWQiwgbHZiX2xlbik7CisJCQkJCQkJCSZSTUZfRExNX0xWQiwKKwkJCQkJCQkJbHZiX2xlbik7CiAJCQlpZiAoIWx2Yl9kYXRhKQogCQkJCXJldHVybiAtRVBST1RPOwogCQl9CkBAIC03MDUsOSArNjg4LDkgQEAKICAqIHdlIGRvbid0IGtub3cgaW4gYWR2YW5jZSB0aGUgZmlsZSB0eXBlLgogICovCiBpbnQgbWRjX2VucXVldWUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxkbG1fZW5xdWV1ZV9pbmZvICplaW5mbywKKwkJY29uc3QgbGRsbV9wb2xpY3lfZGF0YV90ICpwb2xpY3ksCiAJCXN0cnVjdCBsb29rdXBfaW50ZW50ICppdCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCXN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwgdm9pZCAqbG1tLCBpbnQgbG1tc2l6ZSwKLQkJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxcCwgdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCisJCXN0cnVjdCBsdXN0cmVfaGFuZGxlICpsb2NraCwgdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCiB7CiAJc3RhdGljIGNvbnN0IGxkbG1fcG9saWN5X2RhdGFfdCBsb29rdXBfcG9saWN5ID0gewogCQkubF9pbm9kZWJpdHMgPSB7IE1EU19JTk9ERUxPQ0tfTE9PS1VQIH0KQEAgLTcyMSw5ICs3MDQsOCBAQAogCXN0YXRpYyBjb25zdCBsZGxtX3BvbGljeV9kYXRhX3QgZ2V0eGF0dHJfcG9saWN5ID0gewogCQkubF9pbm9kZWJpdHMgPSB7IE1EU19JTk9ERUxPQ0tfWEFUVFIgfQogCX07Ci0JbGRsbV9wb2xpY3lfZGF0YV90IGNvbnN0ICpwb2xpY3kgPSAmbG9va3VwX3BvbGljeTsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkZGV2ID0gY2xhc3NfZXhwMm9iZChleHApOwotCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxID0gTlVMTDsKIAl1NjQgZmxhZ3MsIHNhdmVkX2ZsYWdzID0gZXh0cmFfbG9ja19mbGFnczsKIAlzdHJ1Y3QgbGRsbV9yZXNfaWQgcmVzX2lkOwogCWludCBnZW5lcmF0aW9uLCByZXNlbmRzID0gMDsKQEAgLTczMyw0MCArNzE1LDMyIEBACiAKIAlMQVNTRVJURighaXQgfHwgZWluZm8tPmVpX3R5cGUgPT0gTERMTV9JQklUUywgImxvY2sgdHlwZSAlZFxuIiwKIAkJIGVpbmZvLT5laV90eXBlKTsKLQogCWZpZF9idWlsZF9yZWdfcmVzX25hbWUoJm9wX2RhdGEtPm9wX2ZpZDEsICZyZXNfaWQpOwogCiAJaWYgKGl0KSB7CisJCUxBU1NFUlQoIXBvbGljeSk7CisKIAkJc2F2ZWRfZmxhZ3MgfD0gTERMTV9GTF9IQVNfSU5URU5UOwotCQlpZiAoaXQtPml0X29wICYgKElUX1VOTElOSyB8IElUX0dFVEFUVFIgfCBJVF9SRUFERElSKSkKKwkJaWYgKGl0LT5pdF9vcCAmIChJVF9PUEVOIHwgSVRfVU5MSU5LIHwgSVRfR0VUQVRUUiB8IElUX1JFQURESVIpKQogCQkJcG9saWN5ID0gJnVwZGF0ZV9wb2xpY3k7CiAJCWVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX0xBWU9VVCkKIAkJCXBvbGljeSA9ICZsYXlvdXRfcG9saWN5OwogCQllbHNlIGlmIChpdC0+aXRfb3AgJiAoSVRfR0VUWEFUVFIgfCBJVF9TRVRYQVRUUikpCiAJCQlwb2xpY3kgPSAmZ2V0eGF0dHJfcG9saWN5OworCQllbHNlCisJCQlwb2xpY3kgPSAmbG9va3VwX3BvbGljeTsKIAl9CiAKLQlMQVNTRVJUKCFyZXFwKTsKLQogCWdlbmVyYXRpb24gPSBvYmRkZXYtPnUuY2xpLmNsX2ltcG9ydC0+aW1wX2dlbmVyYXRpb247CiByZXNlbmQ6CiAJZmxhZ3MgPSBzYXZlZF9mbGFnczsKIAlpZiAoIWl0KSB7Ci0JCS8qIFRoZSBvbmx5IHdheSByaWdodCBub3cgaXMgRkxPQ0ssIGluIHRoaXMgY2FzZSB3ZSBoaWRlIGZsb2NrCi0JCSAqIHBvbGljeSBhcyBsbW0sIGJ1dCBsbW1zaXplIGlzIDAKLQkJICovCi0JCUxBU1NFUlQobG1tICYmIGxtbXNpemUgPT0gMCk7CisJCS8qIFRoZSBvbmx5IHdheSByaWdodCBub3cgaXMgRkxPQ0suICovCiAJCUxBU1NFUlRGKGVpbmZvLT5laV90eXBlID09IExETE1fRkxPQ0ssICJsb2NrIHR5cGUgJWRcbiIsCiAJCQkgZWluZm8tPmVpX3R5cGUpOwotCQlwb2xpY3kgPSBsbW07CiAJCXJlc19pZC5uYW1lWzNdID0gTERMTV9GTE9DSzsKLQkJcmVxID0gTlVMTDsKIAl9IGVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX09QRU4pIHsKLQkJcmVxID0gbWRjX2ludGVudF9vcGVuX3BhY2soZXhwLCBpdCwgb3BfZGF0YSwgbG1tLCBsbW1zaXplLAotCQkJCQkgICBlaW5mby0+ZWlfY2JkYXRhKTsKLQkJcG9saWN5ID0gJnVwZGF0ZV9wb2xpY3k7Ci0JCWVpbmZvLT5laV9jYmRhdGEgPSBOVUxMOwotCQlsbW0gPSBOVUxMOworCQlyZXEgPSBtZGNfaW50ZW50X29wZW5fcGFjayhleHAsIGl0LCBvcF9kYXRhKTsKIAl9IGVsc2UgaWYgKGl0LT5pdF9vcCAmIElUX1VOTElOSykgewogCQlyZXEgPSBtZGNfaW50ZW50X3VubGlua19wYWNrKGV4cCwgaXQsIG9wX2RhdGEpOwogCX0gZWxzZSBpZiAoaXQtPml0X29wICYgKElUX0dFVEFUVFIgfCBJVF9MT09LVVApKSB7CkBAIC04MDYsNyArNzgwLDcgQEAKIAkgKi8KIAlpZiAoaXQpIHsKIAkJbWRjX2dldF9ycGNfbG9jayhvYmRkZXYtPnUuY2xpLmNsX3JwY19sb2NrLCBpdCk7Ci0JCXJjID0gbWRjX2VudGVyX3JlcXVlc3QoJm9iZGRldi0+dS5jbGkpOworCQlyYyA9IG9iZF9nZXRfcmVxdWVzdF9zbG90KCZvYmRkZXYtPnUuY2xpKTsKIAkJaWYgKHJjICE9IDApIHsKIAkJCW1kY19wdXRfcnBjX2xvY2sob2JkZGV2LT51LmNsaS5jbF9ycGNfbG9jaywgaXQpOwogCQkJbWRjX2NsZWFyX3JlcGxheV9mbGFnKHJlcSwgMCk7CkBAIC04MzQsMTMgKzgwOCwxMiBAQAogCQlyZXR1cm4gcmM7CiAJfQogCi0JbWRjX2V4aXRfcmVxdWVzdCgmb2JkZGV2LT51LmNsaSk7CisJb2JkX3B1dF9yZXF1ZXN0X3Nsb3QoJm9iZGRldi0+dS5jbGkpOwogCW1kY19wdXRfcnBjX2xvY2sob2JkZGV2LT51LmNsaS5jbF9ycGNfbG9jaywgaXQpOwogCiAJaWYgKHJjIDwgMCkgewotCQlDREVCVUdfTElNSVQoKHJjID09IC1FQUNDRVMgfHwgcmMgPT0gLUVJRFJNKSA/IERfSU5GTyA6IERfRVJST1IsCi0JCQkgICAgICIlczogbGRsbV9jbGlfZW5xdWV1ZSBmYWlsZWQ6IHJjID0gJWRcbiIsCi0JCQkgICAgIG9iZGRldi0+b2JkX25hbWUsIHJjKTsKKwkJQ0RFQlVHKERfSU5GTywgIiVzOiBsZGxtX2NsaV9lbnF1ZXVlIGZhaWxlZDogcmMgPSAlZFxuIiwKKwkJICAgICAgIG9iZGRldi0+b2JkX25hbWUsIHJjKTsKIAogCQltZGNfY2xlYXJfcmVwbGF5X2ZsYWcocmVxLCByYyk7CiAJCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKQEAgLTkwMyw2ICs4NzYsOSBAQAogCUxBU1NFUlQocmVxdWVzdCAhPSBMUF9QT0lTT04pOwogCUxBU1NFUlQocmVxdWVzdC0+cnFfcmVwbXNnICE9IExQX1BPSVNPTik7CiAKKwlpZiAoaXQtPml0X29wICYgSVRfUkVBRERJUikKKwkJcmV0dXJuIDA7CisKIAlpZiAoIWl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0lUX0VYRUNEKSkgewogCQkvKiBUaGUgc2VydmVyIGZhaWxlZCBiZWZvcmUgaXQgZXZlbiBzdGFydGVkIGV4ZWN1dGluZyB0aGUKIAkJICogaW50ZW50LCBpLmUuIGJlY2F1c2UgaXQgY291bGRuJ3QgdW5wYWNrIHRoZSByZXF1ZXN0LgpAQCAtOTE3LDI3ICs4OTMsNiBAQAogCW1kdF9ib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxdWVzdC0+cnFfcGlsbCwgJlJNRl9NRFRfQk9EWSk7CiAJTEFTU0VSVChtZHRfYm9keSk7ICAgICAgLyogbWRjX2VucXVldWUgY2hlY2tlZCAqLwogCi0JLyogSWYgd2Ugd2VyZSByZXZhbGlkYXRpbmcgYSBmaWQvbmFtZSBwYWlyLCBtYXJrIHRoZSBpbnRlbnQgaW4KLQkgKiBjYXNlIHdlIGZhaWwgYW5kIGdldCBjYWxsZWQgYWdhaW4gZnJvbSBsb29rdXAKLQkgKi8KLQlpZiAoZmlkX2lzX3NhbmUoJm9wX2RhdGEtPm9wX2ZpZDIpICYmCi0JICAgIGl0LT5pdF9jcmVhdGVfbW9kZSAmIE1fQ0hFQ0tfU1RBTEUgJiYKLQkgICAgaXQtPml0X29wICE9IElUX0dFVEFUVFIpIHsKLQkJLyogQWxzbzogZGlkIHdlIGZpbmQgdGhlIHNhbWUgaW5vZGU/ICovCi0JCS8qIHNldmVyIGNhbiByZXR1cm4gb25lIG9mIHR3byBmaWRzOgotCQkgKiBvcF9maWQyIC0gbmV3IGFsbG9jYXRlZCBmaWQgLSBpZiBmaWxlIGlzIGNyZWF0ZWQuCi0JCSAqIG9wX2ZpZDMgLSBleGlzdGVudCBmaWQgLSBpZiBmaWxlIG9ubHkgb3Blbi4KLQkJICogb3BfZmlkMyBpcyBzYXZlZCBpbiBsbXZfaW50ZW50X29wZW4KLQkJICovCi0JCWlmICgoIWx1X2ZpZF9lcSgmb3BfZGF0YS0+b3BfZmlkMiwgJm1kdF9ib2R5LT5maWQxKSkgJiYKLQkJICAgICghbHVfZmlkX2VxKCZvcF9kYXRhLT5vcF9maWQzLCAmbWR0X2JvZHktPmZpZDEpKSkgewotCQkJQ0RFQlVHKERfREVOVFJZLCAiRm91bmQgc3RhbGUgZGF0YSAiREZJRCIoIkRGSUQiKS8iREZJRAotCQkJICAgICAgICJcbiIsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLAotCQkJICAgICAgIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDIpLCBQRklEKCZtZHRfYm9keS0+ZmlkMSkpOwotCQkJcmV0dXJuIC1FU1RBTEU7Ci0JCX0KLQl9Ci0KIAlyYyA9IGl0X29wZW5fZXJyb3IoRElTUF9MT09LVVBfRVhFQ0QsIGl0KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKQEAgLTk4MCwxMCArOTM1LDEwIEBACiAKIAkJTERMTV9ERUJVRyhsb2NrLCAibWF0Y2hpbmcgYWdhaW5zdCB0aGlzIik7CiAKLQkJTEFTU0VSVEYoZmlkX3Jlc19uYW1lX2VxKCZtZHRfYm9keS0+ZmlkMSwKKwkJTEFTU0VSVEYoZmlkX3Jlc19uYW1lX2VxKCZtZHRfYm9keS0+bWJvX2ZpZDEsCiAJCQkJCSAmbG9jay0+bF9yZXNvdXJjZS0+bHJfbmFtZSksCiAJCQkgIkxvY2sgcmVzX2lkOiAiRExETE1SRVMiLCBmaWQ6ICJERklEIlxuIiwKLQkJCSBQTERMTVJFUyhsb2NrLT5sX3Jlc291cmNlKSwgUEZJRCgmbWR0X2JvZHktPmZpZDEpKTsKKwkJCSBQTERMTVJFUyhsb2NrLT5sX3Jlc291cmNlKSwgUEZJRCgmbWR0X2JvZHktPm1ib19maWQxKSk7CiAJCUxETE1fTE9DS19QVVQobG9jayk7CiAKIAkJbWVtY3B5KCZvbGRfbG9jaywgbG9ja2gsIHNpemVvZigqbG9ja2gpKTsKQEAgLTk5OCw4ICs5NTMsOCBAQAogCX0KIAlDREVCVUcoRF9ERU5UUlksCiAJICAgICAgICJEX0lUIGRlbnRyeSAlLipzIGludGVudDogJXMgc3RhdHVzICVkIGRpc3AgJXggcmMgJWRcbiIsCi0JICAgICAgIG9wX2RhdGEtPm9wX25hbWVsZW4sIG9wX2RhdGEtPm9wX25hbWUsIGxkbG1faXQyc3RyKGl0LT5pdF9vcCksCi0JICAgICAgIGl0LT5pdF9zdGF0dXMsIGl0LT5pdF9kaXNwb3NpdGlvbiwgcmMpOworCSAgICAgICAoaW50KW9wX2RhdGEtPm9wX25hbWVsZW4sIG9wX2RhdGEtPm9wX25hbWUsCisJICAgICAgIGxkbG1faXQyc3RyKGl0LT5pdF9vcCksIGl0LT5pdF9zdGF0dXMsIGl0LT5pdF9kaXNwb3NpdGlvbiwgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTA0Miw2ICs5OTcsOSBAQAogCQkJCQkJICBNRFNfSU5PREVMT0NLX0xPT0tVUCB8CiAJCQkJCQkgIE1EU19JTk9ERUxPQ0tfUEVSTTsKIAkJCWJyZWFrOworCQljYXNlIElUX1JFQURESVI6CisJCQlwb2xpY3kubF9pbm9kZWJpdHMuYml0cyA9IE1EU19JTk9ERUxPQ0tfVVBEQVRFOworCQkJYnJlYWs7CiAJCWNhc2UgSVRfTEFZT1VUOgogCQkJcG9saWN5LmxfaW5vZGViaXRzLmJpdHMgPSBNRFNfSU5PREVMT0NLX0xBWU9VVDsKIAkJCWJyZWFrOwpAQCAtMTA5NSwxMCArMTA1Myw4IEBACiAgKiBjaGlsZCBsb29rdXAuCiAgKi8KIGludCBtZGNfaW50ZW50X2xvY2soc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCSAgICB2b2lkICpsbW0sIGludCBsbW1zaXplLCBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsCi0JCSAgICBpbnQgbG9va3VwX2ZsYWdzLCBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXFwLAotCQkgICAgbGRsbV9ibG9ja2luZ19jYWxsYmFjayBjYl9ibG9ja2luZywKLQkJICAgIF9fdTY0IGV4dHJhX2xvY2tfZmxhZ3MpCisJCSAgICBzdHJ1Y3QgbG9va3VwX2ludGVudCAqaXQsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXAsCisJCSAgICBsZGxtX2Jsb2NraW5nX2NhbGxiYWNrIGNiX2Jsb2NraW5nLCBfX3U2NCBleHRyYV9sb2NrX2ZsYWdzKQogewogCXN0cnVjdCBsZGxtX2VucXVldWVfaW5mbyBlaW5mbyA9IHsKIAkJLmVpX3R5cGUJPSBMRExNX0lCSVRTLApAQCAtMTExMiwxNCArMTA2OCwxNCBAQAogCUxBU1NFUlQoaXQpOwogCiAJQ0RFQlVHKERfRExNVFJBQ0UsICIobmFtZTogJS4qcywiREZJRCIpIGluIG9iaiAiREZJRAotCQkiLCBpbnRlbnQ6ICVzIGZsYWdzICUjTG9cbiIsIG9wX2RhdGEtPm9wX25hbWVsZW4sCisJCSIsIGludGVudDogJXMgZmxhZ3MgJSNMb1xuIiwgKGludClvcF9kYXRhLT5vcF9uYW1lbGVuLAogCQlvcF9kYXRhLT5vcF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQyKSwKIAkJUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIGxkbG1faXQyc3RyKGl0LT5pdF9vcCksCiAJCWl0LT5pdF9mbGFncyk7CiAKIAlsb2NraC5jb29raWUgPSAwOwogCWlmIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMikgJiYKLQkgICAgKGl0LT5pdF9vcCAmIChJVF9MT09LVVAgfCBJVF9HRVRBVFRSKSkpIHsKKwkgICAgKGl0LT5pdF9vcCAmIChJVF9MT09LVVAgfCBJVF9HRVRBVFRSIHwgSVRfUkVBRERJUikpKSB7CiAJCS8qIFdlIGNvdWxkIGp1c3QgcmV0dXJuIDEgaW1tZWRpYXRlbHksIGJ1dCBzaW5jZSB3ZSBzaG91bGQgb25seQogCQkgKiBiZSBjYWxsZWQgaW4gcmV2YWxpZGF0ZV9pdCBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBsb2NrLCBsZXQncwogCQkgKiB2ZXJpZnkgdGhhdC4KQEAgLTExMzUsMTMgKzEwOTEsMTMgQEAKIAogCS8qIEZvciBjYXNlIGlmIHVwcGVyIGxheWVyIGRpZCBub3QgYWxsb2MgZmlkLCBkbyBpdCBub3cuICovCiAJaWYgKCFmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMikgJiYgaXQtPml0X29wICYgSVRfQ1JFQVQpIHsKLQkJcmMgPSBtZGNfZmlkX2FsbG9jKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOworCQlyYyA9IG1kY19maWRfYWxsb2MoTlVMTCwgZXhwLCAmb3BfZGF0YS0+b3BfZmlkMiwgb3BfZGF0YSk7CiAJCWlmIChyYyA8IDApIHsKIAkJCUNFUlJPUigiQ2FuJ3QgYWxsb2MgbmV3IGZpZCwgcmMgJWRcbiIsIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfQogCX0KLQlyYyA9IG1kY19lbnF1ZXVlKGV4cCwgJmVpbmZvLCBpdCwgb3BfZGF0YSwgJmxvY2toLCBsbW0sIGxtbXNpemUsIE5VTEwsCisJcmMgPSBtZGNfZW5xdWV1ZShleHAsICZlaW5mbywgTlVMTCwgaXQsIG9wX2RhdGEsICZsb2NraCwKIAkJCSBleHRyYV9sb2NrX2ZsYWdzKTsKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcmM7CkBAIC0xMTcwLDcgKzExMjYsNyBAQAogCiAJb2JkZGV2ID0gY2xhc3NfZXhwMm9iZChleHApOwogCi0JbWRjX2V4aXRfcmVxdWVzdCgmb2JkZGV2LT51LmNsaSk7CisJb2JkX3B1dF9yZXF1ZXN0X3Nsb3QoJm9iZGRldi0+dS5jbGkpOwogCWlmIChPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9NRENfR0VUQVRUUl9FTlFVRVVFKSkKIAkJcmMgPSAtRVRJTUVET1VUOwogCkBAIC0xMjIyLDE1ICsxMTc4LDE1IEBACiAKIAlDREVCVUcoRF9ETE1UUkFDRSwKIAkgICAgICAgIm5hbWU6ICUuKnMgaW4gaW5vZGUgIiBERklEICIsIGludGVudDogJXMgZmxhZ3MgJSNMb1xuIiwKLQkgICAgICAgb3BfZGF0YS0+b3BfbmFtZWxlbiwgb3BfZGF0YS0+b3BfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksCi0JICAgICAgIGxkbG1faXQyc3RyKGl0LT5pdF9vcCksIGl0LT5pdF9mbGFncyk7CisJICAgICAgIChpbnQpb3BfZGF0YS0+b3BfbmFtZWxlbiwgb3BfZGF0YS0+b3BfbmFtZSwKKwkgICAgICAgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksIGxkbG1faXQyc3RyKGl0LT5pdF9vcCksIGl0LT5pdF9mbGFncyk7CiAKIAlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKCZvcF9kYXRhLT5vcF9maWQxLCAmcmVzX2lkKTsKIAlyZXEgPSBtZGNfaW50ZW50X2dldGF0dHJfcGFjayhleHAsIGl0LCBvcF9kYXRhKTsKIAlpZiAoSVNfRVJSKHJlcSkpCiAJCXJldHVybiBQVFJfRVJSKHJlcSk7CiAKLQlyYyA9IG1kY19lbnRlcl9yZXF1ZXN0KCZvYmRkZXYtPnUuY2xpKTsKKwlyYyA9IG9iZF9nZXRfcmVxdWVzdF9zbG90KCZvYmRkZXYtPnUuY2xpKTsKIAlpZiAocmMgIT0gMCkgewogCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CiAJCXJldHVybiByYzsKQEAgLTEyMzksNyArMTE5NSw3IEBACiAJcmMgPSBsZGxtX2NsaV9lbnF1ZXVlKGV4cCwgJnJlcSwgZWluZm8sICZyZXNfaWQsICZwb2xpY3ksICZmbGFncywgTlVMTCwKIAkJCSAgICAgIDAsIExWQl9UX05PTkUsICZtaW5mby0+bWlfbG9ja2gsIDEpOwogCWlmIChyYyA8IDApIHsKLQkJbWRjX2V4aXRfcmVxdWVzdCgmb2JkZGV2LT51LmNsaSk7CisJCW9iZF9wdXRfcmVxdWVzdF9zbG90KCZvYmRkZXYtPnUuY2xpKTsKIAkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCQlyZXR1cm4gcmM7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZWludC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZWludC5jCmluZGV4IDVkYmEyYzguLmM5MjFlNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVpbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlaW50LmMKQEAgLTg2LDcgKzg2LDcgQEAKIAlmaWRfYnVpbGRfcmVnX3Jlc19uYW1lKGZpZCwgJnJlc19pZCk7CiAJcmVzID0gbGRsbV9yZXNvdXJjZV9nZXQoZXhwLT5leHBfb2JkLT5vYmRfbmFtZXNwYWNlLAogCQkJCU5VTEwsICZyZXNfaWQsIDAsIDApOwotCWlmICghcmVzKQorCWlmIChJU19FUlIocmVzKSkKIAkJcmV0dXJuIDA7CiAJTERMTV9SRVNPVVJDRV9BRERSRUYocmVzKTsKIAkvKiBJbml0aWFsaXplIGliaXRzIGxvY2sgcG9saWN5LiAqLwpAQCAtOTksNyArOTksNyBAQAogfQogCiBpbnQgbWRjX3NldGF0dHIoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JCXZvaWQgKmVhLCBpbnQgZWFsZW4sIHZvaWQgKmVhMiwgaW50IGVhMmxlbiwKKwkJdm9pZCAqZWEsIHNpemVfdCBlYWxlbiwgdm9pZCAqZWEyLCBzaXplX3QgZWEybGVuLAogCQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0LCBzdHJ1Y3QgbWRfb3Blbl9kYXRhICoqbW9kKQogewogCUxJU1RfSEVBRChjYW5jZWxzKTsKQEAgLTExMCwxMSArMTEwLDEwIEBACiAJX191NjQgYml0czsKIAogCWJpdHMgPSBNRFNfSU5PREVMT0NLX1VQREFURTsKLQlpZiAob3BfZGF0YS0+b3BfYXR0ci5pYV92YWxpZCAmIChBVFRSX01PREV8QVRUUl9VSUR8QVRUUl9HSUQpKQorCWlmIChvcF9kYXRhLT5vcF9hdHRyLmlhX3ZhbGlkICYgKEFUVFJfTU9ERSB8IEFUVFJfVUlEIHwgQVRUUl9HSUQpKQogCQliaXRzIHw9IE1EU19JTk9ERUxPQ0tfTE9PS1VQOwogCWlmICgob3BfZGF0YS0+b3BfZmxhZ3MgJiBNRl9NRENfQ0FOQ0VMX0ZJRDEpICYmCi0JICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMSkpICYmCi0JICAgICFPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX0JMX0NBTExCQUNLX05FVCkpCisJICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMSkpKQogCQljb3VudCA9IG1kY19yZXNvdXJjZV9nZXRfdW51c2VkKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDEsCiAJCQkJCQkmY2FuY2VscywgTENLX0VYLCBiaXRzKTsKIAlyZXEgPSBwdGxycGNfcmVxdWVzdF9hbGxvYyhjbGFzc19leHAyY2xpaW1wKGV4cCksCkBAIC0xNzcsOCArMTc2LDggQEAKIAogCQllcG9jaCA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9NRFRfRVBPQ0gpOwogCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKLQkJZXBvY2gtPmhhbmRsZSA9IGJvZHktPmhhbmRsZTsKLQkJZXBvY2gtPmlvZXBvY2ggPSBib2R5LT5pb2Vwb2NoOworCQllcG9jaC0+aGFuZGxlID0gYm9keS0+bWJvX2hhbmRsZTsKKwkJZXBvY2gtPmlvZXBvY2ggPSBib2R5LT5tYm9faW9lcG9jaDsKIAkJcmVxLT5ycV9yZXBsYXlfY2IgPSBtZGNfcmVwbGF5X29wZW47CiAJLyoqIGJ1ZyAzNjMzLCBvcGVuIG1heSBiZSBjb21taXR0ZWQgYW5kIGVzdGFsZSBhbnN3ZXIgaXMgbm90IGVycm9yICovCiAJfSBlbHNlIGlmIChyYyA9PSAtRVNUQUxFICYmIChvcF9kYXRhLT5vcF9mbGFncyAmIE1GX1NPTV9DSEFOR0UpKSB7CkBAIC0xOTcsOSArMTk2LDkgQEAKIH0KIAogaW50IG1kY19jcmVhdGUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IG1kX29wX2RhdGEgKm9wX2RhdGEsCi0JICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIGludCBkYXRhbGVuLCBpbnQgbW9kZSwgX191MzIgdWlkLCBfX3UzMiBnaWQsCi0JICAgICAgIGNmc19jYXBfdCBjYXBfZWZmZWN0aXZlLCBfX3U2NCByZGV2LAotCSAgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQorCSAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YWxlbiwgdW1vZGVfdCBtb2RlLAorCSAgICAgICB1aWRfdCB1aWQsIGdpZF90IGdpZCwgY2ZzX2NhcF90IGNhcF9lZmZlY3RpdmUsCisJICAgICAgIF9fdTY0IHJkZXYsIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCiB7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CiAJaW50IGxldmVsLCByYzsKQEAgLTIxNCwxMSArMjEzLDkgQEAKIAkJICogbWRjX2ZpZF9hbGxvYygpIG1heSByZXR1cm4gZXJybm8gMSBpbiBjYXNlIG9mIHN3aXRjaCB0byBuZXcKIAkJICogc2VxdWVuY2UsIGhhbmRsZSB0aGlzLgogCQkgKi8KLQkJcmMgPSBtZGNfZmlkX2FsbG9jKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOwotCQlpZiAocmMgPCAwKSB7Ci0JCQlDRVJST1IoIkNhbid0IGFsbG9jIG5ldyBmaWQsIHJjICVkXG4iLCByYyk7CisJCXJjID0gbWRjX2ZpZF9hbGxvYyhOVUxMLCBleHAsICZvcF9kYXRhLT5vcF9maWQyLCBvcF9kYXRhKTsKKwkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKLQkJfQogCX0KIAogcmVidWlsZDoKQEAgLTMwNywxNCArMzA0LDEyIEBACiAJTEFTU0VSVCghcmVxKTsKIAogCWlmICgob3BfZGF0YS0+b3BfZmxhZ3MgJiBNRl9NRENfQ0FOQ0VMX0ZJRDEpICYmCi0JICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMSkpICYmCi0JICAgICFPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX0JMX0NBTExCQUNLX05FVCkpCisJICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMSkpKQogCQljb3VudCA9IG1kY19yZXNvdXJjZV9nZXRfdW51c2VkKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDEsCiAJCQkJCQkmY2FuY2VscywgTENLX0VYLAogCQkJCQkJTURTX0lOT0RFTE9DS19VUERBVEUpOwogCWlmICgob3BfZGF0YS0+b3BfZmxhZ3MgJiBNRl9NRENfQ0FOQ0VMX0ZJRDMpICYmCi0JICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMykpICYmCi0JICAgICFPQkRfRkFJTF9DSEVDSyhPQkRfRkFJTF9MRExNX0JMX0NBTExCQUNLX05FVCkpCisJICAgIChmaWRfaXNfc2FuZSgmb3BfZGF0YS0+b3BfZmlkMykpKQogCQljb3VudCArPSBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChleHAsICZvcF9kYXRhLT5vcF9maWQzLAogCQkJCQkJICZjYW5jZWxzLCBMQ0tfRVgsCiAJCQkJCQkgTURTX0lOT0RFTE9DS19GVUxMKTsKQEAgLTM5NCw3ICszODksNyBAQAogfQogCiBpbnQgbWRjX3JlbmFtZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKLQkgICAgICAgY29uc3QgY2hhciAqb2xkLCBpbnQgb2xkbGVuLCBjb25zdCBjaGFyICpuZXcsIGludCBuZXdsZW4sCisJICAgICAgIGNvbnN0IGNoYXIgKm9sZCwgc2l6ZV90IG9sZGxlbiwgY29uc3QgY2hhciAqbmV3LCBzaXplX3QgbmV3bGVuLAogCSAgICAgICBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKipyZXF1ZXN0KQogewogCUxJU1RfSEVBRChjYW5jZWxzKTsKQEAgLTQzMSw3ICs0MjYsOCBAQAogCX0KIAogCXJlcV9jYXBzdWxlX3NldF9zaXplKCZyZXEtPnJxX3BpbGwsICZSTUZfTkFNRSwgUkNMX0NMSUVOVCwgb2xkbGVuICsgMSk7Ci0JcmVxX2NhcHN1bGVfc2V0X3NpemUoJnJlcS0+cnFfcGlsbCwgJlJNRl9TWU1UR1QsIFJDTF9DTElFTlQsIG5ld2xlbisxKTsKKwlyZXFfY2Fwc3VsZV9zZXRfc2l6ZSgmcmVxLT5ycV9waWxsLCAmUk1GX1NZTVRHVCwgUkNMX0NMSUVOVCwKKwkJCSAgICAgbmV3bGVuICsgMSk7CiAKIAlyYyA9IG1kY19wcmVwX2VsY19yZXEoZXhwLCByZXEsIE1EU19SRUlOVCwgJmNhbmNlbHMsIGNvdW50KTsKIAlpZiAocmMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZXF1ZXN0LmMKaW5kZXggNTQyODAxZi4uZjU2ZWE2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL21kY19yZXF1ZXN0LmMKQEAgLTM5LDcgKzM5LDkgQEAKICMgaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfYWNsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfY2xhc3MuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9sbXYuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9maWQuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfcGFyYW0uaCIKQEAgLTU3LDE2ICs1OSwxNiBAQAogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmcmVxLT5ycV9pbXBvcnQtPmltcF9vYmQtPnUuY2xpOwogCWludCByYzsKIAotCS8qIG1kY19lbnRlcl9yZXF1ZXN0KCkgZW5zdXJlcyB0aGF0IHRoaXMgY2xpZW50IGhhcyBubyBtb3JlCisJLyogb2JkX2dldF9yZXF1ZXN0X3Nsb3QoKSBlbnN1cmVzIHRoYXQgdGhpcyBjbGllbnQgaGFzIG5vIG1vcmUKIAkgKiB0aGFuIGNsX21heF9ycGNzX2luX2ZsaWdodCBSUENzIHNpbXVsdGFuZW91c2x5IGluZiBsaWdodAogCSAqIGFnYWluc3QgYW4gTURULgogCSAqLwotCXJjID0gbWRjX2VudGVyX3JlcXVlc3QoY2xpKTsKKwlyYyA9IG9iZF9nZXRfcmVxdWVzdF9zbG90KGNsaSk7CiAJaWYgKHJjICE9IDApCiAJCXJldHVybiByYzsKIAogCXJjID0gcHRscnBjX3F1ZXVlX3dhaXQocmVxKTsKLQltZGNfZXhpdF9yZXF1ZXN0KGNsaSk7CisJb2JkX3B1dF9yZXF1ZXN0X3Nsb3QoY2xpKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTk4LDcgKzEwMCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCSpyb290ZmlkID0gYm9keS0+ZmlkMTsKKwkqcm9vdGZpZCA9IGJvZHktPm1ib19maWQxOwogCUNERUJVRyhEX05FVCwKIAkgICAgICAgInJvb3QgZmlkPSJERklEIiwgbGFzdF9jb21taXR0ZWQ9JWxsdVxuIiwKIAkgICAgICAgUEZJRChyb290ZmlkKSwKQEAgLTEzNiwxMiArMTM4LDEyIEBACiAJaWYgKCFib2R5KQogCQlyZXR1cm4gLUVQUk9UTzsKIAotCUNERUJVRyhEX05FVCwgIm1vZGU6ICVvXG4iLCBib2R5LT5tb2RlKTsKKwlDREVCVUcoRF9ORVQsICJtb2RlOiAlb1xuIiwgYm9keS0+bWJvX21vZGUpOwogCiAJbWRjX3VwZGF0ZV9tYXhfZWFfZnJvbV9ib2R5KGV4cCwgYm9keSk7Ci0JaWYgKGJvZHktPmVhZGF0YXNpemUgIT0gMCkgeworCWlmIChib2R5LT5tYm9fZWFkYXRhc2l6ZSAhPSAwKSB7CiAJCWVhZGF0YSA9IHJlcV9jYXBzdWxlX3NlcnZlcl9zaXplZF9nZXQocGlsbCwgJlJNRl9NRFRfTUQsCi0JCQkJCQkgICAgICBib2R5LT5lYWRhdGFzaXplKTsKKwkJCQkJCSAgICAgIGJvZHktPm1ib19lYWRhdGFzaXplKTsKIAkJaWYgKCFlYWRhdGEpCiAJCQlyZXR1cm4gLUVQUk9UTzsKIAl9CkBAIC0yMzAsMzIgKzIzMiw2IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IG1kY19pc19zdWJkaXIoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKLQkJCSBjb25zdCBzdHJ1Y3QgbHVfZmlkICpwZmlkLAotCQkJIGNvbnN0IHN0cnVjdCBsdV9maWQgKmNmaWQsCi0JCQkgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKLXsKLQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgICpyZXE7Ci0JaW50CQkgICAgIHJjOwotCi0JKnJlcXVlc3QgPSBOVUxMOwotCXJlcSA9IHB0bHJwY19yZXF1ZXN0X2FsbG9jX3BhY2soY2xhc3NfZXhwMmNsaWltcChleHApLAotCQkJCQkmUlFGX01EU19JU19TVUJESVIsIExVU1RSRV9NRFNfVkVSU0lPTiwKLQkJCQkJTURTX0lTX1NVQkRJUik7Ci0JaWYgKCFyZXEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWRjX2lzX3N1YmRpcl9wYWNrKHJlcSwgcGZpZCwgY2ZpZCwgMCk7Ci0JcHRscnBjX3JlcXVlc3Rfc2V0X3JlcGxlbihyZXEpOwotCi0JcmMgPSBwdGxycGNfcXVldWVfd2FpdChyZXEpOwotCWlmIChyYyAmJiByYyAhPSAtRVJFTU9URSkKLQkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwotCWVsc2UKLQkJKnJlcXVlc3QgPSByZXE7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IG1kY194YXR0cl9jb21tb24oc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10LAogCQkJICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKmZpZCwKQEAgLTM5NywxNSArMzczLDE1IEBACiAJdm9pZAkJICAgKmJ1ZjsKIAlpbnQJCSAgICAgcmM7CiAKLQlpZiAoIWJvZHktPmFjbHNpemUpCisJaWYgKCFib2R5LT5tYm9fYWNsc2l6ZSkKIAkJcmV0dXJuIDA7CiAKLQlidWYgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KHBpbGwsICZSTUZfQUNMLCBib2R5LT5hY2xzaXplKTsKKwlidWYgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KHBpbGwsICZSTUZfQUNMLCBib2R5LT5tYm9fYWNsc2l6ZSk7CiAKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FUFJPVE87CiAKLQlhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cigmaW5pdF91c2VyX25zLCBidWYsIGJvZHktPmFjbHNpemUpOworCWFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKCZpbml0X3VzZXJfbnMsIGJ1ZiwgYm9keS0+bWJvX2FjbHNpemUpOwogCWlmICghYWNsKQogCQlyZXR1cm4gMDsKIApAQCAtNDQzLDI0ICs0MTksMjQgQEAKIAogCW1kLT5ib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldChwaWxsLCAmUk1GX01EVF9CT0RZKTsKIAotCWlmIChtZC0+Ym9keS0+dmFsaWQgJiBPQkRfTURfRkxFQVNJWkUpIHsKKwlpZiAobWQtPmJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9GTEVBU0laRSkgewogCQlpbnQgbG1tc2l6ZTsKIAkJc3RydWN0IGxvdl9tZHNfbWQgKmxtbTsKIAotCQlpZiAoIVNfSVNSRUcobWQtPmJvZHktPm1vZGUpKSB7CisJCWlmICghU19JU1JFRyhtZC0+Ym9keS0+bWJvX21vZGUpKSB7CiAJCQlDREVCVUcoRF9JTkZPLAogCQkJICAgICAgICJPQkRfTURfRkxFQVNJWkUgc2V0LCBzaG91bGQgYmUgYSByZWd1bGFyIGZpbGUsIGJ1dCBpcyBub3RcbiIpOwogCQkJcmMgPSAtRVBST1RPOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAobWQtPmJvZHktPmVhZGF0YXNpemUgPT0gMCkgeworCQlpZiAobWQtPmJvZHktPm1ib19lYWRhdGFzaXplID09IDApIHsKIAkJCUNERUJVRyhEX0lORk8sCiAJCQkgICAgICAgIk9CRF9NRF9GTEVBU0laRSBzZXQsIGJ1dCBlYWRhdGFzaXplIDBcbiIpOwogCQkJcmMgPSAtRVBST1RPOwogCQkJZ290byBvdXQ7CiAJCX0KLQkJbG1tc2l6ZSA9IG1kLT5ib2R5LT5lYWRhdGFzaXplOworCQlsbW1zaXplID0gbWQtPmJvZHktPm1ib19lYWRhdGFzaXplOwogCQlsbW0gPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KHBpbGwsICZSTUZfTURUX01ELCBsbW1zaXplKTsKIAkJaWYgKCFsbW0pIHsKIAkJCXJjID0gLUVQUk9UTzsKQEAgLTQ3MSw3ICs0NDcsNyBAQAogCQlpZiAocmMgPCAwKQogCQkJZ290byBvdXQ7CiAKLQkJaWYgKHJjIDwgc2l6ZW9mKCptZC0+bHNtKSkgeworCQlpZiAocmMgPCAodHlwZW9mKHJjKSlzaXplb2YoKm1kLT5sc20pKSB7CiAJCQlDREVCVUcoRF9JTkZPLAogCQkJICAgICAgICJsc20gc2l6ZSB0b28gc21hbGw6IHJjIDwgc2l6ZW9mICgqbWQtPmxzbSkgKCVkIDwgJWQpXG4iLAogCQkJICAgICAgIHJjLCAoaW50KXNpemVvZigqbWQtPmxzbSkpOwpAQCAtNDc5LDI0ICs0NTUsMjQgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQl9IGVsc2UgaWYgKG1kLT5ib2R5LT52YWxpZCAmIE9CRF9NRF9GTERJUkVBKSB7CisJfSBlbHNlIGlmIChtZC0+Ym9keS0+bWJvX3ZhbGlkICYgT0JEX01EX0ZMRElSRUEpIHsKIAkJaW50IGxtdnNpemU7CiAJCXN0cnVjdCBsb3ZfbWRzX21kICpsbXY7CiAKLQkJaWYgKCFTX0lTRElSKG1kLT5ib2R5LT5tb2RlKSkgeworCQlpZiAoIVNfSVNESVIobWQtPmJvZHktPm1ib19tb2RlKSkgewogCQkJQ0RFQlVHKERfSU5GTywKIAkJCSAgICAgICAiT0JEX01EX0ZMRElSRUEgc2V0LCBzaG91bGQgYmUgYSBkaXJlY3RvcnksIGJ1dCBpcyBub3RcbiIpOwogCQkJcmMgPSAtRVBST1RPOwogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAobWQtPmJvZHktPmVhZGF0YXNpemUgPT0gMCkgeworCQlpZiAobWQtPmJvZHktPm1ib19lYWRhdGFzaXplID09IDApIHsKIAkJCUNERUJVRyhEX0lORk8sCiAJCQkgICAgICAgIk9CRF9NRF9GTERJUkVBIGlzIHNldCwgYnV0IGVhZGF0YXNpemUgMFxuIik7CiAJCQlyZXR1cm4gLUVQUk9UTzsKIAkJfQotCQlpZiAobWQtPmJvZHktPnZhbGlkICYgT0JEX01EX01FQSkgewotCQkJbG12c2l6ZSA9IG1kLT5ib2R5LT5lYWRhdGFzaXplOworCQlpZiAobWQtPmJvZHktPm1ib192YWxpZCAmIE9CRF9NRF9NRUEpIHsKKwkJCWxtdnNpemUgPSBtZC0+Ym9keS0+bWJvX2VhZGF0YXNpemU7CiAJCQlsbXYgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfc2l6ZWRfZ2V0KHBpbGwsICZSTUZfTURUX01ELAogCQkJCQkJCSAgIGxtdnNpemUpOwogCQkJaWYgKCFsbXYpIHsKQEAgLTUwNCwxNSArNDgwLDE1IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKLQkJCXJjID0gb2JkX3VucGFja21kKG1kX2V4cCwgKHZvaWQgKikmbWQtPm1lYSwgbG12LAorCQkJcmMgPSBvYmRfdW5wYWNrbWQobWRfZXhwLCAodm9pZCAqKSZtZC0+bG12LCBsbXYsCiAJCQkJCSAgbG12c2l6ZSk7CiAJCQlpZiAocmMgPCAwKQogCQkJCWdvdG8gb3V0OwogCi0JCQlpZiAocmMgPCBzaXplb2YoKm1kLT5tZWEpKSB7CisJCQlpZiAocmMgPCAodHlwZW9mKHJjKSlzaXplb2YoKm1kLT5sbXYpKSB7CiAJCQkJQ0RFQlVHKERfSU5GTywKLQkJCQkgICAgICAgInNpemUgdG9vIHNtYWxsOiByYyA8IHNpemVvZigqbWQtPm1lYSkgKCVkIDwgJWQpXG4iLAotCQkJCQlyYywgKGludClzaXplb2YoKm1kLT5tZWEpKTsKKwkJCQkgICAgICAgInNpemUgdG9vIHNtYWxsOiByYyA8IHNpemVvZigqbWQtPmxtdikgKCVkIDwgJWQpXG4iLAorCQkJCQlyYywgKGludClzaXplb2YoKm1kLT5sbXYpKTsKIAkJCQlyYyA9IC1FUFJPVE87CiAJCQkJZ290byBvdXQ7CiAJCQl9CkBAIC01MjAsMTIgKzQ5NiwxMiBAQAogCX0KIAlyYyA9IDA7CiAKLQlpZiAobWQtPmJvZHktPnZhbGlkICYgT0JEX01EX0ZMQUNMKSB7CisJaWYgKG1kLT5ib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxBQ0wpIHsKIAkJLyogZm9yIEFDTCwgaXQncyBwb3NzaWJsZSB0aGF0IEZMQUNMIGlzIHNldCBidXQgYWNsc2l6ZSBpcyB6ZXJvLgogCQkgKiBvbmx5IHdoZW4gYWNsc2l6ZSAhPSAwIHRoZXJlJ3MgYW4gYWN0dWFsIHNlZ21lbnQgZm9yIEFDTAogCQkgKiBpbiByZXBseSBidWZmZXIuCiAJCSAqLwotCQlpZiAobWQtPmJvZHktPmFjbHNpemUpIHsKKwkJaWYgKG1kLT5ib2R5LT5tYm9fYWNsc2l6ZSkgewogCQkJcmMgPSBtZGNfdW5wYWNrX2FjbChyZXEsIG1kKTsKIAkJCWlmIChyYykKIAkJCQlnb3RvIG91dDsKQEAgLTU4MCw5ICs1NTYsOSBAQAogCiAJCWZpbGVfZmggPSAmb2NoLT5vY2hfZmg7CiAJCUNERUJVRyhEX0hBLCAidXBkYXRpbmcgaGFuZGxlIGZyb20gJSNsbHggdG8gJSNsbHhcbiIsCi0JCSAgICAgICBmaWxlX2ZoLT5jb29raWUsIGJvZHktPmhhbmRsZS5jb29raWUpOworCQkgICAgICAgZmlsZV9maC0+Y29va2llLCBib2R5LT5tYm9faGFuZGxlLmNvb2tpZSk7CiAJCW9sZCA9ICpmaWxlX2ZoOwotCQkqZmlsZV9maCA9IGJvZHktPmhhbmRsZTsKKwkJKmZpbGVfZmggPSBib2R5LT5tYm9faGFuZGxlOwogCX0KIAljbG9zZV9yZXEgPSBtb2QtPm1vZF9jbG9zZV9yZXE7CiAJaWYgKGNsb3NlX3JlcSkgewpAQCAtNTk3LDcgKzU3Myw3IEBACiAJCWlmIChvY2gpCiAJCQlMQVNTRVJUKCFtZW1jbXAoJm9sZCwgJmVwb2NoLT5oYW5kbGUsIHNpemVvZihvbGQpKSk7CiAJCURFQlVHX1JFUShEX0hBLCBjbG9zZV9yZXEsICJ1cGRhdGluZyBjbG9zZSBib2R5IHdpdGggbmV3IGZoIik7Ci0JCWVwb2NoLT5oYW5kbGUgPSBib2R5LT5oYW5kbGU7CisJCWVwb2NoLT5oYW5kbGUgPSBib2R5LT5tYm9faGFuZGxlOwogCX0KIH0KIApAQCAtNjc5LDExICs2NTUsMTEgQEAKIAkJc3Bpbl91bmxvY2soJm9wZW5fcmVxLT5ycV9sb2NrKTsKIAl9CiAKLQlyZWMtPmNyX2ZpZDIgPSBib2R5LT5maWQxOwotCXJlYy0+Y3JfaW9lcG9jaCA9IGJvZHktPmlvZXBvY2g7Ci0JcmVjLT5jcl9vbGRfaGFuZGxlLmNvb2tpZSA9IGJvZHktPmhhbmRsZS5jb29raWU7CisJcmVjLT5jcl9maWQyID0gYm9keS0+bWJvX2ZpZDE7CisJcmVjLT5jcl9pb2Vwb2NoID0gYm9keS0+bWJvX2lvZXBvY2g7CisJcmVjLT5jcl9vbGRfaGFuZGxlLmNvb2tpZSA9IGJvZHktPm1ib19oYW5kbGUuY29va2llOwogCW9wZW5fcmVxLT5ycV9yZXBsYXlfY2IgPSBtZGNfcmVwbGF5X29wZW47Ci0JaWYgKCFmaWRfaXNfc2FuZSgmYm9keS0+ZmlkMSkpIHsKKwlpZiAoIWZpZF9pc19zYW5lKCZib2R5LT5tYm9fZmlkMSkpIHsKIAkJREVCVUdfUkVRKERfRVJST1IsIG9wZW5fcmVxLAogCQkJICAiU2F2aW5nIHJlcGxheSByZXF1ZXN0IHdpdGggaW5zYW5lIGZpZCIpOwogCQlMQlVHKCk7CkBAIC03MDEsOSArNjc3LDE1IEBACiAJICAgIGltcF9jb25uZWN0X2Rpc3Bfc3RyaXBlKG1vZC0+bW9kX29wZW5fcmVxLT5ycV9pbXBvcnQpKQogCQljb21taXR0ZWQgPSAxOwogCi0JTEFTU0VSVChtb2QtPm1vZF9vcGVuX3JlcS0+cnFfcmVwbGF5ID09IDApOwotCi0JREVCVUdfUkVRKERfUlBDVFJBQ0UsIG1vZC0+bW9kX29wZW5fcmVxLCAiZnJlZSBvcGVuIHJlcXVlc3RcbiIpOworCS8qCisJICogTm8gcmVhc29uIHRvIGFzc3NlcnQgaGVyZSBpZiB0aGUgb3BlbiByZXF1ZXN0IGhhcworCSAqIHJxX3JlcGxheSA9PSAxLiBJdCBtZWFucyB0aGF0IG1kY19jbG9zZSBmYWlsZWQsIGFuZAorCSAqIGNsb3NlIHJlcXVlc3Qgd2FzbmB0IHNlbnQuIEl0IGlzIG5vdCBmYXRhbCB0byBjbGllbnQuCisJICogVGhlIHdvcnN0IHRoaW5nIGlzIGV2aWN0aW9uIGlmIHRoZSBjbGllbnQgZ2V0cyBvcGVuIGxvY2sKKwkgKi8KKwlERUJVR19SRVEoRF9SUENUUkFDRSwgbW9kLT5tb2Rfb3Blbl9yZXEsCisJCSAgImZyZWUgb3BlbiByZXF1ZXN0IHJxX3JlcGxheSA9ICVkXG4iLAorCQkgICBtb2QtPm1vZF9vcGVuX3JlcS0+cnFfcmVwbGF5KTsKIAogCXB0bHJwY19yZXF1ZXN0X2NvbW1pdHRlZChtb2QtPm1vZF9vcGVuX3JlcSwgY29tbWl0dGVkKTsKIAlpZiAobW9kLT5tb2RfY2xvc2VfcmVxKQpAQCAtNzQ0LDcgKzcyNiw3IEBACiAJCWVwb2NoID0gcmVxX2NhcHN1bGVfY2xpZW50X2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9FUE9DSCk7CiAKIAkJZXBvY2gtPmZsYWdzIHw9IE1GX1NPTV9BVTsKLQkJaWYgKHJlcGJvZHktPnZhbGlkICYgT0JEX01EX0ZMR0VUQVRUUkxPQ0spCisJCWlmIChyZXBib2R5LT5tYm9fdmFsaWQgJiBPQkRfTURfRkxHRVRBVFRSTE9DSykKIAkJCW9wX2RhdGEtPm9wX2ZsYWdzIHw9IE1GX0dFVEFUVFJfTE9DSzsKIAl9CiB9CkBAIC03NjMsNyArNzQ1LDcgQEAKIAkJcmVxX2ZtdCA9ICZSUUZfTURTX1JFTEVBU0VfQ0xPU0U7CiAKIAkJLyogYWxsb2NhdGUgYSBGSUQgZm9yIHZvbGF0aWxlIGZpbGUgKi8KLQkJcmMgPSBtZGNfZmlkX2FsbG9jKGV4cCwgJm9wX2RhdGEtPm9wX2ZpZDIsIG9wX2RhdGEpOworCQlyYyA9IG1kY19maWRfYWxsb2MoTlVMTCwgZXhwLCAmb3BfZGF0YS0+b3BfZmlkMiwgb3BfZGF0YSk7CiAJCWlmIChyYyA8IDApIHsKIAkJCUNFUlJPUigiJXM6ICJERklEIiBmYWlsZWQgdG8gYWxsb2NhdGUgRklEOiAlZFxuIiwKIAkJCSAgICAgICBvYmQtPm9iZF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgcmMpOwpAQCAtNzczLDIyICs3NTUsMTAgQEAKIAl9CiAKIAkqcmVxdWVzdCA9IE5VTEw7Ci0JcmVxID0gcHRscnBjX3JlcXVlc3RfYWxsb2MoY2xhc3NfZXhwMmNsaWltcChleHApLCByZXFfZm10KTsKLQlpZiAoIXJlcSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyYyA9IHB0bHJwY19yZXF1ZXN0X3BhY2socmVxLCBMVVNUUkVfTURTX1ZFUlNJT04sIE1EU19DTE9TRSk7Ci0JaWYgKHJjKSB7Ci0JCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIFRvIGF2b2lkIGEgbGl2ZWxvY2sgKGJ1ZyA3MDM0KSwgd2UgbmVlZCB0byBzZW5kIENMT1NFIFJQQ3MgdG8gYQotCSAqIHBvcnRhbCB3aG9zZSB0aHJlYWRzIGFyZSBub3QgdGFraW5nIGFueSBETE0gbG9ja3MgYW5kIGFyZSB0aGVyZWZvcmUKLQkgKiBhbHdheXMgcHJvZ3Jlc3NpbmcKLQkgKi8KLQlyZXEtPnJxX3JlcXVlc3RfcG9ydGFsID0gTURTX1JFQURQQUdFX1BPUlRBTDsKLQlwdGxycGNfYXRfc2V0X3JlcV90aW1lb3V0KHJlcSk7CisJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX01EQ19DTE9TRSkpCisJCXJlcSA9IE5VTEw7CisJZWxzZQorCQlyZXEgPSBwdGxycGNfcmVxdWVzdF9hbGxvYyhjbGFzc19leHAyY2xpaW1wKGV4cCksIHJlcV9mbXQpOwogCiAJLyogRW5zdXJlIHRoYXQgdGhpcyBjbG9zZSdzIGhhbmRsZSBpcyBmaXhlZCB1cCBkdXJpbmcgcmVwbGF5LiAqLwogCWlmIChsaWtlbHkobW9kKSkgewpAQCAtODA5LDYgKzc3OSwyOSBAQAogCQkgQ0RFQlVHKERfSEEsCiAJCQkiY291bGRuJ3QgZmluZCBvcGVuIHJlcTsgZXhwZWN0aW5nIGNsb3NlIGVycm9yXG4iKTsKIAl9CisJaWYgKCFyZXEpIHsKKwkJLyoKKwkJICogVE9ETzogcmVwZWF0IGNsb3NlIGFmdGVyIGVycm9ycworCQkgKi8KKwkJQ1dBUk4oIiVzOiBjbG9zZSBvZiBGSUQgIkRGSUQiIGZhaWxlZCwgZmlsZSByZWZlcmVuY2Ugd2lsbCBiZSBkcm9wcGVkIHdoZW4gdGhpcyBjbGllbnQgdW5tb3VudHMgb3IgaXMgZXZpY3RlZFxuIiwKKwkJICAgICAgb2JkLT5vYmRfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSkpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gcHRscnBjX3JlcXVlc3RfcGFjayhyZXEsIExVU1RSRV9NRFNfVkVSU0lPTiwgTURTX0NMT1NFKTsKKwlpZiAocmMpIHsKKwkJcHRscnBjX3JlcXVlc3RfZnJlZShyZXEpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFRvIGF2b2lkIGEgbGl2ZWxvY2sgKGJ1ZyA3MDM0KSwgd2UgbmVlZCB0byBzZW5kIENMT1NFIFJQQ3MgdG8gYQorCSAqIHBvcnRhbCB3aG9zZSB0aHJlYWRzIGFyZSBub3QgdGFraW5nIGFueSBETE0gbG9ja3MgYW5kIGFyZSB0aGVyZWZvcmUKKwkgKiBhbHdheXMgcHJvZ3Jlc3NpbmcKKwkgKi8KKwlyZXEtPnJxX3JlcXVlc3RfcG9ydGFsID0gTURTX1JFQURQQUdFX1BPUlRBTDsKKwlwdGxycGNfYXRfc2V0X3JlcV90aW1lb3V0KHJlcSk7CiAKIAltZGNfY2xvc2VfcGFjayhyZXEsIG9wX2RhdGEpOwogCkBAIC04NTQsNiArODQ3LDcgQEAKIAkJfQogCX0KIAorb3V0OgogCWlmIChtb2QpIHsKIAkJaWYgKHJjICE9IDApCiAJCQltb2QtPm1vZF9jbG9zZV9yZXEgPSBOVUxMOwpAQCAtOTM2LDE2ICs5MzAsMTcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgbWRjX3JlYWRwYWdlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLAotCQkJc3RydWN0IHBhZ2UgKipwYWdlcywgc3RydWN0IHB0bHJwY19yZXF1ZXN0ICoqcmVxdWVzdCkKK3N0YXRpYyBpbnQgbWRjX2dldHBhZ2Uoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgY29uc3Qgc3RydWN0IGx1X2ZpZCAqZmlkLAorCQkgICAgICAgdTY0IG9mZnNldCwgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IG5wYWdlcywKKwkJICAgICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqKnJlcXVlc3QpCiB7Ci0Jc3RydWN0IHB0bHJwY19yZXF1ZXN0ICAgKnJlcTsKIAlzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYzsKLQlpbnQJCSAgICAgIGk7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJICAgICAgd2FpdHE7Ci0JaW50CQkgICAgICByZXNlbmRzID0gMDsKLQlzdHJ1Y3QgbF93YWl0X2luZm8gICAgICAgbHdpOwotCWludAkJICAgICAgcmM7CisJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CisJc3RydWN0IGxfd2FpdF9pbmZvIGx3aTsKKwlpbnQgcmVzZW5kcyA9IDA7CisJaW50IHJjOworCWludCBpOwogCiAJKnJlcXVlc3QgPSBOVUxMOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndhaXRxKTsKQEAgLTk2NCw3ICs5NTksNyBAQAogCXJlcS0+cnFfcmVxdWVzdF9wb3J0YWwgPSBNRFNfUkVBRFBBR0VfUE9SVEFMOwogCXB0bHJwY19hdF9zZXRfcmVxX3RpbWVvdXQocmVxKTsKIAotCWRlc2MgPSBwdGxycGNfcHJlcF9idWxrX2ltcChyZXEsIG9wX2RhdGEtPm9wX25wYWdlcywgMSwgQlVMS19QVVRfU0lOSywKKwlkZXNjID0gcHRscnBjX3ByZXBfYnVsa19pbXAocmVxLCBucGFnZXMsIDEsIEJVTEtfUFVUX1NJTkssCiAJCQkJICAgIE1EU19CVUxLX1BPUlRBTCk7CiAJaWYgKCFkZXNjKSB7CiAJCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKQEAgLTk3MiwxMiArOTY3LDEwIEBACiAJfQogCiAJLyogTkIgcmVxIG5vdyBvd25zIGRlc2MgYW5kIHdpbGwgZnJlZSBpdCB3aGVuIGl0IGdldHMgZnJlZWQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgb3BfZGF0YS0+b3BfbnBhZ2VzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKQogCQlwdGxycGNfcHJlcF9idWxrX3BhZ2VfcGluKGRlc2MsIHBhZ2VzW2ldLCAwLCBQQUdFX1NJWkUpOwogCi0JbWRjX3JlYWRkaXJfcGFjayhyZXEsIG9wX2RhdGEtPm9wX29mZnNldCwKLQkJCSBQQUdFX1NJWkUgKiBvcF9kYXRhLT5vcF9ucGFnZXMsCi0JCQkgJm9wX2RhdGEtPm9wX2ZpZDEpOworCW1kY19yZWFkZGlyX3BhY2socmVxLCBvZmZzZXQsIFBBR0VfU0laRSAqIG5wYWdlcywgZmlkKTsKIAogCXB0bHJwY19yZXF1ZXN0X3NldF9yZXBsZW4ocmVxKTsKIAlyYyA9IHB0bHJwY19xdWV1ZV93YWl0KHJlcSk7CkBAIC05ODgsMTEgKzk4MSwxMiBAQAogCiAJCXJlc2VuZHMrKzsKIAkJaWYgKCFjbGllbnRfc2hvdWxkX3Jlc2VuZChyZXNlbmRzLCAmZXhwLT5leHBfb2JkLT51LmNsaSkpIHsKLQkJCUNFUlJPUigidG9vIG1hbnkgcmVzZW5kIHJldHJpZXMsIHJldHVybmluZyBlcnJvclxuIik7CisJCQlDRVJST1IoIiVzOiB0b28gbWFueSByZXNlbmQgcmV0cmllczogcmMgPSAlZFxuIiwKKwkJCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCAtRUlPKTsKIAkJCXJldHVybiAtRUlPOwogCQl9Ci0JCWx3aSA9IExXSV9USU1FT1VUX0lOVFIoY2ZzX3RpbWVfc2Vjb25kcyhyZXNlbmRzKSwKLQkJCQkgICAgICAgTlVMTCwgTlVMTCwgTlVMTCk7CisJCWx3aSA9IExXSV9USU1FT1VUX0lOVFIoY2ZzX3RpbWVfc2Vjb25kcyhyZXNlbmRzKSwgTlVMTCwgTlVMTCwKKwkJCQkgICAgICAgTlVMTCk7CiAJCWxfd2FpdF9ldmVudCh3YWl0cSwgMCwgJmx3aSk7CiAKIAkJZ290byByZXN0YXJ0X2J1bGs7CkBAIC0xMDA2LDkgKzEwMDAsOSBAQAogCX0KIAogCWlmIChyZXEtPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZCAmIH5MVV9QQUdFX01BU0spIHsKLQkJQ0VSUk9SKCJVbmV4cGVjdGVkICMgYnl0ZXMgdHJhbnNmZXJyZWQ6ICVkICglbGQgZXhwZWN0ZWQpXG4iLAotCQkgICAgICAgcmVxLT5ycV9idWxrLT5iZF9ub2JfdHJhbnNmZXJyZWQsCi0JCSAgICAgICBQQUdFX1NJWkUgKiBvcF9kYXRhLT5vcF9ucGFnZXMpOworCQlDRVJST1IoIiVzOiB1bmV4cGVjdGVkIGJ5dGVzIHRyYW5zZmVycmVkOiAlZCAoJWxkIGV4cGVjdGVkKVxuIiwKKwkJICAgICAgIGV4cC0+ZXhwX29iZC0+b2JkX25hbWUsIHJlcS0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkLAorCQkgICAgICAgUEFHRV9TSVpFICogbnBhZ2VzKTsKIAkJcHRscnBjX3JlcV9maW5pc2hlZChyZXEpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CkBAIC0xMDE3LDYgKzEwMTEsNDUzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG1kY19yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCByZW1vdmUpCit7CisJaWYgKHJlbW92ZSkgeworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWlmIChsaWtlbHkocGFnZS0+bWFwcGluZykpCisJCQl0cnVuY2F0ZV9jb21wbGV0ZV9wYWdlKHBhZ2UtPm1hcHBpbmcsIHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwl9CisJcHV0X3BhZ2UocGFnZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqbWRjX3BhZ2VfbG9jYXRlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBfX3U2NCAqaGFzaCwKKwkJCQkgICAgX191NjQgKnN0YXJ0LCBfX3U2NCAqZW5kLCBpbnQgaGFzaDY0KQoreworCS8qCisJICogQ29tcGxlbWVudCBvZiBoYXNoIGlzIHVzZWQgYXMgYW4gaW5kZXggc28gdGhhdAorCSAqIHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoKSBjYW4gYmUgdXNlZCB0byBmaW5kIGEgcGFnZSB3aXRoIHN0YXJ0aW5nCisJICogaGFzaCBfc21hbGxlcl8gdGhhbiBvbmUgd2UgYXJlIGxvb2tpbmcgZm9yLgorCSAqLworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gaGFzaF94X2luZGV4KCpoYXNoLCBoYXNoNjQpOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBmb3VuZDsKKworCXNwaW5fbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwKCZtYXBwaW5nLT5wYWdlX3RyZWUsCisJCQkJICAgICAgICh2b2lkICoqKSZwYWdlLCBvZmZzZXQsIDEpOworCWlmIChmb3VuZCA+IDAgJiYgIXJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkocGFnZSkpIHsKKwkJc3RydWN0IGx1X2RpcnBhZ2UgKmRwOworCisJCWdldF9wYWdlKHBhZ2UpOworCQlzcGluX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJCS8qCisJCSAqIEluIGNvbnRyYXN0IHRvIGZpbmRfbG9ja19wYWdlKCkgd2UgYXJlIHN1cmUgdGhhdCBkaXJlY3RvcnkKKwkJICogcGFnZSBjYW5ub3QgYmUgdHJ1bmNhdGVkICh3aGlsZSBETE0gbG9jayBpcyBoZWxkKSBhbmQsCisJCSAqIGhlbmNlLCBjYW4gYXZvaWQgcmVzdGFydC4KKwkJICoKKwkJICogSW4gZmFjdCwgcGFnZSBjYW5ub3QgYmUgbG9ja2VkIGhlcmUgYXQgYWxsLCBiZWNhdXNlCisJCSAqIG1kY19yZWFkX3BhZ2VfcmVtb3RlIGRvZXMgc3luY2hyb25vdXMgaW8uCisJCSAqLworCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlkcCA9IGttYXAocGFnZSk7CisJCQlpZiAoQklUU19QRVJfTE9ORyA9PSAzMiAmJiBoYXNoNjQpIHsKKwkJCQkqc3RhcnQgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfc3RhcnQpID4+IDMyOworCQkJCSplbmQgICA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpID4+IDMyOworCQkJCSpoYXNoICA9ICpoYXNoID4+IDMyOworCQkJfSBlbHNlIHsKKwkJCQkqc3RhcnQgPSBsZTY0X3RvX2NwdShkcC0+bGRwX2hhc2hfc3RhcnQpOworCQkJCSplbmQgICA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpOworCQkJfQorCQkJaWYgKHVubGlrZWx5KCpzdGFydCA9PSAxICYmICpoYXNoID09IDApKQorCQkJCSpoYXNoID0gKnN0YXJ0OworCQkJZWxzZQorCQkJCUxBU1NFUlRGKCpzdGFydCA8PSAqaGFzaCwgInN0YXJ0ID0gJSNsbHgsZW5kID0gJSNsbHgsaGFzaCA9ICUjbGx4XG4iLAorCQkJCQkgKnN0YXJ0LCAqZW5kLCAqaGFzaCk7CisJCQlDREVCVUcoRF9WRlNUUkFDRSwgIm9mZnNldCAlbHggWyUjbGx4ICUjbGx4XSwgaGFzaCAlI2xseFxuIiwKKwkJCSAgICAgICBvZmZzZXQsICpzdGFydCwgKmVuZCwgKmhhc2gpOworCQkJaWYgKCpoYXNoID4gKmVuZCkgeworCQkJCWt1bm1hcChwYWdlKTsKKwkJCQltZGNfcmVsZWFzZV9wYWdlKHBhZ2UsIDApOworCQkJCXBhZ2UgPSBOVUxMOworCQkJfSBlbHNlIGlmICgqZW5kICE9ICpzdGFydCAmJiAqaGFzaCA9PSAqZW5kKSB7CisJCQkJLyoKKwkJCQkgKiB1cG9uIGhhc2ggY29sbGlzaW9uLCByZW1vdmUgdGhpcyBwYWdlLAorCQkJCSAqIG90aGVyd2lzZSBwdXQgcGFnZSByZWZlcmVuY2UsIGFuZAorCQkJCSAqIG1kY19yZWFkX3BhZ2VfcmVtb3RlKCkgd2lsbCBpc3N1ZSBSUEMgdG8KKwkJCQkgKiBmZXRjaCB0aGUgcGFnZSB3ZSB3YW50LgorCQkJCSAqLworCQkJCWt1bm1hcChwYWdlKTsKKwkJCQltZGNfcmVsZWFzZV9wYWdlKHBhZ2UsCisJCQkJCQkgbGUzMl90b19jcHUoZHAtPmxkcF9mbGFncykgJiBMREZfQ09MTElERSk7CisJCQkJcGFnZSA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwdXRfcGFnZShwYWdlKTsKKwkJCXBhZ2UgPSBFUlJfUFRSKC1FSU8pOworCQl9CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCQlwYWdlID0gTlVMTDsKKwl9CisJcmV0dXJuIHBhZ2U7Cit9CisKKy8qCisgKiBBZGp1c3QgYSBzZXQgb2YgcGFnZXMsIGVhY2ggcGFnZSBjb250YWluaW5nIGFuIGFycmF5IG9mIGx1X2RpcnBhZ2VzLAorICogc28gdGhhdCBlYWNoIHBhZ2UgY2FuIGJlIHVzZWQgYXMgYSBzaW5nbGUgbG9naWNhbCBsdV9kaXJwYWdlLgorICoKKyAqIEEgbHVfZGlycGFnZSBpcyBsYWlkIG91dCBhcyBmb2xsb3dzLCB3aGVyZSBzID0gbGRwX2hhc2hfc3RhcnQsCisgKiBlID0gbGRwX2hhc2hfZW5kLCBmID0gbGRwX2ZsYWdzLCBwID0gcGFkZGluZywgYW5kIGVhY2ggImVudCIgaXMgYQorICogc3RydWN0IGx1X2RpcmVudC4gIEl0IGhhcyBzaXplIHVwIHRvIExVX1BBR0VfU0laRS4gVGhlIGxkcF9oYXNoX2VuZAorICogdmFsdWUgaXMgdXNlZCBhcyBhIGNvb2tpZSB0byByZXF1ZXN0IHRoZSBuZXh0IGx1X2RpcnBhZ2UgaW4gYQorICogZGlyZWN0b3J5IGxpc3RpbmcgdGhhdCBzcGFucyBtdWx0aXBsZSBwYWdlcyAodHdvIGluIHRoaXMgZXhhbXBsZSk6CisgKiAgIF9fX19fX19fCisgKiAgfCAgICAgICAgfAorICogLnwtLS0tLS0tLXYtLS0tLS0tICAgLS0tLS0uCisgKiB8c3xlfGZ8cHxlbnR8ZW50fCAuLi4gfGVudHwKKyAqICctLXwtLS0tLS0tLS0tLS0tLSAgIC0tLS0tJyAgIEVhY2ggUEFHRSBjb250YWlucyBhIHNpbmdsZQorICogICAgJy0tLS0tLS4gICAgICAgICAgICAgICAgICAgbHVfZGlycGFnZS4KKyAqIC4tLS0tLS0tLS12LS0tLS0tLSAgIC0tLS0tLgorICogfHN8ZXxmfHB8ZW50fCAwIHwgLi4uIHwgMCB8CisgKiAnLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLScKKyAqCisgKiBIb3dldmVyLCBvbiBob3N0cyB3aGVyZSB0aGUgbmF0aXZlIFZNIHBhZ2Ugc2l6ZSAoUEFHRV9TSVpFKSBpcworICogbGFyZ2VyIHRoYW4gTFVfUEFHRV9TSVpFLCBhIHNpbmdsZSBob3N0IHBhZ2UgbWF5IGNvbnRhaW4gbXVsdGlwbGUKKyAqIGx1X2RpcnBhZ2VzLiBBZnRlciByZWFkaW5nIHRoZSBsdV9kaXJwYWdlcyBmcm9tIHRoZSBNRFMsIHRoZQorICogbGRwX2hhc2hfZW5kIG9mIHRoZSBmaXJzdCBsdV9kaXJwYWdlIHJlZmVycyB0byB0aGUgb25lIGltbWVkaWF0ZWx5CisgKiBhZnRlciBpdCBpbiB0aGUgc2FtZSBQQUdFIChhcnJvd3Mgc2ltcGxpZmllZCBmb3IgYnJldml0eSwgYnV0CisgKiBpbiBnZW5lcmFsIGUwPT1zMSwgZTE9PXMyLCBldGMuKToKKyAqCisgKiAuLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS4KKyAqIHxzMHxlMHxmMHxwfGVudHxlbnR8IC4uLiB8ZW50fAorICogfC0tLXYtLS0tLS0tLS0tLS0tLS0tICAgLS0tLS18CisgKiB8czF8ZTF8ZjF8cHxlbnR8ZW50fCAuLi4gfGVudHwKKyAqIHwtLS12LS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tfCAgSGVyZSwgZWFjaCBQQUdFIGNvbnRhaW5zCisgKiAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgIG11bHRpcGxlIGx1X2RpcnBhZ2VzLgorICogfC0tLXYtLS0tLS0tLS0tLS0tLS0tICAgLS0tLS18CisgKiB8cyd8ZSd8Zid8cHxlbnR8ZW50fCAuLi4gfGVudHwKKyAqICctLS18LS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tJworICogICAgIHYKKyAqIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogfCAgICAgICAgbmV4dCBQQUdFICAgICAgICAgICB8CisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdHJhbnNmb3JtZWQgaW50byBhIHNpbmdsZSBsb2dpY2FsIGx1X2RpcnBhZ2UgYXMgZm9sbG93czoKKyAqCisgKiAtIFJlcGxhY2UgZTAgd2l0aCBlJyBzbyB0aGUgcmVxdWVzdCBmb3IgdGhlIG5leHQgbHVfZGlycGFnZSBnZXRzIHRoZSBwYWdlCisgKiAgIGxhYmVsZWQgJ25leHQgUEFHRScuCisgKgorICogLSBDb3B5IHRoZSBMREZfQ09MTElERSBmbGFnIGZyb20gZicgdG8gZjAgdG8gY29ycmVjdGx5IHJlZmxlY3Qgd2hldGhlcgorICogICBhIGhhc2ggY29sbGlzaW9uIHdpdGggdGhlIG5leHQgcGFnZSBleGlzdHMuCisgKgorICogLSBBZGp1c3QgdGhlIGxkZV9yZWNsZW4gb2YgdGhlIGVuZGluZyBlbnRyeSBvZiBlYWNoIGx1X2RpcnBhZ2UgdG8gc3BhbgorICogICB0byB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIG5leHQgbHVfZGlycGFnZS4KKyAqLworI2lmIFBBR0VfU0laRSA+IExVX1BBR0VfU0laRQorc3RhdGljIHZvaWQgbWRjX2FkanVzdF9kaXJwYWdlcyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgY2ZzX3BncywgaW50IGx1X3BncykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjZnNfcGdzOyBpKyspIHsKKwkJc3RydWN0IGx1X2RpcnBhZ2UgKmRwID0ga21hcChwYWdlc1tpXSk7CisJCV9fdTY0IGhhc2hfZW5kID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCk7CisJCV9fdTMyIGZsYWdzID0gbGUzMl90b19jcHUoZHAtPmxkcF9mbGFncyk7CisJCXN0cnVjdCBsdV9kaXJwYWdlICpmaXJzdCA9IGRwOworCQlzdHJ1Y3QgbHVfZGlyZW50ICplbmRfZGlyZW50ID0gTlVMTDsKKwkJc3RydWN0IGx1X2RpcmVudCAqZW50OworCisJCXdoaWxlICgtLWx1X3BncyA+IDApIHsKKwkJCWVudCA9IGx1X2RpcmVudF9zdGFydChkcCk7CisJCQlmb3IgKGVuZF9kaXJlbnQgPSBlbnQ7IGVudDsKKwkJCSAgICAgZW5kX2RpcmVudCA9IGVudCwgZW50ID0gbHVfZGlyZW50X25leHQoZW50KSk7CisKKwkJCS8qIEFkdmFuY2UgZHAgdG8gbmV4dCBsdV9kaXJwYWdlLiAqLworCQkJZHAgPSAoc3RydWN0IGx1X2RpcnBhZ2UgKikoKGNoYXIgKilkcCArIExVX1BBR0VfU0laRSk7CisKKwkJCS8qIENoZWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgQ0ZTX1BBR0UuICovCisJCQlpZiAoISgodW5zaWduZWQgbG9uZylkcCAmIH5QQUdFX01BU0spKQorCQkJCWJyZWFrOworCisJCQkvKiBTYXZlIHRoZSBoYXNoIGFuZCBmbGFncyBvZiB0aGlzIGx1X2RpcnBhZ2UuICovCisJCQloYXNoX2VuZCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9lbmQpOworCQkJZmxhZ3MgPSBsZTMyX3RvX2NwdShkcC0+bGRwX2ZsYWdzKTsKKworCQkJLyogQ2hlY2sgaWYgbHVfZGlycGFnZSBjb250YWlucyBubyBlbnRyaWVzLiAqLworCQkJaWYgKCFlbmRfZGlyZW50KQorCQkJCWJyZWFrOworCisJCQkvKgorCQkJICogRW5sYXJnZSB0aGUgZW5kIGVudHJ5IGxkZV9yZWNsZW4gZnJvbSAwIHRvCisJCQkgKiBmaXJzdCBlbnRyeSBvZiBuZXh0IGx1X2RpcnBhZ2UuCisJCQkgKi8KKwkJCUxBU1NFUlQoIWxlMTZfdG9fY3B1KGVuZF9kaXJlbnQtPmxkZV9yZWNsZW4pKTsKKwkJCWVuZF9kaXJlbnQtPmxkZV9yZWNsZW4gPQorCQkJCWNwdV90b19sZTE2KChjaGFyICopKGRwLT5sZHBfZW50cmllcykgLQorCQkJCQkgICAgKGNoYXIgKillbmRfZGlyZW50KTsKKwkJfQorCisJCWZpcnN0LT5sZHBfaGFzaF9lbmQgPSBoYXNoX2VuZDsKKwkJZmlyc3QtPmxkcF9mbGFncyAmPSB+Y3B1X3RvX2xlMzIoTERGX0NPTExJREUpOworCQlmaXJzdC0+bGRwX2ZsYWdzIHw9IGZsYWdzICYgY3B1X3RvX2xlMzIoTERGX0NPTExJREUpOworCisJCWt1bm1hcChwYWdlc1tpXSk7CisJfQorCUxBU1NFUlRGKGx1X3BncyA9PSAwLCAibGVmdCA9ICVkIiwgbHVfcGdzKTsKK30KKyNlbHNlCisjZGVmaW5lIG1kY19hZGp1c3RfZGlycGFnZXMocGFnZXMsIGNmc19wZ3MsIGx1X3BncykgZG8ge30gd2hpbGUgKDApCisjZW5kaWYgIC8qIFBBR0VfU0laRSA+IExVX1BBR0VfU0laRSAqLworCisvKiBwYXJhbWV0ZXJzIGZvciByZWFkZGlyIHBhZ2UgKi8KK3N0cnVjdCByZWFkcGFnZV9wYXJhbSB7CisJc3RydWN0IG1kX29wX2RhdGEJKnJwX21vZDsKKwlfX3U2NAkJCXJwX29mZjsKKwlpbnQJCQlycF9oYXNoNjQ7CisJc3RydWN0IG9iZF9leHBvcnQJKnJwX2V4cDsKKwlzdHJ1Y3QgbWRfY2FsbGJhY2sJKnJwX2NiOworfTsKKworLyoqCisgKiBSZWFkIHBhZ2VzIGZyb20gc2VydmVyLgorICoKKyAqIFBhZ2UgaW4gTURTX1JFQURQQUdFIFJQQyBpcyBwYWNrZWQgaW4gTFVfUEFHRV9TSVpFLCBhbmQgZWFjaCBwYWdlIGNvbnRhaW5zCisgKiBhIGhlYWRlciBsdV9kaXJwYWdlIHdoaWNoIGRlc2NyaWJlcyB0aGUgc3RhcnQvZW5kIGhhc2gsIGFuZCB3aGV0aGVyIHRoaXMKKyAqIHBhZ2UgaXMgZW1wdHkgKGNvbnRhaW5zIG5vIGRpciBlbnRyeSkgb3IgaGFzaCBjb2xsaWRlIHdpdGggbmV4dCBwYWdlLgorICogQWZ0ZXIgY2xpZW50IHJlY2VpdmVzIHJlcGx5LCBzZXZlcmFsIHBhZ2VzIHdpbGwgYmUgaW50ZWdyYXRlZCBpbnRvIGRpciBwYWdlCisgKiBpbiBQQUdFX1NJWkUgKGlmIFBBR0VfU0laRSBncmVhdGVyIHRoYW4gTFVfUEFHRV9TSVpFKSwgYW5kIHRoZQorICogbHVfZGlycGFnZSBmb3IgdGhpcyBpbnRlZ3JhdGVkIHBhZ2Ugd2lsbCBiZSBhZGp1c3RlZC4KKyAqKi8KK3N0YXRpYyBpbnQgbWRjX3JlYWRfcGFnZV9yZW1vdGUodm9pZCAqZGF0YSwgc3RydWN0IHBhZ2UgKnBhZ2UwKQoreworCXN0cnVjdCByZWFkcGFnZV9wYXJhbSAqcnAgPSBkYXRhOworCXN0cnVjdCBwYWdlICoqcGFnZV9wb29sOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKKwlpbnQgcmRfcGdzID0gMDsgLyogbnVtYmVyIG9mIHBhZ2VzIHJlYWQgYWN0dWFsbHkgKi8KKwlpbnQgbnBhZ2VzOworCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhID0gcnAtPnJwX21vZDsKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcTsKKwlpbnQgbWF4X3BhZ2VzID0gb3BfZGF0YS0+b3BfbWF4X3BhZ2VzOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGx1X2ZpZCAqZmlkOworCWludCBpOworCWludCByYzsKKworCUxBU1NFUlQobWF4X3BhZ2VzID4gMCAmJiBtYXhfcGFnZXMgPD0gUFRMUlBDX01BWF9CUldfUEFHRVMpOworCWlub2RlID0gb3BfZGF0YS0+b3BfZGF0YTsKKwlmaWQgPSAmb3BfZGF0YS0+b3BfZmlkMTsKKwlMQVNTRVJUKGlub2RlKTsKKworCXBhZ2VfcG9vbCA9IGtjYWxsb2MobWF4X3BhZ2VzLCBzaXplb2YocGFnZSksIEdGUF9OT0ZTKTsKKwlpZiAocGFnZV9wb29sKSB7CisJCXBhZ2VfcG9vbFswXSA9IHBhZ2UwOworCX0gZWxzZSB7CisJCXBhZ2VfcG9vbCA9ICZwYWdlMDsKKwkJbWF4X3BhZ2VzID0gMTsKKwl9CisKKwlmb3IgKG5wYWdlcyA9IDE7IG5wYWdlcyA8IG1heF9wYWdlczsgbnBhZ2VzKyspIHsKKwkJcGFnZSA9IHBhZ2VfY2FjaGVfYWxsb2NfY29sZChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJaWYgKCFwYWdlKQorCQkJYnJlYWs7CisJCXBhZ2VfcG9vbFtucGFnZXNdID0gcGFnZTsKKwl9CisKKwlyYyA9IG1kY19nZXRwYWdlKHJwLT5ycF9leHAsIGZpZCwgcnAtPnJwX29mZiwgcGFnZV9wb29sLCBucGFnZXMsICZyZXEpOworCWlmICghcmMpIHsKKwkJaW50IGx1X3BncyA9IHJlcS0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkOworCisJCXJkX3BncyA9IChyZXEtPnJxX2J1bGstPmJkX25vYl90cmFuc2ZlcnJlZCArCisJCQkgIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJCWx1X3BncyA+Pj0gTFVfUEFHRV9TSElGVDsKKwkJTEFTU0VSVCghKHJlcS0+cnFfYnVsay0+YmRfbm9iX3RyYW5zZmVycmVkICYgfkxVX1BBR0VfTUFTSykpOworCisJCUNERUJVRyhEX0lOT0RFLCAicmVhZCAlZCglZCkgcGFnZXNcbiIsIHJkX3BncywgbHVfcGdzKTsKKworCQltZGNfYWRqdXN0X2RpcnBhZ2VzKHBhZ2VfcG9vbCwgcmRfcGdzLCBsdV9wZ3MpOworCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlMCk7CisJfQorCisJdW5sb2NrX3BhZ2UocGFnZTApOworCXB0bHJwY19yZXFfZmluaXNoZWQocmVxKTsKKwlDREVCVUcoRF9DQUNIRSwgInJlYWQgJWQvJWQgcGFnZXNcbiIsIHJkX3BncywgbnBhZ2VzKTsKKwlmb3IgKGkgPSAxOyBpIDwgbnBhZ2VzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJCV9fdTY0IGhhc2g7CisJCWludCByZXQ7CisKKwkJcGFnZSA9IHBhZ2VfcG9vbFtpXTsKKworCQlpZiAocmMgPCAwIHx8IGkgPj0gcmRfcGdzKSB7CisJCQlwdXRfcGFnZShwYWdlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCisJCWRwID0ga21hcChwYWdlKTsKKwkJaGFzaCA9IGxlNjRfdG9fY3B1KGRwLT5sZHBfaGFzaF9zdGFydCk7CisJCWt1bm1hcChwYWdlKTsKKworCQlvZmZzZXQgPSBoYXNoX3hfaW5kZXgoaGFzaCwgcnAtPnJwX2hhc2g2NCk7CisKKwkJcHJlZmV0Y2h3KCZwYWdlLT5mbGFncyk7CisJCXJldCA9IGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBpbm9kZS0+aV9tYXBwaW5nLCBvZmZzZXQsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZXQpCisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJZWxzZQorCQkJQ0RFQlVHKERfVkZTVFJBQ0UsICJwYWdlICVsdSBhZGQgdG8gcGFnZSBjYWNoZSBmYWlsZWQ6IHJjID0gJWRcbiIsCisJCQkgICAgICAgb2Zmc2V0LCByZXQpOworCQlwdXRfcGFnZShwYWdlKTsKKwl9CisKKwlpZiAocGFnZV9wb29sICE9ICZwYWdlMCkKKwkJa2ZyZWUocGFnZV9wb29sKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBSZWFkIGRpciBwYWdlIGZyb20gY2FjaGUgZmlyc3QsIGlmIGl0IGNhbiBub3QgZmluZCBpdCwgcmVhZCBpdCBmcm9tCisgKiBzZXJ2ZXIgYW5kIGFkZCBpbnRvIHRoZSBjYWNoZS4KKyAqCisgKiBccGFyYW1baW5dIGV4cAlNREMgZXhwb3J0CisgKiBccGFyYW1baW5dIG9wX2RhdGEJY2xpZW50IE1EIHN0YWNrIHBhcmFtZXRlcnMsIHRyYW5zZmVycmluZyBwYXJhbWV0ZXJzCisgKgkJCWJldHdlZW4gZGlmZmVyZW50IGxheWVycyBvbiBjbGllbnQgTUQgc3RhY2suCisgKiBccGFyYW1baW5dIGNiX29wCWNhbGxiYWNrIHJlcXVpcmVkIGZvciBsZGxtIGxvY2sgZW5xdWV1ZSBkdXJpbmcKKyAqCQkJcmVhZCBwYWdlCisgKiBccGFyYW1baW5dIGhhc2hfb2Zmc2V0IHRoZSBoYXNoIG9mZnNldCBvZiB0aGUgcGFnZSB0byBiZSByZWFkCisgKiBccGFyYW1baW5dIHBwYWdlCXRoZSBwYWdlIHRvIGJlIHJlYWQKKyAqCisgKiByZXR2YWwJCT0gMCBnZXQgdGhlIHBhZ2Ugc3VjY2Vzc2Z1bGx5CisgKgkJCWVycm5vKDwwKSBnZXQgdGhlIHBhZ2UgZmFpbGVkCisgKi8KK3N0YXRpYyBpbnQgbWRjX3JlYWRfcGFnZShzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSwKKwkJCSBzdHJ1Y3QgbWRfY2FsbGJhY2sgKmNiX29wLCBfX3U2NCBoYXNoX29mZnNldCwKKwkJCSBzdHJ1Y3QgcGFnZSAqKnBwYWdlKQoreworCXN0cnVjdCBsb29rdXBfaW50ZW50IGl0ID0geyAuaXRfb3AgPSBJVF9SRUFERElSIH07CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGlub2RlICpkaXIgPSBvcF9kYXRhLT5vcF9kYXRhOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBsdV9kaXJwYWdlICpkcDsKKwlfX3U2NCBzdGFydCA9IDA7CisJX191NjQgZW5kID0gMDsKKwlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSBsb2NraDsKKwlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKmVucV9yZXEgPSBOVUxMOworCXN0cnVjdCByZWFkcGFnZV9wYXJhbSBycF9wYXJhbTsKKwlpbnQgcmM7CisKKwkqcHBhZ2UgPSBOVUxMOworCisJTEFTU0VSVChkaXIpOworCW1hcHBpbmcgPSBkaXItPmlfbWFwcGluZzsKKworCXJjID0gbWRjX2ludGVudF9sb2NrKGV4cCwgb3BfZGF0YSwgJml0LCAmZW5xX3JlcSwKKwkJCSAgICAgY2Jfb3AtPm1kX2Jsb2NraW5nX2FzdCwgMCk7CisJaWYgKGVucV9yZXEpCisJCXB0bHJwY19yZXFfZmluaXNoZWQoZW5xX3JlcSk7CisKKwlpZiAocmMgPCAwKSB7CisJCUNFUlJPUigiJXM6ICJERklEIiBsb2NrIGVucXVldWUgZmFpbHM6IHJjID0gJWRcbiIsCisJCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSAwOworCWxvY2toLmNvb2tpZSA9IGl0Lml0X2xvY2tfaGFuZGxlOworCW1kY19zZXRfbG9ja19kYXRhKGV4cCwgJmxvY2toLCBkaXIsIE5VTEwpOworCisJcnBfcGFyYW0ucnBfb2ZmID0gaGFzaF9vZmZzZXQ7CisJcnBfcGFyYW0ucnBfaGFzaDY0ID0gb3BfZGF0YS0+b3BfY2xpX2ZsYWdzICYgQ0xJX0hBU0g2NDsKKwlwYWdlID0gbWRjX3BhZ2VfbG9jYXRlKG1hcHBpbmcsICZycF9wYXJhbS5ycF9vZmYsICZzdGFydCwgJmVuZCwKKwkJCSAgICAgICBycF9wYXJhbS5ycF9oYXNoNjQpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJQ0RFQlVHKERfSU5GTywgIiVzOiBkaXIgcGFnZSBsb2NhdGU6ICIgREZJRCAiIGF0ICVsbHU6IHJjICVsZFxuIiwKKwkJICAgICAgIGV4cC0+ZXhwX29iZC0+b2JkX25hbWUsIFBGSUQoJm9wX2RhdGEtPm9wX2ZpZDEpLAorCQkgICAgICAgcnBfcGFyYW0ucnBfb2ZmLCBQVFJfRVJSKHBhZ2UpKTsKKwkJcmMgPSBQVFJfRVJSKHBhZ2UpOworCQlnb3RvIG91dF91bmxvY2s7CisJfSBlbHNlIGlmIChwYWdlKSB7CisJCS8qCisJCSAqIFhYWCBuaWtpdGE6IG5vdCBlbnRpcmVseSBjb3JyZWN0IGhhbmRsaW5nIG9mIGEgY29ybmVyIGNhc2U6CisJCSAqIHN1cHBvc2UgaGFzaCBjaGFpbiBvZiBlbnRyaWVzIHdpdGggaGFzaCB2YWx1ZSBIQVNIIGNyb3NzZXMKKwkJICogYm9yZGVyIGJldHdlZW4gcGFnZXMgUDAgYW5kIFAxLiBGaXJzdCBib3RoIFAwIGFuZCBQMSBhcmUKKwkJICogY2FjaGVkLCBzZWVrZGlyKCkgaXMgY2FsbGVkIGZvciBzb21lIGVudHJ5IGZyb20gdGhlIFAwIHBhcnQKKwkJICogb2YgdGhlIGNoYWluLiBMYXRlciBQMCBnb2VzIG91dCBvZiBjYWNoZS4gdGVsbGRpcihIQVNIKQorCQkgKiBoYXBwZW5zIGFuZCBmaW5kcyBQMSwgYXMgaXQgc3RhcnRzIHdpdGggbWF0Y2hpbmcgaGFzaAorCQkgKiB2YWx1ZS4gUmVtYWluaW5nIGVudHJpZXMgZnJvbSBQMCBwYXJ0IG9mIHRoZSBjaGFpbiBhcmUKKwkJICogc2tpcHBlZC4gKElzIHRoYXQgcmVhbGx5IGEgYnVnPykKKwkJICoKKwkJICogUG9zc2libGUgc29sdXRpb25zOiAwLiBkb24ndCBjYWNoZSBQMSBpcyBzdWNoIGNhc2UsIGhhbmRsZQorCQkgKiBpdCBhcyBhbiAib3ZlcmZsb3ciIHBhZ2UuIDEuIGludmFsaWRhdGUgYWxsIHBhZ2VzIGF0CisJCSAqIG9uY2UuIDIuIHVzZSBIQVNIfDEgYXMgYW4gaW5kZXggZm9yIFAxLgorCQkgKi8KKwkJZ290byBoYXNoX2NvbGxpc2lvbjsKKwl9CisKKwlycF9wYXJhbS5ycF9leHAgPSBleHA7CisJcnBfcGFyYW0ucnBfbW9kID0gb3BfZGF0YTsKKwlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsCisJCQkgICAgICAgaGFzaF94X2luZGV4KHJwX3BhcmFtLnJwX29mZiwKKwkJCQkJICAgIHJwX3BhcmFtLnJwX2hhc2g2NCksCisJCQkgICAgICAgbWRjX3JlYWRfcGFnZV9yZW1vdGUsICZycF9wYXJhbSk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQlDRVJST1IoIiVzOiByZWFkIGNhY2hlIHBhZ2U6ICJERklEIiBhdCAlbGx1OiByYyAlbGRcbiIsCisJCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKKwkJICAgICAgIHJwX3BhcmFtLnJwX29mZiwgUFRSX0VSUihwYWdlKSk7CisJCXJjID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJKHZvaWQpa21hcChwYWdlKTsKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQlDRVJST1IoIiVzOiBwYWdlIG5vdCB1cGRhdGVkOiAiREZJRCIgYXQgJWxsdTogcmMgJWRcbiIsCisJCSAgICAgICBleHAtPmV4cF9vYmQtPm9iZF9uYW1lLCBQRklEKCZvcF9kYXRhLT5vcF9maWQxKSwKKwkJICAgICAgIHJwX3BhcmFtLnJwX29mZiwgLTUpOworCQlnb3RvIGZhaWw7CisJfQorCWlmICghUGFnZUNoZWNrZWQocGFnZSkpCisJCVNldFBhZ2VDaGVja2VkKHBhZ2UpOworCWlmIChQYWdlRXJyb3IocGFnZSkpIHsKKwkJQ0VSUk9SKCIlczogcGFnZSBlcnJvcjogIkRGSUQiIGF0ICVsbHU6IHJjICVkXG4iLAorCQkgICAgICAgZXhwLT5leHBfb2JkLT5vYmRfbmFtZSwgUEZJRCgmb3BfZGF0YS0+b3BfZmlkMSksCisJCSAgICAgICBycF9wYXJhbS5ycF9vZmYsIC01KTsKKwkJZ290byBmYWlsOworCX0KKworaGFzaF9jb2xsaXNpb246CisJZHAgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIgJiYgcnBfcGFyYW0ucnBfaGFzaDY0KSB7CisJCXN0YXJ0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KSA+PiAzMjsKKwkJZW5kID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCkgPj4gMzI7CisJCXJwX3BhcmFtLnJwX29mZiA9IGhhc2hfb2Zmc2V0ID4+IDMyOworCX0gZWxzZSB7CisJCXN0YXJ0ID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KTsKKwkJZW5kID0gbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCk7CisJCXJwX3BhcmFtLnJwX29mZiA9IGhhc2hfb2Zmc2V0OworCX0KKwlpZiAoZW5kID09IHN0YXJ0KSB7CisJCUxBU1NFUlQoc3RhcnQgPT0gcnBfcGFyYW0ucnBfb2ZmKTsKKwkJQ1dBUk4oIlBhZ2Utd2lkZSBoYXNoIGNvbGxpc2lvbjogJSNseFxuIiwgKHVuc2lnbmVkIGxvbmcpZW5kKTsKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJCUNXQVJOKCJSZWFsIHBhZ2Utd2lkZSBoYXNoIGNvbGxpc2lvbiBhdCBbJWxsdSAlbGx1XSB3aXRoIGhhc2ggJWxsdVxuIiwKKwkJICAgICAgbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX3N0YXJ0KSwKKwkJICAgICAgbGU2NF90b19jcHUoZHAtPmxkcF9oYXNoX2VuZCksIGhhc2hfb2Zmc2V0KTsKKyNlbmRpZgorCQkvKgorCQkgKiBGZXRjaCB3aG9sZSBvdmVyZmxvdyBjaGFpbi4uLgorCQkgKgorCQkgKiBYWFggbm90IHlldC4KKwkJICovCisJCWdvdG8gZmFpbDsKKwl9CisJKnBwYWdlID0gcGFnZTsKK291dF91bmxvY2s6CisJbGRsbV9sb2NrX2RlY3JlZigmbG9ja2gsIGl0Lml0X2xvY2tfbW9kZSk7CisJcmV0dXJuIHJjOworZmFpbDoKKwlrdW5tYXAocGFnZSk7CisJbWRjX3JlbGVhc2VfcGFnZShwYWdlLCAxKTsKKwlyYyA9IC1FSU87CisJZ290byBvdXRfdW5sb2NrOworfQorCiBzdGF0aWMgaW50IG1kY19zdGF0ZnMoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkgICAgICBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLCBzdHJ1Y3Qgb2JkX3N0YXRmcyAqb3NmcywKIAkJICAgICAgX191NjQgbWF4X2FnZSwgX191MzIgZmxhZ3MpCkBAIC0xNDAxLDcgKzE4NDIsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHN0cnVjdCBrdWNfaGRyICpjaGFuZ2Vsb2dfa3VjX2hkcihjaGFyICpidWYsIGludCBsZW4sIGludCBmbGFncykKK3N0YXRpYyBzdHJ1Y3Qga3VjX2hkciAqY2hhbmdlbG9nX2t1Y19oZHIoY2hhciAqYnVmLCBzaXplX3QgbGVuLCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IGt1Y19oZHIgKmxoID0gKHN0cnVjdCBrdWNfaGRyICopYnVmOwogCkBAIC0xNDE1LDQwICsxODU2LDQ0IEBACiAJcmV0dXJuIGxoOwogfQogCi0jZGVmaW5lIERfQ0hBTkdFTE9HIDAKLQogc3RydWN0IGNoYW5nZWxvZ19zaG93IHsKIAlfX3U2NAkJY3Nfc3RhcnRyZWM7Ci0JX191MzIJCWNzX2ZsYWdzOworCWVudW0gY2hhbmdlbG9nX3NlbmRfZmxhZwljc19mbGFnczsKIAlzdHJ1Y3QgZmlsZQkqY3NfZnA7CiAJY2hhcgkJKmNzX2J1ZjsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqY3Nfb2JkOwogfTsKIAorc3RhdGljIGlubGluZSBjaGFyICpjc19vYmRfbmFtZShzdHJ1Y3QgY2hhbmdlbG9nX3Nob3cgKmNzKQoreworCXJldHVybiBjcy0+Y3Nfb2JkLT5vYmRfbmFtZTsKK30KKwogc3RhdGljIGludCBjaGFuZ2Vsb2dfa2t1Y19jYihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsbG9nX2hhbmRsZSAqbGxoLAogCQkJICAgICBzdHJ1Y3QgbGxvZ19yZWNfaGRyICpoZHIsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNoYW5nZWxvZ19zaG93ICpjcyA9IGRhdGE7CiAJc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYyAqcmVjID0gKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMgKiloZHI7CiAJc3RydWN0IGt1Y19oZHIgKmxoOwotCWludCBsZW4sIHJjOworCXNpemVfdCBsZW47CisJaW50IHJjOwogCiAJaWYgKHJlYy0+Y3JfaGRyLmxyaF90eXBlICE9IENIQU5HRUxPR19SRUMpIHsKIAkJcmMgPSAtRUlOVkFMOwogCQlDRVJST1IoIiVzOiBub3QgYSBjaGFuZ2Vsb2cgcmVjICV4LyVkOiByYyA9ICVkXG4iLAotCQkgICAgICAgY3MtPmNzX29iZC0+b2JkX25hbWUsIHJlYy0+Y3JfaGRyLmxyaF90eXBlLAorCQkgICAgICAgY3Nfb2JkX25hbWUoY3MpLCByZWMtPmNyX2hkci5scmhfdHlwZSwKIAkJICAgICAgIHJlYy0+Y3IuY3JfdHlwZSwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCiAJaWYgKHJlYy0+Y3IuY3JfaW5kZXggPCBjcy0+Y3Nfc3RhcnRyZWMpIHsKIAkJLyogU2tpcCBlbnRyaWVzIGVhcmxpZXIgdGhhbiB3aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluICovCi0JCUNERUJVRyhEX0NIQU5HRUxPRywgInJlYz0lbGx1IHN0YXJ0PSVsbHVcbiIsCisJCUNERUJVRyhEX0hTTSwgInJlYz0lbGx1IHN0YXJ0PSVsbHVcbiIsCiAJCSAgICAgICByZWMtPmNyLmNyX2luZGV4LCBjcy0+Y3Nfc3RhcnRyZWMpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlDREVCVUcoRF9DSEFOR0VMT0csICIlbGx1ICUwMmQlLTVzICVsbHUgMHgleCB0PSJERklEIiBwPSJERklECisJQ0RFQlVHKERfSFNNLCAiJWxsdSAlMDJkJS01cyAlbGx1IDB4JXggdD0iIERGSUQgIiBwPSIgREZJRAogCQkiICUuKnNcbiIsIHJlYy0+Y3IuY3JfaW5kZXgsIHJlYy0+Y3IuY3JfdHlwZSwKIAkJY2hhbmdlbG9nX3R5cGUyc3RyKHJlYy0+Y3IuY3JfdHlwZSksIHJlYy0+Y3IuY3JfdGltZSwKIAkJcmVjLT5jci5jcl9mbGFncyAmIENMRl9GTEFHTUFTSywKQEAgLTE0NjIsMjAgKzE5MDcsMjEgQEAKIAltZW1jcHkobGggKyAxLCAmcmVjLT5jciwgbGVuIC0gc2l6ZW9mKCpsaCkpOwogCiAJcmMgPSBsaWJjZnNfa2t1Y19tc2dfcHV0KGNzLT5jc19mcCwgbGgpOwotCUNERUJVRyhEX0NIQU5HRUxPRywgImt1Y21zZyBmcCAlcCBsZW4gJWQgcmMgJWRcbiIsIGNzLT5jc19mcCwgbGVuLCByYyk7CisJQ0RFQlVHKERfSFNNLCAia3VjbXNnIGZwICVwIGxlbiAlenUgcmMgJWRcbiIsIGNzLT5jc19mcCwgbGVuLCByYyk7CiAKIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQgbWRjX2NoYW5nZWxvZ19zZW5kX3RocmVhZCh2b2lkICpjc2RhdGEpCiB7CisJZW51bSBsbG9nX2ZsYWcgZmxhZ3MgPSBMTE9HX0ZfSVNfQ0FUOwogCXN0cnVjdCBjaGFuZ2Vsb2dfc2hvdyAqY3MgPSBjc2RhdGE7CiAJc3RydWN0IGxsb2dfY3R4dCAqY3R4dCA9IE5VTEw7CiAJc3RydWN0IGxsb2dfaGFuZGxlICpsbGggPSBOVUxMOwogCXN0cnVjdCBrdWNfaGRyICprdWNoOwogCWludCByYzsKIAotCUNERUJVRyhEX0NIQU5HRUxPRywgImNoYW5nZWxvZyB0byBmcD0lcCBzdGFydCAlbGx1XG4iLAorCUNERUJVRyhEX0hTTSwgImNoYW5nZWxvZyB0byBmcD0lcCBzdGFydCAlbGx1XG4iLAogCSAgICAgICBjcy0+Y3NfZnAsIGNzLT5jc19zdGFydHJlYyk7CiAKIAljcy0+Y3NfYnVmID0ga3phbGxvYyhLVUNfQ0hBTkdFTE9HX01TR19NQVhTSVpFLCBHRlBfTk9GUyk7CkBAIC0xNDk0LDEwICsxOTQwLDE0IEBACiAJCSAgICAgICBMTE9HX09QRU5fRVhJU1RTKTsKIAlpZiAocmMpIHsKIAkJQ0VSUk9SKCIlczogZmFpbCB0byBvcGVuIGNoYW5nZWxvZyBjYXRhbG9nOiByYyA9ICVkXG4iLAotCQkgICAgICAgY3MtPmNzX29iZC0+b2JkX25hbWUsIHJjKTsKKwkJICAgICAgIGNzX29iZF9uYW1lKGNzKSwgcmMpOwogCQlnb3RvIG91dDsKIAl9Ci0JcmMgPSBsbG9nX2luaXRfaGFuZGxlKE5VTEwsIGxsaCwgTExPR19GX0lTX0NBVCwgTlVMTCk7CisKKwlpZiAoY3MtPmNzX2ZsYWdzICYgQ0hBTkdFTE9HX0ZMQUdfSk9CSUQpCisJCWZsYWdzIHw9IExMT0dfRl9FWFRfSk9CSUQ7CisKKwlyYyA9IGxsb2dfaW5pdF9oYW5kbGUoTlVMTCwgbGxoLCBmbGFncywgTlVMTCk7CiAJaWYgKHJjKSB7CiAJCUNFUlJPUigibGxvZ19pbml0X2hhbmRsZSBmYWlsZWQgJWRcbiIsIHJjKTsKIAkJZ290byBvdXQ7CkBAIC0xNTUwLDEyICsyMDAwLDEyIEBACiAJaWYgKElTX0VSUih0YXNrKSkgewogCQlyYyA9IFBUUl9FUlIodGFzayk7CiAJCUNFUlJPUigiJXM6IGNhbid0IHN0YXJ0IGNoYW5nZWxvZyB0aHJlYWQ6IHJjID0gJWRcbiIsCi0JCSAgICAgICBvYmQtPm9iZF9uYW1lLCByYyk7CisJCSAgICAgICBjc19vYmRfbmFtZShjcyksIHJjKTsKIAkJa2ZyZWUoY3MpOwogCX0gZWxzZSB7CiAJCXJjID0gMDsKLQkJQ0RFQlVHKERfQ0hBTkdFTE9HLCAiJXM6IHN0YXJ0ZWQgY2hhbmdlbG9nIHRocmVhZFxuIiwKLQkJICAgICAgIG9iZC0+b2JkX25hbWUpOworCQlDREVCVUcoRF9IU00sICIlczogc3RhcnRlZCBjaGFuZ2Vsb2cgdGhyZWFkXG4iLAorCQkgICAgICAgY3Nfb2JkX25hbWUoY3MpKTsKIAl9CiAKIAlDRVJST1IoIkZhaWxlZCB0byBzdGFydCBjaGFuZ2Vsb2cgdGhyZWFkOiAlZFxuIiwgcmMpOwpAQCAtMTY2OSw5ICsyMTE5LDExIEBACiAJICogd2l0aCB0aGUgcmVxdWVzdCBSUEMgdG8gYXZvaWQgZXh0cmEgUlBDIHJvdW5kIHRyaXBzCiAJICovCiAJY291bnQgPSBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChleHAsICZvcF9kYXRhLT5vcF9maWQxLCAmY2FuY2VscywKLQkJCQkJTENLX0NSLCBNRFNfSU5PREVMT0NLX0xBWU9VVCk7CisJCQkJCUxDS19DUiwgTURTX0lOT0RFTE9DS19MQVlPVVQgfAorCQkJCQlNRFNfSU5PREVMT0NLX1hBVFRSKTsKIAljb3VudCArPSBtZGNfcmVzb3VyY2VfZ2V0X3VudXNlZChleHAsICZvcF9kYXRhLT5vcF9maWQyLCAmY2FuY2VscywKLQkJCQkJIExDS19DUiwgTURTX0lOT0RFTE9DS19MQVlPVVQpOworCQkJCQkgTENLX0NSLCBNRFNfSU5PREVMT0NLX0xBWU9VVCB8CisJCQkJCSBNRFNfSU5PREVMT0NLX1hBVFRSKTsKIAogCXJlcSA9IHB0bHJwY19yZXF1ZXN0X2FsbG9jKGNsYXNzX2V4cDJjbGlpbXAoZXhwKSwKIAkJCQkgICAmUlFGX01EU19TV0FQX0xBWU9VVFMpOwpAQCAtMTkxNyw3ICsyMzY5LDcgQEAKIHN0YXRpYyB2b2lkIGx1c3RyZV9zd2FiX2hhbChzdHJ1Y3QgaHNtX2FjdGlvbl9saXN0ICpoKQogewogCXN0cnVjdCBoc21fYWN0aW9uX2l0ZW0JKmhhaTsKLQlpbnQJCQkgaTsKKwl1MzIgaTsKIAogCV9fc3dhYjMycygmaC0+aGFsX3ZlcnNpb24pOwogCV9fc3dhYjMycygmaC0+aGFsX2NvdW50KTsKQEAgLTE5NjYsMTQgKzI0MTgsMTQgQEAKICAqIEBwYXJhbSB2YWwgS1VDIG1lc3NhZ2UgKGt1Y19oZHIgKyBoc21fYWN0aW9uX2xpc3QpCiAgKiBAcGFyYW0gbGVuIHRvdGFsIGxlbmd0aCBvZiBtZXNzYWdlCiAgKi8KLXN0YXRpYyBpbnQgbWRjX2hzbV9jb3B5dG9vbF9zZW5kKGludCBsZW4sIHZvaWQgKnZhbCkKK3N0YXRpYyBpbnQgbWRjX2hzbV9jb3B5dG9vbF9zZW5kKHNpemVfdCBsZW4sIHZvaWQgKnZhbCkKIHsKIAlzdHJ1Y3Qga3VjX2hkcgkJKmxoID0gKHN0cnVjdCBrdWNfaGRyICopdmFsOwogCXN0cnVjdCBoc21fYWN0aW9uX2xpc3QJKmhhbCA9IChzdHJ1Y3QgaHNtX2FjdGlvbl9saXN0ICopKGxoICsgMSk7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKCpsaCkgKyBzaXplb2YoKmhhbCkpIHsKLQkJQ0VSUk9SKCJTaG9ydCBIU00gbWVzc2FnZSAlZCA8ICVkXG4iLCBsZW4sCi0JCSAgICAgICAoaW50KShzaXplb2YoKmxoKSArIHNpemVvZigqaGFsKSkpOworCQlDRVJST1IoIlNob3J0IEhTTSBtZXNzYWdlICV6dSA8ICV6dVxuIiwgbGVuLAorCQkgICAgICAgc2l6ZW9mKCpsaCkgKyBzaXplb2YoKmhhbCkpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CiAJaWYgKGxoLT5rdWNfbWFnaWMgPT0gX19zd2FiMTYoS1VDX01BR0lDKSkgewpAQCAtMjA0NCw5ICsyNDk2LDggQEAKIAkJfQogCQlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7CiAKLQkJcmMgPSBkb19zZXRfaW5mb19hc3luYyhpbXAsIE1EU19TRVRfSU5GTywgTFVTVFJFX01EU19WRVJTSU9OLAotCQkJCSAgICAgICBrZXlsZW4sIGtleSwgdmFsbGVuLCB2YWwsIHNldCk7Ci0JCXJldHVybiByYzsKKwkJcmV0dXJuIGRvX3NldF9pbmZvX2FzeW5jKGltcCwgTURTX1NFVF9JTkZPLCBMVVNUUkVfTURTX1ZFUlNJT04sCisJCQkJCSBrZXlsZW4sIGtleSwgdmFsbGVuLCB2YWwsIHNldCk7CiAJfQogCWlmIChLRVlfSVMoS0VZX1NQVExSUENfQ09ORikpIHsKIAkJc3B0bHJwY19jb25mX2NsaWVudF9hZGFwdChleHAtPmV4cF9vYmQpOwpAQCAtMjA2NSw2ICsyNTE2LDEyIEBACiAJCXJjID0gbWRjX2hzbV9jb3B5dG9vbF9zZW5kKHZhbGxlbiwgdmFsKTsKIAkJcmV0dXJuIHJjOwogCX0KKwlpZiAoS0VZX0lTKEtFWV9ERUZBVUxUX0VBU0laRSkpIHsKKwkJdTMyICpkZWZhdWx0X2Vhc2l6ZSA9IHZhbDsKKworCQlleHAtPmV4cF9vYmQtPnUuY2xpLmNsX2RlZmF1bHRfbWRzX2Vhc2l6ZSA9ICpkZWZhdWx0X2Vhc2l6ZTsKKwkJcmV0dXJuIDA7CisJfQogCiAJQ0VSUk9SKCJVbmtub3duIGtleSAlc1xuIiwgKGNoYXIgKilrZXkpOwogCXJldHVybiAtRUlOVkFMOwpAQCAtMjA3NywxOCArMjUzNCwxOCBAQAogCWludCByYyA9IC1FSU5WQUw7CiAKIAlpZiAoS0VZX0lTKEtFWV9NQVhfRUFTSVpFKSkgewotCQlpbnQgbWRzaXplLCAqbWF4X2Vhc2l6ZTsKKwkJdTMyIG1kc2l6ZSwgKm1heF9lYXNpemU7CiAKIAkJaWYgKCp2YWxsZW4gIT0gc2l6ZW9mKGludCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJbWRzaXplID0gKihpbnQgKil2YWw7CisJCW1kc2l6ZSA9ICoodTMyICopdmFsOwogCQlpZiAobWRzaXplID4gZXhwLT5leHBfb2JkLT51LmNsaS5jbF9tYXhfbWRzX2Vhc2l6ZSkKIAkJCWV4cC0+ZXhwX29iZC0+dS5jbGkuY2xfbWF4X21kc19lYXNpemUgPSBtZHNpemU7CiAJCW1heF9lYXNpemUgPSB2YWw7CiAJCSptYXhfZWFzaXplID0gZXhwLT5leHBfb2JkLT51LmNsaS5jbF9tYXhfbWRzX2Vhc2l6ZTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIGlmIChLRVlfSVMoS0VZX0RFRkFVTFRfRUFTSVpFKSkgewotCQlpbnQgKmRlZmF1bHRfZWFzaXplOworCQl1MzIgKmRlZmF1bHRfZWFzaXplOwogCiAJCWlmICgqdmFsbGVuICE9IHNpemVvZihpbnQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMTA1LDcgKzI1NjIsNyBAQAogCQkqZGF0YSA9IGltcC0+aW1wX2Nvbm5lY3RfZGF0YTsKIAkJcmV0dXJuIDA7CiAJfSBlbHNlIGlmIChLRVlfSVMoS0VZX1RHVF9DT1VOVCkpIHsKLQkJKigoaW50ICopdmFsKSA9IDE7CisJCSooKHUzMiAqKXZhbCkgPSAxOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTIxOTksMTMgKzI2NTYsMTMgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBtZGNfZmlkX2FsbG9jKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBsdV9maWQgKmZpZCwKLQkJICBzdHJ1Y3QgbWRfb3BfZGF0YSAqb3BfZGF0YSkKK2ludCBtZGNfZmlkX2FsbG9jKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9iZF9leHBvcnQgKmV4cCwKKwkJICBzdHJ1Y3QgbHVfZmlkICpmaWQsIHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhKQogewogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmZXhwLT5leHBfb2JkLT51LmNsaTsKIAlzdHJ1Y3QgbHVfY2xpZW50X3NlcSAqc2VxID0gY2xpLT5jbF9zZXE7CiAKLQlyZXR1cm4gc2VxX2NsaWVudF9hbGxvY19maWQoTlVMTCwgc2VxLCBmaWQpOworCXJldHVybiBzZXFfY2xpZW50X2FsbG9jX2ZpZChlbnYsIHNlcSwgZmlkKTsKIH0KIAogc3RhdGljIHN0cnVjdCBvYmRfdXVpZCAqbWRjX2dldF91dWlkKHN0cnVjdCBvYmRfZXhwb3J0ICpleHApCkBAIC0yMzMzLDggKzI3OTAsOCBAQAogICogYSBsYXJnZSBudW1iZXIgb2Ygc3RyaXBlcyBpcyBwb3NzaWJsZS4gIElmIGEgbGFyZ2VyIHJlcGx5IGJ1ZmZlciBpcwogICogcmVxdWlyZWQgaXQgd2lsbCBiZSByZWFsbG9jYXRlZCBpbiB0aGUgcHRscnBjIGxheWVyIGR1ZSB0byBvdmVyZmxvdy4KICAqLwotc3RhdGljIGludCBtZGNfaW5pdF9lYV9zaXplKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGludCBlYXNpemUsCi0JCQkgICAgaW50IGRlZl9lYXNpemUsIGludCBjb29raWVzaXplLCBpbnQgZGVmX2Nvb2tpZXNpemUpCitzdGF0aWMgaW50IG1kY19pbml0X2VhX3NpemUoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgdTMyIGVhc2l6ZSwgdTMyIGRlZl9lYXNpemUsCisJCQkgICAgdTMyIGNvb2tpZXNpemUsIHUzMiBkZWZfY29va2llc2l6ZSkKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gZXhwLT5leHBfb2JkOwogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmb2JkLT51LmNsaTsKQEAgLTI0MzAsNyArMjg4Nyw2IEBACiBzdGF0aWMgc3RydWN0IG1kX29wcyBtZGNfbWRfb3BzID0gewogCS5nZXRzdGF0dXMJCT0gbWRjX2dldHN0YXR1cywKIAkubnVsbF9pbm9kZQkJPSBtZGNfbnVsbF9pbm9kZSwKLQkuZmluZF9jYmRhdGEJCT0gbWRjX2ZpbmRfY2JkYXRhLAogCS5jbG9zZQkJCT0gbWRjX2Nsb3NlLAogCS5jcmVhdGUJCQk9IG1kY19jcmVhdGUsCiAJLmRvbmVfd3JpdGluZwkJPSBtZGNfZG9uZV93cml0aW5nLApAQCAtMjQzOSwxMyArMjg5NSwxMiBAQAogCS5nZXRhdHRyX25hbWUJCT0gbWRjX2dldGF0dHJfbmFtZSwKIAkuaW50ZW50X2xvY2sJCT0gbWRjX2ludGVudF9sb2NrLAogCS5saW5rCQkJPSBtZGNfbGluaywKLQkuaXNfc3ViZGlyCQk9IG1kY19pc19zdWJkaXIsCiAJLnJlbmFtZQkJCT0gbWRjX3JlbmFtZSwKIAkuc2V0YXR0cgkJPSBtZGNfc2V0YXR0ciwKIAkuc2V0eGF0dHIJCT0gbWRjX3NldHhhdHRyLAogCS5nZXR4YXR0cgkJPSBtZGNfZ2V0eGF0dHIsCiAJLnN5bmMJCQk9IG1kY19zeW5jLAotCS5yZWFkcGFnZQkJPSBtZGNfcmVhZHBhZ2UsCisJLnJlYWRfcGFnZQkJPSBtZGNfcmVhZF9wYWdlLAogCS51bmxpbmsJCQk9IG1kY191bmxpbmssCiAJLmNhbmNlbF91bnVzZWQJCT0gbWRjX2NhbmNlbF91bnVzZWQsCiAJLmluaXRfZWFfc2l6ZQkJPSBtZGNfaW5pdF9lYV9zaXplLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZ2MvbWdjX3JlcXVlc3QuYwppbmRleCA5ZDBiZDQ3Li4yMzM3NGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZ2MvbWdjX3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZ2MvbWdjX3JlcXVlc3QuYwpAQCAtNTQ5LDggKzU0OSw5IEBACiAJCSAqIGNhdXNlZCB0aGUgbG9jayByZXZvY2F0aW9uIHRvIGZpbmlzaCBpdHMgc2V0dXAsIHBsdXMgc29tZQogCQkgKiByYW5kb20gc28gZXZlcnlvbmUgZG9lc24ndCB0cnkgdG8gcmVjb25uZWN0IGF0IG9uY2UuCiAJCSAqLwotCQl0byA9IE1HQ19USU1FT1VUX01JTl9TRUNPTkRTICogSFo7Ci0JCXRvICs9IHJhbmQgKiBIWiAvIDEwMDsgLyogcmFuZCBpcyBjZW50aS1zZWNvbmRzICovCisJCXRvID0gbXNlY3NfdG9famlmZmllcyhNR0NfVElNRU9VVF9NSU5fU0VDT05EUyAqIE1TRUNfUEVSX1NFQyk7CisJCS8qIHJhbmQgaXMgY2VudGktc2Vjb25kcyAqLworCQl0byArPSBtc2Vjc190b19qaWZmaWVzKHJhbmQgKiBNU0VDX1BFUl9TRUMgLyAxMDApOwogCQlsd2kgPSBMV0lfVElNRU9VVCh0bywgTlVMTCwgTlVMTCk7CiAJCWxfd2FpdF9ldmVudChycV93YWl0cSwgcnFfc3RhdGUgJiAoUlFfU1RPUCB8IFJRX1BSRUNMRUFOVVApLAogCQkJICAgICAmbHdpKTsKQEAgLTExNTgsNyArMTE1OSw3IEBACiAKIAl3aGlsZSAoZGF0YWxlbiA+IDApIHsKIAkJaW50ICAgZW50cnlfbGVuID0gc2l6ZW9mKCplbnRyeSk7Ci0JCWludCAgIGlzX29zdDsKKwkJaW50IGlzX29zdCwgaTsKIAkJc3RydWN0IG9iZF9kZXZpY2UgKm9iZDsKIAkJY2hhciAqb2JkbmFtZTsKIAkJY2hhciAqY25hbWU7CkBAIC0xMjY0LDExICsxMjY1LDE3IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCS8qIFRPRE86IGl0ZXJhdGUgYWxsIG5pZHMgdG8gZmluZCBvbmUgKi8KKwkJLyogaXRlcmF0ZSBhbGwgbmlkcyB0byBmaW5kIG9uZSAqLwogCQkvKiBmaW5kIHV1aWQgYnkgbmlkICovCi0JCXJjID0gY2xpZW50X2ltcG9ydF9maW5kX2Nvbm4ob2JkLT51LmNsaS5jbF9pbXBvcnQsCi0JCQkJCSAgICAgZW50cnktPnUubmlkc1swXSwKLQkJCQkJICAgICAoc3RydWN0IG9iZF91dWlkICopdXVpZCk7CisJCXJjID0gLUVOT0VOVDsKKwkJZm9yIChpID0gMDsgaSA8IGVudHJ5LT5tbmVfbmlkX2NvdW50OyBpKyspIHsKKwkJCXJjID0gY2xpZW50X2ltcG9ydF9maW5kX2Nvbm4ob2JkLT51LmNsaS5jbF9pbXBvcnQsCisJCQkJCQkgICAgIGVudHJ5LT51Lm5pZHNbMF0sCisJCQkJCQkgICAgIChzdHJ1Y3Qgb2JkX3V1aWQgKil1dWlkKTsKKwkJCWlmICghcmMpCisJCQkJYnJlYWs7CisJCX0KKwogCQl1cF9yZWFkKCZvYmQtPnUuY2xpLmNsX3NlbSk7CiAJCWlmIChyYyA8IDApIHsKIAkJCUNFUlJPUigibWdjOiBjYW5ub3QgZmluZCB1dWlkIGJ5IG5pZCAlc1xuIiwKQEAgLTE0MjgsMTQgKzE0MzUsMTIgQEAKIAl9CiAKIAltbmVfc3dhYiA9ICEhcHRscnBjX3JlcF9uZWVkX3N3YWIocmVxKTsKLSNpZiBMVVNUUkVfVkVSU0lPTl9DT0RFIDwgT0JEX09DRF9WRVJTSU9OKDMsIDIsIDUwLCAwKQorI2lmIE9CRF9PQ0RfVkVSU0lPTigzLCAwLCA1MywgMCkgPiBMVVNUUkVfVkVSU0lPTl9DT0RFCiAJLyogVGhpcyBpbXBvcnQgZmxhZyBtZWFucyB0aGUgc2VydmVyIGRpZCBhbiBleHRyYSBzd2FiIG9mIElSIE1ORQogCSAqIHJlY29yZHMgKGZpeGVkIGluIExVLTEyNTIpLCByZXZlcnNlIGl0IGhlcmUgaWYgbmVlZGVkLiBMVS0xNjQ0CiAJICovCiAJaWYgKHVubGlrZWx5KHJlcS0+cnFfaW1wb3J0LT5pbXBfbmVlZF9tbmVfc3dhYikpCiAJCW1uZV9zd2FiID0gIW1uZV9zd2FiOwotI2Vsc2UKLSN3YXJuaW5nICJMVS0xNjQ0OiBSZW1vdmUgb2xkIE9CRF9DT05ORUNUX01ORV9TV0FCIGZpeHVwIGFuZCBpbXBfbmVlZF9tbmVfc3dhYiIKICNlbmRpZgogCiAJZm9yIChpID0gMDsgaSA8IG5ycGFnZXMgJiYgZWFsZW4gPiAwOyBpKyspIHsKQEAgLTE3NDAsOCArMTc0NSw2IEBACiAJLmRlbF9jb25uICAgICAgID0gY2xpZW50X2ltcG9ydF9kZWxfY29ubiwKIAkuY29ubmVjdCAgICAgICAgPSBjbGllbnRfY29ubmVjdF9pbXBvcnQsCiAJLmRpc2Nvbm5lY3QgICAgID0gY2xpZW50X2Rpc2Nvbm5lY3RfZXhwb3J0LAotCS8qIC5lbnF1ZXVlICAgICA9IG1nY19lbnF1ZXVlLCAqLwotCS8qIC5pb2NvbnRyb2wgICA9IG1nY19pb2NvbnRyb2wsICovCiAJLnNldF9pbmZvX2FzeW5jID0gbWdjX3NldF9pbmZvX2FzeW5jLAogCS5nZXRfaW5mbyAgICAgICA9IG1nY19nZXRfaW5mbywKIAkuaW1wb3J0X2V2ZW50ICAgPSBtZ2NfaW1wb3J0X2V2ZW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9NYWtlZmlsZQppbmRleCBkZjdlNDdmLi5iNDJlMTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9NYWtlZmlsZQpAQCAtMyw2ICszLDYgQEAKIG9iZGNsYXNzLXkgOj0gbGludXgvbGludXgtbW9kdWxlLm8gbGludXgvbGludXgtb2Jkby5vIGxpbnV4L2xpbnV4LXN5c2N0bC5vIFwKIAkgICAgICBsbG9nLm8gbGxvZ19jYXQubyBsbG9nX29iZC5vIGxsb2dfc3dhYi5vIGNsYXNzX29iZC5vIGRlYnVnLm8gXAogCSAgICAgIGdlbm9wcy5vIHV1aWQubyBscHJvY2ZzX3N0YXR1cy5vIGxwcm9jZnNfY291bnRlcnMubyBcCi0JICAgICAgbHVzdHJlX2hhbmRsZXMubyBsdXN0cmVfcGVlci5vIHN0YXRmc19wYWNrLm8gXAorCSAgICAgIGx1c3RyZV9oYW5kbGVzLm8gbHVzdHJlX3BlZXIubyBzdGF0ZnNfcGFjay5vIGxpbmtlYS5vIFwKIAkgICAgICBvYmRvLm8gb2JkX2NvbmZpZy5vIG9iZF9tb3VudC5vIGx1X29iamVjdC5vIGx1X3JlZi5vIFwKIAkgICAgICBjbF9vYmplY3QubyBjbF9wYWdlLm8gY2xfbG9jay5vIGNsX2lvLm8ga2VybmVsY29tbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9pby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfaW8uYwppbmRleCBlNzJmMWZjLi5iYzRiN2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX2lvLmMKQEAgLTczLDcgKzczLDYgQEAKIHsKIAlyZXR1cm4gY2xfZW52X2luZm8oZW52KS0+Y2x0X2N1cnJlbnRfaW8gIT0gTlVMTDsKIH0KLUVYUE9SVF9TWU1CT0woY2xfaW9faXNfZ29pbmcpOwogCiAvKioKICAqIGNsX2lvIGludmFyaWFudCB0aGF0IGhvbGRzIGF0IGFsbCB0aW1lcyB3aGVuIGV4cG9ydGVkIGNsX2lvXyooKSBmdW5jdGlvbnMKQEAgLTg1OSw5ICs4NTgsNiBAQAogCUxBU1NFUlQocGFnZS0+Y3Bfb3duZXIpOwogCUxJTlZSTlQocGxpc3QtPnBsX293bmVyID09IGN1cnJlbnQpOwogCi0JbG9ja2RlcF9vZmYoKTsKLQltdXRleF9sb2NrKCZwYWdlLT5jcF9tdXRleCk7Ci0JbG9ja2RlcF9vbigpOwogCUxBU1NFUlQobGlzdF9lbXB0eSgmcGFnZS0+Y3BfYmF0Y2gpKTsKIAlsaXN0X2FkZF90YWlsKCZwYWdlLT5jcF9iYXRjaCwgJnBsaXN0LT5wbF9wYWdlcyk7CiAJKytwbGlzdC0+cGxfbnI7CkBAIC04NzcsMTIgKzg3MywxMCBAQAogCQkgICAgICBzdHJ1Y3QgY2xfcGFnZSAqcGFnZSkKIHsKIAlMQVNTRVJUKHBsaXN0LT5wbF9uciA+IDApOworCUxBU1NFUlQoY2xfcGFnZV9pc192bWxvY2tlZChlbnYsIHBhZ2UpKTsKIAlMSU5WUk5UKHBsaXN0LT5wbF9vd25lciA9PSBjdXJyZW50KTsKIAogCWxpc3RfZGVsX2luaXQoJnBhZ2UtPmNwX2JhdGNoKTsKLQlsb2NrZGVwX29mZigpOwotCW11dGV4X3VubG9jaygmcGFnZS0+Y3BfbXV0ZXgpOwotCWxvY2tkZXBfb24oKTsKIAktLXBsaXN0LT5wbF9ucjsKIAlsdV9yZWZfZGVsX2F0KCZwYWdlLT5jcF9yZWZlcmVuY2UsICZwYWdlLT5jcF9xdWV1ZV9yZWYsICJxdWV1ZSIsIHBsaXN0KTsKIAljbF9wYWdlX3B1dChlbnYsIHBhZ2UpOwpAQCAtOTQxLDggKzkzNSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsX3BhZ2VfbGlzdF9zcGxpY2UpOwogCi12b2lkIGNsX3BhZ2VfZGlzb3duMChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCi0JCSAgICAgc3RydWN0IGNsX2lvICppbywgc3RydWN0IGNsX3BhZ2UgKnBnKTsKIAogLyoqCiAgKiBEaXNvd25zIHBhZ2VzIGluIGEgcXVldWUuCkBAIC05NTksOSArOTUxLDYgQEAKIAkJTEFTU0VSVChwbGlzdC0+cGxfbnIgPiAwKTsKIAogCQlsaXN0X2RlbF9pbml0KCZwYWdlLT5jcF9iYXRjaCk7Ci0JCWxvY2tkZXBfb2ZmKCk7Ci0JCW11dGV4X3VubG9jaygmcGFnZS0+Y3BfbXV0ZXgpOwotCQlsb2NrZGVwX29uKCk7CiAJCS0tcGxpc3QtPnBsX25yOwogCQkvKgogCQkgKiBjbF9wYWdlX2Rpc293bjAgcmF0aGVyIHRoYW4gdXN1YWwgY2xfcGFnZV9kaXNvd24oKSBpcyB1c2VkLApAQCAtMTIyMSw3ICsxMjEwLDcgQEAKIHsKIAlzdHJ1Y3QgY2xfb2JqZWN0ICAqb2JqOwogCXN0cnVjdCBjbF9yZXFfb2JqICpycW87Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAlMQVNTRVJUKGxpc3RfZW1wdHkoJnBhZ2UtPmNwX2ZsaWdodCkpOwogCUxBU1NFUlQoIXBhZ2UtPmNwX3JlcSk7CkBAIC0xMjY4LDcgKzEyNTcsNyBAQAogICovCiBpbnQgY2xfcmVxX3ByZXAoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfcmVxICpyZXEpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAJaW50IHJlc3VsdDsKIAljb25zdCBzdHJ1Y3QgY2xfcmVxX3NsaWNlICpzbGljZTsKIApAQCAtMTMwMSw3ICsxMjkwLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgY2xfcmVxX3NsaWNlICpzbGljZTsKIAlzdHJ1Y3QgY2xfcGFnZQkgICAgKnBhZ2U7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAlMQVNTRVJUKCFsaXN0X2VtcHR5KCZyZXEtPmNycV9wYWdlcykpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX29iamVjdC5jCmluZGV4IDkxYTU4MDYuLjMxOTlkZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX29iamVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX29iamVjdC5jCkBAIC0xNjMsNyArMTYzLDcgQEAKICAqCiAgKiBQcmV2ZW50cyBkYXRhLWF0dHJpYnV0ZXMgZnJvbSBjaGFuZ2luZywgdW50aWwgbG9jayBpcyByZWxlYXNlZCBieQogICogY2xfb2JqZWN0X2F0dHJfdW5sb2NrKCkuIFRoaXMgaGFzIHRvIGJlIGNhbGxlZCBiZWZvcmUgY2FsbHMgdG8KLSAqIGNsX29iamVjdF9hdHRyX2dldCgpLCBjbF9vYmplY3RfYXR0cl9zZXQoKS4KKyAqIGNsX29iamVjdF9hdHRyX2dldCgpLCBjbF9vYmplY3RfYXR0cl91cGRhdGUoKS4KICAqLwogdm9pZCBjbF9vYmplY3RfYXR0cl9sb2NrKHN0cnVjdCBjbF9vYmplY3QgKm8pCiAJX19hY3F1aXJlcyhjbF9vYmplY3RfYXR0cl9ndWFyZChvKSkKQEAgLTIxNywxMSArMjE3LDExIEBACiAgKiBVcGRhdGVzIGRhdGEtYXR0cmlidXRlcyBvZiBhbiBvYmplY3QgXGEgb2JqLgogICoKICAqIE9ubHkgYXR0cmlidXRlcywgbWVudGlvbmVkIGluIGEgdmFsaWRuZXNzIGJpdC1tYXNrIFxhIHYgYXJlCi0gKiB1cGRhdGVkLiBDYWxscyBjbF9vYmplY3Rfb3BlcmF0aW9uczo6Y29vX2F0dHJfc2V0KCkgb24gZXZlcnkgbGF5ZXIsIGJvdHRvbQotICogdG8gdG9wLgorICogdXBkYXRlZC4gQ2FsbHMgY2xfb2JqZWN0X29wZXJhdGlvbnM6OmNvb19hdHRyX3VwZGF0ZSgpIG9uIGV2ZXJ5IGxheWVyLAorICogYm90dG9tIHRvIHRvcC4KICAqLwotaW50IGNsX29iamVjdF9hdHRyX3NldChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCB2KQoraW50IGNsX29iamVjdF9hdHRyX3VwZGF0ZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKKwkJCSAgY29uc3Qgc3RydWN0IGNsX2F0dHIgKmF0dHIsIHVuc2lnbmVkIGludCB2KQogewogCXN0cnVjdCBsdV9vYmplY3RfaGVhZGVyICp0b3A7CiAJaW50IHJlc3VsdDsKQEAgLTIzMSw4ICsyMzEsOSBAQAogCXRvcCA9IG9iai0+Y29fbHUubG9faGVhZGVyOwogCXJlc3VsdCA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKG9iaiwgJnRvcC0+bG9oX2xheWVycywgY29fbHUubG9fbGlua2FnZSkgewotCQlpZiAob2JqLT5jb19vcHMtPmNvb19hdHRyX3NldCkgewotCQkJcmVzdWx0ID0gb2JqLT5jb19vcHMtPmNvb19hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgdik7CisJCWlmIChvYmotPmNvX29wcy0+Y29vX2F0dHJfdXBkYXRlKSB7CisJCQlyZXN1bHQgPSBvYmotPmNvX29wcy0+Y29vX2F0dHJfdXBkYXRlKGVudiwgb2JqLCBhdHRyLAorCQkJCQkJCSAgICAgIHYpOwogCQkJaWYgKHJlc3VsdCAhPSAwKSB7CiAJCQkJaWYgKHJlc3VsdCA+IDApCiAJCQkJCXJlc3VsdCA9IDA7CkBAIC0yNDIsNyArMjQzLDcgQEAKIAl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KLUVYUE9SVF9TWU1CT0woY2xfb2JqZWN0X2F0dHJfc2V0KTsKK0VYUE9SVF9TWU1CT0woY2xfb2JqZWN0X2F0dHJfdXBkYXRlKTsKIAogLyoqCiAgKiBOb3RpZmllcyBsYXllcnMgKGJvdHRvbS10by10b3ApIHRoYXQgZ2xpbXBzZSBBU1Qgd2FzIHJlY2VpdmVkLgpAQCAtMzIxLDYgKzMyMiwyNyBAQAogRVhQT1JUX1NZTUJPTChjbF9vYmplY3RfcHJ1bmUpOwogCiAvKioKKyAqIEdldCBzdHJpcGUgaW5mb3JtYXRpb24gb2YgdGhpcyBvYmplY3QuCisgKi8KK2ludCBjbF9vYmplY3RfZ2V0c3RyaXBlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsX29iamVjdCAqb2JqLAorCQkJc3RydWN0IGxvdl91c2VyX21kIF9fdXNlciAqdWFyZykKK3sKKwlzdHJ1Y3QgbHVfb2JqZWN0X2hlYWRlciAqdG9wOworCWludCByZXN1bHQgPSAwOworCisJdG9wID0gb2JqLT5jb19sdS5sb19oZWFkZXI7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShvYmosICZ0b3AtPmxvaF9sYXllcnMsIGNvX2x1LmxvX2xpbmthZ2UpIHsKKwkJaWYgKG9iai0+Y29fb3BzLT5jb29fZ2V0c3RyaXBlKSB7CisJCQlyZXN1bHQgPSBvYmotPmNvX29wcy0+Y29vX2dldHN0cmlwZShlbnYsIG9iaiwgdWFyZyk7CisJCQlpZiAocmVzdWx0KQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0woY2xfb2JqZWN0X2dldHN0cmlwZSk7CisKKy8qKgogICogSGVscGVyIGZ1bmN0aW9uIHJlbW92aW5nIGFsbCBvYmplY3QgbG9ja3MsIGFuZCBtYXJraW5nIG9iamVjdCBmb3IKICAqIGRlbGV0aW9uLiBBbGwgb2JqZWN0IHBhZ2VzIG11c3QgaGF2ZSBiZWVuIGRlbGV0ZWQgYXQgdGhpcyBwb2ludC4KICAqCkBAIC0zNzcsNyArMzk5LDcgQEAKICAqLwogaW50IGNsX3NpdGVfaW5pdChzdHJ1Y3QgY2xfc2l0ZSAqcywgc3RydWN0IGNsX2RldmljZSAqZCkKIHsKLQlpbnQgaTsKKwlzaXplX3QgaTsKIAlpbnQgcmVzdWx0OwogCiAJcmVzdWx0ID0gbHVfc2l0ZV9pbml0KCZzLT5jc19sdSwgJmQtPmNkX2x1X2Rldik7CkBAIC00MTEsNyArNDMzLDcgQEAKICAqLwogaW50IGNsX3NpdGVfc3RhdHNfcHJpbnQoY29uc3Qgc3RydWN0IGNsX3NpdGUgKnNpdGUsIHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKLQlpbnQgaTsKKwlzaXplX3QgaTsKIAlzdGF0aWMgY29uc3QgY2hhciAqcHN0YXRlW10gPSB7CiAJCVtDUFNfQ0FDSEVEXSAgPSAiYyIsCiAJCVtDUFNfT1dORURdICAgPSAibyIsCkBAIC0xMDAwLDcgKzEwMjIsNyBAQAogCQkgKiB0aHVzIHdlIG11c3QgdW5pbml0aWFsaXplIHVwIHRvIGksIHRoZSByZXN0IGFyZSB1bmRlZmluZWQuCiAJCSAqLwogCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCQljbGUgPSAmY2xfZW52X3BlcmNwdVtpXTsKKwkJCWNsZSA9ICZjbF9lbnZfcGVyY3B1W2pdOwogCQkJbHVfY29udGV4dF9leGl0KCZjbGUtPmNlX3Nlcyk7CiAJCQlsdV9jb250ZXh0X2ZpbmkoJmNsZS0+Y2Vfc2VzKTsKIAkJCWx1X2Vudl9maW5pKCZjbGUtPmNlX2x1KTsKQEAgLTExMjYsNyArMTE0OCw3IEBACiAKIAlpbmZvID0gY2wwX2tleV9pbml0KGN0eCwga2V5KTsKIAlpZiAoIUlTX0VSUihpbmZvKSkgewotCQlpbnQgaTsKKwkJc2l6ZV90IGk7CiAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5mby0+Y2x0X2NvdW50ZXJzKTsgKytpKQogCQkJbHVfcmVmX2luaXQoJmluZm8tPmNsdF9jb3VudGVyc1tpXS5jdGNfbG9ja3NfbG9ja2VkKTsKQEAgLTExMzgsNyArMTE2MCw3IEBACiAJCQlzdHJ1Y3QgbHVfY29udGV4dF9rZXkgKmtleSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgY2xfdGhyZWFkX2luZm8gKmluZm87Ci0JaW50IGk7CisJc2l6ZV90IGk7CiAKIAlpbmZvID0gZGF0YTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbmZvLT5jbHRfY291bnRlcnMpOyArK2kpCkBAIC0xMTUwLDcgKzExNzIsNyBAQAogCQkJc3RydWN0IGx1X2NvbnRleHRfa2V5ICprZXksIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNsX3RocmVhZF9pbmZvICppbmZvID0gZGF0YTsKLQlpbnQgaTsKKwlzaXplX3QgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGluZm8tPmNsdF9jb3VudGVycyk7ICsraSkgewogCQlMQVNTRVJUKGluZm8tPmNsdF9jb3VudGVyc1tpXS5jdGNfbnJfaGVsZCA9PSAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX3BhZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsX3BhZ2UuYwppbmRleCBkYjJkYzZiLi42Mzk3M2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbF9wYWdlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xfcGFnZS5jCkBAIC0xNTEsNyArMTUxLDYgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJnBhZ2UtPmNwX2xheWVycyk7CiAJCUlOSVRfTElTVF9IRUFEKCZwYWdlLT5jcF9iYXRjaCk7CiAJCUlOSVRfTElTVF9IRUFEKCZwYWdlLT5jcF9mbGlnaHQpOwotCQltdXRleF9pbml0KCZwYWdlLT5jcF9tdXRleCk7CiAJCWx1X3JlZl9pbml0KCZwYWdlLT5jcF9yZWZlcmVuY2UpOwogCQloZWFkID0gby0+Y29fbHUubG9faGVhZGVyOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG8sICZoZWFkLT5sb2hfbGF5ZXJzLCBjb19sdS5sb19saW5rYWdlKSB7CkBAIC0xNzEsNyArMTcwLDYgQEAKIAl9CiAJcmV0dXJuIHBhZ2U7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsX3BhZ2VfYWxsb2MpOwogCiAvKioKICAqIFJldHVybnMgYSBjbF9wYWdlIHdpdGggaW5kZXggXGEgaWR4IGF0IHRoZSBvYmplY3QgXGEgbywgYW5kIGFzc29jaWF0ZWQgd2l0aApAQCAtMjI5LDExICsyMjcsNiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBjbF9wYWdlX2ludmFyaWFudChjb25zdCBzdHJ1Y3QgY2xfcGFnZSAqcGcpCiB7Ci0JLyoKLQkgKiBQYWdlIGludmFyaWFudCBpcyBwcm90ZWN0ZWQgYnkgYSBWTSBsb2NrLgotCSAqLwotCUxJTlZSTlQoY2xfcGFnZV9pc192bWxvY2tlZChOVUxMLCBwZykpOwotCiAJcmV0dXJuIGNsX3BhZ2VfaW5fdXNlX25vcmVmKHBnKTsKIH0KIApAQCAtNDc4LDcgKzQ3MSw2IEBACiAJCUxBU1NFUlQocGFnZS0+Y3Bfb3duZXItPmNpX293bmVkX25yID4gMCk7CiAJCXBhZ2UtPmNwX293bmVyLT5jaV9vd25lZF9uci0tOwogCQlwYWdlLT5jcF9vd25lciA9IE5VTEw7Ci0JCXBhZ2UtPmNwX3Rhc2sgPSBOVUxMOwogCX0KIH0KIApAQCAtNTYyLDcgKzU1NCw2IEBACiAJCQlQQVNTRVJUKGVudiwgcGcsICFwZy0+Y3Bfb3duZXIpOwogCQkJUEFTU0VSVChlbnYsIHBnLCAhcGctPmNwX3JlcSk7CiAJCQlwZy0+Y3Bfb3duZXIgPSBjbF9pb190b3AoaW8pOwotCQkJcGctPmNwX3Rhc2sgID0gY3VycmVudDsKIAkJCWNsX3BhZ2Vfb3duZXJfc2V0KHBnKTsKIAkJCWlmIChwZy0+Y3Bfc3RhdGUgIT0gQ1BTX0ZSRUVJTkcpIHsKIAkJCQljbF9wYWdlX3N0YXRlX3NldChlbnYsIHBnLCBDUFNfT1dORUQpOwpAQCAtNjE5LDcgKzYxMCw2IEBACiAJY2xfcGFnZV9pbnZvaWQoZW52LCBpbywgcGcsIENMX1BBR0VfT1AoY3BvX2Fzc3VtZSkpOwogCVBBU1NFUlQoZW52LCBwZywgIXBnLT5jcF9vd25lcik7CiAJcGctPmNwX293bmVyID0gY2xfaW9fdG9wKGlvKTsKLQlwZy0+Y3BfdGFzayA9IGN1cnJlbnQ7CiAJY2xfcGFnZV9vd25lcl9zZXQocGcpOwogCWNsX3BhZ2Vfc3RhdGVfc2V0KGVudiwgcGcsIENQU19PV05FRCk7CiB9CkBAIC04NjAsMTAgKzg1MCw2IEBACiAJUEFTU0VSVChlbnYsIHBnLCBwZy0+Y3Bfc3RhdGUgPT0gY2xfcmVxX3R5cGVfc3RhdGUoY3J0KSk7CiAKIAlDTF9QQUdFX0hFQURFUihEX1RSQUNFLCBlbnYsIHBnLCAiJWQgJWRcbiIsIGNydCwgaW9yZXQpOwotCWlmIChjcnQgPT0gQ1JUX1JFQUQgJiYgaW9yZXQgPT0gMCkgewotCQlQQVNTRVJUKGVudiwgcGcsICEocGctPmNwX2ZsYWdzICYgQ1BGX1JFQURfQ09NUExFVEVEKSk7Ci0JCXBnLT5jcF9mbGFncyB8PSBDUEZfUkVBRF9DT01QTEVURUQ7Ci0JfQogCiAJY2xfcGFnZV9zdGF0ZV9zZXQoZW52LCBwZywgQ1BTX0NBQ0hFRCk7CiAJaWYgKGNydCA+PSBDUlRfTlIpCkBAIC04NzIsNyArODU4LDYgQEAKIAkJCSAgICAgICAoY29uc3Qgc3RydWN0IGx1X2VudiAqLAogCQkJCWNvbnN0IHN0cnVjdCBjbF9wYWdlX3NsaWNlICosIGludCksIGlvcmV0KTsKIAlpZiAoYW5jaG9yKSB7Ci0JCUxBU1NFUlQoY2xfcGFnZV9pc192bWxvY2tlZChlbnYsIHBnKSk7CiAJCUxBU1NFUlQocGctPmNwX3N5bmNfaW8gPT0gYW5jaG9yKTsKIAkJcGctPmNwX3N5bmNfaW8gPSBOVUxMOwogCX0KQEAgLTk4OSwxMCArOTc0LDEwIEBACiAJCQkgIGx1X3ByaW50ZXJfdCBwcmludGVyLCBjb25zdCBzdHJ1Y3QgY2xfcGFnZSAqcGcpCiB7CiAJKCpwcmludGVyKShlbnYsIGNvb2tpZSwKLQkJICAgInBhZ2VAJXBbJWQgJXAgJWQgJWQgJWQgJXAgJXAgJSN4XVxuIiwKKwkJICAgInBhZ2VAJXBbJWQgJXAgJWQgJWQgJXAgJXBdXG4iLAogCQkgICBwZywgYXRvbWljX3JlYWQoJnBnLT5jcF9yZWYpLCBwZy0+Y3Bfb2JqLAotCQkgICBwZy0+Y3Bfc3RhdGUsIHBnLT5jcF9lcnJvciwgcGctPmNwX3R5cGUsCi0JCSAgIHBnLT5jcF9vd25lciwgcGctPmNwX3JlcSwgcGctPmNwX2ZsYWdzKTsKKwkJICAgcGctPmNwX3N0YXRlLCBwZy0+Y3BfdHlwZSwKKwkJICAgcGctPmNwX293bmVyLCBwZy0+Y3BfcmVxKTsKIH0KIEVYUE9SVF9TWU1CT0woY2xfcGFnZV9oZWFkZXJfcHJpbnQpOwogCkBAIC0xMDIwLDcgKzEwMDUsNiBAQAogCQkJICAgICAgKGNvbnN0IHN0cnVjdCBsdV9lbnYgKiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY2xfcGFnZV9zbGljZSAqKSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsX3BhZ2VfY2FuY2VsKTsKIAogLyoqCiAgKiBDb252ZXJ0cyBhIGJ5dGUgb2Zmc2V0IHdpdGhpbiBvYmplY3QgXGEgb2JqIGludG8gYSBwYWdlIGluZGV4LgpAQCAtMTA0Niw5ICsxMDMwLDkgQEAKIH0KIEVYUE9SVF9TWU1CT0woY2xfaW5kZXgpOwogCi1pbnQgY2xfcGFnZV9zaXplKGNvbnN0IHN0cnVjdCBjbF9vYmplY3QgKm9iaikKK3NpemVfdCBjbF9wYWdlX3NpemUoY29uc3Qgc3RydWN0IGNsX29iamVjdCAqb2JqKQogewotCXJldHVybiAxIDw8IFBBR0VfU0hJRlQ7CisJcmV0dXJuIDFVTCA8PCBQQUdFX1NISUZUOwogfQogRVhQT1JUX1NZTUJPTChjbF9wYWdlX3NpemUpOwogCkBAIC0xMDg3LDExICsxMDcxLDExIEBACiAJLyogSW5pdGlhbGl6ZSBjYWNoZSBkYXRhICovCiAJYXRvbWljX3NldCgmY2FjaGUtPmNjY191c2VycywgMSk7CiAJY2FjaGUtPmNjY19scnVfbWF4ID0gbHJ1X3BhZ2VfbWF4OwotCWF0b21pY19zZXQoJmNhY2hlLT5jY2NfbHJ1X2xlZnQsIGxydV9wYWdlX21heCk7CisJYXRvbWljX2xvbmdfc2V0KCZjYWNoZS0+Y2NjX2xydV9sZWZ0LCBscnVfcGFnZV9tYXgpOwogCXNwaW5fbG9ja19pbml0KCZjYWNoZS0+Y2NjX2xydV9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmY2FjaGUtPmNjY19scnUpOwogCi0JYXRvbWljX3NldCgmY2FjaGUtPmNjY191bnN0YWJsZV9uciwgMCk7CisJYXRvbWljX2xvbmdfc2V0KCZjYWNoZS0+Y2NjX3Vuc3RhYmxlX25yLCAwKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWNoZS0+Y2NjX3Vuc3RhYmxlX3dhaXRxKTsKIAogCXJldHVybiBjYWNoZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2NsYXNzX29iZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xhc3Nfb2JkLmMKaW5kZXggZDlkMmExOS4uNzZlMWVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xhc3Nfb2JkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xhc3Nfb2JkLmMKQEAgLTQwLDEwICs0MCwxMCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9jbF9vYmplY3QuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaW9jdGwuaCIKICNpbmNsdWRlICJsbG9nX2ludGVybmFsLmgiCiAKIHN0cnVjdCBvYmRfZGV2aWNlICpvYmRfZGV2c1tNQVhfT0JEX0RFVklDRVNdOwotRVhQT1JUX1NZTUJPTChvYmRfZGV2cyk7CiBzdHJ1Y3QgbGlzdF9oZWFkIG9iZF90eXBlczsKIERFRklORV9SV0xPQ0sob2JkX2Rldl9sb2NrKTsKIApAQCAtNTQsMTEgKzU0LDkgQEAKIEVYUE9SVF9TWU1CT0wob2JkX2R1bXBfb25fdGltZW91dCk7CiB1bnNpZ25lZCBpbnQgb2JkX2R1bXBfb25fZXZpY3Rpb247CiBFWFBPUlRfU1lNQk9MKG9iZF9kdW1wX29uX2V2aWN0aW9uKTsKLXVuc2lnbmVkIGludCBvYmRfbWF4X2RpcnR5X3BhZ2VzID0gMjU2OwordW5zaWduZWQgbG9uZyBvYmRfbWF4X2RpcnR5X3BhZ2VzOwogRVhQT1JUX1NZTUJPTChvYmRfbWF4X2RpcnR5X3BhZ2VzKTsKLWF0b21pY190IG9iZF91bnN0YWJsZV9wYWdlczsKLUVYUE9SVF9TWU1CT0wob2JkX3Vuc3RhYmxlX3BhZ2VzKTsKLWF0b21pY190IG9iZF9kaXJ0eV9wYWdlczsKK2F0b21pY19sb25nX3Qgb2JkX2RpcnR5X3BhZ2VzOwogRVhQT1JUX1NZTUJPTChvYmRfZGlydHlfcGFnZXMpOwogdW5zaWduZWQgaW50IG9iZF90aW1lb3V0ID0gT0JEX1RJTUVPVVRfREVGQVVMVDsgICAvKiBzZWNvbmRzICovCiBFWFBPUlRfU1lNQk9MKG9iZF90aW1lb3V0KTsKQEAgLTc2LDEzICs3NCwxMSBAQAogaW50IGF0X2V4dHJhID0gMzA7CiBFWFBPUlRfU1lNQk9MKGF0X2V4dHJhKTsKIAotYXRvbWljX3Qgb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXM7CithdG9taWNfbG9uZ190IG9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzOwogRVhQT1JUX1NZTUJPTChvYmRfZGlydHlfdHJhbnNpdF9wYWdlcyk7CiAKIGNoYXIgb2JkX2pvYmlkX3ZhcltKT0JTVEFUU19KT0JJRF9WQVJfTUFYX0xFTiArIDFdID0gSk9CU1RBVFNfRElTQUJMRTsKLUVYUE9SVF9TWU1CT0wob2JkX2pvYmlkX3Zhcik7Ci0KLWNoYXIgb2JkX2pvYmlkX25vZGVbSk9CU1RBVFNfSk9CSURfU0laRSArIDFdOworY2hhciBvYmRfam9iaWRfbm9kZVtMVVNUUkVfSk9CSURfU0laRSArIDFdOwogCiAvKiBHZXQgam9iaWQgb2YgY3VycmVudCBwcm9jZXNzIGZyb20gc3RvcmVkIHZhcmlhYmxlIG9yIGNhbGN1bGF0ZQogICogaXQgZnJvbSBwaWQgYW5kIHVzZXJfaWQuCkBAIC05MywxNCArODksMTQgQEAKICAqLwogaW50IGx1c3RyZV9nZXRfam9iaWQoY2hhciAqam9iaWQpCiB7Ci0JbWVtc2V0KGpvYmlkLCAwLCBKT0JTVEFUU19KT0JJRF9TSVpFKTsKKwltZW1zZXQoam9iaWQsIDAsIExVU1RSRV9KT0JJRF9TSVpFKTsKIAkvKiBKb2JzdGF0cyBpc24ndCBlbmFibGVkICovCiAJaWYgKHN0cmNtcChvYmRfam9iaWRfdmFyLCBKT0JTVEFUU19ESVNBQkxFKSA9PSAwKQogCQlyZXR1cm4gMDsKIAogCS8qIFVzZSBwcm9jZXNzIG5hbWUgKyBmc3VpZCBhcyBqb2JpZCAqLwogCWlmIChzdHJjbXAob2JkX2pvYmlkX3ZhciwgSk9CU1RBVFNfUFJPQ05BTUVfVUlEKSA9PSAwKSB7Ci0JCXNucHJpbnRmKGpvYmlkLCBKT0JTVEFUU19KT0JJRF9TSVpFLCAiJXMuJXUiLAorCQlzbnByaW50Zihqb2JpZCwgTFVTVFJFX0pPQklEX1NJWkUsICIlcy4ldSIsCiAJCQkgY3VycmVudF9jb21tKCksCiAJCQkgZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGN1cnJlbnRfZnN1aWQoKSkpOwogCQlyZXR1cm4gMDsKQEAgLTExNiwxOSArMTEyLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX2dldF9qb2JpZCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBvYmRfZGF0YTJjb25uKHN0cnVjdCBsdXN0cmVfaGFuZGxlICpjb25uLAotCQkJCSBzdHJ1Y3Qgb2JkX2lvY3RsX2RhdGEgKmRhdGEpCi17Ci0JbWVtc2V0KGNvbm4sIDAsIHNpemVvZigqY29ubikpOwotCWNvbm4tPmNvb2tpZSA9IGRhdGEtPmlvY19jb29raWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBvYmRfY29ubjJkYXRhKHN0cnVjdCBvYmRfaW9jdGxfZGF0YSAqZGF0YSwKLQkJCQkgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmNvbm4pCi17Ci0JZGF0YS0+aW9jX2Nvb2tpZSA9IGNvbm4tPmNvb2tpZTsKLX0KLQogc3RhdGljIGludCBjbGFzc19yZXNvbHZlX2Rldl9uYW1lKF9fdTMyIGxlbiwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlpbnQgcmM7CkBAIC0yODcsMTMgKzI3MCw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWNhc2UgT0JEX0lPQ19DTE9TRV9VVUlEOiB7Ci0JCUNERUJVRyhEX0lPQ1RMLCAiY2xvc2luZyBhbGwgY29ubmVjdGlvbnMgdG8gdXVpZCAlcyAoTk9PUClcbiIsCi0JCSAgICAgICBkYXRhLT5pb2NfaW5sYnVmMSk7Ci0JCWVyciA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQogCWNhc2UgT0JEX0lPQ19HRVRERVZJQ0U6IHsKIAkJaW50ICAgICBpbmRleCA9IGRhdGEtPmlvY19jb3VudDsKIAkJY2hhciAgICAqc3RhdHVzLCAqc3RyOwpAQCAtNDY3LDE1ICs0NDMsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1leHRlcm4gaW50IGNsYXNzX3Byb2Nmc19pbml0KHZvaWQpOwotZXh0ZXJuIGludCBjbGFzc19wcm9jZnNfY2xlYW4odm9pZCk7Ci0KIHN0YXRpYyBpbnQgX19pbml0IG9iZGNsYXNzX2luaXQodm9pZCkKIHsKIAlpbnQgaSwgZXJyOwogCi0JaW50IGx1c3RyZV9yZWdpc3Rlcl9mcyh2b2lkKTsKLQogCUxDT05TT0xFX0lORk8oIkx1c3RyZTogQnVpbGQgVmVyc2lvbjogIiBMVVNUUkVfVkVSU0lPTl9TVFJJTkcgIlxuIik7CiAKIAlzcGluX2xvY2tfaW5pdCgmb2JkX3R5cGVzX2xvY2spOwpAQCAtNTQyLDIzICs1MTMsOSBAQAogCiBzdGF0aWMgdm9pZCBvYmRjbGFzc19leGl0KHZvaWQpCiB7Ci0JaW50IGk7Ci0KLQlpbnQgbHVzdHJlX3VucmVnaXN0ZXJfZnModm9pZCk7Ci0KIAlsdXN0cmVfdW5yZWdpc3Rlcl9mcygpOwogCiAJbWlzY19kZXJlZ2lzdGVyKCZvYmRfcHNkZXYpOwotCWZvciAoaSA9IDA7IGkgPCBjbGFzc19kZXZub19tYXgoKTsgaSsrKSB7Ci0JCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBjbGFzc19udW0yb2JkKGkpOwotCi0JCWlmIChvYmQgJiYgb2JkLT5vYmRfc2V0X3VwICYmCi0JCSAgICBPQlQob2JkKSAmJiBPQlAob2JkLCBkZXRhY2gpKSB7Ci0JCQkvKiBYWFggc2hvdWxkIHRoaXMgY2FsbCBnZW5lcmljIGRldGFjaCBvdGhlcndpc2U/ICovCi0JCQlMQVNTRVJUKG9iZC0+b2JkX21hZ2ljID09IE9CRF9ERVZJQ0VfTUFHSUMpOwotCQkJT0JQKG9iZCwgZGV0YWNoKShvYmQpOwotCQl9Ci0JfQogCWxsb2dfaW5mb19maW5pKCk7CiAJY2xfZ2xvYmFsX2ZpbmkoKTsKIAlsdV9nbG9iYWxfZmluaSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2RlYnVnLmMKaW5kZXggOGFjZjY3Mi4uMGJkNGFkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZGVidWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9kZWJ1Zy5jCkBAIC00OCwxMCArNDgsMTAgQEAKIAlMQVNTRVJUKGFkZHIpOwogCiAJcHV0X3VuYWxpZ25lZF9sZTY0KG9mZiwgYWRkcik7Ci0JcHV0X3VuYWxpZ25lZF9sZTY0KGlkLCBhZGRyK0xQRFMpOworCXB1dF91bmFsaWduZWRfbGU2NChpZCwgYWRkciArIExQRFMpOwogCWFkZHIgKz0gbGVuIC0gTFBEUyAtIExQRFM7CiAJcHV0X3VuYWxpZ25lZF9sZTY0KG9mZiwgYWRkcik7Ci0JcHV0X3VuYWxpZ25lZF9sZTY0KGlkLCBhZGRyK0xQRFMpOworCXB1dF91bmFsaWduZWRfbGU2NChpZCwgYWRkciArIExQRFMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9nZW5vcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCmluZGV4IDk5YzJkYTYuLmNmOGJiMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCkBAIC0xMzMsNyArMTMzLDYgQEAKIAltb2R1bGVfcHV0KHR5cGUtPnR5cF9kdF9vcHMtPm93bmVyKTsKIAlzcGluX3VubG9jaygmdHlwZS0+b2JkX3R5cGVfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsYXNzX3B1dF90eXBlKTsKIAogI2RlZmluZSBDTEFTU19NQVhfTkFNRSAxMDI0CiAKQEAgLTE2NiwxMCArMTY1LDEwIEBACiAJICAgICF0eXBlLT50eXBfbmFtZSkKIAkJZ290byBmYWlsZWQ7CiAKLQkqKHR5cGUtPnR5cF9kdF9vcHMpID0gKmR0X29wczsKKwkqdHlwZS0+dHlwX2R0X29wcyA9ICpkdF9vcHM7CiAJLyogbWRfb3BzIGlzIG9wdGlvbmFsICovCiAJaWYgKG1kX29wcykKLQkJKih0eXBlLT50eXBfbWRfb3BzKSA9ICptZF9vcHM7CisJCSp0eXBlLT50eXBfbWRfb3BzID0gKm1kX29wczsKIAlzdHJjcHkodHlwZS0+dHlwX25hbWUsIG5hbWUpOwogCXNwaW5fbG9ja19pbml0KCZ0eXBlLT5vYmRfdHlwZV9sb2NrKTsKIApAQCAtMzkxLDcgKzM5MCw2IEBACiAKIAlyZXR1cm4gLTE7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsYXNzX25hbWUyZGV2KTsKIAogc3RydWN0IG9iZF9kZXZpY2UgKmNsYXNzX25hbWUyb2JkKGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC00MjEsNyArNDE5LDYgQEAKIAogCXJldHVybiAtMTsKIH0KLUVYUE9SVF9TWU1CT0woY2xhc3NfdXVpZDJkZXYpOwogCiAvKioKICAqIEdldCBvYmQgZGV2aWNlIGZyb20gOjpvYmRfZGV2c1tdCkBAIC00NTAsNyArNDQ3LDYgQEAKIAogCXJldHVybiBvYmQ7CiB9Ci1FWFBPUlRfU1lNQk9MKGNsYXNzX251bTJvYmQpOwogCiAvKiBTZWFyY2ggZm9yIGEgY2xpZW50IE9CRCBjb25uZWN0ZWQgdG8gdGd0X3V1aWQuICBJZiBncnBfdXVpZCBpcwogICogc3BlY2lmaWVkLCB0aGVuIG9ubHkgdGhlIGNsaWVudCB3aXRoIHRoYXQgdXVpZCBpcyByZXR1cm5lZCwKQEAgLTUwOSw3ICs1MDUsNyBAQAogCQkJY29udGludWU7CiAJCWlmIChvYmRfdXVpZF9lcXVhbHMoZ3JwX3V1aWQsICZvYmQtPm9iZF91dWlkKSkgewogCQkJaWYgKG5leHQpCi0JCQkJKm5leHQgPSBpKzE7CisJCQkJKm5leHQgPSBpICsgMTsKIAkJCXJlYWRfdW5sb2NrKCZvYmRfZGV2X2xvY2spOwogCQkJcmV0dXJuIG9iZDsKIAkJfQpAQCAtNjE4LDcgKzYxNCw3IEBACiAJfQogCiAJQ0RFQlVHKERfSU5GTywgImxvb2tpbmcgZm9yIGV4cG9ydCBjb29raWUgJSNsbHhcbiIsIGNvbm4tPmNvb2tpZSk7Ci0JZXhwb3J0ID0gY2xhc3NfaGFuZGxlMm9iamVjdChjb25uLT5jb29raWUpOworCWV4cG9ydCA9IGNsYXNzX2hhbmRsZTJvYmplY3QoY29ubi0+Y29va2llLCBOVUxMKTsKIAlyZXR1cm4gZXhwb3J0OwogfQogRVhQT1JUX1NZTUJPTChjbGFzc19jb25uMmV4cG9ydCk7CkBAIC04MTcsNyArODEzLDYgQEAKIAlzcGluX3VubG9jaygmZXhwLT5leHBfb2JkLT5vYmRfZGV2X2xvY2spOwogCWNsYXNzX2V4cG9ydF9wdXQoZXhwKTsKIH0KLUVYUE9SVF9TWU1CT0woY2xhc3NfdW5saW5rX2V4cG9ydCk7CiAKIC8qIEltcG9ydCBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLwogc3RhdGljIHZvaWQgY2xhc3NfaW1wb3J0X2Rlc3Ryb3koc3RydWN0IG9iZF9pbXBvcnQgKmltcCkKQEAgLTk3Myw3ICs5NjgsNiBAQAogCSAgICAgICBsb2NrLCBleHAsIGxvY2stPmxfZXhwX3JlZnNfbnIpOwogCXNwaW5fdW5sb2NrKCZleHAtPmV4cF9sb2Nrc19saXN0X2d1YXJkKTsKIH0KLUVYUE9SVF9TWU1CT0woX19jbGFzc19leHBvcnRfYWRkX2xvY2tfcmVmKTsKIAogdm9pZCBfX2NsYXNzX2V4cG9ydF9kZWxfbG9ja19yZWYoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxkbG1fbG9jayAqbG9jaykKIHsKQEAgLTk5MSw3ICs5ODUsNiBAQAogCSAgICAgICBsb2NrLCBleHAsIGxvY2stPmxfZXhwX3JlZnNfbnIpOwogCXNwaW5fdW5sb2NrKCZleHAtPmV4cF9sb2Nrc19saXN0X2d1YXJkKTsKIH0KLUVYUE9SVF9TWU1CT0woX19jbGFzc19leHBvcnRfZGVsX2xvY2tfcmVmKTsKICNlbmRpZgogCiAvKiBBIGNvbm5lY3Rpb24gZGVmaW5lcyBhbiBleHBvcnQgY29udGV4dCBpbiB3aGljaCBwcmVhbGxvY2F0aW9uIGNhbgpAQCAtMTEwMCw3ICsxMDkzLDYgQEAKIAogI2lmIExVU1RSRV9UUkFDS1NfTE9DS19FWFBfUkVGUwogdm9pZCAoKmNsYXNzX2V4cG9ydF9kdW1wX2hvb2spKHN0cnVjdCBvYmRfZXhwb3J0ICopID0gTlVMTDsKLUVYUE9SVF9TWU1CT0woY2xhc3NfZXhwb3J0X2R1bXBfaG9vayk7CiAjZW5kaWYKIAogLyogVG90YWwgYW1vdW50IG9mIHpvbWJpZXMgdG8gYmUgZGVzdHJveWVkICovCkBAIC0xMzEyLDMgKzEzMDQsMTM1IEBACiAJb2JkX3pvbWJpZV9pbXBleHBfbm90aWZ5KCk7CiAJd2FpdF9mb3JfY29tcGxldGlvbigmb2JkX3pvbWJpZV9zdG9wKTsKIH0KKworc3RydWN0IG9iZF9yZXF1ZXN0X3Nsb3Rfd2FpdGVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW9yc3dfZW50cnk7CisJd2FpdF9xdWV1ZV9oZWFkX3QJb3Jzd193YWl0cTsKKwlib29sCQkJb3Jzd19zaWduYWxlZDsKK307CisKK3N0YXRpYyBib29sIG9iZF9yZXF1ZXN0X3Nsb3RfYXZhaWwoc3RydWN0IGNsaWVudF9vYmQgKmNsaSwKKwkJCQkgICBzdHJ1Y3Qgb2JkX3JlcXVlc3Rfc2xvdF93YWl0ZXIgKm9yc3cpCit7CisJYm9vbCBhdmFpbDsKKworCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKwlhdmFpbCA9ICEhbGlzdF9lbXB0eSgmb3Jzdy0+b3Jzd19lbnRyeSk7CisJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gYXZhaWw7Cit9OworCisvKgorICogRm9yIG5ldHdvcmsgZmxvdyBjb250cm9sLCB0aGUgUlBDIHNwb25zb3IgbmVlZHMgdG8gYWNxdWlyZSBhIGNyZWRpdAorICogYmVmb3JlIHNlbmRpbmcgdGhlIFJQQy4gVGhlIGNyZWRpdHMgY291bnQgZm9yIGEgY29ubmVjdGlvbiBpcyBkZWZpbmVkCisgKiBieSB0aGUgImNsX21heF9ycGNzX2luX2ZsaWdodCIuIElmIGFsbCB0aGUgY3JlZGl0cyBhcmUgb2NjcHVpZWQsIHRoZW4KKyAqIHRoZSBzdWJzZXF1ZW50IFJQQyBzcG9uc29ycyBuZWVkIHRvIHdhaXQgdW50aWwgb3RoZXJzIHJlbGVhc2VkIHRoZWlyCisgKiBjcmVkaXRzLCBvciB0aGUgYWRtaW5pc3RyYXRvciBpbmNyZWFzZWQgdGhlICJjbF9tYXhfcnBjc19pbl9mbGlnaHQiLgorICovCitpbnQgb2JkX2dldF9yZXF1ZXN0X3Nsb3Qoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKK3sKKwlzdHJ1Y3Qgb2JkX3JlcXVlc3Rfc2xvdF93YWl0ZXIgb3JzdzsKKwlzdHJ1Y3QgbF93YWl0X2luZm8gbHdpOworCWludCByYzsKKworCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKwlpZiAoY2xpLT5jbF9yX2luX2ZsaWdodCA8IGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0KSB7CisJCWNsaS0+Y2xfcl9pbl9mbGlnaHQrKzsKKwkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJCXJldHVybiAwOworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9yc3cub3Jzd193YWl0cSk7CisJbGlzdF9hZGRfdGFpbCgmb3Jzdy5vcnN3X2VudHJ5LCAmY2xpLT5jbF9sb2lfcmVhZF9saXN0KTsKKwlvcnN3Lm9yc3dfc2lnbmFsZWQgPSBmYWxzZTsKKwlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKworCWx3aSA9IExXSV9JTlRSKExXSV9PTl9TSUdOQUxfTk9PUCwgTlVMTCk7CisJcmMgPSBsX3dhaXRfZXZlbnQob3Jzdy5vcnN3X3dhaXRxLAorCQkJICBvYmRfcmVxdWVzdF9zbG90X2F2YWlsKGNsaSwgJm9yc3cpIHx8CisJCQkgIG9yc3cub3Jzd19zaWduYWxlZCwKKwkJCSAgJmx3aSk7CisKKwkvKgorCSAqIEhlcmUsIHdlIG11c3QgdGFrZSB0aGUgbG9jayB0byBhdm9pZCB0aGUgb24tc3RhY2sgJ29yc3cnIHRvIGJlCisJICogZnJlZWQgYnV0IG90aGVyIChzdWNoIGFzIG9iZF9wdXRfcmVxdWVzdF9zbG90KSBpcyB1c2luZyBpdC4KKwkgKi8KKwlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJaWYgKHJjKSB7CisJCWlmICghb3Jzdy5vcnN3X3NpZ25hbGVkKSB7CisJCQlpZiAobGlzdF9lbXB0eSgmb3Jzdy5vcnN3X2VudHJ5KSkKKwkJCQljbGktPmNsX3JfaW5fZmxpZ2h0LS07CisJCQllbHNlCisJCQkJbGlzdF9kZWwoJm9yc3cub3Jzd19lbnRyeSk7CisJCX0KKwl9CisKKwlpZiAob3Jzdy5vcnN3X3NpZ25hbGVkKSB7CisJCUxBU1NFUlQobGlzdF9lbXB0eSgmb3Jzdy5vcnN3X2VudHJ5KSk7CisKKwkJcmMgPSAtRUlOVFI7CisJfQorCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChvYmRfZ2V0X3JlcXVlc3Rfc2xvdCk7CisKK3ZvaWQgb2JkX3B1dF9yZXF1ZXN0X3Nsb3Qoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKK3sKKwlzdHJ1Y3Qgb2JkX3JlcXVlc3Rfc2xvdF93YWl0ZXIgKm9yc3c7CisKKwlzcGluX2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CisJY2xpLT5jbF9yX2luX2ZsaWdodC0tOworCisJLyogSWYgdGhlcmUgaXMgZnJlZSBzbG90LCB3YWtldXAgdGhlIGZpcnN0IHdhaXRlci4gKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmNsaS0+Y2xfbG9pX3JlYWRfbGlzdCkgJiYKKwkgICAgbGlrZWx5KGNsaS0+Y2xfcl9pbl9mbGlnaHQgPCBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCkpIHsKKwkJb3JzdyA9IGxpc3RfZW50cnkoY2xpLT5jbF9sb2lfcmVhZF9saXN0Lm5leHQsCisJCQkJICBzdHJ1Y3Qgb2JkX3JlcXVlc3Rfc2xvdF93YWl0ZXIsIG9yc3dfZW50cnkpOworCQlsaXN0X2RlbF9pbml0KCZvcnN3LT5vcnN3X2VudHJ5KTsKKwkJY2xpLT5jbF9yX2luX2ZsaWdodCsrOworCQl3YWtlX3VwKCZvcnN3LT5vcnN3X3dhaXRxKTsKKwl9CisJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKG9iZF9wdXRfcmVxdWVzdF9zbG90KTsKKworX191MzIgb2JkX2dldF9tYXhfcnBjc19pbl9mbGlnaHQoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKK3sKKwlyZXR1cm4gY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQ7Cit9CitFWFBPUlRfU1lNQk9MKG9iZF9nZXRfbWF4X3JwY3NfaW5fZmxpZ2h0KTsKKworaW50IG9iZF9zZXRfbWF4X3JwY3NfaW5fZmxpZ2h0KHN0cnVjdCBjbGllbnRfb2JkICpjbGksIF9fdTMyIG1heCkKK3sKKwlzdHJ1Y3Qgb2JkX3JlcXVlc3Rfc2xvdF93YWl0ZXIgKm9yc3c7CisJX191MzIgb2xkOworCWludCBkaWZmOworCWludCBpOworCisJaWYgKG1heCA+IE9CRF9NQVhfUklGX01BWCB8fCBtYXggPCAxKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKwlvbGQgPSBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodDsKKwljbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCA9IG1heDsKKwlkaWZmID0gbWF4IC0gb2xkOworCisJLyogV2UgaW5jcmVhc2UgdGhlIG1heF9ycGNzX2luX2ZsaWdodCwgdGhlbiB3YWtldXAgc29tZSB3YWl0ZXJzLiAqLworCWZvciAoaSA9IDA7IGkgPCBkaWZmOyBpKyspIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmNsaS0+Y2xfbG9pX3JlYWRfbGlzdCkpCisJCQlicmVhazsKKworCQlvcnN3ID0gbGlzdF9lbnRyeShjbGktPmNsX2xvaV9yZWFkX2xpc3QubmV4dCwKKwkJCQkgIHN0cnVjdCBvYmRfcmVxdWVzdF9zbG90X3dhaXRlciwgb3Jzd19lbnRyeSk7CisJCWxpc3RfZGVsX2luaXQoJm9yc3ctPm9yc3dfZW50cnkpOworCQljbGktPmNsX3JfaW5fZmxpZ2h0Kys7CisJCXdha2VfdXAoJm9yc3ctPm9yc3dfd2FpdHEpOworCX0KKwlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChvYmRfc2V0X21heF9ycGNzX2luX2ZsaWdodCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW5rZWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbmtlYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMWQyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW5rZWEuYwpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIEdQTCBIRUFERVIgU1RBUlQKKyAqCisgKiBETyBOT1QgQUxURVIgT1IgUkVNT1ZFIENPUFlSSUdIVCBOT1RJQ0VTIE9SIFRISVMgRklMRSBIRUFERVIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9ubHksCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgZm9yIG1vcmUgZGV0YWlscyAoYSBjb3B5IGlzIGluY2x1ZGVkCisgKiBpbiB0aGUgTElDRU5TRSBmaWxlIHRoYXQgYWNjb21wYW5pZWQgdGhpcyBjb2RlKS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJZiBub3QsIHNlZQorICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAuaHRtbAorICoKKyAqIEdQTCBIRUFERVIgRU5ECisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcy4KKyAqCisgKiBBdXRob3I6IERpIFdhbmcgPGRpLndhbmdAaW50ZWwuY29tPgorICovCisKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaWRsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9saW5rZWEuaCIKKworaW50IGxpbmtlYV9kYXRhX25ldyhzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhLCBzdHJ1Y3QgbHVfYnVmICpidWYpCit7CisJbGRhdGEtPmxkX2J1ZiA9IGx1X2J1Zl9jaGVja19hbmRfYWxsb2MoYnVmLCBQQUdFX1NJWkUpOworCWlmICghbGRhdGEtPmxkX2J1Zi0+bGJfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlsZGF0YS0+bGRfbGVoID0gbGRhdGEtPmxkX2J1Zi0+bGJfYnVmOworCWxkYXRhLT5sZF9sZWgtPmxlaF9tYWdpYyA9IExJTktfRUFfTUFHSUM7CisJbGRhdGEtPmxkX2xlaC0+bGVoX2xlbiA9IHNpemVvZihzdHJ1Y3QgbGlua19lYV9oZWFkZXIpOworCWxkYXRhLT5sZF9sZWgtPmxlaF9yZWNjb3VudCA9IDA7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGxpbmtlYV9kYXRhX25ldyk7CisKK2ludCBsaW5rZWFfaW5pdChzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhKQoreworCXN0cnVjdCBsaW5rX2VhX2hlYWRlciAqbGVoOworCisJTEFTU0VSVChsZGF0YS0+bGRfYnVmKTsKKwlsZWggPSBsZGF0YS0+bGRfYnVmLT5sYl9idWY7CisJaWYgKGxlaC0+bGVoX21hZ2ljID09IF9fc3dhYjMyKExJTktfRUFfTUFHSUMpKSB7CisJCWxlaC0+bGVoX21hZ2ljID0gTElOS19FQV9NQUdJQzsKKwkJbGVoLT5sZWhfcmVjY291bnQgPSBfX3N3YWIzMihsZWgtPmxlaF9yZWNjb3VudCk7CisJCWxlaC0+bGVoX2xlbiA9IF9fc3dhYjY0KGxlaC0+bGVoX2xlbik7CisJCS8qIGVudHJpZXMgYXJlIHN3YWJiZWQgYnkgbGlua2VhX2VudHJ5X3VucGFjayAqLworCX0KKwlpZiAobGVoLT5sZWhfbWFnaWMgIT0gTElOS19FQV9NQUdJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGxlaC0+bGVoX3JlY2NvdW50ID09IDApCisJCXJldHVybiAtRU5PREFUQTsKKworCWxkYXRhLT5sZF9sZWggPSBsZWg7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGxpbmtlYV9pbml0KTsKKworLyoqCisgKiBQYWNrIGEgbGlua19lYV9lbnRyeS4KKyAqIEFsbCBlbGVtZW50cyBhcmUgc3RvcmVkIGFzIGNoYXJzIHRvIGF2b2lkIGFsaWdubWVudCBpc3N1ZXMuCisgKiBOdW1iZXJzIGFyZSBhbHdheXMgYmlnLWVuZGlhbgorICogXHJldHZhbCByZWNvcmQgbGVuZ3RoCisgKi8KK2ludCBsaW5rZWFfZW50cnlfcGFjayhzdHJ1Y3QgbGlua19lYV9lbnRyeSAqbGVlLCBjb25zdCBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgKnBmaWQpCit7CisJc3RydWN0IGx1X2ZpZCAgIHRtcGZpZDsKKwlpbnQgICAgICAgICAgICAgcmVjbGVuOworCisJdG1wZmlkID0gKnBmaWQ7CisJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX0xGU0NLX0xJTktFQV9DUkFTSCkpCisJCXRtcGZpZC5mX3ZlciA9IH4wOworCWZpZF9jcHVfdG9fYmUoJnRtcGZpZCwgJnRtcGZpZCk7CisJbWVtY3B5KCZsZWUtPmxlZV9wYXJlbnRfZmlkLCAmdG1wZmlkLCBzaXplb2YodG1wZmlkKSk7CisJbWVtY3B5KGxlZS0+bGVlX25hbWUsIGxuYW1lLT5sbl9uYW1lLCBsbmFtZS0+bG5fbmFtZWxlbik7CisJcmVjbGVuID0gc2l6ZW9mKHN0cnVjdCBsaW5rX2VhX2VudHJ5KSArIGxuYW1lLT5sbl9uYW1lbGVuOworCisJbGVlLT5sZWVfcmVjbGVuWzBdID0gKHJlY2xlbiA+PiA4KSAmIDB4ZmY7CisJbGVlLT5sZWVfcmVjbGVuWzFdID0gcmVjbGVuICYgMHhmZjsKKwlyZXR1cm4gcmVjbGVuOworfQorRVhQT1JUX1NZTUJPTChsaW5rZWFfZW50cnlfcGFjayk7CisKK3ZvaWQgbGlua2VhX2VudHJ5X3VucGFjayhjb25zdCBzdHJ1Y3QgbGlua19lYV9lbnRyeSAqbGVlLCBpbnQgKnJlY2xlbiwKKwkJCSBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUsIHN0cnVjdCBsdV9maWQgKnBmaWQpCit7CisJKnJlY2xlbiA9IChsZWUtPmxlZV9yZWNsZW5bMF0gPDwgOCkgfCBsZWUtPmxlZV9yZWNsZW5bMV07CisJbWVtY3B5KHBmaWQsICZsZWUtPmxlZV9wYXJlbnRfZmlkLCBzaXplb2YoKnBmaWQpKTsKKwlmaWRfYmVfdG9fY3B1KHBmaWQsIHBmaWQpOworCWlmIChsbmFtZSkgeworCQlsbmFtZS0+bG5fbmFtZSA9IGxlZS0+bGVlX25hbWU7CisJCWxuYW1lLT5sbl9uYW1lbGVuID0gKnJlY2xlbiAtIHNpemVvZihzdHJ1Y3QgbGlua19lYV9lbnRyeSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChsaW5rZWFfZW50cnlfdW5wYWNrKTsKKworLyoqCisgKiBBZGQgYSByZWNvcmQgdG8gdGhlIGVuZCBvZiBsaW5rIGVhIGJ1ZgorICoqLworaW50IGxpbmtlYV9hZGRfYnVmKHN0cnVjdCBsaW5rZWFfZGF0YSAqbGRhdGEsIGNvbnN0IHN0cnVjdCBsdV9uYW1lICpsbmFtZSwKKwkJICAgY29uc3Qgc3RydWN0IGx1X2ZpZCAqcGZpZCkKK3sKKwlMQVNTRVJUKGxkYXRhLT5sZF9sZWgpOworCisJaWYgKCFsbmFtZSB8fCAhcGZpZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsZGF0YS0+bGRfcmVjbGVuID0gbG5hbWUtPmxuX25hbWVsZW4gKyBzaXplb2Yoc3RydWN0IGxpbmtfZWFfZW50cnkpOworCWlmIChsZGF0YS0+bGRfbGVoLT5sZWhfbGVuICsgbGRhdGEtPmxkX3JlY2xlbiA+CisJICAgIGxkYXRhLT5sZF9idWYtPmxiX2xlbikgeworCQlpZiAobHVfYnVmX2NoZWNrX2FuZF9ncm93KGxkYXRhLT5sZF9idWYsCisJCQkJCSAgbGRhdGEtPmxkX2xlaC0+bGVoX2xlbiArCisJCQkJCSAgbGRhdGEtPmxkX3JlY2xlbikgPCAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbGRhdGEtPmxkX2xlaCA9IGxkYXRhLT5sZF9idWYtPmxiX2J1ZjsKKwlsZGF0YS0+bGRfbGVlID0gbGRhdGEtPmxkX2J1Zi0+bGJfYnVmICsgbGRhdGEtPmxkX2xlaC0+bGVoX2xlbjsKKwlsZGF0YS0+bGRfcmVjbGVuID0gbGlua2VhX2VudHJ5X3BhY2sobGRhdGEtPmxkX2xlZSwgbG5hbWUsIHBmaWQpOworCWxkYXRhLT5sZF9sZWgtPmxlaF9sZW4gKz0gbGRhdGEtPmxkX3JlY2xlbjsKKwlsZGF0YS0+bGRfbGVoLT5sZWhfcmVjY291bnQrKzsKKwlDREVCVUcoRF9JTk9ERSwgIk5ldyBsaW5rX2VhIG5hbWUgJyIgREZJRCAiOiUuKnMnIGlzIGFkZGVkXG4iLAorCSAgICAgICBQRklEKHBmaWQpLCBsbmFtZS0+bG5fbmFtZWxlbiwgbG5hbWUtPmxuX25hbWUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChsaW5rZWFfYWRkX2J1Zik7CisKKy8qKiBEZWwgdGhlIGN1cnJlbnQgcmVjb3JkIGZyb20gdGhlIGxpbmsgZWEgYnVmICovCit2b2lkIGxpbmtlYV9kZWxfYnVmKHN0cnVjdCBsaW5rZWFfZGF0YSAqbGRhdGEsIGNvbnN0IHN0cnVjdCBsdV9uYW1lICpsbmFtZSkKK3sKKwlMQVNTRVJUKGxkYXRhLT5sZF9sZWggJiYgbGRhdGEtPmxkX2xlZSk7CisKKwlsZGF0YS0+bGRfbGVoLT5sZWhfcmVjY291bnQtLTsKKwlsZGF0YS0+bGRfbGVoLT5sZWhfbGVuIC09IGxkYXRhLT5sZF9yZWNsZW47CisJbWVtbW92ZShsZGF0YS0+bGRfbGVlLCAoY2hhciAqKWxkYXRhLT5sZF9sZWUgKyBsZGF0YS0+bGRfcmVjbGVuLAorCQkoY2hhciAqKWxkYXRhLT5sZF9sZWggKyBsZGF0YS0+bGRfbGVoLT5sZWhfbGVuIC0KKwkJKGNoYXIgKilsZGF0YS0+bGRfbGVlKTsKKwlDREVCVUcoRF9JTk9ERSwgIk9sZCBsaW5rX2VhIG5hbWUgJyUuKnMnIGlzIHJlbW92ZWRcbiIsCisJICAgICAgIGxuYW1lLT5sbl9uYW1lbGVuLCBsbmFtZS0+bG5fbmFtZSk7CisKKwlpZiAoKGNoYXIgKilsZGF0YS0+bGRfbGVlID49ICgoY2hhciAqKWxkYXRhLT5sZF9sZWggKworCQkJCSAgICAgIGxkYXRhLT5sZF9sZWgtPmxlaF9sZW4pKQorCQlsZGF0YS0+bGRfbGVlID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wobGlua2VhX2RlbF9idWYpOworCisvKioKKyAqIENoZWNrIGlmIHN1Y2ggYSBsaW5rIGV4aXN0cyBpbiBsaW5rRUEuCisgKgorICogXHBhcmFtIGxkYXRhIGxpbmsgZGF0YSB0aGUgc2VhcmNoIHRvIGJlIGRvbmUgb24KKyAqIFxwYXJhbSBsbmFtZSBuYW1lIGluIHRoZSBwYXJlbnQncyBkaXJlY3RvcnkgZW50cnkgcG9pbnRpbmcgdG8gdGhpcyBvYmplY3QKKyAqIFxwYXJhbSBwZmlkIHBhcmVudCBmaWQgdGhlIGxpbmsgdG8gYmUgZm91bmQgZm9yCisgKgorICogXHJldHZhbCAgIDAgc3VjY2VzcworICogXHJldHZhbCAtRU5PRU5UIGxpbmsgZG9lcyBub3QgZXhpc3QKKyAqIFxyZXR2YWwgLXZlIG9uIGVycm9yCisgKi8KK2ludCBsaW5rZWFfbGlua3NfZmluZChzdHJ1Y3QgbGlua2VhX2RhdGEgKmxkYXRhLCBjb25zdCBzdHJ1Y3QgbHVfbmFtZSAqbG5hbWUsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBsdV9maWQgICpwZmlkKQoreworCXN0cnVjdCBsdV9uYW1lIHRtcG5hbWU7CisJc3RydWN0IGx1X2ZpZCAgdG1wZmlkOworCWludCBjb3VudDsKKworCUxBU1NFUlQobGRhdGEtPmxkX2xlaCk7CisKKwkvKiBsaW5rICMwICovCisJbGRhdGEtPmxkX2xlZSA9IChzdHJ1Y3QgbGlua19lYV9lbnRyeSAqKShsZGF0YS0+bGRfbGVoICsgMSk7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBsZGF0YS0+bGRfbGVoLT5sZWhfcmVjY291bnQ7IGNvdW50KyspIHsKKwkJbGlua2VhX2VudHJ5X3VucGFjayhsZGF0YS0+bGRfbGVlLCAmbGRhdGEtPmxkX3JlY2xlbiwKKwkJCQkgICAgJnRtcG5hbWUsICZ0bXBmaWQpOworCQlpZiAodG1wbmFtZS5sbl9uYW1lbGVuID09IGxuYW1lLT5sbl9uYW1lbGVuICYmCisJCSAgICBsdV9maWRfZXEoJnRtcGZpZCwgcGZpZCkgJiYKKwkJICAgIChzdHJuY21wKHRtcG5hbWUubG5fbmFtZSwgbG5hbWUtPmxuX25hbWUsCisJCQkgICAgIHRtcG5hbWUubG5fbmFtZWxlbikgPT0gMCkpCisJCQlicmVhazsKKwkJbGRhdGEtPmxkX2xlZSA9IChzdHJ1Y3QgbGlua19lYV9lbnRyeSAqKSgoY2hhciAqKWxkYXRhLT5sZF9sZWUgKworCQkJCQkJCSBsZGF0YS0+bGRfcmVjbGVuKTsKKwl9CisKKwlpZiAoY291bnQgPT0gbGRhdGEtPmxkX2xlaC0+bGVoX3JlY2NvdW50KSB7CisJCUNERUJVRyhEX0lOT0RFLCAiT2xkIGxpbmtfZWEgbmFtZSAnJS4qcycgbm90IGZvdW5kXG4iLAorCQkgICAgICAgbG5hbWUtPmxuX25hbWVsZW4sIGxuYW1lLT5sbl9uYW1lKTsKKwkJbGRhdGEtPmxkX2xlZSA9IE5VTEw7CisJCWxkYXRhLT5sZF9yZWNsZW4gPSAwOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGxpbmtlYV9saW5rc19maW5kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW1vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKaW5kZXggMzMzNDJiZi4uYmUwOWUwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKQEAgLTY1LDYgKzY1LDcgQEAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9vYmRfY2xhc3MuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9sdXN0cmVfdmVyLmgiCiAKIC8qIGJ1ZmZlciBNVVNUIGJlIGF0IGxlYXN0IHRoZSBzaXplIG9mIG9iZF9pb2N0bF9oZHIgKi8KQEAgLTE1Nyw3ICsxNTgsNiBAQAogCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsIGRhdGEsIGxlbikgPyAtRUZBVUxUIDogMDsKIAlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTChvYmRfaW9jdGxfcG9wZGF0YSk7CiAKIC8qICBvcGVuaW5nIC9kZXYvb2JkICovCiBzdGF0aWMgaW50IG9iZF9jbGFzc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMTkxLDcgKzE5MSw3IEBACiB9CiAKIC8qIGRlY2xhcmUgY2hhcmFjdGVyIGRldmljZSAqLwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2JkX3BzZGV2X2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvYmRfcHNkZXZfZm9wcyA9IHsKIAkub3duZXIJICA9IFRISVNfTU9EVUxFLAogCS51bmxvY2tlZF9pb2N0bCA9IG9iZF9jbGFzc19pb2N0bCwgLyogdW5sb2NrZWRfaW9jdGwgKi8KIAkub3BlbgkgICA9IG9iZF9jbGFzc19vcGVuLCAgICAgIC8qIG9wZW4gKi8KQEAgLTI5MSw3ICsyOTEsNyBAQAogCQkJCWNvbnN0IGNoYXIgKmJ1ZmZlciwKIAkJCQlzaXplX3QgY291bnQpCiB7Ci0JaWYgKCFjb3VudCB8fCBjb3VudCA+IEpPQlNUQVRTX0pPQklEX1NJWkUpCisJaWYgKCFjb3VudCB8fCBjb3VudCA+IExVU1RSRV9KT0JJRF9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1lbWNweShvYmRfam9iaWRfbm9kZSwgYnVmZmVyLCBjb3VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1vYmRvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1vYmRvLmMKaW5kZXggYzZjYzZhNy4uNDFiNzdhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtb2Jkby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW9iZG8uYwpAQCAtNDQsNyArNDQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KIAotdm9pZCBvYmRvX3JlZnJlc2hfaW5vZGUoc3RydWN0IGlub2RlICpkc3QsIHN0cnVjdCBvYmRvICpzcmMsIHUzMiB2YWxpZCkKK3ZvaWQgb2Jkb19yZWZyZXNoX2lub2RlKHN0cnVjdCBpbm9kZSAqZHN0LCBjb25zdCBzdHJ1Y3Qgb2JkbyAqc3JjLCB1MzIgdmFsaWQpCiB7CiAJdmFsaWQgJj0gc3JjLT5vX3ZhbGlkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1zeXNjdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LXN5c2N0bC5jCmluZGV4IDhmNzBkZDIuLmU2Yzc4NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LXN5c2N0bC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LXN5c2N0bC5jCkBAIC00NSw2ICs0NSw3IEBACiAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL29iZF9zdXBwb3J0LmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgorI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCiAKIHN0cnVjdCBzdGF0aWNfbHVzdHJlX3VpbnR2YWx1ZV9hdHRyIHsKIAlzdHJ1Y3QgewpAQCAtOTUsOCArOTYsOCBAQAogc3RhdGljIHNzaXplX3QgbWF4X2RpcnR5X21iX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCiAJCQkJIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldWxcbiIsCi0JCQlvYmRfbWF4X2RpcnR5X3BhZ2VzIC8gKDEgPDwgKDIwIC0gUEFHRV9TSElGVCkpKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsCisJCSAgICAgICBvYmRfbWF4X2RpcnR5X3BhZ2VzIC8gKDEgPDwgKDIwIC0gUEFHRV9TSElGVCkpKTsKIH0KIAogc3RhdGljIHNzaXplX3QgbWF4X2RpcnR5X21iX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZy5jCmluZGV4IDE3ODRjYTAuLjQzNzk3ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2cuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAkJTEFTU0VSVChsaXN0X2VtcHR5KCZsb2doYW5kbGUtPnUucGhkLnBoZF9lbnRyeSkpOwogCWVsc2UgaWYgKGxvZ2hhbmRsZS0+bGdoX2hkci0+bGxoX2ZsYWdzICYgTExPR19GX0lTX0NBVCkKIAkJTEFTU0VSVChsaXN0X2VtcHR5KCZsb2doYW5kbGUtPnUuY2hkLmNoZF9oZWFkKSk7Ci0JTEFTU0VSVChzaXplb2YoKihsb2doYW5kbGUtPmxnaF9oZHIpKSA9PSBMTE9HX0NIVU5LX1NJWkUpOworCUxBU1NFUlQoc2l6ZW9mKCpsb2doYW5kbGUtPmxnaF9oZHIpID09IExMT0dfQ0hVTktfU0laRSk7CiAJa2ZyZWUobG9naGFuZGxlLT5sZ2hfaGRyKTsKIG91dDoKIAlrZnJlZShsb2doYW5kbGUpOwpAQCAtMTM3LDYgKzEzNyw3IEBACiBpbnQgbGxvZ19pbml0X2hhbmRsZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsbG9nX2hhbmRsZSAqaGFuZGxlLAogCQkgICAgIGludCBmbGFncywgc3RydWN0IG9iZF91dWlkICp1dWlkKQogeworCWVudW0gbGxvZ19mbGFnIGZtdCA9IGZsYWdzICYgTExPR19GX0VYVF9NQVNLOwogCXN0cnVjdCBsbG9nX2xvZ19oZHIJKmxsaDsKIAlpbnQJCQkgcmM7CiAKQEAgLTE5NCw2ICsxOTUsNyBAQAogCQkgICAgICAgZmxhZ3MsIExMT0dfRl9JU19DQVQsIExMT0dfRl9JU19QTEFJTik7CiAJCXJjID0gLUVJTlZBTDsKIAl9CisJbGxoLT5sbGhfZmxhZ3MgfD0gZm10Owogb3V0OgogCWlmIChyYykgewogCQlrZnJlZShsbGgpOwpAQCAtMjMzLDYgKzIzNSwxMCBAQAogCWVsc2UKIAkJbGFzdF9pbmRleCA9IExMT0dfQklUTUFQX0JZVEVTICogOCAtIDE7CiAKKwkvKiBSZWNvcmQgaXMgbm90IGluIHRoaXMgYnVmZmVyLiAqLworCWlmIChpbmRleCA+IGxhc3RfaW5kZXgpCisJCWdvdG8gb3V0OworCiAJd2hpbGUgKHJjID09IDApIHsKIAkJc3RydWN0IGxsb2dfcmVjX2hkciAqcmVjOwogCkBAIC0yNjIsNyArMjY4LDcgQEAKIAkJICovCiAJCWZvciAocmVjID0gKHN0cnVjdCBsbG9nX3JlY19oZHIgKilidWY7CiAJCSAgICAgKGNoYXIgKilyZWMgPCBidWYgKyBMTE9HX0NIVU5LX1NJWkU7Ci0JCSAgICAgcmVjID0gKHN0cnVjdCBsbG9nX3JlY19oZHIgKikoKGNoYXIgKilyZWMgKyByZWMtPmxyaF9sZW4pKSB7CisJCSAgICAgcmVjID0gbGxvZ19yZWNfaGRyX25leHQocmVjKSkgewogCQkJQ0RFQlVHKERfT1RIRVIsICJwcm9jZXNzaW5nIHJlYyAweCVwIHR5cGUgJSN4XG4iLAogCQkJICAgICAgIHJlYywgcmVjLT5scmhfdHlwZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2NhdC5jCmluZGV4IGE4MmEyOTUuLmNlOGUyZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19jYXQuYwpAQCAtNjMsMTEgKzYzLDEzIEBACiAJCQkgICAgICBzdHJ1Y3QgbGxvZ19sb2dpZCAqbG9naWQpCiB7CiAJc3RydWN0IGxsb2dfaGFuZGxlCSpsb2doYW5kbGU7CisJZW51bSBsbG9nX2ZsYWcgZm10OwogCWludAkJCSByYyA9IDA7CiAKIAlpZiAoIWNhdGhhbmRsZSkKIAkJcmV0dXJuIC1FQkFERjsKIAorCWZtdCA9IGNhdGhhbmRsZS0+bGdoX2hkci0+bGxoX2ZsYWdzICYgTExPR19GX0VYVF9NQVNLOwogCWRvd25fd3JpdGUoJmNhdGhhbmRsZS0+bGdoX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkobG9naGFuZGxlLCAmY2F0aGFuZGxlLT51LmNoZC5jaGRfaGVhZCwKIAkJCSAgICB1LnBoZC5waGRfZW50cnkpIHsKQEAgLTk5LDcgKzEwMSw3IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQlyYyA9IGxsb2dfaW5pdF9oYW5kbGUoZW52LCBsb2doYW5kbGUsIExMT0dfRl9JU19QTEFJTiwgTlVMTCk7CisJcmMgPSBsbG9nX2luaXRfaGFuZGxlKGVudiwgbG9naGFuZGxlLCBmbXQgfCBMTE9HX0ZfSVNfUExBSU4sIE5VTEwpOwogCWlmIChyYyA8IDApIHsKIAkJbGxvZ19jbG9zZShlbnYsIGxvZ2hhbmRsZSk7CiAJCWxvZ2hhbmRsZSA9IE5VTEw7CkBAIC0xMDcsNyArMTA5LDcgQEAKIAl9CiAKIAlkb3duX3dyaXRlKCZjYXRoYW5kbGUtPmxnaF9sb2NrKTsKLQlsaXN0X2FkZCgmbG9naGFuZGxlLT51LnBoZC5waGRfZW50cnksICZjYXRoYW5kbGUtPnUuY2hkLmNoZF9oZWFkKTsKKwlsaXN0X2FkZF90YWlsKCZsb2doYW5kbGUtPnUucGhkLnBoZF9lbnRyeSwgJmNhdGhhbmRsZS0+dS5jaGQuY2hkX2hlYWQpOwogCXVwX3dyaXRlKCZjYXRoYW5kbGUtPmxnaF9sb2NrKTsKIAogCWxvZ2hhbmRsZS0+dS5waGQucGhkX2NhdF9oYW5kbGUgPSBjYXRoYW5kbGU7CkBAIC0xMjMsNyArMTI1LDYgQEAKIGludCBsbG9nX2NhdF9jbG9zZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsbG9nX2hhbmRsZSAqY2F0aGFuZGxlKQogewogCXN0cnVjdCBsbG9nX2hhbmRsZQkqbG9naGFuZGxlLCAqbjsKLQlpbnQJCQkgcmM7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobG9naGFuZGxlLCBuLCAmY2F0aGFuZGxlLT51LmNoZC5jaGRfaGVhZCwKIAkJCQkgdS5waGQucGhkX2VudHJ5KSB7CkBAIC0xMzQsOCArMTM1LDcgQEAKIAkvKiBpZiBoYW5kbGUgd2FzIHN0b3JlZCBpbiBjdHh0LCByZW1vdmUgaXQgdG9vICovCiAJaWYgKGNhdGhhbmRsZS0+bGdoX2N0eHQtPmxvY19oYW5kbGUgPT0gY2F0aGFuZGxlKQogCQljYXRoYW5kbGUtPmxnaF9jdHh0LT5sb2NfaGFuZGxlID0gTlVMTDsKLQlyYyA9IGxsb2dfY2xvc2UoZW52LCBjYXRoYW5kbGUpOwotCXJldHVybiByYzsKKwlyZXR1cm4gbGxvZ19jbG9zZShlbnYsIGNhdGhhbmRsZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGxsb2dfY2F0X2Nsb3NlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19pbnRlcm5hbC5oCmluZGV4IGY3OTQ5NTIuLjIxYTkzYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2ludGVybmFsLmgKQEAgLTcwLDQgKzcwLDkgQEAKIAkJCSBsbG9nX2NiX3QgY2IsIHZvaWQgKmRhdGEsIHZvaWQgKmNhdGRhdGEsIGJvb2wgZm9yayk7CiBpbnQgbGxvZ19jYXRfY2xlYW51cChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsbG9nX2hhbmRsZSAqY2F0aGFuZGxlLAogCQkgICAgIHN0cnVjdCBsbG9nX2hhbmRsZSAqbG9naGFuZGxlLCBpbnQgaW5kZXgpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsbG9nX3JlY19oZHIgKmxsb2dfcmVjX2hkcl9uZXh0KHN0cnVjdCBsbG9nX3JlY19oZHIgKnJlYykKK3sKKwlyZXR1cm4gKHN0cnVjdCBsbG9nX3JlY19oZHIgKikoKGNoYXIgKilyZWMgKyByZWMtPmxyaF9sZW4pOworfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX29iZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19vYmQuYwppbmRleCA2YWNlN2UwLi5hNDI3N2Q2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX29iZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfb2JkLmMKQEAgLTIxMCw3ICsyMTAsNiBAQAogLyogY29udGV4dCBrZXk6IGxsb2dfdGhyZWFkX2tleSAqLwogTFVfQ09OVEVYVF9LRVlfREVGSU5FKGxsb2csIExDVF9NRF9USFJFQUQgfCBMQ1RfTUdfVEhSRUFEIHwgTENUX0xPQ0FMKTsKIExVX0tFWV9JTklUX0dFTkVSSUMobGxvZyk7Ci1FWFBPUlRfU1lNQk9MKGxsb2dfdGhyZWFkX2tleSk7CiAKIGludCBsbG9nX2luZm9faW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19zd2FiLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX3N3YWIuYwppbmRleCBmN2I5YjE5Li44YzRjMWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX3N3YWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX3N3YWIuYwpAQCAtMTcyLDIwICsxNzIsMjMgQEAKIAkJX19zd2FiNjRzKCZjci0+Y3IuY3JfdGltZSk7CiAJCWx1c3RyZV9zd2FiX2x1X2ZpZCgmY3ItPmNyLmNyX3RmaWQpOwogCQlsdXN0cmVfc3dhYl9sdV9maWQoJmNyLT5jci5jcl9wZmlkKTsKLQkJaWYgKENIQU5HRUxPR19SRUNfRVhURU5ERUQoJmNyLT5jcikpIHsKLQkJCXN0cnVjdCBsbG9nX2NoYW5nZWxvZ19leHRfcmVjICpleHQgPQotCQkJCShzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfZXh0X3JlYyAqKXJlYzsKKwkJaWYgKGNyLT5jci5jcl9mbGFncyAmIENMRl9SRU5BTUUpIHsKKwkJCXN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlbmFtZSAqcm5tID0KKwkJCQljaGFuZ2Vsb2dfcmVjX3JlbmFtZSgmY3ItPmNyKTsKIAotCQkJbHVzdHJlX3N3YWJfbHVfZmlkKCZleHQtPmNyLmNyX3NmaWQpOwotCQkJbHVzdHJlX3N3YWJfbHVfZmlkKCZleHQtPmNyLmNyX3NwZmlkKTsKLQkJCXRhaWwgPSAmZXh0LT5jcl90YWlsOwotCQl9IGVsc2UgewotCQkJdGFpbCA9ICZjci0+Y3JfdGFpbDsKKwkJCWx1c3RyZV9zd2FiX2x1X2ZpZCgmcm5tLT5jcl9zZmlkKTsKKwkJCWx1c3RyZV9zd2FiX2x1X2ZpZCgmcm5tLT5jcl9zcGZpZCk7CiAJCX0KLQkJdGFpbCA9IChzdHJ1Y3QgbGxvZ19yZWNfdGFpbCAqKSgoY2hhciAqKXRhaWwgKworCQkvKgorCQkgKiBCZWNhdXNlIHRoZSB0YWlsIGZvbGxvd3MgYSB2YXJpYWJsZS1sZW5ndGggc3RydWN0dXJlIHdlIG5lZWQKKwkJICogdG8gY29tcHV0ZSBpdHMgbG9jYXRpb24gYXQgcnVudGltZQorCQkgKi8KKwkJdGFpbCA9IChzdHJ1Y3QgbGxvZ19yZWNfdGFpbCAqKSgoY2hhciAqKSZjci0+Y3IgKworCQkJCQkJY2hhbmdlbG9nX3JlY19zaXplKCZjci0+Y3IpICsKIAkJCQkJCWNyLT5jci5jcl9uYW1lbGVuKTsKIAkJYnJlYWs7CiAJfQorCiAJY2FzZSBDSEFOR0VMT0dfVVNFUl9SRUM6CiAJewogCQlzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfdXNlcl9yZWMgKmN1ciA9CkBAIC0yMjQsNiArMjI3LDcgQEAKIAkJX19zd2FiMzJzKCZsc3ItPmxzcl91aWRfaCk7CiAJCV9fc3dhYjMycygmbHNyLT5sc3JfZ2lkKTsKIAkJX19zd2FiMzJzKCZsc3ItPmxzcl9naWRfaCk7CisJCV9fc3dhYjY0cygmbHNyLT5sc3JfdmFsaWQpOwogCQl0YWlsID0gJmxzci0+bHNyX3RhaWw7CiAJCWJyZWFrOwogCX0KQEAgLTM0Myw3ICszNDcsNiBAQAogCiAJcHJpbnRfbHVzdHJlX2NmZyhsY2ZnKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbHVzdHJlX2NmZyk7CiAKIC8qIHVzZWQgb25seSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBvbi1kaXNrIGNmZ19tYXJrZXIgZGF0YSAqLwogc3RydWN0IGNmZ19tYXJrZXIzMiB7CkBAIC00MDMsNCArNDA2LDMgQEAKIAkJX19zd2FiNjRzKCZtYXJrZXItPmNtX2NhbmNlbHRpbWUpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfY2ZnX21hcmtlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9scHJvY2ZzX3N0YXR1cy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHByb2Nmc19zdGF0dXMuYwppbmRleCAyNzliNjI1Li44NTJhNWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9scHJvY2ZzX3N0YXR1cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xwcm9jZnNfc3RhdHVzLmMKQEAgLTk2LDYgKzk2LDEyIEBACiAJInBpbmdsZXNzIiwKIAkiZmxvY2tfZGVhZGxvY2siLAogCSJkaXNwX3N0cmlwZSIsCisJIm9wZW5fYnlfZmlkIiwKKwkibGZzY2siLAorCSJ1bmtub3duIiwKKwkidW5saW5rX2Nsb3NlIiwKKwkidW5rbm93biIsCisJImRpcl9zdHJpcGUiLAogCSJ1bmtub3duIiwKIAlOVUxMCiB9OwpAQCAtMzA5LDcgKzMxNSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsZGVidWdmc19hZGRfc2ltcGxlKTsKIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHByb2Nmc19nZW5lcmljX2ZvcHMgPSB7IH07CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBscHJvY2ZzX2dlbmVyaWNfZm9wcyA9IHsgfTsKIAogaW50IGxkZWJ1Z2ZzX2FkZF92YXJzKHN0cnVjdCBkZW50cnkgKnBhcmVudCwKIAkJICAgICAgc3RydWN0IGxwcm9jZnNfdmFycyAqbGlzdCwKQEAgLTYxNSw3ICs2MjEsNiBAQAogCiAJbHByb2Nmc19zdGF0c191bmxvY2soc3RhdHMsIExQUk9DRlNfR0VUX05VTV9DUFUsICZmbGFncyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGxwcm9jZnNfc3RhdHNfY29sbGVjdCk7CiAKIC8qKgogICogQXBwZW5kIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY3VycmVudCBzZXQgZmxhZ3MgdG8gc3RyLgpAQCAtMTA0Myw3ICsxMDQ4LDYgQEAKIAl9CiAJcmV0dXJuIHJjOwogfQotRVhQT1JUX1NZTUJPTChscHJvY2ZzX3N0YXRzX2FsbG9jX29uZSk7CiAKIHN0cnVjdCBscHJvY2ZzX3N0YXRzICpscHJvY2ZzX2FsbG9jX3N0YXRzKHVuc2lnbmVkIGludCBudW0sCiAJCQkJCSAgZW51bSBscHJvY2ZzX3N0YXRzX2ZsYWdzIGZsYWdzKQpAQCAtMTU0Nyw2ICsxNTUxLDE0NiBAQAogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX29oX2NsZWFyKTsKIAoraW50IGxwcm9jZnNfd3Jfcm9vdF9zcXVhc2goY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJCSAgIHN0cnVjdCByb290X3NxdWFzaF9pbmZvICpzcXVhc2gsIGNoYXIgKm5hbWUpCit7CisJY2hhciBrZXJuYnVmWzY0XSwgKnRtcCwgKmVycm1zZzsKKwl1bnNpZ25lZCBsb25nIHVpZCwgZ2lkOworCWludCByYzsKKworCWlmIChjb3VudCA+PSBzaXplb2Yoa2VybmJ1ZikpIHsKKwkJZXJybXNnID0gInN0cmluZyB0b28gbG9uZyI7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWRfbm9wcmludDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKGtlcm5idWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCWVycm1zZyA9ICJiYWQgYWRkcmVzcyI7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBmYWlsZWRfbm9wcmludDsKKwl9CisJa2VybmJ1Zltjb3VudF0gPSAnXDAnOworCisJLyogbG9vayBmb3IgdWlkIGdpZCBzZXBhcmF0b3IgKi8KKwl0bXAgPSBzdHJjaHIoa2VybmJ1ZiwgJzonKTsKKwlpZiAoIXRtcCkgeworCQllcnJtc2cgPSAibmVlZHMgdWlkOmdpZCBmb3JtYXQiOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbGVkOworCX0KKwkqdG1wID0gJ1wwJzsKKwl0bXArKzsKKworCS8qIHBhcnNlIHVpZCAqLworCWlmIChrc3RydG91bChrZXJuYnVmLCAwLCAmdWlkKSAhPSAwKSB7CisJCWVycm1zZyA9ICJiYWQgdWlkIjsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxlZDsKKwl9CisJLyogcGFyc2UgZ2lkICovCisJaWYgKGtzdHJ0b3VsKHRtcCwgMCwgJmdpZCkgIT0gMCkgeworCQllcnJtc2cgPSAiYmFkIGdpZCI7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJc3F1YXNoLT5yc2lfdWlkID0gdWlkOworCXNxdWFzaC0+cnNpX2dpZCA9IGdpZDsKKworCUxDT05TT0xFX0lORk8oIiVzOiByb290X3NxdWFzaCBpcyBzZXQgdG8gJXU6JXVcbiIsCisJCSAgICAgIG5hbWUsIHNxdWFzaC0+cnNpX3VpZCwgc3F1YXNoLT5yc2lfZ2lkKTsKKwlyZXR1cm4gY291bnQ7CisKK2ZhaWxlZDoKKwlpZiAodG1wKSB7CisJCXRtcC0tOworCQkqdG1wID0gJzonOworCX0KKwlDV0FSTigiJXM6IGZhaWxlZCB0byBzZXQgcm9vdF9zcXVhc2ggdG8gXCIlc1wiLCAlcywgcmMgPSAlZFxuIiwKKwkgICAgICBuYW1lLCBrZXJuYnVmLCBlcnJtc2csIHJjKTsKKwlyZXR1cm4gcmM7CitmYWlsZWRfbm9wcmludDoKKwlDV0FSTigiJXM6IGZhaWxlZCB0byBzZXQgcm9vdF9zcXVhc2ggZHVlIHRvICVzLCByYyA9ICVkXG4iLAorCSAgICAgIG5hbWUsIGVycm1zZywgcmMpOworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wobHByb2Nmc193cl9yb290X3NxdWFzaCk7CisKK2ludCBscHJvY2ZzX3dyX25vc3F1YXNoX25pZHMoY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJCSAgICAgc3RydWN0IHJvb3Rfc3F1YXNoX2luZm8gKnNxdWFzaCwgY2hhciAqbmFtZSkKK3sKKwljaGFyICprZXJuYnVmID0gTlVMTCwgKmVycm1zZzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcDsKKwlpbnQgbGVuID0gY291bnQ7CisJaW50IHJjOworCisJaWYgKGNvdW50ID4gNDA5NikgeworCQllcnJtc2cgPSAic3RyaW5nIHRvbyBsb25nIjsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlrZXJuYnVmID0ga3phbGxvYyhjb3VudCArIDEsIEdGUF9OT0ZTKTsKKwlpZiAoIWtlcm5idWYpIHsKKwkJZXJybXNnID0gIm5vIG1lbW9yeSI7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGtlcm5idWYsIGJ1ZmZlciwgY291bnQpKSB7CisJCWVycm1zZyA9ICJiYWQgYWRkcmVzcyI7CisJCXJjID0gLUVGQVVMVDsKKwkJZ290byBmYWlsZWQ7CisJfQorCWtlcm5idWZbY291bnRdID0gJ1wwJzsKKworCWlmIChjb3VudCA+IDAgJiYga2VybmJ1Zltjb3VudCAtIDFdID09ICdcbicpCisJCWxlbiA9IGNvdW50IC0gMTsKKworCWlmICgobGVuID09IDQgJiYgIXN0cm5jbXAoa2VybmJ1ZiwgIk5PTkUiLCBsZW4pKSB8fAorCSAgICAobGVuID09IDUgJiYgIXN0cm5jbXAoa2VybmJ1ZiwgImNsZWFyIiwgbGVuKSkpIHsKKwkJLyogZW1wdHkgc3RyaW5nIGlzIHNwZWNpYWwgY2FzZSAqLworCQlkb3duX3dyaXRlKCZzcXVhc2gtPnJzaV9zZW0pOworCQlpZiAoIWxpc3RfZW1wdHkoJnNxdWFzaC0+cnNpX25vc3F1YXNoX25pZHMpKQorCQkJY2ZzX2ZyZWVfbmlkbGlzdCgmc3F1YXNoLT5yc2lfbm9zcXVhc2hfbmlkcyk7CisJCXVwX3dyaXRlKCZzcXVhc2gtPnJzaV9zZW0pOworCQlMQ09OU09MRV9JTkZPKCIlczogbm9zcXVhc2hfbmlkcyBpcyBjbGVhcmVkXG4iLCBuYW1lKTsKKwkJa2ZyZWUoa2VybmJ1Zik7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmdG1wKTsKKwlpZiAoY2ZzX3BhcnNlX25pZGxpc3Qoa2VybmJ1ZiwgY291bnQsICZ0bXApIDw9IDApIHsKKwkJZXJybXNnID0gImNhbid0IHBhcnNlIjsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGZhaWxlZDsKKwl9CisJTENPTlNPTEVfSU5GTygiJXM6IG5vc3F1YXNoX25pZHMgc2V0IHRvICVzXG4iLAorCQkgICAgICBuYW1lLCBrZXJuYnVmKTsKKwlrZnJlZShrZXJuYnVmKTsKKwlrZXJuYnVmID0gTlVMTDsKKworCWRvd25fd3JpdGUoJnNxdWFzaC0+cnNpX3NlbSk7CisJaWYgKCFsaXN0X2VtcHR5KCZzcXVhc2gtPnJzaV9ub3NxdWFzaF9uaWRzKSkKKwkJY2ZzX2ZyZWVfbmlkbGlzdCgmc3F1YXNoLT5yc2lfbm9zcXVhc2hfbmlkcyk7CisJbGlzdF9zcGxpY2UoJnRtcCwgJnNxdWFzaC0+cnNpX25vc3F1YXNoX25pZHMpOworCXVwX3dyaXRlKCZzcXVhc2gtPnJzaV9zZW0pOworCisJcmV0dXJuIGNvdW50OworCitmYWlsZWQ6CisJaWYgKGtlcm5idWYpIHsKKwkJQ1dBUk4oIiVzOiBmYWlsZWQgdG8gc2V0IG5vc3F1YXNoX25pZHMgdG8gXCIlc1wiLCAlcyByYyA9ICVkXG4iLAorCQkgICAgICBuYW1lLCBrZXJuYnVmLCBlcnJtc2csIHJjKTsKKwkJa2ZyZWUoa2VybmJ1Zik7CisJCWtlcm5idWYgPSBOVUxMOworCX0gZWxzZSB7CisJCUNXQVJOKCIlczogZmFpbGVkIHRvIHNldCBub3NxdWFzaF9uaWRzIGR1ZSB0byAlcyByYyA9ICVkXG4iLAorCQkgICAgICBuYW1lLCBlcnJtc2csIHJjKTsKKwl9CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChscHJvY2ZzX3dyX25vc3F1YXNoX25pZHMpOworCiBzdGF0aWMgc3NpemVfdCBsdXN0cmVfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAogCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKaW5kZXggOWIwMzA1OS4uMDU0ZTU2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKQEAgLTU1LDYgKzU1LDM0IEBACiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdV9yZWYuaCIKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKK2VudW0geworCUxVX0NBQ0hFX1BFUkNFTlRfTUFYCSA9IDUwLAorCUxVX0NBQ0hFX1BFUkNFTlRfREVGQVVMVCA9IDIwCit9OworCisjZGVmaW5lIExVX0NBQ0hFX05SX01BWF9BREpVU1QJCTEyOAorI2RlZmluZSBMVV9DQUNIRV9OUl9VTkxJTUlURUQJCS0xCisjZGVmaW5lIExVX0NBQ0hFX05SX0RFRkFVTFQJCUxVX0NBQ0hFX05SX1VOTElNSVRFRAorI2RlZmluZSBMVV9DQUNIRV9OUl9MRElTS0ZTX0xJTUlUCUxVX0NBQ0hFX05SX1VOTElNSVRFRAorI2RlZmluZSBMVV9DQUNIRV9OUl9aRlNfTElNSVQJCTI1NgorCisjZGVmaW5lIExVX1NJVEVfQklUU19NSU4JMTIKKyNkZWZpbmUgTFVfU0lURV9CSVRTX01BWAkyNAorLyoqCisgKiB0b3RhbCAyNTYgYnVja2V0cywgd2UgZG9uJ3Qgd2FudCB0b28gbWFueSBidWNrZXRzIGJlY2F1c2U6CisgKiAtIGNvbnN1bWUgdG9vIG11Y2ggbWVtb3J5CisgKiAtIGF2b2lkIHVuYmFsYW5jZWQgTFJVIGxpc3QKKyAqLworI2RlZmluZSBMVV9TSVRFX0JLVF9CSVRTCTgKKworc3RhdGljIHVuc2lnbmVkIGludCBsdV9jYWNoZV9wZXJjZW50ID0gTFVfQ0FDSEVfUEVSQ0VOVF9ERUZBVUxUOworbW9kdWxlX3BhcmFtKGx1X2NhY2hlX3BlcmNlbnQsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGx1X2NhY2hlX3BlcmNlbnQsICJQZXJjZW50YWdlIG9mIG1lbW9yeSB0byBiZSB1c2VkIGFzIGx1X29iamVjdCBjYWNoZSIpOworCitzdGF0aWMgbG9uZyBsdV9jYWNoZV9uciA9IExVX0NBQ0hFX05SX0RFRkFVTFQ7Cittb2R1bGVfcGFyYW0obHVfY2FjaGVfbnIsIGxvbmcsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhsdV9jYWNoZV9uciwgIk1heGltdW0gbnVtYmVyIG9mIG9iamVjdHMgaW4gbHVfb2JqZWN0IGNhY2hlIik7CisKIHN0YXRpYyB2b2lkIGx1X29iamVjdF9mcmVlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGx1X29iamVjdCAqbyk7CiBzdGF0aWMgX191MzIgbHNfc3RhdHNfcmVhZChzdHJ1Y3QgbHByb2Nmc19zdGF0cyAqc3RhdHMsIGludCBpZHgpOwogCkBAIC0zMTAsMTAgKzMzOCwxMCBAQAogCXN0cnVjdCBjZnNfaGFzaF9iZAkgICAgYmQyOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICAgIGRpc3Bvc2U7CiAJaW50CQkgICAgICBkaWRfc3RoOwotCWludAkJICAgICAgc3RhcnQ7CisJdW5zaWduZWQgaW50IHN0YXJ0OwogCWludAkJICAgICAgY291bnQ7CiAJaW50CQkgICAgICBibnI7Ci0JaW50CQkgICAgICBpOworCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX09CRF9OT19MUlUpKQogCQlyZXR1cm4gMDsKQEAgLTMyNCw4ICszNTIsMTMgQEAKIAkgKiB0aGUgZGlzcG9zZSBsaXN0LCByZW1vdmluZyB0aGVtIGZyb20gTFJVIGFuZCBoYXNoIHRhYmxlLgogCSAqLwogCXN0YXJ0ID0gcy0+bHNfcHVyZ2Vfc3RhcnQ7Ci0JYm5yID0gKG5yID09IH4wKSA/IC0xIDogbnIgLyBDRlNfSEFTSF9OQktUKHMtPmxzX29ial9oYXNoKSArIDE7CisJYm5yID0gKG5yID09IH4wKSA/IC0xIDogbnIgLyAoaW50KUNGU19IQVNIX05CS1Qocy0+bHNfb2JqX2hhc2gpICsgMTsKICBhZ2FpbjoKKwkvKgorCSAqIEl0IGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UgdG8gbWFrZSBwdXJnZSB0aHJlYWRzIHBhcmFsbGVsLCB0aGF0IGNhbgorCSAqIG9ubHkgYnJpbmcgdHJvdWJsZXMgdG8gdXMuIFNlZSBMVS01MzMxLgorCSAqLworCW11dGV4X2xvY2soJnMtPmxzX3B1cmdlX211dGV4KTsKIAlkaWRfc3RoID0gMDsKIAljZnNfaGFzaF9mb3JfZWFjaF9idWNrZXQocy0+bHNfb2JqX2hhc2gsICZiZCwgaSkgewogCQlpZiAoaSA8IHN0YXJ0KQpAQCAtMzcxLDYgKzQwNCw3IEBACiAJCWlmIChuciA9PSAwKQogCQkJYnJlYWs7CiAJfQorCW11dGV4X3VubG9jaygmcy0+bHNfcHVyZ2VfbXV0ZXgpOwogCiAJaWYgKG5yICE9IDAgJiYgZGlkX3N0aCAmJiBzdGFydCAhPSAwKSB7CiAJCXN0YXJ0ID0gMDsgLyogcmVzdGFydCBmcm9tIHRoZSBmaXJzdCBidWNrZXQgKi8KQEAgLTU3Myw2ICs2MDcsMjcgQEAKIAlyZXR1cm4gbHVfb2JqZWN0X2ZpbmRfYXQoZW52LCBkZXYtPmxkX3NpdGUtPmxzX3RvcF9kZXYsIGYsIGNvbmYpOwogfQogCisvKgorICogTGltaXQgdGhlIGx1X29iamVjdCBjYWNoZSB0byBhIG1heGltdW0gb2YgbHVfY2FjaGVfbnIgb2JqZWN0cy4gIEJlY2F1c2UKKyAqIHRoZSBjYWxjdWxhdGlvbiBmb3IgdGhlIG51bWJlciBvZiBvYmplY3RzIHRvIHJlY2xhaW0gaXMgbm90IGNvdmVyZWQgYnkKKyAqIGEgbG9jayB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb2JqZWN0cyBpcyBjYXBwZWQgYnkgTFVfQ0FDSEVfTUFYX0FESlVTVC4KKyAqIFRoaXMgZW5zdXJlcyB0aGF0IG1hbnkgY29uY3VycmVudCB0aHJlYWRzIHdpbGwgbm90IGFjY2lkZW50YWxseSBwdXJnZQorICogdGhlIGVudGlyZSBjYWNoZS4KKyAqLworc3RhdGljIHZvaWQgbHVfb2JqZWN0X2xpbWl0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGx1X2RldmljZSAqZGV2KQoreworCV9fdTY0IHNpemUsIG5yOworCisJaWYgKGx1X2NhY2hlX25yID09IExVX0NBQ0hFX05SX1VOTElNSVRFRCkKKwkJcmV0dXJuOworCisJc2l6ZSA9IGNmc19oYXNoX3NpemVfZ2V0KGRldi0+bGRfc2l0ZS0+bHNfb2JqX2hhc2gpOworCW5yID0gKF9fdTY0KWx1X2NhY2hlX25yOworCWlmIChzaXplID4gbnIpCisJCWx1X3NpdGVfcHVyZ2UoZW52LCBkZXYtPmxkX3NpdGUsCisJCQkgICAgICBtaW5fdChfX3U2NCwgc2l6ZSAtIG5yLCBMVV9DQUNIRV9OUl9NQVhfQURKVVNUKSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgbHVfb2JqZWN0ICpsdV9vYmplY3RfbmV3KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJCQkgICAgICAgc3RydWN0IGx1X2RldmljZSAqZGV2LAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbHVfZmlkICpmLApAQCAtNTkwLDYgKzY0NSw5IEBACiAJY2ZzX2hhc2hfYmRfZ2V0X2FuZF9sb2NrKGhzLCAodm9pZCAqKWYsICZiZCwgMSk7CiAJY2ZzX2hhc2hfYmRfYWRkX2xvY2tlZChocywgJmJkLCAmby0+bG9faGVhZGVyLT5sb2hfaGFzaCk7CiAJY2ZzX2hhc2hfYmRfdW5sb2NrKGhzLCAmYmQsIDEpOworCisJbHVfb2JqZWN0X2xpbWl0KGVudiwgZGV2KTsKKwogCXJldHVybiBvOwogfQogCkBAIC02NTYsNiArNzE0LDkgQEAKIAlpZiAobGlrZWx5KFBUUl9FUlIoc2hhZG93KSA9PSAtRU5PRU5UKSkgewogCQljZnNfaGFzaF9iZF9hZGRfbG9ja2VkKGhzLCAmYmQsICZvLT5sb19oZWFkZXItPmxvaF9oYXNoKTsKIAkJY2ZzX2hhc2hfYmRfdW5sb2NrKGhzLCAmYmQsIDEpOworCisJCWx1X29iamVjdF9saW1pdChlbnYsIGRldik7CisKIAkJcmV0dXJuIG87CiAJfQogCkBAIC03MDYsMTMgKzc2NywxNSBAQAogCXN0cnVjdCBsdV9vYmplY3QgKm9iajsKIAogCXRvcCA9IGx1X29iamVjdF9maW5kKGVudiwgZGV2LCBmLCBjb25mKTsKLQlpZiAoIUlTX0VSUih0b3ApKSB7Ci0JCW9iaiA9IGx1X29iamVjdF9sb2NhdGUodG9wLT5sb19oZWFkZXIsIGRldi0+bGRfdHlwZSk7Ci0JCWlmICghb2JqKQotCQkJbHVfb2JqZWN0X3B1dChlbnYsIHRvcCk7Ci0JfSBlbHNlIHsKLQkJb2JqID0gdG9wOworCWlmIChJU19FUlIodG9wKSkKKwkJcmV0dXJuIHRvcDsKKworCW9iaiA9IGx1X29iamVjdF9sb2NhdGUodG9wLT5sb19oZWFkZXIsIGRldi0+bGRfdHlwZSk7CisJaWYgKHVubGlrZWx5KCFvYmopKSB7CisJCWx1X29iamVjdF9wdXQoZW52LCB0b3ApOworCQlvYmogPSBFUlJfUFRSKC1FTk9FTlQpOwogCX0KKwogCXJldHVybiBvYmo7CiB9CiBFWFBPUlRfU1lNQk9MKGx1X29iamVjdF9maW5kX3NsaWNlKTsKQEAgLTcyNiwzNCArNzg5LDMxIEBACiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKKwlhdG9taWNfc2V0KCZsZHQtPmxkdF9kZXZpY2VfbnIsIDApOwogCUlOSVRfTElTVF9IRUFEKCZsZHQtPmxkdF9saW5rYWdlKTsKIAlpZiAobGR0LT5sZHRfb3BzLT5sZHRvX2luaXQpCiAJCXJlc3VsdCA9IGxkdC0+bGR0X29wcy0+bGR0b19pbml0KGxkdCk7Ci0JaWYgKHJlc3VsdCA9PSAwKQorCisJaWYgKCFyZXN1bHQpIHsKKwkJc3Bpbl9sb2NrKCZvYmRfdHlwZXNfbG9jayk7CiAJCWxpc3RfYWRkKCZsZHQtPmxkdF9saW5rYWdlLCAmbHVfZGV2aWNlX3R5cGVzKTsKKwkJc3Bpbl91bmxvY2soJm9iZF90eXBlc19sb2NrKTsKKwl9CisKIAlyZXR1cm4gcmVzdWx0OwogfQogRVhQT1JUX1NZTUJPTChsdV9kZXZpY2VfdHlwZV9pbml0KTsKIAogdm9pZCBsdV9kZXZpY2VfdHlwZV9maW5pKHN0cnVjdCBsdV9kZXZpY2VfdHlwZSAqbGR0KQogeworCXNwaW5fbG9jaygmb2JkX3R5cGVzX2xvY2spOwogCWxpc3RfZGVsX2luaXQoJmxkdC0+bGR0X2xpbmthZ2UpOworCXNwaW5fdW5sb2NrKCZvYmRfdHlwZXNfbG9jayk7CiAJaWYgKGxkdC0+bGR0X29wcy0+bGR0b19maW5pKQogCQlsZHQtPmxkdF9vcHMtPmxkdG9fZmluaShsZHQpOwogfQogRVhQT1JUX1NZTUJPTChsdV9kZXZpY2VfdHlwZV9maW5pKTsKIAotdm9pZCBsdV90eXBlc19zdG9wKHZvaWQpCi17Ci0Jc3RydWN0IGx1X2RldmljZV90eXBlICpsZHQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxkdCwgJmx1X2RldmljZV90eXBlcywgbGR0X2xpbmthZ2UpIHsKLQkJaWYgKGxkdC0+bGR0X2RldmljZV9uciA9PSAwICYmIGxkdC0+bGR0X29wcy0+bGR0b19zdG9wKQotCQkJbGR0LT5sZHRfb3BzLT5sZHRvX3N0b3AobGR0KTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGx1X3R5cGVzX3N0b3ApOwotCiAvKioKICAqIEdsb2JhbCBsaXN0IG9mIGFsbCBzaXRlcyBvbiB0aGlzIG5vZGUKICAqLwpAQCAtODA4LDIyICs4NjgsMTQgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVfc2l0ZV9wcmludCk7CiAKLWVudW0gewotCUxVX0NBQ0hFX1BFUkNFTlRfTUFYICAgICA9IDUwLAotCUxVX0NBQ0hFX1BFUkNFTlRfREVGQVVMVCA9IDIwCi19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGx1X2NhY2hlX3BlcmNlbnQgPSBMVV9DQUNIRV9QRVJDRU5UX0RFRkFVTFQ7Ci1tb2R1bGVfcGFyYW0obHVfY2FjaGVfcGVyY2VudCwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobHVfY2FjaGVfcGVyY2VudCwgIlBlcmNlbnRhZ2Ugb2YgbWVtb3J5IHRvIGJlIHVzZWQgYXMgbHVfb2JqZWN0IGNhY2hlIik7Ci0KIC8qKgogICogUmV0dXJuIGRlc2lyZWQgaGFzaCB0YWJsZSBvcmRlci4KICAqLwotc3RhdGljIGludCBsdV9odGFibGVfb3JkZXIodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGx1X2h0YWJsZV9vcmRlcihzdHJ1Y3QgbHVfZGV2aWNlICp0b3ApCiB7CisJdW5zaWduZWQgbG9uZyBiaXRzX21heCA9IExVX1NJVEVfQklUU19NQVg7CiAJdW5zaWduZWQgbG9uZyBjYWNoZV9zaXplOwotCWludCBiaXRzOworCXVuc2lnbmVkIGxvbmcgYml0czsKIAogCS8qCiAJICogQ2FsY3VsYXRlIGhhc2ggdGFibGUgc2l6ZSwgYXNzdW1pbmcgdGhhdCB3ZSB3YW50IHJlYXNvbmFibGUKQEAgLTg1NCw3ICs5MDYsNyBAQAogCWZvciAoYml0cyA9IDE7ICgxIDw8IGJpdHMpIDwgY2FjaGVfc2l6ZTsgKytiaXRzKSB7CiAJCTsKIAl9Ci0JcmV0dXJuIGJpdHM7CisJcmV0dXJuIGNsYW1wX3QodHlwZW9mKGJpdHMpLCBiaXRzLCBMVV9TSVRFX0JJVFNfTUlOLCBiaXRzX21heCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsdV9vYmpfaG9wX2hhc2goc3RydWN0IGNmc19oYXNoICpocywKQEAgLTkzMCwyOCArOTgyLDE4IEBACiAvKioKICAqIEluaXRpYWxpemUgc2l0ZSBcYSBzLCB3aXRoIFxhIGQgYXMgdGhlIHRvcCBsZXZlbCBkZXZpY2UuCiAgKi8KLSNkZWZpbmUgTFVfU0lURV9CSVRTX01JTiAgICAxMgotI2RlZmluZSBMVV9TSVRFX0JJVFNfTUFYICAgIDE5Ci0vKioKLSAqIHRvdGFsIDI1NiBidWNrZXRzLCB3ZSBkb24ndCB3YW50IHRvbyBtYW55IGJ1Y2tldHMgYmVjYXVzZToKLSAqIC0gY29uc3VtZSB0b28gbXVjaCBtZW1vcnkKLSAqIC0gYXZvaWQgdW5iYWxhbmNlZCBMUlUgbGlzdAotICovCi0jZGVmaW5lIExVX1NJVEVfQktUX0JJVFMgICAgOAotCiBpbnQgbHVfc2l0ZV9pbml0KHN0cnVjdCBsdV9zaXRlICpzLCBzdHJ1Y3QgbHVfZGV2aWNlICp0b3ApCiB7CiAJc3RydWN0IGx1X3NpdGVfYmt0X2RhdGEgKmJrdDsKIAlzdHJ1Y3QgY2ZzX2hhc2hfYmQgYmQ7CisJdW5zaWduZWQgbG9uZyBiaXRzOworCXVuc2lnbmVkIGxvbmcgaTsKIAljaGFyIG5hbWVbMTZdOwotCWludCBiaXRzOwotCWludCBpOwogCiAJbWVtc2V0KHMsIDAsIHNpemVvZigqcykpOwotCWJpdHMgPSBsdV9odGFibGVfb3JkZXIoKTsKLQlzbnByaW50ZihuYW1lLCAxNiwgImx1X3NpdGVfJXMiLCB0b3AtPmxkX3R5cGUtPmxkdF9uYW1lKTsKLQlmb3IgKGJpdHMgPSBtaW4obWF4KExVX1NJVEVfQklUU19NSU4sIGJpdHMpLCBMVV9TSVRFX0JJVFNfTUFYKTsKLQkgICAgIGJpdHMgPj0gTFVfU0lURV9CSVRTX01JTjsgYml0cy0tKSB7CisJbXV0ZXhfaW5pdCgmcy0+bHNfcHVyZ2VfbXV0ZXgpOworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImx1X3NpdGVfJXMiLCB0b3AtPmxkX3R5cGUtPmxkdF9uYW1lKTsKKwlmb3IgKGJpdHMgPSBsdV9odGFibGVfb3JkZXIodG9wKTsgYml0cyA+PSBMVV9TSVRFX0JJVFNfTUlOOyBiaXRzLS0pIHsKIAkJcy0+bHNfb2JqX2hhc2ggPSBjZnNfaGFzaF9jcmVhdGUobmFtZSwgYml0cywgYml0cywKIAkJCQkJCSBiaXRzIC0gTFVfU0lURV9CS1RfQklUUywKIAkJCQkJCSBzaXplb2YoKmJrdCksIDAsIDAsCkBAIC05NTksMTMgKzEwMDEsMTQgQEAKIAkJCQkJCSBDRlNfSEFTSF9TUElOX0JLVExPQ0sgfAogCQkJCQkJIENGU19IQVNIX05PX0lURU1SRUYgfAogCQkJCQkJIENGU19IQVNIX0RFUFRIIHwKLQkJCQkJCSBDRlNfSEFTSF9BU1NFUlRfRU1QVFkpOworCQkJCQkJIENGU19IQVNIX0FTU0VSVF9FTVBUWSB8CisJCQkJCQkgQ0ZTX0hBU0hfQ09VTlRFUik7CiAJCWlmIChzLT5sc19vYmpfaGFzaCkKIAkJCWJyZWFrOwogCX0KIAogCWlmICghcy0+bHNfb2JqX2hhc2gpIHsKLQkJQ0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGx1X3NpdGUgaGFzaCB3aXRoIGJpdHM6ICVkXG4iLCBiaXRzKTsKKwkJQ0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGx1X3NpdGUgaGFzaCB3aXRoIGJpdHM6ICVsdVxuIiwgYml0cyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMTA4Miw4ICsxMTI1LDEwIEBACiAgKi8KIGludCBsdV9kZXZpY2VfaW5pdChzdHJ1Y3QgbHVfZGV2aWNlICpkLCBzdHJ1Y3QgbHVfZGV2aWNlX3R5cGUgKnQpCiB7Ci0JaWYgKHQtPmxkdF9kZXZpY2VfbnIrKyA9PSAwICYmIHQtPmxkdF9vcHMtPmxkdG9fc3RhcnQpCisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZ0LT5sZHRfZGV2aWNlX25yKSA9PSAxICYmCisJICAgIHQtPmxkdF9vcHMtPmxkdG9fc3RhcnQpCiAJCXQtPmxkdF9vcHMtPmxkdG9fc3RhcnQodCk7CisKIAltZW1zZXQoZCwgMCwgc2l6ZW9mKCpkKSk7CiAJYXRvbWljX3NldCgmZC0+bGRfcmVmLCAwKTsKIAlkLT5sZF90eXBlID0gdDsKQEAgLTEwOTgsOSArMTE0Myw4IEBACiAgKi8KIHZvaWQgbHVfZGV2aWNlX2Zpbmkoc3RydWN0IGx1X2RldmljZSAqZCkKIHsKLQlzdHJ1Y3QgbHVfZGV2aWNlX3R5cGUgKnQ7CisJc3RydWN0IGx1X2RldmljZV90eXBlICp0ID0gZC0+bGRfdHlwZTsKIAotCXQgPSBkLT5sZF90eXBlOwogCWlmIChkLT5sZF9vYmQpIHsKIAkJZC0+bGRfb2JkLT5vYmRfbHVfZGV2ID0gTlVMTDsKIAkJZC0+bGRfb2JkID0gTlVMTDsKQEAgLTExMDksOCArMTE1MywxMCBAQAogCWx1X3JlZl9maW5pKCZkLT5sZF9yZWZlcmVuY2UpOwogCUxBU1NFUlRGKGF0b21pY19yZWFkKCZkLT5sZF9yZWYpID09IDAsCiAJCSAiUmVmY291bnQgaXMgJXVcbiIsIGF0b21pY19yZWFkKCZkLT5sZF9yZWYpKTsKLQlMQVNTRVJUKHQtPmxkdF9kZXZpY2VfbnIgPiAwKTsKLQlpZiAoLS10LT5sZHRfZGV2aWNlX25yID09IDAgJiYgdC0+bGR0X29wcy0+bGR0b19zdG9wKQorCUxBU1NFUlQoYXRvbWljX3JlYWQoJnQtPmxkdF9kZXZpY2VfbnIpID4gMCk7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdC0+bGR0X2RldmljZV9ucikgJiYKKwkgICAgdC0+bGR0X29wcy0+bGR0b19zdG9wKQogCQl0LT5sZHRfb3BzLT5sZHRvX3N0b3AodCk7CiB9CiBFWFBPUlRfU1lNQk9MKGx1X2RldmljZV9maW5pKTsKQEAgLTEyNTQsNyArMTMwMCw2IEBACiAJCX0KIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1X3N0YWNrX2ZpbmkpOwogCiBlbnVtIHsKIAkvKioKQEAgLTEyODEsNyArMTMyNiw3IEBACiBpbnQgbHVfY29udGV4dF9rZXlfcmVnaXN0ZXIoc3RydWN0IGx1X2NvbnRleHRfa2V5ICprZXkpCiB7CiAJaW50IHJlc3VsdDsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCUxBU1NFUlQoa2V5LT5sY3RfaW5pdCk7CiAJTEFTU0VSVChrZXktPmxjdF9maW5pKTsKQEAgLTE0NzYsMTggKzE1MjEsMTYgQEAKIAkJKytrZXlfc2V0X3ZlcnNpb247CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdV9jb250ZXh0X2tleV9xdWllc2NlKTsKIAogdm9pZCBsdV9jb250ZXh0X2tleV9yZXZpdmUoc3RydWN0IGx1X2NvbnRleHRfa2V5ICprZXkpCiB7CiAJa2V5LT5sY3RfdGFncyAmPSB+TENUX1FVSUVTQ0VOVDsKIAkrK2tleV9zZXRfdmVyc2lvbjsKIH0KLUVYUE9SVF9TWU1CT0wobHVfY29udGV4dF9rZXlfcmV2aXZlKTsKIAogc3RhdGljIHZvaWQga2V5c19maW5pKHN0cnVjdCBsdV9jb250ZXh0ICpjdHgpCiB7Ci0JaW50CWk7CisJdW5zaWduZWQgaW50IGk7CiAKIAlpZiAoIWN0eC0+bGNfdmFsdWUpCiAJCXJldHVybjsKQEAgLTE1MDEsNyArMTU0NCw3IEBACiAKIHN0YXRpYyBpbnQga2V5c19maWxsKHN0cnVjdCBsdV9jb250ZXh0ICpjdHgpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAlMSU5WUk5UKGN0eC0+bGNfdmFsdWUpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGx1X2tleXMpOyArK2kpIHsKQEAgLTE2MTQsNyArMTY1Nyw3IEBACiAgKi8KIHZvaWQgbHVfY29udGV4dF9leGl0KHN0cnVjdCBsdV9jb250ZXh0ICpjdHgpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgaW50IGk7CiAKIAlMSU5WUk5UKGN0eC0+bGNfc3RhdGUgPT0gTENTX0VOVEVSRUQpOwogCWN0eC0+bGNfc3RhdGUgPSBMQ1NfTEVGVDsKQEAgLTE2NDIsNyArMTY4NSw2IEBACiB7CiAJcmV0dXJuIGxpa2VseShjdHgtPmxjX3ZlcnNpb24gPT0ga2V5X3NldF92ZXJzaW9uKSA/IDAgOiBrZXlzX2ZpbGwoY3R4KTsKIH0KLUVYUE9SVF9TWU1CT0wobHVfY29udGV4dF9yZWZpbGwpOwogCiAvKioKICAqIGx1X2N0eF90YWdzL2x1X3Nlc190YWdzIHdpbGwgYmUgdXBkYXRlZCBpZiB0aGVyZSBhcmUgbmV3IHR5cGVzIG9mCkBAIC0xNjk2LDcgKzE3MzgsNyBAQAogCQkJICAgICAgc3RydWN0IGx1X3NpdGVfc3RhdHMgKnN0YXRzLCBpbnQgcG9wdWxhdGVkKQogewogCXN0cnVjdCBjZnNfaGFzaF9iZCBiZDsKLQlpbnQJICAgaTsKKwl1bnNpZ25lZCBpbnQgaTsKIAogCWNmc19oYXNoX2Zvcl9lYWNoX2J1Y2tldChocywgJmJkLCBpKSB7CiAJCXN0cnVjdCBsdV9zaXRlX2JrdF9kYXRhICpia3QgPSBjZnNfaGFzaF9iZF9leHRyYV9nZXQoaHMsICZiZCk7CkBAIC0xOTQwLDMgKzE5ODIsNzMgQEAKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGx1X2ttZW1fZmluaSk7CisKK3ZvaWQgbHVfYnVmX2ZyZWUoc3RydWN0IGx1X2J1ZiAqYnVmKQoreworCUxBU1NFUlQoYnVmKTsKKwlpZiAoYnVmLT5sYl9idWYpIHsKKwkJTEFTU0VSVChidWYtPmxiX2xlbiA+IDApOworCQlrdmZyZWUoYnVmLT5sYl9idWYpOworCQlidWYtPmxiX2J1ZiA9IE5VTEw7CisJCWJ1Zi0+bGJfbGVuID0gMDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGx1X2J1Zl9mcmVlKTsKKwordm9pZCBsdV9idWZfYWxsb2Moc3RydWN0IGx1X2J1ZiAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlMQVNTRVJUKGJ1Zik7CisJTEFTU0VSVCghYnVmLT5sYl9idWYpOworCUxBU1NFUlQoIWJ1Zi0+bGJfbGVuKTsKKwlidWYtPmxiX2J1ZiA9IGxpYmNmc19rdnphbGxvYyhzaXplLCBHRlBfTk9GUyk7CisJaWYgKGxpa2VseShidWYtPmxiX2J1ZikpCisJCWJ1Zi0+bGJfbGVuID0gc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0wobHVfYnVmX2FsbG9jKTsKKwordm9pZCBsdV9idWZfcmVhbGxvYyhzdHJ1Y3QgbHVfYnVmICpidWYsIHNpemVfdCBzaXplKQoreworCWx1X2J1Zl9mcmVlKGJ1Zik7CisJbHVfYnVmX2FsbG9jKGJ1Ziwgc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGx1X2J1Zl9yZWFsbG9jKTsKKworc3RydWN0IGx1X2J1ZiAqbHVfYnVmX2NoZWNrX2FuZF9hbGxvYyhzdHJ1Y3QgbHVfYnVmICpidWYsIHNpemVfdCBsZW4pCit7CisJaWYgKCFidWYtPmxiX2J1ZiAmJiAhYnVmLT5sYl9sZW4pCisJCWx1X2J1Zl9hbGxvYyhidWYsIGxlbik7CisKKwlpZiAoKGxlbiA+IGJ1Zi0+bGJfbGVuKSAmJiBidWYtPmxiX2J1ZikKKwkJbHVfYnVmX3JlYWxsb2MoYnVmLCBsZW4pOworCisJcmV0dXJuIGJ1ZjsKK30KK0VYUE9SVF9TWU1CT0wobHVfYnVmX2NoZWNrX2FuZF9hbGxvYyk7CisKKy8qKgorICogSW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFxhIGJ1Zi4KKyAqIHByZXNlcnZlcyBvbGQgZGF0YSBpbiBidWZmZXIKKyAqIG9sZCBidWZmZXIgcmVtYWlucyB1bmNoYW5nZWQgb24gZXJyb3IKKyAqIFxyZXR2YWwgMCBvciAtRU5PTUVNCisgKi8KK2ludCBsdV9idWZfY2hlY2tfYW5kX2dyb3coc3RydWN0IGx1X2J1ZiAqYnVmLCBzaXplX3QgbGVuKQoreworCWNoYXIgKnB0cjsKKworCWlmIChsZW4gPD0gYnVmLT5sYl9sZW4pCisJCXJldHVybiAwOworCisJcHRyID0gbGliY2ZzX2t2emFsbG9jKGxlbiwgR0ZQX05PRlMpOworCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEZyZWUgdGhlIG9sZCBidWYgKi8KKwlpZiAoYnVmLT5sYl9idWYpIHsKKwkJbWVtY3B5KHB0ciwgYnVmLT5sYl9idWYsIGJ1Zi0+bGJfbGVuKTsKKwkJa3ZmcmVlKGJ1Zi0+bGJfYnVmKTsKKwl9CisKKwlidWYtPmxiX2J1ZiA9IHB0cjsKKwlidWYtPmxiX2xlbiA9IGxlbjsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1c3RyZV9oYW5kbGVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdXN0cmVfaGFuZGxlcy5jCmluZGV4IDA4MmY1MzAuLmM5NDQ1ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1c3RyZV9oYW5kbGVzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVzdHJlX2hhbmRsZXMuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsYXNzX2hhbmRsZV91bmhhc2gpOwogCi12b2lkICpjbGFzc19oYW5kbGUyb2JqZWN0KF9fdTY0IGNvb2tpZSkKK3ZvaWQgKmNsYXNzX2hhbmRsZTJvYmplY3QoX191NjQgY29va2llLCBjb25zdCB2b2lkICpvd25lcikKIHsKIAlzdHJ1Y3QgaGFuZGxlX2J1Y2tldCAqYnVja2V0OwogCXN0cnVjdCBwb3J0YWxzX2hhbmRsZSAqaDsKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGgsICZidWNrZXQtPmhlYWQsIGhfbGluaykgewotCQlpZiAoaC0+aF9jb29raWUgIT0gY29va2llKQorCQlpZiAoaC0+aF9jb29raWUgIT0gY29va2llIHx8IGgtPmhfb3duZXIgIT0gb3duZXIpCiAJCQljb250aW51ZTsKIAogCQlzcGluX2xvY2soJmgtPmhfbG9jayk7CkBAIC0xNjQsOCArMTY0LDExIEBACiAKIHZvaWQgY2xhc3NfaGFuZGxlX2ZyZWVfY2Ioc3RydWN0IHJjdV9oZWFkICpyY3UpCiB7Ci0Jc3RydWN0IHBvcnRhbHNfaGFuZGxlICpoID0gUkNVMkhBTkRMRShyY3UpOwotCXZvaWQgKnB0ciA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpaC0+aF9jb29raWU7CisJc3RydWN0IHBvcnRhbHNfaGFuZGxlICpoOworCXZvaWQgKnB0cjsKKworCWggPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgcG9ydGFsc19oYW5kbGUsIGhfcmN1KTsKKwlwdHIgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWgtPmhfY29va2llOwogCiAJaWYgKGgtPmhfb3BzLT5ob3BfZnJlZSkKIAkJaC0+aF9vcHMtPmhvcF9mcmVlKHB0ciwgaC0+aF9zaXplKTsKQEAgLTIxNCw3ICsyMTcsNyBAQAogCQlzdHJ1Y3QgcG9ydGFsc19oYW5kbGUgKmg7CiAKIAkJc3Bpbl9sb2NrKCZoYW5kbGVfaGFzaFtpXS5sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaCwgJihoYW5kbGVfaGFzaFtpXS5oZWFkKSwgaF9saW5rKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGgsICZoYW5kbGVfaGFzaFtpXS5oZWFkLCBoX2xpbmspIHsKIAkJCUNFUlJPUigiZm9yY2UgY2xlYW4gaGFuZGxlICUjbGx4IGFkZHIgJXAgb3BzICVwXG4iLAogCQkJICAgICAgIGgtPmhfY29va2llLCBoLCBoLT5oX29wcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1c3RyZV9wZWVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sdXN0cmVfcGVlci5jCmluZGV4IDU5NzRhOWIuLmZmYTc0MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1c3RyZV9wZWVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVzdHJlX3BlZXIuYwpAQCAtMTM5LDcgKzEzOSw2IEBACiAJfQogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChjbGFzc19hZGRfdXVpZCk7CiAKIC8qIERlbGV0ZSB0aGUgbmlkcyBmb3Igb25lIHV1aWQgaWYgc3BlY2lmaWVkLCBvdGhlcndpc2UgZGVsZXRlIGFsbCAqLwogaW50IGNsYXNzX2RlbF91dWlkKGNvbnN0IGNoYXIgKnV1aWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfY29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRfY29uZmlnLmMKaW5kZXggMGVhYjEyMy4uYmJlZDFiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9jb25maWcuYwpAQCAtMzcsNiArMzcsNyBAQAogI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19DTEFTUwogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbG9nLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX3BhcmFtLmgiCkBAIC0yMzcsNyArMjM4LDcgQEAKIAkvKiByZWNvdmVyeSBkYXRhICovCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmb2JkLT5vYmRfZXZpY3RfaW5wcm9ncmVzc193YWl0cSk7CiAKLQlsbG9nX2dyb3VwX2luaXQoJm9iZC0+b2JkX29sZywgRklEX1NFUV9MTE9HKTsKKwlsbG9nX2dyb3VwX2luaXQoJm9iZC0+b2JkX29sZyk7CiAKIAlvYmQtPm9iZF9jb25uX2lucHJvZ3Jlc3MgPSAwOwogCkBAIC0yNTAsMTUgKzI1MSw2IEBACiAJfQogCW1lbWNweShvYmQtPm9iZF91dWlkLnV1aWQsIHV1aWQsIGxlbik7CiAKLQkvKiBkbyB0aGUgYXR0YWNoICovCi0JaWYgKE9CUChvYmQsIGF0dGFjaCkpIHsKLQkJcmMgPSBPQlAob2JkLCBhdHRhY2gpKG9iZCwgc2l6ZW9mKCpsY2ZnKSwgbGNmZyk7Ci0JCWlmIChyYykgewotCQkJcmMgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KIAkvKiBEZXRhY2ggZHJvcHMgdGhpcyAqLwogCXNwaW5fbG9jaygmb2JkLT5vYmRfZGV2X2xvY2spOwogCWF0b21pY19zZXQoJm9iZC0+b2JkX3JlZmNvdW50LCAxKTsKQEAgLTQyMiwxNyArNDE0LDEyIEBACiAJfQogCS8qIExlYXZlIHRoaXMgb24gZm9yZXZlciAqLwogCW9iZC0+b2JkX3N0b3BwaW5nID0gMTsKLQotCS8qIHdhaXQgZm9yIGFscmVhZHktYXJyaXZlZC1jb25uZWN0aW9ucyB0byBmaW5pc2guICovCi0Jd2hpbGUgKG9iZC0+b2JkX2Nvbm5faW5wcm9ncmVzcyA+IDApIHsKLQkJc3Bpbl91bmxvY2soJm9iZC0+b2JkX2Rldl9sb2NrKTsKLQotCQljb25kX3Jlc2NoZWQoKTsKLQotCQlzcGluX2xvY2soJm9iZC0+b2JkX2Rldl9sb2NrKTsKLQl9CiAJc3Bpbl91bmxvY2soJm9iZC0+b2JkX2Rldl9sb2NrKTsKIAorCXdoaWxlIChvYmQtPm9iZF9jb25uX2lucHJvZ3Jlc3MgPiAwKQorCQl5aWVsZCgpOworCXNtcF9ybWIoKTsKKwogCWlmIChsY2ZnLT5sY2ZnX2J1ZmNvdW50ID49IDIgJiYgTFVTVFJFX0NGR19CVUZMRU4obGNmZywgMSkgPiAwKSB7CiAJCWZvciAoZmxhZyA9IGx1c3RyZV9jZmdfc3RyaW5nKGxjZmcsIDEpOyAqZmxhZyAhPSAwOyBmbGFnKyspCiAJCQlzd2l0Y2ggKCpmbGFnKSB7CkBAIC01MjYsMTEgKzUxMyw2IEBACiAJCQkJQ0VSUk9SKCJDbGVhbnVwICVzIHJldHVybmVkICVkXG4iLAogCQkJCSAgICAgICBvYmQtPm9iZF9uYW1lLCBlcnIpOwogCQl9Ci0JCWlmIChPQlAob2JkLCBkZXRhY2gpKSB7Ci0JCQllcnIgPSBPQlAob2JkLCBkZXRhY2gpKG9iZCk7Ci0JCQlpZiAoZXJyKQotCQkJCUNFUlJPUigiRGV0YWNoIHJldHVybmVkICVkXG4iLCBlcnIpOwotCQl9CiAJCWNsYXNzX3JlbGVhc2VfZGV2KG9iZCk7CiAJfQogfQpAQCAtNzU2LDcgKzczOCw3IEBACiAJfQogCiAJc3RhcnQgPSBrdGltZV9nZXQoKTsKLQlyYyA9IGNhbGxfdXNlcm1vZGVoZWxwZXIoYXJndlswXSwgYXJndiwgTlVMTCwgMSk7CisJcmMgPSBjYWxsX3VzZXJtb2RlaGVscGVyKGFyZ3ZbMF0sIGFyZ3YsIE5VTEwsIFVNSF9XQUlUX1BST0MpOwogCWVuZCA9IGt0aW1lX2dldCgpOwogCiAJaWYgKHJjIDwgMCkgewpAQCAtMTAyNiw3ICsxMDA4LDcgQEAKIAogCQkJCQlvbGRmcyA9IGdldF9mcygpOwogCQkJCQlzZXRfZnMoS0VSTkVMX0RTKTsKLQkJCQkJcmMgPSAodmFyLT5mb3BzLT53cml0ZSkoJmZha2VmaWxlLCBzdmFsLAorCQkJCQlyYyA9IHZhci0+Zm9wcy0+d3JpdGUoJmZha2VmaWxlLCBzdmFsLAogCQkJCQkJCQl2YWxsZW4sIE5VTEwpOwogCQkJCQlzZXRfZnMob2xkZnMpOwogCQkJCX0KQEAgLTEwNjAsOCArMTA0Miw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNsYXNzX3Byb2Nlc3NfcHJvY19wYXJhbSk7CiAKLWV4dGVybiBpbnQgbHVzdHJlX2NoZWNrX2V4Y2x1c2lvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpzdm5hbWUpOwotCiAvKiogUGFyc2UgYSBjb25maWd1cmF0aW9uIGxsb2csIGRvaW5nIHZhcmlvdXMgbWFuaXB1bGF0aW9ucyBvbiB0aGVtCiAgKiBmb3IgdmFyaW91cyByZWFzb25zLCAobW9kaWZpY2F0aW9ucyBmb3IgY29tcGF0aWJpbGl0eSwgc2tpcCBvYnNvbGV0ZQogICogcmVjb3JkcywgY2hhbmdlIHV1aWRzLCBldGMpLCB0aGVuIGNsYXNzX3Byb2Nlc3NfY29uZmlnKCkgcmVzdWx0aW5nCkBAIC0xMzE3LDMzICsxMjk3LDMzIEBACiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCi0JcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kLXB0ciwgImNtZD0lMDV4ICIsIGxjZmctPmxjZmdfY29tbWFuZCk7CisJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kIC0gcHRyLCAiY21kPSUwNXggIiwgbGNmZy0+bGNmZ19jb21tYW5kKTsKIAlpZiAobGNmZy0+bGNmZ19mbGFncykKLQkJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kLXB0ciwgImZsYWdzPSUjMDh4ICIsCisJCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZCAtIHB0ciwgImZsYWdzPSUjMDh4ICIsCiAJCQkJbGNmZy0+bGNmZ19mbGFncyk7CiAKIAlpZiAobGNmZy0+bGNmZ19udW0pCi0JCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZC1wdHIsICJudW09JSMwOHggIiwgbGNmZy0+bGNmZ19udW0pOworCQlwdHIgKz0gc25wcmludGYocHRyLCBlbmQgLSBwdHIsICJudW09JSMwOHggIiwgbGNmZy0+bGNmZ19udW0pOwogCiAJaWYgKGxjZmctPmxjZmdfbmlkKSB7CiAJCWNoYXIgbmlkc3RyW0xORVRfTklEU1RSX1NJWkVdOwogCiAJCWxpYmNmc19uaWQyc3RyX3IobGNmZy0+bGNmZ19uaWQsIG5pZHN0ciwgc2l6ZW9mKG5pZHN0cikpOwotCQlwdHIgKz0gc25wcmludGYocHRyLCBlbmQtcHRyLCAibmlkPSVzKCUjbGx4KVxuICAgICAiLAorCQlwdHIgKz0gc25wcmludGYocHRyLCBlbmQgLSBwdHIsICJuaWQ9JXMoJSNsbHgpXG4gICAgICIsCiAJCQkJbmlkc3RyLCBsY2ZnLT5sY2ZnX25pZCk7CiAJfQogCiAJaWYgKGxjZmctPmxjZmdfY29tbWFuZCA9PSBMQ0ZHX01BUktFUikgewogCQlzdHJ1Y3QgY2ZnX21hcmtlciAqbWFya2VyID0gbHVzdHJlX2NmZ19idWYobGNmZywgMSk7CiAKLQkJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kLXB0ciwgIm1hcmtlcj0lZCglI3gpJXMgJyVzJyIsCisJCXB0ciArPSBzbnByaW50ZihwdHIsIGVuZCAtIHB0ciwgIm1hcmtlcj0lZCglI3gpJXMgJyVzJyIsCiAJCQkJbWFya2VyLT5jbV9zdGVwLCBtYXJrZXItPmNtX2ZsYWdzLAogCQkJCW1hcmtlci0+Y21fdGd0bmFtZSwgbWFya2VyLT5jbV9jb21tZW50KTsKIAl9IGVsc2UgewogCQlpbnQgaTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgIGxjZmctPmxjZmdfYnVmY291bnQ7IGkrKykgewotCQkJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kLXB0ciwgIiVkOiVzICAiLCBpLAorCQkJcHRyICs9IHNucHJpbnRmKHB0ciwgZW5kIC0gcHRyLCAiJWQ6JXMgICIsIGksCiAJCQkJCWx1c3RyZV9jZmdfc3RyaW5nKGxjZmcsIGkpKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX21vdW50LmMKaW5kZXggYWE4NGE1MGUuLjBkM2EzYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jCkBAIC0zNywxMSArMzcsMTEgQEAKICAqLwogCiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0NMQVNTCi0jZGVmaW5lIERfTU9VTlQgKERfU1VQRVJ8RF9DT05GSUcvKnxEX1dBUk5JTkcgKi8pCisjZGVmaW5lIERfTU9VTlQgKERfU1VQRVIgfCBEX0NPTkZJRy8qfERfV0FSTklORyAqLykKICNkZWZpbmUgUFJJTlRfQ01EIENERUJVRwogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmQuaCIKLSNpbmNsdWRlICIuLi9pbmNsdWRlL2xpbnV4L2x1c3RyZV9jb21wYXQyNS5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX2NvbXBhdC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX3VzZXIuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9sb2cuaCIKQEAgLTY4LDcgKzY4LDcgQEAKICAqICAgdGhpcyBsb2csIGFuZCBpcyBhZGRlZCB0byB0aGUgbWdjJ3MgbGlzdCBvZiBsb2dzIHRvIGZvbGxvdy4KICAqLwogaW50IGx1c3RyZV9wcm9jZXNzX2xvZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpsb2duYW1lLAotCQkgICAgICBzdHJ1Y3QgY29uZmlnX2xsb2dfaW5zdGFuY2UgKmNmZykKKwkJICAgICAgIHN0cnVjdCBjb25maWdfbGxvZ19pbnN0YW5jZSAqY2ZnKQogewogCXN0cnVjdCBsdXN0cmVfY2ZnICpsY2ZnOwogCXN0cnVjdCBsdXN0cmVfY2ZnX2J1ZnMgKmJ1ZnM7CkBAIC0zODQsMTcgKzM4NCwxNSBAQAogCQkJCSAgT0JEX0NPTk5FQ1RfRlVMTDIwIHwgT0JEX0NPTk5FQ1RfSU1QX1JFQ09WIHwKIAkJCQkgIE9CRF9DT05ORUNUX0xWQl9UWVBFOwogCi0jaWYgTFVTVFJFX1ZFUlNJT05fQ09ERSA8IE9CRF9PQ0RfVkVSU0lPTigzLCAyLCA1MCwgMCkKKyNpZiBPQkRfT0NEX1ZFUlNJT04oMywgMCwgNTMsIDApID4gTFVTVFJFX1ZFUlNJT05fQ09ERQogCWRhdGEtPm9jZF9jb25uZWN0X2ZsYWdzIHw9IE9CRF9DT05ORUNUX01ORV9TV0FCOwotI2Vsc2UKLSN3YXJuaW5nICJMVS0xNjQ0OiBSZW1vdmUgb2xkIE9CRF9DT05ORUNUX01ORV9TV0FCIGZpeHVwIGFuZCBpbXBfbmVlZF9tbmVfc3dhYiIKICNlbmRpZgogCiAJaWYgKGxtZF9pc19jbGllbnQobHNpLT5sc2lfbG1kKSAmJgogCSAgICBsc2ktPmxzaV9sbWQtPmxtZF9mbGFncyAmIExNRF9GTEdfTk9JUikKIAkJZGF0YS0+b2NkX2Nvbm5lY3RfZmxhZ3MgJj0gfk9CRF9DT05ORUNUX0lNUF9SRUNPVjsKIAlkYXRhLT5vY2RfdmVyc2lvbiA9IExVU1RSRV9WRVJTSU9OX0NPREU7Ci0JcmMgPSBvYmRfY29ubmVjdChOVUxMLCAmZXhwLCBvYmQsICYob2JkLT5vYmRfdXVpZCksIGRhdGEsIE5VTEwpOworCXJjID0gb2JkX2Nvbm5lY3QoTlVMTCwgJmV4cCwgb2JkLCAmb2JkLT5vYmRfdXVpZCwgZGF0YSwgTlVMTCk7CiAJaWYgKHJjKSB7CiAJCUNFUlJPUigiY29ubmVjdCBmYWlsZWQgJWRcbiIsIHJjKTsKIAkJZ290byBvdXQ7CkBAIC02NzAsNyArNjY4LDYgQEAKIAl9CiAJLyogRHJvcCBhIHJlZiB0byB0aGUgbW91bnRlZCBkaXNrICovCiAJbHVzdHJlX3B1dF9sc2koc2IpOwotCWx1X3R5cGVzX3N0b3AoKTsKIAlyZXR1cm4gcmM7CiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9jb21tb25fcHV0X3N1cGVyKTsKQEAgLTczMSw3ICs3MjgsNyBAQAogc3RhdGljIGludCBsbWRfbWFrZV9leGNsdXNpb24oc3RydWN0IGx1c3RyZV9tb3VudF9kYXRhICpsbWQsIGNvbnN0IGNoYXIgKnB0cikKIHsKIAljb25zdCBjaGFyICpzMSA9IHB0ciwgKnMyOwotCV9fdTMyIGluZGV4LCAqZXhjbHVkZV9saXN0OworCV9fdTMyIGluZGV4ID0gMCwgKmV4Y2x1ZGVfbGlzdDsKIAlpbnQgcmMgPSAwLCBkZXZtYXg7CiAKIAkvKiBUaGUgc2hvcnRlc3QgYW4gb3N0IG5hbWUgY2FuIGJlIGlzIDggY2hhcnM6IC1PU1QwMDAwLgpAQCAtNzU4LDcgKzc1NSw3IEBACiAJCQlleGNsdWRlX2xpc3RbbG1kLT5sbWRfZXhjbHVkZV9jb3VudCsrXSA9IGluZGV4OwogCQllbHNlCiAJCQlDREVCVUcoRF9NT1VOVCwgImlnbm9yaW5nIGV4Y2x1ZGUgJS4qczogdHlwZSA9ICUjeFxuIiwKLQkJCSAgICAgICAodWludCkoczItczEpLCBzMSwgcmMpOworCQkJICAgICAgICh1aW50KShzMiAtIHMxKSwgczEsIHJjKTsKIAkJczEgPSBzMjsKIAkJLyogbm93IHdlIGFyZSBwb2ludGluZyBhdCAnOicgKG5leHQgZXhjbHVkZSkKIAkJICogb3IgJywnIChlbmQgb2YgZXhjbHVkZXMpCkBAIC04ODAsNyArODc3LDcgQEAKICAqLwogc3RhdGljIGludCBsbWRfcGFyc2UoY2hhciAqb3B0aW9ucywgc3RydWN0IGx1c3RyZV9tb3VudF9kYXRhICpsbWQpCiB7Ci0JY2hhciAqczEsICpzMiwgKmRldm5hbWUgPSBOVUxMOworCWNoYXIgKnMxLCAqczIsICpzMywgKmRldm5hbWUgPSBOVUxMOwogCXN0cnVjdCBsdXN0cmVfbW91bnRfZGF0YSAqcmF3ID0gKHN0cnVjdCBsdXN0cmVfbW91bnRfZGF0YSAqKW9wdGlvbnM7CiAJaW50IHJjID0gMDsKIApAQCAtOTEzLDYgKzkxMCw3IEBACiAJCS8qIFNraXAgd2hpdGVzcGFjZSBhbmQgZXh0cmEgY29tbWFzICovCiAJCXdoaWxlICgqczEgPT0gJyAnIHx8ICpzMSA9PSAnLCcpCiAJCQlzMSsrOworCQlzMyA9IHMxOwogCiAJCS8qIENsaWVudCBvcHRpb25zIGFyZSBwYXJzZWQgaW4gbGxfb3B0aW9uczogZWcuIGZsb2NrLAogCQkgKiB1c2VyX3hhdHRyLCBhY2wKQEAgLTk3MCw2ICs5NjgsNyBAQAogCQkJcmMgPSBsbWRfcGFyc2VfbWdzc2VjKGxtZCwgczEgKyA3KTsKIAkJCWlmIChyYykKIAkJCQlnb3RvIGludmFsaWQ7CisJCQlzMyA9IHMyOwogCQkJY2xlYXIrKzsKIAkJLyogb3N0IGV4Y2x1c2lvbiBsaXN0ICovCiAJCX0gZWxzZSBpZiAoc3RybmNtcChzMSwgImV4Y2x1ZGU9IiwgOCkgPT0gMCkgewpAQCAtOTkwLDEwICs5ODksMTkgQEAKIAkJCXNpemVfdCBsZW5ndGgsIHBhcmFtc19sZW5ndGg7CiAJCQljaGFyICp0YWlsID0gc3RyY2hyKHMxICsgNiwgJywnKTsKIAotCQkJaWYgKCF0YWlsKQorCQkJaWYgKCF0YWlsKSB7CiAJCQkJbGVuZ3RoID0gc3RybGVuKHMxKTsKLQkJCWVsc2UKLQkJCQlsZW5ndGggPSB0YWlsIC0gczE7CisJCQl9IGVsc2UgeworCQkJCWxuZXRfbmlkX3QgbmlkOworCQkJCWNoYXIgKnBhcmFtX3N0ciA9IHRhaWwgKyAxOworCQkJCWludCBzdXBwbGVtZW50YXJ5ID0gMTsKKworCQkJCXdoaWxlICghY2xhc3NfcGFyc2VfbmlkX3F1aWV0KHBhcmFtX3N0ciwgJm5pZCwKKwkJCQkJCQkgICAgICAmcGFyYW1fc3RyKSkgeworCQkJCQlzdXBwbGVtZW50YXJ5ID0gMDsKKwkJCQl9CisJCQkJbGVuZ3RoID0gcGFyYW1fc3RyIC0gczEgLSBzdXBwbGVtZW50YXJ5OworCQkJfQogCQkJbGVuZ3RoIC09IDY7CiAJCQlwYXJhbXNfbGVuZ3RoID0gc3RybGVuKGxtZC0+bG1kX3BhcmFtcyk7CiAJCQlpZiAocGFyYW1zX2xlbmd0aCArIGxlbmd0aCArIDEgPj0gTE1EX1BBUkFNU19NQVhMRU4pCkBAIC0xMDAxLDYgKzEwMDksNyBAQAogCQkJc3RybmNhdChsbWQtPmxtZF9wYXJhbXMsIHMxICsgNiwgbGVuZ3RoKTsKIAkJCWxtZC0+bG1kX3BhcmFtc1twYXJhbXNfbGVuZ3RoICsgbGVuZ3RoXSA9ICdcMCc7CiAJCQlzdHJsY2F0KGxtZC0+bG1kX3BhcmFtcywgIiAiLCBMTURfUEFSQU1TX01BWExFTik7CisJCQlzMyA9IHMxICsgNiArIGxlbmd0aDsKIAkJCWNsZWFyKys7CiAJCX0gZWxzZSBpZiAoc3RybmNtcChzMSwgIm9zZD0iLCA0KSA9PSAwKSB7CiAJCQlyYyA9IGxtZF9wYXJzZV9zdHJpbmcoJmxtZC0+bG1kX29zZF90eXBlLCBzMSArIDQpOwpAQCAtMTA5Nyw3ICsxMTA2LDcgQEAKIAlzdHJ1Y3QgbHVzdHJlX3NiX2luZm8gKmxzaTsKIAlpbnQgcmM7CiAKLQlDREVCVUcoRF9NT1VOVHxEX1ZGU1RSQUNFLCAiVkZTIE9wOiBzYiAlcFxuIiwgc2IpOworCUNERUJVRyhEX01PVU5UIHwgRF9WRlNUUkFDRSwgIlZGUyBPcDogc2IgJXBcbiIsIHNiKTsKIAogCWxzaSA9IGx1c3RyZV9pbml0X2xzaShzYik7CiAJaWYgKCFsc2kpCkBAIC0xMTMzLDcgKzExNDIsNyBAQAogCQl9IGVsc2UgewogCQkJcmMgPSBsdXN0cmVfc3RhcnRfbWdjKHNiKTsKIAkJCWlmIChyYykgewotCQkJCWx1c3RyZV9wdXRfbHNpKHNiKTsKKwkJCQlsdXN0cmVfY29tbW9uX3B1dF9zdXBlcihzYik7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQkvKiBDb25uZWN0IGFuZCBzdGFydCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2Jkby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2Jkby5jCmluZGV4IDg1ODNhNGEuLjc5MTA0YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9vYmRvLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogfQogRVhQT1JUX1NZTUJPTChvYmRvX2Zyb21faW5vZGUpOwogCi12b2lkIG9iZG9fdG9faW9vYmooc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3Qgb2JkX2lvb2JqICppb29iaikKK3ZvaWQgb2Jkb190b19pb29iaihjb25zdCBzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBvYmRfaW9vYmogKmlvb2JqKQogewogCWlvb2JqLT5pb29fb2lkID0gb2EtPm9fb2k7CiAJaWYgKHVubGlrZWx5KCEob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxHUk9VUCkpKQpAQCAtMTI1LDcgKzEyNSw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9iZG9fdG9faW9vYmopOwogCi1zdGF0aWMgdm9pZCBpYXR0cl9mcm9tX29iZG8oc3RydWN0IGlhdHRyICphdHRyLCBzdHJ1Y3Qgb2JkbyAqb2EsIHUzMiB2YWxpZCkKK3N0YXRpYyB2b2lkIGlhdHRyX2Zyb21fb2JkbyhzdHJ1Y3QgaWF0dHIgKmF0dHIsIGNvbnN0IHN0cnVjdCBvYmRvICpvYSwKKwkJCSAgICB1MzIgdmFsaWQpCiB7CiAJdmFsaWQgJj0gb2EtPm9fdmFsaWQ7CiAKQEAgLTE1MiwxMiArMTUzLDE0IEBACiAJfQogI2lmIDAgICAvKiB5b3Ugc2hvdWxkbid0IGJlIGFibGUgdG8gY2hhbmdlIGEgZmlsZSdzIHR5cGUgd2l0aCBzZXRhdHRyICovCiAJaWYgKHZhbGlkICYgT0JEX01EX0ZMVFlQRSkgewotCQlhdHRyLT5pYV9tb2RlID0gKGF0dHItPmlhX21vZGUgJiB+U19JRk1UKXwob2EtPm9fbW9kZSAmIFNfSUZNVCk7CisJCWF0dHItPmlhX21vZGUgPSAoYXR0ci0+aWFfbW9kZSAmIH5TX0lGTVQpIHwKKwkJCQkob2EtPm9fbW9kZSAmIFNfSUZNVCk7CiAJCWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfTU9ERTsKIAl9CiAjZW5kaWYKIAlpZiAodmFsaWQgJiBPQkRfTURfRkxNT0RFKSB7Ci0JCWF0dHItPmlhX21vZGUgPSAoYXR0ci0+aWFfbW9kZSAmIFNfSUZNVCl8KG9hLT5vX21vZGUgJiB+U19JRk1UKTsKKwkJYXR0ci0+aWFfbW9kZSA9IChhdHRyLT5pYV9tb2RlICYgU19JRk1UKSB8CisJCQkJKG9hLT5vX21vZGUgJiB+U19JRk1UKTsKIAkJYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9NT0RFOwogCQlpZiAoIWluX2dyb3VwX3AobWFrZV9rZ2lkKCZpbml0X3VzZXJfbnMsIG9hLT5vX2dpZCkpICYmCiAJCSAgICAhY2FwYWJsZShDRlNfQ0FQX0ZTRVRJRCkpCkBAIC0xNzMsNyArMTc2LDcgQEAKIAl9CiB9CiAKLXZvaWQgbWRfZnJvbV9vYmRvKHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLCBzdHJ1Y3Qgb2JkbyAqb2EsIHUzMiB2YWxpZCkKK3ZvaWQgbWRfZnJvbV9vYmRvKHN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhLCBjb25zdCBzdHJ1Y3Qgb2JkbyAqb2EsIHUzMiB2YWxpZCkKIHsKIAlpYXR0cl9mcm9tX29iZG8oJm9wX2RhdGEtPm9wX2F0dHIsIG9hLCB2YWxpZCk7CiAJaWYgKHZhbGlkICYgT0JEX01EX0ZMQkxPQ0tTKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9fY2xpZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9fY2xpZW50LmMKaW5kZXggNWIyOWM0YS4uNTA1NTgyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2NsaWVudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNob19jbGllbnQuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvY2xfb2JqZWN0LmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZmlkLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfYWNsLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lvY3RsLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbmV0LmgiCiAKICNpbmNsdWRlICJlY2hvX2ludGVybmFsLmgiCkBAIC02NCwxNCArNjUsMTQgQEAKIAogCXN0cnVjdCBlY2hvX2RldmljZSAgICAgKmVvX2RldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgIGVvX29ial9jaGFpbjsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAgICplb19sc207CisJc3RydWN0IGxvdl9vaW5mbyAgICAgICAqZW9fb2luZm87CiAJYXRvbWljX3QJICAgIGVvX25wYWdlczsKIAlpbnQJCSAgICAgZW9fZGVsZXRlZDsKIH07CiAKIHN0cnVjdCBlY2hvX29iamVjdF9jb25mIHsKIAlzdHJ1Y3QgY2xfb2JqZWN0X2NvbmYgIGVvY19jbDsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqKmVvY19tZDsKKwlzdHJ1Y3QgbG92X29pbmZvICAgICAgKiplb2Nfb2luZm87CiB9OwogCiBzdHJ1Y3QgZWNob19wYWdlIHsKQEAgLTE1Miw5ICsxNTMsNiBAQAogfQogCiAvKiogQH0gZWNob19oZWxwZXJzICovCi0KLXN0YXRpYyBzdHJ1Y3QgZWNob19vYmplY3QgKmNsX2VjaG9fb2JqZWN0X2ZpbmQoc3RydWN0IGVjaG9fZGV2aWNlICpkLAotCQkJCQkgICAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKipsc20pOwogc3RhdGljIGludCBjbF9lY2hvX29iamVjdF9wdXQoc3RydWN0IGVjaG9fb2JqZWN0ICplY28pOwogc3RhdGljIGludCBjbF9lY2hvX29iamVjdF9icncoc3RydWN0IGVjaG9fb2JqZWN0ICplY28sIGludCBydywgdTY0IG9mZnNldCwKIAkJCSAgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBucGFnZXMsIGludCBhc3luYyk7CkBAIC00MTMsMTAgKzQxMSwxMyBAQAogCWNjb25mID0gbHUyY2xfY29uZihjb25mKTsKIAllY29uZiA9IGNsMmVjaG9fY29uZihjY29uZik7CiAKLQlMQVNTRVJUKGVjb25mLT5lb2NfbWQpOwotCWVjby0+ZW9fbHNtID0gKmVjb25mLT5lb2NfbWQ7Ci0JLyogY2xlYXIgdGhlIGxzbSBwb2ludGVyIHNvIHRoYXQgaXQgd29uJ3QgZ2V0IGZyZWVkLiAqLwotCSplY29uZi0+ZW9jX21kID0gTlVMTDsKKwlMQVNTRVJUKGVjb25mLT5lb2Nfb2luZm8pOworCS8qCisJICogVHJhbnNmZXIgdGhlIG9pbmZvIHBvaW50ZXIgdG8gZWNvIHRoYXQgaXQgd29uJ3QgYmUKKwkgKiBmcmVlZC4KKwkgKi8KKwllY28tPmVvX29pbmZvID0gKmVjb25mLT5lb2Nfb2luZm87CisJKmVjb25mLT5lb2Nfb2luZm8gPSBOVUxMOwogCiAJZWNvLT5lb19kZXYgPSBlZDsKIAlhdG9taWNfc2V0KCZlY28tPmVvX25wYWdlcywgMCk7CkBAIC00MjksNTIgKzQzMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIHRha2VuIGZyb20gb3NjX3VucGFja21kKCkgKi8KLXN0YXRpYyBpbnQgZWNob19hbGxvY19tZW1tZChzdHJ1Y3QgZWNob19kZXZpY2UgKmVkLAotCQkJICAgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqbHNtcCkKLXsKLQlpbnQgbHNtX3NpemU7Ci0KLQkvKiBJZiBleHBvcnQgaXMgbG92L29zYyB0aGVuIHVzZSB0aGVpciBvYmQgbWV0aG9kICovCi0JaWYgKGVkLT5lZF9uZXh0KQotCQlyZXR1cm4gb2JkX2FsbG9jX21lbW1kKGVkLT5lZF9lYy0+ZWNfZXhwLCBsc21wKTsKLQkvKiBPRkQgaGFzIG5vIHVucGFja21kIG1ldGhvZCwgZG8gZXZlcnl0aGluZyBoZXJlICovCi0JbHNtX3NpemUgPSBsb3Zfc3RyaXBlX21kX3NpemUoMSk7Ci0KLQlMQVNTRVJUKCEqbHNtcCk7Ci0JKmxzbXAgPSBremFsbG9jKGxzbV9zaXplLCBHRlBfTk9GUyk7Ci0JaWYgKCEqbHNtcCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkoKmxzbXApLT5sc21fb2luZm9bMF0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbG92X29pbmZvKSwgR0ZQX05PRlMpOwotCWlmICghKCpsc21wKS0+bHNtX29pbmZvWzBdKSB7Ci0JCWtmcmVlKCpsc21wKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JbG9pX2luaXQoKCpsc21wKS0+bHNtX29pbmZvWzBdKTsKLQkoKmxzbXApLT5sc21fbWF4Ynl0ZXMgPSBMVVNUUkVfU1RSSVBFX01BWEJZVEVTOwotCW9zdGlkX3NldF9zZXFfZWNobygmKCpsc21wKS0+bHNtX29pKTsKLQotCXJldHVybiBsc21fc2l6ZTsKLX0KLQotc3RhdGljIGludCBlY2hvX2ZyZWVfbWVtbWQoc3RydWN0IGVjaG9fZGV2aWNlICplZCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKipsc21wKQotewotCWludCBsc21fc2l6ZTsKLQotCS8qIElmIGV4cG9ydCBpcyBsb3Yvb3NjIHRoZW4gdXNlIHRoZWlyIG9iZCBtZXRob2QgKi8KLQlpZiAoZWQtPmVkX25leHQpCi0JCXJldHVybiBvYmRfZnJlZV9tZW1tZChlZC0+ZWRfZWMtPmVjX2V4cCwgbHNtcCk7Ci0JLyogT0ZEIGhhcyBubyB1bnBhY2ttZCBtZXRob2QsIGRvIGV2ZXJ5dGhpbmcgaGVyZSAqLwotCWxzbV9zaXplID0gbG92X3N0cmlwZV9tZF9zaXplKDEpOwotCi0Ja2ZyZWUoKCpsc21wKS0+bHNtX29pbmZvWzBdKTsKLQlrZnJlZSgqbHNtcCk7Ci0JKmxzbXAgPSBOVUxMOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBlY2hvX29iamVjdF9mcmVlKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGx1X29iamVjdCAqb2JqKQogewogCXN0cnVjdCBlY2hvX29iamVjdCAqZWNvICAgID0gY2wyZWNob19vYmoobHUyY2wob2JqKSk7CkBAIC00ODksOCArNDQ0LDcgQEAKIAlsdV9vYmplY3RfZmluaShvYmopOwogCWx1X29iamVjdF9oZWFkZXJfZmluaShvYmotPmxvX2hlYWRlcik7CiAKLQlpZiAoZWNvLT5lb19sc20pCi0JCWVjaG9fZnJlZV9tZW1tZChlY28tPmVvX2RldiwgJmVjby0+ZW9fbHNtKTsKKwlrZnJlZShlY28tPmVvX29pbmZvKTsKIAlrbWVtX2NhY2hlX2ZyZWUoZWNob19vYmplY3Rfa21lbSwgZWNvKTsKIH0KIApAQCAtODY0LDI1ICs4MTgsMjEgQEAKICAqLwogCiAvKiBJbnRlcmZhY2VzIHRvIGVjaG8gY2xpZW50IG9iZCBkZXZpY2UgKi8KLXN0YXRpYyBzdHJ1Y3QgZWNob19vYmplY3QgKmNsX2VjaG9fb2JqZWN0X2ZpbmQoc3RydWN0IGVjaG9fZGV2aWNlICpkLAotCQkJCQkgICAgICAgc3RydWN0IGxvdl9zdHJpcGVfbWQgKipsc21wKQorc3RhdGljIHN0cnVjdCBlY2hvX29iamVjdCAqCitjbF9lY2hvX29iamVjdF9maW5kKHN0cnVjdCBlY2hvX2RldmljZSAqZCwgY29uc3Qgc3RydWN0IG9zdF9pZCAqb2kpCiB7CiAJc3RydWN0IGx1X2VudiAqZW52OwogCXN0cnVjdCBlY2hvX3RocmVhZF9pbmZvICppbmZvOwogCXN0cnVjdCBlY2hvX29iamVjdF9jb25mICpjb25mOwotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICAgICpsc207CisJc3RydWN0IGxvdl9vaW5mbyAqb2luZm8gPSBOVUxMOwogCXN0cnVjdCBlY2hvX29iamVjdCAqZWNvOwogCXN0cnVjdCBjbF9vYmplY3QgICAqb2JqOwogCXN0cnVjdCBsdV9maWQgKmZpZDsKIAlpbnQgcmVmY2hlY2s7CiAJaW50IHJjOwogCi0JTEFTU0VSVChsc21wKTsKLQlsc20gPSAqbHNtcDsKLQlMQVNTRVJUKGxzbSk7Ci0JTEFTU0VSVEYob3N0aWRfaWQoJmxzbS0+bHNtX29pKSAhPSAwLCBET1NUSUQiXG4iLCBQT1NUSUQoJmxzbS0+bHNtX29pKSk7Ci0JTEFTU0VSVEYob3N0aWRfc2VxKCZsc20tPmxzbV9vaSkgPT0gRklEX1NFUV9FQ0hPLCBET1NUSUQiXG4iLAotCQkgUE9TVElEKCZsc20tPmxzbV9vaSkpOworCUxBU1NFUlRGKG9zdGlkX2lkKG9pKSwgRE9TVElEICJcbiIsIFBPU1RJRChvaSkpOworCUxBU1NFUlRGKG9zdGlkX3NlcShvaSkgPT0gRklEX1NFUV9FQ0hPLCBET1NUSUQgIlxuIiwgUE9TVElEKG9pKSk7CiAKIAkvKiBOZXZlciByZXR1cm4gYW4gb2JqZWN0IGlmIHRoZSBvYmQgaXMgdG8gYmUgZnJlZWQuICovCiAJaWYgKGVjaG9fZGV2MmNsKGQpLT5jZF9sdV9kZXYubGRfb2JkLT5vYmRfc3RvcHBpbmcpCkBAIC04OTUsMTYgKzg0NSwyNCBAQAogCWluZm8gPSBlY2hvX2Vudl9pbmZvKGVudik7CiAJY29uZiA9ICZpbmZvLT5ldGlfY29uZjsKIAlpZiAoZC0+ZWRfbmV4dCkgewotCQlzdHJ1Y3QgbG92X29pbmZvICpvaW5mbyA9IGxzbS0+bHNtX29pbmZvWzBdOworCQlvaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCpvaW5mbyksIEdGUF9OT0ZTKTsKKwkJaWYgKCFvaW5mbykgeworCQkJZWNvID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJCWdvdG8gb3V0OworCQl9CiAKLQkJTEFTU0VSVChvaW5mbyk7Ci0JCW9pbmZvLT5sb2lfb2kgPSBsc20tPmxzbV9vaTsKKwkJb2luZm8tPmxvaV9vaSA9ICpvaTsKIAkJY29uZi0+ZW9jX2NsLnUuY29jX29pbmZvID0gb2luZm87CiAJfQotCWNvbmYtPmVvY19tZCA9IGxzbXA7CisKKwkvKgorCSAqIElmIGVjaG9fb2JqZWN0X2luaXQoKSBpcyBzdWNjZXNzZnVsIHRoZW4gb3duZXJzaGlwIG9mIG9pbmZvCisJICogaXMgdHJhbnNmZXJyZWQgdG8gdGhlIG9iamVjdC4KKwkgKi8KKwljb25mLT5lb2Nfb2luZm8gPSAmb2luZm87CiAKIAlmaWQgID0gJmluZm8tPmV0aV9maWQ7Ci0JcmMgPSBvc3RpZF90b19maWQoZmlkLCAmbHNtLT5sc21fb2ksIDApOworCXJjID0gb3N0aWRfdG9fZmlkKGZpZCwgKHN0cnVjdCBvc3RfaWQgKilvaSwgMCk7CiAJaWYgKHJjICE9IDApIHsKIAkJZWNvID0gRVJSX1BUUihyYyk7CiAJCWdvdG8gb3V0OwpAQCAtOTI3LDYgKzg4NSw3IEBACiAJfQogCiBvdXQ6CisJa2ZyZWUob2luZm8pOwogCWNsX2Vudl9wdXQoZW52LCAmcmVmY2hlY2spOwogCXJldHVybiBlY287CiB9CkBAIC0xMDUxLDcgKzEwMTAsNyBAQAogCXN0cnVjdCBjbF9pbwkgICAgKmlvOwogCXN0cnVjdCBjbF9wYWdlCSAgKmNscDsKIAlzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAgICBsaCA9IHsgMCB9OwotCWludCBwYWdlX3NpemUgPSBjbF9wYWdlX3NpemUob2JqKTsKKwlzaXplX3QgcGFnZV9zaXplID0gY2xfcGFnZV9zaXplKG9iaik7CiAJaW50IHJlZmNoZWNrOwogCWludCByYzsKIAlpbnQgaTsKQEAgLTExNDUsNyArMTEwNCw2IEBACiB7CiAJc3RydWN0IGVjaG9fb2JqZWN0ICAgICAqZWNvOwogCXN0cnVjdCBlY2hvX2NsaWVudF9vYmQgKmVjID0gZWQtPmVkX2VjOwotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICAgKmxzbSA9IE5VTEw7CiAJaW50CQkgICAgIHJjOwogCWludAkJICAgICBjcmVhdGVkID0gMDsKIApAQCAtMTE1NiwzMCArMTExNCwxOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyYyA9IGVjaG9fYWxsb2NfbWVtbWQoZWQsICZsc20pOwotCWlmIChyYyA8IDApIHsKLQkJQ0VSUk9SKCJDYW5ub3QgYWxsb2NhdGUgbWQ6IHJjID0gJWRcbiIsIHJjKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQorCWlmICghb3N0aWRfaWQoJm9hLT5vX29pKSkKKwkJb3N0aWRfc2V0X2lkKCZvYS0+b19vaSwgKytsYXN0X29iamVjdF9pZCk7CiAKLQkvKiBzZXR1cCBvYmplY3QgSUQgaGVyZSAqLwotCWxzbS0+bHNtX29pID0gb2EtPm9fb2k7Ci0KLQlpZiAob3N0aWRfaWQoJmxzbS0+bHNtX29pKSA9PSAwKQotCQlvc3RpZF9zZXRfaWQoJmxzbS0+bHNtX29pLCArK2xhc3Rfb2JqZWN0X2lkKTsKLQotCXJjID0gb2JkX2NyZWF0ZShlbnYsIGVjLT5lY19leHAsIG9hLCAmbHNtLCBvdGkpOworCXJjID0gb2JkX2NyZWF0ZShlbnYsIGVjLT5lY19leHAsIG9hLCBvdGkpOwogCWlmIChyYyAhPSAwKSB7CiAJCUNFUlJPUigiQ2Fubm90IGNyZWF0ZSBvYmplY3RzOiByYyA9ICVkXG4iLCByYyk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAljcmVhdGVkID0gMTsKIAotCS8qIFNlZSB3aGF0IG9iamVjdCBJRCB3ZSB3ZXJlIGdpdmVuICovCi0Jb2EtPm9fb2kgPSBsc20tPmxzbV9vaTsKIAlvYS0+b192YWxpZCB8PSBPQkRfTURfRkxJRDsKIAotCWVjbyA9IGNsX2VjaG9fb2JqZWN0X2ZpbmQoZWQsICZsc20pOworCWVjbyA9IGNsX2VjaG9fb2JqZWN0X2ZpbmQoZWQsICZvYS0+b19vaSk7CiAJaWYgKElTX0VSUihlY28pKSB7CiAJCXJjID0gUFRSX0VSUihlY28pOwogCQlnb3RvIGZhaWxlZDsKQEAgLTExOTAsOSArMTEzNyw3IEBACiAKICBmYWlsZWQ6CiAJaWYgKGNyZWF0ZWQgJiYgcmMpCi0JCW9iZF9kZXN0cm95KGVudiwgZWMtPmVjX2V4cCwgb2EsIGxzbSwgb3RpLCBOVUxMKTsKLQlpZiAobHNtKQotCQllY2hvX2ZyZWVfbWVtbWQoZWQsICZsc20pOworCQlvYmRfZGVzdHJveShlbnYsIGVjLT5lY19leHAsIG9hLCBvdGkpOwogCWlmIChyYykKIAkJQ0VSUk9SKCJjcmVhdGUgb2JqZWN0IGZhaWxlZCB3aXRoOiByYyA9ICVkXG4iLCByYyk7CiAJcmV0dXJuIHJjOwpAQCAtMTIwMSwzMiArMTE0NiwyMSBAQAogc3RhdGljIGludCBlY2hvX2dldF9vYmplY3Qoc3RydWN0IGVjaG9fb2JqZWN0ICoqZWNvcCwgc3RydWN0IGVjaG9fZGV2aWNlICplZCwKIAkJCSAgIHN0cnVjdCBvYmRvICpvYSkKIHsKLQlzdHJ1Y3QgbG92X3N0cmlwZV9tZCAgICpsc20gPSBOVUxMOwogCXN0cnVjdCBlY2hvX29iamVjdCAgICAgKmVjbzsKIAlpbnQJCSAgICAgcmM7CiAKLQlpZiAoKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMSUQpID09IDAgfHwgb3N0aWRfaWQoJm9hLT5vX29pKSA9PSAwKSB7Ci0JCS8qIGRpc2FsbG93IHVzZSBvZiBvYmplY3QgaWQgMCAqLwotCQlDRVJST1IoIk5vIHZhbGlkIG9pZFxuIik7CisJaWYgKCEob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxJRCkgfHwgIShvYS0+b192YWxpZCAmIE9CRF9NRF9GTEdST1VQKSB8fAorCSAgICAhb3N0aWRfaWQoJm9hLT5vX29pKSkgeworCQlDRVJST1IoImludmFsaWQgb2lkICIgRE9TVElEICJcbiIsIFBPU1RJRCgmb2EtPm9fb2kpKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmMgPSBlY2hvX2FsbG9jX21lbW1kKGVkLCAmbHNtKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlsc20tPmxzbV9vaSA9IG9hLT5vX29pOwotCWlmICghKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMR1JPVVApKQotCQlvc3RpZF9zZXRfc2VxX2VjaG8oJmxzbS0+bHNtX29pKTsKLQogCXJjID0gMDsKLQllY28gPSBjbF9lY2hvX29iamVjdF9maW5kKGVkLCAmbHNtKTsKKwllY28gPSBjbF9lY2hvX29iamVjdF9maW5kKGVkLCAmb2EtPm9fb2kpOwogCWlmICghSVNfRVJSKGVjbykpCiAJCSplY29wID0gZWNvOwogCWVsc2UKIAkJcmMgPSBQVFJfRVJSKGVjbyk7Ci0JaWYgKGxzbSkKLQkJZWNob19mcmVlX21lbW1kKGVkLCAmbHNtKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTE0MzYsMTMgKzEzNzAsMTIgQEAKIAkJCW5wYWdlcyA9IHRvdF9wYWdlczsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyssIG9mZiArPSBQQUdFX1NJWkUpIHsKLQkJCXJuYltpXS5vZmZzZXQgPSBvZmY7Ci0JCQlybmJbaV0ubGVuID0gUEFHRV9TSVpFOwotCQkJcm5iW2ldLmZsYWdzID0gYnJ3X2ZsYWdzOworCQkJcm5iW2ldLnJuYl9vZmZzZXQgPSBvZmY7CisJCQlybmJbaV0ucm5iX2xlbiA9IFBBR0VfU0laRTsKKwkJCXJuYltpXS5ybmJfZmxhZ3MgPSBicndfZmxhZ3M7CiAJCX0KIAogCQlpb28uaW9vX2J1ZmNudCA9IG5wYWdlczsKLQkJb3RpLT5vdGlfdHJhbnNubyA9IDA7CiAKIAkJbHBhZ2VzID0gbnBhZ2VzOwogCQlyZXQgPSBvYmRfcHJlcHJ3KGVudiwgcncsIGV4cCwgb2EsIDEsICZpb28sIHJuYiwgJmxwYWdlcywKQEAgLTE0NTIsMTQgKzEzODUsMTQgQEAKIAkJTEFTU0VSVChscGFnZXMgPT0gbnBhZ2VzKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgbHBhZ2VzOyBpKyspIHsKLQkJCXN0cnVjdCBwYWdlICpwYWdlID0gbG5iW2ldLnBhZ2U7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGxuYltpXS5sbmJfcGFnZTsKIAogCQkJLyogcmVhZCBwYXN0IGVvZj8gKi8KLQkJCWlmICghcGFnZSAgJiYgbG5iW2ldLnJjID09IDApCisJCQlpZiAoIXBhZ2UgICYmIGxuYltpXS5sbmJfcmMgPT0gMCkKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKGFzeW5jKQotCQkJCWxuYltpXS5mbGFncyB8PSBPQkRfQlJXX0FTWU5DOworCQkJCWxuYltpXS5sbmJfZmxhZ3MgfD0gT0JEX0JSV19BU1lOQzsKIAogCQkJaWYgKG9zdGlkX2lkKCZvYS0+b19vaSkgPT0gRUNIT19QRVJTSVNURU5UX09CSklEIHx8CiAJCQkgICAgKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMRkxBR1MpID09IDAgfHwKQEAgLTE0NjksMTMgKzE0MDIsMTMgQEAKIAkJCWlmIChydyA9PSBPQkRfQlJXX1dSSVRFKQogCQkJCWVjaG9fY2xpZW50X3BhZ2VfZGVidWdfc2V0dXAocGFnZSwgcncsCiAJCQkJCQkJICAgIG9zdGlkX2lkKCZvYS0+b19vaSksCi0JCQkJCQkJICAgICBybmJbaV0ub2Zmc2V0LAotCQkJCQkJCSAgICAgcm5iW2ldLmxlbik7CisJCQkJCQkJICAgICBybmJbaV0ucm5iX29mZnNldCwKKwkJCQkJCQkgICAgIHJuYltpXS5ybmJfbGVuKTsKIAkJCWVsc2UKIAkJCQllY2hvX2NsaWVudF9wYWdlX2RlYnVnX2NoZWNrKHBhZ2UsCiAJCQkJCQkJICAgIG9zdGlkX2lkKCZvYS0+b19vaSksCi0JCQkJCQkJICAgICBybmJbaV0ub2Zmc2V0LAotCQkJCQkJCSAgICAgcm5iW2ldLmxlbik7CisJCQkJCQkJICAgICBybmJbaV0ucm5iX29mZnNldCwKKwkJCQkJCQkgICAgIHJuYltpXS5ybmJfbGVuKTsKIAkJfQogCiAJCXJldCA9IG9iZF9jb21taXRydyhlbnYsIHJ3LCBleHAsIG9hLCAxLCAmaW9vLApAQCAtMTYxMyw4ICsxNTQ2LDcgQEAKIAogCQlyYyA9IGVjaG9fZ2V0X29iamVjdCgmZWNvLCBlZCwgb2EpOwogCQlpZiAocmMgPT0gMCkgewotCQkJcmMgPSBvYmRfZGVzdHJveShlbnYsIGVjLT5lY19leHAsIG9hLCBOVUxMLAotCQkJCQkgJmR1bW15X290aSwgTlVMTCk7CisJCQlyYyA9IG9iZF9kZXN0cm95KGVudiwgZWMtPmVjX2V4cCwgb2EsICZkdW1teV9vdGkpOwogCQkJaWYgKHJjID09IDApCiAJCQkJZWNvLT5lb19kZWxldGVkID0gMTsKIAkJCWVjaG9fcHV0X29iamVjdChlY28pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9faW50ZXJuYWwuaAppbmRleCBmNTAzNGEyLi45NjY0MTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9faW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9faW50ZXJuYWwuaApAQCAtMzMsOSArMzMsOSBAQAogCiAvKiBUaGUgcGVyc2lzdGVudCBvYmplY3QgKGkuZS4gYWN0dWFsbHkgc3RvcmVzIHN0dWZmISkgKi8KICNkZWZpbmUgRUNIT19QRVJTSVNURU5UX09CSklEICAgIDFVTEwKLSNkZWZpbmUgRUNIT19QRVJTSVNURU5UX1NJWkUgICAgICgoX191NjQpKDE8PDIwKSkKKyNkZWZpbmUgRUNIT19QRVJTSVNURU5UX1NJWkUgICAgICgoX191NjQpKDEgPDwgMjApKQogCiAvKiBibG9jayBzaXplIHRvIHVzZSBmb3IgZGF0YSB2ZXJpZmljYXRpb24gKi8KLSNkZWZpbmUgT0JEX0VDSE9fQkxPQ0tfU0laRQkoNDw8MTApCisjZGVmaW5lIE9CRF9FQ0hPX0JMT0NLX1NJWkUJKDQgPDwgMTApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL2xwcm9jX29zYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL2xwcm9jX29zYy5jCmluZGV4IDdlODNkMzkuLmYwMDYyZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9scHJvY19vc2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2MvbHByb2Nfb3NjLmMKQEAgLTExOSw2ICsxMTksNyBAQAogCiAJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCWNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ID0gdmFsOworCWNsaWVudF9hZGp1c3RfbWF4X2RpcnR5KGNsaSk7CiAJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0xMzYsMTAgKzEzNywxMCBAQAogCWludCBtdWx0OwogCiAJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXZhbCA9IGNsaS0+Y2xfZGlydHlfbWF4OworCXZhbCA9IGNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzOwogCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCi0JbXVsdCA9IDEgPDwgMjA7CisJbXVsdCA9IDEgPDwgKDIwIC0gUEFHRV9TSElGVCk7CiAJcmV0dXJuIGxwcm9jZnNfcmVhZF9mcmFjX2hlbHBlcihidWYsIFBBR0VfU0laRSwgdmFsLCBtdWx0KTsKIH0KIApAQCAtMTY2LDcgKzE2Nyw3IEBACiAJCXJldHVybiAtRVJBTkdFOwogCiAJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCWNsaS0+Y2xfZGlydHlfbWF4ID0gKHUzMikocGFnZXNfbnVtYmVyIDw8IFBBR0VfU0hJRlQpOworCWNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzID0gcGFnZXNfbnVtYmVyOwogCW9zY193YWtlX2NhY2hlX3dhaXRlcnMoY2xpKTsKIAlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIApAQCAtMTgxLDExICsxODIsMTEgQEAKIAlpbnQgc2hpZnQgPSAyMCAtIFBBR0VfU0hJRlQ7CiAKIAlzZXFfcHJpbnRmKG0sCi0JCSAgICJ1c2VkX21iOiAlZFxuIgotCQkgICAiYnVzeV9jbnQ6ICVkXG4iLAotCQkgICAoYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpICsKLQkJICAgIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9idXN5KSkgPj4gc2hpZnQsCi0JCSAgIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9idXN5KSk7CisJCSAgICJ1c2VkX21iOiAlbGRcbiIKKwkJICAgImJ1c3lfY250OiAlbGRcbiIsCisJCSAgIChhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSArCisJCSAgICBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9idXN5KSkgPj4gc2hpZnQsCisJCSAgIGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2J1c3kpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTk3LDggKzE5OCwxMCBAQAogewogCXN0cnVjdCBvYmRfZGV2aWNlICpkZXYgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YSktPnByaXZhdGU7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZkZXYtPnUuY2xpOwotCWludCBwYWdlc19udW1iZXIsIG11bHQsIHJjOworCWxvbmcgcGFnZXNfbnVtYmVyLCByYzsKIAljaGFyIGtlcm5idWZbMTI4XTsKKwlpbnQgbXVsdDsKKwl1NjQgdmFsOwogCiAJaWYgKGNvdW50ID49IHNpemVvZihrZXJuYnVmKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMTAsMTQgKzIxMywxOCBAQAogCW11bHQgPSAxIDw8ICgyMCAtIFBBR0VfU0hJRlQpOwogCWJ1ZmZlciArPSBscHJvY2ZzX2ZpbmRfbmFtZWRfdmFsdWUoa2VybmJ1ZiwgInVzZWRfbWI6IiwgJmNvdW50KSAtCiAJCSAga2VybmJ1ZjsKLQlyYyA9IGxwcm9jZnNfd3JpdGVfZnJhY19oZWxwZXIoYnVmZmVyLCBjb3VudCwgJnBhZ2VzX251bWJlciwgbXVsdCk7CisJcmMgPSBscHJvY2ZzX3dyaXRlX2ZyYWNfdTY0X2hlbHBlcihidWZmZXIsIGNvdW50LCAmdmFsLCBtdWx0KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAorCWlmICh2YWwgPiBMT05HX01BWCkKKwkJcmV0dXJuIC1FUkFOR0U7CisJcGFnZXNfbnVtYmVyID0gKGxvbmcpdmFsOworCiAJaWYgKHBhZ2VzX251bWJlciA8IDApCiAJCXJldHVybiAtRVJBTkdFOwogCi0JcmMgPSBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgLSBwYWdlc19udW1iZXI7CisJcmMgPSBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSAtIHBhZ2VzX251bWJlcjsKIAlpZiAocmMgPiAwKSB7CiAJCXN0cnVjdCBsdV9lbnYgKmVudjsKIAkJaW50IHJlZmNoZWNrOwpAQCAtMjQ0LDcgKzI1MSw3IEBACiAJaW50IGxlbjsKIAogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgY2xpLT5jbF9kaXJ0eSk7CisJbGVuID0gc3ByaW50ZihidWYsICIlbHVcbiIsIGNsaS0+Y2xfZGlydHlfcGFnZXMgPDwgUEFHRV9TSElGVCk7CiAJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAKIAlyZXR1cm4gbGVuOwpAQCAtNTgzLDYgKzU5MCw3IEBACiAJfQogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIAljbGktPmNsX21heF9wYWdlc19wZXJfcnBjID0gdmFsOworCWNsaWVudF9hZGp1c3RfbWF4X2RpcnR5KGNsaSk7CiAJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CkBAIC01OTYsMTMgKzYwNCwxNCBAQAogCXN0cnVjdCBvYmRfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG9iZF9kZXZpY2UsCiAJCQkJCSAgICAgIG9iZF9rb2JqKTsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmRldi0+dS5jbGk7Ci0JaW50IHBhZ2VzLCBtYjsKKwlsb25nIHBhZ2VzOworCWludCBtYjsKIAotCXBhZ2VzID0gYXRvbWljX3JlYWQoJmNsaS0+Y2xfdW5zdGFibGVfY291bnQpOworCXBhZ2VzID0gYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF91bnN0YWJsZV9jb3VudCk7CiAJbWIgPSAocGFnZXMgKiBQQUdFX1NJWkUpID4+IDIwOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAidW5zdGFibGVfcGFnZXM6ICU4ZFxuIgotCQkgICAgICAgInVuc3RhYmxlX21iOiAgICAlOGRcbiIsIHBhZ2VzLCBtYik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAidW5zdGFibGVfcGFnZXM6ICUyMGxkXG4iCisJCSAgICAgICAidW5zdGFibGVfbWI6ICAgICAgICAgICAgICAlMTBkXG4iLCBwYWdlcywgbWIpOwogfQogTFVTVFJFX1JPX0FUVFIodW5zdGFibGVfc3RhdHMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NhY2hlLmMKaW5kZXggZDAxMTEzNS4uNGJiZTIxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jYWNoZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2FjaGUuYwpAQCAtNDQsNyArNDQsNyBAQAogCiBzdGF0aWMgdm9pZCBvc2NfdXBkYXRlX3BlbmRpbmcoc3RydWN0IG9zY19vYmplY3QgKm9iaiwgaW50IGNtZCwgaW50IGRlbHRhKTsKIHN0YXRpYyBpbnQgb3NjX2V4dGVudF93YWl0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9zY19leHRlbnQgKmV4dCwKLQkJCSAgIGludCBzdGF0ZSk7CisJCQkgICBlbnVtIG9zY19leHRlbnRfc3RhdGUgc3RhdGUpOwogc3RhdGljIHZvaWQgb3NjX2FwX2NvbXBsZXRpb24oY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLAogCQkJICAgICAgc3RydWN0IG9zY19hc3luY19wYWdlICpvYXAsIGludCBzZW50LCBpbnQgcmMpOwogc3RhdGljIGludCBvc2NfbWFrZV9yZWFkeShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqb2FwLApAQCAtMTc3LDcgKzE3Nyw3IEBACiB7CiAJc3RydWN0IG9zY19vYmplY3QgKm9iaiA9IGV4dC0+b2Vfb2JqOwogCXN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqb2FwOwotCWludCBwYWdlX2NvdW50OworCXNpemVfdCBwYWdlX2NvdW50OwogCWludCByYyA9IDA7CiAKIAlpZiAoIW9zY19vYmplY3RfaXNfbG9ja2VkKG9iaikpIHsKQEAgLTYzMiw3ICs2MzIsNyBAQAogICovCiBzdGF0aWMgc3RydWN0IG9zY19leHRlbnQgKm9zY19leHRlbnRfZmluZChjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsCiAJCQkJCSAgc3RydWN0IG9zY19vYmplY3QgKm9iaiwgcGdvZmZfdCBpbmRleCwKLQkJCQkJICBpbnQgKmdyYW50cykKKwkJCQkJICB1bnNpZ25lZCBpbnQgKmdyYW50cykKIHsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gb3NjX2NsaShvYmopOwogCXN0cnVjdCBvc2NfbG9jayAgICpvbGNrOwpAQCAtNjQzLDEwICs2NDMsMTAgQEAKIAlzdHJ1Y3Qgb3NjX2V4dGVudCAqZm91bmQgPSBOVUxMOwogCXBnb2ZmX3QgY2h1bms7CiAJcGdvZmZfdCBtYXhfZW5kOwotCWludCBtYXhfcGFnZXM7IC8qIG1heF9wYWdlc19wZXJfcnBjICovCi0JaW50IGNodW5rc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzOyAvKiBtYXhfcGFnZXNfcGVyX3JwYyAqLworCXVuc2lnbmVkIGludCBjaHVua3NpemU7CiAJaW50IHBwY19iaXRzOyAvKiBwYWdlcyBwZXIgY2h1bmsgYml0cyAqLwotCWludCBjaHVua19tYXNrOworCXBnb2ZmX3QgY2h1bmtfbWFzazsKIAlpbnQgcmM7CiAKIAljdXIgPSBvc2NfZXh0ZW50X2FsbG9jKG9iaik7CkBAIC03MDAsOCArNzAwLDggQEAKIAlpZiAoIWV4dCkKIAkJZXh0ID0gZmlyc3RfZXh0ZW50KG9iaik7CiAJd2hpbGUgKGV4dCkgewotCQlsb2ZmX3QgZXh0X2Noa19zdGFydCA9IGV4dC0+b2Vfc3RhcnQgPj4gcHBjX2JpdHM7Ci0JCWxvZmZfdCBleHRfY2hrX2VuZCA9IGV4dC0+b2VfZW5kID4+IHBwY19iaXRzOworCQlwZ29mZl90IGV4dF9jaGtfc3RhcnQgPSBleHQtPm9lX3N0YXJ0ID4+IHBwY19iaXRzOworCQlwZ29mZl90IGV4dF9jaGtfZW5kID0gZXh0LT5vZV9lbmQgPj4gcHBjX2JpdHM7CiAKIAkJTEFTU0VSVChzYW5pdHlfY2hlY2tfbm9sb2NrKGV4dCkgPT0gMCk7CiAJCWlmIChjaHVuayA+IGV4dF9jaGtfZW5kICsgMSkKQEAgLTkxMyw3ICs5MTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV4dGVudF93YWl0X2NiKHN0cnVjdCBvc2NfZXh0ZW50ICpleHQsIGludCBzdGF0ZSkKK3N0YXRpYyBpbnQgZXh0ZW50X3dhaXRfY2Ioc3RydWN0IG9zY19leHRlbnQgKmV4dCwgZW51bSBvc2NfZXh0ZW50X3N0YXRlIHN0YXRlKQogewogCWludCByZXQ7CiAKQEAgLTkyOCw3ICs5MjgsNyBAQAogICogV2FpdCBmb3IgdGhlIGV4dGVudCdzIHN0YXRlIHRvIGJlY29tZSBAc3RhdGUuCiAgKi8KIHN0YXRpYyBpbnQgb3NjX2V4dGVudF93YWl0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IG9zY19leHRlbnQgKmV4dCwKLQkJCSAgIGludCBzdGF0ZSkKKwkJCSAgIGVudW0gb3NjX2V4dGVudF9zdGF0ZSBzdGF0ZSkKIHsKIAlzdHJ1Y3Qgb3NjX29iamVjdCAqb2JqID0gZXh0LT5vZV9vYmo7CiAJc3RydWN0IGxfd2FpdF9pbmZvIGx3aSA9IExXSV9USU1FT1VUX0lOVFIoY2ZzX3RpbWVfc2Vjb25kcyg2MDApLCBOVUxMLApAQCAtOTU4LDggKzk1OCw4IEBACiAJcmMgPSBsX3dhaXRfZXZlbnQoZXh0LT5vZV93YWl0cSwgZXh0ZW50X3dhaXRfY2IoZXh0LCBzdGF0ZSksICZsd2kpOwogCWlmIChyYyA9PSAtRVRJTUVET1VUKSB7CiAJCU9TQ19FWFRFTlRfRFVNUChEX0VSUk9SLCBleHQsCi0JCQkiJXM6IHdhaXQgZXh0IHRvICVkIHRpbWVkb3V0LCByZWNvdmVyeSBpbiBwcm9ncmVzcz9cbiIsCi0JCQlvc2NfZXhwb3J0KG9iaiktPmV4cF9vYmQtPm9iZF9uYW1lLCBzdGF0ZSk7CisJCQkJIiVzOiB3YWl0IGV4dCB0byAldSB0aW1lZG91dCwgcmVjb3ZlcnkgaW4gcHJvZ3Jlc3M/XG4iLAorCQkJCW9zY19leHBvcnQob2JqKS0+ZXhwX29iZC0+b2JkX25hbWUsIHN0YXRlKTsKIAogCQlsd2kgPSBMV0lfSU5UUihOVUxMLCBOVUxMKTsKIAkJcmMgPSBsX3dhaXRfZXZlbnQoZXh0LT5vZV93YWl0cSwgZXh0ZW50X3dhaXRfY2IoZXh0LCBzdGF0ZSksCkBAIC0xMDk5LDcgKzEwOTksNyBAQAogCXN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqb2FwOwogCXN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqbGFzdCA9IE5VTEw7CiAJc3RydWN0IG9zY19vYmplY3QgKm9iaiA9IGV4dC0+b2Vfb2JqOwotCWludCBwYWdlX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgcGFnZV9jb3VudCA9IDA7CiAJaW50IHJjOwogCiAJLyogd2UncmUgZ29pbmcgdG8gZ3JhYiBwYWdlIGxvY2ssIHNvIG9iamVjdCBsb2NrIG11c3Qgbm90IGJlIHRha2VuLiAqLwpAQCAtMTE0MCw5ICsxMTQwLDExIEBACiAJICogdGhlIHNpemUgb2YgZmlsZS4KIAkgKi8KIAlpZiAoIShsYXN0LT5vYXBfYXN5bmNfZmxhZ3MgJiBBU1lOQ19DT1VOVF9TVEFCTEUpKSB7Ci0JCWxhc3QtPm9hcF9jb3VudCA9IG9zY19yZWZyZXNoX2NvdW50KGVudiwgbGFzdCwgT0JEX0JSV19XUklURSk7Ci0JCUxBU1NFUlQobGFzdC0+b2FwX2NvdW50ID4gMCk7Ci0JCUxBU1NFUlQobGFzdC0+b2FwX3BhZ2Vfb2ZmICsgbGFzdC0+b2FwX2NvdW50IDw9IFBBR0VfU0laRSk7CisJCWludCBsYXN0X29hcF9jb3VudCA9IG9zY19yZWZyZXNoX2NvdW50KGVudiwgbGFzdCwgT0JEX0JSV19XUklURSk7CisKKwkJTEFTU0VSVChsYXN0X29hcF9jb3VudCA+IDApOworCQlMQVNTRVJUKGxhc3QtPm9hcF9wYWdlX29mZiArIGxhc3Rfb2FwX2NvdW50IDw9IFBBR0VfU0laRSk7CisJCWxhc3QtPm9hcF9jb3VudCA9IGxhc3Rfb2FwX2NvdW50OwogCQlzcGluX2xvY2soJmxhc3QtPm9hcF9sb2NrKTsKIAkJbGFzdC0+b2FwX2FzeW5jX2ZsYWdzIHw9IEFTWU5DX0NPVU5UX1NUQUJMRTsKIAkJc3Bpbl91bmxvY2soJmxhc3QtPm9hcF9sb2NrKTsKQEAgLTExNzQsNyArMTE3Niw4IEBACiAgKiBjYWxsZWQgdG8gZXhwYW5kIHRoZSBleHRlbnQgZm9yIHRoZSBzYW1lIElPLiBUbyBleHBhbmQgdGhlIGV4dGVudCwgdGhlCiAgKiBwYWdlIGluZGV4IG11c3QgYmUgaW4gdGhlIHNhbWUgb3IgbmV4dCBjaHVuayBvZiBleHQtPm9lX2VuZC4KICAqLwotc3RhdGljIGludCBvc2NfZXh0ZW50X2V4cGFuZChzdHJ1Y3Qgb3NjX2V4dGVudCAqZXh0LCBwZ29mZl90IGluZGV4LCBpbnQgKmdyYW50cykKK3N0YXRpYyBpbnQgb3NjX2V4dGVudF9leHBhbmQoc3RydWN0IG9zY19leHRlbnQgKmV4dCwgcGdvZmZfdCBpbmRleCwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpncmFudHMpCiB7CiAJc3RydWN0IG9zY19vYmplY3QgKm9iaiA9IGV4dC0+b2Vfb2JqOwogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSBvc2NfY2xpKG9iaik7CkBAIC0xMTgzLDcgKzExODYsNyBAQAogCXBnb2ZmX3QgY2h1bmsgPSBpbmRleCA+PiBwcGNfYml0czsKIAlwZ29mZl90IGVuZF9jaHVuazsKIAlwZ29mZl90IGVuZF9pbmRleDsKLQlpbnQgY2h1bmtzaXplID0gMSA8PCBjbGktPmNsX2NodW5rYml0czsKKwl1bnNpZ25lZCBpbnQgY2h1bmtzaXplID0gMSA8PCBjbGktPmNsX2NodW5rYml0czsKIAlpbnQgcmMgPSAwOwogCiAJTEFTU0VSVChleHQtPm9lX21heF9lbmQgPj0gaW5kZXggJiYgZXh0LT5vZV9zdGFydCA8PSBpbmRleCk7CkBAIC0xMzYxLDcgKzEzNjQsNyBAQAogCWlmIChyYyA9PSAwICYmIHNydmxvY2spIHsKIAkJc3RydWN0IGx1X2RldmljZSAqbGQgPSBvcGctPm9wc19jbC5jcGxfb2JqLT5jb19sdS5sb19kZXY7CiAJCXN0cnVjdCBvc2Nfc3RhdHMgKnN0YXRzID0gJmx1Mm9zY19kZXYobGQpLT5vZF9zdGF0czsKLQkJaW50IGJ5dGVzID0gb2FwLT5vYXBfY291bnQ7CisJCXNpemVfdCBieXRlcyA9IG9hcC0+b2FwX2NvdW50OwogCiAJCWlmIChjcnQgPT0gQ1JUX1JFQUQpCiAJCQlzdGF0cy0+b3NfbG9ja2xlc3NfcmVhZHMgKz0gYnl0ZXM7CkBAIC0xMzgzLDE4ICsxMzg2LDE2IEBACiAKICNkZWZpbmUgT1NDX0RVTVBfR1JBTlQobHZsLCBjbGksIGZtdCwgYXJncy4uLikgZG8gewkJCSAgICAgIFwKIAlzdHJ1Y3QgY2xpZW50X29iZCAqX190bXAgPSAoY2xpKTsJCQkJICAgICAgXAotCUNERUJVRyhsdmwsICIlczogZ3JhbnQgeyBkaXJ0eTogJWxkLyVsZCBkaXJ0eV9wYWdlczogJWQvJWQgIgkgICAgICBcCi0JICAgICAgICJ1bnN0YWJsZV9wYWdlczogJWQvJWQgZHJvcHBlZDogJWxkIGF2YWlsOiAlbGQsICIJICAgICAgXAotCSAgICAgICAicmVzZXJ2ZWQ6ICVsZCwgZmxpZ2h0OiAlZCB9IGxydSB7aW4gbGlzdDogJWQsICIJCSAgICAgIFwKLQkgICAgICAgImxlZnQ6ICVkLCB3YWl0ZXJzOiAlZCB9IiBmbXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCUNERUJVRyhsdmwsICIlczogZ3JhbnQgeyBkaXJ0eTogJWxkLyVsZCBkaXJ0eV9wYWdlczogJWxkLyVsdSAiCSAgICAgIFwKKwkgICAgICAgImRyb3BwZWQ6ICVsZCBhdmFpbDogJWxkLCByZXNlcnZlZDogJWxkLCBmbGlnaHQ6ICVkIH0iCSAgICAgIFwKKwkgICAgICAgImxydSB7aW4gbGlzdDogJWxkLCBsZWZ0OiAlbGQsIHdhaXRlcnM6ICVkIH0iIGZtdCAiXG4iLAkgICAgICBcCiAJICAgICAgIF9fdG1wLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLAkJCSAgICAgIFwKLQkgICAgICAgX190bXAtPmNsX2RpcnR5LCBfX3RtcC0+Y2xfZGlydHlfbWF4LAkJCSAgICAgIFwKLQkgICAgICAgYXRvbWljX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcyksIG9iZF9tYXhfZGlydHlfcGFnZXMsCSAgICAgIFwKLQkgICAgICAgYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcyksIG9iZF9tYXhfZGlydHlfcGFnZXMsCSAgICAgIFwKKwkgICAgICAgX190bXAtPmNsX2RpcnR5X3BhZ2VzLCBfX3RtcC0+Y2xfZGlydHlfbWF4X3BhZ2VzLAkgICAgICBcCisJICAgICAgIGF0b21pY19sb25nX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcyksIG9iZF9tYXhfZGlydHlfcGFnZXMsCSAgICAgIFwKIAkgICAgICAgX190bXAtPmNsX2xvc3RfZ3JhbnQsIF9fdG1wLT5jbF9hdmFpbF9ncmFudCwJCSAgICAgIFwKIAkgICAgICAgX190bXAtPmNsX3Jlc2VydmVkX2dyYW50LCBfX3RtcC0+Y2xfd19pbl9mbGlnaHQsCQkgICAgICBcCi0JICAgICAgIGF0b21pY19yZWFkKCZfX3RtcC0+Y2xfbHJ1X2luX2xpc3QpLAkJCSAgICAgIFwKLQkgICAgICAgYXRvbWljX3JlYWQoJl9fdG1wLT5jbF9scnVfYnVzeSksCQkJICAgICAgXAorCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZfX3RtcC0+Y2xfbHJ1X2luX2xpc3QpLAkJICAgICAgXAorCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZfX3RtcC0+Y2xfbHJ1X2J1c3kpLAkJCSAgICAgIFwKIAkgICAgICAgYXRvbWljX3JlYWQoJl9fdG1wLT5jbF9scnVfc2hyaW5rZXJzKSwgIyNhcmdzKTsJCSAgICAgIFwKIH0gd2hpbGUgKDApCiAKQEAgLTE0MDQsOCArMTQwNSw4IEBACiB7CiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCUxBU1NFUlQoIShwZ2EtPmZsYWcgJiBPQkRfQlJXX0ZST01fR1JBTlQpKTsKLQlhdG9taWNfaW5jKCZvYmRfZGlydHlfcGFnZXMpOwotCWNsaS0+Y2xfZGlydHkgKz0gUEFHRV9TSVpFOworCWF0b21pY19sb25nX2luYygmb2JkX2RpcnR5X3BhZ2VzKTsKKwljbGktPmNsX2RpcnR5X3BhZ2VzKys7CiAJcGdhLT5mbGFnIHw9IE9CRF9CUldfRlJPTV9HUkFOVDsKIAlDREVCVUcoRF9DQUNIRSwgInVzaW5nICVsdSBncmFudCBjcmVkaXRzIGZvciBicncgJXAgcGFnZSAlcFxuIiwKIAkgICAgICAgUEFHRV9TSVpFLCBwZ2EsIHBnYS0+cGcpOwpAQCAtMTQyNCwxMiArMTQyNSwxMiBAQAogCX0KIAogCXBnYS0+ZmxhZyAmPSB+T0JEX0JSV19GUk9NX0dSQU5UOwotCWF0b21pY19kZWMoJm9iZF9kaXJ0eV9wYWdlcyk7Ci0JY2xpLT5jbF9kaXJ0eSAtPSBQQUdFX1NJWkU7CisJYXRvbWljX2xvbmdfZGVjKCZvYmRfZGlydHlfcGFnZXMpOworCWNsaS0+Y2xfZGlydHlfcGFnZXMtLTsKIAlpZiAocGdhLT5mbGFnICYgT0JEX0JSV19OT0NBQ0hFKSB7CiAJCXBnYS0+ZmxhZyAmPSB+T0JEX0JSV19OT0NBQ0hFOwotCQlhdG9taWNfZGVjKCZvYmRfZGlydHlfdHJhbnNpdF9wYWdlcyk7Ci0JCWNsaS0+Y2xfZGlydHlfdHJhbnNpdCAtPSBQQUdFX1NJWkU7CisJCWF0b21pY19sb25nX2RlYygmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpOworCQljbGktPmNsX2RpcnR5X3RyYW5zaXQtLTsKIAl9CiB9CiAKQEAgLTE0OTQsMTEgKzE0OTUsMTEgQEAKIHN0YXRpYyB2b2lkIG9zY19mcmVlX2dyYW50KHN0cnVjdCBjbGllbnRfb2JkICpjbGksIHVuc2lnbmVkIGludCBucl9wYWdlcywKIAkJCSAgIHVuc2lnbmVkIGludCBsb3N0X2dyYW50KQogewotCWludCBncmFudCA9ICgxIDw8IGNsaS0+Y2xfY2h1bmtiaXRzKSArIGNsaS0+Y2xfZXh0ZW50X3RheDsKKwl1bnNpZ25lZCBsb25nIGdyYW50ID0gKDEgPDwgY2xpLT5jbF9jaHVua2JpdHMpICsgY2xpLT5jbF9leHRlbnRfdGF4OwogCiAJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCWF0b21pY19zdWIobnJfcGFnZXMsICZvYmRfZGlydHlfcGFnZXMpOwotCWNsaS0+Y2xfZGlydHkgLT0gbnJfcGFnZXMgPDwgUEFHRV9TSElGVDsKKwlhdG9taWNfbG9uZ19zdWIobnJfcGFnZXMsICZvYmRfZGlydHlfcGFnZXMpOworCWNsaS0+Y2xfZGlydHlfcGFnZXMgLT0gbnJfcGFnZXM7CiAJY2xpLT5jbF9sb3N0X2dyYW50ICs9IGxvc3RfZ3JhbnQ7CiAJaWYgKGNsaS0+Y2xfYXZhaWxfZ3JhbnQgPCBncmFudCAmJiBjbGktPmNsX2xvc3RfZ3JhbnQgPj0gZ3JhbnQpIHsKIAkJLyogYm9ycm93IHNvbWUgZ3JhbnQgZnJvbSB0cnVuY2F0ZSB0byBhdm9pZCB0aGUgY2FzZSB0aGF0CkBAIC0xNTExLDcgKzE1MTIsNyBAQAogCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCUNERUJVRyhEX0NBQ0hFLCAibG9zdCAldSBncmFudDogJWx1IGF2YWlsOiAlbHUgZGlydHk6ICVsdVxuIiwKIAkgICAgICAgbG9zdF9ncmFudCwgY2xpLT5jbF9sb3N0X2dyYW50LAotCSAgICAgICBjbGktPmNsX2F2YWlsX2dyYW50LCBjbGktPmNsX2RpcnR5KTsKKwkgICAgICAgY2xpLT5jbF9hdmFpbF9ncmFudCwgY2xpLT5jbF9kaXJ0eV9wYWdlcyA8PCBQQUdFX1NISUZUKTsKIH0KIAogLyoqCkBAIC0xNTM1LDE5ICsxNTM2LDE4IEBACiB7CiAJaW50IHJjOwogCi0JT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLCAibmVlZDolZC5cbiIsIGJ5dGVzKTsKKwlPU0NfRFVNUF9HUkFOVChEX0NBQ0hFLCBjbGksICJuZWVkOiVkXG4iLCBieXRlcyk7CiAKIAlyYyA9IG9zY19yZXNlcnZlX2dyYW50KGNsaSwgYnl0ZXMpOwogCWlmIChyYyA8IDApCiAJCXJldHVybiAwOwogCi0JaWYgKGNsaS0+Y2xfZGlydHkgKyBQQUdFX1NJWkUgPD0gY2xpLT5jbF9kaXJ0eV9tYXggJiYKLQkgICAgYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcykgKyAxICsKLQkgICAgYXRvbWljX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcykgPD0gb2JkX21heF9kaXJ0eV9wYWdlcykgeworCWlmIChjbGktPmNsX2RpcnR5X3BhZ2VzIDw9IGNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzICYmCisJICAgIGF0b21pY19sb25nX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcykgKyAxIDw9IG9iZF9tYXhfZGlydHlfcGFnZXMpIHsKIAkJb3NjX2NvbnN1bWVfd3JpdGVfZ3JhbnQoY2xpLCAmb2FwLT5vYXBfYnJ3X3BhZ2UpOwogCQlpZiAodHJhbnNpZW50KSB7Ci0JCQljbGktPmNsX2RpcnR5X3RyYW5zaXQgKz0gUEFHRV9TSVpFOwotCQkJYXRvbWljX2luYygmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpOworCQkJY2xpLT5jbF9kaXJ0eV90cmFuc2l0Kys7CisJCQlhdG9taWNfbG9uZ19pbmMoJm9iZF9kaXJ0eV90cmFuc2l0X3BhZ2VzKTsKIAkJCW9hcC0+b2FwX2Jyd19mbGFncyB8PSBPQkRfQlJXX05PQ0FDSEU7CiAJCX0KIAkJcmMgPSAxOwpAQCAtMTU4MSwxMSArMTU4MSwxMyBAQAogCXN0cnVjdCBvc2Nfb2JqZWN0ICpvc2MgPSBvYXAtPm9hcF9vYmo7CiAJc3RydWN0IGxvdl9vaW5mbyAqbG9pID0gb3NjLT5vb19vaW5mbzsKIAlzdHJ1Y3Qgb3NjX2NhY2hlX3dhaXRlciBvY3c7Ci0Jc3RydWN0IGxfd2FpdF9pbmZvIGx3aSA9IExXSV9USU1FT1VUX0lOVFIoY2ZzX3RpbWVfc2Vjb25kcyg2MDApLCBOVUxMLAotCQkJCQkJICBMV0lfT05fU0lHTkFMX05PT1AsIE5VTEwpOworCXN0cnVjdCBsX3dhaXRfaW5mbyBsd2k7CiAJaW50IHJjID0gLUVEUVVPVDsKIAotCU9TQ19EVU1QX0dSQU5UKERfQ0FDSEUsIGNsaSwgIm5lZWQ6JWQuXG4iLCBieXRlcyk7CisJbHdpID0gTFdJX1RJTUVPVVRfSU5UUihjZnNfdGltZV9zZWNvbmRzKEFUX09GRiA/IG9iZF90aW1lb3V0IDogYXRfbWF4KSwKKwkJCSAgICAgICBOVUxMLCBMV0lfT05fU0lHTkFMX05PT1AsIE5VTEwpOworCisJT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLCAibmVlZDolZFxuIiwgYnl0ZXMpOwogCiAJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwogCkBAIC0xNTkzLDE0ICsxNTk1LDE2IEBACiAJICogb2YgcXVldWVkIHdyaXRlcyBhbmQgY3JlYXRlIGEgZGlzY29udGlndW91cyBycGMgc3RyZWFtCiAJICovCiAJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX09TQ19OT19HUkFOVCkgfHwKLQkgICAgY2xpLT5jbF9kaXJ0eV9tYXggPCBQQUdFX1NJWkUgICAgIHx8Ci0JICAgIGNsaS0+Y2xfYXIuYXJfZm9yY2Vfc3luYyB8fCBsb2ktPmxvaV9hci5hcl9mb3JjZV9zeW5jKSB7CisJICAgICFjbGktPmNsX2RpcnR5X21heF9wYWdlcyB8fCBjbGktPmNsX2FyLmFyX2ZvcmNlX3N5bmMgfHwKKwkgICAgbG9pLT5sb2lfYXIuYXJfZm9yY2Vfc3luYykgeworCQlPU0NfRFVNUF9HUkFOVChEX0NBQ0hFLCBjbGksICJmb3JjZWQgc3luYyBpL29cbiIpOwogCQlyYyA9IC1FRFFVT1Q7CiAJCWdvdG8gb3V0OwogCX0KIAogCS8qIEhvcGVmdWxseSBub3JtYWwgY2FzZSAtIGNhY2hlIHNwYWNlIGFuZCB3cml0ZSBjcmVkaXRzIGF2YWlsYWJsZSAqLwogCWlmIChvc2NfZW50ZXJfY2FjaGVfdHJ5KGNsaSwgb2FwLCBieXRlcywgMCkpIHsKKwkJT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLCAiZ3JhbnRlZCBmcm9tIGNhY2hlXG4iKTsKIAkJcmMgPSAwOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNjE1LDcgKzE2MTksNyBAQAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9jdy5vY3dfd2FpdHEpOwogCW9jdy5vY3dfb2FwICAgPSBvYXA7CiAJb2N3Lm9jd19ncmFudCA9IGJ5dGVzOwotCXdoaWxlIChjbGktPmNsX2RpcnR5ID4gMCB8fCBjbGktPmNsX3dfaW5fZmxpZ2h0ID4gMCkgeworCXdoaWxlIChjbGktPmNsX2RpcnR5X3BhZ2VzID4gMCB8fCBjbGktPmNsX3dfaW5fZmxpZ2h0ID4gMCkgewogCQlsaXN0X2FkZF90YWlsKCZvY3cub2N3X2VudHJ5LCAmY2xpLT5jbF9jYWNoZV93YWl0ZXJzKTsKIAkJb2N3Lm9jd19yYyA9IDA7CiAJCXNwaW5fdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwpAQCAtMTYyOSwzMiArMTYzMyw0OSBAQAogCiAJCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIAotCQkvKiBsX3dhaXRfZXZlbnQgaXMgaW50ZXJydXB0ZWQgYnkgc2lnbmFsLCBvciB0aW1lZCBvdXQgKi8KIAkJaWYgKHJjIDwgMCkgewotCQkJaWYgKHJjID09IC1FVElNRURPVVQpIHsKLQkJCQlPU0NfRFVNUF9HUkFOVChEX0VSUk9SLCBjbGksCi0JCQkJCSAgICAgICAidHJ5IHRvIHJlc2VydmUgJWQuXG4iLCBieXRlcyk7Ci0JCQkJb3NjX2V4dGVudF90cmVlX2R1bXAoRF9FUlJPUiwgb3NjKTsKLQkJCQlyYyA9IC1FRFFVT1Q7Ci0JCQl9Ci0KKwkJCS8qIGxfd2FpdF9ldmVudCBpcyBpbnRlcnJ1cHRlZCBieSBzaWduYWwsIG9yIHRpbWVkIG91dCAqLwogCQkJbGlzdF9kZWxfaW5pdCgmb2N3Lm9jd19lbnRyeSk7Ci0JCQlnb3RvIG91dDsKKwkJCWJyZWFrOwogCQl9Ci0KIAkJTEFTU0VSVChsaXN0X2VtcHR5KCZvY3cub2N3X2VudHJ5KSk7CiAJCXJjID0gb2N3Lm9jd19yYzsKIAogCQlpZiAocmMgIT0gLUVEUVVPVCkKLQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CiAJCWlmIChvc2NfZW50ZXJfY2FjaGVfdHJ5KGNsaSwgb2FwLCBieXRlcywgMCkpIHsKIAkJCXJjID0gMDsKLQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CiAJCX0KIAl9CisKKwlzd2l0Y2ggKHJjKSB7CisJY2FzZSAwOgorCQlPU0NfRFVNUF9HUkFOVChEX0NBQ0hFLCBjbGksICJmaW5hbGx5IGdvdCBncmFudCBzcGFjZVxuIik7CisJCWJyZWFrOworCWNhc2UgLUVUSU1FRE9VVDoKKwkJT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLAorCQkJICAgICAgICJ0aW1lb3V0LCBmYWxsIGJhY2sgdG8gc3luYyBpL29cbiIpOworCQlvc2NfZXh0ZW50X3RyZWVfZHVtcChEX0NBQ0hFLCBvc2MpOworCQkvKiBmYWxsIGJhY2sgdG8gc3luY2hyb25vdXMgSS9PICovCisJCXJjID0gLUVEUVVPVDsKKwkJYnJlYWs7CisJY2FzZSAtRUlOVFI6CisJCS8qIEVuc3VyZXMgcmVzdGFydGFiaWxpdHkgLSBMVS0zNTgxICovCisJCU9TQ19EVU1QX0dSQU5UKERfQ0FDSEUsIGNsaSwgImludGVycnVwdGVkXG4iKTsKKwkJcmMgPSAtRVJFU1RBUlRTWVM7CisJCWJyZWFrOworCWNhc2UgLUVEUVVPVDoKKwkJT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLAorCQkJICAgICAgICJubyBncmFudCBzcGFjZSwgZmFsbCBiYWNrIHRvIHN5bmMgaS9vXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQ0RFQlVHKERfQ0FDSEUsICIlczogZXZlbnQgZm9yIGNhY2hlIHNwYWNlIEAgJXAgbmV2ZXIgYXJyaXZlZCBkdWUgdG8gJWQsIGZhbGwgYmFjayB0byBzeW5jIGkvb1xuIiwKKwkJICAgICAgIGNsaS0+Y2xfaW1wb3J0LT5pbXBfb2JkLT5vYmRfbmFtZSwgJm9jdywgcmMpOworCQlicmVhazsKKwl9CiBvdXQ6CiAJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JT1NDX0RVTVBfR1JBTlQoRF9DQUNIRSwgY2xpLCAicmV0dXJuZWQgJWQuXG4iLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNjcwLDE5ICsxNjkxLDE3IEBACiAKIAkJb2N3LT5vY3dfcmMgPSAtRURRVU9UOwogCQkvKiB3ZSBjYW4ndCBkaXJ0eSBtb3JlICovCi0JCWlmICgoY2xpLT5jbF9kaXJ0eSArIFBBR0VfU0laRSA+IGNsaS0+Y2xfZGlydHlfbWF4KSB8fAotCQkgICAgKGF0b21pY19yZWFkKCZvYmRfdW5zdGFibGVfcGFnZXMpICsgMSArCi0JCSAgICAgYXRvbWljX3JlYWQoJm9iZF9kaXJ0eV9wYWdlcykgPiBvYmRfbWF4X2RpcnR5X3BhZ2VzKSkgewotCQkJQ0RFQlVHKERfQ0FDSEUsICJubyBkaXJ0eSByb29tOiBkaXJ0eTogJWxkIG9zYyBtYXggJWxkLCBzeXMgbWF4ICVkXG4iLAotCQkJICAgICAgIGNsaS0+Y2xfZGlydHksCi0JCQkgICAgICAgY2xpLT5jbF9kaXJ0eV9tYXgsIG9iZF9tYXhfZGlydHlfcGFnZXMpOworCQlpZiAoKGNsaS0+Y2xfZGlydHlfcGFnZXMgPiBjbGktPmNsX2RpcnR5X21heF9wYWdlcykgfHwKKwkJICAgIChhdG9taWNfbG9uZ19yZWFkKCZvYmRfZGlydHlfcGFnZXMpICsgMSA+CisJCSAgICAgb2JkX21heF9kaXJ0eV9wYWdlcykpIHsKKwkJCUNERUJVRyhEX0NBQ0hFLCAibm8gZGlydHkgcm9vbTogZGlydHk6ICVsZCBvc2MgbWF4ICVsZCwgc3lzIG1heCAlbGRcbiIsCisJCQkgICAgICAgY2xpLT5jbF9kaXJ0eV9wYWdlcywgY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMsCisJCQkgICAgICAgb2JkX21heF9kaXJ0eV9wYWdlcyk7CiAJCQlnb3RvIHdha2V1cDsKIAkJfQogCi0JCW9jdy0+b2N3X3JjID0gMDsKLQkJaWYgKCFvc2NfZW50ZXJfY2FjaGVfdHJ5KGNsaSwgb2N3LT5vY3dfb2FwLCBvY3ctPm9jd19ncmFudCwgMCkpCi0JCQlvY3ctPm9jd19yYyA9IC1FRFFVT1Q7Ci0KKwkJaWYgKG9zY19lbnRlcl9jYWNoZV90cnkoY2xpLCBvY3ctPm9jd19vYXAsIG9jdy0+b2N3X2dyYW50LCAwKSkKKwkJCW9jdy0+b2N3X3JjID0gMDsKIHdha2V1cDoKIAkJQ0RFQlVHKERfQ0FDSEUsICJ3YWtlIHVwICVwIGZvciBvYXAgJXAsIGF2YWlsIGdyYW50ICVsZCwgJWRcbiIsCiAJCSAgICAgICBvY3csIG9jdy0+b2N3X29hcCwgY2xpLT5jbF9hdmFpbF9ncmFudCwgb2N3LT5vY3dfcmMpOwpAQCAtMTg0Myw5NyArMTg2Miw2IEBACiAJCWFyLT5hcl9mb3JjZV9zeW5jID0gMDsKIH0KIAotLyoqCi0gKiBQZXJmb3JtcyAidW5zdGFibGUiIHBhZ2UgYWNjb3VudGluZy4gVGhpcyBmdW5jdGlvbiBiYWxhbmNlcyB0aGUKLSAqIGluY3JlbWVudCBvcGVyYXRpb25zIHBlcmZvcm1lZCBpbiBvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzLiBJdCBpcwotICogcmVnaXN0ZXJlZCBhcyB0aGUgUlBDIHJlcXVlc3QgY2FsbGJhY2ssIGFuZCBpcyBleGVjdXRlZCB3aGVuIHRoZQotICogYnVsayBSUEMgaXMgY29tbWl0dGVkIG9uIHRoZSBzZXJ2ZXIuIFRodXMgYXQgdGhpcyBwb2ludCwgdGhlIHBhZ2VzCi0gKiBpbnZvbHZlZCBpbiB0aGUgYnVsayB0cmFuc2ZlciBhcmUgbm8gbG9uZ2VyIGNvbnNpZGVyZWQgdW5zdGFibGUuCi0gKi8KLXZvaWQgb3NjX2RlY191bnN0YWJsZV9wYWdlcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJnJlcS0+cnFfaW1wb3J0LT5pbXBfb2JkLT51LmNsaTsKLQlzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYyA9IHJlcS0+cnFfYnVsazsKLQlpbnQgcGFnZV9jb3VudCA9IGRlc2MtPmJkX2lvdl9jb3VudDsKLQlpbnQgaTsKLQotCS8qIE5vIHVuc3RhYmxlIHBhZ2UgdHJhY2tpbmcgKi8KLQlpZiAoIWNsaS0+Y2xfY2FjaGUpCi0JCXJldHVybjsKLQotCUxBU1NFUlQocGFnZV9jb3VudCA+PSAwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspCi0JCWRlY19ub2RlX3BhZ2Vfc3RhdGUoZGVzYy0+YmRfaW92W2ldLmtpb3ZfcGFnZSwKLQkJCQkJCQlOUl9VTlNUQUJMRV9ORlMpOwotCi0JYXRvbWljX3N1YihwYWdlX2NvdW50LCAmY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKTsKLQlMQVNTRVJUKGF0b21pY19yZWFkKCZjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfbnIpID49IDApOwotCi0JYXRvbWljX3N1YihwYWdlX2NvdW50LCAmY2xpLT5jbF91bnN0YWJsZV9jb3VudCk7Ci0JTEFTU0VSVChhdG9taWNfcmVhZCgmY2xpLT5jbF91bnN0YWJsZV9jb3VudCkgPj0gMCk7Ci0KLQlhdG9taWNfc3ViKHBhZ2VfY291bnQsICZvYmRfdW5zdGFibGVfcGFnZXMpOwotCUxBU1NFUlQoYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcykgPj0gMCk7Ci0KLQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7Ci0JcmVxLT5ycV9jb21taXR0ZWQgPSAxOwotCXJlcS0+cnFfdW5zdGFibGUgID0gMDsKLQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKLQotCXdha2VfdXBfYWxsKCZjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfd2FpdHEpOwotfQotCi0vKiAidW5zdGFibGUiIHBhZ2UgYWNjb3VudGluZy4gU2VlOiBvc2NfZGVjX3Vuc3RhYmxlX3BhZ2VzLiAqLwotdm9pZCBvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmcmVxLT5ycV9pbXBvcnQtPmltcF9vYmQtPnUuY2xpOwotCXN0cnVjdCBwdGxycGNfYnVsa19kZXNjICpkZXNjID0gcmVxLT5ycV9idWxrOwotCWxvbmcgcGFnZV9jb3VudCA9IGRlc2MtPmJkX2lvdl9jb3VudDsKLQlpbnQgaTsKLQotCS8qIE5vIHVuc3RhYmxlIHBhZ2UgdHJhY2tpbmcgKi8KLQlpZiAoIWNsaS0+Y2xfY2FjaGUpCi0JCXJldHVybjsKLQotCUxBU1NFUlQocGFnZV9jb3VudCA+PSAwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspCi0JCWluY19ub2RlX3BhZ2Vfc3RhdGUoZGVzYy0+YmRfaW92W2ldLmtpb3ZfcGFnZSwKLQkJCQkJCQlOUl9VTlNUQUJMRV9ORlMpOwotCi0JTEFTU0VSVChhdG9taWNfcmVhZCgmY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKSA+PSAwKTsKLQlhdG9taWNfYWRkKHBhZ2VfY291bnQsICZjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfbnIpOwotCi0JTEFTU0VSVChhdG9taWNfcmVhZCgmY2xpLT5jbF91bnN0YWJsZV9jb3VudCkgPj0gMCk7Ci0JYXRvbWljX2FkZChwYWdlX2NvdW50LCAmY2xpLT5jbF91bnN0YWJsZV9jb3VudCk7Ci0KLQlMQVNTRVJUKGF0b21pY19yZWFkKCZvYmRfdW5zdGFibGVfcGFnZXMpID49IDApOwotCWF0b21pY19hZGQocGFnZV9jb3VudCwgJm9iZF91bnN0YWJsZV9wYWdlcyk7Ci0KLQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7Ci0KLQkvKgotCSAqIElmIHRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gY29tbWl0dGVkIChpLmUuIGJyd19jb21taXQKLQkgKiBjYWxsZWQgdmlhIHJxX2NvbW1pdF9jYiksIHdlIG5lZWQgdG8gdW5kbyB0aGUgdW5zdGFibGUgcGFnZQotCSAqIGluY3JlbWVudHMgd2UganVzdCBwZXJmb3JtZWQgYmVjYXVzZSBycV9jb21taXRfY2Igd29udCBiZQotCSAqIGNhbGxlZCBhZ2Fpbi4gT3RoZXJ3aXNlLCBqdXN0IHNldCB0aGUgY29tbWl0IGNhbGxiYWNrIHNvIHRoZQotCSAqIHVuc3RhYmxlIHBhZ2UgYWNjb3VudGluZyBpcyBwcm9wZXJseSB1cGRhdGVkIHdoZW4gdGhlIHJlcXVlc3QKLQkgKiBpcyBjb21taXR0ZWQKLQkgKi8KLQlpZiAocmVxLT5ycV9jb21taXR0ZWQpIHsKLQkJLyogRHJvcCBsb2NrIGJlZm9yZSBjYWxsaW5nIG9zY19kZWNfdW5zdGFibGVfcGFnZXMgKi8KLQkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7Ci0JCW9zY19kZWNfdW5zdGFibGVfcGFnZXMocmVxKTsKLQkJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwotCX0gZWxzZSB7Ci0JCXJlcS0+cnFfdW5zdGFibGUgPSAxOwotCQlyZXEtPnJxX2NvbW1pdF9jYiA9IG9zY19kZWNfdW5zdGFibGVfcGFnZXM7Ci0JfQotCi0Jc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7Ci19Ci0KIC8qIHRoaXMgbXVzdCBiZSBjYWxsZWQgaG9sZGluZyB0aGUgbG9pIGxpc3QgbG9jayB0byBnaXZlIGNvdmVyYWdlIHRvIGV4aXRfY2FjaGUsCiAgKiBhc3luY19mbGFnIG1haW50ZW5hbmNlLCBhbmQgb2FwX3JlcXVlc3QKICAqLwpAQCAtMTk0NSw5ICsxODczLDYgQEAKIAlfX3U2NCB4aWQgPSAwOwogCiAJaWYgKG9hcC0+b2FwX3JlcXVlc3QpIHsKLQkJaWYgKCFyYykKLQkJCW9zY19pbmNfdW5zdGFibGVfcGFnZXMob2FwLT5vYXBfcmVxdWVzdCk7Ci0KIAkJeGlkID0gcHRscnBjX3JlcV94aWQob2FwLT5vYXBfcmVxdWVzdCk7CiAJCXB0bHJwY19yZXFfZmluaXNoZWQob2FwLT5vYXBfcmVxdWVzdCk7CiAJCW9hcC0+b2FwX3JlcXVlc3QgPSBOVUxMOwpAQCAtMTk3OSw3ICsxOTA0LDcgQEAKICAqLwogc3RhdGljIGludCB0cnlfdG9fYWRkX2V4dGVudF9mb3JfaW8oc3RydWN0IGNsaWVudF9vYmQgKmNsaSwKIAkJCQkgICAgc3RydWN0IG9zY19leHRlbnQgKmV4dCwgc3RydWN0IGxpc3RfaGVhZCAqcnBjbGlzdCwKLQkJCQkgICAgaW50ICpwYywgdW5zaWduZWQgaW50ICptYXhfcGFnZXMpCisJCQkJICAgIHVuc2lnbmVkIGludCAqcGMsIHVuc2lnbmVkIGludCAqbWF4X3BhZ2VzKQogewogCXN0cnVjdCBvc2NfZXh0ZW50ICp0bXA7CiAJc3RydWN0IG9zY19hc3luY19wYWdlICpvYXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZleHQtPm9lX3BhZ2VzLApAQCAtMjAzMiwxMiArMTk1NywxMyBAQAogICogNS4gVHJhdmVyc2UgdGhlIGV4dGVudCB0cmVlIGZyb20gdGhlIDFzdCBleHRlbnQ7CiAgKiA2LiBBYm92ZSBzdGVwcyBleGl0IGlmIHRoZXJlIGlzIG5vIHNwYWNlIGluIHRoaXMgUlBDLgogICovCi1zdGF0aWMgaW50IGdldF93cml0ZV9leHRlbnRzKHN0cnVjdCBvc2Nfb2JqZWN0ICpvYmosIHN0cnVjdCBsaXN0X2hlYWQgKnJwY2xpc3QpCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF93cml0ZV9leHRlbnRzKHN0cnVjdCBvc2Nfb2JqZWN0ICpvYmosCisJCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqcnBjbGlzdCkKIHsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gb3NjX2NsaShvYmopOwogCXN0cnVjdCBvc2NfZXh0ZW50ICpleHQ7CiAJc3RydWN0IG9zY19leHRlbnQgKnRlbXA7Ci0JaW50IHBhZ2VfY291bnQgPSAwOworCXVuc2lnbmVkIGludCBwYWdlX2NvdW50ID0gMDsKIAl1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzID0gY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYzsKIAogCUxBU1NFUlQob3NjX29iamVjdF9pc19sb2NrZWQob2JqKSk7CkBAIC0yMTc1LDcgKzIxMDEsNyBAQAogCXN0cnVjdCBvc2NfZXh0ZW50ICpleHQ7CiAJc3RydWN0IG9zY19leHRlbnQgKm5leHQ7CiAJTElTVF9IRUFEKHJwY2xpc3QpOwotCWludCBwYWdlX2NvdW50ID0gMDsKKwl1bnNpZ25lZCBpbnQgcGFnZV9jb3VudCA9IDA7CiAJdW5zaWduZWQgaW50IG1heF9wYWdlcyA9IGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGM7CiAJaW50IHJjID0gMDsKIApAQCAtMjM5MCw3ICsyMzE2LDcgQEAKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gb2FwLT5vYXBfY2xpOwogCXN0cnVjdCBvc2Nfb2JqZWN0ICpvc2MgPSBvYXAtPm9hcF9vYmo7CiAJcGdvZmZfdCBpbmRleDsKLQlpbnQgZ3JhbnRzID0gMDsKKwl1bnNpZ25lZCBpbnQgZ3JhbnRzID0gMCwgdG1wOwogCWludCBicndfZmxhZ3MgPSBPQkRfQlJXX0FTWU5DOwogCWludCBjbWQgPSBPQkRfQlJXX1dSSVRFOwogCWludCBuZWVkX3JlbGVhc2UgPSAwOwpAQCAtMjQzNCw5ICsyMzYwLDYgQEAKIAkJCXJldHVybiByYzsKIAl9CiAKLQlpZiAob3NjX292ZXJfdW5zdGFibGVfc29mdF9saW1pdChjbGkpKQotCQlicndfZmxhZ3MgfD0gT0JEX0JSV19TT0ZUX1NZTkM7Ci0KIAlvYXAtPm9hcF9jbWQgPSBjbWQ7CiAJb2FwLT5vYXBfcGFnZV9vZmYgPSBvcHMtPm9wc19mcm9tOwogCW9hcC0+b2FwX2NvdW50ID0gb3BzLT5vcHNfdG8gLSBvcHMtPm9wc19mcm9tOwpAQCAtMjQ3Niw3ICsyMzk5LDcgQEAKIAkJCWdyYW50cyA9IDA7CiAJCQluZWVkX3JlbGVhc2UgPSAxOwogCQl9IGVsc2UgaWYgKGV4dC0+b2VfZW5kIDwgaW5kZXgpIHsKLQkJCWludCB0bXAgPSBncmFudHM7CisJCQl0bXAgPSBncmFudHM7CiAJCQkvKiB0cnkgdG8gZXhwYW5kIHRoaXMgZXh0ZW50ICovCiAJCQlyYyA9IG9zY19leHRlbnRfZXhwYW5kKGV4dCwgaW5kZXgsICZ0bXApOwogCQkJaWYgKHJjIDwgMCkgewpAQCAtMjUwMSw3ICsyNDI0LDcgQEAKIAl9CiAKIAlpZiAoIWV4dCkgewotCQlpbnQgdG1wID0gKDEgPDwgY2xpLT5jbF9jaHVua2JpdHMpICsgY2xpLT5jbF9leHRlbnRfdGF4OworCQl0bXAgPSAoMSA8PCBjbGktPmNsX2NodW5rYml0cykgKyBjbGktPmNsX2V4dGVudF90YXg7CiAKIAkJLyogdHJ5IHRvIGZpbmQgbmV3IGV4dGVudCB0byBjb3ZlciB0aGlzIHBhZ2UgKi8KIAkJTEFTU0VSVCghb2lvLT5vaV9hY3RpdmUpOwpAQCAtMjY0NSw3ICsyNTY4LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlzcGluX2xvY2soJm9hcC0+b2FwX2xvY2spOwotCW9hcC0+b2FwX2FzeW5jX2ZsYWdzIHw9IEFTWU5DX1JFQURZfEFTWU5DX1VSR0VOVDsKKwlvYXAtPm9hcF9hc3luY19mbGFncyB8PSBBU1lOQ19SRUFEWSB8IEFTWU5DX1VSR0VOVDsKIAlzcGluX3VubG9jaygmb2FwLT5vYXBfbG9jayk7CiAKIAlpZiAobWVtb3J5X3ByZXNzdXJlX2dldCgpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jbF9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jbF9pbnRlcm5hbC5oCmluZGV4IGM4YzNmMWMuLjljOGRlMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2xfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NsX2ludGVybmFsLmgKQEAgLTY0LDcgKzY0LDcgQEAKIAkvKiogdHJ1ZSBpZiB0aGlzIGlvIGlzIGxvY2tsZXNzLiAqLwogCXVuc2lnbmVkIGludAkJb2lfbG9ja2xlc3M7CiAJLyoqIGhvdyBtYW55IExSVSBwYWdlcyBhcmUgcmVzZXJ2ZWQgZm9yIHRoaXMgSU8gKi8KLQlpbnQgb2lfbHJ1X3Jlc2VydmVkOworCXVuc2lnbmVkIGxvbmcJCW9pX2xydV9yZXNlcnZlZDsKIAogCS8qKiBhY3RpdmUgZXh0ZW50cywgd2Uga25vdyBob3cgbWFueSBieXRlcyBpcyBnb2luZyB0byBiZSB3cml0dGVuLAogCSAqIHNvIGhhdmluZyBhbiBhY3RpdmUgZXh0ZW50IHdpbGwgcHJldmVudCBpdCBmcm9tIGJlaW5nIGZyYWdtZW50ZWQKQEAgLTM4OSw3ICszODksNyBAQAogZXh0ZXJuIHN0cnVjdCBsdV9jb250ZXh0X2tleSBvc2Nfa2V5OwogZXh0ZXJuIHN0cnVjdCBsdV9jb250ZXh0X2tleSBvc2Nfc2Vzc2lvbl9rZXk7CiAKLSNkZWZpbmUgT1NDX0ZMQUdTIChBU1lOQ19VUkdFTlR8QVNZTkNfUkVBRFkpCisjZGVmaW5lIE9TQ19GTEFHUyAoQVNZTkNfVVJHRU5UIHwgQVNZTkNfUkVBRFkpCiAKIGludCBvc2NfbG9ja19pbml0KGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJICBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosIHN0cnVjdCBjbF9sb2NrICpsb2NrLApAQCAtNjA4LDcgKzYwOCw3IEBACiAJLyoqIGxpbmsgbGlzdCBvZiBvc2Nfb2JqZWN0J3Mgb29fe2hwfHVyZ2VudHxsb2NraW5nfV9leHRzLiAqLwogCXN0cnVjdCBsaXN0X2hlYWQJIG9lX2xpbms7CiAJLyoqIHN0YXRlIG9mIHRoaXMgZXh0ZW50ICovCi0JdW5zaWduZWQgaW50ICAgICAgIG9lX3N0YXRlOworCWVudW0gb3NjX2V4dGVudF9zdGF0ZQlvZV9zdGF0ZTsKIAkvKiogZmxhZ3MgZm9yIHRoaXMgZXh0ZW50LiAqLwogCXVuc2lnbmVkIGludCAgICAgICBvZV9pbnRyZWU6MSwKIAkvKiogMCBpcyB3cml0ZSwgMSBpcyByZWFkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2ludGVybmFsLmgKaW5kZXggN2EyN2YwOS4uNjdmZTBhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW50ZXJuYWwuaApAQCAtNzEsNyArNzEsNiBAQAogCXN0cnVjdCBjbGllbnRfb2JkICAgICAgICpvYXBfY2xpOwogCXN0cnVjdCBvc2Nfb2JqZWN0ICAgICAgICpvYXBfb2JqOwogCi0Jc3RydWN0IGxkbG1fbG9jawkqb2FwX2xkbG1fbG9jazsKIAlzcGlubG9ja190CQkgb2FwX2xvY2s7CiB9OwogCkBAIC0xMzQsOSArMTMzLDkgQEAKIGludCBvc2NfcHJvY2Vzc19jb25maWdfYmFzZShzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkLCBzdHJ1Y3QgbHVzdHJlX2NmZyAqY2ZnKTsKIGludCBvc2NfYnVpbGRfcnBjKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsaWVudF9vYmQgKmNsaSwKIAkJICBzdHJ1Y3QgbGlzdF9oZWFkICpleHRfbGlzdCwgaW50IGNtZCk7Ci1pbnQgb3NjX2xydV9zaHJpbmsoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLAotCQkgICBpbnQgdGFyZ2V0LCBib29sIGZvcmNlKTsKLWludCBvc2NfbHJ1X3JlY2xhaW0oc3RydWN0IGNsaWVudF9vYmQgKmNsaSk7Citsb25nIG9zY19scnVfc2hyaW5rKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwgc3RydWN0IGNsaWVudF9vYmQgKmNsaSwKKwkJICAgIGxvbmcgdGFyZ2V0LCBib29sIGZvcmNlKTsKK2xvbmcgb3NjX2xydV9yZWNsYWltKHN0cnVjdCBjbGllbnRfb2JkICpjbGkpOwogCiB1bnNpZ25lZCBsb25nIG9zY19sZGxtX3dlaWdoX2FzdChzdHJ1Y3QgbGRsbV9sb2NrICpkbG1sb2NrKTsKIApAQCAtMTk4LDcgKzE5Nyw3IEBACiBpbnQgb3NjX3F1b3RhX3BvbGxfY2hlY2soc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGlmX3F1b3RhY2hlY2sgKnFjaGspOwogdm9pZCBvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKIHZvaWQgb3NjX2RlY191bnN0YWJsZV9wYWdlcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSk7Ci1pbnQgIG9zY19vdmVyX3Vuc3RhYmxlX3NvZnRfbGltaXQoc3RydWN0IGNsaWVudF9vYmQgKmNsaSk7Citib29sIG9zY19vdmVyX3Vuc3RhYmxlX3NvZnRfbGltaXQoc3RydWN0IGNsaWVudF9vYmQgKmNsaSk7CiAKIHN0cnVjdCBsZGxtX2xvY2sgKm9zY19kbG1sb2NrX2F0X3Bnb2ZmKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJCQkgICAgICAgc3RydWN0IG9zY19vYmplY3QgKm9iaiwgcGdvZmZfdCBpbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYwppbmRleCA2ZTNkY2QzLi44YTU1OWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pby5jCkBAIC0xMDksMTEgKzEwOSwxMSBAQAogCiAJc3RydWN0IGNsX3BhZ2VfbGlzdCAqcWluID0gJnF1ZXVlLT5jMl9xaW47CiAJc3RydWN0IGNsX3BhZ2VfbGlzdCAqcW91dCA9ICZxdWV1ZS0+YzJfcW91dDsKLQlpbnQgcXVldWVkID0gMDsKKwl1bnNpZ25lZCBpbnQgcXVldWVkID0gMDsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgY21kOwogCWludCBicndfZmxhZ3M7Ci0JaW50IG1heF9wYWdlczsKKwl1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzOwogCiAJTEFTU0VSVChxaW4tPnBsX25yID4gMCk7CiAKQEAgLTE2MywxNCArMTYzLDE5IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWNsX3BhZ2VfbGlzdF9tb3ZlKHFvdXQsIHFpbiwgcGFnZSk7CiAJCXNwaW5fbG9jaygmb2FwLT5vYXBfbG9jayk7Ci0JCW9hcC0+b2FwX2FzeW5jX2ZsYWdzID0gQVNZTkNfVVJHRU5UfEFTWU5DX1JFQURZOworCQlvYXAtPm9hcF9hc3luY19mbGFncyA9IEFTWU5DX1VSR0VOVCB8IEFTWU5DX1JFQURZOwogCQlvYXAtPm9hcF9hc3luY19mbGFncyB8PSBBU1lOQ19DT1VOVF9TVEFCTEU7CiAJCXNwaW5fdW5sb2NrKCZvYXAtPm9hcF9sb2NrKTsKIAogCQlvc2NfcGFnZV9zdWJtaXQoZW52LCBvcGcsIGNydCwgYnJ3X2ZsYWdzKTsKIAkJbGlzdF9hZGRfdGFpbCgmb2FwLT5vYXBfcGVuZGluZ19pdGVtLCAmbGlzdCk7CisKKwkJaWYgKHBhZ2UtPmNwX3N5bmNfaW8pCisJCQljbF9wYWdlX2xpc3RfbW92ZShxb3V0LCBxaW4sIHBhZ2UpOworCQllbHNlIC8qIGFzeW5jIElPICovCisJCQljbF9wYWdlX2xpc3RfZGVsKGVudiwgcWluLCBwYWdlKTsKKwogCQlpZiAoKytxdWV1ZWQgPT0gbWF4X3BhZ2VzKSB7CiAJCQlxdWV1ZWQgPSAwOwogCQkJcmVzdWx0ID0gb3NjX3F1ZXVlX3N5bmNfcGFnZXMoZW52LCBvc2MsICZsaXN0LCBjbWQsCkBAIC0xOTUsNyArMjAwLDcgQEAKICAqIEV4cGFuZCBzdHJpcGUgS01TIGlmIG5lY2Vzc2FyeS4KICAqLwogc3RhdGljIHZvaWQgb3NjX3BhZ2VfdG91Y2hfYXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAotCQkJICAgICAgc3RydWN0IGNsX29iamVjdCAqb2JqLCBwZ29mZl90IGlkeCwgdW5zaWduZWQgdG8pCisJCQkgICAgICBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosIHBnb2ZmX3QgaWR4LCBzaXplX3QgdG8pCiB7CiAJc3RydWN0IGxvdl9vaW5mbyAqbG9pID0gY2wyb3NjKG9iaiktPm9vX29pbmZvOwogCXN0cnVjdCBjbF9hdHRyICphdHRyID0gJm9zY19lbnZfaW5mbyhlbnYpLT5vdGlfYXR0cjsKQEAgLTIyOCw3ICsyMzMsNyBAQAogCQlhdHRyLT5jYXRfc2l6ZSA9IGttczsKIAkJdmFsaWQgfD0gQ0FUX1NJWkU7CiAJfQotCWNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgdmFsaWQpOworCWNsX29iamVjdF9hdHRyX3VwZGF0ZShlbnYsIG9iaiwgYXR0ciwgdmFsaWQpOwogCWNsX29iamVjdF9hdHRyX3VubG9jayhvYmopOwogfQogCkBAIC0zMTQsOCArMzE5LDggQEAKIAlzdHJ1Y3Qgb3NjX29iamVjdCAqb3NjID0gY2wyb3NjKGlvcy0+Y2lzX29iaik7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9IG9zY19jbGkob3NjKTsKIAl1bnNpZ25lZCBsb25nIGM7Ci0JdW5zaWduZWQgaW50IG5wYWdlczsKLQl1bnNpZ25lZCBpbnQgbWF4X3BhZ2VzOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzOworCXVuc2lnbmVkIGxvbmcgbWF4X3BhZ2VzOwogCiAJaWYgKGNsX2lvX2lzX2FwcGVuZChpbykpCiAJCXJldHVybiAwOwpAQCAtMzI4LDE1ICszMzMsMTUgQEAKIAlpZiAobnBhZ2VzID4gbWF4X3BhZ2VzKQogCQlucGFnZXMgPSBtYXhfcGFnZXM7CiAKLQljID0gYXRvbWljX3JlYWQoY2xpLT5jbF9scnVfbGVmdCk7CisJYyA9IGF0b21pY19sb25nX3JlYWQoY2xpLT5jbF9scnVfbGVmdCk7CiAJaWYgKGMgPCBucGFnZXMgJiYgb3NjX2xydV9yZWNsYWltKGNsaSkgPiAwKQotCQljID0gYXRvbWljX3JlYWQoY2xpLT5jbF9scnVfbGVmdCk7CisJCWMgPSBhdG9taWNfbG9uZ19yZWFkKGNsaS0+Y2xfbHJ1X2xlZnQpOwogCXdoaWxlIChjID49IG5wYWdlcykgewotCQlpZiAoYyA9PSBhdG9taWNfY21weGNoZyhjbGktPmNsX2xydV9sZWZ0LCBjLCBjIC0gbnBhZ2VzKSkgeworCQlpZiAoYyA9PSBhdG9taWNfbG9uZ19jbXB4Y2hnKGNsaS0+Y2xfbHJ1X2xlZnQsIGMsIGMgLSBucGFnZXMpKSB7CiAJCQlvaW8tPm9pX2xydV9yZXNlcnZlZCA9IG5wYWdlczsKIAkJCWJyZWFrOwogCQl9Ci0JCWMgPSBhdG9taWNfcmVhZChjbGktPmNsX2xydV9sZWZ0KTsKKwkJYyA9IGF0b21pY19sb25nX3JlYWQoY2xpLT5jbF9scnVfbGVmdCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zNTAsNyArMzU1LDcgQEAKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gb3NjX2NsaShvc2MpOwogCiAJaWYgKG9pby0+b2lfbHJ1X3Jlc2VydmVkID4gMCkgewotCQlhdG9taWNfYWRkKG9pby0+b2lfbHJ1X3Jlc2VydmVkLCBjbGktPmNsX2xydV9sZWZ0KTsKKwkJYXRvbWljX2xvbmdfYWRkKG9pby0+b2lfbHJ1X3Jlc2VydmVkLCBjbGktPmNsX2xydV9sZWZ0KTsKIAkJb2lvLT5vaV9scnVfcmVzZXJ2ZWQgPSAwOwogCX0KIAlvaW8tPm9pX3dyaXRlX29zY2xvY2sgPSBOVUxMOwpAQCAtMzY0LDcgKzM2OSw3IEBACiAKIAlpbyA9IGlvcy0+Y2lzX2lvOwogCWZpbyA9ICZpby0+dS5jaV9mYXVsdDsKLQlDREVCVUcoRF9JTkZPLCAiJWx1ICVkICVkXG4iLAorCUNERUJVRyhEX0lORk8sICIlbHUgJWQgJXp1XG4iLAogCSAgICAgICBmaW8tPmZ0X2luZGV4LCBmaW8tPmZ0X3dyaXRhYmxlLCBmaW8tPmZ0X25vYik7CiAJLyoKIAkgKiBJZiBtYXBwaW5nIGlzIHdyaXRlYWJsZSwgYWRqdXN0IGttcyB0byBjb3ZlciB0aGlzIHBhZ2UsCkBAIC00NzEsMTggKzQ3NiwyMSBAQAogCQkJCWF0dHItPmNhdF9jdGltZSA9IGx2Yi0+bHZiX2N0aW1lOwogCQkJCWNsX3ZhbGlkIHw9IENBVF9DVElNRTsKIAkJCX0KLQkJCXJlc3VsdCA9IGNsX29iamVjdF9hdHRyX3NldChlbnYsIG9iaiwgYXR0ciwgY2xfdmFsaWQpOworCQkJcmVzdWx0ID0gY2xfb2JqZWN0X2F0dHJfdXBkYXRlKGVudiwgb2JqLCBhdHRyLAorCQkJCQkJICAgICAgIGNsX3ZhbGlkKTsKIAkJfQogCQljbF9vYmplY3RfYXR0cl91bmxvY2sob2JqKTsKIAl9CiAJbWVtc2V0KG9hLCAwLCBzaXplb2YoKm9hKSk7CiAJaWYgKHJlc3VsdCA9PSAwKSB7CiAJCW9hLT5vX29pID0gbG9pLT5sb2lfb2k7CisJCW9iZG9fc2V0X3BhcmVudF9maWQob2EsIGlvLT51LmNpX3NldGF0dHIuc2FfcGFyZW50X2ZpZCk7CisJCW9hLT5vX3N0cmlwZV9pZHggPSBpby0+dS5jaV9zZXRhdHRyLnNhX3N0cmlwZV9pbmRleDsKIAkJb2EtPm9fbXRpbWUgPSBhdHRyLT5jYXRfbXRpbWU7CiAJCW9hLT5vX2F0aW1lID0gYXR0ci0+Y2F0X2F0aW1lOwogCQlvYS0+b19jdGltZSA9IGF0dHItPmNhdF9jdGltZTsKLQkJb2EtPm9fdmFsaWQgPSBPQkRfTURfRkxJRCB8IE9CRF9NRF9GTEdST1VQIHwgT0JEX01EX0ZMQVRJTUUgfAotCQkJT0JEX01EX0ZMQ1RJTUUgfCBPQkRfTURfRkxNVElNRTsKKwkJb2EtPm9fdmFsaWQgfD0gT0JEX01EX0ZMSUQgfCBPQkRfTURfRkxHUk9VUCB8IE9CRF9NRF9GTEFUSU1FIHwKKwkJCSAgICAgICBPQkRfTURfRkxDVElNRSB8IE9CRF9NRF9GTE1USU1FOwogCQlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKIAkJCW9hLT5vX3NpemUgPSBzaXplOwogCQkJb2EtPm9fYmxvY2tzID0gT0JEX09CSkVDVF9FT0Y7CkBAIC01NTksNyArNTY3LDcgQEAKIAlpZiAoIXNsaWNlLT5jaXNfaW8tPmNpX25vYXRpbWUpIHsKIAkJY2xfb2JqZWN0X2F0dHJfbG9jayhvYmopOwogCQlhdHRyLT5jYXRfYXRpbWUgPSBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCk7Ci0JCXJjID0gY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLCBDQVRfQVRJTUUpOworCQlyYyA9IGNsX29iamVjdF9hdHRyX3VwZGF0ZShlbnYsIG9iaiwgYXR0ciwgQ0FUX0FUSU1FKTsKIAkJY2xfb2JqZWN0X2F0dHJfdW5sb2NrKG9iaik7CiAJfQogCXJldHVybiByYzsKQEAgLTU3Niw3ICs1ODQsNyBAQAogCWNsX29iamVjdF9hdHRyX2xvY2sob2JqKTsKIAlhdHRyLT5jYXRfY3RpbWUgPSBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCk7CiAJYXR0ci0+Y2F0X210aW1lID0gYXR0ci0+Y2F0X2N0aW1lOwotCXJjID0gY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLCBDQVRfTVRJTUUgfCBDQVRfQ1RJTUUpOworCXJjID0gY2xfb2JqZWN0X2F0dHJfdXBkYXRlKGVudiwgb2JqLCBhdHRyLCBDQVRfTVRJTUUgfCBDQVRfQ1RJTUUpOwogCWNsX29iamVjdF9hdHRyX3VubG9jayhvYmopOwogCiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19sb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2xvY2suYwppbmRleCA3MTdkM2ZmLi4zOWE4YTU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2xvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2xvY2suYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJCWxkbG1fbG9ja19hbGxvd19tYXRjaF9sb2NrZWQoZGxtbG9jayk7CiAJfQogCi0JY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLCB2YWxpZCk7CisJY2xfb2JqZWN0X2F0dHJfdXBkYXRlKGVudiwgb2JqLCBhdHRyLCB2YWxpZCk7CiAJY2xfb2JqZWN0X2F0dHJfdW5sb2NrKG9iaik7CiB9CiAKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogCQkgKi8KIAkJYXR0ci0+Y2F0X2ttcyA9IGxkbG1fZXh0ZW50X3NoaWZ0X2ttcyhkbG1sb2NrLCBvbGRfa21zKTsKIAotCQljbF9vYmplY3RfYXR0cl9zZXQoZW52LCBvYmosIGF0dHIsIENBVF9LTVMpOworCQljbF9vYmplY3RfYXR0cl91cGRhdGUoZW52LCBvYmosIGF0dHIsIENBVF9LTVMpOwogCQljbF9vYmplY3RfYXR0cl91bmxvY2sob2JqKTsKIAkJdW5sb2NrX3Jlc19hbmRfbG9jayhkbG1sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19vYmplY3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2Nfb2JqZWN0LmMKaW5kZXggZDIxMWQxOS4uYWFlM2EyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX29iamVjdC5jCkBAIC0xNTksOCArMTU5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBvc2NfYXR0cl9zZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xfb2JqZWN0ICpvYmosCi0JCQljb25zdCBzdHJ1Y3QgY2xfYXR0ciAqYXR0ciwgdW5zaWduZWQgdmFsaWQpCitzdGF0aWMgaW50IG9zY19hdHRyX3VwZGF0ZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbF9vYmplY3QgKm9iaiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBjbF9hdHRyICphdHRyLCB1bnNpZ25lZCBpbnQgdmFsaWQpCiB7CiAJc3RydWN0IGxvdl9vaW5mbyAqb2luZm8gPSBjbDJvc2Mob2JqKS0+b29fb2luZm87CiAJc3RydWN0IG9zdF9sdmIgKmx2YiA9ICZvaW5mby0+bG9pX2x2YjsKQEAgLTE5NSw3ICsxOTUsNiBAQAogCiBzdGF0aWMgaW50IG9zY19vYmplY3RfYXN0X2NsZWFyKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2ssIHZvaWQgKmRhdGEpCiB7Ci0JTEFTU0VSVChsb2NrLT5sX2dyYW50ZWRfbW9kZSA9PSBsb2NrLT5sX3JlcV9tb2RlKTsKIAlpZiAobG9jay0+bF9hc3RfZGF0YSA9PSBkYXRhKQogCQlsb2NrLT5sX2FzdF9kYXRhID0gTlVMTDsKIAlyZXR1cm4gTERMTV9JVEVSX0NPTlRJTlVFOwpAQCAtMjYyLDcgKzI2MSw3IEBACiAJLmNvb19sb2NrX2luaXQgPSBvc2NfbG9ja19pbml0LAogCS5jb29faW9faW5pdCAgID0gb3NjX2lvX2luaXQsCiAJLmNvb19hdHRyX2dldCAgPSBvc2NfYXR0cl9nZXQsCi0JLmNvb19hdHRyX3NldCAgPSBvc2NfYXR0cl9zZXQsCisJLmNvb19hdHRyX3VwZGF0ZSA9IG9zY19hdHRyX3VwZGF0ZSwKIAkuY29vX2dsaW1wc2UgICA9IG9zY19vYmplY3RfZ2xpbXBzZSwKIAkuY29vX3BydW5lICAgICA9IG9zY19vYmplY3RfcHJ1bmUKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3BhZ2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcGFnZS5jCmluZGV4IDM1NWY0OTYuLjJhN2E3MGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcGFnZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcGFnZS5jCkBAIC0zMjMsMzIgKzMyMyw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotaW50IG9zY19vdmVyX3Vuc3RhYmxlX3NvZnRfbGltaXQoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKLXsKLQlsb25nIG9iZF91cGFnZXMsIG9iZF9kcGFnZXMsIG9zY191cGFnZXM7Ci0KLQkvKiBDYW4ndCBjaGVjayBjbGktPmNsX3Vuc3RhYmxlX2NvdW50LCB0aGVyZWZvcmUsIG5vIHNvZnQgbGltaXQgKi8KLQlpZiAoIWNsaSkKLQkJcmV0dXJuIDA7Ci0KLQlvYmRfdXBhZ2VzID0gYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcyk7Ci0Jb2JkX2RwYWdlcyA9IGF0b21pY19yZWFkKCZvYmRfZGlydHlfcGFnZXMpOwotCi0Jb3NjX3VwYWdlcyA9IGF0b21pY19yZWFkKCZjbGktPmNsX3Vuc3RhYmxlX2NvdW50KTsKLQotCS8qCi0JICogb2JkX21heF9kaXJ0eV9wYWdlcyBpcyB0aGUgbWF4IG51bWJlciBvZiAoZGlydHkgKyB1bnN0YWJsZSkKLQkgKiBwYWdlcyBhbGxvd2VkIGF0IGFueSBnaXZlbiB0aW1lLiBUbyBzaW11bGF0ZSBhbiB1bnN0YWJsZSBwYWdlCi0JICogb25seSBsaW1pdCwgd2Ugc3VidHJhY3QgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGRpcnR5IHBhZ2VzCi0JICogZnJvbSB0aGlzIG1heC4gVGhpcyBkaWZmZXJlbmNlIGlzIHJvdWdobHkgdGhlIGFtb3VudCBvZiBwYWdlcwotCSAqIGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVuc3RhYmxlIHBhZ2VzLiBUaHVzLCB0aGUgc29mdCBsaW1pdAotCSAqIGlzIGhhbGYgb2YgdGhhdCBkaWZmZXJlbmNlLiBDaGVjayBvc2NfdXBhZ2VzIHRvIGVuc3VyZSB3ZSBkb24ndAotCSAqIHNldCBTT0ZUX1NZTkMgZm9yIE9TQ3Mgd2l0aG91dCBhbnkgb3V0c3RhbmRpbmcgdW5zdGFibGUgcGFnZXMuCi0JICovCi0JcmV0dXJuIG9zY191cGFnZXMgJiYKLQkgICAgICAgb2JkX3VwYWdlcyA+PSAob2JkX21heF9kaXJ0eV9wYWdlcyAtIG9iZF9kcGFnZXMpIC8gMjsKLX0KLQogLyoqCiAgKiBIZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGJ5IG9zY19pb19zdWJtaXQoKSBmb3IgZXZlcnkgcGFnZSBpbiBhbiBpbW1lZGlhdGUKICAqIHRyYW5zZmVyIChpLmUuLCB0cmFuc2ZlcnJlZCBzeW5jaHJvbm91c2x5KS4KQEAgLTM2OCw5ICszNDIsNiBAQAogCW9hcC0+b2FwX2NvdW50ID0gb3BnLT5vcHNfdG8gLSBvcGctPm9wc19mcm9tOwogCW9hcC0+b2FwX2Jyd19mbGFncyA9IGJyd19mbGFncyB8IE9CRF9CUldfU1lOQzsKIAotCWlmIChvc2Nfb3Zlcl91bnN0YWJsZV9zb2Z0X2xpbWl0KG9hcC0+b2FwX2NsaSkpCi0JCW9hcC0+b2FwX2Jyd19mbGFncyB8PSBPQkRfQlJXX1NPRlRfU1lOQzsKLQogCWlmIChjYXBhYmxlKENGU19DQVBfU1lTX1JFU09VUkNFKSkgewogCQlvYXAtPm9hcF9icndfZmxhZ3MgfD0gT0JEX0JSV19OT1FVT1RBOwogCQlvYXAtPm9hcF9jbWQgfD0gT0JEX0JSV19OT1FVT1RBOwpAQCAtNDA5LDcgKzM4MCw3IEBACiBzdGF0aWMgaW50IG9zY19jYWNoZV90b29fbXVjaChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKQogewogCXN0cnVjdCBjbF9jbGllbnRfY2FjaGUgKmNhY2hlID0gY2xpLT5jbF9jYWNoZTsKLQlpbnQgcGFnZXMgPSBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCk7CisJbG9uZyBwYWdlcyA9IGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpOwogCXVuc2lnbmVkIGxvbmcgYnVkZ2V0OwogCiAJYnVkZ2V0ID0gY2FjaGUtPmNjY19scnVfbWF4IC8gKGF0b21pY19yZWFkKCZjYWNoZS0+Y2NjX3VzZXJzKSAtIDIpOwpAQCAtNDE3LDcgKzM4OCw3IEBACiAJLyogaWYgaXQncyBnb2luZyB0byBydW4gb3V0IExSVSBzbG90cywgd2Ugc2hvdWxkIGZyZWUgc29tZSwgYnV0IG5vdAogCSAqIHRvbyBtdWNoIHRvIG1haW50YWluIGZhaXJuZXNzIGFtb25nIE9TQ3MuCiAJICovCi0JaWYgKGF0b21pY19yZWFkKGNsaS0+Y2xfbHJ1X2xlZnQpIDwgY2FjaGUtPmNjY19scnVfbWF4ID4+IDQpIHsKKwlpZiAoYXRvbWljX2xvbmdfcmVhZChjbGktPmNsX2xydV9sZWZ0KSA8IGNhY2hlLT5jY2NfbHJ1X21heCA+PiA0KSB7CiAJCWlmIChwYWdlcyA+PSBidWRnZXQpCiAJCQlyZXR1cm4gbHJ1X3Nocmlua19tYXg7CiAJCWVsc2UgaWYgKHBhZ2VzID49IGJ1ZGdldCAvIDIpCkBAIC00NDQsNyArNDE1LDcgQEAKIHsKIAlMSVNUX0hFQUQobHJ1KTsKIAlzdHJ1Y3Qgb3NjX2FzeW5jX3BhZ2UgKm9hcDsKLQlpbnQgbnBhZ2VzID0gMDsKKwlsb25nIG5wYWdlcyA9IDA7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9hcCwgcGxpc3QsIG9hcF9wZW5kaW5nX2l0ZW0pIHsKIAkJc3RydWN0IG9zY19wYWdlICpvcGcgPSBvYXAyb3NjX3BhZ2Uob2FwKTsKQEAgLTQ2MCw4ICs0MzEsOCBAQAogCWlmIChucGFnZXMgPiAwKSB7CiAJCXNwaW5fbG9jaygmY2xpLT5jbF9scnVfbGlzdF9sb2NrKTsKIAkJbGlzdF9zcGxpY2VfdGFpbCgmbHJ1LCAmY2xpLT5jbF9scnVfbGlzdCk7Ci0JCWF0b21pY19zdWIobnBhZ2VzLCAmY2xpLT5jbF9scnVfYnVzeSk7Ci0JCWF0b21pY19hZGQobnBhZ2VzLCAmY2xpLT5jbF9scnVfaW5fbGlzdCk7CisJCWF0b21pY19sb25nX3N1YihucGFnZXMsICZjbGktPmNsX2xydV9idXN5KTsKKwkJYXRvbWljX2xvbmdfYWRkKG5wYWdlcywgJmNsaS0+Y2xfbHJ1X2luX2xpc3QpOwogCQlzcGluX3VubG9jaygmY2xpLT5jbF9scnVfbGlzdF9sb2NrKTsKIAogCQkvKiBYWFg6IE1heSBzZXQgZm9yY2UgdG8gYmUgdHJ1ZSBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCkBAIC00NzIsOSArNDQzLDkgQEAKIAogc3RhdGljIHZvaWQgX19vc2NfbHJ1X2RlbChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLCBzdHJ1Y3Qgb3NjX3BhZ2UgKm9wZykKIHsKLQlMQVNTRVJUKGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSA+IDApOworCUxBU1NFUlQoYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPiAwKTsKIAlsaXN0X2RlbF9pbml0KCZvcGctPm9wc19scnUpOwotCWF0b21pY19kZWMoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpOworCWF0b21pY19sb25nX2RlYygmY2xpLT5jbF9scnVfaW5fbGlzdCk7CiB9CiAKIC8qKgpAQCAtNDg4LDEyICs0NTksMTIgQEAKIAkJaWYgKCFsaXN0X2VtcHR5KCZvcGctPm9wc19scnUpKSB7CiAJCQlfX29zY19scnVfZGVsKGNsaSwgb3BnKTsKIAkJfSBlbHNlIHsKLQkJCUxBU1NFUlQoYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2J1c3kpID4gMCk7Ci0JCQlhdG9taWNfZGVjKCZjbGktPmNsX2xydV9idXN5KTsKKwkJCUxBU1NFUlQoYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkgPiAwKTsKKwkJCWF0b21pY19sb25nX2RlYygmY2xpLT5jbF9scnVfYnVzeSk7CiAJCX0KIAkJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbHJ1X2xpc3RfbG9jayk7CiAKLQkJYXRvbWljX2luYyhjbGktPmNsX2xydV9sZWZ0KTsKKwkJYXRvbWljX2xvbmdfaW5jKGNsaS0+Y2xfbHJ1X2xlZnQpOwogCQkvKiB0aGlzIGlzIGEgZ3JlYXQgcGxhY2UgdG8gcmVsZWFzZSBtb3JlIExSVSBwYWdlcyBpZgogCQkgKiB0aGlzIG9zYyBvY2N1cGllcyB0b28gbWFueSBMUlUgcGFnZXMgYW5kIGtlcm5lbCBpcwogCQkgKiBzdGVhbGluZyBvbmUgb2YgdGhlbS4KQEAgLTUxOCw3ICs0ODksNyBAQAogCQlzcGluX2xvY2soJmNsaS0+Y2xfbHJ1X2xpc3RfbG9jayk7CiAJCV9fb3NjX2xydV9kZWwoY2xpLCBvcGcpOwogCQlzcGluX3VubG9jaygmY2xpLT5jbF9scnVfbGlzdF9sb2NrKTsKLQkJYXRvbWljX2luYygmY2xpLT5jbF9scnVfYnVzeSk7CisJCWF0b21pY19sb25nX2luYygmY2xpLT5jbF9scnVfYnVzeSk7CiAJfQogfQogCkBAIC01NDAsMTAgKzUxMSwzMiBAQAogfQogCiAvKioKKyAqIENoZWNrIGlmIGEgY2xfcGFnZSBjYW4gYmUgcmVsZWFzZWQsIGkuZSwgaXQncyBub3QgYmVpbmcgdXNlZC4KKyAqCisgKiBJZiB1bnN0YWJsZSBhY2NvdW50IGlzIHR1cm5lZCBvbiwgYnVsayB0cmFuc2ZlciBtYXkgaG9sZCBvbmUgcmVmY291bnQKKyAqIGZvciByZWNvdmVyeSBzbyB3ZSBuZWVkIHRvIGNoZWNrIHZtcGFnZSByZWZjb3VudCBhcyB3ZWxsOyBvdGhlcndpc2UsCisgKiBldmVuIHdlIGNhbiBkZXN0cm95IGNsX3BhZ2UgYnV0IHRoZSBjb3JyZXNwb25kaW5nIHZtcGFnZSBjYW4ndCBiZSByZXVzZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBscnVfcGFnZV9idXN5KHN0cnVjdCBjbGllbnRfb2JkICpjbGksIHN0cnVjdCBjbF9wYWdlICpwYWdlKQoreworCWlmIChjbF9wYWdlX2luX3VzZV9ub3JlZihwYWdlKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX2NoZWNrKSB7CisJCXN0cnVjdCBwYWdlICp2bXBhZ2UgPSBjbF9wYWdlX3ZtcGFnZShwYWdlKTsKKworCQkvKiB2bXBhZ2UgaGF2ZSB0d28ga25vd24gdXNlcnM6IGNsX3BhZ2UgYW5kIFZNIHBhZ2UgY2FjaGUgKi8KKwkJaWYgKHBhZ2VfY291bnQodm1wYWdlKSAtIHBhZ2VfbWFwY291bnQodm1wYWdlKSA+IDIpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKICAqIERyb3AgQHRhcmdldCBvZiBwYWdlcyBmcm9tIExSVSBhdCBtb3N0LgogICovCi1pbnQgb3NjX2xydV9zaHJpbmsoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLAotCQkgICBpbnQgdGFyZ2V0LCBib29sIGZvcmNlKQorbG9uZyBvc2NfbHJ1X3Nocmluayhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBjbGllbnRfb2JkICpjbGksCisJCSAgICBsb25nIHRhcmdldCwgYm9vbCBmb3JjZSkKIHsKIAlzdHJ1Y3QgY2xfaW8gKmlvOwogCXN0cnVjdCBjbF9vYmplY3QgKmNsb2JqID0gTlVMTDsKQEAgLTU1MSwxMiArNTQ0LDEyIEBACiAJc3RydWN0IG9zY19wYWdlICpvcGc7CiAJc3RydWN0IG9zY19wYWdlICp0ZW1wOwogCWludCBtYXhzY2FuID0gMDsKLQlpbnQgY291bnQgPSAwOworCWxvbmcgY291bnQgPSAwOwogCWludCBpbmRleCA9IDA7CiAJaW50IHJjID0gMDsKIAotCUxBU1NFUlQoYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpID49IDApOwotCWlmIChhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPT0gMCB8fCB0YXJnZXQgPD0gMCkKKwlMQVNTRVJUKGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpID49IDApOworCWlmIChhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSA9PSAwIHx8IHRhcmdldCA8PSAwKQogCQlyZXR1cm4gMDsKIAogCWlmICghZm9yY2UpIHsKQEAgLTU3NSw3ICs1NjgsNyBAQAogCWlvID0gJm9zY19lbnZfaW5mbyhlbnYpLT5vdGlfaW87CiAKIAlzcGluX2xvY2soJmNsaS0+Y2xfbHJ1X2xpc3RfbG9jayk7Ci0JbWF4c2NhbiA9IG1pbih0YXJnZXQgPDwgMSwgYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpKTsKKwltYXhzY2FuID0gbWluKHRhcmdldCA8PCAxLCBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9wZywgdGVtcCwgJmNsaS0+Y2xfbHJ1X2xpc3QsIG9wc19scnUpIHsKIAkJc3RydWN0IGNsX3BhZ2UgKnBhZ2U7CiAJCWJvb2wgd2lsbF9mcmVlID0gZmFsc2U7CkBAIC01ODQsNyArNTc3LDcgQEAKIAkJCWJyZWFrOwogCiAJCXBhZ2UgPSBvcGctPm9wc19jbC5jcGxfcGFnZTsKLQkJaWYgKGNsX3BhZ2VfaW5fdXNlX25vcmVmKHBhZ2UpKSB7CisJCWlmIChscnVfcGFnZV9idXN5KGNsaSwgcGFnZSkpIHsKIAkJCWxpc3RfbW92ZV90YWlsKCZvcGctPm9wc19scnUsICZjbGktPmNsX2xydV9saXN0KTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC02MjAsNyArNjEzLDcgQEAKIAkJfQogCiAJCWlmIChjbF9wYWdlX293bl90cnkoZW52LCBpbywgcGFnZSkgPT0gMCkgewotCQkJaWYgKCFjbF9wYWdlX2luX3VzZV9ub3JlZihwYWdlKSkgeworCQkJaWYgKCFscnVfcGFnZV9idXN5KGNsaSwgcGFnZSkpIHsKIAkJCQkvKiByZW1vdmUgaXQgZnJvbSBscnUgbGlzdCBlYXJsaWVyIHRvIGF2b2lkCiAJCQkJICogbG9jayBjb250ZW50aW9uCiAJCQkJICovCkBAIC02NjMsMjQgKzY1NiwxOSBAQAogCiAJYXRvbWljX2RlYygmY2xpLT5jbF9scnVfc2hyaW5rZXJzKTsKIAlpZiAoY291bnQgPiAwKSB7Ci0JCWF0b21pY19hZGQoY291bnQsIGNsaS0+Y2xfbHJ1X2xlZnQpOworCQlhdG9taWNfbG9uZ19hZGQoY291bnQsIGNsaS0+Y2xfbHJ1X2xlZnQpOwogCQl3YWtlX3VwX2FsbCgmb3NjX2xydV93YWl0cSk7CiAJfQogCXJldHVybiBjb3VudCA+IDAgPyBjb3VudCA6IHJjOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtYXhfdG9fc2hyaW5rKHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCi17Ci0JcmV0dXJuIG1pbihhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPj4gMSwgbHJ1X3Nocmlua19tYXgpOwotfQotCi1pbnQgb3NjX2xydV9yZWNsYWltKHN0cnVjdCBjbGllbnRfb2JkICpjbGkpCitsb25nIG9zY19scnVfcmVjbGFpbShzdHJ1Y3QgY2xpZW50X29iZCAqY2xpKQogewogCXN0cnVjdCBjbF9lbnZfbmVzdCBuZXN0OwogCXN0cnVjdCBsdV9lbnYgKmVudjsKIAlzdHJ1Y3QgY2xfY2xpZW50X2NhY2hlICpjYWNoZSA9IGNsaS0+Y2xfY2FjaGU7CiAJaW50IG1heF9zY2FuczsKLQlpbnQgcmMgPSAwOworCWxvbmcgcmMgPSAwOwogCiAJTEFTU0VSVChjYWNoZSk7CiAKQEAgLTY5MywxNSArNjgxLDE1IEBACiAJCWlmIChyYyA9PSAtRUJVU1kpCiAJCQlyYyA9IDA7CiAKLQkJQ0RFQlVHKERfQ0FDSEUsICIlczogRnJlZSAlZCBwYWdlcyBmcm9tIG93biBMUlU6ICVwLlxuIiwKKwkJQ0RFQlVHKERfQ0FDSEUsICIlczogRnJlZSAlbGQgcGFnZXMgZnJvbSBvd24gTFJVOiAlcC5cbiIsCiAJCSAgICAgICBjbGktPmNsX2ltcG9ydC0+aW1wX29iZC0+b2JkX25hbWUsIHJjLCBjbGkpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlDREVCVUcoRF9DQUNIRSwgIiVzOiBjbGkgJXAgbm8gZnJlZSBzbG90cywgcGFnZXM6ICVkLCBidXN5OiAlZC5cbiIsCisJQ0RFQlVHKERfQ0FDSEUsICIlczogY2xpICVwIG5vIGZyZWUgc2xvdHMsIHBhZ2VzOiAlbGQsIGJ1c3k6ICVsZC5cbiIsCiAJICAgICAgIGNsaS0+Y2xfaW1wb3J0LT5pbXBfb2JkLT5vYmRfbmFtZSwgY2xpLAotCSAgICAgICBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCksCi0JICAgICAgIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9idXN5KSk7CisJICAgICAgIGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpLAorCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9idXN5KSk7CiAKIAkvKiBSZWNsYWltIExSVSBzbG90cyBmcm9tIG90aGVyIGNsaWVudF9vYmQgYXMgaXQgY2FuJ3QgZnJlZSBlbm91Z2gKIAkgKiBmcm9tIGl0cyBvd24uIFRoaXMgc2hvdWxkIHJhcmVseSBoYXBwZW4uCkBAIC03MTcsMTAgKzcwNSwxMCBAQAogCQljbGkgPSBsaXN0X2VudHJ5KGNhY2hlLT5jY2NfbHJ1Lm5leHQsIHN0cnVjdCBjbGllbnRfb2JkLAogCQkJCSBjbF9scnVfb3NjKTsKIAotCQlDREVCVUcoRF9DQUNIRSwgIiVzOiBjbGkgJXAgTFJVIHBhZ2VzOiAlZCwgYnVzeTogJWQuXG4iLAorCQlDREVCVUcoRF9DQUNIRSwgIiVzOiBjbGkgJXAgTFJVIHBhZ2VzOiAlbGQsIGJ1c3k6ICVsZC5cbiIsCiAJCSAgICAgICBjbGktPmNsX2ltcG9ydC0+aW1wX29iZC0+b2JkX25hbWUsIGNsaSwKLQkJICAgICAgIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSwKLQkJICAgICAgIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9idXN5KSk7CisJCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSwKKwkJICAgICAgIGF0b21pY19sb25nX3JlYWQoJmNsaS0+Y2xfbHJ1X2J1c3kpKTsKIAogCQlsaXN0X21vdmVfdGFpbCgmY2xpLT5jbF9scnVfb3NjLCAmY2FjaGUtPmNjY19scnUpOwogCQlpZiAob3NjX2NhY2hlX3Rvb19tdWNoKGNsaSkgPiAwKSB7CkBAIC03MzcsMTEgKzcyNSwxOCBAQAogCiBvdXQ6CiAJY2xfZW52X25lc3RlZF9wdXQoJm5lc3QsIGVudik7Ci0JQ0RFQlVHKERfQ0FDSEUsICIlczogY2xpICVwIGZyZWVkICVkIHBhZ2VzLlxuIiwKKwlDREVCVUcoRF9DQUNIRSwgIiVzOiBjbGkgJXAgZnJlZWQgJWxkIHBhZ2VzLlxuIiwKIAkgICAgICAgY2xpLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLCBjbGksIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKKy8qKgorICogb3NjX2xydV9yZXNlcnZlKCkgaXMgY2FsbGVkIHRvIHJlc2VydmUgYW4gTFJVIHNsb3QgZm9yIGEgY2xfcGFnZS4KKyAqCisgKiBVc3VhbGx5IHRoZSBMUlUgc2xvdHMgYXJlIHJlc2VydmVkIGluIG9zY19pb19pdGVyX3J3X2luaXQoKS4KKyAqIE9ubHkgaW4gdGhlIGNhc2UgdGhhdCB0aGUgTFJVIHNsb3RzIGFyZSBpbiBleHRyZW1lIHNob3J0YWdlLCBpdCBzaG91bGQKKyAqIGhhdmUgcmVzZXJ2ZWQgZW5vdWdoIHNsb3RzIGZvciBhbiBJTy4KKyAqLwogc3RhdGljIGludCBvc2NfbHJ1X3Jlc2VydmUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb3NjX29iamVjdCAqb2JqLAogCQkJICAgc3RydWN0IG9zY19wYWdlICpvcGcpCiB7CkBAIC03NTgsOCArNzUzLDggQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JTEFTU0VSVChhdG9taWNfcmVhZChjbGktPmNsX2xydV9sZWZ0KSA+PSAwKTsKLQl3aGlsZSAoIWF0b21pY19hZGRfdW5sZXNzKGNsaS0+Y2xfbHJ1X2xlZnQsIC0xLCAwKSkgeworCUxBU1NFUlQoYXRvbWljX2xvbmdfcmVhZChjbGktPmNsX2xydV9sZWZ0KSA+PSAwKTsKKwl3aGlsZSAoIWF0b21pY19sb25nX2FkZF91bmxlc3MoY2xpLT5jbF9scnVfbGVmdCwgLTEsIDApKSB7CiAJCS8qIHJ1biBvdXQgb2YgTFJVIHNwYWNlcywgdHJ5IHRvIGRyb3Agc29tZSBieSBpdHNlbGYgKi8KIAkJcmMgPSBvc2NfbHJ1X3JlY2xhaW0oY2xpKTsKIAkJaWYgKHJjIDwgMCkKQEAgLTc3MCw3ICs3NjUsNyBAQAogCQljb25kX3Jlc2NoZWQoKTsKIAogCQlyYyA9IGxfd2FpdF9ldmVudChvc2NfbHJ1X3dhaXRxLAotCQkJCSAgYXRvbWljX3JlYWQoY2xpLT5jbF9scnVfbGVmdCkgPiAwLAorCQkJCSAgYXRvbWljX2xvbmdfcmVhZChjbGktPmNsX2xydV9sZWZ0KSA+IDAsCiAJCQkJICAmbHdpKTsKIAogCQlpZiAocmMgPCAwKQpAQCAtNzc5LDcgKzc3NCw3IEBACiAKIG91dDoKIAlpZiAocmMgPj0gMCkgewotCQlhdG9taWNfaW5jKCZjbGktPmNsX2xydV9idXN5KTsKKwkJYXRvbWljX2xvbmdfaW5jKCZjbGktPmNsX2xydV9idXN5KTsKIAkJb3BnLT5vcHNfaW5fbHJ1ID0gMTsKIAkJcmMgPSAwOwogCX0KQEAgLTc4Nyw0ICs3ODIsMTUxIEBACiAJcmV0dXJuIHJjOwogfQogCisvKioKKyAqIEF0b21pYyBvcGVyYXRpb25zIGFyZSBleHBlbnNpdmUuIFdlIGFjY3VtdWxhdGUgdGhlIGFjY291bnRpbmcgZm9yIHRoZQorICogc2FtZSBwYWdlIHBnZGF0IHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgKiBJbiBwcmFjdGljZSB0aGlzIGNhbiB3b3JrIHByZXR0eSBnb29kIGJlY2F1c2UgdGhlIHBhZ2VzIGluIHRoZSBzYW1lIFJQQworICogYXJlIGxpa2VseSBmcm9tIHRoZSBzYW1lIHBhZ2Ugem9uZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHVuc3RhYmxlX3BhZ2VfYWNjb3VudGluZyhzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYywKKwkJCQkJICAgIGludCBmYWN0b3IpCit7CisJaW50IHBhZ2VfY291bnQgPSBkZXNjLT5iZF9pb3ZfY291bnQ7CisJcGdfZGF0YV90ICpsYXN0ID0gTlVMTDsKKwlpbnQgY291bnQgPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBhZ2VfY291bnQ7IGkrKykgeworCQlwZ19kYXRhX3QgKnBnZGF0ID0gcGFnZV9wZ2RhdChkZXNjLT5iZF9pb3ZbaV0uYnZfcGFnZSk7CisKKwkJaWYgKGxpa2VseShwZ2RhdCA9PSBsYXN0KSkgeworCQkJKytjb3VudDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNvdW50ID4gMCkgeworCQkJbW9kX25vZGVfcGFnZV9zdGF0ZShwZ2RhdCwgTlJfVU5TVEFCTEVfTkZTLAorCQkJCQkgICAgZmFjdG9yICogY291bnQpOworCQkJY291bnQgPSAwOworCQl9CisJCWxhc3QgPSBwZ2RhdDsKKwkJKytjb3VudDsKKwl9CisJaWYgKGNvdW50ID4gMCkKKwkJbW9kX25vZGVfcGFnZV9zdGF0ZShsYXN0LCBOUl9VTlNUQUJMRV9ORlMsIGZhY3RvciAqIGNvdW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkZF91bnN0YWJsZV9wYWdlX2FjY291bnRpbmcoc3RydWN0IHB0bHJwY19idWxrX2Rlc2MgKmRlc2MpCit7CisJdW5zdGFibGVfcGFnZV9hY2NvdW50aW5nKGRlc2MsIDEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjX3Vuc3RhYmxlX3BhZ2VfYWNjb3VudGluZyhzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYykKK3sKKwl1bnN0YWJsZV9wYWdlX2FjY291bnRpbmcoZGVzYywgLTEpOworfQorCisvKioKKyAqIFBlcmZvcm1zICJ1bnN0YWJsZSIgcGFnZSBhY2NvdW50aW5nLiBUaGlzIGZ1bmN0aW9uIGJhbGFuY2VzIHRoZQorICogaW5jcmVtZW50IG9wZXJhdGlvbnMgcGVyZm9ybWVkIGluIG9zY19pbmNfdW5zdGFibGVfcGFnZXMuIEl0IGlzCisgKiByZWdpc3RlcmVkIGFzIHRoZSBSUEMgcmVxdWVzdCBjYWxsYmFjaywgYW5kIGlzIGV4ZWN1dGVkIHdoZW4gdGhlCisgKiBidWxrIFJQQyBpcyBjb21taXR0ZWQgb24gdGhlIHNlcnZlci4gVGh1cyBhdCB0aGlzIHBvaW50LCB0aGUgcGFnZXMKKyAqIGludm9sdmVkIGluIHRoZSBidWxrIHRyYW5zZmVyIGFyZSBubyBsb25nZXIgY29uc2lkZXJlZCB1bnN0YWJsZS4KKyAqCisgKiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIHJlcXVlc3Qgc2hvdWxkIGhhdmUgYmVlbiBjb21taXR0ZWQKKyAqIG9yIHJlcTpycV91bnN0YWJsZSBtdXN0IGhhdmUgYmVlbiBzZXQ7IGl0IGltcGxpZXMgdGhhdCB0aGUgdW5zdGFibGUKKyAqIHN0YXRpc3RpYyBoYXZlIGJlZW4gYWRkZWQuCisgKi8KK3ZvaWQgb3NjX2RlY191bnN0YWJsZV9wYWdlcyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJnJlcS0+cnFfaW1wb3J0LT5pbXBfb2JkLT51LmNsaTsKKwlzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYyA9IHJlcS0+cnFfYnVsazsKKwlpbnQgcGFnZV9jb3VudCA9IGRlc2MtPmJkX2lvdl9jb3VudDsKKwlsb25nIHVuc3RhYmxlX2NvdW50OworCisJTEFTU0VSVChwYWdlX2NvdW50ID49IDApOworCWRlY191bnN0YWJsZV9wYWdlX2FjY291bnRpbmcoZGVzYyk7CisKKwl1bnN0YWJsZV9jb3VudCA9IGF0b21pY19sb25nX3N1Yl9yZXR1cm4ocGFnZV9jb3VudCwKKwkJCQkJCSZjbGktPmNsX3Vuc3RhYmxlX2NvdW50KTsKKwlMQVNTRVJUKHVuc3RhYmxlX2NvdW50ID49IDApOworCisJdW5zdGFibGVfY291bnQgPSBhdG9taWNfbG9uZ19zdWJfcmV0dXJuKHBhZ2VfY291bnQsCisJCQkJCQkmY2xpLT5jbF9jYWNoZS0+Y2NjX3Vuc3RhYmxlX25yKTsKKwlMQVNTRVJUKHVuc3RhYmxlX2NvdW50ID49IDApOworCWlmICghdW5zdGFibGVfY291bnQpCisJCXdha2VfdXBfYWxsKCZjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfd2FpdHEpOworCisJaWYgKG9zY19jYWNoZV90b29fbXVjaChjbGkpKQorCQkodm9pZClwdGxycGNkX3F1ZXVlX3dvcmsoY2xpLT5jbF9scnVfd29yayk7Cit9CisKKy8qKgorICogInVuc3RhYmxlIiBwYWdlIGFjY291bnRpbmcuIFNlZTogb3NjX2RlY191bnN0YWJsZV9wYWdlcy4KKyAqLwordm9pZCBvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgID0gJnJlcS0+cnFfaW1wb3J0LT5pbXBfb2JkLT51LmNsaTsKKwlzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqZGVzYyA9IHJlcS0+cnFfYnVsazsKKwlsb25nIHBhZ2VfY291bnQgPSBkZXNjLT5iZF9pb3ZfY291bnQ7CisKKwkvKiBObyB1bnN0YWJsZSBwYWdlIHRyYWNraW5nICovCisJaWYgKCFjbGktPmNsX2NhY2hlIHx8ICFjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfY2hlY2spCisJCXJldHVybjsKKworCWFkZF91bnN0YWJsZV9wYWdlX2FjY291bnRpbmcoZGVzYyk7CisJYXRvbWljX2xvbmdfYWRkKHBhZ2VfY291bnQsICZjbGktPmNsX3Vuc3RhYmxlX2NvdW50KTsKKwlhdG9taWNfbG9uZ19hZGQocGFnZV9jb3VudCwgJmNsaS0+Y2xfY2FjaGUtPmNjY191bnN0YWJsZV9ucik7CisKKwkvKgorCSAqIElmIHRoZSByZXF1ZXN0IGhhcyBhbHJlYWR5IGJlZW4gY29tbWl0dGVkIChpLmUuIGJyd19jb21taXQKKwkgKiBjYWxsZWQgdmlhIHJxX2NvbW1pdF9jYiksIHdlIG5lZWQgdG8gdW5kbyB0aGUgdW5zdGFibGUgcGFnZQorCSAqIGluY3JlbWVudHMgd2UganVzdCBwZXJmb3JtZWQgYmVjYXVzZSBycV9jb21taXRfY2Igd29udCBiZQorCSAqIGNhbGxlZCBhZ2Fpbi4KKwkgKi8KKwlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CisJaWYgKHVubGlrZWx5KHJlcS0+cnFfY29tbWl0dGVkKSkgeworCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKKworCQlvc2NfZGVjX3Vuc3RhYmxlX3BhZ2VzKHJlcSk7CisJfSBlbHNlIHsKKwkJcmVxLT5ycV91bnN0YWJsZSA9IDE7CisJCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOworCX0KK30KKworLyoqCisgKiBDaGVjayBpZiBpdCBwaWdneWJhY2tzIFNPRlRfU1lOQyBmbGFnIHRvIE9TVCBmcm9tIHRoaXMgT1NDLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBieSBldmVyeSBCUlcgUlBDIHNvIGl0J3MgY3JpdGljYWwKKyAqIHRvIG1ha2UgdGhpcyBmdW5jdGlvbiBmYXN0LgorICovCitib29sIG9zY19vdmVyX3Vuc3RhYmxlX3NvZnRfbGltaXQoc3RydWN0IGNsaWVudF9vYmQgKmNsaSkKK3sKKwlsb25nIHVuc3RhYmxlX25yLCBvc2NfdW5zdGFibGVfY291bnQ7CisKKwkvKiBDYW4ndCBjaGVjayBjbGktPmNsX3Vuc3RhYmxlX2NvdW50LCB0aGVyZWZvcmUsIG5vIHNvZnQgbGltaXQgKi8KKwlpZiAoIWNsaS0+Y2xfY2FjaGUgfHwgIWNsaS0+Y2xfY2FjaGUtPmNjY191bnN0YWJsZV9jaGVjaykKKwkJcmV0dXJuIGZhbHNlOworCisJb3NjX3Vuc3RhYmxlX2NvdW50ID0gYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF91bnN0YWJsZV9jb3VudCk7CisJdW5zdGFibGVfbnIgPSBhdG9taWNfbG9uZ19yZWFkKCZjbGktPmNsX2NhY2hlLT5jY2NfdW5zdGFibGVfbnIpOworCisJQ0RFQlVHKERfQ0FDSEUsCisJICAgICAgICIlczogY2xpOiAlcCB1bnN0YWJsZSBwYWdlczogJWx1LCBvc2MgdW5zdGFibGUgcGFnZXM6ICVsdVxuIiwKKwkgICAgICAgY2xpLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLCBjbGksCisJICAgICAgIHVuc3RhYmxlX25yLCBvc2NfdW5zdGFibGVfY291bnQpOworCisJLyoKKwkgKiBJZiB0aGUgTFJVIHNsb3RzIGFyZSBpbiBzaG9ydGFnZSAtIDI1JSByZW1haW5pbmcgQU5EIHRoaXMgT1NDCisJICogaGFzIG9uZSBmdWxsIFJQQyB3aW5kb3cgb2YgdW5zdGFibGUgcGFnZXMsIGl0J3MgYSBnb29kIGNoYW5jZQorCSAqIHRvIHBpZ2d5YmFjayBhIFNPRlRfU1lOQyBmbGFnLgorCSAqIFBsZWFzZSBub3RpY2UgdGhhdCB0aGUgT1NUIHdvbid0IHRha2UgaW1tZWRpYXRlIHJlc3BvbnNlIGZvciB0aGUKKwkgKiBTT0ZUX1NZTkMgcmVxdWVzdCBzbyBhY3RpdmUgT1NDcyB3aWxsIGhhdmUgbW9yZSBjaGFuY2UgdG8gY2FycnkKKwkgKiB0aGUgZmxhZywgdGhpcyBpcyByZWFzb25hYmxlLgorCSAqLworCXJldHVybiB1bnN0YWJsZV9uciA+IGNsaS0+Y2xfY2FjaGUtPmNjY19scnVfbWF4ID4+IDIgJiYKKwkgICAgICAgb3NjX3Vuc3RhYmxlX2NvdW50ID4gY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyAqCisJCQkJICAgIGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0OworfQorCiAvKiogQH0gb3NjICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcmVxdWVzdC5jCmluZGV4IDUzNmI4NjguLjc0OTc4MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcmVxdWVzdC5jCkBAIC00MSw2ICs0MSw3IEBACiAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9oYS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZS9sdXN0cmVfaW9jdGwuaCIKICNpbmNsdWRlICIuLi9pbmNsdWRlL2x1c3RyZV9kZWJ1Zy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHVzdHJlX3BhcmFtLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfZmlkLmgiCkBAIC0xMDIsMzYgKzEwMyw2IEBACiBzdGF0aWMgaW50IGJyd19pbnRlcnByZXQoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAogCQkJIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCB2b2lkICpkYXRhLCBpbnQgcmMpOwogCi0vKiBQYWNrIE9TQyBvYmplY3QgbWV0YWRhdGEgZm9yIGRpc2sgc3RvcmFnZSAoTEUgYnl0ZSBvcmRlcikuICovCi1zdGF0aWMgaW50IG9zY19wYWNrbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9tZHNfbWQgKipsbW1wLAotCQkgICAgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQotewotCWludCBsbW1fc2l6ZTsKLQotCWxtbV9zaXplID0gc2l6ZW9mKCoqbG1tcCk7Ci0JaWYgKCFsbW1wKQotCQlyZXR1cm4gbG1tX3NpemU7Ci0KLQlpZiAoKmxtbXAgJiYgIWxzbSkgewotCQlrZnJlZSgqbG1tcCk7Ci0JCSpsbW1wID0gTlVMTDsKLQkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmICh1bmxpa2VseShsc20gJiYgb3N0aWRfaWQoJmxzbS0+bHNtX29pKSA9PSAwKSkgewotCQlyZXR1cm4gLUVCQURGOwotCX0KLQotCWlmICghKmxtbXApIHsKLQkJKmxtbXAgPSBremFsbG9jKGxtbV9zaXplLCBHRlBfTk9GUyk7Ci0JCWlmICghKmxtbXApCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpZiAobHNtKQotCQlvc3RpZF9jcHVfdG9fbGUoJmxzbS0+bHNtX29pLCAmKCpsbW1wKS0+bG1tX29pKTsKLQotCXJldHVybiBsbW1fc2l6ZTsKLX0KLQogLyogVW5wYWNrIE9TQyBvYmplY3QgbWV0YWRhdGEgZnJvbSBkaXNrIHN0b3JhZ2UgKExFIGJ5dGUgb3JkZXIpLiAqLwogc3RhdGljIGludCBvc2NfdW5wYWNrbWQoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKipsc21wLAogCQkJc3RydWN0IGxvdl9tZHNfbWQgKmxtbSwgaW50IGxtbV9ieXRlcykKQEAgLTE4OSw3ICsxNjAsNyBAQAogCSAgICAoaW1wLT5pbXBfY29ubmVjdF9kYXRhLm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfTUFYQllURVMpKQogCQkoKmxzbXApLT5sc21fbWF4Ynl0ZXMgPSBpbXAtPmltcF9jb25uZWN0X2RhdGEub2NkX21heGJ5dGVzOwogCWVsc2UKLQkJKCpsc21wKS0+bHNtX21heGJ5dGVzID0gTFVTVFJFX1NUUklQRV9NQVhCWVRFUzsKKwkJKCpsc21wKS0+bHNtX21heGJ5dGVzID0gTFVTVFJFX0VYVDNfU1RSSVBFX01BWEJZVEVTOwogCiAJcmV0dXJuIGxzbV9zaXplOwogfQpAQCAtNDI3LDI0ICszOTgsMTYgQEAKIAkJCQkgICAgICBvaW5mby0+b2lfY2JfdXAsIG9pbmZvLCBycXNldCk7CiB9CiAKLXN0YXRpYyBpbnQgb3NjX3JlYWxfY3JlYXRlKHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIHN0cnVjdCBvYmRvICpvYSwKLQkJCSAgIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqZWEsCi0JCQkgICBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSkKK3N0YXRpYyBpbnQgb3NjX2NyZWF0ZShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCisJCSAgICAgIHN0cnVjdCBvYmRvICpvYSwgc3RydWN0IG9iZF90cmFuc19pbmZvICpvdGkpCiB7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CiAJc3RydWN0IG9zdF9ib2R5ICpib2R5OwotCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc207CiAJaW50IHJjOwogCiAJTEFTU0VSVChvYSk7Ci0JTEFTU0VSVChlYSk7Ci0KLQlsc20gPSAqZWE7Ci0JaWYgKCFsc20pIHsKLQkJcmMgPSBvYmRfYWxsb2NfbWVtbWQoZXhwLCAmbHNtKTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiByYzsKLQl9CisJTEFTU0VSVChvYS0+b192YWxpZCAmIE9CRF9NRF9GTEdST1VQKTsKKwlMQVNTRVJUKGZpZF9zZXFfaXNfZWNobyhvc3RpZF9zZXEoJm9hLT5vX29pKSkpOwogCiAJcmVxID0gcHRscnBjX3JlcXVlc3RfYWxsb2MoY2xhc3NfZXhwMmNsaWltcChleHApLCAmUlFGX09TVF9DUkVBVEUpOwogCWlmICghcmVxKSB7CkBAIC00OTAsMjEgKzQ1MywxMCBAQAogCW9hLT5vX2Jsa3NpemUgPSBjbGlfYnJ3X3NpemUoZXhwLT5leHBfb2JkKTsKIAlvYS0+b192YWxpZCB8PSBPQkRfTURfRkxCTEtTWjsKIAotCS8qIFhYWCBMT1YgU1RBQ0tJTkc6IHRoZSBsc20gdGhhdCBpcyBwYXNzZWQgdG8gdXMgZnJvbSBMT1YgZG9lcyBub3QKLQkgKiBoYXZlIHZhbGlkIGxzbV9vaW5mbyBkYXRhIHN0cnVjdHMsIHNvIGRvbid0IGdvIHRvdWNoaW5nIHRoYXQuCi0JICogVGhpcyBuZWVkcyB0byBiZSBmaXhlZCBpbiBhIGJpZyB3YXkuCi0JICovCi0JbHNtLT5sc21fb2kgPSBvYS0+b19vaTsKLQkqZWEgPSBsc207Ci0KLQlpZiAob3RpKSB7Ci0JCW90aS0+b3RpX3RyYW5zbm8gPSBsdXN0cmVfbXNnX2dldF90cmFuc25vKHJlcS0+cnFfcmVwbXNnKTsKLQotCQlpZiAob2EtPm9fdmFsaWQgJiBPQkRfTURfRkxDT09LSUUpIHsKLQkJCWlmICghb3RpLT5vdGlfbG9nY29va2llcykKLQkJCQlvdGlfYWxsb2NfY29va2llcyhvdGksIDEpOwotCQkJKm90aS0+b3RpX2xvZ2Nvb2tpZXMgPSBvYS0+b19sY29va2llOwotCQl9CisJaWYgKG90aSAmJiBvYS0+b192YWxpZCAmIE9CRF9NRF9GTENPT0tJRSkgeworCQlpZiAoIW90aS0+b3RpX2xvZ2Nvb2tpZXMpCisJCQlvdGktPm90aV9sb2djb29raWVzID0gJm90aS0+b3RpX29uZWNvb2tpZTsKKwkJKm90aS0+b3RpX2xvZ2Nvb2tpZXMgPSBvYS0+b19sY29va2llOwogCX0KIAogCUNERUJVRyhEX0hBLCAidHJhbnNubzogJWxsZFxuIiwKQEAgLTUxMiw4ICs0NjQsNiBAQAogb3V0X3JlcToKIAlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7CiBvdXQ6Ci0JaWYgKHJjICYmICEqZWEpCi0JCW9iZF9mcmVlX21lbW1kKGV4cCwgJmxzbSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC02NDksNyArNTk5LDcgQEAKIAogCW9zdGlkX2J1aWxkX3Jlc19uYW1lKCZvYS0+b19vaSwgJnJlc19pZCk7CiAJcmVzID0gbGRsbV9yZXNvdXJjZV9nZXQobnMsIE5VTEwsICZyZXNfaWQsIDAsIDApOwotCWlmICghcmVzKQorCWlmIChJU19FUlIocmVzKSkKIAkJcmV0dXJuIDA7CiAKIAlMRExNX1JFU09VUkNFX0FERFJFRihyZXMpOwpAQCAtNjg5LDMwICs2MzksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9zY19jcmVhdGUoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAotCQkgICAgICBzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICoqZWEsCi0JCSAgICAgIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpKQotewotCWludCByYyA9IDA7Ci0KLQlMQVNTRVJUKG9hKTsKLQlMQVNTRVJUKGVhKTsKLQlMQVNTRVJUKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMR1JPVVApOwotCi0JaWYgKChvYS0+b192YWxpZCAmIE9CRF9NRF9GTEZMQUdTKSAmJgotCSAgICBvYS0+b19mbGFncyA9PSBPQkRfRkxfUkVDUkVBVEVfT0JKUykgewotCQlyZXR1cm4gb3NjX3JlYWxfY3JlYXRlKGV4cCwgb2EsIGVhLCBvdGkpOwotCX0KLQotCWlmICghZmlkX3NlcV9pc19tZHQob3N0aWRfc2VxKCZvYS0+b19vaSkpKQotCQlyZXR1cm4gb3NjX3JlYWxfY3JlYXRlKGV4cCwgb2EsIGVhLCBvdGkpOwotCi0JLyogd2Ugc2hvdWxkIG5vdCBnZXQgaGVyZSBhbnltb3JlICovCi0JTEJVRygpOwotCi0JcmV0dXJuIHJjOwotfQotCiAvKiBEZXN0cm95IHJlcXVlc3RzIGNhbiBiZSBhc3luYyBhbHdheXMgb24gdGhlIGNsaWVudCwgYW5kIHdlIGRvbid0IGV2ZW4gcmVhbGx5CiAgKiBjYXJlIGFib3V0IHRoZSByZXR1cm4gY29kZSBzaW5jZSB0aGUgY2xpZW50IGNhbm5vdCBkbyBhbnl0aGluZyBhdCBhbGwgYWJvdXQKICAqIGEgZGVzdHJveSBmYWlsdXJlLgpAQCAtNzI1LDggKzY1MSw3IEBACiAgKiBjb29raWVzIHRvIHRoZSBNRFMgYWZ0ZXIgY29tbWl0dGluZyBkZXN0cm95IHRyYW5zYWN0aW9ucy4KICAqLwogc3RhdGljIGludCBvc2NfZGVzdHJveShjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCi0JCSAgICAgICBzdHJ1Y3Qgb2JkbyAqb2EsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICplYSwKLQkJICAgICAgIHN0cnVjdCBvYmRfdHJhbnNfaW5mbyAqb3RpLCBzdHJ1Y3Qgb2JkX2V4cG9ydCAqbWRfZXhwb3J0KQorCQkgICAgICAgc3RydWN0IG9iZG8gKm9hLCBzdHJ1Y3Qgb2JkX3RyYW5zX2luZm8gKm90aSkKIHsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmV4cC0+ZXhwX29iZC0+dS5jbGk7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXE7CkBAIC03OTQsNDIgKzcxOSw0NCBAQAogc3RhdGljIHZvaWQgb3NjX2Fubm91bmNlX2NhY2hlZChzdHJ1Y3QgY2xpZW50X29iZCAqY2xpLCBzdHJ1Y3Qgb2JkbyAqb2EsCiAJCQkJbG9uZyB3cml0aW5nX2J5dGVzKQogewotCXUzMiBiaXRzID0gT0JEX01EX0ZMQkxPQ0tTfE9CRF9NRF9GTEdSQU5UOworCXUzMiBiaXRzID0gT0JEX01EX0ZMQkxPQ0tTIHwgT0JEX01EX0ZMR1JBTlQ7CiAKIAlMQVNTRVJUKCEob2EtPm9fdmFsaWQgJiBiaXRzKSk7CiAKIAlvYS0+b192YWxpZCB8PSBiaXRzOwogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlvYS0+b19kaXJ0eSA9IGNsaS0+Y2xfZGlydHk7Ci0JaWYgKHVubGlrZWx5KGNsaS0+Y2xfZGlydHkgLSBjbGktPmNsX2RpcnR5X3RyYW5zaXQgPgotCQkgICAgIGNsaS0+Y2xfZGlydHlfbWF4KSkgeworCW9hLT5vX2RpcnR5ID0gY2xpLT5jbF9kaXJ0eV9wYWdlcyA8PCBQQUdFX1NISUZUOworCWlmICh1bmxpa2VseShjbGktPmNsX2RpcnR5X3BhZ2VzIC0gY2xpLT5jbF9kaXJ0eV90cmFuc2l0ID4KKwkJICAgICBjbGktPmNsX2RpcnR5X21heF9wYWdlcykpIHsKIAkJQ0VSUk9SKCJkaXJ0eSAlbHUgLSAlbHUgPiBkaXJ0eV9tYXggJWx1XG4iLAotCQkgICAgICAgY2xpLT5jbF9kaXJ0eSwgY2xpLT5jbF9kaXJ0eV90cmFuc2l0LCBjbGktPmNsX2RpcnR5X21heCk7CisJCSAgICAgICBjbGktPmNsX2RpcnR5X3BhZ2VzLCBjbGktPmNsX2RpcnR5X3RyYW5zaXQsCisJCSAgICAgICBjbGktPmNsX2RpcnR5X21heF9wYWdlcyk7CiAJCW9hLT5vX3VuZGlydHkgPSAwOwotCX0gZWxzZSBpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcykgKwotCQkJICAgIGF0b21pY19yZWFkKCZvYmRfZGlydHlfcGFnZXMpIC0KLQkJCSAgICBhdG9taWNfcmVhZCgmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpID4KLQkJCSAgICAobG9uZykob2JkX21heF9kaXJ0eV9wYWdlcyArIDEpKSkgeworCX0gZWxzZSBpZiAodW5saWtlbHkoYXRvbWljX2xvbmdfcmVhZCgmb2JkX2RpcnR5X3BhZ2VzKSAtCisJCQkgICAgYXRvbWljX2xvbmdfcmVhZCgmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpID4KKwkJCSAgICAob2JkX21heF9kaXJ0eV9wYWdlcyArIDEpKSkgewogCQkvKiBUaGUgYXRvbWljX3JlYWQoKSBhbGxvd2luZyB0aGUgYXRvbWljX2luYygpIGFyZQogCQkgKiBub3QgY292ZXJlZCBieSBhIGxvY2sgdGh1cyB0aGV5IG1heSBzYWZlbHkgcmFjZSBhbmQgdHJpcAogCQkgKiB0aGlzIENFUlJPUigpIHVubGVzcyB3ZSBhZGQgaW4gYSBzbWFsbCBmdWRnZSBmYWN0b3IgKCsxKS4KIAkJICovCi0JCUNFUlJPUigiJXM6IGRpcnR5ICVkICsgJWQgLSAlZCA+IHN5c3RlbSBkaXJ0eV9tYXggJWRcbiIsCisJCUNFUlJPUigiJXM6IGRpcnR5ICVsZCArICVsZCA+IHN5c3RlbSBkaXJ0eV9tYXggJWx1XG4iLAogCQkgICAgICAgY2xpLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLAotCQkgICAgICAgYXRvbWljX3JlYWQoJm9iZF91bnN0YWJsZV9wYWdlcyksCi0JCSAgICAgICBhdG9taWNfcmVhZCgmb2JkX2RpcnR5X3BhZ2VzKSwKLQkJICAgICAgIGF0b21pY19yZWFkKCZvYmRfZGlydHlfdHJhbnNpdF9wYWdlcyksCisJCSAgICAgICBhdG9taWNfbG9uZ19yZWFkKCZvYmRfZGlydHlfcGFnZXMpLAorCQkgICAgICAgYXRvbWljX2xvbmdfcmVhZCgmb2JkX2RpcnR5X3RyYW5zaXRfcGFnZXMpLAogCQkgICAgICAgb2JkX21heF9kaXJ0eV9wYWdlcyk7CiAJCW9hLT5vX3VuZGlydHkgPSAwOwotCX0gZWxzZSBpZiAodW5saWtlbHkoY2xpLT5jbF9kaXJ0eV9tYXggLSBjbGktPmNsX2RpcnR5ID4gMHg3ZmZmZmZmZikpIHsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KGNsaS0+Y2xfZGlydHlfbWF4X3BhZ2VzIC0gY2xpLT5jbF9kaXJ0eV9wYWdlcyA+CisJCSAgIDB4N2ZmZmZmZmYpKSB7CiAJCUNFUlJPUigiZGlydHkgJWx1IC0gZGlydHlfbWF4ICVsdSB0b28gYmlnPz8/XG4iLAotCQkgICAgICAgY2xpLT5jbF9kaXJ0eSwgY2xpLT5jbF9kaXJ0eV9tYXgpOworCQkgICAgICAgY2xpLT5jbF9kaXJ0eV9wYWdlcywgY2xpLT5jbF9kaXJ0eV9tYXhfcGFnZXMpOwogCQlvYS0+b191bmRpcnR5ID0gMDsKIAl9IGVsc2UgewotCQlsb25nIG1heF9pbl9mbGlnaHQgPSAoY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyA8PAotCQkJCSAgICAgIFBBR0VfU0hJRlQpKgotCQkJCSAgICAgKGNsaS0+Y2xfbWF4X3JwY3NfaW5fZmxpZ2h0ICsgMSk7Ci0JCW9hLT5vX3VuZGlydHkgPSBtYXgoY2xpLT5jbF9kaXJ0eV9tYXgsIG1heF9pbl9mbGlnaHQpOworCQl1bnNpZ25lZCBsb25nIG1heF9pbl9mbGlnaHQ7CisKKwkJbWF4X2luX2ZsaWdodCA9IChjbGktPmNsX21heF9wYWdlc19wZXJfcnBjIDw8IFBBR0VfU0hJRlQpICoKKwkJCQkoY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQgKyAxKTsKKwkJb2EtPm9fdW5kaXJ0eSA9IG1heChjbGktPmNsX2RpcnR5X21heF9wYWdlcyA8PCBQQUdFX1NISUZULAorCQkJCSAgICBtYXhfaW5fZmxpZ2h0KTsKIAl9CiAJb2EtPm9fZ3JhbnQgPSBjbGktPmNsX2F2YWlsX2dyYW50ICsgY2xpLT5jbF9yZXNlcnZlZF9ncmFudDsKIAlvYS0+b19kcm9wcGVkID0gY2xpLT5jbF9sb3N0X2dyYW50OwpAQCAtMTAyOSwyMiArOTU2LDI0IEBACiB7CiAJLyoKIAkgKiBvY2RfZ3JhbnQgaXMgdGhlIHRvdGFsIGdyYW50IGFtb3VudCB3ZSdyZSBleHBlY3QgdG8gaG9sZDogaWYgd2UndmUKLQkgKiBiZWVuIGV2aWN0ZWQsIGl0J3MgdGhlIG5ldyBhdmFpbF9ncmFudCBhbW91bnQsIGNsX2RpcnR5IHdpbGwgZHJvcAotCSAqIHRvIDAgYXMgaW5mbGlnaHQgUlBDcyBmYWlsIG91dDsgb3RoZXJ3aXNlLCBpdCdzIGF2YWlsX2dyYW50ICsgZGlydHkuCisJICogYmVlbiBldmljdGVkLCBpdCdzIHRoZSBuZXcgYXZhaWxfZ3JhbnQgYW1vdW50LCBjbF9kaXJ0eV9wYWdlcyB3aWxsCisJICogZHJvcCB0byAwIGFzIGluZmxpZ2h0IFJQQ3MgZmFpbCBvdXQ7IG90aGVyd2lzZSwgaXQncyBhdmFpbF9ncmFudCArCisJICogZGlydHkuCiAJICoKIAkgKiByYWNlIGlzIHRvbGVyYWJsZSBoZXJlOiBpZiB3ZSdyZSBldmljdGVkLCBidXQgaW1wX3N0YXRlIGFscmVhZHkKLQkgKiBsZWZ0IEVWSUNURUQgc3RhdGUsIHRoZW4gY2xfZGlydHkgbXVzdCBiZSAwIGFscmVhZHkuCisJICogbGVmdCBFVklDVEVEIHN0YXRlLCB0aGVuIGNsX2RpcnR5X3BhZ2VzIG11c3QgYmUgMCBhbHJlYWR5LgogCSAqLwogCXNwaW5fbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKIAlpZiAoY2xpLT5jbF9pbXBvcnQtPmltcF9zdGF0ZSA9PSBMVVNUUkVfSU1QX0VWSUNURUQpCiAJCWNsaS0+Y2xfYXZhaWxfZ3JhbnQgPSBvY2QtPm9jZF9ncmFudDsKIAllbHNlCi0JCWNsaS0+Y2xfYXZhaWxfZ3JhbnQgPSBvY2QtPm9jZF9ncmFudCAtIGNsaS0+Y2xfZGlydHk7CisJCWNsaS0+Y2xfYXZhaWxfZ3JhbnQgPSBvY2QtPm9jZF9ncmFudCAtCisJCQkJICAgICAgKGNsaS0+Y2xfZGlydHlfcGFnZXMgPDwgUEFHRV9TSElGVCk7CiAKIAlpZiAoY2xpLT5jbF9hdmFpbF9ncmFudCA8IDApIHsKIAkJQ1dBUk4oIiVzOiBhdmFpbGFibGUgZ3JhbnQgPCAwOiBhdmFpbC9vY2QvZGlydHkgJWxkLyV1LyVsZFxuIiwKIAkJICAgICAgY2xpLT5jbF9pbXBvcnQtPmltcF9vYmQtPm9iZF9uYW1lLCBjbGktPmNsX2F2YWlsX2dyYW50LAotCQkgICAgICBvY2QtPm9jZF9ncmFudCwgY2xpLT5jbF9kaXJ0eSk7CisJCSAgICAgIG9jZC0+b2NkX2dyYW50LCBjbGktPmNsX2RpcnR5X3BhZ2VzIDw8IFBBR0VfU0hJRlQpOwogCQkvKiB3b3JrYXJvdW5kIGZvciBzZXJ2ZXJzIHdoaWNoIGRvIG5vdCBoYXZlIHRoZSBwYXRjaCBmcm9tCiAJCSAqIExVLTI2NzkKIAkJICovCkBAIC0xMTgxLDcgKzExMTAsNyBAQAogCX0KIAogCXdoaWxlIChub2IgPiAwICYmIHBnX2NvdW50ID4gMCkgewotCQlpbnQgY291bnQgPSBwZ2FbaV0tPmNvdW50ID4gbm9iID8gbm9iIDogcGdhW2ldLT5jb3VudDsKKwkJdW5zaWduZWQgaW50IGNvdW50ID0gcGdhW2ldLT5jb3VudCA+IG5vYiA/IG5vYiA6IHBnYVtpXS0+Y291bnQ7CiAKIAkJLyogY29ycnVwdCB0aGUgZGF0YSBiZWZvcmUgd2UgY29tcHV0ZSB0aGUgY2hlY2tzdW0sIHRvCiAJCSAqIHNpbXVsYXRlIGFuIE9TVC0+Y2xpZW50IGRhdGEgZXJyb3IKQEAgLTExOTEsNyArMTEyMCw3IEBACiAJCQl1bnNpZ25lZCBjaGFyICpwdHIgPSBrbWFwKHBnYVtpXS0+cGcpOwogCQkJaW50IG9mZiA9IHBnYVtpXS0+b2ZmICYgflBBR0VfTUFTSzsKIAotCQkJbWVtY3B5KHB0ciArIG9mZiwgImJhZDEiLCBtaW4oNCwgbm9iKSk7CisJCQltZW1jcHkocHRyICsgb2ZmLCAiYmFkMSIsIG1pbl90KHR5cGVvZihub2IpLCA0LCBub2IpKTsKIAkJCWt1bm1hcChwZ2FbaV0tPnBnKTsKIAkJfQogCQljZnNfY3J5cHRvX2hhc2hfdXBkYXRlX3BhZ2UoaGRlc2MsIHBnYVtpXS0+cGcsCkBAIC0xMzM1LDExICsxMjY0LDExIEBACiAKIAkJaWYgKGkgPiAwICYmIGNhbl9tZXJnZV9wYWdlcyhwZ19wcmV2LCBwZykpIHsKIAkJCW5pb2J1Zi0tOwotCQkJbmlvYnVmLT5sZW4gKz0gcGctPmNvdW50OworCQkJbmlvYnVmLT5ybmJfbGVuICs9IHBnLT5jb3VudDsKIAkJfSBlbHNlIHsKLQkJCW5pb2J1Zi0+b2Zmc2V0ID0gcGctPm9mZjsKLQkJCW5pb2J1Zi0+bGVuID0gcGctPmNvdW50OwotCQkJbmlvYnVmLT5mbGFncyA9IHBnLT5mbGFnOworCQkJbmlvYnVmLT5ybmJfb2Zmc2V0ID0gcGctPm9mZjsKKwkJCW5pb2J1Zi0+cm5iX2xlbiA9IHBnLT5jb3VudDsKKwkJCW5pb2J1Zi0+cm5iX2ZsYWdzID0gcGctPmZsYWc7CiAJCX0KIAkJcGdfcHJldiA9IHBnOwogCX0KQEAgLTE0MTgsNiArMTM0NywxMSBAQAogCUlOSVRfTElTVF9IRUFEKCZhYS0+YWFfb2Fwcyk7CiAKIAkqcmVxcCA9IHJlcTsKKwluaW9idWYgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KHBpbGwsICZSTUZfTklPQlVGX1JFTU9URSk7CisJQ0RFQlVHKERfUlBDVFJBQ0UsICJicncgcnBjICVwIC0gb2JqZWN0ICIgRE9TVElEICIgb2Zmc2V0ICVsbGQ8PiVsbGRcbiIsCisJICAgICAgIHJlcSwgUE9TVElEKCZvYS0+b19vaSksIG5pb2J1ZlswXS5ybmJfb2Zmc2V0LAorCSAgICAgICBuaW9idWZbbmlvY291bnQgLSAxXS5ybmJfb2Zmc2V0ICsgbmlvYnVmW25pb2NvdW50IC0gMV0ucm5iX2xlbik7CisKIAlyZXR1cm4gMDsKIAogIG91dDoKQEAgLTE0NjMsNyArMTM5Nyw4IEBACiAJCQkgICBvYS0+b192YWxpZCAmIE9CRF9NRF9GTEZJRCA/IG9hLT5vX3BhcmVudF9vaWQgOiAwLAogCQkJICAgb2EtPm9fdmFsaWQgJiBPQkRfTURfRkxGSUQgPyBvYS0+b19wYXJlbnRfdmVyIDogMCwKIAkJCSAgIFBPU1RJRCgmb2EtPm9fb2kpLCBwZ2FbMF0tPm9mZiwKLQkJCSAgIHBnYVtwYWdlX2NvdW50LTFdLT5vZmYgKyBwZ2FbcGFnZV9jb3VudC0xXS0+Y291bnQgLSAxKTsKKwkJCSAgIHBnYVtwYWdlX2NvdW50IC0gMV0tPm9mZiArCisJCQkgICBwZ2FbcGFnZV9jb3VudCAtIDFdLT5jb3VudCAtIDEpOwogCUNFUlJPUigib3JpZ2luYWwgY2xpZW50IGNzdW0gJXggKHR5cGUgJXgpLCBzZXJ2ZXIgY3N1bSAleCAodHlwZSAleCksIGNsaWVudCBjc3VtIG5vdyAleFxuIiwKIAkgICAgICAgY2xpZW50X2Nrc3VtLCBjbGllbnRfY2tzdW1fdHlwZSwKIAkgICAgICAgc2VydmVyX2Nrc3VtLCBja3N1bV90eXBlLCBuZXdfY2tzdW0pOwpAQCAtMTU2NSw3ICsxNTAwLDggQEAKIAkJY2hhciAqcm91dGVyID0gIiI7CiAJCWVudW0gY2tzdW1fdHlwZSBja3N1bV90eXBlOwogCi0JCWNrc3VtX3R5cGUgPSBja3N1bV90eXBlX3VucGFjayhib2R5LT5vYS5vX3ZhbGlkJk9CRF9NRF9GTEZMQUdTID8KKwkJY2tzdW1fdHlwZSA9IGNrc3VtX3R5cGVfdW5wYWNrKGJvZHktPm9hLm9fdmFsaWQgJgorCQkJCQkgICAgICAgT0JEX01EX0ZMRkxBR1MgPwogCQkJCQkgICAgICAgYm9keS0+b2Eub19mbGFncyA6IDApOwogCQljbGllbnRfY2tzdW0gPSBvc2NfY2hlY2tzdW1fYnVsayhyYywgYWEtPmFhX3BhZ2VfY291bnQsCiAJCQkJCQkgYWEtPmFhX3BwZ2EsIE9TVF9SRUFELApAQCAtMTc5NCw3ICsxNzMwLDggQEAKIAogCQlpZiAobHVzdHJlX21zZ19nZXRfb3BjKHJlcS0+cnFfcmVxbXNnKSA9PSBPU1RfV1JJVEUpIHsKIAkJCXN0cnVjdCBsb3Zfb2luZm8gKmxvaSA9IGNsMm9zYyhvYmopLT5vb19vaW5mbzsKLQkJCWxvZmZfdCBsYXN0X29mZiA9IGxhc3QtPm9hcF9jb3VudCArIGxhc3QtPm9hcF9vYmpfb2ZmOworCQkJbG9mZl90IGxhc3Rfb2ZmID0gbGFzdC0+b2FwX2NvdW50ICsgbGFzdC0+b2FwX29ial9vZmYgKworCQkJCQkgIGxhc3QtPm9hcF9wYWdlX29mZjsKIAogCQkJLyogQ2hhbmdlIGZpbGUgc2l6ZSBpZiB0aGlzIGlzIGFuIG91dCBvZiBxdW90YSBvcgogCQkJICogZGlyZWN0IElPIHdyaXRlIGFuZCBpdCBleHRlbmRzIHRoZSBmaWxlIHNpemUKQEAgLTE4MTIsMTEgKzE3NDksMTQgQEAKIAkJfQogCiAJCWlmICh2YWxpZCAhPSAwKQotCQkJY2xfb2JqZWN0X2F0dHJfc2V0KGVudiwgb2JqLCBhdHRyLCB2YWxpZCk7CisJCQljbF9vYmplY3RfYXR0cl91cGRhdGUoZW52LCBvYmosIGF0dHIsIHZhbGlkKTsKIAkJY2xfb2JqZWN0X2F0dHJfdW5sb2NrKG9iaik7CiAJfQogCWttZW1fY2FjaGVfZnJlZShvYmRvX2NhY2hlcCwgYWEtPmFhX29hKTsKIAorCWlmIChsdXN0cmVfbXNnX2dldF9vcGMocmVxLT5ycV9yZXFtc2cpID09IE9TVF9XUklURSAmJiByYyA9PSAwKQorCQlvc2NfaW5jX3Vuc3RhYmxlX3BhZ2VzKHJlcSk7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXh0LCB0bXAsICZhYS0+YWFfZXh0cywgb2VfbGluaykgewogCQlsaXN0X2RlbF9pbml0KCZleHQtPm9lX2xpbmspOwogCQlvc2NfZXh0ZW50X2ZpbmlzaChlbnYsIGV4dCwgMSwgcmMpOwpAQCAtMTg0NywyMSArMTc4NywyMSBAQAogCiBzdGF0aWMgdm9pZCBicndfY29tbWl0KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQogewotCXNwaW5fbG9jaygmcmVxLT5ycV9sb2NrKTsKIAkvKgogCSAqIElmIG9zY19pbmNfdW5zdGFibGVfcGFnZXMgKHZpYSBvc2NfZXh0ZW50X2ZpbmlzaCkgcmFjZXMgd2l0aAogCSAqIHRoaXMgY2FsbGVkIHZpYSB0aGUgcnFfY29tbWl0X2NiLCBJIG5lZWQgdG8gZW5zdXJlCiAJICogb3NjX2RlY191bnN0YWJsZV9wYWdlcyBpcyBzdGlsbCBjYWxsZWQuIE90aGVyd2lzZSB1bnN0YWJsZQogCSAqIHBhZ2VzIG1heSBiZSBsZWFrZWQuCiAJICovCi0JaWYgKHJlcS0+cnFfdW5zdGFibGUpIHsKKwlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CisJaWYgKHVubGlrZWx5KHJlcS0+cnFfdW5zdGFibGUpKSB7CisJCXJlcS0+cnFfdW5zdGFibGUgPSAwOwogCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKIAkJb3NjX2RlY191bnN0YWJsZV9wYWdlcyhyZXEpOwotCQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CiAJfSBlbHNlIHsKIAkJcmVxLT5ycV9jb21taXR0ZWQgPSAxOworCQlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CiB9CiAKIC8qKgpAQCAtMTg4MSwxMyArMTgyMSwxMyBAQAogCXN0cnVjdCBvc2NfYXN5bmNfcGFnZSAqdG1wOwogCXN0cnVjdCBjbF9yZXEgKmNsZXJxID0gTlVMTDsKIAllbnVtIGNsX3JlcV90eXBlIGNydCA9IChjbWQgJiBPQkRfQlJXX1dSSVRFKSA/IENSVF9XUklURSA6IENSVF9SRUFEOwotCXN0cnVjdCBsZGxtX2xvY2sgKmxvY2sgPSBOVUxMOwogCXN0cnVjdCBjbF9yZXFfYXR0ciAqY3JhdHRyID0gTlVMTDsKIAl1NjQgc3RhcnRpbmdfb2Zmc2V0ID0gT0JEX09CSkVDVF9FT0Y7CiAJdTY0IGVuZGluZ19vZmZzZXQgPSAwOwogCWludCBtcGZsYWcgPSAwOwogCWludCBtZW1fdGlnaHQgPSAwOwogCWludCBwYWdlX2NvdW50ID0gMDsKKwlib29sIHNvZnRfc3luYyA9IGZhbHNlOwogCWludCBpOwogCWludCByYzsKIAlzdHJ1Y3Qgb3N0X2JvZHkgKmJvZHk7CkBAIC0xOTE1LDYgKzE4NTUsNyBAQAogCQl9CiAJfQogCisJc29mdF9zeW5jID0gb3NjX292ZXJfdW5zdGFibGVfc29mdF9saW1pdChjbGkpOwogCWlmIChtZW1fdGlnaHQpCiAJCW1wZmxhZyA9IGNmc19tZW1vcnlfcHJlc3N1cmVfZ2V0X2FuZF9zZXQoKTsKIApAQCAtMTk0NywxMCArMTg4OCwxMSBAQAogCQkJCXJjID0gUFRSX0VSUihjbGVycSk7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlsb2NrID0gb2FwLT5vYXBfbGRsbV9sb2NrOwogCQl9CiAJCWlmIChtZW1fdGlnaHQpCiAJCQlvYXAtPm9hcF9icndfZmxhZ3MgfD0gT0JEX0JSV19NRU1BTExPQzsKKwkJaWYgKHNvZnRfc3luYykKKwkJCW9hcC0+b2FwX2Jyd19mbGFncyB8PSBPQkRfQlJXX1NPRlRfU1lOQzsKIAkJcGdhW2ldID0gJm9hcC0+b2FwX2Jyd19wYWdlOwogCQlwZ2FbaV0tPm9mZiA9IG9hcC0+b2FwX29ial9vZmYgKyBvYXAtPm9hcF9wYWdlX29mZjsKIAkJQ0RFQlVHKDAsICJwdXQgcGFnZSAlcCBpbmRleCAlbHUgb2FwICVwIGZsZyAleCB0byBwZ2FcbiIsCkBAIC0xOTY0LDEwICsxOTA2LDYgQEAKIAlMQVNTRVJUKGNsZXJxKTsKIAljcmF0dHItPmNyYV9vYSA9IG9hOwogCWNsX3JlcV9hdHRyX3NldChlbnYsIGNsZXJxLCBjcmF0dHIsIH4wVUxMKTsKLQlpZiAobG9jaykgewotCQlvYS0+b19oYW5kbGUgPSBsb2NrLT5sX3JlbW90ZV9oYW5kbGU7Ci0JCW9hLT5vX3ZhbGlkIHw9IE9CRF9NRF9GTEhBTkRMRTsKLQl9CiAKIAlyYyA9IGNsX3JlcV9wcmVwKGVudiwgY2xlcnEpOwogCWlmIChyYyAhPSAwKSB7CkBAIC0xOTk4LDcgKzE5MzYsNyBAQAogCWJvZHkgPSByZXFfY2Fwc3VsZV9jbGllbnRfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfT1NUX0JPRFkpOwogCWNyYXR0ci0+Y3JhX29hID0gJmJvZHktPm9hOwogCWNsX3JlcV9hdHRyX3NldChlbnYsIGNsZXJxLCBjcmF0dHIsCi0JCQlPQkRfTURfRkxNVElNRXxPQkRfTURfRkxDVElNRXxPQkRfTURfRkxBVElNRSk7CisJCQlPQkRfTURfRkxNVElNRSB8IE9CRF9NRF9GTENUSU1FIHwgT0JEX01EX0ZMQVRJTUUpOwogCiAJbHVzdHJlX21zZ19zZXRfam9iaWQocmVxLT5ycV9yZXFtc2csIGNyYXR0ci0+Y3JhX2pvYmlkKTsKIApAQCAtMjA0NCw3ICsxOTgyLDcgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7CiAKLQlERUJVR19SRVEoRF9JTk9ERSwgcmVxLCAiJWQgcGFnZXMsIGFhICVwLiBub3cgJWRyLyVkdyBpbiBmbGlnaHQiLAorCURFQlVHX1JFUShEX0lOT0RFLCByZXEsICIlZCBwYWdlcywgYWEgJXAuIG5vdyAldXIvJWR3IGluIGZsaWdodCIsCiAJCSAgcGFnZV9jb3VudCwgYWEsIGNsaS0+Y2xfcl9pbl9mbGlnaHQsCiAJCSAgY2xpLT5jbF93X2luX2ZsaWdodCk7CiAKQEAgLTIxMTYsMjcgKzIwNTQsNiBAQAogCXJldHVybiBzZXQ7CiB9CiAKLS8qIGZpbmQgYW55IGxkbG0gbG9jayBvZiB0aGUgaW5vZGUgaW4gb3NjCi0gKiByZXR1cm4gMCAgICBub3QgZmluZAotICoJMSAgICBmaW5kIG9uZQotICogICAgICA8IDAgICAgZXJyb3IKLSAqLwotc3RhdGljIGludCBvc2NfZmluZF9jYmRhdGEoc3RydWN0IG9iZF9leHBvcnQgKmV4cCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKLQkJCSAgIGxkbG1faXRlcmF0b3JfdCByZXBsYWNlLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBsZGxtX3Jlc19pZCByZXNfaWQ7Ci0Jc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGNsYXNzX2V4cDJvYmQoZXhwKTsKLQlpbnQgcmMgPSAwOwotCi0Jb3N0aWRfYnVpbGRfcmVzX25hbWUoJmxzbS0+bHNtX29pLCAmcmVzX2lkKTsKLQlyYyA9IGxkbG1fcmVzb3VyY2VfaXRlcmF0ZShvYmQtPm9iZF9uYW1lc3BhY2UsICZyZXNfaWQsIHJlcGxhY2UsIGRhdGEpOwotCWlmIChyYyA9PSBMRExNX0lURVJfU1RPUCkKLQkJcmV0dXJuIDE7Ci0JaWYgKHJjID09IExETE1fSVRFUl9DT05USU5VRSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IG9zY19lbnF1ZXVlX2Zpbmkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCiAJCQkgICAgb3NjX2VucXVldWVfdXBjYWxsX2YgdXBjYWxsLCB2b2lkICpjb29raWUsCiAJCQkgICAgc3RydWN0IGx1c3RyZV9oYW5kbGUgKmxvY2toLCBlbnVtIGxkbG1fbW9kZSBtb2RlLApAQCAtMjU4Niw3MSArMjUwMyw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0vKiBSZXRyaWV2ZSBvYmplY3Qgc3RyaXBpbmcgaW5mb3JtYXRpb24uCi0gKgotICogQGxtbXUgaXMgYSBwb2ludGVyIHRvIGFuIGluLWNvcmUgc3RydWN0IHdpdGggbG1tX29zdF9jb3VudCBpbmRpY2F0aW5nCi0gKiB0aGUgbWF4aW11bSBudW1iZXIgb2YgT1NUIGluZGljZXMgd2hpY2ggd2lsbCBmaXQgaW4gdGhlIHVzZXIgYnVmZmVyLgotICogbG1tX21hZ2ljIG11c3QgYmUgTE9WX01BR0lDICh3ZSBvbmx5IHVzZSAxIHNsb3QgaGVyZSkuCi0gKi8KLXN0YXRpYyBpbnQgb3NjX2dldHN0cmlwZShzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAotCQkJIHN0cnVjdCBsb3ZfdXNlcl9tZCBfX3VzZXIgKmx1bXApCi17Ci0JLyogd2UgdXNlIGxvdl91c2VyX21kX3YzIGJlY2F1c2UgaXQgaXMgbGFyZ2VyIHRoYW4gbG92X3VzZXJfbWRfdjEgKi8KLQlzdHJ1Y3QgbG92X3VzZXJfbWRfdjMgbHVtLCAqbHVtazsKLQlzdHJ1Y3QgbG92X3VzZXJfb3N0X2RhdGFfdjEgKmxtbV9vYmplY3RzOwotCWludCByYyA9IDAsIGx1bV9zaXplOwotCi0JaWYgKCFsc20pCi0JCXJldHVybiAtRU5PREFUQTsKLQotCS8qIHdlIG9ubHkgbmVlZCB0aGUgaGVhZGVyIHBhcnQgZnJvbSB1c2VyIHNwYWNlIHRvIGdldCBsbW1fbWFnaWMgYW5kCi0JICogbG1tX3N0cmlwZV9jb3VudCwgKHRoZSBoZWFkZXIgcGFydCBpcyBjb21tb24gdG8gdjEgYW5kIHYzKQotCSAqLwotCWx1bV9zaXplID0gc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZsdW0sIGx1bXAsIGx1bV9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoKGx1bS5sbW1fbWFnaWMgIT0gTE9WX1VTRVJfTUFHSUNfVjEpICYmCi0JICAgIChsdW0ubG1tX21hZ2ljICE9IExPVl9VU0VSX01BR0lDX1YzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBsb3ZfdXNlcl9tZF92WCBhbmQgbG92X21kc19tZF92WCBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSAqLwotCUxBU1NFUlQoc2l6ZW9mKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSkgPT0gc2l6ZW9mKHN0cnVjdCBsb3ZfbWRzX21kX3YxKSk7Ci0JTEFTU0VSVChzaXplb2Yoc3RydWN0IGxvdl91c2VyX21kX3YzKSA9PSBzaXplb2Yoc3RydWN0IGxvdl9tZHNfbWRfdjMpKTsKLQlMQVNTRVJUKHNpemVvZihsdW0ubG1tX29iamVjdHNbMF0pID09IHNpemVvZihsdW1rLT5sbW1fb2JqZWN0c1swXSkpOwotCi0JLyogd2UgY2FuIHVzZSBsb3ZfbWRzX21kX3NpemUoKSB0byBjb21wdXRlIGx1bV9zaXplCi0JICogYmVjYXVzZSBsb3ZfdXNlcl9tZF92WCBhbmQgbG92X21kc19tZF92WCBoYXZlIHRoZSBzYW1lIHNpemUKLQkgKi8KLQlpZiAobHVtLmxtbV9zdHJpcGVfY291bnQgPiAwKSB7Ci0JCWx1bV9zaXplID0gbG92X21kc19tZF9zaXplKGx1bS5sbW1fc3RyaXBlX2NvdW50LCBsdW0ubG1tX21hZ2ljKTsKLQkJbHVtayA9IGt6YWxsb2MobHVtX3NpemUsIEdGUF9OT0ZTKTsKLQkJaWYgKCFsdW1rKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJaWYgKGx1bS5sbW1fbWFnaWMgPT0gTE9WX1VTRVJfTUFHSUNfVjEpCi0JCQlsbW1fb2JqZWN0cyA9Ci0JCQkgICAgJigoKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSAqKWx1bWspLT5sbW1fb2JqZWN0c1swXSk7Ci0JCWVsc2UKLQkJCWxtbV9vYmplY3RzID0gJihsdW1rLT5sbW1fb2JqZWN0c1swXSk7Ci0JCWxtbV9vYmplY3RzLT5sX29zdF9vaSA9IGxzbS0+bHNtX29pOwotCX0gZWxzZSB7Ci0JCWx1bV9zaXplID0gbG92X21kc19tZF9zaXplKDAsIGx1bS5sbW1fbWFnaWMpOwotCQlsdW1rID0gJmx1bTsKLQl9Ci0KLQlsdW1rLT5sbW1fb2kgPSBsc20tPmxzbV9vaTsKLQlsdW1rLT5sbW1fc3RyaXBlX2NvdW50ID0gMTsKLQotCWlmIChjb3B5X3RvX3VzZXIobHVtcCwgbHVtaywgbHVtX3NpemUpKQotCQlyYyA9IC1FRkFVTFQ7Ci0KLQlpZiAobHVtayAhPSAmbHVtKQotCQlrZnJlZShsdW1rKTsKLQotCXJldHVybiByYzsKLX0KLQogc3RhdGljIGludCBvc2NfaW9jb250cm9sKHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGludCBsZW4sCiAJCQkgdm9pZCAqa2FyZywgdm9pZCBfX3VzZXIgKnVhcmcpCiB7CkBAIC0yNjY0LDU3ICsyNTE2LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBPQkRfSU9DX0xPVl9HRVRfQ09ORklHOiB7Ci0JCWNoYXIgKmJ1ZjsKLQkJc3RydWN0IGxvdl9kZXNjICpkZXNjOwotCQlzdHJ1Y3Qgb2JkX3V1aWQgdXVpZDsKLQotCQlidWYgPSBOVUxMOwotCQlsZW4gPSAwOwotCQlpZiAob2JkX2lvY3RsX2dldGRhdGEoJmJ1ZiwgJmxlbiwgdWFyZykpIHsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWRhdGEgPSAoc3RydWN0IG9iZF9pb2N0bF9kYXRhICopYnVmOwotCi0JCWlmIChzaXplb2YoKmRlc2MpID4gZGF0YS0+aW9jX2lubGxlbjEpIHsKLQkJCW9iZF9pb2N0bF9mcmVlZGF0YShidWYsIGxlbik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoZGF0YS0+aW9jX2lubGxlbjIgPCBzaXplb2YodXVpZCkpIHsKLQkJCW9iZF9pb2N0bF9mcmVlZGF0YShidWYsIGxlbik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlkZXNjID0gKHN0cnVjdCBsb3ZfZGVzYyAqKWRhdGEtPmlvY19pbmxidWYxOwotCQlkZXNjLT5sZF90Z3RfY291bnQgPSAxOwotCQlkZXNjLT5sZF9hY3RpdmVfdGd0X2NvdW50ID0gMTsKLQkJZGVzYy0+bGRfZGVmYXVsdF9zdHJpcGVfY291bnQgPSAxOwotCQlkZXNjLT5sZF9kZWZhdWx0X3N0cmlwZV9zaXplID0gMDsKLQkJZGVzYy0+bGRfZGVmYXVsdF9zdHJpcGVfb2Zmc2V0ID0gMDsKLQkJZGVzYy0+bGRfcGF0dGVybiA9IDA7Ci0JCW1lbWNweSgmZGVzYy0+bGRfdXVpZCwgJm9iZC0+b2JkX3V1aWQsIHNpemVvZih1dWlkKSk7Ci0KLQkJbWVtY3B5KGRhdGEtPmlvY19pbmxidWYyLCAmb2JkLT5vYmRfdXVpZCwgc2l6ZW9mKHV1aWQpKTsKLQotCQllcnIgPSBjb3B5X3RvX3VzZXIodWFyZywgYnVmLCBsZW4pOwotCQlpZiAoZXJyKQotCQkJZXJyID0gLUVGQVVMVDsKLQkJb2JkX2lvY3RsX2ZyZWVkYXRhKGJ1ZiwgbGVuKTsKLQkJZ290byBvdXQ7Ci0JfQotCWNhc2UgTExfSU9DX0xPVl9TRVRTVFJJUEU6Ci0JCWVyciA9IG9iZF9hbGxvY19tZW1tZChleHAsIGthcmcpOwotCQlpZiAoZXJyID4gMCkKLQkJCWVyciA9IDA7Ci0JCWdvdG8gb3V0OwotCWNhc2UgTExfSU9DX0xPVl9HRVRTVFJJUEU6Ci0JCWVyciA9IG9zY19nZXRzdHJpcGUoa2FyZywgdWFyZyk7Ci0JCWdvdG8gb3V0OwogCWNhc2UgT0JEX0lPQ19DTElFTlRfUkVDT1ZFUjoKIAkJZXJyID0gcHRscnBjX3JlY292ZXJfaW1wb3J0KG9iZC0+dS5jbGkuY2xfaW1wb3J0LAogCQkJCQkgICAgZGF0YS0+aW9jX2lubGJ1ZjEsIDApOwpAQCAtMjc0OSw1MSArMjU1MCw3IEBACiAJaWYgKCF2YWxsZW4gfHwgIXZhbCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAoS0VZX0lTKEtFWV9MT0NLX1RPX1NUUklQRSkpIHsKLQkJX191MzIgKnN0cmlwZSA9IHZhbDsKLQkJKnZhbGxlbiA9IHNpemVvZigqc3RyaXBlKTsKLQkJKnN0cmlwZSA9IDA7Ci0JCXJldHVybiAwOwotCX0gZWxzZSBpZiAoS0VZX0lTKEtFWV9MQVNUX0lEKSkgewotCQlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcTsKLQkJdTY0ICpyZXBseTsKLQkJY2hhciAqdG1wOwotCQlpbnQgcmM7Ci0KLQkJcmVxID0gcHRscnBjX3JlcXVlc3RfYWxsb2MoY2xhc3NfZXhwMmNsaWltcChleHApLAotCQkJCQkgICAmUlFGX09TVF9HRVRfSU5GT19MQVNUX0lEKTsKLQkJaWYgKCFyZXEpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlyZXFfY2Fwc3VsZV9zZXRfc2l6ZSgmcmVxLT5ycV9waWxsLCAmUk1GX1NFVElORk9fS0VZLAotCQkJCSAgICAgUkNMX0NMSUVOVCwga2V5bGVuKTsKLQkJcmMgPSBwdGxycGNfcmVxdWVzdF9wYWNrKHJlcSwgTFVTVFJFX09TVF9WRVJTSU9OLCBPU1RfR0VUX0lORk8pOwotCQlpZiAocmMpIHsKLQkJCXB0bHJwY19yZXF1ZXN0X2ZyZWUocmVxKTsKLQkJCXJldHVybiByYzsKLQkJfQotCi0JCXRtcCA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9TRVRJTkZPX0tFWSk7Ci0JCW1lbWNweSh0bXAsIGtleSwga2V5bGVuKTsKLQotCQlyZXEtPnJxX25vX2RlbGF5ID0gMTsKLQkJcmVxLT5ycV9ub19yZXNlbmQgPSAxOwotCQlwdGxycGNfcmVxdWVzdF9zZXRfcmVwbGVuKHJlcSk7Ci0JCXJjID0gcHRscnBjX3F1ZXVlX3dhaXQocmVxKTsKLQkJaWYgKHJjKQotCQkJZ290byBvdXQ7Ci0KLQkJcmVwbHkgPSByZXFfY2Fwc3VsZV9zZXJ2ZXJfZ2V0KCZyZXEtPnJxX3BpbGwsICZSTUZfT0JEX0lEKTsKLQkJaWYgKCFyZXBseSkgewotCQkJcmMgPSAtRVBST1RPOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQkqKCh1NjQgKil2YWwpID0gKnJlcGx5Owotb3V0OgotCQlwdGxycGNfcmVxX2ZpbmlzaGVkKHJlcSk7Ci0JCXJldHVybiByYzsKLQl9IGVsc2UgaWYgKEtFWV9JUyhLRVlfRklFTUFQKSkgeworCWlmIChLRVlfSVMoS0VZX0ZJRU1BUCkpIHsKIAkJc3RydWN0IGxsX2ZpZW1hcF9pbmZvX2tleSAqZm1fa2V5ID0ga2V5OwogCQlzdHJ1Y3QgbGRsbV9yZXNfaWQgcmVzX2lkOwogCQlsZGxtX3BvbGljeV9kYXRhX3QgcG9saWN5OwpAQCAtMjkzMSwxMSArMjY4OCwxMSBAQAogCiAJaWYgKEtFWV9JUyhLRVlfQ0FDSEVfTFJVX1NIUklOSykpIHsKIAkJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZvYmQtPnUuY2xpOwotCQlpbnQgbnIgPSBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPj4gMTsKLQkJaW50IHRhcmdldCA9ICooaW50ICopdmFsOworCQlsb25nIG5yID0gYXRvbWljX2xvbmdfcmVhZCgmY2xpLT5jbF9scnVfaW5fbGlzdCkgPj4gMTsKKwkJbG9uZyB0YXJnZXQgPSAqKGxvbmcgKil2YWw7CiAKIAkJbnIgPSBvc2NfbHJ1X3NocmluayhlbnYsIGNsaSwgbWluKG5yLCB0YXJnZXQpLCB0cnVlKTsKLQkJKihpbnQgKil2YWwgLT0gbnI7CisJCSoobG9uZyAqKXZhbCAtPSBucjsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zMDE0LDggKzI3NzEsOSBAQAogCQlsb25nIGxvc3RfZ3JhbnQ7CiAKIAkJc3Bpbl9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCQlkYXRhLT5vY2RfZ3JhbnQgPSAoY2xpLT5jbF9hdmFpbF9ncmFudCArIGNsaS0+Y2xfZGlydHkpID86Ci0JCQkJMiAqIGNsaV9icndfc2l6ZShvYmQpOworCQlkYXRhLT5vY2RfZ3JhbnQgPSAoY2xpLT5jbF9hdmFpbF9ncmFudCArCisJCQkJICAgKGNsaS0+Y2xfZGlydHlfcGFnZXMgPDwgUEFHRV9TSElGVCkpID86CisJCQkJICAgMiAqIGNsaV9icndfc2l6ZShvYmQpOwogCQlsb3N0X2dyYW50ID0gY2xpLT5jbF9sb3N0X2dyYW50OwogCQljbGktPmNsX2xvc3RfZ3JhbnQgPSAwOwogCQlzcGluX3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKQEAgLTMzNDYsNyArMzEwNCw2IEBACiAJLmRpc2Nvbm5lY3QgICAgID0gb3NjX2Rpc2Nvbm5lY3QsCiAJLnN0YXRmcyAgICAgICAgID0gb3NjX3N0YXRmcywKIAkuc3RhdGZzX2FzeW5jICAgPSBvc2Nfc3RhdGZzX2FzeW5jLAotCS5wYWNrbWQgICAgICAgICA9IG9zY19wYWNrbWQsCiAJLnVucGFja21kICAgICAgID0gb3NjX3VucGFja21kLAogCS5jcmVhdGUgICAgICAgICA9IG9zY19jcmVhdGUsCiAJLmRlc3Ryb3kgICAgICAgID0gb3NjX2Rlc3Ryb3ksCkBAIC0zMzU0LDcgKzMxMTEsNiBAQAogCS5nZXRhdHRyX2FzeW5jICA9IG9zY19nZXRhdHRyX2FzeW5jLAogCS5zZXRhdHRyICAgICAgICA9IG9zY19zZXRhdHRyLAogCS5zZXRhdHRyX2FzeW5jICA9IG9zY19zZXRhdHRyX2FzeW5jLAotCS5maW5kX2NiZGF0YSAgICA9IG9zY19maW5kX2NiZGF0YSwKIAkuaW9jb250cm9sICAgICAgPSBvc2NfaW9jb250cm9sLAogCS5nZXRfaW5mbyAgICAgICA9IG9zY19nZXRfaW5mbywKIAkuc2V0X2luZm9fYXN5bmMgPSBvc2Nfc2V0X2luZm9fYXN5bmMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY2xpZW50LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY2xpZW50LmMKaW5kZXggZDQ0NjNkNy4uOGM1MWQ1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2NsaWVudC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jbGllbnQuYwpAQCAtNDUsNiArNDUsNyBAQAogCiBzdGF0aWMgaW50IHB0bHJwY19zZW5kX25ld19yZXEoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOwogc3RhdGljIGludCBwdGxycGNkX2NoZWNrX3dvcmsoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpOworc3RhdGljIGludCBwdGxycGNfdW5yZWdpc3Rlcl9yZXBseShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QsIGludCBhc3luYyk7CiAKIC8qKgogICogSW5pdGlhbGl6ZSBwYXNzZWQgaW4gY2xpZW50IHN0cnVjdHVyZSBcYSBjbC4KQEAgLTg5LDcgKzkwLDYgQEAKIAogCXJldHVybiBjOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfdXVpZF90b19jb25uZWN0aW9uKTsKIAogLyoqCiAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBuZXcgYnVsayBkZXNjcmlwdG9yIG9uIHRoZSBzZW5kZXIuCkBAIC0yMDIsNyArMjAyLDcgQEAKIAogCWlmICh1bnBpbikgewogCQlmb3IgKGkgPSAwOyBpIDwgZGVzYy0+YmRfaW92X2NvdW50OyBpKyspCi0JCQlwdXRfcGFnZShkZXNjLT5iZF9pb3ZbaV0ua2lvdl9wYWdlKTsKKwkJCXB1dF9wYWdlKGRlc2MtPmJkX2lvdltpXS5idl9wYWdlKTsKIAl9CiAKIAlrZnJlZShkZXNjKTsKQEAgLTI4Myw4ICsyODMsOCBAQAogfQogCiAvKiBBZGp1c3QgZXhwZWN0ZWQgbmV0d29yayBsYXRlbmN5ICovCi1zdGF0aWMgdm9pZCBwdGxycGNfYXRfYWRqX25ldF9sYXRlbmN5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBzZXJ2aWNlX3RpbWUpCit2b2lkIHB0bHJwY19hdF9hZGpfbmV0X2xhdGVuY3koc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHNlcnZpY2VfdGltZSkKIHsKIAl1bnNpZ25lZCBpbnQgbmwsIG9sZG5sOwogCXN0cnVjdCBpbXBfYXQgKmF0OwpAQCAtMzY0LDMxICszNjQsMzcgQEAKIAl9CiAKIAlyYyA9IHVucGFja19yZXBseShlYXJseV9yZXEpOwotCWlmIChyYyA9PSAwKSB7Ci0JCS8qIEV4cGVjdGluZyB0byBpbmNyZWFzZSB0aGUgc2VydmljZSB0aW1lIGVzdGltYXRlIGhlcmUgKi8KLQkJcHRscnBjX2F0X2Fkal9zZXJ2aWNlKHJlcSwKLQkJCWx1c3RyZV9tc2dfZ2V0X3RpbWVvdXQoZWFybHlfcmVxLT5ycV9yZXBtc2cpKTsKLQkJcHRscnBjX2F0X2Fkal9uZXRfbGF0ZW5jeShyZXEsCi0JCQlsdXN0cmVfbXNnX2dldF9zZXJ2aWNlX3RpbWUoZWFybHlfcmVxLT5ycV9yZXBtc2cpKTsKLQl9Ci0KLQlzcHRscnBjX2NsaV9maW5pc2hfZWFybHlfcmVwbHkoZWFybHlfcmVxKTsKLQotCWlmIChyYyAhPSAwKSB7CisJaWYgKHJjKSB7CisJCXNwdGxycGNfY2xpX2ZpbmlzaF9lYXJseV9yZXBseShlYXJseV9yZXEpOwogCQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7CiAJCXJldHVybiByYzsKIAl9CiAKLQkvKiBBZGp1c3QgdGhlIGxvY2FsIHRpbWVvdXQgZm9yIHRoaXMgcmVxICovCi0JcHRscnBjX2F0X3NldF9yZXFfdGltZW91dChyZXEpOworCS8qCisJICogVXNlIG5ldyB0aW1lb3V0IHZhbHVlIGp1c3QgdG8gYWRqdXN0IHRoZSBsb2NhbCB2YWx1ZSBmb3IgdGhpcworCSAqIHJlcXVlc3QsIGRvbid0IGluY2x1ZGUgaXQgaW50byBhdF9oaXN0b3J5LiBJdCBpcyB1bmNsZWFyIHlldCB3aHkKKwkgKiBzZXJ2aWNlIHRpbWUgaW5jcmVhc2VkIGFuZCBzaG91bGQgaXQgYmUgY291bnRlZCBvciBza2lwcGVkLCBlLmcuCisJICogdGhhdCBjYW4gYmUgcmVjb3ZlcnkgY2FzZSBvciBzb21lIGVycm9yIG9yIHNlcnZlciwgdGhlIHJlYWwgcmVwbHkKKwkgKiB3aWxsIGFkZCBhbGwgbmV3IGRhdGEgaWYgaXQgaXMgd29ydGggdG8gYWRkLgorCSAqLworCXJlcS0+cnFfdGltZW91dCA9IGx1c3RyZV9tc2dfZ2V0X3RpbWVvdXQoZWFybHlfcmVxLT5ycV9yZXBtc2cpOworCWx1c3RyZV9tc2dfc2V0X3RpbWVvdXQocmVxLT5ycV9yZXFtc2csIHJlcS0+cnFfdGltZW91dCk7CisKKwkvKiBOZXR3b3JrIGxhdGVuY3kgY2FuIGJlIGFkanVzdGVkLCBpdCBpcyBwdXJlIG5ldHdvcmsgZGVsYXlzICovCisJcHRscnBjX2F0X2Fkal9uZXRfbGF0ZW5jeShyZXEsCisJCQkJICBsdXN0cmVfbXNnX2dldF9zZXJ2aWNlX3RpbWUoZWFybHlfcmVxLT5ycV9yZXBtc2cpKTsKKworCXNwdGxycGNfY2xpX2ZpbmlzaF9lYXJseV9yZXBseShlYXJseV9yZXEpOwogCiAJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOwogCW9sZGRsID0gcmVxLT5ycV9kZWFkbGluZTsKIAkvKgotCSAqIHNlcnZlciBhc3N1bWVzIGl0IG5vdyBoYXMgcnFfdGltZW91dCBmcm9tIHdoZW4gaXQgc2VudCB0aGUKLQkgKiBlYXJseSByZXBseSwgc28gY2xpZW50IHNob3VsZCBnaXZlIGl0IGF0IGxlYXN0IHRoYXQgbG9uZy4KKwkgKiBzZXJ2ZXIgYXNzdW1lcyBpdCBub3cgaGFzIHJxX3RpbWVvdXQgZnJvbSB3aGVuIHRoZSByZXF1ZXN0CisJICogYXJyaXZlZCwgc28gdGhlIGNsaWVudCBzaG91bGQgZ2l2ZSBpdCBhdCBsZWFzdCB0aGF0IGxvbmcuCisJICogc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgYXJyaXZhbCB0aW1lIHdlJ2xsIHVzZSB0aGUgb3JpZ2luYWwKKwkgKiBzZW50IHRpbWUKIAkgKi8KLQlyZXEtPnJxX2RlYWRsaW5lID0ga3RpbWVfZ2V0X3JlYWxfc2Vjb25kcygpICsgcmVxLT5ycV90aW1lb3V0ICsKKwlyZXEtPnJxX2RlYWRsaW5lID0gcmVxLT5ycV9zZW50ICsgcmVxLT5ycV90aW1lb3V0ICsKIAkJCSAgIHB0bHJwY19hdF9nZXRfbmV0X2xhdGVuY3kocmVxKTsKIAogCURFQlVHX1JFUShEX0FEQVBUVE8sIHJlcSwKQEAgLTg4NCw3ICs4OTAsNiBAQAogCiAJcmV0dXJuIHNldDsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3ByZXBfZmNzZXQpOwogCiAvKioKICAqIFdpbmQgZG93biBhbmQgZnJlZSByZXF1ZXN0IHNldCBzdHJ1Y3R1cmUgcHJldmlvdXNseSBhbGxvY2F0ZWQgd2l0aApAQCAtMTAwNCw3ICsxMDA5LDYgQEAKIAkJCXdha2VfdXAoJnBjLT5wY19wYXJ0bmVyc1tpXS0+cGNfc2V0LT5zZXRfd2FpdHEpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3NldF9hZGRfbmV3X3JlcSk7CiAKIC8qKgogICogQmFzZWQgb24gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGltcG9ydCwgZGV0ZXJtaW5lIGlmIHRoZSByZXF1ZXN0CkBAIC0xMDM1LDggKzEwMzksOCBAQAogCQkqc3RhdHVzID0gLUVJTzsKIAl9IGVsc2UgaWYgKHB0bHJwY19zZW5kX2xpbWl0X2V4cGlyZWQocmVxKSkgewogCQkvKiBwcm9iYWJseSBkb2Vzbid0IG5lZWQgdG8gYmUgYSBEX0VSUk9SIGFmdGVyIGluaXRpYWwgdGVzdGluZyAqLwotCQlERUJVR19SRVEoRF9FUlJPUiwgcmVxLCAic2VuZCBsaW1pdCBleHBpcmVkICIpOwotCQkqc3RhdHVzID0gLUVJTzsKKwkJREVCVUdfUkVRKERfSEEsIHJlcSwgInNlbmQgbGltaXQgZXhwaXJlZCAiKTsKKwkJKnN0YXR1cyA9IC1FVElNRURPVVQ7CiAJfSBlbHNlIGlmIChyZXEtPnJxX3NlbmRfc3RhdGUgPT0gTFVTVFJFX0lNUF9DT05ORUNUSU5HICYmCiAJCSAgIGltcC0+aW1wX3N0YXRlID09IExVU1RSRV9JTVBfQ09OTkVDVElORykgewogCQkvKiBhbGxvdyBDT05ORUNUIGV2ZW4gaWYgaW1wb3J0IGlzIGludmFsaWQgKi8KQEAgLTEwNzMsMzYgKzEwNzcsNDIgQEAKIH0KIAogLyoqCi0gKiBEZWNpZGUgaWYgdGhlIGVycm9yIG1lc3NhZ2UgcmVnYXJkaW5nIHByb3ZpZGVkIHJlcXVlc3QgXGEgcmVxCi0gKiBzaG91bGQgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSBvciBub3QuCi0gKiBNYWtlcyBpdCdzIGRlY2lzaW9uIG9uIHJlcXVlc3Qgc3RhdHVzIGFuZCBvdGhlciBwcm9wZXJ0aWVzLgotICogUmV0dXJucyAxIHRvIHByaW50IGVycm9yIG9uIHRoZSBzeXN0ZW0gY29uc29sZSBvciAwIGlmIG5vdC4KKyAqIERlY2lkZSBpZiB0aGUgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSBvciBub3QuCisgKiBNYWtlcyBpdHMgZGVjaXNpb24gYmFzZWQgb24gcmVxdWVzdCB0eXBlLCBzdGF0dXMsIGFuZCBmYWlsdXJlIGZyZXF1ZW5jeS4KKyAqCisgKiBccGFyYW1baW5dIHJlcSAgcmVxdWVzdCB0aGF0IGZhaWxlZCBhbmQgbWF5IG5lZWQgYSBjb25zb2xlIG1lc3NhZ2UKKyAqCisgKiBccmV0dmFsIGZhbHNlIGlmIG5vIG1lc3NhZ2Ugc2hvdWxkIGJlIHByaW50ZWQKKyAqIFxyZXR2YWwgdHJ1ZSAgaWYgY29uc29sZSBtZXNzYWdlIHNob3VsZCBiZSBwcmludGVkCiAgKi8KLXN0YXRpYyBpbnQgcHRscnBjX2NvbnNvbGVfYWxsb3coc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCitzdGF0aWMgYm9vbCBwdGxycGNfY29uc29sZV9hbGxvdyhzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKIHsKIAlfX3UzMiBvcGM7Ci0JaW50IGVycjsKIAogCUxBU1NFUlQocmVxLT5ycV9yZXFtc2cpOwogCW9wYyA9IGx1c3RyZV9tc2dfZ2V0X29wYyhyZXEtPnJxX3JlcW1zZyk7CiAKLQkvKgotCSAqIFN1cHByZXNzIHBhcnRpY3VsYXIgcmVjb25uZWN0IGVycm9ycyB3aGljaCBhcmUgdG8gYmUgZXhwZWN0ZWQuICBObwotCSAqIGVycm9ycyBhcmUgc3VwcHJlc3NlZCBmb3IgdGhlIGluaXRpYWwgY29ubmVjdGlvbiBvbiBhbiBpbXBvcnQKLQkgKi8KLQlpZiAoKGx1c3RyZV9oYW5kbGVfaXNfdXNlZCgmcmVxLT5ycV9pbXBvcnQtPmltcF9yZW1vdGVfaGFuZGxlKSkgJiYKLQkgICAgKG9wYyA9PSBPU1RfQ09OTkVDVCB8fCBvcGMgPT0gTURTX0NPTk5FQ1QgfHwgb3BjID09IE1HU19DT05ORUNUKSkgewotCQkvKiBTdXBwcmVzcyB0aW1lZCBvdXQgcmVjb25uZWN0IHJlcXVlc3RzICovCi0JCWlmIChyZXEtPnJxX3RpbWVkb3V0KQotCQkJcmV0dXJuIDA7CisJLyogU3VwcHJlc3MgcGFydGljdWxhciByZWNvbm5lY3QgZXJyb3JzIHdoaWNoIGFyZSB0byBiZSBleHBlY3RlZC4gKi8KKwlpZiAob3BjID09IE9TVF9DT05ORUNUIHx8IG9wYyA9PSBNRFNfQ09OTkVDVCB8fCBvcGMgPT0gTUdTX0NPTk5FQ1QpIHsKKwkJaW50IGVycjsKIAotCQkvKiBTdXBwcmVzcyB1bmF2YWlsYWJsZS9hZ2FpbiByZWNvbm5lY3QgcmVxdWVzdHMgKi8KKwkJLyogU3VwcHJlc3MgdGltZWQgb3V0IHJlY29ubmVjdCByZXF1ZXN0cyAqLworCQlpZiAobHVzdHJlX2hhbmRsZV9pc191c2VkKCZyZXEtPnJxX2ltcG9ydC0+aW1wX3JlbW90ZV9oYW5kbGUpIHx8CisJCSAgICByZXEtPnJxX3RpbWVkb3V0KQorCQkJcmV0dXJuIGZhbHNlOworCisJCS8qCisJCSAqIFN1cHByZXNzIG1vc3QgdW5hdmFpbGFibGUvYWdhaW4gcmVjb25uZWN0IHJlcXVlc3RzLCBidXQKKwkJICogcHJpbnQgb2NjYXNpb25hbGx5IHNvIGl0IGlzIGNsZWFyIGNsaWVudCBpcyB0cnlpbmcgdG8KKwkJICogY29ubmVjdCB0byBhIHNlcnZlciB3aGVyZSBubyB0YXJnZXQgaXMgcnVubmluZy4KKwkJICovCiAJCWVyciA9IGx1c3RyZV9tc2dfZ2V0X3N0YXR1cyhyZXEtPnJxX3JlcG1zZyk7Ci0JCWlmIChlcnIgPT0gLUVOT0RFViB8fCBlcnIgPT0gLUVBR0FJTikKLQkJCXJldHVybiAwOworCQlpZiAoKGVyciA9PSAtRU5PREVWIHx8IGVyciA9PSAtRUFHQUlOKSAmJgorCQkgICAgcmVxLT5ycV9pbXBvcnQtPmltcF9jb25uX2NudCAlIDMwICE9IDIwKQorCQkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXJldHVybiAxOworCXJldHVybiB0cnVlOwogfQogCiAvKioKQEAgLTExMTYsMTQgKzExMjYsMTQgQEAKIAllcnIgPSBsdXN0cmVfbXNnX2dldF9zdGF0dXMocmVxLT5ycV9yZXBtc2cpOwogCWlmIChsdXN0cmVfbXNnX2dldF90eXBlKHJlcS0+cnFfcmVwbXNnKSA9PSBQVExfUlBDX01TR19FUlIpIHsKIAkJc3RydWN0IG9iZF9pbXBvcnQgKmltcCA9IHJlcS0+cnFfaW1wb3J0OworCQlsbmV0X25pZF90IG5pZCA9IGltcC0+aW1wX2Nvbm5lY3Rpb24tPmNfcGVlci5uaWQ7CiAJCV9fdTMyIG9wYyA9IGx1c3RyZV9tc2dfZ2V0X29wYyhyZXEtPnJxX3JlcW1zZyk7CiAKIAkJaWYgKHB0bHJwY19jb25zb2xlX2FsbG93KHJlcSkpCi0JCQlMQ09OU09MRV9FUlJPUl9NU0coMHgwMTEsICIlczogQ29tbXVuaWNhdGluZyB3aXRoICVzLCBvcGVyYXRpb24gJXMgZmFpbGVkIHdpdGggJWQuXG4iLAorCQkJTENPTlNPTEVfRVJST1JfTVNHKDB4MDExLCAiJXM6IG9wZXJhdGlvbiAlcyB0byBub2RlICVzIGZhaWxlZDogcmMgPSAlZFxuIiwKIAkJCQkJICAgaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSwKLQkJCQkJICAgbGliY2ZzX25pZDJzdHIoCi0JCQkJCQkgICBpbXAtPmltcF9jb25uZWN0aW9uLT5jX3BlZXIubmlkKSwKLQkJCQkJICAgbGxfb3Bjb2RlMnN0cihvcGMpLCBlcnIpOworCQkJCQkgICBsbF9vcGNvZGUyc3RyKG9wYyksCisJCQkJCSAgIGxpYmNmc19uaWQyc3RyKG5pZCksIGVycik7CiAJCXJldHVybiBlcnIgPCAwID8gZXJyIDogLUVJTlZBTDsKIAl9CiAKQEAgLTEyODAsNyArMTI5MCw3IEBACiAJCSAqIHNvbWUgcmVhc29uLiBUcnkgdG8gcmVjb25uZWN0LCBhbmQgaWYgdGhhdCBmYWlscywgcHVudCB0bwogCQkgKiB0aGUgdXBjYWxsLgogCQkgKi8KLQkJaWYgKGxsX3JwY19yZWNvdmVyYWJsZV9lcnJvcihyYykpIHsKKwkJaWYgKHB0bHJwY19yZWNvdmVyYWJsZV9lcnJvcihyYykpIHsKIAkJCWlmIChyZXEtPnJxX3NlbmRfc3RhdGUgIT0gTFVTVFJFX0lNUF9GVUxMIHx8CiAJCQkgICAgaW1wLT5pbXBfb2JkLT5vYmRfbm9fcmVjb3YgfHwgaW1wLT5pbXBfZGxtX2Zha2UpIHsKIAkJCQlyZXR1cm4gcmM7CkBAIC0xNjI4LDggKzE2MzgsMTAgQEAKIAkJCSAgICByZXEtPnJxX3dhaXRpbmcgfHwgcmVxLT5ycV93YWl0X2N0eCkgewogCQkJCWludCBzdGF0dXM7CiAKLQkJCQlpZiAoIXB0bHJwY191bnJlZ2lzdGVyX3JlcGx5KHJlcSwgMSkpCisJCQkJaWYgKCFwdGxycGNfdW5yZWdpc3Rlcl9yZXBseShyZXEsIDEpKSB7CisJCQkJCXB0bHJwY191bnJlZ2lzdGVyX2J1bGsocmVxLCAxKTsKIAkJCQkJY29udGludWU7CisJCQkJfQogCiAJCQkJc3Bpbl9sb2NrKCZpbXAtPmltcF9sb2NrKTsKIAkJCQlpZiAocHRscnBjX2ltcG9ydF9kZWxheV9yZXEoaW1wLCByZXEsCkBAIC0xOTk1LDcgKzIwMDcsNiBAQAogCSAqLwogCXJldHVybiAxOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfZXhwaXJlZF9zZXQpOwogCiAvKioKICAqIFNldHMgcnFfaW50ciBmbGFnIGluIFxhIHJlcSB1bmRlciBzcGlubG9jay4KQEAgLTIwMTIsNyArMjAyMyw3IEBACiAgKiBJbnRlcnJ1cHRzIChzZXRzIGludGVycnVwdGVkIGZsYWcpIGFsbCB1bmNvbXBsZXRlZCByZXF1ZXN0cyBpbgogICogYSBzZXQgXGEgZGF0YS4gQ2FsbGJhY2sgZm9yIGxfd2FpdF9ldmVudCBmb3IgaW50ZXJydXB0aWJsZSB3YWl0cy4KICAqLwotdm9pZCBwdGxycGNfaW50ZXJydXB0ZWRfc2V0KHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBwdGxycGNfaW50ZXJydXB0ZWRfc2V0KHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqc2V0ID0gZGF0YTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CkBAIC0yMDMwLDcgKzIwNDEsNiBAQAogCQlwdGxycGNfbWFya19pbnRlcnJ1cHRlZChyZXEpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2ludGVycnVwdGVkX3NldCk7CiAKIC8qKgogICogR2V0IHRoZSBzbWFsbGVzdCB0aW1lb3V0IGluIHRoZSBzZXQ7IHRoaXMgZG9lcyBOT1Qgc2V0IGEgdGltZW91dC4KQEAgLTIwNzQsNyArMjA4NCw2IEBACiAJfQogCXJldHVybiB0aW1lb3V0OwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfc2V0X25leHRfdGltZW91dCk7CiAKIC8qKgogICogU2VuZCBhbGwgdW5zZXQgcmVxdWVzdCBmcm9tIHRoZSBzZXQgYW5kIHRoZW4gd2FpdCB1bnRpbCBhbGwKQEAgLTIzMjUsNyArMjMzNCw3IEBACiAgKiBUaGUgcmVxdWVzdCBvd25lciAoaS5lLiB0aGUgdGhyZWFkIGRvaW5nIHRoZSBJL08pIG11c3QgY2FsbC4uLgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgMSBpZiB1bnJlZ2lzdGVyaW5nIGNhbm5vdCBiZSBtYWRlLgogICovCi1pbnQgcHRscnBjX3VucmVnaXN0ZXJfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgYXN5bmMpCitzdGF0aWMgaW50IHB0bHJwY191bnJlZ2lzdGVyX3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxdWVzdCwgaW50IGFzeW5jKQogewogCWludCByYzsKIAl3YWl0X3F1ZXVlX2hlYWRfdCAqd3E7CkBAIC0yMzkwLDcgKzIzOTksNiBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3VucmVnaXN0ZXJfcmVwbHkpOwogCiBzdGF0aWMgdm9pZCBwdGxycGNfZnJlZV9yZXF1ZXN0KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKQogewpAQCAtMjQ1MSw3ICsyNDU5LDggQEAKIAkgICAgICAgaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSwgaW1wLT5pbXBfcGVlcl9jb21taXR0ZWRfdHJhbnNubywKIAkgICAgICAgaW1wLT5pbXBfZ2VuZXJhdGlvbik7CiAKLQlpZiAoaW1wLT5pbXBfZ2VuZXJhdGlvbiAhPSBpbXAtPmltcF9sYXN0X2dlbmVyYXRpb25fY2hlY2tlZCkKKwlpZiAoaW1wLT5pbXBfZ2VuZXJhdGlvbiAhPSBpbXAtPmltcF9sYXN0X2dlbmVyYXRpb25fY2hlY2tlZCB8fAorCSAgICAhaW1wLT5pbXBfbGFzdF90cmFuc25vX2NoZWNrZWQpCiAJCXNraXBfY29tbWl0dGVkX2xpc3QgPSBmYWxzZTsKIAogCWltcC0+aW1wX2xhc3RfdHJhbnNub19jaGVja2VkID0gaW1wLT5pbXBfcGVlcl9jb21taXR0ZWRfdHJhbnNubzsKQEAgLTI0OTksNiArMjUwOCw5IEBACiAJCWlmIChyZXEtPnJxX2ltcG9ydF9nZW5lcmF0aW9uIDwgaW1wLT5pbXBfZ2VuZXJhdGlvbikgewogCQkJREVCVUdfUkVRKERfUlBDVFJBQ0UsIHJlcSwgImZyZWUgc3RhbGUgb3BlbiByZXF1ZXN0Iik7CiAJCQlwdGxycGNfZnJlZV9yZXF1ZXN0KHJlcSk7CisJCX0gZWxzZSBpZiAoIXJlcS0+cnFfcmVwbGF5KSB7CisJCQlERUJVR19SRVEoRF9SUENUUkFDRSwgcmVxLCAiZnJlZSBjbG9zZWQgb3BlbiByZXF1ZXN0Iik7CisJCQlwdGxycGNfZnJlZV9yZXF1ZXN0KHJlcSk7CiAJCX0KIAl9CiB9CkBAIC0yNTQxLDcgKzI1NTMsNiBAQAogCXB0bHJwY19jbGllbnRfd2FrZV9yZXEocmVxKTsKIAlzcGluX3VubG9jaygmcmVxLT5ycV9sb2NrKTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3Jlc2VuZF9yZXEpOwogCiAvKioKICAqIEdyYWIgYWRkaXRpb25hbCByZWZlcmVuY2Ugb24gYSByZXF1ZXN0IFxhIHJlcQpAQCAtMjYxMCw3ICsyNjIxLDYgQEAKIAogCWxpc3RfYWRkKCZyZXEtPnJxX3JlcGxheV9saXN0LCAmaW1wLT5pbXBfcmVwbGF5X2xpc3QpOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfcmV0YWluX3JlcGxheWFibGVfcmVxdWVzdCk7CiAKIC8qKgogICogU2VuZCByZXF1ZXN0IGFuZCB3YWl0IHVudGlsIGl0IGNvbXBsZXRlcy4KQEAgLTI3ODMsNyArMjc5Myw2IEBACiAJcHRscnBjZF9hZGRfcmVxKHJlcSk7CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19yZXBsYXlfcmVxKTsKIAogLyoqCiAgKiBBYm9ydHMgYWxsIGluLWZsaWdodCByZXF1ZXN0IG9uIGltcG9ydCBcYSBpbXAgc2VuZGluZyBhbmQgZGVsYXllZCBsaXN0cwpAQCAtMjg0Myw3ICsyODUyLDYgQEAKIAogCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2Fib3J0X2luZmxpZ2h0KTsKIAogLyoqCiAgKiBBYm9ydCBhbGwgdW5jb21wbGV0ZWQgcmVxdWVzdHMgaW4gcmVxdWVzdCBzZXQgXGEgc2V0CkBAIC0yOTI5LDcgKzI5MzcsNiBAQAogCiAJcmV0dXJuIG5leHQ7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19uZXh0X3hpZCk7CiAKIC8qKgogICogR2V0IGEgZ2xpbXBzZSBhdCB3aGF0IG5leHQgeGlkIHZhbHVlIG1pZ2h0IGhhdmUgYmVlbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jb25uZWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY29ubmVjdGlvbi5jCmluZGV4IDE3N2EzNzkuLjdiMDIwZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jb25uZWN0aW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2Nvbm5lY3Rpb24uYwpAQCAtODIsNyArODIsNiBAQAogCSAgICAgICBsaWJjZnNfbmlkMnN0cihjb25uLT5jX3BlZXIubmlkKSk7CiAJcmV0dXJuIGNvbm47CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19jb25uZWN0aW9uX2dldCk7CiAKIGludCBwdGxycGNfY29ubmVjdGlvbl9wdXQoc3RydWN0IHB0bHJwY19jb25uZWN0aW9uICpjb25uKQogewpAQCAtMTE4LDcgKzExNyw2IEBACiAKIAlyZXR1cm4gcmM7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19jb25uZWN0aW9uX3B1dCk7CiAKIHN0cnVjdCBwdGxycGNfY29ubmVjdGlvbiAqCiBwdGxycGNfY29ubmVjdGlvbl9hZGRyZWYoc3RydWN0IHB0bHJwY19jb25uZWN0aW9uICpjb25uKQpAQCAtMTMwLDcgKzEyOCw2IEBACiAKIAlyZXR1cm4gY29ubjsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2Nvbm5lY3Rpb25fYWRkcmVmKTsKIAogaW50IHB0bHJwY19jb25uZWN0aW9uX2luaXQodm9pZCkKIHsKQEAgLTE0NiwxMyArMTQzLDExIEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2Nvbm5lY3Rpb25faW5pdCk7CiAKIHZvaWQgcHRscnBjX2Nvbm5lY3Rpb25fZmluaSh2b2lkKQogewogCWNmc19oYXNoX3B1dHJlZihjb25uX2hhc2gpOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfY29ubmVjdGlvbl9maW5pKTsKIAogLyoKICAqIEhhc2ggb3BlcmF0aW9ucyBmb3IgbmV0X3BlZXI8LT5jb25uZWN0aW9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZXZlbnRzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvZXZlbnRzLmMKaW5kZXggYjFjZTcyNS4uMjgzZGZiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2V2ZW50cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ldmVudHMuYwpAQCAtNTQzLDcgKzU0Myw3IEBACiAJcmMgPSBMTmV0TklJbml0KHBpZCk7CiAJaWYgKHJjIDwgMCkgewogCQlDREVCVUcoRF9ORVQsICJDYW4ndCBpbml0IG5ldHdvcmsgaW50ZXJmYWNlOiAlZFxuIiwgcmMpOwotCQlyZXR1cm4gLUVOT0VOVDsKKwkJcmV0dXJuIHJjOwogCX0KIAogCS8qIENBVkVBVCBFTVBUT1I6IGhvdyB3ZSBwcm9jZXNzIHBvcnRhbHMgZXZlbnRzIGlzIF9yYWRpY2FsbHlfCkBAIC01NjEsNyArNTYxLDcgQEAKIAlDRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBldmVudCBxdWV1ZTogJWRcbiIsIHJjKTsKIAlMTmV0TklGaW5pKCk7CiAKLQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gcmM7CiB9CiAKIGludCBwdGxycGNfaW5pdF9wb3J0YWxzKHZvaWQpCkBAIC01NzAsNyArNTcwLDcgQEAKIAogCWlmIChyYyAhPSAwKSB7CiAJCUNFUlJPUigibmV0d29yayBpbml0aWFsaXNhdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHJjOwogCX0KIAlyYyA9IHB0bHJwY2RfYWRkcmVmKCk7CiAJaWYgKHJjID09IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMKaW5kZXggMzI5MmU2ZS4uYTIzZDBhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2ltcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9pbXBvcnQuYwpAQCAtMzA3LDcgKzMwNyw4IEBACiAJCSAqLwogCQlsd2kgPSBMV0lfVElNRU9VVF9JTlRFUlZBTCgKIAkJCWNmc190aW1lb3V0X2NhcChjZnNfdGltZV9zZWNvbmRzKHRpbWVvdXQpKSwKLQkJCSh0aW1lb3V0ID4gMSk/Y2ZzX3RpbWVfc2Vjb25kcygxKTpjZnNfdGltZV9zZWNvbmRzKDEpLzIsCisJCQkodGltZW91dCA+IDEpID8gY2ZzX3RpbWVfc2Vjb25kcygxKSA6CisJCQljZnNfdGltZV9zZWNvbmRzKDEpIC8gMiwKIAkJCU5VTEwsIE5VTEwpOwogCQlyYyA9IGxfd2FpdF9ldmVudChpbXAtPmltcF9yZWNvdmVyeV93YWl0cSwKIAkJCQkgIChhdG9taWNfcmVhZCgmaW1wLT5pbXBfaW5mbGlnaHQpID09IDApLApAQCAtNDI0LDcgKzQyNSw2IEBACiAJCXB0bHJwY19waW5nZXJfZm9yY2UoaW1wKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19mYWlsX2ltcG9ydCk7CiAKIGludCBwdGxycGNfcmVjb25uZWN0X2ltcG9ydChzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wKQogewpAQCAtNjk4LDcgKzY5OCw4IEBACiAJcmVxdWVzdC0+cnFfc2VuZF9zdGF0ZSA9IExVU1RSRV9JTVBfQ09OTkVDVElORzsKIAkvKiBBbGxvdyBhIHNsaWdodGx5IGxhcmdlciByZXBseSBmb3IgZnV0dXJlIGdyb3d0aCBjb21wYXRpYmlsaXR5ICovCiAJcmVxX2NhcHN1bGVfc2V0X3NpemUoJnJlcXVlc3QtPnJxX3BpbGwsICZSTUZfQ09OTkVDVF9EQVRBLCBSQ0xfU0VSVkVSLAotCQkJICAgICBzaXplb2Yoc3RydWN0IG9iZF9jb25uZWN0X2RhdGEpKzE2KnNpemVvZihfX3U2NCkpOworCQkJICAgICBzaXplb2Yoc3RydWN0IG9iZF9jb25uZWN0X2RhdGEpICsKKwkJCSAgICAgMTYgKiBzaXplb2YoX191NjQpKTsKIAlwdGxycGNfcmVxdWVzdF9zZXRfcmVwbGVuKHJlcXVlc3QpOwogCXJlcXVlc3QtPnJxX2ludGVycHJldF9yZXBseSA9IHB0bHJwY19jb25uZWN0X2ludGVycHJldDsKIApAQCAtNzUwLDYgKzc1MSwxNTMgQEAKIAlyZXR1cm4gKHJjID09IC1FQlVTWSkgfHwgKHJjID09IC1FQUdBSU4pOwogfQogCitzdGF0aWMgaW50IHB0bHJwY19jb25uZWN0X3NldF9mbGFncyhzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wLAorCQkJCSAgICBzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkLAorCQkJCSAgICB1NjQgb2xkX2Nvbm5lY3RfZmxhZ3MsCisJCQkJICAgIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsIGludCBpbml0X2Nvbm5lY3QpCit7CisJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZpbXAtPmltcF9vYmQtPnUuY2xpOworCXN0YXRpYyBib29sIHdhcm5lZDsKKworCWlmICgoaW1wLT5pbXBfY29ubmVjdF9mbGFnc19vcmlnICYgT0JEX0NPTk5FQ1RfSUJJVFMpICYmCisJICAgICEob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0lCSVRTKSkgeworCQlMQ09OU09MRV9XQVJOKCIlczogTURTICVzIGRvZXMgbm90IHN1cHBvcnQgaWJpdHMgbG9jaywgZWl0aGVyIHZlcnkgb2xkIG9yIGludmFsaWQ6IHJlcXVlc3RlZCAlI2xseCwgcmVwbGllZCAlI2xseFxuIiwKKwkJCSAgICAgIGltcC0+aW1wX29iZC0+b2JkX25hbWUsCisJCQkgICAgICBpbXAtPmltcF9jb25uZWN0aW9uLT5jX3JlbW90ZV91dWlkLnV1aWQsCisJCQkgICAgICBpbXAtPmltcF9jb25uZWN0X2ZsYWdzX29yaWcsCisJCQkgICAgICBvY2QtPm9jZF9jb25uZWN0X2ZsYWdzKTsKKwkJcmV0dXJuIC1FUFJPVE87CisJfQorCisJc3Bpbl9sb2NrKCZpbXAtPmltcF9sb2NrKTsKKwlsaXN0X2RlbCgmaW1wLT5pbXBfY29ubl9jdXJyZW50LT5vaWNfaXRlbSk7CisJbGlzdF9hZGQoJmltcC0+aW1wX2Nvbm5fY3VycmVudC0+b2ljX2l0ZW0sICZpbXAtPmltcF9jb25uX2xpc3QpOworCWltcC0+aW1wX2xhc3Rfc3VjY2Vzc19jb25uID0gaW1wLT5pbXBfY29ubl9jdXJyZW50LT5vaWNfbGFzdF9hdHRlbXB0OworCisJc3Bpbl91bmxvY2soJmltcC0+aW1wX2xvY2spOworCisJaWYgKCF3YXJuZWQgJiYgKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9WRVJTSU9OKSAmJgorCSAgICAob2NkLT5vY2RfdmVyc2lvbiA+IExVU1RSRV9WRVJTSU9OX0NPREUgKworCQkJCUxVU1RSRV9WRVJTSU9OX09GRlNFVF9XQVJOIHx8CisJICAgICBvY2QtPm9jZF92ZXJzaW9uIDwgTFVTVFJFX1ZFUlNJT05fQ09ERSAtCisJCQkJTFVTVFJFX1ZFUlNJT05fT0ZGU0VUX1dBUk4pKSB7CisJCS8qCisJCSAqIFNpZ2gsIHNvbWUgY29tcGlsZXJzIGRvIG5vdCBsaWtlICNpZmRlZiBpbiB0aGUgbWlkZGxlCisJCSAqIG9mIG1hY3JvIGFyZ3VtZW50cworCQkgKi8KKwkJY29uc3QgY2hhciAqb2xkZXIgPSAib2xkZXIgdGhhbiBjbGllbnQuIENvbnNpZGVyIHVwZ3JhZGluZyBzZXJ2ZXIiOworCQljb25zdCBjaGFyICpuZXdlciA9ICJuZXdlciB0aGFuIGNsaWVudC4gQ29uc2lkZXIgcmVjb21waWxpbmcgYXBwbGljYXRpb24iOworCisJCUxDT05TT0xFX1dBUk4oIlNlcnZlciAlcyB2ZXJzaW9uICglZC4lZC4lZC4lZCkgaXMgbXVjaCAlcyAoJXMpXG4iLAorCQkJICAgICAgb2JkMmNsaV90Z3QoaW1wLT5pbXBfb2JkKSwKKwkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9NQUpPUihvY2QtPm9jZF92ZXJzaW9uKSwKKwkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9NSU5PUihvY2QtPm9jZF92ZXJzaW9uKSwKKwkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9QQVRDSChvY2QtPm9jZF92ZXJzaW9uKSwKKwkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9GSVgob2NkLT5vY2RfdmVyc2lvbiksCisJCQkgICAgICBvY2QtPm9jZF92ZXJzaW9uID4gTFVTVFJFX1ZFUlNJT05fQ09ERSA/CisJCQkgICAgICBuZXdlciA6IG9sZGVyLCBMVVNUUkVfVkVSU0lPTl9TVFJJTkcpOworCQl3YXJuZWQgPSB0cnVlOworCX0KKworI2lmIExVU1RSRV9WRVJTSU9OX0NPREUgPCBPQkRfT0NEX1ZFUlNJT04oMywgMCwgNTMsIDApCisJLyoKKwkgKiBDaGVjayBpZiBzZXJ2ZXIgaGFzIExVLTEyNTIgZml4IGFwcGxpZWQgdG8gbm90IGFsd2F5cyBzd2FiCisJICogdGhlIElSIE1ORSBlbnRyaWVzLiBEbyB0aGlzIG9ubHkgb25jZSBwZXIgY29ubmVjdGlvbi4gIFRoaXMKKwkgKiBmaXh1cCBpcyB2ZXJzaW9uLWxpbWl0ZWQsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBjYXJyeSB0aGUKKwkgKiBPQkRfQ09OTkVDVF9NTkVfU1dBQiBmbGFnIGFyb3VuZCBmb3JldmVyLCBqdXN0IHNvIGxvbmcgYXMgd2UKKwkgKiBuZWVkIGludGVyb3Agd2l0aCB1bnBhdGNoZWQgMi4yIHNlcnZlcnMuICBGb3IgbmV3ZXIgc2VydmVycywKKwkgKiB0aGUgY2xpZW50IHdpbGwgZG8gTU5FIHN3YWJiaW5nIG9ubHkgYXMgbmVlZGVkLiAgTFUtMTY0NAorCSAqLworCWlmICh1bmxpa2VseSgob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX1ZFUlNJT04pICYmCisJCSAgICAgIShvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfTU5FX1NXQUIpICYmCisJCSAgICAgT0JEX09DRF9WRVJTSU9OX01BSk9SKG9jZC0+b2NkX3ZlcnNpb24pID09IDIgJiYKKwkJICAgICBPQkRfT0NEX1ZFUlNJT05fTUlOT1Iob2NkLT5vY2RfdmVyc2lvbikgPT0gMiAmJgorCQkgICAgIE9CRF9PQ0RfVkVSU0lPTl9QQVRDSChvY2QtPm9jZF92ZXJzaW9uKSA8IDU1ICYmCisJCSAgICAgIXN0cmNtcChpbXAtPmltcF9vYmQtPm9iZF90eXBlLT50eXBfbmFtZSwKKwkJCSAgICAgTFVTVFJFX01HQ19OQU1FKSkpCisJCWltcC0+aW1wX25lZWRfbW5lX3N3YWIgPSAxOworCWVsc2UgLyogY2xlYXIgaWYgc2VydmVyIHdhcyB1cGdyYWRlZCBzaW5jZSBsYXN0IGNvbm5lY3QgKi8KKwkJaW1wLT5pbXBfbmVlZF9tbmVfc3dhYiA9IDA7CisjZW5kaWYKKworCWlmIChvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfQ0tTVU0pIHsKKwkJLyoKKwkJICogV2Ugc2VudCB0byB0aGUgc2VydmVyIG9jZF9ja3N1bV90eXBlcyB3aXRoIGJpdHMgc2V0CisJCSAqIGZvciBhbGdvcml0aG1zIHdlIHVuZGVyc3RhbmQuIFRoZSBzZXJ2ZXIgbWFza2VkIG9mZgorCQkgKiB0aGUgY2hlY2tzdW0gdHlwZXMgaXQgZG9lc24ndCBzdXBwb3J0CisJCSAqLworCQlpZiAoIShvY2QtPm9jZF9ja3N1bV90eXBlcyAmIGNrc3VtX3R5cGVzX3N1cHBvcnRlZF9jbGllbnQoKSkpIHsKKwkJCUxDT05TT0xFX1dBUk4oIlRoZSBuZWdvdGlhdGlvbiBvZiB0aGUgY2hlY2tzdW0gYWxnb3JpdGhtIHRvIHVzZSB3aXRoIHNlcnZlciAlcyBmYWlsZWQgKCV4LyV4KSwgZGlzYWJsaW5nIGNoZWNrc3Vtc1xuIiwKKwkJCQkgICAgICBvYmQyY2xpX3RndChpbXAtPmltcF9vYmQpLAorCQkJCSAgICAgIG9jZC0+b2NkX2Nrc3VtX3R5cGVzLAorCQkJCSAgICAgIGNrc3VtX3R5cGVzX3N1cHBvcnRlZF9jbGllbnQoKSk7CisJCQljbGktPmNsX2NoZWNrc3VtID0gMDsKKwkJCWNsaS0+Y2xfc3VwcF9ja3N1bV90eXBlcyA9IE9CRF9DS1NVTV9BRExFUjsKKwkJfSBlbHNlIHsKKwkJCWNsaS0+Y2xfc3VwcF9ja3N1bV90eXBlcyA9IG9jZC0+b2NkX2Nrc3VtX3R5cGVzOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IE9CRF9DT05ORUNUX0NLU1VNLgorCQkgKiBFbmZvcmNlIEFETEVSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisJCSAqLworCQljbGktPmNsX3N1cHBfY2tzdW1fdHlwZXMgPSBPQkRfQ0tTVU1fQURMRVI7CisJfQorCWNsaS0+Y2xfY2tzdW1fdHlwZSA9IGNrc3VtX3R5cGVfc2VsZWN0KGNsaS0+Y2xfc3VwcF9ja3N1bV90eXBlcyk7CisKKwlpZiAob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0JSV19TSVpFKQorCQljbGktPmNsX21heF9wYWdlc19wZXJfcnBjID0KKwkJCW1pbihvY2QtPm9jZF9icndfc2l6ZSA+PiBQQUdFX1NISUZULAorCQkJICAgIGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMpOworCWVsc2UgaWYgKGltcC0+aW1wX2Nvbm5lY3Rfb3AgPT0gTURTX0NPTk5FQ1QgfHwKKwkJIGltcC0+aW1wX2Nvbm5lY3Rfb3AgPT0gTUdTX0NPTk5FQ1QpCisJCWNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMgPSAxOworCisJTEFTU0VSVCgoY2xpLT5jbF9tYXhfcGFnZXNfcGVyX3JwYyA8PSBQVExSUENfTUFYX0JSV19QQUdFUykgJiYKKwkJKGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMgPiAwKSk7CisKKwljbGllbnRfYWRqdXN0X21heF9kaXJ0eShjbGkpOworCisJLyoKKwkgKiBSZXNldCBuc19jb25uZWN0X2ZsYWdzIG9ubHkgZm9yIGluaXRpYWwgY29ubmVjdC4gSXQgbWlnaHQgYmUKKwkgKiBjaGFuZ2VkIGluIHdoaWxlIHVzaW5nIEZTIGFuZCBpZiB3ZSByZXNldCBpdCBpbiByZWNvbm5lY3QKKwkgKiB0aGlzIGxlYWRzIHRvIGxvc2luZyB1c2VyIHNldHRpbmdzIGRvbmUgYmVmb3JlIHN1Y2ggYXMKKwkgKiBkaXNhYmxlIGxydV9yZXNpemUsIGV0Yy4KKwkgKi8KKwlpZiAob2xkX2Nvbm5lY3RfZmxhZ3MgIT0gZXhwX2Nvbm5lY3RfZmxhZ3MoZXhwKSB8fCBpbml0X2Nvbm5lY3QpIHsKKwkJQ0RFQlVHKERfSEEsICIlczogUmVzZXR0aW5nIG5zX2Nvbm5lY3RfZmxhZ3MgdG8gc2VydmVyIGZsYWdzOiAlI2xseFxuIiwKKwkJICAgICAgIGltcC0+aW1wX29iZC0+b2JkX25hbWUsIG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MpOworCQlpbXAtPmltcF9vYmQtPm9iZF9uYW1lc3BhY2UtPm5zX2Nvbm5lY3RfZmxhZ3MgPQorCQkJb2NkLT5vY2RfY29ubmVjdF9mbGFnczsKKwkJaW1wLT5pbXBfb2JkLT5vYmRfbmFtZXNwYWNlLT5uc19vcmlnX2Nvbm5lY3RfZmxhZ3MgPQorCQkJb2NkLT5vY2RfY29ubmVjdF9mbGFnczsKKwl9CisKKwlpZiAoKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9BVCkgJiYKKwkgICAgKGltcC0+aW1wX21zZ19tYWdpYyA9PSBMVVNUUkVfTVNHX01BR0lDX1YyKSkKKwkJLyoKKwkJICogV2UgbmVlZCBhIHBlci1tZXNzYWdlIHN1cHBvcnQgZmxhZywgYmVjYXVzZQorCQkgKiBhLiB3ZSBkb24ndCBrbm93IGlmIHRoZSBpbmNvbWluZyBjb25uZWN0IHJlcGx5CisJCSAqICAgIHN1cHBvcnRzIEFUIG9yIG5vdCAoaW4gcmVwbHlfaW5fY2FsbGJhY2spCisJCSAqICAgIHVudGlsIHdlIHVucGFjayBpdC4KKwkJICogYi4gZmFpbG92ZXJlZCBzZXJ2ZXIgbWVhbnMgZXhwb3J0IGFuZCBmbGFncyBhcmUgZ29uZQorCQkgKiAgICAoaW4gcHRscnBjX3NlbmRfcmVwbHkpLgorCQkgKiAgICBDYW4gb25seSBiZSBzZXQgd2hlbiB3ZSBrbm93IEFUIGlzIHN1cHBvcnRlZCBhdAorCQkgKiAgICBib3RoIGVuZHMKKwkJICovCisJCWltcC0+aW1wX21zZ2hkcl9mbGFncyB8PSBNU0dIRFJfQVRfU1VQUE9SVDsKKwllbHNlCisJCWltcC0+aW1wX21zZ2hkcl9mbGFncyAmPSB+TVNHSERSX0FUX1NVUFBPUlQ7CisKKwlpZiAoKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9GVUxMMjApICYmCisJICAgIChpbXAtPmltcF9tc2dfbWFnaWMgPT0gTFVTVFJFX01TR19NQUdJQ19WMikpCisJCWltcC0+aW1wX21zZ2hkcl9mbGFncyB8PSBNU0dIRFJfQ0tTVU1fSU5DT01QQVQxODsKKwllbHNlCisJCWltcC0+aW1wX21zZ2hkcl9mbGFncyAmPSB+TVNHSERSX0NLU1VNX0lOQ09NUEFUMTg7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBpbnRlcnByZXRfcmVwbHkgY2FsbGJhY2sgZm9yIGNvbm5lY3QgUlBDcy4KICAqIExvb2tzIGludG8gcmV0dXJuZWQgc3RhdHVzIG9mIGNvbm5lY3Qgb3BlcmF0aW9uIGFuZCBkZWNpZGVzCkBAIC03NjIsNyArOTEwLDYgQEAKIHsKIAlzdHJ1Y3QgcHRscnBjX2Nvbm5lY3RfYXN5bmNfYXJncyAqYWEgPSBkYXRhOwogCXN0cnVjdCBvYmRfaW1wb3J0ICppbXAgPSByZXF1ZXN0LT5ycV9pbXBvcnQ7Ci0Jc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZpbXAtPmltcF9vYmQtPnUuY2xpOwogCXN0cnVjdCBsdXN0cmVfaGFuZGxlIG9sZF9oZGw7CiAJX191NjQgb2xkX2Nvbm5lY3RfZmxhZ3M7CiAJaW50IG1zZ19mbGFnczsKQEAgLTg0Miw3ICs5ODksMjEgQEAKIAlvbGRfY29ubmVjdF9mbGFncyA9IGV4cF9jb25uZWN0X2ZsYWdzKGV4cCk7CiAJZXhwLT5leHBfY29ubmVjdF9kYXRhID0gKm9jZDsKIAlpbXAtPmltcF9vYmQtPm9iZF9zZWxmX2V4cG9ydC0+ZXhwX2Nvbm5lY3RfZGF0YSA9ICpvY2Q7CisKKwkvKgorCSAqIFRoZSBuZXQgc3RhdGlzdGljcyBhZnRlciAocmUtKWNvbm5lY3QgaXMgbm90IHZhbGlkIGFueW1vcmUsCisJICogYmVjYXVzZSBtYXkgcmVmbGVjdCBvdGhlciByb3V0aW5nLCBldGMuCisJICovCisJYXRfaW5pdCgmaW1wLT5pbXBfYXQuaWF0X25ldF9sYXRlbmN5LCAwLCAwKTsKKwlwdGxycGNfYXRfYWRqX25ldF9sYXRlbmN5KHJlcXVlc3QsCisJCQkJICBsdXN0cmVfbXNnX2dldF9zZXJ2aWNlX3RpbWUocmVxdWVzdC0+cnFfcmVwbXNnKSk7CisKKwkvKiBJbXBvcnQgZmxhZ3Mgc2hvdWxkIGJlIHVwZGF0ZWQgYmVmb3JlIHdha2luZyBpbXBvcnQgYXQgRlVMTCBzdGF0ZSAqLworCXJjID0gcHRscnBjX2Nvbm5lY3Rfc2V0X2ZsYWdzKGltcCwgb2NkLCBvbGRfY29ubmVjdF9mbGFncywgZXhwLAorCQkJCSAgICAgIGFhLT5wY2FhX2luaXRpYWxfY29ubmVjdCk7CiAJY2xhc3NfZXhwb3J0X3B1dChleHApOworCWlmIChyYykKKwkJZ290byBvdXQ7CiAKIAlvYmRfaW1wb3J0X2V2ZW50KGltcC0+aW1wX29iZCwgaW1wLCBJTVBfRVZFTlRfT0NEKTsKIApAQCAtOTg3LDE1MSArMTE0OCwxMyBAQAogCiBmaW5pc2g6CiAJcmMgPSBwdGxycGNfaW1wb3J0X3JlY292ZXJ5X3N0YXRlX21hY2hpbmUoaW1wKTsKLQlpZiAocmMgIT0gMCkgewotCQlpZiAocmMgPT0gLUVOT1RDT05OKSB7Ci0JCQlDREVCVUcoRF9IQSwgImV2aWN0ZWQvYWJvcnRlZCBieSAlc0AlcyBkdXJpbmcgcmVjb3Zlcnk7IGludmFsaWRhdGluZyBhbmQgcmVjb25uZWN0aW5nXG4iLAotCQkJICAgICAgIG9iZDJjbGlfdGd0KGltcC0+aW1wX29iZCksCi0JCQkgICAgICAgaW1wLT5pbXBfY29ubmVjdGlvbi0+Y19yZW1vdGVfdXVpZC51dWlkKTsKLQkJCXB0bHJwY19jb25uZWN0X2ltcG9ydChpbXApOwotCQkJaW1wLT5pbXBfY29ubmVjdF90cmllZCA9IDE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCXN0YXRpYyBib29sIHdhcm5lZDsKLQotCQlzcGluX2xvY2soJmltcC0+aW1wX2xvY2spOwotCQlsaXN0X2RlbCgmaW1wLT5pbXBfY29ubl9jdXJyZW50LT5vaWNfaXRlbSk7Ci0JCWxpc3RfYWRkKCZpbXAtPmltcF9jb25uX2N1cnJlbnQtPm9pY19pdGVtLCAmaW1wLT5pbXBfY29ubl9saXN0KTsKLQkJaW1wLT5pbXBfbGFzdF9zdWNjZXNzX2Nvbm4gPQotCQkJaW1wLT5pbXBfY29ubl9jdXJyZW50LT5vaWNfbGFzdF9hdHRlbXB0OwotCi0JCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKLQotCQlpZiAoKGltcC0+aW1wX2Nvbm5lY3RfZmxhZ3Nfb3JpZyAmIE9CRF9DT05ORUNUX0lCSVRTKSAmJgotCQkgICAgIShvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfSUJJVFMpKSB7Ci0JCQlMQ09OU09MRV9XQVJOKCIlczogTURTICVzIGRvZXMgbm90IHN1cHBvcnQgaWJpdHMgbG9jaywgZWl0aGVyIHZlcnkgb2xkIG9yIGludmFsaWQ6IHJlcXVlc3RlZCAlbGx4LCByZXBsaWVkICVsbHhcbiIsCi0JCQkJICAgICAgaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSwKLQkJCQkgICAgICBpbXAtPmltcF9jb25uZWN0aW9uLT5jX3JlbW90ZV91dWlkLnV1aWQsCi0JCQkJICAgICAgaW1wLT5pbXBfY29ubmVjdF9mbGFnc19vcmlnLAotCQkJCSAgICAgIG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MpOwotCQkJcmMgPSAtRVBST1RPOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoIXdhcm5lZCAmJiAob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX1ZFUlNJT04pICYmCi0JCSAgICAob2NkLT5vY2RfdmVyc2lvbiA+IExVU1RSRV9WRVJTSU9OX0NPREUgKwotCQkJCQlMVVNUUkVfVkVSU0lPTl9PRkZTRVRfV0FSTiB8fAotCQkgICAgIG9jZC0+b2NkX3ZlcnNpb24gPCBMVVNUUkVfVkVSU0lPTl9DT0RFIC0KLQkJCQkJTFVTVFJFX1ZFUlNJT05fT0ZGU0VUX1dBUk4pKSB7Ci0JCQkvKiBTaWdoLCBzb21lIGNvbXBpbGVycyBkbyBub3QgbGlrZSAjaWZkZWYgaW4gdGhlIG1pZGRsZQotCQkJICogb2YgbWFjcm8gYXJndW1lbnRzCi0JCQkgKi8KLQkJCWNvbnN0IGNoYXIgKm9sZGVyID0gIm9sZGVyIHRoYW4gY2xpZW50LiBDb25zaWRlciB1cGdyYWRpbmcgc2VydmVyIjsKLQkJCWNvbnN0IGNoYXIgKm5ld2VyID0gIm5ld2VyIHRoYW4gY2xpZW50LiBDb25zaWRlciByZWNvbXBpbGluZyBhcHBsaWNhdGlvbiI7Ci0KLQkJCUxDT05TT0xFX1dBUk4oIlNlcnZlciAlcyB2ZXJzaW9uICglZC4lZC4lZC4lZCkgaXMgbXVjaCAlcyAoJXMpXG4iLAotCQkJCSAgICAgIG9iZDJjbGlfdGd0KGltcC0+aW1wX29iZCksCi0JCQkJICAgICAgT0JEX09DRF9WRVJTSU9OX01BSk9SKG9jZC0+b2NkX3ZlcnNpb24pLAotCQkJCSAgICAgIE9CRF9PQ0RfVkVSU0lPTl9NSU5PUihvY2QtPm9jZF92ZXJzaW9uKSwKLQkJCQkgICAgICBPQkRfT0NEX1ZFUlNJT05fUEFUQ0gob2NkLT5vY2RfdmVyc2lvbiksCi0JCQkJICAgICAgT0JEX09DRF9WRVJTSU9OX0ZJWChvY2QtPm9jZF92ZXJzaW9uKSwKLQkJCQkgICAgICBvY2QtPm9jZF92ZXJzaW9uID4gTFVTVFJFX1ZFUlNJT05fQ09ERSA/Ci0JCQkJICAgICAgbmV3ZXIgOiBvbGRlciwgTFVTVFJFX1ZFUlNJT05fU1RSSU5HKTsKLQkJCXdhcm5lZCA9IHRydWU7Ci0JCX0KLQotI2lmIExVU1RSRV9WRVJTSU9OX0NPREUgPCBPQkRfT0NEX1ZFUlNJT04oMywgMiwgNTAsIDApCi0JCS8qIENoZWNrIGlmIHNlcnZlciBoYXMgTFUtMTI1MiBmaXggYXBwbGllZCB0byBub3QgYWx3YXlzIHN3YWIKLQkJICogdGhlIElSIE1ORSBlbnRyaWVzLiBEbyB0aGlzIG9ubHkgb25jZSBwZXIgY29ubmVjdGlvbi4gIFRoaXMKLQkJICogZml4dXAgaXMgdmVyc2lvbi1saW1pdGVkLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gY2FycnkgdGhlCi0JCSAqIE9CRF9DT05ORUNUX01ORV9TV0FCIGZsYWcgYXJvdW5kIGZvcmV2ZXIsIGp1c3Qgc28gbG9uZyBhcyB3ZQotCQkgKiBuZWVkIGludGVyb3Agd2l0aCB1bnBhdGNoZWQgMi4yIHNlcnZlcnMuICBGb3IgbmV3ZXIgc2VydmVycywKLQkJICogdGhlIGNsaWVudCB3aWxsIGRvIE1ORSBzd2FiYmluZyBvbmx5IGFzIG5lZWRlZC4gIExVLTE2NDQKLQkJICovCi0JCWlmICh1bmxpa2VseSgob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX1ZFUlNJT04pICYmCi0JCQkgICAgICEob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX01ORV9TV0FCKSAmJgotCQkJICAgICBPQkRfT0NEX1ZFUlNJT05fTUFKT1Iob2NkLT5vY2RfdmVyc2lvbikgPT0gMiAmJgotCQkJICAgICBPQkRfT0NEX1ZFUlNJT05fTUlOT1Iob2NkLT5vY2RfdmVyc2lvbikgPT0gMiAmJgotCQkJICAgICBPQkRfT0NEX1ZFUlNJT05fUEFUQ0gob2NkLT5vY2RfdmVyc2lvbikgPCA1NSAmJgotCQkJICAgICBzdHJjbXAoaW1wLT5pbXBfb2JkLT5vYmRfdHlwZS0+dHlwX25hbWUsCi0JCQkJICAgIExVU1RSRV9NR0NfTkFNRSkgPT0gMCkpCi0JCQlpbXAtPmltcF9uZWVkX21uZV9zd2FiID0gMTsKLQkJZWxzZSAvKiBjbGVhciBpZiBzZXJ2ZXIgd2FzIHVwZ3JhZGVkIHNpbmNlIGxhc3QgY29ubmVjdCAqLwotCQkJaW1wLT5pbXBfbmVlZF9tbmVfc3dhYiA9IDA7Ci0jZWxzZQotI3dhcm5pbmcgIkxVLTE2NDQ6IFJlbW92ZSBvbGQgT0JEX0NPTk5FQ1RfTU5FX1NXQUIgZml4dXAgYW5kIGltcF9uZWVkX21uZV9zd2FiIgotI2VuZGlmCi0KLQkJaWYgKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9DS1NVTSkgewotCQkJLyogV2Ugc2VudCB0byB0aGUgc2VydmVyIG9jZF9ja3N1bV90eXBlcyB3aXRoIGJpdHMgc2V0Ci0JCQkgKiBmb3IgYWxnb3JpdGhtcyB3ZSB1bmRlcnN0YW5kLiBUaGUgc2VydmVyIG1hc2tlZCBvZmYKLQkJCSAqIHRoZSBjaGVja3N1bSB0eXBlcyBpdCBkb2Vzbid0IHN1cHBvcnQKLQkJCSAqLwotCQkJaWYgKChvY2QtPm9jZF9ja3N1bV90eXBlcyAmCi0JCQkgICAgIGNrc3VtX3R5cGVzX3N1cHBvcnRlZF9jbGllbnQoKSkgPT0gMCkgewotCQkJCUxDT05TT0xFX1dBUk4oIlRoZSBuZWdvdGlhdGlvbiBvZiB0aGUgY2hlY2tzdW0gYWxnb3JpdGhtIHRvIHVzZSB3aXRoIHNlcnZlciAlcyBmYWlsZWQgKCV4LyV4KSwgZGlzYWJsaW5nIGNoZWNrc3Vtc1xuIiwKLQkJCQkJICAgICAgb2JkMmNsaV90Z3QoaW1wLT5pbXBfb2JkKSwKLQkJCQkJICAgICAgb2NkLT5vY2RfY2tzdW1fdHlwZXMsCi0JCQkJCSAgICAgIGNrc3VtX3R5cGVzX3N1cHBvcnRlZF9jbGllbnQoKSk7Ci0JCQkJY2xpLT5jbF9jaGVja3N1bSA9IDA7Ci0JCQkJY2xpLT5jbF9zdXBwX2Nrc3VtX3R5cGVzID0gT0JEX0NLU1VNX0FETEVSOwotCQkJfSBlbHNlIHsKLQkJCQljbGktPmNsX3N1cHBfY2tzdW1fdHlwZXMgPSBvY2QtPm9jZF9ja3N1bV90eXBlczsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIFRoZSBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBPQkRfQ09OTkVDVF9DS1NVTS4KLQkJCSAqIEVuZm9yY2UgQURMRVIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLQkJCSAqLwotCQkJY2xpLT5jbF9zdXBwX2Nrc3VtX3R5cGVzID0gT0JEX0NLU1VNX0FETEVSOwotCQl9Ci0JCWNsaS0+Y2xfY2tzdW1fdHlwZSA9IGNrc3VtX3R5cGVfc2VsZWN0KGNsaS0+Y2xfc3VwcF9ja3N1bV90eXBlcyk7Ci0KLQkJaWYgKG9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgJiBPQkRfQ09OTkVDVF9CUldfU0laRSkKLQkJCWNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMgPQotCQkJCW1pbihvY2QtPm9jZF9icndfc2l6ZSA+PiBQQUdFX1NISUZULAotCQkJCSAgICBjbGktPmNsX21heF9wYWdlc19wZXJfcnBjKTsKLQkJZWxzZSBpZiAoaW1wLT5pbXBfY29ubmVjdF9vcCA9PSBNRFNfQ09OTkVDVCB8fAotCQkJIGltcC0+aW1wX2Nvbm5lY3Rfb3AgPT0gTUdTX0NPTk5FQ1QpCi0JCQljbGktPmNsX21heF9wYWdlc19wZXJfcnBjID0gMTsKLQotCQkvKiBSZXNldCBuc19jb25uZWN0X2ZsYWdzIG9ubHkgZm9yIGluaXRpYWwgY29ubmVjdC4gSXQgbWlnaHQgYmUKLQkJICogY2hhbmdlZCBpbiB3aGlsZSB1c2luZyBGUyBhbmQgaWYgd2UgcmVzZXQgaXQgaW4gcmVjb25uZWN0Ci0JCSAqIHRoaXMgbGVhZHMgdG8gbG9zaW5nIHVzZXIgc2V0dGluZ3MgZG9uZSBiZWZvcmUgc3VjaCBhcwotCQkgKiBkaXNhYmxlIGxydV9yZXNpemUsIGV0Yy4KLQkJICovCi0JCWlmIChvbGRfY29ubmVjdF9mbGFncyAhPSBleHBfY29ubmVjdF9mbGFncyhleHApIHx8Ci0JCSAgICBhYS0+cGNhYV9pbml0aWFsX2Nvbm5lY3QpIHsKLQkJCUNERUJVRyhEX0hBLCAiJXM6IFJlc2V0dGluZyBuc19jb25uZWN0X2ZsYWdzIHRvIHNlcnZlciBmbGFnczogJSNsbHhcbiIsCi0JCQkgICAgICAgaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSwgb2NkLT5vY2RfY29ubmVjdF9mbGFncyk7Ci0JCQlpbXAtPmltcF9vYmQtPm9iZF9uYW1lc3BhY2UtPm5zX2Nvbm5lY3RfZmxhZ3MgPQotCQkJCW9jZC0+b2NkX2Nvbm5lY3RfZmxhZ3M7Ci0JCQlpbXAtPmltcF9vYmQtPm9iZF9uYW1lc3BhY2UtPm5zX29yaWdfY29ubmVjdF9mbGFncyA9Ci0JCQkJb2NkLT5vY2RfY29ubmVjdF9mbGFnczsKLQkJfQotCi0JCWlmICgob2NkLT5vY2RfY29ubmVjdF9mbGFncyAmIE9CRF9DT05ORUNUX0FUKSAmJgotCQkgICAgKGltcC0+aW1wX21zZ19tYWdpYyA9PSBMVVNUUkVfTVNHX01BR0lDX1YyKSkKLQkJCS8qIFdlIG5lZWQgYSBwZXItbWVzc2FnZSBzdXBwb3J0IGZsYWcsIGJlY2F1c2UKLQkJCSAqIGEuIHdlIGRvbid0IGtub3cgaWYgdGhlIGluY29taW5nIGNvbm5lY3QgcmVwbHkKLQkJCSAqICAgIHN1cHBvcnRzIEFUIG9yIG5vdCAoaW4gcmVwbHlfaW5fY2FsbGJhY2spCi0JCQkgKiAgICB1bnRpbCB3ZSB1bnBhY2sgaXQuCi0JCQkgKiBiLiBmYWlsb3ZlcmVkIHNlcnZlciBtZWFucyBleHBvcnQgYW5kIGZsYWdzIGFyZSBnb25lCi0JCQkgKiAgICAoaW4gcHRscnBjX3NlbmRfcmVwbHkpLgotCQkJICogQ2FuIG9ubHkgYmUgc2V0IHdoZW4gd2Uga25vdyBBVCBpcyBzdXBwb3J0ZWQgYXQKLQkJCSAqIGJvdGggZW5kcwotCQkJICovCi0JCQlpbXAtPmltcF9tc2doZHJfZmxhZ3MgfD0gTVNHSERSX0FUX1NVUFBPUlQ7Ci0JCWVsc2UKLQkJCWltcC0+aW1wX21zZ2hkcl9mbGFncyAmPSB+TVNHSERSX0FUX1NVUFBPUlQ7Ci0KLQkJaWYgKChvY2QtPm9jZF9jb25uZWN0X2ZsYWdzICYgT0JEX0NPTk5FQ1RfRlVMTDIwKSAmJgotCQkgICAgKGltcC0+aW1wX21zZ19tYWdpYyA9PSBMVVNUUkVfTVNHX01BR0lDX1YyKSkKLQkJCWltcC0+aW1wX21zZ2hkcl9mbGFncyB8PSBNU0dIRFJfQ0tTVU1fSU5DT01QQVQxODsKLQkJZWxzZQotCQkJaW1wLT5pbXBfbXNnaGRyX2ZsYWdzICY9IH5NU0dIRFJfQ0tTVU1fSU5DT01QQVQxODsKLQotCQlMQVNTRVJUKChjbGktPmNsX21heF9wYWdlc19wZXJfcnBjIDw9IFBUTFJQQ19NQVhfQlJXX1BBR0VTKSAmJgotCQkJKGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMgPiAwKSk7CisJaWYgKHJjID09IC1FTk9UQ09OTikgeworCQlDREVCVUcoRF9IQSwgImV2aWN0ZWQvYWJvcnRlZCBieSAlc0AlcyBkdXJpbmcgcmVjb3Zlcnk7IGludmFsaWRhdGluZyBhbmQgcmVjb25uZWN0aW5nXG4iLAorCQkgICAgICAgb2JkMmNsaV90Z3QoaW1wLT5pbXBfb2JkKSwKKwkJICAgICAgIGltcC0+aW1wX2Nvbm5lY3Rpb24tPmNfcmVtb3RlX3V1aWQudXVpZCk7CisJCXB0bHJwY19jb25uZWN0X2ltcG9ydChpbXApOworCQlpbXAtPmltcF9jb25uZWN0X3RyaWVkID0gMTsKKwkJcmV0dXJuIDA7CiAJfQogCiBvdXQ6CkBAIC0xNDk3LDEwICsxNTIwLDEzIEBACiAvKiBBZGFwdGl2ZSBUaW1lb3V0IHV0aWxzICovCiBleHRlcm4gdW5zaWduZWQgaW50IGF0X21pbiwgYXRfbWF4LCBhdF9oaXN0b3J5OwogCi0vKiBCaW4gaW50byB0aW1lc2xpY2VzIHVzaW5nIEFUX0JJTlMgYmlucy4KLSAqIFRoaXMgZ2l2ZXMgdXMgYSBtYXggb2YgdGhlIGxhc3QgYmlubGltaXQqQVRfQklOUyBzZWNzIHdpdGhvdXQgdGhlIHN0b3JhZ2UsCi0gKiBidXQgc3RpbGwgc21vb3RoaW5nIG91dCBhIHJldHVybiB0byBub3JtYWxjeSBmcm9tIGEgc2xvdyByZXNwb25zZS4KLSAqIChFLmcuIHJlbWVtYmVyIHRoZSBtYXhpbXVtIGxhdGVuY3kgaW4gZWFjaCBtaW51dGUgb2YgdGhlIGxhc3QgNCBtaW51dGVzLikKKy8qCisgKlVwZGF0ZSBhdF9jdXJyZW50IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSAoYm91bmRlZCBieSBhdF9taW4gYW5kIGF0X21heCksCisgKiBhcyB3ZWxsIGFzIHRoZSBBVCBoaXN0b3J5ICJiaW5zIi4KKyAqICAtIEJpbiBpbnRvIHRpbWVzbGljZXMgdXNpbmcgQVRfQklOUyBiaW5zLgorICogIC0gVGhpcyBnaXZlcyB1cyBhIG1heCBvZiB0aGUgbGFzdCBhdF9oaXN0b3J5IHNlY29uZHMgd2l0aG91dCB0aGUgc3RvcmFnZSwKKyAqICAgIGJ1dCBzdGlsbCBzbW9vdGhpbmcgb3V0IGEgcmV0dXJuIHRvIG5vcm1hbGN5IGZyb20gYSBzbG93IHJlc3BvbnNlLgorICogIC0gKEUuZy4gcmVtZW1iZXIgdGhlIG1heGltdW0gbGF0ZW5jeSBpbiBlYWNoIG1pbnV0ZSBvZiB0aGUgbGFzdCA0IG1pbnV0ZXMuKQogICovCiBpbnQgYXRfbWVhc3VyZWQoc3RydWN0IGFkYXB0aXZlX3RpbWVvdXQgKmF0LCB1bnNpZ25lZCBpbnQgdmFsKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xheW91dC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xheW91dC5jCmluZGV4IGFiNWQ4NTEuLjgzOWVmM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbGF5b3V0LmMKQEAgLTY2NywxMSArNjY3LDggQEAKIAkmUlFGX01EU19TWU5DLAogCSZSUUZfTURTX0NMT1NFLAogCSZSUUZfTURTX1JFTEVBU0VfQ0xPU0UsCi0JJlJRRl9NRFNfUElOLAotCSZSUUZfTURTX1VOUElOLAogCSZSUUZfTURTX1JFQURQQUdFLAogCSZSUUZfTURTX1dSSVRFUEFHRSwKLQkmUlFGX01EU19JU19TVUJESVIsCiAJJlJRRl9NRFNfRE9ORV9XUklUSU5HLAogCSZSUUZfTURTX1JFSU5ULAogCSZSUUZfTURTX1JFSU5UX0NSRUFURSwKQEAgLTExMTYsOSArMTExMyw5IEBACiAKIHN0cnVjdCByZXFfZm9ybWF0IHsKIAljb25zdCBjaGFyICpyZl9uYW1lOwotCWludCByZl9pZHg7CisJc2l6ZV90IHJmX2lkeDsKIAlzdHJ1Y3QgewotCQlpbnQgbnI7CisJCXNpemVfdCBucjsKIAkJY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKipkOwogCX0gcmZfZmllbGRzW1JDTF9OUl07CiB9OwpAQCAtMTM4OSwxNSArMTM4Niw2IEBACiAJCQltZHRfcmVsZWFzZV9jbG9zZV9jbGllbnQsIG1kc19sYXN0X3VubGlua19zZXJ2ZXIpOwogRVhQT1JUX1NZTUJPTChSUUZfTURTX1JFTEVBU0VfQ0xPU0UpOwogCi1zdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTURTX1BJTiA9Ci0JREVGSU5FX1JFUV9GTVQwKCJNRFNfUElOIiwKLQkJCW1kdF9ib2R5X2NhcGEsIG1kdF9ib2R5X29ubHkpOwotRVhQT1JUX1NZTUJPTChSUUZfTURTX1BJTik7Ci0KLXN0cnVjdCByZXFfZm9ybWF0IFJRRl9NRFNfVU5QSU4gPQotCURFRklORV9SRVFfRk1UMCgiTURTX1VOUElOIiwgbWR0X2JvZHlfb25seSwgZW1wdHkpOwotRVhQT1JUX1NZTUJPTChSUUZfTURTX1VOUElOKTsKLQogc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19ET05FX1dSSVRJTkcgPQogCURFRklORV9SRVFfRk1UMCgiTURTX0RPTkVfV1JJVElORyIsCiAJCQltZHRfY2xvc2VfY2xpZW50LCBtZHRfYm9keV9vbmx5KTsKQEAgLTE0NDgsMTEgKzE0MzYsNiBAQAogCQkJbWR0X2JvZHlfY2FwYSwgbWR0X2JvZHlfb25seSk7CiBFWFBPUlRfU1lNQk9MKFJRRl9NRFNfV1JJVEVQQUdFKTsKIAotc3RydWN0IHJlcV9mb3JtYXQgUlFGX01EU19JU19TVUJESVIgPQotCURFRklORV9SRVFfRk1UMCgiTURTX0lTX1NVQkRJUiIsCi0JCQltZHRfYm9keV9vbmx5LCBtZHRfYm9keV9vbmx5KTsKLUVYUE9SVF9TWU1CT0woUlFGX01EU19JU19TVUJESVIpOwotCiBzdHJ1Y3QgcmVxX2Zvcm1hdCBSUUZfTExPR19PUklHSU5fSEFORExFX0NSRUFURSA9CiAJREVGSU5FX1JFUV9GTVQwKCJMTE9HX09SSUdJTl9IQU5ETEVfQ1JFQVRFIiwKIAkJCWxsb2dfb3JpZ2luX2hhbmRsZV9jcmVhdGVfY2xpZW50LCBsbG9nZF9ib2R5X29ubHkpOwpAQCAtMTU3Miw5ICsxNTU1LDkgQEAKICAqLwogaW50IHJlcV9sYXlvdXRfaW5pdCh2b2lkKQogewotCWludCBpOwotCWludCBqOwotCWludCBrOworCXNpemVfdCBpOworCXNpemVfdCBqOworCXNpemVfdCBrOwogCXN0cnVjdCByZXFfZm9ybWF0ICpyZiA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZXFfZm9ybWF0cyk7ICsraSkgewpAQCAtMTYxNiw3ICsxNTk5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgcmVxX2NhcHN1bGVfaW5pdF9hcmVhKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCkKIHsKLQlpbnQgaTsKKwlzaXplX3QgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBpbGwtPnJjX2FyZWFbUkNMX0NMSUVOVF0pOyBpKyspIHsKIAkJcGlsbC0+cmNfYXJlYVtSQ0xfQ0xJRU5UXVtpXSA9IC0xOwpAQCAtMTY2Nyw4ICsxNjUwLDcgQEAKIAogc3RhdGljIGludCBfX3JlcV9mb3JtYXRfaXNfc2FuZShjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10KQogewotCXJldHVybgotCQkwIDw9IGZtdC0+cmZfaWR4ICYmIGZtdC0+cmZfaWR4IDwgQVJSQVlfU0laRShyZXFfZm9ybWF0cykgJiYKKwlyZXR1cm4gZm10LT5yZl9pZHggPCBBUlJBWV9TSVpFKHJlcV9mb3JtYXRzKSAmJgogCQlyZXFfZm9ybWF0c1tmbXQtPnJmX2lkeF0gPT0gZm10OwogfQogCkBAIC0xNzAyLDExICsxNjg0LDExIEBACiAgKiB2YXJpYWJsZS1zaXplZCBmaWVsZHMuICBUaGUgZmllbGQgc2l6ZXMgY29tZSBmcm9tIHRoZSBkZWNsYXJlZCBcYSBybWZfc2l6ZQogICogZmllbGQgb2YgYSBcYSBwaWxsJ3MgXGEgcmNfZm10J3MgUk1GJ3MuCiAgKi8KLWludCByZXFfY2Fwc3VsZV9maWxsZWRfc2l6ZXMoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAotCQkJICAgICBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpCitzaXplX3QgcmVxX2NhcHN1bGVfZmlsbGVkX3NpemVzKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKKwkJCQllbnVtIHJlcV9sb2NhdGlvbiBsb2MpCiB7CiAJY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCA9IHBpbGwtPnJjX2ZtdDsKLQlpbnQgaTsKKwlzaXplX3QgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBmbXQtPnJmX2ZpZWxkc1tsb2NdLm5yOyArK2kpIHsKIAkJaWYgKHBpbGwtPnJjX2FyZWFbbG9jXVtpXSA9PSAtMSkgewpAQCAtMTc2MSwxMSArMTc0MywxMSBAQAogICogUmV0dXJucyB0aGUgUFRMUlBDIHJlcXVlc3Qgb3IgcmVwbHkgKFxhIGxvYykgYnVmZmVyIG9mZnNldCBvZiBhIFxhIHBpbGwKICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFJNRiAoXGEgZmllbGQpLgogICovCi1zdGF0aWMgaW50IF9fcmVxX2NhcHN1bGVfb2Zmc2V0KGNvbnN0IHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKK3N0YXRpYyB1MzIgX19yZXFfY2Fwc3VsZV9vZmZzZXQoY29uc3Qgc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJCWNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCwKIAkJCQllbnVtIHJlcV9sb2NhdGlvbiBsb2MpCiB7Ci0JaW50IG9mZnNldDsKKwl1MzIgb2Zmc2V0OwogCiAJb2Zmc2V0ID0gZmllbGQtPnJtZl9vZmZzZXRbcGlsbC0+cmNfZm10LT5yZl9pZHhdW2xvY107CiAJTEFTU0VSVEYob2Zmc2V0ID4gMCwgIiVzOiVzLCBvZmY9JWQsIGxvYz0lZFxuIiwgcGlsbC0+cmNfZm10LT5yZl9uYW1lLApAQCAtMTg2OSwxMCArMTg1MSwxMCBAQAogCWNvbnN0IHN0cnVjdCByZXFfZm9ybWF0ICpmbXQ7CiAJc3RydWN0IGx1c3RyZV9tc2cgKm1zZzsKIAl2b2lkICp2YWx1ZTsKLQlpbnQgbGVuOwotCWludCBvZmZzZXQ7CisJdTMyIGxlbjsKKwl1MzIgb2Zmc2V0OwogCi0Jdm9pZCAqKCpnZXR0ZXIpKHN0cnVjdCBsdXN0cmVfbXNnICptLCBpbnQgbiwgaW50IG1pbmxlbik7CisJdm9pZCAqKCpnZXR0ZXIpKHN0cnVjdCBsdXN0cmVfbXNnICptLCB1MzIgbiwgdTMyIG1pbmxlbik7CiAKIAlzdGF0aWMgY29uc3QgY2hhciAqcmNsX25hbWVzW1JDTF9OUl0gPSB7CiAJCVtSQ0xfQ0xJRU5UXSA9ICJjbGllbnQiLApAQCAtMTg5OSwyMCArMTg4MSwyMCBAQAogCQkgKi8KIAkJbGVuID0gbHVzdHJlX21zZ19idWZsZW4obXNnLCBvZmZzZXQpOwogCQlpZiAoKGxlbiAlIGZpZWxkLT5ybWZfc2l6ZSkgIT0gMCkgewotCQkJQ0VSUk9SKCIlczogYXJyYXkgZmllbGQgc2l6ZSBtaXNtYXRjaCAlZCBtb2R1bG8gJWQgIT0gMCAoJWQpXG4iLAorCQkJQ0VSUk9SKCIlczogYXJyYXkgZmllbGQgc2l6ZSBtaXNtYXRjaCAlZCBtb2R1bG8gJXUgIT0gMCAoJWQpXG4iLAogCQkJICAgICAgIGZpZWxkLT5ybWZfbmFtZSwgbGVuLCBmaWVsZC0+cm1mX3NpemUsIGxvYyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCX0gZWxzZSBpZiAocGlsbC0+cmNfYXJlYVtsb2NdW29mZnNldF0gIT0gLTEpIHsKIAkJbGVuID0gcGlsbC0+cmNfYXJlYVtsb2NdW29mZnNldF07CiAJfSBlbHNlIHsKLQkJbGVuID0gbWF4KGZpZWxkLT5ybWZfc2l6ZSwgMCk7CisJCWxlbiA9IG1heF90KHR5cGVvZihmaWVsZC0+cm1mX3NpemUpLCBmaWVsZC0+cm1mX3NpemUsIDApOwogCX0KIAl2YWx1ZSA9IGdldHRlcihtc2csIG9mZnNldCwgbGVuKTsKIAogCWlmICghdmFsdWUpIHsKIAkJREVCVUdfUkVRKERfRVJST1IsIHBpbGwtPnJjX3JlcSwKLQkJCSAgIldyb25nIGJ1ZmZlciBmb3IgZmllbGQgYCVzJyAoJWQgb2YgJWQpIGluIGZvcm1hdCBgJXMnOiAlZCB2cy4gJWQgKCVzKVxuIiwKKwkJCSAgIldyb25nIGJ1ZmZlciBmb3IgZmllbGQgYCVzJyAoJXUgb2YgJXUpIGluIGZvcm1hdCBgJXMnOiAldSB2cy4gJXUgKCVzKVxuIiwKIAkJCSAgZmllbGQtPnJtZl9uYW1lLCBvZmZzZXQsIGx1c3RyZV9tc2dfYnVmY291bnQobXNnKSwKIAkJCSAgZm10LT5yZl9uYW1lLCBsdXN0cmVfbXNnX2J1Zmxlbihtc2csIG9mZnNldCksIGxlbiwKIAkJCSAgcmNsX25hbWVzW2xvY10pOwpAQCAtMTk1OCw3ICsxOTQwLDcgQEAKICAqLwogdm9pZCAqcmVxX2NhcHN1bGVfY2xpZW50X3NpemVkX2dldChzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQkJICAgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJCSAgIGludCBsZW4pCisJCQkJICAgdTMyIGxlbikKIHsKIAlyZXFfY2Fwc3VsZV9zZXRfc2l6ZShwaWxsLCBmaWVsZCwgUkNMX0NMSUVOVCwgbGVuKTsKIAlyZXR1cm4gX19yZXFfY2Fwc3VsZV9nZXQocGlsbCwgZmllbGQsIFJDTF9DTElFTlQsIE5VTEwsIDApOwpAQCAtMTk5OSw3ICsxOTgxLDcgQEAKICAqLwogdm9pZCAqcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX2dldChzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQkJICAgY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJCSAgIGludCBsZW4pCisJCQkJICAgdTMyIGxlbikKIHsKIAlyZXFfY2Fwc3VsZV9zZXRfc2l6ZShwaWxsLCBmaWVsZCwgUkNMX1NFUlZFUiwgbGVuKTsKIAlyZXR1cm4gX19yZXFfY2Fwc3VsZV9nZXQocGlsbCwgZmllbGQsIFJDTF9TRVJWRVIsIE5VTEwsIDApOwpAQCAtMjAwOCw3ICsxOTkwLDcgQEAKIAogdm9pZCAqcmVxX2NhcHN1bGVfc2VydmVyX3NpemVkX3N3YWJfZ2V0KHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwKIAkJCQkJY29uc3Qgc3RydWN0IHJlcV9tc2dfZmllbGQgKmZpZWxkLAotCQkJCQlpbnQgbGVuLCB2b2lkICpzd2FiYmVyKQorCQkJCQl1MzIgbGVuLCB2b2lkICpzd2FiYmVyKQogewogCXJlcV9jYXBzdWxlX3NldF9zaXplKHBpbGwsIGZpZWxkLCBSQ0xfU0VSVkVSLCBsZW4pOwogCXJldHVybiBfX3JlcV9jYXBzdWxlX2dldChwaWxsLCBmaWVsZCwgUkNMX1NFUlZFUiwgc3dhYmJlciwgMCk7CkBAIC0yMDI0LDIzICsyMDA2LDI1IEBACiAgKi8KIHZvaWQgcmVxX2NhcHN1bGVfc2V0X3NpemUoc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJICBjb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCi0JCQkgIGVudW0gcmVxX2xvY2F0aW9uIGxvYywgaW50IHNpemUpCisJCQkgIGVudW0gcmVxX2xvY2F0aW9uIGxvYywgdTMyIHNpemUpCiB7CiAJTEFTU0VSVChsb2MgPT0gUkNMX1NFUlZFUiB8fCBsb2MgPT0gUkNMX0NMSUVOVCk7CiAKLQlpZiAoKHNpemUgIT0gZmllbGQtPnJtZl9zaXplKSAmJgorCWlmICgoc2l6ZSAhPSAodTMyKWZpZWxkLT5ybWZfc2l6ZSkgJiYKIAkgICAgKGZpZWxkLT5ybWZfc2l6ZSAhPSAtMSkgJiYKIAkgICAgIShmaWVsZC0+cm1mX2ZsYWdzICYgUk1GX0ZfTk9fU0laRV9DSEVDSykgJiYKIAkgICAgKHNpemUgPiAwKSkgeworCQl1MzIgcm1mX3NpemUgPSAodTMyKWZpZWxkLT5ybWZfc2l6ZTsKKwogCQlpZiAoKGZpZWxkLT5ybWZfZmxhZ3MgJiBSTUZfRl9TVFJVQ1RfQVJSQVkpICYmCi0JCSAgICAoc2l6ZSAlIGZpZWxkLT5ybWZfc2l6ZSAhPSAwKSkgewotCQkJQ0VSUk9SKCIlczogYXJyYXkgZmllbGQgc2l6ZSBtaXNtYXRjaCAlZCAlJSAlZCAhPSAwICglZClcbiIsCi0JCQkgICAgICAgZmllbGQtPnJtZl9uYW1lLCBzaXplLCBmaWVsZC0+cm1mX3NpemUsIGxvYyk7CisJCSAgICAoc2l6ZSAlIHJtZl9zaXplICE9IDApKSB7CisJCQlDRVJST1IoIiVzOiBhcnJheSBmaWVsZCBzaXplIG1pc21hdGNoICV1ICUlICV1ICE9IDAgKCVkKVxuIiwKKwkJCSAgICAgICBmaWVsZC0+cm1mX25hbWUsIHNpemUsIHJtZl9zaXplLCBsb2MpOwogCQkJTEJVRygpOwogCQl9IGVsc2UgaWYgKCEoZmllbGQtPnJtZl9mbGFncyAmIFJNRl9GX1NUUlVDVF9BUlJBWSkgJiYKLQkJICAgIHNpemUgPCBmaWVsZC0+cm1mX3NpemUpIHsKLQkJCUNFUlJPUigiJXM6IGZpZWxkIHNpemUgbWlzbWF0Y2ggJWQgIT0gJWQgKCVkKVxuIiwKLQkJCSAgICAgICBmaWVsZC0+cm1mX25hbWUsIHNpemUsIGZpZWxkLT5ybWZfc2l6ZSwgbG9jKTsKKwkJCSAgIHNpemUgPCBybWZfc2l6ZSkgeworCQkJQ0VSUk9SKCIlczogZmllbGQgc2l6ZSBtaXNtYXRjaCAldSAhPSAldSAoJWQpXG4iLAorCQkJICAgICAgIGZpZWxkLT5ybWZfbmFtZSwgc2l6ZSwgcm1mX3NpemUsIGxvYyk7CiAJCQlMQlVHKCk7CiAJCX0KIAl9CkBAIC0yMDU3LDcgKzIwNDEsNyBAQAogICogYWN0dWFsbHkgc2V0cyB0aGUgc2l6ZSBpbiBwaWxsLnJjX2FyZWFbbG9jXVtvZmZzZXRdLCBidXQgdGhpcyBmdW5jdGlvbgogICogcmV0dXJucyB0aGUgbWVzc2FnZSBidWZsZW5bb2Zmc2V0XSwgbWF5YmUgd2Ugc2hvdWxkIHVzZSBhbm90aGVyIG5hbWUuCiAgKi8KLWludCByZXFfY2Fwc3VsZV9nZXRfc2l6ZShjb25zdCBzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCit1MzIgcmVxX2NhcHN1bGVfZ2V0X3NpemUoY29uc3Qgc3RydWN0IHJlcV9jYXBzdWxlICpwaWxsLAogCQkJIGNvbnN0IHN0cnVjdCByZXFfbXNnX2ZpZWxkICpmaWVsZCwKIAkJCSBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpCiB7CkBAIC0yMDc1LDcgKzIwNTksNyBAQAogICoKICAqIFNlZSBhbHNvIHJlcV9jYXBzdWxlX3NldF9zaXplKCkuCiAgKi8KLWludCByZXFfY2Fwc3VsZV9tc2dfc2l6ZShzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsIGVudW0gcmVxX2xvY2F0aW9uIGxvYykKK3UzMiByZXFfY2Fwc3VsZV9tc2dfc2l6ZShzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsIGVudW0gcmVxX2xvY2F0aW9uIGxvYykKIHsKIAlyZXR1cm4gbHVzdHJlX21zZ19zaXplKHBpbGwtPnJjX3JlcS0+cnFfaW1wb3J0LT5pbXBfbXNnX21hZ2ljLAogCQkJICAgICAgIHBpbGwtPnJjX2ZtdC0+cmZfZmllbGRzW2xvY10ubnIsCkBAIC0yMDkwLDEwICsyMDc0LDExIEBACiAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgZm9ybWF0cyB3aGljaCBjb250YWluIHZhcmlhYmxlIHNpemUKICAqIGZpZWxkcy4KICAqLwotaW50IHJlcV9jYXBzdWxlX2ZtdF9zaXplKF9fdTMyIG1hZ2ljLCBjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10LAordTMyIHJlcV9jYXBzdWxlX2ZtdF9zaXplKF9fdTMyIG1hZ2ljLCBjb25zdCBzdHJ1Y3QgcmVxX2Zvcm1hdCAqZm10LAogCQkJIGVudW0gcmVxX2xvY2F0aW9uIGxvYykKIHsKLQlpbnQgc2l6ZSwgaSA9IDA7CisJc2l6ZV90IGkgPSAwOworCXUzMiBzaXplOwogCiAJLyoKIAkgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBwcm9iYWJseSBMQVNTRVJUKCkgdGhhdCBmbXQgaGFzIG5vIGZpZWxkcyB3aXRoCkBAIC0yMTAzLDcgKzIwODgsNyBAQAogCSAqIHdlIGRvLgogCSAqLwogCXNpemUgPSBsdXN0cmVfbXNnX2hkcl9zaXplKG1hZ2ljLCBmbXQtPnJmX2ZpZWxkc1tsb2NdLm5yKTsKLQlpZiAoc2l6ZSA8IDApCisJaWYgKCFzaXplKQogCQlyZXR1cm4gc2l6ZTsKIAogCWZvciAoOyBpIDwgZm10LT5yZl9maWVsZHNbbG9jXS5ucjsgKytpKQpAQCAtMjEzNSw3ICsyMTIwLDcgQEAKIHZvaWQgcmVxX2NhcHN1bGVfZXh0ZW5kKHN0cnVjdCByZXFfY2Fwc3VsZSAqcGlsbCwgY29uc3Qgc3RydWN0IHJlcV9mb3JtYXQgKmZtdCkKIHsKIAlpbnQgaTsKLQlpbnQgajsKKwlzaXplX3QgajsKIAogCWNvbnN0IHN0cnVjdCByZXFfZm9ybWF0ICpvbGQ7CiAKQEAgLTIxOTMsNyArMjE3OCw3IEBACiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCiAJCQkJICAgICBlbnVtIHJlcV9sb2NhdGlvbiBsb2MpCiB7Ci0JaW50IG9mZnNldDsKKwl1MzIgb2Zmc2V0OwogCiAJTEFTU0VSVChsb2MgPT0gUkNMX1NFUlZFUiB8fCBsb2MgPT0gUkNMX0NMSUVOVCk7CiAJTEFTU0VSVChyZXFfY2Fwc3VsZV9oYXNfZmllbGQocGlsbCwgZmllbGQsIGxvYykpOwpAQCAtMjIxMCwxMiArMjE5NSwxMSBAQAogICovCiB2b2lkIHJlcV9jYXBzdWxlX3NocmluayhzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCiAJCQljb25zdCBzdHJ1Y3QgcmVxX21zZ19maWVsZCAqZmllbGQsCi0JCQl1bnNpZ25lZCBpbnQgbmV3bGVuLAotCQkJZW51bSByZXFfbG9jYXRpb24gbG9jKQorCQkJdTMyIG5ld2xlbiwgZW51bSByZXFfbG9jYXRpb24gbG9jKQogewogCWNvbnN0IHN0cnVjdCByZXFfZm9ybWF0ICpmbXQ7CiAJc3RydWN0IGx1c3RyZV9tc2cgKm1zZzsKLQlpbnQgbGVuOworCXUzMiBsZW47CiAJaW50IG9mZnNldDsKIAogCWZtdCA9IHBpbGwtPnJjX2ZtdDsKQEAgLTIyMjgsNyArMjIxMiw3IEBACiAKIAltc2cgPSBfX3JlcV9tc2cocGlsbCwgbG9jKTsKIAlsZW4gPSBsdXN0cmVfbXNnX2J1Zmxlbihtc2csIG9mZnNldCk7Ci0JTEFTU0VSVEYobmV3bGVuIDw9IGxlbiwgIiVzOiVzLCBvbGRsZW49JWQsIG5ld2xlbj0lZFxuIiwKKwlMQVNTRVJURihuZXdsZW4gPD0gbGVuLCAiJXM6JXMsIG9sZGxlbj0ldSwgbmV3bGVuPSV1XG4iLAogCQkgZm10LT5yZl9uYW1lLCBmaWVsZC0+cm1mX25hbWUsIGxlbiwgbmV3bGVuKTsKIAogCWlmIChsb2MgPT0gUkNMX0NMSUVOVCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYwppbmRleCBiYzkzYjc1Li45YmFkNTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbHByb2NfcHRscnBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xwcm9jX3B0bHJwYy5jCkBAIC0xOTEsNyArMTkxLDcgQEAKIAlMQVNTRVJUKCEqZGVidWdmc19yb290X3JldCk7CiAJTEFTU0VSVCghKnN0YXRzX3JldCk7CiAKLQlzdmNfc3RhdHMgPSBscHJvY2ZzX2FsbG9jX3N0YXRzKEVYVFJBX01BWF9PUENPREVTK0xVU1RSRV9NQVhfT1BDT0RFUywKKwlzdmNfc3RhdHMgPSBscHJvY2ZzX2FsbG9jX3N0YXRzKEVYVFJBX01BWF9PUENPREVTICsgTFVTVFJFX01BWF9PUENPREVTLAogCQkJCQkwKTsKIAlpZiAoIXN2Y19zdGF0cykKIAkJcmV0dXJuOwpAQCAtOTM3LDcgKzkzNyw3IEBACiBzdGF0aWMgaW50CiBwdGxycGNfbHByb2Nmc19zdmNfcmVxX2hpc3Rvcnlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHNvcHMgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzb3BzID0gewogCQkuc3RhcnQgPSBwdGxycGNfbHByb2Nmc19zdmNfcmVxX2hpc3Rvcnlfc3RhcnQsCiAJCS5zdG9wICA9IHB0bHJwY19scHJvY2ZzX3N2Y19yZXFfaGlzdG9yeV9zdG9wLAogCQkubmV4dCAgPSBwdGxycGNfbHByb2Nmc19zdmNfcmVxX2hpc3RvcnlfbmV4dCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYwppbmRleCAxMWVjODI1Li45YzkzNzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbmlvYnVmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25pb2J1Zi5jCkBAIC0yOTUsNyArMjk1LDYgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY191bnJlZ2lzdGVyX2J1bGspOwogCiBzdGF0aWMgdm9pZCBwdGxycGNfYXRfc2V0X3JlcGx5KHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgZmxhZ3MpCiB7CkBAIC0zOTgsNyArMzk3LDggQEAKIAlsdXN0cmVfbXNnX3NldF9zdGF0dXMocmVxLT5ycV9yZXBtc2csCiAJCQkgICAgICBwdGxycGNfc3RhdHVzX2h0b24ocmVxLT5ycV9zdGF0dXMpKTsKIAlsdXN0cmVfbXNnX3NldF9vcGMocmVxLT5ycV9yZXBtc2csCi0JCXJlcS0+cnFfcmVxbXNnID8gbHVzdHJlX21zZ19nZXRfb3BjKHJlcS0+cnFfcmVxbXNnKSA6IDApOworCQkJICAgcmVxLT5ycV9yZXFtc2cgPworCQkJICAgbHVzdHJlX21zZ19nZXRfb3BjKHJlcS0+cnFfcmVxbXNnKSA6IDApOwogCiAJdGFyZ2V0X3BhY2tfcG9vbF9yZXBseShyZXEpOwogCkBAIC00MzMsNyArNDMzLDYgQEAKIAlwdGxycGNfY29ubmVjdGlvbl9wdXQoY29ubik7CiAJcmV0dXJuIHJjOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfc2VuZF9yZXBseSk7CiAKIGludCBwdGxycGNfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCiB7CkBAIC00NDEsNyArNDQwLDYgQEAKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIHB0bHJwY19zZW5kX3JlcGx5KHJlcSwgMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19yZXBseSk7CiAKIC8qKgogICogRm9yIHJlcXVlc3QgXGEgcmVxIHNlbmQgYW4gZXJyb3IgcmVwbHkgYmFjay4gQ3JlYXRlIGVtcHR5CkBAIC00NjgsMTMgKzQ2NiwxMSBAQAogCXJjID0gcHRscnBjX3NlbmRfcmVwbHkocmVxLCBtYXlfYmVfZGlmZmljdWx0KTsKIAlyZXR1cm4gcmM7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19zZW5kX2Vycm9yKTsKIAogaW50IHB0bHJwY19lcnJvcihzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKIHsKIAlyZXR1cm4gcHRscnBjX3NlbmRfZXJyb3IocmVxLCAwKTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2Vycm9yKTsKIAogLyoqCiAgKiBTZW5kIHJlcXVlc3QgXGEgcmVxdWVzdC4KQEAgLTQ5MCw3ICs0ODYsOCBAQAogCXN0cnVjdCBwdGxycGNfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKIAlsbmV0X2hhbmRsZV9tZV90IHJlcGx5X21lX2g7CiAJbG5ldF9tZF90IHJlcGx5X21kOwotCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSByZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9vYmQ7CisJc3RydWN0IG9iZF9pbXBvcnQgKmltcCA9IHJlcXVlc3QtPnJxX2ltcG9ydDsKKwlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gaW1wLT5pbXBfb2JkOwogCiAJaWYgKE9CRF9GQUlMX0NIRUNLKE9CRF9GQUlMX1BUTFJQQ19EUk9QX1JQQykpCiAJCXJldHVybiAwOwpAQCAtNTAzLDcgKzUwMCw3IEBACiAJICovCiAJTEFTU0VSVCghcmVxdWVzdC0+cnFfcmVjZWl2aW5nX3JlcGx5KTsKIAlMQVNTRVJUKCEoKGx1c3RyZV9tc2dfZ2V0X2ZsYWdzKHJlcXVlc3QtPnJxX3JlcW1zZykgJiBNU0dfUkVQTEFZKSAmJgotCQkgIChyZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9zdGF0ZSA9PSBMVVNUUkVfSU1QX0ZVTEwpKSk7CisJCSAgKGltcC0+aW1wX3N0YXRlID09IExVU1RSRV9JTVBfRlVMTCkpKTsKIAogCWlmICh1bmxpa2VseShvYmQgJiYgb2JkLT5vYmRfZmFpbCkpIHsKIAkJQ0RFQlVHKERfSEEsICJtdXRpbmcgcnBjIGZvciBmYWlsZWQgaW1wIG9iZCAlc1xuIiwKQEAgLTUxNiwxNSArNTEzLDIyIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWNvbm5lY3Rpb24gPSByZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9jb25uZWN0aW9uOworCWNvbm5lY3Rpb24gPSBpbXAtPmltcF9jb25uZWN0aW9uOwogCiAJbHVzdHJlX21zZ19zZXRfaGFuZGxlKHJlcXVlc3QtPnJxX3JlcW1zZywKLQkJCSAgICAgICZyZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9yZW1vdGVfaGFuZGxlKTsKKwkJCSAgICAgICZpbXAtPmltcF9yZW1vdGVfaGFuZGxlKTsKIAlsdXN0cmVfbXNnX3NldF90eXBlKHJlcXVlc3QtPnJxX3JlcW1zZywgUFRMX1JQQ19NU0dfUkVRVUVTVCk7Ci0JbHVzdHJlX21zZ19zZXRfY29ubl9jbnQocmVxdWVzdC0+cnFfcmVxbXNnLAotCQkJCXJlcXVlc3QtPnJxX2ltcG9ydC0+aW1wX2Nvbm5fY250KTsKLQlsdXN0cmVfbXNnaGRyX3NldF9mbGFncyhyZXF1ZXN0LT5ycV9yZXFtc2csCi0JCQkJcmVxdWVzdC0+cnFfaW1wb3J0LT5pbXBfbXNnaGRyX2ZsYWdzKTsKKwlsdXN0cmVfbXNnX3NldF9jb25uX2NudChyZXF1ZXN0LT5ycV9yZXFtc2csIGltcC0+aW1wX2Nvbm5fY250KTsKKwlsdXN0cmVfbXNnaGRyX3NldF9mbGFncyhyZXF1ZXN0LT5ycV9yZXFtc2csIGltcC0+aW1wX21zZ2hkcl9mbGFncyk7CisKKwkvKioKKwkgKiBGb3IgZW5hYmxlZCBBVCBhbGwgcmVxdWVzdCBzaG91bGQgaGF2ZSBBVF9TVVBQT1JUIGluIHRoZQorCSAqIEZVTEwgaW1wb3J0IHN0YXRlIHdoZW4gT0JEX0NPTk5FQ1RfQVQgaXMgc2V0CisJICovCisJTEFTU0VSVChBVF9PRkYgfHwgaW1wLT5pbXBfc3RhdGUgIT0gTFVTVFJFX0lNUF9GVUxMIHx8CisJCShpbXAtPmltcF9tc2doZHJfZmxhZ3MgJiBNU0dIRFJfQVRfU1VQUE9SVCkgfHwKKwkJIShpbXAtPmltcF9jb25uZWN0X2RhdGEub2NkX2Nvbm5lY3RfZmxhZ3MgJgorCQlPQkRfQ09OTkVDVF9BVCkpOwogCiAJaWYgKHJlcXVlc3QtPnJxX3Jlc2VuZCkKIAkJbHVzdHJlX21zZ19hZGRfZmxhZ3MocmVxdWVzdC0+cnFfcmVxbXNnLCBNU0dfUkVTRU5UKTsKQEAgLTYyOCw3ICs2MzIsNyBAQAogCXB0bHJwY19yZXF1ZXN0X2FkZHJlZihyZXF1ZXN0KTsKIAlpZiAob2JkICYmIG9iZC0+b2JkX3N2Y19zdGF0cykKIAkJbHByb2Nmc19jb3VudGVyX2FkZChvYmQtPm9iZF9zdmNfc3RhdHMsIFBUTFJQQ19SRVFBQ1RJVkVfQ05UUiwKLQkJCWF0b21pY19yZWFkKCZyZXF1ZXN0LT5ycV9pbXBvcnQtPmltcF9pbmZsaWdodCkpOworCQkJYXRvbWljX3JlYWQoJmltcC0+aW1wX2luZmxpZ2h0KSk7CiAKIAlPQkRfRkFJTF9USU1FT1VUKE9CRF9GQUlMX1BUTFJQQ19ERUxBWV9TRU5ELCByZXF1ZXN0LT5ycV90aW1lb3V0ICsgNSk7CiAKQEAgLTY0MCw3ICs2NDQsNyBAQAogCXJlcXVlc3QtPnJxX2RlYWRsaW5lID0gcmVxdWVzdC0+cnFfc2VudCArIHJlcXVlc3QtPnJxX3RpbWVvdXQgKwogCQlwdGxycGNfYXRfZ2V0X25ldF9sYXRlbmN5KHJlcXVlc3QpOwogCi0JcHRscnBjX3Bpbmdlcl9zZW5kaW5nX29uX2ltcG9ydChyZXF1ZXN0LT5ycV9pbXBvcnQpOworCXB0bHJwY19waW5nZXJfc2VuZGluZ19vbl9pbXBvcnQoaW1wKTsKIAogCURFQlVHX1JFUShEX0lORk8sIHJlcXVlc3QsICJzZW5kIGZsZz0leCIsCiAJCSAgbHVzdHJlX21zZ19nZXRfZmxhZ3MocmVxdWVzdC0+cnFfcmVxbXNnKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGFja19nZW5lcmljLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGFja19nZW5lcmljLmMKaW5kZXggYjUxNGYxOC4uODcxNzY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wYWNrX2dlbmVyaWMuYwpAQCAtNTAsMzYgKzUwLDM0IEBACiAKICNpbmNsdWRlICJwdGxycGNfaW50ZXJuYWwuaCIKIAotc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX21zZ19oZHJfc2l6ZV92MihpbnQgY291bnQpCitzdGF0aWMgaW5saW5lIHUzMiBsdXN0cmVfbXNnX2hkcl9zaXplX3YyKHUzMiBjb3VudCkKIHsKIAlyZXR1cm4gY2ZzX3NpemVfcm91bmQob2Zmc2V0b2Yoc3RydWN0IGx1c3RyZV9tc2dfdjIsCiAJCQkJICAgICAgIGxtX2J1ZmxlbnNbY291bnRdKSk7CiB9CiAKLWludCBsdXN0cmVfbXNnX2hkcl9zaXplKF9fdTMyIG1hZ2ljLCBpbnQgY291bnQpCit1MzIgbHVzdHJlX21zZ19oZHJfc2l6ZShfX3UzMiBtYWdpYywgdTMyIGNvdW50KQogewogCXN3aXRjaCAobWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6CiAJCXJldHVybiBsdXN0cmVfbXNnX2hkcl9zaXplX3YyKGNvdW50KTsKIAlkZWZhdWx0OgogCQlMQVNTRVJURigwLCAiaW5jb3JyZWN0IG1lc3NhZ2UgbWFnaWM6ICUwOHhcbiIsIG1hZ2ljKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19oZHJfc2l6ZSk7CiAKIHZvaWQgcHRscnBjX2J1Zl9zZXRfc3dhYmJlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgY29uc3QgaW50IGlub3V0LAotCQkJICAgIGludCBpbmRleCkKKwkJCSAgICB1MzIgaW5kZXgpCiB7CiAJaWYgKGlub3V0KQogCQlsdXN0cmVfc2V0X3JlcV9zd2FiYmVkKHJlcSwgaW5kZXgpOwogCWVsc2UKIAkJbHVzdHJlX3NldF9yZXBfc3dhYmJlZChyZXEsIGluZGV4KTsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX2J1Zl9zZXRfc3dhYmJlZCk7CiAKIGludCBwdGxycGNfYnVmX25lZWRfc3dhYihzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgY29uc3QgaW50IGlub3V0LAotCQkJIGludCBpbmRleCkKKwkJCSB1MzIgaW5kZXgpCiB7CiAJaWYgKGlub3V0KQogCQlyZXR1cm4gKHB0bHJwY19yZXFfbmVlZF9zd2FiKHJlcSkgJiYKQEAgLTg4LDEyICs4NiwxMSBAQAogCQlyZXR1cm4gKHB0bHJwY19yZXBfbmVlZF9zd2FiKHJlcSkgJiYKIAkJCSFsdXN0cmVfcmVwX3N3YWJiZWQocmVxLCBpbmRleCkpOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfYnVmX25lZWRfc3dhYik7CiAKIC8qIGVhcmx5IHJlcGx5IHNpemUgKi8KLWludCBsdXN0cmVfbXNnX2Vhcmx5X3NpemUodm9pZCkKK3UzMiBsdXN0cmVfbXNnX2Vhcmx5X3NpemUodm9pZCkKIHsKLQlzdGF0aWMgaW50IHNpemU7CisJc3RhdGljIHUzMiBzaXplOwogCiAJaWYgKCFzaXplKSB7CiAJCS8qIEFsd2F5cyByZXBseSBvbGQgcHRscnBjX2JvZHlfdjIgdG8ga2VlcCBpbnRlcm9wZXJhYmlsaXR5CkBAIC0xMTEsOSArMTA4LDkgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19lYXJseV9zaXplKTsKIAotaW50IGx1c3RyZV9tc2dfc2l6ZV92MihpbnQgY291bnQsIF9fdTMyICpsZW5ndGhzKQordTMyIGx1c3RyZV9tc2dfc2l6ZV92MihpbnQgY291bnQsIF9fdTMyICpsZW5ndGhzKQogewotCWludCBzaXplOworCXUzMiBzaXplOwogCWludCBpOwogCiAJc2l6ZSA9IGx1c3RyZV9tc2dfaGRyX3NpemVfdjIoY291bnQpOwpAQCAtMTMxLDcgKzEyOCw3IEBACiAgKiAgICAgICB0YXJnZXQgdGhlbiB0aGUgZmlyc3QgYnVmZmVyIHdpbGwgYmUgc3RyaXBwZWQgYmVjYXVzZSB0aGUgcHRscnBjCiAgKiAgICAgICBkYXRhIGlzIHBhcnQgb2YgdGhlIGx1c3RyZV9tc2dfdjEgaGVhZGVyLiBiPTE0MDQzCiAgKi8KLWludCBsdXN0cmVfbXNnX3NpemUoX191MzIgbWFnaWMsIGludCBjb3VudCwgX191MzIgKmxlbnMpCit1MzIgbHVzdHJlX21zZ19zaXplKF9fdTMyIG1hZ2ljLCBpbnQgY291bnQsIF9fdTMyICpsZW5zKQogewogCV9fdTMyIHNpemVbXSA9IHsgc2l6ZW9mKHN0cnVjdCBwdGxycGNfYm9keSkgfTsKIApAQCAtMTQ4LDE1ICsxNDUsMTQgQEAKIAkJcmV0dXJuIGx1c3RyZV9tc2dfc2l6ZV92Mihjb3VudCwgbGVucyk7CiAJZGVmYXVsdDoKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtYWdpYyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfc2l6ZSk7CiAKIC8qIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHNpemUgb2YgYSBidWZmZXIgdGhhdCB3YXMgYWxyZWFkeSBwYWNrZWQKICAqIGFuZCB3aWxsIGNvcnJlY3RseSBoYW5kbGUgdGhlIGRpZmZlcmVudCBtZXNzYWdlIGZvcm1hdHMuCiAgKi8KLWludCBsdXN0cmVfcGFja2VkX21zZ19zaXplKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpCit1MzIgbHVzdHJlX3BhY2tlZF9tc2dfc2l6ZShzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKQogewogCXN3aXRjaCAobXNnLT5sbV9tYWdpYykgewogCWNhc2UgTFVTVFJFX01TR19NQUdJQ19WMjoKQEAgLTE2Niw3ICsxNjIsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9wYWNrZWRfbXNnX3NpemUpOwogCiB2b2lkIGx1c3RyZV9pbml0X21zZ192MihzdHJ1Y3QgbHVzdHJlX21zZ192MiAqbXNnLCBpbnQgY291bnQsIF9fdTMyICpsZW5zLAogCQkJY2hhciAqKmJ1ZnMpCkBAIC0yMjcsNyArMjIyLDYgQEAKIAkvKiBvbmx5IHVzZSBuZXcgZm9ybWF0LCB3ZSBkb24ndCBuZWVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCAxLjQgKi8KIAlyZXR1cm4gbHVzdHJlX3BhY2tfcmVxdWVzdF92MihyZXEsIGNvdW50LCBsZW5zLCBidWZzKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3BhY2tfcmVxdWVzdCk7CiAKICNpZiBSU19ERUJVRwogTElTVF9IRUFEKHB0bHJwY19yc19kZWJ1Z19scnUpOwpAQCAtMzY5LDcgKzM2Myw2IEBACiAJCSAgICAgICBsdXN0cmVfbXNnX3NpemUocmVxLT5ycV9yZXFtc2ctPmxtX21hZ2ljLCBjb3VudCwgbGVucykpOwogCXJldHVybiByYzsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3BhY2tfcmVwbHlfZmxhZ3MpOwogCiBpbnQgbHVzdHJlX3BhY2tfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBjb3VudCwgX191MzIgKmxlbnMsCiAJCSAgICAgIGNoYXIgKipidWZzKQpAQCAtMzc4LDExICszNzEsOSBAQAogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfcGFja19yZXBseSk7CiAKLXZvaWQgKmx1c3RyZV9tc2dfYnVmX3YyKHN0cnVjdCBsdXN0cmVfbXNnX3YyICptLCBpbnQgbiwgaW50IG1pbl9zaXplKQordm9pZCAqbHVzdHJlX21zZ19idWZfdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm0sIHUzMiBuLCB1MzIgbWluX3NpemUpCiB7Ci0JaW50IGksIG9mZnNldCwgYnVmbGVuLCBidWZjb3VudDsKLQotCUxBU1NFUlQobiA+PSAwKTsKKwl1MzIgaSwgb2Zmc2V0LCBidWZsZW4sIGJ1ZmNvdW50OwogCiAJYnVmY291bnQgPSBtLT5sbV9idWZjb3VudDsKIAlpZiAodW5saWtlbHkobiA+PSBidWZjb3VudCkpIHsKQEAgLTQwNiw3ICszOTcsNyBAQAogCXJldHVybiAoY2hhciAqKW0gKyBvZmZzZXQ7CiB9CiAKLXZvaWQgKmx1c3RyZV9tc2dfYnVmKHN0cnVjdCBsdXN0cmVfbXNnICptLCBpbnQgbiwgaW50IG1pbl9zaXplKQordm9pZCAqbHVzdHJlX21zZ19idWYoc3RydWN0IGx1c3RyZV9tc2cgKm0sIHUzMiBuLCB1MzIgbWluX3NpemUpCiB7CiAJc3dpdGNoIChtLT5sbV9tYWdpYykgewogCWNhc2UgTFVTVFJFX01TR19NQUdJQ19WMjoKQEAgLTQxOSw3ICs0MTAsNyBAQAogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2J1Zik7CiAKLXN0YXRpYyBpbnQgbHVzdHJlX3Nocmlua19tc2dfdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm1zZywgaW50IHNlZ21lbnQsCitzdGF0aWMgaW50IGx1c3RyZV9zaHJpbmtfbXNnX3YyKHN0cnVjdCBsdXN0cmVfbXNnX3YyICptc2csIHUzMiBzZWdtZW50LAogCQkJCXVuc2lnbmVkIGludCBuZXdsZW4sIGludCBtb3ZlX2RhdGEpCiB7CiAJY2hhciAqdGFpbCA9IE5VTEwsICpuZXdwb3M7CkBAIC00OTMsNyArNDg0LDYgQEAKIAogCXNwdGxycGNfc3ZjX2ZyZWVfcnMocnMpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfZnJlZV9yZXBseV9zdGF0ZSk7CiAKIHN0YXRpYyBpbnQgbHVzdHJlX3VucGFja19tc2dfdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm0sIGludCBsZW4pCiB7CkBAIC01ODEsNyArNTcxLDYgQEAKIAl9CiAJcmV0dXJuIHJjOwogfQotRVhQT1JUX1NZTUJPTChwdGxycGNfdW5wYWNrX3JlcV9tc2cpOwogCiBpbnQgcHRscnBjX3VucGFja19yZXBfbXNnKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxLCBpbnQgbGVuKQogewpAQCAtNTk0LDcgKzU4Myw2IEBACiAJfQogCXJldHVybiByYzsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3VucGFja19yZXBfbXNnKTsKIAogc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX3VucGFja19wdGxycGNfYm9keV92MihzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKIAkJCQkJICAgICAgIGNvbnN0IGludCBpbm91dCwgaW50IG9mZnNldCkKQEAgLTY0Nyw3ICs2MzUsNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBpbnQgbHVzdHJlX21zZ19idWZsZW5fdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm0sIGludCBuKQorc3RhdGljIGlubGluZSB1MzIgbHVzdHJlX21zZ19idWZsZW5fdjIoc3RydWN0IGx1c3RyZV9tc2dfdjIgKm0sIHUzMiBuKQogewogCWlmIChuID49IG0tPmxtX2J1ZmNvdW50KQogCQlyZXR1cm4gMDsKQEAgLTY2MiwxNCArNjUwLDE0IEBACiAgKgogICogcmV0dXJucyB6ZXJvIGZvciBub24tZXhpc3RlbnQgbWVzc2FnZSBpbmRpY2VzCiAgKi8KLWludCBsdXN0cmVfbXNnX2J1ZmxlbihzdHJ1Y3QgbHVzdHJlX21zZyAqbSwgaW50IG4pCit1MzIgbHVzdHJlX21zZ19idWZsZW4oc3RydWN0IGx1c3RyZV9tc2cgKm0sIHUzMiBuKQogewogCXN3aXRjaCAobS0+bG1fbWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6CiAJCXJldHVybiBsdXN0cmVfbXNnX2J1Zmxlbl92MihtLCBuKTsKIAlkZWZhdWx0OgogCQlDRVJST1IoImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtLT5sbV9tYWdpYyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gMDsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfYnVmbGVuKTsKQEAgLTY3NywyMyArNjY1LDIyIEBACiAvKiBOQiByZXR1cm4gdGhlIGJ1ZmNvdW50IGZvciBsdXN0cmVfbXNnX3YyIGZvcm1hdCwgc28gaWYgbWVzc2FnZSBpcyBwYWNrZWQKICAqIGluIFYxIGZvcm1hdCwgdGhlIHJlc3VsdCBpcyBvbmUgYmlnZ2VyLiAoYWRkIHN0cnVjdCBwdGxycGNfYm9keSkuCiAgKi8KLWludCBsdXN0cmVfbXNnX2J1ZmNvdW50KHN0cnVjdCBsdXN0cmVfbXNnICptKQordTMyIGx1c3RyZV9tc2dfYnVmY291bnQoc3RydWN0IGx1c3RyZV9tc2cgKm0pCiB7CiAJc3dpdGNoIChtLT5sbV9tYWdpYykgewogCWNhc2UgTFVTVFJFX01TR19NQUdJQ19WMjoKIAkJcmV0dXJuIG0tPmxtX2J1ZmNvdW50OwogCWRlZmF1bHQ6CiAJCUNFUlJPUigiaW5jb3JyZWN0IG1lc3NhZ2UgbWFnaWM6ICUwOHhcbiIsIG0tPmxtX21hZ2ljKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAwOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19idWZjb3VudCk7CiAKLWNoYXIgKmx1c3RyZV9tc2dfc3RyaW5nKHN0cnVjdCBsdXN0cmVfbXNnICptLCBpbnQgaW5kZXgsIGludCBtYXhfbGVuKQorY2hhciAqbHVzdHJlX21zZ19zdHJpbmcoc3RydWN0IGx1c3RyZV9tc2cgKm0sIHUzMiBpbmRleCwgdTMyIG1heF9sZW4pCiB7CiAJLyogbWF4X2xlbiA9PSAwIG1lYW5zIHRoZSBzdHJpbmcgc2hvdWxkIGZpbGwgdGhlIGJ1ZmZlciAqLwogCWNoYXIgKnN0cjsKLQlpbnQgc2xlbiwgYmxlbjsKKwl1MzIgc2xlbiwgYmxlbjsKIAogCXN3aXRjaCAobS0+bG1fbWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6CkBAIC03MzEsMTEgKzcxOCwxMCBAQAogCiAJcmV0dXJuIHN0cjsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19zdHJpbmcpOwogCiAvKiBXcmFwIHVwIHRoZSBub3JtYWwgZml4ZWQgbGVuZ3RoIGNhc2VzICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKl9fbHVzdHJlX3N3YWJfYnVmKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIGludCBpbmRleCwKLQkJCQkgICAgICBpbnQgbWluX3NpemUsIHZvaWQgKnN3YWJiZXIpCitzdGF0aWMgaW5saW5lIHZvaWQgKl9fbHVzdHJlX3N3YWJfYnVmKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIHUzMiBpbmRleCwKKwkJCQkgICAgICB1MzIgbWluX3NpemUsIHZvaWQgKnN3YWJiZXIpCiB7CiAJdm9pZCAqcHRyID0gTlVMTDsKIApAQCAtODA0LDcgKzc5MCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfZ2V0X2ZsYWdzKTsKIAotdm9pZCBsdXN0cmVfbXNnX2FkZF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgZmxhZ3MpCit2b2lkIGx1c3RyZV9tc2dfYWRkX2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIHUzMiBmbGFncykKIHsKIAlzd2l0Y2ggKG1zZy0+bG1fbWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6IHsKQEAgLTgyMCw3ICs4MDYsNyBAQAogfQogRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2FkZF9mbGFncyk7CiAKLXZvaWQgbHVzdHJlX21zZ19zZXRfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgaW50IGZsYWdzKQordm9pZCBsdXN0cmVfbXNnX3NldF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgZmxhZ3MpCiB7CiAJc3dpdGNoIChtc2ctPmxtX21hZ2ljKSB7CiAJY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOiB7CkBAIC04MzQsOSArODIwLDggQEAKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtc2ctPmxtX21hZ2ljKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfc2V0X2ZsYWdzKTsKIAotdm9pZCBsdXN0cmVfbXNnX2NsZWFyX2ZsYWdzKHN0cnVjdCBsdXN0cmVfbXNnICptc2csIGludCBmbGFncykKK3ZvaWQgbHVzdHJlX21zZ19jbGVhcl9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgZmxhZ3MpCiB7CiAJc3dpdGNoIChtc2ctPmxtX21hZ2ljKSB7CiAJY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOiB7CkBAIC04NjgsOSArODUzLDggQEAKIAkJcmV0dXJuIDA7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2dldF9vcF9mbGFncyk7CiAKLXZvaWQgbHVzdHJlX21zZ19hZGRfb3BfZmxhZ3Moc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgaW50IGZsYWdzKQordm9pZCBsdXN0cmVfbXNnX2FkZF9vcF9mbGFncyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgZmxhZ3MpCiB7CiAJc3dpdGNoIChtc2ctPmxtX21hZ2ljKSB7CiAJY2FzZSBMVVNUUkVfTVNHX01BR0lDX1YyOiB7CkBAIC05MDMsNyArODg3LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2dldF9oYW5kbGUpOwogCiBfX3UzMiBsdXN0cmVfbXNnX2dldF90eXBlKHN0cnVjdCBsdXN0cmVfbXNnICptc2cpCiB7CkBAIC05MjQsNyArOTA3LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19nZXRfdHlwZSk7CiAKLXZvaWQgbHVzdHJlX21zZ19hZGRfdmVyc2lvbihzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgdmVyc2lvbikKK3ZvaWQgbHVzdHJlX21zZ19hZGRfdmVyc2lvbihzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCB1MzIgdmVyc2lvbikKIHsKIAlzd2l0Y2ggKG1zZy0+bG1fbWFnaWMpIHsKIAljYXNlIExVU1RSRV9NU0dfTUFHSUNfVjI6IHsKQEAgLTkzOCw3ICs5MjEsNiBAQAogCQlMQVNTRVJURigwLCAiaW5jb3JyZWN0IG1lc3NhZ2UgbWFnaWM6ICUwOHhcbiIsIG1zZy0+bG1fbWFnaWMpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19hZGRfdmVyc2lvbik7CiAKIF9fdTMyIGx1c3RyZV9tc2dfZ2V0X29wYyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKQogewpAQCAtMTA1NSw3ICsxMDM3LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2dldF9zbHYpOwogCiB2b2lkIGx1c3RyZV9tc2dfc2V0X3NsdihzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBfX3U2NCBzbHYpCiB7CkBAIC0xMDc1LDcgKzEwNTYsNiBAQAogCQlyZXR1cm47CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX3NldF9zbHYpOwogCiBfX3UzMiBsdXN0cmVfbXNnX2dldF9saW1pdChzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKQogewpAQCAtMTA5NCw3ICsxMDc0LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX2dldF9saW1pdCk7CiAKIHZvaWQgbHVzdHJlX21zZ19zZXRfbGltaXQoc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgX191NjQgbGltaXQpCiB7CkBAIC0xMTE0LDcgKzEwOTMsNiBAQAogCQlyZXR1cm47CiAJfQogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfbXNnX3NldF9saW1pdCk7CiAKIF9fdTMyIGx1c3RyZV9tc2dfZ2V0X2Nvbm5fY250KHN0cnVjdCBsdXN0cmVfbXNnICptc2cpCiB7CkBAIC0xMTQ1LDcgKzExMjMsNiBAQAogCQlyZXR1cm4gMDsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfZ2V0X21hZ2ljKTsKIAogX191MzIgbHVzdHJlX21zZ19nZXRfdGltZW91dChzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnKQogewpAQCAtMTIwMyw4ICsxMTgwLDkgQEAKIAkJdW5zaWduZWQgaW50IGhzaXplID0gNDsKIAogCQljZnNfY3J5cHRvX2hhc2hfZGlnZXN0KENGU19IQVNIX0FMR19DUkMzMiwgKHVuc2lnbmVkIGNoYXIgKilwYiwKLQkJCQkgICBsdXN0cmVfbXNnX2J1Zmxlbihtc2csIE1TR19QVExSUENfQk9EWV9PRkYpLAotCQkJCSAgIE5VTEwsIDAsICh1bnNpZ25lZCBjaGFyICopJmNyYywgJmhzaXplKTsKKwkJCQkgICAgICAgbHVzdHJlX21zZ19idWZsZW4obXNnLAorCQkJCQkJCSBNU0dfUFRMUlBDX0JPRFlfT0ZGKSwKKwkJCQkgICAgICAgTlVMTCwgMCwgKHVuc2lnbmVkIGNoYXIgKikmY3JjLCAmaHNpemUpOwogCQlyZXR1cm4gY3JjOwogCX0KIAlkZWZhdWx0OgpAQCAtMTIyNyw3ICsxMjA1LDYgQEAKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtc2ctPmxtX21hZ2ljKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfc2V0X2hhbmRsZSk7CiAKIHZvaWQgbHVzdHJlX21zZ19zZXRfdHlwZShzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBfX3UzMiB0eXBlKQogewpAQCAtMTI0Myw3ICsxMjIwLDYgQEAKIAkJTEFTU0VSVEYoMCwgImluY29ycmVjdCBtZXNzYWdlIG1hZ2ljOiAlMDh4XG4iLCBtc2ctPmxtX21hZ2ljKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9tc2dfc2V0X3R5cGUpOwogCiB2b2lkIGx1c3RyZV9tc2dfc2V0X29wYyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBfX3UzMiBvcGMpCiB7CkBAIC0xMjU5LDcgKzEyMzUsNiBAQAogCQlMQVNTRVJURigwLCAiaW5jb3JyZWN0IG1lc3NhZ2UgbWFnaWM6ICUwOHhcbiIsIG1zZy0+bG1fbWFnaWMpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19zZXRfb3BjKTsKIAogdm9pZCBsdXN0cmVfbXNnX3NldF92ZXJzaW9ucyhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBfX3U2NCAqdmVyc2lvbnMpCiB7CkBAIC0xMzI2LDcgKzEzMDEsNiBAQAogCQlMQVNTRVJURigwLCAiaW5jb3JyZWN0IG1lc3NhZ2UgbWFnaWM6ICUwOHhcbiIsIG1zZy0+bG1fbWFnaWMpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX21zZ19zZXRfY29ubl9jbnQpOwogCiB2b2lkIGx1c3RyZV9tc2dfc2V0X3RpbWVvdXQoc3RydWN0IGx1c3RyZV9tc2cgKm1zZywgX191MzIgdGltZW91dCkKIHsKQEAgLTEzNzcsNyArMTM1MSw3IEBACiAJCUxBU1NFUlRGKHBiLCAiaW52YWxpZCBtc2cgJXA6IG5vIHB0bHJwYyBib2R5IVxuIiwgbXNnKTsKIAogCQlpZiAoam9iaWQpCi0JCQltZW1jcHkocGItPnBiX2pvYmlkLCBqb2JpZCwgSk9CU1RBVFNfSk9CSURfU0laRSk7CisJCQltZW1jcHkocGItPnBiX2pvYmlkLCBqb2JpZCwgTFVTVFJFX0pPQklEX1NJWkUpOwogCQllbHNlIGlmIChwYi0+cGJfam9iaWRbMF0gPT0gJ1wwJykKIAkJCWx1c3RyZV9nZXRfam9iaWQocGItPnBiX2pvYmlkKTsKIAkJcmV0dXJuOwpAQCAtMTQ5MSw3ICsxNDY1LDYgQEAKIAkgKi8KIAlDTEFTU0VSVChvZmZzZXRvZih0eXBlb2YoKmIpLCBwYl9qb2JpZCkgIT0gMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX3B0bHJwY19ib2R5KTsKIAogdm9pZCBsdXN0cmVfc3dhYl9jb25uZWN0KHN0cnVjdCBvYmRfY29ubmVjdF9kYXRhICpvY2QpCiB7CkBAIC0xNTkxLDcgKzE1NjQsNiBAQAogCUNMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqb3MpLCBvc19zcGFyZTgpICE9IDApOwogCUNMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqb3MpLCBvc19zcGFyZTkpICE9IDApOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9vYmRfc3RhdGZzKTsKIAogdm9pZCBsdXN0cmVfc3dhYl9vYmRfaW9vYmooc3RydWN0IG9iZF9pb29iaiAqaW9vKQogewpAQCAtMTU5OSwzMyArMTU3MSwyOCBAQAogCV9fc3dhYjMycygmaW9vLT5pb29fbWF4X2Jydyk7CiAJX19zd2FiMzJzKCZpb28tPmlvb19idWZjbnQpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9vYmRfaW9vYmopOwogCiB2b2lkIGx1c3RyZV9zd2FiX25pb2J1Zl9yZW1vdGUoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKm5icikKIHsKLQlfX3N3YWI2NHMoJm5ici0+b2Zmc2V0KTsKLQlfX3N3YWIzMnMoJm5ici0+bGVuKTsKLQlfX3N3YWIzMnMoJm5ici0+ZmxhZ3MpOworCV9fc3dhYjY0cygmbmJyLT5ybmJfb2Zmc2V0KTsKKwlfX3N3YWIzMnMoJm5ici0+cm5iX2xlbik7CisJX19zd2FiMzJzKCZuYnItPnJuYl9mbGFncyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX25pb2J1Zl9yZW1vdGUpOwogCiB2b2lkIGx1c3RyZV9zd2FiX29zdF9ib2R5KHN0cnVjdCBvc3RfYm9keSAqYikKIHsKIAlsdXN0cmVfc3dhYl9vYmRvKCZiLT5vYSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX29zdF9ib2R5KTsKIAogdm9pZCBsdXN0cmVfc3dhYl9vc3RfbGFzdF9pZCh1NjQgKmlkKQogewogCV9fc3dhYjY0cyhpZCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX29zdF9sYXN0X2lkKTsKIAogdm9pZCBsdXN0cmVfc3dhYl9nZW5lcmljXzMycyhfX3UzMiAqdmFsKQogewogCV9fc3dhYjMycyh2YWwpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9nZW5lcmljXzMycyk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfZ2xfZGVzYyh1bmlvbiBsZGxtX2dsX2Rlc2MgKmRlc2MpCiB7CkBAIC0xNjc0LDM3ICsxNjQxLDM2IEBACiAKIHZvaWQgbHVzdHJlX3N3YWJfbWR0X2JvZHkoc3RydWN0IG1kdF9ib2R5ICpiKQogewotCWx1c3RyZV9zd2FiX2x1X2ZpZCgmYi0+ZmlkMSk7Ci0JbHVzdHJlX3N3YWJfbHVfZmlkKCZiLT5maWQyKTsKKwlsdXN0cmVfc3dhYl9sdV9maWQoJmItPm1ib19maWQxKTsKKwlsdXN0cmVfc3dhYl9sdV9maWQoJmItPm1ib19maWQyKTsKIAkvKiBoYW5kbGUgaXMgb3BhcXVlICovCi0JX19zd2FiNjRzKCZiLT52YWxpZCk7Ci0JX19zd2FiNjRzKCZiLT5zaXplKTsKLQlfX3N3YWI2NHMoJmItPm10aW1lKTsKLQlfX3N3YWI2NHMoJmItPmF0aW1lKTsKLQlfX3N3YWI2NHMoJmItPmN0aW1lKTsKLQlfX3N3YWI2NHMoJmItPmJsb2Nrcyk7Ci0JX19zd2FiNjRzKCZiLT5pb2Vwb2NoKTsKLQlfX3N3YWI2NHMoJmItPnRfc3RhdGUpOwotCV9fc3dhYjMycygmYi0+ZnN1aWQpOwotCV9fc3dhYjMycygmYi0+ZnNnaWQpOwotCV9fc3dhYjMycygmYi0+Y2FwYWJpbGl0eSk7Ci0JX19zd2FiMzJzKCZiLT5tb2RlKTsKLQlfX3N3YWIzMnMoJmItPnVpZCk7Ci0JX19zd2FiMzJzKCZiLT5naWQpOwotCV9fc3dhYjMycygmYi0+ZmxhZ3MpOwotCV9fc3dhYjMycygmYi0+cmRldik7Ci0JX19zd2FiMzJzKCZiLT5ubGluayk7Ci0JQ0xBU1NFUlQob2Zmc2V0b2YodHlwZW9mKCpiKSwgdW51c2VkMikgIT0gMCk7Ci0JX19zd2FiMzJzKCZiLT5zdXBwZ2lkKTsKLQlfX3N3YWIzMnMoJmItPmVhZGF0YXNpemUpOwotCV9fc3dhYjMycygmYi0+YWNsc2l6ZSk7Ci0JX19zd2FiMzJzKCZiLT5tYXhfbWRzaXplKTsKLQlfX3N3YWIzMnMoJmItPm1heF9jb29raWVzaXplKTsKLQlfX3N3YWIzMnMoJmItPnVpZF9oKTsKLQlfX3N3YWIzMnMoJmItPmdpZF9oKTsKLQlDTEFTU0VSVChvZmZzZXRvZih0eXBlb2YoKmIpLCBwYWRkaW5nXzUpICE9IDApOworCV9fc3dhYjY0cygmYi0+bWJvX3ZhbGlkKTsKKwlfX3N3YWI2NHMoJmItPm1ib19zaXplKTsKKwlfX3N3YWI2NHMoJmItPm1ib19tdGltZSk7CisJX19zd2FiNjRzKCZiLT5tYm9fYXRpbWUpOworCV9fc3dhYjY0cygmYi0+bWJvX2N0aW1lKTsKKwlfX3N3YWI2NHMoJmItPm1ib19ibG9ja3MpOworCV9fc3dhYjY0cygmYi0+bWJvX2lvZXBvY2gpOworCV9fc3dhYjY0cygmYi0+bWJvX3Rfc3RhdGUpOworCV9fc3dhYjMycygmYi0+bWJvX2ZzdWlkKTsKKwlfX3N3YWIzMnMoJmItPm1ib19mc2dpZCk7CisJX19zd2FiMzJzKCZiLT5tYm9fY2FwYWJpbGl0eSk7CisJX19zd2FiMzJzKCZiLT5tYm9fbW9kZSk7CisJX19zd2FiMzJzKCZiLT5tYm9fdWlkKTsKKwlfX3N3YWIzMnMoJmItPm1ib19naWQpOworCV9fc3dhYjMycygmYi0+bWJvX2ZsYWdzKTsKKwlfX3N3YWIzMnMoJmItPm1ib19yZGV2KTsKKwlfX3N3YWIzMnMoJmItPm1ib19ubGluayk7CisJQ0xBU1NFUlQob2Zmc2V0b2YodHlwZW9mKCpiKSwgbWJvX3VudXNlZDIpICE9IDApOworCV9fc3dhYjMycygmYi0+bWJvX3N1cHBnaWQpOworCV9fc3dhYjMycygmYi0+bWJvX2VhZGF0YXNpemUpOworCV9fc3dhYjMycygmYi0+bWJvX2FjbHNpemUpOworCV9fc3dhYjMycygmYi0+bWJvX21heF9tZHNpemUpOworCV9fc3dhYjMycygmYi0+bWJvX21heF9jb29raWVzaXplKTsKKwlfX3N3YWIzMnMoJmItPm1ib191aWRfaCk7CisJX19zd2FiMzJzKCZiLT5tYm9fZ2lkX2gpOworCUNMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqYiksIG1ib19wYWRkaW5nXzUpICE9IDApOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9tZHRfYm9keSk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbWR0X2lvZXBvY2goc3RydWN0IG1kdF9pb2Vwb2NoICpiKQogewpAQCAtMTcxMyw3ICsxNjc5LDYgQEAKIAkgX19zd2FiMzJzKCZiLT5mbGFncyk7CiAJIENMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqYiksIHBhZGRpbmcpICE9IDApOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9tZHRfaW9lcG9jaCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbWdzX3RhcmdldF9pbmZvKHN0cnVjdCBtZ3NfdGFyZ2V0X2luZm8gKm10aSkKIHsKQEAgLTE3MjksMTEgKzE2OTQsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTVRJX05JRFNfTUFYOyBpKyspCiAJCV9fc3dhYjY0cygmbXRpLT5tdGlfbmlkc1tpXSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX21nc190YXJnZXRfaW5mbyk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbWdzX25pZHRibF9lbnRyeShzdHJ1Y3QgbWdzX25pZHRibF9lbnRyeSAqZW50cnkpCiB7Ci0JaW50IGk7CisJX191OCBpOwogCiAJX19zd2FiNjRzKCZlbnRyeS0+bW5lX3ZlcnNpb24pOwogCV9fc3dhYjMycygmZW50cnktPm1uZV9pbnN0YW5jZSk7CkBAIC0xNzYwLDE0ICsxNzI0LDEyIEBACiAJX19zd2FiMzJzKCZib2R5LT5tY2JfdW5pdHMpOwogCV9fc3dhYjE2cygmYm9keS0+bWNiX3R5cGUpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9tZ3NfY29uZmlnX2JvZHkpOwogCiB2b2lkIGx1c3RyZV9zd2FiX21nc19jb25maWdfcmVzKHN0cnVjdCBtZ3NfY29uZmlnX3JlcyAqYm9keSkKIHsKIAlfX3N3YWI2NHMoJmJvZHktPm1jcl9vZmZzZXQpOwogCV9fc3dhYjY0cygmYm9keS0+bWNyX3NpemUpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9tZ3NfY29uZmlnX3Jlcyk7CiAKIHN0YXRpYyB2b2lkIGx1c3RyZV9zd2FiX29iZF9kcWluZm8oc3RydWN0IG9iZF9kcWluZm8gKmkpCiB7CkBAIC0xODAwLDcgKzE3NjIsNiBAQAogCWx1c3RyZV9zd2FiX29iZF9kcWluZm8oJnEtPnFjX2RxaW5mbyk7CiAJbHVzdHJlX3N3YWJfb2JkX2RxYmxrKCZxLT5xY19kcWJsayk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX29iZF9xdW90YWN0bCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfZmlkMnBhdGgoc3RydWN0IGdldGluZm9fZmlkMnBhdGggKmdmKQogewpAQCAtMTgyMiw3ICsxNzgzLDcgQEAKIAogdm9pZCBsdXN0cmVfc3dhYl9maWVtYXAoc3RydWN0IGxsX3VzZXJfZmllbWFwICpmaWVtYXApCiB7Ci0JaW50IGk7CisJX191MzIgaTsKIAogCV9fc3dhYjY0cygmZmllbWFwLT5mbV9zdGFydCk7CiAJX19zd2FiNjRzKCZmaWVtYXAtPmZtX2xlbmd0aCk7CkBAIC0xODM0LDcgKzE3OTUsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBmaWVtYXAtPmZtX21hcHBlZF9leHRlbnRzOyBpKyspCiAJCWx1c3RyZV9zd2FiX2ZpZW1hcF9leHRlbnQoJmZpZW1hcC0+Zm1fZXh0ZW50c1tpXSk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2ZpZW1hcCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbWR0X3JlY19yZWludCAoc3RydWN0IG1kdF9yZWNfcmVpbnQgKnJyKQogewpAQCAtMTg2Myw3ICsxODIzLDYgQEAKIAogCUNMQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqcnIpLCBycl9wYWRkaW5nXzQpICE9IDApOwogfTsKLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbWR0X3JlY19yZWludCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbG92X2Rlc2Moc3RydWN0IGxvdl9kZXNjICpsZCkKIHsKQEAgLTE4NzgsMTkgKzE4MzcsNDMgQEAKIH0KIEVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbG92X2Rlc2MpOwogCi1zdGF0aWMgdm9pZCBwcmludF9sdW0oc3RydWN0IGxvdl91c2VyX21kICpsdW0pCisvKiBUaGlzIHN0cnVjdHVyZSBpcyBhbHdheXMgaW4gbGl0dGxlLWVuZGlhbiAqLworc3RhdGljIHZvaWQgbHVzdHJlX3N3YWJfbG12X21kc19tZF92MShzdHJ1Y3QgbG12X21kc19tZF92MSAqbG1tMSkKIHsKLQlDREVCVUcoRF9PVEhFUiwgImxvdl91c2VyX21kICVwOlxuIiwgbHVtKTsKLQlDREVCVUcoRF9PVEhFUiwgIlx0bG1tX21hZ2ljOiAlI3hcbiIsIGx1bS0+bG1tX21hZ2ljKTsKLQlDREVCVUcoRF9PVEhFUiwgIlx0bG1tX3BhdHRlcm46ICUjeFxuIiwgbHVtLT5sbW1fcGF0dGVybik7Ci0JQ0RFQlVHKERfT1RIRVIsICJcdGxtbV9vYmplY3RfaWQ6ICVsbHVcbiIsIGxtbV9vaV9pZCgmbHVtLT5sbW1fb2kpKTsKLQlDREVCVUcoRF9PVEhFUiwgIlx0bG1tX29iamVjdF9ncjogJWxsdVxuIiwgbG1tX29pX3NlcSgmbHVtLT5sbW1fb2kpKTsKLQlDREVCVUcoRF9PVEhFUiwgIlx0bG1tX3N0cmlwZV9zaXplOiAlI3hcbiIsIGx1bS0+bG1tX3N0cmlwZV9zaXplKTsKLQlDREVCVUcoRF9PVEhFUiwgIlx0bG1tX3N0cmlwZV9jb3VudDogJSN4XG4iLCBsdW0tPmxtbV9zdHJpcGVfY291bnQpOwotCUNERUJVRyhEX09USEVSLCAiXHRsbW1fc3RyaXBlX29mZnNldC9sbW1fbGF5b3V0X2dlbjogJSN4XG4iLAotCSAgICAgICBsdW0tPmxtbV9zdHJpcGVfb2Zmc2V0KTsKKwlpbnQgaTsKKworCV9fc3dhYjMycygmbG1tMS0+bG12X21hZ2ljKTsKKwlfX3N3YWIzMnMoJmxtbTEtPmxtdl9zdHJpcGVfY291bnQpOworCV9fc3dhYjMycygmbG1tMS0+bG12X21hc3Rlcl9tZHRfaW5kZXgpOworCV9fc3dhYjMycygmbG1tMS0+bG12X2hhc2hfdHlwZSk7CisJX19zd2FiMzJzKCZsbW0xLT5sbXZfbGF5b3V0X3ZlcnNpb24pOworCWZvciAoaSA9IDA7IGkgPCBsbW0xLT5sbXZfc3RyaXBlX2NvdW50OyBpKyspCisJCWx1c3RyZV9zd2FiX2x1X2ZpZCgmbG1tMS0+bG12X3N0cmlwZV9maWRzW2ldKTsKIH0KIAordm9pZCBsdXN0cmVfc3dhYl9sbXZfbWRzX21kKHVuaW9uIGxtdl9tZHNfbWQgKmxtbSkKK3sKKwlzd2l0Y2ggKGxtbS0+bG12X21hZ2ljKSB7CisJY2FzZSBMTVZfTUFHSUNfVjE6CisJCWx1c3RyZV9zd2FiX2xtdl9tZHNfbWRfdjEoJmxtbS0+bG12X21kX3YxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9sbXZfbWRzX21kKTsKKwordm9pZCBsdXN0cmVfc3dhYl9sbXZfdXNlcl9tZChzdHJ1Y3QgbG12X3VzZXJfbWQgKmx1bSkKK3sKKwlfX3N3YWIzMnMoJmx1bS0+bHVtX21hZ2ljKTsKKwlfX3N3YWIzMnMoJmx1bS0+bHVtX3N0cmlwZV9jb3VudCk7CisJX19zd2FiMzJzKCZsdW0tPmx1bV9zdHJpcGVfb2Zmc2V0KTsKKwlfX3N3YWIzMnMoJmx1bS0+bHVtX2hhc2hfdHlwZSk7CisJX19zd2FiMzJzKCZsdW0tPmx1bV90eXBlKTsKKwlDTEFTU0VSVChvZmZzZXRvZih0eXBlb2YoKmx1bSksIGx1bV9wYWRkaW5nMSkpOworfQorRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9sbXZfdXNlcl9tZCk7CisKIHN0YXRpYyB2b2lkIGx1c3RyZV9zd2FiX2xtbV9vaShzdHJ1Y3Qgb3N0X2lkICpvaSkKIHsKIAlfX3N3YWI2NHMoJm9pLT5vaS5vaV9pZCk7CkBAIC0xOTA1LDcgKzE4ODgsNiBAQAogCV9fc3dhYjMycygmbHVtLT5sbW1fc3RyaXBlX3NpemUpOwogCV9fc3dhYjE2cygmbHVtLT5sbW1fc3RyaXBlX2NvdW50KTsKIAlfX3N3YWIxNnMoJmx1bS0+bG1tX3N0cmlwZV9vZmZzZXQpOwotCXByaW50X2x1bShsdW0pOwogfQogCiB2b2lkIGx1c3RyZV9zd2FiX2xvdl91c2VyX21kX3YxKHN0cnVjdCBsb3ZfdXNlcl9tZF92MSAqbHVtKQpAQCAtMTk0MSw5ICsxOTIzLDkgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBzdHJpcGVfY291bnQ7IGkrKykgewotCQlsdXN0cmVfc3dhYl9vc3RfaWQoJihsb2RbaV0ubF9vc3Rfb2kpKTsKLQkJX19zd2FiMzJzKCYobG9kW2ldLmxfb3N0X2dlbikpOwotCQlfX3N3YWIzMnMoJihsb2RbaV0ubF9vc3RfaWR4KSk7CisJCWx1c3RyZV9zd2FiX29zdF9pZCgmbG9kW2ldLmxfb3N0X29pKTsKKwkJX19zd2FiMzJzKCZsb2RbaV0ubF9vc3RfZ2VuKTsKKwkJX19zd2FiMzJzKCZsb2RbaV0ubF9vc3RfaWR4KTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2xvdl91c2VyX21kX29iamVjdHMpOwpAQCAtMTk3Myw3ICsxOTU1LDYgQEAKIHsKIAlfX3N3YWI2NHMoJmktPm9wYyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2xkbG1faW50ZW50KTsKIAogc3RhdGljIHZvaWQgbHVzdHJlX3N3YWJfbGRsbV9yZXNvdXJjZV9kZXNjKHN0cnVjdCBsZGxtX3Jlc291cmNlX2Rlc2MgKnIpCiB7CkBAIC0xOTk3LDcgKzE5NzgsNiBAQAogCV9fc3dhYjMycygmcnEtPmxvY2tfY291bnQpOwogCS8qIGxvY2tfaGFuZGxlW10gb3BhcXVlICovCiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2xkbG1fcmVxdWVzdCk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfbGRsbV9yZXBseShzdHJ1Y3QgbGRsbV9yZXBseSAqcikKIHsKQEAgLTIwMDgsNyArMTk4OCw2IEBACiAJX19zd2FiNjRzKCZyLT5sb2NrX3BvbGljeV9yZXMxKTsKIAlfX3N3YWI2NHMoJnItPmxvY2tfcG9saWN5X3JlczIpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9sZGxtX3JlcGx5KTsKIAogLyogRHVtcCBmdW5jdGlvbnMgKi8KIHZvaWQgZHVtcF9pb28oc3RydWN0IG9iZF9pb29iaiAqaW9vKQpAQCAtMjAxOCwxNCArMTk5NywxMiBAQAogCSAgICAgICBQT1NUSUQoJmlvby0+aW9vX29pZCksIGlvby0+aW9vX21heF9icncsCiAJICAgICAgIGlvby0+aW9vX2J1ZmNudCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGR1bXBfaW9vKTsKIAogdm9pZCBkdW1wX3JuaW9idWYoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKm5iKQogewogCUNERUJVRyhEX1JQQ1RSQUNFLCAibmlvYnVmX3JlbW90ZTogb2Zmc2V0PSVsbHUsIGxlbj0lZCwgZmxhZ3M9JXhcbiIsCi0JICAgICAgIG5iLT5vZmZzZXQsIG5iLT5sZW4sIG5iLT5mbGFncyk7CisJICAgICAgIG5iLT5ybmJfb2Zmc2V0LCBuYi0+cm5iX2xlbiwgbmItPnJuYl9mbGFncyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGR1bXBfcm5pb2J1Zik7CiAKIHN0YXRpYyB2b2lkIGR1bXBfb2JkbyhzdHJ1Y3Qgb2JkbyAqb2EpCiB7CkBAIC0yMDkzLDEzICsyMDcwLDExIEBACiB7CiAJZHVtcF9vYmRvKCZvYi0+b2EpOwogfQotRVhQT1JUX1NZTUJPTChkdW1wX29zdF9ib2R5KTsKIAogdm9pZCBkdW1wX3JjcyhfX3UzMiAqcmMpCiB7CiAJQ0RFQlVHKERfUlBDVFJBQ0UsICJybWZfcmNzOiAlZFxuIiwgKnJjKTsKIH0KLUVYUE9SVF9TWU1CT0woZHVtcF9yY3MpOwogCiBzdGF0aWMgaW5saW5lIGludCByZXFfcHRscnBjX2JvZHlfc3dhYmJlZChzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSkKIHsKQEAgLTIxODQsMTQgKzIxNTksMTIgQEAKIAlfX3N3YWIzMnMoJmMtPmxjX3RpbWVvdXQpOwogCV9fc3dhYjMycygmYy0+bGNfZXhwaXJ5KTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfbHVzdHJlX2NhcGEpOwogCiB2b2lkIGx1c3RyZV9zd2FiX2hzbV91c2VyX3N0YXRlKHN0cnVjdCBoc21fdXNlcl9zdGF0ZSAqc3RhdGUpCiB7CiAJX19zd2FiMzJzKCZzdGF0ZS0+aHVzX3N0YXRlcyk7CiAJX19zd2FiMzJzKCZzdGF0ZS0+aHVzX2FyY2hpdmVfaWQpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9oc21fdXNlcl9zdGF0ZSk7CiAKIHZvaWQgbHVzdHJlX3N3YWJfaHNtX3N0YXRlX3NldChzdHJ1Y3QgaHNtX3N0YXRlX3NldCAqaHNzKQogewpAQCAtMjIxNCwxNCArMjE4NywxMiBAQAogCV9fc3dhYjMycygmYWN0aW9uLT5oY2FfYWN0aW9uKTsKIAlsdXN0cmVfc3dhYl9oc21fZXh0ZW50KCZhY3Rpb24tPmhjYV9sb2NhdGlvbik7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2hzbV9jdXJyZW50X2FjdGlvbik7CiAKIHZvaWQgbHVzdHJlX3N3YWJfaHNtX3VzZXJfaXRlbShzdHJ1Y3QgaHNtX3VzZXJfaXRlbSAqaHVpKQogewogCWx1c3RyZV9zd2FiX2x1X2ZpZCgmaHVpLT5odWlfZmlkKTsKIAlsdXN0cmVfc3dhYl9oc21fZXh0ZW50KCZodWktPmh1aV9leHRlbnQpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9oc21fdXNlcl9pdGVtKTsKIAogdm9pZCBsdXN0cmVfc3dhYl9sYXlvdXRfaW50ZW50KHN0cnVjdCBsYXlvdXRfaW50ZW50ICpsaSkKIHsKQEAgLTIyMzAsNyArMjIwMSw2IEBACiAJX19zd2FiNjRzKCZsaS0+bGlfc3RhcnQpOwogCV9fc3dhYjY0cygmbGktPmxpX2VuZCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2xheW91dF9pbnRlbnQpOwogCiB2b2lkIGx1c3RyZV9zd2FiX2hzbV9wcm9ncmVzc19rZXJuZWwoc3RydWN0IGhzbV9wcm9ncmVzc19rZXJuZWwgKmhwaykKIHsKQEAgLTIyNDEsNyArMjIxMSw2IEBACiAJX19zd2FiMTZzKCZocGstPmhwa19mbGFncyk7CiAJX19zd2FiMTZzKCZocGstPmhwa19lcnJ2YWwpOwogfQotRVhQT1JUX1NZTUJPTChsdXN0cmVfc3dhYl9oc21fcHJvZ3Jlc3Nfa2VybmVsKTsKIAogdm9pZCBsdXN0cmVfc3dhYl9oc21fcmVxdWVzdChzdHJ1Y3QgaHNtX3JlcXVlc3QgKmhyKQogewpAQCAtMjI1MSw3ICsyMjIwLDYgQEAKIAlfX3N3YWIzMnMoJmhyLT5ocl9pdGVtY291bnQpOwogCV9fc3dhYjMycygmaHItPmhyX2RhdGFfbGVuKTsKIH0KLUVYUE9SVF9TWU1CT0wobHVzdHJlX3N3YWJfaHNtX3JlcXVlc3QpOwogCiB2b2lkIGx1c3RyZV9zd2FiX3N3YXBfbGF5b3V0cyhzdHJ1Y3QgbWRjX3N3YXBfbGF5b3V0cyAqbXNsKQogewpAQCAtMjI2NCw0ICsyMjMyLDMgQEAKIAlsdXN0cmVfc3dhYl9sdV9maWQoJmNkLT5jZF9maWQpOwogCV9fc3dhYjY0cygmY2QtPmNkX2RhdGFfdmVyc2lvbik7CiB9Ci1FWFBPUlRfU1lNQk9MKGx1c3RyZV9zd2FiX2Nsb3NlX2RhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BlcnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wZXJzLmMKaW5kZXggNmM4MjBlOS4uNWI5ZmIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BlcnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGVycy5jCkBAIC02NCw5ICs2NCw5IEBACiB7CiAJbG5ldF9raW92X3QgKmtpb3YgPSAmZGVzYy0+YmRfaW92W2Rlc2MtPmJkX2lvdl9jb3VudF07CiAKLQlraW92LT5raW92X3BhZ2UgPSBwYWdlOwotCWtpb3YtPmtpb3Zfb2Zmc2V0ID0gcGFnZW9mZnNldDsKLQlraW92LT5raW92X2xlbiA9IGxlbjsKKwlraW92LT5idl9wYWdlID0gcGFnZTsKKwlraW92LT5idl9vZmZzZXQgPSBwYWdlb2Zmc2V0OworCWtpb3YtPmJ2X2xlbiA9IGxlbjsKIAogCWRlc2MtPmJkX2lvdl9jb3VudCsrOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3Bpbmdlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3Bpbmdlci5jCmluZGV4IGMwNTI5ZDguLjU1MDRmYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9waW5nZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGluZ2VyLmMKQEAgLTM0MCw3ICszNDAsNiBAQAogewogCXB0bHJwY191cGRhdGVfbmV4dF9waW5nKGltcCwgMCk7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19waW5nZXJfc2VuZGluZ19vbl9pbXBvcnQpOwogCiB2b2lkIHB0bHJwY19waW5nZXJfY29tbWl0X2V4cGVjdGVkKHN0cnVjdCBvYmRfaW1wb3J0ICppbXApCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjX2ludGVybmFsLmgKaW5kZXggYTk4MzFmYS4uZjE0ZDE5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY19pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNfaW50ZXJuYWwuaApAQCAtNTMsNiArNTMsOCBAQAogaW50IHB0bHJwY2Rfc3RhcnQoc3RydWN0IHB0bHJwY2RfY3RsICpwYyk7CiAKIC8qIGNsaWVudC5jICovCit2b2lkIHB0bHJwY19hdF9hZGpfbmV0X2xhdGVuY3koc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHNlcnZpY2VfdGltZSk7CiBzdHJ1Y3QgcHRscnBjX2J1bGtfZGVzYyAqcHRscnBjX25ld19idWxrKHVuc2lnbmVkIG5wYWdlcywgdW5zaWduZWQgbWF4X2JydywKIAkJCQkJIHVuc2lnbmVkIHR5cGUsIHVuc2lnbmVkIHBvcnRhbCk7CiBpbnQgcHRscnBjX3JlcXVlc3RfY2FjaGVfaW5pdCh2b2lkKTsKQEAgLTYwLDYgKzYyLDExIEBACiBzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnB0bHJwY19yZXF1ZXN0X2NhY2hlX2FsbG9jKGdmcF90IGZsYWdzKTsKIHZvaWQgcHRscnBjX3JlcXVlc3RfY2FjaGVfZnJlZShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSk7CiB2b2lkIHB0bHJwY19pbml0X3hpZCh2b2lkKTsKK3ZvaWQgcHRscnBjX3NldF9hZGRfbmV3X3JlcShzdHJ1Y3QgcHRscnBjZF9jdGwgKnBjLAorCQkJICAgIHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqcmVxKTsKK2ludCBwdGxycGNfZXhwaXJlZF9zZXQodm9pZCAqZGF0YSk7CitpbnQgcHRscnBjX3NldF9uZXh0X3RpbWVvdXQoc3RydWN0IHB0bHJwY19yZXF1ZXN0X3NldCAqKTsKK3ZvaWQgcHRscnBjX3Jlc2VuZF9yZXEoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXF1ZXN0KTsKIAogLyogZXZlbnRzLmMgKi8KIGludCBwdGxycGNfaW5pdF9wb3J0YWxzKHZvaWQpOwpAQCAtMjY4LDcgKzI3NSw3IEBACiBpbnQgIHNwdGxycGNfaW5pdCh2b2lkKTsKIHZvaWQgc3B0bHJwY19maW5pKHZvaWQpOwogCi1zdGF0aWMgaW5saW5lIGludCBsbF9ycGNfcmVjb3ZlcmFibGVfZXJyb3IoaW50IHJjKQorc3RhdGljIGlubGluZSBib29sIHB0bHJwY19yZWNvdmVyYWJsZV9lcnJvcihpbnQgcmMpCiB7CiAJcmV0dXJuIChyYyA9PSAtRU5PVENPTk4gfHwgcmMgPT0gLUVOT0RFVik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY2QuYwppbmRleCAwYTM3NGI2Li4xZjU1ZDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNkLmMKQEAgLTQxMiw3ICs0MTIsNyBAQAogCSAqIGFuIGFyZ3VtZW50LCBkZXNjcmliaW5nIGl0cyAic2NvcGUiLgogCSAqLwogCXJjID0gbHVfY29udGV4dF9pbml0KCZlbnYubGVfY3R4LAotCQkJICAgICBMQ1RfQ0xfVEhSRUFEfExDVF9SRU1FTUJFUnxMQ1RfTk9SRUYpOworCQkJICAgICBMQ1RfQ0xfVEhSRUFEIHwgTENUX1JFTUVNQkVSIHwgTENUX05PUkVGKTsKIAlpZiAocmMgPT0gMCkgewogCQlyYyA9IGx1X2NvbnRleHRfaW5pdChlbnYubGVfc2VzLAogCQkJCSAgICAgTENUX1NFU1NJT04gfCBMQ1RfUkVNRU1CRVIgfCBMQ1RfTk9SRUYpOwpAQCAtNTY3LDcgKzU2Nyw3IEBACiAJICogcHRscnBjZCB0aHJlYWQgKG9yIGEgdGhyZWFkLXNldCkgaGFzIHRvIGJlIGdpdmVuIGFuIGFyZ3VtZW50LAogCSAqIGRlc2NyaWJpbmcgaXRzICJzY29wZSIuCiAJICovCi0JcmMgPSBsdV9jb250ZXh0X2luaXQoJnBjLT5wY19lbnYubGVfY3R4LCBMQ1RfQ0xfVEhSRUFEfExDVF9SRU1FTUJFUik7CisJcmMgPSBsdV9jb250ZXh0X2luaXQoJnBjLT5wY19lbnYubGVfY3R4LCBMQ1RfQ0xfVEhSRUFEIHwgTENUX1JFTUVNQkVSKTsKIAlpZiAocmMgIT0gMCkKIAkJZ290byBvdXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9yZWNvdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcmVjb3Zlci5jCmluZGV4IDcxOGIzYTguLjQwNWZhZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9yZWNvdmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3JlY292ZXIuYwpAQCAtMjAxLDcgKzIwMSw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocHRscnBjX3Jlc2VuZCk7CiAKIC8qKgogICogR28gdGhyb3VnaCBhbGwgcmVxdWVzdHMgaW4gZGVsYXllZCBsaXN0IGFuZCB3YWtlIHRoZWlyIHRocmVhZHMKQEAgLTIyMSw3ICsyMjAsNiBAQAogCX0KIAlzcGluX3VubG9jaygmaW1wLT5pbXBfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY193YWtlX2RlbGF5ZWQpOwogCiB2b2lkIHB0bHJwY19yZXF1ZXN0X2hhbmRsZV9ub3Rjb25uKHN0cnVjdCBwdGxycGNfcmVxdWVzdCAqZmFpbGVkX3JlcSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWMuYwppbmRleCBkYmQ4MTlmLi41ZDM5OTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlYy5jCkBAIC0zMTEsNiArMzExLDE5IEBACiAJcmV0dXJuIHNwdGxycGNfaW1wb3J0X3NlY19hZGFwdChpbXAsIE5VTEwsIE5VTEwpOwogfQogCisvKioKKyAqIEdldCBhbmQgdmFsaWRhdGUgdGhlIGNsaWVudCBzaWRlIHB0bHJwYyBzZWN1cml0eSBmYWNpbGl0aWVzIGZyb20KKyAqIFxhIGltcC4gVGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBvbiBjbGllbnQgcmVjb25uZWN0IHdoZW4gdGhlIGltcG9ydCBpcworICogYmVpbmcgZGVzdHJveWVkIHdoaWxlIHRoZXJlIGFyZSBvdXRzdGFuZGluZyBjbGllbnQgYm91bmQgcmVxdWVzdHMuIEluCisgKiB0aGlzIGNhc2UgZG8gbm90IG91dHB1dCBhbnkgZXJyb3IgbWVzc2FnZXMgaWYgaW1wb3J0IHNlY3VpdHkgaXMgbm90CisgKiBmb3VuZC4KKyAqCisgKiBccGFyYW1baW5dIGltcCBvYmQgaW1wb3J0IGFzc29jaWF0ZWQgd2l0aCBjbGllbnQKKyAqIFxwYXJhbVtvdXRdIHNlYyBjbGllbnQgc2lkZSBwdGxycGMgc2VjdXJpdHkKKyAqCisgKiBccmV0dmFsIDAgaWYgc2VjdXJpdHkgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseQorICogXHJldHZhbCAtdmUgZXJybm8gaWYgdGhlcmUgd2FzIGEgcHJvYmxlbQorICovCiBzdGF0aWMgaW50IGltcG9ydF9zZWNfdmFsaWRhdGVfZ2V0KHN0cnVjdCBvYmRfaW1wb3J0ICppbXAsCiAJCQkJICAgc3RydWN0IHB0bHJwY19zZWMgKipzZWMpCiB7CkBAIC0zMjMsOSArMzM2LDExIEBACiAJfQogCiAJKnNlYyA9IHNwdGxycGNfaW1wb3J0X3NlY19yZWYoaW1wKTsKKwkvKiBPbmx5IG91dHB1dCBhbiBlcnJvciB3aGVuIHRoZSBpbXBvcnQgaXMgc3RpbGwgYWN0aXZlICovCiAJaWYgKCEqc2VjKSB7Ci0JCUNFUlJPUigiaW1wb3J0ICVwICglcykgd2l0aCBubyBzZWNcbiIsCi0JCSAgICAgICBpbXAsIHB0bHJwY19pbXBvcnRfc3RhdGVfbmFtZShpbXAtPmltcF9zdGF0ZSkpOworCQlpZiAobGlzdF9lbXB0eSgmaW1wLT5pbXBfem9tYmllX2NoYWluKSkKKwkJCUNFUlJPUigiaW1wb3J0ICVwICglcykgd2l0aCBubyBzZWNcbiIsCisJCQkgICAgICAgaW1wLCBwdGxycGNfaW1wb3J0X3N0YXRlX25hbWUoaW1wLT5pbXBfc3RhdGUpKTsKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCkBAIC00OTksNyArNTE0LDcgQEAKIAkJICAgICAgIG5ld2N0eCwgbmV3Y3R4LT5jY19mbGFncyk7CiAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChIWik7CisJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcyhNU0VDX1BFUl9TRUMpKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBpdCdzIHBvc3NpYmxlIG5ld2N0eCA9PSBvbGRjdHggaWYgd2UncmUgc3dpdGNoaW5nCkBAIC03MTgsOCArNzMzLDkgQEAKIAlyZXEtPnJxX3Jlc3RhcnQgPSAwOwogCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOwogCi0JbHdpID0gTFdJX1RJTUVPVVRfSU5UUih0aW1lb3V0ICogSFosIGN0eF9yZWZyZXNoX3RpbWVvdXQsCi0JCQkgICAgICAgY3R4X3JlZnJlc2hfaW50ZXJydXB0LCByZXEpOworCWx3aSA9IExXSV9USU1FT1VUX0lOVFIobXNlY3NfdG9famlmZmllcyh0aW1lb3V0ICogTVNFQ19QRVJfU0VDKSwKKwkJCSAgICAgICBjdHhfcmVmcmVzaF90aW1lb3V0LCBjdHhfcmVmcmVzaF9pbnRlcnJ1cHQsCisJCQkgICAgICAgcmVxKTsKIAlyYyA9IGxfd2FpdF9ldmVudChyZXEtPnJxX3JlcGx5X3dhaXRxLCBjdHhfY2hlY2tfcmVmcmVzaChjdHgpLCAmbHdpKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfYnVsay5jCmluZGV4IDVmNGQ3OTcuLmIyY2M1ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfYnVsay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfYnVsay5jCkBAIC0xMzksNyArMTM5LDcgQEAKIAkJICAgImNhY2hlIG1pc3Npbmc6CSAgICVsdVxuIgogCQkgICAibG93IGZyZWUgbWFyazoJICAgJWx1XG4iCiAJCSAgICJtYXggd2FpdHF1ZXVlIGRlcHRoOiAgICAgJXVcbiIKLQkJICAgIm1heCB3YWl0IHRpbWU6CSAgICVsZC8ldVxuIiwKKwkJICAgIm1heCB3YWl0IHRpbWU6CSAgICVsZC8lbHVcbiIsCiAJCSAgIHRvdGFscmFtX3BhZ2VzLAogCQkgICBQQUdFU19QRVJfUE9PTCwKIAkJICAgcGFnZV9wb29scy5lcHBfbWF4X3BhZ2VzLApAQCAtMTU4LDcgKzE1OCw3IEBACiAJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X2xvd2ZyZWUsCiAJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF93cWxlbiwKIAkJICAgcGFnZV9wb29scy5lcHBfc3RfbWF4X3dhaXQsCi0JCSAgIEhaKTsKKwkJICAgbXNlY3NfdG9famlmZmllcyhNU0VDX1BFUl9TRUMpKTsKIAogCXNwaW5fdW5sb2NrKCZwYWdlX3Bvb2xzLmVwcF9sb2NrKTsKIApAQCAtMzI2LDEyICszMjYsMTIgQEAKIAlMQVNTRVJUKHBhZ2VfcG9vbHMuZXBwX3Bvb2xzW3BfaWR4XSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGVzYy0+YmRfaW92X2NvdW50OyBpKyspIHsKLQkJTEFTU0VSVChkZXNjLT5iZF9lbmNfaW92W2ldLmtpb3ZfcGFnZSk7CisJCUxBU1NFUlQoZGVzYy0+YmRfZW5jX2lvdltpXS5idl9wYWdlKTsKIAkJTEFTU0VSVChnX2lkeCAhPSAwIHx8IHBhZ2VfcG9vbHMuZXBwX3Bvb2xzW3BfaWR4XSk7CiAJCUxBU1NFUlQoIXBhZ2VfcG9vbHMuZXBwX3Bvb2xzW3BfaWR4XVtnX2lkeF0pOwogCiAJCXBhZ2VfcG9vbHMuZXBwX3Bvb2xzW3BfaWR4XVtnX2lkeF0gPQotCQkJCQlkZXNjLT5iZF9lbmNfaW92W2ldLmtpb3ZfcGFnZTsKKwkJCQkJZGVzYy0+YmRfZW5jX2lvdltpXS5idl9wYWdlOwogCiAJCWlmICgrK2dfaWR4ID09IFBBR0VTX1BFUl9QT09MKSB7CiAJCQlwX2lkeCsrOwpAQCAtMzQ4LDcgKzM0OCw2IEBACiAJa2ZyZWUoZGVzYy0+YmRfZW5jX2lvdik7CiAJZGVzYy0+YmRfZW5jX2lvdiA9IE5VTEw7CiB9Ci1FWFBPUlRfU1lNQk9MKHNwdGxycGNfZW5jX3Bvb2xfcHV0X3BhZ2VzKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGVuY19wb29sc19hbGxvYyh2b2lkKQogewpAQCAtNDMyLDEyICs0MzEsMTMgQEAKIAogCWlmIChwYWdlX3Bvb2xzLmVwcF9zdF9hY2Nlc3MgPiAwKSB7CiAJCUNERUJVRyhEX1NFQywKLQkJICAgICAgICJtYXggcGFnZXMgJWx1LCBncm93cyAldSwgZ3JvdyBmYWlscyAldSwgc2hyaW5rcyAldSwgYWNjZXNzICVsdSwgbWlzc2luZyAlbHUsIG1heCBxbGVuICV1LCBtYXggd2FpdCAlbGQvJWRcbiIsCisJCSAgICAgICAibWF4IHBhZ2VzICVsdSwgZ3Jvd3MgJXUsIGdyb3cgZmFpbHMgJXUsIHNocmlua3MgJXUsIGFjY2VzcyAlbHUsIG1pc3NpbmcgJWx1LCBtYXggcWxlbiAldSwgbWF4IHdhaXQgJWxkLyVsZFxuIiwKIAkJICAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF9wYWdlcywgcGFnZV9wb29scy5lcHBfc3RfZ3Jvd3MsCiAJCSAgICAgICBwYWdlX3Bvb2xzLmVwcF9zdF9ncm93X2ZhaWxzLAogCQkgICAgICAgcGFnZV9wb29scy5lcHBfc3Rfc2hyaW5rcywgcGFnZV9wb29scy5lcHBfc3RfYWNjZXNzLAogCQkgICAgICAgcGFnZV9wb29scy5lcHBfc3RfbWlzc2luZ3MsIHBhZ2VfcG9vbHMuZXBwX3N0X21heF93cWxlbiwKLQkJICAgICAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF93YWl0LCBIWik7CisJCSAgICAgICBwYWdlX3Bvb2xzLmVwcF9zdF9tYXhfd2FpdCwKKwkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoTVNFQ19QRVJfU0VDKSk7CiAJfQogfQogCkBAIC00NTYsMTMgKzQ1NiwxMSBAQAogewogCXJldHVybiBjZnNfY3J5cHRvX2hhc2hfbmFtZShjZnNfaGFzaF9hbGdfaWRbaGFzaF9hbGddKTsKIH0KLUVYUE9SVF9TWU1CT0woc3B0bHJwY19nZXRfaGFzaF9uYW1lKTsKIAogX191OCBzcHRscnBjX2dldF9oYXNoX2FsZyhjb25zdCBjaGFyICphbGduYW1lKQogewogCXJldHVybiBjZnNfY3J5cHRvX2hhc2hfYWxnKGFsZ25hbWUpOwogfQotRVhQT1JUX1NZTUJPTChzcHRscnBjX2dldF9oYXNoX2FsZyk7CiAKIGludCBidWxrX3NlY19kZXNjX3VucGFjayhzdHJ1Y3QgbHVzdHJlX21zZyAqbXNnLCBpbnQgb2Zmc2V0LCBpbnQgc3dhYmJlZCkKIHsKQEAgLTUyMiw5ICs1MjAsMTAgQEAKIAloYXNoc2l6ZSA9IGNmc19jcnlwdG9faGFzaF9kaWdlc3RzaXplKGNmc19oYXNoX2FsZ19pZFthbGddKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5iZF9pb3ZfY291bnQ7IGkrKykgewotCQljZnNfY3J5cHRvX2hhc2hfdXBkYXRlX3BhZ2UoaGRlc2MsIGRlc2MtPmJkX2lvdltpXS5raW92X3BhZ2UsCi0JCQkJICBkZXNjLT5iZF9pb3ZbaV0ua2lvdl9vZmZzZXQgJiB+UEFHRV9NQVNLLAotCQkJCSAgZGVzYy0+YmRfaW92W2ldLmtpb3ZfbGVuKTsKKwkJY2ZzX2NyeXB0b19oYXNoX3VwZGF0ZV9wYWdlKGhkZXNjLCBkZXNjLT5iZF9pb3ZbaV0uYnZfcGFnZSwKKwkJCQkJICAgIGRlc2MtPmJkX2lvdltpXS5idl9vZmZzZXQgJgorCQkJCQkgICAgflBBR0VfTUFTSywKKwkJCQkJICAgIGRlc2MtPmJkX2lvdltpXS5idl9sZW4pOwogCX0KIAogCWlmIChoYXNoc2l6ZSA+IGJ1ZmxlbikgewpAQCAtNTQyLDQgKzU0MSwzIEBACiAKIAlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTChzcHRscnBjX2dldF9idWxrX2NoZWNrc3VtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfY29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2NvbmZpZy5jCmluZGV4IGMxNDAzNTQuLjIxODFhODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfY29uZmlnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19jb25maWcuYwpAQCAtNTgsNyArNTgsNiBAQAogCUNFUlJPUigidW5rbm93biB0YXJnZXQgJXAoJXMpXG4iLCBvYmQsIHR5cGUpOwogCXJldHVybiBMVVNUUkVfU1BfQU5ZOwogfQotRVhQT1JUX1NZTUJPTChzcHRscnBjX3RhcmdldF9zZWNfcGFydCk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiB1c2VyIHN1cHBsaWVkIGZsYXZvciBzdHJpbmcgcGFyc2luZyAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19nYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19nYy5jCmluZGV4IDliOTgwMWUuLjhmZmQwMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfZ2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2djLmMKQEAgLTcxLDcgKzcxLDYgQEAKIAogCUNERUJVRyhEX1NFQywgImFkZGVkIHNlYyAlcCglcylcbiIsIHNlYywgc2VjLT5wc19wb2xpY3ktPnNwX25hbWUpOwogfQotRVhQT1JUX1NZTUJPTChzcHRscnBjX2djX2FkZF9zZWMpOwogCiB2b2lkIHNwdGxycGNfZ2NfZGVsX3NlYyhzdHJ1Y3QgcHRscnBjX3NlYyAqc2VjKQogewpAQCAtOTUsNyArOTQsNiBAQAogCiAJQ0RFQlVHKERfU0VDLCAiZGVsIHNlYyAlcCglcylcbiIsIHNlYywgc2VjLT5wc19wb2xpY3ktPnNwX25hbWUpOwogfQotRVhQT1JUX1NZTUJPTChzcHRscnBjX2djX2RlbF9zZWMpOwogCiBzdGF0aWMgdm9pZCBzZWNfcHJvY2Vzc19jdHhfbGlzdCh2b2lkKQogewpAQCAtMTgyLDcgKzE4MCw4IEBACiAJCS8qIGNoZWNrIGN0eCBsaXN0IGFnYWluIGJlZm9yZSBzbGVlcCAqLwogCQlzZWNfcHJvY2Vzc19jdHhfbGlzdCgpOwogCi0JCWx3aSA9IExXSV9USU1FT1VUKFNFQ19HQ19JTlRFUlZBTCAqIEhaLCBOVUxMLCBOVUxMKTsKKwkJbHdpID0gTFdJX1RJTUVPVVQobXNlY3NfdG9famlmZmllcyhTRUNfR0NfSU5URVJWQUwgKiBNU0VDX1BFUl9TRUMpLAorCQkJCSAgTlVMTCwgTlVMTCk7CiAJCWxfd2FpdF9ldmVudCh0aHJlYWQtPnRfY3RsX3dhaXRxLAogCQkJICAgICB0aHJlYWRfaXNfc3RvcHBpbmcodGhyZWFkKSB8fAogCQkJICAgICB0aHJlYWRfaXNfc2lnbmFsKHRocmVhZCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX3BsYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX3BsYWluLmMKaW5kZXggNWM0NTkwYi4uY2QzMDViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19wbGFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZWNfcGxhaW4uYwpAQCAtMTU0LDEzICsxNTQsMTMgQEAKIAl1bnNpZ25lZCBpbnQgb2ZmLCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGRlc2MtPmJkX2lvdl9jb3VudDsgaSsrKSB7Ci0JCWlmIChkZXNjLT5iZF9pb3ZbaV0ua2lvdl9sZW4gPT0gMCkKKwkJaWYgKGRlc2MtPmJkX2lvdltpXS5idl9sZW4gPT0gMCkKIAkJCWNvbnRpbnVlOwogCi0JCXB0ciA9IGttYXAoZGVzYy0+YmRfaW92W2ldLmtpb3ZfcGFnZSk7Ci0JCW9mZiA9IGRlc2MtPmJkX2lvdltpXS5raW92X29mZnNldCAmIH5QQUdFX01BU0s7CisJCXB0ciA9IGttYXAoZGVzYy0+YmRfaW92W2ldLmJ2X3BhZ2UpOworCQlvZmYgPSBkZXNjLT5iZF9pb3ZbaV0uYnZfb2Zmc2V0ICYgflBBR0VfTUFTSzsKIAkJcHRyW29mZl0gXj0gMHgxOwotCQlrdW5tYXAoZGVzYy0+YmRfaW92W2ldLmtpb3ZfcGFnZSk7CisJCWt1bm1hcChkZXNjLT5iZF9pb3ZbaV0uYnZfcGFnZSk7CiAJCXJldHVybjsKIAl9CiB9CkBAIC0yNDksOSArMjQ5LDEyIEBACiAJCXVuc2lnbmVkIGludCBoc2l6ZSA9IDQ7CiAKIAkJY2ZzX2NyeXB0b19oYXNoX2RpZ2VzdChDRlNfSEFTSF9BTEdfQ1JDMzIsCi0JCQkJbHVzdHJlX21zZ19idWYobXNnLCBQTEFJTl9QQUNLX01TR19PRkYsIDApLAotCQkJCWx1c3RyZV9tc2dfYnVmbGVuKG1zZywgUExBSU5fUEFDS19NU0dfT0ZGKSwKLQkJCQlOVUxMLCAwLCAodW5zaWduZWQgY2hhciAqKSZja3N1bSwgJmhzaXplKTsKKwkJCQkgICAgICAgbHVzdHJlX21zZ19idWYobXNnLCBQTEFJTl9QQUNLX01TR19PRkYsCisJCQkJCQkgICAgICAwKSwKKwkJCQkgICAgICAgbHVzdHJlX21zZ19idWZsZW4obXNnLAorCQkJCQkJCSBQTEFJTl9QQUNLX01TR19PRkYpLAorCQkJCSAgICAgICBOVUxMLCAwLCAodW5zaWduZWQgY2hhciAqKSZja3N1bSwKKwkJCQkgICAgICAgJmhzaXplKTsKIAkJaWYgKGNrc3VtICE9IG1zZy0+bG1fY2tzdW0pIHsKIAkJCUNERUJVRyhEX1NFQywKIAkJCSAgICAgICAiZWFybHkgcmVwbHkgY2hlY2tzdW0gbWlzbWF0Y2g6ICUwOHggIT0gJTA4eFxuIiwKQEAgLTM0OSwxMSArMzUyLDExIEBACiAKIAkvKiBmaXggdGhlIGFjdHVhbCBkYXRhIHNpemUgKi8KIAlmb3IgKGkgPSAwLCBub2IgPSAwOyBpIDwgZGVzYy0+YmRfaW92X2NvdW50OyBpKyspIHsKLQkJaWYgKGRlc2MtPmJkX2lvdltpXS5raW92X2xlbiArIG5vYiA+IGRlc2MtPmJkX25vYl90cmFuc2ZlcnJlZCkgewotCQkJZGVzYy0+YmRfaW92W2ldLmtpb3ZfbGVuID0KKwkJaWYgKGRlc2MtPmJkX2lvdltpXS5idl9sZW4gKyBub2IgPiBkZXNjLT5iZF9ub2JfdHJhbnNmZXJyZWQpIHsKKwkJCWRlc2MtPmJkX2lvdltpXS5idl9sZW4gPQogCQkJCWRlc2MtPmJkX25vYl90cmFuc2ZlcnJlZCAtIG5vYjsKIAkJfQotCQlub2IgKz0gZGVzYy0+YmRfaW92W2ldLmtpb3ZfbGVuOworCQlub2IgKz0gZGVzYy0+YmRfaW92W2ldLmJ2X2xlbjsKIAl9CiAKIAlyYyA9IHBsYWluX3ZlcmlmeV9idWxrX2NzdW0oZGVzYywgcmVxLT5ycV9mbHZyLnVfYnVsay5oYXNoLmhhc2hfYWxnLApAQCAtODY5LDkgKzg3MiwxMiBAQAogCQl1bnNpZ25lZCBpbnQgaHNpemUgPSA0OwogCiAJCWNmc19jcnlwdG9faGFzaF9kaWdlc3QoQ0ZTX0hBU0hfQUxHX0NSQzMyLAotCQkJbHVzdHJlX21zZ19idWYobXNnLCBQTEFJTl9QQUNLX01TR19PRkYsIDApLAotCQkJbHVzdHJlX21zZ19idWZsZW4obXNnLCBQTEFJTl9QQUNLX01TR19PRkYpLAotCQkJTlVMTCwgMCwgKHVuc2lnbmVkIGNoYXIgKikmbXNnLT5sbV9ja3N1bSwgJmhzaXplKTsKKwkJCQkgICAgICAgbHVzdHJlX21zZ19idWYobXNnLCBQTEFJTl9QQUNLX01TR19PRkYsCisJCQkJCQkgICAgICAwKSwKKwkJCQkgICAgICAgbHVzdHJlX21zZ19idWZsZW4obXNnLAorCQkJCQkJCSBQTEFJTl9QQUNLX01TR19PRkYpLAorCQkJCSAgICAgICBOVUxMLCAwLCAodW5zaWduZWQgY2hhciAqKSZtc2ctPmxtX2Nrc3VtLAorCQkJCSAgICAgICAmaHNpemUpOwogCQlyZXEtPnJxX3JlcGx5X29mZiA9IDA7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VydmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlcnZpY2UuYwppbmRleCA0Nzg4YzQ5Li43MmYzOTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VydmljZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZXJ2aWNlLmMKQEAgLTEwMDUsNiArMTAwNSwxMCBAQAogCWFycmF5LT5wYWFfY291bnQtLTsKIH0KIAorLyoKKyAqIEF0dGVtcHQgdG8gZXh0ZW5kIHRoZSByZXF1ZXN0IGRlYWRsaW5lIGJ5IHNlbmRpbmcgYW4gZWFybHkgcmVwbHkgdG8gdGhlCisgKiBjbGllbnQuCisgKi8KIHN0YXRpYyBpbnQgcHRscnBjX2F0X3NlbmRfZWFybHlfcmVwbHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCiB7CiAJc3RydWN0IHB0bHJwY19zZXJ2aWNlX3BhcnQgKnN2Y3B0ID0gcmVxLT5ycV9ycWJkLT5ycWJkX3N2Y3B0OwpAQCAtMTAzOSwyNCArMTA0MywyNiBAQAogCQlyZXR1cm4gLUVOT1NZUzsKIAl9CiAKLQkvKiBGYWtlIG91ciBwcm9jZXNzaW5nIHRpbWUgaW50byB0aGUgZnV0dXJlIHRvIGFzayB0aGUgY2xpZW50cwotCSAqIGZvciBzb21lIGV4dHJhIGFtb3VudCBvZiB0aW1lCisJLyoKKwkgKiBXZSB3YW50IHRvIGV4dGVuZCB0aGUgcmVxdWVzdCBkZWFkbGluZSBieSBhdF9leHRyYSBzZWNvbmRzLAorCSAqIHNvIHdlIHNldCBvdXIgc2VydmljZSBlc3RpbWF0ZSB0byByZWZsZWN0IGhvdyBtdWNoIHRpbWUgaGFzCisJICogcGFzc2VkIHNpbmNlIHRoaXMgcmVxdWVzdCBhcnJpdmVkIHBsdXMgYW4gYWRkaXRpb25hbAorCSAqIGF0X2V4dHJhIHNlY29uZHMuIFRoZSBjbGllbnQgd2lsbCBjYWxjdWxhdGUgdGhlIG5ldyBkZWFkbGluZQorCSAqIGJhc2VkIG9uIHRoaXMgc2VydmljZSBlc3RpbWF0ZSAocGx1cyBzb21lIGFkZGl0aW9uYWwgdGltZSB0bworCSAqIGFjY291bnQgZm9yIG5ldHdvcmsgbGF0ZW5jeSkuIFNlZSBwdGxycGNfYXRfcmVjdl9lYXJseV9yZXBseQogCSAqLwogCWF0X21lYXN1cmVkKCZzdmNwdC0+c2NwX2F0X2VzdGltYXRlLCBhdF9leHRyYSArCiAJCSAgICBrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCkgLSByZXEtPnJxX2Fycml2YWxfdGltZS50dl9zZWMpOworCW5ld2RsID0gcmVxLT5ycV9hcnJpdmFsX3RpbWUudHZfc2VjICsgYXRfZ2V0KCZzdmNwdC0+c2NwX2F0X2VzdGltYXRlKTsKIAogCS8qIENoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBhY3R1YWxseSBpbmNyZWFzZWQgdGhlIGRlYWRsaW5lIC0KIAkgKiB3ZSBtYXkgYmUgcGFzdCBhZGFwdGl2ZV9tYXgKIAkgKi8KLQlpZiAocmVxLT5ycV9kZWFkbGluZSA+PSByZXEtPnJxX2Fycml2YWxfdGltZS50dl9zZWMgKwotCSAgICBhdF9nZXQoJnN2Y3B0LT5zY3BfYXRfZXN0aW1hdGUpKSB7CisJaWYgKHJlcS0+cnFfZGVhZGxpbmUgPj0gbmV3ZGwpIHsKIAkJREVCVUdfUkVRKERfV0FSTklORywgcmVxLCAiQ291bGRuJ3QgYWRkIGFueSB0aW1lICglbGQvJWxsZCksIG5vdCBzZW5kaW5nIGVhcmx5IHJlcGx5XG4iLAotCQkJICBvbGRkbCwgcmVxLT5ycV9hcnJpdmFsX3RpbWUudHZfc2VjICsKLQkJCSAgYXRfZ2V0KCZzdmNwdC0+c2NwX2F0X2VzdGltYXRlKSAtCi0JCQkgIGt0aW1lX2dldF9yZWFsX3NlY29uZHMoKSk7CisJCQkgIG9sZGRsLCBuZXdkbCAtIGt0aW1lX2dldF9yZWFsX3NlY29uZHMoKSk7CiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KLQluZXdkbCA9IGt0aW1lX2dldF9yZWFsX3NlY29uZHMoKSArIGF0X2dldCgmc3ZjcHQtPnNjcF9hdF9lc3RpbWF0ZSk7CiAKIAlyZXFjb3B5ID0gcHRscnBjX3JlcXVlc3RfY2FjaGVfYWxsb2MoR0ZQX05PRlMpOwogCWlmICghcmVxY29weSkKQEAgLTE5ODIsMTEgKzE5ODgsMTIgQEAKIAljb25kX3Jlc2NoZWQoKTsKIAogCWxfd2FpdF9ldmVudF9leGNsdXNpdmVfaGVhZChzdmNwdC0+c2NwX3dhaXRxLAotCQkJCXB0bHJwY190aHJlYWRfc3RvcHBpbmcodGhyZWFkKSB8fAotCQkJCXB0bHJwY19zZXJ2ZXJfcmVxdWVzdF9pbmNvbWluZyhzdmNwdCkgfHwKLQkJCQlwdGxycGNfc2VydmVyX3JlcXVlc3RfcGVuZGluZyhzdmNwdCwgZmFsc2UpIHx8Ci0JCQkJcHRscnBjX3JxYmRfcGVuZGluZyhzdmNwdCkgfHwKLQkJCQlwdGxycGNfYXRfY2hlY2soc3ZjcHQpLCAmbHdpKTsKKwkJCQkgICAgcHRscnBjX3RocmVhZF9zdG9wcGluZyh0aHJlYWQpIHx8CisJCQkJICAgIHB0bHJwY19zZXJ2ZXJfcmVxdWVzdF9pbmNvbWluZyhzdmNwdCkgfHwKKwkJCQkgICAgcHRscnBjX3NlcnZlcl9yZXF1ZXN0X3BlbmRpbmcoc3ZjcHQsCisJCQkJCQkJCSAgZmFsc2UpIHx8CisJCQkJICAgIHB0bHJwY19ycWJkX3BlbmRpbmcoc3ZjcHQpIHx8CisJCQkJICAgIHB0bHJwY19hdF9jaGVjayhzdmNwdCksICZsd2kpOwogCiAJaWYgKHB0bHJwY190aHJlYWRfc3RvcHBpbmcodGhyZWFkKSkKIAkJcmV0dXJuIC1FSU5UUjsKQEAgLTIwNDksNyArMjA1Niw3IEBACiAJfQogCiAJcmMgPSBsdV9jb250ZXh0X2luaXQoJmVudi0+bGVfY3R4LAotCQkJICAgICBzdmMtPnNydl9jdHhfdGFnc3xMQ1RfUkVNRU1CRVJ8TENUX05PUkVGKTsKKwkJCSAgICAgc3ZjLT5zcnZfY3R4X3RhZ3MgfCBMQ1RfUkVNRU1CRVIgfCBMQ1RfTk9SRUYpOwogCWlmIChyYykKIAkJZ290byBvdXRfc3J2X2Zpbmk7CiAKQEAgLTIzNDksNyArMjM1Niw3IEBACiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnpvbWJpZSkpIHsKIAkJdGhyZWFkID0gbGlzdF9lbnRyeSh6b21iaWUubmV4dCwKLQkJCQkJc3RydWN0IHB0bHJwY190aHJlYWQsIHRfbGluayk7CisJCQkJICAgIHN0cnVjdCBwdGxycGNfdGhyZWFkLCB0X2xpbmspOwogCQlsaXN0X2RlbCgmdGhyZWFkLT50X2xpbmspOwogCQlrZnJlZSh0aHJlYWQpOwogCX0KQEAgLTIzOTgsNyArMjQwNSw2IEBACiAJcHRscnBjX3N0b3BfYWxsX3RocmVhZHMoc3ZjKTsKIAlyZXR1cm4gcmM7CiB9Ci1FWFBPUlRfU1lNQk9MKHB0bHJwY19zdGFydF90aHJlYWRzKTsKIAogaW50IHB0bHJwY19zdGFydF90aHJlYWQoc3RydWN0IHB0bHJwY19zZXJ2aWNlX3BhcnQgKnN2Y3B0LCBpbnQgd2FpdCkKIHsKQEAgLTI1MzksOCArMjU0NSw4IEBACiAJCUxBU1NFUlQoaHJwLT5ocnBfbnRocnMgPiAwKTsKIAkJaHJwLT5ocnBfdGhycyA9CiAJCQlremFsbG9jX25vZGUoaHJwLT5ocnBfbnRocnMgKiBzaXplb2YoKmhydCksIEdGUF9OT0ZTLAotCQkJCWNmc19jcHRfc3ByZWFkX25vZGUocHRscnBjX2hyLmhyX2NwdF90YWJsZSwKLQkJCQkJCSAgICBpKSk7CisJCQkJICAgICBjZnNfY3B0X3NwcmVhZF9ub2RlKHB0bHJwY19oci5ocl9jcHRfdGFibGUsCisJCQkJCQkJIGkpKTsKIAkJaWYgKCFocnAtPmhycF90aHJzKSB7CiAJCQlyYyA9IC1FTk9NRU07CiAJCQlnb3RvIG91dDsKQEAgLTI1OTMsNyArMjU5OSw4IEBACiAJCQkJCQkgICAgIE5VTEwsIE5VTEwpOwogCiAJCXJjID0gbF93YWl0X2V2ZW50KHN2Y3B0LT5zY3Bfd2FpdHEsCi0JCSAgICAgYXRvbWljX3JlYWQoJnN2Y3B0LT5zY3BfbnJlcHNfZGlmZmljdWx0KSA9PSAwLCAmbHdpKTsKKwkJCQkgIGF0b21pY19yZWFkKCZzdmNwdC0+c2NwX25yZXBzX2RpZmZpY3VsdCkgPT0gMCwKKwkJCQkgICZsd2kpOwogCQlpZiAocmMgPT0gMCkKIAkJCWJyZWFrOwogCQlDV0FSTigiVW5leHBlY3RlZGx5IGxvbmcgdGltZW91dCAlcyAlcFxuIiwKQEAgLTI2MzksNyArMjY0Niw3IEBACiAJCSAqIGV2ZW50IHdpdGggaXRzICd1bmxpbmsnIGZsYWcgc2V0IGZvciBlYWNoIHBvc3RlZCBycWJkCiAJCSAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJxYmQsICZzdmNwdC0+c2NwX3JxYmRfcG9zdGVkLAotCQkJCQlycWJkX2xpc3QpIHsKKwkJCQkgICAgcnFiZF9saXN0KSB7CiAJCQlyYyA9IExOZXRNRFVubGluayhycWJkLT5ycWJkX21kX2gpOwogCQkJTEFTU0VSVChyYyA9PSAwIHx8IHJjID09IC1FTk9FTlQpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvd2lyZXRlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy93aXJldGVzdC5jCmluZGV4IDZjYzJiMmUuLmU1OTQ1ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy93aXJldGVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy93aXJldGVzdC5jCkBAIC0xOTAsMjggKzE5MCwzMCBAQAogCQkgKGxvbmcgbG9uZylSRUlOVF9TRVRYQVRUUik7CiAJTEFTU0VSVEYoUkVJTlRfUk1FTlRSWSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpUkVJTlRfUk1FTlRSWSk7Ci0JTEFTU0VSVEYoUkVJTlRfTUFYID09IDksICJmb3VuZCAlbGxkXG4iLAorCUxBU1NFUlRGKFJFSU5UX01JR1JBVEUgPT0gOSwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKVJFSU5UX01JR1JBVEUpOworCUxBU1NFUlRGKFJFSU5UX01BWCA9PSAxMCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKVJFSU5UX01BWCk7CiAJTEFTU0VSVEYoRElTUF9JVF9FWEVDRCA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKURJU1BfSVRfRVhFQ0QpOworCQkgKHVuc2lnbmVkKURJU1BfSVRfRVhFQ0QpOwogCUxBU1NFUlRGKERJU1BfTE9PS1VQX0VYRUNEID09IDB4MDAwMDAwMDJVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9MT09LVVBfRVhFQ0QpOworCQkgKHVuc2lnbmVkKURJU1BfTE9PS1VQX0VYRUNEKTsKIAlMQVNTRVJURihESVNQX0xPT0tVUF9ORUcgPT0gMHgwMDAwMDAwNFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClESVNQX0xPT0tVUF9ORUcpOworCQkgKHVuc2lnbmVkKURJU1BfTE9PS1VQX05FRyk7CiAJTEFTU0VSVEYoRElTUF9MT09LVVBfUE9TID09IDB4MDAwMDAwMDhVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9MT09LVVBfUE9TKTsKKwkJICh1bnNpZ25lZClESVNQX0xPT0tVUF9QT1MpOwogCUxBU1NFUlRGKERJU1BfT1BFTl9DUkVBVEUgPT0gMHgwMDAwMDAxMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClESVNQX09QRU5fQ1JFQVRFKTsKKwkJICh1bnNpZ25lZClESVNQX09QRU5fQ1JFQVRFKTsKIAlMQVNTRVJURihESVNQX09QRU5fT1BFTiA9PSAweDAwMDAwMDIwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKURJU1BfT1BFTl9PUEVOKTsKKwkJICh1bnNpZ25lZClESVNQX09QRU5fT1BFTik7CiAJTEFTU0VSVEYoRElTUF9FTlFfQ09NUExFVEUgPT0gMHgwMDQwMDAwMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClESVNQX0VOUV9DT01QTEVURSk7CisJCSAodW5zaWduZWQpRElTUF9FTlFfQ09NUExFVEUpOwogCUxBU1NFUlRGKERJU1BfRU5RX09QRU5fUkVGID09IDB4MDA4MDAwMDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9FTlFfT1BFTl9SRUYpOworCQkgKHVuc2lnbmVkKURJU1BfRU5RX09QRU5fUkVGKTsKIAlMQVNTRVJURihESVNQX0VOUV9DUkVBVEVfUkVGID09IDB4MDEwMDAwMDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRElTUF9FTlFfQ1JFQVRFX1JFRik7CisJCSAodW5zaWduZWQpRElTUF9FTlFfQ1JFQVRFX1JFRik7CiAJTEFTU0VSVEYoRElTUF9PUEVOX0xPQ0sgPT0gMHgwMjAwMDAwMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClESVNQX09QRU5fTE9DSyk7CisJCSAodW5zaWduZWQpRElTUF9PUEVOX0xPQ0spOwogCUxBU1NFUlRGKE1EU19TVEFUVVNfQ09OTiA9PSAxLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpTURTX1NUQVRVU19DT05OKTsKIAlMQVNTRVJURihNRFNfU1RBVFVTX0xPViA9PSAyLCAiZm91bmQgJWxsZFxuIiwKQEAgLTIxOSw1NSArMjIxLDU1IEBACiAJTEFTU0VSVEYoTFVTVFJFX0JGTEFHX1VOQ09NTUlUVEVEX1dSSVRFUyA9PSAxLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpTFVTVFJFX0JGTEFHX1VOQ09NTUlUVEVEX1dSSVRFUyk7CiAJTEFTU0VSVEYoTUZfU09NX0NIQU5HRSA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1GX1NPTV9DSEFOR0UpOworCQkgKHVuc2lnbmVkKU1GX1NPTV9DSEFOR0UpOwogCUxBU1NFUlRGKE1GX0VQT0NIX09QRU4gPT0gMHgwMDAwMDAwMlVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNRl9FUE9DSF9PUEVOKTsKKwkJICh1bnNpZ25lZClNRl9FUE9DSF9PUEVOKTsKIAlMQVNTRVJURihNRl9FUE9DSF9DTE9TRSA9PSAweDAwMDAwMDA0VUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1GX0VQT0NIX0NMT1NFKTsKKwkJICh1bnNpZ25lZClNRl9FUE9DSF9DTE9TRSk7CiAJTEFTU0VSVEYoTUZfTURDX0NBTkNFTF9GSUQxID09IDB4MDAwMDAwMDhVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTUZfTURDX0NBTkNFTF9GSUQxKTsKKwkJICh1bnNpZ25lZClNRl9NRENfQ0FOQ0VMX0ZJRDEpOwogCUxBU1NFUlRGKE1GX01EQ19DQU5DRUxfRklEMiA9PSAweDAwMDAwMDEwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1GX01EQ19DQU5DRUxfRklEMik7CisJCSAodW5zaWduZWQpTUZfTURDX0NBTkNFTF9GSUQyKTsKIAlMQVNTRVJURihNRl9NRENfQ0FOQ0VMX0ZJRDMgPT0gMHgwMDAwMDAyMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNRl9NRENfQ0FOQ0VMX0ZJRDMpOworCQkgKHVuc2lnbmVkKU1GX01EQ19DQU5DRUxfRklEMyk7CiAJTEFTU0VSVEYoTUZfTURDX0NBTkNFTF9GSUQ0ID09IDB4MDAwMDAwNDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTUZfTURDX0NBTkNFTF9GSUQ0KTsKKwkJICh1bnNpZ25lZClNRl9NRENfQ0FOQ0VMX0ZJRDQpOwogCUxBU1NFUlRGKE1GX1NPTV9BVSA9PSAweDAwMDAwMDgwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1GX1NPTV9BVSk7CisJCSAodW5zaWduZWQpTUZfU09NX0FVKTsKIAlMQVNTRVJURihNRl9HRVRBVFRSX0xPQ0sgPT0gMHgwMDAwMDEwMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNRl9HRVRBVFRSX0xPQ0spOworCQkgKHVuc2lnbmVkKU1GX0dFVEFUVFJfTE9DSyk7CiAJTEFTU0VSVEYoTURTX0FUVFJfTU9ERSA9PSAweDAwMDAwMDAwMDAwMDAwMDFVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX01PREUpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9NT0RFKTsKIAlMQVNTRVJURihNRFNfQVRUUl9VSUQgPT0gMHgwMDAwMDAwMDAwMDAwMDAyVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9VSUQpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9VSUQpOwogCUxBU1NFUlRGKE1EU19BVFRSX0dJRCA9PSAweDAwMDAwMDAwMDAwMDAwMDRVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX0dJRCk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0dJRCk7CiAJTEFTU0VSVEYoTURTX0FUVFJfU0laRSA9PSAweDAwMDAwMDAwMDAwMDAwMDhVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX1NJWkUpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9TSVpFKTsKIAlMQVNTRVJURihNRFNfQVRUUl9BVElNRSA9PSAweDAwMDAwMDAwMDAwMDAwMTBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX0FUSU1FKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfQVRJTUUpOwogCUxBU1NFUlRGKE1EU19BVFRSX01USU1FID09IDB4MDAwMDAwMDAwMDAwMDAyMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfTVRJTUUpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9NVElNRSk7CiAJTEFTU0VSVEYoTURTX0FUVFJfQ1RJTUUgPT0gMHgwMDAwMDAwMDAwMDAwMDQwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9DVElNRSk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0NUSU1FKTsKIAlMQVNTRVJURihNRFNfQVRUUl9BVElNRV9TRVQgPT0gMHgwMDAwMDAwMDAwMDAwMDgwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9BVElNRV9TRVQpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9BVElNRV9TRVQpOwogCUxBU1NFUlRGKE1EU19BVFRSX01USU1FX1NFVCA9PSAweDAwMDAwMDAwMDAwMDAxMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX01USU1FX1NFVCk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX01USU1FX1NFVCk7CiAJTEFTU0VSVEYoTURTX0FUVFJfRk9SQ0UgPT0gMHgwMDAwMDAwMDAwMDAwMjAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9GT1JDRSk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0ZPUkNFKTsKIAlMQVNTRVJURihNRFNfQVRUUl9BVFRSX0ZMQUcgPT0gMHgwMDAwMDAwMDAwMDAwNDAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9BVFRSX0ZMQUcpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9BVFRSX0ZMQUcpOwogCUxBU1NFUlRGKE1EU19BVFRSX0tJTExfU1VJRCA9PSAweDAwMDAwMDAwMDAwMDA4MDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX0tJTExfU1VJRCk7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0tJTExfU1VJRCk7CiAJTEFTU0VSVEYoTURTX0FUVFJfS0lMTF9TR0lEID09IDB4MDAwMDAwMDAwMDAwMTAwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfS0lMTF9TR0lEKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfS0lMTF9TR0lEKTsKIAlMQVNTRVJURihNRFNfQVRUUl9DVElNRV9TRVQgPT0gMHgwMDAwMDAwMDAwMDAyMDAwVUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfQVRUUl9DVElNRV9TRVQpOworCQkgKGxvbmcgbG9uZylNRFNfQVRUUl9DVElNRV9TRVQpOwogCUxBU1NFUlRGKE1EU19BVFRSX0ZST01fT1BFTiA9PSAweDAwMDAwMDAwMDAwMDQwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKU1EU19BVFRSX0ZST01fT1BFTik7CisJCSAobG9uZyBsb25nKU1EU19BVFRSX0ZST01fT1BFTik7CiAJTEFTU0VSVEYoTURTX0FUVFJfQkxPQ0tTID09IDB4MDAwMDAwMDAwMDAwODAwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX0FUVFJfQkxPQ0tTKTsKKwkJIChsb25nIGxvbmcpTURTX0FUVFJfQkxPQ0tTKTsKIAlMQVNTRVJURihGTERfUVVFUlkgPT0gOTAwLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpRkxEX1FVRVJZKTsKIAlMQVNTRVJURihGTERfRklSU1RfT1BDID09IDkwMCwgImZvdW5kICVsbGRcbiIsCkBAIC00MTgsMTUgKzQyMCwxNSBAQAogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGx1c3RyZV9tZHRfYXR0cnMgKikwKS0+bG1hX3NlbGZfZmlkKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGx1c3RyZV9tZHRfYXR0cnMgKikwKS0+bG1hX3NlbGZfZmlkKSk7CiAJTEFTU0VSVEYoTE1BSV9SRUxFQVNFRCA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxNQUlfUkVMRUFTRUQpOworCQkgKHVuc2lnbmVkKUxNQUlfUkVMRUFTRUQpOwogCUxBU1NFUlRGKExNQUNfSFNNID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTE1BQ19IU00pOworCQkgKHVuc2lnbmVkKUxNQUNfSFNNKTsKIAlMQVNTRVJURihMTUFDX1NPTSA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxNQUNfU09NKTsKKwkJICh1bnNpZ25lZClMTUFDX1NPTSk7CiAJTEFTU0VSVEYoTE1BQ19OT1RfSU5fT0kgPT0gMHgwMDAwMDAwNFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMTUFDX05PVF9JTl9PSSk7CisJCSAodW5zaWduZWQpTE1BQ19OT1RfSU5fT0kpOwogCUxBU1NFUlRGKExNQUNfRklEX09OX09TVCA9PSAweDAwMDAwMDA4VUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxNQUNfRklEX09OX09TVCk7CisJCSAodW5zaWduZWQpTE1BQ19GSURfT05fT1NUKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IG9zdF9pZCAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBvc3RfaWQpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKQEAgLTQ1MiwzNSArNDU0LDM1IEBACiAJTEFTU0VSVEYoRklEX1NFUV9JR0lGID09IDEyLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpRklEX1NFUV9JR0lGKTsKIAlMQVNTRVJURihGSURfU0VRX0lHSUZfTUFYID09IDB4MDAwMDAwMDBmZmZmZmZmZlVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9JR0lGX01BWCk7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfSUdJRl9NQVgpOwogCUxBU1NFUlRGKEZJRF9TRVFfSURJRiA9PSAweDAwMDAwMDAxMDAwMDAwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfSURJRik7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfSURJRik7CiAJTEFTU0VSVEYoRklEX1NFUV9JRElGX01BWCA9PSAweDAwMDAwMDAxZmZmZmZmZmZVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfSURJRl9NQVgpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX0lESUZfTUFYKTsKIAlMQVNTRVJURihGSURfU0VRX1NUQVJUID09IDB4MDAwMDAwMDIwMDAwMDAwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9TVEFSVCk7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfU1RBUlQpOwogCUxBU1NFUlRGKEZJRF9TRVFfTE9DQUxfRklMRSA9PSAweDAwMDAwMDAyMDAwMDAwMDFVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfTE9DQUxfRklMRSk7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfTE9DQUxfRklMRSk7CiAJTEFTU0VSVEYoRklEX1NFUV9ET1RfTFVTVFJFID09IDB4MDAwMDAwMDIwMDAwMDAwMlVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9ET1RfTFVTVFJFKTsKKwkJIChsb25nIGxvbmcpRklEX1NFUV9ET1RfTFVTVFJFKTsKIAlMQVNTRVJURihGSURfU0VRX1NQRUNJQUwgPT0gMHgwMDAwMDAwMjAwMDAwMDA0VUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX1NQRUNJQUwpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX1NQRUNJQUwpOwogCUxBU1NFUlRGKEZJRF9TRVFfUVVPVEEgPT0gMHgwMDAwMDAwMjAwMDAwMDA1VUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX1FVT1RBKTsKKwkJIChsb25nIGxvbmcpRklEX1NFUV9RVU9UQSk7CiAJTEFTU0VSVEYoRklEX1NFUV9RVU9UQV9HTEIgPT0gMHgwMDAwMDAwMjAwMDAwMDA2VUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX1FVT1RBX0dMQik7CisJCSAobG9uZyBsb25nKUZJRF9TRVFfUVVPVEFfR0xCKTsKIAlMQVNTRVJURihGSURfU0VRX1JPT1QgPT0gMHgwMDAwMDAwMjAwMDAwMDA3VUxMLCAiZm91bmQgMHglLjE2bGx4VUxMXG4iLAotCQkJKGxvbmcgbG9uZylGSURfU0VRX1JPT1QpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX1JPT1QpOwogCUxBU1NFUlRGKEZJRF9TRVFfTk9STUFMID09IDB4MDAwMDAwMDIwMDAwMDQwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKLQkJCShsb25nIGxvbmcpRklEX1NFUV9OT1JNQUwpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX05PUk1BTCk7CiAJTEFTU0VSVEYoRklEX1NFUV9MT1ZfREVGQVVMVCA9PSAweGZmZmZmZmZmZmZmZmZmZmZVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCi0JCQkobG9uZyBsb25nKUZJRF9TRVFfTE9WX0RFRkFVTFQpOworCQkgKGxvbmcgbG9uZylGSURfU0VRX0xPVl9ERUZBVUxUKTsKIAlMQVNTRVJURihGSURfT0lEX1NQRUNJQUxfQkZMID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRklEX09JRF9TUEVDSUFMX0JGTCk7CisJCSAodW5zaWduZWQpRklEX09JRF9TUEVDSUFMX0JGTCk7CiAJTEFTU0VSVEYoRklEX09JRF9ET1RfTFVTVFJFID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpRklEX09JRF9ET1RfTFVTVFJFKTsKKwkJICh1bnNpZ25lZClGSURfT0lEX0RPVF9MVVNUUkUpOwogCUxBU1NFUlRGKEZJRF9PSURfRE9UX0xVU1RSRV9PQkYgPT0gMHgwMDAwMDAwMlVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClGSURfT0lEX0RPVF9MVVNUUkVfT0JGKTsKKwkJICh1bnNpZ25lZClGSURfT0lEX0RPVF9MVVNUUkVfT0JGKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IGx1X2RpcmVudCAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBsdV9kaXJlbnQpID09IDMyLCAiZm91bmQgJWxsZFxuIiwKQEAgLTUxMCwxMSArNTEyLDExIEBACiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbHVfZGlyZW50ICopMCktPmxkZV9uYW1lWzBdKSA9PSAxLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbHVfZGlyZW50ICopMCktPmxkZV9uYW1lWzBdKSk7CiAJTEFTU0VSVEYoTFVEQV9GSUQgPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMVURBX0ZJRCk7CisJCSAodW5zaWduZWQpTFVEQV9GSUQpOwogCUxBU1NFUlRGKExVREFfVFlQRSA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxVREFfVFlQRSk7CisJCSAodW5zaWduZWQpTFVEQV9UWVBFKTsKIAlMQVNTRVJURihMVURBXzY0QklUSEFTSCA9PSAweDAwMDAwMDA0VUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxVREFfNjRCSVRIQVNIKTsKKwkJICh1bnNpZ25lZClMVURBXzY0QklUSEFTSCk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBsdWRhX3R5cGUgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgbHVkYV90eXBlKSA9PSAyLCAiZm91bmQgJWxsZFxuIiwKQEAgLTYwMiw5ICs2MDQsOSBAQAogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGx1c3RyZV9tc2dfdjIgKikwKS0+bG1fYnVmbGVuc1swXSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGx1c3RyZV9tc2dfdjIgKikwKS0+bG1fYnVmbGVuc1swXSkpOwogCUxBU1NFUlRGKExVU1RSRV9NU0dfTUFHSUNfVjIgPT0gMHgwQkQwMEJEMywgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX01TR19NQUdJQ19WMik7CisJCSBMVVNUUkVfTVNHX01BR0lDX1YyKTsKIAlMQVNTRVJURihMVVNUUkVfTVNHX01BR0lDX1YyX1NXQUJCRUQgPT0gMHhEMzBCRDAwQiwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX01TR19NQUdJQ19WMl9TV0FCQkVEKTsKKwkJIExVU1RSRV9NU0dfTUFHSUNfVjJfU1dBQkJFRCk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBwdGxycGNfYm9keSAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBwdGxycGNfYm9keV92MykgPT0gMTg0LCAiZm91bmQgJWxsZFxuIiwKQEAgLTY4Miw3ICs2ODQsNyBAQAogCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBwdGxycGNfYm9keV92MywgcGJfcGFkZGluZykpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IHB0bHJwY19ib2R5X3YzICopMCktPnBiX3BhZGRpbmcpID09IDMyLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgcHRscnBjX2JvZHlfdjMgKikwKS0+cGJfcGFkZGluZykpOwotCUNMQVNTRVJUKEpPQlNUQVRTX0pPQklEX1NJWkUgPT0gMzIpOworCUNMQVNTRVJUKExVU1RSRV9KT0JJRF9TSVpFID09IDMyKTsKIAlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBwdGxycGNfYm9keV92MywgcGJfam9iaWQpID09IDE1MiwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IHB0bHJwY19ib2R5X3YzLCBwYl9qb2JpZCkpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IHB0bHJwY19ib2R5X3YzICopMCktPnBiX2pvYmlkKSA9PSAzMiwgImZvdW5kICVsbGRcbiIsCkBAIC03ODAsNjEgKzc4Miw2MSBAQAogCUxBU1NFUlRGKE1TR19QVExSUENfSEVBREVSX09GRiA9PSAzMSwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKU1TR19QVExSUENfSEVBREVSX09GRik7CiAJTEFTU0VSVEYoUFRMUlBDX01TR19WRVJTSU9OID09IDB4MDAwMDAwMDMsICJmb3VuZCAweCUuOHhcbiIsCi0JCVBUTFJQQ19NU0dfVkVSU0lPTik7CisJCSBQVExSUENfTVNHX1ZFUlNJT04pOwogCUxBU1NFUlRGKExVU1RSRV9WRVJTSU9OX01BU0sgPT0gMHhmZmZmMDAwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX1ZFUlNJT05fTUFTSyk7CisJCSBMVVNUUkVfVkVSU0lPTl9NQVNLKTsKIAlMQVNTRVJURihMVVNUUkVfT0JEX1ZFUlNJT04gPT0gMHgwMDAxMDAwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX09CRF9WRVJTSU9OKTsKKwkJIExVU1RSRV9PQkRfVkVSU0lPTik7CiAJTEFTU0VSVEYoTFVTVFJFX01EU19WRVJTSU9OID09IDB4MDAwMjAwMDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCUxVU1RSRV9NRFNfVkVSU0lPTik7CisJCSBMVVNUUkVfTURTX1ZFUlNJT04pOwogCUxBU1NFUlRGKExVU1RSRV9PU1RfVkVSU0lPTiA9PSAweDAwMDMwMDAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfT1NUX1ZFUlNJT04pOworCQkgTFVTVFJFX09TVF9WRVJTSU9OKTsKIAlMQVNTRVJURihMVVNUUkVfRExNX1ZFUlNJT04gPT0gMHgwMDA0MDAwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX0RMTV9WRVJTSU9OKTsKKwkJIExVU1RSRV9ETE1fVkVSU0lPTik7CiAJTEFTU0VSVEYoTFVTVFJFX0xPR19WRVJTSU9OID09IDB4MDAwNTAwMDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCUxVU1RSRV9MT0dfVkVSU0lPTik7CisJCSBMVVNUUkVfTE9HX1ZFUlNJT04pOwogCUxBU1NFUlRGKExVU1RSRV9NR1NfVkVSU0lPTiA9PSAweDAwMDYwMDAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfTUdTX1ZFUlNJT04pOworCQkgTFVTVFJFX01HU19WRVJTSU9OKTsKIAlMQVNTRVJURihNU0dIRFJfQVRfU1VQUE9SVCA9PSAxLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpTVNHSERSX0FUX1NVUFBPUlQpOwogCUxBU1NFUlRGKE1TR0hEUl9DS1NVTV9JTkNPTVBBVDE4ID09IDIsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZylNU0dIRFJfQ0tTVU1fSU5DT01QQVQxOCk7CiAJTEFTU0VSVEYoTVNHX09QX0ZMQUdfTUFTSyA9PSAweGZmZmYwMDAwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19PUF9GTEFHX01BU0spOworCQkgKHVuc2lnbmVkKU1TR19PUF9GTEFHX01BU0spOwogCUxBU1NFUlRGKE1TR19PUF9GTEFHX1NISUZUID09IDE2LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpTVNHX09QX0ZMQUdfU0hJRlQpOwogCUxBU1NFUlRGKE1TR19HRU5fRkxBR19NQVNLID09IDB4MDAwMGZmZmZVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0dFTl9GTEFHX01BU0spOworCQkgKHVuc2lnbmVkKU1TR19HRU5fRkxBR19NQVNLKTsKIAlMQVNTRVJURihNU0dfTEFTVF9SRVBMQVkgPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfTEFTVF9SRVBMQVkpOworCQkgKHVuc2lnbmVkKU1TR19MQVNUX1JFUExBWSk7CiAJTEFTU0VSVEYoTVNHX1JFU0VOVCA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19SRVNFTlQpOworCQkgKHVuc2lnbmVkKU1TR19SRVNFTlQpOwogCUxBU1NFUlRGKE1TR19SRVBMQVkgPT0gMHgwMDAwMDAwNFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfUkVQTEFZKTsKKwkJICh1bnNpZ25lZClNU0dfUkVQTEFZKTsKIAlMQVNTRVJURihNU0dfREVMQVlfUkVQTEFZID09IDB4MDAwMDAwMTBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0RFTEFZX1JFUExBWSk7CisJCSAodW5zaWduZWQpTVNHX0RFTEFZX1JFUExBWSk7CiAJTEFTU0VSVEYoTVNHX1ZFUlNJT05fUkVQTEFZID09IDB4MDAwMDAwMjBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX1ZFUlNJT05fUkVQTEFZKTsKKwkJICh1bnNpZ25lZClNU0dfVkVSU0lPTl9SRVBMQVkpOwogCUxBU1NFUlRGKE1TR19SRVFfUkVQTEFZX0RPTkUgPT0gMHgwMDAwMDA0MFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfUkVRX1JFUExBWV9ET05FKTsKKwkJICh1bnNpZ25lZClNU0dfUkVRX1JFUExBWV9ET05FKTsKIAlMQVNTRVJURihNU0dfTE9DS19SRVBMQVlfRE9ORSA9PSAweDAwMDAwMDgwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19MT0NLX1JFUExBWV9ET05FKTsKKwkJICh1bnNpZ25lZClNU0dfTE9DS19SRVBMQVlfRE9ORSk7CiAJTEFTU0VSVEYoTVNHX0NPTk5FQ1RfUkVDT1ZFUklORyA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19DT05ORUNUX1JFQ09WRVJJTkcpOworCQkgKHVuc2lnbmVkKU1TR19DT05ORUNUX1JFQ09WRVJJTkcpOwogCUxBU1NFUlRGKE1TR19DT05ORUNUX1JFQ09OTkVDVCA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19DT05ORUNUX1JFQ09OTkVDVCk7CisJCSAodW5zaWduZWQpTVNHX0NPTk5FQ1RfUkVDT05ORUNUKTsKIAlMQVNTRVJURihNU0dfQ09OTkVDVF9SRVBMQVlBQkxFID09IDB4MDAwMDAwMDRVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0NPTk5FQ1RfUkVQTEFZQUJMRSk7CisJCSAodW5zaWduZWQpTVNHX0NPTk5FQ1RfUkVQTEFZQUJMRSk7CiAJTEFTU0VSVEYoTVNHX0NPTk5FQ1RfTElCQ0xJRU5UID09IDB4MDAwMDAwMTBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTVNHX0NPTk5FQ1RfTElCQ0xJRU5UKTsKKwkJICh1bnNpZ25lZClNU0dfQ09OTkVDVF9MSUJDTElFTlQpOwogCUxBU1NFUlRGKE1TR19DT05ORUNUX0lOSVRJQUwgPT0gMHgwMDAwMDAyMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfQ09OTkVDVF9JTklUSUFMKTsKKwkJICh1bnNpZ25lZClNU0dfQ09OTkVDVF9JTklUSUFMKTsKIAlMQVNTRVJURihNU0dfQ09OTkVDVF9BU1lOQyA9PSAweDAwMDAwMDQwVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKU1TR19DT05ORUNUX0FTWU5DKTsKKwkJICh1bnNpZ25lZClNU0dfQ09OTkVDVF9BU1lOQyk7CiAJTEFTU0VSVEYoTVNHX0NPTk5FQ1RfTkVYVF9WRVIgPT0gMHgwMDAwMDA4MFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfQ09OTkVDVF9ORVhUX1ZFUik7CisJCSAodW5zaWduZWQpTVNHX0NPTk5FQ1RfTkVYVF9WRVIpOwogCUxBU1NFUlRGKE1TR19DT05ORUNUX1RSQU5TTk8gPT0gMHgwMDAwMDEwMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClNU0dfQ09OTkVDVF9UUkFOU05PKTsKKwkJICh1bnNpZ25lZClNU0dfQ09OTkVDVF9UUkFOU05PKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IG9iZF9jb25uZWN0X2RhdGEgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSkgPT0gMTkyLCAiZm91bmQgJWxsZFxuIiwKQEAgLTEwNjksMTIgKzEwNzEsMTggQEAKIAkJICJmb3VuZCAweCUuMTZsbHhVTExcbiIsIE9CRF9DT05ORUNUX0ZMT0NLX0RFQUQpOwogCUxBU1NFUlRGKE9CRF9DT05ORUNUX09QRU5fQllfRklEID09IDB4MjAwMDAwMDAwMDAwMDBVTEwsCiAJCSAiZm91bmQgMHglLjE2bGx4VUxMXG4iLCBPQkRfQ09OTkVDVF9PUEVOX0JZX0ZJRCk7CisJTEFTU0VSVEYoT0JEX0NPTk5FQ1RfTEZTQ0sgPT0gMHg0MDAwMDAwMDAwMDAwMFVMTCwgImZvdW5kIDB4JS4xNmxseFVMTFxuIiwKKwkJIE9CRF9DT05ORUNUX0xGU0NLKTsKKwlMQVNTRVJURihPQkRfQ09OTkVDVF9VTkxJTktfQ0xPU0UgPT0gMHgxMDAwMDAwMDAwMDAwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCisJCSBPQkRfQ09OTkVDVF9VTkxJTktfQ0xPU0UpOworCUxBU1NFUlRGKE9CRF9DT05ORUNUX0RJUl9TVFJJUEUgPT0gMHg0MDAwMDAwMDAwMDAwMDBVTEwsICJmb3VuZCAweCUuMTZsbHhVTExcbiIsCisJCSBPQkRfQ09OTkVDVF9ESVJfU1RSSVBFKTsKIAlMQVNTRVJURihPQkRfQ0tTVU1fQ1JDMzIgPT0gMHgwMDAwMDAwMVVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClPQkRfQ0tTVU1fQ1JDMzIpOworCQkgKHVuc2lnbmVkKU9CRF9DS1NVTV9DUkMzMik7CiAJTEFTU0VSVEYoT0JEX0NLU1VNX0FETEVSID09IDB4MDAwMDAwMDJVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpT0JEX0NLU1VNX0FETEVSKTsKKwkJICh1bnNpZ25lZClPQkRfQ0tTVU1fQURMRVIpOwogCUxBU1NFUlRGKE9CRF9DS1NVTV9DUkMzMkMgPT0gMHgwMDAwMDAwNFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClPQkRfQ0tTVU1fQ1JDMzJDKTsKKwkJICh1bnNpZ25lZClPQkRfQ0tTVU1fQ1JDMzJDKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IG9iZG8gKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3Qgb2JkbykgPT0gMjA4LCAiZm91bmQgJWxsZFxuIiwKQEAgLTEzNDYsNyArMTM1NCw3IEBACiAJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxvdl9tZHNfbWRfdjEsIGxtbV9vYmplY3RzWzBdKSk7CiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG92X21kc19tZF92MSAqKTApLT5sbW1fb2JqZWN0c1swXSkgPT0gMjQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsb3ZfbWRzX21kX3YxICopMCktPmxtbV9vYmplY3RzWzBdKSk7Ci0JQ0xBU1NFUlQoTE9WX01BR0lDX1YxID09IDB4MEJEMTBCRDApOworCUNMQVNTRVJUKExPVl9NQUdJQ19WMSA9PSAoMHgwQkQxMDAwMCB8IDB4MEJEMCkpOwogCiAJLyogQ2hlY2tzIGZvciBzdHJ1Y3QgbG92X21kc19tZF92MyAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBsb3ZfbWRzX21kX3YzKSA9PSA0OCwgImZvdW5kICVsbGRcbiIsCkBAIC0xMzc1LDcgKzEzODMsNyBAQAogCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsb3ZfbWRzX21kX3YzLCBsbW1fbGF5b3V0X2dlbikpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxvdl9tZHNfbWRfdjMgKikwKS0+bG1tX2xheW91dF9nZW4pID09IDIsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsb3ZfbWRzX21kX3YzICopMCktPmxtbV9sYXlvdXRfZ2VuKSk7Ci0JQ0xBU1NFUlQoTE9WX01BWFBPT0xOQU1FID09IDE2KTsKKwlDTEFTU0VSVChMT1ZfTUFYUE9PTE5BTUUgPT0gMTUpOwogCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxvdl9tZHNfbWRfdjMsIGxtbV9wb29sX25hbWVbMTZdKSA9PSA0OCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxvdl9tZHNfbWRfdjMsIGxtbV9wb29sX25hbWVbMTZdKSk7CiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG92X21kc19tZF92MyAqKTApLT5sbW1fcG9vbF9uYW1lWzE2XSkgPT0gMSwgImZvdW5kICVsbGRcbiIsCkBAIC0xMzg0LDE1ICsxMzkyLDY0IEBACiAJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxvdl9tZHNfbWRfdjMsIGxtbV9vYmplY3RzWzBdKSk7CiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG92X21kc19tZF92MyAqKTApLT5sbW1fb2JqZWN0c1swXSkgPT0gMjQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsb3ZfbWRzX21kX3YzICopMCktPmxtbV9vYmplY3RzWzBdKSk7Ci0JQ0xBU1NFUlQoTE9WX01BR0lDX1YzID09IDB4MEJEMzBCRDApOworCUNMQVNTRVJUKExPVl9NQUdJQ19WMyA9PSAoMHgwQkQzMDAwMCB8IDB4MEJEMCkpOwogCUxBU1NFUlRGKExPVl9QQVRURVJOX1JBSUQwID09IDB4MDAwMDAwMDFVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTE9WX1BBVFRFUk5fUkFJRDApOworCQkgKHVuc2lnbmVkKUxPVl9QQVRURVJOX1JBSUQwKTsKIAlMQVNTRVJURihMT1ZfUEFUVEVSTl9SQUlEMSA9PSAweDAwMDAwMDAyVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUxPVl9QQVRURVJOX1JBSUQxKTsKKwkJICh1bnNpZ25lZClMT1ZfUEFUVEVSTl9SQUlEMSk7CiAJTEFTU0VSVEYoTE9WX1BBVFRFUk5fRklSU1QgPT0gMHgwMDAwMDEwMFVMLCAiZm91bmQgMHglLjh4VUxcbiIsCi0JCSh1bnNpZ25lZClMT1ZfUEFUVEVSTl9GSVJTVCk7CisJCSAodW5zaWduZWQpTE9WX1BBVFRFUk5fRklSU1QpOwogCUxBU1NFUlRGKExPVl9QQVRURVJOX0NNT0JEID09IDB4MDAwMDAyMDBVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpTE9WX1BBVFRFUk5fQ01PQkQpOworCQkgKHVuc2lnbmVkKUxPVl9QQVRURVJOX0NNT0JEKTsKKworCS8qIENoZWNrcyBmb3Igc3RydWN0IGxtdl9tZHNfbWRfdjEgKi8KKwlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgbG12X21kc19tZF92MSkgPT0gNTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZihzdHJ1Y3QgbG12X21kc19tZF92MSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9tYWdpYykgPT0gMCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9tYWdpYykpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X21hZ2ljKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfbWFnaWMpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfc3RyaXBlX2NvdW50KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3N0cmlwZV9jb3VudCkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X3N0cmlwZV9jb3VudCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X3N0cmlwZV9jb3VudCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9tYXN0ZXJfbWR0X2luZGV4KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X21hc3Rlcl9tZHRfaW5kZXgpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9tYXN0ZXJfbWR0X2luZGV4KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfbWFzdGVyX21kdF9pbmRleCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9oYXNoX3R5cGUpID09IDEyLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X2hhc2hfdHlwZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X2hhc2hfdHlwZSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X2hhc2hfdHlwZSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9sYXlvdXRfdmVyc2lvbikgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfbGF5b3V0X3ZlcnNpb24pKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9sYXlvdXRfdmVyc2lvbikgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X2xheW91dF92ZXJzaW9uKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3BhZGRpbmcxKSA9PSAyMCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9wYWRkaW5nMSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X3BhZGRpbmcxKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfcGFkZGluZzEpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfcGFkZGluZzIpID09IDI0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3BhZGRpbmcyKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfcGFkZGluZzIpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9wYWRkaW5nMikpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9wYWRkaW5nMykgPT0gMzIsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfcGFkZGluZzMpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9wYWRkaW5nMykgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9tZHNfbWRfdjEgKikwKS0+bG12X3BhZGRpbmczKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3Bvb2xfbmFtZVsxNl0pID09IDU2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X21kc19tZF92MSwgbG12X3Bvb2xfbmFtZVsxNl0pKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9wb29sX25hbWVbMTZdKSA9PSAxLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X21kc19tZF92MSAqKTApLT5sbXZfcG9vbF9uYW1lWzE2XSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9tZHNfbWRfdjEsIGxtdl9zdHJpcGVfZmlkc1swXSkgPT0gNTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfbWRzX21kX3YxLCBsbXZfc3RyaXBlX2ZpZHNbMF0pKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9zdHJpcGVfZmlkc1swXSkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfbWRzX21kX3YxICopMCktPmxtdl9zdHJpcGVfZmlkc1swXSkpOworCUNMQVNTRVJUKExNVl9NQUdJQ19WMSA9PSAweDBDRDIwQ0QwKTsKKwlDTEFTU0VSVChMTVZfTUFHSUNfU1RSSVBFID09IDB4MENENDBDRDApOworCUNMQVNTRVJUKExNVl9IQVNIX1RZUEVfTUFTSyA9PSAweDAwMDBmZmZmKTsKKwlDTEFTU0VSVChMTVZfSEFTSF9GTEFHX01JR1JBVElPTiA9PSAweDgwMDAwMDAwKTsKKwlDTEFTU0VSVChMTVZfSEFTSF9GTEFHX0RFQUQgPT0gMHg0MDAwMDAwMCk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBvYmRfc3RhdGZzICovCiAJTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IG9iZF9zdGF0ZnMpID09IDE0NCwgImZvdW5kICVsbGRcbiIsCkBAIC0xNTgyLDUzICsxNjM5LDUzIEBACiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3Qgb2JkX2RxYmxrICopMCktPmRxYl9wYWRkaW5nKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3Qgb2JkX2RxYmxrICopMCktPmRxYl9wYWRkaW5nKSk7CiAJTEFTU0VSVEYoUV9RVU9UQUNIRUNLID09IDB4ODAwMTAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlRX1FVT1RBQ0hFQ0spOworCQkgUV9RVU9UQUNIRUNLKTsKIAlMQVNTRVJURihRX0lOSVRRVU9UQSA9PSAweDgwMDEwMSwgImZvdW5kIDB4JS44eFxuIiwKLQkJUV9JTklUUVVPVEEpOworCQkgUV9JTklUUVVPVEEpOwogCUxBU1NFUlRGKFFfR0VUT0lORk8gPT0gMHg4MDAxMDIsICJmb3VuZCAweCUuOHhcbiIsCi0JCVFfR0VUT0lORk8pOworCQkgUV9HRVRPSU5GTyk7CiAJTEFTU0VSVEYoUV9HRVRPUVVPVEEgPT0gMHg4MDAxMDMsICJmb3VuZCAweCUuOHhcbiIsCi0JCVFfR0VUT1FVT1RBKTsKKwkJIFFfR0VUT1FVT1RBKTsKIAlMQVNTRVJURihRX0ZJTlZBTElEQVRFID09IDB4ODAwMTA0LCAiZm91bmQgMHglLjh4XG4iLAotCQlRX0ZJTlZBTElEQVRFKTsKKwkJIFFfRklOVkFMSURBVEUpOwogCiAJLyogQ2hlY2tzIGZvciBzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBuaW9idWZfcmVtb3RlKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKHN0cnVjdCBuaW9idWZfcmVtb3RlKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgb2Zmc2V0KSA9PSAwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgb2Zmc2V0KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqKTApLT5vZmZzZXQpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPm9mZnNldCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIGxlbikgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIGxlbikpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+bGVuKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbmlvYnVmX3JlbW90ZSAqKTApLT5sZW4pKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBmbGFncykgPT0gMTIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBmbGFncykpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+ZmxhZ3MpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPmZsYWdzKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgcm5iX29mZnNldCkgPT0gMCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIHJuYl9vZmZzZXQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPnJuYl9vZmZzZXQpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPnJuYl9vZmZzZXQpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBybmJfbGVuKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbmlvYnVmX3JlbW90ZSwgcm5iX2xlbikpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+cm5iX2xlbikgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+cm5iX2xlbikpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG5pb2J1Zl9yZW1vdGUsIHJuYl9mbGFncykgPT0gMTIsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBuaW9idWZfcmVtb3RlLCBybmJfZmxhZ3MpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBuaW9idWZfcmVtb3RlICopMCktPnJuYl9mbGFncykgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG5pb2J1Zl9yZW1vdGUgKikwKS0+cm5iX2ZsYWdzKSk7CiAJTEFTU0VSVEYoT0JEX0JSV19SRUFEID09IDB4MDEsICJmb3VuZCAweCUuOHhcbiIsCi0JCU9CRF9CUldfUkVBRCk7CisJCSBPQkRfQlJXX1JFQUQpOwogCUxBU1NFUlRGKE9CRF9CUldfV1JJVEUgPT0gMHgwMiwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19XUklURSk7CisJCSBPQkRfQlJXX1dSSVRFKTsKIAlMQVNTRVJURihPQkRfQlJXX1NZTkMgPT0gMHgwOCwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19TWU5DKTsKKwkJIE9CRF9CUldfU1lOQyk7CiAJTEFTU0VSVEYoT0JEX0JSV19DSEVDSyA9PSAweDEwLCAiZm91bmQgMHglLjh4XG4iLAotCQlPQkRfQlJXX0NIRUNLKTsKKwkJIE9CRF9CUldfQ0hFQ0spOwogCUxBU1NFUlRGKE9CRF9CUldfRlJPTV9HUkFOVCA9PSAweDIwLCAiZm91bmQgMHglLjh4XG4iLAotCQlPQkRfQlJXX0ZST01fR1JBTlQpOworCQkgT0JEX0JSV19GUk9NX0dSQU5UKTsKIAlMQVNTRVJURihPQkRfQlJXX0dSQU5URUQgPT0gMHg0MCwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19HUkFOVEVEKTsKKwkJIE9CRF9CUldfR1JBTlRFRCk7CiAJTEFTU0VSVEYoT0JEX0JSV19OT0NBQ0hFID09IDB4ODAsICJmb3VuZCAweCUuOHhcbiIsCi0JCU9CRF9CUldfTk9DQUNIRSk7CisJCSBPQkRfQlJXX05PQ0FDSEUpOwogCUxBU1NFUlRGKE9CRF9CUldfTk9RVU9UQSA9PSAweDEwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJT0JEX0JSV19OT1FVT1RBKTsKKwkJIE9CRF9CUldfTk9RVU9UQSk7CiAJTEFTU0VSVEYoT0JEX0JSV19TUlZMT0NLID09IDB4MjAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlPQkRfQlJXX1NSVkxPQ0spOworCQkgT0JEX0JSV19TUlZMT0NLKTsKIAlMQVNTRVJURihPQkRfQlJXX0FTWU5DID09IDB4NDAwLCAiZm91bmQgMHglLjh4XG4iLAotCQlPQkRfQlJXX0FTWU5DKTsKKwkJIE9CRF9CUldfQVNZTkMpOwogCUxBU1NFUlRGKE9CRF9CUldfTUVNQUxMT0MgPT0gMHg4MDAsICJmb3VuZCAweCUuOHhcbiIsCi0JCU9CRF9CUldfTUVNQUxMT0MpOworCQkgT0JEX0JSV19NRU1BTExPQyk7CiAJTEFTU0VSVEYoT0JEX0JSV19PVkVSX1VTUlFVT1RBID09IDB4MTAwMCwgImZvdW5kIDB4JS44eFxuIiwKIAkJIE9CRF9CUldfT1ZFUl9VU1JRVU9UQSk7CiAJTEFTU0VSVEYoT0JEX0JSV19PVkVSX0dSUFFVT1RBID09IDB4MjAwMCwgImZvdW5kIDB4JS44eFxuIiwKQEAgLTE2NjMsMjAzICsxNzIwLDIwMyBAQAogCS8qIENoZWNrcyBmb3Igc3RydWN0IG1kdF9ib2R5ICovCiAJTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IG1kdF9ib2R5KSA9PSAyMTYsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZihzdHJ1Y3QgbWR0X2JvZHkpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZmlkMSkgPT0gMCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBmaWQxKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZmlkMSkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5maWQxKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGZpZDIpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGZpZDIpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5maWQyKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZpZDIpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgaGFuZGxlKSA9PSAzMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBoYW5kbGUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5oYW5kbGUpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5oYW5kbGUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdmFsaWQpID09IDQwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHZhbGlkKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+dmFsaWQpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT52YWxpZCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBzaXplKSA9PSA0OCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBzaXplKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+c2l6ZSkgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnNpemUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbXRpbWUpID09IDU2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG10aW1lKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bXRpbWUpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tdGltZSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBhdGltZSkgPT0gNjQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgYXRpbWUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5hdGltZSkgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmF0aW1lKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGN0aW1lKSA9PSA3MiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBjdGltZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmN0aW1lKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+Y3RpbWUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgYmxvY2tzKSA9PSA4MCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBibG9ja3MpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5ibG9ja3MpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5ibG9ja3MpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdF9zdGF0ZSkgPT0gOTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdF9zdGF0ZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnRfc3RhdGUpID09IDgsCisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19maWQxKSA9PSAwLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19maWQxKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2ZpZDEpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2ZpZDEpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2ZpZDIpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19maWQyKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2ZpZDIpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2ZpZDIpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2hhbmRsZSkgPT0gMzIsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2hhbmRsZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19oYW5kbGUpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9faGFuZGxlKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib192YWxpZCkgPT0gNDAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3ZhbGlkKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3ZhbGlkKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3ZhbGlkKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19zaXplKSA9PSA0OCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fc2l6ZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19zaXplKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3NpemUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX210aW1lKSA9PSA1NiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fbXRpbWUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fbXRpbWUpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fbXRpbWUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2F0aW1lKSA9PSA2NCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fYXRpbWUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fYXRpbWUpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fYXRpbWUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2N0aW1lKSA9PSA3MiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fY3RpbWUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fY3RpbWUpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fY3RpbWUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2Jsb2NrcykgPT0gODAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2Jsb2NrcykpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19ibG9ja3MpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fYmxvY2tzKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib190X3N0YXRlKSA9PSA5NiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fdF9zdGF0ZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib190X3N0YXRlKSA9PSA4LAogCQkgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnRfc3RhdGUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZnN1aWQpID09IDEwNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBmc3VpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZzdWlkKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZnN1aWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZnNnaWQpID09IDEwOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBmc2dpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZzZ2lkKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZnNnaWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgY2FwYWJpbGl0eSkgPT0gMTEyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGNhcGFiaWxpdHkpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5jYXBhYmlsaXR5KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+Y2FwYWJpbGl0eSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtb2RlKSA9PSAxMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbW9kZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1vZGUpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tb2RlKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHVpZCkgPT0gMTIwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHVpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnVpZCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnVpZCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBnaWQpID09IDEyNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBnaWQpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5naWQpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5naWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZmxhZ3MpID09IDEyOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBmbGFncykpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmZsYWdzKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZmxhZ3MpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcmRldikgPT0gMTMyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHJkZXYpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5yZGV2KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cmRldikpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBubGluaykgPT0gMTM2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG5saW5rKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bmxpbmspID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5ubGluaykpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCB1bnVzZWQyKSA9PSAxNDAsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdW51c2VkMikpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnVudXNlZDIpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT51bnVzZWQyKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHN1cHBnaWQpID09IDE0NCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBzdXBwZ2lkKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+c3VwcGdpZCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnN1cHBnaWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZWFkYXRhc2l6ZSkgPT0gMTQ4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIGVhZGF0YXNpemUpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5lYWRhdGFzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+ZWFkYXRhc2l6ZSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBhY2xzaXplKSA9PSAxNTIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgYWNsc2l6ZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmFjbHNpemUpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5hY2xzaXplKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1heF9tZHNpemUpID09IDE1NiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYXhfbWRzaXplKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWF4X21kc2l6ZSkgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1heF9tZHNpemUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWF4X2Nvb2tpZXNpemUpID09IDE2MCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYXhfY29va2llc2l6ZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1heF9jb29raWVzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWF4X2Nvb2tpZXNpemUpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgdWlkX2gpID09IDE2NCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCB1aWRfaCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnVpZF9oKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+dWlkX2gpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgZ2lkX2gpID09IDE2OCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBnaWRfaCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPmdpZF9oKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+Z2lkX2gpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ181KSA9PSAxNzIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ181KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cGFkZGluZ181KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cGFkZGluZ181KSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfNikgPT0gMTc2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfNikpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfNikgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfNikpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBwYWRkaW5nXzcpID09IDE4NCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBwYWRkaW5nXzcpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5wYWRkaW5nXzcpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5wYWRkaW5nXzcpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ184KSA9PSAxOTIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ184KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cGFkZGluZ184KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+cGFkZGluZ184KSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfOSkgPT0gMjAwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIHBhZGRpbmdfOSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfOSkgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfOSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBwYWRkaW5nXzEwKSA9PSAyMDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgcGFkZGluZ18xMCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPnBhZGRpbmdfMTApID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5wYWRkaW5nXzEwKSk7CisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib190X3N0YXRlKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19mc3VpZCkgPT0gMTA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19mc3VpZCkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19mc3VpZCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19mc3VpZCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZnNnaWQpID09IDEwOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZnNnaWQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZnNnaWQpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZnNnaWQpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2NhcGFiaWxpdHkpID09IDExMiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fY2FwYWJpbGl0eSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19jYXBhYmlsaXR5KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2NhcGFiaWxpdHkpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX21vZGUpID09IDExNiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fbW9kZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19tb2RlKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX21vZGUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3VpZCkgPT0gMTIwLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib191aWQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fdWlkKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3VpZCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZ2lkKSA9PSAxMjQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2dpZCkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19naWQpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZ2lkKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19mbGFncykgPT0gMTI4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19mbGFncykpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19mbGFncykgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19mbGFncykpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcmRldikgPT0gMTMyLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19yZGV2KSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3JkZXYpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcmRldikpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fbmxpbmspID09IDEzNiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fbmxpbmspKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fbmxpbmspID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fbmxpbmspKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3VudXNlZDIpID09IDE0MCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fdW51c2VkMikpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib191bnVzZWQyKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3VudXNlZDIpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3N1cHBnaWQpID09IDE0NCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fc3VwcGdpZCkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19zdXBwZ2lkKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3N1cHBnaWQpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2VhZGF0YXNpemUpID09IDE0OCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZWFkYXRhc2l6ZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19lYWRhdGFzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2VhZGF0YXNpemUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX2FjbHNpemUpID09IDE1MiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fYWNsc2l6ZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19hY2xzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX2FjbHNpemUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX21heF9tZHNpemUpID09IDE1NiwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fbWF4X21kc2l6ZSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19tYXhfbWRzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX21heF9tZHNpemUpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX21heF9jb29raWVzaXplKSA9PSAxNjAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX21heF9jb29raWVzaXplKSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX21heF9jb29raWVzaXplKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX21heF9jb29raWVzaXplKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib191aWRfaCkgPT0gMTY0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib191aWRfaCkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib191aWRfaCkgPT0gNCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib191aWRfaCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZ2lkX2gpID09IDE2OCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fZ2lkX2gpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZ2lkX2gpID09IDQsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fZ2lkX2gpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfNSkgPT0gMTcyLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzUpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ181KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3BhZGRpbmdfNSkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcGFkZGluZ182KSA9PSAxNzYsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfNikpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19wYWRkaW5nXzYpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ182KSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzcpID09IDE4NCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcGFkZGluZ183KSk7CisJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3BhZGRpbmdfNykgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19wYWRkaW5nXzcpKTsKKwlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfOCkgPT0gMTkyLCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzgpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ184KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbWR0X2JvZHkgKikwKS0+bWJvX3BhZGRpbmdfOCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IG1kdF9ib2R5LCBtYm9fcGFkZGluZ185KSA9PSAyMDAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfOSkpOworCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19wYWRkaW5nXzkpID09IDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ185KSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbWR0X2JvZHksIG1ib19wYWRkaW5nXzEwKSA9PSAyMDgsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBtZHRfYm9keSwgbWJvX3BhZGRpbmdfMTApKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBtZHRfYm9keSAqKTApLT5tYm9fcGFkZGluZ18xMCkgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IG1kdF9ib2R5ICopMCktPm1ib19wYWRkaW5nXzEwKSk7CiAJTEFTU0VSVEYoTURTX0ZNT0RFX0NMT1NFRCA9PSAwMDAwMDAwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfRk1PREVfQ0xPU0VEKTsKKwkJIE1EU19GTU9ERV9DTE9TRUQpOwogCUxBU1NFUlRGKE1EU19GTU9ERV9FWEVDID09IDAwMDAwMDAwMDAwNFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19GTU9ERV9FWEVDKTsKKwkJIE1EU19GTU9ERV9FWEVDKTsKIAlMQVNTRVJURihNRFNfRk1PREVfRVBPQ0ggPT0gMDAwMDAxMDAwMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX0ZNT0RFX0VQT0NIKTsKKwkJIE1EU19GTU9ERV9FUE9DSCk7CiAJTEFTU0VSVEYoTURTX0ZNT0RFX1RSVU5DID09IDAwMDAwMjAwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19GTU9ERV9UUlVOQyk7CisJCSBNRFNfRk1PREVfVFJVTkMpOwogCUxBU1NFUlRGKE1EU19GTU9ERV9TT00gPT0gMDAwMDA0MDAwMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX0ZNT0RFX1NPTSk7CisJCSBNRFNfRk1PREVfU09NKTsKIAlMQVNTRVJURihNRFNfT1BFTl9DUkVBVEVEID09IDAwMDAwMDAwMDAxMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0NSRUFURUQpOworCQkgTURTX09QRU5fQ1JFQVRFRCk7CiAJTEFTU0VSVEYoTURTX09QRU5fQ1JPU1MgPT0gMDAwMDAwMDAwMDIwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX09QRU5fQ1JPU1MpOworCQkgTURTX09QRU5fQ1JPU1MpOwogCUxBU1NFUlRGKE1EU19PUEVOX0NSRUFUID09IDAwMDAwMDAwMDEwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0NSRUFUKTsKKwkJIE1EU19PUEVOX0NSRUFUKTsKIAlMQVNTRVJURihNRFNfT1BFTl9FWENMID09IDAwMDAwMDAwMDIwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0VYQ0wpOworCQkgTURTX09QRU5fRVhDTCk7CiAJTEFTU0VSVEYoTURTX09QRU5fVFJVTkMgPT0gMDAwMDAwMDAxMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX09QRU5fVFJVTkMpOworCQkgTURTX09QRU5fVFJVTkMpOwogCUxBU1NFUlRGKE1EU19PUEVOX0FQUEVORCA9PSAwMDAwMDAwMDIwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9BUFBFTkQpOworCQkgTURTX09QRU5fQVBQRU5EKTsKIAlMQVNTRVJURihNRFNfT1BFTl9TWU5DID09IDAwMDAwMDAxMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX1NZTkMpOworCQkgTURTX09QRU5fU1lOQyk7CiAJTEFTU0VSVEYoTURTX09QRU5fRElSRUNUT1JZID09IDAwMDAwMDIwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0RJUkVDVE9SWSk7CisJCSBNRFNfT1BFTl9ESVJFQ1RPUlkpOwogCUxBU1NFUlRGKE1EU19PUEVOX0JZX0ZJRCA9PSAwMDAwNDAwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9CWV9GSUQpOworCQkgTURTX09QRU5fQllfRklEKTsKIAlMQVNTRVJURihNRFNfT1BFTl9ERUxBWV9DUkVBVEUgPT0gMDAwMTAwMDAwMDAwVUwsICJmb3VuZCAwJS4xMW9VTFxuIiwKLQkJTURTX09QRU5fREVMQVlfQ1JFQVRFKTsKKwkJIE1EU19PUEVOX0RFTEFZX0NSRUFURSk7CiAJTEFTU0VSVEYoTURTX09QRU5fT1dORVJPVkVSUklERSA9PSAwMDAyMDAwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9PV05FUk9WRVJSSURFKTsKKwkJIE1EU19PUEVOX09XTkVST1ZFUlJJREUpOwogCUxBU1NFUlRGKE1EU19PUEVOX0pPSU5fRklMRSA9PSAwMDA0MDAwMDAwMDBVTCwgImZvdW5kIDAlLjExb1VMXG4iLAotCQlNRFNfT1BFTl9KT0lOX0ZJTEUpOworCQkgTURTX09QRU5fSk9JTl9GSUxFKTsKIAlMQVNTRVJURihNRFNfT1BFTl9MT0NLID09IDAwNDAwMDAwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0xPQ0spOworCQkgTURTX09QRU5fTE9DSyk7CiAJTEFTU0VSVEYoTURTX09QRU5fSEFTX0VBID09IDAxMDAwMDAwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0hBU19FQSk7CisJCSBNRFNfT1BFTl9IQVNfRUEpOwogCUxBU1NFUlRGKE1EU19PUEVOX0hBU19PQkpTID09IDAyMDAwMDAwMDAwMFVMLCAiZm91bmQgMCUuMTFvVUxcbiIsCi0JCU1EU19PUEVOX0hBU19PQkpTKTsKKwkJIE1EU19PUEVOX0hBU19PQkpTKTsKIAlMQVNTRVJURihNRFNfT1BFTl9OT1JFU1RPUkUgPT0gMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDBVTEwsICJmb3VuZCAwJS4yMmxsb1VMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX09QRU5fTk9SRVNUT1JFKTsKKwkJIChsb25nIGxvbmcpTURTX09QRU5fTk9SRVNUT1JFKTsKIAlMQVNTRVJURihNRFNfT1BFTl9ORVdTVFJJUEUgPT0gMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDBVTEwsICJmb3VuZCAwJS4yMmxsb1VMTFxuIiwKLQkJCShsb25nIGxvbmcpTURTX09QRU5fTkVXU1RSSVBFKTsKKwkJIChsb25nIGxvbmcpTURTX09QRU5fTkVXU1RSSVBFKTsKIAlMQVNTRVJURihNRFNfT1BFTl9WT0xBVElMRSA9PSAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMFVMTCwgImZvdW5kIDAlLjIybGxvVUxMXG4iLAotCQkJKGxvbmcgbG9uZylNRFNfT1BFTl9WT0xBVElMRSk7CisJCSAobG9uZyBsb25nKU1EU19PUEVOX1ZPTEFUSUxFKTsKIAlMQVNTRVJURihMVVNUUkVfU1lOQ19GTCA9PSAweDAwMDAwMDA4LCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfU1lOQ19GTCk7CisJCSBMVVNUUkVfU1lOQ19GTCk7CiAJTEFTU0VSVEYoTFVTVFJFX0lNTVVUQUJMRV9GTCA9PSAweDAwMDAwMDEwLCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfSU1NVVRBQkxFX0ZMKTsKKwkJIExVU1RSRV9JTU1VVEFCTEVfRkwpOwogCUxBU1NFUlRGKExVU1RSRV9BUFBFTkRfRkwgPT0gMHgwMDAwMDAyMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX0FQUEVORF9GTCk7CisJCSBMVVNUUkVfQVBQRU5EX0ZMKTsKIAlMQVNTRVJURihMVVNUUkVfTk9BVElNRV9GTCA9PSAweDAwMDAwMDgwLCAiZm91bmQgMHglLjh4XG4iLAotCQlMVVNUUkVfTk9BVElNRV9GTCk7CisJCSBMVVNUUkVfTk9BVElNRV9GTCk7CiAJTEFTU0VSVEYoTFVTVFJFX0RJUlNZTkNfRkwgPT0gMHgwMDAxMDAwMCwgImZvdW5kIDB4JS44eFxuIiwKLQkJTFVTVFJFX0RJUlNZTkNfRkwpOworCQkgTFVTVFJFX0RJUlNZTkNfRkwpOwogCUxBU1NFUlRGKE1EU19JTk9ERUxPQ0tfTE9PS1VQID09IDB4MDAwMDAxLCAiZm91bmQgMHglLjh4XG4iLAotCQlNRFNfSU5PREVMT0NLX0xPT0tVUCk7CisJCSBNRFNfSU5PREVMT0NLX0xPT0tVUCk7CiAJTEFTU0VSVEYoTURTX0lOT0RFTE9DS19VUERBVEUgPT0gMHgwMDAwMDIsICJmb3VuZCAweCUuOHhcbiIsCi0JCU1EU19JTk9ERUxPQ0tfVVBEQVRFKTsKKwkJIE1EU19JTk9ERUxPQ0tfVVBEQVRFKTsKIAlMQVNTRVJURihNRFNfSU5PREVMT0NLX09QRU4gPT0gMHgwMDAwMDQsICJmb3VuZCAweCUuOHhcbiIsCi0JCU1EU19JTk9ERUxPQ0tfT1BFTik7CisJCSBNRFNfSU5PREVMT0NLX09QRU4pOwogCUxBU1NFUlRGKE1EU19JTk9ERUxPQ0tfTEFZT1VUID09IDB4MDAwMDA4LCAiZm91bmQgMHglLjh4XG4iLAotCQlNRFNfSU5PREVMT0NLX0xBWU9VVCk7CisJCSBNRFNfSU5PREVMT0NLX0xBWU9VVCk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBtZHRfaW9lcG9jaCAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBtZHRfaW9lcG9jaCkgPT0gMjQsICJmb3VuZCAlbGxkXG4iLApAQCAtMjYxNywzNSArMjY3NCw2IEBACiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X2Rlc2MgKikwKS0+bGRfdXVpZCkgPT0gNDAsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfZGVzYyAqKTApLT5sZF91dWlkKSk7CiAKLQkvKiBDaGVja3MgZm9yIHN0cnVjdCBsbXZfc3RyaXBlX21kICovCi0JTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQpID09IDMyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfc3RyaXBlX21kLCBtZWFfbWFnaWMpID09IDAsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfc3RyaXBlX21kLCBtZWFfbWFnaWMpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9tYWdpYykgPT0gNCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9zdHJpcGVfbWQgKikwKS0+bWVhX21hZ2ljKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX2NvdW50KSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX2NvdW50KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfY291bnQpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9jb3VudCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQsIG1lYV9tYXN0ZXIpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbXZfc3RyaXBlX21kLCBtZWFfbWFzdGVyKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfbWFzdGVyKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfbWFzdGVyKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX3BhZGRpbmcpID09IDEyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX3BhZGRpbmcpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9wYWRkaW5nKSA9PSA0LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfcGFkZGluZykpOwotCUNMQVNTRVJUKExPVl9NQVhQT09MTkFNRSA9PSAxNik7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX3Bvb2xfbmFtZVsxNl0pID09IDMyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX3Bvb2xfbmFtZVsxNl0pKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9wb29sX25hbWVbMTZdKSA9PSAxLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbG12X3N0cmlwZV9tZCAqKTApLT5tZWFfcG9vbF9uYW1lWzE2XSkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxtdl9zdHJpcGVfbWQsIG1lYV9pZHNbMF0pID09IDMyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbG12X3N0cmlwZV9tZCwgbWVhX2lkc1swXSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxtdl9zdHJpcGVfbWQgKikwKS0+bWVhX2lkc1swXSkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbXZfc3RyaXBlX21kICopMCktPm1lYV9pZHNbMF0pKTsKLQogCS8qIENoZWNrcyBmb3Igc3RydWN0IGxvdl9kZXNjICovCiAJTEFTU0VSVEYoKGludClzaXplb2Yoc3RydWN0IGxvdl9kZXNjKSA9PSA4OCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKHN0cnVjdCBsb3ZfZGVzYykpOwpAQCAtMzE5NSwxMCArMzIyMywxMCBAQAogCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbG9nX3NldGF0dHI2NF9yZWMsIGxzcl9naWRfaCkpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYyAqKTApLT5sc3JfZ2lkX2gpID09IDQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX3NldGF0dHI2NF9yZWMgKikwKS0+bHNyX2dpZF9oKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjLCBsc3JfcGFkZGluZykgPT0gNDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbG9nX3NldGF0dHI2NF9yZWMsIGxzcl9wYWRkaW5nKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjICopMCktPmxzcl9wYWRkaW5nKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjICopMCktPmxzcl9wYWRkaW5nKSk7CisJTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjLCBsc3JfdmFsaWQpID09IDQ4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjLCBsc3JfdmFsaWQpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX3NldGF0dHI2NF9yZWMgKikwKS0+bHNyX3ZhbGlkKSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKKwkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjICopMCktPmxzcl92YWxpZCkpOwogCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYywgbHNyX3RhaWwpID09IDU2LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19zZXRhdHRyNjRfcmVjLCBsc3JfdGFpbCkpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfc2V0YXR0cjY0X3JlYyAqKTApLT5sc3JfdGFpbCkgPT0gOCwgImZvdW5kICVsbGRcbiIsCkBAIC0zMjcyLDUwICszMzAwLDYgQEAKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfcmVjICopMCktPmNyX3BmaWQpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX3JlYyAqKTApLT5jcl9wZmlkKSk7CiAKLQkvKiBDaGVja3MgZm9yIHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqLwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYykgPT0gOTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfbmFtZWxlbikgPT0gMCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9uYW1lbGVuKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfbmFtZWxlbikgPT0gMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX25hbWVsZW4pKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfZmxhZ3MpID09IDIsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfZmxhZ3MpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9mbGFncykgPT0gMiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX2ZsYWdzKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3R5cGUpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfdHlwZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3R5cGUpID09IDQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl90eXBlKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX2luZGV4KSA9PSA4LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX2luZGV4KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfaW5kZXgpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9pbmRleCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9wcmV2KSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9wcmV2KSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfcHJldikgPT0gOCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3ByZXYpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfdGltZSkgPT0gMjQsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfdGltZSkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3RpbWUpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl90aW1lKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3RmaWQpID09IDMyLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3RmaWQpKTsKLQlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl90ZmlkKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3RmaWQpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfcGZpZCkgPT0gNDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYywgY3JfcGZpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3BmaWQpID09IDE2LCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3JfcGZpZCkpOwotCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9zZmlkKSA9PSA2NCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9zZmlkKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMgKikwKS0+Y3Jfc2ZpZCkgPT0gMTYsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBjaGFuZ2Vsb2dfZXh0X3JlYyAqKTApLT5jcl9zZmlkKSk7Ci0JTEFTU0VSVEYoKGludClvZmZzZXRvZihzdHJ1Y3QgY2hhbmdlbG9nX2V4dF9yZWMsIGNyX3NwZmlkKSA9PSA4MCwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpb2Zmc2V0b2Yoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjLCBjcl9zcGZpZCkpOwotCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3NwZmlkKSA9PSAxNiwgImZvdW5kICVsbGRcbiIsCi0JCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGNoYW5nZWxvZ19leHRfcmVjICopMCktPmNyX3NwZmlkKSk7Ci0KIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBjaGFuZ2Vsb2dfc2V0aW5mbyAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBjaGFuZ2Vsb2dfc2V0aW5mbykgPT0gMTIsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZihzdHJ1Y3QgY2hhbmdlbG9nX3NldGluZm8pKTsKQEAgLTMzMzksMTAgKzMzMjMsMTAgQEAKIAkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjLCBjcikpOwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYyAqKTApLT5jcikgPT0gNjQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMgKikwKS0+Y3IpKTsKLQlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMsIGNyX3RhaWwpID09IDgwLCAiZm91bmQgJWxsZFxuIiwKLQkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjLCBjcl90YWlsKSk7Ci0JTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgbGxvZ19jaGFuZ2Vsb2dfcmVjICopMCktPmNyX3RhaWwpID09IDgsICJmb3VuZCAlbGxkXG4iLAotCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMgKikwKS0+Y3JfdGFpbCkpOworCUxBU1NFUlRGKChpbnQpb2Zmc2V0b2Yoc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYywgY3JfZG9fbm90X3VzZSkgPT0gODAsICJmb3VuZCAlbGxkXG4iLAorCQkgKGxvbmcgbG9uZykoaW50KW9mZnNldG9mKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMsIGNyX2RvX25vdF91c2UpKTsKKwlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ19yZWMgKikwKS0+Y3JfZG9fbm90X3VzZSkgPT0gOCwgImZvdW5kICVsbGRcbiIsCisJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGxsb2dfY2hhbmdlbG9nX3JlYyAqKTApLT5jcl9kb19ub3RfdXNlKSk7CiAKIAkvKiBDaGVja3MgZm9yIHN0cnVjdCBsbG9nX2NoYW5nZWxvZ191c2VyX3JlYyAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBsbG9nX2NoYW5nZWxvZ191c2VyX3JlYykgPT0gNDAsICJmb3VuZCAlbGxkXG4iLApAQCAtMzUwNiw2ICszNDkwLDE5IEBACiAJQ0xBU1NFUlQoTExPR19PUklHSU5fSEFORExFX0RFU1RST1kgPT0gNTA5KTsKIAlDTEFTU0VSVChMTE9HX0ZJUlNUX09QQyA9PSA1MDEpOwogCUNMQVNTRVJUKExMT0dfTEFTVF9PUEMgPT0gNTEwKTsKKwlDTEFTU0VSVChMTE9HX0NPTkZJR19PUklHX0NUWFQgPT0gMCk7CisJQ0xBU1NFUlQoTExPR19DT05GSUdfUkVQTF9DVFhUID09IDEpOworCUNMQVNTRVJUKExMT0dfTURTX09TVF9PUklHX0NUWFQgPT0gMik7CisJQ0xBU1NFUlQoTExPR19NRFNfT1NUX1JFUExfQ1RYVCA9PSAzKTsKKwlDTEFTU0VSVChMTE9HX1NJWkVfT1JJR19DVFhUID09IDQpOworCUNMQVNTRVJUKExMT0dfU0laRV9SRVBMX0NUWFQgPT0gNSk7CisJQ0xBU1NFUlQoTExPR19URVNUX09SSUdfQ1RYVCA9PSA4KTsKKwlDTEFTU0VSVChMTE9HX1RFU1RfUkVQTF9DVFhUID09IDkpOworCUNMQVNTRVJUKExMT0dfQ0hBTkdFTE9HX09SSUdfQ1RYVCA9PSAxMik7CisJQ0xBU1NFUlQoTExPR19DSEFOR0VMT0dfUkVQTF9DVFhUID09IDEzKTsKKwlDTEFTU0VSVChMTE9HX0NIQU5HRUxPR19VU0VSX09SSUdfQ1RYVCA9PSAxNCk7CisJQ0xBU1NFUlQoTExPR19BR0VOVF9PUklHX0NUWFQgPT0gMTUpOworCUNMQVNTRVJUKExMT0dfTUFYX0NUWFRTID09IDE2KTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IGxsb2dkX2Nvbm5fYm9keSAqLwogCUxBU1NFUlRGKChpbnQpc2l6ZW9mKHN0cnVjdCBsbG9nZF9jb25uX2JvZHkpID09IDQwLCAiZm91bmQgJWxsZFxuIiwKQEAgLTM5NDMsOSArMzk0MCw5IEBACiAJTEFTU0VSVEYoKGludClzaXplb2YoKChzdHJ1Y3QgaHNtX3Byb2dyZXNzICopMCktPnBhZGRpbmcpID09IDQsICJmb3VuZCAlbGxkXG4iLAogCQkgKGxvbmcgbG9uZykoaW50KXNpemVvZigoKHN0cnVjdCBoc21fcHJvZ3Jlc3MgKikwKS0+cGFkZGluZykpOwogCUxBU1NFUlRGKEhQX0ZMQUdfQ09NUExFVEVEID09IDB4MDEsICJmb3VuZCAweCUuOHhcbiIsCi0JCUhQX0ZMQUdfQ09NUExFVEVEKTsKKwkJIEhQX0ZMQUdfQ09NUExFVEVEKTsKIAlMQVNTRVJURihIUF9GTEFHX1JFVFJZID09IDB4MDIsICJmb3VuZCAweCUuOHhcbiIsCi0JCUhQX0ZMQUdfUkVUUlkpOworCQkgSFBfRkxBR19SRVRSWSk7CiAKIAlMQVNTRVJURigoaW50KW9mZnNldG9mKHN0cnVjdCBoc21fY29weSwgaGNfZGF0YV92ZXJzaW9uKSA9PSAwLCAiZm91bmQgJWxsZFxuIiwKIAkJIChsb25nIGxvbmcpKGludClvZmZzZXRvZihzdHJ1Y3QgaHNtX2NvcHksIGhjX2RhdGFfdmVyc2lvbikpOwpAQCAtNDEwMCw5ICs0MDk3LDkgQEAKIAlMQVNTRVJURigoaW50KXNpemVvZigoKHN0cnVjdCBoc21fcmVxdWVzdCAqKTApLT5ocl9kYXRhX2xlbikgPT0gNCwgImZvdW5kICVsbGRcbiIsCiAJCSAobG9uZyBsb25nKShpbnQpc2l6ZW9mKCgoc3RydWN0IGhzbV9yZXF1ZXN0ICopMCktPmhyX2RhdGFfbGVuKSk7CiAJTEFTU0VSVEYoSFNNX0ZPUkNFX0FDVElPTiA9PSAweDAwMDAwMDAxVUwsICJmb3VuZCAweCUuOHhVTFxuIiwKLQkJKHVuc2lnbmVkKUhTTV9GT1JDRV9BQ1RJT04pOworCQkgKHVuc2lnbmVkKUhTTV9GT1JDRV9BQ1RJT04pOwogCUxBU1NFUlRGKEhTTV9HSE9TVF9DT1BZID09IDB4MDAwMDAwMDJVTCwgImZvdW5kIDB4JS44eFVMXG4iLAotCQkodW5zaWduZWQpSFNNX0dIT1NUX0NPUFkpOworCQkgKHVuc2lnbmVkKUhTTV9HSE9TVF9DT1BZKTsKIAogCS8qIENoZWNrcyBmb3Igc3RydWN0IGhzbV91c2VyX3JlcXVlc3QgKi8KIAlMQVNTRVJURigoaW50KXNpemVvZihzdHJ1Y3QgaHNtX3VzZXJfcmVxdWVzdCkgPT0gMjQsICJmb3VuZCAlbGxkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvcmFkaW8tYmNtMjA0OC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvcmFkaW8tYmNtMjA0OC5jCmluZGV4IDhkYWRlMTkuLmVhMTVjYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L3JhZGlvLWJjbTIwNDguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYmNtMjA0OC9yYWRpby1iY20yMDQ4LmMKQEAgLTQ4MywxMCArNDgzLDggQEAKIAkJbWVtc2V0KCZiZGV2LT5yZHNfaW5mbywgMCwgc2l6ZW9mKGJkZXYtPnJkc19pbmZvKSk7CiAJfQogCi0JZXJyID0gYmNtMjA0OF9zZW5kX2NvbW1hbmQoYmRldiwgQkNNMjA0OF9JMkNfRk1fUkRTX1NZU1RFTSwKLQkJCQkgICBiZGV2LT5jYWNoZV9mbV9yZHNfc3lzdGVtKTsKLQotCXJldHVybiBlcnI7CisJcmV0dXJuIGJjbTIwNDhfc2VuZF9jb21tYW5kKGJkZXYsIEJDTTIwNDhfSTJDX0ZNX1JEU19TWVNURU0sCisJCQkJICAgIGJkZXYtPmNhY2hlX2ZtX3Jkc19zeXN0ZW0pOwogfQogCiBzdGF0aWMgaW50IGJjbTIwNDhfZ2V0X3Jkc19ub19sb2NrKHN0cnVjdCBiY20yMDQ4X2RldmljZSAqYmRldikKQEAgLTE4MzQsOSArMTgzMiw3IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBiY20yMDQ4X3NldF9wb3dlcl9zdGF0ZShiZGV2LCBCQ00yMDQ4X1BPV0VSX09GRik7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiBiY20yMDQ4X3NldF9wb3dlcl9zdGF0ZShiZGV2LCBCQ00yMDQ4X1BPV0VSX09GRik7CiB9CiAKIC8qCkBAIC0xOTk1LDkgKzE5OTEsNyBAQAogCQkJCQkJCQkJXAogCXZhbHVlID0gYmNtMjA0OF9nZXRfIyNwcm9wKGJkZXYpOwkJCQlcCiAJCQkJCQkJCQlcCi0JdmFsdWUgPSBzcHJpbnRmKGJ1ZiwgbWFzayAiXG4iLCB2YWx1ZSk7CQkJCVwKLQkJCQkJCQkJCVwKLQlyZXR1cm4gdmFsdWU7CQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsIG1hc2sgIlxuIiwgdmFsdWUpOwkJCQlcCiB9CiAKICNkZWZpbmUgREVGSU5FX1NZU0ZTX1BST1BFUlRZKHByb3AsIHNpZ25hbCwgc2l6ZSwgbWFzaywgY2hlY2spCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL1RPRE8KaW5kZXggYTEwZDRmOC4uMTMyMjQ2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2NlYy9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvVE9ETwpAQCAtMTIsNiArMTIsNyBAQAogCiBPdGhlciBUT0RPczoKIAorLSBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIHJlcGxpZXMgdG8gQ0VDX01TR19JTklUSUFURV9BUkMuIEhvdyB0byBoYW5kbGUgdGhhdD8KIC0gQWRkIGEgZmxhZyB0byBpbmhpYml0IHBhc3NpbmcgQ0VDIFJDIG1lc3NhZ2VzIHRvIHRoZSByYyBzdWJzeXN0ZW0uCiAgIEFwcGxpY2F0aW9ucyBzaG91bGQgYmUgYWJsZSB0byBjaG9vc2UgdGhpcyB3aGVuIGNhbGxpbmcgU19MT0dfQUREUlMuCiAtIElmIHRoZSByZXBseSBmaWVsZCBvZiBjZWNfbXNnIGlzIHNldCB0aGVuIHdoZW4gdGhlIHJlcGx5IGFycml2ZXMgaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWFkYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWFkYXAuYwppbmRleCBiMjM5M2JiLi45NDY5ODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1hZGFwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2NlYy9jZWMtYWRhcC5jCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogCXU2NCB0cyA9IGt0aW1lX2dldF9ucygpOwogCXN0cnVjdCBjZWNfZmggKmZoOwogCi0JbXV0ZXhfbG9jaygmYWRhcC0+ZGV2bm9kZS5maHNfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcC0+ZGV2bm9kZS5sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZoLCAmYWRhcC0+ZGV2bm9kZS5maHMsIGxpc3QpCiAJCWNlY19xdWV1ZV9ldmVudF9maChmaCwgZXYsIHRzKTsKLQltdXRleF91bmxvY2soJmFkYXAtPmRldm5vZGUuZmhzX2xvY2spOworCW11dGV4X3VubG9jaygmYWRhcC0+ZGV2bm9kZS5sb2NrKTsKIH0KIAogLyoKQEAgLTE5MSwxMiArMTkxLDEyIEBACiAJdTMyIG1vbml0b3JfbW9kZSA9IHZhbGlkX2xhID8gQ0VDX01PREVfTU9OSVRPUiA6CiAJCQkJICAgICAgQ0VDX01PREVfTU9OSVRPUl9BTEw7CiAKLQltdXRleF9sb2NrKCZhZGFwLT5kZXZub2RlLmZoc19sb2NrKTsKKwltdXRleF9sb2NrKCZhZGFwLT5kZXZub2RlLmxvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZmgsICZhZGFwLT5kZXZub2RlLmZocywgbGlzdCkgewogCQlpZiAoZmgtPm1vZGVfZm9sbG93ZXIgPj0gbW9uaXRvcl9tb2RlKQogCQkJY2VjX3F1ZXVlX21zZ19maChmaCwgbXNnKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXZub2RlLmZoc19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXAtPmRldm5vZGUubG9jayk7CiB9CiAKIC8qCkBAIC0yMDcsMTIgKzIwNywxMiBAQAogewogCXN0cnVjdCBjZWNfZmggKmZoOwogCi0JbXV0ZXhfbG9jaygmYWRhcC0+ZGV2bm9kZS5maHNfbG9jayk7CisJbXV0ZXhfbG9jaygmYWRhcC0+ZGV2bm9kZS5sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZoLCAmYWRhcC0+ZGV2bm9kZS5maHMsIGxpc3QpIHsKIAkJaWYgKGZoLT5tb2RlX2ZvbGxvd2VyID09IENFQ19NT0RFX0ZPTExPV0VSKQogCQkJY2VjX3F1ZXVlX21zZ19maChmaCwgbXNnKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZhZGFwLT5kZXZub2RlLmZoc19sb2NrKTsKKwltdXRleF91bmxvY2soJmFkYXAtPmRldm5vZGUubG9jayk7CiB9CiAKIC8qIE5vdGlmeSB1c2Vyc3BhY2Ugb2YgYW4gYWRhcHRlciBzdGF0ZSBjaGFuZ2UuICovCkBAIC04NTEsNiArODUxLDkgQEAKIAlpZiAoIXZhbGlkX2xhIHx8IG1zZy0+bGVuIDw9IDEpCiAJCXJldHVybjsKIAorCWlmIChhZGFwLT5sb2dfYWRkcnMubG9nX2FkZHJfbWFzayA9PSAwKQorCQlyZXR1cm47CisKIAkvKgogCSAqIFByb2Nlc3MgdGhlIG1lc3NhZ2Ugb24gdGhlIHByb3RvY29sIGxldmVsLiBJZiBpc19yZXBseSBpcyB0cnVlLAogCSAqIHRoZW4gY2VjX3JlY2VpdmVfbm90aWZ5KCkgd29uJ3QgcGFzcyBvbiB0aGUgcmVwbHkgdG8gdGhlIGxpc3RlbmVyKHMpCkBAIC0xMDQ3LDExICsxMDUwLDE3IEBACiAJCQlkcHJpbnRrKDEsICJjb3VsZCBub3QgY2xhaW0gTEEgJWRcbiIsIGkpOwogCX0KIAorCWlmIChhZGFwLT5sb2dfYWRkcnMubG9nX2FkZHJfbWFzayA9PSAwICYmCisJICAgICEobGFzLT5mbGFncyAmIENFQ19MT0dfQUREUlNfRkxfQUxMT1dfVU5SRUdfRkFMTEJBQ0spKQorCQlnb3RvIHVuY29uZmlndXJlOworCiBjb25maWd1cmVkOgogCWlmIChhZGFwLT5sb2dfYWRkcnMubG9nX2FkZHJfbWFzayA9PSAwKSB7CiAJCS8qIEZhbGwgYmFjayB0byB1bnJlZ2lzdGVyZWQgKi8KIAkJbGFzLT5sb2dfYWRkclswXSA9IENFQ19MT0dfQUREUl9VTlJFR0lTVEVSRUQ7CiAJCWxhcy0+bG9nX2FkZHJfbWFzayA9IDEgPDwgbGFzLT5sb2dfYWRkclswXTsKKwkJZm9yIChpID0gMTsgaSA8IGxhcy0+bnVtX2xvZ19hZGRyczsgaSsrKQorCQkJbGFzLT5sb2dfYWRkcltpXSA9IENFQ19MT0dfQUREUl9JTlZBTElEOwogCX0KIAlhZGFwLT5pc19jb25maWd1cmVkID0gdHJ1ZTsKIAlhZGFwLT5pc19jb25maWd1cmluZyA9IGZhbHNlOwpAQCAtMTA3MCw2ICsxMDc5LDggQEAKIAkJCWNlY19yZXBvcnRfZmVhdHVyZXMoYWRhcCwgaSk7CiAJCWNlY19yZXBvcnRfcGh5c19hZGRyKGFkYXAsIGkpOwogCX0KKwlmb3IgKGkgPSBsYXMtPm51bV9sb2dfYWRkcnM7IGkgPCBDRUNfTUFYX0xPR19BRERSUzsgaSsrKQorCQlsYXMtPmxvZ19hZGRyW2ldID0gQ0VDX0xPR19BRERSX0lOVkFMSUQ7CiAJbXV0ZXhfbG9jaygmYWRhcC0+bG9jayk7CiAJYWRhcC0+a3RocmVhZF9jb25maWcgPSBOVUxMOwogCW11dGV4X3VubG9jaygmYWRhcC0+bG9jayk7CkBAIC0xMzk4LDcgKzE0MDksNiBAQAogCXU4IGluaXRfbGFkZHIgPSBjZWNfbXNnX2luaXRpYXRvcihtc2cpOwogCXU4IGRldnR5cGUgPSBjZWNfbG9nX2FkZHIyZGV2KGFkYXAsIGRlc3RfbGFkZHIpOwogCWludCBsYV9pZHggPSBjZWNfbG9nX2FkZHIyaWR4KGFkYXAsIGRlc3RfbGFkZHIpOwotCWJvb2wgaXNfZGlyZWN0ZWQgPSBsYV9pZHggPj0gMDsKIAlib29sIGZyb21fdW5yZWdpc3RlcmVkID0gaW5pdF9sYWRkciA9PSAweGY7CiAJc3RydWN0IGNlY19tc2cgdHhfY2VjX21zZyA9IHsgfTsKIApAQCAtMTU2MCw3ICsxNTcwLDcgQEAKIAkJICogVW5wcm9jZXNzZWQgbWVzc2FnZXMgYXJlIGFib3J0ZWQgaWYgdXNlcnNwYWNlIGlzbid0IGRvaW5nCiAJCSAqIGFueSBwcm9jZXNzaW5nIGVpdGhlci4KIAkJICovCi0JCWlmIChpc19kaXJlY3RlZCAmJiAhaXNfcmVwbHkgJiYgIWFkYXAtPmZvbGxvd2VyX2NudCAmJgorCQlpZiAoIWlzX2Jyb2FkY2FzdCAmJiAhaXNfcmVwbHkgJiYgIWFkYXAtPmZvbGxvd2VyX2NudCAmJgogCQkgICAgIWFkYXAtPmNlY19mb2xsb3dlciAmJiBtc2ctPm1zZ1sxXSAhPSBDRUNfTVNHX0ZFQVRVUkVfQUJPUlQpCiAJCQlyZXR1cm4gY2VjX2ZlYXR1cmVfYWJvcnQoYWRhcCwgbXNnKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1hcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWFwaS5jCmluZGV4IDdiZTc2MTUuLmUyNzRlMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWFwaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWFwaS5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAkJcmV0dXJuIC1FTk9UVFk7CiAJaWYgKGNvcHlfZnJvbV91c2VyKCZsb2dfYWRkcnMsIHBhcmcsIHNpemVvZihsb2dfYWRkcnMpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JbG9nX2FkZHJzLmZsYWdzID0gMDsKKwlsb2dfYWRkcnMuZmxhZ3MgJj0gQ0VDX0xPR19BRERSU19GTF9BTExPV19VTlJFR19GQUxMQkFDSzsKIAltdXRleF9sb2NrKCZhZGFwLT5sb2NrKTsKIAlpZiAoIWFkYXAtPmlzX2NvbmZpZ3VyaW5nICYmCiAJICAgICghbG9nX2FkZHJzLm51bV9sb2dfYWRkcnMgfHwgIWFkYXAtPmlzX2NvbmZpZ3VyZWQpICYmCkBAIC00MzUsNyArNDM1LDcgQEAKIAl2b2lkIF9fdXNlciAqcGFyZyA9ICh2b2lkIF9fdXNlciAqKWFyZzsKIAogCWlmICghZGV2bm9kZS0+cmVnaXN0ZXJlZCkKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRU5PREVWOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIENFQ19BREFQX0dfQ0FQUzoKQEAgLTUwOCwxNCArNTA4LDE0IEBACiAKIAlmaWxwLT5wcml2YXRlX2RhdGEgPSBmaDsKIAotCW11dGV4X2xvY2soJmRldm5vZGUtPmZoc19sb2NrKTsKKwltdXRleF9sb2NrKCZkZXZub2RlLT5sb2NrKTsKIAkvKiBRdWV1ZSB1cCBpbml0aWFsIHN0YXRlIGV2ZW50cyAqLwogCWV2X3N0YXRlLnN0YXRlX2NoYW5nZS5waHlzX2FkZHIgPSBhZGFwLT5waHlzX2FkZHI7CiAJZXZfc3RhdGUuc3RhdGVfY2hhbmdlLmxvZ19hZGRyX21hc2sgPSBhZGFwLT5sb2dfYWRkcnMubG9nX2FkZHJfbWFzazsKIAljZWNfcXVldWVfZXZlbnRfZmgoZmgsICZldl9zdGF0ZSwgMCk7CiAKIAlsaXN0X2FkZCgmZmgtPmxpc3QsICZkZXZub2RlLT5maHMpOwotCW11dGV4X3VubG9jaygmZGV2bm9kZS0+ZmhzX2xvY2spOworCW11dGV4X3VubG9jaygmZGV2bm9kZS0+bG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTU0MCw5ICs1NDAsOSBAQAogCQljZWNfbW9uaXRvcl9hbGxfY250X2RlYyhhZGFwKTsKIAltdXRleF91bmxvY2soJmFkYXAtPmxvY2spOwogCi0JbXV0ZXhfbG9jaygmZGV2bm9kZS0+ZmhzX2xvY2spOworCW11dGV4X2xvY2soJmRldm5vZGUtPmxvY2spOwogCWxpc3RfZGVsKCZmaC0+bGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5maHNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5sb2NrKTsKIAogCS8qIFVuaG9vayBwZW5kaW5nIHRyYW5zbWl0cyBmcm9tIHRoaXMgZmlsZWhhbmRsZS4gKi8KIAltdXRleF9sb2NrKCZhZGFwLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWNvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jZWMvY2VjLWNvcmUuYwppbmRleCAxMTJhNWZhLi4zYjFlNGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY2VjL2NlYy1jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2NlYy9jZWMtY29yZS5jCkBAIC01MSwzMSArNTEsMjkgQEAKIHsKIAkvKgogCSAqIENoZWNrIGlmIHRoZSBjZWMgZGV2aWNlIGlzIGF2YWlsYWJsZS4gVGhpcyBuZWVkcyB0byBiZSBkb25lIHdpdGgKLQkgKiB0aGUgY2VjX2Rldm5vZGVfbG9jayBoZWxkIHRvIHByZXZlbnQgYW4gb3Blbi91bnJlZ2lzdGVyIHJhY2U6CisJICogdGhlIGRldm5vZGUtPmxvY2sgaGVsZCB0byBwcmV2ZW50IGFuIG9wZW4vdW5yZWdpc3RlciByYWNlOgogCSAqIHdpdGhvdXQgdGhlIGxvY2ssIHRoZSBkZXZpY2UgY291bGQgYmUgdW5yZWdpc3RlcmVkIGFuZCBmcmVlZCBiZXR3ZWVuCiAJICogdGhlIGRldm5vZGUtPnJlZ2lzdGVyZWQgY2hlY2sgYW5kIGdldF9kZXZpY2UoKSBjYWxscywgbGVhZGluZyB0bwogCSAqIGEgY3Jhc2guCiAJICovCi0JbXV0ZXhfbG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CisJbXV0ZXhfbG9jaygmZGV2bm9kZS0+bG9jayk7CiAJLyoKIAkgKiByZXR1cm4gRU5YSU8gaWYgdGhlIGNlYyBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZAogCSAqIGFscmVhZHkgb3IgaWYgaXQgaXMgbm90IHJlZ2lzdGVyZWQgYW55bW9yZS4KIAkgKi8KIAlpZiAoIWRldm5vZGUtPnJlZ2lzdGVyZWQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZjZWNfZGV2bm9kZV9sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5sb2NrKTsKIAkJcmV0dXJuIC1FTlhJTzsKIAl9CiAJLyogYW5kIGluY3JlYXNlIHRoZSBkZXZpY2UgcmVmY291bnQgKi8KIAlnZXRfZGV2aWNlKCZkZXZub2RlLT5kZXYpOwotCW11dGV4X3VubG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBjZWNfcHV0X2RldmljZShzdHJ1Y3QgY2VjX2Rldm5vZGUgKmRldm5vZGUpCiB7Ci0JbXV0ZXhfbG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CiAJcHV0X2RldmljZSgmZGV2bm9kZS0+ZGV2KTsKLQltdXRleF91bmxvY2soJmNlY19kZXZub2RlX2xvY2spOwogfQogCiAvKiBDYWxsZWQgd2hlbiB0aGUgbGFzdCB1c2VyIG9mIHRoZSBjZWMgZGV2aWNlIGV4aXRzLiAqLwpAQCAtODQsMTEgKzgyLDEwIEBACiAJc3RydWN0IGNlY19kZXZub2RlICpkZXZub2RlID0gdG9fY2VjX2Rldm5vZGUoY2QpOwogCiAJbXV0ZXhfbG9jaygmY2VjX2Rldm5vZGVfbG9jayk7Ci0KIAkvKiBNYXJrIGRldmljZSBub2RlIG51bWJlciBhcyBmcmVlICovCiAJY2xlYXJfYml0KGRldm5vZGUtPm1pbm9yLCBjZWNfZGV2bm9kZV9udW1zKTsKLQogCW11dGV4X3VubG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CisKIAljZWNfZGVsZXRlX2FkYXB0ZXIodG9fY2VjX2FkYXB0ZXIoZGV2bm9kZSkpOwogfQogCkBAIC0xMTcsNyArMTE0LDcgQEAKIAogCS8qIEluaXRpYWxpemF0aW9uICovCiAJSU5JVF9MSVNUX0hFQUQoJmRldm5vZGUtPmZocyk7Ci0JbXV0ZXhfaW5pdCgmZGV2bm9kZS0+ZmhzX2xvY2spOworCW11dGV4X2luaXQoJmRldm5vZGUtPmxvY2spOwogCiAJLyogUGFydCAxOiBGaW5kIGEgZnJlZSBtaW5vciBudW1iZXIgKi8KIAltdXRleF9sb2NrKCZjZWNfZGV2bm9kZV9sb2NrKTsKQEAgLTE2MCw3ICsxNTcsOSBAQAogY2Rldl9kZWw6CiAJY2Rldl9kZWwoJmRldm5vZGUtPmNkZXYpOwogY2xyX2JpdDoKKwltdXRleF9sb2NrKCZjZWNfZGV2bm9kZV9sb2NrKTsKIAljbGVhcl9iaXQoZGV2bm9kZS0+bWlub3IsIGNlY19kZXZub2RlX251bXMpOworCW11dGV4X3VubG9jaygmY2VjX2Rldm5vZGVfbG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTc3LDE3ICsxNzYsMjEgQEAKIHsKIAlzdHJ1Y3QgY2VjX2ZoICpmaDsKIAotCS8qIENoZWNrIGlmIGRldm5vZGUgd2FzIG5ldmVyIHJlZ2lzdGVyZWQgb3IgYWxyZWFkeSB1bnJlZ2lzdGVyZWQgKi8KLQlpZiAoIWRldm5vZGUtPnJlZ2lzdGVyZWQgfHwgZGV2bm9kZS0+dW5yZWdpc3RlcmVkKQotCQlyZXR1cm47CisJbXV0ZXhfbG9jaygmZGV2bm9kZS0+bG9jayk7CiAKLQltdXRleF9sb2NrKCZkZXZub2RlLT5maHNfbG9jayk7CisJLyogQ2hlY2sgaWYgZGV2bm9kZSB3YXMgbmV2ZXIgcmVnaXN0ZXJlZCBvciBhbHJlYWR5IHVucmVnaXN0ZXJlZCAqLworCWlmICghZGV2bm9kZS0+cmVnaXN0ZXJlZCB8fCBkZXZub2RlLT51bnJlZ2lzdGVyZWQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZmgsICZkZXZub2RlLT5maHMsIGxpc3QpCiAJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZmgtPndhaXQpOwotCW11dGV4X3VubG9jaygmZGV2bm9kZS0+ZmhzX2xvY2spOwogCiAJZGV2bm9kZS0+cmVnaXN0ZXJlZCA9IGZhbHNlOwogCWRldm5vZGUtPnVucmVnaXN0ZXJlZCA9IHRydWU7CisJbXV0ZXhfdW5sb2NrKCZkZXZub2RlLT5sb2NrKTsKKwogCWRldmljZV9kZWwoJmRldm5vZGUtPmRldik7CiAJY2Rldl9kZWwoJmRldm5vZGUtPmNkZXYpOwogCXB1dF9kZXZpY2UoJmRldm5vZGUtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMKaW5kZXggNjkyYmEzZS4uZmVkZWIzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvY3hkMjA5OS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuYwpAQCAtNjYwLDcgKzY2MCw3IEBACiAJc3RydWN0IGN4ZCAqY2kgPSBjYS0+ZGF0YTsKIAogCW11dGV4X2xvY2soJmNpLT5sb2NrKTsKLQlwcmludGsoa2Vybl9JTkZPICJ3cml0ZV9kYXRhICVkXG4iLCBlY291bnQpOworCWRldl9pbmZvKCZjaS0+aTJjLT5kZXYsICJ3cml0ZV9kYXRhICVkXG4iLCBlY291bnQpOwogCXdyaXRlX3JlZyhjaSwgMHgwZCwgZWNvdW50Pj44KTsKIAl3cml0ZV9yZWcoY2ksIDB4MGUsIGVjb3VudCYweGZmKTsKIAl3cml0ZV9ibG9jayhjaSwgMHgxMSwgZWJ1ZiwgZWNvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZGF2aW5jaV92cGZlX3VzZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZGF2aW5jaV92cGZlX3VzZXIuaAppbmRleCBmNGYzNWM5Li5kM2YzNGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RhdmluY2lfdnBmZV91c2VyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kYXZpbmNpX3ZwZmVfdXNlci5oCkBAIC01NDQsNDEgKzU0NCw0MSBAQAogLyogSVBJUEUgbW9kdWxlIGNvbmZpZ3VyYXRpb25zICovCiAKIC8qIElQSVBFIGlucHV0IGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9JTlBVVF9DT05GSUcJCSgxIDw8IDApCisjZGVmaW5lIFZQRkVfSVBJUEVfSU5QVVRfQ09ORklHCQlCSVQoMCkKIC8qIExVVCBiYXNlZCBEZWZlY3QgUGl4ZWwgQ29ycmVjdGlvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFX0xVVERQQwkJKDEgPDwgMSkKKyNkZWZpbmUgVlBGRV9JUElQRV9MVVREUEMJCUJJVCgxKQogLyogT24gdGhlIGZseSAoT1RGKSBEZWZlY3QgUGl4ZWwgQ29ycmVjdGlvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFX09URkRQQwkJKDEgPDwgMikKKyNkZWZpbmUgVlBGRV9JUElQRV9PVEZEUEMJCUJJVCgyKQogLyogTm9pc2UgRmlsdGVyIC0gMSAqLwotI2RlZmluZSBWUEZFX0lQSVBFX05GMQkJCSgxIDw8IDMpCisjZGVmaW5lIFZQRkVfSVBJUEVfTkYxCQkJQklUKDMpCiAvKiBOb2lzZSBGaWx0ZXIgLSAyICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfTkYyCQkJKDEgPDwgNCkKKyNkZWZpbmUgVlBGRV9JUElQRV9ORjIJCQlCSVQoNCkKIC8qIFdoaXRlIEJhbGFuY2UuICBBbHNvIGEgY29udHJvbCBJRCAqLwotI2RlZmluZSBWUEZFX0lQSVBFX1dCCQkJKDEgPDwgNSkKKyNkZWZpbmUgVlBGRV9JUElQRV9XQgkJCUJJVCg1KQogLyogMXN0IFJHQiB0byBSQkcgQmxlbmQgbW9kdWxlICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfUkdCMlJHQl8xCQkoMSA8PCA2KQorI2RlZmluZSBWUEZFX0lQSVBFX1JHQjJSR0JfMQkJQklUKDYpCiAvKiAybmQgUkdCIHRvIFJCRyBCbGVuZCBtb2R1bGUgKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9SR0IyUkdCXzIJCSgxIDw8IDcpCisjZGVmaW5lIFZQRkVfSVBJUEVfUkdCMlJHQl8yCQlCSVQoNykKIC8qIEdhbW1hIENvcnJlY3Rpb24gKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9HQU1NQQkJKDEgPDwgOCkKKyNkZWZpbmUgVlBGRV9JUElQRV9HQU1NQQkJQklUKDgpCiAvKiAzRCBMVVQgY29sb3IgY29udmVyc2lvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFXzNEX0xVVAkJKDEgPDwgOSkKKyNkZWZpbmUgVlBGRV9JUElQRV8zRF9MVVQJCUJJVCg5KQogLyogUkdCIHRvIFlDYkNyIG1vZHVsZSAqLwotI2RlZmluZSBWUEZFX0lQSVBFX1JHQjJZVVYJCSgxIDw8IDEwKQorI2RlZmluZSBWUEZFX0lQSVBFX1JHQjJZVVYJCUJJVCgxMCkKIC8qIFlVViA0MjIgY29udmVyc2lvbiBtb2R1bGUgKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9ZVVY0MjJfQ09OVgkJKDEgPDwgMTEpCisjZGVmaW5lIFZQRkVfSVBJUEVfWVVWNDIyX0NPTlYJCUJJVCgxMSkKIC8qIEVkZ2UgRW5oYW5jZW1lbnQgKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9ZRUUJCQkoMSA8PCAxMikKKyNkZWZpbmUgVlBGRV9JUElQRV9ZRUUJCQlCSVQoMTIpCiAvKiBHcmVlbiBJbWJhbGFuY2UgQ29ycmVjdGlvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFX0dJQwkJCSgxIDw8IDEzKQorI2RlZmluZSBWUEZFX0lQSVBFX0dJQwkJCUJJVCgxMykKIC8qIENGQSBJbnRlcnBvbGF0aW9uICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfQ0ZBCQkJKDEgPDwgMTQpCisjZGVmaW5lIFZQRkVfSVBJUEVfQ0ZBCQkJQklUKDE0KQogLyogQ2hyb21hIEFydGlmYWN0IFJlZHVjdGlvbiAqLwotI2RlZmluZSBWUEZFX0lQSVBFX0NBUgkJCSgxIDw8IDE1KQorI2RlZmluZSBWUEZFX0lQSVBFX0NBUgkJCUJJVCgxNSkKIC8qIENocm9tYSBHYWluIFN1cHByZXNzaW9uICovCi0jZGVmaW5lIFZQRkVfSVBJUEVfQ0dTCQkJKDEgPDwgMTYpCisjZGVmaW5lIFZQRkVfSVBJUEVfQ0dTCQkJQklUKDE2KQogLyogR2xvYmFsIGJyaWdodG5lc3MgYW5kIGNvbnRyYXN0IGNvbnRyb2wgKi8KLSNkZWZpbmUgVlBGRV9JUElQRV9HQkNFCQkJKDEgPDwgMTcpCisjZGVmaW5lIFZQRkVfSVBJUEVfR0JDRQkJCUJJVCgxNykKIAogI2RlZmluZSBWUEZFX0lQSVBFX01BWF9NT0RVTEVTCQkxOAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X2lzaWYuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfaXNpZi5jCmluZGV4IGFlOTIwMmQuLjU2OWJjZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfaXNpZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfaXNpZi5jCkBAIC0xNDYsOSArMTQ2LDggQEAKIAl1MzIgZmllbGRfc3RhdHVzOwogCiAJZmllbGRfc3RhdHVzID0gaXNpZl9yZWFkKGlzaWYtPmlzaWZfY2ZnLmJhc2VfYWRkciwgTU9ERVNFVCk7Ci0JZmllbGRfc3RhdHVzID0gKGZpZWxkX3N0YXR1cyA+PiBETTM2NV9JU0lGX01ERlNfT0ZGU0VUKSAmCi0JCQlETTM2NV9JU0lGX01ERlNfTUFTSzsKLQlyZXR1cm4gZmllbGRfc3RhdHVzOworCXJldHVybiAoZmllbGRfc3RhdHVzID4+IERNMzY1X0lTSUZfTURGU19PRkZTRVQpICYKKwkJRE0zNjVfSVNJRl9NREZTX01BU0s7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTU5NCw4ICs1OTMsNyBAQAogCXJldCA9IGlzaWZfdmFsaWRhdGVfZGZjX3BhcmFtcygmcGFyYW1zLT5kZmMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gaXNpZl92YWxpZGF0ZV9iY2xhbXBfcGFyYW1zKCZwYXJhbXMtPmJjbGFtcCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gaXNpZl92YWxpZGF0ZV9iY2xhbXBfcGFyYW1zKCZwYXJhbXMtPmJjbGFtcCk7CiB9CiAKIHN0YXRpYyBpbnQgaXNpZl9zZXRfcGFyYW1zKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHZvaWQgKnBhcmFtcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfcmVzaXplci5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9yZXNpemVyLmMKaW5kZXggM2NkNTZjYy4uMTI4NjYyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9yZXNpemVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9yZXNpemVyLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogc3RhdGljIHZvaWQKIGNvbmZpZ3VyZV9yZXNpemVyX291dF9wYXJhbXMoc3RydWN0IHZwZmVfcmVzaXplcl9kZXZpY2UgKnJlc2l6ZXIsIGludCBpbmRleCwKIAkJCSAgICAgdm9pZCAqb3V0cHV0X3NwZWMsIHVuc2lnbmVkIGNoYXIgcGFydGlhbCwKLQkJCSAgICAgdW5zaWduZWQgZmxhZykKKwkJCSAgICAgdW5zaWduZWQgaW50IGZsYWcpCiB7CiAJc3RydWN0IHJlc2l6ZXJfcGFyYW1zICpwYXJhbSA9ICZyZXNpemVyLT5jb25maWc7CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqb3V0Zm9ybWF0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX3ZpZGVvLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfdmlkZW8uYwppbmRleCAzMzE5ZmI4Li44YmU5Zjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfdmlkZW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfdmlkZW8uYwpAQCAtMzcsNyArMzcsNyBAQAogCXN0cnVjdCBtZWRpYV9wYWQgKnJlbW90ZTsKIAogCXJlbW90ZSA9IG1lZGlhX2VudGl0eV9yZW1vdGVfcGFkKCZ2cGZlX2Rldi0+dnBmZV9pc2lmLnBhZHNbMF0pOwotCWlmIChyZW1vdGUgPT0gTlVMTCkgeworCWlmICghcmVtb3RlKSB7CiAJCXByX2VycigiSW52YWxpZCBtZWRpYSBjb25uZWN0aW9uIHRvIGlzaWYvY2NkY1xuIik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTU0LDcgKzU0LDcgQEAKIAlpbnQgaTsKIAogCXJlbW90ZSA9IG1lZGlhX2VudGl0eV9yZW1vdGVfcGFkKCZ2cGZlX2Rldi0+dnBmZV9pc2lmLnBhZHNbMF0pOwotCWlmIChyZW1vdGUgPT0gTlVMTCkgeworCWlmICghcmVtb3RlKSB7CiAJCXByX2VycigiSW52YWxpZCBtZWRpYSBjb25uZWN0aW9uIHRvIGlzaWYvY2NkY1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEwNyw3ICsxMDcsNyBAQAogCWludCByZXQ7CiAKIAlzdWJkZXYgPSB2cGZlX3ZpZGVvX3JlbW90ZV9zdWJkZXYodmlkZW8sICZwYWQpOwotCWlmIChzdWJkZXYgPT0gTlVMTCkKKwlpZiAoIXN1YmRldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlmbXQud2hpY2ggPSBWNEwyX1NVQkRFVl9GT1JNQVRfQUNUSVZFOwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJICogZm9ybWF0IG9mIHRoZSBjb25uZWN0ZWQgcGFkLgogCSAqLwogCXN1YmRldiA9IHZwZmVfdmlkZW9fcmVtb3RlX3N1YmRldihwaXBlLT5vdXRwdXRzWzBdLCBOVUxMKTsKLQlpZiAoc3ViZGV2ID09IE5VTEwpCisJaWYgKCFzdWJkZXYpCiAJCXJldHVybiAtRVBJUEU7CiAKIAl3aGlsZSAoMSkgewpAQCAtNDEzLDcgKzQxMyw3IEBACiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgZmlsZSBoYW5kbGUgb2JqZWN0ICovCiAJaGFuZGxlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZwZmVfZmgpLCBHRlBfS0VSTkVMKTsKIAotCWlmIChoYW5kbGUgPT0gTlVMTCkKKwlpZiAoIWhhbmRsZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl2NGwyX2ZoX2luaXQoJmhhbmRsZS0+dmZoLCAmdmlkZW8tPnZpZGVvX2Rldik7CkBAIC02ODMsMTQgKzY4MywxNCBAQAogCX0KIAkvKiBnZXQgdGhlIHJlbW90ZSBwYWQgKi8KIAlyZW1vdGUgPSBtZWRpYV9lbnRpdHlfcmVtb3RlX3BhZCgmdmlkZW8tPnBhZCk7Ci0JaWYgKHJlbW90ZSA9PSBOVUxMKSB7CisJaWYgKCFyZW1vdGUpIHsKIAkJdjRsMl9lcnIoJnZwZmVfZGV2LT52NGwyX2RldiwKIAkJCSAiaW52YWxpZCByZW1vdGUgcGFkIGZvciB2aWRlbyBub2RlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qIGdldCB0aGUgcmVtb3RlIHN1YmRldiAqLwogCXN1YmRldiA9IHZwZmVfdmlkZW9fcmVtb3RlX3N1YmRldih2aWRlbywgTlVMTCk7Ci0JaWYgKHN1YmRldiA9PSBOVUxMKSB7CisJaWYgKCFzdWJkZXYpIHsKIAkJdjRsMl9lcnIoJnZwZmVfZGV2LT52NGwyX2RldiwKIAkJCSAiaW52YWxpZCByZW1vdGUgc3ViZGV2IGZvciB2aWRlbyBub2RlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2J0ODI5LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2J0ODI5LmMKaW5kZXggNDRmNTY1NS4uMDRkODgxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19idDgyOS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfYnQ4MjkuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJaW50IHJjOwogCiAJcGRldiA9IGRvX3BjaV9wcm9iZSgpOwotCWlmIChwZGV2ID09IE5VTEwpCisJaWYgKCFwZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CkBAIC0xNjMsNyArMTYzLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLQogdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhdGlyX2RyaXZlci5kZXYpOwpAQCAtMTc0LDcgKzE3Myw2IEBACiAJcGNpX2Rldl9wdXQocGRldik7CiB9CiAKLQogc3RhdGljIGludCBhdGlyX2luaXRfc3RhcnQodm9pZCkKIHsKIAlwY2lfYWRkcl9saW4gPSBpb3JlbWFwKHBjaV9hZGRyX3BoeXMgKyBEQVRBX1BDSV9PRkYsIDB4NDAwKTsKQEAgLTE4NywxMCArMTg1LDkgQEAKIAogc3RhdGljIHZvaWQgY3ljbGVfZGVsYXkoaW50IGN5Y2xlKQogewotCXVkZWxheShXQUlUX0NZQ0xFKmN5Y2xlKTsKKwl1ZGVsYXkoV0FJVF9DWUNMRSAqIGN5Y2xlKTsKIH0KIAotCiBzdGF0aWMgaW50IHBvbGxfbWFpbih2b2lkKQogewogCXVuc2lnbmVkIGNoYXIgc3RhdHVzX2hpZ2gsIHN0YXR1c19sb3c7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCmluZGV4IGZmMTkyNmMuLjE5OGE4MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bWVkaWEvbGlyYy5oPgogI2luY2x1ZGUgPG1lZGlhL2xpcmNfZGV2Lmg+CiAKLQogI2RlZmluZSBNT0RfQVVUSE9SCSJWZW5reSBSYWp1IDxkZXZAdmVua3kud3M+IgogI2RlZmluZSBNT0RfREVTQwkiRHJpdmVyIGZvciBTb3VuZEdyYXBoIGlNT04gTXVsdGlNZWRpYSBJUi9EaXNwbGF5IgogI2RlZmluZSBNT0RfTkFNRQkibGlyY19pbW9uIgpAQCAtMjEyLDcgKzIxMSw2IEBACiAJZWxzZQogCQlkZXZfaW5mbygmY29udGV4dC0+dXNiZGV2LT5kZXYsCiAJCQkgIkRlcmVnaXN0ZXJlZCBpTU9OIGRyaXZlciAobWlub3I6JWQpXG4iLCBtaW5vcik7Ci0KIH0KIAogLyoqCkBAIC00MjksNyArNDI3LDcgQEAKIAogCWRvIHsKIAkJbWVtY3B5KGNvbnRleHQtPnVzYl90eF9idWYsIGNvbnRleHQtPnR4LmRhdGFfYnVmICsgb2Zmc2V0LCA3KTsKLQkJY29udGV4dC0+dXNiX3R4X2J1Zls3XSA9ICh1bnNpZ25lZCBjaGFyKSBzZXE7CisJCWNvbnRleHQtPnVzYl90eF9idWZbN10gPSAodW5zaWduZWQgY2hhcilzZXE7CiAKIAkJcmV0dmFsID0gc2VuZF9wYWNrZXQoY29udGV4dCk7CiAJCWlmIChyZXR2YWwpIHsKQEAgLTQ0Nyw3ICs0NDUsNyBAQAogCWlmIChjb250ZXh0LT52ZmRfcHJvdG9fNnApIHsKIAkJLyogU2VuZCBwYWNrZXQgIzYgKi8KIAkJbWVtY3B5KGNvbnRleHQtPnVzYl90eF9idWYsICZ2ZmRfcGFja2V0Niwgc2l6ZW9mKHZmZF9wYWNrZXQ2KSk7Ci0JCWNvbnRleHQtPnVzYl90eF9idWZbN10gPSAodW5zaWduZWQgY2hhcikgc2VxOworCQljb250ZXh0LT51c2JfdHhfYnVmWzddID0gKHVuc2lnbmVkIGNoYXIpc2VxOwogCQlyZXR2YWwgPSBzZW5kX3BhY2tldChjb250ZXh0KTsKIAkJaWYgKHJldHZhbCkKIAkJCWRldl9lcnIoJmNvbnRleHQtPnVzYmRldi0+ZGV2LApAQCAtNTYzLDcgKzU2MSw3IEBACiAJCXZhbHVlIHw9IFBVTFNFX0JJVDsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpCi0JCWJ1ZltpXSA9IHZhbHVlPj4oaSo4KTsKKwkJYnVmW2ldID0gdmFsdWUgPj4gKGkgKiA4KTsKIAogCWxpcmNfYnVmZmVyX3dyaXRlKGNvbnRleHQtPmRyaXZlci0+cmJ1ZiwgYnVmKTsKIAl3YWtlX3VwKCZjb250ZXh0LT5kcml2ZXItPnJidWYtPndhaXRfcG9sbCk7CkBAIC01ODksNyArNTg3LDcgQEAKIAogCWlmIChsZW4gIT0gOCkgewogCQlkZXZfd2FybihkZXYsICJpbW9uICVzOiBpbnZhbGlkIGluY29taW5nIHBhY2tldCBzaXplIChsZW4gPSAlZCwgaW50ZiVkKVxuIiwKLQkJCV9fZnVuY19fLCBsZW4sIGludGYpOworCQkJIF9fZnVuY19fLCBsZW4sIGludGYpOwogCQlyZXR1cm47CiAJfQogCkBAIC03MDQsNyArNzAyLDcgQEAKIAkvKiBwcmV2ZW50IHJhY2VzIHByb2JpbmcgZGV2aWNlcyB3L211bHRpcGxlIGludGVyZmFjZXMgKi8KIAltdXRleF9sb2NrKCZkcml2ZXJfbG9jayk7CiAKLQljb250ZXh0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGltb25fY29udGV4dCksIEdGUF9LRVJORUwpOworCWNvbnRleHQgPSBremFsbG9jKHNpemVvZigqY29udGV4dCksIEdGUF9LRVJORUwpOwogCWlmICghY29udGV4dCkKIAkJZ290byBkcml2ZXJfdW5sb2NrOwogCkBAIC03ODQsMTEgKzc4MiwxMSBAQAogCQkJX19mdW5jX18sIHZmZF9wcm90b182cCk7CiAJfQogCi0JZHJpdmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CisJZHJpdmVyID0ga3phbGxvYyhzaXplb2YoKmRyaXZlciksIEdGUF9LRVJORUwpOwogCWlmICghZHJpdmVyKQogCQlnb3RvIGZyZWVfY29udGV4dDsKIAotCXJidWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGlyY19idWZmZXIpLCBHRlBfS0VSTkVMKTsKKwlyYnVmID0ga21hbGxvYyhzaXplb2YoKnJidWYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJidWYpCiAJCWdvdG8gZnJlZV9kcml2ZXI7CiAKQEAgLTc5NywxNiArNzk1LDExIEBACiAJCWdvdG8gZnJlZV9yYnVmOwogCX0KIAlyeF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghcnhfdXJiKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBJUiB1cmJcbiIsIF9fZnVuY19fKTsKKwlpZiAoIXJ4X3VyYikKIAkJZ290byBmcmVlX2xpcmNfYnVmOwotCX0KIAl0eF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghdHhfdXJiKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBkaXNwbGF5IHVyYlxuIiwKLQkJICAgIF9fZnVuY19fKTsKKwlpZiAoIXR4X3VyYikKIAkJZ290byBmcmVlX3J4X3VyYjsKLQl9CiAKIAltdXRleF9pbml0KCZjb250ZXh0LT5jdHhfbG9jayk7CiAJY29udGV4dC0+dmZkX3Byb3RvXzZwID0gdmZkX3Byb3RvXzZwOwpAQCAtODM1LDcgKzgyOCw3IEBACiAJfQogCiAJZGV2X2luZm8oZGV2LCAiUmVnaXN0ZXJlZCBpTU9OIGRyaXZlciAobGlyYyBtaW5vcjogJWQpXG4iLAotCQkJbGlyY19taW5vcik7CisJCSBsaXJjX21pbm9yKTsKIAogCS8qIE5lZWRlZCB3aGlsZSB1bnJlZ2lzdGVyaW5nISAqLwogCWRyaXZlci0+bWlub3IgPSBsaXJjX21pbm9yOwpAQCAtODU2LDggKzg0OSw4IEBACiAJCWNvbnRleHQtPmRpc3BsYXkgPSAxOwogCiAJdXNiX2ZpbGxfaW50X3VyYihjb250ZXh0LT5yeF91cmIsIGNvbnRleHQtPnVzYmRldiwKLQkJdXNiX3JjdmludHBpcGUoY29udGV4dC0+dXNiZGV2LAotCQkJY29udGV4dC0+cnhfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJIHVzYl9yY3ZpbnRwaXBlKGNvbnRleHQtPnVzYmRldiwKKwkJCSBjb250ZXh0LT5yeF9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCiAJCWNvbnRleHQtPnVzYl9yeF9idWYsIHNpemVvZihjb250ZXh0LT51c2JfcnhfYnVmKSwKIAkJdXNiX3J4X2NhbGxiYWNrLCBjb250ZXh0LAogCQljb250ZXh0LT5yeF9lbmRwb2ludC0+YkludGVydmFsKTsKQEAgLTg4Miw3ICs4NzUsNyBAQAogCX0KIAogCWRldl9pbmZvKGRldiwgImlNT04gZGV2aWNlICglMDR4OiUwNHgsIGludGYlZCkgb24gdXNiPCVkOiVkPiBpbml0aWFsaXplZFxuIiwKLQkJdmVuZG9yLCBwcm9kdWN0LCBpZm51bSwgdXNiZGV2LT5idXMtPmJ1c251bSwgdXNiZGV2LT5kZXZudW0pOworCQkgdmVuZG9yLCBwcm9kdWN0LCBpZm51bSwgdXNiZGV2LT5idXMtPmJ1c251bSwgdXNiZGV2LT5kZXZudW0pOwogCiAJLyogRXZlcnl0aGluZyB3ZW50IGZpbmUuIEp1c3QgdW5sb2NrIGFuZCByZXR1cm4gcmV0dmFsICh3aXRoIGlzIDApICovCiAJbXV0ZXhfdW5sb2NrKCZjb250ZXh0LT5jdHhfbG9jayk7CkBAIC05NzMsOCArOTY2LDggQEAKIAlzdHJ1Y3QgaW1vbl9jb250ZXh0ICpjb250ZXh0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAogCXVzYl9maWxsX2ludF91cmIoY29udGV4dC0+cnhfdXJiLCBjb250ZXh0LT51c2JkZXYsCi0JCXVzYl9yY3ZpbnRwaXBlKGNvbnRleHQtPnVzYmRldiwKLQkJCWNvbnRleHQtPnJ4X2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCSB1c2JfcmN2aW50cGlwZShjb250ZXh0LT51c2JkZXYsCisJCQkgY29udGV4dC0+cnhfZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAogCQljb250ZXh0LT51c2JfcnhfYnVmLCBzaXplb2YoY29udGV4dC0+dXNiX3J4X2J1ZiksCiAJCXVzYl9yeF9jYWxsYmFjaywgY29udGV4dCwKIAkJY29udGV4dC0+cnhfZW5kcG9pbnQtPmJJbnRlcnZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMKaW5kZXggMzkwNmFjNi4uNjRkOTllYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYwpAQCAtMTYzLDEyICsxNjMsMTIgQEAKIAlpZiAoY291bnQgPj0gMTAwMCAmJiB0aW1lZWxhcHNlZCA+IDApIHsKIAkJaWYgKGRlZmF1bHRfdGltZXIgPT0gMCkgewogCQkJLyogYXV0b2RldGVjdCB0aW1lciAqLwotCQkJbmV3dGltZXIgPSAoMTAwMDAwMCpjb3VudCkvdGltZWVsYXBzZWQ7CisJCQluZXd0aW1lciA9ICgxMDAwMDAwICogY291bnQpIC8gdGltZWVsYXBzZWQ7CiAJCQlwcl9pbmZvKCIldSBIeiB0aW1lciBkZXRlY3RlZFxuIiwgbmV3dGltZXIpOwogCQkJcmV0dXJuIG5ld3RpbWVyOwogCQl9Ci0JCW5ld3RpbWVyID0gKDEwMDAwMDAqY291bnQpL3RpbWVlbGFwc2VkOwotCQlpZiAoYWJzKG5ld3RpbWVyIC0gZGVmYXVsdF90aW1lcikgPiBkZWZhdWx0X3RpbWVyLzEwKSB7CisJCW5ld3RpbWVyID0gKDEwMDAwMDAgKiBjb3VudCkgLyB0aW1lZWxhcHNlZDsKKwkJaWYgKGFicyhuZXd0aW1lciAtIGRlZmF1bHRfdGltZXIpID4gZGVmYXVsdF90aW1lciAvIDEwKSB7CiAJCQkvKiBiYWQgdGltZXIgKi8KIAkJCXByX25vdGljZSgiYmFkIHRpbWVyOiAldSBIelxuIiwgbmV3dGltZXIpOwogCQkJcHJfbm90aWNlKCJ1c2luZyBkZWZhdWx0IHRpbWVyOiAldSBIelxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYwppbmRleCAyMjE4ZDAwLi40Njc4YWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zYXNlbS5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8bWVkaWEvbGlyYy5oPgogI2luY2x1ZGUgPG1lZGlhL2xpcmNfZGV2Lmg+CiAKLQogI2RlZmluZSBNT0RfQVVUSE9SCSJPbGl2ZXIgU3RhYmVsIDxvbGl2ZXIuc3RhYmVsQGdteC5kZT4sICIgXAogCQkJIlRpbSBEYXZpZXMgPHRpbUBvcGVuc3lzdGVtcy5uZXQuYXU+IgogI2RlZmluZSBNT0RfREVTQwkiVVNCIERyaXZlciBmb3IgU2FzZW0gUmVtb3RlIENvbnRyb2xsZXIgVjEuMSIKQEAgLTczLDcgKzcyLDcgQEAKIAogLyogVkZEIGZpbGVfb3BlcmF0aW9ucyBmdW5jdGlvbiBwcm90b3R5cGVzICovCiBzdGF0aWMgaW50IHZmZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBsb25nIHZmZF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgbG9uZyB2ZmRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQgdmZkX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0YXRpYyBzc2l6ZV90IHZmZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCQlzaXplX3Qgbl9ieXRlcywgbG9mZl90ICpwb3MpOwpAQCAtODYsNyArODUsNiBAQAogI2RlZmluZSBTQVNFTV9EQVRBX0JVRl9TWgkzMgogCiBzdHJ1Y3Qgc2FzZW1fY29udGV4dCB7Ci0KIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwogCWludCB2ZmRfaXNvcGVuOwkJCS8qIFZGRCBwb3J0IGhhcyBiZWVuIG9wZW5lZCAqLwogCXVuc2lnbmVkIGludCB2ZmRfY29udHJhc3Q7CS8qIFZGRCBjb250cmFzdCAqLwpAQCAtMTU2LDcgKzE1NCw2IEBACiAKIAogLyoqKiBNIE8gRCBVIEwgRSAgIEMgTyBEIEUgKioqLwotCiBNT0RVTEVfQVVUSE9SKE1PRF9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKE1PRF9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKQEAgLTE4Niw3ICsxODMsNiBAQAogCWVsc2UKIAkJZGV2X2luZm8oJmNvbnRleHQtPmRldi0+ZGV2LAogCQkJICJEZXJlZ2lzdGVyZWQgU2FzZW0gZHJpdmVyIChtaW5vcjolZClcbiIsIG1pbm9yKTsKLQogfQogCiAvKioKQEAgLTI0Myw3ICsyMzksNyBAQAogICogQ2FsbGVkIHdoZW4gdGhlIFZGRCBkZXZpY2UgKGUuZy4gL2Rldi91c2IvbGNkKQogICogaXMgY2xvc2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KICAqLwotc3RhdGljIGxvbmcgdmZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGxvbmcgdmZkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3Qgc2FzZW1fY29udGV4dCAqY29udGV4dDsKIApAQCAtMjk3LDcgKzI5Myw2IEBACiAJCWNvbnRleHQtPnZmZF9pc29wZW4gPSAwOwogCQlkZXZfaW5mbygmY29udGV4dC0+ZGV2LT5kZXYsICJWRkQgcG9ydCBjbG9zZWRcbiIpOwogCQlpZiAoIWNvbnRleHQtPmRldl9wcmVzZW50ICYmICFjb250ZXh0LT5pcl9pc29wZW4pIHsKLQogCQkJLyogRGV2aWNlIGRpc2Nvbm5lY3RlZCBiZWZvcmUgY2xvc2UgYW5kIElSIHBvcnQgaXMKIAkJCSAqIG5vdCBvcGVuLiBJZiBJUiBwb3J0IGlzIG9wZW4sIGNvbnRleHQgd2lsbCBiZQogCQkJICogZGVsZXRlZCBieSBpcl9jbG9zZS4gKi8KQEAgLTU0Niw5ICs1NDEsNyBAQAogCQkgKiBhdCBkaXNjb25uZWN0IHRpbWUsIHNvIGRvIGl0IG5vdy4KIAkJICovCiAJCWRlcmVnaXN0ZXJfZnJvbV9saXJjKGNvbnRleHQpOwotCiAJCWlmICghY29udGV4dC0+dmZkX2lzb3BlbikgewotCiAJCQltdXRleF91bmxvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKIAkJCWRlbGV0ZV9jb250ZXh0KGNvbnRleHQpOwogCQkJcmV0dXJuOwpAQCAtNjMzLDcgKzYyNiw2IEBACiAJCXJldHVybjsKIAogCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQogCWNhc2UgLUVOT0VOVDoJCS8qIHVzYmNvcmUgdW5saW5rIHN1Y2Nlc3NmdWwhICovCiAJCXJldHVybjsKIApAQCAtNjUxLDggKzY0Myw2IEBACiAJdXNiX3N1Ym1pdF91cmIoY29udGV4dC0+cnhfdXJiLCBHRlBfQVRPTUlDKTsKIH0KIAotCi0KIC8qKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIFVTQiBjb3JlIEFQSTogUHJvYmUKICAqLwpAQCAtNzA5LDcgKzY5OSw2IEBACiAKIAkJfSBlbHNlIGlmICghdmZkX2VwX2ZvdW5kICYmCiAJCQl1c2JfZW5kcG9pbnRfaXNfaW50X291dChlcCkpIHsKLQogCQkJdHhfZW5kcG9pbnQgPSBlcDsKIAkJCXZmZF9lcF9mb3VuZCA9IDE7CiAJCQlpZiAoZGVidWcpCkBAIC03MzUsMTcgKzcyNCwxNyBAQAogCS8qIEFsbG9jYXRlIG1lbW9yeSAqLwogCWFsbG9jX3N0YXR1cyA9IDA7CiAKLQljb250ZXh0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNhc2VtX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKKwljb250ZXh0ID0ga3phbGxvYyhzaXplb2YoKmNvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNvbnRleHQpIHsKIAkJYWxsb2Nfc3RhdHVzID0gMTsKIAkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOwogCX0KLQlkcml2ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGlyY19kcml2ZXIpLCBHRlBfS0VSTkVMKTsKKwlkcml2ZXIgPSBremFsbG9jKHNpemVvZigqZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkcml2ZXIpIHsKIAkJYWxsb2Nfc3RhdHVzID0gMjsKIAkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOwogCX0KLQlyYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGxpcmNfYnVmZmVyKSwgR0ZQX0tFUk5FTCk7CisJcmJ1ZiA9IGttYWxsb2Moc2l6ZW9mKCpyYnVmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyYnVmKSB7CiAJCWFsbG9jX3N0YXR1cyA9IDM7CiAJCWdvdG8gYWxsb2Nfc3RhdHVzX3N3aXRjaDsKQEAgLTc1OCwxNyArNzQ3LDEyIEBACiAJfQogCXJ4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyeF91cmIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCi0JCQkiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBJUiB1cmJcbiIsIF9fZnVuY19fKTsKIAkJYWxsb2Nfc3RhdHVzID0gNTsKIAkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOwogCX0KIAlpZiAodmZkX2VwX2ZvdW5kKSB7CiAJCXR4X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdHhfdXJiKSB7Ci0JCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKLQkJCQkiJXM6IHVzYl9hbGxvY191cmIgZmFpbGVkIGZvciBWRkQgdXJiIiwKLQkJCQlfX2Z1bmNfXyk7CiAJCQlhbGxvY19zdGF0dXMgPSA2OwogCQkJZ290byBhbGxvY19zdGF0dXNfc3dpdGNoOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvcHVsc2U4LWNlYy9wdWxzZTgtY2VjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvcHVsc2U4LWNlYy9wdWxzZTgtY2VjLmMKaW5kZXggOTRmODU5MC4uZWQ4YmQ5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3B1bHNlOC1jZWMvcHVsc2U4LWNlYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9wdWxzZTgtY2VjL3B1bHNlOC1jZWMuYwpAQCAtMTE0LDE0ICsxMTQsMTEgQEAKIAkJY2VjX3RyYW5zbWl0X2RvbmUocHVsc2U4LT5hZGFwLCBDRUNfVFhfU1RBVFVTX09LLAogCQkJCSAgMCwgMCwgMCwgMCk7CiAJCWJyZWFrOwotCWNhc2UgTVNHQ09ERV9UUkFOU01JVF9GQUlMRURfTElORToKLQkJY2VjX3RyYW5zbWl0X2RvbmUocHVsc2U4LT5hZGFwLCBDRUNfVFhfU1RBVFVTX0FSQl9MT1NULAotCQkJCSAgMSwgMCwgMCwgMCk7Ci0JCWJyZWFrOwogCWNhc2UgTVNHQ09ERV9UUkFOU01JVF9GQUlMRURfQUNLOgogCQljZWNfdHJhbnNtaXRfZG9uZShwdWxzZTgtPmFkYXAsIENFQ19UWF9TVEFUVVNfTkFDSywKIAkJCQkgIDAsIDEsIDAsIDApOwogCQlicmVhazsKKwljYXNlIE1TR0NPREVfVFJBTlNNSVRfRkFJTEVEX0xJTkU6CiAJY2FzZSBNU0dDT0RFX1RSQU5TTUlUX0ZBSUxFRF9USU1FT1VUX0RBVEE6CiAJY2FzZSBNU0dDT0RFX1RSQU5TTUlUX0ZBSUxFRF9USU1FT1VUX0xJTkU6CiAJCWNlY190cmFuc21pdF9kb25lKHB1bHNlOC0+YWRhcCwgQ0VDX1RYX1NUQVRVU19FUlJPUiwKQEAgLTE3MCw2ICsxNjcsOSBAQAogCQljYXNlIE1TR0NPREVfVFJBTlNNSVRfRkFJTEVEX1RJTUVPVVRfTElORToKIAkJCXNjaGVkdWxlX3dvcmsoJnB1bHNlOC0+d29yayk7CiAJCQlicmVhazsKKwkJY2FzZSBNU0dDT0RFX0hJR0hfRVJST1I6CisJCWNhc2UgTVNHQ09ERV9MT1dfRVJST1I6CisJCWNhc2UgTVNHQ09ERV9SRUNFSVZFX0ZBSUxFRDoKIAkJY2FzZSBNU0dDT0RFX1RJTUVPVVRfRVJST1I6CiAJCQlicmVhazsKIAkJY2FzZSBNU0dDT0RFX0NPTU1BTkRfQUNDRVBURUQ6CkBAIC0zODgsNyArMzg4LDcgQEAKIAlpbnQgZXJyOwogCiAJY21kWzBdID0gTVNHQ09ERV9UUkFOU01JVF9JRExFVElNRTsKLQljbWRbMV0gPSAzOworCWNtZFsxXSA9IHNpZ25hbF9mcmVlX3RpbWU7CiAJZXJyID0gcHVsc2U4X3NlbmRfYW5kX3dhaXQocHVsc2U4LCBjbWQsIDIsCiAJCQkJICAgTVNHQ09ERV9DT01NQU5EX0FDQ0VQVEVELCAxKTsKIAljbWRbMF0gPSBNU0dDT0RFX1RSQU5TTUlUX0FDS19QT0xBUklUWTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L0RvY3VtZW50YXRpb24vQUJJL3N5c2ZzLWNsYXNzLW1vc3QudHh0IGIvZHJpdmVycy9zdGFnaW5nL21vc3QvRG9jdW1lbnRhdGlvbi9BQkkvc3lzZnMtY2xhc3MtbW9zdC50eHQKaW5kZXggNDJmZjBkOC4uNDhhYTQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvRG9jdW1lbnRhdGlvbi9BQkkvc3lzZnMtY2xhc3MtbW9zdC50eHQKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvRG9jdW1lbnRhdGlvbi9BQkkvc3lzZnMtY2xhc3MtbW9zdC50eHQKQEAgLTUxLDYgKzUxLDE0MCBAQAogCQl1c2VzLgogVXNlcnM6CiAKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJSWYgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIGNvbnRyb2xsZXIgaXMgYXR0YWNoZWQgdmlhIFVTQiwgYSBkY2kKKwkJZGlyZWN0b3J5IGlzIGNyZWF0ZWQgdGhhdCBhbGxvd3MgYXBwbGljYXRpb25zIHRvIHVzZSB0aGUKKwkJY29udHJvbGxlcidzIGRpcmVjdCBjb21tdW5pY2F0aW9uIGludGVyZmFjZSAoRENJKSB0byBleGNoYW5nZQorCQlpbmZvcm1hdGlvbi4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9hcmJfYWRkcmVzcworRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgaXMgdXNlZCB0byBzZXQgYW4gYXJiaXRyYXJ5IERDSSByZWdpc3RlciBhZGRyZXNzIGFuCisJCWFwcGxpY2F0aW9uIHdhbnRzIHRvIHJlYWQgZnJvbSBvciB3cml0ZSB0by4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9hcmJfdmFsdWUKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gcmVhZCBmcm9tIG9yIHdyaXRlIHRvIHRoZSBhcmJpdHJhcnkgRENJIHJlZ2lzdGVyCisJCXdob3NlIGFkZHJlc3MgaXMgc3RvcmVkIGluIGFyYl9hZGRyZXNzLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL21lcF9ldWk0OF9oaQorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgaXMgdXNlZCB0byBjaGVjayBhbmQgY29uZmlndXJlIHRoZSBNQUMgYWRkcmVzcy4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9tZXBfZXVpNDhfbG8KK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gY2hlY2sgYW5kIGNvbmZpZ3VyZSB0aGUgTUFDIGFkZHJlc3MuCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvbWVwX2V1aTQ4X21pCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhpcyBpcyB1c2VkIHRvIGNoZWNrIGFuZCBjb25maWd1cmUgdGhlIE1BQyBhZGRyZXNzLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL21lcF9maWx0ZXIKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gY2hlY2sgYW5kIGNvbmZpZ3VyZSB0aGUgTUVQIGZpbHRlciBhZGRyZXNzLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL21lcF9oYXNoMAorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgaXMgdXNlZCB0byBjaGVjayBhbmQgY29uZmlndXJlIHRoZSBNRVAgaGFzaCB0YWJsZS4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9tZXBfaGFzaDEKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGlzIGlzIHVzZWQgdG8gY2hlY2sgYW5kIGNvbmZpZ3VyZSB0aGUgTUVQIGhhc2ggdGFibGUuCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvbWVwX2hhc2gyCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhpcyBpcyB1c2VkIHRvIGNoZWNrIGFuZCBjb25maWd1cmUgdGhlIE1FUCBoYXNoIHRhYmxlLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL21lcF9oYXNoMworRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgaXMgdXNlZCB0byBjaGVjayBhbmQgY29uZmlndXJlIHRoZSBNRVAgaGFzaCB0YWJsZS4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9uaV9zdGF0ZQorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCUluZGljYXRlcyB0aGUgY3VycmVudCBuZXR3b3JrIGludGVyZmFjZSBzdGF0ZS4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9ub2RlX2FkZHJlc3MKK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZXMgdGhlIGN1cnJlbnQgbm9kZSBhZGRyZXNzLgorVXNlcnM6CisKK1doYXQ6CQkvc3lzL2NsYXNzL21vc3QvbW9zdGNvcmUvZGV2aWNlcy88bWRldj4vZGNpL25vZGVfcG9zaXRpb24KK0RhdGU6CQlKdW5lIDIwMTYKK0tlcm5lbFZlcnNpb246CTQuOQorQ29udGFjdDoJQ2hyaXN0aWFuIEdyb21tIDxjaHJpc3RpYW4uZ3JvbW1AbWljcm9jaGlwLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlJbmRpY2F0ZXMgdGhlIGN1cnJlbnQgbm9kZSBwb3NpdGlvbi4KK1VzZXJzOgorCitXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+L2RjaS9wYWNrZXRfYmFuZHdpZHRoCitEYXRlOgkJSnVuZSAyMDE2CitLZXJuZWxWZXJzaW9uOgk0LjkKK0NvbnRhY3Q6CUNocmlzdGlhbiBHcm9tbSA8Y2hyaXN0aWFuLmdyb21tQG1pY3JvY2hpcC5jb20+CitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBjb25maWd1cmVkIHBhY2tldCBiYW5kd2lkdGguCitVc2VyczoKKworV2hhdDoJCS9zeXMvY2xhc3MvbW9zdC9tb3N0Y29yZS9kZXZpY2VzLzxtZGV2Pi9kY2kvc3luY19lcAorRGF0ZToJCUp1bmUgMjAxNgorS2VybmVsVmVyc2lvbjoJNC45CitDb250YWN0OglDaHJpc3RpYW4gR3JvbW0gPGNocmlzdGlhbi5ncm9tbUBtaWNyb2NoaXAuY29tPgorRGVzY3JpcHRpb246CisJCVRyaWdnZXJzIHRoZSBjb250cm9sbGVyJ3Mgc3luY2hyb25pemF0aW9uIHByb2Nlc3MgZm9yIGEgY2VydGFpbgorCQllbmRwb2ludC4KK1VzZXJzOgorCiBXaGF0OgkJL3N5cy9jbGFzcy9tb3N0L21vc3Rjb3JlL2RldmljZXMvPG1kZXY+LzxjaGFubmVsPi8KIERhdGU6CQlKdW5lIDIwMTUKIEtlcm5lbFZlcnNpb246CTQuMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLWNkZXYvY2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLWNkZXYvY2Rldi5jCmluZGV4IGRlNGY3NmEuLjdmNTEwMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1jZGV2L2NkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tY2Rldi9jZGV2LmMKQEAgLTU3LDcgKzU3LDExIEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBjaF9nZXRfbWJvKHN0cnVjdCBhaW1fY2hhbm5lbCAqYywgc3RydWN0IG1ibyAqKm1ibykKIHsKLQkqbWJvID0gbW9zdF9nZXRfbWJvKGMtPmlmYWNlLCBjLT5jaGFubmVsX2lkLCAmY2Rldl9haW0pOworCWlmICgha2ZpZm9fcGVlaygmYy0+ZmlmbywgbWJvKSkgeworCQkqbWJvID0gbW9zdF9nZXRfbWJvKGMtPmlmYWNlLCBjLT5jaGFubmVsX2lkLCAmY2Rldl9haW0pOworCQlpZiAoKm1ibykKKwkJCWtmaWZvX2luKCZjLT5maWZvLCBtYm8sIDEpOworCX0KIAlyZXR1cm4gKm1ibzsKIH0KIApAQCAtMTMwLDcgKzEzNCw3IEBACiAJaWYgKCFjLT5kZXYpIHsKIAkJcHJfaW5mbygiV0FSTjogRGV2aWNlIGlzIGRlc3Ryb3llZFxuIik7CiAJCW11dGV4X3VubG9jaygmYy0+aW9fbXV0ZXgpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoYy0+YWNjZXNzX3JlZikgewpAQCAtMTg0LDggKzE4OCw3IEBACiAJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKIHsKIAlpbnQgcmV0OwotCXNpemVfdCBhY3R1YWxfbGVuOwotCXNpemVfdCBtYXhfbGVuOworCXNpemVfdCB0b19jb3B5LCBsZWZ0OwogCXN0cnVjdCBtYm8gKm1ibyA9IE5VTEw7CiAJc3RydWN0IGFpbV9jaGFubmVsICpjID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCkBAIC0yMDEsMjcgKzIwNCwyOCBAQAogCX0KIAogCWlmICh1bmxpa2VseSghYy0+ZGV2KSkgewotCQlyZXQgPSAtRVBJUEU7CisJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gdW5sb2NrOwogCX0KIAotCW1heF9sZW4gPSBjLT5jZmctPmJ1ZmZlcl9zaXplOwotCWFjdHVhbF9sZW4gPSBtaW4oY291bnQsIG1heF9sZW4pOwotCW1iby0+YnVmZmVyX2xlbmd0aCA9IGFjdHVhbF9sZW47Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIobWJvLT52aXJ0X2FkZHJlc3MsIGJ1ZiwgbWJvLT5idWZmZXJfbGVuZ3RoKSkgeworCXRvX2NvcHkgPSBtaW4oY291bnQsIGMtPmNmZy0+YnVmZmVyX3NpemUgLSBjLT5tYm9fb2Zmcyk7CisJbGVmdCA9IGNvcHlfZnJvbV91c2VyKG1iby0+dmlydF9hZGRyZXNzICsgYy0+bWJvX29mZnMsIGJ1ZiwgdG9fY29weSk7CisJaWYgKGxlZnQgPT0gdG9fY29weSkgewogCQlyZXQgPSAtRUZBVUxUOwotCQlnb3RvIHB1dF9tYm87CisJCWdvdG8gdW5sb2NrOwogCX0KIAotCXJldCA9IG1vc3Rfc3VibWl0X21ibyhtYm8pOwotCWlmIChyZXQpCi0JCWdvdG8gcHV0X21ibzsKKwljLT5tYm9fb2ZmcyArPSB0b19jb3B5IC0gbGVmdDsKKwlpZiAoYy0+bWJvX29mZnMgPj0gYy0+Y2ZnLT5idWZmZXJfc2l6ZSB8fAorCSAgICBjLT5jZmctPmRhdGFfdHlwZSA9PSBNT1NUX0NIX0NPTlRST0wgfHwKKwkgICAgYy0+Y2ZnLT5kYXRhX3R5cGUgPT0gTU9TVF9DSF9BU1lOQykgeworCQlrZmlmb19za2lwKCZjLT5maWZvKTsKKwkJbWJvLT5idWZmZXJfbGVuZ3RoID0gYy0+bWJvX29mZnM7CisJCWMtPm1ib19vZmZzID0gMDsKKwkJbW9zdF9zdWJtaXRfbWJvKG1ibyk7CisJfQogCi0JbXV0ZXhfdW5sb2NrKCZjLT5pb19tdXRleCk7Ci0JcmV0dXJuIGFjdHVhbF9sZW47Ci1wdXRfbWJvOgotCW1vc3RfcHV0X21ibyhtYm8pOworCXJldCA9IHRvX2NvcHkgLSBsZWZ0OwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmYy0+aW9fbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC0yNTYsNyArMjYwLDcgQEAKIAkvKiBtYWtlIHN1cmUgd2UgZG9uJ3Qgc3VibWl0IHRvIGdvbmUgZGV2aWNlcyAqLwogCWlmICh1bmxpa2VseSghYy0+ZGV2KSkgewogCQltdXRleF91bmxvY2soJmMtPmlvX211dGV4KTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXRvX2NvcHkgPSBtaW5fdChzaXplX3QsCkBAIC0yOTAsNyArMjk0LDcgQEAKIAkJaWYgKCFrZmlmb19pc19lbXB0eSgmYy0+ZmlmbykpCiAJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CiAJfSBlbHNlIHsKLQkJaWYgKGNoX2hhc19tYm8oYykpCisJCWlmICgha2ZpZm9faXNfZW1wdHkoJmMtPmZpZm8pIHx8IGNoX2hhc19tYm8oYykpCiAJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwogCX0KIAlyZXR1cm4gbWFzazsKQEAgLTM2Niw3ICszNzAsNyBAQAogCXNwaW5fbG9jaygmYy0+dW5saW5rKTsKIAlpZiAoIWMtPmFjY2Vzc19yZWYgfHwgIWMtPmRldikgewogCQlzcGluX3VubG9jaygmYy0+dW5saW5rKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAlrZmlmb19pbigmYy0+ZmlmbywgJm1ibywgMSk7CiAJc3Bpbl91bmxvY2soJmMtPnVubGluayk7CkBAIC00OTksMjMgKzUwMywyNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBtb2RfaW5pdCh2b2lkKQogeworCWludCBlcnI7CisKIAlwcl9pbmZvKCJpbml0KClcbiIpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmNoYW5uZWxfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJmNoX2xpc3RfbG9jayk7CiAJaWRhX2luaXQoJm1pbm9yX2lkKTsKIAotCWlmIChhbGxvY19jaHJkZXZfcmVnaW9uKCZhaW1fZGV2bm8sIDAsIDUwLCAiY2RldiIpIDwgMCkKLQkJcmV0dXJuIC1FSU87CisJZXJyID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmYWltX2Rldm5vLCAwLCA1MCwgImNkZXYiKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBkZXN0X2lkYTsKIAltYWpvciA9IE1BSk9SKGFpbV9kZXZubyk7CiAKIAlhaW1fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJtb3N0X2NkZXZfYWltIik7CiAJaWYgKElTX0VSUihhaW1fY2xhc3MpKSB7CiAJCXByX2Vycigibm8gdWRldiBzdXBwb3J0XG4iKTsKKwkJZXJyID0gUFRSX0VSUihhaW1fY2xhc3MpOwogCQlnb3RvIGZyZWVfY2RldjsKIAl9Ci0KLQlpZiAobW9zdF9yZWdpc3Rlcl9haW0oJmNkZXZfYWltKSkKKwllcnIgPSBtb3N0X3JlZ2lzdGVyX2FpbSgmY2Rldl9haW0pOworCWlmIChlcnIpCiAJCWdvdG8gZGVzdF9jbGFzczsKIAlyZXR1cm4gMDsKIApAQCAtNTIzLDcgKzUzMSw5IEBACiAJY2xhc3NfZGVzdHJveShhaW1fY2xhc3MpOwogZnJlZV9jZGV2OgogCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihhaW1fZGV2bm8sIDEpOwotCXJldHVybiAtRUlPOworZGVzdF9pZGE6CisJaWRhX2Rlc3Ryb3koJm1pbm9yX2lkKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbW9kX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1uZXR3b3JrL25ldHdvcmtpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1uZXR3b3JrL25ldHdvcmtpbmcuYwppbmRleCAyZjQyZGU0Li40NjU5YTY0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLW5ldHdvcmsvbmV0d29ya2luZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1uZXR3b3JrL25ldHdvcmtpbmcuYwpAQCAtMjk4LDE1ICsyOTgsMTYgQEAKIAlzdHJ1Y3QgbW9zdF9pbnRlcmZhY2UgKmlmYWNlKQogewogCXN0cnVjdCBuZXRfZGV2X2NvbnRleHQgKm5kLCAqdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2soJmxpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShuZCwgdG1wLCAmbmV0X2RldmljZXMsIGxpc3QpIHsKIAkJaWYgKG5kLT5pZmFjZSA9PSBpZmFjZSkgewotCQkJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybiBuZDsKIAkJfQogCX0KLQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMzE2LDYgKzMxNyw3IEBACiB7CiAJc3RydWN0IG5ldF9kZXZfY29udGV4dCAqbmQ7CiAJc3RydWN0IG5ldF9kZXZfY2hhbm5lbCAqY2g7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghaWZhY2UpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzMyLDkgKzMzNCw5IEBACiAKIAkJbmQtPmlmYWNlID0gaWZhY2U7CiAKLQkJc3Bpbl9sb2NrKCZsaXN0X2xvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJCWxpc3RfYWRkKCZuZC0+bGlzdCwgJm5ldF9kZXZpY2VzKTsKLQkJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCX0KIAogCWNoID0gY2NmZy0+ZGlyZWN0aW9uID09IE1PU1RfQ0hfVFggPyAmbmQtPnR4IDogJm5kLT5yeDsKQEAgLTM3Nyw2ICszNzksNyBAQAogewogCXN0cnVjdCBuZXRfZGV2X2NvbnRleHQgKm5kOwogCXN0cnVjdCBuZXRfZGV2X2NoYW5uZWwgKmNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAluZCA9IGdldF9uZXRfZGV2X2NvbnRleHQoaWZhY2UpOwogCWlmICghbmQpCkBAIC0zOTgsOSArNDAxLDkgQEAKIAltb3N0X25ldF9ybV9uZXRkZXZfc2FmZShuZCk7CiAKIAlpZiAoIW5kLT5yeC5saW5rZWQgJiYgIW5kLT50eC5saW5rZWQpIHsKLQkJc3Bpbl9sb2NrKCZsaXN0X2xvY2spOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJCWxpc3RfZGVsKCZuZC0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAkJa2ZyZWUobmQpOwogCX0KIApAQCAtNTE0LDIwICs1MTcsMjEgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBtb3N0X25ldF9leGl0KHZvaWQpCiB7CiAJc3RydWN0IG5ldF9kZXZfY29udGV4dCAqbmQsICp0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5kLCB0bXAsICZuZXRfZGV2aWNlcywgbGlzdCkgewogCQlsaXN0X2RlbCgmbmQtPmxpc3QpOwotCQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBmbGFncyk7CiAJCS8qCiAJCSAqIGRvIG5vdCBjYWxsIG1vc3Rfc3RvcF9jaGFubmVsKCkgaGVyZSwgYmVjYXVzZSBjaGFubmVscyBhcmUKIAkJICogZ29pbmcgdG8gYmUgY2xvc2VkIGluIG5kb19zdG9wKCkgYWZ0ZXIgdW5yZWdpc3Rlcl9uZXRkZXYoKQogCQkgKi8KIAkJbW9zdF9uZXRfcm1fbmV0ZGV2X3NhZmUobmQpOwogCQlrZnJlZShuZCk7Ci0JCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCX0KLQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAogCW1vc3RfZGVyZWdpc3Rlcl9haW0oJmFpbSk7CiAJcHJfaW5mbygibW9zdF9uZXRfZXhpdCgpXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS1zb3VuZC9zb3VuZC5jIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLXNvdW5kL3NvdW5kLmMKaW5kZXggOWM2NDU4MC4uZTQxOThlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLXNvdW5kL3NvdW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLXNvdW5kL3NvdW5kLmMKQEAgLTIzNCw3ICsyMzQsNiBAQAogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXN0cnVjdCBtYm8gKm1ibyA9IE5VTEw7CiAJCWJvb2wgcGVyaW9kX2VsYXBzZWQgPSBmYWxzZTsKLQkJaW50IHJldDsKIAogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoCiAJCQljaGFubmVsLT5wbGF5YmFja193YWl0cSwKQEAgLTI1MCwxMCArMjQ5LDcgQEAKIAkJZWxzZQogCQkJbWVtc2V0KG1iby0+dmlydF9hZGRyZXNzLCAwLCBtYm8tPmJ1ZmZlcl9sZW5ndGgpOwogCi0JCXJldCA9IG1vc3Rfc3VibWl0X21ibyhtYm8pOwotCQlpZiAocmV0KQotCQkJY2hhbm5lbC0+aXNfc3RyZWFtX3J1bm5pbmcgPSBmYWxzZTsKLQorCQltb3N0X3N1Ym1pdF9tYm8obWJvKTsKIAkJaWYgKHBlcmlvZF9lbGFwc2VkKQogCQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChjaGFubmVsLT5zdWJzdHJlYW0pOwogCX0KQEAgLTQ1Nyw3ICs0NTMsNyBAQAogLyoqCiAgKiBJbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3Qgc25kX3BjbV9vcHMKICAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBwY21fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBwY21fb3BzID0gewogCS5vcGVuICAgICAgID0gcGNtX29wZW4sCiAJLmNsb3NlICAgICAgPSBwY21fY2xvc2UsCiAJLmlvY3RsICAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTYxMSw3ICs2MDcsOCBAQAogCWNoYW5uZWwtPmlkID0gY2hhbm5lbF9pZDsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjaGFubmVsLT5wbGF5YmFja193YWl0cSk7CiAKLQlpZiAoYXVkaW9fc2V0X2h3X3BhcmFtcygmY2hhbm5lbC0+cGNtX2hhcmR3YXJlLCBwY21fZm9ybWF0LCBjZmcpKQorCXJldCA9IGF1ZGlvX3NldF9od19wYXJhbXMoJmNoYW5uZWwtPnBjbV9oYXJkd2FyZSwgcGNtX2Zvcm1hdCwgY2ZnKTsKKwlpZiAocmV0KQogCQlnb3RvIGVycl9mcmVlX2NhcmQ7CiAKIAlzbnByaW50ZihjYXJkLT5kcml2ZXIsIHNpemVvZihjYXJkLT5kcml2ZXIpLCAiJXMiLCBEUklWRVJfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tdjRsMi92aWRlby5jIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvYWltLXY0bDIvdmlkZW8uYwppbmRleCAxM2FiZjdjLi5lMDc0ODQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9haW0tdjRsMi92aWRlby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2FpbS12NGwyL3ZpZGVvLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSB2aWRlb19kcnZkYXRhKGZpbHApOwogCXN0cnVjdCBhaW1fZmggKmZoOwogCi0JcHJfaW5mbygiYWltX3ZkZXZfb3BlbigpXG4iKTsKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAiYWltX3ZkZXZfb3BlbigpXG4iKTsKIAogCXN3aXRjaCAodmRldi0+dmZsX3R5cGUpIHsKIAljYXNlIFZGTF9UWVBFX0dSQUJCRVI6CkBAIC05Myw3ICs5Myw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKCFhdG9taWNfaW5jX2FuZF90ZXN0KCZtZGV2LT5hY2Nlc3NfcmVmKSkgewotCQlwcl9lcnIoInRvbyBtYW55IGNsaWVudHNcbiIpOworCQl2NGwyX2VycigmbWRldi0+djRsMl9kZXYsICJ0b28gbWFueSBjbGllbnRzXG4iKTsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIGVycl9kZWM7CiAJfQpAQCAtMTA2LDcgKzEwNiw3IEBACiAKIAlyZXQgPSBtb3N0X3N0YXJ0X2NoYW5uZWwobWRldi0+aWZhY2UsIG1kZXYtPmNoX2lkeCwgJmFpbV9pbmZvKTsKIAlpZiAocmV0KSB7Ci0JCXByX2VycigibW9zdF9zdGFydF9jaGFubmVsKCkgZmFpbGVkXG4iKTsKKwkJdjRsMl9lcnIoJm1kZXYtPnY0bDJfZGV2LCAibW9zdF9zdGFydF9jaGFubmVsKCkgZmFpbGVkXG4iKTsKIAkJZ290byBlcnJfcm07CiAJfQogCkBAIC0xMjgsNyArMTI4LDcgQEAKIAlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSBmaC0+bWRldjsKIAlzdHJ1Y3QgbWJvICptYm8sICp0bXA7CiAKLQlwcl9pbmZvKCJhaW1fdmRldl9jbG9zZSgpXG4iKTsKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAiYWltX3ZkZXZfY2xvc2UoKVxuIik7CiAKIAkvKgogCSAqIFdlIG5lZWQgdG8gcHV0IE1CT3MgYmFjayBiZWZvcmUgd2UgY2FsbCBtb3N0X3N0b3BfY2hhbm5lbCgpCkBAIC0xMzksMTUgKzEzOSwxNSBAQAogCSAqIFRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBjb3JlLgogCSAqLwogCi0Jc3Bpbl9sb2NrKCZtZGV2LT5saXN0X2xvY2spOworCXNwaW5fbG9ja19pcnEoJm1kZXYtPmxpc3RfbG9jayk7CiAJbWRldi0+bXV0ZSA9IHRydWU7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1ibywgdG1wLCAmbWRldi0+cGVuZGluZ19tYm9zLCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZtYm8tPmxpc3QpOwotCQlzcGluX3VubG9jaygmbWRldi0+bGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZtZGV2LT5saXN0X2xvY2spOwogCQltb3N0X3B1dF9tYm8obWJvKTsKLQkJc3Bpbl9sb2NrKCZtZGV2LT5saXN0X2xvY2spOworCQlzcGluX2xvY2tfaXJxKCZtZGV2LT5saXN0X2xvY2spOwogCX0KLQlzcGluX3VubG9jaygmbWRldi0+bGlzdF9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJm1kZXYtPmxpc3RfbG9jayk7CiAJbW9zdF9zdG9wX2NoYW5uZWwobWRldi0+aWZhY2UsIG1kZXYtPmNoX2lkeCwgJmFpbV9pbmZvKTsKIAltZGV2LT5tdXRlID0gZmFsc2U7CiAKQEAgLTE4Nyw3ICsxODcsNyBAQAogCQlpbnQgY29uc3QgY250ID0gcmVtIDwgY291bnQgPyByZW0gOiBjb3VudDsKIAogCQlpZiAoY29weV90b191c2VyKGJ1ZiwgbWJvLT52aXJ0X2FkZHJlc3MgKyBmaC0+b2ZmcywgY250KSkgewotCQkJcHJfZXJyKCJyZWFkOiBjb3B5X3RvX3VzZXIgZmFpbGVkXG4iKTsKKwkJCXY0bDJfZXJyKCZtZGV2LT52NGwyX2RldiwgInJlYWQ6IGNvcHlfdG9fdXNlciBmYWlsZWRcbiIpOwogCQkJaWYgKCFyZXQpCiAJCQkJcmV0ID0gLUVGQVVMVDsKIAkJCXJldHVybiByZXQ7CkBAIC0yMDAsOSArMjAwLDkgQEAKIAogCQlpZiAoY250ID49IHJlbSkgewogCQkJZmgtPm9mZnMgPSAwOwotCQkJc3Bpbl9sb2NrKCZtZGV2LT5saXN0X2xvY2spOworCQkJc3Bpbl9sb2NrX2lycSgmbWRldi0+bGlzdF9sb2NrKTsKIAkJCWxpc3RfZGVsKCZtYm8tPmxpc3QpOwotCQkJc3Bpbl91bmxvY2soJm1kZXYtPmxpc3RfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnEoJm1kZXYtPmxpc3RfbG9jayk7CiAJCQltb3N0X3B1dF9tYm8obWJvKTsKIAkJfQogCX0KQEAgLTI1MCwxNiArMjUwLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQogewogCXN0cnVjdCBhaW1fZmggKmZoID0gcHJpdjsKIAlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSBmaC0+bWRldjsKIAotCXByX2luZm8oInZpZGlvY19xdWVyeWNhcCgpXG4iKTsKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAidmlkaW9jX3F1ZXJ5Y2FwKClcbiIpOwogCiAJc3RybGNweShjYXAtPmRyaXZlciwgInY0bDJfbW9zdF9haW0iLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKLQlzdHJsY3B5KGNhcC0+Y2FyZCwgIm15X2NhcmQiLCBzaXplb2YoY2FwLT5jYXJkKSk7CisJc3RybGNweShjYXAtPmNhcmQsICJNT1NUIiwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXNucHJpbnRmKGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSwKIAkJICIlcyIsIG1kZXYtPmlmYWNlLT5kZXNjcmlwdGlvbik7CiAKQEAgLTI3MCwxMCArMjcwLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQogewotCXByX2luZm8oInZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKCkgJWRcbiIsIGYtPmluZGV4KTsKKwlzdHJ1Y3QgYWltX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2ID0gZmgtPm1kZXY7CisKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAidmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoKSAlZFxuIiwgZi0+aW5kZXgpOwogCiAJaWYgKGYtPmluZGV4KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI4OSw3ICsyOTIsMTAgQEAKIHN0YXRpYyBpbnQgdmlkaW9jX2dfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXByX2luZm8oInZpZGlvY19nX2ZtdF92aWRfY2FwKClcbiIpOworCXN0cnVjdCBhaW1fZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYgPSBmaC0+bWRldjsKKworCXY0bDJfaW5mbygmbWRldi0+djRsMl9kZXYsICJ2aWRpb2NfZ19mbXRfdmlkX2NhcCgpXG4iKTsKIAogCWFpbV9zZXRfZm9ybWF0X3N0cnVjdChmKTsKIAlyZXR1cm4gMDsKQEAgLTI5OCw3ICszMDQsNyBAQAogc3RhdGljIGludCB2aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBhaW1fZmggKmZoICA9IHByaXY7CisJc3RydWN0IGFpbV9maCAqZmggPSBwcml2OwogCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9IGZoLT5tZGV2OwogCiAJcmV0dXJuIGFpbV9zZXRfZm9ybWF0KG1kZXYsIFZJRElPQ19UUllfRk1ULCBmKTsKQEAgLTMwNyw3ICszMTMsNyBAQAogc3RhdGljIGludCB2aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IGFpbV9maCAqZmggID0gcHJpdjsKKwlzdHJ1Y3QgYWltX2ZoICpmaCA9IHByaXY7CiAJc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2ID0gZmgtPm1kZXY7CiAKIAlyZXR1cm4gYWltX3NldF9mb3JtYXQobWRldiwgVklESU9DX1NfRk1ULCBmKTsKQEAgLTMxNSw3ICszMjEsMTAgQEAKIAogc3RhdGljIGludCB2aWRpb2NfZ19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkICpub3JtKQogewotCXByX2luZm8oInZpZGlvY19nX3N0ZCgpXG4iKTsKKwlzdHJ1Y3QgYWltX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2ID0gZmgtPm1kZXY7CisKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAidmlkaW9jX2dfc3RkKClcbiIpOwogCiAJKm5vcm0gPSBWNEwyX1NURF9VTktOT1dOOwogCXJldHVybiAwOwpAQCAtMzUyLDcgKzM2MSw3IEBACiAJc3RydWN0IGFpbV9maCAqZmggPSBwcml2OwogCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9IGZoLT5tZGV2OwogCi0JcHJfaW5mbygidmlkaW9jX3NfaW5wdXQoJWQpXG4iLCBpbmRleCk7CisJdjRsMl9pbmZvKCZtZGV2LT52NGwyX2RldiwgInZpZGlvY19zX2lucHV0KCVkKVxuIiwgaW5kZXgpOwogCiAJaWYgKGluZGV4ID49IFY0TDJfQUlNX01BWF9JTlBVVCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNjAsNyArMzY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBhaW1fZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgYWltX2ZvcHMgPSB7CiAJLm93bmVyICAgICAgPSBUSElTX01PRFVMRSwKIAkub3BlbiAgICAgICA9IGFpbV92ZGV2X29wZW4sCiAJLnJlbGVhc2UgICAgPSBhaW1fdmRldl9jbG9zZSwKQEAgLTM5Myw0NSArNDAyLDQ2IEBACiBzdGF0aWMgc3RydWN0IG1vc3RfdmlkZW9fZGV2ICpnZXRfYWltX2RldigKIAlzdHJ1Y3QgbW9zdF9pbnRlcmZhY2UgKmlmYWNlLCBpbnQgY2hhbm5lbF9pZHgpCiB7Ci0Jc3RydWN0IG1vc3RfdmlkZW9fZGV2ICptZGV2LCAqdG1wOworCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrKCZsaXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtZGV2LCB0bXAsICZ2aWRlb19kZXZpY2VzLCBsaXN0KSB7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobWRldiwgJnZpZGVvX2RldmljZXMsIGxpc3QpIHsKIAkJaWYgKG1kZXYtPmlmYWNlID09IGlmYWNlICYmIG1kZXYtPmNoX2lkeCA9PSBjaGFubmVsX2lkeCkgewotCQkJc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGZsYWdzKTsKIAkJCXJldHVybiBtZGV2OwogCQl9CiAJfQotCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3RfbG9jaywgZmxhZ3MpOwogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50IGFpbV9yeF9kYXRhKHN0cnVjdCBtYm8gKm1ibykKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9CiAJCWdldF9haW1fZGV2KG1iby0+aWZwLCBtYm8tPmhkbV9jaGFubmVsX2lkKTsKIAogCWlmICghbWRldikKIAkJcmV0dXJuIC1FSU87CiAKLQlzcGluX2xvY2soJm1kZXYtPmxpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmxpc3RfbG9jaywgZmxhZ3MpOwogCWlmICh1bmxpa2VseShtZGV2LT5tdXRlKSkgewotCQlzcGluX3VubG9jaygmbWRldi0+bGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+bGlzdF9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAtRUlPOwogCX0KIAogCWxpc3RfYWRkX3RhaWwoJm1iby0+bGlzdCwgJm1kZXYtPnBlbmRpbmdfbWJvcyk7Ci0Jc3Bpbl91bmxvY2soJm1kZXYtPmxpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+bGlzdF9sb2NrLCBmbGFncyk7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtZGV2LT53YWl0X2RhdGEpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFpbV9yZWdpc3Rlcl92aWRlb2RldihzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYpCiB7Ci0JaW50IHJldHZhbCA9IC1FTk9NRU07CiAJaW50IHJldDsKIAotCXByX2luZm8oImFpbV9yZWdpc3Rlcl92aWRlb2RldigpXG4iKTsKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAiYWltX3JlZ2lzdGVyX3ZpZGVvZGV2KClcbiIpOwogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmbWRldi0+d2FpdF9kYXRhKTsKIApAQCAtNDQ0LDI3ICs0NTQsMjQgQEAKIAkqbWRldi0+dmRldiA9IGFpbV92aWRlb2Rldl90ZW1wbGF0ZTsKIAltZGV2LT52ZGV2LT52NGwyX2RldiA9ICZtZGV2LT52NGwyX2RldjsKIAltZGV2LT52ZGV2LT5sb2NrID0gJm1kZXYtPmxvY2s7Ci0Jc3RyY3B5KG1kZXYtPnZkZXYtPm5hbWUsICJtb3N0IHY0bDIgYWltIHZpZGVvIik7CisJc25wcmludGYobWRldi0+dmRldi0+bmFtZSwgc2l6ZW9mKG1kZXYtPnZkZXYtPm5hbWUpLCAiTU9TVDogJXMiLAorCQkgbWRldi0+djRsMl9kZXYubmFtZSk7CiAKIAkvKiBSZWdpc3RlciB0aGUgdjRsMiBkZXZpY2UgKi8KIAl2aWRlb19zZXRfZHJ2ZGF0YShtZGV2LT52ZGV2LCBtZGV2KTsKLQlyZXR2YWwgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UobWRldi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOwotCWlmIChyZXR2YWwgIT0gMCkgewotCQlwcl9lcnIoInZpZGVvX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQgKCVkKVxuIiwgcmV0dmFsKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBlcnJfdmJpX2RldjsKKwlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UobWRldi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOworCWlmIChyZXQpIHsKKwkJdjRsMl9lcnIoJm1kZXYtPnY0bDJfZGV2LCAidmlkZW9fcmVnaXN0ZXJfZGV2aWNlIGZhaWxlZCAoJWQpXG4iLAorCQkJIHJldCk7CisJCXZpZGVvX2RldmljZV9yZWxlYXNlKG1kZXYtPnZkZXYpOwogCX0KIAotCXJldHVybiAwOwotCi1lcnJfdmJpX2RldjoKLQl2aWRlb19kZXZpY2VfcmVsZWFzZShtZGV2LT52ZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBhaW1fdW5yZWdpc3Rlcl92aWRlb2RldihzdHJ1Y3QgbW9zdF92aWRlb19kZXYgKm1kZXYpCiB7Ci0JcHJfaW5mbygiYWltX3VucmVnaXN0ZXJfdmlkZW9kZXYoKVxuIik7CisJdjRsMl9pbmZvKCZtZGV2LT52NGwyX2RldiwgImFpbV91bnJlZ2lzdGVyX3ZpZGVvZGV2KClcbiIpOwogCiAJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UobWRldi0+dmRldik7CiB9CkBAIC00ODUsNyArNDkyLDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9IGdldF9haW1fZGV2KGlmYWNlLCBjaGFubmVsX2lkeCk7CiAKLQlwcl9pbmZvKCJhaW1fcHJvYmVfY2hhbm5lbCgpXG4iKTsKKwlwcl9pbmZvKCJhaW1fcHJvYmVfY2hhbm5lbCglcylcbiIsIG5hbWUpOwogCiAJaWYgKG1kZXYpIHsKIAkJcHJfZXJyKCJjaGFubmVsIGFscmVhZHkgbGlua2VkXG4iKTsKQEAgLTQ5OCw4ICs1MDUsOCBAQAogCX0KIAogCWlmIChjY2ZnLT5kYXRhX3R5cGUgIT0gTU9TVF9DSF9TWU5DICYmCi0JICAgIGNjZmctPmRhdGFfdHlwZSAhPSBNT1NUX0NIX0lTT0NfQVZQKSB7Ci0JCXByX2Vycigid3JvbmcgY2hhbm5lbCB0eXBlLCBleHBlY3Qgc3luYyBvciBpc29jX2F2cFxuIik7CisJICAgIGNjZmctPmRhdGFfdHlwZSAhPSBNT1NUX0NIX0lTT0MpIHsKKwkJcHJfZXJyKCJ3cm9uZyBjaGFubmVsIHR5cGUsIGV4cGVjdCBzeW5jIG9yIGlzb2NcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTUxNiw4ICs1MjMsNyBAQAogCW1kZXYtPnY0bDJfZGV2LnJlbGVhc2UgPSBhaW1fdjRsMl9kZXZfcmVsZWFzZTsKIAogCS8qIENyZWF0ZSB0aGUgdjRsMl9kZXZpY2UgKi8KLQlzdHJsY3B5KG1kZXYtPnY0bDJfZGV2Lm5hbWUsICJtb3N0X3ZpZGVvX2RldmljZSIsCi0JCXNpemVvZihtZGV2LT52NGwyX2Rldi5uYW1lKSk7CisJc3RybGNweShtZGV2LT52NGwyX2Rldi5uYW1lLCBuYW1lLCBzaXplb2YobWRldi0+djRsMl9kZXYubmFtZSkpOwogCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKE5VTEwsICZtZGV2LT52NGwyX2Rldik7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoInY0bDJfZGV2aWNlX3JlZ2lzdGVyKCkgZmFpbGVkXG4iKTsKQEAgLTUyOSw5ICs1MzUsMTAgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl91bnJlZzsKIAotCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZsaXN0X2xvY2spOwogCWxpc3RfYWRkKCZtZGV2LT5saXN0LCAmdmlkZW9fZGV2aWNlcyk7Ci0Jc3Bpbl91bmxvY2soJmxpc3RfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZsaXN0X2xvY2spOworCXY0bDJfaW5mbygmbWRldi0+djRsMl9kZXYsICJhaW1fcHJvYmVfY2hhbm5lbCgpIGRvbmVcbiIpOwogCXJldHVybiAwOwogCiBlcnJfdW5yZWc6CkBAIC01NDUsMTYgKzU1MiwxNiBAQAogewogCXN0cnVjdCBtb3N0X3ZpZGVvX2RldiAqbWRldiA9IGdldF9haW1fZGV2KGlmYWNlLCBjaGFubmVsX2lkeCk7CiAKLQlwcl9pbmZvKCJhaW1fZGlzY29ubmVjdF9jaGFubmVsKClcbiIpOwotCiAJaWYgKCFtZGV2KSB7CiAJCXByX2Vycigibm8gc3VjaCBjaGFubmVsIGlzIGxpbmtlZFxuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCXNwaW5fbG9jaygmbGlzdF9sb2NrKTsKKwl2NGwyX2luZm8oJm1kZXYtPnY0bDJfZGV2LCAiYWltX2Rpc2Nvbm5lY3RfY2hhbm5lbCgpXG4iKTsKKworCXNwaW5fbG9ja19pcnEoJmxpc3RfbG9jayk7CiAJbGlzdF9kZWwoJm1kZXYtPmxpc3QpOwotCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmbGlzdF9sb2NrKTsKIAogCWFpbV91bnJlZ2lzdGVyX3ZpZGVvZGV2KG1kZXYpOwogCXY0bDJfZGV2aWNlX2Rpc2Nvbm5lY3QoJm1kZXYtPnY0bDJfZGV2KTsKQEAgLTU4NSwxNyArNTkyLDE3IEBACiAJICogd2Ugc2ltdWxhdGUgdGhpcyBjYWxsIGhlcmUuCiAJICogVGhpcyBtdXN0IGJlIGZpeGVkIGluIGNvcmUuCiAJICovCi0Jc3Bpbl9sb2NrKCZsaXN0X2xvY2spOworCXNwaW5fbG9ja19pcnEoJmxpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1kZXYsIHRtcCwgJnZpZGVvX2RldmljZXMsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJm1kZXYtPmxpc3QpOwotCQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZsaXN0X2xvY2spOwogCiAJCWFpbV91bnJlZ2lzdGVyX3ZpZGVvZGV2KG1kZXYpOwogCQl2NGwyX2RldmljZV9kaXNjb25uZWN0KCZtZGV2LT52NGwyX2Rldik7CiAJCXY0bDJfZGV2aWNlX3B1dCgmbWRldi0+djRsMl9kZXYpOwotCQlzcGluX2xvY2soJmxpc3RfbG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmxpc3RfbG9jayk7CiAJfQotCXNwaW5fdW5sb2NrKCZsaXN0X2xvY2spOworCXNwaW5fdW5sb2NrX2lycSgmbGlzdF9sb2NrKTsKIAogCW1vc3RfZGVyZWdpc3Rlcl9haW0oJmFpbV9pbmZvKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJnZpZGVvX2RldmljZXMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGFsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hhbC5jCmluZGV4IDNjNTI0NTAuLjBiOTgxNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGFsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9oYWwuYwpAQCAtMiw3ICsyLDcgQEAKICAqIGRpbTJfaGFsLmMgLSBESU0yIEhBTCBpbXBsZW1lbnRhdGlvbgogICogKE1lZGlhTEIsIERldmljZSBJbnRlcmZhY2UgTWFjcm8gSVAsIE9TNjI0MjApCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDE1LCBNaWNyb2NoaXAgVGVjaG5vbG9neSBHZXJtYW55IElJIEdtYkggJiBDby4gS0cKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2LCBNaWNyb2NoaXAgVGVjaG5vbG9neSBHZXJtYW55IElJIEdtYkggJiBDby4gS0cKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCkBAIC0yMCwxOCArMjAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogCiAvKgotICogVGhlIG51bWJlciBvZiBmcmFtZXMgcGVyIHN1Yi1idWZmZXIgZm9yIHN5bmNocm9ub3VzIGNoYW5uZWxzLgotICogQWxsb3dlZCB2YWx1ZXM6IDEsIDIsIDQsIDgsIDE2LCAzMiwgNjQuCi0gKi8KLSNkZWZpbmUgRlJBTUVTX1BFUl9TVUJCVUZGIDE2Ci0KLS8qCi0gKiBTaXplIGZhY3RvciBmb3Igc3luY2hyb25vdXMgREJSIGJ1ZmZlci4KLSAqIE1pbmltYWwgdmFsdWUgaXMgNCpGUkFNRVNfUEVSX1NVQkJVRkYuCi0gKi8KLSNkZWZpbmUgU1lOQ19EQlJfRkFDVE9SICg0dSAqICh1MTYpRlJBTUVTX1BFUl9TVUJCVUZGKQotCi0vKgogICogU2l6ZSBmYWN0b3IgZm9yIGlzb2Nocm9ub3VzIERCUiBidWZmZXIuCiAgKiBNaW5pbWFsIHZhbHVlIGlzIDMuCiAgKi8KQEAgLTYxLDEyICs0OSwxMSBAQAogI2RlZmluZSBEQlJfU0laRSAgKDE2ICogMTAyNCkgLyogc3BlY2lmaWVkIGJ5IElQICovCiAjZGVmaW5lIERCUl9CTE9DS19TSVpFICAoREJSX1NJWkUgLyAzMiAvIERCUl9NQVBfU0laRSkKIAorI2RlZmluZSBST1VORF9VUF9UTyh4LCBkKSAgKCgoeCkgKyAoZCkgLSAxKSAvIChkKSAqIChkKSkKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGdlbmVyaWMgaGVscGVyIGZ1bmN0aW9ucyBhbmQgbWFjcm9zICovCiAKLSNkZWZpbmUgTUxCQzBfRkNOVF9WQUxfTUFDUk8obikgTUxCQzBfRkNOVF9WQUxfICMjIG4gIyMgRlBTQgotI2RlZmluZSBNTEJDMF9GQ05UX1ZBTChmcHNiKSBNTEJDMF9GQ05UX1ZBTF9NQUNSTyhmcHNiKQotCiBzdGF0aWMgaW5saW5lIHUzMiBiaXRfbWFzayh1OCBwb3NpdGlvbikKIHsKIAlyZXR1cm4gKHUzMikxIDw8IHBvc2l0aW9uOwpAQCAtODEsMTAgKzY4LDIwIEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogdHlwZXMgYW5kIGxvY2FsIHZhcmlhYmxlcyAqLwogCitzdHJ1Y3QgYXN5bmNfdHhfZGJyIHsKKwl1OCBjaF9hZGRyOworCXUxNiBycGM7CisJdTE2IHdwYzsKKwl1MTYgcmVzdF9zaXplOworCXUxNiBzel9xdWV1ZVtDRFQwX1JQQ19NQVNLICsgMV07Cit9OworCiBzdHJ1Y3QgbGxkX2dsb2JhbF92YXJzX3QgewogCWJvb2wgZGltX2lzX2luaXRpYWxpemVkOwogCWJvb2wgbWNtX2lzX2luaXRpYWxpemVkOwogCXN0cnVjdCBkaW0yX3JlZ3MgX19pb21lbSAqZGltMjsgLyogRElNMiBjb3JlIGJhc2UgYWRkcmVzcyAqLworCXN0cnVjdCBhc3luY190eF9kYnIgYXR4X2RicjsKKwl1MzIgZmNudDsKIAl1MzIgZGJyX21hcFtEQlJfTUFQX1NJWkVdOwogfTsKIApAQCAtMTQ5LDE1ICsxNDYsMzQgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHUzMiBkaW0yX3JlYWRfY3RyKHUzMiBjdHJfYWRkciwgdTE2IG1kYXRfaWR4KQorc3RhdGljIHZvaWQgZGltMl90cmFuc2Zlcl9tYWRyKHUzMiB2YWwpCiB7Ci0JZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TUFEUiwgY3RyX2FkZHIpOworCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1BRFIsIHZhbCk7CiAKLQkvKiB3YWl0IHRpbGwgdHJhbnNmZXIgaXMgY29tcGxldGVkICovCisJLyogd2FpdCBmb3IgdHJhbnNmZXIgY29tcGxldGlvbiAqLwogCXdoaWxlICgoZGltY2JfaW9fcmVhZCgmZy5kaW0yLT5NQ1RMKSAmIDEpICE9IDEpCiAJCWNvbnRpbnVlOwogCiAJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TUNUTCwgMCk7ICAgLyogY2xlYXIgdHJhbnNmZXIgY29tcGxldGUgKi8KK30KKworc3RhdGljIHZvaWQgZGltMl9jbGVhcl9kYnIodTE2IGFkZHIsIHUxNiBzaXplKQoreworCWVudW0geyBNQURSX1RCX0JJVCA9IDMwLCBNQURSX1dOUl9CSVQgPSAzMSB9OworCisJdTE2IGNvbnN0IGVuZF9hZGRyID0gYWRkciArIHNpemU7CisJdTMyIGNvbnN0IGNtZCA9IGJpdF9tYXNrKE1BRFJfV05SX0JJVCkgfCBiaXRfbWFzayhNQURSX1RCX0JJVCk7CisKKwlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NQ1RMLCAwKTsgICAvKiBjbGVhciB0cmFuc2ZlciBjb21wbGV0ZSAqLworCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1EQVQwLCAwKTsKKworCWZvciAoOyBhZGRyIDwgZW5kX2FkZHI7IGFkZHIrKykKKwkJZGltMl90cmFuc2Zlcl9tYWRyKGNtZCB8IGFkZHIpOworfQorCitzdGF0aWMgdTMyIGRpbTJfcmVhZF9jdHIodTMyIGN0cl9hZGRyLCB1MTYgbWRhdF9pZHgpCit7CisJZGltMl90cmFuc2Zlcl9tYWRyKGN0cl9hZGRyKTsKIAogCXJldHVybiBkaW1jYl9pb19yZWFkKCgmZy5kaW0yLT5NREFUMCkgKyBtZGF0X2lkeCk7CiB9CkBAIC0xODIsMTMgKzE5OCw3IEBACiAJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TURXRTIsIG1hc2tbMl0pOwogCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1EV0UzLCBtYXNrWzNdKTsKIAotCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1BRFIsIGJpdF9tYXNrKE1BRFJfV05SX0JJVCkgfCBjdHJfYWRkcik7Ci0KLQkvKiB3YWl0IHRpbGwgdHJhbnNmZXIgaXMgY29tcGxldGVkICovCi0Jd2hpbGUgKChkaW1jYl9pb19yZWFkKCZnLmRpbTItPk1DVEwpICYgMSkgIT0gMSkKLQkJY29udGludWU7Ci0KLQlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NQ1RMLCAwKTsgICAvKiBjbGVhciB0cmFuc2ZlciBjb21wbGV0ZSAqLworCWRpbTJfdHJhbnNmZXJfbWFkcihiaXRfbWFzayhNQURSX1dOUl9CSVQpIHwgY3RyX2FkZHIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGltMl93cml0ZV9jdHIodTMyIGN0cl9hZGRyLCBjb25zdCB1MzIgKnZhbHVlKQpAQCAtMjUyLDYgKzI2MiwxMyBAQAogCWRpbTJfd3JpdGVfY3RyKENEVCArIGNoX2FkZHIsIGNkdCk7CiB9CiAKK3N0YXRpYyB1MTYgZGltMl9ycGModTggY2hfYWRkcikKK3sKKwl1MzIgY2R0MCA9IGRpbTJfcmVhZF9jdHIoQ0RUICsgY2hfYWRkciwgMCk7CisKKwlyZXR1cm4gKGNkdDAgPj4gQ0RUMF9SUENfU0hJRlQpICYgQ0RUMF9SUENfTUFTSzsKK30KKwogc3RhdGljIHZvaWQgZGltMl9jbGVhcl9jZHQodTggY2hfYWRkcikKIHsKIAl1MzIgY2R0WzRdID0geyAwLCAwLCAwLCAwIH07CkBAIC0zNTYsNiArMzczLDUyIEBACiAKIAlkaW0yX2NsZWFyX2NhdChNTEJfQ0FULCBjaF9hZGRyKTsKIAlkaW0yX2NsZWFyX2NkdChjaF9hZGRyKTsKKworCS8qIGNsZWFyIGNoYW5uZWwgc3RhdHVzIGJpdCAqLworCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPkFDU1IwLCBiaXRfbWFzayhjaF9hZGRyKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiB0cmFjZSBhc3luYyB0eCBkYnIgZmlsbCBzdGF0ZSAqLworCitzdGF0aWMgaW5saW5lIHUxNiBub3JtX3BjKHUxNiBwYykKK3sKKwlyZXR1cm4gcGMgJiBDRFQwX1JQQ19NQVNLOworfQorCitzdGF0aWMgdm9pZCBkYnJjbnRfaW5pdCh1OCBjaF9hZGRyLCB1MTYgZGJyX3NpemUpCit7CisJZy5hdHhfZGJyLnJlc3Rfc2l6ZSA9IGRicl9zaXplOworCWcuYXR4X2Rici5ycGMgPSBkaW0yX3JwYyhjaF9hZGRyKTsKKwlnLmF0eF9kYnIud3BjID0gZy5hdHhfZGJyLnJwYzsKK30KKworc3RhdGljIHZvaWQgZGJyY250X2VucShpbnQgYnVmX3N6KQoreworCWcuYXR4X2Rici5yZXN0X3NpemUgLT0gYnVmX3N6OworCWcuYXR4X2Rici5zel9xdWV1ZVtub3JtX3BjKGcuYXR4X2Rici53cGMpXSA9IGJ1Zl9zejsKKwlnLmF0eF9kYnIud3BjKys7Cit9CisKK3UxNiBkaW1fZGJyX3NwYWNlKHN0cnVjdCBkaW1fY2hhbm5lbCAqY2gpCit7CisJdTE2IGN1cl9ycGM7CisJc3RydWN0IGFzeW5jX3R4X2RiciAqZGJyID0gJmcuYXR4X2RicjsKKworCWlmIChjaC0+YWRkciAhPSBkYnItPmNoX2FkZHIpCisJCXJldHVybiAweEZGRkY7CisKKwljdXJfcnBjID0gZGltMl9ycGMoY2gtPmFkZHIpOworCisJd2hpbGUgKG5vcm1fcGMoZGJyLT5ycGMpICE9IGN1cl9ycGMpIHsKKwkJZGJyLT5yZXN0X3NpemUgKz0gZGJyLT5zel9xdWV1ZVtub3JtX3BjKGRici0+cnBjKV07CisJCWRici0+cnBjKys7CisJfQorCisJaWYgKCh1MTYpKGRici0+d3BjIC0gZGJyLT5ycGMpID49IENEVDBfUlBDX01BU0spCisJCXJldHVybiAwOworCisJcmV0dXJuIGRici0+cmVzdF9zaXplOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzk4LDcgKzQ2MSw4IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBjaGVja19ieXRlc19wZXJfZnJhbWUodTMyIGJ5dGVzX3Blcl9mcmFtZSkKIHsKLQl1MTYgY29uc3QgbWF4X3NpemUgPSAoKHUxNilDRFQzX0JEX01BU0sgKyAxdSkgLyBTWU5DX0RCUl9GQUNUT1I7CisJdTE2IGNvbnN0IGJkX2ZhY3RvciA9IGcuZmNudCArIDI7CisJdTE2IGNvbnN0IG1heF9zaXplID0gKCh1MTYpQ0RUM19CRF9NQVNLICsgMXUpID4+IGJkX2ZhY3RvcjsKIAogCWlmIChieXRlc19wZXJfZnJhbWUgPD0gMCkKIAkJcmV0dXJuIGZhbHNlOyAvKiB0b28gc21hbGwgKi8KQEAgLTQzOSw3ICs1MDMsNyBAQAogewogCXUxNiBuOwogCXUxNiBjb25zdCBtYXhfc2l6ZSA9ICh1MTYpQURUMV9JU09DX1NZTkNfQkRfTUFTSyArIDF1OwotCXUzMiBjb25zdCB1bml0ID0gYnl0ZXNfcGVyX2ZyYW1lICogKHUxNilGUkFNRVNfUEVSX1NVQkJVRkY7CisJdTMyIGNvbnN0IHVuaXQgPSBieXRlc19wZXJfZnJhbWUgPDwgZy5mY250OwogCiAJaWYgKGJ1Zl9zaXplID4gbWF4X3NpemUpCiAJCWJ1Zl9zaXplID0gbWF4X3NpemU7CkBAIC00NzksNyArNTQzLDcgQEAKIAlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NTEJDMCwKIAkJICAgICAgIGVuYWJsZV82cGluIDw8IE1MQkMwX01MQlBFTl9CSVQgfAogCQkgICAgICAgbWxiX2Nsb2NrIDw8IE1MQkMwX01MQkNMS19TSElGVCB8Ci0JCSAgICAgICBNTEJDMF9GQ05UX1ZBTChGUkFNRVNfUEVSX1NVQkJVRkYpIDw8IE1MQkMwX0ZDTlRfU0hJRlQgfAorCQkgICAgICAgZy5mY250IDw8IE1MQkMwX0ZDTlRfU0hJRlQgfAogCQkgICAgICAgdHJ1ZSA8PCBNTEJDMF9NTEJFTl9CSVQpOwogCiAJLyogYWN0aXZhdGUgYWxsIEhCSSBjaGFubmVscyAqLwpAQCAtNTE1LDIwICs1NzksMTcgQEAKIHsKIAl1OCBjb25zdCBzaGlmdCA9IGlkeCAqIDE2OwogCXUzMiBjb25zdCBhZHQxID0gZGltMl9yZWFkX2N0cihBRFQgKyBjaF9hZGRyLCAxKTsKKwl1MzIgbWFza1s0XSA9IHsgMCwgMCwgMCwgMCB9OworCXUzMiBhZHRfd1s0XSA9IHsgMCwgMCwgMCwgMCB9OwogCiAJaWYgKCgoYWR0MSA+PiAoQURUMV9ETkVfQklUICsgc2hpZnQpKSAmIDEpID09IDApCiAJCXJldHVybiBmYWxzZTsKIAotCXsKLQkJdTMyIG1hc2tbNF0gPSB7IDAsIDAsIDAsIDAgfTsKLQkJdTMyIGFkdF93WzRdID0geyAwLCAwLCAwLCAwIH07Ci0KLQkJbWFza1sxXSA9Ci0JCQliaXRfbWFzayhBRFQxX0RORV9CSVQgKyBzaGlmdCkgfAotCQkJYml0X21hc2soQURUMV9FUlJfQklUICsgc2hpZnQpIHwKLQkJCWJpdF9tYXNrKEFEVDFfUkRZX0JJVCArIHNoaWZ0KTsKLQkJZGltMl93cml0ZV9jdHJfbWFzayhBRFQgKyBjaF9hZGRyLCBtYXNrLCBhZHRfdyk7Ci0JfQorCW1hc2tbMV0gPQorCQliaXRfbWFzayhBRFQxX0RORV9CSVQgKyBzaGlmdCkgfAorCQliaXRfbWFzayhBRFQxX0VSUl9CSVQgKyBzaGlmdCkgfAorCQliaXRfbWFzayhBRFQxX1JEWV9CSVQgKyBzaGlmdCk7CisJZGltMl93cml0ZV9jdHJfbWFzayhBRFQgKyBjaF9hZGRyLCBtYXNrLCBhZHRfdyk7CiAKIAkvKiBjbGVhciBjaGFubmVsIHN0YXR1cyBiaXQgKi8KIAlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5BQ1NSMCwgYml0X21hc2soY2hfYWRkcikpOwpAQCAtNjEyLDYgKzY3Myw5IEBACiAKIAkrK3N0YXRlLT5sZXZlbDsKIAorCWlmIChjaC0+YWRkciA9PSBnLmF0eF9kYnIuY2hfYWRkcikKKwkJZGJyY250X2VucShidWZfc2l6ZSk7CisKIAlpZiAoY2gtPnBhY2tldF9sZW5ndGggfHwgY2gtPmJ5dGVzX3Blcl9mcmFtZSkKIAkJZGltMl9zdGFydF9pc29jX3N5bmMoY2gtPmFkZHIsIHN0YXRlLT5pZHgxLCBidWZfYWRkciwgYnVmX3NpemUpOwogCWVsc2UKQEAgLTY1MCw3ICs3MTQsOCBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIEFQSSAqLwogCi11OCBkaW1fc3RhcnR1cChzdHJ1Y3QgZGltMl9yZWdzIF9faW9tZW0gKmRpbV9iYXNlX2FkZHJlc3MsIHUzMiBtbGJfY2xvY2spCit1OCBkaW1fc3RhcnR1cChzdHJ1Y3QgZGltMl9yZWdzIF9faW9tZW0gKmRpbV9iYXNlX2FkZHJlc3MsIHUzMiBtbGJfY2xvY2ssCisJICAgICAgIHUzMiBmY250KQogewogCWcuZGltX2lzX2luaXRpYWxpemVkID0gZmFsc2U7CiAKQEAgLTY2Miw3ICs3MjcsMTEgQEAKIAlpZiAobWxiX2Nsb2NrID49IDgpCiAJCXJldHVybiBESU1fSU5JVF9FUlJfTUxCX0NMT0NLOwogCisJaWYgKGZjbnQgPiBNTEJDMF9GQ05UX01BWF9WQUwpCisJCXJldHVybiBESU1fSU5JVF9FUlJfTUxCX0NMT0NLOworCiAJZy5kaW0yID0gZGltX2Jhc2VfYWRkcmVzczsKKwlnLmZjbnQgPSBmY250OwogCWcuZGJyX21hcFswXSA9IDA7CiAJZy5kYnJfbWFwWzFdID0gMDsKIApAQCAtNjkzLDcgKzc2Miw3IEBACiAJaWYgKCFjaGVja19jaGFubmVsX2FkZHJlc3MoY2hfYWRkcmVzcykpCiAJCXJldHVybiBESU1fSU5JVF9FUlJfQ0hBTk5FTF9BRERSRVNTOwogCi0JY2gtPmRicl9zaXplID0gaHdfYnVmZmVyX3NpemU7CisJY2gtPmRicl9zaXplID0gUk9VTkRfVVBfVE8oaHdfYnVmZmVyX3NpemUsIERCUl9CTE9DS19TSVpFKTsKIAljaC0+ZGJyX2FkZHIgPSBhbGxvY19kYnIoY2gtPmRicl9zaXplKTsKIAlpZiAoY2gtPmRicl9hZGRyID49IERCUl9TSVpFKQogCQlyZXR1cm4gRElNX0lOSVRfRVJSX09VVF9PRl9NRU1PUlk7CkBAIC03MDYsNiArNzc1LDEyIEBACiAJcmV0dXJuIERJTV9OT19FUlJPUjsKIH0KIAordm9pZCBkaW1fc2VydmljZV9tbGJfaW50X2lycSh2b2lkKQoreworCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1TMCwgMCk7CisJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TVMxLCAwKTsKK30KKwogdTE2IGRpbV9ub3JtX2N0cmxfYXN5bmNfYnVmZmVyX3NpemUodTE2IGJ1Zl9zaXplKQogewogCXJldHVybiBub3JtX2N0cmxfYXN5bmNfYnVmZmVyX3NpemUoYnVmX3NpemUpOwpAQCAtNzQ5LDggKzgyNCwxNiBAQAogdTggZGltX2luaXRfYXN5bmMoc3RydWN0IGRpbV9jaGFubmVsICpjaCwgdTggaXNfdHgsIHUxNiBjaF9hZGRyZXNzLAogCQkgIHUxNiBtYXhfYnVmZmVyX3NpemUpCiB7Ci0JcmV0dXJuIGluaXRfY3RybF9hc3luYyhjaCwgQ0FUX0NUX1ZBTF9BU1lOQywgaXNfdHgsIGNoX2FkZHJlc3MsCi0JCQkgICAgICAgbWF4X2J1ZmZlcl9zaXplKTsKKwl1OCByZXQgPSBpbml0X2N0cmxfYXN5bmMoY2gsIENBVF9DVF9WQUxfQVNZTkMsIGlzX3R4LCBjaF9hZGRyZXNzLAorCQkJCSBtYXhfYnVmZmVyX3NpemUpOworCisJaWYgKGlzX3R4ICYmICFnLmF0eF9kYnIuY2hfYWRkcikgeworCQlnLmF0eF9kYnIuY2hfYWRkciA9IGNoLT5hZGRyOworCQlkYnJjbnRfaW5pdChjaC0+YWRkciwgY2gtPmRicl9zaXplKTsKKwkJZGltY2JfaW9fd3JpdGUoJmcuZGltMi0+TUlFTiwgYml0X21hc2soMjApKTsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogCiB1OCBkaW1faW5pdF9pc29jKHN0cnVjdCBkaW1fY2hhbm5lbCAqY2gsIHU4IGlzX3R4LCB1MTYgY2hfYWRkcmVzcywKQEAgLTc4MSw2ICs4NjQsOCBAQAogdTggZGltX2luaXRfc3luYyhzdHJ1Y3QgZGltX2NoYW5uZWwgKmNoLCB1OCBpc190eCwgdTE2IGNoX2FkZHJlc3MsCiAJCSB1MTYgYnl0ZXNfcGVyX2ZyYW1lKQogeworCXUxNiBiZF9mYWN0b3IgPSBnLmZjbnQgKyAyOworCiAJaWYgKCFnLmRpbV9pc19pbml0aWFsaXplZCB8fCAhY2gpCiAJCXJldHVybiBESU1fRVJSX0RSSVZFUl9OT1RfSU5JVElBTElaRUQ7CiAKQEAgLTc5MCwxMyArODc1LDE0IEBACiAJaWYgKCFjaGVja19ieXRlc19wZXJfZnJhbWUoYnl0ZXNfcGVyX2ZyYW1lKSkKIAkJcmV0dXJuIERJTV9FUlJfQkFEX0NPTkZJRzsKIAotCWNoLT5kYnJfc2l6ZSA9IGJ5dGVzX3Blcl9mcmFtZSAqIFNZTkNfREJSX0ZBQ1RPUjsKKwljaC0+ZGJyX3NpemUgPSBieXRlc19wZXJfZnJhbWUgPDwgYmRfZmFjdG9yOwogCWNoLT5kYnJfYWRkciA9IGFsbG9jX2RicihjaC0+ZGJyX3NpemUpOwogCWlmIChjaC0+ZGJyX2FkZHIgPj0gREJSX1NJWkUpCiAJCXJldHVybiBESU1fSU5JVF9FUlJfT1VUX09GX01FTU9SWTsKIAogCXN5bmNfaW5pdChjaCwgY2hfYWRkcmVzcyAvIDIsIGJ5dGVzX3Blcl9mcmFtZSk7CiAKKwlkaW0yX2NsZWFyX2RicihjaC0+ZGJyX2FkZHIsIGNoLT5kYnJfc2l6ZSk7CiAJZGltMl9jb25maWd1cmVfY2hhbm5lbChjaC0+YWRkciwgQ0FUX0NUX1ZBTF9TWU5DLCBpc190eCwKIAkJCSAgICAgICBjaC0+ZGJyX2FkZHIsIGNoLT5kYnJfc2l6ZSwgMCwgdHJ1ZSk7CiAKQEAgLTgwOCw2ICs4OTQsMTEgQEAKIAlpZiAoIWcuZGltX2lzX2luaXRpYWxpemVkIHx8ICFjaCkKIAkJcmV0dXJuIERJTV9FUlJfRFJJVkVSX05PVF9JTklUSUFMSVpFRDsKIAorCWlmIChjaC0+YWRkciA9PSBnLmF0eF9kYnIuY2hfYWRkcikgeworCQlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NSUVOLCAwKTsKKwkJZy5hdHhfZGJyLmNoX2FkZHIgPSAwOworCX0KKwogCWRpbTJfY2xlYXJfY2hhbm5lbChjaC0+YWRkcik7CiAJaWYgKGNoLT5kYnJfYWRkciA8IERCUl9TSVpFKQogCQlmcmVlX2RicihjaC0+ZGJyX2FkZHIsIGNoLT5kYnJfc2l6ZSk7CkBAIC04MTYsNyArOTA3LDcgQEAKIAlyZXR1cm4gRElNX05PX0VSUk9SOwogfQogCi12b2lkIGRpbV9zZXJ2aWNlX2lycShzdHJ1Y3QgZGltX2NoYW5uZWwgKmNvbnN0ICpjaGFubmVscykKK3ZvaWQgZGltX3NlcnZpY2VfYWhiX2ludF9pcnEoc3RydWN0IGRpbV9jaGFubmVsICpjb25zdCAqY2hhbm5lbHMpCiB7CiAJYm9vbCBzdGF0ZV9jaGFuZ2VkOwogCkBAIC04NDgsMTAgKzkzOSw2IEBACiAJCQkrK2NoOwogCQl9CiAJfSB3aGlsZSAoc3RhdGVfY2hhbmdlZCk7Ci0KLQkvKiBjbGVhciBwZW5kaW5nIEludGVycnVwdHMgKi8KLQlkaW1jYl9pb193cml0ZSgmZy5kaW0yLT5NUzAsIDApOwotCWRpbWNiX2lvX3dyaXRlKCZnLmRpbTItPk1TMSwgMCk7CiB9CiAKIHU4IGRpbV9zZXJ2aWNlX2NoYW5uZWwoc3RydWN0IGRpbV9jaGFubmVsICpjaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hhbC5oCmluZGV4IDFjOTI0ZTguLjZkZjZlYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9oYWwuaApAQCAtNjAsNyArNjAsOCBAQAogCXUxNiBkb25lX3N3X2J1ZmZlcnNfbnVtYmVyOyAvKjwgRG9uZSBzb2Z0d2FyZSBidWZmZXJzIG51bWJlci4gKi8KIH07CiAKLXU4IGRpbV9zdGFydHVwKHN0cnVjdCBkaW0yX3JlZ3MgX19pb21lbSAqZGltX2Jhc2VfYWRkcmVzcywgdTMyIG1sYl9jbG9jayk7Cit1OCBkaW1fc3RhcnR1cChzdHJ1Y3QgZGltMl9yZWdzIF9faW9tZW0gKmRpbV9iYXNlX2FkZHJlc3MsIHUzMiBtbGJfY2xvY2ssCisJICAgICAgIHUzMiBmY250KTsKIAogdm9pZCBkaW1fc2h1dGRvd24odm9pZCk7CiAKQEAgLTg2LDEzICs4NywxNyBAQAogCiB1OCBkaW1fZGVzdHJveV9jaGFubmVsKHN0cnVjdCBkaW1fY2hhbm5lbCAqY2gpOwogCi12b2lkIGRpbV9zZXJ2aWNlX2lycShzdHJ1Y3QgZGltX2NoYW5uZWwgKmNvbnN0ICpjaGFubmVscyk7Cit2b2lkIGRpbV9zZXJ2aWNlX21sYl9pbnRfaXJxKHZvaWQpOworCit2b2lkIGRpbV9zZXJ2aWNlX2FoYl9pbnRfaXJxKHN0cnVjdCBkaW1fY2hhbm5lbCAqY29uc3QgKmNoYW5uZWxzKTsKIAogdTggZGltX3NlcnZpY2VfY2hhbm5lbChzdHJ1Y3QgZGltX2NoYW5uZWwgKmNoKTsKIAogc3RydWN0IGRpbV9jaF9zdGF0ZV90ICpkaW1fZ2V0X2NoYW5uZWxfc3RhdGUoc3RydWN0IGRpbV9jaGFubmVsICpjaCwKIAkJCQkJICAgICBzdHJ1Y3QgZGltX2NoX3N0YXRlX3QgKnN0YXRlX3B0cik7CiAKK3UxNiBkaW1fZGJyX3NwYWNlKHN0cnVjdCBkaW1fY2hhbm5lbCAqY2gpOworCiBib29sIGRpbV9lbnF1ZXVlX2J1ZmZlcihzdHJ1Y3QgZGltX2NoYW5uZWwgKmNoLCB1MzIgYnVmZmVyX2FkZHIsCiAJCQl1MTYgYnVmZmVyX3NpemUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hkbS5jIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9oZG0uYwppbmRleCBhMzY0NDk1Li43OGIyYzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX2hkbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfaGRtLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogZGltMl9oZG0uYyAtIE1lZGlhTEIgRElNMiBIYXJkd2FyZSBEZXBlbmRlbnQgTW9kdWxlCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDE1LCBNaWNyb2NoaXAgVGVjaG5vbG9neSBHZXJtYW55IElJIEdtYkggJiBDby4gS0cKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2LCBNaWNyb2NoaXAgVGVjaG5vbG9neSBHZXJtYW55IElJIEdtYkggJiBDby4gS0cKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCkBAIC00NSwxNSArNDUsMTUgQEAKIE1PRFVMRV9QQVJNX0RFU0MoY2xvY2tfc3BlZWQsICJNZWRpYUxCIENsb2NrIFNwZWVkIik7CiAKIC8qCi0gKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICogVGhlIHBhcmFtZXRlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBmcmFtZXMgcGVyIHN1Yi1idWZmZXIgZm9yCisgKiBzeW5jaHJvbm91cyBjaGFubmVscy4gIFZhbGlkIHZhbHVlczogWzAgLi4gNl0uCiAgKgotICogVGhlIGRlZmluZSBiZWxvdyBhY3RpdmF0ZXMgYW4gdXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IEhBTC1zaW11Ci0gKiBmb3IgY2FsbGluZyBESU0gaW50ZXJydXB0IGhhbmRsZXIuCi0gKiBJdCBpcyB1c2VkIG9ubHkgZm9yIFRFU1QgUFVSUE9TRSBhbmQgc2hhbGwgYmUgY29tbWVudGVkIGJlZm9yZSByZWxlYXNlLgotICoKLSAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgKiBUaGUgdmFsdWVzIDAsIDEsIDIsIDMsIDQsIDUsIDYgcmVwcmVzZW50IGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIGZyYW1lcyBwZXIKKyAqIHN1Yi1idWZmZXIgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NC4KICAqLwotLyogI2RlZmluZSBFTkFCTEVfSERNX1RFU1QgKi8KK3N0YXRpYyB1OCBmY250ID0gNDsgIC8qICgxIDw8IGZjbnQpIGZyYW1lcyBwZXIgc3ViYnVmZmVyICovCittb2R1bGVfcGFyYW0oZmNudCwgYnl0ZSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZjbnQsICJOdW0gb2YgZnJhbWVzIHBlciBzdWItYnVmZmVyIGZvciBzeW5jIGNoYW5uZWxzIGFzIGEgcG93ZXIgb2YgMiIpOwogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRpbV9sb2NrKTsKIApAQCAtODUsNyArODUsNiBAQAogICogQG1vc3RfaWZhY2U6IG1vc3QgaW50ZXJmYWNlIHN0cnVjdHVyZQogICogQGNhcGFiaWxpdGllczogYW4gYXJyYXkgb2YgY2hhbm5lbCBjYXBhYmlsaXR5IGRhdGEKICAqIEBpb19iYXNlOiBJL08gcmVnaXN0ZXIgYmFzZSBhZGRyZXNzCi0gKiBAaXJxX2FoYjA6IGRpbTIgQUhCMCBpcnEgbnVtYmVyCiAgKiBAY2xrX3NwZWVkOiB1c2VyIHNlbGVjdGFibGUgKHRocm91Z2ggY29tbWFuZCBsaW5lIHBhcmFtZXRlcikgY2xvY2sgc3BlZWQKICAqIEBuZXRpbmZvX3Rhc2s6IHRocmVhZCB0byBkZWxpdmVyIG5ldHdvcmsgc3RhdHVzCiAgKiBAbmV0aW5mb193YWl0cTogd2FpdHEgZm9yIHRoZSB0aHJlYWQgdG8gc2xlZXAKQEAgLTEwMCw3ICs5OSw2IEBACiAJc3RydWN0IG1vc3RfaW50ZXJmYWNlIG1vc3RfaWZhY2U7CiAJY2hhciBuYW1lWzE2ICsgc2l6ZW9mICJkaW0yLSJdOwogCXZvaWQgX19pb21lbSAqaW9fYmFzZTsKLQl1bnNpZ25lZCBpbnQgaXJxX2FoYjA7CiAJaW50IGNsa19zcGVlZDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldGluZm9fdGFzazsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBuZXRpbmZvX3dhaXRxOwpAQCAtMTE4LDEwICsxMTYsNiBAQAogCSgoKHApWzFdID09IDB4MTgpICYmICgocClbMl0gPT0gMHgwNSkgJiYgKChwKVszXSA9PSAweDBDKSAmJiBcCiAJICgocClbMTNdID09IDB4M0MpICYmICgocClbMTRdID09IDB4MDApICYmICgocClbMTVdID09IDB4MEEpKQogCi0jaWYgZGVmaW5lZChFTkFCTEVfSERNX1RFU1QpCi1zdGF0aWMgc3RydWN0IGRpbTJfaGRtICp0ZXN0X2RldjsKLSNlbmRpZgotCiBib29sIGRpbTJfc3lzZnNfZ2V0X3N0YXRlX2NiKHZvaWQpCiB7CiAJYm9vbCBzdGF0ZTsKQEAgLTIxMiw3ICsyMDYsOCBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQloYWxfcmV0ID0gZGltX3N0YXJ0dXAoZGV2LT5pb19iYXNlLCBkZXYtPmNsa19zcGVlZCk7CisJcHJfaW5mbygic3luYzogbnVtIG9mIGZyYW1lcyBwZXIgc3ViLWJ1ZmZlcjogJXVcbiIsIGZjbnQpOworCWhhbF9yZXQgPSBkaW1fc3RhcnR1cChkZXYtPmlvX2Jhc2UsIGRldi0+Y2xrX3NwZWVkLCBmY250KTsKIAlpZiAoaGFsX3JldCAhPSBESU1fTk9fRVJST1IpIHsKIAkJcHJfZXJyKCJkaW1fc3RhcnR1cCBmYWlsZWQ6ICVkXG4iLCBoYWxfcmV0KTsKIAkJaWYgKHBkYXRhICYmIHBkYXRhLT5kZXN0cm95KQpAQCAtMjU0LDYgKzI0OSwxMSBAQAogCW1ibyA9IGxpc3RfZmlyc3RfZW50cnkoaGVhZCwgc3RydWN0IG1ibywgbGlzdCk7CiAJYnVmX3NpemUgPSBtYm8tPmJ1ZmZlcl9sZW5ndGg7CiAKKwlpZiAoZGltX2Ricl9zcGFjZSgmaGRtX2NoLT5jaCkgPCBidWZfc2l6ZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW1fbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKIAlCVUdfT04obWJvLT5idXNfYWRkcmVzcyA9PSAwKTsKIAlpZiAoIWRpbV9lbnF1ZXVlX2J1ZmZlcigmaGRtX2NoLT5jaCwgbWJvLT5idXNfYWRkcmVzcywgYnVmX3NpemUpKSB7CiAJCWxpc3RfZGVsKGhlYWQtPm5leHQpOwpAQCAtNDExLDYgKzQxMSwyMiBAQAogCXJldHVybiBidWZmZXI7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBkaW0yX21sYl9pc3IoaW50IGlycSwgdm9pZCAqX2RldikKK3sKKwlzdHJ1Y3QgZGltMl9oZG0gKmRldiA9IF9kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkaW1fbG9jaywgZmxhZ3MpOworCWRpbV9zZXJ2aWNlX21sYl9pbnRfaXJxKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGltX2xvY2ssIGZsYWdzKTsKKworCWlmIChkZXYtPmF0eF9pZHggPj0gMCAmJiBkZXYtPmhjaFtkZXYtPmF0eF9pZHhdLmlzX2luaXRpYWxpemVkKQorCQl3aGlsZSAoIXRyeV9zdGFydF9kaW1fdHJhbnNmZXIoZGV2LT5oY2ggKyBkZXYtPmF0eF9pZHgpKQorCQkJY29udGludWU7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKIC8qKgogICogZGltMl90YXNrbGV0X2ZuIC0gdGFza2xldCBmdW5jdGlvbgogICogQGRhdGE6IHByaXZhdGUgZGF0YQpAQCAtNDUyLDMwICs0NjgsMTQgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRpbV9sb2NrLCBmbGFncyk7Ci0JZGltX3NlcnZpY2VfaXJxKGdldF9hY3RpdmVfY2hhbm5lbHMoZGV2LCBidWZmZXIpKTsKKwlkaW1fc2VydmljZV9haGJfaW50X2lycShnZXRfYWN0aXZlX2NoYW5uZWxzKGRldiwgYnVmZmVyKSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGltX2xvY2ssIGZsYWdzKTsKIAotI2lmICFkZWZpbmVkKEVOQUJMRV9IRE1fVEVTVCkKIAlkaW0yX3Rhc2tsZXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKIAl0YXNrbGV0X3NjaGVkdWxlKCZkaW0yX3Rhc2tsZXQpOwotI2Vsc2UKLQlkaW0yX3Rhc2tsZXRfZm4oKHVuc2lnbmVkIGxvbmcpZGV2KTsKLSNlbmRpZgogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotI2lmIGRlZmluZWQoRU5BQkxFX0hETV9URVNUKQotCi0vKgotICogVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IEhBTC1zaW11IGZvciBjYWxsaW5nIERJTSBpbnRlcnJ1cHQgaGFuZGxlci4KLSAqIEl0IGlzIHVzZWQgb25seSBmb3IgVEVTVCBQVVJQT1NFLgotICovCi12b2lkIHJhaXNlX2RpbV9pbnRlcnJ1cHQodm9pZCkKLXsKLQkodm9pZClkaW0yX2FoYl9pc3IoMCwgdGVzdF9kZXYpOwotfQotI2VuZGlmCi0KIC8qKgogICogY29tcGxldGVfYWxsX21ib3MgLSBjb21wbGV0ZSBNQk8ncyBpbiBhIGxpc3QKICAqIEBoZWFkOiBsaXN0IGhlYWQKQEAgLTU0NSw3ICs1NDUsNyBAQAogCQkJCWhkbV9jaC0+bmFtZSwgYnVmX3NpemUsIG5ld19zaXplKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmRpbV9sb2NrLCBmbGFncyk7CiAJCWhhbF9yZXQgPSBkaW1faW5pdF9jb250cm9sKCZoZG1fY2gtPmNoLCBpc190eCwgY2hfYWRkciwKLQkJCQkJICAgYnVmX3NpemUpOworCQkJCQkgICBpc190eCA/IG5ld19zaXplICogMiA6IG5ld19zaXplKTsKIAkJYnJlYWs7CiAJY2FzZSBNT1NUX0NIX0FTWU5DOgogCQluZXdfc2l6ZSA9IGRpbV9ub3JtX2N0cmxfYXN5bmNfYnVmZmVyX3NpemUoYnVmX3NpemUpOwpAQCAtNTU4LDkgKzU1OCwxMCBAQAogCQkJcHJfd2FybigiJXM6IGZpeGVkIGJ1ZmZlciBzaXplICglZCAtPiAlZClcbiIsCiAJCQkJaGRtX2NoLT5uYW1lLCBidWZfc2l6ZSwgbmV3X3NpemUpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGltX2xvY2ssIGZsYWdzKTsKLQkJaGFsX3JldCA9IGRpbV9pbml0X2FzeW5jKCZoZG1fY2gtPmNoLCBpc190eCwgY2hfYWRkciwgYnVmX3NpemUpOworCQloYWxfcmV0ID0gZGltX2luaXRfYXN5bmMoJmhkbV9jaC0+Y2gsIGlzX3R4LCBjaF9hZGRyLAorCQkJCQkgaXNfdHggPyBuZXdfc2l6ZSAqIDIgOiBuZXdfc2l6ZSk7CiAJCWJyZWFrOwotCWNhc2UgTU9TVF9DSF9JU09DX0FWUDoKKwljYXNlIE1PU1RfQ0hfSVNPQzoKIAkJbmV3X3NpemUgPSBkaW1fbm9ybV9pc29jX2J1ZmZlcl9zaXplKGJ1Zl9zaXplLCBzdWJfc2l6ZSk7CiAJCWlmIChuZXdfc2l6ZSA9PSAwKSB7CiAJCQlwcl9lcnIoIiVzOiBpbnZhbGlkIHN1Yi1idWZmZXIgc2l6ZSBvciB0b28gc21hbGwgYnVmZmVyIHNpemVcbiIsCkBAIC03MDUsMTIgKzcwNiwxNCBAQAogCWlmICghaGRtX2NoLT5pc19pbml0aWFsaXplZCkKIAkJcmV0dXJuIC1FUEVSTTsKIAorCXRhc2tsZXRfZGlzYWJsZSgmZGltMl90YXNrbGV0KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGltX2xvY2ssIGZsYWdzKTsKIAloYWxfcmV0ID0gZGltX2Rlc3Ryb3lfY2hhbm5lbCgmaGRtX2NoLT5jaCk7CiAJaGRtX2NoLT5pc19pbml0aWFsaXplZCA9IGZhbHNlOwogCWlmIChjaF9pZHggPT0gZGV2LT5hdHhfaWR4KQogCQlkZXYtPmF0eF9pZHggPSAtMTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW1fbG9jaywgZmxhZ3MpOworCXRhc2tsZXRfZW5hYmxlKCZkaW0yX3Rhc2tsZXQpOwogCWlmIChoYWxfcmV0ICE9IERJTV9OT19FUlJPUikgewogCQlwcl9lcnIoIkhBTCBGYWlsZWQgdG8gY2xvc2UgY2hhbm5lbCAlc1xuIiwgaGRtX2NoLT5uYW1lKTsKIAkJcmV0ID0gLUVGQVVMVDsKQEAgLTczNSw2ICs3MzgsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCByZXQsIGk7CiAJc3RydWN0IGtvYmplY3QgKmtvYmo7CisJaW50IGlycTsKIAogCWRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwogCWlmICghZGV2KQpAQCAtNzQzLDI5ICs3NDcsMzcgQEAKIAlkZXYtPmF0eF9pZHggPSAtMTsKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7Ci0jaWYgZGVmaW5lZChFTkFCTEVfSERNX1RFU1QpCi0JdGVzdF9kZXYgPSBkZXY7Ci0jZWxzZQogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJZGV2LT5pb19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CiAJaWYgKElTX0VSUihkZXYtPmlvX2Jhc2UpKQogCQlyZXR1cm4gUFRSX0VSUihkZXYtPmlvX2Jhc2UpOwogCi0JcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycVxuIik7CisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGFoYjBfaW50IGlycVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlkZXYtPmlycV9haGIwID0gcmV0OwogCi0JcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBkZXYtPmlycV9haGIwLCBkaW0yX2FoYl9pc3IsIDAsCi0JCQkgICAgICAgIm1sYl9haGIwIiwgZGV2KTsKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgZGltMl9haGJfaXNyLCAwLAorCQkJICAgICAgICJkaW0yX2FoYjBfaW50IiwgZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IElSUTogJWQsIGVycjogJWRcbiIsCi0JCQlkZXYtPmlycV9haGIwLCByZXQpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBhaGIwX2ludCBpcnEgJWRcbiIsIGlycSk7CiAJCXJldHVybiByZXQ7CiAJfQotI2VuZGlmCisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWxiX2ludCBpcnFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGlycSwgZGltMl9tbGJfaXNyLCAwLAorCQkJICAgICAgICJkaW0yX21sYl9pbnQiLCBkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgbWxiX2ludCBpcnEgJWRcbiIsIGlycSk7CisJCXJldHVybiByZXQ7CisJfQorCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5uZXRpbmZvX3dhaXRxKTsKIAlkZXYtPmRlbGl2ZXJfbmV0aW5mbyA9IDA7CiAJZGV2LT5uZXRpbmZvX3Rhc2sgPSBrdGhyZWFkX3J1bigmZGVsaXZlcl9uZXRpbmZvX3RocmVhZCwgKHZvaWQgKilkZXYsCkBAIC03ODUsNyArNzk3LDcgQEAKIAkJY2FwLT5uYW1lX3N1ZmZpeCA9IGhkbV9jaC0+bmFtZTsKIAkJY2FwLT5kaXJlY3Rpb24gPSBNT1NUX0NIX1JYIHwgTU9TVF9DSF9UWDsKIAkJY2FwLT5kYXRhX3R5cGUgPSBNT1NUX0NIX0NPTlRST0wgfCBNT1NUX0NIX0FTWU5DIHwKLQkJCQkgTU9TVF9DSF9JU09DX0FWUCB8IE1PU1RfQ0hfU1lOQzsKKwkJCQkgTU9TVF9DSF9JU09DIHwgTU9TVF9DSF9TWU5DOwogCQljYXAtPm51bV9idWZmZXJzX3BhY2tldCA9IE1BWF9CVUZGRVJTX1BBQ0tFVDsKIAkJY2FwLT5idWZmZXJfc2l6ZV9wYWNrZXQgPSBNQVhfQlVGX1NJWkVfUEFDS0VUOwogCQljYXAtPm51bV9idWZmZXJzX3N0cmVhbWluZyA9IE1BWF9CVUZGRVJTX1NUUkVBTUlORzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX3JlZy5oCmluZGV4IGUwODM3YjYuLjAxZmU0OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfcmVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9yZWcuaApAQCAtNzcsMTMgKzc3LDcgQEAKIAogCU1MQkMwX0ZDTlRfU0hJRlQgPSAxNSwKIAlNTEJDMF9GQ05UX01BU0sgPSA3LAotCU1MQkMwX0ZDTlRfVkFMXzFGUFNCID0gMCwKLQlNTEJDMF9GQ05UX1ZBTF8yRlBTQiA9IDEsCi0JTUxCQzBfRkNOVF9WQUxfNEZQU0IgPSAyLAotCU1MQkMwX0ZDTlRfVkFMXzhGUFNCID0gMywKLQlNTEJDMF9GQ05UX1ZBTF8xNkZQU0IgPSA0LAotCU1MQkMwX0ZDTlRfVkFMXzMyRlBTQiA9IDUsCi0JTUxCQzBfRkNOVF9WQUxfNjRGUFNCID0gNiwKKwlNTEJDMF9GQ05UX01BWF9WQUwgPSA2LAogCiAJTUxCQzBfTUxCRU5fQklUID0gMCwKIApAQCAtMTIzLDYgKzExNyw5IEBACiB9OwogCiBlbnVtIHsKKwlDRFQwX1JQQ19TSElGVCA9IDE2ICsgMTEsCisJQ0RUMF9SUENfTUFTSyA9IERJTTJfTUFTSyg1KSwKKwogCUNEVDFfQlNfSVNPQ19TSElGVCA9IDAsCiAJQ0RUMV9CU19JU09DX01BU0sgPSBESU0yX01BU0soOSksCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS1kaW0yL2RpbTJfc3lzZnMuYwppbmRleCAyYjI4ZTRhLi5kOGIyMmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tZGltMi9kaW0yX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvaGRtLWRpbTIvZGltMl9zeXNmcy5jCkBAIC0zOSw3ICszOSw3IEBACiAJTlVMTCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGJ1c19hdHRyX2dyb3VwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYnVzX2F0dHJfZ3JvdXAgPSB7CiAJLmF0dHJzID0gYnVzX2RlZmF1bHRfYXR0cnMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9oZG0tdXNiL2hkbV91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS11c2IvaGRtX3VzYi5jCmluZGV4IGFlYWUwNzEuLjI2YzlhZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS11c2IvaGRtX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L2hkbS11c2IvaGRtX3VzYi5jCkBAIC00Myw4ICs0Myw5IEBACiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9TTVNDCTB4MDQyNCAgLyogVklEOiBTTVNDICovCiAjZGVmaW5lIFVTQl9ERVZfSURfQlJERwkJMHhDMDAxICAvKiBQSUQ6IFVTQiBCcmlkZ2UgKi8KLSNkZWZpbmUgVVNCX0RFVl9JRF9JTklDCQkweENGMTggIC8qIFBJRDogVVNCIElOSUMgKi8KLSNkZWZpbmUgSFdfUkVTWU5DCQkweDAwMDAKKyNkZWZpbmUgVVNCX0RFVl9JRF9PUzgxMTE4CTB4Q0YxOCAgLyogUElEOiBVU0IgT1M4MTExOCAqLworI2RlZmluZSBVU0JfREVWX0lEX09TODExMTkJMHhDRjE5ICAvKiBQSUQ6IFVTQiBPUzgxMTE5ICovCisjZGVmaW5lIFVTQl9ERVZfSURfT1M4MTIxMAkweENGMzAgIC8qIFBJRDogVVNCIE9TODEyMTAgKi8KIC8qIERSQ0kgQWRkcmVzc2VzICovCiAjZGVmaW5lIERSQ0lfUkVHX05JX1NUQVRFCTB4MDEwMAogI2RlZmluZSBEUkNJX1JFR19QQUNLRVRfQlcJMHgwMTAxCkBAIC02NCwzMyArNjUsMzAgQEAKICNkZWZpbmUgRFJDSV9XUklURV9SRVEJCTB4QTEKIAogLyoqCi0gKiBzdHJ1Y3QgYnVmX2FuY2hvciAtIHVzZWQgdG8gY3JlYXRlIGEgbGlzdCBvZiBwZW5kaW5nIFVSQnMKLSAqIEB1cmI6IHBvaW50ZXIgdG8gVVNCIHJlcXVlc3QgYmxvY2sKLSAqIEBjbGVhcl93b3JrX29iajoKLSAqIEBsaXN0OiBsaW5rZWQgbGlzdAotICogQHVyYl9jb21wbGV0aW9uOgotICovCi1zdHJ1Y3QgYnVmX2FuY2hvciB7Ci0Jc3RydWN0IHVyYiAqdXJiOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBjbGVhcl93b3JrX29iajsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IGNvbXBsZXRpb24gdXJiX2NvbXBsOwotfTsKLQotI2RlZmluZSB0b19idWZfYW5jaG9yKHcpIGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYnVmX2FuY2hvciwgY2xlYXJfd29ya19vYmopCi0KLS8qKgogICogc3RydWN0IG1vc3RfZGNpX29iaiAtIERpcmVjdCBDb21tdW5pY2F0aW9uIEludGVyZmFjZQogICogQGtvYmo6cG9zaXRpb24gaW4gc3lzZnMKICAqIEB1c2JfZGV2aWNlOiBwb2ludGVyIHRvIHRoZSB1c2IgZGV2aWNlCisgKiBAcmVnX2FkZHI6IHJlZ2lzdGVyIGFkZHJlc3MgZm9yIGFyYml0cmFyeSBEQ0kgYWNjZXNzCiAgKi8KIHN0cnVjdCBtb3N0X2RjaV9vYmogewogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXZpY2U7CisJdTE2IHJlZ19hZGRyOwogfTsKIAogI2RlZmluZSB0b19kY2lfb2JqKHApIGNvbnRhaW5lcl9vZihwLCBzdHJ1Y3QgbW9zdF9kY2lfb2JqLCBrb2JqKQogCitzdHJ1Y3QgbW9zdF9kZXY7CisKK3N0cnVjdCBjbGVhcl9ob2xkX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3czsKKwlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXY7CisJdW5zaWduZWQgaW50IGNoYW5uZWw7CisJaW50IHBpcGU7Cit9OworCisjZGVmaW5lIHRvX2NsZWFyX2hvbGRfd29yayh3KSBjb250YWluZXJfb2Yodywgc3RydWN0IGNsZWFyX2hvbGRfd29yaywgd3MpCisKIC8qKgogICogc3RydWN0IG1vc3RfZGV2IC0gaG9sZHMgYWxsIHVzYiBpbnRlcmZhY2Ugc3BlY2lmaWMgc3R1ZmYKICAqIEBwYXJlbnQ6IHBhcmVudCBvYmplY3QgaW4gc3lzZnMKQEAgLTEwNCwxMCArMTAyLDEwIEBACiAgKiBAbGlua19zdGF0OiBsaW5rIHN0YXR1cyBvZiBoYXJkd2FyZQogICogQGRlc2NyaXB0aW9uOiBkZXZpY2UgZGVzY3JpcHRpb24KICAqIEBzdWZmaXg6IHN1ZmZpeCBmb3IgY2hhbm5lbCBuYW1lCi0gKiBAYW5jaG9yX2xpc3RfbG9jazogbG9ja3MgbGlzdCBhY2Nlc3MKKyAqIEBjaGFubmVsX2xvY2s6IHN5bmNocm9uaXplIGNoYW5uZWwgYWNjZXNzCiAgKiBAcGFkZGluZ19hY3RpdmU6IGluZGljYXRlcyBjaGFubmVsIHVzZXMgcGFkZGluZwogICogQGlzX2NoYW5uZWxfaGVhbHRoeTogaGVhbHRoIHN0YXR1cyB0YWJsZSBvZiBlYWNoIGNoYW5uZWwKLSAqIEBhbmNob3JfbGlzdDogbGlzdCBvZiBhbmNob3JlZCBpdGVtcworICogQGJ1c3lfdXJiczogbGlzdCBvZiBhbmNob3JlZCBpdGVtcwogICogQGlvX211dGV4OiBzeW5jaHJvbml6ZSBJL08gd2l0aCBkaXNjb25uZWN0CiAgKiBAbGlua19zdGF0X3RpbWVyOiB0aW1lciBmb3IgbGluayBzdGF0dXMgcmVwb3J0cwogICogQHBvbGxfd29ya19vYmo6IHdvcmsgZm9yIHBvbGxpbmcgbGluayBzdGF0dXMKQEAgLTEyNCwxMCArMTIyLDExIEBACiAJdTE2IGxpbmtfc3RhdDsKIAljaGFyIGRlc2NyaXB0aW9uW01BWF9TVFJJTkdfTEVOXTsKIAljaGFyIHN1ZmZpeFtNQVhfTlVNX0VORFBPSU5UU11bTUFYX1NVRkZJWF9MRU5dOwotCXNwaW5sb2NrX3QgYW5jaG9yX2xpc3RfbG9ja1tNQVhfTlVNX0VORFBPSU5UU107CisJc3BpbmxvY2tfdCBjaGFubmVsX2xvY2tbTUFYX05VTV9FTkRQT0lOVFNdOyAvKiBzeW5jIGNoYW5uZWwgYWNjZXNzICovCiAJYm9vbCBwYWRkaW5nX2FjdGl2ZVtNQVhfTlVNX0VORFBPSU5UU107CiAJYm9vbCBpc19jaGFubmVsX2hlYWx0aHlbTUFYX05VTV9FTkRQT0lOVFNdOwotCXN0cnVjdCBsaXN0X2hlYWQgKmFuY2hvcl9saXN0OworCXN0cnVjdCBjbGVhcl9ob2xkX3dvcmsgY2xlYXJfd29ya1tNQVhfTlVNX0VORFBPSU5UU107CisJc3RydWN0IHVzYl9hbmNob3IgKmJ1c3lfdXJiczsKIAlzdHJ1Y3QgbXV0ZXggaW9fbXV0ZXg7CiAJc3RydWN0IHRpbWVyX2xpc3QgbGlua19zdGF0X3RpbWVyOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBwb2xsX3dvcmtfb2JqOwpAQCAtMTkxLDQwICsxOTAsMjQgQEAKICAqIGZyZWVfYW5jaG9yZWRfYnVmZmVycyAtIGZyZWUgZGV2aWNlJ3MgYW5jaG9yZWQgaXRlbXMKICAqIEBtZGV2OiB0aGUgZGV2aWNlCiAgKiBAY2hhbm5lbDogY2hhbm5lbCBJRAorICogQHN0YXR1czogc3RhdHVzIG9mIE1CTyB0ZXJtaW5hdGlvbgogICovCi1zdGF0aWMgdm9pZCBmcmVlX2FuY2hvcmVkX2J1ZmZlcnMoc3RydWN0IG1vc3RfZGV2ICptZGV2LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3N0YXRpYyB2b2lkIGZyZWVfYW5jaG9yZWRfYnVmZmVycyhzdHJ1Y3QgbW9zdF9kZXYgKm1kZXYsIHVuc2lnbmVkIGludCBjaGFubmVsLAorCQkJCSAgZW51bSBtYm9fc3RhdHVzX2ZsYWdzIHN0YXR1cykKIHsKIAlzdHJ1Y3QgbWJvICptYm87Ci0Jc3RydWN0IGJ1Zl9hbmNob3IgKmFuY2hvciwgKnRtcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB1cmIgKnVyYjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFuY2hvciwgdG1wLCAmbWRldi0+YW5jaG9yX2xpc3RbY2hhbm5lbF0sCi0JCQkJIGxpc3QpIHsKLQkJc3RydWN0IHVyYiAqdXJiID0gYW5jaG9yLT51cmI7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCQlpZiAobGlrZWx5KHVyYikpIHsKLQkJCW1ibyA9IHVyYi0+Y29udGV4dDsKLQkJCWlmICghaXJxc19kaXNhYmxlZCgpKSB7Ci0JCQkJdXNiX2tpbGxfdXJiKHVyYik7Ci0JCQl9IGVsc2UgewotCQkJCXVzYl91bmxpbmtfdXJiKHVyYik7Ci0JCQkJd2FpdF9mb3JfY29tcGxldGlvbigmYW5jaG9yLT51cmJfY29tcGwpOwotCQkJfQotCQkJaWYgKChtYm8pICYmIChtYm8tPmNvbXBsZXRlKSkgewotCQkJCW1iby0+c3RhdHVzID0gTUJPX0VfQ0xPU0U7Ci0JCQkJbWJvLT5wcm9jZXNzZWRfbGVuZ3RoID0gMDsKLQkJCQltYm8tPmNvbXBsZXRlKG1ibyk7Ci0JCQl9Ci0JCQl1c2JfZnJlZV91cmIodXJiKTsKKwl3aGlsZSAoKHVyYiA9IHVzYl9nZXRfZnJvbV9hbmNob3IoJm1kZXYtPmJ1c3lfdXJic1tjaGFubmVsXSkpKSB7CisJCW1ibyA9IHVyYi0+Y29udGV4dDsKKwkJdXNiX2tpbGxfdXJiKHVyYik7CisJCWlmIChtYm8gJiYgbWJvLT5jb21wbGV0ZSkgeworCQkJbWJvLT5zdGF0dXMgPSBzdGF0dXM7CisJCQltYm8tPnByb2Nlc3NlZF9sZW5ndGggPSAwOworCQkJbWJvLT5jb21wbGV0ZShtYm8pOwogCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0JCWxpc3RfZGVsKCZhbmNob3ItPmxpc3QpOwotCQljYW5jZWxfd29ya19zeW5jKCZhbmNob3ItPmNsZWFyX3dvcmtfb2JqKTsKLQkJa2ZyZWUoYW5jaG9yKTsKKwkJdXNiX2ZyZWVfdXJiKHVyYik7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKIH0KIAogLyoqCkBAIC0yNDEsNyArMjI0LDcgQEAKIAkJcmV0dXJuIGZyYW1lX3NpemU7CiAJfQogCXN3aXRjaCAoY2ZnLT5kYXRhX3R5cGUpIHsKLQljYXNlIE1PU1RfQ0hfSVNPQ19BVlA6CisJY2FzZSBNT1NUX0NIX0lTT0M6CiAJCWZyYW1lX3NpemUgPSBBVl9QQUNLRVRTX1BFUl9YQUNUICogc3ViX3NpemU7CiAJCWJyZWFrOwogCWNhc2UgTU9TVF9DSF9TWU5DOgpAQCAtMjc0LDIyICsyNTcsMjggQEAKICAqLwogc3RhdGljIGludCBoZG1fcG9pc29uX2NoYW5uZWwoc3RydWN0IG1vc3RfaW50ZXJmYWNlICppZmFjZSwgaW50IGNoYW5uZWwpCiB7Ci0Jc3RydWN0IG1vc3RfZGV2ICptZGV2OworCXN0cnVjdCBtb3N0X2RldiAqbWRldiA9IHRvX21kZXYoaWZhY2UpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3BpbmxvY2tfdCAqbG9jazsgLyogdGVtcC4gbG9jayAqLwogCi0JbWRldiA9IHRvX21kZXYoaWZhY2UpOwogCWlmICh1bmxpa2VseSghaWZhY2UpKSB7CiAJCWRldl93YXJuKCZtZGV2LT51c2JfZGV2aWNlLT5kZXYsICJQb2lzb246IEJhZCBpbnRlcmZhY2UuXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQotCWlmICh1bmxpa2VseSgoY2hhbm5lbCA8IDApIHx8IChjaGFubmVsID49IGlmYWNlLT5udW1fY2hhbm5lbHMpKSkgeworCWlmICh1bmxpa2VseShjaGFubmVsIDwgMCB8fCBjaGFubmVsID49IGlmYWNlLT5udW1fY2hhbm5lbHMpKSB7CiAJCWRldl93YXJuKCZtZGV2LT51c2JfZGV2aWNlLT5kZXYsICJDaGFubmVsIElEIG91dCBvZiByYW5nZS5cbiIpOwogCQlyZXR1cm4gLUVDSFJORzsKIAl9CiAKKwlsb2NrID0gbWRldi0+Y2hhbm5lbF9sb2NrICsgY2hhbm5lbDsKKwlzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CiAJbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdID0gZmFsc2U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CisKKwljYW5jZWxfd29ya19zeW5jKCZtZGV2LT5jbGVhcl93b3JrW2NoYW5uZWxdLndzKTsKIAogCW11dGV4X2xvY2soJm1kZXYtPmlvX211dGV4KTsKLQlmcmVlX2FuY2hvcmVkX2J1ZmZlcnMobWRldiwgY2hhbm5lbCk7CisJZnJlZV9hbmNob3JlZF9idWZmZXJzKG1kZXYsIGNoYW5uZWwsIE1CT19FX0NMT1NFKTsKIAlpZiAobWRldi0+cGFkZGluZ19hY3RpdmVbY2hhbm5lbF0pCiAJCW1kZXYtPnBhZGRpbmdfYWN0aXZlW2NoYW5uZWxdID0gZmFsc2U7CiAKQEAgLTMxMywxMCArMzAyLDEwIEBACiBzdGF0aWMgaW50IGhkbV9hZGRfcGFkZGluZyhzdHJ1Y3QgbW9zdF9kZXYgKm1kZXYsIGludCBjaGFubmVsLCBzdHJ1Y3QgbWJvICptYm8pCiB7CiAJc3RydWN0IG1vc3RfY2hhbm5lbF9jb25maWcgKmNvbmYgPSAmbWRldi0+Y29uZltjaGFubmVsXTsKLQl1bnNpZ25lZCBpbnQgaiwgbnVtX2ZyYW1lcywgZnJhbWVfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZSA9IGdldF9zdHJlYW1fZnJhbWVfc2l6ZShjb25mKTsKKwl1bnNpZ25lZCBpbnQgaiwgbnVtX2ZyYW1lczsKIAl1MTYgcmRfYWRkciwgd3JfYWRkcjsKIAotCWZyYW1lX3NpemUgPSBnZXRfc3RyZWFtX2ZyYW1lX3NpemUoY29uZik7CiAJaWYgKCFmcmFtZV9zaXplKQogCQlyZXR1cm4gLUVJTzsKIAludW1fZnJhbWVzID0gbWJvLT5idWZmZXJfbGVuZ3RoIC8gZnJhbWVfc2l6ZTsKQEAgLTM1MCwxMCArMzM5LDEwIEBACiBzdGF0aWMgaW50IGhkbV9yZW1vdmVfcGFkZGluZyhzdHJ1Y3QgbW9zdF9kZXYgKm1kZXYsIGludCBjaGFubmVsLAogCQkJICAgICAgc3RydWN0IG1ibyAqbWJvKQogewotCXVuc2lnbmVkIGludCBqLCBudW1fZnJhbWVzLCBmcmFtZV9zaXplOwogCXN0cnVjdCBtb3N0X2NoYW5uZWxfY29uZmlnICpjb25zdCBjb25mID0gJm1kZXYtPmNvbmZbY2hhbm5lbF07CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemUgPSBnZXRfc3RyZWFtX2ZyYW1lX3NpemUoY29uZik7CisJdW5zaWduZWQgaW50IGosIG51bV9mcmFtZXM7CiAKLQlmcmFtZV9zaXplID0gZ2V0X3N0cmVhbV9mcmFtZV9zaXplKGNvbmYpOwogCWlmICghZnJhbWVfc2l6ZSkKIAkJcmV0dXJuIC1FSU87CiAJbnVtX2ZyYW1lcyA9IG1iby0+cHJvY2Vzc2VkX2xlbmd0aCAvIFVTQl9NVFU7CkBAIC0zODAsMzcgKzM2OSwyOSBAQAogICovCiBzdGF0aWMgdm9pZCBoZG1fd3JpdGVfY29tcGxldGlvbihzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0Jc3RydWN0IG1ibyAqbWJvOwotCXN0cnVjdCBidWZfYW5jaG9yICphbmNob3I7Ci0Jc3RydWN0IG1vc3RfZGV2ICptZGV2OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKwlzdHJ1Y3QgbWJvICptYm8gPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IG1vc3RfZGV2ICptZGV2ID0gdG9fbWRldihtYm8tPmlmcCk7CisJdW5zaWduZWQgaW50IGNoYW5uZWwgPSBtYm8tPmhkbV9jaGFubmVsX2lkOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZtZGV2LT51c2JfZGV2aWNlLT5kZXY7CisJc3BpbmxvY2tfdCAqbG9jayA9IG1kZXYtPmNoYW5uZWxfbG9jayArIGNoYW5uZWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCW1ibyA9IHVyYi0+Y29udGV4dDsKLQlhbmNob3IgPSBtYm8tPnByaXY7Ci0JbWRldiA9IHRvX21kZXYobWJvLT5pZnApOwotCWNoYW5uZWwgPSBtYm8tPmhkbV9jaGFubmVsX2lkOwotCWRldiA9ICZtZGV2LT51c2JfZGV2aWNlLT5kZXY7Ci0KLQlpZiAoKHVyYi0+c3RhdHVzID09IC1FTk9FTlQpIHx8ICh1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkgfHwKLQkgICAgKCFtZGV2LT5pc19jaGFubmVsX2hlYWx0aHlbY2hhbm5lbF0pKSB7Ci0JCWNvbXBsZXRlKCZhbmNob3ItPnVyYl9jb21wbCk7CisJc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpOworCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8IHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CisJICAgICFtZGV2LT5pc19jaGFubmVsX2hlYWx0aHlbY2hhbm5lbF0pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAodW5saWtlbHkodXJiLT5zdGF0dXMgJiYgISh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8Ci0JCQkJICAgICAgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQgfHwKLQkJCQkgICAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSkpIHsKKwlpZiAodW5saWtlbHkodXJiLT5zdGF0dXMgJiYgdXJiLT5zdGF0dXMgIT0gLUVTSFVURE9XTikpIHsKIAkJbWJvLT5wcm9jZXNzZWRfbGVuZ3RoID0gMDsKIAkJc3dpdGNoICh1cmItPnN0YXR1cykgewogCQljYXNlIC1FUElQRToKIAkJCWRldl93YXJuKGRldiwgIkJyb2tlbiBPVVQgcGlwZSBkZXRlY3RlZFxuIik7Ci0JCQltb3N0X3N0b3BfZW5xdWV1ZSgmbWRldi0+aWZhY2UsIGNoYW5uZWwpOwotCQkJbWJvLT5zdGF0dXMgPSBNQk9fRV9JTlZBTDsKLQkJCXVzYl91bmxpbmtfdXJiKHVyYik7Ci0JCQlJTklUX1dPUksoJmFuY2hvci0+Y2xlYXJfd29ya19vYmosIHdxX2NsZWFyX2hhbHQpOwotCQkJc2NoZWR1bGVfd29yaygmYW5jaG9yLT5jbGVhcl93b3JrX29iaik7CisJCQltZGV2LT5pc19jaGFubmVsX2hlYWx0aHlbY2hhbm5lbF0gPSBmYWxzZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOworCQkJbWRldi0+Y2xlYXJfd29ya1tjaGFubmVsXS5waXBlID0gdXJiLT5waXBlOworCQkJc2NoZWR1bGVfd29yaygmbWRldi0+Y2xlYXJfd29ya1tjaGFubmVsXS53cyk7CiAJCQlyZXR1cm47CiAJCWNhc2UgLUVOT0RFVjoKIAkJY2FzZSAtRVBST1RPOgpAQCAtNDI1LDEwICs0MDYsNyBAQAogCQltYm8tPnByb2Nlc3NlZF9sZW5ndGggPSB1cmItPmFjdHVhbF9sZW5ndGg7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQlsaXN0X2RlbCgmYW5jaG9yLT5saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0Ja2ZyZWUoYW5jaG9yKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKIAogCWlmIChsaWtlbHkobWJvLT5jb21wbGV0ZSkpCiAJCW1iby0+Y29tcGxldGUobWJvKTsKQEAgLTU0NSwzNiArNTIzLDI5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGhkbV9yZWFkX2NvbXBsZXRpb24oc3RydWN0IHVyYiAqdXJiKQogewotCXN0cnVjdCBtYm8gKm1ibzsKLQlzdHJ1Y3QgYnVmX2FuY2hvciAqYW5jaG9yOwotCXN0cnVjdCBtb3N0X2RldiAqbWRldjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG1ibyAqbWJvID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBtb3N0X2RldiAqbWRldiA9IHRvX21kZXYobWJvLT5pZnApOworCXVuc2lnbmVkIGludCBjaGFubmVsID0gbWJvLT5oZG1fY2hhbm5lbF9pZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbWRldi0+dXNiX2RldmljZS0+ZGV2OworCXNwaW5sb2NrX3QgKmxvY2sgPSBtZGV2LT5jaGFubmVsX2xvY2sgKyBjaGFubmVsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGNoYW5uZWw7CiAKLQltYm8gPSB1cmItPmNvbnRleHQ7Ci0JYW5jaG9yID0gbWJvLT5wcml2OwotCW1kZXYgPSB0b19tZGV2KG1iby0+aWZwKTsKLQljaGFubmVsID0gbWJvLT5oZG1fY2hhbm5lbF9pZDsKLQlkZXYgPSAmbWRldi0+dXNiX2RldmljZS0+ZGV2OwotCi0JaWYgKCh1cmItPnN0YXR1cyA9PSAtRU5PRU5UKSB8fCAodXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpIHx8Ci0JICAgICghbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdKSkgewotCQljb21wbGV0ZSgmYW5jaG9yLT51cmJfY29tcGwpOworCXNwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKKwlpZiAodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fCB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCSAgICAhbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKHVubGlrZWx5KHVyYi0+c3RhdHVzICYmICEodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fAotCQkJCSAgICAgIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8Ci0JCQkJICAgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpKSB7CisJaWYgKHVubGlrZWx5KHVyYi0+c3RhdHVzICYmIHVyYi0+c3RhdHVzICE9IC1FU0hVVERPV04pKSB7CiAJCW1iby0+cHJvY2Vzc2VkX2xlbmd0aCA9IDA7CiAJCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKIAkJY2FzZSAtRVBJUEU6CiAJCQlkZXZfd2FybihkZXYsICJCcm9rZW4gSU4gcGlwZSBkZXRlY3RlZFxuIik7Ci0JCQltYm8tPnN0YXR1cyA9IE1CT19FX0lOVkFMOwotCQkJdXNiX3VubGlua191cmIodXJiKTsKLQkJCUlOSVRfV09SSygmYW5jaG9yLT5jbGVhcl93b3JrX29iaiwgd3FfY2xlYXJfaGFsdCk7Ci0JCQlzY2hlZHVsZV93b3JrKCZhbmNob3ItPmNsZWFyX3dvcmtfb2JqKTsKKwkJCW1kZXYtPmlzX2NoYW5uZWxfaGVhbHRoeVtjaGFubmVsXSA9IGZhbHNlOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CisJCQltZGV2LT5jbGVhcl93b3JrW2NoYW5uZWxdLnBpcGUgPSB1cmItPnBpcGU7CisJCQlzY2hlZHVsZV93b3JrKCZtZGV2LT5jbGVhcl93b3JrW2NoYW5uZWxdLndzKTsKIAkJCXJldHVybjsKIAkJY2FzZSAtRU5PREVWOgogCQljYXNlIC1FUFJPVE86CkBAIC01ODgsMjEgKzU1OSwxNSBAQAogCQl9CiAJfSBlbHNlIHsKIAkJbWJvLT5wcm9jZXNzZWRfbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwotCQlpZiAoIW1kZXYtPnBhZGRpbmdfYWN0aXZlW2NoYW5uZWxdKSB7Ci0JCQltYm8tPnN0YXR1cyA9IE1CT19TVUNDRVNTOwotCQl9IGVsc2UgewotCQkJaWYgKGhkbV9yZW1vdmVfcGFkZGluZyhtZGV2LCBjaGFubmVsLCBtYm8pKSB7Ci0JCQkJbWJvLT5wcm9jZXNzZWRfbGVuZ3RoID0gMDsKLQkJCQltYm8tPnN0YXR1cyA9IE1CT19FX0lOVkFMOwotCQkJfSBlbHNlIHsKLQkJCQltYm8tPnN0YXR1cyA9IE1CT19TVUNDRVNTOwotCQkJfQorCQltYm8tPnN0YXR1cyA9IE1CT19TVUNDRVNTOworCQlpZiAobWRldi0+cGFkZGluZ19hY3RpdmVbY2hhbm5lbF0gJiYKKwkJICAgIGhkbV9yZW1vdmVfcGFkZGluZyhtZGV2LCBjaGFubmVsLCBtYm8pKSB7CisJCQltYm8tPnByb2Nlc3NlZF9sZW5ndGggPSAwOworCQkJbWJvLT5zdGF0dXMgPSBNQk9fRV9JTlZBTDsKIAkJfQogCX0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCWxpc3RfZGVsKCZhbmNob3ItPmxpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQlrZnJlZShhbmNob3IpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CiAKIAlpZiAobGlrZWx5KG1iby0+Y29tcGxldGUpKQogCQltYm8tPmNvbXBsZXRlKG1ibyk7CkBAIC02MjgsMTggKzU5MywxNiBAQAogCQkgICAgICAgc3RydWN0IG1ibyAqbWJvKQogewogCXN0cnVjdCBtb3N0X2RldiAqbWRldjsKLQlzdHJ1Y3QgYnVmX2FuY2hvciAqYW5jaG9yOwogCXN0cnVjdCBtb3N0X2NoYW5uZWxfY29uZmlnICpjb25mOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgcmV0dmFsID0gMDsKIAlzdHJ1Y3QgdXJiICp1cmI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIGxlbmd0aDsKIAl2b2lkICp2aXJ0X2FkZHJlc3M7CiAKIAlpZiAodW5saWtlbHkoIWlmYWNlIHx8ICFtYm8pKQogCQlyZXR1cm4gLUVJTzsKLQlpZiAodW5saWtlbHkoaWZhY2UtPm51bV9jaGFubmVscyA8PSBjaGFubmVsKSB8fCAoY2hhbm5lbCA8IDApKQorCWlmICh1bmxpa2VseShpZmFjZS0+bnVtX2NoYW5uZWxzIDw9IGNoYW5uZWwgfHwgY2hhbm5lbCA8IDApKQogCQlyZXR1cm4gLUVDSFJORzsKIAogCW1kZXYgPSB0b19tZGV2KGlmYWNlKTsKQEAgLTY1MCwzMiArNjEzLDE1IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJdXJiID0gdXNiX2FsbG9jX3VyYihOT19JU09DSFJPTk9VU19VUkIsIEdGUF9BVE9NSUMpOwotCWlmICghdXJiKSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIFVSQlxuIik7CisJaWYgKCF1cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAotCWFuY2hvciA9IGt6YWxsb2Moc2l6ZW9mKCphbmNob3IpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWFuY2hvcikgewotCQlyZXR2YWwgPSAtRU5PTUVNOworCWlmICgoY29uZi0+ZGlyZWN0aW9uICYgTU9TVF9DSF9UWCkgJiYgbWRldi0+cGFkZGluZ19hY3RpdmVbY2hhbm5lbF0gJiYKKwkgICAgaGRtX2FkZF9wYWRkaW5nKG1kZXYsIGNoYW5uZWwsIG1ibykpIHsKKwkJcmV0dmFsID0gLUVJTzsKIAkJZ290byBfZXJyb3I7CiAJfQogCi0JYW5jaG9yLT51cmIgPSB1cmI7Ci0JaW5pdF9jb21wbGV0aW9uKCZhbmNob3ItPnVyYl9jb21wbCk7Ci0JbWJvLT5wcml2ID0gYW5jaG9yOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZhbmNob3ItPmxpc3QsICZtZGV2LT5hbmNob3JfbGlzdFtjaGFubmVsXSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCi0JaWYgKChtZGV2LT5wYWRkaW5nX2FjdGl2ZVtjaGFubmVsXSkgJiYKLQkgICAgKGNvbmYtPmRpcmVjdGlvbiAmIE1PU1RfQ0hfVFgpKQotCQlpZiAoaGRtX2FkZF9wYWRkaW5nKG1kZXYsIGNoYW5uZWwsIG1ibykpIHsKLQkJCXJldHZhbCA9IC1FSU87Ci0JCQlnb3RvIF9lcnJvcl8xOwotCQl9Ci0KIAl1cmItPnRyYW5zZmVyX2RtYSA9IG1iby0+YnVzX2FkZHJlc3M7CiAJdmlydF9hZGRyZXNzID0gbWJvLT52aXJ0X2FkZHJlc3M7CiAJbGVuZ3RoID0gbWJvLT5idWZmZXJfbGVuZ3RoOwpAQCAtNjg4LDcgKzYzNCw3IEBACiAJCQkJICBsZW5ndGgsCiAJCQkJICBoZG1fd3JpdGVfY29tcGxldGlvbiwKIAkJCQkgIG1ibyk7Ci0JCWlmIChjb25mLT5kYXRhX3R5cGUgIT0gTU9TVF9DSF9JU09DX0FWUCkKKwkJaWYgKGNvbmYtPmRhdGFfdHlwZSAhPSBNT1NUX0NIX0lTT0MpCiAJCQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKIAl9IGVsc2UgewogCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIG1kZXYtPnVzYl9kZXZpY2UsCkBAIC03MDEsNiArNjQ3LDggQEAKIAl9CiAJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAorCXVzYl9hbmNob3JfdXJiKHVyYiwgJm1kZXYtPmJ1c3lfdXJic1tjaGFubmVsXSk7CisKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOwogCWlmIChyZXR2YWwpIHsKIAkJZGV2X2VycihkZXYsICJVUkIgc3VibWl0IGZhaWxlZCB3aXRoIGVycm9yICVkLlxuIiwgcmV0dmFsKTsKQEAgLTcwOSwxMCArNjU3LDcgQEAKIAlyZXR1cm4gMDsKIAogX2Vycm9yXzE6Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPmFuY2hvcl9saXN0X2xvY2tbY2hhbm5lbF0sIGZsYWdzKTsKLQlsaXN0X2RlbCgmYW5jaG9yLT5saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0Ja2ZyZWUoYW5jaG9yKTsKKwl1c2JfdW5hbmNob3JfdXJiKHVyYik7CiBfZXJyb3I6CiAJdXNiX2ZyZWVfdXJiKHVyYik7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTczMSwyOSArNjc2LDMwIEBACiAJdW5zaWduZWQgaW50IGZyYW1lX3NpemU7CiAJdW5zaWduZWQgaW50IHRlbXBfc2l6ZTsKIAl1bnNpZ25lZCBpbnQgdGFpbF9zcGFjZTsKLQlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXY7Ci0Jc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBtb3N0X2RldiAqbWRldiA9IHRvX21kZXYoaWZhY2UpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZtZGV2LT51c2JfZGV2aWNlLT5kZXY7CiAKLQltZGV2ID0gdG9fbWRldihpZmFjZSk7CiAJbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdID0gdHJ1ZTsKLQlkZXYgPSAmbWRldi0+dXNiX2RldmljZS0+ZGV2OworCW1kZXYtPmNsZWFyX3dvcmtbY2hhbm5lbF0uY2hhbm5lbCA9IGNoYW5uZWw7CisJbWRldi0+Y2xlYXJfd29ya1tjaGFubmVsXS5tZGV2ID0gbWRldjsKKwlJTklUX1dPUksoJm1kZXYtPmNsZWFyX3dvcmtbY2hhbm5lbF0ud3MsIHdxX2NsZWFyX2hhbHQpOwogCiAJaWYgKHVubGlrZWx5KCFpZmFjZSB8fCAhY29uZikpIHsKIAkJZGV2X2VycihkZXYsICJCYWQgaW50ZXJmYWNlIG9yIGNvbmZpZyBwb2ludGVyLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAodW5saWtlbHkoKGNoYW5uZWwgPCAwKSB8fCAoY2hhbm5lbCA+PSBpZmFjZS0+bnVtX2NoYW5uZWxzKSkpIHsKKwlpZiAodW5saWtlbHkoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+PSBpZmFjZS0+bnVtX2NoYW5uZWxzKSkgewogCQlkZXZfZXJyKGRldiwgIkNoYW5uZWwgSUQgb3V0IG9mIHJhbmdlLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoKCFjb25mLT5udW1fYnVmZmVycykgfHwgKCFjb25mLT5idWZmZXJfc2l6ZSkpIHsKKwlpZiAoIWNvbmYtPm51bV9idWZmZXJzIHx8ICFjb25mLT5idWZmZXJfc2l6ZSkgewogCQlkZXZfZXJyKGRldiwgIk1pc2NvbmZpZzogYnVmZmVyIHNpemUgb3IgI2J1ZmZlcnMgemVyby5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoIShjb25mLT5kYXRhX3R5cGUgPT0gTU9TVF9DSF9TWU5DKSAmJgotCSAgICAhKChjb25mLT5kYXRhX3R5cGUgPT0gTU9TVF9DSF9JU09DX0FWUCkgJiYKLQkgICAgICAoY29uZi0+cGFja2V0c19wZXJfeGFjdCAhPSAweEZGKSkpIHsKKwlpZiAoY29uZi0+ZGF0YV90eXBlICE9IE1PU1RfQ0hfU1lOQyAmJgorCSAgICAhKGNvbmYtPmRhdGFfdHlwZSA9PSBNT1NUX0NIX0lTT0MgJiYKKwkgICAgICBjb25mLT5wYWNrZXRzX3Blcl94YWN0ICE9IDB4RkYpKSB7CiAJCW1kZXYtPnBhZGRpbmdfYWN0aXZlW2NoYW5uZWxdID0gZmFsc2U7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC03NjIsNyArNzA4LDcgQEAKIAl0ZW1wX3NpemUgPSBjb25mLT5idWZmZXJfc2l6ZTsKIAogCWZyYW1lX3NpemUgPSBnZXRfc3RyZWFtX2ZyYW1lX3NpemUoY29uZik7Ci0JaWYgKChmcmFtZV9zaXplID09IDApIHx8IChmcmFtZV9zaXplID4gVVNCX01UVSkpIHsKKwlpZiAoZnJhbWVfc2l6ZSA9PSAwIHx8IGZyYW1lX3NpemUgPiBVU0JfTVRVKSB7CiAJCWRldl93YXJuKGRldiwgIk1pc2NvbmZpZzogZnJhbWUgc2l6ZSB3cm9uZ1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTgwNywxNyArNzUzLDE3IEBACiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG1kZXYtPmh3X2FkZHIpKSB7CiAJCWlmIChkcmNpX3JkX3JlZyh1c2JfZGV2aWNlLCBEUkNJX1JFR19IV19BRERSX0hJLCAmaGkpIDwgMCkgewogCQkJZGV2X2VycihkZXYsICJWZW5kb3IgcmVxdWVzdCBcImh3X2FkZHJfaGlcIiBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC0xOworCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAogCQlpZiAoZHJjaV9yZF9yZWcodXNiX2RldmljZSwgRFJDSV9SRUdfSFdfQUREUl9NSSwgJm1pKSA8IDApIHsKIAkJCWRldl9lcnIoZGV2LCAiVmVuZG9yIHJlcXVlc3QgXCJod19hZGRyX21pZFwiIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLTE7CisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCiAJCWlmIChkcmNpX3JkX3JlZyh1c2JfZGV2aWNlLCBEUkNJX1JFR19IV19BRERSX0xPLCAmbG8pIDwgMCkgewogCQkJZGV2X2VycihkZXYsICJWZW5kb3IgcmVxdWVzdCBcImh3X2FkZHJfbG93XCIgZmFpbGVkXG4iKTsKLQkJCXJldHVybiAtMTsKKwkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAKIAkJbXV0ZXhfbG9jaygmbWRldi0+aW9fbXV0ZXgpOwpAQCAtODMyLDcgKzc3OCw3IEBACiAKIAlpZiAoZHJjaV9yZF9yZWcodXNiX2RldmljZSwgRFJDSV9SRUdfTklfU1RBVEUsICZsaW5rKSA8IDApIHsKIAkJZGV2X2VycihkZXYsICJWZW5kb3IgcmVxdWVzdCBcImxpbmsgc3RhdHVzXCIgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAltdXRleF9sb2NrKCZtZGV2LT5pb19tdXRleCk7CkBAIC04ODYsMjUgKzgzMiwyMiBAQAogICovCiBzdGF0aWMgdm9pZCB3cV9uZXRpbmZvKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3Ffb2JqKQogewotCXN0cnVjdCBtb3N0X2RldiAqbWRldjsKLQlpbnQgaSwgcHJldl9saW5rX3N0YXQ7CisJc3RydWN0IG1vc3RfZGV2ICptZGV2ID0gdG9fbWRldl9mcm9tX3dvcmsod3Ffb2JqKTsKKwlpbnQgaSwgcHJldl9saW5rX3N0YXQgPSBtZGV2LT5saW5rX3N0YXQ7CiAJdTggcHJldl9od19hZGRyWzZdOwogCi0JbWRldiA9IHRvX21kZXZfZnJvbV93b3JrKHdxX29iaik7Ci0JcHJldl9saW5rX3N0YXQgPSBtZGV2LT5saW5rX3N0YXQ7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogCQlwcmV2X2h3X2FkZHJbaV0gPSBtZGV2LT5od19hZGRyW2ldOwogCiAJaWYgKGhkbV91cGRhdGVfbmV0aW5mbyhtZGV2KSA8IDApCiAJCXJldHVybjsKLQlpZiAoKHByZXZfbGlua19zdGF0ICE9IG1kZXYtPmxpbmtfc3RhdCkgfHwKLQkgICAgKHByZXZfaHdfYWRkclswXSAhPSBtZGV2LT5od19hZGRyWzBdKSB8fAotCSAgICAocHJldl9od19hZGRyWzFdICE9IG1kZXYtPmh3X2FkZHJbMV0pIHx8Ci0JICAgIChwcmV2X2h3X2FkZHJbMl0gIT0gbWRldi0+aHdfYWRkclsyXSkgfHwKLQkgICAgKHByZXZfaHdfYWRkclszXSAhPSBtZGV2LT5od19hZGRyWzNdKSB8fAotCSAgICAocHJldl9od19hZGRyWzRdICE9IG1kZXYtPmh3X2FkZHJbNF0pIHx8Ci0JICAgIChwcmV2X2h3X2FkZHJbNV0gIT0gbWRldi0+aHdfYWRkcls1XSkpCisJaWYgKHByZXZfbGlua19zdGF0ICE9IG1kZXYtPmxpbmtfc3RhdCB8fAorCSAgICBwcmV2X2h3X2FkZHJbMF0gIT0gbWRldi0+aHdfYWRkclswXSB8fAorCSAgICBwcmV2X2h3X2FkZHJbMV0gIT0gbWRldi0+aHdfYWRkclsxXSB8fAorCSAgICBwcmV2X2h3X2FkZHJbMl0gIT0gbWRldi0+aHdfYWRkclsyXSB8fAorCSAgICBwcmV2X2h3X2FkZHJbM10gIT0gbWRldi0+aHdfYWRkclszXSB8fAorCSAgICBwcmV2X2h3X2FkZHJbNF0gIT0gbWRldi0+aHdfYWRkcls0XSB8fAorCSAgICBwcmV2X2h3X2FkZHJbNV0gIT0gbWRldi0+aHdfYWRkcls1XSkKIAkJbW9zdF9kZWxpdmVyX25ldGluZm8oJm1kZXYtPmlmYWNlLCBtZGV2LT5saW5rX3N0YXQsCiAJCQkJICAgICAmbWRldi0+aHdfYWRkclswXSk7CiB9CkBAIC05MTcsMzMgKzg2MCwyMCBAQAogICovCiBzdGF0aWMgdm9pZCB3cV9jbGVhcl9oYWx0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd3Ffb2JqKQogewotCXN0cnVjdCBidWZfYW5jaG9yICphbmNob3I7Ci0Jc3RydWN0IG1vc3RfZGV2ICptZGV2OwotCXN0cnVjdCBtYm8gKm1ibzsKLQlzdHJ1Y3QgdXJiICp1cmI7Ci0JdW5zaWduZWQgaW50IGNoYW5uZWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgY2xlYXJfaG9sZF93b3JrICpjbGVhcl93b3JrID0gdG9fY2xlYXJfaG9sZF93b3JrKHdxX29iaik7CisJc3RydWN0IG1vc3RfZGV2ICptZGV2ID0gY2xlYXJfd29yay0+bWRldjsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCA9IGNsZWFyX3dvcmstPmNoYW5uZWw7CisJaW50IHBpcGUgPSBjbGVhcl93b3JrLT5waXBlOwogCi0JYW5jaG9yID0gdG9fYnVmX2FuY2hvcih3cV9vYmopOwotCXVyYiA9IGFuY2hvci0+dXJiOwotCW1ibyA9IHVyYi0+Y29udGV4dDsKLQltZGV2ID0gdG9fbWRldihtYm8tPmlmcCk7Ci0JY2hhbm5lbCA9IG1iby0+aGRtX2NoYW5uZWxfaWQ7Ci0KLQlpZiAodXNiX2NsZWFyX2hhbHQodXJiLT5kZXYsIHVyYi0+cGlwZSkpCisJbXV0ZXhfbG9jaygmbWRldi0+aW9fbXV0ZXgpOworCW1vc3Rfc3RvcF9lbnF1ZXVlKCZtZGV2LT5pZmFjZSwgY2hhbm5lbCk7CisJZnJlZV9hbmNob3JlZF9idWZmZXJzKG1kZXYsIGNoYW5uZWwsIE1CT19FX0lOVkFMKTsKKwlpZiAodXNiX2NsZWFyX2hhbHQobWRldi0+dXNiX2RldmljZSwgcGlwZSkpCiAJCWRldl93YXJuKCZtZGV2LT51c2JfZGV2aWNlLT5kZXYsICJGYWlsZWQgdG8gcmVzZXQgZW5kcG9pbnQuXG4iKTsKIAotCXVzYl9mcmVlX3VyYih1cmIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5hbmNob3JfbGlzdF9sb2NrW2NoYW5uZWxdLCBmbGFncyk7Ci0JbGlzdF9kZWwoJmFuY2hvci0+bGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tjaGFubmVsXSwgZmxhZ3MpOwotCi0JaWYgKGxpa2VseShtYm8tPmNvbXBsZXRlKSkKLQkJbWJvLT5jb21wbGV0ZShtYm8pOwotCWlmIChtZGV2LT5jb25mW2NoYW5uZWxdLmRpcmVjdGlvbiAmIE1PU1RfQ0hfVFgpCi0JCW1vc3RfcmVzdW1lX2VucXVldWUoJm1kZXYtPmlmYWNlLCBjaGFubmVsKTsKLQotCWtmcmVlKGFuY2hvcik7CisJbWRldi0+aXNfY2hhbm5lbF9oZWFsdGh5W2NoYW5uZWxdID0gdHJ1ZTsKKwltb3N0X3Jlc3VtZV9lbnF1ZXVlKCZtZGV2LT5pZmFjZSwgY2hhbm5lbCk7CisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5pb19tdXRleCk7CiB9CiAKIC8qKgpAQCAtOTU4LDcgKzg4OCw5IEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCB1c2JpZFtdID0gewogCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NNU0MsIFVTQl9ERVZfSURfQlJERyksIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU01TQywgVVNCX0RFVl9JRF9JTklDKSwgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9TTVNDLCBVU0JfREVWX0lEX09TODExMTgpLCB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1NNU0MsIFVTQl9ERVZfSURfT1M4MTExOSksIH0sCisJeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfU01TQywgVVNCX0RFVl9JRF9PUzgxMjEwKSwgfSwKIAl7IH0gLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKQEAgLTk3MCw2ICs5MDIsMTAgQEAKIAlzdHJ1Y3QgbW9zdF9kY2lfYXR0cmlidXRlIG1vc3RfZGNpX2F0dHJfIyNfbmFtZSA9IFwKIAkJX19BVFRSKF9uYW1lLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192YWx1ZSwgc3RvcmVfdmFsdWUpCiAKKyNkZWZpbmUgTU9TVF9EQ0lfV09fQVRUUihfbmFtZSkgXAorCXN0cnVjdCBtb3N0X2RjaV9hdHRyaWJ1dGUgbW9zdF9kY2lfYXR0cl8jI19uYW1lID0gXAorCQlfX0FUVFIoX25hbWUsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX3ZhbHVlKQorCiAvKioKICAqIHN0cnVjdCBtb3N0X2RjaV9hdHRyaWJ1dGUgLSB0byBhY2Nlc3MgdGhlIGF0dHJpYnV0ZXMgb2YgYSBkY2kgb2JqZWN0CiAgKiBAYXR0cjogYXR0cmlidXRlcyBvZiBhIGRjaSBvYmplY3QKQEAgLTEwNDYsNDUgKzk4Miw2OCBAQAogCWtmcmVlKGRjaV9vYmopOwogfQogCitzdHJ1Y3QgcmVncyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1MTYgcmVnOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdzIHJvX3JlZ3NbXSA9IHsKKwl7ICJuaV9zdGF0ZSIsIERSQ0lfUkVHX05JX1NUQVRFIH0sCisJeyAicGFja2V0X2JhbmR3aWR0aCIsIERSQ0lfUkVHX1BBQ0tFVF9CVyB9LAorCXsgIm5vZGVfYWRkcmVzcyIsIERSQ0lfUkVHX05PREVfQUREUiB9LAorCXsgIm5vZGVfcG9zaXRpb24iLCBEUkNJX1JFR19OT0RFX1BPUyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdzIHJ3X3JlZ3NbXSA9IHsKKwl7ICJtZXBfZmlsdGVyIiwgRFJDSV9SRUdfTUVQX0ZJTFRFUiB9LAorCXsgIm1lcF9oYXNoMCIsIERSQ0lfUkVHX0hBU0hfVEJMMCB9LAorCXsgIm1lcF9oYXNoMSIsIERSQ0lfUkVHX0hBU0hfVEJMMSB9LAorCXsgIm1lcF9oYXNoMiIsIERSQ0lfUkVHX0hBU0hfVEJMMiB9LAorCXsgIm1lcF9oYXNoMyIsIERSQ0lfUkVHX0hBU0hfVEJMMyB9LAorCXsgIm1lcF9ldWk0OF9oaSIsIERSQ0lfUkVHX0hXX0FERFJfSEkgfSwKKwl7ICJtZXBfZXVpNDhfbWkiLCBEUkNJX1JFR19IV19BRERSX01JIH0sCisJeyAibWVwX2V1aTQ4X2xvIiwgRFJDSV9SRUdfSFdfQUREUl9MTyB9LAorfTsKKworc3RhdGljIGludCBnZXRfc3RhdF9yZWdfYWRkcihjb25zdCBzdHJ1Y3QgcmVncyAqcmVncywgaW50IHNpemUsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHUxNiAqcmVnX2FkZHIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmICghc3RyY21wKG5hbWUsIHJlZ3NbaV0ubmFtZSkpIHsKKwkJCSpyZWdfYWRkciA9IHJlZ3NbaV0ucmVnOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKyNkZWZpbmUgZ2V0X3N0YXRpY19yZWdfYWRkcihyZWdzLCBuYW1lLCByZWdfYWRkcikgXAorCWdldF9zdGF0X3JlZ19hZGRyKHJlZ3MsIEFSUkFZX1NJWkUocmVncyksIG5hbWUsIHJlZ19hZGRyKQorCiBzdGF0aWMgc3NpemVfdCBzaG93X3ZhbHVlKHN0cnVjdCBtb3N0X2RjaV9vYmogKmRjaV9vYmosCiAJCQkgIHN0cnVjdCBtb3N0X2RjaV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKLQl1MTYgdG1wX3ZhbDsKKwljb25zdCBjaGFyICpuYW1lID0gYXR0ci0+YXR0ci5uYW1lOworCXUxNiB2YWw7CiAJdTE2IHJlZ19hZGRyOwogCWludCBlcnI7CiAKLQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJuaV9zdGF0ZSIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX05JX1NUQVRFOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicGFja2V0X2JhbmR3aWR0aCIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX1BBQ0tFVF9CVzsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm5vZGVfYWRkcmVzcyIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX05PREVfQUREUjsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm5vZGVfcG9zaXRpb24iKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19OT0RFX1BPUzsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9maWx0ZXIiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19NRVBfRklMVEVSOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2hhc2gwIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSEFTSF9UQkwwOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2hhc2gxIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSEFTSF9UQkwxOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2hhc2gyIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSEFTSF9UQkwyOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2hhc2gzIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSEFTSF9UQkwzOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2V1aTQ4X2hpIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSFdfQUREUl9ISTsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9ldWk0OF9taSIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hXX0FERFJfTUk7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfZXVpNDhfbG8iKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19IV19BRERSX0xPOwotCWVsc2UKLQkJcmV0dXJuIC1FSU87CisJaWYgKCFzdHJjbXAobmFtZSwgImFyYl9hZGRyZXNzIikpCisJCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwNHhcbiIsIGRjaV9vYmotPnJlZ19hZGRyKTsKIAotCWVyciA9IGRyY2lfcmRfcmVnKGRjaV9vYmotPnVzYl9kZXZpY2UsIHJlZ19hZGRyLCAmdG1wX3ZhbCk7CisJaWYgKCFzdHJjbXAobmFtZSwgImFyYl92YWx1ZSIpKQorCQlyZWdfYWRkciA9IGRjaV9vYmotPnJlZ19hZGRyOworCWVsc2UgaWYgKGdldF9zdGF0aWNfcmVnX2FkZHIocm9fcmVncywgbmFtZSwgJnJlZ19hZGRyKSAmJgorCQkgZ2V0X3N0YXRpY19yZWdfYWRkcihyd19yZWdzLCBuYW1lLCAmcmVnX2FkZHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IGRyY2lfcmRfcmVnKGRjaV9vYmotPnVzYl9kZXZpY2UsIHJlZ19hZGRyLCAmdmFsKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwNHhcbiIsIHRtcF92YWwpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUwNHhcbiIsIHZhbCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHN0b3JlX3ZhbHVlKHN0cnVjdCBtb3N0X2RjaV9vYmogKmRjaV9vYmosCkBAIC0xMDkzLDMxICsxMDUyLDI4IEBACiB7CiAJdTE2IHZhbDsKIAl1MTYgcmVnX2FkZHI7Ci0JaW50IGVycjsKKwljb25zdCBjaGFyICpuYW1lID0gYXR0ci0+YXR0ci5uYW1lOworCWludCBlcnIgPSBrc3RydG91MTYoYnVmLCAxNiwgJnZhbCk7CiAKLQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfZmlsdGVyIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfTUVQX0ZJTFRFUjsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMCIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMDsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMSIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMTsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMiIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMjsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9oYXNoMyIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hBU0hfVEJMMzsKLQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgIm1lcF9ldWk0OF9oaSIpKQotCQlyZWdfYWRkciA9IERSQ0lfUkVHX0hXX0FERFJfSEk7Ci0JZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJtZXBfZXVpNDhfbWkiKSkKLQkJcmVnX2FkZHIgPSBEUkNJX1JFR19IV19BRERSX01JOwotCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAibWVwX2V1aTQ4X2xvIikpCi0JCXJlZ19hZGRyID0gRFJDSV9SRUdfSFdfQUREUl9MTzsKLQllbHNlCi0JCXJldHVybiAtRUlPOwotCi0JZXJyID0ga3N0cnRvdTE2KGJ1ZiwgMTYsICZ2YWwpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwlpZiAoIXN0cmNtcChuYW1lLCAiYXJiX2FkZHJlc3MiKSkgeworCQlkY2lfb2JqLT5yZWdfYWRkciA9IHZhbDsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCWlmICghc3RyY21wKG5hbWUsICJhcmJfdmFsdWUiKSkgeworCQlyZWdfYWRkciA9IGRjaV9vYmotPnJlZ19hZGRyOworCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAic3luY19lcCIpKSB7CisJCXUxNiBlcCA9IHZhbDsKKworCQlyZWdfYWRkciA9IERSQ0lfUkVHX0JBU0UgKyBEUkNJX0NPTU1BTkQgKyBlcCAqIDE2OworCQl2YWwgPSAxOworCX0gZWxzZSBpZiAoZ2V0X3N0YXRpY19yZWdfYWRkcihyb19yZWdzLCBuYW1lLCAmcmVnX2FkZHIpKSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwogCWVyciA9IGRyY2lfd3JfcmVnKGRjaV9vYmotPnVzYl9kZXZpY2UsIHJlZ19hZGRyLCB2YWwpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtMTEyOSw2ICsxMDg1LDcgQEAKIHN0YXRpYyBNT1NUX0RDSV9ST19BVFRSKHBhY2tldF9iYW5kd2lkdGgpOwogc3RhdGljIE1PU1RfRENJX1JPX0FUVFIobm9kZV9hZGRyZXNzKTsKIHN0YXRpYyBNT1NUX0RDSV9ST19BVFRSKG5vZGVfcG9zaXRpb24pOworc3RhdGljIE1PU1RfRENJX1dPX0FUVFIoc3luY19lcCk7CiBzdGF0aWMgTU9TVF9EQ0lfQVRUUihtZXBfZmlsdGVyKTsKIHN0YXRpYyBNT1NUX0RDSV9BVFRSKG1lcF9oYXNoMCk7CiBzdGF0aWMgTU9TVF9EQ0lfQVRUUihtZXBfaGFzaDEpOwpAQCAtMTEzNyw2ICsxMDk0LDggQEAKIHN0YXRpYyBNT1NUX0RDSV9BVFRSKG1lcF9ldWk0OF9oaSk7CiBzdGF0aWMgTU9TVF9EQ0lfQVRUUihtZXBfZXVpNDhfbWkpOwogc3RhdGljIE1PU1RfRENJX0FUVFIobWVwX2V1aTQ4X2xvKTsKK3N0YXRpYyBNT1NUX0RDSV9BVFRSKGFyYl9hZGRyZXNzKTsKK3N0YXRpYyBNT1NUX0RDSV9BVFRSKGFyYl92YWx1ZSk7CiAKIC8qKgogICogbW9zdF9kY2lfZGVmX2F0dHJzIC0gYXJyYXkgb2YgZGVmYXVsdCBhdHRyaWJ1dGUgZmlsZXMgb2YgdGhlIGRjaSBvYmplY3QKQEAgLTExNDYsNiArMTEwNSw3IEBACiAJJm1vc3RfZGNpX2F0dHJfcGFja2V0X2JhbmR3aWR0aC5hdHRyLAogCSZtb3N0X2RjaV9hdHRyX25vZGVfYWRkcmVzcy5hdHRyLAogCSZtb3N0X2RjaV9hdHRyX25vZGVfcG9zaXRpb24uYXR0ciwKKwkmbW9zdF9kY2lfYXR0cl9zeW5jX2VwLmF0dHIsCiAJJm1vc3RfZGNpX2F0dHJfbWVwX2ZpbHRlci5hdHRyLAogCSZtb3N0X2RjaV9hdHRyX21lcF9oYXNoMC5hdHRyLAogCSZtb3N0X2RjaV9hdHRyX21lcF9oYXNoMS5hdHRyLApAQCAtMTE1NCw2ICsxMTE0LDggQEAKIAkmbW9zdF9kY2lfYXR0cl9tZXBfZXVpNDhfaGkuYXR0ciwKIAkmbW9zdF9kY2lfYXR0cl9tZXBfZXVpNDhfbWkuYXR0ciwKIAkmbW9zdF9kY2lfYXR0cl9tZXBfZXVpNDhfbG8uYXR0ciwKKwkmbW9zdF9kY2lfYXR0cl9hcmJfYWRkcmVzcy5hdHRyLAorCSZtb3N0X2RjaV9hdHRyX2FyYl92YWx1ZS5hdHRyLAogCU5VTEwsCiB9OwogCkBAIC0xMTc2LDEwICsxMTM4LDkgQEAKIHN0YXRpYyBzdHJ1Y3QKIG1vc3RfZGNpX29iaiAqY3JlYXRlX21vc3RfZGNpX29iaihzdHJ1Y3Qga29iamVjdCAqcGFyZW50KQogewotCXN0cnVjdCBtb3N0X2RjaV9vYmogKm1vc3RfZGNpOworCXN0cnVjdCBtb3N0X2RjaV9vYmogKm1vc3RfZGNpID0ga3phbGxvYyhzaXplb2YoKm1vc3RfZGNpKSwgR0ZQX0tFUk5FTCk7CiAJaW50IHJldHZhbDsKIAotCW1vc3RfZGNpID0ga3phbGxvYyhzaXplb2YoKm1vc3RfZGNpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtb3N0X2RjaSkKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTEyMTYsMjEgKzExNzcsMTcgQEAKIHN0YXRpYyBpbnQKIGhkbV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqdXNiX2lmYWNlX2Rlc2MgPSBpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1c2JfZGV2LT5kZXY7CisJc3RydWN0IG1vc3RfZGV2ICptZGV2ID0ga3phbGxvYyhzaXplb2YoKm1kZXYpLCBHRlBfS0VSTkVMKTsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1bnNpZ25lZCBpbnQgbnVtX2VuZHBvaW50czsKIAlzdHJ1Y3QgbW9zdF9jaGFubmVsX2NhcGFiaWxpdHkgKnRtcF9jYXA7Ci0Jc3RydWN0IG1vc3RfZGV2ICptZGV2OwotCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICp1c2JfaWZhY2VfZGVzYzsKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2Rlc2M7CiAJaW50IHJldCA9IDA7CiAJaW50IGVycjsKIAotCXVzYl9pZmFjZV9kZXNjID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKLQl1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOwotCWRldiA9ICZ1c2JfZGV2LT5kZXY7Ci0JbWRldiA9IGt6YWxsb2Moc2l6ZW9mKCptZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtZGV2KQogCQlnb3RvIGV4aXRfRU5PTUVNOwogCkBAIC0xMjc2LDkgKzEyMzMsOSBAQAogCWlmICghbWRldi0+ZXBfYWRkcmVzcykKIAkJZ290byBleGl0X2ZyZWUyOwogCi0JbWRldi0+YW5jaG9yX2xpc3QgPQotCQlrY2FsbG9jKG51bV9lbmRwb2ludHMsIHNpemVvZigqbWRldi0+YW5jaG9yX2xpc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1kZXYtPmFuY2hvcl9saXN0KQorCW1kZXYtPmJ1c3lfdXJicyA9CisJCWtjYWxsb2MobnVtX2VuZHBvaW50cywgc2l6ZW9mKCptZGV2LT5idXN5X3VyYnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1kZXYtPmJ1c3lfdXJicykKIAkJZ290byBleGl0X2ZyZWUzOwogCiAJdG1wX2NhcCA9IG1kZXYtPmNhcDsKQEAgLTEyOTcsMjEgKzEyNTQsMjEgQEAKIAkJdG1wX2NhcC0+bnVtX2J1ZmZlcnNfcGFja2V0ID0gQlVGX0NIQUlOX1NJWkU7CiAJCXRtcF9jYXAtPm51bV9idWZmZXJzX3N0cmVhbWluZyA9IEJVRl9DSEFJTl9TSVpFOwogCQl0bXBfY2FwLT5kYXRhX3R5cGUgPSBNT1NUX0NIX0NPTlRST0wgfCBNT1NUX0NIX0FTWU5DIHwKLQkJCQkgICAgIE1PU1RfQ0hfSVNPQ19BVlAgfCBNT1NUX0NIX1NZTkM7CisJCQkJICAgICBNT1NUX0NIX0lTT0MgfCBNT1NUX0NIX1NZTkM7CiAJCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKGVwX2Rlc2MpKQogCQkJdG1wX2NhcC0+ZGlyZWN0aW9uID0gTU9TVF9DSF9SWDsKIAkJZWxzZQogCQkJdG1wX2NhcC0+ZGlyZWN0aW9uID0gTU9TVF9DSF9UWDsKIAkJdG1wX2NhcCsrOwotCQlJTklUX0xJU1RfSEVBRCgmbWRldi0+YW5jaG9yX2xpc3RbaV0pOwotCQlzcGluX2xvY2tfaW5pdCgmbWRldi0+YW5jaG9yX2xpc3RfbG9ja1tpXSk7CisJCWluaXRfdXNiX2FuY2hvcigmbWRldi0+YnVzeV91cmJzW2ldKTsKKwkJc3Bpbl9sb2NrX2luaXQoJm1kZXYtPmNoYW5uZWxfbG9ja1tpXSk7CiAJCWVyciA9IGRyY2lfd3JfcmVnKHVzYl9kZXYsCiAJCQkJICBEUkNJX1JFR19CQVNFICsgRFJDSV9DT01NQU5EICsKIAkJCQkgIGVwX2Rlc2MtPmJFbmRwb2ludEFkZHJlc3MgKiAxNiwKIAkJCQkgIDEpOwogCQlpZiAoZXJyIDwgMCkKLQkJCXByX3dhcm4oIkRDSSBTeW5jIGZvciBFUCAlMDJ4IGZhaWxlZCIsCi0JCQkJZXBfZGVzYy0+YkVuZHBvaW50QWRkcmVzcyk7CisJCQlkZXZfd2FybihkZXYsICJEQ0kgU3luYyBmb3IgRVAgJTAyeCBmYWlsZWQiLAorCQkJCSBlcF9kZXNjLT5iRW5kcG9pbnRBZGRyZXNzKTsKIAl9CiAJZGV2X25vdGljZShkZXYsICJjbGFpbWVkIGdhZGdldDogVmVuZG9yPSU0LjR4IFByb2RJRD0lNC40eCBCdXM9JTAyeCBEZXZpY2U9JTAyeFxuIiwKIAkJICAgbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCkBAIC0xMzMyLDcgKzEyODksOSBAQAogCX0KIAogCW11dGV4X2xvY2soJm1kZXYtPmlvX211dGV4KTsKLQlpZiAobGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IFVTQl9ERVZfSURfSU5JQykgeworCWlmIChsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gVVNCX0RFVl9JRF9PUzgxMTE4IHx8CisJICAgIGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfREVWX0lEX09TODExMTkgfHwKKwkgICAgbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IFVTQl9ERVZfSURfT1M4MTIxMCkgewogCQkvKiB0aGlzIGluY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgaW5zdGFuY2UKIAkJICogb2JqZWN0IG9mIHRoZSBjb3JlCiAJCSAqLwpAQCAtMTM1MSw3ICsxMzEwLDcgQEAKIAlyZXR1cm4gMDsKIAogZXhpdF9mcmVlNDoKLQlrZnJlZShtZGV2LT5hbmNob3JfbGlzdCk7CisJa2ZyZWUobWRldi0+YnVzeV91cmJzKTsKIGV4aXRfZnJlZTM6CiAJa2ZyZWUobWRldi0+ZXBfYWRkcmVzcyk7CiBleGl0X2ZyZWUyOgpAQCAtMTM3OSw5ICsxMzM4LDggQEAKICAqLwogc3RhdGljIHZvaWQgaGRtX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKLQlzdHJ1Y3QgbW9zdF9kZXYgKm1kZXY7CisJc3RydWN0IG1vc3RfZGV2ICptZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwogCi0JbWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIAltdXRleF9sb2NrKCZtZGV2LT5pb19tdXRleCk7CiAJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwogCW1kZXYtPnVzYl9kZXZpY2UgPSBOVUxMOwpAQCAtMTM5Myw3ICsxMzUxLDcgQEAKIAlkZXN0cm95X21vc3RfZGNpX29iaihtZGV2LT5kY2kpOwogCW1vc3RfZGVyZWdpc3Rlcl9pbnRlcmZhY2UoJm1kZXYtPmlmYWNlKTsKIAotCWtmcmVlKG1kZXYtPmFuY2hvcl9saXN0KTsKKwlrZnJlZShtZGV2LT5idXN5X3VyYnMpOwogCWtmcmVlKG1kZXYtPmNhcCk7CiAJa2ZyZWUobWRldi0+Y29uZik7CiAJa2ZyZWUobWRldi0+ZXBfYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9tb3N0Y29yZS9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbW9zdC9tb3N0Y29yZS9jb3JlLmMKaW5kZXggN2M2MTlmZS4uMzI5MTA5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21vc3QvbW9zdGNvcmUvY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L21vc3Rjb3JlL2NvcmUuYwpAQCAtMzMsNyArMzMsNyBAQAogI2RlZmluZSBTVFJJTkdfU0laRQk4MAogCiBzdGF0aWMgc3RydWN0IGNsYXNzICptb3N0X2NsYXNzOwotc3RhdGljIHN0cnVjdCBkZXZpY2UgKmNsYXNzX2dsdWVfZGlyOworc3RhdGljIHN0cnVjdCBkZXZpY2UgKmNvcmVfZGV2Owogc3RhdGljIHN0cnVjdCBpZGEgbWRldl9pZDsKIHN0YXRpYyBpbnQgZHVtbXlfbnVtX2J1ZmZlcnM7CiAKQEAgLTUxLDYgKzUxLDcgQEAKIAl1MTYgY2hhbm5lbF9pZDsKIAlib29sIGlzX3BvaXNvbmVkOwogCXN0cnVjdCBtdXRleCBzdGFydF9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggbnFfbXV0ZXg7IC8qIG5xIHRocmVhZCBzeW5jaHJvbml6YXRpb24gKi8KIAlpbnQgaXNfc3RhcnZpbmc7CiAJc3RydWN0IG1vc3RfaW50ZXJmYWNlICppZmFjZTsKIAlzdHJ1Y3QgbW9zdF9pbnN0X29iaiAqaW5zdDsKQEAgLTgyLDEwICs4MywxMyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJaW50IG1vc3RfY2hfZGF0YV90eXBlOwogCWNoYXIgKm5hbWU7Ci19IGNoX2RhdGFfdHlwZVtdID0geyB7IE1PU1RfQ0hfQ09OVFJPTCwgImNvbnRyb2xcbiIgfSwKK30gY2hfZGF0YV90eXBlW10gPSB7CisJeyBNT1NUX0NIX0NPTlRST0wsICJjb250cm9sXG4iIH0sCiAJeyBNT1NUX0NIX0FTWU5DLCAiYXN5bmNcbiIgfSwKIAl7IE1PU1RfQ0hfU1lOQywgInN5bmNcbiIgfSwKLQl7IE1PU1RfQ0hfSVNPQ19BVlAsICJpc29jX2F2cFxuIn0gfTsKKwl7IE1PU1RfQ0hfSVNPQywgImlzb2NcbiJ9LAorCXsgTU9TVF9DSF9JU09DLCAiaXNvY19hdnBcbiJ9LAorfTsKIAogI2RlZmluZSB0b19pbnN0X29iaihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IG1vc3RfaW5zdF9vYmosIGtvYmopCiAKQEAgLTI2MCwxMSArMjY0LDExIEBACiAKIAlzdHJjcHkoYnVmLCAiIik7CiAJaWYgKGMtPmlmYWNlLT5jaGFubmVsX3ZlY3RvcltpXS5kaXJlY3Rpb24gJiBNT1NUX0NIX1JYKQotCQlzdHJjYXQoYnVmLCAiZGlyX3J4ICIpOworCQlzdHJjYXQoYnVmLCAicnggIik7CiAJaWYgKGMtPmlmYWNlLT5jaGFubmVsX3ZlY3RvcltpXS5kaXJlY3Rpb24gJiBNT1NUX0NIX1RYKQotCQlzdHJjYXQoYnVmLCAiZGlyX3R4ICIpOworCQlzdHJjYXQoYnVmLCAidHggIik7CiAJc3RyY2F0KGJ1ZiwgIlxuIik7Ci0JcmV0dXJuIHN0cmxlbihidWYpICsgMTsKKwlyZXR1cm4gc3RybGVuKGJ1Zik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfYXZhaWxhYmxlX2RhdGF0eXBlcyhzdHJ1Y3QgbW9zdF9jX29iaiAqYywKQEAgLTI4MCwxMCArMjg0LDEwIEBACiAJCXN0cmNhdChidWYsICJhc3luYyAiKTsKIAlpZiAoYy0+aWZhY2UtPmNoYW5uZWxfdmVjdG9yW2ldLmRhdGFfdHlwZSAmIE1PU1RfQ0hfU1lOQykKIAkJc3RyY2F0KGJ1ZiwgInN5bmMgIik7Ci0JaWYgKGMtPmlmYWNlLT5jaGFubmVsX3ZlY3RvcltpXS5kYXRhX3R5cGUgJiBNT1NUX0NIX0lTT0NfQVZQKQotCQlzdHJjYXQoYnVmLCAiaXNvY19hdnAgIik7CisJaWYgKGMtPmlmYWNlLT5jaGFubmVsX3ZlY3RvcltpXS5kYXRhX3R5cGUgJiBNT1NUX0NIX0lTT0MpCisJCXN0cmNhdChidWYsICJpc29jICIpOwogCXN0cmNhdChidWYsICJcbiIpOwotCXJldHVybiBzdHJsZW4oYnVmKSArIDE7CisJcmV0dXJuIHN0cmxlbihidWYpOwogfQogCiBzdGF0aWMKQEAgLTM5MSw5ICszOTUsOSBAQAogCQkJCSAgY2hhciAqYnVmKQogewogCWlmIChjLT5jZmcuZGlyZWN0aW9uICYgTU9TVF9DSF9UWCkKLQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiZGlyX3R4XG4iKTsKKwkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAidHhcbiIpOwogCWVsc2UgaWYgKGMtPmNmZy5kaXJlY3Rpb24gJiBNT1NUX0NIX1JYKQotCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJkaXJfcnhcbiIpOworCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICJyeFxuIik7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAidW5jb25maWd1cmVkXG4iKTsKIH0KIApAQCAtNDA0LDggKzQwOCwxMiBAQAogewogCWlmICghc3RyY21wKGJ1ZiwgImRpcl9yeFxuIikpIHsKIAkJYy0+Y2ZnLmRpcmVjdGlvbiA9IE1PU1RfQ0hfUlg7CisJfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgInJ4XG4iKSkgeworCQljLT5jZmcuZGlyZWN0aW9uID0gTU9TVF9DSF9SWDsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAiZGlyX3R4XG4iKSkgewogCQljLT5jZmcuZGlyZWN0aW9uID0gTU9TVF9DSF9UWDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAidHhcbiIpKSB7CisJCWMtPmNmZy5kaXJlY3Rpb24gPSBNT1NUX0NIX1RYOwogCX0gZWxzZSB7CiAJCXByX2luZm8oIldBUk46IGludmFsaWQgYXR0cmlidXRlIHNldHRpbmdzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC04NDcsNyArODU1LDIzIEBACiAJCQkgICAgIHN0cnVjdCBtb3N0X2FpbV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgIGNoYXIgKmJ1ZikKIHsKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlc1xuIiwgYWltX29iai0+YWRkX2xpbmspOworCXN0cnVjdCBtb3N0X2Nfb2JqICpjOworCXN0cnVjdCBtb3N0X2luc3Rfb2JqICppOworCWludCBvZmZzID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmluc3RhbmNlX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaS0+Y2hhbm5lbF9saXN0LCBsaXN0KSB7CisJCQlpZiAoYy0+YWltMC5wdHIgPT0gYWltX29iai0+ZHJpdmVyIHx8CisJCQkgICAgYy0+YWltMS5wdHIgPT0gYWltX29iai0+ZHJpdmVyKSB7CisJCQkJb2ZmcyArPSBzbnByaW50ZihidWYgKyBvZmZzLCBQQUdFX1NJWkUgLSBvZmZzLAorCQkJCQkJICIlczolc1xuIiwKKwkJCQkJCSBrb2JqZWN0X25hbWUoJmktPmtvYmopLAorCQkJCQkJIGtvYmplY3RfbmFtZSgmYy0+a29iaikpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIG9mZnM7CiB9CiAKIC8qKgpAQCAtMTEzMSwxOCArMTE1NSwxOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmZpZm9fbG9jaywgZmxhZ3MpOwogfQogCi1zdGF0aWMgc3RydWN0IG1ibyAqZ2V0X2hkbV9tYm8oc3RydWN0IG1vc3RfY19vYmogKmMpCitzdGF0aWMgYm9vbCBoZG1fbWJvX3JlYWR5KHN0cnVjdCBtb3N0X2Nfb2JqICpjKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IG1ibyAqbWJvOworCWJvb2wgZW1wdHk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+Zmlmb19sb2NrLCBmbGFncyk7Ci0JaWYgKGMtPmVucXVldWVfaGFsdCB8fCBsaXN0X2VtcHR5KCZjLT5oYWx0X2ZpZm8pKQotCQltYm8gPSBOVUxMOwotCWVsc2UKLQkJbWJvID0gbGlzdF9wb3BfbWJvKCZjLT5oYWx0X2ZpZm8pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmZpZm9fbG9jaywgZmxhZ3MpOwotCXJldHVybiBtYm87CisJaWYgKGMtPmVucXVldWVfaGFsdCkKKwkJcmV0dXJuIGZhbHNlOworCisJc3Bpbl9sb2NrX2lycSgmYy0+Zmlmb19sb2NrKTsKKwllbXB0eSA9IGxpc3RfZW1wdHkoJmMtPmhhbHRfZmlmbyk7CisJc3Bpbl91bmxvY2tfaXJxKCZjLT5maWZvX2xvY2spOworCisJcmV0dXJuICFlbXB0eTsKIH0KIAogc3RhdGljIHZvaWQgbnFfaGRtX21ibyhzdHJ1Y3QgbWJvICptYm8pCkBAIC0xMTYwLDIwICsxMTg0LDMyIEBACiB7CiAJc3RydWN0IG1vc3RfY19vYmogKmMgPSBkYXRhOwogCXN0cnVjdCBtYm8gKm1ibzsKKwlpbnQgcmV0OwogCXR5cGVvZihjLT5pZmFjZS0+ZW5xdWV1ZSkgZW5xdWV1ZSA9IGMtPmlmYWNlLT5lbnF1ZXVlOwogCiAJd2hpbGUgKGxpa2VseSgha3RocmVhZF9zaG91bGRfc3RvcCgpKSkgewogCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYy0+aGRtX2ZpZm9fd3EsCi0JCQkJCSAobWJvID0gZ2V0X2hkbV9tYm8oYykpIHx8CisJCQkJCSBoZG1fbWJvX3JlYWR5KGMpIHx8CiAJCQkJCSBrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwogCi0JCWlmICh1bmxpa2VseSghbWJvKSkKKwkJbXV0ZXhfbG9jaygmYy0+bnFfbXV0ZXgpOworCQlzcGluX2xvY2tfaXJxKCZjLT5maWZvX2xvY2spOworCQlpZiAodW5saWtlbHkoYy0+ZW5xdWV1ZV9oYWx0IHx8IGxpc3RfZW1wdHkoJmMtPmhhbHRfZmlmbykpKSB7CisJCQlzcGluX3VubG9ja19pcnEoJmMtPmZpZm9fbG9jayk7CisJCQltdXRleF91bmxvY2soJmMtPm5xX211dGV4KTsKIAkJCWNvbnRpbnVlOworCQl9CisKKwkJbWJvID0gbGlzdF9wb3BfbWJvKCZjLT5oYWx0X2ZpZm8pOworCQlzcGluX3VubG9ja19pcnEoJmMtPmZpZm9fbG9jayk7CiAKIAkJaWYgKGMtPmNmZy5kaXJlY3Rpb24gPT0gTU9TVF9DSF9SWCkKIAkJCW1iby0+YnVmZmVyX2xlbmd0aCA9IGMtPmNmZy5idWZmZXJfc2l6ZTsKIAotCQlpZiAodW5saWtlbHkoZW5xdWV1ZShtYm8tPmlmcCwgbWJvLT5oZG1fY2hhbm5lbF9pZCwgbWJvKSkpIHsKKwkJcmV0ID0gZW5xdWV1ZShtYm8tPmlmcCwgbWJvLT5oZG1fY2hhbm5lbF9pZCwgbWJvKTsKKwkJbXV0ZXhfdW5sb2NrKCZjLT5ucV9tdXRleCk7CisKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJCXByX2VycigiaGRtIGVucXVldWUgZmFpbGVkXG4iKTsKIAkJCW5xX2hkbV9tYm8obWJvKTsKIAkJCWMtPmhkbV9lbnF1ZXVlX3Rhc2sgPSBOVUxMOwpAQCAtMTI5NCwxNyArMTMzMCwxNCBAQAogLyoqCiAgKiBtb3N0X3N1Ym1pdF9tYm8gLSBzdWJtaXRzIGFuIE1CTyB0byBmaWZvCiAgKiBAbWJvOiBwb2ludGVyIHRvIHRoZSBNQk8KLSAqCiAgKi8KLWludCBtb3N0X3N1Ym1pdF9tYm8oc3RydWN0IG1ibyAqbWJvKQordm9pZCBtb3N0X3N1Ym1pdF9tYm8oc3RydWN0IG1ibyAqbWJvKQogewotCWlmICh1bmxpa2VseSgoIW1ibykgfHwgKCFtYm8tPmNvbnRleHQpKSkgewotCQlwcl9lcnIoIkJhZCBNQk8gb3IgbWlzc2luZyBjaGFubmVsIHJlZmVyZW5jZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlpZiAoV0FSTl9PTkNFKCFtYm8gfHwgIW1iby0+Y29udGV4dCwKKwkJICAgICAgImJhZCBtYm8gb3IgbWlzc2luZyBjaGFubmVsIHJlZmVyZW5jZVxuIikpCisJCXJldHVybjsKIAogCW5xX2hkbV9tYm8obWJvKTsKLQlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1vc3Rfc3VibWl0X21ibyk7CiAKQEAgLTE0NjgsMTAgKzE1MDEsOCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGF0b21pY19zdWJfYW5kX3Rlc3QoMSwgJmMtPm1ib19ucV9sZXZlbCkpIHsKLQkJcHJfaW5mbygiV0FSTjogcnggZGV2aWNlIG91dCBvZiBidWZmZXJzXG4iKTsKKwlpZiAoYXRvbWljX3N1Yl9hbmRfdGVzdCgxLCAmYy0+bWJvX25xX2xldmVsKSkKIAkJYy0+aXNfc3RhcnZpbmcgPSAxOwotCX0KIAogCWlmIChjLT5haW0wLnJlZnMgJiYgYy0+YWltMC5wdHItPnJ4X2NvbXBsZXRpb24gJiYKIAkgICAgYy0+YWltMC5wdHItPnJ4X2NvbXBsZXRpb24obWJvKSA9PSAwKQpAQCAtMTc2MSw2ICsxNzkyLDcgQEAKIAkJaW5pdF9jb21wbGV0aW9uKCZjLT5jbGVhbnVwKTsKIAkJYXRvbWljX3NldCgmYy0+bWJvX3JlZiwgMCk7CiAJCW11dGV4X2luaXQoJmMtPnN0YXJ0X211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmYy0+bnFfbXV0ZXgpOwogCQlsaXN0X2FkZF90YWlsKCZjLT5saXN0LCAmaW5zdC0+Y2hhbm5lbF9saXN0KTsKIAl9CiAJcHJfaW5mbygicmVnaXN0ZXJlZCBuZXcgTU9TVCBkZXZpY2UgbWRldiVkICglcylcbiIsCkBAIC0xODI2LDggKzE4NTgsMTIgQEAKIHsKIAlzdHJ1Y3QgbW9zdF9jX29iaiAqYyA9IGdldF9jaGFubmVsX2J5X2lmYWNlKGlmYWNlLCBpZCk7CiAKLQlpZiAobGlrZWx5KGMpKQotCQljLT5lbnF1ZXVlX2hhbHQgPSB0cnVlOworCWlmICghYykKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmYy0+bnFfbXV0ZXgpOworCWMtPmVucXVldWVfaGFsdCA9IHRydWU7CisJbXV0ZXhfdW5sb2NrKCZjLT5ucV9tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtb3N0X3N0b3BfZW5xdWV1ZSk7CiAKQEAgLTE4NDMsOSArMTg3OSwxMiBAQAogewogCXN0cnVjdCBtb3N0X2Nfb2JqICpjID0gZ2V0X2NoYW5uZWxfYnlfaWZhY2UoaWZhY2UsIGlkKTsKIAotCWlmICh1bmxpa2VseSghYykpCisJaWYgKCFjKQogCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZjLT5ucV9tdXRleCk7CiAJYy0+ZW5xdWV1ZV9oYWx0ID0gZmFsc2U7CisJbXV0ZXhfdW5sb2NrKCZjLT5ucV9tdXRleCk7CiAKIAl3YWtlX3VwX2ludGVycnVwdGlibGUoJmMtPmhkbV9maWZvX3dxKTsKIH0KQEAgLTE4NzksMjIgKzE5MTgsMTkgQEAKIAkJZ290byBleGl0X2NsYXNzOwogCX0KIAotCWNsYXNzX2dsdWVfZGlyID0KLQkJZGV2aWNlX2NyZWF0ZShtb3N0X2NsYXNzLCBOVUxMLCAwLCBOVUxMLCAibW9zdGNvcmUiKTsKLQlpZiAoSVNfRVJSKGNsYXNzX2dsdWVfZGlyKSkgewotCQllcnIgPSBQVFJfRVJSKGNsYXNzX2dsdWVfZGlyKTsKKwljb3JlX2RldiA9IGRldmljZV9jcmVhdGUobW9zdF9jbGFzcywgTlVMTCwgMCwgTlVMTCwgIm1vc3Rjb3JlIik7CisJaWYgKElTX0VSUihjb3JlX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihjb3JlX2Rldik7CiAJCWdvdG8gZXhpdF9kcml2ZXI7CiAJfQogCi0JbW9zdF9haW1fa3NldCA9Ci0JCWtzZXRfY3JlYXRlX2FuZF9hZGQoImFpbXMiLCBOVUxMLCAmY2xhc3NfZ2x1ZV9kaXItPmtvYmopOworCW1vc3RfYWltX2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCJhaW1zIiwgTlVMTCwgJmNvcmVfZGV2LT5rb2JqKTsKIAlpZiAoIW1vc3RfYWltX2tzZXQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBleGl0X2NsYXNzX2NvbnRhaW5lcjsKIAl9CiAKLQltb3N0X2luc3Rfa3NldCA9Ci0JCWtzZXRfY3JlYXRlX2FuZF9hZGQoImRldmljZXMiLCBOVUxMLCAmY2xhc3NfZ2x1ZV9kaXItPmtvYmopOworCW1vc3RfaW5zdF9rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgiZGV2aWNlcyIsIE5VTEwsICZjb3JlX2Rldi0+a29iaik7CiAJaWYgKCFtb3N0X2luc3Rfa3NldCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGV4aXRfZHJpdmVyX2tzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9tb3N0Y29yZS9tb3N0Y29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL21vc3QvbW9zdGNvcmUvbW9zdGNvcmUuaAppbmRleCA2MGUwMThlLi41ZjgzMzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbW9zdC9tb3N0Y29yZS9tb3N0Y29yZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tb3N0L21vc3Rjb3JlL21vc3Rjb3JlLmgKQEAgLTU2LDcgKzU2LDcgQEAKIGVudW0gbW9zdF9jaGFubmVsX2RhdGFfdHlwZSB7CiAJTU9TVF9DSF9DT05UUk9MID0gMSA8PCAwLAogCU1PU1RfQ0hfQVNZTkMgPSAxIDw8IDEsCi0JTU9TVF9DSF9JU09DX0FWUCA9IDEgPDwgMiwKKwlNT1NUX0NIX0lTT0MgPSAxIDw8IDIsCiAJTU9TVF9DSF9TWU5DID0gMSA8PCA1LAogfTsKIApAQCAtMTEyLDcgKzExMiw3IEBACiAJdTE2IGJ1ZmZlcl9zaXplX3BhY2tldDsKIAl1MTYgbnVtX2J1ZmZlcnNfc3RyZWFtaW5nOwogCXUxNiBidWZmZXJfc2l6ZV9zdHJlYW1pbmc7Ci0JY2hhciAqbmFtZV9zdWZmaXg7CisJY29uc3QgY2hhciAqbmFtZV9zdWZmaXg7CiB9OwogCiAvKioKQEAgLTI4Nyw3ICsyODcsNyBAQAogICogQGludGZfaW5zdGFuY2UgUG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIGluc3RhbmNlIGRlc2NyaXB0aW9uLgogICovCiB2b2lkIG1vc3RfZGVyZWdpc3Rlcl9pbnRlcmZhY2Uoc3RydWN0IG1vc3RfaW50ZXJmYWNlICppZmFjZSk7Ci1pbnQgbW9zdF9zdWJtaXRfbWJvKHN0cnVjdCBtYm8gKm1ibyk7Cit2b2lkIG1vc3Rfc3VibWl0X21ibyhzdHJ1Y3QgbWJvICptYm8pOwogCiAvKioKICAqIG1vc3Rfc3RvcF9lbnF1ZXVlIC0gcHJldmVudHMgY29yZSBmcm9tIGVucXVlaW5nIE1CT3MKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jCmluZGV4IDk5NDQ1ZDAuLjU1MmE3ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL25ldGxvZ2ljL3hscl9uZXQuYwpAQCAtMTkyLDcgKzE5Miw3IEBACiAJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocGh5ZGV2LCBlY21kKTsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB4bHJfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHhscl9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X3NldHRpbmdzID0geGxyX2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzID0geGxyX3NldF9zZXR0aW5ncywKIH07CkBAIC0yNjksMTYgKzI2OSw2IEBACiAJbXNnLT5tc2czID0gMDsKIH0KIAotc3RhdGljIHZvaWQgX19tYXliZV91bnVzZWQgeGxyX3dha2V1cF9xdWV1ZSh1bnNpZ25lZCBsb25nIGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldjsKLQlzdHJ1Y3QgeGxyX25ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7Ci0Jc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IHhscl9nZXRfcGh5ZGV2KHByaXYpOwotCi0JaWYgKHBoeWRldi0+bGluaykKLQkJbmV0aWZfdHhfd2FrZV9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKG5kZXYsIHByaXYtPndha2V1cF9xKSk7Ci19Ci0KIHN0YXRpYyBuZXRkZXZfdHhfdCB4bHJfbmV0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKQEAgLTQxMyw3ICs0MDMsNyBAQAogCXJldHVybiBzdGF0czsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyB4bHJfbmV0ZGV2X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgeGxyX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuID0geGxyX25ldF9vcGVuLAogCS5uZG9fc3RvcCA9IHhscl9uZXRfc3RvcCwKIAkubmRvX3N0YXJ0X3htaXQgPSB4bHJfbmV0X3N0YXJ0X3htaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2IvS2NvbmZpZwppbmRleCAxNmVhMTdmLi4wYjhmMWQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL0tjb25maWcKQEAgLTYsNSArNiw1IEBACiAJICBOZXR3b3JrcycgcHJvZHVjdHMgaW4gdGhlIE9jdGVvbiBmYW1pbHkuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIG9jdGVvbi11c2IuCisJICB3aWxsIGJlIGNhbGxlZCBvY3Rlb24taGNkLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmMKaW5kZXggMTc0NDJiMy4uOWE3ODU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuYwpAQCAtMzI5Miw3ICszMjkyLDYgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdXNiLT5sb2NrLCBmbGFncyk7CiAJcG9ydF9zdGF0dXMgPSBjdm14X3VzYl9nZXRfc3RhdHVzKHVzYik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNiLT5sb2NrLCBmbGFncyk7Ci0JYnVmWzBdID0gMDsKIAlidWZbMF0gPSBwb3J0X3N0YXR1cy5jb25uZWN0X2NoYW5nZSA8PCAxOwogCiAJcmV0dXJuIGJ1ZlswXSAhPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYwppbmRleCBlMTNhNGFiLi42OTFlNGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uYwpAQCAtMzQsNDggKzM0LDIzIEBACiAJc3RybGNweShpbmZvLT5idXNfaW5mbywgIkJ1aWx0aW4iLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAotc3RhdGljIGludCBjdm1fb2N0X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChwcml2LT5waHlkZXYpCi0JCXJldHVybiBwaHlfZXRodG9vbF9nc2V0KHByaXYtPnBoeWRldiwgY21kKTsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGN2bV9vY3Rfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQotewotCXN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JaWYgKHByaXYtPnBoeWRldikKLQkJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQocHJpdi0+cGh5ZGV2LCBjbWQpOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KIHN0YXRpYyBpbnQgY3ZtX29jdF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0KIAlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlpZiAocHJpdi0+cGh5ZGV2KQotCQlyZXR1cm4gcGh5X3N0YXJ0X2FuZWcocHJpdi0+cGh5ZGV2KTsKKwlpZiAoZGV2LT5waHlkZXYpCisJCXJldHVybiBwaHlfc3RhcnRfYW5lZyhkZXYtPnBoeWRldik7CiAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAogY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGN2bV9vY3RfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvID0gY3ZtX29jdF9nZXRfZHJ2aW5mbywKLQkuZ2V0X3NldHRpbmdzID0gY3ZtX29jdF9nZXRfc2V0dGluZ3MsCi0JLnNldF9zZXR0aW5ncyA9IGN2bV9vY3Rfc2V0X3NldHRpbmdzLAogCS5ud2F5X3Jlc2V0ID0gY3ZtX29jdF9ud2F5X3Jlc2V0LAogCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9saW5rX2tzZXR0aW5ncyA9IHBoeV9ldGh0b29sX2dldF9saW5rX2tzZXR0aW5ncywKKwkuc2V0X2xpbmtfa3NldHRpbmdzID0gcGh5X2V0aHRvb2xfc2V0X2xpbmtfa3NldHRpbmdzLAogfTsKIAogLyoqCkBAIC04OCwxNSArNjMsMTMgQEAKICAqLwogaW50IGN2bV9vY3RfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKIHsKLQlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghcHJpdi0+cGh5ZGV2KQorCWlmICghZGV2LT5waHlkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHBoeV9taWlfaW9jdGwocHJpdi0+cGh5ZGV2LCBycSwgY21kKTsKKwlyZXR1cm4gcGh5X21paV9pb2N0bChkZXYtPnBoeWRldiwgcnEsIGNtZCk7CiB9CiAKIHZvaWQgY3ZtX29jdF9ub3RlX2NhcnJpZXIoc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiwKQEAgLTExOSw5ICs5Miw5IEBACiAJY3ZteF9oZWxwZXJfbGlua19pbmZvX3QgbGlua19pbmZvOwogCiAJbGlua19pbmZvLnU2NAkJPSAwOwotCWxpbmtfaW5mby5zLmxpbmtfdXAJPSBwcml2LT5waHlkZXYtPmxpbmsgPyAxIDogMDsKLQlsaW5rX2luZm8ucy5mdWxsX2R1cGxleCA9IHByaXYtPnBoeWRldi0+ZHVwbGV4ID8gMSA6IDA7Ci0JbGlua19pbmZvLnMuc3BlZWQJPSBwcml2LT5waHlkZXYtPnNwZWVkOworCWxpbmtfaW5mby5zLmxpbmtfdXAJPSBkZXYtPnBoeWRldi0+bGluayA/IDEgOiAwOworCWxpbmtfaW5mby5zLmZ1bGxfZHVwbGV4ID0gZGV2LT5waHlkZXYtPmR1cGxleCA/IDEgOiAwOworCWxpbmtfaW5mby5zLnNwZWVkCT0gZGV2LT5waHlkZXYtPnNwZWVkOwogCXByaXYtPmxpbmtfaW5mbwkJPSBsaW5rX2luZm8udTY0OwogCiAJLyoKQEAgLTEzMCw4ICsxMDMsOCBAQAogCWlmIChwcml2LT5wb2xsKQogCQlwcml2LT5wb2xsKGRldik7CiAKLQlpZiAocHJpdi0+bGFzdF9saW5rICE9IHByaXYtPnBoeWRldi0+bGluaykgewotCQlwcml2LT5sYXN0X2xpbmsgPSBwcml2LT5waHlkZXYtPmxpbms7CisJaWYgKHByaXYtPmxhc3RfbGluayAhPSBkZXYtPnBoeWRldi0+bGluaykgeworCQlwcml2LT5sYXN0X2xpbmsgPSBkZXYtPnBoeWRldi0+bGluazsKIAkJY3ZteF9oZWxwZXJfbGlua19zZXQocHJpdi0+cG9ydCwgbGlua19pbmZvKTsKIAkJY3ZtX29jdF9ub3RlX2NhcnJpZXIocHJpdiwgbGlua19pbmZvKTsKIAl9CkBAIC0xNTEsOSArMTI0LDggQEAKIAogCXByaXYtPnBvbGwgPSBOVUxMOwogCi0JaWYgKHByaXYtPnBoeWRldikKLQkJcGh5X2Rpc2Nvbm5lY3QocHJpdi0+cGh5ZGV2KTsKLQlwcml2LT5waHlkZXYgPSBOVUxMOworCWlmIChkZXYtPnBoeWRldikKKwkJcGh5X2Rpc2Nvbm5lY3QoZGV2LT5waHlkZXYpOwogCiAJaWYgKHByaXYtPmxhc3RfbGluaykgewogCQlsaW5rX2luZm8udTY0ID0gMDsKQEAgLTE3Niw2ICsxNDgsNyBAQAogewogCXN0cnVjdCBvY3Rlb25fZXRoZXJuZXQgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGh5X25vZGU7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IE5VTEw7CiAKIAlpZiAoIXByaXYtPm9mX25vZGUpCiAJCWdvdG8gbm9fcGh5OwpAQCAtMTkzLDE0ICsxNjYsMTUgQEAKIAlpZiAoIXBoeV9ub2RlKQogCQlnb3RvIG5vX3BoeTsKIAotCXByaXYtPnBoeWRldiA9IG9mX3BoeV9jb25uZWN0KGRldiwgcGh5X25vZGUsIGN2bV9vY3RfYWRqdXN0X2xpbmssIDAsCi0JCQkJICAgICAgUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUkpOworCXBoeWRldiA9IG9mX3BoeV9jb25uZWN0KGRldiwgcGh5X25vZGUsIGN2bV9vY3RfYWRqdXN0X2xpbmssIDAsCisJCQkJUEhZX0lOVEVSRkFDRV9NT0RFX0dNSUkpOworCW9mX25vZGVfcHV0KHBoeV9ub2RlKTsKIAotCWlmICghcHJpdi0+cGh5ZGV2KQorCWlmICghcGh5ZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXByaXYtPmxhc3RfbGluayA9IDA7Ci0JcGh5X3N0YXJ0X2FuZWcocHJpdi0+cGh5ZGV2KTsKKwlwaHlfc3RhcnRfYW5lZyhwaHlkZXYpOwogCiAJcmV0dXJuIDA7CiBub19waHk6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJnbWlpLmMKaW5kZXggOTFiMTQ4Yy4uNGU3MzA0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yZ21paS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcmdtaWkuYwpAQCAtMTE3LDcgKzExNywxMCBAQAogCWN2bXhfaGVscGVyX2xpbmtfaW5mb190IGxpbmtfaW5mbzsKIAlib29sIHN0YXR1c19jaGFuZ2U7CiAKLQlsaW5rX2luZm8gPSBjdm14X2hlbHBlcl9saW5rX2F1dG9jb25mKHByaXYtPnBvcnQpOworCWxpbmtfaW5mbyA9IGN2bXhfaGVscGVyX2xpbmtfZ2V0KHByaXYtPnBvcnQpOworCWlmIChwcml2LT5saW5rX2luZm8gIT0gbGlua19pbmZvLnU2NCAmJgorCSAgICBjdm14X2hlbHBlcl9saW5rX3NldChwcml2LT5wb3J0LCBsaW5rX2luZm8pKQorCQlsaW5rX2luZm8udTY0ID0gcHJpdi0+bGlua19pbmZvOwogCXN0YXR1c19jaGFuZ2UgPSBwcml2LT5saW5rX2luZm8gIT0gbGlua19pbmZvLnU2NDsKIAlwcml2LT5saW5rX2luZm8gPSBsaW5rX2luZm8udTY0OwogCkBAIC0xNDUsNyArMTQ4LDcgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHByaXYtPnBoeWRldikgeworCWlmIChkZXYtPnBoeWRldikgewogCQkvKgogCQkgKiBJbiBwaHlkZXYgbW9kZSwgd2UgbmVlZCBzdGlsbCBwZXJpb2RpYyBwb2xsaW5nIGZvciB0aGUKIAkJICogcHJlYW1ibGUgZXJyb3IgY2hlY2tpbmcsIGFuZCB3ZSBhbHNvIG5lZWQgdG8gY2FsbCB0aGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXJ4LmMKaW5kZXggYTEwZmUzYS4uZjA5MDBkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtcnguYwpAQCAtNDMsMjEgKzQzLDI3IEBACiAKICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtZ214eC1kZWZzLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgbmFwaV9zdHJ1Y3QgY3ZtX29jdF9uYXBpOworc3RhdGljIGF0b21pY190IG9jdF9yeF9yZWFkeSA9IEFUT01JQ19JTklUKDApOworCitzdGF0aWMgc3RydWN0IG9jdF9yeF9ncm91cCB7CisJaW50IGlycTsKKwlpbnQgZ3JvdXA7CisJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7Cit9IG9jdF9yeF9ncm91cFsxNl07CiAKIC8qKgogICogY3ZtX29jdF9kb19pbnRlcnJ1cHQgLSBpbnRlcnJ1cHQgaGFuZGxlci4KLSAqIEBjcGw6IEludGVycnVwdCBudW1iZXIuIFVudXNlZAotICogQGRldl9pZDogQ29va2llIHRvIGlkZW50aWZ5IHRoZSBkZXZpY2UuIFVudXNlZAorICogQGlycTogSW50ZXJydXB0IG51bWJlci4KKyAqIEBuYXBpX2lkOiBDb29raWUgdG8gaWRlbnRpZnkgdGhlIE5BUEkgaW5zdGFuY2UuCiAgKgogICogVGhlIGludGVycnVwdCBvY2N1cnMgd2hlbmV2ZXIgdGhlIFBPVyBoYXMgcGFja2V0cyBpbiBvdXIgZ3JvdXAuCiAgKgogICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgY3ZtX29jdF9kb19pbnRlcnJ1cHQoaW50IGNwbCwgdm9pZCAqZGV2X2lkKQorc3RhdGljIGlycXJldHVybl90IGN2bV9vY3RfZG9faW50ZXJydXB0KGludCBpcnEsIHZvaWQgKm5hcGlfaWQpCiB7CiAJLyogRGlzYWJsZSB0aGUgSVJRIGFuZCBzdGFydCBuYXBpX3BvbGwuICovCi0JZGlzYWJsZV9pcnFfbm9zeW5jKE9DVEVPTl9JUlFfV09SS1EwICsgcG93X3JlY2VpdmVfZ3JvdXApOwotCW5hcGlfc2NoZWR1bGUoJmN2bV9vY3RfbmFwaSk7CisJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJbmFwaV9zY2hlZHVsZShuYXBpX2lkKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTE0MywxNCArMTQ5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqCi0gKiBjdm1fb2N0X25hcGlfcG9sbCAtIHRoZSBOQVBJIHBvbGwgZnVuY3Rpb24uCi0gKiBAbmFwaTogVGhlIE5BUEkgaW5zdGFuY2UsIG9yIG51bGwgaWYgY2FsbGVkIGZyb20gY3ZtX29jdF9wb2xsX2NvbnRyb2xsZXIKLSAqIEBidWRnZXQ6IE1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMgdG8gcmVjZWl2ZS4KLSAqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFja2V0cyBwcm9jZXNzZWQuCi0gKi8KLXN0YXRpYyBpbnQgY3ZtX29jdF9uYXBpX3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLCBpbnQgYnVkZ2V0KQorc3RhdGljIGludCBjdm1fb2N0X3BvbGwoc3RydWN0IG9jdF9yeF9ncm91cCAqcnhfZ3JvdXAsIGludCBidWRnZXQpCiB7CiAJY29uc3QgaW50CWNvcmVpZCA9IGN2bXhfZ2V0X2NvcmVfbnVtKCk7CiAJdTY0CW9sZF9ncm91cF9tYXNrOwpAQCAtMTcyLDEzICsxNzEsMTMgQEAKIAlpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjY4WFgpKSB7CiAJCW9sZF9ncm91cF9tYXNrID0gY3ZteF9yZWFkX2NzcihDVk1YX1NTT19QUFhfR1JQX01TSyhjb3JlaWQpKTsKIAkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9TU09fUFBYX0dSUF9NU0soY29yZWlkKSwKLQkJCSAgICAgICAxdWxsIDw8IHBvd19yZWNlaXZlX2dyb3VwKTsKKwkJCSAgICAgICBCSVQocnhfZ3JvdXAtPmdyb3VwKSk7CiAJCWN2bXhfcmVhZF9jc3IoQ1ZNWF9TU09fUFBYX0dSUF9NU0soY29yZWlkKSk7IC8qIEZsdXNoICovCiAJfSBlbHNlIHsKIAkJb2xkX2dyb3VwX21hc2sgPSBjdm14X3JlYWRfY3NyKENWTVhfUE9XX1BQX0dSUF9NU0tYKGNvcmVpZCkpOwogCQljdm14X3dyaXRlX2NzcihDVk1YX1BPV19QUF9HUlBfTVNLWChjb3JlaWQpLAogCQkJICAgICAgIChvbGRfZ3JvdXBfbWFzayAmIH4weEZGRkZ1bGwpIHwKLQkJCSAgICAgICAxIDw8IHBvd19yZWNlaXZlX2dyb3VwKTsKKwkJCSAgICAgICBCSVQocnhfZ3JvdXAtPmdyb3VwKSk7CiAJfQogCiAJaWYgKFVTRV9BU1lOQ19JT0JETUEpIHsKQEAgLTIwMywxNSArMjAyLDE1IEBACiAJCWlmICghd29yaykgewogCQkJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ042OFhYKSkgewogCQkJCWN2bXhfd3JpdGVfY3NyKENWTVhfU1NPX1dRX0lRX0RJUywKLQkJCQkJICAgICAgIDF1bGwgPDwgcG93X3JlY2VpdmVfZ3JvdXApOworCQkJCQkgICAgICAgQklUKHJ4X2dyb3VwLT5ncm91cCkpOwogCQkJCWN2bXhfd3JpdGVfY3NyKENWTVhfU1NPX1dRX0lOVCwKLQkJCQkJICAgICAgIDF1bGwgPDwgcG93X3JlY2VpdmVfZ3JvdXApOworCQkJCQkgICAgICAgQklUKHJ4X2dyb3VwLT5ncm91cCkpOwogCQkJfSBlbHNlIHsKIAkJCQl1bmlvbiBjdm14X3Bvd193cV9pbnQgd3FfaW50OwogCiAJCQkJd3FfaW50LnU2NCA9IDA7Ci0JCQkJd3FfaW50LnMuaXFfZGlzID0gMSA8PCBwb3dfcmVjZWl2ZV9ncm91cDsKLQkJCQl3cV9pbnQucy53cV9pbnQgPSAxIDw8IHBvd19yZWNlaXZlX2dyb3VwOworCQkJCXdxX2ludC5zLmlxX2RpcyA9IEJJVChyeF9ncm91cC0+Z3JvdXApOworCQkJCXdxX2ludC5zLndxX2ludCA9IEJJVChyeF9ncm91cC0+Z3JvdXApOwogCQkJCWN2bXhfd3JpdGVfY3NyKENWTVhfUE9XX1dRX0lOVCwgd3FfaW50LnU2NCk7CiAJCQl9CiAJCQlicmVhazsKQEAgLTQxMCwxMCArNDA5LDI4IEBACiAJfQogCWN2bV9vY3RfcnhfcmVmaWxsX3Bvb2woMCk7CiAKLQlpZiAocnhfY291bnQgPCBidWRnZXQgJiYgbmFwaSkgeworCXJldHVybiByeF9jb3VudDsKK30KKworLyoqCisgKiBjdm1fb2N0X25hcGlfcG9sbCAtIHRoZSBOQVBJIHBvbGwgZnVuY3Rpb24uCisgKiBAbmFwaTogVGhlIE5BUEkgaW5zdGFuY2UuCisgKiBAYnVkZ2V0OiBNYXhpbXVtIG51bWJlciBvZiBwYWNrZXRzIHRvIHJlY2VpdmUuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcHJvY2Vzc2VkLgorICovCitzdGF0aWMgaW50IGN2bV9vY3RfbmFwaV9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKK3sKKwlzdHJ1Y3Qgb2N0X3J4X2dyb3VwICpyeF9ncm91cCA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3Qgb2N0X3J4X2dyb3VwLAorCQkJCQkJICAgICBuYXBpKTsKKwlpbnQgcnhfY291bnQ7CisKKwlyeF9jb3VudCA9IGN2bV9vY3RfcG9sbChyeF9ncm91cCwgYnVkZ2V0KTsKKworCWlmIChyeF9jb3VudCA8IGJ1ZGdldCkgewogCQkvKiBObyBtb3JlIHdvcmsgKi8KIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQkJZW5hYmxlX2lycShPQ1RFT05fSVJRX1dPUktRMCArIHBvd19yZWNlaXZlX2dyb3VwKTsKKwkJZW5hYmxlX2lycShyeF9ncm91cC0+aXJxKTsKIAl9CiAJcmV0dXJuIHJ4X2NvdW50OwogfQpAQCAtNDI3LDcgKzQ0NCwxNyBAQAogICovCiB2b2lkIGN2bV9vY3RfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JY3ZtX29jdF9uYXBpX3BvbGwoTlVMTCwgMTYpOworCWludCBpOworCisJaWYgKCFhdG9taWNfcmVhZCgmb2N0X3J4X3JlYWR5KSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob2N0X3J4X2dyb3VwKTsgaSsrKSB7CisJCWlmICghKHBvd19yZWNlaXZlX2dyb3VwcyAmIEJJVChpKSkpCisJCQljb250aW51ZTsKKworCQljdm1fb2N0X3BvbGwoJm9jdF9yeF9ncm91cFtpXSwgMTYpOworCX0KIH0KICNlbmRpZgogCkBAIC00NDYsNTQgKzQ3Myw4MCBAQAogCWlmICghZGV2X2Zvcl9uYXBpKQogCQlwYW5pYygiTm8gbmV0X2RldmljZXMgd2VyZSBhbGxvY2F0ZWQuIik7CiAKLQluZXRpZl9uYXBpX2FkZChkZXZfZm9yX25hcGksICZjdm1fb2N0X25hcGksIGN2bV9vY3RfbmFwaV9wb2xsLAotCQkgICAgICAgcnhfbmFwaV93ZWlnaHQpOwotCW5hcGlfZW5hYmxlKCZjdm1fb2N0X25hcGkpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9jdF9yeF9ncm91cCk7IGkrKykgeworCQlpbnQgcmV0OwogCi0JLyogUmVnaXN0ZXIgYW4gSVJRIGhhbmRsZXIgdG8gcmVjZWl2ZSBQT1cgaW50ZXJydXB0cyAqLwotCWkgPSByZXF1ZXN0X2lycShPQ1RFT05fSVJRX1dPUktRMCArIHBvd19yZWNlaXZlX2dyb3VwLAotCQkJY3ZtX29jdF9kb19pbnRlcnJ1cHQsIDAsICJFdGhlcm5ldCIsIGN2bV9vY3RfZGV2aWNlKTsKKwkJaWYgKCEocG93X3JlY2VpdmVfZ3JvdXBzICYgQklUKGkpKSkKKwkJCWNvbnRpbnVlOwogCi0JaWYgKGkpCi0JCXBhbmljKCJDb3VsZCBub3QgYWNxdWlyZSBFdGhlcm5ldCBJUlEgJWRcbiIsCi0JCSAgICAgIE9DVEVPTl9JUlFfV09SS1EwICsgcG93X3JlY2VpdmVfZ3JvdXApOworCQluZXRpZl9uYXBpX2FkZChkZXZfZm9yX25hcGksICZvY3RfcnhfZ3JvdXBbaV0ubmFwaSwKKwkJCSAgICAgICBjdm1fb2N0X25hcGlfcG9sbCwgcnhfbmFwaV93ZWlnaHQpOworCQluYXBpX2VuYWJsZSgmb2N0X3J4X2dyb3VwW2ldLm5hcGkpOwogCi0JZGlzYWJsZV9pcnFfbm9zeW5jKE9DVEVPTl9JUlFfV09SS1EwICsgcG93X3JlY2VpdmVfZ3JvdXApOworCQlvY3RfcnhfZ3JvdXBbaV0uaXJxID0gT0NURU9OX0lSUV9XT1JLUTAgKyBpOworCQlvY3RfcnhfZ3JvdXBbaV0uZ3JvdXAgPSBpOwogCi0JLyogRW5hYmxlIFBPVyBpbnRlcnJ1cHQgd2hlbiBvdXIgcG9ydCBoYXMgYXQgbGVhc3Qgb25lIHBhY2tldCAqLwotCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NONjhYWCkpIHsKLQkJdW5pb24gY3ZteF9zc29fd3FfaW50X3RocnggaW50X3RocjsKLQkJdW5pb24gY3ZteF9wb3dfd3FfaW50X3BjIGludF9wYzsKKwkJLyogUmVnaXN0ZXIgYW4gSVJRIGhhbmRsZXIgdG8gcmVjZWl2ZSBQT1cgaW50ZXJydXB0cyAqLworCQlyZXQgPSByZXF1ZXN0X2lycShvY3RfcnhfZ3JvdXBbaV0uaXJxLCBjdm1fb2N0X2RvX2ludGVycnVwdCwgMCwKKwkJCQkgICJFdGhlcm5ldCIsICZvY3RfcnhfZ3JvdXBbaV0ubmFwaSk7CisJCWlmIChyZXQpCisJCQlwYW5pYygiQ291bGQgbm90IGFjcXVpcmUgRXRoZXJuZXQgSVJRICVkXG4iLAorCQkJICAgICAgb2N0X3J4X2dyb3VwW2ldLmlycSk7CiAKLQkJaW50X3Roci51NjQgPSAwOwotCQlpbnRfdGhyLnMudGNfZW4gPSAxOwotCQlpbnRfdGhyLnMudGNfdGhyID0gMTsKLQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9TU09fV1FfSU5UX1RIUlgocG93X3JlY2VpdmVfZ3JvdXApLAotCQkJICAgICAgIGludF90aHIudTY0KTsKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKG9jdF9yeF9ncm91cFtpXS5pcnEpOwogCi0JCWludF9wYy51NjQgPSAwOwotCQlpbnRfcGMucy5wY190aHIgPSA1OwotCQljdm14X3dyaXRlX2NzcihDVk1YX1NTT19XUV9JTlRfUEMsIGludF9wYy51NjQpOwotCX0gZWxzZSB7Ci0JCXVuaW9uIGN2bXhfcG93X3dxX2ludF90aHJ4IGludF90aHI7Ci0JCXVuaW9uIGN2bXhfcG93X3dxX2ludF9wYyBpbnRfcGM7CisJCS8qIEVuYWJsZSBQT1cgaW50ZXJydXB0IHdoZW4gb3VyIHBvcnQgaGFzIGF0IGxlYXN0IG9uZSBwYWNrZXQgKi8KKwkJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ042OFhYKSkgeworCQkJdW5pb24gY3ZteF9zc29fd3FfaW50X3RocnggaW50X3RocjsKKwkJCXVuaW9uIGN2bXhfcG93X3dxX2ludF9wYyBpbnRfcGM7CiAKLQkJaW50X3Roci51NjQgPSAwOwotCQlpbnRfdGhyLnMudGNfZW4gPSAxOwotCQlpbnRfdGhyLnMudGNfdGhyID0gMTsKLQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9QT1dfV1FfSU5UX1RIUlgocG93X3JlY2VpdmVfZ3JvdXApLAotCQkJICAgICAgIGludF90aHIudTY0KTsKKwkJCWludF90aHIudTY0ID0gMDsKKwkJCWludF90aHIucy50Y19lbiA9IDE7CisJCQlpbnRfdGhyLnMudGNfdGhyID0gMTsKKwkJCWN2bXhfd3JpdGVfY3NyKENWTVhfU1NPX1dRX0lOVF9USFJYKGkpLCBpbnRfdGhyLnU2NCk7CiAKLQkJaW50X3BjLnU2NCA9IDA7Ci0JCWludF9wYy5zLnBjX3RociA9IDU7Ci0JCWN2bXhfd3JpdGVfY3NyKENWTVhfUE9XX1dRX0lOVF9QQywgaW50X3BjLnU2NCk7CisJCQlpbnRfcGMudTY0ID0gMDsKKwkJCWludF9wYy5zLnBjX3RociA9IDU7CisJCQljdm14X3dyaXRlX2NzcihDVk1YX1NTT19XUV9JTlRfUEMsIGludF9wYy51NjQpOworCQl9IGVsc2UgeworCQkJdW5pb24gY3ZteF9wb3dfd3FfaW50X3RocnggaW50X3RocjsKKwkJCXVuaW9uIGN2bXhfcG93X3dxX2ludF9wYyBpbnRfcGM7CisKKwkJCWludF90aHIudTY0ID0gMDsKKwkJCWludF90aHIucy50Y19lbiA9IDE7CisJCQlpbnRfdGhyLnMudGNfdGhyID0gMTsKKwkJCWN2bXhfd3JpdGVfY3NyKENWTVhfUE9XX1dRX0lOVF9USFJYKGkpLCBpbnRfdGhyLnU2NCk7CisKKwkJCWludF9wYy51NjQgPSAwOworCQkJaW50X3BjLnMucGNfdGhyID0gNTsKKwkJCWN2bXhfd3JpdGVfY3NyKENWTVhfUE9XX1dRX0lOVF9QQywgaW50X3BjLnU2NCk7CisJCX0KKworCQkvKiBTY2hlZHVsZSBOQVBJIG5vdy4gVGhpcyB3aWxsIGluZGlyZWN0bHkgZW5hYmxlIHRoZQorCQkgKiBpbnRlcnJ1cHQuCisJCSAqLworCQluYXBpX3NjaGVkdWxlKCZvY3RfcnhfZ3JvdXBbaV0ubmFwaSk7CiAJfQotCi0JLyogU2NoZWR1bGUgTkFQSSBub3cuIFRoaXMgd2lsbCBpbmRpcmVjdGx5IGVuYWJsZSB0aGUgaW50ZXJydXB0LiAqLwotCW5hcGlfc2NoZWR1bGUoJmN2bV9vY3RfbmFwaSk7CisJYXRvbWljX2luYygmb2N0X3J4X3JlYWR5KTsKIH0KIAogdm9pZCBjdm1fb2N0X3J4X3NodXRkb3duKHZvaWQpCiB7Ci0JbmV0aWZfbmFwaV9kZWwoJmN2bV9vY3RfbmFwaSk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvY3RfcnhfZ3JvdXApOyBpKyspIHsKKwkJaWYgKCEocG93X3JlY2VpdmVfZ3JvdXBzICYgQklUKGkpKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIERpc2FibGUgUE9XIGludGVycnVwdCAqLworCQlpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjY4WFgpKQorCQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9TU09fV1FfSU5UX1RIUlgoaSksIDApOworCQllbHNlCisJCQljdm14X3dyaXRlX2NzcihDVk1YX1BPV19XUV9JTlRfVEhSWChpKSwgMCk7CisKKwkJLyogRnJlZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KKwkJZnJlZV9pcnEob2N0X3J4X2dyb3VwW2ldLmlycSwgY3ZtX29jdF9kZXZpY2UpOworCisJCW5ldGlmX25hcGlfZGVsKCZvY3RfcnhfZ3JvdXBbaV0ubmFwaSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC11dGlsLmggYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXV0aWwuaAppbmRleCA0NWYwMjRiLi42MTdkYTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXV0aWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LXV0aWwuaApAQCAtMzIsMTIgKzMyLDEzIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IElOVEVSRkFDRShpbnQgaXBkX3BvcnQpCiB7Ci0JaW50IGludGVyZmFjZSA9IGN2bXhfaGVscGVyX2dldF9pbnRlcmZhY2VfbnVtKGlwZF9wb3J0KTsKKwlpbnQgaW50ZXJmYWNlOwogCisJaWYgKGlwZF9wb3J0ID09IENWTVhfUElQX05VTV9JTlBVVF9QT1JUUykKKwkJcmV0dXJuIDEwOworCWludGVyZmFjZSA9IGN2bXhfaGVscGVyX2dldF9pbnRlcmZhY2VfbnVtKGlwZF9wb3J0KTsKIAlpZiAoaW50ZXJmYWNlID49IDApCiAJCXJldHVybiBpbnRlcmZhY2U7Ci0JZWxzZSBpZiAoaXBkX3BvcnQgPT0gQ1ZNWF9QSVBfTlVNX0lOUFVUX1BPUlRTKQotCQlyZXR1cm4gMTA7CiAJcGFuaWMoIklsbGVnYWwgaXBkX3BvcnQgJWQgcGFzc2VkIHRvIElOVEVSRkFDRVxuIiwgaXBkX3BvcnQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMKaW5kZXggZTljZDVmMi4uZDAyZTNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQuYwpAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KIAogI2luY2x1ZGUgPG5ldC9kc3QuaD4KIApAQCAtMzUsMTcgKzM3LDE5IEBACiAjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LWZhdS5oPgogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1pcGQuaD4KICNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtaGVscGVyLmg+Ci0KKyNpbmNsdWRlIDxhc20vb2N0ZW9uL2N2bXgtYXN4eC1kZWZzLmg+CiAjaW5jbHVkZSA8YXNtL29jdGVvbi9jdm14LWdteHgtZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9vY3Rlb24vY3ZteC1zbWl4LWRlZnMuaD4KIAorI2RlZmluZSBPQ1RFT05fTUFYX01UVSA2NTM5MgorCiBzdGF0aWMgaW50IG51bV9wYWNrZXRfYnVmZmVycyA9IDEwMjQ7CiBtb2R1bGVfcGFyYW0obnVtX3BhY2tldF9idWZmZXJzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhudW1fcGFja2V0X2J1ZmZlcnMsICJcbiIKIAkiXHROdW1iZXIgb2YgcGFja2V0IGJ1ZmZlcnMgdG8gYWxsb2NhdGUgYW5kIHN0b3JlIGluIHRoZVxuIgogCSJcdEZQQS4gQnkgZGVmYXVsdCwgMTAyNCBwYWNrZXQgYnVmZmVycyBhcmUgdXNlZC5cbiIpOwogCi1pbnQgcG93X3JlY2VpdmVfZ3JvdXAgPSAxNTsKK3N0YXRpYyBpbnQgcG93X3JlY2VpdmVfZ3JvdXAgPSAxNTsKIG1vZHVsZV9wYXJhbShwb3dfcmVjZWl2ZV9ncm91cCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocG93X3JlY2VpdmVfZ3JvdXAsICJcbiIKIAkiXHRQT1cgZ3JvdXAgdG8gcmVjZWl2ZSBwYWNrZXRzIGZyb20uIEFsbCBldGhlcm5ldCBoYXJkd2FyZVxuIgpAQCAtNTMsNiArNTcsMTUgQEAKIAkiXHRncm91cC4gQWxzbyBhbnkgb3RoZXIgc29mdHdhcmUgY2FuIHN1Ym1pdCBwYWNrZXRzIHRvIHRoaXNcbiIKIAkiXHRncm91cCBmb3IgdGhlIGtlcm5lbCB0byBwcm9jZXNzLiIpOwogCitzdGF0aWMgaW50IHJlY2VpdmVfZ3JvdXBfb3JkZXI7Cittb2R1bGVfcGFyYW0ocmVjZWl2ZV9ncm91cF9vcmRlciwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocmVjZWl2ZV9ncm91cF9vcmRlciwgIlxuIgorCSJcdE9yZGVyICgwLi40KSBvZiByZWNlaXZlIGdyb3VwcyB0byB0YWtlIGludG8gdXNlLiBFdGhlcm5ldCBoYXJkd2FyZVxuIgorCSJcdHdpbGwgYmUgY29uZmlndXJlZCB0byBzZW5kIGluY29taW5nIHBhY2tldHMgdG8gbXVsdGlwbGUgUE9XXG4iCisJIlx0Z3JvdXBzLiBwb3dfcmVjZWl2ZV9ncm91cCBwYXJhbWV0ZXIgaXMgaWdub3JlZCB3aGVuIG11bHRpcGxlXG4iCisJIlx0Z3JvdXBzIGFyZSB0YWtlbiBpbnRvIHVzZSBhbmQgZ3JvdXBzIGFyZSBhbGxvY2F0ZWQgc3RhcnRpbmdcbiIKKwkiXHRmcm9tIDAuIEJ5IGRlZmF1bHQsIGEgc2luZ2xlIGdyb3VwIGlzIHVzZWQuXG4iKTsKKwogaW50IHBvd19zZW5kX2dyb3VwID0gLTE7CiBtb2R1bGVfcGFyYW0ocG93X3NlbmRfZ3JvdXAsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBvd19zZW5kX2dyb3VwLCAiXG4iCkBAIC04Niw2ICs5OSw4IEBACiBtb2R1bGVfcGFyYW0ocnhfbmFwaV93ZWlnaHQsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJ4X25hcGlfd2VpZ2h0LCAiVGhlIE5BUEkgV0VJR0hUIHBhcmFtZXRlci4iKTsKIAorLyogTWFzayBpbmRpY2F0aW5nIHdoaWNoIHJlY2VpdmUgZ3JvdXBzIGFyZSBpbiB1c2UuICovCitpbnQgcG93X3JlY2VpdmVfZ3JvdXBzOwogCiAvKgogICogY3ZtX29jdF9wb2xsX3F1ZXVlX3N0b3BwaW5nIC0gZmxhZyB0byBpbmRpY2F0ZSBwb2xsaW5nIHNob3VsZCBzdG9wLgpAQCAtMjM3LDIxICsyNTIsMjIgQEAKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaW50ZXJmYWNlID0gSU5URVJGQUNFKHByaXYtPnBvcnQpOwotCWludCBpbmRleCA9IElOREVYKHByaXYtPnBvcnQpOwotI2lmIGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVEpIHx8IGRlZmluZWQoQ09ORklHX1ZMQU5fODAyMVFfTU9EVUxFKQotCWludCB2bGFuX2J5dGVzID0gNDsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19WTEFOXzgwMjFRKQorCWludCB2bGFuX2J5dGVzID0gVkxBTl9ITEVOOwogI2Vsc2UKIAlpbnQgdmxhbl9ieXRlcyA9IDA7CiAjZW5kaWYKKwlpbnQgbXR1X292ZXJoZWFkID0gRVRIX0hMRU4gKyBFVEhfRkNTX0xFTiArIHZsYW5fYnl0ZXM7CiAKIAkvKgogCSAqIExpbWl0IHRoZSBNVFUgdG8gbWFrZSBzdXJlIHRoZSBldGhlcm5ldCBwYWNrZXRzIGFyZSBiZXR3ZWVuCiAJICogNjQgYnl0ZXMgYW5kIDY1NTM1IGJ5dGVzLgogCSAqLwotCWlmICgobmV3X210dSArIDE0ICsgNCArIHZsYW5fYnl0ZXMgPCA2NCkgfHwKLQkgICAgKG5ld19tdHUgKyAxNCArIDQgKyB2bGFuX2J5dGVzID4gNjUzOTIpKSB7CisJaWYgKChuZXdfbXR1ICsgbXR1X292ZXJoZWFkIDwgVkxBTl9FVEhfWkxFTikgfHwKKwkgICAgKG5ld19tdHUgKyBtdHVfb3ZlcmhlYWQgPiBPQ1RFT05fTUFYX01UVSkpIHsKIAkJcHJfZXJyKCJNVFUgbXVzdCBiZSBiZXR3ZWVuICVkIGFuZCAlZC5cbiIsCi0JCSAgICAgICA2NCAtIDE0IC0gNCAtIHZsYW5fYnl0ZXMsIDY1MzkyIC0gMTQgLSA0IC0gdmxhbl9ieXRlcyk7CisJCSAgICAgICBWTEFOX0VUSF9aTEVOIC0gbXR1X292ZXJoZWFkLAorCQkgICAgICAgT0NURU9OX01BWF9NVFUgLSBtdHVfb3ZlcmhlYWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZGV2LT5tdHUgPSBuZXdfbXR1OwpAQCAtMjU5LDggKzI3NSw5IEBACiAJaWYgKChpbnRlcmZhY2UgPCAyKSAmJgogCSAgICAoY3ZteF9oZWxwZXJfaW50ZXJmYWNlX2dldF9tb2RlKGludGVyZmFjZSkgIT0KIAkJQ1ZNWF9IRUxQRVJfSU5URVJGQUNFX01PREVfU1BJKSkgeworCQlpbnQgaW5kZXggPSBJTkRFWChwcml2LT5wb3J0KTsKIAkJLyogQWRkIGV0aGVybmV0IGhlYWRlciBhbmQgRkNTLCBhbmQgVkxBTiBpZiBjb25maWd1cmVkLiAqLwotCQlpbnQgbWF4X3BhY2tldCA9IG5ld19tdHUgKyAxNCArIDQgKyB2bGFuX2J5dGVzOworCQlpbnQgbWF4X3BhY2tldCA9IG5ld19tdHUgKyBtdHVfb3ZlcmhlYWQ7CiAKIAkJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zWFhYKSB8fAogCQkgICAgT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjU4WFgpKSB7CkBAIC0yNzUsNyArMjkyLDcgQEAKIAkJCXVuaW9uIGN2bXhfcGlwX2ZybV9sZW5fY2hreCBmcm1fbGVuX2NoazsKIAogCQkJZnJtX2xlbl9jaGsudTY0ID0gMDsKLQkJCWZybV9sZW5fY2hrLnMubWlubGVuID0gNjQ7CisJCQlmcm1fbGVuX2Noay5zLm1pbmxlbiA9IFZMQU5fRVRIX1pMRU47CiAJCQlmcm1fbGVuX2Noay5zLm1heGxlbiA9IG1heF9wYWNrZXQ7CiAJCQljdm14X3dyaXRlX2NzcihDVk1YX1BJUF9GUk1fTEVOX0NIS1goaW50ZXJmYWNlKSwKIAkJCQkgICAgICAgZnJtX2xlbl9jaGsudTY0KTsKQEAgLTMwMCwxMiArMzE3LDEyIEBACiAJdW5pb24gY3ZteF9nbXh4X3BydHhfY2ZnIGdteF9jZmc7CiAJc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGludGVyZmFjZSA9IElOVEVSRkFDRShwcml2LT5wb3J0KTsKLQlpbnQgaW5kZXggPSBJTkRFWChwcml2LT5wb3J0KTsKIAogCWlmICgoaW50ZXJmYWNlIDwgMikgJiYKIAkgICAgKGN2bXhfaGVscGVyX2ludGVyZmFjZV9nZXRfbW9kZShpbnRlcmZhY2UpICE9CiAJCUNWTVhfSEVMUEVSX0lOVEVSRkFDRV9NT0RFX1NQSSkpIHsKIAkJdW5pb24gY3ZteF9nbXh4X3J4eF9hZHJfY3RsIGNvbnRyb2w7CisJCWludCBpbmRleCA9IElOREVYKHByaXYtPnBvcnQpOwogCiAJCWNvbnRyb2wudTY0ID0gMDsKIAkJY29udHJvbC5zLmJjc3QgPSAxOwkvKiBBbGxvdyBicm9hZGNhc3QgTUFDIGFkZHJlc3NlcyAqLwpAQCAtMzUyLDcgKzM2OSw2IEBACiAJc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJdW5pb24gY3ZteF9nbXh4X3BydHhfY2ZnIGdteF9jZmc7CiAJaW50IGludGVyZmFjZSA9IElOVEVSRkFDRShwcml2LT5wb3J0KTsKLQlpbnQgaW5kZXggPSBJTkRFWChwcml2LT5wb3J0KTsKIAogCWlmICgoaW50ZXJmYWNlIDwgMikgJiYKIAkgICAgKGN2bXhfaGVscGVyX2ludGVyZmFjZV9nZXRfbW9kZShpbnRlcmZhY2UpICE9CkBAIC0zNjAsNiArMzc2LDcgQEAKIAkJaW50IGk7CiAJCXU4ICpwdHIgPSBkZXYtPmRldl9hZGRyOwogCQl1NjQgbWFjID0gMDsKKwkJaW50IGluZGV4ID0gSU5ERVgocHJpdi0+cG9ydCk7CiAKIAkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJCW1hYyA9IChtYWMgPDwgOCkgfCAodTY0KXB0cltpXTsKQEAgLTQ1NywxMCArNDc0LDggQEAKIAogdm9pZCBjdm1fb2N0X2NvbW1vbl91bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChwcml2LT5waHlkZXYpCi0JCXBoeV9kaXNjb25uZWN0KHByaXYtPnBoeWRldik7CisJaWYgKGRldi0+cGh5ZGV2KQorCQlwaHlfZGlzY29ubmVjdChkZXYtPnBoeWRldik7CiB9CiAKIGludCBjdm1fb2N0X2NvbW1vbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC00NzksMTUgKzQ5NCwxNyBAQAogCiAJZ214X2NmZy51NjQgPSBjdm14X3JlYWRfY3NyKENWTVhfR01YWF9QUlRYX0NGRyhpbmRleCwgaW50ZXJmYWNlKSk7CiAJZ214X2NmZy5zLmVuID0gMTsKKwlpZiAob2N0ZW9uX2hhc19mZWF0dXJlKE9DVEVPTl9GRUFUVVJFX1BLTkQpKQorCQlnbXhfY2ZnLnMucGtuZCA9IHByaXYtPnBvcnQ7CiAJY3ZteF93cml0ZV9jc3IoQ1ZNWF9HTVhYX1BSVFhfQ0ZHKGluZGV4LCBpbnRlcmZhY2UpLCBnbXhfY2ZnLnU2NCk7CiAKIAlpZiAob2N0ZW9uX2lzX3NpbXVsYXRpb24oKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAocHJpdi0+cGh5ZGV2KSB7Ci0JCWludCByID0gcGh5X3JlYWRfc3RhdHVzKHByaXYtPnBoeWRldik7CisJaWYgKGRldi0+cGh5ZGV2KSB7CisJCWludCByID0gcGh5X3JlYWRfc3RhdHVzKGRldi0+cGh5ZGV2KTsKIAotCQlpZiAociA9PSAwICYmIHByaXYtPnBoeWRldi0+bGluayA9PSAwKQorCQlpZiAociA9PSAwICYmIGRldi0+cGh5ZGV2LT5saW5rID09IDApCiAJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCQljdm1fb2N0X2FkanVzdF9saW5rKGRldik7CiAJfSBlbHNlIHsKQEAgLTUxMCw4ICs1MjcsMTAgQEAKIAlpZiAobGlua19pbmZvLnU2NCA9PSBwcml2LT5saW5rX2luZm8pCiAJCXJldHVybjsKIAotCWxpbmtfaW5mbyA9IGN2bXhfaGVscGVyX2xpbmtfYXV0b2NvbmYocHJpdi0+cG9ydCk7Ci0JcHJpdi0+bGlua19pbmZvID0gbGlua19pbmZvLnU2NDsKKwlpZiAoY3ZteF9oZWxwZXJfbGlua19zZXQocHJpdi0+cG9ydCwgbGlua19pbmZvKSkKKwkJbGlua19pbmZvLnU2NCA9IHByaXYtPmxpbmtfaW5mbzsKKwllbHNlCisJCXByaXYtPmxpbmtfaW5mbyA9IGxpbmtfaW5mby51NjQ7CiAKIAlpZiAobGlua19pbmZvLnMubGlua191cCkgewogCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkKQEAgLTY0OSw2ICs2NjgsMTYgQEAKIAlyZXR1cm4gbnA7CiB9CiAKK3N0YXRpYyB2b2lkIGN2bV9zZXRfcmdtaWlfZGVsYXkoc3RydWN0IGRldmljZV9ub2RlICpucCwgaW50IGlmYWNlLCBpbnQgcG9ydCkKK3sKKwl1MzIgZGVsYXlfdmFsdWU7CisKKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAicngtZGVsYXkiLCAmZGVsYXlfdmFsdWUpKQorCQljdm14X3dyaXRlX2NzcihDVk1YX0FTWFhfUlhfQ0xLX1NFVFgocG9ydCwgaWZhY2UpLCBkZWxheV92YWx1ZSk7CisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInR4LWRlbGF5IiwgJmRlbGF5X3ZhbHVlKSkKKwkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9BU1hYX1RYX0NMS19TRVRYKHBvcnQsIGlmYWNlKSwgZGVsYXlfdmFsdWUpOworfQorCiBzdGF0aWMgaW50IGN2bV9vY3RfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlpbnQgbnVtX2ludGVyZmFjZXM7CkBAIC02NjUsMTEgKzY5NCwxOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQogCWN2bV9vY3RfY29uZmlndXJlX2NvbW1vbl9odygpOwogCiAJY3ZteF9oZWxwZXJfaW5pdGlhbGl6ZV9wYWNrZXRfaW9fZ2xvYmFsKCk7CiAKKwlpZiAocmVjZWl2ZV9ncm91cF9vcmRlcikgeworCQlpZiAocmVjZWl2ZV9ncm91cF9vcmRlciA+IDQpCisJCQlyZWNlaXZlX2dyb3VwX29yZGVyID0gNDsKKwkJcG93X3JlY2VpdmVfZ3JvdXBzID0gKDEgPDwgKDEgPDwgcmVjZWl2ZV9ncm91cF9vcmRlcikpIC0gMTsKKwl9IGVsc2UgeworCQlwb3dfcmVjZWl2ZV9ncm91cHMgPSBCSVQocG93X3JlY2VpdmVfZ3JvdXApOworCX0KKwogCS8qIENoYW5nZSB0aGUgaW5wdXQgZ3JvdXAgZm9yIGFsbCBwb3J0cyBiZWZvcmUgaW5wdXQgaXMgZW5hYmxlZCAqLwogCW51bV9pbnRlcmZhY2VzID0gY3ZteF9oZWxwZXJfZ2V0X251bWJlcl9vZl9pbnRlcmZhY2VzKCk7CiAJZm9yIChpbnRlcmZhY2UgPSAwOyBpbnRlcmZhY2UgPCBudW1faW50ZXJmYWNlczsgaW50ZXJmYWNlKyspIHsKQEAgLTY4Myw3ICs3MTksMzcgQEAKIAogCQkJcGlwX3BydF90YWd4LnU2NCA9CiAJCQkgICAgY3ZteF9yZWFkX2NzcihDVk1YX1BJUF9QUlRfVEFHWChwb3J0KSk7Ci0JCQlwaXBfcHJ0X3RhZ3gucy5ncnAgPSBwb3dfcmVjZWl2ZV9ncm91cDsKKworCQkJaWYgKHJlY2VpdmVfZ3JvdXBfb3JkZXIpIHsKKwkJCQlpbnQgdGFnX21hc2s7CisKKwkJCQkvKiBXZSBzdXBwb3J0IG9ubHkgMTYgZ3JvdXBzIGF0IHRoZSBtb21lbnQsIHNvCisJCQkJICogYWx3YXlzIGRpc2FibGUgdGhlIHR3byBhZGRpdGlvbmFsICJoaWRkZW4iCisJCQkJICogdGFnX21hc2sgYml0cyBvbiBDTjY4WFguCisJCQkJICovCisJCQkJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ042OFhYKSkKKwkJCQkJcGlwX3BydF90YWd4LnU2NCB8PSAweDN1bGwgPDwgNDQ7CisKKwkJCQl0YWdfbWFzayA9IH4oKDEgPDwgcmVjZWl2ZV9ncm91cF9vcmRlcikgLSAxKTsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5ncnB0YWdiYXNlCT0gMDsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5ncnB0YWdtYXNrCT0gdGFnX21hc2s7CisJCQkJcGlwX3BydF90YWd4LnMuZ3JwdGFnCQk9IDE7CisJCQkJcGlwX3BydF90YWd4LnMudGFnX21vZGUJCT0gMDsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5pbmNfcHJ0X2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNl9kcHJ0X2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNF9kcHJ0X2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNl9zcHJ0X2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNF9zcHJ0X2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNl9kc3RfZmxhZwk9IDE7CisJCQkJcGlwX3BydF90YWd4LnMuaXA0X2RzdF9mbGFnCT0gMTsKKwkJCQlwaXBfcHJ0X3RhZ3gucy5pcDZfc3JjX2ZsYWcJPSAxOworCQkJCXBpcF9wcnRfdGFneC5zLmlwNF9zcmNfZmxhZwk9IDE7CisJCQkJcGlwX3BydF90YWd4LnMuZ3JwCQk9IDA7CisJCQl9IGVsc2UgeworCQkJCXBpcF9wcnRfdGFneC5zLmdycHRhZwk9IDA7CisJCQkJcGlwX3BydF90YWd4LnMuZ3JwCT0gcG93X3JlY2VpdmVfZ3JvdXA7CisJCQl9CisKIAkJCWN2bXhfd3JpdGVfY3NyKENWTVhfUElQX1BSVF9UQUdYKHBvcnQpLAogCQkJCSAgICAgICBwaXBfcHJ0X3RhZ3gudTY0KTsKIAkJfQpAQCAtNzA1LDcgKzc3MSw2IEBACiAJaWYgKChwb3dfc2VuZF9ncm91cCAhPSAtMSkpIHsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAotCQlwcl9pbmZvKCJcdENvbmZpZ3VyaW5nIGRldmljZSBmb3IgUE9XIG9ubHkgYWNjZXNzXG4iKTsKIAkJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBvY3Rlb25fZXRoZXJuZXQpKTsKIAkJaWYgKGRldikgewogCQkJLyogSW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHByaXZhdGUgc3RydWN0dXJlLiAqLwpAQCAtODA4LDYgKzg3Myw4IEBACiAJCQljYXNlIENWTVhfSEVMUEVSX0lOVEVSRkFDRV9NT0RFX0dNSUk6CiAJCQkJZGV2LT5uZXRkZXZfb3BzID0gJmN2bV9vY3RfcmdtaWlfbmV0ZGV2X29wczsKIAkJCQlzdHJjcHkoZGV2LT5uYW1lLCAiZXRoJWQiKTsKKwkJCQljdm1fc2V0X3JnbWlpX2RlbGF5KHByaXYtPm9mX25vZGUsIGludGVyZmFjZSwKKwkJCQkJCSAgICBwb3J0X2luZGV4KTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtODQ0LDE3ICs5MTEsOCBAQAogewogCWludCBwb3J0OwogCi0JLyogRGlzYWJsZSBQT1cgaW50ZXJydXB0ICovCi0JaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ042OFhYKSkKLQkJY3ZteF93cml0ZV9jc3IoQ1ZNWF9TU09fV1FfSU5UX1RIUlgocG93X3JlY2VpdmVfZ3JvdXApLCAwKTsKLQllbHNlCi0JCWN2bXhfd3JpdGVfY3NyKENWTVhfUE9XX1dRX0lOVF9USFJYKHBvd19yZWNlaXZlX2dyb3VwKSwgMCk7Ci0KIAljdm14X2lwZF9kaXNhYmxlKCk7CiAKLQkvKiBGcmVlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCWZyZWVfaXJxKE9DVEVPTl9JUlFfV09SS1EwICsgcG93X3JlY2VpdmVfZ3JvdXAsIGN2bV9vY3RfZGV2aWNlKTsKLQogCWF0b21pY19pbmNfcmV0dXJuKCZjdm1fb2N0X3BvbGxfcXVldWVfc3RvcHBpbmcpOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY3ZtX29jdF9yeF9yZWZpbGxfd29yayk7CiAKQEAgLTg3OCw3ICs5MzYsNiBAQAogCQl9CiAJfQogCi0KIAljdm14X3Brb19zaHV0ZG93bigpOwogCiAJY3ZteF9pcGRfZnJlZV9wdHIoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vb2N0ZW9uLWV0aGVybmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL29jdGVvbi1ldGhlcm5ldC5oCmluZGV4IDYyNzVjMTUuLjljNjg1MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vb2N0ZW9uLWV0aGVybmV0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9vY3Rlb24tZXRoZXJuZXQuaApAQCAtNDAsNyArNDAsNiBAQAogCXN0cnVjdCBza19idWZmX2hlYWQgdHhfZnJlZV9saXN0WzE2XTsKIAkvKiBEZXZpY2Ugc3RhdGlzdGljcyAqLwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CiAJdW5zaWduZWQgaW50IGxhc3Rfc3BlZWQ7CiAJdW5zaWduZWQgaW50IGxhc3RfbGluazsKIAkvKiBMYXN0IG5lZ290aWF0ZWQgbGluayBzdGF0ZSAqLwpAQCAtNzMsNyArNzIsNyBAQAogCiBleHRlcm4gaW50IGFsd2F5c191c2VfcG93OwogZXh0ZXJuIGludCBwb3dfc2VuZF9ncm91cDsKLWV4dGVybiBpbnQgcG93X3JlY2VpdmVfZ3JvdXA7CitleHRlcm4gaW50IHBvd19yZWNlaXZlX2dyb3VwczsKIGV4dGVybiBjaGFyIHBvd19zZW5kX2xpc3RbXTsKIGV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqY3ZtX29jdF9kZXZpY2VbXTsKIGV4dGVybiBhdG9taWNfdCBjdm1fb2N0X3BvbGxfcXVldWVfc3RvcHBpbmc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbl94b18xXzUuYyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uX3hvXzFfNS5jCmluZGV4IDZhNGQzNzkuLjFlMjNlZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uX3hvXzFfNS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uX3hvXzFfNS5jCkBAIC00OSw3ICs0OSw3IEBACiAKIHN0YXRpYyBpbnQgZGNvbl93YXNfaXJxKHZvaWQpCiB7Ci0JdV9pbnQ4X3QgdG1wOworCXU4IHRtcDsKIAogCS8qIGlycSBzdGF0dXMgd2lsbCBhcHBlYXIgaW4gUE1JT19SeDUwWzZdIG9uIGdwaW8xMiAqLwogCXRtcCA9IGluYihWWDg1NV9HUElfU1RBVFVTX0NIRyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMKaW5kZXggYTU3NTUzNS4uNTUzZThkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19hcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYXAuYwpAQCAtNzgsOSArNzgsOSBAQAogCS8qIHVwZGF0ZSBUSU0gSUUgKi8KIAlwID0gcnR3X2dldF9pZShwaWUgKyBfRklYRURfSUVfTEVOR1RIXywgX1RJTV9JRV8sICZ0aW1faWVsZW4sCiAJCQlwbmV0d29ya19tbG1lZXh0LT5JRUxlbmd0aCAtIF9GSVhFRF9JRV9MRU5HVEhfKTsKLQlpZiAocCAhPSBOVUxMICYmIHRpbV9pZWxlbiA+IDApIHsKKwlpZiAocCAmJiB0aW1faWVsZW4gPiAwKSB7CiAJCXRpbV9pZWxlbiArPSAyOwotCQlwcmVtYWluZGVyX2llID0gcCt0aW1faWVsZW47CisJCXByZW1haW5kZXJfaWUgPSBwICsgdGltX2llbGVuOwogCQl0aW1faWVfb2Zmc2V0ID0gKGludCkocCAtIHBpZSk7CiAJCXJlbWFpbmRlcl9pZWxlbiA9IHBuZXR3b3JrX21sbWVleHQtPklFTGVuZ3RoIC0KIAkJCQkJdGltX2llX29mZnNldCAtIHRpbV9pZWxlbjsKQEAgLTk4LDcgKzk4LDcgQEAKIAkJCQlfU1VQUE9SVEVEUkFURVNfSUVfLCAmdG1wX2xlbiwKIAkJCQkocG5ldHdvcmtfbWxtZWV4dC0+SUVMZW5ndGggLQogCQkJCQlfQkVBQ09OX0lFX09GRlNFVF8pKTsKLQkJaWYgKHAgIT0gIE5VTEwpCisJCWlmIChwKQogCQkJb2Zmc2V0ICs9IHRtcF9sZW4rMjsKIAogCQkvKiBEUyBQYXJhbWV0ZXIgU2V0IElFLCBsZW4gPSAzICovCkBAIC0xODMsMTAgKzE4MywxMCBAQAogCQlpICs9IChwSUUtPkxlbmd0aCArIDIpOwogCX0KIAotCWlmIChwICE9IE5VTEwgJiYgaWVsZW4gPiAwKSB7CisJaWYgKHAgJiYgaWVsZW4gPiAwKSB7CiAJCWllbGVuICs9IDI7CiAKLQkJcHJlbWFpbmRlcl9pZSA9IHAraWVsZW47CisJCXByZW1haW5kZXJfaWUgPSBwICsgaWVsZW47CiAKIAkJaWVfb2Zmc2V0ID0gKGludCkocCAtIHBpZSk7CiAKQEAgLTE5NSw3ICsxOTUsNyBAQAogCQlpZiAoYm1hdGNoKQogCQkJZHN0X2llID0gcDsKIAkJZWxzZQotCQkJZHN0X2llID0gcCtpZWxlbjsKKwkJCWRzdF9pZSA9IHAgKyBpZWxlbjsKIAl9CiAKIAlpZiAocmVtYWluZGVyX2llbGVuID4gMCkgewpAQCAtMjMyLDEwICsyMzIsMTAgQEAKIAogCXAgPSBydHdfZ2V0X2llKHBpZSArIF9GSVhFRF9JRV9MRU5HVEhfLCBpbmRleCwgJmllbGVuLAogCQkgICAgICAgcG5ldHdvcmstPklFTGVuZ3RoIC0gX0ZJWEVEX0lFX0xFTkdUSF8pOwotCWlmIChwICE9IE5VTEwgJiYgaWVsZW4gPiAwKSB7CisJaWYgKHAgJiYgaWVsZW4gPiAwKSB7CiAJCWllbGVuICs9IDI7CiAKLQkJcHJlbWFpbmRlcl9pZSA9IHAraWVsZW47CisJCXByZW1haW5kZXJfaWUgPSBwICsgaWVsZW47CiAKIAkJaWVfb2Zmc2V0ID0gKGludCkocCAtIHBpZSk7CiAKQEAgLTM4NSw4ICszODUsOCBAQAogCQkJdXBkYXRlZCA9IGFwX2ZyZWVfc3RhKHBhZGFwdGVyLCBwc3RhLCB0cnVlLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CiAJCX0gZWxzZSB7CiAJCQkvKiBUT0RPOiBBZ2luZyBtZWNoYW5pc20gdG8gZGlnZXN0IGZyYW1lcyBpbiBzbGVlcF9xIHRvIGF2b2lkIHJ1bm5pbmcgb3V0IG9mIHhtaXRmcmFtZSAqLwotCQkJaWYgKHBzdGEtPnNsZWVwcV9sZW4gPiAoTlJfWE1JVEZSQU1FL3BzdGFwcml2LT5hc29jX2xpc3RfY250KSAmJgotCQkJICAgIHBhZGFwdGVyLT54bWl0cHJpdi5mcmVlX3htaXRmcmFtZV9jbnQgPCAoTlJfWE1JVEZSQU1FL3BzdGFwcml2LT5hc29jX2xpc3RfY250LzIpKSB7CisJCQlpZiAocHN0YS0+c2xlZXBxX2xlbiA+IChOUl9YTUlURlJBTUUgLyBwc3RhcHJpdi0+YXNvY19saXN0X2NudCkgJiYKKwkJCSAgICBwYWRhcHRlci0+eG1pdHByaXYuZnJlZV94bWl0ZnJhbWVfY250IDwgKE5SX1hNSVRGUkFNRSAvIHBzdGFwcml2LT5hc29jX2xpc3RfY250IC8gMikpIHsKIAkJCQlEQkdfODhFKCIlcyBzdGE6JXBNLCBzbGVlcHFfbGVuOiV1LCBmcmVlX3htaXRmcmFtZV9jbnQ6JXUsIGFzb2NfbGlzdF9jbnQ6JXUsIGNsZWFyIHNsZWVwX3FcbiIsIF9fZnVuY19fLAogCQkJCQkocHN0YS0+aHdhZGRyKSwgcHN0YS0+c2xlZXBxX2xlbiwKIAkJCQkJcGFkYXB0ZXItPnhtaXRwcml2LmZyZWVfeG1pdGZyYW1lX2NudCwKQEAgLTQ3MCw3ICs0NzAsNyBAQAogCS8qIGIvZyBtb2RlIHJhX2JpdG1hcCAqLwogCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHN0YS0+YnNzcmF0ZXNldCk7IGkrKykgewogCQlpZiAocHN0YS0+YnNzcmF0ZXNldFtpXSkKLQkJCXR4X3JhX2JpdG1hcCB8PSBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUocHN0YS0+YnNzcmF0ZXNldFtpXSYweDdmKTsKKwkJCXR4X3JhX2JpdG1hcCB8PSBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUocHN0YS0+YnNzcmF0ZXNldFtpXSAmIDB4N2YpOwogCX0KIAkvKiBuIG1vZGUgcmFfYml0bWFwICovCiAJaWYgKHBzdGFfaHQtPmh0X29wdGlvbikgewpAQCAtNDgxLDggKzQ4MSw4IEBACiAJCQlsaW1pdCA9IDg7LyogICAxUiAqLwogCiAJCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7Ci0JCQlpZiAocHN0YV9odC0+aHRfY2FwLnN1cHBfbWNzX3NldFtpLzhdICYgQklUKGklOCkpCi0JCQkJdHhfcmFfYml0bWFwIHw9IEJJVChpKzEyKTsKKwkJCWlmIChwc3RhX2h0LT5odF9jYXAubWNzLnJ4X21hc2tbaSAvIDhdICYgQklUKGkgJSA4KSkKKwkJCQl0eF9yYV9iaXRtYXAgfD0gQklUKGkgKyAxMik7CiAJCX0KIAogCQkvKiBtYXggc2hvcnQgR0kgcmF0ZSAqLwpAQCAtNTA3LDE5ICs1MDcsMTkgQEAKIAlwc3RhLT53aXJlbGVzc19tb2RlID0gc3RhX2JhbmQ7CiAKIAlyYWlkID0gbmV0d29ya3R5cGVfdG9fcmFpZChzdGFfYmFuZCk7Ci0JaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgodHhfcmFfYml0bWFwJjB4MGZmZmZmZmYpJjB4M2Y7CisJaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgodHhfcmFfYml0bWFwICYgMHgwZmZmZmZmZikgJiAweDNmOwogCiAJaWYgKHBzdGEtPmFpZCA8IE5VTV9TVEEpIHsKIAkJdTggYXJnID0gMDsKIAotCQlhcmcgPSBwc3RhLT5tYWNfaWQmMHgxZjsKKwkJYXJnID0gcHN0YS0+bWFjX2lkICYgMHgxZjsKIAogCQlhcmcgfD0gQklUKDcpOy8qIHN1cHBvcnQgZW50cnkgMn4zMSAqLwogCiAJCWlmIChzaG9ydEdJcmF0ZSkKIAkJCWFyZyB8PSBCSVQoNSk7CiAKLQkJdHhfcmFfYml0bWFwIHw9ICgocmFpZDw8MjgpJjB4ZjAwMDAwMDApOworCQl0eF9yYV9iaXRtYXAgfD0gKChyYWlkIDw8IDI4KSAmIDB4ZjAwMDAwMDApOwogCiAJCURCR184OEUoIiVzID0+IG1hY19pZDolZCAsIHJhaWQ6JWQgLCBiaXRtYXAgPSAweCV4LCBhcmcgPSAweCV4XG4iLAogCQkJX19mdW5jX18sIHBzdGEtPm1hY19pZCwgcmFpZCwgdHhfcmFfYml0bWFwLCBhcmcpOwpAQCAtNTczLDcgKzU3Myw3IEBACiAJCS8qIGIvZyBtb2RlIHJhX2JpdG1hcCAqLwogCQlmb3IgKGkgPSAwOyBpIDwgc3VwcG9ydFJhdGVOdW07IGkrKykgewogCQkJaWYgKHBzdGEtPmJzc3JhdGVzZXRbaV0pCi0JCQkJdHhfcmFfYml0bWFwIHw9IHJ0d19nZXRfYml0X3ZhbHVlX2Zyb21faWVlZV92YWx1ZShwc3RhLT5ic3NyYXRlc2V0W2ldJjB4N2YpOworCQkJCXR4X3JhX2JpdG1hcCB8PSBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUocHN0YS0+YnNzcmF0ZXNldFtpXSAmIDB4N2YpOwogCQl9CiAKIAkJaWYgKHBjdXJfbmV0d29yay0+Q29uZmlndXJhdGlvbi5EU0NvbmZpZyA+IDE0KSB7CkBAIC01ODcsNyArNTg3LDcgQEAKIAkJfQogCiAJCXJhaWQgPSBuZXR3b3JrdHlwZV90b19yYWlkKG5ldHdvcmtfdHlwZSk7Ci0JCWluaXRfcmF0ZSA9IGdldF9oaWdoZXN0X3JhdGVfaWR4KHR4X3JhX2JpdG1hcCYweDBmZmZmZmZmKSYweDNmOworCQlpbml0X3JhdGUgPSBnZXRfaGlnaGVzdF9yYXRlX2lkeCh0eF9yYV9iaXRtYXAgJiAweDBmZmZmZmZmKSAmIDB4M2Y7CiAKIAkJLyogYXAgbW9kZSAqLwogCQlydHdfaGFsX3NldF9vZG1fdmFyKHBhZGFwdGVyLCBIQUxfT0RNX1NUQV9JTkZPLCBwc3RhLCB0cnVlKTsKQEAgLTU5Nyw3ICs1OTcsNyBAQAogCiAJCQlhcmcgPSBwc3RhLT5tYWNfaWQmMHgxZjsKIAkJCWFyZyB8PSBCSVQoNyk7Ci0JCQl0eF9yYV9iaXRtYXAgfD0gKChyYWlkPDwyOCkmMHhmMDAwMDAwMCk7CisJCQl0eF9yYV9iaXRtYXAgfD0gKChyYWlkIDw8IDI4KSAmIDB4ZjAwMDAwMDApOwogCQkJREJHXzg4RSgidXBkYXRlX2JtY19zdGEsIG1hc2sgPSAweCV4LCBhcmcgPSAweCV4XG4iLCB0eF9yYV9iaXRtYXAsIGFyZyk7CiAKIAkJCS8qIGJpdG1hcFswOjI3XSA9IHR4X3JhdGVfYml0bWFwICovCkBAIC02MzYsNyArNjM2LDcgQEAKIAlzdHJ1Y3QgaHRfcHJpdgkqcGh0cHJpdl9hcCA9ICZwbWxtZXByaXYtPmh0cHJpdjsKIAlzdHJ1Y3QgaHRfcHJpdgkqcGh0cHJpdl9zdGEgPSAmcHN0YS0+aHRwcml2OwogCi0JcHN0YS0+bWFjX2lkID0gcHN0YS0+YWlkKzE7CisJcHN0YS0+bWFjX2lkID0gcHN0YS0+YWlkICsgMTsKIAlEQkdfODhFKCIlc1xuIiwgX19mdW5jX18pOwogCiAJLyogYXAgbW9kZSAqLwpAQCAtNjU4LDExICs2NTgsMTUgQEAKIAkJcGh0cHJpdl9zdGEtPmFtcGR1X2VuYWJsZSA9IHBodHByaXZfYXAtPmFtcGR1X2VuYWJsZTsKIAogCQkvKiBjaGVjayBpZiBzdGEgc3VwcG9ydCBzIFNob3J0IEdJICovCi0JCWlmICgocGh0cHJpdl9zdGEtPmh0X2NhcC5jYXBfaW5mbyAmIHBodHByaXZfYXAtPmh0X2NhcC5jYXBfaW5mbykgJiAoSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfCBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpCisJCWlmIChsZTE2X3RvX2NwdShwaHRwcml2X3N0YS0+aHRfY2FwLmNhcF9pbmZvICYKKwkJCQlwaHRwcml2X2FwLT5odF9jYXAuY2FwX2luZm8pICYKKwkJICAgIChJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8IElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSkKIAkJCXBodHByaXZfc3RhLT5zZ2kgPSB0cnVlOwogCiAJCS8qICBid21vZGUgKi8KLQkJaWYgKChwaHRwcml2X3N0YS0+aHRfY2FwLmNhcF9pbmZvICYgcGh0cHJpdl9hcC0+aHRfY2FwLmNhcF9pbmZvKSAmIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIKSB7CisJCWlmIChsZTE2X3RvX2NwdShwaHRwcml2X3N0YS0+aHRfY2FwLmNhcF9pbmZvICYKKwkJCQlwaHRwcml2X2FwLT5odF9jYXAuY2FwX2luZm8pICYKKwkJICAgIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIKSB7CiAJCQlwaHRwcml2X3N0YS0+Yndtb2RlID0gcG1sbWVleHQtPmN1cl9id21vZGU7CiAJCQlwaHRwcml2X3N0YS0+Y2hfb2Zmc2V0ID0gcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQ7CiAJCX0KQEAgLTcwMiwxMiArNzA2LDEyIEBACiAKIAkvKiBoYW5kbGUgQS1NUERVIHBhcmFtZXRlciBmaWVsZCAqLwogCS8qCi0JCUFNUERVX3BhcmEgWzE6MF06TWF4IEFNUERVIExlbiA9PiAwOjhrICwgMToxNmssIDI6MzJrLCAzOjY0awotCQlBTVBEVV9wYXJhIFs0OjJdOk1pbiBNUERVIFN0YXJ0IFNwYWNpbmcKKwkJYW1wZHVfcGFyYW1zX2luZm8gWzE6MF06TWF4IEFNUERVIExlbiA9PiAwOjhrICwgMToxNmssIDI6MzJrLCAzOjY0aworCQlhbXBkdV9wYXJhbXNfaW5mbyBbNDoyXTpNaW4gTVBEVSBTdGFydCBTcGFjaW5nCiAJKi8KLQltYXhfQU1QRFVfbGVuID0gcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MDM7CisJbWF4X0FNUERVX2xlbiA9IHBtbG1laW5mby0+SFRfY2Fwcy5hbXBkdV9wYXJhbXNfaW5mbyAmIDB4MDM7CiAKLQltaW5fTVBEVV9zcGFjaW5nID0gKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDFjKSA+PiAyOworCW1pbl9NUERVX3NwYWNpbmcgPSAocG1sbWVpbmZvLT5IVF9jYXBzLmFtcGR1X3BhcmFtc19pbmZvICYgMHgxYykgPj4gMjsKIAogCXJ0d19oYWxfc2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfQU1QRFVfTUlOX1NQQUNFLCAodTggKikoJm1pbl9NUERVX3NwYWNpbmcpKTsKIApAQCAtNzE2LDcgKzcyMCw3IEBACiAJLyogICovCiAJLyogIENvbmZpZyBTTSBQb3dlciBTYXZlIHNldHRpbmcgKi8KIAkvKiAgKi8KLQlwbWxtZWluZm8tPlNNX1BTID0gKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkhUX2NhcHNfaW5mbykgJiAweDBDKSA+PiAyOworCXBtbG1laW5mby0+U01fUFMgPSAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvKSAmIDB4MEMpID4+IDI7CiAJaWYgKHBtbG1laW5mby0+U01fUFMgPT0gV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDKQogCQlEQkdfODhFKCIlcygpOiBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUNcbiIsIF9fZnVuY19fKTsKIH0KQEAgLTc0Niw3ICs3NTAsNyBAQAogCS8qIGNoZWNrIGlmIHRoZXJlIGlzIHdwcyBpZSwgKi8KIAkvKiBpZiB0aGVyZSBpcyB3cHNpZSBpbiBiZWFjb24sIHRoZSBob3N0YXBkIHdpbGwgdXBkYXRlIGJlYWNvbiB0d2ljZSB3aGVuIHN0YXRpbmcgaG9zdGFwZCwgKi8KIAkvKiBhbmQgYXQgZmlyc3QgdGltZSB0aGUgc2VjdXJpdHkgaWUgKFJTTi9XUEEgSUUpIHdpbGwgbm90IGluY2x1ZGUgaW4gYmVhY29uLiAqLwotCWlmICghcnR3X2dldF93cHNfaWUocG5ldHdvcmstPklFcytfRklYRURfSUVfTEVOR1RIXywgcG5ldHdvcmstPklFTGVuZ3RoLV9GSVhFRF9JRV9MRU5HVEhfLCBOVUxMLCBOVUxMKSkKKwlpZiAoIXJ0d19nZXRfd3BzX2llKHBuZXR3b3JrLT5JRXMgKyBfRklYRURfSUVfTEVOR1RIXywgcG5ldHdvcmstPklFTGVuZ3RoIC0gX0ZJWEVEX0lFX0xFTkdUSF8sIE5VTEwsIE5VTEwpKQogCQlwbWxtZWV4dC0+YnN0YXJ0X2JzcyA9IHRydWU7CiAKIAkvKiB0b2RvOiB1cGRhdGUgd21tLCBodCBjYXAgKi8KQEAgLTc5OSw3ICs4MDMsNyBAQAogCS8qIHNldCBjaGFubmVsLCBid21vZGUgKi8KIAlwID0gcnR3X2dldF9pZSgocG5ldHdvcmstPklFcyArIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKSwgX0hUX0FERF9JTkZPX0lFXywgJmllX2xlbiwgKHBuZXR3b3JrLT5JRUxlbmd0aCAtIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKSk7CiAJaWYgKHAgJiYgaWVfbGVuKSB7Ci0JCXBodF9pbmZvID0gKHN0cnVjdCBIVF9pbmZvX2VsZW1lbnQgKikocCsyKTsKKwkJcGh0X2luZm8gPSAoc3RydWN0IEhUX2luZm9fZWxlbWVudCAqKShwICsgMik7CiAKIAkJaWYgKChwcmVncHJpdi0+Y2J3NDBfZW5hYmxlKSAmJgkgKHBodF9pbmZvLT5pbmZvc1swXSAmIEJJVCgyKSkpIHsKIAkJCS8qIHN3aXRjaCB0byB0aGUgNDBNIEh6IG1vZGUgKi8KQEAgLTkzMCwxNSArOTM0LDE1IEBACiAJbWVtc2V0KHN1cHBvcnRSYXRlLCAwLCBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVgpOwogCS8qICBnZXQgc3VwcG9ydGVkIHJhdGVzICovCiAJcCA9IHJ0d19nZXRfaWUoaWUgKyBfQkVBQ09OX0lFX09GRlNFVF8sIF9TVVBQT1JURURSQVRFU19JRV8sICZpZV9sZW4sIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfKSk7Ci0JaWYgKHAgIT0gIE5VTEwpIHsKLQkJbWVtY3B5KHN1cHBvcnRSYXRlLCBwKzIsIGllX2xlbik7CisJaWYgKHApIHsKKwkJbWVtY3B5KHN1cHBvcnRSYXRlLCBwICsgMiwgaWVfbGVuKTsKIAkJc3VwcG9ydFJhdGVOdW0gPSBpZV9sZW47CiAJfQogCiAJLyogZ2V0IGV4dF9zdXBwb3J0ZWQgcmF0ZXMgKi8KIAlwID0gcnR3X2dldF9pZShpZSArIF9CRUFDT05fSUVfT0ZGU0VUXywgX0VYVF9TVVBQT1JURURSQVRFU19JRV8sICZpZV9sZW4sIHBic3NfbmV0d29yay0+SUVMZW5ndGggLSBfQkVBQ09OX0lFX09GRlNFVF8pOwotCWlmIChwICE9ICBOVUxMKSB7Ci0JCW1lbWNweShzdXBwb3J0UmF0ZStzdXBwb3J0UmF0ZU51bSwgcCsyLCBpZV9sZW4pOworCWlmIChwKSB7CisJCW1lbWNweShzdXBwb3J0UmF0ZSArIHN1cHBvcnRSYXRlTnVtLCBwICsgMiwgaWVfbGVuKTsKIAkJc3VwcG9ydFJhdGVOdW0gKz0gaWVfbGVuOwogCX0KIApAQCAtOTY2LDcgKzk3MCw3IEBACiAJcHNlY3VyaXR5cHJpdi0+d3BhMl9wYWlyd2lzZV9jaXBoZXIgPSBfTk9fUFJJVkFDWV87CiAJcCA9IHJ0d19nZXRfaWUoaWUgKyBfQkVBQ09OX0lFX09GRlNFVF8sIF9SU05fSUVfMl8sICZpZV9sZW4sIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfKSk7CiAJaWYgKHAgJiYgaWVfbGVuID4gMCkgewotCQlpZiAocnR3X3BhcnNlX3dwYTJfaWUocCwgaWVfbGVuKzIsICZncm91cF9jaXBoZXIsICZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7CisJCWlmIChydHdfcGFyc2Vfd3BhMl9pZShwLCBpZV9sZW4gKyAyLCAmZ3JvdXBfY2lwaGVyLCAmcGFpcndpc2VfY2lwaGVyLCBOVUxMKSA9PSBfU1VDQ0VTUykgewogCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fODAyMVg7CiAKIAkJCXBzZWN1cml0eXByaXYtPmRvdDgwMjF4YWxnID0gMTsvKiBwc2ssICB0b2RvOjgwMi4xeCAqLwpAQCAtOTg1LDggKzk4OSw4IEBACiAJZm9yIChwID0gaWUgKyBfQkVBQ09OX0lFX09GRlNFVF87OyBwICs9IChpZV9sZW4gKyAyKSkgewogCQlwID0gcnR3X2dldF9pZShwLCBfU1NOX0lFXzFfLCAmaWVfbGVuLAogCQkJICAgICAgIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfIC0gKGllX2xlbiArIDIpKSk7Ci0JCWlmICgocCkgJiYgKCFtZW1jbXAocCsyLCBPVUkxLCA0KSkpIHsKLQkJCWlmIChydHdfcGFyc2Vfd3BhX2llKHAsIGllX2xlbisyLCAmZ3JvdXBfY2lwaGVyLAorCQlpZiAoKHApICYmICghbWVtY21wKHAgKyAyLCBPVUkxLCA0KSkpIHsKKwkJCWlmIChydHdfcGFyc2Vfd3BhX2llKHAsIGllX2xlbiArIDIsICZncm91cF9jaXBoZXIsCiAJCQkJCSAgICAgJnBhaXJ3aXNlX2NpcGhlciwgTlVMTCkgPT0gX1NVQ0NFU1MpIHsKIAkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV84MDIxWDsKIApAQCAtMTAxMCwxMCArMTAxNCwxMCBAQAogCQlmb3IgKHAgPSBpZSArIF9CRUFDT05fSUVfT0ZGU0VUXzs7IHAgKz0gKGllX2xlbiArIDIpKSB7CiAJCQlwID0gcnR3X2dldF9pZShwLCBfVkVORE9SX1NQRUNJRklDX0lFXywgJmllX2xlbiwKIAkJCQkgICAgICAgKHBic3NfbmV0d29yay0+SUVMZW5ndGggLSBfQkVBQ09OX0lFX09GRlNFVF8gLSAoaWVfbGVuICsgMikpKTsKLQkJCWlmICgocCkgJiYgIW1lbWNtcChwKzIsIFdNTV9QQVJBX0lFLCA2KSkgeworCQkJaWYgKChwKSAmJiAhbWVtY21wKHAgKyAyLCBXTU1fUEFSQV9JRSwgNikpIHsKIAkJCQlwbWxtZXByaXYtPnFvc3ByaXYucW9zX29wdGlvbiA9IDE7CiAKLQkJCQkqKHArOCkgfD0gQklUKDcpOy8qIFFvUyBJbmZvLCBzdXBwb3J0IFUtQVBTRCAqLworCQkJCSoocCArIDgpIHw9IEJJVCg3KTsvKiBRb1MgSW5mbywgc3VwcG9ydCBVLUFQU0QgKi8KIAogCQkJCS8qIGRpc2FibGUgYWxsIEFDTSBiaXRzIHNpbmNlIHRoZSBXTU0gYWRtaXNzaW9uIGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZCAqLwogCQkJCSoocCArIDEwKSAmPSB+QklUKDQpOyAvKiBCRSAqLwpAQCAtMTAzMiw3ICsxMDM2LDcgQEAKIAkJICAgICAgIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0gX0JFQUNPTl9JRV9PRkZTRVRfKSk7CiAJaWYgKHAgJiYgaWVfbGVuID4gMCkgewogCQl1OCByZl90eXBlOwotCQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKnBodF9jYXAgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwICopKHArMik7CisJCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpwaHRfY2FwID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKIAogCQlwSFRfY2Fwc19pZSA9IHA7CiAJCWh0X2NhcCA9IHRydWU7CkBAIC0xMDQyLDcgKzEwNDYsNyBAQAogCiAJCWlmICgocHNlY3VyaXR5cHJpdi0+d3BhX3BhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfQ0NNUCkgfHwKIAkJICAgIChwc2VjdXJpdHlwcml2LT53cGEyX3BhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfQ0NNUCkpCi0JCQlwaHRfY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSAoSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9ERU5TSVRZJigweDA3PDwyKSk7CisJCQlwaHRfY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSAoSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9ERU5TSVRZICYgKDB4MDcgPDwgMikpOwogCQllbHNlCiAJCQlwaHRfY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSAoSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9ERU5TSVRZJjB4MDApOwogCkBAIC0xMDUwLDggKzEwNTQsOCBAQAogCQlwaHRfY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSAoSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9GQUNUT1IgJiAweDAzKTsKIAogCQlpZiAocmZfdHlwZSA9PSBSRl8xVDFSKSB7Ci0JCQlwaHRfY2FwLT5zdXBwX21jc19zZXRbMF0gPSAweGZmOwotCQkJcGh0X2NhcC0+c3VwcF9tY3Nfc2V0WzFdID0gMHgwOworCQkJcGh0X2NhcC0+bWNzLnJ4X21hc2tbMF0gPSAweGZmOworCQkJcGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPSAweDA7CiAJCX0KIAkJbWVtY3B5KCZwbWxtZXByaXYtPmh0cHJpdi5odF9jYXAsIHArMiwgaWVfbGVuKTsKIAl9CkBAIC0xMTQzLDcgKzExNDcsNyBAQAogCiAJREJHXzg4RSgiJXMoYWNsX251bSA9JWQpID0lcE1cbiIsIF9fZnVuY19fLCBwYWNsX2xpc3QtPm51bSwgKGFkZHIpKTsKIAotCWlmICgoTlVNX0FDTC0xKSA8IHBhY2xfbGlzdC0+bnVtKQorCWlmICgoTlVNX0FDTCAtIDEpIDwgcGFjbF9saXN0LT5udW0pCiAJCXJldHVybiAtMTsKIAogCXNwaW5fbG9ja19iaCgmKHBhY2xfbm9kZV9xLT5sb2NrKSk7CkBAIC0xNDIyLDcgKzE0MjYsOCBAQAogCWlmIChwbWxtZXByaXYtPm51bV9zdGFfbm9faHQgfHwKIAkgICAgKHBtbG1lcHJpdi0+aHRfb3BfbW9kZSAmIEhUX0lORk9fT1BFUkFUSU9OX01PREVfTk9OX0dGX0RFVlNfUFJFU0VOVCkpCiAJCW5ld19vcF9tb2RlID0gT1BfTU9ERV9NSVhFRDsKLQllbHNlIGlmICgocGh0cHJpdl9hcC0+aHRfY2FwLmNhcF9pbmZvICYgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEgpICYmCisJZWxzZSBpZiAoKGxlMTZfdG9fY3B1KHBodHByaXZfYXAtPmh0X2NhcC5jYXBfaW5mbykgJgorCQkgIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIKSAmJgogCQkgcG1sbWVwcml2LT5udW1fc3RhX2h0XzIwbWh6KQogCQluZXdfb3BfbW9kZSA9IE9QX01PREVfMjBNSFpfSFRfU1RBX0FTU09DRUQ7CiAJZWxzZSBpZiAocG1sbWVwcml2LT5vbGJjX2h0KQpAQCAtMTU1Miw3ICsxNTU3LDcgQEAKIAl9CiAKIAlpZiAocHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9IVCkgewotCQl1MTYgaHRfY2FwYWIgPSBwc3RhLT5odHByaXYuaHRfY2FwLmNhcF9pbmZvOworCQl1MTYgaHRfY2FwYWIgPSBsZTE2X3RvX2NwdShwc3RhLT5odHByaXYuaHRfY2FwLmNhcF9pbmZvKTsKIAogCQlEQkdfODhFKCJIVDogU1RBICVwTSBIVCBDYXBhYmlsaXRpZXMgSW5mbzogMHglMDR4XG4iLAogCQkJKHBzdGEtPmh3YWRkciksIGh0X2NhcGFiKTsKQEAgLTE3MTAsNDAgKzE3MTUsNiBAQAogCXJldHVybiBiZWFjb25fdXBkYXRlZDsKIH0KIAotaW50IHJ0d19hcF9pbmZvcm1fY2hfc3dpdGNoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggbmV3X2NoLCB1OCBjaF9vZmZzZXQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQsICpwbGlzdDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwotCXU4IGJjX2FkZHJbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpICE9IFdJRklfRldfQVBfU1RBVEUpCi0JCXJldHVybiAwOwotCi0JREJHXzg4RShGVU5DX05ERVZfRk1UIiB3aXRoIGNoOiV1LCBvZmZzZXQ6JXVcbiIsCi0JCUZVTkNfTkRFVl9BUkcocGFkYXB0ZXItPnBuZXRkZXYpLCBuZXdfY2gsIGNoX29mZnNldCk7Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQlwbGlzdCA9IHBoZWFkLT5uZXh0OwotCi0JLyogZm9yIGVhY2ggc3RhIGluIGFzb2NfcXVldWUgKi8KLQl3aGlsZSAocGhlYWQgIT0gcGxpc3QpIHsKLQkJcHN0YSA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHN0YV9pbmZvLCBhc29jX2xpc3QpOwotCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwotCi0JCWlzc3VlX2FjdGlvbl9zcGN0X2NoX3N3aXRjaChwYWRhcHRlciwgcHN0YS0+aHdhZGRyLCBuZXdfY2gsIGNoX29mZnNldCk7Ci0JCXBzdGEtPmV4cGlyZV90byA9IG1pbl90KHVuc2lnbmVkIGludCwgcHN0YXByaXYtPmV4cGlyZV90byAqIDIsIDUpOwotCX0KLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQotCWlzc3VlX2FjdGlvbl9zcGN0X2NoX3N3aXRjaChwYWRhcHRlciwgYmNfYWRkciwgbmV3X2NoLCBjaF9vZmZzZXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIGludCBydHdfc3RhX2ZsdXNoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0OwpAQCAtMTg1Niw5ICsxODI3LDYgQEAKIAlwbWxtZXByaXYtPndwc19wcm9iZV9yZXNwX2llID0gTlVMTDsKIAlwbWxtZXByaXYtPndwc19hc3NvY19yZXNwX2llID0gTlVMTDsKIAotCXBtbG1lcHJpdi0+cDJwX2JlYWNvbl9pZSA9IE5VTEw7Ci0JcG1sbWVwcml2LT5wMnBfcHJvYmVfcmVzcF9pZSA9IE5VTEw7Ci0KIAkvKiBmb3IgQUNMICovCiAJSU5JVF9MSVNUX0hFQUQoJihwYWNsX2xpc3QtPmFjbF9ub2RlX3EucXVldWUpKTsKIAlwYWNsX2xpc3QtPm51bSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19jbWQuYwppbmRleCA3NzQ4NTIzLi5mMWY0Nzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfY21kLmMKQEAgLTI3LDggKzI3LDggQEAKIAogaW50IHJ0d19pbml0X2NtZF9wcml2KHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCiB7Ci0Jc2VtYV9pbml0KCYocGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKSwgMCk7Ci0Jc2VtYV9pbml0KCYocGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSksIDApOworCWluaXRfY29tcGxldGlvbigmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKTsKKwlpbml0X2NvbXBsZXRpb24oJnBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXApOwogCiAJX3J0d19pbml0X3F1ZXVlKCYocGNtZHByaXYtPmNtZF9xdWV1ZSkpOwogCXJldHVybiBfU1VDQ0VTUzsKQEAgLTg1LDcgKzg1LDcgQEAKIAkvKiBUbyBkZWNpZGUgYWxsb3cgb3Igbm90ICovCiAJaWYgKChwY21kcHJpdi0+cGFkYXB0ZXItPnB3cmN0cmxwcml2LmJIV1B3clBpbmRldGVjdCkgJiYKIAkgICAgKCFwY21kcHJpdi0+cGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi51c2Jzc19lbmFibGUpKSB7Ci0JCWlmIChjbWRfb2JqLT5jbWRjb2RlID09IEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpIHsKKwkJaWYgKGNtZF9vYmotPmNtZGNvZGUgPT0gX1NldF9EcnZfRXh0cmFfQ01EXykgewogCQkJc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtCSpwZHJ2ZXh0cmFfY21kX3Bhcm0gPSAoc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtCSopY21kX29iai0+cGFybWJ1ZjsKIAogCQkJaWYgKHBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPT0gUE9XRVJfU0FWSU5HX0NUUkxfV0tfQ0lEKQpAQCAtOTMsNyArOTMsNyBAQAogCQl9CiAJfQogCi0JaWYgKGNtZF9vYmotPmNtZGNvZGUgPT0gR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsUGxhbikpCisJaWYgKGNtZF9vYmotPmNtZGNvZGUgPT0gX1NldENoYW5uZWxQbGFuX0NNRF8pCiAJCWJBbGxvdyA9IHRydWU7CiAKIAlpZiAoKCFwY21kcHJpdi0+cGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkICYmICFiQWxsb3cpIHx8CkBAIC0xMjIsNyArMTIyLDcgQEAKIAlyZXMgPSBfcnR3X2VucXVldWVfY21kKCZwY21kcHJpdi0+Y21kX3F1ZXVlLCBjbWRfb2JqKTsKIAogCWlmIChyZXMgPT0gX1NVQ0NFU1MpCi0JCXVwKCZwY21kcHJpdi0+Y21kX3F1ZXVlX3NlbWEpOworCQljb21wbGV0ZSgmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKTsKIAogZXhpdDoKIApAQCAtMTYyLDEyICsxNjIsMTIgQEAKIAlhbGxvd19zaWduYWwoU0lHVEVSTSk7CiAKIAlwY21kcHJpdi0+Y21kdGhkX3J1bm5pbmcgPSB0cnVlOwotCXVwKCZwY21kcHJpdi0+dGVybWluYXRlX2NtZHRocmVhZF9zZW1hKTsKKwljb21wbGV0ZSgmcGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfY29tcCk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLCAoInN0YXJ0IHI4NzF4IHJ0d19jbWRfdGhyZWFkICEhISFcbiIpKTsKIAogCXdoaWxlICgxKSB7Ci0JCWlmIChfcnR3X2Rvd25fc2VtYSgmcGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKSA9PSBfRkFJTCkKKwkJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKSkKIAkJCWJyZWFrOwogCiAJCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwKQEAgLTIzNCw3ICsyMzQsNyBAQAogCQlydHdfZnJlZV9jbWRfb2JqKHBjbWQpOwogCX0KIAotCXVwKCZwY21kcHJpdi0+dGVybWluYXRlX2NtZHRocmVhZF9zZW1hKTsKKwljb21wbGV0ZSgmcGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfY29tcCk7CiAKIAogCWNvbXBsZXRlX2FuZF9leGl0KE5VTEwsIDApOwpAQCAtMjcxLDcgKzI3MSw3IEBACiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLCAoIiVzOiBmbHVzaCBuZXR3b3JrIHF1ZXVlXG4iLCBfX2Z1bmNfXykpOwogCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHN1cnZleVBhcmEsIEdFTl9DTURfQ09ERShfU2l0ZVN1cnZleSkpOworCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzdXJ2ZXlQYXJhLCBfU2l0ZVN1cnZleV9DTURfKTsKIAogCS8qIHBzdXJ2ZXlQYXJhLT5ic3NsaW1pdCA9IDQ4OyAqLwogCXBzdXJ2ZXlQYXJhLT5zY2FuX21vZGUgPSBwbWxtZXByaXYtPnNjYW5fbW9kZTsKQEAgLTMwNSw4ICszMDUsNiBAQAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiAKIAlpZiAocmVzID09IF9TVUNDRVNTKSB7Ci0JCXBtbG1lcHJpdi0+c2Nhbl9zdGFydF90aW1lID0gamlmZmllczsKLQogCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwKIAkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoU0NBTk5JTkdfVElNRU9VVCkpOwogCkBAIC00OTEsNyArNDg5LDcgQEAKIAlwY21kLT5jbWRzeiA9IGdldF93bGFuX2Jzc2lkX2V4X3N6KHBzZWNuZXR3b3JrKTsvKiBnZXQgY21kc3ogYmVmb3JlIGVuZGlhbiBjb252ZXJzaW9uICovCiAKIAlJTklUX0xJU1RfSEVBRCgmcGNtZC0+bGlzdCk7Ci0JcGNtZC0+Y21kY29kZSA9IF9Kb2luQnNzX0NNRF87LyogR0VOX0NNRF9DT0RFKF9Kb2luQnNzKSAqLworCXBjbWQtPmNtZGNvZGUgPSBfSm9pbkJzc19DTURfOwogCXBjbWQtPnBhcm1idWYgPSAodW5zaWduZWQgY2hhciAqKXBzZWNuZXR3b3JrOwogCXBjbWQtPnJzcCA9IE5VTEw7CiAJcGNtZC0+cnNwc3ogPSAwOwpAQCAtNjcwLDEzICs2NjgsMTMgQEAKIAl1OAlyZXMgPSBfU1VDQ0VTUzsKIAogCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7CisJcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwaDJjKSB7CiAJCXJlcyA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JcGFkZGJhcmVxX3Bhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkQmFSZXFfcGFybSksIEdGUF9LRVJORUwpOworCXBhZGRiYXJlcV9wYXJtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkZEJhUmVxX3Bhcm0pLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXBhZGRiYXJlcV9wYXJtKSB7CiAJCWtmcmVlKHBoMmMpOwogCQlyZXMgPSBfRkFJTDsKQEAgLTY4Niw3ICs2ODQsNyBAQAogCXBhZGRiYXJlcV9wYXJtLT50aWQgPSB0aWQ7CiAJbWVtY3B5KHBhZGRiYXJlcV9wYXJtLT5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAKLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwYWRkYmFyZXFfcGFybSwgR0VOX0NNRF9DT0RFKF9BZGRCQVJlcSkpOworCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBhZGRiYXJlcV9wYXJtLCBfQWRkQkFSZXFfQ01EXyk7CiAKIAkvKiBEQkdfODhFKCJydHdfYWRkYmFyZXFfY21kLCB0aWQgPSVkXG4iLCB0aWQpOyAqLwogCkBAIC03MjQsNyArNzIyLDcgQEAKIAlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnR5cGVfc2l6ZSA9IDA7CiAJcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gKHU4ICopcGFkYXB0ZXI7CiAKLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOworCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBkcnZleHRyYV9jbWRfcGFybSwgX1NldF9EcnZfRXh0cmFfQ01EXyk7CiAKIAogCS8qIHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7ICovCkBAIC03NjcsNyArNzY1LDcgQEAKIAkJCWdvdG8gZXhpdDsKIAkJfQogCi0JCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBjbWRvYmosIHNldENoYW5uZWxQbGFuX3BhcmFtLCBHRU5fQ01EX0NPREUoX1NldENoYW5uZWxQbGFuKSk7CisJCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBjbWRvYmosIHNldENoYW5uZWxQbGFuX3BhcmFtLCBfU2V0Q2hhbm5lbFBsYW5fQ01EXyk7CiAJCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGNtZG9iaik7CiAJfSBlbHNlIHsKIAkJLyogbm8gbmVlZCB0byBlbnF1ZXVlLCBkbyB0aGUgY21kIGhkbCBkaXJlY3RseSBhbmQgZnJlZSBjbWQgcGFyYW1ldGVyICovCkBAIC05MzYsNyArOTM0LDcgQEAKIAkJcGRydmV4dHJhX2NtZF9wYXJtLT50eXBlX3NpemUgPSBscHNfY3RybF90eXBlOwogCQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSBOVUxMOwogCi0JCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBkcnZleHRyYV9jbWRfcGFybSwgR0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSk7CisJCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBkcnZleHRyYV9jbWRfcGFybSwgX1NldF9EcnZfRXh0cmFfQ01EXyk7CiAKIAkJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIAl9IGVsc2UgewpAQCAtOTc4LDcgKzk3Niw3IEBACiAJcGRydmV4dHJhX2NtZF9wYXJtLT5lY19pZCA9IFJUUF9USU1FUl9DRkdfV0tfQ0lEOwogCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gbWluX3RpbWU7CiAJcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gTlVMTDsKLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOworCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBkcnZleHRyYV9jbWRfcGFybSwgX1NldF9EcnZfRXh0cmFfQ01EXyk7CiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6CiAKQEAgLTEwMjAsNyArMTAxOCw3IEBACiAJCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBBTlRfU0VMRUNUX1dLX0NJRDsKIAkJcGRydmV4dHJhX2NtZF9wYXJtLT50eXBlX3NpemUgPSBhbnRlbm5hOwogCQlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSBOVUxMOwotCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOworCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIF9TZXRfRHJ2X0V4dHJhX0NNRF8pOwogCiAJCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiAJfSBlbHNlIHsKQEAgLTEwNDgsNyArMTA0Niw3IEBACiAKIAlwZHJ2ZXh0cmFfY21kX3Bhcm0tPmVjX2lkID0gUE9XRVJfU0FWSU5HX0NUUkxfV0tfQ0lEOwogCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9IE5VTEw7Ci0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocHBzY21kLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOworCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBwc2NtZCwgcGRydmV4dHJhX2NtZF9wYXJtLCBfU2V0X0Rydl9FeHRyYV9DTURfKTsKIAogCXJldHVybiBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBwc2NtZCk7CiB9CkBAIC0xMTE5LDcgKzExMTcsNyBAQAogCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gMDsKIAlwZHJ2ZXh0cmFfY21kX3Bhcm0tPnBidWYgPSBOVUxMOwogCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLCBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKTsKKwlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sIF9TZXRfRHJ2X0V4dHJhX0NNRF8pOwogCiAJcmVzID0gcnR3X2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIGV4aXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2RlYnVnLmMKaW5kZXggZGI1Yzk1Mi4uNjBkOGM3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZGVidWcuYwpAQCAtMTM4LDE0NCArMTM4LDYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLWludCBwcm9jX2dldF9md3N0YXRlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpbnQgbGVuID0gMDsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImZ3c3RhdGU9MHgleFxuIiwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfc2VjX2luZm8oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCWludCBsZW4gPSAwOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiYXV0aF9hbGc9MHgleCwgZW5jX2FsZz0weCV4LCBhdXRoX3R5cGU9MHgleCwgZW5jX3R5cGU9MHgleFxuIiwKLQkJCQkJCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0sIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0sCi0JCQkJCQlwc2VjdXJpdHlwcml2LT5uZGlzYXV0aHR5cGUsIHBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9tbG1leHRfc3RhdGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWludCBsZW4gPSAwOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAicG1sbWVpbmZvLT5zdGF0ZT0weCV4XG4iLCBwbWxtZWluZm8tPnN0YXRlKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9xb3Nfb3B0aW9uKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpbnQgbGVuID0gMDsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInFvc19vcHRpb249JWRcbiIsIHBtbG1lcHJpdi0+cW9zcHJpdi5xb3Nfb3B0aW9uKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9odF9vcHRpb24oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWludCBsZW4gPSAwOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiaHRfb3B0aW9uPSVkXG4iLCBwbWxtZXByaXYtPmh0cHJpdi5odF9vcHRpb24pOwotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9yZl9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JaW50IGxlbiA9IDA7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJjdXJfY2g9JWQsIGN1cl9idz0lZCwgY3VyX2NoX29mZnNldD0lZFxuIiwKLQkJCQkJcG1sbWVleHQtPmN1cl9jaGFubmVsLCBwbWxtZWV4dC0+Y3VyX2J3bW9kZSwgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQpOwotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9hcF9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCWludCBsZW4gPSAwOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbyhwc3RhcHJpdiwgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JaWYgKHBzdGEpIHsKLQkJaW50IGk7Ci0JCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKLQotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJTU0lEPSVzXG4iLCBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJzdGEncyBtYWNhZGRyOiVwTVxuIiwgcHN0YS0+aHdhZGRyKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiY3VyX2NoYW5uZWw9JWQsIGN1cl9id21vZGU9JWQsIGN1cl9jaF9vZmZzZXQ9JWRcbiIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgcG1sbWVleHQtPmN1cl9id21vZGUsIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0KTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAicnRzZW49JWQsIGN0czJzbGVmPSVkXG4iLCBwc3RhLT5ydHNlbiwgcHN0YS0+Y3RzMnNlbGYpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJzdGF0ZT0weCV4LCBhaWQ9JWQsIG1hY2lkPSVkLCByYWlkPSVkXG4iLCBwc3RhLT5zdGF0ZSwgcHN0YS0+YWlkLCBwc3RhLT5tYWNfaWQsIHBzdGEtPnJhaWQpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJxb3NfZW49JWQsIGh0X2VuPSVkLCBpbml0X3JhdGU9JWRcbiIsIHBzdGEtPnFvc19vcHRpb24sIHBzdGEtPmh0cHJpdi5odF9vcHRpb24sIHBzdGEtPmluaXRfcmF0ZSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImJ3bW9kZT0lZCwgY2hfb2Zmc2V0PSVkLCBzZ2k9JWRcbiIsIHBzdGEtPmh0cHJpdi5id21vZGUsIHBzdGEtPmh0cHJpdi5jaF9vZmZzZXQsIHBzdGEtPmh0cHJpdi5zZ2kpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJhbXBkdV9lbmFibGUgPSAlZFxuIiwgcHN0YS0+aHRwcml2LmFtcGR1X2VuYWJsZSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImFnZ19lbmFibGVfYml0bWFwPSV4LCBjYW5kaWRhdGVfdGlkX2JpdG1hcD0leFxuIiwgcHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwLCBwc3RhLT5odHByaXYuY2FuZGlkYXRlX3RpZF9iaXRtYXApOwotCi0JCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07Ci0JCQlpZiAocHJlb3JkZXJfY3RybC0+ZW5hYmxlKQotCQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInRpZD0lZCwgaW5kaWNhdGVfc2VxPSVkXG4iLCBpLCBwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiY2FuJ3QgZ2V0IHN0YSdzIG1hY2FkZHIsIGN1cl9uZXR3b3JrJ3MgbWFjYWRkcjogJXBNXG4iLCBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQl9Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCiBpbnQgcHJvY19nZXRfYWRhcHRlcl9zdGF0ZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCiAJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAogCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKQEAgLTI5MSw1OTkgKzE1Myw2IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotaW50IHByb2NfZ2V0X3RyeF9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0JaW50IGxlbiA9IDA7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJmcmVlX3htaXRidWZfY250PSVkLCBmcmVlX3htaXRmcmFtZV9jbnQ9JWQsIGZyZWVfZXh0X3htaXRidWZfY250PSVkLCBmcmVlX3JlY3ZmcmFtZV9jbnQ9JWRcbiIsCi0JCQkJcHhtaXRwcml2LT5mcmVlX3htaXRidWZfY250LCBweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCwgcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX2NudCwgcHJlY3Zwcml2LT5mcmVlX3JlY3ZmcmFtZV9jbnQpOwotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInJ4X3VyYl9wZW5kaW5nX2NuPSVkXG4iLCBwcmVjdnByaXYtPnJ4X3BlbmRpbmdfY250KTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9tYWNfcmVnX2R1bXAxKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCWludCBpLCBqID0gMTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBNQUMgUkVHID09PT09PT1cbiIpOwotCi0JZm9yIChpID0gMHgwOyBpIDwgMHgzMDA7IGkgKz0gNCkgewotCQlpZiAoaiU0ID09IDEpCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIweCUwMngiLCBpKTsKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiIDB4JTA4eCAiLCB1c2JfcmVhZDMyKHBhZGFwdGVyLCBpKSk7Ci0JCWlmICgoaisrKSU0ID09IDApCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbiIpOwotCX0KLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9tYWNfcmVnX2R1bXAyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCWludCBpLCBqID0gMTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBNQUMgUkVHID09PT09PT1cbiIpOwotCW1lbXNldChwYWdlLCAwLCBjb3VudCk7Ci0JZm9yIChpID0gMHgzMDA7IGkgPCAweDYwMDsgaSArPSA0KSB7Ci0JCWlmIChqJTQgPT0gMSkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIjB4JTAyeCIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHVzYl9yZWFkMzIocGFkYXB0ZXIsIGkpKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2NfZ2V0X21hY19yZWdfZHVtcDMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGksIGogPSAxOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG49PT09PT09IE1BQyBSRUcgPT09PT09PVxuIik7Ci0KLQlmb3IgKGkgPSAweDYwMDsgaSA8IDB4ODAwOyBpICs9IDQpIHsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4IiwgaSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIiAweCUwOHggIiwgdXNiX3JlYWQzMihwYWRhcHRlciwgaSkpOwotCQlpZiAoKGorKyklNCA9PSAwKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKLQl9Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19nZXRfYmJfcmVnX2R1bXAxKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCWludCBpLCBqID0gMTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBCQiBSRUcgPT09PT09PVxuIik7Ci0JZm9yIChpID0gMHg4MDA7IGkgPCAweEIwMDsgaSArPSA0KSB7Ci0JCWlmIChqJTQgPT0gMSkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIjB4JTAyeCIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHVzYl9yZWFkMzIocGFkYXB0ZXIsIGkpKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9iYl9yZWdfZHVtcDIoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGksIGogPSAxOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG49PT09PT09IEJCIFJFRyA9PT09PT09XG4iKTsKLQlmb3IgKGkgPSAweEIwMDsgaSA8IDB4RTAwOyBpICs9IDQpIHsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4IiwgaSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIiAweCUwOHggIiwgdXNiX3JlYWQzMihwYWRhcHRlciwgaSkpOwotCQlpZiAoKGorKyklNCA9PSAwKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKLQl9Ci0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2NfZ2V0X2JiX3JlZ19kdW1wMyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaSwgaiA9IDE7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbj09PT09PT0gQkIgUkVHID09PT09PT1cbiIpOwotCWZvciAoaSA9IDB4RTAwOyBpIDwgMHgxMDAwOyBpICs9IDQpIHsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4IiwgaSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIiAweCUwOHggIiwgdXNiX3JlYWQzMihwYWRhcHRlciwgaSkpOwotCQlpZiAoKGorKyklNCA9PSAwKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKLQl9Ci0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2NfZ2V0X3JmX3JlZ19kdW1wMShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaSwgaiA9IDEsIHBhdGg7Ci0JdTMyIHZhbHVlOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG49PT09PT09IFJGIFJFRyA9PT09PT09XG4iKTsKLQlwYXRoID0gMTsKLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcblJGX1BhdGgoJXgpXG4iLCBwYXRoKTsKLQlmb3IgKGkgPSAwOyBpIDwgMHhDMDsgaSsrKSB7Ci0JCXZhbHVlID0gcnR3X2hhbF9yZWFkX3JmcmVnKHBhZGFwdGVyLCBwYXRoLCBpLCAweGZmZmZmZmZmKTsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4ICIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHZhbHVlKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9yZl9yZWdfZHVtcDIoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGksIGogPSAxLCBwYXRoOwotCXUzMiB2YWx1ZTsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuPT09PT09PSBSRiBSRUcgPT09PT09PVxuIik7Ci0JcGF0aCA9IDE7Ci0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG5SRl9QYXRoKCV4KVxuIiwgcGF0aCk7Ci0JZm9yIChpID0gMHhDMDsgaSA8IDB4MTAwOyBpKyspIHsKLQkJdmFsdWUgPSBydHdfaGFsX3JlYWRfcmZyZWcocGFkYXB0ZXIsIHBhdGgsIGksIDB4ZmZmZmZmZmYpOwotCQlpZiAoaiU0ID09IDEpCi0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIweCUwMnggIiwgaSk7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIiAweCUwOHggIiwgdmFsdWUpOwotCQlpZiAoKGorKyklNCA9PSAwKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKLQl9Ci0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2NfZ2V0X3JmX3JlZ19kdW1wMyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaSwgaiA9IDEsIHBhdGg7Ci0JdTMyIHZhbHVlOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG49PT09PT09IFJGIFJFRyA9PT09PT09XG4iKTsKLQlwYXRoID0gMjsKLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcblJGX1BhdGgoJXgpXG4iLCBwYXRoKTsKLQlmb3IgKGkgPSAwOyBpIDwgMHhDMDsgaSsrKSB7Ci0JCXZhbHVlID0gcnR3X2hhbF9yZWFkX3JmcmVnKHBhZGFwdGVyLCBwYXRoLCBpLCAweGZmZmZmZmZmKTsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4ICIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHZhbHVlKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotCi1pbnQgcHJvY19nZXRfcmZfcmVnX2R1bXA0KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCWludCBpLCBqID0gMSwgcGF0aDsKLQl1MzIgdmFsdWU7Ci0KLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbj09PT09PT0gUkYgUkVHID09PT09PT1cbiIpOwotCXBhdGggPSAyOwotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuUkZfUGF0aCgleClcbiIsIHBhdGgpOwotCWZvciAoaSA9IDB4QzA7IGkgPCAweDEwMDsgaSsrKSB7Ci0JCXZhbHVlID0gcnR3X2hhbF9yZWFkX3JmcmVnKHBhZGFwdGVyLCBwYXRoLCBpLCAweGZmZmZmZmZmKTsKLQkJaWYgKGolNCA9PSAxKQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiMHglMDJ4ICIsIGkpOwotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICIgMHglMDh4ICIsIHZhbHVlKTsKLQkJaWYgKChqKyspJTQgPT0gMCkKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7Ci0JfQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLQotCi1pbnQgcHJvY19nZXRfcnhfc2lnbmFsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCWludCBsZW4gPSAwOwotCi0JbGVuID0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQsCi0JCSJyc3NpOiVkXG4iCi0JCSJyeHB3ZGI6JWRcbiIKLQkJInNpZ25hbF9zdHJlbmd0aDoldVxuIgotCQkic2lnbmFsX3F1YWw6JXVcbiIKLQkJIm5vaXNlOiV1XG4iLAotCQlwYWRhcHRlci0+cmVjdnByaXYucnNzaSwKLQkJcGFkYXB0ZXItPnJlY3Zwcml2LnJ4cHdkYiwKLQkJcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9zdHJlbmd0aCwKLQkJcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9xdWFsLAotCQlwYWRhcHRlci0+cmVjdnByaXYubm9pc2UKLQkJKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX3NldF9yeF9zaWduYWwoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0JY2hhciB0bXBbMzJdOwotCXUzMiBpc19zaWduYWxfZGJnOwotCXMzMiBzaWduYWxfc3RyZW5ndGg7Ci0KLQlpZiAoY291bnQgPCAxKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChidWZmZXIgJiYgIWNvcHlfZnJvbV91c2VyKHRtcCwgYnVmZmVyLCBzaXplb2YodG1wKSkpIHsKLQkJaW50IG51bSA9IHNzY2FuZih0bXAsICIldSAldSIsICZpc19zaWduYWxfZGJnLCAmc2lnbmFsX3N0cmVuZ3RoKTsKLQotCQlpc19zaWduYWxfZGJnID0gaXNfc2lnbmFsX2RiZyA9PSAwID8gMCA6IDE7Ci0JCWlmIChpc19zaWduYWxfZGJnICYmIG51bSAhPSAyKQotCQkJcmV0dXJuIGNvdW50OwotCi0JCXNpZ25hbF9zdHJlbmd0aCA9IGNsYW1wKHNpZ25hbF9zdHJlbmd0aCwgMCwgMTAwKTsKLQotCQlwYWRhcHRlci0+cmVjdnByaXYuaXNfc2lnbmFsX2RiZyA9IGlzX3NpZ25hbF9kYmc7Ci0JCXBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfc3RyZW5ndGhfZGJnID0gc2lnbmFsX3N0cmVuZ3RoOwotCi0JCWlmIChpc19zaWduYWxfZGJnKQotCQkJREJHXzg4RSgic2V0ICVzICV1XG4iLCAiREJHX1NJR05BTF9TVFJFTkdUSCIsIHNpZ25hbF9zdHJlbmd0aCk7Ci0JCWVsc2UKLQkJCURCR184OEUoInNldCAlc1xuIiwgIkhXX1NJR05BTF9TVFJFTkdUSCIpOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLWludCBwcm9jX2dldF9odF9lbmFibGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYJKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JaW50IGxlbiA9IDA7Ci0KLQlpZiAocHJlZ3ByaXYpCi0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKLQkJCSIlZFxuIiwKLQkJCXByZWdwcml2LT5odF9lbmFibGUKLQkJCSk7Ci0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2Nfc2V0X2h0X2VuYWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQljaGFyIHRtcFszMl07Ci0JczMyIG1vZGUgPSAwOwotCi0JaWYgKGNvdW50IDwgMSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoYnVmZmVyICYmICFjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZmZlciwgc2l6ZW9mKHRtcCkpKSB7Ci0JCWlmIChwcmVncHJpdikgewotCQkJcHJlZ3ByaXYtPmh0X2VuYWJsZSA9IG1vZGU7Ci0JCQlwcl9pbmZvKCJodF9lbmFibGU9JWRcbiIsIHByZWdwcml2LT5odF9lbmFibGUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi1pbnQgcHJvY19nZXRfY2J3NDBfZW5hYmxlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCi0JaW50IGxlbiA9IDA7Ci0KLQlpZiAocHJlZ3ByaXYpCi0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKLQkJCSIlZFxuIiwKLQkJCXByZWdwcml2LT5jYnc0MF9lbmFibGUKLQkJCSk7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19zZXRfY2J3NDBfZW5hYmxlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCWNoYXIgdG1wWzMyXTsKLQlzMzIgbW9kZSA9IDA7Ci0KLQlpZiAoY291bnQgPCAxKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChidWZmZXIgJiYgIWNvcHlfZnJvbV91c2VyKHRtcCwgYnVmZmVyLCBzaXplb2YodG1wKSkpIHsKLQkJaWYgKHByZWdwcml2KSB7Ci0JCQlwcmVncHJpdi0+Y2J3NDBfZW5hYmxlID0gbW9kZTsKLQkJCXByX2luZm8oImNidzQwX2VuYWJsZT0lZFxuIiwgbW9kZSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotCi1pbnQgcHJvY19nZXRfYW1wZHVfZW5hYmxlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCi0JaW50IGxlbiA9IDA7Ci0KLQlpZiAocHJlZ3ByaXYpCi0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKLQkJCSIlZFxuIiwKLQkJCXByZWdwcml2LT5hbXBkdV9lbmFibGUKLQkJCSk7Ci0KLQkqZW9mID0gMTsKLQlyZXR1cm4gbGVuOwotfQotCi1pbnQgcHJvY19zZXRfYW1wZHVfZW5hYmxlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCWNoYXIgdG1wWzMyXTsKLQlzMzIgbW9kZSA9IDA7Ci0KLQlpZiAoY291bnQgPCAxKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChidWZmZXIgJiYgIWNvcHlfZnJvbV91c2VyKHRtcCwgYnVmZmVyLCBzaXplb2YodG1wKSkpIHsKLQkJaWYgKHByZWdwcml2KSB7Ci0JCQlwcmVncHJpdi0+YW1wZHVfZW5hYmxlID0gbW9kZTsKLQkJCXByX2luZm8oImFtcGR1X2VuYWJsZT0lZFxuIiwgbW9kZSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGNvdW50OwotfQotCi1pbnQgcHJvY19nZXRfdHdvX3BhdGhfcnNzaShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWludCBsZW4gPSAwOwotCi0JaWYgKHBhZGFwdGVyKQotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0JCQkiJWQgJWRcbiIsCi0JCQlwYWRhcHRlci0+cmVjdnByaXYuUnhSc3NpWzBdLAotCQkJcGFkYXB0ZXItPnJlY3Zwcml2LlJ4UnNzaVsxXQotCQkJKTsKLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLWludCBwcm9jX2dldF9yeF9zdGJjKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCi0JaW50IGxlbiA9IDA7Ci0KLQlpZiAocHJlZ3ByaXYpCi0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKLQkJCSIlZFxuIiwKLQkJCXByZWdwcml2LT5yeF9zdGJjCi0JCQkpOwotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotaW50IHByb2Nfc2V0X3J4X3N0YmMoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYJKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JY2hhciB0bXBbMzJdOwotCXUzMiBtb2RlID0gMDsKLQotCWlmIChjb3VudCA8IDEpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKGJ1ZmZlciAmJiAhY29weV9mcm9tX3VzZXIodG1wLCBidWZmZXIsIHNpemVvZih0bXApKSkgewotCQlpZiAocHJlZ3ByaXYpIHsKLQkJCXByZWdwcml2LT5yeF9zdGJjID0gbW9kZTsKLQkJCW5ldGRldl9pbmZvKGRldiwgInJ4X3N0YmM9JWRcbiIsIG1vZGUpOwotCQl9Ci0JfQotCXJldHVybiBjb3VudDsKLX0KLQotaW50IHByb2NfZ2V0X3Jzc2lfZGlzcChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQkqZW9mID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHByb2Nfc2V0X3Jzc2lfZGlzcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilydHdfbmV0ZGV2X3ByaXYoZGV2KTsKLQljaGFyIHRtcFszMl07Ci0JdTMyIGVuYWJsZSA9IDA7Ci0KLQlpZiAoY291bnQgPCAxKSB7Ci0JCURCR184OEUoImFyZ3VtZW50IHNpemUgaXMgbGVzcyB0aGFuIDFcbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlpZiAoYnVmZmVyICYmICFjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZmZlciwgc2l6ZW9mKHRtcCkpKSB7Ci0JCWludCBudW0gPSBzc2NhbmYodG1wLCAiJXgiLCAmZW5hYmxlKTsKLQotCQlpZiAobnVtICE9ICAxKSB7Ci0JCQlEQkdfODhFKCJpbnZhbGlkIHNldF9yc3NpX2Rpc3AgcGFyYW1ldGVyIVxuIik7Ci0JCQlyZXR1cm4gY291bnQ7Ci0JCX0KLQotCQlpZiAoZW5hYmxlKSB7Ci0JCQlEQkdfODhFKCJUdXJuIE9uIFJ4IFJTU0kgRGlzcGxheSBGdW5jdGlvblxuIik7Ci0JCQlwYWRhcHRlci0+YlJ4UlNTSURpc3BsYXkgPSBlbmFibGU7Ci0JCX0gZWxzZSB7Ci0JCQlEQkdfODhFKCJUdXJuIE9mZiBSeCBSU1NJIERpc3BsYXkgRnVuY3Rpb25cbiIpOwotCQkJcGFkYXB0ZXItPmJSeFJTU0lEaXNwbGF5ID0gMDsKLQkJfQotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLSNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCi0KLWludCBwcm9jX2dldF9hbGxfc3RhX2luZm8oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKXJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JaW50IGksIGo7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGxpc3QsICpwaGVhZDsKLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci0JaW50IGxlbiA9IDA7Ci0KLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInN0YV9kel9iaXRtYXA9MHgleCwgdGltX2JpdG1hcD0weCV4XG4iLCBwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCwgcHN0YXByaXYtPnRpbV9iaXRtYXApOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQTsgaSsrKSB7Ci0JCXBoZWFkID0gJnBzdGFwcml2LT5zdGFfaGFzaFtpXTsKLQkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKLQotCQl3aGlsZSAocGhlYWQgIT0gcGxpc3QpIHsKLQkJCXBzdGEgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCBzdGFfaW5mbywgaGFzaF9saXN0KTsKLQotCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKLQotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAic3RhJ3MgbWFjYWRkcjogJXBNXG4iLCBwc3RhLT5od2FkZHIpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAicnRzZW49JWQsIGN0czJzbGVmPSVkXG4iLCBwc3RhLT5ydHNlbiwgcHN0YS0+Y3RzMnNlbGYpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAic3RhdGU9MHgleCwgYWlkPSVkLCBtYWNpZD0lZCwgcmFpZD0lZFxuIiwgcHN0YS0+c3RhdGUsIHBzdGEtPmFpZCwgcHN0YS0+bWFjX2lkLCBwc3RhLT5yYWlkKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgInFvc19lbj0lZCwgaHRfZW49JWQsIGluaXRfcmF0ZT0lZFxuIiwgcHN0YS0+cW9zX29wdGlvbiwgcHN0YS0+aHRwcml2Lmh0X29wdGlvbiwgcHN0YS0+aW5pdF9yYXRlKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImJ3bW9kZT0lZCwgY2hfb2Zmc2V0PSVkLCBzZ2k9JWRcbiIsIHBzdGEtPmh0cHJpdi5id21vZGUsIHBzdGEtPmh0cHJpdi5jaF9vZmZzZXQsIHBzdGEtPmh0cHJpdi5zZ2kpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiYW1wZHVfZW5hYmxlID0gJWRcbiIsIHBzdGEtPmh0cHJpdi5hbXBkdV9lbmFibGUpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiYWdnX2VuYWJsZV9iaXRtYXA9JXgsIGNhbmRpZGF0ZV90aWRfYml0bWFwPSV4XG4iLCBwc3RhLT5odHByaXYuYWdnX2VuYWJsZV9iaXRtYXAsIHBzdGEtPmh0cHJpdi5jYW5kaWRhdGVfdGlkX2JpdG1hcCk7Ci0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJzbGVlcHFfbGVuPSVkXG4iLCBwc3RhLT5zbGVlcHFfbGVuKTsKLQkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgImNhcGFiaWxpdHk9MHgleFxuIiwgcHN0YS0+Y2FwYWJpbGl0eSk7Ci0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJmbGFncz0weCV4XG4iLCBwc3RhLT5mbGFncyk7Ci0JCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJ3cGFfcHNrPTB4JXhcbiIsIHBzdGEtPndwYV9wc2spOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAid3BhMl9ncm91cF9jaXBoZXI9MHgleFxuIiwgcHN0YS0+d3BhMl9ncm91cF9jaXBoZXIpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAid3BhMl9wYWlyd2lzZV9jaXBoZXI9MHgleFxuIiwgcHN0YS0+d3BhMl9wYWlyd2lzZV9jaXBoZXIpOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAicW9zX2luZm89MHgleFxuIiwgcHN0YS0+cW9zX2luZm8pOwotCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiZG90MTE4MDIxWFByaXZhY3k9MHgleFxuIiwgcHN0YS0+ZG90MTE4MDIxWFByaXZhY3kpOwotCi0JCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgewotCQkJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtqXTsKLQkJCQlpZiAocHJlb3JkZXJfY3RybC0+ZW5hYmxlKQotCQkJCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJ0aWQ9JWQsIGluZGljYXRlX3NlcT0lZFxuIiwgaiwgcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxKTsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLSNlbmRpZgotCiBpbnQgcHJvY19nZXRfYmVzdF9jaGFubmVsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKIAkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCiAJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19lZnVzZS5jCmluZGV4IGZiY2UxZjcuLjE2Y2M3NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZWZ1c2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2VmdXNlLmMKQEAgLTMxNyw2OSArMzE3LDYgQEAKIAl9CiB9CiAKLS8qIERvIG5vdCBzdXBwb3J0IEJUICovCi12b2lkIEVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbihzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHU4IGVmdXNlVHlwZSwgdTggdHlwZSwgdm9pZCAqcE91dCkKLXsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIFRZUEVfRUZVU0VfTUFYX1NFQ1RJT046Ci0JCXsKLQkJCXU4ICpwTWF4X3NlY3Rpb247Ci0JCQlwTWF4X3NlY3Rpb24gPSBwT3V0OwotCQkJKnBNYXhfc2VjdGlvbiA9IEVGVVNFX01BWF9TRUNUSU9OXzg4RTsKLQkJfQotCQlicmVhazsKLQljYXNlIFRZUEVfRUZVU0VfUkVBTF9DT05URU5UX0xFTjoKLQkJewotCQkJdTE2ICpwdTJUbXA7Ci0JCQlwdTJUbXAgPSBwT3V0OwotCQkJKnB1MlRtcCA9IEVGVVNFX1JFQUxfQ09OVEVOVF9MRU5fODhFOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVFlQRV9FRlVTRV9DT05URU5UX0xFTl9CQU5LOgotCQl7Ci0JCQl1MTYgKnB1MlRtcDsKLQkJCXB1MlRtcCA9IHBPdXQ7Ci0JCQkqcHUyVG1wID0gRUZVU0VfUkVBTF9DT05URU5UX0xFTl84OEU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19CQU5LOgotCQl7Ci0JCQl1MTYgKnB1MlRtcDsKLQkJCXB1MlRtcCA9IHBPdXQ7Ci0JCQkqcHUyVG1wID0gKHUxNikoRUZVU0VfUkVBTF9DT05URU5UX0xFTl84OEUtRUZVU0VfT09CX1BST1RFQ1RfQllURVNfODhFKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX1RPVEFMOgotCQl7Ci0JCQl1MTYgKnB1MlRtcDsKLQkJCXB1MlRtcCA9IHBPdXQ7Ci0JCQkqcHUyVG1wID0gKHUxNikoRUZVU0VfUkVBTF9DT05URU5UX0xFTl84OEUtRUZVU0VfT09CX1BST1RFQ1RfQllURVNfODhFKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFRZUEVfRUZVU0VfTUFQX0xFTjoKLQkJewotCQkJdTE2ICpwdTJUbXA7Ci0JCQlwdTJUbXAgPSBwT3V0OwotCQkJKnB1MlRtcCA9ICh1MTYpRUZVU0VfTUFQX0xFTl84OEU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUWVBFX0VGVVNFX1BST1RFQ1RfQllURVNfQkFOSzoKLQkJewotCQkJdTggKnB1MVRtcDsKLQkJCXB1MVRtcCA9IHBPdXQ7Ci0JCQkqcHUxVG1wID0gKHU4KShFRlVTRV9PT0JfUFJPVEVDVF9CWVRFU184OEUpOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXsKLQkJCXU4ICpwdTFUbXA7Ci0JCQlwdTFUbXAgPSBwT3V0OwotCQkJKnB1MVRtcCA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotfQotCiB1OCBFZnVzZV9Xb3JkRW5hYmxlRGF0YVdyaXRlKHN0cnVjdCBhZGFwdGVyICpwQWRhcHRlciwgdTE2IGVmdXNlX2FkZHIsIHU4IHdvcmRfZW4sIHU4ICpkYXRhKQogewogCXUxNgl0bXBhZGRyID0gMDsKQEAgLTQ4MywxNCArNDIwLDExIEBACiAJdTggaG9mZnNldCA9IDAsIGh3b3JkZW4gPSAwOwogCXU4IHRtcGlkeCA9IDA7CiAJdTggdG1wZGF0YVs4XTsKLQl1OCBtYXhfc2VjdGlvbiA9IDA7CiAJdTggdG1wX2hlYWRlciA9IDA7CiAKLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIEVGVVNFX1dJRkksIFRZUEVfRUZVU0VfTUFYX1NFQ1RJT04sICh2b2lkICopJm1heF9zZWN0aW9uKTsKLQogCWlmICghZGF0YSkKIAkJcmV0dXJuIGZhbHNlOwotCWlmIChvZmZzZXQgPiBtYXhfc2VjdGlvbikKKwlpZiAob2Zmc2V0ID4gRUZVU0VfTUFYX1NFQ1RJT05fODhFKQogCQlyZXR1cm4gZmFsc2U7CiAKIAltZW1zZXQoZGF0YSwgMHhmZiwgc2l6ZW9mKHU4KSAqIFBHUEtUX0RBVEFfU0laRSk7CkBAIC01OTEsMTIgKzUyNSwxMiBAQAogc3RhdGljIGJvb2wgaGFsX0VmdXNlUGdQYWNrZXRXcml0ZTJCeXRlSGVhZGVyKHN0cnVjdCBhZGFwdGVyICpwQWRhcHRlciwgdTggZWZ1c2VUeXBlLCB1MTYgKnBBZGRyLCBzdHJ1Y3QgcGdwa3QgKnBUYXJnZXRQa3QpCiB7CiAJYm9vbCBiUmV0ID0gZmFsc2U7Ci0JdTE2CWVmdXNlX2FkZHIgPSAqcEFkZHIsIGVmdXNlX21heF9hdmFpbGFibGVfbGVuID0gMDsKKwl1MTYgZWZ1c2VfYWRkciA9ICpwQWRkcjsKKwl1MTYgZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4gPQorCQlFRlVTRV9SRUFMX0NPTlRFTlRfTEVOXzg4RSAtIEVGVVNFX09PQl9QUk9URUNUX0JZVEVTXzg4RTsKIAl1OCBwZ19oZWFkZXIgPSAwLCB0bXBfaGVhZGVyID0gMCwgcGdfaGVhZGVyX3RlbXAgPSAwOwogCXU4IHJlcGVhdGNudCA9IDA7CiAKLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIGVmdXNlVHlwZSwgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSywgKHZvaWQgKikmZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4pOwotCiAJd2hpbGUgKGVmdXNlX2FkZHIgPCBlZnVzZV9tYXhfYXZhaWxhYmxlX2xlbikgewogCQlwZ19oZWFkZXIgPSAoKHBUYXJnZXRQa3QtPm9mZnNldCAmIDB4MDcpIDw8IDUpIHwgMHgwRjsKIAkJZWZ1c2VfT25lQnl0ZVdyaXRlKHBBZGFwdGVyLCBlZnVzZV9hZGRyLCBwZ19oZWFkZXIpOwpAQCAtNzY5LDEyICs3MDMsMTEgQEAKIAlib29sIGJSZXQgPSBmYWxzZTsKIAl1OCBpLCBlZnVzZV9kYXRhID0gMCwgY3VyX2hlYWRlciA9IDA7CiAJdTggbWF0Y2hlZF93ZGVuID0gMCwgYmFkd29yZGVuID0gMDsKLQl1MTYJc3RhcnRBZGRyID0gMCwgZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4gPSAwLCBlZnVzZV9tYXggPSAwOworCXUxNiBzdGFydEFkZHIgPSAwOworCXUxNiBlZnVzZV9tYXhfYXZhaWxhYmxlX2xlbiA9CisJCUVGVVNFX1JFQUxfQ09OVEVOVF9MRU5fODhFIC0gRUZVU0VfT09CX1BST1RFQ1RfQllURVNfODhFOwogCXN0cnVjdCBwZ3BrdCBjdXJQa3Q7CiAKLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIGVmdXNlVHlwZSwgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSywgKHZvaWQgKikmZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4pOwotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbihwQWRhcHRlciwgZWZ1c2VUeXBlLCBUWVBFX0VGVVNFX1JFQUxfQ09OVEVOVF9MRU4sICh2b2lkICopJmVmdXNlX21heCk7Ci0KIAlydHdfaGFsX2dldF9od3JlZyhwQWRhcHRlciwgSFdfVkFSX0VGVVNFX0JZVEVTLCAodTggKikmc3RhcnRBZGRyKTsKIAlzdGFydEFkZHIgJT0gRUZVU0VfUkVBTF9DT05URU5UX0xFTjsKIApAQCAtODQ2LDEyICs3NzksNyBAQAogCQl1OCBlZnVzZVR5cGUKIAkpCiB7Ci0JdTE2CWVmdXNlX21heF9hdmFpbGFibGVfbGVuID0gMDsKLQotCS8qIENoYW5nZSB0byBjaGVjayBUWVBFX0VGVVNFX01BUF9MRU4gLCBiZWNhdXNlIDgxODhFIHJhdyAyNTYsIGxvZ2ljIG1hcCBvdmVyIDI1Ni4gKi8KLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIEVGVVNFX1dJRkksIFRZUEVfRUZVU0VfTUFQX0xFTiwgKHZvaWQgKikmZWZ1c2VfbWF4X2F2YWlsYWJsZV9sZW4pOwotCi0JaWYgKEVmdXNlX0dldEN1cnJlbnRTaXplKHBBZGFwdGVyKSA+PSBlZnVzZV9tYXhfYXZhaWxhYmxlX2xlbikKKwlpZiAoRWZ1c2VfR2V0Q3VycmVudFNpemUocEFkYXB0ZXIpID49IEVGVVNFX01BUF9MRU5fODhFKQogCQlyZXR1cm4gZmFsc2U7CiAJcmV0dXJuIHRydWU7CiB9CkBAIC05NzcsMTMgKzkwNSw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIEVmdXNlX1JlYWRBbGxNYXAoc3RydWN0IGFkYXB0ZXIgKnBBZGFwdGVyLCB1OCBlZnVzZVR5cGUsIHU4ICpFZnVzZSkKIHsKLQl1MTYgbWFwTGVuID0gMDsKLQogCUVmdXNlX1Bvd2VyU3dpdGNoKHBBZGFwdGVyLCBmYWxzZSwgdHJ1ZSk7CiAKLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIGVmdXNlVHlwZSwgVFlQRV9FRlVTRV9NQVBfTEVOLCAodm9pZCAqKSZtYXBMZW4pOwotCi0JZWZ1c2VfUmVhZEVGdXNlKHBBZGFwdGVyLCBlZnVzZVR5cGUsIDAsIG1hcExlbiwgRWZ1c2UpOworCWVmdXNlX1JlYWRFRnVzZShwQWRhcHRlciwgZWZ1c2VUeXBlLCAwLCBFRlVTRV9NQVBfTEVOXzg4RSwgRWZ1c2UpOwogCiAJRWZ1c2VfUG93ZXJTd2l0Y2gocEFkYXB0ZXIsIGZhbHNlLCBmYWxzZSk7CiB9CkBAIC05OTYsMTIgKzkyMCw5IEBACiAJdTggZWZ1c2VUeXBlKQogewogCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihwQWRhcHRlcik7Ci0JdTE2IG1hcExlbiA9IDA7Ci0KLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24ocEFkYXB0ZXIsIGVmdXNlVHlwZSwgVFlQRV9FRlVTRV9NQVBfTEVOLCAodm9pZCAqKSZtYXBMZW4pOwogCiAJaWYgKHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpCi0JCW1lbXNldChwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YSwgMHhGRiwgbWFwTGVuKTsKKwkJbWVtc2V0KHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhLCAweEZGLCBFRlVTRV9NQVBfTEVOXzg4RSk7CiAJZWxzZQogCQlFZnVzZV9SZWFkQWxsTWFwKHBBZGFwdGVyLCBlZnVzZVR5cGUsIHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2llZWU4MDIxMS5jCmluZGV4IDBiMGQ3OGYuLjkxNGM0OTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pZWVlODAyMTEuYwpAQCAtMTU1LDU5ICsxNTUsNiBAQAogCXJldHVybiBwYnVmICsgbGVuICsgMjsKIH0KIAotaW5saW5lIHU4ICpydHdfc2V0X2llX2NoX3N3aXRjaCh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sIHU4IGNoX3N3aXRjaF9tb2RlLAotCXU4IG5ld19jaCwgdTggY2hfc3dpdGNoX2NudCkKLXsKLQl1OCBpZV9kYXRhWzNdOwotCi0JaWVfZGF0YVswXSA9IGNoX3N3aXRjaF9tb2RlOwotCWllX2RhdGFbMV0gPSBuZXdfY2g7Ci0JaWVfZGF0YVsyXSA9IGNoX3N3aXRjaF9jbnQ7Ci0JcmV0dXJuIHJ0d19zZXRfaWUoYnVmLCBXTEFOX0VJRF9DSEFOTkVMX1NXSVRDSCwgIDMsIGllX2RhdGEsIGJ1Zl9sZW4pOwotfQotCi1pbmxpbmUgdTggc2Vjb25kYXJ5X2NoX29mZnNldF90b19oYWxfY2hfb2Zmc2V0KHU4IGNoX29mZnNldCkKLXsKLQlpZiAoY2hfb2Zmc2V0ID09IFNDTikKLQkJcmV0dXJuIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JZWxzZSBpZiAoY2hfb2Zmc2V0ID09IFNDQSkKLQkJcmV0dXJuIEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUjsKLQllbHNlIGlmIChjaF9vZmZzZXQgPT0gU0NCKQotCQlyZXR1cm4gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSOwotCi0JcmV0dXJuIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci19Ci0KLWlubGluZSB1OCBoYWxfY2hfb2Zmc2V0X3RvX3NlY29uZGFyeV9jaF9vZmZzZXQodTggY2hfb2Zmc2V0KQotewotCWlmIChjaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSkKLQkJcmV0dXJuIFNDTjsKLQllbHNlIGlmIChjaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSKQotCQlyZXR1cm4gU0NCOwotCWVsc2UgaWYgKGNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCXJldHVybiBTQ0E7Ci0KLQlyZXR1cm4gU0NOOwotfQotCi1pbmxpbmUgdTggKnJ0d19zZXRfaWVfc2Vjb25kYXJ5X2NoX29mZnNldCh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sIHU4IHNlY29uZGFyeV9jaF9vZmZzZXQpCi17Ci0JcmV0dXJuIHJ0d19zZXRfaWUoYnVmLCBXTEFOX0VJRF9TRUNPTkRBUllfQ0hBTk5FTF9PRkZTRVQsICAxLCAmc2Vjb25kYXJ5X2NoX29mZnNldCwgYnVmX2xlbik7Ci19Ci0KLWlubGluZSB1OCAqcnR3X3NldF9pZV9tZXNoX2NoX3N3aXRjaF9wYXJtKHU4ICpidWYsIHUzMiAqYnVmX2xlbiwgdTggdHRsLAotCXU4IGZsYWdzLCB1MTYgcmVhc29uLCB1MTYgcHJlY2VkZW5jZSkKLXsKLQl1OCBpZV9kYXRhWzZdOwotCi0JaWVfZGF0YVswXSA9IHR0bDsKLQlpZV9kYXRhWzFdID0gZmxhZ3M7Ci0JKih1MTYgKikoaWVfZGF0YSArIDIpID0gY3B1X3RvX2xlMTYocmVhc29uKTsKLQkqKHUxNiAqKShpZV9kYXRhICsgNCkgPSBjcHVfdG9fbGUxNihwcmVjZWRlbmNlKTsKLQotCXJldHVybiBydHdfc2V0X2llKGJ1ZiwgMHgxMTgsICA2LCBpZV9kYXRhLCBidWZfbGVuKTsKLX0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpbmRleDogdGhlIGluZm9ybWF0aW9uIGVsZW1lbnQgaWQgaW5kZXgsIGxpbWl0IGlzIHRoZSBsaW1pdCBmb3Igc2VhcmNoCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yMzYsOTcgKzE4Myw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qKgotICogcnR3X2dldF9pZV9leCAtIFNlYXJjaCBzcGVjaWZpYyBJRSBmcm9tIGEgc2VyaWVzIG9mIElFcwotICogQGluX2llOiBBZGRyZXNzIG9mIElFcyB0byBzZWFyY2gKLSAqIEBpbl9sZW46IExlbmd0aCBsaW1pdCBmcm9tIGluX2llCi0gKiBAZWlkOiBFbGVtZW50IElEIHRvIG1hdGNoCi0gKiBAb3VpOiBPVUkgdG8gbWF0Y2gKLSAqIEBvdWlfbGVuOiBPVUkgbGVuZ3RoCi0gKiBAaWU6IElmIG5vdCBOVUxMIGFuZCB0aGUgc3BlY2lmaWMgSUUgaXMgZm91bmQsIHRoZSBJRSB3aWxsIGJlIGNvcGllZCB0byB0aGUgYnVmIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmljIElFCi0gKiBAaWVsZW46IElmIG5vdCBOVUxMIGFuZCB0aGUgc3BlY2lmaWMgSUUgaXMgZm91bmQsIHdpbGwgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSBJRQotICoKLSAqIFJldHVybnM6IFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpYyBJRSBmb3VuZCwgb3IgTlVMTAotICovCi11OCAqcnR3X2dldF9pZV9leCh1OCAqaW5faWUsIHVpbnQgaW5fbGVuLCB1OCBlaWQsIHU4ICpvdWksIHU4IG91aV9sZW4sIHU4ICppZSwgdWludCAqaWVsZW4pCi17Ci0JdWludCBjbnQ7Ci0JdTggKnRhcmdldF9pZSA9IE5VTEw7Ci0KLQotCWlmIChpZWxlbikKLQkJKmllbGVuID0gMDsKLQotCWlmICghaW5faWUgfHwgaW5fbGVuIDw9IDApCi0JCXJldHVybiB0YXJnZXRfaWU7Ci0KLQljbnQgPSAwOwotCi0Jd2hpbGUgKGNudCA8IGluX2xlbikgewotCQlpZiAoZWlkID09IGluX2llW2NudF0gJiYgKCFvdWkgfHwgIW1lbWNtcCgmaW5faWVbY250ICsgMl0sIG91aSwgb3VpX2xlbikpKSB7Ci0JCQl0YXJnZXRfaWUgPSAmaW5faWVbY250XTsKLQotCQkJaWYgKGllKQotCQkJCW1lbWNweShpZSwgJmluX2llW2NudF0sIGluX2llW2NudCArIDFdICsgMik7Ci0KLQkJCWlmIChpZWxlbikKLQkJCQkqaWVsZW4gPSBpbl9pZVtjbnQgKyAxXSArIDI7Ci0KLQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJY250ICs9IGluX2llW2NudCArIDFdICsgMjsgLyogZ290byBuZXh0ICovCi0JCX0KLQl9Ci0JcmV0dXJuIHRhcmdldF9pZTsKLX0KLQotLyoqCi0gKiBydHdfaWVzX3JlbW92ZV9pZSAtIEZpbmQgbWF0Y2hpbmcgSUVzIGFuZCByZW1vdmUKLSAqIEBpZXM6IEFkZHJlc3Mgb2YgSUVzIHRvIHNlYXJjaAotICogQGllc19sZW46IFBvaW50ZXIgb2YgbGVuZ3RoIG9mIGllcywgd2lsbCB1cGRhdGUgdG8gbmV3IGxlbmd0aAotICogQG9mZnNldDogVGhlIG9mZnNldCB0byBzdGFydCBzY2FyY2gKLSAqIEBlaWQ6IEVsZW1lbnQgSUQgdG8gbWF0Y2gKLSAqIEBvdWk6IE9VSSB0byBtYXRjaAotICogQG91aV9sZW46IE9VSSBsZW5ndGgKLSAqCi0gKiBSZXR1cm5zOiBfU1VDQ0VTUzogaWVzIGlzIHVwZGF0ZWQsIF9GQUlMOiBub3QgdXBkYXRlZAotICovCi1pbnQgcnR3X2llc19yZW1vdmVfaWUodTggKmllcywgdWludCAqaWVzX2xlbiwgdWludCBvZmZzZXQsIHU4IGVpZCwgdTggKm91aSwgdTggb3VpX2xlbikKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0JdTggKnRhcmdldF9pZTsKLQl1MzIgdGFyZ2V0X2llbGVuOwotCXU4ICpzdGFydDsKLQl1aW50IHNlYXJjaF9sZW47Ci0KLQlpZiAoIWllcyB8fCAhaWVzX2xlbiB8fCAqaWVzX2xlbiA8PSBvZmZzZXQpCi0JCWdvdG8gZXhpdDsKLQotCXN0YXJ0ID0gaWVzICsgb2Zmc2V0OwotCXNlYXJjaF9sZW4gPSAqaWVzX2xlbiAtIG9mZnNldDsKLQotCXdoaWxlICgxKSB7Ci0JCXRhcmdldF9pZSA9IHJ0d19nZXRfaWVfZXgoc3RhcnQsIHNlYXJjaF9sZW4sIGVpZCwgb3VpLCBvdWlfbGVuLCBOVUxMLCAmdGFyZ2V0X2llbGVuKTsKLQkJaWYgKHRhcmdldF9pZSAmJiB0YXJnZXRfaWVsZW4pIHsKLQkJCXU4IGJ1ZltNQVhfSUVfU1pdID0gezB9OwotCQkJdTggKnJlbWFpbl9pZXMgPSB0YXJnZXRfaWUgKyB0YXJnZXRfaWVsZW47Ci0JCQl1aW50IHJlbWFpbl9sZW4gPSBzZWFyY2hfbGVuIC0gKHJlbWFpbl9pZXMgLSBzdGFydCk7Ci0KLQkJCW1lbWNweShidWYsIHJlbWFpbl9pZXMsIHJlbWFpbl9sZW4pOwotCQkJbWVtY3B5KHRhcmdldF9pZSwgYnVmLCByZW1haW5fbGVuKTsKLQkJCSppZXNfbGVuID0gKmllc19sZW4gLSB0YXJnZXRfaWVsZW47Ci0JCQlyZXQgPSBfU1VDQ0VTUzsKLQotCQkJc3RhcnQgPSB0YXJnZXRfaWU7Ci0JCQlzZWFyY2hfbGVuID0gcmVtYWluX2xlbjsKLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCiB2b2lkIHJ0d19zZXRfc3VwcG9ydGVkX3JhdGUodTggKlN1cHBvcnRlZFJhdGVzLCB1aW50IG1vZGUpCiB7CiAKQEAgLTEwOTYsNDMgKzk1Miw2IEBACiAJREJHXzg4RSgicnR3X21hY2FkZHJfY2ZnIE1BQyBBZGRyZXNzICA9ICVwTVxuIiwgKG1hY19hZGRyKSk7CiB9CiAKLXZvaWQgZHVtcF9pZXModTggKmJ1ZiwgdTMyIGJ1Zl9sZW4pCi17Ci0JdTggKnBvcyA9IGJ1ZjsKLQl1OCBpZCwgbGVuOwotCi0Jd2hpbGUgKHBvcyAtIGJ1ZiA8PSBidWZfbGVuKSB7Ci0JCWlkID0gKnBvczsKLQkJbGVuID0gKihwb3MgKyAxKTsKLQotCQlEQkdfODhFKCIlcyBJRDoldSwgTEVOOiV1XG4iLCBfX2Z1bmNfXywgaWQsIGxlbik7Ci0JCWR1bXBfd3BzX2llKHBvcywgbGVuKTsKLQotCQlwb3MgKz0gKDIgKyBsZW4pOwotCX0KLX0KLQotdm9pZCBkdW1wX3dwc19pZSh1OCAqaWUsIHUzMiBpZV9sZW4pCi17Ci0JdTggKnBvcyA9IGllOwotCXUxNiBpZDsKLQl1MTYgbGVuOwotCXU4ICp3cHNfaWU7Ci0JdWludCB3cHNfaWVsZW47Ci0KLQl3cHNfaWUgPSBydHdfZ2V0X3dwc19pZShpZSwgaWVfbGVuLCBOVUxMLCAmd3BzX2llbGVuKTsKLQlpZiAod3BzX2llICE9IGllIHx8IHdwc19pZWxlbiA9PSAwKQotCQlyZXR1cm47Ci0KLQlwb3MgKz0gNjsKLQl3aGlsZSAocG9zIC0gaWUgPCBpZV9sZW4pIHsKLQkJaWQgPSBnZXRfdW5hbGlnbmVkX2JlMTYocG9zKTsKLQkJbGVuID0gZ2V0X3VuYWxpZ25lZF9iZTE2KHBvcyArIDIpOwotCQlEQkdfODhFKCIlcyBJRDoweCUwNHgsIExFTjoldVxuIiwgX19mdW5jX18sIGlkLCBsZW4pOwotCQlwb3MgKz0gKDQgKyBsZW4pOwotCX0KLX0KLQogLyogQmFyb24gYWRkcyB0byBhdm9pZCBGcmVlQlNEIHdhcm5pbmcgKi8KIGludCBpZWVlODAyMTFfaXNfZW1wdHlfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIGludCBlc3NpZF9sZW4pCiB7CkBAIC0xMjIzLDcgKzEwNDIsNiBAQAogCV9fbGUxNiBsZV90bXA7CiAJdTE2IHdwYV9sZW4gPSAwLCByc25fbGVuID0gMDsKIAlzdHJ1Y3QgSFRfaW5mb19lbGVtZW50ICpwaHRfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwICpwaHRfY2FwID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQJCWxlbjsKIAl1bnNpZ25lZCBjaGFyCQkqcDsKIApAQCAtMTI1OSwxMCArMTA3NywxMiBAQAogCS8qIHBhcnNpbmcgSFRfQ0FQX0lFICovCiAJcCA9IHJ0d19nZXRfaWUocG5ldHdvcmstPm5ldHdvcmsuSUVzICsgX0ZJWEVEX0lFX0xFTkdUSF8sIF9IVF9DQVBBQklMSVRZX0lFXywgJmxlbiwgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGggLSBfRklYRURfSUVfTEVOR1RIXyk7CiAJaWYgKHAgJiYgbGVuID4gMCkgewotCQkJcGh0X2NhcCA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKikocCArIDIpOwotCQkJcG5ldHdvcmstPkJjbkluZm8uaHRfY2FwX2luZm8gPSBwaHRfY2FwLT5jYXBfaW5mbzsKKwkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcCA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKikocCArIDIpOworCisJCXBuZXR3b3JrLT5CY25JbmZvLmh0X2NhcF9pbmZvID0gbGUxNl90b19jcHUoaHRfY2FwLT5jYXBfaW5mbyk7CiAJfSBlbHNlIHsKLQkJCXBuZXR3b3JrLT5CY25JbmZvLmh0X2NhcF9pbmZvID0gMDsKKwkJcG5ldHdvcmstPkJjbkluZm8uaHRfY2FwX2luZm8gPSAwOwogCX0KIAkvKiBwYXJzaW5nIEhUX0lORk9fSUUgKi8KIAlwID0gcnR3X2dldF9pZShwbmV0d29yay0+bmV0d29yay5JRXMgKyBfRklYRURfSUVfTEVOR1RIXywgX0hUX0FERF9JTkZPX0lFXywgJmxlbiwgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGggLSBfRklYRURfSUVfTEVOR1RIXyk7CkBAIC0xMzM1LDU4ICsxMTU1LDMgQEAKIAl9CiAJcmV0dXJuIG1heF9yYXRlOwogfQotCi1pbnQgcnR3X2FjdGlvbl9mcmFtZV9wYXJzZShjb25zdCB1OCAqZnJhbWUsIHUzMiBmcmFtZV9sZW4sIHU4ICpjYXRlZ29yeSwgdTggKmFjdGlvbikKLXsKLQljb25zdCB1OCAqZnJhbWVfYm9keSA9IGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JdTE2IGZjOwotCXU4IGMsIGEgPSAwOwotCi0JZmMgPSBsZTE2X3RvX2NwdSgoKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkciAqKWZyYW1lKS0+ZnJhbWVfY3RsKTsKLQotCWlmICgoZmMgJiAoUlRXX0lFRUU4MDIxMV9GQ1RMX0ZUWVBFIHwgUlRXX0lFRUU4MDIxMV9GQ1RMX1NUWVBFKSkgIT0KLQkgICAgKFJUV19JRUVFODAyMTFfRlRZUEVfTUdNVCB8IFJUV19JRUVFODAyMTFfU1RZUEVfQUNUSU9OKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JYyA9IGZyYW1lX2JvZHlbMF07Ci0KLQlzd2l0Y2ggKGMpIHsKLQljYXNlIFJUV19XTEFOX0NBVEVHT1JZX1AyUDogLyogdmVuZG9yLXNwZWNpZmljICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWEgPSBmcmFtZV9ib2R5WzFdOwotCX0KLQotCWlmIChjYXRlZ29yeSkKLQkJKmNhdGVnb3J5ID0gYzsKLQlpZiAoYWN0aW9uKQotCQkqYWN0aW9uID0gYTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqX2FjdGlvbl9wdWJsaWNfc3RyW10gPSB7Ci0JIkFDVF9QVUJfQlNTQ09FWElTVCIsCi0JIkFDVF9QVUJfRFNFX0VOQUJMRSIsCi0JIkFDVF9QVUJfRFNFX0RFRU5BQkxFIiwKLQkiQUNUX1BVQl9EU0VfUkVHX0xPQ0FUSU9OIiwKLQkiQUNUX1BVQl9FWFRfQ0hMX1NXSVRDSCIsCi0JIkFDVF9QVUJfRFNFX01TUl9SRVEiLAotCSJBQ1RfUFVCX0RTRV9NU1JfUlBSVCIsCi0JIkFDVF9QVUJfTVAiLAotCSJBQ1RfUFVCX0RTRV9QV1JfQ09OU1RSQUlOVCIsCi0JIkFDVF9QVUJfVkVORE9SIiwKLQkiQUNUX1BVQl9HQVNfSU5JVElBTF9SRVEiLAotCSJBQ1RfUFVCX0dBU19JTklUSUFMX1JTUCIsCi0JIkFDVF9QVUJfR0FTX0NPTUVCQUNLX1JFUSIsCi0JIkFDVF9QVUJfR0FTX0NPTUVCQUNLX1JTUCIsCi0JIkFDVF9QVUJfVERMU19ESVNDT1ZFUllfUlNQIiwKLQkiQUNUX1BVQl9MT0NBVElPTl9UUkFDSyIsCi0JIkFDVF9QVUJfUlNWRCIsCi19OwotCi1jb25zdCBjaGFyICphY3Rpb25fcHVibGljX3N0cih1OCBhY3Rpb24pCi17Ci0JYWN0aW9uID0gbWluX3QodTgsIGFjdGlvbiwgQUNUX1BVQkxJQ19NQVgpOwotCXJldHVybiBfYWN0aW9uX3B1YmxpY19zdHJbYWN0aW9uXTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jCmluZGV4IGY4NWE2YWIuLjZlZDIzZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pb2N0bF9zZXQuYwpAQCAtMTQsNyArMTQsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgX1JUV19JT0NUTF9TRVRfQ18KIAotCiAjaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogI2luY2x1ZGUgPHJ0d19pb2N0bF9zZXQuaD4KQEAgLTU3MCwxMCArNTY5LDggQEAKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZhZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICAqcGN1cl9ic3MgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOwogCXU4CXJmX3R5cGUgPSAwOwogCXU4CWJ3XzQwTUh6ID0gMCwgc2hvcnRfR0lfMjAgPSAwLCBzaG9ydF9HSV80MCA9IDA7Ci0JdTE2CW1jc19yYXRlID0gMDsKIAl1MzIJaHRfaWVsZW4gPSAwOwogCiAJaWYgKGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5tcF9tb2RlID09IDEpIHsKQEAgLTU4OCwxNSArNTg1LDExIEBACiAJaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmIChXSVJFTEVTU18xMV8yNE58V0lSRUxFU1NfMTFfNU4pKSB7CiAJCXAgPSBydHdfZ2V0X2llKCZwY3VyX2Jzcy0+SUVzWzEyXSwgX0hUX0NBUEFCSUxJVFlfSUVfLCAmaHRfaWVsZW4sIHBjdXJfYnNzLT5JRUxlbmd0aC0xMik7CiAJCWlmIChwICYmIGh0X2llbGVuID4gMCkgewotCQkJcGh0X2NhcGllID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqKShwKzIpOwotCi0JCQltZW1jcHkoJm1jc19yYXRlLCBwaHRfY2FwaWUtPnN1cHBfbWNzX3NldCwgMik7Ci0KIAkJCS8qIGN1cl9id21vZCBpcyB1cGRhdGVkIGJ5IGJlYWNvbiwgcG1sbWVpbmZvIGlzIHVwZGF0ZWQgYnkgYXNzb2NpYXRpb24gcmVzcG9uc2UgKi8KIAkJCWJ3XzQwTUh6ID0gKHBtbG1lZXh0LT5jdXJfYndtb2RlICYmIChIVF9JTkZPX0hUX1BBUkFNX1JFQ19UUkFOU19DSE5MX1dJRFRIICYgcG1sbWVpbmZvLT5IVF9pbmZvLmluZm9zWzBdKSkgPyAxIDogMDsKIAotCQkJc2hvcnRfR0lfMjAgPSAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvKSAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwKSA/IDEgOiAwOwotCQkJc2hvcnRfR0lfNDAgPSAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvKSAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSA/IDEgOiAwOworCQkJc2hvcnRfR0lfMjAgPSAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvKSAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwKSA/IDEgOiAwOworCQkJc2hvcnRfR0lfNDAgPSAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvKSAmIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSA/IDEgOiAwOwogCiAJCQlydHdfaGFsX2dldF9od3JlZyhhZGFwdGVyLCBIV19WQVJfUkZfVFlQRSwgKHU4ICopKCZyZl90eXBlKSk7CiAJCQltYXhfcmF0ZSA9IHJ0d19tY3NfcmF0ZSgKQEAgLTYwNCw3ICs1OTcsNyBAQAogCQkJCWJ3XzQwTUh6ICYgKHByZWdpc3RyeXByaXYtPmNidzQwX2VuYWJsZSksCiAJCQkJc2hvcnRfR0lfMjAsCiAJCQkJc2hvcnRfR0lfNDAsCi0JCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGUKKwkJCQlwbWxtZWluZm8tPkhUX2NhcHMubWNzLnJ4X21hc2sKIAkJCSk7CiAJCX0KIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYwppbmRleCAxNDU2NDk5Li5lZTJkY2QwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYwpAQCAtNTIsOCArNTIsNiBAQAogCV9ydHdfaW5pdF9xdWV1ZSgmKHBtbG1lcHJpdi0+ZnJlZV9ic3NfcG9vbCkpOwogCV9ydHdfaW5pdF9xdWV1ZSgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSkpOwogCi0Jc2V0X3NjYW5uZWRfbmV0d29ya192YWwocG1sbWVwcml2LCAwKTsKLQogCW1lbXNldCgmcG1sbWVwcml2LT5hc3NvY19zc2lkLCAwLCBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX3NzaWQpKTsKIAogCXBidWYgPSB2emFsbG9jKE1BWF9CU1NfQ05UICogKHNpemVvZihzdHJ1Y3Qgd2xhbl9uZXR3b3JrKSkpOwpAQCAtMTAwLDEyICs5OCw2IEBACiAJcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKCZwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUsICZwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWVfbGVuKTsKIAlydHdfZnJlZV9tbG1lX2llX2RhdGEoJnBtbG1lcHJpdi0+d3BzX3Byb2JlX3Jlc3BfaWUsICZwbWxtZXByaXYtPndwc19wcm9iZV9yZXNwX2llX2xlbik7CiAJcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKCZwbWxtZXByaXYtPndwc19hc3NvY19yZXNwX2llLCAmcG1sbWVwcml2LT53cHNfYXNzb2NfcmVzcF9pZV9sZW4pOwotCi0JcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKCZwbWxtZXByaXYtPnAycF9iZWFjb25faWUsICZwbWxtZXByaXYtPnAycF9iZWFjb25faWVfbGVuKTsKLQlydHdfZnJlZV9tbG1lX2llX2RhdGEoJnBtbG1lcHJpdi0+cDJwX3Byb2JlX3JlcV9pZSwgJnBtbG1lcHJpdi0+cDJwX3Byb2JlX3JlcV9pZV9sZW4pOwotCXJ0d19mcmVlX21sbWVfaWVfZGF0YSgmcG1sbWVwcml2LT5wMnBfcHJvYmVfcmVzcF9pZSwgJnBtbG1lcHJpdi0+cDJwX3Byb2JlX3Jlc3BfaWVfbGVuKTsKLQlydHdfZnJlZV9tbG1lX2llX2RhdGEoJnBtbG1lcHJpdi0+cDJwX2dvX3Byb2JlX3Jlc3BfaWUsICZwbWxtZXByaXYtPnAycF9nb19wcm9iZV9yZXNwX2llX2xlbik7Ci0JcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKCZwbWxtZXByaXYtPnAycF9hc3NvY19yZXFfaWUsICZwbWxtZXByaXYtPnAycF9hc3NvY19yZXFfaWVfbGVuKTsKIH0KICNlbHNlCiB2b2lkIHJ0d19mcmVlX21sbWVfcHJpdl9pZV9kYXRhKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKQEAgLTE0Myw4ICsxMzUsNiBAQAogCXBuZXR3b3JrLT5haWQgPSAwOwogCXBuZXR3b3JrLT5qb2luX3JlcyA9IDA7CiAKLQlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkKys7Ci0KIGV4aXQ6CiAJc3Bpbl91bmxvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwogCkBAIC0xNzUsNyArMTY1LDYgQEAKIAlzcGluX2xvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwogCWxpc3RfZGVsX2luaXQoJihwbmV0d29yay0+bGlzdCkpOwogCWxpc3RfYWRkX3RhaWwoJihwbmV0d29yay0+bGlzdCksICYoZnJlZV9xdWV1ZS0+cXVldWUpKTsKLQlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkLS07CiAJc3Bpbl91bmxvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwogfQogCkBAIC0xODksNyArMTc4LDYgQEAKIAkJcmV0dXJuOwogCWxpc3RfZGVsX2luaXQoJihwbmV0d29yay0+bGlzdCkpOwogCWxpc3RfYWRkX3RhaWwoJihwbmV0d29yay0+bGlzdCksIGdldF9saXN0X2hlYWQoZnJlZV9xdWV1ZSkpOwotCXBtbG1lcHJpdi0+bnVtX29mX3NjYW5uZWQtLTsKIH0KIAogLyoKQEAgLTI3MSw3ICsyNTksNiBAQAogCXBpYnNzWzNdID0gKHU4KShjdXJ0aW1lICYgMHhmZik7LyogcFswXTsgKi8KIAlwaWJzc1s0XSA9ICh1OCkoKGN1cnRpbWU+PjgpICYgMHhmZik7LyogcFsxXTsgKi8KIAlwaWJzc1s1XSA9ICh1OCkoKGN1cnRpbWU+PjE2KSAmIDB4ZmYpOy8qIHBbMl07ICovCi0JcmV0dXJuOwogfQogCiB1OCAqcnR3X2dldF9jYXBhYmlsaXR5X2Zyb21faWUodTggKmllKQpAQCAtNTY5LDcgKzU1Niw2IEBACiB2b2lkIHJ0d19hdGltZG9uZV9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTggKnBidWYpCiB7CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCJyZWNlaXZlIGF0aW1kb25lX2V2ZXRcbiIpKTsKLQlyZXR1cm47CiB9CiAKIApAQCAtNzMyLDcgKzcxOCw2IEBACiAJCWxpc3RfZGVsX2luaXQocGxpc3QpOwogCQlsaXN0X2FkZF90YWlsKHBsaXN0LCAmZnJlZV9xdWV1ZS0+cXVldWUpOwogCQlwbGlzdCA9IHB0ZW1wOwotCQlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkLS07CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJmZyZWVfcXVldWUtPmxvY2spOwpAQCAtMTkzNSw3ICsxOTIwLDYgQEAKIAl1MzIgaWVsZW4sIG91dF9sZW47CiAJZW51bSBodF9jYXBfYW1wZHVfZmFjdG9yIG1heF9yeF9hbXBkdV9mYWN0b3I7CiAJdW5zaWduZWQgY2hhciAqcDsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgaHRfY2FwaWU7CiAJdW5zaWduZWQgY2hhciBXTU1fSUVbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxLCAweDAwfTsKIAlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBxb3NfcHJpdgkJKnBxb3Nwcml2ID0gJnBtbG1lcHJpdi0+cW9zcHJpdjsKQEAgLTE5NDgsNiArMTkzMiw4IEBACiAJcCA9IHJ0d19nZXRfaWUoaW5faWUrMTIsIF9IVF9DQVBBQklMSVRZX0lFXywgJmllbGVuLCBpbl9sZW4tMTIpOwogCiAJaWYgKHAgJiYgaWVsZW4gPiAwKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcDsKKwogCQlpZiAocHFvc3ByaXYtPnFvc19vcHRpb24gPT0gMCkgewogCQkJb3V0X2xlbiA9ICpwb3V0X2xlbjsKIAkJCXJ0d19zZXRfaWUob3V0X2llK291dF9sZW4sIF9WRU5ET1JfU1BFQ0lGSUNfSUVfLApAQCAtMTk1OCwzMyArMTk0NCwzMyBAQAogCiAJCW91dF9sZW4gPSAqcG91dF9sZW47CiAKLQkJbWVtc2V0KCZodF9jYXBpZSwgMCwgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCkpOworCQltZW1zZXQoJmh0X2NhcCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7CiAKLQkJaHRfY2FwaWUuY2FwX2luZm8gPSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSCB8Ci0JCQkJICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKLQkJCQkgICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfAotCQkJCSAgICBJRUVFODAyMTFfSFRfQ0FQX1RYX1NUQkMgfAotCQkJCSAgICBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MDsKKwkJaHRfY2FwLmNhcF9pbmZvID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEggfAorCQkJCQkgICAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8CisJCQkJCSAgICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwKKwkJCQkJICAgICAgSUVFRTgwMjExX0hUX0NBUF9UWF9TVEJDIHwKKwkJCQkJICAgICAgSUVFRTgwMjExX0hUX0NBUF9EU1NTQ0NLNDApOwogCiAJCXJ0d19oYWxfZ2V0X2RlZl92YXIocGFkYXB0ZXIsIEhBTF9ERUZfUlhfUEFDS0VUX09GRlNFVCwgJnJ4X3BhY2tldF9vZmZzZXQpOwogCQlydHdfaGFsX2dldF9kZWZfdmFyKHBhZGFwdGVyLCBIQUxfREVGX01BWF9SRUNWQlVGX1NaLCAmbWF4X3JlY3ZidWZfc3opOwogCiAJCS8qCi0JCUFNUERVX3BhcmEgWzE6MF06TWF4IEFNUERVIExlbiA9PiAwOjhrICwgMToxNmssIDI6MzJrLCAzOjY0awotCQlBTVBEVV9wYXJhIFs0OjJdOk1pbiBNUERVIFN0YXJ0IFNwYWNpbmcKKwkJYW1wZHVfcGFyYW1zX2luZm8gWzE6MF06TWF4IEFNUERVIExlbiA9PiAwOjhrICwgMToxNmssIDI6MzJrLCAzOjY0aworCQlhbXBkdV9wYXJhbXNfaW5mbyBbNDoyXTpNaW4gTVBEVSBTdGFydCBTcGFjaW5nCiAJCSovCiAKIAkJcnR3X2hhbF9nZXRfZGVmX3ZhcihwYWRhcHRlciwgSFdfVkFSX01BWF9SWF9BTVBEVV9GQUNUT1IsICZtYXhfcnhfYW1wZHVfZmFjdG9yKTsKLQkJaHRfY2FwaWUuYW1wZHVfcGFyYW1zX2luZm8gPSAobWF4X3J4X2FtcGR1X2ZhY3RvciYweDAzKTsKKwkJaHRfY2FwLmFtcGR1X3BhcmFtc19pbmZvID0gbWF4X3J4X2FtcGR1X2ZhY3RvciAmIDB4MDM7CiAKIAkJaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9PSBfQUVTXykKLQkJCWh0X2NhcGllLmFtcGR1X3BhcmFtc19pbmZvIHw9IChJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0RFTlNJVFkmKDB4MDc8PDIpKTsKKwkJCWh0X2NhcC5hbXBkdV9wYXJhbXNfaW5mbyB8PSBJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0RFTlNJVFkgJiAoMHgwNyA8PCAyKTsKIAkJZWxzZQotCQkJaHRfY2FwaWUuYW1wZHVfcGFyYW1zX2luZm8gfD0gKElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfREVOU0lUWSYweDAwKTsKLQorCQkJaHRfY2FwLmFtcGR1X3BhcmFtc19pbmZvIHw9IElFRUU4MDIxMV9IVF9DQVBfQU1QRFVfREVOU0lUWSAmIDB4MDA7CiAKIAkJcnR3X3NldF9pZShvdXRfaWUrb3V0X2xlbiwgX0hUX0NBUEFCSUxJVFlfSUVfLAotCQkJICAgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCksICh1bnNpZ25lZCBjaGFyICopJmh0X2NhcGllLCBwb3V0X2xlbik7CisJCQkgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApLAorCQkJICAgKHVuc2lnbmVkIGNoYXIgKikmaHRfY2FwLCBwb3V0X2xlbik7CiAKIAkJcGh0cHJpdi0+aHRfb3B0aW9uID0gdHJ1ZTsKIApAQCAtMjAwMCw5ICsxOTg2LDYgQEAKIC8qIHRoZSBmdW5jdGlvbiBpcyA+IHBhc3NpdmVfbGV2ZWwgKGluIGNyaXRpY2FsX3NlY3Rpb24pICovCiB2b2lkIHJ0d191cGRhdGVfaHRfY2FwKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKnBpZSwgdWludCBpZV9sZW4pCiB7Ci0JdTggKnAsIG1heF9hbXBkdV9zejsKLQlpbnQgbGVuOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOwogCXN0cnVjdCBtbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IGh0X3ByaXYJCSpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwogCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7CkBAIC0yMDI3LDM0ICsyMDEwLDIxIEBACiAJCXBodHByaXYtPmFtcGR1X2VuYWJsZSA9IHRydWU7CiAJfQogCi0KLQkvKiBjaGVjayBNYXggUnggQS1NUERVIFNpemUgKi8KLQlsZW4gPSAwOwotCXAgPSBydHdfZ2V0X2llKHBpZStzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX2ZpeGVkX2llKSwgX0hUX0NBUEFCSUxJVFlfSUVfLCAmbGVuLCBpZV9sZW4tc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9maXhlZF9pZSkpOwotCWlmIChwICYmIGxlbiA+IDApIHsKLQkJcGh0X2NhcGllID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqKShwKzIpOwotCQltYXhfYW1wZHVfc3ogPSBwaHRfY2FwaWUtPmFtcGR1X3BhcmFtc19pbmZvICYgSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9GQUNUT1I7Ci0JCW1heF9hbXBkdV9zeiA9IDEgPDwgKG1heF9hbXBkdV9zeiszKTsgLyogIG1heF9hbXBkdV9zeiAoa2J5dGVzKTsgKi8KLQkJcGh0cHJpdi0+cnhfYW1wZHVfbWF4bGVuID0gbWF4X2FtcGR1X3N6OwotCX0KLQlsZW4gPSAwOwotCXAgPSBydHdfZ2V0X2llKHBpZStzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX2ZpeGVkX2llKSwgX0hUX0FERF9JTkZPX0lFXywgJmxlbiwgaWVfbGVuLXNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKTsKLQogCS8qIHVwZGF0ZSBjdXJfYndtb2RlICYgY3VyX2NoX29mZnNldCAqLwogCWlmICgocHJlZ2lzdHJ5cHJpdi0+Y2J3NDBfZW5hYmxlKSAmJgotCSAgICAobGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvKSAmIEJJVCgxKSkgJiYKKwkgICAgKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy5jYXBfaW5mbykgJiBCSVQoMSkpICYmCiAJICAgIChwbWxtZWluZm8tPkhUX2luZm8uaW5mb3NbMF0gJiBCSVQoMikpKSB7CiAJCWludCBpOwogCQl1OAlyZl90eXBlOwogCi0JCXBhZGFwdGVyLT5IYWxGdW5jLkdldEh3UmVnSGFuZGxlcihwYWRhcHRlciwgSFdfVkFSX1JGX1RZUEUsICh1OCAqKSgmcmZfdHlwZSkpOworCQlydHdfaGFsX2dldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX1JGX1RZUEUsICh1OCAqKSgmcmZfdHlwZSkpOwogCiAJCS8qIHVwZGF0ZSB0aGUgTUNTIHJhdGVzICovCiAJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCQlpZiAoKHJmX3R5cGUgPT0gUkZfMVQxUikgfHwgKHJmX3R5cGUgPT0gUkZfMVQyUikpCi0JCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGVbaV0gJj0gTUNTX3JhdGVfMVJbaV07CisJCQkJKCh1OCAqKSZwbWxtZWluZm8tPkhUX2NhcHMubWNzKVtpXSAmPSBNQ1NfcmF0ZV8xUltpXTsKIAkJCWVsc2UKLQkJCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5NQ1NfcmF0ZVtpXSAmPSBNQ1NfcmF0ZV8yUltpXTsKKwkJCQkoKHU4ICopJnBtbG1laW5mby0+SFRfY2Fwcy5tY3MpW2ldICY9IE1DU19yYXRlXzJSW2ldOwogCQl9CiAJCS8qIHN3aXRjaCB0byB0aGUgNDBNIEh6IG1vZGUgYWNjb3JkaW5nIHRvIHRoZSBBUCAqLwogCQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfNDA7CkBAIC0yMDcyLDcgKzIwNDIsNyBAQAogCX0KIAogCS8qICBDb25maWcgU00gUG93ZXIgU2F2ZSBzZXR0aW5nICovCi0JcG1sbWVpbmZvLT5TTV9QUyA9IChsZTE2X3RvX2NwdShwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8pICYgMHgwQykgPj4gMjsKKwlwbWxtZWluZm8tPlNNX1BTID0gKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+SFRfY2Fwcy5jYXBfaW5mbykgJiAweDBDKSA+PiAyOwogCWlmIChwbWxtZWluZm8tPlNNX1BTID09IFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQykKIAkJREJHXzg4RSgiJXMoKTogV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDXG4iLCBfX2Z1bmNfXyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZV9leHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZV9leHQuYwppbmRleCA3ZjMyYjM5Li5mYjEzZGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWVfZXh0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lX2V4dC5jCkBAIC0zMjAsNyArMzIwLDcgQEAKIAlzdHJ1Y3QgeG1pdF9mcmFtZQkqcG1nbnRmcmFtZTsKIAlzdHJ1Y3QgcGt0X2F0dHJpYgkqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyCSpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1bnNpZ25lZCBpbnQJcmF0ZV9sZW47CiAJc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJihwYWRhcHRlci0+eG1pdHByaXYpOwpAQCAtMzQ3LDIyICszNDcsMjIgQEAKIAltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7CiAKIAlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBiY19hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGJjX2FkZHIpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIDAvKnBtbG1lZXh0LT5tZ250X3NlcSovKTsKIAkvKiBwbWxtZWV4dC0+bWdudF9zZXErKzsgKi8KIAlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX0JFQUNPTik7CiAKLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSA9PSBXSUZJX0ZXX0FQX1NUQVRFKSB7CiAJCWludCBsZW5fZGlmZjsKQEAgLTM3Nyw4ICszNzcsOCBAQAogCQkJKTsKIAkJcGZyYW1lICs9IChjdXJfbmV0d29yay0+SUVMZW5ndGgrbGVuX2RpZmYpOwogCQlwYXR0cmliLT5wa3RsZW4gKz0gKGN1cl9uZXR3b3JrLT5JRUxlbmd0aCtsZW5fZGlmZik7Ci0JCXdwc19pZSA9IHJ0d19nZXRfd3BzX2llKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyK1RYREVTQ19PRkZTRVQrc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcikrX0JFQUNPTl9JRV9PRkZTRVRfLAotCQkJcGF0dHJpYi0+cGt0bGVuLXNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpLV9CRUFDT05fSUVfT0ZGU0VUXywgTlVMTCwgJndwc19pZWxlbik7CisJCXdwc19pZSA9IHJ0d19nZXRfd3BzX2llKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyK1RYREVTQ19PRkZTRVQrc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKStfQkVBQ09OX0lFX09GRlNFVF8sCisJCQlwYXR0cmliLT5wa3RsZW4tc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKS1fQkVBQ09OX0lFX09GRlNFVF8sIE5VTEwsICZ3cHNfaWVsZW4pOwogCQlpZiAod3BzX2llICYmIHdwc19pZWxlbiA+IDApCiAJCQlydHdfZ2V0X3dwc19hdHRyX2NvbnRlbnQod3BzX2llLCAgd3BzX2llbGVuLCBXUFNfQVRUUl9TRUxFQ1RFRF9SRUdJU1RSQVIsICh1OCAqKSgmc3IpLCBOVUxMKTsKIAkJaWYgKHNyICE9IDApCkBAIC00NjEsNyArNDYxLDcgQEAKIAlzdHJ1Y3QgeG1pdF9mcmFtZQkJCSpwbWdudGZyYW1lOwogCXN0cnVjdCBwa3RfYXR0cmliCQkJKnBhdHRyaWI7CiAJdW5zaWduZWQgY2hhcgkJCQkJKnBmcmFtZTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIJKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlfX2xlMTYgKmZjdHJsOwogCXVuc2lnbmVkIGNoYXIJCQkJCSptYWMsICpic3NpZDsKIAlzdHJ1Y3QgeG1pdF9wcml2CSpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CkBAIC00ODgsMjIgKzQ4OCwyMiBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAogCW1hYyA9IG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwogCWJzc2lkID0gY3VyX25ldHdvcmstPk1hY0FkZHJlc3M7CiAKLQlmY3RybCA9ICYocHdsYW5oZHItPmZyYW1lX2N0bCk7CisJZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2NvbnRyb2w7CiAJKihmY3RybCkgPSAwOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIGRhLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbWFjLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgYnNzaWQsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBkYSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbWFjKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBic3NpZCk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7CiAJcG1sbWVleHQtPm1nbnRfc2VxKys7CiAJU2V0RnJhbWVTdWJUeXBlKGZjdHJsLCBXSUZJX1BST0JFUlNQKTsKIAotCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJcGF0dHJpYi0+cGt0bGVuID0gcGF0dHJpYi0+aGRybGVuOwogCXBmcmFtZSArPSBwYXR0cmliLT5oZHJsZW47CiAKQEAgLTYwOSw3ICs2MDksNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lCQkqcG1nbnRmcmFtZTsKIAlzdHJ1Y3QgcGt0X2F0dHJpYgkJKnBhdHRyaWI7CiAJdW5zaWduZWQgY2hhcgkJCSpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1bnNpZ25lZCBjaGFyCQkJKm1hYzsKIAl1bnNpZ25lZCBjaGFyCQkJYnNzcmF0ZVtOdW1SYXRlc107CkBAIC02MzMsMzEgKzYzMywzMSBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAogCW1hYyA9IG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKIAogCWlmIChkYSkgewogCQkvKgl1bmljYXN0IHByb2JlIHJlcXVlc3QgZnJhbWUgKi8KLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgZGEsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBkYSk7CiAJfSBlbHNlIHsKIAkJLyoJYnJvYWRjYXN0IHByb2JlIHJlcXVlc3QgZnJhbWUgKi8KLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgYmNfYWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBiY19hZGRyLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGJjX2FkZHIpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBiY19hZGRyKTsKIAl9CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBtYWMsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBtYWMpOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCBwbWxtZWV4dC0+bWdudF9zZXEpOwogCXBtbG1lZXh0LT5tZ250X3NlcSsrOwogCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfUFJPQkVSRVEpOwogCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOworCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKIAlpZiAocHNzaWQpCiAJCXBmcmFtZSA9IHJ0d19zZXRfaWUocGZyYW1lLCBfU1NJRF9JRV8sIHBzc2lkLT5Tc2lkTGVuZ3RoLCBwc3NpZC0+U3NpZCwgJihwYXR0cmliLT5wa3RsZW4pKTsKQEAgLTc0NSw3ICs3NDUsNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwogCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwogCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlfX2xlMTYgKmZjdHJsOwogCXVuc2lnbmVkIGludCB2YWwzMjsKIAl1MTYgdmFsMTY7CkBAIC03NjksMjUgKzc2OSwyNyBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7CiAJcG1sbWVleHQtPm1nbnRfc2VxKys7CiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9BVVRIKTsKIAotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAKIAlpZiAocHN0YSkgey8qICBmb3IgQVAgbW9kZSAqLwogI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKIAotCQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBwc3RhLT5od2FkZHIsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgcHN0YS0+aHdhZGRyKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwKKwkJCQlteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsCisJCQkJbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSkpOwogCiAKIAkJLyogIHNldHRpbmcgYXV0aCBhbGdvIG51bWJlciAqLwpAQCAtODI1LDkgKzgyNyw5IEBACiAJfSBlbHNlIHsKIAkJX19sZTMyIGxlX3RtcDMyOwogCQlfX2xlMTYgbGVfdG1wMTY7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAogCQkvKiAgc2V0dGluZyBhdXRoIGFsZ28gbnVtYmVyICovCiAJCXZhbDE2ID0gKHBtbG1laW5mby0+YXV0aF9hbGdvID09IGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkKSA/IDEgOiAwOy8qICAwOk9QRU4gU3lzdGVtLCAxOlNoYXJlZCBrZXkgKi8KQEAgLTg2Niw3ICs4NjgsNyBAQAogCiAJCQlTZXRQcml2YWN5KGZjdHJsKTsKIAotCQkJcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJCQlwYXR0cmliLT5oZHJsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAJCQlwYXR0cmliLT5lbmNyeXB0ID0gX1dFUDQwXzsKIApAQCAtODg5LDcgKzg5MSw3IEBACiAJCQkgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YXQsIGludCBwa3RfdHlwZSkKIHsKIAlzdHJ1Y3QgeG1pdF9mcmFtZQkqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIJKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyCSpwYnVmLCAqcGZyYW1lOwogCXVuc2lnbmVkIHNob3J0IHZhbDsKQEAgLTkxNiwxNCArOTE4LDE1IEBACiAJbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwogCiAJcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKIAotCW1lbWNweSgodm9pZCAqKUdldEFkZHIxUHRyKHB3bGFuaGRyKSwgcHN0YXQtPmh3YWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSgodm9pZCAqKUdldEFkZHIyUHRyKHB3bGFuaGRyKSwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkoKHZvaWQgKilHZXRBZGRyM1B0cihwd2xhbmhkciksIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KCh2b2lkICopR2V0QWRkcjFQdHIocHdsYW5oZHIpLCBwc3RhdC0+aHdhZGRyKTsKKwlldGhlcl9hZGRyX2NvcHkoKHZvaWQgKilHZXRBZGRyMlB0cihwd2xhbmhkciksCisJCQlteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSk7CisJZXRoZXJfYWRkcl9jb3B5KCh2b2lkICopR2V0QWRkcjNQdHIocHdsYW5oZHIpLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAogCVNldFNlcU51bShwd2xhbmhkciwgcG1sbWVleHQtPm1nbnRfc2VxKTsKQEAgLTkzMyw3ICs5MzYsNyBAQAogCWVsc2UKIAkJcmV0dXJuOwogCi0JcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAlwYXR0cmliLT5wa3RsZW4gKz0gcGF0dHJpYi0+aGRybGVuOwogCXBmcmFtZSArPSBwYXR0cmliLT5oZHJsZW47CiAKQEAgLTEwMTcsNyArMTAyMCw3IEBACiAJc3RydWN0IHhtaXRfZnJhbWUJKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIJKnBhdHRyaWI7CiAJdW5zaWduZWQgY2hhcgkJKnBmcmFtZSwgKnA7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1bnNpZ25lZCBpbnQJaSwgaiwgaWVfbGVuLCBpbmRleCA9IDA7CiAJdW5zaWduZWQgY2hhcglyZl90eXBlLCBic3NyYXRlW051bVJhdGVzXSwgc3RhX2Jzc3JhdGVbTnVtUmF0ZXNdOwpAQCAtMTA0MCwyMCArMTA0MywyMCBAQAogCiAJbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgcG5ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7CiAJcG1sbWVleHQtPm1nbnRfc2VxKys7CiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9BU1NPQ1JFUSk7CiAKLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCS8qIGNhcHMgKi8KIApAQCAtMTEzMiwyMyArMTEzNSwyMyBAQAogCWlmIChwYWRhcHRlci0+bWxtZXByaXYuaHRwcml2Lmh0X29wdGlvbikgewogCQlwID0gcnR3X2dldF9pZSgocG1sbWVpbmZvLT5uZXR3b3JrLklFcyArIHNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKSwgX0hUX0NBUEFCSUxJVFlfSUVfLCAmaWVfbGVuLCAocG1sbWVpbmZvLT5uZXR3b3JrLklFTGVuZ3RoIC0gc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9maXhlZF9pZSkpKTsKIAkJaWYgKChwICE9IE5VTEwpICYmICghKGlzX2FwX2luX3RraXAocGFkYXB0ZXIpKSkpIHsKLQkJCW1lbWNweSgmKHBtbG1laW5mby0+SFRfY2FwcyksIChwICsgMiksIHNpemVvZihzdHJ1Y3QgSFRfY2Fwc19lbGVtZW50KSk7CisJCQltZW1jcHkoJnBtbG1laW5mby0+SFRfY2FwcywgcCArIDIsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOwogCiAJCQkvKiB0byBkaXNhYmxlIDQwTSBIeiBzdXBwb3J0IHdoaWxlIGdkX2J3XzQwTUh6X2VuID0gMCAqLwogCQkJaWYgKHByZWdwcml2LT5jYnc0MF9lbmFibGUgPT0gMCkKLQkJCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8gJj0gY3B1X3RvX2xlMTYofihCSVQoNikgfCBCSVQoMSkpKTsKKwkJCQlwbWxtZWluZm8tPkhUX2NhcHMuY2FwX2luZm8gJj0gY3B1X3RvX2xlMTYofihCSVQoNikgfCBCSVQoMSkpKTsKIAkJCWVsc2UKLQkJCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8gfD0gY3B1X3RvX2xlMTYoQklUKDEpKTsKKwkJCQlwbWxtZWluZm8tPkhUX2NhcHMuY2FwX2luZm8gfD0gY3B1X3RvX2xlMTYoQklUKDEpKTsKIAogCQkJLyogdG9kbzogZGlzYWJsZSBTTSBwb3dlciBzYXZlIG1vZGUgKi8KLQkJCXBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkhUX2NhcHNfaW5mbyB8PSBjcHVfdG9fbGUxNigweDAwMGMpOworCQkJcG1sbWVpbmZvLT5IVF9jYXBzLmNhcF9pbmZvIHw9IGNwdV90b19sZTE2KDB4MDAwYyk7CiAKIAkJCXJ0d19oYWxfZ2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfUkZfVFlQRSwgKHU4ICopKCZyZl90eXBlKSk7CiAJCQlzd2l0Y2ggKHJmX3R5cGUpIHsKIAkJCWNhc2UgUkZfMVQxUjoKIAkJCQlpZiAocHJlZ3ByaXYtPnJ4X3N0YmMpCi0JCQkJCXBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkhUX2NhcHNfaW5mbyB8PSBjcHVfdG9fbGUxNigweDAxMDApOy8qIFJYIFNUQkMgT25lIHNwYXRpYWwgc3RyZWFtICovCi0JCQkJbWVtY3B5KHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlLCBNQ1NfcmF0ZV8xUiwgMTYpOworCQkJCQlwbWxtZWluZm8tPkhUX2NhcHMuY2FwX2luZm8gfD0gY3B1X3RvX2xlMTYoMHgwMTAwKTsvKiBSWCBTVEJDIE9uZSBzcGF0aWFsIHN0cmVhbSAqLworCQkJCW1lbWNweSgodTggKikmcG1sbWVpbmZvLT5IVF9jYXBzLm1jcywgTUNTX3JhdGVfMVIsIDE2KTsKIAkJCQlicmVhazsKIAkJCWNhc2UgUkZfMlQyUjoKIAkJCWNhc2UgUkZfMVQyUjoKQEAgLTExNTcsOSArMTE2MCw5IEBACiAJCQkJICAgICgocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFfMjROKSAmJiAocHJlZ3ByaXYtPnJ4X3N0YmMgPT0gMHgxKSkgfHwgLyogZW5hYmxlIGZvciAyLjRHSHogKi8KIAkJCQkgICAgKHByZWdwcml2LT53aWZpX3NwZWMgPT0gMSkpIHsKIAkJCQkJREJHXzg4RSgiZGVjbGFyZSBzdXBwb3J0aW5nIFJYIFNUQkNcbiIpOwotCQkJCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8gfD0gY3B1X3RvX2xlMTYoMHgwMjAwKTsvKiBSWCBTVEJDIHR3byBzcGF0aWFsIHN0cmVhbSAqLworCQkJCQlwbWxtZWluZm8tPkhUX2NhcHMuY2FwX2luZm8gfD0gY3B1X3RvX2xlMTYoMHgwMjAwKTsvKiBSWCBTVEJDIHR3byBzcGF0aWFsIHN0cmVhbSAqLwogCQkJCX0KLQkJCQltZW1jcHkocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGUsIE1DU19yYXRlXzJSLCAxNik7CisJCQkJbWVtY3B5KCZwbWxtZWluZm8tPkhUX2NhcHMubWNzLCBNQ1NfcmF0ZV8yUiwgMTYpOwogCQkJCWJyZWFrOwogCQkJfQogCQkJcGZyYW1lID0gcnR3X3NldF9pZShwZnJhbWUsIF9IVF9DQVBBQklMSVRZX0lFXywgaWVfbGVuICwgKHU4ICopKCYocG1sbWVpbmZvLT5IVF9jYXBzKSksICYocGF0dHJpYi0+cGt0bGVuKSk7CkBAIC0xMjEyLDcgKzEyMTUsNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lCQkJKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIJCQkqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyCQkJCQkqcGZyYW1lOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dDsKQEAgLTEyMzksOSArMTI0Miw5IEBACiAJbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwogCiAJcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKIAogCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSA9PSBXSUZJX0ZXX0FQX1NUQVRFKQpAQCAtMTI1MiwxNiArMTI1NSwxNiBAQAogCWlmIChwb3dlcl9tb2RlKQogCQlTZXRQd3JNZ3QoZmN0cmwpOwogCi0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEsIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7CiAJcG1sbWVleHQtPm1nbnRfc2VxKys7CiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9EQVRBX05VTEwpOwogCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOworCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAKIAlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47CiAKQEAgLTEzMzIsNyArMTMzNSw3IEBACiAJc3RydWN0IHhtaXRfZnJhbWUJCQkqcG1nbnRmcmFtZTsKIAlzdHJ1Y3QgcGt0X2F0dHJpYgkJCSpwYXR0cmliOwogCXVuc2lnbmVkIGNoYXIJCQkJCSpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1bnNpZ25lZCBzaG9ydCAqcWM7CiAJc3RydWN0IHhtaXRfcHJpdgkJCSpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CkBAIC0xMzU5LDkgKzEzNjIsOSBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKIAlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gV0lGSV9GV19BUF9TVEFURSkKQEAgLTEzODAsMTYgKzEzODMsMTYgQEAKIAogCVNldEFja3BvbGljeShxYywgcGF0dHJpYi0+YWNrX3BvbGljeSk7CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBkYSwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgcG5ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBkYSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSkpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAogCVNldFNlcU51bShwd2xhbmhkciwgcG1sbWVleHQtPm1nbnRfc2VxKTsKIAlwbWxtZWV4dC0+bWdudF9zZXErKzsKIAlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX1FPU19EQVRBX05VTEwpOwogCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHJfcW9zKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyX3Fvcyk7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpOworCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpOwogCiAJcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwogCkBAIC0xNDU3LDcgKzE0NjAsNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lCQkJKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIJCQkqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyCQkJCQkqcGZyYW1lOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJc3RydWN0IHhtaXRfcHJpdgkJCSpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJihwYWRhcHRlci0+bWxtZWV4dHByaXYpOwpAQCAtMTQ3OCwyMSArMTQ4MSwyMSBAQAogCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKIAogCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBkYSwgRVRIX0FMRU4pOwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihwYWRhcHRlci0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgcG5ldHdvcmstPk1hY0FkZHJlc3MsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBkYSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSkpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAogCVNldFNlcU51bShwd2xhbmhkciwgcG1sbWVleHQtPm1nbnRfc2VxKTsKIAlwbWxtZWV4dC0+bWdudF9zZXErKzsKIAlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX0RFQVVUSCk7CiAKLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCWxlX3RtcCA9IGNwdV90b19sZTE2KHJlYXNvbik7CiAJcGZyYW1lID0gcnR3X3NldF9maXhlZF9pZShwZnJhbWUsIF9SU09OX0NPREVfLCAmbGVfdG1wLApAQCAtMTU1OSw2NiArMTU2Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBpc3N1ZV9hY3Rpb25fc3BjdF9jaF9zd2l0Y2goc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcmEsIHU4IG5ld19jaCwgdTggY2hfb2Zmc2V0KQotewotCXN0cnVjdCB4bWl0X2ZyYW1lCQkJKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHBrdF9hdHRyaWIJCQkqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyCQkJCSpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKLQlfX2xlMTYgKmZjdHJsOwotCXN0cnVjdCB4bWl0X3ByaXYJCQkqcHhtaXRwcml2ID0gJihwYWRhcHRlci0+eG1pdHByaXYpOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICYocGFkYXB0ZXItPm1sbWVleHRwcml2KTsKLQotCi0JREJHXzg4RShGVU5DX05ERVZfRk1UIiByYSA9JXBNLCBjaDoldSwgb2Zmc2V0OiV1XG4iLAotCQlGVU5DX05ERVZfQVJHKHBhZGFwdGVyLT5wbmV0ZGV2KSwgcmEsIG5ld19jaCwgY2hfb2Zmc2V0KTsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUocHhtaXRwcml2KTsKLQlpZiAocG1nbnRmcmFtZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIocGFkYXB0ZXIsIHBhdHRyaWIpOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOwotCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOwotCSooZmN0cmwpID0gMDsKLQotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIHJhLCBFVEhfQUxFTik7IC8qIFJBICovCi0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsgLyogVEEgKi8KLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCByYSwgRVRIX0FMRU4pOyAvKiBEQSA9IFJBICovCi0KLQlTZXRTZXFOdW0ocHdsYW5oZHIsIHBtbG1lZXh0LT5tZ250X3NlcSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0JU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9BQ1RJT04pOwotCi0JcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOwotCi0JLyogY2F0ZWdvcnksIGFjdGlvbiAqLwotCXsKLQkJdTggY2F0ZWdvcnksIGFjdGlvbjsKLQkJY2F0ZWdvcnkgPSBSVFdfV0xBTl9DQVRFR09SWV9TUEVDVFJVTV9NR01UOwotCQlhY3Rpb24gPSBSVFdfV0xBTl9BQ1RJT05fU1BDVF9DSExfU1dJVENIOwotCi0JCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCAxLCAmKGNhdGVnb3J5KSwgJihwYXR0cmliLT5wa3RsZW4pKTsKLQkJcGZyYW1lID0gcnR3X3NldF9maXhlZF9pZShwZnJhbWUsIDEsICYoYWN0aW9uKSwgJihwYXR0cmliLT5wa3RsZW4pKTsKLQl9Ci0KLQlwZnJhbWUgPSBydHdfc2V0X2llX2NoX3N3aXRjaChwZnJhbWUsICYocGF0dHJpYi0+cGt0bGVuKSwgMCwgbmV3X2NoLCAwKTsKLQlwZnJhbWUgPSBydHdfc2V0X2llX3NlY29uZGFyeV9jaF9vZmZzZXQocGZyYW1lLCAmKHBhdHRyaWItPnBrdGxlbiksCi0JCWhhbF9jaF9vZmZzZXRfdG9fc2Vjb25kYXJ5X2NoX29mZnNldChjaF9vZmZzZXQpKTsKLQotCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCWR1bXBfbWdudGZyYW1lKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLX0KLQogc3RhdGljIHZvaWQgaXNzdWVfYWN0aW9uX0JBKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqcmFkZHIsCiAJCQkgICAgdW5zaWduZWQgY2hhciBhY3Rpb24sIHVuc2lnbmVkIHNob3J0IHN0YXR1cykKIHsKQEAgLTE2MzMsNyArMTU3Niw3IEBACiAJc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7CiAJdTggKnBmcmFtZTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlfX2xlMTYgKmZjdHJsOwogCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICYocGFkYXB0ZXItPnhtaXRwcml2KTsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmKHBhZGFwdGVyLT5tbG1lZXh0cHJpdik7CkBAIC0xNjU2LDIxICsxNTk5LDIxIEBACiAJbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwogCiAJcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKIAotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIHJhZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBwbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIHJhZGRyKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCBwbWxtZWV4dC0+bWdudF9zZXEpOwogCXBtbG1lZXh0LT5tZ250X3NlcSsrOwogCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfQUNUSU9OKTsKIAotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAJcGZyYW1lID0gcnR3X3NldF9maXhlZF9pZShwZnJhbWUsIDEsICYoY2F0ZWdvcnkpLCAmKHBhdHRyaWItPnBrdGxlbikpOwogCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCAxLCAmKGFjdGlvbiksICYocGF0dHJpYi0+cGt0bGVuKSk7CkBAIC0xNzc5LDcgKzE3MjIsNyBAQAogCXN0cnVjdCB4bWl0X2ZyYW1lCQkJKnBtZ250ZnJhbWU7CiAJc3RydWN0IHBrdF9hdHRyaWIJCQkqcGF0dHJpYjsKIAl1bnNpZ25lZCBjaGFyCQkJCSpwZnJhbWU7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAlzdHJ1Y3QJd2xhbl9uZXR3b3JrCSpwbmV0d29yayA9IE5VTEw7CiAJc3RydWN0IHhtaXRfcHJpdgkJCSpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CkBAIC0xODE1LDIxICsxNzU4LDIxIEBACiAJbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwogCiAJcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKIAotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKHBhZGFwdGVyLT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYocGFkYXB0ZXItPmVlcHJvbXByaXYpKSk7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgY3VyX25ldHdvcmstPk1hY0FkZHJlc3MpOwogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCBwbWxtZWV4dC0+bWdudF9zZXEpOwogCXBtbG1lZXh0LT5tZ250X3NlcSsrOwogCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfQUNUSU9OKTsKIAotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAJcGZyYW1lID0gcnR3X3NldF9maXhlZF9pZShwZnJhbWUsIDEsICYoY2F0ZWdvcnkpLCAmKHBhdHRyaWItPnBrdGxlbikpOwogCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCAxLCAmKGFjdGlvbiksICYocGF0dHJpYi0+cGt0bGVuKSk7CkBAIC0yMTEyLDcgKzIwNTUsNyBAQAogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAotCWxlbiA9IHBhY2tldF9sZW4gLSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlsZW4gPSBwYWNrZXRfbGVuIC0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCWlmIChsZW4gPiBNQVhfSUVfU1opCiAJCXJldHVybiBfRkFJTDsKQEAgLTIxNDIsNyArMjA4NSw3IEBACiAKIAkvKiBiZWxvdyBpcyB0byBjb3B5IHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50ICovCiAJYnNzaWQtPklFTGVuZ3RoID0gbGVuOwotCW1lbWNweShic3NpZC0+SUVzLCAocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcikpLCBic3NpZC0+SUVMZW5ndGgpOworCW1lbWNweShic3NpZC0+SUVzLCAocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSksIGJzc2lkLT5JRUxlbmd0aCk7CiAKIAkvKiBnZXQgdGhlIHNpZ25hbCBzdHJlbmd0aCBpbiBkQk0ucmF3IGRhdGEgKi8KIAlic3NpZC0+UnNzaSA9IHByZWN2X2ZyYW1lLT5hdHRyaWIucGh5X2luZm8ucmVjdnBvd2VyOwpAQCAtMjIxOSw3ICsyMTYyLDcgQEAKIAlpZiAoc3VidHlwZSA9PSBXSUZJX1BST0JFUkVRKSB7CiAJCS8qICBGSVhNRSAqLwogCQlic3NpZC0+SW5mcmFzdHJ1Y3R1cmVNb2RlID0gTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOwotCQltZW1jcHkoYnNzaWQtPk1hY0FkZHJlc3MsIEdldEFkZHIyUHRyKHBmcmFtZSksIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KGJzc2lkLT5NYWNBZGRyZXNzLCBHZXRBZGRyMlB0cihwZnJhbWUpKTsKIAkJYnNzaWQtPlByaXZhY3kgPSAxOwogCQlyZXR1cm4gX1NVQ0NFU1M7CiAJfQpAQCAtMjIzMSwxMCArMjE3NCwxMCBAQAogCiAJaWYgKHZhbDE2ICYgQklUKDApKSB7CiAJCWJzc2lkLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSW5mcmFzdHJ1Y3R1cmU7Ci0JCW1lbWNweShic3NpZC0+TWFjQWRkcmVzcywgR2V0QWRkcjJQdHIocGZyYW1lKSwgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkoYnNzaWQtPk1hY0FkZHJlc3MsIEdldEFkZHIyUHRyKHBmcmFtZSkpOwogCX0gZWxzZSB7CiAJCWJzc2lkLT5JbmZyYXN0cnVjdHVyZU1vZGUgPSBOZGlzODAyXzExSUJTUzsKLQkJbWVtY3B5KGJzc2lkLT5NYWNBZGRyZXNzLCBHZXRBZGRyM1B0cihwZnJhbWUpLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShic3NpZC0+TWFjQWRkcmVzcywgR2V0QWRkcjNQdHIocGZyYW1lKSk7CiAJfQogCiAJaWYgKHZhbDE2ICYgQklUKDQpKQpAQCAtMjI0OSwxMCArMjE5MiwxMCBAQAogCQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCQlwID0gcnR3X2dldF9pZShic3NpZC0+SUVzICsgaWVfb2Zmc2V0LCBfSFRfQ0FQQUJJTElUWV9JRV8sICZsZW4sIGJzc2lkLT5JRUxlbmd0aCAtIGllX29mZnNldCk7CiAJCWlmIChwICYmIGxlbiA+IDApIHsKLQkJCXN0cnVjdCBIVF9jYXBzX2VsZW1lbnQJKnBIVF9jYXBzOwotCQkJcEhUX2NhcHMgPSAoc3RydWN0IEhUX2NhcHNfZWxlbWVudCAqKShwICsgMik7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcEhUX2NhcHMgPQorCQkJCShzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqKShwICsgMik7CiAKLQkJCWlmIChsZTE2X3RvX2NwdShwSFRfY2Fwcy0+dS5IVF9jYXBfZWxlbWVudC5IVF9jYXBzX2luZm8pJkJJVCgxNCkpCisJCQlpZiAobGUxNl90b19jcHUocEhUX2NhcHMtPmNhcF9pbmZvKSAmIEJJVCgxNCkpCiAJCQkJcG1sbWVwcml2LT5udW1fRm9ydHlNSHpJbnRvbGVyYW50Kys7CiAJCX0gZWxzZSB7CiAJCQlwbWxtZXByaXYtPm51bV9zdGFfbm9faHQrKzsKQEAgLTI2ODQsNyArMjYyNyw3IEBACiAJCQl9CiAKIAkJCS8qIGNoZWNrIHRoZSB2ZW5kb3Igb2YgdGhlIGFzc29jIEFQICovCi0JCQlwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9IGNoZWNrX2Fzc29jX0FQKHBmcmFtZStzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKSwgbGVuLXNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKTsKKwkJCXBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID0gY2hlY2tfYXNzb2NfQVAocGZyYW1lK3NpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciksIGxlbi1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKIAogCQkJLyogdXBkYXRlIFRTRiBWYWx1ZSAqLwogCQkJdXBkYXRlX1RTRihwbWxtZWV4dCwgcGZyYW1lLCBsZW4pOwpAQCAtMzI5NiwxMyArMzIzOSwxNSBAQAogCX0KIAogCS8qIHNhdmUgSFQgY2FwYWJpbGl0aWVzIGluIHRoZSBzdGEgb2JqZWN0ICovCi0JbWVtc2V0KCZwc3RhdC0+aHRwcml2Lmh0X2NhcCwgMCwgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCkpOwotCWlmIChlbGVtcy5odF9jYXBhYmlsaXRpZXMgJiYgZWxlbXMuaHRfY2FwYWJpbGl0aWVzX2xlbiA+PSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwKSkgeworCW1lbXNldCgmcHN0YXQtPmh0cHJpdi5odF9jYXAsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOworCWlmIChlbGVtcy5odF9jYXBhYmlsaXRpZXMgJiYKKwkgICAgZWxlbXMuaHRfY2FwYWJpbGl0aWVzX2xlbiA+PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKSB7CiAJCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9IVDsKIAogCQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfV01FOwogCi0JCW1lbWNweSgmcHN0YXQtPmh0cHJpdi5odF9jYXAsIGVsZW1zLmh0X2NhcGFiaWxpdGllcywgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCkpOworCQltZW1jcHkoJnBzdGF0LT5odHByaXYuaHRfY2FwLAorCQkgICAgICAgZWxlbXMuaHRfY2FwYWJpbGl0aWVzLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKIAl9IGVsc2UgewogCQlwc3RhdC0+ZmxhZ3MgJj0gfldMQU5fU1RBX0hUOwogCX0KQEAgLTM2MzksNyArMzU4NCw3IEBACiAJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKIAlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwogCXU4ICpwZnJhbWUgPSBwcmVjdl9mcmFtZS0+cnhfZGF0YTsKLQl1OCAqZnJhbWVfYm9keSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXU4ICpmcmFtZV9ib2R5ID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAl1OCBjYXRlZ29yeTsKIAl1OCBhY3Rpb247CiAKQEAgLTM3MTMsNyArMzY1OCw3IEBACiAJaWYgKHBzdGEgPT0gTlVMTCkKIAkJcmV0dXJuIF9TVUNDRVNTOwogCi0JZnJhbWVfYm9keSA9ICh1bnNpZ25lZCBjaGFyICopKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKTsKKwlmcmFtZV9ib2R5ID0gKHVuc2lnbmVkIGNoYXIgKikocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CiAKIAljYXRlZ29yeSA9IGZyYW1lX2JvZHlbMF07CiAJaWYgKGNhdGVnb3J5ID09IFJUV19XTEFOX0NBVEVHT1JZX0JBQ0spIHsgLyogIHJlcHJlc2VudGluZyBCbG9jayBBY2sgKi8KQEAgLTM4MDAsNyArMzc0NSw3IEBACiAJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCXU4ICpmcmFtZV9ib2R5OwogCXU4IGRpYWxvZ1Rva2VuID0gMDsKLQlmcmFtZV9ib2R5ID0gKHVuc2lnbmVkIGNoYXIgKikocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcikpOworCWZyYW1lX2JvZHkgPSAodW5zaWduZWQgY2hhciAqKShwZnJhbWUgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKIAogCWRpYWxvZ1Rva2VuID0gZnJhbWVfYm9keVs3XTsKIApAQCAtMzgxNCw3ICszNzU5LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgcmV0ID0gX0ZBSUw7CiAJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwotCXU4ICpmcmFtZV9ib2R5ID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCiAJaWYgKCFtZW1jbXAoZnJhbWVfYm9keSArIDIsIFAyUF9PVUksIDQpKQogCQlyZXQgPSBvbl9hY3Rpb25fcHVibGljX3AycChwcmVjdl9mcmFtZSk7CkBAIC0zODI2LDcgKzM3NzEsNyBAQAogewogCXVuc2lnbmVkIGludCByZXQgPSBfRkFJTDsKIAl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7Ci0JdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwl1OCAqZnJhbWVfYm9keSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJdTggdG9rZW47CiAKIAl0b2tlbiA9IGZyYW1lX2JvZHlbMl07CkBAIC0zODQ1LDcgKzM3OTAsNyBAQAogewogCXVuc2lnbmVkIGludCByZXQgPSBfRkFJTDsKIAl1OCAqcGZyYW1lID0gcHJlY3ZfZnJhbWUtPnJ4X2RhdGE7Ci0JdTggKmZyYW1lX2JvZHkgPSBwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwl1OCAqZnJhbWVfYm9keSA9IHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJdTggY2F0ZWdvcnksIGFjdGlvbjsKIAogCS8qIGNoZWNrIFJBIG1hdGNoZXMgb3Igbm90ICovCkBAIC0zOTE3LDcgKzM4NjIsNyBAQAogCXVuc2lnbmVkIGNoYXIJKmZyYW1lX2JvZHk7CiAJdTggKnBmcmFtZSA9IHByZWN2X2ZyYW1lLT5yeF9kYXRhOwogCi0JZnJhbWVfYm9keSA9ICh1bnNpZ25lZCBjaGFyICopKHBmcmFtZSArIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpKTsKKwlmcmFtZV9ib2R5ID0gKHVuc2lnbmVkIGNoYXIgKikocGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7CiAKIAljYXRlZ29yeSA9IGZyYW1lX2JvZHlbMF07CiAKQEAgLTQyOTUsNyArNDI0MCw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmcGNtZF9vYmotPmxpc3QpOwogCi0JcGNtZF9vYmotPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCk7CisJcGNtZF9vYmotPmNtZGNvZGUgPSBfU2V0X01MTUVfRVZUX0NNRF87CiAJcGNtZF9vYmotPmNtZHN6ID0gY21kc3o7CiAJcGNtZF9vYmotPnBhcm1idWYgPSBwZXZ0Y21kOwogCkBAIC00MzA0LDcgKzQyNDksNyBAQAogCiAJcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7CiAJcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN1cnZleV9ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfU3VydmV5KTsKKwlwYzJoX2V2dF9oZHItPklEID0gX1N1cnZleV9FVlRfOwogCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwogCiAJcHN1cnZleV9ldnQgPSAoc3RydWN0IHN1cnZleV9ldmVudCAqKShwZXZ0Y21kICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKQEAgLTQzNDUsNyArNDI5MCw3IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmcGNtZF9vYmotPmxpc3QpOwogCi0JcGNtZF9vYmotPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCk7CisJcGNtZF9vYmotPmNtZGNvZGUgPSBfU2V0X01MTUVfRVZUX0NNRF87CiAJcGNtZF9vYmotPmNtZHN6ID0gY21kc3o7CiAJcGNtZF9vYmotPnBhcm1idWYgPSBwZXZ0Y21kOwogCkBAIC00MzU0LDcgKzQyOTksNyBAQAogCiAJcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7CiAJcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN1cnZleWRvbmVfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX1N1cnZleURvbmUpOworCXBjMmhfZXZ0X2hkci0+SUQgPSBfU3VydmV5RG9uZV9FVlRfOwogCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwogCiAJcHN1cnZleWRvbmVfZXZ0ID0gKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50ICopKHBldnRjbWQgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwpAQCAtNDM4OSw3ICs0MzM0LDcgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZwY21kX29iai0+bGlzdCk7CiAKLQlwY21kX29iai0+Y21kY29kZSA9IEdFTl9DTURfQ09ERShfU2V0X01MTUVfRVZUKTsKKwlwY21kX29iai0+Y21kY29kZSA9IF9TZXRfTUxNRV9FVlRfQ01EXzsKIAlwY21kX29iai0+Y21kc3ogPSBjbWRzejsKIAlwY21kX29iai0+cGFybWJ1ZiA9IHBldnRjbWQ7CiAKQEAgLTQzOTgsNyArNDM0Myw3IEBACiAKIAlwYzJoX2V2dF9oZHIgPSAoc3RydWN0IEMySEV2ZW50X0hlYWRlciAqKShwZXZ0Y21kKTsKIAlwYzJoX2V2dF9oZHItPmxlbiA9IHNpemVvZihzdHJ1Y3Qgam9pbmJzc19ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfSm9pbkJzcyk7CisJcGMyaF9ldnRfaGRyLT5JRCA9IF9Kb2luQnNzX0VWVF87CiAJcGMyaF9ldnRfaGRyLT5zZXEgPSBhdG9taWNfaW5jX3JldHVybigmcG1sbWVleHQtPmV2ZW50X3NlcSk7CiAKIAlwam9pbmJzc19ldnQgPSAoc3RydWN0IGpvaW5ic3NfZXZlbnQgKikocGV2dGNtZCArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CkBAIC00NDQwLDcgKzQzODUsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnBjbWRfb2JqLT5saXN0KTsKIAotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOworCXBjbWRfb2JqLT5jbWRjb2RlID0gX1NldF9NTE1FX0VWVF9DTURfOwogCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwogCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKIApAQCAtNDQ0OSwxMSArNDM5NCwxMSBAQAogCiAJcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7CiAJcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN0YWRlbF9ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfRGVsU1RBKTsKKwlwYzJoX2V2dF9oZHItPklEID0gX0RlbFNUQV9FVlRfOwogCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwogCiAJcGRlbF9zdGFfZXZ0ID0gKHN0cnVjdCBzdGFkZWxfZXZlbnQgKikocGV2dGNtZCArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7Ci0JbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKCYocGRlbF9zdGFfZXZ0LT5tYWNhZGRyKSksIE1hY0FkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoKHVuc2lnbmVkIGNoYXIgKikoJihwZGVsX3N0YV9ldnQtPm1hY2FkZHIpKSwgTWFjQWRkcik7CiAJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHBkZWxfc3RhX2V2dC0+cnN2ZCksICh1bnNpZ25lZCBjaGFyICopKCZyZWFzb24pLCAyKTsKIAogCkBAIC00NDkzLDcgKzQ0MzgsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnBjbWRfb2JqLT5saXN0KTsKIAotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOworCXBjbWRfb2JqLT5jbWRjb2RlID0gX1NldF9NTE1FX0VWVF9DTURfOwogCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwogCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKIApAQCAtNDUwMiwxMSArNDQ0NywxMSBAQAogCiAJcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7CiAJcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN0YXNzb2NfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX0FkZFNUQSk7CisJcGMyaF9ldnRfaGRyLT5JRCA9IF9BZGRTVEFfRVZUXzsKIAlwYzJoX2V2dF9oZHItPnNlcSA9IGF0b21pY19pbmNfcmV0dXJuKCZwbWxtZWV4dC0+ZXZlbnRfc2VxKTsKIAogCXBhZGRfc3RhX2V2dCA9IChzdHJ1Y3Qgc3Rhc3NvY19ldmVudCAqKShwZXZ0Y21kICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKLQltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikoJihwYWRkX3N0YV9ldnQtPm1hY2FkZHIpKSwgTWFjQWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weSgodW5zaWduZWQgY2hhciAqKSgmKHBhZGRfc3RhX2V2dC0+bWFjYWRkcikpLCBNYWNBZGRyKTsKIAlwYWRkX3N0YV9ldnQtPmNhbV9pZCA9IGNhbV9pZHg7CiAKIAlEQkdfODhFKCJyZXBvcnRfYWRkX3N0YV9ldmVudDogYWRkIFNUQVxuIik7CkBAIC00NTM3LDcgKzQ0ODIsNyBAQAogCiAJCXBzdGEtPmh0cHJpdi5hbXBkdV9lbmFibGUgPSBwbWxtZXByaXYtPmh0cHJpdi5hbXBkdV9lbmFibGU7CiAKLQkJaWYgKHN1cHBvcnRfc2hvcnRfR0kocGFkYXB0ZXIsICYocG1sbWVpbmZvLT5IVF9jYXBzKSkpCisJCWlmIChzdXBwb3J0X3Nob3J0X0dJKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5IVF9jYXBzKSkKIAkJCXBzdGEtPmh0cHJpdi5zZ2kgPSB0cnVlOwogCiAJCXBzdGEtPnFvc19vcHRpb24gPSB0cnVlOwpAQCAtNDkwNCw3ICs0ODQ5LDcgQEAKIAkJCWdvdG8gZXhpdF9zdXJ2ZXlfdGltZXJfaGRsOwogCQl9CiAKLQkJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHN1cnZleVBhcmEsIEdFTl9DTURfQ09ERShfU2l0ZVN1cnZleSkpOworCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwc3VydmV5UGFyYSwgX1NpdGVTdXJ2ZXlfQ01EXyk7CiAJCXJ0d19lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiAJfQogCkBAIC01NDgwLDcgKzU0MjUsNyBAQAogCQkJCSAgICAgIHBtbG1laW5mby0+aGlkZGVuX3NzaWRfbW9kZSk7CiAJcHR4QmVhY29uX3Bhcm0tPklFTGVuZ3RoICs9IGxlbl9kaWZmOwogCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHR4QmVhY29uX3Bhcm0sIEdFTl9DTURfQ09ERShfVFhfQmVhY29uKSk7CisJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHR4QmVhY29uX3Bhcm0sIF9UWF9CZWFjb25fQ01EXyk7CiAKIAlyZXMgPSBydHdfZW5xdWV1ZV9jbWQocGNtZHByaXYsIHBoMmMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jCmluZGV4IDU5YzZkOGEuLjBiNzBmZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jCkBAIC0zOCw3ICszOCw3IEBACiAJTGVhdmVBbGxQb3dlclNhdmVNb2RlKHBhZGFwdGVyKTsKIAogCURCR184OEUoIj09PiBydHdfaHdfc3VzcGVuZFxuIik7Ci0JX2VudGVyX3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X2xvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IHRydWU7CiAJLyogczEuICovCiAJaWYgKHBuZXRkZXYpIHsKQEAgLTczLDcgKzczLDcgQEAKIAlwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29mZjsKIAlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSBmYWxzZTsKIAotCV9leGl0X3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAKIAlyZXR1cm4gMDsKIApAQCAtOTAsMTIgKzkwLDEyIEBACiAKIAkvKiBzeXN0ZW0gcmVzdW1lICovCiAJREJHXzg4RSgiPT0+IHJ0d19od19yZXN1bWVcbiIpOwotCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF9sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSB0cnVlOwogCXJ0d19yZXNldF9kcnZfc3cocGFkYXB0ZXIpOwogCiAJaWYgKHBtX25ldGRldl9vcGVuKHBuZXRkZXYsIGZhbHNlKSAhPSAwKSB7Ci0JCV9leGl0X3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCQltdXRleF91bmxvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCQlnb3RvIGVycm9yX2V4aXQ7CiAJfQogCkBAIC0xMTMsNyArMTEzLDcgQEAKIAlwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29uOwogCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IGZhbHNlOwogCi0JX2V4aXRfcHdybG9jaygmcHdycHJpdi0+bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAogCiAJcmV0dXJuIDA7CkBAIC0xMzgsNyArMTM4LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF9sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAogCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IHRydWU7CiAKQEAgLTE1OSw3ICsxNTksNyBAQAogCX0KIAlwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcgPSBmYWxzZTsKIAotCV9leGl0X3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiB9CiAKIGludCBpcHNfbGVhdmUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQpAQCAtMTcxLDcgKzE3MSw3IEBACiAJaW50IGtleWlkOwogCiAKLQlfZW50ZXJfcHdybG9jaygmcHdycHJpdi0+bG9jayk7CisJbXV0ZXhfbG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAKIAlpZiAoKHB3cnByaXYtPnJmX3B3cnN0YXRlID09IHJmX29mZikgJiYgKCFwd3Jwcml2LT5iaXBzX3Byb2Nlc3NpbmcpKSB7CiAJCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IHRydWU7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJcHdycHJpdi0+YnBvd2VyX3NhdmluZyA9IGZhbHNlOwogCX0KIAotCV9leGl0X3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtNTA0LDcgKzUwNCw3IEBACiB7CiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCi0JX2luaXRfcHdybG9jaygmcHdyY3RybHByaXYtPmxvY2spOworCW11dGV4X2luaXQoJnB3cmN0cmxwcml2LT5tdXRleF9sb2NrKTsKIAlwd3JjdHJscHJpdi0+cmZfcHdyc3RhdGUgPSByZl9vbjsKIAlwd3JjdHJscHJpdi0+aXBzX2VudGVyX2NudHMgPSAwOwogCXB3cmN0cmxwcml2LT5pcHNfbGVhdmVfY250cyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmVjdi5jCmluZGV4IDk3N2JiMjUuLmI4N2NiYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmVjdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmVjdi5jCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMAogfTsKIAotdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitzdGF0aWMgdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIHZvaWQgX3J0d19pbml0X3N0YV9yZWN2X3ByaXYoc3RydWN0IHN0YV9yZWN2X3ByaXYgKnBzdGFfcmVjdnByaXYpCiB7CkBAIC03Myw3ICs3Myw3IEBACiAJaWYgKCFwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmKQogCQlyZXR1cm4gX0ZBSUw7CiAKLQlwcmVjdnByaXYtPnByZWN2X2ZyYW1lX2J1ZiA9ICh1OCAqKU5fQllURV9BTElHTUVOVCgoc2l6ZV90KShwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmKSwgUlhGUkFNRV9BTElHTl9TWik7CisJcHJlY3Zwcml2LT5wcmVjdl9mcmFtZV9idWYgPSBQVFJfQUxJR04ocHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiwgUlhGUkFNRV9BTElHTl9TWik7CiAKIAlwcmVjdmZyYW1lID0gKHN0cnVjdCByZWN2X2ZyYW1lICopcHJlY3Zwcml2LT5wcmVjdl9mcmFtZV9idWY7CiAKQEAgLTIwODgsNyArMjA4OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIHJ0d19zaWduYWxfc3RhdF90aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopZGF0YTsKIAlzdHJ1Y3QgcmVjdl9wcml2ICpyZWN2cHJpdiA9ICZhZGFwdGVyLT5yZWN2cHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcmYuYwppbmRleCAzZmMxYThmLi5lNDdiZTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19yZi5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgogI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KIAotCiBzdHJ1Y3QgY2hfZnJlcSB7CiAJdTMyIGNoYW5uZWw7CiAJdTMyIGZyZXF1ZW5jeTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc2VjdXJpdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc2VjdXJpdHkuYwppbmRleCA0NDJhNjE0Li44NWJiNDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NlY3VyaXR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zZWN1cml0eS5jCkBAIC0yMzMsNyArMjMzLDYgQEAKIAkJCQkgJmNyYywgJnBheWxvYWRbbGVuZ3RoLTRdKSk7CiAJCX0KIAl9Ci0JcmV0dXJuOwogfQogCiAvKiAzCQk9PT09PSBUS0lQIHJlbGF0ZWQgPT09PT0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc3Jlc2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NyZXNldC5jCmluZGV4IDEzYTViZjQuLmExOThjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc3Jlc2V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zcmVzZXQuYwpAQCAtMTYsMTggKzE2LDE2IEBACiAjaW5jbHVkZSA8cnR3X3NyZXNldC5oPgogI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KIAotdm9pZCBzcmVzZXRfaW5pdF92YWx1ZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfc3Jlc2V0X2luaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBzcmVzZXRfcHJpdiAqcHNydHByaXYgPSAmcEhhbERhdGEtPnNyZXN0cHJpdjsKKwlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgKnBzcnRwcml2ID0gJnBhZGFwdGVyLT5IYWxEYXRhLT5zcmVzdHByaXY7CiAKIAlwc3J0cHJpdi0+V2lmaV9FcnJvcl9TdGF0dXMgPSBXSUZJX1NUQVRVU19TVUNDRVNTOwogfQogCiB1OCBzcmVzZXRfZ2V0X3dpZmlfc3RhdHVzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgKnBzcnRwcml2ID0gJnBIYWxEYXRhLT5zcmVzdHByaXY7CisJc3RydWN0IHNyZXNldF9wcml2ICpwc3J0cHJpdiA9ICZwYWRhcHRlci0+SGFsRGF0YS0+c3Jlc3Rwcml2OwogCiAJdTggc3RhdHVzID0gV0lGSV9TVEFUVVNfU1VDQ0VTUzsKIAl1MzIgdmFsMzIgPSAwOwpAQCAtNTQsNiArNTIsNSBAQAogCiB2b2lkIHNyZXNldF9zZXRfd2lmaV9lcnJvcl9zdGF0dXMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgc3RhdHVzKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBIYWxEYXRhLT5zcmVzdHByaXYuV2lmaV9FcnJvcl9TdGF0dXMgPSBzdGF0dXM7CisJcGFkYXB0ZXItPkhhbERhdGEtPnNyZXN0cHJpdi5XaWZpX0Vycm9yX1N0YXR1cyA9IHN0YXR1czsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3dsYW5fdXRpbC5jCmluZGV4IDQ0MTBmZTguLjJhNjVhYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d193bGFuX3V0aWwuYwpAQCAtMzQxLDkgKzM0MSw2IEBACiB7CiAJdTggY2VudGVyX2NoOwogCi0JaWYgKHBhZGFwdGVyLT5iTm90aWZ5Q2hhbm5lbENoYW5nZSkKLQkJREJHXzg4RSgiWyVzXSBjaCA9ICVkLCBvZmZzZXQgPSAlZCwgYndtb2RlID0gJWRcbiIsIF9fZnVuY19fLCBjaGFubmVsLCBjaGFubmVsX29mZnNldCwgYndtb2RlKTsKLQogCWlmICgoYndtb2RlID09IEhUX0NIQU5ORUxfV0lEVEhfMjApIHx8CiAJICAgIChjaGFubmVsX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFKSkgewogCQkvKiBTZWxlY3RDaGFubmVsKHBhZGFwdGVyLCBjaGFubmVsKTsgKi8KQEAgLTcxNiw2ICs3MTMsNyBAQAogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJc3RydWN0IG1sbWVfcHJpdgkJKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IGh0X3ByaXYJCQkqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKKwl1OCAqSFRfY2FwID0gKHU4ICopKCZwbWxtZWluZm8tPkhUX2NhcHMpOwogCiAJaWYgKHBJRSA9PSBOVUxMKQogCQlyZXR1cm47CkBAIC03MjgsMjAgKzcyNiwyMCBAQAogCWZvciAoaSA9IDA7IGkgPCAocElFLT5MZW5ndGgpOyBpKyspIHsKIAkJaWYgKGkgIT0gMikgewogCQkJLyoJR290IHRoZSBlbmRpYW4gaXNzdWUgaGVyZS4gKi8KLQkJCXBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcFtpXSAmPSAocElFLT5kYXRhW2ldKTsKKwkJCUhUX2NhcFtpXSAmPSAocElFLT5kYXRhW2ldKTsKIAkJfSBlbHNlIHsKIAkJCS8qIG1vZGlmeSBmcm9tICBmdyBieSBUaG9tYXMgMjAxMC8xMS8xNyAqLwotCQkJaWYgKChwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5BTVBEVV9wYXJhICYgMHgzKSA+IChwSUUtPmRhdGFbaV0gJiAweDMpKQorCQkJaWYgKChwbWxtZWluZm8tPkhUX2NhcHMuYW1wZHVfcGFyYW1zX2luZm8gJiAweDMpID4gKHBJRS0+ZGF0YVtpXSAmIDB4MykpCiAJCQkJbWF4X0FNUERVX2xlbiA9IHBJRS0+ZGF0YVtpXSAmIDB4MzsKIAkJCWVsc2UKLQkJCQltYXhfQU1QRFVfbGVuID0gcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MzsKKwkJCQltYXhfQU1QRFVfbGVuID0gcG1sbWVpbmZvLT5IVF9jYXBzLmFtcGR1X3BhcmFtc19pbmZvICYgMHgzOwogCi0JCQlpZiAoKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDFjKSA+IChwSUUtPmRhdGFbaV0gJiAweDFjKSkKLQkJCQltaW5fTVBEVV9zcGFjaW5nID0gcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MWM7CisJCQlpZiAoKHBtbG1laW5mby0+SFRfY2Fwcy5hbXBkdV9wYXJhbXNfaW5mbyAmIDB4MWMpID4gKHBJRS0+ZGF0YVtpXSAmIDB4MWMpKQorCQkJCW1pbl9NUERVX3NwYWNpbmcgPSBwbWxtZWluZm8tPkhUX2NhcHMuYW1wZHVfcGFyYW1zX2luZm8gJiAweDFjOwogCQkJZWxzZQogCQkJCW1pbl9NUERVX3NwYWNpbmcgPSBwSUUtPmRhdGFbaV0gJiAweDFjOwogCi0JCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5BTVBEVV9wYXJhID0gbWF4X0FNUERVX2xlbiB8IG1pbl9NUERVX3NwYWNpbmc7CisJCQlwbWxtZWluZm8tPkhUX2NhcHMuYW1wZHVfcGFyYW1zX2luZm8gPSBtYXhfQU1QRFVfbGVuIHwgbWluX01QRFVfc3BhY2luZzsKIAkJfQogCX0KIApAQCAtNzUwLDkgKzc0OCw5IEBACiAJLyogdXBkYXRlIHRoZSBNQ1MgcmF0ZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQlpZiAoKHJmX3R5cGUgPT0gUkZfMVQxUikgfHwgKHJmX3R5cGUgPT0gUkZfMVQyUikpCi0JCQlwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5NQ1NfcmF0ZVtpXSAmPSBNQ1NfcmF0ZV8xUltpXTsKKwkJCSgodTggKikmcG1sbWVpbmZvLT5IVF9jYXBzLm1jcylbaV0gJj0gTUNTX3JhdGVfMVJbaV07CiAJCWVsc2UKLQkJCXBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlW2ldICY9IE1DU19yYXRlXzJSW2ldOworCQkJKCh1OCAqKSZwbWxtZWluZm8tPkhUX2NhcHMubWNzKVtpXSAmPSBNQ1NfcmF0ZV8yUltpXTsKIAl9CiB9CiAKQEAgLTc5OCw5ICs3OTYsOSBAQAogCQlBTVBEVV9wYXJhIFsxOjBdOk1heCBBTVBEVSBMZW4gPT4gMDo4ayAsIDE6MTZrLCAyOjMyaywgMzo2NGsKIAkJQU1QRFVfcGFyYSBbNDoyXTpNaW4gTVBEVSBTdGFydCBTcGFjaW5nCiAJKi8KLQltYXhfQU1QRFVfbGVuID0gcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MDM7CisJbWF4X0FNUERVX2xlbiA9IHBtbG1laW5mby0+SFRfY2Fwcy5hbXBkdV9wYXJhbXNfaW5mbyAmIDB4MDM7CiAKLQltaW5fTVBEVV9zcGFjaW5nID0gKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDFjKSA+PiAyOworCW1pbl9NUERVX3NwYWNpbmcgPSAocG1sbWVpbmZvLT5IVF9jYXBzLmFtcGR1X3BhcmFtc19pbmZvICYgMHgxYykgPj4gMjsKIAogCXJ0d19oYWxfc2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfQU1QRFVfTUlOX1NQQUNFLCAodTggKikoJm1pbl9NUERVX3NwYWNpbmcpKTsKIApAQCAtODcyLDcgKzg3MCw2IEBACiAJdTMyIHdwYV9pZWxlbiA9IDA7CiAJdTggKnBic3NpZCA9IEdldEFkZHIzUHRyKHBmcmFtZSk7CiAJc3RydWN0IEhUX2luZm9fZWxlbWVudCAqcGh0X2luZm8gPSBOVUxMOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcCA9IE5VTEw7CiAJdTMyIGJjbl9jaGFubmVsOwogCXVuc2lnbmVkIHNob3J0CWh0X2NhcF9pbmZvOwogCXVuc2lnbmVkIGNoYXIJaHRfaW5mb19pbmZvc18wOwpAQCAtODgxLDcgKzg3OCw3IEBACiAJaWYgKGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwKEFkYXB0ZXIpID09IGZhbHNlKQogCQlyZXR1cm4gdHJ1ZTsKIAotCWxlbiA9IHBhY2tldF9sZW4gLSBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKTsKKwlsZW4gPSBwYWNrZXRfbGVuIC0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCWlmIChsZW4gPiBNQVhfSUVfU1opIHsKIAkJREJHXzg4RSgiJXMgSUUgdG9vIGxvbmcgZm9yIHN1cnZleSBldmVudFxuIiwgX19mdW5jX18pOwpAQCAtOTA3LDE0ICs5MDQsMTYgQEAKIAogCS8qIGJlbG93IGlzIHRvIGNvcHkgdGhlIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KIAlic3NpZC0+SUVMZW5ndGggPSBsZW47Ci0JbWVtY3B5KGJzc2lkLT5JRXMsIChwZnJhbWUgKyBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyKSksIGJzc2lkLT5JRUxlbmd0aCk7CisJbWVtY3B5KGJzc2lkLT5JRXMsIChwZnJhbWUgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKSwgYnNzaWQtPklFTGVuZ3RoKTsKIAogCS8qIGNoZWNrIGJ3IGFuZCBjaGFubmVsIG9mZnNldCAqLwogCS8qIHBhcnNpbmcgSFRfQ0FQX0lFICovCiAJcCA9IHJ0d19nZXRfaWUoYnNzaWQtPklFcyArIF9GSVhFRF9JRV9MRU5HVEhfLCBfSFRfQ0FQQUJJTElUWV9JRV8sICZsZW4sIGJzc2lkLT5JRUxlbmd0aCAtIF9GSVhFRF9JRV9MRU5HVEhfKTsKIAlpZiAocCAmJiBsZW4gPiAwKSB7Ci0JCXBodF9jYXAgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKLQkJaHRfY2FwX2luZm8gPSBwaHRfY2FwLT5jYXBfaW5mbzsKKwkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcCA9CisJCQkoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKikocCArIDIpOworCisJCWh0X2NhcF9pbmZvID0gbGUxNl90b19jcHUoaHRfY2FwLT5jYXBfaW5mbyk7CiAJfSBlbHNlIHsKIAkJaHRfY2FwX2luZm8gPSAwOwogCX0KQEAgLTEyNDMsMTYgKzEyNDIsMTcgQEAKIAlyZXR1cm4gbWFzazsKIH0KIAotdW5zaWduZWQgaW50IHVwZGF0ZV9NU0NfcmF0ZShzdHJ1Y3QgSFRfY2Fwc19lbGVtZW50ICpwSFRfY2FwcykKK3Vuc2lnbmVkIGludCB1cGRhdGVfTVNDX3JhdGUoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzKQogewogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAotCW1hc2sgPSAocEhUX2NhcHMtPnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGVbMF0gPDwgMTIpIHwgKHBIVF9jYXBzLT51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlWzFdIDw8IDIwKTsKKwltYXNrID0gKHBIVF9jYXBzLT5tY3MucnhfbWFza1swXSA8PCAxMikgfAorCSAgICAgICAocEhUX2NhcHMtPm1jcy5yeF9tYXNrWzFdIDw8IDIwKTsKIAogCXJldHVybiBtYXNrOwogfQogCi1pbnQgc3VwcG9ydF9zaG9ydF9HSShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBIVF9jYXBzX2VsZW1lbnQgKnBIVF9jYXBzKQoraW50IHN1cHBvcnRfc2hvcnRfR0koc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcEhUX2NhcHMpCiB7CiAJdW5zaWduZWQgY2hhcgkJCQkJYml0X29mZnNldDsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwpAQCAtMTI2Niw3ICsxMjY2LDcgQEAKIAogCWJpdF9vZmZzZXQgPSAocG1sbWVleHQtPmN1cl9id21vZGUgJiBIVF9DSEFOTkVMX1dJRFRIXzQwKSA/IDYgOiA1OwogCi0JaWYgKF9fbGUxNl90b19jcHUocEhUX2NhcHMtPnUuSFRfY2FwX2VsZW1lbnQuSFRfY2Fwc19pbmZvKSAmICgweDEgPDwgYml0X29mZnNldCkpCisJaWYgKF9fbGUxNl90b19jcHUocEhUX2NhcHMtPmNhcF9pbmZvKSAmICgweDEgPDwgYml0X29mZnNldCkpCiAJCXJldHVybiBfU1VDQ0VTUzsKIAllbHNlCiAJCXJldHVybiBfRkFJTDsKQEAgLTE1MDgsNyArMTUwOCw3IEBACiAJU0lGU19UaW1lciA9IDB4MGEwYTA4MDg7LyogMHgwODA4IC0+IGZvciBDQ0ssIDB4MGEwYSAtPiBmb3IgT0ZETSAqLwogCQkJCS8qIGNoYW5nZSB0aGlzIHZhbHVlIGlmIGhhdmluZyBJT1QgaXNzdWVzLiAqLwogCi0JcGFkYXB0ZXItPkhhbEZ1bmMuU2V0SHdSZWdIYW5kbGVyKHBhZGFwdGVyLCBIV19WQVJfUkVTUF9TSUZTLCAgKHU4ICopJlNJRlNfVGltZXIpOworCXJ0d19oYWxfc2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfUkVTUF9TSUZTLCAgKHU4ICopJlNJRlNfVGltZXIpOwogCiAJaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExQikKIAkJdXBkYXRlX21nbnRfdHhfcmF0ZShwYWRhcHRlciwgSUVFRTgwMjExX0NDS19SQVRFXzFNQik7CkBAIC0xNTg0LDcgKzE1ODQsNyBAQAogCXU4ICpwSUU7CiAJX19sZTMyICpwYnVmOwogCi0JcElFID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcElFID0gcGZyYW1lICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAlwYnVmID0gKF9fbGUzMiAqKXBJRTsKIAogCXBtbG1lZXh0LT5UU0ZWYWx1ZSA9IGxlMzJfdG9fY3B1KCoocGJ1ZisxKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCmluZGV4IGUwYTU1NjcuLjBmOGI4ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCkBAIC01Nyw4ICs1Nyw2IEBACiAJLyogIFdlIGRvbid0IG5lZWQgdG8gbWVtc2V0IHBhZGFwdGVyLT5YWFggdG8gemVybywgYmVjYXVzZSBhZGFwdGVyIGlzIGFsbG9jYXRlZCBieSB2emFsbG9jKCkuICovCiAKIAlzcGluX2xvY2tfaW5pdCgmcHhtaXRwcml2LT5sb2NrKTsKLQlzZW1hX2luaXQoJnB4bWl0cHJpdi0+eG1pdF9zZW1hLCAwKTsKLQlzZW1hX2luaXQoJnB4bWl0cHJpdi0+dGVybWluYXRlX3htaXR0aHJlYWRfc2VtYSwgMCk7CiAKIAkvKgogCVBsZWFzZSBpbnNlcnQgYWxsIHRoZSBxdWV1ZSBpbml0aWFsaXphaXRvbiB1c2luZyBfcnR3X2luaXRfcXVldWUgYmVsb3cKQEAgLTg4LDcgKzg2LDcgQEAKIAkJcmVzID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JcHhtaXRwcml2LT5weG1pdF9mcmFtZV9idWYgPSAodTggKilOX0JZVEVfQUxJR01FTlQoKHNpemVfdCkocHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiksIDQpOworCXB4bWl0cHJpdi0+cHhtaXRfZnJhbWVfYnVmID0gUFRSX0FMSUdOKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF9mcmFtZV9idWYsIDQpOwogCS8qIHB4bWl0cHJpdi0+cHhtaXRfZnJhbWVfYnVmID0gcHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiArIDQgLSAqLwogCS8qIAkJCQkJCSgoc2l6ZV90KSAocHhtaXRwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZikgJjMpOyAqLwogCkBAIC0xMjYsNyArMTI0LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAotCXB4bWl0cHJpdi0+cHhtaXRidWYgPSAodTggKilOX0JZVEVfQUxJR01FTlQoKHNpemVfdCkocHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRidWYpLCA0KTsKKwlweG1pdHByaXYtPnB4bWl0YnVmID0gUFRSX0FMSUdOKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmLCA0KTsKIAkvKiBweG1pdHByaXYtPnB4bWl0YnVmID0gcHhtaXRwcml2LT5wYWxsb2NhdGVkX3htaXRidWYgKyA0IC0gKi8KIAkvKiAJCQkJCQkoKHNpemVfdCkgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0YnVmKSAmMyk7ICovCiAKQEAgLTE0NCw5ICsxNDIsOCBAQAogCQlpZiAocmVzID09IF9GQUlMKSB7CiAJCQltc2xlZXAoMTApOwogCQkJcmVzID0gcnR3X29zX3htaXRfcmVzb3VyY2VfYWxsb2MocGFkYXB0ZXIsIHB4bWl0YnVmLCAoTUFYX1hNSVRCVUZfU1ogKyBYTUlUQlVGX0FMSUdOX1NaKSk7Ci0JCQlpZiAocmVzID09IF9GQUlMKSB7CisJCQlpZiAocmVzID09IF9GQUlMKQogCQkJCWdvdG8gZXhpdDsKLQkJCX0KIAkJfQogCiAJCXB4bWl0YnVmLT5mbGFncyA9IFhNSVRfVk9fUVVFVUU7CkBAIC0xNjgsNyArMTY1LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAotCXB4bWl0cHJpdi0+cHhtaXRfZXh0YnVmID0gKHU4ICopTl9CWVRFX0FMSUdNRU5UKChzaXplX3QpKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiksIDQpOworCXB4bWl0cHJpdi0+cHhtaXRfZXh0YnVmID0gUFRSX0FMSUdOKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZiwgNCk7CiAKIAlweG1pdGJ1ZiA9IChzdHJ1Y3QgeG1pdF9idWYgKilweG1pdHByaXYtPnB4bWl0X2V4dGJ1ZjsKIApAQCAtMTk5LDggKzE5Niw2IEBACiAKIAlweG1pdHByaXYtPnR4aXJwX2NudCA9IDE7CiAKLQlzZW1hX2luaXQoJihweG1pdHByaXYtPnR4X3JldGV2dCksIDApOwotCiAJLyogcGVyIEFDIHBlbmRpbmcgaXJwICovCiAJcHhtaXRwcml2LT5iZXFfY250ID0gMDsKIAlweG1pdHByaXYtPmJrcV9jbnQgPSAwOwpAQCAtMjUyLDkgKzI0Nyw4IEBACiAJCXB4bWl0YnVmKys7CiAJfQogCi0JaWYgKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1ZikgeworCWlmIChweG1pdHByaXYtPnBhbGxvY2F0ZWRfeG1pdF9leHRidWYpCiAJCXZmcmVlKHB4bWl0cHJpdi0+cGFsbG9jYXRlZF94bWl0X2V4dGJ1Zik7Ci0JfQogCiAJcnR3X2ZyZWVfaHd4bWl0cyhwYWRhcHRlcik7CiAKQEAgLTQwOCw3ICs0MDIsNyBAQAogCQlfcnR3X3BrdGZpbGVfcmVhZChwcGt0ZmlsZSwgKHU4ICopJmlwX2hkciwgc2l6ZW9mKGlwX2hkcikpOwogLyogCQl1c2VyX3ByaW8gPSAobnRvaHMoaXBfaGRyLnRvcykgPj4gNSkgJiAweDM7ICovCiAJCXVzZXJfcHJpbyA9IGlwX2hkci50b3MgPj4gNTsKLQl9IGVsc2UgaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gMHg4ODhlKSB7CisJfSBlbHNlIGlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX1BBRSkgewogCQkvKiAgIldoZW4gcHJpb3JpdHkgcHJvY2Vzc2luZyBvZiBkYXRhIGZyYW1lcyBpcyBzdXBwb3J0ZWQsICovCiAJCS8qICBhIFNUQSdzIFNNRSBzaG91bGQgc2VuZCBFQVBPTC1LZXkgZnJhbWVzIGF0IHRoZSBoaWdoZXN0IHByaW9yaXR5LiIgKi8KIAkJdXNlcl9wcmlvID0gNzsKQEAgLTQ1NywxNCArNDUxLDE0IEBACiAKIAlwYXR0cmliLT5wa3RsZW4gPSBwa3RmaWxlLnBrdF9sZW47CiAKLQlpZiAoRVRIX1BfSVAgPT0gcGF0dHJpYi0+ZXRoZXJfdHlwZSkgeworCWlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX0lQKSB7CiAJCS8qICBUaGUgZm9sbG93aW5nIGlzIGZvciBESENQIGFuZCBBUlAgcGFja2V0LCB3ZSB1c2UgY2NrMU0gdG8gdHggdGhlc2UgcGFja2V0cyBhbmQgbGV0IExQUyBhd2FrZSBzb21lIHRpbWUgKi8KIAkJLyogIHRvIHByZXZlbnQgREhDUCBwcm90b2NvbCBmYWlsICovCiAJCXU4IHRtcFsyNF07CiAJCV9ydHdfcGt0ZmlsZV9yZWFkKCZwa3RmaWxlLCAmdG1wWzBdLCAyNCk7CiAJCXBhdHRyaWItPmRoY3BfcGt0ID0gMDsKIAkJaWYgKHBrdGZpbGUucGt0X2xlbiA+IDI4Mikgey8qIE1JTklNVU1fREhDUF9QQUNLRVRfU0laRSkgeyAqLwotCQkJaWYgKEVUSF9QX0lQID09IHBhdHRyaWItPmV0aGVyX3R5cGUpIHsvKiAgSVAgaGVhZGVyICovCisJCQlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9JUCkgey8qICBJUCBoZWFkZXIgKi8KIAkJCQlpZiAoKCh0bXBbMjFdID09IDY4KSAmJiAodG1wWzIzXSA9PSA2NykpIHx8CiAJCQkJICAgICgodG1wWzIxXSA9PSA2NykgJiYgKHRtcFsyM10gPT0gNjgpKSkgewogCQkJCQkvKiAgNjggOiBVRFAgQk9PVFAgY2xpZW50ICovCkBAIC00NzUsMTUgKzQ2OSwxNSBAQAogCQkJCX0KIAkJCX0KIAkJfQotCX0gZWxzZSBpZiAoMHg4ODhlID09IHBhdHRyaWItPmV0aGVyX3R5cGUpIHsKKwl9IGVsc2UgaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB7CiAJCURCR184OEVfTEVWRUwoX2Rydl9pbmZvXywgInNlbmQgZWFwb2wgcGFja2V0XG4iKTsKIAl9CiAKLQlpZiAoKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gMHg4ODhlKSB8fCAocGF0dHJpYi0+ZGhjcF9wa3QgPT0gMSkpCisJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX1BBRSkgfHwgKHBhdHRyaWItPmRoY3BfcGt0ID09IDEpKQogCQlydHdfc2V0X3NjYW5fZGVueShwYWRhcHRlciwgMzAwMCk7CiAKIAkvKiAgSWYgRUFQT0wgLCBBUlAgLCBPUiBESENQIHBhY2tldCwgZHJpdmVyIG11c3QgYmUgaW4gYWN0aXZlIG1vZGUuICovCi0JaWYgKChwYXR0cmliLT5ldGhlcl90eXBlID09IDB4MDgwNikgfHwgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gMHg4ODhlKSB8fCAocGF0dHJpYi0+ZGhjcF9wa3QgPT0gMSkpCisJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX0FSUCkgfHwgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB8fCAocGF0dHJpYi0+ZGhjcF9wa3QgPT0gMSkpCiAJCXJ0d19scHNfY3RybF93a19jbWQocGFkYXB0ZXIsIExQU19DVFJMX1NQRUNJQUxfUEFDS0VULCAxKTsKIAogCWJtY2FzdCA9IElTX01DQVNUKHBhdHRyaWItPnJhKTsKQEAgLTUxNSw4ICs1MDksNiBAQAogCX0KIAogCXBhdHRyaWItPmFja19wb2xpY3kgPSAwOwotCS8qICBnZXQgZXRoZXJfaGRyX2xlbiAqLwotCXBhdHRyaWItPnBrdF9oZHJsZW4gPSBFVEhfSExFTjsvKiBwYXR0cmliLT5ldGhlcl90eXBlID09IDB4ODEwMCkgPyAoMTQgKyA0KTogMTQ7IHZsYW4gdGFnICovCiAKIAlwYXR0cmliLT5oZHJsZW4gPSBXTEFOX0hEUl9BM19MRU47CiAJcGF0dHJpYi0+c3VidHlwZSA9IFdJRklfREFUQV9UWVBFOwpAQCAtNTM5LDggKzUzMSw4IEBACiAKIAkJcGF0dHJpYi0+ZW5jcnlwdCA9IDA7CiAKLQkJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlICE9IDB4ODg4ZSkgJiYgIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywgKCJcbnBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID09IHRydWUsICBwYXR0cmliLT5ldGhlcl90eXBlKCUuNHgpICE9IDB4ODg4ZVxuIiwgcGF0dHJpYi0+ZXRoZXJfdHlwZSkpOworCQlpZiAoKHBhdHRyaWItPmV0aGVyX3R5cGUgIT0gRVRIX1BfUEFFKSAmJiAhY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpKSB7CisJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLCAoIlxucHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0gdHJ1ZSwgIHBhdHRyaWItPmV0aGVyX3R5cGUoJS40eCkgIT0gRVRIX1BfUEFFXG4iLCBwYXR0cmliLT5ldGhlcl90eXBlKSk7CiAJCQlyZXMgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtNzY5LDEzICs3NjEsMTMgQEAKIHsKIAl1MTYgKnFjOwogCi0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICpwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKiloZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaGRyOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IHFvc19wcml2ICpwcW9zcHJpdiA9ICZwbWxtZXByaXYtPnFvc3ByaXY7CiAJdTggcW9zX29wdGlvbiA9IGZhbHNlOwogCiAJaW50IHJlcyA9IF9TVUNDRVNTOwotCV9fbGUxNiAqZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2N0bDsKKwlfX2xlMTYgKmZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCiAJc3RydWN0IHN0YV9pbmZvICpwc3RhOwogCkBAIC03ODUsMTEgKzc3NywxMCBAQAogCWlmIChwYXR0cmliLT5wc3RhKSB7CiAJCXBzdGEgPSBwYXR0cmliLT5wc3RhOwogCX0gZWxzZSB7Ci0JCWlmIChibWNzdCkgeworCQlpZiAoYm1jc3QpCiAJCQlwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8ocGFkYXB0ZXIpOwotCQl9IGVsc2UgeworCQllbHNlCiAJCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvKCZwYWRhcHRlci0+c3RhcHJpdiwgcGF0dHJpYi0+cmEpOwotCQl9CiAJfQogCiAJbWVtc2V0KGhkciwgMCwgV0xBTkhEUl9PRkZTRVQpOwpAQCAtOTk5LDcgKzk5MCw3IEBACiAJfQogCiAJX3J0d19vcGVuX3BrdGZpbGUocGt0LCAmcGt0ZmlsZSk7Ci0JX3J0d19wa3RmaWxlX3JlYWQoJnBrdGZpbGUsIE5VTEwsIHBhdHRyaWItPnBrdF9oZHJsZW4pOworCV9ydHdfcGt0ZmlsZV9yZWFkKCZwa3RmaWxlLCBOVUxMLCBFVEhfSExFTik7CiAKIAlmcmdfaW54ID0gMDsKIAlmcmdfbGVuID0gcHhtaXRwcml2LT5mcmFnX2xlbiAtIDQ7LyogMjM0Ni00ID0gMjM0MiAqLwpAQCAtMTA1NCw5ICsxMDQ1LDggQEAKIAkJCW1wZHVfbGVuIC09IGxsY19zejsKIAkJfQogCi0JCWlmICgocGF0dHJpYi0+aWN2X2xlbiA+IDApICYmIChwYXR0cmliLT5ic3dlbmMpKSB7CisJCWlmICgocGF0dHJpYi0+aWN2X2xlbiA+IDApICYmIChwYXR0cmliLT5ic3dlbmMpKQogCQkJbXBkdV9sZW4gLT0gcGF0dHJpYi0+aWN2X2xlbjsKLQkJfQogCiAJCWlmIChibWNzdCkgewogCQkJLyogIGRvbid0IGRvIGZyYWdtZW50IHRvIGJyb2FkY2F0L211bHRpY2FzdCBwYWNrZXRzICovCkBAIC0xNTYwLDExICsxNTUwLDEwIEBACiAJaW50IHJlcyA9IF9TVUNDRVNTOwogCiAKLQlpZiAocGF0dHJpYi0+cHN0YSkgeworCWlmIChwYXR0cmliLT5wc3RhKQogCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQl9IGVsc2UgeworCWVsc2UKIAkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbyhwc3RhcHJpdiwgcGF0dHJpYi0+cmEpOwotCX0KIAogCWlmIChwc3RhID09IE5VTEwpIHsKIAkJcmVzID0gX0ZBSUw7CkBAIC0xNjU4LDE2ICsxNjQ3LDYgQEAKIAlyZXR1cm4gYWRkcjsKIH0KIAotc3RhdGljIHZvaWQgZG9fcXVldWVfc2VsZWN0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIpCi17Ci0JdTggcXNlbDsKLQotCXFzZWwgPSBwYXR0cmliLT5wcmlvcml0eTsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgKCIjIyMgZG9fcXVldWVfc2VsZWN0IHByaW9yaXR5PSVkICwgcXNlbCA9ICVkXG4iLCBwYXR0cmliLT5wcmlvcml0eSwgcXNlbCkpOwotCi0JcGF0dHJpYi0+cXNlbCA9IHFzZWw7Ci19Ci0KIC8qCiAgKiBUaGUgbWFpbiB0cmFuc21pdCh0eCkgZW50cnkKICAqCkBAIC0xNzAwLDcgKzE2NzksNyBAQAogCiAJcnR3X2xlZF9jb250cm9sKHBhZGFwdGVyLCBMRURfQ1RMX1RYKTsKIAotCWRvX3F1ZXVlX3NlbGVjdChwYWRhcHRlciwgJnB4bWl0ZnJhbWUtPmF0dHJpYik7CisJcHhtaXRmcmFtZS0+YXR0cmliLnFzZWwgPSBweG1pdGZyYW1lLT5hdHRyaWIucHJpb3JpdHk7CiAKICNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCiAJc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvYmJfY2ZnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9iYl9jZmcuYwppbmRleCBjY2UxZWEyLi4xMzRmYTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9iYl9jZmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9iYl9jZmcuYwpAQCAtNDk4LDcgKzQ5OCw3IEBACiBzdGF0aWMgdm9pZCBzdG9yZV9wd3JpbmRleF9vZmZzZXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkJICB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssIHUzMiBkYXRhKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0ZXItPkhhbERhdGE7CiAJdTMyICogY29uc3QgcG93ZXJfbGV2ZWxfb2Zmc2V0ID0KIAkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF07CiAKQEAgLTUxOCw4ICs1MTgsNyBAQAogCQlwb3dlcl9sZXZlbF9vZmZzZXRbNF0gPSBkYXRhOwogCWlmIChyZWdhZGRyID09IHJUeEFHQ19BX01jczE1X01jczEyKSB7CiAJCXBvd2VyX2xldmVsX29mZnNldFs1XSA9IGRhdGE7Ci0JCWlmIChoYWxfZGF0YS0+cmZfdHlwZSA9PSBSRl8xVDFSKQotCQkJaGFsX2RhdGEtPnB3ckdyb3VwQ250Kys7CisJCWhhbF9kYXRhLT5wd3JHcm91cENudCsrOwogCX0KIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9SYXRlMThfMDYpCiAJCXBvd2VyX2xldmVsX29mZnNldFs4XSA9IGRhdGE7CkBAIC01MzcsOCArNTM2LDYgQEAKIAkJcG93ZXJfbGV2ZWxfb2Zmc2V0WzEyXSA9IGRhdGE7CiAJaWYgKHJlZ2FkZHIgPT0gclR4QUdDX0JfTWNzMTVfTWNzMTIpIHsKIAkJcG93ZXJfbGV2ZWxfb2Zmc2V0WzEzXSA9IGRhdGE7Ci0JCWlmIChoYWxfZGF0YS0+cmZfdHlwZSAhPSBSRl8xVDFSKQotCQkJaGFsX2RhdGEtPnB3ckdyb3VwQ250Kys7CiAJfQogfQogCkBAIC01ODgsMTEgKzU4NSwxMCBAQAogCiBzdGF0aWMgdm9pZCBydGw4OGVfcGh5X2luaXRfYmJfcmZfcmVnaXN0ZXJfZGVmaW5pdGlvbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJCSpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdGVyKTsKIAlzdHJ1Y3QgYmJfcmVnX2RlZiAgICAgICAgICAgICAgICpyZWdbNF07CiAKLQlyZWdbUkZfUEFUSF9BXSA9ICZoYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV07Ci0JcmVnW1JGX1BBVEhfQl0gPSAmaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdOworCXJlZ1tSRl9QQVRIX0FdID0gJmFkYXB0ZXItPkhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdOworCXJlZ1tSRl9QQVRIX0JdID0gJmFkYXB0ZXItPkhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdOwogCiAJcmVnW1JGX1BBVEhfQV0tPnJmaW50ZnMgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1c7CiAJcmVnW1JGX1BBVEhfQl0tPnJmaW50ZnMgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1c7CkBAIC02NTIsMTMgKzY0OCwxMiBAQAogc3RhdGljIGJvb2wgY29uZmlnX3BhcmFmaWxlKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKIAlzdHJ1Y3QgZWVwcm9tX3ByaXYgKmVlcHJvbSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihhZGFwdCk7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAKIAlzZXRfYmFzZWJhbmRfcGh5X2NvbmZpZyhhZGFwdCk7CiAKIAkvKiBJZiBFRVBST00gb3IgRUZVU0UgYXV0b2xvYWQgT0ssIFdlIG11c3QgY29uZmlnIGJ5IFBIWV9SRUdfUEcudHh0ICovCiAJaWYgKCFlZXByb20tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpIHsKLQkJaGFsX2RhdGEtPnB3ckdyb3VwQ250ID0gMDsKKwkJYWRhcHQtPkhhbERhdGEtPnB3ckdyb3VwQ250ID0gMDsKIAkJY29uZmlnX2JiX3dpdGhfcGdoZWFkZXIoYWRhcHQpOwogCX0KIAlzZXRfYmFzZWJhbmRfYWdjX2NvbmZpZyhhZGFwdCk7CkBAIC02NjgsNyArNjYzLDYgQEAKIGJvb2wgcnRsODhldV9waHlfYmJfY29uZmlnKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKIAlpbnQgcnRzdGF0dXMgPSB0cnVlOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXUzMiByZWd2YWw7CiAJdTggY3J5c3RhbF9jYXA7CiAKQEAgLTY4OCw3ICs2ODIsNyBAQAogCXJ0c3RhdHVzID0gY29uZmlnX3BhcmFmaWxlKGFkYXB0KTsKIAogCS8qICB3cml0ZSAweDI0WzE2OjExXSA9IDB4MjRbMjI6MTddID0gY3J5c3RhbF9jYXAgKi8KLQljcnlzdGFsX2NhcCA9IGhhbF9kYXRhLT5DcnlzdGFsQ2FwICYgMHgzRjsKKwljcnlzdGFsX2NhcCA9IGFkYXB0LT5IYWxEYXRhLT5DcnlzdGFsQ2FwICYgMHgzRjsKIAlwaHlfc2V0X2JiX3JlZyhhZGFwdCwgUkVHX0FGRV9YVEFMX0NUUkwsIDB4N2ZmODAwLAogCQkgICAgICAgKGNyeXN0YWxfY2FwIHwgKGNyeXN0YWxfY2FwIDw8IDYpKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2hhbF9pbnRmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9oYWxfaW50Zi5jCmluZGV4IDA4NWYwZmIuLmExMWM3YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2hhbF9pbnRmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvaGFsX2ludGYuYwpAQCAtMTcsNjIgKzE3LDYgQEAKICNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+CiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAjaW5jbHVkZSA8aGFsX2ludGYuaD4KLSNpbmNsdWRlIDx1c2JfaGFsLmg+Ci0KLXZvaWQgcnR3X2hhbF9jaGlwX2NvbmZpZ3VyZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmludGZfY2hpcF9jb25maWd1cmUpCi0JCWFkYXB0LT5IYWxGdW5jLmludGZfY2hpcF9jb25maWd1cmUoYWRhcHQpOwotfQotCi12b2lkIHJ0d19oYWxfcmVhZF9jaGlwX2luZm8oc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5yZWFkX2FkYXB0ZXJfaW5mbykKLQkJYWRhcHQtPkhhbEZ1bmMucmVhZF9hZGFwdGVyX2luZm8oYWRhcHQpOwotfQotCi12b2lkIHJ0d19oYWxfcmVhZF9jaGlwX3ZlcnNpb24oc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5yZWFkX2NoaXBfdmVyc2lvbikKLQkJYWRhcHQtPkhhbEZ1bmMucmVhZF9jaGlwX3ZlcnNpb24oYWRhcHQpOwotfQotCi12b2lkIHJ0d19oYWxfZGVmX3ZhbHVlX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5pbml0X2RlZmF1bHRfdmFsdWUpCi0JCWFkYXB0LT5IYWxGdW5jLmluaXRfZGVmYXVsdF92YWx1ZShhZGFwdCk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9mcmVlX2RhdGEoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5mcmVlX2hhbF9kYXRhKQotCQlhZGFwdC0+SGFsRnVuYy5mcmVlX2hhbF9kYXRhKGFkYXB0KTsKLX0KLQotdm9pZCBydHdfaGFsX2RtX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5kbV9pbml0KQotCQlhZGFwdC0+SGFsRnVuYy5kbV9pbml0KGFkYXB0KTsKLX0KLQotdm9pZCBydHdfaGFsX3N3X2xlZF9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuSW5pdFN3TGVkcykKLQkJYWRhcHQtPkhhbEZ1bmMuSW5pdFN3TGVkcyhhZGFwdCk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9zd19sZWRfZGVpbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuRGVJbml0U3dMZWRzKQotCQlhZGFwdC0+SGFsRnVuYy5EZUluaXRTd0xlZHMoYWRhcHQpOwotfQotCi11MzIgcnR3X2hhbF9wb3dlcl9vbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmhhbF9wb3dlcl9vbikKLQkJcmV0dXJuIGFkYXB0LT5IYWxGdW5jLmhhbF9wb3dlcl9vbihhZGFwdCk7Ci0JcmV0dXJuIF9GQUlMOwotfQogCiB1aW50CSBydHdfaGFsX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewpAQCAtODAsMTUgKzI0LDEzIEBACiAKIAlhZGFwdC0+aHdfaW5pdF9jb21wbGV0ZWQgPSBmYWxzZTsKIAotCXN0YXR1cyA9IGFkYXB0LT5IYWxGdW5jLmhhbF9pbml0KGFkYXB0KTsKKwlzdGF0dXMgPSBydGw4MTg4ZXVfaGFsX2luaXQoYWRhcHQpOwogCiAJaWYgKHN0YXR1cyA9PSBfU1VDQ0VTUykgewogCQlhZGFwdC0+aHdfaW5pdF9jb21wbGV0ZWQgPSB0cnVlOwogCiAJCWlmIChhZGFwdC0+cmVnaXN0cnlwcml2Lm5vdGNoX2ZpbHRlciA9PSAxKQogCQkJcnR3X2hhbF9ub3RjaF9maWx0ZXIoYWRhcHQsIDEpOwotCi0JCXJ0d19oYWxfcmVzZXRfc2VjdXJpdHlfZW5naW5lKGFkYXB0KTsKIAl9IGVsc2UgewogCQlhZGFwdC0+aHdfaW5pdF9jb21wbGV0ZWQgPSBmYWxzZTsKIAkJREJHXzg4RSgicnR3X2hhbF9pbml0OiBoYWxfX2luaXQgZmFpbFxuIik7CkBAIC0xMDQsNyArNDYsNyBAQAogewogCXVpbnQJc3RhdHVzID0gX1NVQ0NFU1M7CiAKLQlzdGF0dXMgPSBhZGFwdC0+SGFsRnVuYy5oYWxfZGVpbml0KGFkYXB0KTsKKwlzdGF0dXMgPSBydGw4MTg4ZXVfaGFsX2RlaW5pdChhZGFwdCk7CiAKIAlpZiAoc3RhdHVzID09IF9TVUNDRVNTKQogCQlhZGFwdC0+aHdfaW5pdF9jb21wbGV0ZWQgPSBmYWxzZTsKQEAgLTExNCw5MiArNTYsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgcnR3X2hhbF9zZXRfaHdyZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCB2YXJpYWJsZSwgdTggKnZhbCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuU2V0SHdSZWdIYW5kbGVyKQotCQlhZGFwdC0+SGFsRnVuYy5TZXRId1JlZ0hhbmRsZXIoYWRhcHQsIHZhcmlhYmxlLCB2YWwpOwotfQotCi12b2lkIHJ0d19oYWxfZ2V0X2h3cmVnKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggdmFyaWFibGUsIHU4ICp2YWwpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLkdldEh3UmVnSGFuZGxlcikKLQkJYWRhcHQtPkhhbEZ1bmMuR2V0SHdSZWdIYW5kbGVyKGFkYXB0LCB2YXJpYWJsZSwgdmFsKTsKLX0KLQotdTggcnR3X2hhbF9nZXRfZGVmX3ZhcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsCi0JCSAgICAgICBlbnVtIGhhbF9kZWZfdmFyaWFibGUgdmFyLCB2b2lkICp2YWwpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLkdldEhhbERlZlZhckhhbmRsZXIpCi0JCXJldHVybiBhZGFwdC0+SGFsRnVuYy5HZXRIYWxEZWZWYXJIYW5kbGVyKGFkYXB0LCB2YXIsIHZhbCk7Ci0JcmV0dXJuIF9GQUlMOwotfQotCi12b2lkIHJ0d19oYWxfc2V0X29kbV92YXIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LAotCQkJIGVudW0gaGFsX29kbV92YXJpYWJsZSB2YXIsIHZvaWQgKnZhbDEsCi0JCQkgYm9vbCBzZXQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLlNldEhhbE9ETVZhckhhbmRsZXIpCi0JCWFkYXB0LT5IYWxGdW5jLlNldEhhbE9ETVZhckhhbmRsZXIoYWRhcHQsIHZhciwKLQkJCQkJCSAgICAgIHZhbDEsIHNldCk7Ci19Ci0KLXUzMiBydHdfaGFsX2luaXJwX2luaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCXUzMiByc3QgPSBfRkFJTDsKLQotCWlmIChhZGFwdC0+SGFsRnVuYy5pbmlycF9pbml0KQotCQlyc3QgPSBhZGFwdC0+SGFsRnVuYy5pbmlycF9pbml0KGFkYXB0KTsKLQllbHNlCi0JCURCR184OEUoIiAlcyBIYWxGdW5jLmluaXJwX2luaXQgaXMgTlVMTCEhIVxuIiwgX19mdW5jX18pOwotCXJldHVybiByc3Q7Ci19Ci0KLXUzMiBydHdfaGFsX2luaXJwX2RlaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmluaXJwX2RlaW5pdCkKLQkJcmV0dXJuIGFkYXB0LT5IYWxGdW5jLmluaXJwX2RlaW5pdChhZGFwdCk7Ci0KLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXMzMiBydHdfaGFsX3htaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuaGFsX3htaXQpCi0JCXJldHVybiBhZGFwdC0+SGFsRnVuYy5oYWxfeG1pdChhZGFwdCwgcHhtaXRmcmFtZSk7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXMzMiBydHdfaGFsX21nbnRfeG1pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKQotewotCXMzMiByZXQgPSBfRkFJTDsKLQotCWlmIChhZGFwdC0+SGFsRnVuYy5tZ250X3htaXQpCi0JCXJldCA9IGFkYXB0LT5IYWxGdW5jLm1nbnRfeG1pdChhZGFwdCwgcG1nbnRmcmFtZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotczMyIHJ0d19oYWxfaW5pdF94bWl0X3ByaXYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5pbml0X3htaXRfcHJpdikKLQkJcmV0dXJuIGFkYXB0LT5IYWxGdW5jLmluaXRfeG1pdF9wcml2KGFkYXB0KTsKLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXMzMiBydHdfaGFsX2luaXRfcmVjdl9wcml2KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuaW5pdF9yZWN2X3ByaXYpCi0JCXJldHVybiBhZGFwdC0+SGFsRnVuYy5pbml0X3JlY3ZfcHJpdihhZGFwdCk7Ci0KLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXZvaWQgcnR3X2hhbF9mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmZyZWVfcmVjdl9wcml2KQotCQlhZGFwdC0+SGFsRnVuYy5mcmVlX3JlY3ZfcHJpdihhZGFwdCk7Ci19Ci0KIHZvaWQgcnR3X2hhbF91cGRhdGVfcmFfbWFzayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHUzMiBtYWNfaWQsIHU4IHJzc2lfbGV2ZWwpCiB7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJihhZGFwdC0+bWxtZXByaXYpOwpAQCAtMjE1LDg2ICs3MSw2IEBACiAJCQlhZGRfUkFUaWQoYWRhcHQsIHBzdGEsIDApOy8qIHRvZG86IGJhc2VkIG9uIHJzc2lfbGV2ZWwqLwogI2VuZGlmCiAJfSBlbHNlIHsKLQkJaWYgKGFkYXB0LT5IYWxGdW5jLlVwZGF0ZVJBTWFza0hhbmRsZXIpCi0JCQlhZGFwdC0+SGFsRnVuYy5VcGRhdGVSQU1hc2tIYW5kbGVyKGFkYXB0LCBtYWNfaWQsCi0JCQkJCQkJICAgICAgcnNzaV9sZXZlbCk7CisJCVVwZGF0ZUhhbFJBTWFzazgxODhFVXNiKGFkYXB0LCBtYWNfaWQsIHJzc2lfbGV2ZWwpOwogCX0KIH0KLQotdm9pZCBydHdfaGFsX2FkZF9yYV90aWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1MzIgYml0bWFwLCB1OCBhcmcsCi0JCQl1OCByc3NpX2xldmVsKQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5BZGRfUmF0ZUFUaWQpCi0JCWFkYXB0LT5IYWxGdW5jLkFkZF9SYXRlQVRpZChhZGFwdCwgYml0bWFwLCBhcmcsCi0JCQkJCSAgICAgICByc3NpX2xldmVsKTsKLX0KLQotdTMyIHJ0d19oYWxfcmVhZF9yZnJlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGVudW0gcmZfcmFkaW9fcGF0aCByZnBhdGgsCi0JCSAgICAgICB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2spCi17Ci0JdTMyIGRhdGEgPSAwOwotCi0JaWYgKGFkYXB0LT5IYWxGdW5jLnJlYWRfcmZyZWcpCi0JCWRhdGEgPSBhZGFwdC0+SGFsRnVuYy5yZWFkX3JmcmVnKGFkYXB0LCByZnBhdGgsIHJlZ2FkZHIsCi0JCQkJCQkgICAgYml0bWFzayk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXZvaWQgcnR3X2hhbF9zZXRfYndtb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwKLQkJCWVudW0gaHRfY2hhbm5lbF93aWR0aCBiYW5kd2lkdGgsIHU4IG9mZnNldCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuc2V0X2J3bW9kZV9oYW5kbGVyKQotCQlhZGFwdC0+SGFsRnVuYy5zZXRfYndtb2RlX2hhbmRsZXIoYWRhcHQsIGJhbmR3aWR0aCwKLQkJCQkJCSAgICAgb2Zmc2V0KTsKLX0KLQotdm9pZCBydHdfaGFsX3NldF9jaGFuKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggY2hhbm5lbCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuc2V0X2NoYW5uZWxfaGFuZGxlcikKLQkJYWRhcHQtPkhhbEZ1bmMuc2V0X2NoYW5uZWxfaGFuZGxlcihhZGFwdCwgY2hhbm5lbCk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9kbV93YXRjaGRvZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLmhhbF9kbV93YXRjaGRvZykKLQkJYWRhcHQtPkhhbEZ1bmMuaGFsX2RtX3dhdGNoZG9nKGFkYXB0KTsKLX0KLQotdm9pZCBydHdfaGFsX2Jjbl9yZWxhdGVkX3JlZ19zZXR0aW5nKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuU2V0QmVhY29uUmVsYXRlZFJlZ2lzdGVyc0hhbmRsZXIpCi0JCWFkYXB0LT5IYWxGdW5jLlNldEJlYWNvblJlbGF0ZWRSZWdpc3RlcnNIYW5kbGVyKGFkYXB0KTsKLX0KLQotdTggcnR3X2hhbF9hbnRkaXZfYmVmb3JlX2xpbmtlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0JaWYgKGFkYXB0LT5IYWxGdW5jLkFudERpdkJlZm9yZUxpbmtIYW5kbGVyKQotCQlyZXR1cm4gYWRhcHQtPkhhbEZ1bmMuQW50RGl2QmVmb3JlTGlua0hhbmRsZXIoYWRhcHQpOwotCXJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBydHdfaGFsX2FudGRpdl9yc3NpX2NvbXBhcmVkKHN0cnVjdCBhZGFwdGVyICphZGFwdCwKLQkJCQkgIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpkc3QsCi0JCQkJICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqc3JjKQotewotCWlmIChhZGFwdC0+SGFsRnVuYy5BbnREaXZDb21wYXJlSGFuZGxlcikKLQkJYWRhcHQtPkhhbEZ1bmMuQW50RGl2Q29tcGFyZUhhbmRsZXIoYWRhcHQsIGRzdCwgc3JjKTsKLX0KLQotdm9pZCBydHdfaGFsX3NyZXNldF9pbml0KHN0cnVjdCBhZGFwdGVyICphZGFwdCkKLXsKLQlpZiAoYWRhcHQtPkhhbEZ1bmMuc3Jlc2V0X2luaXRfdmFsdWUpCi0JCWFkYXB0LT5IYWxGdW5jLnNyZXNldF9pbml0X3ZhbHVlKGFkYXB0KTsKLX0KLQotdm9pZCBydHdfaGFsX25vdGNoX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgYm9vbCBlbmFibGUpCi17Ci0JaWYgKGFkYXB0ZXItPkhhbEZ1bmMuaGFsX25vdGNoX2ZpbHRlcikKLQkJYWRhcHRlci0+SGFsRnVuYy5oYWxfbm90Y2hfZmlsdGVyKGFkYXB0ZXIsIGVuYWJsZSk7Ci19Ci0KLXZvaWQgcnR3X2hhbF9yZXNldF9zZWN1cml0eV9lbmdpbmUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKGFkYXB0ZXItPkhhbEZ1bmMuaGFsX3Jlc2V0X3NlY3VyaXR5X2VuZ2luZSkKLQkJYWRhcHRlci0+SGFsRnVuYy5oYWxfcmVzZXRfc2VjdXJpdHlfZW5naW5lKGFkYXB0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYwppbmRleCA1N2ExMjc1Li5kOTgzYTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYwpAQCAtMjI2LDE1MCArMjI2LDYgQEAKIAlvZG1fRWRjYVR1cmJvQ2hlY2socERNX09kbSk7CiB9CiAKLS8qICBJbml0IC8uLiBGaXhlZCBIVyB2YWx1ZS4gT25seSBpbml0IHRpbWUuICovCi12b2lkIE9ETV9DbW5JbmZvSW5pdChzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgZW51bSBvZG1fY29tbW9uX2luZm9fZGVmIENtbkluZm8sIHUzMiBWYWx1ZSkKLXsKLQkvKiAgVGhpcyBzZWN0aW9uIGlzIHVzZWQgZm9yIGluaXQgdmFsdWUgKi8KLQlzd2l0Y2gJKENtbkluZm8pIHsKLQkvKiAgRml4ZWQgT0RNIHZhbHVlLiAqLwotCWNhc2UJT0RNX0NNTklORk9fQUJJTElUWToKLQkJcERNX09kbS0+U3VwcG9ydEFiaWxpdHkgPSAodTMyKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1BMQVRGT1JNOgotCQlwRE1fT2RtLT5TdXBwb3J0UGxhdGZvcm0gPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fSU5URVJGQUNFOgotCQlwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX01QX1RFU1RfQ0hJUDoKLQkJcERNX09kbS0+YklzTVBDaGlwID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0lDX1RZUEU6Ci0JCXBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgPSBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19DVVRfVkVSOgotCQlwRE1fT2RtLT5DdXRWZXJzaW9uID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JGX1RZUEU6Ci0JCXBETV9PZG0tPlJGVHlwZSA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZSAgICBPRE1fQ01OSU5GT19SRl9BTlRFTk5BX1RZUEU6Ci0JCXBETV9PZG0tPkFudERpdlR5cGUgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQk9BUkRfVFlQRToKLQkJcERNX09kbS0+Qm9hcmRUeXBlID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0VYVF9MTkE6Ci0JCXBETV9PZG0tPkV4dExOQSA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19FWFRfUEE6Ci0JCXBETV9PZG0tPkV4dFBBID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0VYVF9UUlNXOgotCQlwRE1fT2RtLT5FeHRUUlNXID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1BBVENIX0lEOgotCQlwRE1fT2RtLT5QYXRjaElEID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0JJTkhDVF9URVNUOgotCQlwRE1fT2RtLT5iSW5IY3RUZXN0ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQldJRklfVEVTVDoKLQkJcERNX09kbS0+YldJRklUZXN0ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fU01BUlRfQ09OQ1VSUkVOVDoKLQkJcERNX09kbS0+YkR1YWxNYWNTbWFydENvbmN1cnJlbnQgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JLyogVG8gcmVtb3ZlIHRoZSBjb21waWxlciB3YXJuaW5nLCBtdXN0IGFkZCBhbiBlbXB0eSBkZWZhdWx0IHN0YXRlbWVudCB0byBoYW5kbGUgdGhlIG90aGVyIHZhbHVlcy4gKi8KLQlkZWZhdWx0OgotCQkvKiBkbyBub3RoaW5nICovCi0JCWJyZWFrOwotCX0KLQotCS8qICBUeCBwb3dlciB0cmFja2luZyBCQiBzd2luZyB0YWJsZS4gKi8KLQkvKiAgVGhlIGJhc2UgaW5kZXggPSAxMi4gKygoMTItbikvMilkQiAxM34/PyA9IGRlY3JlYXNlIHR4IHB3ciBieSAtKChuLTEyKS8yKWRCICovCi0JcERNX09kbS0+QmJTd2luZ0lkeE9mZG0JCQk9IDEyOyAvKiAgU2V0IGRlZmFsdXQgdmFsdWUgYXMgaW5kZXggMTIuICovCi0JcERNX09kbS0+QmJTd2luZ0lkeE9mZG1DdXJyZW50CT0gMTI7Ci0JcERNX09kbS0+QmJTd2luZ0ZsYWdPZmRtCQk9IGZhbHNlOwotfQotCi12b2lkIE9ETV9DbW5JbmZvSG9vayhzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSwgZW51bSBvZG1fY29tbW9uX2luZm9fZGVmIENtbkluZm8sIHZvaWQgKnBWYWx1ZSkKLXsKLQkvKiAgKi8KLQkvKiAgSG9vayBjYWxsIGJ5IHJlZmVyZW5jZSBwb2ludGVyLiAqLwotCS8qICAqLwotCXN3aXRjaAkoQ21uSW5mbykgewotCS8qICBEeW5hbWljIGNhbGwgYnkgcmVmZXJlbmNlIHBvaW50ZXIuICovCi0JY2FzZQlPRE1fQ01OSU5GT19NQUNfUEhZX01PREU6Ci0JCXBETV9PZG0tPnBNYWNQaHlNb2RlID0gKHU4ICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1RYX1VOSToKLQkJcERNX09kbS0+cE51bVR4Qnl0ZXNVbmljYXN0ID0gKHU2NCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19SWF9VTkk6Ci0JCXBETV9PZG0tPnBOdW1SeEJ5dGVzVW5pY2FzdCA9ICh1NjQgKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fV01fTU9ERToKLQkJcERNX09kbS0+cFdpcmVsZXNzTW9kZSA9ICh1OCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19CQU5EOgotCQlwRE1fT2RtLT5wQmFuZFR5cGUgPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fU0VDX0NITkxfT0ZGU0VUOgotCQlwRE1fT2RtLT5wU2VjQ2hPZmZzZXQgPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fU0VDX01PREU6Ci0JCXBETV9PZG0tPnBTZWN1cml0eSA9ICh1OCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19CVzoKLQkJcERNX09kbS0+cEJhbmRXaWR0aCA9ICh1OCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19DSE5MOgotCQlwRE1fT2RtLT5wQ2hhbm5lbCA9ICh1OCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19ETVNQX0dFVF9WQUxVRToKLQkJcERNX09kbS0+cGJHZXRWYWx1ZUZyb21PdGhlck1hYyA9IChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0JVRERZX0FEQVBUT1I6Ci0JCXBETV9PZG0tPnBCdWRkeUFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKiopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0RNU1BfSVNfTUFTVEVSOgotCQlwRE1fT2RtLT5wYk1hc3Rlck9mRE1TUCA9IChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1NDQU46Ci0JCXBETV9PZG0tPnBiU2NhbkluUHJvY2VzcyA9IChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1BPV0VSX1NBVklORzoKLQkJcERNX09kbS0+cGJQb3dlclNhdmluZyA9IChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX09ORV9QQVRIX0NDQToKLQkJcERNX09kbS0+cE9uZVBhdGhDQ0EgPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fRFJWX1NUT1A6Ci0JCXBETV9PZG0tPnBiRHJpdmVyU3RvcHBlZCA9ICAoYm9vbCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19QTlBfSU46Ci0JCXBETV9PZG0tPnBiRHJpdmVySXNHb2luZ1RvUG5wU2V0UG93ZXJTbGVlcCA9ICAoYm9vbCAqKXBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19JTklUX09OOgotCQlwRE1fT2RtLT5waW5pdF9hZHB0X2luX3Byb2dyZXNzID0gIChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0FOVF9URVNUOgotCQlwRE1fT2RtLT5wQW50ZW5uYVRlc3QgPSAgKHU4ICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX05FVF9DTE9TRUQ6Ci0JCXBETV9PZG0tPnBiTmV0X2Nsb3NlZCA9IChib29sICopcFZhbHVlOwotCQlicmVhazsKLQljYXNlICAgIE9ETV9DTU5JTkZPX01QX01PREU6Ci0JCXBETV9PZG0tPm1wX21vZGUgPSAodTggKilwVmFsdWU7Ci0JCWJyZWFrOwotCS8qIFRvIHJlbW92ZSB0aGUgY29tcGlsZXIgd2FybmluZywgbXVzdCBhZGQgYW4gZW1wdHkgZGVmYXVsdCBzdGF0ZW1lbnQgdG8gaGFuZGxlIHRoZSBvdGhlciB2YWx1ZXMuICovCi0JZGVmYXVsdDoKLQkJLyogZG8gbm90aGluZyAqLwotCQlicmVhazsKLQl9Ci19Ci0KIHZvaWQgT0RNX0NtbkluZm9QdHJBcnJheUhvb2soc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0sIGVudW0gb2RtX2NvbW1vbl9pbmZvX2RlZiBDbW5JbmZvLCB1MTYgSW5kZXgsIHZvaWQgKnBWYWx1ZSkKIHsKIAkvKiAgSG9vayBjYWxsIGJ5IHJlZmVyZW5jZSBwb2ludGVyLiAqLwpAQCAtMzg1LDQ2ICsyNDEsNiBAQAogCX0KIH0KIAotLyogIFVwZGF0ZSBCYW5kL0NIYW5uZWwvLi4gVGhlIHZhbHVlcyBhcmUgZHluYW1pYyBidXQgbm9uLXBlci1wYWNrZXQuICovCi12b2lkIE9ETV9DbW5JbmZvVXBkYXRlKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtLCB1MzIgQ21uSW5mbywgdTY0IFZhbHVlKQotewotCS8qICAqLwotCS8qICBUaGlzIGluaXQgdmFyaWFibGUgbWF5IGJlIGNoYW5nZWQgaW4gcnVuIHRpbWUuICovCi0JLyogICovCi0Jc3dpdGNoCShDbW5JbmZvKSB7Ci0JY2FzZQlPRE1fQ01OSU5GT19BQklMSVRZOgotCQlwRE1fT2RtLT5TdXBwb3J0QWJpbGl0eSA9ICh1MzIpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fUkZfVFlQRToKLQkJcERNX09kbS0+UkZUeXBlID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1dJRklfRElSRUNUOgotCQlwRE1fT2RtLT5iV0lGSV9EaXJlY3QgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19XSUZJX0RJU1BMQVk6Ci0JCXBETV9PZG0tPmJXSUZJX0Rpc3BsYXkgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19MSU5LOgotCQlwRE1fT2RtLT5iTGlua2VkID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fUlNTSV9NSU46Ci0JCXBETV9PZG0tPlJTU0lfTWluID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0RCR19DT01QOgotCQlwRE1fT2RtLT5EZWJ1Z0NvbXBvbmVudHMgPSBWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19EQkdfTEVWRUw6Ci0JCXBETV9PZG0tPkRlYnVnTGV2ZWwgPSAodTMyKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JBX1RIUkVTSE9MRF9ISUdIOgotCQlwRE1fT2RtLT5SYXRlQWRhcHRpdmUuSGlnaFJTU0lUaHJlc2ggPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fUkFfVEhSRVNIT0xEX0xPVzoKLQkJcERNX09kbS0+UmF0ZUFkYXB0aXZlLkxvd1JTU0lUaHJlc2ggPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCX0KLX0KLQogdm9pZCBvZG1fQ29tbW9uSW5mb1NlbGZJbml0KHN0cnVjdCBvZG1fZG1fc3RydWN0ICpwRE1fT2RtKQogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKQEAgLTQ2OSw3ICsyODUsNiBAQAogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJTdXBwb3J0SW50ZXJmYWNlPSVkXG4iLCBwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIlN1cHBvcnRJQ1R5cGU9MHgleFxuIiwgcERNX09kbS0+U3VwcG9ydElDVHlwZSkpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJDdXRWZXJzaW9uPSVkXG4iLCBwRE1fT2RtLT5DdXRWZXJzaW9uKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIlJGVHlwZT0lZFxuIiwgcERNX09kbS0+UkZUeXBlKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkJvYXJkVHlwZT0lZFxuIiwgcERNX09kbS0+Qm9hcmRUeXBlKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkV4dExOQT0lZFxuIiwgcERNX09kbS0+RXh0TE5BKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkV4dFBBPSVkXG4iLCBwRE1fT2RtLT5FeHRQQSkpOwpAQCAtOTQ3LDM3ICs3NjIsMjEgQEAKIAkJYnJlYWs7CiAJY2FzZSAoT0RNX1dNX0J8T0RNX1dNX0d8T0RNX1dNX04yNEcpOgogCWNhc2UgKE9ETV9XTV9BfE9ETV9XTV9CfE9ETV9XTV9HfE9ETV9XTV9OMjRHKToKLQkJaWYgKHBETV9PZG0tPlJGVHlwZSA9PSBPRE1fMVQyUiB8fCBwRE1fT2RtLT5SRlR5cGUgPT0gT0RNXzFUMVIpIHsKLQkJCWlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX0hJR0gpIHsKLQkJCQlyYXRlX2JpdG1hcCA9IDB4MDAwZjAwMDA7Ci0JCQl9IGVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfTUlERExFKSB7Ci0JCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmMDAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoKihwRE1fT2RtLT5wQmFuZFdpZHRoKSA9PSBPRE1fQlc0ME0pCi0JCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZjAxNTsKLQkJCQllbHNlCi0JCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZjAwNTsKLQkJCX0KKwkJaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfSElHSCkgeworCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGYwMDAwOworCQl9IGVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfTUlERExFKSB7CisJCQlyYXRlX2JpdG1hcCA9IDB4MDAwZmYwMDA7CiAJCX0gZWxzZSB7Ci0JCQlpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9ISUdIKSB7Ci0JCQkJcmF0ZV9iaXRtYXAgPSAweDBmOGYwMDAwOwotCQkJfSBlbHNlIGlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX01JRERMRSkgewotCQkJCXJhdGVfYml0bWFwID0gMHgwZjhmZjAwMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCoocERNX09kbS0+cEJhbmRXaWR0aCkgPT0gT0RNX0JXNDBNKQotCQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZmYwMTU7Ci0JCQkJZWxzZQotCQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZmYwMDU7Ci0JCQl9CisJCQlpZiAoKihwRE1fT2RtLT5wQmFuZFdpZHRoKSA9PSBPRE1fQlc0ME0pCisJCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmMDE1OworCQkJZWxzZQorCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmZjAwNTsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiBjYXNlIFdJUkVMRVNTXzExXzI0TjogKi8KIAkJLyogY2FzZSBXSVJFTEVTU18xMV81TjogKi8KLQkJaWYgKHBETV9PZG0tPlJGVHlwZSA9PSBSRl8xVDJSKQotCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmZmZmOwotCQllbHNlCi0JCQlyYXRlX2JpdG1hcCA9IDB4MGZmZmZmZmY7CisJCXJhdGVfYml0bWFwID0gMHgwZmZmZmZmZjsKIAkJYnJlYWs7CiAJfQogCkBAIC0xMDk2LDggKzg5NSw3IEBACiB2b2lkIG9kbV9EeW5hbWljVHhQb3dlckluaXQoc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBETV9PZG0pCiB7CiAJc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKKwlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZBZGFwdGVyLT5IYWxEYXRhLT5kbXByaXY7CiAJcGRtcHJpdi0+YkR5bmFtaWNUeFBvd2VyRW5hYmxlID0gZmFsc2U7CiAJcGRtcHJpdi0+TGFzdERUUEx2bCA9IFR4SGlnaFB3ckxldmVsX05vcm1hbDsKIAlwZG1wcml2LT5EeW5hbWljVHhIaWdoUG93ZXJMdmwgPSBUeEhpZ2hQd3JMZXZlbF9Ob3JtYWw7CkBAIC0xMTIyLDggKzkyMCw3IEBACiAKIHN0YXRpYyB2b2lkIEZpbmRNaW5pbXVtUlNTSShzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKKwlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZwQWRhcHRlci0+SGFsRGF0YS0+ZG1wcml2OwogCiAJLyogMSAxLlVuY29uZGl0aW9uYWxseSBzZXQgUlNTSSAqLwogCXBkbXByaXYtPk1pblVuZGVjb3JhdGVkUFdEQkZvckRNID0gcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKQEAgLTExMzIsOCArOTI5LDcgQEAKIHZvaWQgb2RtX1JTU0lNb25pdG9yQ2hlY2tDRShzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcERNX09kbSkKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OworCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJkFkYXB0ZXItPkhhbERhdGEtPmRtcHJpdjsKIAlpbnQJaTsKIAlpbnQJdG1wRW50cnlNYXhQV0RCID0gMCwgdG1wRW50cnlNaW5QV0RCID0gMHhmZjsKIAl1OAlzdGFfY250ID0gMDsKQEAgLTExNjIsNyArOTU4LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBzdGFfY250OyBpKyspIHsKIAkJaWYgKFBXREJfcnNzaVtpXSAhPSAwKSB7Ci0JCQlPRE1fUkFfU2V0UlNTSV84MTg4RSgmcEhhbERhdGEtPm9kbXByaXYsCisJCQlPRE1fUkFfU2V0UlNTSV84MTg4RSgmQWRhcHRlci0+SGFsRGF0YS0+b2RtcHJpdiwKIAkJCQkJICAgICBQV0RCX3Jzc2lbaV0gJiAweEZGLAogCQkJCQkgICAgIChQV0RCX3Jzc2lbaV0gPj4gMTYpICYgMHhGRik7CiAJCX0KQEAgLTExNzksOCArOTc1LDcgQEAKIAkJcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDA7CiAKIAlGaW5kTWluaW11bVJTU0koQWRhcHRlcik7Ci0JT0RNX0NtbkluZm9VcGRhdGUoJnBIYWxEYXRhLT5vZG1wcml2LCBPRE1fQ01OSU5GT19SU1NJX01JTiwKLQkJCSAgcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0pOworCUFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXYuUlNTSV9NaW4gPSBwZG1wcml2LT5NaW5VbmRlY29yYXRlZFBXREJGb3JETTsKIH0KIAogLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtMTI5MCw3ICsxMDg1LDYgQEAKIAl1NjQJY3VyX3R4X2J5dGVzID0gMDsKIAl1NjQJY3VyX3J4X2J5dGVzID0gMDsKIAl1OAliYnRjaGFuZ2UgPSBmYWxzZTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKIAlzdHJ1Y3QgeG1pdF9wcml2CQkqcHhtaXRwcml2ID0gJihBZGFwdGVyLT54bWl0cHJpdik7CiAJc3RydWN0IHJlY3ZfcHJpdgkJKnByZWN2cHJpdiA9ICYoQWRhcHRlci0+cmVjdnByaXYpOwogCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7CkBAIC0xMzQ0LDcgKzExMzgsOCBAQAogCQkvKiAgVHVybiBPZmYgRURDQSB0dXJibyBoZXJlLiAqLwogCQkvKiAgUmVzdG9yZSBvcmlnaW5hbCBFRENBIGFjY29yZGluZyB0byB0aGUgZGVjbGFyYXRpb24gb2YgQVAuICovCiAJCSBpZiAocERNX09kbS0+RE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSkgewotCQkJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX0VEQ0FfQkVfUEFSQU0sIHBIYWxEYXRhLT5BY1BhcmFtX0JFKTsKKwkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19FRENBX0JFX1BBUkFNLAorCQkJCSAgICBBZGFwdGVyLT5IYWxEYXRhLT5BY1BhcmFtX0JFKTsKIAkJCXBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EgPSBmYWxzZTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcGh5LmMKaW5kZXggYTgzYmJlYTkuLjUxOTJlZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3BoeS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3BoeS5jCkBAIC02NSw4ICs2NSw3IEBACiAJCQllbnVtIHJmX3JhZGlvX3BhdGggcmZwYXRoLCB1MzIgb2Zmc2V0KQogewogCXUzMiByZXQgPSAwOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCXN0cnVjdCBiYl9yZWdfZGVmICpwaHlyZWcgPSAmaGFsX2RhdGEtPlBIWVJlZ0RlZltyZnBhdGhdOworCXN0cnVjdCBiYl9yZWdfZGVmICpwaHlyZWcgPSAmYWRhcHQtPkhhbERhdGEtPlBIWVJlZ0RlZltyZnBhdGhdOwogCXUzMiB0bXBsb25nLCB0bXBsb25nMjsKIAl1OCByZnBpX2VuYWJsZSA9IDA7CiAKQEAgLTExMCwxNSArMTA5LDE0IEBACiAJCQkgICAgdTMyIGRhdGEpCiB7CiAJdTMyIGRhdGFfYW5kX2FkZHIgPSAwOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCXN0cnVjdCBiYl9yZWdfZGVmICpwaHlyZWcgPSAmaGFsX2RhdGEtPlBIWVJlZ0RlZltyZnBhdGhdOworCXN0cnVjdCBiYl9yZWdfZGVmICpwaHlyZWcgPSAmYWRhcHQtPkhhbERhdGEtPlBIWVJlZ0RlZltyZnBhdGhdOwogCiAJb2Zmc2V0ICY9IDB4ZmY7CiAJZGF0YV9hbmRfYWRkciA9ICgob2Zmc2V0PDwyMCkgfCAoZGF0YSYweDAwMGZmZmZmKSkgJiAweDBmZmZmZmZmOwogCXBoeV9zZXRfYmJfcmVnKGFkYXB0LCBwaHlyZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIGRhdGFfYW5kX2FkZHIpOwogfQogCi11MzIgcGh5X3F1ZXJ5X3JmX3JlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGVudW0gcmZfcmFkaW9fcGF0aCByZl9wYXRoLAordTMyIHJ0d19oYWxfcmVhZF9yZnJlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGVudW0gcmZfcmFkaW9fcGF0aCByZl9wYXRoLAogCQkgICAgIHUzMiByZWdfYWRkciwgdTMyIGJpdF9tYXNrKQogewogCXUzMiBvcmlnaW5hbF92YWx1ZSwgcmVhZGJhY2tfdmFsdWUsIGJpdF9zaGlmdDsKQEAgLTE0NywxNCArMTQ1LDExIEBACiBzdGF0aWMgdm9pZCBnZXRfdHhfcG93ZXJfaW5kZXgoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCBjaGFubmVsLCB1OCAqY2NrX3B3ciwKIAkJCSAgICAgICB1OCAqb2ZkbV9wd3IsIHU4ICpidzIwX3B3ciwgdTggKmJ3NDBfcHdyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAl1OCBpbmRleCA9IChjaGFubmVsIC0gMSk7CiAJdTggVHhDb3VudCA9IDAsIHBhdGhfbnVtczsKIAotCWlmICgoUkZfMVQyUiA9PSBoYWxfZGF0YS0+cmZfdHlwZSkgfHwgKFJGXzFUMVIgPT0gaGFsX2RhdGEtPnJmX3R5cGUpKQotCQlwYXRoX251bXMgPSAxOwotCWVsc2UKLQkJcGF0aF9udW1zID0gMjsKKwlwYXRoX251bXMgPSAxOwogCiAJZm9yIChUeENvdW50ID0gMDsgVHhDb3VudCA8IHBhdGhfbnVtczsgVHhDb3VudCsrKSB7CiAJCWlmIChUeENvdW50ID09IFJGX1BBVEhfQSkgewpAQCAtMTgzLDcgKzE3OCw3IEBACiAJCQkJICB1OCAqY2NrX3B3ciwgdTggKm9mZG1fcHdyLCB1OCAqYncyMF9wd3IsCiAJCQkJICB1OCAqYnc0MF9wd3IpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCiAJaGFsX2RhdGEtPkN1cnJlbnRDY2tUeFB3cklkeCA9IGNja19wd3JbMF07CiAJaGFsX2RhdGEtPkN1cnJlbnRPZmRtMjRHVHhQd3JJZHggPSBvZmRtX3B3clswXTsKQEAgLTIxMSw3ICsyMDYsNyBAQAogCiBzdGF0aWMgdm9pZCBwaHlfc2V0X2J3X21vZGVfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAl1OCByZWdfYndfb3Btb2RlOwogCXU4IHJlZ19wcnNyX3JzYzsKIApAQCAtMjc0LDEwICsyNjksMTAgQEAKIAkJcnRsODhldV9waHlfcmY2MDUyX3NldF9iYW5kd2lkdGgoYWRhcHQsIGhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbEJXKTsKIH0KIAotdm9pZCBwaHlfc2V0X2J3X21vZGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBlbnVtIGh0X2NoYW5uZWxfd2lkdGggYmFuZHdpZHRoLAordm9pZCBydHdfaGFsX3NldF9id21vZGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBlbnVtIGh0X2NoYW5uZWxfd2lkdGggYmFuZHdpZHRoLAogCQkgICAgIHVuc2lnbmVkIGNoYXIgb2Zmc2V0KQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAllbnVtIGh0X2NoYW5uZWxfd2lkdGggdG1wX2J3ID0gaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsQlc7CiAKIAloYWxfZGF0YS0+Q3VycmVudENoYW5uZWxCVyA9IGJhbmR3aWR0aDsKQEAgLTI5MywxMCArMjg4LDcgQEAKIHsKIAl1OCByZl9wYXRoOwogCXUzMiBwYXJhbTEsIHBhcmFtMjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQotCWlmIChhZGFwdC0+Yk5vdGlmeUNoYW5uZWxDaGFuZ2UpCi0JCURCR184OEUoIlslc10gY2ggPSAlZFxuIiwgX19mdW5jX18sIGNoYW5uZWwpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAogCXBoeV9zZXRfdHhfcG93ZXJfbGV2ZWwoYWRhcHQsIGNoYW5uZWwpOwogCkBAIC0zMTAsOSArMzAyLDkgQEAKIAl9CiB9CiAKLXZvaWQgcGh5X3N3X2Nobmwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCBjaGFubmVsKQordm9pZCBydHdfaGFsX3NldF9jaGFuKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggY2hhbm5lbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJdTggdG1wY2hhbm5lbCA9IGhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbDsKIAogCWlmIChoYWxfZGF0YS0+cmZfY2hpcCA9PSBSRl9QU0VVRE9fMTFOKQpAQCAtNDA3LDcgKzM5OSw3IEBACiAKIHZvaWQgcnRsODhldV9kbV90eHBvd2VyX3RyYWNraW5nX2NhbGxiYWNrX3RoZXJtYWxtZXRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXU4IHRoZXJtYWxfdmFsID0gMCwgZGVsdGEsIGRlbHRhX2xjaywgZGVsdGFfaXFrLCBvZmZzZXQ7CiAJdTggdGhlcm1hbF9hdmdfY291bnQgPSAwOwogCXUzMiB0aGVybWFsX2F2ZyA9IDA7CkBAIC00MzksNyArNDMxLDcgQEAKIAogCWRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLlJlZ0EyNCA9IDB4MDkwZTEzMTc7CiAKLQl0aGVybWFsX3ZhbCA9ICh1OClwaHlfcXVlcnlfcmZfcmVnKGFkYXB0LCBSRl9QQVRIX0EsCisJdGhlcm1hbF92YWwgPSAodTgpcnR3X2hhbF9yZWFkX3JmcmVnKGFkYXB0LCBSRl9QQVRIX0EsCiAJCQkJCSAgIFJGX1RfTUVURVJfODhFLCAweGZjMDApOwogCiAJaWYgKGlzMnQpCkBAIC02MzIsOCArNjI0LDcgQEAKIHsKIAl1MzIgcmVnX2VhYywgcmVnX2U5NCwgcmVnX2U5YywgcmVnX2VhNCwgdTR0bXA7CiAJdTggcmVzdWx0ID0gMHgwMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmhhbF9kYXRhLT5vZG1wcml2OworCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmYWRhcHQtPkhhbERhdGEtPm9kbXByaXY7CiAKIAkvKiAxIEdldCBUWElNUiBzZXR0aW5nICovCiAJLyogbW9kaWZ5IFJYSVFLIG1vZGUgdGFibGUgKi8KQEAgLTczNyw4ICs3MjgsNyBAQAogewogCXUzMiByZWdlYWMsIHJlZ2ViNCwgcmVnZWJjLCByZWdlYzQsIHJlZ2VjYzsKIAl1OCByZXN1bHQgPSAweDAwOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmaGFsX2RhdGEtPm9kbXByaXY7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZhZGFwdC0+SGFsRGF0YS0+b2RtcHJpdjsKIAogCS8qIE9uZSBzaG90LCBwYXRoIEIgTE9LICYgSVFLICovCiAJcGh5X3NldF9iYl9yZWcoYWRhcHQsIHJJUUtfQUdDX0NvbnQsIGJNYXNrRFdvcmQsIDB4MDAwMDAwMDIpOwpAQCAtOTU0LDE3ICs5NDQsMTEgQEAKIAkJCSAgICAgICB1OCBjMSwgdTggYzIpCiB7CiAJdTMyIGksIGosIGRpZmYsIHNpbV9iaXRtYXAgPSAwLCBib3VuZDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmhhbF9kYXRhLT5vZG1wcml2OwogCXU4IGZpbmFsX2NhbmRpZGF0ZVsyXSA9IHsweEZGLCAweEZGfTsJLyogZm9yIHBhdGggQSBhbmQgcGF0aCBCICovCiAJYm9vbCByZXN1bHQgPSB0cnVlOwogCXMzMiB0bXAxID0gMCwgdG1wMiA9IDA7CiAKLQlpZiAoKGRtX29kbS0+UkZUeXBlID09IE9ETV8yVDJSKSB8fCAoZG1fb2RtLT5SRlR5cGUgPT0gT0RNXzJUM1IpIHx8Ci0JICAgIChkbV9vZG0tPlJGVHlwZSA9PSBPRE1fMlQ0UikpCi0JCWJvdW5kID0gODsKLQllbHNlCi0JCWJvdW5kID0gNDsKKwlib3VuZCA9IDQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYm91bmQ7IGkrKykgewogCQlpZiAoKGkgPT0gMSkgfHwgKGkgPT0gMykgfHwgKGkgPT0gNSkgfHwgKGkgPT0gNykpIHsKQEAgLTEwMzMsOCArMTAxNyw3IEBACiBzdGF0aWMgdm9pZCBwaHlfaXFfY2FsaWJyYXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgczMyIHJlc3VsdFtdWzhdLAogCQkJICAgICB1OCB0LCBib29sIGlzMnQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZoYWxfZGF0YS0+b2RtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmFkYXB0LT5IYWxEYXRhLT5vZG1wcml2OwogCXUzMiBpOwogCXU4IHBhdGhfYV9vaywgcGF0aF9iX29rOwogCXUzMiBhZGRhX3JlZ1tJUUtfQUREQV9SRUdfTlVNXSA9IHsKQEAgLTEyMzIsMTIgKzEyMTUsMTIgQEAKIAlpZiAoKHRtcHJlZyYweDcwKSAhPSAwKSB7CiAJCS8qIDEuIFJlYWQgb3JpZ2luYWwgUkYgbW9kZSAqLwogCQkvKiBQYXRoLUEgKi8KLQkJcmZfYV9tb2RlID0gcGh5X3F1ZXJ5X3JmX3JlZyhhZGFwdCwgUkZfUEFUSF9BLCBSRl9BQywKKwkJcmZfYV9tb2RlID0gcnR3X2hhbF9yZWFkX3JmcmVnKGFkYXB0LCBSRl9QQVRIX0EsIFJGX0FDLAogCQkJCQkgICAgIGJNYXNrMTJCaXRzKTsKIAogCQkvKiBQYXRoLUIgKi8KIAkJaWYgKGlzMnQpCi0JCQlyZl9iX21vZGUgPSBwaHlfcXVlcnlfcmZfcmVnKGFkYXB0LCBSRl9QQVRIX0IsIFJGX0FDLAorCQkJcmZfYl9tb2RlID0gcnR3X2hhbF9yZWFkX3JmcmVnKGFkYXB0LCBSRl9QQVRIX0IsIFJGX0FDLAogCQkJCQkJICAgICBiTWFzazEyQml0cyk7CiAKIAkJLyogMi4gU2V0IFJGIG1vZGUgPSBzdGFuZGJ5IG1vZGUgKi8KQEAgLTEyNTIsNyArMTIzNSw3IEBACiAJfQogCiAJLyogMy4gUmVhZCBSRiByZWcxOCAqLwotCWxjX2NhbCA9IHBoeV9xdWVyeV9yZl9yZWcoYWRhcHQsIFJGX1BBVEhfQSwgUkZfQ0hOTEJXLCBiTWFzazEyQml0cyk7CisJbGNfY2FsID0gcnR3X2hhbF9yZWFkX3JmcmVnKGFkYXB0LCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYk1hc2sxMkJpdHMpOwogCiAJLyogNC4gU2V0IExDIGNhbGlicmF0aW9uIGJlZ2luIGJpdDE1ICovCiAJcGh5X3NldF9yZl9yZWcoYWRhcHQsIFJGX1BBVEhfQSwgUkZfQ0hOTEJXLCBiTWFzazEyQml0cywKQEAgLTEyNzksOCArMTI2Miw3IEBACiAKIHZvaWQgcnRsODhldV9waHlfaXFfY2FsaWJyYXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgYm9vbCByZWNvdmVyeSkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmhhbF9kYXRhLT5vZG1wcml2OworCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmYWRhcHQtPkhhbERhdGEtPm9kbXByaXY7CiAJczMyIHJlc3VsdFs0XVs4XTsKIAl1OCBpLCBmaW5hbCwgY2huX2luZGV4OwogCWJvb2wgcGF0aGFvaywgcGF0aGJvazsKQEAgLTEyOTUsNyArMTI3Nyw3IEBACiAJCXJPRkRNMF9SeElRRXh0QW50YX07CiAJYm9vbCBpczJ0OwogCi0JaXMydCA9IChkbV9vZG0tPlJGVHlwZSA9PSBPRE1fMlQyUikgPyB0cnVlIDogZmFsc2U7CisJaXMydCA9IGZhbHNlOwogCiAJaWYgKCEoZG1fb2RtLT5TdXBwb3J0QWJpbGl0eSAmIE9ETV9SRl9DQUxJQlJBVElPTikpCiAJCXJldHVybjsKQEAgLTEzOTEsNyArMTM3Myw3IEBACiAJCQkJICAgICAgIChyZWdfZWM0ID09IDApKTsKIAl9CiAKLQljaG5faW5kZXggPSBnZXRfcmlnaHRfY2hubF9mb3JfaXFrKGhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbCk7CisJY2huX2luZGV4ID0gZ2V0X3JpZ2h0X2NobmxfZm9yX2lxayhhZGFwdC0+SGFsRGF0YS0+Q3VycmVudENoYW5uZWwpOwogCiAJaWYgKGZpbmFsIDwgNCkgewogCQlmb3IgKGkgPSAwOyBpIDwgSVFLX01hdHJpeF9SRUdfTlVNOyBpKyspCkBAIC0xNDA3LDggKzEzODksNyBAQAogewogCWJvb2wgc2luZ2xldG9uZSA9IGZhbHNlLCBjYXJyaWVyX3N1cCA9IGZhbHNlOwogCXUzMiB0aW1lb3V0ID0gMjAwMCwgdGltZWNvdW50ID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmhhbF9kYXRhLT5vZG1wcml2OworCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmYWRhcHQtPkhhbERhdGEtPm9kbXByaXY7CiAKIAlpZiAoIShkbV9vZG0tPlN1cHBvcnRBYmlsaXR5ICYgT0RNX1JGX0NBTElCUkFUSU9OKSkKIAkJcmV0dXJuOwpAQCAtMTQyMiwxMiArMTQwMyw3IEBACiAKIAlkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iTENLSW5Qcm9ncmVzcyA9IHRydWU7CiAKLQlpZiAoZG1fb2RtLT5SRlR5cGUgPT0gT0RNXzJUMlIpIHsKLQkJcGh5X2xjX2NhbGlicmF0ZShhZGFwdCwgdHJ1ZSk7Ci0JfSBlbHNlIHsKLQkJLyogRm9yIDg4QyAxVDFSICovCi0JCXBoeV9sY19jYWxpYnJhdGUoYWRhcHQsIGZhbHNlKTsKLQl9CisJcGh5X2xjX2NhbGlicmF0ZShhZGFwdCwgZmFsc2UpOwogCiAJZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uYkxDS0luUHJvZ3Jlc3MgPSBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9yZi5jCmluZGV4IDE1OTYyNzQuLjJmM2VkZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmYuYwpAQCAtMjIsNyArMjIsNyBAQAogdm9pZCBydGw4OGV1X3BoeV9yZjYwNTJfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsCiAJCQkJICAgICAgZW51bSBodF9jaGFubmVsX3dpZHRoIGJhbmR3aWR0aCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAKIAlzd2l0Y2ggKGJhbmR3aWR0aCkgewogCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogdm9pZCBydGw4OGV1X3BoeV9yZjYwNTJfc2V0X2Nja190eHBvd2VyKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggKnBvd2VybGV2ZWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJmhhbF9kYXRhLT5kbXByaXY7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJmFkYXB0LT5tbG1lZXh0cHJpdjsKIAl1MzIgdHhfYWdjWzJdID0gezAsIDB9LCB0bXB2YWwgPSAwLCBwd3J0cmFjX3ZhbHVlOwpAQCAtMTI5LDcgKzEyOSw2IEBACiAJCQkgICAgdTggKnB3cl9sZXZlbF9idzIwLCB1OCAqcHdyX2xldmVsX2J3NDAsCiAJCQkgICAgdTggY2hhbm5lbCwgdTMyICpvZmRtYmFzZSwgdTMyICptY3NfYmFzZSkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAl1MzIgcG93ZXJiYXNlMCwgcG93ZXJiYXNlMTsKIAl1OCBpLCBwb3dlcmxldmVsWzJdOwogCkBAIC0xNDAsOSArMTM5LDkgQEAKIAkJCSAgICAgKHBvd2VyYmFzZTA8PDgpIHwgcG93ZXJiYXNlMDsKIAkJKihvZmRtYmFzZStpKSA9IHBvd2VyYmFzZTA7CiAJfQotCWZvciAoaSA9IDA7IGkgPCBoYWxfZGF0YS0+TnVtVG90YWxSRlBhdGg7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBhZGFwdC0+SGFsRGF0YS0+TnVtVG90YWxSRlBhdGg7IGkrKykgewogCQkvKiBDaGVjayBIVDIwIHRvIEhUNDAgZGlmZiAqLwotCQlpZiAoaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJaWYgKGFkYXB0LT5IYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjApCiAJCQlwb3dlcmxldmVsW2ldID0gcHdyX2xldmVsX2J3MjBbaV07CiAJCWVsc2UKIAkJCXBvd2VybGV2ZWxbaV0gPSBwd3JfbGV2ZWxfYnc0MFtpXTsKQEAgLTE1Niw3ICsxNTUsNyBAQAogCQkJCSAgICB1OCBpbmRleCwgdTMyICpwb3dlcmJhc2UwLCB1MzIgKnBvd2VyYmFzZTEsCiAJCQkJICAgIHUzMiAqb3V0X3ZhbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmaGFsX2RhdGEtPmRtcHJpdjsKIAl1OCBpLCBjaG5sR3JvdXAgPSAwLCBwd3JfZGlmZl9saW1pdFs0XSwgY3VzdG9tZXJfcHdyX2xpbWl0OwogCXM4IHB3cl9kaWZmID0gMDsKQEAgLTI4Niw3ICsyODUsNiBAQAogCQkJCQkgdTggKnB3cl9sZXZlbF9idzIwLAogCQkJCQkgdTggKnB3cl9sZXZlbF9idzQwLCB1OCBjaGFubmVsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXUzMiB3cml0ZV92YWxbMl0sIHBvd2VyYmFzZTBbMl0sIHBvd2VyYmFzZTFbMl0sIHB3cnRyYWNfdmFsdWU7CiAJdTggZGlyZWN0aW9uOwogCXU4IGluZGV4ID0gMDsKQEAgLTI5NCw4ICsyOTIsOCBAQAogCWdldHBvd2VyYmFzZTg4ZShhZGFwdCwgcHdyX2xldmVsX29mZG0sIHB3cl9sZXZlbF9idzIwLCBwd3JfbGV2ZWxfYnc0MCwKIAkJCWNoYW5uZWwsICZwb3dlcmJhc2UwWzBdLCAmcG93ZXJiYXNlMVswXSk7CiAKLQlydGw4OGV1X2RtX3R4cG93ZXJfdHJhY2tfYWRqdXN0KCZoYWxfZGF0YS0+b2RtcHJpdiwgMCwgJmRpcmVjdGlvbiwKLQkJCQkJJnB3cnRyYWNfdmFsdWUpOworCXJ0bDg4ZXVfZG1fdHhwb3dlcl90cmFja19hZGp1c3QoJmFkYXB0LT5IYWxEYXRhLT5vZG1wcml2LCAwLAorCQkJCQkmZGlyZWN0aW9uLCAmcHdydHJhY192YWx1ZSk7CiAKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCA2OyBpbmRleCsrKSB7CiAJCWdldF9yeF9wb3dlcl92YWxfYnlfcmVnKGFkYXB0LCBjaGFubmVsLCBpbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmX2NmZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKaW5kZXggNDUzZjllNy4uZGRlNjQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKQEAgLTE5LDcgKzE5LDcgQEAKIAogc3RhdGljIGJvb2wgY2hlY2tfY29uZGl0aW9uKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgY29uc3QgdTMyICBjb25kaXRpb24pCiB7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKm9kbSA9ICZHRVRfSEFMX0RBVEEoYWRhcHQpLT5vZG1wcml2OworCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpvZG0gPSAmYWRhcHQtPkhhbERhdGEtPm9kbXByaXY7CiAJdTMyIF9ib2FyZCA9IG9kbS0+Qm9hcmRUeXBlOwogCXUzMiBfcGxhdGZvcm0gPSBvZG0tPlN1cHBvcnRQbGF0Zm9ybTsKIAl1MzIgX2ludGVyZmFjZSA9IG9kbS0+U3VwcG9ydEludGVyZmFjZTsKQEAgLTIyOCw3ICsyMjgsNyBAQAogCiBzdGF0aWMgYm9vbCByZjYwNTJfY29uZl9wYXJhKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJdTMyIHU0dmFsID0gMDsKIAl1OCByZnBhdGg7CiAJYm9vbCBydHN0YXR1cyA9IHRydWU7CkBAIC0yOTksMTIgKzI5OSw5IEBACiAKIHN0YXRpYyBib29sIHJ0bDg4ZV9waHlfcmY2MDUyX2NvbmZpZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCi0JaWYgKGhhbF9kYXRhLT5yZl90eXBlID09IFJGXzFUMVIpCi0JCWhhbF9kYXRhLT5OdW1Ub3RhbFJGUGF0aCA9IDE7Ci0JZWxzZQotCQloYWxfZGF0YS0+TnVtVG90YWxSRlBhdGggPSAyOworCWhhbF9kYXRhLT5OdW1Ub3RhbFJGUGF0aCA9IDE7CiAKIAlyZXR1cm4gcmY2MDUyX2NvbmZfcGFyYShhZGFwdCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2NtZC5jCmluZGV4IDI0MjJjMDIuLmQwZjU5YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2NtZC5jCkBAIC02MCw3ICs2MCw2IEBACiAJdTggaDJjX2JveF9udW07CiAJdTMyIG1zZ2JveF9hZGRyOwogCXUzMiBtc2dib3hfZXhfYWRkcjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXU4IGNtZF9pZHgsIGV4dF9jbWRfbGVuOwogCXUzMiBoMmNfY21kID0gMDsKIAl1MzIgaDJjX2NtZF9leCA9IDA7CkBAIC04MSw3ICs4MCw3IEBACiAKIAkvKiBwYXkgYXR0ZW50aW9uIHRvIGlmICByYWNlIGNvbmRpdGlvbiBoYXBwZW5lZCBpbiAgSDJDIGNtZCBzZXR0aW5nLiAqLwogCWRvIHsKLQkJaDJjX2JveF9udW0gPSBoYWxkYXRhLT5MYXN0SE1FQm94TnVtOworCQloMmNfYm94X251bSA9IGFkYXB0LT5IYWxEYXRhLT5MYXN0SE1FQm94TnVtOwogCiAJCWlmICghX2lzX2Z3X3JlYWRfY21kX2Rvd24oYWRhcHQsIGgyY19ib3hfbnVtKSkgewogCQkJREJHXzg4RSgiIGZ3IHJlYWQgY21kIGZhaWxlZC4uLlxuIik7CkBAIC0xMTAsNyArMTA5LDggQEAKIAkJfQogCQliY21kX2Rvd24gPSB0cnVlOwogCi0JCWhhbGRhdGEtPkxhc3RITUVCb3hOdW0gPSAoaDJjX2JveF9udW0rMSkgJSBSVEw4OEVfTUFYX0gyQ19CT1hfTlVNUzsKKwkJYWRhcHQtPkhhbERhdGEtPkxhc3RITUVCb3hOdW0gPQorCQkJKGgyY19ib3hfbnVtKzEpICUgUlRMODhFX01BWF9IMkNfQk9YX05VTVM7CiAKIAl9IHdoaWxlICgoIWJjbWRfZG93bikgJiYgKHJldHJ5X2NudHMtLSkpOwogCkBAIC0xMjYsOSArMTI2LDkgQEAKIC8qIGJpdG1hcFsyODozMV09IFJhdGUgQWRhcHRpdmUgaWQgKi8KIC8qIGFyZ1swOjRdID0gbWFjaWQgKi8KIC8qIGFyZ1s1XSA9IFNob3J0IEdJICovCi12b2lkIHJ0bDgxODhlX0FkZF9SYXRlQVRpZChzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHUzMiBiaXRtYXAsIHU4IGFyZywgdTggcnNzaV9sZXZlbCkKK3ZvaWQgcnR3X2hhbF9hZGRfcmFfdGlkKHN0cnVjdCBhZGFwdGVyICpwQWRhcHRlciwgdTMyIGJpdG1hcCwgdTggYXJnLCB1OCByc3NpX2xldmVsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKm9kbXByaXYgPSAmcEFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXY7CiAKIAl1OCBtYWNpZCwgaW5pdF9yYXRlLCByYWlkLCBzaG9ydEdJcmF0ZSA9IGZhbHNlOwogCkBAIC0xMzgsNyArMTM4LDcgQEAKIAliaXRtYXAgJj0gMHgwZmZmZmZmZjsKIAogCWlmIChyc3NpX2xldmVsICE9IERNX1JBVFJfU1RBX0lOSVQpCi0JCWJpdG1hcCA9IE9ETV9HZXRfUmF0ZV9CaXRtYXAoJmhhbGRhdGEtPm9kbXByaXYsIG1hY2lkLCBiaXRtYXAsIHJzc2lfbGV2ZWwpOworCQliaXRtYXAgPSBPRE1fR2V0X1JhdGVfQml0bWFwKG9kbXByaXYsIG1hY2lkLCBiaXRtYXAsIHJzc2lfbGV2ZWwpOwogCiAJYml0bWFwIHw9ICgocmFpZDw8MjgpJjB4ZjAwMDAwMDApOwogCkBAIC0xNTYsNyArMTU2LDcgQEAKIAlEQkdfODhFKCIlcz0+IG1hY19pZDolZCwgcmFpZDolZCwgcmFfYml0bWFwPTB4JXgsIHNob3J0R0lyYXRlPTB4JTAyeFxuIiwKIAkJX19mdW5jX18sIG1hY2lkLCByYWlkLCBiaXRtYXAsIHNob3J0R0lyYXRlKTsKIAotCU9ETV9SQV9VcGRhdGVSYXRlSW5mb184MTg4RSgmKGhhbGRhdGEtPm9kbXByaXYpLCBtYWNpZCwgcmFpZCwgYml0bWFwLCBzaG9ydEdJcmF0ZSk7CisJT0RNX1JBX1VwZGF0ZVJhdGVJbmZvXzgxODhFKG9kbXByaXYsIG1hY2lkLCByYWlkLCBiaXRtYXAsIHNob3J0R0lyYXRlKTsKIH0KIAogdm9pZCBydGw4MTg4ZV9zZXRfRndQd3JNb2RlX2NtZChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4IE1vZGUpCkBAIC0yMTksNyArMjE5LDcgQEAKIAogc3RhdGljIHZvaWQgQ29uc3RydWN0QmVhY29uKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggKnBmcmFtZSwgdTMyICpwTGVuZ3RoKQogewotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcgkqcHdsYW5oZHI7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwogCV9fbGUxNiAqZmN0cmw7CiAJdTMyIHJhdGVfbGVuLCBwa3RsZW47CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJihhZGFwdC0+bWxtZWV4dHByaXYpOwpAQCAtMjI3LDIwICsyMjcsMjAgQEAKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leAkJKmN1cl9uZXR3b3JrID0gJihwbWxtZWluZm8tPm5ldHdvcmspOwogCXU4IGJjX2FkZHJbXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKIAotCXB3bGFuaGRyID0gKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKKwlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKIAotCWZjdHJsID0gJihwd2xhbmhkci0+ZnJhbWVfY3RsKTsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBiY19hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKGFkYXB0LT5lZXByb21wcml2KSksIEVUSF9BTEVOKTsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIzLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGJjX2FkZHIpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBjdXJfbmV0d29yay0+TWFjQWRkcmVzcyk7CiAKIAlTZXRTZXFOdW0ocHdsYW5oZHIsIDAvKnBtbG1lZXh0LT5tZ250X3NlcSovKTsKIAlTZXRGcmFtZVN1YlR5cGUocGZyYW1lLCBXSUZJX0JFQUNPTik7CiAKLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGZyYW1lICs9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CisJcGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKIAogCS8qIHRpbWVzdGFtcCB3aWxsIGJlIGluc2VydGVkIGJ5IGhhcmR3YXJlICovCiAJcGZyYW1lICs9IDg7CkBAIC0zMDQsMTYgKzMwNCwxNiBAQAogCiBzdGF0aWMgdm9pZCBDb25zdHJ1Y3RQU1BvbGwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCAqcGZyYW1lLCB1MzIgKnBMZW5ndGgpCiB7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJihhZGFwdC0+bWxtZWV4dHByaXYpOwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJX19sZTE2ICpmY3RybDsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAmKHBtbG1laW5mby0+bmV0d29yayk7CiAKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKIAkvKiAgRnJhbWUgY29udHJvbC4gKi8KLQlmY3RybCA9ICYocHdsYW5oZHItPmZyYW1lX2N0bCk7CisJZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2NvbnRyb2w7CiAJKihmY3RybCkgPSAwOwogCVNldFB3ck1ndChmY3RybCk7CiAJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9QU1BPTEwpOwpAQCAtMzIyLDEwICszMjIsMTAgQEAKIAlTZXREdXJhdGlvbihwZnJhbWUsIChwbWxtZWluZm8tPmFpZCB8IDB4YzAwMCkpOwogCiAJLyogIEJTU0lELiAqLwotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwogCiAJLyogIFRBLiAqLwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmKGFkYXB0LT5lZXByb21wcml2KSkpOwogCiAJKnBMZW5ndGggPSAxNjsKIH0KQEAgLTMzOCw3ICszMzgsNyBAQAogCXU4IGJFb3NwLAogCXU4IGJGb3JjZVBvd2VyU2F2ZSkKIHsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIJKnB3bGFuaGRyOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkcjsKIAlfX2xlMTYgKmZjdHJsOwogCXUzMiBwa3RsZW47CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0LT5tbG1lcHJpdjsKQEAgLTM0Nyw5ICszNDcsOSBAQAogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gJihwbWxtZWluZm8tPm5ldHdvcmspOwogCi0JcHdsYW5oZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyICopcGZyYW1lOworCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopcGZyYW1lOwogCi0JZmN0cmwgPSAmcHdsYW5oZHItPmZyYW1lX2N0bDsKKwlmY3RybCA9ICZwd2xhbmhkci0+ZnJhbWVfY29udHJvbDsKIAkqKGZjdHJsKSA9IDA7CiAJaWYgKGJGb3JjZVBvd2VyU2F2ZSkKIAkJU2V0UHdyTWd0KGZjdHJsKTsKQEAgLTM1Nyw0MCArMzU3LDQwIEBACiAJc3dpdGNoIChjdXJfbmV0d29yay0+bmV0d29yay5JbmZyYXN0cnVjdHVyZU1vZGUpIHsKIAljYXNlIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZToKIAkJU2V0VG9EcyhmY3RybCk7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIFN0YUFkZHIsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKSk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIFN0YUFkZHIpOwogCQlicmVhazsKIAljYXNlIE5kaXM4MDJfMTFBUE1vZGU6CiAJCVNldEZyRHMoZmN0cmwpOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIFN0YUFkZHIpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBwbmV0d29yay0+TWFjQWRkcmVzcyk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpKTsKIAkJYnJlYWs7CiAJY2FzZSBOZGlzODAyXzExSUJTUzoKIAlkZWZhdWx0OgotCQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJihhZGFwdC0+ZWVwcm9tcHJpdikpLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIFN0YUFkZHIpOworCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKSk7CisJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIHBuZXR3b3JrLT5NYWNBZGRyZXNzKTsKIAkJYnJlYWs7CiAJfQogCiAJU2V0U2VxTnVtKHB3bGFuaGRyLCAwKTsKIAogCWlmIChiUW9TKSB7Ci0JCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcl9xb3MgKnB3bGFucW9zaGRyOworCQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIgKnB3bGFucW9zaGRyOwogCiAJCVNldEZyYW1lU3ViVHlwZShwZnJhbWUsIFdJRklfUU9TX0RBVEFfTlVMTCk7CiAKLQkJcHdsYW5xb3NoZHIgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyXzNhZGRyX3FvcyAqKXBmcmFtZTsKLQkJU2V0UHJpb3JpdHkoJnB3bGFucW9zaGRyLT5xYywgQUMpOwotCQlTZXRFT1NQKCZwd2xhbnFvc2hkci0+cWMsIGJFb3NwKTsKKwkJcHdsYW5xb3NoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICopcGZyYW1lOworCQlTZXRQcmlvcml0eSgmcHdsYW5xb3NoZHItPnFvc19jdHJsLCBBQyk7CisJCVNldEVPU1AoJnB3bGFucW9zaGRyLT5xb3NfY3RybCwgYkVvc3ApOwogCi0JCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHJfcW9zKTsKKwkJcGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkcik7CiAJfSBlbHNlIHsKIAkJU2V0RnJhbWVTdWJUeXBlKHBmcmFtZSwgV0lGSV9EQVRBX05VTEwpOwogCi0JCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCQlwa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwogCX0KIAogCSpwTGVuZ3RoID0gcGt0bGVuOwpAQCAtMzk4LDcgKzM5OCw3IEBACiAKIHN0YXRpYyB2b2lkIENvbnN0cnVjdFByb2JlUnNwKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggKnBmcmFtZSwgdTMyICpwTGVuZ3RoLCB1OCAqU3RhQWRkciwgYm9vbCBiSGlkZVNTSUQpCiB7Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfaGRyCSpwd2xhbmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7CiAJX19sZTE2ICpmY3RybDsKIAl1OCAqbWFjLCAqYnNzaWQ7CiAJdTMyIHBrdGxlbjsKQEAgLTQwNiwyMSArNDA2LDIxIEBACiAJc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICYocG1sbWVleHQtPm1sbWV4dF9pbmZvKTsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leAkqY3VyX25ldHdvcmsgPSAmKHBtbG1laW5mby0+bmV0d29yayk7CiAKLQlwd2xhbmhkciA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgKilwZnJhbWU7CisJcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7CiAKIAltYWMgPSBteWlkKCYoYWRhcHQtPmVlcHJvbXByaXYpKTsKIAlic3NpZCA9IGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzOwogCi0JZmN0cmwgPSAmKHB3bGFuaGRyLT5mcmFtZV9jdGwpOworCWZjdHJsID0gJnB3bGFuaGRyLT5mcmFtZV9jb250cm9sOwogCSooZmN0cmwpID0gMDsKLQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMiwgbWFjLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHB3bGFuaGRyLT5hZGRyMywgYnNzaWQsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyKTsKKwlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIyLCBtYWMpOworCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIGJzc2lkKTsKIAogCVNldFNlcU51bShwd2xhbmhkciwgMCk7CiAJU2V0RnJhbWVTdWJUeXBlKGZjdHJsLCBXSUZJX1BST0JFUlNQKTsKIAotCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIpOworCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7CiAJcGZyYW1lICs9IHBrdGxlbjsKIAogCWlmIChjdXJfbmV0d29yay0+SUVMZW5ndGggPiBNQVhfSUVfU1opCkBAIC00NDUsNyArNDQ1LDYgQEAKIC8qICAyMDA5LjEwLjE1IGJ5IHR5bmxpLiAqLwogc3RhdGljIHZvaWQgU2V0RndSc3ZkUGFnZVBrdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGJvb2wgYkRMRmluaXNoZWQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhOwogCXN0cnVjdCB4bWl0X2ZyYW1lCSpwbWdudGZyYW1lOwogCXN0cnVjdCBwa3RfYXR0cmliCSpwYXR0cmliOwogCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdjsKQEAgLTQ2Nyw3ICs0NjYsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAJcHhtaXRwcml2ID0gJmFkYXB0LT54bWl0cHJpdjsKIAlwbWxtZWV4dCA9ICZhZGFwdC0+bWxtZWV4dHByaXY7CiAJcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKQEAgLTQ4Nyw3ICs0ODUsNyBAQAogCWlmIChQYWdlTmVlZCA9PSAxKQogCQlQYWdlTmVlZCArPSAxOwogCVBhZ2VOdW0gKz0gUGFnZU5lZWQ7Ci0JaGFsZGF0YS0+RndSc3ZkUGFnZVN0YXJ0T2Zmc2V0ID0gUGFnZU51bTsKKwlhZGFwdC0+SGFsRGF0YS0+RndSc3ZkUGFnZVN0YXJ0T2Zmc2V0ID0gUGFnZU51bTsKIAogCUJ1ZkluZGV4ICs9IFBhZ2VOZWVkKjEyODsKIApAQCAtNTU0LDcgKzU1Miw3IEBACiAKIHZvaWQgcnRsODE4OGVfc2V0X0Z3Sm9pbkJzc1JlcG9ydF9jbWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCBtc3RhdHVzKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gYWRhcHQtPkhhbERhdGE7CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJihhZGFwdC0+bWxtZWV4dHByaXYpOwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAJYm9vbAliU2VuZEJlYWNvbiA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2RtLmMKaW5kZXggODFmMjkzMS4uZDA0YjdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9kbS5jCkBAIC00Miw0MyArNDIsMzMgQEAKIC8qICAqLwogc3RhdGljIHZvaWQgSW5pdF9PRE1fQ29tSW5mb184OEUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gQWRhcHRlci0+SGFsRGF0YTsKIAlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZoYWxfZGF0YS0+ZG1wcml2OwogCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0gPSAmKGhhbF9kYXRhLT5vZG1wcml2KTsKLQl1OCBjdXRfdmVyOwogCiAJLyogIEluaXQgVmFsdWUgKi8KIAltZW1zZXQoZG1fb2RtLCAwLCBzaXplb2YoKmRtX29kbSkpOwogCiAJZG1fb2RtLT5BZGFwdGVyID0gQWRhcHRlcjsKKwlkbV9vZG0tPlN1cHBvcnRQbGF0Zm9ybSA9IE9ETV9DRTsKKwlkbV9vZG0tPlN1cHBvcnRJQ1R5cGUgPSBPRE1fUlRMODE4OEU7CisJZG1fb2RtLT5DdXRWZXJzaW9uID0gT0RNX0NVVF9BOworCWRtX29kbS0+YklzTVBDaGlwID0gaGFsX2RhdGEtPlZlcnNpb25JRC5DaGlwVHlwZSA9PSBOT1JNQUxfQ0hJUDsKKwlkbV9vZG0tPlBhdGNoSUQgPSBoYWxfZGF0YS0+Q3VzdG9tZXJJRDsKKwlkbV9vZG0tPmJXSUZJVGVzdCA9IEFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWM7CiAKLQlPRE1fQ21uSW5mb0luaXQoZG1fb2RtLCBPRE1fQ01OSU5GT19QTEFURk9STSwgT0RNX0NFKTsKKwlkbV9vZG0tPkFudERpdlR5cGUgPSBoYWxfZGF0YS0+VFJ4QW50RGl2VHlwZTsKIAotCU9ETV9DbW5JbmZvSW5pdChkbV9vZG0sIE9ETV9DTU5JTkZPX0lDX1RZUEUsIE9ETV9SVEw4MTg4RSk7Ci0KLQljdXRfdmVyID0gT0RNX0NVVF9BOwotCi0JT0RNX0NtbkluZm9Jbml0KGRtX29kbSwgT0RNX0NNTklORk9fQ1VUX1ZFUiwgY3V0X3Zlcik7Ci0KLQlPRE1fQ21uSW5mb0luaXQoZG1fb2RtLCBPRE1fQ01OSU5GT19NUF9URVNUX0NISVAsIGhhbF9kYXRhLT5WZXJzaW9uSUQuQ2hpcFR5cGUgPT0gTk9STUFMX0NISVAgPyB0cnVlIDogZmFsc2UpOwotCi0JT0RNX0NtbkluZm9Jbml0KGRtX29kbSwgT0RNX0NNTklORk9fUEFUQ0hfSUQsIGhhbF9kYXRhLT5DdXN0b21lcklEKTsKLQlPRE1fQ21uSW5mb0luaXQoZG1fb2RtLCBPRE1fQ01OSU5GT19CV0lGSV9URVNULCBBZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjKTsKLQotCi0JaWYgKGhhbF9kYXRhLT5yZl90eXBlID09IFJGXzFUMVIpCi0JCU9ETV9DbW5JbmZvVXBkYXRlKGRtX29kbSwgT0RNX0NNTklORk9fUkZfVFlQRSwgT0RNXzFUMVIpOwotCWVsc2UgaWYgKGhhbF9kYXRhLT5yZl90eXBlID09IFJGXzJUMlIpCi0JCU9ETV9DbW5JbmZvVXBkYXRlKGRtX29kbSwgT0RNX0NNTklORk9fUkZfVFlQRSwgT0RNXzJUMlIpOwotCWVsc2UgaWYgKGhhbF9kYXRhLT5yZl90eXBlID09IFJGXzFUMlIpCi0JCU9ETV9DbW5JbmZvVXBkYXRlKGRtX29kbSwgT0RNX0NNTklORk9fUkZfVFlQRSwgT0RNXzFUMlIpOwotCi0JT0RNX0NtbkluZm9Jbml0KGRtX29kbSwgT0RNX0NNTklORk9fUkZfQU5URU5OQV9UWVBFLCBoYWxfZGF0YS0+VFJ4QW50RGl2VHlwZSk7CisJLyogIFR4IHBvd2VyIHRyYWNraW5nIEJCIHN3aW5nIHRhYmxlLiAqLworCS8qICBUaGUgYmFzZSBpbmRleCA9IDEyLiArKCgxMi1uKS8yKWRCIDEzfj8/ID0gZGVjcmVhc2UgdHggcHdyIGJ5IC0oKG4tMTIpLzIpZEIgKi8KKwlkbV9vZG0tPkJiU3dpbmdJZHhPZmRtID0gMTI7IC8qICBTZXQgZGVmYWx1dCB2YWx1ZSBhcyBpbmRleCAxMi4gKi8KKwlkbV9vZG0tPkJiU3dpbmdJZHhPZmRtQ3VycmVudCA9IDEyOworCWRtX29kbS0+QmJTd2luZ0ZsYWdPZmRtID0gZmFsc2U7CiAKIAlwZG1wcml2LT5Jbml0T0RNRmxhZyA9CU9ETV9SRl9DQUxJQlJBVElPTiB8CiAJCQkJT0RNX1JGX1RYX1BXUl9UUkFDSzsKIAotCU9ETV9DbW5JbmZvVXBkYXRlKGRtX29kbSwgT0RNX0NNTklORk9fQUJJTElUWSwgcGRtcHJpdi0+SW5pdE9ETUZsYWcpOworCWRtX29kbS0+U3VwcG9ydEFiaWxpdHkgPSBwZG1wcml2LT5Jbml0T0RNRmxhZzsKIH0KIAogc3RhdGljIHZvaWQgVXBkYXRlX09ETV9Db21JbmZvXzg4RShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKQEAgLTg2LDcgKzc2LDcgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmQWRhcHRlci0+bWxtZWV4dHByaXY7CiAJc3RydWN0IG1sbWVfcHJpdgkqcG1sbWVwcml2ID0gJkFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmxwcml2ID0gJkFkYXB0ZXItPnB3cmN0cmxwcml2OwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICYoaGFsX2RhdGEtPm9kbXByaXYpOwogCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJmhhbF9kYXRhLT5kbXByaXY7CiAJaW50IGk7CkBAIC0xMDksMjAgKzk5LDI2IEBACiAJCQkJCU9ETV9SRl9UWF9QV1JfVFJBQ0s7CiAJfQogCi0JT0RNX0NtbkluZm9VcGRhdGUoZG1fb2RtLCBPRE1fQ01OSU5GT19BQklMSVRZLCBwZG1wcml2LT5Jbml0T0RNRmxhZyk7CisJZG1fb2RtLT5TdXBwb3J0QWJpbGl0eSA9IHBkbXByaXYtPkluaXRPRE1GbGFnOwogCi0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fVFhfVU5JLCAmKEFkYXB0ZXItPnhtaXRwcml2LnR4X2J5dGVzKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fUlhfVU5JLCAmKEFkYXB0ZXItPnJlY3Zwcml2LnJ4X2J5dGVzKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fV01fTU9ERSwgJihwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUpKTsKLQlPRE1fQ21uSW5mb0hvb2soZG1fb2RtLCBPRE1fQ01OSU5GT19TRUNfQ0hOTF9PRkZTRVQsICYoaGFsX2RhdGEtPm5DdXI0ME1oelByaW1lU0MpKTsKLQlPRE1fQ21uSW5mb0hvb2soZG1fb2RtLCBPRE1fQ01OSU5GT19TRUNfTU9ERSwgJihBZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSkpOwotCU9ETV9DbW5JbmZvSG9vayhkbV9vZG0sIE9ETV9DTU5JTkZPX0JXLCAmKGhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbEJXKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fQ0hOTCwgJihoYWxfZGF0YS0+Q3VycmVudENoYW5uZWwpKTsKLQlPRE1fQ21uSW5mb0hvb2soZG1fb2RtLCBPRE1fQ01OSU5GT19ORVRfQ0xPU0VELCAmKEFkYXB0ZXItPm5ldF9jbG9zZWQpKTsKLQlPRE1fQ21uSW5mb0hvb2soZG1fb2RtLCBPRE1fQ01OSU5GT19NUF9NT0RFLCAmKEFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5tcF9tb2RlKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fU0NBTiwgJihwbWxtZXByaXYtPmJTY2FuSW5Qcm9jZXNzKSk7Ci0JT0RNX0NtbkluZm9Ib29rKGRtX29kbSwgT0RNX0NNTklORk9fUE9XRVJfU0FWSU5HLCAmKHB3cmN0cmxwcml2LT5icG93ZXJfc2F2aW5nKSk7Ci0JT0RNX0NtbkluZm9Jbml0KGRtX29kbSwgT0RNX0NNTklORk9fUkZfQU5URU5OQV9UWVBFLCBoYWxfZGF0YS0+VFJ4QW50RGl2VHlwZSk7CisJZG1fb2RtLT5wTnVtVHhCeXRlc1VuaWNhc3QgPSAmQWRhcHRlci0+eG1pdHByaXYudHhfYnl0ZXM7CisJZG1fb2RtLT5wTnVtUnhCeXRlc1VuaWNhc3QgPSAmQWRhcHRlci0+cmVjdnByaXYucnhfYnl0ZXM7CisJZG1fb2RtLT5wV2lyZWxlc3NNb2RlID0gJnBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZTsKKwlkbV9vZG0tPnBTZWNDaE9mZnNldCA9ICZoYWxfZGF0YS0+bkN1cjQwTWh6UHJpbWVTQzsKKwlkbV9vZG0tPnBTZWN1cml0eSA9ICh1OCAqKSZBZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobTsKKwlkbV9vZG0tPnBCYW5kV2lkdGggPSAodTggKikmaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsQlc7CisJZG1fb2RtLT5wQ2hhbm5lbCA9ICZoYWxfZGF0YS0+Q3VycmVudENoYW5uZWw7CisJZG1fb2RtLT5wYk5ldF9jbG9zZWQgPSAoYm9vbCAqKSZBZGFwdGVyLT5uZXRfY2xvc2VkOworCWRtX29kbS0+bXBfbW9kZSA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXYubXBfbW9kZTsKKwlkbV9vZG0tPnBiU2NhbkluUHJvY2VzcyA9IChib29sICopJnBtbG1lcHJpdi0+YlNjYW5JblByb2Nlc3M7CisJZG1fb2RtLT5wYlBvd2VyU2F2aW5nID0gKGJvb2wgKikmcHdyY3RybHByaXYtPmJwb3dlcl9zYXZpbmc7CisJZG1fb2RtLT5BbnREaXZUeXBlID0gaGFsX2RhdGEtPlRSeEFudERpdlR5cGU7CisKKwkvKiAgVHggcG93ZXIgdHJhY2tpbmcgQkIgc3dpbmcgdGFibGUuICovCisJLyogIFRoZSBiYXNlIGluZGV4ID0gMTIuICsoKDEyLW4pLzIpZEIgMTN+Pz8gPSBkZWNyZWFzZSB0eCBwd3IgYnkgLSgobi0xMikvMilkQiAqLworCWRtX29kbS0+QmJTd2luZ0lkeE9mZG0gPSAxMjsgLyogIFNldCBkZWZhbHV0IHZhbHVlIGFzIGluZGV4IDEyLiAqLworCWRtX29kbS0+QmJTd2luZ0lkeE9mZG1DdXJyZW50ID0gMTI7CisJZG1fb2RtLT5CYlN3aW5nRmxhZ09mZG0gPSBmYWxzZTsKIAogCWZvciAoaSA9IDA7IGkgPCBOVU1fU1RBOyBpKyspCiAJCU9ETV9DbW5JbmZvUHRyQXJyYXlIb29rKGRtX29kbSwgT0RNX0NNTklORk9fU1RBX1NUQVRVUywgaSwgTlVMTCk7CkBAIC0xMzAsMjMgKzEyNiwxOSBAQAogCiB2b2lkIHJ0bDgxODhlX0luaXRIYWxEbShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJmhhbF9kYXRhLT5kbXByaXY7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICYoaGFsX2RhdGEtPm9kbXByaXYpOworCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJkFkYXB0ZXItPkhhbERhdGEtPmRtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJihBZGFwdGVyLT5IYWxEYXRhLT5vZG1wcml2KTsKIAogCWRtX0luaXRHUElPU2V0dGluZyhBZGFwdGVyKTsKIAlwZG1wcml2LT5ETV9UeXBlID0gRE1fVHlwZV9CeURyaXZlcjsKIAlwZG1wcml2LT5ETUZsYWcgPSBEWU5BTUlDX0ZVTkNfRElTQUJMRTsKIAlVcGRhdGVfT0RNX0NvbUluZm9fODhFKEFkYXB0ZXIpOwogCU9ETV9ETUluaXQoZG1fb2RtKTsKLQlBZGFwdGVyLT5maXhfcmF0ZSA9IDB4RkY7CiB9CiAKLXZvaWQgcnRsODE4OGVfSGFsRG1XYXRjaERvZyhzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9kbV93YXRjaGRvZyhzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKIHsKLQlib29sIGZ3X3BzX2F3YWtlID0gdHJ1ZTsKIAl1OCBod19pbml0X2NvbXBsZXRlZCA9IGZhbHNlOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gTlVMTDsKIAl1OCBiTGlua2VkID0gZmFsc2U7CiAKQEAgLTE1NSwxMyArMTQ3LDYgQEAKIAlpZiAoIWh3X2luaXRfY29tcGxldGVkKQogCQlnb3RvIHNraXBfZG07CiAKLQlydHdfaGFsX2dldF9od3JlZyhBZGFwdGVyLCBIV19WQVJfRldMUFNfUkZfT04sICh1OCAqKSgmZndfcHNfYXdha2UpKTsKLQotCS8qICBGdyBpcyB1bmRlciBwMnAgcG93ZXJzYXZpbmcgbW9kZSwgZHJpdmVyIHNob3VsZCBzdG9wIGR5bmFtaWMgbWVjaGFuaXNtLiAqLwotCS8qICBtb2RpZmVkIGJ5IHRob21hcy4gMjAxMS4wNi4xMS4gKi8KLQlpZiAoQWRhcHRlci0+d2RpbmZvLnAycF9wc19tb2RlKQotCQlmd19wc19hd2FrZSA9IGZhbHNlOwotCiAJLyogT0RNICovCiAJcG1sbWVwcml2ID0gJkFkYXB0ZXItPm1sbWVwcml2OwogCkBAIC0xNzUsMTkgKzE2MCwxOCBAQAogCQkJYkxpbmtlZCA9IHRydWU7CiAJfQogCi0JT0RNX0NtbkluZm9VcGRhdGUoJmhhbF9kYXRhLT5vZG1wcml2LCBPRE1fQ01OSU5GT19MSU5LLCBiTGlua2VkKTsKLQlPRE1fRE1XYXRjaGRvZygmaGFsX2RhdGEtPm9kbXByaXYpOworCUFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXYuYkxpbmtlZCA9IGJMaW5rZWQ7CisJT0RNX0RNV2F0Y2hkb2coJkFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXYpOwogc2tpcF9kbToKIAkvKiAgQ2hlY2sgR1BJTyB0byBkZXRlcm1pbmUgY3VycmVudCBSRiBvbi9vZmYgYW5kIFBiYyBzdGF0dXMuICovCiAJLyogIENoZWNrIEhhcmR3YXJlIFJhZGlvIE9OL09GRiBvciBub3QgKi8KIAlyZXR1cm47CiB9CiAKLXZvaWQgcnRsODE4OGVfaW5pdF9kbV9wcml2KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQordm9pZCBydHdfaGFsX2RtX2luaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZoYWxfZGF0YS0+ZG1wcml2OwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpwb2RtcHJpdiA9ICZoYWxfZGF0YS0+b2RtcHJpdjsKKwlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZBZGFwdGVyLT5IYWxEYXRhLT5kbXByaXY7CisJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBvZG1wcml2ID0gJkFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXY7CiAKIAltZW1zZXQocGRtcHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBkbV9wcml2KSk7CiAJSW5pdF9PRE1fQ29tSW5mb184OEUoQWRhcHRlcik7CkBAIC0xOTYsMTEgKzE4MCw5IEBACiAKIC8qICBBZGQgbmV3IGZ1bmN0aW9uIHRvIHJlc2V0IHRoZSBzdGF0ZSBvZiBhbnRlbm5hIGRpdmVyc2l0eSBiZWZvcmUgbGluay4gKi8KIC8qICBDb21wYXJlIFJTU0kgZm9yIGRlY2lkaW5nIGFudGVubmEgKi8KLXZvaWQgQW50RGl2Q29tcGFyZTgxODhFKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqZHN0LCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqc3JjKQordm9pZCBydHdfaGFsX2FudGRpdl9yc3NpX2NvbXBhcmVkKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqZHN0LCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqc3JjKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlpZiAoMCAhPSBoYWxfZGF0YS0+QW50RGl2Q2ZnKSB7CisJaWYgKDAgIT0gQWRhcHRlci0+SGFsRGF0YS0+QW50RGl2Q2ZnKSB7CiAJCS8qIHNlbGVjdCBvcHRpbXVtX2FudGVubmEgZm9yIGJlZm9yZSBsaW5rZWQgPT5Gb3IgYW50ZW5uYSBkaXZlcnNpdHkgKi8KIAkJaWYgKGRzdC0+UnNzaSA+PSAgc3JjLT5Sc3NpKSB7Lyoga2VlcCBvcmcgcGFyYW1ldGVyICovCiAJCQlzcmMtPlJzc2kgPSBkc3QtPlJzc2k7CkBAIC0yMTAsMTUgKzE5MiwxNCBAQAogfQogCiAvKiAgQWRkIG5ldyBmdW5jdGlvbiB0byByZXNldCB0aGUgc3RhdGUgb2YgYW50ZW5uYSBkaXZlcnNpdHkgYmVmb3JlIGxpbmsuICovCi11OCBBbnREaXZCZWZvcmVMaW5rODE4OEUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCit1OCBydHdfaGFsX2FudGRpdl9iZWZvcmVfbGlua2VkKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKmRtX29kbSA9ICZoYWxfZGF0YS0+b2RtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJkFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXY7CiAJc3RydWN0IHN3X2FudF9zd2l0Y2ggKmRtX3N3YXRfdGJsID0gJmRtX29kbS0+RE1fU1dBVF9UYWJsZTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmKEFkYXB0ZXItPm1sbWVwcml2KTsKIAogCS8qICBDb25kaXRpb24gdGhhdCBkb2VzIG5vdCBuZWVkIHRvIHVzZSBhbnRlbm5hIGRpdmVyc2l0eS4gKi8KLQlpZiAoaGFsX2RhdGEtPkFudERpdkNmZyA9PSAwKQorCWlmIChBZGFwdGVyLT5IYWxEYXRhLT5BbnREaXZDZmcgPT0gMCkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9oYWxfaW5pdC5jCmluZGV4IDBiNDQ0ZmQuLjM4NWJjMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfaGFsX2luaXQuYwpAQCAtMTA4LDI4ICsxMDgsMjQgQEAKIAogdm9pZCBydGw4MTg4ZV9Jbml0aWFsaXplRmlybXdhcmVWYXJzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQogCS8qICBJbml0IEZ3IExQUyByZWxhdGVkLiAqLwogCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5iRndDdXJyZW50SW5QU01vZGUgPSBmYWxzZTsKIAogCS8qICBJbml0IEgyQyBjb3VudGVyLiBieSB0eW5saS4gMjAwOS4xMi4wOS4gKi8KLQlwSGFsRGF0YS0+TGFzdEhNRUJveE51bSA9IDA7CisJcGFkYXB0ZXItPkhhbERhdGEtPkxhc3RITUVCb3hOdW0gPSAwOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MTg4ZV9mcmVlX2hhbF9kYXRhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9mcmVlX2RhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCWtmcmVlKHBhZGFwdGVyLT5IYWxEYXRhKTsKIAlwYWRhcHRlci0+SGFsRGF0YSA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIFJlYWRDaGlwVmVyc2lvbjgxODhFKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9yZWFkX2NoaXBfdmVyc2lvbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJdTMyCQkJCXZhbHVlMzI7CiAJc3RydWN0IEhBTF9WRVJTSU9OCQlDaGlwVmVyc2lvbjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqcEhhbERhdGEgPSBwYWRhcHRlci0+SGFsRGF0YTsKIAogCXZhbHVlMzIgPSB1c2JfcmVhZDMyKHBhZGFwdGVyLCBSRUdfU1lTX0NGRyk7CiAJQ2hpcFZlcnNpb24uQ2hpcFR5cGUgPSAoKHZhbHVlMzIgJiBSVExfSUQpID8gVEVTVF9DSElQIDogTk9STUFMX0NISVApOwpAQCAtMTM5LDE2ICsxMzUsMTMgQEAKIAlkdW1wX2NoaXBfaW5mbyhDaGlwVmVyc2lvbik7CiAKIAlwSGFsRGF0YS0+VmVyc2lvbklEID0gQ2hpcFZlcnNpb247Ci0JcEhhbERhdGEtPnJmX3R5cGUgPSBSRl8xVDFSOwogCXBIYWxEYXRhLT5OdW1Ub3RhbFJGUGF0aCA9IDE7Ci0KLQlNU0dfODhFKCJSRl9UeXBlIGlzICV4ISFcbiIsIHBIYWxEYXRhLT5yZl90eXBlKTsKIH0KIAotc3RhdGljIHZvaWQgcnRsODE4OGVfU2V0SGFsT0RNVmFyKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCBlbnVtIGhhbF9vZG1fdmFyaWFibGUgZVZhcmlhYmxlLCB2b2lkICpwVmFsdWUxLCBib29sIGJTZXQpCit2b2lkIHJ0d19oYWxfc2V0X29kbV92YXIoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gaGFsX29kbV92YXJpYWJsZSBlVmFyaWFibGUsIHZvaWQgKnBWYWx1ZTEsIGJvb2wgYlNldCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBvZG1fZG1fc3RydWN0ICpwb2RtcHJpdiA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqcG9kbXByaXYgPSAmQWRhcHRlci0+SGFsRGF0YS0+b2RtcHJpdjsKKwogCXN3aXRjaCAoZVZhcmlhYmxlKSB7CiAJY2FzZSBIQUxfT0RNX1NUQV9JTkZPOgogCQl7CkBAIC0xNjUsMTcgKzE1OCwxNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgSEFMX09ETV9QMlBfU1RBVEU6Ci0JCQlPRE1fQ21uSW5mb1VwZGF0ZShwb2RtcHJpdiwgT0RNX0NNTklORk9fV0lGSV9ESVJFQ1QsIGJTZXQpOworCQlwb2RtcHJpdi0+YldJRklfRGlyZWN0ID0gYlNldDsKIAkJYnJlYWs7CiAJY2FzZSBIQUxfT0RNX1dJRklfRElTUExBWV9TVEFURToKLQkJCU9ETV9DbW5JbmZvVXBkYXRlKHBvZG1wcml2LCBPRE1fQ01OSU5GT19XSUZJX0RJU1BMQVksIGJTZXQpOworCQlwb2RtcHJpdi0+YldJRklfRGlzcGxheSA9IGJTZXQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIH0KIAotc3RhdGljIHZvaWQgaGFsX25vdGNoX2ZpbHRlcl84MTg4ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgYm9vbCBlbmFibGUpCit2b2lkIHJ0d19oYWxfbm90Y2hfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBib29sIGVuYWJsZSkKIHsKIAlpZiAoZW5hYmxlKSB7CiAJCURCR184OEUoIkVuYWJsZSBub3RjaCBmaWx0ZXJcbiIpOwpAQCAtMTg1LDMyICsxNzgsNiBAQAogCQl1c2Jfd3JpdGU4KGFkYXB0ZXIsIHJPRkRNMF9SeERTUCsxLCB1c2JfcmVhZDgoYWRhcHRlciwgck9GRE0wX1J4RFNQKzEpICYgfkJJVCgxKSk7CiAJfQogfQotdm9pZCBydGw4MTg4ZV9zZXRfaGFsX29wcyhzdHJ1Y3QgaGFsX29wcyAqcEhhbEZ1bmMpCi17Ci0JcEhhbEZ1bmMtPmZyZWVfaGFsX2RhdGEgPSAmcnRsODE4OGVfZnJlZV9oYWxfZGF0YTsKLQotCXBIYWxGdW5jLT5kbV9pbml0ID0gJnJ0bDgxODhlX2luaXRfZG1fcHJpdjsKLQotCXBIYWxGdW5jLT5yZWFkX2NoaXBfdmVyc2lvbiA9ICZSZWFkQ2hpcFZlcnNpb244MTg4RTsKLQotCXBIYWxGdW5jLT5zZXRfYndtb2RlX2hhbmRsZXIgPSAmcGh5X3NldF9id19tb2RlOwotCXBIYWxGdW5jLT5zZXRfY2hhbm5lbF9oYW5kbGVyID0gJnBoeV9zd19jaG5sOwotCi0JcEhhbEZ1bmMtPmhhbF9kbV93YXRjaGRvZyA9ICZydGw4MTg4ZV9IYWxEbVdhdGNoRG9nOwotCi0JcEhhbEZ1bmMtPkFkZF9SYXRlQVRpZCA9ICZydGw4MTg4ZV9BZGRfUmF0ZUFUaWQ7Ci0KLQlwSGFsRnVuYy0+QW50RGl2QmVmb3JlTGlua0hhbmRsZXIgPSAmQW50RGl2QmVmb3JlTGluazgxODhFOwotCXBIYWxGdW5jLT5BbnREaXZDb21wYXJlSGFuZGxlciA9ICZBbnREaXZDb21wYXJlODE4OEU7Ci0JcEhhbEZ1bmMtPnJlYWRfcmZyZWcgPSAmcGh5X3F1ZXJ5X3JmX3JlZzsKLQotCXBIYWxGdW5jLT5zcmVzZXRfaW5pdF92YWx1ZSA9ICZzcmVzZXRfaW5pdF92YWx1ZTsKLQlwSGFsRnVuYy0+c3Jlc2V0X2dldF93aWZpX3N0YXR1cyAgPSAmc3Jlc2V0X2dldF93aWZpX3N0YXR1czsKLQotCXBIYWxGdW5jLT5TZXRIYWxPRE1WYXJIYW5kbGVyID0gJnJ0bDgxODhlX1NldEhhbE9ETVZhcjsKLQotCXBIYWxGdW5jLT5oYWxfbm90Y2hfZmlsdGVyID0gJmhhbF9ub3RjaF9maWx0ZXJfODE4OGU7Ci19CiAKIC8qICAqLwogLyogICovCkBAIC01MDEsNyArNDY4LDcgQEAKIAogdm9pZCBIYWxfUmVhZFR4UG93ZXJJbmZvODhFKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKlBST01Db250ZW50LCBib29sIEF1dG9Mb2FkRmFpbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gcGFkYXB0ZXItPkhhbERhdGE7CiAJc3RydWN0IHR4cG93ZXJpbmZvMjRnIHB3ckluZm8yNEc7CiAJdTggcmZQYXRoLCBjaCwgZ3JvdXA7CiAJdTggYkluMjRHLCBUeENvdW50OwpAQCAtNTUzLDcgKzUyMCw3IEBACiAKIHZvaWQgSGFsX0VmdXNlUGFyc2VYdGFsXzgxODhFKHN0cnVjdCBhZGFwdGVyICpwQWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IHBBZGFwdGVyLT5IYWxEYXRhOwogCiAJaWYgKCFBdXRvTG9hZEZhaWwpIHsKIAkJcEhhbERhdGEtPkNyeXN0YWxDYXAgPSBod2luZm9bRUVQUk9NX1hUQUxfODhFXTsKQEAgLTU2Nyw3ICs1MzQsNyBAQAogCiB2b2lkIEhhbF9FZnVzZVBhcnNlQm9hcmRUeXBlODhFKHN0cnVjdCBhZGFwdGVyICpwQWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IHBBZGFwdGVyLT5IYWxEYXRhOwogCiAJaWYgKCFBdXRvTG9hZEZhaWwpCiAJCXBIYWxEYXRhLT5Cb2FyZFR5cGUgPSAoaHdpbmZvW0VFUFJPTV9SRl9CT0FSRF9PUFRJT05fODhFXQpAQCAtNTc5LDcgKzU0Niw3IEBACiAKIHZvaWQgSGFsX0VmdXNlUGFyc2VFRVBST01WZXI4OEUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gcGFkYXB0ZXItPkhhbERhdGE7CiAKIAlpZiAoIUF1dG9Mb2FkRmFpbCkgewogCQlwSGFsRGF0YS0+RUVQUk9NVmVyc2lvbiA9IGh3aW5mb1tFRVBST01fVkVSU0lPTl84OEVdOwpAQCAtNjA2LDcgKzU3Myw3IEBACiAKIHZvaWQgSGFsX0VmdXNlUGFyc2VDdXN0b21lcklEODhFKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IHBhZGFwdGVyLT5IYWxEYXRhOwogCiAJaWYgKCFBdXRvTG9hZEZhaWwpIHsKIAkJcEhhbERhdGEtPkVFUFJPTUN1c3RvbWVySUQgPSBod2luZm9bRUVQUk9NX0NVU1RPTUVSSURfODhFXTsKQEAgLTYxOSw3ICs1ODYsNyBAQAogCiB2b2lkIEhhbF9SZWFkQW50ZW5uYURpdmVyc2l0eTg4RShzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHU4ICpQUk9NQ29udGVudCwgYm9vbCBBdXRvTG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IHBBZGFwdGVyLT5IYWxEYXRhOwogCXN0cnVjdCByZWdpc3RyeV9wcml2CSpyZWdpc3RyeV9wYXIgPSAmcEFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAogCWlmICghQXV0b0xvYWRGYWlsKSB7CkBAIC02NTIsNyArNjE5LDcgQEAKIAogdm9pZCBIYWxfUmVhZFRoZXJtYWxNZXRlcl84OEUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIsIHU4ICpQUk9NQ29udGVudCwgYm9vbCBBdXRvbG9hZEZhaWwpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gQWRhcHRlci0+SGFsRGF0YTsKIAogCS8qICBUaGVybWFsTWV0ZXIgZnJvbSBFRVBST00gKi8KIAlpZiAoIUF1dG9sb2FkRmFpbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX3J4ZGVzYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfcnhkZXNjLmMKaW5kZXggZjExMGM5Ni4uZmEyY2ZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfcnhkZXNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfcnhkZXNjLmMKQEAgLTU3LDEwICs1Nyw5IEBACiAJc2lnbmFsX3N0YXQtPmF2Z192YWwgPSBzaWduYWxfc3RhdC0+dG90YWxfdmFsIC8gc2lnbmFsX3N0YXQtPnRvdGFsX251bTsKIH0KIAotdm9pZCBydGw4MTg4ZV9wcm9jZXNzX3BoeV9pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdm9pZCAqcHJmcmFtZSkKK3ZvaWQgcnRsODE4OGVfcHJvY2Vzc19waHlfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCisJCSAgICAgICAgICAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQogewotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lID0gcHJmcmFtZTsKLQogCS8qICBDaGVjayBSU1NJICovCiAJcHJvY2Vzc19yc3NpKHBhZGFwdGVyLCBwcmVjdmZyYW1lKTsKIAkvKiAgQ2hlY2sgRVZNICovCkBAIC0xNDAsNyArMTM5LDYgQEAKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT5hZGFwdGVyOwogCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKIAlzdHJ1Y3Qgb2RtX3BoeV9zdGF0dXNfaW5mbyAqcFBIWUluZm8gID0gKHN0cnVjdCBvZG1fcGh5X3N0YXR1c19pbmZvICopKCZwYXR0cmliLT5waHlfaW5mbyk7CiAJdTggKndsYW5oZHI7CiAJc3RydWN0IG9kbV9wZXJfcGt0X2luZm8JcGt0X2luZm87CkBAIC0xODEsNyArMTc5LDggQEAKIAkJcGt0X2luZm8uU3RhdGlvbklEID0gcHN0YS0+bWFjX2lkOwogCXBrdF9pbmZvLlJhdGUgPSBwYXR0cmliLT5tY3NfcmF0ZTsKIAotCU9ETV9QaHlTdGF0dXNRdWVyeSgmcEhhbERhdGEtPm9kbXByaXYsIHBQSFlJbmZvLCAodTggKilwcGh5X3N0YXR1cywgJihwa3RfaW5mbykpOworCU9ETV9QaHlTdGF0dXNRdWVyeSgmcGFkYXB0ZXItPkhhbERhdGEtPm9kbXByaXYsIHBQSFlJbmZvLAorCQkJICAgKHU4ICopcHBoeV9zdGF0dXMsICYocGt0X2luZm8pKTsKIAogCXByZWN2ZnJhbWUtPnBzdGEgPSBOVUxMOwogCWlmIChwa3RfaW5mby5iUGFja2V0TWF0Y2hCU1NJRCAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X2xlZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X2xlZC5jCmluZGV4IGQ5ZTY3N2UuLjc4MDY2NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9sZWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfbGVkLmMKQEAgLTQwLDE0ICs0MCwxMyBAQAogdm9pZCBTd0xlZE9mZihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBMRURfODcxeCAqcExlZCkKIHsKIAl1OAlMZWRDZmc7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7CiAKIAlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHwgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKQogCQlnb3RvIGV4aXQ7CiAKIAlMZWRDZmcgPSB1c2JfcmVhZDgocGFkYXB0ZXIsIFJFR19MRURDRkcyKTsvKiAweDRFICovCiAKLQlpZiAocEhhbERhdGEtPmJMZWRPcGVuRHJhaW4pIHsKKwlpZiAocGFkYXB0ZXItPkhhbERhdGEtPmJMZWRPcGVuRHJhaW4pIHsKIAkJCS8qICBPcGVuLWRyYWluIGFycmFuZ2VtZW50IGZvciBjb250cm9sbGluZyB0aGUgTEVEKSAqLwogCQlMZWRDZmcgJj0gMHg5MDsgLyogIFNldCB0byBzb2Z0d2FyZSBjb250cm9sLiAqLwogCQl1c2Jfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTEVEQ0ZHMiwgKExlZENmZyB8IEJJVCgzKSkpOwpAQCAtNjYsMjEgKzY1LDIwIEBACiAKIC8qCURlc2NyaXB0aW9uOiAqLwogLyoJCUluaXRpYWxpemUgYWxsIExFRF84NzF4IG9iamVjdHMuICovCi12b2lkIHJ0bDgxODhldV9Jbml0U3dMZWRzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9zd19sZWRfaW5pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJc3RydWN0IGxlZF9wcml2ICpwbGVkcHJpdiA9ICYocGFkYXB0ZXItPmxlZHByaXYpOwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAgICpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKIAogCXBsZWRwcml2LT5iUmVnVXNlTGVkID0gdHJ1ZTsKIAlwbGVkcHJpdi0+TGVkQ29udHJvbEhhbmRsZXIgPSBMZWRDb250cm9sODE4OGV1OwotCWhhbGRhdGEtPmJMZWRPcGVuRHJhaW4gPSB0cnVlOworCXBhZGFwdGVyLT5IYWxEYXRhLT5iTGVkT3BlbkRyYWluID0gdHJ1ZTsKIAogCUluaXRMZWQ4NzF4KHBhZGFwdGVyLCAmKHBsZWRwcml2LT5Td0xlZDApKTsKIH0KIAogLyoJRGVzY3JpcHRpb246ICovCiAvKgkJRGVJbml0aWFsaXplIGFsbCBMRURfODE5eFVzYiBvYmplY3RzLiAqLwotdm9pZCBydGw4MTg4ZXVfRGVJbml0U3dMZWRzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9zd19sZWRfZGVpbml0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlzdHJ1Y3QgbGVkX3ByaXYJKmxlZHByaXYgPSAmKHBhZGFwdGVyLT5sZWRwcml2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3JlY3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9yZWN2LmMKaW5kZXggMjU1ZDZmMi4uZDA0OTVhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3JlY3YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfcmVjdi5jCkBAIC0xMyw2ICsxMyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgX1JUTDgxODhFVV9SRUNWX0NfCisjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KICNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+CiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAjaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgpAQCAtMjMsNyArMjQsNyBAQAogCiAjaW5jbHVkZSA8cnRsODE4OGVfaGFsLmg+CiAKLWludAlydGw4MTg4ZXVfaW5pdF9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQoraW50CXJ0d19oYWxfaW5pdF9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQogewogCXN0cnVjdCByZWN2X3ByaXYJKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7CiAJaW50CWksIHJlcyA9IF9TVUNDRVNTOwpAQCAtNzIsNiArNzMsNyBAQAogCQkJCQlNQVhfUkVDVkJVRl9TWiArIFJFQ1ZCVUZGX0FMSUdOX1NaLAogCQkJCQlHRlBfS0VSTkVMKTsKIAkJCWlmIChwc2tiKSB7CisJCQkJa21lbWxlYWtfbm90X2xlYWsocHNrYik7CiAJCQkJcHNrYi0+ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7CiAJCQkJdG1wYWRkciA9IChzaXplX3QpcHNrYi0+ZGF0YTsKIAkJCQlhbGlnbm0gPSB0bXBhZGRyICYgKFJFQ1ZCVUZGX0FMSUdOX1NaLTEpOwpAQCAtODcsNyArODksNyBAQAogCXJldHVybiByZXM7CiB9CiAKLXZvaWQgcnRsODE4OGV1X2ZyZWVfcmVjdl9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKK3ZvaWQgcnR3X2hhbF9mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJaW50CWk7CiAJc3RydWN0IHJlY3ZfYnVmCSpwcmVjdmJ1ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfeG1pdC5jCmluZGV4IGVjMjFkOGMuLjg1NjUwYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV94bWl0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3htaXQuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KICNpbmNsdWRlIDxydGw4MTg4ZV9oYWwuaD4KIAotczMyCXJ0bDgxODhldV9pbml0X3htaXRfcHJpdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCitzMzIgcnR3X2hhbF9pbml0X3htaXRfcHJpdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7CiAJc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJmFkYXB0LT54bWl0cHJpdjsKIApAQCAtMzMsMTEgKzMzLDcgQEAKIAogc3RhdGljIHU4IHVyYl96ZXJvX3BhY2tldF9jaGsoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBpbnQgc3opCiB7Ci0JdTggc2V0X3R4X2Rlc2Nfb2Zmc2V0OwotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7Ci0Jc2V0X3R4X2Rlc2Nfb2Zmc2V0ID0gKCgoc3ogKyBUWERFU0NfU0laRSkgJSAgaGFsZGF0YS0+VXNiQnVsa091dFNpemUpID09IDApID8gMSA6IDA7Ci0KLQlyZXR1cm4gc2V0X3R4X2Rlc2Nfb2Zmc2V0OworCXJldHVybiAhKChzeiArIFRYREVTQ19TSVpFKSAlIGFkYXB0LT5IYWxEYXRhLT5Vc2JCdWxrT3V0U2l6ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJ0bDgxODhldV9jYWxfdHhkZXNjX2Noa3N1bShzdHJ1Y3QgdHhfZGVzYwkqcHR4ZGVzYykKQEAgLTE3NSw3ICsxNzEsNyBAQAogCXU4IGRhdGFfcmF0ZSwgcHdyX3N0YXR1cywgb2Zmc2V0OwogCXN0cnVjdCBhZGFwdGVyCQkqYWRhcHQgPSBweG1pdGZyYW1lLT5wYWRhcHRlcjsKIAlzdHJ1Y3QgcGt0X2F0dHJpYgkqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqb2RtcHJpdiA9ICZhZGFwdC0+SGFsRGF0YS0+b2RtcHJpdjsKIAlzdHJ1Y3QgdHhfZGVzYwkqcHR4ZGVzYyA9IChzdHJ1Y3QgdHhfZGVzYyAqKXBtZW07CiAJc3RydWN0IG1sbWVfZXh0X3ByaXYJKnBtbG1lZXh0ID0gJmFkYXB0LT5tbG1lZXh0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfaW5mbwkqcG1sbWVpbmZvID0gJihwbWxtZWV4dC0+bWxtZXh0X2luZm8pOwpAQCAtMjU5LDEyICsyNTUsMTIgQEAKIAkJCXB0eGRlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKDB4MDAwMWZmMDApOy8qIERBVEEvUlRTICBSYXRlIEZCIExNVCAqLwogCiAJCQlpZiAocGF0dHJpYi0+aHRfZW4pIHsKLQkJCQlpZiAoT0RNX1JBX0dldFNob3J0R0lfODE4OEUoJmhhbGRhdGEtPm9kbXByaXYsIHBhdHRyaWItPm1hY19pZCkpCisJCQkJaWYgKE9ETV9SQV9HZXRTaG9ydEdJXzgxODhFKG9kbXByaXYsIHBhdHRyaWItPm1hY19pZCkpCiAJCQkJCXB0eGRlc2MtPnR4ZHc1IHw9IGNwdV90b19sZTMyKFNHSSk7LyogU0dJICovCiAJCQl9Ci0JCQlkYXRhX3JhdGUgPSBPRE1fUkFfR2V0RGVjaXNpb25SYXRlXzgxODhFKCZoYWxkYXRhLT5vZG1wcml2LCBwYXR0cmliLT5tYWNfaWQpOworCQkJZGF0YV9yYXRlID0gT0RNX1JBX0dldERlY2lzaW9uUmF0ZV84MTg4RShvZG1wcml2LCBwYXR0cmliLT5tYWNfaWQpOwogCQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoZGF0YV9yYXRlICYgMHgzRik7Ci0JCQlwd3Jfc3RhdHVzID0gT0RNX1JBX0dldEh3UHdyU3RhdHVzXzgxODhFKCZoYWxkYXRhLT5vZG1wcml2LCBwYXR0cmliLT5tYWNfaWQpOworCQkJcHdyX3N0YXR1cyA9IE9ETV9SQV9HZXRId1B3clN0YXR1c184MTg4RShvZG1wcml2LCBwYXR0cmliLT5tYWNfaWQpOwogCQkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoKHB3cl9zdGF0dXMgJiAweDcpIDw8IFBXUl9TVEFUVVNfU0hUKTsKIAkJfSBlbHNlIHsKIAkJCS8qICBFQVAgZGF0YSBwYWNrZXQgYW5kIEFSUCBwYWNrZXQgYW5kIERIQ1AuICovCkBAIC0zMzIsOCArMzI4LDcgQEAKIAkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoSFdfU1NOKTsJLyogIEh3IHNldCBzZXF1ZW5jZSBudW1iZXIgKi8KIAl9CiAKLQlydGw4OGV1X2RtX3NldF90eF9hbnRfYnlfdHhfaW5mbygmaGFsZGF0YS0+b2RtcHJpdiwgcG1lbSwKLQkJCQkJIHBhdHRyaWItPm1hY19pZCk7CisJcnRsODhldV9kbV9zZXRfdHhfYW50X2J5X3R4X2luZm8ob2RtcHJpdiwgcG1lbSwgcGF0dHJpYi0+bWFjX2lkKTsKIAogCXJ0bDgxODhldV9jYWxfdHhkZXNjX2Noa3N1bShwdHhkZXNjKTsKIAlfZGJnX2R1bXBfdHhfaW5mbyhhZGFwdCwgcHhtaXRmcmFtZS0+ZnJhbWVfdGFnLCBwdHhkZXNjKTsKQEAgLTM4Nyw3ICszODIsNyBAQAogCQl9CiAJCWZmX2h3YWRkciA9IHJ0d19nZXRfZmZfaHdhZGRyKHB4bWl0ZnJhbWUpOwogCi0JCWlubmVyX3JldCA9IHVzYl93cml0ZV9wb3J0KGFkYXB0LCBmZl9od2FkZHIsIHdfc3osICh1bnNpZ25lZCBjaGFyICopcHhtaXRidWYpOworCQlpbm5lcl9yZXQgPSB1c2Jfd3JpdGVfcG9ydChhZGFwdCwgZmZfaHdhZGRyLCB3X3N6LCBweG1pdGJ1Zik7CiAKIAkJcnR3X2NvdW50X3R4X3N0YXRzKGFkYXB0LCBweG1pdGZyYW1lLCBzeik7CiAKQEAgLTQyNCwxMSArNDE5LDExIEBACiAJcmV0dXJuIGxlbjsKIH0KIAotczMyIHJ0bDgxODhldV94bWl0ZnJhbWVfY29tcGxldGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpCitzMzIgcnRsODE4OGV1X3htaXRmcmFtZV9jb21wbGV0ZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lID0gTlVMTDsKIAlzdHJ1Y3QgeG1pdF9mcmFtZSAqcGZpcnN0ZnJhbWUgPSBOVUxMOworCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWY7CiAKIAkvKiAgYWdncmVnYXRlIHZhcmlhYmxlICovCiAJc3RydWN0IGh3X3htaXQgKnBod3htaXQ7CkBAIC00NDEsNyArNDM2LDcgQEAKIAl1MzIgcGJ1Zl90YWlsOwkvKiAgbGFzdCBwa3QgdGFpbCAqLwogCXUzMiBsZW47CS8qICBwYWNrZXQgbGVuZ3RoLCBleGNlcHQgVFhERVNDX1NJWkUgYW5kIFBLVF9PRkZTRVQgKi8KIAotCXUzMiBidWxrc2l6ZSA9IGhhbGRhdGEtPlVzYkJ1bGtPdXRTaXplOworCXUzMiBidWxrc2l6ZSA9IGFkYXB0LT5IYWxEYXRhLT5Vc2JCdWxrT3V0U2l6ZTsKIAl1OCBkZXNjX2NudDsKIAl1MzIgYnVsa3B0cjsKIApAQCAtNDUwLDEyICs0NDUsOSBAQAogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4MTkyY194bWl0X2NfLCBfZHJ2X2luZm9fLCAoIit4bWl0ZnJhbWVfY29tcGxldGVcbiIpKTsKIAotCS8qICBjaGVjayB4bWl0YnVmZmVyIGlzIG9rICovCi0JaWYgKHB4bWl0YnVmID09IE5VTEwpIHsKLQkJcHhtaXRidWYgPSBydHdfYWxsb2NfeG1pdGJ1ZihweG1pdHByaXYpOwotCQlpZiAocHhtaXRidWYgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKLQl9CisJcHhtaXRidWYgPSBydHdfYWxsb2NfeG1pdGJ1ZihweG1pdHByaXYpOworCWlmIChweG1pdGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CiAKIAkvKiAzIDEuIHBpY2sgdXAgZmlyc3QgZnJhbWUgKi8KIAlydHdfZnJlZV94bWl0ZnJhbWUocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKQEAgLTU2NSw3ICs1NTcsNyBAQAogCiAJCWlmIChwYnVmIDwgYnVsa3B0cikgewogCQkJZGVzY19jbnQrKzsKLQkJCWlmIChkZXNjX2NudCA9PSBoYWxkYXRhLT5Vc2JUeEFnZ0Rlc2NOdW0pCisJCQlpZiAoZGVzY19jbnQgPT0gYWRhcHQtPkhhbERhdGEtPlVzYlR4QWdnRGVzY051bSkKIAkJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCWRlc2NfY250ID0gMDsKQEAgLTU5NCw3ICs1ODYsNyBAQAogCiAJLyogMyA0LiB3cml0ZSB4bWl0IGJ1ZmZlciB0byBVU0IgRklGTyAqLwogCWZmX2h3YWRkciA9IHJ0d19nZXRfZmZfaHdhZGRyKHBmaXJzdGZyYW1lKTsKLQl1c2Jfd3JpdGVfcG9ydChhZGFwdCwgZmZfaHdhZGRyLCBwYnVmX3RhaWwsICh1OCAqKXB4bWl0YnVmKTsKKwl1c2Jfd3JpdGVfcG9ydChhZGFwdCwgZmZfaHdhZGRyLCBwYnVmX3RhaWwsIHB4bWl0YnVmKTsKIAogCS8qIDMgNS4gdXBkYXRlIHN0YXRpc2l0YyAqLwogCXBidWZfdGFpbCAtPSAocGZpcnN0ZnJhbWUtPmFnZ19udW0gKiBUWERFU0NfU0laRSk7CkBAIC02MDcsMjQgKzU5OSwxMiBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgczMyIHhtaXRmcmFtZV9kaXJlY3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlzMzIgcmVzOwotCi0JcmVzID0gcnR3X3htaXRmcmFtZV9jb2FsZXNjZShhZGFwdCwgcHhtaXRmcmFtZS0+cGt0LCBweG1pdGZyYW1lKTsKLQlpZiAocmVzID09IF9TVUNDRVNTKQotCQlydHdfZHVtcF94ZnJhbWUoYWRhcHQsIHB4bWl0ZnJhbWUpOwotCWVsc2UKLQkJREJHXzg4RSgiPT0+ICVzIHhtaXRmcmFtZV9jb2Fsc2VjZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQlyZXR1cm4gcmVzOwotfQotCiAvKgogICogUmV0dXJuCiAgKgl0cnVlCWR1bXAgcGFja2V0IGRpcmVjdGx5CiAgKglmYWxzZQllbnF1ZXVlIHBhY2tldAogICovCi1zdGF0aWMgczMyIHByZV94bWl0ZnJhbWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKK3MzMiBydHdfaGFsX3htaXQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKIHsKIAlzMzIgcmVzOwogCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYgPSBOVUxMOwpAQCAtNjUwLDcgKzYzMCwxMiBAQAogCXB4bWl0ZnJhbWUtPmJ1Zl9hZGRyID0gcHhtaXRidWYtPnBidWY7CiAJcHhtaXRidWYtPnByaXZfZGF0YSA9IHB4bWl0ZnJhbWU7CiAKLQlpZiAoeG1pdGZyYW1lX2RpcmVjdChhZGFwdCwgcHhtaXRmcmFtZSkgIT0gX1NVQ0NFU1MpIHsKKwlyZXMgPSBydHdfeG1pdGZyYW1lX2NvYWxlc2NlKGFkYXB0LCBweG1pdGZyYW1lLT5wa3QsIHB4bWl0ZnJhbWUpOworCisJaWYgKHJlcyA9PSBfU1VDQ0VTUykgeworCQlydHdfZHVtcF94ZnJhbWUoYWRhcHQsIHB4bWl0ZnJhbWUpOworCX0gZWxzZSB7CisJCURCR184OEUoIj09PiAlcyB4bWl0ZnJhbWVfY29hbHNlY2UgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJ0d19mcmVlX3htaXRidWYocHhtaXRwcml2LCBweG1pdGJ1Zik7CiAJCXJ0d19mcmVlX3htaXRmcmFtZShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwogCX0KQEAgLTY3NCwyMCArNjU5LDEwIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zMzIgcnRsODE4OGV1X21nbnRfeG1pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKQorczMyIHJ0d19oYWxfbWdudF94bWl0KHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUpCiB7CiAJc3RydWN0IHhtaXRfcHJpdiAqeG1pdHByaXYgPSAmYWRhcHQtPnhtaXRwcml2OwogCiAJcnRsODhldV9tb25feG1pdF9ob29rKGFkYXB0LT5wbW9uZGV2LCBwbWdudGZyYW1lLCB4bWl0cHJpdi0+ZnJhZ19sZW4pOwogCXJldHVybiBydHdfZHVtcF94ZnJhbWUoYWRhcHQsIHBtZ250ZnJhbWUpOwogfQotCi0vKgotICogUmV0dXJuCi0gKgl0cnVlCWR1bXAgcGFja2V0IGRpcmVjdGx5IG9rCi0gKglmYWxzZQl0ZW1wb3JhcnkgY2FuJ3QgdHJhbnNtaXQgcGFja2V0cyB0byBoYXJkd2FyZQotICovCi1zMzIgcnRsODE4OGV1X2hhbF94bWl0KHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JcmV0dXJuIHByZV94bWl0ZnJhbWUoYWRhcHQsIHB4bWl0ZnJhbWUpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9oYWxpbml0LmMKaW5kZXggMzYzZjNhMy4uNzY5MmNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2JfaGFsaW5pdC5jCkBAIC0yMSwxNCArMjEsMTMgQEAKICNpbmNsdWRlIDxydGw4MTg4ZV9oYWwuaD4KICNpbmNsdWRlIDxydGw4MTg4ZV9sZWQuaD4KICNpbmNsdWRlIDxydHdfaW9sLmg+Ci0jaW5jbHVkZSA8dXNiX2hhbC5oPgogI2luY2x1ZGUgPHBoeS5oPgogCiAjZGVmaW5lCQlIQUxfQkJfRU5BQkxFCQkxCiAKIHN0YXRpYyB2b2lkIF9Db25maWdOb3JtYWxDaGlwT3V0RVBfODE4OEUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1OCBOdW1PdXRQaXBlKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YQk9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gYWRhcHQtPkhhbERhdGE7CiAKIAlzd2l0Y2ggKE51bU91dFBpcGUpIHsKIAljYXNlCTM6CkBAIC01MSwxMyArNTAsMTIgQEAKIAogc3RhdGljIGJvb2wgSGFsVXNiU2V0UXVldWVQaXBlTWFwcGluZzgxODhFVXNiKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggTnVtSW5QaXBlLCB1OCBOdW1PdXRQaXBlKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YQk9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAJYm9vbAkJCXJlc3VsdAkJPSBmYWxzZTsKIAogCV9Db25maWdOb3JtYWxDaGlwT3V0RVBfODE4OEUoYWRhcHQsIE51bU91dFBpcGUpOwogCiAJLyogIE5vcm1hbCBjaGlwIHdpdGggb25lIElOIGFuZCBvbmUgT1VUIGRvZXNuJ3QgaGF2ZSBpbnRlcnJ1cHQgSU4gRVAuICovCi0JaWYgKGhhbGRhdGEtPk91dEVwTnVtYmVyID09IDEpIHsKKwlpZiAoYWRhcHQtPkhhbERhdGEtPk91dEVwTnVtYmVyID09IDEpIHsKIAkJaWYgKE51bUluUGlwZSAhPSAxKQogCQkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC02OSw5ICs2Nyw5IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgcnRsODE4OGV1X2ludGVyZmFjZV9jb25maWd1cmUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQordm9pZCBydHdfaGFsX2NoaXBfY29uZmlndXJlKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEJPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXN0cnVjdCBkdm9ial9wcml2CSpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihhZGFwdCk7CiAKIAlpZiAocGR2b2JqcHJpdi0+aXNoaWdoc3BlZWQpCkBAIC05NCwxMiArOTIsMTEgQEAKIAkJCQlwZHZvYmpwcml2LT5SdE51bUluUGlwZXMsIHBkdm9ianByaXYtPlJ0TnVtT3V0UGlwZXMpOwogfQogCi1zdGF0aWMgdTMyIHJ0bDgxODhldV9Jbml0UG93ZXJPbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCit1MzIgcnR3X2hhbF9wb3dlcl9vbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7CiAJdTE2IHZhbHVlMTY7CiAJLyogIEhXIFBvd2VyIG9uIHNlcXVlbmNlICovCi0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhCT0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQlpZiAoaGFsZGF0YS0+Yk1hY1B3ckN0cmxPbikKKwlpZiAoYWRhcHQtPkhhbERhdGEtPmJNYWNQd3JDdHJsT24pCiAJCXJldHVybiBfU1VDQ0VTUzsKIAogCWlmICghcnRsODhldV9wd3JzZXFjbWRwYXJzaW5nKGFkYXB0LCBQV1JfQ1VUX0FMTF9NU0ssCkBAIC0xMTksNyArMTE2LDcgQEAKIAkvKiAgZm9yIFNESU8gLSBTZXQgQ1IgYml0MTAgdG8gZW5hYmxlIDMyayBjYWxpYnJhdGlvbi4gU3VnZ2VzdGVkIGJ5IFNEMSBHaW1teS4gQWRkZWQgYnkgdHlubGkuIDIwMTEuMDguMzEuICovCiAKIAl1c2Jfd3JpdGUxNihhZGFwdCwgUkVHX0NSLCB2YWx1ZTE2KTsKLQloYWxkYXRhLT5iTWFjUHdyQ3RybE9uID0gdHJ1ZTsKKwlhZGFwdC0+SGFsRGF0YS0+Yk1hY1B3ckN0cmxPbiA9IHRydWU7CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC0xMjksMTggKzEyNiwxNyBAQAogewogCXUzMiBpbXIsIGltcl9leDsKIAl1OCAgdXNiX29wdDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAKIAkvKiBISVNSIHdyaXRlIG9uZSB0byBjbGVhciAqLwogCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19ISVNSXzg4RSwgMHhGRkZGRkZGRik7CiAJLyogIEhJTVIgLSAqLwogCWltciA9IElNUl9QU1RJTUVPVVRfODhFIHwgSU1SX1RCREVSXzg4RSB8IElNUl9DUFdNXzg4RSB8IElNUl9DUFdNMl84OEU7CiAJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX0hJTVJfODhFLCBpbXIpOwotCWhhbGRhdGEtPkludHJNYXNrWzBdID0gaW1yOworCUFkYXB0ZXItPkhhbERhdGEtPkludHJNYXNrWzBdID0gaW1yOwogCiAJaW1yX2V4ID0gSU1SX1RYRVJSXzg4RSB8IElNUl9SWEVSUl84OEUgfCBJTVJfVFhGT1ZXXzg4RSB8IElNUl9SWEZPVldfODhFOwogCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19ISU1SRV84OEUsIGltcl9leCk7Ci0JaGFsZGF0YS0+SW50ck1hc2tbMV0gPSBpbXJfZXg7CisJQWRhcHRlci0+SGFsRGF0YS0+SW50ck1hc2tbMV0gPSBpbXJfZXg7CiAKIAkvKiAgUkVHX1VTQl9TUEVDSUFMX09QVElPTiAtIEJJVCg0KSAqLwogCS8qICAwOyBVc2UgaW50ZXJydXB0IGVuZHBvaW50IHRvIHVwbG9hZCBpbnRlcnJ1cHQgcGt0ICovCkBAIC0xNTcsNyArMTUzLDYgQEAKIAogc3RhdGljIHZvaWQgX0luaXRRdWV1ZVJlc2VydmVkUGFnZShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCXN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVnaXN0cnlwcml2ID0gJkFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAl1MzIgbnVtSFEJPSAwOwogCXUzMiBudW1MUQk9IDA7CkBAIC0xNjgsMTQgKzE2MywxNCBAQAogCWJvb2wgYldpRmlDb25maWcgPSBwcmVnaXN0cnlwcml2LT53aWZpX3NwZWM7CiAKIAlpZiAoYldpRmlDb25maWcpIHsKLQkJaWYgKGhhbGRhdGEtPk91dEVwUXVldWVTZWwgJiBUWF9TRUxFX0hRKQorCQlpZiAoQWRhcHRlci0+SGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCAmIFRYX1NFTEVfSFEpCiAJCQludW1IUSA9ICAweDI5OwogCi0JCWlmIChoYWxkYXRhLT5PdXRFcFF1ZXVlU2VsICYgVFhfU0VMRV9MUSkKKwkJaWYgKEFkYXB0ZXItPkhhbERhdGEtPk91dEVwUXVldWVTZWwgJiBUWF9TRUxFX0xRKQogCQkJbnVtTFEgPSAweDFDOwogCiAJCS8qICBOT1RFOiBUaGlzIHN0ZXAgc2hhbGwgYmUgcHJvY2VlZCBiZWZvcmUgd3JpdGluZyBSRUdfUlFQTi4gKi8KLQkJaWYgKGhhbGRhdGEtPk91dEVwUXVldWVTZWwgJiBUWF9TRUxFX05RKQorCQlpZiAoQWRhcHRlci0+SGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCAmIFRYX1NFTEVfTlEpCiAJCQludW1OUSA9IDB4MUM7CiAJCXZhbHVlOCA9ICh1OClfTlBRKG51bU5RKTsKIAkJdXNiX3dyaXRlOChBZGFwdGVyLCBSRUdfUlFQTl9OUFEsIHZhbHVlOCk7CkBAIC0yMjUsMTAgKzIyMCw5IEBACiAKIHN0YXRpYyB2b2lkIF9Jbml0Tm9ybWFsQ2hpcE9uZU91dEVwUHJpb3JpdHkoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhCT0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCiAJdTE2IHZhbHVlID0gMDsKLQlzd2l0Y2ggKGhhbGRhdGEtPk91dEVwUXVldWVTZWwpIHsKKworCXN3aXRjaCAoQWRhcHRlci0+SGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCkgewogCWNhc2UgVFhfU0VMRV9IUToKIAkJdmFsdWUgPSBRVUVVRV9ISUdIOwogCQlicmVhazsKQEAgLTI0NywxMyArMjQxLDEyIEBACiAKIHN0YXRpYyB2b2lkIF9Jbml0Tm9ybWFsQ2hpcFR3b091dEVwUHJpb3JpdHkoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhCT0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJkFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAl1MTYgYmVRLCBia1EsIHZpUSwgdm9RLCBtZ3RRLCBoaVE7CiAJdTE2IHZhbHVlSGkgPSAwOwogCXUxNiB2YWx1ZUxvdyA9IDA7CiAKLQlzd2l0Y2ggKGhhbGRhdGEtPk91dEVwUXVldWVTZWwpIHsKKwlzd2l0Y2ggKEFkYXB0ZXItPkhhbERhdGEtPk91dEVwUXVldWVTZWwpIHsKIAljYXNlIChUWF9TRUxFX0hRIHwgVFhfU0VMRV9MUSk6CiAJCXZhbHVlSGkgPSBRVUVVRV9ISUdIOwogCQl2YWx1ZUxvdyA9IFFVRVVFX0xPVzsKQEAgLTMxMyw5ICszMDYsNyBAQAogCiBzdGF0aWMgdm9pZCBfSW5pdFF1ZXVlUHJpb3JpdHkoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0Jc3dpdGNoIChoYWxkYXRhLT5PdXRFcE51bWJlcikgeworCXN3aXRjaCAoQWRhcHRlci0+SGFsRGF0YS0+T3V0RXBOdW1iZXIpIHsKIAljYXNlIDE6CiAJCV9Jbml0Tm9ybWFsQ2hpcE9uZU91dEVwUHJpb3JpdHkoQWRhcHRlcik7CiAJCWJyZWFrOwpAQCAtMzU3LDcgKzM0OCw3IEBACiAKIHN0YXRpYyB2b2lkIF9Jbml0V01BQ1NldHRpbmcoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAKIAloYWxkYXRhLT5SZWNlaXZlQ29uZmlnID0gUkNSX0FBUCB8IFJDUl9BUE0gfCBSQ1JfQU0gfCBSQ1JfQUIgfAogCQkJCSAgUkNSX0NCU1NJRF9EQVRBIHwgUkNSX0NCU1NJRF9CQ04gfApAQCAtNDU2LDcgKzQ0Nyw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIHVzYl9BZ2dTZXR0aW5nVHhVcGRhdGUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAJdTMyIHZhbHVlMzI7CiAKIAlpZiAoQWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYykKQEAgLTQ5Miw3ICs0ODMsNyBAQAogCQlzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcgogCSkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gQWRhcHRlci0+SGFsRGF0YTsKIAl1OCB2YWx1ZURNQTsKIAl1OCB2YWx1ZVVTQjsKIApAQCAtNTY2LDggKzU1Nyw2IEBACiAKIHN0YXRpYyB2b2lkIEluaXRVc2JBZ2dyZWdhdGlvblNldHRpbmcoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCiAJLyogIFR4IGFnZ3JlZ2F0aW9uIHNldHRpbmcgKi8KIAl1c2JfQWdnU2V0dGluZ1R4VXBkYXRlKEFkYXB0ZXIpOwogCkBAIC01NzUsMTIgKzU2NCwxMiBAQAogCXVzYl9BZ2dTZXR0aW5nUnhVcGRhdGUoQWRhcHRlcik7CiAKIAkvKiAgMjAxLzEyLzEwIE1IIEFkZCBmb3IgVVNCIGFnZyBtb2RlIGR5bmFtaWMgc3dpdGNoLiAqLwotCWhhbGRhdGEtPlVzYlJ4SGlnaFNwZWVkTW9kZSA9IGZhbHNlOworCUFkYXB0ZXItPkhhbERhdGEtPlVzYlJ4SGlnaFNwZWVkTW9kZSA9IGZhbHNlOwogfQogCiBzdGF0aWMgdm9pZCBfSW5pdEJlYWNvblBhcmFtZXRlcnMoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAKIAl1c2Jfd3JpdGUxNihBZGFwdGVyLCBSRUdfQkNOX0NUUkwsIDB4MTAxMCk7CiAKQEAgLTYyMiw3ICs2MTEsNyBAQAogCiBzdGF0aWMgdm9pZCBfSW5pdEFudGVubmFfU2VsZWN0aW9uKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YQk9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBBZGFwdGVyLT5IYWxEYXRhOwogCiAJaWYgKGhhbGRhdGEtPkFudERpdkNmZyA9PSAwKQogCQlyZXR1cm47CkBAIC02NzIsMTMgKzY2MSwxMyBAQAogCXJldHVybiByZnBvd2Vyc3RhdGU7CiB9CS8qICBIYWxEZXRlY3RQd3JEb3duTW9kZSAqLwogCi1zdGF0aWMgdTMyIHJ0bDgxODhldV9oYWxfaW5pdChzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKK3UzMiBydGw4MTg4ZXVfaGFsX2luaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJdTggdmFsdWU4ID0gMDsKIAl1MTYgIHZhbHVlMTY7CiAJdTggdHhwa3RidWZfYm5keTsKIAl1MzIgc3RhdHVzID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBBZGFwdGVyLT5IYWxEYXRhOwogCXN0cnVjdCBwd3JjdHJsX3ByaXYJCSpwd3JjdHJscHJpdiA9ICZBZGFwdGVyLT5wd3JjdHJscHJpdjsKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ2lzdHJ5cHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7CiAJdW5zaWduZWQgbG9uZyBpbml0X3N0YXJ0X3RpbWUgPSBqaWZmaWVzOwpAQCAtNzAyLDcgKzY5MSw3IEBACiAJfQogCiAJSEFMX0lOSVRfUFJPRklMRV9UQUcoSEFMX0lOSVRfU1RBR0VTX0lOSVRfUFdfT04pOwotCXN0YXR1cyA9IHJ0bDgxODhldV9Jbml0UG93ZXJPbihBZGFwdGVyKTsKKwlzdGF0dXMgPSBydHdfaGFsX3Bvd2VyX29uKEFkYXB0ZXIpOwogCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywgKCJGYWlsZWQgdG8gaW5pdCBwb3dlciBvbiFcbiIpKTsKIAkJZ290byBleGl0OwpAQCAtODEwLDggKzc5OSw4IEBACiAJdXNiX3dyaXRlMTYoQWRhcHRlciwgUkVHX1BLVF9CRV9CS19MSUZFX1RJTUUsIDB4MDQwMCk7CS8qICB1bml0OiAyNTZ1cy4gMjU2bXMgKi8KIAogCS8qIEtlZXAgUmZSZWdDaG5sVmFsIGZvciBsYXRlciB1c2UuICovCi0JaGFsZGF0YS0+UmZSZWdDaG5sVmFsWzBdID0gcGh5X3F1ZXJ5X3JmX3JlZyhBZGFwdGVyLCAoZW51bSByZl9yYWRpb19wYXRoKTAsIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzayk7Ci0JaGFsZGF0YS0+UmZSZWdDaG5sVmFsWzFdID0gcGh5X3F1ZXJ5X3JmX3JlZyhBZGFwdGVyLCAoZW51bSByZl9yYWRpb19wYXRoKTEsIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzayk7CisJaGFsZGF0YS0+UmZSZWdDaG5sVmFsWzBdID0gcnR3X2hhbF9yZWFkX3JmcmVnKEFkYXB0ZXIsIChlbnVtIHJmX3JhZGlvX3BhdGgpMCwgUkZfQ0hOTEJXLCBiUkZSZWdPZmZzZXRNYXNrKTsKKwloYWxkYXRhLT5SZlJlZ0NobmxWYWxbMV0gPSBydHdfaGFsX3JlYWRfcmZyZWcoQWRhcHRlciwgKGVudW0gcmZfcmFkaW9fcGF0aCkxLCBSRl9DSE5MQlcsIGJSRlJlZ09mZnNldE1hc2spOwogCiBIQUxfSU5JVF9QUk9GSUxFX1RBRyhIQUxfSU5JVF9TVEFHRVNfVFVSTl9PTl9CTE9DSyk7CiAJX0JCVHVybk9uQmxvY2soQWRhcHRlcik7CkBAIC05MDUsNyArODk0LDYgQEAKIHN0YXRpYyB2b2lkIENhcmREaXNhYmxlUlRMODE4OEVVKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewogCXU4IHZhbDg7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhCT0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICgiQ2FyZERpc2FibGVSVEw4MTg4RVVcbiIpKTsKIApAQCAtOTU4LDcgKzk0Niw3IEBACiAJdmFsOCA9IHVzYl9yZWFkOChBZGFwdGVyLCBSRUdfR1BJT19JT19TRUwrMSk7CiAJdXNiX3dyaXRlOChBZGFwdGVyLCBSRUdfR1BJT19JT19TRUwrMSwgdmFsOHwweDBGKTsvKiBSZWcweDQzICovCiAJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX0JCX1BBRF9DVFJMLCAweDAwMDgwODA4KTsvKiBzZXQgTE5BICxUUlNXLEVYX1BBIFBpbiB0byBvdXRwdXQgbW9kZSAqLwotCWhhbGRhdGEtPmJNYWNQd3JDdHJsT24gPSBmYWxzZTsKKwlBZGFwdGVyLT5IYWxEYXRhLT5iTWFjUHdyQ3RybE9uID0gZmFsc2U7CiAJQWRhcHRlci0+YkZXUmVhZHkgPSBmYWxzZTsKIH0KIApAQCAtOTcyLDcgKzk2MCw3IEBACiAJdXNiX3dyaXRlMTYoYWRhcHQsIFJFR19BUFNfRlNNQ08sIDB4ODgxMik7CiB9CiAKLXN0YXRpYyB1MzIgcnRsODE4OGV1X2hhbF9kZWluaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCit1MzIgcnRsODE4OGV1X2hhbF9kZWluaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJREJHXzg4RSgiPT0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAKQEAgLTk5NCw3ICs5ODIsNyBAQAogCXJldHVybiBfU1VDQ0VTUzsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBydGw4MTg4ZXVfaW5pcnBfaW5pdChzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlcikKK3UzMiBydHdfaGFsX2luaXJwX2luaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJdTggaTsKIAlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOwpAQCAtMTAyOSwxNyArMTAxNyw2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBydGw4MTg4ZXVfaW5pcnBfZGVpbml0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQotewotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAoIlxuID09PT4gdXNiX3J4X2RlaW5pdFxuIikpOwotCi0JdXNiX3JlYWRfcG9ydF9jYW5jZWwoQWRhcHRlcik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgKCJcbiA8PT09IHVzYl9yeF9kZWluaXRcbiIpKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQogLyogICovCiAvKiAgKi8KIC8qCUVFUFJPTS9FRlVTRSBDb250ZW50IFBhcnNpbmcgKi8KQEAgLTEwNDcsNyArMTAyNCw3IEBACiAvKiAgKi8KIHN0YXRpYyB2b2lkIEhhbF9FZnVzZVBhcnNlUElEVklEXzgxODhFVShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gYWRhcHQtPkhhbERhdGE7CiAKIAlpZiAoIUF1dG9Mb2FkRmFpbCkgewogCQkvKiAgVklELCBQSUQgKi8KQEAgLTExMzIsMTIgKzExMDksMTAgQEAKIAogc3RhdGljIHZvaWQgX1JlYWRSRlR5cGUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JaGFsZGF0YS0+cmZfY2hpcCA9IFJGXzYwNTI7CisJQWRhcHRlci0+SGFsRGF0YS0+cmZfY2hpcCA9IFJGXzYwNTI7CiB9CiAKLXN0YXRpYyB2b2lkIF9SZWFkQWRhcHRlckluZm84MTg4RVUoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfcmVhZF9jaGlwX2luZm8oc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7CiAKQEAgLTExNTcsNyArMTEzMiw3IEBACiAKIHN0YXRpYyB2b2lkIFJlc3VtZVR4QmVhY29uKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCiAJLyogIDIwMTAuMDMuMDEuIE1hcmtlZCBieSB0eW5saS4gTm8gbmVlZCB0byBjYWxsIHdvcmtpdGVtIGJlYWNhdXNlIHdlIHJlY29yZCB0aGUgdmFsdWUgKi8KIAkvKiAgd2hpY2ggc2hvdWxkIGJlIHJlYWQgZnJvbSByZWdpc3RlciB0byBhIGdsb2JhbCB2YXJpYWJsZS4gKi8KQEAgLTExNzEsNyArMTE0Niw3IEBACiAKIHN0YXRpYyB2b2lkIFN0b3BUeEJlYWNvbihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAogCS8qICAyMDEwLjAzLjAxLiBNYXJrZWQgYnkgdHlubGkuIE5vIG5lZWQgdG8gY2FsbCB3b3JraXRlbSBiZWFjYXVzZSB3ZSByZWNvcmQgdGhlIHZhbHVlICovCiAJLyogIHdoaWNoIHNob3VsZCBiZSByZWFkIGZyb20gcmVnaXN0ZXIgdG8gYSBnbG9iYWwgdmFyaWFibGUuICovCkBAIC0xMjc2LDkgKzEyNTEsOSBAQAogCQl1c2Jfd3JpdGU4KEFkYXB0ZXIsIGJjbl9jdHJsX3JlZywgdXNiX3JlYWQ4KEFkYXB0ZXIsIGJjbl9jdHJsX3JlZykmKH4oRU5fQkNOX0ZVTkNUSU9OIHwgRU5fVFhCQ05fUlBUKSkpOwogfQogCi1zdGF0aWMgdm9pZCBTZXRId1JlZzgxODhFVShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgdTggdmFyaWFibGUsIHU4ICp2YWwpCit2b2lkIHJ0d19oYWxfc2V0X2h3cmVnKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCB1OCB2YXJpYWJsZSwgdTggKnZhbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gQWRhcHRlci0+SGFsRGF0YTsKIAlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZoYWxkYXRhLT5kbXByaXY7CiAJc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBvZG1wcml2ID0gJmhhbGRhdGEtPm9kbXByaXY7CiAKQEAgLTE0MjYsMTcgKzE0MDEsOCBAQAogCQkJCS8qIGVuYWJsZSB1cGRhdGUgVFNGICovCiAJCQkJdXNiX3dyaXRlOChBZGFwdGVyLCBSRUdfQkNOX0NUUkwsIHVzYl9yZWFkOChBZGFwdGVyLCBSRUdfQkNOX0NUUkwpJih+QklUKDQpKSk7CiAJCQl9Ci0JCQlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gV0lGSV9GV19BUF9TVEFURSkgewotCQkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQ1IsIHVzYl9yZWFkMzIoQWRhcHRlciwgUkVHX1JDUil8UkNSX0NCU1NJRF9CQ04pOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoQWRhcHRlci0+aW5fY3RhX3Rlc3QpIHsKLQkJCQkJdTMyIHYgPSB1c2JfcmVhZDMyKEFkYXB0ZXIsIFJFR19SQ1IpOwotCQkJCQl2ICY9IH4oUkNSX0NCU1NJRF9EQVRBIHwgUkNSX0NCU1NJRF9CQ04pOy8qICBSQ1JfQURGICovCi0JCQkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQ1IsIHYpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXVzYl93cml0ZTMyKEFkYXB0ZXIsIFJFR19SQ1IsIHVzYl9yZWFkMzIoQWRhcHRlciwgUkVHX1JDUil8UkNSX0NCU1NJRF9CQ04pOwotCQkJCX0KLQkJCX0KKworCQkJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX1JDUiwgdXNiX3JlYWQzMihBZGFwdGVyLCBSRUdfUkNSKXxSQ1JfQ0JTU0lEX0JDTik7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBIV19WQVJfTUxNRV9KT0lOOgpAQCAtMTQ0OSwxMyArMTQxNSw3IEBACiAJCQkJLyogZW5hYmxlIHRvIHJ4IGRhdGEgZnJhbWUuQWNjZXB0IGFsbCBkYXRhIGZyYW1lICovCiAJCQkJdXNiX3dyaXRlMTYoQWRhcHRlciwgUkVHX1JYRkxUTUFQMiwgMHhGRkZGKTsKIAotCQkJCWlmIChBZGFwdGVyLT5pbl9jdGFfdGVzdCkgewotCQkJCQl1MzIgdiA9IHVzYl9yZWFkMzIoQWRhcHRlciwgUkVHX1JDUik7Ci0JCQkJCXYgJj0gfihSQ1JfQ0JTU0lEX0RBVEEgfCBSQ1JfQ0JTU0lEX0JDTik7LyogIFJDUl9BREYgKi8KLQkJCQkJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX1JDUiwgdik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdXNiX3dyaXRlMzIoQWRhcHRlciwgUkVHX1JDUiwgdXNiX3JlYWQzMihBZGFwdGVyLCBSRUdfUkNSKXxSQ1JfQ0JTU0lEX0RBVEF8UkNSX0NCU1NJRF9CQ04pOwotCQkJCX0KKwkJCQl1c2Jfd3JpdGUzMihBZGFwdGVyLCBSRUdfUkNSLCB1c2JfcmVhZDMyKEFkYXB0ZXIsIFJFR19SQ1IpfFJDUl9DQlNTSURfREFUQXxSQ1JfQ0JTU0lEX0JDTik7CiAKIAkJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpCiAJCQkJCVJldHJ5TGltaXQgPSAoaGFsZGF0YS0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfQ0NYKSA/IDcgOiA0ODsKQEAgLTE1MjUsOSArMTQ4NSw2IEBACiAJY2FzZSBIV19WQVJfU0VDX0NGRzoKIAkJdXNiX3dyaXRlOChBZGFwdGVyLCBSRUdfU0VDQ0ZHLCAqKCh1OCAqKXZhbCkpOwogCQlicmVhazsKLQljYXNlIEhXX1ZBUl9ETV9GTEFHOgotCQlwb2RtcHJpdi0+U3VwcG9ydEFiaWxpdHkgPSAqKCh1OCAqKXZhbCk7Ci0JCWJyZWFrOwogCWNhc2UgSFdfVkFSX0RNX0ZVTkNfT1A6CiAJCWlmICh2YWxbMF0pCiAJCQlwb2RtcHJpdi0+QktfU3VwcG9ydEFiaWxpdHkgPSBwb2RtcHJpdi0+U3VwcG9ydEFiaWxpdHk7CkBAIC0xNzkzLDE0ICsxNzUwLDExIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBHZXRId1JlZzgxODhFVShzdHJ1Y3QgYWRhcHRlciAqQWRhcHRlciwgdTggdmFyaWFibGUsIHU4ICp2YWwpCit2b2lkIHJ0d19oYWxfZ2V0X2h3cmVnKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCB1OCB2YXJpYWJsZSwgdTggKnZhbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IG9kbV9kbV9zdHJ1Y3QgKnBvZG1wcml2ID0gJmhhbGRhdGEtPm9kbXByaXY7Ci0KIAlzd2l0Y2ggKHZhcmlhYmxlKSB7CiAJY2FzZSBIV19WQVJfQkFTSUNfUkFURToKLQkJKigodTE2ICopKHZhbCkpID0gaGFsZGF0YS0+QmFzaWNSYXRlU2V0OworCQkqKCh1MTYgKikodmFsKSkgPSBBZGFwdGVyLT5IYWxEYXRhLT5CYXNpY1JhdGVTZXQ7CiAJY2FzZSBIV19WQVJfVFhQQVVTRToKIAkJdmFsWzBdID0gdXNiX3JlYWQ4KEFkYXB0ZXIsIFJFR19UWFBBVVNFKTsKIAkJYnJlYWs7CkBAIC0xODA4LDExICsxNzYyLDggQEAKIAkJLyogQkNOX1ZBTElELCBCSVQxNiBvZiBSRUdfVERFQ1RSTCA9IEJJVDAgb2YgUkVHX1RERUNUUkwrMiAqLwogCQl2YWxbMF0gPSAoQklUKDApICYgdXNiX3JlYWQ4KEFkYXB0ZXIsIFJFR19UREVDVFJMKzIpKSA/IHRydWUgOiBmYWxzZTsKIAkJYnJlYWs7Ci0JY2FzZSBIV19WQVJfRE1fRkxBRzoKLQkJdmFsWzBdID0gcG9kbXByaXYtPlN1cHBvcnRBYmlsaXR5OwotCQlicmVhazsKIAljYXNlIEhXX1ZBUl9SRl9UWVBFOgotCQl2YWxbMF0gPSBoYWxkYXRhLT5yZl90eXBlOworCQl2YWxbMF0gPSBSRl8xVDFSOwogCQlicmVhazsKIAljYXNlIEhXX1ZBUl9GV0xQU19SRl9PTjoKIAkJewpAQCAtMTgzMywxMyArMTc4NCwxMyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgSFdfVkFSX0NVUlJFTlRfQU5URU5OQToKLQkJdmFsWzBdID0gaGFsZGF0YS0+Q3VyQW50ZW5uYTsKKwkJdmFsWzBdID0gQWRhcHRlci0+SGFsRGF0YS0+Q3VyQW50ZW5uYTsKIAkJYnJlYWs7CiAJY2FzZSBIV19WQVJfRUZVU0VfQllURVM6IC8qICBUbyBnZXQgRUZVRSB0b3RhbCB1c2VkIGJ5dGVzLCBhZGRlZCBieSBSb2dlciwgMjAwOC4xMi4yMi4gKi8KLQkJKigodTE2ICopKHZhbCkpID0gaGFsZGF0YS0+RWZ1c2VVc2VkQnl0ZXM7CisJCSooKHUxNiAqKSh2YWwpKSA9IEFkYXB0ZXItPkhhbERhdGEtPkVmdXNlVXNlZEJ5dGVzOwogCQlicmVhazsKIAljYXNlIEhXX1ZBUl9BUEZNX09OX01BQzoKLQkJKnZhbCA9IGhhbGRhdGEtPmJNYWNQd3JDdHJsT247CisJCSp2YWwgPSBBZGFwdGVyLT5IYWxEYXRhLT5iTWFjUHdyQ3RybE9uOwogCQlicmVhazsKIAljYXNlIEhXX1ZBUl9DSEtfSElfUVVFVUVfRU1QVFk6CiAJCSp2YWwgPSAoKHVzYl9yZWFkMzIoQWRhcHRlciwgUkVHX0hHUV9JTkZPUk1BVElPTikmMHgwMDAwZmYwMCkgPT0gMCkgPyB0cnVlIDogZmFsc2U7CkBAIC0xODUzLDE0ICsxODA0LDEzIEBACiAvKglEZXNjcmlwdGlvbjogKi8KIC8qCQlRdWVyeSBzZXR0aW5nIG9mIHNwZWNpZmllZCB2YXJpYWJsZS4gKi8KIC8qICAqLwotc3RhdGljIHU4Ci1HZXRIYWxEZWZWYXI4MTg4RVVzYigKK3U4IHJ0d19oYWxfZ2V0X2RlZl92YXIoCiAJCXN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLAogCQllbnVtIGhhbF9kZWZfdmFyaWFibGUgZVZhcmlhYmxlLAogCQl2b2lkICpwVmFsdWUKIAkpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IEFkYXB0ZXItPkhhbERhdGE7CiAJdTggYlJlc3VsdCA9IF9TVUNDRVNTOwogCiAJc3dpdGNoIChlVmFyaWFibGUpIHsKQEAgLTE5NDgsNyArMTg5OCw3IEBACiAJcmV0dXJuIGJSZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIFVwZGF0ZUhhbFJBTWFzazgxODhFVXNiKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTMyIG1hY19pZCwgdTggcnNzaV9sZXZlbCkKK3ZvaWQgVXBkYXRlSGFsUkFNYXNrODE4OEVVc2Ioc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1MzIgbWFjX2lkLCB1OCByc3NpX2xldmVsKQogewogCXU4IGluaXRfcmF0ZSA9IDA7CiAJdTggbmV0d29ya1R5cGUsIHJhaWQ7CkBAIC0xOTU2LDcgKzE5MDYsNyBAQAogCXU4IHNob3J0R0lyYXRlID0gZmFsc2U7CiAJaW50CXN1cHBvcnRSYXRlTnVtID0gMDsKIAlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGE7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqb2RtcHJpdiA9ICZhZGFwdC0+SGFsRGF0YS0+b2RtcHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmYWRhcHQtPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4CSpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7CkBAIC0xOTk1LDcgKzE5NDUsNyBAQAogCQlicmVhazsKIAl9CiAKLQlyYXRlX2JpdG1hcCA9IE9ETV9HZXRfUmF0ZV9CaXRtYXAoJmhhbGRhdGEtPm9kbXByaXYsIG1hY19pZCwgbWFzaywgcnNzaV9sZXZlbCk7CisJcmF0ZV9iaXRtYXAgPSBPRE1fR2V0X1JhdGVfQml0bWFwKG9kbXByaXYsIG1hY19pZCwgbWFzaywgcnNzaV9sZXZlbCk7CiAJREJHXzg4RSgiJXMgPT4gbWFjX2lkOiVkLCBuZXR3b3JrVHlwZToweCUwMngsIG1hc2s6MHglMDh4XG5cdCA9PT4gcnNzaV9sZXZlbDolZCwgcmF0ZV9iaXRtYXA6MHglMDh4XG4iLAogCQlfX2Z1bmNfXywgbWFjX2lkLCBuZXR3b3JrVHlwZSwgbWFzaywgcnNzaV9sZXZlbCwgcmF0ZV9iaXRtYXApOwogCkBAIC0yMDAzLDE1ICsxOTUzLDE0IEBACiAKIAlpbml0X3JhdGUgPSBnZXRfaGlnaGVzdF9yYXRlX2lkeChtYXNrKSYweDNmOwogCi0JT0RNX1JBX1VwZGF0ZVJhdGVJbmZvXzgxODhFKCZoYWxkYXRhLT5vZG1wcml2LCBtYWNfaWQsCi0JCQkJICAgIHJhaWQsIG1hc2ssIHNob3J0R0lyYXRlKTsKKwlPRE1fUkFfVXBkYXRlUmF0ZUluZm9fODE4OEUob2RtcHJpdiwgbWFjX2lkLCByYWlkLCBtYXNrLCBzaG9ydEdJcmF0ZSk7CiAKIAkvKiBzZXQgcmFfaWQgKi8KIAlwc3RhLT5yYWlkID0gcmFpZDsKIAlwc3RhLT5pbml0X3JhdGUgPSBpbml0X3JhdGU7CiB9CiAKLXN0YXRpYyB2b2lkIFNldEJlYWNvblJlbGF0ZWRSZWdpc3RlcnM4MTg4RVVzYihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCit2b2lkIHJ0d19oYWxfYmNuX3JlbGF0ZWRfcmVnX3NldHRpbmcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQogewogCXUzMiB2YWx1ZTMyOwogCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZhZGFwdC0+bWxtZWV4dHByaXY7CkBAIC0yMDQ1LDEzICsxOTk0LDEyIEBACiAJdXNiX3dyaXRlOChhZGFwdCwgYmNuX2N0cmxfcmVnLCB1c2JfcmVhZDgoYWRhcHQsIGJjbl9jdHJsX3JlZykgfCBCSVQoMSkpOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MTg4ZXVfaW5pdF9kZWZhdWx0X3ZhbHVlKHN0cnVjdCBhZGFwdGVyICphZGFwdCkKK3ZvaWQgcnR3X2hhbF9kZWZfdmFsdWVfaW5pdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCiB7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsZGF0YSA9IGFkYXB0LT5IYWxEYXRhOwogCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmxwcml2OwogCXU4IGk7CiAKLQloYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAlwd3JjdHJscHJpdiA9ICZhZGFwdC0+cHdyY3RybHByaXY7CiAKIAkvKiBpbml0IGRlZmF1bHQgdmFsdWUgKi8KQEAgLTIwNjcsNDMgKzIwMTUsMyBAQAogCWZvciAoaSA9IDA7IGkgPCBIUF9USEVSTUFMX05VTTsgaSsrKQogCQloYWxkYXRhLT5vZG1wcml2LlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfSFBbaV0gPSAwOwogfQotCi12b2lkIHJ0bDgxODhldV9zZXRfaGFsX29wcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpCi17Ci0Jc3RydWN0IGhhbF9vcHMJKmhhbGZ1bmMgPSAmYWRhcHQtPkhhbEZ1bmM7Ci0KLQotCWFkYXB0LT5IYWxEYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhhbF9kYXRhXzgxODhlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZGFwdC0+SGFsRGF0YSkKLQkJREJHXzg4RSgiY2FudCBub3QgYWxsb2MgbWVtb3J5IGZvciBIQUwgREFUQVxuIik7Ci0KLQloYWxmdW5jLT5oYWxfcG93ZXJfb24gPSBydGw4MTg4ZXVfSW5pdFBvd2VyT247Ci0JaGFsZnVuYy0+aGFsX2luaXQgPSAmcnRsODE4OGV1X2hhbF9pbml0OwotCWhhbGZ1bmMtPmhhbF9kZWluaXQgPSAmcnRsODE4OGV1X2hhbF9kZWluaXQ7Ci0KLQloYWxmdW5jLT5pbmlycF9pbml0ID0gJnJ0bDgxODhldV9pbmlycF9pbml0OwotCWhhbGZ1bmMtPmluaXJwX2RlaW5pdCA9ICZydGw4MTg4ZXVfaW5pcnBfZGVpbml0OwotCi0JaGFsZnVuYy0+aW5pdF94bWl0X3ByaXYgPSAmcnRsODE4OGV1X2luaXRfeG1pdF9wcml2OwotCi0JaGFsZnVuYy0+aW5pdF9yZWN2X3ByaXYgPSAmcnRsODE4OGV1X2luaXRfcmVjdl9wcml2OwotCWhhbGZ1bmMtPmZyZWVfcmVjdl9wcml2ID0gJnJ0bDgxODhldV9mcmVlX3JlY3ZfcHJpdjsKLQloYWxmdW5jLT5Jbml0U3dMZWRzID0gJnJ0bDgxODhldV9Jbml0U3dMZWRzOwotCWhhbGZ1bmMtPkRlSW5pdFN3TGVkcyA9ICZydGw4MTg4ZXVfRGVJbml0U3dMZWRzOwotCi0JaGFsZnVuYy0+aW5pdF9kZWZhdWx0X3ZhbHVlID0gJnJ0bDgxODhldV9pbml0X2RlZmF1bHRfdmFsdWU7Ci0JaGFsZnVuYy0+aW50Zl9jaGlwX2NvbmZpZ3VyZSA9ICZydGw4MTg4ZXVfaW50ZXJmYWNlX2NvbmZpZ3VyZTsKLQloYWxmdW5jLT5yZWFkX2FkYXB0ZXJfaW5mbyA9ICZfUmVhZEFkYXB0ZXJJbmZvODE4OEVVOwotCi0JaGFsZnVuYy0+U2V0SHdSZWdIYW5kbGVyID0gJlNldEh3UmVnODE4OEVVOwotCWhhbGZ1bmMtPkdldEh3UmVnSGFuZGxlciA9ICZHZXRId1JlZzgxODhFVTsKLQloYWxmdW5jLT5HZXRIYWxEZWZWYXJIYW5kbGVyID0gJkdldEhhbERlZlZhcjgxODhFVXNiOwotCi0JaGFsZnVuYy0+VXBkYXRlUkFNYXNrSGFuZGxlciA9ICZVcGRhdGVIYWxSQU1hc2s4MTg4RVVzYjsKLQloYWxmdW5jLT5TZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzSGFuZGxlciA9ICZTZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzODE4OEVVc2I7Ci0KLQloYWxmdW5jLT5oYWxfeG1pdCA9ICZydGw4MTg4ZXVfaGFsX3htaXQ7Ci0JaGFsZnVuYy0+bWdudF94bWl0ID0gJnJ0bDgxODhldV9tZ250X3htaXQ7Ci0KLQlydGw4MTg4ZV9zZXRfaGFsX29wcyhoYWxmdW5jKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9IYWw4MTg4RVBoeUNmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL0hhbDgxODhFUGh5Q2ZnLmgKaW5kZXggODk5MDc0OC4uMDk3NmE3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL0hhbDgxODhFUGh5Q2ZnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL0hhbDgxODhFUGh5Q2ZnLmgKQEAgLTE1OCwyNCArMTU4LDYgQEAKIAkJCQkgKiBQYXRoIEEgYW5kIEIgKi8KIH07CiAKLXN0cnVjdCBhbnRfc2VsX29mZG0gewotCXUzMiByX3R4X2FudGVubmE6NDsKLQl1MzIgcl9hbnRfbDo0OwotCXUzMiByX2FudF9ub25faHQ6NDsKLQl1MzIgcl9hbnRfaHQxOjQ7Ci0JdTMyIHJfYW50X2h0Mjo0OwotCXUzMiByX2FudF9odF9zMTo0OwotCXUzMiByX2FudF9ub25faHRfczE6NDsKLQl1MzIgT0ZETV9UWFNDOjI7Ci0JdTMyIHJlc2VydmVkOjI7Ci19OwotCi1zdHJ1Y3QgYW50X3NlbF9jY2sgewotCXU4IHJfY2NrcnhfZW5hYmxlXzI6MjsKLQl1OCByX2Nja3J4X2VuYWJsZToyOwotCXU4IHJfY2NrdHhfZW5hYmxlOjQ7Ci19OwotCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvSGFsSFdJbWc4MTg4RV9GVy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL0hhbEhXSW1nODE4OEVfRlcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiNTUyNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvSGFsSFdJbWc4MTg4RV9GVy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0qIG1vcmUgZGV0YWlscy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0lOQ19GV184MTg4RV9IV19JTUdfSAotI2RlZmluZSBfX0lOQ19GV184MTg4RV9IV19JTUdfSAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBGV19BUC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBGV19Xb1dMQU4uVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIEFycmF5TGVuZ3RoXzgxODhFX0ZXX1dvV0xBTiAxNTc2NAotZXh0ZXJuIGNvbnN0IHU4IEFycmF5XzgxODhFX0ZXX1dvV0xBTltBcnJheUxlbmd0aF84MTg4RV9GV19Xb1dMQU5dOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9iYXNpY190eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Jhc2ljX3R5cGVzLmgKaW5kZXggMmMxNjc2ZC4uNjljNGQ0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Jhc2ljX3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Jhc2ljX3R5cGVzLmgKQEAgLTEzNyw4ICsxMzcsNCBAQAogCQkoKCgodTgpX192YWwpICYgQklUX0xFTl9NQVNLXzgoX19iaXRsZW4pKSA8PCAoX19iaXRvZmZzZXQpKSBcCiAJCSkKIAotLyogIEdldCB0aGUgTi1ieXRlcyBhbGlnbWVudCBvZmZzZXQgZnJvbSB0aGUgY3VycmVudCBsZW5ndGggKi8KLSNkZWZpbmUJTl9CWVRFX0FMSUdNRU5UKF9fdmFsdWUsIF9fYWxpZ21lbnQpICgoX19hbGlnbWVudCA9PSAxKSA/IFwKLQkoX192YWx1ZSkgOiAoKChfX3ZhbHVlICsgX19hbGlnbWVudCAtIDEpIC8gX19hbGlnbWVudCkgKiBfX2FsaWdtZW50KSkKLQogI2VuZGlmIC8qIF9fQkFTSUNfVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZHJ2X3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvZHJ2X3R5cGVzLmgKaW5kZXggNTU1MDZhNy4uMzIzMjZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2Rydl90eXBlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9kcnZfdHlwZXMuaApAQCAtNTMsMzAgKzUzLDE3IEBACiAjZGVmaW5lIFNQRUNfREVWX0lEX0FTU0lHTl9JRk5BTUUJQklUKDUpCiAKIHN0cnVjdCByZWdpc3RyeV9wcml2IHsKLQl1OAljaGlwX3ZlcnNpb247Ci0JdTgJcmZpbnRmczsKLQl1OAlsYmttb2RlOwotCXU4CWhjaTsKIAlzdHJ1Y3QgbmRpc184MDJfMTFfc3NpZAlzc2lkOwotCXU4CW5ldHdvcmtfbW9kZTsJLyogaW5mcmEsIGFkLWhvYywgYXV0byAqLwogCXU4CWNoYW5uZWw7LyogYWQtaG9jIHN1cHBvcnQgcmVxdWlyZW1lbnQgKi8KIAl1OAl3aXJlbGVzc19tb2RlOy8qIEEsIEIsIEcsIGF1dG8gKi8KLQl1OAlzY2FuX21vZGU7LyogYWN0aXZlLCBwYXNzaXZlICovCi0JdTgJcmFkaW9fZW5hYmxlOwogCXU4CXByZWFtYmxlOy8qIGxvbmcsIHNob3J0LCBhdXRvICovCiAJdTgJdnJ0bF9jYXJyaWVyX3NlbnNlOy8qIEVuYWJsZSwgRGlzYWJsZSwgQXV0byAqLwogCXU4CXZjc190eXBlOy8qIFJUUy9DVFMsIENUUy10by1zZWxmICovCiAJdTE2CXJ0c190aHJlc2g7CiAJdTE2CWZyYWdfdGhyZXNoOwotCXU4CWFkaG9jX3R4X3B3cjsKLQl1OAlzb2Z0X2FwOwogCXU4CXBvd2VyX21nbnQ7CiAJdTgJaXBzX21vZGU7CiAJdTgJc21hcnRfcHM7Ci0JdTgJbG9uZ19yZXRyeV9sbXQ7Ci0JdTgJc2hvcnRfcmV0cnlfbG10OwotCXUxNglidXN5X3RocmVzaDsKLQl1OAlhY2tfcG9saWN5OwogCXU4CW1wX21vZGU7CiAJdTgJc29mdHdhcmVfZW5jcnlwdDsKIAl1OAlzb2Z0d2FyZV9kZWNyeXB0OwpAQCAtODQsMTEgKzcxLDYgQEAKIAkgIC8qIFVBUFNEICovCiAJdTgJd21tX2VuYWJsZTsKIAl1OAl1YXBzZF9lbmFibGU7Ci0JdTgJdWFwc2RfbWF4X3NwOwotCXU4CXVhcHNkX2FjYmtfZW47Ci0JdTgJdWFwc2RfYWNiZV9lbjsKLQl1OAl1YXBzZF9hY3ZpX2VuOwotCXU4CXVhcHNkX2Fjdm9fZW47CiAKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAgICBkZXZfbmV0d29yazsKIApAQCAtOTcsMTAgKzc5LDYgQEAKIAl1OAlhbXBkdV9lbmFibGU7LyogZm9yIHR4ICovCiAJdTgJcnhfc3RiYzsKIAl1OAlhbXBkdV9hbXNkdTsvKiBBLU1QRFUgU3VwcG9ydHMgQS1NU0RVIGlzIHBlcm1pdHRlZCAqLwotCXU4CWxvd3JhdGVfdHdvX3htaXQ7Ci0KLQl1OAlyZl9jb25maWc7Ci0JdTgJbG93X3Bvd2VyOwogCiAJdTgJd2lmaV9zcGVjOy8qICAhdHVyYm9fbW9kZSAqLwogCkBAIC0xMTIsOSArOTAsNiBAQAogCiAJdTgJdXNic3NfZW5hYmxlOy8qIDA6ZGlzYWJsZSwxOmVuYWJsZSAqLwogCXU4CWh3cGRuX21vZGU7LyogMDpkaXNhYmxlLDE6ZW5hYmxlLDI6ZGVjaWRlIGJ5IEVGVVNFIGNvbmZpZyAqLwotCXU4CWh3cHdycF9kZXRlY3Q7LyogMDpkaXNhYmxlLDE6ZW5hYmxlICovCi0KLQl1OAlod193cHNfcGJjOy8qIDA6ZGlzYWJsZSwxOmVuYWJsZSAqLwogCiAJdTgJbWF4X3JvYW1pbmdfdGltZXM7IC8qICB0aGUgbWF4IG51bWJlciBkcml2ZXIgd2lsbCB0cnkgKi8KIApAQCAtMTI5LDEyICsxMDQsNiBAQAogCWJvb2wJbW9uaXRvcl9lbmFibGU7CiB9OwogCi0vKiBGb3IgcmVnaXN0cnkgcGFyYW1ldGVycyAqLwotI2RlZmluZSBSR1RSWV9PRlQoZmllbGQpICgodTMyKW9mZnNldG9mKHN0cnVjdCByZWdpc3RyeV9wcml2LCBmaWVsZCkpCi0jZGVmaW5lIFJHVFJZX1NaKGZpZWxkKSAgIHNpemVvZigoKHN0cnVjdCByZWdpc3RyeV9wcml2ICopMCktPmZpZWxkKQotI2RlZmluZSBCU1NJRF9PRlQoZmllbGQpICgodTMyKW9mZnNldG9mVChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCwgZmllbGQpKQotI2RlZmluZSBCU1NJRF9TWihmaWVsZCkgICBzaXplb2YoKChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKTApLT5maWVsZCkKLQogI2RlZmluZSBNQVhfQ09OVElOVUFMX1VSQl9FUlIJCTQKIAogc3RydWN0IGR2b2JqX3ByaXYgewpAQCAtMTQ5LDE2ICsxMTgsMTEgQEAKIAl1OAlRdWV1ZTJQaXBlW0hXX1FVRVVFX0VOVFJZXTsvKiBmb3Igb3V0IHBpcGUgbWFwcGluZyAqLwogCiAvKi0tLS0tLS0tIGJlbG93IGlzIGZvciBVU0IgSU5URVJGQUNFIC0tLS0tLS0tKi8KLQotCXU4CW5yX2VuZHBvaW50OwogCXU4CWlzaGlnaHNwZWVkOwogCXU4CVJ0TnVtSW5QaXBlczsKIAl1OAlSdE51bU91dFBpcGVzOwotCWludAllcF9udW1bNV07IC8qIGVuZHBvaW50IG51bWJlciAqLwogCXN0cnVjdCBtdXRleCAgdXNiX3ZlbmRvcl9yZXFfbXV0ZXg7CiAKLQl1OCAqdXNiX3ZlbmRvcl9yZXFfYnVmOwotCiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JpbnRmOwogCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiZGV2OwogfTsKQEAgLTE4NCwxNCArMTQ4LDcgQEAKIAlzdHJ1Y3QJZWVwcm9tX3ByaXYgZWVwcm9tcHJpdjsKIAlzdHJ1Y3QJbGVkX3ByaXYJbGVkcHJpdjsKIAotI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKLQlzdHJ1Y3QJaG9zdGFwZF9wcml2CSpwaG9zdGFwZHByaXY7Ci0jZW5kaWYKLQotCXN0cnVjdCB3aWZpZGlyZWN0X2luZm8Jd2RpbmZvOwotCi0Jdm9pZCAqSGFsRGF0YTsKLQlzdHJ1Y3QgaGFsX29wcwlIYWxGdW5jOworCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqSGFsRGF0YTsKIAogCXMzMgliRHJpdmVyU3RvcHBlZDsKIAlzMzIJYlN1cnByaXNlUmVtb3ZlZDsKQEAgLTE5OSwyMCArMTU2LDExIEBACiAJdTgJaHdfaW5pdF9jb21wbGV0ZWQ7CiAKIAl2b2lkICpjbWRUaHJlYWQ7Ci0Jdm9pZCAqZXZ0VGhyZWFkOwogCXZvaWQgKCppbnRmX3N0YXJ0KShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CiAJdm9pZCAoKmludGZfc3RvcCkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwogCXN0cnVjdCAgbmV0X2RldmljZSAqcG5ldGRldjsKIAlzdHJ1Y3QgIG5ldF9kZXZpY2UgKnBtb25kZXY7CiAKLQkvKiAgdXNlZCBieSBydHdfcmVyZWdfbmRfbmFtZSByZWxhdGVkIGZ1bmN0aW9uICovCi0Jc3RydWN0IHJlcmVnX25kX25hbWVfZGF0YSB7Ci0JCXN0cnVjdCAgbmV0X2RldmljZSAqb2xkX3BuZXRkZXY7Ci0JCWNoYXIgb2xkX2lmbmFtZVtJRk5BTVNJWl07Ci0JCXU4IG9sZF9pcHNfbW9kZTsKLQkJdTggb2xkX2JSZWdVc2VMZWQ7Ci0JfSByZXJlZ19uZF9uYW1lX3ByaXY7Ci0KIAlpbnQgYnVwOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCXN0cnVjdCBpd19zdGF0aXN0aWNzIGl3c3RhdHM7CkBAIC0yMjMsMjMgKzE3MSwxMiBAQAogCXU4IGJSZWFkUG9ydENhbmNlbDsKIAl1OCBiV3JpdGVQb3J0Q2FuY2VsOwogCXU4IGJSeFJTU0lEaXNwbGF5OwotCS8qIFRoZSBkcml2ZXIgd2lsbCBzaG93IHVwIHRoZSBkZXNpcmVkIGNoYW5uZWwgbnVtYmVyCi0JICogd2hlbiB0aGlzIGZsYWcgaXMgMS4gKi8KLQl1OCBiTm90aWZ5Q2hhbm5lbENoYW5nZTsKIAogCXN0cnVjdCBtdXRleCBod19pbml0X211dGV4OwotCi0Jc3BpbmxvY2tfdCBicl9leHRfbG9jazsKLQotCXU4CWZpeF9yYXRlOwotCi0JdW5zaWduZWQgY2hhciAgICAgaW5fY3RhX3Rlc3Q7CiB9OwogCiAjZGVmaW5lIGFkYXB0ZXJfdG9fZHZvYmooYWRhcHRlcikgKGFkYXB0ZXItPmR2b2JqKQogCi1pbnQgcnR3X2hhbmRsZV9kdWFsbWFjKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBib29sIGluaXQpOwotCiBzdGF0aWMgaW5saW5lIHU4ICpteWlkKHN0cnVjdCBlZXByb21fcHJpdiAqcGVlcHJpdikKIHsKIAlyZXR1cm4gcGVlcHJpdi0+bWFjX2FkZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaGFsX2ludGYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9oYWxfaW50Zi5oCmluZGV4IGVhZjkzOWIuLmZhMDMyYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9oYWxfaW50Zi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9oYWxfaW50Zi5oCkBAIC01OCw3ICs1OCw2IEBACiAJSFdfVkFSX1NFQ19DRkcsCiAJSFdfVkFSX0JDTl9WQUxJRCwKIAlIV19WQVJfUkZfVFlQRSwKLQlIV19WQVJfRE1fRkxBRywKIAlIV19WQVJfRE1fRlVOQ19PUCwKIAlIV19WQVJfRE1fRlVOQ19TRVQsCiAJSFdfVkFSX0RNX0ZVTkNfQ0xSLApAQCAtMTM5LDgxICsxMzgsNiBAQAogCUhBTF9NQVhfSUQsCiB9OwogCi1zdHJ1Y3QgaGFsX29wcyB7Ci0JdTMyCSgqaGFsX3Bvd2VyX29uKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCXUzMgkoKmhhbF9pbml0KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCXUzMgkoKmhhbF9kZWluaXQpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl2b2lkCSgqZnJlZV9oYWxfZGF0YSkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXUzMgkoKmluaXJwX2luaXQpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0JdTMyCSgqaW5pcnBfZGVpbml0KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0JczMyCSgqaW5pdF94bWl0X3ByaXYpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQlzMzIJKCppbml0X3JlY3ZfcHJpdikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQl2b2lkCSgqZnJlZV9yZWN2X3ByaXYpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl2b2lkCSgqSW5pdFN3TGVkcykoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQl2b2lkCSgqRGVJbml0U3dMZWRzKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0Jdm9pZAkoKmRtX2luaXQpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0Jdm9pZAkoKnJlYWRfY2hpcF92ZXJzaW9uKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0Jdm9pZAkoKmluaXRfZGVmYXVsdF92YWx1ZSkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXZvaWQJKCppbnRmX2NoaXBfY29uZmlndXJlKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0Jdm9pZAkoKnJlYWRfYWRhcHRlcl9pbmZvKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0JczMyCSgqaW50ZXJydXB0X2hhbmRsZXIpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl2b2lkCSgqc2V0X2J3bW9kZV9oYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgZW51bSBodF9jaGFubmVsX3dpZHRoIEJhbmR3aWR0aCwKLQkJCQkgICAgICB1OCBPZmZzZXQpOwotCXZvaWQJKCpzZXRfY2hhbm5lbF9oYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGNoYW5uZWwpOwotCi0Jdm9pZAkoKmhhbF9kbV93YXRjaGRvZykoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXZvaWQJKCpTZXRId1JlZ0hhbmRsZXIpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTgJdmFyaWFibGUsCi0JCQkJICAgdTggKnZhbCk7Ci0Jdm9pZAkoKkdldEh3UmVnSGFuZGxlcikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OAl2YXJpYWJsZSwKLQkJCQkgICB1OCAqdmFsKTsKLQotCXU4CSgqR2V0SGFsRGVmVmFySGFuZGxlcikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgICBlbnVtIGhhbF9kZWZfdmFyaWFibGUgZVZhcmlhYmxlLAotCQkJCSAgICAgICB2b2lkICpwVmFsdWUpOwotCi0Jdm9pZAkoKlNldEhhbE9ETVZhckhhbmRsZXIpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgICAgZW51bSBoYWxfb2RtX3ZhcmlhYmxlIGVWYXJpYWJsZSwKLQkJCQkgICAgICAgdm9pZCAqcFZhbHVlMSwgYm9vbCBiU2V0KTsKLQotCXZvaWQJKCpVcGRhdGVSQU1hc2tIYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgIHUzMiBtYWNfaWQsIHU4IHJzc2lfbGV2ZWwpOwotCXZvaWQJKCpTZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzSGFuZGxlcikoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQotCXZvaWQJKCpBZGRfUmF0ZUFUaWQpKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYml0bWFwLCB1OCBhcmcsCi0JCQkJdTggcnNzaV9sZXZlbCk7Ci0KLQl1OAkoKkFudERpdkJlZm9yZUxpbmtIYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7Ci0Jdm9pZAkoKkFudERpdkNvbXBhcmVIYW5kbGVyKShzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCwKLQkJCQkJc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYyk7Ci0JczMyCSgqaGFsX3htaXQpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci0JczMyICgqbWdudF94bWl0KShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUpOwotCXUzMgkoKnJlYWRfcmZyZWcpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIGVudW0gcmZfcmFkaW9fcGF0aCBlUkZQYXRoLCB1MzIgUmVnQWRkciwKLQkJCSAgICAgIHUzMiBCaXRNYXNrKTsKLQotCXZvaWQgKCpzcmVzZXRfaW5pdF92YWx1ZSkoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLQl1OCAoKnNyZXNldF9nZXRfd2lmaV9zdGF0dXMpKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci0KLQl2b2lkICgqaGFsX25vdGNoX2ZpbHRlcikoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgZW5hYmxlKTsKLQl2b2lkICgqaGFsX3Jlc2V0X3NlY3VyaXR5X2VuZ2luZSkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwotfTsKLQogZW51bSBydF9lZXByb21fdHlwZSB7CiAJRUVQUk9NXzkzQzQ2LAogCUVFUFJPTV85M0M1NiwKQEAgLTIzNSw2ICsxNTksOSBAQAogCiAjZGVmaW5lIGlzX2Jvb3RfZnJvbV9lZXByb20oYWRhcHRlcikgKGFkYXB0ZXItPmVlcHJvbXByaXYuRWVwcm9tT3JFZnVzZSkKIAordm9pZCBVcGRhdGVIYWxSQU1hc2s4MTg4RVVzYihzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHUzMiBtYWNfaWQsIHU4IHJzc2lfbGV2ZWwpOwordTMyIHJ0bDgxODhldV9oYWxfZGVpbml0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKTsKK3UzMiBydGw4MTg4ZXVfaGFsX2luaXQoc3RydWN0IGFkYXB0ZXIgKkFkYXB0ZXIpOwogdm9pZCBydHdfaGFsX2RlZl92YWx1ZV9pbml0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiAKIHZvaWQJcnR3X2hhbF9mcmVlX2RhdGEoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKQEAgLTI2Miw3ICsxODksNyBAQAogCQkJIGJvb2wgYlNldCk7CiAKIHUzMglydHdfaGFsX2luaXJwX2luaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLXUzMglydHdfaGFsX2luaXJwX2RlaW5pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwordm9pZAlydHdfaGFsX2luaXJwX2RlaW5pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCiBzMzIJcnR3X2hhbF94bWl0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwogczMyCXJ0d19oYWxfbWdudF94bWl0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKQEAgLTI3MCw3ICsxOTcsNyBAQAogCiBzMzIJcnR3X2hhbF9pbml0X3htaXRfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCi1zMzIJcnR3X2hhbF9pbml0X3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOworaW50CXJ0d19oYWxfaW5pdF9yZWN2X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQJcnR3X2hhbF9mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCiB2b2lkIHJ0d19oYWxfdXBkYXRlX3JhX21hc2soc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbWFjX2lkLCB1OCBsZXZlbCk7CkBAIC0yOTYsNyArMjIzLDYgQEAKIHZvaWQgcnR3X2hhbF9zcmVzZXRfaW5pdChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogCiB2b2lkIHJ0d19oYWxfbm90Y2hfZmlsdGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBib29sIGVuYWJsZSk7Ci12b2lkIHJ0d19oYWxfcmVzZXRfc2VjdXJpdHlfZW5naW5lKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKIAogdm9pZCBpbmRpY2F0ZV93eF9zY2FuX2NvbXBsZXRlX2V2ZW50KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB1OCBydHdfZG9fam9pbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2llZWU4MDIxMS5oCmluZGV4IGQ4Mjg0YzguLmZjNTg2MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pZWVlODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaWVlZTgwMjExLmgKQEAgLTIzOSw3ICsyMzksNyBAQAogCQkJdTE2IGNhcGFiaWxpdHk7CiAJCQlpbnQgZmxhZ3M7CiAJCQl1OCB0eF9zdXBwX3JhdGVzWzE2XTsKLQkJCXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7CiAJCX0gYWRkX3N0YTsKIAkJc3RydWN0IHsKIAkJCXU4CXJlc2VydmVkWzJdOy8qIGZvciBzZXQgbWF4X251bV9zdGEgKi8KQEAgLTI2NCw3ICsyNjQsNyBAQAogCXUzMiBzdGFfc2V0OwogCXU4IHR4X3N1cHBfcmF0ZXNbMTZdOwogCXUzMiB0eF9zdXBwX3JhdGVzX2xlbjsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgaHRfY2FwOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcDsKIAl1NjQJcnhfcGt0czsKIAl1NjQJcnhfYnl0ZXM7CiAJdTY0CXJ4X2Ryb3BzOwpAQCAtMjkxLDYyICsyOTEsNiBAQAogLyogdGhpcyBpcyBzdG9sZW4gZnJvbSBpcHcyMjAwIGRyaXZlciAqLwogI2RlZmluZSBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRSAzMQogCi1zdHJ1Y3QgaWVlZV9pYnNzX3NlcSB7Ci0JdTggbWFjW0VUSF9BTEVOXTsKLQl1MTYgc2VxX251bTsKLQl1MTYgZnJhZ19udW07Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1zdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHIgewotCV9fbGUxNiBmcmFtZV9jdGw7Ci0JX19sZTE2IGR1cmF0aW9uX2lkOwotCXU4IGFkZHIxW0VUSF9BTEVOXTsKLQl1OCBhZGRyMltFVEhfQUxFTl07Ci0JdTggYWRkcjNbRVRIX0FMRU5dOwotCXUxNiBzZXFfY3RsOwotCXU4IGFkZHI0W0VUSF9BTEVOXTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkciB7Ci0JX19sZTE2IGZyYW1lX2N0bDsKLQlfX2xlMTYgZHVyYXRpb25faWQ7Ci0JdTggYWRkcjFbRVRIX0FMRU5dOwotCXU4IGFkZHIyW0VUSF9BTEVOXTsKLQl1OCBhZGRyM1tFVEhfQUxFTl07Ci0JdTE2IHNlcV9jdGw7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfcW9zIHsKLQlfX2xlMTYgZnJhbWVfY3RsOwotCV9fbGUxNiBkdXJhdGlvbl9pZDsKLQl1OCBhZGRyMVtFVEhfQUxFTl07Ci0JdTggYWRkcjJbRVRIX0FMRU5dOwotCXU4IGFkZHIzW0VUSF9BTEVOXTsKLQl1MTYgc2VxX2N0bDsKLQl1OCBhZGRyNFtFVEhfQUxFTl07Ci0JdTE2CXFjOwotfSAgX19wYWNrZWQ7Ci0KLXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkcl9xb3MgewotCV9fbGUxNiBmcmFtZV9jdGw7Ci0JX19sZTE2IGR1cmF0aW9uX2lkOwotCXU4IGFkZHIxW0VUSF9BTEVOXTsKLQl1OCBhZGRyMltFVEhfQUxFTl07Ci0JdTggYWRkcjNbRVRIX0FMRU5dOwotCXUxNiBzZXFfY3RsOwotCXUxNiAgICAgcWM7Ci19ICBfX3BhY2tlZDsKLQotc3RydWN0IGVhcG9sIHsKLQl1OCBzbmFwWzZdOwotCXUxNiBldGhlcnR5cGU7Ci0JdTggdmVyc2lvbjsKLQl1OCB0eXBlOwotCXUxNiBsZW5ndGg7Ci19IF9fcGFja2VkOwotCiBlbnVtIGVhcF90eXBlIHsKIAlFQVBfUEFDS0VUID0gMCwKIAlFQVBPTF9TVEFSVCwKQEAgLTU1Miw4MyArNDk2LDEyIEBACiAjZGVmaW5lIElFRUU4MDIxMV9OVU1fQ0NLX1JBVEVTCQk0CiAjZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQQk0CiAKLS8qIE5PVEU6IFRoaXMgZGF0YSBpcyBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXM7IG5vdCBhbGwgaGFyZHdhcmUgcHJvdmlkZXMgdGhpcwotICogICAgICAgaW5mb3JtYXRpb24gZm9yIGZyYW1lcyByZWNlaXZlZC4gIE5vdCBzZXR0aW5nIHRoZXNlIHdpbGwgbm90IGNhdXNlCi0gKiAgICAgICBhbnkgYWR2ZXJzZSBhZmZlY3RzLiAqLwotc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyB7Ci0JLyogdTMyIG1hY190aW1lWzJdOyAqLwotCXM4IHJzc2k7Ci0JdTggc2lnbmFsOwotCXU4IG5vaXNlOwotCXU4IHJlY2VpdmVkX2NoYW5uZWw7Ci0JdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCi0JLyogdTggY29udHJvbDsgKi8KLQl1OCBtYXNrOwotCXU4IGZyZXE7Ci0JdTE2IGxlbjsKLX07Ci0KIC8qIElFRUUgODAyLjExIHJlcXVpcmVzIHRoYXQgU1RBIHN1cHBvcnRzIGNvbmN1cnJlbnQgcmVjZXB0aW9uIG9mIGF0IGxlYXN0CiAgKiB0aHJlZSBmcmFnbWVudGVkIGZyYW1lcy4gVGhpcyBkZWZpbmUgY2FuIGJlIGluY3JlYXNlZCB0byBzdXBwb3J0IG1vcmUKICAqIGNvbmN1cnJlbnQgZnJhbWVzLCBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZWFjaCBlbnRyeSBjYW4gY29uc3VtZSBhYm91dAogICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LiAqLwogI2RlZmluZSBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU4gNAogCi1zdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgewotCXUzMiBmaXJzdF9mcmFnX3RpbWU7Ci0JdWludCBzZXE7Ci0JdWludCBsYXN0X2ZyYWc7Ci0JdWludCBxb3M7ICAgLyogamFja3NvbiAqLwotCXVpbnQgdGlkOwkvKiBqYWNrc29uICovCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1OCBzcmNfYWRkcltFVEhfQUxFTl07Ci0JdTggZHN0X2FkZHJbRVRIX0FMRU5dOwotfTsKLQotc3RydWN0IGllZWU4MDIxMV9zdGF0cyB7Ci0JdWludCB0eF91bmljYXN0X2ZyYW1lczsKLQl1aW50IHR4X211bHRpY2FzdF9mcmFtZXM7Ci0JdWludCB0eF9mcmFnbWVudHM7Ci0JdWludCB0eF91bmljYXN0X29jdGV0czsKLQl1aW50IHR4X211bHRpY2FzdF9vY3RldHM7Ci0JdWludCB0eF9kZWZlcnJlZF90cmFuc21pc3Npb25zOwotCXVpbnQgdHhfc2luZ2xlX3JldHJ5X2ZyYW1lczsKLQl1aW50IHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lczsKLQl1aW50IHR4X3JldHJ5X2xpbWl0X2V4Y2VlZGVkOwotCXVpbnQgdHhfZGlzY2FyZHM7Ci0JdWludCByeF91bmljYXN0X2ZyYW1lczsKLQl1aW50IHJ4X211bHRpY2FzdF9mcmFtZXM7Ci0JdWludCByeF9mcmFnbWVudHM7Ci0JdWludCByeF91bmljYXN0X29jdGV0czsKLQl1aW50IHJ4X211bHRpY2FzdF9vY3RldHM7Ci0JdWludCByeF9mY3NfZXJyb3JzOwotCXVpbnQgcnhfZGlzY2FyZHNfbm9fYnVmZmVyOwotCXVpbnQgdHhfZGlzY2FyZHNfd3Jvbmdfc2E7Ci0JdWludCByeF9kaXNjYXJkc191bmRlY3J5cHRhYmxlOwotCXVpbnQgcnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzOwotCXVpbnQgcnhfbWVzc2FnZV9pbl9iYWRfbXNnX2ZyYWdtZW50czsKLX07Ci0KLXN0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0cyB7Ci0JdWludCByeF9hc3Nfb2s7Ci0JdWludCByeF9hc3NfZXJyOwotCXVpbnQgcnhfcHJvYmVfcnE7Ci0JdWludCB0eF9wcm9iZV9yczsKLQl1aW50IHR4X2JlYWNvbnM7Ci0JdWludCByeF9hdXRoX3JxOwotCXVpbnQgcnhfYXV0aF9yc19vazsKLQl1aW50IHJ4X2F1dGhfcnNfZXJyOwotCXVpbnQgdHhfYXV0aF9ycTsKLQl1aW50IG5vX2F1dGhfcnM7Ci0JdWludCBub19hc3NfcnM7Ci0JdWludCB0eF9hc3NfcnE7Ci0JdWludCByeF9hc3NfcnE7Ci0JdWludCB0eF9wcm9iZV9ycTsKLQl1aW50IHJlYXNzb2M7Ci0JdWludCBzd3R4c3RvcDsKLQl1aW50IHN3dHhhd2FrZTsKLX07Ci0KICNkZWZpbmUgU0VDX0tFWV8xCSgxPDwwKQogI2RlZmluZSBTRUNfS0VZXzIJKDE8PDEpCiAjZGVmaW5lIFNFQ19LRVlfMwkoMTw8MikKQEAgLTY0OCw0MiArNTIxLDYgQEAKICNkZWZpbmUgV0VQX0tFWVMgNAogI2RlZmluZSBXRVBfS0VZX0xFTiAxMwogCi1zdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHsKLQl1MTYgYWN0aXZlX2tleToyLAotCWVuYWJsZWQ6MSwKLQlhdXRoX21vZGU6MiwKLQlhdXRoX2FsZ286NCwKLQl1bmljYXN0X3VzZXNfZ3JvdXA6MTsKLQl1OCBrZXlfc2l6ZXNbV0VQX0tFWVNdOwotCXU4IGtleXNbV0VQX0tFWVNdW1dFUF9LRVlfTEVOXTsKLQl1OCBsZXZlbDsKLQl1MTYgZmxhZ3M7Ci19IF9fcGFja2VkOwotCi0vKgotCi0gODAyLjExIGRhdGEgZnJhbWUgZnJvbSBBUAotCi0gICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLUJ5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAotICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18Ci1EZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBmcmFtZSAgfCAgZmNzIHwKLSAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwJIHwJIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKLSAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJwotCi1Ub3RhbDogMjgtMjM0MCBieXRlcwotCi0qLwotCi1zdHJ1Y3QgaWVlZTgwMjExX2hlYWRlcl9kYXRhIHsKLQl1MTYgZnJhbWVfY3RsOwotCXUxNiBkdXJhdGlvbl9pZDsKLQl1OCBhZGRyMVs2XTsKLQl1OCBhZGRyMls2XTsKLQl1OCBhZGRyM1s2XTsKLQl1MTYgc2VxX2N0cmw7Ci19OwotCiAjZGVmaW5lIEJFQUNPTl9QUk9CRV9TU0lEX0lEX1BPU0lUSU9OIDEyCiAKIC8qIE1hbmFnZW1lbnQgRnJhbWUgSW5mb3JtYXRpb24gRWxlbWVudCBUeXBlcyAqLwpAQCAtNzAwLDgxICs1MzcsOSBAQAogI2RlZmluZSBNRklFX1RZUEVfUkFURVNfRVgJNTAKICNkZWZpbmUgTUZJRV9UWVBFX0dFTkVSSUMJMjIxCiAKLXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50X2hkciB7Ci0JdTggaWQ7Ci0JdTggbGVuOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgewotCXU4IGlkOwotCXU4IGxlbjsKLQl1OCBkYXRhWzBdOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cwotICoKLQl1MTYgYXV0aF9hbGdvcml0aG07Ci0JdTE2IGF1dGhfc2VxdWVuY2U7Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbDsKLQl1MTYgY2FwYWJpbGl0eTsKLQl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKLQl1MTYgbGlzdGVuX2ludGVydmFsOwotCXN0cnVjdCB7Ci0JCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKLQl9IF9fcGFja2VkOwotCXUzMiB0aW1lX3N0YW1wWzJdOwotCXUxNiByZWFzb247Ci0JdTE2IHN0YXR1czsKLSovCi0KICNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQgIlBlbmd1aW4iCiAjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX0JBU0lDX1JBVEUgMTAKIAotc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7Ci0JdTE2IGFsZ29yaXRobTsKLQl1MTYgdHJhbnNhY3Rpb247Ci0JdTE2IHN0YXR1czsKLQkvKiBzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgaW5mb19lbGVtZW50OyAqLwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZWFkZXJfZGF0YSBoZWFkZXI7Ci0JdTMyIHRpbWVfc3RhbXBbMl07Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbDsKLQl1MTYgY2FwYWJpbGl0eTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgewotCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCXUxNiBjYXBhYmlsaXR5OwotCXUxNiBsaXN0ZW5faW50ZXJ2YWw7Ci0Jc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnRfaGRyIGluZm9fZWxlbWVudDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgewotCXN0cnVjdCBydHdfaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7Ci0JdTE2IGNhcGFiaWxpdHk7Ci0JdTE2IHN0YXR1czsKLQl1MTYgYWlkOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGllZWU4MDIxMV90eGIgewotCXU4IG5yX2ZyYWdzOwotCXU4IGVuY3J5cHRlZDsKLQl1MTYgcmVzZXJ2ZWQ7Ci0JdTE2IGZyYWdfc2l6ZTsKLQl1MTYgcGF5bG9hZF9zaXplOwotCXN0cnVjdCBza19idWZmICpmcmFnbWVudHNbMF07Ci19OwotCi0KIC8qIFNXRUVQIFRBQkxFIEVOVFJJRVMgTlVNQkVSKi8KICNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTCQkgIDQyCiAjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFU19QRVJfUEFDS0VUICA3CkBAIC04NzIsMTEgKzYzNyw2IEBACiAjZGVmaW5lIENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MgKDE8PDApCiAjZGVmaW5lIENGR19JRUVFODAyMTFfQ09NUFVURV9GQ1MgKDE8PDEpCiAKLXN0cnVjdCB0eF9wZW5kaW5nIHsKLQlpbnQgZnJhZzsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiOwotfTsKLQogI2RlZmluZSBNQVhUSUQJMTYKIAogI2RlZmluZSBJRUVFX0EJICAgICgxPDwwKQpAQCAtMTA5NiwyMCArODU2LDggQEAKIAlTQ0EgPSAxLCAvKiBzZWNvbmRhcnkgY2hhbm5lbCBhYm92ZSAqLwogCVNDQiA9IDMsICAvKiBzZWNvbmRhcnkgY2hhbm5lbCBiZWxvdyAqLwogfTsKLXU4IHNlY29uZGFyeV9jaF9vZmZzZXRfdG9faGFsX2NoX29mZnNldCh1OCBjaF9vZmZzZXQpOwotdTggaGFsX2NoX29mZnNldF90b19zZWNvbmRhcnlfY2hfb2Zmc2V0KHU4IGNoX29mZnNldCk7Ci11OCAqcnR3X3NldF9pZV9jaF9zd2l0Y2godTggKmJ1ZiwgdTMyICpidWZfbGVuLCB1OCBjaF9zd2l0Y2hfbW9kZSwKLQkJCSB1OCBuZXdfY2gsIHU4IGNoX3N3aXRjaF9jbnQpOwotdTggKnJ0d19zZXRfaWVfc2Vjb25kYXJ5X2NoX29mZnNldCh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sCi0JCQkJICAgdTggc2Vjb25kYXJ5X2NoX29mZnNldCk7Ci11OCAqcnR3X3NldF9pZV9tZXNoX2NoX3N3aXRjaF9wYXJtKHU4ICpidWYsIHUzMiAqYnVmX2xlbiwgdTggdHRsLAotCQkJCSAgIHU4IGZsYWdzLCB1MTYgcmVhc29uLCB1MTYgcHJlY2VkZW5jZSk7CiAKIHU4ICpydHdfZ2V0X2llKHU4ICpwYnVmLCBpbnQgaW5kZXgsIGludCAqbGVuLCBpbnQgbGltaXQpOwotdTggKnJ0d19nZXRfaWVfZXgodTggKmluX2llLCB1aW50IGluX2xlbiwgdTggZWlkLCB1OCAqb3VpLAotCQkgIHU4IG91aV9sZW4sIHU4ICppZSwgdWludCAqaWVsZW4pOwotaW50IHJ0d19pZXNfcmVtb3ZlX2llKHU4ICppZXMsIHVpbnQgKmllc19sZW4sIHVpbnQgb2Zmc2V0LAotCQkgICAgICB1OCBlaWQsIHU4ICpvdWksIHU4IG91aV9sZW4pOwogCiB2b2lkIHJ0d19zZXRfc3VwcG9ydGVkX3JhdGUodTggKlN1cHBvcnRlZFJhdGVzLCB1aW50IG1vZGUpOwogCkBAIC0xMTMzLDE5ICs4ODEsNiBAQAogdTggKnJ0d19nZXRfd3BzX2F0dHJfY29udGVudCh1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwgdTE2IHRhcmdldF9hdHRyX2lkLAogCQkJICAgICB1OCAqYnVmX2NvbnRlbnQsIHVpbnQgKmxlbl9jb250ZW50KTsKIAotLyoqCi0gKiBmb3JfZWFjaF9pZSAtIGl0ZXJhdGUgb3ZlciBjb250aW51b3VzIElFcwotICogQGllOgotICogQGJ1ZjoKLSAqIEBidWZfbGVuOgotICovCi0jZGVmaW5lIGZvcl9lYWNoX2llKGllLCBidWYsIGJ1Zl9sZW4pIFwKLQlmb3IgKGllID0gKHZvaWQgKilidWY7ICgoKHU4ICopaWUpIC0gKCh1OCAqKWJ1ZikgKyAxKSA8IGJ1Zl9sZW47CVwKLQkJaWUgPSAodm9pZCAqKSgoKHU4ICopaWUpICsgKigoKHU4ICopaWUpKzEpICsgMikpCi0KLXZvaWQgZHVtcF9pZXModTggKmJ1ZiwgdTMyIGJ1Zl9sZW4pOwotdm9pZCBkdW1wX3dwc19pZSh1OCAqaWUsIHUzMiBpZV9sZW4pOwotCiB1aW50CXJ0d19nZXRfcmF0ZXNldF9sZW4odTgJKnJhdGVzZXQpOwogCiBzdHJ1Y3QgcmVnaXN0cnlfcHJpdjsKQEAgLTExNjcsOCArOTAyLDQgQEAKIHUxNiBydHdfbWNzX3JhdGUodTggcmZfdHlwZSwgdTggYndfNDBNSHosIHU4IHNob3J0X0dJXzIwLCB1OCBzaG9ydF9HSV80MCwKIAkJIHVuc2lnbmVkIGNoYXIgKk1DU19yYXRlKTsKIAotaW50IHJ0d19hY3Rpb25fZnJhbWVfcGFyc2UoY29uc3QgdTggKmZyYW1lLCB1MzIgZnJhbWVfbGVuLCB1OCAqY2F0ZWdvcnksCi0JCQkgICB1OCAqYWN0aW9uKTsKLWNvbnN0IGNoYXIgKmFjdGlvbl9wdWJsaWNfc3RyKHU4IGFjdGlvbik7Ci0KICNlbmRpZiAvKiBJRUVFODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29kbS5oCmluZGV4IGRiZWJmMTcuLjgwNWY1MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vZG0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb2RtLmgKQEAgLTMxNSwyMiArMzE1LDYgQEAKIAlPRE1fUFNEMkFGSAkJPSAweDAwMDAwODAwCiB9OwogCi0vKiAgMjAxMS8yMC8yMCBNSCBGb3IgTVAgZHJpdmVyIFJUX1dMQU5fU1RBID0gIHN0cnVjdCBzdGFfaW5mbyAqLwotLyogIFBsZWFzZSBkZWNsYXJlIGJlbG93IE9ETSByZWxhdGl2ZSBpbmZvIGluIHlvdXIgU1RBIGluZm8gc3RydWN0dXJlLiAqLwotCi1zdHJ1Y3Qgb2RtX3N0YV9pbmZvIHsKLQkvKiAgRHJpdmVyIFdyaXRlICovCi0JYm9vbAliVXNlZDsJCS8qICByZWNvcmQgdGhlIHN0YSBzdGF0dXMgbGluayBvciBub3Q/ICovCi0JdTgJSU9UUGVlcjsJLyogIEVudW0gdmFsdWUuCUhUX0lPVF9QRUVSX0UgKi8KLQotCS8qICBPRE0gV3JpdGUgKi8KLQkvKiAxIFBIWV9TVEFUVVNfSU5GTyAqLwotCXU4CVJTU0lfUGF0aFs0XTsJCS8qICAqLwotCXU4CVJTU0lfQXZlOwotCXU4CVJYRVZNWzRdOwotCXU4CVJYU05SWzRdOwotfTsKLQogLyogIDIwMTEvMTAvMjAgTUggRGVmaW5lIENvbW1vbiBpbmZvIGVudW0gZm9yIGFsbCB0ZWFtLiAqLwogCiBlbnVtIG9kbV9jb21tb25faW5mb19kZWYgewpAQCAtNzQwLDggKzcyNCw2IEBACiAJdTMyCVN1cHBvcnRJQ1R5cGU7CiAJLyogIEN1dCBWZXJzaW9uIFRlc3RDaGlwL0EtY3V0L0ItY3V0Li4uID0gMC8xLzIvMy8uLi4gKi8KIAl1OAlDdXRWZXJzaW9uOwotCS8qICBSRiBUeXBlIDRUNFIvM1QzUi8yVDJSLzFUMlIvMVQxUi8uLi4gKi8KLQl1OAlSRlR5cGU7CiAJLyogIEJvYXJkIFR5cGUgTm9ybWFsL0hpZ2hQb3dlci9NaW5pQ2FyZC9TTElNL0NvbWJvLy4gPSAwLzEvMi8zLzQvLiAqLwogCXU4CUJvYXJkVHlwZTsKIAkvKiAgd2l0aCBleHRlcm5hbCBMTkEgIE5PL1llcyA9IDAvMSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX2ludGYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9pbnRmLmgKaW5kZXggNTRmY2E3OS4uZGJkN2RjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX2ludGYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfaW50Zi5oCkBAIC0zNCw3ICszNCw2IEBACiBpbnQgcnR3X2luaXRfbmV0ZGV2X25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYsIGNvbnN0IGNoYXIgKmlmbmFtZSk7CiBzdHJ1Y3QgbmV0X2RldmljZSAqcnR3X2luaXRfbmV0ZGV2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB1MTYgcnR3X3JlY3Zfc2VsZWN0X3F1ZXVlKHN0cnVjdCBza19idWZmICpza2IpOwotdm9pZCBydHdfcHJvY19yZW1vdmVfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiBpbnQgcG1fbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYsIHU4IGJub3JtYWwpOwogdm9pZCBydHdfaXBzX2Rldl91bmxvYWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfc2VydmljZS5oCmluZGV4IDU0NzU5NTYuLjkwNDdiNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaApAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgpAQCAtNDQsNyArNDQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgkvKiAgTmVjZXNzYXJ5IGJlY2F1c2Ugd2UgdXNlIHRoZSBwcm9jIGZzICovCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qICBmb3Igc3RydWN0IHRhc2tsZXRfc3RydWN0ICovCiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CkBAIC03OCwxNiArNzcsMTIgQEAKIAogdm9pZCAqcnR3X21hbGxvYzJkKGludCBoLCBpbnQgdywgaW50IHNpemUpOwogCi11MzIgIF9ydHdfZG93bl9zZW1hKHN0cnVjdCBzZW1hcGhvcmUgKnNlbWEpOwotCiB2b2lkIF9ydHdfaW5pdF9xdWV1ZShzdHJ1Y3QgX19xdWV1ZSAqcHF1ZXVlKTsKIAogc3RydWN0IHJ0d19uZXRkZXZfcHJpdl9pbmRpY2F0b3IgewogCXZvaWQgKnByaXY7Ci0JdTMyIHNpemVvZl9wcml2OwogfTsKLXN0cnVjdCBuZXRfZGV2aWNlICpydHdfYWxsb2NfZXRoZXJkZXZfd2l0aF9vbGRfcHJpdihpbnQgc2l6ZW9mX3ByaXYsCi0JCQkJCQkgICAgdm9pZCAqb2xkX3ByaXYpOworc3RydWN0IG5ldF9kZXZpY2UgKnJ0d19hbGxvY19ldGhlcmRldl93aXRoX29sZF9wcml2KHZvaWQgKm9sZF9wcml2KTsKIAogI2RlZmluZSBydHdfbmV0ZGV2X3ByaXYobmV0ZGV2KQkJCQkJXAogCSgoKHN0cnVjdCBydHdfbmV0ZGV2X3ByaXZfaW5kaWNhdG9yICopbmV0ZGV2X3ByaXYobmV0ZGV2KSktPnByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcGh5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcGh5LmgKaW5kZXggOWE5YWI4Mi4uY2QzODdlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3BoeS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9waHkuaApAQCAtMTEsMTcgKzExLDEzIEBACiAKIHUzMiBwaHlfcXVlcnlfYmJfcmVnKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTMyIHJlZ2FkZHIsIHUzMiBiaXRtYXNrKTsKIHZvaWQgcGh5X3NldF9iYl9yZWcoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssIHUzMiBkYXRhKTsKLXUzMiBwaHlfcXVlcnlfcmZfcmVnKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgZW51bSByZl9yYWRpb19wYXRoIHJmX3BhdGgsCit1MzIgcnR3X2hhbF9yZWFkX3JmcmVnKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgZW51bSByZl9yYWRpb19wYXRoIHJmX3BhdGgsCiAJCSAgICAgdTMyIHJlZ19hZGRyLCB1MzIgYml0X21hc2spOwogdm9pZCBwaHlfc2V0X3JmX3JlZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIGVudW0gcmZfcmFkaW9fcGF0aCByZl9wYXRoLAogCQkgICAgdTMyIHJlZ19hZGRyLCB1MzIgYml0X21hc2ssIHUzMiBkYXRhKTsKIAogdm9pZCBwaHlfc2V0X3R4X3Bvd2VyX2xldmVsKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggY2hhbm5lbCk7CiAKLXZvaWQgcGh5X3NldF9id19tb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgZW51bSBodF9jaGFubmVsX3dpZHRoIGJhbmR3aWR0aCwKLQkJICAgICB1bnNpZ25lZCBjaGFyIG9mZnNldCk7Ci12b2lkIHBoeV9zd19jaG5sKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggY2hhbm5lbCk7Ci0KIHZvaWQgcnRsODhldV9kbV90eHBvd2VyX3RyYWNrX2FkanVzdChzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtLAogCQkJCSAgICAgdTggdHlwZSwgdTggKmRpciwgdTMyICpvdXRfd3JpdGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcmVjdl9vc2RlcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3JlY3Zfb3NkZXAuaAppbmRleCBjYWQzMTU4Li43NTUwZDU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcmVjdl9vc2RlcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9yZWN2X29zZGVwLmgKQEAgLTI2LDEzICsyNiw5IEBACiBzMzIgIHJ0d19yZWN2X2VudHJ5KHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7CiBpbnQgcnR3X3JlY3ZfaW5kaWNhdGVwa3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZfZnJhbWUpOwotdm9pZCBydHdfcmVjdl9yZXR1cm5wYWNrZXQoc3RydWN0ICBuZXRfZGV2aWNlICpjbnh0LCBzdHJ1Y3Qgc2tfYnVmZiAqcmV0cGt0KTsKIAogdm9pZCBydHdfaGFuZGxlX3RraXBfbWljX2VycihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJncm91cCk7CiAKLWludCBydHdfaW5pdF9yZWN2X3ByaXYoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2LCBzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfZnJlZV9yZWN2X3ByaXYoc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2KTsKLQogdm9pZCBydHdfb3NfcmVjdl9yZXNvdXJjZV9hbGxvYyhzdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdmZyKTsKIAogaW50IHJ0d19vc19yZWN2YnVmX3Jlc291cmNlX2FsbG9jKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHJlY3ZfYnVmICpidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2NtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2NtZC5oCmluZGV4IDRkN2Q4MDQuLjA0MmI0ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9jbWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfY21kLmgKQEAgLTQ5LDEyICs0OSw2IEBACiAJIEgyQ19SRVNFVF9UU0YJCQk9IDB4YzAsCiB9OwogCi1zdHJ1Y3QgY21kX21zZ19wYXJtIHsKLQl1OCBlaWQ7IC8qIGVsZW1lbnQgaWQgKi8KLQl1OCBzejsgLyogIHN6ICovCi0JdTggYnVmWzZdOwotfTsKLQogZW51bSB7CiAJUFdSUwogfTsKQEAgLTY3LDE1ICs2MSw2IEBACiAJdTggUHdyU3RhdGU7LyogQWxsT04oMHgwYyksUkZPTigweDA0KSxSRk9GRigweDAwKSAqLwogfTsKIAotc3RydWN0IEgyQ19TU19SRk9GRl9QQVJBTSB7Ci0JdTggUk9GT247IC8qICAxOiBvbiwgMDpvZmYgKi8KLQl1MTYgZ3Bpb19wZXJpb2Q7IC8qICB1bml0OiAxMDI0IHVzICovCi19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgam9pbmJzc3JwdF9wYXJtIHsKLQl1OCBPcE1vZGU7CS8qICBSVF9NRURJQV9TVEFUVVMgKi8KLX07Ci0KIHN0cnVjdCByc3ZkcGFnZV9sb2MgewogCXU4IExvY1Byb2JlUnNwOwogCXU4IExvY1BzUG9sbDsKQEAgLTg0LDI2ICs2OSw5IEBACiAJdTggTG9jQlRRb3NOdWxsOwogfTsKIAotc3RydWN0IFAyUF9QU19PZmZsb2FkX3QgewotCXU4IE9mZmxvYWRfRW46MTsKLQl1OCByb2xlOjE7IC8qICAxOiBPd25lciwgMDogQ2xpZW50ICovCi0JdTggQ1RXaW5kb3dfRW46MTsKLQl1OCBOb0EwX0VuOjE7Ci0JdTggTm9BMV9FbjoxOwotCXU4IEFsbFN0YVNsZWVwOjE7IC8qICBPbmx5IHZhbGlkIGluIE93bmVyICovCi0JdTggZGlzY292ZXJ5OjE7Ci0JdTggcnN2ZDoxOwotfTsKLQotc3RydWN0IFAyUF9QU19DVFdQZXJpb2RfdCB7Ci0JdTggQ1RXUGVyaW9kOwkvKiBUVSAqLwotfTsKLQogLyogIGhvc3QgbWVzc2FnZSB0byBmaXJtd2FyZSBjbWQgKi8KIHZvaWQgcnRsODE4OGVfc2V0X0Z3UHdyTW9kZV9jbWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCBNb2RlKTsKIHZvaWQgcnRsODE4OGVfc2V0X0Z3Sm9pbkJzc1JlcG9ydF9jbWQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCBtc3RhdHVzKTsKLXZvaWQgcnRsODE4OGVfQWRkX1JhdGVBVGlkKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTMyIGJpdG1hcCwgdTggYXJnLAotCQkJICAgdTggcnNzaV9sZXZlbCk7CiAKIHZvaWQgcnRsODE4OGVfc2V0X0Z3TWVkaWFTdGF0dXNfY21kKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgX19sZTE2IG1zdGF0dXNfcnB0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfZG0uaAppbmRleCA0MTkwMTEyLi5jMGZmZDk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfZG0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfZG0uaApAQCAtNDUsMTIgKzQ1LDkgQEAKIAl1OAlQb3dlckluZGV4X2JhY2t1cFs2XTsKIH07CiAKLXZvaWQgcnRsODE4OGVfaW5pdF9kbV9wcml2KHN0cnVjdCBhZGFwdGVyICphZGFwdCk7CiB2b2lkIHJ0bDgxODhlX0luaXRIYWxEbShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQpOwotdm9pZCBydGw4MTg4ZV9IYWxEbVdhdGNoRG9nKHN0cnVjdCBhZGFwdGVyICphZGFwdCk7CiAKIHZvaWQgQW50RGl2Q29tcGFyZTgxODhFKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCwKIAkJCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpzcmMpOwotdTggQW50RGl2QmVmb3JlTGluazgxODhFKHN0cnVjdCBhZGFwdGVyICphZGFwdCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2hhbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2hhbC5oCmluZGV4IDlkZDVjMjkuLjdjODFlM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9oYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfaGFsLmgKQEAgLTIwMiw3ICsyMDIsNiBAQAogCiAJLyogcmZfY3RybCAqLwogCXU4CXJmX2NoaXA7Ci0JdTgJcmZfdHlwZTsKIAl1OAlOdW1Ub3RhbFJGUGF0aDsKIAogCXU4CUJvYXJkVHlwZTsKQEAgLTM1MSwxMCArMzUwLDYgQEAKIAl1OAlVc2JSeEFnZ1BhZ2VUaW1lb3V0OwogfTsKIAotI2RlZmluZSBHRVRfSEFMX0RBVEEoX19wQWRhcHRlcikJCQkJXAotCSgoc3RydWN0IGhhbF9kYXRhXzgxODhlICopKChfX3BBZGFwdGVyKS0+SGFsRGF0YSkpCi0jZGVmaW5lIEdFVF9SRl9UWVBFKHByaXYpCQkoR0VUX0hBTF9EQVRBKHByaXYpLT5yZl90eXBlKQotCiAvKiAgcnRsODE4OGVfaGFsX2luaXQuYyAqLwogdm9pZCBfODA1MVJlc2V0ODhFKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIHJ0bDgxODhlX0luaXRpYWxpemVGaXJtd2FyZVZhcnMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKQEAgLTM4NSw4ICszODAsNiBAQAogdm9pZCBIYWxfUmVhZFBvd2VyU2F2aW5nTW9kZTg4RShzdHJ1Y3QgYWRhcHRlciAqcEFkYXB0ZXIsIHU4ICpod2luZm8sCiAJCQkJYm9vbCBBdXRvTG9hZEZhaWwpOwogCi12b2lkIHJ0bDgxODhlX3NldF9oYWxfb3BzKHN0cnVjdCBoYWxfb3BzICpwSGFsRnVuYyk7Ci0KIC8qICByZWdpc3RlciAqLwogCiB2b2lkIHJ0bDgxODhlX3N0YXJ0X3RocmVhZChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2xlZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX2xlZC5oCmluZGV4IGZjYTZkOGMuLmQxYWQ2YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9sZWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfbGVkLmgKQEAgLTIyLDggKzIyLDYgQEAKIC8qICAqLwogLyogIEludGVyZmFjZSB0byBtYW5pcHVsYXRlIExFRCBvYmplY3RzLiAqLwogLyogICovCi12b2lkIHJ0bDgxODhldV9Jbml0U3dMZWRzKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDgxODhldV9EZUluaXRTd0xlZHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgU3dMZWRPbihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBMRURfODcxeCAqcExlZCk7CiB2b2lkIFN3TGVkT2ZmKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IExFRF84NzF4ICpwTGVkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3JlY3YuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV9yZWN2LmgKaW5kZXggNTQwNDhiYy4uODA4MzJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3JlY3YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfcmVjdi5oCkBAIC01MSwxMiArNTEsMTEgQEAKIH07CiAKICNkZWZpbmUgSU5URVJSVVBUX01TR19GT1JNQVRfTEVOIDYwCi1zMzIgcnRsODE4OGV1X2luaXRfcmVjdl9wcml2KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDgxODhldV9mcmVlX3JlY3ZfcHJpdihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogdm9pZCBydGw4MTg4ZXVfcmVjdl9oZGwoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmKTsKIHZvaWQgcnRsODE4OGV1X3JlY3ZfdGFza2xldCh2b2lkICpwcml2KTsKIHZvaWQgcnRsODE4OGVfcXVlcnlfcnhfcGh5X3N0YXR1cyhzdHJ1Y3QgcmVjdl9mcmFtZSAqZnIsIHN0cnVjdCBwaHlfc3RhdCAqcGh5KTsKLXZvaWQgcnRsODE4OGVfcHJvY2Vzc19waHlfaW5mbyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHZvaWQgKnByZnJhbWUpOwordm9pZCBydGw4MTg4ZV9wcm9jZXNzX3BoeV9pbmZvKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKKwkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSk7CiB2b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfcGh5aW5mb184OGUoc3RydWN0IHJlY3ZfZnJhbWUgKmZyYSwgc3RydWN0IHBoeV9zdGF0ICpwaHkpOwogdm9pZCB1cGRhdGVfcmVjdmZyYW1lX2F0dHJpYl84OGUoc3RydWN0IHJlY3ZfZnJhbWUgKmZyYSwKIAkJCQkgc3RydWN0IHJlY3Zfc3RhdCAqc3RhdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfeG1pdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0bDgxODhlX3htaXQuaAppbmRleCA2NWE2M2RmLi42NjIwNWI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnRsODE4OGVfeG1pdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydGw4MTg4ZV94bWl0LmgKQEAgLTE1NCwxNCArMTU0LDExIEBACiB2b2lkIHJ0bDgxODhlX2ZpbGxfZmFrZV90eGRlc2Moc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcERlc2MsCiAJCQkgICAgICAgdTMyIEJ1ZmZlckxlbiwgdTggSXNQc1BvbGwsIHU4IElzQlRRb3NOdWxsKTsKIHMzMiBydGw4MTg4ZXVfaW5pdF94bWl0X3ByaXYoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKLXMzMiBydGw4MTg4ZXVfaGFsX3htaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqZnJhbWUpOwotczMyIHJ0bDgxODhldV9tZ250X3htaXQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqZnJhbWUpOwogczMyIHJ0bDgxODhldV94bWl0X2J1Zl9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiAjZGVmaW5lIGhhbF94bWl0X2hhbmRsZXIgcnRsODE4OGV1X3htaXRfYnVmX2hhbmRsZXIKIHZvaWQgcnRsODE4OGV1X3htaXRfdGFza2xldCh2b2lkICpwcml2KTsKIHMzMiBydGw4MTg4ZXVfeG1pdGZyYW1lX2NvbXBsZXRlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LAotCQkJCSBzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmKTsKKwkJCQkgc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KTsKIAogdm9pZCBkdW1wX3R4cnB0X2NjeF84OGUodm9pZCAqYnVmKTsKIHZvaWQgaGFuZGxlX3R4cnB0X2NjeF84OGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19hcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19hcC5oCmluZGV4IGI4MjA2ODQuLmU4ZGQ2ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfYXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2FwLmgKQEAgLTUwLDcgKzUwLDYgQEAKIHU4IGFwX2ZyZWVfc3RhKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhLAogCSAgICAgICBib29sIGFjdGl2ZSwgdTE2IHJlYXNvbik7CiBpbnQgcnR3X3N0YV9mbHVzaChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotaW50IHJ0d19hcF9pbmZvcm1fY2hfc3dpdGNoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggbmV3X2NoLCB1OCBjaF9vZmZzZXQpOwogdm9pZCBzdGFydF9hcF9tb2RlKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIHN0b3BfYXBfbW9kZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwogI2VuZGlmIC8qIGVuZCBvZiBDT05GSUdfODhFVV9BUF9NT0RFICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2NtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19jbWQuaAppbmRleCAwOGNhNTkyLi4xOGE2NTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2NtZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfY21kLmgKQEAgLTM5LDggKzM5LDggQEAKIH07CiAKIHN0cnVjdCBjbWRfcHJpdiB7Ci0Jc3RydWN0IHNlbWFwaG9yZSBjbWRfcXVldWVfc2VtYTsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjbWRfcXVldWVfY29tcDsKKwlzdHJ1Y3QgY29tcGxldGlvbiB0ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXA7CiAJc3RydWN0IF9fcXVldWUgY21kX3F1ZXVlOwogCXU4IGNtZHRoZF9ydW5uaW5nOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcjsKQEAgLTIxMCwzNCArMjEwLDYgQEAKIH07CiAKIC8qCi0JQ2FsbGVyIEFkLUhvYy9BUAotCi0JQ29tbWFuZCBtb2RlCi0KLQlUaGlzIGlzIHRvIGZvcmNlIGZ3IHRvIGRlbCBhbiBzdGFfZGF0YSBlbnRyeSBwZXIgZHJpdmVyJ3MgcmVxdWVzdAotCi0JRlcgd2lsbCBpbnZhbGlkYXRlIHRoZSBjYW0gZW50cnkgYXNzb2NpYXRlZCB3aXRoIGl0LgotCi0qLwotc3RydWN0IGRlbF9hc3NvY3N0YV9wYXJtIHsKLQl1OAlhZGRyW0VUSF9BTEVOXTsKLX07Ci0KLS8qCi1DYWxsZXIgTW9kZTogQVAvQWQtSG9DKE0pCi0KLU5vdGVzOiBUbyBub3RpZnkgZncgdGhhdCBnaXZlbiBzdGFpZCBoYXMgY2hhbmdlZCBpdHMgcG93ZXIgc3RhdGUKLQotQ29tbWFuZCBNb2RlCi0KLSovCi1zdHJ1Y3Qgc2V0c3RhcHdyc3RhdGVfcGFybSB7Ci0JdTgJc3RhaWQ7Ci0JdTgJc3RhdHVzOwotCXU4CWh3YWRkcls2XTsKLX07Ci0KLS8qCiAJTm90ZXM6IFRoaXMgY29tbWFuZCBpcyB1c2VkIGZvciBIMkMvQzJIIGxvb3BiYWNrIHRlc3RpbmcKIAogCW1hY1swXSA9PSAwCkBAIC0zMTIsOCArMjg0LDYgQEAKIAl1OCBjaGFubmVsX3BsYW47CiB9OwogCi0jZGVmaW5lIEdFTl9DTURfQ09ERShjbWQpCWNtZCAjIyBfQ01EXwotCiAvKgogCiBSZXN1bHQ6CkBAIC0zNzYsNDIgKzM0Niw0MiBAQAogfTsKIAogZW51bSBydHdfaDJjX2NtZCB7Ci0JR0VOX0NNRF9DT0RFKF9Kb2luQnNzKSwKLQlHRU5fQ01EX0NPREUoX0Rpc0Nvbm5lY3QpLAotCUdFTl9DTURfQ09ERShfQ3JlYXRlQnNzKSwKLQlHRU5fQ01EX0NPREUoX1NldE9wTW9kZSksCi0JR0VOX0NNRF9DT0RFKF9TaXRlU3VydmV5KSwKLQlHRU5fQ01EX0NPREUoX1NldEF1dGgpLAotCUdFTl9DTURfQ09ERShfU2V0S2V5KSwKLQlHRU5fQ01EX0NPREUoX1NldFN0YUtleSksCi0JR0VOX0NNRF9DT0RFKF9TZXRBc3NvY1N0YSksCi0JR0VOX0NNRF9DT0RFKF9BZGRCQVJlcSksCi0JR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsKSwKLQlHRU5fQ01EX0NPREUoX1RYX0JlYWNvbiksCi0JR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpLAotCUdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSksCi0JR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsUGxhbiksCisJX0pvaW5Cc3NfQ01EXywKKwlfRGlzQ29ubmVjdF9DTURfLAorCV9DcmVhdGVCc3NfQ01EXywKKwlfU2V0T3BNb2RlX0NNRF8sCisJX1NpdGVTdXJ2ZXlfQ01EXywKKwlfU2V0QXV0aF9DTURfLAorCV9TZXRLZXlfQ01EXywKKwlfU2V0U3RhS2V5X0NNRF8sCisJX1NldEFzc29jU3RhX0NNRF8sCisJX0FkZEJBUmVxX0NNRF8sCisJX1NldENoYW5uZWxfQ01EXywKKwlfVFhfQmVhY29uX0NNRF8sCisJX1NldF9NTE1FX0VWVF9DTURfLAorCV9TZXRfRHJ2X0V4dHJhX0NNRF8sCisJX1NldENoYW5uZWxQbGFuX0NNRF8sCiAKIAlNQVhfSDJDQ01ECiB9OwogCiAjaWZkZWYgX1JUV19DTURfQ18KIHN0YXRpYyBzdHJ1Y3QgX2NtZF9jYWxsYmFjawlydHdfY21kX2NhbGxiYWNrW10gPSB7Ci0Je0dFTl9DTURfQ09ERShfSm9pbkJzcyksICZydHdfam9pbmJzc19jbWRfY2FsbGJhY2t9LAotCXtHRU5fQ01EX0NPREUoX0Rpc0Nvbm5lY3QpLCAmcnR3X2Rpc2Fzc29jX2NtZF9jYWxsYmFja30sCi0Je0dFTl9DTURfQ09ERShfQ3JlYXRlQnNzKSwgJnJ0d19jcmVhdGVic3NfY21kX2NhbGxiYWNrfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRPcE1vZGUpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TaXRlU3VydmV5KSwgJnJ0d19zdXJ2ZXlfY21kX2NhbGxiYWNrfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRBdXRoKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0S2V5KSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0U3RhS2V5KSwgJnJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRBc3NvY1N0YSksICZydHdfc2V0YXNzb2NzdGFfY21kcnNwX2NhbGxiYWNrfSwKLQl7R0VOX0NNRF9DT0RFKF9BZGRCQVJlcSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldENoYW5uZWwpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9UWF9CZWFjb24pLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0Q2hhbm5lbFBsYW4pLCBOVUxMfSwKKwl7X0pvaW5Cc3NfQ01EXywgJnJ0d19qb2luYnNzX2NtZF9jYWxsYmFja30sCisJe19EaXNDb25uZWN0X0NNRF8sICZydHdfZGlzYXNzb2NfY21kX2NhbGxiYWNrfSwKKwl7X0NyZWF0ZUJzc19DTURfLCAmcnR3X2NyZWF0ZWJzc19jbWRfY2FsbGJhY2t9LAorCXtfU2V0T3BNb2RlX0NNRF8sIE5VTEx9LAorCXtfU2l0ZVN1cnZleV9DTURfLCAmcnR3X3N1cnZleV9jbWRfY2FsbGJhY2t9LAorCXtfU2V0QXV0aF9DTURfLCBOVUxMfSwKKwl7X1NldEtleV9DTURfLCBOVUxMfSwKKwl7X1NldFN0YUtleV9DTURfLCAmcnR3X3NldHN0YUtleV9jbWRyc3BfY2FsbGJhY2t9LAorCXtfU2V0QXNzb2NTdGFfQ01EXywgJnJ0d19zZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhY2t9LAorCXtfQWRkQkFSZXFfQ01EXywgTlVMTH0sCisJe19TZXRDaGFubmVsX0NNRF8sIE5VTEx9LAorCXtfVFhfQmVhY29uX0NNRF8sIE5VTEx9LAorCXtfU2V0X01MTUVfRVZUX0NNRF8sIE5VTEx9LAorCXtfU2V0X0Rydl9FeHRyYV9DTURfLCBOVUxMfSwKKwl7X1NldENoYW5uZWxQbGFuX0NNRF8sIE5VTEx9LAogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2RlYnVnLmgKaW5kZXggN2VkNGNhZC4uOTU1OTBhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZGVidWcuaApAQCAtMTI5LDEzMyArMTI5LDEyIEBACiBpbnQgcHJvY19zZXRfcmVhZF9yZWcoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwogCi1pbnQgcHJvY19nZXRfZndzdGF0ZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotaW50IHByb2NfZ2V0X3NlY19pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJICAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLWludCBwcm9jX2dldF9tbG1leHRfc3RhdGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfcW9zX29wdGlvbihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQlvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCWludCAqZW9mLCB2b2lkICpkYXRhKTsKLWludCBwcm9jX2dldF9odF9vcHRpb24oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkgICAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci1pbnQgcHJvY19nZXRfcmZfaW5mbyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotaW50IHByb2NfZ2V0X2FwX2luZm8oY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQogaW50IHByb2NfZ2V0X2FkYXB0ZXJfc3RhdGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAogCQkJICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCiAJCQkgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CiAKLWludCBwcm9jX2dldF90cnhfaW5mbyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9tYWNfcmVnX2R1bXAxKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfbWFjX3JlZ19kdW1wMihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X21hY19yZWdfZHVtcDMoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9iYl9yZWdfZHVtcDEoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfYmJfcmVnX2R1bXAyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X2JiX3JlZ19kdW1wMyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9yZl9yZWdfZHVtcDEoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfcmZfcmVnX2R1bXAyKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X3JmX3JlZ19kdW1wMyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9yZl9yZWdfZHVtcDQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi0jaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQotCi1pbnQgcHJvY19nZXRfYWxsX3N0YV9pbmZvKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotI2VuZGlmCi0KIGludCBwcm9jX2dldF9iZXN0X2NoYW5uZWwoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAogCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKIAkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwogCi1pbnQgcHJvY19nZXRfcnhfc2lnbmFsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJICAgICAgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkgICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19zZXRfcnhfc2lnbmFsKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9odF9lbmFibGUoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkgICAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCSAgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX3NldF9odF9lbmFibGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X2NidzQwX2VuYWJsZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX3NldF9jYnc0MF9lbmFibGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCi0JCQkgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfYW1wZHVfZW5hYmxlKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2Nfc2V0X2FtcGR1X2VuYWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJCSAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX2dldF9yeF9zdGJjKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJICAgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0KLWludCBwcm9jX3NldF9yeF9zdGJjKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwotCi1pbnQgcHJvY19nZXRfdHdvX3BhdGhfcnNzaShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2NfZ2V0X3Jzc2lfZGlzcChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCSAgICAgICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJICAgICAgIGludCAqZW9mLCB2b2lkICpkYXRhKTsKLQotaW50IHByb2Nfc2V0X3Jzc2lfZGlzcChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpOwotCiAjZW5kaWYJLyogX19SVFdfREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2VmdXNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2VmdXNlLmgKaW5kZXggOWJmYjEwYy4uMTY4YzEyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19lZnVzZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZWZ1c2UuaApAQCAtMzQsMTYgKzM0LDYgQEAKICNkZWZpbmUJRUZVU0VfV0lGSQkJCQkwCiAjZGVmaW5lCUVGVVNFX0JUCQkJCTEKIAotZW51bSBfRUZVU0VfREVGX1RZUEUgewotCVRZUEVfRUZVU0VfTUFYX1NFQ1RJT04JCQkJPSAwLAotCVRZUEVfRUZVU0VfUkVBTF9DT05URU5UX0xFTgkJCT0gMSwKLQlUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19CQU5LCQk9IDIsCi0JVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfVE9UQUwJPSAzLAotCVRZUEVfRUZVU0VfTUFQX0xFTgkJCQkJPSA0LAotCVRZUEVfRUZVU0VfUFJPVEVDVF9CWVRFU19CQU5LCQk9IDUsCi0JVFlQRV9FRlVTRV9DT05URU5UX0xFTl9CQU5LCQkJPSA2LAotfTsKLQogLyogRS1GdXNlICovCiAjZGVmaW5lIEVGVVNFX01BUF9TSVpFICAgICAgNTEyCiAjZGVmaW5lIEVGVVNFX01BWF9TSVpFICAgICAgMjU2CkBAIC05NSw4ICs4NSw2IEBACiB9OwogCiB1OCBFZnVzZV9DYWxjdWxhdGVXb3JkQ250cyh1OCB3b3JkX2VuKTsKLXZvaWQgRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTggdHlwZSwgdTggdHlwZTEsCi0JCQkgICAgICB2b2lkICpvdXQpOwogdTggZWZ1c2VfT25lQnl0ZVJlYWQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBhZGRyLCB1OCAqZGF0YSk7CiB1OCBlZnVzZV9PbmVCeXRlV3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBhZGRyLCB1OCBkYXRhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19ldmVudC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19ldmVudC5oCmluZGV4IDVjMzRlNTYuLjFjNWViZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfZXZlbnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2V2ZW50LmgKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+CiAKICNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VtLmg+CiAKIC8qCkBAIC03MSwxMiArNzEsNiBAQAogCWludCBtYWNfaWQ7CiB9OwogCi1zdHJ1Y3QgYWRkYmFfZXZlbnQgewotCXVuc2lnbmVkIGludCB0aWQ7Ci19OwotCi0jZGVmaW5lIEdFTl9FVlRfQ09ERShldmVudCkJZXZlbnQgIyMgX0VWVF8KLQogc3RydWN0IGZ3ZXZlbnQgewogCXUzMglwYXJtc2l6ZTsKIAl2b2lkICgqZXZlbnRfY2FsbGJhY2spKHN0cnVjdCBhZGFwdGVyICpkZXYsIHU4ICpwYnVmKTsKQEAgLTg0LDIxICs3OCw2IEBACiAKICNkZWZpbmUgQzJIRVZFTlRfU1oJCQkzMgogCi1zdHJ1Y3QgZXZlbnRfbm9kZSB7Ci0JdW5zaWduZWQgY2hhciAqbm9kZTsKLQl1bnNpZ25lZCBjaGFyIGV2dF9jb2RlOwotCXVuc2lnbmVkIHNob3J0IGV2dF9zejsKLQlpbnQJKmNhbGxlcl9mZl90YWlsOwotCWludAljYWxsZXJfZmZfc3o7Ci19OwotCi1zdHJ1Y3QgYzJoZXZlbnRfcXVldWUgewotCWludAloZWFkOwotCWludAl0YWlsOwotCXN0cnVjdAlldmVudF9ub2RlCW5vZGVzW0MySEVWRU5UX1NaXTsKLQl1bnNpZ25lZCBjaGFyCXNlcTsKLX07Ci0KICNkZWZpbmUgTkVUV09SS19RVUVVRV9TWgk0CiAKIHN0cnVjdCBuZXR3b3JrX3F1ZXVlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaHQuaAppbmRleCBiNDU0ODNmLi5kODQyZWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2h0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19odC5oCkBAIC0xNSwxNiArMTUsMTEgQEAKICNpZm5kZWYgX1JUV19IVF9IXwogI2RlZmluZSBfUlRXX0hUX0hfCiAKLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSAid2lmaS5oIgorI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgogCiBzdHJ1Y3QgaHRfcHJpdiB7CiAJdTMyCWh0X29wdGlvbjsKIAl1MzIJYW1wZHVfZW5hYmxlOy8qIGZvciBlbmFibGUgVHggQS1NUERVICovCi0JdTMyCXR4X2Ftc2R1X2VuYWJsZTsvKiBmb3IgZW5hYmxlIFR4IEEtTVNEVSAqLwotCXUzMgl0eF9hbWRzdV9tYXhsZW47IC8qICAxOiA4aywgMDo0ayA7IGRlZmF1bHQ6OGssIGZvciB0eCAqLwotCXUzMglyeF9hbXBkdV9tYXhsZW47IC8qIGZvciByeCByZW9yZGVyaW5nIGN0cmwgd2luX3N6LAotCQkJCSAgKiB1cGRhdGVkIHdoZW4gam9pbl9jYWxsYmFjay4gKi8KIAl1OAlid21vZGU7LyogICovCiAJdTgJY2hfb2Zmc2V0Oy8qIFBSSU1FX0NITkxfT0ZGU0VUICovCiAJdTgJc2dpOy8qIHNob3J0IEdJICovCkBAIC0zMyw3ICsyOCw3IEBACiAJdTgJYWdnX2VuYWJsZV9iaXRtYXA7CiAJdTgJY2FuZGlkYXRlX3RpZF9iaXRtYXA7CiAKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgaHRfY2FwOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcDsKIH07CiAKICNlbmRpZgkvKiBfUlRMODcxWF9IVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19pb2N0bC5oCmluZGV4IDNhNjUyZGYuLmE2YjFjODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2lvY3RsLmgKQEAgLTY5LDE1ICs2OSw2IEBACiAJU0VUX09JRAogfTsKIAotc3RydWN0IG9pZF9mdW5zX25vZGUgewotCXVuc2lnbmVkIGludCBvaWRfc3RhcnQ7IC8qIHRoZSBzdGFydGluZyBudW1iZXIgZm9yIE9JRCAqLwotCXVuc2lnbmVkIGludCBvaWRfZW5kOyAvKiB0aGUgZW5kaW5nIG51bWJlciBmb3IgT0lEICovCi0Jc3RydWN0IG9pZF9vYmpfcHJpdiAqbm9kZV9hcnJheTsKLQl1bnNpZ25lZCBpbnQgYXJyYXlfc3o7IC8qIHRoZSBzaXplIG9mIG5vZGVfYXJyYXkgKi8KLQlpbnQgcXVlcnlfY291bnRlcjsgLyogY291bnQgdGhlIG51bWJlciBvZiBxdWVyeSBoaXRzIGZvciB0aGlzIHNlZ21lbnQgKi8KLQlpbnQgc2V0X2NvdW50ZXI7IC8qIGNvdW50IHRoZSBudW1iZXIgb2Ygc2V0IGhpdHMgZm9yIHRoaXMgc2VnbWVudCAqLwotfTsKLQogc3RydWN0IG9pZF9wYXJfcHJpdiB7CiAJdm9pZAkJKmFkYXB0ZXJfY29udGV4dDsKIAlORElTX09JRAlvaWQ7CkBAIC04OSwxMiArODAsNiBAQAogCXUzMgkJZGJnOwogfTsKIAotc3RydWN0IG9pZF9vYmpfcHJpdiB7Ci0JdW5zaWduZWQgY2hhcglkYmc7IC8qICAwOiB3aXRob3V0IE9JRCBkZWJ1ZyBtZXNzYWdlCi0JCQkgICAgICAqICAxOiB3aXRoIE9JRCBkZWJ1ZyBtZXNzYWdlICovCi0JaW50ICgqb2lkZnVucykoc3RydWN0IG9pZF9wYXJfcHJpdiAqcG9pZF9wYXJfcHJpdik7Ci19OwotCiAjaWYgZGVmaW5lZChfUlRXX01QX0lPQ1RMX0NfKQogc3RhdGljIGludCBvaWRfbnVsbF9mdW5jdGlvbihzdHJ1Y3Qgb2lkX3Bhcl9wcml2ICpwb2lkX3Bhcl9wcml2KSB7CiAJcmV0dXJuIE5ESVNfU1RBVFVTX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZS5oCmluZGV4IDVkOGJjZTAuLjk0MzRiODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZS5oCkBAIC0zMDEsMTIgKzMwMSwxMCBAQAogCiAJdTggKm5pY19oZGw7CiAKLQl1OCBub3RfaW5kaWNfZGlzY287CiAJc3RydWN0IGxpc3RfaGVhZCAqcHNjYW5uZWQ7CiAJc3RydWN0IF9fcXVldWUgZnJlZV9ic3NfcG9vbDsKIAlzdHJ1Y3QgX19xdWV1ZSBzY2FubmVkX3F1ZXVlOwogCXU4ICpmcmVlX2Jzc19idWY7Ci0JdTMyCW51bV9vZl9zY2FubmVkOwogCiAJc3RydWN0IG5kaXNfODAyXzExX3NzaWQJYXNzb2Nfc3NpZDsKIAl1OAlhc3NvY19ic3NpZFs2XTsKQEAgLTMxOCwxMCArMzE2LDggQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCBhc3NvY190aW1lcjsKIAogCXVpbnQgYXNzb2NfYnlfYnNzaWQ7Ci0JdWludCBhc3NvY19ieV9yc3NpOwogCiAJc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90b190aW1lcjsgLyogIGRyaXZlciBpdHNlbGYgaGFuZGxlcyBzY2FuX3RpbWVvdXQgc3RhdHVzLiAqLwotCXUzMiBzY2FuX3N0YXJ0X3RpbWU7IC8qICB1c2VkIHRvIGV2YWx1YXRlIHRoZSB0aW1lIHNwZW50IGluIHNjYW5uaW5nICovCiAKIAlzdHJ1Y3QgcW9zX3ByaXYgcW9zcHJpdjsKIApAQCAtMzg3LDE3ICszODMsNiBAQAogCXUzMiB3cHNfcHJvYmVfcmVzcF9pZV9sZW47CiAJdTMyIHdwc19hc3NvY19yZXNwX2llX2xlbjsKIAotCXU4ICpwMnBfYmVhY29uX2llOwotCXU4ICpwMnBfcHJvYmVfcmVxX2llOwotCXU4ICpwMnBfcHJvYmVfcmVzcF9pZTsKLQl1OCAqcDJwX2dvX3Byb2JlX3Jlc3BfaWU7IC8qIGZvciBHTyAqLwotCXU4ICpwMnBfYXNzb2NfcmVxX2llOwotCi0JdTMyIHAycF9iZWFjb25faWVfbGVuOwotCXUzMiBwMnBfcHJvYmVfcmVxX2llX2xlbjsKLQl1MzIgcDJwX3Byb2JlX3Jlc3BfaWVfbGVuOwotCXUzMiBwMnBfZ29fcHJvYmVfcmVzcF9pZV9sZW47IC8qIGZvciBHTyAqLwotCXUzMiBwMnBfYXNzb2NfcmVxX2llX2xlbjsKIAlzcGlubG9ja190IGJjbl91cGRhdGVfbG9jazsKIAl1OAkJdXBkYXRlX2JjbjsKICNlbmRpZiAvKiBpZiBkZWZpbmVkIChDT05GSUdfODhFVV9BUF9NT0RFKSAqLwpAQCAtNTAwLDI3ICs0ODUsNiBAQAogCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdXBfc2Nhbm5lZF9uZXR3b3JrKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JcG1sbWVwcml2LT5udW1fb2Zfc2Nhbm5lZCsrOwotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG93bl9zY2FubmVkX25ldHdvcmsoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQotewotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQlwbWxtZXByaXYtPm51bV9vZl9zY2FubmVkLS07Ci0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2Nhbm5lZF9uZXR3b3JrX3ZhbChzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGludCB2YWwpCi17Ci0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCXBtbG1lcHJpdi0+bnVtX29mX3NjYW5uZWQgPSB2YWw7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci19Ci0KIHUxNiBydHdfZ2V0X2NhcGFiaWxpdHkoc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzcyk7CiB2b2lkIHJ0d191cGRhdGVfc2Nhbm5lZF9uZXR3b3JrKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAogCQkJCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICp0YXJnZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oCmluZGV4IDI3MzgyZmYuLjFiMWNhYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmgKQEAgLTM0OSw3ICszNDksNyBAQAogCiAJc3RydWN0IEFEREJBX3JlcXVlc3QJQUREQkFfcmVxOwogCXN0cnVjdCBXTU1fcGFyYV9lbGVtZW50CVdNTV9wYXJhbTsKLQlzdHJ1Y3QgSFRfY2Fwc19lbGVtZW50CUhUX2NhcHM7CisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgSFRfY2FwczsKIAlzdHJ1Y3QgSFRfaW5mb19lbGVtZW50CUhUX2luZm87CiAJc3RydWN0IHdsYW5fYnNzaWRfZXgJbmV0d29yazsvKiBqb2luIG5ldHdvcmsgb3IgYnNzX25ldHdvcmssCiAJCQkJCSAqIGlmIGluIGFwIG1vZGUsIGl0IGlzIHRoZSBzYW1lCkBAIC01MjksMTIgKzUyOSwxMiBAQAogdm9pZCB1cGRhdGVfc3RhX2luZm8oc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwogdW5zaWduZWQgaW50IHVwZGF0ZV9iYXNpY19yYXRlKHVuc2lnbmVkIGNoYXIgKnB0biwgdW5zaWduZWQgaW50IHB0bl9zeik7CiB1bnNpZ25lZCBpbnQgdXBkYXRlX3N1cHBvcnRlZF9yYXRlKHVuc2lnbmVkIGNoYXIgKnB0biwgdW5zaWduZWQgaW50IHB0bl9zeik7Ci11bnNpZ25lZCBpbnQgdXBkYXRlX01TQ19yYXRlKHN0cnVjdCBIVF9jYXBzX2VsZW1lbnQgKnBIVF9jYXBzKTsKK3Vuc2lnbmVkIGludCB1cGRhdGVfTVNDX3JhdGUoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzKTsKIHZvaWQgVXBkYXRlX1JBX0VudHJ5KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTMyIG1hY19pZCk7CiB2b2lkIHNldF9zdGFfcmF0ZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7CiAKIHVuc2lnbmVkIGNoYXIgZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgodTMyIG1hc2spOwotaW50IHN1cHBvcnRfc2hvcnRfR0koc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgSFRfY2Fwc19lbGVtZW50ICpjYXBzKTsKK2ludCBzdXBwb3J0X3Nob3J0X0dJKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmNhcHMpOwogdW5zaWduZWQgaW50IGlzX2FwX2luX3RraXAoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHVuc2lnbmVkIGludCBpc19hcF9pbl93ZXAoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHVuc2lnbmVkIGludCBzaG91bGRfZm9yYmlkX25fcmF0ZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwpAQCAtNTYyLDggKzU2Miw2IEBACiAJCSAgICAgICB1MTYgdGlkLCBpbnQgdHJ5X2NudCwgaW50IHdhaXRfbXMpOwogaW50IGlzc3VlX2RlYXV0aChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLAogCQkgdW5zaWduZWQgc2hvcnQgcmVhc29uKTsKLXZvaWQgaXNzdWVfYWN0aW9uX3NwY3RfY2hfc3dpdGNoKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTggKnJhLCB1OCBuZXdfY2gsCi0JCQkJIHU4IGNoX29mZnNldCk7CiB1bnNpZ25lZCBpbnQgc2VuZF9kZWxiYShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGluaXRpYXRvciwgdTggKmFkZHIpOwogdW5zaWduZWQgaW50IHNlbmRfYmVhY29uKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiAKQEAgLTYyNywyNyArNjI1LDI0IEBACiB1OCBzZXRfY3NhX2hkbChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKnBidWYpOwogdTggdGRsc19oZGwoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpwYnVmKTsKIAotI2RlZmluZSBHRU5fRFJWX0NNRF9IQU5ETEVSKHNpemUsIGNtZCkJe3NpemUsICZjbWQgIyMgX2hkbH0sCi0jZGVmaW5lIEdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemUsIGNtZCkJe3NpemUsIGNtZH0sCi0KICNpZmRlZiBfUlRXX0NNRF9DXwogCiBzdGF0aWMgc3RydWN0IGNtZF9oZGwgd2xhbmNtZHNbXSA9IHsKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpLCBqb2luX2NtZF9oZGwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBkaXNjb25uZWN0X3Bhcm0pLCBkaXNjb25uZWN0X2hkbCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpLCBjcmVhdGVic3NfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0b3Btb2RlX3Bhcm0pLCBzZXRvcG1vZGVfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtKSwgc2l0ZXN1cnZleV9jbWRfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0YXV0aF9wYXJtKSwgc2V0YXV0aF9oZGwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRrZXlfcGFybSksIHNldGtleV9oZGwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0pLCBzZXRfc3Rha2V5X2hkbCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldF9hc3NvY3N0YV9wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IGFkZEJhUmVxX3Bhcm0pLCBhZGRfYmFfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0X2NoX3Bhcm0pLCBzZXRfY2hfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCksIHR4X2JlYWNvbl9oZGwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgbWxtZV9ldnRfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIHJ0d19kcnZleHRyYV9jbWRfaGRsKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgU2V0Q2hhbm5lbFBsYW5fcGFyYW0pLCBzZXRfY2hwbGFuX2hkbCkKKwl7c2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSwgam9pbl9jbWRfaGRsfSwKKwl7c2l6ZW9mKHN0cnVjdCBkaXNjb25uZWN0X3Bhcm0pLCBkaXNjb25uZWN0X2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCksIGNyZWF0ZWJzc19oZGx9LAorCXtzaXplb2Yoc3RydWN0IHNldG9wbW9kZV9wYXJtKSwgc2V0b3Btb2RlX2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtKSwgc2l0ZXN1cnZleV9jbWRfaGRsfSwKKwl7c2l6ZW9mKHN0cnVjdCBzZXRhdXRoX3Bhcm0pLCBzZXRhdXRoX2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgc2V0a2V5X3Bhcm0pLCBzZXRrZXlfaGRsfSwKKwl7c2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0pLCBzZXRfc3Rha2V5X2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3Bhcm0pLCBOVUxMfSwKKwl7c2l6ZW9mKHN0cnVjdCBhZGRCYVJlcV9wYXJtKSwgYWRkX2JhX2hkbH0sCisJe3NpemVvZihzdHJ1Y3Qgc2V0X2NoX3Bhcm0pLCBzZXRfY2hfaGRsfSwKKwl7c2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSwgdHhfYmVhY29uX2hkbH0sCisJezAsIG1sbWVfZXZ0X2hkbH0sCisJezAsIHJ0d19kcnZleHRyYV9jbWRfaGRsfSwKKwl7c2l6ZW9mKHN0cnVjdCBTZXRDaGFubmVsUGxhbl9wYXJhbSksIHNldF9jaHBsYW5faGRsfQogfTsKIAogI2VuZGlmCkBAIC02NjksMzIgKzY2NCwzMiBAQAogdm9pZCBydHdfZndkYmdfZXZlbnRfY2FsbGJhY2soc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpwYnVmKTsKIAogZW51bSBydHdfYzJoX2V2ZW50IHsKLQlHRU5fRVZUX0NPREUoX1JlYWRfTUFDUkVHKSA9IDAsIC8qMCovCi0JR0VOX0VWVF9DT0RFKF9SZWFkX0JCUkVHKSwKLQlHRU5fRVZUX0NPREUoX1JlYWRfUkZSRUcpLAotCUdFTl9FVlRfQ09ERShfUmVhZF9FRVBST00pLAotCUdFTl9FVlRfQ09ERShfUmVhZF9FRlVTRSksCi0JR0VOX0VWVF9DT0RFKF9SZWFkX0NBTSksCS8qNSovCi0JR0VOX0VWVF9DT0RFKF9HZXRfQmFzaWNSYXRlKSwKLQlHRU5fRVZUX0NPREUoX0dldF9EYXRhUmF0ZSksCi0JR0VOX0VWVF9DT0RFKF9TdXJ2ZXkpLAkgLyo4Ki8KLQlHRU5fRVZUX0NPREUoX1N1cnZleURvbmUpLAkgLyo5Ki8KKwlfUmVhZF9NQUNSRUdfRVZUXyA9IDAsIC8qMCovCisJX1JlYWRfQkJSRUdfRVZUXywKKwlfUmVhZF9SRlJFR19FVlRfLAorCV9SZWFkX0VFUFJPTV9FVlRfLAorCV9SZWFkX0VGVVNFX0VWVF8sCisJX1JlYWRfQ0FNX0VWVF8sCS8qNSovCisJX0dldF9CYXNpY1JhdGVfRVZUXywKKwlfR2V0X0RhdGFSYXRlX0VWVF8sCisJX1N1cnZleV9FVlRfLAkgLyo4Ki8KKwlfU3VydmV5RG9uZV9FVlRfLAkgLyo5Ki8KIAotCUdFTl9FVlRfQ09ERShfSm9pbkJzcyksIC8qMTAqLwotCUdFTl9FVlRfQ09ERShfQWRkU1RBKSwKLQlHRU5fRVZUX0NPREUoX0RlbFNUQSksCi0JR0VOX0VWVF9DT0RFKF9BdGltRG9uZSksCi0JR0VOX0VWVF9DT0RFKF9UWF9SZXBvcnQpLAotCUdFTl9FVlRfQ09ERShfQ0NYX1JlcG9ydCksCQkvKjE1Ki8KLQlHRU5fRVZUX0NPREUoX0RUTV9SZXBvcnQpLAotCUdFTl9FVlRfQ09ERShfVFhfUmF0ZV9TdGF0aXN0aWNzKSwKLQlHRU5fRVZUX0NPREUoX0MySExCSyksCi0JR0VOX0VWVF9DT0RFKF9GV0RCRyksCi0JR0VOX0VWVF9DT0RFKF9DMkhGRUVEQkFDSyksICAgICAgICAgICAgIC8qMjAqLwotCUdFTl9FVlRfQ09ERShfQUREQkEpLAotCUdFTl9FVlRfQ09ERShfQzJIQkNOKSwKLQlHRU5fRVZUX0NPREUoX1JlcG9ydFB3clN0YXRlKSwJLyogZmlsZW46IG9ubHkgZm9yIFBDSUUsIFVTQiAqLwotCUdFTl9FVlRfQ09ERShfQ2xvc2VSRiksCQkvKiBmaWxlbjogb25seSBmb3IgUENJRSwKKwlfSm9pbkJzc19FVlRfLCAvKjEwKi8KKwlfQWRkU1RBX0VWVF8sCisJX0RlbFNUQV9FVlRfLAorCV9BdGltRG9uZV9FVlRfLAorCV9UWF9SZXBvcnRfRVZUXywKKwlfQ0NYX1JlcG9ydF9FVlRfLAkJLyoxNSovCisJX0RUTV9SZXBvcnRfRVZUXywKKwlfVFhfUmF0ZV9TdGF0aXN0aWNzX0VWVF8sCisJX0MySExCS19FVlRfLAorCV9GV0RCR19FVlRfLAorCV9DMkhGRUVEQkFDS19FVlRfLCAgICAgICAgICAgICAvKjIwKi8KKwlfQUREQkFfRVZUXywKKwlfQzJIQkNOX0VWVF8sCisJX1JlcG9ydFB3clN0YXRlX0VWVF8sCS8qIGZpbGVuOiBvbmx5IGZvciBQQ0lFLCBVU0IgKi8KKwlfQ2xvc2VSRl9FVlRfLAkJLyogZmlsZW46IG9ubHkgZm9yIFBDSUUsCiAJCQkJCSAqIHdvcmsgYXJvdW5kIEFTUE0gKi8KIAlNQVhfQzJIRVZUCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaAppbmRleCA5NjgwZTJlLi4xOGE5ZTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaApAQCAtOTIsMjEgKzkyLDYgQEAKIAl1bnNpZ25lZCBzaG9ydCByc3ZkOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9pbml0X3B3cmxvY2soc3RydWN0IHNlbWFwaG9yZSAgKnBsb2NrKQotewotCXNlbWFfaW5pdChwbG9jaywgMSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfZW50ZXJfcHdybG9jayhzdHJ1Y3Qgc2VtYXBob3JlICAqcGxvY2spCi17Ci0JX3J0d19kb3duX3NlbWEocGxvY2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2V4aXRfcHdybG9jayhzdHJ1Y3Qgc2VtYXBob3JlICAqcGxvY2spCi17Ci0JdXAocGxvY2spOwotfQotCiAjZGVmaW5lIExQU19ERUxBWV9USU1FCTEqSFogLyogIDEgc2VjICovCiAKICNkZWZpbmUgRVhFX1BXUl9OT05FCTB4MDEKQEAgLTE1Nyw3ICsxNDIsNyBAQAogfTsKIAogc3RydWN0IHB3cmN0cmxfcHJpdiB7Ci0Jc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCXN0cnVjdCBtdXRleCBtdXRleF9sb2NrOwogCXZvbGF0aWxlIHU4IHJwd207IC8qICByZXF1ZXN0ZWQgcG93ZXIgc3RhdGUgZm9yIGZ3ICovCiAJdm9sYXRpbGUgdTggY3B3bTsgLyogIGZ3IGN1cnJlbnQgcG93ZXIgc3RhdGUuIHVwZGF0ZWQgd2hlbgogCQkJICAgKiAxLiByZWFkIGZyb20gSENQV00gMi4gZHJpdmVyIGxvd2VycyBwb3dlciBsZXZlbCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3JlY3YuaAppbmRleCBiMDM3M2I2Li40OWQ5NzM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3JlY3YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3JlY3YuaApAQCAtNjUsMTMgKzY1LDYgQEAKICovCiB9OwogCi1zdHJ1Y3Qgc21vb3RoX3Jzc2lfZGF0YSB7Ci0JdTMyCWVsZW1lbnRzWzEwMF07CS8qIGFycmF5IHRvIHN0b3JlIHZhbHVlcyAqLwotCXUzMglpbmRleDsJCQkvKiBpbmRleCB0byBjdXJyZW50IGFycmF5IHRvIHN0b3JlICovCi0JdTMyCXRvdGFsX251bTsJCS8qIG51bSBvZiB2YWxpZCBlbGVtZW50cyAqLwotCXUzMgl0b3RhbF92YWw7CQkvKiBzdW0gb2YgdmFsaWQgZWxlbWVudHMgKi8KLX07Ci0KIHN0cnVjdCBzaWduYWxfc3RhdCB7CiAJdTgJdXBkYXRlX3JlcTsJCS8qIHVzZWQgdG8gaW5kaWNhdGUgKi8KIAl1OAlhdmdfdmFsOwkJLyogYXZnIG9mIHZhbGlkIGVsZW1lbnRzICovCkBAIC0yNDYsNyArMjM5LDYgQEAKIHN0cnVjdCByZWN2X2ZyYW1lIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IHNrX2J1ZmYJICpwa3Q7Ci0Jc3RydWN0IHNrX2J1ZmYJICpwa3RfbmV3YWxsb2M7CiAJc3RydWN0IGFkYXB0ZXIgICphZGFwdGVyOwogCXN0cnVjdCByeF9wa3RfYXR0cmliIGF0dHJpYjsKIAl1aW50ICBsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3NlY3VyaXR5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3NlY3VyaXR5LmgKaW5kZXggY2ExMjQ3Yi4uMjY2M2U2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zZWN1cml0eS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfc2VjdXJpdHkuaApAQCAtMTY0LDEyICsxNjQsNiBAQAogCXU4IGJXZXBEZWZhdWx0S2V5SWR4U2V0OwogfTsKIAotc3RydWN0IHNoYTI1Nl9zdGF0ZSB7Ci0JdTY0IGxlbmd0aDsKLQl1MzIgc3RhdGVbOF0sIGN1cmxlbjsKLQl1OCBidWZbNjRdOwotfTsKLQogI2RlZmluZSBHRVRfRU5DUllfQUxHTyhwc2VjdXJpdHlwcml2LCBwc3RhLCBlbmNyeV9hbGdvLCBibWNzdCkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJc3dpdGNoIChwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtKSB7CQkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zcmVzZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfc3Jlc2V0LmgKaW5kZXggY2UwMjdkZi4uNGM0Y2NkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zcmVzZXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3NyZXNldC5oCkBAIC0zMyw3ICszMyw2IEBACiAjZGVmaW5lCVdJRklfUlhfSEFORwkJCUJJVCg1KQogI2RlZmluZQkJV0lGSV9JRl9OT1RfRVhJU1QJQklUKDYpCiAKLXZvaWQgc3Jlc2V0X2luaXRfdmFsdWUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHU4IHNyZXNldF9nZXRfd2lmaV9zdGF0dXMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgc3Jlc2V0X3NldF93aWZpX2Vycm9yX3N0YXR1cyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBzdGF0dXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3htaXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfeG1pdC5oCmluZGV4IGEwODUzYmEuLmRkNmI3YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfeG1pdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfeG1pdC5oCkBAIC0xMTMsNyArMTEzLDYgQEAKIAl1OAlkaGNwX3BrdDsKIAl1MTYJZXRoZXJfdHlwZTsKIAl1MTYJc2VxbnVtOwotCXUxNglwa3RfaGRybGVuOwkvKiB0aGUgb3JpZ2luYWwgODAyLjMgcGt0IGhlYWRlciBsZW4gKi8KIAl1MTYJaGRybGVuOwkJLyogdGhlIFdMQU4gSGVhZGVyIExlbiAqLwogCXUzMglwa3RsZW47CQkvKiB0aGUgb3JpZ2luYWwgODAyLjMgcGt0IHJhd19kYXRhIGxlbiAobm90IGluY2x1ZGUKIAkJCQkgKiBldGhlcl9oZHIgZGF0YSkgKi8KQEAgLTI1NiwxNSArMjU1LDggQEAKIAlpbnQJYWNfdGFnOwogfTsKIAotc3RydWN0IGFnZ19wa3RfaW5mbyB7Ci0JdTE2IG9mZnNldDsKLQl1MTYgcGt0X2xlbjsKLX07Ci0KIHN0cnVjdAl4bWl0X3ByaXYgewogCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHhtaXRfc2VtYTsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHRlcm1pbmF0ZV94bWl0dGhyZWFkX3NlbWE7CiAJc3RydWN0IF9fcXVldWUgYmVfcGVuZGluZzsKIAlzdHJ1Y3QgX19xdWV1ZSBia19wZW5kaW5nOwogCXN0cnVjdCBfX3F1ZXVlIHZpX3BlbmRpbmc7CkBAIC0yODksNyArMjgxLDYgQEAKIAl1OAl3bW1fcGFyYV9zZXFbNF07Lyogc2VxdWVuY2UgZm9yIHdtbSBhYyBwYXJhbWV0ZXIgc3RyZW5ndGgKIAkJCQkgKiBmcm9tIGxhcmdlIHRvIHNtYWxsLiBpdCdzIHZhbHVlIGlzIDAtPnZvLAogCQkJCSAqIDEtPnZpLCAyLT5iZSwgMy0+YmsuICovCi0Jc3RydWN0IHNlbWFwaG9yZSB0eF9yZXRldnQ7LyogYWxsIHR4IHJldHVybiBldmVudDsgKi8KIAl1OAkJdHhpcnBfY250Oy8qICAqLwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB4bWl0X3Rhc2tsZXQ7CiAJLyogcGVyIEFDIHBlbmRpbmcgaXJwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvdXNiX2hhbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3VzYl9oYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiZjA3YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvdXNiX2hhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fVVNCX0hBTF9IX18KLSNkZWZpbmUgX19VU0JfSEFMX0hfXwotCi12b2lkIHJ0bDgxODhldV9zZXRfaGFsX29wcyhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpOwotI2RlZmluZSBoYWxfc2V0X2hhbF9vcHMJcnRsODE4OGV1X3NldF9oYWxfb3BzCi0KLSNlbmRpZiAvKiBfX1VTQl9IQUxfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvdXNiX29wc19saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3VzYl9vcHNfbGludXguaAppbmRleCAyMjA3MzMzLi43OGQ5YjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvdXNiX29wc19saW51eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS91c2Jfb3BzX2xpbnV4LmgKQEAgLTQ3LDIxICs0Nyw2IEBACiAjZGVmaW5lIHVzYl9yZWFkX2ludGVycnVwdF9jb21wbGV0ZShwdXJiLCByZWdzKQkJXAogCXVzYl9yZWFkX2ludGVycnVwdF9jb21wbGV0ZShwdXJiKQogCi1zdGF0aWMgaW5saW5lIHU4IHJ0d191c2JfYnVsa19zaXplX2JvdW5kYXJ5KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJICAgIGludCBidWZfbGVuKQotewotCXU4IHJzdCA9IHRydWU7Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQotCWlmIChwZHZvYmpwcml2LT5pc2hpZ2hzcGVlZCkKLQkJcnN0ID0gKDAgPT0gKGJ1Zl9sZW4pICUgVVNCX0hJR0hfU1BFRURfQlVMS19TSVpFKSA/Ci0JCSAgICAgIHRydWUgOiBmYWxzZTsKLQllbHNlCi0JCXJzdCA9ICgwID09IChidWZfbGVuKSAlIFVTQl9GVUxMX1NQRUVEX0JVTEtfU0laRSkgPwotCQkgICAgICB0cnVlIDogZmFsc2U7Ci0JcmV0dXJuIHJzdDsKLX0KLQogdW5zaWduZWQgaW50IGZmYWRkcjJwaXBlaGRsKHN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmosIHUzMiBhZGRyKTsKIAogdTggdXNiX3JlYWQ4KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkcik7CkBAIC03NSw3ICs2MCw3IEBACiBpbnQgdXNiX3dyaXRlMTYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MTYgdmFsKTsKIGludCB1c2Jfd3JpdGUzMihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiB2YWwpOwogCi11MzIgdXNiX3dyaXRlX3BvcnQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgY250LCB1OCAqcG1lbSk7Cit1MzIgdXNiX3dyaXRlX3BvcnQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MzIgY250LCBzdHJ1Y3QgeG1pdF9idWYgKnBtZW0pOwogdm9pZCB1c2Jfd3JpdGVfcG9ydF9jYW5jZWwoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93aWZpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2lmaS5oCmluZGV4IGU3YzUxMjEuLjllMDhlNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93aWZpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dpZmkuaApAQCAtNTA4LDIyICs1MDgsNiBAQAogI2RlZmluZSBJRUVFODAyMTFfQkFSX0NUUkxfQUNLX1BPTElDWV9OT1JNQUwgICAgIDB4MDAwMAogI2RlZmluZSBJRUVFODAyMTFfQkFSX0NUUkxfQ0JNVElEX0NPTVBSRVNTRURfQkEgIDB4MDAwNAogCi0gLyoqCi0gKiBzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgLSBIVCBjYXBhYmlsaXRpZXMKLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSByZWZlcnMgdG8gIkhUIGNhcGFiaWxpdGllcyBlbGVtZW50IiBhcwotICogZGVzY3JpYmVkIGluIDgwMi4xMW4gZHJhZnQgc2VjdGlvbiA3LjMuMi41MgotICovCi0KLXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCB7Ci0JdW5zaWduZWQgc2hvcnQJY2FwX2luZm87Ci0JdW5zaWduZWQgY2hhcglhbXBkdV9wYXJhbXNfaW5mbzsKLQl1bnNpZ25lZCBjaGFyCXN1cHBfbWNzX3NldFsxNl07Ci0JdW5zaWduZWQgc2hvcnQJZXh0ZW5kZWRfaHRfY2FwX2luZm87Ci0JdW5zaWduZWQgaW50CXR4X0JGX2NhcF9pbmZvOwotCXVuc2lnbmVkIGNoYXIgICBhbnRlbm5hX3NlbGVjdGlvbl9pbmZvOwotfSBfX3BhY2tlZDsKLQogLyoqCiAgKiBzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgLSBIVCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCiAgKgpAQCAtNTM4LDIwICs1MjIsNiBAQAogCXVuc2lnbmVkIGNoYXIJYmFzaWNfc2V0WzE2XTsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBIVF9jYXBzX2VsZW1lbnQgewotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCV9fbGUxNglIVF9jYXBzX2luZm87Ci0JCQl1bnNpZ25lZCBjaGFyCUFNUERVX3BhcmE7Ci0JCQl1bnNpZ25lZCBjaGFyCU1DU19yYXRlWzE2XTsKLQkJCXVuc2lnbmVkIHNob3J0CUhUX2V4dF9jYXBzOwotCQkJdW5zaWduZWQgaW50CUJlYW1mb3JtaW5nX2NhcHM7Ci0JCQl1bnNpZ25lZCBjaGFyCUFTRUxfY2FwczsKLQkJfSBIVF9jYXBfZWxlbWVudDsKLQkJdW5zaWduZWQgY2hhciBIVF9jYXBbMjZdOwotCX0gdTsKLX0gX19wYWNrZWQ7Ci0KIHN0cnVjdCBIVF9pbmZvX2VsZW1lbnQgewogCXVuc2lnbmVkIGNoYXIJcHJpbWFyeV9jaGFubmVsOwogCXVuc2lnbmVkIGNoYXIJaW5mb3NbNV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93bGFuX2Jzc2RlZi5oCmluZGV4IDU2MDk2NmMuLmUxOTMxZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93bGFuX2Jzc2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93bGFuX2Jzc2RlZi5oCkBAIC0xMjMsNDAgKzEyMywxMCBAQAogI2RlZmluZSBORElTXzgwMl8xMV9BSV9SRVNGSV9TVEFUVVNDT0RFICAgICAgICAyCiAjZGVmaW5lIE5ESVNfODAyXzExX0FJX1JFU0ZJX0FTU09DSUFUSU9OSUQgICAgIDQKIAotc3RydWN0IG5kaXNfODAyXzExX2FpX3JlcWZpIHsKLSAgICB1MTYgQ2FwYWJpbGl0aWVzOwotICAgIHUxNiBMaXN0ZW5JbnRlcnZhbDsKLSAgICB1bnNpZ25lZCBjaGFyIEN1cnJlbnRBUEFkZHJlc3NbRVRIX0FMRU5dOwotfTsKLQotc3RydWN0IG5kaXNfODAyXzExX2FpX3Jlc2ZpIHsKLSAgICB1MTYgQ2FwYWJpbGl0aWVzOwotICAgIHUxNiBTdGF0dXNDb2RlOwotICAgIHUxNiBBc3NvY2lhdGlvbklkOwotfTsKLQotc3RydWN0IG5kaXNfODAyXzExX2Fzc29jX2luZm8gewotCXUzMiAgTGVuZ3RoOwotCXUxNiBBdmFpbGFibGVSZXF1ZXN0Rml4ZWRJRXM7Ci0Jc3RydWN0IG5kaXNfODAyXzExX2FpX3JlcWZpICAgIFJlcXVlc3RGaXhlZElFczsKLQl1MzIgIFJlcXVlc3RJRUxlbmd0aDsKLQl1MzIgIE9mZnNldFJlcXVlc3RJRXM7Ci0JdTE2IEF2YWlsYWJsZVJlc3BvbnNlRml4ZWRJRXM7Ci0Jc3RydWN0IG5kaXNfODAyXzExX2FpX3Jlc2ZpICAgIFJlc3BvbnNlRml4ZWRJRXM7Ci0JdTMyICBSZXNwb25zZUlFTGVuZ3RoOwotCXUzMiAgT2Zmc2V0UmVzcG9uc2VJRXM7Ci19OwotCiBlbnVtIG5kaXNfODAyXzExX3JlbG9hZF9kZWYgewogCU5kaXM4MDJfMTFSZWxvYWRXRVBLZXlzCiB9OwogCi1zdHJ1Y3QgbmRpc184MDJfMTFfcmVtb3ZlX2tleSB7Ci0JdTMyICAgICAgICAgICAgICAgICAgIExlbmd0aDsgICAgICAgIC8qICBMZW5ndGggKi8KLQl1MzIgICAgICAgICAgICAgICAgICAgS2V5SW5kZXg7Ci0JdW5zaWduZWQgY2hhciBCU1NJRFtFVEhfQUxFTl07Ci19OwotCiBzdHJ1Y3QgbmRpc184MDJfMTFfd2VwIHsKIAl1MzIgICAgIExlbmd0aDsgICAgICAgIC8qICBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KIAl1MzIgICAgIEtleUluZGV4OyAgICAgIC8qICAwIGlzIHRoZSBwZXItY2xpZW50IGtleSwKQEAgLTE2NSwxMiArMTM1LDYgQEAKIAl1OCAgICAgS2V5TWF0ZXJpYWxbMTZdOy8qICB2YXJpYWJsZSBsZW4gZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkICovCiB9OwogCi1zdHJ1Y3QgbmRpc184MDJfMTFfYXV0aF9yZXEgewotCXUzMiBMZW5ndGg7ICAgICAgICAgICAgLyogIExlbmd0aCBvZiBzdHJ1Y3R1cmUgKi8KLQl1bnNpZ25lZCBjaGFyIEJzc2lkW0VUSF9BTEVOXTsKLQl1MzIgRmxhZ3M7Ci19OwotCiBlbnVtIG5kaXNfODAyXzExX3N0YXR1c190eXBlIHsKIAlOZGlzODAyXzExU3RhdHVzVHlwZV9BdXRoZW50aWNhdGlvbiwKIAlOZGlzODAyXzExU3RhdHVzVHlwZV9NZWRpYVN0cmVhbU1vZGUsCkBAIC0xNzksMTAgKzE0Myw2IEBACiAJCQkJICAgICogYW4gdXBwZXIgYm91bmQgKi8KIH07CiAKLXN0cnVjdCBuZGlzXzgwMl8xMV9zdGF0dXNfaW5kIHsKLQllbnVtIG5kaXNfODAyXzExX3N0YXR1c190eXBlIFN0YXR1c1R5cGU7Ci19OwotCiAvKiAgbWFzayBmb3IgYXV0aGVudGljYXRpb24vaW50ZWdyaXR5IGZpZWxkcyAqLwogI2RlZmluZSBORElTXzgwMl8xMV9BVVRIX1JFUVVFU1RfQVVUSF9GSUVMRFMgICAgICAgIAkweDBmCiAjZGVmaW5lIE5ESVNfODAyXzExX0FVVEhfUkVRVUVTVF9SRUFVVEgJCQkweDAxCkBAIC0xOTMsMjEgKzE1Myw2IEBACiAvKiAgTUlDIGNoZWNrIHRpbWUsIDYwIHNlY29uZHMuICovCiAjZGVmaW5lIE1JQ19DSEVDS19USU1FCTYwMDAwMDAwCiAKLXN0cnVjdCBuZGlzXzgwMl8xMV9hdXRoX2V2dCB7Ci0Jc3RydWN0IG5kaXNfODAyXzExX3N0YXR1c19pbmQgICAgICAgU3RhdHVzOwotCXN0cnVjdCBuZGlzXzgwMl8xMV9hdXRoX3JlcSAgUmVxdWVzdFsxXTsKLX07Ci0KLXN0cnVjdCBuZGlzXzgwMl8xMV90ZXN0IHsKLQl1MzIgTGVuZ3RoOwotCXUzMiBUeXBlOwotCXVuaW9uIHsKLQkJc3RydWN0IG5kaXNfODAyXzExX2F1dGhfZXZ0IEF1dGhlbnRpY2F0aW9uRXZlbnQ7Ci0JCU5ESVNfODAyXzExX1JTU0kgUnNzaVRyaWdnZXI7Ci0JfSB0dDsKLX07Ci0KLQogI2lmbmRlZiBOZGlzODAyXzExQVBNb2RlCiAjZGVmaW5lIE5kaXM4MDJfMTFBUE1vZGUgKE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZU1heCsxKQogI2VuZGlmCkBAIC0yOTcsMzIgKzI0Miw0IEBACiAjZGVmaW5lIE5VTV9QUkVfQVVUSF9LRVkgMTYKICNkZWZpbmUgTlVNX1BNS0lEX0NBQ0hFIE5VTV9QUkVfQVVUSF9LRVkKIAotLyoKLSoJV1BBMgotKi8KLQotc3RydWN0IHBta2lkX2NhbmRpZGF0ZSB7Ci0JdW5zaWduZWQgY2hhciBCU1NJRFtFVEhfQUxFTl07Ci0JdTMyIEZsYWdzOwotfTsKLQotc3RydWN0IG5kaXNfODAyXzExX3Bta2lkX2xpc3QgewotCXUzMiBWZXJzaW9uOyAgICAgICAvKiAgVmVyc2lvbiBvZiB0aGUgc3RydWN0dXJlICovCi0JdTMyIE51bUNhbmRpZGF0ZXM7IC8qICBOby4gb2YgcG1raWQgY2FuZGlkYXRlcyAqLwotCXN0cnVjdCBwbWtpZF9jYW5kaWRhdGUgQ2FuZGlkYXRlTGlzdFsxXTsKLX07Ci0KLXN0cnVjdCBuZGlzXzgwMl8xMV9hdXRoX2VuY3J5cHQgewotCWVudW0gbmRpc184MDJfMTFfYXV0aF9tb2RlIEF1dGhNb2RlU3VwcG9ydGVkOwotCWVudW0gbmRpc184MDJfMTFfd2VwX3N0YXR1cyBFbmNyeXB0U3RhdHVzU3VwcG9ydGVkOwotfTsKLQotc3RydWN0IG5kaXNfODAyXzExX2NhcCB7Ci0JdTMyICBMZW5ndGg7Ci0JdTMyICBWZXJzaW9uOwotCXUzMiAgTm9PZlBNS0lEczsKLQl1MzIgIE5vT2ZBdXRoRW5jcnlwdFBhaXJzU3VwcG9ydGVkOwotCXN0cnVjdCBuZGlzXzgwMl8xMV9hdXRoX2VuY3J5cHQgQXV0aGVudGljYXRpb25FbmNyeXB0aW9uU3VwcG9ydGVkWzFdOwotfTsKLQogI2VuZGlmIC8qIGlmbmRlZiBXTEFOX0JTU0RFRl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL2lvY3RsX2xpbnV4LmMKaW5kZXggNTY3MmYwMS4uNGRlOWRiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9pb2N0bF9saW51eC5jCkBAIC0xMzIsMTIgKzEzMiwxNSBAQAogCXAgPSBydHdfZ2V0X2llKCZwbmV0d29yay0+bmV0d29yay5JRXNbMTJdLCBfSFRfQ0FQQUJJTElUWV9JRV8sICZodF9pZWxlbiwgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgtMTIpOwogCiAJaWYgKHAgJiYgaHRfaWVsZW4gPiAwKSB7Ci0JCXN0cnVjdCBydHdfaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOworCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOwogCQlodF9jYXAgPSB0cnVlOwotCQlwaHRfY2FwaWUgPSAoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwICopKHArMik7Ci0JCW1lbWNweSgmbWNzX3JhdGUsIHBodF9jYXBpZS0+c3VwcF9tY3Nfc2V0LCAyKTsKLQkJYndfNDBNSHogPSAocGh0X2NhcGllLT5jYXBfaW5mbyZJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSCkgPyAxIDogMDsKLQkJc2hvcnRfR0kgPSAocGh0X2NhcGllLT5jYXBfaW5mbyYoSUVFRTgwMjExX0hUX0NBUF9TR0lfMjB8SUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKSA/IDEgOiAwOworCQlwaHRfY2FwaWUgPSAoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKikocCArIDIpOworCQltZW1jcHkoJm1jc19yYXRlLCBwaHRfY2FwaWUtPm1jcy5yeF9tYXNrLCAyKTsKKwkJYndfNDBNSHogPSAhIShsZTE2X3RvX2NwdShwaHRfY2FwaWUtPmNhcF9pbmZvKSAmCisJCQkgICAgICBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSCk7CisJCXNob3J0X0dJID0gISEobGUxNl90b19jcHUocGh0X2NhcGllLT5jYXBfaW5mbykgJgorCQkJICAgICAgKElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKKwkJCSAgICAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpOwogCX0KIAogCS8qIEFkZCB0aGUgcHJvdG9jb2wgbmFtZSAqLwpAQCAtNDAwLDcgKzQwMyw3IEBACiAJCQl3ZXBfa2V5X2xlbiA9IHdlcF9rZXlfbGVuIDw9IDUgPyA1IDogMTM7CiAJCQl3ZXBfdG90YWxfbGVuID0gd2VwX2tleV9sZW4gKyBvZmZzZXRvZihzdHJ1Y3QgbmRpc184MDJfMTFfd2VwLCBLZXlNYXRlcmlhbCk7CiAJCQlwd2VwID0gKHN0cnVjdCBuZGlzXzgwMl8xMV93ZXAgKilydHdfbWFsbG9jKHdlcF90b3RhbF9sZW4pOwotCQkJaWYgKHB3ZXAgPT0gTlVMTCkgeworCQkJaWYgKCFwd2VwKSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX29zX2MsIF9kcnZfZXJyXywgKCIgd3BhX3NldF9lbmNyeXB0aW9uOiBwd2VwIGFsbG9jYXRlIGZhaWwgISEhXG4iKSk7CiAJCQkJZ290byBleGl0OwogCQkJfQpAQCAtNDQxLDcgKzQ0NCw3IEBACiAKIAkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUgfCBXSUZJX01QX1NUQVRFKSkgeyAvKiBzdGEgbW9kZSAqLwogCQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbyhwc3RhcHJpdiwgZ2V0X2Jzc2lkKHBtbG1lcHJpdikpOwotCQkJaWYgKHBzdGEgPT0gTlVMTCkgeworCQkJaWYgKCFwc3RhKSB7CiAJCQkJOwogCQkJfSBlbHNlIHsKIAkJCQlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIm5vbmUiKSAhPSAwKQpAQCAtNDc2LDcgKzQ3OSw3IEBACiAJCQkJfQogCQkJfQogCQkJcGJjbWNfc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8ocGFkYXB0ZXIpOwotCQkJaWYgKHBiY21jX3N0YSA9PSBOVUxMKSB7CisJCQlpZiAoIXBiY21jX3N0YSkgewogCQkJCTsKIAkJCX0gZWxzZSB7CiAJCQkJLyogSmVmZjogZG9uJ3QgZGlzYWJsZSBpZWVlODAyMXhfYmxvY2tlZCB3aGlsZSBjbGVhcmluZyBrZXkgKi8KQEAgLTUwMiw5ICs1MDUsOSBAQAogCWludCBncm91cF9jaXBoZXIgPSAwLCBwYWlyd2lzZV9jaXBoZXIgPSAwOwogCWludCByZXQgPSAwOwogCi0JaWYgKChpZWxlbiA+IE1BWF9XUEFfSUVfTEVOKSB8fCAocGllID09IE5VTEwpKSB7CisJaWYgKChpZWxlbiA+IE1BWF9XUEFfSUVfTEVOKSB8fCAoIXBpZSkpIHsKIAkJX2Nscl9md3N0YXRlXygmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1VOREVSX1dQUyk7Ci0JCWlmIChwaWUgPT0gTlVMTCkKKwkJaWYgKCFwaWUpCiAJCQlyZXR1cm4gcmV0OwogCQllbHNlCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTUxMiw3ICs1MTUsNyBAQAogCiAJaWYgKGllbGVuKSB7CiAJCWJ1ZiA9IGttZW1kdXAocGllLCBpZWxlbiwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChidWYgPT0gTlVMTCkgeworCQlpZiAoIWJ1ZikgewogCQkJcmV0ID0gIC1FTk9NRU07CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTEwNDksNyArMTA1Miw3IEBACiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl3X21sbWUgKm1sbWUgPSAoc3RydWN0IGl3X21sbWUgKilleHRyYTsKIAotCWlmIChtbG1lID09IE5VTEwpCisJaWYgKCFtbG1lKQogCQlyZXR1cm4gLTE7CiAKIAlEQkdfODhFKCIlc1xuIiwgX19mdW5jX18pOwpAQCAtMTg5Niw3ICsxODk5LDcgQEAKIAogCXBhcmFtX2xlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgKyBwZXh0LT5rZXlfbGVuOwogCXBhcmFtID0gKHN0cnVjdCBpZWVlX3BhcmFtICopcnR3X21hbGxvYyhwYXJhbV9sZW4pOwotCWlmIChwYXJhbSA9PSBOVUxMKQorCWlmICghcGFyYW0pCiAJCXJldHVybiAtMTsKIAogCW1lbXNldChwYXJhbSwgMCwgcGFyYW1fbGVuKTsKQEAgLTIwNjEsNyArMjA2NCw3IEBACiAJfQogCiAJcGFyYW0gPSAoc3RydWN0IGllZWVfcGFyYW0gKilydHdfbWFsbG9jKHAtPmxlbmd0aCk7Ci0JaWYgKHBhcmFtID09IE5VTEwpIHsKKwlpZiAoIXBhcmFtKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIyNTQsMTMgKzIyNTcsMTMgQEAKIAkJfQogCX0KIAotCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAibm9uZSIpID09IDAgJiYgKHBzdGEgPT0gTlVMTCkpIHsKKwlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIm5vbmUiKSA9PSAwICYmICghcHN0YSkpIHsKIAkJLyogdG9kbzpjbGVhciBkZWZhdWx0IGVuY3J5cHRpb24ga2V5cyAqLwogCiAJCURCR184OEUoImNsZWFyIGRlZmF1bHQgZW5jcnlwdGlvbiBrZXlzLCBrZXlpZCA9JWRcbiIsIHBhcmFtLT51LmNyeXB0LmlkeCk7CiAJCWdvdG8gZXhpdDsKIAl9Ci0JaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwICYmIChwc3RhID09IE5VTEwpKSB7CisJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwICYmICghcHN0YSkpIHsKIAkJREJHXzg4RSgicjg3MXhfc2V0X2VuY3J5cHRpb24sIGNyeXB0LmFsZyA9IFdFUFxuIik7CiAJCXdlcF9rZXlfaWR4ID0gcGFyYW0tPnUuY3J5cHQuaWR4OwogCQl3ZXBfa2V5X2xlbiA9IHBhcmFtLT51LmNyeXB0LmtleV9sZW47CkBAIC0yMjc0LDcgKzIyNzcsNyBAQAogCQkJd2VwX2tleV9sZW4gPSB3ZXBfa2V5X2xlbiA8PSA1ID8gNSA6IDEzOwogCQkJd2VwX3RvdGFsX2xlbiA9IHdlcF9rZXlfbGVuICsgb2Zmc2V0b2Yoc3RydWN0IG5kaXNfODAyXzExX3dlcCwgS2V5TWF0ZXJpYWwpOwogCQkJcHdlcCA9IChzdHJ1Y3QgbmRpc184MDJfMTFfd2VwICopcnR3X21hbGxvYyh3ZXBfdG90YWxfbGVuKTsKLQkJCWlmIChwd2VwID09IE5VTEwpIHsKKwkJCWlmICghcHdlcCkgewogCQkJCURCR184OEUoIiByODcxeF9zZXRfZW5jcnlwdGlvbjogcHdlcCBhbGxvY2F0ZSBmYWlsICEhIVxuIik7CiAJCQkJZ290byBleGl0OwogCQkJfQpAQCAtMjUyOCw3ICsyNTMxLDggQEAKIAkJaWYgKFdMQU5fU1RBX0hUJmZsYWdzKSB7CiAJCQlwc3RhLT5odHByaXYuaHRfb3B0aW9uID0gdHJ1ZTsKIAkJCXBzdGEtPnFvc19vcHRpb24gPSAxOwotCQkJbWVtY3B5KCh2b2lkICopJnBzdGEtPmh0cHJpdi5odF9jYXAsICh2b2lkICopJnBhcmFtLT51LmFkZF9zdGEuaHRfY2FwLCBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfaHRfY2FwKSk7CisJCQltZW1jcHkoJnBzdGEtPmh0cHJpdi5odF9jYXAsICZwYXJhbS0+dS5hZGRfc3RhLmh0X2NhcCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKIAkJfSBlbHNlIHsKIAkJCXBzdGEtPmh0cHJpdi5odF9vcHRpb24gPSBmYWxzZTsKIAkJfQpAQCAtMjYyNCw3ICsyNjI4LDggQEAKIAkJCQkgICAgICAocHN0YS0+aHRfMjBtaHpfc2V0IDw8IDUpKTsKIAkJcHN0YV9kYXRhLT50eF9zdXBwX3JhdGVzX2xlbiA9ICBwc3RhLT5ic3NyYXRlbGVuOwogCQltZW1jcHkocHN0YV9kYXRhLT50eF9zdXBwX3JhdGVzLCBwc3RhLT5ic3NyYXRlc2V0LCBwc3RhLT5ic3NyYXRlbGVuKTsKLQkJbWVtY3B5KCZwc3RhX2RhdGEtPmh0X2NhcCwgJnBzdGEtPmh0cHJpdi5odF9jYXAsIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXApKTsKKwkJbWVtY3B5KCZwc3RhX2RhdGEtPmh0X2NhcCwKKwkJICAgICAgICZwc3RhLT5odHByaXYuaHRfY2FwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKIAkJcHN0YV9kYXRhLT5yeF9wa3RzID0gcHN0YS0+c3RhX3N0YXRzLnJ4X2RhdGFfcGt0czsKIAkJcHN0YV9kYXRhLT5yeF9ieXRlcyA9IHBzdGEtPnN0YV9zdGF0cy5yeF9ieXRlczsKIAkJcHN0YV9kYXRhLT5yeF9kcm9wcyA9IHBzdGEtPnN0YV9zdGF0cy5yeF9kcm9wczsKQEAgLTI2OTksNyArMjcwNCw3IEBACiAJaWYgKGllX2xlbiA+IDApIHsKIAkJcG1sbWVwcml2LT53cHNfYmVhY29uX2llID0gcnR3X21hbGxvYyhpZV9sZW4pOwogCQlwbWxtZXByaXYtPndwc19iZWFjb25faWVfbGVuID0gaWVfbGVuOwotCQlpZiAocG1sbWVwcml2LT53cHNfYmVhY29uX2llID09IE5VTEwpIHsKKwkJaWYgKCFwbWxtZXByaXYtPndwc19iZWFjb25faWUpIHsKIAkJCURCR184OEUoIiVzKCktJWQ6IHJ0d19tYWxsb2MoKSBFUlJPUiFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjczNCw3ICsyNzM5LDcgQEAKIAlpZiAoaWVfbGVuID4gMCkgewogCQlwbWxtZXByaXYtPndwc19wcm9iZV9yZXNwX2llID0gcnR3X21hbGxvYyhpZV9sZW4pOwogCQlwbWxtZXByaXYtPndwc19wcm9iZV9yZXNwX2llX2xlbiA9IGllX2xlbjsKLQkJaWYgKHBtbG1lcHJpdi0+d3BzX3Byb2JlX3Jlc3BfaWUgPT0gTlVMTCkgeworCQlpZiAoIXBtbG1lcHJpdi0+d3BzX3Byb2JlX3Jlc3BfaWUpIHsKIAkJCURCR184OEUoIiVzKCktJWQ6IHJ0d19tYWxsb2MoKSBFUlJPUiFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjc2NCw3ICsyNzY5LDcgQEAKIAlpZiAoaWVfbGVuID4gMCkgewogCQlwbWxtZXByaXYtPndwc19hc3NvY19yZXNwX2llID0gcnR3X21hbGxvYyhpZV9sZW4pOwogCQlwbWxtZXByaXYtPndwc19hc3NvY19yZXNwX2llX2xlbiA9IGllX2xlbjsKLQkJaWYgKHBtbG1lcHJpdi0+d3BzX2Fzc29jX3Jlc3BfaWUgPT0gTlVMTCkgeworCQlpZiAoIXBtbG1lcHJpdi0+d3BzX2Fzc29jX3Jlc3BfaWUpIHsKIAkJCURCR184OEUoIiVzKCktJWQ6IHJ0d19tYWxsb2MoKSBFUlJPUiFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjg2Niw3ICsyODcxLDcgQEAKIAl9CiAKIAlwYXJhbSA9IChzdHJ1Y3QgaWVlZV9wYXJhbSAqKXJ0d19tYWxsb2MocC0+bGVuZ3RoKTsKLQlpZiAocGFyYW0gPT0gTlVMTCkgeworCWlmICghcGFyYW0pIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjk3Niw3ICsyOTgxLDcgQEAKIAkJCXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSA9IE5VTEw7CiAKIAkJCXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSA9IHJ0d19tYWxsb2MoY3Bfc3opOwotCQkJaWYgKHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSA9PSBOVUxMKSB7CisJCQlpZiAoIXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSkgewogCQkJCXByX2luZm8oIiVzKCktJWQ6IHJ0d19tYWxsb2MoKSBFUlJPUiFcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQkJcmV0ID0gIC1FSU5WQUw7CiAJCQkJZ290byBGUkVFX0VYVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc19pbnRmcy5jCmluZGV4IGFlMmNhZmYuLjQwNjkxZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NfaW50ZnMuYwpAQCAtMjMsOCArMjMsNiBAQAogI2luY2x1ZGUgPHJ0d19pb2N0bC5oPgogI2luY2x1ZGUgPHJ0bDgxODhlX2hhbC5oPgogCi0jaW5jbHVkZSA8dXNiX2hhbC5oPgotCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlJlYWx0ZWsgV2lyZWxlc3MgTGFuIERyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiUmVhbHRlayBTZW1pY29uZHVjdG9yIENvcnAuIik7CkBAIC0zMywxMSArMzEsNyBAQAogI2RlZmluZSBSVFdfTk9UQ0hfRklMVEVSIDAgLyogMDpEaXNhYmxlLCAxOkVuYWJsZSwgKi8KIAogLyogbW9kdWxlIHBhcmFtIGRlZmF1bHRzICovCi1zdGF0aWMgaW50IHJ0d19jaGlwX3ZlcnNpb247Ci1zdGF0aWMgaW50IHJ0d19yZmludGZzID0gSFdQSTsKLXN0YXRpYyBpbnQgcnR3X2xia21vZGU7LyogUlRMODcxMl9BSVJfVFJYOyAqLwogLyogTmRpczgwMl8xMUluZnJhc3RydWN0dXJlOyBpbmZyYSwgYWQtaG9jLCBhdXRvICovCi1zdGF0aWMgaW50IHJ0d19uZXR3b3JrX21vZGUgPSBOZGlzODAyXzExSUJTUzsKIHN0YXRpYyBpbnQgcnR3X2NoYW5uZWwgPSAxOy8qIGFkLWhvYyBzdXBwb3J0IHJlcXVpcmVtZW50ICovCiBzdGF0aWMgaW50IHJ0d193aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfMTFCR18yNE47CiBzdGF0aWMgaW50IHJ0d192cnRsX2NhcnJpZXJfc2Vuc2UgPSBBVVRPX1ZDUzsKQEAgLTQ1LDkgKzM5LDYgQEAKIHN0YXRpYyBpbnQgcnR3X3J0c190aHJlc2ggPSAyMzQ3Oy8qICAqLwogc3RhdGljIGludCBydHdfZnJhZ190aHJlc2ggPSAyMzQ2Oy8qICAqLwogc3RhdGljIGludCBydHdfcHJlYW1ibGUgPSBQUkVBTUJMRV9MT05HOy8qIGxvbmcsIHNob3J0LCBhdXRvICovCi1zdGF0aWMgaW50IHJ0d19zY2FuX21vZGUgPSAxOy8qIGFjdGl2ZSwgcGFzc2l2ZSAqLwotc3RhdGljIGludCBydHdfYWRob2NfdHhfcHdyID0gMTsKLXN0YXRpYyBpbnQgcnR3X3NvZnRfYXA7CiBzdGF0aWMgaW50IHJ0d19wb3dlcl9tZ250ID0gMTsKIHN0YXRpYyBpbnQgcnR3X2lwc19tb2RlID0gSVBTX05PUk1BTDsKIApAQCAtNTcsMTEgKzQ4LDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MocnR3X2lwc19tb2RlLCAiVGhlIGRlZmF1bHQgSVBTIG1vZGUiKTsKIAogc3RhdGljIGludCBydHdfZGVidWcgPSAxOwotc3RhdGljIGludCBydHdfcmFkaW9fZW5hYmxlID0gMTsKLXN0YXRpYyBpbnQgcnR3X2xvbmdfcmV0cnlfbG10ID0gNzsKLXN0YXRpYyBpbnQgcnR3X3Nob3J0X3JldHJ5X2xtdCA9IDc7Ci1zdGF0aWMgaW50IHJ0d19idXN5X3RocmVzaCA9IDQwOwotc3RhdGljIGludCBydHdfYWNrX3BvbGljeSA9IE5PUk1BTF9BQ0s7CiAKIHN0YXRpYyBpbnQgcnR3X3NvZnR3YXJlX2VuY3J5cHQ7CiBzdGF0aWMgaW50IHJ0d19zb2Z0d2FyZV9kZWNyeXB0OwpAQCAtNzAsMTEgKzU2LDYgQEAKIAogc3RhdGljIGludCBydHdfd21tX2VuYWJsZSA9IDE7LyogIGRlZmF1bHQgaXMgc2V0IHRvIGVuYWJsZSB0aGUgd21tLiAqLwogc3RhdGljIGludCBydHdfdWFwc2RfZW5hYmxlOwotc3RhdGljIGludCBydHdfdWFwc2RfbWF4X3NwID0gTk9fTElNSVQ7Ci1zdGF0aWMgaW50IHJ0d191YXBzZF9hY2JrX2VuOwotc3RhdGljIGludCBydHdfdWFwc2RfYWNiZV9lbjsKLXN0YXRpYyBpbnQgcnR3X3VhcHNkX2FjdmlfZW47Ci1zdGF0aWMgaW50IHJ0d191YXBzZF9hY3ZvX2VuOwogCiBzdGF0aWMgaW50IHJ0d19odF9lbmFibGUgPSAxOwogLyogMCA6ZGlzYWJsZSwgYml0KDApOiBlbmFibGUgMi40ZywgYml0KDEpOiBlbmFibGUgNWcgKi8KQEAgLTg5LDExICs3MCw2IEBACiBzdGF0aWMgaW50IHJ0d19yeF9zdGJjID0gMTsKIHN0YXRpYyBpbnQgcnR3X2FtcGR1X2Ftc2R1Oy8qICAwOiBkaXNhYmxlZCwgMTplbmFibGVkLCAyOmF1dG8gKi8KIAotLyogVXNlIDIgcGF0aCBUeCB0byB0cmFuc21pdCBNQ1MwfjcgYW5kIGxlZ2FjeSBtb2RlICovCi1zdGF0aWMgaW50IHJ0d19sb3dyYXRlX3R3b194bWl0ID0gMTsKLQotc3RhdGljIGludCBydHdfcmZfY29uZmlnID0gUkZfODE5WF9NQVhfVFlQRTsgIC8qIGF1dG8gKi8KLXN0YXRpYyBpbnQgcnR3X2xvd19wb3dlcjsKIHN0YXRpYyBpbnQgcnR3X3dpZmlfc3BlYzsKIHN0YXRpYyBpbnQgcnR3X2NoYW5uZWxfcGxhbiA9IFJUX0NIQU5ORUxfRE9NQUlOX01BWDsKIApAQCAtMTExLDEwICs4Nyw2IEBACiAKIHN0YXRpYyBpbnQgcnR3X2h3cGRuX21vZGUgPSAyOy8qIDA6ZGlzYWJsZSwgMTplbmFibGUsIDI6IGJ5IEVGVVNFIGNvbmZpZyAqLwogCi1zdGF0aWMgaW50IHJ0d19od3B3cnBfZGV0ZWN0OyAvKiBIVyBwb3dlciAgcGluZyBkZXRlY3QgMDpkaXNhYmxlICwgMTplbmFibGUgKi8KLQotc3RhdGljIGludCBydHdfaHdfd3BzX3BiYyA9IDE7Ci0KIGludCBydHdfbWMydV9kaXNhYmxlOwogCiBzdGF0aWMgaW50IHJ0d184MDIxMWQ7CkBAIC0xMzIsMzIgKzEwNCwyMiBAQAogCiBtb2R1bGVfcGFyYW0ocnR3X2luaXRtYWMsIGNoYXJwLCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfY2hhbm5lbF9wbGFuLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19jaGlwX3ZlcnNpb24sIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X3JmaW50ZnMsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2xia21vZGUsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X25ldHdvcmtfbW9kZSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfY2hhbm5lbCwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfd21tX2VuYWJsZSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfdnJ0bF9jYXJyaWVyX3NlbnNlLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d192Y3NfdHlwZSwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfYnVzeV90aHJlc2gsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2h0X2VuYWJsZSwgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfY2J3NDBfZW5hYmxlLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHJ0d19hbXBkdV9lbmFibGUsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X3J4X3N0YmMsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2FtcGR1X2Ftc2R1LCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19sb3dyYXRlX3R3b194bWl0LCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19yZl9jb25maWcsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X3Bvd2VyX21nbnQsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X3NtYXJ0X3BzLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19sb3dfcG93ZXIsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X3dpZmlfc3BlYywgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfYW50ZGl2X2NmZywgaW50LCAwNjQ0KTsKIG1vZHVsZV9wYXJhbShydHdfYW50ZGl2X3R5cGUsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2VudXNic3MsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0ocnR3X2h3cGRuX21vZGUsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2h3cHdycF9kZXRlY3QsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2h3X3dwc19wYmMsIGludCwgMDY0NCk7CiAKIHN0YXRpYyB1aW50IHJ0d19tYXhfcm9hbWluZ190aW1lcyA9IDI7CiBtb2R1bGVfcGFyYW0ocnR3X21heF9yb2FtaW5nX3RpbWVzLCB1aW50LCAwNjQ0KTsKQEAgLTE4NSwzNjEgKzE0NywxMSBAQAogc3RhdGljIGludCBuZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldik7CiBzdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldik7CiAKLS8qIGR1bW15IHJvdXRpbmVzICovCi12b2lkIHJ0d19wcm9jX3JlbW92ZV9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLX0KLQotc3RhdGljIHZvaWQgcnR3X3Byb2NfaW5pdF9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLX0KLQotI2lmIDAJLyogVE9ETzogQ29udmVydCB0aGVzZSB0byAvc3lzICovCi1zdGF0aWMgdm9pZCBydHdfcHJvY19pbml0X29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyX2RldiA9IE5VTEw7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7Ci0Jc3RydWN0IGFkYXB0ZXIJKnBhZGFwdGVyID0gcnR3X25ldGRldl9wcml2KGRldik7Ci0JdTggcmZfdHlwZTsKLQotCWlmIChydHdfcHJvYyA9PSBOVUxMKSB7Ci0JCW1lbWNweShydHdfcHJvY19uYW1lLCBEUlZfTkFNRSwgc2l6ZW9mKERSVl9OQU1FKSk7Ci0KLQkJcnR3X3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeShydHdfcHJvY19uYW1lLCBTX0lGRElSLAotCQkJCQkgICAgIGluaXRfbmV0LnByb2NfbmV0KTsKLQkJaWYgKHJ0d19wcm9jID09IE5VTEwpIHsKLQkJCURCR184OEUoS0VSTl9FUlIgIlVuYWJsZSB0byBjcmVhdGUgcnR3X3Byb2MgZGlyZWN0b3J5XG4iKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgidmVyX2luZm8iLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkJICAgICAgIHJ0d19wcm9jLCBwcm9jX2dldF9kcnZfdmVyc2lvbiwKLQkJCQkJICAgICAgIGRldik7Ci0JCWlmICghZW50cnkpIHsKLQkJCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpZiAocGFkYXB0ZXItPmRpcl9kZXYgPT0gTlVMTCkgewotCQlwYWRhcHRlci0+ZGlyX2RldiA9IGNyZWF0ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwKLQkJCQkJICBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08sCi0JCQkJCSAgcnR3X3Byb2MpOwotCQlkaXJfZGV2ID0gcGFkYXB0ZXItPmRpcl9kZXY7Ci0JCWlmIChkaXJfZGV2ID09IE5VTEwpIHsKLQkJCWlmIChydHdfcHJvY19jbnQgPT0gMCAmJiBydHdfcHJvYykgewotCQkJCXJlbW92ZV9wcm9jX2VudHJ5KHJ0d19wcm9jX25hbWUsIGluaXRfbmV0LnByb2NfbmV0KTsKLQkJCQlydHdfcHJvYyA9IE5VTEw7Ci0JCQl9Ci0KLQkJCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGUgZGlyX2RldiBkaXJlY3RvcnlcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0dXJuOwotCX0KLQotCXJ0d19wcm9jX2NudCsrOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJ3cml0ZV9yZWciLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF93cml0ZV9yZWcsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfd3JpdGVfcmVnOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyZWFkX3JlZyIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X3JlYWRfcmVnLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQllbnRyeS0+d3JpdGVfcHJvYyA9IHByb2Nfc2V0X3JlYWRfcmVnOwotCi0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImZ3c3RhdGUiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9md3N0YXRlLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic2VjX2luZm8iLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9zZWNfaW5mbywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIm1sbWV4dF9zdGF0ZSIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X21sbWV4dF9zdGF0ZSwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInFvc19vcHRpb24iLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9xb3Nfb3B0aW9uLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiaHRfb3B0aW9uIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfaHRfb3B0aW9uLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmZfaW5mbyIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X3JmX2luZm8sIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJhcF9pbmZvIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfYXBfaW5mbywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImFkYXB0ZXJfc3RhdGUiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldHN0cnVjdCBhZGFwdGVyX3N0YXRlLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgidHJ4X2luZm8iLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF90cnhfaW5mbywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIm1hY19yZWdfZHVtcDEiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9tYWNfcmVnX2R1bXAxLCBkZXYpOwotCWlmICghZW50cnkpIHsKLQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgibWFjX3JlZ19kdW1wMiIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X21hY19yZWdfZHVtcDIsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJtYWNfcmVnX2R1bXAzIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfbWFjX3JlZ19kdW1wMywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImJiX3JlZ19kdW1wMSIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X2JiX3JlZ19kdW1wMSwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImJiX3JlZ19kdW1wMiIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X2JiX3JlZ19kdW1wMiwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImJiX3JlZ19kdW1wMyIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X2JiX3JlZ19kdW1wMywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJmX3JlZ19kdW1wMSIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X3JmX3JlZ19kdW1wMSwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJmX3JlZ19kdW1wMiIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X3JmX3JlZ19kdW1wMiwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlydHdfaGFsX2dldF9od3JlZyhwYWRhcHRlciwgSFdfVkFSX1JGX1RZUEUsICh1OCAqKSgmcmZfdHlwZSkpOwotCWlmICgoUkZfMVQyUiA9PSByZl90eXBlKSB8fCAoUkZfMVQxUiA9PSByZl90eXBlKSkgewotCQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJmX3JlZ19kdW1wMyIsCi0JCQkJCSAgICAgICBTX0lGUkVHIHwgU19JUlVHTywgZGlyX2RldiwKLQkJCQkJICAgICAgIHByb2NfZ2V0X3JmX3JlZ19kdW1wMywgZGV2KTsKLQkJaWYgKCFlbnRyeSkgewotCQkJcHJfaW5mbygiVW5hYmxlIHRvIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkhXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWVudHJ5ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmZfcmVnX2R1bXA0IiwKLQkJCQkJICAgICAgIFNfSUZSRUcgfCBTX0lSVUdPLCBkaXJfZGV2LAotCQkJCQkgICAgICAgcHJvY19nZXRfcmZfcmVnX2R1bXA0LCBkZXYpOwotCQlpZiAoIWVudHJ5KSB7Ci0JCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0jaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJhbGxfc3RhX2luZm8iLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9hbGxfc3RhX2luZm8sIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImJlc3RfY2hhbm5lbCIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X2Jlc3RfY2hhbm5lbCwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQllbnRyeSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJ4X3NpZ25hbCIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIGRpcl9kZXYsIHByb2NfZ2V0X3J4X3NpZ25hbCwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JZW50cnktPndyaXRlX3Byb2MgPSBwcm9jX3NldF9yeF9zaWduYWw7Ci0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJodF9lbmFibGUiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9odF9lbmFibGUsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfaHRfZW5hYmxlOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJjYnc0MF9lbmFibGUiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9jYnc0MF9lbmFibGUsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfY2J3NDBfZW5hYmxlOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJhbXBkdV9lbmFibGUiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9hbXBkdV9lbmFibGUsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfYW1wZHVfZW5hYmxlOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyeF9zdGJjIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgZGlyX2RldiwgcHJvY19nZXRfcnhfc3RiYywgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JZW50cnktPndyaXRlX3Byb2MgPSBwcm9jX3NldF9yeF9zdGJjOwotCi0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJwYXRoX3Jzc2kiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkJZGlyX2RldiwgcHJvY19nZXRfdHdvX3BhdGhfcnNzaSwgZGV2KTsKLQlpZiAoIWVudHJ5KSB7Ci0JCXByX2luZm8oIlVuYWJsZSB0byBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JZW50cnkgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyc3NpX2Rpc3AiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBkaXJfZGV2LCBwcm9jX2dldF9yc3NpX2Rpc3AsIGRldik7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCWVudHJ5LT53cml0ZV9wcm9jID0gcHJvY19zZXRfcnNzaV9kaXNwOwotfQotCi12b2lkIHJ0d19wcm9jX3JlbW92ZV9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcl9kZXYgPSBOVUxMOwotCXN0cnVjdCBhZGFwdGVyCSpwYWRhcHRlciA9IHJ0d19uZXRkZXZfcHJpdihkZXYpOwotCXU4IHJmX3R5cGU7Ci0KLQlkaXJfZGV2ID0gcGFkYXB0ZXItPmRpcl9kZXY7Ci0JcGFkYXB0ZXItPmRpcl9kZXYgPSBOVUxMOwotCi0JaWYgKGRpcl9kZXYpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIndyaXRlX3JlZyIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgicmVhZF9yZWciLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImZ3c3RhdGUiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInNlY19pbmZvIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJtbG1leHRfc3RhdGUiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInFvc19vcHRpb24iLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImh0X29wdGlvbiIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgicmZfaW5mbyIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgiYXBfaW5mbyIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgiYWRhcHRlcl9zdGF0ZSIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgidHJ4X2luZm8iLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIm1hY19yZWdfZHVtcDEiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIm1hY19yZWdfZHVtcDIiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIm1hY19yZWdfZHVtcDMiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImJiX3JlZ19kdW1wMSIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgiYmJfcmVnX2R1bXAyIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJiYl9yZWdfZHVtcDMiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInJmX3JlZ19kdW1wMSIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgicmZfcmVnX2R1bXAyIiwgZGlyX2Rldik7Ci0JCXJ0d19oYWxfZ2V0X2h3cmVnKHBhZGFwdGVyLCBIV19WQVJfUkZfVFlQRSwgKHU4ICopKCZyZl90eXBlKSk7Ci0JCWlmICgoUkZfMVQyUiA9PSByZl90eXBlKSB8fCAoUkZfMVQxUiA9PSByZl90eXBlKSkgewotCQkJcmVtb3ZlX3Byb2NfZW50cnkoInJmX3JlZ19kdW1wMyIsIGRpcl9kZXYpOwotCQkJcmVtb3ZlX3Byb2NfZW50cnkoInJmX3JlZ19kdW1wNCIsIGRpcl9kZXYpOwotCQl9Ci0jaWZkZWYgQ09ORklHXzg4RVVfQVBfTU9ERQotCQlyZW1vdmVfcHJvY19lbnRyeSgiYWxsX3N0YV9pbmZvIiwgZGlyX2Rldik7Ci0jZW5kaWYKLQotCQlyZW1vdmVfcHJvY19lbnRyeSgiYmVzdF9jaGFubmVsIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJyeF9zaWduYWwiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImNidzQwX2VuYWJsZSIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgiaHRfZW5hYmxlIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJhbXBkdV9lbmFibGUiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInJ4X3N0YmMiLCBkaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInBhdGhfcnNzaSIsIGRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgicnNzaV9kaXNwIiwgZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KGRldi0+bmFtZSwgcnR3X3Byb2MpOwotCQlkaXJfZGV2ID0gTlVMTDsKLQl9IGVsc2UgewotCQlyZXR1cm47Ci0JfQotCXJ0d19wcm9jX2NudC0tOwotCi0JaWYgKHJ0d19wcm9jX2NudCA9PSAwKSB7Ci0JCWlmIChydHdfcHJvYykgewotCQkJcmVtb3ZlX3Byb2NfZW50cnkoInZlcl9pbmZvIiwgcnR3X3Byb2MpOwotCi0JCQlyZW1vdmVfcHJvY19lbnRyeShydHdfcHJvY19uYW1lLCBpbml0X25ldC5wcm9jX25ldCk7Ci0JCQlydHdfcHJvYyA9IE5VTEw7Ci0JCX0KLQl9Ci19Ci0jZW5kaWYKLQogc3RhdGljIHZvaWQgbG9hZHBhcmFtKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpCiB7CiAJc3RydWN0IHJlZ2lzdHJ5X3ByaXYgICpyZWdpc3RyeV9wYXIgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAogCUdsb2JhbERlYnVnTGV2ZWwgPSBydHdfZGVidWc7Ci0JcmVnaXN0cnlfcGFyLT5jaGlwX3ZlcnNpb24gPSAodTgpcnR3X2NoaXBfdmVyc2lvbjsKLQlyZWdpc3RyeV9wYXItPnJmaW50ZnMgPSAodTgpcnR3X3JmaW50ZnM7Ci0JcmVnaXN0cnlfcGFyLT5sYmttb2RlID0gKHU4KXJ0d19sYmttb2RlOwotCXJlZ2lzdHJ5X3Bhci0+bmV0d29ya19tb2RlICA9ICh1OClydHdfbmV0d29ya19tb2RlOwogCiAJbWVtY3B5KHJlZ2lzdHJ5X3Bhci0+c3NpZC5Tc2lkLCAiQU5ZIiwgMyk7CiAJcmVnaXN0cnlfcGFyLT5zc2lkLlNzaWRMZW5ndGggPSAzOwpAQCAtNTUxLDE3ICsxNjMsOSBAQAogCXJlZ2lzdHJ5X3Bhci0+cnRzX3RocmVzaCA9ICh1MTYpcnR3X3J0c190aHJlc2g7CiAJcmVnaXN0cnlfcGFyLT5mcmFnX3RocmVzaCA9ICh1MTYpcnR3X2ZyYWdfdGhyZXNoOwogCXJlZ2lzdHJ5X3Bhci0+cHJlYW1ibGUgPSAodTgpcnR3X3ByZWFtYmxlOwotCXJlZ2lzdHJ5X3Bhci0+c2Nhbl9tb2RlID0gKHU4KXJ0d19zY2FuX21vZGU7Ci0JcmVnaXN0cnlfcGFyLT5hZGhvY190eF9wd3IgPSAodTgpcnR3X2FkaG9jX3R4X3B3cjsKLQlyZWdpc3RyeV9wYXItPnNvZnRfYXAgPSAgKHU4KXJ0d19zb2Z0X2FwOwogCXJlZ2lzdHJ5X3Bhci0+c21hcnRfcHMgPSAgKHU4KXJ0d19zbWFydF9wczsKIAlyZWdpc3RyeV9wYXItPnBvd2VyX21nbnQgPSAodTgpcnR3X3Bvd2VyX21nbnQ7CiAJcmVnaXN0cnlfcGFyLT5pcHNfbW9kZSA9ICh1OClydHdfaXBzX21vZGU7Ci0JcmVnaXN0cnlfcGFyLT5yYWRpb19lbmFibGUgPSAodTgpcnR3X3JhZGlvX2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPmxvbmdfcmV0cnlfbG10ID0gKHU4KXJ0d19sb25nX3JldHJ5X2xtdDsKLQlyZWdpc3RyeV9wYXItPnNob3J0X3JldHJ5X2xtdCA9ICh1OClydHdfc2hvcnRfcmV0cnlfbG10OwotCXJlZ2lzdHJ5X3Bhci0+YnVzeV90aHJlc2ggPSAodTE2KXJ0d19idXN5X3RocmVzaDsKLQlyZWdpc3RyeV9wYXItPmFja19wb2xpY3kgPSAodTgpcnR3X2Fja19wb2xpY3k7CiAJcmVnaXN0cnlfcGFyLT5tcF9tb2RlID0gMDsKIAlyZWdpc3RyeV9wYXItPnNvZnR3YXJlX2VuY3J5cHQgPSAodTgpcnR3X3NvZnR3YXJlX2VuY3J5cHQ7CiAJcmVnaXN0cnlfcGFyLT5zb2Z0d2FyZV9kZWNyeXB0ID0gKHU4KXJ0d19zb2Z0d2FyZV9kZWNyeXB0OwpAQCAtNTcwLDI4ICsxNzQsMTggQEAKIAkgLyogVUFQU0QgKi8KIAlyZWdpc3RyeV9wYXItPndtbV9lbmFibGUgPSAodTgpcnR3X3dtbV9lbmFibGU7CiAJcmVnaXN0cnlfcGFyLT51YXBzZF9lbmFibGUgPSAodTgpcnR3X3VhcHNkX2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPnVhcHNkX21heF9zcCA9ICh1OClydHdfdWFwc2RfbWF4X3NwOwotCXJlZ2lzdHJ5X3Bhci0+dWFwc2RfYWNia19lbiA9ICh1OClydHdfdWFwc2RfYWNia19lbjsKLQlyZWdpc3RyeV9wYXItPnVhcHNkX2FjYmVfZW4gPSAodTgpcnR3X3VhcHNkX2FjYmVfZW47Ci0JcmVnaXN0cnlfcGFyLT51YXBzZF9hY3ZpX2VuID0gKHU4KXJ0d191YXBzZF9hY3ZpX2VuOwotCXJlZ2lzdHJ5X3Bhci0+dWFwc2RfYWN2b19lbiA9ICh1OClydHdfdWFwc2RfYWN2b19lbjsKIAogCXJlZ2lzdHJ5X3Bhci0+aHRfZW5hYmxlID0gKHU4KXJ0d19odF9lbmFibGU7CiAJcmVnaXN0cnlfcGFyLT5jYnc0MF9lbmFibGUgPSAodTgpcnR3X2NidzQwX2VuYWJsZTsKIAlyZWdpc3RyeV9wYXItPmFtcGR1X2VuYWJsZSA9ICh1OClydHdfYW1wZHVfZW5hYmxlOwogCXJlZ2lzdHJ5X3Bhci0+cnhfc3RiYyA9ICh1OClydHdfcnhfc3RiYzsKIAlyZWdpc3RyeV9wYXItPmFtcGR1X2Ftc2R1ID0gKHU4KXJ0d19hbXBkdV9hbXNkdTsKLQlyZWdpc3RyeV9wYXItPmxvd3JhdGVfdHdvX3htaXQgPSAodTgpcnR3X2xvd3JhdGVfdHdvX3htaXQ7Ci0JcmVnaXN0cnlfcGFyLT5yZl9jb25maWcgPSAodTgpcnR3X3JmX2NvbmZpZzsKLQlyZWdpc3RyeV9wYXItPmxvd19wb3dlciA9ICh1OClydHdfbG93X3Bvd2VyOwogCXJlZ2lzdHJ5X3Bhci0+d2lmaV9zcGVjID0gKHU4KXJ0d193aWZpX3NwZWM7CiAJcmVnaXN0cnlfcGFyLT5jaGFubmVsX3BsYW4gPSAodTgpcnR3X2NoYW5uZWxfcGxhbjsKIAlyZWdpc3RyeV9wYXItPmFjY2VwdF9hZGRiYV9yZXEgPSB0cnVlOwogCXJlZ2lzdHJ5X3Bhci0+YW50ZGl2X2NmZyA9ICh1OClydHdfYW50ZGl2X2NmZzsKIAlyZWdpc3RyeV9wYXItPmFudGRpdl90eXBlID0gKHU4KXJ0d19hbnRkaXZfdHlwZTsKIAlyZWdpc3RyeV9wYXItPmh3cGRuX21vZGUgPSAodTgpcnR3X2h3cGRuX21vZGU7Ci0JcmVnaXN0cnlfcGFyLT5od3B3cnBfZGV0ZWN0ID0gKHU4KXJ0d19od3B3cnBfZGV0ZWN0OwotCXJlZ2lzdHJ5X3Bhci0+aHdfd3BzX3BiYyA9ICh1OClydHdfaHdfd3BzX3BiYzsKIAogCXJlZ2lzdHJ5X3Bhci0+bWF4X3JvYW1pbmdfdGltZXMgPSAodTgpcnR3X21heF9yb2FtaW5nX3RpbWVzOwogCkBAIC03MzIsNyArMzI2LDcgQEAKIAlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIitpbml0X25ldF9kZXZcbiIpKTsKIAogCWlmIChvbGRfcGFkYXB0ZXIgIT0gTlVMTCkKLQkJcG5ldGRldiA9IHJ0d19hbGxvY19ldGhlcmRldl93aXRoX29sZF9wcml2KHNpemVvZihzdHJ1Y3QgYWRhcHRlciksICh2b2lkICopb2xkX3BhZGFwdGVyKTsKKwkJcG5ldGRldiA9IHJ0d19hbGxvY19ldGhlcmRldl93aXRoX29sZF9wcml2KCh2b2lkICopb2xkX3BhZGFwdGVyKTsKIAogCWlmICghcG5ldGRldikKIAkJcmV0dXJuIE5VTEw7CkBAIC03NjIsNyArMzU2LDcgQEAKIAkJZXJyID0gUFRSX0VSUihwYWRhcHRlci0+Y21kVGhyZWFkKTsKIAllbHNlCiAJCS8qIHdhaXQgZm9yIGNtZF90aHJlYWQgdG8gcnVuICovCi0JCV9ydHdfZG93bl9zZW1hKCZwYWRhcHRlci0+Y21kcHJpdi50ZXJtaW5hdGVfY21kdGhyZWFkX3NlbWEpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJnBhZGFwdGVyLT5jbWRwcml2LnRlcm1pbmF0ZV9jbWR0aHJlYWRfY29tcCk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNzcyLDkgKzM2Niw5IEBACiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCIrcnR3X3N0b3BfZHJ2X3RocmVhZHNcbiIpKTsKIAogCS8qIEJlbG93IGlzIHRvIHRlcm1pbmF0ZSBydHdfY21kX3RocmVhZCAmIGV2ZW50X3RocmVhZC4uLiAqLwotCXVwKCZwYWRhcHRlci0+Y21kcHJpdi5jbWRfcXVldWVfc2VtYSk7CisJY29tcGxldGUoJnBhZGFwdGVyLT5jbWRwcml2LmNtZF9xdWV1ZV9jb21wKTsKIAlpZiAocGFkYXB0ZXItPmNtZFRocmVhZCkKLQkJX3J0d19kb3duX3NlbWEoJnBhZGFwdGVyLT5jbWRwcml2LnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmcGFkYXB0ZXItPmNtZHByaXYudGVybWluYXRlX2NtZHRocmVhZF9jb21wKTsKIAogfQogCkBAIC04MjEsNyArNDE1LDYgQEAKIAlwYWRhcHRlci0+YlJlYWRQb3J0Q2FuY2VsID0gZmFsc2U7CiAJcGFkYXB0ZXItPmJXcml0ZVBvcnRDYW5jZWwgPSBmYWxzZTsKIAlwYWRhcHRlci0+YlJ4UlNTSURpc3BsYXkgPSAwOwotCXBhZGFwdGVyLT5iTm90aWZ5Q2hhbm5lbENoYW5nZSA9IDA7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCkBAIC05MTIsOCArNTA1LDYgQEAKIAogCXJ0d19oYWxfc3Jlc2V0X2luaXQocGFkYXB0ZXIpOwogCi0Jc3Bpbl9sb2NrX2luaXQoJnBhZGFwdGVyLT5icl9leHRfbG9jayk7Ci0KIGV4aXQ6CiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCItcnR3X2luaXRfZHJ2X3N3XG4iKSk7CiAKQEAgLTk2MSwxMiArNTUyLDYgQEAKIAogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiPD09IHJ0d19mcmVlX2Rydl9zd1xuIikpOwogCi0JLyogZnJlZSB0aGUgb2xkX3BuZXRkZXYgKi8KLQlpZiAocGFkYXB0ZXItPnJlcmVnX25kX25hbWVfcHJpdi5vbGRfcG5ldGRldikgewotCQlmcmVlX25ldGRldihwYWRhcHRlci0+cmVyZWdfbmRfbmFtZV9wcml2Lm9sZF9wbmV0ZGV2KTsKLQkJcGFkYXB0ZXItPnJlcmVnX25kX25hbWVfcHJpdi5vbGRfcG5ldGRldiA9IE5VTEw7Ci0JfQotCiAJbXV0ZXhfZGVzdHJveSgmcGFkYXB0ZXItPmh3X2luaXRfbXV0ZXgpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCItcnR3X2ZyZWVfZHJ2X3N3XG4iKSk7CkBAIC0xMDEzLDcgKzU5OCw2IEBACiAJCX0KIAkJaWYgKHBhZGFwdGVyLT5pbnRmX3N0YXJ0KQogCQkJcGFkYXB0ZXItPmludGZfc3RhcnQocGFkYXB0ZXIpOwotCQlydHdfcHJvY19pbml0X29uZShwbmV0ZGV2KTsKIAogCQlydHdfbGVkX2NvbnRyb2wocGFkYXB0ZXIsIExFRF9DVExfTk9fTElOSyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zZGVwX3NlcnZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zZGVwX3NlcnZpY2UuYwppbmRleCA3NjQyNTBiLi43Y2QyNjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc2RlcF9zZXJ2aWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NkZXBfc2VydmljZS5jCkBAIC01NSwyMSArNTUsMTMgQEAKIAlyZXR1cm4gYTsKIH0KIAotdTMyIF9ydHdfZG93bl9zZW1hKHN0cnVjdCBzZW1hcGhvcmUgKnNlbWEpCi17Ci0JaWYgKGRvd25faW50ZXJydXB0aWJsZShzZW1hKSkKLQkJcmV0dXJuIF9GQUlMOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQogdm9pZAlfcnR3X2luaXRfcXVldWUoc3RydWN0IF9fcXVldWUgKnBxdWV1ZSkKIHsKIAlJTklUX0xJU1RfSEVBRCgmKHBxdWV1ZS0+cXVldWUpKTsKIAlzcGluX2xvY2tfaW5pdCgmKHBxdWV1ZS0+bG9jaykpOwogfQogCi1zdHJ1Y3QgbmV0X2RldmljZSAqcnR3X2FsbG9jX2V0aGVyZGV2X3dpdGhfb2xkX3ByaXYoaW50IHNpemVvZl9wcml2LAotCQkJCQkJICAgIHZvaWQgKm9sZF9wcml2KQorc3RydWN0IG5ldF9kZXZpY2UgKnJ0d19hbGxvY19ldGhlcmRldl93aXRoX29sZF9wcml2KHZvaWQgKm9sZF9wcml2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2OwogCXN0cnVjdCBydHdfbmV0ZGV2X3ByaXZfaW5kaWNhdG9yICpwbnBpOwpAQCAtODAsNyArNzIsNiBAQAogCiAJcG5waSA9IG5ldGRldl9wcml2KHBuZXRkZXYpOwogCXBucGktPnByaXYgPSBvbGRfcHJpdjsKLQlwbnBpLT5zaXplb2ZfcHJpdiA9IHNpemVvZl9wcml2OwogCiBSRVRVUk46CiAJcmV0dXJuIHBuZXRkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9yZWN2X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9yZWN2X2xpbnV4LmMKaW5kZXggMGM0NDkxNC4uMTAzY2RiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3JlY3ZfbGludXguYwpAQCAtMjQsNyArMjQsNiBAQAogLyogYWxsb2Mgb3MgcmVsYXRlZCByZXNvdXJjZSBpbiBzdHJ1Y3QgcmVjdl9mcmFtZSAqLwogdm9pZCBydHdfb3NfcmVjdl9yZXNvdXJjZV9hbGxvYyhzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKIHsKLQlwcmVjdmZyYW1lLT5wa3RfbmV3YWxsb2MgPSBOVUxMOwogCXByZWN2ZnJhbWUtPnBrdCA9IE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2JfaW50Zi5jCmluZGV4IDExZDUxYTMuLjY4ZTFlNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYwpAQCAtMjUsOSArMjUsMTAgQEAKICNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+CiAKICNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0jaW5jbHVkZSA8dXNiX2hhbC5oPgogI2luY2x1ZGUgPHJ0d19pb2N0bC5oPgogCisjaW5jbHVkZSAicnRsODE4OGVfaGFsLmgiCisKICNkZWZpbmUgVVNCX1ZFTkRFUl9JRF9SRUFMVEVLCQkweDBiZGEKIAogLyogRElEX1VTQl92OTE2XzIwMTMwMTE2ICovCkBAIC03OSw5ICs4MCw4IEBACiAKIAlwZHZvYmpwcml2LT5OdW1JbnRlcmZhY2VzID0gcGNvbmZfZGVzYy0+Yk51bUludGVyZmFjZXM7CiAJcGR2b2JqcHJpdi0+SW50ZXJmYWNlTnVtYmVyID0gcGlmYWNlX2Rlc2MtPmJJbnRlcmZhY2VOdW1iZXI7Ci0JcGR2b2JqcHJpdi0+bnJfZW5kcG9pbnQgPSBwaWZhY2VfZGVzYy0+Yk51bUVuZHBvaW50czsKIAotCWZvciAoaSA9IDA7IGkgPCBwZHZvYmpwcml2LT5ucl9lbmRwb2ludDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHBpZmFjZV9kZXNjLT5iTnVtRW5kcG9pbnRzOyBpKyspIHsKIAkJaW50IGVwX251bTsKIAkJcGVuZHBfZGVzYyA9ICZwaG9zdF9pZmFjZS0+ZW5kcG9pbnRbaV0uZGVzYzsKIApAQCAtOTgsNyArOTgsNiBAQAogCQkJCWVwX251bTsKIAkJCXBkdm9ianByaXYtPlJ0TnVtT3V0UGlwZXMrKzsKIAkJfQotCQlwZHZvYmpwcml2LT5lcF9udW1baV0gPSBlcF9udW07CiAJfQogCiAJaWYgKHB1c2JkLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKQEAgLTEwNywxMyArMTA2LDYgQEAKIAkJcGR2b2JqcHJpdi0+aXNoaWdoc3BlZWQgPSBmYWxzZTsKIAogCW11dGV4X2luaXQoJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQlwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9idWYgPSBremFsbG9jKE1BWF9VU0JfSU9fQ1RMX1NJWkUsIEdGUF9LRVJORUwpOwotCi0JaWYgKCFwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9idWYpIHsKLQkJdXNiX3NldF9pbnRmZGF0YSh1c2JfaW50ZiwgTlVMTCk7Ci0JCWtmcmVlKHBkdm9ianByaXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9CiAJdXNiX2dldF9kZXYocHVzYmQpOwogCiAJcmV0dXJuIHBkdm9ianByaXY7CkBAIC0xNDEsNyArMTMzLDYgQEAKIAkJCX0KIAkJfQogCi0JCWtmcmVlKGR2b2JqLT51c2JfdmVuZG9yX3JlcV9idWYpOwogCQltdXRleF9kZXN0cm95KCZkdm9iai0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwogCQlrZnJlZShkdm9iaik7CiAJfQpAQCAtMjM4LDcgKzIyOSw3IEBACiAJcnR3X2NhbmNlbF9hbGxfdGltZXIocGFkYXB0ZXIpOwogCUxlYXZlQWxsUG93ZXJTYXZlTW9kZShwYWRhcHRlcik7CiAKLQlfZW50ZXJfcHdybG9jaygmcHdycHJpdi0+bG9jayk7CisJbXV0ZXhfbG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAJLyogczEuICovCiAJaWYgKHBuZXRkZXYpIHsKIAkJbmV0aWZfY2Fycmllcl9vZmYocG5ldGRldik7CkBAIC0yNjcsNyArMjU4LDcgQEAKIAlydHdfZnJlZV9uZXR3b3JrX3F1ZXVlKHBhZGFwdGVyLCB0cnVlKTsKIAogCXJ0d19kZXZfdW5sb2FkKHBhZGFwdGVyKTsKLQlfZXhpdF9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwltdXRleF91bmxvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkKIAkJcnR3X2luZGljYXRlX3NjYW5fZG9uZShwYWRhcHRlciwgMSk7CkBAIC0yOTgsMTggKzI4OSwyMCBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JX2VudGVyX3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X2xvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCXJ0d19yZXNldF9kcnZfc3cocGFkYXB0ZXIpOwogCXB3cnByaXYtPmJrZWVwZndhbGl2ZSA9IGZhbHNlOwogCiAJcHJfZGVidWcoImJrZWVwZndhbGl2ZSgleClcbiIsIHB3cnByaXYtPmJrZWVwZndhbGl2ZSk7Ci0JaWYgKHBtX25ldGRldl9vcGVuKHBuZXRkZXYsIHRydWUpICE9IDApCisJaWYgKHBtX25ldGRldl9vcGVuKHBuZXRkZXYsIHRydWUpICE9IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAkJZ290byBleGl0OworCX0KIAogCW5ldGlmX2RldmljZV9hdHRhY2gocG5ldGRldik7CiAJbmV0aWZfY2Fycmllcl9vbihwbmV0ZGV2KTsKIAotCV9leGl0X3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAKIAlydHdfcm9hbWluZyhwYWRhcHRlciwgTlVMTCk7CiAKQEAgLTM2OSw4ICszNjIsOSBAQAogCQlwYWRhcHRlci0+cG1vbmRldiA9IHBtb25kZXY7CiAJfQogCi0JLyogc3RlcCAyLiBob29rIEhhbEZ1bmMsIGFsbG9jYXRlIEhhbERhdGEgKi8KLQloYWxfc2V0X2hhbF9vcHMocGFkYXB0ZXIpOworCXBhZGFwdGVyLT5IYWxEYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhhbF9kYXRhXzgxODhlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYWRhcHRlci0+SGFsRGF0YSkKKwkJREJHXzg4RSgiY2FudCBub3QgYWxsb2MgbWVtb3J5IGZvciBIQUwgREFUQVxuIik7CiAKIAlwYWRhcHRlci0+aW50Zl9zdGFydCA9ICZ1c2JfaW50Zl9zdGFydDsKIAlwYWRhcHRlci0+aW50Zl9zdG9wID0gJnVzYl9pbnRmX3N0b3A7CkBAIC00NTYsMTEgKzQ1MCw5IEBACiAJZnJlZV9tbG1lX2FwX2luZm8oaWYxKTsKICNlbmRpZgogCi0JaWYgKHBuZXRkZXYpIHsKLQkJLyogd2lsbCBjYWxsIG5ldGRldl9jbG9zZSgpICovCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KHBuZXRkZXYpOwotCQlydHdfcHJvY19yZW1vdmVfb25lKHBuZXRkZXYpOwotCX0KKwlpZiAocG5ldGRldikKKwkJdW5yZWdpc3Rlcl9uZXRkZXYocG5ldGRldik7IC8qIHdpbGwgY2FsbCBuZXRkZXZfY2xvc2UoKSAqLworCiAJcnRsODhldV9tb25fZGVpbml0KGlmMS0+cG1vbmRldik7CiAJcnR3X2NhbmNlbF9hbGxfdGltZXIoaWYxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX29wc19saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX29wc19saW51eC5jCmluZGV4IGNlMWUxYTEuLmQwZDU5MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMKQEAgLTIwLDcgKzIwLDcgQEAKIAogc3RhdGljIHZvaWQgaW50ZXJydXB0X2hhbmRsZXJfODE4OGV1KHN0cnVjdCBhZGFwdGVyICphZGFwdCwgdTE2IHBrdF9sZW4sIHU4ICpwYnVmKQogewotCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkqaGFsZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CisJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxkYXRhID0gYWRhcHQtPkhhbERhdGE7CiAKIAlpZiAocGt0X2xlbiAhPSBJTlRFUlJVUFRfTVNHX0ZPUk1BVF9MRU4pIHsKIAkJREJHXzg4RSgiJXMgSW52YWxpZCBpbnRlcnJ1cHQgY29udGVudCBsZW5ndGggKCVkKSFcbiIsIF9fZnVuY19fLCBwa3RfbGVuKTsKQEAgLTQ4LDcgKzQ4LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqcGt0X2NvcHkgPSBOVUxMOwogCXN0cnVjdCByZWN2X2ZyYW1lCSpwcmVjdmZyYW1lID0gTlVMTDsKIAlzdHJ1Y3QgcnhfcGt0X2F0dHJpYgkqcGF0dHJpYiA9IE5VTEw7Ci0Jc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKKwlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbGRhdGEgPSBhZGFwdC0+SGFsRGF0YTsKIAlzdHJ1Y3QgcmVjdl9wcml2CSpwcmVjdnByaXYgPSAmYWRhcHQtPnJlY3Zwcml2OwogCXN0cnVjdCBfX3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlID0gJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3F1ZXVlOwogCkBAIC0yNTEsNyArMjUxLDcgQEAKIAl9CiAKIAkvKiAgQWNxdWlyZSBJTyBtZW1vcnkgZm9yIHZlbmRvcnJlcSAqLwotCXBJb19idWYgPSBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX2J1ZjsKKwlwSW9fYnVmID0ga21hbGxvYyhNQVhfVVNCX0lPX0NUTF9TSVpFLCBHRlBfQVRPTUlDKTsKIAogCWlmIChwSW9fYnVmID09IE5VTEwpIHsKIAkJREJHXzg4RSgiWyVzXSBwSW9fYnVmID09IE5VTExcbiIsIF9fZnVuY19fKTsKQEAgLTI4NSw4ICsyODUsNyBAQAogCQkJCWlmIChzdGF0dXMgPT0gKC1FU0hVVERPV04pIHx8IHN0YXR1cyA9PSAtRU5PREVWKSB7CiAJCQkJCWFkYXB0LT5iU3VycHJpc2VSZW1vdmVkID0gdHJ1ZTsKIAkJCQl9IGVsc2UgewotCQkJCQlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUJKmhhbGRhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwotCQkJCQloYWxkYXRhLT5zcmVzdHByaXYuV2lmaV9FcnJvcl9TdGF0dXMgPSBVU0JfVkVOX1JFUV9DTURfRkFJTDsKKwkJCQkJYWRhcHQtPkhhbERhdGEtPnNyZXN0cHJpdi5XaWZpX0Vycm9yX1N0YXR1cyA9IFVTQl9WRU5fUkVRX0NNRF9GQUlMOwogCQkJCX0KIAkJCX0gZWxzZSB7IC8qICBzdGF0dXMgIT0gbGVuICYmIHN0YXR1cyA+PSAwICovCiAJCQkJaWYgKHN0YXR1cyA+IDApIHsKQEAgLTMwMyw2ICszMDIsOCBAQAogCQlpZiAoKHZhbHVlID49IEZXXzgxODhFX1NUQVJUX0FERFJFU1MgJiYgdmFsdWUgPD0gRldfODE4OEVfRU5EX0FERFJFU1MpIHx8IHN0YXR1cyA9PSBsZW4pCiAJCQlicmVhazsKIAl9CisJa2ZyZWUocElvX2J1Zik7CisKIHJlbGVhc2VfbXV0ZXg6CiAJbXV0ZXhfdW5sb2NrKCZkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKIGV4aXQ6CkBAIC00MzQsMTAgKzQzNSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSAtRVBST1RPOgogCQljYXNlIC1FT1ZFUkZMT1c6Ci0JCQl7Ci0JCQkJc3RydWN0IGhhbF9kYXRhXzgxODhlCSpoYWxkYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKLQkJCQloYWxkYXRhLT5zcmVzdHByaXYuV2lmaV9FcnJvcl9TdGF0dXMgPSBVU0JfUkVBRF9QT1JUX0ZBSUw7Ci0JCQl9CisJCQlhZGFwdC0+SGFsRGF0YS0+c3Jlc3Rwcml2LldpZmlfRXJyb3JfU3RhdHVzID0gVVNCX1JFQURfUE9SVF9GQUlMOwogCQkJcHJlY3ZidWYtPnJldXNlID0gdHJ1ZTsKIAkJCXVzYl9yZWFkX3BvcnQoYWRhcHQsIHByZWN2cHJpdi0+ZmZfaHdhZGRyLCAwLCAodW5zaWduZWQgY2hhciAqKXByZWN2YnVmKTsKIAkJCWJyZWFrOwpAQCAtNTI1LDcgKzUyMyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCB1c2JfcmVhZF9wb3J0X2NhbmNlbChzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCit2b2lkIHJ0d19oYWxfaW5pcnBfZGVpbml0KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcikKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOwpAQCAtNjkxLDcgKzY4OSw3IEBACiAJdGFza2xldF9oaV9zY2hlZHVsZSgmcHhtaXRwcml2LT54bWl0X3Rhc2tsZXQpOwogfQogCi11MzIgdXNiX3dyaXRlX3BvcnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKndtZW0pCit1MzIgdXNiX3dyaXRlX3BvcnQoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYWRkciwgdTMyIGNudCwgc3RydWN0IHhtaXRfYnVmICp4bWl0YnVmKQogewogCXVuc2lnbmVkIGxvbmcgaXJxTDsKIAl1bnNpZ25lZCBpbnQgcGlwZTsKQEAgLTcwMCw4ICs2OTgsNyBAQAogCXN0cnVjdCB1cmIgKnB1cmIgPSBOVUxMOwogCXN0cnVjdCBkdm9ial9wcml2CSpwZHZvYmogPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKIAlzdHJ1Y3QgeG1pdF9wcml2CSpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYgPSAoc3RydWN0IHhtaXRfYnVmICopd21lbTsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSA9IChzdHJ1Y3QgeG1pdF9mcmFtZSAqKXB4bWl0YnVmLT5wcml2X2RhdGE7CisJc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSAoc3RydWN0IHhtaXRfZnJhbWUgKil4bWl0YnVmLT5wcml2X2RhdGE7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnB1c2JkID0gcGR2b2JqLT5wdXNiZGV2OwogCiAKQEAgLTcxMSw3ICs3MDgsNyBAQAogCSAgICAocGFkYXB0ZXItPnB3cmN0cmxwcml2LnBucF9ic3RvcF90cngpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAogCQkJICgidXNiX3dyaXRlX3BvcnQ6KCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHxwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fGFkYXB0ZXItPnB3cmN0cmxwcml2LnBucF9ic3RvcF90cngpISEhXG4iKSk7Ci0JCXJ0d19zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9UWF9ERU5ZKTsKKwkJcnR3X3NjdHhfZG9uZV9lcnIoJnhtaXRidWYtPnNjdHgsIFJUV19TQ1RYX0RPTkVfVFhfREVOWSk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTcyMCw0NCArNzE3LDQ0IEBACiAJc3dpdGNoIChhZGRyKSB7CiAJY2FzZSBWT19RVUVVRV9JTlg6CiAJCXB4bWl0cHJpdi0+dm9xX2NudCsrOwotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBWT19RVUVVRV9JTlg7CisJCXhtaXRidWYtPmZsYWdzID0gVk9fUVVFVUVfSU5YOwogCQlicmVhazsKIAljYXNlIFZJX1FVRVVFX0lOWDoKIAkJcHhtaXRwcml2LT52aXFfY250Kys7Ci0JCXB4bWl0YnVmLT5mbGFncyA9IFZJX1FVRVVFX0lOWDsKKwkJeG1pdGJ1Zi0+ZmxhZ3MgPSBWSV9RVUVVRV9JTlg7CiAJCWJyZWFrOwogCWNhc2UgQkVfUVVFVUVfSU5YOgogCQlweG1pdHByaXYtPmJlcV9jbnQrKzsKLQkJcHhtaXRidWYtPmZsYWdzID0gQkVfUVVFVUVfSU5YOworCQl4bWl0YnVmLT5mbGFncyA9IEJFX1FVRVVFX0lOWDsKIAkJYnJlYWs7CiAJY2FzZSBCS19RVUVVRV9JTlg6CiAJCXB4bWl0cHJpdi0+YmtxX2NudCsrOwotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBCS19RVUVVRV9JTlg7CisJCXhtaXRidWYtPmZsYWdzID0gQktfUVVFVUVfSU5YOwogCQlicmVhazsKIAljYXNlIEhJR0hfUVVFVUVfSU5YOgotCQlweG1pdGJ1Zi0+ZmxhZ3MgPSBISUdIX1FVRVVFX0lOWDsKKwkJeG1pdGJ1Zi0+ZmxhZ3MgPSBISUdIX1FVRVVFX0lOWDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHhtaXRidWYtPmZsYWdzID0gTUdUX1FVRVVFX0lOWDsKKwkJeG1pdGJ1Zi0+ZmxhZ3MgPSBNR1RfUVVFVUVfSU5YOwogCQlicmVhazsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZweG1pdHByaXYtPmxvY2ssIGlycUwpOwogCi0JcHVyYgk9IHB4bWl0YnVmLT5weG1pdF91cmJbMF07CisJcHVyYgk9IHhtaXRidWYtPnB4bWl0X3VyYlswXTsKIAogCS8qIHRyYW5zbGF0ZSBETUEgRklGTyBhZGRyIHRvIHBpcGVoYW5kbGUgKi8KIAlwaXBlID0gZmZhZGRyMnBpcGVoZGwocGR2b2JqLCBhZGRyKTsKIAogCXVzYl9maWxsX2J1bGtfdXJiKHB1cmIsIHB1c2JkLCBwaXBlLAotCQkJICBweG1pdGZyYW1lLT5idWZfYWRkciwgLyogIHB4bWl0YnVmLT5wYnVmICovCisJCQkgIHB4bWl0ZnJhbWUtPmJ1Zl9hZGRyLCAvKiAgeG1pdGJ1Zi0+cGJ1ZiAqLwogCQkJICBjbnQsCiAJCQkgIHVzYl93cml0ZV9wb3J0X2NvbXBsZXRlLAotCQkJICBweG1pdGJ1Zik7LyogY29udGV4dCBpcyBweG1pdGJ1ZiAqLworCQkJICB4bWl0YnVmKTsvKiBjb250ZXh0IGlzIHhtaXRidWYgKi8KIAogCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChzdGF0dXMpIHsKLQkJcnR3X3NjdHhfZG9uZV9lcnIoJnB4bWl0YnVmLT5zY3R4LCBSVFdfU0NUWF9ET05FX1dSSVRFX1BPUlRfRVJSKTsKKwkJcnR3X3NjdHhfZG9uZV9lcnIoJnhtaXRidWYtPnNjdHgsIFJUV19TQ1RYX0RPTkVfV1JJVEVfUE9SVF9FUlIpOwogCQlEQkdfODhFKCJ1c2Jfd3JpdGVfcG9ydCwgc3RhdHVzID0lZFxuIiwgc3RhdHVzKTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sICgidXNiX3dyaXRlX3BvcnQoKTogdXNiX3N1Ym1pdF91cmIsIHN0YXR1cyA9JXhcbiIsIHN0YXR1cykpOwogCkBAIC03NzksNyArNzc2LDcgQEAKIAogZXhpdDoKIAlpZiAocmV0ICE9IF9TVUNDRVNTKQotCQlydHdfZnJlZV94bWl0YnVmKHB4bWl0cHJpdiwgcHhtaXRidWYpOworCQlydHdfZnJlZV94bWl0YnVmKHB4bWl0cHJpdiwgeG1pdGJ1Zik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODQ2LDcgKzg0Myw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCXJldCA9IHJ0bDgxODhldV94bWl0ZnJhbWVfY29tcGxldGUoYWRhcHQsIHB4bWl0cHJpdiwgTlVMTCk7CisJCXJldCA9IHJ0bDgxODhldV94bWl0ZnJhbWVfY29tcGxldGUoYWRhcHQsIHB4bWl0cHJpdik7CiAKIAkJaWYgKCFyZXQpCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3htaXRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3htaXRfbGludXguYwppbmRleCAyMjFlMjc1Li40YjFiMDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC94bWl0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAveG1pdF9saW51eC5jCkBAIC03Miw3ICs3Miw3IEBACiAJaWYgKHB4bWl0YnVmLT5wYWxsb2NhdGVkX2J1ZiA9PSBOVUxMKQogCQlyZXR1cm4gX0ZBSUw7CiAKLQlweG1pdGJ1Zi0+cGJ1ZiA9ICh1OCAqKU5fQllURV9BTElHTUVOVCgoc2l6ZV90KShweG1pdGJ1Zi0+cGFsbG9jYXRlZF9idWYpLCBYTUlUQlVGX0FMSUdOX1NaKTsKKwlweG1pdGJ1Zi0+cGJ1ZiA9IFBUUl9BTElHTihweG1pdGJ1Zi0+cGFsbG9jYXRlZF9idWYsIFhNSVRCVUZfQUxJR05fU1opOwogCXB4bWl0YnVmLT5kbWFfdHJhbnNmZXJfYWRkciA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmMKaW5kZXggNGQ4ZmI0MS4uMjU3MjViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuYwpAQCAtNTEsOSArNTEsOCBAQAogCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9OT05FOwogCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSAwOwogCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKLQltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIgKyAxKTsKIAlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7Ci0KIH0KIEVYUE9SVF9TWU1CT0woZG90MTFkX2luaXQpOwogCkBAIC05OSwxNCArOTgsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0woRG90MTFkX0NoYW5uZWxtYXApOwogCi0KIHZvaWQgRG90MTFkX1Jlc2V0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewogCXN0cnVjdCBydF9kb3QxMWRfaW5mbyAqcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oaWVlZSk7CiAJdTMyIGk7CiAKLQltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0JbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIgKyAxKTsKKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSICsgMSk7CiAJZm9yIChpID0gMTsgaSA8PSAxMTsgaSsrKQogCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDE7CiAJZm9yIChpID0gMTI7IGkgPD0gMTQ7IGkrKykKQEAgLTEyMyw4ICsxMjEsOCBAQAogCXU4IGksIGosIE51bVRyaXBsZXMsIE1heENobmxOdW07CiAJc3RydWN0IGNobmxfdHhwb3dfdHJpcGxlICpwVHJpcGxlOwogCi0JbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwotCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSICsgMSk7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUiArIDEpOwogCU1heENobmxOdW0gPSAwOwogCU51bVRyaXBsZXMgPSAoQ291dHJ5SWVMZW4gLSAzKSAvIDM7CiAJcFRyaXBsZSA9IChzdHJ1Y3QgY2hubF90eHBvd190cmlwbGUgKikocENvdXRyeUllICsgMyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmgKaW5kZXggNzM1YTE5OS4uYWFjMzk1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuaApAQCAtNDcsOCArNDcsOCBAQAogCXU4ICBDb3VudHJ5SWVTcmNBZGRyWzZdOwogCXU4ICBDb3VudHJ5SWVXYXRjaGRvZzsKIAotCXU4ICBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07Ci0JdTggIE1heFR4UHdyRGJtTGlzdFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07CisJdTggIGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUiArIDFdOworCXU4ICBNYXhUeFB3ckRibUxpc3RbTUFYX0NIQU5ORUxfTlVNQkVSICsgMV07CiAKIAllbnVtIGRvdDExZF9zdGF0ZSBTdGF0ZTsKIH07CkBAIC03OCw2ICs3OCw3IEBACiB7CiAJR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSA9IDA7CiB9CisKICNkZWZpbmUgVVBEQVRFX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSAoKytHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpKQogCiB2b2lkIGRvdDExZF9pbml0KHN0cnVjdCBydGxsaWJfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfZGV2LmMKaW5kZXggYmE2NGE0Zi4uOGQ2YmNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9kZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2Rldi5jCkBAIC0xNDg3LDggKzE0ODcsOCBAQAogCXN0cnVjdCBwaHlfb2ZkbV9yeF9zdGF0dXNfcnhzY19zZ2llbl9leGludGZmbGFnICpwcnhzYzsKIAl1OCAqcHJ4cGt0OwogCXU4IGksIG1heF9zcGF0aWFsX3N0cmVhbSwgdG1wX3J4c25yLCB0bXBfcnhldm0sIHJ4c2Nfc2dpZW5fZXhmbGc7Ci0JY2hhciByeF9wd3JbNF0sIHJ4X3B3cl9hbGwgPSAwOwotCWNoYXIgcnhfc25yWCwgcnhfZXZtWDsKKwlzOCByeF9wd3JbNF0sIHJ4X3B3cl9hbGwgPSAwOworCXM4IHJ4X3NuclgsIHJ4X2V2bVg7CiAJdTggZXZtLCBwd2RiX2FsbDsKIAl1MzIgUlNTSSwgdG90YWxfcnNzaSA9IDA7CiAJdTggaXNfY2NrX3JhdGUgPSAwOwpAQCAtMTYxMyw3ICsxNjEzLDcgQEAKIAkJCQkgICAgIDIpIC0gMTEwOwogCiAJCQl0bXBfcnhzbnIgPSBwb2ZkbV9idWYtPnJ4c25yX1hbaV07Ci0JCQlyeF9zbnJYID0gKGNoYXIpKHRtcF9yeHNucik7CisJCQlyeF9zbnJYID0gKHM4KSh0bXBfcnhzbnIpOwogCQkJcnhfc25yWCAvPSAyOwogCQkJcHJpdi0+c3RhdHMucnhTTlJkQltpXSA9IChsb25nKXJ4X3Nuclg7CiAKQEAgLTE2NDMsNyArMTY0Myw3IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IG1heF9zcGF0aWFsX3N0cmVhbTsgaSsrKSB7CiAJCQl0bXBfcnhldm0gPSBwb2ZkbV9idWYtPnJ4ZXZtX1hbaV07Ci0JCQlyeF9ldm1YID0gKGNoYXIpKHRtcF9yeGV2bSk7CisJCQlyeF9ldm1YID0gKHM4KSh0bXBfcnhldm0pOwogCiAJCQlyeF9ldm1YIC89IDI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfaHdpbWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfaHdpbWcuYwppbmRleCAyOWNlZmI1Li5kNDM3YThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2h3aW1nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9od2ltZy5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKgogICogQ29udGFjdCBJbmZvcm1hdGlvbjoKICAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKkNyZWF0ZWQgb24gIDIwMDgvMTEvMTgsICAzOiA3Ki8KIAogI2luY2x1ZGUgInI4MTkyRV9od2ltZy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9waHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfcGh5LmMKaW5kZXggNWUzYmJlNS4uZGRlNDkyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9waHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX3BoeS5jCkBAIC0yNTYsNyArMjU2LDcgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZSAhPSBlUmZPbiAmJiAhcHJpdi0+YmVpbmdfaW5pdF9hZGFwdGVyKQogCQlyZXR1cm4JMDsKLQlkb3duKCZwcml2LT5yZl9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnJmX211dGV4KTsKIAlpZiAocHJpdi0+UmZfTW9kZSA9PSBSRl9PUF9CeV9GVykgewogCQlPcmlnaW5hbF9WYWx1ZSA9IF9ydGw5MmVfcGh5X3JmX2Z3X3JlYWQoZGV2LCBlUkZQYXRoLCBSZWdBZGRyKTsKIAkJdWRlbGF5KDIwMCk7CkBAIC0yNjUsNyArMjY1LDcgQEAKIAl9CiAJQml0U2hpZnQgPSAgX3J0bDkyZV9jYWxjdWxhdGVfYml0X3NoaWZ0KEJpdE1hc2spOwogCVJlYWRiYWNrX1ZhbHVlID0gKE9yaWdpbmFsX1ZhbHVlICYgQml0TWFzaykgPj4gQml0U2hpZnQ7Ci0JdXAoJnByaXYtPnJmX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5yZl9tdXRleCk7CiAJcmV0dXJuIFJlYWRiYWNrX1ZhbHVlOwogfQogCkBAIC02MzAsNyArNjMwLDcgQEAKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAJdTgJcG93ZXJsZXZlbCA9IDAsIHBvd2VybGV2ZWxPRkRNMjRHID0gMDsKLQljaGFyIGFudF9wd3JfZGlmZjsKKwlzOAlhbnRfcHdyX2RpZmY7CiAJdTMyCXU0UmVnVmFsdWU7CiAKIAlpZiAocHJpdi0+ZXByb210eXBlID09IEVFUFJPTV85M0M0NikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jYW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY2FtLmMKaW5kZXggODAzYzhiMC4uMzBmNjVhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jYW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NhbS5jCkBAIC0xMDcsOSArMTA3LDkgQEAKIAkJCQkJICAgIF9fZnVuY19fKTsKIAkJCQlyZXR1cm47CiAJCQl9Ci0JCQlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJbXV0ZXhfbG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCQkJcnRsOTJlX2lwc19sZWF2ZShkZXYpOwotCQkJdXAoJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQltdXRleF91bmxvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIAkJfQogCX0KIAlwcml2LT5ydGxsaWItPmlzX3NldF9rZXkgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuYwppbmRleCAxM2E1ZGRjLi40YzMwZWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuYwpAQCAtMzgsNyArMzgsNyBAQAogc3RhdGljIGNoYXIgKmlmbmFtZSA9ICJ3bGFuJWQiOwogCiAKLXN0YXRpYyBzdHJ1Y3QgcnRsODE5eF9vcHMgcnRsODE5eHBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBydGw4MTl4X29wcyBydGw4MTl4cF9vcHMgPSB7CiAJLm5pY190eXBlCQkJPSBOSUNfODE5MkUsCiAJLmdldF9lZXByb21fc2l6ZQkJPSBydGw5MmVfZ2V0X2VlcHJvbV9zaXplLAogCS5pbml0X2FkYXB0ZXJfdmFyaWFibGUJCT0gcnRsOTJlX2luaXRfdmFyaWFibGVzLApAQCAtOTkzLDggKzk5Myw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmlycV90aF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cmZfcHNfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnBzX2xvY2spOwotCXNlbWFfaW5pdCgmcHJpdi0+d3hfc2VtLCAxKTsKLQlzZW1hX2luaXQoJnByaXYtPnJmX3NlbSwgMSk7CisJbXV0ZXhfaW5pdCgmcHJpdi0+d3hfbXV0ZXgpOworCW11dGV4X2luaXQoJnByaXYtPnJmX211dGV4KTsKIAltdXRleF9pbml0KCZwcml2LT5tdXRleCk7CiB9CiAKQEAgLTEyNDcsNyArMTI0Nyw3IEBACiAKIFJFU0VUX1NUQVJUOgogCi0JCWRvd24oJnByaXYtPnd4X3NlbSk7CisJCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCQlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKQogCQkJcnRsOTJlX2xlaXN1cmVfcHNfbGVhdmUoZGV2KTsKQEAgLTEyNTUsNyArMTI1NSw3IEBACiAJCWlmIChwcml2LT51cCkgewogCQkJbmV0ZGV2X2luZm8oZGV2LCAiJXMoKTp0aGUgZHJpdmVyIGlzIG5vdCB1cC5cbiIsCiAJCQkJICAgIF9fZnVuY19fKTsKLQkJCXVwKCZwcml2LT53eF9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJCQlyZXR1cm47CiAJCX0KIAkJcHJpdi0+dXAgPSAwOwpAQCAtMTI3NywxNCArMTI3NywxNCBAQAogCQlydGxsaWJfc3RvcF9zY2FuX3N5bmNybyhpZWVlKTsKIAogCQlpZiAoaWVlZS0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkgewotCQkJU0VNX0RPV05fSUVFRV9XWCgmaWVlZS0+d3hfc2VtKTsKKwkJCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAkJCW5ldGRldl9pbmZvKGRldiwgImllZWUtPnN0YXRlIGlzIFJUTExJQl9MSU5LRURcbiIpOwogCQkJcnRsbGliX3N0b3Bfc2VuZF9iZWFjb25zKHByaXYtPnJ0bGxpYik7CiAJCQlkZWxfdGltZXJfc3luYygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKTsKIAkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSk7CiAJCQlydGxsaWJfc3RvcF9zY2FuKGllZWUpOwogCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKLQkJCVNFTV9VUF9JRUVFX1dYKCZpZWVlLT53eF9zZW0pOworCQkJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJCX0gZWxzZSB7CiAJCQluZXRkZXZfaW5mbyhkZXYsICJpZWVlLT5zdGF0ZSBpcyBOT1QgTElOS0VEXG4iKTsKIAkJCXJ0bGxpYl9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+cnRsbGliLCAwLCB0cnVlKTsKQEAgLTEyOTIsNyArMTI5Miw3IEBACiAKIAkJcnRsOTJlX2RtX2JhY2t1cF9zdGF0ZShkZXYpOwogCi0JCXVwKCZwcml2LT53eF9zZW0pOworCQltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwKIAkJCSAiJXMoKTo8PT09PT09PT09PWRvd24gcHJvY2VzcyBpcyBmaW5pc2hlZFxuIiwKIAkJCSBfX2Z1bmNfXyk7CkBAIC0xOTgyLDcgKzE5ODIsNyBAQAogCQkJCQl3ZWlnaHRpbmcpIC8gNjsKIH0KIAotdTggcnRsOTJlX3J4X2RiX3RvX3BlcmNlbnQoY2hhciBhbnRwb3dlcikKK3U4IHJ0bDkyZV9yeF9kYl90b19wZXJjZW50KHM4IGFudHBvd2VyKQogewogCWlmICgoYW50cG93ZXIgPD0gLTEwMCkgfHwgKGFudHBvd2VyID49IDIwKSkKIAkJcmV0dXJuCTA7CkBAIC0xOTkzLDkgKzE5OTMsOSBAQAogCiB9CS8qIFF1ZXJ5UnhQd3JQZXJjZW50YWdlICovCiAKLXU4IHJ0bDkyZV9ldm1fZGJfdG9fcGVyY2VudChjaGFyIHZhbHVlKQordTggcnRsOTJlX2V2bV9kYl90b19wZXJjZW50KHM4IHZhbHVlKQogewotCWNoYXIgcmV0X3ZhbDsKKwlzOCByZXRfdmFsOwogCiAJcmV0X3ZhbCA9IHZhbHVlOwogCkBAIC0yMTc5LDkgKzIxNzksOSBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAlpbnQgcmV0OwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0ID0gX3J0bDkyZV90cnlfdXAoZGV2KTsKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogCiB9CkBAIC0yMjA2LDExICsyMjA2LDExIEBACiAJCXJ0bGxpYl9zdG9wX3NjYW4ocHJpdi0+cnRsbGliKTsKIAl9CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IF9ydGw5MmVfZG93bihkZXYsIHRydWUpOwogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogCkBAIC0yMjQyLDExICsyMjQyLDExIEBACiAJCQkJICByZXNldF93cSk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPnJ0bGxpYi0+ZGV2OwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlydGw5MmVfY29tbWl0KGRldik7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIH0KIAogc3RhdGljIHZvaWQgX3J0bDkyZV9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yMjY1LDEyICsyMjY1LDEyIEBACiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IG1hYzsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJZXRoZXJfYWRkcl9jb3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEpOwogCiAJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd3EpOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMjg3LDcgKzIyODcsNyBAQAogCXN0cnVjdCBpd19wb2ludCAqcCA9ICZ3cnEtPnUuZGF0YTsKIAlzdHJ1Y3QgaWVlZV9wYXJhbSAqaXB3ID0gTlVMTDsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVDoKQEAgLTIzOTMsNyArMjM5Myw3IEBACiAJfQogCiBvdXQ6Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jb3JlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuaAppbmRleCBmNjI3ZmRjLi5iYWJjMGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuaApAQCAtMzc1LDggKzM3NSw4IEBACiAJc3RydWN0IHRhc2tsZXRfc3RydWN0CQlpcnFfdHhfdGFza2xldDsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJCWlycV9wcmVwYXJlX2JlYWNvbl90YXNrbGV0OwogCi0Jc3RydWN0IHNlbWFwaG9yZQkJCXd4X3NlbTsKLQlzdHJ1Y3Qgc2VtYXBob3JlCQkJcmZfc2VtOworCXN0cnVjdCBtdXRleAkJCQl3eF9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXgJCQkJcmZfbXV0ZXg7CiAJc3RydWN0IG11dGV4CQkJCW11dGV4OwogCiAJc3RydWN0IHJ0X3N0YXRzIHN0YXRzOwpAQCAtNTAzLDggKzUwMyw4IEBACiAJdTMyIFB3cl9UcmFjazsKIAl1OCBDQ0tQcmVzZW50QXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQ7CiAJdTggQ0NLUHJlc2VudEF0dGVudHVhdGlvbl80ME1kZWZhdWx0OwotCWNoYXIgQ0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOwotCWNoYXIgQ0NLUHJlc2VudEF0dGVudHVhdGlvbjsKKwlzOCBDQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7CisJczggQ0NLUHJlc2VudEF0dGVudHVhdGlvbjsKIAlsb25nIHVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI7CiAKIAl1MzIgTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbNl07CkBAIC02MDQsOCArNjA0LDggQEAKIGxvbmcgcnRsOTJlX3RyYW5zbGF0ZV90b19kYm0oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4IHNpZ25hbF9zdHJlbmd0aF9pbmRleCk7CiB2b2lkIHJ0bDkyZV91cGRhdGVfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKIAkJCQkgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcHByZXZpb3VzX3N0YXRzKTsKLXU4IHJ0bDkyZV9ldm1fZGJfdG9fcGVyY2VudChjaGFyIHZhbHVlKTsKLXU4IHJ0bDkyZV9yeF9kYl90b19wZXJjZW50KGNoYXIgYW50cG93ZXIpOwordTggcnRsOTJlX2V2bV9kYl90b19wZXJjZW50KHM4IHZhbHVlKTsKK3U4IHJ0bDkyZV9yeF9kYl90b19wZXJjZW50KHM4IGFudHBvd2VyKTsKIHZvaWQgcnRsOTJlX2NvcHlfbXBkdV9zdGF0cyhzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpwc3JjX3N0YXRzLAogCQkJICAgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnB0YXJnZXRfc3RhdHMpOwogYm9vbCBydGw5MmVfZW5hYmxlX25pYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcHMuYwppbmRleCA5OGU0ZDg4Li5hYTRiMDE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wcy5jCkBAIC0xNzksOSArMTc5LDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKIAotCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCXJ0bDkyZV9pcHNfbGVhdmUoZGV2KTsKLQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIH0KIAogdm9pZCBydGw5MmVfcnRsbGliX2lwc19sZWF2ZV93cShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjA5LDkgKzIwOSw5IEBACiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOwogCi0JZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiAJcnRsOTJlX2lwc19sZWF2ZShkZXYpOwotCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogfQogCiBzdGF0aWMgYm9vbCBfcnRsOTJlX3BzX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHJ0UHNNb2RlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF93eC5jCmluZGV4IDcwZGY2YTEuLjc0MTNhMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3d4LmMKQEAgLTY1LDExICs2NSwxMSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9zZXRfcmF0ZShwcml2LT5ydGxsaWIsIGluZm8sIHdycXUsIGV4dHJhKTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTg0LDExICs4NCwxMSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9zZXRfcnRzKHByaXYtPnJ0bGxpYiwgaW5mbywgd3JxdSwgZXh0cmEpOwogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTE0LDExICsxMTQsMTEgQEAKIAkJCSAgICBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9zZXRfcG93ZXIocHJpdi0+cnRsbGliLCBpbmZvLCB3cnF1LCBleHRyYSk7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNDIsMTEgKzE0MiwxMSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9zZXRfcmF3dHgocHJpdi0+cnRsbGliLCBpbmZvLCB3cnF1LCBleHRyYSk7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiByZXQ7CiAKQEAgLTE1OCwxMiArMTU4LDEyIEBACiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlSVF9UUkFDRShDT01QX0RCRywgIiVzKCk6IGZvcmNlIHJlc2V0ICEgZXh0cmEgaXMgJWRcbiIsCiAJCSBfX2Z1bmNfXywgKmV4dHJhKTsKIAlwcml2LT5mb3JjZV9yZXNldCA9ICpleHRyYTsKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gMDsKIAogfQpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCQkJCSgmKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbCkpOwogCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlSVF9UUkFDRShDT01QX1BPV0VSLCAiJXMoKTogJXNcbiIsIF9fZnVuY19fLCAoKmV4dHJhID09IDYpID8KIAkJICJEQyBwb3dlciIgOiAiQUMgcG93ZXIiKTsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQlpZWVlLT5wcyA9ICpleHRyYTsKIAl9CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA3LDEzICsyMDcsMTMgQEAKIAlzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqcFBTQyA9IChzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqKQogCQkJCQkoJihwcml2LT5ydGxsaWItPlBvd2VyU2F2ZUNvbnRyb2wpKTsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJbmV0ZGV2X2luZm8oZGV2LCAiJXMoKTogc2V0IGxwcyBhd2FrZSBpbnRlcnZhbCAhIGV4dHJhIGlzICVkXG4iLAogCQkgICAgX19mdW5jX18sICpleHRyYSk7CiAKIAlwUFNDLT5SZWdNYXhMUFNBd2FrZUludHZsID0gKmV4dHJhOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCkBAIC0yMjMsMTMgKzIyMywxMyBAQAogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJbmV0ZGV2X2luZm8oZGV2LAogCQkgICAgIiVzKCk6IGZvcmNlIExQUyAhIGV4dHJhIGlzICVkICgxIGlzIG9wZW4gMCBpcyBjbG9zZSlcbiIsCiAJCSAgICBfX2Z1bmNfXywgKmV4dHJhKTsKIAlwcml2LT5mb3JjZV9scHMgPSAqZXh0cmE7Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIDA7CiAKIH0KQEAgLTI2Niw3ICsyNjYsNyBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAJcnRTdGF0ZSA9IHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZTsKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAlpZiAod3JxdS0+bW9kZSA9PSBJV19NT0RFX0FESE9DIHx8IHdycXUtPm1vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8CiAJICAgIGllZWUtPmJOZXRQcm9taXNjdW91c01vZGUpIHsKIAkJaWYgKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbC5iSW5hY3RpdmVQcykgewpAQCAtMjc1LDIxICsyNzUsMjEgQEAKIAkJCQkgICAgUkZfQ0hBTkdFX0JZX0lQUykgewogCQkJCQluZXRkZXZfd2FybihkZXYsICIlcygpOiBSRiBpcyBPRkYuXG4iLAogCQkJCQkJICAgIF9fZnVuY19fKTsKLQkJCQkJdXAoJnByaXYtPnd4X3NlbSk7CisJCQkJCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCQkJCQlyZXR1cm4gLTE7CiAJCQkJfQogCQkJCW5ldGRldl9pbmZvKGRldiwKIAkJCQkJICAgICI9PT09PT09PT0+JXMoKTogcnRsOTJlX2lwc19sZWF2ZVxuIiwKIAkJCQkJICAgIF9fZnVuY19fKTsKLQkJCQlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJCW11dGV4X2xvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIAkJCQlydGw5MmVfaXBzX2xlYXZlKGRldik7Ci0JCQkJdXAoJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiAJCQl9CiAJCX0KIAl9CiAJcmV0ID0gcnRsbGliX3d4X3NldF9tb2RlKHByaXYtPnJ0bGxpYiwgYSwgd3JxdSwgYik7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJfQogCX0KIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcHJpdi0+cnRsbGliLT5GaXJzdEllX0luU2NhbiA9IHRydWU7CiAKQEAgLTQzNiwxNSArNDM2LDE1IEBACiAJCQkJICAgIFJGX0NIQU5HRV9CWV9JUFMpIHsKIAkJCQkJbmV0ZGV2X3dhcm4oZGV2LCAiJXMoKTogUkYgaXMgT0ZGLlxuIiwKIAkJCQkJCSAgICBfX2Z1bmNfXyk7Ci0JCQkJCXVwKCZwcml2LT53eF9zZW0pOworCQkJCQltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAkJCQkJcmV0dXJuIC0xOwogCQkJCX0KIAkJCQlSVF9UUkFDRShDT01QX1BTLAogCQkJCQkgIj09PT09PT09PT4lcygpOiBydGw5MmVfaXBzX2xlYXZlXG4iLAogCQkJCQkgX19mdW5jX18pOwotCQkJCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQkJbXV0ZXhfbG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCQkJCXJ0bDkyZV9pcHNfbGVhdmUoZGV2KTsKLQkJCQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwkJCQltdXRleF91bmxvY2soJnByaXYtPnJ0bGxpYi0+aXBzX211dGV4KTsKIAkJCX0KIAkJfQogCQlydGxsaWJfc3RvcF9zY2FuKHByaXYtPnJ0bGxpYik7CkBAIC00NzEsNyArNDcxLDcgQEAKIAkJcmV0ID0gcnRsbGliX3d4X3NldF9zY2FuKHByaXYtPnJ0bGxpYiwgYSwgd3JxdSwgYik7CiAJfQogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDkxLDExICs0OTEsMTEgQEAKIAkJcmV0dXJuIDA7CiAKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0ID0gcnRsbGliX3d4X2dldF9zY2FuKHByaXYtPnJ0bGxpYiwgYSwgd3JxdSwgYik7CiAKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01MTMsMTAgKzUxMywxMCBAQAogCQkJICAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldCA9IHJ0bGxpYl93eF9zZXRfZXNzaWQocHJpdi0+cnRsbGliLCBhLCB3cnF1LCBiKTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTUyOCwxMSArNTI4LDExIEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9nZXRfZXNzaWQocHJpdi0+cnRsbGliLCBhLCB3cnF1LCBiKTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU0NSwxMiArNTQ1LDEyIEBACiAKIAlpZiAod3JxdS0+ZGF0YS5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkKIAkJcmV0dXJuIC1FMkJJRzsKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAl3cnF1LT5kYXRhLmxlbmd0aCA9IG1pbl90KHNpemVfdCwgd3JxdS0+ZGF0YS5sZW5ndGgsCiAJCQkJICBzaXplb2YocHJpdi0+bmljaykpOwogCW1lbXNldChwcml2LT5uaWNrLCAwLCBzaXplb2YocHJpdi0+bmljaykpOwogCW1lbWNweShwcml2LT5uaWNrLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiAwOwogCiB9CkBAIC01NjEsMTEgKzU2MSwxMSBAQAogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKHByaXYtPm5pY2spOwogCW1lbWNweShleHRyYSwgcHJpdi0+bmljaywgd3JxdS0+ZGF0YS5sZW5ndGgpOwogCXdycXUtPmRhdGEuZmxhZ3MgPSAxOyAgIC8qIGFjdGl2ZSAqLwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCkBAIC01NzksMTEgKzU3OSwxMSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldCA9IHJ0bGxpYl93eF9zZXRfZnJlcShwcml2LT5ydGxsaWIsIGEsIHdycXUsIGIpOwogCi0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNjQ0LDExICs2NDQsMTEgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAlyZXQgPSBydGxsaWJfd3hfc2V0X3dhcChwcml2LT5ydGxsaWIsIGluZm8sIGF3cnEsIGV4dHJhKTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIApAQCAtNjk4LDE0ICs2OTgsMTQgQEAKIAkJcmV0dXJuIC1FTkVURE9XTjsKIAogCXByaXYtPnJ0bGxpYi0+d3hfc2V0X2VuYyA9IDE7Ci0JZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiAJcnRsOTJlX2lwc19sZWF2ZShkZXYpOwotCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOwotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJUlRfVFJBQ0UoQ09NUF9TRUMsICJTZXR0aW5nIFNXIHdlcCBrZXkiKTsKIAlyZXQgPSBydGxsaWJfd3hfc2V0X2VuY29kZShwcml2LT5ydGxsaWIsIGluZm8sIHdycXUsIGtleSk7Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAKIAogCWlmICh3cnF1LT5lbmNvZGluZy5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgewpAQCAtNzk5LDcgKzc5OSw3IEBACiAJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTElGRVRJTUUgfHwKIAkgICAgd3JxdS0+cmV0cnkuZGlzYWJsZWQpIHsKQEAgLTgyMiw3ICs4MjIsNyBAQAogCiAJcnRsOTJlX2NvbW1pdChkZXYpOwogZXhpdDoKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC04NzUsNyArODc1LDcgQEAKIAlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJaWYgKHByaXYtPnJmX3NldF9zZW5zID09IE5VTEwpIHsKIAkJZXJyID0gLTE7IC8qIHdlIGhhdmUgbm90IHRoaXMgc3VwcG9ydCBmb3IgdGhpcyByYWRpbyAqLwogCQlnb3RvIGV4aXQ7CkBAIC04ODYsNyArODg2LDcgQEAKIAkJZXJyID0gLUVJTlZBTDsKIAogZXhpdDoKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC05MDIsMTIgKzkwMiwxMiBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAogCXByaXYtPnJ0bGxpYi0+d3hfc2V0X2VuYyA9IDE7Ci0JZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwltdXRleF9sb2NrKCZwcml2LT5ydGxsaWItPmlwc19tdXRleCk7CiAJcnRsOTJlX2lwc19sZWF2ZShkZXYpOwotCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+cnRsbGliLT5pcHNfbXV0ZXgpOwogCiAJcmV0ID0gcnRsbGliX3d4X3NldF9lbmNvZGVfZXh0KGllZWUsIGluZm8sIHdycXUsIGV4dHJhKTsKIAl7CkBAIC05NjksNyArOTY5LDcgQEAKIAogZW5kX2h3X3NlYzoKIAlwcml2LT5ydGxsaWItPnd4X3NldF9lbmMgPSAwOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiByZXQ7CiAKIH0KQEAgLTk4NSw5ICs5ODUsOSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXQgPSBydGxsaWJfd3hfc2V0X2F1dGgocHJpdi0+cnRsbGliLCBpbmZvLCAmKGRhdGEtPnBhcmFtKSwgZXh0cmEpOwotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwMDMsOSArMTAwMyw5IEBACiAJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCXJldCA9IHJ0bGxpYl93eF9zZXRfbWxtZShwcml2LT5ydGxsaWIsIGluZm8sIHdycXUsIGV4dHJhKTsKLQl1cCgmcHJpdi0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMDIwLDkgKzEwMjAsOSBAQAogCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlkb3duKCZwcml2LT53eF9zZW0pOworCW11dGV4X2xvY2soJnByaXYtPnd4X211dGV4KTsKIAlyZXQgPSBydGxsaWJfd3hfc2V0X2dlbl9pZShwcml2LT5ydGxsaWIsIGV4dHJhLCBkYXRhLT5kYXRhLmxlbmd0aCk7Ci0JdXAoJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTA5NywxNCArMTA5NywxNCBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IHByaXYtPnJ0bGxpYjsKIAotCWRvd24oJnByaXYtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJc25wcmludGYoZXh0cmEsIDQ1LCAiUHJvbWlzY3VvdXNNb2RlOiVkLCBGaWx0ZXJTcmNTVEFGcmFtZTolZCIsCiAJCSBpZWVlLT5JbnRlbFByb21pc2N1b3VzTW9kZUluZm8uYlByb21pc2N1b3VzT24sCiAJCSBpZWVlLT5JbnRlbFByb21pc2N1b3VzTW9kZUluZm8uYkZpbHRlclNvdXJjZVN0YXRpb25GcmFtZSk7CiAJd3JxdS0+ZGF0YS5sZW5ndGggPSBzdHJsZW4oZXh0cmEpICsgMTsKIAotCXVwKCZwcml2LT53eF9zZW0pOworCW11dGV4X3VubG9jaygmcHJpdi0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9Rb3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1Fvcy5oCmluZGV4IDQ2MzEyMmQuLjYxZGE4ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1Fvcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1Fvcy5oCkBAIC0xNjksOSArMTY5LDYgQEAKIAl9IFRZUEUyXzgwMjFROwogfTsKIAotI2RlZmluZSBJc0FDVmFsaWQoYWMpCQkoKGFjID49IDAgJiYgYWMgPD0gNykgPyB0cnVlIDogZmFsc2UpCi0KLQogdW5pb24gYWNpX2FpZnNuIHsKIAl1OAljaGFyRGF0YTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfVFNQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9UU1Byb2MuYwppbmRleCAyYzhhNTI2Li5hOTY2YThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9UU1Byb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9UU1Byb2MuYwpAQCAtMzA2LDYgKzMwNiwxMSBAQAogCXBUc0NvbW1vbkluZm8tPlRDbGFzTnVtID0gVENMQVNfTnVtOwogfQogCitzdGF0aWMgYm9vbCBJc0FDVmFsaWQodW5zaWduZWQgaW50IHRpZCkKK3sKKwlyZXR1cm4gdGlkIDwgNzsKK30KKwogYm9vbCBHZXRUcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHRzX2NvbW1vbl9pbmZvICoqcHBUUywKIAkgICB1OCAqQWRkciwgdTggVElELCBlbnVtIHRyX3NlbGVjdCBUeFJ4U2VsZWN0LCBib29sIGJBZGROZXdUcykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWIuaAppbmRleCA3NzZlMTc5Li5iODk1YTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYi5oCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgpAQCAtNTIxLDcgKzUyMSw3IEBACiB9OwogCiAjaWZuZGVmIEVUSF9QX1BBRQotI2RlZmluZSBFVEhfUF9QQUUgMHg4ODhFIC8qIFBvcnQgQWNjZXNzIEVudGl0eSAoSUVFRSA4MDIuMVgpICovCisjZGVmaW5lIEVUSF9QX1BBRQkweDg4OEUJCS8qIFBvcnQgQWNjZXNzIEVudGl0eSAoSUVFRSA4MDIuMVgpICovCiAjZGVmaW5lIEVUSF9QX0lQCTB4MDgwMAkJLyogSW50ZXJuZXQgUHJvdG9jb2wgcGFja2V0CSovCiAjZGVmaW5lIEVUSF9QX0FSUAkweDA4MDYJCS8qIEFkZHJlc3MgUmVzb2x1dGlvbiBwYWNrZXQJKi8KICNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KQEAgLTE2NTEsOSArMTY1MSw5IEBACiAJc2hvcnQgcHJvdG9fc3RhcnRlZDsKIAlzaG9ydCBwcm90b19zdG9wcHBpbmc7CiAKLQlzdHJ1Y3Qgc2VtYXBob3JlIHd4X3NlbTsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHNjYW5fc2VtOwotCXN0cnVjdCBzZW1hcGhvcmUgaXBzX3NlbTsKKwlzdHJ1Y3QgbXV0ZXggd3hfbXV0ZXg7CisJc3RydWN0IG11dGV4IHNjYW5fbXV0ZXg7CisJc3RydWN0IG11dGV4IGlwc19tdXRleDsKIAogCXNwaW5sb2NrX3QgbWdtdF90eF9sb2NrOwogCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7CkBAIC0yMjEyLDcgKzIyMTIsNSBAQAogdm9pZCBIVFVzZURlZmF1bHRTZXR0aW5nKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKICNkZWZpbmUgUlRfQVNPQ19SRVRSWV9MSU1JVAk1CiB1OCBNZ250UXVlcnlfVHhSYXRlRXhjbHVkZUNDS1JhdGVzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKLSNkZWZpbmUgU0VNX0RPV05fSUVFRV9XWChwc2VtKSBkb3duKHBzZW0pCi0jZGVmaW5lIFNFTV9VUF9JRUVFX1dYKHBzZW0pIHVwKHBzZW0pCiAKICNlbmRpZiAvKiBSVExMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfbW9kdWxlLmMKaW5kZXggZjRmMzE4YS4uOWQ1Nzg4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9tb2R1bGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX21vZHVsZS5jCkBAIC0xMzgsNyArMTM4LDcgQEAKIAlydGxsaWJfc29mdG1hY19pbml0KGllZWUpOwogCiAJaWVlZS0+cEhUSW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9oaV90aHJvdWdocHV0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGllZWUtPnBIVEluZm8gPT0gTlVMTCkKKwlpZiAoIWllZWUtPnBIVEluZm8pCiAJCXJldHVybiBOVUxMOwogCiAJSFRVcGRhdGVEZWZhdWx0U2V0dGluZyhpZWVlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjLmMKaW5kZXggNjIxNTRlMy4uZGE3NGRjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjLmMKQEAgLTI3Niw4ICsyNzYsOSBAQAogCX0KIH0KIAotaW5saW5lIHZvaWQgc29mdG1hY19wc19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCitzdGF0aWMgaW5saW5lIHZvaWQKK3NvZnRtYWNfcHNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCiB7CiAJc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CiAJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgICpoZWFkZXIgPQpAQCAtNTEzLDcgKzUxNCw3IEBACiAKIAlpZWVlLT5iZV9zY2FuX2lucHJvZ3Jlc3MgPSB0cnVlOwogCi0JZG93bigmaWVlZS0+c2Nhbl9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnNjYW5fbXV0ZXgpOwogCiAJd2hpbGUgKDEpIHsKIAkJZG8gewpAQCAtNTY2LDcgKzU2Nyw3IEBACiAJCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpKQogCQkJRE9UMTFEX1NjYW5Db21wbGV0ZShpZWVlKTsKIAl9Ci0JdXAoJmllZWUtPnNjYW5fc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnNjYW5fbXV0ZXgpOwogCiAJaWVlZS0+YmVfc2Nhbl9pbnByb2dyZXNzID0gZmFsc2U7CiAKQEAgLTU4Nyw3ICs1ODgsNyBAQAogCWlmIChydGxsaWJfYWN0X3NjYW5uaW5nKGllZWUsIHRydWUpKQogCQlyZXR1cm47CiAKLQlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+c2Nhbl9tdXRleCk7CiAKIAlpZiAoaWVlZS0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPZmYpIHsKIAkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LApAQCAtNjE4LDcgKzYxOSw3IEBACiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsCiAJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFJUTExJQl9TT0ZUTUFDX1NDQU5fVElNRSkpOwogCi0JdXAoJmllZWUtPnNjYW5fc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnNjYW5fbXV0ZXgpOwogCXJldHVybjsKIAogb3V0OgpAQCAtNjMwLDcgKzYzMSw3IEBACiAJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKIAlpZWVlLT5zY2FuX3dhdGNoX2RvZyA9IDA7CiAJaWVlZS0+c2Nhbm5pbmdfY29udGludWUgPSAwOwotCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT5zY2FuX211dGV4KTsKIH0KIAogCkBAIC02ODMsNyArNjg0LDcgQEAKIAogc3RhdGljIHZvaWQgcnRsbGliX3NvZnRtYWNfc3RvcF9zY2FuKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewotCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT5zY2FuX211dGV4KTsKIAlpZWVlLT5zY2FuX3dhdGNoX2RvZyA9IDA7CiAJaWYgKGllZWUtPnNjYW5uaW5nX2NvbnRpbnVlID09IDEpIHsKIAkJaWVlZS0+c2Nhbm5pbmdfY29udGludWUgPSAwOwpAQCAtNjkyLDcgKzY5Myw3IEBACiAJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaWVlZS0+c29mdG1hY19zY2FuX3dxKTsKIAl9CiAKLQl1cCgmaWVlZS0+c2Nhbl9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+c2Nhbl9tdXRleCk7CiB9CiAKIHZvaWQgcnRsbGliX3N0b3Bfc2NhbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKQEAgLTc1Myw3ICs3NTQsNyBAQAogCX0KIH0KIAotLyogY2FsbGVkIHdpdGggd3hfc2VtIGhlbGQgKi8KKy8qIGNhbGxlZCB3aXRoIHd4X211dGV4IGhlbGQgKi8KIHZvaWQgcnRsbGliX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBpc19tZXNoKQogewogCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpKSB7CkBAIC03NzAsOCArNzcxLDEwIEBACiB9CiBFWFBPUlRfU1lNQk9MKHJ0bGxpYl9zdGFydF9zY2FuX3N5bmNybyk7CiAKLWlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqcnRsbGliX2F1dGhlbnRpY2F0aW9uX3JlcShzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiwKLQlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgaW50IGNoYWxsZW5nZWxlbiwgdTggKmRhZGRyKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCitydGxsaWJfYXV0aGVudGljYXRpb25fcmVxKHN0cnVjdCBydGxsaWJfbmV0d29yayAqYmVhY29uLAorCQkJICBzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgaW50IGNoYWxsZW5nZWxlbiwgdTggKmRhZGRyKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHJ0bGxpYl9hdXRoZW50aWNhdGlvbiAqYXV0aDsKQEAgLTExMzAsNyArMTEzMyw3IEBACiB9CiAKIAotaW5saW5lIGludCBTZWNJc0luUE1LSURMaXN0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqYnNzaWQpCitzdGF0aWMgaW5saW5lIGludCBTZWNJc0luUE1LSURMaXN0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqYnNzaWQpCiB7CiAJaW50IGkgPSAwOwogCkBAIC0xMTQ2LDggKzExNDksOSBAQAogCXJldHVybiBpOwogfQogCi1pbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9hc3NvY2lhdGlvbl9yZXEoc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpiZWFjb24sCi0JCQkJCSAgICAgIHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCitydGxsaWJfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBydGxsaWJfbmV0d29yayAqYmVhY29uLAorCQkgICAgICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgcnRsbGliX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmhkcjsKQEAgLTE1OTAsNyArMTU5NCw3IEBACiAJcnRsbGliX3N0b3Bfc2Nhbl9zeW5jcm8oaWVlZSk7CiAJaWYgKGllZWUtPnJ0bGxpYl9pcHNfbGVhdmUgIT0gTlVMTCkKIAkJaWVlZS0+cnRsbGliX2lwc19sZWF2ZShpZWVlLT5kZXYpOwotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQogCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlLT5kZXYpOwpAQCAtMTYwNSwxNCArMTYwOSwxNCBAQAogCQkJIF9fZnVuY19fKTsKIAkJaWYgKGllZWUtPnJ0bGxpYl9pcHNfbGVhdmVfd3EgIT0gTlVMTCkKIAkJCWllZWUtPnJ0bGxpYl9pcHNfbGVhdmVfd3EoaWVlZS0+ZGV2KTsKLQkJdXAoJmllZWUtPnd4X3NlbSk7CisJCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCQlyZXR1cm47CiAJfQogCWllZWUtPmFzc29jaWF0ZV9zZXEgPSAxOwogCiAJcnRsbGliX2Fzc29jaWF0ZV9zdGVwMShpZWVlLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQpOwogCi0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiB9CiAKIGlubGluZSB2b2lkIHJ0bGxpYl9zb2Z0bWFjX25ld19uZXQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCkBAIC0yMjA5LDggKzIyMTMsOSBAQAogCX0KIH0KIAotaW5saW5lIGludCBydGxsaWJfcnhfYXNzb2NfcmVzcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKK3N0YXRpYyBpbmxpbmUgaW50CitydGxsaWJfcnhfYXNzb2NfcmVzcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKIHsKIAl1MTYgZXJyY29kZTsKIAlpbnQgYWlkOwpAQCAtMjM0NCw4ICsyMzQ5LDkgQEAKIAl9CiB9CiAKLWlubGluZSBpbnQgcnRsbGliX3J4X2F1dGgoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnJ4X3N0YXRzKQorc3RhdGljIGlubGluZSBpbnQKK3J0bGxpYl9yeF9hdXRoKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKIHsKIAogCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgewpAQCAtMjM2MSw3ICsyMzY3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW5saW5lIGludCBydGxsaWJfcnhfZGVhdXRoKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSBpbnQKK3J0bGxpYl9yeF9kZWF1dGgoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKmhlYWRlciA9IChzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7CiAJdTE2IGZyYW1lX2N0bDsKQEAgLTI1ODIsMTYgKzI1ODksMTYgQEAKIAkJCQkgICAgIHN0cnVjdCBydGxsaWJfZGV2aWNlLCBzdGFydF9pYnNzX3dxKTsKIAkvKiBpd2NvbmZpZyBtb2RlIGFkLWhvYyB3aWxsIHNjaGVkdWxlIHRoaXMgYW5kIHJldHVybgogCSAqIG9uIHRoZSBvdGhlciBoYW5kIHRoaXMgd2lsbCBibG9jayBmdXJ0aGVyIGl3Y29uZmlnIFNFVAotCSAqIG9wZXJhdGlvbnMgYmVjYXVzZSBvZiB0aGUgd3hfc2VtIGhvbGQuCisJICogb3BlcmF0aW9ucyBiZWNhdXNlIG9mIHRoZSB3eF9tdXRleCBob2xkLgogCSAqIEFueXdheSBzb21lIG1vc3Qgc2V0IG9wZXJhdGlvbnMgc2V0IGEgZmxhZyB0byBzcGVlZC11cAogCSAqIChhYm9ydCkgdGhpcyB3cSAod2hlbiBzeW5jcm8gc2Nhbm5pbmcpIGJlZm9yZSBzbGVlcGluZwotCSAqIG9uIHRoZSBzZW1hcGhvcmUKKwkgKiBvbiB0aGUgbXV0ZXgKIAkgKi8KIAlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpIHsKIAkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiPT09PT09PT09PW9oIGRyaXZlciBkb3duIHJldHVyblxuIik7CiAJCXJldHVybjsKIAl9Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApIHsKIAkJc3RyY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBSVExMSUJfREVGQVVMVF9UWF9FU1NJRCk7CkBAIC0yNzAzLDcgKzI3MTAsNyBAQAogCiAJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOwogCi0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiB9CiAKIGlubGluZSB2b2lkIHJ0bGxpYl9zdGFydF9pYnNzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQpAQCAtMjcxMSw3ICsyNzE4LDcgQEAKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmllZWUtPnN0YXJ0X2lic3Nfd3EsIG1zZWNzX3RvX2ppZmZpZXMoMTUwKSk7CiB9CiAKLS8qIHRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdXNlciBjb250ZXh0LCB3aXRoIHd4X3NlbSBoZWxkICovCisvKiB0aGlzIGlzIGNhbGxlZCBvbmx5IGluIHVzZXIgY29udGV4dCwgd2l0aCB3eF9tdXRleCBoZWxkICovCiBzdGF0aWMgdm9pZCBydGxsaWJfc3RhcnRfYnNzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNzczLDcgKzI3ODAsNyBAQAogCQkJCSAgICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UsIGFzc29jaWF0ZV9yZXRyeV93cSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCkKIAkJZ290byBleGl0OwogCkBAIC0yODA2LDcgKzI4MTMsNyBAQAogCiAJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CiBleGl0OgotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogfQogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9nZXRfYmVhY29uXyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKQEAgLTI4NTMsOSArMjg2MCw5IEBACiAJCQkJICB1OCBzaHV0ZG93bikKIHsKIAlydGxsaWJfc3RvcF9zY2FuX3N5bmNybyhpZWVlKTsKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAlydGxsaWJfc3RvcF9wcm90b2NvbChpZWVlLCBzaHV0ZG93bik7Ci0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MKHJ0bGxpYl9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wpOwogCkBAIC0yOTAyLDkgKzI5MDksOSBAQAogCiB2b2lkIHJ0bGxpYl9zb2Z0bWFjX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBtZXNoX2ZsYWcpCiB7Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcnRsbGliX3N0YXJ0X3Byb3RvY29sKGllZWUpOwotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTChydGxsaWJfc29mdG1hY19zdGFydF9wcm90b2NvbCk7CiAKQEAgLTMwMzQsOSArMzA0MSw5IEBACiAJSU5JVF9XT1JLX1JTTCgmaWVlZS0+d3hfc3luY19zY2FuX3dxLCAodm9pZCAqKXJ0bGxpYl93eF9zeW5jX3NjYW5fd3EsCiAJCSAgICAgIGllZWUpOwogCi0Jc2VtYV9pbml0KCZpZWVlLT53eF9zZW0sIDEpOwotCXNlbWFfaW5pdCgmaWVlZS0+c2Nhbl9zZW0sIDEpOwotCXNlbWFfaW5pdCgmaWVlZS0+aXBzX3NlbSwgMSk7CisJbXV0ZXhfaW5pdCgmaWVlZS0+d3hfbXV0ZXgpOworCW11dGV4X2luaXQoJmllZWUtPnNjYW5fbXV0ZXgpOworCW11dGV4X2luaXQoJmllZWUtPmlwc19tdXRleCk7CiAKIAlzcGluX2xvY2tfaW5pdCgmaWVlZS0+bWdtdF90eF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmaWVlZS0+YmVhY29uX2xvY2spOwpAQCAtMzA0OSw3ICszMDU2LDcgQEAKIAogdm9pZCBydGxsaWJfc29mdG1hY19mcmVlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCWtmcmVlKGllZWUtPnBEb3QxMWRJbmZvKTsKIAlpZWVlLT5wRG90MTFkSW5mbyA9IE5VTEw7CiAJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CkBAIC0zMDY0LDcgKzMwNzEsNyBAQAogCWNhbmNlbF93b3JrX3N5bmMoJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CiAJY2FuY2VsX3dvcmtfc3luYygmaWVlZS0+aXBzX2xlYXZlX3dxKTsKIAljYW5jZWxfd29ya19zeW5jKCZpZWVlLT53eF9zeW5jX3NjYW5fd3EpOwotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCXRhc2tsZXRfa2lsbCgmaWVlZS0+cHNfdGFzayk7CiB9CiAKQEAgLTMzOTcsOCArMzQwNCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW5saW5lIHN0cnVjdCBza19idWZmICpydGxsaWJfZGlzYXV0aF9za2Ioc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpiZWFjb24sCi0JCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1MTYgYXNSc24pCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKK3J0bGxpYl9kaXNhdXRoX3NrYihzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiwKKwkJICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHUxNiBhc1JzbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBydGxsaWJfZGlzYXV0aCAqZGlzYXV0aDsKQEAgLTM0MjMsOCArMzQzMSw5IEBACiAJcmV0dXJuIHNrYjsKIH0KIAotaW5saW5lIHN0cnVjdCBza19idWZmICpydGxsaWJfZGlzYXNzb2NpYXRlX3NrYihzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiwKLQkJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHUxNiBhc1JzbikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgorcnRsbGliX2Rpc2Fzc29jaWF0ZV9za2Ioc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpiZWFjb24sCisJCQlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTE2IGFzUnNuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHJ0bGxpYl9kaXNhc3NvYyAqZGlzYXNzOwpAQCAtMzQ5OSw3ICszNTA4LDcgQEAKIAlzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW07CiAJaW50IHJldCA9IDA7CiAKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAogCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKSB7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC0zNTQzLDcgKzM1NTIsNyBAQAogCiAJa2ZyZWUocGFyYW0pOwogb3V0OgotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hY193eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjX3d4LmMKaW5kZXggNjFlZDhiMC4uNWYxNDEyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjX3d4LmMKQEAgLTM1LDcgKzM1LDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBpd19mcmVxICpmd3JxID0gJndycXUtPmZyZXE7CiAKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAogCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKIAkJcmV0ID0gMDsKQEAgLTgxLDcgKzgxLDcgQEAKIAogCXJldCA9IDA7CiBvdXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wocnRsbGliX3d4X3NldF9mcmVxKTsKQEAgLTE0Niw3ICsxNDYsNyBAQAogCiAJcnRsbGliX3N0b3Bfc2Nhbl9zeW5jcm8oaWVlZSk7CiAKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAkvKiB1c2UgaWZjb25maWcgaHcgZXRoZXIgKi8KIAlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgewogCQlyZXQgPSAtMTsKQEAgLTE4NSw3ICsxODUsNyBAQAogCWlmIChpZnVwKQogCQlydGxsaWJfc3RhcnRfcHJvdG9jb2woaWVlZSk7CiBvdXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wocnRsbGliX3d4X3NldF93YXApOwpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJaW50IHNldF9tb2RlX3N0YXR1cyA9IDA7CiAKIAlydGxsaWJfc3RvcF9zY2FuX3N5bmNybyhpZWVlKTsKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAlzd2l0Y2ggKHdycXUtPm1vZGUpIHsKIAljYXNlIElXX01PREVfTU9OSVRPUjoKIAljYXNlIElXX01PREVfQURIT0M6CkBAIC0zMjIsNyArMzIyLDcgQEAKIAl9CiAKIG91dDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAlyZXR1cm4gc2V0X21vZGVfc3RhdHVzOwogfQogRVhQT1JUX1NZTUJPTChydGxsaWJfd3hfc2V0X21vZGUpOwpAQCAtNDEyLDcgKzQxMiw3IEBACiAJcnRsbGliX3dha2VfYWxsX3F1ZXVlcyhpZWVlKTsKIAogb3V0OgotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiB9CiAKQEAgLTQyMSw3ICs0MjEsNyBAQAogewogCWludCByZXQgPSAwOwogCi0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgIShpZWVlLT5wcm90b19zdGFydGVkKSkgewogCQlyZXQgPSAtMTsKQEAgLTQzNSw3ICs0MzUsNyBAQAogCX0KIAogb3V0OgotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHJ0bGxpYl93eF9zZXRfc2Nhbik7CkBAIC00NTAsNyArNDUwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcnRsbGliX3N0b3Bfc2Nhbl9zeW5jcm8oaWVlZSk7Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlwcm90b19zdGFydGVkID0gaWVlZS0+cHJvdG9fc3RhcnRlZDsKIApAQCAtNDkyLDcgKzQ5Miw3IEBACiAJaWYgKHByb3RvX3N0YXJ0ZWQpCiAJCXJ0bGxpYl9zdGFydF9wcm90b2NvbChpZWVlKTsKIG91dDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChydGxsaWJfd3hfc2V0X2Vzc2lkKTsKQEAgLTUxNCw3ICs1MTQsNyBAQAogCWludCBlbmFibGUgPSAocGFybXNbMF0gPiAwKTsKIAlzaG9ydCBwcmV2ID0gaWVlZS0+cmF3X3R4OwogCi0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlpZiAoZW5hYmxlKQogCQlpZWVlLT5yYXdfdHggPSAxOwpAQCAtNTM2LDcgKzUzNiw3IEBACiAJCQluZXRpZl9jYXJyaWVyX29mZihpZWVlLT5kZXYpOwogCX0KIAotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NzUsNyArNTc1LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWRvd24oJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfbG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkKSB7CiAJCVJUX1RSQUNFKENPTVBfREJHLCAiPT09PiVzKCk6IHBvd2VyIGRpc2FibGVcbiIsIF9fZnVuY19fKTsKQEAgLTYxMSw3ICs2MTEsNyBAQAogCiAJfQogZXhpdDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKKwltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAlyZXR1cm4gcmV0OwogCiB9CkBAIC02MjIsNyArNjIyLDcgQEAKIAkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAKIAlpZiAoaWVlZS0+cHMgPT0gUlRMTElCX1BTX0RJU0FCTEVEKSB7CiAJCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMTsKQEAgLTY0OCw3ICs2NDgsNyBAQAogCQl3cnF1LT5wb3dlci5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7CiAKIGV4aXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJcmV0dXJuIDA7CiAKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYwppbmRleCA1OGZjNzBlLi43OGEzYWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl90eC5jCkBAIC0xLDMxICsxLDMxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICBtb3JlIGRldGFpbHMuCi0KLSAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0KLSAgQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAgSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgotICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIEZldyBtb2RpZmljYXRpb25zIGZvciBSZWFsdGVrJ3MgV2ktRmkgZHJpdmVycyBieQotICBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgotCi0gIEEgc3BlY2lhbCB0aGFua3MgZ29lcyB0byBSZWFsdGVrIGZvciB0aGVpciBzdXBwb3J0ICEKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoKKyAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRmV3IG1vZGlmaWNhdGlvbnMgZm9yIFJlYWx0ZWsncyBXaS1GaSBkcml2ZXJzIGJ5CisgKiBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgorICoKKyAqIEEgc3BlY2lhbCB0aGFua3MgZ29lcyB0byBSZWFsdGVrIGZvciB0aGVpciBzdXBwb3J0ICEKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC03MzEsMTcgKzczMSwxOSBAQAogCQlpZiAocW9zX2FjdGl2ZWQpIHsKIAkJCWhkcl9sZW4gPSBSVExMSUJfM0FERFJfTEVOICsgMjsKIAotCQkvKiBpbiBjYXNlIHdlIGFyZSBhIGNsaWVudCB2ZXJpZnkgYWNtIGlzIG5vdCBzZXQgZm9yIHRoaXMgYWMgKi8KLQkJd2hpbGUgKHVubGlrZWx5KGllZWUtPndtbV9hY20gJiAoMHgwMSA8PCBza2ItPnByaW9yaXR5KSkpIHsKLQkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgInNrYi0+cHJpb3JpdHkgPSAleFxuIiwKLQkJCQkgICAgc2tiLT5wcmlvcml0eSk7Ci0JCQlpZiAod21lX2Rvd25ncmFkZV9hYyhza2IpKQotCQkJCWJyZWFrOwotCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiY29udmVydGVkIHNrYi0+cHJpb3JpdHkgPSAleFxuIiwKLQkJCSAgICAgICBza2ItPnByaW9yaXR5KTsKLQkJIH0KKwkJCS8qIGluIGNhc2Ugd2UgYXJlIGEgY2xpZW50IHZlcmlmeSBhY20gaXMgbm90IHNldCBmb3IgdGhpcyBhYyAqLworCQkJd2hpbGUgKHVubGlrZWx5KGllZWUtPndtbV9hY20gJiAoMHgwMSA8PCBza2ItPnByaW9yaXR5KSkpIHsKKwkJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJza2ItPnByaW9yaXR5ID0gJXhcbiIsCisJCQkJCQlza2ItPnByaW9yaXR5KTsKKwkJCQlpZiAod21lX2Rvd25ncmFkZV9hYyhza2IpKQorCQkJCQlicmVhazsKKwkJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJjb252ZXJ0ZWQgc2tiLT5wcmlvcml0eSA9ICV4XG4iLAorCQkJCQkgICBza2ItPnByaW9yaXR5KTsKKwkJCX0KKwogCQkJcW9zX2N0bCB8PSBza2ItPnByaW9yaXR5OwogCQkJaGVhZGVyLnFvc19jdGwgPSBjcHVfdG9fbGUxNihxb3NfY3RsICYgUlRMTElCX1FPU19USUQpOworCiAJCX0gZWxzZSB7CiAJCQloZHJfbGVuID0gUlRMTElCXzNBRERSX0xFTjsKIAkJfQpAQCAtOTgxLDYgKzk4Myw3IEBACiAJcmV0dXJuIDE7CiAKIH0KKwogaW50IHJ0bGxpYl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihza2ItPmNiKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3d4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3d4LmMKaW5kZXggODRlNjI3Mi4uYjE1MDBlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl93eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfd3guYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJaW50IGVyciA9IDA7CiAKIAluZXRkZXZfZGJnKGllZWUtPmRldiwgIkdldHRpbmcgc2NhblxuIik7Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKKwltdXRleF9sb2NrKCZpZWVlLT53eF9tdXRleCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobmV0d29yaywgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgewpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCXdycXUtPmRhdGEubGVuZ3RoID0gZXYgLSAgZXh0cmE7CiAJd3JxdS0+ZGF0YS5mbGFncyA9IDA7CiAKQEAgLTY4OSw3ICs2ODksNyBAQAogCWlmIChpZWVlLT5zdGF0ZSAhPSBSVExMSUJfTElOS0VEKQogCQlyZXR1cm4gLUVOT0xJTks7CiAKLQlkb3duKCZpZWVlLT53eF9zZW0pOworCW11dGV4X2xvY2soJmllZWUtPnd4X211dGV4KTsKIAogCXN3aXRjaCAobWxtZS0+Y21kKSB7CiAJY2FzZSBJV19NTE1FX0RFQVVUSDoKQEAgLTcxNiwxMSArNzE2LDExIEBACiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXVwKCZpZWVlLT53eF9zZW0pOworCQltdXRleF91bmxvY2soJmllZWUtPnd4X211dGV4KTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCXVwKCZpZWVlLT53eF9zZW0pOworCW11dGV4X3VubG9jaygmaWVlZS0+d3hfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZQppbmRleCBiNWQwYzJlLi45ZTNmNDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvTWFrZWZpbGUKQEAgLTEsNyArMSw2IEBACiBOSUNfU0VMRUNUID0gUlRMODE5MlUKIAotY2NmbGFncy15IDo9IC1JJChUT1BESVIpL2RyaXZlcnMvbmV0L3dpcmVsZXNzCi1jY2ZsYWdzLXkgKz0gLU8yCitjY2ZsYWdzLXkgOj0gLU8yCiBjY2ZsYWdzLXkgKz0gLURKQUNLU09OX05FV184MTg3IC1ESkFDS1NPTl9ORVdfUlgKIAogaWVlZTgwMjExLXJzbC1vYmpzIDo9IGllZWU4MDIxMV9yeC5vIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCmluZGV4IDA5ZTk0OTkuLjA3N2VhMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtNzQ2LDcgKzc0Niw3IEBACiAJYm9vbAkJICBiaXNyeGFnZ3JzdWJmcmFtZTsKIAlib29sCQkgIGJQYWNrZXRCZWFjb247CS8vY29zYSBhZGQgZm9yIHJzc2kKIAlib29sCQkgIGJUb1NlbGZCQTsJCS8vY29zYSBhZGQgZm9yIHJzc2kKLQljaGFyCSAgY2NrX2FkY19wd2RiWzRdOwkvL2Nvc2EgYWRkIGZvciByeCBwYXRoIHNlbGVjdGlvbgorCXM4CQkgIGNja19hZGNfcHdkYls0XTsJLy9jb3NhIGFkZCBmb3IgcnggcGF0aCBzZWxlY3Rpb24KIAl1MTYJCSAgU2VxX051bTsKIAogfTsKQEAgLTE4MTQsNyArMTgxNCw3IEBACiAJdTMyIHdwYXhfdHlwZV9ub3RpZnk7IC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjZ9CiAKIAkvKiBRb1MgcmVsYXRlZCBmbGFnICovCi0JY2hhciBpbml0X3dtbXBhcmFtX2ZsYWc7CisJczggIGluaXRfd21tcGFyYW1fZmxhZzsKIAkvKiBzZXQgb24gaW5pdGlhbGl6YXRpb24gKi8KIAl1OCAgcW9zX3N1cHBvcnQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IDA1MWMyYmUuLjg5Y2JjMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMTAyNyw3ICsxMDI3LDcgQEAKIAkJCQlpZWVlLAogCQkJCShQVFNfQ09NTU9OX0lORk8gKikgJnBSeFRTLAogCQkJCWhkci0+YWRkcjIsCi0JCQkJKHU4KUZyYW1lX1FvU1RJRCgodTggKikoc2tiLT5kYXRhKSksCisJCQkJRnJhbWVfUW9TVElEKCh1OCAqKShza2ItPmRhdGEpKSwKIAkJCQlSWF9ESVIsCiAJCQkJdHJ1ZSkpCiAJCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwppbmRleCA0OWRiMWI3Li5kN2Q4NWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCkBAIC0yODQsNyArMjg0LDggQEAKIAl9CiB9CiAKLWlubGluZSB2b2lkIHNvZnRtYWNfcHNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIGlubGluZSB2b2lkCitzb2Z0bWFjX3BzX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAogCXNob3J0IHNpbmdsZSA9IGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFOwpAQCAtMzIwLDcgKzMyMSw3IEBACiAJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKIH0KIAotaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfcHJvYmVfcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlX3JlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAl1bnNpZ25lZCBpbnQgbGVuLCByYXRlX2xlbjsKIAl1OCAqdGFnOwpAQCAtNjQwLDggKzY0MSw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybyk7CiAKLWlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IGNoYWxsZW5nZWxlbikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgoraWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBjaGFsbGVuZ2VsZW4pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICphdXRoOwpAQCAtODA2LDcgKzgwOCw3IEBACiAJCSoodGFnKyspID0gMjsKIAogCQlwdXRfdW5hbGlnbmVkX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93LAotCQkJCSAgICh1OCAqKXRhZyk7CisJCQkJICAgdGFnKTsKIAkJdGFnKz0yOwogCX0KIApAQCAtOTc4LDcgKzk4MCw5IEBACiB9CiAKIAotaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqCitpZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTMwOTEsNyArMzA5NSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfZGlzYXNzb2NpYXRlX3NrYigKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9kaXNhc3NvY2lhdGVfc2tiKAogCQkJCQkJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLAogCQkJCQkJCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAogCQkJCQkJCXU4CWFzUnNuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCmluZGV4IDI4NzM3ZWMuLjk4ZmJiNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKQEAgLTM1NCw3ICszNTQsNyBAQAogCiAJcmVxID0gKHN0cnVjdCBydGxfODAyMTFfaGRyXzNhZGRyICopIHNrYi0+ZGF0YTsKIAl0YWcgPSAodTggKilyZXE7Ci0JZHN0ID0gKHU4ICopKCZyZXEtPmFkZHIyWzBdKTsKKwlkc3QgPSAmcmVxLT5hZGRyMlswXTsKIAl0YWcgKz0gc2l6ZW9mKHN0cnVjdCBydGxfODAyMTFfaGRyXzNhZGRyKTsKIAlwRGlhbG9nVG9rZW4gPSB0YWcgKyAyOyAgLy9jYXRlZ29yeSthY3Rpb24KIAlwQmFQYXJhbVNldCA9IChQQkFfUEFSQU1fU0VUKSh0YWcgKyAzKTsgICAvLytEaWFsb2dUb2tlbgpAQCAtNDUyLDcgKzQ1Miw3IEBACiAJfQogCXJzcCA9IChzdHJ1Y3QgcnRsXzgwMjExX2hkcl8zYWRkciAqKXNrYi0+ZGF0YTsKIAl0YWcgPSAodTggKilyc3A7Ci0JZHN0ID0gKHU4ICopKCZyc3AtPmFkZHIyWzBdKTsKKwlkc3QgPSAmcnNwLT5hZGRyMlswXTsKIAl0YWcgKz0gc2l6ZW9mKHN0cnVjdCBydGxfODAyMTFfaGRyXzNhZGRyKTsKIAlwRGlhbG9nVG9rZW4gPSB0YWcgKyAyOwogCXBTdGF0dXNDb2RlID0gKHUxNiAqKSh0YWcgKyAzKTsKQEAgLTU5MCw3ICs1OTAsNyBAQAogCiAJSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAlkZWxiYSA9IChzdHJ1Y3QgcnRsXzgwMjExX2hkcl8zYWRkciAqKXNrYi0+ZGF0YTsKLQlkc3QgPSAodTggKikoJmRlbGJhLT5hZGRyMlswXSk7CisJZHN0ID0gJmRlbGJhLT5hZGRyMlswXTsKIAlwRGVsQmFQYXJhbVNldCA9IChQREVMQkFfUEFSQU1fU0VUKSZkZWxiYS0+cGF5bG9hZFsyXTsKIAogCWlmKHBEZWxCYVBhcmFtU2V0LT5maWVsZC5Jbml0aWF0b3IgPT0gMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaAppbmRleCA4MjFhZmMwLi4wYjdiMDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVS5oCkBAIC01MzMsNyArNTMzLDcgQEAKIAl1MzIgICAgICAgICAgICAgaHRfbWNzWzRdWzE2XTsKIH0gcnRfdHhfcmFoaXNfdCwgKnBydF90eF9yYWhpc190OwogdHlwZWRlZiBzdHJ1Y3QgX1JUX1NNT09USF9EQVRBXzRSRiB7Ci0JY2hhciAgICBlbGVtZW50c1s0XVsxMDBdOyAvKiBhcnJheSB0byBzdG9yZSB2YWx1ZXMgKi8KKwlzOCAgICBlbGVtZW50c1s0XVsxMDBdOyAvKiBhcnJheSB0byBzdG9yZSB2YWx1ZXMgKi8KIAl1MzIgICAgIGluZGV4OyAgICAgICAgICAgIC8qIGluZGV4IHRvIGN1cnJlbnQgYXJyYXkgdG8gc3RvcmUgKi8KIAl1MzIgICAgIFRvdGFsTnVtOyAgICAgICAgIC8qIG51bSBvZiB2YWxpZCBlbGVtZW50cyAqLwogCXUzMiAgICAgVG90YWxWYWxbNF07ICAgICAgLyogc3VtIG9mIHZhbGlkIGVsZW1lbnRzICovCkBAIC0xMDMxLDcgKzEwMzEsNyBAQAogCXM4IGNja19wcmVzZW50X2F0dGVudHVhdGlvbjsKIAl1OCBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fMjBNZGVmYXVsdDsKIAl1OCBjY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fNDBNZGVmYXVsdDsKLQljaGFyIGNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCXM4IGNja19wcmVzZW50X2F0dGVudHVhdGlvbl9kaWZmZXJlbmNlOwogCWJvb2wgYnR4cG93ZXJfdHJhY2tpbmc7CiAJYm9vbCBiY2NrX2luX2NoMTQ7CiAJYm9vbCBidHhwb3dlcmRhdGFfcmVhZGZyb21FRVBPUk07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCmluZGV4IGRkMDk3MGYuLjQ1N2VlYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCkBAIC0xMTQsOSArMTE0LDkgQEAKIAogCiAKLW1vZHVsZV9wYXJhbShpZm5hbWUsIGNoYXJwLCBTX0lSVUdPIHwgU19JV1VTUik7Ci1tb2R1bGVfcGFyYW0oaHd3ZXAsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwotbW9kdWxlX3BhcmFtKGNoYW5uZWxzLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShpZm5hbWUsIGNoYXJwLCAwNjQ0KTsKK21vZHVsZV9wYXJhbShod3dlcCwgaW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShjaGFubmVscywgaW50LCAwNjQ0KTsKIAogTU9EVUxFX1BBUk1fREVTQyhpZm5hbWUsICIgTmV0IGludGVyZmFjZSBuYW1lLCB3bGFuJWQ9ZGVmYXVsdCIpOwogTU9EVUxFX1BBUk1fREVTQyhod3dlcCwgIiBUcnkgdG8gdXNlIGhhcmR3YXJlIHNlY3VyaXR5IHN1cHBvcnQuICIpOwpAQCAtOTIyLDQ3ICs5MjIsNiBAQAogCXNrYl9xdWV1ZV9wdXJnZSgmcHJpdi0+c2tiX3F1ZXVlKTsKIH0KIAotaW5saW5lIHUxNiBpZWVlcmF0ZTJydGxyYXRlKGludCByYXRlKQotewotCXN3aXRjaCAocmF0ZSkgewotCWNhc2UgMTA6Ci0JCXJldHVybiAwOwotCWNhc2UgMjA6Ci0JCXJldHVybiAxOwotCWNhc2UgNTU6Ci0JCXJldHVybiAyOwotCWNhc2UgMTEwOgotCQlyZXR1cm4gMzsKLQljYXNlIDYwOgotCQlyZXR1cm4gNDsKLQljYXNlIDkwOgotCQlyZXR1cm4gNTsKLQljYXNlIDEyMDoKLQkJcmV0dXJuIDY7Ci0JY2FzZSAxODA6Ci0JCXJldHVybiA3OwotCWNhc2UgMjQwOgotCQlyZXR1cm4gODsKLQljYXNlIDM2MDoKLQkJcmV0dXJuIDk7Ci0JY2FzZSA0ODA6Ci0JCXJldHVybiAxMDsKLQljYXNlIDU0MDoKLQkJcmV0dXJuIDExOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAzOwotCX0KLX0KLQotc3RhdGljIHUxNiBydGxfcmF0ZVtdID0gezEwLCAyMCwgNTUsIDExMCwgNjAsIDkwLCAxMjAsIDE4MCwgMjQwLCAzNjAsIDQ4MCwgNTQwfTsKLWlubGluZSB1MTYgcnRsODE5Ml9yYXRlMnJhdGUoc2hvcnQgcmF0ZSkKLXsKLQlpZiAocmF0ZSA+IDExKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gcnRsX3JhdGVbcmF0ZV07Ci19Ci0KLQogLyogVGhlIHByb3RvdHlwZSBvZiByeF9pc3IgaGFzIGNoYW5nZWQgc2luY2Ugb25lIHZlcnNpb24gb2YgTGludXggS2VybmVsICovCiBzdGF0aWMgdm9pZCBydGw4MTkyX3J4X2lzcihzdHJ1Y3QgdXJiICp1cmIpCiB7CkBAIC0xMzE5LDE0ICsxMjc4LDYgQEAKIAogfQogCi1pbmxpbmUgdTggcnRsODE5Ml9Jc1dpcmVsZXNzQk1vZGUodTE2IHJhdGUpCi17Ci0JaWYgKCgocmF0ZSA8PSAxMTApICYmIChyYXRlICE9IDYwKSAmJiAocmF0ZSAhPSA5MCkpIHx8IChyYXRlID09IDIyMCkpCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KIHNob3J0IHJ0bDgxOXhVX3R4X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKQEAgLTE3MDIsMTEgKzE2NTMsOCBAQAogCQl9CiAJCWlmIChiU2VuZDBCeXRlKSB7CiAJCQl0eF91cmJfemVybyA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIXR4X3VyYl96ZXJvKSB7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCi0JCQkJCSAiY2FuJ3QgYWxsb2MgdXJiIGZvciB6ZXJvIGJ5dGVcbiIpOworCQkJaWYgKCF0eF91cmJfemVybykKIAkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KIAkJCXVzYl9maWxsX2J1bGtfdXJiKHR4X3VyYl96ZXJvLCB1ZGV2LAogCQkJCQkgIHVzYl9zbmRidWxrcGlwZSh1ZGV2LCBpZHhfcGlwZSksCiAJCQkJCSAgJnplcm8sIDAsIHR4X3plcm9faXNyLCBkZXYpOwpAQCAtNDIwOSw3ICs0MTU3LDcgQEAKICAqCiAgKiBSZXR1cm46CQkwLTEwMCBwZXJjZW50YWdlCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdTggcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UoY2hhciBhbnRwb3dlcikKK3N0YXRpYyB1OCBydGw4MTl4X3F1ZXJ5X3J4cHdycGVyY2VudGFnZShzOCBhbnRwb3dlcikKIHsKIAlpZiAoKGFudHBvd2VyIDw9IC0xMDApIHx8IChhbnRwb3dlciA+PSAyMCkpCiAJCXJldHVybgkwOwpAQCAtNDIyMCw5ICs0MTY4LDkgQEAKIAogfQkvKiBRdWVyeVJ4UHdyUGVyY2VudGFnZSAqLwogCi1zdGF0aWMgdTggcnRsODE5eF9ldm1fZGJ0b3BlcmNlbnRhZ2UoY2hhciB2YWx1ZSkKK3N0YXRpYyB1OCBydGw4MTl4X2V2bV9kYnRvcGVyY2VudGFnZShzOCB2YWx1ZSkKIHsKLQljaGFyIHJldF92YWw7CisJczggcmV0X3ZhbDsKIAogCXJldF92YWwgPSB2YWx1ZTsKIApAQCAtNDI5Nyw4ICs0MjQ1LDggQEAKIAlwaHlfb2ZkbV9yeF9zdGF0dXNfcnhzY19zZ2llbl9leGludGZmbGFnICpwcnhzYzsKIAl1OAkqcHJ4cGt0OwogCXU4CWksIG1heF9zcGF0aWFsX3N0cmVhbSwgdG1wX3J4c25yLCB0bXBfcnhldm0sIHJ4c2Nfc2dpZW5fZXhmbGc7Ci0JY2hhcglyeF9wd3JbNF0sIHJ4X3B3cl9hbGwgPSAwOwotCWNoYXIJcnhfc25yWCwgcnhfZXZtWDsKKwlzOAlyeF9wd3JbNF0sIHJ4X3B3cl9hbGwgPSAwOworCXM4CXJ4X3NuclgsIHJ4X2V2bVg7CiAJdTgJZXZtLCBwd2RiX2FsbDsKIAl1MzIJUlNTSSwgdG90YWxfcnNzaSA9IDA7CiAJdTgJaXNfY2NrX3JhdGUgPSAwOwpAQCAtNDQyMyw3ICs0MzcxLDcgQEAKIAogCQkJLyogR2V0IFJ4IHNuciB2YWx1ZSBpbiBEQiAqLwogCQkJdG1wX3J4c25yID0JcG9mZG1fYnVmLT5yeHNucl9YW2ldOwotCQkJcnhfc25yWCA9IChjaGFyKSh0bXBfcnhzbnIpOworCQkJcnhfc25yWCA9IChzOCkodG1wX3J4c25yKTsKIAkJCXJ4X3NuclggLz0gMjsKIAkJCXByaXYtPnN0YXRzLnJ4U05SZEJbaV0gPSAobG9uZylyeF9zbnJYOwogCkBAIC00NDU3LDcgKzQ0MDUsNyBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBtYXhfc3BhdGlhbF9zdHJlYW07IGkrKykgewogCQkJdG1wX3J4ZXZtID0JcG9mZG1fYnVmLT5yeGV2bV9YW2ldOwotCQkJcnhfZXZtWCA9IChjaGFyKSh0bXBfcnhldm0pOworCQkJcnhfZXZtWCA9IChzOCkodG1wX3J4ZXZtKTsKIAogCQkJLyogRG8gbm90IHVzZSBzaGlmdCBvcGVyYXRpb24gbGlrZSAicnhfZXZtWCA+Pj0gMSIKIAkJCSAqIGJlY2F1c2UgdGhlIGNvbXBpbGVyIG9mIGZyZWUgYnVpbGQgZW52aXJvbm1lbnQgd2lsbApAQCAtNDQ3NSwxMCArNDQyMywxMCBAQAogCQkJCSAqLwogCQkJCXBzdGF0cy0+U2lnbmFsUXVhbGl0eSA9CiAJCQkJCXByZWNvcmRfc3RhdHMtPlNpZ25hbFF1YWxpdHkgPQotCQkJCQkodTgpKGV2bSAmIDB4ZmYpOworCQkJCQlldm0gJiAweGZmOwogCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W2ldID0KIAkJCQlwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W2ldID0KLQkJCQkodTgpKGV2bSAmIDB4ZmYpOworCQkJCWV2bSAmIDB4ZmY7CiAJCX0KIAogCkBAIC01MDEzLDggKzQ5NjEsNyBAQAogCiAJZGV2LT5uZXRkZXZfb3BzID0gJnJ0bDgxOTJfbmV0ZGV2X29wczsKIAotCWRldi0+d2lyZWxlc3NfaGFuZGxlcnMgPQotCQkoc3RydWN0IGl3X2hhbmRsZXJfZGVmICopJnI4MTkyX3d4X2hhbmRsZXJzX2RlZjsKKwlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnI4MTkyX3d4X2hhbmRsZXJzX2RlZjsKIAogCWRldi0+dHlwZSA9IEFSUEhSRF9FVEhFUjsKIApAQCAtNTIyMiw3ICs1MTY5LDggQEAKIAkJfSBlbHNlIHsKIAkJCS8qIEtleSBNYXRlcmlhbCAqLwogCQkJaWYgKEtleUNvbnRlbnQpIHsKLQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXQ0FNSSwgKHUzMikoKihLZXlDb250ZW50ICsgaSAtIDIpKSk7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksCisJCQkJCQkqKEtleUNvbnRlbnQgKyBpIC0gMikpOwogCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCBUYXJnZXRDb21tYW5kKTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jCmluZGV4IDFlMGU1M2MuLjkyMDlhYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMKQEAgLTE1MCw3ICsxNTAsNyBAQAogI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCiB2b2lkIGRtX0NoZWNrUnhBZ2dyZWdhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvOwogCXN0YXRpYyB1bnNpZ25lZCBsb25nCWxhc3RUeE9rQ250OwogCXN0YXRpYyB1bnNpZ25lZCBsb25nCWxhc3RSeE9rQ250OwpAQCAtMjM0Niw3ICsyMzQ2LDcgQEAKIAogc3RhdGljIHZvaWQgZG1faW5pdF9jdHN0b3NlbGYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldik7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCiAJcHJpdi0+aWVlZTgwMjExLT5iQ1RTVG9TZWxmRW5hYmxlID0gdHJ1ZTsKIAlwcml2LT5pZWVlODAyMTEtPkNUU1RvU2VsZlRIID0gQ1RTVG9TZWxmVEhWYWw7CkBAIC0yMzU0LDcgKzIzNTQsNyBAQAogCiBzdGF0aWMgdm9pZCBkbV9jdHN0b3NlbGYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldik7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKIAlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCQlsYXN0VHhPa0NudDsKIAlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCQlsYXN0UnhPa0NudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2llZWU4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKaW5kZXggODkxODY1NC4uNWRjM2I1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCWNhc2UgV0lSRUxFU1NfMTFCRzoKIAkJbWVtY3B5KHJhdGVzLCBXSUZJX0NDS1JBVEVTLCBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOKTsKIAkJbWVtY3B5KHJhdGVzICsgSUVFRTgwMjExX0NDS19SQVRFX0xFTiwgV0lGSV9PRkRNUkFURVMsCi0JCQlJRUVFODAyMTFfTlVNX09GRE1fUkFURVNMRU4pOworCQkgICAgICAgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTTEVOKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTg4LDI0ICsxODgsMjQgQEAKIAlpZSArPSAyOwogCS8qU1NJRCovCiAJaWUgPSByODcxMl9zZXRfaWUoaWUsIF9TU0lEX0lFXywgcGRldl9uZXR3b3JrLT5Tc2lkLlNzaWRMZW5ndGgsCi0JCSAgICBwZGV2X25ldHdvcmstPlNzaWQuU3NpZCwgJnN6KTsKKwkJCSAgcGRldl9uZXR3b3JrLT5Tc2lkLlNzaWQsICZzeik7CiAJLypzdXBwb3J0ZWQgcmF0ZXMqLwogCXNldF9zdXBwb3J0ZWRfcmF0ZShwZGV2X25ldHdvcmstPnJhdGVzLCBwcmVnaXN0cnlwcml2LT53aXJlbGVzc19tb2RlKTsKIAlyYXRlTGVuID0gcjg3MTJfZ2V0X3JhdGVzZXRfbGVuKHBkZXZfbmV0d29yay0+cmF0ZXMpOwogCWlmIChyYXRlTGVuID4gOCkgewogCQlpZSA9IHI4NzEyX3NldF9pZShpZSwgX1NVUFBPUlRFRFJBVEVTX0lFXywgOCwKLQkJCSAgICBwZGV2X25ldHdvcmstPnJhdGVzLCAmc3opOworCQkJCSAgcGRldl9uZXR3b3JrLT5yYXRlcywgJnN6KTsKIAkJaWUgPSByODcxMl9zZXRfaWUoaWUsIF9FWFRfU1VQUE9SVEVEUkFURVNfSUVfLCAocmF0ZUxlbiAtIDgpLAotCQkJICAgIChwZGV2X25ldHdvcmstPnJhdGVzICsgOCksICZzeik7CisJCQkJICAocGRldl9uZXR3b3JrLT5yYXRlcyArIDgpLCAmc3opOwogCX0gZWxzZQogCQlpZSA9IHI4NzEyX3NldF9pZShpZSwgX1NVUFBPUlRFRFJBVEVTX0lFXywKLQkJCSAgICByYXRlTGVuLCBwZGV2X25ldHdvcmstPnJhdGVzLCAmc3opOworCQkJCSAgcmF0ZUxlbiwgcGRldl9uZXR3b3JrLT5yYXRlcywgJnN6KTsKIAkvKkRTIHBhcmFtZXRlciBzZXQqLwogCWllID0gcjg3MTJfc2V0X2llKGllLCBfRFNTRVRfSUVfLCAxLAotCQkgICAgKHU4ICopJihwZGV2X25ldHdvcmstPkNvbmZpZ3VyYXRpb24uRFNDb25maWcpLCAmc3opOworCQkJICAodTggKikmKHBkZXZfbmV0d29yay0+Q29uZmlndXJhdGlvbi5EU0NvbmZpZyksICZzeik7CiAJLypJQlNTIFBhcmFtZXRlciBTZXQqLwogCWllID0gcjg3MTJfc2V0X2llKGllLCBfSUJTU19QQVJBX0lFXywgMiwKLQkJICAgICh1OCAqKSYocGRldl9uZXR3b3JrLT5Db25maWd1cmF0aW9uLkFUSU1XaW5kb3cpLCAmc3opOworCQkJICAodTggKikmKHBkZXZfbmV0d29yay0+Q29uZmlndXJhdGlvbi5BVElNV2luZG93KSwgJnN6KTsKIAlyZXR1cm4gc3o7CiB9CiAKQEAgLTIyMCw4ICsyMjAsNyBAQAogCQlwYnVmID0gcjg3MTJfZ2V0X2llKHBidWYsIF9XUEFfSUVfSURfLCAmbGVuLCBsaW1pdCk7CiAJCWlmIChwYnVmKSB7CiAJCQkvKmNoZWNrIGlmIG91aSBtYXRjaGVzLi4uKi8KLQkJCWlmIChtZW1jbXAoKHBidWYgKyAyKSwgd3BhX291aV90eXBlLAotCQkJICAgIHNpemVvZih3cGFfb3VpX3R5cGUpKSkKKwkJCWlmIChtZW1jbXAoKHBidWYgKyAyKSwgd3BhX291aV90eXBlLCBzaXplb2Yod3BhX291aV90eXBlKSkpCiAJCQkJZ290byBjaGVja19uZXh0X2llOwogCQkJLypjaGVjayB2ZXJzaW9uLi4uKi8KIAkJCW1lbWNweSgodTggKikmdmFsMTYsIChwYnVmICsgNiksIHNpemVvZih2YWwxNikpOwpAQCAtMjc5LDcgKzI3OCw3IEBACiB9CiAKIGludCByODcxMl9wYXJzZV93cGFfaWUodTggKndwYV9pZSwgaW50IHdwYV9pZV9sZW4sIGludCAqZ3JvdXBfY2lwaGVyLAotCQkgaW50ICpwYWlyd2lzZV9jaXBoZXIpCisJCSAgICAgICBpbnQgKnBhaXJ3aXNlX2NpcGhlcikKIHsKIAlpbnQgaTsKIAlpbnQgbGVmdCwgY291bnQ7CkBAIC0zMjIsNyArMzIxLDcgQEAKIH0KIAogaW50IHI4NzEyX3BhcnNlX3dwYTJfaWUodTggKnJzbl9pZSwgaW50IHJzbl9pZV9sZW4sIGludCAqZ3JvdXBfY2lwaGVyLAotCQkgIGludCAqcGFpcndpc2VfY2lwaGVyKQorCQkJaW50ICpwYWlyd2lzZV9jaXBoZXIpCiB7CiAJaW50IGk7CiAJaW50IGxlZnQsIGNvdW50OwpAQCAtMzY1LDcgKzM2NCw3IEBACiB9CiAKIGludCByODcxMl9nZXRfc2VjX2llKHU4ICppbl9pZSwgdWludCBpbl9sZW4sIHU4ICpyc25faWUsIHUxNiAqcnNuX2xlbiwKLQkgICAgICAgdTggKndwYV9pZSwgdTE2ICp3cGFfbGVuKQorCQkgICAgIHU4ICp3cGFfaWUsIHUxNiAqd3BhX2xlbikKIHsKIAl1OCBhdXRobW9kZTsKIAl1OCB3cGFfb3VpWzRdID0gezB4MCwgMHg1MCwgMHhmMiwgMHgwMX07CkBAIC0zODMsNyArMzgyLDcgQEAKIAkJfSBlbHNlIHsKIAkJCWlmIChhdXRobW9kZSA9PSBfV1BBMl9JRV9JRF8pIHsKIAkJCQltZW1jcHkocnNuX2llLCAmaW5faWVbY250XSwKLQkJCQkJaW5faWVbY250ICsgMV0gKyAyKTsKKwkJCQkgICAgICAgaW5faWVbY250ICsgMV0gKyAyKTsKIAkJCQkqcnNuX2xlbiA9IGluX2llW2NudCArIDFdICsgMjsKIAkJCQljbnQgKz0gaW5faWVbY250ICsgMV0gKyAyOyAgLypnZXQgbmV4dCovCiAJCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMKaW5kZXggNTcyMTFmNy4uY2JlNGRlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc19pbnRmcy5jCkBAIC0yNDMsOSArMjQzLDkgQEAKIHZvaWQgcjg3MTJfc3RvcF9kcnZfdGhyZWFkcyhzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKQogewogCS8qQmVsb3cgaXMgdG8gdGVybWluYXRlIHI4NzEyX2NtZF90aHJlYWQgJiBldmVudF90aHJlYWQuLi4qLwotCXVwKCZwYWRhcHRlci0+Y21kcHJpdi5jbWRfcXVldWVfc2VtYSk7CisJY29tcGxldGUoJnBhZGFwdGVyLT5jbWRwcml2LmNtZF9xdWV1ZV9jb21wKTsKIAlpZiAocGFkYXB0ZXItPmNtZFRocmVhZCkKLQkJX2Rvd25fc2VtYSgmcGFkYXB0ZXItPmNtZHByaXYudGVybWluYXRlX2NtZHRocmVhZF9zZW1hKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZwYWRhcHRlci0+Y21kcHJpdi50ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXApOwogCXBhZGFwdGVyLT5jbWRwcml2LmNtZF9zZXEgPSAxOwogfQogCkBAIC00MjUsNyArNDI1LDcgQEAKIAllbHNlCiAJCW5ldGlmX3dha2VfcXVldWUocG5ldGRldik7CiAKLQkgaWYgKHZpZGVvX21vZGUpCisJaWYgKHZpZGVvX21vZGUpCiAJCWVuYWJsZV92aWRlb19tb2RlKHBhZGFwdGVyLCBjYnc0MF9lbmFibGUpOwogCS8qIHN0YXJ0IGRyaXZlciBtbG1lIHJlbGF0aW9uIHRpbWVyICovCiAJc3RhcnRfZHJ2X3RpbWVycyhwYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9pbnRmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9pbnRmLmgKaW5kZXggYWEwZWM3NC4uNWQzN2UxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfaW50Zi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX2ludGYuaApAQCAtMzYsNyArMzYsNyBAQAogCS8qIHdoZW4gaW4gVVNCLCBJTyBpcyB0aHJvdWdoIGludGVycnVwdCBpbi9vdXQgZW5kcG9pbnRzICovCiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IHVyYiAqcGlvcndfdXJiOwotCXN0cnVjdCBzZW1hcGhvcmUgaW9fcmV0ZXZ0OworCXN0cnVjdCBjb21wbGV0aW9uIGlvX3JldGV2dF9jb21wOwogfTsKIAogaW50IHI4NzF4X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCmluZGV4IGFkMDQxYzkuLmM5ZWE1MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKQEAgLTU3LDEzICs1Nyw2IEBACiAJCXNwaW5fbG9ja19pbml0KCYoKHBxdWV1ZSktPmxvY2spKTsJXAogCX0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbmxpbmUgdTMyIF9kb3duX3NlbWEoc3RydWN0IHNlbWFwaG9yZSAqc2VtYSkKLXsKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKHNlbWEpKQotCQlyZXR1cm4gX0ZBSUw7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCiBzdGF0aWMgaW5saW5lIHUzMiBlbmRfb2ZfcXVldWVfc2VhcmNoKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCiAJCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcmVjdl9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcmVjdl9saW51eC5jCmluZGV4IDczNWEwZWEuLjU3NmMxNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3JlY3ZfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9yZWN2X2xpbnV4LmMKQEAgLTYwLDcgKzYwLDYgQEAKIAlpZiAoIXByZWN2YnVmLT5wdXJiKQogCQlyZXMgPSBfRkFJTDsKIAlwcmVjdmJ1Zi0+cHNrYiA9IE5VTEw7Ci0JcHJlY3ZidWYtPnJldXNlID0gZmFsc2U7CiAJcHJlY3ZidWYtPnBhbGxvY2F0ZWRfYnVmID0gTlVMTDsKIAlwcmVjdmJ1Zi0+cGJ1ZiA9IE5VTEw7CiAJcHJlY3ZidWYtPnBkYXRhID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2NtZC5jCmluZGV4IDEzYzAxODMuLjlmNjE1ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWQuYwpAQCAtMjY0LDkgKzI2NCw5IEBACiAJCSAqLwogCQlpZiAocGFkYXB0ZXItPnB3cmN0cmxwcml2LnB3cl9tb2RlID4gUFNfTU9ERV9BQ1RJVkUpIHsKIAkJCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5wd3JfbW9kZSA9IFBTX01PREVfQUNUSVZFOwotCQkJX2VudGVyX3B3cmxvY2soJihwYWRhcHRlci0+cHdyY3RybHByaXYubG9jaykpOworCQkJbXV0ZXhfbG9jaygmcGFkYXB0ZXItPnB3cmN0cmxwcml2Lm11dGV4X2xvY2spOwogCQkJcjg3MTJfc2V0X3Jwd20ocGFkYXB0ZXIsIFBTX1NUQVRFX1M0KTsKLQkJCXVwKCYocGFkYXB0ZXItPnB3cmN0cmxwcml2LmxvY2spKTsKKwkJCW11dGV4X3VubG9jaygmcGFkYXB0ZXItPnB3cmN0cmxwcml2Lm11dGV4X2xvY2spOwogCQl9CiAJCXBjbWRfciA9IHBjbWQ7CiAJCWJyZWFrOwpAQCAtMzIyLDcgKzMyMiw3IEBACiAKIAlhbGxvd19zaWduYWwoU0lHVEVSTSk7CiAJd2hpbGUgKDEpIHsKLQkJaWYgKChfZG93bl9zZW1hKCYocGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKSkpID09IF9GQUlMKQorCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZwY21kcHJpdi0+Y21kX3F1ZXVlX2NvbXApKQogCQkJYnJlYWs7CiAJCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCiAJCQlicmVhazsKQEAgLTM5NSwxMCArMzk1LDEwIEBACiAJCQl9CiAJCQlpZiAocGNtZC0+Y21kY29kZSA9PSBHRU5fQ01EX0NPREUoX1NldFB3ck1vZGUpKSB7CiAJCQkJaWYgKHBhZGFwdGVyLT5wd3JjdHJscHJpdi5iU2xlZXApIHsKLQkJCQkJX2VudGVyX3B3cmxvY2soJihwYWRhcHRlci0+Ci0JCQkJCQkgICAgICAgcHdyY3RybHByaXYubG9jaykpOworCQkJCQltdXRleF9sb2NrKCZwYWRhcHRlci0+CisJCQkJCQkgICAgICAgcHdyY3RybHByaXYubXV0ZXhfbG9jayk7CiAJCQkJCXI4NzEyX3NldF9ycHdtKHBhZGFwdGVyLCBQU19TVEFURV9TMik7Ci0JCQkJCXVwKCZwYWRhcHRlci0+cHdyY3RybHByaXYubG9jayk7CisJCQkJCW11dGV4X3VubG9jaygmcGFkYXB0ZXItPnB3cmN0cmxwcml2Lm11dGV4X2xvY2spOwogCQkJCX0KIAkJCX0KIAkJCXI4NzEyX2ZyZWVfY21kX29iaihwY21kKTsKQEAgLTQyMCw3ICs0MjAsNyBAQAogCQkJYnJlYWs7CiAJCXI4NzEyX2ZyZWVfY21kX29iaihwY21kKTsKIAl9IHdoaWxlICgxKTsKLQl1cCgmcGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSk7CisJY29tcGxldGUoJnBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXApOwogCXRocmVhZF9leGl0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWZ1c2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWZ1c2UuYwppbmRleCA3NmY2MGJhLi4yMDUyOThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2VmdXNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZnVzZS5jCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAl1OCB0bXBkYXRhW1BHUEtUX0RBVEFfU0laRV07CiAJdTggcmV0ID0gdHJ1ZTsKIAotCWlmIChkYXRhID09IE5VTEwpCisJaWYgKCFkYXRhKQogCQlyZXR1cm4gZmFsc2U7CiAJaWYgKG9mZnNldCA+IDB4MGYpCiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbGVkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2xlZC5jCmluZGV4IDkwNTU4MjcuLmE4ZTIzN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbGVkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9sZWQuYwpAQCAtNDMsNyArNDMsNyBAQAogI2RlZmluZSBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQQkJNTAwCiAjZGVmaW5lIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBCQkxODAKICNkZWZpbmUgTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQQkJNTAKLSNkZWZpbmUgTEVEX0JMSU5LX1dQU19TVUNFU1NfSU5URVJWQUxfQUxQSEEJNTAwMAorI2RlZmluZSBMRURfQkxJTktfV1BTX1NVQ0NFU1NfSU5URVJWQUxfQUxQSEEJNTAwMAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogTEVEIG9iamVjdC4KQEAgLTUxLDE3ICs1MSwxOSBAQAogICovCiBlbnVtIF9MRURfU1RBVEVfODcxeCB7CiAJTEVEX1VOS05PV04gPSAwLAotCUxFRF9PTiA9IDEsCi0JTEVEX09GRiA9IDIsCisJTEVEX1NUQVRFX09OID0gMSwKKwlMRURfU1RBVEVfT0ZGID0gMiwKIAlMRURfQkxJTktfTk9STUFMID0gMywKIAlMRURfQkxJTktfU0xPV0xZID0gNCwKIAlMRURfUE9XRVJfT05fQkxJTksgPSA1LAogCUxFRF9TQ0FOX0JMSU5LID0gNiwgLyogTEVEIGlzIGJsaW5raW5nIGR1cmluZyBzY2FubmluZyBwZXJpb2QsCiAJCQkgICAgICogdGhlICMgb2YgdGltZXMgdG8gYmxpbmsgaXMgZGVwZW5kIG9uIHRpbWUKLQkJCSAgICAgKiBmb3Igc2Nhbm5pbmcuICovCisJCQkgICAgICogZm9yIHNjYW5uaW5nLgorCQkJICAgICAqLwogCUxFRF9OT19MSU5LX0JMSU5LID0gNywgLyogTEVEIGlzIGJsaW5raW5nIGR1cmluZyBubyBsaW5rIHN0YXRlLiAqLwogCUxFRF9CTElOS19TdGFydFRvQmxpbmsgPSA4LC8qIEN1c3RvbWl6ZWQgZm9yIFNlcmNvbW0gUHJpbnRlcgotCQkJCSAgICAqIFNlcnZlciBjYXNlICovCisJCQkJICAgICogU2VydmVyIGNhc2UKKwkJCQkgICAgKi8KIAlMRURfQkxJTktfV1BTID0gOSwJLyogTEVEIGlzIGJsaW5rZyBkdXJpbmcgV1BTIGNvbW11bmljYXRpb24gKi8KIAlMRURfVFhSWF9CTElOSyA9IDEwLAogCUxFRF9CTElOS19XUFNfU1RPUCA9IDExLAkvKmZvciBBTFBIQSAqLwpAQCAtOTIsNyArOTQsNyBAQAogCW5pYyA9IHBhZGFwdGVyLT5wbmV0ZGV2OwogCXBMZWQtPnBhZGFwdGVyID0gcGFkYXB0ZXI7CiAJcExlZC0+TGVkUGluID0gTGVkUGluOwotCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CisJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAlwTGVkLT5iTGVkT24gPSBmYWxzZTsKIAlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJcExlZC0+QmxpbmtUaW1lcyA9IDA7CkBAIC0xMTAsNyArMTEyLDggQEAKIHsKIAlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJLyogV2Ugc2hvdWxkIHJlc2V0IGJMZWRCbGlua0luUHJvZ3Jlc3MgaWYgd2UgY2FuY2VsCi0JICogdGhlIExlZENvbnRyb2xUaW1lciwgKi8KKwkgKiB0aGUgTGVkQ29udHJvbFRpbWVyLAorCSAqLwogCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIH0KIApAQCAtMjA4LDcgKzIxMSw3IEBACiAJdTggYlN0b3BCbGlua2luZyA9IGZhbHNlOwogCiAJLyogQ2hhbmdlIExFRCBhY2NvcmRpbmcgdG8gQmxpbmtpbmdMZWRTdGF0ZSBzcGVjaWZpZWQuICovCi0JaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX09OKQorCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9TVEFURV9PTikKIAkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJZWxzZQogCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CkBAIC0yNDgsMTAgKzI1MSwxMCBAQAogCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJfSBlbHNlIHsKIAkJLyogQXNzaWduIExFRCBzdGF0ZSB0byB0b2dnbGUuICovCi0JCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfU1RBVEVfT04pCisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAKIAkJLyogU2NoZWR1bGUgYSB0aW1lciB0byB0b2dnbGUgTEVEIHN0YXRlLiAqLwogCQlzd2l0Y2ggKHBMZWQtPkN1cnJMZWRTdGF0ZSkgewpAQCAtMjg4LDcgKzI5MSw3IEBACiAJaWYgKHBlZXByb21wcml2LT5DdXN0b21lcklEID09IFJUX0NJRF84MTl4X0NBTUVPKQogCQlwTGVkID0gJihsZWRwcml2LT5Td0xlZDEpOwogCS8qIENoYW5nZSBMRUQgYWNjb3JkaW5nIHRvIEJsaW5raW5nTGVkU3RhdGUgc3BlY2lmaWVkLiAqLwotCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikKKwlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfU1RBVEVfT04pCiAJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCWVsc2UKIAkJU3dMZWRPZmYocGFkYXB0ZXIsIHBMZWQpOwpAQCAtMzEyLDE3ICszMTUsMTcgQEAKIAlzd2l0Y2ggKHBMZWQtPkN1cnJMZWRTdGF0ZSkgewogCWNhc2UgTEVEX0JMSU5LX1NMT1dMWToKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX05PUk1BTDoKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwpAQCAtMzM1LDI3ICszMzgsMjcgQEAKIAkJCQlwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX05PUk1BTDsKIAkJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQkJZWxzZQotCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJfSBlbHNlIGlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7CiAJCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1NMT1dMWTsKIAkJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQkJZWxzZQotCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJfQogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCSBpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTM2OSwxOCArMzcyLDE4IEBACiAJCQkJcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19OT1JNQUw7CiAJCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCWVsc2UKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewogCQkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCWVsc2UKLQkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCX0KQEAgLTM4OCwyNiArMzkxLDI2IEBACiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQkgaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfV1BTOgogCQlpZiAocExlZC0+YkxlZE9uKQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfV1BTX1NUT1A6CS8qIFdQUyBzdWNjZXNzICovCi0JCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikgewotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9TVEFURV9PTikgeworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwotCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSkpOworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0NFU1NfSU5URVJWQUxfQUxQSEEpKTsKIAkJCWJTdG9wQmxpbmtpbmcgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwpAQCAtNDE2LDkgKzQxOSw5IEBACiAJCQlwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfTk9STUFMOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC00MzYsNyArNDM5LDcgQEAKIAl1OCBiU3RvcEJsaW5raW5nID0gZmFsc2U7CiAKIAkvKiBDaGFuZ2UgTEVEIGFjY29yZGluZyB0byBCbGlua2luZ0xlZFN0YXRlIHNwZWNpZmllZC4gKi8KLQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfT04pCisJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1NUQVRFX09OKQogCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAllbHNlCiAJCVN3TGVkT2ZmKHBhZGFwdGVyLCBwTGVkKTsKQEAgLTQ0NywyMCArNDUwLDIwIEBACiAJCQliU3RvcEJsaW5raW5nID0gdHJ1ZTsKIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKIAkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CiAJCQl9CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJIGlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtNDcxLDIwICs0NzQsMjAgQEAKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwogCQlpZiAoYlN0b3BCbGlua2luZykgewogCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCQkJfSBlbHNlIGlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCVN3TGVkT2ZmKHBhZGFwdGVyLCBwTGVkKTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC01MDEsNyArNTA0LDcgQEAKIAl1OCBiU3RvcEJsaW5raW5nID0gZmFsc2U7CiAKIAkvKiBDaGFuZ2UgTEVEIGFjY29yZGluZyB0byBCbGlua2luZ0xlZFN0YXRlIHNwZWNpZmllZC4gKi8KLQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfT04pCisJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1NUQVRFX09OKQogCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAllbHNlCiAJCWlmIChwTGVkLT5DdXJyTGVkU3RhdGUgIT0gTEVEX0JMSU5LX1dQU19TVE9QKQpAQCAtNTEzLDIyICs1MTYsMjIgQEAKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwogCQlpZiAoYlN0b3BCbGlua2luZykgewogCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCWlmICghcExlZC0+YkxlZE9uKQogCQkJCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCQlpZiAocExlZC0+YkxlZE9uKQogCQkJCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CiAJCQl9CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC01MzksNDYgKzU0Miw0NiBAQAogCQkJYlN0b3BCbGlua2luZyA9IHRydWU7CiAJCWlmIChiU3RvcEJsaW5raW5nKSB7CiAJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQkJaWYgKCFwTGVkLT5iTGVkT24pCiAJCQkJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCQkJfSBlbHNlIGlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCWlmIChwTGVkLT5iTGVkT24pCiAJCQkJCVN3TGVkT2ZmKHBhZGFwdGVyLCBwTGVkKTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQUzoKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQU19TVE9QOgkvKldQUyBzdWNjZXNzKi8KLQkJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX09OKSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1NUQVRFX09OKSB7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCi0JCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19XUFNfU1VDRVNTX0lOVEVSVkFMX0FMUEhBKSk7CisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19XUFNfU1VDQ0VTU19JTlRFUlZBTF9BTFBIQSkpOwogCQkJYlN0b3BCbGlua2luZyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJYlN0b3BCbGlua2luZyA9IHRydWU7CiAJCX0KIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKLQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KQEAgLTU5NiwzMiArNTk5LDMyIEBACiAJdTggYlN0b3BCbGlua2luZyA9IGZhbHNlOwogCiAJLyogQ2hhbmdlIExFRCBhY2NvcmRpbmcgdG8gQmxpbmtpbmdMZWRTdGF0ZSBzcGVjaWZpZWQuICovCi0JaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX09OKQorCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9TVEFURV9PTikKIAkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJZWxzZQogCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CiAJaWYgKCFwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyAmJgogCSAgICBwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfVU5LTk9XTikgewotCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZDEpOwogCX0KIAlzd2l0Y2ggKHBMZWQtPkN1cnJMZWRTdGF0ZSkgewogCWNhc2UgTEVEX0JMSU5LX1NMT1dMWToKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1N0YXJ0VG9CbGluazoKIAkJaWYgKHBMZWQtPmJMZWRPbikgewotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpKTsKIAkJfSBlbHNlIHsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQl9CkBAIC02MzQsMTcgKzYzNywxNyBAQAogCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfU0xPV0xZOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtNjU3LDM3ICs2NjAsMzcgQEAKIAkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1NMT1dMWTsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCSBpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFM6CiAJCWlmIChwTGVkLT5iTGVkT24pIHsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKSk7CiAJCX0gZWxzZSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFNfU1RPUDoJLypXUFMgYXV0aGVudGljYXRpb24gZmFpbCovCiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCWJyZWFrOwpAQCAtNzAxLDE0ICs3MDQsMTQgQEAKIAkJfQogCQlpZiAoYlN0b3BCbGlua2luZykgewogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDEwOwotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQl9IGVsc2UgewogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCX0KQEAgLTcyNCw3ICs3MjcsNyBAQAogCXU4IGJTdG9wQmxpbmtpbmcgPSBmYWxzZTsKIAogCS8qIENoYW5nZSBMRUQgYWNjb3JkaW5nIHRvIEJsaW5raW5nTGVkU3RhdGUgc3BlY2lmaWVkLiAqLwotCWlmIChwTGVkLT5CbGlua2luZ0xlZFN0YXRlID09IExFRF9PTikKKwlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfU1RBVEVfT04pCiAJCVN3TGVkT24ocGFkYXB0ZXIsIHBMZWQpOwogCWVsc2UKIAkJU3dMZWRPZmYocGFkYXB0ZXIsIHBMZWQpOwpAQCAtNzM0LDE3ICs3MzcsMTcgQEAKIAkJaWYgKHBMZWQtPkJsaW5rVGltZXMgPT0gMCkKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwogCQlpZiAoYlN0b3BCbGlua2luZykgewotCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQlpZiAoIXBMZWQtPmJMZWRPbikKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtNzU0LDE3ICs3NTcsMTcgQEAKIAkJaWYgKHBMZWQtPkJsaW5rVGltZXMgPT0gMCkKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwogCQlpZiAoYlN0b3BCbGlua2luZykgewotCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQlpZiAoIXBMZWQtPmJMZWRPbikKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJIGlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC03ODAsNyArNzgzLDcgQEAKIAl1OCBiU3RvcEJsaW5raW5nID0gZmFsc2U7CiAKIAkvKiBDaGFuZ2UgTEVEIGFjY29yZGluZyB0byBCbGlua2luZ0xlZFN0YXRlIHNwZWNpZmllZC4gKi8KLQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfT04pCisJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX1NUQVRFX09OKQogCQlTd0xlZE9uKHBhZGFwdGVyLCBwTGVkKTsKIAllbHNlCiAJCVN3TGVkT2ZmKHBhZGFwdGVyLCBwTGVkKTsKQEAgLTc5MCwyNSArNzkzLDI1IEBACiAJCWlmIChwTGVkLT5CbGlua1RpbWVzID09IDApCiAJCQliU3RvcEJsaW5raW5nID0gdHJ1ZTsKIAkJaWYgKGJTdG9wQmxpbmtpbmcpIHsKLQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJaWYgKCFwTGVkLT5iTGVkT24pCiAJCQkJU3dMZWRPbihwYWRhcHRlciwgcExlZCk7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFM6CiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKQEAgLTgyNyw3ICs4MzAsOCBAQAogCXN0cnVjdCBMRURfODcxeCAgKnBMZWQgPSAoc3RydWN0IExFRF84NzF4ICopZGF0YTsKIAogCS8qIFRoaXMgZml4ZWQgdGhlIGNyYXNoIHByb2JsZW0gb24gRmVkb3JhIDEyIHdoZW4gdHJ5aW5nIHRvIGRvIHRoZQotCSAqIGluc21vZDtpZmNvbmZpZyB1cDtybW1vZCBjb21tYW5kcy4gKi8KKwkgKiBpbnNtb2Q7aWZjb25maWcgdXA7cm1tb2QgY29tbWFuZHMuCisJICovCiAJaWYgKHBMZWQtPnBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkIHx8IHBMZWQtPnBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkKIAkJcmV0dXJuOwogCXNjaGVkdWxlX3dvcmsoJnBMZWQtPkJsaW5rV29ya0l0ZW0pOwpAQCAtOTA4LDkgKzkxMiw5IEBACiAJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTkzMSw5ICs5MzUsOSBAQAogCQkJcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX05PUk1BTDsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtOTYxLDkgKzk2NSw5IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU0NBTl9CTElOSzsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAyNDsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJIH0KQEAgLTk4Niw5ICs5OTAsOSBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1RYUlhfQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0xMDE2LDkgKzEwMjAsOSBAQAogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0xMDQ2LDExICsxMDUwLDExIEBACiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQU19TVE9QOwogCQlpZiAocExlZC0+YkxlZE9uKSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKLQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNFU1NfSU5URVJWQUxfQUxQSEEpKTsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNDRVNTX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0gZWxzZSB7Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKIAkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJfQpAQCAtMTA2MywxNSArMTA2NywxNSBAQAogCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1NMT1dMWTsKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJaWYgKHBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MpIHsKIAkJCWRlbF90aW1lcigmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CkBAIC0xMTIzLDkgKzExMjcsOSBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NDQU5fQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjQ7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCSB9CkBAIC0xMTQyLDE3ICsxMTQ2LDE3IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfVFhSWF9CTElOSzsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAyOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIExFRF9DVExfTElOSzoKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzKSB7CiAJCQlkZWxfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwpAQCAtMTE3OCw4ICsxMTgyLDggQEAKIAkJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7Ci0JCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKIAkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJIH0KQEAgLTExODcsMTYgKzExOTEsMTYgQEAKIAogCWNhc2UgTEVEX0NUTF9TVE9QX1dQUzoKIAkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKKwkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTX0ZBSUw6CiAJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CkBAIC0xMjA0LDE1ICsxMjA4LDE1IEBACiAJY2FzZSBMRURfQ1RMX1NUQVJUX1RPX0xJTks6CiAJY2FzZSBMRURfQ1RMX05PX0xJTks6CiAJCWlmICghSVNfTEVEX0JMSU5LSU5HKHBMZWQpKSB7Ci0JCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1BPV0VSX09GRjoKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTEyNTUsOSArMTI1OSw5IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU0NBTl9CTElOSzsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAyNDsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTI3Myw5ICsxMjc3LDkgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9UWFJYX0JMSU5LOwogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDI7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTI4Myw4ICsxMjg3LDggQEAKIAljYXNlIExFRF9DVExfTElOSzoKIAkJaWYgKElTX0xFRF9XUFNfQkxJTktJTkcocExlZCkpCiAJCQlyZXR1cm47Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTEzMTAsOSArMTMxNCw5IEBACiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19XUFM7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTEzMjYsMTEgKzEzMzAsMTEgQEAKIAkJfQogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTX1NUT1A7CiAJCWlmIChwTGVkLT5iTGVkT24pIHsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwotCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSkpOworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0NFU1NfSU5URVJWQUxfQUxQSEEpKTsKIAkJfSBlbHNlIHsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQl9CkBAIC0xMzQwLDIzICsxMzQ0LDIzIEBACiAJCQlkZWxfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVEFSVF9UT19MSU5LOgogCWNhc2UgTEVEX0NUTF9OT19MSU5LOgogCQlpZiAoIUlTX0xFRF9CTElOS0lORyhwTGVkKSkgewotCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MpIHsKIAkJCWRlbF90aW1lcigmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CkBAIC0xMzkwLDggKzEzOTQsOCBAQAogCQlpZiAocExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKIAkJCXBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQlkZWxfdGltZXIoJnBMZWQxLT5CbGlua1RpbWVyKTsKLQkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQkJcExlZDEtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQlpZiAocExlZDEtPmJMZWRPbikKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwpAQCAtMTQxMSwxMSArMTQxNSwxMSBAQAogCQkJcExlZC0+YkxlZFN0YXJ0VG9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TdGFydFRvQmxpbms7CiAJCQlpZiAocExlZC0+YkxlZE9uKSB7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpKTsKIAkJCX0gZWxzZSB7Ci0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCQl9CkBAIC0xNDI4LDggKzE0MzIsOCBAQAogCQkJaWYgKHBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7CiAJCQkJcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCQlkZWxfdGltZXIoJnBMZWQxLT5CbGlua1RpbWVyKTsKLQkJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQkJcExlZDEtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOworCQkJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJCWlmIChwTGVkMS0+YkxlZE9uKQogCQkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKQEAgLTE0NDYsOSArMTQ1MCw5IEBACiAJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTE0NzIsOSArMTQ3Niw5IEBACiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU0NBTl9CTElOSzsKIAkJCXBMZWQtPkJsaW5rVGltZXMgPSAyNDsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTQ5Myw5ICsxNDk3LDkgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9UWFJYX0JMSU5LOwogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDI7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQpAQCAtMTUwNSw4ICsxNTA5LDggQEAKIAkJaWYgKHBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7CiAJCQlwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJZGVsX3RpbWVyKCZwTGVkMS0+QmxpbmtUaW1lcik7Ci0JCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJaWYgKHBMZWQxLT5iTGVkT24pCiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKQEAgLTE1MjcsMTEgKzE1MzEsMTEgQEAKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQUzsKIAkJCWlmIChwTGVkLT5iTGVkT24pIHsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NMT1dMWV9JTlRFUlZBTCkpOwogCQkJfSBlbHNlIHsKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpKTsKIAkJCX0KQEAgLTE1NDUsOSArMTU0OSw5IEBACiAJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfU0xPV0xZOwogCQlpZiAocExlZC0+YkxlZE9uKQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CkBAIC0xNTU5LDkgKzE1NjMsOSBAQAogCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1NMT1dMWTsKIAkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWVsc2UKLQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCS8qTEVEMSBzZXR0aW5ncyovCkBAIC0xNTcxLDkgKzE1NzUsOSBAQAogCQkJcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQU19TVE9QOwogCQlpZiAocExlZDEtPmJMZWRPbikKLQkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJZWxzZQotCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCWJyZWFrOwpAQCAtMTU4NSw5ICsxNTg5LDkgQEAKIAkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CiAJCWlmIChwTGVkLT5iTGVkT24pCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkvKkxFRDEgc2V0dGluZ3MqLwpAQCAtMTU5OCwxNSArMTYwMiwxNSBAQAogCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQU19TVE9QX09WRVJMQVA7CiAJCXBMZWQxLT5CbGlua1RpbWVzID0gMTA7CiAJCWlmIChwTGVkMS0+YkxlZE9uKQotCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQllbHNlCi0JCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1BPV0VSX09GRjoKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcykgewogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKQEAgLTE2NjAsOCArMTY2NCw4IEBACiAJY2FzZSBMRURfQ1RMX0xJTks6CS8qIHNvbGlkIGJsdWUgKi8KIAkJaWYgKHBMZWQtPkN1cnJMZWRTdGF0ZSA9PSBMRURfU0NBTl9CTElOSykKIAkJCXJldHVybjsKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CkBAIC0xNjc5LDkgKzE2ODMsOSBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NDQU5fQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjQ7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KQEAgLTE2OTUsMTYgKzE2OTksMTYgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9UWFJYX0JMSU5LOwogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDI7CiAJCQlpZiAocExlZC0+YkxlZE9uKQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQkJZWxzZQotCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PTjsKIAkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCiAJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfUE9XRVJfT0ZGOgotCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKKwkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzKSB7CiAJCQlkZWxfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwpAQCAtMTczMSw4ICsxNzM1LDggQEAKIAljYXNlIExFRF9DVExfU0lURV9TVVJWRVk6CiAJCWlmIChJU19MRURfV1BTX0JMSU5LSU5HKHBMZWQpKQogCQkJCXJldHVybjsKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwotCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJbW9kX3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CkBAIC0xNzQ2LDkgKzE3NTAsOSBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1RYUlhfQkxJTks7CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMjsKIAkJCWlmIChwTGVkLT5iTGVkT24pCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CiAJCQllbHNlCi0JCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKIAkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0xNzYzLDkgKzE3NjcsOSBAQAogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTOwogCQkJaWYgKHBMZWQtPmJMZWRPbikKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKKwkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09GRjsKIAkJCWVsc2UKLQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOworCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT047CiAJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKwogCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CkBAIC0xNzc2LDE0ICsxNzgwLDE0IEBACiAJCQlkZWxfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9Ci0JCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKKwkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX1NUQVRFX09OOworCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1NUQVRFX09OOwogCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCiAJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1BPV0VSX09GRjoKLQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKLQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CisJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9TVEFURV9PRkY7CisJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfU1RBVEVfT0ZGOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewogCQkJZGVsX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKaW5kZXggZjI1YjM0Yy4uNjZmMGUwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKQEAgLTYwLDcgKzYwLDcgQEAKIAlfaW5pdF9xdWV1ZSgmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfYnVmX3F1ZXVlKTsKIAlwcmVjdnByaXYtPnBhbGxvY2F0ZWRfcmVjdl9idWYgPQogCQlremFsbG9jKE5SX1JFQ1ZCVUZGICogc2l6ZW9mKHN0cnVjdCByZWN2X2J1ZikgKyA0LCBHRlBfQVRPTUlDKTsKLQlpZiAocHJlY3Zwcml2LT5wYWxsb2NhdGVkX3JlY3ZfYnVmID09IE5VTEwpCisJaWYgKCFwcmVjdnByaXYtPnBhbGxvY2F0ZWRfcmVjdl9idWYpCiAJCXJldHVybiBfRkFJTDsKIAlwcmVjdnByaXYtPnByZWN2X2J1ZiA9IHByZWN2cHJpdi0+cGFsbG9jYXRlZF9yZWN2X2J1ZiArIDQgLQogCQkJICAgICAgKChhZGRyX3QpIChwcmVjdnByaXYtPnBhbGxvY2F0ZWRfcmVjdl9idWYpICYgMyk7CkBAIC0xNjMsNyArMTYzLDggQEAKIAlkcnZpbmZvX3N6ID0gKGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcwKSAmIDB4MDAwZjAwMDApID4+IDE2OwogCWRydmluZm9fc3ogPDw9IDM7CiAJLypUT0RPOgotCSAqIE9mZnNldCAwICovCisJICogT2Zmc2V0IDAKKwkgKi8KIAlwYXR0cmliLT5iZGVjcnlwdGVkID0gKChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCkgJiBCSVQoMjcpKSA+PiAyNykKIAkJCQkgPyAwIDogMTsKIAlwYXR0cmliLT5jcmNfZXJyID0gKGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcwKSAmIEJJVCgxNCkpID4+IDE0OwpAQCAtMjEwLDcgKzIxMSw4IEBACiAJY3VyZnJhZ251bSA9IDA7CiAJaWYgKGN1cmZyYWdudW0gIT0gcGZoZHItPmF0dHJpYi5mcmFnX251bSkgewogCQkvKnRoZSBmaXJzdCBmcmFnbWVudCBudW1iZXIgbXVzdCBiZSAwCi0JCSAqZnJlZSB0aGUgd2hvbGUgcXVldWUqLworCQkgKmZyZWUgdGhlIHdob2xlIHF1ZXVlCisJCSAqLwogCQlyODcxMl9mcmVlX3JlY3ZmcmFtZShwcmZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJcjg3MTJfZnJlZV9yZWN2ZnJhbWVfcXVldWUoZGVmcmFnX3EsIHBmcmVlX3JlY3ZfcXVldWUpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTIyNCwxOCArMjI2LDIxIEBACiAJCS8qY2hlY2sgdGhlIGZyYWdtZW50IHNlcXVlbmNlICAoMm5kIH5uIGZyYWdtZW50IGZyYW1lKSAqLwogCQlpZiAoY3VyZnJhZ251bSAhPSBwbmZoZHItPmF0dHJpYi5mcmFnX251bSkgewogCQkJLyogdGhlIGZyYWdtZW50IG51bWJlciBtdXN0IGluY3JlYXNlICAoYWZ0ZXIgZGVjYWNoZSkKLQkJCSAqIHJlbGVhc2UgdGhlIGRlZnJhZ19xICYgcHJmcmFtZSAqLworCQkJICogcmVsZWFzZSB0aGUgZGVmcmFnX3EgJiBwcmZyYW1lCisJCQkgKi8KIAkJCXI4NzEyX2ZyZWVfcmVjdmZyYW1lKHByZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOwogCQkJcjg3MTJfZnJlZV9yZWN2ZnJhbWVfcXVldWUoZGVmcmFnX3EsIHBmcmVlX3JlY3ZfcXVldWUpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJY3VyZnJhZ251bSsrOwogCQkvKiBjb3B5IHRoZSAybmR+biBmcmFnbWVudCBmcmFtZSdzIHBheWxvYWQgdG8gdGhlIGZpcnN0IGZyYWdtZW50Ci0JCSAqIGdldCB0aGUgMm5kfmxhc3QgZnJhZ21lbnQgZnJhbWUncyBwYXlsb2FkICovCisJCSAqIGdldCB0aGUgMm5kfmxhc3QgZnJhZ21lbnQgZnJhbWUncyBwYXlsb2FkCisJCSAqLwogCQl3bGFuaGRyX29mZnNldCA9IHBuZmhkci0+YXR0cmliLmhkcmxlbiArIHBuZmhkci0+YXR0cmliLml2X2xlbjsKIAkJcmVjdmZyYW1lX3B1bGwocG5leHRyZnJhbWUsIHdsYW5oZHJfb2Zmc2V0KTsKIAkJLyogYXBwZW5kICB0byBmaXJzdCBmcmFnbWVudCBmcmFtZSdzIHRhaWwgKGlmIHByaXZhY3kgZnJhbWUsCi0JCSAqIHB1bGwgdGhlIElDVikgKi8KKwkJICogcHVsbCB0aGUgSUNWKQorCQkgKi8KIAkJcmVjdmZyYW1lX3B1bGxfdGFpbChwcmZyYW1lLCBwZmhkci0+YXR0cmliLmljdl9sZW4pOwogCQltZW1jcHkocGZoZHItPnJ4X3RhaWwsIHBuZmhkci0+cnhfZGF0YSwgcG5maGRyLT5sZW4pOwogCQlyZWN2ZnJhbWVfcHV0KHByZnJhbWUsIHBuZmhkci0+bGVuKTsKQEAgLTI2OSw3ICsyNzQsNyBAQAogCWZyYWdudW0gPSBwZmhkci0+YXR0cmliLmZyYWdfbnVtOwogCXBzdGFfYWRkciA9IHBmaGRyLT5hdHRyaWIudGE7CiAJcHN0YSA9IHI4NzEyX2dldF9zdGFpbmZvKHBzdGFwcml2LCBwc3RhX2FkZHIpOwotCWlmIChwc3RhID09IE5VTEwpCisJaWYgKCFwc3RhKQogCQlwZGVmcmFnX3EgPSBOVUxMOwogCWVsc2UKIAkJcGRlZnJhZ19xID0gJnBzdGEtPnN0YV9yZWN2cHJpdi5kZWZyYWdfcTsKQEAgLTI3OCw3ICsyODMsOCBAQAogCQlwcnRuZnJhbWUgPSBwcmVjdl9mcmFtZTsvKmlzbid0IGEgZnJhZ21lbnQgZnJhbWUqLwogCWlmIChpc21mcmFnID09IDEpIHsKIAkJLyogMH4obi0xKSBmcmFnbWVudCBmcmFtZQotCQkgKiBlbnF1ZXVlIHRvIGRlZnJhZl9nICovCisJCSAqIGVucXVldWUgdG8gZGVmcmFmX2cKKwkJICovCiAJCWlmIChwZGVmcmFnX3EgIT0gTlVMTCkgewogCQkJaWYgKGZyYWdudW0gPT0gMCkgewogCQkJCS8qdGhlIGZpcnN0IGZyYWdtZW50Ki8KQEAgLTI5NCw3ICszMDAsOCBAQAogCQkJcHJ0bmZyYW1lID0gTlVMTDsKIAkJfSBlbHNlIHsKIAkJCS8qIGNhbid0IGZpbmQgdGhpcyB0YSdzIGRlZnJhZ19xdWV1ZSwgc28gZnJlZSB0aGlzCi0JCQkgKiByZWN2X2ZyYW1lICovCisJCQkgKiByZWN2X2ZyYW1lCisJCQkgKi8KIAkJCXI4NzEyX2ZyZWVfcmVjdmZyYW1lKHByZWN2X2ZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAkJCXBydG5mcmFtZSA9IE5VTEw7CiAJCX0KQEAgLTMwMiw3ICszMDksOCBAQAogCX0KIAlpZiAoKGlzbWZyYWcgPT0gMCkgJiYgKGZyYWdudW0gIT0gMCkpIHsKIAkJLyogdGhlIGxhc3QgZnJhZ21lbnQgZnJhbWUKLQkJICogZW5xdWV1ZSB0aGUgbGFzdCBmcmFnbWVudCAqLworCQkgKiBlbnF1ZXVlIHRoZSBsYXN0IGZyYWdtZW50CisJCSAqLwogCQlpZiAocGRlZnJhZ19xICE9IE5VTEwpIHsKIAkJCXBoZWFkID0gJnBkZWZyYWdfcS0+cXVldWU7CiAJCQlsaXN0X2FkZF90YWlsKCZwZmhkci0+bGlzdCwgcGhlYWQpOwpAQCAtMzExLDcgKzMxOSw4IEBACiAJCQlwcnRuZnJhbWUgPSBwcmVjdl9mcmFtZTsKIAkJfSBlbHNlIHsKIAkJCS8qIGNhbid0IGZpbmQgdGhpcyB0YSdzIGRlZnJhZ19xdWV1ZSwgc28gZnJlZSB0aGlzCi0JCQkgKiAgcmVjdl9mcmFtZSAqLworCQkJICogIHJlY3ZfZnJhbWUKKwkJCSAqLwogCQkJcjg3MTJfZnJlZV9yZWN2ZnJhbWUocHJlY3ZfZnJhbWUsIHBmcmVlX3JlY3ZfcXVldWUpOwogCQkJcHJ0bmZyYW1lID0gTlVMTDsKIAkJfQpAQCAtMzkxLDcgKzQwMCw4IEBACiAJCSAgIGV0aF90eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoX3R5cGUgIT0gRVRIX1BfSVBYKSB8fAogCQkgICAhbWVtY21wKHN1Yl9za2ItPmRhdGEsIGJyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpKSkgewogCQkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGFuZAotCQkJICogcmVwbGFjZSBFdGhlclR5cGUgKi8KKwkJCSAqIHJlcGxhY2UgRXRoZXJUeXBlCisJCQkgKi8KIAkJCXNrYl9wdWxsKHN1Yl9za2IsIFNOQVBfU0laRSk7CiAJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwYXR0cmliLT5zcmMsCiAJCQkJRVRIX0FMRU4pOwpAQCAtNTMwLDcgKzU0MCw4IEBACiAJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IHBhdHRyaWItPnNlcV9udW07CiAJfQogCS8qIFByZXBhcmUgaW5kaWNhdGlvbiBsaXN0IGFuZCBpbmRpY2F0aW9uLgotCSAqIENoZWNrIGlmIHRoZXJlIGlzIGFueSBwYWNrZXQgbmVlZCBpbmRpY2F0ZS4gKi8KKwkgKiBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcGFja2V0IG5lZWQgaW5kaWNhdGUuCisJICovCiAJd2hpbGUgKCFsaXN0X2VtcHR5KHBoZWFkKSkgewogCQlwcmZyYW1lID0gY29udGFpbmVyX29mKHBsaXN0LCB1bmlvbiByZWN2X2ZyYW1lLCB1Lmxpc3QpOwogCQlwYXR0cmliID0gJnByZnJhbWUtPnUuaGRyLmF0dHJpYjsKQEAgLTc1Nyw3ICs3NjgsOCBAQAogCQkJLyogTW9kaWZ5IHRoZSBSRiBSTkEgZ2FpbiB2YWx1ZSB0byAtNDAsIC0yMCwKIAkJCSAqIC0yLCAxNCBieSBKZW55dSdzIHN1Z2dlc3Rpb24KIAkJCSAqIE5vdGU6IGRpZmZlcmVudCBSRiB3aXRoIHRoZSBkaWZmZXJlbnQKLQkJCSAqIFJOQSBnYWluLiAqLworCQkJICogUk5BIGdhaW4uCisJCQkgKi8KIAkJCWNhc2UgMHgzOgogCQkJCXJ4X3B3cl9hbGwgPSAtNDAgLSAocGNja19idWYtPmNja19hZ2NfcnB0ICYKIAkJCQkJICAgICAweDNlKTsKQEAgLTg0Miw3ICs4NTQsOCBAQAogCQkJdG90YWxfcnNzaSArPSByc3NpOwogCQl9CiAJCS8qICgyKVBXREIsIEF2ZXJhZ2UgUFdEQiBjYWNsdWF0ZWQgYnkgaGFyZHdhcmUgKGZvcgotCQkgKiByYXRlIGFkYXB0aXZlKSAqLworCQkgKiByYXRlIGFkYXB0aXZlKQorCQkgKi8KIAkJcnhfcHdyX2FsbCA9ICgoKHBwaHlfaGVhZFtQSFlfU1RBVF9QV0RCX0FMTF9TSFRdKSA+PiAxKSAmIDB4N2YpCiAJCQkgICAgIC0gMTA2OwogCQlwd2RiX2FsbCA9IHF1ZXJ5X3J4X3B3cl9wZXJjZW50YWdlKHJ4X3B3cl9hbGwpOwpAQCAtODcwLDcgKzg4Myw4IEBACiAJfQogCS8qIFVJIEJTUyBMaXN0IHNpZ25hbCBzdHJlbmd0aChpbiBwZXJjZW50YWdlKSwgbWFrZSBpdCBnb29kIGxvb2tpbmcsCiAJICogZnJvbSAwfjEwMC4gSXQgaXMgYXNzaWduZWQgdG8gdGhlIEJTUyBMaXN0IGluCi0JICogR2V0VmFsdWVGcm9tQmVhY29uT3JQcm9iZVJzcCgpLiAqLworCSAqIEdldFZhbHVlRnJvbUJlYWNvbk9yUHJvYmVSc3AoKS4KKwkgKi8KIAlpZiAoYmNja19yYXRlKQogCQlwcmZyYW1lLT51Lmhkci5hdHRyaWIuc2lnbmFsX3N0cmVuZ3RoID0KIAkJCSAodTgpcjg3MTJfc2lnbmFsX3NjYWxlX21hcHBpbmcocHdkYl9hbGwpOwpAQCAtOTg1LDE1ICs5OTksMTUgQEAKIAl9CiAJcHJvY2Vzc19waHlfaW5mbyhwYWRhcHRlciwgcHJmcmFtZSk7CiAJcHJmcmFtZSA9IHI4NzEyX2RlY3J5cHRvcihwYWRhcHRlciwgcHJmcmFtZSk7Ci0JaWYgKHByZnJhbWUgPT0gTlVMTCkgeworCWlmICghcHJmcmFtZSkgewogCQlyZXR2YWwgPSBfRkFJTDsKIAkJZ290byBfZXhpdF9yZWN2X2Z1bmM7CiAJfQogCXByZnJhbWUgPSByODcxMl9yZWN2ZnJhbWVfY2hrX2RlZnJhZyhwYWRhcHRlciwgcHJmcmFtZSk7Ci0JaWYgKHByZnJhbWUgPT0gTlVMTCkKKwlpZiAoIXByZnJhbWUpCiAJCWdvdG8gX2V4aXRfcmVjdl9mdW5jOwogCXByZnJhbWUgPSByODcxMl9wb3J0Y3RybChwYWRhcHRlciwgcHJmcmFtZSk7Ci0JaWYgKHByZnJhbWUgPT0gTlVMTCkgeworCWlmICghcHJmcmFtZSkgewogCQlyZXR2YWwgPSBfRkFJTDsKIAkJZ290byBfZXhpdF9yZWN2X2Z1bmM7CiAJfQpAQCAtMTAyNywxMCArMTA0MSwxMiBAQAogCXRyYW5zZmVyX2xlbiA9IHBza2ItPmxlbjsKIAkvKiBUZXN0IHRocm91Z2hwdXQgd2l0aCBOZXRnZWFyIDM3MDAgKE5vIHNlY3VyaXR5KSB3aXRoIENoYXJpb3QgM1QzUgogCSAqIHBhaXJzLiBUaGUgcGFja2V0IGNvdW50IHdpbGwgYmUgYSBiaWcgbnVtYmVyIHNvIHRoYXQgdGhlIGNvbnRhaW5pbmcKLQkgKiBwYWNrZXQgd2lsbCBlZmZlY3QgdGhlIFJ4IHJlb3JkZXJpbmcuICovCisJICogcGFja2V0IHdpbGwgZWZmZWN0IHRoZSBSeCByZW9yZGVyaW5nLgorCSAqLwogCWlmICh0cmFuc2Zlcl9sZW4gPCBwa3RfbGVuKSB7CiAJCS8qIEluIHRoaXMgY2FzZSwgaXQgbWVhbnMgdGhlIE1BWF9SRUNWQlVGX1NaIGlzIHRvbyBzbWFsbCB0bwotCQkgKiBnZXQgdGhlIGRhdGEgZnJvbSA4NzEydS4gKi8KKwkJICogZ2V0IHRoZSBkYXRhIGZyb20gODcxMnUuCisJCSAqLwogCQlyZXR1cm4gX0ZBSUw7CiAJfQogCWRvIHsKQEAgLTEwNDksNyArMTA2NSw3IEBACiAJCWlmICgobGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzApID4+IDIzKSAmIDB4MDEpCiAJCQlzaGlmdF9zeiA9IDI7CiAJCXByZWN2ZnJhbWUgPSByODcxMl9hbGxvY19yZWN2ZnJhbWUocGZyZWVfcmVjdl9xdWV1ZSk7Ci0JCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCisJCWlmICghcHJlY3ZmcmFtZSkKIAkJCWdvdG8gIF9leGl0X3JlY3ZidWYycmVjdmZyYW1lOwogCQlJTklUX0xJU1RfSEVBRCgmcHJlY3ZmcmFtZS0+dS5oZHIubGlzdCk7CiAJCXByZWN2ZnJhbWUtPnUuaGRyLnByZWN2YnVmID0gTlVMTDsgLypjYW4ndCBhY2Nlc3MgdGhlIHByZWN2YnVmKi8KQEAgLTEwNTcsMTQgKzEwNzMsMTYgQEAKIAkJdG1wX2xlbiA9IHBrdF9sZW4gKyBkcnZpbmZvX3N6ICsgUlhERVNDX1NJWkU7CiAJCXBrdF9vZmZzZXQgPSAodTE2KXJvdW5kX3VwKHRtcF9sZW4sIDEyOCk7CiAJCS8qIGZvciBmaXJzdCBmcmFnbWVudCBwYWNrZXQsIGRyaXZlciBuZWVkIGFsbG9jYXRlIDE1MzYgKwotCQkgKiBkcnZpbmZvX3N6ICsgUlhERVNDX1NJWkUgdG8gZGVmcmFnIHBhY2tldC4gKi8KKwkJICogZHJ2aW5mb19zeiArIFJYREVTQ19TSVpFIHRvIGRlZnJhZyBwYWNrZXQuCisJCSAqLwogCQlpZiAoKG1mID09IDEpICYmIChmcmFnID09IDApKQogCQkJLyoxNjU4KzY9MTY2NCwgMTY2NCBpcyAxMjggYWxpZ25tZW50LiovCiAJCQlhbGxvY19zeiA9IG1heF90KHUxNiwgdG1wX2xlbiwgMTY1OCk7CiAJCWVsc2UKIAkJCWFsbG9jX3N6ID0gdG1wX2xlbjsKIAkJLyogMiBpcyBmb3IgSVAgaGVhZGVyIDQgYnl0ZXMgYWxpZ25tZW50IGluIFFvUyBwYWNrZXQgY2FzZS4KLQkJICogNCBpcyBmb3Igc2tiLT5kYXRhIDQgYnl0ZXMgYWxpZ25tZW50LiAqLworCQkgKiA0IGlzIGZvciBza2ItPmRhdGEgNCBieXRlcyBhbGlnbm1lbnQuCisJCSAqLwogCQlhbGxvY19zeiArPSA2OwogCQlwa3RfY29weSA9IG5ldGRldl9hbGxvY19za2IocGFkYXB0ZXItPnBuZXRkZXYsIGFsbG9jX3N6KTsKIAkJaWYgKHBrdF9jb3B5KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5oCmluZGV4IGZkOWUzZmMuLjBiMGMyNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5oCkBAIC02MSw3ICs2MSw4IEBACiBzdHJ1Y3QgcGh5X2Nja19yeF9zdGF0dXMgewogCS8qIEZvciBDQ0sgcmF0ZSBkZXNjcmlwdG9yLiBUaGlzIGlzIGEgdW5zaWduZWQgODoxIHZhcmlhYmxlLgogCSAqIExTQiBiaXQgcHJlc2VudCAwLjUuIEFuZCBNU0IgNyBidHMgcHJlc2VudCBhIHNpZ25lZCB2YWx1ZS4KLQkgKiBSYW5nZSBmcm9tIC02NH4rNjMuNS4gKi8KKwkgKiBSYW5nZSBmcm9tIC02NH4rNjMuNS4KKwkgKi8KIAl1OAlhZGNfcHdkYl9YWzRdOwogCXU4CXNxX3JwdDsKIAl1OAljY2tfYWdjX3JwdDsKQEAgLTEwMyw3ICsxMDQsNiBAQAogCXN0cnVjdCBfYWRhcHRlciAgKmFkYXB0ZXI7CiAJc3RydWN0IHVyYiAqcHVyYjsKIAlfcGt0ICpwc2tiOwotCXU4IHJldXNlOwogCXU4ICBpcnBfcGVuZGluZzsKIAl1MzIgIHRyYW5zZmVyX2xlbjsKIAl1aW50ICBsZW47CkBAIC0xMTYsMTMgKzExNiwxMyBAQAogfTsKIAogLyoKLQloZWFkICAtLS0tLT4KLQkJZGF0YSAgLS0tLS0+Ci0JCQlwYXlsb2FkCi0JCXRhaWwgIC0tLS0tPgotCWVuZCAgIC0tLS0tPgotCWxlbiA9ICh1bnNpZ25lZCBpbnQgKSh0YWlsIC0gZGF0YSk7Ci0qLworICoJaGVhZCAgLS0tLS0+CisgKgkJZGF0YSAgLS0tLS0+CisgKgkJCXBheWxvYWQKKyAqCQl0YWlsICAtLS0tLT4KKyAqCWVuZCAgIC0tLS0tPgorICoJbGVuID0gKHVuc2lnbmVkIGludCApKHRhaWwgLSBkYXRhKTsKKyAqLwogc3RydWN0IHJlY3ZfZnJhbWVfaGRyIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJX3BrdAkqcGt0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zcGVjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3NwZWMuaAppbmRleCBhZjExYjQ0Li41MWUwNDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3NwZWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3NwZWMuaApAQCAtODMsNyArODMsOCBAQAogCiAjZGVmaW5lIENNRF9BRERSX01BUFBJTkdfU0hJRlQJCTIJLypTRElPIENNRCBBRERSIE1BUFBJTkcsCiAJCQkJCQkgKnNoaWZ0IDIgYml0IGZvciBtYXRjaAotCQkJCQkJICogb2Zmc2V0WzE0OjJdKi8KKwkJCQkJCSAqIG9mZnNldFsxNDoyXQorCQkJCQkJICovCiAKIC8qT2Zmc2V0IGZvciBTRElPIExPQ0FMKi8KICNkZWZpbmUJT0ZGU0VUX1NESU9fTE9DQUwJCQkJMHgwRkZGCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3N5c2NmZ19iaXRkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc3lzY2ZnX2JpdGRlZi5oCmluZGV4IGVlZDA5YzguLjJlNjZkMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc3lzY2ZnX2JpdGRlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc3lzY2ZnX2JpdGRlZi5oCkBAIC02OCwxMSArNjgsMTMgQEAKICNkZWZpbmUgU1lTX0NMS1NFTAkJQklUKFNZU19DTEtTRUxfU0hUKSAvKiBTeXN0ZW0gQ2xvY2sgODBNSHoqLwogI2RlZmluZSBQU19DTEtTRUxfU0hUCQkxCiAjZGVmaW5lIFBTX0NMS1NFTAkJQklUKFBTX0NMS1NFTF9TSFQpIC8qU3lzdGVtIHBvd2VyIHNhdmUKLQkJCQkJCSAgICAqIGNsb2NrIHNlbGVjdC4qLworCQkJCQkJICAgICogY2xvY2sgc2VsZWN0LgorCQkJCQkJICAgICovCiAjZGVmaW5lIENQVV9DTEtTRUxfU0hUCQkyCiAjZGVmaW5lIENQVV9DTEtTRUwJCUJJVChDUFVfQ0xLU0VMX1NIVCkgLyogU3lzdGVtIENsb2NrIHNlbGVjdCwKIAkJCQkJCSAgICAgKiAxOiBBRkUgc291cmNlLAotCQkJCQkJICAgICAqIDA6IFN5c3RlbSBjbG9jayhMLUJ1cykqLworCQkJCQkJICAgICAqIDA6IFN5c3RlbSBjbG9jayhMLUJ1cykKKwkJCQkJCSAgICAgKi8KICNkZWZpbmUgSU5UMzJLX0VOX1NIVAkJMwogI2RlZmluZSBJTlQzMktfRU4JCUJJVChJTlQzMktfRU5fU0hUKQogI2RlZmluZSBNQUNTTFBfU0hUCQk0CkBAIC04NSwxMCArODcsMTIgQEAKICNkZWZpbmUgUklOR19DTEtfRU4JCUJJVChSSU5HX0NMS19FTl9TSFQpCiAjZGVmaW5lIFNXSFdfU0VMX1NIVAkJMTQKICNkZWZpbmUgU1dIV19TRUwJCUJJVChTV0hXX1NFTF9TSFQpIC8qIExvYWQgZG9uZSwKLQkJCQkJCSAgICogY29udHJvbCBwYXRoIHN3aXRjaC4qLworCQkJCQkJICAgKiBjb250cm9sIHBhdGggc3dpdGNoLgorCQkJCQkJICAgKi8KICNkZWZpbmUgRldIV19TRUxfU0hUCQkxNQogI2RlZmluZSBGV0hXX1NFTAkJQklUKEZXSFdfU0VMX1NIVCkgLyogU2xlZXAgZXhpdCwKLQkJCQkJCSAgICogY29udHJvbCBwYXRoIHN3aXRjaC4qLworCQkJCQkJICAgKiBjb250cm9sIHBhdGggc3dpdGNoLgorCQkJCQkJICAgKi8KIAogLyo5MzQ2Q1IqLwogI2RlZmluZQlfVlBESURYX01TSwkJMHhGRjAwCkBAIC0xMTgsMTAgKzEyMiwxMiBAQAogI2RlZmluZQlBRkVfTUlTQ19FMzJfRU4JCUJJVChBRkVfTUlTQ19FMzJfRU5fU0hUKQogI2RlZmluZQlBRkVfTUlTQ19NQkVOX1NIVAkxCiAjZGVmaW5lCUFGRV9NSVNDX01CRU4JCUJJVChBRkVfTUlTQ19NQkVOX1NIVCkvKiBFbmFibGUgQUZFIE1hY3JvCi0JCQkJCQkgICAgICAgKiBCbG9jaydzIE1iaWFzLiovCisJCQkJCQkgICAgICAgKiBCbG9jaydzIE1iaWFzLgorCQkJCQkJICAgICAgICovCiAjZGVmaW5lCUFGRV9NSVNDX0JHRU5fU0hUCTAKICNkZWZpbmUJQUZFX01JU0NfQkdFTgkJQklUKEFGRV9NSVNDX0JHRU5fU0hUKS8qIEVuYWJsZSBBRkUgTWFjcm8KLQkJCQkJCSAgICAgICAqIEJsb2NrJ3MgQmFuZGdhcC4qLworCQkJCQkJICAgICAgICogQmxvY2sncyBCYW5kZ2FwLgorCQkJCQkJICAgICAgICovCiAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xNDksMTAgKzE1NSwxMiBAQAogCiAvKiBFRlVTRV9DVFJMKi8KICNkZWZpbmUgRUZfRkxBRwkJCUJJVCgzMSkJCS8qIEFjY2VzcyBGbGFnLCBXcml0ZToxOwotCQkJCQkJICoJICAgICAgICBSZWFkOjAqLworCQkJCQkJICoJICAgICAgICBSZWFkOjAKKwkJCQkJCSAqLwogI2RlZmluZSBFRl9QR1BECQkJMHg3MDAwMDAwMAkvKiBFLWZ1c2UgUHJvZ3JhbSB0aW1lKi8KICNkZWZpbmUgRUZfUkRUCQkJMHgwRjAwMDAwMAkvKiBFLWZ1c2UgcmVhZCB0aW1lOiBpbiB0aGUKLQkJCQkJCSAqIHVuaXQgb2YgY3ljbGUgdGltZSovCisJCQkJCQkgKiB1bml0IG9mIGN5Y2xlIHRpbWUKKwkJCQkJCSAqLwogI2RlZmluZSBFRl9QRE5fRU4JCUJJVCgxOSkJCS8qIEVGdXNlIFBvd2VyIGRvd24gZW5hYmxlKi8KICNkZWZpbmUgQUxEX0VOCQkJQklUKDE4KQkJLyogQXV0b2xvYWQgRW5hYmxlKi8KICNkZWZpbmUgRUZfQUREUgkJCTB4MDAwM0ZGMDAJLyogQWNjZXNzIEFkZHJlc3MqLwpAQCAtMTY0LDcgKzE3Miw4IEBACiAvKiBFRlVTRV9DTEtfQ1RSTCovCiAjZGVmaW5lIEVGVVNFX0NMS19FTgkJQklUKDEpCQkvKiBFLUZ1c2UgQ2xvY2sgRW5hYmxlKi8KICNkZWZpbmUgRUZVU0VfQ0xLX1NFTAkJQklUKDApCQkvKiBFLUZ1c2UgQ2xvY2sgU2VsZWN0LAotCQkJCQkJICogMDo1MDBLLCAxOjQwTSovCisJCQkJCQkgKiAwOjUwMEssIDE6NDBNCisJCQkJCQkgKi8KIAogI2VuZGlmCS8qX19SVEw4NzEyX1NZU0NGR19CSVRERUZfSF9fKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3htaXQuYwppbmRleCA3ZTBiOTQ1Li5jNGYwM2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3htaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3htaXQuYwpAQCAtNTM1LDcgKzUzNSw4IEBACiAJCSAqIHNlcW51bSBwZXIgdGlkLiBhYm91dCB1c2IgdXNpbmcgNC1lbmRwb2ludCwgcXNlbCBwb2ludHMgb3V0CiAJCSAqIHRoZSBjb3JyZWN0IG1hcHBpbmcgYmV0d2VlbiBBQyZFbmRwb2ludCwKIAkJICogdGhlIHB1cnBvc2UgaXMgdGhhdCBjb3JyZWN0IG1hcHBpbmcgbGV0cyB0aGUgTUFDIHJlbGVhc2UKLQkJICogdGhlIEFDIFF1ZXVlIGxpc3QgY29ycmVjdGx5LiAqLworCQkgKiB0aGUgQUMgUXVldWUgbGlzdCBjb3JyZWN0bHkuCisJCSAqLwogCQlwdHhkZXNjLT50eGR3MyA9IGNwdV90b19sZTMyKChwYXR0cmliLT5wcmlvcml0eSA8PCBTRVFfU0hUKSAmCiAJCQkJIDB4MGZmZjAwMDApOwogCQlpZiAoKHBhdHRyaWItPmV0aGVyX3R5cGUgIT0gMHg4ODhlKSAmJgpAQCAtNTg2LDcgKzU4Nyw4IEBACiAJCSAqIHBlciB0aWQuIGFib3V0IHVzYiB1c2luZyA0LWVuZHBvaW50LCBxc2VsIHBvaW50cyBvdXQgdGhlCiAJCSAqIGNvcnJlY3QgbWFwcGluZyBiZXR3ZWVuIEFDJkVuZHBvaW50LAogCQkgKiB0aGUgcHVycG9zZSBpcyB0aGF0IGNvcnJlY3QgbWFwcGluZyBsZXQgdGhlIE1BQyByZWxlYXNlcwotCQkgKiB0aGUgQUMgUXVldWUgbGlzdCBjb3JyZWN0bHkuICovCisJCSAqIHRoZSBBQyBRdWV1ZSBsaXN0IGNvcnJlY3RseS4KKwkJICovCiAJCXB0eGRlc2MtPnR4ZHczID0gY3B1X3RvX2xlMzIoKHBhdHRyaWItPnByaW9yaXR5IDw8IFNFUV9TSFQpICYKIAkJCQkJICAgICAgMHgwZmZmMDAwMCk7CiAJCS8qIG9mZnNldCAxNiAqLwpAQCAtNjI3LDcgKzYyOSw3IEBACiAKIAlwaHd4bWl0cyA9IHB4bWl0cHJpdi0+aHd4bWl0czsKIAlod2VudHJ5ID0gcHhtaXRwcml2LT5od3htaXRfZW50cnk7Ci0JaWYgKHB4bWl0YnVmID09IE5VTEwpIHsKKwlpZiAoIXB4bWl0YnVmKSB7CiAJCXB4bWl0YnVmID0gcjg3MTJfYWxsb2NfeG1pdGJ1ZihweG1pdHByaXYpOwogCQlpZiAoIXB4bWl0YnVmKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtNjg2LDcgKzY4OCw4IEBACiAJCQkJcmVzID0gcjg3MTJfeG1pdGZyYW1lX2NvYWxlc2NlKHBhZGFwdGVyLAogCQkJCQlweG1pdGZyYW1lLT5wa3QsIHB4bWl0ZnJhbWUpOwogCQkJLyogYWx3YXlzIHJldHVybiBuZGlzX3BhY2tldCBhZnRlcgotCQkJICogcjg3MTJfeG1pdGZyYW1lX2NvYWxlc2NlICovCisJCQkgKiByODcxMl94bWl0ZnJhbWVfY29hbGVzY2UKKwkJCSAqLwogCQkJcjg3MTJfeG1pdF9jb21wbGV0ZShwYWRhcHRlciwgcHhtaXRmcmFtZSk7CiAJCX0KIAkJaWYgKHJlcyA9PSBfU1VDQ0VTUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5jCmluZGV4IGFlZDAzY2YuLmI3ZWU1ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYwpAQCAtNTEsMTQgKzUxLDE0IEBACiAjaW5jbHVkZSAibWxtZV9vc2RlcC5oIgogCiAvKgotQ2FsbGVyIGFuZCB0aGUgcjg3MTJfY21kX3RocmVhZCBjYW4gcHJvdGVjdCBjbWRfcSBieSBzcGluX2xvY2suCi1ObyBpcnFzYXZlIGlzIG5lY2Vzc2FyeS4KLSovCisgKiBDYWxsZXIgYW5kIHRoZSByODcxMl9jbWRfdGhyZWFkIGNhbiBwcm90ZWN0IGNtZF9xIGJ5IHNwaW5fbG9jay4KKyAqIE5vIGlycXNhdmUgaXMgbmVjZXNzYXJ5LgorICovCiAKIHN0YXRpYyBzaW50IF9pbml0X2NtZF9wcml2KHN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYpCiB7Ci0Jc2VtYV9pbml0KCYocGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKSwgMCk7Ci0Jc2VtYV9pbml0KCYocGNtZHByaXYtPnRlcm1pbmF0ZV9jbWR0aHJlYWRfc2VtYSksIDApOworCWluaXRfY29tcGxldGlvbigmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKTsKKwlpbml0X2NvbXBsZXRpb24oJnBjbWRwcml2LT50ZXJtaW5hdGVfY21kdGhyZWFkX2NvbXApOwogCiAJX2luaXRfcXVldWUoJihwY21kcHJpdi0+Y21kX3F1ZXVlKSk7CiAKQEAgLTY2LDEzICs2NiwxMyBAQAogCXBjbWRwcml2LT5jbWRfc2VxID0gMTsKIAlwY21kcHJpdi0+Y21kX2FsbG9jYXRlZF9idWYgPSBrbWFsbG9jKE1BWF9DTURTWiArIENNREJVRkZfQUxJR05fU1osCiAJCQkJCSAgICAgIEdGUF9BVE9NSUMpOwotCWlmIChwY21kcHJpdi0+Y21kX2FsbG9jYXRlZF9idWYgPT0gTlVMTCkKKwlpZiAoIXBjbWRwcml2LT5jbWRfYWxsb2NhdGVkX2J1ZikKIAkJcmV0dXJuIF9GQUlMOwogCXBjbWRwcml2LT5jbWRfYnVmID0gcGNtZHByaXYtPmNtZF9hbGxvY2F0ZWRfYnVmICArICBDTURCVUZGX0FMSUdOX1NaIC0KIAkJCSAgICAoKGFkZHJfdCkocGNtZHByaXYtPmNtZF9hbGxvY2F0ZWRfYnVmKSAmCiAJCQkgICAgKENNREJVRkZfQUxJR05fU1ogLSAxKSk7CiAJcGNtZHByaXYtPnJzcF9hbGxvY2F0ZWRfYnVmID0ga21hbGxvYyhNQVhfUlNQU1ogKyA0LCBHRlBfQVRPTUlDKTsKLQlpZiAocGNtZHByaXYtPnJzcF9hbGxvY2F0ZWRfYnVmID09IE5VTEwpCisJaWYgKCFwY21kcHJpdi0+cnNwX2FsbG9jYXRlZF9idWYpCiAJCXJldHVybiBfRkFJTDsKIAlwY21kcHJpdi0+cnNwX2J1ZiA9IHBjbWRwcml2LT5yc3BfYWxsb2NhdGVkX2J1ZiAgKyAgNCAtCiAJCQkgICAgKChhZGRyX3QpKHBjbWRwcml2LT5yc3BfYWxsb2NhdGVkX2J1ZikgJiAzKTsKQEAgLTg4LDcgKzg4LDcgQEAKIAlwZXZ0cHJpdi0+ZXZlbnRfc2VxID0gMDsKIAlwZXZ0cHJpdi0+ZXZ0X2FsbG9jYXRlZF9idWYgPSBrbWFsbG9jKE1BWF9FVlRTWiArIDQsIEdGUF9BVE9NSUMpOwogCi0JaWYgKHBldnRwcml2LT5ldnRfYWxsb2NhdGVkX2J1ZiA9PSBOVUxMKQorCWlmICghcGV2dHByaXYtPmV2dF9hbGxvY2F0ZWRfYnVmKQogCQlyZXR1cm4gX0ZBSUw7CiAJcGV2dHByaXYtPmV2dF9idWYgPSBwZXZ0cHJpdi0+ZXZ0X2FsbG9jYXRlZF9idWYgICsgIDQgLQogCQkJICAgICgoYWRkcl90KShwZXZ0cHJpdi0+ZXZ0X2FsbG9jYXRlZF9idWYpICYgMyk7CkBAIC0xMTAsMjAgKzExMCwyMCBAQAogfQogCiAvKgotQ2FsbGluZyBDb250ZXh0OgotCi1fZW5xdWV1ZV9jbWQgY2FuIG9ubHkgYmUgY2FsbGVkIGJldHdlZW4ga2VybmVsIHRocmVhZCwKLXNpbmNlIG9ubHkgc3Bpbl9sb2NrIGlzIHVzZWQuCi0KLUlTUi9DYWxsLUJhY2sgZnVuY3Rpb25zIGNhbid0IGNhbGwgdGhpcyBzdWItZnVuY3Rpb24uCi0KLSovCisgKiBDYWxsaW5nIENvbnRleHQ6CisgKgorICogX2VucXVldWVfY21kIGNhbiBvbmx5IGJlIGNhbGxlZCBiZXR3ZWVuIGtlcm5lbCB0aHJlYWQsCisgKiBzaW5jZSBvbmx5IHNwaW5fbG9jayBpcyB1c2VkLgorICoKKyAqIElTUi9DYWxsLUJhY2sgZnVuY3Rpb25zIGNhbid0IGNhbGwgdGhpcyBzdWItZnVuY3Rpb24uCisgKgorICovCiAKIHN0YXRpYyBzaW50IF9lbnF1ZXVlX2NtZChzdHJ1Y3QgIF9fcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgY21kX29iaiAqb2JqKQogewogCXVuc2lnbmVkIGxvbmcgaXJxTDsKIAotCWlmIChvYmogPT0gTlVMTCkKKwlpZiAoIW9iaikKIAkJcmV0dXJuIF9TVUNDRVNTOwogCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+bG9jaywgaXJxTCk7CiAJbGlzdF9hZGRfdGFpbCgmb2JqLT5saXN0LCAmcXVldWUtPnF1ZXVlKTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogCWlmIChwY21kcHJpdi0+cGFkYXB0ZXItPmVlcHJvbXByaXYuYmF1dG9sb2FkX2ZhaWxfZmxhZykKIAkJcmV0dXJuIF9GQUlMOwogCXJlcyA9IF9lbnF1ZXVlX2NtZCgmcGNtZHByaXYtPmNtZF9xdWV1ZSwgb2JqKTsKLQl1cCgmcGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKTsKKwljb21wbGV0ZSgmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKTsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xODEsNyArMTgxLDcgQEAKIAl1bnNpZ25lZCBsb25nIGlycUw7CiAJc3RydWN0ICBfX3F1ZXVlICpxdWV1ZTsKIAotCWlmIChvYmogPT0gTlVMTCkKKwlpZiAoIW9iaikKIAkJcmV0dXJuIF9TVUNDRVNTOwogCWlmIChwY21kcHJpdi0+cGFkYXB0ZXItPmVlcHJvbXByaXYuYmF1dG9sb2FkX2ZhaWxfZmxhZykKIAkJcmV0dXJuIF9GQUlMOwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5sb2NrLCBpcnFMKTsKIAlsaXN0X2FkZF90YWlsKCZvYmotPmxpc3QsICZxdWV1ZS0+cXVldWUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF1ZXVlLT5sb2NrLCBpcnFMKTsKLQl1cCgmcGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKTsKKwljb21wbGV0ZSgmcGNtZHByaXYtPmNtZF9xdWV1ZV9jb21wKTsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKQEAgLTIxMSwxMSArMjExLDExIEBACiB9CiAKIC8qCi1yODcxMl9zaXRlc3VydmV5X2NtZCh+KQotCSMjIyBOT1RFOiMjIyMgKCEhISEpCi0JTVVTVCBUQUtFIENBUkUgVEhBVCBCRUZPUkUgQ0FMTElORyBUSElTIEZVTkMsCi0JIFlPVSBTSE9VTEQgSEFWRSBMT0NLRUQgcG1sbWVwcml2LT5sb2NrCi0qLworICoJcjg3MTJfc2l0ZXN1cnZleV9jbWQofikKKyAqCQkjIyMgTk9URTojIyMjICghISEhKQorICoJCU1VU1QgVEFLRSBDQVJFIFRIQVQgQkVGT1JFIENBTExJTkcgVEhJUyBGVU5DLAorICoJCVlPVSBTSE9VTEQgSEFWRSBMT0NLRUQgcG1sbWVwcml2LT5sb2NrCisgKi8KIHU4IHI4NzEyX3NpdGVzdXJ2ZXlfY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsCiAJCQlzdHJ1Y3QgbmRpc184MDJfMTFfc3NpZCAqcHNzaWQpCiB7CkBAIC00NzcsNyArNDc3LDcgQEAKIAkJfQogCX0KIAlwc2VjbmV0d29yayA9ICZwc2VjdXJpdHlwcml2LT5zZWNfYnNzOwotCWlmIChwc2VjbmV0d29yayA9PSBOVUxMKSB7CisJaWYgKCFwc2VjbmV0d29yaykgewogCQlrZnJlZShwY21kKTsKIAkJcmV0dXJuIF9GQUlMOwogCX0KQEAgLTQ5MSw4ICs0OTEsOSBAQAogCQltZW1jcHkoJnBzZWN1cml0eXByaXYtPmF1dGhlbnRpY2F0b3JfaWVbMV0sCiAJCQkmcHNlY25ldHdvcmstPklFc1sxMl0sICgyNTYgLSAxKSk7CiAJcHNlY25ldHdvcmstPklFTGVuZ3RoID0gMDsKLQkvKiBJZiB0aGUgZHJpdmVyIHdhbnRzIHRvIHVzZSB0aGUgYnNzaWQgdG8gY3JlYXRlIHRoZSBjb25uZWN0aW9uLgotCSAqIElmIG5vdCwgIHdlIGNvcHkgdGhlIGNvbm5lY3RpbmcgQVAncyBNQUMgYWRkcmVzcyB0byBpdCBzbyB0aGF0CisJLyoKKwkgKiBJZiB0aGUgZHJpdmVyIHdhbnRzIHRvIHVzZSB0aGUgYnNzaWQgdG8gY3JlYXRlIHRoZSBjb25uZWN0aW9uLgorCSAqIElmIG5vdCwgd2UgY29weSB0aGUgY29ubmVjdGluZyBBUCdzIE1BQyBhZGRyZXNzIHRvIGl0IHNvIHRoYXQKIAkgKiB0aGUgZHJpdmVyIGp1c3QgaGFzIHRoZSBic3NpZCBpbmZvcm1hdGlvbiBmb3IgUE1LSURMaXN0IHNlYXJjaGluZy4KIAkgKi8KIAlpZiAoIXBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQpCkBAIC01MTksNyArNTIwLDggQEAKIAkJfQogCX0KIAlpZiAocHJlZ2lzdHJ5cHJpdi0+aHRfZW5hYmxlKSB7Ci0JCS8qIEZvciBXRVAgbW9kZSwgd2Ugd2lsbCB1c2UgdGhlIGJnIG1vZGUgdG8gZG8gdGhlIGNvbm5lY3Rpb24KKwkJLyoKKwkJICogRm9yIFdFUCBtb2RlLCB3ZSB3aWxsIHVzZSB0aGUgYmcgbW9kZSB0byBkbyB0aGUgY29ubmVjdGlvbgogCQkgKiB0byBhdm9pZCBzb21lIElPVCBpc3N1ZXMsIGVzcGVjaWFsbHkgZm9yIFJlYWx0ZWsgODE5MnUKIAkJICogU29mdEFQLgogCQkgKi8KQEAgLTg4MiwxNiArODg0LDE2IEBACiAJCWlmICghcHN0YSkgewogCQkJcHN0YSA9IHI4NzEyX2FsbG9jX3N0YWluZm8oJnBhZGFwdGVyLT5zdGFwcml2LAogCQkJCQkJICAgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwotCQkJaWYgKHBzdGEgPT0gTlVMTCkKKwkJCWlmICghcHN0YSkKIAkJCQlnb3RvIGNyZWF0ZWJzc19jbWRfZmFpbDsKIAkJfQogCQlyODcxMl9pbmRpY2F0ZV9jb25uZWN0KHBhZGFwdGVyKTsKIAl9IGVsc2UgewogCQlwd2xhbiA9IF9yODcxMl9hbGxvY19uZXR3b3JrKHBtbG1lcHJpdik7Ci0JCWlmIChwd2xhbiA9PSBOVUxMKSB7CisJCWlmICghcHdsYW4pIHsKIAkJCXB3bGFuID0gcjg3MTJfZ2V0X29sZGVzdF93bGFuX25ldHdvcmsoCiAJCQkJJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSk7Ci0JCQlpZiAocHdsYW4gPT0gTlVMTCkKKwkJCWlmICghcHdsYW4pCiAJCQkJZ290byBjcmVhdGVic3NfY21kX2ZhaWw7CiAJCQlwd2xhbi0+bGFzdF9zY2FubmVkID0gamlmZmllczsKIAkJfSBlbHNlCkBAIC05MDQsOCArOTA2LDEwIEBACiAJCQkocjg3MTJfZ2V0X3dsYW5fYnNzaWRfZXhfc3oocG5ldHdvcmspKSk7CiAJCWlmIChwbWxtZXByaXYtPmZ3X3N0YXRlICYgX0ZXX1VOREVSX0xJTktJTkcpCiAJCQlwbWxtZXByaXYtPmZ3X3N0YXRlIF49IF9GV19VTkRFUl9MSU5LSU5HOwotCQkvKiB3ZSB3aWxsIHNldCBfRldfTElOS0VEIHdoZW4gdGhlcmUgaXMgb25lIG1vcmUgc2F0IHRvCi0JCSAqIGpvaW4gdXMgKHN0YXNzb2NfZXZlbnRfY2FsbGJhY2spICovCisJCS8qCisJCSAqIHdlIHdpbGwgc2V0IF9GV19MSU5LRUQgd2hlbiB0aGVyZSBpcyBvbmUgbW9yZSBzYXQgdG8KKwkJICogam9pbiB1cyAoc3Rhc3NvY19ldmVudF9jYWxsYmFjaykKKwkJICovCiAJfQogY3JlYXRlYnNzX2NtZF9mYWlsOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtbG1lcHJpdi0+bG9jaywgaXJxTCk7CkBAIC05MjEsNyArOTI1LDcgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSByODcxMl9nZXRfc3RhaW5mbyhwc3RhcHJpdiwKIAkJCQkJCSAgcHNldHN0YWtleV9yc3AtPmFkZHIpOwogCi0JaWYgKHBzdGEgPT0gTlVMTCkKKwlpZiAoIXBzdGEpCiAJCWdvdG8gZXhpdDsKIAlwc3RhLT5haWQgPSBwc3RhLT5tYWNfaWQgPSBwc2V0c3Rha2V5X3JzcC0+a2V5aWQ7IC8qQ0FNX0lEKENBTV9FTlRSWSkqLwogZXhpdDoKQEAgLTk0MSw3ICs5NDUsNyBAQAogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IHI4NzEyX2dldF9zdGFpbmZvKHBzdGFwcml2LAogCQkJCQkJICBwYXNzb2NzdGFfcGFybS0+YWRkcik7CiAKLQlpZiAocHN0YSA9PSBOVUxMKQorCWlmICghcHN0YSkKIAkJcmV0dXJuOwogCXBzdGEtPmFpZCA9IHBzdGEtPm1hY19pZCA9IHBhc3NvY3N0YV9yc3AtPmNhbV9pZDsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG1sbWVwcml2LT5sb2NrLCBpcnFMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5oCmluZGV4IGU0YTJhNTAuLjMyODRkY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuaApAQCAtNTAsOCArNTAsOCBAQAogfTsKIAogc3RydWN0IGNtZF9wcml2IHsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGNtZF9xdWV1ZV9zZW1hOwotCXN0cnVjdCBzZW1hcGhvcmUgdGVybWluYXRlX2NtZHRocmVhZF9zZW1hOworCXN0cnVjdCBjb21wbGV0aW9uIGNtZF9xdWV1ZV9jb21wOworCXN0cnVjdCBjb21wbGV0aW9uIHRlcm1pbmF0ZV9jbWR0aHJlYWRfY29tcDsKIAlzdHJ1Y3QgIF9fcXVldWUJY21kX3F1ZXVlOwogCXU4IGNtZF9zZXE7CiAJdTggKmNtZF9idWY7CS8qc2hhbGwgYmUgbm9uLXBhZ2VkLCBhbmQgNCBieXRlcyBhbGlnbmVkKi8KQEAgLTE4NSwxMCArMTg1LDEyIEBACiAgKi8KIHN0cnVjdCBzZXRrZXlfcGFybSB7CiAJdTgJYWxnb3JpdGhtOwkvKiBlbmNyeXB0aW9uIGFsZ29yaXRobSwgY291bGQgYmUgbm9uZSwgd2VwNDAsCi0JCQkJICogVEtJUCwgQ0NNUCwgd2VwMTA0ICovCisJCQkJICogVEtJUCwgQ0NNUCwgd2VwMTA0CisJCQkJICovCiAJdTgJa2V5aWQ7CiAJdTgJZ3Jwa2V5OwkJLyogMTogdGhpcyBpcyB0aGUgZ3Jwa2V5IGZvciA4MDIuMXguCi0JCQkJICogMDogdGhpcyBpcyB0aGUgdW5pY2FzdCBrZXkgZm9yIDgwMi4xeCAqLworCQkJCSAqIDA6IHRoaXMgaXMgdGhlIHVuaWNhc3Qga2V5IGZvciA4MDIuMXgKKwkJCQkgKi8KIAl1OAlrZXlbMTZdOwkvKiB0aGlzIGNvdWxkIGJlIDQwIG9yIDEwNCAqLwogfTsKIApAQCAtMjE1LDE1ICsyMTcsMTUgQEAKIH07CiAKIC8qCi1DYWxsZXIgQWQtSG9jL0FQCi0KLUNvbW1hbmQgLVJzcChBSUQgPT0gQ0FNSUQpIG1vZGUKLQotVGhpcyBpcyB0byBmb3JjZSBmdyB0byBhZGQgYW4gc3RhX2RhdGEgZW50cnkgcGVyIGRyaXZlcidzIHJlcXVlc3QuCi0KLUZXIHdpbGwgd3JpdGUgYW4gY2FtIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCBpdC4KLQotKi8KKyAqCUNhbGxlciBBZC1Ib2MvQVAKKyAqCisgKglDb21tYW5kIC1Sc3AoQUlEID09IENBTUlEKSBtb2RlCisgKgorICoJVGhpcyBpcyB0byBmb3JjZSBmdyB0byBhZGQgYW4gc3RhX2RhdGEgZW50cnkgcGVyIGRyaXZlcidzIHJlcXVlc3QuCisgKgorICoJRlcgd2lsbCB3cml0ZSBhbiBjYW0gZW50cnkgYXNzb2NpYXRlZCB3aXRoIGl0LgorICoKKyAqLwogc3RydWN0IHNldF9hc3NvY3N0YV9wYXJtIHsKIAl1OAlhZGRyW0VUSF9BTEVOXTsKIH07CkBAIC0yMzQsMjcgKzIzNiwyNyBAQAogfTsKIAogLyoKLQlDYWxsZXIgQWQtSG9jL0FQCi0KLQlDb21tYW5kIG1vZGUKLQotCVRoaXMgaXMgdG8gZm9yY2UgZncgdG8gZGVsIGFuIHN0YV9kYXRhIGVudHJ5IHBlciBkcml2ZXIncyByZXF1ZXN0Ci0KLQlGVyB3aWxsIGludmFsaWRhdGUgdGhlIGNhbSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggaXQuCi0KLSovCisgKglDYWxsZXIgQWQtSG9jL0FQCisgKgorICoJQ29tbWFuZCBtb2RlCisgKgorICoJVGhpcyBpcyB0byBmb3JjZSBmdyB0byBkZWwgYW4gc3RhX2RhdGEgZW50cnkgcGVyIGRyaXZlcidzIHJlcXVlc3QKKyAqCisgKglGVyB3aWxsIGludmFsaWRhdGUgdGhlIGNhbSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggaXQuCisgKgorICovCiBzdHJ1Y3QgZGVsX2Fzc29jc3RhX3Bhcm0gewogCXU4CWFkZHJbRVRIX0FMRU5dOwogfTsKIAogLyoKLUNhbGxlciBNb2RlOiBBUC9BZC1Ib0MoTSkKLQotTm90ZXM6IFRvIG5vdGlmeSBmdyB0aGF0IGdpdmVuIHN0YWlkIGhhcyBjaGFuZ2VkIGl0cyBwb3dlciBzdGF0ZQotCi1Db21tYW5kIE1vZGUKLQotKi8KKyAqCUNhbGxlciBNb2RlOiBBUC9BZC1Ib0MoTSkKKyAqCisgKglOb3RlczogVG8gbm90aWZ5IGZ3IHRoYXQgZ2l2ZW4gc3RhaWQgaGFzIGNoYW5nZWQgaXRzIHBvd2VyIHN0YXRlCisgKgorICoJQ29tbWFuZCBNb2RlCisgKgorICovCiBzdHJ1Y3Qgc2V0c3RhcHdyc3RhdGVfcGFybSB7CiAJdTgJc3RhaWQ7CiAJdTgJc3RhdHVzOwpAQCAtMjYyLDI1ICsyNjQsMjUgQEAKIH07CiAKIC8qCi1DYWxsZXIgTW9kZTogQW55Ci0KLU5vdGVzOiBUbyBzZXR1cCB0aGUgYmFzaWMgcmF0ZSBvZiBSVEw4NzExCi0KLUNvbW1hbmQgTW9kZQotCi0qLworICoJQ2FsbGVyIE1vZGU6IEFueQorICoKKyAqCU5vdGVzOiBUbyBzZXR1cCB0aGUgYmFzaWMgcmF0ZSBvZiBSVEw4NzExCisgKgorICoJQ29tbWFuZCBNb2RlCisgKgorICovCiBzdHJ1Y3QJc2V0YmFzaWNyYXRlX3Bhcm0gewogCXU4CWJhc2ljcmF0ZXNbTnVtUmF0ZXNdOwogfTsKIAogLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIHJlYWQgdGhlIGN1cnJlbnQgYmFzaWMgcmF0ZQotCi1Db21tYW5kLVJzcCBNb2RlCi0KLSovCisgKglDYWxsZXIgTW9kZTogQW55CisgKgorICoJTm90ZXM6IFRvIHJlYWQgdGhlIGN1cnJlbnQgYmFzaWMgcmF0ZQorICoKKyAqCUNvbW1hbmQtUnNwIE1vZGUKKyAqCisgKi8KIHN0cnVjdCBnZXRiYXNpY3JhdGVfcGFybSB7CiAJdTMyIHJzdmQ7CiB9OwpAQCAtMjkwLDEzICsyOTIsMTMgQEAKIH07CiAKIC8qCi1DYWxsZXIgTW9kZTogQW55Ci0KLU5vdGVzOiBUbyBzZXR1cCB0aGUgZGF0YSByYXRlIG9mIFJUTDg3MTEKLQotQ29tbWFuZCBNb2RlCi0KLSovCisgKglDYWxsZXIgTW9kZTogQW55CisgKgorICoJTm90ZXM6IFRvIHNldHVwIHRoZSBkYXRhIHJhdGUgb2YgUlRMODcxMQorICoKKyAqCUNvbW1hbmQgTW9kZQorICoKKyAqLwogc3RydWN0IHNldGRhdGFyYXRlX3Bhcm0gewogCXU4CW1hY19pZDsKIAl1OAlkYXRhcmF0ZXNbTnVtUmF0ZXNdOwpAQCAtMzMyLDEzICszMzQsMTMgQEAKIH07CiAKIC8qCi1DYWxsZXIgTW9kZTogQW55Ci0KLU5vdGVzOiBUbyByZWFkIHRoZSBjdXJyZW50IGRhdGEgcmF0ZQotCi1Db21tYW5kLVJzcCBNb2RlCi0KLSovCisgKglDYWxsZXIgTW9kZTogQW55CisgKgorICoJTm90ZXM6IFRvIHJlYWQgdGhlIGN1cnJlbnQgZGF0YSByYXRlCisgKgorICoJQ29tbWFuZC1Sc3AgTW9kZQorICoKKyAqLwogc3RydWN0IGdldGRhdGFyYXRlX3Bhcm0gewogCXUzMiByc3ZkOwogCkBAIC0zNDksMzYgKzM1MSwzNiBAQAogCiAKIC8qCi1DYWxsZXIgTW9kZTogQW55Ci1BUDogQVAgY2FuIHVzZSB0aGUgaW5mbyBmb3IgdGhlIGNvbnRlbnRzIG9mIGJlYWNvbiBmcmFtZQotSW5mcmE6IFNUQSBjYW4gdXNlIHRoZSBpbmZvIHdoZW4gc2l0ZXN1cnZleWluZwotQWQtSG9DKE0pOiBMaWtlIEFQCi1BZC1Ib0MoQyk6IExpa2UgU1RBCi0KLQotTm90ZXM6IFRvIHNldCB0aGUgcGh5IGNhcGFiaWxpdHkgb2YgdGhlIE5JQwotCi1Db21tYW5kIE1vZGUKLQotKi8KKyAqCUNhbGxlciBNb2RlOiBBbnkKKyAqCUFQOiBBUCBjYW4gdXNlIHRoZSBpbmZvIGZvciB0aGUgY29udGVudHMgb2YgYmVhY29uIGZyYW1lCisgKglJbmZyYTogU1RBIGNhbiB1c2UgdGhlIGluZm8gd2hlbiBzaXRlc3VydmV5aW5nCisgKglBZC1Ib0MoTSk6IExpa2UgQVAKKyAqCUFkLUhvQyhDKTogTGlrZSBTVEEKKyAqCisgKgorICoJTm90ZXM6IFRvIHNldCB0aGUgcGh5IGNhcGFiaWxpdHkgb2YgdGhlIE5JQworICoKKyAqCUNvbW1hbmQgTW9kZQorICoKKyAqLwogCiAvKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gc2V0IHRoZSBjaGFubmVsL21vZGVtL2JhbmQKLVRoaXMgY29tbWFuZCB3aWxsIGJlIHVzZWQgd2hlbiBjaGFubmVsL21vZGVtL2JhbmQgaXMgY2hhbmdlZC4KLQotQ29tbWFuZCBNb2RlCi0KLSovCisgKglDYWxsZXIgTW9kZTogQW55CisgKgorICoJTm90ZXM6IFRvIHNldCB0aGUgY2hhbm5lbC9tb2RlbS9iYW5kCisgKglUaGlzIGNvbW1hbmQgd2lsbCBiZSB1c2VkIHdoZW4gY2hhbm5lbC9tb2RlbS9iYW5kIGlzIGNoYW5nZWQuCisgKgorICoJQ29tbWFuZCBNb2RlCisgKgorICovCiAvKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gZ2V0IHRoZSBjdXJyZW50IHNldHRpbmcgb2YgY2hhbm5lbC9tb2RlbS9iYW5kCi0KLUNvbW1hbmQtUnNwIE1vZGUKLQotKi8KKyAqCUNhbGxlciBNb2RlOiBBbnkKKyAqCisgKglOb3RlczogVG8gZ2V0IHRoZSBjdXJyZW50IHNldHRpbmcgb2YgY2hhbm5lbC9tb2RlbS9iYW5kCisgKgorICoJQ29tbWFuZC1Sc3AgTW9kZQorICoKKyAqLwogc3RydWN0CWdldHBoeV9yc3AgewogCXU4CXJmY2hhbm5lbDsKIAl1OAltb2RlbTsKQEAgLTQyOCw1OCArNDMwLDU4IEBACiB9OwogCiAvKgotCU5vdGVzOiBUaGlzIGNvbW1hbmQgaXMgdXNlZCBmb3IgSDJDL0MySCBsb29wYmFjayB0ZXN0aW5nCi0KLQltYWNbMF0gPT0gMAotCT09PiBDTUQgbW9kZSwgcmV0dXJuIEgyQ19TVUNDRVNTLgotCVRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIG11c3QgYmUgdHVyZSB1bmRlciBDTUQgbW9kZQotCQltYWNbMV0gPT0gbWFjWzRdLCBtYWNbMl0gPT0gbWFjWzNdLCBtYWNbMF09bWFjWzVdPSAwOwotCQlzMCA9PSAweDEyMzQsIHMxID09IDB4YWJjZCwgdzAgPT0gMHg3ODU2MzQxMiwgdzEgPT0gMHg1YWE1ZGVmNzsKLQkJczIgPT0gKGIxIDw8IDggfCBiMCk7Ci0KLQltYWNbMF0gPT0gMQotCT09PiBDTURfUlNQIG1vZGUsIHJldHVybiBIMkNfU1VDQ0VTU19SU1AKLQotCVRoZSByc3AgbGF5b3V0IHNoYWxsIGJlOgotCXJzcDoJCQlwYXJtOgotCQltYWNbMF0gID0gICBtYWNbNV07Ci0JCW1hY1sxXSAgPSAgIG1hY1s0XTsKLQkJbWFjWzJdICA9ICAgbWFjWzNdOwotCQltYWNbM10gID0gICBtYWNbMl07Ci0JCW1hY1s0XSAgPSAgIG1hY1sxXTsKLQkJbWFjWzVdICA9ICAgbWFjWzBdOwotCQlzMAkJPSAgIHMxOwotCQlzMQkJPSAgIHN3YXAxNihzMCk7Ci0JCXcwCQk9CXN3YXAzMih3MSk7Ci0JCWIwCQk9CWIxCi0JCXMyCQk9CXMwICsgczEKLQkJYjEJCT0JYjAKLQkJdzEJCT0JdzAKLQotCW1hY1swXSA9PQkyCi0JPT0+IENNRF9FVkVOVCBtb2RlLCByZXR1cm4JSDJDX1NVQ0NFU1MKLQlUaGUgZXZlbnQgbGF5b3V0IHNoYWxsIGJlOgotCWV2ZW50OgkgICAgIHBhcm06Ci0JbWFjWzBdICA9ICAgbWFjWzVdOwotCW1hY1sxXSAgPSAgIG1hY1s0XTsKLQltYWNbMl0gID0gICBldmVudCdzIHNlcXVlbmNlIG51bWJlciwgc3RhcnRpbmcgZnJvbSAxIHRvIHBhcm0ncyBtYXJjWzNdCi0JbWFjWzNdICA9ICAgbWFjWzJdOwotCW1hY1s0XSAgPSAgIG1hY1sxXTsKLQltYWNbNV0gID0gICBtYWNbMF07Ci0JczAJCT0gICBzd2FwMTYoczApIC0gZXZlbnQubWFjWzJdOwotCXMxCQk9ICAgczEgKyBldmVudC5tYWNbMl07Ci0JdzAJCT0Jc3dhcDMyKHcwKTsKLQliMAkJPQliMQotCXMyCQk9CXMwICsgZXZlbnQubWFjWzJdCi0JYjEJCT0JYjAKLQl3MQkJPQlzd2FwMzIodzEpIC0gZXZlbnQubWFjWzJdOwotCi0JcGFybS0+bWFjWzNdIGlzIHRoZSB0b3RhbCBldmVudCBjb3VudHMgdGhhdCBob3N0IHJlcXVlc3RlZC4KLQotCi0JZXZlbnQgd2lsbCBiZSB0aGUgc2FtZSB3aXRoIHRoZSBjbWQncyBwYXJhbS4KLQotKi8KKyAqCU5vdGVzOiBUaGlzIGNvbW1hbmQgaXMgdXNlZCBmb3IgSDJDL0MySCBsb29wYmFjayB0ZXN0aW5nCisgKgorICoJbWFjWzBdID09IDAKKyAqCT09PiBDTUQgbW9kZSwgcmV0dXJuIEgyQ19TVUNDRVNTLgorICoJVGhlIGZvbGxvd2luZyBjb25kaXRpb24gbXVzdCBiZSB0dXJlIHVuZGVyIENNRCBtb2RlCisgKgkJbWFjWzFdID09IG1hY1s0XSwgbWFjWzJdID09IG1hY1szXSwgbWFjWzBdPW1hY1s1XT0gMDsKKyAqCQlzMCA9PSAweDEyMzQsIHMxID09IDB4YWJjZCwgdzAgPT0gMHg3ODU2MzQxMiwgdzEgPT0gMHg1YWE1ZGVmNzsKKyAqCQlzMiA9PSAoYjEgPDwgOCB8IGIwKTsKKyAqCisgKgltYWNbMF0gPT0gMQorICoJPT0+IENNRF9SU1AgbW9kZSwgcmV0dXJuIEgyQ19TVUNDRVNTX1JTUAorICoKKyAqCVRoZSByc3AgbGF5b3V0IHNoYWxsIGJlOgorICoJcnNwOgkJCXBhcm06CisgKgkJbWFjWzBdICA9ICAgbWFjWzVdOworICoJCW1hY1sxXSAgPSAgIG1hY1s0XTsKKyAqCQltYWNbMl0gID0gICBtYWNbM107CisgKgkJbWFjWzNdICA9ICAgbWFjWzJdOworICoJCW1hY1s0XSAgPSAgIG1hY1sxXTsKKyAqCQltYWNbNV0gID0gICBtYWNbMF07CisgKgkJczAJCT0gICBzMTsKKyAqCQlzMQkJPSAgIHN3YXAxNihzMCk7CisgKgkJdzAJCT0Jc3dhcDMyKHcxKTsKKyAqCQliMAkJPQliMQorICoJCXMyCQk9CXMwICsgczEKKyAqCQliMQkJPQliMAorICoJCXcxCQk9CXcwCisgKgorICoJbWFjWzBdID09CTIKKyAqCT09PiBDTURfRVZFTlQgbW9kZSwgcmV0dXJuCUgyQ19TVUNDRVNTCisgKglUaGUgZXZlbnQgbGF5b3V0IHNoYWxsIGJlOgorICoJZXZlbnQ6CSAgICAgcGFybToKKyAqCW1hY1swXSAgPSAgIG1hY1s1XTsKKyAqCW1hY1sxXSAgPSAgIG1hY1s0XTsKKyAqCW1hY1syXSAgPSAgIGV2ZW50J3Mgc2VxdWVuY2UgbnVtYmVyLCBzdGFydGluZyBmcm9tIDEgdG8gcGFybSdzIG1hcmNbM10KKyAqCW1hY1szXSAgPSAgIG1hY1syXTsKKyAqCW1hY1s0XSAgPSAgIG1hY1sxXTsKKyAqCW1hY1s1XSAgPSAgIG1hY1swXTsKKyAqCXMwCQk9ICAgc3dhcDE2KHMwKSAtIGV2ZW50Lm1hY1syXTsKKyAqCXMxCQk9ICAgczEgKyBldmVudC5tYWNbMl07CisgKgl3MAkJPQlzd2FwMzIodzApOworICoJYjAJCT0JYjEKKyAqCXMyCQk9CXMwICsgZXZlbnQubWFjWzJdCisgKgliMQkJPQliMAorICoJdzEJCT0Jc3dhcDMyKHcxKSAtIGV2ZW50Lm1hY1syXTsKKyAqCisgKglwYXJtLT5tYWNbM10gaXMgdGhlIHRvdGFsIGV2ZW50IGNvdW50cyB0aGF0IGhvc3QgcmVxdWVzdGVkLgorICoKKyAqCisgKglldmVudCB3aWxsIGJlIHRoZSBzYW1lIHdpdGggdGhlIGNtZCdzIHBhcmFtLgorICoKKyAqLwogCiAvKiBDTUQgcGFyYW0gRm9ybWFydCBmb3IgRFJWIElOVEVSTkFMIENNRCBIREwqLwogc3RydWN0IGRydmludF9jbWRfcGFybSB7CkBAIC01NzAsNyArNTcyLDggQEAKIAl1OAliY25fcnhfZW47CiAJdTgJYmNuX3Bhc3NfY250OwkgIC8qIGZ3IHJlcG9ydCBvbmUgYmVhY29uIGluZm9ybWF0aW9uIHRvCiAJCQkJICAgKiBkcml2ZXIgIHdoZW4gaXQgcmVjZWl2ZXMgYmNuX3Bhc3NfY250Ci0JCQkJICAgKiAgYmVhY29ucy4gKi8KKwkJCQkgICAqIGJlYWNvbnMuCisJCQkJICAgKi8KIAl1OAliY25fdG87CQkgIC8qIGJlYWNvbiBUTyAobXMpLiDCocKnPTDCocKoIG5vIGxpbWl0LiovCiAJdTE2CWJjbl9pdHY7CiAJdTgJYXBwX2l0djsgLyogb25seSBmb3IgVk9JUCBtb2RlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9odC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9odC5oCmluZGV4IDQxODcyZDkuLjUxM2Y0NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaHQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2h0LmgKQEAgLTM2LDcgKzM2LDggQEAKIAl1bnNpZ25lZCBpbnQJdHhfYW1zZHVfZW5hYmxlOy8qZm9yIGVuYWJsZSBUeCBBLU1TRFUgKi8KIAl1bnNpZ25lZCBpbnQJdHhfYW1kc3VfbWF4bGVuOyAvKiAxOiA4aywgMDo0ayA7IGRlZmF1bHQ6OGssIGZvciB0eCAqLwogCXVuc2lnbmVkIGludAlyeF9hbXBkdV9tYXhsZW47IC8qIGZvciByeCByZW9yZGVyaW5nIGN0cmwgd2luX3N6LAotCQkJCQkgICogIHVwZGF0ZWQgd2hlbiBqb2luX2NhbGxiYWNrLiAqLworCQkJCQkgICogdXBkYXRlZCB3aGVuIGpvaW5fY2FsbGJhY2suCisJCQkJCSAgKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsLmgKaW5kZXggYzkyMThiZS4uMDhiY2IzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGwuaApAQCAtNjgsNyArNjgsOCBAQAogCiBzdHJ1Y3Qgb2lkX29ial9wcml2IHsKIAl1bnNpZ25lZCBjaGFyCWRiZzsgLyogMDogd2l0aG91dCBPSUQgZGVidWcgbWVzc2FnZQotCQkJICAgICAgKiAxOiB3aXRoIE9JRCBkZWJ1ZyBtZXNzYWdlICovCisJCQkgICAgICAqIDE6IHdpdGggT0lEIGRlYnVnIG1lc3NhZ2UKKwkJCSAgICAgICovCiAJdWludCAoKm9pZGZ1bnMpKHN0cnVjdCBvaWRfcGFyX3ByaXYgKnBvaWRfcGFyX3ByaXYpOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9saW51eC5jCmluZGV4IGUyMDVhZGYuLjQ3NWU3OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX2xpbnV4LmMKQEAgLTE5NzYsOSArMTk3Niw5IEBACiAJaWYgKHBkYXRhLT5sZW5ndGggPj0gMzIpIHsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIHBkYXRhLT5wb2ludGVyLCAzMikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBkYXRhWzMyXSA9IDA7CisJCWRhdGFbMzJdID0gMDsKIAl9IGVsc2UgewotCQkgcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmKHBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKSwgaXJxTCk7CiAJcGhlYWQgPSAmcXVldWUtPnF1ZXVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9zZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmMKaW5kZXggNTY3NjBjZC4uMGFhZjJhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9zZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX3NldC5jCkBAIC0xNDAsNyArMTQwLDggQEAKIAkJICAgIEVUSF9BTEVOKSkgewogCQkJaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkKIAkJCQlnb3RvIF9BYm9ydF9TZXRfQlNTSUQ7IC8qIGRyaXZlciBpcyBpbgotCQkJCQkJKiBXSUZJX0FESE9DX01BU1RFUl9TVEFURSAqLworCQkJCQkJKiBXSUZJX0FESE9DX01BU1RFUl9TVEFURQorCQkJCQkJKi8KIAkJfSBlbHNlIHsKIAkJCXI4NzEyX2Rpc2Fzc29jX2NtZChwYWRhcHRlcik7CiAJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKQpAQCAtMjAzLDcgKzIwNCw4IEBACiAJCQkJCX0KIAkJCQl9IGVsc2UgewogCQkJCQlnb3RvIF9BYm9ydF9TZXRfU1NJRDsgLyogZHJpdmVyIGlzIGluCi0JCQkJCQkgICogV0lGSV9BREhPQ19NQVNURVJfU1RBVEUgKi8KKwkJCQkJCSogV0lGSV9BREhPQ19NQVNURVJfU1RBVEUKKwkJCQkJCSovCiAJCQkJfQogCQkJfQogCQl9IGVsc2UgewpAQCAtMjU0LDEyICsyNTYsMTQgQEAKIAkJICAgICgqcG9sZF9zdGF0ZSA9PSBOZGlzODAyXzExSUJTUykpIHsKIAkJCS8qIHdpbGwgY2xyIExpbmtlZF9zdGF0ZSBiZWZvcmUgdGhpcyBmdW5jdGlvbiwKIAkJCSAqIHdlIG11c3QgaGF2ZSBjaGVja2VkIHdoZXRoZXIgaXNzdWUgZGlzLWFzc29jX2NtZCBvcgotCQkJICogbm90ICovCisJCQkgKiBub3QKKwkJCSAqLwogCQkJcjg3MTJfaW5kX2Rpc2Nvbm5lY3QocGFkYXB0ZXIpOwogCQl9CiAJCSpwb2xkX3N0YXRlID0gbmV0d29ya3R5cGU7CiAJCS8qIGNsZWFyIFdJRklfU1RBVElPTl9TVEFURTsgV0lGSV9BUF9TVEFURTsgV0lGSV9BREhPQ19TVEFURTsKLQkJICogV0lGSV9BREhPQ19NQVNURVJfU1RBVEUgKi8KKwkJICogV0lGSV9BREhPQ19NQVNURVJfU1RBVEUKKwkJICovCiAJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUgfCBXSUZJX0FQX1NUQVRFIHwKIAkJCSAgICAgIFdJRklfQURIT0NfU1RBVEUgfCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSk7CiAJCXN3aXRjaCAobmV0d29ya3R5cGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbGVkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2xlZC5oCmluZGV4IGViNjEyMDUuLmFkZmJjNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbGVkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9sZWQuaApAQCAtNzIsMTQgKzcyLDE3IEBACiAJU1dfTEVEX01PREUwLCAvKiBTVyBjb250cm9sIDEgTEVEIHZpYSBHUElPMC4gSXQgaXMgZGVmYXVsdCBvcHRpb24uICovCiAJU1dfTEVEX01PREUxLCAvKiAyIExFRHMsIHRocm91Z2ggTEVEMCBhbmQgTEVEMS4gRm9yIEFMUEhBLiAqLwogCVNXX0xFRF9NT0RFMiwgLyogU1cgY29udHJvbCAxIExFRCB2aWEgR1BJTzAsCi0JCSAgICAgICAqIGN1c3RvbSBmb3IgQXpXYXZlIDgxODcgbWluaWNhcmQuICovCisJCSAgICAgICAqIGN1c3RvbSBmb3IgQXpXYXZlIDgxODcgbWluaWNhcmQuCisJCSAgICAgICAqLwogCVNXX0xFRF9NT0RFMywgLyogU1cgY29udHJvbCAxIExFRCB2aWEgR1BJTzAsCi0JCSAgICAgICAqICBjdXN0b21pemVkIGZvciBTZXJjb21tIFByaW50ZXIgU2VydmVyIGNhc2UuKi8KKwkJICAgICAgICogY3VzdG9taXplZCBmb3IgU2VyY29tbSBQcmludGVyIFNlcnZlciBjYXNlLgorCQkgICAgICAgKi8KIAlTV19MRURfTU9ERTQsIC8qZm9yIEVkaW1heCAvIEJlbGtpbiovCiAJU1dfTEVEX01PREU1LCAvKmZvciBTZXJjb21tIC8gQmVsa2luKi8KIAlTV19MRURfTU9ERTYsIC8qZm9yIFdOQyAvIENvcmVnYSovCiAJSFdfTEVELCAvKiBIVyBjb250cm9sIDIgTEVEcywgTEVEMCBhbmQgTEVEMSAodGhlcmUgYXJlIDQgZGlmZmVyZW50Ci0JCSAqIGNvbnRyb2wgbW9kZXMsIHNlZSBNQUMuQ09ORklHMSBmb3IgZGV0YWlscy4pKi8KKwkJICogY29udHJvbCBtb2Rlcywgc2VlIE1BQy5DT05GSUcxIGZvciBkZXRhaWxzLikKKwkJICovCiB9OwogCiBzdHJ1Y3QgTEVEXzg3MXggewpAQCAtOTYsNyArOTksOCBAQAogCXU4CQkJYkxlZFdQU0JsaW5rSW5Qcm9ncmVzczsKIAl1MzIJCQlCbGlua1RpbWVzOyAvKiBOby4gdGltZXMgdG8gdG9nZ2xlIGZvciBibGluay4qLwogCXUzMgkJCUJsaW5raW5nTGVkU3RhdGU7IC8qIE5leHQgc3RhdGUgZm9yIGJsaW5raW5nLAotCQkJCQkJICAgKiBlaXRoZXIgTEVEX09OIG9yIE9GRi4qLworCQkJCQkJICAgKiBlaXRoZXIgTEVEX09OIG9yIE9GRi4KKwkJCQkJCSAgICovCiAKIAlzdHJ1Y3QgdGltZXJfbGlzdAlCbGlua1RpbWVyOyAvKiBUaW1lciBvYmplY3QgZm9yIGxlZCBibGlua2luZy4qLwogCXN0cnVjdCB3b3JrX3N0cnVjdAlCbGlua1dvcmtJdGVtOyAvKiBXb3JraXRlbSB1c2VkIGJ5IEJsaW5rVGltZXIgKi8KQEAgLTExNSw3ICsxMTksOCBAQAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogSW50ZXJmYWNlIHRvIG1hbmlwdWxhdGUgTEVEIG9iamVjdHMuCi0gKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCiB2b2lkIHI4NzEyX0luaXRTd0xlZHMoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIHI4NzEyX0RlSW5pdFN3TGVkcyhzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgTGVkQ29udHJvbDg3MXgoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwgZW51bSBMRURfQ1RMX01PREUgTGVkQWN0aW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmMKaW5kZXggNzcyYmY5Zi4uYzFmZWVmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmMKQEAgLTQwMyw3ICs0MDMsOCBAQAogCiAKIAkvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhIG1hdGNoLCB0aGVuIGdldCBhIG5ldyBuZXR3b3JrIHNsb3QgdG8gaW5pdGlhbGl6ZQotCSAqIHdpdGggdGhpcyBiZWFjb24ncyBpbmZvcm1hdGlvbiAqLworCSAqIHdpdGggdGhpcyBiZWFjb24ncyBpbmZvcm1hdGlvbgorCSAqLwogCWlmIChlbmRfb2ZfcXVldWVfc2VhcmNoKHBoZWFkLCBwbGlzdCkpIHsKIAkJaWYgKGxpc3RfZW1wdHkoJnBtbG1lcHJpdi0+ZnJlZV9ic3NfcG9vbC5xdWV1ZSkpIHsKIAkJCS8qIElmIHRoZXJlIGFyZSBubyBtb3JlIHNsb3RzLCBleHBpcmUgdGhlIG9sZGVzdCAqLwpAQCAtOTI2LDcgKzkyNyw4IEBACiAJaWYgKHBzdGEgIT0gTlVMTCkgewogCQkvKnRoZSBzdGEgaGF2ZSBiZWVuIGluIHN0YV9pbmZvX3F1ZXVlID0+IGRvIG5vdGhpbmcKIAkJICooYmV0d2VlbiBkcnYgaGFzIHJlY2VpdmVkIHRoaXMgZXZlbnQgYmVmb3JlIGFuZAotCQkgKiAgZncgaGF2ZSBub3QgeWV0IHRvIHNldCBrZXkgdG8gQ0FNX0VOVFJZKSAqLworCQkgKiBmdyBoYXZlIG5vdCB5ZXQgdG8gc2V0IGtleSB0byBDQU1fRU5UUlkpCisJCSAqLwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTcxLDcgKzExNzMsOCBAQAogCQkgICAgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5Tc2lkTGVuZ3RoKSkpIHsKIAkJCWlmIChwbWxtZXByaXYtPmFzc29jX2J5X3Jzc2kpIHsKIAkJCQkvKiBpZiB0aGUgc3NpZCBpcyB0aGUgc2FtZSwgc2VsZWN0IHRoZSBic3MKLQkJCQkgKiAgd2hpY2ggaGFzIHRoZSBtYXggcnNzaSovCisJCQkJICogd2hpY2ggaGFzIHRoZSBtYXggcnNzaQorCQkJCSAqLwogCQkJCWlmIChwbmV0d29ya19tYXhfcnNzaSkgewogCQkJCQlpZiAocG5ldHdvcmstPm5ldHdvcmsuUnNzaSA+CiAJCQkJCSAgICBwbmV0d29ya19tYXhfcnNzaS0+bmV0d29yay5Sc3NpKQpAQCAtMTM1Miw3ICsxMzU1LDggQEAKIAkJaSA9IC0xOyAvKiBDb3VsZCBub3QgZmluZC4gKi8KIAl9IGVsc2UgewogCQk7IC8qIFRoZXJlIGlzIG9uZSBQcmUtQXV0aGVudGljYXRpb24gS2V5IGZvciB0aGUKLQkJICAgKiBzcGVjaWZpYyBCU1NJRC4gKi8KKwkJICAgKiBzcGVjaWZpYyBCU1NJRC4KKwkJICAgKi8KIAl9CiAJcmV0dXJuIGk7CiB9CkBAIC0xNDMwLDcgKzE0MzQsOCBAQAogCWlmIChtYXRjaCkgewogCQlpZiAoc2VjX2llWzBdID09IF9XUEFfSUVfSURfKSB7CiAJCQkvKiBwYXJzaW5nIFNTTiBJRSB0byBzZWxlY3QgcmVxdWlyZWQgZW5jcnlwdGlvbgotCQkJICogYWxnb3JpdGhtLCBhbmQgc2V0IHRoZSBiYy9tYyBlbmNyeXB0aW9uIGFsZ29yaXRobSAqLworCQkJICogYWxnb3JpdGhtLCBhbmQgc2V0IHRoZSBiYy9tYyBlbmNyeXB0aW9uIGFsZ29yaXRobQorCQkJICovCiAJCQl3aGlsZSAodHJ1ZSkgewogCQkJCS8qY2hlY2sgd3BhX291aSB0YWcqLwogCQkJCWlmIChtZW1jbXAoJnNlY19pZVsyXSwgJndwYV9vdWlbMF0sIDQpKSB7CkBAIC0xNDQ0LDcgKzE0NDksOCBAQAogCQkJCX0KIAkJCQlpZiAoIW1lbWNtcCgmc2VjX2llWzhdLCAmd3BhX291aVswXSwgMykpIHsKIAkJCQkJLyogZ2V0IGJjL21jIGVuY3J5cHRpb24gdHlwZSAoZ3JvdXAKLQkJCQkJICoga2V5IHR5cGUpKi8KKwkJCQkJICoga2V5IHR5cGUpCisJCQkJCSAqLwogCQkJCQlzd2l0Y2ggKHNlY19pZVsxMV0pIHsKIAkJCQkJY2FzZSAweDA6IC8qbm9uZSovCiAJCQkJCQlwc2VjdXJpdHlwcml2LT5YR3JwUHJpdmFjeSA9CkBAIC0xNDgyLDcgKzE0ODgsOCBAQAogCQkJCQl9IC8qZWxzZSB0aGUgdW5jc3Rfb3VpIGlzIG1hdGNoKi8KIAkJCQl9IGVsc2UgeyAvKm1peGVkIG1vZGUsIHVuaWNhc3RfZW5jX3R5cGUgPiAxKi8KIAkJCQkJLypzZWxlY3QgdGhlIHVuY3N0X291aSBhbmQgcmVtb3ZlCi0JCQkJCSAqIHRoZSBvdGhlciB1bmNzdF9vdWkqLworCQkJCQkgKiB0aGUgb3RoZXIgdW5jc3Rfb3VpCisJCQkJCSAqLwogCQkJCQljbnQgPSBzZWNfaWVbMTJdOwogCQkJCQlyZW1vdmVfY250ID0gKGNudCAtIDEpICogNDsKIAkJCQkJc2VjX2llWzEyXSA9IDB4MDE7CkBAIC0xNDk5LDcgKzE1MDYsOCBAQAogCQl9CiAJCWlmIChhdXRobW9kZSA9PSBfV1BBMl9JRV9JRF8pIHsKIAkJCS8qIHBhcnNpbmcgUlNOIElFIHRvIHNlbGVjdCByZXF1aXJlZCBlbmNyeXB0aW9uCi0JCQkgKiBhbGdvcml0aG0sIGFuZCBzZXQgdGhlIGJjL21jIGVuY3J5cHRpb24gYWxnb3JpdGhtICovCisJCQkgKiBhbGdvcml0aG0sIGFuZCBzZXQgdGhlIGJjL21jIGVuY3J5cHRpb24gYWxnb3JpdGhtCisJCQkgKi8KIAkJCXdoaWxlICh0cnVlKSB7CiAJCQkJaWYgKChzZWNfaWVbMl0gIT0gMHgwMSkgfHwgKHNlY19pZVszXSAhPSAweDApKSB7CiAJCQkJCS8qSUUgVmVyIGVycm9yKi8KQEAgLTE1NDMsNyArMTU1MSw4IEBACiAJCQkJCX0gLyplbHNlIHRoZSB1bmNzdF9vdWkgaXMgbWF0Y2gqLwogCQkJCX0gZWxzZSB7IC8qbWl4ZWQgbW9kZSwgdW5pY2FzdF9lbmNfdHlwZSA+IDEqLwogCQkJCQkvKnNlbGVjdCB0aGUgdW5jc3Rfb3VpIGFuZCByZW1vdmUgdGhlCi0JCQkJCSAqIG90aGVyIHVuY3N0X291aSovCisJCQkJCSAqIG90aGVyIHVuY3N0X291aQorCQkJCQkgKi8KIAkJCQkJY250ID0gc2VjX2llWzhdOwogCQkJCQlyZW1vdmVfY250ID0gKGNudCAtIDEpICogNDsKIAkJCQkJc2VjX2llWzhdID0gMHgwMTsKQEAgLTE2NjcsNyArMTY3Niw4IEBACiAJc3RydWN0IGh0X3ByaXYJCSpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwogCiAJLyogdG9kbzogaWYgeW91IHdhbnQgdG8gZG8gc29tZXRoaW5nIGlvL3JlZy9odyBzZXR0aW5nIGJlZm9yZSBqb2luX2JzcywKLQkgKiBwbGVhc2UgYWRkIGNvZGUgaGVyZSAqLworCSAqIHBsZWFzZSBhZGQgY29kZSBoZXJlCisJICovCiAJcGh0cHJpdi0+YW1wZHVfZW5hYmxlID0gZmFsc2U7LypyZXNldCB0byBkaXNhYmxlZCovCiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCXBodHByaXYtPmJhZGRiYXJlcV9pc3N1ZWRbaV0gPSBmYWxzZTsvKnJlc2V0IGl0Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmgKaW5kZXggNjFlMGViNy4uZGRhYWFiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmgKQEAgLTQ3LDE2ICs0NywyMCBAQAogI2RlZmluZSAgIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFIDB4MDAwMDAwNDAKICNkZWZpbmUgICBXSUZJX1VOREVSX0xJTktJTkcJMHgwMDAwMDA4MAogI2RlZmluZSBXSUZJX1NJVEVfTU9OSVRPUgkweDAwMDAwODAwCS8qIHRvIGluZGljYXRlIHRoZSBzdGF0aW9uCi0JCQkJCQkgKiBpcyB1bmRlciBzaXRlIHN1cnZleWluZyovCisJCQkJCQkgKiBpcyB1bmRlciBzaXRlIHN1cnZleWluZworCQkJCQkJICovCiAjZGVmaW5lCVdJRklfTVBfU1RBVEUJCTB4MDAwMTAwMDAKICNkZWZpbmUJV0lGSV9NUF9DVFhfQkFDS0dST1VORAkweDAwMDIwMDAwCS8qIGluIGNvbnQuIHR4IGJhY2tncm91bmQqLwogI2RlZmluZQlXSUZJX01QX0NUWF9TVAkJMHgwMDA0MDAwMAkvKiBpbiBjb250LiB0eCB3aXRoCi0JCQkJCQkgKiAgc2luZ2xlLXRvbmUqLworCQkJCQkJICogc2luZ2xlLXRvbmUKKwkJCQkJCSAqLwogI2RlZmluZQlXSUZJX01QX0NUWF9CQUNLR1JPVU5EX1BFTkRJTkcJMHgwMDA4MDAwMCAvKiBwZW5kaW5nIGluIGNvbnQsIHR4Ci0JCQkJCSogYmFja2dyb3VuZCBkdWUgdG8gb3V0IG9mIHNrYiovCisJCQkJCQkgICAgKiBiYWNrZ3JvdW5kIGR1ZSB0byBvdXQgb2Ygc2tiCisJCQkJCQkgICAgKi8KICNkZWZpbmUJV0lGSV9NUF9DVFhfQ0NLX0hXCTB4MDAxMDAwMDAJLyogaW4gY29udGludW91cyB0eCovCiAjZGVmaW5lCVdJRklfTVBfQ1RYX0NDS19DUwkweDAwMjAwMDAwCS8qIGluIGNvbnQsIHR4IHdpdGggY2FycmllcgotCQkJCQkJICogc3VwcHJlc3Npb24qLworCQkJCQkJICogc3VwcHJlc3Npb24KKwkJCQkJCSAqLwogI2RlZmluZSAgIFdJRklfTVBfTFBCS19TVEFURQkweDAwNDAwMDAwCiAKICNkZWZpbmUgX0ZXX1VOREVSX0xJTktJTkcJV0lGSV9VTkRFUl9MSU5LSU5HCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmMKaW5kZXggNWU0ZmRhMS4uM2MxMGEyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuYwpAQCAtMzc2LDcgKzM3Niw4IEBACiAJCS8qIFVzZSBQSFlfUkVHLnR4dCBkZWZhdWx0IHZhbHVlLiBEbyBub3QgbmVlZCB0byBjaGFuZ2UuCiAJCSAqIENvcnJlY3QgdGhlIHR4IHBvd2VyIGZvciBDQ0sgcmF0ZSBpbiA0ME0uCiAJCSAqIFNldCBDb250cm9sIGNoYW5uZWwgdG8gdXBwZXIgb3IgbG93ZXIuIFRoZXNlIHNldHRpbmdzIGFyZQotCQkgKiByZXF1aXJlZCBvbmx5IGZvciA0ME1IeiAqLworCQkgKiByZXF1aXJlZCBvbmx5IGZvciA0ME1IegorCQkgKi8KIAkJc2V0X2JiX3JlZyhwQWRhcHRlciwgckNDSzBfU3lzdGVtLCBiQ0NLU2lkZUJhbmQsCiAJCQkgICAoSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSA+PiAxKSk7CiAJCXNldF9iYl9yZWcocEFkYXB0ZXIsIHJPRkRNMV9MU1RGLCAweEMwMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuaAppbmRleCAzZjNiMmU3Li44ZGY0NTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5oCkBAIC0xMDgsNyArMTA4LDggQEAKIAl1bnNpZ25lZCBjaGFyIG5ldHdvcmtfbWFjYWRkcls2XTsKIAkvKlRlc3RpbmcgRmxhZyovCiAJdTMyIG1vZGU7LyowIGZvciBub3JtYWwgdHlwZSBwYWNrZXQsCi0JCSAgKiAxIGZvciBsb29wYmFjayBwYWNrZXQgKDE2Ynl0ZXMgVFhDTUQpKi8KKwkJICAqIDEgZm9yIGxvb3BiYWNrIHBhY2tldCAoMTZieXRlcyBUWENNRCkKKwkJICAqLwogCXNpbnQgcHJldl9md19zdGF0ZTsKIAl1OCAqcGFsbG9jYXRlZF9tcF94bWl0ZnJhbWVfYnVmOwogCXU4ICpwbXBfeG10ZnJhbWVfYnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9pb2N0bC5oCmluZGV4IDhkYzg5ODAuLjExMDI0NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXBfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wX2lvY3RsLmgKQEAgLTE1OCwyOCArMTU4LDM3IEBACiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgwNQlPSURfUlRfUFJPX1NFVF9TQ1JBTUJMRVIqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MDYJT0lEX1JUX1BST19TRVRfRklMVEVSX0JCKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDA3Ci0JCQkJCSAqIE9JRF9SVF9QUk9fU0VUX01BTlVBTF9ESVZFUlNfQkIqLworCQkJCQkgKiBPSURfUlRfUFJPX1NFVF9NQU5VQUxfRElWRVJTX0JCCisJCQkJCSAqLwogCXsxLCBvaWRfcnRfcHJvX3NldF9jaGFubmVsX2RpcmVjdF9jYWxsX2hkbH0sCS8qMHgwOCovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgwOQotCQkJCSogT0lEX1JUX1BST19TRVRfU0xFRVBfTU9ERV9ESVJFQ1RfQ0FMTCovCisJCQkJKiBPSURfUlRfUFJPX1NFVF9TTEVFUF9NT0RFX0RJUkVDVF9DQUxMCisJCQkJKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDBBCi0JCQkJKiBPSURfUlRfUFJPX1NFVF9XQUtFX01PREVfRElSRUNUX0NBTEwqLworCQkJCSogT0lEX1JUX1BST19TRVRfV0FLRV9NT0RFX0RJUkVDVF9DQUxMCisJCQkJKi8KIAl7MSwgb2lkX3J0X3Byb19zZXRfY29udGludW91c190eF9oZGx9LAkvKjB4MEIKLQkJCQkqIE9JRF9SVF9QUk9fU0VUX1RYX0NPTlRJTlVPVVNfRElSRUNUX0NBTEwqLworCQkJCSogT0lEX1JUX1BST19TRVRfVFhfQ09OVElOVU9VU19ESVJFQ1RfQ0FMTAorCQkJCSovCiAJezEsIG9pZF9ydF9wcm9fc2V0X3NpbmdsZV9jYXJyaWVyX3R4X2hkbH0sIC8qMHgwQwotCQkJCSogT0lEX1JUX1BST19TRVRfU0lOR0xFX0NBUlJJRVJfVFhfQ09OVElOVU9VUyovCisJCQkJKiBPSURfUlRfUFJPX1NFVF9TSU5HTEVfQ0FSUklFUl9UWF9DT05USU5VT1VTCisJCQkJKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDBECi0JCQkJKiBPSURfUlRfUFJPX1NFVF9UWF9BTlRFTk5BX0JCKi8KKwkJCQkqIE9JRF9SVF9QUk9fU0VUX1RYX0FOVEVOTkFfQkIKKwkJCQkqLwogCXsxLCBvaWRfcnRfcHJvX3NldF9hbnRlbm5hX2JiX2hkbH0sCQkvKjB4MEUqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MEYJT0lEX1JUX1BST19TRVRfQ1JfU0NSQU1CTEVSKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDEwCU9JRF9SVF9QUk9fU0VUX0NSX05FV19GSUxURVIqLwogCXsxLCBvaWRfcnRfcHJvX3NldF90eF9wb3dlcl9jb250cm9sX2hkbH0sIC8qMHgxMQotCQkJCSogT0lEX1JUX1BST19TRVRfVFhfUE9XRVJfQ09OVFJPTCovCisJCQkJKiBPSURfUlRfUFJPX1NFVF9UWF9QT1dFUl9DT05UUk9MCisJCQkJKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDEyCU9JRF9SVF9QUk9fU0VUX0NSX1RYX0NPTkZJRyovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgxMwotCQkJCQkgKiBPSURfUlRfUFJPX0dFVF9UWF9QT1dFUl9DT05UUk9MKi8KKwkJCQkJICogT0lEX1JUX1BST19HRVRfVFhfUE9XRVJfQ09OVFJPTAorCQkJCQkgKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDE0Ci0JCQkJCSAqIE9JRF9SVF9QUk9fR0VUX0NSX1NJR05BTF9RVUFMSVRZKi8KKwkJCQkJICogT0lEX1JUX1BST19HRVRfQ1JfU0lHTkFMX1FVQUxJVFkKKwkJCQkJICovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgxNQlPSURfUlRfUFJPX1NFVF9DUl9TRVRQT0lOVCovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgxNglPSURfUlRfUFJPX1NFVF9JTlRFR1JBVE9SKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDE3CU9JRF9SVF9QUk9fU0VUX1NJR05BTF9RVUFMSVRZKi8KQEAgLTIwMywxMyArMjEyLDE3IEBACiAJezEsIG9pZF9ydF9wcm9fcXVlcnlfcnhfcGFja2V0X3JlY2VpdmVkX2hkbH0sCS8qMHgyNiovCiAJezEsIG9pZF9ydF9wcm9fcXVlcnlfcnhfcGFja2V0X2NyYzMyX2Vycm9yX2hkbH0sLyoweDI3Ki8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDI4Ci0JCQkJCSAqT0lEX1JUX1BST19RVUVSWV9DVVJSRU5UX0FERFJFU1MqLworCQkJCQkgKk9JRF9SVF9QUk9fUVVFUllfQ1VSUkVOVF9BRERSRVNTCisJCQkJCSAqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MjkKLQkJCQkJICpPSURfUlRfUFJPX1FVRVJZX1BFUk1BTkVOVF9BRERSRVNTKi8KKwkJCQkJICpPSURfUlRfUFJPX1FVRVJZX1BFUk1BTkVOVF9BRERSRVNTCisJCQkJCSAqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MkEKLQkJCQkgKk9JRF9SVF9QUk9fU0VUX1BISUxJUFNfUkZfUEFSQU1FVEVSUyovCisJCQkJICpPSURfUlRfUFJPX1NFVF9QSElMSVBTX1JGX1BBUkFNRVRFUlMKKwkJCQkgKi8KIAl7MSwgb2lkX3J0X3Byb19zZXRfY2Fycmllcl9zdXBwcmVzc2lvbl90eF9oZGx9LC8qMHgyQgotCQkJCSAqT0lEX1JUX1BST19TRVRfQ0FSUklFUl9TVVBQUkVTU0lPTl9UWCovCisJCQkJICpPSURfUlRfUFJPX1NFVF9DQVJSSUVSX1NVUFBSRVNTSU9OX1RYCisJCQkJICovCiAJezEsIG9pZF9udWxsX2Z1bmN0aW9ufSwJCS8qMHgyQwlPSURfUlRfUFJPX1JFQ0VJVkVfUEFDS0VUKi8KIAl7MSwgb2lkX251bGxfZnVuY3Rpb259LAkJLyoweDJECU9JRF9SVF9QUk9fV1JJVEVfRUVQUk9NX0JZVEUqLwogCXsxLCBvaWRfbnVsbF9mdW5jdGlvbn0sCQkvKjB4MkUJT0lEX1JUX1BST19SRUFEX0VFUFJPTV9CWVRFKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXBfcGh5X3JlZ2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9waHlfcmVnZGVmLmgKaW5kZXggMmU5MTIwYS4uMTFiY2ZiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9waHlfcmVnZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9waHlfcmVnZGVmLmgKQEAgLTgyLDcgKzgyLDggQEAKICAqIDMuIFBhZ2U4KDB4ODAwKQogICovCiAjZGVmaW5lCXJGUEdBMF9SRk1PRAkJCTB4ODAwCS8qUkYgbW9kZSAmIENDSyBUeFNDIFJGCi0JCQkJCQkgKiBCVyBTZXR0aW5nPz8gKi8KKwkJCQkJCSAqIEJXIFNldHRpbmc/PworCQkJCQkJICovCiAjZGVmaW5lCXJGUEdBMF9UeEluZm8JCQkweDgwNAkvKiBTdGF0dXMgcmVwb3J0Pz8gKi8KICNkZWZpbmUJckZQR0EwX1BTREZ1bmN0aW9uCQkweDgwOAogI2RlZmluZQlyRlBHQTBfVHhHYWluU3RhZ2UJCTB4ODBjCS8qIFNldCBUWCBQV1IgaW5pdCBnYWluPyAqLwpAQCAtMTE5LDcgKzEyMCw4IEBACiAKICNkZWZpbmUJckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEJCTB4ODgwCS8qIENyeXN0YWwgY2FwIHNldHRpbmcKIAkJCQkJCSAqIFJGLVIvVyBwcm90ZWN0aW9uCi0JCQkJCQkgKiBmb3IgcGFyYW1ldGVyND8/ICovCisJCQkJCQkgKiBmb3IgcGFyYW1ldGVyND8/CisJCQkJCQkgKi8KICNkZWZpbmUJckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjIJCTB4ODg0CiAjZGVmaW5lCXJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIzCQkweDg4OAkvKiBVc2VsZXNzIG5vdyAqLwogI2RlZmluZQlyRlBHQTBfQW5hbG9nUGFyYW1ldGVyNAkJMHg4OGMKQEAgLTE0Niw3ICsxNDgsOCBAQAogICogNS4gUGFnZUEoMHhBMDApCiAgKgogICogU2V0IENvbnRyb2wgY2hhbm5lbCB0byB1cHBlciBvciBsb3dlci4KLSAqIFRoZXNlIHNldHRpbmdzIGFyZSByZXF1aXJlZCBvbmx5IGZvciA0ME1IeiAqLworICogVGhlc2Ugc2V0dGluZ3MgYXJlIHJlcXVpcmVkIG9ubHkgZm9yIDQwTUh6CisgKi8KICNkZWZpbmUJckNDSzBfU3lzdGVtCQkJMHhhMDAKIAogI2RlZmluZQlyQ0NLMF9BRkVTZXR0aW5nCQkweGEwNAkvKiBEaXNhYmxlIGluaXQgZ2FpbiBub3cgKi8KQEAgLTE1NSwyMCArMTU4LDIzIEBACiAjZGVmaW5lCXJDQ0swX1J4QUdDMQkJCTB4YTBjCiAvKiBBR0MgZGVmYXVsdCB2YWx1ZSwgc2F0dXJhdGlvbiBsZXZlbAogICogQW50ZW5uYSBEaXZlcnNpdHksIFJYIEFHQywgTE5BIFRocmVzaG9sZCwgUlggTE5BIFRocmVzaG9sZCB1c2VsZXNzIG5vdy4KLSAqIE5vdCB0aGUgc2FtZSBhcyA5MCBzZXJpZXMgKi8KKyAqIE5vdCB0aGUgc2FtZSBhcyA5MCBzZXJpZXMKKyAqLwogI2RlZmluZQlyQ0NLMF9SeEFHQzIJCQkweGExMAkvKiBBR0MgJiBEQUdDICovCiAKICNkZWZpbmUJckNDSzBfUnhIUAkJCTB4YTE0CiAKICNkZWZpbmUJckNDSzBfRFNQUGFyYW1ldGVyMQkJMHhhMTgJLyogVGltaW5nIHJlY292ZXJ5ICYgQ2hhbm5lbAotCQkJCQkJICogZXN0aW1hdGlvbiB0aHJlc2hvbGQgKi8KKwkJCQkJCSAqIGVzdGltYXRpb24gdGhyZXNob2xkCisJCQkJCQkgKi8KICNkZWZpbmUJckNDSzBfRFNQUGFyYW1ldGVyMgkJMHhhMWMJLyogU1EgdGhyZXNob2xkICovCiAKICNkZWZpbmUJckNDSzBfVHhGaWx0ZXIxCQkJMHhhMjAKICNkZWZpbmUJckNDSzBfVHhGaWx0ZXIyCQkJMHhhMjQKICNkZWZpbmUJckNDSzBfRGVidWdQb3J0CQkJMHhhMjgJLyogZGVidWcgcG9ydCBhbmQgVHggZmlsdGVyMyAqLwogI2RlZmluZQlyQ0NLMF9GYWxzZUFsYXJtUmVwb3J0CQkweGEyYwkvKiAweGEyZCB1c2VsZXNzIG5vdyAweGEzMC1hNGYKLQkJCQkJCSAqIGNoYW5uZWwgcmVwb3J0ICovCisJCQkJCQkgKiBjaGFubmVsIHJlcG9ydAorCQkJCQkJICovCiAjZGVmaW5lCXJDQ0swX1RSU1NJUmVwb3J0CQkweGE1MAogI2RlZmluZQlyQ0NLMF9SeFJlcG9ydAkJCTB4YTU0ICAgLyogMHhhNTcgKi8KICNkZWZpbmUJckNDSzBfRkFDb3VudGVyTG93ZXIJCTB4YTVjICAgLyogMHhhNWIgKi8KQEAgLTE5MywxMSArMTk5LDEzIEBACiAjZGVmaW5lCXJPRkRNMF9YRFJ4SVFJbWJhbGFuY2UJCTB4YzJjCiAKICNkZWZpbmUJck9GRE0wX1J4RGV0ZWN0b3IxCQkweGMzMCAgLyogUEQsQlcgJiBTQkQgRE0gdHVuZQotCQkJCQkJKiBpbml0IGdhaW4gKi8KKwkJCQkJCSogaW5pdCBnYWluCisJCQkJCQkqLwogI2RlZmluZQlyT0ZETTBfUnhEZXRlY3RvcjIJCTB4YzM0ICAvKiBTQkQgJiBGYW1lIFN5bmMuICovCiAjZGVmaW5lCXJPRkRNMF9SeERldGVjdG9yMwkJMHhjMzggIC8qIEZyYW1lIFN5bmMuICovCiAjZGVmaW5lCXJPRkRNMF9SeERldGVjdG9yNAkJMHhjM2MgIC8qIFBELCBTQkQsIEZyYW1lIFN5bmMgJgotCQkJCQkJKiBTaG9ydC1HSSAqLworCQkJCQkJKiBTaG9ydC1HSQorCQkJCQkJKi8KIAogI2RlZmluZQlyT0ZETTBfUnhEU1AJCQkweGM0MCAgLyogUnggU3luYyBQYXRoICovCiAjZGVmaW5lCXJPRkRNMF9DRk9hbmREQUdDCQkweGM0NCAgLyogQ0ZPICYgREFHQyAqLwpAQCAtMjgzLDcgKzI5MSw4IEBACiAjZGVmaW5lCXJUeEFHQ19NY3MxNV9NY3MxMgkJMHhlMWMKIAogLyogQW5hbG9nLSBjb250cm9sIGluIFJYX1dBSVRfQ0NBIDogUkVHOiBFRTAKLSAqIFtBbmFsb2ctIFBvd2VyICYgQ29udHJvbCBSZWdpc3Rlcl0gKi8KKyAqIFtBbmFsb2ctIFBvd2VyICYgQ29udHJvbCBSZWdpc3Rlcl0KKyAqLwogI2RlZmluZQkJclJ4X1dhaXRfQ0NDQQkJMHhlNzAKICNkZWZpbmUJckFuYXBhcl9DdHJsX0JCCQkJMHhlZTAKIApAQCAtMzcxLDcgKzM4MCw4IEBACiAvKgogICogQml0IE1hc2sKICAqCi0gKiAxLiBQYWdlMSgweDEwMCkgKi8KKyAqIDEuIFBhZ2UxKDB4MTAwKQorICovCiAjZGVmaW5lCWJCQlJlc2V0QgkJCTB4MTAwCS8qIFVzZWxlc3Mgbm93PyAqLwogI2RlZmluZQliR2xvYmFsUmVzZXRCCQkJMHgyMDAKICNkZWZpbmUJYk9GRE1UeFN0YXJ0CQkJMHg0CkBAIC05MTgsNyArOTI4LDggQEAKICNkZWZpbmUJYlBlc3Vkb05vaXNlU3RhdGVfRCAgICAgIDB4ZmZmZjAwMDAKIAogLyogNy4gUkYgUmVnaXN0ZXIKLSAqIFplYnJhMSAqLworICogWmVicmExCisgKi8KICNkZWZpbmUJYlplYnJhMV9IU1NJRW5hYmxlICAgICAgICAweDgJCS8qIFVzZWxlc3MgKi8KICNkZWZpbmUJYlplYnJhMV9UUnhDb250cm9sICAgICAgICAweGMwMAogI2RlZmluZQliWmVicmExX1RSeEdhaW5TZXR0aW5nICAgIDB4MDdmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5jCmluZGV4IGJmMTBkNmQuLmQ0NjRjMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5jCkBAIC01Miw3ICs1Miw4IEBACiAJCXB3cnByaXYtPmNwd20gPSB2YWw4OwogCQlicmVhazsKIAljYXNlIFBTX1NUQVRFX1MyOi8qIG9ubHkgZm9yIFVTQiBub3JtYWwgcG93ZXJzYXZlIG1vZGUgdXNlLAotCQkJICAqIHRlbXAgbWFyayBzb21lIGNvZGUuICovCisJCQkgICogdGVtcCBtYXJrIHNvbWUgY29kZS4KKwkJCSAgKi8KIAljYXNlIFBTX1NUQVRFX1MzOgogCWNhc2UgUFNfU1RBVEVfUzQ6CiAJCXB3cnByaXYtPmNwd20gPSB2YWw4OwpAQCAtMTAzLDE0ICsxMDQsMTQgQEAKIAlpZiAocHdycHJpdi0+Y3B3bV90b2cgPT0gKChwcmVwb3J0cHdyc3RhdGUtPnN0YXRlKSAmIDB4ODApKQogCQlyZXR1cm47CiAJZGVsX3RpbWVyKCZwYWRhcHRlci0+cHdyY3RybHByaXYucnB3bV9jaGVja190aW1lcik7Ci0JX2VudGVyX3B3cmxvY2soJnB3cnByaXYtPmxvY2spOworCW11dGV4X2xvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCXB3cnByaXYtPmNwd20gPSAocHJlcG9ydHB3cnN0YXRlLT5zdGF0ZSkgJiAweGY7CiAJaWYgKHB3cnByaXYtPmNwd20gPj0gUFNfU1RBVEVfUzIpIHsKIAkJaWYgKHB3cnByaXYtPmFsaXZlcyAmIENNRF9BTElWRSkKLQkJCXVwKCYocGNtZHByaXYtPmNtZF9xdWV1ZV9zZW1hKSk7CisJCQljb21wbGV0ZSgmKHBjbWRwcml2LT5jbWRfcXVldWVfY29tcCkpOwogCX0KIAlwd3Jwcml2LT5jcHdtX3RvZyA9IChwcmVwb3J0cHdyc3RhdGUtPnN0YXRlKSAmIDB4ODA7Ci0JdXAoJnB3cnByaXYtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZWdpc3Rlcl90YXNrX2FsaXZlKHN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmwsIHVpbnQgdGFnKQpAQCAtMTQxLDEwICsxNDIsMTAgQEAKIAlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gY29udGFpbmVyX29mKHB3cnByaXYsCiAJCQkJICAgIHN0cnVjdCBfYWRhcHRlciwgcHdyY3RybHByaXYpOwogCWlmICghcHdycHJpdi0+YlNsZWVwKSB7Ci0JCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAJCWlmIChwd3Jwcml2LT5wd3JfbW9kZSA9PSBQU19NT0RFX0FDVElWRSkKIAkJCXI4NzEyX3NldF9ycHdtKHBhZGFwdGVyLCBQU19TVEFURV9TNCk7Ci0JCXVwKCZwd3Jwcml2LT5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZwd3Jwcml2LT5tdXRleF9sb2NrKTsKIAl9CiB9CiAKQEAgLTE1NSwxMSArMTU2LDExIEBACiAJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IGNvbnRhaW5lcl9vZihwd3Jwcml2LAogCQkJCSAgICBzdHJ1Y3QgX2FkYXB0ZXIsIHB3cmN0cmxwcml2KTsKIAlpZiAocHdycHJpdi0+Y3B3bSAhPSBwd3Jwcml2LT5ycHdtKSB7Ci0JCV9lbnRlcl9wd3Jsb2NrKCZwd3Jwcml2LT5sb2NrKTsKKwkJbXV0ZXhfbG9jaygmcHdycHJpdi0+bXV0ZXhfbG9jayk7CiAJCXI4NzEyX3JlYWQ4KHBhZGFwdGVyLCBTRElPX0hDUFdNKTsKIAkJcHdycHJpdi0+cnB3bV9yZXRyeSA9IDE7CiAJCXI4NzEyX3NldF9ycHdtKHBhZGFwdGVyLCBwd3Jwcml2LT5ycHdtKTsKLQkJdXAoJnB3cnByaXYtPmxvY2spOworCQltdXRleF91bmxvY2soJnB3cnByaXYtPm11dGV4X2xvY2spOwogCX0KIH0KIApAQCAtMTc1LDcgKzE3Niw3IEBACiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwogCiAJbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopcHdyY3RybHByaXYsIDAsIHNpemVvZihzdHJ1Y3QgcHdyY3RybF9wcml2KSk7Ci0Jc2VtYV9pbml0KCZwd3JjdHJscHJpdi0+bG9jaywgMSk7CisJbXV0ZXhfaW5pdCgmcHdyY3RybHByaXYtPm11dGV4X2xvY2spOwogCXB3cmN0cmxwcml2LT5jcHdtID0gUFNfU1RBVEVfUzQ7CiAJcHdyY3RybHByaXYtPnB3cl9tb2RlID0gUFNfTU9ERV9BQ1RJVkU7CiAJcHdyY3RybHByaXYtPnNtYXJ0X3BzID0gMDsKQEAgLTIwNywxMyArMjA4LDEzIEBACiAJdWludCByZXMgPSBfU1VDQ0VTUzsKIAlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJsID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAotCV9lbnRlcl9wd3Jsb2NrKCZwd3JjdHJsLT5sb2NrKTsKKwltdXRleF9sb2NrKCZwd3JjdHJsLT5tdXRleF9sb2NrKTsKIAlyZWdpc3Rlcl90YXNrX2FsaXZlKHB3cmN0cmwsIENNRF9BTElWRSk7CiAJaWYgKHB3cmN0cmwtPmNwd20gPCBQU19TVEFURV9TMikgewogCQlyODcxMl9zZXRfcnB3bShwYWRhcHRlciwgUFNfU1RBVEVfUzMpOwogCQlyZXMgPSBfRkFJTDsKIAl9Ci0JdXAoJnB3cmN0cmwtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdyY3RybC0+bXV0ZXhfbG9jayk7CiAJcmV0dXJuIHJlczsKIH0KIApAQCAtMjI5LDcgKzIzMCw3IEBACiB7CiAJc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybCA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7CiAKLQlfZW50ZXJfcHdybG9jaygmcHdyY3RybC0+bG9jayk7CisJbXV0ZXhfbG9jaygmcHdyY3RybC0+bXV0ZXhfbG9jayk7CiAJdW5yZWdpc3Rlcl90YXNrX2FsaXZlKHB3cmN0cmwsIENNRF9BTElWRSk7CiAJaWYgKChwd3JjdHJsLT5jcHdtID4gUFNfU1RBVEVfUzIpICYmCiAJICAgKHB3cmN0cmwtPnB3cl9tb2RlID4gUFNfTU9ERV9BQ1RJVkUpKSB7CkBAIC0yMzksNSArMjQwLDUgQEAKIAkJCXI4NzEyX3NldF9ycHdtKHBhZGFwdGVyLCBQU19TVEFURV9TMCk7CiAJCX0KIAl9Ci0JdXAoJnB3cmN0cmwtPmxvY2spOworCW11dGV4X3VubG9jaygmcHdyY3RybC0+bXV0ZXhfbG9jayk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5oCmluZGV4IGRiZmI1NTUuLmM4MmZkZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5oCkBAIC04NywxNiArODcsMTIgQEAKIAl1bnNpZ25lZCBzaG9ydCByc3ZkOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9lbnRlcl9wd3Jsb2NrKHN0cnVjdCBzZW1hcGhvcmUgKnBsb2NrKQotewotCV9kb3duX3NlbWEocGxvY2spOwotfQotCiBzdHJ1Y3QJcHdyY3RybF9wcml2IHsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGxvY2s7CisJc3RydWN0IG11dGV4IG11dGV4X2xvY2s7CiAJLyp2b2xhdGlsZSovIHU4IHJwd207IC8qIHJlcXVlc3RlZCBwb3dlciBzdGF0ZSBmb3IgZncgKi8KIAkvKiBmdyBjdXJyZW50IHBvd2VyIHN0YXRlLiB1cGRhdGVkIHdoZW4gMS4gcmVhZCBmcm9tIEhDUFdNIG9yCi0JICogMi4gZHJpdmVyIGxvd2VycyBwb3dlciBsZXZlbCAqLworCSAqIDIuIGRyaXZlciBsb3dlcnMgcG93ZXIgbGV2ZWwKKwkgKi8KIAkvKnZvbGF0aWxlKi8gdTggY3B3bTsKIAkvKnZvbGF0aWxlKi8gdTggdG9nOyAvKiB0b2dnbGluZyAqLwogCS8qdm9sYXRpbGUqLyB1OCBjcHdtX3RvZzsgLyogdG9nZ2xpbmcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKaW5kZXggMjNjMTQzOC4uY2JkMmU1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKQEAgLTI2NSw3ICsyNjUsOCBAQAogCiAJCWlmICgocHN0YSAhPSBOVUxMKSAmJiAocHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQpKSB7CiAJCQkvKiBibG9ja2VkCi0JCQkgKiBvbmx5IGFjY2VwdCBFQVBPTCBmcmFtZSAqLworCQkJICogb25seSBhY2NlcHQgRUFQT0wgZnJhbWUKKwkJCSAqLwogCQkJaWYgKGV0aGVyX3R5cGUgPT0gMHg4ODhlKSB7CiAJCQkJcHJ0bmZyYW1lID0gcHJlY3ZfZnJhbWU7CiAJCQl9IGVsc2UgewpAQCAtMjc3LDcgKzI3OCw4IEBACiAJCX0gZWxzZSB7CiAJCQkvKiBhbGxvd2VkCiAJCQkgKiBjaGVjayBkZWNyeXB0aW9uIHN0YXR1cywgYW5kIGRlY3J5cHQgdGhlCi0JCQkgKiBmcmFtZSBpZiBuZWVkZWQgKi8KKwkJCSAqIGZyYW1lIGlmIG5lZWRlZAorCQkJICovCiAJCQlwcnRuZnJhbWUgPSBwcmVjdl9mcmFtZTsKIAkJCS8qIGNoZWNrIGlzIHRoZSBFQVBPTCBmcmFtZSBvciBub3QgKFJla2V5KSAqLwogCQkJaWYgKGV0aGVyX3R5cGUgPT0gMHg4ODhlKSB7CkBAIC0zMzQsMTkgKzMzNiwyMiBAQAogCQlzdGFfYWRkciA9IHBhdHRyaWItPnNyYzsKIAl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7CiAJCS8qIEZvciBTdGF0aW9uIG1vZGUsIHNhIGFuZCBic3NpZCBzaG91bGQgYWx3YXlzIGJlIEJTU0lELAotCQkgKiBhbmQgREEgaXMgbXkgbWFjLWFkZHJlc3MgKi8KKwkJICogYW5kIERBIGlzIG15IG1hYy1hZGRyZXNzCisJCSAqLwogCQlpZiAobWVtY21wKHBhdHRyaWItPmJzc2lkLCBwYXR0cmliLT5zcmMsIEVUSF9BTEVOKSkKIAkJCXJldHVybiBfRkFJTDsKIAkgICAgICAgc3RhX2FkZHIgPSBwYXR0cmliLT5ic3NpZDsKIAl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewogCQlpZiAoYm1jYXN0KSB7CiAJCQkvKiBGb3IgQVAgbW9kZSwgaWYgREEgPT0gTUNBU1QsIHRoZW4gQlNTSUQgc2hvdWxkCi0JCQkgKiBiZSBhbHNvIE1DQVNUICovCisJCQkgKiBiZSBhbHNvIE1DQVNUCisJCQkgKi8KIAkJCWlmICghSVNfTUNBU1QocGF0dHJpYi0+YnNzaWQpKQogCQkJCXJldHVybiBfRkFJTDsKIAkJfSBlbHNlIHsgLyogbm90IG1jLWZyYW1lICovCiAJCQkvKiBGb3IgQVAgbW9kZSwgaWYgREEgaXMgbm9uLU1DQVNULCB0aGVuIGl0IG11c3QgYmUKLQkJCSAqICBCU1NJRCwgYW5kIGJzc2lkID09IEJTU0lEICovCisJCQkgKiBCU1NJRCwgYW5kIGJzc2lkID09IEJTU0lECisJCQkgKi8KIAkJCWlmIChtZW1jbXAocGF0dHJpYi0+YnNzaWQsIHBhdHRyaWItPmRzdCwgRVRIX0FMRU4pKQogCQkJCXJldHVybiBfRkFJTDsKIAkJCXN0YV9hZGRyID0gcGF0dHJpYi0+c3JjOwpAQCAtMzkxLDcgKzM5Niw4IEBACiAJCWlmICgoR2V0RnJhbWVTdWJUeXBlKHB0cikpID09IFdJRklfREFUQV9OVUxMKQogCQkJcmV0dXJuIF9GQUlMOwogCQkvKiBkcm9wIFFvUy1TdWJUeXBlIERhdGEsIGluY2x1ZGluZyBRb1MgTlVMTCwKLQkJICogZXhjbHVkaW5nIFFvUy1EYXRhICovCisJCSAqIGV4Y2x1ZGluZyBRb1MtRGF0YQorCQkgKi8KIAkJaWYgKChHZXRGcmFtZVN1YlR5cGUocHRyKSAmIFdJRklfUU9TX0RBVEFfVFlQRSkgPT0KIAkJICAgICBXSUZJX1FPU19EQVRBX1RZUEUpIHsKIAkJCWlmIChHZXRGcmFtZVN1YlR5cGUocHRyKSAmIChCSVQoNCkgfCBCSVQoNSkgfCBCSVQoNikpKQpAQCAtNDQ1LDcgKzQ1MSw4IEBACiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewogCQkvKiBGb3IgQVAgbW9kZSwgaWYgREEgaXMgbm9uLU1DQVNULCB0aGVuIGl0IG11c3QgYmUgQlNTSUQsCiAJCSAqIGFuZCBic3NpZCA9PSBCU1NJRAotCQkgKiBGb3IgQVAgbW9kZSwgUkE9QlNTSUQsIFRYPVNUQShTUkNfQUREUiksIEEzPURTVF9BRERSICovCisJCSAqIEZvciBBUCBtb2RlLCBSQT1CU1NJRCwgVFg9U1RBKFNSQ19BRERSKSwgQTM9RFNUX0FERFIKKwkJICovCiAJCWlmIChtZW1jbXAocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQsIEVUSF9BTEVOKSkKIAkJCXJldHVybiBfRkFJTDsKIAkJKnBzdGEgPSByODcxMl9nZXRfc3RhaW5mbyhwc3RhcHJpdiwgcGF0dHJpYi0+c3JjKTsKQEAgLTYxOSw3ICs2MjYsOCBAQAogCSAgICAobWVtY21wKHBzbmFwX3R5cGUsICh2b2lkICopU05BUF9FVEhfVFlQRV9BUFBMRVRBTEtfQUFSUCwgMikpKSB8fAogCSAgICAgIW1lbWNtcChwc25hcCwgKHZvaWQgKilicmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSkgewogCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gYW5kCi0JCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCSAqIHJlcGxhY2UgRXRoZXJUeXBlCisJCSAqLwogCQlic25hcGhkciA9IHRydWU7CiAJfSBlbHNlIHsKIAkJLyogTGVhdmUgRXRoZXJuZXQgaGVhZGVyIHBhcnQgb2YgaGRyIGFuZCBmdWxsIHBheWxvYWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmgKaW5kZXggNzc0ODdiYi4uZjQxOTk0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmgKQEAgLTE1Myw3ICsxNTMsOCBAQAogc3RhdGljIGlubGluZSB1OCAqcmVjdmZyYW1lX3B1bGwodW5pb24gcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwgc2ludCBzeikKIHsKIAkvKiB1c2VkIGZvciBleHRyYWN0IHN6IGJ5dGVzIGZyb20gcnhfZGF0YSwgdXBkYXRlIHJ4X2RhdGEgYW5kIHJldHVybgotCSAqICB0aGUgdXBkYXRlZCByeF9kYXRhIHRvIHRoZSBjYWxsZXIgKi8KKwkgKiB0aGUgdXBkYXRlZCByeF9kYXRhIHRvIHRoZSBjYWxsZXIKKwkgKi8KIAlpZiAocHJlY3ZmcmFtZSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlwcmVjdmZyYW1lLT51Lmhkci5yeF9kYXRhICs9IHN6OwpAQCAtMTY5LDcgKzE3MCw4IEBACiB7CiAJLyogdXNlZCBmb3IgYXBwZW5kIHN6IGJ5dGVzIGZyb20gcHRyIHRvIHJ4X3RhaWwsIHVwZGF0ZSByeF90YWlsIGFuZAogCSAqIHJldHVybiB0aGUgdXBkYXRlZCByeF90YWlsIHRvIHRoZSBjYWxsZXIKLQkgKiBhZnRlciBwdXR0aW5nLCByeF90YWlsIG11c3QgYmUgc3RpbGwgbGFyZ2VyIHRoYW4gcnhfZW5kLiAqLworCSAqIGFmdGVyIHB1dHRpbmcsIHJ4X3RhaWwgbXVzdCBiZSBzdGlsbCBsYXJnZXIgdGhhbiByeF9lbmQuCisJICovCiAJaWYgKHByZWN2ZnJhbWUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJcHJlY3ZmcmFtZS0+dS5oZHIucnhfdGFpbCArPSBzejsKQEAgLTE4Niw3ICsxODgsOCBAQAogCS8qIHJtdiBkYXRhIGZyb20gcnhfdGFpbCAoYnkgeWl0c2VuKQogCSAqIHVzZWQgZm9yIGV4dHJhY3Qgc3ogYnl0ZXMgZnJvbSByeF9lbmQsIHVwZGF0ZSByeF9lbmQgYW5kIHJldHVybiB0aGUKIAkgKiB1cGRhdGVkIHJ4X2VuZCB0byB0aGUgY2FsbGVyCi0JICogYWZ0ZXIgcHVsbGluZywgcnhfZW5kIG11c3QgYmUgc3RpbGwgbGFyZ2VyIHRoYW4gcnhfZGF0YS4gKi8KKwkgKiBhZnRlciBwdWxsaW5nLCByeF9lbmQgbXVzdCBiZSBzdGlsbCBsYXJnZXIgdGhhbiByeF9kYXRhLgorCSAqLwogCWlmIChwcmVjdmZyYW1lID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCXByZWN2ZnJhbWUtPnUuaGRyLnJ4X3RhaWwgLT0gc3o7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmgKaW5kZXggMjI5NWYwZS4uZmE5NTJlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuaApAQCAtOTAsMTggKzkwLDIzIEBACiAKIHN0cnVjdCBzZWN1cml0eV9wcml2IHsKIAl1MzIgQXV0aEFsZ3J0aG07CQkvKiA4MDIuMTEgYXV0aCwgY291bGQgYmUgb3Blbiwgc2hhcmVkLAotCQkJCQkgKiA4MDIxeCBhbmQgYXV0aHN3aXRjaCAqLworCQkJCQkgKiA4MDIxeCBhbmQgYXV0aHN3aXRjaAorCQkJCQkgKi8KIAl1MzIgUHJpdmFjeUFsZ3J0aG07CQkvKiBUaGlzIHNwZWNpZnkgdGhlIHByaXZhY3kgZm9yIHNoYXJlZAotCQkJCQkgKiBhdXRoLiBhbGdvcml0aG0uICovCisJCQkJCSAqIGF1dGguIGFsZ29yaXRobS4KKwkJCQkJICovCiAJdTMyIFByaXZhY3lLZXlJbmRleDsJCS8qIHRoaXMgaXMgb25seSB2YWxpZCBmb3IgbGVnZW5kYXJ5Ci0JCQkJCSAqIHdlcCwgMH4zIGZvciBrZXkgaWQuICovCisJCQkJCSAqIHdlcCwgMH4zIGZvciBrZXkgaWQuCisJCQkJCSAqLwogCXVuaW9uIEtleXR5cGUgRGVmS2V5WzRdOwkvKiB0aGlzIGlzIG9ubHkgdmFsaWQgZm9yIGRlZi4ga2V5ICovCiAJdTMyIERlZktleWxlbls0XTsKIAl1MzIgWEdycFByaXZhY3k7CQkvKiBUaGlzIHNwZWNpZnkgdGhlIHByaXZhY3kgYWxndGhtLgotCQkJCQkgKiB1c2VkIGZvciBHcnAga2V5ICovCisJCQkJCSAqIHVzZWQgZm9yIEdycCBrZXkKKwkJCQkJICovCiAJdTMyIFhHcnBLZXlpZDsJCQkvKiBrZXkgaWQgdXNlZCBmb3IgR3JwIEtleSAqLwogCXVuaW9uIEtleXR5cGUJWEdycEtleVsyXTsJLyogODAyLjF4IEdyb3VwIEtleSwgZm9yCi0JCQkJCSAqIGlueDAgYW5kIGlueDEgKi8KKwkJCQkJICogaW54MCBhbmQgaW54MQorCQkJCQkgKi8KIAl1bmlvbiBLZXl0eXBlCVhHcnB0eG1pY2tleVsyXTsKIAl1bmlvbiBLZXl0eXBlCVhHcnByeG1pY2tleVsyXTsKIAl1bmlvbiBwbjQ4IEdycHR4cG47CQkvKiBQTjQ4IHVzZWQgZm9yIEdycCBLZXkgeG1pdC4gKi8KQEAgLTExOCw5ICsxMjMsMTEgQEAKIAlzMzIJc3dfZW5jcnlwdDsJLyogZnJvbSByZWdpc3RyeV9wcml2ICovCiAJczMyCXN3X2RlY3J5cHQ7CS8qIGZyb20gcmVnaXN0cnlfcHJpdiAqLwogCXMzMglod19kZWNyeXB0ZWQ7CS8qIGlmIHRoZSByeCBwYWNrZXRzIGlzIGh3X2RlY3J5cHRlZD09ZmFsc2UsCi0JCQkJICogaXQgbWVhbnMgdGhlIGh3IGhhcyBub3QgYmVlbiByZWFkeS4gKi8KKwkJCQkgKiBpdCBtZWFucyB0aGUgaHcgaGFzIG5vdCBiZWVuIHJlYWR5LgorCQkJCSAqLwogCXUzMiBuZGlzYXV0aHR5cGU7CS8qIGtlZXBzIHRoZSBhdXRoX3R5cGUgJiBlbmNfc3RhdHVzIGZyb20gdXBwZXIKLQkJCQkgKiBsYXllciBpb2N0bCh3cGFfc3VwcGxpY2FudCBvciB3emMpICovCisJCQkJICogbGF5ZXIgaW9jdGwod3BhX3N1cHBsaWNhbnQgb3Igd3pjKQorCQkJCSAqLwogCXUzMiBuZGlzZW5jcnlwdHN0YXR1czsKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCBzZWNfYnNzOyAgLyogZm9yIGpvaW5ic3MgKGgyYyBidWZmZXIpIHVzYWdlICovCiAJc3RydWN0IE5ESVNfODAyXzExX1dFUCBuZGlzd2VwOwpAQCAtMTM2LDcgKzE0Myw4IEBACiAJdTMyIGJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWU7CiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJICogRm9yIFdQQTIgUHJlLUF1dGhlbnRpY2F0aW9uLgotCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiovCiAJc3RydWN0IFJUX1BNS0lEX0xJU1QJCVBNS0lETGlzdFtOVU1fUE1LSURfQ0FDSEVdOwogCXU4CQkJCVBNS0lESW5kZXg7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zdGFfbWd0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3N0YV9tZ3QuYwppbmRleCBlMTFjZTI4Li5lMmQ3NWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3N0YV9tZ3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3N0YV9tZ3QuYwpAQCAtMTg4LDcgKzE4OCw4IEBACiAJX3I4NzEyX2luaXRfc3RhX3htaXRfcHJpdigmcHN0YS0+c3RhX3htaXRwcml2KTsKIAlfcjg3MTJfaW5pdF9zdGFfcmVjdl9wcml2KCZwc3RhLT5zdGFfcmVjdnByaXYpOwogCS8qIGZvciBBLU1QRFUgUnggcmVvcmRlcmluZyBidWZmZXIgY29udHJvbCwKLQkgKiBjYW5jZWwgcmVvcmRlcmluZ19jdHJsX3RpbWVyICovCisJICogY2FuY2VsIHJlb3JkZXJpbmdfY3RybF90aW1lcgorCSAqLwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtpXTsKIAkJZGVsX3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYwppbmRleCA5OTI1NmJhLi5iZTM4MzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYwpAQCAtMjA0LDcgKzIwNCw4IEBACiAKIHsKIAkvKklmIGRyaXZlciB4bWl0IEFSUCBwYWNrZXQsIGRyaXZlciBjYW4gc2V0IHBzIG1vZGUgdG8gaW5pdGlhbAotCSAqIHNldHRpbmcuIEl0IHN0YW5kcyBmb3IgZ2V0dGluZyBESENQIG9yIGZpeCBJUC4qLworCSAqIHNldHRpbmcuIEl0IHN0YW5kcyBmb3IgZ2V0dGluZyBESENQIG9yIGZpeCBJUC4KKwkgKi8KIAlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSAweDA4MDYpIHsKIAkJaWYgKHBhZGFwdGVyLT5wd3JjdHJscHJpdi5wd3JfbW9kZSAhPQogCQkgICAgcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5wb3dlcl9tZ250KSB7CkBAIC0yMzIsNyArMjMzLDggQEAKIAkJaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgIT0gMHg4NzEyKQogCQkJcmV0dXJuIF9GQUlMOwogCQkvKiBmb3IgbXAgc3RvcmluZyB0aGUgdHhjbWQgcGVyIHBhY2tldCwKLQkJICogYWNjb3JkaW5nIHRvIHRoZSBpbmZvIG9mIHR4Y21kIHRvIHVwZGF0ZSBwYXR0cmliICovCisJCSAqIGFjY29yZGluZyB0byB0aGUgaW5mbyBvZiB0eGNtZCB0byB1cGRhdGUgcGF0dHJpYgorCQkgKi8KIAkJLypnZXQgTVBfVFhERVNDX1NJWkUgYnl0ZXMgdHhjbWQgcGVyIHBhY2tldCovCiAJCV9yODcxMl9wa3RmaWxlX3JlYWQoJnBrdGZpbGUsICh1OCAqKSZ0eGRlc2MsIFRYREVTQ19TSVpFKTsKIAkJbWVtY3B5KHBhdHRyaWItPnJhLCBwYXR0cmliLT5kc3QsIEVUSF9BTEVOKTsKQEAgLTI0NCw3ICsyNDYsOCBAQAogCWlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX0lQKSB7CiAJCS8qIFRoZSBmb2xsb3dpbmcgaXMgZm9yIERIQ1AgYW5kIEFSUCBwYWNrZXQsIHdlIHVzZSBjY2sxTSB0bwogCQkgKiB0eCB0aGVzZSBwYWNrZXRzIGFuZCBsZXQgTFBTIGF3YWtlIHNvbWUgdGltZQotCQkgKiB0byBwcmV2ZW50IERIQ1AgcHJvdG9jb2wgZmFpbCAqLworCQkgKiB0byBwcmV2ZW50IERIQ1AgcHJvdG9jb2wgZmFpbAorCQkgKi8KIAkJdTggdG1wWzI0XTsKIAogCQlfcjg3MTJfcGt0ZmlsZV9yZWFkKCZwa3RmaWxlLCAmdG1wWzBdLCAyNCk7CkBAIC0yNTUsNyArMjU4LDggQEAKIAkJCQkJKCh0bXBbMjFdID09IDY3KSAmJiAodG1wWzIzXSA9PSA2OCkpKSB7CiAJCQkJCS8qIDY4IDogVURQIEJPT1RQIGNsaWVudAogCQkJCQkgKiA2NyA6IFVEUCBCT09UUCBzZXJ2ZXIKLQkJCQkJICogVXNlIGxvdyByYXRlIHRvIHNlbmQgREhDUCBwYWNrZXQuKi8KKwkJCQkJICogVXNlIGxvdyByYXRlIHRvIHNlbmQgREhDUCBwYWNrZXQuCisJCQkJCSAqLwogCQkJCQlwYXR0cmliLT5kaGNwX3BrdCA9IDE7CiAJCQkJfQogCQkJfQpAQCAtMzM3LDcgKzM0MSw4IEBACiAJZWxzZQogCQlwYXR0cmliLT5ic3dlbmMgPSBmYWxzZTsKIAkvKiBpZiBpbiBNUF9TVEFURSwgdXBkYXRlIHBrdF9hdHRyaWIgZnJvbSBtcF90eGNtZCwgYW5kIG92ZXJ3cml0ZQotCSAqIHNvbWUgc2V0dGluZ3MgYWJvdmUuKi8KKwkgKiBzb21lIHNldHRpbmdzIGFib3ZlLgorCSAqLwogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9NUF9TVEFURSkpCiAJCXBhdHRyaWItPnByaW9yaXR5ID0gKHR4ZGVzYy50eGR3MSA+PiBRU0VMX1NIVCkgJiAweDFmOwogCXJldHVybiBfU1VDQ0VTUzsKQEAgLTQzOCw3ICs0NDMsOCBAQAogCQkJfQogCQkJcjg3MTJfc2VjZ2V0bWljKCZtaWNkYXRhLCAmKG1pY1swXSkpOwogCQkJLyogYWRkIG1pYyBjb2RlICBhbmQgYWRkIHRoZSBtaWMgY29kZSBsZW5ndGggaW4KLQkJCSAqIGxhc3RfdHhjbWRzeiAqLworCQkJICogbGFzdF90eGNtZHN6CisJCQkgKi8KIAkJCW1lbWNweShwYXlsb2FkLCAmKG1pY1swXSksIDgpOwogCQkJcGF0dHJpYi0+bGFzdF90eGNtZHN6ICs9IDg7CiAJCQlwYXlsb2FkID0gcGF5bG9hZCAtIHBhdHRyaWItPmxhc3RfdHhjbWRzeiArIDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5oCmluZGV4IGE5NjMzYzMuLmQ4OTlkMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfeG1pdC5oCkBAIC01OCw3ICs1OCw4IEBACiB9IHdoaWxlICgwKQogCiAvKiBGaXhlZCB0aGUgQmlnIEVuZGlhbiBidWcgd2hlbiBkb2luZyB0aGUgVHguCi0gKiBUaGUgTGlua3N5cyBXUkg1NEcgd2lsbCBjaGVjayB0aGlzLiovCisgKiBUaGUgTGlua3N5cyBXUkg1NEcgd2lsbCBjaGVjayB0aGlzLgorICovCiAjZGVmaW5lIFRLSVBfSVYocGF0dHJpYl9pdiwgdHhwbiwga2V5aWR4KVwKIGRvIHsgXAogCXBhdHRyaWJfaXZbMF0gPSB0eHBuLl9ieXRlXy5UU0MxO1wKQEAgLTEwNSw3ICsxMDYsOCBAQAogCXUxNglzZXFudW07CiAJdTE2CWV0aGVyX3R5cGU7CiAJdTE2CXBrdGxlbjsJCS8qIHRoZSBvcmlnaW5hbCA4MDIuMyBwa3QgcmF3X2RhdGEgbGVuCi0JCQkJICogKG5vdCBpbmNsdWRlIGV0aGVyX2hkciBkYXRhKSAqLworCQkJCSAqIChub3QgaW5jbHVkZSBldGhlcl9oZHIgZGF0YSkKKwkJCQkgKi8KIAl1MTYJbGFzdF90eGNtZHN6OwogCiAJdTgJcGt0X2hkcmxlbjsJLyp0aGUgb3JpZ2luYWwgODAyLjMgcGt0IGhlYWRlciBsZW4qLwpAQCAtMTE5LDcgKzEyMSw4IEBACiAKIAl1OAlwcmlvcml0eTsKIAl1OAllbmNyeXB0OwkvKiB3aGVuIDAgaW5kaWNhdGUgbm8gZW5jcnlwdC4gd2hlbiBub24temVybywKLQkJCQkgKiBpbmRpY2F0ZSB0aGUgZW5jcnlwdCBhbGdvcml0aG0qLworCQkJCSAqIGluZGljYXRlIHRoZSBlbmNyeXB0IGFsZ29yaXRobQorCQkJCSAqLwogCXU4CWl2X2xlbjsKIAl1OAlpY3ZfbGVuOwogCXVuc2lnbmVkIGNoYXIgaXZbOF07CkBAIC0xNzYsNyArMTc5LDggQEAKIAlzcGlubG9ja190IGxvY2s7CiAJc2ludAlvcHRpb247CiAJc2ludAlhcHNkX3NldHRpbmc7CS8qIFdoZW4gYml0IG1hc2sgaXMgb24sIHRoZSBhc3NvY2lhdGVkIGVkY2EKLQkJCQkgKiBxdWV1ZSBzdXBwb3J0cyBBUFNELiovCisJCQkJICogcXVldWUgc3VwcG9ydHMgQVBTRC4KKwkJCQkgKi8KIAlzdHJ1Y3QgdHhfc2VydnEJYmVfcTsJLyogcHJpb3JpdHkgPT0gMCwzICovCiAJc3RydWN0IHR4X3NlcnZxCWJrX3E7CS8qIHByaW9yaXR5ID09IDEsMiovCiAJc3RydWN0IHR4X3NlcnZxCXZpX3E7CS8qcHJpb3JpdHkgPT0gNCw1Ki8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9oYWxpbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaGFsaW5pdC5jCmluZGV4IGFkMjFkZjEuLjBiMTU5ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9oYWxpbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2hhbGluaXQuYwpAQCAtMTk2LDcgKzE5Niw4IEBACiAJCW1zbGVlcCgyMCk7CiAJCS8qIFJldmlzZWQgUE9TLCAqLwogCQkvKiBFbmFibGUgQUZFIE1hY3JvIEJsb2NrJ3MgQmFuZGdhcCBhbmQgRW5hYmxlIEFGRSBNYWNybwotCQkgKiBCbG9jaydzIE1iaWFzICovCisJCSAqIEJsb2NrJ3MgTWJpYXMKKwkJICovCiAJCXI4NzEyX3dyaXRlOChwYWRhcHRlciwgU1BTMF9DVFJMICsgMSwgMHg1Myk7CiAJCXI4NzEyX3dyaXRlOChwYWRhcHRlciwgU1BTMF9DVFJMLCAweDU3KTsKIAkJdmFsOCA9IHI4NzEyX3JlYWQ4KHBhZGFwdGVyLCBBRkVfTUlTQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYwppbmRleCBjMWEwY2E0OS4uODk3ZDQ2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jCkBAIC0zMDEsNyArMzAxLDggQEAKIAkvKmRpc2FibGVfaHdfaW50ZXJydXB0Ki8KIAlpZiAoIXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7CiAJCS8qZGV2aWNlIHN0aWxsIGV4aXN0cywgc28gZHJpdmVyIGNhbiBkbyBpL28gb3BlcmF0aW9uCi0JCSAqIFRPRE86ICovCisJCSAqIFRPRE86CisJCSAqLwogCX0KIAogCS8qIGNhbmNlbCBpbiBpcnAgKi8KQEAgLTM2OCw3ICszNjksNyBAQAogICoKICAqIG5vdGVzOiBkcnZfaW5pdCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBidXMgZHJpdmVyIGhhcyBsb2NhdGVkIGEgY2FyZCBmb3IgdXMKICAqIHRvIHN1cHBvcnQuIFdlIGFjY2VwdCB0aGUgbmV3IGRldmljZSBieSByZXR1cm5pbmcgMC4KLSovCisgKi8KIHN0YXRpYyBpbnQgcjg3MXh1X2Rydl9pbml0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGYsCiAJCQkgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqcGRpZCkKIHsKQEAgLTYxMSw3ICs2MTIsOCBAQAogfQogCiAvKiBybW1vZCBtb2R1bGUgJiB1bnBsdWcoU3VycHJpc2VSZW1vdmVkKSB3aWxsIGNhbGwgcjg3MXh1X2Rldl9yZW1vdmUoKQotICogPT4gaG93IHRvIHJlY29nbml6ZSBib3RoICovCisgKiA9PiBob3cgdG8gcmVjb2duaXplIGJvdGgKKyAqLwogc3RhdGljIHZvaWQgcjg3MXh1X2Rldl9yZW1vdmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRmKTsKQEAgLTYzNSwxMiArNjM3LDE0IEBACiAJCXI4NzEyX2ZyZWVfZHJ2X3N3KHBhZGFwdGVyKTsKIAogCQkvKiBkZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSB1c2IgZGV2aWNlIHN0cnVjdHVyZQotCQkgKiB3aGVuIGRpc2Nvbm5lY3QgKi8KKwkJICogd2hlbiBkaXNjb25uZWN0CisJCSAqLwogCQl1c2JfcHV0X2Rldih1ZGV2KTsKIAl9CiAJLyogSWYgd2UgZGlkbid0IHVucGx1ZyB1c2IgZG9uZ2xlIGFuZCByZW1vdmUvaW5zZXJ0IG1vZHVsZSwgZHJpdmVyCiAJICogZmFpbHMgb24gc2l0ZXN1cnZleSBmb3IgdGhlIGZpcnN0IHRpbWUgd2hlbiBkZXZpY2UgaXMgdXAuCi0JICogUmVzZXQgdXNiIHBvcnQgZm9yIHNpdGVzdXJ2ZXkgZmFpbCBpc3N1ZS4gKi8KKwkgKiBSZXNldCB1c2IgcG9ydCBmb3Igc2l0ZXN1cnZleSBmYWlsIGlzc3VlLgorCSAqLwogCWlmICh1ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpCiAJCXVzYl9yZXNldF9kZXZpY2UodWRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2Jfb3BzX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2Jfb3BzX2xpbnV4LmMKaW5kZXggNmYxMjM0NS4uZmM2YmIwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX29wc19saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9vcHNfbGludXguYwpAQCAtNTAsNyArNTAsNyBAQAogCXBpbnRmcHJpdi0+cGlvcndfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXBpbnRmcHJpdi0+cGlvcndfdXJiKQogCQlyZXR1cm4gX0ZBSUw7Ci0Jc2VtYV9pbml0KCYocGludGZwcml2LT5pb19yZXRldnQpLCAwKTsKKwlpbml0X2NvbXBsZXRpb24oJnBpbnRmcHJpdi0+aW9fcmV0ZXZ0X2NvbXApOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KIApAQCAtMTYzLDcgKzE2Myw3IEBACiAJCWVsc2UKIAkJCXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID0gdHJ1ZTsKIAl9Ci0JdXAoJnBpbnRmcHJpdi0+aW9fcmV0ZXZ0KTsKKwljb21wbGV0ZSgmcGludGZwcml2LT5pb19yZXRldnRfY29tcCk7CiB9CiAKIHZvaWQgcjg3MTJfdXNiX3dyaXRlX21lbShzdHJ1Y3QgaW50Zl9oZGwgKnBpbnRmaGRsLCB1MzIgYWRkciwgdTMyIGNudCwgdTggKndtZW0pCkBAIC0xODcsNyArMTg3LDcgQEAKIAkJCSAgd21lbSwgY250LCB1c2Jfd3JpdGVfbWVtX2NvbXBsZXRlLAogCQkJICBwaW9fcXVldWUpOwogCXVzYl9zdWJtaXRfdXJiKHBpb3J3X3VyYiwgR0ZQX0FUT01JQyk7Ci0JX2Rvd25fc2VtYSgmcGludGZwcml2LT5pb19yZXRldnQpOworCXdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZSgmcGludGZwcml2LT5pb19yZXRldnRfY29tcCk7CiB9CiAKIHN0YXRpYyB2b2lkIHI4NzEyX3VzYl9yZWFkX3BvcnRfY29tcGxldGUoc3RydWN0IHVyYiAqcHVyYikKQEAgLTIwMiwyNiArMjAyLDIzIEBACiAJaWYgKHB1cmItPnN0YXR1cyA9PSAwKSB7IC8qIFNVQ0NFU1MgKi8KIAkJaWYgKChwdXJiLT5hY3R1YWxfbGVuZ3RoID4gKE1BWF9SRUNWQlVGX1NaKSkgfHwKIAkJICAgIChwdXJiLT5hY3R1YWxfbGVuZ3RoIDwgUlhERVNDX1NJWkUpKSB7Ci0JCQlwcmVjdmJ1Zi0+cmV1c2UgPSB0cnVlOwogCQkJcjg3MTJfcmVhZF9wb3J0KHBhZGFwdGVyLCBwcmVjdnByaXYtPmZmX2h3YWRkciwgMCwKIAkJCQkgICh1bnNpZ25lZCBjaGFyICopcHJlY3ZidWYpOwogCQl9IGVsc2UgeworCQkJX3BrdCAqcHNrYiA9IHByZWN2YnVmLT5wc2tiOworCiAJCQlwcmVjdmJ1Zi0+dHJhbnNmZXJfbGVuID0gcHVyYi0+YWN0dWFsX2xlbmd0aDsKIAkJCXBidWYgPSAodWludCAqKXByZWN2YnVmLT5wYnVmOwogCQkJaXNldnQgPSBsZTMyX3RvX2NwdSgqKHBidWYgKyAxKSkgJiAweDFmZjsKIAkJCWlmICgoaXNldnQgJiAweDFmZikgPT0gMHgxZmYpIHsKIAkJCQlyODcxMl9yeGNtZF9ldmVudF9oZGwocGFkYXB0ZXIsIHBidWYpOwotCQkJCXByZWN2YnVmLT5yZXVzZSA9IHRydWU7CisJCQkJc2tiX3F1ZXVlX3RhaWwoJnByZWN2cHJpdi0+cnhfc2tiX3F1ZXVlLCBwc2tiKTsKIAkJCQlyODcxMl9yZWFkX3BvcnQocGFkYXB0ZXIsIHByZWN2cHJpdi0+ZmZfaHdhZGRyLAogCQkJCQkJMCwgKHVuc2lnbmVkIGNoYXIgKilwcmVjdmJ1Zik7CiAJCQl9IGVsc2UgewotCQkJCV9wa3QgKnBza2IgPSBwcmVjdmJ1Zi0+cHNrYjsKLQogCQkJCXNrYl9wdXQocHNrYiwgcHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJCQkJc2tiX3F1ZXVlX3RhaWwoJnByZWN2cHJpdi0+cnhfc2tiX3F1ZXVlLCBwc2tiKTsKIAkJCQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZwcmVjdnByaXYtPnJlY3ZfdGFza2xldCk7Ci0JCQkJcHJlY3ZidWYtPnBza2IgPSBOVUxMOwotCQkJCXByZWN2YnVmLT5yZXVzZSA9IGZhbHNlOwogCQkJCXI4NzEyX3JlYWRfcG9ydChwYWRhcHRlciwgcHJlY3Zwcml2LT5mZl9od2FkZHIsCiAJCQkJCQkwLCAodW5zaWduZWQgY2hhciAqKXByZWN2YnVmKTsKIAkJCX0KQEAgLTI0MSw3ICsyMzgsNiBAQAogCQkJfQogCQkJLyogRmFsbCB0aHJvdWdoLiAqLwogCQljYXNlIC1FUFJPVE86Ci0JCQlwcmVjdmJ1Zi0+cmV1c2UgPSB0cnVlOwogCQkJcjg3MTJfcmVhZF9wb3J0KHBhZGFwdGVyLCBwcmVjdnByaXYtPmZmX2h3YWRkciwgMCwKIAkJCQkgICh1bnNpZ25lZCBjaGFyICopcHJlY3ZidWYpOwogCQkJYnJlYWs7CkBAIC0yNzAsNTEgKzI2Niw0MyBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiZCA9IHBkdm9iai0+cHVzYmRldjsKIAogCWlmIChhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkIHx8Ci0JICAgIGFkYXB0ZXItPnB3cmN0cmxwcml2LnBucF9ic3RvcF90cngpCisJICAgIGFkYXB0ZXItPnB3cmN0cmxwcml2LnBucF9ic3RvcF90cnggfHwgIXByZWN2YnVmKQogCQlyZXR1cm4gX0ZBSUw7Ci0JaWYgKHByZWN2YnVmLT5yZXVzZSB8fCAhcHJlY3ZidWYtPnBza2IpIHsKLQkJcHJlY3ZidWYtPnBza2IgPSBza2JfZGVxdWV1ZSgmcHJlY3Zwcml2LT5mcmVlX3JlY3Zfc2tiX3F1ZXVlKTsKLQkJaWYgKHByZWN2YnVmLT5wc2tiICE9IE5VTEwpCi0JCQlwcmVjdmJ1Zi0+cmV1c2UgPSB0cnVlOworCXI4NzEyX2luaXRfcmVjdmJ1ZihhZGFwdGVyLCBwcmVjdmJ1Zik7CisJLyogVHJ5IHRvIHVzZSBza2IgZnJvbSB0aGUgZnJlZSBxdWV1ZSAqLworCXByZWN2YnVmLT5wc2tiID0gc2tiX2RlcXVldWUoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSk7CisKKwlpZiAoIXByZWN2YnVmLT5wc2tiKSB7CisJCXByZWN2YnVmLT5wc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihhZGFwdGVyLT5wbmV0ZGV2LAorCQkJCSBNQVhfUkVDVkJVRl9TWiArIFJFQ1ZCVUZGX0FMSUdOX1NaKTsKKwkJaWYgKCFwcmVjdmJ1Zi0+cHNrYikKKwkJCXJldHVybiBfRkFJTDsKKwkJdG1wYWRkciA9IChhZGRyX3QpcHJlY3ZidWYtPnBza2ItPmRhdGE7CisJCWFsaWdubWVudCA9IHRtcGFkZHIgJiAoUkVDVkJVRkZfQUxJR05fU1ogLSAxKTsKKwkJc2tiX3Jlc2VydmUocHJlY3ZidWYtPnBza2IsCisJCQkgICAgKFJFQ1ZCVUZGX0FMSUdOX1NaIC0gYWxpZ25tZW50KSk7CisJCXByZWN2YnVmLT5waGVhZCA9IHByZWN2YnVmLT5wc2tiLT5oZWFkOworCQlwcmVjdmJ1Zi0+cGRhdGEgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKKwkJcHJlY3ZidWYtPnB0YWlsID0gc2tiX3RhaWxfcG9pbnRlcihwcmVjdmJ1Zi0+cHNrYik7CisJCXByZWN2YnVmLT5wZW5kID0gc2tiX2VuZF9wb2ludGVyKHByZWN2YnVmLT5wc2tiKTsKKwkJcHJlY3ZidWYtPnBidWYgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKKwl9IGVsc2UgeyAvKiBza2IgaXMgcmV1c2VkICovCisJCXByZWN2YnVmLT5waGVhZCA9IHByZWN2YnVmLT5wc2tiLT5oZWFkOworCQlwcmVjdmJ1Zi0+cGRhdGEgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKKwkJcHJlY3ZidWYtPnB0YWlsID0gc2tiX3RhaWxfcG9pbnRlcihwcmVjdmJ1Zi0+cHNrYik7CisJCXByZWN2YnVmLT5wZW5kID0gc2tiX2VuZF9wb2ludGVyKHByZWN2YnVmLT5wc2tiKTsKKwkJcHJlY3ZidWYtPnBidWYgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKIAl9Ci0JaWYgKHByZWN2YnVmICE9IE5VTEwpIHsKLQkJcjg3MTJfaW5pdF9yZWN2YnVmKGFkYXB0ZXIsIHByZWN2YnVmKTsKLQkJLyogcmUtYXNzaWduIGZvciBsaW51eCBiYXNlZCBvbiBza2IgKi8KLQkJaWYgKCFwcmVjdmJ1Zi0+cmV1c2UgfHwgIXByZWN2YnVmLT5wc2tiKSB7Ci0JCQlwcmVjdmJ1Zi0+cHNrYiA9IG5ldGRldl9hbGxvY19za2IoYWRhcHRlci0+cG5ldGRldiwKLQkJCQkJIE1BWF9SRUNWQlVGX1NaICsgUkVDVkJVRkZfQUxJR05fU1opOwotCQkJaWYgKCFwcmVjdmJ1Zi0+cHNrYikKLQkJCQlyZXR1cm4gX0ZBSUw7Ci0JCQl0bXBhZGRyID0gKGFkZHJfdClwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKLQkJCWFsaWdubWVudCA9IHRtcGFkZHIgJiAoUkVDVkJVRkZfQUxJR05fU1ogLSAxKTsKLQkJCXNrYl9yZXNlcnZlKHByZWN2YnVmLT5wc2tiLAotCQkJCSAgICAoUkVDVkJVRkZfQUxJR05fU1ogLSBhbGlnbm1lbnQpKTsKLQkJCXByZWN2YnVmLT5waGVhZCA9IHByZWN2YnVmLT5wc2tiLT5oZWFkOwotCQkJcHJlY3ZidWYtPnBkYXRhID0gcHJlY3ZidWYtPnBza2ItPmRhdGE7Ci0JCQlwcmVjdmJ1Zi0+cHRhaWwgPSBza2JfdGFpbF9wb2ludGVyKHByZWN2YnVmLT5wc2tiKTsKLQkJCXByZWN2YnVmLT5wZW5kID0gc2tiX2VuZF9wb2ludGVyKHByZWN2YnVmLT5wc2tiKTsKLQkJCXByZWN2YnVmLT5wYnVmID0gcHJlY3ZidWYtPnBza2ItPmRhdGE7Ci0JCX0gZWxzZSB7IC8qIHJldXNlIHNrYiAqLwotCQkJcHJlY3ZidWYtPnBoZWFkID0gcHJlY3ZidWYtPnBza2ItPmhlYWQ7Ci0JCQlwcmVjdmJ1Zi0+cGRhdGEgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKLQkJCXByZWN2YnVmLT5wdGFpbCA9IHNrYl90YWlsX3BvaW50ZXIocHJlY3ZidWYtPnBza2IpOwotCQkJcHJlY3ZidWYtPnBlbmQgPSBza2JfZW5kX3BvaW50ZXIocHJlY3ZidWYtPnBza2IpOwotCQkJcHJlY3ZidWYtPnBidWYgPSBwcmVjdmJ1Zi0+cHNrYi0+ZGF0YTsKLQkJCXByZWN2YnVmLT5yZXVzZSA9IGZhbHNlOwotCQl9Ci0JCXB1cmIgPSBwcmVjdmJ1Zi0+cHVyYjsKLQkJLyogdHJhbnNsYXRlIERNQSBGSUZPIGFkZHIgdG8gcGlwZWhhbmRsZSAqLwotCQlwaXBlID0gZmZhZGRyMnBpcGVoZGwocGR2b2JqLCBhZGRyKTsKLQkJdXNiX2ZpbGxfYnVsa191cmIocHVyYiwgcHVzYmQsIHBpcGUsCi0JCQkJICBwcmVjdmJ1Zi0+cGJ1ZiwgTUFYX1JFQ1ZCVUZfU1osCi0JCQkJICByODcxMl91c2JfcmVhZF9wb3J0X2NvbXBsZXRlLAotCQkJCSAgcHJlY3ZidWYpOwotCQllcnIgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKChlcnIpICYmIChlcnIgIT0gKC1FUEVSTSkpKQotCQkJcmV0ID0gX0ZBSUw7Ci0JfSBlbHNlIHsKKwlwdXJiID0gcHJlY3ZidWYtPnB1cmI7CisJLyogdHJhbnNsYXRlIERNQSBGSUZPIGFkZHIgdG8gcGlwZWhhbmRsZSAqLworCXBpcGUgPSBmZmFkZHIycGlwZWhkbChwZHZvYmosIGFkZHIpOworCXVzYl9maWxsX2J1bGtfdXJiKHB1cmIsIHB1c2JkLCBwaXBlLAorCQkJICBwcmVjdmJ1Zi0+cGJ1ZiwgTUFYX1JFQ1ZCVUZfU1osCisJCQkgIHI4NzEyX3VzYl9yZWFkX3BvcnRfY29tcGxldGUsCisJCQkgIHByZWN2YnVmKTsKKwllcnIgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAoKGVycikgJiYgKGVyciAhPSAoLUVQRVJNKSkpCiAJCXJldCA9IF9GQUlMOwotCX0KIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93aWZpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93aWZpLmgKaW5kZXggN2EzNTJjNC4uYjhhZjk2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2lmaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dpZmkuaApAQCAtMzc2LDcgKzM3Niw4IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCUJlbG93IGlzIGZvciB0aGUgc2VjdXJpdHkgcmVsYXRlZCBkZWZpbml0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lIF9SRVNFUlZFRF9GUkFNRV9UWVBFXwkwCiAjZGVmaW5lIF9TS0JfRlJBTUVfVFlQRV8JMgogI2RlZmluZSBfUFJFX0FMTE9DTUVNXwkJMQpAQCAtNDIwLDcgKzQyMSw4IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCQkJCQlCZWxvdyBpcyB0aGUgZml4ZWQgZWxlbWVudHMuLi4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lIF9BVVRIX0FMR01fTlVNXwkJCTIKICNkZWZpbmUgX0FVVEhfU0VRX05VTV8JCQkyCiAjZGVmaW5lIF9CRUFDT05fSVRFUlZBTF8JCTIKQEAgLTQ0OCwyMCArNDUwLDIzIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCQlCZWxvdyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgODAyLjExaSAvIDgwMi4xeAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUgX0lFRUU4MDIxWF9NR1RfCQkJMQkvKldQQSAqLwogI2RlZmluZSBfSUVFRTgwMjFYX1BTS18JCQkyCS8qIFdQQSB3aXRoIHByZS1zaGFyZWQga2V5ICovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkJCQlCZWxvdyBpcyB0aGUgZGVmaW5pdGlvbiBmb3IgV01NCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZSBfV01NX0lFX0xlbmd0aF8JCQkJNyAgLyogZm9yIFdNTSBTVEEgKi8KICNkZWZpbmUgX1dNTV9QYXJhX0VsZW1lbnRfTGVuZ3RoXwkJMjQKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAJCQkJQmVsb3cgaXMgdGhlIGRlZmluaXRpb24gZm9yIDgwMi4xMW4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKIC8qIGJsb2NrLWFjayBwYXJhbWV0ZXJzICovCiAjZGVmaW5lIElFRUU4MDIxMV9BRERCQV9QQVJBTV9QT0xJQ1lfTUFTSyAweDAwMDIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dsYW5fYnNzZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93bGFuX2Jzc2RlZi5oCmluZGV4IGZkYTU3MDcuLjg2YTg4YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dsYW5fYnNzZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2xhbl9ic3NkZWYuaApAQCAtMTcxLDcgKzE3MSw4IEBACiBzdHJ1Y3QgTkRJU184MDJfMTFfV0VQIHsKIAl1MzIgTGVuZ3RoOwkJICAvKiBMZW5ndGggb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KIAl1MzIgS2V5SW5kZXg7CQkgIC8qIDAgaXMgdGhlIHBlci1jbGllbnQga2V5LAotCQkJCSAgICogMS1OIGFyZSB0aGUgZ2xvYmFsIGtleXMgKi8KKwkJCQkgICAqIDEtTiBhcmUgdGhlIGdsb2JhbCBrZXlzCisJCQkJICAgKi8KIAl1MzIgS2V5TGVuZ3RoOwkJICAvKiBsZW5ndGggb2Yga2V5IGluIGJ5dGVzICovCiAJdTggIEtleU1hdGVyaWFsWzE2XTsgICAgICAvKiB2YXJpYWJsZSBsZW5ndGggZGVwZW5kaW5nIG9uIGFib3ZlIGZpZWxkICovCiB9OwpAQCAtMTk0LDcgKzE5NSw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWludAluZXR3b3JrX3R5cGU7CS8qcmVmZXIgdG8gaWVlZTgwMjExLmggZm9yIFdJUkVMRVNTXzExQS9CL0cgKi8KIAlpbnQJZml4ZWQ7CQkvKiBzZXQgdG8gZml4ZWQgd2hlbiBub3QgdG8gYmUgcmVtb3ZlZCBhc2kKLQkJCQkgKiBzaXRlLXN1cnZleWluZyAqLworCQkJCSAqIHNpdGUtc3VydmV5aW5nCisJCQkJICovCiAJdW5zaWduZWQgaW50CWxhc3Rfc2Nhbm5lZDsgLyp0aW1lc3RhbXAgZm9yIHRoZSBuZXR3b3JrICovCiAJaW50CWFpZDsJCS8qd2lsbCBvbmx5IGJlIHZhbGlkIHdoZW4gYSBCU1MgaXMgam9pbmVkLiAqLwogCWludAlqb2luX3JlczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfbGludXguYwppbmRleCA2OTVmOWI5Li40ZWU0MTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi94bWl0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIveG1pdF9saW51eC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CiAKICNpbmNsdWRlICJvc2RlcF9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiZHJ2X3R5cGVzLmgiCkBAIC05MSw3ICs5Miw4IEBACiAJfSBlbHNlIHsKIAkJLyogIldoZW4gcHJpb3JpdHkgcHJvY2Vzc2luZyBvZiBkYXRhIGZyYW1lcyBpcyBzdXBwb3J0ZWQsCiAJCSAqIGEgU1RBJ3MgU01FIHNob3VsZCBzZW5kIEVBUE9MLUtleSBmcmFtZXMgYXQgdGhlIGhpZ2hlc3QKLQkJICogcHJpb3JpdHkuIiAqLworCQkgKiBwcmlvcml0eS4iCisJCSAqLwogCiAJCWlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IDB4ODg4ZSkKIAkJCVVzZXJQcmlvcml0eSA9IDc7CkBAIC0xMzIsNiArMTM0LDcgQEAKIAkJCW5ldGRldl9lcnIocGFkYXB0ZXItPnBuZXRkZXYsICJweG1pdGJ1Zi0+cHhtaXRfdXJiW2ldID09IE5VTExcbiIpOwogCQkJcmV0dXJuIF9GQUlMOwogCQl9CisJCWttZW1sZWFrX25vdF9sZWFrKHB4bWl0YnVmLT5weG1pdF91cmJbaV0pOwogCX0KIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC0xNjIsMTYgKzE2NSwxNiBAQAogCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CiAKLQlpZiAoIXI4NzEyX2lmX3VwKHBhZGFwdGVyKSkgeworCWlmICghcjg3MTJfaWZfdXAocGFkYXB0ZXIpKQogCQlnb3RvIF94bWl0X2VudHJ5X2Ryb3A7Ci0JfQorCiAJcHhtaXRmcmFtZSA9IHI4NzEyX2FsbG9jX3htaXRmcmFtZShweG1pdHByaXYpOwotCWlmICghcHhtaXRmcmFtZSkgeworCWlmICghcHhtaXRmcmFtZSkKIAkJZ290byBfeG1pdF9lbnRyeV9kcm9wOwotCX0KLQlpZiAoKCFyODcxMl91cGRhdGVfYXR0cmliKHBhZGFwdGVyLCBwa3QsICZweG1pdGZyYW1lLT5hdHRyaWIpKSkgeworCisJaWYgKCghcjg3MTJfdXBkYXRlX2F0dHJpYihwYWRhcHRlciwgcGt0LCAmcHhtaXRmcmFtZS0+YXR0cmliKSkpCiAJCWdvdG8gX3htaXRfZW50cnlfZHJvcDsKLQl9CisKIAlwYWRhcHRlci0+bGVkcHJpdi5MZWRDb250cm9sSGFuZGxlcihwYWRhcHRlciwgTEVEX0NUTF9UWCk7CiAJcHhtaXRmcmFtZS0+cGt0ID0gcGt0OwogCWlmIChyODcxMl9wcmVfeG1pdChwYWRhcHRlciwgcHhtaXRmcmFtZSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvS2NvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3YzFhYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L0tjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1jb25maWcgUjg3MjNBVQotCXRyaXN0YXRlICJSZWFsdGVrIFJUTDg3MjNBVSBXaXJlbGVzcyBMQU4gTklDIGRyaXZlciAoZGVwcmVjYXRlZCkiCi0JZGVwZW5kcyBvbiBVU0IgJiYgV0xBTiAmJiBSRktJTEwKLQlzZWxlY3QgV0lSRUxFU1NfRVhUCi0Jc2VsZWN0IFdFWFRfUFJJVgotCXNlbGVjdCBDRkc4MDIxMQotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQlUaGlzIG9wdGlvbiBhZGRzIHRoZSBSZWFsdGVrIFJUTDg3MjNBVSBVU0IgZGV2aWNlIHN1Y2ggYXMgZm91bmQgaW4KLQl0aGUgTGVub3ZvIFlvZ2EgMTMgdGFibGV0LiBJZiBidWlsdCBhcyBhIG1vZHVsZSwgaXQgd2lsbCBiZSBjYWxsZWQgcjg3MjNhdS4KLQotCU5vdGU6IFRoaXMgZHJpdmVyIGlzIGRlcHJlY2F0ZWQgYW5kIHNjaGVkdWxlZCB0byBiZSByZW1vdmVkIGluIGEKLQlmdXR1cmUga2VybmVsIHJlbGVhc2UuIFBsZWFzZSB1c2UgcnRsOHh4eHUgaW5zdGVhZC4KLQotaWYgUjg3MjNBVQotCi1jb25maWcgODcyM0FVX0FQX01PREUKLQlib29sICJSZWFsdGVrIFJUTDg3MjNBVSBBUCBtb2RlIgotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQlUaGlzIG9wdGlvbiBlbmFibGVzIEFjY2VzcyBQb2ludCBtb2RlLiBVbmxlc3MgeW91IGtub3cgdGhhdCB5b3VyIHN5c3RlbQotCXdpbGwgbmV2ZXIgYmUgdXNlZCBhcyBhbiBBUCwgb3IgdGhlIHRhcmdldCBzeXN0ZW0gaGFzIGxpbWl0ZWQgbWVtb3J5LAotCSJZIiBzaG91bGQgYmUgc2VsZWN0ZWQuCi0KLWNvbmZpZyA4NzIzQVVfQlRfQ09FWElTVAotCWJvb2wgIlJlYWx0ZWsgUlRMODcyM0FVIEJsdWVUb290aCBDb2V4aXN0ZW5jZSIKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JVGhpcyBvcHRpb24gZW5hYmxlcyBpY29leGlzdGVuY2Ugd2l0aCBCbHVlVG9vdGggY29tbXVuaWNhdGlvbnMgZm9yIHRoZSByODcyM2F1IGRyaXZlci4KLQlVbmxlc3MgeW91IGtub3cgdGhhdCB0aGlzIGRyaXZlciB3aWxsIG5ldmVyIGJ5IHVzZWQgd2l0aCBCVCwgb3IgdGhlIHRhcmdldCBzeXN0ZW0gaGFzCi0JbGltaXRlZCBtZW1vcnksICJZIiBzaG91bGQgYmUgc2VsZWN0ZWQuCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U4OTg5MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotcjg3MjNhdS15IDo9CQkJCVwKLQkJY29yZS9ydHdfY21kLm8JCVwKLQkJY29yZS9ydHdfZWZ1c2UubwlcCi0JCWNvcmUvcnR3X2llZWU4MDIxMS5vCVwKLQkJY29yZS9ydHdfbWxtZS5vCQlcCi0JCWNvcmUvcnR3X21sbWVfZXh0Lm8JXAotCQljb3JlL3J0d19wd3JjdHJsLm8JXAotCQljb3JlL3J0d19yZWN2Lm8JCVwKLQkJY29yZS9ydHdfc2VjdXJpdHkubwlcCi0JCWNvcmUvcnR3X3NyZXNldC5vCVwKLQkJY29yZS9ydHdfc3RhX21ndC5vCVwKLQkJY29yZS9ydHdfeG1pdC5vCQlcCi0JCWNvcmUvcnR3X3dsYW5fdXRpbC5vCVwKLQkJaGFsL2hhbF9jb20ubwkJXAotCQloYWwvaGFsX2ludGYubwkJXAotCQloYWwvSGFsODcyM1B3clNlcS5vCVwKLQkJaGFsL0hhbDg3MjNVSFdJbWdfQ0UubwlcCi0JCWhhbC9IYWxETU91dFNyYzg3MjNBX0NFLm8gXAotCQloYWwvSGFsSFdJbWc4NzIzQV9CQi5vCVwKLQkJaGFsL0hhbEhXSW1nODcyM0FfTUFDLm8JXAotCQloYWwvSGFsSFdJbWc4NzIzQV9SRi5vCVwKLQkJaGFsL0hhbFB3clNlcUNtZC5vCVwKLQkJaGFsL29kbV9SZWdDb25maWc4NzIzQS5vIFwKLQkJaGFsL29kbV9kZWJ1Zy5vCQlcCi0JCWhhbC9vZG1faW50ZXJmYWNlLm8JXAotCQloYWwvb2RtX0hXQ29uZmlnLm8JXAotCQloYWwvb2RtLm8JCVwKLQkJaGFsL3J0bDg3MjNhX2NtZC5vCVwKLQkJaGFsL3J0bDg3MjNhX2RtLm8JXAotCQloYWwvcnRsODcyM2FfaGFsX2luaXQubwlcCi0JCWhhbC9ydGw4NzIzYV9waHljZmcubwlcCi0JCWhhbC9ydGw4NzIzYV9yZjYwNTIubwlcCi0JCWhhbC9ydGw4NzIzYV9yeGRlc2MubwlcCi0JCWhhbC9ydGw4NzIzYV9zcmVzZXQubwlcCi0JCWhhbC9ydGw4NzIzYXVfcmVjdi5vCVwKLQkJaGFsL3J0bDg3MjNhdV94bWl0Lm8JXAotCQloYWwvdXNiX2hhbGluaXQubwlcCi0JCWhhbC91c2Jfb3BzX2xpbnV4Lm8JXAotCQlvc19kZXAvaW9jdGxfY2ZnODAyMTEubwlcCi0JCW9zX2RlcC9tbG1lX2xpbnV4Lm8JXAotCQlvc19kZXAvb3NfaW50ZnMubwlcCi0JCW9zX2RlcC9yZWN2X2xpbnV4Lm8JXAotCQlvc19kZXAvdXNiX2ludGYubwlcCi0JCW9zX2RlcC91c2Jfb3BzX2xpbnV4Lm8JXAotCQlvc19kZXAveG1pdF9saW51eC5vCi0KLXI4NzIzYXUtJChDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QpICs9IGhhbC9ydGw4NzIzYV9idC1jb2V4aXN0Lm8KLXI4NzIzYXUtJChDT05GSUdfODcyM0FVX0FQX01PREUpICs9IGNvcmUvcnR3X2FwLm8KLQotb2JqLSQoQ09ORklHX1I4NzIzQVUpCTo9IHI4NzIzYXUubwotCi1jY2ZsYWdzLXkgKz0gJChjYWxsIGNjLW9wdGlvbiwtV3R5cGUtbGltaXRzLCkKLWNjZmxhZ3MteSArPSAtRF9fQ0hFQ0tfRU5ESUFOX18gLUkkKHNyYykvaW5jbHVkZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9UT0RPCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmI4NmU0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvVE9ETworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLVRPRE86Ci0tIGZpbmQgYW5kIHJlbW92ZSBjb2RlIHZhbGlkIG9ubHkgZm9yIDUgSEd6LiBNYW55IG9mIHRoZSBvYnZpb3VzCi0gIG9uZXMgaGF2ZSBiZWVuIHJlbW92ZWQsIGJ1dCB0aGluZ3MgbGlrZSBjaGFubmVsID4gMTQgc3RpbGwgZXhpc3QuCi0tIGZpbmQgYW5kIHJlbW92ZSBhbnkgY29kZSBmb3Igb3RoZXIgY2hpcHMgdGhhdCBpcyBsZWZ0IG92ZXIKLS0gY29udmVydCBhbnkgcmVtYWluaW5nIHVudXN1YWwgdmFyaWFibGUgdHlwZXMKLS0gZmluZCBjb2RlcyB0aGF0IGNhbiB1c2UgJXBNIGFuZCAlTnBoIGZvcm1hdHRpbmcKLS0gY2hlY2twYXRjaC5wbCBmaXhlcyAtIG1vc3Qgb2YgdGhlIHJlbWFpbmluZyBvbmVzIGFyZSBsaW5lcyB0b28gbG9uZy4gTWFueQotICBvZiB0aGVtIHdpbGwgcmVxdWlyZSByZWZhY3RvcmluZwotLSBtZXJnZSBSZWFsdGVrJ3MgYnVnZml4ZXMgYW5kIG5ldyBmZWF0dXJlcyBpbnRvIHRoZSBkcml2ZXIKLS0gc3dpdGNoIHRvIHVzZSBNQUM4MDIxMQotCi1BIG1hYzgwMjExIGRyaXZlciBmb3IgdGhpcyBoYXJkd2FyZSBhbHJlYWR5IHdhcyBpbnRlZ3JhdGVkIGF0Ci1kcml2ZXJzL25ldC93aXJlbGVzcy9yZWFsdGVrL3J0bDh4eHh1LwotCi1QbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnPiwKLUplcyBTb3JlbnNlbiA8SmVzLlNvcmVuc2VuQHJlZGhhdC5jb20+LCBhbmQgTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0Pi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfYXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFkNjg2ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2FwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRXX0FQX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+Ci0jaW5jbHVkZSA8d2lmaS5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2NtZC5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLSNpbmNsdWRlIDxydHdfbWxtZV9leHQuaD4KLQotdm9pZCBpbml0X21sbWVfYXBfaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9hY2xfcG9vbCAqcGFjbF9saXN0ID0gJnBzdGFwcml2LT5hY2xfbGlzdDsKLQotCXNwaW5fbG9ja19pbml0KCZwbWxtZXByaXYtPmJjbl91cGRhdGVfbG9jayk7Ci0KLQkvKiBmb3IgQUNMICovCi0JX3J0d19pbml0X3F1ZXVlMjNhKCZwYWNsX2xpc3QtPmFjbF9ub2RlX3EpOwotCi0Jc3RhcnRfYXBfbW9kZTIzYShwYWRhcHRlcik7Ci19Ci0KLXZvaWQgZnJlZV9tbG1lX2FwX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JcG1sbWVwcml2LT51cGRhdGVfYmNuID0gZmFsc2U7Ci0JcG1sbWVleHQtPmJzdGFydF9ic3MgPSBmYWxzZTsKLQotCXJ0d19zdGFfZmx1c2gyM2EocGFkYXB0ZXIpOwotCi0JcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0KLQkvKiBmcmVlX2Fzc29jX3N0YV9yZXNvdXJjZXMgKi8KLQlydHdfZnJlZV9hbGxfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0KLQkvKiBmcmVlIGJjL21jIHN0YV9pbmZvICovCi0JcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQlydHdfZnJlZV9zdGFpbmZvMjNhKHBhZGFwdGVyLCBwc3RhKTsKLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfQkNOVElNKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29ya19tbG1lZXh0ID0gJnBtbG1laW5mby0+bmV0d29yazsKLQl1bnNpZ25lZCBjaGFyICpwaWUgPSBwbmV0d29ya19tbG1lZXh0LT5JRXM7Ci0JdTggKnAsICpkc3RfaWUsICpwcmVtYWluZGVyX2llID0gTlVMTCwgKnBiYWNrdXBfcmVtYWluZGVyX2llID0gTlVMTDsKLQl1aW50IG9mZnNldCwgdG1wX2xlbiwgdGltX2llbGVuLCB0aW1faWVfb2Zmc2V0LCByZW1haW5kZXJfaWVsZW47Ci0KLQlwID0gcnR3X2dldF9pZTIzYShwaWUsIFdMQU5fRUlEX1RJTSwgJnRpbV9pZWxlbiwKLQkJCSAgcG5ldHdvcmtfbWxtZWV4dC0+SUVMZW5ndGgpOwotCWlmIChwICE9IE5VTEwgJiYgdGltX2llbGVuID4gMCkgewotCQl0aW1faWVsZW4gKz0gMjsKLQotCQlwcmVtYWluZGVyX2llID0gcCt0aW1faWVsZW47Ci0KLQkJdGltX2llX29mZnNldCA9IChpbnQpKHAgLSBwaWUpOwotCi0JCXJlbWFpbmRlcl9pZWxlbiA9IHBuZXR3b3JrX21sbWVleHQtPklFTGVuZ3RoIC0gdGltX2llX29mZnNldCAtIHRpbV9pZWxlbjsKLQotCQkvKiBhcHBlbmQgVElNIElFIGZyb20gZHN0X2llIG9mZnNldCAqLwotCQlkc3RfaWUgPSBwOwotCX0gZWxzZSB7Ci0JCXRpbV9pZWxlbiA9IDA7Ci0KLQkJLyogY2FsY3VsYXRlIGhlYWRfbGVuICovCi0JCW9mZnNldCA9IDA7Ci0KLQkJLyogZ2V0IHNzaWRfaWUgbGVuICovCi0JCXAgPSBydHdfZ2V0X2llMjNhKHBpZSwgV0xBTl9FSURfU1NJRCwKLQkJCQkgICZ0bXBfbGVuLCBwbmV0d29ya19tbG1lZXh0LT5JRUxlbmd0aCk7Ci0JCWlmIChwICE9IE5VTEwpCi0JCQlvZmZzZXQgKz0gdG1wX2xlbisyOwotCi0JCS8qICBnZXQgc3VwcG9ydGVkIHJhdGVzIGxlbiAqLwotCQlwID0gcnR3X2dldF9pZTIzYShwaWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsCi0JCQkJICAmdG1wX2xlbiwgcG5ldHdvcmtfbWxtZWV4dC0+SUVMZW5ndGgpOwotCQlpZiAocCAhPSAgTlVMTCkKLQkJCW9mZnNldCArPSB0bXBfbGVuKzI7Ci0KLQkJLyogRFMgUGFyYW1ldGVyIFNldCBJRSwgbGVuID0gMyAqLwotCQlvZmZzZXQgKz0gMzsKLQotCQlwcmVtYWluZGVyX2llID0gcGllICsgb2Zmc2V0OwotCi0JCXJlbWFpbmRlcl9pZWxlbiA9IHBuZXR3b3JrX21sbWVleHQtPklFTGVuZ3RoIC0gb2Zmc2V0IC0gdGltX2llbGVuOwotCi0JCS8qIGFwcGVuZCBUSU0gSUUgZnJvbSBvZmZzZXQgKi8KLQkJZHN0X2llID0gcGllICsgb2Zmc2V0OwotCX0KLQotCWlmIChyZW1haW5kZXJfaWVsZW4gPiAwKSB7Ci0JCXBiYWNrdXBfcmVtYWluZGVyX2llID0ga21hbGxvYyhyZW1haW5kZXJfaWVsZW4sIEdGUF9BVE9NSUMpOwotCQlpZiAocGJhY2t1cF9yZW1haW5kZXJfaWUgJiYgcHJlbWFpbmRlcl9pZSkKLQkJCW1lbWNweShwYmFja3VwX3JlbWFpbmRlcl9pZSwgcHJlbWFpbmRlcl9pZSwgcmVtYWluZGVyX2llbGVuKTsKLQl9Ci0KLQkqZHN0X2llKysgPSBXTEFOX0VJRF9USU07Ci0KLQlpZiAoKHBzdGFwcml2LT50aW1fYml0bWFwJjB4ZmYwMCkgJiYgKHBzdGFwcml2LT50aW1fYml0bWFwJjB4MDBmYykpCi0JCXRpbV9pZWxlbiA9IDU7Ci0JZWxzZQotCQl0aW1faWVsZW4gPSA0OwotCi0JKmRzdF9pZSsrID0gdGltX2llbGVuOwotCi0JKmRzdF9pZSsrID0gMDsgLyogRFRJTSBjb3VudCAqLwotCSpkc3RfaWUrKyA9IDE7IC8qIERUSU0gcGVyaW9kICovCi0KLQlpZiAocHN0YXByaXYtPnRpbV9iaXRtYXAgJiBCSVQoMCkpIC8qIGZvciBiYy9tYyBmcmFtZXMgKi8KLQkJKmRzdF9pZSsrID0gQklUKDApOwkgICAvKiBiaXRtYXAgY3RybCAqLwotCWVsc2UKLQkJKmRzdF9pZSsrID0gMDsKLQotCWlmICh0aW1faWVsZW4gPT0gNCkgewotCQkqZHN0X2llKysgPSBwc3RhcHJpdi0+dGltX2JpdG1hcCAmIDB4ZmY7Ci0JfSBlbHNlIGlmICh0aW1faWVsZW4gPT0gNSkgewotCQlwdXRfdW5hbGlnbmVkX2xlMTYocHN0YXByaXYtPnRpbV9iaXRtYXAsIGRzdF9pZSk7Ci0JCWRzdF9pZSArPSAyOwotCX0KLQotCS8qIGNvcHkgcmVtYWluZGVyIElFICovCi0JaWYgKHBiYWNrdXBfcmVtYWluZGVyX2llKSB7Ci0JCW1lbWNweShkc3RfaWUsIHBiYWNrdXBfcmVtYWluZGVyX2llLCByZW1haW5kZXJfaWVsZW4pOwotCi0JCWtmcmVlKHBiYWNrdXBfcmVtYWluZGVyX2llKTsKLQl9Ci0KLQlvZmZzZXQgPSAgKHVpbnQpKGRzdF9pZSAtIHBpZSk7Ci0JcG5ldHdvcmtfbWxtZWV4dC0+SUVMZW5ndGggPSBvZmZzZXQgKyByZW1haW5kZXJfaWVsZW47Ci0KLQlzZXRfdHhfYmVhY29uX2NtZDIzYShwYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB1OCBjaGtfc3RhX2lzX2FsaXZlKHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQl1OCByZXQgPSBmYWxzZTsKLQotCWlmICgocHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfZGF0YV9wa3RzICsKLQkgICAgcHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfY3RybF9wa3RzKSAhPQotCSAgICAocHN0YS0+c3RhX3N0YXRzLnJ4X2RhdGFfcGt0cyArIHBzdGEtPnN0YV9zdGF0cy5yeF9jdHJsX3BrdHMpKQotCQlyZXQgPSB0cnVlOwotCi0Jc3RhX3VwZGF0ZV9sYXN0X3J4X3BrdHMocHN0YSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGV4cGlyZV90aW1lb3V0X2NoazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXU4IHVwZGF0ZWQgPSAwOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgKnB0bXA7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQl1OCBjaGtfYWxpdmVfbnVtID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKmNoa19hbGl2ZV9saXN0W05VTV9TVEFdOwotCWludCBpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXV0aF9saXN0X2xvY2spOwotCXBoZWFkID0gJnBzdGFwcml2LT5hdXRoX2xpc3Q7Ci0JLyogY2hlY2sgYXV0aF9xdWV1ZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwc3RhLCBwdG1wLCBwaGVhZCwgYXV0aF9saXN0KSB7Ci0JCWlmIChwc3RhLT5leHBpcmVfdG8gPiAwKSB7Ci0JCQlwc3RhLT5leHBpcmVfdG8tLTsKLQkJCWlmIChwc3RhLT5leHBpcmVfdG8gPT0gMCkgewotCQkJCWxpc3RfZGVsX2luaXQoJnBzdGEtPmF1dGhfbGlzdCk7Ci0JCQkJcHN0YXByaXYtPmF1dGhfbGlzdF9jbnQtLTsKLQotCQkJCURCR184NzIzQSgiYXV0aCBleHBpcmUgJXBNXG4iLCBwc3RhLT5od2FkZHIpOwotCi0JCQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hdXRoX2xpc3RfbG9jayk7Ci0KLQkJCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQkJCQlydHdfZnJlZV9zdGFpbmZvMjNhKHBhZGFwdGVyLCBwc3RhKTsKLQkJCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCi0JCQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXV0aF9saXN0X2xvY2spOwotCQkJfQotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXV0aF9saXN0X2xvY2spOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCXBoZWFkID0gJnBzdGFwcml2LT5hc29jX2xpc3Q7Ci0JLyogY2hlY2sgYXNvY19xdWV1ZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwc3RhLCBwdG1wLCBwaGVhZCwgYXNvY19saXN0KSB7Ci0JCWlmIChjaGtfc3RhX2lzX2FsaXZlKHBzdGEpIHx8ICFwc3RhLT5leHBpcmVfdG8pIHsKLQkJCXBzdGEtPmV4cGlyZV90byA9IHBzdGFwcml2LT5leHBpcmVfdG87Ci0JCQlwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlwc3RhLT5leHBpcmVfdG8tLTsKLQkJfQotCi0JCWlmIChwc3RhLT5leHBpcmVfdG8gPD0gMCkgewotCQkJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCQkJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjID09IDEpIHsKLQkJCQlwc3RhLT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+ZXhwaXJlX3RvOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAocHN0YS0+c3RhdGUgJiBXSUZJX1NMRUVQX1NUQVRFKSB7Ci0JCQkJaWYgKCEocHN0YS0+c3RhdGUgJiBXSUZJX1NUQV9BTElWRV9DSEtfU1RBVEUpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIGNoZWNrIGlmIGFsaXZlIGJ5IGFub3RoZXIgbWV0aG9kCi0JCQkJCSAqIGlmIHN0YXRpb24gaXMgYXQgcHMgbW9kZS4KLQkJCQkJICovCi0JCQkJCXBzdGEtPmV4cGlyZV90byA9IHBzdGFwcml2LT5leHBpcmVfdG87Ci0JCQkJCXBzdGEtPnN0YXRlIHw9IFdJRklfU1RBX0FMSVZFX0NIS19TVEFURTsKLQkJCQkJLyoKLQkJCQkJICogdXBkYXRlIGJjbiB3aXRoIHRpbV9iaXRtYXAKLQkJCQkJICogZm9yIHRoaXMgc3RhdGlvbgotCQkJCQkgKi8KLQkJCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgfD0gQ0hLQklUKHBzdGEtPmFpZCk7Ci0JCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX1RJTSwgTlVMTCwgZmFsc2UpOwotCi0JCQkJCWlmICghcG1sbWVleHQtPmFjdGl2ZV9rZWVwX2FsaXZlX2NoZWNrKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocG1sbWVleHQtPmFjdGl2ZV9rZWVwX2FsaXZlX2NoZWNrKSB7Ci0JCQkJY2hrX2FsaXZlX2xpc3RbY2hrX2FsaXZlX251bSsrXSA9IHBzdGE7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWxpc3RfZGVsX2luaXQoJnBzdGEtPmFzb2NfbGlzdCk7Ci0JCQlwc3RhcHJpdi0+YXNvY19saXN0X2NudC0tOwotCi0JCQlEQkdfODcyM0EoImFzb2MgZXhwaXJlICVwTSwgc3RhdGUgPSAweCV4XG4iLAotCQkJCSAgcHN0YS0+aHdhZGRyLCBwc3RhLT5zdGF0ZSk7Ci0JCQl1cGRhdGVkID0gYXBfZnJlZV9zdGEyM2EocGFkYXB0ZXIsIHBzdGEsIGZhbHNlLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogVE9ETzogQWdpbmcgbWVjaGFuaXNtIHRvIGRpZ2VzdCBmcmFtZXMgaW4KLQkJCSAqIHNsZWVwX3EgdG8gYXZvaWQgcnVubmluZyBvdXQgb2YgeG1pdGZyYW1lCi0JCQkgKi8KLQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID4gKE5SX1hNSVRGUkFNRS9wc3RhcHJpdi0+YXNvY19saXN0X2NudCkKLQkJCQkmJiBwYWRhcHRlci0+eG1pdHByaXYuZnJlZV94bWl0ZnJhbWVfY250IDwgKChOUl9YTUlURlJBTUUvcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQpLzIpCi0JCQkpIHsKLQkJCQlEQkdfODcyM0EoIiVzIHN0YTolcE0sIHNsZWVwcV9sZW46JXUsIGZyZWVfeG1pdGZyYW1lX2NudDoldSwgYXNvY19saXN0X2NudDoldSwgY2xlYXIgc2xlZXBfcVxuIiwKLQkJCQkJICBfX2Z1bmNfXywKLQkJCQkJICBwc3RhLT5od2FkZHIsCi0JCQkJCSAgcHN0YS0+c2xlZXBxX2xlbiwKLQkJCQkJICBwYWRhcHRlci0+eG1pdHByaXYuZnJlZV94bWl0ZnJhbWVfY250LAotCQkJCQkgIHBzdGFwcml2LT5hc29jX2xpc3RfY250KTsKLQkJCQl3YWtldXBfc3RhX3RvX3htaXQyM2EocGFkYXB0ZXIsIHBzdGEpOwotCQkJfQotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCi0JaWYgKGNoa19hbGl2ZV9udW0pIHsKLQotCQl1OCBiYWNrdXBfb3Blcl9jaGFubmVsID0gMDsKLQkJc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQkJLyoKLQkJICogc3dpdGNoIHRvIGNvcnJlY3QgY2hhbm5lbCBvZiBjdXJyZW50Ci0JCSAqIG5ldHdvcmsgYmVmb3JlIGlzc3VlIGtlZXAtYWxpdmUgZnJhbWVzCi0JCSAqLwotCQlpZiAocnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSAhPSBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwpIHsKLQkJCWJhY2t1cF9vcGVyX2NoYW5uZWwgPSBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpOwotCQkJU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsKTsKLQkJfQotCi0JLyogaXNzdWUgbnVsbCBkYXRhIHRvIGNoZWNrIHN0YSBhbGl2ZSAqLwotCWZvciAoaSA9IDA7IGkgPCBjaGtfYWxpdmVfbnVtOyBpKyspIHsKLQotCQlpbnQgcmV0ID0gX0ZBSUw7Ci0KLQkJcHN0YSA9IGNoa19hbGl2ZV9saXN0W2ldOwotCQlpZiAoIShwc3RhLT5zdGF0ZSAmIF9GV19MSU5LRUQpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHBzdGEtPnN0YXRlICYgV0lGSV9TTEVFUF9TVEFURSkKLQkJCXJldCA9IGlzc3VlX251bGxkYXRhMjNhKHBhZGFwdGVyLCBwc3RhLT5od2FkZHIsIDAsIDEsIDUwKTsKLQkJZWxzZQotCQkJcmV0ID0gaXNzdWVfbnVsbGRhdGEyM2EocGFkYXB0ZXIsIHBzdGEtPmh3YWRkciwgMCwgMywgNTApOwotCi0JCXBzdGEtPmtlZXBfYWxpdmVfdHJ5Y250Kys7Ci0JCWlmIChyZXQgPT0gX1NVQ0NFU1MpIHsKLQkJCURCR184NzIzQSgiYXNvYyBjaGVjaywgc3RhKCVwTSkgaXMgYWxpdmVcbiIsCi0JCQkJICBwc3RhLT5od2FkZHIpOwotCQkJcHN0YS0+ZXhwaXJlX3RvID0gcHN0YXByaXYtPmV4cGlyZV90bzsKLQkJCXBzdGEtPmtlZXBfYWxpdmVfdHJ5Y250ID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKHBzdGEtPmtlZXBfYWxpdmVfdHJ5Y250IDw9IDMpIHsKLQkJCURCR184NzIzQSgiYWNrIGNoZWNrIGZvciBhc29jIGV4cGlyZSwga2VlcF9hbGl2ZV90cnljbnQgPSVkXG4iLCBwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCk7Ci0JCQlwc3RhLT5leHBpcmVfdG8gPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlwc3RhLT5rZWVwX2FsaXZlX3RyeWNudCA9IDA7Ci0KLQkJREJHXzg3MjNBKCJhc29jIGV4cGlyZSAlcE0sIHN0YXRlID0gMHgleFxuIiwKLQkJCSAgcHN0YS0+aHdhZGRyLCBwc3RhLT5zdGF0ZSk7Ci0JCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZwc3RhLT5hc29jX2xpc3QpKSB7Ci0JCQlsaXN0X2RlbF9pbml0KCZwc3RhLT5hc29jX2xpc3QpOwotCQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKLQkJCXVwZGF0ZWQgPSBhcF9mcmVlX3N0YTIzYShwYWRhcHRlciwgcHN0YSwgZmFsc2UsIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQotCX0KLQotCWlmIChiYWNrdXBfb3Blcl9jaGFubmVsID4gMCkgLyogYmFjayB0byBvcmlnaW5hbCBvcGVyYXRpb24gY2hhbm5lbCAqLwotCQlTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLCBiYWNrdXBfb3Blcl9jaGFubmVsKTsKLX0KLQotCWFzc29jaWF0ZWRfY2xpZW50c191cGRhdGUyM2EocGFkYXB0ZXIsIHVwZGF0ZWQpOwotfQotCi12b2lkIGFkZF9SQVRpZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsIHU4IHJzc2lfbGV2ZWwpCi17Ci0JaW50IGk7Ci0JdTggcmZfdHlwZTsKLQl1MzIgaW5pdF9yYXRlID0gMDsKLQl1bnNpZ25lZCBjaGFyIHN0YV9iYW5kID0gMCwgcmFpZCwgc2hvcnRHSXJhdGUgPSBmYWxzZTsKLQl1bnNpZ25lZCBjaGFyIGxpbWl0OwotCXVuc2lnbmVkIGludCB0eF9yYV9iaXRtYXAgPSAwOwotCXN0cnVjdCBodF9wcml2ICpwc3RhX2h0ID0gTlVMTDsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwotCi0JaWYgKHBzdGEpCi0JCXBzdGFfaHQgPSAmcHN0YS0+aHRwcml2OwotCWVsc2UKLQkJcmV0dXJuOwotCi0JaWYgKCEocHN0YS0+c3RhdGUgJiBfRldfTElOS0VEKSkKLQkJcmV0dXJuOwotCi0JLyogYi9nIG1vZGUgcmFfYml0bWFwICovCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZihwc3RhLT5ic3NyYXRlc2V0KTsgaSsrKSB7Ci0JCWlmIChwc3RhLT5ic3NyYXRlc2V0W2ldKQotCQkJdHhfcmFfYml0bWFwIHw9IHJ0d19nZXRfYml0X3ZhbHVlX2Zyb21faWVlZV92YWx1ZTIzYShwc3RhLT5ic3NyYXRlc2V0W2ldJjB4N2YpOwotCX0KLQkvKiBuIG1vZGUgcmFfYml0bWFwICovCi0JaWYgKHBzdGFfaHQtPmh0X29wdGlvbikgewotCQlyZl90eXBlID0gcnRsODcyM2FfZ2V0X3JmX3R5cGUocGFkYXB0ZXIpOwotCi0JCWlmIChyZl90eXBlID09IFJGXzJUMlIpCi0JCQlsaW1pdCA9IDE2OyAvKiAyUiAqLwotCQllbHNlCi0JCQlsaW1pdCA9IDg7ICAvKiAxUiAqLwotCi0JCWZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7Ci0JCQlpZiAocHN0YV9odC0+aHRfY2FwLm1jcy5yeF9tYXNrW2kgLyA4XSAmIEJJVChpICUgOCkpCi0JCQkJdHhfcmFfYml0bWFwIHw9IEJJVChpICsgMTIpOwotCQl9Ci0KLQkJLyogbWF4IHNob3J0IEdJIHJhdGUgKi8KLQkJc2hvcnRHSXJhdGUgPSBwc3RhX2h0LT5zZ2k7Ci0JfQotCi0JaWYgKHBjdXJfbmV0d29yay0+RFNDb25maWcgPiAxNCkgewotCQkvKiAgNUcgYmFuZCAqLwotCQlpZiAodHhfcmFfYml0bWFwICYgMHhmZmZmMDAwKQotCQkJc3RhX2JhbmQgfD0gV0lSRUxFU1NfMTFfNU4gfCBXSVJFTEVTU18xMUE7Ci0JCWVsc2UKLQkJCXN0YV9iYW5kIHw9IFdJUkVMRVNTXzExQTsKLQl9IGVsc2UgewotCQlpZiAodHhfcmFfYml0bWFwICYgMHhmZmZmMDAwKQotCQkJc3RhX2JhbmQgfD0gV0lSRUxFU1NfMTFfMjROIHwgV0lSRUxFU1NfMTFHIHwgV0lSRUxFU1NfMTFCOwotCQllbHNlIGlmICh0eF9yYV9iaXRtYXAgJiAweGZmMCkKLQkJCXN0YV9iYW5kIHw9IFdJUkVMRVNTXzExRyB8IFdJUkVMRVNTXzExQjsKLQkJZWxzZQotCQkJc3RhX2JhbmQgfD0gV0lSRUxFU1NfMTFCOwotCX0KLQotCXBzdGEtPndpcmVsZXNzX21vZGUgPSBzdGFfYmFuZDsKLQotCXJhaWQgPSBuZXR3b3JrdHlwZV90b19yYWlkMjNhKHN0YV9iYW5kKTsKLQlpbml0X3JhdGUgPSBnZXRfaGlnaGVzdF9yYXRlX2lkeDIzYSh0eF9yYV9iaXRtYXAmMHgwZmZmZmZmZikmMHgzZjsKLQotCWlmIChwc3RhLT5haWQgPCBOVU1fU1RBKSB7Ci0JCXU4IGFyZzsKLQotCQlhcmcgPSBwc3RhLT5tYWNfaWQmMHgxZjsKLQotCQlhcmcgfD0gQklUKDcpOyAvKiBzdXBwb3J0IGVudHJ5IDJ+MzEgKi8KLQotCQlpZiAoc2hvcnRHSXJhdGUgPT0gdHJ1ZSkKLQkJCWFyZyB8PSBCSVQoNSk7Ci0KLQkJdHhfcmFfYml0bWFwIHw9ICgocmFpZDw8MjgpJjB4ZjAwMDAwMDApOwotCi0JCURCR184NzIzQSgiJXMgPT4gbWFjX2lkOiVkICwgcmFpZDolZCAsIGJpdG1hcCA9IDB4JXgsIGFyZyA9ICIKLQkJCSAgIjB4JXhcbiIsCi0JCQkgIF9fZnVuY19fLCBwc3RhLT5tYWNfaWQsIHJhaWQsIHR4X3JhX2JpdG1hcCwgYXJnKTsKLQotCQkvKiBiaXRtYXBbMDoyN10gPSB0eF9yYXRlX2JpdG1hcCAqLwotCQkvKiBiaXRtYXBbMjg6MzFdPSBSYXRlIEFkYXB0aXZlIGlkICovCi0JCS8qIGFyZ1swOjRdID0gbWFjaWQgKi8KLQkJLyogYXJnWzVdID0gU2hvcnQgR0kgKi8KLQkJcnRsODcyM2FfYWRkX3JhdGVhdGlkKHBhZGFwdGVyLCB0eF9yYV9iaXRtYXAsIGFyZywgcnNzaV9sZXZlbCk7Ci0KLQkJaWYgKHNob3J0R0lyYXRlID09IHRydWUpCi0JCQlpbml0X3JhdGUgfD0gQklUKDYpOwotCi0JCS8qIHNldCByYV9pZCwgaW5pdF9yYXRlICovCi0JCXBzdGEtPnJhaWQgPSByYWlkOwotCQlwc3RhLT5pbml0X3JhdGUgPSBpbml0X3JhdGU7Ci0KLQl9IGVsc2UKLQkJREJHXzg3MjNBKCJzdGF0aW9uIGFpZCAlZCBleGNlZWQgdGhlIG1heCBudW1iZXJcbiIsIHBzdGEtPmFpZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9ibWNfc3RhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIGluaXRfcmF0ZSA9IDA7Ci0JdW5zaWduZWQgY2hhciBuZXR3b3JrX3R5cGUsIHJhaWQ7Ci0JaW50IGksIHN1cHBvcnRSYXRlTnVtID0gMDsKLQl1bnNpZ25lZCBpbnQgdHhfcmFfYml0bWFwID0gMDsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQotCWlmIChwc3RhKSB7Ci0JCXBzdGEtPmFpZCA9IDA7IC8qIGRlZmF1bHQgc2V0IHRvIDAgKi8KLQkJcHN0YS0+bWFjX2lkID0gcHN0YS0+YWlkICsgMTsKLQotCQlwc3RhLT5xb3Nfb3B0aW9uID0gMDsKLQkJcHN0YS0+aHRwcml2Lmh0X29wdGlvbiA9IGZhbHNlOwotCi0JCXBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gMDsKLQotCQltZW1zZXQoKHZvaWQgKikmcHN0YS0+c3RhX3N0YXRzLCAwLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzdGFpbmZvX3N0YXRzKSk7Ci0KLQkJLyogcHJlcGFyZSBmb3IgYWRkX1JBVGlkMjNhICovCi0JCXN1cHBvcnRSYXRlTnVtID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYSgodTggKikmcGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyk7Ci0JCW5ldHdvcmtfdHlwZSA9IHJ0d19jaGVja19uZXR3b3JrX3R5cGUyM2EoKHU4ICopJnBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsIHN1cHBvcnRSYXRlTnVtLCAxKTsKLQotCQltZW1jcHkocHN0YS0+YnNzcmF0ZXNldCwgJnBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsIHN1cHBvcnRSYXRlTnVtKTsKLQkJcHN0YS0+YnNzcmF0ZWxlbiA9IHN1cHBvcnRSYXRlTnVtOwotCi0JCS8qIGIvZyBtb2RlIHJhX2JpdG1hcCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgc3VwcG9ydFJhdGVOdW07IGkrKykgewotCQkJaWYgKHBzdGEtPmJzc3JhdGVzZXRbaV0pCi0JCQkJdHhfcmFfYml0bWFwIHw9IHJ0d19nZXRfYml0X3ZhbHVlX2Zyb21faWVlZV92YWx1ZTIzYShwc3RhLT5ic3NyYXRlc2V0W2ldJjB4N2YpOwotCQl9Ci0KLQkJaWYgKHBjdXJfbmV0d29yay0+RFNDb25maWcgPiAxNCkgewotCQkJLyogZm9yY2UgdG8gQSBtb2RlLiA1RyBkb2Vzbid0IHN1cHBvcnQgQ0NLIHJhdGVzICovCi0JCQluZXR3b3JrX3R5cGUgPSBXSVJFTEVTU18xMUE7Ci0JCQl0eF9yYV9iaXRtYXAgPSAweDE1MDsgLyogNiwgMTIsIDI0IE1icHMgKi8KLQkJfSBlbHNlIHsKLQkJCS8qIGZvcmNlIHRvIGIgbW9kZSAqLwotCQkJbmV0d29ya190eXBlID0gV0lSRUxFU1NfMTFCOwotCQkJdHhfcmFfYml0bWFwID0gMHhmOwotCQl9Ci0KLQkJcmFpZCA9IG5ldHdvcmt0eXBlX3RvX3JhaWQyM2EobmV0d29ya190eXBlKTsKLQkJaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EodHhfcmFfYml0bWFwJjB4MGZmZmZmZmYpJjB4M2Y7Ci0KLQkJLyogYXAgbW9kZSAqLwotCQlydGw4NzIzYV9TZXRIYWxPRE1WYXIocGFkYXB0ZXIsIEhBTF9PRE1fU1RBX0lORk8sIHBzdGEsIHRydWUpOwotCi0JCXsKLQkJCXU4IGFyZzsKLQotCQkJYXJnID0gcHN0YS0+bWFjX2lkJjB4MWY7Ci0KLQkJCWFyZyB8PSBCSVQoNyk7Ci0KLQkJCXR4X3JhX2JpdG1hcCB8PSAoKHJhaWQ8PDI4KSYweGYwMDAwMDAwKTsKLQotCQkJREJHXzg3MjNBKCJ1cGRhdGVfYm1jX3N0YSwgbWFzayA9IDB4JXgsIGFyZyA9IDB4JXhcbiIsIHR4X3JhX2JpdG1hcCwgYXJnKTsKLQotCQkJLyogYml0bWFwWzA6MjddID0gdHhfcmF0ZV9iaXRtYXAgKi8KLQkJCS8qIGJpdG1hcFsyODozMV09IFJhdGUgQWRhcHRpdmUgaWQgKi8KLQkJCS8qIGFyZ1swOjRdID0gbWFjaWQgKi8KLQkJCS8qIGFyZ1s1XSA9IFNob3J0IEdJICovCi0JCQlydGw4NzIzYV9hZGRfcmF0ZWF0aWQocGFkYXB0ZXIsIHR4X3JhX2JpdG1hcCwgYXJnLCAwKTsKLQkJfQotCi0JCS8qIHNldCByYV9pZCwgaW5pdF9yYXRlICovCi0JCXBzdGEtPnJhaWQgPSByYWlkOwotCQlwc3RhLT5pbml0X3JhdGUgPSBpbml0X3JhdGU7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZwc3RhLT5sb2NrKTsKLQkJcHN0YS0+c3RhdGUgPSBfRldfTElOS0VEOwotCQlzcGluX3VubG9ja19iaCgmcHN0YS0+bG9jayk7Ci0KLQl9IGVsc2UKLQkJREJHXzg3MjNBKCJhZGRfUkFUaWQyM2FfYm1jX3N0YSBlcnJvciFcbiIpOwotfQotCi0vKgotICogQUlEOiAxfk1BWCBmb3Igc3RhIGFuZCAwIGZvciBiYy9tYyBpbiBhcC9hZGhvYyBtb2RlCi0gKiBNQUNfSUQgPSBBSUQrMSBmb3Igc3RhIGluIGFwL2FkaG9jIG1vZGUKLSAqIE1BQ19JRCA9IDEgZm9yIGJjL21jIGZvciBzdGEvYXAvYWRob2MKLSAqIE1BQ19JRCA9IDAgZm9yIGJzc2lkIGZvciBzdGEvYXAvYWRob2MKLSAqIENBTV9JRCA9IDB+MyBmb3IgZGVmYXVsdCBrZXksIGNtZF9pZCA9IG1hY2lkICsgMywgbWFjaWQgPSBhaWQgKyAxOwotICovCi12b2lkIHVwZGF0ZV9zdGFfaW5mbzIzYV9hcG1vZGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2X2FwID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2X3N0YSA9ICZwc3RhLT5odHByaXY7Ci0JLyogc2V0IGludGZfdGFnIHRvIGlmMSAqLwotCi0JcHN0YS0+bWFjX2lkID0gcHN0YS0+YWlkKzE7Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JLyogYXAgbW9kZSAqLwotCXJ0bDg3MjNhX1NldEhhbE9ETVZhcihwYWRhcHRlciwgSEFMX09ETV9TVEFfSU5GTywgcHN0YSwgdHJ1ZSk7Ci0KLQlpZiAocHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9PSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYKQotCQlwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IHRydWU7Ci0JZWxzZQotCQlwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IGZhbHNlOwotCi0JLyogdXBkYXRlIHN0YSdzIGNhcCAqLwotCi0JLyogRVJQICovCi0JVkNTX3VwZGF0ZTIzYShwYWRhcHRlciwgcHN0YSk7Ci0JLyogSFQgcmVsYXRlZCBjYXAgKi8KLQlpZiAocGh0cHJpdl9zdGEtPmh0X29wdGlvbikgewotCQkvKiBjaGVjayBpZiBzdGEgc3VwcG9ydHMgcnggYW1wZHUgKi8KLQkJcGh0cHJpdl9zdGEtPmFtcGR1X2VuYWJsZSA9IHBodHByaXZfYXAtPmFtcGR1X2VuYWJsZTsKLQotCQkvKiBjaGVjayBpZiBzdGEgc3VwcG9ydCBzIFNob3J0IEdJICovCi0JCWlmICgocGh0cHJpdl9zdGEtPmh0X2NhcC5jYXBfaW5mbyAmIHBodHByaXZfYXAtPmh0X2NhcC5jYXBfaW5mbykgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMHxJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpCi0JCQlwaHRwcml2X3N0YS0+c2dpID0gdHJ1ZTsKLQotCQkvKiBid21vZGUgKi8KLQkJaWYgKChwaHRwcml2X3N0YS0+aHRfY2FwLmNhcF9pbmZvICYgcGh0cHJpdl9hcC0+aHRfY2FwLmNhcF9pbmZvKSAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwKSkgewotCQkJLyogcGh0cHJpdl9zdGEtPmJ3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfNDA7ICovCi0JCQlwaHRwcml2X3N0YS0+Yndtb2RlID0gcG1sbWVleHQtPmN1cl9id21vZGU7Ci0JCQlwaHRwcml2X3N0YS0+Y2hfb2Zmc2V0ID0gcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQ7Ci0KLQkJfQotCi0JCXBzdGEtPnFvc19vcHRpb24gPSB0cnVlOwotCi0JfSBlbHNlIHsKLQkJcGh0cHJpdl9zdGEtPmFtcGR1X2VuYWJsZSA9IGZhbHNlOwotCi0JCXBodHByaXZfc3RhLT5zZ2kgPSBmYWxzZTsKLQkJcGh0cHJpdl9zdGEtPmJ3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JCXBodHByaXZfc3RhLT5jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCX0KLQotCS8qIFJ4IEFNUERVICovCi0Jc2VuZF9kZWxiYTIzYShwYWRhcHRlciwgMCwgcHN0YS0+aHdhZGRyKTsgLyogcmVjaXBpZW50ICovCi0KLQkvKiBUWCBBTVBEVSAqLwotCXNlbmRfZGVsYmEyM2EocGFkYXB0ZXIsIDEsIHBzdGEtPmh3YWRkcik7IC8qIG9yaWdpbmF0b3IgKi8KLQlwaHRwcml2X3N0YS0+YWdnX2VuYWJsZV9iaXRtYXAgPSAweDA7LyogcmVzZXQgKi8KLQlwaHRwcml2X3N0YS0+Y2FuZGlkYXRlX3RpZF9iaXRtYXAgPSAweDA7LyogcmVzZXQgKi8KLQotCS8qIHRvZG86IGluaXQgb3RoZXIgdmFyaWFibGVzICovCi0KLQltZW1zZXQoKHZvaWQgKikmcHN0YS0+c3RhX3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHN0YWluZm9fc3RhdHMpKTsKLQotCXNwaW5fbG9ja19iaCgmcHN0YS0+bG9jayk7Ci0JcHN0YS0+c3RhdGUgfD0gX0ZXX0xJTktFRDsKLQlzcGluX3VubG9ja19iaCgmcHN0YS0+bG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9od19odF9wYXJhbShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXVuc2lnbmVkIGNoYXIgbWF4X0FNUERVX2xlbjsKLQl1bnNpZ25lZCBjaGFyIG1pbl9NUERVX3NwYWNpbmc7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQkvKgotCSAqIGhhbmRsZSBBLU1QRFUgcGFyYW1ldGVyIGZpZWxkCi0JICogQU1QRFVfcGFyYSBbMTowXTpNYXggQU1QRFUgTGVuID0+IDA6OGssIDE6MTZrLCAyOjMyaywgMzo2NGsKLQkgKiBBTVBEVV9wYXJhIFs0OjJdOk1pbiBNUERVIFN0YXJ0IFNwYWNpbmcKLQkqLwotCW1heF9BTVBEVV9sZW4gPSBwbWxtZWluZm8tPmh0X2NhcC5hbXBkdV9wYXJhbXNfaW5mbyAmCi0JCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUjsKLQotCW1pbl9NUERVX3NwYWNpbmcgPSAocG1sbWVpbmZvLT5odF9jYXAuYW1wZHVfcGFyYW1zX2luZm8gJgotCQkJICAgIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkpID4+IDI7Ci0KLQlydGw4NzIzYV9zZXRfYW1wZHVfbWluX3NwYWNlKHBhZGFwdGVyLCBtaW5fTVBEVV9zcGFjaW5nKTsKLQlydGw4NzIzYV9zZXRfYW1wZHVfZmFjdG9yKHBhZGFwdGVyLCBtYXhfQU1QRFVfbGVuKTsKLQotCS8qIENvbmZpZyBTTSBQb3dlciBTYXZlIHNldHRpbmcgKi8KLQlwbWxtZWluZm8tPlNNX1BTID0gKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+aHRfY2FwLmNhcF9pbmZvKSAmCi0JCQkgICAgSUVFRTgwMjExX0hUX0NBUF9TTV9QUykgPj4gMjsKLQlpZiAocG1sbWVpbmZvLT5TTV9QUyA9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpCi0JCURCR184NzIzQSgiJXMoKTogV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2Jzc19uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmKQotewotCWNvbnN0IHU4ICpwOwotCXU4IHZhbDgsIGN1cl9jaGFubmVsLCBjdXJfYndtb2RlLCBjdXJfY2hfb2Zmc2V0OwotCXUxNiBiY25faW50ZXJ2YWw7Ci0JdTMyIGFjcGFybTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29ya19tbG1lZXh0ID0gJnBtbG1laW5mby0+bmV0d29yazsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqcGh0X2luZm8gPSBOVUxMOwotCi0JYmNuX2ludGVydmFsID0gKHUxNilwbmV0d29yay0+YmVhY29uX2ludGVydmFsOwotCWN1cl9jaGFubmVsID0gcG5ldHdvcmstPkRTQ29uZmlnOwotCWN1cl9id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwotCWN1cl9jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCi0JLyoKLQkgKiBjaGVjayBpZiB0aGVyZSBpcyB3cHMgaWUKLQkgKiBpZiB0aGVyZSBpcyB3cHNpZSBpbiBiZWFjb24gdGhlIGhvc3RhcGQgd2lsbAotCSAqIHVwZGF0ZSBiZWFjb24gdHdpY2Ugd2hlbiBzdGF0aW5nIGhvc3RhcGQKLQkgKiBhbmQgYXQgZmlyc3QgdGltZSB0aGUgc2VjdXJpdHkKLQkgKiBpZSAoUlNOL1dQQSBJRSkgd2lsbCBub3QgaW5jbHVkZSBpbiBiZWFjb24KLQkgKi8KLQlpZiAoIWNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkgICAgIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQUywKLQkJCQkgICAgIHBuZXR3b3JrLT5JRXMsCi0JCQkJICAgICBwbmV0d29yay0+SUVMZW5ndGgpKQotCQlwbWxtZWV4dC0+YnN0YXJ0X2JzcyA9IHRydWU7Ci0KLQkvKiB0b2RvOiB1cGRhdGUgd21tLCBodCBjYXAgKi8KLQkvKiBwbWxtZWluZm8tPldNTV9lbmFibGU7ICovCi0JLyogcG1sbWVpbmZvLT5IVF9lbmFibGU7ICovCi0JaWYgKHBtbG1lcHJpdi0+cW9zX29wdGlvbikKLQkJcG1sbWVpbmZvLT5XTU1fZW5hYmxlID0gdHJ1ZTsKLQlpZiAocG1sbWVwcml2LT5odHByaXYuaHRfb3B0aW9uKSB7Ci0JCXBtbG1laW5mby0+V01NX2VuYWJsZSA9IHRydWU7Ci0JCXBtbG1laW5mby0+SFRfZW5hYmxlID0gdHJ1ZTsKLQotCQl1cGRhdGVfaHdfaHRfcGFyYW0ocGFkYXB0ZXIpOwotCX0KLQotCWlmIChwbWxtZXByaXYtPmN1cl9uZXR3b3JrLmpvaW5fcmVzICE9IHRydWUpIHsKLQkJLyoKLQkJICogc2V0dGluZyBvbmx5IGF0IGZpcnN0IHRpbWUKLQkJICogV0VQIEtleSB3aWxsIGJlIHNldCBiZWZvcmUgdGhpcwotCQkgKiBmdW5jdGlvbiwgZG8gbm90IGNsZWFyIENBTS4KLQkJICovCi0JCWlmIChwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtICE9Ci0JCSAgICBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCAmJgotCQkgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSAhPQotCQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQotCQkJZmx1c2hfYWxsX2NhbV9lbnRyeTIzYShwYWRhcHRlcik7CS8qIGNsZWFyIENBTSAqLwotCX0KLQotCS8qIHNldCBNU1IgdG8gQVBfTW9kZSAqLwotCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMocGFkYXB0ZXIsIE1TUl9BUCk7Ci0KLQkvKiBTZXQgQlNTSUQgUkVHICovCi0JaHdfdmFyX3NldF9ic3NpZChwYWRhcHRlciwgcG5ldHdvcmstPk1hY0FkZHJlc3MpOwotCi0JLyogU2V0IEVEQ0EgcGFyYW0gcmVnICovCi0JYWNwYXJtID0gMHgwMDJGMzIxNzsgLyogVk8gKi8KLQlydGw4NzIzYV9zZXRfYWNfcGFyYW1fdm8ocGFkYXB0ZXIsIGFjcGFybSk7Ci0JYWNwYXJtID0gMHgwMDVFNDMxNzsgLyogVkkgKi8KLQlydGw4NzIzYV9zZXRfYWNfcGFyYW1fdmkocGFkYXB0ZXIsIGFjcGFybSk7Ci0JYWNwYXJtID0gMHgwMDVlYTQyYjsKLQlydGw4NzIzYV9zZXRfYWNfcGFyYW1fYmUocGFkYXB0ZXIsIGFjcGFybSk7Ci0JYWNwYXJtID0gMHgwMDAwQTQ0NDsgLyogQksgKi8KLQlydGw4NzIzYV9zZXRfYWNfcGFyYW1fYmsocGFkYXB0ZXIsIGFjcGFybSk7Ci0KLQkvKiBTZXQgU2VjdXJpdHkgKi8KLQl2YWw4ID0gKHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPT0gZG90MTFBdXRoQWxncnRobV84MDIxWCkgPwotCQkweGNjIDogMHhjZjsKLQlydGw4NzIzYV9zZXRfc2VjX2NmZyhwYWRhcHRlciwgdmFsOCk7Ci0KLQkvKiBCZWFjb24gQ29udHJvbCByZWxhdGVkIHJlZ2lzdGVyICovCi0JcnRsODcyM2Ffc2V0X2JlYWNvbl9pbnRlcnZhbChwYWRhcHRlciwgYmNuX2ludGVydmFsKTsKLQotCVVwZGF0ZUJyYXRlVGJsMjNhKHBhZGFwdGVyLCBwbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCUhhbFNldEJyYXRlQ2ZnMjNhKHBhZGFwdGVyLCBwbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCi0JaWYgKCFwbWxtZXByaXYtPmN1cl9uZXR3b3JrLmpvaW5fcmVzKSB7Ci0JCS8qIHNldHRpbmcgb25seSBhdCAgZmlyc3QgdGltZSAqLwotCi0JCS8qIGRpc2FibGUgZHluYW1pYyBmdW5jdGlvbnMsIHN1Y2ggYXMgaGlnaCBwb3dlciwgRElHICovCi0KLQkJLyogdHVybiBvbiBhbGwgZHluYW1pYyBmdW5jdGlvbnMgKi8KLQkJcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9zZXQocGFkYXB0ZXIsCi0JCQkJCQkgRFlOQU1JQ19BTExfRlVOQ19FTkFCTEUpOwotCX0KLQkvKiBzZXQgY2hhbm5lbCwgYndtb2RlICovCi0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sIHBuZXR3b3JrLT5JRXMsCi0JCQkgICAgIHBuZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgcFsxXSkgewotCQlwaHRfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqKShwICsgMik7Ci0KLQkJaWYgKHByZWdwcml2LT5jYnc0MF9lbmFibGUgJiYgcGh0X2luZm8tPmh0X3BhcmFtICYKLQkJICAgIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFOX1dJRFRIX0FOWSkgewotCQkJLyogc3dpdGNoIHRvIHRoZSA0ME0gSHogbW9kZSAqLwotCQkJY3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfNDA7Ci0JCQlzd2l0Y2ggKHBodF9pbmZvLT5odF9wYXJhbSAmCi0JCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfT0ZGU0VUKSB7Ci0JCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOgotCQkJCS8qCi0JCQkJICogcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPQotCQkJCSAqIEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUjsKLQkJCQkgKi8KLQkJCQljdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzoKLQkJCQljdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQljdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQkvKgotCSAqIFRPRE86IG5lZWQgdG8ganVkZ2UgdGhlIHBoeSBwYXJhbWV0ZXJzCi0JICogb24gY29uY3VycmVudCBtb2RlIGZvciBzaW5nbGUgcGh5Ci0JICovCi0Jc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCBjdXJfY2hhbm5lbCwgY3VyX2NoX29mZnNldCwgY3VyX2J3bW9kZSk7Ci0KLQlEQkdfODcyM0EoIkNIID0lZCwgQlcgPSVkLCBvZmZzZXQgPSVkXG4iLCBjdXJfY2hhbm5lbCwgY3VyX2J3bW9kZSwKLQkJICBjdXJfY2hfb2Zmc2V0KTsKLQotCXBtbG1lZXh0LT5jdXJfY2hhbm5lbCA9IGN1cl9jaGFubmVsOwotCXBtbG1lZXh0LT5jdXJfYndtb2RlID0gY3VyX2J3bW9kZTsKLQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9IGN1cl9jaF9vZmZzZXQ7Ci0JcG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID0gcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrX3R5cGU7Ci0KLQkvKiB1cGRhdGUgY3VyX3dpcmVsZXNzX21vZGUgKi8KLQl1cGRhdGVfd2lyZWxlc3NfbW9kZTIzYShwYWRhcHRlcik7Ci0KLQkvKiB1cGRhdGUgY2FwYWJpbGl0eSBhZnRlciBjdXJfd2lyZWxlc3NfbW9kZSB1cGRhdGVkICovCi0JdXBkYXRlX2NhcGluZm8yM2EocGFkYXB0ZXIsIHBuZXR3b3JrLT5jYXBhYmlsaXR5KTsKLQotCS8qIGxldCBwbmV0d29ya19tbG1lZXh0ID09IHBuZXR3b3JrX21sbWUuICovCi0JbWVtY3B5KHBuZXR3b3JrX21sbWVleHQsIHBuZXR3b3JrLCBwbmV0d29yay0+TGVuZ3RoKTsKLQotCWlmIChwbWxtZWV4dC0+YnN0YXJ0X2JzcykgewotCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9USU0sIE5VTEwsIGZhbHNlKTsKLQotCQkvKiBpc3N1ZSBiZWFjb24gZnJhbWUgKi8KLQkJaWYgKHNlbmRfYmVhY29uMjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkKLQkJCURCR184NzIzQSgiaXNzdWVfYmVhY29uMjNhLCBmYWlsIVxuIik7Ci0JfQotCi0JLyogdXBkYXRlIGJjL21jIHN0YV9pbmZvICovCi0JdXBkYXRlX2JtY19zdGEocGFkYXB0ZXIpOwotfQotCi1pbnQgcnR3X2NoZWNrX2JlYWNvbl9kYXRhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgdW5zaWduZWQgaW50IGxlbikKLXsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0JdTggKnA7Ci0JdTggKnBIVF9jYXBzX2llID0gTlVMTDsKLQl1OCAqcEhUX2luZm9faWUgPSBOVUxMOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0JdTE2IGh0X2NhcCA9IGZhbHNlOwotCXVpbnQgaWVfbGVuID0gMDsKLQlpbnQgZ3JvdXBfY2lwaGVyLCBwYWlyd2lzZV9jaXBoZXI7Ci0JdTggY2hhbm5lbCwgbmV0d29ya190eXBlLCBzdXBwb3J0UmF0ZVtORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOwotCWludCBzdXBwb3J0UmF0ZU51bSA9IDA7Ci0JdTggV01NX1BBUkFfSUVbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAxLCAweDAxfTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGJzc19uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQl1OCAqaWUgPSBwYnNzX25ldHdvcmstPklFczsKLQl1OCAqcGJ1ZiA9IG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlOwotCi0JbGVuIC09IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpOwotCS8qIFNTSUQgKi8KLQkvKiBTdXBwb3J0ZWQgcmF0ZXMgKi8KLQkvKiBEUyBQYXJhbXMgKi8KLQkvKiBXTEFOX0VJRF9DT1VOVFJZICovCi0JLyogRVJQIEluZm9ybWF0aW9uIGVsZW1lbnQgKi8KLQkvKiBFeHRlbmRlZCBzdXBwb3J0ZWQgcmF0ZXMgKi8KLQkvKiBXUEEvV1BBMiAqLwotCS8qIFdpLUZpIFdpcmVsZXNzIE11bHRpbWVkaWEgRXh0ZW5zaW9ucyAqLwotCS8qIGh0X2NhcGFiLCBodF9vcGVyICovCi0JLyogV1BTIElFICovCi0KLQlEQkdfODcyM0EoIiVzLCBsZW4gPSVkXG4iLCBfX2Z1bmNfXywgbGVuKTsKLQotCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlpZiAobGVuID4gTUFYX0lFX1NaKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlwYnNzX25ldHdvcmstPklFTGVuZ3RoID0gbGVuOwotCi0JbWVtc2V0KGllLCAwLCBNQVhfSUVfU1opOwotCi0JbWVtY3B5KGllLCBwYnVmLCBwYnNzX25ldHdvcmstPklFTGVuZ3RoKTsKLQotCWlmIChwYnNzX25ldHdvcmstPmlmbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BUCAmJgotCSAgICBwYnNzX25ldHdvcmstPmlmbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfR08pCi0JCXJldHVybiBfRkFJTDsKLQotCXBic3NfbmV0d29yay0+UnNzaSA9IDA7Ci0KLQltZW1jcHkocGJzc19uZXR3b3JrLT5NYWNBZGRyZXNzLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksIEVUSF9BTEVOKTsKLQotCS8qIFNTSUQgKi8KLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfU1NJRCwgJmllX2xlbiwgcGJzc19uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgaWVfbGVuID4gMCkgewotCQltZW1zZXQoJnBic3NfbmV0d29yay0+U3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBjZmc4MDIxMV9zc2lkKSk7Ci0JCW1lbWNweShwYnNzX25ldHdvcmstPlNzaWQuc3NpZCwgKHAgKyAyKSwgaWVfbGVuKTsKLQkJcGJzc19uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuID0gaWVfbGVuOwotCX0KLQotCS8qIGNoYW5uZWwgKi8KLQljaGFubmVsID0gMDsKLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfRFNfUEFSQU1TLCAmaWVfbGVuLAotCQkJICBwYnNzX25ldHdvcmstPklFTGVuZ3RoKTsKLQlpZiAocCAmJiBpZV9sZW4gPiAwKQotCQljaGFubmVsID0gKihwICsgMik7Ci0KLQlwYnNzX25ldHdvcmstPkRTQ29uZmlnID0gY2hhbm5lbDsKLQotCW1lbXNldChzdXBwb3J0UmF0ZSwgMCwgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYKTsKLQkvKiAgZ2V0IHN1cHBvcnRlZCByYXRlcyAqLwotCXAgPSBydHdfZ2V0X2llMjNhKGllLCBXTEFOX0VJRF9TVVBQX1JBVEVTLCAmaWVfbGVuLAotCQkJICBwYnNzX25ldHdvcmstPklFTGVuZ3RoKTsKLQlpZiAocCkgewotCQltZW1jcHkoc3VwcG9ydFJhdGUsIHArMiwgaWVfbGVuKTsKLQkJc3VwcG9ydFJhdGVOdW0gPSBpZV9sZW47Ci0JfQotCi0JLyogZ2V0IGV4dF9zdXBwb3J0ZWQgcmF0ZXMgKi8KLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsCi0JCQkgICZpZV9sZW4sIHBic3NfbmV0d29yay0+SUVMZW5ndGgpOwotCWlmIChwKSB7Ci0JCW1lbWNweShzdXBwb3J0UmF0ZStzdXBwb3J0UmF0ZU51bSwgcCsyLCBpZV9sZW4pOwotCQlzdXBwb3J0UmF0ZU51bSArPSBpZV9sZW47Ci0JfQotCi0JbmV0d29ya190eXBlID0gcnR3X2NoZWNrX25ldHdvcmtfdHlwZTIzYShzdXBwb3J0UmF0ZSwKLQkJCQkJCSBzdXBwb3J0UmF0ZU51bSwgY2hhbm5lbCk7Ci0KLQlydHdfc2V0X3N1cHBvcnRlZF9yYXRlMjNhKHBic3NfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsIG5ldHdvcmtfdHlwZSk7Ci0KLQkvKiBwYXJzaW5nIEVSUF9JRSAqLwotCXAgPSBydHdfZ2V0X2llMjNhKGllLCBXTEFOX0VJRF9FUlBfSU5GTywgJmllX2xlbiwKLQkJCSAgcGJzc19uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgaWVfbGVuID4gMCkKLQkJRVJQX0lFX2hhbmRsZXIyM2EocGFkYXB0ZXIsIHApOwotCi0JLyogdXBkYXRlIHByaXZhY3kvc2VjdXJpdHkgKi8KLQlpZiAocGJzc19uZXR3b3JrLT5jYXBhYmlsaXR5ICYgQklUKDQpKQotCQlwYnNzX25ldHdvcmstPlByaXZhY3kgPSAxOwotCWVsc2UKLQkJcGJzc19uZXR3b3JrLT5Qcml2YWN5ID0gMDsKLQotCXBzZWN1cml0eXByaXYtPndwYV9wc2sgPSAwOwotCi0JLyogd3BhMiAqLwotCWdyb3VwX2NpcGhlciA9IDA7IHBhaXJ3aXNlX2NpcGhlciA9IDA7Ci0JcHNlY3VyaXR5cHJpdi0+d3BhMl9ncm91cF9jaXBoZXIgPSAwOwotCXBzZWN1cml0eXByaXYtPndwYTJfcGFpcndpc2VfY2lwaGVyID0gMDsKLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfUlNOLCAmaWVfbGVuLAotCQkJICBwYnNzX25ldHdvcmstPklFTGVuZ3RoKTsKLQlpZiAocCAmJiBpZV9sZW4gPiAwKSB7Ci0JCWlmIChydHdfcGFyc2Vfd3BhMl9pZTIzYShwLCBpZV9sZW4rMiwgJmdyb3VwX2NpcGhlciwKLQkJCQkJICZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7Ci0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV84MDIxWDsKLQotCQkJcHNlY3VyaXR5cHJpdi0+ZG90ODAyMXhhbGcgPSAxOyAvKiBwc2ssIHRvZG86ODAyLjF4ICovCi0JCQlwc2VjdXJpdHlwcml2LT53cGFfcHNrIHw9IEJJVCgxKTsKLQotCQkJcHNlY3VyaXR5cHJpdi0+d3BhMl9ncm91cF9jaXBoZXIgPSBncm91cF9jaXBoZXI7Ci0JCQlwc2VjdXJpdHlwcml2LT53cGEyX3BhaXJ3aXNlX2NpcGhlciA9IHBhaXJ3aXNlX2NpcGhlcjsKLQkJfQotCX0KLQotCS8qIHdwYSAqLwotCWllX2xlbiA9IDA7Ci0JZ3JvdXBfY2lwaGVyID0gMDsKLQlwYWlyd2lzZV9jaXBoZXIgPSAwOwotCXBzZWN1cml0eXByaXYtPndwYV9ncm91cF9jaXBoZXIgPSAwOwotCXBzZWN1cml0eXByaXYtPndwYV9wYWlyd2lzZV9jaXBoZXIgPSAwOwotCWZvciAocCA9IGllOyA7IHAgKz0gKGllX2xlbiArIDIpKSB7Ci0JCXAgPSBydHdfZ2V0X2llMjNhKHAsIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQywgJmllX2xlbiwKLQkJCQkgIHBic3NfbmV0d29yay0+SUVMZW5ndGggLSAoaWVfbGVuICsgMikpOwotCQlpZiAoKHApICYmICghbWVtY21wKHArMiwgUlRXX1dQQV9PVUkyM0FfVFlQRSwgNCkpKSB7Ci0JCQlpZiAocnR3X3BhcnNlX3dwYV9pZTIzYShwLCBpZV9sZW4rMiwgJmdyb3VwX2NpcGhlciwKLQkJCQkJCSZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7Ci0JCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0KLQkJCQkvKiBwc2ssICB0b2RvOjgwMi4xeCAqLwotCQkJCXBzZWN1cml0eXByaXYtPmRvdDgwMjF4YWxnID0gMTsKLQotCQkJCXBzZWN1cml0eXByaXYtPndwYV9wc2sgfD0gQklUKDApOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+d3BhX2dyb3VwX2NpcGhlciA9IGdyb3VwX2NpcGhlcjsKLQkJCQlwc2VjdXJpdHlwcml2LT53cGFfcGFpcndpc2VfY2lwaGVyID0gcGFpcndpc2VfY2lwaGVyOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoIXAgfHwgIWllX2xlbikKLQkJCWJyZWFrOwotCX0KLQotCS8qIHdtbSAqLwotCWllX2xlbiA9IDA7Ci0JcG1sbWVwcml2LT5xb3Nfb3B0aW9uID0gMDsKLQlpZiAocHJlZ2lzdHJ5cHJpdi0+d21tX2VuYWJsZSkgewotCQlmb3IgKHAgPSBpZTsgOyBwICs9IChpZV9sZW4gKyAyKSkgewotCQkJcCA9IHJ0d19nZXRfaWUyM2EocCwgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDLCAmaWVfbGVuLAotCQkJCQkgIChwYnNzX25ldHdvcmstPklFTGVuZ3RoIC0KLQkJCQkJICAgKGllX2xlbiArIDIpKSk7Ci0JCQlpZiAoKHApICYmICFtZW1jbXAocCsyLCBXTU1fUEFSQV9JRSwgNikpIHsKLQkJCQlwbWxtZXByaXYtPnFvc19vcHRpb24gPSAxOwotCi0JCQkJKihwICsgOCkgfD0gQklUKDcpOy8qIFFvUyBJbmZvOnN1cHBvcnQgVS1BUFNEICovCi0KLQkJCQkvKiBkaXNhYmxlIGFsbCBBQ00gYml0cyBzaW5jZSB0aGUgV01NIGFkbWlzc2lvbgotCQkJCSAqIGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZAotCQkJCSAqLwotCQkJCSoocCArIDEwKSAmPSB+QklUKDQpOyAvKiBCRSAqLwotCQkJCSoocCArIDE0KSAmPSB+QklUKDQpOyAvKiBCSyAqLwotCQkJCSoocCArIDE4KSAmPSB+QklUKDQpOyAvKiBWSSAqLwotCQkJCSoocCArIDIyKSAmPSB+QklUKDQpOyAvKiBWTyAqLwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKChwID09IE5VTEwpIHx8IChpZV9sZW4gPT0gMCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JLyogcGFyc2luZyBIVF9DQVBfSUUgKi8KLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwgJmllX2xlbiwKLQkJCSAgcGJzc19uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgaWVfbGVuID4gMCkgewotCQl1OCByZl90eXBlOwotCi0JCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpwaHRfY2FwID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICopKHArMik7Ci0KLQkJcEhUX2NhcHNfaWUgPSBwOwotCi0JCWh0X2NhcCA9IHRydWU7Ci0JCW5ldHdvcmtfdHlwZSB8PSBXSVJFTEVTU18xMV8yNE47Ci0KLQkJcmZfdHlwZSA9IHJ0bDg3MjNhX2dldF9yZl90eXBlKHBhZGFwdGVyKTsKLQotCQlpZiAoKHBzZWN1cml0eXByaXYtPndwYV9wYWlyd2lzZV9jaXBoZXIgJiBXUEFfQ0lQSEVSX0NDTVApIHx8Ci0JCSAgICAocHNlY3VyaXR5cHJpdi0+d3BhMl9wYWlyd2lzZV9jaXBoZXIgJiBXUEFfQ0lQSEVSX0NDTVApKQotCQkJcGh0X2NhcC0+YW1wZHVfcGFyYW1zX2luZm8gfD0gKElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkgJiAoMHgwNzw8MikpOwotCQllbHNlCi0JCQlwaHRfY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSAoSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWSYweDAwKTsKLQotCQkvKiBzZXQgIE1heCBSeCBBTVBEVSBzaXplICB0byA2NEsgKi8KLQkJcGh0X2NhcC0+YW1wZHVfcGFyYW1zX2luZm8gfD0gKElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUiAmIDB4MDMpOwotCi0JCWlmIChyZl90eXBlID09IFJGXzFUMVIpIHsKLQkJCXBodF9jYXAtPm1jcy5yeF9tYXNrWzBdID0gMHhmZjsKLQkJCXBodF9jYXAtPm1jcy5yeF9tYXNrWzFdID0gMHgwOwotCQl9Ci0KLQkJbWVtY3B5KCZwbWxtZXByaXYtPmh0cHJpdi5odF9jYXAsIHArMiwgaWVfbGVuKTsKLQl9Ci0KLQkvKiBwYXJzaW5nIEhUX0lORk9fSUUgKi8KLQlwID0gcnR3X2dldF9pZTIzYShpZSwgV0xBTl9FSURfSFRfT1BFUkFUSU9OLCAmaWVfbGVuLAotCQkJICBwYnNzX25ldHdvcmstPklFTGVuZ3RoKTsKLQlpZiAocCAmJiBpZV9sZW4gPiAwKQotCQlwSFRfaW5mb19pZSA9IHA7Ci0KLQlwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmtfdHlwZSA9IG5ldHdvcmtfdHlwZTsKLQotCXBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbiA9IGZhbHNlOwotCi0JLyogaHRfY2FwICovCi0JaWYgKHByZWdpc3RyeXByaXYtPmh0X2VuYWJsZSAmJiBodF9jYXApIHsKLQkJcG1sbWVwcml2LT5odHByaXYuaHRfb3B0aW9uID0gdHJ1ZTsKLQkJcG1sbWVwcml2LT5xb3Nfb3B0aW9uID0gMTsKLQotCQlpZiAocHJlZ2lzdHJ5cHJpdi0+YW1wZHVfZW5hYmxlID09IDEpCi0JCQlwbWxtZXByaXYtPmh0cHJpdi5hbXBkdV9lbmFibGUgPSB0cnVlOwotCi0JCUhUX2NhcHNfaGFuZGxlcjIzYShwYWRhcHRlciwgcEhUX2NhcHNfaWUpOwotCi0JCUhUX2luZm9faGFuZGxlcjIzYShwYWRhcHRlciwgcEhUX2luZm9faWUpOwotCX0KLQotCXBic3NfbmV0d29yay0+TGVuZ3RoID0gZ2V0X3dsYW5fYnNzaWRfZXhfc3oocGJzc19uZXR3b3JrKTsKLQotCS8qIGlzc3VlIGJlYWNvbiB0byBzdGFydCBic3MgbmV0d29yayAqLwotCXN0YXJ0X2Jzc19uZXR3b3JrKHBhZGFwdGVyLCAodTggKilwYnNzX25ldHdvcmspOwotCi0JLyogYWxsb2Mgc3RhX2luZm8gZm9yIGFwIGl0c2VsZiAqLwotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCBwYnNzX25ldHdvcmstPk1hY0FkZHJlc3MpOwotCWlmICghcHN0YSkgewotCQlwc3RhID0gcnR3X2FsbG9jX3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LAotCQkJCQkgICAgcGJzc19uZXR3b3JrLT5NYWNBZGRyZXNzLAotCQkJCQkgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHN0YSkKLQkJCXJldHVybiBfRkFJTDsKLQl9Ci0JLyogZml4IGJ1ZyBvZiBmbHVzaF9jYW1fZW50cnkgYXQgU1RPUCBBUCBtb2RlICovCi0JcHN0YS0+c3RhdGUgfD0gV0lGSV9BUF9TVEFURTsKLQlydHdfaW5kaWNhdGVfY29ubmVjdDIzYShwYWRhcHRlcik7Ci0KLQkvKiBmb3IgY2hlY2sgaWYgYWxyZWFkeSBzZXQgYmVhY29uICovCi0JcG1sbWVwcml2LT5jdXJfbmV0d29yay5qb2luX3JlcyA9IHRydWU7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHJ0d19zZXRfbWFjYWRkcl9hY2wyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgaW50IG1vZGUpCi17Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9hY2xfcG9vbCAqcGFjbF9saXN0ID0gJnBzdGFwcml2LT5hY2xfbGlzdDsKLQotCURCR184NzIzQSgiJXMsIG1vZGUgPSVkXG4iLCBfX2Z1bmNfXywgbW9kZSk7Ci0KLQlwYWNsX2xpc3QtPm1vZGUgPSBtb2RlOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYmNuX2VycGluZm9faWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBuZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQl1bnNpZ25lZCBjaGFyICpwLCAqaWUgPSBwbmV0d29yay0+SUVzOwotCXUzMiBsZW4gPSAwOwotCi0JREJHXzg3MjNBKCIlcywgRVJQX2VuYWJsZSA9JWRcbiIsIF9fZnVuY19fLCBwbWxtZWluZm8tPkVSUF9lbmFibGUpOwotCi0JaWYgKCFwbWxtZWluZm8tPkVSUF9lbmFibGUpCi0JCXJldHVybjsKLQotCS8qIHBhcnNpbmcgRVJQX0lFICovCi0JcCA9IHJ0d19nZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0VSUF9JTkZPLCAmbGVuLCBwbmV0d29yay0+SUVMZW5ndGgpOwotCWlmIChwICYmIGxlbiA+IDApIHsKLQkJaWYgKHBtbG1lcHJpdi0+bnVtX3N0YV9ub25fZXJwID09IDEpCi0JCQlwWzJdIHw9IFdMQU5fRVJQX05PTl9FUlBfUFJFU0VOVCB8Ci0JCQkJV0xBTl9FUlBfVVNFX1BST1RFQ1RJT047Ci0JCWVsc2UKLQkJCXBbMl0gJj0gfihXTEFOX0VSUF9OT05fRVJQX1BSRVNFTlQgfAotCQkJCSAgV0xBTl9FUlBfVVNFX1BST1RFQ1RJT04pOwotCi0JCWlmIChwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfcHJlYW1ibGUgPiAwKQotCQkJcFsyXSB8PSBXTEFOX0VSUF9CQVJLRVJfUFJFQU1CTEU7Ci0JCWVsc2UKLQkJCXBbMl0gJj0gfihXTEFOX0VSUF9CQVJLRVJfUFJFQU1CTEUpOwotCi0JCUVSUF9JRV9oYW5kbGVyMjNhKHBhZGFwdGVyLCBwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9iY25fd3BhX2llKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYmNuX3dtbV9pZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2Jjbl93cHNfaWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9iY25fcDJwX2llKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9iY25fdmVuZG9yX3NwZWNfaWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKm91aSkKLXsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIW1lbWNtcChSVFdfV1BBX09VSTIzQV9UWVBFLCBvdWksIDQpKQotCQl1cGRhdGVfYmNuX3dwYV9pZShwYWRhcHRlcik7Ci0JZWxzZSBpZiAoIW1lbWNtcChXTU1fT1VJMjNBLCBvdWksIDQpKQotCQl1cGRhdGVfYmNuX3dtbV9pZShwYWRhcHRlcik7Ci0JZWxzZSBpZiAoIW1lbWNtcChXUFNfT1VJMjNBLCBvdWksIDQpKQotCQl1cGRhdGVfYmNuX3dwc19pZShwYWRhcHRlcik7Ci0JZWxzZSBpZiAoIW1lbWNtcChQMlBfT1VJMjNBLCBvdWksIDQpKQotCQl1cGRhdGVfYmNuX3AycF9pZShwYWRhcHRlcik7Ci0JZWxzZQotCQlEQkdfODcyM0EoInVua25vd24gT1VJIHR5cGUhXG4iKTsKLX0KLQotdm9pZCB1cGRhdGVfYmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGllX2lkLCB1OCAqb3VpLCB1OCB0eCkKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0OwotCS8qIHN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm87ICovCi0KLQkvKiBEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7ICovCi0KLQlpZiAoIXBhZGFwdGVyKQotCQlyZXR1cm47Ci0KLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQkvKiBwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOyAqLwotCi0JaWYgKGZhbHNlID09IHBtbG1lZXh0LT5ic3RhcnRfYnNzKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+YmNuX3VwZGF0ZV9sb2NrKTsKLQotCXN3aXRjaCAoaWVfaWQpIHsKLQljYXNlIFdMQU5fRUlEX1RJTToKLQkJdXBkYXRlX0JDTlRJTShwYWRhcHRlcik7Ci0JCWJyZWFrOwotCi0JY2FzZSBXTEFOX0VJRF9FUlBfSU5GTzoKLQkJdXBkYXRlX2Jjbl9lcnBpbmZvX2llKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJdXBkYXRlX2Jjbl92ZW5kb3Jfc3BlY19pZShwYWRhcHRlciwgb3VpKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlwbWxtZXByaXYtPnVwZGF0ZV9iY24gPSB0cnVlOwotCi0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+YmNuX3VwZGF0ZV9sb2NrKTsKLQotCWlmICh0eCkKLQkJc2V0X3R4X2JlYWNvbl9jbWQyM2EocGFkYXB0ZXIpOwotfQotCi0vKgotICogb3BfbW9kZQotICogU2V0IHRvIDAgKEhUIHB1cmUpIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICoJLSBhbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMC80MCBNSHogSFQgaW4gMjAvNDAgTUh6IEJTUyBvcgotICoJLSBhbGwgU1RBcyBpbiB0aGUgQlNTIGFyZSAyMCBNSHogSFQgaW4gMjAgTUh6IEJTUwotICogU2V0IHRvIDEgKEhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbikgaWYgdGhlcmUgbWF5IGJlIG5vbi1IVCBTVEFzCi0gKglpbiBib3RoIHRoZSBwcmltYXJ5IGFuZCB0aGUgc2Vjb25kYXJ5IGNoYW5uZWwKLSAqIFNldCB0byAyIGlmIG9ubHkgSFQgU1RBcyBhcmUgYXNzb2NpYXRlZCBpbiBCU1MsCi0gKglob3dldmVyIGFuZCBhdCBsZWFzdCBvbmUgMjAgTUh6IEhUIFNUQSBpcyBhc3NvY2lhdGVkCi0gKiBTZXQgdG8gMyAoSFQgbWl4ZWQgbW9kZSkgd2hlbiBvbmUgb3IgbW9yZSBub24tSFQgU1RBcyBhcmUgYXNzb2NpYXRlZAotICoJKGN1cnJlbnRseSBub24tR0YgSFQgc3RhdGlvbiBpcyBjb25zaWRlcmVkIGFzIG5vbi1IVCBTVEEgYWxzbykKLSovCi1zdGF0aWMgaW50IHJ0d19odF9vcGVyYXRpb25fdXBkYXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTE2IGN1cl9vcF9tb2RlLCBuZXdfb3BfbW9kZTsKLQlpbnQgb3BfbW9kZV9jaGFuZ2VzID0gMDsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2X2FwID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCi0JaWYgKHBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbikKLQkJcmV0dXJuIDA7Ci0KLQkvKiBpZiAoIWlmYWNlLT5jb25mLT5pZWVlODAyMTFuIHx8IGlmYWNlLT5jb25mLT5odF9vcF9tb2RlX2ZpeGVkKSAqLwotCS8qCXJldHVybiAwOyAqLwotCi0JREJHXzg3MjNBKCIlcyBjdXJyZW50IG9wZXJhdGlvbiBtb2RlID0gMHglWFxuIiwKLQkJICAgX19mdW5jX18sIHBtbG1lcHJpdi0+aHRfb3BfbW9kZSk7Ci0KLQlpZiAoIShwbWxtZXByaXYtPmh0X29wX21vZGUgJiBJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fR0ZfU1RBX1BSU05UKQotCSAgICAmJiBwbWxtZXByaXYtPm51bV9zdGFfaHRfbm9fZ2YpIHsKLQkJcG1sbWVwcml2LT5odF9vcF9tb2RlIHw9Ci0JCQlJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fR0ZfU1RBX1BSU05UOwotCQlvcF9tb2RlX2NoYW5nZXMrKzsKLQl9IGVsc2UgaWYgKChwbWxtZXByaXYtPmh0X29wX21vZGUgJgotCQkgICAgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVCkgJiYKLQkJICAgcG1sbWVwcml2LT5udW1fc3RhX2h0X25vX2dmID09IDApIHsKLQkJcG1sbWVwcml2LT5odF9vcF9tb2RlICY9Ci0JCQl+SUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVDsKLQkJb3BfbW9kZV9jaGFuZ2VzKys7Ci0JfQotCi0JaWYgKCEocG1sbWVwcml2LT5odF9vcF9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0hUX1NUQV9QUlNOVCkgJiYKLQkgICAgKHBtbG1lcHJpdi0+bnVtX3N0YV9ub19odCB8fCBwbWxtZXByaXYtPm9sYmNfaHQpKSB7Ci0JCXBtbG1lcHJpdi0+aHRfb3BfbW9kZSB8PSBJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fSFRfU1RBX1BSU05UOwotCQlvcF9tb2RlX2NoYW5nZXMrKzsKLQl9IGVsc2UgaWYgKChwbWxtZXByaXYtPmh0X29wX21vZGUgJgotCQkgICAgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0hUX1NUQV9QUlNOVCkgJiYKLQkJICAgKHBtbG1lcHJpdi0+bnVtX3N0YV9ub19odCA9PSAwICYmICFwbWxtZXByaXYtPm9sYmNfaHQpKSB7Ci0JCXBtbG1lcHJpdi0+aHRfb3BfbW9kZSAmPQotCQkJfklFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9IVF9TVEFfUFJTTlQ7Ci0JCW9wX21vZGVfY2hhbmdlcysrOwotCX0KLQotCS8qCi0JICogTm90ZTogY3VycmVudGx5IHdlIHN3aXRjaCB0byB0aGUgTUlYRUQgb3AgbW9kZSBpZiBIVCBub24tZ3JlZW5maWVsZAotCSAqIHN0YXRpb24gaXMgYXNzb2NpYXRlZC4gUHJvYmFibHkgaXQncyBhIHRoZW9yZXRpY2FsIGNhc2UsIHNpbmNlCi0JICogaXQgbG9va3MgbGlrZSBhbGwga25vd24gSFQgU1RBcyBzdXBwb3J0IGdyZWVuZmllbGQuCi0JICovCi0JaWYgKHBtbG1lcHJpdi0+bnVtX3N0YV9ub19odCB8fAotCSAgICAocG1sbWVwcml2LT5odF9vcF9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVCkpCi0JCW5ld19vcF9tb2RlID0gSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTl9OT05IVF9NSVhFRDsKLQllbHNlIGlmICgobGUxNl90b19jcHUocGh0cHJpdl9hcC0+aHRfY2FwLmNhcF9pbmZvKSAmCi0JCSAgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApICYmCi0JCSBwbWxtZXByaXYtPm51bV9zdGFfaHRfMjBtaHopCi0JCW5ld19vcF9tb2RlID0gSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTl8yME1IWjsKLQllbHNlIGlmIChwbWxtZXByaXYtPm9sYmNfaHQpCi0JCW5ld19vcF9tb2RlID0gSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTl9OT05NRU1CRVI7Ci0JZWxzZQotCQluZXdfb3BfbW9kZSA9IElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT05fTk9ORTsKLQotCWN1cl9vcF9tb2RlID0gcG1sbWVwcml2LT5odF9vcF9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTjsKLQlpZiAoY3VyX29wX21vZGUgIT0gbmV3X29wX21vZGUpIHsKLQkJcG1sbWVwcml2LT5odF9vcF9tb2RlICY9IH5JRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OOwotCQlwbWxtZXByaXYtPmh0X29wX21vZGUgfD0gbmV3X29wX21vZGU7Ci0JCW9wX21vZGVfY2hhbmdlcysrOwotCX0KLQotCURCR184NzIzQSgiJXMgbmV3IG9wZXJhdGlvbiBtb2RlID0gMHglWCBjaGFuZ2VzID0lZFxuIiwKLQkJICAgX19mdW5jX18sIHBtbG1lcHJpdi0+aHRfb3BfbW9kZSwgb3BfbW9kZV9jaGFuZ2VzKTsKLQotCXJldHVybiBvcF9tb2RlX2NoYW5nZXM7Ci19Ci0KLXZvaWQgYXNzb2NpYXRlZF9jbGllbnRzX3VwZGF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB1cGRhdGVkKQotewotCS8qIHVwZGF0ZSBhc3NvY2lhdGVkIHN0YXRpb25zIGNhcC4gKi8KLQlpZiAodXBkYXRlZCA9PSB0cnVlKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsICpwdG1wOwotCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQkJcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBzdGEsIHB0bXAsIHBoZWFkLCBhc29jX2xpc3QpCi0JCQlWQ1NfdXBkYXRlMjNhKHBhZGFwdGVyLCBwc3RhKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JfQotfQotCi0vKiBjYWxsZWQgPiBUU1IgTEVWRUwgZm9yIFVTQiBvciBTRElPIEludGVyZmFjZSAqLwotdm9pZCBic3NfY2FwX3VwZGF0ZV9vbl9zdGFfam9pbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JdTggYmVhY29uX3VwZGF0ZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlpZiAoIShwc3RhLT5mbGFncyAmIFdMQU5fU1RBX1NIT1JUX1BSRUFNQkxFKSkgewotCQlpZiAoIXBzdGEtPm5vX3Nob3J0X3ByZWFtYmxlX3NldCkgewotCQkJcHN0YS0+bm9fc2hvcnRfcHJlYW1ibGVfc2V0ID0gMTsKLQotCQkJcG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3ByZWFtYmxlKys7Ci0KLQkJCWlmICgocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID4gV0lSRUxFU1NfMTFCKSAmJgotCQkJCShwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfcHJlYW1ibGUgPT0gMSkpIHsKLQkJCQliZWFjb25fdXBkYXRlZCA9IHRydWU7Ci0JCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgMHhGRiwgTlVMTCwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChwc3RhLT5ub19zaG9ydF9wcmVhbWJsZV9zZXQpIHsKLQkJCXBzdGEtPm5vX3Nob3J0X3ByZWFtYmxlX3NldCA9IDA7Ci0KLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9wcmVhbWJsZS0tOwotCi0JCQlpZiAoKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA+IFdJUkVMRVNTXzExQikgJiYKLQkJCQkocG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3ByZWFtYmxlID09IDApKSB7Ci0JCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIDB4RkYsIE5VTEwsIHRydWUpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlpZiAocHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9OT05FUlApIHsKLQkJaWYgKCFwc3RhLT5ub25lcnBfc2V0KSB7Ci0JCQlwc3RhLT5ub25lcnBfc2V0ID0gMTsKLQotCQkJcG1sbWVwcml2LT5udW1fc3RhX25vbl9lcnArKzsKLQotCQkJaWYgKHBtbG1lcHJpdi0+bnVtX3N0YV9ub25fZXJwID09IDEpIHsKLQkJCQliZWFjb25fdXBkYXRlZCA9IHRydWU7Ci0JCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfRVJQX0lORk8sIE5VTEwsIHRydWUpOwotCQkJfQotCQl9Ci0KLQl9IGVsc2UgewotCQlpZiAocHN0YS0+bm9uZXJwX3NldCkgewotCQkJcHN0YS0+bm9uZXJwX3NldCA9IDA7Ci0KLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub25fZXJwLS07Ci0KLQkJCWlmIChwbWxtZXByaXYtPm51bV9zdGFfbm9uX2VycCA9PSAwKSB7Ci0JCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX0VSUF9JTkZPLCBOVUxMLCB0cnVlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JaWYgKCEocHN0YS0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UX1RJTUUpKSB7Ci0JCWlmICghcHN0YS0+bm9fc2hvcnRfc2xvdF90aW1lX3NldCkgewotCQkJcHN0YS0+bm9fc2hvcnRfc2xvdF90aW1lX3NldCA9IDE7Ci0KLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9zbG90X3RpbWUrKzsKLQotCQkJaWYgKChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPiBXSVJFTEVTU18xMUIpICYmCi0JCQkJIChwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfc2xvdF90aW1lID09IDEpKSB7Ci0JCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIDB4RkYsIE5VTEwsIHRydWUpOwotCQkJfQotCi0JCX0KLQl9IGVsc2UgewotCQlpZiAocHN0YS0+bm9fc2hvcnRfc2xvdF90aW1lX3NldCkgewotCQkJcHN0YS0+bm9fc2hvcnRfc2xvdF90aW1lX3NldCA9IDA7Ci0KLQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9zbG90X3RpbWUtLTsKLQotCQkJaWYgKChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPiBXSVJFTEVTU18xMUIpICYmCi0JCQkJIChwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfc2xvdF90aW1lID09IDApKSB7Ci0JCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIDB4RkYsIE5VTEwsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHBzdGEtPmZsYWdzICYgV0xBTl9TVEFfSFQpIHsKLQkJdTE2IGh0X2NhcGFiID0gbGUxNl90b19jcHUocHN0YS0+aHRwcml2Lmh0X2NhcC5jYXBfaW5mbyk7Ci0KLQkJREJHXzg3MjNBKCJIVDogU1RBICVwTSBIVCBDYXBhYmlsaXRpZXMgSW5mbzogMHglMDR4XG4iLAotCQkJICBwc3RhLT5od2FkZHIsIGh0X2NhcGFiKTsKLQotCQlpZiAocHN0YS0+bm9faHRfc2V0KSB7Ci0JCQlwc3RhLT5ub19odF9zZXQgPSAwOwotCQkJcG1sbWVwcml2LT5udW1fc3RhX25vX2h0LS07Ci0JCX0KLQotCQlpZiAoKGh0X2NhcGFiICYgSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxEKSA9PSAwKSB7Ci0JCQlpZiAoIXBzdGEtPm5vX2h0X2dmX3NldCkgewotCQkJCXBzdGEtPm5vX2h0X2dmX3NldCA9IDE7Ci0JCQkJcG1sbWVwcml2LT5udW1fc3RhX2h0X25vX2dmKys7Ci0JCQl9Ci0JCQlEQkdfODcyM0EoIiVzIFNUQSAlcE0gLSBubyBncmVlbmZpZWxkLCBudW0gb2Ygbm9uLWdmIHN0YXRpb25zICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHBzdGEtPmh3YWRkciwKLQkJCQkgIHBtbG1lcHJpdi0+bnVtX3N0YV9odF9ub19nZik7Ci0JCX0KLQotCQlpZiAoKGh0X2NhcGFiICYgSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApID09IDApIHsKLQkJCWlmICghcHN0YS0+aHRfMjBtaHpfc2V0KSB7Ci0JCQkJcHN0YS0+aHRfMjBtaHpfc2V0ID0gMTsKLQkJCQlwbWxtZXByaXYtPm51bV9zdGFfaHRfMjBtaHorKzsKLQkJCX0KLQkJCURCR184NzIzQSgiJXMgU1RBICVwTSAtIDIwIE1IeiBIVCwgbnVtIG9mIDIwTUh6IEhUIFNUQXMgJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgcHN0YS0+aHdhZGRyLAotCQkJCSAgcG1sbWVwcml2LT5udW1fc3RhX2h0XzIwbWh6KTsKLQkJfQotCi0JfSBlbHNlIHsKLQkJaWYgKCFwc3RhLT5ub19odF9zZXQpIHsKLQkJCXBzdGEtPm5vX2h0X3NldCA9IDE7Ci0JCQlwbWxtZXByaXYtPm51bV9zdGFfbm9faHQrKzsKLQkJfQotCQlpZiAocG1sbWVwcml2LT5odHByaXYuaHRfb3B0aW9uKSB7Ci0JCQlEQkdfODcyM0EoIiVzIFNUQSAlcE0gLSBubyBIVCwgbnVtIG9mIG5vbi1IVCBzdGF0aW9ucyAlZFxuIiwKLQkJCQkgIF9fZnVuY19fLCBwc3RhLT5od2FkZHIsCi0JCQkJICBwbWxtZXByaXYtPm51bV9zdGFfbm9faHQpOwotCQl9Ci0JfQotCi0JaWYgKHJ0d19odF9vcGVyYXRpb25fdXBkYXRlKHBhZGFwdGVyKSA+IDApIHsKLQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwgTlVMTCwgZmFsc2UpOwotCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9IVF9PUEVSQVRJT04sIE5VTEwsIHRydWUpOwotCX0KLQotCS8qIHVwZGF0ZSBhc3NvY2lhdGVkIHN0YXRpb25zIGNhcC4gKi8KLQlhc3NvY2lhdGVkX2NsaWVudHNfdXBkYXRlMjNhKHBhZGFwdGVyLCAgYmVhY29uX3VwZGF0ZWQpOwotCi0JREJHXzg3MjNBKCIlcywgdXBkYXRlZCA9JWRcbiIsIF9fZnVuY19fLCBiZWFjb25fdXBkYXRlZCk7Ci19Ci0KLXU4IGJzc19jYXBfdXBkYXRlX29uX3N0YV9sZWF2ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JdTggYmVhY29uX3VwZGF0ZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlpZiAoIXBzdGEpCi0JCXJldHVybiBiZWFjb25fdXBkYXRlZDsKLQotCWlmIChwc3RhLT5ub19zaG9ydF9wcmVhbWJsZV9zZXQpIHsKLQkJcHN0YS0+bm9fc2hvcnRfcHJlYW1ibGVfc2V0ID0gMDsKLQkJcG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3ByZWFtYmxlLS07Ci0JCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPiBXSVJFTEVTU18xMUIKLQkJICAgICYmIHBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9wcmVhbWJsZSA9PSAwKSB7Ci0JCQliZWFjb25fdXBkYXRlZCA9IHRydWU7Ci0JCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCAweEZGLCBOVUxMLCB0cnVlKTsKLQkJfQotCX0KLQotCWlmIChwc3RhLT5ub25lcnBfc2V0KSB7Ci0JCXBzdGEtPm5vbmVycF9zZXQgPSAwOwotCQlwbWxtZXByaXYtPm51bV9zdGFfbm9uX2VycC0tOwotCQlpZiAocG1sbWVwcml2LT5udW1fc3RhX25vbl9lcnAgPT0gMCkgewotCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfRVJQX0lORk8sCi0JCQkJCSBOVUxMLCB0cnVlKTsKLQkJfQotCX0KLQotCWlmIChwc3RhLT5ub19zaG9ydF9zbG90X3RpbWVfc2V0KSB7Ci0JCXBzdGEtPm5vX3Nob3J0X3Nsb3RfdGltZV9zZXQgPSAwOwotCQlwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfc2xvdF90aW1lLS07Ci0JCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPiBXSVJFTEVTU18xMUIKLQkJICAgICYmIHBtbG1lcHJpdi0+bnVtX3N0YV9ub19zaG9ydF9zbG90X3RpbWUgPT0gMCkgewotCQkJYmVhY29uX3VwZGF0ZWQgPSB0cnVlOwotCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgMHhGRiwgTlVMTCwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlpZiAocHN0YS0+bm9faHRfZ2Zfc2V0KSB7Ci0JCXBzdGEtPm5vX2h0X2dmX3NldCA9IDA7Ci0JCXBtbG1lcHJpdi0+bnVtX3N0YV9odF9ub19nZi0tOwotCX0KLQotCWlmIChwc3RhLT5ub19odF9zZXQpIHsKLQkJcHN0YS0+bm9faHRfc2V0ID0gMDsKLQkJcG1sbWVwcml2LT5udW1fc3RhX25vX2h0LS07Ci0JfQotCi0JaWYgKHBzdGEtPmh0XzIwbWh6X3NldCkgewotCQlwc3RhLT5odF8yMG1oel9zZXQgPSAwOwotCQlwbWxtZXByaXYtPm51bV9zdGFfaHRfMjBtaHotLTsKLQl9Ci0KLQlpZiAocnR3X2h0X29wZXJhdGlvbl91cGRhdGUocGFkYXB0ZXIpID4gMCkgewotCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9IVF9DQVBBQklMSVRZLCBOVUxMLCBmYWxzZSk7Ci0JCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX0hUX09QRVJBVElPTiwgTlVMTCwgdHJ1ZSk7Ci0JfQotCi0JLyogdXBkYXRlIGFzc29jaWF0ZWQgc3RhdGlvbnMgY2FwLiAqLwotCi0JREJHXzg3MjNBKCIlcywgdXBkYXRlZCA9JWRcbiIsIF9fZnVuY19fLCBiZWFjb25fdXBkYXRlZCk7Ci0KLQlyZXR1cm4gYmVhY29uX3VwZGF0ZWQ7Ci19Ci0KLXU4IGFwX2ZyZWVfc3RhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgYm9vbCBhY3RpdmUsIHUxNiByZWFzb24pCi17Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQl1OCBiZWFjb25fdXBkYXRlZCA9IGZhbHNlOwotCi0JaWYgKCFwc3RhKQotCQlyZXR1cm4gYmVhY29uX3VwZGF0ZWQ7Ci0KLQlpZiAoYWN0aXZlKSB7Ci0JCS8qIHRlYXIgZG93biBSeCBBTVBEVSAqLwotCQlzZW5kX2RlbGJhMjNhKHBhZGFwdGVyLCAwLCBwc3RhLT5od2FkZHIpOyAvKiByZWNpcGllbnQgKi8KLQotCQkvKiB0ZWFyIGRvd24gVFggQU1QRFUgKi8KLQkJc2VuZF9kZWxiYTIzYShwYWRhcHRlciwgMSwgcHN0YS0+aHdhZGRyKTsgLyogb3JpZ2luYXRvciAqLwotCi0JCWlzc3VlX2RlYXV0aDIzYShwYWRhcHRlciwgcHN0YS0+aHdhZGRyLCByZWFzb24pOwotCX0KLQotCXBzdGEtPmh0cHJpdi5hZ2dfZW5hYmxlX2JpdG1hcCA9IDB4MDsJIC8qIHJlc2V0ICovCi0JcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwID0gMHgwOyAvKiByZXNldCAqLwotCi0JLyogcmVwb3J0X2RlbF9zdGFfZXZlbnQyM2EocGFkYXB0ZXIsIHBzdGEtPmh3YWRkciwgcmVhc29uKTsgKi8KLQotCS8qIGNsZWFyIGNhbSBlbnRyeSAvIGtleSAqLwotCS8qIGNsZWFyX2NhbV9lbnRyeTIzYShwYWRhcHRlciwgKHBzdGEtPm1hY19pZCArIDMpKTsgKi8KLQlydHdfY2xlYXJzdGFrZXlfY21kMjNhKHBhZGFwdGVyLCAodTggKilwc3RhLCAodTgpKHBzdGEtPm1hY19pZCArIDMpLAotCQkJICAgICAgIHRydWUpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhLT5sb2NrKTsKLQlwc3RhLT5zdGF0ZSAmPSB+X0ZXX0xJTktFRDsKLQlzcGluX3VubG9ja19iaCgmcHN0YS0+bG9jayk7Ci0KLQlydHdfY2ZnODAyMTFfaW5kaWNhdGVfc3RhX2Rpc2Fzc29jKHBhZGFwdGVyLCBwc3RhLT5od2FkZHIsIHJlYXNvbik7Ci0KLQlyZXBvcnRfZGVsX3N0YV9ldmVudDIzYShwYWRhcHRlciwgcHN0YS0+aHdhZGRyLCByZWFzb24pOwotCi0JYmVhY29uX3VwZGF0ZWQgPSBic3NfY2FwX3VwZGF0ZV9vbl9zdGFfbGVhdmUyM2EocGFkYXB0ZXIsIHBzdGEpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcnR3X2ZyZWVfc3RhaW5mbzIzYShwYWRhcHRlciwgcHN0YSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQotCXJldHVybiBiZWFjb25fdXBkYXRlZDsKLX0KLQotaW50IHJ0d19zdGFfZmx1c2gyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsICpwdG1wOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQl1OCBiY19hZGRyW0VUSF9BTEVOXSA9IHsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmfTsKLQl1OCBjaGtfYWxpdmVfbnVtID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKmNoa19hbGl2ZV9saXN0W05VTV9TVEFdOwotCWludCBpOwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgIT0gTVNSX0FQKQotCQlyZXR1cm4gMDsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQlwaGVhZCA9ICZwc3RhcHJpdi0+YXNvY19saXN0OwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwc3RhLCBwdG1wLCBwaGVhZCwgYXNvY19saXN0KSB7Ci0JCS8qIFJlbW92ZSBzdGEgZnJvbSBhc29jX2xpc3QgKi8KLQkJbGlzdF9kZWxfaW5pdCgmcHN0YS0+YXNvY19saXN0KTsKLQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKLQotCQkvKiBLZWVwIHN0YSBmb3IgYXBfZnJlZV9zdGEyM2EoKSBiZXlvbmQgdGhpcyBhc29jX2xpc3QgbG9vcCAqLwotCQljaGtfYWxpdmVfbGlzdFtjaGtfYWxpdmVfbnVtKytdID0gcHN0YTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0KLQkvKiBGb3IgZWFjaCBzdGEgaW4gY2hrX2FsaXZlX2xpc3QsIGNhbGwgYXBfZnJlZV9zdGEyM2EgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY2hrX2FsaXZlX251bTsgaSsrKQotCQlhcF9mcmVlX3N0YTIzYShwYWRhcHRlciwgY2hrX2FsaXZlX2xpc3RbaV0sIHRydWUsCi0JCQkgICAgICAgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwotCi0JaXNzdWVfZGVhdXRoMjNhKHBhZGFwdGVyLCBiY19hZGRyLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7Ci0KLQlhc3NvY2lhdGVkX2NsaWVudHNfdXBkYXRlMjNhKHBhZGFwdGVyLCB0cnVlKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBjYWxsZWQgPiBUU1IgTEVWRUwgZm9yIFVTQiBvciBTRElPIEludGVyZmFjZSAqLwotdm9pZCBzdGFfaW5mb191cGRhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCWludCBmbGFncyA9IHBzdGEtPmZsYWdzOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQkvKiB1cGRhdGUgd21tIGNhcC4gKi8KLQlpZiAoV0xBTl9TVEFfV01FJmZsYWdzKQotCQlwc3RhLT5xb3Nfb3B0aW9uID0gMTsKLQllbHNlCi0JCXBzdGEtPnFvc19vcHRpb24gPSAwOwotCi0JaWYgKHBtbG1lcHJpdi0+cW9zX29wdGlvbiA9PSAwKQotCQlwc3RhLT5xb3Nfb3B0aW9uID0gMDsKLQotCS8qIHVwZGF0ZSA4MDIuMTFuIGh0IGNhcC4gKi8KLQlpZiAoV0xBTl9TVEFfSFQmZmxhZ3MpIHsKLQkJcHN0YS0+aHRwcml2Lmh0X29wdGlvbiA9IHRydWU7Ci0JCXBzdGEtPnFvc19vcHRpb24gPSAxOwotCX0gZWxzZSB7Ci0JCXBzdGEtPmh0cHJpdi5odF9vcHRpb24gPSBmYWxzZTsKLQl9Ci0KLQlpZiAoIXBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbikKLQkJcHN0YS0+aHRwcml2Lmh0X29wdGlvbiA9IGZhbHNlOwotCi0JdXBkYXRlX3N0YV9pbmZvMjNhX2FwbW9kZTIzYShwYWRhcHRlciwgcHN0YSk7Ci19Ci0KLS8qIGNhbGxlZCA+PSBUU1IgTEVWRUwgZm9yIFVTQiBvciBTRElPIEludGVyZmFjZSAqLwotdm9pZCBhcF9zdGFfaW5mb19kZWZlcl91cGRhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCWlmIChwc3RhLT5zdGF0ZSAmIF9GV19MSU5LRUQpIHsKLQkJLyogYWRkIHJhdGlkICovCi0JCWFkZF9SQVRpZDIzYShwYWRhcHRlciwgcHN0YSwgMCk7LyogRE1fUkFUUl9TVEFfSU5JVCAqLwotCX0KLX0KLQotLyogcmVzdG9yZSBodyBzZXR0aW5nIGZyb20gc3cgZGF0YSBzdHJ1Y3R1cmVzICovCi12b2lkIHJ0d19hcF9yZXN0b3JlX25ldHdvcmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICptbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgKnB0bXA7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQl1OCBjaGtfYWxpdmVfbnVtID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKmNoa19hbGl2ZV9saXN0W05VTV9TVEFdOwotCWludCBpOwotCi0JcnR3X3NldG9wbW9kZV9jbWQyM2EocGFkYXB0ZXIsIE5MODAyMTFfSUZUWVBFX0FQKTsKLQotCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLCBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOwotCi0Jc3RhcnRfYnNzX25ldHdvcmsocGFkYXB0ZXIsICh1OCAqKSZtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yayk7Ci0KLQlpZiAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID09Ci0JICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVAgfHwKLQkgICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID09Ci0JICAgIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApIHsKLQkJLyogcmVzdG9yZSBncm91cCBrZXksIFdFUCBrZXlzIGlzIHJlc3RvcmVkIGluIGlwc19sZWF2ZTIzYSgpICovCi0JCXJ0d19zZXRfa2V5MjNhKHBhZGFwdGVyLCBwc2VjdXJpdHlwcml2LAotCQkJICAgICAgIHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZCwgMCk7Ci0JfQotCi0JLyogcGVyIHN0YSBwYWlyd2lzZSBrZXkgYW5kIHNldHRpbmdzICovCi0JaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSAhPQotCSAgICBXTEFOX0NJUEhFUl9TVUlURV9US0lQICYmCi0JICAgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSAhPQotCSAgICBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHN0YSwgcHRtcCwgcGhlYWQsIGFzb2NfbGlzdCkKLQkJY2hrX2FsaXZlX2xpc3RbY2hrX2FsaXZlX251bSsrXSA9IHBzdGE7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2hrX2FsaXZlX251bTsgaSsrKSB7Ci0JCXBzdGEgPSBjaGtfYWxpdmVfbGlzdFtpXTsKLQotCQlpZiAocHN0YS0+c3RhdGUgJiBfRldfTElOS0VEKSB7Ci0JCQlVcGRhdGVfUkFfRW50cnkyM2EocGFkYXB0ZXIsIHBzdGEpOwotCQkJLyogcGFpcndpc2Uga2V5ICovCi0JCQlydHdfc2V0c3Rha2V5X2NtZDIzYShwYWRhcHRlciwgKHVuc2lnbmVkIGNoYXIgKilwc3RhLCB0cnVlKTsKLQkJfQotCX0KLX0KLQotdm9pZCBzdGFydF9hcF9tb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IHdsYW5fYWNsX3Bvb2wgKnBhY2xfbGlzdCA9ICZwc3RhcHJpdi0+YWNsX2xpc3Q7Ci0KLQlwbWxtZXByaXYtPnVwZGF0ZV9iY24gPSBmYWxzZTsKLQotCS8qIGluaXRfbWxtZV9hcF9pbmZvMjNhKHBhZGFwdGVyKTsgKi8KLQlwbWxtZWV4dC0+YnN0YXJ0X2JzcyA9IGZhbHNlOwotCi0JcG1sbWVwcml2LT5udW1fc3RhX25vbl9lcnAgPSAwOwotCi0JcG1sbWVwcml2LT5udW1fc3RhX25vX3Nob3J0X3Nsb3RfdGltZSA9IDA7Ci0KLQlwbWxtZXByaXYtPm51bV9zdGFfbm9fc2hvcnRfcHJlYW1ibGUgPSAwOwotCi0JcG1sbWVwcml2LT5udW1fc3RhX2h0X25vX2dmID0gMDsKLQlwbWxtZXByaXYtPm51bV9zdGFfbm9faHQgPSAwOwotCXBtbG1lcHJpdi0+bnVtX3N0YV9odF8yMG1oeiA9IDA7Ci0KLQlwbWxtZXByaXYtPm9sYmMgPSBmYWxzZTsKLQotCXBtbG1lcHJpdi0+b2xiY19odCA9IGZhbHNlOwotCi0JcG1sbWVwcml2LT5odF9vcF9tb2RlID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fU1RBOyBpKyspCi0JCXBzdGFwcml2LT5zdGFfYWlkW2ldID0gTlVMTDsKLQotCS8qIGZvciBBQ0wgKi8KLQlJTklUX0xJU1RfSEVBRCgmcGFjbF9saXN0LT5hY2xfbm9kZV9xLnF1ZXVlKTsKLQlwYWNsX2xpc3QtPm51bSA9IDA7Ci0JcGFjbF9saXN0LT5tb2RlID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0FDTDsgaSsrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZwYWNsX2xpc3QtPmFjbG5vZGVbaV0ubGlzdCk7Ci0JCXBhY2xfbGlzdC0+YWNsbm9kZVtpXS52YWxpZCA9IGZhbHNlOwotCX0KLX0KLQotdm9pZCBzdG9wX2FwX21vZGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUgKnBhY2xub2RlLCAqcHRtcDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCB3bGFuX2FjbF9wb29sICpwYWNsX2xpc3QgPSAmcHN0YXByaXYtPmFjbF9saXN0OwotCXN0cnVjdCBydHdfcXVldWUgKnBhY2xfbm9kZV9xID0gJnBhY2xfbGlzdC0+YWNsX25vZGVfcTsKLQotCXBtbG1lcHJpdi0+dXBkYXRlX2JjbiA9IGZhbHNlOwotCXBtbG1lZXh0LT5ic3RhcnRfYnNzID0gZmFsc2U7Ci0KLQkvKgotCSAqIHJlc2V0IGFuZCBpbml0IHNlY3VyaXR5IHByaXYgLCB0aGlzIGNhbgotCSAqIHJlZmluZSB3aXRoIHJ0d19yZXNldF9zZWN1cml0eXByaXYyM2EKLQkgKi8KLQltZW1zZXQoKHVuc2lnbmVkIGNoYXIgKikmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdiwgMCwgc2l6ZW9mKHN0cnVjdCBzZWN1cml0eV9wcml2KSk7Ci0JcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzYXV0aHR5cGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0KLQkvKiBmb3IgQUNMICovCi0Jc3Bpbl9sb2NrX2JoKCZwYWNsX25vZGVfcS0+bG9jayk7Ci0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBhY2xfbm9kZV9xKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFjbG5vZGUsIHB0bXAsIHBoZWFkLCBsaXN0KSB7Ci0JCWlmIChwYWNsbm9kZS0+dmFsaWQgPT0gdHJ1ZSkgewotCQkJcGFjbG5vZGUtPnZhbGlkID0gZmFsc2U7Ci0JCQlsaXN0X2RlbF9pbml0KCZwYWNsbm9kZS0+bGlzdCk7Ci0JCQlwYWNsX2xpc3QtPm51bS0tOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwYWNsX25vZGVfcS0+bG9jayk7Ci0KLQlEQkdfODcyM0EoIiVzLCBmcmVlIGFjbF9ub2RlX3F1ZXVlLCBudW0gPSVkXG4iLAotCQkgIF9fZnVuY19fLCBwYWNsX2xpc3QtPm51bSk7Ci0KLQlydHdfc3RhX2ZsdXNoMjNhKHBhZGFwdGVyKTsKLQotCS8qIGZyZWVfYXNzb2Nfc3RhX3Jlc291cmNlcyAqLwotCXJ0d19mcmVlX2FsbF9zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQotCXBzdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcnR3X2ZyZWVfc3RhaW5mbzIzYShwYWRhcHRlciwgcHN0YSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQotCXJ0d19pbml0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0KLQlydHcyM2FfZnJlZV9tbG1lX3ByaXZfaWVfZGF0YShwbWxtZXByaXYpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfY21kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNGUwZjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19jbWQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVFdfQ01EX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9jbWQuaD4KLSNpbmNsdWRlIDxydHdfc3Jlc2V0Lmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgY21kX2hkbCB3bGFuY21kc1tdID0gewotCUdFTl9EUlZfQ01EX0hBTkRMRVIoMCwgTlVMTCkgLyowKi8KLQlHRU5fRFJWX0NNRF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX0RSVl9DTURfSEFORExFUigwLCBOVUxMKQotCUdFTl9EUlZfQ01EX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fRFJWX0NNRF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX0RSVl9DTURfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkgLyoxMCovCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSwgam9pbl9jbWRfaGRsMjNhKSAvKjE0Ki8KLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IGRpc2Nvbm5lY3RfcGFybSksIGRpc2Nvbm5lY3RfaGRsMjNhKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCksIGNyZWF0ZWJzc19oZGwyM2EpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRvcG1vZGVfcGFybSksIHNldG9wbW9kZV9oZGwyM2EpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzaXRlc3VydmV5X3Bhcm0pLCBzaXRlc3VydmV5X2NtZF9oZGwyM2EpIC8qMTgqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0YXV0aF9wYXJtKSwgc2V0YXV0aF9oZGwyM2EpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRrZXlfcGFybSksIHNldGtleV9oZGwyM2EpIC8qMjAqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9wYXJtKSwgc2V0X3N0YWtleV9oZGwyM2EpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRfYXNzb2NzdGFfcGFybSksIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBkZWxfYXNzb2NzdGFfcGFybSksIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRzdGFwd3JzdGF0ZV9wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldGJhc2ljcmF0ZV9wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IGdldGJhc2ljcmF0ZV9wYXJtKSwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IHNldGRhdGFyYXRlX3Bhcm0pLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgZ2V0ZGF0YXJhdGVfcGFybSksIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBzZXRwaHlpbmZvX3Bhcm0pLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgZ2V0cGh5aW5mb19wYXJtKSwgTlVMTCkgIC8qMzAqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0cGh5X3Bhcm0pLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgZ2V0cGh5X3Bhcm0pLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkJLyo0MCovCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUihzaXplb2Yoc3RydWN0IGFkZEJhUmVxX3Bhcm0pLCBhZGRfYmFfaGRsMjNhKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3Qgc2V0X2NoX3Bhcm0pLCBzZXRfY2hfaGRsMjNhKSAvKiA0NiAqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpIC8qNTAqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgTlVMTCkKLQlHRU5fTUxNRV9FWFRfSEFORExFUigwLCBOVUxMKQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIE5VTEwpCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBUeF9CZWFjb25fcGFyYW0pLCB0eF9iZWFjb25faGRsMjNhKSAvKjU1Ki8KLQotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKDAsIG1sbWVfZXZ0X2hkbDIzYSkgLyo1NiovCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgcnR3X2RydmV4dHJhX2NtZF9oZGwyM2EpIC8qNTcqLwotCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoMCwgaDJjX21zZ19oZGwyM2EpIC8qNTgqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgU2V0Q2hhbm5lbFBsYW5fcGFyYW0pLCBzZXRfY2hwbGFuX2hkbDIzYSkgLyo1OSovCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBMZWRCbGlua19wYXJhbSksIGxlZF9ibGlua19oZGwyM2EpIC8qNjAqLwotCi0JR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZW9mKHN0cnVjdCBTZXRDaGFubmVsU3dpdGNoX3BhcmFtKSwgc2V0X2NzYV9oZGwyM2EpIC8qNjEqLwotCUdFTl9NTE1FX0VYVF9IQU5ETEVSKHNpemVvZihzdHJ1Y3QgVERMU29wdGlvbl9wYXJhbSksIHRkbHNfaGRsMjNhKSAvKjYyKi8KLX07Ci0KLXN0cnVjdCBfY21kX2NhbGxiYWNrCXJ0d19jbWRfY2FsbGJhY2tbXSA9IHsKLQl7R0VOX0NNRF9DT0RFKF9SZWFkX01BQ1JFRyksIE5VTEx9LCAvKjAqLwotCXtHRU5fQ01EX0NPREUoX1dyaXRlX01BQ1JFRyksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1JlYWRfQkJSRUcpLCAmcnR3X2dldGJicmZyZWdfY21kcnNwX2NhbGxiYWNrMjNhfSwKLQl7R0VOX0NNRF9DT0RFKF9Xcml0ZV9CQlJFRyksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1JlYWRfUkZSRUcpLCAmcnR3X2dldGJicmZyZWdfY21kcnNwX2NhbGxiYWNrMjNhfSwKLQl7R0VOX0NNRF9DT0RFKF9Xcml0ZV9SRlJFRyksIE5VTEx9LCAvKjUqLwotCXtHRU5fQ01EX0NPREUoX1JlYWRfRUVQUk9NKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfV3JpdGVfRUVQUk9NKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfUmVhZF9FRlVTRSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1dyaXRlX0VGVVNFKSwgTlVMTH0sCi0KLQl7R0VOX0NNRF9DT0RFKF9SZWFkX0NBTSksCU5VTEx9LAkvKjEwKi8KLQl7R0VOX0NNRF9DT0RFKF9Xcml0ZV9DQU0pLAkgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfc2V0QkNOSVRWKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfc2V0TUJJRENGRyksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX0pvaW5Cc3MpLCAmcnR3X2pvaW5ic3NfY21kMjNhX2NhbGxiYWNrfSwgIC8qMTQqLwotCXtHRU5fQ01EX0NPREUoX0Rpc0Nvbm5lY3QpLCAmcnR3X2Rpc2Fzc29jX2NtZDIzYV9jYWxsYmFja30sIC8qMTUqLwotCXtHRU5fQ01EX0NPREUoX0NyZWF0ZUJzcyksICZydHdfY3JlYXRlYnNzX2NtZDIzYV9jYWxsYmFja30sCi0Je0dFTl9DTURfQ09ERShfU2V0T3BNb2RlKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2l0ZVN1cnZleSksICZydHdfc3VydmV5X2NtZF9jYWxsYmFjazIzYX0sIC8qMTgqLwotCXtHRU5fQ01EX0NPREUoX1NldEF1dGgpLCBOVUxMfSwKLQotCXtHRU5fQ01EX0NPREUoX1NldEtleSksIE5VTEx9LAkvKjIwKi8KLQl7R0VOX0NNRF9DT0RFKF9TZXRTdGFLZXkpLCAmcnR3X3NldHN0YUtleV9jbWRyc3BfY2FsbGJhY2syM2F9LAotCXtHRU5fQ01EX0NPREUoX1NldEFzc29jU3RhKSwgJnJ0d19zZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhY2syM2F9LAotCXtHRU5fQ01EX0NPREUoX0RlbEFzc29jU3RhKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0U3RhUHdyU3RhdGUpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRCYXNpY1JhdGUpLCBOVUxMfSwgLyoyNSovCi0Je0dFTl9DTURfQ09ERShfR2V0QmFzaWNSYXRlKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0RGF0YVJhdGUpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9HZXREYXRhUmF0ZSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldFBoeUluZm8pLCBOVUxMfSwKLQotCXtHRU5fQ01EX0NPREUoX0dldFBoeUluZm8pLCBOVUxMfSwgLyozMCovCi0Je0dFTl9DTURfQ09ERShfU2V0UGh5KSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfR2V0UGh5KSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfcmVhZFJzc2kpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9yZWFkR2FpbiksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1NldEF0aW0pLCBOVUxMfSwgLyozNSovCi0Je0dFTl9DTURfQ09ERShfU2V0UHdyTW9kZSksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX0pvaW5ic3NScHQpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRSYVRhYmxlKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfR2V0UmFUYWJsZSksIE5VTEx9LAotCi0Je0dFTl9DTURfQ09ERShfR2V0Q0NYUmVwb3J0KSwgTlVMTH0sIC8qNDAqLwotCXtHRU5fQ01EX0NPREUoX0dldERUTVJlcG9ydCksCU5VTEx9LAotCXtHRU5fQ01EX0NPREUoX0dldFRYUmF0ZVN0YXRpc3RpY3MpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRVc2JTdXNwZW5kKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0SDJjTGJrKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfQWRkQkFSZXEpLCBOVUxMfSwgLyo0NSovCi0Je0dFTl9DTURfQ09ERShfU2V0Q2hhbm5lbCksIE5VTEx9LAkJLyo0NiovCi0Je0dFTl9DTURfQ09ERShfU2V0VHhQb3dlciksIE5VTEx9LAotCXtHRU5fQ01EX0NPREUoX1N3aXRjaEFudGVubmEpLCBOVUxMfSwKLQl7R0VOX0NNRF9DT0RFKF9TZXRDcnlzdGFsQ2FwKSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0U2luZ2xlQ2FycmllclR4KSwgTlVMTH0sCS8qNTAqLwotCi0Je0dFTl9DTURfQ09ERShfU2V0U2luZ2xlVG9uZVR4KSwgTlVMTH0sIC8qNTEqLwotCXtHRU5fQ01EX0NPREUoX1NldENhcnJpZXJTdXBwcmVzc2lvblR4KSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU2V0Q29udGludW91c1R4KSwgTlVMTH0sCi0Je0dFTl9DTURfQ09ERShfU3dpdGNoQmFuZHdpZHRoKSwgTlVMTH0sCQkvKjU0Ki8KLQl7R0VOX0NNRF9DT0RFKF9UWF9CZWFjb24pLCBOVUxMfSwvKjU1Ki8KLQotCXtHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCksIE5VTEx9LC8qNTYqLwotCXtHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpLCBOVUxMfSwvKjU3Ki8KLQl7R0VOX0NNRF9DT0RFKF9TZXRfSDJDX01TRyksIE5VTEx9LC8qNTgqLwotCXtHRU5fQ01EX0NPREUoX1NldENoYW5uZWxQbGFuKSwgTlVMTH0sLyo1OSovCi0Je0dFTl9DTURfQ09ERShfTGVkQmxpbmspLCBOVUxMfSwvKjYwKi8KLQotCXtHRU5fQ01EX0NPREUoX1NldENoYW5uZWxTd2l0Y2gpLCBOVUxMfSwvKjYxKi8KLQl7R0VOX0NNRF9DT0RFKF9URExTKSwgTlVMTH0sLyo2MiovCi19OwotCi0vKgotQ2FsbGVyIGFuZCB0aGUgcnR3X2NtZF90aHJlYWQyM2EgY2FuIHByb3RlY3QgY21kX3EgYnkgc3Bpbl9sb2NrLgotTm8gaXJxc2F2ZSBpcyBuZWNlc3NhcnkuCi0qLwotCi1pbnQgcnR3X2luaXRfY21kX3ByaXYyM2Eoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdikKLXsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlwY21kcHJpdi0+Y21kX2lzc3VlZF9jbnQgPSAwOwotCXBjbWRwcml2LT5jbWRfZG9uZV9jbnQgPSAwOwotCXBjbWRwcml2LT5yc3BfY250ID0gMDsKLQotCXBjbWRwcml2LT53cSA9IGFsbG9jX3dvcmtxdWV1ZSgicnRsODcyM2F1X2NtZCIsIDAsIDEpOwotCWlmICghcGNtZHByaXYtPndxKQotCQlyZXMgPSBfRkFJTDsKLQotCXJldHVybiByZXM7Ci19Ci0KLS8qIGZvcndhcmQgZGVmaW5pdGlvbiAqLwotCi1zdGF0aWMgdm9pZCBydHdfaXJxX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQotdTMyIHJ0d19pbml0X2V2dF9wcml2MjNhKHN0cnVjdCBldnRfcHJpdiAqcGV2dHByaXYpCi17Ci0JcGV2dHByaXYtPndxID0gYWxsb2Nfd29ya3F1ZXVlKCJydGw4NzIzYXVfZXZ0IiwgMCwgMSk7Ci0KLQlJTklUX1dPUksoJnBldnRwcml2LT5pcnFfd2ssIHJ0d19pcnFfd29yayk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgcnR3X2ZyZWVfZXZ0X3ByaXYyM2Eoc3RydWN0IGV2dF9wcml2ICpwZXZ0cHJpdikKLXsKLQljYW5jZWxfd29ya19zeW5jKCZwZXZ0cHJpdi0+aXJxX3drKTsKLX0KLQotc3RhdGljIGludCBydHdfY21kX2ZpbHRlcihzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2LCBzdHJ1Y3QgY21kX29iaiAqY21kX29iaikKLXsKLQkvKiBzZXQgdG8gdHJ1ZSB0byBhbGxvdyBlbnF1ZXVpbmcgY21kIHdoZW4gaHdfaW5pdF9jb21wbGV0ZWQgaXMgZmFsc2UgKi8KLQl1OCBiQWxsb3cgPSBmYWxzZTsKLQotCWlmIChjbWRfb2JqLT5jbWRjb2RlID09IEdFTl9DTURfQ09ERShfU2V0Q2hhbm5lbFBsYW4pKQotCQliQWxsb3cgPSB0cnVlOwotCi0JaWYgKHBjbWRwcml2LT5wYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UgJiYgYkFsbG93ID09IGZhbHNlKQotCQlyZXR1cm4gX0ZBSUw7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBydHdfY21kX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQotaW50IHJ0d19lbnF1ZXVlX2NtZDIzYShzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2LCBzdHJ1Y3QgY21kX29iaiAqY21kX29iaikKLXsKLQlpbnQgcmVzID0gX0ZBSUw7Ci0KLQlpZiAoIWNtZF9vYmopCi0JCWdvdG8gZXhpdDsKLQotCWNtZF9vYmotPnBhZGFwdGVyID0gcGNtZHByaXYtPnBhZGFwdGVyOwotCi0JcmVzID0gcnR3X2NtZF9maWx0ZXIocGNtZHByaXYsIGNtZF9vYmopOwotCWlmIChyZXMgPT0gX0ZBSUwpIHsKLQkJcnR3X2ZyZWVfY21kX29iajIzYShjbWRfb2JqKTsKLQkJZ290byBleGl0OwotCX0KLQotCUlOSVRfV09SSygmY21kX29iai0+d29yaywgcnR3X2NtZF93b3JrKTsKLQotCXJlcyA9IHF1ZXVlX3dvcmsocGNtZHByaXYtPndxLCAmY21kX29iai0+d29yayk7Ci0KLQlpZiAoIXJlcykgewotCQluZXRkZXZfZXJyKHBjbWRwcml2LT5wYWRhcHRlci0+cG5ldGRldiwKLQkJCSAgICIlczogQ2FsbCB0byBxdWV1ZV93b3JrKCkgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlcyA9IF9GQUlMOwotCX0gZWxzZQotCQlyZXMgPSBfU1VDQ0VTUzsKLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi12b2lkIHJ0d19mcmVlX2NtZF9vYmoyM2Eoc3RydWN0IGNtZF9vYmogKnBjbWQpCi17Ci0KLQlpZiAocGNtZC0+Y21kY29kZSAhPSBfSm9pbkJzc19DTURfICYmCi0JICAgIHBjbWQtPmNtZGNvZGUgIT0gX0NyZWF0ZUJzc19DTURfKSB7Ci0JCS8qIGZyZWUgcGFybWJ1ZiBpbiBjbWRfb2JqICovCi0JCWtmcmVlKHBjbWQtPnBhcm1idWYpOwotCX0KLQotCWlmIChwY21kLT5yc3ApIHsKLQkJaWYgKHBjbWQtPnJzcHN6ICE9IDApIHsKLQkJCS8qIGZyZWUgcnNwIGluIGNtZF9vYmogKi8KLQkJCWtmcmVlKHBjbWQtPnJzcCk7Ci0JCX0KLQl9Ci0KLQlrZnJlZShwY21kKTsKLX0KLQotc3RhdGljIHZvaWQgcnR3X2NtZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlpbnQgKCpjbWRfaGRsKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci0Jdm9pZCAoKnBjbWRfY2FsbGJhY2spKHN0cnVjdCBydHdfYWRhcHRlciAqZGV2LCBzdHJ1Y3QgY21kX29iaiAqcGNtZCk7Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdjsKLQlzdHJ1Y3QgY21kX29iaiAqcGNtZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY21kX29iaiwgd29yayk7Ci0KLQlwY21kcHJpdiA9ICZwY21kLT5wYWRhcHRlci0+Y21kcHJpdjsKLQotCWlmIChydHdfY21kX2ZpbHRlcihwY21kcHJpdiwgcGNtZCkgPT0gX0ZBSUwpIHsKLQkJcGNtZC0+cmVzID0gSDJDX0RST1BQRUQ7Ci0JCWdvdG8gcG9zdF9wcm9jZXNzOwotCX0KLQotCXBjbWRwcml2LT5jbWRfaXNzdWVkX2NudCsrOwotCi0JcGNtZC0+Y21kc3ogPSBBTElHTihwY21kLT5jbWRzeiwgNCk7Ci0KLQlpZiAocGNtZC0+Y21kY29kZSA8IChzaXplb2Yod2xhbmNtZHMpL3NpemVvZihzdHJ1Y3QgY21kX2hkbCkpKSB7Ci0JCWNtZF9oZGwgPSB3bGFuY21kc1twY21kLT5jbWRjb2RlXS5oMmNmdW5zOwotCi0JCWlmIChjbWRfaGRsKQotCQkJcGNtZC0+cmVzID0gY21kX2hkbChwY21kLT5wYWRhcHRlciwgcGNtZC0+cGFybWJ1Zik7Ci0JCWVsc2UKLQkJCXBjbWQtPnJlcyA9IEgyQ19EUk9QUEVEOwotCX0gZWxzZQotCQlwY21kLT5yZXMgPSBIMkNfUEFSQU1FVEVSU19FUlJPUjsKLQotcG9zdF9wcm9jZXNzOgotCS8qIGNhbGwgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHBvc3QtcHJvY2Vzc2VkICovCi0JaWYgKHBjbWQtPmNtZGNvZGUgPCBBUlJBWV9TSVpFKHJ0d19jbWRfY2FsbGJhY2spKSB7Ci0JCXBjbWRfY2FsbGJhY2sgPQlydHdfY21kX2NhbGxiYWNrW3BjbWQtPmNtZGNvZGVdLmNhbGxiYWNrOwotCQlpZiAoIXBjbWRfY2FsbGJhY2spIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sCi0JCQkJICJtbG1lX2NtZF9oZGwoKTogcGNtZF9jYWxsYmFjayA9IDB4JXAsIGNtZGNvZGUgPSAweCV4XG4iLAotCQkJCSBwY21kX2NhbGxiYWNrLCBwY21kLT5jbWRjb2RlKTsKLQkJCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBuZWVkIGNvbnNpZGVyIHRoYXQgZnJlZSBjbWRfb2JqIGluCi0JCQkgICBydHdfY21kX2NhbGxiYWNrICovCi0JCQlwY21kX2NhbGxiYWNrKHBjbWQtPnBhZGFwdGVyLCBwY21kKTsKLQkJfQotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IGNtZGNvZGUgPSAweCV4IGNhbGxiYWNrIG5vdCBkZWZpbmVkIVxuIiwKLQkJCSBfX2Z1bmNfXywgcGNtZC0+Y21kY29kZSk7Ci0JCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci0JfQotfQotCi0KLWludCBydHdfc2l0ZXN1cnZleV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgc3RydWN0IGNmZzgwMjExX3NzaWQgKnNzaWQsIGludCBzc2lkX251bSwKLQkJCSAgc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCAqY2gsIGludCBjaF9udW0pCi17Ci0JaW50IHJlcyA9IF9GQUlMOwotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBzaXRlc3VydmV5X3Bhcm0gKnBzdXJ2ZXlQYXJhOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpCi0JCXJ0d19scHNfY3RybF93a19jbWQyM2EocGFkYXB0ZXIsIExQU19DVFJMX1NDQU4sIDEpOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwaDJjKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlwc3VydmV5UGFyYSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaXRlc3VydmV5X3Bhcm0pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBzdXJ2ZXlQYXJhKSB7Ci0JCWtmcmVlKHBoMmMpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JcnR3X2ZyZWVfbmV0d29ya19xdWV1ZTIzYShwYWRhcHRlcik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOiBmbHVzaCBuZXR3b3JrIHF1ZXVlXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwc3VydmV5UGFyYSwKLQkJCQkgICBHRU5fQ01EX0NPREUoX1NpdGVTdXJ2ZXkpKTsKLQotCS8qIHBzdXJ2ZXlQYXJhLT5ic3NsaW1pdCA9IDQ4OyAqLwotCXBzdXJ2ZXlQYXJhLT5zY2FuX21vZGUgPSBwbWxtZXByaXYtPnNjYW5fbW9kZTsKLQotCS8qIHByZXBhcmUgc3NpZCBsaXN0ICovCi0JaWYgKHNzaWQpIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHNzaWRfbnVtICYmIGkgPCBSVFdfU1NJRF9TQ0FOX0FNT1VOVDsgaSsrKSB7Ci0JCQlpZiAoc3NpZFtpXS5zc2lkX2xlbikgewotCQkJCW1lbWNweSgmcHN1cnZleVBhcmEtPnNzaWRbaV0sICZzc2lkW2ldLAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGNmZzgwMjExX3NzaWQpKTsKLQkJCQlwc3VydmV5UGFyYS0+c3NpZF9udW0rKzsKLQkJCX0KLQkJfQotCX0KLQotCS8qIHByZXBhcmUgY2hhbm5lbCBsaXN0ICovCi0JaWYgKGNoKSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBjaF9udW0gJiYgaSA8IFJUV19DSEFOTkVMX1NDQU5fQU1PVU5UOyBpKyspIHsKLQkJCWlmIChjaFtpXS5od192YWx1ZSAmJgotCQkJICAgICEoY2hbaV0uZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkpIHsKLQkJCQltZW1jcHkoJnBzdXJ2ZXlQYXJhLT5jaFtpXSwgJmNoW2ldLAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCkpOwotCQkJCXBzdXJ2ZXlQYXJhLT5jaF9udW0rKzsKLQkJCX0KLQkJfQotCX0KLQotCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotCi0JaWYgKHJlcyA9PSBfU1VDQ0VTUykgewotCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwgamlmZmllcyArCi0JCQkgIG1zZWNzX3RvX2ppZmZpZXMoU0NBTk5JTkdfVElNRU9VVCkpOwotCi0JCXBtbG1lcHJpdi0+c2Nhbl9pbnRlcnZhbCA9IFNDQU5fSU5URVJWQUw7LyogIDMwKjIgc2VjID0gNjBzZWMgKi8KLQl9IGVsc2UKLQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBydHdfZ2V0YmJyZnJlZ19jbWRyc3BfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgICAgc3RydWN0IGNtZF9vYmogKnBjbWQpCi17Ci0Ja2ZyZWUocGNtZC0+cGFybWJ1Zik7Ci0Ja2ZyZWUocGNtZCk7Ci19Ci0KLWludCBydHdfY3JlYXRlYnNzX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcGNtZDsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBkZXZfbmV0d29yazsKLQl1OCByZXMgPSBfU1VDQ0VTUzsKLQotCXBkZXZfbmV0d29yayA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2LmRldl9uZXR3b3JrOwotCi0JaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbiA9PSAwKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sCi0JCQkgImNyZWF0ZWJzcyBmb3IgQW55IFNTaWQ6JXNcbiIsCi0JCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpOwotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sCi0JCQkgImNyZWF0ZWJzcyBmb3IgU1NpZDolc1xuIiwKLQkJCSBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCk7Ci0JfQotCi0JcGNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwY21kKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGNtZC0+Y21kY29kZSA9IF9DcmVhdGVCc3NfQ01EXzsKLQlwY21kLT5wYXJtYnVmID0gKHVuc2lnbmVkIGNoYXIgKilwZGV2X25ldHdvcms7Ci0JcGNtZC0+Y21kc3ogPSBnZXRfd2xhbl9ic3NpZF9leF9zeihwZGV2X25ldHdvcmspOwotCXBjbWQtPnJzcCA9IE5VTEw7Ci0JcGNtZC0+cnNwc3ogPSAwOwotCi0JcGRldl9uZXR3b3JrLT5MZW5ndGggPSBwY21kLT5jbWRzejsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGNtZCk7Ci0KLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcnR3X2pvaW5ic3NfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKLXsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKnBzZWNuZXR3b3JrOwotCXN0cnVjdCBjbWRfb2JqICpwY21kOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IGh0X3ByaXYgKnBodHByaXYgPSAmcG1sbWVwcml2LT5odHByaXY7Ci0JZW51bSBubDgwMjExX2lmdHlwZSBpZm1vZGU7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmbW9kZSA9IHBuZXR3b3JrLT5uZXR3b3JrLmlmbW9kZTsKLQotCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4gPT0gMCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLAotCQkJICIrSm9pbiBjbWQ6IEFueSBTU2lkXG4iKTsKLQl9IGVsc2UgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgIitKb2luIGNtZDogU1NpZCA9WyVzXVxuIiwKLQkJCSBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCk7Ci0JfQotCi0JcGNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwY21kKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJ0d19qb2luYnNzX2NtZDIzYTogbWVtb3J5IGFsbG9jYXRlIGZvciBjbWRfb2JqIGZhaWwhISFcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogZm9yIGhpZGRlbiBhcCB0byBzZXQgZndfc3RhdGUgaGVyZSAqLwotCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURXxXSUZJX0FESE9DX1NUQVRFKSkgewotCQlzd2l0Y2ggKGlmbW9kZSkgewotCQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKTsKLQkJCWJyZWFrOwotCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6Ci0JCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwc2VjbmV0d29yayA9ICZwc2VjdXJpdHlwcml2LT5zZWNfYnNzOwotCWlmICghcHNlY25ldHdvcmspIHsKLQkJa2ZyZWUocGNtZCk7Ci0JCXJlcyA9IF9GQUlMOwotCi0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X2pvaW5ic3NfY21kMjNhIDpwc2VjbmV0d29yayA9PSBOVUxMISEhXG4iKTsKLQotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JbWVtc2V0KHBzZWNuZXR3b3JrLCAwLCBzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpKTsKLQotCW1lbWNweShwc2VjbmV0d29yaywgJnBuZXR3b3JrLT5uZXR3b3JrLAotCSAgICAgICBnZXRfd2xhbl9ic3NpZF9leF9zeigmcG5ldHdvcmstPm5ldHdvcmspKTsKLQotCXBzZWNuZXR3b3JrLT5JRUxlbmd0aCA9IDA7Ci0JLyogIEFkZGVkIGJ5IEFsYmVydCAyMDA5LzAyLzE4ICovCi0JLyogIElmIHRoZSB0aGUgZHJpdmVyIHdhbnRzIHRvIHVzZSB0aGUgYnNzaWQgdG8gY3JlYXRlIHRoZQotCSAqICBjb25uZWN0aW9uLiBJZiBub3QsICB3ZSBoYXZlIHRvIGNvcHkgdGhlIGNvbm5lY3RpbmcgQVAncwotCSAqICBNQUMgYWRkcmVzcyB0byBpdCBzbyB0aGF0IHRoZSBkcml2ZXIganVzdCBoYXMgdGhlIGJzc2lkCi0JICogIGluZm9ybWF0aW9uIGZvciBQTUtJRExpc3Qgc2VhcmNoaW5nLiAqLwotCi0JaWYgKHBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQgPT0gZmFsc2UpCi0JCWV0aGVyX2FkZHJfY29weSgmcG1sbWVwcml2LT5hc3NvY19ic3NpZFswXSwKLQkJCQkmcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzc1swXSk7Ci0KLQlwc2VjbmV0d29yay0+SUVMZW5ndGggPQotCQlydHdfcmVzdHJ1Y3Rfc2VjX2llMjNhKHBhZGFwdGVyLCAmcG5ldHdvcmstPm5ldHdvcmsuSUVzWzBdLAotCQkJCSAgICAgICAmcHNlY25ldHdvcmstPklFc1swXSwKLQkJCQkgICAgICAgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgpOwotCi0JcG1sbWVwcml2LT5xb3Nfb3B0aW9uID0gMDsKLQotCWlmIChwcmVnaXN0cnlwcml2LT53bW1fZW5hYmxlKSB7Ci0JCXUzMiB0bXBfbGVuOwotCi0JCXRtcF9sZW4gPSBydHdfcmVzdHJ1Y3Rfd21tX2llMjNhKHBhZGFwdGVyLAotCQkJCQkJICZwbmV0d29yay0+bmV0d29yay5JRXNbMF0sCi0JCQkJCQkgJnBzZWNuZXR3b3JrLT5JRXNbMF0sCi0JCQkJCQkgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgsCi0JCQkJCQkgcHNlY25ldHdvcmstPklFTGVuZ3RoKTsKLQotCQlpZiAocHNlY25ldHdvcmstPklFTGVuZ3RoICE9IHRtcF9sZW4pIHsKLQkJCXBzZWNuZXR3b3JrLT5JRUxlbmd0aCA9IHRtcF9sZW47Ci0JCQkvKiBUaGVyZSBpcyBXTU0gSUUgaW4gdGhpcyBjb3JyZXNwLiBiZWFjb24gKi8KLQkJCXBtbG1lcHJpdi0+cW9zX29wdGlvbiA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBUaGVyZSBpcyBubyBXTU0gSUUgaW4gdGhpcyBjb3JyZXNwLiBiZWFjb24gKi8KLQkJCXBtbG1lcHJpdi0+cW9zX29wdGlvbiA9IDA7Ci0JCX0KLQl9Ci0KLQlwaHRwcml2LT5odF9vcHRpb24gPSBmYWxzZTsKLQlpZiAocHJlZ2lzdHJ5cHJpdi0+aHRfZW5hYmxlKSB7Ci0JCXUzMiBhbGdvID0gcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtOwotCQkvKglBZGRlZCBieSBBbGJlcnQgMjAxMC8wNi8yMyAqLwotCQkvKglGb3IgdGhlIFdFUCBtb2RlLCB3ZSB3aWxsIHVzZSB0aGUgYmcgbW9kZSB0byBkbwotCQkJdGhlIGNvbm5lY3Rpb24gdG8gYXZvaWQgc29tZSBJT1QgaXNzdWUuICovCi0JCS8qCUVzcGVjaWFsbHkgZm9yIFJlYWx0ZWsgODE5MnUgU29mdEFQLiAqLwotCQlpZiAoYWxnbyAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCAmJgotCQkgICAgYWxnbyAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQgJiYKLQkJICAgIGFsZ28gIT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkgewotCQkJLyogcnR3X3Jlc3RydWN0dXJlX2h0X2llMjNhICovCi0JCQlydHdfcmVzdHJ1Y3R1cmVfaHRfaWUyM2EocGFkYXB0ZXIsCi0JCQkJCQkgJnBuZXR3b3JrLT5uZXR3b3JrLklFc1swXSwKLQkJCQkJCSAmcHNlY25ldHdvcmstPklFc1swXSwKLQkJCQkJCSBwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aCwKLQkJCQkJCSAmcHNlY25ldHdvcmstPklFTGVuZ3RoKTsKLQkJfQotCX0KLQotCXBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID0KLQkJY2hlY2tfYXNzb2NfQVAyM2EocG5ldHdvcmstPm5ldHdvcmsuSUVzLAotCQkJCSAgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgpOwotCi0JaWYgKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX1RFTkRBKQotCQlwYWRhcHRlci0+cHdyY3RybHByaXYuc21hcnRfcHMgPSAwOwotCWVsc2UKLQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2LnNtYXJ0X3BzID0KLQkJCXBhZGFwdGVyLT5yZWdpc3RyeXByaXYuc21hcnRfcHM7Ci0KLQlEQkdfODcyM0EoIiVzOiBzbWFydF9wcyA9JWRcbiIsIF9fZnVuY19fLAotCQkgIHBhZGFwdGVyLT5wd3JjdHJscHJpdi5zbWFydF9wcyk7Ci0KLQkvKiBnZXQgY21kc3ogYmVmb3JlIGVuZGlhbiBjb252ZXJzaW9uICovCi0JcGNtZC0+Y21kc3ogPSBnZXRfd2xhbl9ic3NpZF9leF9zeihwc2VjbmV0d29yayk7Ci0KLQlwY21kLT5jbWRjb2RlID0gX0pvaW5Cc3NfQ01EXzsvKiBHRU5fQ01EX0NPREUoX0pvaW5Cc3MpICovCi0JcGNtZC0+cGFybWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcHNlY25ldHdvcms7Ci0JcGNtZC0+cnNwID0gTlVMTDsKLQlwY21kLT5yc3BzeiA9IDA7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWQpOwotZXhpdDoKLQotCXJldHVybiByZXM7Ci19Ci0KLWludCBydHdfZGlzYXNzb2NfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBkZWF1dGhfdGltZW91dF9tcywKLQkJCWJvb2wgZW5xdWV1ZSkKLXsKLQlzdHJ1Y3QgY21kX29iaiAqY21kb2JqID0gTlVMTDsKLQlzdHJ1Y3QgZGlzY29ubmVjdF9wYXJtICpwYXJhbSA9IE5VTEw7Ci0Jc3RydWN0IGNtZF9wcml2ICpjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfbm90aWNlXywKLQkJICIrcnR3X2Rpc2Fzc29jX2NtZDIzYVxuIik7Ci0KLQkvKiBwcmVwYXJlIGNtZCBwYXJhbWV0ZXIgKi8KLQlwYXJhbSA9IGt6YWxsb2Moc2l6ZW9mKCpwYXJhbSksIEdGUF9BVE9NSUMpOwotCWlmIChwYXJhbSA9PSBOVUxMKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXBhcmFtLT5kZWF1dGhfdGltZW91dF9tcyA9IGRlYXV0aF90aW1lb3V0X21zOwotCi0JaWYgKGVucXVldWUpIHsKLQkJLyogbmVlZCBlbnF1ZXVlLCBwcmVwYXJlIGNtZF9vYmogYW5kIGVucXVldWUgKi8KLQkJY21kb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFjbWRvYmopIHsKLQkJCXJlcyA9IF9GQUlMOwotCQkJa2ZyZWUocGFyYW0pOwotCQkJZ290byBleGl0OwotCQl9Ci0JCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKGNtZG9iaiwgcGFyYW0sIF9EaXNDb25uZWN0X0NNRF8pOwotCQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EoY21kcHJpdiwgY21kb2JqKTsKLQl9IGVsc2UgewotCQkvKiBubyBuZWVkIHRvIGVucXVldWUsIGRvIHRoZSBjbWQgaGRsIGRpcmVjdGx5IGFuZAotCQkgICBmcmVlIGNtZCBwYXJhbWV0ZXIgKi8KLQkJaWYgKGRpc2Nvbm5lY3RfaGRsMjNhKHBhZGFwdGVyLCAodTggKilwYXJhbSkgIT0gSDJDX1NVQ0NFU1MpCi0JCQlyZXMgPSBfRkFJTDsKLQkJa2ZyZWUocGFyYW0pOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcnR3X3NldG9wbW9kZV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBlbnVtIG5sODAyMTFfaWZ0eXBlIGlmbW9kZSkKLXsKLQlzdHJ1Y3QJY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3QJc2V0b3Btb2RlX3Bhcm0gKnBzZXRvcDsKLQlzdHJ1Y3QJY21kX3ByaXYgICAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IGZhbHNlOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXBzZXRvcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRvcG1vZGVfcGFybSksIEdGUF9LRVJORUwpOwotCi0JaWYgKCFwc2V0b3ApIHsKLQkJa2ZyZWUocGgyYyk7Ci0JCXJlcyA9IGZhbHNlOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHNldG9wLCBfU2V0T3BNb2RlX0NNRF8pOwotCXBzZXRvcC0+bW9kZSA9IGlmbW9kZTsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGgyYyk7Ci1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLWludCBydHdfc2V0c3Rha2V5X2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcHN0YSwgdTggdW5pY2FzdF9rZXkpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBoMmM7Ci0Jc3RydWN0IHNldF9zdGFrZXlfcGFybSAqcHNldHN0YWtleV9wYXJhOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0Jc3RydWN0IHNldF9zdGFrZXlfcnNwICpwc2V0c3Rha2V5X3JzcCA9IE5VTEw7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKXBzdGE7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHNldHN0YWtleV9wYXJhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNldF9zdGFrZXlfcGFybSksIEdGUF9LRVJORUwpOwotCWlmICghcHNldHN0YWtleV9wYXJhKSB7Ci0JCWtmcmVlKHBoMmMpOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBzZXRzdGFrZXlfcnNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNldF9zdGFrZXlfcnNwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwc2V0c3Rha2V5X3JzcCkgewotCQlrZnJlZShwaDJjKTsKLQkJa2ZyZWUocHNldHN0YWtleV9wYXJhKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwc2V0c3Rha2V5X3BhcmEsIF9TZXRTdGFLZXlfQ01EXyk7Ci0JcGgyYy0+cnNwID0gKHU4ICopIHBzZXRzdGFrZXlfcnNwOwotCXBoMmMtPnJzcHN6ID0gc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3JzcCk7Ci0KLQlldGhlcl9hZGRyX2NvcHkocHNldHN0YWtleV9wYXJhLT5hZGRyLCBzdGEtPmh3YWRkcik7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJcHNldHN0YWtleV9wYXJhLT5hbGdvcml0aG0gPQotCQkJKHVuc2lnbmVkIGNoYXIpcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobTsKLQl9IGVsc2UgewotCQlHRVRfRU5DUllfQUxHTyhwc2VjdXJpdHlwcml2LCBzdGEsIHBzZXRzdGFrZXlfcGFyYS0+YWxnb3JpdGhtLAotCQkJICAgICAgIGZhbHNlKTsKLQl9Ci0KLQlpZiAodW5pY2FzdF9rZXkgPT0gdHJ1ZSkgewotCQltZW1jcHkoJnBzZXRzdGFrZXlfcGFyYS0+a2V5LCAmc3RhLT5kb3QxMTgwMjF4X1VuY3N0S2V5LCAxNik7Ci0JfSBlbHNlIHsKLQkJaW50IGlkeCA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZDsKLQotCQltZW1jcHkoJnBzZXRzdGFrZXlfcGFyYS0+a2V5LAotCQkgICAgICAgJnBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbaWR4XS5za2V5LCAxNik7Ci0JfQotCi0JLyogamVmZjogc2V0IHRoaXMgYmVjYXVzZSBhdCBsZWFzdCBzdyBrZXkgaXMgcmVhZHkgKi8KLQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5ID0gMTsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGgyYyk7Ci0KLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcnR3X2NsZWFyc3Rha2V5X2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcHN0YSwgdTggZW50cnksCi0JCQkgICB1OCBlbnF1ZXVlKQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0gKnBzZXRzdGFrZXlfcGFyYTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCXN0cnVjdCBzZXRfc3Rha2V5X3JzcCAqcHNldHN0YWtleV9yc3AgPSBOVUxMOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKXBzdGE7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JaWYgKCFlbnF1ZXVlKSB7Ci0JCWNsZWFyX2NhbV9lbnRyeTIzYShwYWRhcHRlciwgZW50cnkpOwotCX0gZWxzZSB7Ci0JCXBoMmMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9LRVJORUwpOwotCQlpZiAoIXBoMmMpIHsKLQkJCXJlcyA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJcHNldHN0YWtleV9wYXJhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNldF9zdGFrZXlfcGFybSksCi0JCQkJCSAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHNldHN0YWtleV9wYXJhKSB7Ci0JCQlrZnJlZShwaDJjKTsKLQkJCXJlcyA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJcHNldHN0YWtleV9yc3AgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9yc3ApLAotCQkJCQkgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHNldHN0YWtleV9yc3ApIHsKLQkJCWtmcmVlKHBoMmMpOwotCQkJa2ZyZWUocHNldHN0YWtleV9wYXJhKTsKLQkJCXJlcyA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHNldHN0YWtleV9wYXJhLAotCQkJCQkgICBfU2V0U3RhS2V5X0NNRF8pOwotCQlwaDJjLT5yc3AgPSAodTggKikgcHNldHN0YWtleV9yc3A7Ci0JCXBoMmMtPnJzcHN6ID0gc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3JzcCk7Ci0KLQkJZXRoZXJfYWRkcl9jb3B5KHBzZXRzdGFrZXlfcGFyYS0+YWRkciwgc3RhLT5od2FkZHIpOwotCi0JCXBzZXRzdGFrZXlfcGFyYS0+YWxnb3JpdGhtID0gMDsKLQotCQlwc2V0c3Rha2V5X3BhcmEtPmlkID0gZW50cnk7Ci0KLQkJcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwaDJjKTsKLQl9Ci1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLWludCBydHdfYWRkYmFyZXFfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHRpZCwgdTggKmFkZHIpCi17Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQlzdHJ1Y3QgY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3QgYWRkQmFSZXFfcGFybSAqcGFkZGJhcmVxX3Bhcm07Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JaWYgKHRpZCA+PSBNQVhUSUQpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwaDJjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBoMmMpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwYWRkYmFyZXFfcGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGRCYVJlcV9wYXJtKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwYWRkYmFyZXFfcGFybSkgewotCQlrZnJlZShwaDJjKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwYWRkYmFyZXFfcGFybS0+dGlkID0gdGlkOwotCWV0aGVyX2FkZHJfY29weShwYWRkYmFyZXFfcGFybS0+YWRkciwgYWRkcik7Ci0KLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwYWRkYmFyZXFfcGFybSwKLQkJCQkgICBHRU5fQ01EX0NPREUoX0FkZEJBUmVxKSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotZXhpdDoKLQlyZXR1cm4gcmVzOwotfQotCi1pbnQgcnR3X2R5bmFtaWNfY2hrX3drX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqcGRydmV4dHJhX2NtZF9wYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGRydmV4dHJhX2NtZF9wYXJtID0ga3phbGxvYyhzaXplb2YoKnBkcnZleHRyYV9jbWRfcGFybSksIEdGUF9BVE9NSUMpOwotCWlmICghcGRydmV4dHJhX2NtZF9wYXJtKSB7Ci0JCWtmcmVlKHBoMmMpOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBEWU5BTUlDX0NIS19XS19DSUQ7Ci0JcGRydmV4dHJhX2NtZF9wYXJtLT50eXBlX3NpemUgPSAwOwotCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9ICh1OCAqKXBhZGFwdGVyOwotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcGRydmV4dHJhX2NtZF9wYXJtLAotCQkJCSAgIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwaDJjKTsKLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdm9pZCB0cmFmZmljX3N0YXR1c193YXRjaGRvZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGJFbnRlclBTOwotCXU4IGJCdXN5VHJhZmZpYyA9IGZhbHNlLCBiVHhCdXN5VHJhZmZpYyA9IGZhbHNlLCBiUnhCdXN5VHJhZmZpYyA9IGZhbHNlOwotCXU4IGJIaWdoZXJCdXN5VHJhZmZpYyA9IGZhbHNlLCBiSGlnaGVyQnVzeVJ4VHJhZmZpYyA9IGZhbHNlOwotCXU4IGJIaWdoZXJCdXN5VHhUcmFmZmljID0gZmFsc2U7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlpbnQgQnVzeVRocmVzaG9sZCA9IDEwMDsKLQlzdHJ1Y3QgcnRfbGlua19kZXRlY3QgKmxkaSA9ICZwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvOwotCi0JLyogICovCi0JLyogIERldGVybWluZSBpZiBvdXIgdHJhZmZpYyBpcyBidXN5IG5vdyAqLwotCS8qICAqLwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJaWYgKHJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQkJQnVzeVRocmVzaG9sZCA9IDUwOwotCQllbHNlIGlmIChsZGktPmJCdXN5VHJhZmZpYykKLQkJCUJ1c3lUaHJlc2hvbGQgPSA3NTsKLQkJLyogIGlmIHdlIHJhaXNlIGJCdXN5VHJhZmZpYyBpbiBsYXN0IHdhdGNoZG9nLCB1c2luZwotCQkgICAgbG93ZXIgdGhyZXNob2xkLiAqLwotCQlpZiAobGRpLT5OdW1SeE9rSW5QZXJpb2QgPiBCdXN5VGhyZXNob2xkIHx8Ci0JCSAgICBsZGktPk51bVR4T2tJblBlcmlvZCA+IEJ1c3lUaHJlc2hvbGQpIHsKLQkJCWJCdXN5VHJhZmZpYyA9IHRydWU7Ci0KLQkJCWlmIChsZGktPk51bVJ4T2tJblBlcmlvZCA+IGxkaS0+TnVtVHhPa0luUGVyaW9kKQotCQkJCWJSeEJ1c3lUcmFmZmljID0gdHJ1ZTsKLQkJCWVsc2UKLQkJCQliVHhCdXN5VHJhZmZpYyA9IHRydWU7Ci0JCX0KLQotCQkvKiAgSGlnaGVyIFR4L1J4IGRhdGEuICovCi0JCWlmIChsZGktPk51bVJ4T2tJblBlcmlvZCA+IDQwMDAgfHwKLQkJICAgIGxkaS0+TnVtVHhPa0luUGVyaW9kID4gNDAwMCkgewotCQkJYkhpZ2hlckJ1c3lUcmFmZmljID0gdHJ1ZTsKLQotCQkJaWYgKGxkaS0+TnVtUnhPa0luUGVyaW9kID4gbGRpLT5OdW1UeE9rSW5QZXJpb2QpCi0JCQkJYkhpZ2hlckJ1c3lSeFRyYWZmaWMgPSB0cnVlOwotCQkJZWxzZQotCQkJCWJIaWdoZXJCdXN5VHhUcmFmZmljID0gdHJ1ZTsKLQkJfQotCi0JCWlmICghcnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikgfHwKLQkJICAgICFydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKSB7Ci0JCS8qICBjaGVjayB0cmFmZmljIGZvciAgcG93ZXJzYXZpbmcuICovCi0JCQlpZiAoKChsZGktPk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgKwotCQkJICAgICAgbGRpLT5OdW1UeE9rSW5QZXJpb2QpID4gOCkgfHwKLQkJCSAgICBsZGktPk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgPiAyKQotCQkJCWJFbnRlclBTID0gZmFsc2U7Ci0JCQllbHNlCi0JCQkJYkVudGVyUFMgPSB0cnVlOwotCi0JCQkvKiAgTGVpc3VyZVBTIG9ubHkgd29yayBpbiBpbmZyYSBtb2RlLiAqLwotCQkJaWYgKGJFbnRlclBTKQotCQkJCUxQU19FbnRlcjIzYShwYWRhcHRlcik7Ci0JCQllbHNlCi0JCQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQkJfQotCX0gZWxzZQotCQlMUFNfTGVhdmUyM2EocGFkYXB0ZXIpOwotCi0JbGRpLT5OdW1SeE9rSW5QZXJpb2QgPSAwOwotCWxkaS0+TnVtVHhPa0luUGVyaW9kID0gMDsKLQlsZGktPk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgPSAwOwotCWxkaS0+YkJ1c3lUcmFmZmljID0gYkJ1c3lUcmFmZmljOwotCWxkaS0+YlR4QnVzeVRyYWZmaWMgPSBiVHhCdXN5VHJhZmZpYzsKLQlsZGktPmJSeEJ1c3lUcmFmZmljID0gYlJ4QnVzeVRyYWZmaWM7Ci0JbGRpLT5iSGlnaGVyQnVzeVRyYWZmaWMgPSBiSGlnaGVyQnVzeVRyYWZmaWM7Ci0JbGRpLT5iSGlnaGVyQnVzeVJ4VHJhZmZpYyA9IGJIaWdoZXJCdXN5UnhUcmFmZmljOwotCWxkaS0+YkhpZ2hlckJ1c3lUeFRyYWZmaWMgPSBiSGlnaGVyQnVzeVR4VHJhZmZpYzsKLX0KLQotc3RhdGljIHZvaWQgZHluYW1pY19jaGtfd2tfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmLCBpbnQgc3opCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCi0JcGFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopcGJ1ZjsKLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKLQkJZXhwaXJlX3RpbWVvdXRfY2hrMjNhKHBhZGFwdGVyKTsKLSNlbmRpZgotCi0JcnRsODcyM2Ffc3Jlc2V0X3htaXRfc3RhdHVzX2NoZWNrKHBhZGFwdGVyKTsKLQotCWxpbmtlZF9zdGF0dXNfY2hrMjNhKHBhZGFwdGVyKTsKLQl0cmFmZmljX3N0YXR1c193YXRjaGRvZyhwYWRhcHRlcik7Ci0KLQlydGw4NzIzYV9IYWxEbVdhdGNoRG9nKHBhZGFwdGVyKTsKLQotCS8qICAqLwotCS8qICBCVC1Db2V4aXN0ICovCi0JLyogICovCi0JcnRsODcyM2FfQlRfZG9fY29leGlzdChwYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwc19jdHJsX3drX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBscHNfY3RybF90eXBlKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JdTggbXN0YXR1czsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChscHNfY3RybF90eXBlKSB7Ci0JY2FzZSBMUFNfQ1RSTF9TQ0FOOgotCQlydGw4NzIzYV9CVF93aWZpc2Nhbl9ub3RpZnkocGFkYXB0ZXIsIHRydWUpOwotCQlpZiAoIXJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikpIHsKLQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpCi0JCQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQkJCX0KLQkJYnJlYWs7Ci0JY2FzZSBMUFNfQ1RSTF9KT0lOQlNTOgotCQlMUFNfTGVhdmUyM2EocGFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIExQU19DVFJMX0NPTk5FQ1Q6Ci0JCW1zdGF0dXMgPSAxOy8qIGNvbm5lY3QgKi8KLQkJLyogIFJlc2V0IExQUyBTZXR0aW5nICovCi0JCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5McHNJZGxlQ291bnQgPSAwOwotCQlydGw4NzIzYV9zZXRfRndKb2luQnNzUmVwb3J0X2NtZChwYWRhcHRlciwgMSk7Ci0JCXJ0bDg3MjNhX0JUX21lZGlhc3RhdHVzX25vdGlmeShwYWRhcHRlciwgbXN0YXR1cyk7Ci0JCWJyZWFrOwotCWNhc2UgTFBTX0NUUkxfRElTQ09OTkVDVDoKLQkJbXN0YXR1cyA9IDA7LyogZGlzY29ubmVjdCAqLwotCQlydGw4NzIzYV9CVF9tZWRpYXN0YXR1c19ub3RpZnkocGFkYXB0ZXIsIG1zdGF0dXMpOwotCQlpZiAoIXJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikpCi0JCQlMUFNfTGVhdmUyM2EocGFkYXB0ZXIpOwotCQlydGw4NzIzYV9zZXRfRndKb2luQnNzUmVwb3J0X2NtZChwYWRhcHRlciwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgTFBTX0NUUkxfU1BFQ0lBTF9QQUNLRVQ6Ci0JCXB3cnByaXYtPkRlbGF5TFBTTGFzdFRpbWVTdGFtcCA9IGppZmZpZXM7Ci0JCXJ0bDg3MjNhX0JUX3NwZWNpYWxwYWNrZXRfbm90aWZ5KHBhZGFwdGVyKTsKLQkJaWYgKCFydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKQotCQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBMUFNfQ1RSTF9MRUFWRToKLQkJcnRsODcyM2FfQlRfbHBzX2xlYXZlKHBhZGFwdGVyKTsKLQkJaWYgKCFydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKQotCQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLWludCBydHdfbHBzX2N0cmxfd2tfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICB1OCBscHNfY3RybF90eXBlLCB1OCBlbnF1ZXVlKQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqcGRydmV4dHJhX2NtZF9wYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JaWYgKGVucXVldWUpIHsKLQkJcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghcGgyYykgewotCQkJcmVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlwZHJ2ZXh0cmFfY21kX3Bhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJ2ZXh0cmFfY21kX3Bhcm0pLAotCQkJCQkgICAgIEdGUF9BVE9NSUMpOwotCQlpZiAoIXBkcnZleHRyYV9jbWRfcGFybSkgewotCQkJa2ZyZWUocGgyYyk7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBMUFNfQ1RSTF9XS19DSUQ7Ci0JCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gbHBzX2N0cmxfdHlwZTsKLQkJcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gTlVMTDsKLQotCQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sCi0JCQkJCSAgIEdFTl9DTURfQ09ERShfU2V0X0Rydl9FeHRyYSkpOwotCi0JCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGgyYyk7Ci0JfSBlbHNlCi0JCWxwc19jdHJsX3drX2hkbChwYWRhcHRlciwgbHBzX2N0cmxfdHlwZSk7Ci1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50IHJ0d19wc19jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgY21kX29iaiAqcHBzY21kOwotCXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqcGRydmV4dHJhX2NtZF9wYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcHBzY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBwc2NtZCkgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkcnZleHRyYV9jbWRfcGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSksCi0JCQkJICAgICBHRlBfQVRPTUlDKTsKLQlpZiAoIXBkcnZleHRyYV9jbWRfcGFybSkgewotCQlrZnJlZShwcHNjbWQpOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBQT1dFUl9TQVZJTkdfQ1RSTF9XS19DSUQ7Ci0JcGRydmV4dHJhX2NtZF9wYXJtLT5wYnVmID0gTlVMTDsKLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwcHNjbWQsIHBkcnZleHRyYV9jbWRfcGFybSwKLQkJCQkgICBHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpKTsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcHBzY21kKTsKLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0KLXN0YXRpYyB2b2lkIHJ0d19jaGtfaGlfcXVldWVfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IGNudCA9IDA7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhX2JtYzsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JcHN0YV9ibWMgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JaWYgKCFwc3RhX2JtYykKLQkJcmV0dXJuOwotCi0JaWYgKHBzdGFfYm1jLT5zbGVlcHFfbGVuID09IDApIHsKLQkJYm9vbCB2YWw7Ci0KLQkJdmFsID0gcnRsODcyM2FfY2hrX2hpX3F1ZXVlX2VtcHR5KHBhZGFwdGVyKTsKLQotCQl3aGlsZSAoIXZhbCkgewotCQkJbXNsZWVwKDEwMCk7Ci0KLQkJCWNudCsrOwotCi0JCQlpZiAoY250ID4gMTApCi0JCQkJYnJlYWs7Ci0KLQkJCXZhbCA9IHJ0bDg3MjNhX2Noa19oaV9xdWV1ZV9lbXB0eShwYWRhcHRlcik7Ci0JCX0KLQotCQlpZiAoY250IDw9IDEwKSB7Ci0JCQlwc3RhcHJpdi0+dGltX2JpdG1hcCAmPSB+QklUKDApOwotCQkJcHN0YXByaXYtPnN0YV9kel9iaXRtYXAgJj0gfkJJVCgwKTsKLQotCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfVElNLCBOVUxMLCBmYWxzZSk7Ci0JCX0gZWxzZSAvKiByZSBjaGVjayBhZ2FpbiAqLwotCQkJcnR3X2Noa19oaV9xdWV1ZV9jbWQyM2EocGFkYXB0ZXIpOwotCX0KLX0KLQotaW50IHJ0d19jaGtfaGlfcXVldWVfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBoMmM7Ci0Jc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtICpwZHJ2ZXh0cmFfY21kX3Bhcm07Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlwaDJjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBoMmMpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwZHJ2ZXh0cmFfY21kX3Bhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHJ2ZXh0cmFfY21kX3Bhcm0pLAotCQkJCSAgICAgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwZHJ2ZXh0cmFfY21kX3Bhcm0pIHsKLQkJa2ZyZWUocGgyYyk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGRydmV4dHJhX2NtZF9wYXJtLT5lY19pZCA9IENIRUNLX0hJUV9XS19DSUQ7Ci0JcGRydmV4dHJhX2NtZF9wYXJtLT50eXBlX3NpemUgPSAwOwotCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9IE5VTEw7Ci0KLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sCi0JCQkJICAgR0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotZXhpdDoKLQotCXJldHVybiByZXM7Ci19Ci0jZW5kaWYKLQotaW50IHJ0d19jMmhfd2tfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpjMmhfZXZ0KQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqcGRydmV4dHJhX2NtZF9wYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGRydmV4dHJhX2NtZF9wYXJtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtKSwKLQkJCQkgICAgIEdGUF9BVE9NSUMpOwotCWlmICghcGRydmV4dHJhX2NtZF9wYXJtKSB7Ci0JCWtmcmVlKHBoMmMpOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkcnZleHRyYV9jbWRfcGFybS0+ZWNfaWQgPSBDMkhfV0tfQ0lEOwotCXBkcnZleHRyYV9jbWRfcGFybS0+dHlwZV9zaXplID0gYzJoX2V2dD8xNjowOwotCXBkcnZleHRyYV9jbWRfcGFybS0+cGJ1ZiA9IGMyaF9ldnQ7Ci0KLQlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwZHJ2ZXh0cmFfY21kX3Bhcm0sCi0JCQkJICAgR0VOX0NNRF9DT0RFKF9TZXRfRHJ2X0V4dHJhKSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotCi1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBjMmhfZXZ0X2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBjMmhfZXZ0X2hkciAqYzJoX2V2dCkKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0JdTggYnVmWzE2XTsKLQotCWlmICghYzJoX2V2dCkgewotCQkvKiBObyBjMmggZXZlbnQgaW4gY21kX29iaiwgcmVhZCBjMmggZXZlbnQgYmVmb3JlIGhhbmRsaW5nKi8KLQkJaWYgKGMyaF9ldnRfcmVhZDIzYShhZGFwdGVyLCBidWYpID09IF9TVUNDRVNTKSB7Ci0JCQljMmhfZXZ0ID0gKHN0cnVjdCBjMmhfZXZ0X2hkciAqKWJ1ZjsKLQotCQkJcmV0ID0gYzJoX2hhbmRsZXJfODcyM2EoYWRhcHRlciwgYzJoX2V2dCk7Ci0JCX0KLQl9IGVsc2UKLQkJcmV0ID0gYzJoX2hhbmRsZXJfODcyM2EoYWRhcHRlciwgYzJoX2V2dCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBydHdfaXJxX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBldnRfcHJpdiAqZXZ0cHJpdjsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXI7Ci0KLQlldnRwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBldnRfcHJpdiwgaXJxX3drKTsKLQlhZGFwdGVyID0gY29udGFpbmVyX29mKGV2dHByaXYsIHN0cnVjdCBydHdfYWRhcHRlciwgZXZ0cHJpdik7Ci0KLQljMmhfZXZ0X2NsZWFyMjNhKGFkYXB0ZXIpOwotfQotCi12b2lkIHJ0d19ldnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGV2dF93b3JrICpld29yazsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXI7Ci0KLQlld29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZXZ0X3dvcmssIHdvcmspOwotCWFkYXB0ZXIgPSBld29yay0+YWRhcHRlcjsKLQotCWMyaF9ldnRfY2xlYXIyM2EoYWRhcHRlcik7Ci0KLQlpZiAoIWMyaF9ldnRfZXhpc3QoJmV3b3JrLT51LmMyaF9ldnQpKSB7Ci0JCWtmcmVlKGV3b3JrKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjMmhfaWRfZmlsdGVyX2NjeF84NzIzYShld29yay0+dS5jMmhfZXZ0LmlkKSA9PSB0cnVlKSB7Ci0JCS8qIEhhbmRsZSBDQ1ggcmVwb3J0IGhlcmUgKi8KLQkJYzJoX2hhbmRsZXJfODcyM2EoYWRhcHRlciwgJmV3b3JrLT51LmMyaF9ldnQpOwotCQlrZnJlZShld29yayk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogRW5xdWV1ZSBpbnRvIGNtZF90aHJlYWQgZm9yIG90aGVycy4KLQkJICogZXdvcmsgd2lsbCBiZSB0dXJuZWQgaW50byBhIGMyaF9ldnQgYW5kIGZyZWVkIG9uY2UgaXQKLQkJICogaGFzIGJlZW4gY29uc3VtZWQuCi0JCSAqLwotCQlydHdfYzJoX3drX2NtZDIzYShhZGFwdGVyLCAodTggKikmZXdvcmstPnUuYzJoX2V2dCk7Ci0JfQotfQotCi1pbnQgcnR3X2RydmV4dHJhX2NtZF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JY29uc3Qgc3RydWN0IGRydmV4dHJhX2NtZF9wYXJtICpwZHJ2ZXh0cmFfY21kOwotCi0JaWYgKCFwYnVmKQotCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQlwZHJ2ZXh0cmFfY21kID0gKHN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSAqKXBidWY7Ci0KLQlzd2l0Y2ggKHBkcnZleHRyYV9jbWQtPmVjX2lkKSB7Ci0JY2FzZSBEWU5BTUlDX0NIS19XS19DSUQ6Ci0JCWR5bmFtaWNfY2hrX3drX2hkbChwYWRhcHRlciwgcGRydmV4dHJhX2NtZC0+cGJ1ZiwKLQkJCQkgICBwZHJ2ZXh0cmFfY21kLT50eXBlX3NpemUpOwotCQlicmVhazsKLQljYXNlIFBPV0VSX1NBVklOR19DVFJMX1dLX0NJRDoKLQkJcnR3X3BzX3Byb2Nlc3NvcjIzYShwYWRhcHRlcik7Ci0JCWJyZWFrOwotCWNhc2UgTFBTX0NUUkxfV0tfQ0lEOgotCQlscHNfY3RybF93a19oZGwocGFkYXB0ZXIsICh1OClwZHJ2ZXh0cmFfY21kLT50eXBlX3NpemUpOwotCQlicmVhazsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQljYXNlIENIRUNLX0hJUV9XS19DSUQ6Ci0JCXJ0d19jaGtfaGlfcXVldWVfaGRsKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0jZW5kaWYgLyogQ09ORklHXzg3MjNBVV9BUF9NT0RFICovCi0JY2FzZSBDMkhfV0tfQ0lEOgotCQljMmhfZXZ0X2hkbChwYWRhcHRlciwKLQkJCSAgICAoc3RydWN0IGMyaF9ldnRfaGRyICopcGRydmV4dHJhX2NtZC0+cGJ1Zik7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBkcnZleHRyYV9jbWQtPnBidWYgJiYgKHBkcnZleHRyYV9jbWQtPnR5cGVfc2l6ZSA+IDApKSB7Ci0JCWtmcmVlKHBkcnZleHRyYV9jbWQtPnBidWYpOwotCQkvKgotCQkgKiBObyBuZWVkIHRvIHNldCBwZHJ2ZXh0cmFfY21kLT5wYnVmID0gTlVMTCBhcyB3ZSB3ZXJlCi0JCSAqIG9wZXJhdGluZyBvbiBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIHBjbWQtPnBhcm1idWYKLQkJICogY3JlYXRlZCBpbiBydHdfY21kX3dvcmsoKS4KLQkJICovCi0JfQotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi12b2lkIHJ0d19zdXJ2ZXlfY21kX2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IGNtZF9vYmogKnBjbWQpCi17Ci0Jc3RydWN0CW1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmIChwY21kLT5yZXMgPT0gSDJDX0RST1BQRUQpIHsKLQkJLyogVE9ETzogY2FuY2VsIHRpbWVyIGFuZCBkbyB0aW1lb3V0IGhhbmRsZXIgZGlyZWN0bHkuLi4gKi8KLQkJLyogbmVlZCB0byBtYWtlIHRpbWVvdXQgaGFuZGxlck9TIGluZGVwZW5kZW50ICovCi0JCW1vZF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7Ci0JfSBlbHNlIGlmIChwY21kLT5yZXMgIT0gSDJDX1NVQ0NFU1MpIHsKLQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICIqKioqKioqKkVycm9yOiBNZ250QWN0cnR3X3NldF84MDJfMTFfYnNzaWQyM2FfTElTVF9TQ0FOIEZhaWwgKioqKioqKioqKioqXG4iKTsKLQl9Ci0KLQkvKiAgZnJlZSBjbWQgKi8KLQlydHdfZnJlZV9jbWRfb2JqMjNhKHBjbWQpOwotfQotCi12b2lkIHJ0d19kaXNhc3NvY19jbWQyM2FfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHN0cnVjdCBjbWRfb2JqICpwY21kKQotewotCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7Ci0JCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiKioqRXJyb3I6IGRpc2Nvbm5lY3RfY21kX2NhbGxiYWNrIEZhaWwgKioqXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qICBmcmVlIGNtZCAqLwotCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci19Ci0KLXZvaWQgcnR3X2pvaW5ic3NfY21kMjNhX2NhbGxiYWNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJIHN0cnVjdCBjbWRfb2JqICpwY21kKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlpZiAocGNtZC0+cmVzID09IEgyQ19EUk9QUEVEKSB7Ci0JCS8qIFRPRE86IGNhbmNlbCB0aW1lciBhbmQgZG8gdGltZW91dCBoYW5kbGVyIGRpcmVjdGx5Li4uICovCi0JCS8qIG5lZWQgdG8gbWFrZSB0aW1lb3V0IGhhbmRsZXJPUyBpbmRlcGVuZGVudCAqLwotCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKLQl9IGVsc2UgaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIioqKioqKioqRXJyb3I6cnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfcXVldWUgV2FpdCBTZW1hICBGYWlsICoqKioqKioqKioqKlxuIik7Ci0JCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwotCX0KLQotCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci19Ci0KLXZvaWQgcnR3X2NyZWF0ZWJzc19jbWQyM2FfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcHdsYW47Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAoc3RydWN0IHdsYW5fYnNzaWRfZXggKilwY21kLT5wYXJtYnVmOwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnRndF9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqc2Nhbm5lZF9xdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7Ci0KLQlpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiKioqKioqKipFcnJvcjogcnR3X2NyZWF0ZWJzc19jbWQyM2FfY2FsbGJhY2sgIEZhaWwgKioqKioqKioqKioqXG4iKTsKLQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7Ci0JfQotCi0JZGVsX3RpbWVyX3N5bmMoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwKLQkJCQkJICBwbmV0d29yay0+TWFjQWRkcmVzcyk7Ci0JCWlmICghcHN0YSkgewotCQkJcHN0YSA9IHJ0d19hbGxvY19zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwKLQkJCQkJCSAgICBwbmV0d29yay0+TWFjQWRkcmVzcywKLQkJCQkJCSAgICBHRlBfS0VSTkVMKTsKLQkJCWlmICghcHN0YSkgewotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCQkJICJDYW4ndCBhbGxvYyBzdGFfaW5mbyB3aGVuIGNyZWF0ZWJzc19jbWRfY2FsbGJhY2tcbiIpOwotCQkJCWdvdG8gY3JlYXRlYnNzX2NtZF9mYWlsOwotCQkJfQotCQl9Ci0KLQkJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCQlydHdfaW5kaWNhdGVfY29ubmVjdDIzYShwYWRhcHRlcik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCX0gZWxzZSB7Ci0JCXB3bGFuID0gcnR3X2FsbG9jX25ldHdvcmsocG1sbWVwcml2LCBHRlBfS0VSTkVMKTsKLQkJc3Bpbl9sb2NrX2JoKCZzY2FubmVkX3F1ZXVlLT5sb2NrKTsKLQkJaWYgKCFwd2xhbikgewotCQkJcHdsYW4gPSBydHdfZ2V0X29sZGVzdF93bGFuX25ldHdvcmsyM2Eoc2Nhbm5lZF9xdWV1ZSk7Ci0JCQlpZiAoIXB3bGFuKSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJCQkgIkVycm9yOiAgY2FuJ3QgZ2V0IHB3bGFuIGluIHJ0dzIzYV9qb2luYnNzX2V2ZW50X2NiXG4iKTsKLQkJCQlzcGluX3VubG9ja19iaCgmc2Nhbm5lZF9xdWV1ZS0+bG9jayk7Ci0JCQkJZ290byBjcmVhdGVic3NfY21kX2ZhaWw7Ci0JCQl9Ci0JCQlwd2xhbi0+bGFzdF9zY2FubmVkID0gamlmZmllczsKLQkJfSBlbHNlIHsKLQkJCWxpc3RfYWRkX3RhaWwoJnB3bGFuLT5saXN0LAotCQkJCSAgICAgICZzY2FubmVkX3F1ZXVlLT5xdWV1ZSk7Ci0JCX0KLQotCQlwbmV0d29yay0+TGVuZ3RoID0gZ2V0X3dsYW5fYnNzaWRfZXhfc3oocG5ldHdvcmspOwotCQltZW1jcHkoJnB3bGFuLT5uZXR3b3JrLCBwbmV0d29yaywgcG5ldHdvcmstPkxlbmd0aCk7Ci0JCS8qIHB3bGFuLT5maXhlZCA9IHRydWU7ICovCi0KLQkJLyogbGlzdF9hZGRfdGFpbCgmcHdsYW4tPmxpc3QsCi0JCSAgICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUucXVldWUpOyAqLwotCi0JCS8qICBjb3B5IHBkZXZfbmV0d29yayBpbmZvcm1hdGlvbiB0bwotCQkgICAgcG1sbWVwcml2LT5jdXJfbmV0d29yayAqLwotCQltZW1jcHkoJnRndF9uZXR3b3JrLT5uZXR3b3JrLCBwbmV0d29yaywKLQkJICAgICAgIGdldF93bGFuX2Jzc2lkX2V4X3N6KHBuZXR3b3JrKSk7Ci0KLQkJLyogIHJlc2V0IERTQ29uZmlnICovCi0KLQkJY2xyX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0KLQkJLyogIHdlIHdpbGwgc2V0IF9GV19MSU5LRUQgd2hlbiB0aGVyZSBpcyBvbmUgbW9yZSBzYXQgdG8KLQkJICAgIGpvaW4gdXMgKHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhKSAqLwotCQlzcGluX3VubG9ja19iaCgmc2Nhbm5lZF9xdWV1ZS0+bG9jayk7Ci0JfQotCi1jcmVhdGVic3NfY21kX2ZhaWw6Ci0KLQlydHdfZnJlZV9jbWRfb2JqMjNhKHBjbWQpOwotfQotCi12b2lkIHJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgc3RydWN0IGNtZF9vYmogKnBjbWQpCi17Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdjsKLQlzdHJ1Y3Qgc2V0X3N0YWtleV9yc3AgKnBzZXRzdGFrZXlfcnNwOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQotCXBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXBzZXRzdGFrZXlfcnNwID0gKHN0cnVjdCBzZXRfc3Rha2V5X3JzcCAqKSAocGNtZC0+cnNwKTsKLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwc2V0c3Rha2V5X3JzcC0+YWRkcik7Ci0KLQlpZiAoIXBzdGEpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICJFUlJPUjogcnR3X3NldHN0YUtleV9jbWRyc3BfY2FsbGJhY2syM2EgPT4gY2FuJ3QgZ2V0IHN0YV9pbmZvXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotZXhpdDoKLQotCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci19Ci0KLXZvaWQgcnR3X3NldGFzc29jc3RhX2NtZHJzcF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQlzdHJ1Y3QgY21kX29iaiAqcGNtZCkKLXsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHNldF9hc3NvY3N0YV9wYXJtICpwYXNzb2NzdGFfcGFybTsKLQlzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3JzcCAqcGFzc29jc3RhX3JzcDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQlwYXNzb2NzdGFfcGFybSA9IChzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3Bhcm0gKikocGNtZC0+cGFybWJ1Zik7Ci0JcGFzc29jc3RhX3JzcCA9IChzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3JzcCAqKSAocGNtZC0+cnNwKTsKLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXNzb2NzdGFfcGFybS0+YWRkcik7Ci0KLQlpZiAocHN0YSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAiRVJST1I6IHNldGFzc29jc3RhX2NtZHJzcF9jYWxsYmFjID0+IGNhbid0IGdldCBzdGFfaW5mb1xuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwc3RhLT5haWQgPSBwc3RhLT5tYWNfaWQgPSBwYXNzb2NzdGFfcnNwLT5jYW1faWQ7Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpICYmCi0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykpCi0JCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0KLQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpOwotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi1leGl0OgotCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2VmdXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2VmdXNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1OWVmNDEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19lZnVzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRXX0VGVVNFX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxydHdfZWZ1c2UuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLSNkZWZpbmUgUkVHX0VGVVNFX0NUUkwJCTB4MDAzMAotI2RlZmluZSBFRlVTRV9DVFJMCQlSRUdfRUZVU0VfQ1RSTAkvKiBFLUZ1c2UgQ29udHJvbCAqLwotCi0jZGVmaW5lIFZPTFRBR0VfVjI1CQkweDAzCi0jZGVmaW5lIExET0UyNV9TSElGVAkJMjgKLQotLyoKLSAqIFdoZW4gd2Ugd2FudCB0byBlbmFibGUgd3JpdGUgb3BlcmF0aW9uLCB3ZSBzaG91bGQgY2hhbmdlIHRvCi0gKiBwd3Igb24gc3RhdGUuIFdoZW4gd2Ugc3RvcCB3cml0ZSwgd2Ugc2hvdWxkIHN3aXRjaCB0byA1MDBrIG1vZGUKLSAqIGFuZCBkaXNhYmxlIExETyAyLjVWLgotICovCi1zdGF0aWMgdm9pZCBFZnVzZV9Qb3dlclN3aXRjaChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgdTggYldyaXRlLCB1OCBQd3JTdGF0ZSkKLXsKLQl1OCB0ZW1wdmFsOwotCXUxNiB0bXBWMTY7Ci0KLQlpZiAoUHdyU3RhdGUgPT0gdHJ1ZSkgewotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRUZVU0VfQUNDRVNTLCBFRlVTRV9BQ0NFU1NfT04pOwotCi0JCS8qCi0JCSAqIDEuMlYgUG93ZXI6IEZyb20gVkRET04gd2l0aCBQb3dlcgotCQkgKiBDdXQoMHgwMDAwaFsxNV0pLCBkZWZhdWx0IHZhbGlkCi0JCSAqLwotCQl0bXBWMTYgPSBydGw4NzIzYXVfcmVhZDE2KHBhZGFwdGVyLCBSRUdfU1lTX0lTT19DVFJMKTsKLQkJaWYgKCEodG1wVjE2ICYgUFdDX0VWMTJWKSkgewotCQkJdG1wVjE2IHw9IFBXQ19FVjEyVjsKLQkJCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfU1lTX0lTT19DVFJMLCB0bXBWMTYpOwotCQl9Ci0JCS8qIFJlc2V0OiAweDAwMDBoWzI4XSwgZGVmYXVsdCB2YWxpZCAqLwotCQl0bXBWMTYgPSBydGw4NzIzYXVfcmVhZDE2KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4pOwotCQlpZiAoISh0bXBWMTYgJiBGRU5fRUxEUikpIHsKLQkJCXRtcFYxNiB8PSBGRU5fRUxEUjsKLQkJCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4sIHRtcFYxNik7Ci0JCX0KLQotCQkvKgotCQkgKiBDbG9jazogR2F0ZWQoMHgwMDA4aFs1XSkgOE0oMHgwMDA4aFsxXSkKLQkJICogY2xvY2sgZnJvbSBBTkEsIGRlZmF1bHQgdmFsaWQKLQkJICovCi0JCXRtcFYxNiA9IHJ0bDg3MjNhdV9yZWFkMTYocGFkYXB0ZXIsIFJFR19TWVNfQ0xLUik7Ci0JCWlmICgoISh0bXBWMTYgJiBMT0FERVJfQ0xLX0VOKSkgfHwgKCEodG1wVjE2ICYgQU5BOE0pKSkgewotCQkJdG1wVjE2IHw9IChMT0FERVJfQ0xLX0VOIHwgQU5BOE0pOwotCQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19TWVNfQ0xLUiwgdG1wVjE2KTsKLQkJfQotCi0JCWlmIChiV3JpdGUgPT0gdHJ1ZSkgewotCQkJLyogIEVuYWJsZSBMRE8gMi41ViBiZWZvcmUgcmVhZC93cml0ZSBhY3Rpb24gKi8KLQkJCXRlbXB2YWwgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIEVGVVNFX1RFU1QgKyAzKTsKLQkJCXRlbXB2YWwgJj0gMHgwRjsKLQkJCXRlbXB2YWwgfD0gKFZPTFRBR0VfVjI1IDw8IDQpOwotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgRUZVU0VfVEVTVCArIDMsCi0JCQkJCSB0ZW1wdmFsIHwgMHg4MCk7Ci0JCX0KLQl9IGVsc2UgewotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRUZVU0VfQUNDRVNTLCBFRlVTRV9BQ0NFU1NfT0ZGKTsKLQotCQlpZiAoYldyaXRlID09IHRydWUpIHsKLQkJCS8qICBEaXNhYmxlIExETyAyLjVWIGFmdGVyIHJlYWQvd3JpdGUgYWN0aW9uICovCi0JCQl0ZW1wdmFsID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBFRlVTRV9URVNUICsgMyk7Ci0JCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBFRlVTRV9URVNUICsgMywKLQkJCQkJIHRlbXB2YWwgJiAweDdGKTsKLQkJfQotCX0KLX0KLQotdTE2IEVmdXNlX0dldEN1cnJlbnRTaXplMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IGVmdXNlVHlwZSkKLXsKLQl1MTYgcmV0ID0gMDsKLQotCWlmIChlZnVzZVR5cGUgPT0gRUZVU0VfV0lGSSkKLQkJcmV0ID0gcnRsODcyM2FfRWZ1c2VHZXRDdXJyZW50U2l6ZV9XaUZpKHBBZGFwdGVyKTsKLQllbHNlCi0JCXJldCA9IHJ0bDg3MjNhX0VmdXNlR2V0Q3VycmVudFNpemVfQlQocEFkYXB0ZXIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogR2V0IGN1cnJlbnQgZWZ1c2UgYXJlYSBlbmFibGVkIHdvcmQgKi8KLXU4IEVmdXNlX0NhbGN1bGF0ZVdvcmRDbnRzMjNhKHU4IHdvcmRfZW4pCi17Ci0JcmV0dXJuIGh3ZWlnaHQ4KCh+d29yZF9lbikgJiAweGYpOwotfQotCi0vKgotICogRGVzY3JpcHRpb246IEV4ZWN1dGUgRS1GdXNlIHJlYWQgYnl0ZSBvcGVyYXRpb24uCi0gKgotICogQXNzdW1wdGlvbnM6IDEuIEJvb3QgZnJvbSBFLUZ1c2UgYW5kIHN1Y2Nlc3NmdWxseSBhdXRvLWxvYWQuCi0gKiAgICAgICAgICAgICAgMi4gUEFTU0lWRV9MRVZFTCAoVVNCIGludGVyZmFjZSkKLSAqLwotdm9pZCBSZWFkRUZ1c2VCeXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTE2IF9vZmZzZXQsIHU4ICpwYnVmKQotewotCXUzMgl2YWx1ZTMyOwotCXU4CXJlYWRieXRlOwotCXUxNglyZXRyeTsKLQotCS8qIFdyaXRlIEFkZHJlc3MgKi8KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMSwgKF9vZmZzZXQgJiAweGZmKSk7Ci0JcmVhZGJ5dGUgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgRUZVU0VfQ1RSTCsyKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMiwKLQkJCSAoKF9vZmZzZXQgPj4gOCkgJiAweDAzKSB8IChyZWFkYnl0ZSAmIDB4ZmMpKTsKLQotCS8qIFdyaXRlIGJpdCAzMiAwICovCi0JcmVhZGJ5dGUgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgRUZVU0VfQ1RSTCszKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMywgcmVhZGJ5dGUgJiAweDdmKTsKLQotCS8qIENoZWNrIGJpdCAzMiByZWFkLXJlYWR5ICovCi0JcmV0cnkgPSAwOwotCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIEVGVVNFX0NUUkwpOwotCXdoaWxlICghKCh2YWx1ZTMyID4+IDI0KSAmIDB4ODApICYmIHJldHJ5IDwgMTAwMDApIHsKLQkJdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgRUZVU0VfQ1RSTCk7Ci0JCXJldHJ5Kys7Ci0JfQotCi0JLyoKLQkgKiBBZGRlZCBzdWdnZXN0ZWQgZGVsYXkuIFRoaXMgZml4ZXMgdGhlIHByb2JsZW0gdGhhdAotCSAqIEVmdXNlIHJlYWQgZXJyb3IgaW4gaGlnaCB0ZW1wZXJhdHVyZSBjb25kaXRpb24uCi0JICogRGVzaWduZXIgc2F5cyB0aGF0IHRoZXJlIHNoYWxsIGJlIHNvbWUgZGVsYXkgYWZ0ZXIKLQkgKiByZWFkeSBiaXQgaXMgc2V0LCBvciB0aGUgcmVzdWx0IHdpbGwgYWx3YXlzIHN0YXkKLQkgKiBvbiBsYXN0IGRhdGEgd2UgcmVhZC4KLQkgKi8KLQl1ZGVsYXkoNTApOwotCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIEVGVVNFX0NUUkwpOwotCi0JKnBidWYgPSAodTgpKHZhbHVlMzIgJiAweGZmKTsKLX0KLQotdm9pZCBFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggZWZ1c2VUeXBlLAotCQkJCSB1OCB0eXBlLCB2b2lkICpwT3V0KQotewotCXU4ICpwdTFUbXA7Ci0JdTE2ICpwdTJUbXA7Ci0JdTggKnBNYXhfc2VjdGlvbjsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgVFlQRV9FRlVTRV9NQVhfU0VDVElPTjoKLQkJcE1heF9zZWN0aW9uID0gcE91dDsKLQotCQlpZiAoZWZ1c2VUeXBlID09IEVGVVNFX1dJRkkpCi0JCQkqcE1heF9zZWN0aW9uID0gRUZVU0VfTUFYX1NFQ1RJT05fODcyM0E7Ci0JCWVsc2UKLQkJCSpwTWF4X3NlY3Rpb24gPSBFRlVTRV9CVF9NQVhfU0VDVElPTjsKLQkJYnJlYWs7Ci0KLQljYXNlIFRZUEVfRUZVU0VfUkVBTF9DT05URU5UX0xFTjoKLQkJcHUyVG1wID0gcE91dDsKLQotCQlpZiAoZWZ1c2VUeXBlID09IEVGVVNFX1dJRkkpCi0JCQkqcHUyVG1wID0gRUZVU0VfUkVBTF9DT05URU5UX0xFTl84NzIzQTsKLQkJZWxzZQotCQkJKnB1MlRtcCA9IEVGVVNFX0JUX1JFQUxfQ09OVEVOVF9MRU47Ci0JCWJyZWFrOwotCi0JY2FzZSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19CQU5LOgotCQlwdTJUbXAgPSBwT3V0OwotCi0JCWlmIChlZnVzZVR5cGUgPT0gRUZVU0VfV0lGSSkKLQkJCSpwdTJUbXAgPSAoRUZVU0VfUkVBTF9DT05URU5UX0xFTl84NzIzQSAtCi0JCQkJICAgRUZVU0VfT09CX1BST1RFQ1RfQllURVMpOwotCQllbHNlCi0JCQkqcHUyVG1wID0gKEVGVVNFX0JUX1JFQUxfQkFOS19DT05URU5UX0xFTiAtCi0JCQkJICAgRUZVU0VfUFJPVEVDVF9CWVRFU19CQU5LKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX1RPVEFMOgotCQlwdTJUbXAgPSBwT3V0OwotCi0JCWlmIChlZnVzZVR5cGUgPT0gRUZVU0VfV0lGSSkKLQkJCSpwdTJUbXAgPSAoRUZVU0VfUkVBTF9DT05URU5UX0xFTl84NzIzQSAtCi0JCQkJICAgRUZVU0VfT09CX1BST1RFQ1RfQllURVMpOwotCQllbHNlCi0JCQkqcHUyVG1wID0gKEVGVVNFX0JUX1JFQUxfQ09OVEVOVF9MRU4gLQotCQkJCSAgIChFRlVTRV9QUk9URUNUX0JZVEVTX0JBTksgKiAzKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUWVBFX0VGVVNFX01BUF9MRU46Ci0JCXB1MlRtcCA9IHBPdXQ7Ci0KLQkJaWYgKGVmdXNlVHlwZSA9PSBFRlVTRV9XSUZJKQotCQkJKnB1MlRtcCA9IEVGVVNFX01BUF9MRU5fODcyM0E7Ci0JCWVsc2UKLQkJCSpwdTJUbXAgPSBFRlVTRV9CVF9NQVBfTEVOOwotCQlicmVhazsKLQotCWNhc2UgVFlQRV9FRlVTRV9QUk9URUNUX0JZVEVTX0JBTks6Ci0JCXB1MVRtcCA9IHBPdXQ7Ci0KLQkJaWYgKGVmdXNlVHlwZSA9PSBFRlVTRV9XSUZJKQotCQkJKnB1MVRtcCA9IEVGVVNFX09PQl9QUk9URUNUX0JZVEVTOwotCQllbHNlCi0JCQkqcHUxVG1wID0gRUZVU0VfUFJPVEVDVF9CWVRFU19CQU5LOwotCQlicmVhazsKLQotCWNhc2UgVFlQRV9FRlVTRV9DT05URU5UX0xFTl9CQU5LOgotCQlwdTJUbXAgPSBwT3V0OwotCi0JCWlmIChlZnVzZVR5cGUgPT0gRUZVU0VfV0lGSSkKLQkJCSpwdTJUbXAgPSBFRlVTRV9SRUFMX0NPTlRFTlRfTEVOXzg3MjNBOwotCQllbHNlCi0JCQkqcHUyVG1wID0gRUZVU0VfQlRfUkVBTF9CQU5LX0NPTlRFTlRfTEVOOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXB1MVRtcCA9IHBPdXQ7Ci0JCSpwdTFUbXAgPSAwOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qIENvcHkgZnJvbSBXTUFDIGZvciBFRlVTRSByZWFkIDEgYnl0ZS4gKi8KLXU4IEVGVVNFX1JlYWQxQnl0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUxNiBBZGRyZXNzKQotewotCXU4CWRhdGE7Ci0JdTgJQnl0ZXRlbXAgPSB7MHgwMH07Ci0JdTgJdGVtcCA9IHsweDAwfTsKLQl1MzIJayA9IDA7Ci0JdTE2CWNvbnRlbnRMZW4gPSAwOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKEFkYXB0ZXIsIEVGVVNFX1dJRkksCi0JCQkJIFRZUEVfRUZVU0VfUkVBTF9DT05URU5UX0xFTiwKLQkJCQkgKHZvaWQgKikmY29udGVudExlbik7Ci0KLQlpZiAoQWRkcmVzcyA8IGNvbnRlbnRMZW4pIHsgLyogRS1mdXNlIDUxMkJ5dGUgKi8KLQkJLyogV3JpdGUgRS1mdXNlIFJlZ2lzdGVyIGFkZHJlc3MgYml0MH43ICovCi0JCXRlbXAgPSBBZGRyZXNzICYgMHhGRjsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBFRlVTRV9DVFJMKzEsIHRlbXApOwotCQlCeXRldGVtcCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBFRlVTRV9DVFJMKzIpOwotCQkvKiBXcml0ZSBFLWZ1c2UgUmVnaXN0ZXIgYWRkcmVzcyBiaXQ4fjkgKi8KLQkJdGVtcCA9ICgoQWRkcmVzcyA+PiA4KSAmIDB4MDMpIHwgKEJ5dGV0ZW1wICYgMHhGQyk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgRUZVU0VfQ1RSTCsyLCB0ZW1wKTsKLQotCQkvKiBXcml0ZSAweDMwWzMxXT0gMCAqLwotCQlCeXRldGVtcCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBFRlVTRV9DVFJMKzMpOwotCQl0ZW1wID0gQnl0ZXRlbXAgJiAweDdGOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMywgdGVtcCk7Ci0KLQkJLyogV2FpdCBXcml0ZS1yZWFkeSAoMHgzMFszMV09IDEpICovCi0JCUJ5dGV0ZW1wID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMyk7Ci0JCXdoaWxlICghKEJ5dGV0ZW1wICYgMHg4MCkpIHsKLQkJCUJ5dGV0ZW1wID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIEVGVVNFX0NUUkwrMyk7Ci0JCQlrKys7Ci0JCQlpZiAoayA9PSAxMDAwKSB7Ci0JCQkJayA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZGF0YSA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBFRlVTRV9DVFJMKTsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCXJldHVybiAweEZGOwotfQotCi0vKiBSZWFkIG9uZSBieXRlIGZyb20gcmVhbCBFZnVzZS4gKi8KLWludCBlZnVzZV9PbmVCeXRlUmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MTYgYWRkciwgdTggKmRhdGEpCi17Ci0JdTgJdG1waWR4ID0gMDsKLQlpbnQJYlJlc3VsdDsKLQotCS8qICAtLS0tLS0tLS0tLS0tLS0tLWUtZnVzZSByZWcgY3RybCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JLyogYWRkcmVzcyAqLwotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAxLCAodTgpKGFkZHIgJiAweGZmKSk7Ci0JcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgRUZVU0VfQ1RSTCArIDIsCi0JCQkgKCh1OCkoKGFkZHIgPj4gOCkgJiAweDAzKSkgfAotCQkJIChydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAyKSAmIDB4RkMpKTsKLQotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAzLCAweDcyKTsgLyogcmVhZCBjbWQgKi8KLQotCXdoaWxlICghKDB4ODAgJiBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIEVGVVNFX0NUUkwgKyAzKSkgJiYKLQkgICAgICAgKHRtcGlkeCA8IDEwMCkpCi0JCXRtcGlkeCsrOwotCWlmICh0bXBpZHggPCAxMDApIHsKLQkJKmRhdGEgPSBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIEVGVVNFX0NUUkwpOwotCQliUmVzdWx0ID0gX1NVQ0NFU1M7Ci0JfSBlbHNlIHsKLQkJKmRhdGEgPSAweGZmOwotCQliUmVzdWx0ID0gX0ZBSUw7Ci0JfQotCXJldHVybiBiUmVzdWx0OwotfQotCi0vKiBXcml0ZSBvbmUgYnl0ZSB0byByZWFsZCBFZnVzZS4gKi8KLWludCBlZnVzZV9PbmVCeXRlV3JpdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTE2IGFkZHIsIHU4IGRhdGEpCi17Ci0JdTgJdG1waWR4ID0gMDsKLQlpbnQJYlJlc3VsdDsKLQotCS8qIHJldHVybgkwOyAqLwotCi0JLyogIC0tLS0tLS0tLS0tLS0tLS0tZS1mdXNlIHJlZyBjdHJsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQkvKiBhZGRyZXNzICovCi0JcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgRUZVU0VfQ1RSTCArIDEsICh1OCkoYWRkciAmIDB4ZmYpKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBFRlVTRV9DVFJMICsgMiwKLQkJCSAocnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLCBFRlVTRV9DVFJMICsgMikgJiAweEZDKSB8Ci0JCQkgKHU4KSgoYWRkciA+PiA4KSAmIDB4MDMpKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBFRlVTRV9DVFJMLCBkYXRhKTsgLyogZGF0YSAqLwotCi0JcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgRUZVU0VfQ1RSTCArIDMsIDB4RjIpOyAvKiB3cml0ZSBjbWQgKi8KLQotCXdoaWxlICgoMHg4MCAmIHJ0bDg3MjNhdV9yZWFkOChwQWRhcHRlciwgRUZVU0VfQ1RSTCArIDMpKSAmJgotCSAgICAgICAodG1waWR4IDwgMTAwKSkgewotCQl0bXBpZHgrKzsKLQl9Ci0KLQlpZiAodG1waWR4IDwgMTAwKQotCQliUmVzdWx0ID0gX1NVQ0NFU1M7Ci0JZWxzZQotCQliUmVzdWx0ID0gX0ZBSUw7Ci0KLQlyZXR1cm4gYlJlc3VsdDsKLX0KLQotLyogUmVhZCBhbGxvd2VkIHdvcmQgaW4gY3VycmVudCBlZnVzZSBzZWN0aW9uIGRhdGEuICovCi12b2lkIGVmdXNlX1dvcmRFbmFibGVEYXRhUmVhZDIzYSh1OCB3b3JkX2VuLCB1OCAqc291cmRhdGEsIHU4ICp0YXJnZXRkYXRhKQotewotCWlmICghKHdvcmRfZW4mQklUKDApKSkgewotCQl0YXJnZXRkYXRhWzBdID0gc291cmRhdGFbMF07Ci0JCXRhcmdldGRhdGFbMV0gPSBzb3VyZGF0YVsxXTsKLQl9Ci0JaWYgKCEod29yZF9lbiZCSVQoMSkpKSB7Ci0JCXRhcmdldGRhdGFbMl0gPSBzb3VyZGF0YVsyXTsKLQkJdGFyZ2V0ZGF0YVszXSA9IHNvdXJkYXRhWzNdOwotCX0KLQlpZiAoISh3b3JkX2VuJkJJVCgyKSkpIHsKLQkJdGFyZ2V0ZGF0YVs0XSA9IHNvdXJkYXRhWzRdOwotCQl0YXJnZXRkYXRhWzVdID0gc291cmRhdGFbNV07Ci0JfQotCWlmICghKHdvcmRfZW4mQklUKDMpKSkgewotCQl0YXJnZXRkYXRhWzZdID0gc291cmRhdGFbNl07Ci0JCXRhcmdldGRhdGFbN10gPSBzb3VyZGF0YVs3XTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZWZ1c2VfcmVhZDgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHJlc3MsIHU4ICp2YWx1ZSkKLXsKLQlyZXR1cm4gZWZ1c2VfT25lQnl0ZVJlYWQyM2EocGFkYXB0ZXIsIGFkZHJlc3MsIHZhbHVlKTsKLX0KLQotc3RhdGljIGludCBlZnVzZV93cml0ZTgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHJlc3MsIHU4ICp2YWx1ZSkKLXsKLQlyZXR1cm4gZWZ1c2VfT25lQnl0ZVdyaXRlMjNhKHBhZGFwdGVyLCBhZGRyZXNzLCAqdmFsdWUpOwotfQotCi0vKiByZWFkL3dyaXRlIHJhdyBlZnVzZSBkYXRhICovCi1pbnQgcnR3X2VmdXNlX2FjY2VzczIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiV3JpdGUsIHUxNiBzdGFydF9hZGRyLAotCQkJdTE2IGNudHMsIHU4ICpkYXRhKQotewotCWludCBpID0gMDsKLQl1MTYgcmVhbF9jb250ZW50X2xlbiA9IDAsIG1heF9hdmFpbGFibGVfc2l6ZSA9IDA7Ci0JaW50IHJlcyA9IF9GQUlMOwotCWludCAoKnJ3OCkoc3RydWN0IHJ0d19hZGFwdGVyICosIHUxNiwgdTgqKTsKLQotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShwYWRhcHRlciwgRUZVU0VfV0lGSSwKLQkJCQkgVFlQRV9FRlVTRV9SRUFMX0NPTlRFTlRfTEVOLAotCQkJCSAodm9pZCAqKSZyZWFsX2NvbnRlbnRfbGVuKTsKLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2EocGFkYXB0ZXIsIEVGVVNFX1dJRkksCi0JCQkJIFRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX1RPVEFMLAotCQkJCSAodm9pZCAqKSZtYXhfYXZhaWxhYmxlX3NpemUpOwotCi0JaWYgKHN0YXJ0X2FkZHIgPiByZWFsX2NvbnRlbnRfbGVuKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlpZiAodHJ1ZSA9PSBiV3JpdGUpIHsKLQkJaWYgKChzdGFydF9hZGRyICsgY250cykgPiBtYXhfYXZhaWxhYmxlX3NpemUpCi0JCQlyZXR1cm4gX0ZBSUw7Ci0JCXJ3OCA9ICZlZnVzZV93cml0ZTg7Ci0JfSBlbHNlCi0JCXJ3OCA9ICZlZnVzZV9yZWFkODsKLQotCUVmdXNlX1Bvd2VyU3dpdGNoKHBhZGFwdGVyLCBiV3JpdGUsIHRydWUpOwotCi0JLyogZS1mdXNlIG9uZSBieXRlIHJlYWQvd3JpdGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY250czsgaSsrKSB7Ci0JCWlmIChzdGFydF9hZGRyID49IHJlYWxfY29udGVudF9sZW4pIHsKLQkJCXJlcyA9IF9GQUlMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXMgPSBydzgocGFkYXB0ZXIsIHN0YXJ0X2FkZHIrKywgZGF0YSsrKTsKLQkJaWYgKHJlcyA9PSBfRkFJTCkKLQkJCWJyZWFrOwotCX0KLQotCUVmdXNlX1Bvd2VyU3dpdGNoKHBhZGFwdGVyLCBiV3JpdGUsIGZhbHNlKTsKLQotCXJldHVybiByZXM7Ci19Ci0KLXUxNiBlZnVzZV9HZXRNYXhTaXplMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTE2IG1heF9zaXplOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9XSUZJLAotCQkJCSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19UT1RBTCwKLQkJCQkgKHZvaWQgKikmbWF4X3NpemUpOwotCXJldHVybiBtYXhfc2l6ZTsKLX0KLQotaW50IHJ0d19lZnVzZV9tYXBfcmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1MTYgYWRkciwgdTE2IGNudHMsIHU4ICpkYXRhKQotewotCXUxNiBtYXBMZW4gPSAwOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9XSUZJLAotCQkJCSBUWVBFX0VGVVNFX01BUF9MRU4sICh2b2lkICopJm1hcExlbik7Ci0KLQlpZiAoKGFkZHIgKyBjbnRzKSA+IG1hcExlbikKLQkJcmV0dXJuIF9GQUlMOwotCi0JRWZ1c2VfUG93ZXJTd2l0Y2gocGFkYXB0ZXIsIGZhbHNlLCB0cnVlKTsKLQotCXJ0bDg3MjNhX3JlYWRlZnVzZShwYWRhcHRlciwgRUZVU0VfV0lGSSwgYWRkciwgY250cywgZGF0YSk7Ci0KLQlFZnVzZV9Qb3dlclN3aXRjaChwYWRhcHRlciwgZmFsc2UsIGZhbHNlKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotaW50IHJ0d19CVF9lZnVzZV9tYXBfcmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICB1MTYgYWRkciwgdTE2IGNudHMsIHU4ICpkYXRhKQotewotCXUxNiBtYXBMZW4gPSAwOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9CVCwKLQkJCQkgVFlQRV9FRlVTRV9NQVBfTEVOLCAodm9pZCAqKSZtYXBMZW4pOwotCi0JaWYgKChhZGRyICsgY250cykgPiBtYXBMZW4pCi0JCXJldHVybiBfRkFJTDsKLQotCUVmdXNlX1Bvd2VyU3dpdGNoKHBhZGFwdGVyLCBmYWxzZSwgdHJ1ZSk7Ci0KLQlydGw4NzIzYV9yZWFkZWZ1c2UocGFkYXB0ZXIsIEVGVVNFX0JULCBhZGRyLCBjbnRzLCBkYXRhKTsKLQotCUVmdXNlX1Bvd2VyU3dpdGNoKHBhZGFwdGVyLCBmYWxzZSwgZmFsc2UpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKiBSZWFkIEFsbCBFZnVzZSBjb250ZW50ICovCi1zdGF0aWMgdm9pZCBFZnVzZV9SZWFkQWxsTWFwKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IGVmdXNlVHlwZSwKLQkJCSAgICAgdTggKkVmdXNlKQotewotCXUxNgltYXBMZW4gPSAwOwotCi0JRWZ1c2VfUG93ZXJTd2l0Y2gocEFkYXB0ZXIsIGZhbHNlLCB0cnVlKTsKLQotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShwQWRhcHRlciwgZWZ1c2VUeXBlLCBUWVBFX0VGVVNFX01BUF9MRU4sCi0JCQkJICh2b2lkICopJm1hcExlbik7Ci0KLQlydGw4NzIzYV9yZWFkZWZ1c2UocEFkYXB0ZXIsIGVmdXNlVHlwZSwgMCwgbWFwTGVuLCBFZnVzZSk7Ci0KLQlFZnVzZV9Qb3dlclN3aXRjaChwQWRhcHRlciwgZmFsc2UsIGZhbHNlKTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uczoJZWZ1c2VfU2hhZG93UmVhZDFCeXRlCi0gKgkJZWZ1c2VfU2hhZG93UmVhZDJCeXRlCi0gKgkJZWZ1c2VfU2hhZG93UmVhZDRCeXRlCi0gKgotICogUmVhZCBmcm9tIGVmdXNlIGluaXQgbWFwIGJ5IG9uZS90d28vZm91ciBieXRlcwotICovCi1zdGF0aWMgdm9pZCBlZnVzZV9TaGFkb3dSZWFkMUJ5dGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTE2IE9mZnNldCwKLQkJCQkgIHU4ICpWYWx1ZSkKLXsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYocEFkYXB0ZXIpOwotCi0JKlZhbHVlID0gcEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGFbT2Zmc2V0XTsKLX0KLQotc3RhdGljIHZvaWQgZWZ1c2VfU2hhZG93UmVhZDJCeXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUxNiBPZmZzZXQsCi0JCQkJICB1MTYgKlZhbHVlKQotewotCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihwQWRhcHRlcik7Ci0KLQkqVmFsdWUgPSBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YVtPZmZzZXRdOwotCSpWYWx1ZSB8PSBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YVtPZmZzZXQrMV08PDg7Ci19Ci0KLXN0YXRpYyB2b2lkIGVmdXNlX1NoYWRvd1JlYWQ0Qnl0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MTYgT2Zmc2V0LAotCQkJCSAgdTMyICpWYWx1ZSkKLXsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYocEFkYXB0ZXIpOwotCi0JKlZhbHVlID0gcEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGFbT2Zmc2V0XTsKLQkqVmFsdWUgfD0gcEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGFbT2Zmc2V0KzFdPDw4OwotCSpWYWx1ZSB8PSBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YVtPZmZzZXQrMl08PDE2OwotCSpWYWx1ZSB8PSBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YVtPZmZzZXQrM108PDI0OwotfQotCi0vKiBUcmFuc2ZlciBjdXJyZW50IEVGVVNFIGNvbnRlbnQgdG8gc2hhZG93IGluaXQgYW5kIG1vZGlmeSBtYXAuICovCi12b2lkIEVGVVNFX1NoYWRvd01hcFVwZGF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBlZnVzZVR5cGUpCi17Ci0Jc3RydWN0IGVlcHJvbV9wcml2ICpwRUVQUk9NID0gR0VUX0VFUFJPTV9FRlVTRV9QUklWKHBBZGFwdGVyKTsKLQl1MTYJbWFwTGVuID0gMDsKLQotCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShwQWRhcHRlciwgZWZ1c2VUeXBlLAotCQkJCSBUWVBFX0VGVVNFX01BUF9MRU4sICh2b2lkICopJm1hcExlbik7Ci0KLQlpZiAocEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyA9PSB0cnVlKQotCQltZW1zZXQocEVFUFJPTS0+ZWZ1c2VfZWVwcm9tX2RhdGEsIDB4RkYsIG1hcExlbik7Ci0JZWxzZQotCQlFZnVzZV9SZWFkQWxsTWFwKHBBZGFwdGVyLCBlZnVzZVR5cGUsCi0JCQkJIHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhKTsKLX0KLQotLyogUmVhZCBmcm9tIGVmdXNlIGluaXQgbWFwICovCi12b2lkIEVGVVNFX1NoYWRvd1JlYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggVHlwZSwKLQkJCSB1MTYgT2Zmc2V0LCB1MzIgKlZhbHVlKQotewotCWlmIChUeXBlID09IDEpCi0JCWVmdXNlX1NoYWRvd1JlYWQxQnl0ZShwQWRhcHRlciwgT2Zmc2V0LCAodTggKilWYWx1ZSk7Ci0JZWxzZSBpZiAoVHlwZSA9PSAyKQotCQllZnVzZV9TaGFkb3dSZWFkMkJ5dGUocEFkYXB0ZXIsIE9mZnNldCwgKHUxNiAqKVZhbHVlKTsKLQllbHNlIGlmIChUeXBlID09IDQpCi0JCWVmdXNlX1NoYWRvd1JlYWQ0Qnl0ZShwQWRhcHRlciwgT2Zmc2V0LCAodTMyICopVmFsdWUpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19pZWVlODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfaWVlZTgwMjExLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YTY0OTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19pZWVlODAyMTEuYworKysgL2Rldi9udWxsCkBAIC0xLDg1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0lFRUU4MDIxMV9DCi0KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KLSNpbmNsdWRlIDxpZWVlODAyMTEuaD4KLSNpbmNsdWRlIDx3aWZpLmg+Ci0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPHdsYW5fYnNzZGVmLmg+Ci0KLXU4IFJUV19XUEFfT1VJMjNBX1RZUEVbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMSB9OwotdTE2IFJUV19XUEFfVkVSU0lPTjIzQSA9IDE7Ci11OCBXUEFfQVVUSF9LRVlfTUdNVF9OT05FMjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDAgfTsKLXU4IFdQQV9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVgyM0FbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMSB9OwotdTggV1BBX0FVVEhfS0VZX01HTVRfUFNLX09WRVJfODAyXzFYMjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDIgfTsKLXU4IFdQQV9DSVBIRVJfU1VJVEVfTk9ORTIzQVtdID0geyAweDAwLCAweDUwLCAweGYyLCAwIH07Ci11OCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDQwMjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDEgfTsKLXU4IFdQQV9DSVBIRVJfU1VJVEVfVEtJUDIzQVtdID0geyAweDAwLCAweDUwLCAweGYyLCAyIH07Ci11OCBXUEFfQ0lQSEVSX1NVSVRFX1dSQVAyM0FbXSA9IHsgMHgwMCwgMHg1MCwgMHhmMiwgMyB9OwotdTggV1BBX0NJUEhFUl9TVUlURV9DQ01QMjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDQgfTsKLXU4IFdQQV9DSVBIRVJfU1VJVEVfV0VQMTA0MjNBW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDUgfTsKLQotdTggUlNOX0FVVEhfS0VZX01HTVRfVU5TUEVDXzgwMl8xWDIzQVtdID0geyAweDAwLCAweDBmLCAweGFjLCAxIH07Ci11OCBSU05fQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVgyM0FbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYywgMiB9OwotdTggUlNOX0NJUEhFUl9TVUlURV9OT05FMjNBW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDAgfTsKLXU4IFJTTl9DSVBIRVJfU1VJVEVfV0VQNDAyM0FbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYywgMSB9OwotdTggUlNOX0NJUEhFUl9TVUlURV9US0lQMjNBW10gPSB7IDB4MDAsIDB4MGYsIDB4YWMsIDIgfTsKLXU4IFJTTl9DSVBIRVJfU1VJVEVfV1JBUDIzQVtdID0geyAweDAwLCAweDBmLCAweGFjLCAzIH07Ci11OCBSU05fQ0lQSEVSX1NVSVRFX0NDTVAyM0FbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYywgNCB9OwotdTggUlNOX0NJUEhFUl9TVUlURV9XRVAxMDQyM0FbXSA9IHsgMHgwMCwgMHgwZiwgMHhhYywgNSB9OwotLyogICovCi0vKiAgZm9yIGFkaG9jLW1hc3RlciB0byBnZW5lcmF0ZSBpZSBhbmQgcHJvdmlkZSBzdXBwb3J0ZWQtcmF0ZSB0byBmdyAqLwotLyogICovCi0KLXN0YXRpYyB1OCBXSUZJX0NDS1JBVEVTW10gPSB7Ci0JSUVFRTgwMjExX0NDS19SQVRFXzFNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzJNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzVNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzExTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLCi19OwotCi1zdGF0aWMgdTggV0lGSV9PRkRNUkFURVNbXSA9IHsKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzZNQiwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzlNQiwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIsCi0JSUVFRTgwMjExX09GRE1fUkFURV8xOE1CLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQiwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUIsCi0JSUVFRTgwMjExX09GRE1fUkFURV80OE1CLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQgotfTsKLQotaW50IHJ0d19nZXRfYml0X3ZhbHVlX2Zyb21faWVlZV92YWx1ZTIzYSh1OCB2YWwpCi17Ci0JdW5zaWduZWQgY2hhciBkb3QxMV9yYXRlX3RhYmxlW109Ci0JCXsyLCA0LCAxMSwgMjIsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNzIsIDk2LCAxMDgsIDB9OwotCi0JaW50IGkgPSAwOwotCi0Jd2hpbGUgKGRvdDExX3JhdGVfdGFibGVbaV0gIT0gMCkgewotCQlpZiAoZG90MTFfcmF0ZV90YWJsZVtpXSA9PSB2YWwpCi0JCQlyZXR1cm4gQklUKGkpOwotCQlpKys7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBydHdfaXNfY2NrcmF0ZXNfaW5jbHVkZWQodTggKnJhdGUpCi17Ci0JdTMyIGkgPSAwOwotCi0Jd2hpbGUgKHJhdGVbaV0pIHsKLQkJaWYgKChyYXRlW2ldICYgMHg3ZikgPT0gMiB8fCAocmF0ZVtpXSAmIDB4N2YpID09IDQgfHwKLQkJICAgIChyYXRlW2ldICYgMHg3ZikgPT0gMTEgfHwgKHJhdGVbaV0gJiAweDdmKSA9PSAyMikKLQkJCXJldHVybiB0cnVlOwotCQlpKys7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBydHdfaXNfY2NrcmF0ZXNvbmx5X2luY2x1ZGVkKHU4ICpyYXRlKQotewotCXUzMiBpID0gMDsKLQotCXdoaWxlIChyYXRlW2ldKSB7Ci0JCWlmICgocmF0ZVtpXSAmIDB4N2YpICE9IDIgJiYgKHJhdGVbaV0gJiAweDdmKSAhPSA0ICYmCi0JCSAgICAocmF0ZVtpXSAmIDB4N2YpICE9IDExICYmIChyYXRlW2ldICYgMHg3ZikgIT0gMjIpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaSsrOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi1pbnQgcnR3X2NoZWNrX25ldHdvcmtfdHlwZTIzYSh1bnNpZ25lZCBjaGFyICpyYXRlLCBpbnQgcmF0ZWxlbiwgaW50IGNoYW5uZWwpCi17Ci0JaWYgKGNoYW5uZWwgPiAxNCkgewotCQlpZiAocnR3X2lzX2Nja3JhdGVzX2luY2x1ZGVkKHJhdGUpKQotCQkJcmV0dXJuIFdJUkVMRVNTX0lOVkFMSUQ7Ci0JCWVsc2UKLQkJCXJldHVybiBXSVJFTEVTU18xMUE7Ci0JfSBlbHNlIHsgIC8qICBjb3VsZCBiZSBwdXJlIEIsIHB1cmUgRywgb3IgQi9HICovCi0JCWlmIChydHdfaXNfY2NrcmF0ZXNvbmx5X2luY2x1ZGVkKHJhdGUpKQotCQkJcmV0dXJuIFdJUkVMRVNTXzExQjsKLQkJZWxzZSBpZiAocnR3X2lzX2Nja3JhdGVzX2luY2x1ZGVkKHJhdGUpKQotCQkJcmV0dXJuCVdJUkVMRVNTXzExQkc7Ci0JCWVsc2UKLQkJCXJldHVybiBXSVJFTEVTU18xMUc7Ci0JfQotfQotCi0vKiAgcnR3X3NldF9pZTIzYSB3aWxsIHVwZGF0ZSBmcmFtZSBsZW5ndGggKi8KLXU4ICpydHdfc2V0X2llMjNhKHU4ICpwYnVmLCBpbnQgaW5kZXgsIHVpbnQgbGVuLCBjb25zdCB1OCAqc291cmNlLCB1aW50ICpmcmxlbikKLXsKLQotCSpwYnVmID0gKHU4KWluZGV4OwotCi0JKihwYnVmICsgMSkgPSAodTgpbGVuOwotCi0JaWYgKGxlbiA+IDApCi0JCW1lbWNweSgodm9pZCAqKShwYnVmICsgMiksICh2b2lkICopc291cmNlLCBsZW4pOwotCi0JKmZybGVuID0gKmZybGVuICsgKGxlbiArIDIpOwotCi0JcmV0dXJuIHBidWYgKyBsZW4gKyAyOwotfQotCi1pbmxpbmUgdTggKnJ0d19zZXRfaWUyM2FfY2hfc3dpdGNoICh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sIHU4IGNoX3N3aXRjaF9tb2RlLAotCQkJCXU4IG5ld19jaCwgdTggY2hfc3dpdGNoX2NudCkKLXsKLQl1OCBpZV9kYXRhWzNdOwotCi0JaWVfZGF0YVswXSA9IGNoX3N3aXRjaF9tb2RlOwotCWllX2RhdGFbMV0gPSBuZXdfY2g7Ci0JaWVfZGF0YVsyXSA9IGNoX3N3aXRjaF9jbnQ7Ci0JcmV0dXJuIHJ0d19zZXRfaWUyM2EoYnVmLCBXTEFOX0VJRF9DSEFOTkVMX1NXSVRDSCwgIDMsIGllX2RhdGEsIGJ1Zl9sZW4pOwotfQotCi1pbmxpbmUgdTggaGFsX2NoX29mZnNldF90b19zZWNvbmRhcnlfY2hfb2Zmc2V0MjNhKHU4IGNoX29mZnNldCkKLXsKLQlpZiAoY2hfb2Zmc2V0ID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUikKLQkJcmV0dXJuIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOwotCWVsc2UgaWYgKGNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCXJldHVybiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRTsKLQotCXJldHVybiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOwotfQotCi1pbmxpbmUgdTggKnJ0d19zZXRfaWUyM2Ffc2Vjb25kYXJ5X2NoX29mZnNldCh1OCAqYnVmLCB1MzIgKmJ1Zl9sZW4sCi0JCQkJCSAgdTggc2Vjb25kYXJ5X2NoX29mZnNldCkKLXsKLQlyZXR1cm4gcnR3X3NldF9pZTIzYShidWYsIFdMQU5fRUlEX1NFQ09OREFSWV9DSEFOTkVMX09GRlNFVCwKLQkJCSAgMSwgJnNlY29uZGFyeV9jaF9vZmZzZXQsIGJ1Zl9sZW4pOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWluZGV4OiB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCBpZCBpbmRleCwgbGltaXQgaXMgdGhlIGxpbWl0IGZvciBzZWFyY2gKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXU4ICpydHdfZ2V0X2llMjNhKHU4ICpwYnVmLCBpbnQgaW5kZXgsIGludCAqbGVuLCBpbnQgbGltaXQpCi17Ci0JaW50IHRtcCwgaTsKLQl1OCAqcDsKLQotCWlmIChsaW1pdCA8IDEpIHsKLQotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlwID0gcGJ1ZjsKLQlpID0gMDsKLQkqbGVuID0gMDsKLQl3aGlsZSAoMSkgewotCQlpZiAoKnAgPT0gaW5kZXgpIHsKLQkJCSpsZW4gPSAqKHAgKyAxKTsKLQkJCXJldHVybiBwOwotCQl9IGVsc2UgewotCQkJdG1wID0gKihwICsgMSk7Ci0JCQlwICs9ICh0bXAgKyAyKTsKLQkJCWkgKz0gKHRtcCArIDIpOwotCQl9Ci0JCWlmIChpID49IGxpbWl0KQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKgotICogcnR3X2dldF9pZTIzYV9leCAtIFNlYXJjaCBzcGVjaWZpYyBJRSBmcm9tIGEgc2VyaWVzIG9mIElFcwotICogQGluX2llOiBBZGRyZXNzIG9mIElFcyB0byBzZWFyY2gKLSAqIEBpbl9sZW46IExlbmd0aCBsaW1pdCBmcm9tIGluX2llCi0gKiBAZWlkOiBFbGVtZW50IElEIHRvIG1hdGNoCi0gKiBAb3VpOiBPVUkgdG8gbWF0Y2gKLSAqIEBvdWlfbGVuOiBPVUkgbGVuZ3RoCi0gKiBAaWU6IElmIG5vdCBOVUxMIGFuZCB0aGUgc3BlY2lmaWMgSUUgaXMgZm91bmQsIHRoZSBJRSB3aWxsIGJlIGNvcGllZAotICogICAgICB0byB0aGUgYnVmIHN0YXJ0aW5nIGZyb20gdGhlIHNwZWNpZmljIElFCi0gKiBAaWVsZW46IElmIG5vdCBOVUxMIGFuZCB0aGUgc3BlY2lmaWMgSUUgaXMgZm91bmQsIHdpbGwgc2V0IHRvIHRoZSBsZW5ndGgKLSAqICAgICAgICAgb2YgdGhlIGVudGlyZSBJRQotICoKLSAqIFJldHVybnM6IFRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpYyBJRSBmb3VuZCwgb3IgTlVMTAotICovCi11OCAqcnR3X2dldF9pZTIzYV9leCh1OCAqaW5faWUsIHVpbnQgaW5fbGVuLCB1OCBlaWQsIHU4ICpvdWksIHU4IG91aV9sZW4sCi0JCSAgdTggKmllLCB1aW50ICppZWxlbikKLXsKLQl1aW50IGNudDsKLQl1OCAqdGFyZ2V0X2llID0gTlVMTDsKLQotCWlmIChpZWxlbikKLQkJKmllbGVuID0gMDsKLQotCWlmICghaW5faWUgfHwgaW5fbGVuIDw9IDApCi0JCXJldHVybiB0YXJnZXRfaWU7Ci0KLQljbnQgPSAwOwotCi0Jd2hpbGUgKGNudCA8IGluX2xlbikgewotCQlpZiAoZWlkID09IGluX2llW2NudF0gJiYKLQkJICAgICghb3VpIHx8ICFtZW1jbXAoJmluX2llW2NudCsyXSwgb3VpLCBvdWlfbGVuKSkpIHsKLQkJCXRhcmdldF9pZSA9ICZpbl9pZVtjbnRdOwotCi0JCQlpZiAoaWUpCi0JCQkJbWVtY3B5KGllLCAmaW5faWVbY250XSwgaW5faWVbY250KzFdKzIpOwotCi0JCQlpZiAoaWVsZW4pCi0JCQkJKmllbGVuID0gaW5faWVbY250KzFdKzI7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWNudCArPSBpbl9pZVtjbnQgKyAxXSArIDI7IC8qIGdvdG8gbmV4dCAqLwotCQl9Ci0JfQotCi0JcmV0dXJuIHRhcmdldF9pZTsKLX0KLQotLyoqCi0gKiBydHdfaWVzX3JlbW92ZV9pZTIzYSAtIEZpbmQgbWF0Y2hpbmcgSUVzIGFuZCByZW1vdmUKLSAqIEBpZXM6IEFkZHJlc3Mgb2YgSUVzIHRvIHNlYXJjaAotICogQGllc19sZW46IFBvaW50ZXIgb2YgbGVuZ3RoIG9mIGllcywgd2lsbCB1cGRhdGUgdG8gbmV3IGxlbmd0aAotICogQG9mZnNldDogVGhlIG9mZnNldCB0byBzdGFydCBzZWFyY2gKLSAqIEBlaWQ6IEVsZW1lbnQgSUQgdG8gbWF0Y2gKLSAqIEBvdWk6IE9VSSB0byBtYXRjaAotICogQG91aV9sZW46IE9VSSBsZW5ndGgKLSAqCi0gKiBSZXR1cm5zOiBfU1VDQ0VTUzogaWVzIGlzIHVwZGF0ZWQsIF9GQUlMOiBub3QgdXBkYXRlZAotICovCi1pbnQgcnR3X2llc19yZW1vdmVfaWUyM2EodTggKmllcywgdWludCAqaWVzX2xlbiwgdWludCBvZmZzZXQsIHU4IGVpZCwKLQkJICAgICAgdTggKm91aSwgdTggb3VpX2xlbikKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0JdTggKnRhcmdldF9pZTsKLQl1MzIgdGFyZ2V0X2llbGVuOwotCXU4ICpzdGFydDsKLQl1aW50IHNlYXJjaF9sZW47Ci0KLQlpZiAoIWllcyB8fCAhaWVzX2xlbiB8fCAqaWVzX2xlbiA8PSBvZmZzZXQpCi0JCWdvdG8gZXhpdDsKLQotCXN0YXJ0ID0gaWVzICsgb2Zmc2V0OwotCXNlYXJjaF9sZW4gPSAqaWVzX2xlbiAtIG9mZnNldDsKLQotCXdoaWxlICgxKSB7Ci0JCXRhcmdldF9pZSA9IHJ0d19nZXRfaWUyM2FfZXgoc3RhcnQsIHNlYXJjaF9sZW4sIGVpZCwgb3VpLCBvdWlfbGVuLAotCQkJCQkgIE5VTEwsICZ0YXJnZXRfaWVsZW4pOwotCQlpZiAodGFyZ2V0X2llICYmIHRhcmdldF9pZWxlbikgewotCQkJdTggYnVmW01BWF9JRV9TWl0gPSB7MH07Ci0JCQl1OCAqcmVtYWluX2llcyA9IHRhcmdldF9pZSArIHRhcmdldF9pZWxlbjsKLQkJCXVpbnQgcmVtYWluX2xlbiA9IHNlYXJjaF9sZW4gLSAocmVtYWluX2llcyAtIHN0YXJ0KTsKLQotCQkJbWVtY3B5KGJ1ZiwgcmVtYWluX2llcywgcmVtYWluX2xlbik7Ci0JCQltZW1jcHkodGFyZ2V0X2llLCBidWYsIHJlbWFpbl9sZW4pOwotCQkJKmllc19sZW4gPSAqaWVzX2xlbiAtIHRhcmdldF9pZWxlbjsKLQkJCXJldCA9IF9TVUNDRVNTOwotCi0JCQlzdGFydCA9IHRhcmdldF9pZTsKLQkJCXNlYXJjaF9sZW4gPSByZW1haW5fbGVuOwotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9Ci1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcnR3X3NldF9zdXBwb3J0ZWRfcmF0ZTIzYSh1OCAqU3VwcG9ydGVkUmF0ZXMsIHVpbnQgbW9kZSkKLXsKLQotCi0JbWVtc2V0KFN1cHBvcnRlZFJhdGVzLCAwLCBORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVgpOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBXSVJFTEVTU18xMUI6Ci0JCW1lbWNweShTdXBwb3J0ZWRSYXRlcywgV0lGSV9DQ0tSQVRFUywgSUVFRTgwMjExX0NDS19SQVRFX0xFTik7Ci0JCWJyZWFrOwotCi0JY2FzZSBXSVJFTEVTU18xMUc6Ci0JY2FzZSBXSVJFTEVTU18xMUE6Ci0JY2FzZSBXSVJFTEVTU18xMV81TjoKLQljYXNlIFdJUkVMRVNTXzExQV81TjovKiBUb2RvOiBubyBiYXNpYyByYXRlIGZvciBvZmRtID8gKi8KLQkJbWVtY3B5KFN1cHBvcnRlZFJhdGVzLCBXSUZJX09GRE1SQVRFUywKLQkJICAgICAgIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFU0xFTik7Ci0JCWJyZWFrOwotCi0JY2FzZSBXSVJFTEVTU18xMUJHOgotCWNhc2UgV0lSRUxFU1NfMTFHXzI0TjoKLQljYXNlIFdJUkVMRVNTXzExXzI0TjoKLQljYXNlIFdJUkVMRVNTXzExQkdfMjROOgotCQltZW1jcHkoU3VwcG9ydGVkUmF0ZXMsIFdJRklfQ0NLUkFURVMsIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4pOwotCQltZW1jcHkoU3VwcG9ydGVkUmF0ZXMgKyBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOLCBXSUZJX09GRE1SQVRFUywKLQkJICAgICAgIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFU0xFTik7Ci0JCWJyZWFrOwotCX0KLQotfQotCi11aW50IHJ0d19nZXRfcmF0ZXNldF9sZW4yM2EodTggKnJhdGVzZXQpCi17Ci0JdWludCBpID0gMDsKLQotCXdoaWxlKDEpIHsKLQkJaWYgKHJhdGVzZXRbaV0gPT0gMCkKLQkJCWJyZWFrOwotCi0JCWlmIChpID4gMTIpCi0JCQlicmVhazsKLQotCQlpKys7Ci0JfQotCi0JcmV0dXJuIGk7Ci19Ci0KLWludCBydHdfZ2VuZXJhdGVfaWUyM2Eoc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYpCi17Ci0JdTgJd2lyZWxlc3NfbW9kZTsKLQlpbnQJc3ogPSAwLCByYXRlTGVuOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwZGV2X25ldHdvcmsgPSAmcHJlZ2lzdHJ5cHJpdi0+ZGV2X25ldHdvcms7Ci0JdTgJKmllID0gcGRldl9uZXR3b3JrLT5JRXM7Ci0JdTE2CWNhcDsKLQotCXBkZXZfbmV0d29yay0+dHNmID0gMDsKLQotCWNhcCA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOwotCi0JaWYgKHByZWdpc3RyeXByaXYtPnByZWFtYmxlID09IFBSRUFNQkxFX1NIT1JUKQotCQljYXAgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFOwotCi0JaWYgKHBkZXZfbmV0d29yay0+UHJpdmFjeSkKLQkJY2FwIHw9IFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZOwotCi0JcGRldl9uZXR3b3JrLT5jYXBhYmlsaXR5ID0gY2FwOwotCi0JLyogU1NJRCAqLwotCWllID0gcnR3X3NldF9pZTIzYShpZSwgV0xBTl9FSURfU1NJRCwgcGRldl9uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuLAotCQkJcGRldl9uZXR3b3JrLT5Tc2lkLnNzaWQsICZzeik7Ci0KLQkvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KLQlpZiAocHJlZ2lzdHJ5cHJpdi0+d2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU18xMUFCR04pIHsKLQkJaWYgKHBkZXZfbmV0d29yay0+RFNDb25maWcgPiAxNCkKLQkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU18xMUFfNU47Ci0JCWVsc2UKLQkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU18xMUJHXzI0TjsKLQl9IGVsc2UgewotCQl3aXJlbGVzc19tb2RlID0gcHJlZ2lzdHJ5cHJpdi0+d2lyZWxlc3NfbW9kZTsKLQl9Ci0KLQlydHdfc2V0X3N1cHBvcnRlZF9yYXRlMjNhKHBkZXZfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsIHdpcmVsZXNzX21vZGUpIDsKLQotCXJhdGVMZW4gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKHBkZXZfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCi0JaWYgKHJhdGVMZW4gPiA4KSB7Ci0JCWllID0gcnR3X3NldF9pZTIzYShpZSwgV0xBTl9FSURfU1VQUF9SQVRFUywgOCwKLQkJCQlwZGV2X25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLCAmc3opOwotCQkvKiBpZSA9IHJ0d19zZXRfaWUyM2EoaWUsIF9FWFRfU1VQUE9SVEVEUkFURVNfSUVfLCAocmF0ZUxlbiAtIDgpLCAocGRldl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyArIDgpLCAmc3opOyAqLwotCX0gZWxzZSB7Ci0JCWllID0gcnR3X3NldF9pZTIzYShpZSwgV0xBTl9FSURfU1VQUF9SQVRFUywgcmF0ZUxlbiwKLQkJCQlwZGV2X25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLCAmc3opOwotCX0KLQotCS8qIERTIHBhcmFtZXRlciBzZXQgKi8KLQlpZSA9IHJ0d19zZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0RTX1BBUkFNUywgMSwKLQkJCSAgICh1OCAqKSZwZGV2X25ldHdvcmstPkRTQ29uZmlnLCAmc3opOwotCi0JLyogSUJTUyBQYXJhbWV0ZXIgU2V0ICovCi0KLQlpZSA9IHJ0d19zZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0lCU1NfUEFSQU1TLCAyLAotCQkJICAgKHU4ICopJnBkZXZfbmV0d29yay0+QVRJTVdpbmRvdywgJnN6KTsKLQotCWlmIChyYXRlTGVuID4gOCkgewotCQlpZSA9IHJ0d19zZXRfaWUyM2EoaWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLCAocmF0ZUxlbiAtIDgpLAotCQkJCShwZGV2X25ldHdvcmstPlN1cHBvcnRlZFJhdGVzICsgOCksICZzeik7Ci0JfQotCi0KLQotCS8qIHJldHVybiBfU1VDQ0VTUzsgKi8KLQotCXJldHVybiBzejsKLX0KLQotc3RhdGljIGludCBydHdfZ2V0X3dwYV9jaXBoZXJfc3VpdGUoY29uc3QgdTggKnMpCi17Ci0JaWYgKCFtZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9OT05FMjNBLCBXUEFfU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfTk9ORTsKLQlpZiAoIW1lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDQwMjNBLCBXUEFfU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQNDA7Ci0JaWYgKCFtZW1jbXAocywgV1BBX0NJUEhFUl9TVUlURV9US0lQMjNBLCBXUEFfU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfVEtJUDsKLQlpZiAoIW1lbWNtcChzLCBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAyM0EsIFdQQV9TRUxFQ1RPUl9MRU4pKQotCQlyZXR1cm4gV1BBX0NJUEhFUl9DQ01QOwotCWlmICghbWVtY21wKHMsIFdQQV9DSVBIRVJfU1VJVEVfV0VQMTA0MjNBLCBXUEFfU0VMRUNUT1JfTEVOKSkKLQkJcmV0dXJuIFdQQV9DSVBIRVJfV0VQMTA0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2dldF93cGEyX2NpcGhlcl9zdWl0ZShjb25zdCB1OCAqcykKLXsKLQlpZiAoIW1lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX05PTkUyM0EsIFJTTl9TRUxFQ1RPUl9MRU4pKQotCQlyZXR1cm4gV1BBX0NJUEhFUl9OT05FOwotCWlmICghbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfV0VQNDAyM0EsIFJTTl9TRUxFQ1RPUl9MRU4pKQotCQlyZXR1cm4gV1BBX0NJUEhFUl9XRVA0MDsKLQlpZiAoIW1lbWNtcChzLCBSU05fQ0lQSEVSX1NVSVRFX1RLSVAyM0EsIFJTTl9TRUxFQ1RPUl9MRU4pKQotCQlyZXR1cm4gV1BBX0NJUEhFUl9US0lQOwotCWlmICghbWVtY21wKHMsIFJTTl9DSVBIRVJfU1VJVEVfQ0NNUDIzQSwgUlNOX1NFTEVDVE9SX0xFTikpCi0JCXJldHVybiBXUEFfQ0lQSEVSX0NDTVA7Ci0JaWYgKCFtZW1jbXAocywgUlNOX0NJUEhFUl9TVUlURV9XRVAxMDQyM0EsIFJTTl9TRUxFQ1RPUl9MRU4pKQotCQlyZXR1cm4gV1BBX0NJUEhFUl9XRVAxMDQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0d19wYXJzZV93cGFfaWUyM2EoY29uc3QgdTggKndwYV9pZSwgaW50IHdwYV9pZV9sZW4sIGludCAqZ3JvdXBfY2lwaGVyLAotCQkJaW50ICpwYWlyd2lzZV9jaXBoZXIsIGludCAqaXNfODAyMXgpCi17Ci0JaW50IGksIHJldCA9IF9TVUNDRVNTOwotCWludCBsZWZ0LCBjb3VudDsKLQljb25zdCB1OCAqcG9zOwotCi0JaWYgKHdwYV9pZV9sZW4gPD0gMCkgewotCQkvKiBObyBXUEEgSUUgLSBmYWlsIHNpbGVudGx5ICovCi0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAod3BhX2llWzFdICE9ICh1OCkod3BhX2llX2xlbiAtIDIpKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlwb3MgPSB3cGFfaWU7Ci0KLQlwb3MgKz0gODsKLQlsZWZ0ID0gd3BhX2llX2xlbiAtIDg7Ci0KLQkvKiBncm91cF9jaXBoZXIgKi8KLQlpZiAobGVmdCA+PSBXUEFfU0VMRUNUT1JfTEVOKSB7Ci0KLQkJKmdyb3VwX2NpcGhlciA9IHJ0d19nZXRfd3BhX2NpcGhlcl9zdWl0ZShwb3MpOwotCi0JCXBvcyArPSBXUEFfU0VMRUNUT1JfTEVOOwotCQlsZWZ0IC09IFdQQV9TRUxFQ1RPUl9MRU47Ci0JfSBlbHNlIGlmIChsZWZ0ID4gMCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICIlczogaWUgbGVuZ3RoIG1pc21hdGNoLCAldSB0b28gbXVjaFxuIiwKLQkJCSBfX2Z1bmNfXywgbGVmdCk7Ci0KLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCS8qIHBhaXJ3aXNlX2NpcGhlciAqLwotCWlmIChsZWZ0ID49IDIpIHsKLSAgICAgICAgICAgICAgICAvKiBjb3VudCA9IGxlMTZfdG9fY3B1KCoodTE2Kilwb3MpOyAqLwotCQljb3VudCA9IGdldF91bmFsaWduZWRfbGUxNihwb3MpOwotCQlwb3MgKz0gMjsKLQkJbGVmdCAtPSAyOwotCi0JCWlmIChjb3VudCA9PSAwIHx8IGxlZnQgPCBjb3VudCAqIFdQQV9TRUxFQ1RPUl9MRU4pIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICIlczogaWUgY291bnQgYm90Y2ggKHBhaXJ3aXNlKSwgY291bnQgJXUgbGVmdCAldVxuIiwKLQkJCQkgX19mdW5jX18sIGNvdW50LCBsZWZ0KTsKLQkJCXJldHVybiBfRkFJTDsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkqcGFpcndpc2VfY2lwaGVyIHw9IHJ0d19nZXRfd3BhX2NpcGhlcl9zdWl0ZShwb3MpOwotCi0JCQlwb3MgKz0gV1BBX1NFTEVDVE9SX0xFTjsKLQkJCWxlZnQgLT0gV1BBX1NFTEVDVE9SX0xFTjsKLQkJfQotCX0gZWxzZSBpZiAobGVmdCA9PSAxKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBpZSB0b28gc2hvcnQgKGZvciBrZXkgbWdtdClcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCWlmIChpc184MDIxeCkgewotCQlpZiAobGVmdCA+PSA2KSB7Ci0JCQlwb3MgKz0gMjsKLQkJCWlmICghbWVtY21wKHBvcywgUlRXX1dQQV9PVUkyM0FfVFlQRSwgNCkpIHsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkJICIlcyA6IHRoZXJlIGhhcyA4MDIuMXggYXV0aFxuIiwKLQkJCQkJIF9fZnVuY19fKTsKLQkJCQkqaXNfODAyMXggPSAxOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0d19wYXJzZV93cGEyX2llMjNhKGNvbnN0IHU4ICpyc25faWUsIGludCByc25faWVfbGVuLCBpbnQgKmdyb3VwX2NpcGhlciwKLQkJICAgICAgaW50ICpwYWlyd2lzZV9jaXBoZXIsIGludCAqaXNfODAyMXgpCi17Ci0JaW50IGksIHJldCA9IF9TVUNDRVNTOwotCWludCBsZWZ0LCBjb3VudDsKLQljb25zdCB1OCAqcG9zOwotCXU4IFNVSVRFXzFYWzRdID0gezB4MDAsIDB4MGYsIDB4YWMsIDB4MDF9OwotCi0JaWYgKHJzbl9pZV9sZW4gPD0gMCkgewotCQkvKiBObyBSU04gSUUgLSBmYWlsIHNpbGVudGx5ICovCi0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoKnJzbl9pZSAhPSBXTEFOX0VJRF9SU04gfHwgKihyc25faWUrMSkgIT0gKHU4KShyc25faWVfbGVuIC0gMikpIHsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCXBvcyA9IHJzbl9pZTsKLQlwb3MgKz0gNDsKLQlsZWZ0ID0gcnNuX2llX2xlbiAtIDQ7Ci0KLQkvKiBncm91cF9jaXBoZXIgKi8KLQlpZiAobGVmdCA+PSBSU05fU0VMRUNUT1JfTEVOKSB7Ci0JCSpncm91cF9jaXBoZXIgPSBydHdfZ2V0X3dwYTJfY2lwaGVyX3N1aXRlKHBvcyk7Ci0KLQkJcG9zICs9IFJTTl9TRUxFQ1RPUl9MRU47Ci0JCWxlZnQgLT0gUlNOX1NFTEVDVE9SX0xFTjsKLQl9IGVsc2UgaWYgKGxlZnQgPiAwKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBpZSBsZW5ndGggbWlzbWF0Y2gsICV1IHRvbyBtdWNoXG4iLAotCQkJIF9fZnVuY19fLCBsZWZ0KTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCS8qIHBhaXJ3aXNlX2NpcGhlciAqLwotCWlmIChsZWZ0ID49IDIpIHsKLQkgICAgICAgIC8qIGNvdW50ID0gbGUxNl90b19jcHUoKih1MTYqKXBvcyk7ICovCi0JCWNvdW50ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHBvcyk7Ci0JCXBvcyArPSAyOwotCQlsZWZ0IC09IDI7Ci0KLQkJaWYgKGNvdW50ID09IDAgfHwgbGVmdCA8IGNvdW50ICogUlNOX1NFTEVDVE9SX0xFTikgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCQkgIiVzOiBpZSBjb3VudCBib3RjaCAocGFpcndpc2UpLCBjb3VudCAldSBsZWZ0ICV1XG4iLAotCQkJCSBfX2Z1bmNfXywgY291bnQsIGxlZnQpOwotCQkJcmV0dXJuIF9GQUlMOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCSpwYWlyd2lzZV9jaXBoZXIgfD0gcnR3X2dldF93cGEyX2NpcGhlcl9zdWl0ZShwb3MpOwotCi0JCQlwb3MgKz0gUlNOX1NFTEVDVE9SX0xFTjsKLQkJCWxlZnQgLT0gUlNOX1NFTEVDVE9SX0xFTjsKLQkJfQotCX0gZWxzZSBpZiAobGVmdCA9PSAxKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBpZSB0b28gc2hvcnQgKGZvciBrZXkgbWdtdClcbiIsICBfX2Z1bmNfXyk7Ci0KLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCWlmIChpc184MDIxeCkgewotCQlpZiAobGVmdCA+PSA2KSB7Ci0JCQlwb3MgKz0gMjsKLQkJCWlmICghbWVtY21wKHBvcywgU1VJVEVfMVgsIDQpKSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiJXMgKCk6IHRoZXJlIGhhcyA4MDIuMXggYXV0aFxuIiwKLQkJCQkJIF9fZnVuY19fKTsKLQkJCQkqaXNfODAyMXggPSAxOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBydHdfZ2V0X3dwc19hdHRyMjNhIC0gU2VhcmNoIGEgc3BlY2lmaWMgV1BTIGF0dHJpYnV0ZSBmcm9tIGEgZ2l2ZW4gV1BTIElFCi0gKiBAd3BzX2llOiBBZGRyZXNzIG9mIFdQUyBJRSB0byBzZWFyY2gKLSAqIEB3cHNfaWVsZW46IExlbmd0aCBsaW1pdCBmcm9tIHdwc19pZQotICogQHRhcmdldF9hdHRyX2lkOiBUaGUgYXR0cmlidXRlIElEIG9mIFdQUyBhdHRyaWJ1dGUgdG8gc2VhcmNoCi0gKiBAYnVmX2F0dHI6IElmIG5vdCBOVUxMIGFuZCB0aGUgV1BTIGF0dHJpYnV0ZSBpcyBmb3VuZCwgV1BTIGF0dHJpYnV0ZQotICogICAgICAgICAgICB3aWxsIGJlIGNvcGllZCB0byB0aGUgYnVmIHN0YXJ0aW5nIGZyb20gYnVmX2F0dHIKLSAqIEBsZW5fYXR0cjogSWYgbm90IE5VTEwgYW5kIHRoZSBXUFMgYXR0cmlidXRlIGlzIGZvdW5kLCB3aWxsIHNldCB0byB0aGUKLSAqICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBlbnRpcmUgV1BTIGF0dHJpYnV0ZQotICoKLSAqIFJldHVybnM6IHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpYyBXUFMgYXR0cmlidXRlIGZvdW5kLCBvciBOVUxMCi0gKi8KLWNvbnN0IHU4ICpydHdfZ2V0X3dwc19hdHRyMjNhKGNvbnN0IHU4ICp3cHNfaWUsIHVpbnQgd3BzX2llbGVuLAotCQkJICAgICAgdTE2IHRhcmdldF9hdHRyX2lkLCB1OCAqYnVmX2F0dHIsIHUzMiAqbGVuX2F0dHIpCi17Ci0JY29uc3QgdTggKmF0dHJfcHRyID0gTlVMTDsKLQljb25zdCB1OCAqdGFyZ2V0X2F0dHJfcHRyID0gTlVMTDsKLQl1OCB3cHNfb3VpWzRdID0gezB4MDAsIDB4NTAsIDB4RjIsIDB4MDR9OwotCi0JaWYgKGxlbl9hdHRyKQotCQkqbGVuX2F0dHIgPSAwOwotCi0JaWYgKHdwc19pZVswXSAhPSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMgfHwKLQkgICAgbWVtY21wKHdwc19pZSArIDIsIHdwc19vdWksIDQpKSB7Ci0JCXJldHVybiBhdHRyX3B0cjsKLQl9Ci0KLQkvKiAgNiA9IDEoRWxlbWVudCBJRCkgKyAxKExlbmd0aCkgKyA0KFdQUyBPVUkpICovCi0JYXR0cl9wdHIgPSB3cHNfaWUgKyA2OyAvKiBnb3RvIGZpcnN0IGF0dHIgKi8KLQotCXdoaWxlIChhdHRyX3B0ciAtIHdwc19pZSA8IHdwc19pZWxlbikgewotCQkvKiAgNCA9IDIoQXR0cmlidXRlIElEKSArIDIoTGVuZ3RoKSAqLwotCQl1MTYgYXR0cl9pZCA9IGdldF91bmFsaWduZWRfYmUxNihhdHRyX3B0cik7Ci0JCXUxNiBhdHRyX2RhdGFfbGVuID0gZ2V0X3VuYWxpZ25lZF9iZTE2KGF0dHJfcHRyICsgMik7Ci0JCXUxNiBhdHRyX2xlbiA9IGF0dHJfZGF0YV9sZW4gKyA0OwotCi0JCS8qIERCR184NzIzQSgiJXMgYXR0cl9wdHI6JXAsIGlkOiV1LCBsZW5ndGg6JXVcbiIsIF9fZnVuY19fLCBhdHRyX3B0ciwgYXR0cl9pZCwgYXR0cl9kYXRhX2xlbik7ICovCi0JCWlmIChhdHRyX2lkID09IHRhcmdldF9hdHRyX2lkKSB7Ci0JCQl0YXJnZXRfYXR0cl9wdHIgPSBhdHRyX3B0cjsKLQotCQkJaWYgKGJ1Zl9hdHRyKQotCQkJCW1lbWNweShidWZfYXR0ciwgYXR0cl9wdHIsIGF0dHJfbGVuKTsKLQotCQkJaWYgKGxlbl9hdHRyKQotCQkJCSpsZW5fYXR0ciA9IGF0dHJfbGVuOwotCi0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWF0dHJfcHRyICs9IGF0dHJfbGVuOyAvKiBnb3RvIG5leHQgKi8KLQkJfQotCX0KLQotCXJldHVybiB0YXJnZXRfYXR0cl9wdHI7Ci19Ci0KLS8qKgotICogcnR3X2dldF93cHNfYXR0cl9jb250ZW50MjNhIC0gU2VhcmNoIGEgc3BlY2lmaWMgV1BTIGF0dHJpYnV0ZSBjb250ZW50Ci0gKiBmcm9tIGEgZ2l2ZW4gV1BTIElFCi0gKiBAd3BzX2llOiBBZGRyZXNzIG9mIFdQUyBJRSB0byBzZWFyY2gKLSAqIEB3cHNfaWVsZW46IExlbmd0aCBsaW1pdCBmcm9tIHdwc19pZQotICogQHRhcmdldF9hdHRyX2lkOiBUaGUgYXR0cmlidXRlIElEIG9mIFdQUyBhdHRyaWJ1dGUgdG8gc2VhcmNoCi0gKiBAYnVmX2NvbnRlbnQ6IElmIG5vdCBOVUxMIGFuZCB0aGUgV1BTIGF0dHJpYnV0ZSBpcyBmb3VuZCwgV1BTIGF0dHJpYnV0ZQotICogICAgICAgICAgICAgICBjb250ZW50IHdpbGwgYmUgY29waWVkIHRvIHRoZSBidWYgc3RhcnRpbmcgZnJvbSBidWZfY29udGVudAotICogQGxlbl9jb250ZW50OiBJZiBub3QgTlVMTCBhbmQgdGhlIFdQUyBhdHRyaWJ1dGUgaXMgZm91bmQsIHdpbGwgc2V0IHRvIHRoZQotICogICAgICAgICAgICAgICBsZW5ndGggb2YgdGhlIFdQUyBhdHRyaWJ1dGUgY29udGVudAotICoKLSAqIFJldHVybnM6IHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpYyBXUFMgYXR0cmlidXRlIGNvbnRlbnQgZm91bmQsIG9yIE5VTEwKLSAqLwotY29uc3QgdTggKnJ0d19nZXRfd3BzX2F0dHJfY29udGVudDIzYShjb25zdCB1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwKLQkJCQkgICAgICB1MTYgdGFyZ2V0X2F0dHJfaWQsIHU4ICpidWZfY29udGVudCkKLXsKLQljb25zdCB1OCAqYXR0cl9wdHI7Ci0JdTMyIGF0dHJfbGVuOwotCi0JYXR0cl9wdHIgPSBydHdfZ2V0X3dwc19hdHRyMjNhKHdwc19pZSwgd3BzX2llbGVuLCB0YXJnZXRfYXR0cl9pZCwKLQkJCQkgICAgTlVMTCwgJmF0dHJfbGVuKTsKLQotCWlmIChhdHRyX3B0ciAmJiBhdHRyX2xlbikgewotCQlpZiAoYnVmX2NvbnRlbnQpCi0JCQltZW1jcHkoYnVmX2NvbnRlbnQsIGF0dHJfcHRyICsgNCwgYXR0cl9sZW4gLSA0KTsKLQotCQlyZXR1cm4gYXR0cl9wdHIgKyA0OwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IHJ0d19nZXRfY2lwaGVyX2luZm8oc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspCi17Ci0JY29uc3QgdTggKnBidWY7Ci0JaW50IGdyb3VwX2NpcGhlciA9IDAsIHBhaXJ3aXNlX2NpcGhlciA9IDAsIGlzODAyMXggPSAwOwotCWludCByZXQgPSBfRkFJTDsKLQlpbnQgciwgcGxlbjsKLQljaGFyICpwaWU7Ci0KLQlwaWUgPSBwbmV0d29yay0+bmV0d29yay5JRXM7Ci0JcGxlbiA9IHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoOwotCi0JcGJ1ZiA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkgICAgICAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BBLCBwaWUsIHBsZW4pOwotCi0JaWYgKHBidWYgJiYgcGJ1ZlsxXSA+IDApIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19nZXRfY2lwaGVyX2luZm86IHdwYV9pZWxlbjogJWRcbiIsIHBidWZbMV0pOwotCQlyID0gcnR3X3BhcnNlX3dwYV9pZTIzYShwYnVmLCBwYnVmWzFdICsgMiwgJmdyb3VwX2NpcGhlciwKLQkJCQkgICAgICZwYWlyd2lzZV9jaXBoZXIsICZpczgwMjF4KTsKLQkJaWYgKHIgPT0gX1NVQ0NFU1MpIHsKLQkJCXBuZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciA9IHBhaXJ3aXNlX2NpcGhlcjsKLQkJCXBuZXR3b3JrLT5CY25JbmZvLmdyb3VwX2NpcGhlciA9IGdyb3VwX2NpcGhlcjsKLQkJCXBuZXR3b3JrLT5CY25JbmZvLmlzXzgwMjF4ID0gaXM4MDIxeDsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiJXM6IHBuZXR3b3JrLT5wYWlyd2lzZV9jaXBoZXI6ICVkLCBpc184MDIxeCBpcyAlZFxuIiwKLQkJCQkgX19mdW5jX18sIHBuZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciwKLQkJCQkgcG5ldHdvcmstPkJjbkluZm8uaXNfODAyMXgpOwotCQkJcmV0ID0gX1NVQ0NFU1M7Ci0JCX0KLQl9IGVsc2UgewotCQlwYnVmID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9SU04sIHBpZSwgcGxlbik7Ci0KLQkJaWYgKHBidWYgJiYgcGJ1ZlsxXSA+IDApIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiZ2V0IFJTTiBJRVxuIik7Ci0JCQlyID0gcnR3X3BhcnNlX3dwYTJfaWUyM2EocGJ1ZiwgcGJ1ZlsxXSArIDIsCi0JCQkJCSAgICAgICZncm91cF9jaXBoZXIsICZwYWlyd2lzZV9jaXBoZXIsCi0JCQkJCSAgICAgICZpczgwMjF4KTsKLQkJCWlmIChyID09IF9TVUNDRVNTKSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiZ2V0IFJTTiBJRSAgT0shISFcbiIpOwotCQkJCXBuZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciA9Ci0JCQkJCXBhaXJ3aXNlX2NpcGhlcjsKLQkJCQlwbmV0d29yay0+QmNuSW5mby5ncm91cF9jaXBoZXIgPSBncm91cF9jaXBoZXI7Ci0JCQkJcG5ldHdvcmstPkJjbkluZm8uaXNfODAyMXggPSBpczgwMjF4OwotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgIiVzOiBwbmV0d29yay0+cGFpcndpc2VfY2lwaGVyOiAlZCxwbmV0d29yay0+Z3JvdXBfY2lwaGVyIGlzICVkLCBpc184MDIxeCBpcyAlZFxuIiwKLQkJCQkJIF9fZnVuY19fLAotCQkJCQkgcG5ldHdvcmstPkJjbkluZm8ucGFpcndpc2VfY2lwaGVyLAotCQkJCQkgcG5ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyLAotCQkJCQkgcG5ldHdvcmstPkJjbkluZm8uaXNfODAyMXgpOwotCQkJCXJldCA9IF9TVUNDRVNTOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBydHdfZ2V0X2Jjbl9pbmZvMjNhKHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQotewotCXU4IGJlbmNyeXB0ID0gMDsKLQlpbnQgcGllX2xlbjsKLQl1OCAqcGllOwotCWNvbnN0IHU4ICpwOwotCi0JaWYgKHBuZXR3b3JrLT5uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgewotCQliZW5jcnlwdCA9IDE7Ci0JCXBuZXR3b3JrLT5uZXR3b3JrLlByaXZhY3kgPSAxOwotCX0gZWxzZQotCQlwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wgPSBFTkNSWVBfUFJPVE9DT0xfT1BFTlNZUzsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOiBzc2lkID0lc1xuIiwgX19mdW5jX18sIHBuZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCk7Ci0KLQlwaWUgPSBwbmV0d29yay0+bmV0d29yay5JRXM7Ci0JcGllX2xlbiA9IHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfUlNOLCBwaWUsIHBpZV9sZW4pOwotCWlmIChwICYmIHBbMV0pIHsKLQkJcG5ldHdvcmstPkJjbkluZm8uZW5jcnlwX3Byb3RvY29sID0gRU5DUllQX1BST1RPQ09MX1dQQTI7Ci0JfSBlbHNlIGlmIChjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJCSAgIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQQSwKLQkJCQkJICAgcGllLCBwaWVfbGVuKSkgewotCQlwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wgPSBFTkNSWVBfUFJPVE9DT0xfV1BBOwotCX0gZWxzZSB7Ci0JCWlmIChiZW5jcnlwdCkKLQkJCXBuZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCA9IEVOQ1JZUF9QUk9UT0NPTF9XRVA7Ci0JfQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOiBwbmV0d29yay0+ZW5jcnlwX3Byb3RvY29sIGlzICV4XG4iLCBfX2Z1bmNfXywKLQkJIHBuZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCk7Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6IHBuZXR3b3JrLT5lbmNyeXBfcHJvdG9jb2wgaXMgJXhcbiIsIF9fZnVuY19fLAotCQkgcG5ldHdvcmstPkJjbkluZm8uZW5jcnlwX3Byb3RvY29sKTsKLQlydHdfZ2V0X2NpcGhlcl9pbmZvKHBuZXR3b3JrKTsKLQotCS8qIGdldCBid21vZGUgYW5kIGNoX29mZnNldCAqLwotfQotCi0vKiBzaG93IE1DUyByYXRlLCB1bml0OiAxMDBLYnBzICovCi11MTYgcnR3X21jc19yYXRlMjNhKHU4IHJmX3R5cGUsIHU4IGJ3XzQwTUh6LCB1OCBzaG9ydF9HSV8yMCwgdTggc2hvcnRfR0lfNDAsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX21jc19pbmZvICptY3MpCi17Ci0JdTE2IG1heF9yYXRlID0gMDsKLQotCWlmIChyZl90eXBlID09IFJGXzFUMVIpIHsKLQkJaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg3KSkKLQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzE1MDA6MTM1MCk6Ci0JCQkJKChzaG9ydF9HSV8yMCk/NzIyOjY1MCk7Ci0JCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg2KSkKLQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzEzNTA6MTIxNSk6Ci0JCQkJKChzaG9ydF9HSV8yMCk/NjUwOjU4NSk7Ci0JCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg1KSkKLQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzEyMDA6MTA4MCk6Ci0JCQkJKChzaG9ydF9HSV8yMCk/NTc4OjUyMCk7Ci0JCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg0KSkKLQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzkwMDo4MTApOgotCQkJCSgoc2hvcnRfR0lfMjApPzQzMzozOTApOwotCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoMykpCi0JCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT82MDA6NTQwKToKLQkJCQkoKHNob3J0X0dJXzIwKT8yODk6MjYwKTsKLQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDIpKQotCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/NDUwOjQwNSk6Ci0JCQkJKChzaG9ydF9HSV8yMCk/MjE3OjE5NSk7Ci0JCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCgxKSkKLQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzMwMDoyNzApOgotCQkJCSgoc2hvcnRfR0lfMjApPzE0NDoxMzApOwotCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoMCkpCi0JCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xNTA6MTM1KToKLQkJCQkoKHNob3J0X0dJXzIwKT83Mjo2NSk7Ci0JfSBlbHNlIHsKLQkJaWYgKG1jcy0+cnhfbWFza1sxXSkgewotCQkJaWYgKG1jcy0+cnhfbWFza1sxXSAmIEJJVCg3KSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8zMDAwOjI3MDApOigoc2hvcnRfR0lfMjApPzE0NDQ6MTMwMCk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMV0gJiBCSVQoNikpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/MjcwMDoyNDMwKTooKHNob3J0X0dJXzIwKT8xMzAwOjExNzApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzFdICYgQklUKDUpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzI0MDA6MjE2MCk6KChzaG9ydF9HSV8yMCk/MTE1NjoxMDQwKTsKLQkJCWVsc2UgaWYgKG1jcy0+cnhfbWFza1sxXSAmIEJJVCg0KSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xODAwOjE2MjApOigoc2hvcnRfR0lfMjApPzg2Nzo3ODApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzFdICYgQklUKDMpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzEyMDA6MTA4MCk6KChzaG9ydF9HSV8yMCk/NTc4OjUyMCk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMV0gJiBCSVQoMikpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/OTAwOjgxMCk6KChzaG9ydF9HSV8yMCk/NDMzOjM5MCk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMV0gJiBCSVQoMSkpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/NjAwOjU0MCk6KChzaG9ydF9HSV8yMCk/Mjg5OjI2MCk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMV0gJiBCSVQoMCkpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/MzAwOjI3MCk6KChzaG9ydF9HSV8yMCk/MTQ0OjEzMCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDcpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzE1MDA6MTM1MCk6KChzaG9ydF9HSV8yMCk/NzIyOjY1MCk7Ci0JCQllbHNlIGlmIChtY3MtPnJ4X21hc2tbMF0gJiBCSVQoNikpCi0JCQkJbWF4X3JhdGUgPSAoYndfNDBNSHopID8gKChzaG9ydF9HSV80MCk/MTM1MDoxMjE1KTooKHNob3J0X0dJXzIwKT82NTA6NTg1KTsKLQkJCWVsc2UgaWYgKG1jcy0+cnhfbWFza1swXSAmIEJJVCg1KSkKLQkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJXzQwKT8xMjAwOjEwODApOigoc2hvcnRfR0lfMjApPzU3ODo1MjApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDQpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzkwMDo4MTApOigoc2hvcnRfR0lfMjApPzQzMzozOTApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDMpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzYwMDo1NDApOigoc2hvcnRfR0lfMjApPzI4OToyNjApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDIpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzQ1MDo0MDUpOigoc2hvcnRfR0lfMjApPzIxNzoxOTUpOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDEpKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzMwMDoyNzApOigoc2hvcnRfR0lfMjApPzE0NDoxMzApOwotCQkJZWxzZSBpZiAobWNzLT5yeF9tYXNrWzBdICYgQklUKDApKQotCQkJCW1heF9yYXRlID0gKGJ3XzQwTUh6KSA/ICgoc2hvcnRfR0lfNDApPzE1MDoxMzUpOigoc2hvcnRfR0lfMjApPzcyOjY1KTsKLQkJfQotCX0KLQlyZXR1cm4gbWF4X3JhdGU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzg2ZmM0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUV19NTE1FX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KLSNpbmNsdWRlIDxoYWxfaW50Zi5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxzdGFfaW5mby5oPgotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotI2luY2x1ZGUgPHJ0d19zcmVzZXQuaD4KLQotc3RhdGljIHN0cnVjdCB3bGFuX25ldHdvcmsgKgotcnR3X3NlbGVjdF9jYW5kaWRhdGVfZnJvbV9xdWV1ZShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpOwotc3RhdGljIGludCBydHdfZG9fam9pbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotc3RhdGljIHZvaWQgcnR3X2luaXRfbWxtZV90aW1lcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlzZXR1cF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgcnR3MjNhX2pvaW5fdG9faGFuZGxlciwKLQkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLQotCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsIHJ0d19zY2FuX3RpbWVvdXRfaGFuZGxlcjIzYSwKLQkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLQotCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPmR5bmFtaWNfY2hrX3RpbWVyLAotCQkgICAgcnR3X2R5bmFtaWNfY2hlY2tfdGltZXJfaGFuZGxlciwgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwotCi0Jc2V0dXBfdGltZXIoJnBtbG1lcHJpdi0+c2V0X3NjYW5fZGVueV90aW1lciwKLQkJICAgIHJ0d19zZXRfc2Nhbl9kZW55X3RpbWVyX2hkbCwgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwotfQotCi1pbnQgcnR3X2luaXRfbWxtZV9wcml2MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCXBtbG1lcHJpdi0+bmljX2hkbCA9IHBhZGFwdGVyOwotCi0JcG1sbWVwcml2LT5md19zdGF0ZSA9IDA7Ci0JcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLmlmbW9kZSA9IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOwotCS8qICAxOiBhY3RpdmUsIDA6IHBhc2l2ZS4gTWF5YmUgc29tZWRheSB3ZSBzaG91bGQgcmVuYW1lIHRoaXMKLQkgICAgdmFyYWJsZSB0byAiYWN0aXZlX21vZGUiIChKZWZmKSAqLwotCXBtbG1lcHJpdi0+c2Nhbl9tb2RlID0gU0NBTl9BQ1RJVkU7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcG1sbWVwcml2LT5sb2NrKTsKLQlfcnR3X2luaXRfcXVldWUyM2EoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSk7Ci0KLQltZW1zZXQoJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBjZmc4MDIxMV9zc2lkKSk7Ci0KLQlydHdfY2xlYXJfc2Nhbl9kZW55KHBhZGFwdGVyKTsKLQotCXJ0d19pbml0X21sbWVfdGltZXIocGFkYXB0ZXIpOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotc3RhdGljIHZvaWQgcnR3X2ZyZWVfbWxtZV9pZV9kYXRhKHU4ICoqcHBpZSwgdTMyICpwbGVuKQotewotCWlmICgqcHBpZSkgewotCQlrZnJlZSgqcHBpZSk7Ci0JCSpwbGVuID0gMDsKLQkJKnBwaWUgPSBOVUxMOwotCX0KLX0KLSNlbmRpZgotCi12b2lkIHJ0dzIzYV9mcmVlX21sbWVfcHJpdl9pZV9kYXRhKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlrZnJlZShwbWxtZXByaXYtPmFzc29jX3JlcSk7Ci0Ja2ZyZWUocG1sbWVwcml2LT5hc3NvY19yc3ApOwotCXJ0d19mcmVlX21sbWVfaWVfZGF0YSgmcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llLAotCQkJICAgICAgJnBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW4pOwotI2VuZGlmCi19Ci0KLXZvaWQgcnR3X2ZyZWVfbWxtZV9wcml2MjNhKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgInJ0d19mcmVlX21sbWVfcHJpdjIzYVxuIik7Ci0KLQlydHcyM2FfZnJlZV9tbG1lX3ByaXZfaWVfZGF0YShwbWxtZXByaXYpOwotfQotCi1zdHJ1Y3Qgd2xhbl9uZXR3b3JrICpydHdfYWxsb2NfbmV0d29yayhzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGdmcF90IGdmcCkKLXsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yazsKLQotCXBuZXR3b3JrID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdsYW5fbmV0d29yayksIGdmcCk7Ci0JaWYgKHBuZXR3b3JrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZwbmV0d29yay0+bGlzdCk7Ci0JCXBuZXR3b3JrLT5uZXR3b3JrX3R5cGUgPSAwOwotCQlwbmV0d29yay0+Zml4ZWQgPSBmYWxzZTsKLQkJcG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7Ci0JCXBuZXR3b3JrLT5qb2luX3JlcyA9IDA7Ci0JfQotCi0JcmV0dXJuIHBuZXR3b3JrOwotfQotCi1zdGF0aWMgdm9pZCBfcnR3X2ZyZWVfbmV0d29yazIzYShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsCi0JCQkJIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQotewotCWlmICghcG5ldHdvcmspCi0JCXJldHVybjsKLQotCWlmIChwbmV0d29yay0+Zml4ZWQgPT0gdHJ1ZSkKLQkJcmV0dXJuOwotCi0JbGlzdF9kZWxfaW5pdCgmcG5ldHdvcmstPmxpc3QpOwotCi0Ja2ZyZWUocG5ldHdvcmspOwotfQotCi0vKgotIHJldHVybiB0aGUgd2xhbl9uZXR3b3JrIHdpdGggdGhlIG1hdGNoaW5nIGFkZHIKLQotIFNoYWxsIGJlIGNhbGxlZCB1bmRlciBhdG9taWMgY29udGV4dC4uLiB0byBhdm9pZCBwb3NzaWJsZSByYWNpbmcgY29uZGl0aW9uLi4uCi0qLwotc3RydWN0IHdsYW5fbmV0d29yayAqCi1ydHdfZmluZF9uZXR3b3JrMjNhKHN0cnVjdCBydHdfcXVldWUgKnNjYW5uZWRfcXVldWUsIHU4ICphZGRyKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkLCAqcGxpc3Q7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSBOVUxMOwotCi0JaWYgKGlzX3plcm9fZXRoZXJfYWRkcihhZGRyKSkgewotCQlwbmV0d29yayA9IE5VTEw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBzcGluX2xvY2tfYmgoJnNjYW5uZWRfcXVldWUtPmxvY2spOyAqLwotCi0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHNjYW5uZWRfcXVldWUpOwotCXBsaXN0ID0gcGhlYWQtPm5leHQ7Ci0KLQl3aGlsZSAocGxpc3QgIT0gcGhlYWQpIHsKLQkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwotCi0JCWlmIChldGhlcl9hZGRyX2VxdWFsKGFkZHIsIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpKQotCQkJYnJlYWs7Ci0KLQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKLQl9Ci0KLQlpZiAocGxpc3QgPT0gcGhlYWQpCi0JCXBuZXR3b3JrID0gTlVMTDsKLQotCS8qIHNwaW5fdW5sb2NrX2JoKCZzY2FubmVkX3F1ZXVlLT5sb2NrKTsgKi8KLQotZXhpdDoKLQotCXJldHVybiBwbmV0d29yazsKLX0KLQotdm9pZCBydHdfZnJlZV9uZXR3b3JrX3F1ZXVlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmssICpwdG1wOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqc2Nhbm5lZF9xdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7Ci0KLQlzcGluX2xvY2tfYmgoJnNjYW5uZWRfcXVldWUtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChzY2FubmVkX3F1ZXVlKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG5ldHdvcmssIHB0bXAsIHBoZWFkLCBsaXN0KQotCQlfcnR3X2ZyZWVfbmV0d29yazIzYShwbWxtZXByaXYsIHBuZXR3b3JrKTsKLQlzcGluX3VubG9ja19iaCgmc2Nhbm5lZF9xdWV1ZS0+bG9jayk7Ci19Ci0KLWludCBydHdfaWZfdXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpbnQgcmVzOwotCi0JaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fAotCSAgICAhY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X2lmX3VwMjNhOmJEcml2ZXJTdG9wcGVkKCVkKSBPUiBiU3VycHJpc2VSZW1vdmVkKCVkKVxuIiwKLQkJCSBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKTsKLQkJcmVzID0gZmFsc2U7Ci0JfSBlbHNlCi0JCXJlcyA9ICB0cnVlOwotCi0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBydHdfZ2VuZXJhdGVfcmFuZG9tX2lic3MyM2EodTggKnBpYnNzKQotewotCXVuc2lnbmVkIGxvbmcgY3VydGltZSA9IGppZmZpZXM7Ci0KLQlwaWJzc1swXSA9IDB4MDI7ICAvKiBpbiBhZC1ob2MgbW9kZSBiaXQxIG11c3Qgc2V0IHRvIDEgKi8KLQlwaWJzc1sxXSA9IDB4MTE7Ci0JcGlic3NbMl0gPSAweDg3OwotCXBpYnNzWzNdID0gY3VydGltZSAmIDB4ZmY7LyogcFswXTsgKi8KLQlwaWJzc1s0XSA9IChjdXJ0aW1lID4+IDgpICYgMHhmZjsvKiBwWzFdOyAqLwotCXBpYnNzWzVdID0gKGN1cnRpbWUgPj4gMTYpICYgMHhmZjsvKiBwWzJdOyAqLwotfQotCi12b2lkIHJ0d19zZXRfcm9hbWluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IHRvX3JvYW1pbmcpCi17Ci0JaWYgKHRvX3JvYW1pbmcgPT0gMCkKLQkJYWRhcHRlci0+bWxtZXByaXYudG9fam9pbiA9IGZhbHNlOwotCWFkYXB0ZXItPm1sbWVwcml2LnRvX3JvYW1pbmcgPSB0b19yb2FtaW5nOwotfQotCi1zdGF0aWMgdm9pZCBfcnR3X3JvYW1pbmcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yaykKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrOwotCWludCBkb19qb2luX3I7Ci0KLQlpZiAodGd0X25ldHdvcmspCi0JCXBuZXR3b3JrID0gdGd0X25ldHdvcms7Ci0JZWxzZQotCQlwbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwotCi0JaWYgKHBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID4gMCkgewotCQlEQkdfODcyM0EoInJvYW1pbmcgZnJvbSAlcyglcE0pLCBsZW5ndGg6JWRcbiIsCi0JCQkgIHBuZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCSAgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCSAgcG5ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkX2xlbik7Ci0JCW1lbWNweSgmcG1sbWVwcml2LT5hc3NvY19zc2lkLCAmcG5ldHdvcmstPm5ldHdvcmsuU3NpZCwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgY2ZnODAyMTFfc3NpZCkpOwotCi0JCXBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQgPSBmYWxzZTsKLQotCQl3aGlsZSAoMSkgewotCQkJZG9fam9pbl9yID0gcnR3X2RvX2pvaW4ocGFkYXB0ZXIpOwotCQkJaWYgKGRvX2pvaW5fciA9PSBfU1VDQ0VTUykKLQkJCQlicmVhazsKLQkJCWVsc2UgewotCQkJCURCR184NzIzQSgicm9hbWluZyBkb19qb2luIHJldHVybiAlZFxuIiwKLQkJCQkJICBkb19qb2luX3IpOwotCQkJCXBtbG1lcHJpdi0+dG9fcm9hbWluZy0tOwotCi0JCQkJaWYgKHBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID4gMCkKLQkJCQkJY29udGludWU7Ci0JCQkJZWxzZSB7Ci0JCQkJCURCR184NzIzQSgiJXMoJWQpIC10byByb2FtaW5nIGZhaWwsICIKLQkJCQkJCSAgImluZGljYXRlX2Rpc2Nvbm5lY3RcbiIsCi0JCQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQkJCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi12b2lkIHJ0dzIzYV9yb2FtaW5nKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yaykKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCV9ydHdfcm9hbWluZyhwYWRhcHRlciwgdGd0X25ldHdvcmspOwotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBydHdfZnJlZV9uZXR3b3JrX25vbG9jayhzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsCi0JCQkJICAgIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQotewotCV9ydHdfZnJlZV9uZXR3b3JrMjNhKHBtbG1lcHJpdiwgcG5ldHdvcmspOwotfQotCi1ib29sIHJ0d19pc19zYW1lX2lic3MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JaWYgKHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gIT0gMCAmJgotCSAgICBwbmV0d29yay0+bmV0d29yay5Qcml2YWN5ID09IDApCi0JCXJldCA9IGZhbHNlOwotCWVsc2UgaWYgKHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0gMCAmJgotCQkgcG5ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSA9PSAxKQotCQlyZXQgPSBmYWxzZTsKLQllbHNlCi0JCXJldCA9IHRydWU7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbmxpbmUgaW50IGlzX3NhbWVfZXNzKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICphLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYik7Ci1pbmxpbmUgaW50IGlzX3NhbWVfZXNzKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICphLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYikKLXsKLQlyZXR1cm4gKGEtPlNzaWQuc3NpZF9sZW4gPT0gYi0+U3NpZC5zc2lkX2xlbikgJiYKLQkJIW1lbWNtcChhLT5Tc2lkLnNzaWQsIGItPlNzaWQuc3NpZCwgYS0+U3NpZC5zc2lkX2xlbik7Ci19Ci0KLWludCBpc19zYW1lX25ldHdvcmsyM2Eoc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYywgc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCkKLXsKLQl1MTYgc19jYXAsIGRfY2FwOwotCi0Jc19jYXAgPSBzcmMtPmNhcGFiaWxpdHk7Ci0JZF9jYXAgPSBkc3QtPmNhcGFiaWxpdHk7Ci0KLQlyZXR1cm4gKChzcmMtPlNzaWQuc3NpZF9sZW4gPT0gZHN0LT5Tc2lkLnNzaWRfbGVuKSAmJgotCQkvKgkoc3JjLT5EU0NvbmZpZyA9PSBkc3QtPkRTQ29uZmlnKSAmJiAqLwotCQlldGhlcl9hZGRyX2VxdWFsKHNyYy0+TWFjQWRkcmVzcywgZHN0LT5NYWNBZGRyZXNzKSAmJgotCQkhbWVtY21wKHNyYy0+U3NpZC5zc2lkLCBkc3QtPlNzaWQuc3NpZCwgc3JjLT5Tc2lkLnNzaWRfbGVuKSAmJgotCQkoc19jYXAgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykgPT0KLQkJKGRfY2FwICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpICYmCi0JCShzX2NhcCAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpID09IChkX2NhcCAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpKTsKLX0KLQotc3RydWN0IHdsYW5fbmV0d29yayAqCi1ydHdfZ2V0X29sZGVzdF93bGFuX25ldHdvcmsyM2Eoc3RydWN0IHJ0d19xdWV1ZSAqc2Nhbm5lZF9xdWV1ZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwd2xhbjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpvbGRlc3QgPSBOVUxMOwotCi0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHNjYW5uZWRfcXVldWUpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocHdsYW4sIHBoZWFkLCBsaXN0KSB7Ci0JCWlmIChwd2xhbi0+Zml4ZWQgIT0gdHJ1ZSkgewotCQkJaWYgKCFvbGRlc3QgfHwgdGltZV9hZnRlcihvbGRlc3QtPmxhc3Rfc2Nhbm5lZCwKLQkJCQkJCSAgcHdsYW4tPmxhc3Rfc2Nhbm5lZCkpCi0JCQkJb2xkZXN0ID0gcHdsYW47Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gb2xkZXN0OwotfQotCi12b2lkIHVwZGF0ZV9uZXR3b3JrMjNhKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpkc3QsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpzcmMsCi0JCSAgICAgICBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBib29sIHVwZGF0ZV9pZSkKLXsKLQl1OCBzc19vcmkgPSBkc3QtPlNpZ25hbFN0cmVuZ3RoOwotCXU4IHNxX29yaSA9IGRzdC0+U2lnbmFsUXVhbGl0eTsKLQlsb25nIHJzc2lfb3JpID0gZHN0LT5Sc3NpOwotCi0JdTggc3Nfc21wID0gc3JjLT5TaWduYWxTdHJlbmd0aDsKLQl1OCBzcV9zbXAgPSBzcmMtPlNpZ25hbFF1YWxpdHk7Ci0JbG9uZyByc3NpX3NtcCA9IHNyYy0+UnNzaTsKLQotCXU4IHNzX2ZpbmFsOwotCXU4IHNxX2ZpbmFsOwotCWxvbmcgcnNzaV9maW5hbDsKLQotCURCR184NzIzQSgiJXMgJXMoJXBNLCBjaCV1KSBzc19vcmk6JTN1LCBzcV9vcmk6JTN1LCByc3NpX29yaTolM2xkLCAiCi0JCSAgInNzX3NtcDolM3UsIHNxX3NtcDolM3UsIHJzc2lfc21wOiUzbGRcbiIsCi0JCSAgX19mdW5jX18sIHNyYy0+U3NpZC5zc2lkLCBzcmMtPk1hY0FkZHJlc3MsCi0JCSAgc3JjLT5EU0NvbmZpZywgc3Nfb3JpLCBzcV9vcmksIHJzc2lfb3JpLAotCQkgIHNzX3NtcCwgc3Ffc21wLCByc3NpX3NtcAotCSk7Ci0KLQkvKiBUaGUgcnVsZSBiZWxvdyBpcyAxLzUgZm9yIHNhbXBsZSB2YWx1ZSwgNC81IGZvciBoaXN0b3J5IHZhbHVlICovCi0JaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX0xJTktFRCkgJiYKLQkgICAgaXNfc2FtZV9uZXR3b3JrMjNhKCZwYWRhcHRlci0+bWxtZXByaXYuY3VyX25ldHdvcmsubmV0d29yaywgc3JjKSkgewotCQkvKiBUYWtlIHRoZSByZWN2cHJpdidzIHZhbHVlIGZvciB0aGUgY29ubmVjdGVkIEFQKi8KLQkJc3NfZmluYWwgPSBwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0cmVuZ3RoOwotCQlzcV9maW5hbCA9IHBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfcXVhbDsKLQkJLyogdGhlIHJzc2kgdmFsdWUgaGVyZSBpcyB1bmRlY29yYXRlZCwgYW5kIHdpbGwgYmUKLQkJICAgdXNlZCBmb3IgYW50ZW5uYSBkaXZlcnNpdHkgKi8KLQkJaWYgKHNxX3NtcCAhPSAxMDEpIC8qIGZyb20gdGhlIHJpZ2h0IGNoYW5uZWwgKi8KLQkJCXJzc2lfZmluYWwgPSAoc3JjLT5Sc3NpK2RzdC0+UnNzaSo0KS81OwotCQllbHNlCi0JCQlyc3NpX2ZpbmFsID0gcnNzaV9vcmk7Ci0JfSBlbHNlIHsKLQkJaWYgKHNxX3NtcCAhPSAxMDEpIHsgLyogZnJvbSB0aGUgcmlnaHQgY2hhbm5lbCAqLwotCQkJc3NfZmluYWwgPSAoKHUzMilzcmMtPlNpZ25hbFN0cmVuZ3RoICsKLQkJCQkgICAgKHUzMilkc3QtPlNpZ25hbFN0cmVuZ3RoICogNCkgLyA1OwotCQkJc3FfZmluYWwgPSAoKHUzMilzcmMtPlNpZ25hbFF1YWxpdHkgKwotCQkJCSAgICAodTMyKWRzdC0+U2lnbmFsUXVhbGl0eSAqIDQpIC8gNTsKLQkJCXJzc2lfZmluYWwgPSBzcmMtPlJzc2krZHN0LT5Sc3NpICogNCAvIDU7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBic3MgaW5mbyBub3QgcmVjZWl2aW5nIGZyb20gdGhlIHJpZ2h0IGNoYW5uZWwsIHVzZQotCQkJICAgdGhlIG9yaWdpbmFsIFJYIHNpZ25hbCBpbmZvcyAqLwotCQkJc3NfZmluYWwgPSBkc3QtPlNpZ25hbFN0cmVuZ3RoOwotCQkJc3FfZmluYWwgPSBkc3QtPlNpZ25hbFF1YWxpdHk7Ci0JCQlyc3NpX2ZpbmFsID0gZHN0LT5Sc3NpOwotCQl9Ci0KLQl9Ci0KLQlpZiAodXBkYXRlX2llKQotCQltZW1jcHkoZHN0LCBzcmMsIGdldF93bGFuX2Jzc2lkX2V4X3N6KHNyYykpOwotCi0JZHN0LT5TaWduYWxTdHJlbmd0aCA9IHNzX2ZpbmFsOwotCWRzdC0+U2lnbmFsUXVhbGl0eSA9IHNxX2ZpbmFsOwotCWRzdC0+UnNzaSA9IHJzc2lfZmluYWw7Ci0KLQlEQkdfODcyM0EoIiVzICVzKCVwTSksIFNpZ25hbFN0cmVuZ3RoOiV1LCBTaWduYWxRdWFsaXR5OiV1LCAiCi0JCSAgIlJhd1JTU0k6JWxkXG4iLCAgX19mdW5jX18sIGRzdC0+U3NpZC5zc2lkLCBkc3QtPk1hY0FkZHJlc3MsCi0JCSAgZHN0LT5TaWduYWxTdHJlbmd0aCwgZHN0LT5TaWduYWxRdWFsaXR5LCBkc3QtPlJzc2kpOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfY3VycmVudF9uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmspCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSAmJgotCSAgICBpc19zYW1lX25ldHdvcmsyM2EoJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yaywgcG5ldHdvcmspKSB7Ci0JCXVwZGF0ZV9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmssCi0JCQkJICBwbmV0d29yaywgYWRhcHRlciwgdHJ1ZSk7Ci0KLQkJcnR3X3VwZGF0ZV9wcm90ZWN0aW9uMjNhKGFkYXB0ZXIsCi0JCQkJCSBwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuSUVzLAotCQkJCQkgcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLklFTGVuZ3RoKTsKLQl9Ci19Ci0KLS8qCi0KLUNhbGxlciBtdXN0IGhvbGQgcG1sbWVwcml2LT5sb2NrIGZpcnN0LgotCi0qLwotc3RhdGljIHZvaWQgcnR3X3VwZGF0ZV9zY2FubmVkX25ldHdvcmsoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICAgICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqdGFyZ2V0KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQ7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrID0gTlVMTDsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpvbGRlc3QgPSBOVUxMOwotCXN0cnVjdCBydHdfcXVldWUgKnF1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKLQl1MzIgYnNzaWRfZXhfc3o7Ci0JaW50IGZvdW5kID0gMDsKLQotCXNwaW5fbG9ja19iaCgmcXVldWUtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaChwbGlzdCwgcGhlYWQpIHsKLQkJcG5ldHdvcmsgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCB3bGFuX25ldHdvcmssIGxpc3QpOwotCi0JCWlmIChpc19zYW1lX25ldHdvcmsyM2EoJnBuZXR3b3JrLT5uZXR3b3JrLCB0YXJnZXQpKSB7Ci0JCQlmb3VuZCA9IDE7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoIW9sZGVzdCB8fCB0aW1lX2FmdGVyKG9sZGVzdC0+bGFzdF9zY2FubmVkLAotCQkJCQkgIHBuZXR3b3JrLT5sYXN0X3NjYW5uZWQpKQotCQkJb2xkZXN0ID0gcG5ldHdvcms7Ci0JfQotCi0JLyogSWYgd2UgZGlkbid0IGZpbmQgYSBtYXRjaCwgdGhlbiBnZXQgYSBuZXcgbmV0d29yayBzbG90IHRvIGluaXRpYWxpemUKLQkgKiB3aXRoIHRoaXMgYmVhY29uJ3MgaW5mb3JtYXRpb24gKi8KLQlpZiAoIWZvdW5kKSB7Ci0JCXBuZXR3b3JrID0gcnR3X2FsbG9jX25ldHdvcmsocG1sbWVwcml2LCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFwbmV0d29yaykgewotCQkJaWYgKCFvbGRlc3QpIHsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCQkgInNvbWV0aGluZyB3cm9uZyBoZXJlXG4iKTsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCQlwbmV0d29yayA9IG9sZGVzdDsKLQkJfSBlbHNlCi0JCQlsaXN0X2FkZF90YWlsKCZwbmV0d29yay0+bGlzdCwgJnF1ZXVlLT5xdWV1ZSk7Ci0KLQkJYnNzaWRfZXhfc3ogPSBnZXRfd2xhbl9ic3NpZF9leF9zeih0YXJnZXQpOwotCQl0YXJnZXQtPkxlbmd0aCA9IGJzc2lkX2V4X3N6OwotCQltZW1jcHkoJnBuZXR3b3JrLT5uZXR3b3JrLCB0YXJnZXQsIGJzc2lkX2V4X3N6KTsKLQotCQkvKiAgdmFyaWFibGUgaW5pdGlhbGl6ZSAqLwotCQlwbmV0d29yay0+Zml4ZWQgPSBmYWxzZTsKLQkJcG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7Ci0KLQkJcG5ldHdvcmstPm5ldHdvcmtfdHlwZSA9IDA7Ci0JCXBuZXR3b3JrLT5qb2luX3JlcyA9IDA7Ci0KLQkJLyogYnNzIGluZm8gbm90IHJlY2VpdmluZyBmcm9tIHRoZSByaWdodCBjaGFubmVsICovCi0JCWlmIChwbmV0d29yay0+bmV0d29yay5TaWduYWxRdWFsaXR5ID09IDEwMSkKLQkJCXBuZXR3b3JrLT5uZXR3b3JrLlNpZ25hbFF1YWxpdHkgPSAwOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIHdlIGhhdmUgYW4gZW50cnkgYW5kIHdlIGFyZSBnb2luZyB0byB1cGRhdGUgaXQuIEJ1dAotCQkgKiB0aGlzIGVudHJ5IG1heSBiZSBhbHJlYWR5IGV4cGlyZWQuIEluIHRoaXMgY2FzZSB3ZQotCQkgKiBkbyB0aGUgc2FtZSBhcyB3ZSBmb3VuZCBhIG5ldyBuZXQgYW5kIGNhbGwgdGhlCi0JCSAqIG5ld19uZXQgaGFuZGxlcgotCQkgKi8KLQkJYm9vbCB1cGRhdGVfaWUgPSB0cnVlOwotCi0JCXBuZXR3b3JrLT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOwotCi0JCS8qIHRhcmdldC5yZXNlcnZlZCA9PSAxLCBtZWFucyB0aGF0IHNjYW5uZWQgbmV0d29yayBpcwotCQkgKiBhIGJjbiBmcmFtZS4gKi8KLQkJaWYgKHBuZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoID4gdGFyZ2V0LT5JRUxlbmd0aCAmJgotCQkgICAgdGFyZ2V0LT5yZXNlcnZlZCA9PSAxKQotCQkJdXBkYXRlX2llID0gZmFsc2U7Ci0KLQkJdXBkYXRlX25ldHdvcmsyM2EoJnBuZXR3b3JrLT5uZXR3b3JrLCB0YXJnZXQsIGFkYXB0ZXIsCi0JCQkJICB1cGRhdGVfaWUpOwotCX0KLQotZXhpdDoKLQlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBydHdfYWRkX25ldHdvcmsoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJICAgIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yaykKLXsKLQl1cGRhdGVfY3VycmVudF9uZXR3b3JrKGFkYXB0ZXIsIHBuZXR3b3JrKTsKLQlydHdfdXBkYXRlX3NjYW5uZWRfbmV0d29yayhhZGFwdGVyLCBwbmV0d29yayk7Ci19Ci0KLS8qIHNlbGVjdCB0aGUgZGVzaXJlZCBuZXR3b3JrIGJhc2VkIG9uIHRoZSBjYXBhYmlsaXR5IG9mIHRoZSAoaSlic3MuICovCi0vKiAgY2hlY2sgaXRlbXM6ICgxKSBzZWN1cml0eSAqLwotLyoJCQkgICAoMikgbmV0d29ya190eXBlICovCi0vKgkJCSAgICgzKSBXTU0gKi8KLS8qCQkJICAgKDQpIEhUICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAoNSkgb3RoZXJzICovCi1zdGF0aWMgaW50IHJ0d19pc19kZXNpcmVkX25ldHdvcmsoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspCi17Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQl1MzIgZGVzaXJlZF9lbmNtb2RlOwotCXUzMiBwcml2YWN5OwotCWludCBic2VsZWN0ZWQgPSB0cnVlOwotCi0JZGVzaXJlZF9lbmNtb2RlID0gcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXM7Ci0JcHJpdmFjeSA9IHBuZXR3b3JrLT5uZXR3b3JrLlByaXZhY3k7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfVU5ERVJfV1BTKSkgewotCQlpZiAoY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCQkgICAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BBLAotCQkJCQkgICAgcG5ldHdvcmstPm5ldHdvcmsuSUVzLAotCQkJCQkgICAgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0JaWYgKGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWMgPT0gMSkgewotCQkvKiBmb3IgIGNvcnJlY3QgZmxvdyBvZiA4MDIxWCAgdG8gZG8uLi4uICovCi0JCWlmIChkZXNpcmVkX2VuY21vZGUgPT0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZCAmJgotCQkgICAgcHJpdmFjeSAhPSAwKQotCQkJYnNlbGVjdGVkID0gZmFsc2U7Ci0JfQotCi0JaWYgKGRlc2lyZWRfZW5jbW9kZSAhPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkICYmIHByaXZhY3kgPT0gMCkgewotCQlEQkdfODcyM0EoImRlc2lyZWRfZW5jbW9kZTogJWQsIHByaXZhY3k6ICVkXG4iLAotCQkJICBkZXNpcmVkX2VuY21vZGUsIHByaXZhY3kpOwotCQlic2VsZWN0ZWQgPSBmYWxzZTsKLQl9Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSB7Ci0JCWlmIChwbmV0d29yay0+bmV0d29yay5pZm1vZGUgIT0KLQkJICAgIHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5pZm1vZGUpCi0JCQlic2VsZWN0ZWQgPSBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gYnNlbGVjdGVkOwotfQotCi12b2lkIHJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQl1MzIgbGVuOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yazsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHN1cnZleV9ldmVudCAqc3VydmV5ID0gKHN0cnVjdCBzdXJ2ZXlfZXZlbnQgKilwYnVmOwotCi0JcG5ldHdvcmsgPSBzdXJ2ZXktPmJzczsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgInJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2EsIHNzaWQ9JXNcbiIsIHBuZXR3b3JrLT5Tc2lkLnNzaWQpOwotCi0JbGVuID0gZ2V0X3dsYW5fYnNzaWRfZXhfc3oocG5ldHdvcmspOwotCWlmIChsZW4gPiAoc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSkpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAiKioqKnJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2E6IHJldHVybiBhIHdyb25nIGJzcyAqKipcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JLyogIHVwZGF0ZSBJQlNTX25ldHdvcmsgJ3MgdGltZXN0YW1wICovCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkJICAgICBwbmV0d29yay0+TWFjQWRkcmVzcykpIHsKLQkJCXN0cnVjdCB3bGFuX25ldHdvcmsgKmlic3Nfd2xhbjsKLQotCQkJcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9Ci0JCQkJcG5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbDsKLQkJCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5jYXBhYmlsaXR5ID0KLQkJCQlwbmV0d29yay0+Y2FwYWJpbGl0eTsKLQkJCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay50c2YgPSBwbmV0d29yay0+dHNmOwotCQkJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCQlpYnNzX3dsYW4gPSBydHdfZmluZF9uZXR3b3JrMjNhKAotCQkJCSZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsCi0JCQkJcG5ldHdvcmstPk1hY0FkZHJlc3MpOwotCQkJaWYgKGlic3Nfd2xhbikgewotCQkJCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5iZWFjb25faW50ZXJ2YWwgPQotCQkJCQlpYnNzX3dsYW4tPm5ldHdvcmsuYmVhY29uX2ludGVydmFsOwotCQkJCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5jYXBhYmlsaXR5ID0KLQkJCQkJaWJzc193bGFuLT5uZXR3b3JrLmNhcGFiaWxpdHk7Ci0JCQkJcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLnRzZiA9Ci0JCQkJCWlic3Nfd2xhbi0+bmV0d29yay50c2Y7Ci0JCQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCQl9Ci0JfQotCi0JLyogIGxvY2sgcG1sbWVwcml2LT5sb2NrIHdoZW4geW91IGFjY2Vzc2luZyBuZXR3b3JrX3EgKi8KLQlpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykpIHsKLQkJaWYgKHBuZXR3b3JrLT5Tc2lkLnNzaWRbMF0gPT0gMCkKLQkJCXBuZXR3b3JrLT5Tc2lkLnNzaWRfbGVuID0gMDsKLQotCQlydHdfYWRkX25ldHdvcmsoYWRhcHRlciwgcG5ldHdvcmspOwotCX0KLQotZXhpdDoKLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0Ja2ZyZWUoc3VydmV5LT5ic3MpOwotCXN1cnZleS0+YnNzID0gTlVMTDsKLX0KLQotdm9pZAotcnR3X3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJmFkYXB0ZXItPm1sbWVleHRwcml2OwotCWludCByZXQ7Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlpZiAocG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llKSB7Ci0JCXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW4gPSAwOwotCQlrZnJlZShwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUpOwotCQlwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUgPSBOVUxMOwotCX0KLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgInJ0d19zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrMjNhOiBmd19zdGF0ZToleFxuIiwKLQkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkgewotCQlkZWxfdGltZXJfc3luYygmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyKTsKLQotCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSk7Ci0JfSBlbHNlIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAibmljIHN0YXR1cyA9JXgsIHN1cnZleSBkb25lIGV2ZW50IGNvbWVzIHRvbyBsYXRlIVxuIiwKLQkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQl9Ci0KLQlydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKCZhZGFwdGVyLT5yZWN2cHJpdik7Ci0KLQlpZiAocG1sbWVwcml2LT50b19qb2luID09IHRydWUpIHsKLQkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkpIHsKLQkJCXJldCA9IHJ0d19zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FubmVkX3F1ZXVlMjNhKAotCQkJCXBtbG1lcHJpdik7Ci0JCQlpZiAocmV0ICE9IF9TVUNDRVNTKQotCQkJCXJ0d19kb19qb2luX2FkaG9jKGFkYXB0ZXIpOwotCQl9IGVsc2UgewotCQkJcG1sbWVwcml2LT50b19qb2luID0gZmFsc2U7Ci0JCQlyZXQgPSBydHdfc2VsZWN0X2FuZF9qb2luX2Zyb21fc2Nhbm5lZF9xdWV1ZTIzYSgKLQkJCQlwbWxtZXByaXYpOwotCQkJaWYgKHJldCAhPSBfU1VDQ0VTUykgewotCQkJCURCR184NzIzQSgidHJ5X3RvX2pvaW4sIGJ1dCBzZWxlY3Qgc2Nhbm5pbmcgIgotCQkJCQkgICJxdWV1ZSBmYWlsLCB0b19yb2FtaW5nOiVkXG4iLAotCQkJCQkgIGFkYXB0ZXItPm1sbWVwcml2LnRvX3JvYW1pbmcpOwotCQkJCWlmIChhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nKSB7Ci0JCQkJCWlmICgtLXBtbG1lcHJpdi0+dG9fcm9hbWluZyA9PSAwIHx8Ci0JCQkJCSAgICBydHdfc2l0ZXN1cnZleV9jbWQyM2EoCi0JCQkJCQkgICAgYWRhcHRlciwKLQkJCQkJCSAgICAmcG1sbWVwcml2LT5hc3NvY19zc2lkLCAxLAotCQkJCQkJICAgIE5VTEwsIDApICE9IF9TVUNDRVNTKSB7Ci0JCQkJCQlydHdfc2V0X3JvYW1pbmcoYWRhcHRlciwgMCk7Ci0JCQkJCQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EoCi0JCQkJCQkJYWRhcHRlciwgMSk7Ci0JCQkJCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYSgKLQkJCQkJCQlhZGFwdGVyKTsKLQkJCQkJfSBlbHNlCi0JCQkJCQlwbWxtZXByaXYtPnRvX2pvaW4gPSB0cnVlOwotCQkJCX0KLQkJCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlydHdfb3NfeG1pdF9zY2hlZHVsZTIzYShhZGFwdGVyKTsKLQotCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuYnNzX2NudCA9PSAwKQotCQlydHdfc3Jlc2V0X3Jlc2V0KGFkYXB0ZXIpOwotCi0JcnR3X2NmZzgwMjExX3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2soYWRhcHRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfc2NhbnF1ZXVlKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaywgKnB0ZW1wOwotCXN0cnVjdCBydHdfcXVldWUgKnNjYW5fcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywgIitmcmVlX3NjYW5xdWV1ZVxuIik7Ci0Jc3Bpbl9sb2NrX2JoKCZzY2FuX3F1ZXVlLT5sb2NrKTsKLQlwaGVhZCA9IGdldF9saXN0X2hlYWQoc2Nhbl9xdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBuZXR3b3JrLCBwdGVtcCwgcGhlYWQsIGxpc3QpIHsKLQkJcG5ldHdvcmstPmZpeGVkID0gZmFsc2U7Ci0JCV9ydHdfZnJlZV9uZXR3b3JrMjNhKHBtbG1lcHJpdiwgcG5ldHdvcmspOwotCX0KLQlzcGluX3VubG9ja19iaCgmc2Nhbl9xdWV1ZS0+bG9jayk7Ci19Ci0KLS8qCi0gKnJ0d19mcmVlX2Fzc29jX3Jlc291cmNlczIzYTogdGhlIGNhbGxlciBoYXMgdG8gbG9jayBwbWxtZXByaXYtPmxvY2sKLSAqLwotdm9pZCBydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSBpbnQgbG9ja19zY2FubmVkX3F1ZXVlKQotewotCXN0cnVjdCB3bGFuX25ldHdvcmsgKnB3bGFuOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLAotCQkgIitydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2FcbiIpOwotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgInRndF9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3M9JXBNIHNzaWQ9JXNcbiIsCi0JCSB0Z3RfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkgdGd0X25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFfFdJRklfQVBfU1RBVEUpKSB7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJmFkYXB0ZXItPnN0YXByaXYsCi0JCQkJCSAgdGd0X25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JCXJ0d19mcmVlX3N0YWluZm8yM2EoYWRhcHRlciwgIHBzdGEpOwotCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCX0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSB8Ci0JCQkgIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFfFdJRklfQVBfU1RBVEUpKSB7Ci0JCXJ0d19mcmVlX2FsbF9zdGFpbmZvMjNhKGFkYXB0ZXIpOwotCi0JCXBzdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShhZGFwdGVyKTsKLQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JCXJ0d19mcmVlX3N0YWluZm8yM2EoYWRhcHRlciwgcHN0YSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0KLQkJcnR3X2luaXRfYmNtY19zdGFpbmZvMjNhKGFkYXB0ZXIpOwotCX0KLQotCWlmIChsb2NrX3NjYW5uZWRfcXVldWUpCi0JCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCi0JcHdsYW4gPSBydHdfZmluZF9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsCi0JCQkJICAgIHRndF9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCWlmIChwd2xhbikKLQkJcHdsYW4tPmZpeGVkID0gZmFsc2U7Ci0JZWxzZQotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EgOiBwd2xhbj09IE5VTExcbiIpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgJiYKLQkgICAgYWRhcHRlci0+c3RhcHJpdi5hc29jX3N0YV9jb3VudCA9PSAxKQotCQlydHdfZnJlZV9uZXR3b3JrX25vbG9jayhwbWxtZXByaXYsIHB3bGFuKTsKLQotCWlmIChsb2NrX3NjYW5uZWRfcXVldWUpCi0JCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0KLQlwbWxtZXByaXYtPmtleV9tYXNrID0gMDsKLX0KLQotLyoKLSpydHdfaW5kaWNhdGVfY29ubmVjdDIzYTogdGhlIGNhbGxlciBoYXMgdG8gbG9jayBwbWxtZXByaXYtPmxvY2sKLSovCi12b2lkIHJ0d19pbmRpY2F0ZV9jb25uZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAiK3J0d19pbmRpY2F0ZV9jb25uZWN0MjNhXG4iKTsKLQotCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwotCi0JaWYgKCFjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCk7Ci0KLQkJcnR3X2NmZzgwMjExX2luZGljYXRlX2Nvbm5lY3QocGFkYXB0ZXIpOwotCi0JCW5ldGlmX2NhcnJpZXJfb24ocGFkYXB0ZXItPnBuZXRkZXYpOwotCi0JCWlmIChwYWRhcHRlci0+cGlkWzJdICE9IDApCi0JCQlraWxsX3BpZChmaW5kX3ZwaWQocGFkYXB0ZXItPnBpZFsyXSksIFNJR0FMUk0sIDEpOwotCX0KLQotCXJ0d19zZXRfcm9hbWluZyhwYWRhcHRlciwgMCk7Ci0KLQlydHdfc2V0X3NjYW5fZGVueShwYWRhcHRlciwgMzAwMCk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgIi1ydHdfaW5kaWNhdGVfY29ubmVjdDIzYTogZndfc3RhdGU9MHglMDh4XG4iLAotCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci19Ci0KLS8qCi0gKnJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhOiB0aGUgY2FsbGVyIGhhcyB0byBsb2NrIHBtbG1lcHJpdi0+bG9jawotICovCi12b2lkIHJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAiK3J0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhXG4iKTsKLQotCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lOR3xXSUZJX1VOREVSX1dQUyk7Ci0KLQkvKiBEQkdfODcyM0EoImNsZWFyIHdwcyB3aGVuICVzXG4iLCBfX2Z1bmNfXyk7ICovCi0KLQlpZiAocGFkYXB0ZXItPm1sbWVwcml2LnRvX3JvYW1pbmcgPiAwKQotCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSB8fAotCSAgICBwYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyA8PSAwKSB7Ci0JCXJ0d19vc19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQotCQkvKiBzZXQgaXBzX2RlbnlfdGltZSB0byBhdm9pZCBlbnRlciBJUFMgYmVmb3JlIExQUyBsZWF2ZSAqLwotCQlwYWRhcHRlci0+cHdyY3RybHByaXYuaXBzX2RlbnlfdGltZSA9Ci0JCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygzMDAwKTsKLQotCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCk7Ci0KLQkJcnR3X2NsZWFyX3NjYW5fZGVueShwYWRhcHRlcik7Ci0JfQotCi0JcnR3X2xwc19jdHJsX3drX2NtZDIzYShwYWRhcHRlciwgTFBTX0NUUkxfRElTQ09OTkVDVCwgMSk7Ci19Ci0KLXZvaWQgcnR3X3NjYW5fYWJvcnQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXVuc2lnbmVkIGxvbmcgc3RhcnQ7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCXN0YXJ0ID0gamlmZmllczsKLQlwbWxtZWV4dC0+c2Nhbl9hYm9ydCA9IHRydWU7Ci0Jd2hpbGUgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSAmJgotCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkgPD0gMjAwKSB7Ci0JCWlmIChhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQkJYnJlYWs7Ci0KLQkJREJHXzg3MjNBKCIlcyglcyk6IGZ3X3N0YXRlID0gX0ZXX1VOREVSX1NVUlZFWSFcbiIsCi0JCQkgIF9fZnVuY19fLCBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJbXNsZWVwKDIwKTsKLQl9Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpKSB7Ci0JCWlmICghYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgJiYgIWFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCi0JCQlEQkdfODcyM0EoIiVzKCVzKTogd2FpdGluZyBmb3Igc2Nhbl9hYm9ydCB0aW1lIG91dCFcbiIsCi0JCQkJICBfX2Z1bmNfXywgYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0JCXJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zY2FuX2RvbmUod2Rldl90b19wcml2KGFkYXB0ZXItPnJ0d193ZGV2KSwKLQkJCQkJCXRydWUpOwotCX0KLQlwbWxtZWV4dC0+c2Nhbl9hYm9ydCA9IGZhbHNlOwotfQotCi1zdGF0aWMgc3RydWN0IHN0YV9pbmZvICoKLXJ0d19qb2luYnNzX3VwZGF0ZV9zdGFpbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKmJtY19zdGEsICpwc3RhOwotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JaWYgKCFwc3RhKQotCQlwc3RhID0gcnR3X2FsbG9jX3N0YWluZm8yM2EocHN0YXByaXYsCi0JCQkJCSAgICBwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkJCQkgICAgR0ZQX0FUT01JQyk7Ci0KLQlpZiAocHN0YSkgeyAvKiB1cGRhdGUgcHRhcmdldF9zdGEgKi8KLQkJREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JCXBzdGEtPmFpZCAgPSBwbmV0d29yay0+am9pbl9yZXM7Ci0JCXBzdGEtPm1hY19pZCA9IDA7Ci0KLQkJLyogc3RhIG1vZGUgKi8KLQkJcnRsODcyM2FfU2V0SGFsT0RNVmFyKHBhZGFwdGVyLCBIQUxfT0RNX1NUQV9JTkZPLCBwc3RhLCB0cnVlKTsKLQotCQkvKiBzZWN1cml0eSByZWxhdGVkICovCi0JCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0gPT0KLQkJICAgIGRvdDExQXV0aEFsZ3J0aG1fODAyMVgpIHsKLQkJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuYmluc3RhbGxHcnBrZXkgPSAwOwotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSA9IDA7Ci0KLQkJCXBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gdHJ1ZTsKLQkJCXBzdGEtPmRvdDExODAyMVhQcml2YWN5ID0KLQkJCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG07Ci0KLQkJCW1lbXNldCgmcHN0YS0+ZG90MTE4MDIxeF9VbmNzdEtleSwgMCwKLQkJCSAgICAgICBzaXplb2YgKHVuaW9uIEtleXR5cGUpKTsKLQotCQkJbWVtc2V0KCZwc3RhLT5kb3QxMXRraXByeG1pY2tleSwgMCwKLQkJCSAgICAgICBzaXplb2YgKHVuaW9uIEtleXR5cGUpKTsKLQkJCW1lbXNldCgmcHN0YS0+ZG90MTF0a2lwdHhtaWNrZXksIDAsCi0JCQkgICAgICAgc2l6ZW9mICh1bmlvbiBLZXl0eXBlKSk7Ci0KLQkJCW1lbXNldCgmcHN0YS0+ZG90MTF0eHBuLCAwLCBzaXplb2YgKHVuaW9uIHBuNDgpKTsKLQkJCW1lbXNldCgmcHN0YS0+ZG90MTFyeHBuLCAwLCBzaXplb2YgKHVuaW9uIHBuNDgpKTsKLQkJfQotCi0JCS8qCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMi8wNy8yMSAqLwotCQkvKglXaGVuIGRvaW5nIHRoZSBXUFMsIHRoZSB3cHNfaWVfbGVuIHdvbid0IGVxdWFsIHRvIDAgKi8KLQkJLyoJQW5kIHRoZSBXaS1GaSBkcml2ZXIgc2hvdWxkbid0IGFsbG93IHRoZSBkYXRhIHBhY2tldAotCQkJdG8gYmUgdHJhbnNtaXR0ZWQuICovCi0JCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2Lndwc19pZV9sZW4gIT0gMCkgewotCQkJcHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPSB0cnVlOwotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi53cHNfaWVfbGVuID0gMDsKLQkJfQotCi0JCS8qIGZvciBBLU1QRFUgUnggcmVvcmRlcmluZyBidWZmZXIgY29udHJvbCBmb3IgYm1jX3N0YSAmCi0JCSAqIHN0YV9pbmZvICovCi0JCS8qIGlmIEEtTVBEVSBSeCBpcyBlbmFibGVkLCByZXNldHRpbmcKLQkJICAgcnhfb3JkZXJpbmdfY3RybCB3c3RhcnRfYihpbmRpY2F0ZV9zZXEpIHRvIGRlZmF1bHQKLQkJICAgdmFsdWUgPSAweGZmZmYgKi8KLQkJLyogdG9kbzogY2hlY2sgaWYgQVAgY2FuIHNlbmQgQS1NUERVIHBhY2tldHMgKi8KLQkJZm9yIChpID0gMDsgaSA8IDE2IDsgaSsrKSB7Ci0JCQkvKiBwcmVvcmRlcl9jdHJsID0gJnByZWN2cHJpdi0+cmVjdnJlb3JkZXJfY3RybFtpXTsgKi8KLQkJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtpXTsKLQkJCXByZW9yZGVyX2N0cmwtPmVuYWJsZSA9IGZhbHNlOwotCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gMHhmZmZmOwotCQkJcHJlb3JkZXJfY3RybC0+d2VuZF9iID0gMHhmZmZmOwotCQkJLyogbWF4X2FtcGR1X3N6OyBleC4gMzIoa2J5dGVzKSAtPiB3c2l6ZV9iID0gMzIgKi8KLQkJCXByZW9yZGVyX2N0cmwtPndzaXplX2IgPSA2NDsKLQkJfQotCi0JCWJtY19zdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JCWlmIChibWNfc3RhKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgMTYgOyBpKyspIHsKLQkJCQlwcmVvcmRlcl9jdHJsID0gJmJtY19zdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07Ci0JCQkJcHJlb3JkZXJfY3RybC0+ZW5hYmxlID0gZmFsc2U7Ci0JCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gMHhmZmZmOwotCQkJCXByZW9yZGVyX2N0cmwtPndlbmRfYiA9IDB4ZmZmZjsKLQkJCQkvKiBtYXhfYW1wZHVfc3o7IGV4LiAzMihrYnl0ZXMpIC0+Ci0JCQkJICAgd3NpemVfYiA9IDMyICovCi0JCQkJcHJlb3JkZXJfY3RybC0+d3NpemVfYiA9IDY0OwotCQkJfQotCQl9Ci0KLQkJLyogbWlzYy4gKi8KLQkJdXBkYXRlX3N0YV9pbmZvMjNhKHBhZGFwdGVyLCBwc3RhKTsKLQotCX0KLQotCXJldHVybiBwc3RhOwotfQotCi0vKiBwbmV0d29yayA6IHJldHVybnMgZnJvbSBydHcyM2Ffam9pbmJzc19ldmVudF9jYiAqLwotLyogcHRhcmdldF93bGFuOiBmb3VuZCBmcm9tIHNjYW5uZWRfcXVldWUgKi8KLXN0YXRpYyB2b2lkCi1ydHdfam9pbmJzc191cGRhdGVfbmV0d29yazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgc3RydWN0IHdsYW5fbmV0d29yayAqcHRhcmdldF93bGFuLAotCQkJICAgICAgc3RydWN0IHdsYW5fbmV0d29yayAgKnBuZXR3b3JrKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgImZ3X3N0YXRlOiV4LCBCU1NJRDolcE1cbiIsCi0JCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpLAotCQkgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0KLQkvKiAgd2h5IG5vdCB1c2UgcHRhcmdldF93bGFuPz8gKi8KLQltZW1jcHkoJmN1cl9uZXR3b3JrLT5uZXR3b3JrLCAmcG5ldHdvcmstPm5ldHdvcmssCi0JICAgICAgIHBuZXR3b3JrLT5uZXR3b3JrLkxlbmd0aCk7Ci0JLyogIHNvbWUgSUVzIGluIHBuZXR3b3JrIGlzIHdyb25nLCBzbyB3ZSBzaG91bGQgdXNlIHB0YXJnZXRfd2xhbiBJRXMgKi8KLQljdXJfbmV0d29yay0+bmV0d29yay5JRUxlbmd0aCA9IHB0YXJnZXRfd2xhbi0+bmV0d29yay5JRUxlbmd0aDsKLQltZW1jcHkoJmN1cl9uZXR3b3JrLT5uZXR3b3JrLklFc1swXSwgJnB0YXJnZXRfd2xhbi0+bmV0d29yay5JRXNbMF0sCi0JICAgICAgIE1BWF9JRV9TWik7Ci0KLQljdXJfbmV0d29yay0+bmV0d29yay5jYXBhYmlsaXR5ID0gcHRhcmdldF93bGFuLT5uZXR3b3JrLmNhcGFiaWxpdHk7Ci0JY3VyX25ldHdvcmstPm5ldHdvcmsuYmVhY29uX2ludGVydmFsID0KLQkJcHRhcmdldF93bGFuLT5uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbDsKLQljdXJfbmV0d29yay0+bmV0d29yay50c2YgPSBwdGFyZ2V0X3dsYW4tPm5ldHdvcmsudHNmOwotCi0JcnR3X3NldF9zaWduYWxfc3RhdF90aW1lcigmcGFkYXB0ZXItPnJlY3Zwcml2KTsKLQlwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0cmVuZ3RoID0KLQkJcHRhcmdldF93bGFuLT5uZXR3b3JrLlNpZ25hbFN0cmVuZ3RoOwotCXBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfcXVhbCA9IHB0YXJnZXRfd2xhbi0+bmV0d29yay5TaWduYWxRdWFsaXR5OwotCS8qCi0JICogdGhlIHB0YXJnZXRfd2xhbi0+bmV0d29yay5Sc3NpIGlzIHJhdyBkYXRhLCB3ZSB1c2UKLQkgKiBwdGFyZ2V0X3dsYW4tPm5ldHdvcmsuU2lnbmFsU3RyZW5ndGggaW5zdGVhZCAoaGFzIHNjYWxlZCkKLQkgKi8KLQlEQkdfODcyM0EoIiVzIHNpZ25hbF9zdHJlbmd0aDolM3UsIHNpZ25hbF9xdWFsOiUzdVxuIiwKLQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9zdHJlbmd0aCwKLQkJICBwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3F1YWwpOwotCXJ0d19zZXRfc2lnbmFsX3N0YXRfdGltZXIoJnBhZGFwdGVyLT5yZWN2cHJpdik7Ci0KLQkvKiB1cGRhdGUgZndfc3RhdGUgd2lsbCBjbHIgX0ZXX1VOREVSX0xJTktJTkcgaGVyZSBpbmRpcmVjdGx5ICovCi0Jc3dpdGNoIChwbmV0d29yay0+bmV0d29yay5pZm1vZGUpIHsKLQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlpZiAocG1sbWVwcml2LT5md19zdGF0ZSAmIFdJRklfVU5ERVJfV1BTKQotCQkJcG1sbWVwcml2LT5md19zdGF0ZSA9IFdJRklfU1RBVElPTl9TVEFURXxXSUZJX1VOREVSX1dQUzsKLQkJZWxzZQotCQkJcG1sbWVwcml2LT5md19zdGF0ZSA9IFdJRklfU1RBVElPTl9TVEFURTsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQkJcG1sbWVwcml2LT5md19zdGF0ZSA9IFdJRklfQURIT0NfU1RBVEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXBtbG1lcHJpdi0+Zndfc3RhdGUgPSBXSUZJX05VTExfU1RBVEU7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkludmFsaWQgbmV0d29ya19tb2RlXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JcnR3X3VwZGF0ZV9wcm90ZWN0aW9uMjNhKHBhZGFwdGVyLCBjdXJfbmV0d29yay0+bmV0d29yay5JRXMsCi0JCQkJIGN1cl9uZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoKTsKLQotCXJ0d191cGRhdGVfaHRfY2FwMjNhKHBhZGFwdGVyLCBjdXJfbmV0d29yay0+bmV0d29yay5JRXMsCi0JCQkgICAgIGN1cl9uZXR3b3JrLT5uZXR3b3JrLklFTGVuZ3RoKTsKLX0KLQotLyoKLSAqIE5vdGVzOgotICogdGhlIGZ1bmN0aW9uIGNvdWxkIGJlID4gcGFzc2l2ZV9sZXZlbCAodGhlIHNhbWUgY29udGV4dCBhcyBSeCB0YXNrbGV0KQotICogcG5ldHdvcmsgOiByZXR1cm5zIGZyb20gcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IKLSAqIHB0YXJnZXRfd2xhbjogZm91bmQgZnJvbSBzY2FubmVkX3F1ZXVlCi0gKiBpZiBqb2luX3JlcyA+IDAsIGZvciAoZndfc3RhdGU9PVdJRklfU1RBVElPTl9TVEFURSksCi0gKiB3ZSBjaGVjayBpZiAgInB0YXJnZXRfc3RhIiAmICJwdGFyZ2V0X3dsYW4iIGV4aXN0LgotICogaWYgam9pbl9yZXMgPiAwLCBmb3IgKGZ3X3N0YXRlPT1XSUZJX0FESE9DX1NUQVRFKSwKLSAqIHdlIG9ubHkgY2hlY2sgaWYgInB0YXJnZXRfd2xhbiIgZXhpc3QuCi0gKiBpZiBqb2luX3JlcyA+IDAsIHVwZGF0ZSAiY3VyX25ldHdvcmstPm5ldHdvcmsiIGZyb20gInBuZXR3b3JrLT5uZXR3b3JrIgotICogaWYgKHB0YXJnZXRfd2xhbiAhPU5VTEwpLgotICovCi0KLXZvaWQgcnR3X2pvaW5ic3NfZXZlbnRfcHJlaGFuZGxlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggKnBidWYpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwdGFyZ2V0X3N0YSwgKnBjdXJfc3RhOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSAoc3RydWN0IHdsYW5fbmV0d29yayAqKXBidWY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwY3VyX3dsYW4sICpwdGFyZ2V0X3dsYW4gPSBOVUxMOwotCWJvb2wgdGhlX3NhbWVfbWFjYWRkcjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgImpvaW5ic3MgZXZlbnQgY2FsbCBiYWNrIHJlY2VpdmVkIHdpdGggcmVzPSVkXG4iLAotCQkgcG5ldHdvcmstPmpvaW5fcmVzKTsKLQotCWlmIChwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4gPT0gMCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJAQEBAQCAgIGpvaW5ic3MgZXZlbnQgY2FsbCBiYWNrICBmb3IgQW55IFNTaWRcbiIpOwotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkBAQEBAICAgcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgZm9yIFNTaWQ6JXNcbiIsCi0JCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpOwotCX0KLQotCWlmIChldGhlcl9hZGRyX2VxdWFsKHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkgICAgIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpKQotCQl0aGVfc2FtZV9tYWNhZGRyID0gdHJ1ZTsKLQllbHNlCi0JCXRoZV9zYW1lX21hY2FkZHIgPSBmYWxzZTsKLQotCXBuZXR3b3JrLT5uZXR3b3JrLkxlbmd0aCA9IGdldF93bGFuX2Jzc2lkX2V4X3N6KCZwbmV0d29yay0+bmV0d29yayk7Ci0JaWYgKHBuZXR3b3JrLT5uZXR3b3JrLkxlbmd0aCA+IHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCkpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAiKioqam9pbmJzc19ldnRfY2FsbGJhY2sgcmV0dXJuIGEgd3JvbmcgYnNzICoqKlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICJydHcyM2Ffam9pbmJzc19ldmVudF9jYiAhISBfZW50ZXJfY3JpdGljYWxcbiIpOwotCi0JaWYgKHBuZXR3b3JrLT5qb2luX3JlcyA+IDApIHsKLQkJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKSB7Ci0JCQkvKiBzMS4gZmluZCBwdGFyZ2V0X3dsYW4gKi8KLQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJCQlpZiAodGhlX3NhbWVfbWFjYWRkcikgewotCQkJCQlwdGFyZ2V0X3dsYW4gPSBydHdfZmluZF9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBjdXJfd2xhbiA9IHJ0d19maW5kX25ldHdvcmsyM2EoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSwgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQkJCWlmIChwY3VyX3dsYW4pCi0JCQkJCQlwY3VyX3dsYW4tPmZpeGVkID0gZmFsc2U7Ci0KLQkJCQkJcGN1cl9zdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJCQlpZiAocGN1cl9zdGEpIHsKLQkJCQkJCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCQkJCQkJcnR3X2ZyZWVfc3RhaW5mbzIzYShhZGFwdGVyLAotCQkJCQkJCQkgICAgcGN1cl9zdGEpOwotCQkJCQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQkJCQkJfQotCi0JCQkJCXB0YXJnZXRfd2xhbiA9IHJ0d19maW5kX25ldHdvcmsyM2EoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSwgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwKLQkJCQkJCQkgIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJCQkJCWlmIChwdGFyZ2V0X3dsYW4pCi0JCQkJCQkJcHRhcmdldF93bGFuLT5maXhlZCA9Ci0JCQkJCQkJCXRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJcHRhcmdldF93bGFuID0gcnR3X2ZpbmRfbmV0d29yazIzYSgKLQkJCQkJJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZSwKLQkJCQkJcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LAotCQkJCQkJICBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCQkJCWlmIChwdGFyZ2V0X3dsYW4pCi0JCQkJCQlwdGFyZ2V0X3dsYW4tPmZpeGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIHMyLiB1cGRhdGUgY3VyX25ldHdvcmsgKi8KLQkJCWlmIChwdGFyZ2V0X3dsYW4pCi0JCQkJcnR3X2pvaW5ic3NfdXBkYXRlX25ldHdvcmsyM2EoYWRhcHRlciwKLQkJCQkJCQkgICAgICBwdGFyZ2V0X3dsYW4sCi0JCQkJCQkJICAgICAgcG5ldHdvcmspOwotCQkJZWxzZSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCQkJICJDYW4ndCBmaW5kIHB0YXJnZXRfd2xhbiB3aGVuIGpvaW5ic3NfZXZlbnQgY2FsbGJhY2tcbiIpOwotCQkJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCQkJZ290byBpZ25vcmVfam9pbmJzc19jYWxsYmFjazsKLQkJCX0KLQotCQkJLyogczMuIGZpbmQgcHRhcmdldF9zdGEgJiB1cGRhdGUgcHRhcmdldF9zdGEgYWZ0ZXIKLQkJCSAgIHVwZGF0ZSBjdXJfbmV0d29yayBvbmx5IGZvciBzdGF0aW9uIG1vZGUgKi8KLQkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgewotCQkJCXB0YXJnZXRfc3RhID0gcnR3X2pvaW5ic3NfdXBkYXRlX3N0YWluZm8oCi0JCQkJCWFkYXB0ZXIsIHBuZXR3b3JrKTsKLQkJCQlpZiAoIXB0YXJnZXRfc3RhKSB7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLAotCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAiQ2FuJ3QgdXBkYXRlIHN0YWluZm8gd2hlbiBqb2luYnNzX2V2ZW50IGNhbGxiYWNrXG4iKTsKLQkJCQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQkJCQkJZ290byBpZ25vcmVfam9pbmJzc19jYWxsYmFjazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIHM0LiBpbmRpY2F0ZSBjb25uZWN0ICovCi0JCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpCi0JCQkJcnR3X2luZGljYXRlX2Nvbm5lY3QyM2EoYWRhcHRlcik7Ci0JCQllbHNlIHsKLQkJCQkvKiBhZGhvYyBtb2RlIHdpbGwgcnR3X2luZGljYXRlX2Nvbm5lY3QyM2EKLQkJCQkgICB3aGVuIHJ0d19zdGFzc29jX2V2ZW50X2NhbGxiYWNrMjNhICovCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiYWRob2MgbW9kZSwgZndfc3RhdGU6JXhcbiIsCi0JCQkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQkJCX0KLQotCQkJLyogczUuIENhbmNsZSBhc3NvY190aW1lciAqLwotCQkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIpOwotCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkgIkNhbmNsZSBhc3NvY190aW1lclxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCSAicnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgZXJyOiBmd19zdGF0ZToleFxuIiwKLQkJCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0JCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCQkJZ290byBpZ25vcmVfam9pbmJzc19jYWxsYmFjazsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCX0gZWxzZSBpZiAocG5ldHdvcmstPmpvaW5fcmVzID09IC00KSB7Ci0JCXJ0d19yZXNldF9zZWN1cml0eXByaXYyM2EoYWRhcHRlcik7Ci0JCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwotCi0JCS8qIHJ0d19mcmVlX2Fzc29jX3Jlc291cmNlczIzYShhZGFwdGVyLCAxKTsgKi8KLQotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCQkgImZhaWwhIGNsZWFyIF9GV19VTkRFUl9MSU5LSU5HIF5eXmZ3X3N0YXRlPSV4XG4iLAotCQkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQkJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBpZiBqb2luX3JlcyA8IDAgKGpvaW4gZmFpbHMpLCB0aGVuIHRyeSBhZ2FpbiAqLwotCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKLQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKLQl9Ci0KLWlnbm9yZV9qb2luYnNzX2NhbGxiYWNrOgotCi0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci19Ci0KLXZvaWQgcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2Ioc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yayA9IChzdHJ1Y3Qgd2xhbl9uZXR3b3JrICopcGJ1ZjsKLQotCW1sbWVleHRfam9pbmJzc19ldmVudF9jYWxsYmFjazIzYShhZGFwdGVyLCBwbmV0d29yay0+am9pbl9yZXMpOwotCi0JcnR3X29zX3htaXRfc2NoZWR1bGUyM2EoYWRhcHRlcik7Ci19Ci0KLXZvaWQgcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzdGFzc29jX2V2ZW50ICpwc3Rhc3NvYyA9IChzdHJ1Y3Qgc3Rhc3NvY19ldmVudCAqKXBidWY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwdGFyZ2V0X3dsYW47Ci0KLQlpZiAocnR3X2FjY2Vzc19jdHJsMjNhKGFkYXB0ZXIsIHBzdGFzc29jLT5tYWNhZGRyKSA9PSBmYWxzZSkKLQkJcmV0dXJuOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZhZGFwdGVyLT5zdGFwcml2LCBwc3Rhc3NvYy0+bWFjYWRkcik7Ci0JCWlmIChwc3RhKSB7Ci0JCQkvKiBic3NfY2FwX3VwZGF0ZV9vbl9zdGFfam9pbjIzYShhZGFwdGVyLCBwc3RhKTsgKi8KLQkJCS8qIHN0YV9pbmZvX3VwZGF0ZTIzYShhZGFwdGVyLCBwc3RhKTsgKi8KLQkJCWFwX3N0YV9pbmZvX2RlZmVyX3VwZGF0ZTIzYShhZGFwdGVyLCBwc3RhKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0JLyogZm9yIEFELUhPQyBtb2RlICovCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmYWRhcHRlci0+c3RhcHJpdiwgcHN0YXNzb2MtPm1hY2FkZHIpOwotCWlmIChwc3RhICE9IE5VTEwpIHsKLQkJLyogdGhlIHN0YSBoYXZlIGJlZW4gaW4gc3RhX2luZm9fcXVldWUgPT4gZG8gbm90aGluZyAqLwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJFcnJvcjogcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2E6IHN0YSBoYXMgYmVlbiBpbiBzdGFfaGFzaF9xdWV1ZVxuIik7Ci0JCS8qIGJldHdlZW4gZHJ2IGhhcyByZWNlaXZlZCB0aGlzIGV2ZW50IGJlZm9yZSBhbmQKLQkJICAgZncgaGF2ZSBub3QgeWV0IHRvIHNldCBrZXkgdG8gQ0FNX0VOVFJZKSAqLwotCQlyZXR1cm47Ci0JfQotCi0JcHN0YSA9IHJ0d19hbGxvY19zdGFpbmZvMjNhKCZhZGFwdGVyLT5zdGFwcml2LCBwc3Rhc3NvYy0+bWFjYWRkciwKLQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwc3RhKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkNhbid0IGFsbG9jIHN0YV9pbmZvIHdoZW4gcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2FcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogdG8gZG8gOiBpbml0IHN0YV9pbmZvIHZhcmlhYmxlICovCi0JcHN0YS0+cW9zX29wdGlvbiA9IDA7Ci0JcHN0YS0+bWFjX2lkID0gKHVpbnQpcHN0YXNzb2MtPmNhbV9pZDsKLQkvKiBwc3RhLT5haWQgPSAodWludClwc3Rhc3NvYy0+Y2FtX2lkOyAqLwotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQkvKiBmb3IgYWQtaG9jIG1vZGUgKi8KLQlydGw4NzIzYV9TZXRIYWxPRE1WYXIoYWRhcHRlciwgSEFMX09ETV9TVEFfSU5GTywgcHN0YSwgdHJ1ZSk7Ci0KLQlpZiAoYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0gPT0gZG90MTFBdXRoQWxncnRobV84MDIxWCkKLQkJcHN0YS0+ZG90MTE4MDIxWFByaXZhY3kgPQotCQkJYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG07Ci0KLQlwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9IGZhbHNlOwotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSB7Ci0JCWlmIChhZGFwdGVyLT5zdGFwcml2LmFzb2Nfc3RhX2NvdW50ID09IDIpIHsKLQkJCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCQkJcHRhcmdldF93bGFuID0KLQkJCQlydHdfZmluZF9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsCi0JCQkJCQkgICAgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQlpZiAocHRhcmdldF93bGFuKQotCQkJCXB0YXJnZXRfd2xhbi0+Zml4ZWQgPSB0cnVlOwotCQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQkJCS8qICBhIHN0YSArIGJjL21jX3N0YWluZm8gKG5vdCBJYnNzX3N0YWluZm8pICovCi0JCQlydHdfaW5kaWNhdGVfY29ubmVjdDIzYShhZGFwdGVyKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JbWxtZWV4dF9zdGFfYWRkX2V2ZW50X2NhbGxiYWNrMjNhKGFkYXB0ZXIsIHBzdGEpOwotfQotCi12b2lkIHJ0d19zdGFkZWxfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlpbnQgbWFjX2lkOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwd2xhbjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGRldl9uZXR3b3JrOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc3RhZGVsX2V2ZW50ICpwc3RhZGVsID0gKHN0cnVjdCBzdGFkZWxfZXZlbnQgKilwYnVmOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmYWRhcHRlci0+c3RhcHJpdiwgcHN0YWRlbC0+bWFjYWRkcik7Ci0JaWYgKHBzdGEpCi0JCW1hY19pZCA9IHBzdGEtPm1hY19pZDsKLQllbHNlCi0JCW1hY19pZCA9IHBzdGFkZWwtPm1hY19pZDsKLQotCURCR184NzIzQSgiJXMobWFjX2lkPSVkKT0lcE1cbiIsIF9fZnVuY19fLCBtYWNfaWQsIHBzdGFkZWwtPm1hY2FkZHIpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKLQkJcmV0dXJuOwotCi0JbWxtZWV4dF9zdGFfZGVsX2V2ZW50X2NhbGxiYWNrMjNhKGFkYXB0ZXIpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCWlmIChhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID4gMCkgewotCQkJLyogdGhpcyBzdGFkZWxfZXZlbnQgaXMgY2F1c2VkIGJ5IHJvYW1pbmcsCi0JCQkgICBkZWNyZWFzZSB0b19yb2FtaW5nICovCi0JCQlwbWxtZXByaXYtPnRvX3JvYW1pbmctLTsKLQkJfSBlbHNlIGlmIChhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID09IDApCi0JCQlydHdfc2V0X3JvYW1pbmcoYWRhcHRlciwgYWRhcHRlci0+cmVnaXN0cnlwcml2Lm1heF9yb2FtaW5nX3RpbWVzKTsKLQkJaWYgKCooKHUxNiAqKXBzdGFkZWwtPnJzdmQpICE9IFdMQU5fUkVBU09OX0VYUElSQVRJT05fQ0hLKQotCQkJcnR3X3NldF9yb2FtaW5nKGFkYXB0ZXIsIDApOyAvKiBkb24ndCByb2FtICovCi0KLQkJcnR3X2ZyZWVfdWNfc3dkZWNfcGVuZGluZ19xdWV1ZTIzYShhZGFwdGVyKTsKLQotCQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EoYWRhcHRlciwgMSk7Ci0JCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKGFkYXB0ZXIpOwotCQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQkJLyogIHJlbW92ZSB0aGUgbmV0d29yayBlbnRyeSBpbiBzY2FubmVkX3F1ZXVlICovCi0JCXB3bGFuID0gcnR3X2ZpbmRfbmV0d29yazIzYSgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLAotCQkJCQkgICAgdGd0X25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCWlmIChwd2xhbikgewotCQkJcHdsYW4tPmZpeGVkID0gZmFsc2U7Ci0JCQlydHdfZnJlZV9uZXR3b3JrX25vbG9jayhwbWxtZXByaXYsIHB3bGFuKTsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCi0JCV9ydHdfcm9hbWluZyhhZGFwdGVyLCB0Z3RfbmV0d29yayk7Ci0JfQotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSB7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JCXJ0d19mcmVlX3N0YWluZm8yM2EoYWRhcHRlciwgIHBzdGEpOwotCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCi0JCS8qIGEgc3RhICsgYmMvbWNfc3RhaW5mbyAobm90IElic3Nfc3RhaW5mbykgKi8KLQkJaWYgKGFkYXB0ZXItPnN0YXByaXYuYXNvY19zdGFfY291bnQgPT0gMSkgewotCQkJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCQkvKiBmcmVlIG9sZCBpYnNzIG5ldHdvcmsgKi8KLQkJCS8qIHB3bGFuID0gcnR3X2ZpbmRfbmV0d29yazIzYSgKLQkJCSAgICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsIHBzdGFkZWwtPm1hY2FkZHIpOyAqLwotCQkJcHdsYW4gPSBydHdfZmluZF9uZXR3b3JrMjNhKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUsCi0JCQkJCQkgICAgdGd0X25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7Ci0JCQlpZiAocHdsYW4pIHsKLQkJCQlwd2xhbi0+Zml4ZWQgPSBmYWxzZTsKLQkJCQlydHdfZnJlZV9uZXR3b3JrX25vbG9jayhwbWxtZXByaXYsIHB3bGFuKTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0JCQkvKiByZS1jcmVhdGUgaWJzcyAqLwotCQkJcGRldl9uZXR3b3JrID0gJmFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5kZXZfbmV0d29yazsKLQotCQkJbWVtY3B5KHBkZXZfbmV0d29yaywgJnRndF9uZXR3b3JrLT5uZXR3b3JrLAotCQkJICAgICAgIGdldF93bGFuX2Jzc2lkX2V4X3N6KCZ0Z3RfbmV0d29yay0+bmV0d29yaykpOwotCi0JCQlydHdfZG9fam9pbl9hZGhvYyhhZGFwdGVyKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotfQotCi0vKgotKiBydHcyM2Ffam9pbl90b19oYW5kbGVyIC0gVGltZW91dC9mYWlsdXJlIGhhbmRsZXIgZm9yIENNRCBKb2luQnNzCi0qIEBhZGFwdGVyOiBwb2ludGVyIHRvIF9hZGFwdGVyIHN0cnVjdHVyZQotKi8KLXZvaWQgcnR3MjNhX2pvaW5fdG9faGFuZGxlciAodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKilkYXRhOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlpbnQgZG9fam9pbl9yOwotCi0JREJHXzg3MjNBKCIlcywgZndfc3RhdGU9JXhcbiIsIF9fZnVuY19fLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQotCWlmIChhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlpZiAoYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyA+IDApIHsKLQkJLyogam9pbiB0aW1lb3V0IGNhdXNlZCBieSByb2FtaW5nICovCi0JCXdoaWxlICgxKSB7Ci0JCQlwbWxtZXByaXYtPnRvX3JvYW1pbmctLTsKLQkJCWlmIChhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nICE9IDApIHsKLQkJCQkvKiB0cnkgYW5vdGhlciAqLwotCQkJCURCR184NzIzQSgiJXMgdHJ5IGFub3RoZXIgcm9hbWluZ1xuIiwgX19mdW5jX18pOwotCQkJCWRvX2pvaW5fciA9IHJ0d19kb19qb2luKGFkYXB0ZXIpOwotCQkJCWlmIChkb19qb2luX3IgIT0gX1NVQ0NFU1MpIHsKLQkJCQkJREJHXzg3MjNBKCIlcyByb2FtaW5nIGRvX2pvaW4gcmV0dXJuICIKLQkJCQkJCSAgIiVkXG4iLCBfX2Z1bmNfXyAsIGRvX2pvaW5fcik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJREJHXzg3MjNBKCIlcyBXZSd2ZSB0cnkgcm9hbWluZyBidXQgZmFpbFxuIiwKLQkJCQkJICBfX2Z1bmNfXyk7Ci0JCQkJcnR3X2luZGljYXRlX2Rpc2Nvbm5lY3QyM2EoYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShhZGFwdGVyKTsKLQkJZnJlZV9zY2FucXVldWUocG1sbWVwcml2KTsvKiAgKi8KLQotCQkvKiBpbmRpY2F0ZSBkaXNjb25uZWN0IGZvciB0aGUgY2FzZSB0aGF0IGpvaW5fdGltZW91dCBhbmQKLQkJICAgY2hlY2tfZndzdGF0ZSAhPSBGV19MSU5LRUQgKi8KLQkJcnR3X2NmZzgwMjExX2luZGljYXRlX2Rpc2Nvbm5lY3QoYWRhcHRlcik7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLX0KLQotLyoKLSogcnR3X3NjYW5fdGltZW91dF9oYW5kbGVyMjNhIC0gVGltZW91dC9GYWlsdXJlIGhhbmRsZXIgZm9yIENNRCBTaXRlU3VydmV5Ci0qIEBkYXRhOiBwb2ludGVyIHRvIF9hZGFwdGVyIHN0cnVjdHVyZQotKi8KLXZvaWQgcnR3X3NjYW5fdGltZW91dF9oYW5kbGVyMjNhKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKTogZndfc3RhdGUgPSV4XG4iLCBfX2Z1bmNfXywgYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJICBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKLQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi0JcnR3X2NmZzgwMjExX2luZGljYXRlX3NjYW5fZG9uZSh3ZGV2X3RvX3ByaXYoYWRhcHRlci0+cnR3X3dkZXYpLCB0cnVlKTsKLX0KLQotdm9pZCBydHdfZHluYW1pY19jaGVja190aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQotCWlmIChhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCA9PSBmYWxzZSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gdHJ1ZSB8fAotCSAgICBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUpCi0JCWdvdG8gb3V0OwotCi0JaWYgKGFkYXB0ZXItPm5ldF9jbG9zZWQgPT0gdHJ1ZSkKLQkJZ290byBvdXQ7Ci0KLQlydHdfZHluYW1pY19jaGtfd2tfY21kMjNhKGFkYXB0ZXIpOwotCi1vdXQ6Ci0JbW9kX3RpbWVyKCZhZGFwdGVyLT5tbG1lcHJpdi5keW5hbWljX2Noa190aW1lciwKLQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKSk7Ci19Ci0KLWlubGluZSBib29sIHJ0d19pc19zY2FuX2Rlbnkoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCi0JcmV0dXJuIChhdG9taWNfcmVhZCgmbWxtZXByaXYtPnNldF9zY2FuX2RlbnkpICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotfQotCi12b2lkIHJ0d19jbGVhcl9zY2FuX2Rlbnkoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCi0JYXRvbWljX3NldCgmbWxtZXByaXYtPnNldF9zY2FuX2RlbnksIDApOwotfQotCi12b2lkIHJ0d19zZXRfc2Nhbl9kZW55X3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKWRhdGE7Ci0KLQlydHdfY2xlYXJfc2Nhbl9kZW55KGFkYXB0ZXIpOwotfQotCi12b2lkIHJ0d19zZXRfc2Nhbl9kZW55KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTMyIG1zKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCi0JYXRvbWljX3NldCgmbWxtZXByaXYtPnNldF9zY2FuX2RlbnksIDEpOwotCW1vZF90aW1lcigmbWxtZXByaXYtPnNldF9zY2FuX2RlbnlfdGltZXIsCi0JCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMobXMpKTsKLX0KLQotI2lmIGRlZmluZWQoSUVFRTgwMjExX1NDQU5fUkVTVUxUX0VYUElSRSkKLSNkZWZpbmUgUlRXX1NDQU5fUkVTVUxUX0VYUElSRSAgXAotCSgoSUVFRTgwMjExX1NDQU5fUkVTVUxUX0VYUElSRSAvIChIWioxMDAwKSkgLSAxMDAwKSAvKiAzMDAwIC0xMDAwICovCi0jZWxzZQotI2RlZmluZSBSVFdfU0NBTl9SRVNVTFRfRVhQSVJFIDIwMDAKLSNlbmRpZgotCi0vKgotKiBTZWxlY3QgYSBuZXcgam9pbiBjYW5kaWRhdGUgZnJvbSB0aGUgb3JpZ2luYWwgQHBhcmFtIGNhbmRpZGF0ZSBhbmQKLSogICAgIEBwYXJhbSBjb21wZXRpdG9yCi0qIEByZXR1cm4gdHJ1ZTogY2FuZGlkYXRlIGlzIHVwZGF0ZWQKLSogQHJldHVybiBmYWxzZTogY2FuZGlkYXRlIGlzIG5vdCB1cGRhdGVkCi0qLwotc3RhdGljIGludCBydHdfY2hlY2tfam9pbl9jYW5kaWRhdGUoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LAotCQkJCSAgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICoqY2FuZGlkYXRlLAotCQkJCSAgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjb21wZXRpdG9yKQotewotCWludCB1cGRhdGVkID0gZmFsc2U7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyOwotCi0JYWRhcHRlciA9IGNvbnRhaW5lcl9vZihwbWxtZXByaXYsIHN0cnVjdCBydHdfYWRhcHRlciwgbWxtZXByaXYpOwotCi0JLyogY2hlY2sgYnNzaWQsIGlmIG5lZWRlZCAqLwotCWlmIChwbWxtZXByaXYtPmFzc29jX2J5X2Jzc2lkID09IHRydWUpIHsKLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKGNvbXBldGl0b3ItPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCQkgICAgICBwbWxtZXByaXYtPmFzc29jX2Jzc2lkKSkKLQkJCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBjaGVjayBzc2lkLCBpZiBuZWVkZWQgKi8KLQlpZiAocG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWRfbGVuKSB7Ci0JCWlmIChjb21wZXRpdG9yLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4gIT0KLQkJICAgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbiB8fAotCQkgICAgbWVtY21wKGNvbXBldGl0b3ItPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJICAgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQsCi0JCQkgICBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4pKQotCQkJZ290byBleGl0OwotCX0KLQotCWlmIChydHdfaXNfZGVzaXJlZF9uZXR3b3JrKGFkYXB0ZXIsIGNvbXBldGl0b3IpID09IGZhbHNlKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAoYWRhcHRlci0+bWxtZXByaXYudG9fcm9hbWluZyA+IDApIHsKLQkJdW5zaWduZWQgaW50IHBhc3NlZDsKLQotCQlwYXNzZWQgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBjb21wZXRpdG9yLT5sYXN0X3NjYW5uZWQpOwotCQlpZiAocGFzc2VkID49IFJUV19TQ0FOX1JFU1VMVF9FWFBJUkUgfHwKLQkJICAgIGlzX3NhbWVfZXNzKCZjb21wZXRpdG9yLT5uZXR3b3JrLAotCQkJCSZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmspID09IGZhbHNlKQotCQkJZ290byBleGl0OwotCX0KLQotCWlmICghKmNhbmRpZGF0ZSB8fAotCSAgICAoKmNhbmRpZGF0ZSktPm5ldHdvcmsuUnNzaTxjb21wZXRpdG9yLT5uZXR3b3JrLlJzc2kpIHsKLQkJKmNhbmRpZGF0ZSA9IGNvbXBldGl0b3I7Ci0JCXVwZGF0ZWQgPSB0cnVlOwotCX0KLQotCWlmICh1cGRhdGVkKSB7Ci0JCURCR184NzIzQSgiW2J5X2Jzc2lkOiV1XVthc3NvY19zc2lkOiVzXVt0b19yb2FtaW5nOiV1XSBuZXcgY2FuZGlkYXRlOiAlcyglcE0pIHJzc2k6JWRcbiIsCi0JCQkgIHBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQsCi0JCQkgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkLAotCQkJICBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nLAotCQkJICAoKmNhbmRpZGF0ZSktPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJICAoKmNhbmRpZGF0ZSktPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCSAgKGludCkoKmNhbmRpZGF0ZSktPm5ldHdvcmsuUnNzaSk7Ci0JfQotCi1leGl0OgotCXJldHVybiB1cGRhdGVkOwotfQotCi0vKgotQ2FsbGluZyBjb250ZXh0OgotVGhlIGNhbGxlciBvZiB0aGUgc3ViLXJvdXRpbmUgd2lsbCBiZSBpbiBjcml0aWNhbCBzZWN0aW9uLi4uCi0KLVRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBmb2xsb3dpbmcgc3BpbmxvY2sKLQotcG1sbWVwcml2LT5sb2NrCi0KLSovCi0KLXN0YXRpYyBpbnQgcnR3X2RvX2pvaW4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCWludCByZXQ7Ci0KLQlwbWxtZXByaXYtPmN1cl9uZXR3b3JrLmpvaW5fcmVzID0gLTI7Ci0KLQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKLQotCXBtbG1lcHJpdi0+dG9fam9pbiA9IHRydWU7Ci0KLQlyZXQgPSBydHdfc2VsZWN0X2FuZF9qb2luX2Zyb21fc2Nhbm5lZF9xdWV1ZTIzYShwbWxtZXByaXYpOwotCWlmIChyZXQgPT0gX1NVQ0NFU1MpIHsKLQkJcG1sbWVwcml2LT50b19qb2luID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSkgewotCQkJLyogc3dpdGNoIHRvIEFESE9DX01BU1RFUiAqLwotCQkJcmV0ID0gcnR3X2RvX2pvaW5fYWRob2MocGFkYXB0ZXIpOwotCQkJaWYgKHJldCAhPSBfU1VDQ0VTUykKLQkJCQlnb3RvIGV4aXQ7Ci0JCX0gZWxzZSB7Ci0JCQkvKiAgY2FuJ3QgYXNzb2NpYXRlIDsgcmVzZXQgdW5kZXItbGlua2luZyAqLwotCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKLQotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlwbWxtZXByaXYtPnRvX2pvaW4gPSBmYWxzZTsKLQkJfQotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHdsYW5fbmV0d29yayAqCi1ydHdfc2VsZWN0X2NhbmRpZGF0ZV9mcm9tX3F1ZXVlKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaywgKnB0bXAsICpjYW5kaWRhdGUgPSBOVUxMOwotCXN0cnVjdCBydHdfcXVldWUgKnF1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChxdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBuZXR3b3JrLCBwdG1wLCBwaGVhZCwgbGlzdCkKLQkJcnR3X2NoZWNrX2pvaW5fY2FuZGlkYXRlKHBtbG1lcHJpdiwgJmNhbmRpZGF0ZSwgcG5ldHdvcmspOwotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7Ci0KLQlyZXR1cm4gY2FuZGlkYXRlOwotfQotCi0KLWludCBydHdfZG9fam9pbl9hZGhvYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwZGV2X25ldHdvcms7Ci0JdTggKmlic3M7Ci0JaW50IHJldDsKLQotCXBkZXZfbmV0d29yayA9ICZhZGFwdGVyLT5yZWdpc3RyeXByaXYuZGV2X25ldHdvcms7Ci0JaWJzcyA9IGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5kZXZfbmV0d29yay5NYWNBZGRyZXNzOwotCi0JX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJICJzd2l0Y2hpbmcgdG8gYWRob2MgbWFzdGVyXG4iKTsKLQotCW1lbWNweSgmcGRldl9uZXR3b3JrLT5Tc2lkLCAmcG1sbWVwcml2LT5hc3NvY19zc2lkLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGNmZzgwMjExX3NzaWQpKTsKLQotCXJ0d191cGRhdGVfcmVnaXN0cnlwcml2X2Rldl9uZXR3b3JrMjNhKGFkYXB0ZXIpOwotCXJ0d19nZW5lcmF0ZV9yYW5kb21faWJzczIzYShpYnNzKTsKLQotCXBtbG1lcHJpdi0+Zndfc3RhdGUgPSBXSUZJX0FESE9DX01BU1RFUl9TVEFURTsKLQotCXJldCA9IHJ0d19jcmVhdGVic3NfY21kMjNhKGFkYXB0ZXIpOwotCWlmIChyZXQgIT0gX1NVQ0NFU1MpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAiRXJyb3IgPT5ydHdfY3JlYXRlYnNzX2NtZDIzYSBzdGF0dXMgRkFJTFxuIik7Ci0JfSBlbHNlICB7Ci0JCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydHdfZG9fam9pbl9uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCXN0cnVjdCB3bGFuX25ldHdvcmsgKmNhbmRpZGF0ZSkKLXsKLQlpbnQgcmV0OwotCi0JLyogIGNoZWNrIGZvciBzaXR1YXRpb24gb2YgIF9GV19MSU5LRUQgKi8KLQlpZiAoY2hlY2tfZndzdGF0ZSgmYWRhcHRlci0+bWxtZXByaXYsIF9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXM6IF9GV19MSU5LRUQgd2hpbGUgYXNrX2Zvcl9qb2luYnNzIVxuIiwgX19mdW5jX18pOwotCi0JCXJ0d19kaXNhc3NvY19jbWQyM2EoYWRhcHRlciwgMCwgdHJ1ZSk7Ci0JCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKGFkYXB0ZXIpOwotCQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EoYWRhcHRlciwgMCk7Ci0JfQotCXNldF9md3N0YXRlKCZhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwotCi0JcmV0ID0gcnR3X2pvaW5ic3NfY21kMjNhKGFkYXB0ZXIsIGNhbmRpZGF0ZSk7Ci0KLQlpZiAocmV0ID09IF9TVUNDRVNTKQotCQltb2RfdGltZXIoJmFkYXB0ZXItPm1sbWVwcml2LmFzc29jX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhNQVhfSk9JTl9USU1FT1VUKSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfcXVldWUyM2Eoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjYW5kaWRhdGUgPSBOVUxMOwotCWludCByZXQ7Ci0KLQlhZGFwdGVyID0gcG1sbWVwcml2LT5uaWNfaGRsOwotCi0JY2FuZGlkYXRlID0gcnR3X3NlbGVjdF9jYW5kaWRhdGVfZnJvbV9xdWV1ZShwbWxtZXByaXYpOwotCWlmICghY2FuZGlkYXRlKSB7Ci0JCURCR184NzIzQSgiJXM6IHJldHVybiBfRkFJTChjYW5kaWRhdGUgPT0gTlVMTClcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzOiBjYW5kaWRhdGU6ICVzKCVwTSwgY2g6JXUpXG4iLAotCQkJICBfX2Z1bmNfXywKLQkJCSAgY2FuZGlkYXRlLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCSAgY2FuZGlkYXRlLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkgIGNhbmRpZGF0ZS0+bmV0d29yay5EU0NvbmZpZyk7Ci0JfQotCi0JcmV0ID0gcnR3X2RvX2pvaW5fbmV0d29yayhhZGFwdGVyLCBjYW5kaWRhdGUpOwotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydHdfc2V0X2F1dGgyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkgICAgc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBjbWQ7Ci0Jc3RydWN0IHNldGF1dGhfcGFybSAqcHNldGF1dGhwYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmYWRhcHRlci0+Y21kcHJpdjsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlwY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjbWQpIHsKLQkJcmVzID0gX0ZBSUw7ICAvKiB0cnkgYWdhaW4gKi8KLQkJZ290byBleGl0OwotCX0KLQotCXBzZXRhdXRocGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRhdXRoX3Bhcm0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBzZXRhdXRocGFybSkgewotCQlrZnJlZShwY21kKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwc2V0YXV0aHBhcm0tPm1vZGUgPSAodW5zaWduZWQgY2hhcilwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtOwotCi0JcGNtZC0+Y21kY29kZSA9IF9TZXRBdXRoX0NNRF87Ci0JcGNtZC0+cGFybWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopcHNldGF1dGhwYXJtOwotCXBjbWQtPmNtZHN6ID0gIChzaXplb2Yoc3RydWN0IHNldGF1dGhfcGFybSkpOwotCXBjbWQtPnJzcCA9IE5VTEw7Ci0JcGNtZC0+cnNwc3ogPSAwOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJICJhZnRlciBlbnF1ZXVlIHNldF9hdXRoX2NtZCwgYXV0aF9tb2RlPSV4XG4iLAotCQkgcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSk7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWQpOwotCi1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotaW50IHJ0d19zZXRfa2V5MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJICAgc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYsIGludCBrZXlpZCwgdTggc2V0X3R4KQotewotCXU4IGtleWxlbjsKLQlzdHJ1Y3QgY21kX29iaiAqcGNtZDsKLQlzdHJ1Y3Qgc2V0a2V5X3Bhcm0gKnBzZXRrZXlwYXJtOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmYWRhcHRlci0+Y21kcHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JaWYgKGtleWlkID49IDQpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjbWQpIHsKLQkJcmVzID0gX0ZBSUw7ICAvKiB0cnkgYWdhaW4gKi8KLQkJZ290byBleGl0OwotCX0KLQlwc2V0a2V5cGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRrZXlfcGFybSksIEdGUF9LRVJORUwpOwotCWlmICghcHNldGtleXBhcm0pIHsKLQkJa2ZyZWUocGNtZCk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPT0gZG90MTFBdXRoQWxncnRobV84MDIxWCkgewotCQlwc2V0a2V5cGFybS0+YWxnb3JpdGhtID0gKHVuc2lnbmVkIGNoYXIpCi0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3NldF9rZXkyM2E6IHBzZXRrZXlwYXJtLT5hbGdvcml0aG0gPSAodW5zaWduZWQgY2hhcilwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9JWRcbiIsCi0JCQkgcHNldGtleXBhcm0tPmFsZ29yaXRobSk7Ci0JfSBlbHNlIHsKLQkJcHNldGtleXBhcm0tPmFsZ29yaXRobSA9ICh1OClwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfc2V0X2tleTIzYTogcHNldGtleXBhcm0tPmFsZ29yaXRobSA9ICh1OClwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0lZFxuIiwKLQkJCSBwc2V0a2V5cGFybS0+YWxnb3JpdGhtKTsKLQl9Ci0JcHNldGtleXBhcm0tPmtleWlkID0ga2V5aWQ7LyogMH4zICovCi0JcHNldGtleXBhcm0tPnNldF90eCA9IHNldF90eDsKLQlpZiAoaXNfd2VwX2VuYyhwc2V0a2V5cGFybS0+YWxnb3JpdGhtKSkKLQkJcG1sbWVwcml2LT5rZXlfbWFzayB8PSBCSVQocHNldGtleXBhcm0tPmtleWlkKTsKLQotCURCR184NzIzQSgiPT0+IHJ0d19zZXRfa2V5MjNhIGFsZ29yaXRobSgleCksIGtleWlkKCV4KSwga2V5X21hc2soJXgpXG4iLAotCQkgIHBzZXRrZXlwYXJtLT5hbGdvcml0aG0sIHBzZXRrZXlwYXJtLT5rZXlpZCwKLQkJICBwbWxtZXByaXYtPmtleV9tYXNrKTsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgInJ0d19zZXRfa2V5MjNhOiBwc2V0a2V5cGFybS0+YWxnb3JpdGhtID0lZCBwc2V0a2V5cGFybS0+a2V5aWQgPSAodTgpa2V5aWQgPSVkXG4iLAotCQkgcHNldGtleXBhcm0tPmFsZ29yaXRobSwga2V5aWQpOwotCi0Jc3dpdGNoIChwc2V0a2V5cGFybS0+YWxnb3JpdGhtKSB7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQkJa2V5bGVuID0gNTsKLQkJbWVtY3B5KCZwc2V0a2V5cGFybS0+a2V5WzBdLAotCQkgICAgICAgJnBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleSwga2V5bGVuKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCWtleWxlbiA9IDEzOwotCQltZW1jcHkoJnBzZXRrZXlwYXJtLT5rZXlbMF0sCi0JCSAgICAgICAmcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5LCBrZXlsZW4pOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCWtleWxlbiA9IDE2OwotCQltZW1jcHkoJnBzZXRrZXlwYXJtLT5rZXksCi0JCSAgICAgICAmcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleVtrZXlpZF0sIGtleWxlbik7Ci0JCXBzZXRrZXlwYXJtLT5ncnBrZXkgPSAxOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCWtleWxlbiA9IDE2OwotCQltZW1jcHkoJnBzZXRrZXlwYXJtLT5rZXksCi0JCSAgICAgICAmcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleVtrZXlpZF0sIGtleWxlbik7Ci0JCXBzZXRrZXlwYXJtLT5ncnBrZXkgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfc2V0X2tleTIzYTpwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gJXggKG11c3QgYmUgMSBvciAyIG9yIDQgb3IgNSlcbiIsCi0JCQkgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSk7Ci0JCXJlcyA9IF9GQUlMOwotCQlrZnJlZShwY21kKTsKLQkJa2ZyZWUocHNldGtleXBhcm0pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGNtZC0+Y21kY29kZSA9IF9TZXRLZXlfQ01EXzsKLQlwY21kLT5wYXJtYnVmID0gKHU4ICopcHNldGtleXBhcm07Ci0JcGNtZC0+Y21kc3ogPSAgKHNpemVvZihzdHJ1Y3Qgc2V0a2V5X3Bhcm0pKTsKLQlwY21kLT5yc3AgPSBOVUxMOwotCXBjbWQtPnJzcHN6ID0gMDsKLQotCS8qIHNlbWFfaW5pdCgmcGNtZC0+Y21kX3NlbSwgMCk7ICovCi0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWQpOwotCi1leGl0OgotCi0JcmV0dXJuIHJlczsKLX0KLQotLyogYWRqdXN0IElFcyBmb3IgcnR3X2pvaW5ic3NfY21kMjNhIGluIFdNTSAqLwotaW50IHJ0d19yZXN0cnVjdF93bW1faWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCAqaW5faWUsCi0JCQkgICB1OCAqb3V0X2llLCB1aW50IGluX2xlbiwgdWludCBpbml0aWFsX291dF9sZW4pCi17Ci0JaW50IGllbGVuZ3RoOwotCWNvbnN0IHU4ICpwOwotCi0JaWVsZW5ndGggPSBpbml0aWFsX291dF9sZW47Ci0KLQlwID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCSAgICBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XTU0sCi0JCQkJICAgIGluX2llLCBpbl9sZW4pOwotCi0JaWYgKHAgJiYgcFsxXSkgewotCQltZW1jcHkob3V0X2llICsgaW5pdGlhbF9vdXRfbGVuLCBwLCA5KTsKLQotCQlvdXRfaWVbaW5pdGlhbF9vdXRfbGVuICsgMV0gPSA3OwotCQlvdXRfaWVbaW5pdGlhbF9vdXRfbGVuICsgNl0gPSAwOwotCQlvdXRfaWVbaW5pdGlhbF9vdXRfbGVuICsgOF0gPSAwOwotCi0JCWllbGVuZ3RoICs9IDk7Ci0JfQotCi0JcmV0dXJuIGllbGVuZ3RoOwotfQotCi0vKiAgKi8KLS8qICBQb3J0ZWQgZnJvbSA4MTg1OiBJc0luUHJlQXV0aEtleUxpc3QoKS4KLSAgICAoUmVuYW1lZCBmcm9tIFNlY0lzSW5QcmVBdXRoS2V5TGlzdCgpLCAyMDA2LTEwLTEzLikgKi8KLS8qICBBZGRlZCBieSBBbm5pZSwgMjAwNi0wNS0wNy4gKi8KLS8qICAqLwotLyogIFNlYXJjaCBieSBCU1NJRCwgKi8KLS8qICBSZXR1cm4gVmFsdWU6ICovCi0vKgkJLTEJOmlmIHRoZXJlIGlzIG5vIHByZS1hdXRoIGtleSBpbiB0aGUgIHRhYmxlICovCi0vKgkJPj0gMAk6aWYgdGhlcmUgaXMgcHJlLWF1dGgga2V5LCBhbmQgICByZXR1cm4gdGhlIGVudHJ5IGlkICovCi0vKiAgKi8KLS8qICAqLwotCi1zdGF0aWMgaW50IFNlY0lzSW5QTUtJRExpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCAqYnNzaWQpCi17Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmQWRhcHRlci0+c2VjdXJpdHlwcml2OwotCWludCBpID0gMDsKLQotCWRvIHsKLQkJaWYgKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpXS5iVXNlZCAmJgotICAgICAgICAgICAgICAgICAgICBldGhlcl9hZGRyX2VxdWFsKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpXS5Cc3NpZCwgYnNzaWQpKSB7Ci0JCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCWkrKzsKLQkJCS8qIGNvbnRpbnVlOyAqLwotCQl9Ci0JfSB3aGlsZSAoaSA8IE5VTV9QTUtJRF9DQUNIRSk7Ci0KLQlpZiAoaSA9PSBOVU1fUE1LSURfQ0FDSEUpCi0JCWkgPSAtMTsvKiAgQ291bGQgbm90IGZpbmQuICovCi0JZWxzZSB7Ci0JCS8qICBUaGVyZSBpcyBvbmUgUHJlLUF1dGhlbnRpY2F0aW9uIEtleSBmb3IKLQkJICAgIHRoZSBzcGVjaWZpYyBCU1NJRC4gKi8KLQl9Ci0KLQlyZXR1cm4gaTsKLX0KLQotLyogICovCi0vKiAgQ2hlY2sgdGhlIFJTTiBJRSBsZW5ndGggKi8KLS8qICBJZiB0aGUgUlNOIElFIGxlbmd0aCA8PSAyMCwgdGhlIFJTTiBJRSBkaWRuJ3QgaW5jbHVkZQotICAgIHRoZSBQTUtJRCBpbmZvcm1hdGlvbiAqLwotLyogIDAtMTF0aCBlbGVtZW50IGluIHRoZSBhcnJheSBhcmUgdGhlIGZpeGVkIElFICovCi0vKiAgMTJ0aCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyB0aGUgSUUgKi8KLS8qICAxM3RoIGVsZW1lbnQgaW4gdGhlIGFycmF5IGlzIHRoZSBJRSBsZW5ndGggKi8KLS8qICAqLwotCi1zdGF0aWMgaW50IHJ0d19hcHBlbmRfcG1raWQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCBpbnQgaUVudHJ5LAotCQkJICAgIHU4ICppZSwgdWludCBpZV9sZW4pCi17Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmQWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JaWYgKGllWzFdIDw9IDIwKSB7Ci0JCS8qICBUaGUgUlNOIElFIGRpZG4ndCBpbmNsdWRlIHRoZSBQTUsgSUQsCi0JCSAgICBhcHBlbmQgdGhlIFBNSyBpbmZvcm1hdGlvbiAqLwotCQkJaWVbaWVfbGVuXSA9IDE7Ci0JCQlpZV9sZW4rKzsKLQkJCWllW2llX2xlbl0gPSAwOwkvKiBQTUtJRCBjb3VudCA9IDB4MDEwMCAqLwotCQkJaWVfbGVuKys7Ci0JCQltZW1jcHkoJmllW2llX2xlbl0sCi0JCQkgICAgICAgJnBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpRW50cnldLlBNS0lELCAxNik7Ci0KLQkJCWllX2xlbiArPSAxNjsKLQkJCWllWzFdICs9IDE4Oy8qIFBNS0lEIGxlbmd0aCA9IDIrMTYgKi8KLQl9Ci0JcmV0dXJuIGllX2xlbjsKLX0KLQotaW50IHJ0d19yZXN0cnVjdF9zZWNfaWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCAqaW5faWUsIHU4ICpvdXRfaWUsCi0JCQkgICB1aW50IGluX2xlbikKLXsKLQl1OCBhdXRobW9kZTsKLQl1aW50IGllbGVuZ3RoOwotCWludCBpRW50cnk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQl1aW50IG5kaXNhdXRobW9kZSA9IHBzZWN1cml0eXByaXYtPm5kaXNhdXRodHlwZTsKLQl1aW50IG5kaXNzZWN1cml0eXR5cGUgPSBwc2VjdXJpdHlwcml2LT5uZGlzZW5jcnlwdHN0YXR1czsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAiK3J0d19yZXN0cnVjdF9zZWNfaWUyM2E6IG5kaXNhdXRobW9kZT0lZCBuZGlzc2VjdXJpdHl0eXBlPSVkXG4iLAotCQkgbmRpc2F1dGhtb2RlLCBuZGlzc2VjdXJpdHl0eXBlKTsKLQotCWllbGVuZ3RoID0gMDsKLQlpZiAobmRpc2F1dGhtb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQSB8fAotCSAgICBuZGlzYXV0aG1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLKQotCQlhdXRobW9kZSA9IFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzsKLQlpZiAobmRpc2F1dGhtb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgfHwKLQkgICAgbmRpc2F1dGhtb2RlID09IE5kaXM4MDJfMTFBdXRoTW9kZVdQQTJQU0spCi0JCWF1dGhtb2RlID0gV0xBTl9FSURfUlNOOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1VOREVSX1dQUykpIHsKLQkJbWVtY3B5KG91dF9pZSArIGllbGVuZ3RoLCBwc2VjdXJpdHlwcml2LT53cHNfaWUsCi0JCSAgICAgICBwc2VjdXJpdHlwcml2LT53cHNfaWVfbGVuKTsKLQotCQlpZWxlbmd0aCArPSBwc2VjdXJpdHlwcml2LT53cHNfaWVfbGVuOwotCX0gZWxzZSBpZiAoYXV0aG1vZGUgPT0gV0xBTl9FSURfVkVORE9SX1NQRUNJRklDIHx8Ci0JCSAgIGF1dGhtb2RlID09IFdMQU5fRUlEX1JTTikgewotCQkvKiBjb3B5IFJTTiBvciBTU04gKi8KLQkJbWVtY3B5KCZvdXRfaWVbaWVsZW5ndGhdLCAmcHNlY3VyaXR5cHJpdi0+c3VwcGxpY2FudF9pZVswXSwKLQkJICAgICAgIHBzZWN1cml0eXByaXYtPnN1cHBsaWNhbnRfaWVbMV0gKyAyKTsKLQkJaWVsZW5ndGggKz0gcHNlY3VyaXR5cHJpdi0+c3VwcGxpY2FudF9pZVsxXSArIDI7Ci0JfQotCi0JaUVudHJ5ID0gU2VjSXNJblBNS0lETGlzdChhZGFwdGVyLCBwbWxtZXByaXYtPmFzc29jX2Jzc2lkKTsKLQlpZiAoaUVudHJ5IDwgMCkKLQkJcmV0dXJuIGllbGVuZ3RoOwotCWVsc2UgewotCQlpZiAoYXV0aG1vZGUgPT0gV0xBTl9FSURfUlNOKQotCQkJaWVsZW5ndGggPSBydHdfYXBwZW5kX3Bta2lkKGFkYXB0ZXIsIGlFbnRyeSwKLQkJCQkJCSAgICBvdXRfaWUsIGllbGVuZ3RoKTsKLQl9Ci0KLQlyZXR1cm4gaWVsZW5ndGg7Ci19Ci0KLXZvaWQgcnR3X2luaXRfcmVnaXN0cnlwcml2X2Rldl9uZXR3b3JrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IGVlcHJvbV9wcml2ICpwZWVwcml2ID0gJmFkYXB0ZXItPmVlcHJvbXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggICAgKnBkZXZfbmV0d29yayA9ICZwcmVnaXN0cnlwcml2LT5kZXZfbmV0d29yazsKLQl1OCAqbXlod2FkZHIgPSBteWlkKHBlZXByaXYpOwotCi0JZXRoZXJfYWRkcl9jb3B5KHBkZXZfbmV0d29yay0+TWFjQWRkcmVzcywgbXlod2FkZHIpOwotCi0JbWVtY3B5KCZwZGV2X25ldHdvcmstPlNzaWQsICZwcmVnaXN0cnlwcml2LT5zc2lkLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGNmZzgwMjExX3NzaWQpKTsKLQotCXBkZXZfbmV0d29yay0+YmVhY29uX2ludGVydmFsID0gMTAwOwotfQotCi12b2lkIHJ0d191cGRhdGVfcmVnaXN0cnlwcml2X2Rldl9uZXR3b3JrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgc3ogPSAwOwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJmFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGRldl9uZXR3b3JrID0gJnByZWdpc3RyeXByaXYtPmRldl9uZXR3b3JrOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjdXJfbmV0d29yayA9ICZhZGFwdGVyLT5tbG1lcHJpdi5jdXJfbmV0d29yazsKLQkvKiBzdHJ1Y3QJeG1pdF9wcml2CSpweG1pdHByaXYgPSAmYWRhcHRlci0+eG1pdHByaXY7ICovCi0KLQlwZGV2X25ldHdvcmstPlByaXZhY3kgPQotCQkocHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA+IDAgPyAxIDogMCk7Ci0KLQlwZGV2X25ldHdvcmstPlJzc2kgPSAwOwotCi0JcGRldl9uZXR3b3JrLT5EU0NvbmZpZyA9IHByZWdpc3RyeXByaXYtPmNoYW5uZWw7Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAicHJlZ2lzdHJ5cHJpdi0+Y2hhbm5lbCA9JWQsIHBkZXZfbmV0d29yay0+RFNDb25maWcgPSAweCV4XG4iLAotCQkgcHJlZ2lzdHJ5cHJpdi0+Y2hhbm5lbCwgcGRldl9uZXR3b3JrLT5EU0NvbmZpZyk7Ci0KLQlpZiAoY3VyX25ldHdvcmstPm5ldHdvcmsuaWZtb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQotCQlwZGV2X25ldHdvcmstPkFUSU1XaW5kb3cgPSAwOwotCi0JcGRldl9uZXR3b3JrLT5pZm1vZGUgPSBjdXJfbmV0d29yay0+bmV0d29yay5pZm1vZGU7Ci0KLQkvKiAgMS4gU3VwcG9ydGVkIHJhdGVzICovCi0JLyogIDIuIElFICovCi0KLQlzeiA9IHJ0d19nZW5lcmF0ZV9pZTIzYShwcmVnaXN0cnlwcml2KTsKLQotCXBkZXZfbmV0d29yay0+SUVMZW5ndGggPSBzejsKLQotCXBkZXZfbmV0d29yay0+TGVuZ3RoID0KLQkJZ2V0X3dsYW5fYnNzaWRfZXhfc3oocGRldl9uZXR3b3JrKTsKLQotCS8qIG5vdGVzOiB0cmFuc2xhdGUgSUVMZW5ndGggJiBMZW5ndGggYWZ0ZXIgYXNzaWduIHRoZQotCSAgIExlbmd0aCB0byBjbWRzeiBpbiBjcmVhdGVic3NfY21kKCk7ICovCi0JLyogcGRldl9uZXR3b3JrLT5JRUxlbmd0aCA9IGNwdV90b19sZTMyKHN6KTsgKi8KLX0KLQotLyogdGhlIGZ1bmN0aW9uIGlzIGF0IHBhc3NpdmVfbGV2ZWwgKi8KLXZvaWQgcnR3X2pvaW5ic3NfcmVzZXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCB0aHJlc2hvbGQ7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKLQotCS8qIHRvZG86IGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBpby9yZWcvaHcgc2V0dGluZwotCSAgIGJlZm9yZSBqb2luX2JzcywgcGxlYXNlIGFkZCBjb2RlIGhlcmUgKi8KLQotCXBtbG1lcHJpdi0+bnVtX0ZvcnR5TUh6SW50b2xlcmFudCA9IDA7Ci0KLQlwbWxtZXByaXYtPm51bV9zdGFfbm9faHQgPSAwOwotCi0JcGh0cHJpdi0+YW1wZHVfZW5hYmxlID0gZmFsc2U7LyogcmVzZXQgdG8gZGlzYWJsZWQgKi8KLQotCS8qICBUSCA9IDEgPT4gbWVhbnMgdGhhdCBpbnZhbGlkYXRlIHVzYiByeCBhZ2dyZWdhdGlvbiAqLwotCS8qICBUSCA9IDAgPT4gbWVhbnMgdGhhdCB2YWxpZGF0ZSB1c2IgcnggYWdncmVnYXRpb24sIHVzZSBpbml0IHZhbHVlLiAqLwotCWlmIChwaHRwcml2LT5odF9vcHRpb24pIHsKLQkJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjID09IDEpCi0JCQl0aHJlc2hvbGQgPSAxOwotCQllbHNlCi0JCQl0aHJlc2hvbGQgPSAwOwotCX0gZWxzZQotCQl0aHJlc2hvbGQgPSAxOwotCi0JcnRsODcyM2Ffc2V0X3J4ZG1hX2FnZ19wZ190aChwYWRhcHRlciwgdGhyZXNob2xkKTsKLX0KLQotLyogdGhlIGZ1bmN0aW9uIGlzID49IHBhc3NpdmVfbGV2ZWwgKi8KLWJvb2wgcnR3X3Jlc3RydWN0dXJlX2h0X2llMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICppbl9pZSwKLQkJCSAgICAgIHU4ICpvdXRfaWUsIHVpbnQgaW5fbGVuLCB1aW50ICpwb3V0X2xlbikKLXsKLQl1MzIgb3V0X2xlbjsKLQlpbnQgbWF4X3J4X2FtcGR1X2ZhY3RvcjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0JY29uc3QgdTggKnA7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwaWU7Ci0JdTggV01NX0lFWzddID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDB9OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IGh0X3ByaXYgKnBodHByaXYgPSAmcG1sbWVwcml2LT5odHByaXY7Ci0KLQlwaHRwcml2LT5odF9vcHRpb24gPSBmYWxzZTsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksIGluX2llLCBpbl9sZW4pOwotCi0JaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJdTMyIHJ4X3BhY2tldF9vZmZzZXQsIG1heF9yZWN2YnVmX3N6OwotCi0JCWlmIChwbWxtZXByaXYtPnFvc19vcHRpb24gPT0gMCkgewotCQkJb3V0X2xlbiA9ICpwb3V0X2xlbjsKLQkJCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2Eob3V0X2llICsgb3V0X2xlbiwKLQkJCQkJICAgICAgIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQywKLQkJCQkJICAgICAgIHNpemVvZihXTU1fSUUpLCBXTU1fSUUsCi0JCQkJCSAgICAgICBwb3V0X2xlbik7Ci0KLQkJCXBtbG1lcHJpdi0+cW9zX29wdGlvbiA9IDE7Ci0JCX0KLQotCQlvdXRfbGVuID0gKnBvdXRfbGVuOwotCi0JCW1lbXNldCgmaHRfY2FwaWUsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOwotCi0JCWh0X2NhcGllLmNhcF9pbmZvID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDAgfAotCQkJSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfCBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8Ci0JCQlJRUVFODAyMTFfSFRfQ0FQX1RYX1NUQkMgfCBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MCk7Ci0KLQkJR2V0SGFsRGVmVmFyODE5MkNVc2IocGFkYXB0ZXIsIEhBTF9ERUZfUlhfUEFDS0VUX09GRlNFVCwKLQkJCQkgICAgICZyeF9wYWNrZXRfb2Zmc2V0KTsKLQkJR2V0SGFsRGVmVmFyODE5MkNVc2IocGFkYXB0ZXIsIEhBTF9ERUZfTUFYX1JFQ1ZCVUZfU1osCi0JCQkJICAgICAmbWF4X3JlY3ZidWZfc3opOwotCi0JCUdldEhhbERlZlZhcjgxOTJDVXNiKHBhZGFwdGVyLCBIV19WQVJfTUFYX1JYX0FNUERVX0ZBQ1RPUiwKLQkJCQkgICAgICZtYXhfcnhfYW1wZHVfZmFjdG9yKTsKLQkJaHRfY2FwaWUuYW1wZHVfcGFyYW1zX2luZm8gPSBtYXhfcnhfYW1wZHVfZmFjdG9yICYgMHgwMzsKLQotCQlpZiAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID09Ci0JCSAgICBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKQotCQkJaHRfY2FwaWUuYW1wZHVfcGFyYW1zX2luZm8gfD0KLQkJCQkoSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWSYgKDB4MDcgPDwgMikpOwotCQllbHNlCi0JCQlodF9jYXBpZS5hbXBkdV9wYXJhbXNfaW5mbyB8PQotCQkJCShJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZICYgMHgwMCk7Ci0KLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShvdXRfaWUgKyBvdXRfbGVuLCBXTEFOX0VJRF9IVF9DQVBBQklMSVRZLAotCQkJCSAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApLAotCQkJCSAgICAodW5zaWduZWQgY2hhciAqKSZodF9jYXBpZSwgcG91dF9sZW4pOwotCi0JCXBodHByaXYtPmh0X29wdGlvbiA9IHRydWU7Ci0KLQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfT1BFUkFUSU9OLCBpbl9pZSwgaW5fbGVuKTsKLQkJaWYgKHAgJiYgKHBbMV0gPT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uKSkpIHsKLQkJCW91dF9sZW4gPSAqcG91dF9sZW47Ci0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKG91dF9pZSArIG91dF9sZW4sCi0JCQkJCSAgICAgICBXTEFOX0VJRF9IVF9PUEVSQVRJT04sCi0JCQkJCSAgICAgICBwWzFdLCBwICsgMiAsIHBvdXRfbGVuKTsKLQkJfQotCX0KLQotCXJldHVybiBwaHRwcml2LT5odF9vcHRpb247Ci19Ci0KLS8qIHRoZSBmdW5jdGlvbiBpcyA+IHBhc3NpdmVfbGV2ZWwgKGluIGNyaXRpY2FsX3NlY3Rpb24pICovCi12b2lkIHJ0d191cGRhdGVfaHRfY2FwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwaWUsIHVpbnQgaWVfbGVuKQotewotCXU4IG1heF9hbXBkdV9zejsKLQljb25zdCB1OCAqcDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOwotCXN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICpwaHRfYWRkdGluZm87Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdiA9ICZwbWxtZXByaXYtPmh0cHJpdjsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlpZiAoIXBodHByaXYtPmh0X29wdGlvbikKLQkJcmV0dXJuOwotCi0JaWYgKCghcG1sbWVpbmZvLT5IVF9pbmZvX2VuYWJsZSkgfHwgKCFwbWxtZWluZm8tPkhUX2NhcHNfZW5hYmxlKSkKLQkJcmV0dXJuOwotCi0JREJHXzg3MjNBKCIrcnR3X3VwZGF0ZV9odF9jYXAyM2EoKVxuIik7Ci0KLQkvKiBtYXliZSBuZWVkcyBjaGVjayBpZiBhcCBzdXBwb3J0cyByeCBhbXBkdS4gKi8KLQlpZiAoIXBodHByaXYtPmFtcGR1X2VuYWJsZSAmJiBwcmVnaXN0cnlwcml2LT5hbXBkdV9lbmFibGUgPT0gMSkgewotCQlpZiAocHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjID09IDEpCi0JCQlwaHRwcml2LT5hbXBkdV9lbmFibGUgPSBmYWxzZTsKLQkJZWxzZQotCQkJcGh0cHJpdi0+YW1wZHVfZW5hYmxlID0gdHJ1ZTsKLQl9IGVsc2UgaWYgKHByZWdpc3RyeXByaXYtPmFtcGR1X2VuYWJsZSA9PSAyKQotCQlwaHRwcml2LT5hbXBkdV9lbmFibGUgPSB0cnVlOwotCi0JLyogY2hlY2sgTWF4IFJ4IEEtTVBEVSBTaXplICovCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwgcGllLCBpZV9sZW4pOwotCi0JaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJcGh0X2NhcGllID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKLQkJbWF4X2FtcGR1X3N6ID0gcGh0X2NhcGllLT5hbXBkdV9wYXJhbXNfaW5mbyAmCi0JCQlJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1I7Ci0JCS8qICBtYXhfYW1wZHVfc3ogKGtieXRlcyk7ICovCi0JCW1heF9hbXBkdV9zeiA9IDEgPDwgKG1heF9hbXBkdV9zeiArIDMpOwotCi0JCXBodHByaXYtPnJ4X2FtcGR1X21heGxlbiA9IG1heF9hbXBkdV9zejsKLQl9Ci0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sIHBpZSwgaWVfbGVuKTsKLQlpZiAocCAmJiBwWzFdID4gMCkgewotCQlwaHRfYWRkdGluZm8gPSAoc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKikocCArIDIpOwotCQkvKiB0b2RvOiAqLwotCX0KLQotCS8qIHVwZGF0ZSBjdXJfYndtb2RlICYgY3VyX2NoX29mZnNldCAqLwotCWlmIChwcmVnaXN0cnlwcml2LT5jYnc0MF9lbmFibGUgJiYKLQkgICAgcG1sbWVpbmZvLT5odF9jYXAuY2FwX2luZm8gJgotCSAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkgJiYKLQkgICAgcG1sbWVpbmZvLT5IVF9pbmZvLmh0X3BhcmFtICYgSUVFRTgwMjExX0hUX1BBUkFNX0NIQU5fV0lEVEhfQU5ZKSB7Ci0JCWludCBpOwotCQl1OCByZl90eXBlOwotCi0JCXJmX3R5cGUgPSBydGw4NzIzYV9nZXRfcmZfdHlwZShwYWRhcHRlcik7Ci0KLQkJLyogdXBkYXRlIHRoZSBNQ1MgcmF0ZXMgKi8KLQkJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU47IGkrKykgewotCQkJaWYgKHJmX3R5cGUgPT0gUkZfMVQxUiB8fCByZl90eXBlID09IFJGXzFUMlIpCi0JCQkJcG1sbWVpbmZvLT5odF9jYXAubWNzLnJ4X21hc2tbaV0gJj0KLQkJCQkJTUNTX3JhdGVfMVIyM0FbaV07Ci0JCQllbHNlCi0JCQkJcG1sbWVpbmZvLT5odF9jYXAubWNzLnJ4X21hc2tbaV0gJj0KLQkJCQkJTUNTX3JhdGVfMlIyM0FbaV07Ci0JCX0KLQkJLyogc3dpdGNoIHRvIHRoZSA0ME0gSHogbW9kZSBhY2NvcmRpbmcgdG8gdGhlIEFQICovCi0JCXBtbG1lZXh0LT5jdXJfYndtb2RlID0gSFRfQ0hBTk5FTF9XSURUSF80MDsKLQkJc3dpdGNoIChwbWxtZWluZm8tPkhUX2luZm8uaHRfcGFyYW0gJgotCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfT0ZGU0VUKSB7Ci0JCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU6Ci0JCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c6Ci0JCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUjsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9Ci0JCQkJSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogICovCi0JLyogIENvbmZpZyBTTSBQb3dlciBTYXZlIHNldHRpbmcgKi8KLQkvKiAgKi8KLQlwbWxtZWluZm8tPlNNX1BTID0KLQkJKGxlMTZfdG9fY3B1KHBtbG1laW5mby0+aHRfY2FwLmNhcF9pbmZvKSAmCi0JCSBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKSA+PiBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTX1NISUZUOwotCWlmIChwbWxtZWluZm8tPlNNX1BTID09IFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQykKLQkJREJHXzg3MjNBKCIlcygpOiBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUNcbiIsIF9fZnVuY19fKTsKLQotCS8qICAqLwotCS8qICBDb25maWcgY3VycmVudCBIVCBQcm90ZWN0aW9uIG1vZGUuICovCi0JLyogICovCi0JcG1sbWVpbmZvLT5IVF9wcm90ZWN0aW9uID0KLQkJbGUxNl90b19jcHUocG1sbWVpbmZvLT5IVF9pbmZvLm9wZXJhdGlvbl9tb2RlKSAmCi0JCUlFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT047Ci19Ci0KLXZvaWQgcnR3X2lzc3VlX2FkZGJhcmVxX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewotCXU4IGlzc3VlZDsKLQlpbnQgcHJpb3JpdHk7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBodF9wcml2CSpwaHRwcml2OwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzMzIgYm1jc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSk7Ci0KLQlpZiAoYm1jc3QgfHwgcGFkYXB0ZXItPm1sbWVwcml2LkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCA8IDEwMCkKLQkJcmV0dXJuOwotCi0JcHJpb3JpdHkgPSBwYXR0cmliLT5wcmlvcml0eTsKLQotCWlmIChwYXR0cmliLT5wc3RhKQotCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQllbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgcGF0dHJpYi0+cmEpOwotCX0KLQotCWlmICghcHN0YSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEocHN0YS0+c3RhdGUgJl9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEtPnN0YXRlKDB4JXgpICE9IF9GV19MSU5LRURcbiIsCi0JCQkgIF9fZnVuY19fLCBwc3RhLT5zdGF0ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwaHRwcml2ID0gJnBzdGEtPmh0cHJpdjsKLQotCWlmIChwaHRwcml2LT5odF9vcHRpb24gJiYgcGh0cHJpdi0+YW1wZHVfZW5hYmxlKSB7Ci0JCWlzc3VlZCA9IChwaHRwcml2LT5hZ2dfZW5hYmxlX2JpdG1hcD4+cHJpb3JpdHkpJjB4MTsKLQkJaXNzdWVkIHw9IChwaHRwcml2LT5jYW5kaWRhdGVfdGlkX2JpdG1hcD4+cHJpb3JpdHkpJjB4MTsKLQotCQlpZiAoaXNzdWVkID09IDApIHsKLQkJCURCR184NzIzQSgicnR3X2lzc3VlX2FkZGJhcmVxX2NtZDIzYSwgcCA9JWRcbiIsCi0JCQkJICBwcmlvcml0eSk7Ci0JCQlwc3RhLT5odHByaXYuY2FuZGlkYXRlX3RpZF9iaXRtYXAgfD0gQklUKHByaW9yaXR5KTsKLQkJCXJ0d19hZGRiYXJlcV9jbWQyM2EocGFkYXB0ZXIsICh1OCkgcHJpb3JpdHksCi0JCQkJCSAgICBwYXR0cmliLT5yYSk7Ci0JCX0KLQl9Ci19Ci0KLWludCBydHdfbGlua2VkX2NoZWNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LAotCQkJICBXSUZJX0FESE9DX1NUQVRFfFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewotCQlpZiAocGFkYXB0ZXItPnN0YXByaXYuYXNvY19zdGFfY291bnQgPiAyKQotCQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIHsJLyogU3RhdGlvbiBtb2RlICovCi0JCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIF9GV19MSU5LRUQpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZV9leHQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZV9leHQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkMTU0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWVfZXh0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRXX01MTUVfRVhUX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8d2lmaS5oPgotI2luY2x1ZGUgPHJ0d19tbG1lX2V4dC5oPgotI2luY2x1ZGUgPHdsYW5fYnNzZGVmLmg+Ci0jaW5jbHVkZSA8bWxtZV9vc2RlcC5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotc3RhdGljIGludCBPbkFzc29jUmVxMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQXNzb2NSc3AyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25Qcm9iZVJlcTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBPblByb2JlUnNwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IERvUmVzZXJ2ZWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25CZWFjb24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25BdGltMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uRGlzYXNzb2MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25BdXRoMjNhQ2xpZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uRGVBdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQWN0aW9uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci0KLXN0YXRpYyBpbnQgb25fYWN0aW9uX3NwY3QyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25BY3Rpb24yM2FfcW9zKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQWN0aW9uMjNhX2RscyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotc3RhdGljIGludCBPbkFjdGlvbjIzYV9iYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IG9uX2FjdGlvbl9wdWJsaWMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25BY3Rpb24yM2FfaHQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXN0YXRpYyBpbnQgT25BY3Rpb24yM2Ffd21tKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IE9uQWN0aW9uMjNhX3AycChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotCi1zdGF0aWMgdm9pZCBpc3N1ZV9hc3NvY3JlcShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIGlzc3VlX3Byb2JlcmVxKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3QgY2ZnODAyMTFfc3NpZCAqcHNzaWQsIHU4ICpkYSk7Ci1zdGF0aWMgaW50IGlzc3VlX3Byb2JlcmVxX2V4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9zc2lkICpwc3NpZCwKLQkJCSAgICAgdTggKmRhLCBpbnQgdHJ5X2NudCwgaW50IHdhaXRfbXMpOwotc3RhdGljIHZvaWQgaXNzdWVfcHJvYmVyc3Aoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEpOwotc3RhdGljIHZvaWQgaXNzdWVfYXV0aChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsCi0JCSAgICAgICB1bnNpZ25lZCBzaG9ydCBzdGF0dXMpOwotc3RhdGljIGludCBpc3N1ZV9kZWF1dGhfZXgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmRhLAotCQkJICAgdW5zaWduZWQgc2hvcnQgcmVhc29uLCBpbnQgdHJ5X2NudCwgaW50IHdhaXRfbXMpOwotc3RhdGljIHZvaWQgc3RhcnRfY2xudF9hc3NvYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN0YXJ0X2NsbnRfYXV0aChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN0YXJ0X2NsbnRfam9pbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXN0YXRpYyB2b2lkIHN0YXJ0X2NyZWF0ZV9pYnNzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotc3RhdGljIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjb2xsZWN0X2Jzc19pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLXN0YXRpYyBpbnQgT25BdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgdm9pZCBpc3N1ZV9hc3NvY3JzcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBzaG9ydCBzdGF0dXMsCi0JCQkgICBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGF0LCB1MTYgcGt0X3R5cGUpOwotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgbWxtZV9oYW5kbGVyIG1sbWVfc3RhX3RibFtdPXsKLQl7Ik9uQXNzb2NSZXEyM2EiLAkJJk9uQXNzb2NSZXEyM2F9LAotCXsiT25Bc3NvY1JzcDIzYSIsCQkmT25Bc3NvY1JzcDIzYX0sCi0JeyJPblJlQXNzb2NSZXEiLAkmT25Bc3NvY1JlcTIzYX0sCi0JeyJPblJlQXNzb2NSc3AiLAkmT25Bc3NvY1JzcDIzYX0sCi0JeyJPblByb2JlUmVxMjNhIiwJCSZPblByb2JlUmVxMjNhfSwKLQl7Ik9uUHJvYmVSc3AyM2EiLAkJJk9uUHJvYmVSc3AyM2F9LAotCi0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJCWJlbG93IDIgYXJlIHJlc2VydmVkCi0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCXsiRG9SZXNlcnZlZDIzYSIsCQkmRG9SZXNlcnZlZDIzYX0sCi0JeyJEb1Jlc2VydmVkMjNhIiwJCSZEb1Jlc2VydmVkMjNhfSwKLQl7Ik9uQmVhY29uMjNhIiwJCSZPbkJlYWNvbjIzYX0sCi0JeyJPbkFUSU0iLAkJJk9uQXRpbTIzYX0sCi0JeyJPbkRpc2Fzc29jMjNhIiwJCSZPbkRpc2Fzc29jMjNhfSwKLQl7Ik9uQXV0aDIzYSIsCQkmT25BdXRoMjNhQ2xpZW50MjNhfSwKLQl7Ik9uRGVBdXRoMjNhIiwJCSZPbkRlQXV0aDIzYX0sCi0JeyJPbkFjdGlvbjIzYSIsCQkmT25BY3Rpb24yM2F9LAotfTsKLQotc3RhdGljIHN0cnVjdCBhY3Rpb25faGFuZGxlciBPbkFjdGlvbjIzYV90YmxbXT17Ci0Je1dMQU5fQ0FURUdPUllfU1BFQ1RSVU1fTUdNVCwgIkFDVElPTl9TUEVDVFJVTV9NR01UIiwgb25fYWN0aW9uX3NwY3QyM2F9LAotCXtXTEFOX0NBVEVHT1JZX1FPUywgIkFDVElPTl9RT1MiLCAmT25BY3Rpb24yM2FfcW9zfSwKLQl7V0xBTl9DQVRFR09SWV9ETFMsICJBQ1RJT05fRExTIiwgJk9uQWN0aW9uMjNhX2Rsc30sCi0Je1dMQU5fQ0FURUdPUllfQkFDSywgIkFDVElPTl9CQUNLIiwgJk9uQWN0aW9uMjNhX2JhY2syM2F9LAotCXtXTEFOX0NBVEVHT1JZX1BVQkxJQywgIkFDVElPTl9QVUJMSUMiLCBvbl9hY3Rpb25fcHVibGljMjNhfSwKLQl7V0xBTl9DQVRFR09SWV9IVCwgIkFDVElPTl9IVCIsCSZPbkFjdGlvbjIzYV9odH0sCi0Je1dMQU5fQ0FURUdPUllfU0FfUVVFUlksICJBQ1RJT05fU0FfUVVFUlkiLCAmRG9SZXNlcnZlZDIzYX0sCi0Je1dMQU5fQ0FURUdPUllfV01NLCAiQUNUSU9OX1dNTSIsICZPbkFjdGlvbjIzYV93bW19LAotCXtXTEFOX0NBVEVHT1JZX1ZFTkRPUl9TUEVDSUZJQywgIkFDVElPTl9QMlAiLCAmT25BY3Rpb24yM2FfcDJwfSwKLX07Ci0KLXN0YXRpYyB1OAludWxsX2FkZHJbRVRIX0FMRU5dPSB7MCwgMCwgMCwgMCwgMCwgMH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotT1VJIGRlZmluaXRpb25zIGZvciB0aGUgdmVuZG9yIHNwZWNpZmljIElFCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11bnNpZ25lZCBjaGFyIFdNTV9PVUkyM0FbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyfTsKLXVuc2lnbmVkIGNoYXIgV1BTX09VSTIzQVtdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9OwotdW5zaWduZWQgY2hhciBQMlBfT1VJMjNBW10gPSB7MHg1MCwgMHg2RiwgMHg5QSwgMHgwOX07Ci11bnNpZ25lZCBjaGFyIFdGRF9PVUkyM0FbXSA9IHsweDUwLCAweDZGLCAweDlBLCAweDBBfTsKLQotdW5zaWduZWQgY2hhciBXTU1fSU5GT19PVUkyM0FbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLCAweDAwLCAweDAxfTsKLXVuc2lnbmVkIGNoYXIgV01NX1BBUkFfT1VJMjNBW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMSwgMHgwMX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFJFQUxURUtfOTZCX0lFW10gPSB7MHgwMCwgMHhlMCwgMHg0YywgMHgwMiwgMHgwMSwgMHgyMH07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotTUNTIHJhdGUgZGVmaW5pdGlvbnMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVuc2lnbmVkIGNoYXIgTUNTX3JhdGVfMlIyM0FbMTZdID0gewotCTB4ZmYsIDB4ZmYsIDB4MCwgMHgwLCAweDAxLCAweDAsIDB4MCwgMHgwLAotCTB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwfTsKLXVuc2lnbmVkIGNoYXIgTUNTX3JhdGVfMVIyM0FbMTZdID0gewotCTB4ZmYsIDB4MDAsIDB4MCwgMHgwLCAweDAxLCAweDAsIDB4MCwgMHgwLAotCTB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1DaGFubmVsUGxhbiBkZWZpbml0aW9ucwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3RydWN0IHJ0X2NoYW5uZWxfcGxhbl8yZyBSVFdfQ2hhbm5lbFBsYW4yR1tSVF9DSEFOTkVMX0RPTUFJTl8yR19NQVhdID0gewotCS8qICAweDAwLCBSVF9DSEFOTkVMX0RPTUFJTl8yR19XT1JMRCAsIFBhc3NpdmUgc2NhbiBDSCAxMiwgMTMgKi8KLQl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfSwgMTN9LAotCS8qICAweDAxLCBSVF9DSEFOTkVMX0RPTUFJTl8yR19FVFNJMSAqLwotCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9LCAxM30sCi0JLyogIDB4MDIsIFJUX0NIQU5ORUxfRE9NQUlOXzJHX0ZDQzEgKi8KLQl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX0sIDExfSwKLQkvKiAgMHgwMywgUlRfQ0hBTk5FTF9ET01BSU5fMkdfTUlLSzEgKi8KLQl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNH0sIDE0fSwKLQkvKiAgMHgwNCwgUlRfQ0hBTk5FTF9ET01BSU5fMkdfRVRTSTIgKi8KLQl7ezEwLCAxMSwgMTIsIDEzfSwgNH0sCi0JLyogIDB4MDUsIFJUX0NIQU5ORUxfRE9NQUlOXzJHX05VTEwgKi8KLQl7e30sIDB9LAotfTsKLQotc3RhdGljIHN0cnVjdCBydF9jaGFubmVsX3BsYW5fNWcgUlRXX0NoYW5uZWxQbGFuNUdbUlRfQ0hBTk5FTF9ET01BSU5fNUdfTUFYXSA9IHsKLQkvKiAgMHgwMCwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfTlVMTCAqLwotCXt7fSwgMH0sCi0JLyogIDB4MDEsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX0VUU0kxICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH0sIDE5fSwKLQkvKiAgMHgwMiwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRVRTSTIgKi8KLQl7ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLAotCSAgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0sIDI0fSwKLQkvKiAgMHgwMywgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRVRTSTMgKi8KLQl7ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLAotCSAgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fSwgMjJ9LAotCS8qICAweDA0LCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0MxICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9LCAyNH0sCi0JLyogIDB4MDUsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzIgKi8KLQl7ezM2LCA0MCwgNDQsIDQ4LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0sIDl9LAotCS8qICAweDA2LCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0MzICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fSwgMTN9LAotCS8qICAweDA3LCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0M0ICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDE0OSwgMTUzLCAxNTcsIDE2MX0sIDEyfSwKLQkvKiAgMHgwOCwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDNSAqLwotCXt7MTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9LCA1fSwKLQkvKiAgMHgwOSwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDNiAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgOH0sCi0JLyogIDB4MEEsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzdfSUMxICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTM2LCAxNDAsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fSwgMjB9LAotCS8qICAweDBCLCBSVF9DSEFOTkVMX0RPTUFJTl81R19LQ0MxICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTIwLCAxMjQsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1fSwgMjB9LAotCS8qICAweDBDLCBSVF9DSEFOTkVMX0RPTUFJTl81R19NS0sxICovCi0Je3szNiwgNDAsIDQ0LCA0OCwgNTIsIDU2LCA2MCwgNjQsIDEwMCwgMTA0LCAxMDgsIDExMiwKLQkgIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MH0sIDE5fSwKLQkvKiAgMHgwRCwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfTUtLMiAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0fSwgOH0sCi0JLyogIDB4MEUsIFJUX0NIQU5ORUxfRE9NQUlOXzVHX01LSzMgKi8KLQl7ezEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwfSwgMTF9LAotCS8qICAweDBGLCBSVF9DSEFOTkVMX0RPTUFJTl81R19OQ0MxICovCi0Je3s1NiwgNjAsIDY0LCAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTM2LCAxNDAsIDE0OSwKLQkgIDE1MywgMTU3LCAxNjEsIDE2NX0sIDE1fSwKLQkvKiAgMHgxMCwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfTkNDMiAqLwotCXt7NTYsIDYwLCA2NCwgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9LCA4fSwKLQotCS8qICBEcml2ZXIgc2VsZiBkZWZpbmVkIGZvciBvbGQgY2hhbm5lbCBwbGFuIENvbXBhdGlibGUsCi0JICAgIFJlbWVtYmVyIHRvIG1vZGlmeSBpZiBoYXZlIG5ldyBjaGFubmVsIHBsYW4gZGVmaW5pdGlvbiA9PT09PSAqLwotCS8qICAweDExLCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0MgKi8KLQl7ezM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgMTAwLCAxMDQsIDEwOCwgMTEyLAotCSAgMTE2LCAxMzIsIDEzNiwgMTQwLCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NX0sIDIxfSwKLQkvKiAgMHgxMiwgUlRfQ0hBTk5FTF9ET01BSU5fNUdfSkFQQU5fTk9fREZTICovCi0Je3szNiwgNDAsIDQ0LCA0OH0sIDR9LAotCS8qICAweDEzLCBSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0M0X05PX0RGUyAqLwotCXt7MzYsIDQwLCA0NCwgNDgsIDE0OSwgMTUzLCAxNTcsIDE2MX0sIDh9LAotfTsKLQotc3RhdGljIHN0cnVjdCBydF9jaGFubmVsX3BsYW5fbWFwIFJUV19DaGFubmVsUGxhbk1hcFtSVF9DSEFOTkVMX0RPTUFJTl9NQVhdID0gewotCS8qICAweDAwIH4gMHgxRiAsIE9sZCBEZWZpbmUgPT09PT0gKi8KLQl7MHgwMiwgMHgxMX0sCS8qIDB4MDAsIFJUX0NIQU5ORUxfRE9NQUlOX0ZDQyAqLwotCXsweDAyLCAweDBBfSwJLyogMHgwMSwgUlRfQ0hBTk5FTF9ET01BSU5fSUMgKi8KLQl7MHgwMSwgMHgwMX0sCS8qIDB4MDIsIFJUX0NIQU5ORUxfRE9NQUlOX0VUU0kgKi8KLQl7MHgwMSwgMHgwMH0sCS8qIDB4MDMsIFJUX0NIQU5ORUxfRE9NQUlOX1NQQUlOICovCi0JezB4MDEsIDB4MDB9LAkvKiAweDA0LCBSVF9DSEFOTkVMX0RPTUFJTl9GUkFOQ0UgKi8KLQl7MHgwMywgMHgwMH0sCS8qIDB4MDUsIFJUX0NIQU5ORUxfRE9NQUlOX01LSyAqLwotCXsweDAzLCAweDAwfSwJLyogMHgwNiwgUlRfQ0hBTk5FTF9ET01BSU5fTUtLMSAqLwotCXsweDAxLCAweDA5fSwJLyogMHgwNywgUlRfQ0hBTk5FTF9ET01BSU5fSVNSQUVMICovCi0JezB4MDMsIDB4MDl9LAkvKiAweDA4LCBSVF9DSEFOTkVMX0RPTUFJTl9URUxFQyAqLwotCXsweDAzLCAweDAwfSwJLyogMHgwOSwgUlRfQ0hBTk5FTF9ET01BSU5fR0xPQkFMX0RPQU1JTiAqLwotCXsweDAwLCAweDAwfSwJLyogMHgwQSwgUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV8xMyAqLwotCXsweDAyLCAweDBGfSwJLyogMHgwQiwgUlRfQ0hBTk5FTF9ET01BSU5fVEFJV0FOICovCi0JezB4MDEsIDB4MDh9LAkvKiAweDBDLCBSVF9DSEFOTkVMX0RPTUFJTl9DSElOQSAqLwotCXsweDAyLCAweDA2fSwJLyogMHgwRCwgUlRfQ0hBTk5FTF9ET01BSU5fU0lOR0FQT1JFX0lORElBX01FWElDTyAqLwotCXsweDAyLCAweDBCfSwJLyogMHgwRSwgUlRfQ0hBTk5FTF9ET01BSU5fS09SRUEgKi8KLQl7MHgwMiwgMHgwOX0sCS8qIDB4MEYsIFJUX0NIQU5ORUxfRE9NQUlOX1RVUktFWSAqLwotCXsweDAxLCAweDAxfSwJLyogMHgxMCwgUlRfQ0hBTk5FTF9ET01BSU5fSkFQQU4gKi8KLQl7MHgwMiwgMHgwNX0sCS8qIDB4MTEsIFJUX0NIQU5ORUxfRE9NQUlOX0ZDQ19OT19ERlMgKi8KLQl7MHgwMSwgMHgxMn0sCS8qIDB4MTIsIFJUX0NIQU5ORUxfRE9NQUlOX0pBUEFOX05PX0RGUyAqLwotCXsweDAwLCAweDA0fSwJLyogMHgxMywgUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV81RyAqLwotCXsweDAyLCAweDEwfSwJLyogMHgxNCwgUlRfQ0hBTk5FTF9ET01BSU5fVEFJV0FOX05PX0RGUyAqLwotCXsweDAwLCAweDEyfSwJLyogMHgxNSwgUlRfQ0hBTk5FTF9ET01BSU5fRVRTSV9OT19ERlMgKi8KLQl7MHgwMCwgMHgxM30sCS8qIDB4MTYsIFJUX0NIQU5ORUxfRE9NQUlOX0tPUkVBX05PX0RGUyAqLwotCXsweDAzLCAweDEyfSwJLyogMHgxNywgUlRfQ0hBTk5FTF9ET01BSU5fSkFQQU5fTk9fREZTICovCi0JezB4MDUsIDB4MDh9LAkvKiAweDE4LCBSVF9DSEFOTkVMX0RPTUFJTl9QQUtJU1RBTl9OT19ERlMgKi8KLQl7MHgwMiwgMHgwOH0sCS8qIDB4MTksIFJUX0NIQU5ORUxfRE9NQUlOX1RBSVdBTjJfTk9fREZTICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDFBLCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgxQiwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MUMsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDFELCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgxRSwgKi8KLQl7MHgwNSwgMHgwNH0sCS8qIDB4MUYsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX1dJREVfT05MWV81RyAqLwotCS8qICAweDIwIH4gMHg3RiAsIE5ldyBEZWZpbmUgPT09PT0gKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MjAsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX05VTEwgKi8KLQl7MHgwMSwgMHgwMH0sCS8qIDB4MjEsIFJUX0NIQU5ORUxfRE9NQUlOX0VUU0kxX05VTEwgKi8KLQl7MHgwMiwgMHgwMH0sCS8qIDB4MjIsIFJUX0NIQU5ORUxfRE9NQUlOX0ZDQzFfTlVMTCAqLwotCXsweDAzLCAweDAwfSwJLyogMHgyMywgUlRfQ0hBTk5FTF9ET01BSU5fTUtLMV9OVUxMICovCi0JezB4MDQsIDB4MDB9LAkvKiAweDI0LCBSVF9DSEFOTkVMX0RPTUFJTl9FVFNJMl9OVUxMICovCi0JezB4MDIsIDB4MDR9LAkvKiAweDI1LCBSVF9DSEFOTkVMX0RPTUFJTl9GQ0MxX0ZDQzEgKi8KLQl7MHgwMCwgMHgwMX0sCS8qIDB4MjYsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0VUU0kxICovCi0JezB4MDMsIDB4MEN9LAkvKiAweDI3LCBSVF9DSEFOTkVMX0RPTUFJTl9NS0sxX01LSzEgKi8KLQl7MHgwMCwgMHgwQn0sCS8qIDB4MjgsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0tDQzEgKi8KLQl7MHgwMCwgMHgwNX0sCS8qIDB4MjksIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzIgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MkEsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDJCLCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgyQywgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4MkQsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDJFLCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgyRiwgKi8KLQl7MHgwMCwgMHgwNn0sCS8qIDB4MzAsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzMgKi8KLQl7MHgwMCwgMHgwN30sCS8qIDB4MzEsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzQgKi8KLQl7MHgwMCwgMHgwOH0sCS8qIDB4MzIsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzUgKi8KLQl7MHgwMCwgMHgwOX0sCS8qIDB4MzMsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0ZDQzYgKi8KLQl7MHgwMiwgMHgwQX0sCS8qIDB4MzQsIFJUX0NIQU5ORUxfRE9NQUlOX0ZDQzFfRkNDNyAqLwotCXsweDAwLCAweDAyfSwJLyogMHgzNSwgUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRVRTSTIgKi8KLQl7MHgwMCwgMHgwM30sCS8qIDB4MzYsIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX0VUU0kzICovCi0JezB4MDMsIDB4MER9LAkvKiAweDM3LCBSVF9DSEFOTkVMX0RPTUFJTl9NS0sxX01LSzIgKi8KLQl7MHgwMywgMHgwRX0sCS8qIDB4MzgsIFJUX0NIQU5ORUxfRE9NQUlOX01LSzFfTUtLMyAqLwotCXsweDAyLCAweDBGfSwJLyogMHgzOSwgUlRfQ0hBTk5FTF9ET01BSU5fRkNDMV9OQ0MxICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDNBLCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgzQiwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4M0MsICovCi0JezB4MDAsIDB4MDB9LAkvKiAweDNELCAqLwotCXsweDAwLCAweDAwfSwJLyogMHgzRSwgKi8KLQl7MHgwMCwgMHgwMH0sCS8qIDB4M0YsICovCi0JezB4MDIsIDB4MTB9LAkvKiAweDQwLCBSVF9DSEFOTkVMX0RPTUFJTl9GQ0MxX05DQzIgKi8KLQl7MHgwMywgMHgwMH0sCS8qIDB4NDEsIFJUX0NIQU5ORUxfRE9NQUlOX0dMT0JBTF9ET0FNSU5fMkcgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnRfY2hhbm5lbF9wbGFuX21hcCBSVFdfQ0hBTk5FTF9QTEFOX01BUF9SRUFMVEVLX0RFRklORSA9Ci17MHgwMywgMHgwMn07IC8qIHVzZSB0aGUgY29uYmluYXRpb24gZm9yIG1heCBjaGFubmVsIG51bWJlcnMgKi8KLQotc3RhdGljIHZvaWQgZHVtbXlfZXZlbnRfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLX0KLQotc3RhdGljIHN0cnVjdCBmd2V2ZW50IHdsYW5ldmVudHNbXSA9Ci17Ci0JezAsICZkdW1teV9ldmVudF9jYWxsYmFja30sCS8qMCovCi0JezAsIE5VTEx9LAotCXswLCBOVUxMfSwKLQl7MCwgTlVMTH0sCi0JezAsIE5VTEx9LAotCXswLCBOVUxMfSwKLQl7MCwgTlVMTH0sCi0JezAsIE5VTEx9LAotCXswLCAmcnR3X3N1cnZleV9ldmVudF9jYjIzYX0sCQkvKjgqLwotCXtzaXplb2YgKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50KSwgJnJ0d19zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrMjNhfSwKLQl7MCwgJnJ0dzIzYV9qb2luYnNzX2V2ZW50X2NifSwJCS8qMTAqLwotCXtzaXplb2Yoc3RydWN0IHN0YXNzb2NfZXZlbnQpLCAmcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2F9LAotCXtzaXplb2Yoc3RydWN0IHN0YWRlbF9ldmVudCksICZydHdfc3RhZGVsX2V2ZW50X2NhbGxiYWNrMjNhfSwKLQl7MCwgJmR1bW15X2V2ZW50X2NhbGxiYWNrfSwKLQl7MCwgJmR1bW15X2V2ZW50X2NhbGxiYWNrfSwKLQl7MCwgTlVMTH0sCS8qMTUqLwotCXswLCBOVUxMfSwKLQl7MCwgTlVMTH0sCi0JezAsIE5VTEx9LAotCXswLCAmZHVtbXlfZXZlbnRfY2FsbGJhY2t9LAotCXswLCBOVUxMfSwJIC8qMjAqLwotCXswLCBOVUxMfSwKLQl7MCwgTlVMTH0sCi0JezAsICZkdW1teV9ldmVudF9jYWxsYmFja30sCi0JezAsIE5VTEx9LAotfTsKLQotCi1zdGF0aWMgdm9pZCBydHdfY29ycmVjdF9UU0Yoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlod192YXJfc2V0X2NvcnJlY3RfdHNmKHBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQKLXJ0d191cGRhdGVfVFNGKHN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCwgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210KQotewotCXBtbG1lZXh0LT5UU0ZWYWx1ZSA9IGdldF91bmFsaWduZWRfbGU2NCgmbWdtdC0+dS5iZWFjb24udGltZXN0YW1wKTsKLX0KLQotLyoKLSAqIFNlYXJjaCB0aGUgQHBhcmFtIGNoYW5uZWxfbnVtIGluIGdpdmVuIEBwYXJhbSBjaGFubmVsX3NldAotICogQGNoX3NldDogdGhlIGdpdmVuIGNoYW5uZWwgc2V0Ci0gKiBAY2g6IHRoZSBnaXZlbiBjaGFubmVsIG51bWJlcgotICoKLSAqIHJldHVybiB0aGUgaW5kZXggb2YgY2hhbm5lbF9udW0gaW4gY2hhbm5lbF9zZXQsIC0xIGlmIG5vdCBmb3VuZAotICovCi1pbnQgcnR3X2NoX3NldF9zZWFyY2hfY2gyM2Eoc3RydWN0IHJ0X2NoYW5uZWxfaW5mbyAqY2hfc2V0LCBjb25zdCB1MzIgY2gpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBjaF9zZXRbaV0uIENoYW5uZWxOdW0gIT0gMDsgaSsrKSB7Ci0JCWlmIChjaCA9PSBjaF9zZXRbaV0uQ2hhbm5lbE51bSkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChpID49IGNoX3NldFtpXS5DaGFubmVsTnVtKQotCQlyZXR1cm4gLTE7Ci0JcmV0dXJuIGk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUZvbGxvd2luZyBhcmUgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBmb3IgV2lGaSBNTE1FCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1pbnQgaW5pdF9od19tbG1lX2V4dDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwKLQkJCSAgICAgIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0LCBwbWxtZWV4dC0+Y3VyX2J3bW9kZSk7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X21sbWVfZXh0X3ByaXYyM2FfdmFsdWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXVuc2lnbmVkIGNoYXIJbWl4ZWRfZGF0YXJhdGVbTnVtUmF0ZXNdID0gewotCQlfMU1fUkFURV8sIF8yTV9SQVRFXywgXzVNX1JBVEVfLCBfMTFNX1JBVEVfLCBfNk1fUkFURV8sCi0JCV85TV9SQVRFXywgXzEyTV9SQVRFXywgXzE4TV9SQVRFXywgXzI0TV9SQVRFXywgXzM2TV9SQVRFXywKLQkJXzQ4TV9SQVRFXywgXzU0TV9SQVRFXywgMHhmZn07Ci0JdW5zaWduZWQgY2hhcgltaXhlZF9iYXNpY3JhdGVbTnVtUmF0ZXNdID0gewotCQlfMU1fUkFURV8sIF8yTV9SQVRFXywgXzVNX1JBVEVfLCBfMTFNX1JBVEVfLCBfNk1fUkFURV8sCi0JCV8xMk1fUkFURV8sIF8yNE1fUkFURV8sIDB4ZmYsfTsKLQotCWF0b21pY19zZXQoJnBtbG1lZXh0LT5ldmVudF9zZXEsIDApOwotCS8qIHJlc2V0IHRvIHplcm8gd2hlbiBkaXNjb25uZWN0IGF0IGNsaWVudCBtb2RlICovCi0JcG1sbWVleHQtPm1nbnRfc2VxID0gMDsKLQotCXBtbG1lZXh0LT5jdXJfY2hhbm5lbCA9IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYuY2hhbm5lbDsKLQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCi0JcG1sbWVleHQtPnJldHJ5ID0gMDsKLQotCXBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lyZWxlc3NfbW9kZTsKLQotCW1lbWNweShwbWxtZWV4dC0+ZGF0YXJhdGUsIG1peGVkX2RhdGFyYXRlLCBOdW1SYXRlcyk7Ci0JbWVtY3B5KHBtbG1lZXh0LT5iYXNpY3JhdGUsIG1peGVkX2Jhc2ljcmF0ZSwgTnVtUmF0ZXMpOwotCi0JaWYgKHBtbG1lZXh0LT5jdXJfY2hhbm5lbCA+IDE0KQotCQlwbWxtZWV4dC0+dHhfcmF0ZSA9IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COwotCWVsc2UKLQkJcG1sbWVleHQtPnR4X3JhdGUgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COwotCi0JcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID0gU0NBTl9ESVNBQkxFOwotCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaGFubmVsX2lkeCA9IDA7Ci0JcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmJzc19jbnQgPSAwOwotCXBtbG1lZXh0LT5zY2FuX2Fib3J0ID0gZmFsc2U7Ci0KLQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKLQlwbWxtZWluZm8tPnJlYXV0aF9jb3VudCA9IDA7Ci0JcG1sbWVpbmZvLT5yZWFzc29jX2NvdW50ID0gMDsKLQlwbWxtZWluZm8tPmxpbmtfY291bnQgPSAwOwotCXBtbG1laW5mby0+YXV0aF9zZXEgPSAwOwotCXBtbG1laW5mby0+YXV0aF9hbGdvID0gZG90MTFBdXRoQWxncnRobV9PcGVuOwotCXBtbG1laW5mby0+a2V5X2luZGV4ID0gMDsKLQlwbWxtZWluZm8tPml2ID0gMDsKLQotCXBtbG1laW5mby0+ZW5jX2FsZ28gPSAwOwotCXBtbG1laW5mby0+YXV0aE1vZGVUb2dnbGUgPSAwOwotCi0JbWVtc2V0KHBtbG1laW5mby0+Y2hnX3R4dCwgMCwgMTI4KTsKLQotCXBtbG1laW5mby0+c2xvdFRpbWUgPSBTSE9SVF9TTE9UX1RJTUU7Ci0JcG1sbWVpbmZvLT5wcmVhbWJsZV9tb2RlID0gUFJFQU1CTEVfQVVUTzsKLQotCXBtbG1laW5mby0+ZGlhbG9nVG9rZW4gPSAwOwotCi0JcG1sbWVleHQtPmFjdGlvbl9wdWJsaWNfcnhzZXEgPSAweGZmZmY7Ci0JcG1sbWVleHQtPmFjdGlvbl9wdWJsaWNfZGlhbG9nX3Rva2VuID0gMHhmZjsKLX0KLQotc3RhdGljIGludCBoYXNfY2hhbm5lbChzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvICpjaGFubmVsX3NldCwKLQkJICAgICAgIHU4IGNoYW5zZXRfc2l6ZSwgdTggY2hhbikgewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNoYW5zZXRfc2l6ZTsgaSsrKSB7Ci0JCWlmIChjaGFubmVsX3NldFtpXS5DaGFubmVsTnVtID09IGNoYW4pCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2xpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCBydF9jaGFubmVsX2luZm8gKmNoYW5uZWxfc2V0LAotCQkJICAgICAgdTggY2hhbnNldF9zaXplLAotCQkJICAgICAgc3RydWN0IHAycF9jaGFubmVscyAqY2hhbm5lbF9saXN0KQotewotCXN0cnVjdCBwMnBfb3Blcl9jbGFzc19tYXAgb3BfY2xhc3NbXSA9IHsKLQkJeyBJRUVFODAyMTFHLCAgODEsICAgMSwgIDEzLCAgMSwgQlcyMCB9LAotCQl7IElFRUU4MDIxMUcsICA4MiwgIDE0LCAgMTQsICAxLCBCVzIwIH0sCi0JCXsgSUVFRTgwMjExQSwgMTE1LCAgMzYsICA0OCwgIDQsIEJXMjAgfSwKLQkJeyBJRUVFODAyMTFBLCAxMTYsICAzNiwgIDQ0LCAgOCwgQlc0MFBMVVMgfSwKLQkJeyBJRUVFODAyMTFBLCAxMTcsICA0MCwgIDQ4LCAgOCwgQlc0ME1JTlVTIH0sCi0JCXsgSUVFRTgwMjExQSwgMTI0LCAxNDksIDE2MSwgIDQsIEJXMjAgfSwKLQkJeyBJRUVFODAyMTFBLCAxMjUsIDE0OSwgMTY5LCAgNCwgQlcyMCB9LAotCQl7IElFRUU4MDIxMUEsIDEyNiwgMTQ5LCAxNTcsICA4LCBCVzQwUExVUyB9LAotCQl7IElFRUU4MDIxMUEsIDEyNywgMTUzLCAxNjEsICA4LCBCVzQwTUlOVVMgfSwKLQkJeyAtMSwgMCwgMCwgMCwgMCwgQlcyMCB9Ci0JfTsKLQotCWludCBjbGEsIG9wOwotCi0JY2xhID0gMDsKLQotCWZvciAob3AgPSAwOyBvcF9jbGFzc1tvcF0ub3BfY2xhc3M7IG9wKyspIHsKLQkJdTggY2g7Ci0JCXN0cnVjdCBwMnBfb3Blcl9jbGFzc19tYXAgKm8gPSAmb3BfY2xhc3Nbb3BdOwotCQlzdHJ1Y3QgcDJwX3JlZ19jbGFzcyAqcmVnID0gTlVMTDsKLQotCQlmb3IgKGNoID0gby0+bWluX2NoYW47IGNoIDw9IG8tPm1heF9jaGFuOyBjaCArPSBvLT5pbmMpIHsKLQkJCWlmICghaGFzX2NoYW5uZWwoY2hhbm5lbF9zZXQsIGNoYW5zZXRfc2l6ZSwgY2gpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoKDAgPT0gcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5odF9lbmFibGUpICYmCi0JCQkgICAgKG8tPmluYyA9PSA4KSkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCgwID09IChwYWRhcHRlci0+cmVnaXN0cnlwcml2LmNidzQwX2VuYWJsZSAmIEJJVCgxKSkpICYmCi0JCQkJKChCVzQwTUlOVVMgPT0gby0+YncpIHx8IChCVzQwUExVUyA9PSBvLT5idykpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAocmVnID09IE5VTEwpIHsKLQkJCQlyZWcgPSAmY2hhbm5lbF9saXN0LT5yZWdfY2xhc3NbY2xhXTsKLQkJCQljbGErKzsKLQkJCQlyZWctPnJlZ19jbGFzcyA9IG8tPm9wX2NsYXNzOwotCQkJCXJlZy0+Y2hhbm5lbHMgPSAwOwotCQkJfQotCQkJcmVnLT5jaGFubmVsW3JlZy0+Y2hhbm5lbHNdID0gY2g7Ci0JCQlyZWctPmNoYW5uZWxzKys7Ci0JCX0KLQl9Ci0JY2hhbm5lbF9saXN0LT5yZWdfY2xhc3NlcyA9IGNsYTsKLX0KLQotc3RhdGljIHU4IGluaXRfY2hhbm5lbF9zZXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggY3BsYW4sCi0JCQkgICBzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvICpjX3NldCkKLXsKLQl1OCBpLCBjaF9zaXplID0gMDsKLQl1OCBiNUdCYW5kID0gZmFsc2UsIGIyXzRHQmFuZCA9IGZhbHNlOwotCXU4IEluZGV4MkcgPSAwLCBJbmRleDVHID0gMDsKLQotCW1lbXNldChjX3NldCwgMCwgc2l6ZW9mKHN0cnVjdCBydF9jaGFubmVsX2luZm8pICogTUFYX0NIQU5ORUxfTlVNKTsKLQotCWlmIChjcGxhbiA+PSBSVF9DSEFOTkVMX0RPTUFJTl9NQVggJiYKLQkgICAgY3BsYW4gIT0gUlRfQ0hBTk5FTF9ET01BSU5fUkVBTFRFS19ERUZJTkUpIHsKLQkJREJHXzg3MjNBKCJDaGFubmVsUGxhbiBJRCAleCBlcnJvciAhISEhIVxuIiwgY3BsYW4pOwotCQlyZXR1cm4gY2hfc2l6ZTsKLQl9Ci0KLQlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFHKSB7Ci0JCWIyXzRHQmFuZCA9IHRydWU7Ci0JCWlmIChSVF9DSEFOTkVMX0RPTUFJTl9SRUFMVEVLX0RFRklORSA9PSBjcGxhbikKLQkJCUluZGV4MkcgPSBSVFdfQ0hBTk5FTF9QTEFOX01BUF9SRUFMVEVLX0RFRklORS5JbmRleDJHOwotCQllbHNlCi0JCQlJbmRleDJHID0gUlRXX0NoYW5uZWxQbGFuTWFwW2NwbGFuXS5JbmRleDJHOwotCX0KLQotCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMUEpIHsKLQkJYjVHQmFuZCA9IHRydWU7Ci0JCWlmIChSVF9DSEFOTkVMX0RPTUFJTl9SRUFMVEVLX0RFRklORSA9PSBjcGxhbikKLQkJCUluZGV4NUcgPSBSVFdfQ0hBTk5FTF9QTEFOX01BUF9SRUFMVEVLX0RFRklORS5JbmRleDVHOwotCQllbHNlCi0JCQlJbmRleDVHID0gUlRXX0NoYW5uZWxQbGFuTWFwW2NwbGFuXS5JbmRleDVHOwotCX0KLQotCWlmIChiMl80R0JhbmQpIHsKLQkJZm9yIChpID0gMDsgaSA8IFJUV19DaGFubmVsUGxhbjJHW0luZGV4MkddLkxlbjsgaSsrKSB7Ci0JCQljX3NldFtjaF9zaXplXS5DaGFubmVsTnVtID0KLQkJCQlSVFdfQ2hhbm5lbFBsYW4yR1tJbmRleDJHXS5DaGFubmVsW2ldOwotCi0JCQlpZiAoKFJUX0NIQU5ORUxfRE9NQUlOX0dMT0JBTF9ET0FNSU4gPT0gY3BsYW4pIHx8Ci0JCQkgICAgLyogQ2hhbm5lbCAxfjExIGlzIGFjdGl2ZSwgYW5kIDEyfjE0IGlzIHBhc3NpdmUgKi8KLQkJCSAgICBSVF9DSEFOTkVMX0RPTUFJTl9HTE9CQUxfRE9BTUlOXzJHID09IGNwbGFuKSB7Ci0JCQkJaWYgKGNfc2V0W2NoX3NpemVdLkNoYW5uZWxOdW0gPj0gMSAmJgotCQkJCSAgICBjX3NldFtjaF9zaXplXS5DaGFubmVsTnVtIDw9IDExKQotCQkJCQljX3NldFtjaF9zaXplXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCQkJCWVsc2UgaWYgKGNfc2V0W2NoX3NpemVdLkNoYW5uZWxOdW0gPj0gMTIgJiYKLQkJCQkJIGNfc2V0W2NoX3NpemVdLkNoYW5uZWxOdW0gIDw9IDE0KQotCQkJCQljX3NldFtjaF9zaXplXS5TY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKLQkJCX0gZWxzZSBpZiAoUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV8xMyA9PSBjcGxhbiB8fAotCQkJCSAgIFJUX0NIQU5ORUxfRE9NQUlOX1dPUkxEX1dJREVfNUcgPT0gY3BsYW4gfHwKLQkJCQkgICBSVF9DSEFOTkVMX0RPTUFJTl8yR19XT1JMRCA9PSBJbmRleDJHKSB7Ci0JCQkJLyogIGNoYW5uZWwgMTJ+MTMsIHBhc3NpdmUgc2NhbiAqLwotCQkJCWlmIChjX3NldFtjaF9zaXplXS5DaGFubmVsTnVtIDw9IDExKQotCQkJCQljX3NldFtjaF9zaXplXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCQkJCWVsc2UKLQkJCQkJY19zZXRbY2hfc2l6ZV0uU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7Ci0JCQl9IGVsc2UKLQkJCQljX3NldFtjaF9zaXplXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCi0JCQljaF9zaXplKys7Ci0JCX0KLQl9Ci0KLQlpZiAoYjVHQmFuZCkgewotCQlmb3IgKGkgPSAwOyBpIDwgUlRXX0NoYW5uZWxQbGFuNUdbSW5kZXg1R10uTGVuOyBpKyspIHsKLQkJCWlmIChSVFdfQ2hhbm5lbFBsYW41R1tJbmRleDVHXS5DaGFubmVsW2ldIDw9IDQ4IHx8Ci0JCQkgICAgUlRXX0NoYW5uZWxQbGFuNUdbSW5kZXg1R10uQ2hhbm5lbFtpXSA+PSAxNDkpIHsKLQkJCQljX3NldFtjaF9zaXplXS5DaGFubmVsTnVtID0KLQkJCQkJUlRXX0NoYW5uZWxQbGFuNUdbSW5kZXg1R10uQ2hhbm5lbFtpXTsKLQkJCQlpZiAoUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV81RyA9PSBjcGxhbikgewotCQkJCQkvKiBwYXNzaXZlIHNjYW4gZm9yIGFsbCA1RyBjaGFubmVscyAqLwotCQkJCQljX3NldFtjaF9zaXplXS5TY2FuVHlwZSA9Ci0JCQkJCQlTQ0FOX1BBU1NJVkU7Ci0JCQkJfSBlbHNlCi0JCQkJCWNfc2V0W2NoX3NpemVdLlNjYW5UeXBlID0KLQkJCQkJCVNDQU5fQUNUSVZFOwotCQkJCURCR184NzIzQSgiJXMoKTogY2hhbm5lbF9zZXRbJWRdLkNoYW5uZWxOdW0gPSAiCi0JCQkJCSAgIiVkXG4iLCBfX2Z1bmNfXywgY2hfc2l6ZSwKLQkJCQkJICBjX3NldFtjaF9zaXplXS5DaGFubmVsTnVtKTsKLQkJCQljaF9zaXplKys7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gY2hfc2l6ZTsKLX0KLQotaW50IGluaXRfbWxtZV9leHRfcHJpdjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JcG1sbWVleHQtPnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0KLQlpbml0X21sbWVfZXh0X3ByaXYyM2FfdmFsdWUocGFkYXB0ZXIpOwotCXBtbG1laW5mby0+YkFjY2VwdEFkZGJhUmVxID0gcHJlZ2lzdHJ5cHJpdi0+YkFjY2VwdEFkZGJhUmVxOwotCi0JaW5pdF9tbG1lX2V4dF90aW1lcjIzYShwYWRhcHRlcik7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlpbml0X21sbWVfYXBfaW5mbzIzYShwYWRhcHRlcik7Ci0jZW5kaWYKLQotCXBtbG1lZXh0LT5tYXhfY2hhbl9udW1zID0gaW5pdF9jaGFubmVsX3NldChwYWRhcHRlciwKLQkJCQkJCSAgIHBtbG1lcHJpdi0+Q2hhbm5lbFBsYW4sCi0JCQkJCQkgICBwbWxtZWV4dC0+Y2hhbm5lbF9zZXQpOwotCWluaXRfY2hhbm5lbF9saXN0KHBhZGFwdGVyLCBwbWxtZWV4dC0+Y2hhbm5lbF9zZXQsCi0JCQkgIHBtbG1lZXh0LT5tYXhfY2hhbl9udW1zLCAmcG1sbWVleHQtPmNoYW5uZWxfbGlzdCk7Ci0KLQlwbWxtZWV4dC0+Y2hhbl9zY2FuX3RpbWUgPSBTVVJWRVlfVE87Ci0JcG1sbWVleHQtPm1sbWVleHRfaW5pdCA9IHRydWU7Ci0KLQlwbWxtZWV4dC0+YWN0aXZlX2tlZXBfYWxpdmVfY2hlY2sgPSB0cnVlOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotdm9pZCBmcmVlX21sbWVfZXh0X3ByaXYyM2EgKHN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gcG1sbWVleHQtPnBhZGFwdGVyOwotCi0JaWYgKCFwYWRhcHRlcikKLQkJcmV0dXJuOwotCi0JaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSB0cnVlKSB7Ci0JCWRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+c3VydmV5X3RpbWVyKTsKLQkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQkJLyogZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5BRERCQV90aW1lcik7ICovCi0JfQotfQotCi1zdGF0aWMgdm9pZAotX21ndF9kaXNwYXRjaGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBtbG1lX2hhbmRsZXIgKnB0YWJsZSwKLQkJICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCi0JaWYgKHB0YWJsZS0+ZnVuYykgewotCQkvKiByZWNlaXZlIHRoZSBmcmFtZXMgdGhhdCByYShhMSkgaXMgbXkgYWRkcmVzcwotCQkgICBvciByYShhMSkgaXMgYmMgYWRkcmVzcy4gKi8KLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKGhkci0+YWRkcjEsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSkmJgotCQkgICAgIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKQotCQkJcmV0dXJuOwotCi0JCXB0YWJsZS0+ZnVuYyhwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCX0KLX0KLQotdm9pZCBtZ3RfZGlzcGF0Y2hlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXN0cnVjdCBtbG1lX2hhbmRsZXIgKnB0YWJsZTsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotI2VuZGlmIC8qIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQl1MTYgc3R5cGU7Ci0JaW50IGluZGV4OwotCi0JaWYgKCFpZWVlODAyMTFfaXNfbWdtdChtZ210LT5mcmFtZV9jb250cm9sKSkKLQkJcmV0dXJuOwotCi0JLyogcmVjZWl2ZSB0aGUgZnJhbWVzIHRoYXQgcmEoYTEpIGlzIG15IGFkZHJlc3Mgb3IgcmEoYTEpIGlzCi0JICAgYmMgYWRkcmVzcy4gKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobWdtdC0+ZGEsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSkgJiYKLQkgICAgIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1nbXQtPmRhKSkKLQkJcmV0dXJuOwotCi0JcHRhYmxlID0gbWxtZV9zdGFfdGJsOwotCi0Jc3R5cGUgPSBsZTE2X3RvX2NwdShtZ210LT5mcmFtZV9jb250cm9sKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFOwotCWluZGV4ID0gc3R5cGUgPj4gNDsKLQotCWlmIChpbmRleCA+IDEzKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkN1cnJlbnRseSB3ZSBkbyBub3Qgc3VwcG9ydCByZXNlcnZlZCBzdWItZnItdHlwZSA9JWRcbiIsCi0JCQkgaW5kZXgpOwotCQlyZXR1cm47Ci0JfQotCXB0YWJsZSArPSBpbmRleDsKLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCBtZ210LT5zYSk7Ci0KLQlpZiAocHN0YSkgewotCQlpZiAoaWVlZTgwMjExX2hhc19yZXRyeShtZ210LT5mcmFtZV9jb250cm9sKSkgewotCQkJaWYgKHByZWN2X2ZyYW1lLT5hdHRyaWIuc2VxX251bSA9PQotCQkJICAgIHBzdGEtPlJ4TWdtdEZyYW1lU2VxTnVtKSB7Ci0JCQkJLyogZHJvcCB0aGUgZHVwbGljYXRlIG1hbmFnZW1lbnQgZnJhbWUgKi8KLQkJCQlEQkdfODcyM0EoIkRyb3AgZHVwbGljYXRlIG1hbmFnZW1lbnQgZnJhbWUgIgotCQkJCQkgICJ3aXRoIHNlcV9udW0gPSAlZC5cbiIsCi0JCQkJCSAgcHJlY3ZfZnJhbWUtPmF0dHJpYi5zZXFfbnVtKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJcHN0YS0+UnhNZ210RnJhbWVTZXFOdW0gPSBwcmVjdl9mcmFtZS0+YXR0cmliLnNlcV9udW07Ci0JfQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Jc3dpdGNoIChzdHlwZSkgewotCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FVVEg6Ci0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpCi0JCQlwdGFibGUtPmZ1bmMgPSAmT25BdXRoMjNhOwotCQllbHNlCi0JCQlwdGFibGUtPmZ1bmMgPSAmT25BdXRoMjNhQ2xpZW50MjNhOwotCQkvKiBwYXNzIHRocm91Z2ggKi8KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE6Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVE6Ci0JCV9tZ3RfZGlzcGF0Y2hlcjIzYShwYWRhcHRlciwgcHRhYmxlLCBwcmVjdl9mcmFtZSk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUToKLQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKLQkJCV9tZ3RfZGlzcGF0Y2hlcjIzYShwYWRhcHRlciwgcHRhYmxlLCBwcmVjdl9mcmFtZSk7Ci0JCWVsc2UKLQkJCV9tZ3RfZGlzcGF0Y2hlcjIzYShwYWRhcHRlciwgcHRhYmxlLCBwcmVjdl9mcmFtZSk7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1NUWVBFX0JFQUNPTjoKLQkJX21ndF9kaXNwYXRjaGVyMjNhKHBhZGFwdGVyLCBwdGFibGUsIHByZWN2X2ZyYW1lKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNUSU9OOgotCQkvKiBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSAqLwotCQlfbWd0X2Rpc3BhdGNoZXIyM2EocGFkYXB0ZXIsIHB0YWJsZSwgcHJlY3ZfZnJhbWUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlfbWd0X2Rpc3BhdGNoZXIyM2EocGFkYXB0ZXIsIHB0YWJsZSwgcHJlY3ZfZnJhbWUpOwotCQlicmVhazsKLQl9Ci0jZWxzZQotCV9tZ3RfZGlzcGF0Y2hlcjIzYShwYWRhcHRlciwgcHRhYmxlLCBwcmVjdl9mcmFtZSk7Ci0jZW5kaWYKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotRm9sbG93aW5nIGFyZSB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIGZvciBlYWNoIHN1YnR5cGUgb2YgdGhlIG1hbmFnZW1lbnQgZnJhbWVzCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50Ci1PblByb2JlUmVxMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQljb25zdCB1OCAqaWU7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXIgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCWludCBsZW4gPSBza2ItPmxlbjsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgJiYKLQkgICAgIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LAotCQkJICAgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUgfCBXSUZJX0FQX1NUQVRFKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JaWYgKHVubGlrZWx5KCFpZWVlODAyMTFfaXNfcHJvYmVfcmVxKG1nbXQtPmZyYW1lX2NvbnRyb2wpKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVjZWl2ZWQgbm9uIHByb2JlIHJlcXVlc3QgZnJhbWVcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlsZW4gLT0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LnByb2JlX3JlcS52YXJpYWJsZSk7Ci0KLQlpZSA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfU1NJRCwgbWdtdC0+dS5wcm9iZV9yZXEudmFyaWFibGUsIGxlbik7Ci0KLQkvKiBjaGVjayAod2lsZGNhcmQpIFNTSUQgKi8KLQlpZiAoIWllKQotCQlnb3RvIG91dDsKLQotCWlmICgoaWVbMV0gJiYgbWVtY21wKGllICsgMiwgY3VyLT5Tc2lkLnNzaWQsIGN1ci0+U3NpZC5zc2lkX2xlbikpIHx8Ci0JICAgIChpZVsxXSA9PSAwICYmIHBtbG1laW5mby0+aGlkZGVuX3NzaWRfbW9kZSkpIHsKLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgJiYKLQkgICAgcG1sbWVwcml2LT5jdXJfbmV0d29yay5qb2luX3JlcykKLQkJaXNzdWVfcHJvYmVyc3AocGFkYXB0ZXIsIG1nbXQtPnNhKTsKLQotb3V0OgotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotT25Qcm9iZVJzcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPT0gU0NBTl9QUk9DRVNTKSB7Ci0JCXJlcG9ydF9zdXJ2ZXlfZXZlbnQyM2EocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotT25CZWFjb24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCWludCBjYW1faWR4OwotCXN0cnVjdCBzdGFfaW5mbwkqcHN0YTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHN0YV9wcml2CSpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQlpbnQgcGt0X2xlbiA9IHNrYi0+bGVuOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwYnNzOwotCWludCByZXQgPSBfU1VDQ0VTUzsKLQl1OCAqcCwgKnBpZTsKLQlpbnQgcGllX2xlbjsKLQl1MzIgaWVsZW4gPSAwOwotCi0JcGllID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGU7Ci0JcGllX2xlbiA9IHBrdF9sZW4gLSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQlwID0gcnR3X2dldF9pZTIzYShwaWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLCAmaWVsZW4sIHBpZV9sZW4pOwotCWlmIChwICYmIGllbGVuID4gMCkgewotCQlpZiAocFsxICsgaWVsZW5dID09IDB4MkQgJiYgcFsyICsgaWVsZW5dICE9IDB4MkQpIHsKLQkJCS8qIEludmFsaWQgdmFsdWUgMHgyRCBpcyBkZXRlY3RlZCBpbiBFeHRlbmRlZCBTdXBwb3J0ZWQKLQkJCSAqIFJhdGVzIChFU1IpIElFLiBUcnkgdG8gZml4IHRoZSBJRSBsZW5ndGggdG8gYXZvaWQKLQkJCSAqIGZhaWxlZCBCZWFjb24gcGFyc2luZy4KLQkJCSAqLwotCQkJREJHXzg3MjNBKCJbV0lGSURCR10gRXJyb3IgaW4gRVNSIElFIGlzIGRldGVjdGVkIGluICIKLQkJCQkgICJCZWFjb24gb2YgQlNTSUQ6ICVwTS4gRml4IHRoZSBsZW5ndGggb2YgIgotCQkJCSAgIkVTUiBJRSB0byBhdm9pZCBmYWlsZWQgQmVhY29uIHBhcnNpbmcuXG4iLAotCQkJCSAgbWdtdC0+YnNzaWQpOwotCQkJcFsxXSA9IGllbGVuIC0gMTsKLQkJfQotCX0KLQotCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPT0gU0NBTl9QUk9DRVNTKSB7Ci0JCXJlcG9ydF9zdXJ2ZXlfZXZlbnQyM2EocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLQotCWlmICghZXRoZXJfYWRkcl9lcXVhbChtZ210LT5ic3NpZCwKLQkJCSAgICAgIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FVVEhfTlVMTCkgewotCQkvKiB3ZSBzaG91bGQgdXBkYXRlIGN1cnJlbnQgbmV0d29yayBiZWZvcmUgYXV0aCwKLQkJICAgb3Igc29tZSBJRSBpcyB3cm9uZyAqLwotCQlwYnNzID0gY29sbGVjdF9ic3NfaW5mbyhwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQlpZiAocGJzcykgewotCQkJdXBkYXRlX25ldHdvcmsyM2EoJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yaywgcGJzcywKLQkJCQkJICBwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlydHdfZ2V0X2Jjbl9pbmZvMjNhKCZwbWxtZXByaXYtPmN1cl9uZXR3b3JrKTsKLQkJCWtmcmVlKHBic3MpOwotCQl9Ci0KLQkJLyogY2hlY2sgdGhlIHZlbmRvciBvZiB0aGUgYXNzb2MgQVAgKi8KLQkJcG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPQotCQkJY2hlY2tfYXNzb2NfQVAyM2EoKHU4ICopJm1nbXQtPnUuYmVhY29uLCBwa3RfbGVuIC0KLQkJCQkJICBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUpKTsKLQotCQkvKiB1cGRhdGUgVFNGIFZhbHVlICovCi0JCXJ0d191cGRhdGVfVFNGKHBtbG1lZXh0LCBtZ210KTsKLQotCQkvKiBzdGFydCBhdXRoICovCi0JCXN0YXJ0X2NsbnRfYXV0aChwYWRhcHRlcik7Ci0KLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLQotCWlmICgoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQVApICYmCi0JICAgIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BU1NPQ19TVUNDRVNTKSkgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBtZ210LT5zYSk7Ci0JCWlmIChwc3RhKSB7Ci0JCQlyZXQgPSBydHdfY2hlY2tfYmNuX2luZm8yM2EocGFkYXB0ZXIsIG1nbXQsIHBrdF9sZW4pOwotCQkJaWYgKHJldCAhPSBfU1VDQ0VTUykgewotCQkJCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJhcCBoYXMgY2hhbmdlZCwgIgotCQkJCQkJImRpc2Nvbm5lY3Qgbm93XG4iKTsKLQkJCQlyZWNlaXZlX2Rpc2Nvbm5lY3QyM2EocGFkYXB0ZXIsIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzLCA2NTUzNSk7Ci0JCQkJcmV0dXJuIF9TVUNDRVNTOwotCQkJfQotCQkJLyogdXBkYXRlIFdNTSwgRVJQIGluIHRoZSBiZWFjb24gKi8KLQkJCS8qIHRvZG86IHRoZSB0aW1lciBpcyB1c2VkIGluc3RlYWQgb2YKLQkJCSAgIHRoZSBudW1iZXIgb2YgdGhlIGJlYWNvbiByZWNlaXZlZCAqLwotCQkJaWYgKChzdGFfcnhfcGt0cyhwc3RhKSAmIDB4ZikgPT0gMCkgewotCQkJCS8qIERCR184NzIzQSgidXBkYXRlX2Jjbl9pbmZvXG4iKTsgKi8KLQkJCQl1cGRhdGVfYmVhY29uMjNhX2luZm8ocGFkYXB0ZXIsIG1nbXQsCi0JCQkJCQkgICAgICBwa3RfbGVuLCBwc3RhKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0FESE9DKSB7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIG1nbXQtPnNhKTsKLQkJaWYgKHBzdGEpIHsKLQkJCS8qIHVwZGF0ZSBXTU0sIEVSUCBpbiB0aGUgYmVhY29uICovCi0JCQkvKiB0b2RvOiB0aGUgdGltZXIgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZQotCQkJICAgbnVtYmVyIG9mIHRoZSBiZWFjb24gcmVjZWl2ZWQgKi8KLQkJCWlmICgoc3RhX3J4X3BrdHMocHN0YSkgJiAweGYpID09IDApIHsKLQkJCQkvKiBEQkdfODcyM0EoInVwZGF0ZV9iY25faW5mb1xuIik7ICovCi0JCQkJdXBkYXRlX2JlYWNvbjIzYV9pbmZvKHBhZGFwdGVyLCBtZ210LAotCQkJCQkJICAgICAgcGt0X2xlbiwgcHN0YSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiBhbGxvY2F0ZSBhIG5ldyBDQU0gZW50cnkgZm9yIElCU1Mgc3RhdGlvbiAqLwotCQkJY2FtX2lkeCA9IGFsbG9jYXRlX2Z3X3N0YV9lbnRyeTIzYShwYWRhcHRlcik7Ci0JCQlpZiAoY2FtX2lkeCA9PSBOVU1fU1RBKQotCQkJCWdvdG8gb3V0OwotCi0JCQkvKiBnZXQgc3VwcG9ydGVkIHJhdGUgKi8KLQkJCWlmICh1cGRhdGVfc3RhX3N1cHBvcnRfcmF0ZTIzYShwYWRhcHRlciwgcGllLCBwaWVfbGVuLAotCQkJCQkJICAgICAgIGNhbV9pZHgpID09IF9GQUlMKSB7Ci0JCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1tjYW1faWR4XS5zdGF0dXMgPSAwOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQkvKiB1cGRhdGUgVFNGIFZhbHVlICovCi0JCQlydHdfdXBkYXRlX1RTRihwbWxtZWV4dCwgbWdtdCk7Ci0KLQkJCS8qIHJlcG9ydCBzdGEgYWRkIGV2ZW50ICovCi0JCQlyZXBvcnRfYWRkX3N0YV9ldmVudDIzYShwYWRhcHRlciwgbWdtdC0+c2EsCi0JCQkJCQljYW1faWR4KTsKLQkJfQotCX0KLQotb3V0OgotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi1zdGF0aWMgaW50Ci1PbkF1dGgyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXN0YXRpYyBzdHJ1Y3Qgc3RhX2luZm8gc3RhdDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGF0ID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQl1OCAqcGZyYW1lOwotCWNvbnN0IHU4ICpwOwotCXVuc2lnbmVkIGNoYXIgKnNhOwotCXUxNiBhdXRoX21vZGUsIHNlcSwgYWxnb3JpdGhtOwotCWludCBzdGF0dXMsIGxlbiA9IHNrYi0+bGVuOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgIT0gTVNSX0FQKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlEQkdfODcyM0EoIitPbkF1dGgyM2FcbiIpOwotCi0Jc2EgPSBtZ210LT5zYTsKLQotCWF1dGhfbW9kZSA9IHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG07Ci0KLQlwZnJhbWUgPSBtZ210LT51LmF1dGgudmFyaWFibGU7Ci0JbGVuID0gc2tiLT5sZW4gLSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYXV0aC52YXJpYWJsZSk7Ci0KLQlzZXEgPSBsZTE2X3RvX2NwdShtZ210LT51LmF1dGguYXV0aF90cmFuc2FjdGlvbik7Ci0JYWxnb3JpdGhtID0gbGUxNl90b19jcHUobWdtdC0+dS5hdXRoLmF1dGhfYWxnKTsKLQotCURCR184NzIzQSgiYXV0aCBhbGcgPSV4LCBzZXEgPSVYXG4iLCBhbGdvcml0aG0sIHNlcSk7Ci0KLQlpZiAoYXV0aF9tb2RlID09IDIgJiYKLQkgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCAmJgotCSAgICBwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkKLQkJYXV0aF9tb2RlID0gMDsKLQotCS8qICByeCBhIHNoYXJlZC1rZXkgYXV0aCBidXQgc2hhcmVkIG5vdCBlbmFibGVkLCBvciAqLwotCS8qICByeCBhIG9wZW4tc3lzdGVtIGF1dGggYnV0IHNoYXJlZC1rZXkgaXMgZW5hYmxlZCAqLwotCWlmICgoYWxnb3JpdGhtICE9IFdMQU5fQVVUSF9PUEVOICYmIGF1dGhfbW9kZSA9PSAwKSB8fAotCSAgICAoYWxnb3JpdGhtID09IFdMQU5fQVVUSF9PUEVOICYmIGF1dGhfbW9kZSA9PSAxKSkgewotCQlEQkdfODcyM0EoImF1dGggcmVqZWN0ZWQgZHVlIHRvIGJhZCBhbGcgW2FsZyA9JWQsIGF1dGhfbWliICIKLQkJCSAgIj0lZF0gJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAotCQkJICBhbGdvcml0aG0sIGF1dGhfbW9kZSwKLQkJCSAgc2FbMF0sIHNhWzFdLCBzYVsyXSwgc2FbM10sIHNhWzRdLCBzYVs1XSk7Ci0KLQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRzsKLQotCQlnb3RvIGF1dGhfZmFpbDsKLQl9Ci0KLQlpZiAocnR3X2FjY2Vzc19jdHJsMjNhKHBhZGFwdGVyLCBzYSkgPT0gZmFsc2UpIHsKLQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBOwotCQlnb3RvIGF1dGhfZmFpbDsKLQl9Ci0KLQlwc3RhdCA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgc2EpOwotCWlmICghcHN0YXQpIHsKLQkJLyogIGFsbG9jYXRlIGEgbmV3IG9uZSAqLwotCQlEQkdfODcyM0EoImdvaW5nIHRvIGFsbG9jIHN0YWluZm8gZm9yIHNhID0lcE1cbiIsIHNhKTsKLQkJcHN0YXQgPSBydHdfYWxsb2Nfc3RhaW5mbzIzYShwc3RhcHJpdiwgc2EsIEdGUF9BVE9NSUMpOwotCQlpZiAoIXBzdGF0KSB7Ci0JCQlEQkdfODcyM0EoIiBFeGNlZWQgdGhlIHVwcGVyIGxpbWl0IG9mIHN1cHBvcnRlZCAiCi0JCQkJICAiY2xpZW50cy4uLlxuIik7Ci0JCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19BUF9VTkFCTEVfVE9fSEFORExFX05FV19TVEE7Ci0JCQlnb3RvIGF1dGhfZmFpbDsKLQkJfQotCi0JCXBzdGF0LT5zdGF0ZSA9IFdJRklfRldfQVVUSF9OVUxMOwotCQlwc3RhdC0+YXV0aF9zZXEgPSAwOwotCi0JCS8qIHBzdGF0LT5mbGFncyA9IDA7ICovCi0JCS8qIHBzdGF0LT5jYXBhYmlsaXR5ID0gMDsgKi8KLQl9IGVsc2UgewotCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JCWlmICghbGlzdF9lbXB0eSgmcHN0YXQtPmFzb2NfbGlzdCkpIHsKLQkJCWxpc3RfZGVsX2luaXQoJnBzdGF0LT5hc29jX2xpc3QpOwotCQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKLQkJCWlmIChwc3RhdC0+ZXhwaXJlX3RvID4gMCkgewotCQkJCS8qIFRPRE86IFNUQSByZV9hdXRoIHdpdGhpbiBleHBpcmVfdG8gKi8KLQkJCX0KLQkJfQotCQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQotCQlpZiAoc2VxID09IDEpIHsKLQkJCS8qIFRPRE86IFNUQSByZV9hdXRoIGFuZCBhdXRoIHRpbWVvdXQgKi8KLQkJfQotCX0KLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmcHN0YXQtPmF1dGhfbGlzdCkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmcHN0YXQtPmF1dGhfbGlzdCwgJnBzdGFwcml2LT5hdXRoX2xpc3QpOwotCQlwc3RhcHJpdi0+YXV0aF9saXN0X2NudCsrOwotCX0KLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQotCWlmIChwc3RhdC0+YXV0aF9zZXEgPT0gMCkKLQkJcHN0YXQtPmV4cGlyZV90byA9IHBzdGFwcml2LT5hdXRoX3RvOwotCi0JaWYgKChwc3RhdC0+YXV0aF9zZXEgKyAxKSAhPSBzZXEpIHsKLQkJREJHXzg3MjNBKCIoMSlhdXRoIHJlamVjdGVkIGJlY2F1c2Ugb3V0IG9mIHNlcSBbcnhfc2VxID0lZCwgIgotCQkJICAiZXhwX3NlcSA9JWRdIVxuIiwgc2VxLCBwc3RhdC0+YXV0aF9zZXErMSk7Ci0JCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTjsKLQkJZ290byBhdXRoX2ZhaWw7Ci0JfQotCi0JaWYgKGFsZ29yaXRobSA9PSBXTEFOX0FVVEhfT1BFTiAmJiAoYXV0aF9tb2RlID09IDAgfHwgYXV0aF9tb2RlID09IDIpKSB7Ci0JCWlmIChzZXEgPT0gMSkgewotCQkJcHN0YXQtPnN0YXRlICY9IH5XSUZJX0ZXX0FVVEhfTlVMTDsKLQkJCXBzdGF0LT5zdGF0ZSB8PSBXSUZJX0ZXX0FVVEhfU1VDQ0VTUzsKLQkJCXBzdGF0LT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+YXNzb2NfdG87Ci0JCQlwc3RhdC0+YXV0aGFsZyA9IGFsZ29yaXRobTsKLQkJfSBlbHNlIHsKLQkJCURCR184NzIzQSgiKDIpYXV0aCByZWplY3RlZCBiZWNhdXNlIG91dCBvZiBzZXEgIgotCQkJCSAgIltyeF9zZXEgPSVkLCBleHBfc2VxID0lZF0hXG4iLAotCQkJCSAgc2VxLCBwc3RhdC0+YXV0aF9zZXErMSk7Ci0JCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTktOT1dOX0FVVEhfVFJBTlNBQ1RJT047Ci0JCQlnb3RvIGF1dGhfZmFpbDsKLQkJfQotCX0gZWxzZSB7IC8qICBzaGFyZWQgc3lzdGVtIG9yIGF1dG8gYXV0aGVudGljYXRpb24gKi8KLQkJaWYgKHNlcSA9PSAxKSB7Ci0JCQkvKiBwcmVwYXJlIGZvciB0aGUgY2hhbGxlbmdpbmcgdHh0Li4uICovCi0JCQlwc3RhdC0+c3RhdGUgJj0gfldJRklfRldfQVVUSF9OVUxMOwotCQkJcHN0YXQtPnN0YXRlIHw9IFdJRklfRldfQVVUSF9TVEFURTsKLQkJCXBzdGF0LT5hdXRoYWxnID0gYWxnb3JpdGhtOwotCQkJcHN0YXQtPmF1dGhfc2VxID0gMjsKLQkJfSBlbHNlIGlmIChzZXEgPT0gMykgewotCQkJLyogY2hlY2tpbmcgZm9yIGNoYWxsZW5naW5nIHR4dC4uLiAqLwotCQkJREJHXzg3MjNBKCJjaGVja2luZyBmb3IgY2hhbGxlbmdpbmcgdHh0Li4uXG4iKTsKLQotCQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfQ0hBTExFTkdFLCBwZnJhbWUsIGxlbik7Ci0JCQlpZiAoIXAgfHwgcFsxXSA8PSAwKSB7Ci0JCQkJREJHXzg3MjNBKCJhdXRoIHJlamVjdGVkIGJlY2F1c2UgY2hhbGxlbmdlICIKLQkJCQkJICAiZmFpbHVyZSEoMSlcbiIpOwotCQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0NIQUxMRU5HRV9GQUlMOwotCQkJCWdvdG8gYXV0aF9mYWlsOwotCQkJfQotCi0JCQlpZiAoIW1lbWNtcChwICsgMiwgcHN0YXQtPmNoZ190eHQsIDEyOCkpIHsKLQkJCQlwc3RhdC0+c3RhdGUgJj0gfldJRklfRldfQVVUSF9TVEFURTsKLQkJCQlwc3RhdC0+c3RhdGUgfD0gV0lGSV9GV19BVVRIX1NVQ0NFU1M7Ci0JCQkJLyogIGNoYWxsZW5naW5nIHR4dCBpcyBjb3JyZWN0Li4uICovCi0JCQkJcHN0YXQtPmV4cGlyZV90byA9ICBwc3RhcHJpdi0+YXNzb2NfdG87Ci0JCQl9IGVsc2UgewotCQkJCURCR184NzIzQSgiYXV0aCByZWplY3RlZCBiZWNhdXNlIGNoYWxsZW5nZSAiCi0JCQkJCSAgImZhaWx1cmUhXG4iKTsKLQkJCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19DSEFMTEVOR0VfRkFJTDsKLQkJCQlnb3RvIGF1dGhfZmFpbDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCURCR184NzIzQSgiKDMpYXV0aCByZWplY3RlZCBiZWNhdXNlIG91dCBvZiBzZXEgIgotCQkJCSAgIltyeF9zZXEgPSVkLCBleHBfc2VxID0lZF0hXG4iLAotCQkJCSAgc2VxLCBwc3RhdC0+YXV0aF9zZXErMSk7Ci0JCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTktOT1dOX0FVVEhfVFJBTlNBQ1RJT047Ci0JCQlnb3RvIGF1dGhfZmFpbDsKLQkJfQotCX0KLQotCS8qICBOb3csIHdlIGFyZSBnb2luZyB0byBpc3N1ZV9hdXRoLi4uICovCi0JcHN0YXQtPmF1dGhfc2VxID0gc2VxICsgMTsKLQotCWlzc3VlX2F1dGgocGFkYXB0ZXIsIHBzdGF0LCBXTEFOX1NUQVRVU19TVUNDRVNTKTsKLQotCWlmIChwc3RhdC0+c3RhdGUgJiBXSUZJX0ZXX0FVVEhfU1VDQ0VTUykKLQkJcHN0YXQtPmF1dGhfc2VxID0gMDsKLQotCXJldHVybiBfU1VDQ0VTUzsKLQotYXV0aF9mYWlsOgotCi0JaWYgKHBzdGF0KQotCQlydHdfZnJlZV9zdGFpbmZvMjNhKHBhZGFwdGVyLCBwc3RhdCk7Ci0KLQlwc3RhdCA9ICZzdGF0OwotCW1lbXNldCgoY2hhciAqKXBzdGF0LCAnXDAnLCBzaXplb2Yoc3RhdCkpOwotCXBzdGF0LT5hdXRoX3NlcSA9IDI7Ci0JZXRoZXJfYWRkcl9jb3B5KHBzdGF0LT5od2FkZHIsIHNhKTsKLQotCWlzc3VlX2F1dGgocGFkYXB0ZXIsIHBzdGF0LCAodW5zaWduZWQgc2hvcnQpc3RhdHVzKTsKLQotCXJldHVybiBfRkFJTDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50Ci1PbkF1dGgyM2FDbGllbnQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXVuc2lnbmVkIGludCBzZXEsIHN0YXR1cywgYWxndGhtOwotCXVuc2lnbmVkIGludCBnbzJhc29jID0gMDsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCWNvbnN0IHU4ICpwOwotCXU4ICpwaWU7Ci0JaW50IHBsZW4gPSBza2ItPmxlbjsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCS8qIGNoZWNrIEExIG1hdGNoZXMgb3Igbm90ICovCi0JaWYgKCFldGhlcl9hZGRyX2VxdWFsKG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgbWdtdC0+ZGEpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlpZiAoIShwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BVVRIX1NUQVRFKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JcGllID0gbWdtdC0+dS5hdXRoLnZhcmlhYmxlOwotCXBsZW4gLT0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmF1dGgudmFyaWFibGUpOwotCi0JYWxndGhtID0gbGUxNl90b19jcHUobWdtdC0+dS5hdXRoLmF1dGhfYWxnKTsKLQlzZXEgPSBsZTE2X3RvX2NwdShtZ210LT51LmF1dGguYXV0aF90cmFuc2FjdGlvbik7Ci0Jc3RhdHVzID0gbGUxNl90b19jcHUobWdtdC0+dS5hdXRoLnN0YXR1c19jb2RlKTsKLQotCWlmIChzdGF0dXMpIHsKLQkJREJHXzg3MjNBKCJjbG50IGF1dGggZmFpbCwgc3RhdHVzOiAlZFxuIiwgc3RhdHVzKTsKLQkJLyogIHBtbG1laW5mby0+YXV0aF9hbGdvID09IGRvdDExQXV0aEFsZ3J0aG1fQXV0bykgKi8KLQkJaWYgKHN0YXR1cyA9PSBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHKSB7Ci0JCQlpZiAocG1sbWVpbmZvLT5hdXRoX2FsZ28gPT0gZG90MTFBdXRoQWxncnRobV9TaGFyZWQpCi0JCQkJcG1sbWVpbmZvLT5hdXRoX2FsZ28gPSBkb3QxMUF1dGhBbGdydGhtX09wZW47Ci0JCQllbHNlCi0JCQkJcG1sbWVpbmZvLT5hdXRoX2FsZ28gPSBkb3QxMUF1dGhBbGdydGhtX1NoYXJlZDsKLQkJCS8qIHBtbG1laW5mby0+cmVhdXRoX2NvdW50ID0gMDsgKi8KLQkJfQotCi0JCXNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCAxKTsKLQkJZ290byBhdXRoY2xudF9mYWlsOwotCX0KLQotCWlmIChzZXEgPT0gMikgewotCQlpZiAocG1sbWVpbmZvLT5hdXRoX2FsZ28gPT0gZG90MTFBdXRoQWxncnRobV9TaGFyZWQpIHsKLQkJCS8qICBsZWdlbmRhcnkgc2hhcmVkIHN5c3RlbSAqLwotCQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfQ0hBTExFTkdFLCBwaWUsIHBsZW4pOwotCi0JCQlpZiAoIXApIHsKLQkJCQkvKiBEQkdfODcyM0EoIm1hcmM6IG5vIGNoYWxsZW5nZSB0ZXh0P1xuIik7ICovCi0JCQkJZ290byBhdXRoY2xudF9mYWlsOwotCQkJfQotCi0JCQltZW1jcHkoKHZvaWQgKikocG1sbWVpbmZvLT5jaGdfdHh0KSwgcCArIDIsIHBbMV0pOwotCQkJcG1sbWVpbmZvLT5hdXRoX3NlcSA9IDM7Ci0JCQlpc3N1ZV9hdXRoKHBhZGFwdGVyLCBOVUxMLCAwKTsKLQkJCXNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCBSRUFVVEhfVE8pOwotCi0JCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JCX0gZWxzZSB7Ci0JCQkvKiAgb3BlbiBzeXN0ZW0gKi8KLQkJCWdvMmFzb2MgPSAxOwotCQl9Ci0JfSBlbHNlIGlmIChzZXEgPT0gNCkgewotCQlpZiAocG1sbWVpbmZvLT5hdXRoX2FsZ28gPT0gZG90MTFBdXRoQWxncnRobV9TaGFyZWQpCi0JCQlnbzJhc29jID0gMTsKLQkJZWxzZQotCQkJZ290byBhdXRoY2xudF9mYWlsOwotCX0gZWxzZSB7Ci0JCS8qICB0aGlzIGlzIGFsc28gaWxsZWdhbCAqLwotCQkvKiBEQkdfODcyM0EoIm1hcmM6IGNsbnQgYXV0aCBmYWlsZWQgZHVlIHRvIGlsbGVnYWwgc2VxID0leFxuIiwKLQkJICAgc2VxKTsgKi8KLQkJZ290byBhdXRoY2xudF9mYWlsOwotCX0KLQotCWlmIChnbzJhc29jKSB7Ci0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJhdXRoIHN1Y2Nlc3MsIHN0YXJ0IGFzc29jXG4iKTsKLQkJc3RhcnRfY2xudF9hc3NvYyhwYWRhcHRlcik7Ci0JCXJldHVybiBfU1VDQ0VTUzsKLQl9Ci0KLWF1dGhjbG50X2ZhaWw6Ci0KLQkvKiBwbWxtZWluZm8tPnN0YXRlICY9IH4oV0lGSV9GV19BVVRIX1NUQVRFKTsgKi8KLQotCXJldHVybiBfRkFJTDsKLX0KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotc3RhdGljIGludCBydHdfdmFsaWRhdGVfdmVuZG9yX3NwZWNpZmljX2llcyhjb25zdCB1OCAqcG9zLCBpbnQgZWxlbikKLXsKLQl1bnNpZ25lZCBpbnQgb3VpOwotCi0JLyogZmlyc3QgMyBieXRlcyBpbiB2ZW5kb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gZWxlbWVudCBhcmUgdGhlIElFRUUKLQkgKiBPVUkgb2YgdGhlIHZlbmRvci4gVGhlIGZvbGxvd2luZyBieXRlIGlzIHVzZWQgYSB2ZW5kb3Igc3BlY2lmaWMKLQkgKiBzdWItdHlwZS4gKi8KLQlpZiAoZWxlbiA8IDQpIHsKLQkJREJHXzg3MjNBKCJzaG9ydCB2ZW5kb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gZWxlbWVudCAiCi0JCQkgICJpZ25vcmVkIChsZW4gPSVpKVxuIiwgZWxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW91aSA9IFJUV19HRVRfQkUyNChwb3MpOwotCXN3aXRjaCAob3VpKSB7Ci0JY2FzZSBXTEFOX09VSV9NSUNST1NPRlQ6Ci0JCS8qIE1pY3Jvc29mdC9XaS1GaSBpbmZvcm1hdGlvbiBlbGVtZW50cyBhcmUgZnVydGhlciB0eXBlZCBhbmQKLQkJICogc3VidHlwZWQgKi8KLQkJc3dpdGNoIChwb3NbM10pIHsKLQkJY2FzZSBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUEE6Ci0JCQkvKiBNaWNyb3NvZnQgT1VJICgwMDo1MDpGMikgd2l0aCBPVUkgVHlwZSAxOgotCQkJICogcmVhbCBXUEEgaW5mb3JtYXRpb24gZWxlbWVudCAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV01NOgotCQkJaWYgKGVsZW4gPCA1KSB7Ci0JCQkJREJHXzg3MjNBKCJzaG9ydCBXTUUgaW5mb3JtYXRpb24gZWxlbWVudCAiCi0JCQkJCSAgImlnbm9yZWQgKGxlbiA9JWkpXG4iLCBlbGVuKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCXN3aXRjaCAocG9zWzRdKSB7Ci0JCQljYXNlIFdNRV9PVUlfU1VCVFlQRV9JTkZPUk1BVElPTl9FTEVNRU5UOgotCQkJY2FzZSBXTUVfT1VJX1NVQlRZUEVfUEFSQU1FVEVSX0VMRU1FTlQ6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdNRV9PVUlfU1VCVFlQRV9UU1BFQ19FTEVNRU5UOgotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlEQkdfODcyM0EoInVua25vd24gV01FIGluZm9ybWF0aW9uIGVsZW1lbnQgIgotCQkJCQkgICJpZ25vcmVkIChzdWJ0eXBlID0lZCBsZW4gPSVpKVxuIiwKLQkJCQkJICAgcG9zWzRdLCBlbGVuKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQUzoKLQkJCS8qIFdpLUZpIFByb3RlY3RlZCBTZXR1cCAoV1BTKSBJRSAqLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEQkdfODcyM0EoIlVua25vd24gTWljcm9zb2Z0IGluZm9ybWF0aW9uIGVsZW1lbnQgIgotCQkJCSAgImlnbm9yZWQgKHR5cGUgPSVkIGxlbiA9JWkpXG4iLAotCQkJCSAgcG9zWzNdLCBlbGVuKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBPVUlfQlJPQURDT006Ci0JCXN3aXRjaCAocG9zWzNdKSB7Ci0JCWNhc2UgVkVORE9SX0hUX0NBUEFCX09VSV9UWVBFOgotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEQkdfODcyM0EoIlVua25vd24gQnJvYWRjb20gaW5mb3JtYXRpb24gZWxlbWVudCAiCi0JCQkJICAiaWdub3JlZCAodHlwZSA9JWQgbGVuID0laSlcbiIsIHBvc1szXSwgZWxlbik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCURCR184NzIzQSgidW5rbm93biB2ZW5kb3Igc3BlY2lmaWMgaW5mb3JtYXRpb24gZWxlbWVudCAiCi0JCQkgICJpZ25vcmVkICh2ZW5kb3IgT1VJICUwMng6JTAyeDolMDJ4IGxlbiA9JWkpXG4iLAotCQkJICAgcG9zWzBdLCBwb3NbMV0sIHBvc1syXSwgZWxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0d192YWxpZGF0ZV9mcmFtZV9pZXMoY29uc3QgdTggKnN0YXJ0LCB1aW50IGxlbikKLXsKLQljb25zdCB1OCAqcG9zID0gc3RhcnQ7Ci0JaW50IGxlZnQgPSBsZW47Ci0JaW50IHVua25vd24gPSAwOwotCi0Jd2hpbGUgKGxlZnQgPj0gMikgewotCQl1OCBpZCwgZWxlbjsKLQotCQlpZCA9ICpwb3MrKzsKLQkJZWxlbiA9ICpwb3MrKzsKLQkJbGVmdCAtPSAyOwotCi0JCWlmIChlbGVuID4gbGVmdCkgewotCQkJREJHXzg3MjNBKCIlczogSUVFRSA4MDIuMTEgZmFpbGVkIChpZCA9JWQgZWxlbiA9JWQgIgotCQkJCSAgImxlZnQgPSVpKVxuIiwgX19mdW5jX18sIGlkLCBlbGVuLCBsZWZ0KTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJc3dpdGNoIChpZCkgewotCQljYXNlIFdMQU5fRUlEX1NTSUQ6Ci0JCWNhc2UgV0xBTl9FSURfU1VQUF9SQVRFUzoKLQkJY2FzZSBXTEFOX0VJRF9GSF9QQVJBTVM6Ci0JCWNhc2UgV0xBTl9FSURfRFNfUEFSQU1TOgotCQljYXNlIFdMQU5fRUlEX0NGX1BBUkFNUzoKLQkJY2FzZSBXTEFOX0VJRF9USU06Ci0JCWNhc2UgV0xBTl9FSURfSUJTU19QQVJBTVM6Ci0JCWNhc2UgV0xBTl9FSURfQ0hBTExFTkdFOgotCQljYXNlIFdMQU5fRUlEX0VSUF9JTkZPOgotCQljYXNlIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTOgotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDOgotCQkJaWYgKHJ0d192YWxpZGF0ZV92ZW5kb3Jfc3BlY2lmaWNfaWVzKHBvcywgZWxlbikpCi0JCQkJdW5rbm93bisrOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUlNOOgotCQljYXNlIFdMQU5fRUlEX1BXUl9DQVBBQklMSVRZOgotCQljYXNlIFdMQU5fRUlEX1NVUFBPUlRFRF9DSEFOTkVMUzoKLQkJY2FzZSBXTEFOX0VJRF9NT0JJTElUWV9ET01BSU46Ci0JCWNhc2UgV0xBTl9FSURfRkFTVF9CU1NfVFJBTlNJVElPTjoKLQkJY2FzZSBXTEFOX0VJRF9USU1FT1VUX0lOVEVSVkFMOgotCQljYXNlIFdMQU5fRUlEX0hUX0NBUEFCSUxJVFk6Ci0JCWNhc2UgV0xBTl9FSURfSFRfT1BFUkFUSU9OOgotCQlkZWZhdWx0OgotCQkJdW5rbm93bisrOwotCQkJREJHXzg3MjNBKCIlcyBJRUVFIDgwMi4xMSBpZ25vcmVkIHVua25vd24gZWxlbWVudCAiCi0JCQkJICAiKGlkID0lZCBlbGVuID0lZClcbiIsIF9fZnVuY19fLCBpZCwgZWxlbik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWxlZnQgLT0gZWxlbjsKLQkJcG9zICs9IGVsZW47Ci0JfQotCi0JaWYgKGxlZnQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludAotT25Bc3NvY1JlcTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JdTE2IGNhcGFiX2luZm8sIGxpc3Rlbl9pbnRlcnZhbDsKLQlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGF0OwotCXVuc2lnbmVkIGNoYXIgcmVhc3NvYzsKLQlpbnQgaSwgd3BhX2llX2xlbiwgbGVmdDsKLQl1bnNpZ25lZCBjaGFyIHN1cHBvcnRSYXRlWzE2XTsKLQlpbnQgc3VwcG9ydFJhdGVOdW07Ci0JdW5zaWduZWQgc2hvcnQgc3RhdHVzID0gV0xBTl9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyID0gJnBtbG1laW5mby0+bmV0d29yazsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCWNvbnN0IHU4ICpwb3MsICpwLCAqd3BhX2llLCAqd3BzX2llOwotCXU4ICpwZnJhbWUgPSBza2ItPmRhdGE7Ci0JdWludCBwa3RfbGVuID0gc2tiLT5sZW47Ci0JaW50IHI7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSAhPSBNU1JfQVApCi0JCXJldHVybiBfRkFJTDsKLQotCWxlZnQgPSBwa3RfbGVuIC0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShtZ210LT5mcmFtZV9jb250cm9sKSkgewotCQlyZWFzc29jID0gMDsKLQkJcG9zID0gbWdtdC0+dS5hc3NvY19yZXEudmFyaWFibGU7Ci0JCWxlZnQgLT0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFzc29jX3JlcS52YXJpYWJsZSk7Ci0JfSBlbHNlIHsgLyogIFdJRklfUkVBU1NPQ1JFUSAqLwotCQlyZWFzc29jID0gMTsKLQkJcG9zID0gbWdtdC0+dS5yZWFzc29jX3JlcS52YXJpYWJsZTsKLQkJbGVmdCAtPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUucmVhc3NvY19yZXEudmFyaWFibGUpOwotCX0KLQotCWlmIChsZWZ0IDwgMCkgewotCQlEQkdfODcyM0EoImhhbmRsZV9hc3NvYyhyZWFzc29jID0lZCkgLSB0b28gc2hvcnQgcGF5bG9hZCAiCi0JCQkgICIobGVuID0lbHUpXG4iLCByZWFzc29jLCAodW5zaWduZWQgbG9uZylwa3RfbGVuKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCXBzdGF0ID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBtZ210LT5zYSk7Ci0JaWYgKCFwc3RhdCkgewotCQlzdGF0dXMgPSBXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQTsKLQkJZ290byBhc29jX2NsYXNzMl9lcnJvcjsKLQl9Ci0KLQkvKiBUaGVzZSB0d28gYXJlIGxvY2F0ZWQgYXQgdGhlIHNhbWUgb2Zmc2V0cyB3aGV0aGVyIGl0J3MgYW4KLQkgKiBhc3NvY19yZXEgb3IgYSByZWFzc29jX3JlcSAqLwotCWNhcGFiX2luZm8gPSBnZXRfdW5hbGlnbmVkX2xlMTYoJm1nbXQtPnUuYXNzb2NfcmVxLmNhcGFiX2luZm8pOwotCWxpc3Rlbl9pbnRlcnZhbCA9Ci0JCWdldF91bmFsaWduZWRfbGUxNigmbWdtdC0+dS5hc3NvY19yZXEubGlzdGVuX2ludGVydmFsKTsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCS8qICBjaGVjayBpZiB0aGlzIHN0YXQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQvYXNzb2NhdGVkICovCi0JaWYgKCEocHN0YXQtPnN0YXRlICYgV0lGSV9GV19BVVRIX1NVQ0NFU1MpKSB7Ci0JCWlmICghKHBzdGF0LT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykpIHsKLQkJCXN0YXR1cyA9IFdMQU5fUkVBU09OX0NMQVNTMl9GUkFNRV9GUk9NX05PTkFVVEhfU1RBOwotCQkJZ290byBhc29jX2NsYXNzMl9lcnJvcjsKLQkJfSBlbHNlIHsKLQkJCXBzdGF0LT5zdGF0ZSAmPSAofldJRklfRldfQVNTT0NfU1VDQ0VTUyk7Ci0JCQlwc3RhdC0+c3RhdGUgfD0gV0lGSV9GV19BU1NPQ19TVEFURTsKLQkJfQotCX0gZWxzZSB7Ci0JCXBzdGF0LT5zdGF0ZSAmPSAofldJRklfRldfQVVUSF9TVUNDRVNTKTsKLQkJcHN0YXQtPnN0YXRlIHw9IFdJRklfRldfQVNTT0NfU1RBVEU7Ci0JfQotCi0JcHN0YXQtPmNhcGFiaWxpdHkgPSBjYXBhYl9pbmZvOwotCi0JLyogbm93IHBhcnNlIGFsbCBpZWVlODAyXzExIGllIHRvIHBvaW50IHRvIGVsZW1zICovCi0KLQlpZiAocnR3X3ZhbGlkYXRlX2ZyYW1lX2llcyhwb3MsIGxlZnQpKSB7Ci0JCURCR184NzIzQSgiU1RBICVwTSBzZW50IGludmFsaWQgYXNzb2NpYXRpb24gcmVxdWVzdFxuIiwKLQkJCSAgcHN0YXQtPmh3YWRkcik7Ci0JCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7Ci0JCWdvdG8gT25Bc3NvY1JlcTIzYUZhaWw7Ci0JfQotCi0JLyogIG5vdyB3ZSBzaG91bGQgY2hlY2sgYWxsIHRoZSBmaWVsZHMuLi4gKi8KLQkvKiAgY2hlY2tpbmcgU1NJRCAqLwotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1NTSUQsIHBvcywgbGVmdCk7Ci0JaWYgKCFwIHx8IHBbMV0gPT0gMCkgewotCQkvKiAgYnJvYWRjYXN0IHNzaWQsIGhvd2V2ZXIgaXQgaXMgbm90IGFsbG93ZWQgaW4gYXNzb2NyZXEgKi8KLQkJREJHXzg3MjNBKCJTVEEgJXBNIHNlbnQgaW52YWxpZCBhc3NvY2lhdGlvbiByZXF1ZXN0IGxhY2tpbmcgYW4gU1NJRFxuIiwKLQkJCSAgcHN0YXQtPmh3YWRkcik7Ci0JCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7Ci0JCWdvdG8gT25Bc3NvY1JlcTIzYUZhaWw7Ci0JfSBlbHNlIHsKLQkJLyogIGNoZWNrIGlmIHNzaWQgbWF0Y2ggKi8KLQkJaWYgKG1lbWNtcChwICsgMiwgY3VyLT5Tc2lkLnNzaWQsIGN1ci0+U3NpZC5zc2lkX2xlbikpCi0JCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOwotCi0JCWlmIChwWzFdICE9IGN1ci0+U3NpZC5zc2lkX2xlbikKLQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7Ci0JfQotCi0JaWYgKHN0YXR1cyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwotCi0JLyogIGNoZWNrIGlmIHRoZSBzdXBwb3J0ZWQgcmF0ZSBpcyBvayAqLwotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1NVUFBfUkFURVMsIHBvcywgbGVmdCk7Ci0JaWYgKCFwKSB7Ci0JCURCR184NzIzQSgiUnggYSBzdGEgYXNzb2MtcmVxIHdoaWNoIHN1cHBvcnRlZCByYXRlIGlzICIKLQkJCSAgImVtcHR5IVxuIik7Ci0JCS8qICB1c2Ugb3VyIG93biByYXRlIHNldCBhcyBzdGF0b2luIHVzZWQgKi8KLQkJLyogbWVtY3B5KHN1cHBvcnRSYXRlLCBBUF9CU1NSQVRFLCBBUF9CU1NSQVRFX0xFTik7ICovCi0JCS8qIHN1cHBvcnRSYXRlTnVtID0gQVBfQlNTUkFURV9MRU47ICovCi0KLQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRTsKLQkJZ290byBPbkFzc29jUmVxMjNhRmFpbDsKLQl9IGVsc2UgewotCQltZW1jcHkoc3VwcG9ydFJhdGUsIHAgKyAyLCBwWzFdKTsKLQkJc3VwcG9ydFJhdGVOdW0gPSBwWzFdOwotCi0JCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLCBwb3MsIGxlZnQpOwotCQlpZiAocCkgewotCQkJaWYgKHN1cHBvcnRSYXRlTnVtIDw9IHNpemVvZihzdXBwb3J0UmF0ZSkpIHsKLQkJCQltZW1jcHkoc3VwcG9ydFJhdGUrc3VwcG9ydFJhdGVOdW0sIHAgKyAyLCBwWzFdKTsKLQkJCQlzdXBwb3J0UmF0ZU51bSArPSBwWzFdOwotCQkJfQotCQl9Ci0JfQotCi0JLyogdG9kbzogbWFzayBzdXBwb3J0UmF0ZSBiZXR3ZWVuIEFQICYgU1RBIC0+IG1vdmUgdG8gdXBkYXRlIHJhaWQgKi8KLQkvKiBnZXRfbWF0Y2hlZF9yYXRlKHBtbG1lZXh0LCBzdXBwb3J0UmF0ZSwgJnN1cHBvcnRSYXRlTnVtLCAwKTsgKi8KLQotCS8qIHVwZGF0ZSBzdGF0aW9uIHN1cHBvcnRSYXRlICovCi0JcHN0YXQtPmJzc3JhdGVsZW4gPSBzdXBwb3J0UmF0ZU51bTsKLQltZW1jcHkocHN0YXQtPmJzc3JhdGVzZXQsIHN1cHBvcnRSYXRlLCBzdXBwb3J0UmF0ZU51bSk7Ci0JVXBkYXRlMjNhVGJsRm9yU29mdEFQKHBzdGF0LT5ic3NyYXRlc2V0LCBwc3RhdC0+YnNzcmF0ZWxlbik7Ci0KLQkvKiBjaGVjayBSU04vV1BBL1dQUyAqLwotCXBzdGF0LT5kb3Q4MDIxeGFsZyA9IDA7Ci0JcHN0YXQtPndwYV9wc2sgPSAwOwotCXBzdGF0LT53cGFfZ3JvdXBfY2lwaGVyID0gMDsKLQlwc3RhdC0+d3BhMl9ncm91cF9jaXBoZXIgPSAwOwotCXBzdGF0LT53cGFfcGFpcndpc2VfY2lwaGVyID0gMDsKLQlwc3RhdC0+d3BhMl9wYWlyd2lzZV9jaXBoZXIgPSAwOwotCW1lbXNldChwc3RhdC0+d3BhX2llLCAwLCBzaXplb2YocHN0YXQtPndwYV9pZSkpOwotCi0Jd3BhX2llID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9SU04sIHBvcywgbGVmdCk7Ci0JaWYgKCF3cGFfaWUpCi0JCXdwYV9pZSA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJCSBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUEEsCi0JCQkJCQkgcG9zLCBsZWZ0KTsKLQlpZiAod3BhX2llKSB7Ci0JCWludCBncm91cF9jaXBoZXIgPSAwLCBwYWlyd2lzZV9jaXBoZXIgPSAwOwotCi0JCXdwYV9pZV9sZW4gPSB3cGFfaWVbMV07Ci0JCWlmIChwc2VjdXJpdHlwcml2LT53cGFfcHNrICYgQklUKDEpKSB7Ci0JCQlyID0gcnR3X3BhcnNlX3dwYTJfaWUyM2Eod3BhX2llLCB3cGFfaWVfbGVuICsgMiwKLQkJCQkJCSAmZ3JvdXBfY2lwaGVyLAotCQkJCQkJICZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpOwotCQkJaWYgKHIgPT0gX1NVQ0NFU1MpIHsKLQkJCQlwc3RhdC0+ZG90ODAyMXhhbGcgPSAxOy8qIHBzaywgIHRvZG86ODAyLjF4ICovCi0JCQkJcHN0YXQtPndwYV9wc2sgfD0gQklUKDEpOwotCi0JCQkJcHN0YXQtPndwYTJfZ3JvdXBfY2lwaGVyID0gZ3JvdXBfY2lwaGVyICYKLQkJCQkJcHNlY3VyaXR5cHJpdi0+d3BhMl9ncm91cF9jaXBoZXI7Ci0JCQkJcHN0YXQtPndwYTJfcGFpcndpc2VfY2lwaGVyID0gcGFpcndpc2VfY2lwaGVyICYKLQkJCQkJcHNlY3VyaXR5cHJpdi0+d3BhMl9wYWlyd2lzZV9jaXBoZXI7Ci0JCQl9IGVsc2UKLQkJCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19JTlZBTElEX0lFOwotCQl9IGVsc2UgaWYgKHBzZWN1cml0eXByaXYtPndwYV9wc2sgJiBCSVQoMCkpIHsKLQkJCXIgPSBydHdfcGFyc2Vfd3BhX2llMjNhKHdwYV9pZSwgd3BhX2llX2xlbiArIDIsCi0JCQkJCQkmZ3JvdXBfY2lwaGVyLCAmcGFpcndpc2VfY2lwaGVyLAotCQkJCQkJTlVMTCk7Ci0JCQlpZiAociA9PSBfU1VDQ0VTUykgewotCQkJCXBzdGF0LT5kb3Q4MDIxeGFsZyA9IDE7LyogcHNrLCAgdG9kbzo4MDIuMXggKi8KLQkJCQlwc3RhdC0+d3BhX3BzayB8PSBCSVQoMCk7Ci0KLQkJCQlwc3RhdC0+d3BhX2dyb3VwX2NpcGhlciA9IGdyb3VwX2NpcGhlciAmCi0JCQkJCXBzZWN1cml0eXByaXYtPndwYV9ncm91cF9jaXBoZXI7Ci0JCQkJcHN0YXQtPndwYV9wYWlyd2lzZV9jaXBoZXIgPSBwYWlyd2lzZV9jaXBoZXIgJgotCQkJCQlwc2VjdXJpdHlwcml2LT53cGFfcGFpcndpc2VfY2lwaGVyOwotCQkJfSBlbHNlCi0JCQkJc3RhdHVzID0gV0xBTl9TVEFUVVNfSU5WQUxJRF9JRTsKLQkJfSBlbHNlIHsKLQkJCXdwYV9pZSA9IE5VTEw7Ci0JCQl3cGFfaWVfbGVuID0gMDsKLQkJfQotCQlpZiAod3BhX2llICYmIHN0YXR1cyA9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7Ci0JCQlpZiAoIXBzdGF0LT53cGFfZ3JvdXBfY2lwaGVyKQotCQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0lOVkFMSURfR1JPVVBfQ0lQSEVSOwotCi0JCQlpZiAoIXBzdGF0LT53cGFfcGFpcndpc2VfY2lwaGVyKQotCQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0lOVkFMSURfUEFJUldJU0VfQ0lQSEVSOwotCQl9Ci0JfQotCi0JaWYgKHN0YXR1cyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKQotCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwotCi0JcHN0YXQtPmZsYWdzICY9IH4oV0xBTl9TVEFfV1BTIHwgV0xBTl9TVEFfTUFZQkVfV1BTKTsKLQotCXdwc19pZSA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQUywKLQkJCQkJIHBvcywgbGVmdCk7Ci0KLQlpZiAoIXdwYV9pZSkgewotCQlpZiAod3BzX2llKSB7Ci0JCQlEQkdfODcyM0EoIlNUQSBpbmNsdWRlZCBXUFMgSUUgaW4gKFJlKUFzc29jaWF0aW9uICIKLQkJCQkgICJSZXF1ZXN0IC0gYXNzdW1lIFdQUyBpcyB1c2VkXG4iKTsKLQkJCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9XUFM7Ci0JCX0gZWxzZSB7Ci0JCQlEQkdfODcyM0EoIlNUQSBkaWQgbm90IGluY2x1ZGUgV1BBL1JTTiBJRSBpbiAoUmUpIgotCQkJCSAgICJBc3NvY2lhdGlvbiBSZXF1ZXN0IC0gcG9zc2libGUgV1BTIHVzZVxuIik7Ci0JCQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfTUFZQkVfV1BTOwotCQl9Ci0JfSBlbHNlIHsKLQkJaW50IGNvcHlfbGVuOwotCi0JCWlmIChwc2VjdXJpdHlwcml2LT53cGFfcHNrID09IDApIHsKLQkJCURCR184NzIzQSgiU1RBICVwTTogV1BBL1JTTiBJRSBpbiBhc3NvY2lhdGlvbiByZXF1ZXN0LCBidXQgQVAgZG9uJ3Qgc3VwcG9ydCBXUEEvUlNOXG4iLAotCQkJCSAgcHN0YXQtPmh3YWRkcik7Ci0KLQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0lOVkFMSURfSUU7Ci0KLQkJCWdvdG8gT25Bc3NvY1JlcTIzYUZhaWw7Ci0JCX0KLQotCQlpZiAod3BzX2llKSB7Ci0JCQlEQkdfODcyM0EoIlNUQSBpbmNsdWRlZCBXUFMgSUUgaW4gKFJlKUFzc29jaWF0aW9uICIKLQkJCQkgICJSZXF1ZXN0IC0gV1BTIGlzIHVzZWRcbiIpOwotCQkJcHN0YXQtPmZsYWdzIHw9IFdMQU5fU1RBX1dQUzsKLQkJCWNvcHlfbGVuID0gMDsKLQkJfSBlbHNlIHsKLQkJCWNvcHlfbGVuID0gKCh3cGFfaWVfbGVuICsgMikgPiBzaXplb2YocHN0YXQtPndwYV9pZSkpID8KLQkJCQlzaXplb2YocHN0YXQtPndwYV9pZSkgOiAod3BhX2llX2xlbiArIDIpOwotCQl9Ci0KLQkJaWYgKGNvcHlfbGVuID4gMCkKLQkJCW1lbWNweShwc3RhdC0+d3BhX2llLCB3cGFfaWUgLSAyLCBjb3B5X2xlbik7Ci0JfQotCi0JLyogIGNoZWNrIGlmIHRoZXJlIGlzIFdNTSBJRSAmIHN1cHBvcnQgV1dNLVBTICovCi0JcHN0YXQtPmZsYWdzICY9IH5XTEFOX1NUQV9XTUU7Ci0JcHN0YXQtPnFvc19vcHRpb24gPSAwOwotCXBzdGF0LT5xb3NfaW5mbyA9IDA7Ci0JcHN0YXQtPmhhc19sZWdhY3lfYWMgPSB0cnVlOwotCXBzdGF0LT51YXBzZF92byA9IDA7Ci0JcHN0YXQtPnVhcHNkX3ZpID0gMDsKLQlwc3RhdC0+dWFwc2RfYmUgPSAwOwotCXBzdGF0LT51YXBzZF9iayA9IDA7Ci0JaWYgKHBtbG1lcHJpdi0+cW9zX29wdGlvbikgewotCQljb25zdCB1OCAqZW5kID0gcG9zICsgbGVmdDsKLQotCQlwID0gcG9zOwotCi0JCWZvciAoOzspIHsKLQkJCWxlZnQgPSBlbmQgLSBwOwotCQkJcCA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJCSAgICBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XTU0sCi0JCQkJCQkgICAgcCwgbGVmdCk7Ci0JCQlpZiAocCkgewotCQkJCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9XTUU7Ci0KLQkJCQlwc3RhdC0+cW9zX29wdGlvbiA9IDE7Ci0JCQkJcHN0YXQtPnFvc19pbmZvID0gKihwICsgOCk7Ci0KLQkJCQlwc3RhdC0+bWF4X3NwX2xlbiA9Ci0JCQkJCShwc3RhdC0+cW9zX2luZm8gPj4gNSkgJiAweDM7Ci0KLQkJCQlpZiAoKHBzdGF0LT5xb3NfaW5mbyAmIDB4ZikgIT0gMHhmKQotCQkJCQlwc3RhdC0+aGFzX2xlZ2FjeV9hYyA9IHRydWU7Ci0JCQkJZWxzZQotCQkJCQlwc3RhdC0+aGFzX2xlZ2FjeV9hYyA9IGZhbHNlOwotCi0JCQkJaWYgKHBzdGF0LT5xb3NfaW5mbyAmIDB4ZikgewotCQkJCQlpZiAocHN0YXQtPnFvc19pbmZvICYgQklUKDApKQotCQkJCQkJcHN0YXQtPnVhcHNkX3ZvID0gQklUKDApfEJJVCgxKTsKLQkJCQkJZWxzZQotCQkJCQkJcHN0YXQtPnVhcHNkX3ZvID0gMDsKLQotCQkJCQlpZiAocHN0YXQtPnFvc19pbmZvICYgQklUKDEpKQotCQkJCQkJcHN0YXQtPnVhcHNkX3ZpID0gQklUKDApfEJJVCgxKTsKLQkJCQkJZWxzZQotCQkJCQkJcHN0YXQtPnVhcHNkX3ZpID0gMDsKLQotCQkJCQlpZiAocHN0YXQtPnFvc19pbmZvICYgQklUKDIpKQotCQkJCQkJcHN0YXQtPnVhcHNkX2JrID0gQklUKDApfEJJVCgxKTsKLQkJCQkJZWxzZQotCQkJCQkJcHN0YXQtPnVhcHNkX2JrID0gMDsKLQotCQkJCQlpZiAocHN0YXQtPnFvc19pbmZvICYgQklUKDMpKQotCQkJCQkJcHN0YXQtPnVhcHNkX2JlID0gQklUKDApfEJJVCgxKTsKLQkJCQkJZWxzZQotCQkJCQkJcHN0YXQtPnVhcHNkX2JlID0gMDsKLQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQkJcCA9IHAgKyBwWzFdICsgMjsKLQkJfQotCX0KLQotCS8qIHNhdmUgSFQgY2FwYWJpbGl0aWVzIGluIHRoZSBzdGEgb2JqZWN0ICovCi0JbWVtc2V0KCZwc3RhdC0+aHRwcml2Lmh0X2NhcCwgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7Ci0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwgcG9zLCBsZWZ0KTsKLQotCWlmIChwICYmIHBbMV0gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSkgewotCQlwc3RhdC0+ZmxhZ3MgfD0gV0xBTl9TVEFfSFQ7Ci0KLQkJcHN0YXQtPmZsYWdzIHw9IFdMQU5fU1RBX1dNRTsKLQotCQltZW1jcHkoJnBzdGF0LT5odHByaXYuaHRfY2FwLCBwICsgMiwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOwotCX0gZWxzZQotCQlwc3RhdC0+ZmxhZ3MgJj0gfldMQU5fU1RBX0hUOwotCi0JaWYgKCFwbWxtZXByaXYtPmh0cHJpdi5odF9vcHRpb24gJiYgcHN0YXQtPmZsYWdzICYgV0xBTl9TVEFfSFQpewotCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOwotCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwotCX0KLQotCWlmIChwc3RhdC0+ZmxhZ3MgJiBXTEFOX1NUQV9IVCAmJgotCSAgICAocHN0YXQtPndwYTJfcGFpcndpc2VfY2lwaGVyICYgV1BBX0NJUEhFUl9US0lQIHx8Ci0JICAgICBwc3RhdC0+d3BhX3BhaXJ3aXNlX2NpcGhlciAmIFdQQV9DSVBIRVJfVEtJUCkpIHsKLQkJREJHXzg3MjNBKCJIVDogJXBNIHRyaWVkIHRvIHVzZSBUS0lQIHdpdGggSFQgYXNzb2NpYXRpb25cbiIsCi0JCQkgIHBzdGF0LT5od2FkZHIpOwotCi0JCS8qIHN0YXR1cyA9IFdMQU5fU1RBVFVTX0NJUEhFUl9SRUpFQ1RFRF9QRVJfUE9MSUNZOyAqLwotCQkvKiBnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOyAqLwotCX0KLQotCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9OT05FUlA7Ci0JZm9yIChpID0gMDsgaSA8IHBzdGF0LT5ic3NyYXRlbGVuOyBpKyspIHsKLQkJaWYgKChwc3RhdC0+YnNzcmF0ZXNldFtpXSAmIDB4N2YpID4gMjIpIHsKLQkJCXBzdGF0LT5mbGFncyAmPSB+V0xBTl9TVEFfTk9ORVJQOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAocHN0YXQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCi0JCXBzdGF0LT5mbGFncyB8PSBXTEFOX1NUQV9TSE9SVF9QUkVBTUJMRTsKLQllbHNlCi0JCXBzdGF0LT5mbGFncyAmPSB+V0xBTl9TVEFfU0hPUlRfUFJFQU1CTEU7Ci0KLQlpZiAoc3RhdHVzICE9IFdMQU5fU1RBVFVTX1NVQ0NFU1MpCi0JCWdvdG8gT25Bc3NvY1JlcTIzYUZhaWw7Ci0KLQkvKiBUT0RPOiBpZGVudGlmeV9wcm9wcmlldGFyeV92ZW5kb3JfaWUoKTsgKi8KLQkvKiAgUmVhbHRlayBwcm9wcmlldGFyeSBJRSAqLwotCS8qICBpZGVudGlmeSBpZiB0aGlzIGlzIEJyb2FkY29tIHN0YSAqLwotCS8qICBpZGVudGlmeSBpZiB0aGlzIGlzIHJhbGluayBzdGEgKi8KLQkvKiAgQ3VzdG9tZXIgcHJvcHJpZXRhcnkgSUUgKi8KLQotCS8qIGdldCBhIHVuaXF1ZSBBSUQgKi8KLQlpZiAocHN0YXQtPmFpZCA+IDApIHsKLQkJREJHXzg3MjNBKCIgIG9sZCBBSUQgJWRcbiIsIHBzdGF0LT5haWQpOwotCX0gZWxzZSB7Ci0JCWZvciAocHN0YXQtPmFpZCA9IDE7IHBzdGF0LT5haWQgPD0gTlVNX1NUQTsgcHN0YXQtPmFpZCsrKQotCQkJaWYgKHBzdGFwcml2LT5zdGFfYWlkW3BzdGF0LT5haWQgLSAxXSA9PSBOVUxMKQotCQkJCWJyZWFrOwotCi0JCWlmIChwc3RhdC0+YWlkID4gTlVNX1NUQSkKLQkJCXBzdGF0LT5haWQgPSBOVU1fU1RBOwotCQlpZiAocHN0YXQtPmFpZCA+IHBzdGFwcml2LT5tYXhfbnVtX3N0YSkgewotCi0JCQlwc3RhdC0+YWlkID0gMDsKLQotCQkJREJHXzg3MjNBKCIgIG5vIHJvb20gZm9yIG1vcmUgQUlEc1xuIik7Ci0KLQkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0FQX1VOQUJMRV9UT19IQU5ETEVfTkVXX1NUQTsKLQotCQkJZ290byBPbkFzc29jUmVxMjNhRmFpbDsKLQkJfSBlbHNlIHsKLQkJCXBzdGFwcml2LT5zdGFfYWlkW3BzdGF0LT5haWQgLSAxXSA9IHBzdGF0OwotCQkJREJHXzg3MjNBKCJhbGxvY2F0ZSBuZXcgQUlEID0gKCVkKVxuIiwgcHN0YXQtPmFpZCk7Ci0JCX0KLQl9Ci0KLQlwc3RhdC0+c3RhdGUgJj0gfldJRklfRldfQVNTT0NfU1RBVEU7Ci0JcHN0YXQtPnN0YXRlIHw9IFdJRklfRldfQVNTT0NfU1VDQ0VTUzsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnBzdGF0LT5hdXRoX2xpc3QpKSB7Ci0JCWxpc3RfZGVsX2luaXQoJnBzdGF0LT5hdXRoX2xpc3QpOwotCQlwc3RhcHJpdi0+YXV0aF9saXN0X2NudC0tOwotCX0KLQlzcGluX3VubG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQlpZiAobGlzdF9lbXB0eSgmcHN0YXQtPmFzb2NfbGlzdCkpIHsKLQkJcHN0YXQtPmV4cGlyZV90byA9IHBzdGFwcml2LT5leHBpcmVfdG87Ci0JCWxpc3RfYWRkX3RhaWwoJnBzdGF0LT5hc29jX2xpc3QsICZwc3RhcHJpdi0+YXNvY19saXN0KTsKLQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQrKzsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0KLQkvKiAgbm93IHRoZSBzdGF0aW9uIGlzIHF1YWxpZmllZCB0byBqb2luIG91ciBCU1MuLi4gKi8KLQlpZiAocHN0YXQtPnN0YXRlICYgV0lGSV9GV19BU1NPQ19TVUNDRVNTICYmCi0JICAgIHN0YXR1cyA9PSBXTEFOX1NUQVRVU19TVUNDRVNTKSB7Ci0JCS8qIDEgYnNzX2NhcF91cGRhdGUgJiBzdGFfaW5mb191cGRhdGUyM2EgKi8KLQkJYnNzX2NhcF91cGRhdGVfb25fc3RhX2pvaW4yM2EocGFkYXB0ZXIsIHBzdGF0KTsKLQkJc3RhX2luZm9fdXBkYXRlMjNhKHBhZGFwdGVyLCBwc3RhdCk7Ci0KLQkJLyogaXNzdWUgYXNzb2MgcnNwIGJlZm9yZSBub3RpZnkgc3RhdGlvbiBqb2luIGV2ZW50LiAqLwotCQlpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShtZ210LT5mcmFtZV9jb250cm9sKSkKLQkJCWlzc3VlX2Fzc29jcnNwKHBhZGFwdGVyLCBzdGF0dXMsIHBzdGF0LAotCQkJCSAgICAgICBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUCk7Ci0JCWVsc2UKLQkJCWlzc3VlX2Fzc29jcnNwKHBhZGFwdGVyLCBzdGF0dXMsIHBzdGF0LAotCQkJCSAgICAgICBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQKTsKLQotCQkvKiAyIC0gcmVwb3J0IHRvIHVwcGVyIGxheWVyICovCi0JCURCR184NzIzQSgiaW5kaWNhdGVfc3RhX2pvaW5fZXZlbnQgdG8gdXBwZXIgbGF5ZXIgLSBob3N0YXBkXG4iKTsKLQkJcnR3X2NmZzgwMjExX2luZGljYXRlX3N0YV9hc3NvYyhwYWRhcHRlciwgcGZyYW1lLCBwa3RfbGVuKTsKLQotCQkvKiAzLSgxKSByZXBvcnQgc3RhIGFkZCBldmVudCAqLwotCQlyZXBvcnRfYWRkX3N0YV9ldmVudDIzYShwYWRhcHRlciwgcHN0YXQtPmh3YWRkciwgcHN0YXQtPmFpZCk7Ci0JfQotCi0JcmV0dXJuIF9TVUNDRVNTOwotCi1hc29jX2NsYXNzMl9lcnJvcjoKLQotCWlzc3VlX2RlYXV0aDIzYShwYWRhcHRlciwgbWdtdC0+c2EsIHN0YXR1cyk7Ci0JcmV0dXJuIF9GQUlMOwotCi1PbkFzc29jUmVxMjNhRmFpbDoKLQotCXBzdGF0LT5haWQgPSAwOwotCWlmIChpZWVlODAyMTFfaXNfYXNzb2NfcmVxKG1nbXQtPmZyYW1lX2NvbnRyb2wpKQotCQlpc3N1ZV9hc3NvY3JzcChwYWRhcHRlciwgc3RhdHVzLCBwc3RhdCwKLQkJCSAgICAgICBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUCk7Ci0JZWxzZQotCQlpc3N1ZV9hc3NvY3JzcChwYWRhcHRlciwgc3RhdHVzLCBwc3RhdCwKLQkJCSAgICAgICBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQKTsKLQotI2VuZGlmIC8qIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCi0JcmV0dXJuIF9GQUlMOwotfQotCi1zdGF0aWMgaW50Ci1PbkFzc29jUnNwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICpwbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiLT5kYXRhOwotCWludCByZXM7Ci0JdW5zaWduZWQgc2hvcnQgc3RhdHVzOwotCWNvbnN0IHU4ICpwLCAqcGllOwotCXU4ICpwZnJhbWUgPSBza2ItPmRhdGE7Ci0JaW50IHBrdF9sZW4gPSBza2ItPmxlbjsKLQlpbnQgcGllbGVuOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JLyogY2hlY2sgQTEgbWF0Y2hlcyBvciBub3QgKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBwbWdtdC0+ZGEpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlpZiAoIShwbWxtZWluZm8tPnN0YXRlICYgKFdJRklfRldfQVVUSF9TVUNDRVNTIHwgV0lGSV9GV19BU1NPQ19TVEFURSkpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQotCS8qIHN0YXR1cyAqLwotCXN0YXR1cyA9IGxlMTZfdG9fY3B1KHBtZ210LT51LmFzc29jX3Jlc3Auc3RhdHVzX2NvZGUpOwotCWlmIChzdGF0dXMgPiAwKQl7Ci0JCURCR184NzIzQSgiYXNzb2MgcmVqZWN0LCBzdGF0dXMgY29kZTogJWRcbiIsIHN0YXR1cyk7Ci0JCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOwotCQlyZXMgPSAtNDsKLQkJZ290byByZXBvcnRfYXNzb2NfcmVzdWx0OwotCX0KLQotCS8qIGdldCBjYXBhYmlsaXRpZXMgKi8KLQlwbWxtZWluZm8tPmNhcGFiaWxpdHkgPSBsZTE2X3RvX2NwdShwbWdtdC0+dS5hc3NvY19yZXNwLmNhcGFiX2luZm8pOwotCi0JLyogc2V0IHNsb3QgdGltZSAqLwotCXBtbG1laW5mby0+c2xvdFRpbWUgPSAocG1sbWVpbmZvLT5jYXBhYmlsaXR5ICYgQklUKDEwKSk/IDk6IDIwOwotCi0JLyogQUlEICovCi0JcmVzID0gcG1sbWVpbmZvLT5haWQgPSBsZTE2X3RvX2NwdShwbWdtdC0+dS5hc3NvY19yZXNwLmFpZCkgJiAweDNmZmY7Ci0KLQlwaWUgPSBwZnJhbWUgKyBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYXNzb2NfcmVzcC52YXJpYWJsZSk7Ci0JcGllbGVuID0gcGt0X2xlbiAtCi0JCW9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hc3NvY19yZXNwLnZhcmlhYmxlKTsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksCi0JCQkgICAgIHBtZ210LT51LmFzc29jX3Jlc3AudmFyaWFibGUsIHBpZWxlbik7Ci0JaWYgKHAgJiYgcFsxXSkKLQkJSFRfY2Fwc19oYW5kbGVyMjNhKHBhZGFwdGVyLCBwKTsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX09QRVJBVElPTiwKLQkJCSAgICAgcG1nbXQtPnUuYXNzb2NfcmVzcC52YXJpYWJsZSwgcGllbGVuKTsKLQlpZiAocCAmJiBwWzFdKQotCQlIVF9pbmZvX2hhbmRsZXIyM2EocGFkYXB0ZXIsIHApOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfRVJQX0lORk8sCi0JCQkgICAgIHBtZ210LT51LmFzc29jX3Jlc3AudmFyaWFibGUsIHBpZWxlbik7Ci0JaWYgKHAgJiYgcFsxXSkKLQkJRVJQX0lFX2hhbmRsZXIyM2EocGFkYXB0ZXIsIHApOwotCi0JcGllID0gcGZyYW1lICsgb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFzc29jX3Jlc3AudmFyaWFibGUpOwotCXdoaWxlICh0cnVlKSB7Ci0JCXAgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJCSAgICBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XTU0sCi0JCQkJCSAgICBwaWUsIHBmcmFtZSArIHBrdF9sZW4gLSBwaWUpOwotCQlpZiAoIXApCi0JCQlicmVhazsKLQotCQlwaWUgPSBwICsgcFsxXSArIDI7Ci0JCS8qIGlmIHRoaXMgSUUgaXMgdG9vIHNob3J0LCB0cnkgdGhlIG5leHQgKi8KLQkJaWYgKHBbMV0gPD0gNCkKLQkJCWNvbnRpbnVlOwotCQkvKiBpZiB0aGlzIElFIGlzIFdNTSBwYXJhbXMsIHdlIGZvdW5kIHdoYXQgd2Ugd2FudGVkICovCi0JCWlmIChwWzZdID09IDEpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAocCAmJiBwWzFdKQotCQlXTU1fcGFyYW1faGFuZGxlcjIzYShwYWRhcHRlciwgcCk7Ci0KLQlwbWxtZWluZm8tPnN0YXRlICY9IH5XSUZJX0ZXX0FTU09DX1NUQVRFOwotCXBtbG1laW5mby0+c3RhdGUgfD0gV0lGSV9GV19BU1NPQ19TVUNDRVNTOwotCi0JLyogVXBkYXRlIEJhc2ljIFJhdGUgVGFibGUgZm9yIHNwZWMsIDIwMTAtMTItMjggLCBieSB0aG9tYXMgKi8KLQlVcGRhdGVCcmF0ZVRibDIzYShwYWRhcHRlciwgcG1sbWVpbmZvLT5uZXR3b3JrLlN1cHBvcnRlZFJhdGVzKTsKLQotcmVwb3J0X2Fzc29jX3Jlc3VsdDoKLQlwbWxtZXByaXYtPmFzc29jX3JzcF9sZW4gPSAwOwotCWlmIChyZXMgPiAwKSB7Ci0JCWtmcmVlKHBtbG1lcHJpdi0+YXNzb2NfcnNwKTsKLQkJcG1sbWVwcml2LT5hc3NvY19yc3AgPSBrbWFsbG9jKHBrdF9sZW4sIEdGUF9BVE9NSUMpOwotCQlpZiAocG1sbWVwcml2LT5hc3NvY19yc3ApIHsKLQkJCW1lbWNweShwbWxtZXByaXYtPmFzc29jX3JzcCwgcGZyYW1lLCBwa3RfbGVuKTsKLQkJCXBtbG1lcHJpdi0+YXNzb2NfcnNwX2xlbiA9IHBrdF9sZW47Ci0JCX0KLQl9IGVsc2UKLQkJa2ZyZWUocG1sbWVwcml2LT5hc3NvY19yc3ApOwotCi0JcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCByZXMpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1PbkRlQXV0aDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JdW5zaWduZWQgc2hvcnQgcmVhc29uOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQotCWlmICghZXRoZXJfYWRkcl9lcXVhbChtZ210LT5ic3NpZCwKLQkJCSAgICAgIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSkpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCXJlYXNvbiA9IGxlMTZfdG9fY3B1KG1nbXQtPnUuZGVhdXRoLnJlYXNvbl9jb2RlKTsKLQotCURCR184NzIzQSgiJXMgUmVhc29uIGNvZGUoJWQpXG4iLCBfX2Z1bmNfXywgcmVhc29uKTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJhcCByZWN2IGRlYXV0aCByZWFzb24gY29kZSglZCkgIgotCQkJCSJzdGE6JXBNXG4iLCByZWFzb24sIG1nbXQtPnNhKTsKLQotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBtZ210LT5zYSk7Ci0JCWlmIChwc3RhKSB7Ci0JCQl1OCB1cGRhdGVkID0gMDsKLQotCQkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCQkJaWYgKCFsaXN0X2VtcHR5KCZwc3RhLT5hc29jX2xpc3QpKSB7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmcHN0YS0+YXNvY19saXN0KTsKLQkJCQlwc3RhcHJpdi0+YXNvY19saXN0X2NudC0tOwotCQkJCXVwZGF0ZWQgPSBhcF9mcmVlX3N0YTIzYShwYWRhcHRlciwgcHN0YSwKLQkJCQkJCSAgICAgIGZhbHNlLCByZWFzb24pOwotCQkJfQotCQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0KLQkJCWFzc29jaWF0ZWRfY2xpZW50c191cGRhdGUyM2EocGFkYXB0ZXIsIHVwZGF0ZWQpOwotCQl9Ci0KLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0gZWxzZQotI2VuZGlmCi0JewotCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLCAic3RhIHJlY3YgZGVhdXRoIHJlYXNvbiBjb2RlKCVkKSAiCi0JCQkJInN0YTolcE1cbiIsIHJlYXNvbiwgbWdtdC0+YnNzaWQpOwotCi0JCXJlY2VpdmVfZGlzY29ubmVjdDIzYShwYWRhcHRlciwgbWdtdC0+YnNzaWQsIHJlYXNvbik7Ci0JfQotCXBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID0gZmFsc2U7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uRGlzYXNzb2MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXVuc2lnbmVkIHNob3J0IHJlYXNvbjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7Ci0KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobWdtdC0+YnNzaWQsCi0JCQkgICAgICBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yaykpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlyZWFzb24gPSBsZTE2X3RvX2NwdShtZ210LT51LmRpc2Fzc29jLnJlYXNvbl9jb2RlKTsKLQotCURCR184NzIzQSgiJXMgUmVhc29uIGNvZGUoJWQpXG4iLCBfX2Z1bmNfXywgcmVhc29uKTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJhcCByZWN2IGRpc2Fzc29jIHJlYXNvbiBjb2RlKCVkKSIKLQkJCQkiIHN0YTolcE1cbiIsIHJlYXNvbiwgbWdtdC0+c2EpOwotCi0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIG1nbXQtPnNhKTsKLQkJaWYgKHBzdGEpIHsKLQkJCXU4IHVwZGF0ZWQgPSAwOwotCi0JCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JCQlpZiAoIWxpc3RfZW1wdHkoJnBzdGEtPmFzb2NfbGlzdCkpIHsKLQkJCQlsaXN0X2RlbF9pbml0KCZwc3RhLT5hc29jX2xpc3QpOwotCQkJCXBzdGFwcml2LT5hc29jX2xpc3RfY250LS07Ci0JCQkJdXBkYXRlZCA9IGFwX2ZyZWVfc3RhMjNhKHBhZGFwdGVyLCBwc3RhLAotCQkJCQkJCSBmYWxzZSwgcmVhc29uKTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCi0JCQlhc3NvY2lhdGVkX2NsaWVudHNfdXBkYXRlMjNhKHBhZGFwdGVyLCB1cGRhdGVkKTsKLQkJfQotCi0JCXJldHVybiBfU1VDQ0VTUzsKLQl9IGVsc2UKLSNlbmRpZgotCXsKLQkJREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywgImFwIHJlY3YgZGlzYXNzb2MgcmVhc29uICIKLQkJCQkiY29kZSglZCkgc3RhOiVwTVxuIiwgcmVhc29uLCBtZ210LT5ic3NpZCk7Ci0KLQkJcmVjZWl2ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyLCBtZ210LT5ic3NpZCwgcmVhc29uKTsKLQl9Ci0JcG1sbWVwcml2LT5MaW5rRGV0ZWN0SW5mby5iQnVzeVRyYWZmaWMgPSBmYWxzZTsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uQXRpbTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotb25fYWN0aW9uX3NwY3QyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXJldHVybiBfRkFJTDsKLX0KLQotc3RhdGljIGludAotT25BY3Rpb24yM2FfcW9zKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uQWN0aW9uMjNhX2RscyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IE9uQWN0aW9uMjNhX2JhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JdTggKmFkZHI7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci0JdW5zaWduZWQgY2hhciBjYXRlZ29yeSwgYWN0aW9uOwotCXVuc2lnbmVkIHNob3J0IHRpZCwgc3RhdHVzLCBjYXBhYiwgcGFyYW1zLCByZWFzb25fY29kZSA9IDA7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JLyogY2hlY2sgUkEgbWF0Y2hlcyBvciBub3QgKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBtZ210LT5kYSkpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSAhPSBNU1JfQVApCi0JCWlmICghKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MpKQotCQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JYWRkciA9IG1nbXQtPnNhOwotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGFkZHIpOwotCi0JaWYgKCFwc3RhKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQljYXRlZ29yeSA9IG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5OwotCWlmIChjYXRlZ29yeSA9PSBXTEFOX0NBVEVHT1JZX0JBQ0spIHsgLyogIHJlcHJlc2VudGluZyBCbG9jayBBY2sgKi8KLQkJaWYgKCFwbWxtZWluZm8tPkhUX2VuYWJsZSkKLQkJCXJldHVybiBfU1VDQ0VTUzsKLQkJLyogYWN0aW9uX2NvZGUgaXMgbG9jYXRlZCBpbiB0aGUgc2FtZSBwbGFjZSBmb3IgYWxsCi0JCSAgIGFjdGlvbiBldmVudHMsIHNvIHBpY2sgYW55ICovCi0JCWFjdGlvbiA9IG1nbXQtPnUuYWN0aW9uLnUud21lX2FjdGlvbi5hY3Rpb25fY29kZTsKLQkJREJHXzg3MjNBKCIlcywgYWN0aW9uID0lZFxuIiwgX19mdW5jX18sIGFjdGlvbik7Ci0JCXN3aXRjaCAoYWN0aW9uKSB7Ci0JCWNhc2UgV0xBTl9BQ1RJT05fQUREQkFfUkVROiAvKiBBRERCQSByZXF1ZXN0ICovCi0JCQltZW1jcHkoJnBtbG1laW5mby0+QUREQkFfcmVxLAotCQkJICAgICAgICZtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5kaWFsb2dfdG9rZW4sCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBBRERCQV9yZXF1ZXN0KSk7Ci0JCQlwcm9jZXNzX2FkZGJhX3JlcTIzYShwYWRhcHRlciwKLQkJCQkJICAgICAodTggKikmcG1sbWVpbmZvLT5BRERCQV9yZXEsIGFkZHIpOwotCQkJaWYgKHBtbG1laW5mby0+YkFjY2VwdEFkZGJhUmVxID09IHRydWUpCi0JCQkJaXNzdWVfYWN0aW9uX0JBMjNhKHBhZGFwdGVyLCBhZGRyLAotCQkJCQkJICAgV0xBTl9BQ1RJT05fQUREQkFfUkVTUCwgMCk7Ci0JCQllbHNlIHsKLQkJCQkvKiByZWplY3QgQUREQkEgUmVxICovCi0JCQkJaXNzdWVfYWN0aW9uX0JBMjNhKHBhZGFwdGVyLCBhZGRyLAotCQkJCQkJICAgV0xBTl9BQ1RJT05fQUREQkFfUkVTUCwgMzcpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9BQ1RJT05fQUREQkFfUkVTUDogLyogQUREQkEgcmVzcG9uc2UgKi8KLQkJCXN0YXR1cyA9IGdldF91bmFsaWduZWRfbGUxNigKLQkJCQkmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLnN0YXR1cyk7Ci0JCQljYXBhYiA9IGdldF91bmFsaWduZWRfbGUxNigKLQkJCQkmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmNhcGFiKTsKLQkJCXRpZCA9IChjYXBhYiAmIElFRUU4MDIxMV9BRERCQV9QQVJBTV9USURfTUFTSykgPj4gMjsKLQkJCWlmIChzdGF0dXMgPT0gMCkgewkvKiBzdWNjZXNzZnVsICovCi0JCQkJREJHXzg3MjNBKCJhZ2dfZW5hYmxlIGZvciBUSUQgPSVkXG4iLCB0aWQpOwotCQkJCXBzdGEtPmh0cHJpdi5hZ2dfZW5hYmxlX2JpdG1hcCB8PSBCSVQodGlkKTsKLQkJCQlwc3RhLT5odHByaXYuY2FuZGlkYXRlX3RpZF9iaXRtYXAgJj0gfkJJVCh0aWQpOwotCQkJfSBlbHNlCi0JCQkJcHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwICY9IH5CSVQodGlkKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9BQ1RJT05fREVMQkE6IC8qIERFTEJBICovCi0JCQlwYXJhbXMgPSBnZXRfdW5hbGlnbmVkX2xlMTYoCi0JCQkJJm1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucGFyYW1zKTsKLQkJCXRpZCA9IHBhcmFtcyA+PiAxMjsKLQotCQkJaWYgKHBhcmFtcyAmIElFRUU4MDIxMV9ERUxCQV9QQVJBTV9JTklUSUFUT1JfTUFTSykgewotCQkJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFt0aWRdOwotCQkJCXByZW9yZGVyX2N0cmwtPmVuYWJsZSA9IGZhbHNlOwotCQkJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IDB4ZmZmZjsKLQkJCX0gZWxzZSB7Ci0JCQkJcHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwICY9IH5CSVQodGlkKTsKLQkJCQlwc3RhLT5odHByaXYuY2FuZGlkYXRlX3RpZF9iaXRtYXAgJj0gfkJJVCh0aWQpOwotCQkJfQotCQkJcmVhc29uX2NvZGUgPSBnZXRfdW5hbGlnbmVkX2xlMTYoCi0JCQkJJm1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucmVhc29uX2NvZGUpOwotCQkJLyogdG9kbzogaG93IHRvIG5vdGlmeSB0aGUgaG9zdCB3aGlsZSByZWNlaXZpbmcKLQkJCSAgIERFTEVURSBCQSAqLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgb25fYWN0aW9uX3B1YmxpYzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQl1OCAqcGZyYW1lID0gc2tiLT5kYXRhOwotCWludCBmcmVxLCBjaGFubmVsOwotCi0JLyogY2hlY2sgUkEgbWF0Y2hlcyBvciBub3QgKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBoZHItPmFkZHIxKSkKLQkJcmV0dXJuIF9GQUlMOwotCi0JY2hhbm5lbCA9IHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlcik7Ci0KLQlpZiAoY2hhbm5lbCA8PSBSVFdfQ0hfTUFYXzJHX0NIQU5ORUwpCi0JCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbm5lbCwKLQkJCQkJCSAgICAgIE5MODAyMTFfQkFORF8yR0haKTsKLQllbHNlCi0JCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbm5lbCwKLQkJCQkJCSAgICAgIE5MODAyMTFfQkFORF81R0haKTsKLQotCWlmIChjZmc4MDIxMV9yeF9tZ210KHBhZGFwdGVyLT5ydHdfd2RldiwgZnJlcSwgMCwgcGZyYW1lLAotCQkJICAgICBza2ItPmxlbiwgMCkpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCXJldHVybiBfRkFJTDsKLX0KLQotc3RhdGljIGludAotT25BY3Rpb24yM2FfaHQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludAotT25BY3Rpb24yM2Ffd21tKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQKLU9uQWN0aW9uMjNhX3AycChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1PbkFjdGlvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JaW50IGk7Ci0JdTggY2F0ZWdvcnk7Ci0Jc3RydWN0IGFjdGlvbl9oYW5kbGVyICpwdGFibGU7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2ItPmRhdGE7Ci0KLQljYXRlZ29yeSA9IG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5OwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoT25BY3Rpb24yM2FfdGJsKTsgaSsrKSB7Ci0JCXB0YWJsZSA9ICZPbkFjdGlvbjIzYV90YmxbaV07Ci0KLQkJaWYgKGNhdGVnb3J5ID09IHB0YWJsZS0+bnVtKQotCQkJcHRhYmxlLT5mdW5jKHBhZGFwdGVyLCBwcmVjdl9mcmFtZSk7Ci0JfQotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IERvUmVzZXJ2ZWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdHJ1Y3QgeG1pdF9mcmFtZSAqYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdikKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmOwotCi0JcG1nbnRmcmFtZSA9IHJ0d19hbGxvY194bWl0ZnJhbWUyM2FfZXh0KHB4bWl0cHJpdik7Ci0KLQlpZiAoIXBtZ250ZnJhbWUpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IGFsbG9jIHhtaXRmcmFtZSBmYWlsXG4iLCBfX2Z1bmNfXywKLQkJCSAgcHhtaXRwcml2LT5hZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJZ290byBleGl0OwotCX0KLQotCXB4bWl0YnVmID0gcnR3X2FsbG9jX3htaXRidWYyM2FfZXh0KHB4bWl0cHJpdik7Ci0JaWYgKCFweG1pdGJ1ZikgewotCQlEQkdfODcyM0EoIiVzKCVzKTogYWxsb2MgeG1pdGJ1ZiBmYWlsXG4iLCBfX2Z1bmNfXywKLQkJCSAgcHhtaXRwcml2LT5hZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKHB4bWl0cHJpdiwgcG1nbnRmcmFtZSk7Ci0JCXBtZ250ZnJhbWUgPSBOVUxMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcG1nbnRmcmFtZS0+ZnJhbWVfdGFnID0gTUdOVF9GUkFNRVRBRzsKLQlwbWdudGZyYW1lLT5weG1pdGJ1ZiA9IHB4bWl0YnVmOwotCXBtZ250ZnJhbWUtPmJ1Zl9hZGRyID0gcHhtaXRidWYtPnBidWY7Ci0JcHhtaXRidWYtPnByaXZfZGF0YSA9IHBtZ250ZnJhbWU7Ci0KLWV4aXQ6Ci0JcmV0dXJuIHBtZ250ZnJhbWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUZvbGxvd2luZyBhcmUgc29tZSBUWCBmdW5jdGlvbnMgZm9yIFdpRmkgTUxNRQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCB1cGRhdGVfbWdudF90eF9yYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHJhdGUpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCXBtbG1lZXh0LT50eF9yYXRlID0gcmF0ZTsKLQlEQkdfODcyM0EoIiVzKCk6IHJhdGUgPSAleFxuIiwgX19mdW5jX18sIHJhdGUpOwotfQotCi12b2lkIHVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCW1lbXNldCgodTggKilwYXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IHBrdF9hdHRyaWIpKTsKLQotCXBhdHRyaWItPmhkcmxlbiA9IDI0OwotCXBhdHRyaWItPm5yX2ZyYWdzID0gMTsKLQlwYXR0cmliLT5wcmlvcml0eSA9IDc7Ci0JcGF0dHJpYi0+bWFjX2lkID0gMDsKLQlwYXR0cmliLT5xc2VsID0gMHgxMjsKLQotCXBhdHRyaWItPnBrdGxlbiA9IDA7Ci0KLQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFCKQotCQlwYXR0cmliLT5yYWlkID0gNjsvKiBiIG1vZGUgKi8KLQllbHNlCi0JCXBhdHRyaWItPnJhaWQgPSA1Oy8qIGEvZyBtb2RlICovCi0KLQlwYXR0cmliLT5lbmNyeXB0ID0gMDsKLQlwYXR0cmliLT5ic3dlbmMgPSBmYWxzZTsKLQotCXBhdHRyaWItPnFvc19lbiA9IGZhbHNlOwotCXBhdHRyaWItPmh0X2VuID0gZmFsc2U7Ci0JcGF0dHJpYi0+Yndtb2RlID0gSFRfQ0hBTk5FTF9XSURUSF8yMDsKLQlwYXR0cmliLT5jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCXBhdHRyaWItPnNnaSA9IGZhbHNlOwotCi0JcGF0dHJpYi0+c2VxbnVtID0gcG1sbWVleHQtPm1nbnRfc2VxOwotCi0JcGF0dHJpYi0+cmV0cnlfY3RybCA9IHRydWU7Ci19Ci0KLXZvaWQgZHVtcF9tZ250ZnJhbWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKQotewotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlIHx8Ci0JICAgIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSB0cnVlKQotCQlyZXR1cm47Ci0KLQlydGw4NzIzYXVfbWdudF94bWl0KHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLX0KLQotaW50IGR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUsIGludCB0aW1lb3V0X21zKQotewotCWludCByZXQgPSBfRkFJTDsKLQl1bnNpZ25lZCBsb25nIGlycUw7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmID0gcG1nbnRmcmFtZS0+cHhtaXRidWY7Ci0Jc3RydWN0IHN1Ym1pdF9jdHggc2N0eDsKLQotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlIHx8Ci0JICAgIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSB0cnVlKQotCQlyZXR1cm4gcmV0OwotCi0JcnR3X3NjdHhfaW5pdDIzYSgmc2N0eCwgdGltZW91dF9tcyk7Ci0JcHhtaXRidWYtPnNjdHggPSAmc2N0eDsKLQotCXJldCA9IHJ0bDg3MjNhdV9tZ250X3htaXQocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCi0JaWYgKHJldCA9PSBfU1VDQ0VTUykKLQkJcmV0ID0gcnR3X3NjdHhfd2FpdDIzYSgmc2N0eCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHhtaXRwcml2LT5sb2NrX3NjdHgsIGlycUwpOwotCXB4bWl0YnVmLT5zY3R4ID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZweG1pdHByaXYtPmxvY2tfc2N0eCwgaXJxTCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgZHVtcF9tZ250ZnJhbWUyM2FfYW5kX3dhaXRfYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUpCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXUzMiB0aW1lb3V0X21zID0gNTAwOy8qICAgNTAwbXMgKi8KLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCi0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUgfHwKLQkgICAgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID09IHRydWUpCi0JCXJldHVybiBfRkFJTDsKLQotCW11dGV4X2xvY2soJnB4bWl0cHJpdi0+YWNrX3R4X211dGV4KTsKLQlweG1pdHByaXYtPmFja190eCA9IHRydWU7Ci0KLQlwbWdudGZyYW1lLT5hY2tfcmVwb3J0ID0gMTsKLQlpZiAocnRsODcyM2F1X21nbnRfeG1pdChwYWRhcHRlciwgcG1nbnRmcmFtZSkgPT0gX1NVQ0NFU1MpCi0JCXJldCA9IHJ0d19hY2tfdHhfd2FpdDIzYShweG1pdHByaXYsIHRpbWVvdXRfbXMpOwotCi0JcHhtaXRwcml2LT5hY2tfdHggPSBmYWxzZTsKLQltdXRleF91bmxvY2soJnB4bWl0cHJpdi0+YWNrX3R4X211dGV4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdXBkYXRlX2hpZGRlbl9zc2lkKHU4ICppZXMsIHUzMiBpZXNfbGVuLCB1OCBoaWRkZW5fc3NpZF9tb2RlKQotewotCXU4ICpzc2lkX2llOwotCWludCBzc2lkX2xlbl9vcmk7Ci0JaW50IGxlbl9kaWZmID0gMDsKLQl1OCAqbmV4dF9pZTsKLQl1MzIgcmVtYWluX2xlbjsKLQotCXNzaWRfaWUgPSBydHdfZ2V0X2llMjNhKGllcywgIFdMQU5fRUlEX1NTSUQsICZzc2lkX2xlbl9vcmksIGllc19sZW4pOwotCi0JLyogREJHXzg3MjNBKCIlcyBoaWRkZW5fc3NpZF9tb2RlOiV1LCBzc2lkX2llOiVwLCBzc2lkX2xlbl9vcmk6JWRcbiIsCi0JICAgX19mdW5jX18sIGhpZGRlbl9zc2lkX21vZGUsIHNzaWRfaWUsIHNzaWRfbGVuX29yaSk7ICovCi0KLQlpZiAoc3NpZF9pZSAmJiBzc2lkX2xlbl9vcmkgPiAwKSB7Ci0JCXN3aXRjaCAoaGlkZGVuX3NzaWRfbW9kZSkgewotCQljYXNlIDE6Ci0JCQluZXh0X2llID0gc3NpZF9pZSArIDIgKyBzc2lkX2xlbl9vcmk7Ci0JCQlyZW1haW5fbGVuID0gaWVzX2xlbiAtKG5leHRfaWUtaWVzKTsKLQotCQkJc3NpZF9pZVsxXSA9IDA7Ci0JCQltZW1jcHkoc3NpZF9pZSsyLCBuZXh0X2llLCByZW1haW5fbGVuKTsKLQkJCWxlbl9kaWZmIC09IHNzaWRfbGVuX29yaTsKLQotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCW1lbXNldCgmc3NpZF9pZVsyXSwgMCwgc3NpZF9sZW5fb3JpKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbGVuX2RpZmY7Ci19Ci0KLXZvaWQgaXNzdWVfYmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGludCB0aW1lb3V0X21zKQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdW5zaWduZWQgaW50IHJhdGVfbGVuOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JdTggYmNfYWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCWNvbnN0IHU4ICp3cHNfaWU7Ci0JdTggc3IgPSAwOwotCWludCBsZW5fZGlmZjsKLQotCS8qIERCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsgKi8KLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpIHsKLQkJREJHXzg3MjNBKCIlcywgYWxsb2MgbWdudCBmcmFtZSBmYWlsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmJjbl91cGRhdGVfbG9jayk7Ci0jZW5kaWYKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0JcGF0dHJpYi0+cXNlbCA9IDB4MTA7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXBmcmFtZTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOwotCW1nbXQtPnNlcV9jdHJsID0gMDsKLQotCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgYmNfYWRkcik7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5ic3NpZCwgZ2V0X215X2Jzc2lkMjNhKGN1cl9uZXR3b3JrKSk7Ci0KLQkvKiB0aW1lc3RhbXAgd2lsbCBiZSBpbnNlcnRlZCBieSBoYXJkd2FyZSAqLwotCi0JcHV0X3VuYWxpZ25lZF9sZTE2KGN1cl9uZXR3b3JrLT5iZWFjb25faW50ZXJ2YWwsCi0JCQkgICAmbWdtdC0+dS5iZWFjb24uYmVhY29uX2ludCk7Ci0KLQlwdXRfdW5hbGlnbmVkX2xlMTYoY3VyX25ldHdvcmstPmNhcGFiaWxpdHksCi0JCQkgICAmbWdtdC0+dS5iZWFjb24uY2FwYWJfaW5mbyk7Ci0KLQlwZnJhbWUgPSBtZ210LT51LmJlYWNvbi52YXJpYWJsZTsKLQlwYXR0cmliLT5wa3RsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BUCkgewotCQl1OCAqaWVidWY7Ci0JCWludCBidWZsZW47Ci0JCS8qIERCR184NzIzQSgiaWUgbGVuID0lZFxuIiwgY3VyX25ldHdvcmstPklFTGVuZ3RoKTsgKi8KLQkJbWVtY3B5KHBmcmFtZSwgY3VyX25ldHdvcmstPklFcywgY3VyX25ldHdvcmstPklFTGVuZ3RoKTsKLQkJbGVuX2RpZmYgPSB1cGRhdGVfaGlkZGVuX3NzaWQocGZyYW1lLCBjdXJfbmV0d29yay0+SUVMZW5ndGgsCi0JCQkJCSAgICAgIHBtbG1laW5mby0+aGlkZGVuX3NzaWRfbW9kZSk7Ci0JCXBmcmFtZSArPSAoY3VyX25ldHdvcmstPklFTGVuZ3RoK2xlbl9kaWZmKTsKLQkJcGF0dHJpYi0+cGt0bGVuICs9IChjdXJfbmV0d29yay0+SUVMZW5ndGgrbGVuX2RpZmYpOwotCi0JCWllYnVmID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGU7Ci0JCWJ1ZmxlbiA9IHBhdHRyaWItPnBrdGxlbiAtCi0JCQlvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQkJd3BzX2llID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCQkJIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQUywKLQkJCQkJCSBpZWJ1ZiwgYnVmbGVuKTsKLQotCQlpZiAod3BzX2llICYmIHdwc19pZVsxXSA+IDApIHsKLQkJCXJ0d19nZXRfd3BzX2F0dHJfY29udGVudDIzYSh3cHNfaWUsIHdwc19pZVsxXSwKLQkJCQkJCSAgICBXUFNfQVRUUl9TRUxFQ1RFRF9SRUdJU1RSQVIsCi0JCQkJCQkgICAgKHU4ICopJnNyKTsKLQkJfQotCQlpZiAoc3IgIT0gMCkKLQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCQllbHNlCi0JCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCi0JCWdvdG8gX2lzc3VlX2JjbjsKLQl9Ci0KLQkvKiAgU1NJRCAqLwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TU0lELAotCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuLAotCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWQsICZwYXR0cmliLT5wa3RsZW4pOwotCi0JLyogIHN1cHBvcnRlZCByYXRlcy4uLiAqLwotCXJhdGVfbGVuID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TVVBQX1JBVEVTLAotCQkJICAgICAgICgocmF0ZV9sZW4gPiA4KT8gODogcmF0ZV9sZW4pLAotCQkJICAgICAgIGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkvKiAgRFMgcGFyYW1ldGVyIHNldCAqLwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9EU19QQVJBTVMsIDEsICh1bnNpZ25lZCBjaGFyICopCi0JCQkgICAgICAgJmN1cl9uZXR3b3JrLT5EU0NvbmZpZywgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkvKiBpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0FESE9DKSAqLwotCXsKLQkJdTggZXJwaW5mbyA9IDA7Ci0JCXUzMiBBVElNV2luZG93OwotCQkvKiAgSUJTUyBQYXJhbWV0ZXIgU2V0Li4uICovCi0JCS8qIEFUSU1XaW5kb3cgPSBjdXItPkFUSU1XaW5kb3c7ICovCi0JCUFUSU1XaW5kb3cgPSAwOwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfSUJTU19QQVJBTVMsIDIsCi0JCQkJICAgICAgICh1bnNpZ25lZCBjaGFyICopJkFUSU1XaW5kb3csCi0JCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCi0JCS8qIEVSUCBJRSAqLwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRVJQX0lORk8sIDEsCi0JCQkJICAgICAgICZlcnBpbmZvLCAmcGF0dHJpYi0+cGt0bGVuKTsKLQl9Ci0KLQkvKiAgRVhURVJOREVEIFNVUFBPUlRFRCBSQVRFICovCi0JaWYgKHJhdGVfbGVuID4gOCkKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLAotCQkJCSAgICAgICByYXRlX2xlbiAtIDgsCi0JCQkJICAgICAgIGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyArIDgsCi0JCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCi0JLyogdG9kbzpIVCBmb3IgYWRob2MgKi8KLQotX2lzc3VlX2JjbjoKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXBtbG1lcHJpdi0+dXBkYXRlX2JjbiA9IGZhbHNlOwotCi0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+YmNuX3VwZGF0ZV9sb2NrKTsKLSNlbmRpZgotCi0JaWYgKChwYXR0cmliLT5wa3RsZW4gKyBUWERFU0NfU0laRSkgPiA1MTIpIHsKLQkJREJHXzg3MjNBKCJiZWFjb24gZnJhbWUgdG9vIGxhcmdlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCS8qIERCR184NzIzQSgiaXNzdWUgYmNuX3N6ID0lZFxuIiwgcGF0dHJpYi0+bGFzdF90eGNtZHN6KTsgKi8KLQlpZiAodGltZW91dF9tcyA+IDApCi0JCWR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0KHBhZGFwdGVyLCBwbWdudGZyYW1lLCB0aW1lb3V0X21zKTsKLQllbHNlCi0JCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLX0KLQotc3RhdGljIHZvaWQgaXNzdWVfcHJvYmVyc3Aoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEpCi17Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7Ci0JdW5zaWduZWQgY2hhciAqcGZyYW1lOwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKLQl1bnNpZ25lZCBjaGFyICptYWMsICpic3NpZDsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCWNvbnN0IHU4ICpwd3BzX2llOwotCXU4ICpzc2lkX2llOwotCWludCBzc2lkX2llbGVuOwotCWludCBzc2lkX2llbGVuX2RpZmY7Ci0JdTggYnVmW01BWF9JRV9TWl07Ci0jZW5kaWYKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JdW5zaWduZWQgaW50IHJhdGVfbGVuOwotCi0JLyogREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOyAqLwotCi0JaWYgKGN1cl9uZXR3b3JrLT5JRUxlbmd0aCA+IE1BWF9JRV9TWikKLQkJcmV0dXJuOwotCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmICghcG1nbnRmcmFtZSkgewotCQlEQkdfODcyM0EoIiVzLCBhbGxvYyBtZ250IGZyYW1lIGZhaWxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQlwZnJhbWUgPSAodTggKilwbWdudGZyYW1lLT5idWZfYWRkciArIFRYREVTQ19PRkZTRVQ7Ci0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilwZnJhbWU7Ci0KLQltYWMgPSBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdik7Ci0JYnNzaWQgPSBjdXJfbmV0d29yay0+TWFjQWRkcmVzczsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKTsKLQotCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgZGEpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5zYSwgbWFjKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+YnNzaWQsIGJzc2lkKTsKLQotCW1nbXQtPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0KLQkvKiB0aW1lc3RhbXAgd2lsbCBiZSBpbnNlcnRlZCBieSBoYXJkd2FyZSAqLwotCXB1dF91bmFsaWduZWRfbGUxNihjdXJfbmV0d29yay0+YmVhY29uX2ludGVydmFsLAotCQkJICAgJm1nbXQtPnUucHJvYmVfcmVzcC5iZWFjb25faW50KTsKLQotCXB1dF91bmFsaWduZWRfbGUxNihjdXJfbmV0d29yay0+Y2FwYWJpbGl0eSwKLQkJCSAgICZtZ210LT51LnByb2JlX3Jlc3AuY2FwYWJfaW5mbyk7Ci0KLQlwZnJhbWUgPSBtZ210LT51LnByb2JlX3Jlc3AudmFyaWFibGU7Ci0JcGF0dHJpYi0+cGt0bGVuID0KLQkJb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LnByb2JlX3Jlc3AudmFyaWFibGUpOwotCi0JLyogYmVsb3cgZm9yIGFkLWhvYyBtb2RlICovCi0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlpZiAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQVApIHsKLQkJcHdwc19pZSA9IGNmZzgwMjExX2ZpbmRfdmVuZG9yX2llKFdMQU5fT1VJX01JQ1JPU09GVCwKLQkJCQkJCSAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BTLAotCQkJCQkJICBjdXJfbmV0d29yay0+SUVzLAotCQkJCQkJICBjdXJfbmV0d29yay0+SUVMZW5ndGgpOwotCi0JCW1lbWNweShwZnJhbWUsIGN1cl9uZXR3b3JrLT5JRXMsIGN1cl9uZXR3b3JrLT5JRUxlbmd0aCk7Ci0JCXBmcmFtZSArPSBjdXJfbmV0d29yay0+SUVMZW5ndGg7Ci0JCXBhdHRyaWItPnBrdGxlbiArPSBjdXJfbmV0d29yay0+SUVMZW5ndGg7Ci0KLQkJLyogcmV0cmlldmUgU1NJRCBJRSBmcm9tIGN1cl9uZXR3b3JrLT5Tc2lkICovCi0KLQkJc3NpZF9pZSA9IHJ0d19nZXRfaWUyM2EobWdtdC0+dS5wcm9iZV9yZXNwLnZhcmlhYmxlLAotCQkJCQlXTEFOX0VJRF9TU0lELCAmc3NpZF9pZWxlbiwKLQkJCQkJcGZyYW1lIC0gbWdtdC0+dS5wcm9iZV9yZXNwLnZhcmlhYmxlKTsKLQotCQlzc2lkX2llbGVuX2RpZmYgPSBjdXJfbmV0d29yay0+U3NpZC5zc2lkX2xlbiAtIHNzaWRfaWVsZW47Ci0KLQkJaWYgKHNzaWRfaWUgJiYgY3VyX25ldHdvcmstPlNzaWQuc3NpZF9sZW4pIHsKLQkJCXVpbnQgcmVtYWluZGVyX2llbGVuOwotCQkJdTggKnJlbWFpbmRlcl9pZTsKLQotCQkJcmVtYWluZGVyX2llID0gc3NpZF9pZSArIDI7Ci0KLQkJCXJlbWFpbmRlcl9pZWxlbiA9IHBmcmFtZSAtIHJlbWFpbmRlcl9pZTsKLQotCQkJREJHXzg3MjNBX0xFVkVMKF9kcnZfd2FybmluZ18sICIlcyglcyk6ICIKLQkJCQkJInJlbWFpbmRlcl9pZWxlbiA+IE1BWF9JRV9TWlxuIiwKLQkJCQkJX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJCWlmIChyZW1haW5kZXJfaWVsZW4gPiBNQVhfSUVfU1opCi0JCQkJcmVtYWluZGVyX2llbGVuID0gTUFYX0lFX1NaOwotCi0JCQltZW1jcHkoYnVmLCByZW1haW5kZXJfaWUsIHJlbWFpbmRlcl9pZWxlbik7Ci0JCQltZW1jcHkocmVtYWluZGVyX2llICsgc3NpZF9pZWxlbl9kaWZmLCBidWYsCi0JCQkgICAgICAgcmVtYWluZGVyX2llbGVuKTsKLQkJCSooc3NpZF9pZSArIDEpID0gY3VyX25ldHdvcmstPlNzaWQuc3NpZF9sZW47Ci0JCQltZW1jcHkoc3NpZF9pZSArIDIsIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWQsCi0JCQkgICAgICAgY3VyX25ldHdvcmstPlNzaWQuc3NpZF9sZW4pOwotCi0JCQlwZnJhbWUgKz0gc3NpZF9pZWxlbl9kaWZmOwotCQkJcGF0dHJpYi0+cGt0bGVuICs9IHNzaWRfaWVsZW5fZGlmZjsKLQkJfQotCX0gZWxzZQotI2VuZGlmCi0JewotCQkvKiAgU1NJRCAqLwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfU1NJRCwKLQkJCQkgICAgICAgY3VyX25ldHdvcmstPlNzaWQuc3NpZF9sZW4sCi0JCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWQsCi0JCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCi0JCS8qICBzdXBwb3J0ZWQgcmF0ZXMuLi4gKi8KLQkJcmF0ZV9sZW4gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyk7Ci0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TVVBQX1JBVEVTLAotCQkJCSAgICAgICAoKHJhdGVfbGVuID4gOCk/IDg6IHJhdGVfbGVuKSwKLQkJCQkgICAgICAgY3VyX25ldHdvcmstPlN1cHBvcnRlZFJhdGVzLAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCQkvKiAgRFMgcGFyYW1ldGVyIHNldCAqLwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRFNfUEFSQU1TLCAxLAotCQkJCSAgICAgICAodW5zaWduZWQgY2hhciAqKSZjdXJfbmV0d29yay0+RFNDb25maWcsCi0JCQkJICAgICAgICZwYXR0cmliLT5wa3RsZW4pOwotCi0JCWlmICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BREhPQykgewotCQkJdTggZXJwaW5mbyA9IDA7Ci0JCQl1MzIgQVRJTVdpbmRvdzsKLQkJCS8qICBJQlNTIFBhcmFtZXRlciBTZXQuLi4gKi8KLQkJCS8qIEFUSU1XaW5kb3cgPSBjdXItPkFUSU1XaW5kb3c7ICovCi0JCQlBVElNV2luZG93ID0gMDsKLQkJCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9JQlNTX1BBUkFNUywgMiwKLQkJCQkJICAgICAgICh1bnNpZ25lZCBjaGFyICopJkFUSU1XaW5kb3csCi0JCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCQkJLyogRVJQIElFICovCi0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRVJQX0lORk8sIDEsCi0JCQkJCSAgICAgICAmZXJwaW5mbywgJnBhdHRyaWItPnBrdGxlbik7Ci0JCX0KLQotCQkvKiAgRVhURVJOREVEIFNVUFBPUlRFRCBSQVRFICovCi0JCWlmIChyYXRlX2xlbiA+IDgpCi0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsCi0JCQkJCSAgICAgICByYXRlX2xlbiAtIDgsCi0JCQkJCSAgICAgICBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMgKyA4LAotCQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkJLyogdG9kbzpIVCBmb3IgYWRob2MgKi8KLQl9Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0KLQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci19Ci0KLXN0YXRpYyBpbnQgX2lzc3VlX3Byb2JlcmVxKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3QgY2ZnODAyMTFfc3NpZCAqcHNzaWQsIHU4ICpkYSwgaW50IHdhaXRfYWNrKQotewotCWludCByZXQgPSBfRkFJTDsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwotCXVuc2lnbmVkIGNoYXIgKm1hYzsKLQl1bnNpZ25lZCBjaGFyIGJzc3JhdGVbTnVtUmF0ZXNdOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCWludCBic3NyYXRlX2xlbiA9IDA7Ci0JdTggYmNfYWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJICIrJXNcbiIsIF9fZnVuY19fKTsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKLQotCW1hYyA9IG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KTsKLQotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAotCQkJCQkgICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRKTsKLQotCWlmIChkYSkgewotCQkvKgl1bmljYXN0IHByb2JlIHJlcXVlc3QgZnJhbWUgKi8KLQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOwotCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBkYSk7Ci0JfSBlbHNlIHsKLQkJLyoJYnJvYWRjYXN0IHByb2JlIHJlcXVlc3QgZnJhbWUgKi8KLQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgYmNfYWRkcik7Ci0JCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIGJjX2FkZHIpOwotCX0KLQotCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG1hYyk7Ci0KLQlwd2xhbmhkci0+c2VxX2N0cmwgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfU05fVE9fU0VRKHBtbG1lZXh0LT5tZ250X3NlcSkpOwotCi0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQlwZnJhbWUgKz0gc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0KLQlpZiAocHNzaWQpCi0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TU0lELCBwc3NpZC0+c3NpZF9sZW4sCi0JCQkJICAgICAgIHBzc2lkLT5zc2lkLCAmcGF0dHJpYi0+cGt0bGVuKTsKLQllbHNlCi0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TU0lELCAwLCBOVUxMLAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCWdldF9yYXRlX3NldDIzYShwYWRhcHRlciwgYnNzcmF0ZSwgJmJzc3JhdGVfbGVuKTsKLQotCWlmIChic3NyYXRlX2xlbiA+IDgpIHsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsIDgsCi0JCQkJICAgICAgIGJzc3JhdGUsICZwYXR0cmliLT5wa3RsZW4pOwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsCi0JCQkJICAgICAgIChic3NyYXRlX2xlbiAtIDgpLCAoYnNzcmF0ZSArIDgpLAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQl9IGVsc2UgewotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfU1VQUF9SQVRFUywKLQkJCQkgICAgICAgYnNzcmF0ZV9sZW4sIGJzc3JhdGUsICZwYXR0cmliLT5wa3RsZW4pOwotCX0KLQotCS8qIGFkZCB3cHNfaWUgZm9yIHdwczIuMCAqLwotCWlmIChwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWVfbGVuPjAgJiYgcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llKSB7Ci0JCW1lbWNweShwZnJhbWUsIHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSwKLQkJICAgICAgIHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW4pOwotCQlwZnJhbWUgKz0gcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llX2xlbjsKLQkJcGF0dHJpYi0+cGt0bGVuICs9IHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW47Ci0JfQotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJICJpc3N1aW5nIHByb2JlX3JlcSwgdHhfbGVuID0lZFxuIiwgcGF0dHJpYi0+bGFzdF90eGNtZHN6KTsKLQotCWlmICh3YWl0X2FjaykgewotCQlyZXQgPSBkdW1wX21nbnRmcmFtZTIzYV9hbmRfd2FpdF9hY2syM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCX0gZWxzZSB7Ci0JCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpc3N1ZV9wcm9iZXJlcShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgc3RydWN0IGNmZzgwMjExX3NzaWQgKnBzc2lkLCB1OCAqZGEpCi17Ci0JX2lzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCBwc3NpZCwgZGEsIGZhbHNlKTsKLX0KLQotc3RhdGljIGludCBpc3N1ZV9wcm9iZXJlcV9leChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfc3NpZCAqcHNzaWQsIHU4ICpkYSwKLQkJCSAgICAgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKQotewotCWludCByZXQ7Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCi0JZG8gewotCQlyZXQgPSBfaXNzdWVfcHJvYmVyZXEocGFkYXB0ZXIsIHBzc2lkLCBkYSwKLQkJCQkgICAgICB3YWl0X21zID4gMCA/IHRydWUgOiBmYWxzZSk7Ci0KLQkJaSsrOwotCi0JCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCi0JCQlicmVhazsKLQotCQlpZiAoaSA8IHRyeV9jbnQgJiYgd2FpdF9tcyA+IDAgJiYgcmV0ID09IF9GQUlMKQotCQkJbXNsZWVwKHdhaXRfbXMpOwotCi0JfSB3aGlsZSgoaSA8IHRyeV9jbnQpICYmICgocmV0ID09IF9GQUlMKSB8fCAod2FpdF9tcyA9PSAwKSkpOwotCi0JaWYgKHJldCAhPSBfRkFJTCkgewotCQlyZXQgPSBfU1VDQ0VTUzsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICh0cnlfY250ICYmIHdhaXRfbXMpIHsKLQkJaWYgKGRhKQotCQkJREJHXzg3MjNBKCIlcyglcyk6IHRvICVwTSwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBkYSwgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUyA/ICIsIGFja2VkIiA6ICIiLCBpLCB0cnlfY250LAotCQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKLQkJZWxzZQotCQkJREJHXzg3MjNBKCIlcyglcyk6LCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKLQkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCQkgIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKLQkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7Ci0JfQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi0vKiAgaWYgcHN0YSA9PSBOVUxMLCBpbmRpYXRlIHdlIGFyZSBzdGF0aW9uKGNsaWVudCkgbm93Li4uICovCi1zdGF0aWMgdm9pZCBpc3N1ZV9hdXRoKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwKLQkJICAgICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1cykKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXVuc2lnbmVkIGludCB2YWwzMjsKLQl1MTYgYXV0aF9hbGdvOwotCWludCB1c2Vfc2hhcmVkX2tleSA9IDA7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmICghcG1nbnRmcmFtZSkKLQkJcmV0dXJuOwotCi0JLyogdXBkYXRlIGF0dHJpYnV0ZSAqLwotCXBhdHRyaWIgPSAmcG1nbnRmcmFtZS0+YXR0cmliOwotCXVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHBhZGFwdGVyLCBwYXR0cmliKTsKLQotCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopcGZyYW1lOwotCi0JbWdtdC0+ZnJhbWVfY29udHJvbCA9Ci0JCWNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwgSUVFRTgwMjExX1NUWVBFX0FVVEgpOwotCW1nbXQtPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCXBhdHRyaWItPnBrdGxlbiA9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hdXRoLnZhcmlhYmxlKTsKLQotCWlmIChwc3RhKSB7IC8qICBmb3IgQVAgbW9kZSAqLwotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCQl1bnNpZ25lZCBzaG9ydCB2YWwxNjsKLQotCQlldGhlcl9hZGRyX2NvcHkobWdtdC0+ZGEsIHBzdGEtPmh3YWRkcik7Ci0JCWV0aGVyX2FkZHJfY29weShtZ210LT5zYSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKLQkJZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmJzc2lkLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCi0JCS8qICBzZXR0aW5nIGF1dGggYWxnbyBudW1iZXIgKi8KLQkJdmFsMTYgPSAodTE2KXBzdGEtPmF1dGhhbGc7Ci0KLQkJaWYgKHN0YXR1cyAhPSBXTEFOX1NUQVRVU19TVUNDRVNTKQotCQkJdmFsMTYgPSAwOwotCi0JCWlmICh2YWwxNikKLQkJCXVzZV9zaGFyZWRfa2V5ID0gMTsKLQotCQltZ210LT51LmF1dGguYXV0aF9hbGcgPSBjcHVfdG9fbGUxNih2YWwxNik7Ci0KLQkJLyogIHNldHRpbmcgYXV0aCBzZXEgbnVtYmVyICovCi0JCW1nbXQtPnUuYXV0aC5hdXRoX3RyYW5zYWN0aW9uID0KLQkJCWNwdV90b19sZTE2KCh1MTYpcHN0YS0+YXV0aF9zZXEpOwotCi0JCS8qICBzZXR0aW5nIHN0YXR1cyBjb2RlLi4uICovCi0JCW1nbXQtPnUuYXV0aC5zdGF0dXNfY29kZSA9IGNwdV90b19sZTE2KHN0YXR1cyk7Ci0KLQkJcGZyYW1lID0gbWdtdC0+dS5hdXRoLnZhcmlhYmxlOwotCQkvKiAgYWRkZWQgY2hhbGxlbmdpbmcgdGV4dC4uLiAqLwotCQlpZiAoKHBzdGEtPmF1dGhfc2VxID09IDIpICYmCi0JCSAgICAocHN0YS0+c3RhdGUgJiBXSUZJX0ZXX0FVVEhfU1RBVEUpICYmICh1c2Vfc2hhcmVkX2tleSA9PSAxKSkKLQkJCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9DSEFMTEVOR0UsIDEyOCwKLQkJCQkJICAgICAgIHBzdGEtPmNoZ190eHQsICZwYXR0cmliLT5wa3RsZW4pOwotI2VuZGlmCi0JfSBlbHNlIHsKLQkJc3RydWN0IGllZWU4MDIxMV9tZ210ICppdl9tZ210OwotCi0JCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQkJZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCQlldGhlcl9hZGRyX2NvcHkobWdtdC0+YnNzaWQsCi0JCQkJZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCQkvKiAgc2V0dGluZyBhdXRoIGFsZ28gbnVtYmVyICovCi0JCS8qICAwOk9QRU4gU3lzdGVtLCAxOlNoYXJlZCBrZXkgKi8KLQkJaWYgKHBtbG1laW5mby0+YXV0aF9hbGdvID09IGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkKSB7Ci0JCQl1c2Vfc2hhcmVkX2tleSA9IDE7Ci0JCQlhdXRoX2FsZ28gPSBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKLQkJfSBlbHNlCi0JCQlhdXRoX2FsZ28gPSBXTEFOX0FVVEhfT1BFTjsKLQotCQkvKiBEQkdfODcyM0EoIiVzIGF1dGhfYWxnbyA9ICVzIGF1dGhfc2VxID0lZFxuIiwgX19mdW5jX18sCi0JCSAgIChwbWxtZWluZm8tPmF1dGhfYWxnbyA9PSAwKT8iT1BFTiI6IlNIQVJFRCIsCi0JCSAgIHBtbG1laW5mby0+YXV0aF9zZXEpOyAqLwotCi0JCS8qIHNldHRpbmcgSVYgZm9yIGF1dGggc2VxICMzICovCi0JCWlmICgocG1sbWVpbmZvLT5hdXRoX3NlcSA9PSAzKSAmJgotCQkgICAgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FVVEhfU1RBVEUpICYmCi0JCSAgICAodXNlX3NoYXJlZF9rZXkgPT0gMSkpIHsKLQkJCXUzMiAqcGl2ID0gKHUzMiAqKSZtZ210LT51LmF1dGg7Ci0KLQkJCWl2X21nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopKHBmcmFtZSArIDQpOwotCQkJLyogREJHXzg3MjNBKCI9PT4gaXYoJWQpLCBrZXlfaW5kZXgoJWQpXG4iLAotCQkJICAgcG1sbWVpbmZvLT5pdiwgcG1sbWVpbmZvLT5rZXlfaW5kZXgpOyAqLwotCQkJdmFsMzIgPSAocG1sbWVpbmZvLT5pdiAmIDB4M2ZmZmZmZmYpIHwKLQkJCQkocG1sbWVpbmZvLT5rZXlfaW5kZXggPDwgMzApOwotCQkJcG1sbWVpbmZvLT5pdisrOwotCQkJcHV0X3VuYWxpZ25lZF9sZTMyKHZhbDMyLCBwaXYpOwotCi0JCQlwYXR0cmliLT5wa3RsZW4gKz0gNDsKLQotCQkJcGF0dHJpYi0+aXZfbGVuID0gSUVFRTgwMjExX1dFUF9JVl9MRU47Ci0JCX0gZWxzZQotCQkJaXZfbWdtdCA9IG1nbXQ7Ci0KLQkJaXZfbWdtdC0+dS5hdXRoLmF1dGhfYWxnID0gY3B1X3RvX2xlMTYoYXV0aF9hbGdvKTsKLQotCQkvKiAgc2V0dGluZyBhdXRoIHNlcSBudW1iZXIgKi8KLQkJaXZfbWdtdC0+dS5hdXRoLmF1dGhfdHJhbnNhY3Rpb24gPQotCQkJY3B1X3RvX2xlMTYocG1sbWVpbmZvLT5hdXRoX3NlcSk7Ci0KLQkJLyogIHNldHRpbmcgc3RhdHVzIGNvZGUuLi4gKi8KLQkJaXZfbWdtdC0+dS5hdXRoLnN0YXR1c19jb2RlID0gY3B1X3RvX2xlMTYoc3RhdHVzKTsKLQotCQlwZnJhbWUgPSBpdl9tZ210LT51LmF1dGgudmFyaWFibGU7Ci0KLQkJLyogIHRoZW4gY2hlY2tpbmcgdG8gc2VlIGlmIHNlbmRpbmcgY2hhbGxlbmdpbmcgdGV4dC4uLiAqLwotCQlpZiAoKHBtbG1laW5mby0+YXV0aF9zZXEgPT0gMykgJiYKLQkJICAgIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BVVRIX1NUQVRFKSAmJgotCQkgICAgKHVzZV9zaGFyZWRfa2V5ID09IDEpKSB7Ci0JCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfQ0hBTExFTkdFLCAxMjgsCi0JCQkJCSAgICAgICBwbWxtZWluZm8tPmNoZ190eHQsCi0JCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCQkJbWdtdC0+ZnJhbWVfY29udHJvbCB8PQotCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCk7Ci0KLQkJCXBhdHRyaWItPmhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0KLQkJCXBhdHRyaWItPmVuY3J5cHQgPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQotCQkJcGF0dHJpYi0+aWN2X2xlbiA9IElFRUU4MDIxMV9XRVBfSUNWX0xFTjsKLQotCQkJcGF0dHJpYi0+cGt0bGVuICs9IHBhdHRyaWItPmljdl9sZW47Ci0JCX0KLQl9Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0KLQlydHdfd2VwX2VuY3J5cHQyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLXN0YXRpYyB2b2lkIGlzc3VlX2Fzc29jcnNwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIHNob3J0IHN0YXR1cywKLQkJCSAgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YXQsIHUxNiBwa3RfdHlwZSkKLXsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7Ci0JdW5zaWduZWQgY2hhciAqcGZyYW1lOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JY29uc3QgdTggKnA7Ci0JdTggKmllID0gcG5ldHdvcmstPklFczsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCXJldHVybjsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXBmcmFtZTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IHBrdF90eXBlKTsKLQotCWV0aGVyX2FkZHJfY29weShtZ210LT5kYSwgcHN0YXQtPmh3YWRkcik7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5ic3NpZCwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCW1nbXQtPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwYXR0cmliLT5wa3RsZW4gPQotCQlvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYXNzb2NfcmVzcC52YXJpYWJsZSk7Ci0KLQltZ210LT51LmFzc29jX3Jlc3AuY2FwYWJfaW5mbyA9IGNwdV90b19sZTE2KHBuZXR3b3JrLT5jYXBhYmlsaXR5KTsKLQltZ210LT51LmFzc29jX3Jlc3Auc3RhdHVzX2NvZGUgPSBjcHVfdG9fbGUxNihzdGF0dXMpOwotCW1nbXQtPnUuYXNzb2NfcmVzcC5haWQgPSBjcHVfdG9fbGUxNihwc3RhdC0+YWlkIHwgQklUKDE0KSB8IEJJVCgxNSkpOwotCi0JcGZyYW1lID0gbWdtdC0+dS5hc3NvY19yZXNwLnZhcmlhYmxlOwotCi0JaWYgKHBzdGF0LT5ic3NyYXRlbGVuIDw9IDgpIHsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsCi0JCQkJICAgICAgIHBzdGF0LT5ic3NyYXRlbGVuLCBwc3RhdC0+YnNzcmF0ZXNldCwKLQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0JfSBlbHNlIHsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsIDgsCi0JCQkJICAgICAgIHBzdGF0LT5ic3NyYXRlc2V0LCAmcGF0dHJpYi0+cGt0bGVuKTsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLAotCQkJCSAgICAgICBwc3RhdC0+YnNzcmF0ZWxlbiAtIDgsCi0JCQkJICAgICAgIHBzdGF0LT5ic3NyYXRlc2V0ICsgOCwgJnBhdHRyaWItPnBrdGxlbik7Ci0JfQotCi0JaWYgKHBzdGF0LT5mbGFncyAmIFdMQU5fU1RBX0hUICYmIHBtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbikgewotCQkvKiBGSUxMIEhUIENBUCBJTkZPIElFICovCi0JCS8qIHAgPSBob3N0YXBkX2VpZF9odF9jYXBhYmlsaXRpZXNfaW5mbyhoYXBkLCBwKTsgKi8KLQkJcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfSFRfQ0FQQUJJTElUWSwgaWUsCi0JCQkJICAgICBwbmV0d29yay0+SUVMZW5ndGgpOwotCQlpZiAocCAmJiBwWzFdKSB7Ci0JCQltZW1jcHkocGZyYW1lLCBwLCBwWzFdICsgMik7Ci0JCQlwZnJhbWUgKz0gKHBbMV0gKyAyKTsKLQkJCXBhdHRyaWItPnBrdGxlbiArPSAocFsxXSArIDIpOwotCQl9Ci0KLQkJLyogRklMTCBIVCBBREQgSU5GTyBJRSAqLwotCQkvKiBwID0gaG9zdGFwZF9laWRfaHRfb3BlcmF0aW9uKGhhcGQsIHApOyAqLwotCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sIGllLAotCQkJCSAgICAgcG5ldHdvcmstPklFTGVuZ3RoKTsKLQkJaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJCW1lbWNweShwZnJhbWUsIHAsIHBbMV0gKyAyKTsKLQkJCXBmcmFtZSArPSAocFsxXSArIDIpOwotCQkJcGF0dHJpYi0+cGt0bGVuICs9IChwWzFdICsgMik7Ci0JCX0KLQl9Ci0KLQkvKiBGSUxMIFdNTSBJRSAqLwotCWlmIChwc3RhdC0+ZmxhZ3MgJiBXTEFOX1NUQV9XTUUgJiYgcG1sbWVwcml2LT5xb3Nfb3B0aW9uKSB7Ci0JCXVuc2lnbmVkIGNoYXIgV01NX1BBUkFfSUVbXSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyLAotCQkJCQkgICAgICAgMHgwMSwgMHgwMX07Ci0JCWludCBpZV9sZW4gPSAwOwotCi0JCWZvciAocCA9IGllOyA7IHAgKz0gKGllX2xlbiArIDIpKSB7Ci0JCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsIHAsCi0JCQkJCSAgICAgcG5ldHdvcmstPklFTGVuZ3RoIC0gKGllX2xlbiArIDIpKTsKLQkJCWlmIChwKQotCQkJCWllX2xlbiA9IHBbMV07Ci0JCQllbHNlCi0JCQkJaWVfbGVuID0gMDsKLQkJCWlmIChwICYmICFtZW1jbXAocCArIDIsIFdNTV9QQVJBX0lFLCA2KSkgewotCQkJCW1lbWNweShwZnJhbWUsIHAsIGllX2xlbiArIDIpOwotCQkJCXBmcmFtZSArPSAoaWVfbGVuICsgMik7Ci0JCQkJcGF0dHJpYi0+cGt0bGVuICs9IChpZV9sZW4gKyAyKTsKLQotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoIXAgfHwgaWVfbGVuID09IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPT0gSFRfSU9UX1BFRVJfUkVBTFRFSykgewotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDLCA2LAotCQkJCSAgICAgICBSRUFMVEVLXzk2Ql9JRSwgJnBhdHRyaWItPnBrdGxlbik7Ci0JfQotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGlzc3VlX2Fzc29jcmVxKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQljb25zdCB1OCAqcDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdW5zaWduZWQgaW50IGksIGosIGluZGV4ID0gMDsKLQl1bnNpZ25lZCBjaGFyIHJmX3R5cGUsIGJzc3JhdGVbTnVtUmF0ZXNdLCBzdGFfYnNzcmF0ZVtOdW1SYXRlc107Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JaW50IGJzc3JhdGVfbGVuID0gMCwgc3RhX2Jzc3JhdGVfbGVuID0gMCwgcGllX2xlbjsKLQl1OCAqcGllOwotCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmICghcG1nbnRmcmFtZSkKLQkJZ290byBleGl0OwotCi0JLyogdXBkYXRlIGF0dHJpYnV0ZSAqLwotCXBhdHRyaWIgPSAmcG1nbnRmcmFtZS0+YXR0cmliOwotCXVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHBhZGFwdGVyLCBwYXR0cmliKTsKLQotCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCXBmcmFtZSA9ICh1OCAqKXBtZ250ZnJhbWUtPmJ1Zl9hZGRyICsgVFhERVNDX09GRlNFVDsKLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXBmcmFtZTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVEpOwotCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmRhLCBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yaykpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5zYSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+YnNzaWQsIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSk7Ci0KLQltZ210LT5zZXFfY3RybCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEocG1sbWVleHQtPm1nbnRfc2VxKSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQkvKiBjYXBzICovCi0JcHV0X3VuYWxpZ25lZF9sZTE2KHBtbG1laW5mby0+bmV0d29yay5jYXBhYmlsaXR5LAotCQkJICAgJm1nbXQtPnUuYXNzb2NfcmVxLmNhcGFiX2luZm8pOwotCS8qIHRvZG86IGxpc3RlbiBpbnRlcnZhbCBmb3IgcG93ZXIgc2F2aW5nICovCi0JcHV0X3VuYWxpZ25lZF9sZTE2KDMsICZtZ210LT51LmFzc29jX3JlcS5saXN0ZW5faW50ZXJ2YWwpOwotCi0JcGZyYW1lID0gbWdtdC0+dS5hc3NvY19yZXEudmFyaWFibGU7Ci0JcGF0dHJpYi0+cGt0bGVuID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFzc29jX3JlcS52YXJpYWJsZSk7Ci0KLQkvKiBTU0lEICovCi0JcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NTSUQsCi0JCQkgICAgICAgcG1sbWVpbmZvLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4sCi0JCQkgICAgICAgcG1sbWVpbmZvLT5uZXR3b3JrLlNzaWQuc3NpZCwgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkvKiBzdXBwb3J0ZWQgcmF0ZSAmIGV4dGVuZGVkIHN1cHBvcnRlZCByYXRlICovCi0KLQlnZXRfcmF0ZV9zZXQyM2EocGFkYXB0ZXIsIHN0YV9ic3NyYXRlLCAmc3RhX2Jzc3JhdGVfbGVuKTsKLQkvKiBEQkdfODcyM0EoInN0YV9ic3NyYXRlX2xlbiA9JWRcbiIsIHN0YV9ic3NyYXRlX2xlbik7ICovCi0KLQkvKiAgZm9yIEpBUEFOLCBjaGFubmVsIDE0IGNhbiBvbmx5IHVzZXMgQiBNb2RlKENDSykgKi8KLQlpZiAocG1sbWVleHQtPmN1cl9jaGFubmVsID09IDE0KQotCQlzdGFfYnNzcmF0ZV9sZW4gPSA0OwotCi0JLyogZm9yIChpID0gMDsgaSA8IHN0YV9ic3NyYXRlX2xlbjsgaSsrKSB7ICovCi0JLyoJREJHXzg3MjNBKCJzdGFfYnNzcmF0ZVslZF09JTAyWFxuIiwgaSwgc3RhX2Jzc3JhdGVbaV0pOyAqLwotCS8qICAqLwotCi0JZm9yIChpID0gMDsgaSA8IE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWDsgaSsrKSB7Ci0JCWlmIChwbWxtZWluZm8tPm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbaV0gPT0gMCkKLQkJCWJyZWFrOwotCQlEQkdfODcyM0EoIm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbJWRdPSUwMlhcbiIsIGksCi0JCQkgIHBtbG1laW5mby0+bmV0d29yay5TdXBwb3J0ZWRSYXRlc1tpXSk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWDsgaSsrKSB7Ci0JCWlmIChwbWxtZWluZm8tPm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbaV0gPT0gMCkKLQkJCWJyZWFrOwotCi0JCS8qICBDaGVjayBpZiB0aGUgQVAncyBzdXBwb3J0ZWQgcmF0ZXMgYXJlIGFsc28KLQkJICAgIHN1cHBvcnRlZCBieSBTVEEuICovCi0JCWZvciAoaiA9IDA7IGogPCBzdGFfYnNzcmF0ZV9sZW47IGorKykgewotCQkJIC8qICBBdm9pZCB0aGUgcHJvcHJpZXRhcnkgZGF0YSByYXRlICgyMk1icHMpIG9mCi0JCQkgICAgIEhhbmRsaW5rIFdTRy00MDAwIEFQICovCi0JCQlpZiAoKHBtbG1laW5mby0+bmV0d29yay5TdXBwb3J0ZWRSYXRlc1tpXSB8Ci0JCQkgICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spID09Ci0JCQkgICAgKHN0YV9ic3NyYXRlW2pdIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykpIHsKLQkJCQkvKiBEQkdfODcyM0EoIm1hdGNoIGkgPSAlZCwgaiA9JWRcbiIsIGksIGopOyAqLwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGogPT0gc3RhX2Jzc3JhdGVfbGVuKSB7Ci0JCQkvKiAgdGhlIHJhdGUgaXMgbm90IHN1cHBvcnRlZCBieSBTVEEgKi8KLQkJCURCR184NzIzQSgiJXMoKTogdGhlIHJhdGVbJWRdPSUwMlggaXMgbm90IHN1cHBvcnRlZCBieSAiCi0JCQkJICAiU1RBIVxuIiwgX19mdW5jX18sIGksCi0JCQkJICBwbWxtZWluZm8tPm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbaV0pOwotCQl9IGVsc2UgewotCQkJLyogIHRoZSByYXRlIGlzIHN1cHBvcnRlZCBieSBTVEEgKi8KLQkJCWJzc3JhdGVbaW5kZXgrK10gPSBwbWxtZWluZm8tPm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXNbaV07Ci0JCX0KLQl9Ci0KLQlic3NyYXRlX2xlbiA9IGluZGV4OwotCURCR184NzIzQSgiYnNzcmF0ZV9sZW4gPSAlZFxuIiwgYnNzcmF0ZV9sZW4pOwotCi0JaWYgKGJzc3JhdGVfbGVuID09IDApIHsKLQkJcnR3X2ZyZWVfeG1pdGJ1ZjIzYShweG1pdHByaXYsIHBtZ250ZnJhbWUtPnB4bWl0YnVmKTsKLQkJcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKHB4bWl0cHJpdiwgcG1nbnRmcmFtZSk7Ci0JCWdvdG8gZXhpdDsgLyogZG9uJ3QgY29ubmVjdCB0byBBUCBpZiBubyBqb2ludCBzdXBwb3J0ZWQgcmF0ZSAqLwotCX0KLQotCWlmIChic3NyYXRlX2xlbiA+IDgpIHsKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsIDgsCi0JCQkJICAgICAgIGJzc3JhdGUsICZwYXR0cmliLT5wa3RsZW4pOwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsCi0JCQkJICAgICAgIChic3NyYXRlX2xlbiAtIDgpLCAoYnNzcmF0ZSArIDgpLAotCQkJCSAgICAgICAmcGF0dHJpYi0+cGt0bGVuKTsKLQl9IGVsc2UKLQkJcGZyYW1lID0gcnR3X3NldF9pZTIzYShwZnJhbWUsIFdMQU5fRUlEX1NVUFBfUkFURVMsCi0JCQkJICAgICAgIGJzc3JhdGVfbGVuLCBic3NyYXRlLCAmcGF0dHJpYi0+cGt0bGVuKTsKLQotCS8qIFJTTiAqLwotCi0JcGllID0gcG1sbWVpbmZvLT5uZXR3b3JrLklFczsKLQlwaWVfbGVuID0gcG1sbWVpbmZvLT5uZXR3b3JrLklFTGVuZ3RoOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfUlNOLCBwaWUsIHBpZV9sZW4pOwotCWlmIChwKQotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfUlNOLCBwWzFdLCBwICsgMiwKLQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQkvKiBIVCBjYXBzICovCi0JaWYgKHBhZGFwdGVyLT5tbG1lcHJpdi5odHByaXYuaHRfb3B0aW9uKSB7Ci0JCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksIHBpZSwgcGllX2xlbik7Ci0KLQkJaWYgKHAgJiYgIWlzX2FwX2luX3RraXAyM2EocGFkYXB0ZXIpKSB7Ci0JCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqY2FwID0gJnBtbG1laW5mby0+aHRfY2FwOwotCi0JCQltZW1jcHkoY2FwLCBwICsgMiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7Ci0KLQkJCS8qIHRvIGRpc2FibGUgNDBNIEh6IHN1cHBvcnQgd2hpbGUgZ2RfYndfNDBNSHpfZW4gPSAwICovCi0JCQlpZiAocHJlZ3ByaXYtPmNidzQwX2VuYWJsZSA9PSAwKSB7Ci0JCQkJY2FwLT5jYXBfaW5mbyAmPSB+Y3B1X3RvX2xlMTYoCi0JCQkJCUlFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwKLQkJCQkJSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDApOwotCQkJfSBlbHNlIHsKLQkJCQljYXAtPmNhcF9pbmZvIHw9IGNwdV90b19sZTE2KAotCQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCk7Ci0JCQl9Ci0KLQkJCS8qIHRvZG86IGRpc2FibGUgU00gcG93ZXIgc2F2ZSBtb2RlICovCi0JCQljYXAtPmNhcF9pbmZvIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9DQVBfU01fUFMpOwotCi0JCQlyZl90eXBlID0gcnRsODcyM2FfZ2V0X3JmX3R5cGUocGFkYXB0ZXIpOwotCQkJLyogc3dpdGNoIChwcmVncHJpdi0+cmZfY29uZmlnKSAqLwotCQkJc3dpdGNoIChyZl90eXBlKSB7Ci0JCQljYXNlIFJGXzFUMVI6Ci0JCQkJLyogUlggU1RCQyBPbmUgc3BhdGlhbCBzdHJlYW0gKi8KLQkJCQlpZiAocHJlZ3ByaXYtPnJ4X3N0YmMpCi0JCQkJCWNhcC0+Y2FwX2luZm8gfD0gY3B1X3RvX2xlMTYoMSA8PCBJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQpOwotCi0JCQkJbWVtY3B5KCZjYXAtPm1jcywgTUNTX3JhdGVfMVIyM0EsIDE2KTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBSRl8yVDJSOgotCQkJY2FzZSBSRl8xVDJSOgotCQkJZGVmYXVsdDoKLQkJCQkvKiBlbmFibGUgZm9yIDIuNC81IEdIeiAqLwotCQkJCWlmIChwcmVncHJpdi0+cnhfc3RiYyA9PSAweDMgfHwKLQkJCQkgICAgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmCi0JCQkJICAgICBXSVJFTEVTU18xMV8yNE4gJiYKLQkJCQkgICAgIC8qIGVuYWJsZSBmb3IgMi40R0h6ICovCi0JCQkJICAgICBwcmVncHJpdi0+cnhfc3RiYyA9PSAweDEpIHx8Ci0JCQkJICAgIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJgotCQkJCSAgICAgV0lSRUxFU1NfMTFfNU4gJiYKLQkJCQkgICAgIHByZWdwcml2LT5yeF9zdGJjID09IDB4MikgfHwKLQkJCQkgICAgLyogZW5hYmxlIGZvciA1R0h6ICovCi0JCQkJICAgIHByZWdwcml2LT53aWZpX3NwZWMgPT0gMSkgewotCQkJCQlEQkdfODcyM0EoImRlY2xhcmUgc3VwcG9ydGluZyBSWCAiCi0JCQkJCQkgICJTVEJDXG4iKTsKLQkJCQkJLyogUlggU1RCQyB0d28gc3BhdGlhbCBzdHJlYW0gKi8KLQkJCQkJY2FwLT5jYXBfaW5mbyB8PSBjcHVfdG9fbGUxNigyIDw8IElFRUU4MDIxMV9IVF9DQVBfUlhfU1RCQ19TSElGVCk7Ci0JCQkJfQotCQkJCW1lbWNweSgmY2FwLT5tY3MsIE1DU19yYXRlXzJSMjNBLCAxNik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSAmJgotCQkJICAgIHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikpIHsKLQkJCQkvKiAgc2V0IHRvIDhLICovCi0JCQkJY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyAmPQotCQkJCQl+SUVFRTgwMjExX0hUX0FNUERVX1BBUk1fRkFDVE9SOwotLyoJCQkJY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyB8PSBNQVhfQU1QRFVfRkFDVE9SXzhLICovCi0JCQl9Ci0KLQkJCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9IVF9DQVBBQklMSVRZLAotCQkJCQkgICAgICAgcFsxXSwgKHU4ICopJnBtbG1laW5mby0+aHRfY2FwLAotCQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0JCX0KLQl9Ci0KLQkvKiB2ZW5kb3Igc3BlY2lmaWMgSUUsIHN1Y2ggYXMgV1BBLCBXTU0sIFdQUyAqLwotCWZvciAoaSA9IDA7ICBpIDwgcG1sbWVpbmZvLT5uZXR3b3JrLklFTGVuZ3RoOykgewotCQlwID0gcG1sbWVpbmZvLT5uZXR3b3JrLklFcyArIGk7Ci0KLQkJc3dpdGNoIChwWzBdKSB7Ci0JCWNhc2UgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDOgotCQkJaWYgKCFtZW1jbXAocCArIDIsIFJUV19XUEFfT1VJMjNBX1RZUEUsIDQpIHx8Ci0JCQkgICAgIW1lbWNtcChwICsgMiwgV01NX09VSTIzQSwgNCkgfHwKLQkJCSAgICAhbWVtY21wKHAgKyAyLCBXUFNfT1VJMjNBLCA0KSkgewotCQkJCXU4IHBsZW4gPSBwWzFdOwotCi0JCQkJaWYgKCFwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYykgewotCQkJCQkvKiBDb21tZW50ZWQgYnkgS3VydCAyMDExMDYyOSAqLwotCQkJCQkvKiBJbiBzb21lIG9sZGVyIEFQcywgV1BTIGhhbmRzaGFrZSAqLwotCQkJCQkvKiB3b3VsZCBiZSBmYWlsIGlmIHdlIGFwcGVuZCB2ZW5kZXIKLQkJCQkJICAgZXh0ZW5zaW9ucyBpbmZvcm1hdGlvbnMgdG8gQVAgKi8KLQkJCQkJaWYgKCFtZW1jbXAocCArIDIsIFdQU19PVUkyM0EsIDQpKQotCQkJCQkJcGxlbiA9IDE0OwotCQkJCX0KLQkJCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwKLQkJCQkJCSAgICAgICBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsCi0JCQkJCQkgICAgICAgcGxlbiwgcCArIDIsCi0JCQkJCQkgICAgICAgJnBhdHRyaWItPnBrdGxlbik7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQlpICs9IHBbMV0gKyAyOwotCX0KLQotCWlmIChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9PSBIVF9JT1RfUEVFUl9SRUFMVEVLKQotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDLCA2LAotCQkJCSAgICAgICBSRUFMVEVLXzk2Ql9JRSwgJnBhdHRyaWItPnBrdGxlbik7Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0JZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCi0JcmV0ID0gX1NVQ0NFU1M7Ci0KLWV4aXQ6Ci0JcG1sbWVwcml2LT5hc3NvY19yZXFfbGVuID0gMDsKLQlpZiAocmV0ID09IF9TVUNDRVNTKSB7Ci0JCWtmcmVlKHBtbG1lcHJpdi0+YXNzb2NfcmVxKTsKLQkJcG1sbWVwcml2LT5hc3NvY19yZXEgPSBrbWFsbG9jKHBhdHRyaWItPnBrdGxlbiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChwbWxtZXByaXYtPmFzc29jX3JlcSkgewotCQkJbWVtY3B5KHBtbG1lcHJpdi0+YXNzb2NfcmVxLCBtZ210LCBwYXR0cmliLT5wa3RsZW4pOwotCQkJcG1sbWVwcml2LT5hc3NvY19yZXFfbGVuID0gcGF0dHJpYi0+cGt0bGVuOwotCQl9Ci0JfSBlbHNlCi0JCWtmcmVlKHBtbG1lcHJpdi0+YXNzb2NfcmVxKTsKLX0KLQotLyogd2hlbiB3YWl0X2FjayBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCi1zdGF0aWMgaW50IF9pc3N1ZV9udWxsZGF0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBwb3dlcl9tb2RlLCBpbnQgd2FpdF9hY2spCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqcHdsYW5oZHI7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvOwotCi0JLyogREJHXzg3MjNBKCIlczolZFxuIiwgX19mdW5jX18sIHBvd2VyX21vZGUpOyAqLwotCi0JaWYgKCFwYWRhcHRlcikKLQkJZ290byBleGl0OwotCi0JcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0JcGF0dHJpYi0+cmV0cnlfY3RybCA9IGZhbHNlOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JcGZyYW1lID0gKHU4ICopKHBtZ250ZnJhbWUtPmJ1Zl9hZGRyKSArIFRYREVTQ19PRkZTRVQ7Ci0JcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7Ci0KLQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKLQkJCQkJICAgICAgSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSA9PSBNU1JfQVApCi0JCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7Ci0JZWxzZSBpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0lORlJBKQotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTKTsKLQotCWlmIChwb3dlcl9tb2RlKQotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QTSk7Ci0KLQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBkYSk7Ci0JZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKTsKLQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yaykpOwotCi0JcHdsYW5oZHItPnNlcV9jdHJsID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCXBmcmFtZSArPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0KLQlpZiAod2FpdF9hY2spCi0JCXJldCA9IGR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0X2FjazIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0JZWxzZSB7Ci0JCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qIHdoZW4gd2FpdF9tcyA+MCAsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KLS8qIGRhID09IE5VTEwgZm9yIHN0YXRpb24gbW9kZSAqLwotaW50IGlzc3VlX251bGxkYXRhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLAotCQkgICAgICB1bnNpZ25lZCBpbnQgcG93ZXJfbW9kZSwgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKQotewotCWludCByZXQ7Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQkvKiBkYSA9PSBOVUxMLCBhc3N1bWUgaXQncyBudWxsIGRhdGEgZm9yIHN0YSB0byBhcCovCi0JaWYgKGRhID09IE5VTEwpCi0JCWRhID0gZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspOwotCi0JZG8gewotCQlyZXQgPSBfaXNzdWVfbnVsbGRhdGEyM2EocGFkYXB0ZXIsIGRhLCBwb3dlcl9tb2RlLAotCQkJCQkgd2FpdF9tcyA+IDAgPyB0cnVlIDogZmFsc2UpOwotCi0JCWkrKzsKLQotCQlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGkgPCB0cnlfY250ICYmIHdhaXRfbXMgPiAwICYmIHJldCA9PSBfRkFJTCkKLQkJCW1zbGVlcCh3YWl0X21zKTsKLQotCX0gd2hpbGUoKGkgPCB0cnlfY250KSAmJiAoKHJldCA9PSBfRkFJTCkgfHwgKHdhaXRfbXMgPT0gMCkpKTsKLQotCWlmIChyZXQgIT0gX0ZBSUwpIHsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAodHJ5X2NudCAmJiB3YWl0X21zKSB7Ci0JCWlmIChkYSkKLQkJCURCR184NzIzQSgiJXMoJXMpOiB0byAlcE0sIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAotCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJCSAgZGEsIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKLQkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7Ci0JCWVsc2UKLQkJCURCR184NzIzQSgiJXMoJXMpOiwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCi0JCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotCX0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogd2hlbiB3YWl0X2FjayBpcyB0cnVlLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYXQgcHJvY2VzcyBjb250ZXh0ICovCi1zdGF0aWMgaW50IF9pc3N1ZV9xb3NfbnVsbGRhdGEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHVuc2lnbmVkIGNoYXIgKmRhLCB1MTYgdGlkLCBpbnQgd2FpdF9hY2spCi17Ci0JaW50IHJldCA9IF9GQUlMOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIgKnB3bGFuaGRyOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQlwYXR0cmliLT5oZHJsZW4gKz0gMjsKLQlwYXR0cmliLT5xb3NfZW4gPSB0cnVlOwotCXBhdHRyaWItPmVvc3AgPSAxOwotCXBhdHRyaWItPmFja19wb2xpY3kgPSAwOwotCXBhdHRyaWItPm1kYXRhID0gMDsKLQotCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCXBmcmFtZSA9ICh1OCAqKShwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCXB3bGFuaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkciAqKXBmcmFtZTsKLQotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfAotCQkJCQkgICAgICBJRUVFODAyMTFfU1RZUEVfUU9TX05VTExGVU5DKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSYweDAzKSA9PSBNU1JfQVApCi0JCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7Ci0JZWxzZSBpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0lORlJBKQotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTKTsKLQotCWlmIChwYXR0cmliLT5tZGF0YSkKLQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfTU9SRURBVEEpOwotCi0JcHdsYW5oZHItPnFvc19jdHJsID0gY3B1X3RvX2xlMTYodGlkICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0spOwotCXB3bGFuaGRyLT5xb3NfY3RybCB8PSBjcHVfdG9fbGUxNigocGF0dHJpYi0+YWNrX3BvbGljeSA8PCA1KSAmCi0JCQkJCSAgSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9NQVNLKTsKLQlpZiAocGF0dHJpYi0+ZW9zcCkKLQkJcHdsYW5oZHItPnFvc19jdHJsIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9RT1NfQ1RMX0VPU1ApOwotCi0JZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMSwgZGEpOwotCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7Ci0JZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCXB3bGFuaGRyLT5zZXFfY3RybCA9Ci0JCWNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEocG1sbWVleHQtPm1nbnRfc2VxKSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQlwZnJhbWUgKz0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkcik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkcik7Ci0KLQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47Ci0KLQlpZiAod2FpdF9hY2spCi0JCXJldCA9IGR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0X2FjazIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0JZWxzZSB7Ci0JCWR1bXBfbWdudGZyYW1lMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qIHdoZW4gd2FpdF9tcyA+MCAsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhdCBwcm9jZXNzIGNvbnRleHQgKi8KLS8qIGRhID09IE5VTEwgZm9yIHN0YXRpb24gbW9kZSAqLwotaW50IGlzc3VlX3Fvc19udWxsZGF0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwKLQkJCSAgdTE2IHRpZCwgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKQotewotCWludCByZXQ7Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQkvKiBkYSA9PSBOVUxMLCBhc3N1bWUgaXQncyBudWxsIGRhdGEgZm9yIHN0YSB0byBhcCovCi0JaWYgKGRhID09IE5VTEwpCi0JCWRhID0gZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspOwotCi0JZG8gewotCQlyZXQgPSBfaXNzdWVfcW9zX251bGxkYXRhMjNhKHBhZGFwdGVyLCBkYSwgdGlkLAotCQkJCQkgICAgIHdhaXRfbXMgPiAwID8gdHJ1ZSA6IGZhbHNlKTsKLQotCQlpKys7Ci0KLQkJaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkKLQkJCWJyZWFrOwotCi0JCWlmIChpIDwgdHJ5X2NudCAmJiB3YWl0X21zID4gMCAmJiByZXQgPT0gX0ZBSUwpCi0JCQltc2xlZXAod2FpdF9tcyk7Ci0JfSB3aGlsZSgoaSA8IHRyeV9jbnQpICYmICgocmV0ID09IF9GQUlMKXx8KHdhaXRfbXMgPT0gMCkpKTsKLQotCWlmIChyZXQgIT0gX0ZBSUwpIHsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAodHJ5X2NudCAmJiB3YWl0X21zKSB7Ci0JCWlmIChkYSkKLQkJCURCR184NzIzQSgiJXMoJXMpOiB0byAlcE0sIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAotCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJCSAgZGEsIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKLQkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7Ci0JCWVsc2UKLQkJCURCR184NzIzQSgiJXMoJXMpOiwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCi0JCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotCX0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfaXNzdWVfZGVhdXRoKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLAotCQkJIHVuc2lnbmVkIHNob3J0IHJlYXNvbiwgdTggd2FpdF9hY2spCi17Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0KLQkvKiBEQkdfODcyM0EoIiVzIHRvICVwTVxuIiwgX19mdW5jX18sIGRhKTsgKi8KLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0JcGF0dHJpYi0+cmV0cnlfY3RybCA9IGZhbHNlOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikocG1nbnRmcmFtZS0+YnVmX2FkZHIgKyBUWERFU0NfT0ZGU0VUKTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOwotCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmRhLCBkYSk7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOwotCWV0aGVyX2FkZHJfY29weShtZ210LT5ic3NpZCwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCW1nbXQtPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NOX1RPX1NFUShwbWxtZWV4dC0+bWdudF9zZXEpKTsKLQlwbWxtZWV4dC0+bWdudF9zZXErKzsKLQotCXBhdHRyaWItPnBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyAyOwotCi0JbWdtdC0+dS5kZWF1dGgucmVhc29uX2NvZGUgPSBjcHVfdG9fbGUxNihyZWFzb24pOwotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JaWYgKHdhaXRfYWNrKQotCQlyZXQgPSBkdW1wX21nbnRmcmFtZTIzYV9hbmRfd2FpdF9hY2syM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotCWVsc2UgewotCQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0JCXJldCA9IF9TVUNDRVNTOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgaXNzdWVfZGVhdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLAotCQkgICAgdW5zaWduZWQgc2hvcnQgcmVhc29uKQotewotCURCR184NzIzQSgiJXMgdG8gJXBNXG4iLCBfX2Z1bmNfXywgZGEpOwotCXJldHVybiBfaXNzdWVfZGVhdXRoKHBhZGFwdGVyLCBkYSwgcmVhc29uLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXNzdWVfZGVhdXRoX2V4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpkYSwKLQkJCSAgIHVuc2lnbmVkIHNob3J0IHJlYXNvbiwgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKQotewotCWludCByZXQ7Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCi0JZG8gewotCQlyZXQgPSBfaXNzdWVfZGVhdXRoKHBhZGFwdGVyLCBkYSwgcmVhc29uLAotCQkJCSAgICB3YWl0X21zID4wID8gdHJ1ZSA6IGZhbHNlKTsKLQotCQlpKys7Ci0KLQkJaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkKLQkJCWJyZWFrOwotCi0JCWlmIChpIDwgdHJ5X2NudCAmJiB3YWl0X21zID4gMCAmJiByZXQgPT0gX0ZBSUwpCi0JCQltc2xlZXAod2FpdF9tcyk7Ci0KLQl9IHdoaWxlKChpIDwgdHJ5X2NudCkgJiYgKChyZXQgPT0gX0ZBSUwpfHwod2FpdF9tcyA9PSAwKSkpOwotCi0JaWYgKHJldCAhPSBfRkFJTCkgewotCQlyZXQgPSBfU1VDQ0VTUzsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICh0cnlfY250ICYmIHdhaXRfbXMpIHsKLQkJaWYgKGRhKQotCQkJREJHXzg3MjNBKCIlcyglcyk6IHRvICVwTSwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBkYSwgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUyA/ICIsIGFja2VkIiA6ICIiLCBpLCB0cnlfY250LAotCQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKLQkJZWxzZQotCQkJREJHXzg3MjNBKCIlcyglcyk6LCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKLQkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCQkgIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKLQkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7Ci0JfQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGlzc3VlX2FjdGlvbl9zcGN0X2NoX3N3aXRjaDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICB1OCAqcmEsIHU4IG5ld19jaCwgdTggY2hfb2Zmc2V0KQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JREJHXzg3MjNBKCIlcyglcyk6IHJhPSVwTSwgY2g6JXUsIG9mZnNldDoldVxuIiwKLQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsIHJhLCBuZXdfY2gsIGNoX29mZnNldCk7Ci0KLQlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHB4bWl0cHJpdik7Ci0JaWYgKCFwbWdudGZyYW1lKQotCQlyZXR1cm47Ci0KLQkvKiB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikocG1nbnRmcmFtZS0+YnVmX2FkZHIgKyBUWERFU0NfT0ZGU0VUKTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOwotCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmRhLCByYSk7IC8qIFJBICovCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPnNhLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdikpOyAvKiBUQSAqLwotCWV0aGVyX2FkZHJfY29weShtZ210LT5ic3NpZCwgcmEpOyAvKiBEQSA9IFJBICovCi0KLQltZ210LT5zZXFfY3RybCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEocG1sbWVleHQtPm1nbnRfc2VxKSk7Ci0JcG1sbWVleHQtPm1nbnRfc2VxKys7Ci0KLQltZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9IFdMQU5fQ0FURUdPUllfU1BFQ1RSVU1fTUdNVDsKLQltZ210LT51LmFjdGlvbi51LmNoYW5fc3dpdGNoLmFjdGlvbl9jb2RlID0gV0xBTl9BQ1RJT05fU1BDVF9DSExfU1dJVENIOwotCi0JcGZyYW1lID0gbWdtdC0+dS5hY3Rpb24udS5jaGFuX3N3aXRjaC52YXJpYWJsZTsKLQlwYXR0cmliLT5wa3RsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsCi0JCQkJICAgdS5hY3Rpb24udS5jaGFuX3N3aXRjaC52YXJpYWJsZSk7Ci0KLQlwZnJhbWUgPSBydHdfc2V0X2llMjNhX2NoX3N3aXRjaCAocGZyYW1lLCAmcGF0dHJpYi0+cGt0bGVuLCAwLAotCQkJCQkgIG5ld19jaCwgMCk7Ci0JcGZyYW1lID0gcnR3X3NldF9pZTIzYV9zZWNvbmRhcnlfY2hfb2Zmc2V0KHBmcmFtZSwgJnBhdHRyaWItPnBrdGxlbiwKLQkJaGFsX2NoX29mZnNldF90b19zZWNvbmRhcnlfY2hfb2Zmc2V0MjNhKGNoX29mZnNldCkpOwotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotfQotCi12b2lkIGlzc3VlX2FjdGlvbl9CQTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcmFkZHIsCi0JCQl1bnNpZ25lZCBjaGFyIGFjdGlvbiwgdW5zaWduZWQgc2hvcnQgc3RhdHVzKQotewotCXUxNiBzdGFydF9zZXE7Ci0JdTE2IEJBX3BhcmFfc2V0OwotCXUxNiBCQV9zdGFydGluZ19zZXFjdHJsOwotCXUxNiBCQV9wYXJhOwotCWludCBtYXhfcnhfYW1wZHVfZmFjdG9yOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JdTggdGVuZGFBUE1hY1tdID0gezB4QzgsIDB4M0EsIDB4MzV9OwotCi0JREJHXzg3MjNBKCIlcywgYWN0aW9uID0lZCwgc3RhdHVzID0lZFxuIiwgX19mdW5jX18sIGFjdGlvbiwgc3RhdHVzKTsKLQotCXBtZ250ZnJhbWUgPSBhbGxvY19tZ3R4bWl0ZnJhbWUyM2EocHhtaXRwcml2KTsKLQlpZiAoIXBtZ250ZnJhbWUpCi0JCXJldHVybjsKLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0KLQltZW1zZXQocG1nbnRmcmFtZS0+YnVmX2FkZHIsIDAsIFdMQU5IRFJfT0ZGU0VUICsgVFhERVNDX09GRlNFVCk7Ci0KLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKShwbWdudGZyYW1lLT5idWZfYWRkciArIFRYREVTQ19PRkZTRVQpOwotCi0JbWdtdC0+ZnJhbWVfY29udHJvbCA9Ci0JCWNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7Ci0KLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+ZGEsIHJhZGRyKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+c2EsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmJzc2lkLCBnZXRfbXlfYnNzaWQyM2EoJnBtbG1laW5mby0+bmV0d29yaykpOwotCi0JbWdtdC0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU05fVE9fU0VRKHBtbG1lZXh0LT5tZ250X3NlcSkpOwotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPSBXTEFOX0NBVEVHT1JZX0JBQ0s7Ci0KLQlwYXR0cmliLT5wa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgMTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBXTEFOX0FDVElPTl9BRERCQV9SRVE6Ci0JCXBhdHRyaWItPnBrdGxlbiArPSBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEpOwotCi0JCW1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLmFjdGlvbl9jb2RlID0gYWN0aW9uOwotCi0JCWRvIHsKLQkJCXBtbG1laW5mby0+ZGlhbG9nVG9rZW4rKzsKLQkJfSB3aGlsZSAocG1sbWVpbmZvLT5kaWFsb2dUb2tlbiA9PSAwKTsKLQotCQltZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5kaWFsb2dfdG9rZW4gPQotCQkJcG1sbWVpbmZvLT5kaWFsb2dUb2tlbjsKLQotCQlpZiAocnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikgJiYKLQkJICAgIHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikgJiYKLQkJICAgIChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciAhPSBicm9hZGNvbUFQIHx8Ci0JCSAgICAgbWVtY21wKHJhZGRyLCB0ZW5kYUFQTWFjLCAzKSkpIHsKLQkJCS8qICBBLU1TRFUgTk9UIFN1cHBvcnRlZCAqLwotCQkJQkFfcGFyYV9zZXQgPSAwOwotCQkJLyogIGltbWVkaWF0ZSBCbG9jayBBY2sgKi8KLQkJCUJBX3BhcmFfc2V0IHw9ICgxIDw8IDEpICYKLQkJCQlJRUVFODAyMTFfQUREQkFfUEFSQU1fUE9MSUNZX01BU0s7Ci0JCQkvKiAgVElEICovCi0JCQlCQV9wYXJhX3NldCB8PSAoc3RhdHVzIDw8IDIpICYKLQkJCQlJRUVFODAyMTFfQUREQkFfUEFSQU1fVElEX01BU0s7Ci0JCQkvKiAgbWF4IGJ1ZmZlciBzaXplIGlzIDggTVNEVSAqLwotCQkJQkFfcGFyYV9zZXQgfD0gKDggPDwgNikgJgotCQkJCUlFRUU4MDIxMV9BRERCQV9QQVJBTV9CVUZfU0laRV9NQVNLOwotCQl9IGVsc2UgewotCQkJLyogaW1tZWRpYXRlIGFjayAmIDY0IGJ1ZmZlciBzaXplICovCi0JCQlCQV9wYXJhX3NldCA9IDB4MTAwMiB8ICgoc3RhdHVzICYgMHhmKSA8PCAyKTsKLQkJfQotCi0JCXB1dF91bmFsaWduZWRfbGUxNihCQV9wYXJhX3NldCwKLQkJCQkgICAmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuY2FwYWIpOwotCi0JCS8qICA1bXMgKi8KLQkJcHV0X3VuYWxpZ25lZF9sZTE2KDUwMDAsICZtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS50aW1lb3V0KTsKLQotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCByYWRkcik7Ci0JCWlmIChwc3RhKSB7Ci0JCQlpbnQgaWR4OwotCi0JCQlpZHggPSBzdGF0dXMgJiAweDA3OwotCQkJc3RhcnRfc2VxID0KLQkJCQkocHN0YS0+c3RhX3htaXRwcml2LnR4c2VxX3RpZFtpZHhdICYgMHhmZmYpICsgMTsKLQotCQkJREJHXzg3MjNBKCJCQV9zdGFydGluZ19zZXFjdHJsID0gJWQgZm9yIFRJRCA9JWRcbiIsCi0JCQkJICBzdGFydF9zZXEsIGlkeCk7Ci0KLQkJCXBzdGEtPkJBX3N0YXJ0aW5nX3NlcWN0cmxbaWR4XSA9IHN0YXJ0X3NlcTsKLQotCQkJQkFfc3RhcnRpbmdfc2VxY3RybCA9IHN0YXJ0X3NlcSA8PCA0OwotCQl9IGVsc2UKLQkJCUJBX3N0YXJ0aW5nX3NlcWN0cmwgPSAwOwotCi0JCXB1dF91bmFsaWduZWRfbGUxNihCQV9zdGFydGluZ19zZXFjdHJsLAotCQkJCSAgICZtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5zdGFydF9zZXFfbnVtKTsKLQotCQlicmVhazsKLQotCWNhc2UgV0xBTl9BQ1RJT05fQUREQkFfUkVTUDoKLQkJcGF0dHJpYi0+cGt0bGVuICs9IHNpemVvZihtZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3ApOwotCi0JCW1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5hY3Rpb25fY29kZSA9IGFjdGlvbjsKLQkJbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmRpYWxvZ190b2tlbiA9Ci0JCQlwbWxtZWluZm8tPkFEREJBX3JlcS5kaWFsb2dfdG9rZW47Ci0JCXB1dF91bmFsaWduZWRfbGUxNihzdGF0dXMsCi0JCQkJICAgJm1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5zdGF0dXMpOwotCi0JCUdldEhhbERlZlZhcjgxOTJDVXNiKHBhZGFwdGVyLCBIV19WQVJfTUFYX1JYX0FNUERVX0ZBQ1RPUiwKLQkJCQkgICAgICZtYXhfcnhfYW1wZHVfZmFjdG9yKTsKLQotCQlCQV9wYXJhID0gbGUxNl90b19jcHUocG1sbWVpbmZvLT5BRERCQV9yZXEuQkFfcGFyYV9zZXQpICYgMHgzZjsKLQkJaWYgKG1heF9yeF9hbXBkdV9mYWN0b3IgPT0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEspCi0JCQlCQV9wYXJhX3NldCA9IEJBX3BhcmEgfCAweDEwMDA7IC8qIDY0IGJ1ZmZlciBzaXplICovCi0JCWVsc2UgaWYgKG1heF9yeF9hbXBkdV9mYWN0b3IgPT0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV8zMkspCi0JCQlCQV9wYXJhX3NldCA9IEJBX3BhcmEgfCAweDA4MDA7IC8qIDMyIGJ1ZmZlciBzaXplICovCi0JCWVsc2UgaWYgKG1heF9yeF9hbXBkdV9mYWN0b3IgPT0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV8xNkspCi0JCQlCQV9wYXJhX3NldCA9IEJBX3BhcmEgfCAweDA0MDA7IC8qIDE2IGJ1ZmZlciBzaXplICovCi0JCWVsc2UgaWYgKG1heF9yeF9hbXBkdV9mYWN0b3IgPT0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV84SykKLQkJCUJBX3BhcmFfc2V0ID0gQkFfcGFyYSB8IDB4MDIwMDsgLyogOCBidWZmZXIgc2l6ZSAqLwotCQllbHNlCi0JCQlCQV9wYXJhX3NldCA9IEJBX3BhcmEgfCAweDEwMDA7IC8qIDY0IGJ1ZmZlciBzaXplICovCi0KLQkJaWYgKHJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpICYmCi0JCSAgICBydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpICYmCi0JCSAgICAocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgIT0gYnJvYWRjb21BUCB8fAotCQkgICAgIG1lbWNtcChyYWRkciwgdGVuZGFBUE1hYywgMykpKSB7Ci0JCQkvKiAgbWF4IGJ1ZmZlciBzaXplIGlzIDggTVNEVSAqLwotCQkJQkFfcGFyYV9zZXQgJj0gfklFRUU4MDIxMV9BRERCQV9QQVJBTV9CVUZfU0laRV9NQVNLOwotCQkJQkFfcGFyYV9zZXQgfD0gKDggPDwgNikgJgotCQkJCUlFRUU4MDIxMV9BRERCQV9QQVJBTV9CVUZfU0laRV9NQVNLOwotCQl9Ci0KLQkJaWYgKHByZWdwcml2LT5hbXBkdV9hbXNkdSA9PSAwKS8qIGRpc2FibGVkICovCi0JCQlCQV9wYXJhX3NldCAmPSB+QklUKDApOwotCQllbHNlIGlmIChwcmVncHJpdi0+YW1wZHVfYW1zZHUgPT0gMSkvKiBlbmFibGVkICovCi0JCQlCQV9wYXJhX3NldCB8PSBCSVQoMCk7Ci0KLQkJcHV0X3VuYWxpZ25lZF9sZTE2KEJBX3BhcmFfc2V0LAotCQkJCSAgICZtZ210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuY2FwYWIpOwotCi0JCW1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC50aW1lb3V0Ci0JCQk9IHBtbG1laW5mby0+QUREQkFfcmVxLkJBX3RpbWVvdXRfdmFsdWU7Ci0KLQkJcGF0dHJpYi0+cGt0bGVuICs9IDg7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9BQ1RJT05fREVMQkE6Ci0JCXBhdHRyaWItPnBrdGxlbiArPSBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5kZWxiYSk7Ci0KLQkJbWdtdC0+dS5hY3Rpb24udS5kZWxiYS5hY3Rpb25fY29kZSA9IGFjdGlvbjsKLQkJQkFfcGFyYV9zZXQgPSAoc3RhdHVzICYgMHgxRikgPDwgMzsKLQkJbWdtdC0+dS5hY3Rpb24udS5kZWxiYS5wYXJhbXMgPSBjcHVfdG9fbGUxNihCQV9wYXJhX3NldCk7Ci0JCW1nbXQtPnUuYWN0aW9uLnUuZGVsYmEucmVhc29uX2NvZGUgPQotCQkJY3B1X3RvX2xlMTYoV0xBTl9SRUFTT05fUVNUQV9OT1RfVVNFKTsKLQotCQlwYXR0cmliLT5wa3RsZW4gKz0gNTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JZHVtcF9tZ250ZnJhbWUyM2EocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotfQotCi1pbnQgc2VuZF9kZWxiYTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBpbml0aWF0b3IsIHU4ICphZGRyKQotewotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQkvKiBzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7ICovCi0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQl1MTYgdGlkOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpICE9IE1TUl9BUCkKLQkJaWYgKCEocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykpCi0JCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBhZGRyKTsKLQlpZiAocHN0YSA9PSBOVUxMKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQlpZiAoaW5pdGlhdG9yID09IDApIHsgIC8qICByZWNpcGllbnQgKi8KLQkJZm9yICh0aWQgPSAwOyB0aWQgPCBNQVhUSUQ7IHRpZCsrKSB7Ci0JCQlpZiAocHN0YS0+cmVjdnJlb3JkZXJfY3RybFt0aWRdLmVuYWJsZSA9PSB0cnVlKSB7Ci0JCQkJREJHXzg3MjNBKCJyeCBhZ2cgZGlzYWJsZSB0aWQoJWQpXG4iLCB0aWQpOwotCQkJCWlzc3VlX2FjdGlvbl9CQTIzYShwYWRhcHRlciwgYWRkciwgV0xBTl9BQ1RJT05fREVMQkEsICgoKHRpZCA8PDEpIHxpbml0aWF0b3IpJjB4MUYpKTsKLQkJCQlwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW3RpZF0uZW5hYmxlID0gZmFsc2U7Ci0JCQkJcHN0YS0+cmVjdnJlb3JkZXJfY3RybFt0aWRdLmluZGljYXRlX3NlcSA9IDB4ZmZmZjsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoaW5pdGlhdG9yID09IDEpIHsgLyogIG9yaWdpbmF0b3IgKi8KLQkJZm9yICh0aWQgPSAwOyB0aWQgPCBNQVhUSUQ7IHRpZCsrKSB7Ci0JCQlpZiAocHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwICYgQklUKHRpZCkpIHsKLQkJCQlEQkdfODcyM0EoInR4IGFnZyBkaXNhYmxlIHRpZCglZClcbiIsIHRpZCk7Ci0JCQkJaXNzdWVfYWN0aW9uX0JBMjNhKHBhZGFwdGVyLCBhZGRyLCBXTEFOX0FDVElPTl9ERUxCQSwgKCgodGlkIDw8MSkgfGluaXRpYXRvcikmMHgxRikpOwotCQkJCXBzdGEtPmh0cHJpdi5hZ2dfZW5hYmxlX2JpdG1hcCAmPSB+QklUKHRpZCk7Ci0JCQkJcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwICY9IH5CSVQodGlkKTsKLQotCQkJfQotCQl9Ci0JfQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotaW50IHNlbmRfYmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JYm9vbCBieG1pdG9rOwotCWludCBpc3N1ZSA9IDA7Ci0JaW50IHBvbGwgPSAwOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCXVuc2lnbmVkIGludCBwYXNzaW5nX3RpbWU7Ci0KLQlydGw4NzIzYV9iY25fdmFsaWQocGFkYXB0ZXIpOwotCWRvIHsKLQkJaXNzdWVfYmVhY29uMjNhKHBhZGFwdGVyLCAxMDApOwotCQlpc3N1ZSsrOwotCQlkbyB7Ci0JCQl5aWVsZCgpOwotCQkJYnhtaXRvayA9IHJ0bDg3MjNhX2dldF9iY25fdmFsaWQocGFkYXB0ZXIpOwotCQkJcG9sbCsrOwotCQl9IHdoaWxlICgocG9sbCAlIDEwKSAhPSAwICYmICFieG1pdG9rICYmCi0JCQkgIXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkICYmCi0JCQkgIXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCk7Ci0KLQl9IHdoaWxlICghYnhtaXRvayAmJiBpc3N1ZTwxMDAgJiYgIXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkICYmCi0JCSAhcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKTsKLQotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpCi0JCXJldHVybiBfRkFJTDsKLQotCXBhc3NpbmdfdGltZSA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KTsKLQotCWlmICghYnhtaXRvaykgewotCQlEQkdfODcyM0EoIiVzIGZhaWwhICV1IG1zXG4iLCBfX2Z1bmNfXywgcGFzc2luZ190aW1lKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0gZWxzZSB7Ci0KLQkJaWYgKHBhc3NpbmdfdGltZSA+IDEwMCB8fCBpc3N1ZSA+IDMpCi0JCQlEQkdfODcyM0EoIiVzIHN1Y2Nlc3MsIGlzc3VlOiVkLCBwb2xsOiVkLCAldSBtc1xuIiwKLQkJCQkgIF9fZnVuY19fLCBpc3N1ZSwgcG9sbCwgcGFzc2luZ190aW1lKTsKLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotRm9sbG93aW5nIGFyZSBzb21lIHV0aXRpdHkgZnVuY3Rpb25zIGZvciBXaUZpIE1MTUUKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvb2wgSXNMZWdhbDVHQ2hhbm5lbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGNoYW5uZWwpCi17Ci0KLQlpbnQgaSA9IDA7Ci0JdTggQ2hhbm5lbF81R1s0NV0gPSB7MzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUwLCA1MiwgNTQsIDU2LCA1OCwKLQkJCSAgICAgNjAsIDYyLCA2NCwgMTAwLCAxMDIsIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLAotCQkJICAgICAxMTQsIDExNiwgMTE4LCAxMjAsIDEyMiwgMTI0LCAxMjYsIDEyOCwgMTMwLCAxMzIsCi0JCQkgICAgIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQ5LCAxNTEsIDE1MywgMTU1LCAxNTcsIDE1OSwKLQkJCSAgICAgMTYxLCAxNjMsIDE2NX07Ci0JZm9yIChpID0gMDsgaSA8IHNpemVvZihDaGFubmVsXzVHKTsgaSsrKQotCQlpZiAoY2hhbm5lbCA9PSBDaGFubmVsXzVHW2ldKQotCQkJcmV0dXJuIHRydWU7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBydHdfc2l0ZV9zdXJ2ZXkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBjaGFyIHN1cnZleV9jaGFubmVsID0gMDsKLQllbnVtIHJ0X3NjYW5fdHlwZSBTY2FuVHlwZSA9IFNDQU5fUEFTU0lWRTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwgKmNoOwotCi0JaWYgKHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaGFubmVsX2lkeCA8Ci0JICAgIHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaF9udW0pIHsKLQkJY2ggPSAmcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoW3BtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5jaGFubmVsX2lkeF07Ci0JCXN1cnZleV9jaGFubmVsID0gY2gtPmh3X3ZhbHVlOwotCQlTY2FuVHlwZSA9IChjaC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9OT19JUikgPwotCQkJU0NBTl9QQVNTSVZFIDogU0NBTl9BQ1RJVkU7Ci0JfQotCi0JaWYgKHN1cnZleV9jaGFubmVsICE9IDApIHsKLQkJLyogUEFVU0UgNC1BQyBRdWV1ZSB3aGVuIHNpdGVfc3VydmV5ICovCi0JCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hhbm5lbF9pZHggPT0gMCkKLQkJCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgc3VydmV5X2NoYW5uZWwsCi0JCQkJCSAgICAgIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUsCi0JCQkJCSAgICAgIEhUX0NIQU5ORUxfV0lEVEhfMjApOwotCQllbHNlCi0JCQlTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLCBzdXJ2ZXlfY2hhbm5lbCk7Ci0KLQkJaWYgKFNjYW5UeXBlID09IFNDQU5fQUNUSVZFKSAvKiBvYmV5IHRoZSBjaGFubmVsIHBsYW4gc2V0dGluZy4uLiAqLwotCQl7Ci0JCQlpbnQgaTsKLQotCQkJZm9yIChpID0gMDtpPFJUV19TU0lEX1NDQU5fQU1PVU5UO2krKykgewotCQkJCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3NpZFtpXS5zc2lkX2xlbikgewotCQkJCQkvKiB0b2RvOiB0byBpc3N1ZSB0d28gcHJvYmUgcmVxPz8/ICovCi0JCQkJCWlzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCAmcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNzaWRbaV0sIE5VTEwpOwotCQkJCQkvKiBtc2xlZXAoU1VSVkVZX1RPPj4xKTsgKi8KLQkJCQkJaXNzdWVfcHJvYmVyZXEocGFkYXB0ZXIsICZwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3NpZFtpXSwgTlVMTCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNjYW5fbW9kZSA9PSBTQ0FOX0FDVElWRSkgewotCQkJCS8qIHRvZG86IHRvIGlzc3VlIHR3byBwcm9iZSByZXE/Pz8gKi8KLQkJCQlpc3N1ZV9wcm9iZXJlcShwYWRhcHRlciwgTlVMTCwgTlVMTCk7Ci0JCQkJLyogbXNsZWVwKFNVUlZFWV9UTz4+MSk7ICovCi0JCQkJaXNzdWVfcHJvYmVyZXEocGFkYXB0ZXIsIE5VTEwsIE5VTEwpOwotCQkJfQotCQl9Ci0KLQkJc2V0X3N1cnZleV90aW1lcihwbWxtZWV4dCwgcG1sbWVleHQtPmNoYW5fc2Nhbl90aW1lKTsKLQl9IGVsc2UgewotCQkvKgljaGFubmVsIG51bWJlciBpcyAwIG9yIHRoaXMgY2hhbm5lbCBpcyBub3QgdmFsaWQuICovCi0JCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fQ09NUExFVEU7Ci0KLQkJLyogc3dpdGNoIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNoYW5uZWwgKi8KLQotCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwKLQkJCQkgICAgICBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwKLQkJCQkgICAgICBwbWxtZWV4dC0+Y3VyX2J3bW9kZSk7Ci0KLQkJLyogZmx1c2ggNC1BQyBRdWV1ZSBhZnRlciBydHdfc2l0ZV9zdXJ2ZXkgKi8KLQkJLyogdmFsOCA9IDA7ICovCi0KLQkJLyogY29uZmlnIE1TUiAqLwotCQlydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzKHBhZGFwdGVyLCBwbWxtZWluZm8tPnN0YXRlICYgMHgzKTsKLQotCQkvKiByZXN0b3JlIFJYIEdBSU4gKi8KLQkJcnRsODcyM2Ffc2V0X2luaXRpYWxfZ2FpbihwYWRhcHRlciwgMHhmZik7Ci0JCS8qIHR1cm4gb24gZHluYW1pYyBmdW5jdGlvbnMgKi8KLQkJcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9yZXN0b3JlKHBhZGFwdGVyKTsKLQotCQlpZiAoaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9fYXAyM2EocGFkYXB0ZXIpID09IHRydWUpCi0JCQlpc3N1ZV9udWxsZGF0YTIzYShwYWRhcHRlciwgTlVMTCwgMCwgMywgNTAwKTsKLQotCQlydGw4NzIzYV9tbG1lX3NpdGVzdXJ2ZXkocGFkYXB0ZXIsIDApOwotCi0JCXJlcG9ydF9zdXJ2ZXlkb25lX2V2ZW50MjNhKHBhZGFwdGVyKTsKLQotCQlwbWxtZWV4dC0+Y2hhbl9zY2FuX3RpbWUgPSBTVVJWRVlfVE87Ci0JCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fRElTQUJMRTsKLQl9Ci19Ci0KLS8qIGNvbGxlY3QgYnNzIGluZm8gZnJvbSBCZWFjb24gYW5kIFByb2JlIHJlcXVlc3QvcmVzcG9uc2UgZnJhbWVzLiAqLwotc3RhdGljIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjb2xsZWN0X2Jzc19pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYi0+ZGF0YTsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzc2lkOwotCWNvbnN0IHU4ICpwOwotCXU4ICpwaWU7Ci0JdW5zaWduZWQgaW50IGxlbmd0aDsKLQlpbnQgaTsKLQotCWxlbmd0aCA9IHNrYi0+bGVuOwotCi0JYnNzaWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCksIEdGUF9BVE9NSUMpOwotCWlmICghYnNzaWQpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKGllZWU4MDIxMV9pc19iZWFjb24obWdtdC0+ZnJhbWVfY29udHJvbCkpIHsKLQkJbGVuZ3RoIC09IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpOwotCQlwaWUgPSBtZ210LT51LmJlYWNvbi52YXJpYWJsZTsKLQkJYnNzaWQtPnJlc2VydmVkID0gMTsKLQkJYnNzaWQtPmNhcGFiaWxpdHkgPQotCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZtZ210LT51LmJlYWNvbi5jYXBhYl9pbmZvKTsKLQkJYnNzaWQtPmJlYWNvbl9pbnRlcnZhbCA9Ci0JCQlnZXRfdW5hbGlnbmVkX2xlMTYoJm1nbXQtPnUuYmVhY29uLmJlYWNvbl9pbnQpOwotCQlic3NpZC0+dHNmID0gZ2V0X3VuYWxpZ25lZF9sZTY0KCZtZ210LT51LmJlYWNvbi50aW1lc3RhbXApOwotCX0gZWxzZSBpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3JlcShtZ210LT5mcmFtZV9jb250cm9sKSkgewotCQlsZW5ndGggLT0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LnByb2JlX3JlcS52YXJpYWJsZSk7Ci0JCXBpZSA9IG1nbXQtPnUucHJvYmVfcmVxLnZhcmlhYmxlOwotCQlic3NpZC0+cmVzZXJ2ZWQgPSAyOwotCQlic3NpZC0+Y2FwYWJpbGl0eSA9IDA7Ci0JCWJzc2lkLT5iZWFjb25faW50ZXJ2YWwgPQotCQkJcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5kZXZfbmV0d29yay5iZWFjb25faW50ZXJ2YWw7Ci0JCWJzc2lkLT50c2YgPSAwOwotCX0gZWxzZSBpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AobWdtdC0+ZnJhbWVfY29udHJvbCkpIHsKLQkJbGVuZ3RoIC09Ci0JCQlvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUucHJvYmVfcmVzcC52YXJpYWJsZSk7Ci0JCXBpZSA9IG1nbXQtPnUucHJvYmVfcmVzcC52YXJpYWJsZTsKLQkJYnNzaWQtPnJlc2VydmVkID0gMzsKLQkJYnNzaWQtPmNhcGFiaWxpdHkgPQotCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZtZ210LT51LnByb2JlX3Jlc3AuY2FwYWJfaW5mbyk7Ci0JCWJzc2lkLT5iZWFjb25faW50ZXJ2YWwgPQotCQkJZ2V0X3VuYWxpZ25lZF9sZTE2KCZtZ210LT51LnByb2JlX3Jlc3AuYmVhY29uX2ludCk7Ci0JCWJzc2lkLT50c2YgPSBnZXRfdW5hbGlnbmVkX2xlNjQoJm1nbXQtPnUucHJvYmVfcmVzcC50aW1lc3RhbXApOwotCX0gZWxzZSB7Ci0JCWxlbmd0aCAtPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQkJcGllID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGU7Ci0JCWJzc2lkLT5yZXNlcnZlZCA9IDA7Ci0JCWJzc2lkLT5jYXBhYmlsaXR5ID0KLQkJCWdldF91bmFsaWduZWRfbGUxNigmbWdtdC0+dS5iZWFjb24uY2FwYWJfaW5mbyk7Ci0JCWJzc2lkLT5iZWFjb25faW50ZXJ2YWwgPQotCQkJcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5kZXZfbmV0d29yay5iZWFjb25faW50ZXJ2YWw7Ci0JCWJzc2lkLT50c2YgPSAwOwotCX0KLQotCWlmIChsZW5ndGggPiBNQVhfSUVfU1opIHsKLQkJLyogREJHXzg3MjNBKCJJRSB0b28gbG9uZyBmb3Igc3VydmV5IGV2ZW50XG4iKTsgKi8KLQkJa2ZyZWUoYnNzaWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlic3NpZC0+TGVuZ3RoID0gb2Zmc2V0b2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgsIElFcykgKyBsZW5ndGg7Ci0KLQkvKiBiZWxvdyBpcyB0byBjb3B5IHRoZSBpbmZvcm1hdGlvbiBlbGVtZW50ICovCi0JYnNzaWQtPklFTGVuZ3RoID0gbGVuZ3RoOwotCW1lbWNweShic3NpZC0+SUVzLCBwaWUsIGJzc2lkLT5JRUxlbmd0aCk7Ci0KLQkvKiBnZXQgdGhlIHNpZ25hbCBzdHJlbmd0aCAqLwotCS8qICBpbiBkQk0ucmF3IGRhdGEgKi8KLQlic3NpZC0+UnNzaSA9IHByZWN2X2ZyYW1lLT5hdHRyaWIucGh5X2luZm8uUmVjdlNpZ25hbFBvd2VyOwotCWJzc2lkLT5TaWduYWxRdWFsaXR5ID0KLQkJcHJlY3ZfZnJhbWUtPmF0dHJpYi5waHlfaW5mby5TaWduYWxRdWFsaXR5Oy8qIGluIHBlcmNlbnRhZ2UgKi8KLQlic3NpZC0+U2lnbmFsU3RyZW5ndGggPQotCQlwcmVjdl9mcmFtZS0+YXR0cmliLnBoeV9pbmZvLlNpZ25hbFN0cmVuZ3RoOy8qIGluIHBlcmNlbnRhZ2UgKi8KLQotCS8qICBjaGVja2luZyBTU0lEICovCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfU1NJRCwgYnNzaWQtPklFcywgYnNzaWQtPklFTGVuZ3RoKTsKLQotCWlmICghcCkgewotCQlEQkdfODcyM0EoIm1hcmM6IGNhbm5vdCBmaW5kIFNTSUQgZm9yIHN1cnZleSBldmVudFxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAocFsxXSA+IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKLQkJREJHXzg3MjNBKCIlcygpLSVkOiBJRSB0b28gbG9uZyAoJWQpIGZvciBzdXJ2ZXkgIgotCQkJICAiZXZlbnRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcFsxXSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JbWVtY3B5KGJzc2lkLT5Tc2lkLnNzaWQsIHAgKyAyLCBwWzFdKTsKLQlic3NpZC0+U3NpZC5zc2lkX2xlbiA9IHBbMV07Ci0KLQkvKiBjaGVja2luZyByYXRlIGluZm8uLi4gKi8KLQlpID0gMDsKLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TVVBQX1JBVEVTLCBic3NpZC0+SUVzLCBic3NpZC0+SUVMZW5ndGgpOwotCWlmIChwKSB7Ci0JCWlmIChwWzFdID4gTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYKSB7Ci0JCQlEQkdfODcyM0EoIiVzKCktJWQ6IElFIHRvbyBsb25nICglZCkgZm9yIHN1cnZleSAiCi0JCQkJICAiZXZlbnRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcFsxXSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJbWVtY3B5KGJzc2lkLT5TdXBwb3J0ZWRSYXRlcywgcCArIDIsIHBbMV0pOwotCQlpID0gcFsxXTsKLQl9Ci0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUywgYnNzaWQtPklFcywKLQkJCSAgICAgYnNzaWQtPklFTGVuZ3RoKTsKLQlpZiAocCkgewotCQlpZiAocFsxXSA+IChORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVgtaSkpIHsKLQkJCURCR184NzIzQSgiJXMoKS0lZDogSUUgdG9vIGxvbmcgKCVkKSBmb3Igc3VydmV5ICIKLQkJCQkgICJldmVudFxuIiwgX19mdW5jX18sIF9fTElORV9fLCBwWzFdKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQltZW1jcHkoYnNzaWQtPlN1cHBvcnRlZFJhdGVzICsgaSwgcCArIDIsIHBbMV0pOwotCX0KLQotCS8qICBDaGVja2luZyBmb3IgRFNDb25maWcgKi8KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9EU19QQVJBTVMsIGJzc2lkLT5JRXMsIGJzc2lkLT5JRUxlbmd0aCk7Ci0KLQlic3NpZC0+RFNDb25maWcgPSAwOwotCi0JaWYgKHApIHsKLQkJYnNzaWQtPkRTQ29uZmlnID0gcFsyXTsKLQl9IGVsc2Ugey8qICBJbiA1Rywgc29tZSBhcCBkbyBub3QgaGF2ZSBEU1NFVCBJRSAqLwotCQkvKiAgY2hlY2tpbmcgSFQgaW5mbyBmb3IgY2hhbm5lbCAqLwotCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sIGJzc2lkLT5JRXMsCi0JCQkJICAgICBic3NpZC0+SUVMZW5ndGgpOwotCQlpZiAocCkgewotCQkJc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKkhUX2luZm8gPQotCQkJCShzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqKShwICsgMik7Ci0JCQlic3NpZC0+RFNDb25maWcgPSBIVF9pbmZvLT5wcmltYXJ5X2NoYW47Ci0JCX0gZWxzZSAvKiAgdXNlIGN1cnJlbnQgY2hhbm5lbCAqLwotCQkJYnNzaWQtPkRTQ29uZmlnID0gcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKTsKLQl9Ci0KLQlpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3JlcShtZ210LT5mcmFtZV9jb250cm9sKSkgewotCQkvKiAgRklYTUUgKi8KLQkJYnNzaWQtPmlmbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0JCWV0aGVyX2FkZHJfY29weShic3NpZC0+TWFjQWRkcmVzcywgbWdtdC0+c2EpOwotCQlic3NpZC0+UHJpdmFjeSA9IDE7Ci0JCXJldHVybiBic3NpZDsKLQl9Ci0KLQlpZiAoYnNzaWQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfRVNTKSB7Ci0JCWJzc2lkLT5pZm1vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwotCQlldGhlcl9hZGRyX2NvcHkoYnNzaWQtPk1hY0FkZHJlc3MsIG1nbXQtPnNhKTsKLQl9IGVsc2UgewotCQlic3NpZC0+aWZtb2RlID0gTkw4MDIxMV9JRlRZUEVfQURIT0M7Ci0JCWV0aGVyX2FkZHJfY29weShic3NpZC0+TWFjQWRkcmVzcywgbWdtdC0+YnNzaWQpOwotCX0KLQotCWlmIChic3NpZC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQotCQlic3NpZC0+UHJpdmFjeSA9IDE7Ci0JZWxzZQotCQlic3NpZC0+UHJpdmFjeSA9IDA7Ci0KLQlic3NpZC0+QVRJTVdpbmRvdyA9IDA7Ci0KLQkvKiAyMC80MCBCU1MgQ29leGlzdGVuY2UgY2hlY2sgKi8KLQlpZiAocHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjID09IDEgJiYKLQkgICAgcG1sbWVpbmZvLT5id21vZGVfdXBkYXRlZCA9PSBmYWxzZSkgewotCQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksIGJzc2lkLT5JRXMsCi0JCQkJICAgICBic3NpZC0+SUVMZW5ndGgpOwotCQlpZiAocCAmJiBwWzFdID4gMCkgewotCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzOwotCi0JCQlwSFRfY2FwcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqKShwICsgMik7Ci0KLQkJCWlmIChwSFRfY2Fwcy0+Y2FwX2luZm8gJgotCQkJICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9DQVBfNDBNSFpfSU5UT0xFUkFOVCkpCi0JCQkJcG1sbWVwcml2LT5udW1fRm9ydHlNSHpJbnRvbGVyYW50Kys7Ci0JCX0gZWxzZQotCQkJcG1sbWVwcml2LT5udW1fc3RhX25vX2h0Kys7Ci0JfQotCi0KLQkvKiAgbWFyayBic3MgaW5mbyByZWNlaXZpbmcgZnJvbSBuZWFyYnkgY2hhbm5lbCBhcyBTaWduYWxRdWFsaXR5IDEwMSAqLwotCWlmIChic3NpZC0+RFNDb25maWcgIT0gcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSkKLQkJYnNzaWQtPlNpZ25hbFF1YWxpdHkgPSAxMDE7Ci0KLQlyZXR1cm4gYnNzaWQ7Ci1mYWlsOgotCWtmcmVlIChic3NpZCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2NyZWF0ZV9pYnNzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgc2hvcnQgY2FwczsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0KLQlwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPSAodTgpcG5ldHdvcmstPkRTQ29uZmlnOwotCXBtbG1laW5mby0+YmNuX2ludGVydmFsID0gcG5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbDsKLQotCS8qIHVwZGF0ZSB3aXJlbGVzcyBtb2RlICovCi0JdXBkYXRlX3dpcmVsZXNzX21vZGUyM2EocGFkYXB0ZXIpOwotCi0JLyogdXBkYXRlIGNhcGFiaWxpdHkgKi8KLQljYXBzID0gcG5ldHdvcmstPmNhcGFiaWxpdHk7Ci0JdXBkYXRlX2NhcGluZm8yM2EocGFkYXB0ZXIsIGNhcHMpOwotCWlmIChjYXBzICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpIHsJLyogYWRob2MgbWFzdGVyICovCi0JCXJ0bDg3MjNhX3NldF9zZWNfY2ZnKHBhZGFwdGVyLCAweGNmKTsKLQotCQkvKiBzd2l0Y2ggY2hhbm5lbCAqLwotCQkvKiBTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLCBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwsIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUpOyAqLwotCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSwgSFRfQ0hBTk5FTF9XSURUSF8yMCk7Ci0KLQkJcnRsODcyM2FfU2V0QmVhY29uUmVsYXRlZFJlZ2lzdGVycyhwYWRhcHRlcik7Ci0KLQkJLyogc2V0IG1zciB0byBNU1JfQURIT0MgKi8KLQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9BREhPQzsKLQkJcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhwYWRhcHRlciwgcG1sbWVpbmZvLT5zdGF0ZSAmIDB4Myk7Ci0KLQkJLyogaXNzdWUgYmVhY29uICovCi0JCWlmIChzZW5kX2JlYWNvbjIzYShwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJpc3N1aW5nIGJlYWNvbiBmcmFtZSBmYWlsLi4uLlxuIik7Ci0KLQkJCXJlcG9ydF9qb2luX3JlczIzYShwYWRhcHRlciwgLTEpOwotCQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0JCX0gZWxzZSB7Ci0JCQlod192YXJfc2V0X2Jzc2lkKHBhZGFwdGVyLCBwYWRhcHRlci0+cmVnaXN0cnlwcml2LmRldl9uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJaHdfdmFyX3NldF9tbG1lX2pvaW4ocGFkYXB0ZXIsIDApOwotCi0JCQlyZXBvcnRfam9pbl9yZXMyM2EocGFkYXB0ZXIsIDEpOwotCQkJcG1sbWVpbmZvLT5zdGF0ZSB8PSBXSUZJX0ZXX0FTU09DX1NVQ0NFU1M7Ci0JCX0KLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzOiBpbnZhbGlkIGNhcDoleFxuIiwgX19mdW5jX18sIGNhcHMpOwotCQlyZXR1cm47Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9jbG50X2pvaW4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBzaG9ydCBjYXBzOwotCXU4IHZhbDg7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCWludCBiZWFjb25fdGltZW91dDsKLQotCXBtbG1lZXh0LT5jdXJfY2hhbm5lbCA9ICh1OClwbmV0d29yay0+RFNDb25maWc7Ci0JcG1sbWVpbmZvLT5iY25faW50ZXJ2YWwgPSBwbmV0d29yay0+YmVhY29uX2ludGVydmFsOwotCi0JLyogdXBkYXRlIHdpcmVsZXNzIG1vZGUgKi8KLQl1cGRhdGVfd2lyZWxlc3NfbW9kZTIzYShwYWRhcHRlcik7Ci0KLQkvKiB1cGRhdGUgY2FwYWJpbGl0eSAqLwotCWNhcHMgPSBwbmV0d29yay0+Y2FwYWJpbGl0eTsKLQl1cGRhdGVfY2FwaW5mbzIzYShwYWRhcHRlciwgY2Fwcyk7Ci0JaWYgKGNhcHMgJiBXTEFOX0NBUEFCSUxJVFlfRVNTKSB7Ci0JCS8qIHN3aXRjaCBjaGFubmVsICovCi0JCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLCBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOwotCi0JCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMocGFkYXB0ZXIsIE1TUl9JTkZSQSk7Ci0KLQkJdmFsOCA9IChwbWxtZWluZm8tPmF1dGhfYWxnbyA9PSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYKSA/Ci0JCQkweGNjOiAweGNmOwotCi0JCXJ0bDg3MjNhX3NldF9zZWNfY2ZnKHBhZGFwdGVyLCB2YWw4KTsKLQotCQkvKiBzd2l0Y2ggY2hhbm5lbCAqLwotCQkvKiBzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsgKi8KLQotCQkvKiBoZXJlIHdhaXQgZm9yIHJlY2VpdmluZyB0aGUgYmVhY29uIHRvIHN0YXJ0IGF1dGggKi8KLQkJLyogYW5kIGVuYWJsZSBhIHRpbWVyICovCi0JCWJlYWNvbl90aW1lb3V0ID0gZGVjaWRlX3dhaXRfZm9yX2JlYWNvbl90aW1lb3V0MjNhKHBtbG1laW5mby0+YmNuX2ludGVydmFsKTsKLQkJc2V0X2xpbmtfdGltZXIocG1sbWVleHQsIGJlYWNvbl90aW1lb3V0KTsKLQkJbW9kX3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuYXNzb2NfdGltZXIsIGppZmZpZXMgKwotCQkJICBtc2Vjc190b19qaWZmaWVzKChSRUFVVEhfVE8gKiBSRUFVVEhfTElNSVQpICsgKFJFQVNTT0NfVE8qUkVBU1NPQ19MSU1JVCkgKyBiZWFjb25fdGltZW91dCkpOwotCQlwbWxtZWluZm8tPnN0YXRlID0gV0lGSV9GV19BVVRIX05VTEwgfCBNU1JfSU5GUkE7Ci0JfSBlbHNlIGlmIChjYXBzICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpIHsJLyogYWRob2MgY2xpZW50ICovCi0JCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMocGFkYXB0ZXIsIE1TUl9BREhPQyk7Ci0KLQkJcnRsODcyM2Ffc2V0X3NlY19jZmcocGFkYXB0ZXIsIDB4Y2YpOwotCi0JCS8qIHN3aXRjaCBjaGFubmVsICovCi0JCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLCBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOwotCi0JCXJ0bDg3MjNhX1NldEJlYWNvblJlbGF0ZWRSZWdpc3RlcnMocGFkYXB0ZXIpOwotCi0JCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfQURIT0M7Ci0KLQkJcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCAxKTsKLQl9IGVsc2UgewotCQkvKiBEQkdfODcyM0EoIm1hcmM6IGludmFsaWQgY2FwOiV4XG4iLCBjYXBzKTsgKi8KLQkJcmV0dXJuOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfY2xudF9hdXRoKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+bGlua190aW1lcik7Ci0KLQlwbWxtZWluZm8tPnN0YXRlICY9ICh+V0lGSV9GV19BVVRIX05VTEwpOwotCXBtbG1laW5mby0+c3RhdGUgfD0gV0lGSV9GV19BVVRIX1NUQVRFOwotCi0JcG1sbWVpbmZvLT5hdXRoX3NlcSA9IDE7Ci0JcG1sbWVpbmZvLT5yZWF1dGhfY291bnQgPSAwOwotCXBtbG1laW5mby0+cmVhc3NvY19jb3VudCA9IDA7Ci0JcG1sbWVpbmZvLT5saW5rX2NvdW50ID0gMDsKLQlwbWxtZWV4dC0+cmV0cnkgPSAwOwotCi0JLyogIEJlY2F1c2Ugb2YgQVAncyBub3QgcmVjZWl2aW5nIGRlYXV0aCBiZWZvcmUgKi8KLQkvKiAgQVAgbWF5OiAxKW5vdCByZXNwb25zZSBhdXRoIG9yIDIpZGVhdXRoIHVzIGFmdGVyIGxpbmsgaXMgY29tcGxldGUgKi8KLQkvKiAgaXNzdWUgZGVhdXRoIGJlZm9yZSBpc3N1aW5nIGF1dGggdG8gZGVhbCB3aXRoIHRoZSBzaXR1YXRpb24gKi8KLQkvKglDb21tZW50ZWQgYnkgQWxiZXJ0IDIwMTIvMDcvMjEgKi8KLQkvKglGb3IgdGhlIFdpbjggUDJQIGNvbm5lY3Rpb24sIGl0IHdpbGwgYmUgaGFyZCB0byBoYXZlIGEKLQkJc3VjY2Vzc2Z1bCBjb25uZWN0aW9uIGlmIHRoaXMgV2ktRmkgZG9lc24ndCBjb25uZWN0IHRvIGl0LiAqLwotCWlzc3VlX2RlYXV0aDIzYShwYWRhcHRlciwgKCZwbWxtZWluZm8tPm5ldHdvcmspLT5NYWNBZGRyZXNzLAotCQkJV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOwotCi0JREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywgInN0YXJ0IGF1dGhcbiIpOwotCWlzc3VlX2F1dGgocGFkYXB0ZXIsIE5VTEwsIDApOwotCi0Jc2V0X2xpbmtfdGltZXIocG1sbWVleHQsIFJFQVVUSF9UTyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2NsbnRfYXNzb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQotCXBtbG1laW5mby0+c3RhdGUgJj0gKH4oV0lGSV9GV19BVVRIX05VTEwgfCBXSUZJX0ZXX0FVVEhfU1RBVEUpKTsKLQlwbWxtZWluZm8tPnN0YXRlIHw9IChXSUZJX0ZXX0FVVEhfU1VDQ0VTUyB8IFdJRklfRldfQVNTT0NfU1RBVEUpOwotCi0JaXNzdWVfYXNzb2NyZXEocGFkYXB0ZXIpOwotCi0Jc2V0X2xpbmtfdGltZXIocG1sbWVleHQsIFJFQVNTT0NfVE8pOwotfQotCi1pbnQgcmVjZWl2ZV9kaXNjb25uZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuc2lnbmVkIGNoYXIgKk1hY0FkZHIsIHVuc2lnbmVkIHNob3J0IHJlYXNvbikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JLyogY2hlY2sgQTMgKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwoTWFjQWRkciwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKSkKLQkJcmV0dXJuIF9TVUNDRVNTOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9JTkZSQSkgewotCQlpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykgewotCQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0JCQlyZXBvcnRfZGVsX3N0YV9ldmVudDIzYShwYWRhcHRlciwgTWFjQWRkciwgcmVhc29uKTsKLQotCQl9IGVsc2UgaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0xJTktJTkdfU1RBVEUpIHsKLQkJCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOwotCQkJcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCAtMik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3NfODAyMTFkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYnNzaWQpCi17Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0OwotCXN0cnVjdCBydF9jaGFubmVsX2luZm8gKmNocGxhbl9uZXc7Ci0JdTggY2hhbm5lbDsKLQl1OCBpOwotCi0JcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCS8qICBBZGp1c3QgY2hhbm5lbCBwbGFuIGJ5IEFQIENvdW50cnkgSUUgKi8KLQlpZiAocHJlZ2lzdHJ5cHJpdi0+ZW5hYmxlODAyMTFkICYmCi0JICAgICFwbWxtZWV4dC0+dXBkYXRlX2NoYW5uZWxfcGxhbl9ieV9hcF9kb25lKSB7Ci0JCWNvbnN0IHU4ICppZSwgKnA7Ci0JCXN0cnVjdCBydF9jaGFubmVsX3BsYW4gY2hwbGFuX2FwOwotCQlzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvIGNocGxhbl9zdGFbTUFYX0NIQU5ORUxfTlVNXTsKLQkJdTggY291bnRyeVs0XTsKLQkJdTggZmNuOyAvKiAgZmlyc3QgY2hhbm5lbCBudW1iZXIgKi8KLQkJdTggbm9jOyAvKiAgbnVtYmVyIG9mIGNoYW5uZWwgKi8KLQkJdTggaiwgazsKLQotCQlpZSA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfQ09VTlRSWSwgYnNzaWQtPklFcywKLQkJCQkgICAgICBic3NpZC0+SUVMZW5ndGgpOwotCQlpZiAoIWllIHx8IGllWzFdIDwgSUVFRTgwMjExX0NPVU5UUllfSUVfTUlOX0xFTikKLQkJCXJldHVybjsKLQotCQlwID0gaWUgKyAyOwotCQlpZSArPSBpZVsxXTsKLQkJaWUgKz0gMjsKLQotCQltZW1jcHkoY291bnRyeSwgcCwgMyk7Ci0JCWNvdW50cnlbM10gPSAnXDAnOwotCi0JCXAgKz0gMzsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJCSAiJXM6IDgwMi4xMWQgY291bnRyeSA9JXNcbiIsIF9fZnVuY19fLCBjb3VudHJ5KTsKLQotCQlpID0gMDsKLQkJd2hpbGUgKChpZSAtIHApID49IDMpIHsKLQkJCWZjbiA9ICoocCsrKTsKLQkJCW5vYyA9ICoocCsrKTsKLQkJCXArKzsKLQotCQkJZm9yIChqID0gMDsgaiA8IG5vYzsgaisrKSB7Ci0JCQkJaWYgKGZjbiA8PSAxNCkKLQkJCQkJY2hhbm5lbCA9IGZjbiArIGo7IC8qICAyLjQgR0h6ICovCi0JCQkJZWxzZQotCQkJCQljaGFubmVsID0gZmNuICsgaiAqIDQ7IC8qICA1IEdIeiAqLwotCi0JCQkJY2hwbGFuX2FwLkNoYW5uZWxbaSsrXSA9IGNoYW5uZWw7Ci0JCQl9Ci0JCX0KLQkJY2hwbGFuX2FwLkxlbiA9IGk7Ci0KLQkJbWVtY3B5KGNocGxhbl9zdGEsIHBtbG1lZXh0LT5jaGFubmVsX3NldCwgc2l6ZW9mKGNocGxhbl9zdGEpKTsKLQkJbWVtc2V0KHBtbG1lZXh0LT5jaGFubmVsX3NldCwgMCwgc2l6ZW9mKHBtbG1lZXh0LT5jaGFubmVsX3NldCkpOwotCQljaHBsYW5fbmV3ID0gcG1sbWVleHQtPmNoYW5uZWxfc2V0OwotCi0JCWkgPSBqID0gayA9IDA7Ci0JCWlmIChwcmVnaXN0cnlwcml2LT53aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFHKSB7Ci0JCQlkbyB7Ci0JCQkJaWYgKGkgPT0gTUFYX0NIQU5ORUxfTlVNIHx8Ci0JCQkJICAgIGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA9PSAwIHx8Ci0JCQkJICAgIGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA+IDE0KQotCQkJCQlicmVhazsKLQotCQkJCWlmIChqID09IGNocGxhbl9hcC5MZW4gfHwKLQkJCQkgICAgY2hwbGFuX2FwLkNoYW5uZWxbal0gPiAxNCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAoY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtID09Ci0JCQkJICAgIGNocGxhbl9hcC5DaGFubmVsW2pdKSB7Ci0JCQkJCWNocGxhbl9uZXdba10uQ2hhbm5lbE51bSA9Ci0JCQkJCQljaHBsYW5fYXAuQ2hhbm5lbFtqXTsKLQkJCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCQkJCQlpKys7Ci0JCQkJCWorKzsKLQkJCQkJaysrOwotCQkJCX0gZWxzZSBpZiAoY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtIDwKLQkJCQkJICAgY2hwbGFuX2FwLkNoYW5uZWxbal0pIHsKLQkJCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0KLQkJCQkJCWNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bTsKLQkJCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9Ci0JCQkJCQlTQ0FOX1BBU1NJVkU7Ci0JCQkJCWkrKzsKLQkJCQkJaysrOwotCQkJCX0gZWxzZSBpZiAoY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtID4KLQkJCQkJICAgY2hwbGFuX2FwLkNoYW5uZWxbal0pIHsKLQkJCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0KLQkJCQkJCWNocGxhbl9hcC5DaGFubmVsW2pdOwotCQkJCQljaHBsYW5fbmV3W2tdLlNjYW5UeXBlID0KLQkJCQkJCVNDQU5fQUNUSVZFOwotCQkJCQlqKys7Ci0JCQkJCWsrKzsKLQkJCQl9Ci0JCQl9IHdoaWxlICgxKTsKLQotCQkJLyogIGNoYW5nZSBBUCBub3Qgc3VwcG9ydCBjaGFubmVsIHRvIFBhc3NpdmUgc2NhbiAqLwotCQkJd2hpbGUgKGkgPCBNQVhfQ0hBTk5FTF9OVU0gJiYKLQkJCSAgICAgICBjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gIT0gMCAmJgotCQkJICAgICAgIGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA8PSAxNCkgewotCQkJCWNocGxhbl9uZXdba10uQ2hhbm5lbE51bSA9Ci0JCQkJCWNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bTsKLQkJCQljaHBsYW5fbmV3W2tdLlNjYW5UeXBlID0gU0NBTl9QQVNTSVZFOwotCQkJCWkrKzsKLQkJCQlrKys7Ci0JCQl9Ci0KLQkJCS8qICBhZGQgY2hhbm5lbCBBUCBzdXBwb3J0ZWQgKi8KLQkJCXdoaWxlIChqIDwgY2hwbGFuX2FwLkxlbiAmJiBjaHBsYW5fYXAuQ2hhbm5lbFtqXSA8PSAxNCl7Ci0JCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0gY2hwbGFuX2FwLkNoYW5uZWxbal07Ci0JCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9IFNDQU5fQUNUSVZFOwotCQkJCWorKzsKLQkJCQlrKys7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKiAga2VlcCBvcmlnaW5hbCBTVEEgMi40RyBjaGFubmVsIHBsYW4gKi8KLQkJCXdoaWxlIChpIDwgTUFYX0NIQU5ORUxfTlVNICYmCi0JCQkgICAgICAgY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtICE9IDAgJiYKLQkJCSAgICAgICBjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gPD0gMTQpIHsKLQkJCQljaHBsYW5fbmV3W2tdLkNoYW5uZWxOdW0gPQotCQkJCQljaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW07Ci0JCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9IGNocGxhbl9zdGFbaV0uU2NhblR5cGU7Ci0JCQkJaSsrOwotCQkJCWsrKzsKLQkJCX0KLQotCQkJLyogIHNraXAgQVAgMi40RyBjaGFubmVsIHBsYW4gKi8KLQkJCXdoaWxlIChqIDwgY2hwbGFuX2FwLkxlbiAmJiBjaHBsYW5fYXAuQ2hhbm5lbFtqXSA8PSAxNCkKLQkJCQlqKys7Ci0JCX0KLQotCQlpZiAocHJlZ2lzdHJ5cHJpdi0+d2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExQSkgewotCQkJZG8gewotCQkJCWlmIChpID09IE1BWF9DSEFOTkVMX05VTSB8fAotCQkJCSAgICBjaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW0gPT0gMCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQlpZiAoaiA9PSBjaHBsYW5fYXAuTGVuIHx8Ci0JCQkJICAgIGNocGxhbl9hcC5DaGFubmVsW2pdID09IDApCi0JCQkJCWJyZWFrOwotCi0JCQkJaWYgKGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA9PQotCQkJCSAgICBjaHBsYW5fYXAuQ2hhbm5lbFtqXSkgewotCQkJCQljaHBsYW5fbmV3W2tdLkNoYW5uZWxOdW0gPQotCQkJCQkJY2hwbGFuX2FwLkNoYW5uZWxbal07Ci0JCQkJCWNocGxhbl9uZXdba10uU2NhblR5cGUgPSBTQ0FOX0FDVElWRTsKLQkJCQkJaSsrOwotCQkJCQlqKys7Ci0JCQkJCWsrKzsKLQkJCQl9IGVsc2UgaWYgKGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSA8Ci0JCQkJCSAgIGNocGxhbl9hcC5DaGFubmVsW2pdKSB7Ci0JCQkJCWNocGxhbl9uZXdba10uQ2hhbm5lbE51bSA9Ci0JCQkJCQljaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW07Ci0JCQkJCWNocGxhbl9uZXdba10uU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7Ci0JCQkJCWkrKzsKLQkJCQkJaysrOwotCQkJCX0gZWxzZSBpZiAoY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtID4KLQkJCQkJICAgY2hwbGFuX2FwLkNoYW5uZWxbal0pIHsKLQkJCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0KLQkJCQkJCWNocGxhbl9hcC5DaGFubmVsW2pdOwotCQkJCQljaHBsYW5fbmV3W2tdLlNjYW5UeXBlID0gU0NBTl9BQ1RJVkU7Ci0JCQkJCWorKzsKLQkJCQkJaysrOwotCQkJCX0KLQkJCX0gd2hpbGUgKDEpOwotCi0JCQkvKiAgY2hhbmdlIEFQIG5vdCBzdXBwb3J0IGNoYW5uZWwgdG8gUGFzc2l2ZSBzY2FuICovCi0JCQl3aGlsZSAoaSA8IE1BWF9DSEFOTkVMX05VTSAmJgotCQkJICAgICAgIGNocGxhbl9zdGFbaV0uQ2hhbm5lbE51bSAhPSAwKSB7Ci0JCQkJY2hwbGFuX25ld1trXS5DaGFubmVsTnVtID0KLQkJCQkJY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtOwotCQkJCWNocGxhbl9uZXdba10uU2NhblR5cGUgPSBTQ0FOX1BBU1NJVkU7Ci0JCQkJaSsrOwotCQkJCWsrKzsKLQkJCX0KLQotCQkJLyogIGFkZCBjaGFubmVsIEFQIHN1cHBvcnRlZCAqLwotCQkJd2hpbGUgKGogPCBjaHBsYW5fYXAuTGVuICYmIGNocGxhbl9hcC5DaGFubmVsW2pdICE9IDApIHsKLQkJCQljaHBsYW5fbmV3W2tdLkNoYW5uZWxOdW0gPSBjaHBsYW5fYXAuQ2hhbm5lbFtqXTsKLQkJCQljaHBsYW5fbmV3W2tdLlNjYW5UeXBlID0gU0NBTl9BQ1RJVkU7Ci0JCQkJaisrOwotCQkJCWsrKzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qICBrZWVwIG9yaWdpbmFsIFNUQSA1RyBjaGFubmVsIHBsYW4gKi8KLQkJCXdoaWxlIChpIDwgTUFYX0NIQU5ORUxfTlVNICYmCi0JCQkgICAgICAgY2hwbGFuX3N0YVtpXS5DaGFubmVsTnVtICE9IDApIHsKLQkJCQljaHBsYW5fbmV3W2tdLkNoYW5uZWxOdW0gPQotCQkJCQljaHBsYW5fc3RhW2ldLkNoYW5uZWxOdW07Ci0JCQkJY2hwbGFuX25ld1trXS5TY2FuVHlwZSA9IGNocGxhbl9zdGFbaV0uU2NhblR5cGU7Ci0JCQkJaSsrOwotCQkJCWsrKzsKLQkJCX0KLQkJfQotCQlwbWxtZWV4dC0+dXBkYXRlX2NoYW5uZWxfcGxhbl9ieV9hcF9kb25lID0gMTsKLQl9Ci0KLQkvKiAgSWYgY2hhbm5lbCBpcyB1c2VkIGJ5IEFQLCBzZXQgY2hhbm5lbCBzY2FuIHR5cGUgdG8gYWN0aXZlICovCi0JY2hhbm5lbCA9IGJzc2lkLT5EU0NvbmZpZzsKLQljaHBsYW5fbmV3ID0gcG1sbWVleHQtPmNoYW5uZWxfc2V0OwotCWkgPSAwOwotCXdoaWxlIChpIDwgTUFYX0NIQU5ORUxfTlVNICYmIGNocGxhbl9uZXdbaV0uQ2hhbm5lbE51bSAhPSAwKSB7Ci0JCWlmIChjaHBsYW5fbmV3W2ldLkNoYW5uZWxOdW0gPT0gY2hhbm5lbCkgewotCQkJaWYgKGNocGxhbl9uZXdbaV0uU2NhblR5cGUgPT0gU0NBTl9QQVNTSVZFKSB7Ci0JCQkJLyogNUcgQm5hZCAyLCAzIChERlMpIGRvZXNuJ3QgY2hhbmdlCi0JCQkJICAgdG8gYWN0aXZlIHNjYW4gKi8KLQkJCQlpZiAoY2hhbm5lbCA+PSA1MiAmJiBjaGFubmVsIDw9IDE0NCkKLQkJCQkJYnJlYWs7Ci0KLQkJCQljaHBsYW5fbmV3W2ldLlNjYW5UeXBlID0gU0NBTl9BQ1RJVkU7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJCQkJICIlczogY2hhbmdlIGNoYW5uZWwgJWQgc2NhbiB0eXBlIGZyb20gcGFzc2l2ZSB0byBhY3RpdmVcbiIsCi0JCQkJCSBfX2Z1bmNfXywgY2hhbm5lbCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQlpKys7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1Gb2xsb3dpbmcgYXJlIHRoZSBmdW5jdGlvbnMgdG8gcmVwb3J0IGV2ZW50cwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCByZXBvcnRfc3VydmV5X2V2ZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCXN0cnVjdCBjbWRfb2JqICpwY21kX29iajsKLQl1OCAqcGV2dGNtZDsKLQl1MzIgY21kc3o7Ci0Jc3RydWN0IHN1cnZleV9ldmVudCAqcHN1cnZleV9ldnQ7Ci0Jc3RydWN0IEMySEV2ZW50X0hlYWRlciAqcGMyaF9ldnRfaGRyOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2OwotCi0JaWYgKCFwYWRhcHRlcikKLQkJcmV0dXJuOwotCi0JcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCi0JcGNtZF9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGNtZF9vYmopCi0JCXJldHVybjsKLQotCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwotCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBldnRjbWQpIHsKLQkJa2ZyZWUocGNtZF9vYmopOwotCQlyZXR1cm47Ci0JfQotCi0JcGNtZF9vYmotPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCk7Ci0JcGNtZF9vYmotPmNtZHN6ID0gY21kc3o7Ci0JcGNtZF9vYmotPnBhcm1idWYgPSBwZXZ0Y21kOwotCi0JcGNtZF9vYmotPnJzcCA9IE5VTEw7Ci0JcGNtZF9vYmotPnJzcHN6ICA9IDA7Ci0KLQlwYzJoX2V2dF9oZHIgPSAoc3RydWN0IEMySEV2ZW50X0hlYWRlciAqKShwZXZ0Y21kKTsKLQlwYzJoX2V2dF9oZHItPmxlbiA9IHNpemVvZihzdHJ1Y3Qgc3VydmV5X2V2ZW50KTsKLQlwYzJoX2V2dF9oZHItPklEID0gR0VOX0VWVF9DT0RFKF9TdXJ2ZXkpOwotCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwotCi0JcHN1cnZleV9ldnQgPSAoc3RydWN0IHN1cnZleV9ldmVudCopKHBldnRjbWQgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwotCi0JcHN1cnZleV9ldnQtPmJzcyA9IGNvbGxlY3RfYnNzX2luZm8ocGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKLQlpZiAoIXBzdXJ2ZXlfZXZ0LT5ic3MpIHsKLQkJa2ZyZWUocGNtZF9vYmopOwotCQlrZnJlZShwZXZ0Y21kKTsKLQkJcmV0dXJuOwotCX0KLQotCXByb2Nlc3NfODAyMTFkKHBhZGFwdGVyLCBwc3VydmV5X2V2dC0+YnNzKTsKLQotCXJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGNtZF9vYmopOwotCi0JcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmJzc19jbnQrKzsKLX0KLQotdm9pZCByZXBvcnRfc3VydmV5ZG9uZV9ldmVudDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBjbWRfb2JqICpwY21kX29iajsKLQl1OCAqcGV2dGNtZDsKLQl1MzIgY21kc3o7Ci0Jc3RydWN0IHN1cnZleWRvbmVfZXZlbnQgKnBzdXJ2ZXlkb25lX2V2dDsKLQlzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyICpwYzJoX2V2dF9oZHI7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCi0JcGNtZF9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaiksIEdGUF9BVE9NSUMpOwotCWlmICghcGNtZF9vYmopCi0JCXJldHVybjsKLQotCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKLQlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwZXZ0Y21kKSB7Ci0JCWtmcmVlKHBjbWRfb2JqKTsKLQkJcmV0dXJuOwotCX0KLQotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOwotCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwotCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKLQotCXBjbWRfb2JqLT5yc3AgPSBOVUxMOwotCXBjbWRfb2JqLT5yc3BzeiAgPSAwOwotCi0JcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7Ci0JcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN1cnZleWRvbmVfZXZlbnQpOwotCXBjMmhfZXZ0X2hkci0+SUQgPSBHRU5fRVZUX0NPREUoX1N1cnZleURvbmUpOwotCXBjMmhfZXZ0X2hkci0+c2VxID0gYXRvbWljX2luY19yZXR1cm4oJnBtbG1lZXh0LT5ldmVudF9zZXEpOwotCi0JcHN1cnZleWRvbmVfZXZ0ID0gKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50KikocGV2dGNtZCArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7Ci0JcHN1cnZleWRvbmVfZXZ0LT5ic3NfY250ID0gcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmJzc19jbnQ7Ci0KLQlEQkdfODcyM0EoInN1cnZleSBkb25lIGV2ZW50KCV4KVxuIiwgcHN1cnZleWRvbmVfZXZ0LT5ic3NfY250KTsKLQotCXJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGNtZF9vYmopOwotfQotCi12b2lkIHJlcG9ydF9qb2luX3JlczIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgcmVzKQotewotCXN0cnVjdCBjbWRfb2JqICpwY21kX29iajsKLQl1OCAqcGV2dGNtZDsKLQl1MzIgY21kc3o7Ci0Jc3RydWN0IGpvaW5ic3NfZXZlbnQJCSpwam9pbmJzc19ldnQ7Ci0Jc3RydWN0IEMySEV2ZW50X0hlYWRlcgkqcGMyaF9ldnRfaGRyOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2CQkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0KLQlwY21kX29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwY21kX29iaikKLQkJcmV0dXJuOwotCi0JY21kc3ogPSBzaXplb2Yoc3RydWN0IGpvaW5ic3NfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwotCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBldnRjbWQpIHsKLQkJa2ZyZWUocGNtZF9vYmopOwotCQlyZXR1cm47Ci0JfQotCi0JcGNtZF9vYmotPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCk7Ci0JcGNtZF9vYmotPmNtZHN6ID0gY21kc3o7Ci0JcGNtZF9vYmotPnBhcm1idWYgPSBwZXZ0Y21kOwotCi0JcGNtZF9vYmotPnJzcCA9IE5VTEw7Ci0JcGNtZF9vYmotPnJzcHN6ICA9IDA7Ci0KLQlwYzJoX2V2dF9oZHIgPSAoc3RydWN0IEMySEV2ZW50X0hlYWRlciAqKShwZXZ0Y21kKTsKLQlwYzJoX2V2dF9oZHItPmxlbiA9IHNpemVvZihzdHJ1Y3Qgam9pbmJzc19ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfSm9pbkJzcyk7Ci0JcGMyaF9ldnRfaGRyLT5zZXEgPSBhdG9taWNfaW5jX3JldHVybigmcG1sbWVleHQtPmV2ZW50X3NlcSk7Ci0KLQlwam9pbmJzc19ldnQgPSAoc3RydWN0IGpvaW5ic3NfZXZlbnQqKShwZXZ0Y21kICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKLQltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikmcGpvaW5ic3NfZXZ0LT5uZXR3b3JrLm5ldHdvcmssCi0JICAgICAgICZwbWxtZWluZm8tPm5ldHdvcmssIHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCkpOwotCXBqb2luYnNzX2V2dC0+bmV0d29yay5qb2luX3JlcyA9IHJlczsKLQotCURCR184NzIzQSgicmVwb3J0X2pvaW5fcmVzMjNhKCVkKVxuIiwgcmVzKTsKLQotCXJ0d19qb2luYnNzX2V2ZW50X3ByZWhhbmRsZTIzYShwYWRhcHRlciwgKHU4ICopJnBqb2luYnNzX2V2dC0+bmV0d29yayk7Ci0KLQlydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBjbWRfb2JqKTsKLX0KLQotdm9pZCByZXBvcnRfZGVsX3N0YV9ldmVudDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICB1bnNpZ25lZCBjaGFyICpNYWNBZGRyLCB1bnNpZ25lZCBzaG9ydCByZWFzb24pCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBjbWRfb2JqOwotCXU4ICpwZXZ0Y21kOwotCXUzMiBjbWRzejsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0JaW50IG1hY19pZDsKLQlzdHJ1Y3Qgc3RhZGVsX2V2ZW50ICpwZGVsX3N0YV9ldnQ7Ci0Jc3RydWN0IEMySEV2ZW50X0hlYWRlciAqcGMyaF9ldnRfaGRyOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKLQotCXBjbWRfb2JqID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBjbWRfb2JqKQotCQlyZXR1cm47Ci0KLQljbWRzeiA9IHNpemVvZihzdHJ1Y3Qgc3RhZGVsX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKLQlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwZXZ0Y21kKSB7Ci0JCWtmcmVlKHBjbWRfb2JqKTsKLQkJcmV0dXJuOwotCX0KLQotCXBjbWRfb2JqLT5jbWRjb2RlID0gR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpOwotCXBjbWRfb2JqLT5jbWRzeiA9IGNtZHN6OwotCXBjbWRfb2JqLT5wYXJtYnVmID0gcGV2dGNtZDsKLQotCXBjbWRfb2JqLT5yc3AgPSBOVUxMOwotCXBjbWRfb2JqLT5yc3BzeiAgPSAwOwotCi0JcGMyaF9ldnRfaGRyID0gKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKikocGV2dGNtZCk7Ci0JcGMyaF9ldnRfaGRyLT5sZW4gPSBzaXplb2Yoc3RydWN0IHN0YWRlbF9ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfRGVsU1RBKTsKLQlwYzJoX2V2dF9oZHItPnNlcSA9IGF0b21pY19pbmNfcmV0dXJuKCZwbWxtZWV4dC0+ZXZlbnRfc2VxKTsKLQotCXBkZWxfc3RhX2V2dCA9IChzdHJ1Y3Qgc3RhZGVsX2V2ZW50KikocGV2dGNtZCArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7Ci0JZXRoZXJfYWRkcl9jb3B5KCh1bnNpZ25lZCBjaGFyICopJnBkZWxfc3RhX2V2dC0+bWFjYWRkciwgTWFjQWRkcik7Ci0JbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopcGRlbF9zdGFfZXZ0LT5yc3ZkLCAodW5zaWduZWQgY2hhciAqKSZyZWFzb24sCi0JICAgICAgIDIpOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsIE1hY0FkZHIpOwotCWlmIChwc3RhKQotCQltYWNfaWQgPSAoaW50KXBzdGEtPm1hY19pZDsKLQllbHNlCi0JCW1hY19pZCA9IC0xOwotCi0JcGRlbF9zdGFfZXZ0LT5tYWNfaWQgPSBtYWNfaWQ7Ci0KLQlEQkdfODcyM0EoInJlcG9ydF9kZWxfc3RhX2V2ZW50MjNhOiBkZWxldGUgU1RBLCBtYWNfaWQgPSVkXG4iLCBtYWNfaWQpOwotCi0JcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwY21kX29iaik7Ci19Ci0KLXZvaWQgcmVwb3J0X2FkZF9zdGFfZXZlbnQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgdW5zaWduZWQgY2hhciAqTWFjQWRkciwgaW50IGNhbV9pZHgpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBjbWRfb2JqOwotCXU4ICpwZXZ0Y21kOwotCXUzMiBjbWRzejsKLQlzdHJ1Y3Qgc3Rhc3NvY19ldmVudCAqcGFkZF9zdGFfZXZ0OwotCXN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKnBjMmhfZXZ0X2hkcjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0KLQlwY21kX29iaiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwY21kX29iaikKLQkJcmV0dXJuOwotCi0JY21kc3ogPSBzaXplb2Yoc3RydWN0IHN0YXNzb2NfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwotCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfQVRPTUlDKTsKLQlpZiAoIXBldnRjbWQpIHsKLQkJa2ZyZWUocGNtZF9vYmopOwotCQlyZXR1cm47Ci0JfQotCi0JcGNtZF9vYmotPmNtZGNvZGUgPSBHRU5fQ01EX0NPREUoX1NldF9NTE1FX0VWVCk7Ci0JcGNtZF9vYmotPmNtZHN6ID0gY21kc3o7Ci0JcGNtZF9vYmotPnBhcm1idWYgPSBwZXZ0Y21kOwotCi0JcGNtZF9vYmotPnJzcCA9IE5VTEw7Ci0JcGNtZF9vYmotPnJzcHN6ICA9IDA7Ci0KLQlwYzJoX2V2dF9oZHIgPSAoc3RydWN0IEMySEV2ZW50X0hlYWRlciAqKShwZXZ0Y21kKTsKLQlwYzJoX2V2dF9oZHItPmxlbiA9IHNpemVvZihzdHJ1Y3Qgc3Rhc3NvY19ldmVudCk7Ci0JcGMyaF9ldnRfaGRyLT5JRCA9IEdFTl9FVlRfQ09ERShfQWRkU1RBKTsKLQlwYzJoX2V2dF9oZHItPnNlcSA9IGF0b21pY19pbmNfcmV0dXJuKCZwbWxtZWV4dC0+ZXZlbnRfc2VxKTsKLQotCXBhZGRfc3RhX2V2dCA9IChzdHJ1Y3Qgc3Rhc3NvY19ldmVudCopKHBldnRjbWQgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwotCWV0aGVyX2FkZHJfY29weSgodW5zaWduZWQgY2hhciAqKSZwYWRkX3N0YV9ldnQtPm1hY2FkZHIsIE1hY0FkZHIpOwotCXBhZGRfc3RhX2V2dC0+Y2FtX2lkID0gY2FtX2lkeDsKLQotCURCR184NzIzQSgicmVwb3J0X2FkZF9zdGFfZXZlbnQyM2E6IGFkZCBTVEFcbiIpOwotCi0JcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwY21kX29iaik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLUZvbGxvd2luZyBhcmUgdGhlIGV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9ucwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZm9yIHN0YS9hZGhvYyBtb2RlICovCi12b2lkIHVwZGF0ZV9zdGFfaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JLyogRVJQICovCi0JVkNTX3VwZGF0ZTIzYShwYWRhcHRlciwgcHN0YSk7Ci0KLQkvKiBIVCAqLwotCWlmIChwbWxtZXByaXYtPmh0cHJpdi5odF9vcHRpb24pIHsKLQkJcHN0YS0+aHRwcml2Lmh0X29wdGlvbiA9IHRydWU7Ci0KLQkJcHN0YS0+aHRwcml2LmFtcGR1X2VuYWJsZSA9IHBtbG1lcHJpdi0+aHRwcml2LmFtcGR1X2VuYWJsZTsKLQotCQlpZiAoc3VwcG9ydF9zaG9ydF9HSTIzYShwYWRhcHRlciwgJnBtbG1laW5mby0+aHRfY2FwKSkKLQkJCXBzdGEtPmh0cHJpdi5zZ2kgPSB0cnVlOwotCi0JCXBzdGEtPnFvc19vcHRpb24gPSB0cnVlOwotCi0JfSBlbHNlIHsKLQkJcHN0YS0+aHRwcml2Lmh0X29wdGlvbiA9IGZhbHNlOwotCi0JCXBzdGEtPmh0cHJpdi5hbXBkdV9lbmFibGUgPSBmYWxzZTsKLQotCQlwc3RhLT5odHByaXYuc2dpID0gZmFsc2U7Ci0JCXBzdGEtPnFvc19vcHRpb24gPSBmYWxzZTsKLQotCX0KLQlwc3RhLT5odHByaXYuYndtb2RlID0gcG1sbWVleHQtPmN1cl9id21vZGU7Ci0JcHN0YS0+aHRwcml2LmNoX29mZnNldCA9IHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0OwotCi0JcHN0YS0+aHRwcml2LmFnZ19lbmFibGVfYml0bWFwID0gMHgwOy8qIHJlc2V0ICovCi0JcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwID0gMHgwOy8qIHJlc2V0ICovCi0KLQkvKiBRb1MgKi8KLQlpZiAocG1sbWVwcml2LT5xb3Nfb3B0aW9uKQotCQlwc3RhLT5xb3Nfb3B0aW9uID0gdHJ1ZTsKLQotCXBzdGEtPnN0YXRlID0gX0ZXX0xJTktFRDsKLX0KLQotdm9pZCBtbG1lZXh0X2pvaW5ic3NfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgICAgaW50IGpvaW5fcmVzKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgKnBzdGFfYm1jOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1cl9uZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JaWYgKGpvaW5fcmVzIDwgMCkgewotCQlod192YXJfc2V0X21sbWVfam9pbihwYWRhcHRlciwgMSk7Ci0JCWh3X3Zhcl9zZXRfYnNzaWQocGFkYXB0ZXIsIG51bGxfYWRkcik7Ci0KLQkJLyogcmVzdG9yZSB0byBpbml0aWFsIHNldHRpbmcuICovCi0JCXVwZGF0ZV90eF9iYXNpY19yYXRlMjNhKHBhZGFwdGVyLAotCQkJCQlwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGUpOwotCi0JCWdvdG8gZXhpdF9tbG1lZXh0X2pvaW5ic3NfZXZlbnRfY2FsbGJhY2syM2E7Ci0JfQotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9BREhPQykgewotCQkvKiBmb3IgYmMvbWMgKi8KLQkJcHN0YV9ibWMgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JCWlmIChwc3RhX2JtYykgewotCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1twc3RhX2JtYy0+bWFjX2lkXS5wc3RhID0gcHN0YV9ibWM7Ci0JCQl1cGRhdGVfYm1jX3N0YV9zdXBwb3J0X3JhdGUyM2EocGFkYXB0ZXIsIHBzdGFfYm1jLT5tYWNfaWQpOwotCQkJVXBkYXRlX1JBX0VudHJ5MjNhKHBhZGFwdGVyLCBwc3RhX2JtYyk7Ci0JCX0KLQl9Ci0KLQkvKiB0dXJuIG9uIGR5bmFtaWMgZnVuY3Rpb25zICovCi0JcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9zZXQocGFkYXB0ZXIsIERZTkFNSUNfQUxMX0ZVTkNfRU5BQkxFKTsKLQotCS8qICB1cGRhdGUgSU9ULXJlbGVhdGVkIGlzc3VlICovCi0JdXBkYXRlX0lPVF9pbmZvMjNhKHBhZGFwdGVyKTsKLQotCUhhbFNldEJyYXRlQ2ZnMjNhKHBhZGFwdGVyLCBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCi0JLyogQkNOIGludGVydmFsICovCi0JcnRsODcyM2Ffc2V0X2JlYWNvbl9pbnRlcnZhbChwYWRhcHRlciwgcG1sbWVpbmZvLT5iY25faW50ZXJ2YWwpOwotCi0JLyogdXBkYXRlIGNhcGFiaWxpdHkgKi8KLQl1cGRhdGVfY2FwaW5mbzIzYShwYWRhcHRlciwgcG1sbWVpbmZvLT5jYXBhYmlsaXR5KTsKLQotCS8qIFdNTSwgVXBkYXRlIEVEQ0EgcGFyYW0gKi8KLQlXTU1PbkFzc29jUnNwMjNhKHBhZGFwdGVyKTsKLQotCS8qIEhUICovCi0JSFRPbkFzc29jUnNwMjNhKHBhZGFwdGVyKTsKLQotCS8qIFNldCBjdXJfY2hhbm5lbCZjdXJfYndtb2RlJmN1cl9jaF9vZmZzZXQgKi8KLQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCwgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsKLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzKTsKLQlpZiAocHN0YSkgeyAvKiBvbmx5IGZvciBpbmZyYS4gbW9kZSAqLwotCQlwbWxtZWluZm8tPkZXX3N0YV9pbmZvW3BzdGEtPm1hY19pZF0ucHN0YSA9IHBzdGE7Ci0KLQkJLyogREJHXzg3MjNBKCJzZXRfc3RhX3JhdGUyM2FcbiIpOyAqLwotCi0JCXBzdGEtPndpcmVsZXNzX21vZGUgPSBwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGU7Ci0KLQkJLyogc2V0IHBlciBzdGEgcmF0ZSBhZnRlciB1cGRhdGluZyBIVCBjYXAuICovCi0JCXNldF9zdGFfcmF0ZTIzYShwYWRhcHRlciwgcHN0YSk7Ci0JfQotCi0JaHdfdmFyX3NldF9tbG1lX2pvaW4ocGFkYXB0ZXIsIDIpOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlJjB4MDMpID09IE1TUl9JTkZSQSkgewotCQkvKiAgY29ycmVjdGluZyBUU0YgKi8KLQkJcnR3X2NvcnJlY3RfVFNGKHBhZGFwdGVyKTsKLQotCQkvKiBzZXRfbGlua190aW1lcihwbWxtZWV4dCwgRElTQ09OTkVDVF9UTyk7ICovCi0JfQotCi0JcnR3X2xwc19jdHJsX3drX2NtZDIzYShwYWRhcHRlciwgTFBTX0NUUkxfQ09OTkVDVCwgMCk7Ci0KLWV4aXRfbWxtZWV4dF9qb2luYnNzX2V2ZW50X2NhbGxiYWNrMjNhOgotCURCR184NzIzQSgiPT4lc1xuIiwgX19mdW5jX18pOwotfQotCi12b2lkIG1sbWVleHRfc3RhX2FkZF9ldmVudF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BREhPQykgewotCS8qIGFkaG9jIG1hc3RlciBvciBzdGFfY291bnQ+MSAqLwotCQlpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykgewotCQkJLyogbm90aGluZyB0byBkbyAqLwotCQl9IGVsc2UgeyAvKiBhZGhvYyBjbGllbnQgKi8KLQkJCS8qICBjb3JyZWN0aW5nIFRTRiAqLwotCQkJcnR3X2NvcnJlY3RfVFNGKHBhZGFwdGVyKTsKLQotCQkJLyogc3RhcnQgYmVhY29uICovCi0JCQlpZiAoc2VuZF9iZWFjb24yM2EocGFkYXB0ZXIpICE9IF9TVUNDRVNTKSB7Ci0JCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1twc3RhLT5tYWNfaWRdLnN0YXR1cyA9IDA7Ci0KLQkJCQlwbWxtZWluZm8tPnN0YXRlIF49IE1TUl9BREhPQzsKLQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJcG1sbWVpbmZvLT5zdGF0ZSB8PSBXSUZJX0ZXX0FTU09DX1NVQ0NFU1M7Ci0JCX0KLQkJaHdfdmFyX3NldF9tbG1lX2pvaW4ocGFkYXB0ZXIsIDIpOwotCX0KLQotCXBtbG1laW5mby0+Rldfc3RhX2luZm9bcHN0YS0+bWFjX2lkXS5wc3RhID0gcHN0YTsKLQotCS8qIHJhdGUgcmFkYXB0aXZlICovCi0JVXBkYXRlX1JBX0VudHJ5MjNhKHBhZGFwdGVyLCBwc3RhKTsKLQotCS8qIHVwZGF0ZSBhZGhvYyBzdGFfaW5mbyAqLwotCXVwZGF0ZV9zdGFfaW5mbzIzYShwYWRhcHRlciwgcHN0YSk7Ci19Ci0KLXZvaWQgbWxtZWV4dF9zdGFfZGVsX2V2ZW50X2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChpc19jbGllbnRfYXNzb2NpYXRlZF90b19hcDIzYShwYWRhcHRlcikgfHwKLQkgICAgaXNfSUJTU19lbXB0eTIzYShwYWRhcHRlcikpIHsKLQkJLyogc2V0X29wbW9kZV9jbWQocGFkYXB0ZXIsIGluZnJhX2NsaWVudF93aXRoX21sbWUpOyAqLwotCi0JCWh3X3Zhcl9zZXRfbWxtZV9kaXNjb25uZWN0KHBhZGFwdGVyKTsKLQkJaHdfdmFyX3NldF9ic3NpZChwYWRhcHRlciwgbnVsbF9hZGRyKTsKLQotCQkvKiByZXN0b3JlIHRvIGluaXRpYWwgc2V0dGluZy4gKi8KLQkJdXBkYXRlX3R4X2Jhc2ljX3JhdGUyM2EocGFkYXB0ZXIsCi0JCQkJCXBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lyZWxlc3NfbW9kZSk7Ci0KLQkJLyogc3dpdGNoIHRvIHRoZSAyME0gSHogbW9kZSBhZnRlciBkaXNjb25uZWN0ICovCi0JCXBtbG1lZXh0LT5jdXJfYndtb2RlID0gSFRfQ0hBTk5FTF9XSURUSF8yMDsKLQkJcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCi0JCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLAotCQkJCSAgICAgIHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0LAotCQkJCSAgICAgIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsKLQotCQlmbHVzaF9hbGxfY2FtX2VudHJ5MjNhKHBhZGFwdGVyKTsKLQotCQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKLQotCQkvKiBzZXQgTVNSIHRvIG5vIGxpbmsgc3RhdGUgLT4gaW5mcmEuIG1vZGUgKi8KLQkJcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhwYWRhcHRlciwgTVNSX0lORlJBKTsKLQotCQlkZWxfdGltZXJfc3luYygmcG1sbWVleHQtPmxpbmtfdGltZXIpOwotCX0KLX0KLQotc3RhdGljIHU4IGNoa19hcF9pc19hbGl2ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JdTggcmV0ID0gZmFsc2U7Ci0KLQlpZiAoc3RhX3J4X2RhdGFfcGt0cyhwc3RhKSA9PSBzdGFfbGFzdF9yeF9kYXRhX3BrdHMocHN0YSkgJiYKLQkgICAgc3RhX3J4X2JlYWNvbl9wa3RzKHBzdGEpID09IHN0YV9sYXN0X3J4X2JlYWNvbl9wa3RzKHBzdGEpICYmCi0JICAgIHN0YV9yeF9wcm9iZXJzcF9wa3RzKHBzdGEpID09IHN0YV9sYXN0X3J4X3Byb2JlcnNwX3BrdHMocHN0YSkpCi0JCXJldCA9IGZhbHNlOwotCWVsc2UKLQkJcmV0ID0gdHJ1ZTsKLQotCXN0YV91cGRhdGVfbGFzdF9yeF9wa3RzKHBzdGEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgbGlua2VkX3N0YXR1c19jaGsyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MzIgaTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQlpZiAoaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9fYXAyM2EocGFkYXB0ZXIpKSB7Ci0JCS8qIGxpbmtlZCBpbmZyYXN0cnVjdHVyZSBjbGllbnQgbW9kZSAqLwotCi0JCWludCB0eF9jaGsgPSBfU1VDQ0VTUywgcnhfY2hrID0gX1NVQ0NFU1M7Ci0JCWludCByeF9jaGtfbGltaXQ7Ci0KLQkJcnhfY2hrX2xpbWl0ID0gNDsKLQotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LAotCQkJCQkgIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJaWYgKHBzdGEpIHsKLQkJCWJvb2wgaXNfcDJwX2VuYWJsZSA9IGZhbHNlOwotCi0JCQlpZiAoY2hrX2FwX2lzX2FsaXZlKHBhZGFwdGVyLCBwc3RhKSA9PSBmYWxzZSkKLQkJCQlyeF9jaGsgPSBfRkFJTDsKLQotCQkJaWYgKHB4bWl0cHJpdi0+bGFzdF90eF9wa3RzID09IHB4bWl0cHJpdi0+dHhfcGt0cykKLQkJCQl0eF9jaGsgPSBfRkFJTDsKLQotCQkJaWYgKHBtbG1lZXh0LT5hY3RpdmVfa2VlcF9hbGl2ZV9jaGVjayAmJgotCQkJICAgIChyeF9jaGsgPT0gX0ZBSUwgfHwgdHhfY2hrID09IF9GQUlMKSkgewotCQkJCXU4IGJhY2t1cF9vcGVyX2NoYW5uZWwgPSAwOwotCi0JCQkJLyogc3dpdGNoIHRvIGNvcnJlY3QgY2hhbm5lbCBvZiBjdXJyZW50Ci0JCQkJICAgbmV0d29yayAgYmVmb3JlIGlzc3VlIGtlZXAtYWxpdmUgZnJhbWVzICovCi0JCQkJaWYgKHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlcikgIT0KLQkJCQkgICAgcG1sbWVleHQtPmN1cl9jaGFubmVsKSB7Ci0JCQkJCWJhY2t1cF9vcGVyX2NoYW5uZWwgPQotCQkJCQkJcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKTsKLQkJCQkJU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwKLQkJCQkJCQkgcG1sbWVleHQtPmN1cl9jaGFubmVsKTsKLQkJCQl9Ci0KLQkJCQlpZiAocnhfY2hrICE9IF9TVUNDRVNTKQotCQkJCQlpc3N1ZV9wcm9iZXJlcV9leChwYWRhcHRlciwgJnBtbG1laW5mby0+bmV0d29yay5Tc2lkLCBwc3RhLT5od2FkZHIsIDMsIDEpOwotCi0JCQkJaWYgKCh0eF9jaGsgIT0gX1NVQ0NFU1MgJiYKLQkJCQkgICAgIHBtbG1laW5mby0+bGlua19jb3VudCsrID09IDB4ZikgfHwKLQkJCQkgICAgcnhfY2hrICE9IF9TVUNDRVNTKSB7Ci0JCQkJCXR4X2NoayA9IGlzc3VlX251bGxkYXRhMjNhKHBhZGFwdGVyLAotCQkJCQkJCQkgICBwc3RhLT5od2FkZHIsCi0JCQkJCQkJCSAgIDAsIDMsIDEpOwotCQkJCQkvKiBpZiB0eCBhY2tlZCBhbmQgcDJwIGRpc2FibGVkLAotCQkJCQkgICBzZXQgcnhfY2hrIF9TVUNDRVNTIHRvIHJlc2V0IHJldHJ5Ci0JCQkJCSAgIGNvdW50ICovCi0JCQkJCWlmICh0eF9jaGsgPT0gX1NVQ0NFU1MgJiYKLQkJCQkJICAgICFpc19wMnBfZW5hYmxlKQotCQkJCQkJcnhfY2hrID0gX1NVQ0NFU1M7Ci0JCQkJfQotCi0JCQkJLyogYmFjayB0byB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uIGNoYW5uZWwgKi8KLQkJCQlpZiAoYmFja3VwX29wZXJfY2hhbm5lbD4wKQotCQkJCQlTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLAotCQkJCQkJCSBiYWNrdXBfb3Blcl9jaGFubmVsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJ4X2NoayAhPSBfU1VDQ0VTUykgewotCQkJCQlpZiAocG1sbWVleHQtPnJldHJ5ID09IDApIHsKLQkJCQkJCWlzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5uZXR3b3JrLlNzaWQsIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJCQkJCWlzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5uZXR3b3JrLlNzaWQsIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJCQkJCWlzc3VlX3Byb2JlcmVxKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5uZXR3b3JrLlNzaWQsIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICh0eF9jaGsgIT0gX1NVQ0NFU1MgJiYKLQkJCQkgICAgcG1sbWVpbmZvLT5saW5rX2NvdW50KysgPT0gMHhmKQotCQkJCQl0eF9jaGsgPSBpc3N1ZV9udWxsZGF0YTIzYShwYWRhcHRlciwKLQkJCQkJCQkJICAgTlVMTCwgMCwgMSwKLQkJCQkJCQkJICAgMCk7Ci0JCQl9Ci0KLQkJCWlmIChyeF9jaGsgPT0gX0ZBSUwpIHsKLQkJCQlwbWxtZWV4dC0+cmV0cnkrKzsKLQkJCQlpZiAocG1sbWVleHQtPnJldHJ5ID4gcnhfY2hrX2xpbWl0KSB7Ci0JCQkJCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sCi0JCQkJCQkJIiVzKCVzKTogZGlzY29ubmVjdCBvciAiCi0JCQkJCQkJInJvYW1pbmdcbiIsIF9fZnVuY19fLAotCQkJCQkJCXBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJCQkJcmVjZWl2ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyLCBwbWxtZWluZm8tPm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCQkJCVdMQU5fUkVBU09OX0VYUElSQVRJT05fQ0hLKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXBtbG1lZXh0LT5yZXRyeSA9IDA7Ci0KLQkJCWlmICh0eF9jaGsgPT0gX0ZBSUwpCi0JCQkJcG1sbWVpbmZvLT5saW5rX2NvdW50ICY9IDB4ZjsKLQkJCWVsc2UgewotCQkJCXB4bWl0cHJpdi0+bGFzdF90eF9wa3RzID0gcHhtaXRwcml2LT50eF9wa3RzOwotCQkJCXBtbG1laW5mby0+bGlua19jb3VudCA9IDA7Ci0JCQl9Ci0KLQkJfQotCX0gZWxzZSBpZiAoaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9faWJzczIzYShwYWRhcHRlcikpIHsKLQkJLyogbGlua2VkIElCU1MgbW9kZSAqLwotCQkvKiBmb3IgZWFjaCBhc3NvYyBsaXN0IGVudHJ5IHRvIGNoZWNrIHRoZSByeCBwa3QgY291bnRlciAqLwotCQlmb3IgKGkgPSBJQlNTX1NUQVJUX01BQ19JRDsgaSA8IE5VTV9TVEE7IGkrKykgewotCQkJaWYgKHBtbG1laW5mby0+Rldfc3RhX2luZm9baV0uc3RhdHVzID09IDEpIHsKLQkJCQlwc3RhID0gcG1sbWVpbmZvLT5GV19zdGFfaW5mb1tpXS5wc3RhOwotCi0JCQkJaWYgKCFwc3RhKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2ldLnJ4X3BrdCA9PQotCQkJCSAgICBzdGFfcnhfcGt0cyhwc3RhKSkgewotCi0JCQkJCWlmIChwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2ldLnJldHJ5PDMpIHsKLQkJCQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9baV0ucmV0cnkrKzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9baV0ucmV0cnkgPSAwOwotCQkJCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1tpXS5zdGF0dXMgPSAwOwotCQkJCQkJcmVwb3J0X2RlbF9zdGFfZXZlbnQyM2EocGFkYXB0ZXIsIHBzdGEtPmh3YWRkciwKLQkJCQkJCQk2NTUzNS8qICBpbmRpY2F0ZSBkaXNjb25uZWN0IGNhdXNlZCBieSBubyByeCAqLwotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9baV0ucmV0cnkgPSAwOwotCQkJCQlwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2ldLnJ4X3BrdCA9ICh1MzIpc3RhX3J4X3BrdHMocHN0YSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8qIHNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCBESVNDT05ORUNUX1RPKTsgKi8KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHN1cnZleV90aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQlzdHJ1Y3QgY21kX29iaiAqcGgyYzsKLQlzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtICpwc3VydmV5UGFyYTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQkvKiBpc3N1ZSBydHdfc2l0ZXN1cnZleV9jbWQyM2EgKi8KLQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID4gU0NBTl9TVEFSVCkgewotCQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09ICBTQ0FOX1BST0NFU1MpCi0JCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hhbm5lbF9pZHgrKzsKLQotCQlpZiAocG1sbWVleHQtPnNjYW5fYWJvcnQgPT0gdHJ1ZSkgewotCQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoYW5uZWxfaWR4ID0KLQkJCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hfbnVtOwotCQkJREJHXzg3MjNBKCIlcyBpZHg6JWRcbiIsIF9fZnVuY19fLAotCQkJCSAgcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoYW5uZWxfaWR4KTsKLQotCQkJcG1sbWVleHQtPnNjYW5fYWJvcnQgPSBmYWxzZTsvKiByZXNldCAqLwotCQl9Ci0KLQkJcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghcGgyYykKLQkJCWdvdG8gZXhpdF9zdXJ2ZXlfdGltZXJfaGRsOwotCi0JCXBzdXJ2ZXlQYXJhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNpdGVzdXJ2ZXlfcGFybSksCi0JCQkJCUdGUF9BVE9NSUMpOwotCQlpZiAoIXBzdXJ2ZXlQYXJhKSB7Ci0JCQlrZnJlZShwaDJjKTsKLQkJCWdvdG8gZXhpdF9zdXJ2ZXlfdGltZXJfaGRsOwotCQl9Ci0KLQkJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHN1cnZleVBhcmEsCi0JCQkJCSAgIEdFTl9DTURfQ09ERShfU2l0ZVN1cnZleSkpOwotCQlydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotCX0KLQotZXhpdF9zdXJ2ZXlfdGltZXJfaGRsOgotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgbGlua190aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQkvKiBzdGF0aWMgdW5zaWduZWQgaW50CQlyeF9wa3QgPSAwOyAqLwotCS8qIHN0YXRpYyB1NjQJCQkJdHhfY250ID0gMDsgKi8KLQkvKiBzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OyAqLwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JLyogc3RydWN0IHN0YV9wcml2CQkqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7ICovCi0KLQlpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVVUSF9OVUxMKSB7Ci0JCURCR184NzIzQSgibGlua190aW1lcl9oZGw6bm8gYmVhY29uIHdoaWxlIGNvbm5lY3RpbmdcbiIpOwotCQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKLQkJcmVwb3J0X2pvaW5fcmVzMjNhKHBhZGFwdGVyLCAtMyk7Ci0JfSBlbHNlIGlmIChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BVVRIX1NUQVRFKSB7Ci0JCS8qIHJlLWF1dGggdGltZXIgKi8KLQkJaWYgKCsrcG1sbWVpbmZvLT5yZWF1dGhfY291bnQgPiBSRUFVVEhfTElNSVQpIHsKLQkJCS8qIGlmIChwbWxtZWluZm8tPmF1dGhfYWxnbyAhPSBkb3QxMUF1dGhBbGdydGhtX0F1dG8pICovCi0JCQkvKiAgKi8KLQkJCQlwbWxtZWluZm8tPnN0YXRlID0gMDsKLQkJCQlyZXBvcnRfam9pbl9yZXMyM2EocGFkYXB0ZXIsIC0xKTsKLQkJCQlyZXR1cm47Ci0JCQkvKiAgKi8KLQkJCS8qIGVsc2UgKi8KLQkJCS8qICAqLwotCQkJLyogcG1sbWVpbmZvLT5hdXRoX2FsZ28gPSBkb3QxMUF1dGhBbGdydGhtX1NoYXJlZDsgKi8KLQkJCS8qIHBtbG1laW5mby0+cmVhdXRoX2NvdW50ID0gMDsgKi8KLQkJCS8qICAqLwotCQl9Ci0KLQkJREJHXzg3MjNBKCJsaW5rX3RpbWVyX2hkbDogYXV0aCB0aW1lb3V0IGFuZCB0cnkgYWdhaW5cbiIpOwotCQlwbWxtZWluZm8tPmF1dGhfc2VxID0gMTsKLQkJaXNzdWVfYXV0aChwYWRhcHRlciwgTlVMTCwgMCk7Ci0JCXNldF9saW5rX3RpbWVyKHBtbG1lZXh0LCBSRUFVVEhfVE8pOwotCX0gZWxzZSBpZiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1RBVEUpIHsKLQkJLyogcmUtYXNzb2MgdGltZXIgKi8KLQkJaWYgKCsrcG1sbWVpbmZvLT5yZWFzc29jX2NvdW50ID4gUkVBU1NPQ19MSU1JVCkgewotCQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7Ci0JCQlyZXBvcnRfam9pbl9yZXMyM2EocGFkYXB0ZXIsIC0yKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCURCR184NzIzQSgibGlua190aW1lcl9oZGw6IGFzc29jIHRpbWVvdXQgYW5kIHRyeSBhZ2FpblxuIik7Ci0JCWlzc3VlX2Fzc29jcmVxKHBhZGFwdGVyKTsKLQkJc2V0X2xpbmtfdGltZXIocG1sbWVleHQsIFJFQVNTT0NfVE8pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYWRkYmFfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSAoc3RydWN0IHN0YV9pbmZvICopZGF0YTsKLQlzdHJ1Y3QgaHRfcHJpdiAqcGh0cHJpdjsKLQotCWlmICghcHN0YSkKLQkJcmV0dXJuOwotCi0JcGh0cHJpdiA9ICZwc3RhLT5odHByaXY7Ci0KLQlpZiAocGh0cHJpdi0+aHRfb3B0aW9uICYmIHBodHByaXYtPmFtcGR1X2VuYWJsZSkgewotCQlpZiAocGh0cHJpdi0+Y2FuZGlkYXRlX3RpZF9iaXRtYXApCi0JCQlwaHRwcml2LT5jYW5kaWRhdGVfdGlkX2JpdG1hcCA9IDB4MDsKLQl9Ci19Ci0KLXZvaWQgaW5pdF9hZGRiYV9yZXRyeV90aW1lcjIzYShzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc2V0dXBfdGltZXIoJnBzdGEtPmFkZGJhX3JldHJ5X3RpbWVyLCBhZGRiYV90aW1lcl9oZGwsCi0JCSAgICAodW5zaWduZWQgbG9uZylwc3RhKTsKLX0KLQotdm9pZCBpbml0X21sbWVfZXh0X3RpbWVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCXNldHVwX3RpbWVyKCZwbWxtZWV4dC0+c3VydmV5X3RpbWVyLCBzdXJ2ZXlfdGltZXJfaGRsLAotCQkgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwotCi0Jc2V0dXBfdGltZXIoJnBtbG1lZXh0LT5saW5rX3RpbWVyLCBsaW5rX3RpbWVyX2hkbCwKLQkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLX0KLQotaW50IE5VTExfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IHNldG9wbW9kZV9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JZW51bSBubDgwMjExX2lmdHlwZSB0eXBlOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JY29uc3Qgc3RydWN0IHNldG9wbW9kZV9wYXJtICpwc2V0b3AgPSAoc3RydWN0IHNldG9wbW9kZV9wYXJtICopcGJ1ZjsKLQotCXN3aXRjaCAocHNldG9wLT5tb2RlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKLQkJcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9BUDsKLQkJdHlwZSA9IE1TUl9BUDsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJLyogIGNsZWFyIHN0YXRlICovCi0JCXBtbG1laW5mby0+c3RhdGUgJj0gfihCSVQoMCl8QklUKDEpKTsKLQkJLyogc2V0IHRvIFNUQVRJT05fU1RBVEUgKi8KLQkJcG1sbWVpbmZvLT5zdGF0ZSB8PSBNU1JfSU5GUkE7Ci0JCXR5cGUgPSBNU1JfSU5GUkE7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JCXR5cGUgPSBNU1JfQURIT0M7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXR5cGUgPSBNU1JfTk9MSU5LOwotCQlicmVhazsKLQl9Ci0KLQlod192YXJfc2V0X29wbW9kZShwYWRhcHRlciwgdHlwZSk7Ci0JLyogU2V0X05FVFlQRTBfTVNSKHBhZGFwdGVyLCB0eXBlKTsgKi8KLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IGNyZWF0ZWJzc19oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCWNvbnN0IHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwcGFybSA9IChzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqKXBidWY7Ci0JLyogdTMyCWluaXRpYWxnYWluOyAqLwotCi0JaWYgKHBwYXJtLT5pZm1vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKLQkgICAgcHBhcm0tPmlmbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfR08pIHsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkJaWYgKHBtbG1laW5mby0+c3RhdGUgPT0gTVNSX0FQKSB7Ci0JCQkvKiB0b2RvOiAqLwotCQkJcmV0dXJuIEgyQ19TVUNDRVNTOwotCQl9Ci0jZW5kaWYKLQl9Ci0KLQkvKiBiZWxvdyBpcyBmb3IgYWQtaG9jIG1hc3RlciAqLwotCWlmIChwcGFybS0+aWZtb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7Ci0JCXJ0d19qb2luYnNzX3Jlc2V0MjNhKHBhZGFwdGVyKTsKLQotCQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQkJcG1sbWVpbmZvLT5FUlBfZW5hYmxlID0gMDsKLQkJcG1sbWVpbmZvLT5XTU1fZW5hYmxlID0gMDsKLQkJcG1sbWVpbmZvLT5IVF9lbmFibGUgPSAwOwotCQlwbWxtZWluZm8tPkhUX2NhcHNfZW5hYmxlID0gMDsKLQkJcG1sbWVpbmZvLT5IVF9pbmZvX2VuYWJsZSA9IDA7Ci0KLQkJLyogZGlzYWJsZSBkeW5hbWljIGZ1bmN0aW9ucywgc3VjaCBhcyBoaWdoIHBvd2VyLCBESUcgKi8KLQkJcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9iYWNrdXAocGFkYXB0ZXIpOwotCi0JCXJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfY2xyKHBhZGFwdGVyLAotCQkJCQkJIERZTkFNSUNfRlVOQ19ESVNBQkxFKTsKLQotCQkvKiBjYW5jZWwgbGluayB0aW1lciAqLwotCQlkZWxfdGltZXJfc3luYygmcG1sbWVleHQtPmxpbmtfdGltZXIpOwotCi0JCS8qIGNsZWFyIENBTSAqLwotCQlmbHVzaF9hbGxfY2FtX2VudHJ5MjNhKHBhZGFwdGVyKTsKLQotCQlpZiAocHBhcm0tPklFTGVuZ3RoID4gTUFYX0lFX1NaKS8qIENoZWNrIHBidWYtPklFTGVuZ3RoICovCi0JCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQkJbWVtY3B5KHBuZXR3b3JrLCBwcGFybSwgc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSk7Ci0KLQkJc3RhcnRfY3JlYXRlX2lic3MocGFkYXB0ZXIpOwotCX0KLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IGpvaW5fY21kX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JY29uc3Qgc3RydWN0IHdsYW5fYnNzaWRfZXggKnBwYXJtID0gKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICopcGJ1ZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbiAqcGh0X2luZm87Ci0JdTMyIGk7Ci0JdTggKnA7Ci0JLyogdTMyCWluaXRpYWxnYWluOyAqLwotCS8qIHUzMglhY3Bhcm07ICovCi0KLQkvKiBjaGVjayBhbHJlYWR5IGNvbm5lY3RpbmcgdG8gQVAgb3Igbm90ICovCi0JaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MpIHsKLQkJaWYgKHBtbG1laW5mby0+c3RhdGUgJiBNU1JfSU5GUkEpCi0JCQlpc3N1ZV9kZWF1dGhfZXgocGFkYXB0ZXIsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLAotCQkJCQlXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORywgNSwgMTAwKTsKLQotCQlwbWxtZWluZm8tPnN0YXRlID0gTVNSX05PTElOSzsKLQotCQkvKiBjbGVhciBDQU0gKi8KLQkJZmx1c2hfYWxsX2NhbV9lbnRyeTIzYShwYWRhcHRlcik7Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQotCQkvKiBzZXQgTVNSIHRvIG5vbGluayAtPiBpbmZyYS4gbW9kZSAqLwotCQlydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzKHBhZGFwdGVyLCBNU1JfSU5GUkEpOwotCi0JCWh3X3Zhcl9zZXRfbWxtZV9kaXNjb25uZWN0KHBhZGFwdGVyKTsKLQl9Ci0KLQlydHdfam9pbmJzc19yZXNldDIzYShwYWRhcHRlcik7Ci0KLQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOwotCXBtbG1laW5mby0+RVJQX2VuYWJsZSA9IDA7Ci0JcG1sbWVpbmZvLT5XTU1fZW5hYmxlID0gMDsKLQlwbWxtZWluZm8tPkhUX2VuYWJsZSA9IDA7Ci0JcG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSA9IDA7Ci0JcG1sbWVpbmZvLT5IVF9pbmZvX2VuYWJsZSA9IDA7Ci0JcG1sbWVpbmZvLT5id21vZGVfdXBkYXRlZCA9IGZhbHNlOwotCS8qIHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID0gSFRfSU9UX1BFRVJfTUFYOyAqLwotCi0JaWYgKHBwYXJtLT5JRUxlbmd0aCA+IE1BWF9JRV9TWikvKiBDaGVjayBwYnVmLT5JRUxlbmd0aCAqLwotCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQltZW1jcHkocG5ldHdvcmssIHBidWYsIHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCkpOwotCi0JLyogQ2hlY2sgQVAgdmVuZG9yIHRvIG1vdmUgcnR3X2pvaW5ic3NfY21kMjNhKCkgKi8KLQkvKiBwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9IGNoZWNrX2Fzc29jX0FQMjNhKHBuZXR3b3JrLT5JRXMsCi0JICAgcG5ldHdvcmstPklFTGVuZ3RoKTsgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBwbmV0d29yay0+SUVMZW5ndGg7KSB7Ci0JCXAgPSBwbmV0d29yay0+SUVzICsgaTsKLQotCQlzd2l0Y2ggKHBbMF0pIHsKLQkJY2FzZSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUM6LyogR2V0IFdNTSBJRS4gKi8KLQkJCWlmICghbWVtY21wKHAgKyAyLCBXTU1fT1VJMjNBLCA0KSkKLQkJCQlwbWxtZWluZm8tPldNTV9lbmFibGUgPSAxOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOgkvKiBHZXQgSFQgQ2FwIElFLiAqLwotCQkJcG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSA9IDE7Ci0JCQlicmVhazsKLQotCQljYXNlIFdMQU5fRUlEX0hUX09QRVJBVElPTjoJLyogR2V0IEhUIEluZm8gSUUuICovCi0JCQlwbWxtZWluZm8tPkhUX2luZm9fZW5hYmxlID0gMTsKLQotCQkJLyogc3BlYyBjYXNlIG9ubHkgZm9yIGNpc2NvJ3MgYXAgYmVjYXVzZSBjaXNjbydzIGFwCi0JCQkgKiBpc3N1ZSBhc3NvYyByc3AgdXNpbmcgbWNzIHJhdGUgQDQwTUh6IG9yIEAyME1IeiAqLwotCQkJcGh0X2luZm8gPSAoc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKikocCArIDIpOwotCi0JCQlpZiAocHJlZ3ByaXYtPmNidzQwX2VuYWJsZSAmJgotCQkJICAgIChwaHRfaW5mby0+aHRfcGFyYW0gJgotCQkJICAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBTl9XSURUSF9BTlkpKSB7Ci0JCQkJLyogc3dpdGNoIHRvIHRoZSA0ME0gSHogbW9kZSBhY2NvcmRpbmcgdG8gQVAgKi8KLQkJCQlwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfNDA7Ci0JCQkJc3dpdGNoIChwaHRfaW5mby0+aHRfcGFyYW0gJgotCQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19PRkZTRVQpIHsKLQkJCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOgotCQkJCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9Ci0JCQkJCQlIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVI7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzoKLQkJCQkJcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPQotCQkJCQkJSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSOwotCQkJCQlicmVhazsKLQotCQkJCWRlZmF1bHQ6Ci0JCQkJCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0KLQkJCQkJCUhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCURCR184NzIzQSgic2V0IGNoL2J3IGJlZm9yZSBjb25uZWN0ZWRcbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaSArPSAocFsxXSArIDIpOwotCX0KLQotCWh3X3Zhcl9zZXRfYnNzaWQocGFkYXB0ZXIsIHBtbG1laW5mby0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQlod192YXJfc2V0X21sbWVfam9pbihwYWRhcHRlciwgMCk7Ci0KLQkvKiBjYW5jZWwgbGluayB0aW1lciAqLwotCWRlbF90aW1lcl9zeW5jKCZwbWxtZWV4dC0+bGlua190aW1lcik7Ci0KLQlzdGFydF9jbG50X2pvaW4ocGFkYXB0ZXIpOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgZGlzY29ubmVjdF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JY29uc3Qgc3RydWN0IGRpc2Nvbm5lY3RfcGFybSAqcGFyYW0gPSAoc3RydWN0IGRpc2Nvbm5lY3RfcGFybSAqKXBidWY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCi0JaWYgKGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwMjNhKHBhZGFwdGVyKSkgewotCQlpc3N1ZV9kZWF1dGhfZXgocGFkYXB0ZXIsIHBuZXR3b3JrLT5NYWNBZGRyZXNzLAotCQkJCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HLAotCQkJCXBhcmFtLT5kZWF1dGhfdGltZW91dF9tcy8xMDAsIDEwMCk7Ci0JfQotCi0JLyogc2V0X29wbW9kZV9jbWQocGFkYXB0ZXIsIGluZnJhX2NsaWVudF93aXRoX21sbWUpOyAqLwotCi0JLyogcG1sbWVpbmZvLT5zdGF0ZSA9IE1TUl9OT0xJTks7ICovCi0KLQlod192YXJfc2V0X21sbWVfZGlzY29ubmVjdChwYWRhcHRlcik7Ci0JaHdfdmFyX3NldF9ic3NpZChwYWRhcHRlciwgbnVsbF9hZGRyKTsKLQotCS8qIHJlc3RvcmUgdG8gaW5pdGlhbCBzZXR0aW5nLiAqLwotCXVwZGF0ZV90eF9iYXNpY19yYXRlMjNhKHBhZGFwdGVyLCBwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGUpOwotCi0JaWYgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FESE9DIHx8Ci0JICAgIChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FQKQotCQlydGw4NzIzYV9zZXRfYmNuX2Z1bmMocGFkYXB0ZXIsIDApOwkvKiBTdG9wIEJDTiAqLwotCi0JLyogc2V0IE1TUiB0byBubyBsaW5rIHN0YXRlIC0+IGluZnJhLiBtb2RlICovCi0JcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhwYWRhcHRlciwgTVNSX0lORlJBKTsKLQotCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOwotCi0JLyogc3dpdGNoIHRvIHRoZSAyME0gSHogbW9kZSBhZnRlciBkaXNjb25uZWN0ICovCi0JcG1sbWVleHQtPmN1cl9id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwotCXBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQotCXNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLAotCQkJICAgICAgcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQsIHBtbG1lZXh0LT5jdXJfYndtb2RlKTsKLQotCWZsdXNoX2FsbF9jYW1fZW50cnkyM2EocGFkYXB0ZXIpOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBtbG1lZXh0LT5saW5rX3RpbWVyKTsKLQotCXJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUyM2EocGFkYXB0ZXIpOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50Ci1ydHdfc2Nhbl9jaF9kZWNpc2lvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwgKm91dCwgdTMyIG91dF9udW0sCi0JCSAgICAgY29uc3Qgc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCAqaW4sIHUzMiBpbl9udW0pCi17Ci0JaW50IGksIGo7Ci0JaW50IHNjYW5fY2hfbnVtID0gMDsKLQlpbnQgc2V0X2lkeDsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JLyogY2xlYXIgb3V0IGZpcnN0ICovCi0JbWVtc2V0KG91dCwgMCwgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwpKm91dF9udW0pOwotCi0JLyogYWNxdWlyZSBjaGFubmVscyBmcm9tIGluICovCi0JaiA9IDA7Ci0JZm9yIChpID0gMDtpPGluX251bTtpKyspIHsKLQkJaWYgKGluW2ldLmh3X3ZhbHVlICYmCi0JCSAgICAhKGluW2ldLmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpICYmCi0JCSAgICAoc2V0X2lkeCA9IHJ0d19jaF9zZXRfc2VhcmNoX2NoMjNhKHBtbG1lZXh0LT5jaGFubmVsX3NldCwKLQkJCQkJCSAgICAgICBpbltpXS5od192YWx1ZSkpID49IDApIHsKLQkJCW1lbWNweSgmb3V0W2pdLCAmaW5baV0sCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwpKTsKLQotCQkJaWYgKHBtbG1lZXh0LT5jaGFubmVsX3NldFtzZXRfaWR4XS5TY2FuVHlwZSA9PQotCQkJICAgIFNDQU5fUEFTU0lWRSkKLQkJCQlvdXRbal0uZmxhZ3MgJj0gSUVFRTgwMjExX0NIQU5fTk9fSVI7Ci0KLQkJCWorKzsKLQkJfQotCQlpZiAoaj49IG91dF9udW0pCi0JCQlicmVhazsKLQl9Ci0KLQkvKiBpZiBvdXQgaXMgZW1wdHksIHVzZSBjaGFubmVsX3NldCBhcyBkZWZhdWx0ICovCi0JaWYgKGogPT0gMCkgewotCQlmb3IgKGkgPSAwO2k8cG1sbWVleHQtPm1heF9jaGFuX251bXM7aSsrKSB7Ci0JCQlvdXRbaV0uaHdfdmFsdWUgPSBwbWxtZWV4dC0+Y2hhbm5lbF9zZXRbaV0uQ2hhbm5lbE51bTsKLQotCQkJaWYgKHBtbG1lZXh0LT5jaGFubmVsX3NldFtpXS5TY2FuVHlwZSA9PSBTQ0FOX1BBU1NJVkUpCi0JCQkJb3V0W2ldLmZsYWdzICY9IElFRUU4MDIxMV9DSEFOX05PX0lSOwotCi0JCQlqKys7Ci0JCX0KLQl9Ci0KLQlpZiAocGFkYXB0ZXItPnNldGJhbmQgPT0gR0haXzI0KSB7CQkJLyogIDIuNEcgKi8KLQkJZm9yIChpID0gMDsgaSA8IGogOyBpKyspIHsKLQkJCWlmIChvdXRbaV0uaHdfdmFsdWUgPiAzNSkKLQkJCQltZW1zZXQoJm91dFtpXSwgMCwKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwpKTsKLQkJCWVsc2UKLQkJCQlzY2FuX2NoX251bSsrOwotCQl9Ci0JCWogPSBzY2FuX2NoX251bTsKLQl9IGVsc2UgaWYgIChwYWRhcHRlci0+c2V0YmFuZCA9PSBHSFpfNTApIHsJCS8qICA1RyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgaiA7IGkrKykgewotCQkJaWYgKG91dFtpXS5od192YWx1ZSA+IDM1KSB7Ci0JCQkJbWVtY3B5KCZvdXRbc2Nhbl9jaF9udW0rK10sICZvdXRbaV0sCi0JCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsKSk7Ci0JCQl9Ci0JCX0KLQkJaiA9IHNjYW5fY2hfbnVtOwotCX0gZWxzZQotCQl7fQotCi0JcmV0dXJuIGo7Ci19Ci0KLWludCBzaXRlc3VydmV5X2NtZF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQljb25zdCBzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtICpwcGFybSA9IChzdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtICopcGJ1ZjsKLQl1OCBiZGVsYXlzY2FuID0gZmFsc2U7Ci0JdTMyIGluaXRpYWxnYWluOwotCXUzMiBpOwotCi0JaWYgKHBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9PSBTQ0FOX0RJU0FCTEUpIHsKLQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID0gU0NBTl9TVEFSVDsKLQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmJzc19jbnQgPSAwOwotCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2hhbm5lbF9pZHggPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBSVFdfU1NJRF9TQ0FOX0FNT1VOVDsgaSsrKSB7Ci0JCQlpZiAocHBhcm0tPnNzaWRbaV0uc3NpZF9sZW4pIHsKLQkJCQltZW1jcHkocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNzaWRbaV0uc3NpZCwKLQkJCQkgICAgICAgcHBhcm0tPnNzaWRbaV0uc3NpZCwKLQkJCQkgICAgICAgSUVFRTgwMjExX01BWF9TU0lEX0xFTik7Ci0JCQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNzaWRbaV0uc3NpZF9sZW4gPQotCQkJCQlwcGFybS0+c3NpZFtpXS5zc2lkX2xlbjsKLQkJCX0gZWxzZSB7Ci0JCQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnNzaWRbaV0uc3NpZF9sZW4gPSAwOwotCQkJfQotCQl9Ci0KLQkJcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLmNoX251bSA9Ci0JCQlydHdfc2Nhbl9jaF9kZWNpc2lvbihwYWRhcHRlciwKLQkJCQkJICAgICBwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuY2gsCi0JCQkJCSAgICAgUlRXX0NIQU5ORUxfU0NBTl9BTU9VTlQsCi0JCQkJCSAgICAgcHBhcm0tPmNoLCBwcGFybS0+Y2hfbnVtKTsKLQotCQlwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc2Nhbl9tb2RlID0gcHBhcm0tPnNjYW5fbW9kZTsKLQotCQkvKiBpc3N1ZSBudWxsIGRhdGEgaWYgYXNzb2NpYXRpbmcgdG8gdGhlIEFQICovCi0JCWlmIChpc19jbGllbnRfYXNzb2NpYXRlZF90b19hcDIzYShwYWRhcHRlcikpIHsKLQkJCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fVFhOVUxMOwotCi0JCQkvKiBzd2l0Y2ggdG8gY29ycmVjdCBjaGFubmVsIG9mIGN1cnJlbnQgbmV0d29yawotCQkJICAgYmVmb3JlIGlzc3VlIGtlZXAtYWxpdmUgZnJhbWVzICovCi0JCQlpZiAocnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSAhPQotCQkJICAgIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCkKLQkJCQlTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLAotCQkJCQkJIHBtbG1lZXh0LT5jdXJfY2hhbm5lbCk7Ci0KLQkJCWlzc3VlX251bGxkYXRhMjNhKHBhZGFwdGVyLCBOVUxMLCAxLCAzLCA1MDApOwotCi0JCQliZGVsYXlzY2FuID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChiZGVsYXlzY2FuKSB7Ci0JCQkvKiBkZWxheSA1MG1zIHRvIHByb3RlY3QgbnVsbGRhdGEoMSkuICovCi0JCQlzZXRfc3VydmV5X3RpbWVyKHBtbG1lZXh0LCA1MCk7Ci0JCQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci0JCX0KLQl9Ci0KLQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09IFNDQU5fU1RBUlQgfHwKLQkgICAgcG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09IFNDQU5fVFhOVUxMKSB7Ci0JCS8qIGRpc2FibGUgZHluYW1pYyBmdW5jdGlvbnMsIHN1Y2ggYXMgaGlnaCBwb3dlciwgRElHICovCi0JCXJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfYmFja3VwKHBhZGFwdGVyKTsKLQkJcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9jbHIocGFkYXB0ZXIsCi0JCQkJCQkgRFlOQU1JQ19GVU5DX0RJU0FCTEUpOwotCi0JCS8qIGNvbmZpZyB0aGUgaW5pdGlhbCBnYWluIHVuZGVyIHNjYW5uaW5nLCBuZWVkIHRvCi0JCSAgIHdyaXRlIHRoZSBCQiByZWdpc3RlcnMgKi8KLQkJaWYgKHdkZXZfdG9fcHJpdihwYWRhcHRlci0+cnR3X3dkZXYpLT5wMnBfZW5hYmxlZCA9PSB0cnVlKQotCQkJaW5pdGlhbGdhaW4gPSAweDMwOwotCQllbHNlCi0JCQlpbml0aWFsZ2FpbiA9IDB4MUU7Ci0KLQkJcnRsODcyM2Ffc2V0X2luaXRpYWxfZ2FpbihwYWRhcHRlciwgaW5pdGlhbGdhaW4pOwotCi0JCS8qIHNldCBNU1IgdG8gbm8gbGluayBzdGF0ZSAqLwotCQlydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzKHBhZGFwdGVyLCBNU1JfTk9MSU5LKTsKLQotCQlydGw4NzIzYV9tbG1lX3NpdGVzdXJ2ZXkocGFkYXB0ZXIsIDEpOwotCi0JCXBtbG1lZXh0LT5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fUFJPQ0VTUzsKLQl9Ci0KLQlydHdfc2l0ZV9zdXJ2ZXkocGFkYXB0ZXIpOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgc2V0YXV0aF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JY29uc3Qgc3RydWN0IHNldGF1dGhfcGFybSAqcHBhcm0gPSAoc3RydWN0IHNldGF1dGhfcGFybSAqKXBidWY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwcGFybS0+bW9kZSA8IDQpCi0JCXBtbG1laW5mby0+YXV0aF9hbGdvID0gcHBhcm0tPm1vZGU7Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBzZXRrZXlfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCXVuc2lnbmVkIHNob3J0IGN0cmw7Ci0JY29uc3Qgc3RydWN0IHNldGtleV9wYXJtICpwcGFybSA9IChzdHJ1Y3Qgc2V0a2V5X3Bhcm0gKilwYnVmOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JdW5zaWduZWQgY2hhciBudWxsX3N0YVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0JLyogbWFpbiB0eCBrZXkgZm9yIHdlcC4gKi8KLQlpZiAocHBhcm0tPnNldF90eCkKLQkJcG1sbWVpbmZvLT5rZXlfaW5kZXggPSBwcGFybS0+a2V5aWQ7Ci0KLQkvKiB3cml0ZSBjYW0gKi8KLQljdHJsID0gQklUKDE1KSB8IChwcGFybS0+YWxnb3JpdGhtKSA8PCAyIHwgcHBhcm0tPmtleWlkOwotCi0JREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywgInNldCBncm91cCBrZXkgdG8gaHc6IGFsZzolZChXRVA0MC0xICIKLQkJCSJXRVAxMDQtNSBUS0lQLTIgQUVTLTQpIGtleWlkOiVkXG4iLAotCQkJcHBhcm0tPmFsZ29yaXRobSwgcHBhcm0tPmtleWlkKTsKLQlydGw4NzIzYV9jYW1fd3JpdGUocGFkYXB0ZXIsIHBwYXJtLT5rZXlpZCwgY3RybCwgbnVsbF9zdGEsIHBwYXJtLT5rZXkpOwotCi0JLyogYWxsb3cgbXVsdGljYXN0IHBhY2tldHMgdG8gZHJpdmVyICovCi0JcnRsODcyM2Ffb25fcmNyX2FtKHBhZGFwdGVyKTsKLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IHNldF9zdGFrZXlfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCXUxNiBjdHJsID0gMDsKLQl1OCBjYW1faWQ7LyogY2FtX2VudHJ5ICovCi0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQljb25zdCBzdHJ1Y3Qgc2V0X3N0YWtleV9wYXJtICpwcGFybSA9IChzdHJ1Y3Qgc2V0X3N0YWtleV9wYXJtICopcGJ1ZjsKLQotCS8qIGNhbV9lbnRyeTogKi8KLQkvKiAwfjMgZm9yIGRlZmF1bHQga2V5ICovCi0KLQkvKiBmb3IgY29uY3VycmVudCBtb2RlIChhcCtzdGEpOiAqLwotCS8qIGRlZmF1bHQga2V5IGlzIGRpc2FibGUsIHVzaW5nIHN3IGVuY3J5cHQvZGVjcnlwdCAqLwotCS8qIGNhbV9lbnRyeSA9IDQgIGZvciBzdGEgbW9kZSAobWFjaWQgPSAwKSAqLwotCS8qIGNhbV9lbnRyeShtYWNpZCszKSA9IDUgfiBOIGZvciBhcCBtb2RlIChhaWQgPSAxfk4sIG1hY2lkID0gMiB+TikgKi8KLQotCS8qIGZvciBjb25jdXJyZW50IG1vZGUgKHN0YStzdGEpOiAqLwotCS8qIGRlZmF1bHQga2V5IGlzIGRpc2FibGUsIHVzaW5nIHN3IGVuY3J5cHQvZGVjcnlwdCAqLwotCS8qIGNhbV9lbnRyeSA9IDQgbWFwcGluZyB0byBtYWNpZCA9IDAgKi8KLQkvKiBjYW1fZW50cnkgPSA1IG1hcHBpbmcgdG8gbWFjaWQgPSAyICovCi0KLQljYW1faWQgPSA0OwotCi0JREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywgInNldCBwYWlyd2lzZSBrZXkgdG8gaHc6IGFsZzolZChXRVA0MC0xICIKLQkJCSJXRVAxMDQtNSBUS0lQLTIgQUVTLTQpIGNhbWlkOiVkXG4iLAotCQkJcHBhcm0tPmFsZ29yaXRobSwgY2FtX2lkKTsKLQlpZiAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQVApIHsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCWlmIChwcGFybS0+YWxnb3JpdGhtID09IDApIHsJLyogIGNsZWFyIGNhbSBlbnRyeSAqLwotCQkJY2xlYXJfY2FtX2VudHJ5MjNhKHBhZGFwdGVyLCBwcGFybS0+aWQpOwotCQkJcmV0dXJuIEgyQ19TVUNDRVNTX1JTUDsKLQkJfQotCi0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBwYXJtLT5hZGRyKTsKLQkJaWYgKHBzdGEpIHsKLQkJCWN0cmwgPSBCSVQoMTUpIHwgKHBwYXJtLT5hbGdvcml0aG0gPDwgMik7Ci0KLQkJCURCR184NzIzQSgicjg3MXhfc2V0X3N0YWtleV9oZGwyM2EoKTogZW5jX2FsZ29yaXRobSAiCi0JCQkJICAiPSVkXG4iLCBwcGFybS0+YWxnb3JpdGhtKTsKLQotCQkJaWYgKHBzdGEtPm1hY19pZCA8IDEgfHwgcHN0YS0+bWFjX2lkID4gKE5VTV9TVEEgLSA0KSkgewotCQkJCURCR184NzIzQSgicjg3MXhfc2V0X3N0YWtleV9oZGwyM2EoKTpzZXRfc3Rha2V5IgotCQkJCQkgICIgZmFpbGVkLCBtYWNfaWQoYWlkKSA9JWRcbiIsCi0JCQkJCSAgcHN0YS0+bWFjX2lkKTsKLQkJCQlyZXR1cm4gSDJDX1JFSkVDVEVEOwotCQkJfQotCi0JCQkvKiAwfjMgZm9yIGRlZmF1bHQga2V5LCBjbWRfaWQgPSBtYWNpZCArIDMsCi0JCQkgICBtYWNpZCA9IGFpZCsxOyAqLwotCQkJY2FtX2lkID0gcHN0YS0+bWFjX2lkICsgMzsKLQotCQkJREJHXzg3MjNBKCJXcml0ZSBDQU0sIG1hY19hZGRyID0lcE0sICIKLQkJCQkgICJjYW1fZW50cnkgPSVkXG4iLCBwcGFybS0+YWRkciwgY2FtX2lkKTsKLQotCQkJcnRsODcyM2FfY2FtX3dyaXRlKHBhZGFwdGVyLCBjYW1faWQsIGN0cmwsCi0JCQkJCSAgIHBwYXJtLT5hZGRyLCBwcGFybS0+a2V5KTsKLQotCQkJcmV0dXJuIEgyQ19TVUNDRVNTX1JTUDsKLQkJfSBlbHNlIHsKLQkJCURCR184NzIzQSgicjg3MXhfc2V0X3N0YWtleV9oZGwyM2EoKTogc3RhIGhhcyBiZWVuICIKLQkJCQkgICJmcmVlXG4iKTsKLQkJCXJldHVybiBIMkNfUkVKRUNURUQ7Ci0JCX0KLQl9Ci0KLQkvKiBiZWxvdyBmb3Igc3RhIG1vZGUgKi8KLQotCWlmIChwcGFybS0+YWxnb3JpdGhtID09IDApIHsJLyogIGNsZWFyIGNhbSBlbnRyeSAqLwotCQljbGVhcl9jYW1fZW50cnkyM2EocGFkYXB0ZXIsIHBwYXJtLT5pZCk7Ci0JCXJldHVybiBIMkNfU1VDQ0VTUzsKLQl9Ci0KLQljdHJsID0gQklUKDE1KSB8IChwcGFybS0+YWxnb3JpdGhtIDw8IDIpOwotCi0JcnRsODcyM2FfY2FtX3dyaXRlKHBhZGFwdGVyLCBjYW1faWQsIGN0cmwsIHBwYXJtLT5hZGRyLCBwcGFybS0+a2V5KTsKLQotCXBtbG1laW5mby0+ZW5jX2FsZ28gPSBwcGFybS0+YWxnb3JpdGhtOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgYWRkX2JhX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQljb25zdCBzdHJ1Y3QgYWRkQmFSZXFfcGFybSAqcHBhcm0gPSAoc3RydWN0IGFkZEJhUmVxX3Bhcm0gKilwYnVmOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsIHBwYXJtLT5hZGRyKTsKLQotCWlmICghcHN0YSkKLQkJcmV0dXJuIEgyQ19TVUNDRVNTOwotCi0JaWYgKCgocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVNTT0NfU1VDQ0VTUykgJiYKLQkgICAgIHBtbG1laW5mby0+SFRfZW5hYmxlKSB8fAotCSAgICAocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BUCkgewotCQlpc3N1ZV9hY3Rpb25fQkEyM2EocGFkYXB0ZXIsIHBwYXJtLT5hZGRyLAotCQkJCSAgIFdMQU5fQUNUSU9OX0FEREJBX1JFUSwgKHUxNilwcGFybS0+dGlkKTsKLQkJbW9kX3RpbWVyKCZwc3RhLT5hZGRiYV9yZXRyeV90aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQUREQkFfVE8pKTsKLQl9IGVsc2UKLQkJcHN0YS0+aHRwcml2LmNhbmRpZGF0ZV90aWRfYml0bWFwICY9IH5CSVQocHBhcm0tPnRpZCk7Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBzZXRfdHhfYmVhY29uX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBjbWRfb2JqICpwaDJjOwotCXN0cnVjdCBUeF9CZWFjb25fcGFyYW0gKnB0eEJlYWNvbl9wYXJtOwotCXN0cnVjdCBjbWRfcHJpdgkqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQl1OCByZXMgPSBfU1VDQ0VTUzsKLQlpbnQgbGVuX2RpZmYgPSAwOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwaDJjKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHR4QmVhY29uX3Bhcm0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgVHhfQmVhY29uX3BhcmFtKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwdHhCZWFjb25fcGFybSkgewotCQlrZnJlZShwaDJjKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQltZW1jcHkoJnB0eEJlYWNvbl9wYXJtLT5uZXR3b3JrLCAmcG1sbWVpbmZvLT5uZXR3b3JrLAotCSAgICAgICBzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpKTsKLQotCWxlbl9kaWZmID0gdXBkYXRlX2hpZGRlbl9zc2lkKHB0eEJlYWNvbl9wYXJtLT5uZXR3b3JrLklFcywKLQkJCQkgICAgICBwdHhCZWFjb25fcGFybS0+bmV0d29yay5JRUxlbmd0aCwKLQkJCQkgICAgICBwbWxtZWluZm8tPmhpZGRlbl9zc2lkX21vZGUpOwotCXB0eEJlYWNvbl9wYXJtLT5uZXR3b3JrLklFTGVuZ3RoICs9IGxlbl9kaWZmOwotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHR4QmVhY29uX3Bhcm0sCi0JCQkJICAgR0VOX0NNRF9DT0RFKF9UWF9CZWFjb24pKTsKLQotCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGgyYyk7Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotaW50IG1sbWVfZXZ0X2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQl1OCBldnRfY29kZSwgZXZ0X3NlcTsKLQl1MTYgZXZ0X3N6OwotCWNvbnN0IHN0cnVjdCBDMkhFdmVudF9IZWFkZXIgKmMyaDsKLQl2b2lkICgqZXZlbnRfY2FsbGJhY2spKHN0cnVjdCBydHdfYWRhcHRlciAqZGV2LCBjb25zdCB1OCAqcGJ1Zik7Ci0KLQljMmggPSAoc3RydWN0IEMySEV2ZW50X0hlYWRlciAqKXBidWY7Ci0JZXZ0X3N6ID0gYzJoLT5sZW47Ci0JZXZ0X3NlcSA9IGMyaC0+c2VxOwotCWV2dF9jb2RlID0gYzJoLT5JRDsKLQotCS8qICBjaGVja2luZyBpZiBldmVudCBjb2RlIGlzIHZhbGlkICovCi0JaWYgKGV2dF9jb2RlID49IE1BWF9DMkhFVlQpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICJFdmVudCBDb2RlKCVkKSBtaXNtYXRjaCFcbiIsIGV2dF9jb2RlKTsKLQkJZ290byBfYWJvcnRfZXZlbnRfOwotCX0KLQotCS8qICBjaGVja2luZyBpZiBldmVudCBzaXplIG1hdGNoIHRoZSBldmVudCBwYXJtIHNpemUgKi8KLQlpZiAod2xhbmV2ZW50c1tldnRfY29kZV0ucGFybXNpemUgIT0gMCAmJgotCSAgICB3bGFuZXZlbnRzW2V2dF9jb2RlXS5wYXJtc2l6ZSAhPSBldnRfc3opIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICJFdmVudCglZCkgUGFybSBTaXplIG1pc21hdGNoICglZCB2cyAlZCkhXG4iLAotCQkJIGV2dF9jb2RlLCB3bGFuZXZlbnRzW2V2dF9jb2RlXS5wYXJtc2l6ZSwgZXZ0X3N6KTsKLQkJZ290byBfYWJvcnRfZXZlbnRfOwotCX0KLQotCWV2ZW50X2NhbGxiYWNrID0gd2xhbmV2ZW50c1tldnRfY29kZV0uZXZlbnRfY2FsbGJhY2s7Ci0JZXZlbnRfY2FsbGJhY2socGFkYXB0ZXIsIHBidWYgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOwotCi1fYWJvcnRfZXZlbnRfOgotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgaDJjX21zZ19oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JaWYgKCFwYnVmKQotCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCB0eF9iZWFjb25faGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCWlmIChzZW5kX2JlYWNvbjIzYShwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJREJHXzg3MjNBKCJpc3N1ZV9iZWFjb24yM2EsIGZhaWwhXG4iKTsKLQkJcmV0dXJuIEgyQ19QQVJBTUVURVJTX0VSUk9SOwotCX0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQllbHNlIHsgLyogdHggYmMvbWMgZnJhbWVzIGFmdGVyIHVwZGF0ZSBUSU0gKi8KLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhX2JtYzsKLQkJc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0JCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCAqcHRtcDsKLQkJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQkJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCQkvKiBmb3IgQkMvTUMgRnJhbWVzICovCi0JCXBzdGFfYm1jID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCQlpZiAoIXBzdGFfYm1jKQotCQkJcmV0dXJuIEgyQ19TVUNDRVNTOwotCi0JCWlmIChwc3RhcHJpdi0+dGltX2JpdG1hcCAmIEJJVCgwKSAmJiBwc3RhX2JtYy0+c2xlZXBxX2xlbiA+IDApIHsKLQkJCW1zbGVlcCgxMCk7LyogIDEwbXMsIEFUSU0oSElRKSBXaW5kb3dzICovCi0JCQkvKiBzcGluX2xvY2tfYmgoJnBzdGFfYm1jLT5zbGVlcF9xLmxvY2spOyAqLwotCQkJc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JCQlwaGVhZCA9IGdldF9saXN0X2hlYWQoJnBzdGFfYm1jLT5zbGVlcF9xKTsKLQotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4bWl0ZnJhbWUsIHB0bXAsCi0JCQkJCQkgcGhlYWQsIGxpc3QpIHsKLQotCQkJCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCi0JCQkJcHN0YV9ibWMtPnNsZWVwcV9sZW4tLTsKLQkJCQlpZiAocHN0YV9ibWMtPnNsZWVwcV9sZW4+MCkKLQkJCQkJcHhtaXRmcmFtZS0+YXR0cmliLm1kYXRhID0gMTsKLQkJCQllbHNlCi0JCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDA7Ci0KLQkJCQlweG1pdGZyYW1lLT5hdHRyaWIudHJpZ2dlcmVkID0gMTsKLQotCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5xc2VsID0gMHgxMTsvKiBISVEgKi8KLQotCQkJCXJ0bDg3MjNhdV9oYWxfeG1pdGZyYW1lX2VucXVldWUocGFkYXB0ZXIsCi0JCQkJCQkJCXB4bWl0ZnJhbWUpOwotCQkJfQotCQkJLyogc3Bpbl91bmxvY2tfYmgoJnBzdGFfYm1jLT5zbGVlcF9xLmxvY2spOyAqLwotCQkJc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCXJldHVybiBIMkNfU1VDQ0VTUzsKLX0KLQotaW50IHNldF9jaF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JY29uc3Qgc3RydWN0IHNldF9jaF9wYXJtICpzZXRfY2hfcGFybTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JaWYgKCFwYnVmKQotCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQlzZXRfY2hfcGFybSA9IChzdHJ1Y3Qgc2V0X2NoX3Bhcm0gKilwYnVmOwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGNoOiV1LCBidzoldSwgY2hfb2Zmc2V0OiV1XG4iLCBfX2Z1bmNfXywKLQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwgc2V0X2NoX3Bhcm0tPmNoLAotCQkgIHNldF9jaF9wYXJtLT5idywgc2V0X2NoX3Bhcm0tPmNoX29mZnNldCk7Ci0KLQlwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPSBzZXRfY2hfcGFybS0+Y2g7Ci0JcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBzZXRfY2hfcGFybS0+Y2hfb2Zmc2V0OwotCXBtbG1lZXh0LT5jdXJfYndtb2RlID0gc2V0X2NoX3Bhcm0tPmJ3OwotCi0Jc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCBzZXRfY2hfcGFybS0+Y2gsCi0JCQkgICAgICBzZXRfY2hfcGFybS0+Y2hfb2Zmc2V0LCBzZXRfY2hfcGFybS0+YncpOwotCi0JcmV0dXJuIEgyQ19TVUNDRVNTOwotfQotCi1pbnQgc2V0X2NocGxhbl9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpCi17Ci0JY29uc3Qgc3RydWN0IFNldENoYW5uZWxQbGFuX3BhcmFtICpzZXRDaGFubmVsUGxhbl9wYXJhbTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCi0JaWYgKCFwYnVmKQotCQlyZXR1cm4gSDJDX1BBUkFNRVRFUlNfRVJST1I7Ci0KLQlzZXRDaGFubmVsUGxhbl9wYXJhbSA9IChzdHJ1Y3QgU2V0Q2hhbm5lbFBsYW5fcGFyYW0gKilwYnVmOwotCi0JcG1sbWVleHQtPm1heF9jaGFuX251bXMgPQotCQlpbml0X2NoYW5uZWxfc2V0KHBhZGFwdGVyLCBzZXRDaGFubmVsUGxhbl9wYXJhbS0+Y2hhbm5lbF9wbGFuLAotCQkJCSBwbWxtZWV4dC0+Y2hhbm5lbF9zZXQpOwotCWluaXRfY2hhbm5lbF9saXN0KHBhZGFwdGVyLCBwbWxtZWV4dC0+Y2hhbm5lbF9zZXQsCi0JCQkgIHBtbG1lZXh0LT5tYXhfY2hhbl9udW1zLCAmcG1sbWVleHQtPmNoYW5uZWxfbGlzdCk7Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBsZWRfYmxpbmtfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCXN0cnVjdCBMZWRCbGlua19wYXJhbSAqbGVkQmxpbmtfcGFyYW07Ci0KLQlpZiAoIXBidWYpCi0JCXJldHVybiBIMkNfUEFSQU1FVEVSU19FUlJPUjsKLQotCWxlZEJsaW5rX3BhcmFtID0gKHN0cnVjdCBMZWRCbGlua19wYXJhbSAqKXBidWY7Ci0KLQlyZXR1cm4gSDJDX1NVQ0NFU1M7Ci19Ci0KLWludCBzZXRfY3NhX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlyZXR1cm4gSDJDX1JFSkVDVEVEOwotfQotCi0vKiAgVERMU19XUkNSCQk6IHdyaXRlIFJDUiBEQVRBIEJJVCAqLwotLyogIFRETFNfU0RfUFRJCQk6IGlzc3VlIHBlZXIgdHJhZmZpYyBpbmRpY2F0aW9uICovCi0vKiAgVERMU19DU19PRkYJCTogZ28gYmFjayB0byB0aGUgY2hhbm5lbCBsaW5rZWQgd2l0aCBBUCwKLQkJCSAgdGVybWluYXRpbmcgY2hhbm5lbCBzd2l0Y2ggcHJvY2VkdXJlICovCi0vKiAgVERMU19JTklUX0NIX1NFTgk6IGluaXQgY2hhbm5lbCBzZW5zaW5nLCByZWNlaXZlIGFsbCBkYXRhIGFuZAotCQkJICBtZ250IGZyYW1lICovCi0vKiAgVERMU19ET05FX0NIX1NFTgk6IGNoYW5uZWwgc2Vuc2luZyBhbmQgcmVwb3J0IGNhbmRpZGF0ZSBjaGFubmVsICovCi0vKiAgVERMU19PRkZfQ0gJCTogZmlyc3QgdGltZSBzZXQgY2hhbm5lbCB0byBvZmYgY2hhbm5lbCAqLwotLyogIFRETFNfQkFTRV9DSAk6IGdvIGJhY2sgdHAgdGhlIGNoYW5uZWwgbGlua2VkIHdpdGggQVAgd2hlbiBzZXQKLQkJCSAgYmFzZSBjaGFubmVsIGFzIHRhcmdldCBjaGFubmVsICovCi0vKiAgVERMU19QX09GRl9DSAk6IHBlcmlvZGljYWxseSBnbyB0byBvZmYgY2hhbm5lbCAqLwotLyogIFRETFNfUF9CQVNFX0NICTogcGVyaW9kaWNhbGx5IGdvIGJhY2sgdG8gYmFzZSBjaGFubmVsICovCi0vKiAgVERMU19SU19SQ1IJCTogcmVzdG9yZSBSQ1IgKi8KLS8qICBURExTX0NLQUxWX1BIMQk6IGNoZWNrIGFsaXZlIHRpbWVyIHBoYXNlMSAqLwotLyogIFRETFNfQ0tBTFZfUEgyCTogY2hlY2sgYWxpdmUgdGltZXIgcGhhc2UyICovCi0vKiAgVERMU19GUkVFX1NUQQk6IGZyZWUgdGRscyBzdGEgKi8KLWludCB0ZGxzX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKLXsKLQlyZXR1cm4gSDJDX1JFSkVDVEVEOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19wd3JjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3B3cmN0cmwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ4OGExMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3B3cmN0cmwuYworKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUV19QV1JDVFJMX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2NtZC5oPgotI2luY2x1ZGUgPHJ0d19zcmVzZXQuaD4KLQotI2luY2x1ZGUgPHJ0bDg3MjNhX2J0X2ludGYuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLXZvaWQgaXBzX2VudGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlkb3duKCZwd3Jwcml2LT5sb2NrKTsKLQotCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IHRydWU7Ci0KLQkvKiAgc3luIGlwc19tb2RlIHdpdGggcmVxdWVzdCAqLwotCXB3cnByaXYtPmlwc19tb2RlID0gcHdycHJpdi0+aXBzX21vZGVfcmVxOwotCi0JcHdycHJpdi0+aXBzX2VudGVyMjNhX2NudHMrKzsKLQlEQkdfODcyM0EoIj09Pmlwc19lbnRlcjIzYSBjbnRzOiVkXG4iLCBwd3Jwcml2LT5pcHNfZW50ZXIyM2FfY250cyk7Ci0JcnRsODcyM2FfQlRfZGlzYWJsZV9jb2V4aXN0KHBhZGFwdGVyKTsKLQotCWlmIChwd3Jwcml2LT5jaGFuZ2VfcmZwd3JzdGF0ZSA9PSByZl9vZmYpIHsKLQkJcHdycHJpdi0+YnBvd2VyX3NhdmluZyA9IHRydWU7Ci0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJub2xpbmtlZCBwb3dlciBzYXZlIGVudGVyXG4iKTsKLQotCQlpZiAocHdycHJpdi0+aXBzX21vZGUgPT0gSVBTX0xFVkVMXzIpCi0JCQlwd3Jwcml2LT5ia2VlcGZ3YWxpdmUgPSB0cnVlOwotCi0JCXJ0d19pcHNfcHdyX2Rvd24yM2EocGFkYXB0ZXIpOwotCQlwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29mZjsKLQl9Ci0JcHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nID0gZmFsc2U7Ci0KLQl1cCgmcHdycHJpdi0+bG9jayk7Ci19Ci0KLWludCBpcHNfbGVhdmUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JaW50IHJlc3VsdCA9IF9TVUNDRVNTOwotCWludCBrZXlpZDsKLQotCWRvd24oJnB3cnByaXYtPmxvY2spOwotCi0JaWYgKHB3cnByaXYtPnJmX3B3cnN0YXRlID09IHJmX29mZiAmJiAhcHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nKSB7Ci0JCXB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyA9IHRydWU7Ci0JCXB3cnByaXYtPmNoYW5nZV9yZnB3cnN0YXRlID0gcmZfb247Ci0JCXB3cnByaXYtPmlwc19sZWF2ZTIzYV9jbnRzKys7Ci0JCURCR184NzIzQSgiPT0+aXBzX2xlYXZlMjNhIGNudHM6JWRcbiIsCi0JCQkgIHB3cnByaXYtPmlwc19sZWF2ZTIzYV9jbnRzKTsKLQotCQlyZXN1bHQgPSBydHdfaXBzX3B3cl91cDIzYShwYWRhcHRlcik7Ci0JCWlmIChyZXN1bHQgPT0gX1NVQ0NFU1MpCi0JCQlwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29uOwotCi0JCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJub2xpbmtlZCBwb3dlciBzYXZlIGxlYXZlXG4iKTsKLQotCQlpZiAocHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9PQotCQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkJICAgIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkJICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgewotCQkJREJHXzg3MjNBKCI9PT4lcywgY2hhbm5lbCglZCksIHByb2Nlc3NpbmcoJXgpXG4iLAotCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5tbG1lZXh0cHJpdi5jdXJfY2hhbm5lbCwKLQkJCQkgIHB3cnByaXYtPmJpcHNfcHJvY2Vzc2luZyk7Ci0JCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsCi0JCQkJCSAgICAgIHBhZGFwdGVyLT5tbG1lZXh0cHJpdi5jdXJfY2hhbm5lbCwKLQkJCQkJICAgICAgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSwKLQkJCQkJICAgICAgSFRfQ0hBTk5FTF9XSURUSF8yMCk7Ci0JCQlmb3IgKGtleWlkID0gMDsga2V5aWQgPCA0OyBrZXlpZCsrKSB7Ci0JCQkJaWYgKHBtbG1lcHJpdi0+a2V5X21hc2sgJiBCSVQoa2V5aWQpKSB7Ci0JCQkJCWlmIChrZXlpZCA9PQotCQkJCQkgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXgpCi0JCQkJCQlyZXN1bHQgPSBydHdfc2V0X2tleTIzYShwYWRhcHRlciwgcHNlY3VyaXR5cHJpdiwga2V5aWQsIDEpOwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQgPSBydHdfc2V0X2tleTIzYShwYWRhcHRlciwgcHNlY3VyaXR5cHJpdiwga2V5aWQsIDApOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCURCR184NzIzQSgiPT0+IGlwc19sZWF2ZTIzYS4uLi4uTEVEKDB4JTA4eCkuLi5cbiIsCi0JCQkgIHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NGMpKTsKLQkJcHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nID0gZmFsc2U7Ci0KLQkJcHdycHJpdi0+YmtlZXBmd2FsaXZlID0gZmFsc2U7Ci0JCXB3cnByaXYtPmJwb3dlcl9zYXZpbmcgPSBmYWxzZTsKLQl9Ci0KLQl1cCgmcHdycHJpdi0+bG9jayk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLXN0YXRpYyBib29sIHJ0d19wd3JfdW5hc3NvY2lhdGVkX2lkbGUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdF9wcml2ID0gJmFkYXB0ZXItPnhtaXRwcml2OwotCi0JYm9vbCByZXQgPSBmYWxzZTsKLQotCWlmICh0aW1lX2FmdGVyX2VxKGFkYXB0ZXItPnB3cmN0cmxwcml2Lmlwc19kZW55X3RpbWUsIGppZmZpZXMpKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVNPQ19TVEFURXxXSUZJX1NJVEVfTU9OSVRPUikgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfVU5ERVJfTElOS0lOR3xXSUZJX1VOREVSX1dQUykgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURXxXSUZJX0FESE9DX1NUQVRFKSl7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocHhtaXRfcHJpdi0+ZnJlZV94bWl0YnVmX2NudCAhPSBOUl9YTUlUQlVGRiB8fAotCQlweG1pdF9wcml2LT5mcmVlX3htaXRfZXh0YnVmX2NudCAhPSBOUl9YTUlUX0VYVEJVRkYpIHsKLQkJREJHXzg3MjNBX0xFVkVMKF9kcnZfYWx3YXlzXywKLQkJCQkiVGhlcmUgYXJlIHNvbWUgcGt0cyB0byB0cmFuc21pdFxuIik7Ci0JCURCR184NzIzQV9MRVZFTChfZHJ2X2luZm9fLCAiZnJlZV94bWl0YnVmX2NudDogJWQsICIKLQkJCQkiZnJlZV94bWl0X2V4dGJ1Zl9jbnQ6ICVkXG4iLAotCQkJCXB4bWl0X3ByaXYtPmZyZWVfeG1pdGJ1Zl9jbnQsCi0JCQkJcHhtaXRfcHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9jbnQpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcmV0ID0gdHJ1ZTsKLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHJ0d19wc19wcm9jZXNzb3IyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JcHdycHJpdi0+cHNfcHJvY2Vzc2luZyA9IHRydWU7Ci0KLQlpZiAocHdycHJpdi0+Ymlwc19wcm9jZXNzaW5nID09IHRydWUpCi0JCWdvdG8gZXhpdDsKLQotCWlmIChwd3Jwcml2LT5pcHNfbW9kZV9yZXEgPT0gSVBTX05PTkUpCi0JCWdvdG8gZXhpdDsKLQotCWlmICghcnR3X3B3cl91bmFzc29jaWF0ZWRfaWRsZShwYWRhcHRlcikpCi0JCWdvdG8gZXhpdDsKLQotCWlmIChwd3Jwcml2LT5yZl9wd3JzdGF0ZSA9PSByZl9vbiAmJgotCSAgICAocHdycHJpdi0+cHdyX3N0YXRlX2NoZWNrX2NudHMgJSA0KSA9PSAwKSB7Ci0JCURCR184NzIzQSgiPT0+JXMgLmZ3X3N0YXRlKCV4KVxuIiwgX19mdW5jX18sCi0JCQkgIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCQlwd3Jwcml2LT5jaGFuZ2VfcmZwd3JzdGF0ZSA9IHJmX29mZjsKLQkJaXBzX2VudGVyMjNhKHBhZGFwdGVyKTsKLQl9Ci1leGl0OgotCXJ0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKCZwYWRhcHRlci0+cHdyY3RybHByaXYpOwotCXB3cnByaXYtPnBzX3Byb2Nlc3NpbmcgPSBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgcHdyX3N0YXRlX2NoZWNrX2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQotCXJ0d19wc19jbWQyM2EocGFkYXB0ZXIpOwotfQotCi0vKgotICoKLSAqIFBhcmFtZXRlcnMKLSAqICAgcGFkYXB0ZXIKLSAqICAgcHNsdglwb3dlciBzdGF0ZSBsZXZlbCwgb25seSBjb3VsZCBiZSBQU19TVEFURV9TMCB+IFBTX1NUQVRFX1M0Ci0gKgotICovCi12b2lkIHJ0d19zZXRfcnB3bTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBwc2x2KQotewotCXU4IHJwd207Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlwc2x2ID0gUFNfU1RBVEUocHNsdik7Ci0KLQlpZiAocHdycHJpdi0+YnRjb2V4X3Jmb24pIHsKLQkJaWYgKHBzbHYgPCBQU19TVEFURV9TNCkKLQkJCXBzbHYgPSBQU19TVEFURV9TMzsKLQl9Ci0KLQlpZiAocHdycHJpdi0+cnB3bSA9PSBwc2x2KSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBBbHJlYWR5IHNldCBycHdtWzB4JTAyWF0sIG5ldyA9IDB4JTAyWCFcbiIsCi0JCQkgX19mdW5jX18sIHB3cnByaXYtPnJwd20sIHBzbHYpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUgfHwKLQkgICAgcGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkID09IGZhbHNlKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBTdXJwcmlzZVJlbW92ZWQoJWQpIGh3X2luaXRfY29tcGxldGVkKCVkKVxuIiwKLQkJCSBfX2Z1bmNfXywgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQsCi0JCQkgcGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkKTsKLQotCQlwd3Jwcml2LT5jcHdtID0gUFNfU1RBVEVfUzQ7Ci0KLQkJcmV0dXJuOwotCX0KLQotCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gdHJ1ZSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogY2hhbmdlIHBvd2VyIHN0YXRlKDB4JTAyWCkgd2hlbiBEcml2ZXJTdG9wcGVkXG4iLAotCQkJIF9fZnVuY19fLCBwc2x2KTsKLQotCQlpZiAocHNsdiA8IFBTX1NUQVRFX1MyKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9lcnJfLAotCQkJCSAiJXM6IFJlamVjdCB0byBlbnRlciBQU19TVEFURSgweCUwMlgpIGxvd2VyIHRoYW4gUzIgd2hlbiBEcml2ZXJTdG9wcGVkISFcbiIsCi0JCQkJIF9fZnVuY19fLCBwc2x2KTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXJwd20gPSBwc2x2IHwgcHdycHJpdi0+dG9nOwotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAicnR3X3NldF9ycHdtMjNhOiBycHdtID0gMHglMDJ4IGNwd20gPSAweCUwMnhcbiIsCi0JCSBycHdtLCBwd3Jwcml2LT5jcHdtKTsKLQotCXB3cnByaXYtPnJwd20gPSBwc2x2OwotCi0JcnRsODcyM2Ffc2V0X3Jwd20ocGFkYXB0ZXIsIHJwd20pOwotCi0JcHdycHJpdi0+dG9nICs9IDB4ODA7Ci0JcHdycHJpdi0+Y3B3bSA9IHBzbHY7Ci19Ci0KLXN0YXRpYyBib29sIFBTX1JEWV9DSEVDSyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXVuc2lnbmVkIGxvbmcgZGVsdGFfdGltZTsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JZGVsdGFfdGltZSA9IGppZmZpZXMgLSBwd3Jwcml2LT5EZWxheUxQU0xhc3RUaW1lU3RhbXA7Ci0KLQlpZiAoZGVsdGFfdGltZSA8IExQU19ERUxBWV9USU1FKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSB8fAotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpIHx8Ci0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgfHwKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHB3cnByaXYtPmJJblN1c3BlbmQpCi0JCXJldHVybiBmYWxzZTsKLQlpZiAocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtID09IGRvdDExQXV0aEFsZ3J0aG1fODAyMVggJiYKLQkgICAgIXBhZGFwdGVyLT5zZWN1cml0eXByaXYuYmluc3RhbGxHcnBrZXkpIHsKLQkJREJHXzg3MjNBKCJHcm91cCBoYW5kc2hha2Ugc3RpbGwgaW4gcHJvZ3Jlc3MgISEhXG4iKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlpZiAoIXJ0d19jZmc4MDIxMV9wd3JfbWdtdChwYWRhcHRlcikpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi12b2lkIHJ0d19zZXRfcHNfbW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBwc19tb2RlLAotCQkJdTggc21hcnRfcHMsIHU4IGJjbl9hbnRfbW9kZSkKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAiJXM6IFBvd2VyTW9kZSA9JWQgU21hcnRfUFMgPSVkXG4iLAotCQkgX19mdW5jX18sIHBzX21vZGUsIHNtYXJ0X3BzKTsKLQotCWlmIChwc19tb2RlID4gUE1fQ2FyZF9EaXNhYmxlKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInBzX21vZGU6JWQgZXJyb3JcbiIsIHBzX21vZGUpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHB3cnByaXYtPnB3cl9tb2RlID09IHBzX21vZGUpIHsKLQkJaWYgKFBTX01PREVfQUNUSVZFID09IHBzX21vZGUpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHB3cnByaXYtPnNtYXJ0X3BzID09IHNtYXJ0X3BzICYmCi0JCSAgICBwd3Jwcml2LT5iY25fYW50X21vZGUgPT0gYmNuX2FudF9tb2RlKQotCQkJcmV0dXJuOwotCX0KLQotCWlmIChwc19tb2RlID09IFBTX01PREVfQUNUSVZFKSB7Ci0JCURCR184NzIzQSgicnR3X3NldF9wc19tb2RlMjNhOiBMZWF2ZSA4MDIuMTEgcG93ZXIgc2F2ZVxuIik7Ci0KLQkJcHdycHJpdi0+cHdyX21vZGUgPSBwc19tb2RlOwotCQlydHdfc2V0X3Jwd20yM2EocGFkYXB0ZXIsIFBTX1NUQVRFX1M0KTsKLQkJcnRsODcyM2Ffc2V0X0Z3UHdyTW9kZV9jbWQocGFkYXB0ZXIsIHBzX21vZGUpOwotCQlwd3Jwcml2LT5iRndDdXJyZW50SW5QU01vZGUgPSBmYWxzZTsKLQl9IGVsc2UgewotCQlpZiAoUFNfUkRZX0NIRUNLKHBhZGFwdGVyKSB8fAotCQkgICAgcnRsODcyM2FfQlRfdXNpbmdfYW50ZW5uYV8xKHBhZGFwdGVyKSkgewotCQkJREJHXzg3MjNBKCIlczogRW50ZXIgODAyLjExIHBvd2VyIHNhdmVcbiIsIF9fZnVuY19fKTsKLQotCQkJcHdycHJpdi0+YkZ3Q3VycmVudEluUFNNb2RlID0gdHJ1ZTsKLQkJCXB3cnByaXYtPnB3cl9tb2RlID0gcHNfbW9kZTsKLQkJCXB3cnByaXYtPnNtYXJ0X3BzID0gc21hcnRfcHM7Ci0JCQlwd3Jwcml2LT5iY25fYW50X21vZGUgPSBiY25fYW50X21vZGU7Ci0JCQlydGw4NzIzYV9zZXRfRndQd3JNb2RlX2NtZChwYWRhcHRlciwgcHNfbW9kZSk7Ci0KLQkJCXJ0d19zZXRfcnB3bTIzYShwYWRhcHRlciwgUFNfU1RBVEVfUzIpOwotCQl9Ci0JfQotfQotCi0vKgotICogUmV0dXJuOgotICoJMDoJTGVhdmUgT0sKLSAqCS0xOglUaW1lb3V0Ci0gKgktMjoJT3RoZXIgZXJyb3IKLSAqLwotczMyIExQU19SRl9PTl9jaGVjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgZGVsYXlfbXMpCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lLCBlbmRfdGltZTsKLQl1OCBiQXdha2UgPSBmYWxzZTsKLQlzMzIgZXJyID0gMDsKLQotCXN0YXJ0X3RpbWUgPSBqaWZmaWVzOwotCWVuZF90aW1lID0gc3RhcnRfdGltZSArIG1zZWNzX3RvX2ppZmZpZXMoZGVsYXlfbXMpOwotCi0Jd2hpbGUgKDEpIHsKLQkJYkF3YWtlID0gcnRsODcyM2FfZ2V0X2Z3bHBzX3JmX29uKHBhZGFwdGVyKTsKLQkJaWYgKGJBd2FrZSA9PSB0cnVlKQotCQkJYnJlYWs7Ci0KLQkJaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUpIHsKLQkJCWVyciA9IC0yOwotCQkJREJHXzg3MjNBKCIlczogZGV2aWNlIHN1cnByaXNlIHJlbW92ZWQhIVxuIiwgX19mdW5jX18pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBlbmRfdGltZSkpIHsKLQkJCWVyciA9IC0xOwotCQkJREJHXzg3MjNBKCIlczogV2FpdCBmb3IgRlcgTFBTIGxlYXZlIG1vcmUgdGhhbiAldSAiCi0JCQkJICAibXMhXG4iLCBfX2Z1bmNfXywgZGVsYXlfbXMpOwotCQkJYnJlYWs7Ci0JCX0KLQkJdWRlbGF5KDEwMCk7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotLyoJRGVzY3JpcHRpb246ICovCi0vKgkJRW50ZXIgdGhlIGxlaXN1cmUgcG93ZXIgc2F2ZSBtb2RlLiAqLwotdm9pZCBMUFNfRW50ZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCWlmICghUFNfUkRZX0NIRUNLKHBhZGFwdGVyKSkKLQkJcmV0dXJuOwotCi0JaWYgKHB3cnByaXYtPmJMZWlzdXJlUHMpIHsKLQkJLyogIElkbGUgZm9yIGEgd2hpbGUgaWYgd2UgY29ubmVjdCB0byBBUCBhIHdoaWxlIGFnby4gKi8KLQkJaWYgKHB3cnByaXYtPkxwc0lkbGVDb3VudCA+PSAyKSB7IC8qICAgNCBTZWMgKi8KLQkJCWlmIChwd3Jwcml2LT5wd3JfbW9kZSA9PSBQU19NT0RFX0FDVElWRSkgewotCQkJCXB3cnByaXYtPmJwb3dlcl9zYXZpbmcgPSB0cnVlOwotCQkJCURCR184NzIzQSgiJXMgc21hcnRfcHM6JWRcbiIsIF9fZnVuY19fLAotCQkJCQkgIHB3cnByaXYtPnNtYXJ0X3BzKTsKLQkJCQkvKiBGb3IgVGVuZGEgVzMxMVIgSU9UIGlzc3VlICovCi0JCQkJcnR3X3NldF9wc19tb2RlMjNhKHBhZGFwdGVyLAotCQkJCQkJICAgcHdycHJpdi0+cG93ZXJfbWdudCwKLQkJCQkJCSAgIHB3cnByaXYtPnNtYXJ0X3BzLCAwKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlwd3Jwcml2LT5McHNJZGxlQ291bnQrKzsKLQl9Ci19Ci0KLS8qCURlc2NyaXB0aW9uOiAqLwotLyoJCUxlYXZlIHRoZSBsZWlzdXJlIHBvd2VyIHNhdmUgbW9kZS4gKi8KLXZvaWQgTFBTX0xlYXZlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0jZGVmaW5lIExQU19MRUFWRV9USU1FT1VUX01TIDEwMAotCi0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlpZiAocHdycHJpdi0+YkxlaXN1cmVQcykgewotCQlpZiAocHdycHJpdi0+cHdyX21vZGUgIT0gUFNfTU9ERV9BQ1RJVkUpIHsKLQkJCXJ0d19zZXRfcHNfbW9kZTIzYShwYWRhcHRlciwgUFNfTU9ERV9BQ1RJVkUsIDAsIDApOwotCi0JCQlpZiAocHdycHJpdi0+cHdyX21vZGUgPT0gUFNfTU9ERV9BQ1RJVkUpCi0JCQkJTFBTX1JGX09OX2NoZWNrMjNhKHBhZGFwdGVyLAotCQkJCQkJICAgTFBTX0xFQVZFX1RJTUVPVVRfTVMpOwotCQl9Ci0JfQotCi0JcHdycHJpdi0+YnBvd2VyX3NhdmluZyA9IGZhbHNlOwotfQotCi0vKiAgRGVzY3JpcHRpb246IExlYXZlIGFsbCBwb3dlciBzYXZlIG1vZGU6IExQUywgRndMUFMsIElQUyBpZiBuZWVkZWQuICovCi0vKiAgTW92ZSBjb2RlIHRvIGZ1bmN0aW9uIGJ5IHR5bmxpLiAyMDEwLjAzLjI2LiAqLwotdm9pZCBMZWF2ZUFsbFBvd2VyU2F2ZU1vZGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZBZGFwdGVyLT5tbG1lcHJpdjsKLQl1OCBlbnF1ZXVlID0gMDsKLQotCS8qIERCR184NzIzQSgiJXMuLi4uLlxuIiwgX19mdW5jX18pOyAqLwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpCi0JCXJ0d19scHNfY3RybF93a19jbWQyM2EoQWRhcHRlciwgTFBTX0NUUkxfTEVBVkUsIGVucXVldWUpOwotfQotCi12b2lkIHJ0d19pbml0X3B3cmN0cmxfcHJpdjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmxwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCXNlbWFfaW5pdCgmcHdyY3RybHByaXYtPmxvY2ssIDEpOwotCXB3cmN0cmxwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29uOwotCXB3cmN0cmxwcml2LT5pcHNfZW50ZXIyM2FfY250cyA9IDA7Ci0JcHdyY3RybHByaXYtPmlwc19sZWF2ZTIzYV9jbnRzID0gMDsKLQlwd3JjdHJscHJpdi0+Ymlwc19wcm9jZXNzaW5nID0gZmFsc2U7Ci0KLQlwd3JjdHJscHJpdi0+aXBzX21vZGUgPSBwYWRhcHRlci0+cmVnaXN0cnlwcml2Lmlwc19tb2RlOwotCXB3cmN0cmxwcml2LT5pcHNfbW9kZV9yZXEgPSBwYWRhcHRlci0+cmVnaXN0cnlwcml2Lmlwc19tb2RlOwotCi0JcHdyY3RybHByaXYtPnB3cl9zdGF0ZV9jaGVja19pbnRlcnZhbCA9IFJUV19QV1JfU1RBVEVfQ0hLX0lOVEVSVkFMOwotCXB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfY250cyA9IDA7Ci0JcHdyY3RybHByaXYtPmJJblN1c3BlbmQgPSBmYWxzZTsKLQlwd3JjdHJscHJpdi0+YmtlZXBmd2FsaXZlID0gZmFsc2U7Ci0KLQlwd3JjdHJscHJpdi0+THBzSWRsZUNvdW50ID0gMDsKLQotCS8qICBQU19NT0RFX01JTjsgKi8KLQlwd3JjdHJscHJpdi0+cG93ZXJfbWdudCA9IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucG93ZXJfbWdudDsKLQlwd3JjdHJscHJpdi0+YkxlaXN1cmVQcyA9Ci0JCShQU19NT0RFX0FDVElWRSAhPSBwd3JjdHJscHJpdi0+cG93ZXJfbWdudCk/dHJ1ZTpmYWxzZTsKLQotCXB3cmN0cmxwcml2LT5iRndDdXJyZW50SW5QU01vZGUgPSBmYWxzZTsKLQotCXB3cmN0cmxwcml2LT5ycHdtID0gMDsKLQlwd3JjdHJscHJpdi0+Y3B3bSA9IFBTX1NUQVRFX1M0OwotCi0JcHdyY3RybHByaXYtPnB3cl9tb2RlID0gUFNfTU9ERV9BQ1RJVkU7Ci0JcHdyY3RybHByaXYtPnNtYXJ0X3BzID0gcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5zbWFydF9wczsKLQlwd3JjdHJscHJpdi0+YmNuX2FudF9tb2RlID0gMDsKLQotCXB3cmN0cmxwcml2LT50b2cgPSAweDgwOwotCi0JcHdyY3RybHByaXYtPmJ0Y29leF9yZm9uID0gZmFsc2U7Ci0KLQlzZXR1cF90aW1lcigmcHdyY3RybHByaXYtPnB3cl9zdGF0ZV9jaGVja190aW1lciwKLQkJICAgIHB3cl9zdGF0ZV9jaGVja19oYW5kbGVyLCAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7Ci19Ci0KLXZvaWQgcnR3X2ZyZWVfcHdyY3RybF9wcml2KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLX0KLQotaW5saW5lIHZvaWQgcnR3X3NldF9pcHNfZGVueTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbXMpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlwd3Jwcml2LT5pcHNfZGVueV90aW1lID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMobXMpOwotfQotCi0vKgotKiBydHdfcHdyX3dha2V1cCAtIFdha2UgdGhlIE5JQyB1cCBmcm9tOiAxKUlQUy4gMilVU0IgYXV0b3N1c3BlbmQKLSogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gX2FkYXB0ZXIgc3RydWN0dXJlCi0qIEBpcHNfZGVmZmVyX21zOiB0aGUgbXMgd2lsbCBwcmV2ZW50IGZyb20gZmFsbGluZyBpbnRvIElQUyBhZnRlciB3YWtldXAKLSogUmV0dXJuIF9TVUNDRVNTIG9yIF9GQUlMCi0qLwotCi1pbnQgX3J0d19wd3Jfd2FrZXVwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBpcHNfZGVmZmVyX21zLCBjb25zdCBjaGFyICpjYWxsZXIpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7Ci0JdW5zaWduZWQgbG9uZyBuZXdfZGVueV90aW1lOwotCi0JbmV3X2RlbnlfdGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGlwc19kZWZmZXJfbXMpOwotCi0JaWYgKHRpbWVfYmVmb3JlKHB3cnByaXYtPmlwc19kZW55X3RpbWUsIG5ld19kZW55X3RpbWUpKQotCQlwd3Jwcml2LT5pcHNfZGVueV90aW1lID0gbmV3X2RlbnlfdGltZTsKLQotCWlmIChwd3Jwcml2LT5wc19wcm9jZXNzaW5nKSB7Ci0JCURCR184NzIzQSgiJXMgd2FpdCBwc19wcm9jZXNzaW5nLi4uXG4iLCBfX2Z1bmNfXyk7Ci0JCXdoaWxlIChwd3Jwcml2LT5wc19wcm9jZXNzaW5nICYmCi0JCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkgPD0gMzAwMCkKLQkJCW1zbGVlcCgxMCk7Ci0JCWlmIChwd3Jwcml2LT5wc19wcm9jZXNzaW5nKQotCQkJREJHXzg3MjNBKCIlcyB3YWl0IHBzX3Byb2Nlc3NpbmcgdGltZW91dFxuIiwgX19mdW5jX18pOwotCQllbHNlCi0JCQlEQkdfODcyM0EoIiVzIHdhaXQgcHNfcHJvY2Vzc2luZyBkb25lXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0JaWYgKHJ0d19zcmVzZXRfaW5wcm9ncmVzcyhwYWRhcHRlcikpIHsKLQkJREJHXzg3MjNBKCIlcyB3YWl0IHNyZXNldF9pbnByb2dyZXNzLi4uXG4iLCBfX2Z1bmNfXyk7Ci0JCXdoaWxlIChydHdfc3Jlc2V0X2lucHJvZ3Jlc3MocGFkYXB0ZXIpICYmCi0JCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkgPD0gNDAwMCkKLQkJCW1zbGVlcCgxMCk7Ci0JCWlmIChydHdfc3Jlc2V0X2lucHJvZ3Jlc3MocGFkYXB0ZXIpKQotCQkJREJHXzg3MjNBKCIlcyB3YWl0IHNyZXNldF9pbnByb2dyZXNzIHRpbWVvdXRcbiIsCi0JCQkJICBfX2Z1bmNfXyk7Ci0JCWVsc2UKLQkJCURCR184NzIzQSgiJXMgd2FpdCBzcmVzZXRfaW5wcm9ncmVzcyBkb25lXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0JaWYgKHB3cnByaXYtPmJJblN1c3BlbmQpIHsKLQkJREJHXzg3MjNBKCIlcyB3YWl0IGJJblN1c3BlbmQuLi5cbiIsIF9fZnVuY19fKTsKLQkJd2hpbGUgKHB3cnByaXYtPmJJblN1c3BlbmQgJiYKLQkJICAgICAgIChqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkgPD0gMzAwMCkpIHsKLQkJCW1zbGVlcCgxMCk7Ci0JCX0KLQkJaWYgKHB3cnByaXYtPmJJblN1c3BlbmQpCi0JCQlEQkdfODcyM0EoIiVzIHdhaXQgYkluU3VzcGVuZCB0aW1lb3V0XG4iLCBfX2Z1bmNfXyk7Ci0JCWVsc2UKLQkJCURCR184NzIzQSgiJXMgd2FpdCBiSW5TdXNwZW5kIGRvbmVcbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQkvKiBTeXN0ZW0gc3VzcGVuZCBpcyBub3QgYWxsb3dlZCB0byB3YWtldXAgKi8KLQlpZiAocHdycHJpdi0+YkluU3VzcGVuZCkgewotCQlyZXQgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIEkgdGhpbmsgdGhpcyBzaG91bGQgYmUgY2hlY2sgaW4gSVBTLCBMUFMsIGF1dG9zdXNwZW5kIGZ1bmN0aW9ucy4uLiAqLwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocmZfb2ZmID09IHB3cnByaXYtPnJmX3B3cnN0YXRlKSB7Ci0JCURCR184NzIzQSgiJXMgY2FsbCBpcHNfbGVhdmUyM2EuLi4uXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChpcHNfbGVhdmUyM2EocGFkYXB0ZXIpPT0gX0ZBSUwpIHsKLQkJCURCR184NzIzQSgiPT09PT09PiBpcHNfbGVhdmUyM2EgZmFpbC4uLi4uLi4uLi4uLi5cbiIpOwotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9Ci0KLQkvKiBUT0RPOiB0aGUgZm9sbG93aW5nIGNoZWNraW5nIG5lZWQgdG8gYmUgbWVyZ2VkLi4uICovCi0JaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCAhcGFkYXB0ZXItPmJ1cCB8fAotCSAgICAhcGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkKSB7Ci0JCURCR184NzIzQSgiJXM6IGJEcml2ZXJTdG9wcGVkID0lZCwgYnVwID0lZCwgaHdfaW5pdF9jb21wbGV0ZWQgIgotCQkJICAiPSV1XG4iLCBjYWxsZXIsIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKLQkJCSAgcGFkYXB0ZXItPmJ1cCwgcGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLWV4aXQ6Ci0JbmV3X2RlbnlfdGltZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGlwc19kZWZmZXJfbXMpOwotCWlmICh0aW1lX2JlZm9yZShwd3Jwcml2LT5pcHNfZGVueV90aW1lLCBuZXdfZGVueV90aW1lKSkKLQkJcHdycHJpdi0+aXBzX2RlbnlfdGltZSA9IG5ld19kZW55X3RpbWU7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0d19wbV9zZXRfbHBzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1vZGUpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybHByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCi0JaWYgKG1vZGUgPCBQU19NT0RFX05VTSkgewotCQlpZiAocHdyY3RybHByaXYtPnBvd2VyX21nbnQgIT0gbW9kZSkgewotCQkJaWYgKFBTX01PREVfQUNUSVZFID09IG1vZGUpCi0JCQkJTGVhdmVBbGxQb3dlclNhdmVNb2RlMjNhKHBhZGFwdGVyKTsKLQkJCWVsc2UKLQkJCQlwd3JjdHJscHJpdi0+THBzSWRsZUNvdW50ID0gMjsKLQkJCXB3cmN0cmxwcml2LT5wb3dlcl9tZ250ID0gbW9kZTsKLQkJCXB3cmN0cmxwcml2LT5iTGVpc3VyZVBzID0KLQkJCQkoUFNfTU9ERV9BQ1RJVkUgIT0gcHdyY3RybHByaXYtPnBvd2VyX21nbnQpID8KLQkJCQl0cnVlOmZhbHNlOwotCQl9Ci0JfSBlbHNlCi0JCXJldCA9IC1FSU5WQUw7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcnR3X3BtX3NldF9pcHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbW9kZSkKLXsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQlpZiAobW9kZSAhPSBJUFNfTk9STUFMICYmIG1vZGUgIT0gSVBTX0xFVkVMXzIgJiYgbW9kZSAhPSBJUFNfTk9ORSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwd3JjdHJscHJpdi0+aXBzX21vZGVfcmVxID0gbW9kZTsKLQlpZiAobW9kZSA9PSBJUFNfTk9ORSkgewotCQlEQkdfODcyM0EoIiVzICVzXG4iLCBfX2Z1bmNfXywgIklQU19OT05FIik7Ci0JCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSAwICYmCi0JCSAgICBydHdfcHdyX3dha2V1cChwYWRhcHRlcikgPT0gX0ZBSUwpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19yZWN2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MGRhYmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19yZWN2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRXX1JFQ1ZfQ18KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+Ci0jaW5jbHVkZSA8dXNiX29wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9yZWN2Lmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfeG1pdC5oPgotCi12b2lkIHJ0d19zaWduYWxfc3RhdF90aW1lcl9oZGwyM2EodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotdm9pZCBfcnR3X2luaXRfc3RhX3JlY3ZfcHJpdjIzYShzdHJ1Y3Qgc3RhX3JlY3ZfcHJpdiAqcHN0YV9yZWN2cHJpdikKLXsKLQotCi0KLQlzcGluX2xvY2tfaW5pdCgmcHN0YV9yZWN2cHJpdi0+bG9jayk7Ci0KLQkvKiBmb3IgKGkgPSAwOyBpPE1BWF9SWF9OVU1CTEtTOyBpKyspICovCi0JLyoJX3J0d19pbml0X3F1ZXVlMjNhKCZwc3RhX3JlY3Zwcml2LT5ibGtfc3RybXNbaV0pOyAqLwotCi0JX3J0d19pbml0X3F1ZXVlMjNhKCZwc3RhX3JlY3Zwcml2LT5kZWZyYWdfcSk7Ci0KLQotfQotCi1pbnQgX3J0d19pbml0X3JlY3ZfcHJpdjIzYShzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYsCi0JCQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lOwotCWludCBpOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCXNwaW5fbG9ja19pbml0KCZwcmVjdnByaXYtPmxvY2spOwotCi0JX3J0d19pbml0X3F1ZXVlMjNhKCZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZSk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZwcmVjdnByaXYtPnJlY3ZfcGVuZGluZ19xdWV1ZSk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZwcmVjdnByaXYtPnVjX3N3ZGVjX3BlbmRpbmdfcXVldWUpOwotCi0JcHJlY3Zwcml2LT5hZGFwdGVyID0gcGFkYXB0ZXI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfUkVDVkZSQU1FIDsgaSsrKSB7Ci0JCXByZWN2ZnJhbWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVjdl9mcmFtZSksIEdGUF9LRVJORUwpOwotCQlpZiAoIXByZWN2ZnJhbWUpCi0JCQlicmVhazsKLQkJSU5JVF9MSVNUX0hFQUQoJnByZWN2ZnJhbWUtPmxpc3QpOwotCi0JCWxpc3RfYWRkX3RhaWwoJnByZWN2ZnJhbWUtPmxpc3QsCi0JCQkgICAgICAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUucXVldWUpOwotCi0JCXByZWN2ZnJhbWUtPmFkYXB0ZXIgPSBwYWRhcHRlcjsKLQkJcHJlY3ZmcmFtZSsrOwotCX0KLQotCXByZWN2cHJpdi0+ZnJlZV9yZWN2ZnJhbWVfY250ID0gaTsKLQlwcmVjdnByaXYtPnJ4X3BlbmRpbmdfY250ID0gMTsKLQotCXJlcyA9IHJ0bDg3MjNhdV9pbml0X3JlY3ZfcHJpdihwYWRhcHRlcik7Ci0KLQlzZXR1cF90aW1lcigmcHJlY3Zwcml2LT5zaWduYWxfc3RhdF90aW1lciwgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbDIzYSwKLQkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLQotCXByZWN2cHJpdi0+c2lnbmFsX3N0YXRfc2FtcGxpbmdfaW50ZXJ2YWwgPSAxMDAwOyAvKiBtcyAqLwotCi0JcnR3X3NldF9zaWduYWxfc3RhdF90aW1lcihwcmVjdnByaXYpOwotCi0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBfcnR3X2ZyZWVfcmVjdl9wcml2MjNhKHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3Zwcml2LT5hZGFwdGVyOwotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCAqcHRtcDsKLQotCXJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUyM2EocGFkYXB0ZXIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHByZWN2ZnJhbWUsIHB0bXAsCi0JCQkJICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZS5xdWV1ZSwgbGlzdCkgewotCQlsaXN0X2RlbF9pbml0KCZwcmVjdmZyYW1lLT5saXN0KTsKLQkJa2ZyZWUocHJlY3ZmcmFtZSk7Ci0JfQotCi0JcnRsODcyM2F1X2ZyZWVfcmVjdl9wcml2KHBhZGFwdGVyKTsKLX0KLQotc3RydWN0IHJlY3ZfZnJhbWUgKnJ0d19hbGxvY19yZWN2ZnJhbWUyM2Eoc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSkKLXsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcGZyYW1lOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2OwotCi0Jc3Bpbl9sb2NrX2JoKCZwZnJlZV9yZWN2X3F1ZXVlLT5sb2NrKTsKLQotCXBmcmFtZSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmcGZyZWVfcmVjdl9xdWV1ZS0+cXVldWUsCi0JCQkJCSAgc3RydWN0IHJlY3ZfZnJhbWUsIGxpc3QpOwotCWlmIChwZnJhbWUpIHsKLQkJbGlzdF9kZWxfaW5pdCgmcGZyYW1lLT5saXN0KTsKLQkJcGFkYXB0ZXIgPSBwZnJhbWUtPmFkYXB0ZXI7Ci0JCWlmIChwYWRhcHRlcikgewotCQkJcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKLQkJCWlmIChwZnJlZV9yZWN2X3F1ZXVlID09ICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZSkKLQkJCQlwcmVjdnByaXYtPmZyZWVfcmVjdmZyYW1lX2NudC0tOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJnBmcmVlX3JlY3ZfcXVldWUtPmxvY2spOwotCi0JcmV0dXJuIHBmcmFtZTsKLX0KLQotaW50IHJ0d19mcmVlX3JlY3ZmcmFtZTIzYShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gcHJlY3ZmcmFtZS0+YWRhcHRlcjsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCXN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3JlY3ZfcXVldWU7Ci0KLQlpZiAocHJlY3ZmcmFtZS0+cGt0KSB7Ci0JCWRldl9rZnJlZV9za2JfYW55KHByZWN2ZnJhbWUtPnBrdCk7LyogZnJlZSBza2IgYnkgZHJpdmVyICovCi0JCXByZWN2ZnJhbWUtPnBrdCA9IE5VTEw7Ci0JfQotCi0JcGZyZWVfcmVjdl9xdWV1ZSA9ICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZTsKLQlzcGluX2xvY2tfYmgoJnBmcmVlX3JlY3ZfcXVldWUtPmxvY2spOwotCi0JbGlzdF9kZWxfaW5pdCgmcHJlY3ZmcmFtZS0+bGlzdCk7Ci0KLQlsaXN0X2FkZF90YWlsKCZwcmVjdmZyYW1lLT5saXN0LCBnZXRfbGlzdF9oZWFkKHBmcmVlX3JlY3ZfcXVldWUpKTsKLQotCWlmIChwYWRhcHRlcikgewotCQlpZiAocGZyZWVfcmVjdl9xdWV1ZSA9PSAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUpCi0JCQlwcmVjdnByaXYtPmZyZWVfcmVjdmZyYW1lX2NudCsrOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwZnJlZV9yZWN2X3F1ZXVlLT5sb2NrKTsKLQotCi0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLWludCBydHdfZW5xdWV1ZV9yZWN2ZnJhbWUyM2Eoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBydHdfcXVldWUgKnF1ZXVlKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBwcmVjdmZyYW1lLT5hZGFwdGVyOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKLQotCWxpc3RfZGVsX2luaXQoJnByZWN2ZnJhbWUtPmxpc3QpOwotCi0JbGlzdF9hZGRfdGFpbCgmcHJlY3ZmcmFtZS0+bGlzdCwgZ2V0X2xpc3RfaGVhZChxdWV1ZSkpOwotCi0JaWYgKHBhZGFwdGVyKSB7Ci0JCWlmIChxdWV1ZSA9PSAmcHJlY3Zwcml2LT5mcmVlX3JlY3ZfcXVldWUpCi0JCQlwcmVjdnByaXYtPmZyZWVfcmVjdmZyYW1lX2NudCsrOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLS8qCi1jYWxsZXIgOiBkZWZyYWcgOyByZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYSBpbiByZWN2X3RocmVhZCAgKHBhc3NpdmUpCi1wZnJhbWVxdWV1ZTogZGVmcmFnX3F1ZXVlIDogd2lsbCBiZSBhY2Nlc3NlZCBpbiByZWN2X3RocmVhZCAgKHBhc3NpdmUpCi0KLXVzaW5nIHNwaW5sb2NrIHRvIHByb3RlY3QKLQotKi8KLQotc3RhdGljIHZvaWQgcnR3X2ZyZWVfcmVjdmZyYW1lMjNhX3F1ZXVlKHN0cnVjdCBydHdfcXVldWUgKnBmcmFtZXF1ZXVlKQotewotCXN0cnVjdCByZWN2X2ZyYW1lICpoZHIsICpwdG1wOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCi0Jc3Bpbl9sb2NrKCZwZnJhbWVxdWV1ZS0+bG9jayk7Ci0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmFtZXF1ZXVlKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaGRyLCBwdG1wLCBwaGVhZCwgbGlzdCkKLQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKGhkcik7Ci0Jc3Bpbl91bmxvY2soJnBmcmFtZXF1ZXVlLT5sb2NrKTsKLX0KLQotdTMyIHJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiBjbnQgPSAwOwotCXN0cnVjdCByZWN2X2ZyYW1lICpwZW5kaW5nX2ZyYW1lOwotCi0Jd2hpbGUgKChwZW5kaW5nX2ZyYW1lID0gcnR3X2FsbG9jX3JlY3ZmcmFtZTIzYSgmYWRhcHRlci0+cmVjdnByaXYudWNfc3dkZWNfcGVuZGluZ19xdWV1ZSkpKSB7Ci0JCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwZW5kaW5nX2ZyYW1lKTsKLQkJREJHXzg3MjNBKCIlczogZGVxdWV1ZSB1Y19zd2RlY19wZW5kaW5nX3F1ZXVlXG4iLCBfX2Z1bmNfXyk7Ci0JCWNudCsrOwotCX0KLQotCXJldHVybiBjbnQ7Ci19Ci0KLXN0cnVjdCByZWN2X2J1ZiAqcnR3X2RlcXVldWVfcmVjdmJ1ZjIzYSAoc3RydWN0IHJ0d19xdWV1ZSAqcXVldWUpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFMOwotCXN0cnVjdCByZWN2X2J1ZiAqcHJlY3ZidWY7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPmxvY2ssIGlycUwpOwotCi0JcHJlY3ZidWYgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJnF1ZXVlLT5xdWV1ZSwKLQkJCQkJICAgIHN0cnVjdCByZWN2X2J1ZiwgbGlzdCk7Ci0JaWYgKHByZWN2YnVmKQotCQlsaXN0X2RlbF9pbml0KCZwcmVjdmJ1Zi0+bGlzdCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+bG9jaywgaXJxTCk7Ci0KLQlyZXR1cm4gcHJlY3ZidWY7Ci19Ci0KLWludCByZWN2ZnJhbWVfY2hrbWljKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSk7Ci1pbnQgcmVjdmZyYW1lX2Noa21pYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCSAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpIHsKLQotCWludAlpLCByZXMgPSBfU1VDQ0VTUzsKLQl1MzIJZGF0YWxlbjsKLQl1OAltaWNjb2RlWzhdOwotCXU4CWJtaWNfZXJyID0gZmFsc2UsIGJycHRfbWljZXJyb3IgPSB0cnVlOwotCXU4CSpwZnJhbWUsICpwYXlsb2FkLCAqcGZyYW1lbWljOwotCXU4CSptaWNrZXk7Ci0Jc3RydWN0CXN0YV9pbmZvICpzdGFpbmZvOwotCXN0cnVjdAlyeF9wa3RfYXR0cmliICpwcnhhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwotCXN0cnVjdAlzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCi0Jc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmYWRhcHRlci0+c3RhcHJpdiwgJnByeGF0dHJpYi0+dGFbMF0pOwotCi0JaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICJyZWN2ZnJhbWVfY2hrbWljOnByeGF0dHJpYi0+ZW5jcnlwdCA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQXG4iKTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkgInJlY3ZmcmFtZV9jaGttaWM6ZGEgPSAlcE1cbiIsIHByeGF0dHJpYi0+cmEpOwotCi0JCS8qIGNhbGN1bGF0ZSBtaWMgY29kZSAqLwotCQlpZiAoc3RhaW5mbyAhPSBOVUxMKSB7Ci0JCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpIHsKLQkJCQltaWNrZXkgPSAmcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycHJ4bWlja2V5W3ByeGF0dHJpYi0+a2V5X2luZGV4XS5za2V5WzBdOwotCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAicmVjdmZyYW1lX2Noa21pYzogYmNtYyBrZXlcbiIpOwotCi0JCQkJaWYgKCFwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSkgewotCQkJCQlyZXMgPSBfRkFJTDsKLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sCi0JCQkJCQkgX2Rydl9lcnJfLAotCQkJCQkJICJyZWN2ZnJhbWVfY2hrbWljOmRpZG4ndCBpbnN0YWxsIGdyb3VwIGtleSFcbiIpOwotCQkJCQlEQkdfODcyM0EoIlxuIHJlY3ZmcmFtZV9jaGttaWM6ZGlkbid0ICIKLQkJCQkJCSAgImluc3RhbGwgZ3JvdXAga2V5ISEhISEhXG4iKTsKLQkJCQkJZ290byBleGl0OwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbWlja2V5ID0gJnN0YWluZm8tPmRvdDExdGtpcHJ4bWlja2V5LnNrZXlbMF07Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICJyZWN2ZnJhbWVfY2hrbWljOiB1bmljYXN0IGtleVxuIik7Ci0JCQl9Ci0KLQkJCS8qIGljdl9sZW4gaW5jbHVkZWQgdGhlIG1pYyBjb2RlICovCi0JCQlkYXRhbGVuID0gcHJlY3ZmcmFtZS0+cGt0LT5sZW4tcHJ4YXR0cmliLT4KLQkJCQloZHJsZW4tcHJ4YXR0cmliLT5pdl9sZW4tcHJ4YXR0cmliLT5pY3ZfbGVuIC0gODsKLQkJCXBmcmFtZSA9IHByZWN2ZnJhbWUtPnBrdC0+ZGF0YTsKLQkJCXBheWxvYWQgPSBwZnJhbWUgKyBwcnhhdHRyaWItPmhkcmxlbiArCi0JCQkJcHJ4YXR0cmliLT5pdl9sZW47Ci0KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAicHJ4YXR0cmliLT5pdl9sZW4gPSVkIHByeGF0dHJpYi0+aWN2X2xlbiA9JWRcbiIsCi0JCQkJIHByeGF0dHJpYi0+aXZfbGVuLCBwcnhhdHRyaWItPmljdl9sZW4pOwotCi0JCQkvKiBjYXJlIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgKi8KLQkJCXJ0d19zZWNjYWxjdGtpcG1pYzIzYShtaWNrZXksIHBmcmFtZSwgcGF5bG9hZCwKLQkJCQkJICAgZGF0YWxlbiwgJm1pY2NvZGVbMF0sCi0JCQkJCSAgICh1bnNpZ25lZCBjaGFyKXByeGF0dHJpYi0+cHJpb3JpdHkpOwotCi0JCQlwZnJhbWVtaWMgPSBwYXlsb2FkICsgZGF0YWxlbjsKLQotCQkJYm1pY19lcnIgPSBmYWxzZTsKLQotCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQkJCWlmIChtaWNjb2RlW2ldICE9ICoocGZyYW1lbWljICsgaSkpIHsKLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sCi0JCQkJCQkgX2Rydl9lcnJfLAotCQkJCQkJICJyZWN2ZnJhbWVfY2hrbWljOm1pY2NvZGVbJWRdKCUwMngpICE9ICoocGZyYW1lbWljKyVkKSglMDJ4KVxuIiwKLQkJCQkJCSBpLCBtaWNjb2RlW2ldLAotCQkJCQkJIGksICoocGZyYW1lbWljICsgaSkpOwotCQkJCQlibWljX2VyciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoYm1pY19lcnIgPT0gdHJ1ZSkgewotCQkJCWludCBpOwotCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICIqKHBmcmFtZW1pYy04KS0qKHBmcmFtZW1pYy0xKSA9JSpwaENcbiIsCi0JCQkJCSA4LCBwZnJhbWVtaWMgLSA4KTsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkgIioocGZyYW1lbWljLTE2KS0qKHBmcmFtZW1pYy05KSA9JSpwaENcbiIsCi0JCQkJCSA4LCBwZnJhbWVtaWMgLSAxNik7Ci0KLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkgIj09PT09PSBkZW1wIHBhY2tldCAobGVuID0lZCkgPT09PT09XG4iLAotCQkJCQkgcHJlY3ZmcmFtZS0+cGt0LT5sZW4pOwotCQkJCWZvciAoaSA9IDA7IGkgPCBwcmVjdmZyYW1lLT5wa3QtPmxlbjsgaSA9IGkgKyA4KSB7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAotCQkJCQkJIF9kcnZfZXJyXywgIiUqcGhDXG4iLAotCQkJCQkJIDgsIHByZWN2ZnJhbWUtPnBrdC0+ZGF0YSArIGkpOwotCQkJCX0KLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkgIj09PT09PSBkZW1wIHBhY2tldCBlbmQgW2xlbiA9JWRdPT09PT09XG4iLAotCQkJCQkgcHJlY3ZmcmFtZS0+cGt0LT5sZW4pOwotCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAiaHJkbGVuID0lZFxuIiwgcHJ4YXR0cmliLT5oZHJsZW4pOwotCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICJyYSA9ICVwTSBwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSA9JWRcbiIsCi0JCQkJCSBwcnhhdHRyaWItPnJhLAotCQkJCQkgcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkpOwotCi0JCQkJLyogIGRvdWJsZSBjaGVjayBrZXlfaW5kZXggZm9yIHNvbWUgdGltaW5nCi0JCQkJICAgIGlzc3VlLCBjYW5ub3QgY29tcGFyZSB3aXRoCi0JCQkJICAgIHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZCBhbHNvCi0JCQkJICAgIGNhdXNlIHRpbWluZyBpc3N1ZSAqLwotCQkJCWlmICgoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpICYmCi0JCQkJICAgIChwcnhhdHRyaWItPmtleV9pbmRleCAhPQotCQkJCSAgICAgcG1sbWVpbmZvLT5rZXlfaW5kZXgpKQotCQkJCQlicnB0X21pY2Vycm9yID0gZmFsc2U7Ci0KLQkJCQlpZiAoKHByeGF0dHJpYi0+YmRlY3J5cHRlZCA9PSB0cnVlKSAmJgotCQkJCSAgICAoYnJwdF9taWNlcnJvciA9PSB0cnVlKSkgewotCQkJCQlydHdfaGFuZGxlX3RraXBfbWljX2VycjIzYShhZGFwdGVyLCAodTgpaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpOwotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkJICJtaWMgZXJyb3IgOnByeGF0dHJpYi0+YmRlY3J5cHRlZCA9JWRcbiIsCi0JCQkJCQkgcHJ4YXR0cmliLT5iZGVjcnlwdGVkKTsKLQkJCQkJREJHXzg3MjNBKCIgbWljIGVycm9yIDpwcnhhdHRyaWItPiIKLQkJCQkJCSAgImJkZWNyeXB0ZWQgPSVkXG4iLAotCQkJCQkJICBwcnhhdHRyaWItPmJkZWNyeXB0ZWQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAotCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAibWljIGVycm9yIDpwcnhhdHRyaWItPmJkZWNyeXB0ZWQgPSVkXG4iLAotCQkJCQkJIHByeGF0dHJpYi0+YmRlY3J5cHRlZCk7Ci0JCQkJCURCR184NzIzQSgiIG1pYyBlcnJvciA6cHJ4YXR0cmliLT4iCi0JCQkJCQkgICJiZGVjcnlwdGVkID0lZFxuIiwKLQkJCQkJCSAgcHJ4YXR0cmliLT5iZGVjcnlwdGVkKTsKLQkJCQl9Ci0KLQkJCQlyZXMgPSBfRkFJTDsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogbWljIGNoZWNrZWQgb2sgKi8KLQkJCQlpZiAoIXBzZWN1cml0eXByaXYtPmJjaGVja19ncnBrZXkgJiYKLQkJCQkgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpIHsKLQkJCQkJcHNlY3VyaXR5cHJpdi0+YmNoZWNrX2dycGtleSA9IDE7Ci0JCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAotCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAicHNlY3VyaXR5cHJpdi0+YmNoZWNrX2dycGtleSA9IHRydWVcbiIpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJyZWN2ZnJhbWVfY2hrbWljOiBydHdfZ2V0X3N0YWluZm8yM2EgPT1OVUxMISEhXG4iKTsKLQkJfQotCi0JCXNrYl90cmltKHByZWN2ZnJhbWUtPnBrdCwgcHJlY3ZmcmFtZS0+cGt0LT5sZW4gLSA4KTsKLQl9Ci0KLWV4aXQ6Ci0KLQotCi0JcmV0dXJuIHJlczsKLX0KLQotLyogZGVjcnlwdCBhbmQgc2V0IHRoZSBpdmxlbiwgaWN2bGVuIG9mIHRoZSByZWN2X2ZyYW1lICovCi1zdHJ1Y3QgcmVjdl9mcmFtZSAqZGVjcnlwdG9yKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdHJ1Y3QgcmVjdl9mcmFtZSAqZGVjcnlwdG9yKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcmV0dXJuX3BhY2tldCA9IHByZWN2X2ZyYW1lOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkgInByeHN0YXQtPmRlY3J5cHRlZCA9JXggcHJ4YXR0cmliLT5lbmNyeXB0ID0gMHglMDN4XG4iLAotCQkgcHJ4YXR0cmliLT5iZGVjcnlwdGVkLCBwcnhhdHRyaWItPmVuY3J5cHQpOwotCi0JaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCA+IDApIHsKLQkJdTggKml2ID0gcHJlY3ZfZnJhbWUtPnBrdC0+ZGF0YSArIHByeGF0dHJpYi0+aGRybGVuOwotCi0JCXByeGF0dHJpYi0+a2V5X2luZGV4ID0gKCgoaXZbM10pID4+IDYpICYgMHgzKTsKLQotCQlpZiAocHJ4YXR0cmliLT5rZXlfaW5kZXggPiBXRVBfS0VZUykgewotCQkJREJHXzg3MjNBKCJwcnhhdHRyaWItPmtleV9pbmRleCglZCkgPiBXRVBfS0VZU1xuIiwKLQkJCQkgIHByeGF0dHJpYi0+a2V5X2luZGV4KTsKLQotCQkJc3dpdGNoIChwcnhhdHRyaWItPmVuY3J5cHQpIHsKLQkJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJCQlwcnhhdHRyaWItPmtleV9pbmRleCA9Ci0JCQkJCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4OwotCQkJCWJyZWFrOwotCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQkJZGVmYXVsdDoKLQkJCQlwcnhhdHRyaWItPmtleV9pbmRleCA9Ci0JCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCWlmICgocHJ4YXR0cmliLT5lbmNyeXB0ID4gMCkgJiYgKChwcnhhdHRyaWItPmJkZWNyeXB0ZWQgPT0gMCkpKSB7Ci0JCXBzZWN1cml0eXByaXYtPmh3X2RlY3J5cHRlZCA9IDA7Ci0JCXN3aXRjaCAocHJ4YXR0cmliLT5lbmNyeXB0KSB7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQkJcnR3X3dlcF9kZWNyeXB0MjNhKHBhZGFwdGVyLCBwcmVjdl9mcmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJcmVzID0gcnR3X3RraXBfZGVjcnlwdDIzYShwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJCXJlcyA9IHJ0d19hZXNfZGVjcnlwdDIzYShwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSBpZiAocHJ4YXR0cmliLT5iZGVjcnlwdGVkID09IDEgJiYgcHJ4YXR0cmliLT5lbmNyeXB0ID4gMCAmJgotCQkgICAocHNlY3VyaXR5cHJpdi0+YnVzZXRraXBrZXkgPT0gMSB8fAotCQkgICAgcHJ4YXR0cmliLT5lbmNyeXB0ICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApKSB7Ci0JCQlwc2VjdXJpdHlwcml2LT5od19kZWNyeXB0ZWQgPSAxOwotCX0KLQotCWlmIChyZXMgPT0gX0ZBSUwpIHsKLQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHJldHVybl9wYWNrZXQpOwotCQlyZXR1cm5fcGFja2V0ID0gTlVMTDsKLQl9Ci0KLQotCi0JcmV0dXJuIHJldHVybl9wYWNrZXQ7Ci19Ci0KLS8qIHNldCB0aGUgc2VjdXJpdHkgaW5mb3JtYXRpb24gaW4gdGhlIHJlY3ZfZnJhbWUgKi8KLXN0YXRpYyBzdHJ1Y3QgcmVjdl9mcmFtZSAqcG9ydGN0cmwoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQl1OCAqcHN0YV9hZGRyLCAqcHRyOwotCXVpbnQgYXV0aF9hbGc7Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKnBmaGRyOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2IDsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJ0bmZyYW1lOwotCXUxNiBldGhlcl90eXBlOwotCXUxNiBlYXBvbF90eXBlID0gRVRIX1BfUEFFOy8qIGZvciBGdW5pYSBCRCdzIFdQQSBpc3N1ZSAqLwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwotCi0JcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKLQotCWF1dGhfYWxnID0gYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG07Ci0KLQlwZmhkciA9IHByZWN2X2ZyYW1lOwotCXBhdHRyaWIgPSAmcGZoZHItPmF0dHJpYjsKLQlwc3RhX2FkZHIgPSBwYXR0cmliLT50YTsKLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwc3RhX2FkZHIpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCSAiIyMjIyMjIyNwb3J0Y3RybDphZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFBdXRoQWxncnRobSA9JWRcbiIsCi0JCSBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFBdXRoQWxncnRobSk7Ci0KLQlwcnRuZnJhbWUgPSBwcmVjdl9mcmFtZTsKLQotCWlmIChhdXRoX2FsZyA9PSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYKSB7Ci0JCS8qIGdldCBldGhlcl90eXBlICovCi0JCXB0ciA9IHBmaGRyLT5wa3QtPmRhdGEgKyBwZmhkci0+YXR0cmliLmhkcmxlbjsKLQotCQlldGhlcl90eXBlID0gKHB0cls2XSA8PCA4KSB8IHB0cls3XTsKLQotCQlpZiAocHN0YSAmJiBwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCkgewotCQkJLyogYmxvY2tlZCAqLwotCQkJLyogb25seSBhY2NlcHQgRUFQT0wgZnJhbWUgKi8KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiIyMjIyMjIyNwb3J0Y3RybDpwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9PTFcbiIpOwotCi0JCQlpZiAoZXRoZXJfdHlwZSAhPSBlYXBvbF90eXBlKSB7Ci0JCQkJLyogZnJlZSB0aGlzIGZyYW1lICovCi0JCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2X2ZyYW1lKTsKLQkJCQlwcnRuZnJhbWUgPSBOVUxMOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHBydG5mcmFtZTsKLX0KLQotaW50IHJlY3ZfZGVjYWNoZShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsIHU4IGJyZXRyeSwKLQkJIHN0cnVjdCBzdGFpbmZvX3J4Y2FjaGUgKnByeGNhY2hlKTsKLWludCByZWN2X2RlY2FjaGUoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLCB1OCBicmV0cnksCi0JCSBzdHJ1Y3Qgc3RhaW5mb19yeGNhY2hlICpwcnhjYWNoZSkKLXsKLQlpbnQgdGlkID0gcHJlY3ZfZnJhbWUtPmF0dHJpYi5wcmlvcml0eTsKLQotCXUxNiBzZXFfY3RybCA9ICgocHJlY3ZfZnJhbWUtPmF0dHJpYi5zZXFfbnVtICYgMHhmZmZmKSA8PCA0KSB8Ci0JCShwcmVjdl9mcmFtZS0+YXR0cmliLmZyYWdfbnVtICYgMHhmKTsKLQotCi0KLQlpZiAodGlkID4gMTUpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJCSAicmVjdl9kZWNhY2hlLCAodGlkPjE1KSEgc2VxX2N0cmwgPSAweCV4LCB0aWQgPSAweCV4XG4iLAotCQkJIHNlcV9jdHJsLCB0aWQpOwotCi0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoMSkgeyAvKiBpZiAoYnJldHJ5KSAqLwotCQlpZiAoc2VxX2N0cmwgPT0gcHJ4Y2FjaGUtPnRpZF9yeHNlcVt0aWRdKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkJCSAicmVjdl9kZWNhY2hlLCBzZXFfY3RybCA9IDB4JXgsIHRpZCA9IDB4JXgsIHRpZF9yeHNlcSA9IDB4JXhcbiIsCi0JCQkJIHNlcV9jdHJsLCB0aWQsIHByeGNhY2hlLT50aWRfcnhzZXFbdGlkXSk7Ci0KLQkJCXJldHVybiBfRkFJTDsKLQkJfQotCX0KLQotCXByeGNhY2hlLT50aWRfcnhzZXFbdGlkXSA9IHNlcV9jdHJsOwotCi0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotdm9pZCBwcm9jZXNzMjNhX3B3cmJpdF9kYXRhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXZvaWQgcHJvY2VzczIzYV9wd3JiaXRfZGF0YShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQl1bnNpZ25lZCBjaGFyIHB3cmJpdDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCi0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+c3JjKTsKLQotCWlmIChwc3RhKSB7Ci0JCXB3cmJpdCA9IGllZWU4MDIxMV9oYXNfcG0oaGRyLT5mcmFtZV9jb250cm9sKTsKLQotCQlpZiAocHdyYml0KSB7Ci0JCQlpZiAoIShwc3RhLT5zdGF0ZSAmIFdJRklfU0xFRVBfU1RBVEUpKQotCQkJCXN0b3Bfc3RhX3htaXQyM2EocGFkYXB0ZXIsIHBzdGEpOwotCQl9IGVsc2UgewotCQkJaWYgKHBzdGEtPnN0YXRlICYgV0lGSV9TTEVFUF9TVEFURSkKLQkJCQl3YWtldXBfc3RhX3RvX3htaXQyM2EocGFkYXB0ZXIsIHBzdGEpOwotCQl9Ci0JfQotCi0jZW5kaWYKLX0KLQotdm9pZCBwcm9jZXNzX3dtbXBzX2RhdGEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci12b2lkIHByb2Nlc3Nfd21tcHNfZGF0YShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5zcmMpOwotCi0JaWYgKCFwc3RhKQotCQlyZXR1cm47Ci0KLQotCWlmICghcHN0YS0+cW9zX29wdGlvbikKLQkJcmV0dXJuOwotCi0JaWYgKCEocHN0YS0+cW9zX2luZm8gJiAweGYpKQotCQlyZXR1cm47Ci0KLQlpZiAocHN0YS0+c3RhdGUgJiBXSUZJX1NMRUVQX1NUQVRFKSB7Ci0JCXU4IHdtbXBzX2FjID0gMDsKLQotCQlzd2l0Y2ggKHBhdHRyaWItPnByaW9yaXR5KSB7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iayAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfdmkgJiBCSVQoMSk7Ci0JCQlicmVhazsKLQkJY2FzZSA2OgotCQljYXNlIDc6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX3ZvICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMDoKLQkJY2FzZSAzOgotCQlkZWZhdWx0OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iZSAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHdtbXBzX2FjKSB7Ci0JCQlpZiAocHN0YS0+c2xlZXBxX2FjX2xlbiA+IDApIHsKLQkJCQkvKiBwcm9jZXNzIHJlY2VpdmVkIHRyaWdnZXJlZCBmcmFtZSAqLwotCQkJCXhtaXRfZGVsaXZlcnlfZW5hYmxlZF9mcmFtZXMyM2EocGFkYXB0ZXIsIHBzdGEpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBpc3N1ZSBvbmUgcW9zIG51bGwgZnJhbWUgd2l0aCBNb3JlIGRhdGEgYml0ID0gMCBhbmQgdGhlIEVPU1AgYml0IHNldCAoPSAxKSAqLwotCQkJCWlzc3VlX3Fvc19udWxsZGF0YTIzYShwYWRhcHRlciwgcHN0YS0+aHdhZGRyLAotCQkJCQkJICAgKHUxNilwYXR0cmliLT5wcmlvcml0eSwKLQkJCQkJCSAgIDAsIDApOwotCQkJfQotCQl9Ci0JfQotCi0jZW5kaWYKLX0KLQotc3RhdGljIHZvaWQgY291bnRfcnhfc3RhdHMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKLXsKLQlpbnQgc3o7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhaW5mb19zdGF0cyAqcHN0YXRzID0gTlVMTDsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICYgcHJmcmFtZS0+YXR0cmliOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlzeiA9IHByZnJhbWUtPnBrdC0+bGVuOwotCXByZWN2cHJpdi0+cnhfYnl0ZXMgKz0gc3o7Ci0KLQlwYWRhcHRlci0+bWxtZXByaXYuTGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kKys7Ci0KLQlpZiAoKCFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5kc3QpKSAmJgotCSAgICAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPmRzdCkpKQotCQlwYWRhcHRlci0+bWxtZXByaXYuTGlua0RldGVjdEluZm8uTnVtUnhVbmljYXN0T2tJblBlcmlvZCsrOwotCi0JaWYgKHN0YSkKLQkJcHN0YSA9IHN0YTsKLQllbHNlCi0JCXBzdGEgPSBwcmZyYW1lLT5wc3RhOwotCi0JaWYgKHBzdGEpIHsKLQkJcHN0YXRzID0gJnBzdGEtPnN0YV9zdGF0czsKLQotCQlwc3RhdHMtPnJ4X2RhdGFfcGt0cysrOwotCQlwc3RhdHMtPnJ4X2J5dGVzICs9IHN6OwotCX0KLX0KLQotc3RhdGljIGludCBzdGEyc3RhX2RhdGFfZnJhbWUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAotCQkJICAgICAgc3RydWN0IHN0YV9pbmZvKipwc3RhKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCWludCByZXQgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICYgcHJlY3ZfZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXU4ICpteWJzc2lkICA9IGdldF9ic3NpZChwbWxtZXByaXYpOwotCXU4ICpteWh3YWRkciA9IG15aWQoJmFkYXB0ZXItPmVlcHJvbXByaXYpOwotCXU4ICpzdGFfYWRkciA9IE5VTEw7Ci0JaW50IGJtY2FzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPmRzdCk7Ci0KLQotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSB8fAotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0KLQkJLyogIGZpbHRlciBwYWNrZXRzIHRoYXQgU0EgaXMgbXlzZWxmIG9yIG11bHRpY2FzdCBvciBicm9hZGNhc3QgKi8KLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPnNyYykpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJTQSA9PSBteXNlbGZcbiIpOwotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPmRzdCkgJiYgIWJtY2FzdCkgewotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChwYXR0cmliLT5ic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIpIHx8Ci0JCSAgICBldGhlcl9hZGRyX2VxdWFsKG15YnNzaWQsICJceDBceDBceDBceDBceDBceDAiKSB8fAotCQkgICAgIWV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQpKSB7Ci0JCQlyZXQgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXN0YV9hZGRyID0gcGF0dHJpYi0+c3JjOwotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJLyogIEZvciBTdGF0aW9uIG1vZGUsIHNhIGFuZCBic3NpZCBzaG91bGQgYWx3YXlzIGJlIEJTU0lELAotCQkgICAgYW5kIERBIGlzIG15IG1hYy1hZGRyZXNzICovCi0JCWlmICghZXRoZXJfYWRkcl9lcXVhbChwYXR0cmliLT5ic3NpZCwgcGF0dHJpYi0+c3JjKSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgImJzc2lkICE9IFRBIHVuZGVyIFNUQVRJT05fTU9ERTsgZHJvcCBwa3RcbiIpOwotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlzdGFfYWRkciA9IHBhdHRyaWItPmJzc2lkOwotCi0JfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJaWYgKGJtY2FzdCkgewotCQkJLyogIEZvciBBUCBtb2RlLCBpZiBEQSA9PSBNQ0FTVCwgdGhlbiBCU1NJRCBzaG91bGQgYmUgYWxzbyBNQ0FTVCAqLwotCQkJaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5ic3NpZCkpIHsKLQkJCQlyZXQgPSBfRkFJTDsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8qICBub3QgbWMtZnJhbWUgKi8KLQkJCS8qICBGb3IgQVAgbW9kZSwgaWYgREEgaXMgbm9uLU1DQVNULCB0aGVuIGl0IG11c3QKLQkJCSAgICBiZSBCU1NJRCwgYW5kIGJzc2lkID09IEJTU0lEICovCi0JCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+YnNzaWQsIHBhdHRyaWItPmRzdCkpIHsKLQkJCQlyZXQgPSBfRkFJTDsKLQkJCQlnb3RvIGV4aXQ7Ci0JCQl9Ci0KLQkJCXN0YV9hZGRyID0gcGF0dHJpYi0+c3JjOwotCQl9Ci0JfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9NUF9TVEFURSkpIHsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmRzdCwgaGRyLT5hZGRyMSk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5zcmMsIGhkci0+YWRkcjIpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+YnNzaWQsIGhkci0+YWRkcjMpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+cmEsIHBhdHRyaWItPmRzdCk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgcGF0dHJpYi0+c3JjKTsKLQotCQlzdGFfYWRkciA9IG15YnNzaWQ7Ci0JfSBlbHNlIHsKLQkJcmV0ICA9IF9GQUlMOwotCX0KLQotCWlmIChibWNhc3QpCi0JCSpwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EoYWRhcHRlcik7Ci0JZWxzZQotCQkqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgc3RhX2FkZHIpOyAvKiAgZ2V0IGFwX2luZm8gKi8KLQotCWlmICgqcHN0YSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgImNhbid0IGdldCBwc3RhIHVuZGVyIHN0YTJzdGFfZGF0YV9mcmFtZSA7IGRyb3AgcGt0XG4iKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLWV4aXQ6Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYXAyc3RhX2RhdGFfZnJhbWUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCi0JCSAgICAgIHN0cnVjdCBzdGFfaW5mbyAqKnBzdGEpOwotaW50IGFwMnN0YV9kYXRhX2ZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAotCQkgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKipwc3RhKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJiBwcmVjdl9mcmFtZS0+YXR0cmliOwotCWludCByZXQgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJmFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJmFkYXB0ZXItPm1sbWVwcml2OwotCXU4ICpteWJzc2lkICA9IGdldF9ic3NpZChwbWxtZXByaXYpOwotCXU4ICpteWh3YWRkciA9IG15aWQoJmFkYXB0ZXItPmVlcHJvbXByaXYpOwotCWludCBibWNhc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5kc3QpOwotCi0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSAmJgotCSAgICAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpIHx8Ci0JICAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKSkgewotCi0JCS8qIGZpbHRlciBwYWNrZXRzIHRoYXQgU0EgaXMgbXlzZWxmIG9yIG11bHRpY2FzdCBvciBicm9hZGNhc3QgKi8KLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPnNyYykpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJTQSA9PSBteXNlbGZcbiIpOwotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQkvKiAgZGEgc2hvdWxkIGJlIGZvciBtZSAqLwotCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPmRzdCkgJiYgIWJtY2FzdCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkJICJhcDJzdGFfZGF0YV9mcmFtZTogIGNvbXBhcmUgREEgZmFpbGVkOyBEQT0lcE1cbiIsCi0JCQkJIHBhdHRyaWItPmRzdCk7Ci0JCQlyZXQgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCS8qICBjaGVjayBCU1NJRCAqLwotCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChwYXR0cmliLT5ic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIpIHx8Ci0JCSAgICBldGhlcl9hZGRyX2VxdWFsKG15YnNzaWQsICJceDBceDBceDBceDBceDBceDAiKSB8fAotCQkgICAgIWV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+YnNzaWQsIG15YnNzaWQpKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgImFwMnN0YV9kYXRhX2ZyYW1lOiAgY29tcGFyZSBCU1NJRCBmYWlsZWQ7IEJTU0lEPSVwTVxuIiwKLQkJCQkgcGF0dHJpYi0+YnNzaWQpOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkJICJteWJzc2lkPSVwTVxuIiwgbXlic3NpZCk7Ci0KLQkJCWlmICghYm1jYXN0KSB7Ci0JCQkJREJHXzg3MjNBKCJpc3N1ZV9kZWF1dGgyM2EgdG8gdGhlIG5vbmFzc29jaWF0ZWQgYXA9JXBNIGZvciB0aGUgcmVhc29uKDcpXG4iLAotCQkJCQkgIHBhdHRyaWItPmJzc2lkKTsKLQkJCQlpc3N1ZV9kZWF1dGgyM2EoYWRhcHRlciwgcGF0dHJpYi0+YnNzaWQsCi0JCQkJCSAgICAgV0xBTl9SRUFTT05fQ0xBU1MzX0ZSQU1FX0ZST01fTk9OQVNTT0NfU1RBKTsKLQkJCX0KLQotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlpZiAoYm1jYXN0KQotCQkJKnBzdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShhZGFwdGVyKTsKLQkJZWxzZQotCQkJLyogIGdldCBhcF9pbmZvICovCi0JCQkqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+YnNzaWQpOwotCi0JCWlmICgqcHN0YSA9PSBOVUxMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAiYXAyc3RhOiBjYW4ndCBnZXQgcHN0YSB1bmRlciBTVEFUSU9OX01PREU7IGRyb3AgcGt0XG4iKTsKLQkJCXJldCA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJaWYgKGllZWU4MDIxMV9pc19udWxsZnVuYyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCQkvKiBObyBkYXRhLCB3aWxsIG5vdCBpbmRpY2F0ZSB0byB1cHBlciBsYXllciwKLQkJCSAgIHRlbXBvcmlseSBjb3VudCBpdCBoZXJlICovCi0JCQljb3VudF9yeF9zdGF0cyhhZGFwdGVyLCBwcmVjdl9mcmFtZSwgKnBzdGEpOwotCQkJcmV0ID0gUlRXX1JYX0hBTkRMRUQ7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpICYmCi0JCSAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+ZHN0LCBoZHItPmFkZHIxKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnNyYywgaGRyLT5hZGRyMik7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5ic3NpZCwgaGRyLT5hZGRyMyk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5yYSwgcGF0dHJpYi0+ZHN0KTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnRhLCBwYXR0cmliLT5zcmMpOwotCi0JCS8qICAqLwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+YnNzaWQsICBteWJzc2lkKTsKLQotCQkvKiAgZ2V0IHN0YV9pbmZvICovCi0JCSpwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5ic3NpZCk7Ci0JCWlmICgqcHN0YSA9PSBOVUxMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAiY2FuJ3QgZ2V0IHBzdGEgdW5kZXIgTVBfTU9ERSA7IGRyb3AgcGt0XG4iKTsKLQkJCXJldCA9IF9GQUlMOwotCQkJZ290byBleGl0OwotCQl9Ci0JfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJLyogU3BlY2lhbCBjYXNlICovCi0JCXJldCA9IFJUV19SWF9IQU5ETEVEOwotCQlnb3RvIGV4aXQ7Ci0JfSBlbHNlIHsKLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPmRzdCkgJiYgIWJtY2FzdCkgewotCQkJKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPmJzc2lkKTsKLQkJCWlmICgqcHN0YSA9PSBOVUxMKSB7Ci0JCQkJREJHXzg3MjNBKCJpc3N1ZV9kZWF1dGgyM2EgdG8gdGhlIGFwPSVwTSBmb3IgdGhlIHJlYXNvbig3KVxuIiwKLQkJCQkJICBwYXR0cmliLT5ic3NpZCk7Ci0KLQkJCQlpc3N1ZV9kZWF1dGgyM2EoYWRhcHRlciwgcGF0dHJpYi0+YnNzaWQsCi0JCQkJCSAgICAgV0xBTl9SRUFTT05fQ0xBU1MzX0ZSQU1FX0ZST01fTk9OQVNTT0NfU1RBKTsKLQkJCX0KLQkJfQotCi0JCXJldCA9IF9GQUlMOwotCX0KLQotZXhpdDoKLQotCi0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgc3RhMmFwX2RhdGFfZnJhbWUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUsCi0JCSAgICAgIHN0cnVjdCBzdGFfaW5mbyAqKnBzdGEpOwotaW50IHN0YTJhcF9kYXRhX2ZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lLAotCQkgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKipwc3RhKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJiBwcmVjdl9mcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0JdW5zaWduZWQgY2hhciAqbXlic3NpZCA9IGdldF9ic3NpZChwbWxtZXByaXYpOwotCWludCByZXQgPSBfU1VDQ0VTUzsKLQotCi0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0JCS8qIEZvciBBUCBtb2RlLCBSQSA9IEJTU0lELCBUWCA9IFNUQShTUkNfQUREUiksIEEzID0gRFNUX0FERFIgKi8KLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKHBhdHRyaWItPmJzc2lkLCBteWJzc2lkKSkgewotCQkJcmV0ID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQkqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+c3JjKTsKLQkJaWYgKCpwc3RhID09IE5VTEwpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJjYW4ndCBnZXQgcHN0YSB1bmRlciBBUF9NT0RFOyBkcm9wIHBrdFxuIik7Ci0JCQlEQkdfODcyM0EoImlzc3VlX2RlYXV0aDIzYSB0byBzdGE9JXBNIGZvciB0aGUgcmVhc29uKDcpXG4iLAotCQkJCSAgcGF0dHJpYi0+c3JjKTsKLQotCQkJaXNzdWVfZGVhdXRoMjNhKGFkYXB0ZXIsIHBhdHRyaWItPnNyYywKLQkJCQkgICAgIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSk7Ci0KLQkJCXJldCA9IFJUV19SWF9IQU5ETEVEOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJcHJvY2VzczIzYV9wd3JiaXRfZGF0YShhZGFwdGVyLCBwcmVjdl9mcmFtZSk7Ci0KLQkJLyogV2Ugb25seSBnZXQgaGVyZSBpZiBpdCdzIGEgZGF0YSBmcmFtZSwgc28gbm8gbmVlZCB0bwotCQkgKiBjb25maXJtIGRhdGEgZnJhbWUgdHlwZSBmaXJzdCAqLwotCQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCQlwcm9jZXNzX3dtbXBzX2RhdGEoYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCi0JCWlmIChpZWVlODAyMTFfaXNfbnVsbGZ1bmMoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQkJLyogTm8gZGF0YSwgd2lsbCBub3QgaW5kaWNhdGUgdG8gdXBwZXIgbGF5ZXIsCi0JCQkgICB0ZW1wb3JpbHkgY291bnQgaXQgaGVyZSAqLwotCQkJY291bnRfcnhfc3RhdHMoYWRhcHRlciwgcHJlY3ZfZnJhbWUsICpwc3RhKTsKLQkJCXJldCA9IFJUV19SWF9IQU5ETEVEOwotCQkJZ290byBleGl0OwotCQl9Ci0JfSBlbHNlIHsKLQkJdTggKm15aHdhZGRyID0gbXlpZCgmYWRhcHRlci0+ZWVwcm9tcHJpdik7Ci0KLQkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKHBhdHRyaWItPnJhLCBteWh3YWRkcikpIHsKLQkJCXJldCA9IFJUV19SWF9IQU5ETEVEOwotCQkJZ290byBleGl0OwotCQl9Ci0JCURCR184NzIzQSgiaXNzdWVfZGVhdXRoMjNhIHRvIHN0YT0lcE0gZm9yIHRoZSByZWFzb24oNylcbiIsCi0JCQkgIHBhdHRyaWItPnNyYyk7Ci0JCWlzc3VlX2RlYXV0aDIzYShhZGFwdGVyLCBwYXR0cmliLT5zcmMsCi0JCQkgICAgIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSk7Ci0JCXJldCA9IFJUV19SWF9IQU5ETEVEOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi1leGl0OgotCi0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdmFsaWRhdGVfcmVjdl9jdHJsX2ZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmVjdl9mcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0KLQlpZiAoIWllZWU4MDIxMV9pc19jdGwoaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJcmV0dXJuIF9GQUlMOwotCi0JLyogcmVjZWl2ZSB0aGUgZnJhbWVzIHRoYXQgcmEoYTEpIGlzIG15IGFkZHJlc3MgKi8KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwoaGRyLT5hZGRyMSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpKSkKLQkJcmV0dXJuIF9GQUlMOwotCi0JLyogb25seSBoYW5kbGUgcHMtcG9sbCAqLwotCWlmIChpZWVlODAyMTFfaXNfcHNwb2xsKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJc3RydWN0IGllZWU4MDIxMV9wc3BvbGwgKnBzcCA9IChzdHJ1Y3QgaWVlZTgwMjExX3BzcG9sbCAqKWhkcjsKLQkJdTE2IGFpZDsKLQkJdTggd21tcHNfYWMgPSAwOwotCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCi0JCWFpZCA9IGxlMTZfdG9fY3B1KHBzcC0+YWlkKSAmIDB4M2ZmZjsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgaGRyLT5hZGRyMik7Ci0KLQkJaWYgKCFwc3RhIHx8IHBzdGEtPmFpZCAhPSBhaWQpCi0JCQlyZXR1cm4gX0ZBSUw7Ci0KLQkJLyogZm9yIHJ4IHBrdCBzdGF0aXN0aWNzICovCi0JCXBzdGEtPnN0YV9zdGF0cy5yeF9jdHJsX3BrdHMrKzsKLQotCQlzd2l0Y2ggKHBhdHRyaWItPnByaW9yaXR5KSB7Ci0JCWNhc2UgMToKLQkJY2FzZSAyOgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iayAmIEJJVCgwKTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfdmkgJiBCSVQoMCk7Ci0JCQlicmVhazsKLQkJY2FzZSA2OgotCQljYXNlIDc6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX3ZvICYgQklUKDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMDoKLQkJY2FzZSAzOgotCQlkZWZhdWx0OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iZSAmIEJJVCgwKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHdtbXBzX2FjKQotCQkJcmV0dXJuIF9GQUlMOwotCi0JCWlmIChwc3RhLT5zdGF0ZSAmIFdJRklfU1RBX0FMSVZFX0NIS19TVEFURSkgewotCQkJREJHXzg3MjNBKCIlcyBhbGl2ZSBjaGVjay1yeCBwcy1wb2xsXG4iLCBfX2Z1bmNfXyk7Ci0JCQlwc3RhLT5leHBpcmVfdG8gPSBwc3RhcHJpdi0+ZXhwaXJlX3RvOwotCQkJcHN0YS0+c3RhdGUgXj0gV0lGSV9TVEFfQUxJVkVfQ0hLX1NUQVRFOwotCQl9Ci0KLQkJaWYgKChwc3RhLT5zdGF0ZSAmIFdJRklfU0xFRVBfU1RBVEUpICYmCi0JCSAgICAocHN0YXByaXYtPnN0YV9kel9iaXRtYXAgJiBDSEtCSVQocHN0YS0+YWlkKSkpIHsKLQkJCXN0cnVjdCBsaXN0X2hlYWQgKnhtaXRmcmFtZV9waGVhZDsKLQkJCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lOwotCQkJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCQkJc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JCQl4bWl0ZnJhbWVfcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhLT5zbGVlcF9xKTsKLQkJCXB4bWl0ZnJhbWUgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoeG1pdGZyYW1lX3BoZWFkLAotCQkJCQkJCSAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lLAotCQkJCQkJCSAgICAgIGxpc3QpOwotCQkJaWYgKHB4bWl0ZnJhbWUpIHsKLQkJCQlsaXN0X2RlbF9pbml0KCZweG1pdGZyYW1lLT5saXN0KTsKLQotCQkJCXBzdGEtPnNsZWVwcV9sZW4tLTsKLQotCQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuPjApCi0JCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDE7Ci0JCQkJZWxzZQotCQkJCQlweG1pdGZyYW1lLT5hdHRyaWIubWRhdGEgPSAwOwotCi0JCQkJcHhtaXRmcmFtZS0+YXR0cmliLnRyaWdnZXJlZCA9IDE7Ci0KLQkJCQlydGw4NzIzYXVfaGFsX3htaXRmcmFtZV9lbnF1ZXVlKHBhZGFwdGVyLAotCQkJCQkJCQlweG1pdGZyYW1lKTsKLQotCQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID09IDApIHsKLQkJCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkNIS0JJVChwc3RhLT5haWQpOwotCQkJCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9USU0sCi0JCQkJCQkJIE5VTEwsIGZhbHNlKTsKLQkJCQl9Ci0KLQkJCQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCQkJfSBlbHNlIHsKLQkJCQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCQkJCWlmIChwc3RhcHJpdi0+dGltX2JpdG1hcCAmIENIS0JJVChwc3RhLT5haWQpKSB7Ci0JCQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID09IDApIHsKLQkJCQkJCURCR184NzIzQSgibm8gYnVmZmVyZWQgcGFja2V0cyAiCi0JCQkJCQkJICAidG8geG1pdFxuIik7Ci0KLQkJCQkJCS8qIGlzc3VlIG51bGxkYXRhIHdpdGggTW9yZSBkYXRhIGJpdCA9IDAgdG8gaW5kaWNhdGUgd2UgaGF2ZSBubyBidWZmZXJlZCBwYWNrZXRzICovCi0JCQkJCQlpc3N1ZV9udWxsZGF0YTIzYShwYWRhcHRlciwKLQkJCQkJCQkgICAgICAgcHN0YS0+aHdhZGRyLAotCQkJCQkJCSAgICAgICAwLCAwLCAwKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCURCR184NzIzQSgiZXJyb3IhcHN0YS0+c2xlZXBxIgotCQkJCQkJCSAgIl9sZW4gPSVkXG4iLAotCQkJCQkJCSAgcHN0YS0+c2xlZXBxX2xlbik7Ci0JCQkJCQlwc3RhLT5zbGVlcHFfbGVuID0gMDsKLQkJCQkJfQotCi0JCQkJCXBzdGFwcml2LT50aW1fYml0bWFwICY9IH5DSEtCSVQocHN0YS0+YWlkKTsKLQotCQkJCQl1cGRhdGVfYmVhY29uMjNhKHBhZGFwdGVyLCBXTEFOX0VJRF9USU0sCi0JCQkJCQkJIE5VTEwsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLSNlbmRpZgotCXJldHVybiBfRkFJTDsKLX0KLQotc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZmcmFtZV9jaGtfZGVmcmFnMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci1zdGF0aWMgaW50IHZhbGlkYXRlX3JlY3ZfbWdudF9mcmFtZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkgIit2YWxpZGF0ZV9yZWN2X21nbnRfZnJhbWVcbiIpOwotCi0JcHJlY3ZfZnJhbWUgPSByZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYShwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCWlmIChwcmVjdl9mcmFtZSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgIiVzOiBmcmFnbWVudCBwYWNrZXRcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIF9TVUNDRVNTOwotCX0KLQotCXNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQotCQkvKiBmb3IgcnggcGt0IHN0YXRpc3RpY3MgKi8KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgaGRyLT5hZGRyMik7Ci0JaWYgKHBzdGEpIHsKLQkJcHN0YS0+c3RhX3N0YXRzLnJ4X21nbnRfcGt0cysrOwotCi0JCWlmIChpZWVlODAyMTFfaXNfYmVhY29uKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCQlwc3RhLT5zdGFfc3RhdHMucnhfYmVhY29uX3BrdHMrKzsKLQkJZWxzZSBpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3JlcShoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJcHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcmVxX3BrdHMrKzsKLQkJZWxzZSBpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIsCi0JCQkJICAgIGhkci0+YWRkcjEpKQotCQkJCXBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF9wa3RzKys7Ci0JCQllbHNlIGlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSB8fAotCQkJCSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKLQkJCQlwc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfYm1fcGt0cysrOwotCQkJZWxzZQotCQkJCXBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF91b19wa3RzKys7Ci0JCX0KLQl9Ci0KLQltZ3RfZGlzcGF0Y2hlcjIzYShwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSkKLXsKLQl1OCBicmV0cnk7Ci0JdTggKnBzYSwgKnBkYTsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJiBwcmVjdl9mcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJmFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2X2ZyYW1lLT5wa3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7Ci0KLQotCi0JYnJldHJ5ID0gaWVlZTgwMjExX2hhc19yZXRyeShoZHItPmZyYW1lX2NvbnRyb2wpOwotCXBkYSA9IGllZWU4MDIxMV9nZXRfREEoaGRyKTsKLQlwc2EgPSBpZWVlODAyMTFfZ2V0X1NBKGhkcik7Ci0KLQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+ZHN0LCBwZGEpOwotCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5zcmMsIHBzYSk7Ci0KLQlzd2l0Y2ggKGhkci0+ZnJhbWVfY29udHJvbCAmCi0JCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSB7Ci0JY2FzZSBjcHVfdG9fbGUxNigwKToKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmJzc2lkLCBoZHItPmFkZHIzKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnJhLCBwZGEpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+dGEsIHBzYSk7Ci0JCXJldCA9IHN0YTJzdGFfZGF0YV9mcmFtZShhZGFwdGVyLCBwcmVjdl9mcmFtZSwgJnBzdGEpOwotCQlicmVhazsKLQotCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfRlJPTURTKToKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmJzc2lkLCBoZHItPmFkZHIyKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnJhLCBwZGEpOwotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+dGEsIGhkci0+YWRkcjIpOwotCQlyZXQgPSBhcDJzdGFfZGF0YV9mcmFtZShhZGFwdGVyLCBwcmVjdl9mcmFtZSwgJnBzdGEpOwotCQlicmVhazsKLQotCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfVE9EUyk6Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5ic3NpZCwgaGRyLT5hZGRyMSk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5yYSwgaGRyLT5hZGRyMSk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgcHNhKTsKLQkJcmV0ID0gc3RhMmFwX2RhdGFfZnJhbWUoYWRhcHRlciwgcHJlY3ZfZnJhbWUsICZwc3RhKTsKLQkJYnJlYWs7Ci0KLQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpOgotCQkvKgotCQkgKiBUaGVyZSBpcyBubyBCU1NJRCBpbiB0aGlzIGNhc2UsIGJ1dCB0aGUgZHJpdmVyIGhhcyBiZWVuCi0JCSAqIHVzaW5nIGFkZHIxIHNvIGZhciwgc28ga2VlcCBpdCBmb3Igbm93LgotCQkgKi8KLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPmJzc2lkLCBoZHItPmFkZHIxKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnJhLCBoZHItPmFkZHIxKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnRhLCBoZHItPmFkZHIyKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICJjYXNlIDNcbiIpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoKHJldCA9PSBfRkFJTCkgfHwgKHJldCA9PSBSVFdfUlhfSEFORExFRCkpCi0JCWdvdG8gZXhpdDsKLQotCWlmICghcHN0YSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICJhZnRlciB0b19mcl9kc19jaGs7IHBzdGEgPT0gTlVMTFxuIik7Ci0JCXJldCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHJlY3ZfZnJhbWUtPnBzdGEgPSBwc3RhOwotCi0JcGF0dHJpYi0+aGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlpZiAoaWVlZTgwMjExX2hhc19hNChoZHItPmZyYW1lX2NvbnRyb2wpKQotCQlwYXR0cmliLT5oZHJsZW4gKz0gRVRIX0FMRU47Ci0KLQkvKiBwYXJzaW5nIFFDIGZpZWxkICovCi0JaWYgKHBhdHRyaWItPnFvcyA9PSAxKSB7Ci0JCV9fbGUxNiAqcXB0ciA9IChfX2xlMTYgKilpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKLQkJdTE2IHFvc19jdHJsID0gbGUxNl90b19jcHUoKnFwdHIpOwotCi0JCXBhdHRyaWItPnByaW9yaXR5ID0gcW9zX2N0cmwgJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKLQkJcGF0dHJpYi0+YWNrX3BvbGljeSA9IChxb3NfY3RybCA+PiA1KSAmIDM7Ci0JCXBhdHRyaWItPmFtc2R1ID0KLQkJCShxb3NfY3RybCAmIElFRUU4MDIxMV9RT1NfQ1RMX0FfTVNEVV9QUkVTRU5UKSA+PiA3OwotCQlwYXR0cmliLT5oZHJsZW4gKz0gSUVFRTgwMjExX1FPU19DVExfTEVOOwotCi0JCWlmIChwYXR0cmliLT5wcmlvcml0eSAhPSAwICYmIHBhdHRyaWItPnByaW9yaXR5ICE9IDMpIHsKLQkJCWFkYXB0ZXItPnJlY3Zwcml2LmJJc0FueU5vbkJFUGt0cyA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlwYXR0cmliLT5wcmlvcml0eSA9IDA7Ci0JCXBhdHRyaWItPmFja19wb2xpY3kgPSAwOwotCQlwYXR0cmliLT5hbXNkdSA9IDA7Ci0JfQotCi0JaWYgKHBhdHRyaWItPm9yZGVyKSB7IC8qIEhULUNUUkwgMTFuICovCi0JCXBhdHRyaWItPmhkcmxlbiArPSA0OwotCX0KLQotCXByZWN2X2ZyYW1lLT5wcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbcGF0dHJpYi0+cHJpb3JpdHldOwotCi0JLyogIGRlY2FjaGUsIGRyb3AgZHVwbGljYXRlIHJlY3YgcGFja2V0cyAqLwotCWlmIChyZWN2X2RlY2FjaGUocHJlY3ZfZnJhbWUsIGJyZXRyeSwgJnBzdGEtPnN0YV9yZWN2cHJpdi5yeGNhY2hlKSA9PQotCSAgICBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICJkZWNhY2hlIDogZHJvcCBwa3RcbiIpOwotCQlyZXQgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChwYXR0cmliLT5wcml2YWN5KSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICJ2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWU6cGF0dHJpYi0+cHJpdmFjeSA9JXhcbiIsCi0JCQkgcGF0dHJpYi0+cHJpdmFjeSk7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICJeXl5eXl5eXl5eXmlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKDB4JTAyeCkpID0lZF5eXl5eXl5eXl5eXl5eXjZcbiIsCi0JCQkgcGF0dHJpYi0+cmFbMF0sCi0JCQkgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpKTsKLQotCQlHRVRfRU5DUllfQUxHTyhwc2VjdXJpdHlwcml2LCBwc3RhLCBwYXR0cmliLT5lbmNyeXB0LAotCQkJICAgICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKSk7Ci0KLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkgInBhdHRyaWItPmVuY3J5cHQgPSVkXG4iLCBwYXR0cmliLT5lbmNyeXB0KTsKLQotCQlzd2l0Y2ggKHBhdHRyaWItPmVuY3J5cHQpIHsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCQlwYXR0cmliLT5pdl9sZW4gPSBJRUVFODAyMTFfV0VQX0lWX0xFTjsKLQkJCXBhdHRyaWItPmljdl9sZW4gPSBJRUVFODAyMTFfV0VQX0lDVl9MRU47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJcGF0dHJpYi0+aXZfbGVuID0gSUVFRTgwMjExX1RLSVBfSVZfTEVOOwotCQkJcGF0dHJpYi0+aWN2X2xlbiA9IElFRUU4MDIxMV9US0lQX0lDVl9MRU47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQkJcGF0dHJpYi0+aXZfbGVuID0gSUVFRTgwMjExX0NDTVBfSERSX0xFTjsKLQkJCXBhdHRyaWItPmljdl9sZW4gPSBJRUVFODAyMTFfQ0NNUF9NSUNfTEVOOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwYXR0cmliLT5pdl9sZW4gPSAwOwotCQkJcGF0dHJpYi0+aWN2X2xlbiA9IDA7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCXBhdHRyaWItPmVuY3J5cHQgPSAwOwotCQlwYXR0cmliLT5pdl9sZW4gPSAwOwotCQlwYXR0cmliLT5pY3ZfbGVuID0gMDsKLQl9Ci0KLWV4aXQ6Ci0KLQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZHVtcF9yeF9wa3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHR5cGUsIGludCBsZXZlbCkKLXsKLQlpbnQgaTsKLQl1OCAqcHRyOwotCi0JaWYgKChsZXZlbCA9PSAxKSB8fAotCSAgICAoKGxldmVsID09IDIpICYmICh0eXBlID09IElFRUU4MDIxMV9GVFlQRV9NR01UKSkgfHwKLQkgICAgKChsZXZlbCA9PSAzKSAmJiAodHlwZSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSkpKSB7Ci0KLQkJcHRyID0gc2tiLT5kYXRhOwotCi0JCURCR184NzIzQSgiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiIpOwotCi0JCWZvciAoaSA9IDA7IGkgPCA2NDsgaSA9IGkgKyA4KQotCQkJREJHXzg3MjNBKCIlKnBoQzpcbiIsIDgsIHB0ciArIGkpOwotCQlEQkdfODcyM0EoIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgdmFsaWRhdGVfcmVjdl9mcmFtZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKQotewotCS8qIHNoYWxsIGNoZWNrIGZyYW1lIHN1YnR5cGUsIHRvIC8gZnJvbSBkcywgZGEsIGJzc2lkICovCi0KLQkvKiB0aGVuIGNhbGwgY2hlY2sgaWYgcnggc2VxL2ZyYWcuIGR1cGxpY2F0ZWQuICovCi0JdTggdHlwZTsKLQl1OCBzdWJ0eXBlOwotCWludCByZXR2YWwgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICYgcHJlY3ZfZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQl1OCB2ZXI7Ci0JdTggYkR1bXBSeFBrdDsKLQl1MTYgc2VxX2N0cmwsIGZjdGw7Ci0KLQlmY3RsID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKTsKLQl2ZXIgPSBmY3RsICYgSUVFRTgwMjExX0ZDVExfVkVSUzsKLQl0eXBlID0gZmN0bCAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFOwotCXN1YnR5cGUgPSBmY3RsICYgSUVFRTgwMjExX0ZDVExfU1RZUEU7Ci0KLQkvKiBhZGQgdmVyc2lvbiBjaGsgKi8KLQlpZiAodmVyICE9IDApIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAidmFsaWRhdGVfcmVjdl9kYXRhX2ZyYW1lIGZhaWwhICh2ZXIhPSAwKVxuIik7Ci0JCXJldHZhbCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0Jc2VxX2N0cmwgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKTsKLQlwYXR0cmliLT5mcmFnX251bSA9IHNlcV9jdHJsICYgSUVFRTgwMjExX1NDVExfRlJBRzsKLQlwYXR0cmliLT5zZXFfbnVtID0gc2VxX2N0cmwgPj4gNDsKLQotCXBhdHRyaWItPnB3X3NhdmUgPSBpZWVlODAyMTFfaGFzX3BtKGhkci0+ZnJhbWVfY29udHJvbCk7Ci0JcGF0dHJpYi0+bWZyYWcgPSBpZWVlODAyMTFfaGFzX21vcmVmcmFncyhoZHItPmZyYW1lX2NvbnRyb2wpOwotCXBhdHRyaWItPm1kYXRhID0gaWVlZTgwMjExX2hhc19tb3JlZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpOwotCXBhdHRyaWItPnByaXZhY3kgPSBpZWVlODAyMTFfaGFzX3Byb3RlY3RlZChoZHItPmZyYW1lX2NvbnRyb2wpOwotCXBhdHRyaWItPm9yZGVyID0gaWVlZTgwMjExX2hhc19vcmRlcihoZHItPmZyYW1lX2NvbnRyb2wpOwotCi0JR2V0SGFsRGVmVmFyODE5MkNVc2IoYWRhcHRlciwgSEFMX0RFRl9EQkdfRFVNUF9SWFBLVCwgJmJEdW1wUnhQa3QpOwotCi0JaWYgKHVubGlrZWx5KGJEdW1wUnhQa3QgPT0gMSkpCi0JCWR1bXBfcnhfcGt0KHNrYiwgdHlwZSwgYkR1bXBSeFBrdCk7Ci0KLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9NR01UOgotCQlyZXR2YWwgPSB2YWxpZGF0ZV9yZWN2X21nbnRfZnJhbWUoYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQlpZiAocmV0dmFsID09IF9GQUlMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAidmFsaWRhdGVfcmVjdl9tZ250X2ZyYW1lIGZhaWxcbiIpOwotCQl9Ci0JCXJldHZhbCA9IF9GQUlMOyAvKiAgb25seSBkYXRhIGZyYW1lIHJldHVybiBfU1VDQ0VTUyAqLwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6Ci0JCXJldHZhbCA9IHZhbGlkYXRlX3JlY3ZfY3RybF9mcmFtZShhZGFwdGVyLCBwcmVjdl9mcmFtZSk7Ci0JCWlmIChyZXR2YWwgPT0gX0ZBSUwpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ2YWxpZGF0ZV9yZWN2X2N0cmxfZnJhbWUgZmFpbFxuIik7Ci0JCX0KLQkJcmV0dmFsID0gX0ZBSUw7IC8qICBvbmx5IGRhdGEgZnJhbWUgcmV0dXJuIF9TVUNDRVNTICovCi0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0ZUWVBFX0RBVEE6Ci0JCXBhdHRyaWItPnFvcyA9IChzdWJ0eXBlICYgSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBKSA/IDEgOiAwOwotCQlyZXR2YWwgPSB2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWUoYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwotCQlpZiAocmV0dmFsID09IF9GQUlMKSB7Ci0JCQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmYWRhcHRlci0+cmVjdnByaXY7Ci0KLQkJCXByZWN2cHJpdi0+cnhfZHJvcCsrOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZSBmYWlsISB0eXBlID0gMHgleFxuIiwgdHlwZSk7Ci0JCXJldHZhbCA9IF9GQUlMOwotCQlicmVhazsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyogcmVtb3ZlIHRoZSB3bGFuaGRyIGFuZCBhZGQgdGhlIGV0aF9oZHIgKi8KLQotc3RhdGljIGludCB3bGFuaGRyX3RvX2V0aGhkciAoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCi17Ci0JdTE2CWV0aF90eXBlLCBsZW4sIGhkcmxlbjsKLQl1OAlic25hcGhkcjsKLQl1OAkqcHNuYXA7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gcHJlY3ZmcmFtZS0+YWRhcHRlcjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZmcmFtZS0+cGt0OwotCXU4ICpwdHI7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwotCi0KLQotCXB0ciA9IHNrYi0+ZGF0YTsKLQloZHJsZW4gPSBwYXR0cmliLT5oZHJsZW47Ci0JcHNuYXAgPSBwdHIgKyBoZHJsZW47Ci0JZXRoX3R5cGUgPSAocHNuYXBbNl0gPDwgOCkgfCBwc25hcFs3XTsKLQkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCi0JaWYgKChldGhlcl9hZGRyX2VxdWFsKHBzbmFwLCByZmMxMDQyX2hlYWRlcikgJiYKLQkgICAgIGV0aF90eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoX3R5cGUgIT0gRVRIX1BfSVBYKSB8fAotCSAgICBldGhlcl9hZGRyX2VxdWFsKHBzbmFwLCBicmlkZ2VfdHVubmVsX2hlYWRlcikpIHsKLQkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uCi0JCSAgIGFuZCByZXBsYWNlIEV0aGVyVHlwZSAqLwotCQlic25hcGhkciA9IHRydWU7Ci0JCWhkcmxlbiArPSBTTkFQX1NJWkU7Ci0JfSBlbHNlIHsKLQkJLyogTGVhdmUgRXRoZXJuZXQgaGVhZGVyIHBhcnQgb2YgaGRyIGFuZCBmdWxsIHBheWxvYWQgKi8KLQkJYnNuYXBoZHIgPSBmYWxzZTsKLQkJZXRoX3R5cGUgPSAocHNuYXBbMF0gPDwgOCkgfCBwc25hcFsxXTsKLQl9Ci0KLQlsZW4gPSBza2ItPmxlbiAtIGhkcmxlbjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkgIj09PSBwYXR0cmliLT5oZHJsZW46ICV4LCAgcGF0dHJpYi0+aXZfbGVuOiV4ID09PVxuIiwKLQkJIHBhdHRyaWItPmhkcmxlbiwgIHBhdHRyaWItPml2X2xlbik7Ci0KLQlwYXR0cmliLT5ldGhfdHlwZSA9IGV0aF90eXBlOwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9NUF9TVEFURSkpIHsKLQkJcHRyICs9IGhkcmxlbjsKLQkJKnB0ciA9IDB4ODc7Ci0JCSoocHRyICsgMSkgPSAweDEyOwotCi0JCWV0aF90eXBlID0gMHg4NzEyOwotCQkvKiAgYXBwZW5kIHJ4IHN0YXR1cyBmb3IgbXAgdGVzdCBwYWNrZXRzICovCi0KLQkJcHRyID0gc2tiX3B1bGwoc2tiLCAoaGRybGVuIC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsgMikgLSAyNCk7Ci0JCW1lbWNweShwdHIsIHNrYi0+aGVhZCwgMjQpOwotCQlwdHIgKz0gMjQ7Ci0JfSBlbHNlIHsKLQkJcHRyID0gc2tiX3B1bGwoc2tiLCAoaGRybGVuIC0gc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsKLQkJCQkgICAgIChic25hcGhkciA/IDI6MCkpKTsKLQl9Ci0KLQlldGhlcl9hZGRyX2NvcHkocHRyLCBwYXR0cmliLT5kc3QpOwotCWV0aGVyX2FkZHJfY29weShwdHIgKyBFVEhfQUxFTiwgcGF0dHJpYi0+c3JjKTsKLQotCWlmICghYnNuYXBoZHIpIHsKLQkJcHV0X3VuYWxpZ25lZF9iZTE2KGxlbiwgcHRyICsgMTIpOwotCX0KLQotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKiBwZXJmb3JtIGRlZnJhZyAqLwotc3RydWN0IHJlY3ZfZnJhbWUgKnJlY3ZmcmFtZV9kZWZyYWcoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3QgcnR3X3F1ZXVlICpkZWZyYWdfcSk7Ci1zdHJ1Y3QgcmVjdl9mcmFtZSAqcmVjdmZyYW1lX2RlZnJhZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJICAgIHN0cnVjdCBydHdfcXVldWUgKmRlZnJhZ19xKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXU4IHdsYW5oZHJfb2Zmc2V0OwotCXU4IGN1cmZyYWdudW07Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKnBuZmhkciwgKnB0bXA7Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUsICpwbmV4dHJmcmFtZTsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJlZV9yZWN2X3F1ZXVlOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQljdXJmcmFnbnVtID0gMDsKLQlwZnJlZV9yZWN2X3F1ZXVlID0gJmFkYXB0ZXItPnJlY3Zwcml2LmZyZWVfcmVjdl9xdWV1ZTsKLQotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChkZWZyYWdfcSk7Ci0JcHJmcmFtZSA9IGxpc3RfZmlyc3RfZW50cnkocGhlYWQsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKLQlsaXN0X2RlbF9pbml0KCZwcmZyYW1lLT5saXN0KTsKLQlza2IgPSBwcmZyYW1lLT5wa3Q7Ci0KLQlpZiAoY3VyZnJhZ251bSAhPSBwcmZyYW1lLT5hdHRyaWIuZnJhZ19udW0pIHsKLQkJLyogdGhlIGZpcnN0IGZyYWdtZW50IG51bWJlciBtdXN0IGJlIDAgKi8KLQkJLyogZnJlZSB0aGUgd2hvbGUgcXVldWUgKi8KLQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZnJhbWUpOwotCQlydHdfZnJlZV9yZWN2ZnJhbWUyM2FfcXVldWUoZGVmcmFnX3EpOwotCi0JCXJldHVybiBOVUxMOwotCX0KLQotCWN1cmZyYWdudW0rKzsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbmZoZHIsIHB0bXAsIHBoZWFkLCBsaXN0KSB7Ci0JCXBuZXh0cmZyYW1lID0gKHN0cnVjdCByZWN2X2ZyYW1lICopcG5maGRyOwotCQkvKiBjaGVjayB0aGUgZnJhZ21lbnQgc2VxdWVuY2UgICgybmQgfm4gZnJhZ21lbnQgZnJhbWUpICovCi0KLQkJaWYgKGN1cmZyYWdudW0gIT0gcG5maGRyLT5hdHRyaWIuZnJhZ19udW0pIHsKLQkJCS8qIHRoZSBmcmFnbWVudCBudW1iZXIgbXVzdCBiZSBpbmNyZWFzaW5nCi0JCQkgICAoYWZ0ZXIgZGVjYWNoZSkgKi8KLQkJCS8qIHJlbGVhc2UgdGhlIGRlZnJhZ19xICYgcHJmcmFtZSAqLwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZnJhbWUpOwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhX3F1ZXVlKGRlZnJhZ19xKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJY3VyZnJhZ251bSsrOwotCi0JCS8qIGNvcHkgdGhlIDJuZH5uIGZyYWdtZW50IGZyYW1lJ3MgcGF5bG9hZCB0byB0aGUKLQkJICAgZmlyc3QgZnJhZ21lbnQgKi8KLQkJLyogZ2V0IHRoZSAybmR+bGFzdCBmcmFnbWVudCBmcmFtZSdzIHBheWxvYWQgKi8KLQotCQl3bGFuaGRyX29mZnNldCA9IHBuZmhkci0+YXR0cmliLmhkcmxlbiArIHBuZmhkci0+YXR0cmliLml2X2xlbjsKLQotCQlza2JfcHVsbChwbmZoZHItPnBrdCwgd2xhbmhkcl9vZmZzZXQpOwotCi0JCS8qIGFwcGVuZCAgdG8gZmlyc3QgZnJhZ21lbnQgZnJhbWUncyB0YWlsCi0JCSAgIChpZiBwcml2YWN5IGZyYW1lLCBwdWxsIHRoZSBJQ1YpICovCi0KLQkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIHByZnJhbWUtPmF0dHJpYi5pY3ZfbGVuKTsKLQotCQltZW1jcHkoc2tiX3RhaWxfcG9pbnRlcihza2IpLCBwbmZoZHItPnBrdC0+ZGF0YSwKLQkJICAgICAgIHBuZmhkci0+cGt0LT5sZW4pOwotCi0JCXNrYl9wdXQoc2tiLCBwbmZoZHItPnBrdC0+bGVuKTsKLQotCQlwcmZyYW1lLT5hdHRyaWIuaWN2X2xlbiA9IHBuZmhkci0+YXR0cmliLmljdl9sZW47Ci0JfQotCi0JLyogZnJlZSB0aGUgZGVmcmFnX3EgcXVldWUgYW5kIHJldHVybiB0aGUgcHJmcmFtZSAqLwotCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYV9xdWV1ZShkZWZyYWdfcSk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJICJQZXJmb3JtYW5jZSBkZWZyYWchISEhIVxuIik7Ci0KLQlyZXR1cm4gcHJmcmFtZTsKLX0KLQotLyogY2hlY2sgaWYgbmVlZCB0byBkZWZyYWcsIGlmIG5lZWRlZCBxdWV1ZSB0aGUgZnJhbWUgdG8gZGVmcmFnX3EgKi8KLXN0cnVjdCByZWN2X2ZyYW1lICpyZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQlzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0JdTgJaXNtZnJhZzsKLQl1OAlmcmFnbnVtOwotCXU4CSpwc3RhX2FkZHI7Ci0Jc3RydWN0IHJlY3ZfZnJhbWUgKnBmaGRyOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCByZWN2X2ZyYW1lICpwcnRuZnJhbWUgPSBOVUxMOwotCXN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUsICpwZGVmcmFnX3E7Ci0KLQotCi0JcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQlwZmhkciA9IHByZWN2X2ZyYW1lOwotCi0JcGZyZWVfcmVjdl9xdWV1ZSA9ICZwYWRhcHRlci0+cmVjdnByaXYuZnJlZV9yZWN2X3F1ZXVlOwotCi0JLyogbmVlZCB0byBkZWZpbmUgc3RydWN0IG9mIHdsYW4gaGVhZGVyIGZyYW1lIGN0cmwgKi8KLQlpc21mcmFnID0gcGZoZHItPmF0dHJpYi5tZnJhZzsKLQlmcmFnbnVtID0gcGZoZHItPmF0dHJpYi5mcmFnX251bTsKLQotCXBzdGFfYWRkciA9IHBmaGRyLT5hdHRyaWIudGE7Ci0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcHN0YV9hZGRyKTsKLQlpZiAoIXBzdGEpIHsKLQkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9Ci0JCQkoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgcGZoZHItPnBrdC0+ZGF0YTsKLQkJaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCQlwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCQkJcGRlZnJhZ19xID0gJnBzdGEtPnN0YV9yZWN2cHJpdi5kZWZyYWdfcTsKLQkJfSBlbHNlCi0JCQlwZGVmcmFnX3EgPSBOVUxMOwotCX0gZWxzZQotCQlwZGVmcmFnX3EgPSAmcHN0YS0+c3RhX3JlY3Zwcml2LmRlZnJhZ19xOwotCi0JaWYgKChpc21mcmFnID09IDApICYmIChmcmFnbnVtID09IDApKSB7Ci0JCXBydG5mcmFtZSA9IHByZWN2X2ZyYW1lOy8qIGlzbid0IGEgZnJhZ21lbnQgZnJhbWUgKi8KLQl9Ci0KLQlpZiAoaXNtZnJhZyA9PSAxKSB7Ci0JCS8qIDB+KG4tMSkgZnJhZ21lbnQgZnJhbWUgKi8KLQkJLyogZW5xdWV1ZSB0byBkZWZyYWZfZyAqLwotCQlpZiAocGRlZnJhZ19xICE9IE5VTEwpIHsKLQkJCWlmIChmcmFnbnVtID09IDApIHsKLQkJCQkvKiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KLQkJCQlpZiAoIWxpc3RfZW1wdHkoJnBkZWZyYWdfcS0+cXVldWUpKSB7Ci0JCQkJCS8qIGZyZWUgY3VycmVudCBkZWZyYWdfcSAqLwotCQkJCQlydHdfZnJlZV9yZWN2ZnJhbWUyM2FfcXVldWUocGRlZnJhZ19xKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIFRoZW4gZW5xdWV1ZSB0aGUgMH4obi0xKSBmcmFnbWVudCBpbnRvIHRoZQotCQkJICAgZGVmcmFnX3EgKi8KLQotCQkJLyogc3Bpbl9sb2NrKCZwZGVmcmFnX3EtPmxvY2spOyAqLwotCQkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBkZWZyYWdfcSk7Ci0JCQlsaXN0X2FkZF90YWlsKCZwZmhkci0+bGlzdCwgcGhlYWQpOwotCQkJLyogc3Bpbl91bmxvY2soJnBkZWZyYWdfcS0+bG9jayk7ICovCi0KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiRW5xdWV1cTogaXNtZnJhZyA9ICVkLCBmcmFnbnVtID0gJWRcbiIsCi0JCQkJIGlzbWZyYWcsIGZyYWdudW0pOwotCi0JCQlwcnRuZnJhbWUgPSBOVUxMOwotCi0JCX0gZWxzZSB7Ci0JCQkvKiBjYW4ndCBmaW5kIHRoaXMgdGEncyBkZWZyYWdfcXVldWUsCi0JCQkgICBzbyBmcmVlIHRoaXMgcmVjdl9mcmFtZSAqLwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2X2ZyYW1lKTsKLQkJCXBydG5mcmFtZSA9IE5VTEw7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAiRnJlZSBiZWNhdXNlIHBkZWZyYWdfcSA9PSBOVUxMOiBpc21mcmFnID0gJWQsIGZyYWdudW0gPSAlZFxuIiwKLQkJCQkgaXNtZnJhZywgZnJhZ251bSk7Ci0JCX0KLQl9Ci0KLQlpZiAoKGlzbWZyYWcgPT0gMCkgJiYgKGZyYWdudW0gIT0gMCkpIHsKLQkJLyogdGhlIGxhc3QgZnJhZ21lbnQgZnJhbWUgKi8KLQkJLyogZW5xdWV1ZSB0aGUgbGFzdCBmcmFnbWVudCAqLwotCQlpZiAocGRlZnJhZ19xICE9IE5VTEwpIHsKLQkJCS8qIHNwaW5fbG9jaygmcGRlZnJhZ19xLT5sb2NrKTsgKi8KLQkJCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZGVmcmFnX3EpOwotCQkJbGlzdF9hZGRfdGFpbCgmcGZoZHItPmxpc3QsIHBoZWFkKTsKLQkJCS8qIHNwaW5fdW5sb2NrKCZwZGVmcmFnX3EtPmxvY2spOyAqLwotCi0JCQkvKiBjYWxsIHJlY3ZmcmFtZV9kZWZyYWcgdG8gZGVmcmFnICovCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgImRlZnJhZzogaXNtZnJhZyA9ICVkLCBmcmFnbnVtID0gJWRcbiIsCi0JCQkJIGlzbWZyYWcsIGZyYWdudW0pOwotCQkJcHJlY3ZfZnJhbWUgPSByZWN2ZnJhbWVfZGVmcmFnKHBhZGFwdGVyLCBwZGVmcmFnX3EpOwotCQkJcHJ0bmZyYW1lID0gcHJlY3ZfZnJhbWU7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBjYW4ndCBmaW5kIHRoaXMgdGEncyBkZWZyYWdfcXVldWUsCi0JCQkgICBzbyBmcmVlIHRoaXMgcmVjdl9mcmFtZSAqLwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2X2ZyYW1lKTsKLQkJCXBydG5mcmFtZSA9IE5VTEw7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAiRnJlZSBiZWNhdXNlIHBkZWZyYWdfcSA9PSBOVUxMOiBpc21mcmFnID0gJWQsIGZyYWdudW0gPSAlZFxuIiwKLQkJCQkgaXNtZnJhZywgZnJhZ251bSk7Ci0JCX0KLQotCX0KLQotCWlmICgocHJ0bmZyYW1lICE9IE5VTEwpICYmIChwcnRuZnJhbWUtPmF0dHJpYi5wcml2YWN5KSkJewotCQkvKiBhZnRlciBkZWZyYWcgd2UgbXVzdCBjaGVjayB0a2lwIG1pYyBjb2RlICovCi0JCWlmIChyZWN2ZnJhbWVfY2hrbWljKHBhZGFwdGVyLCAgcHJ0bmZyYW1lKSA9PSBfRkFJTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgInJlY3ZmcmFtZV9jaGttaWMocGFkYXB0ZXIsICBwcnRuZnJhbWUpID09X0ZBSUxcbiIpOwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHBydG5mcmFtZSk7Ci0JCQlwcnRuZnJhbWUgPSBOVUxMOwotCQl9Ci0JfQotCi0KLQotCXJldHVybiBwcnRuZnJhbWU7Ci19Ci0KLWludCBhbXNkdV90b19tc2R1KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKTsKLWludCBhbXNkdV90b19tc2R1KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQotewotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCBza19idWZmICpza2IsICpzdWJfc2tiOwotCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX2xpc3Q7Ci0KLQlwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKLQotCXNrYiA9IHByZnJhbWUtPnBrdDsKLQlza2JfcHVsbChza2IsIHByZnJhbWUtPmF0dHJpYi5oZHJsZW4pOwotCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2tiX2xpc3QpOwotCi0JaWVlZTgwMjExX2Ftc2R1X3RvXzgwMjNzKHNrYiwgJnNrYl9saXN0LCBOVUxMLCAwLCAwLCBmYWxzZSk7Ci0KLQl3aGlsZSAoIXNrYl9xdWV1ZV9lbXB0eSgmc2tiX2xpc3QpKSB7Ci0JCXN1Yl9za2IgPSBfX3NrYl9kZXF1ZXVlKCZza2JfbGlzdCk7Ci0KLQkJc3ViX3NrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhzdWJfc2tiLCBwYWRhcHRlci0+cG5ldGRldik7Ci0JCXN1Yl9za2ItPmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCi0JCXN1Yl9za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0KLQkJbmV0aWZfcngoc3ViX3NrYik7Ci0JfQotCi0JcHJmcmFtZS0+cGt0ID0gTlVMTDsKLQlydHdfZnJlZV9yZWN2ZnJhbWUyM2EocHJmcmFtZSk7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1pbnQgY2hlY2tfaW5kaWNhdGVfc2VxKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCwgdTE2IHNlcV9udW0pOwotaW50IGNoZWNrX2luZGljYXRlX3NlcShzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwsIHUxNiBzZXFfbnVtKQotewotCXU4CXdzaXplID0gcHJlb3JkZXJfY3RybC0+d3NpemVfYjsKLQl1MTYJd2VuZCA9IChwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgKyB3c2l6ZSAtMSkgJiAweEZGRjsKLQotCS8qICBSeCBSZW9yZGVyIGluaXRpYWxpemUgY29uZGl0aW9uLiAqLwotCWlmIChwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPT0gMHhGRkZGKQotCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPSBzZXFfbnVtOwotCi0JLyogIERyb3Agb3V0IHRoZSBwYWNrZXQgd2hpY2ggU2VxTnVtIGlzIHNtYWxsZXIgdGhhbiBXaW5TdGFydCAqLwotCWlmIChTTl9MRVNTKHNlcV9udW0sIHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSkpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qICAqLwotCS8qICBTbGlkaW5nIHdpbmRvdyBtYW5pcHVsYXRpb24uIENvbmRpdGlvbnMgaW5jbHVkZXM6ICovCi0JLyogIDEuIEluY29taW5nIFNlcU51bSBpcyBlcXVhbCB0byBXaW5TdGFydCA9PldpbmRvdyBzaGlmdCAxICovCi0JLyogIDIuIEluY29taW5nIFNlcU51bSBpcyBsYXJnZXIgdGhhbiB0aGUgV2luRW5kID0+IFdpbmRvdyBzaGlmdCBOICovCi0JLyogICovCi0JaWYgKFNOX0VRVUFMKHNlcV9udW0sIHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSkpIHsKLQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0KLQkJCShwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgKyAxKSAmIDB4RkZGOwotCX0gZWxzZSBpZiAoU05fTEVTUyh3ZW5kLCBzZXFfbnVtKSkgewotCQkvKiAgYm91bmRhcnkgc2l0dWF0aW9uLCB3aGVuIHNlcV9udW0gY3Jvc3MgMHhGRkYgKi8KLQkJaWYgKHNlcV9udW0gPj0gKHdzaXplIC0gMSkpCi0JCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPSBzZXFfbnVtICsgMSAtd3NpemU7Ci0JCWVsc2UKLQkJCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IDB4RkZGIC0gKHdzaXplIC0gKHNlcV9udW0gKyAxKSkgKyAxOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCBlbnF1ZXVlX3Jlb3JkZXJfcmVjdmZyYW1lMjNhKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCwKLQkJCQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpCi17Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBydHdfcXVldWUgKnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0LCAqcHRtcDsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqaGRyOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwbmV4dGF0dHJpYjsKLQotCXBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSA9ICZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlKTsKLQotCWxpc3RfZm9yX2VhY2hfc2FmZShwbGlzdCwgcHRtcCwgcGhlYWQpIHsKLQkJaGRyID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7Ci0JCXBuZXh0YXR0cmliID0gJmhkci0+YXR0cmliOwotCi0JCWlmIChTTl9MRVNTKHBuZXh0YXR0cmliLT5zZXFfbnVtLCBwYXR0cmliLT5zZXFfbnVtKSkgewotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAoU05fRVFVQUwocG5leHRhdHRyaWItPnNlcV9udW0sIHBhdHRyaWItPnNlcV9udW0pKSB7Ci0JCQkvKiBEdXBsaWNhdGUgZW50cnkgaXMgZm91bmQhISBEbyBub3QgaW5zZXJ0IGN1cnJlbnQgZW50cnkuICovCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlicmVhazsKLQkJfQotCi0JfQotCi0JbGlzdF9kZWxfaW5pdCgmcHJmcmFtZS0+bGlzdCk7Ci0KLQlsaXN0X2FkZF90YWlsKCZwcmZyYW1lLT5saXN0LCBwbGlzdCk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotaW50IHJlY3ZfaW5kaWNhdGVwa3RzX2luX29yZGVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsLAotCQkJICAgICAgIGludCBiZm9yY2VkKTsKLWludCByZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCwKLQkJCSAgICAgICBpbnQgYmZvcmNlZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0OwotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwotCWludCBiUGt0SW5CdWYgPSBmYWxzZTsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXY7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwotCi0JcHJlY3Zwcml2ID0gJnBhZGFwdGVyLT5yZWN2cHJpdjsKLQlwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUgPSAmcHJlb3JkZXJfY3RybC0+cGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0JcGhlYWQgPQlnZXRfbGlzdF9oZWFkKHBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSk7Ci0JcGxpc3QgPSBwaGVhZC0+bmV4dDsKLQotCS8qICBIYW5kbGluZyBzb21lIGNvbmRpdGlvbiBmb3IgZm9yY2VkIGluZGljYXRlIGNhc2UuICovCi0JaWYgKGJmb3JjZWQpIHsKLQkJaWYgKGxpc3RfZW1wdHkocGhlYWQpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByZnJhbWUgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKLQkJcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7Ci0JCXByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSA9IHBhdHRyaWItPnNlcV9udW07Ci0JfQotCi0JLyogIFByZXBhcmUgaW5kaWNhdGlvbiBsaXN0IGFuZCBpbmRpY2F0aW9uLiAqLwotCS8qICBDaGVjayBpZiB0aGVyZSBpcyBhbnkgcGFja2V0IG5lZWQgaW5kaWNhdGUuICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KHBoZWFkKSkgewotCi0JCXByZnJhbWUgPSBjb250YWluZXJfb2YocGxpc3QsIHN0cnVjdCByZWN2X2ZyYW1lLCBsaXN0KTsKLQkJcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7Ci0KLQkJaWYgKCFTTl9MRVNTKHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSwgcGF0dHJpYi0+c2VxX251bSkpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICJyZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcjogaW5kaWNhdGUgPSVkIHNlcSA9JWQgYW1zZHUgPSVkXG4iLAotCQkJCSBwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEsCi0JCQkJIHBhdHRyaWItPnNlcV9udW0sIHBhdHRyaWItPmFtc2R1KTsKLQotCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKLQkJCWxpc3RfZGVsX2luaXQoJnByZnJhbWUtPmxpc3QpOwotCi0JCQlpZiAoU05fRVFVQUwocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxLAotCQkJCSAgICAgcGF0dHJpYi0+c2VxX251bSkpCXsKLQkJCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPQotCQkJCQkocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxICsgMSkmMHhGRkY7Ci0JCQl9Ci0KLQkJCWlmICghcGF0dHJpYi0+YW1zZHUpIHsKLQkJCQlpZiAoKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSBmYWxzZSkgJiYKLQkJCQkgICAgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IGZhbHNlKSkgewotCQkJCQlydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYShwYWRhcHRlciwgcHJmcmFtZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYW1zZHVfdG9fbXNkdShwYWRhcHRlciwgcHJmcmFtZSkgIT0KLQkJCQkgICAgX1NVQ0NFU1MpCi0JCQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmZyYW1lKTsKLQkJCX0KLQotCQkJLyogVXBkYXRlIGxvY2FsIHZhcmlhYmxlcy4gKi8KLQkJCWJQa3RJbkJ1ZiA9IGZhbHNlOwotCi0JCX0gZWxzZSB7Ci0JCQliUGt0SW5CdWYgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCXJldHVybiBiUGt0SW5CdWY7Ci19Ci0KLWludCByZWN2X2luZGljYXRlcGt0X3Jlb3JkZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpOwotaW50IHJlY3ZfaW5kaWNhdGVwa3RfcmVvcmRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKLXsKLQlpbnQgcmV0dmFsID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWI7Ci0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwotCXN0cnVjdCBydHdfcXVldWUgKnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQotCXBhdHRyaWIgPSAmcHJmcmFtZS0+YXR0cmliOwotCXByZW9yZGVyX2N0cmwgPSBwcmZyYW1lLT5wcmVvcmRlcl9jdHJsOwotCXBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZSA9ICZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQotCWlmICghcGF0dHJpYi0+YW1zZHUpIHsKLQkJLyogczEuICovCi0JCXdsYW5oZHJfdG9fZXRoaGRyKHByZnJhbWUpOwotCi0JCWlmICgocGF0dHJpYi0+cW9zIT0gMSkgfHwgKHBhdHRyaWItPmV0aF90eXBlID09IEVUSF9QX0FSUCkgfHwKLQkJICAgIChwYXR0cmliLT5hY2tfcG9saWN5ICE9IDApKSB7Ci0JCQlpZiAoKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSBmYWxzZSkgJiYKLQkJCSAgICAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gZmFsc2UpKSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJCQkJICJAQEBAICByZWN2X2luZGljYXRlcGt0X3Jlb3JkZXIgLXJlY3ZfZnVuYyByZWN2X2luZGljYXRlcGt0XG4iKTsKLQotCQkJCXJ0d19yZWN2X2luZGljYXRlcGt0MjNhKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQkJCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JCQl9Ci0KLQkJCXJldHVybiBfRkFJTDsKLQkJfQotCi0JCWlmIChwcmVvcmRlcl9jdHJsLT5lbmFibGUgPT0gZmFsc2UpIHsKLQkJCS8qIGluZGljYXRlIHRoaXMgcmVjdl9mcmFtZSAqLwotCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gcGF0dHJpYi0+c2VxX251bTsKLQkJCXJ0d19yZWN2X2luZGljYXRlcGt0MjNhKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQotCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0KLQkJCQkocHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxICsgMSkgJSA0MDk2OwotCQkJcmV0dXJuIF9TVUNDRVNTOwotCQl9Ci0JfSBlbHNlIHsKLQkJIC8qIHRlbXAgZmlsdGVyIC0+IG1lYW5zIGRpZG4ndCBzdXBwb3J0IEEtTVNEVXMgaW4gYSBBLU1QRFUgKi8KLQkJaWYgKHByZW9yZGVyX2N0cmwtPmVuYWJsZSA9PSBmYWxzZSkgewotCQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gcGF0dHJpYi0+c2VxX251bTsKLQkJCXJldHZhbCA9IGFtc2R1X3RvX21zZHUocGFkYXB0ZXIsIHByZnJhbWUpOwotCi0JCQlwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgPQotCQkJCShwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEgKyAxKSAlIDQwOTY7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJICJyZWN2X2luZGljYXRlcGt0X3Jlb3JkZXI6IGluZGljYXRlID0lZCBzZXEgPSVkXG4iLAotCQkgcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxLCBwYXR0cmliLT5zZXFfbnVtKTsKLQotCS8qIHMyLiBjaGVjayBpZiB3aW5zdGFydF9iKGluZGljYXRlX3NlcSkgbmVlZHMgdG8gYmVlbiB1cGRhdGVkICovCi0JaWYgKCFjaGVja19pbmRpY2F0ZV9zZXEocHJlb3JkZXJfY3RybCwgcGF0dHJpYi0+c2VxX251bSkpIHsKLQkJZ290byBfZXJyX2V4aXQ7Ci0JfQotCi0JLyogczMuIEluc2VydCBhbGwgcGFja2V0IGludG8gUmVvcmRlciBRdWV1ZSB0byBtYWludGFpbiBpdHMgb3JkZXJpbmcuICovCi0JaWYgKCFlbnF1ZXVlX3Jlb3JkZXJfcmVjdmZyYW1lMjNhKHByZW9yZGVyX2N0cmwsIHByZnJhbWUpKSB7Ci0JCWdvdG8gX2Vycl9leGl0OwotCX0KLQotCS8qIHM0LiAqLwotCS8qICBJbmRpY2F0aW9uIHByb2Nlc3MuICovCi0JLyogIEFmdGVyIFBhY2tldCBkcm9wcGluZyBhbmQgU2xpZGluZyBXaW5kb3cgc2hpZnRpbmcgYXMgYWJvdmUsCi0JICAgIHdlIGNhbiBub3cganVzdCBpbmRpY2F0ZSB0aGUgcGFja2V0cyAqLwotCS8qICB3aXRoIHRoZSBTZXFOdW0gc21hbGxlciB0aGFuIGxhdGVzdCBXaW5TdGFydCBhbmQgYnVmZmVyCi0JICAgIG90aGVyIHBhY2tldHMuICovCi0JLyogICovCi0JLyogIEZvciBSeCBSZW9yZGVyIGNvbmRpdGlvbjogKi8KLQkvKiAgMS4gQWxsIHBhY2tldHMgd2l0aCBTZXFOdW0gc21hbGxlciB0aGFuIFdpblN0YXJ0ID0+IEluZGljYXRlICovCi0JLyogIDIuIEFsbCBwYWNrZXRzIHdpdGggU2VxTnVtIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIFdpblN0YXJ0ID0+Ci0JICAgIEJ1ZmZlciBpdC4gKi8KLQkvKiAgKi8KLQotCWlmIChyZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcihwYWRhcHRlciwgcHJlb3JkZXJfY3RybCwgZmFsc2UpID09IHRydWUpIHsKLQkJbW9kX3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFJFT1JERVJfV0FJVF9USU1FKSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotCQlkZWxfdGltZXJfc3luYygmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKLQl9Ci0JcmV0dXJuIF9TVUNDRVNTOwotCi1fZXJyX2V4aXQ6Ci0KLQlzcGluX3VubG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXZvaWQgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIyM2EodW5zaWduZWQgbG9uZyBwY29udGV4dCkKLXsKLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0KLQlwcmVvcmRlcl9jdHJsID0gKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqKXBjb250ZXh0OwotCXBhZGFwdGVyID0gcHJlb3JkZXJfY3RybC0+cGFkYXB0ZXI7Ci0JcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlID0gJnByZW9yZGVyX2N0cmwtPnBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlOwotCi0JaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotCi0JaWYgKHJlY3ZfaW5kaWNhdGVwa3RzX2luX29yZGVyKHBhZGFwdGVyLCBwcmVvcmRlcl9jdHJsLCB0cnVlKSA9PSB0cnVlKSB7Ci0JCW1vZF90aW1lcigmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhSRU9SREVSX1dBSVRfVElNRSkpOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwotfQotCi1pbnQgcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWUpOwotaW50IHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQotewotCWludCByZXR2YWwgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCi0JaWYgKHBodHByaXYtPmh0X29wdGlvbiA9PSB0cnVlKSB7IC8qIEIvRy9OIE1vZGUgKi8KLQkJLyogIGluY2x1ZGluZyBwZXJmb3JtIEEtTVBEVSBSeCBPcmRlcmluZyBCdWZmZXIgQ29udHJvbCAqLwotCQlpZiAocmVjdl9pbmRpY2F0ZXBrdF9yZW9yZGVyKHBhZGFwdGVyLCBwcmZyYW1lKSAhPSBfU1VDQ0VTUykgewotCQkJaWYgKChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gZmFsc2UpICYmCi0JCQkgICAgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IGZhbHNlKSkgewotCQkJCXJldHZhbCA9IF9GQUlMOwotCQkJCXJldHVybiByZXR2YWw7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgeyAvKiBCL0cgbW9kZSAqLwotCQlyZXR2YWwgPSB3bGFuaGRyX3RvX2V0aGhkcihwcmZyYW1lKTsKLQkJaWYgKHJldHZhbCAhPSBfU1VDQ0VTUykgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgIndsYW5oZHJfdG9fZXRoaGRyOiBkcm9wIHBrdFxuIik7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0KLQkJaWYgKChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPT0gZmFsc2UpICYmCi0JCSAgICAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gZmFsc2UpKSB7Ci0JCQkvKiBpbmRpY2F0ZSB0aGlzIHJlY3ZfZnJhbWUgKi8KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICJAQEBAIHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMtIHJlY3ZfZnVuYyByZWN2X2luZGljYXRlcGt0XG4iKTsKLQkJCXJ0d19yZWN2X2luZGljYXRlcGt0MjNhKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQkJfSBlbHNlIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICJAQEBAIHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMtIHJlY3ZfZnVuYyBmcmVlX2luZGljYXRlcGt0XG4iKTsKLQotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJCQkgInJlY3ZfZnVuYzpiRHJpdmVyU3RvcHBlZCglZCkgT1IgYlN1cnByaXNlUmVtb3ZlZCglZClcbiIsCi0JCQkJIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKLQkJCQkgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpOwotCQkJcmV0dmFsID0gX0ZBSUw7Ci0JCQlyZXR1cm4gcmV0dmFsOwotCQl9Ci0KLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IHJlY3ZfZnVuY19wcmVoYW5kbGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcmZyYW1lKQotewotCWludCByZXQ7Ci0KLQkvKiBjaGVjayB0aGUgZnJhbWUgY3J0bCBmaWVsZCBhbmQgZGVjYWNoZSAqLwotCXJldCA9IHZhbGlkYXRlX3JlY3ZfZnJhbWUocGFkYXB0ZXIsIHJmcmFtZSk7Ci0JaWYgKHJldCAhPSBfU1VDQ0VTUykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAicmVjdl9mdW5jOiB2YWxpZGF0ZV9yZWN2X2ZyYW1lIGZhaWwhIGRyb3AgcGt0XG4iKTsKLQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHJmcmFtZSk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByZWN2X2Z1bmNfcG9zdGhhbmRsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmZyYW1lKQotewotCWludCByZXQgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgcmVjdl9mcmFtZSAqb3JpZ19wcmZyYW1lID0gcHJmcmFtZTsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCi0JLyogIERBVEEgRlJBTUUgKi8KLQlwcmZyYW1lID0gZGVjcnlwdG9yKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQlpZiAocHJmcmFtZSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgImRlY3J5cHRvcjogZHJvcCBwa3RcbiIpOwotCQlyZXQgPSBfRkFJTDsKLQkJZ290byBfcmVjdl9kYXRhX2Ryb3A7Ci0JfQotCi0JcHJmcmFtZSA9IHJlY3ZmcmFtZV9jaGtfZGVmcmFnMjNhKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQlpZiAoIXByZnJhbWUpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAicmVjdmZyYW1lX2Noa19kZWZyYWcyM2E6IGRyb3AgcGt0XG4iKTsKLQkJZ290byBfcmVjdl9kYXRhX2Ryb3A7Ci0JfQotCi0JLyoKLQkgKiBQdWxsIG9mZiBjcnlwdG8gaGVhZGVycwotCSAqLwotCWlmIChwcmZyYW1lLT5hdHRyaWIuaXZfbGVuID4gMCkgewotCQlza2JfcHVsbChwcmZyYW1lLT5wa3QsIHByZnJhbWUtPmF0dHJpYi5pdl9sZW4pOwotCX0KLQotCWlmIChwcmZyYW1lLT5hdHRyaWIuaWN2X2xlbiA+IDApIHsKLQkJc2tiX3RyaW0ocHJmcmFtZS0+cGt0LAotCQkJIHByZnJhbWUtPnBrdC0+bGVuIC0gcHJmcmFtZS0+YXR0cmliLmljdl9sZW4pOwotCX0KLQotCXByZnJhbWUgPSBwb3J0Y3RybChwYWRhcHRlciwgcHJmcmFtZSk7Ci0JaWYgKCFwcmZyYW1lKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInBvcnRjdHJsOiBkcm9wIHBrdFxuIik7Ci0JCXJldCA9IF9GQUlMOwotCQlnb3RvIF9yZWN2X2RhdGFfZHJvcDsKLQl9Ci0KLQljb3VudF9yeF9zdGF0cyhwYWRhcHRlciwgcHJmcmFtZSwgTlVMTCk7Ci0KLQlyZXQgPSBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzKHBhZGFwdGVyLCBwcmZyYW1lKTsKLQlpZiAocmV0ICE9IF9TVUNDRVNTKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJlY3ZfZnVuYzogcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cyBmYWlsIVxuIik7Ci0JCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShvcmlnX3ByZnJhbWUpOy8qIGZyZWUgdGhpcyByZWN2X2ZyYW1lICovCi0JCWdvdG8gX3JlY3ZfZGF0YV9kcm9wOwotCX0KLQlyZXR1cm4gcmV0OwotCi1fcmVjdl9kYXRhX2Ryb3A6Ci0JcHJlY3Zwcml2LT5yeF9kcm9wKys7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0d19yZWN2X2VudHJ5MjNhKHN0cnVjdCByZWN2X2ZyYW1lICpyZnJhbWUpCi17Ci0JaW50IHJldCwgcjsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gcmZyYW1lLT5hZGFwdGVyOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwcnhhdHRyaWIgPSAmcmZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JLyogY2hlY2sgaWYgbmVlZCB0byBoYW5kbGUgdWNfc3dkZWNfcGVuZGluZ19xdWV1ZSovCi0JaWYgKGNoZWNrX2Z3c3RhdGUobWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgJiYKLQkgICAgcHNlY3VyaXR5cHJpdi0+YnVzZXRraXBrZXkpCXsKLQkJc3RydWN0IHJlY3ZfZnJhbWUgKnBlbmRpbmdfZnJhbWU7Ci0KLQkJd2hpbGUgKChwZW5kaW5nX2ZyYW1lID0gcnR3X2FsbG9jX3JlY3ZmcmFtZTIzYSgmcGFkYXB0ZXItPnJlY3Zwcml2LnVjX3N3ZGVjX3BlbmRpbmdfcXVldWUpKSkgewotCQkJciA9IHJlY3ZfZnVuY19wb3N0aGFuZGxlKHBhZGFwdGVyLCBwZW5kaW5nX2ZyYW1lKTsKLQkJCWlmIChyID09IF9TVUNDRVNTKQotCQkJCURCR184NzIzQSgiJXM6IGRlcXVldWUgdWNfc3dkZWNfcGVuZGluZ19xdWV1ZVxuIiwgX19mdW5jX18pOwotCQl9Ci0JfQotCi0JcmV0ID0gcmVjdl9mdW5jX3ByZWhhbmRsZShwYWRhcHRlciwgcmZyYW1lKTsKLQotCWlmIChyZXQgPT0gX1NVQ0NFU1MpIHsKLQkJLyogY2hlY2sgaWYgbmVlZCB0byBlbnF1ZXVlIGludG8gdWNfc3dkZWNfcGVuZGluZ19xdWV1ZSovCi0JCWlmIChjaGVja19md3N0YXRlKG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpICYmCi0JCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkgJiYKLQkJICAgIHByeGF0dHJpYi0+ZW5jcnlwdCA+IDAgJiYKLQkJICAgIChwcnhhdHRyaWItPmJkZWNyeXB0ZWQgPT0gMCkgJiYKLQkJICAgICFpc193ZXBfZW5jKHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0pICYmCi0JCSAgICAhcHNlY3VyaXR5cHJpdi0+YnVzZXRraXBrZXkpIHsKLQkJCXJ0d19lbnF1ZXVlX3JlY3ZmcmFtZTIzYShyZnJhbWUsICZwYWRhcHRlci0+cmVjdnByaXYudWNfc3dkZWNfcGVuZGluZ19xdWV1ZSk7Ci0JCQlEQkdfODcyM0EoIiVzOiBubyBrZXksIGVucXVldWUgdWNfc3dkZWNfcGVuZGluZ19xdWV1ZVxuIiwgX19mdW5jX18pOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJcmV0ID0gcmVjdl9mdW5jX3Bvc3RoYW5kbGUocGFkYXB0ZXIsIHJmcmFtZSk7Ci0KLQkJcmVjdnByaXYtPnJ4X3BrdHMrKzsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsMjNhKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopZGF0YTsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpyZWN2cHJpdiA9ICZhZGFwdGVyLT5yZWN2cHJpdjsKLQotCXUzMiB0bXBfcywgdG1wX3E7Ci0JdTggYXZnX3NpZ25hbF9zdHJlbmd0aCA9IDA7Ci0JdTggYXZnX3NpZ25hbF9xdWFsID0gMDsKLQl1MzIgbnVtX3NpZ25hbF9zdHJlbmd0aCA9IDA7Ci0JdTMyIG51bV9zaWduYWxfcXVhbCA9IDA7Ci0JdTggX2FscGhhID0gMzsJLyogdGhpcyB2YWx1ZSBpcyBiYXNlZCBvbiBjb252ZXJnaW5nX2NvbnN0YW50ID0gNTAwMCAqLwotCQkJLyogYW5kIHNhbXBsaW5nX2ludGVydmFsID0gMTAwMCAqLwotCi0JaWYgKHJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGhfZGF0YS51cGRhdGVfcmVxID09IDApIHsKLQkJLyogIHVwZGF0ZV9yZXEgaXMgY2xlYXIsIG1lYW5zIHdlIGdvdCByeCAqLwotCQlhdmdfc2lnbmFsX3N0cmVuZ3RoID0gcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aF9kYXRhLmF2Z192YWw7Ci0JCW51bV9zaWduYWxfc3RyZW5ndGggPSByZWN2cHJpdi0+c2lnbmFsX3N0cmVuZ3RoX2RhdGEudG90YWxfbnVtOwotCQkvKiAgYWZ0ZXIgYXZnX3ZhbHMgYXJlIGFjcXVpcmVkLCB3ZSBjYW4gcmUtc3RhdCAqLwotCQkvKiB0aGUgc2lnbmFsIHZhbHVlcyAqLwotCQlyZWN2cHJpdi0+c2lnbmFsX3N0cmVuZ3RoX2RhdGEudXBkYXRlX3JlcSA9IDE7Ci0JfQotCi0JaWYgKHJlY3Zwcml2LT5zaWduYWxfcXVhbF9kYXRhLnVwZGF0ZV9yZXEgPT0gMCkgewotCQkvKiAgdXBkYXRlX3JlcSBpcyBjbGVhciwgbWVhbnMgd2UgZ290IHJ4ICovCi0JCWF2Z19zaWduYWxfcXVhbCA9IHJlY3Zwcml2LT5zaWduYWxfcXVhbF9kYXRhLmF2Z192YWw7Ci0JCW51bV9zaWduYWxfcXVhbCA9IHJlY3Zwcml2LT5zaWduYWxfcXVhbF9kYXRhLnRvdGFsX251bTsKLQkJLyogIGFmdGVyIGF2Z192YWxzIGFyZSBhY3F1aXJlZCwgd2UgY2FuIHJlLXN0YXQgKi8KLQkJLyp0aGUgc2lnbmFsIHZhbHVlcyAqLwotCQlyZWN2cHJpdi0+c2lnbmFsX3F1YWxfZGF0YS51cGRhdGVfcmVxID0gMTsKLQl9Ci0KLQkvKiB1cGRhdGUgdmFsdWUgb2Ygc2lnbmFsX3N0cmVuZ3RoLCByc3NpLCBzaWduYWxfcXVhbCAqLwotCWlmICghY2hlY2tfZndzdGF0ZSgmYWRhcHRlci0+bWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpKSB7Ci0JCXRtcF9zID0gYXZnX3NpZ25hbF9zdHJlbmd0aCArIChfYWxwaGEgLSAxKSAqCi0JCQkgcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aDsKLQkJaWYgKHRtcF9zICVfYWxwaGEpCi0JCQl0bXBfcyA9IHRtcF9zIC8gX2FscGhhICsgMTsKLQkJZWxzZQotCQkJdG1wX3MgPSB0bXBfcyAvIF9hbHBoYTsKLQkJaWYgKHRtcF9zID4gMTAwKQotCQkJdG1wX3MgPSAxMDA7Ci0KLQkJdG1wX3EgPSBhdmdfc2lnbmFsX3F1YWwgKyAoX2FscGhhIC0gMSkgKiByZWN2cHJpdi0+c2lnbmFsX3F1YWw7Ci0JCWlmICh0bXBfcSAlX2FscGhhKQotCQkJdG1wX3EgPSB0bXBfcSAvIF9hbHBoYSArIDE7Ci0JCWVsc2UKLQkJCXRtcF9xID0gdG1wX3EgLyBfYWxwaGE7Ci0JCWlmICh0bXBfcSA+IDEwMCkKLQkJCXRtcF9xID0gMTAwOwotCi0JCXJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGggPSB0bXBfczsKLQkJcmVjdnByaXYtPnNpZ25hbF9xdWFsID0gdG1wX3E7Ci0KLQkJREJHXzg3MjNBKCIlcyBzaWduYWxfc3RyZW5ndGg6JTN1LCBzaWduYWxfcXVhbDolM3UsICIKLQkJCSAgIm51bV9zaWduYWxfc3RyZW5ndGg6JXUsIG51bV9zaWduYWxfcXVhbDoldVxuIiwKLQkJCSAgX19mdW5jX18sIHJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGgsCi0JCQkgIHJlY3Zwcml2LT5zaWduYWxfcXVhbCwgbnVtX3NpZ25hbF9zdHJlbmd0aCwKLQkJCSAgbnVtX3NpZ25hbF9xdWFsKTsKLQl9Ci0KLQlydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKHJlY3Zwcml2KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc2VjdXJpdHkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc2VjdXJpdHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0Y2ZkZjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zZWN1cml0eS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgIF9SVFdfU0VDVVJJVFlfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDx3aWZpLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotCi0vKiBXRVAgcmVsYXRlZCA9PT09PSAqLwotCi0jZGVmaW5lIENSQzMyX1BPTFkgMHgwNGMxMWRiNwotCi1zdHJ1Y3QgYXJjNGNvbnRleHQgewotCXUzMiB4OwotCXUzMiB5OwotCXU4IHN0YXRlWzI1Nl07Ci19OwotCi1zdGF0aWMgdm9pZCBhcmNmb3VyX2luaXQoc3RydWN0IGFyYzRjb250ZXh0ICpwYXJjNGN0eCwgdTggKmtleSwgdTMyIGtleV9sZW4pCi17Ci0JdTMyIHQsIHU7Ci0JdTMyIGtleWluZGV4OwotCXUzMiBzdGF0ZWluZGV4OwotCXU4ICpzdGF0ZTsKLQl1MzIgY291bnRlcjsKLQotCXN0YXRlID0gcGFyYzRjdHgtPnN0YXRlOwotCXBhcmM0Y3R4LT54ID0gMDsKLQlwYXJjNGN0eC0+eSA9IDA7Ci0JZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDI1NjsgY291bnRlcisrKQotCQlzdGF0ZVtjb3VudGVyXSA9ICh1OCljb3VudGVyOwotCWtleWluZGV4ID0gMDsKLQlzdGF0ZWluZGV4ID0gMDsKLQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgMjU2OyBjb3VudGVyKyspIHsKLQkJdCA9IHN0YXRlW2NvdW50ZXJdOwotCQlzdGF0ZWluZGV4ID0gKHN0YXRlaW5kZXggKyBrZXlba2V5aW5kZXhdICsgdCkgJiAweGZmOwotCQl1ID0gc3RhdGVbc3RhdGVpbmRleF07Ci0JCXN0YXRlW3N0YXRlaW5kZXhdID0gKHU4KXQ7Ci0JCXN0YXRlW2NvdW50ZXJdID0gKHU4KXU7Ci0JCWlmICgrK2tleWluZGV4ID49IGtleV9sZW4pCi0JCQlrZXlpbmRleCA9IDA7Ci0JfQotCi19Ci0KLXN0YXRpYyB1MzIgYXJjZm91cl9ieXRlKHN0cnVjdCBhcmM0Y29udGV4dCAqcGFyYzRjdHgpCi17Ci0JdTMyIHg7Ci0JdTMyIHk7Ci0JdTMyIHN4LCBzeTsKLQl1OCAqc3RhdGU7Ci0KLQlzdGF0ZSA9IHBhcmM0Y3R4LT5zdGF0ZTsKLQl4ID0gKHBhcmM0Y3R4LT54ICsgMSkgJiAweGZmOwotCXN4ID0gc3RhdGVbeF07Ci0JeSA9IChzeCArIHBhcmM0Y3R4LT55KSAmIDB4ZmY7Ci0Jc3kgPSBzdGF0ZVt5XTsKLQlwYXJjNGN0eC0+eCA9IHg7Ci0JcGFyYzRjdHgtPnkgPSB5OwotCXN0YXRlW3ldID0gKHU4KXN4OwotCXN0YXRlW3hdID0gKHU4KXN5OwotCi0JcmV0dXJuIHN0YXRlWyhzeCArIHN5KSAmIDB4ZmZdOwotfQotCi1zdGF0aWMgdm9pZCBhcmNmb3VyX2VuY3J5cHQoc3RydWN0IGFyYzRjb250ZXh0ICpwYXJjNGN0eCwgdTggKmRlc3QsCi0JCQkgICAgdTggKnNyYywgdTMyIGxlbikKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJZGVzdFtpXSA9IHNyY1tpXSBeICh1bnNpZ25lZCBjaGFyKWFyY2ZvdXJfYnl0ZShwYXJjNGN0eCk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNyYzMyaW5pdGlhbGl6ZWQ7Ci1zdGF0aWMgdTMyIGNyYzMyX3RhYmxlWzI1Nl07Ci0KLXN0YXRpYyB1OCBjcmMzMl9yZXZlcnNlQml0KHU4IGRhdGEpCi17Ci0JdTggcmV0dmFsID0gKChkYXRhIDw8IDcpICYgMHg4MCkgfCAoKGRhdGEgPDwgNSkgJiAweDQwKSB8Ci0JCSgoZGF0YSA8PCAzKSAmIDB4MjApIHwgKChkYXRhIDw8IDEpICYgMHgxMCkgfAotCQkoKGRhdGEgPj4gMSkgJiAweDA4KSB8ICgoZGF0YSA+PiAzKSAmIDB4MDQpIHwKLQkJKChkYXRhID4+IDUpICYgMHgwMikgfCAoKGRhdGEgPj4gNykgJiAweDAxKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgdm9pZCBjcmMzMl9pbml0KHZvaWQpCi17Ci0JaW50IGksIGo7Ci0JdTMyIGM7Ci0JdTggKnAsICpwMTsKLQl1OCBrOwotCi0JaWYgKGJjcmMzMmluaXRpYWxpemVkID09IDEpCi0JCXJldHVybjsKLQotCXAgPSAodTggKikgJmM7Ci0JYyA9IDB4MTIzNDAwMDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKLQkJayA9IGNyYzMyX3JldmVyc2VCaXQoKHU4KWkpOwotCi0JCWZvciAoYyA9ICgodTMyKWspIDw8IDI0LCBqID0gODsgaiA+IDA7IC0taikKLQkJCWMgPSBjICYgMHg4MDAwMDAwMCA/IChjIDw8IDEpIF4gQ1JDMzJfUE9MWSA6IChjIDw8IDEpOwotCi0JCXAxID0gKHU4ICopJmNyYzMyX3RhYmxlW2ldOwotCi0JCXAxWzBdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzNdKTsKLQkJcDFbMV0gPSBjcmMzMl9yZXZlcnNlQml0KHBbMl0pOwotCQlwMVsyXSA9IGNyYzMyX3JldmVyc2VCaXQocFsxXSk7Ci0JCXAxWzNdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzBdKTsKLQl9Ci0KLQliY3JjMzJpbml0aWFsaXplZCA9IDE7Ci19Ci0KLXN0YXRpYyB1MzIgZ2V0Y3JjMzIodTggKmJ1ZiwgaW50IGxlbikKLXsKLQl1OCAqcDsKLQl1MzIgY3JjOwotCi0JaWYgKGJjcmMzMmluaXRpYWxpemVkID09IDApCi0JCWNyYzMyX2luaXQoKTsKLQotCWNyYyA9IDB4ZmZmZmZmZmY7IC8qIHByZWxvYWQgc2hpZnQgcmVnaXN0ZXIsIHBlciBDUkMtMzIgc3BlYyAqLwotCi0JZm9yIChwID0gYnVmOyBsZW4gPiAwOyArK3AsIC0tbGVuKQotCQljcmMgPSBjcmMzMl90YWJsZVsoY3JjIF4gKnApICYgMHhmZl0gXiAoY3JjID4+IDgpOwotCi0JcmV0dXJuIH5jcmM7IC8qIHRyYW5zbWl0IGNvbXBsZW1lbnQsIHBlciBDUkMtMzIgc3BlYyAqLwotfQotCi0vKiBOZWVkIHRvIGNvbnNpZGVyIHRoZSBmcmFnbWVudCAgc2l0dWF0aW9uICovCi12b2lkIHJ0d193ZXBfZW5jcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewotCS8qICBleGNsdWRlIElDViAqLwotCV9fbGUzMiBjcmM7Ci0Jc3RydWN0IGFyYzRjb250ZXh0IG15Y29udGV4dDsKLQlpbnQgY3VyZnJhZ251bSwgbGVuZ3RoLCBpbmRleDsKLQl1MzIga2V5bGVuZ3RoOwotCXU4ICpwZnJhbWUsICpwYXlsb2FkLCAqaXY7IC8qIHdlcGtleSAqLwotCXU4IHdlcGtleVsxNl07Ci0JdTggaHdfaGRyX29mZnNldCA9IDA7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCWlmICghcHhtaXRmcmFtZS0+YnVmX2FkZHIpCi0JCXJldHVybjsKLQotCWh3X2hkcl9vZmZzZXQgPSBUWERFU0NfT0ZGU0VUOwotCi0JcGZyYW1lID0gcHhtaXRmcmFtZS0+YnVmX2FkZHIgKyBod19oZHJfb2Zmc2V0OwotCi0JLyogc3RhcnQgdG8gZW5jcnlwdCBlYWNoIGZyYWdtZW50ICovCi0JaWYgKHBhdHRyaWItPmVuY3J5cHQgIT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgJiYKLQkgICAgcGF0dHJpYi0+ZW5jcnlwdCAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpCi0JCXJldHVybjsKLQotCWluZGV4ID0gcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXg7Ci0Ja2V5bGVuZ3RoID0gcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtpbmRleF0ua2V5bGVuOwotCi0JZm9yIChjdXJmcmFnbnVtID0gMDsgY3VyZnJhZ251bSA8IHBhdHRyaWItPm5yX2ZyYWdzIDsgY3VyZnJhZ251bSsrKSB7Ci0JCWl2ID0gcGZyYW1lICsgcGF0dHJpYi0+aGRybGVuOwotCQltZW1jcHkoJndlcGtleVswXSwgaXYsIDMpOwotCQltZW1jcHkoJndlcGtleVszXSwgJnBzZWN1cml0eXByaXYtPndlcF9rZXlbaW5kZXhdLmtleSwKLQkJICAgICAgIGtleWxlbmd0aCk7Ci0JCXBheWxvYWQgPSBwZnJhbWUgKyBwYXR0cmliLT5pdl9sZW4gKyBwYXR0cmliLT5oZHJsZW47Ci0KLQkJaWYgKChjdXJmcmFnbnVtICsgMSkgPT0gcGF0dHJpYi0+bnJfZnJhZ3MpIHsKLQkJCS8qIHRoZSBsYXN0IGZyYWdtZW50ICovCi0JCQlsZW5ndGggPSBwYXR0cmliLT5sYXN0X3R4Y21kc3ogLSBwYXR0cmliLT5oZHJsZW4gLQotCQkJCXBhdHRyaWItPml2X2xlbiAtIHBhdHRyaWItPmljdl9sZW47Ci0KLQkJCWNyYyA9IGNwdV90b19sZTMyKGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCkpOwotCi0JCQlhcmNmb3VyX2luaXQoJm15Y29udGV4dCwgd2Vwa2V5LCAzICsga2V5bGVuZ3RoKTsKLQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOwotCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQgKyBsZW5ndGgsCi0JCQkJCShjaGFyICopJmNyYywgNCk7Ci0JCX0gZWxzZSB7Ci0JCQlsZW5ndGggPSBweG1pdHByaXYtPmZyYWdfbGVuIC0gcGF0dHJpYi0+aGRybGVuIC0KLQkJCQlwYXR0cmliLT5pdl9sZW4gLSBwYXR0cmliLT5pY3ZfbGVuOwotCQkJY3JjID0gY3B1X3RvX2xlMzIoZ2V0Y3JjMzIocGF5bG9hZCwgbGVuZ3RoKSk7Ci0JCQlhcmNmb3VyX2luaXQoJm15Y29udGV4dCwgd2Vwa2V5LCAzICsga2V5bGVuZ3RoKTsKLQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOwotCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQgKyBsZW5ndGgsCi0JCQkJCShjaGFyICopJmNyYywgNCk7Ci0KLQkJCXBmcmFtZSArPSBweG1pdHByaXYtPmZyYWdfbGVuOwotCQkJcGZyYW1lID0gUFRSX0FMSUdOKHBmcmFtZSwgNCk7Ci0JCX0KLQl9Ci0KLX0KLQotdm9pZCBydHdfd2VwX2RlY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKLXsKLQkvKiAgZXhjbHVkZSBJQ1YgKi8KLQl1MzIgYWN0dWFsX2NyYywgZXhwZWN0ZWRfY3JjOwotCXN0cnVjdCBhcmM0Y29udGV4dCBteWNvbnRleHQ7Ci0JaW50IGxlbmd0aDsKLQl1MzIga2V5bGVuZ3RoOwotCXU4ICpwZnJhbWUsICpwYXlsb2FkLCAqaXYsIHdlcGtleVsxNl07Ci0JdTgga2V5aW5kZXg7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZmcmFtZS0+cGt0OwotCi0JcGZyYW1lID0gc2tiLT5kYXRhOwotCi0JLyogc3RhcnQgdG8gZGVjcnlwdCByZWN2ZnJhbWUgKi8KLQlpZiAocHJ4YXR0cmliLT5lbmNyeXB0ICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwICYmCi0JICAgIHByeGF0dHJpYi0+ZW5jcnlwdCAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpCi0JCXJldHVybjsKLQotCWl2ID0gcGZyYW1lICsgcHJ4YXR0cmliLT5oZHJsZW47Ci0JLyoga2V5aW5kZXggPSAoaXZbM10mMHgzKTsgKi8KLQlrZXlpbmRleCA9IHByeGF0dHJpYi0+a2V5X2luZGV4OwotCWtleWxlbmd0aCA9IHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aW5kZXhdLmtleWxlbjsKLQltZW1jcHkoJndlcGtleVswXSwgaXYsIDMpOwotCS8qIG1lbWNweSgmd2Vwa2V5WzNdLCAmcHNlY3VyaXR5cHJpdi0+ZG90MTFEZWZLZXlbcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXhdLnNrZXlbMF0sIGtleWxlbmd0aCk7ICovCi0JbWVtY3B5KCZ3ZXBrZXlbM10sICZwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWluZGV4XS5rZXksIGtleWxlbmd0aCk7Ci0JbGVuZ3RoID0gc2tiLT5sZW4gLSBwcnhhdHRyaWItPmhkcmxlbiAtIHByeGF0dHJpYi0+aXZfbGVuOwotCi0JcGF5bG9hZCA9IHBmcmFtZSArIHByeGF0dHJpYi0+aXZfbGVuICsgcHJ4YXR0cmliLT5oZHJsZW47Ci0KLQkvKiBkZWNyeXB0IHBheWxvYWQgaW5jbHVkZSBpY3YgKi8KLQlhcmNmb3VyX2luaXQoJm15Y29udGV4dCwgd2Vwa2V5LCAzICsga2V5bGVuZ3RoKTsKLQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCwgcGF5bG9hZCwgbGVuZ3RoKTsKLQotCS8qIGNhbGN1bGF0ZSBpY3YgYW5kIGNvbXBhcmUgdGhlIGljdiAqLwotCWFjdHVhbF9jcmMgPSBnZXRjcmMzMihwYXlsb2FkLCBsZW5ndGggLSA0KTsKLQlleHBlY3RlZF9jcmMgPSBnZXRfdW5hbGlnbmVkX2xlMzIoJnBheWxvYWRbbGVuZ3RoIC0gNF0pOwotCi0JaWYgKGFjdHVhbF9jcmMgIT0gZXhwZWN0ZWRfY3JjKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkJICIlczppY3YgQ1JDIG1pc21hdGNoOiAiCi0JCQkgImFjdHVhbDogJTA4eCwgZXhwZWN0ZWQ6ICUwOHhcbiIsCi0JCQkgX19mdW5jX18sIGFjdHVhbF9jcmMsIGV4cGVjdGVkX2NyYyk7Ci0JfQotfQotCi0vKiAzCQk9PT09PSBUS0lQIHJlbGF0ZWQgPT09PT0gKi8KLQotc3RhdGljIHUzMiBzZWNtaWNnZXR1aW50MzIodTggKnApCi0vKiAgQ29udmVydCBmcm9tIEJ5dGVbXSB0byB1MzIgaW4gYSBwb3J0YWJsZSB3YXkgKi8KLXsKLQlzMzIgaTsKLQl1MzIgcmVzID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCXJlcyB8PSAoKHUzMikoKnArKykpIDw8ICg4ICogaSk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgdm9pZCBzZWNtaWNwdXR1aW50MzIodTggKnAsIHUzMiB2YWwpCi0vKiAgQ29udmVydCBmcm9tIGxvbmcgdG8gQnl0ZVtdIGluIGEgcG9ydGFibGUgd2F5ICovCi17Ci0JbG9uZyBpOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQkqcCsrID0gKHU4KSAodmFsICYgMHhmZik7Ci0JCXZhbCA+Pj0gODsKLQl9Ci0KLX0KLQotc3RhdGljIHZvaWQgc2VjbWljY2xlYXIoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSkKLXsKLS8qICBSZXNldCB0aGUgc3RhdGUgdG8gdGhlIGVtcHR5IG1lc3NhZ2UuICovCi0KLQlwbWljZGF0YS0+TCA9IHBtaWNkYXRhLT5LMDsKLQlwbWljZGF0YS0+UiA9IHBtaWNkYXRhLT5LMTsKLQlwbWljZGF0YS0+bkJ5dGVzSW5NID0gMDsKLQlwbWljZGF0YS0+TSA9IDA7Ci0KLX0KLQotdm9pZCBydHdfc2VjbWljc2V0a2V5MjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4ICprZXkpCi17Ci0JLyogIFNldCB0aGUga2V5ICovCi0KLQlwbWljZGF0YS0+SzAgPSBzZWNtaWNnZXR1aW50MzIoa2V5KTsKLQlwbWljZGF0YS0+SzEgPSBzZWNtaWNnZXR1aW50MzIoa2V5ICsgNCk7Ci0JLyogIGFuZCByZXNldCB0aGUgbWVzc2FnZSAqLwotCXNlY21pY2NsZWFyKHBtaWNkYXRhKTsKLQotfQotCi12b2lkIHJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4IGIpCi17Ci0KLQkvKiAgQXBwZW5kIHRoZSBieXRlIHRvIG91ciB3b3JkLXNpemVkIGJ1ZmZlciAqLwotCXBtaWNkYXRhLT5NIHw9ICgodW5zaWduZWQgbG9uZyliKSA8PCAoOCAqIHBtaWNkYXRhLT5uQnl0ZXNJbk0pOwotCXBtaWNkYXRhLT5uQnl0ZXNJbk0rKzsKLQkvKiAgUHJvY2VzcyB0aGUgd29yZCBpZiBpdCBpcyBmdWxsLiAqLwotCWlmIChwbWljZGF0YS0+bkJ5dGVzSW5NID49IDQpIHsKLQkJcG1pY2RhdGEtPkwgXj0gcG1pY2RhdGEtPk07Ci0JCXBtaWNkYXRhLT5SIF49IFJPTDMyKHBtaWNkYXRhLT5MLCAxNyk7Ci0JCXBtaWNkYXRhLT5MICs9IHBtaWNkYXRhLT5SOwotCQlwbWljZGF0YS0+UiBePSAoKHBtaWNkYXRhLT5MICYgMHhmZjAwZmYwMCkgPj4gOCkgfCAoKHBtaWNkYXRhLT5MICYgMHgwMGZmMDBmZikgPDwgOCk7Ci0JCXBtaWNkYXRhLT5MICs9IHBtaWNkYXRhLT5SOwotCQlwbWljZGF0YS0+UiBePSBST0wzMihwbWljZGF0YS0+TCwgMyk7Ci0JCXBtaWNkYXRhLT5MICs9IHBtaWNkYXRhLT5SOwotCQlwbWljZGF0YS0+UiBePSBST1IzMihwbWljZGF0YS0+TCwgMik7Ci0JCXBtaWNkYXRhLT5MICs9IHBtaWNkYXRhLT5SOwotCQkvKiAgQ2xlYXIgdGhlIGJ1ZmZlciAqLwotCQlwbWljZGF0YS0+TSA9IDA7Ci0JCXBtaWNkYXRhLT5uQnl0ZXNJbk0gPSAwOwotCX0KLQotfQotCi12b2lkIHJ0d19zZWNtaWNhcHBlbmQyM2Eoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSwgdTggKnNyYywgdTMyIG5ieXRlcykKLXsKLQotCS8qICBUaGlzIGlzIHNpbXBsZSAqLwotCXdoaWxlIChuYnl0ZXMgPiAwKSB7Ci0JCXJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHBtaWNkYXRhLCAqc3JjKyspOwotCQluYnl0ZXMtLTsKLQl9Ci0KLX0KLQotdm9pZCBydHdfc2VjZ2V0bWljMjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4ICpkc3QpCi17Ci0KLQkvKiAgQXBwZW5kIHRoZSBtaW5pbXVtIHBhZGRpbmcgKi8KLQlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgMHg1YSk7Ci0JcnR3X3NlY21pY2FwcGVuZDIzYWJ5dGUyM2EocG1pY2RhdGEsIDApOwotCXJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHBtaWNkYXRhLCAwKTsKLQlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgMCk7Ci0JcnR3X3NlY21pY2FwcGVuZDIzYWJ5dGUyM2EocG1pY2RhdGEsIDApOwotCS8qICBhbmQgdGhlbiB6ZXJvZXMgdW50aWwgdGhlIGxlbmd0aCBpcyBhIG11bHRpcGxlIG9mIDQgKi8KLQl3aGlsZSAocG1pY2RhdGEtPm5CeXRlc0luTSAhPSAwKQotCQlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgMCk7Ci0JLyogIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuICovCi0Jc2VjbWljcHV0dWludDMyKGRzdCwgcG1pY2RhdGEtPkwpOwotCXNlY21pY3B1dHVpbnQzMihkc3QgKyA0LCBwbWljZGF0YS0+Uik7Ci0JLyogIFJlc2V0IHRvIHRoZSBlbXB0eSBtZXNzYWdlLiAqLwotCXNlY21pY2NsZWFyKHBtaWNkYXRhKTsKLQotfQotCi12b2lkIHJ0d19zZWNjYWxjdGtpcG1pYzIzYSh1OCAqa2V5LCB1OCAqaGVhZGVyLCB1OCAqZGF0YSwgdTMyIGRhdGFfbGVuLAotCQkJICAgdTggKm1pY19jb2RlLCB1OCBwcmkpCi17Ci0KLQlzdHJ1Y3QgbWljX2RhdGEgbWljZGF0YTsKLQl1OCBwcmlvcml0eVs0XSA9IHsweDAsIDB4MCwgMHgwLCAweDB9OwotCi0JcnR3X3NlY21pY3NldGtleTIzYSgmbWljZGF0YSwga2V5KTsKLQlwcmlvcml0eVswXSA9IHByaTsKLQotCS8qIE1pY2hhZWwgTUlDIHBzZXVkbyBoZWFkZXI6IERBLCBTQSwgMyB4IDAsIFByaW9yaXR5ICovCi0JaWYgKGhlYWRlclsxXSYxKSB7IC8qIFRvRFMgPT0gMSAqLwotCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsxNl0sIDYpOyAvKiBEQSAqLwotCQlpZiAoaGVhZGVyWzFdJjIpIC8qIEZyb20gRHMgPT0gMSAqLwotCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsyNF0sIDYpOwotCQllbHNlCi0JCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzEwXSwgNik7Ci0JfSBlbHNlIHsgLyogVG9EUyA9PSAwICovCi0JCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsICZoZWFkZXJbNF0sIDYpOyAvKiBEQSAqLwotCQlpZiAoaGVhZGVyWzFdJjIpIC8qIEZyb20gRHMgPT0gMSAqLwotCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsxNl0sIDYpOwotCQllbHNlCi0JCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzEwXSwgNik7Ci0KLQl9Ci0JcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJnByaW9yaXR5WzBdLCA0KTsKLQotCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsIGRhdGEsIGRhdGFfbGVuKTsKLQotCXJ0d19zZWNnZXRtaWMyM2EoJm1pY2RhdGEsIG1pY19jb2RlKTsKLQotfQotCi0vKiBtYWNyb3MgZm9yIGV4dHJhY3Rpb24vY3JlYXRpb24gb2YgdW5zaWduZWQgY2hhci91bnNpZ25lZCBzaG9ydCB2YWx1ZXMgICovCi0jZGVmaW5lIFJvdFIxKHYxNikgICAoKCgodjE2KSA+PiAxKSAmIDB4N0ZGRikgXiAoKCh2MTYpICYgMSkgPDwgMTUpKQotI2RlZmluZSAgIExvOCh2MTYpICAgKCh1OCkoKHYxNikgICAgICAgJiAweDAwRkYpKQotI2RlZmluZSAgIEhpOCh2MTYpICAgKCh1OCkoKCh2MTYpID4+IDgpICYgMHgwMEZGKSkKLSNkZWZpbmUgIExvMTYodjMyKSAgICgodTE2KSgodjMyKSAgICAgICAmIDB4RkZGRikpCi0jZGVmaW5lICBIaTE2KHYzMikgICAoKHUxNikoKCh2MzIpID4+IDE2KSAmIDB4RkZGRikpCi0jZGVmaW5lICBNazE2KGhpLCBsbykgKChsbykgXiAoKCh1MTYpKGhpKSkgPDwgOCkpCi0KLS8qIHNlbGVjdCB0aGUgTnRoIDE2LWJpdCB3b3JkIG9mIHRoZSB0ZW1wb3JhbCBrZXkgdW5zaWduZWQgY2hhciBhcnJheSBUS1tdICovCi0jZGVmaW5lICBUSzE2KE4pICAgICBNazE2KHRrWzIgKiAoTikgKyAxXSwgdGtbMiAqIChOKV0pCi0KLS8qIFMtYm94IGxvb2t1cDogMTYgYml0cyAtLT4gMTYgYml0cyAqLwotI2RlZmluZSBfU18odjE2KSAgICAgKFNib3gxWzBdW0xvOCh2MTYpXSBeIFNib3gxWzFdW0hpOCh2MTYpXSkKLQotLyogZml4ZWQgYWxnb3JpdGhtICJwYXJhbWV0ZXJzIiAqLwotI2RlZmluZSBQSEFTRTFfTE9PUF9DTlQgICA4ICAgIC8qIHRoaXMgbmVlZHMgdG8gYmUgImJpZyBlbm91Z2giICAgICAqLwotI2RlZmluZSBUQV9TSVpFICAgICAgICAgICA2ICAgIC8qICA0OC1iaXQgdHJhbnNtaXR0ZXIgYWRkcmVzcyAgICAgICAqLwotI2RlZmluZSBUS19TSVpFICAgICAgICAgIDE2ICAgIC8qIDEyOC1iaXQgdGVtcG9yYWwga2V5ICAgICAgICAgICAgICAqLwotI2RlZmluZSBQMUtfU0laRSAgICAgICAgIDEwICAgIC8qICA4MC1iaXQgUGhhc2UxIGtleSAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBSQzRfS0VZX1NJWkUgICAgIDE2ICAgIC8qIDEyOC1iaXQgUkM0S0VZICgxMDQgYml0cyB1bmtub3duKSAqLwotCi0vKiAyLXVuc2lnbmVkIGNoYXIgYnkgMi11bnNpZ25lZCBjaGFyIHN1YnNldCBvZiB0aGUgZnVsbCBBRVMgUy1ib3ggdGFibGUgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTYm94MVsyXVsyNTZdID0gewotCS8qIFNib3ggZm9yIGhhc2ggKGNhbiBiZSBpbiBST00pICovCi0JewotCQkweEM2QTUsIDB4Rjg4NCwgMHhFRTk5LCAweEY2OEQsIDB4RkYwRCwgMHhENkJELCAweERFQjEsIDB4OTE1NCwKLQkJMHg2MDUwLCAweDAyMDMsIDB4Q0VBOSwgMHg1NjdELCAweEU3MTksIDB4QjU2MiwgMHg0REU2LCAweEVDOUEsCi0JCTB4OEY0NSwgMHgxRjlELCAweDg5NDAsIDB4RkE4NywgMHhFRjE1LCAweEIyRUIsIDB4OEVDOSwgMHhGQjBCLAotCQkweDQxRUMsIDB4QjM2NywgMHg1RkZELCAweDQ1RUEsIDB4MjNCRiwgMHg1M0Y3LCAweEU0OTYsIDB4OUI1QiwKLQkJMHg3NUMyLCAweEUxMUMsIDB4M0RBRSwgMHg0QzZBLCAweDZDNUEsIDB4N0U0MSwgMHhGNTAyLCAweDgzNEYsCi0JCTB4Njg1QywgMHg1MUY0LCAweEQxMzQsIDB4RjkwOCwgMHhFMjkzLCAweEFCNzMsIDB4NjI1MywgMHgyQTNGLAotCQkweDA4MEMsIDB4OTU1MiwgMHg0NjY1LCAweDlENUUsIDB4MzAyOCwgMHgzN0ExLCAweDBBMEYsIDB4MkZCNSwKLQkJMHgwRTA5LCAweDI0MzYsIDB4MUI5QiwgMHhERjNELCAweENEMjYsIDB4NEU2OSwgMHg3RkNELCAweEVBOUYsCi0JCTB4MTIxQiwgMHgxRDlFLCAweDU4NzQsIDB4MzQyRSwgMHgzNjJELCAweERDQjIsIDB4QjRFRSwgMHg1QkZCLAotCQkweEE0RjYsIDB4NzY0RCwgMHhCNzYxLCAweDdEQ0UsIDB4NTI3QiwgMHhERDNFLCAweDVFNzEsIDB4MTM5NywKLQkJMHhBNkY1LCAweEI5NjgsIDB4MDAwMCwgMHhDMTJDLCAweDQwNjAsIDB4RTMxRiwgMHg3OUM4LCAweEI2RUQsCi0JCTB4RDRCRSwgMHg4RDQ2LCAweDY3RDksIDB4NzI0QiwgMHg5NERFLCAweDk4RDQsIDB4QjBFOCwgMHg4NTRBLAotCQkweEJCNkIsIDB4QzUyQSwgMHg0RkU1LCAweEVEMTYsIDB4ODZDNSwgMHg5QUQ3LCAweDY2NTUsIDB4MTE5NCwKLQkJMHg4QUNGLCAweEU5MTAsIDB4MDQwNiwgMHhGRTgxLCAweEEwRjAsIDB4Nzg0NCwgMHgyNUJBLCAweDRCRTMsCi0JCTB4QTJGMywgMHg1REZFLCAweDgwQzAsIDB4MDU4QSwgMHgzRkFELCAweDIxQkMsIDB4NzA0OCwgMHhGMTA0LAotCQkweDYzREYsIDB4NzdDMSwgMHhBRjc1LCAweDQyNjMsIDB4MjAzMCwgMHhFNTFBLCAweEZEMEUsIDB4QkY2RCwKLQkJMHg4MTRDLCAweDE4MTQsIDB4MjYzNSwgMHhDMzJGLCAweEJFRTEsIDB4MzVBMiwgMHg4OENDLCAweDJFMzksCi0JCTB4OTM1NywgMHg1NUYyLCAweEZDODIsIDB4N0E0NywgMHhDOEFDLCAweEJBRTcsIDB4MzIyQiwgMHhFNjk1LAotCQkweEMwQTAsIDB4MTk5OCwgMHg5RUQxLCAweEEzN0YsIDB4NDQ2NiwgMHg1NDdFLCAweDNCQUIsIDB4MEI4MywKLQkJMHg4Q0NBLCAweEM3MjksIDB4NkJEMywgMHgyODNDLCAweEE3NzksIDB4QkNFMiwgMHgxNjFELCAweEFENzYsCi0JCTB4REIzQiwgMHg2NDU2LCAweDc0NEUsIDB4MTQxRSwgMHg5MkRCLCAweDBDMEEsIDB4NDg2QywgMHhCOEU0LAotCQkweDlGNUQsIDB4QkQ2RSwgMHg0M0VGLCAweEM0QTYsIDB4MzlBOCwgMHgzMUE0LCAweEQzMzcsIDB4RjI4QiwKLQkJMHhENTMyLCAweDhCNDMsIDB4NkU1OSwgMHhEQUI3LCAweDAxOEMsIDB4QjE2NCwgMHg5Q0QyLCAweDQ5RTAsCi0JCTB4RDhCNCwgMHhBQ0ZBLCAweEYzMDcsIDB4Q0YyNSwgMHhDQUFGLCAweEY0OEUsIDB4NDdFOSwgMHgxMDE4LAotCQkweDZGRDUsIDB4RjA4OCwgMHg0QTZGLCAweDVDNzIsIDB4MzgyNCwgMHg1N0YxLCAweDczQzcsIDB4OTc1MSwKLQkJMHhDQjIzLCAweEExN0MsIDB4RTg5QywgMHgzRTIxLCAweDk2REQsIDB4NjFEQywgMHgwRDg2LCAweDBGODUsCi0JCTB4RTA5MCwgMHg3QzQyLCAweDcxQzQsIDB4Q0NBQSwgMHg5MEQ4LCAweDA2MDUsIDB4RjcwMSwgMHgxQzEyLAotCQkweEMyQTMsIDB4NkE1RiwgMHhBRUY5LCAweDY5RDAsIDB4MTc5MSwgMHg5OTU4LCAweDNBMjcsIDB4MjdCOSwKLQkJMHhEOTM4LCAweEVCMTMsIDB4MkJCMywgMHgyMjMzLCAweEQyQkIsIDB4QTk3MCwgMHgwNzg5LCAweDMzQTcsCi0JCTB4MkRCNiwgMHgzQzIyLCAweDE1OTIsIDB4QzkyMCwgMHg4NzQ5LCAweEFBRkYsIDB4NTA3OCwgMHhBNTdBLAotCQkweDAzOEYsIDB4NTlGOCwgMHgwOTgwLCAweDFBMTcsIDB4NjVEQSwgMHhENzMxLCAweDg0QzYsIDB4RDBCOCwKLQkJMHg4MkMzLCAweDI5QjAsIDB4NUE3NywgMHgxRTExLCAweDdCQ0IsIDB4QThGQywgMHg2REQ2LCAweDJDM0EsCi0JfSwKLQl7IC8qIHNlY29uZCBoYWxmIG9mIHRhYmxlIGlzIHVuc2lnbmVkIGNoYXItcmV2ZXJzZWQgdmVyc2lvbiBvZiBmaXJzdCEgKi8KLQkJMHhBNUM2LCAweDg0RjgsIDB4OTlFRSwgMHg4REY2LCAweDBERkYsIDB4QkRENiwgMHhCMURFLCAweDU0OTEsCi0JCTB4NTA2MCwgMHgwMzAyLCAweEE5Q0UsIDB4N0Q1NiwgMHgxOUU3LCAweDYyQjUsIDB4RTY0RCwgMHg5QUVDLAotCQkweDQ1OEYsIDB4OUQxRiwgMHg0MDg5LCAweDg3RkEsIDB4MTVFRiwgMHhFQkIyLCAweEM5OEUsIDB4MEJGQiwKLQkJMHhFQzQxLCAweDY3QjMsIDB4RkQ1RiwgMHhFQTQ1LCAweEJGMjMsIDB4Rjc1MywgMHg5NkU0LCAweDVCOUIsCi0JCTB4QzI3NSwgMHgxQ0UxLCAweEFFM0QsIDB4NkE0QywgMHg1QTZDLCAweDQxN0UsIDB4MDJGNSwgMHg0RjgzLAotCQkweDVDNjgsIDB4RjQ1MSwgMHgzNEQxLCAweDA4RjksIDB4OTNFMiwgMHg3M0FCLCAweDUzNjIsIDB4M0YyQSwKLQkJMHgwQzA4LCAweDUyOTUsIDB4NjU0NiwgMHg1RTlELCAweDI4MzAsIDB4QTEzNywgMHgwRjBBLCAweEI1MkYsCi0JCTB4MDkwRSwgMHgzNjI0LCAweDlCMUIsIDB4M0RERiwgMHgyNkNELCAweDY5NEUsIDB4Q0Q3RiwgMHg5RkVBLAotCQkweDFCMTIsIDB4OUUxRCwgMHg3NDU4LCAweDJFMzQsIDB4MkQzNiwgMHhCMkRDLCAweEVFQjQsIDB4RkI1QiwKLQkJMHhGNkE0LCAweDRENzYsIDB4NjFCNywgMHhDRTdELCAweDdCNTIsIDB4M0VERCwgMHg3MTVFLCAweDk3MTMsCi0JCTB4RjVBNiwgMHg2OEI5LCAweDAwMDAsIDB4MkNDMSwgMHg2MDQwLCAweDFGRTMsIDB4Qzg3OSwgMHhFREI2LAotCQkweEJFRDQsIDB4NDY4RCwgMHhEOTY3LCAweDRCNzIsIDB4REU5NCwgMHhENDk4LCAweEU4QjAsIDB4NEE4NSwKLQkJMHg2QkJCLCAweDJBQzUsIDB4RTU0RiwgMHgxNkVELCAweEM1ODYsIDB4RDc5QSwgMHg1NTY2LCAweDk0MTEsCi0JCTB4Q0Y4QSwgMHgxMEU5LCAweDA2MDQsIDB4ODFGRSwgMHhGMEEwLCAweDQ0NzgsIDB4QkEyNSwgMHhFMzRCLAotCQkweEYzQTIsIDB4RkU1RCwgMHhDMDgwLCAweDhBMDUsIDB4QUQzRiwgMHhCQzIxLCAweDQ4NzAsIDB4MDRGMSwKLQkJMHhERjYzLCAweEMxNzcsIDB4NzVBRiwgMHg2MzQyLCAweDMwMjAsIDB4MUFFNSwgMHgwRUZELCAweDZEQkYsCi0JCTB4NEM4MSwgMHgxNDE4LCAweDM1MjYsIDB4MkZDMywgMHhFMUJFLCAweEEyMzUsIDB4Q0M4OCwgMHgzOTJFLAotCQkweDU3OTMsIDB4RjI1NSwgMHg4MkZDLCAweDQ3N0EsIDB4QUNDOCwgMHhFN0JBLCAweDJCMzIsIDB4OTVFNiwKLQkJMHhBMEMwLCAweDk4MTksIDB4RDE5RSwgMHg3RkEzLCAweDY2NDQsIDB4N0U1NCwgMHhBQjNCLCAweDgzMEIsCi0JCTB4Q0E4QywgMHgyOUM3LCAweEQzNkIsIDB4M0MyOCwgMHg3OUE3LCAweEUyQkMsIDB4MUQxNiwgMHg3NkFELAotCQkweDNCREIsIDB4NTY2NCwgMHg0RTc0LCAweDFFMTQsIDB4REI5MiwgMHgwQTBDLCAweDZDNDgsIDB4RTRCOCwKLQkJMHg1RDlGLCAweDZFQkQsIDB4RUY0MywgMHhBNkM0LCAweEE4MzksIDB4QTQzMSwgMHgzN0QzLCAweDhCRjIsCi0JCTB4MzJENSwgMHg0MzhCLCAweDU5NkUsIDB4QjdEQSwgMHg4QzAxLCAweDY0QjEsIDB4RDI5QywgMHhFMDQ5LAotCQkweEI0RDgsIDB4RkFBQywgMHgwN0YzLCAweDI1Q0YsIDB4QUZDQSwgMHg4RUY0LCAweEU5NDcsIDB4MTgxMCwKLQkJMHhENTZGLCAweDg4RjAsIDB4NkY0QSwgMHg3MjVDLCAweDI0MzgsIDB4RjE1NywgMHhDNzczLCAweDUxOTcsCi0JCTB4MjNDQiwgMHg3Q0ExLCAweDlDRTgsIDB4MjEzRSwgMHhERDk2LCAweERDNjEsIDB4ODYwRCwgMHg4NTBGLAotCQkweDkwRTAsIDB4NDI3QywgMHhDNDcxLCAweEFBQ0MsIDB4RDg5MCwgMHgwNTA2LCAweDAxRjcsIDB4MTIxQywKLQkJMHhBM0MyLCAweDVGNkEsIDB4RjlBRSwgMHhEMDY5LCAweDkxMTcsIDB4NTg5OSwgMHgyNzNBLCAweEI5MjcsCi0JCTB4MzhEOSwgMHgxM0VCLCAweEIzMkIsIDB4MzMyMiwgMHhCQkQyLCAweDcwQTksIDB4ODkwNywgMHhBNzMzLAotCQkweEI2MkQsIDB4MjIzQywgMHg5MjE1LCAweDIwQzksIDB4NDk4NywgMHhGRkFBLCAweDc4NTAsIDB4N0FBNSwKLQkJMHg4RjAzLCAweEY4NTksIDB4ODAwOSwgMHgxNzFBLCAweERBNjUsIDB4MzFENywgMHhDNjg0LCAweEI4RDAsCi0JCTB4QzM4MiwgMHhCMDI5LCAweDc3NUEsIDB4MTExRSwgMHhDQjdCLCAweEZDQTgsIDB4RDY2RCwgMHgzQTJDLAotCX0KLX07Ci0KLSAvKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBSb3V0aW5lOiBQaGFzZSAxIC0tIGdlbmVyYXRlIFAxSywgZ2l2ZW4gVEEsIFRLLCBJVjMyCi0qCi0qIElucHV0czoKLSogICAgIHRrW10gICAgICA9IHRlbXBvcmFsIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBbMTI4IGJpdHNdCi0qICAgICB0YVtdICAgICAgPSB0cmFuc21pdHRlcidzIE1BQyBhZGRyZXNzICAgICAgICAgICAgWyA0OCBiaXRzXQotKiAgICAgaXYzMiAgICAgID0gdXBwZXIgMzIgYml0cyBvZiBJViAgICAgICAgICAgICAgICAgIFsgMzIgYml0c10KLSogT3V0cHV0OgotKiAgICAgcDFrW10gICAgID0gUGhhc2UgMSBrZXkgICAgICAgICAgICAgICAgICAgICAgICAgIFsgODAgYml0c10KLSoKLSogTm90ZToKLSogICAgIFRoaXMgZnVuY3Rpb24gb25seSBuZWVkcyB0byBiZSBjYWxsZWQgZXZlcnkgMioqMTYgcGFja2V0cywKLSogICAgIGFsdGhvdWdoIGluIHRoZW9yeSBpdCBjb3VsZCBiZSBjYWxsZWQgZXZlcnkgcGFja2V0LgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKi8KLXN0YXRpYyB2b2lkIHBoYXNlMSh1MTYgKnAxaywgY29uc3QgdTggKnRrLCBjb25zdCB1OCAqdGEsIHUzMiBpdjMyKQotewotCWludCAgaTsKLQotCS8qIEluaXRpYWxpemUgdGhlIDgwIGJpdHMgb2YgUDFLW10gZnJvbSBJVjMyIGFuZCBUQVswLi41XSAqLwotCXAxa1swXSAgICAgID0gTG8xNihpdjMyKTsKLQlwMWtbMV0gICAgICA9IEhpMTYoaXYzMik7Ci0JcDFrWzJdICAgICAgPSBNazE2KHRhWzFdLCB0YVswXSk7IC8qIHVzZSBUQVtdIGFzIGxpdHRsZS1lbmRpYW4gKi8KLQlwMWtbM10gICAgICA9IE1rMTYodGFbM10sIHRhWzJdKTsKLQlwMWtbNF0gICAgICA9IE1rMTYodGFbNV0sIHRhWzRdKTsKLQotCS8qIE5vdyBjb21wdXRlIGFuIHVuYmFsYW5jZWQgRmVpc3RlbCBjaXBoZXIgd2l0aCA4MC1iaXQgYmxvY2sgKi8KLQkvKiBzaXplIG9uIHRoZSA4MC1iaXQgYmxvY2sgUDFLW10sIHVzaW5nIHRoZSAxMjgtYml0IGtleSBUS1tdICovCi0JZm9yIChpID0gMDsgaSA8IFBIQVNFMV9MT09QX0NOVDsgaSsrKSB7Ci0JCS8qIEVhY2ggYWRkIG9wZXJhdGlvbiBoZXJlIGlzIG1vZCAyKioxNiAqLwotCQlwMWtbMF0gKz0gX1NfKHAxa1s0XSBeIFRLMTYoKGkgJiAxKSArIDApKTsKLQkJcDFrWzFdICs9IF9TXyhwMWtbMF0gXiBUSzE2KChpICYgMSkgKyAyKSk7Ci0JCXAxa1syXSArPSBfU18ocDFrWzFdIF4gVEsxNigoaSAmIDEpICsgNCkpOwotCQlwMWtbM10gKz0gX1NfKHAxa1syXSBeIFRLMTYoKGkgJiAxKSArIDYpKTsKLQkJcDFrWzRdICs9IF9TXyhwMWtbM10gXiBUSzE2KChpICYgMSkgKyAwKSk7Ci0JCXAxa1s0XSArPSAgKHVuc2lnbmVkIHNob3J0KSBpOyAvKiBhdm9pZCAic2xpZGUgYXR0YWNrcyIgKi8KLQkJfQotCi19Ci0KLS8qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIFJvdXRpbmU6IFBoYXNlIDIgLS0gZ2VuZXJhdGUgUkM0S0VZLCBnaXZlbiBUSywgUDFLLCBJVjE2Ci0qCi0qIElucHV0czoKLSogICAgIHRrW10gICAgICA9IFRlbXBvcmFsIGtleSAgICAgICAgICAgICAgICAgICAgICAgICBbMTI4IGJpdHNdCi0qICAgICBwMWtbXSAgICAgPSBQaGFzZSAxIG91dHB1dCBrZXkgICAgICAgICAgICAgICAgICAgWyA4MCBiaXRzXQotKiAgICAgaXYxNiAgICAgID0gbG93IDE2IGJpdHMgb2YgSVYgY291bnRlciAgICAgICAgICAgIFsgMTYgYml0c10KLSogT3V0cHV0OgotKiAgICAgcmM0a2V5W10gID0gdGhlIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhlIHBhY2tldCAgIFsxMjggYml0c10KLSoKLSogTm90ZToKLSogICAgIFRoZSB2YWx1ZSB7VEEsIElWMzIsIElWMTZ9IGZvciBQaGFzZTEvUGhhc2UyIG11c3QgYmUgdW5pcXVlCi0qICAgICBhY3Jvc3MgYWxsIHBhY2tldHMgdXNpbmcgdGhlIHNhbWUga2V5IFRLIHZhbHVlLiBUaGVuLCBmb3IgYQotKiAgICAgZ2l2ZW4gdmFsdWUgb2YgVEtbXSwgdGhpcyBUS0lQNDggY29uc3RydWN0aW9uIGd1YXJhbnRlZXMgdGhhdAotKiAgICAgdGhlIGZpbmFsIFJDNEtFWSB2YWx1ZSBpcyB1bmlxdWUgYWNyb3NzIGFsbCBwYWNrZXRzLgotKgotKiBTdWdnZXN0ZWQgaW1wbGVtZW50YXRpb24gb3B0aW1pemF0aW9uOiBpZiBQUEtbXSBpcyAib3ZlcmxhaWQiCi0qICAgICBhcHByb3ByaWF0ZWx5IG9uIFJDNEtFWVtdLCB0aGVyZSBpcyBubyBuZWVkIGZvciB0aGUgZmluYWwKLSogICAgIGZvciBsb29wIGJlbG93IHRoYXQgY29waWVzIHRoZSBQUEtbXSByZXN1bHQgaW50byBSQzRLRVlbXS4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSovCi1zdGF0aWMgdm9pZCBwaGFzZTIodTggKnJjNGtleSwgY29uc3QgdTggKnRrLCBjb25zdCB1MTYgKnAxaywgdTE2IGl2MTYpCi17Ci0JaW50ICBpOwotCXUxNiBQUEtbNl07IC8qIHRlbXBvcmFyeSBrZXkgZm9yIG1peGluZyAgICAqLwotCi0JLyogTm90ZTogYWxsIGFkZHMgaW4gdGhlIFBQS1tdIGVxdWF0aW9ucyBiZWxvdyBhcmUgbW9kIDIqKjE2ICovCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJUFBLW2ldID0gcDFrW2ldOyAvKiBmaXJzdCwgY29weSBQMUsgdG8gUFBLICovCi0KLQlQUEtbNV0gPSBwMWtbNF0gKyBpdjE2OyAvKiBuZXh0LCAgYWRkIGluIElWMTYgKi8KLQotCS8qIEJpamVjdGl2ZSBub24tbGluZWFyIG1peGluZyBvZiB0aGUgOTYgYml0cyBvZiBQUEtbMC4uNV0gKi8KLQlQUEtbMF0gKz0gX1NfKFBQS1s1XSBeIFRLMTYoMCkpOyAvKiBNaXgga2V5IGluIGVhY2ggInJvdW5kIiAqLwotCVBQS1sxXSArPSBfU18oUFBLWzBdIF4gVEsxNigxKSk7Ci0JUFBLWzJdICs9IF9TXyhQUEtbMV0gXiBUSzE2KDIpKTsKLQlQUEtbM10gKz0gX1NfKFBQS1syXSBeIFRLMTYoMykpOwotCVBQS1s0XSArPSBfU18oUFBLWzNdIF4gVEsxNig0KSk7Ci0JUFBLWzVdICs9IF9TXyhQUEtbNF0gXiBUSzE2KDUpKTsgLyogVG90YWwgIyBTLWJveCBsb29rdXBzID09IDYgKi8KLQotCS8qIEZpbmFsIHN3ZWVwOiBiaWplY3RpdmUsICJsaW5lYXIiLiBSb3RhdGVzIGtpbGwgTFNCIGNvcnJlbGF0aW9ucyAqLwotCVBQS1swXSArPSAgUm90UjEoUFBLWzVdIF4gVEsxNig2KSk7Ci0JUFBLWzFdICs9ICBSb3RSMShQUEtbMF0gXiBUSzE2KDcpKTsgLyogVXNlIGFsbCBvZiBUS1tdIGluIFBoYXNlMiAqLwotCVBQS1syXSArPSAgUm90UjEoUFBLWzFdKTsKLQlQUEtbM10gKz0gIFJvdFIxKFBQS1syXSk7Ci0JUFBLWzRdICs9ICBSb3RSMShQUEtbM10pOwotCVBQS1s1XSArPSAgUm90UjEoUFBLWzRdKTsKLQkvKiBOb3RlOiBBdCB0aGlzIHBvaW50LCBmb3IgYSBnaXZlbiBrZXkgVEtbMC4uMTVdLCB0aGUgOTYtYml0IG91dHB1dCAqLwotCS8qICAgICAgIHZhbHVlIFBQS1swLi41XSBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSwgYXMgYSBmdW5jdGlvbiAgICovCi0JLyogICAgICAgb2YgdGhlIDk2LWJpdCAiaW5wdXQiIHZhbHVlICAge1RBLCBJVjMyLCBJVjE2fS4gVGhhdCBpcywgICAgKi8KLQkvKiAgICAgICBQMUsgaXMgbm93IGEga2V5ZWQgcGVybXV0YXRpb24gb2Yge1RBLCBJVjMyLCBJVjE2fS4gICAgICAgICAqLwotCi0JLyogU2V0IFJDNEtFWVswLi4zXSwgd2hpY2ggaW5jbHVkZXMgImNsZWFydGV4dCIgcG9ydGlvbiBvZiBSQzQga2V5ICAgKi8KLQlyYzRrZXlbMF0gPSBIaTgoaXYxNik7ICAgICAgICAgICAgICAgICAvKiBSQzRLRVlbMC4uMl0gaXMgdGhlIFdFUCBJViAqLwotCXJjNGtleVsxXSA9IChIaTgoaXYxNikgfCAweDIwKSAmIDB4N0Y7IC8qIEhlbHAgYXZvaWQgd2VhayAoRk1TKSBrZXlzICovCi0JcmM0a2V5WzJdID0gTG84KGl2MTYpOwotCXJjNGtleVszXSA9IExvOCgoUFBLWzVdIF4gVEsxNigwKSkgPj4gMSk7Ci0KLQkvKiBDb3B5IDk2IGJpdHMgb2YgUFBLWzAuLjVdIHRvIFJDNEtFWVs0Li4xNV0gIChsaXR0bGUtZW5kaWFuKSAqLwotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJcmM0a2V5WzQgKyAyICogaV0gPSBMbzgoUFBLW2ldKTsKLQkJcmM0a2V5WzUgKyAyICogaV0gPSBIaTgoUFBLW2ldKTsKLQl9Ci0KLX0KLQotLyogVGhlIGhsZW4gaXNuJ3QgaW5jbHVkZSB0aGUgSVYgKi8KLWludCBydHdfdGtpcF9lbmNyeXB0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQl1MTYgcG5sOwotCXUzMiBwbmg7Ci0JdTggcmM0a2V5WzE2XTsKLQl1OCB0dGtleVsxNl07Ci0JX19sZTMyIGNyYzsKLQl1OCBod19oZHJfb2Zmc2V0ID0gMDsKLQlzdHJ1Y3QgYXJjNGNvbnRleHQgbXljb250ZXh0OwotCWludCBjdXJmcmFnbnVtLCBsZW5ndGg7Ci0JdTggKnBmcmFtZSwgKnBheWxvYWQsICppdiwgKnByd3NrZXk7Ci0JdW5pb24gcG40OCBkb3QxMXR4cG47Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGFpbmZvOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JaWYgKHBhdHRyaWItPmVuY3J5cHQgIT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkKLQkJcmV0dXJuIF9GQUlMOwotCi0JaWYgKCFweG1pdGZyYW1lLT5idWZfYWRkcikKLQkJcmV0dXJuIF9GQUlMOwotCi0JaHdfaGRyX29mZnNldCA9IFRYREVTQ19PRkZTRVQ7Ci0KLQlwZnJhbWUgPSBweG1pdGZyYW1lLT5idWZfYWRkciArIGh3X2hkcl9vZmZzZXQ7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkKLQkJc3RhaW5mbyA9IHBhdHRyaWItPnBzdGE7Ci0JZWxzZSB7Ci0JCURCR184NzIzQSgiJXMsIGNhbGwgcnR3X2dldF9zdGFpbmZvKClcbiIsIF9fZnVuY19fKTsKLQkJc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsCi0JCQkJCSAgICAgJnBhdHRyaWItPnJhWzBdKTsKLQl9Ci0KLQlpZiAoIXN0YWluZm8pIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOiBzdGFpbmZvID09IE5VTEwhISFcbiIsIF9fZnVuY19fKTsKLQkJREJHXzg3MjNBKCIlcywgcHN0YSA9PSBOVUxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkgIiVzOiBzdGFpbmZvIT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwotCi0JaWYgKCEoc3RhaW5mby0+c3RhdGUgJiBfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhLT5zdGF0ZSgweCV4KSAhPSBfRldfTElOS0VEXG4iLCBfX2Z1bmNfXywgc3RhaW5mby0+c3RhdGUpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKSkKLQkJcHJ3c2tleSA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkXS5za2V5OwotCWVsc2UKLQkJcHJ3c2tleSA9ICZzdGFpbmZvLT5kb3QxMTgwMjF4X1VuY3N0S2V5LnNrZXlbMF07Ci0KLQkvKiA0IHN0YXJ0IHRvIGVuY3J5cHQgZWFjaCBmcmFnbWVudCAqLwotCWZvciAoY3VyZnJhZ251bSA9IDA7IGN1cmZyYWdudW0gPCBwYXR0cmliLT5ucl9mcmFnczsgY3VyZnJhZ251bSsrKSB7Ci0JCWl2ID0gcGZyYW1lICsgcGF0dHJpYi0+aGRybGVuOwotCQlwYXlsb2FkID0gcGZyYW1lICsgcGF0dHJpYi0+aXZfbGVuICsgcGF0dHJpYi0+aGRybGVuOwotCi0JCUdFVF9US0lQX1BOKGl2LCBkb3QxMXR4cG4pOwotCi0JCXBubCA9ICh1MTYpKGRvdDExdHhwbi52YWwpOwotCQlwbmggPSAodTMyKShkb3QxMXR4cG4udmFsPj4xNik7Ci0KLQkJcGhhc2UxKCh1MTYgKikmdHRrZXlbMF0sIHByd3NrZXksICZwYXR0cmliLT50YVswXSwgcG5oKTsKLQotCQlwaGFzZTIoJnJjNGtleVswXSwgcHJ3c2tleSwgKHUxNiAqKSZ0dGtleVswXSwgcG5sKTsKLQotCQlpZiAoKGN1cmZyYWdudW0gKyAxKSA9PSBwYXR0cmliLT5ucl9mcmFncykgeyAvKiA0IHRoZSBsYXN0IGZyYWdtZW50ICovCi0JCQlsZW5ndGggPSAocGF0dHJpYi0+bGFzdF90eGNtZHN6IC0KLQkJCQkgIHBhdHRyaWItPmhkcmxlbiAtCi0JCQkJICBwYXR0cmliLT5pdl9sZW4gLQotCQkJCSAgcGF0dHJpYi0+aWN2X2xlbik7Ci0KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9pbmZvXywKLQkJCQkgInBhdHRyaWItPml2X2xlbiA9JXgsIHBhdHRyaWItPmljdl9sZW4gPSV4XG4iLAotCQkJCSBwYXR0cmliLT5pdl9sZW4sCi0JCQkJIHBhdHRyaWItPmljdl9sZW4pOwotCQkJY3JjID0gY3B1X3RvX2xlMzIoZ2V0Y3JjMzIocGF5bG9hZCwgbGVuZ3RoKSk7Ci0KLQkJCWFyY2ZvdXJfaW5pdCgmbXljb250ZXh0LCByYzRrZXksIDE2KTsKLQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOwotCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQgKyBsZW5ndGgsCi0JCQkJCShjaGFyICopJmNyYywgNCk7Ci0KLQkJfSBlbHNlIHsKLQkJCWxlbmd0aCA9IChweG1pdHByaXYtPmZyYWdfbGVuIC0KLQkJCQkgIHBhdHRyaWItPmhkcmxlbiAtCi0JCQkJICBwYXR0cmliLT5pdl9sZW4gLQotCQkJCSAgcGF0dHJpYi0+aWN2X2xlbik7Ci0KLQkJCWNyYyA9IGNwdV90b19sZTMyKGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCkpOwotCQkJYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHJjNGtleSwgMTYpOwotCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQsIHBheWxvYWQsIGxlbmd0aCk7Ci0JCQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCArIGxlbmd0aCwKLQkJCQkJKGNoYXIgKikmY3JjLCA0KTsKLQotCQkJcGZyYW1lICs9IHB4bWl0cHJpdi0+ZnJhZ19sZW47Ci0JCQlwZnJhbWUgID0gUFRSX0FMSUdOKHBmcmFtZSwgNCk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmVzOwotfQotCi0vKiBUaGUgaGxlbiBpc24ndCBpbmNsdWRlIHRoZSBJViAqLwotaW50IHJ0d190a2lwX2RlY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQotewotCXUxNiBwbmw7Ci0JdTMyIHBuaDsKLQl1OCByYzRrZXlbMTZdOwotCXU4IHR0a2V5WzE2XTsKLQl1MzIgYWN0dWFsX2NyYywgZXhwZWN0ZWRfY3JjOwotCXN0cnVjdCBhcmM0Y29udGV4dCBteWNvbnRleHQ7Ci0JaW50IGxlbmd0aDsKLQl1OCAqcGZyYW1lLCAqcGF5bG9hZCwgKml2LCAqcHJ3c2tleTsKLQl1bmlvbiBwbjQ4IGRvdDExdHhwbjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YWluZm87Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnByeGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJlY3ZmcmFtZS0+cGt0OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCWlmIChwcnhhdHRyaWItPmVuY3J5cHQgIT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkKLQkJcmV0dXJuIF9GQUlMOwotCi0JcGZyYW1lID0gc2tiLT5kYXRhOwotCi0Jc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsCi0JCQkJICAgICAmcHJ4YXR0cmliLT50YVswXSk7Ci0JaWYgKCFzdGFpbmZvKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkJICIlczogc3RhaW5mbyA9PSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQkvKiA0IHN0YXJ0IHRvIGRlY3J5cHQgcmVjdmZyYW1lICovCi0JaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHByeGF0dHJpYi0+cmEpKSB7Ci0JCWlmIChwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSA9PSAwKSB7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCURCR184NzIzQSgiJXM6cnggYmMvbWMgcGFja2V0cywgYnV0IGRpZG4ndCBpbnN0YWxsIGdyb3VwIGtleSEhISEhISEhISFcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlwcndza2V5ID0gcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleVtwcnhhdHRyaWItPmtleV9pbmRleF0uc2tleTsKLQl9IGVsc2UgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IHN0YWluZm8hPSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCXByd3NrZXkgPSAmc3RhaW5mby0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5WzBdOwotCX0KLQotCWl2ID0gcGZyYW1lICsgcHJ4YXR0cmliLT5oZHJsZW47Ci0JcGF5bG9hZCA9IHBmcmFtZSArIHByeGF0dHJpYi0+aXZfbGVuICsgcHJ4YXR0cmliLT5oZHJsZW47Ci0JbGVuZ3RoID0gc2tiLT5sZW4gLSBwcnhhdHRyaWItPmhkcmxlbiAtIHByeGF0dHJpYi0+aXZfbGVuOwotCi0JR0VUX1RLSVBfUE4oaXYsIGRvdDExdHhwbik7Ci0KLQlwbmwgPSAodTE2KShkb3QxMXR4cG4udmFsKTsKLQlwbmggPSAodTMyKShkb3QxMXR4cG4udmFsPj4xNik7Ci0KLQlwaGFzZTEoKHUxNiAqKSZ0dGtleVswXSwgcHJ3c2tleSwgJnByeGF0dHJpYi0+dGFbMF0sIHBuaCk7Ci0JcGhhc2UyKCZyYzRrZXlbMF0sIHByd3NrZXksICh1bnNpZ25lZCBzaG9ydCAqKSZ0dGtleVswXSwgcG5sKTsKLQotCS8qIDQgZGVjcnlwdCBwYXlsb2FkIGluY2x1ZGUgaWN2ICovCi0JYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHJjNGtleSwgMTYpOwotCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOwotCi0JYWN0dWFsX2NyYyA9IGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCAtIDQpOwotCWV4cGVjdGVkX2NyYyA9IGdldF91bmFsaWduZWRfbGUzMigmcGF5bG9hZFtsZW5ndGggLSA0XSk7Ci0KLQlpZiAoYWN0dWFsX2NyYyAhPSBleHBlY3RlZF9jcmMpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzOmljdiBDUkMgbWlzbWF0Y2g6ICIKLQkJCSAiYWN0dWFsOiAlMDh4LCBleHBlY3RlZDogJTA4eFxuIiwKLQkJCSBfX2Z1bmNfXywgYWN0dWFsX2NyYywgZXhwZWN0ZWRfY3JjKTsKLQkJcmVzID0gX0ZBSUw7Ci0JfQotCi1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLS8qIDMJCQk9PT09PSBBRVMgcmVsYXRlZCA9PT09PSAqLwotCi0jZGVmaW5lIE1BWF9NU0dfU0laRQkyMDQ4Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKiogU0JPWCBUYWJsZSAqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyAgdTggc2JveF90YWJsZVsyNTZdID0gewotCTB4NjMsIDB4N2MsIDB4NzcsIDB4N2IsIDB4ZjIsIDB4NmIsIDB4NmYsIDB4YzUsCi0JMHgzMCwgMHgwMSwgMHg2NywgMHgyYiwgMHhmZSwgMHhkNywgMHhhYiwgMHg3NiwKLQkweGNhLCAweDgyLCAweGM5LCAweDdkLCAweGZhLCAweDU5LCAweDQ3LCAweGYwLAotCTB4YWQsIDB4ZDQsIDB4YTIsIDB4YWYsIDB4OWMsIDB4YTQsIDB4NzIsIDB4YzAsCi0JMHhiNywgMHhmZCwgMHg5MywgMHgyNiwgMHgzNiwgMHgzZiwgMHhmNywgMHhjYywKLQkweDM0LCAweGE1LCAweGU1LCAweGYxLCAweDcxLCAweGQ4LCAweDMxLCAweDE1LAotCTB4MDQsIDB4YzcsIDB4MjMsIDB4YzMsIDB4MTgsIDB4OTYsIDB4MDUsIDB4OWEsCi0JMHgwNywgMHgxMiwgMHg4MCwgMHhlMiwgMHhlYiwgMHgyNywgMHhiMiwgMHg3NSwKLQkweDA5LCAweDgzLCAweDJjLCAweDFhLCAweDFiLCAweDZlLCAweDVhLCAweGEwLAotCTB4NTIsIDB4M2IsIDB4ZDYsIDB4YjMsIDB4MjksIDB4ZTMsIDB4MmYsIDB4ODQsCi0JMHg1MywgMHhkMSwgMHgwMCwgMHhlZCwgMHgyMCwgMHhmYywgMHhiMSwgMHg1YiwKLQkweDZhLCAweGNiLCAweGJlLCAweDM5LCAweDRhLCAweDRjLCAweDU4LCAweGNmLAotCTB4ZDAsIDB4ZWYsIDB4YWEsIDB4ZmIsIDB4NDMsIDB4NGQsIDB4MzMsIDB4ODUsCi0JMHg0NSwgMHhmOSwgMHgwMiwgMHg3ZiwgMHg1MCwgMHgzYywgMHg5ZiwgMHhhOCwKLQkweDUxLCAweGEzLCAweDQwLCAweDhmLCAweDkyLCAweDlkLCAweDM4LCAweGY1LAotCTB4YmMsIDB4YjYsIDB4ZGEsIDB4MjEsIDB4MTAsIDB4ZmYsIDB4ZjMsIDB4ZDIsCi0JMHhjZCwgMHgwYywgMHgxMywgMHhlYywgMHg1ZiwgMHg5NywgMHg0NCwgMHgxNywKLQkweGM0LCAweGE3LCAweDdlLCAweDNkLCAweDY0LCAweDVkLCAweDE5LCAweDczLAotCTB4NjAsIDB4ODEsIDB4NGYsIDB4ZGMsIDB4MjIsIDB4MmEsIDB4OTAsIDB4ODgsCi0JMHg0NiwgMHhlZSwgMHhiOCwgMHgxNCwgMHhkZSwgMHg1ZSwgMHgwYiwgMHhkYiwKLQkweGUwLCAweDMyLCAweDNhLCAweDBhLCAweDQ5LCAweDA2LCAweDI0LCAweDVjLAotCTB4YzIsIDB4ZDMsIDB4YWMsIDB4NjIsIDB4OTEsIDB4OTUsIDB4ZTQsIDB4NzksCi0JMHhlNywgMHhjOCwgMHgzNywgMHg2ZCwgMHg4ZCwgMHhkNSwgMHg0ZSwgMHhhOSwKLQkweDZjLCAweDU2LCAweGY0LCAweGVhLCAweDY1LCAweDdhLCAweGFlLCAweDA4LAotCTB4YmEsIDB4NzgsIDB4MjUsIDB4MmUsIDB4MWMsIDB4YTYsIDB4YjQsIDB4YzYsCi0JMHhlOCwgMHhkZCwgMHg3NCwgMHgxZiwgMHg0YiwgMHhiZCwgMHg4YiwgMHg4YSwKLQkweDcwLCAweDNlLCAweGI1LCAweDY2LCAweDQ4LCAweDAzLCAweGY2LCAweDBlLAotCTB4NjEsIDB4MzUsIDB4NTcsIDB4YjksIDB4ODYsIDB4YzEsIDB4MWQsIDB4OWUsCi0JMHhlMSwgMHhmOCwgMHg5OCwgMHgxMSwgMHg2OSwgMHhkOSwgMHg4ZSwgMHg5NCwKLQkweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmLAotCTB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsCi0JMHg0MSwgMHg5OSwgMHgyZCwgMHgwZiwgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNgotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKiogRnVuY3Rpb24gUHJvdG90eXBlcyAqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBjb25zdHJ1Y3RfbWljX2hlYWRlcjIodTggKm1pY19oZWFkZXIyLCB1OCAqbXBkdSwgaW50IGE0X2V4aXN0cywKLQkJCQkgIGludCBxY19leGlzdHMpOwotCi1zdGF0aWMgdm9pZCB4b3JfMTI4KHU4ICphLCB1OCAqYiwgdTggKm91dCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotCQlvdXRbaV0gPSBhW2ldIF4gYltpXTsKLX0KLQotc3RhdGljIHZvaWQgeG9yXzMyKHU4ICphLCB1OCAqYiwgdTggKm91dCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCW91dFtpXSA9IGFbaV0gXiBiW2ldOwotfQotCi1zdGF0aWMgdTggc2JveCh1OCBhKQotewotCXJldHVybiBzYm94X3RhYmxlWyhpbnQpYV07Ci19Ci0KLXN0YXRpYyB2b2lkIG5leHRfa2V5KHU4ICprZXksIGludCByb3VuZCkKLXsKLQl1OCByY29uOwotCXU4IHNib3hfa2V5WzRdOwotCXU4IHJjb25fdGFibGVbMTJdID0gewotCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLAotCQkweDFiLCAweDM2LCAweDM2LCAweDM2Ci0JfTsKLQotCXNib3hfa2V5WzBdID0gc2JveChrZXlbMTNdKTsKLQlzYm94X2tleVsxXSA9IHNib3goa2V5WzE0XSk7Ci0Jc2JveF9rZXlbMl0gPSBzYm94KGtleVsxNV0pOwotCXNib3hfa2V5WzNdID0gc2JveChrZXlbMTJdKTsKLQotCXJjb24gPSByY29uX3RhYmxlW3JvdW5kXTsKLQotCXhvcl8zMigma2V5WzBdLCBzYm94X2tleSwgJmtleVswXSk7Ci0Ja2V5WzBdID0ga2V5WzBdIF4gcmNvbjsKLQotCXhvcl8zMigma2V5WzRdLCAma2V5WzBdLCAma2V5WzRdKTsKLQl4b3JfMzIoJmtleVs4XSwgJmtleVs0XSwgJmtleVs4XSk7Ci0JeG9yXzMyKCZrZXlbMTJdLCAma2V5WzhdLCAma2V5WzEyXSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgYnl0ZV9zdWIodTggKmluLCB1OCAqb3V0KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCW91dFtpXSA9IHNib3goaW5baV0pOwotfQotCi1zdGF0aWMgdm9pZCBzaGlmdF9yb3codTggKmluLCB1OCAqb3V0KQotewotCi0Jb3V0WzBdID0gIGluWzBdOwotCW91dFsxXSA9ICBpbls1XTsKLQlvdXRbMl0gPSAgaW5bMTBdOwotCW91dFszXSA9ICBpblsxNV07Ci0Jb3V0WzRdID0gIGluWzRdOwotCW91dFs1XSA9ICBpbls5XTsKLQlvdXRbNl0gPSAgaW5bMTRdOwotCW91dFs3XSA9ICBpblszXTsKLQlvdXRbOF0gPSAgaW5bOF07Ci0Jb3V0WzldID0gIGluWzEzXTsKLQlvdXRbMTBdID0gaW5bMl07Ci0Jb3V0WzExXSA9IGluWzddOwotCW91dFsxMl0gPSBpblsxMl07Ci0Jb3V0WzEzXSA9IGluWzFdOwotCW91dFsxNF0gPSBpbls2XTsKLQlvdXRbMTVdID0gaW5bMTFdOwotCi19Ci0KLXN0YXRpYyB2b2lkIG1peF9jb2x1bW4odTggKmluLCB1OCAqb3V0KQotewotCWludCBpOwotCXU4IGFkZDFiWzRdOwotCXU4IGFkZDFiZjdbNF07Ci0JdTggcm90bFs0XTsKLQl1OCBzd2FwX2hhbGZzWzRdOwotCXU4IGFuZGY3WzRdOwotCXU4IHJvdHJbNF07Ci0JdTggdGVtcFs0XTsKLQl1OCB0ZW1wYls0XTsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaWYgKChpbltpXSAmIDB4ODApID09IDB4ODApCi0JCQlhZGQxYltpXSA9IDB4MWI7Ci0JCWVsc2UKLQkJCWFkZDFiW2ldID0gMHgwMDsKLQl9Ci0KLQlzd2FwX2hhbGZzWzBdID0gaW5bMl07IC8qIFN3YXAgaGFsZnMgKi8KLQlzd2FwX2hhbGZzWzFdID0gaW5bM107Ci0Jc3dhcF9oYWxmc1syXSA9IGluWzBdOwotCXN3YXBfaGFsZnNbM10gPSBpblsxXTsKLQotCXJvdGxbMF0gPSBpblszXTsgLyogUm90YXRlIGxlZnQgOCBiaXRzICovCi0Jcm90bFsxXSA9IGluWzBdOwotCXJvdGxbMl0gPSBpblsxXTsKLQlyb3RsWzNdID0gaW5bMl07Ci0KLQlhbmRmN1swXSA9IGluWzBdICYgMHg3ZjsKLQlhbmRmN1sxXSA9IGluWzFdICYgMHg3ZjsKLQlhbmRmN1syXSA9IGluWzJdICYgMHg3ZjsKLQlhbmRmN1szXSA9IGluWzNdICYgMHg3ZjsKLQotCWZvciAoaSA9IDM7IGkgPiAwOyBpLS0pIHsgLyogbG9naWNhbCBzaGlmdCBsZWZ0IDEgYml0ICovCi0JCWFuZGY3W2ldID0gYW5kZjdbaV0gPDwgMTsKLQkJaWYgKChhbmRmN1tpIC0gMV0gJiAweDgwKSA9PSAweDgwKQotCQkJYW5kZjdbaV0gPSAoYW5kZjdbaV0gfCAweDAxKTsKLQl9Ci0JYW5kZjdbMF0gPSBhbmRmN1swXSA8PCAxOwotCWFuZGY3WzBdID0gYW5kZjdbMF0gJiAweGZlOwotCi0JeG9yXzMyKGFkZDFiLCBhbmRmNywgYWRkMWJmNyk7Ci0KLQl4b3JfMzIoaW4sIGFkZDFiZjcsIHJvdHIpOwotCi0JdGVtcFswXSA9IHJvdHJbMF07IC8qIFJvdGF0ZSByaWdodCA4IGJpdHMgKi8KLQlyb3RyWzBdID0gcm90clsxXTsKLQlyb3RyWzFdID0gcm90clsyXTsKLQlyb3RyWzJdID0gcm90clszXTsKLQlyb3RyWzNdID0gdGVtcFswXTsKLQotCXhvcl8zMihhZGQxYmY3LCByb3RyLCB0ZW1wKTsKLQl4b3JfMzIoc3dhcF9oYWxmcywgcm90bCwgdGVtcGIpOwotCXhvcl8zMih0ZW1wLCB0ZW1wYiwgb3V0KTsKLQotfQotCi1zdGF0aWMgdm9pZCBhZXMxMjhrMTI4ZCh1OCAqa2V5LCB1OCAqZGF0YSwgdTggKmNpcGhlcnRleHQpCi17Ci0JaW50IHJvdW5kOwotCWludCBpOwotCXU4IGludGVybWVkaWF0ZWFbMTZdOwotCXU4IGludGVybWVkaWF0ZWJbMTZdOwotCXU4IHJvdW5kX2tleVsxNl07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJcm91bmRfa2V5W2ldID0ga2V5W2ldOwotCi0JZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgMTE7IHJvdW5kKyspIHsKLQkJaWYgKHJvdW5kID09IDApIHsKLQkJCXhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKLQkJCW5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOwotCQl9IGVsc2UgaWYgKHJvdW5kID09IDEwKSB7Ci0JCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLQkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLQkJCXhvcl8xMjgoaW50ZXJtZWRpYXRlYiwgcm91bmRfa2V5LCBjaXBoZXJ0ZXh0KTsKLQkJfSBlbHNlIHsgLyogMSAtIDkgKi8KLQkJCWJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOwotCQkJc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlswXSwgJmludGVybWVkaWF0ZWFbMF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls0XSwgJmludGVybWVkaWF0ZWFbNF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYls4XSwgJmludGVybWVkaWF0ZWFbOF0pOwotCQkJbWl4X2NvbHVtbigmaW50ZXJtZWRpYXRlYlsxMl0sICZpbnRlcm1lZGlhdGVhWzEyXSk7Ci0JCQl4b3JfMTI4KGludGVybWVkaWF0ZWEsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7Ci0JCQluZXh0X2tleShyb3VuZF9rZXksIHJvdW5kKTsKLQkJfQotCX0KLQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogY29uc3RydWN0X21pY19pdigpICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJ1aWxkcyB0aGUgTUlDIElWIGZyb20gaGVhZGVyIGZpZWxkcyBhbmQgUE4gICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29uc3RydWN0X21pY19pdih1OCAqbWljX2l2LCBpbnQgcWNfZXhpc3RzLCBpbnQgYTRfZXhpc3RzLCB1OCAqbXBkdSwKLQkJCSAgICAgdWludCBwYXlsb2FkX2xlbmd0aCwgdTggKnBuX3ZlY3RvcikKLXsKLQlpbnQgaTsKLQotCW1pY19pdlswXSA9IDB4NTk7Ci0JaWYgKHFjX2V4aXN0cyAmJiBhNF9leGlzdHMpCi0JCW1pY19pdlsxXSA9IG1wZHVbMzBdICYgMHgwZjsgLyogUW9TX1RDICAgICAgICAqLwotCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykKLQkJbWljX2l2WzFdID0gbXBkdVsyNF0gJiAweDBmOyAvKiBtdXRlIGJpdHMgNy00ICovCi0JaWYgKCFxY19leGlzdHMpCi0JCW1pY19pdlsxXSA9IDB4MDA7Ci0JZm9yIChpID0gMjsgaSA8IDg7IGkrKykKLQkJbWljX2l2W2ldID0gbXBkdVtpICsgOF07IC8qIG1pY19pdlsyOjddID0gQTJbMDo1XSA9IG1wZHVbMTA6MTVdICovCi0JZm9yIChpID0gODsgaSA8IDE0OyBpKyspCi0JCW1pY19pdltpXSA9IHBuX3ZlY3RvclsxMyAtIGldOyAvKiBtaWNfaXZbODoxM10gPSBQTls1OjBdICovCi0JbWljX2l2WzE0XSA9ICh1bnNpZ25lZCBjaGFyKShwYXlsb2FkX2xlbmd0aCAvIDI1Nik7Ci0JbWljX2l2WzE1XSA9ICh1bnNpZ25lZCBjaGFyKShwYXlsb2FkX2xlbmd0aCAlIDI1Nik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjEoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBmaXJzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29uc3RydWN0X21pY19oZWFkZXIxKHU4ICptaWNfaGVhZGVyMSwgaW50IGhlYWRlcl9sZW5ndGgsIHU4ICptcGR1KQotewotCW1pY19oZWFkZXIxWzBdID0gKHU4KSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKLQltaWNfaGVhZGVyMVsxXSA9ICh1OCkoKGhlYWRlcl9sZW5ndGggLSAyKSAlIDI1Nik7Ci0JbWljX2hlYWRlcjFbMl0gPSBtcGR1WzBdICYgMHhjZjsgLyogTXV0ZSBDRiBwb2xsICYgQ0YgYWNrIGJpdHMgKi8KLQltaWNfaGVhZGVyMVszXSA9IG1wZHVbMV0gJiAweGM3OyAvKiBNdXRlIHJldHJ5LCBtb3JlIGRhdGEgYW5kIHB3ciBtZ3QgYml0cyAqLwotCW1pY19oZWFkZXIxWzRdID0gbXBkdVs0XTsgLyogQTEgKi8KLQltaWNfaGVhZGVyMVs1XSA9IG1wZHVbNV07Ci0JbWljX2hlYWRlcjFbNl0gPSBtcGR1WzZdOwotCW1pY19oZWFkZXIxWzddID0gbXBkdVs3XTsKLQltaWNfaGVhZGVyMVs4XSA9IG1wZHVbOF07Ci0JbWljX2hlYWRlcjFbOV0gPSBtcGR1WzldOwotCW1pY19oZWFkZXIxWzEwXSA9IG1wZHVbMTBdOyAvKiBBMiAqLwotCW1pY19oZWFkZXIxWzExXSA9IG1wZHVbMTFdOwotCW1pY19oZWFkZXIxWzEyXSA9IG1wZHVbMTJdOwotCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOwotCW1pY19oZWFkZXIxWzE0XSA9IG1wZHVbMTRdOwotCW1pY19oZWFkZXIxWzE1XSA9IG1wZHVbMTVdOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBsYXN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29uc3RydWN0X21pY19oZWFkZXIyKHU4ICptaWNfaGVhZGVyMiwgdTggKm1wZHUsIGludCBhNF9leGlzdHMsCi0JCQkJICBpbnQgcWNfZXhpc3RzKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCW1pY19oZWFkZXIyW2ldID0gMHgwMDsKLQotCW1pY19oZWFkZXIyWzBdID0gbXBkdVsxNl07IC8qIEEzICovCi0JbWljX2hlYWRlcjJbMV0gPSBtcGR1WzE3XTsKLQltaWNfaGVhZGVyMlsyXSA9IG1wZHVbMThdOwotCW1pY19oZWFkZXIyWzNdID0gbXBkdVsxOV07Ci0JbWljX2hlYWRlcjJbNF0gPSBtcGR1WzIwXTsKLQltaWNfaGVhZGVyMls1XSA9IG1wZHVbMjFdOwotCi0JbWljX2hlYWRlcjJbNl0gPSAweDAwOwotCW1pY19oZWFkZXIyWzddID0gMHgwMDsgLyogbXBkdVsyM107ICovCi0KLQlpZiAoIXFjX2V4aXN0cyAmJiBhNF9leGlzdHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLQkJCW1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAvKiBBNCAqLwotCX0KLQotCWlmIChxY19leGlzdHMgJiYgIWE0X2V4aXN0cykgewotCQltaWNfaGVhZGVyMls4XSA9IG1wZHVbMjRdICYgMHgwZjsgLyogbXV0ZSBiaXRzIDE1IC0gNCAqLwotCQltaWNfaGVhZGVyMls5XSA9IG1wZHVbMjVdICYgMHgwMDsKLQl9Ci0KLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykgewotCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQkJbWljX2hlYWRlcjJbOCtpXSA9IG1wZHVbMjQraV07IC8qIEE0ICovCi0KLQkJbWljX2hlYWRlcjJbMTRdID0gbXBkdVszMF0gJiAweDBmOwotCQltaWNfaGVhZGVyMlsxNV0gPSBtcGR1WzMxXSAmIDB4MDA7Ci0JfQotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogQnVpbGRzIHRoZSBsYXN0IE1JQyBoZWFkZXIgYmxvY2sgZnJvbSAgICAgICAgKi8KLS8qIGhlYWRlciBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgY29uc3RydWN0X2N0cl9wcmVsb2FkKHU4ICpjdHJfcHJlbG9hZCwgaW50IGE0X2V4aXN0cywgaW50IHFjX2V4aXN0cywKLQkJCQkgIHU4ICptcGR1LCB1OCAqcG5fdmVjdG9yLCBpbnQgYykKLXsKLQlpbnQgaSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJY3RyX3ByZWxvYWRbaV0gPSAweDAwOwotCi0JaSA9IDA7Ci0KLQljdHJfcHJlbG9hZFswXSA9IDB4MDE7IC8qIGZsYWcgKi8KLQlpZiAocWNfZXhpc3RzICYmIGE0X2V4aXN0cykKLQkJY3RyX3ByZWxvYWRbMV0gPSBtcGR1WzMwXSAmIDB4MGY7IC8qIFFvQ19Db250cm9sICovCi0JaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKQotCQljdHJfcHJlbG9hZFsxXSA9IG1wZHVbMjRdICYgMHgwZjsKLQotCWZvciAoaSA9IDI7IGkgPCA4OyBpKyspCi0JCWN0cl9wcmVsb2FkW2ldID0gbXBkdVtpICsgOF07IC8qIGN0cl9wcmVsb2FkWzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KLQlmb3IgKGkgPSA4OyBpIDwgMTQ7IGkrKykKLQkJY3RyX3ByZWxvYWRbaV0gPSBwbl92ZWN0b3JbMTMgLSBpXTsgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTls1OjBdICovCi0JY3RyX3ByZWxvYWRbMTRdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAvIDI1Nik7IC8qIEN0ciAqLwotCWN0cl9wcmVsb2FkWzE1XSA9ICAodW5zaWduZWQgY2hhcikgKGMgJSAyNTYpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBiaXR3aXNlX3hvcigpICAgICAgICAgICAgICAgICAgICAqLwotLyogQSAxMjggYml0LCBiaXR3aXNlIGV4Y2x1c2l2ZSBvciAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBiaXR3aXNlX3hvcih1OCAqaW5hLCB1OCAqaW5iLCB1OCAqb3V0KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0JCW91dFtpXSA9IGluYVtpXSBeIGluYltpXTsKLX0KLQotc3RhdGljIGludCBhZXNfY2lwaGVyKHU4ICprZXksIHVpbnQgaGRybGVuLCB1OCAqcGZyYW1lLCB1aW50IHBsZW4pCi17Ci0JdWludCBxY19leGlzdHMsIGE0X2V4aXN0cywgaSwgaiwgcGF5bG9hZF9yZW1haW5kZXIsCi0JICAgICBudW1fYmxvY2tzLCBwYXlsb2FkX2luZGV4OwotCXU4IHBuX3ZlY3Rvcls2XTsKLQl1OCBtaWNfaXZbMTZdOwotCXU4IG1pY19oZWFkZXIxWzE2XTsKLQl1OCBtaWNfaGVhZGVyMlsxNl07Ci0JdTggY3RyX3ByZWxvYWRbMTZdOwotCS8qIEludGVybWVkaWF0ZSBCdWZmZXJzICovCi0JdTggY2hhaW5fYnVmZmVyWzE2XTsKLQl1OCBhZXNfb3V0WzE2XTsKLQl1OCBwYWRkZWRfYnVmZmVyWzE2XTsKLQl1OCBtaWNbOF07Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKLQl1MTYgZnJzdWJ0eXBlID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFOwotCi0JbWVtc2V0KCh2b2lkICopbWljX2l2LCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopbWljX2hlYWRlcjEsIDAsIDE2KTsKLQltZW1zZXQoKHZvaWQgKiltaWNfaGVhZGVyMiwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKWN0cl9wcmVsb2FkLCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopY2hhaW5fYnVmZmVyLCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopYWVzX291dCwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKXBhZGRlZF9idWZmZXIsIDAsIDE2KTsKLQotCWlmICgoaGRybGVuID09IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgfHwKLQkgICAgKGhkcmxlbiA9PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKSkpKQotCQlhNF9leGlzdHMgPSAwOwotCWVsc2UKLQkJYTRfZXhpc3RzID0gMTsKLQotCWlmIChpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCWlmICgoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLKSB8fAotCQkgICAgKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwpIHx8Ci0JCSAgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTCkpIHsKLQkJCXFjX2V4aXN0cyA9IDE7Ci0JCQlpZiAoaGRybGVuICE9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpKQotCQkJCWhkcmxlbiArPSAyOwotCQl9IGVsc2UgaWYgKChmcnN1YnR5cGUgPT0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBKSB8fAotCQkJICAgKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEFfQ0ZBQ0spIHx8Ci0JCQkgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQV9DRlBPTEwpIHx8Ci0JCQkgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQV9DRkFDS1BPTEwpKSB7Ci0JCQlpZiAoaGRybGVuICE9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpKQotCQkJCWhkcmxlbiArPSAyOwotCQkJcWNfZXhpc3RzID0gMTsKLQkJfSBlbHNlIHsKLQkJCXFjX2V4aXN0cyA9IDA7Ci0JCX0KLQl9IGVsc2UgewotCQlxY19leGlzdHMgPSAwOwotCX0KLQlwbl92ZWN0b3JbMF0gPSBwZnJhbWVbaGRybGVuXTsKLQlwbl92ZWN0b3JbMV0gPSBwZnJhbWVbaGRybGVuICsgMV07Ci0JcG5fdmVjdG9yWzJdID0gcGZyYW1lW2hkcmxlbiArIDRdOwotCXBuX3ZlY3RvclszXSA9IHBmcmFtZVtoZHJsZW4gKyA1XTsKLQlwbl92ZWN0b3JbNF0gPSBwZnJhbWVbaGRybGVuICsgNl07Ci0JcG5fdmVjdG9yWzVdID0gcGZyYW1lW2hkcmxlbiArIDddOwotCi0JY29uc3RydWN0X21pY19pdihtaWNfaXYsIHFjX2V4aXN0cywgYTRfZXhpc3RzLCBwZnJhbWUsIHBsZW4sIHBuX3ZlY3Rvcik7Ci0KLQljb25zdHJ1Y3RfbWljX2hlYWRlcjEobWljX2hlYWRlcjEsIGhkcmxlbiwgcGZyYW1lKTsKLQljb25zdHJ1Y3RfbWljX2hlYWRlcjIobWljX2hlYWRlcjIsIHBmcmFtZSwgYTRfZXhpc3RzLCBxY19leGlzdHMpOwotCi0JcGF5bG9hZF9yZW1haW5kZXIgPSBwbGVuICUgMTY7Ci0JbnVtX2Jsb2NrcyA9IHBsZW4gLyAxNjsKLQotCS8qIEZpbmQgc3RhcnQgb2YgcGF5bG9hZCAqLwotCXBheWxvYWRfaW5kZXggPSBoZHJsZW4gKyA4OwotCi0JLyogQ2FsY3VsYXRlIE1JQyAqLwotCWFlczEyOGsxMjhkKGtleSwgbWljX2l2LCBhZXNfb3V0KTsKLQliaXR3aXNlX3hvcihhZXNfb3V0LCBtaWNfaGVhZGVyMSwgY2hhaW5fYnVmZmVyKTsKLQlhZXMxMjhrMTI4ZChrZXksIGNoYWluX2J1ZmZlciwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjIsIGNoYWluX2J1ZmZlcik7Ci0JYWVzMTI4azEyOGQoa2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgewotCQliaXR3aXNlX3hvcihhZXNfb3V0LCAmcGZyYW1lW3BheWxvYWRfaW5kZXhdLCBjaGFpbl9idWZmZXIpOwotCi0JCXBheWxvYWRfaW5kZXggKz0gMTY7Ci0JCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQl9Ci0KLQkvKiBBZGQgb24gdGhlIGZpbmFsIHBheWxvYWQgYmxvY2sgaWYgaXQgbmVlZHMgcGFkZGluZyAqLwotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApIHsKLQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JCQlwYWRkZWRfYnVmZmVyW2pdID0gMHgwMDsKLQkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCi0JCQlwYWRkZWRfYnVmZmVyW2pdID0gcGZyYW1lW3BheWxvYWRfaW5kZXgrK107Ci0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQl9Ci0KLQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQotCQltaWNbal0gPSBhZXNfb3V0W2pdOwotCi0JLyogSW5zZXJ0IE1JQyBpbnRvIHBheWxvYWQgKi8KLQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQotCQlwZnJhbWVbcGF5bG9hZF9pbmRleCArIGpdID0gbWljW2pdOwotCi0JcGF5bG9hZF9pbmRleCA9IGhkcmxlbiArIDg7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgewotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsIGE0X2V4aXN0cywgcWNfZXhpc3RzLAotCQkJCSAgICAgIHBmcmFtZSwgcG5fdmVjdG9yLCBpICsgMSk7Ci0JCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCQliaXR3aXNlX3hvcihhZXNfb3V0LCAmcGZyYW1lW3BheWxvYWRfaW5kZXhdLCBjaGFpbl9idWZmZXIpOwotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJCXBmcmFtZVtwYXlsb2FkX2luZGV4KytdID0gY2hhaW5fYnVmZmVyW2pdOwotCX0KLQotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApIHsKLQkJLyogSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQsCi0JCSAqIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjawotCQkgKi8KLQkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywgcGZyYW1lLAotCQkJCSAgICAgIHBuX3ZlY3RvciwgbnVtX2Jsb2NrcyArIDEpOwotCi0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7Ci0JCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IHBmcmFtZVtwYXlsb2FkX2luZGV4ICsgal07Ci0JCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwotCQlmb3IgKGogPSAwOyBqIDwgcGF5bG9hZF9yZW1haW5kZXI7IGorKykKLQkJCXBmcmFtZVtwYXlsb2FkX2luZGV4KytdID0gY2hhaW5fYnVmZmVyW2pdOwotCX0KLQotCS8qIEVuY3J5cHQgdGhlIE1JQyAqLwotCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsIHBmcmFtZSwKLQkJCSAgICAgIHBuX3ZlY3RvciwgMCk7Ci0KLQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7Ci0JZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJcGFkZGVkX2J1ZmZlcltqXSA9IHBmcmFtZVtqICsgaGRybGVuICsgOCArIHBsZW5dOwotCi0JYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQotCQlwZnJhbWVbcGF5bG9hZF9pbmRleCsrXSA9IGNoYWluX2J1ZmZlcltqXTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotaW50IHJ0d19hZXNfZW5jcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17CS8qIGV4Y2x1ZGUgSUNWICovCi0JLyogSW50ZXJtZWRpYXRlIEJ1ZmZlcnMgKi8KLQlpbnQgY3VyZnJhZ251bSwgbGVuZ3RoOwotCXU4ICpwZnJhbWUsICpwcndza2V5OwotCXU4IGh3X2hkcl9vZmZzZXQgPSAwOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhaW5mbzsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCWlmICghcHhtaXRmcmFtZS0+YnVmX2FkZHIpCi0JCXJldHVybiBfRkFJTDsKLQotCWh3X2hkcl9vZmZzZXQgPSBUWERFU0NfT0ZGU0VUOwotCi0JcGZyYW1lID0gcHhtaXRmcmFtZS0+YnVmX2FkZHIgKyBod19oZHJfb2Zmc2V0OwotCi0JLyogNCBzdGFydCB0byBlbmNyeXB0IGVhY2ggZnJhZ21lbnQgKi8KLQlpZiAocGF0dHJpYi0+ZW5jcnlwdCAhPSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkgewotCQlzdGFpbmZvID0gcGF0dHJpYi0+cHN0YTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBjYWxsIHJ0d19nZXRfc3RhaW5mbzIzYSgpXG4iLCBfX2Z1bmNfXyk7Ci0JCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCAmcGF0dHJpYi0+cmFbMF0pOwotCX0KLQotCWlmICghc3RhaW5mbykgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IHN0YWluZm8gPT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBvdXQ7Ci0JfQotCWlmICghKHN0YWluZm8tPnN0YXRlICYgX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwKLQkJCSAgX19mdW5jX18sIHN0YWluZm8tPnN0YXRlKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJICIlczogc3RhaW5mbyE9IE5VTEwhISFcbiIsIF9fZnVuY19fKTsKLQotCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSkpCi0JCXByd3NrZXkgPSBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5W3BzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZF0uc2tleTsKLQllbHNlCi0JCXByd3NrZXkgPSAmc3RhaW5mby0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5WzBdOwotCi0JZm9yIChjdXJmcmFnbnVtID0gMDsgY3VyZnJhZ251bSA8IHBhdHRyaWItPm5yX2ZyYWdzOyBjdXJmcmFnbnVtKyspIHsKLQkJLyogNCB0aGUgbGFzdCBmcmFnbWVudCAqLwotCQlpZiAoKGN1cmZyYWdudW0gKyAxKSA9PSBwYXR0cmliLT5ucl9mcmFncykgewotCQkJbGVuZ3RoID0gcGF0dHJpYi0+bGFzdF90eGNtZHN6IC0KLQkJCQlwYXR0cmliLT5oZHJsZW4tcGF0dHJpYi0+aXZfbGVuIC0KLQkJCQlwYXR0cmliLT5pY3ZfbGVuOwotCi0JCQlhZXNfY2lwaGVyKHByd3NrZXksIHBhdHRyaWItPmhkcmxlbiwgcGZyYW1lLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJbGVuZ3RoID0gcHhtaXRwcml2LT5mcmFnX2xlbi1wYXR0cmliLT5oZHJsZW4gLQotCQkJCXBhdHRyaWItPml2X2xlbiAtIHBhdHRyaWItPmljdl9sZW47Ci0KLQkJCWFlc19jaXBoZXIocHJ3c2tleSwgcGF0dHJpYi0+aGRybGVuLCBwZnJhbWUsIGxlbmd0aCk7Ci0JCQlwZnJhbWUgKz0gcHhtaXRwcml2LT5mcmFnX2xlbjsKLQkJCXBmcmFtZSA9IFBUUl9BTElHTihwZnJhbWUsIDQpOwotCQl9Ci0JfQotb3V0OgotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgYWVzX2RlY2lwaGVyKHU4ICprZXksIHVpbnQgaGRybGVuLCB1OCAqcGZyYW1lLCB1aW50IHBsZW4pCi17Ci0Jc3RhdGljIHU4IG1lc3NhZ2VbTUFYX01TR19TSVpFXTsKLQl1aW50IHFjX2V4aXN0cywgYTRfZXhpc3RzLCBpLCBqLCBwYXlsb2FkX3JlbWFpbmRlciwKLQkgICAgIG51bV9ibG9ja3MsIHBheWxvYWRfaW5kZXg7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCXU4IHBuX3ZlY3Rvcls2XTsKLQl1OCBtaWNfaXZbMTZdOwotCXU4IG1pY19oZWFkZXIxWzE2XTsKLQl1OCBtaWNfaGVhZGVyMlsxNl07Ci0JdTggY3RyX3ByZWxvYWRbMTZdOwotCS8qIEludGVybWVkaWF0ZSBCdWZmZXJzICovCi0JdTggY2hhaW5fYnVmZmVyWzE2XTsKLQl1OCBhZXNfb3V0WzE2XTsKLQl1OCBwYWRkZWRfYnVmZmVyWzE2XTsKLQl1OCBtaWNbOF07Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKLQl1MTYgZnJzdWJ0eXBlID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFOwotCi0JbWVtc2V0KCh2b2lkICopbWljX2l2LCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopbWljX2hlYWRlcjEsIDAsIDE2KTsKLQltZW1zZXQoKHZvaWQgKiltaWNfaGVhZGVyMiwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKWN0cl9wcmVsb2FkLCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopY2hhaW5fYnVmZmVyLCAwLCAxNik7Ci0JbWVtc2V0KCh2b2lkICopYWVzX291dCwgMCwgMTYpOwotCW1lbXNldCgodm9pZCAqKXBhZGRlZF9idWZmZXIsIDAsIDE2KTsKLQotCS8qIHN0YXJ0IHRvIGRlY3J5cHQgdGhlIHBheWxvYWQgKi8KLQotCW51bV9ibG9ja3MgPSAocGxlbiAtIDgpIC8gMTY7IC8qIHBsZW4gaW5jbHVkaW5nIGxsYywgcGF5bG9hZF9sZW5ndGggYW5kIG1pYykgKi8KLQotCXBheWxvYWRfcmVtYWluZGVyID0gKHBsZW4gLSA4KSAlIDE2OwotCi0JcG5fdmVjdG9yWzBdICA9IHBmcmFtZVtoZHJsZW5dOwotCXBuX3ZlY3RvclsxXSAgPSBwZnJhbWVbaGRybGVuICsgMV07Ci0JcG5fdmVjdG9yWzJdICA9IHBmcmFtZVtoZHJsZW4gKyA0XTsKLQlwbl92ZWN0b3JbM10gID0gcGZyYW1lW2hkcmxlbiArIDVdOwotCXBuX3ZlY3Rvcls0XSAgPSBwZnJhbWVbaGRybGVuICsgNl07Ci0JcG5fdmVjdG9yWzVdICA9IHBmcmFtZVtoZHJsZW4gKyA3XTsKLQotCWlmICgoaGRybGVuID09IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgfHwKLQkgICAgKGhkcmxlbiA9PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKSkpKQotCQlhNF9leGlzdHMgPSAwOwotCWVsc2UKLQkJYTRfZXhpc3RzID0gMTsKLQotCWlmIChpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCWlmICgoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLKSB8fAotCQkgICAgKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfREFUQV9DRlBPTEwpIHx8Ci0JCSAgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTCkpIHsKLQkJCXFjX2V4aXN0cyA9IDE7Ci0JCQlpZiAoaGRybGVuICE9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpCi0JCQkJaGRybGVuICs9IDI7Ci0JCX0gZWxzZSBpZiAoKGZyc3VidHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEpIHx8Ci0JCQkgICAoZnJzdWJ0eXBlID09IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQV9DRkFDSykgfHwKLQkJCSAgIChmcnN1YnR5cGUgPT0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBX0NGUE9MTCkgfHwKLQkJCSAgIChmcnN1YnR5cGUgPT0gSUVFRTgwMjExX1NUWVBFX1FPU19EQVRBX0NGQUNLUE9MTCkpIHsKLQkJCWlmIChoZHJsZW4gIT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSkKLQkJCQloZHJsZW4gKz0gMjsKLQkJCXFjX2V4aXN0cyA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlxY19leGlzdHMgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJcWNfZXhpc3RzID0gMDsKLQl9Ci0KLQkvKiBub3csIGRlY3J5cHQgcGZyYW1lIHdpdGggaGRybGVuIG9mZnNldCBhbmQgcGxlbiBsb25nICovCi0KLQlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsgLyogIDggaXMgZm9yIGV4dGl2ICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7Ci0JCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsCi0JCQkJICAgICAgcGZyYW1lLCBwbl92ZWN0b3IsIGkgKyAxKTsKLQotCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgJnBmcmFtZVtwYXlsb2FkX2luZGV4XSwgY2hhaW5fYnVmZmVyKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJCXBmcmFtZVtwYXlsb2FkX2luZGV4KytdID0gY2hhaW5fYnVmZmVyW2pdOwotCX0KLQotCWlmIChwYXlsb2FkX3JlbWFpbmRlciA+IDApIHsKLQkJLyogSWYgdGhlcmUgaXMgYSBzaG9ydCBmaW5hbCBibG9jaywgdGhlbiBwYWQgaXQsCi0JCSAqIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjawotCQkgKi8KLQkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywgcGZyYW1lLAotCQkJCSAgICAgIHBuX3ZlY3RvciwgbnVtX2Jsb2NrcyArIDEpOwotCi0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7Ci0JCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IHBmcmFtZVtwYXlsb2FkX2luZGV4ICsgal07Ci0JCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwotCQlmb3IgKGogPSAwOyBqIDwgcGF5bG9hZF9yZW1haW5kZXI7IGorKykKLQkJCXBmcmFtZVtwYXlsb2FkX2luZGV4KytdID0gY2hhaW5fYnVmZmVyW2pdOwotCX0KLQotCS8qIHN0YXJ0IHRvIGNhbGN1bGF0ZSB0aGUgbWljICovCi0JaWYgKChoZHJsZW4gKyBwbGVuICsgOCkgPD0gTUFYX01TR19TSVpFKQotCQltZW1jcHkobWVzc2FnZSwgcGZyYW1lLCAoaGRybGVuICsgcGxlbiArIDgpKTsgLyogOCBpcyBmb3IgZXh0IGl2IGxlbiAqLwotCi0JcG5fdmVjdG9yWzBdID0gcGZyYW1lW2hkcmxlbl07Ci0JcG5fdmVjdG9yWzFdID0gcGZyYW1lW2hkcmxlbiArIDFdOwotCXBuX3ZlY3RvclsyXSA9IHBmcmFtZVtoZHJsZW4gKyA0XTsKLQlwbl92ZWN0b3JbM10gPSBwZnJhbWVbaGRybGVuICsgNV07Ci0JcG5fdmVjdG9yWzRdID0gcGZyYW1lW2hkcmxlbiArIDZdOwotCXBuX3ZlY3Rvcls1XSA9IHBmcmFtZVtoZHJsZW4gKyA3XTsKLQotCWNvbnN0cnVjdF9taWNfaXYobWljX2l2LCBxY19leGlzdHMsIGE0X2V4aXN0cywgbWVzc2FnZSwKLQkJCSBwbGVuIC0gOCwgcG5fdmVjdG9yKTsKLQotCWNvbnN0cnVjdF9taWNfaGVhZGVyMShtaWNfaGVhZGVyMSwgaGRybGVuLCBtZXNzYWdlKTsKLQljb25zdHJ1Y3RfbWljX2hlYWRlcjIobWljX2hlYWRlcjIsIG1lc3NhZ2UsIGE0X2V4aXN0cywgcWNfZXhpc3RzKTsKLQotCXBheWxvYWRfcmVtYWluZGVyID0gKHBsZW4gLSA4KSAlIDE2OwotCW51bV9ibG9ja3MgPSAocGxlbiAtIDgpIC8gMTY7Ci0KLQkvKiBGaW5kIHN0YXJ0IG9mIHBheWxvYWQgKi8KLQlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsKLQotCS8qIENhbGN1bGF0ZSBNSUMgKi8KLQlhZXMxMjhrMTI4ZChrZXksIG1pY19pdiwgYWVzX291dCk7Ci0JYml0d2lzZV94b3IoYWVzX291dCwgbWljX2hlYWRlcjEsIGNoYWluX2J1ZmZlcik7Ci0JYWVzMTI4azEyOGQoa2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIyLCBjaGFpbl9idWZmZXIpOwotCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgJm1lc3NhZ2VbcGF5bG9hZF9pbmRleF0sIGNoYWluX2J1ZmZlcik7Ci0KLQkJcGF5bG9hZF9pbmRleCArPSAxNjsKLQkJYWVzMTI4azEyOGQoa2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwotCX0KLQotCS8qIEFkZCBvbiB0aGUgZmluYWwgcGF5bG9hZCBibG9jayBpZiBpdCBuZWVkcyBwYWRkaW5nICovCi0JaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkgewotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSAweDAwOwotCQlmb3IgKGogPSAwOyBqIDwgcGF5bG9hZF9yZW1haW5kZXI7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSBtZXNzYWdlW3BheWxvYWRfaW5kZXgrK107Ci0JCWJpdHdpc2VfeG9yKGFlc19vdXQsIHBhZGRlZF9idWZmZXIsIGNoYWluX2J1ZmZlcik7Ci0JCWFlczEyOGsxMjhkKGtleSwgY2hhaW5fYnVmZmVyLCBhZXNfb3V0KTsKLQl9Ci0KLQlmb3IgKGogPSAwIDsgaiA8IDg7IGorKykKLQkJbWljW2pdID0gYWVzX291dFtqXTsKLQotCS8qIEluc2VydCBNSUMgaW50byBwYXlsb2FkICovCi0JZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJbWVzc2FnZVtwYXlsb2FkX2luZGV4ICsgal0gPSBtaWNbal07Ci0KLQlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2Jsb2NrczsgaSsrKSB7Ci0JCWNvbnN0cnVjdF9jdHJfcHJlbG9hZChjdHJfcHJlbG9hZCwgYTRfZXhpc3RzLCBxY19leGlzdHMsCi0JCQkJICAgICAgbWVzc2FnZSwgcG5fdmVjdG9yLCBpICsgMSk7Ci0JCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwotCQliaXR3aXNlX3hvcihhZXNfb3V0LCAmbWVzc2FnZVtwYXlsb2FkX2luZGV4XSwgY2hhaW5fYnVmZmVyKTsKLQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JCQltZXNzYWdlW3BheWxvYWRfaW5kZXgrK10gPSBjaGFpbl9idWZmZXJbal07Ci0JfQotCi0JaWYgKHBheWxvYWRfcmVtYWluZGVyID4gMCkgewotCQkvKiBJZiB0aGVyZSBpcyBhIHNob3J0IGZpbmFsIGJsb2NrLCB0aGVuIHBhZCBpdCwKLQkJICogZW5jcnlwdCBpdCBhbmQgY29weSB0aGUgdW5wYWRkZWQgcGFydCBiYWNrCi0JCSAqLwotCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsIGE0X2V4aXN0cywgcWNfZXhpc3RzLAotCQkJCSAgICAgIG1lc3NhZ2UsIHBuX3ZlY3RvciwgbnVtX2Jsb2NrcyArIDEpOwotCi0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7Ci0JCWZvciAoaiA9IDA7IGogPCBwYXlsb2FkX3JlbWFpbmRlcjsgaisrKQotCQkJcGFkZGVkX2J1ZmZlcltqXSA9IG1lc3NhZ2VbcGF5bG9hZF9pbmRleCArIGpdOwotCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCi0JCQltZXNzYWdlW3BheWxvYWRfaW5kZXgrK10gPSBjaGFpbl9idWZmZXJbal07Ci0JfQotCi0JLyogRW5jcnlwdCB0aGUgTUlDICovCi0JY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywgbWVzc2FnZSwKLQkJCSAgICAgIHBuX3ZlY3RvciwgMCk7Ci0KLQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7Ci0JZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJcGFkZGVkX2J1ZmZlcltqXSA9IG1lc3NhZ2VbaiArIGhkcmxlbiArIDggKyBwbGVuIC0gOF07Ci0KLQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKLQliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwotCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0JCW1lc3NhZ2VbcGF5bG9hZF9pbmRleCsrXSA9IGNoYWluX2J1ZmZlcltqXTsKLQotCS8qIGNvbXBhcmUgdGhlIG1pYyAqLwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYgKHBmcmFtZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSAhPSBtZXNzYWdlW2hkcmxlbiArIDggKyBwbGVuIC0gOCArIGldKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJCQkgIiVzOm1pYyBjaGVjayBlcnJvciBtaWNbJWRdOiBwZnJhbWUoJXgpICE9IG1lc3NhZ2UoJXgpXG4iLAotCQkJCSBfX2Z1bmNfXywgaSwKLQkJCQkgcGZyYW1lW2hkcmxlbiArIDggKyBwbGVuIC0gOCArIGldLAotCQkJCSBtZXNzYWdlW2hkcmxlbiArIDggKyBwbGVuIC0gOCArIGldKTsKLQkJCURCR184NzIzQSgiJXM6bWljIGNoZWNrIGVycm9yIG1pY1slZF06IHBmcmFtZSgleCkgIT0gbWVzc2FnZSgleClcbiIsCi0JCQkJICBfX2Z1bmNfXywgaSwKLQkJCQkgIHBmcmFtZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSwKLQkJCQkgIG1lc3NhZ2VbaGRybGVuICsgOCArIHBsZW4gLSA4ICsgaV0pOwotCQkJcmVzID0gX0ZBSUw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotaW50IHJ0d19hZXNfZGVjcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpCi17CS8qICBleGNsdWRlIElDViAqLwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhaW5mbzsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdmZyYW1lLT5wa3Q7Ci0JaW50IGxlbmd0aDsKLQl1OCAqcGZyYW1lLCAqcHJ3c2tleTsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlwZnJhbWUgPSBza2ItPmRhdGE7Ci0JLyogNCBzdGFydCB0byBlbmNyeXB0IGVhY2ggZnJhZ21lbnQgKi8KLQlpZiAocHJ4YXR0cmliLT5lbmNyeXB0ICE9IFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApCi0JCXJldHVybiBfRkFJTDsKLQotCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCAmcHJ4YXR0cmliLT50YVswXSk7Ci0JaWYgKCFzdGFpbmZvKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkJICIlczogc3RhaW5mbyA9PSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCSAiJXM6IHN0YWluZm8hPSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpIHsKLQkJLyogaW4gY29uY3VycmVudCB3ZSBzaG91bGQgdXNlIHN3IGRlY3J5cHQgaW4KLQkJICogZ3JvdXAga2V5LCBzbyB3ZSByZW1vdmUgdGhpcyBtZXNzYWdlCi0JCSAqLwotCQlpZiAoIXBzZWN1cml0eXByaXYtPmJpbnN0YWxsR3Jwa2V5KSB7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCURCR184NzIzQSgiJXM6cnggYmMvbWMgcGFja2V0cywgYnV0IGRpZG4ndCBpbnN0YWxsICIKLQkJCQkgICJncm91cCBrZXkhISEhISEhISEhXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJcHJ3c2tleSA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbcHJ4YXR0cmliLT5rZXlfaW5kZXhdLnNrZXk7Ci0JCWlmIChwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWQgIT0gcHJ4YXR0cmliLT5rZXlfaW5kZXgpIHsKLQkJCURCR184NzIzQSgibm90IG1hdGNoIHBhY2tldF9pbmRleCA9JWQsIGluc3RhbGxfaW5kZXggPSIKLQkJCQkgICIlZFxuIiwgcHJ4YXR0cmliLT5rZXlfaW5kZXgsCi0JCQkJICBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWQpOwotCQkJcmVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9IGVsc2UgewotCQlwcndza2V5ID0gJnN0YWluZm8tPmRvdDExODAyMXhfVW5jc3RLZXkuc2tleVswXTsKLQl9Ci0KLQlsZW5ndGggPSBza2ItPmxlbiAtIHByeGF0dHJpYi0+aGRybGVuIC0JcHJ4YXR0cmliLT5pdl9sZW47Ci0KLQlyZXMgPSBhZXNfZGVjaXBoZXIocHJ3c2tleSwgcHJ4YXR0cmliLT5oZHJsZW4sIHBmcmFtZSwgbGVuZ3RoKTsKLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBydHdfdXNlX3RraXBrZXlfaGFuZGxlcjIzYSh2b2lkICpmdW5jdGlvbl9jb250ZXh0KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBmdW5jdGlvbl9jb250ZXh0OwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCSAiXl5eJXMgXl5eXG4iLCBfX2Z1bmNfXyk7Ci0JcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSA9IDE7Ci0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCSAiXl5eJXMgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSA9JWReXl5cbiIsCi0JCSBfX2Z1bmNfXywgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3NyZXNldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zcmVzZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhMjlkOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3NyZXNldC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8cnR3X3NyZXNldC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotdm9pZCBydHdfc3Jlc2V0X2luaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgKnBzcnRwcml2ID0gJnBIYWxEYXRhLT5zcmVzdHByaXY7Ci0KLQltdXRleF9pbml0KCZwc3J0cHJpdi0+c2lsZW50cmVzZXRfbXV0ZXgpOwotCXBzcnRwcml2LT5zaWxlbnRfcmVzZXRfaW5wcm9ncmVzcyA9IGZhbHNlOwotCXBzcnRwcml2LT5sYXN0X3R4X3RpbWUgPSAwOwotCXBzcnRwcml2LT5sYXN0X3R4X2NvbXBsZXRlX3RpbWUgPSAwOwotfQotCi12b2lkIHJ0d19zcmVzZXRfcmVzZXRfdmFsdWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgKnBzcnRwcml2ID0gJnBIYWxEYXRhLT5zcmVzdHByaXY7Ci0KLQlwc3J0cHJpdi0+c2lsZW50X3Jlc2V0X2lucHJvZ3Jlc3MgPSBmYWxzZTsKLQlwc3J0cHJpdi0+bGFzdF90eF90aW1lID0gMDsKLQlwc3J0cHJpdi0+bGFzdF90eF9jb21wbGV0ZV90aW1lID0gMDsKLX0KLQotYm9vbCBydHdfc3Jlc2V0X2lucHJvZ3Jlc3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnByaW1hcnlfYWRhcHRlciA9IEdFVF9QUklNQVJZX0FEQVBURVIocGFkYXB0ZXIpOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocHJpbWFyeV9hZGFwdGVyKTsKLQotCXJldHVybiBwSGFsRGF0YS0+c3Jlc3Rwcml2LnNpbGVudF9yZXNldF9pbnByb2dyZXNzOwotfQotCi1zdGF0aWMgdm9pZCBzcmVzZXRfcmVzdG9yZV9zZWN1cml0eV9zdGF0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2Lm1sbWV4dF9pbmZvOwotCXU4IHZhbDg7Ci0KLQlpZiAocG1sbWVpbmZvLT5hdXRoX2FsZ28gPT0gZG90MTFBdXRoQWxncnRobV84MDIxWCkKLQkJdmFsOCA9IDB4Y2M7Ci0JZWxzZQotCQl2YWw4ID0gMHhjZjsKLQotCXJ0bDg3MjNhX3NldF9zZWNfY2ZnKHBhZGFwdGVyLCB2YWw4KTsKLQotCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCB8fAotCSAgICBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBnZXRfYnNzaWQobWxtZXByaXYpKTsKLQkJaWYgKHBzdGEgPT0gTlVMTCkgewotCQkJLyogREVCVUdfRVJSKCgiU2V0IHdwYV9zZXRfZW5jcnlwdGlvbjogT2J0YWluIFN0YV9pbmZvIGZhaWxcbiIpKTsgKi8KLQkJfSBlbHNlIHsKLQkJCS8qIHBhaXJ3aXNlIGtleSAqLwotCQkJcnR3X3NldHN0YWtleV9jbWQyM2EocGFkYXB0ZXIsICh1bnNpZ25lZCBjaGFyICopcHN0YSwgdHJ1ZSk7Ci0JCQkvKiBncm91cCBrZXkgKi8KLQkJCXJ0d19zZXRfa2V5MjNhKHBhZGFwdGVyLCZwYWRhcHRlci0+c2VjdXJpdHlwcml2LCBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExODAyMVhHcnBLZXlpZCwgMCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHNyZXNldF9yZXN0b3JlX25ldHdvcmtfc3RhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXU4IHRocmVzaG9sZDsKLQotCXJ0d19zZXRvcG1vZGVfY21kMjNhKHBhZGFwdGVyLCBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKTsKLQotCS8qICBUSCA9IDEgPT4gbWVhbnMgdGhhdCBpbnZhbGlkYXRlIHVzYiByeCBhZ2dyZWdhdGlvbiAqLwotCS8qICBUSCA9IDAgPT4gbWVhbnMgdGhhdCB2YWxpZGF0ZSB1c2IgcnggYWdncmVnYXRpb24sIHVzZSBpbml0IHZhbHVlLiAqLwotCWlmIChtbG1lcHJpdi0+aHRwcml2Lmh0X29wdGlvbikgewotCQlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWMgPT0gMSkKLQkJCXRocmVzaG9sZCA9IDE7Ci0JCWVsc2UKLQkJCXRocmVzaG9sZCA9IDA7Ci0JfSBlbHNlCi0JCXRocmVzaG9sZCA9IDE7Ci0KLQlydGw4NzIzYV9zZXRfcnhkbWFfYWdnX3BnX3RoKHBhZGFwdGVyLCB0aHJlc2hvbGQpOwotCi0Jc2V0X2NoYW5uZWxfYndtb2RlMjNhKHBhZGFwdGVyLCBwbWxtZWV4dC0+Y3VyX2NoYW5uZWwsCi0JCQkgICAgICBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOwotCi0JaHdfdmFyX3NldF9ic3NpZChwYWRhcHRlciwgcG1sbWVpbmZvLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCWh3X3Zhcl9zZXRfbWxtZV9qb2luKHBhZGFwdGVyLCAwKTsKLQotCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMocGFkYXB0ZXIsIHBtbG1laW5mby0+c3RhdGUgJiAweDMpOwotCi0JbWxtZWV4dF9qb2luYnNzX2V2ZW50X2NhbGxiYWNrMjNhKHBhZGFwdGVyLCAxKTsKLQkvKiByZXN0b3JlIFNlcXVlbmNlIE5vLiAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19OUU9TX1NFUSwgcGFkYXB0ZXItPnhtaXRwcml2Lm5xb3Nfc3NuKTsKLQotCXNyZXNldF9yZXN0b3JlX3NlY3VyaXR5X3N0YXRpb24ocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBzcmVzZXRfcmVzdG9yZV9uZXR3b3JrX3N0YXR1cyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKm1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmIChjaGVja19md3N0YXRlKG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBmd3N0YXRlOjB4JTA4eCAtIFdJRklfU1RBVElPTl9TVEFURVxuIiwKLQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJICBnZXRfZndzdGF0ZShtbG1lcHJpdikpOwotCQlzcmVzZXRfcmVzdG9yZV9uZXR3b3JrX3N0YXRpb24ocGFkYXB0ZXIpOwotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IGZ3c3RhdGU6MHglMDh4IC0gV0lGSV9BUF9TVEFURVxuIiwKLQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJICBnZXRfZndzdGF0ZShtbG1lcHJpdikpOwotCQlydHdfYXBfcmVzdG9yZV9uZXR3b3JrKHBhZGFwdGVyKTsKLSNlbmRpZgotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IGZ3c3RhdGU6MHglMDh4IC0gV0lGSV9BREhPQ19TVEFURVxuIiwKLQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJICBnZXRfZndzdGF0ZShtbG1lcHJpdikpOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBmd3N0YXRlOjB4JTA4eCAtID8/P1xuIiwgX19mdW5jX18sCi0JCQkgIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLCBnZXRfZndzdGF0ZShtbG1lcHJpdikpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3Jlc2V0X3N0b3BfYWRhcHRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCWlmIChwYWRhcHRlciA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQotCWlmICghcnR3X25ldGlmX3F1ZXVlX3N0b3BwZWQocGFkYXB0ZXItPnBuZXRkZXYpKQotCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocGFkYXB0ZXItPnBuZXRkZXYpOwotCi0JcnR3X2NhbmNlbF9hbGxfdGltZXIyM2EocGFkYXB0ZXIpOwotCi0JLyogVE9ETzogT1MgYW5kIEhDSSBpbmRlcGVuZGVudCAqLwotCXRhc2tsZXRfa2lsbCgmcHhtaXRwcml2LT54bWl0X3Rhc2tsZXQpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkKLQkJcnR3X3NjYW5fYWJvcnQyM2EocGFkYXB0ZXIpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykpCi0JCXJ0dzIzYV9qb2luX3RvX2hhbmRsZXIoKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBzcmVzZXRfc3RhcnRfYWRhcHRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCWlmIChwYWRhcHRlciA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpCi0JCXNyZXNldF9yZXN0b3JlX25ldHdvcmtfc3RhdHVzKHBhZGFwdGVyKTsKLQotCS8qIFRPRE86IE9TIGFuZCBIQ0kgaW5kZXBlbmRlbnQgKi8KLQl0YXNrbGV0X2hpX3NjaGVkdWxlKCZweG1pdHByaXYtPnhtaXRfdGFza2xldCk7Ci0KLQltb2RfdGltZXIoJnBhZGFwdGVyLT5tbG1lcHJpdi5keW5hbWljX2Noa190aW1lciwKLQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDAwKSk7Ci0KLQlpZiAocnR3X25ldGlmX3F1ZXVlX3N0b3BwZWQocGFkYXB0ZXItPnBuZXRkZXYpKQotCQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMocGFkYXB0ZXItPnBuZXRkZXYpOwotfQotCi12b2lkIHJ0d19zcmVzZXRfcmVzZXQoc3RydWN0IHJ0d19hZGFwdGVyICphY3RpdmVfYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gR0VUX1BSSU1BUllfQURBUFRFUihhY3RpdmVfYWRhcHRlcik7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IHNyZXNldF9wcml2ICpwc3J0cHJpdiA9ICZwSGFsRGF0YS0+c3Jlc3Rwcml2OwotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cnByaXYgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JbXV0ZXhfbG9jaygmcHNydHByaXYtPnNpbGVudHJlc2V0X211dGV4KTsKLQlwc3J0cHJpdi0+c2lsZW50X3Jlc2V0X2lucHJvZ3Jlc3MgPSB0cnVlOwotCXB3cnByaXYtPmNoYW5nZV9yZnB3cnN0YXRlID0gcmZfb2ZmOwotCi0Jc3Jlc2V0X3N0b3BfYWRhcHRlcihwYWRhcHRlcik7Ci0KLQlpcHNfZW50ZXIyM2EocGFkYXB0ZXIpOwotCWlwc19sZWF2ZTIzYShwYWRhcHRlcik7Ci0KLQlzcmVzZXRfc3RhcnRfYWRhcHRlcihwYWRhcHRlcik7Ci0JcHNydHByaXYtPnNpbGVudF9yZXNldF9pbnByb2dyZXNzID0gZmFsc2U7Ci0JbXV0ZXhfdW5sb2NrKCZwc3J0cHJpdi0+c2lsZW50cmVzZXRfbXV0ZXgpOwotCi0JREJHXzg3MjNBKCIlcyBkb25lIGluICVkIG1zXG4iLCBfX2Z1bmNfXywKLQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zdGFfbWd0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3N0YV9tZ3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTliNzc4Yy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3N0YV9tZ3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUV19TVEFfTUdUX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KLSNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0jaW5jbHVkZSA8c3RhX2luZm8uaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotc3RhdGljIGNvbnN0IHU4IGJjX2FkZHJbRVRIX0FMRU5dID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwotCi1zdGF0aWMgdm9pZCBfcnR3X2luaXRfc3RhaW5mbyhzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JbWVtc2V0KCh1OCAqKXBzdGEsIDAsIHNpemVvZihzdHJ1Y3Qgc3RhX2luZm8pKTsKLQlzcGluX2xvY2tfaW5pdCgmcHN0YS0+bG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBzdGEtPmxpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZwc3RhLT5oYXNoX2xpc3QpOwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHN0YS0+c2xlZXBfcSk7Ci0JcHN0YS0+c2xlZXBxX2xlbiA9IDA7Ci0JX3J0d19pbml0X3N0YV94bWl0X3ByaXYyM2EoJnBzdGEtPnN0YV94bWl0cHJpdik7Ci0JX3J0d19pbml0X3N0YV9yZWN2X3ByaXYyM2EoJnBzdGEtPnN0YV9yZWN2cHJpdik7Ci0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JSU5JVF9MSVNUX0hFQUQoJnBzdGEtPmFzb2NfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnBzdGEtPmF1dGhfbGlzdCk7Ci0JcHN0YS0+ZXhwaXJlX3RvID0gMDsKLQlwc3RhLT5mbGFncyA9IDA7Ci0JcHN0YS0+Y2FwYWJpbGl0eSA9IDA7Ci0JcHN0YS0+YnBhaXJ3aXNlX2tleV9pbnN0YWxsZWQgPSBmYWxzZTsKLQlwc3RhLT5ub25lcnBfc2V0ID0gMDsKLQlwc3RhLT5ub19zaG9ydF9zbG90X3RpbWVfc2V0ID0gMDsKLQlwc3RhLT5ub19zaG9ydF9wcmVhbWJsZV9zZXQgPSAwOwotCXBzdGEtPm5vX2h0X2dmX3NldCA9IDA7Ci0JcHN0YS0+bm9faHRfc2V0ID0gMDsKLQlwc3RhLT5odF8yMG1oel9zZXQgPSAwOwotCXBzdGEtPmtlZXBfYWxpdmVfdHJ5Y250ID0gMDsKLSNlbmRpZgkvKiAgQ09ORklHXzg3MjNBVV9BUF9NT0RFICovCi19Ci0KLWludCBfcnR3X2luaXRfc3RhX3ByaXYyM2Eoc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdikKLXsKLQlpbnQgaTsKLQotCXNwaW5fbG9ja19pbml0KCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcHN0YXByaXYtPmFzb2Nfc3RhX2NvdW50ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQTsgaSsrKQotCQlJTklUX0xJU1RfSEVBRCgmcHN0YXByaXYtPnN0YV9oYXNoW2ldKTsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXBzdGFwcml2LT5zdGFfZHpfYml0bWFwID0gMDsKLQlwc3RhcHJpdi0+dGltX2JpdG1hcCA9IDA7Ci0JSU5JVF9MSVNUX0hFQUQoJnBzdGFwcml2LT5hc29jX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZwc3RhcHJpdi0+YXV0aF9saXN0KTsKLQlzcGluX2xvY2tfaW5pdCgmcHN0YXByaXYtPmFzb2NfbGlzdF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQlwc3RhcHJpdi0+YXNvY19saXN0X2NudCA9IDA7Ci0JcHN0YXByaXYtPmF1dGhfbGlzdF9jbnQgPSAwOwotCXBzdGFwcml2LT5hdXRoX3RvID0gMzsgLyogIDMqMiA9IDYgc2VjICovCi0JcHN0YXByaXYtPmFzc29jX3RvID0gMzsKLQkvKiBwc3RhcHJpdi0+ZXhwaXJlX3RvID0gOTAwOyAgOTAwKjIgPSAxODAwIHNlYyA9IDMwIG1pbiwKLQkgICAgZXhwaXJlIGFmdGVyIG5vIGFueSB0cmFmZmljLiAqLwotCS8qIHBzdGFwcml2LT5leHBpcmVfdG8gPSAzMDsgIDMwKjIgPSA2MCBzZWMgPSAxIG1pbiwKLQkgICAgZXhwaXJlIGFmdGVyIG5vIGFueSB0cmFmZmljLiAqLwotCXBzdGFwcml2LT5leHBpcmVfdG8gPSAzOyAvKiAgMyoyID0gNiBzZWMgKi8KLQlwc3RhcHJpdi0+bWF4X251bV9zdGEgPSBOVU1fU1RBOwotI2VuZGlmCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1pbnQgX3J0d19mcmVlX3N0YV9wcml2MjNhKHN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhLCAqcHRtcDsKLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmw7Ci0JaW50IGluZGV4OwotCi0JaWYgKHBzdGFwcml2KSB7Ci0JCS8qCWRlbGV0ZSBhbGwgcmVvcmRlcmluZ19jdHJsX3RpbWVyCQkqLwotCQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX1NUQTsgaW5kZXgrKykgewotCQkJcGhlYWQgPSAmcHN0YXByaXYtPnN0YV9oYXNoW2luZGV4XTsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwc3RhLCBwdG1wLCBwaGVhZCwgaGFzaF9saXN0KSB7Ci0JCQkJaW50IGk7Ci0KLQkJCQlmb3IgKGkgPSAwOyBpIDwgMTYgOyBpKyspIHsKLQkJCQkJcHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW2ldOwotCQkJCQlkZWxfdGltZXJfc3luYygmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQkJLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQl9Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdHJ1Y3Qgc3RhX2luZm8gKgotcnR3X2FsbG9jX3N0YWluZm8yM2Eoc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiwgY29uc3QgdTggKmh3YWRkciwgZ2ZwX3QgZ2ZwKQotewotCXN0cnVjdCBsaXN0X2hlYWQJKnBoYXNoX2xpc3Q7Ci0Jc3RydWN0IHN0YV9pbmZvCSpwc3RhOwotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKLQlzMzIJaW5kZXg7Ci0JaW50IGkgPSAwOwotCXUxNiAgd1J4U2VxSW5pdGlhbFZhbHVlID0gMHhmZmZmOwotCi0JcHN0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdGFfaW5mbyksIGdmcCk7Ci0JaWYgKCFwc3RhKQotCQlyZXR1cm4gTlVMTDsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCi0JX3J0d19pbml0X3N0YWluZm8ocHN0YSk7Ci0KLQlwc3RhLT5wYWRhcHRlciA9IHBzdGFwcml2LT5wYWRhcHRlcjsKLQotCWV0aGVyX2FkZHJfY29weShwc3RhLT5od2FkZHIsIGh3YWRkcik7Ci0KLQlpbmRleCA9IHdpZmlfbWFjX2hhc2goaHdhZGRyKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zdGFfbWd0X2NfLCBfZHJ2X2luZm9fLAotCQkgInJ0d19hbGxvY19zdGFpbmZvMjNhOiBpbmRleCAgPSAleFxuIiwgaW5kZXgpOwotCWlmIChpbmRleCA+PSBOVU1fU1RBKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zdGFfbWd0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkVSUk9SID0+IHJ0d19hbGxvY19zdGFpbmZvMjNhOiBpbmRleCA+PSBOVU1fU1RBXG4iKTsKLQkJcHN0YSA9IE5VTEw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JcGhhc2hfbGlzdCA9ICZwc3RhcHJpdi0+c3RhX2hhc2hbaW5kZXhdOwotCi0JbGlzdF9hZGRfdGFpbCgmcHN0YS0+aGFzaF9saXN0LCBwaGFzaF9saXN0KTsKLQotCXBzdGFwcml2LT5hc29jX3N0YV9jb3VudCsrOwotCi0vKiAgRm9yIHRoZSBTTUMgcm91dGVyLCB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIGZpcnN0IHBhY2tldCBvZiBXUFMKLSAgICAgaGFuZHNoYWtlIHdpbGwgYmUgMC4gKi8KLS8qICBJbiB0aGlzIGNhc2UsIHRoaXMgcGFja2V0IHdpbGwgYmUgZHJvcHBlZCBieSByZWN2X2RlY2FjaGUgZnVuY3Rpb24KLSAgICBpZiB3ZSB1c2UgdGhlIDB4MDAgYXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRpZF9yeHNlcSB2YXJpYWJsZS4gKi8KLS8qICBTbywgd2UgaW5pdGlhbGl6ZSB0aGUgdGlkX3J4c2VxIHZhcmlhYmxlIGFzIHRoZSAweGZmZmYuICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKLQkJbWVtY3B5KCZwc3RhLT5zdGFfcmVjdnByaXYucnhjYWNoZS50aWRfcnhzZXFbaV0sCi0JCQkmd1J4U2VxSW5pdGlhbFZhbHVlLCAyKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zdGFfbWd0X2NfLCBfZHJ2X2luZm9fLAotCQkgImFsbG9jIG51bWJlcl8lZCBzdGFpbmZvICB3aXRoIGh3YWRkciA9ICVwTVxuIiwKLQkJIHBzdGFwcml2LT5hc29jX3N0YV9jb3VudCwgaHdhZGRyKTsKLQotCWluaXRfYWRkYmFfcmV0cnlfdGltZXIyM2EocHN0YSk7Ci0KLQkvKiBmb3IgQS1NUERVIFJ4IHJlb3JkZXJpbmcgYnVmZmVyIGNvbnRyb2wgKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07Ci0KLQkJcHJlb3JkZXJfY3RybC0+cGFkYXB0ZXIgPSBwc3RhcHJpdi0+cGFkYXB0ZXI7Ci0KLQkJcHJlb3JkZXJfY3RybC0+ZW5hYmxlID0gZmFsc2U7Ci0KLQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gMHhmZmZmOwotCQlwcmVvcmRlcl9jdHJsLT53ZW5kX2IgPSAweGZmZmY7Ci0JCS8qIHByZW9yZGVyX2N0cmwtPndzaXplX2IgPSAoTlJfUkVDVkJVRkYtMik7ICovCi0JCXByZW9yZGVyX2N0cmwtPndzaXplX2IgPSA2NDsvKiA2NDsgKi8KLQotCQlfcnR3X2luaXRfcXVldWUyM2EoJnByZW9yZGVyX2N0cmwtPnBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlKTsKLQotCQlydHdfaW5pdF9yZWN2X3RpbWVyMjNhKHByZW9yZGVyX2N0cmwpOwotCX0KLQkvKiBpbml0IGZvciBETSAqLwotCXBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9ICgtMSk7Ci0JcHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRDQ0sgPSAoLTEpOwotCi0JLyogaW5pdCBmb3IgdGhlIHNlcXVlbmNlIG51bWJlciBvZiByZWNlaXZlZCBtYW5hZ2VtZW50IGZyYW1lICovCi0JcHN0YS0+UnhNZ210RnJhbWVTZXFOdW0gPSAweGZmZmY7Ci1leGl0OgotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcmV0dXJuIHBzdGE7Ci19Ci0KLS8qICB1c2luZyBwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayB0byBwcm90ZWN0ICovCi1pbnQgcnR3X2ZyZWVfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwotCXN0cnVjdAlzdGFfeG1pdF9wcml2CSpwc3RheG1pdHByaXY7Ci0Jc3RydWN0CXhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QJc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBod194bWl0ICpwaHd4bWl0OwotCWludCBpOwotCi0JaWYgKCFwc3RhKQotCQlnb3RvIGV4aXQ7Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGEtPmxvY2spOwotCXBzdGEtPnN0YXRlICY9IH5fRldfTElOS0VEOwotCXNwaW5fdW5sb2NrX2JoKCZwc3RhLT5sb2NrKTsKLQotCXBzdGF4bWl0cHJpdiA9ICZwc3RhLT5zdGFfeG1pdHByaXY7Ci0KLQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0KLQlydHdfZnJlZV94bWl0ZnJhbWVfcXVldWUyM2EocHhtaXRwcml2LCAmcHN0YS0+c2xlZXBfcSk7Ci0JcHN0YS0+c2xlZXBxX2xlbiA9IDA7Ci0KLQkvKiB2byAqLwotCXJ0d19mcmVlX3htaXRmcmFtZV9xdWV1ZTIzYShweG1pdHByaXYsICZwc3RheG1pdHByaXYtPnZvX3Euc3RhX3BlbmRpbmcpOwotCWxpc3RfZGVsX2luaXQoJnBzdGF4bWl0cHJpdi0+dm9fcS50eF9wZW5kaW5nKTsKLQlwaHd4bWl0ID0gcHhtaXRwcml2LT5od3htaXRzOwotCXBod3htaXQtPmFjY250IC09IHBzdGF4bWl0cHJpdi0+dm9fcS5xY250OwotCXBzdGF4bWl0cHJpdi0+dm9fcS5xY250ID0gMDsKLQotCS8qIHZpICovCi0JcnR3X2ZyZWVfeG1pdGZyYW1lX3F1ZXVlMjNhKHB4bWl0cHJpdiwgJnBzdGF4bWl0cHJpdi0+dmlfcS5zdGFfcGVuZGluZyk7Ci0JbGlzdF9kZWxfaW5pdCgmcHN0YXhtaXRwcml2LT52aV9xLnR4X3BlbmRpbmcpOwotCXBod3htaXQgPSBweG1pdHByaXYtPmh3eG1pdHMrMTsKLQlwaHd4bWl0LT5hY2NudCAtPSBwc3RheG1pdHByaXYtPnZpX3EucWNudDsKLQlwc3RheG1pdHByaXYtPnZpX3EucWNudCA9IDA7Ci0KLQkvKiBiZSAqLwotCXJ0d19mcmVlX3htaXRmcmFtZV9xdWV1ZTIzYShweG1pdHByaXYsICZwc3RheG1pdHByaXYtPmJlX3Euc3RhX3BlbmRpbmcpOwotCWxpc3RfZGVsX2luaXQoJnBzdGF4bWl0cHJpdi0+YmVfcS50eF9wZW5kaW5nKTsKLQlwaHd4bWl0ID0gcHhtaXRwcml2LT5od3htaXRzKzI7Ci0JcGh3eG1pdC0+YWNjbnQgLT0gcHN0YXhtaXRwcml2LT5iZV9xLnFjbnQ7Ci0JcHN0YXhtaXRwcml2LT5iZV9xLnFjbnQgPSAwOwotCi0JLyogYmsgKi8KLQlydHdfZnJlZV94bWl0ZnJhbWVfcXVldWUyM2EocHhtaXRwcml2LCAmcHN0YXhtaXRwcml2LT5ia19xLnN0YV9wZW5kaW5nKTsKLQlsaXN0X2RlbF9pbml0KCZwc3RheG1pdHByaXYtPmJrX3EudHhfcGVuZGluZyk7Ci0JcGh3eG1pdCA9IHB4bWl0cHJpdi0+aHd4bWl0cyszOwotCXBod3htaXQtPmFjY250IC09IHBzdGF4bWl0cHJpdi0+YmtfcS5xY250OwotCXBzdGF4bWl0cHJpdi0+YmtfcS5xY250ID0gMDsKLQotCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JbGlzdF9kZWxfaW5pdCgmcHN0YS0+aGFzaF9saXN0KTsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXywgX2Rydl9lcnJfLAotCQkgImZyZWUgbnVtYmVyXyVkIHN0YWluZm8gIHdpdGggaHdhZGRyID0gJXBNXG4iLAotCQkgcHN0YXByaXYtPmFzb2Nfc3RhX2NvdW50LCBwc3RhLT5od2FkZHIpOwotCXBzdGFwcml2LT5hc29jX3N0YV9jb3VudC0tOwotCi0JLyogIHJlLWluaXQgc3RhX2luZm87IDIwMDYxMTE0ICB3aWxsIGJlIGluaXQgaW4gYWxsb2Nfc3RhaW5mbyAqLwotCS8qIF9ydHdfaW5pdF9zdGFfeG1pdF9wcml2MjNhKCZwc3RhLT5zdGFfeG1pdHByaXYpOyAqLwotCS8qIF9ydHdfaW5pdF9zdGFfcmVjdl9wcml2MjNhKCZwc3RhLT5zdGFfcmVjdnByaXYpOyAqLwotCi0JZGVsX3RpbWVyX3N5bmMoJnBzdGEtPmFkZGJhX3JldHJ5X3RpbWVyKTsKLQotCS8qIGZvciBBLU1QRFUgUnggcmVvcmRlcmluZyBidWZmZXIgY29udHJvbCwKLQkgICBjYW5jZWwgcmVvcmRlcmluZ19jdHJsX3RpbWVyICovCi0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJc3RydWN0IGxpc3RfaGVhZAkqcGhlYWQsICpwbGlzdDsKLQkJc3RydWN0IHJlY3ZfZnJhbWUgKnByZnJhbWU7Ci0JCXN0cnVjdCBydHdfcXVldWUgKnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQotCQlwcmVvcmRlcl9jdHJsID0gJnBzdGEtPnJlY3ZyZW9yZGVyX2N0cmxbaV07Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7Ci0KLQkJcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlID0KLQkJCSZwcmVvcmRlcl9jdHJsLT5wZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZTsKLQotCQlzcGluX2xvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7Ci0JCXBoZWFkID0JCWdldF9saXN0X2hlYWQocHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlKTsKLQkJcGxpc3QgPSBwaGVhZC0+bmV4dDsKLQotCQl3aGlsZSAoIWxpc3RfZW1wdHkocGhlYWQpKSB7Ci0JCQlwcmZyYW1lID0gY29udGFpbmVyX29mKHBsaXN0LCBzdHJ1Y3QgcmVjdl9mcmFtZSwgbGlzdCk7Ci0JCQlwbGlzdCA9IHBsaXN0LT5uZXh0OwotCQkJbGlzdF9kZWxfaW5pdCgmcHJmcmFtZS0+bGlzdCk7Ci0JCQlydHdfZnJlZV9yZWN2ZnJhbWUyM2EocHJmcmFtZSk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7Ci0JfQotCWlmICghKHBzdGEtPnN0YXRlICYgV0lGSV9BUF9TVEFURSkpCi0JCXJ0bDg3MjNhX1NldEhhbE9ETVZhcihwYWRhcHRlciwgSEFMX09ETV9TVEFfSU5GTywgcHN0YSwgZmFsc2UpOwotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPmF1dGhfbGlzdF9sb2NrKTsKLQlpZiAoIWxpc3RfZW1wdHkoJnBzdGEtPmF1dGhfbGlzdCkpIHsKLQkJbGlzdF9kZWxfaW5pdCgmcHN0YS0+YXV0aF9saXN0KTsKLQkJcHN0YXByaXYtPmF1dGhfbGlzdF9jbnQtLTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5hdXRoX2xpc3RfbG9jayk7Ci0KLQlwc3RhLT5leHBpcmVfdG8gPSAwOwotCi0JcHN0YS0+c2xlZXBxX2FjX2xlbiA9IDA7Ci0JcHN0YS0+cW9zX2luZm8gPSAwOwotCi0JcHN0YS0+bWF4X3NwX2xlbiA9IDA7Ci0JcHN0YS0+dWFwc2RfYmsgPSAwOwotCXBzdGEtPnVhcHNkX2JlID0gMDsKLQlwc3RhLT51YXBzZF92aSA9IDA7Ci0JcHN0YS0+dWFwc2Rfdm8gPSAwOwotCi0JcHN0YS0+aGFzX2xlZ2FjeV9hYyA9IDA7Ci0KLQlwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCAmPSB+Q0hLQklUKHBzdGEtPmFpZCk7Ci0JcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkNIS0JJVChwc3RhLT5haWQpOwotCi0JaWYgKChwc3RhLT5haWQgPiAwKSAmJiAocHN0YXByaXYtPnN0YV9haWRbcHN0YS0+YWlkIC0gMV0gPT0gcHN0YSkpIHsKLQkJcHN0YXByaXYtPnN0YV9haWRbcHN0YS0+YWlkIC0gMV0gPSBOVUxMOwotCQlwc3RhLT5haWQgPSAwOwotCX0KLSNlbmRpZgkvKiAgQ09ORklHXzg3MjNBVV9BUF9NT0RFICovCi0KLQlrZnJlZShwc3RhKTsKLWV4aXQ6Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKiAgZnJlZSBhbGwgc3RhaW5mbyB3aGljaCBpbiBzdGFfaGFzaFthbGxdICovCi12b2lkIHJ0d19mcmVlX2FsbF9zdGFpbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhLCAqcHRtcDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcGJjbWNfc3RhaW5mbyA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQlzMzIgaW5kZXg7Ci0KLQlpZiAocHN0YXByaXYtPmFzb2Nfc3RhX2NvdW50ID09IDEpCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19iaCgmcHN0YXByaXYtPnN0YV9oYXNoX2xvY2spOwotCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE5VTV9TVEE7IGluZGV4KyspIHsKLQkJcGhlYWQgPSAmcHN0YXByaXYtPnN0YV9oYXNoW2luZGV4XTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBzdGEsIHB0bXAsIHBoZWFkLCBoYXNoX2xpc3QpIHsKLQkJCWlmIChwYmNtY19zdGFpbmZvICE9IHBzdGEpCi0JCQkJcnR3X2ZyZWVfc3RhaW5mbzIzYShwYWRhcHRlciwgcHN0YSk7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLX0KLQotLyogYW55IHN0YXRpb24gYWxsb2NhdGVkIGNhbiBiZSBzZWFyY2hlZCBieSBoYXNoIGxpc3QgKi8KLXN0cnVjdCBzdGFfaW5mbyAqcnR3X2dldF9zdGFpbmZvMjNhKHN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYsIGNvbnN0IHU4ICpod2FkZHIpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHN0YV9pbmZvICpwb3MsICpwc3RhID0gTlVMTDsKLQl1MzIgaW5kZXg7Ci0JY29uc3QgdTggKmFkZHI7Ci0KLQlpZiAoIWh3YWRkcikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaHdhZGRyKSkKLQkJYWRkciA9IGJjX2FkZHI7Ci0JZWxzZQotCQlhZGRyID0gaHdhZGRyOwotCi0JaW5kZXggPSB3aWZpX21hY19oYXNoKGFkZHIpOwotCi0Jc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+c3RhX2hhc2hfbG9jayk7Ci0JcGhlYWQgPSAmcHN0YXByaXYtPnN0YV9oYXNoW2luZGV4XTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgcGhlYWQsIGhhc2hfbGlzdCkgewotCQlwc3RhID0gcG9zOwotCi0JCS8qICBpZiBmb3VuZCB0aGUgbWF0Y2hlZCBhZGRyZXNzICovCi0JCWlmIChldGhlcl9hZGRyX2VxdWFsKHBzdGEtPmh3YWRkciwgYWRkcikpCi0JCQlicmVhazsKLQotCQlwc3RhID0gTlVMTDsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBzdGFwcml2LT5zdGFfaGFzaF9sb2NrKTsKLQlyZXR1cm4gcHN0YTsKLX0KLQotaW50IHJ0d19pbml0X2JjbWNfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdAlzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvCQkqcHN0YTsKLQlzdHJ1Y3QgdHhfc2VydnEJKnB0eHNlcnZxOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCXBzdGEgPSBydHdfYWxsb2Nfc3RhaW5mbzIzYShwc3RhcHJpdiwgYmNfYWRkciwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwc3RhKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfYWxsb2Nfc3RhaW5mbzIzYSBmYWlsXG4iKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JLyogIGRlZmF1bHQgYnJvYWRjYXN0ICYgbXVsdGljYXN0IHVzZSBtYWNpZCAxICovCi0JcHN0YS0+bWFjX2lkID0gMTsKLQotCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi5iZV9xOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RydWN0IHN0YV9pbmZvICpydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBzdGFfaW5mbwkJKnBzdGE7Ci0Jc3RydWN0IHN0YV9wcml2CQkqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBiY19hZGRyKTsKLQlyZXR1cm4gcHN0YTsKLX0KLQotYm9vbCBydHdfYWNjZXNzX2N0cmwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKm1hY19hZGRyKQotewotCWJvb2wgcmVzID0gdHJ1ZTsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3QgcnR3X3dsYW5fYWNsX25vZGUgKnBhY2xub2RlOwotCWJvb2wgbWF0Y2ggPSBmYWxzZTsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCB3bGFuX2FjbF9wb29sICpwYWNsX2xpc3QgPSAmcHN0YXByaXYtPmFjbF9saXN0OwotCXN0cnVjdCBydHdfcXVldWUgKnBhY2xfbm9kZV9xID0gJnBhY2xfbGlzdC0+YWNsX25vZGVfcTsKLQotCXNwaW5fbG9ja19iaCgmcGFjbF9ub2RlX3EtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwYWNsX25vZGVfcSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwYWNsbm9kZSwgcGhlYWQsIGxpc3QpIHsKLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocGFjbG5vZGUtPmFkZHIsIG1hY19hZGRyKSkgewotCQkJaWYgKHBhY2xub2RlLT52YWxpZCkgewotCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmcGFjbF9ub2RlX3EtPmxvY2spOwotCi0JaWYgKHBhY2xfbGlzdC0+bW9kZSA9PSAxKS8qIGFjY2VwdCB1bmxlc3MgaW4gZGVueSBsaXN0ICovCi0JCXJlcyA9IChtYXRjaCkgPyAgZmFsc2UgOiB0cnVlOwotCWVsc2UgaWYgKHBhY2xfbGlzdC0+bW9kZSA9PSAyKS8qIGRlbnkgdW5sZXNzIGluIGFjY2VwdCBsaXN0ICovCi0JCXJlcyA9IChtYXRjaCkgPyAgdHJ1ZSA6IGZhbHNlOwotCWVsc2UKLQkJIHJlcyA9IHRydWU7Ci0jZW5kaWYKLQlyZXR1cm4gcmVzOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d193bGFuX3V0aWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfd2xhbl91dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NGNmMTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d193bGFuX3V0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVFdfV0xBTl9VVElMX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+Ci0jaW5jbHVkZSA8d2lmaS5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX3NwZWMuaD4KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgQVJUSEVST1NfT1VJMVtdID0gezB4MDAsIDB4MDMsIDB4N2Z9Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgQVJUSEVST1NfT1VJMltdID0gezB4MDAsIDB4MTMsIDB4NzR9OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBCUk9BRENPTV9PVUkxW10gPSB7MHgwMCwgMHgxMCwgMHgxOH07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBCUk9BRENPTV9PVUkyW10gPSB7MHgwMCwgMHgwYSwgMHhmN307Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIENJU0NPX09VSVtdID0gezB4MDAsIDB4NDAsIDB4OTZ9Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgTUFSVkVMTF9PVUlbXSA9IHsweDAwLCAweDUwLCAweDQzfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFJBTElOS19PVUlbXSA9IHsweDAwLCAweDBjLCAweDQzfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFJFQUxURUtfT1VJW10gPSB7MHgwMCwgMHhlMCwgMHg0Y307Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBBSVJHT0NBUF9PVUlbXSA9IHsweDAwLCAweDBhLCAweGY1fTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIEVQSUdSQU1fT1VJW10gPSB7MHgwMCwgMHg5MCwgMHg0Y307Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFdQQV9US0lQX0NJUEhFUls0XSA9IHsweDAwLCAweDUwLCAweGYyLCAweDAyfTsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFJTTl9US0lQX0NJUEhFUls0XSA9IHsweDAwLCAweDBmLCAweGFjLCAweDAyfTsKLQotI2RlZmluZSBSMlRfUEhZX0RFTEFZCQkwCi0KLS8qIGRlZmluZSBXQUlUX0ZPUl9CQ05fVE9fTUlOCTMwMDAgKi8KLSNkZWZpbmUgV0FJVF9GT1JfQkNOX1RPX01JTgk2MDAwCi0jZGVmaW5lIFdBSVRfRk9SX0JDTl9UT19NQVgJMjAwMDAKLQotc3RhdGljIHU4IHJ0d19iYXNpY19yYXRlX2Nja1s0XSA9IHsKLQlJRUVFODAyMTFfQ0NLX1JBVEVfMU1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfQ0NLX1JBVEVfMk1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfQ0NLX1JBVEVfNU1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sKLX07Ci0KLXN0YXRpYyB1OCBydHdfYmFzaWNfcmF0ZV9vZmRtWzNdID0gewotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNk1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sKLX07Ci0KLXN0YXRpYyB1OCBydHdfYmFzaWNfcmF0ZV9taXhbN10gPSB7Ci0JSUVFRTgwMjExX0NDS19SQVRFXzFNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzJNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzVNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0ssCi0JSUVFRTgwMjExX0NDS19SQVRFXzExTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNk1CIHwgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSywKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIgfCBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLLAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQiB8IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sKLX07Ci0KLWludCBjY2tyYXRlc19pbmNsdWRlZDIzYSh1bnNpZ25lZCBjaGFyICpyYXRlLCBpbnQgcmF0ZWxlbikKLXsKLQlpbnQJaTsKLQotCWZvciAoaSA9IDA7IGkgPCByYXRlbGVuOyBpKyspIHsKLQkJaWYgICgoKHJhdGVbaV0pICYgMHg3ZikgPT0gMiB8fCAoKHJhdGVbaV0pICYgMHg3ZikgPT0gNCB8fAotCQkgICAgICgocmF0ZVtpXSkgJiAweDdmKSA9PSAxMSAgfHwgKChyYXRlW2ldKSAmIDB4N2YpID09IDIyKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1pbnQgY2NrcmF0ZXNvbmx5X2luY2x1ZGVkMjNhKHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuKQotewotCWludAlpOwotCi0JZm9yIChpID0gMDsgaSA8IHJhdGVsZW47IGkrKykgewotCQlpZiAgKCgocmF0ZVtpXSkgJiAweDdmKSAhPSAyICYmICgocmF0ZVtpXSkgJiAweDdmKSAhPSA0ICYmCi0JCSAgICAgKChyYXRlW2ldKSAmIDB4N2YpICE9IDExICYmICgocmF0ZVtpXSkgJiAweDdmKSAhPSAyMikKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi11bnNpZ25lZCBjaGFyIG5ldHdvcmt0eXBlX3RvX3JhaWQyM2EodW5zaWduZWQgY2hhciBuZXR3b3JrX3R5cGUpCi17Ci0JdW5zaWduZWQgY2hhciByYWlkOwotCi0Jc3dpdGNoIChuZXR3b3JrX3R5cGUpIHsKLQljYXNlIFdJUkVMRVNTXzExQjoKLQkJcmFpZCA9IFJBVFJfSU5YX1dJUkVMRVNTX0I7Ci0JCWJyZWFrOwotCWNhc2UgV0lSRUxFU1NfMTFBOgotCWNhc2UgV0lSRUxFU1NfMTFHOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfRzsKLQkJYnJlYWs7Ci0JY2FzZSBXSVJFTEVTU18xMUJHOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfR0I7Ci0JCWJyZWFrOwotCWNhc2UgV0lSRUxFU1NfMTFfMjROOgotCWNhc2UgV0lSRUxFU1NfMTFfNU46Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19OOwotCQlicmVhazsKLQljYXNlIFdJUkVMRVNTXzExQV81TjoKLQljYXNlIFdJUkVMRVNTXzExR18yNE46Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19ORzsKLQkJYnJlYWs7Ci0JY2FzZSBXSVJFTEVTU18xMUJHXzI0TjoKLQkJcmFpZCA9IFJBVFJfSU5YX1dJUkVMRVNTX05HQjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmFpZCA9IFJBVFJfSU5YX1dJUkVMRVNTX0dCOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJhaWQ7Ci19Ci0KLXU4IGp1ZGdlX25ldHdvcmtfdHlwZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuKQotewotCXU4IG5ldHdvcmtfdHlwZSA9IDA7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPiAxNCkgewotCQlpZiAocG1sbWVpbmZvLT5IVF9lbmFibGUpCi0JCQluZXR3b3JrX3R5cGUgPSBXSVJFTEVTU18xMV81TjsKLQkJbmV0d29ya190eXBlIHw9IFdJUkVMRVNTXzExQTsKLQl9IGVsc2UgewotCQlpZiAocG1sbWVpbmZvLT5IVF9lbmFibGUpCi0JCQluZXR3b3JrX3R5cGUgPSBXSVJFTEVTU18xMV8yNE47Ci0KLQkJaWYgKChjY2tyYXRlc29ubHlfaW5jbHVkZWQyM2EocmF0ZSwgcmF0ZWxlbikpID09IHRydWUpCi0JCQluZXR3b3JrX3R5cGUgfD0gV0lSRUxFU1NfMTFCOwotCQllbHNlIGlmICgoY2NrcmF0ZXNfaW5jbHVkZWQyM2EocmF0ZSwgcmF0ZWxlbikpID09IHRydWUpCi0JCQluZXR3b3JrX3R5cGUgfD0gV0lSRUxFU1NfMTFCRzsKLQkJZWxzZQotCQkJbmV0d29ya190eXBlIHw9IFdJUkVMRVNTXzExRzsKLQl9Ci0JcmV0dXJuCW5ldHdvcmtfdHlwZTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgcmF0ZXRibF92YWxfMndpZmlyYXRlKHVuc2lnbmVkIGNoYXIgcmF0ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIHZhbCA9IDA7Ci0KLQlzd2l0Y2ggKHJhdGUgJiAweDdmKSB7Ci0JY2FzZSAwOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXZhbCA9IElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJdmFsID0gSUVFRTgwMjExX0NDS19SQVRFXzVNQjsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7Ci0JCWJyZWFrOwotCWNhc2UgNzoKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV8xOE1COwotCQlicmVhazsKLQljYXNlIDg6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjsKLQkJYnJlYWs7Ci0JY2FzZSA5OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7Ci0JCWJyZWFrOwotCWNhc2UgMTA6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjsKLQkJYnJlYWs7Ci0JY2FzZSAxMToKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV81NE1COwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGludCBpc19iYXNpY3JhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciByYXRlKQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgdmFsOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTnVtUmF0ZXM7IGkrKykgewotCQl2YWwgPSBwbWxtZWV4dC0+YmFzaWNyYXRlW2ldOwotCi0JCWlmICh2YWwgIT0gMHhmZiAmJiB2YWwgIT0gMHhmZSkgewotCQkJaWYgKHJhdGUgPT0gcmF0ZXRibF92YWxfMndpZmlyYXRlKHZhbCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXRibDJyYXRlc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgIHVuc2lnbmVkIGNoYXIgKnJhdGVzZXQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgY2hhciByYXRlOwotCXVuc2lnbmVkIGludCBsZW4gPSAwOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTnVtUmF0ZXM7IGkrKykgewotCQlyYXRlID0gcG1sbWVleHQtPmRhdGFyYXRlW2ldOwotCi0JCXN3aXRjaCAocmF0ZSkgewotCQljYXNlIDB4ZmY6Ci0JCQlyZXR1cm4gbGVuOwotCQljYXNlIDB4ZmU6Ci0JCQljb250aW51ZTsKLQkJZGVmYXVsdDoKLQkJCXJhdGUgPSByYXRldGJsX3ZhbF8yd2lmaXJhdGUocmF0ZSk7Ci0KLQkJCWlmIChpc19iYXNpY3JhdGUocGFkYXB0ZXIsIHJhdGUpID09IHRydWUpCi0JCQkJcmF0ZSB8PSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLOwotCi0JCQlyYXRlc2V0W2xlbl0gPSByYXRlOwotCQkJbGVuKys7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlyZXR1cm4gbGVuOwotfQotCi12b2lkIGdldF9yYXRlX3NldDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIHVuc2lnbmVkIGNoYXIgKnBic3NyYXRlLCBpbnQgKmJzc3JhdGVfbGVuKQotewotCXVuc2lnbmVkIGNoYXIgc3VwcG9ydGVkcmF0ZXNbTnVtUmF0ZXNdOwotCi0JbWVtc2V0KHN1cHBvcnRlZHJhdGVzLCAwLCBOdW1SYXRlcyk7Ci0JKmJzc3JhdGVfbGVuID0gcmF0ZXRibDJyYXRlc2V0KHBhZGFwdGVyLCBzdXBwb3J0ZWRyYXRlcyk7Ci0JbWVtY3B5KHBic3NyYXRlLCBzdXBwb3J0ZWRyYXRlcywgKmJzc3JhdGVfbGVuKTsKLX0KLQotdm9pZCBVcGRhdGVCcmF0ZVRibDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4ICptQnJhdGVzT1MpCi17Ci0JdTggaTsKLQl1OCByYXRlOwotCi0JLyogIDFNLCAyTSwgNS41TSwgMTFNLCA2TSwgMTJNLCAyNE0gYXJlIG1hbmRhdG9yeS4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYOyBpKyspIHsKLQkJcmF0ZSA9IG1CcmF0ZXNPU1tpXSAmIDB4N2Y7Ci0JCXN3aXRjaCAocmF0ZSkgewotCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI6Ci0JCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzJNQjoKLQkJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COgotCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COgotCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgotCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKLQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI6Ci0JCQltQnJhdGVzT1NbaV0gfD0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgVXBkYXRlMjNhVGJsRm9yU29mdEFQKHU4ICpic3NyYXRlc2V0LCB1MzIgYnNzcmF0ZWxlbikKLXsKLQl1OCBpOwotCXU4IHJhdGU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYnNzcmF0ZWxlbjsgaSsrKSB7Ci0JCXJhdGUgPSBic3NyYXRlc2V0W2ldICYgMHg3ZjsKLQkJc3dpdGNoIChyYXRlKSB7Ci0JCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzFNQjoKLQkJY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COgotCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV81TUI6Ci0JCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUI6Ci0JCQlic3NyYXRlc2V0W2ldIHw9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0s7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotaW5saW5lIHU4IHJ0d19nZXRfb3Blcl9jaDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcmV0dXJuIGFkYXB0ZXJfdG9fZHZvYmooYWRhcHRlciktPm9wZXJfY2hhbm5lbDsKLX0KLQotaW5saW5lIHZvaWQgcnR3X3NldF9vcGVyX2NoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggY2gpCi17Ci0JYWRhcHRlcl90b19kdm9iaihhZGFwdGVyKS0+b3Blcl9jaGFubmVsID0gY2g7Ci19Ci0KLWlubGluZSB2b2lkIHJ0d19zZXRfb3Blcl9idzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGJ3KQotewotCWFkYXB0ZXJfdG9fZHZvYmooYWRhcHRlciktPm9wZXJfYndtb2RlID0gYnc7Ci19Ci0KLWlubGluZSB2b2lkIHJ0d19zZXRfb3Blcl9jaDIzYW9mZnNldDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IG9mZnNldCkKLXsKLQlhZGFwdGVyX3RvX2R2b2JqKGFkYXB0ZXIpLT5vcGVyX2NoX29mZnNldCA9IG9mZnNldDsKLX0KLQotdm9pZCBTZWxlY3RDaGFubmVsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCkKLXsKLQltdXRleF9sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+c2V0Y2hfbXV0ZXgpOwotCi0JLyogc2F2ZWQgY2hhbm5lbCBpbmZvICovCi0JcnR3X3NldF9vcGVyX2NoMjNhKHBhZGFwdGVyLCBjaGFubmVsKTsKLQotCVBIWV9Td0Nobmw4NzIzQShwYWRhcHRlciwgY2hhbm5lbCk7Ci0KLQltdXRleF91bmxvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5zZXRjaF9tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9id21vZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgc2hvcnQgYndtb2RlLAotCQkgICAgICAgdW5zaWduZWQgY2hhciBjaGFubmVsX29mZnNldCkKLXsKLQltdXRleF9sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+c2V0YndfbXV0ZXgpOwotCi0JLyogc2F2ZWQgYncgaW5mbyAqLwotCXJ0d19zZXRfb3Blcl9idzIzYShwYWRhcHRlciwgYndtb2RlKTsKLQlydHdfc2V0X29wZXJfY2gyM2FvZmZzZXQyM2EocGFkYXB0ZXIsIGNoYW5uZWxfb2Zmc2V0KTsKLQotCVBIWV9TZXRCV01vZGUyM2E4NzIzQShwYWRhcHRlciwgKGVudW0gaHRfY2hhbm5lbF93aWR0aClid21vZGUsCi0JCQkgICAgICBjaGFubmVsX29mZnNldCk7Ci0KLQltdXRleF91bmxvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5zZXRid19tdXRleCk7Ci19Ci0KLXZvaWQgc2V0X2NoYW5uZWxfYndtb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwKLQkJCSAgIHVuc2lnbmVkIGNoYXIgY2hhbm5lbF9vZmZzZXQsIHVuc2lnbmVkIHNob3J0IGJ3bW9kZSkKLXsKLQl1OCBjZW50ZXJfY2g7Ci0KLQlpZiAoYndtb2RlID09IEhUX0NIQU5ORUxfV0lEVEhfMjAgfHwKLQkgICAgY2hhbm5lbF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSkgewotCQkvKiBTZWxlY3RDaGFubmVsMjNhKHBhZGFwdGVyLCBjaGFubmVsKTsgKi8KLQkJY2VudGVyX2NoID0gY2hhbm5lbDsKLQl9IGVsc2UgewotCQkvKiBzd2l0Y2ggdG8gdGhlIHByb3BlciBjaGFubmVsICovCi0JCWlmIChjaGFubmVsX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpIHsKLQkJCS8qIFNlbGVjdENoYW5uZWwyM2EocGFkYXB0ZXIsIGNoYW5uZWwgKyAyKTsgKi8KLQkJCWNlbnRlcl9jaCA9IGNoYW5uZWwgKyAyOwotCQl9IGVsc2UgewotCQkJLyogU2VsZWN0Q2hhbm5lbDIzYShwYWRhcHRlciwgY2hhbm5lbCAtIDIpOyAqLwotCQkJY2VudGVyX2NoID0gY2hhbm5lbCAtIDI7Ci0JCX0KLQl9Ci0KLQkvKiBzZXQgQ2hhbm5lbCAqLwotCW11dGV4X2xvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5zZXRjaF9tdXRleCk7Ci0KLQkvKiBzYXZlZCBjaGFubmVsL2J3IGluZm8gKi8KLQlydHdfc2V0X29wZXJfY2gyM2EocGFkYXB0ZXIsIGNoYW5uZWwpOwotCXJ0d19zZXRfb3Blcl9idzIzYShwYWRhcHRlciwgYndtb2RlKTsKLQlydHdfc2V0X29wZXJfY2gyM2FvZmZzZXQyM2EocGFkYXB0ZXIsIGNoYW5uZWxfb2Zmc2V0KTsKLQotCVBIWV9Td0Nobmw4NzIzQShwYWRhcHRlciwgY2VudGVyX2NoKTsgLyogIHNldCBjZW50ZXIgY2hhbm5lbCAqLwotCi0JbXV0ZXhfdW5sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+c2V0Y2hfbXV0ZXgpOwotCi0Jc2V0X2J3bW9kZShwYWRhcHRlciwgYndtb2RlLCBjaGFubmVsX29mZnNldCk7Ci19Ci0KLWlubGluZSB1OCAqZ2V0X215X2Jzc2lkMjNhKHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yaykKLXsKLQlyZXR1cm4gcG5ldHdvcmstPk1hY0FkZHJlc3M7Ci19Ci0KLWJvb2wgaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9fYXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbzsKLQotCWlmICghcGFkYXB0ZXIpCi0JCXJldHVybiBmYWxzZTsKLQotCXBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MgJiYKLQkgICAgKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfSU5GUkEpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2lic3MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JaWYgKHBtbG1laW5mby0+c3RhdGUgJiBXSUZJX0ZXX0FTU09DX1NVQ0NFU1MgJiYKLQkgICAgKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQURIT0MpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGlzX0lCU1NfZW1wdHkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JZm9yIChpID0gSUJTU19TVEFSVF9NQUNfSUQ7IGkgPCBOVU1fU1RBOyBpKyspIHsKLQkJaWYgKHBtbG1laW5mby0+Rldfc3RhX2luZm9baV0uc3RhdHVzID09IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXVuc2lnbmVkIGludCBkZWNpZGVfd2FpdF9mb3JfYmVhY29uX3RpbWVvdXQyM2EodW5zaWduZWQgaW50IGJjbl9pbnRlcnZhbCkKLXsKLQlpZiAoKGJjbl9pbnRlcnZhbCA8PCAyKSA8IFdBSVRfRk9SX0JDTl9UT19NSU4pCi0JCXJldHVybiBXQUlUX0ZPUl9CQ05fVE9fTUlOOwotCWVsc2UgaWYgKChiY25faW50ZXJ2YWwgPDwgMikgPiBXQUlUX0ZPUl9CQ05fVE9fTUFYKQotCQlyZXR1cm4gV0FJVF9GT1JfQkNOX1RPX01BWDsKLQllbHNlCi0JCXJldHVybiBiY25faW50ZXJ2YWwgPDwgMjsKLX0KLQotdm9pZCBjbGVhcl9jYW1fZW50cnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggZW50cnkpCi17Ci0JdW5zaWduZWQgY2hhciBudWxsX3N0YVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0JdW5zaWduZWQgY2hhciBudWxsX2tleVtdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCQkJICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JCQkJICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi0JcnRsODcyM2FfY2FtX3dyaXRlKHBhZGFwdGVyLCBlbnRyeSwgMCwgbnVsbF9zdGEsIG51bGxfa2V5KTsKLX0KLQotaW50IGFsbG9jYXRlX2Z3X3N0YV9lbnRyeTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXVuc2lnbmVkIGludCBtYWNfaWQ7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWZvciAobWFjX2lkID0gSUJTU19TVEFSVF9NQUNfSUQ7IG1hY19pZCA8IE5VTV9TVEE7IG1hY19pZCsrKSB7Ci0JCWlmIChwbWxtZWluZm8tPkZXX3N0YV9pbmZvW21hY19pZF0uc3RhdHVzID09IDApIHsKLQkJCXBtbG1laW5mby0+Rldfc3RhX2luZm9bbWFjX2lkXS5zdGF0dXMgPSAxOwotCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLnJldHJ5ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIG1hY19pZDsKLX0KLQotdm9pZCBmbHVzaF9hbGxfY2FtX2VudHJ5MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCXJ0bDg3MjNhX2NhbV9pbnZhbGlkYXRlX2FsbChwYWRhcHRlcik7Ci0KLQltZW1zZXQocG1sbWVpbmZvLT5GV19zdGFfaW5mbywgMCwgc2l6ZW9mKHBtbG1laW5mby0+Rldfc3RhX2luZm8pKTsKLX0KLQotaW50IFdNTV9wYXJhbV9oYW5kbGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwKQotewotCS8qIHN0cnVjdCByZWdpc3RyeV9wcml2CSpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OyAqLwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwbWxtZXByaXYtPnFvc19vcHRpb24gPT0gMCkgewotCQlwbWxtZWluZm8tPldNTV9lbmFibGUgPSAwOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JcG1sbWVpbmZvLT5XTU1fZW5hYmxlID0gMTsKLQltZW1jcHkoJnBtbG1laW5mby0+V01NX3BhcmFtLCBwICsgMiArIDYsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgV01NX3BhcmFfZWxlbWVudCkpOwotCXJldHVybiB0cnVlOwotfQotCi12b2lkIFdNTU9uQXNzb2NSc3AyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBBQ0ksIEFDTSwgQUlGUywgRUNXTWluLCBFQ1dNYXgsIGFTaWZzVGltZTsKLQl1OCBhY21fbWFzazsKLQl1MTYgVFhPUDsKLQl1MzIgYWNQYXJtLCBpOwotCXUzMiBlZGNhWzRdLCBpbnhbNF07Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVncHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCi0JaWYgKHBtbG1laW5mby0+V01NX2VuYWJsZSA9PSAwKSB7Ci0JCXBhZGFwdGVyLT5tbG1lcHJpdi5hY21fbWFzayA9IDA7Ci0JCXJldHVybjsKLQl9Ci0KLQlhY21fbWFzayA9IDA7Ci0KLQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID09IFdJUkVMRVNTXzExQikKLQkJYVNpZnNUaW1lID0gMTA7Ci0JZWxzZQotCQlhU2lmc1RpbWUgPSAxNjsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJQUNJID0gKHBtbG1laW5mby0+V01NX3BhcmFtLmFjX3BhcmFtW2ldLkFDSV9BSUZTTiA+PiA1KSAmIDB4MDM7Ci0JCUFDTSA9IChwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5BQ0lfQUlGU04gPj4gNCkgJiAweDAxOwotCi0JCS8qIEFJRlMgPSBBSUZTTiAqIHNsb3QgdGltZSArIFNJRlMgLSByMnQgcGh5IGRlbGF5ICovCi0JCUFJRlMgPSAocG1sbWVpbmZvLT5XTU1fcGFyYW0uYWNfcGFyYW1baV0uQUNJX0FJRlNOICYgMHgwZikgKgotCQkJcG1sbWVpbmZvLT5zbG90VGltZSArIGFTaWZzVGltZTsKLQotCQlFQ1dNaW4gPSBwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5DVyAmIDB4MGY7Ci0JCUVDV01heCA9IChwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5DVyAmIDB4ZjApID4+IDQ7Ci0JCVRYT1AgPSBsZTE2X3RvX2NwdShwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5UWE9QX2xpbWl0KTsKLQotCQlhY1Bhcm0gPSBBSUZTIHwgKEVDV01pbiA8PCA4KSB8IChFQ1dNYXggPDwgMTIpIHwgKFRYT1AgPDwgMTYpOwotCi0JCXN3aXRjaCAoQUNJKSB7Ci0JCWNhc2UgMHgwOgotCQkJcnRsODcyM2Ffc2V0X2FjX3BhcmFtX2JlKHBhZGFwdGVyLCBhY1Bhcm0pOwotCQkJYWNtX21hc2sgfD0gKEFDTT8gQklUKDEpOjApOwotCQkJZWRjYVtYTUlUX0JFX1FVRVVFXSA9IGFjUGFybTsKLQkJCWJyZWFrOwotCQljYXNlIDB4MToKLQkJCXJ0bDg3MjNhX3NldF9hY19wYXJhbV9iayhwYWRhcHRlciwgYWNQYXJtKTsKLQkJCS8qIGFjbV9tYXNrIHw9IChBQ00/IEJJVCgwKTowKTsgKi8KLQkJCWVkY2FbWE1JVF9CS19RVUVVRV0gPSBhY1Bhcm07Ci0JCQlicmVhazsKLQkJY2FzZSAweDI6Ci0JCQlydGw4NzIzYV9zZXRfYWNfcGFyYW1fdmkocGFkYXB0ZXIsIGFjUGFybSk7Ci0JCQlhY21fbWFzayB8PSAoQUNNPyBCSVQoMik6MCk7Ci0JCQllZGNhW1hNSVRfVklfUVVFVUVdID0gYWNQYXJtOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgzOgotCQkJcnRsODcyM2Ffc2V0X2FjX3BhcmFtX3ZvKHBhZGFwdGVyLCBhY1Bhcm0pOwotCQkJYWNtX21hc2sgfD0gKEFDTT8gQklUKDMpOjApOwotCQkJZWRjYVtYTUlUX1ZPX1FVRVVFXSA9IGFjUGFybTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJREJHXzg3MjNBKCJXTU0oJXgpOiAleCwgJXhcbiIsIEFDSSwgQUNNLCBhY1Bhcm0pOwotCX0KLQotCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LmFjbV9tZXRob2QgPT0gMSkKLQkJcnRsODcyM2Ffc2V0X2FjbV9jdHJsKHBhZGFwdGVyLCBhY21fbWFzayk7Ci0JZWxzZQotCQlwYWRhcHRlci0+bWxtZXByaXYuYWNtX21hc2sgPSBhY21fbWFzazsKLQotCWlueFswXSA9IDA7IGlueFsxXSA9IDE7IGlueFsyXSA9IDI7IGlueFszXSA9IDM7Ci0KLQlpZiAocHJlZ3ByaXYtPndpZmlfc3BlYyA9PSAxKSB7Ci0JCXUzMiBqLCBjaGFuZ2VfaW54ID0gZmFsc2U7Ci0KLQkJLyogZW50cnkgaW5keDogMC0+dm8sIDEtPnZpLCAyLT5iZSwgMy0+YmsuICovCi0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCWZvciAoaiA9IGkrMTsgaiA8IDQ7IGorKykgewotCQkJCS8qIGNvbXBhcmUgQ1cgYW5kIEFJRlMgKi8KLQkJCQlpZiAoKGVkY2Fbal0gJiAweEZGRkYpIDwgKGVkY2FbaV0gJiAweEZGRkYpKSB7Ci0JCQkJCWNoYW5nZV9pbnggPSB0cnVlOwotCQkJCX0gZWxzZSBpZiAoKGVkY2Fbal0gJiAweEZGRkYpID09Ci0JCQkJCSAgIChlZGNhW2ldICYgMHhGRkZGKSkgewotCQkJCQkvKiBjb21wYXJlIFRYT1AgKi8KLQkJCQkJaWYgKChlZGNhW2pdID4+IDE2KSA+IChlZGNhW2ldID4+IDE2KSkKLQkJCQkJCWNoYW5nZV9pbnggPSB0cnVlOwotCQkJCX0KLQotCQkJCWlmIChjaGFuZ2VfaW54KSB7Ci0JCQkJCXN3YXAoZWRjYVtpXSwgZWRjYVtqXSk7Ci0JCQkJCXN3YXAoaW54W2ldLCBpbnhbal0pOwotCQkJCQljaGFuZ2VfaW54ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaTw0OyBpKyspIHsKLQkJcHhtaXRwcml2LT53bW1fcGFyYV9zZXFbaV0gPSBpbnhbaV07Ci0JCURCR184NzIzQSgid21tX3BhcmFfc2VxKCVkKTogJWRcbiIsIGksCi0JCQkgIHB4bWl0cHJpdi0+d21tX3BhcmFfc2VxW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ3bW9kZV91cGRhdGVfY2hlY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnApCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKnBIVF9pbmZvOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCXVuc2lnbmVkIGNoYXIgbmV3X2J3bW9kZTsKLQl1bnNpZ25lZCBjaGFyIG5ld19jaF9vZmZzZXQ7Ci0KLQlpZiAoIXApCi0JCXJldHVybjsKLQlpZiAoIXBodHByaXYtPmh0X29wdGlvbikKLQkJcmV0dXJuOwotCWlmIChwWzFdICE9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbikpCi0JCXJldHVybjsKLQotCXBIVF9pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICopKHAgKyAyKTsKLQotCWlmICgocEhUX2luZm8tPmh0X3BhcmFtICYgSUVFRTgwMjExX0hUX1BBUkFNX0NIQU5fV0lEVEhfQU5ZKSAmJgotCSAgICBwcmVnaXN0cnlwcml2LT5jYnc0MF9lbmFibGUpIHsKLQkJbmV3X2J3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfNDA7Ci0KLQkJc3dpdGNoIChwSFRfaW5mby0+aHRfcGFyYW0gJiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19PRkZTRVQpewotCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOgotCQkJbmV3X2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUjsKLQkJCWJyZWFrOwotCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOgotCQkJbmV3X2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJbmV3X2NoX29mZnNldCA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCW5ld19id21vZGUgPSBIVF9DSEFOTkVMX1dJRFRIXzIwOwotCQluZXdfY2hfb2Zmc2V0ID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRTsKLQl9Ci0KLQlpZiAobmV3X2J3bW9kZSAhPSBwbWxtZWV4dC0+Y3VyX2J3bW9kZSB8fAotCSAgICBuZXdfY2hfb2Zmc2V0ICE9IHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0KSB7Ci0JCXBtbG1laW5mby0+Yndtb2RlX3VwZGF0ZWQgPSB0cnVlOwotCi0JCXBtbG1lZXh0LT5jdXJfYndtb2RlID0gbmV3X2J3bW9kZTsKLQkJcG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPSBuZXdfY2hfb2Zmc2V0OwotCi0JCS8qIHVwZGF0ZSBIVCBpbmZvIGFsc28gKi8KLQkJSFRfaW5mb19oYW5kbGVyMjNhKHBhZGFwdGVyLCBwKTsKLQl9IGVsc2UKLQkJcG1sbWVpbmZvLT5id21vZGVfdXBkYXRlZCA9IGZhbHNlOwotCi0JaWYgKHBtbG1laW5mby0+Yndtb2RlX3VwZGF0ZWQpIHsKLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCQlzdHJ1Y3Qgc3RhX3ByaXYJKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCS8qIHNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLAotCQkgICBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOyAqLwotCi0JCS8qIHVwZGF0ZSBhcCdzIHN0YWluZm8gKi8KLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgY3VyX25ldHdvcmstPk1hY0FkZHJlc3MpOwotCQlpZiAocHN0YSkgewotCQkJc3RydWN0IGh0X3ByaXYgKnBodHByaXZfc3RhID0gJnBzdGEtPmh0cHJpdjsKLQotCQkJaWYgKHBodHByaXZfc3RhLT5odF9vcHRpb24pIHsKLQkJCQkvKiAgYndtb2RlICovCi0JCQkJcGh0cHJpdl9zdGEtPmJ3bW9kZSA9IHBtbG1lZXh0LT5jdXJfYndtb2RlOwotCQkJCXBodHByaXZfc3RhLT5jaF9vZmZzZXQgPQotCQkJCQlwbWxtZWV4dC0+Y3VyX2NoX29mZnNldDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGh0cHJpdl9zdGEtPmJ3bW9kZSA9IEhUX0NIQU5ORUxfV0lEVEhfMjA7Ci0JCQkJcGh0cHJpdl9zdGEtPmNoX29mZnNldCA9Ci0JCQkJCUhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgSFRfY2Fwc19oYW5kbGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwKQotewotCXVuc2lnbmVkIGludCBpOwotCXU4IHJmX3R5cGU7Ci0JdTggbWF4X0FNUERVX2xlbiwgbWluX01QRFVfc3BhY2luZzsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IGh0X3ByaXYgKnBodHByaXYgPSAmcG1sbWVwcml2LT5odHByaXY7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmNhcDsKLQl1OCAqZHN0Y2FwOwotCi0JaWYgKCFwKQotCQlyZXR1cm47Ci0KLQlpZiAoIXBodHByaXYtPmh0X29wdGlvbikKLQkJcmV0dXJuOwotCi0JcG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSA9IDE7Ci0KLQljYXAgPSAmcG1sbWVpbmZvLT5odF9jYXA7Ci0JZHN0Y2FwID0gKHU4ICopY2FwOwotCWZvciAoaSA9IDA7IGkgPCBwWzFdOyBpKyspIHsKLQkJaWYgKGkgIT0gMikgewotCQkJZHN0Y2FwW2ldICY9IHBbaSArIDJdOwotCQl9IGVsc2UgewotCQkJLyogbW9kaWZ5IGZyb20gIGZ3IGJ5IFRob21hcyAyMDEwLzExLzE3ICovCi0JCQlpZiAoKGNhcC0+YW1wZHVfcGFyYW1zX2luZm8gJgotCQkJICAgICBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1IpID4KLQkJCSAgICAocFtpICsgMl0gJiBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1IpKQotCQkJCW1heF9BTVBEVV9sZW4gPSBwW2kgKyAyXSAmCi0JCQkJCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUjsKLQkJCWVsc2UKLQkJCQltYXhfQU1QRFVfbGVuID0gY2FwLT5hbXBkdV9wYXJhbXNfaW5mbyAmCi0JCQkJCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUjsKLQotCQkJaWYgKChjYXAtPmFtcGR1X3BhcmFtc19pbmZvICYKLQkJCSAgICAgSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWSkgPgotCQkJICAgIChwW2kgKyAyXSAmIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkpKQotCQkJCW1pbl9NUERVX3NwYWNpbmcgPSBjYXAtPmFtcGR1X3BhcmFtc19pbmZvICYKLQkJCQkJSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWTsKLQkJCWVsc2UKLQkJCQltaW5fTVBEVV9zcGFjaW5nID0gcFtpICsgMl0gJgotCQkJCQlJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZOwotCi0JCQljYXAtPmFtcGR1X3BhcmFtc19pbmZvID0KLQkJCQltYXhfQU1QRFVfbGVuIHwgbWluX01QRFVfc3BhY2luZzsKLQkJfQotCX0KLQotCXJmX3R5cGUgPSBydGw4NzIzYV9nZXRfcmZfdHlwZShwYWRhcHRlcik7Ci0KLQkvKiB1cGRhdGUgdGhlIE1DUyByYXRlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOOyBpKyspIHsKLQkJaWYgKHJmX3R5cGUgPT0gUkZfMVQxUiB8fCByZl90eXBlID09IFJGXzFUMlIpCi0JCQljYXAtPm1jcy5yeF9tYXNrW2ldICY9IE1DU19yYXRlXzFSMjNBW2ldOwotCQllbHNlCi0JCQljYXAtPm1jcy5yeF9tYXNrW2ldICY9IE1DU19yYXRlXzJSMjNBW2ldOwotCX0KLX0KLQotdm9pZCBIVF9pbmZvX2hhbmRsZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnApCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCi0JaWYgKCFwKQotCQlyZXR1cm47Ci0KLQlpZiAoIXBodHByaXYtPmh0X29wdGlvbikKLQkJcmV0dXJuOwotCi0JaWYgKHBbMV0gIT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uKSkKLQkJcmV0dXJuOwotCi0JcG1sbWVpbmZvLT5IVF9pbmZvX2VuYWJsZSA9IDE7Ci0JbWVtY3B5KCZwbWxtZWluZm8tPkhUX2luZm8sIHAgKyAyLCBwWzFdKTsKLX0KLQotdm9pZCBIVE9uQXNzb2NSc3AyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1bnNpZ25lZCBjaGFyIG1heF9BTVBEVV9sZW47Ci0JdW5zaWduZWQgY2hhciBtaW5fTVBEVV9zcGFjaW5nOwotCS8qIHN0cnVjdCByZWdpc3RyeV9wcml2CSAqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsgKi8KLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JaWYgKHBtbG1laW5mby0+SFRfaW5mb19lbmFibGUgJiYgcG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSkKLQkJcG1sbWVpbmZvLT5IVF9lbmFibGUgPSAxOwotCWVsc2UgewotCQlwbWxtZWluZm8tPkhUX2VuYWJsZSA9IDA7Ci0JCS8qIHNldF9jaGFubmVsX2J3bW9kZTIzYShwYWRhcHRlciwgcG1sbWVleHQtPmN1cl9jaGFubmVsLAotCQkgICBwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCwgcG1sbWVleHQtPmN1cl9id21vZGUpOyAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogaGFuZGxlIEEtTVBEVSBwYXJhbWV0ZXIgZmllbGQgKi8KLQkvKgotCQlBTVBEVV9wYXJhIFsxOjBdOk1heCBBTVBEVSBMZW4gPT4gMDo4ayAsIDE6MTZrLCAyOjMyaywgMzo2NGsKLQkJQU1QRFVfcGFyYSBbNDoyXTpNaW4gTVBEVSBTdGFydCBTcGFjaW5nCi0JKi8KLQltYXhfQU1QRFVfbGVuID0gcG1sbWVpbmZvLT5odF9jYXAuYW1wZHVfcGFyYW1zX2luZm8gJgotCQlJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1I7Ci0KLQltaW5fTVBEVV9zcGFjaW5nID0KLQkJKHBtbG1laW5mby0+aHRfY2FwLmFtcGR1X3BhcmFtc19pbmZvICYKLQkJIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFkpID4+IDI7Ci0KLQlydGw4NzIzYV9zZXRfYW1wZHVfbWluX3NwYWNlKHBhZGFwdGVyLCBtaW5fTVBEVV9zcGFjaW5nKTsKLQlydGw4NzIzYV9zZXRfYW1wZHVfZmFjdG9yKHBhZGFwdGVyLCBtYXhfQU1QRFVfbGVuKTsKLX0KLQotdm9pZCBFUlBfSUVfaGFuZGxlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcCkKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JaWYgKHBbMV0gPiAxKQotCQlyZXR1cm47Ci0KLQlwbWxtZWluZm8tPkVSUF9lbmFibGUgPSAxOwotCW1lbWNweSgmcG1sbWVpbmZvLT5FUlBfSUUsIHAgKyAyLCBwWzFdKTsKLX0KLQotdm9pZCBWQ1NfdXBkYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0Jc3dpdGNoIChwcmVncHJpdi0+dnJ0bF9jYXJyaWVyX3NlbnNlKSB7IC8qIDA6b2ZmIDE6b24gMjphdXRvICovCi0JY2FzZSAwOiAvKiBvZmYgKi8KLQkJcHN0YS0+cnRzZW4gPSAwOwotCQlwc3RhLT5jdHMyc2VsZiA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgMTogLyogb24gKi8KLQkJaWYgKHByZWdwcml2LT52Y3NfdHlwZSA9PSBSVFNfQ1RTKSB7Ci0JCQlwc3RhLT5ydHNlbiA9IDE7Ci0JCQlwc3RhLT5jdHMyc2VsZiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlwc3RhLT5ydHNlbiA9IDA7Ci0JCQlwc3RhLT5jdHMyc2VsZiA9IDE7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAyOiAvKiBhdXRvICovCi0JZGVmYXVsdDoKLQkJaWYgKHBtbG1laW5mby0+RVJQX2VuYWJsZSAmJiBwbWxtZWluZm8tPkVSUF9JRSAmIEJJVCgxKSkgewotCQkJaWYgKHByZWdwcml2LT52Y3NfdHlwZSA9PSBSVFNfQ1RTKSB7Ci0JCQkJcHN0YS0+cnRzZW4gPSAxOwotCQkJCXBzdGEtPmN0czJzZWxmID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcHN0YS0+cnRzZW4gPSAwOwotCQkJCXBzdGEtPmN0czJzZWxmID0gMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXBzdGEtPnJ0c2VuID0gMDsKLQkJCXBzdGEtPmN0czJzZWxmID0gMDsKLQkJfQotCQlicmVhazsKLQl9Ci19Ci0KLWludCBydHdfY2hlY2tfYmNuX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHUzMiBwa3RfbGVuKQotewotCXN0cnVjdCB3bGFuX25ldHdvcmsgKmN1cl9uZXR3b3JrID0gJkFkYXB0ZXItPm1sbWVwcml2LmN1cl9uZXR3b3JrOwotCXN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICpwaHRfaW5mbzsKLQl1bnNpZ25lZCBzaG9ydCB2YWwxNjsKLQl1OCBjcnlwdG8sIGJjbl9jaGFubmVsOwotCWludCBncm91cF9jaXBoZXIgPSAwLCBwYWlyd2lzZV9jaXBoZXIgPSAwLCBpc184MDIxeCA9IDAsIHI7Ci0JaW50IHBpZV9sZW4sIHNzaWRfbGVuLCBwcml2YWN5OwotCWNvbnN0IHU4ICpwLCAqc3NpZDsKLQotCWlmICghaXNfY2xpZW50X2Fzc29jaWF0ZWRfdG9fYXAyM2EoQWRhcHRlcikpCi0JCXJldHVybiBfU1VDQ0VTUzsKLQotCWlmICh1bmxpa2VseSghaWVlZTgwMjExX2lzX2JlYWNvbihtZ210LT5mcmFtZV9jb250cm9sKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlY2VpdmVkIGEgbm9uIGJlYWNvbiBmcmFtZSFcbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwoY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywgbWdtdC0+YnNzaWQpKSB7Ci0JCURCR184NzIzQSgiJXM6IGxpbmtlZCBidXQgcmVjdiBvdGhlciBic3NpZCBiY24gJXBNICVwTVxuIiwKLQkJCSAgX19mdW5jX18sIG1nbXQtPmJzc2lkLAotCQkJICBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCS8qIGNoZWNrIGJ3IGFuZCBjaGFubmVsIG9mZnNldCAqLwotCS8qIHBhcnNpbmcgSFRfQ0FQX0lFICovCi0JcGllX2xlbiA9IHBrdF9sZW4gLSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQotCS8qIENoZWNraW5nIGZvciBjaGFubmVsICovCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfRFNfUEFSQU1TLCBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwKLQkJCSAgICAgcGllX2xlbik7Ci0JaWYgKHApCi0JCWJjbl9jaGFubmVsID0gcFsyXTsKLQllbHNlIHsKLQkJLyogSW4gNUcsIHNvbWUgYXAgZG8gbm90IGhhdmUgRFNTRVQgSUUgY2hlY2tpbmcgSFQKLQkJICAgaW5mbyBmb3IgY2hhbm5lbCAqLwotCQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9IVF9PUEVSQVRJT04sCi0JCQkJICAgICBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwgcGllX2xlbik7Ci0KLQkJaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJCXBodF9pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICopKHAgKyAyKTsKLQkJCWJjbl9jaGFubmVsID0gcGh0X2luZm8tPnByaW1hcnlfY2hhbjsKLQkJfSBlbHNlIHsgLyogd2UgZG9uJ3QgZmluZCBjaGFubmVsIElFLCBzbyBkb24ndCBjaGVjayBpdCAqLwotCQkJREJHXzg3MjNBKCJPb3BzOiAlcyB3ZSBkb24ndCBmaW5kIGNoYW5uZWwgSUUsIHNvIGRvbid0ICIKLQkJCQkgICJjaGVjayBpdFxuIiwgX19mdW5jX18pOwotCQkJYmNuX2NoYW5uZWwgPSBBZGFwdGVyLT5tbG1lZXh0cHJpdi5jdXJfY2hhbm5lbDsKLQkJfQotCX0KLQlpZiAoYmNuX2NoYW5uZWwgIT0gQWRhcHRlci0+bWxtZWV4dHByaXYuY3VyX2NoYW5uZWwpIHsKLQkJREJHXzg3MjNBKCIlcyBiZWFjb24gY2hhbm5lbDolZCBjdXIgY2hhbm5lbDolZCBkaXNjb25uZWN0XG4iLAotCQkJICBfX2Z1bmNfXywgYmNuX2NoYW5uZWwsCi0JCQkgIEFkYXB0ZXItPm1sbWVleHRwcml2LmN1cl9jaGFubmVsKTsKLQkJZ290byBfbWlzbWF0Y2g7Ci0JfQotCi0JLyogY2hlY2tpbmcgU1NJRCAqLwotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1NTSUQsIG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlLCBwaWVfbGVuKTsKLQlpZiAocCAmJiBwWzFdKSB7Ci0JCXNzaWQgPSBwICsgMjsKLQkJc3NpZF9sZW4gPSBwWzFdOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiJXMgbWFyYzogY2Fubm90IGZpbmQgU1NJRCBmb3Igc3VydmV5IGV2ZW50XG4iLAotCQkJICBfX2Z1bmNfXyk7Ci0JCXNzaWQgPSBOVUxMOwotCQlzc2lkX2xlbiA9IDA7Ci0JfQotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAiJXMgYnNzaWQuU3NpZC5Tc2lkOiVzIGJzc2lkLlNzaWQuU3NpZExlbmd0aDolZCBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQ6JXMgbGVuOiVkXG4iLAotCQkgX19mdW5jX18sIHNzaWQsIHNzaWRfbGVuLCBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsCi0JCSBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuKTsKLQotCWlmIChzc2lkX2xlbiAhPSBjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuIHx8IHNzaWRfbGVuID4gMzIgfHwKLQkgICAgKHNzaWRfbGVuICYmCi0JICAgICBtZW1jbXAoc3NpZCwgY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkLCBzc2lkX2xlbikpKSB7Ci0JCURCR184NzIzQSgiJXMoKSwgU1NJRCBpcyBub3QgbWF0Y2ggcmV0dXJuIEZBSUxcbiIsIF9fZnVuY19fKTsKLQkJZ290byBfbWlzbWF0Y2g7Ci0JfQotCi0JLyogY2hlY2sgZW5jcnlwdGlvbiBpbmZvICovCi0JdmFsMTYgPSBsZTE2X3RvX2NwdShtZ210LT51LmJlYWNvbi5jYXBhYl9pbmZvKTsKLQotCWlmICh2YWwxNiAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQotCQlwcml2YWN5ID0gMTsKLQllbHNlCi0JCXByaXZhY3kgPSAwOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAiJXMoKTogY3VyX25ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSBpcyAlZCwgYnNzaWQuUHJpdmFjeSBpcyAlZFxuIiwKLQkJIF9fZnVuY19fLCBjdXJfbmV0d29yay0+bmV0d29yay5Qcml2YWN5LCBwcml2YWN5KTsKLQlpZiAoY3VyX25ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSAhPSBwcml2YWN5KSB7Ci0JCURCR184NzIzQSgiJXMoKSwgcHJpdmFjeSBpcyBub3QgbWF0Y2ggcmV0dXJuIEZBSUxcbiIsIF9fZnVuY19fKTsKLQkJZ290byBfbWlzbWF0Y2g7Ci0JfQotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfUlNOLCBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwgcGllX2xlbik7Ci0JaWYgKHAgJiYgcFsxXSkgewotCQljcnlwdG8gPSBFTkNSWVBfUFJPVE9DT0xfV1BBMjsKLQkJaWYgKHAgJiYgcFsxXSkgewotCQkJciA9IHJ0d19wYXJzZV93cGEyX2llMjNhKHAsIHBbMV0gKyAyLCAmZ3JvdXBfY2lwaGVyLAotCQkJCQkJICZwYWlyd2lzZV9jaXBoZXIsICZpc184MDIxeCk7Ci0JCQlpZiAociA9PSBfU1VDQ0VTUykKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkJICIlcyBwbmV0d29yay0+cGFpcndpc2VfY2lwaGVyOiAlZCwgcG5ldHdvcmstPmdyb3VwX2NpcGhlcjogJWQsIGlzXzgwMnggOiAlZFxuIiwKLQkJCQkJIF9fZnVuY19fLCBwYWlyd2lzZV9jaXBoZXIsCi0JCQkJCSBncm91cF9jaXBoZXIsIGlzXzgwMjF4KTsKLQkJCX0KLQl9IGVsc2UgewotCQlwID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCQkgICAgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BBLAotCQkJCQkgICAgbWdtdC0+dS5iZWFjb24udmFyaWFibGUsIHBpZV9sZW4pOwotCQlpZiAocCAmJiBwWzFdKSB7Ci0JCQljcnlwdG8gPSBFTkNSWVBfUFJPVE9DT0xfV1BBOwotCQkJciA9IHJ0d19wYXJzZV93cGFfaWUyM2EocCwgcFsxXSArIDIsICZncm91cF9jaXBoZXIsCi0JCQkJCQkmcGFpcndpc2VfY2lwaGVyLCAmaXNfODAyMXgpOwotCQkJaWYgKHIgPT0gX1NVQ0NFU1MpCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiJXMgcG5ldHdvcmstPnBhaXJ3aXNlX2NpcGhlcjogJWQsIGdyb3VwX2NpcGhlciBpcyAlZCwgaXNfODAyMXggaXMgJWRcbiIsCi0JCQkJCSBfX2Z1bmNfXywgcGFpcndpc2VfY2lwaGVyLAotCQkJCQkgZ3JvdXBfY2lwaGVyLCBpc184MDIxeCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocHJpdmFjeSkKLQkJCQljcnlwdG8gPSBFTkNSWVBfUFJPVE9DT0xfV0VQOwotCQkJZWxzZQotCQkJCWNyeXB0byA9IEVOQ1JZUF9QUk9UT0NPTF9PUEVOU1lTOwotCQl9Ci0JfQotCi0JaWYgKGN1cl9uZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCAhPSBjcnlwdG8pIHsKLQkJREJHXzg3MjNBKCIlcygpOiBlbmNyeXB0aW9uIG1pc21hdGNoLCByZXR1cm4gRkFJTFxuIiwgX19mdW5jX18pOwotCQlnb3RvIF9taXNtYXRjaDsKLQl9Ci0KLQlpZiAoY3J5cHRvID09IEVOQ1JZUF9QUk9UT0NPTF9XUEEgfHwgY3J5cHRvID09IEVOQ1JZUF9QUk9UT0NPTF9XUEEyKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIiVzIGN1cl9uZXR3b3JrLT5ncm91cF9jaXBoZXIgaXMgJWQ6ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSBjdXJfbmV0d29yay0+QmNuSW5mby5ncm91cF9jaXBoZXIsIGdyb3VwX2NpcGhlcik7Ci0JCWlmIChwYWlyd2lzZV9jaXBoZXIgIT0gY3VyX25ldHdvcmstPkJjbkluZm8ucGFpcndpc2VfY2lwaGVyIHx8Ci0JCSAgICBncm91cF9jaXBoZXIgIT0gY3VyX25ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyKSB7Ci0JCQlEQkdfODcyM0EoIiVzIHBhaXJ3aXNlX2NpcGhlcigleDoleCkgb3IgZ3JvdXBfY2lwaGVyICIKLQkJCQkgICIoJXg6JXgpIGlzIG5vdCBtYXRjaCwgcmV0dXJuIEZBSUxcbiIsCi0JCQkJICBfX2Z1bmNfXywgcGFpcndpc2VfY2lwaGVyLAotCQkJCSAgY3VyX25ldHdvcmstPkJjbkluZm8ucGFpcndpc2VfY2lwaGVyLAotCQkJCSAgZ3JvdXBfY2lwaGVyLAotCQkJCSAgY3VyX25ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyKTsKLQkJCWdvdG8gX21pc21hdGNoOwotCQl9Ci0KLQkJaWYgKGlzXzgwMjF4ICE9IGN1cl9uZXR3b3JrLT5CY25JbmZvLmlzXzgwMjF4KSB7Ci0JCQlEQkdfODcyM0EoIiVzIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBtYXRjaCwgcmV0dXJuICIKLQkJCQkgICJGQUlMXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIF9taXNtYXRjaDsKLQkJfQotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLQotX21pc21hdGNoOgotCi0JcmV0dXJuIF9GQUlMOwotfQotCi12b2lkIHVwZGF0ZV9iZWFjb24yM2FfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LAotCQkJICAgdWludCBwa3RfbGVuLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JdW5zaWduZWQgaW50IGxlbjsKLQljb25zdCB1OCAqcDsKLQotCWxlbiA9IHBrdF9sZW4gLSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKTsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX09QRVJBVElPTiwgbWdtdC0+dS5iZWFjb24udmFyaWFibGUsCi0JCQkgICAgIGxlbik7Ci0JaWYgKHApCi0JCWJ3bW9kZV91cGRhdGVfY2hlY2socGFkYXB0ZXIsIHApOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfRVJQX0lORk8sIG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlLCBsZW4pOwotCWlmIChwKSB7Ci0JCUVSUF9JRV9oYW5kbGVyMjNhKHBhZGFwdGVyLCBwKTsKLQkJVkNTX3VwZGF0ZTIzYShwYWRhcHRlciwgcHN0YSk7Ci0JfQotfQotCi1ib29sIGlzX2FwX2luX3RraXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MzIgaTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JY29uc3QgdTggKnA7Ci0KLQlpZiAoY3VyX25ldHdvcmstPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgewotCQlmb3IgKGkgPSAwOyBpIDwgcG1sbWVpbmZvLT5uZXR3b3JrLklFTGVuZ3RoOykgewotCQkJcCA9IHBtbG1laW5mby0+bmV0d29yay5JRXMgKyBpOwotCi0JCQlzd2l0Y2ggKHBbMF0pIHsKLQkJCWNhc2UgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDOgotCQkJCWlmICghbWVtY21wKHAgKyAyLCBSVFdfV1BBX09VSTIzQV9UWVBFLCA0KSAmJgotCQkJCSAgICAhbWVtY21wKHAgKyAyICsgMTIsIFdQQV9US0lQX0NJUEhFUiwgNCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXTEFOX0VJRF9SU046Ci0JCQkJaWYgKCFtZW1jbXAocCArIDIgKyA4LCBSU05fVEtJUF9DSVBIRVIsIDQpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpICs9IChwWzFdICsgMik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgc2hvdWxkX2ZvcmJpZF9uX3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MzIgaTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwotCWNvbnN0IHU4ICpwOwotCi0JaWYgKGN1cl9uZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpIHsKLQkJZm9yIChpID0gMDsgaSA8IGN1cl9uZXR3b3JrLT5JRUxlbmd0aDspIHsKLQkJCXAgPSBjdXJfbmV0d29yay0+SUVzICsgaTsKLQotCQkJc3dpdGNoIChwWzBdKSB7Ci0JCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJCQlpZiAoIW1lbWNtcChwICsgMiwgUlRXX1dQQV9PVUkyM0FfVFlQRSwgNCkgJiYKLQkJCQkgICAgKCFtZW1jbXAocCArIDIgKyAxMiwKLQkJCQkJICAgICBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAyM0EsIDQpIHx8Ci0JCQkJICAgICAhbWVtY21wKHAgKyAyICsgMTYsCi0JCQkJCSAgICAgV1BBX0NJUEhFUl9TVUlURV9DQ01QMjNBLCA0KSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0xBTl9FSURfUlNOOgotCQkJCWlmICghbWVtY21wKHAgKyAyICsgOCwKLQkJCQkJICAgIFJTTl9DSVBIRVJfU1VJVEVfQ0NNUDIzQSwgNCkgfHwKLQkJCQkgICAgIW1lbWNtcChwICsgMiArIDEyLAotCQkJCQkgICAgUlNOX0NJUEhFUl9TVUlURV9DQ01QMjNBLCA0KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpICs9IChwWzFdICsgMik7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQotYm9vbCBpc19hcF9pbl93ZXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MzIgaTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JY29uc3QgdTggKnA7Ci0KLQlpZiAoY3VyX25ldHdvcmstPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkgewotCQlmb3IgKGkgPSAwOyBpIDwgcG1sbWVpbmZvLT5uZXR3b3JrLklFTGVuZ3RoOykgewotCQkJcCA9IHBtbG1laW5mby0+bmV0d29yay5JRXMgKyBpOwotCi0JCQlzd2l0Y2ggKHBbMF0pIHsKLQkJCWNhc2UgV0xBTl9FSURfVkVORE9SX1NQRUNJRklDOgotCQkJCWlmICghbWVtY21wKHAgKyAyLCBSVFdfV1BBX09VSTIzQV9UWVBFLCA0KSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXTEFOX0VJRF9SU046Ci0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpICs9IChwWzFdICsgMik7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9IGVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IHdpZmlyYXRlMl9yYXRldGJsX2lueDIzYSh1bnNpZ25lZCBjaGFyIHJhdGUpCi17Ci0JaW50IGlueCA9IDA7Ci0KLQlyYXRlID0gcmF0ZSAmIDB4N2Y7Ci0KLQlzd2l0Y2ggKHJhdGUpIHsKLQljYXNlIDU0KjI6Ci0JCWlueCA9IDExOwotCQlicmVhazsKLQljYXNlIDQ4KjI6Ci0JCWlueCA9IDEwOwotCQlicmVhazsKLQljYXNlIDM2KjI6Ci0JCWlueCA9IDk7Ci0JCWJyZWFrOwotCWNhc2UgMjQqMjoKLQkJaW54ID0gODsKLQkJYnJlYWs7Ci0JY2FzZSAxOCoyOgotCQlpbnggPSA3OwotCQlicmVhazsKLQljYXNlIDEyKjI6Ci0JCWlueCA9IDY7Ci0JCWJyZWFrOwotCWNhc2UgOSoyOgotCQlpbnggPSA1OwotCQlicmVhazsKLQljYXNlIDYqMjoKLQkJaW54ID0gNDsKLQkJYnJlYWs7Ci0JY2FzZSAxMSoyOgotCQlpbnggPSAzOwotCQlicmVhazsKLQljYXNlIDExOgotCQlpbnggPSAyOwotCQlicmVhazsKLQljYXNlIDIqMjoKLQkJaW54ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSAxKjI6Ci0JCWlueCA9IDA7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gaW54OwotfQotCi11bnNpZ25lZCBpbnQgdXBkYXRlX2Jhc2ljX3JhdGUyM2EodW5zaWduZWQgY2hhciAqcHRuLCB1bnNpZ25lZCBpbnQgcHRuX3N6KQotewotCXVuc2lnbmVkIGludCBpLCBudW1fb2ZfcmF0ZTsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLQludW1fb2ZfcmF0ZSA9IChwdG5fc3ogPiBOdW1SYXRlcyk/IE51bVJhdGVzOiBwdG5fc3o7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX29mX3JhdGU7IGkrKykgewotCQlpZiAoKCoocHRuICsgaSkpICYgMHg4MCkKLQkJCW1hc2sgfD0gMHgxIDw8IHdpZmlyYXRlMl9yYXRldGJsX2lueDIzYSgqKHB0biArIGkpKTsKLQl9Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLXVuc2lnbmVkIGludCB1cGRhdGVfc3VwcG9ydGVkX3JhdGUyM2EodW5zaWduZWQgY2hhciAqcHRuLCB1bnNpZ25lZCBpbnQgcHRuX3N6KQotewotCXVuc2lnbmVkIGludCBpLCBudW1fb2ZfcmF0ZTsKLQl1bnNpZ25lZCBpbnQgbWFzayA9IDA7Ci0KLQludW1fb2ZfcmF0ZSA9IChwdG5fc3ogPiBOdW1SYXRlcykgPyBOdW1SYXRlcyA6IHB0bl9zejsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fb2ZfcmF0ZTsgaSsrKQotCQltYXNrIHw9IDB4MSA8PCB3aWZpcmF0ZTJfcmF0ZXRibF9pbngyM2EoKihwdG4gKyBpKSk7Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KLXVuc2lnbmVkIGludCB1cGRhdGVfTVNDX3JhdGUyM2Eoc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzKQotewotCXVuc2lnbmVkIGludCBtYXNrOwotCi0JbWFzayA9IHBIVF9jYXBzLT5tY3MucnhfbWFza1swXSA8PCAxMiB8Ci0JCXBIVF9jYXBzLT5tY3MucnhfbWFza1sxXSA8PCAyMDsKLQotCXJldHVybiBtYXNrOwotfQotCi1pbnQgc3VwcG9ydF9zaG9ydF9HSTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBIVF9jYXBzKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JdW5zaWduZWQgY2hhciBiaXRfb2Zmc2V0OwotCi0JaWYgKCFwbWxtZWluZm8tPkhUX2VuYWJsZSkKLQkJcmV0dXJuIF9GQUlMOwotCWlmIChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9PSBIVF9JT1RfUEVFUl9SQUxJTkspCi0JCXJldHVybiBfRkFJTDsKLQliaXRfb2Zmc2V0ID0gKHBtbG1lZXh0LT5jdXJfYndtb2RlICYgSFRfQ0hBTk5FTF9XSURUSF80MCk/IDY6IDU7Ci0KLQlpZiAocEhUX2NhcHMtPmNhcF9pbmZvICYgY3B1X3RvX2xlMTYoMHgxIDw8IGJpdF9vZmZzZXQpKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JZWxzZQotCQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLXVuc2lnbmVkIGNoYXIgZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EodTMyIG1hc2spCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgY2hhciByYXRlX2lkeCA9IDA7Ci0KLQlmb3IgKGkgPSAyNzsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKG1hc2sgJiBCSVQoaSkpIHsKLQkJCXJhdGVfaWR4ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiByYXRlX2lkeDsKLX0KLQotdm9pZCBVcGRhdGVfUkFfRW50cnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXJ0d19oYWxfdXBkYXRlX3JhX21hc2syM2EocHN0YSwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9yYXRlX2FkYXB0aXZlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQlVcGRhdGVfUkFfRW50cnkyM2EocGFkYXB0ZXIsIHBzdGEpOwotfQotCi12b2lkIHNldF9zdGFfcmF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JLyogcmF0ZSBhZGFwdGl2ZSAqLwotCWVuYWJsZV9yYXRlX2FkYXB0aXZlKHBhZGFwdGVyLCBwc3RhKTsKLX0KLQotLyogIFVwZGF0ZSBSUlNSIGFuZCBSYXRlIGZvciBVU0VSQVRFICovCi12b2lkIHVwZGF0ZV90eF9iYXNpY19yYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHdpcmVsZXNzbW9kZSkKLXsKLQl1bnNpZ25lZCBjaGFyIHN1cHBvcnRlZF9yYXRlc1tORElTXzgwMl8xMV9MRU5HVEhfUkFURVNfRVhdOwotCi0JbWVtc2V0KHN1cHBvcnRlZF9yYXRlcywgMCwgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYKTsKLQotCWlmICh3aXJlbGVzc21vZGUgPT0gV0lSRUxFU1NfMTFCKSB7Ci0JCW1lbWNweShzdXBwb3J0ZWRfcmF0ZXMsIHJ0d19iYXNpY19yYXRlX2NjaywgNCk7Ci0JfSBlbHNlIGlmICh3aXJlbGVzc21vZGUgJiBXSVJFTEVTU18xMUIpIHsKLQkJbWVtY3B5KHN1cHBvcnRlZF9yYXRlcywgcnR3X2Jhc2ljX3JhdGVfbWl4LCA3KTsKLQl9IGVsc2UgewotCQltZW1jcHkoc3VwcG9ydGVkX3JhdGVzLCBydHdfYmFzaWNfcmF0ZV9vZmRtLCAzKTsKLQl9Ci0KLQlpZiAod2lyZWxlc3Ntb2RlICYgV0lSRUxFU1NfMTFCKQotCQl1cGRhdGVfbWdudF90eF9yYXRlMjNhKHBhZGFwdGVyLCBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CKTsKLQllbHNlCi0JCXVwZGF0ZV9tZ250X3R4X3JhdGUyM2EocGFkYXB0ZXIsIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CKTsKLQotCUhhbFNldEJyYXRlQ2ZnMjNhKHBhZGFwdGVyLCBzdXBwb3J0ZWRfcmF0ZXMpOwotfQotCi11bnNpZ25lZCBjaGFyIGNoZWNrX2Fzc29jX0FQMjNhKHU4ICpwZnJhbWUsIHVpbnQgbGVuKQotewotCWludCBpOwotCXU4IGVwaWdyYW1fdmVuZG9yX2ZsYWc7Ci0JdTggcmFsaW5rX3ZlbmRvcl9mbGFnOwotCWNvbnN0IHU4ICpwOwotCi0JZXBpZ3JhbV92ZW5kb3JfZmxhZyA9IDA7Ci0JcmFsaW5rX3ZlbmRvcl9mbGFnID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47KSB7Ci0JCXAgPSBwZnJhbWUgKyBpOwotCi0JCXN3aXRjaCAocFswXSkgewotCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJCWlmICghbWVtY21wKHAgKyAyLCBBUlRIRVJPU19PVUkxLCAzKSB8fAotCQkJICAgICFtZW1jbXAocCArIDIsIEFSVEhFUk9TX09VSTIsIDMpKSB7Ci0JCQkJREJHXzg3MjNBKCJsaW5rIHRvIEFydGhlcm9zIEFQXG4iKTsKLQkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfQVRIRVJPUzsKLQkJCX0gZWxzZSBpZiAoIW1lbWNtcChwICsgMiwgQlJPQURDT01fT1VJMSwgMykgfHwKLQkJCQkgICAhbWVtY21wKHAgKyAyLCBCUk9BRENPTV9PVUkyLCAzKSkgewotCQkJCURCR184NzIzQSgibGluayB0byBCcm9hZGNvbSBBUFxuIik7Ci0JCQkJcmV0dXJuIEhUX0lPVF9QRUVSX0JST0FEQ09NOwotCQkJfSBlbHNlIGlmICghbWVtY21wKHAgKyAyLCBNQVJWRUxMX09VSSwgMykpIHsKLQkJCQlEQkdfODcyM0EoImxpbmsgdG8gTWFydmVsbCBBUFxuIik7Ci0JCQkJcmV0dXJuIEhUX0lPVF9QRUVSX01BUlZFTEw7Ci0JCQl9IGVsc2UgaWYgKCFtZW1jbXAocCArIDIsIFJBTElOS19PVUksIDMpKSB7Ci0JCQkJaWYgKCFyYWxpbmtfdmVuZG9yX2ZsYWcpCi0JCQkJCXJhbGlua192ZW5kb3JfZmxhZyA9IDE7Ci0JCQkJZWxzZSB7Ci0JCQkJCURCR184NzIzQSgibGluayB0byBSYWxpbmsgQVBcbiIpOwotCQkJCQlyZXR1cm4gSFRfSU9UX1BFRVJfUkFMSU5LOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIW1lbWNtcChwICsgMiwgQ0lTQ09fT1VJLCAzKSkgewotCQkJCURCR184NzIzQSgibGluayB0byBDaXNjbyBBUFxuIik7Ci0JCQkJcmV0dXJuIEhUX0lPVF9QRUVSX0NJU0NPOwotCQkJfSBlbHNlIGlmICghbWVtY21wKHAgKyAyLCBSRUFMVEVLX09VSSwgMykpIHsKLQkJCQlEQkdfODcyM0EoImxpbmsgdG8gUmVhbHRlayA5NkJcbiIpOwotCQkJCXJldHVybiBIVF9JT1RfUEVFUl9SRUFMVEVLOwotCQkJfSBlbHNlIGlmICghbWVtY21wKHAgKyAyLCBBSVJHT0NBUF9PVUksIDMpKSB7Ci0JCQkJREJHXzg3MjNBKCJsaW5rIHRvIEFpcmdvIENhcFxuIik7Ci0JCQkJcmV0dXJuIEhUX0lPVF9QRUVSX0FJUkdPOwotCQkJfSBlbHNlIGlmICghbWVtY21wKHAgKyAyLCBFUElHUkFNX09VSSwgMykpIHsKLQkJCQllcGlncmFtX3ZlbmRvcl9mbGFnID0gMTsKLQkJCQlpZiAocmFsaW5rX3ZlbmRvcl9mbGFnKSB7Ci0JCQkJCURCR184NzIzQSgibGluayB0byBUZW5kYSBXMzExUiBBUFxuIik7Ci0JCQkJCXJldHVybiBIVF9JT1RfUEVFUl9URU5EQTsKLQkJCQl9IGVsc2UKLQkJCQkJREJHXzg3MjNBKCJDYXB0dXJlIEVQSUdSQU1fT1VJXG4iKTsKLQkJCX0gZWxzZQotCQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQlpICs9IChwWzFdICsgMik7Ci0JfQotCi0JaWYgKHJhbGlua192ZW5kb3JfZmxhZyAmJiAhZXBpZ3JhbV92ZW5kb3JfZmxhZykgewotCQlEQkdfODcyM0EoImxpbmsgdG8gUmFsaW5rIEFQXG4iKTsKLQkJcmV0dXJuIEhUX0lPVF9QRUVSX1JBTElOSzsKLQl9IGVsc2UgaWYgKHJhbGlua192ZW5kb3JfZmxhZyAmJiBlcGlncmFtX3ZlbmRvcl9mbGFnKSB7Ci0JCURCR184NzIzQSgibGluayB0byBUZW5kYSBXMzExUiBBUFxuIik7Ci0JCXJldHVybiBIVF9JT1RfUEVFUl9URU5EQTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoImxpbmsgdG8gbmV3IEFQXG4iKTsKLQkJcmV0dXJuIEhUX0lPVF9QRUVSX1VOS05PV047Ci0JfQotfQotCi12b2lkIHVwZGF0ZV9JT1RfaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlzd2l0Y2ggKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yKSB7Ci0JY2FzZSBIVF9JT1RfUEVFUl9NQVJWRUxMOgotCQlwbWxtZWluZm8tPnR1cmJvTW9kZV9jdHMyc2VsZiA9IDE7Ci0JCXBtbG1laW5mby0+dHVyYm9Nb2RlX3J0c2VuID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSBIVF9JT1RfUEVFUl9SQUxJTks6Ci0JCXBtbG1laW5mby0+dHVyYm9Nb2RlX2N0czJzZWxmID0gMDsKLQkJcG1sbWVpbmZvLT50dXJib01vZGVfcnRzZW4gPSAxOwotCQkvKiBkaXNhYmxlIGhpZ2ggcG93ZXIgKi8KLQkJcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9jbHIocGFkYXB0ZXIsICh1MzIpCi0JCQkJCQkgfkRZTkFNSUNfQkJfRFlOQU1JQ19UWFBXUik7Ci0JCWJyZWFrOwotCWNhc2UgSFRfSU9UX1BFRVJfUkVBTFRFSzoKLQkJLyogcnR3X3dyaXRlMTYocGFkYXB0ZXIsIDB4NGNjLCAweGZmZmYpOyAqLwotCQkvKiBydHdfd3JpdGUxNihwYWRhcHRlciwgMHg1NDYsIDB4MDFjMCk7ICovCi0JCS8qIGRpc2FibGUgaGlnaCBwb3dlciAqLwotCQlydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X2NscihwYWRhcHRlciwgKHUzMikKLQkJCQkJCSB+RFlOQU1JQ19CQl9EWU5BTUlDX1RYUFdSKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcG1sbWVpbmZvLT50dXJib01vZGVfY3RzMnNlbGYgPSAwOwotCQlwbWxtZWluZm8tPnR1cmJvTW9kZV9ydHNlbiA9IDE7Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCB1cGRhdGVfY2FwaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUxNiB1cGRhdGVDYXApCi17Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJkFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JaWYgKHVwZGF0ZUNhcCAmIGNTaG9ydFByZWFtYmxlKSB7Ci0JCS8qICBTaG9ydCBQcmVhbWJsZSAqLwotCQlpZiAocG1sbWVpbmZvLT5wcmVhbWJsZV9tb2RlICE9IFBSRUFNQkxFX1NIT1JUKSB7Ci0JCQkvKiAgUFJFQU1CTEVfTE9ORyBvciBQUkVBTUJMRV9BVVRPICovCi0JCQlwbWxtZWluZm8tPnByZWFtYmxlX21vZGUgPSBQUkVBTUJMRV9TSE9SVDsKLQkJCXJ0bDg3MjNhX2Fja19wcmVhbWJsZShBZGFwdGVyLCB0cnVlKTsKLQkJfQotCX0gZWxzZSB7IC8qICBMb25nIFByZWFtYmxlICovCi0JCWlmIChwbWxtZWluZm8tPnByZWFtYmxlX21vZGUgIT0gUFJFQU1CTEVfTE9ORykgewotCQkJLyogIFBSRUFNQkxFX1NIT1JUIG9yIFBSRUFNQkxFX0FVVE8gKi8KLQkJCXBtbG1laW5mby0+cHJlYW1ibGVfbW9kZSA9IFBSRUFNQkxFX0xPTkc7Ci0JCQlydGw4NzIzYV9hY2tfcHJlYW1ibGUoQWRhcHRlciwgZmFsc2UpOwotCQl9Ci0JfQotCWlmICh1cGRhdGVDYXAgJiBjSUJTUykgewotCQkvKiBGaWxlbjogU2VlIDgwMi4xMS0yMDA3IHAuOTEgKi8KLQkJcG1sbWVpbmZvLT5zbG90VGltZSA9IE5PTl9TSE9SVF9TTE9UX1RJTUU7Ci0JfSBlbHNlIHsKLQkJLyogRmlsZW46IFNlZSA4MDIuMTEtMjAwNyBwLjkwICovCi0JCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJgotCQkgICAgKFdJUkVMRVNTXzExRyB8IFdJUkVMRVNTXzExXzI0TikpIHsKLQkJCWlmICh1cGRhdGVDYXAgJiBjU2hvcnRTbG90VGltZSkgeyAvKiAgU2hvcnQgU2xvdCBUaW1lICovCi0JCQkJaWYgKHBtbG1laW5mby0+c2xvdFRpbWUgIT0gU0hPUlRfU0xPVF9USU1FKQotCQkJCQlwbWxtZWluZm8tPnNsb3RUaW1lID0gU0hPUlRfU0xPVF9USU1FOwotCQkJfSBlbHNlIHsgLyogIExvbmcgU2xvdCBUaW1lICovCi0JCQkJaWYgKHBtbG1laW5mby0+c2xvdFRpbWUgIT0gTk9OX1NIT1JUX1NMT1RfVElNRSkKLQkJCQkJcG1sbWVpbmZvLT5zbG90VGltZSA9Ci0JCQkJCQlOT05fU0hPUlRfU0xPVF9USU1FOwotCQkJfQotCQl9IGVsc2UgaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmCi0JCQkgICAoV0lSRUxFU1NfMTFBIHwgV0lSRUxFU1NfMTFfNU4pKSB7Ci0JCQlwbWxtZWluZm8tPnNsb3RUaW1lID0gU0hPUlRfU0xPVF9USU1FOwotCQl9IGVsc2UgewotCQkJLyogQiBNb2RlICovCi0JCQlwbWxtZWluZm8tPnNsb3RUaW1lID0gTk9OX1NIT1JUX1NMT1RfVElNRTsKLQkJfQotCX0KLQlydGw4NzIzYV9zZXRfc2xvdF90aW1lKEFkYXB0ZXIsIHBtbG1laW5mby0+c2xvdFRpbWUpOwotfQotCi12b2lkIHVwZGF0ZV93aXJlbGVzc19tb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IHJhdGVsZW4sIG5ldHdvcmtfdHlwZSA9IDA7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCXVuc2lnbmVkIGNoYXIgKnJhdGUgPSBjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXM7Ci0KLQlyYXRlbGVuID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCi0JaWYgKChwbWxtZWluZm8tPkhUX2luZm9fZW5hYmxlKSAmJiAocG1sbWVpbmZvLT5IVF9jYXBzX2VuYWJsZSkpCi0JCXBtbG1laW5mby0+SFRfZW5hYmxlID0gMTsKLQotCWlmIChwbWxtZWV4dC0+Y3VyX2NoYW5uZWwgPiAxNCkgewotCQlpZiAocG1sbWVpbmZvLT5IVF9lbmFibGUpCi0JCQluZXR3b3JrX3R5cGUgPSBXSVJFTEVTU18xMV81TjsKLQkJbmV0d29ya190eXBlIHw9IFdJUkVMRVNTXzExQTsKLQl9IGVsc2UgewotCQlpZiAocG1sbWVpbmZvLT5IVF9lbmFibGUpCi0JCQluZXR3b3JrX3R5cGUgPSBXSVJFTEVTU18xMV8yNE47Ci0KLQkJaWYgKGNja3JhdGVzb25seV9pbmNsdWRlZDIzYShyYXRlLCByYXRlbGVuKSA9PSB0cnVlKQotCQkJbmV0d29ya190eXBlIHw9IFdJUkVMRVNTXzExQjsKLQkJZWxzZSBpZiAoY2NrcmF0ZXNfaW5jbHVkZWQyM2EocmF0ZSwgcmF0ZWxlbikgPT0gdHJ1ZSkKLQkJCW5ldHdvcmtfdHlwZSB8PSBXSVJFTEVTU18xMUJHOwotCQllbHNlCi0JCQluZXR3b3JrX3R5cGUgfD0gV0lSRUxFU1NfMTFHOwotCX0KLQotCXBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9Ci0JCW5ldHdvcmtfdHlwZSAmIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lyZWxlc3NfbW9kZTsKLQotCS8qIDB4MDgwOCAtPiBmb3IgQ0NLLCAweDBhMGEgLT4gZm9yIE9GRE0gKi8KLQkvKiBjaGFuZ2UgdGhpcyB2YWx1ZSBpZiBoYXZpbmcgSU9UIGlzc3Vlcy4gKi8KLQlydGw4NzIzYV9zZXRfcmVzcF9zaWZzKHBhZGFwdGVyLCAweDA4LCAweDA4LCAweDBhLCAweDBhKTsKLQotCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMUIpCi0JCXVwZGF0ZV9tZ250X3R4X3JhdGUyM2EocGFkYXB0ZXIsIElFRUU4MDIxMV9DQ0tfUkFURV8xTUIpOwotCSBlbHNlCi0JCXVwZGF0ZV9tZ250X3R4X3JhdGUyM2EocGFkYXB0ZXIsIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CKTsKLX0KLQotdm9pZCB1cGRhdGVfYm1jX3N0YV9zdXBwb3J0X3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIG1hY19pZCkKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JaWYgKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSAmIFdJUkVMRVNTXzExQikgewotCQkvKiAgT25seSBCLCBCL0csIGFuZCBCL0cvTiBBUCBjb3VsZCB1c2UgQ0NLIHJhdGUgKi8KLQkJbWVtY3B5KChwbWxtZWluZm8tPkZXX3N0YV9pbmZvW21hY19pZF0uU3VwcG9ydGVkUmF0ZXMpLAotCQkgICAgICAgcnR3X2Jhc2ljX3JhdGVfY2NrLCA0KTsKLQl9IGVsc2UgewotCQltZW1jcHkocG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLlN1cHBvcnRlZFJhdGVzLAotCQkgICAgICAgcnR3X2Jhc2ljX3JhdGVfb2ZkbSwgMyk7Ci0JfQotfQotCi1pbnQgdXBkYXRlX3N0YV9zdXBwb3J0X3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnB2YXJfaWUsCi0JCQkgICAgICAgdWludCB2YXJfaWVfbGVuLCBpbnQgY2FtX2lkeCkKLXsKLQlpbnQgc3VwcG9ydFJhdGVOdW0gPSAwOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JY29uc3QgdTggKnA7Ci0KLQlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TVVBQX1JBVEVTLCBwdmFyX2llLCB2YXJfaWVfbGVuKTsKLQlpZiAoIXApCi0JCXJldHVybiBfRkFJTDsKLQotCW1lbWNweShwbWxtZWluZm8tPkZXX3N0YV9pbmZvW2NhbV9pZHhdLlN1cHBvcnRlZFJhdGVzLCBwICsgMiwgcFsxXSk7Ci0Jc3VwcG9ydFJhdGVOdW0gPSBwWzFdOwotCi0JcCA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfRVhUX1NVUFBfUkFURVMsIHB2YXJfaWUsIHZhcl9pZV9sZW4pOwotCWlmIChwKQotCQltZW1jcHkocG1sbWVpbmZvLT5GV19zdGFfaW5mb1tjYW1faWR4XS5TdXBwb3J0ZWRSYXRlcyArCi0JCSAgICAgICBzdXBwb3J0UmF0ZU51bSwgcCArIDIsIHBbMV0pOwotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotdm9pZCBwcm9jZXNzX2FkZGJhX3JlcTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICB1OCAqcGFkZGJhX3JlcSwgdTggKmFkZHIpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXUxNiB0aWQsIHN0YXJ0X3NlcSwgcGFyYW07Ci0Jc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IEFEREJBX3JlcXVlc3QgKnByZXEgPSAoc3RydWN0IEFEREJBX3JlcXVlc3QgKilwYWRkYmFfcmVxOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBhZGRyKTsKLQotCWlmIChwc3RhKSB7Ci0JCXN0YXJ0X3NlcSA9IGxlMTZfdG9fY3B1KHByZXEtPkJBX3N0YXJ0aW5nX3NlcWN0cmwpID4+IDQ7Ci0KLQkJcGFyYW0gPSBsZTE2X3RvX2NwdShwcmVxLT5CQV9wYXJhX3NldCk7Ci0JCXRpZCA9IChwYXJhbSA+PiAyKSAmIDB4MGY7Ci0KLQkJcHJlb3JkZXJfY3RybCA9ICZwc3RhLT5yZWN2cmVvcmRlcl9jdHJsW3RpZF07Ci0KLQkJcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxID0gMHhmZmZmOwotCi0JCXByZW9yZGVyX2N0cmwtPmVuYWJsZSA9IChwbWxtZWluZm8tPmJBY2NlcHRBZGRiYVJlcSA9PSB0cnVlKSA/Ci0JCQl0cnVlIDogZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d194bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3htaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlNDBjZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3htaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVFdfWE1JVF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfeG1pdC5oPgotCi1zdGF0aWMgdm9pZCBfaW5pdF90eHNlcnZxKHN0cnVjdCB0eF9zZXJ2cSAqcHR4c2VydnEpCi17Ci0KLQlJTklUX0xJU1RfSEVBRCgmcHR4c2VydnEtPnR4X3BlbmRpbmcpOwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHR4c2VydnEtPnN0YV9wZW5kaW5nKTsKLQlwdHhzZXJ2cS0+cWNudCA9IDA7Ci0KLX0KLQotdm9pZAlfcnR3X2luaXRfc3RhX3htaXRfcHJpdjIzYShzdHJ1Y3Qgc3RhX3htaXRfcHJpdiAqcHN0YV94bWl0cHJpdikKLXsKLQotCXNwaW5fbG9ja19pbml0KCZwc3RhX3htaXRwcml2LT5sb2NrKTsKLQotCS8qIGZvciAoaSA9IDAgOyBpIDwgTUFYX05VTUJMS1M7IGkrKykgKi8KLQkvKglfaW5pdF90eHNlcnZxKCZwc3RhX3htaXRwcml2LT5ibGtfcVtpXSk7ICovCi0KLQlfaW5pdF90eHNlcnZxKCZwc3RhX3htaXRwcml2LT5iZV9xKTsKLQlfaW5pdF90eHNlcnZxKCZwc3RhX3htaXRwcml2LT5ia19xKTsKLQlfaW5pdF90eHNlcnZxKCZwc3RhX3htaXRwcml2LT52aV9xKTsKLQlfaW5pdF90eHNlcnZxKCZwc3RhX3htaXRwcml2LT52b19xKTsKLQlJTklUX0xJU1RfSEVBRCgmcHN0YV94bWl0cHJpdi0+bGVnYWN5X2R6KTsKLQlJTklUX0xJU1RfSEVBRCgmcHN0YV94bWl0cHJpdi0+YXBzZCk7Ci0KLX0KLQotaW50IF9ydHdfaW5pdF94bWl0X3ByaXYyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LAotCQkJICAgc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpweGZyYW1lOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQl1MzIgbWF4X3htaXRfZXh0YnVmX3NpemUgPSBNQVhfWE1JVF9FWFRCVUZfU1o7Ci0JdTMyIG51bV94bWl0X2V4dGJ1ZiA9IE5SX1hNSVRfRVhUQlVGRjsKLQotCXNwaW5fbG9ja19pbml0KCZweG1pdHByaXYtPmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZweG1pdHByaXYtPmxvY2tfc2N0eCk7Ci0Jc2VtYV9pbml0KCZweG1pdHByaXYtPnhtaXRfc2VtYSwgMCk7Ci0Jc2VtYV9pbml0KCZweG1pdHByaXYtPnRlcm1pbmF0ZV94bWl0dGhyZWFkX3NlbWEsIDApOwotCi0JcHhtaXRwcml2LT5hZGFwdGVyID0gcGFkYXB0ZXI7Ci0KLQlfcnR3X2luaXRfcXVldWUyM2EoJnB4bWl0cHJpdi0+YmVfcGVuZGluZyk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZweG1pdHByaXYtPmJrX3BlbmRpbmcpOwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHhtaXRwcml2LT52aV9wZW5kaW5nKTsKLQlfcnR3X2luaXRfcXVldWUyM2EoJnB4bWl0cHJpdi0+dm9fcGVuZGluZyk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZweG1pdHByaXYtPmJtX3BlbmRpbmcpOwotCi0JX3J0d19pbml0X3F1ZXVlMjNhKCZweG1pdHByaXYtPmZyZWVfeG1pdF9xdWV1ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfWE1JVEZSQU1FOyBpKyspIHsKLQkJcHhmcmFtZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB4bWl0X2ZyYW1lKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHhmcmFtZSkKLQkJCWJyZWFrOwotCQlJTklUX0xJU1RfSEVBRCgmcHhmcmFtZS0+bGlzdCk7Ci0KLQkJcHhmcmFtZS0+cGFkYXB0ZXIgPSBwYWRhcHRlcjsKLQkJcHhmcmFtZS0+ZnJhbWVfdGFnID0gTlVMTF9GUkFNRVRBRzsKLQotCQlsaXN0X2FkZF90YWlsKCZweGZyYW1lLT5saXN0LAotCQkJICAgICAgJnB4bWl0cHJpdi0+ZnJlZV94bWl0X3F1ZXVlLnF1ZXVlKTsKLQl9Ci0KLQlweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCA9IGk7Ci0KLQlweG1pdHByaXYtPmZyYWdfbGVuID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCi0JLyogaW5pdCB4bWl0X2J1ZiAqLwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHhtaXRwcml2LT5mcmVlX3htaXRidWZfcXVldWUpOwotCUlOSVRfTElTVF9IRUFEKCZweG1pdHByaXYtPnhtaXRidWZfbGlzdCk7Ci0JX3J0d19pbml0X3F1ZXVlMjNhKCZweG1pdHByaXYtPnBlbmRpbmdfeG1pdGJ1Zl9xdWV1ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfWE1JVEJVRkY7IGkrKykgewotCQlweG1pdGJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZiksIEdGUF9LRVJORUwpOwotCQlpZiAoIXB4bWl0YnVmKQotCQkJZ290byBmYWlsOwotCQlJTklUX0xJU1RfSEVBRCgmcHhtaXRidWYtPmxpc3QpOwotCQlJTklUX0xJU1RfSEVBRCgmcHhtaXRidWYtPmxpc3QyKTsKLQotCQlweG1pdGJ1Zi0+cGFkYXB0ZXIgPSBwYWRhcHRlcjsKLQotCQkvKiBUeCBidWYgYWxsb2NhdGlvbiBtYXkgZmFpbCBzb21ldGltZXMsIHNvIHNsZWVwIGFuZCByZXRyeS4gKi8KLQkJcmVzID0gcnR3X29zX3htaXRfcmVzb3VyY2VfYWxsb2MyM2EocGFkYXB0ZXIsIHB4bWl0YnVmLAotCQkJCQkJIChNQVhfWE1JVEJVRl9TWiArIFhNSVRCVUZfQUxJR05fU1opKTsKLQkJaWYgKHJlcyA9PSBfRkFJTCkgewotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJbGlzdF9hZGRfdGFpbCgmcHhtaXRidWYtPmxpc3QsCi0JCQkgICAgICAmcHhtaXRwcml2LT5mcmVlX3htaXRidWZfcXVldWUucXVldWUpOwotCQlsaXN0X2FkZF90YWlsKCZweG1pdGJ1Zi0+bGlzdDIsCi0JCQkgICAgICAmcHhtaXRwcml2LT54bWl0YnVmX2xpc3QpOwotCX0KLQotCXB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX2NudCA9IE5SX1hNSVRCVUZGOwotCi0JLyogaW5pdCB4ZnJhbWVfZXh0IHF1ZXVlLCAgdGhlIHNhbWUgY291bnQgYXMgZXh0YnVmICAqLwotCV9ydHdfaW5pdF9xdWV1ZTIzYSgmcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfcXVldWUpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV94bWl0X2V4dGJ1ZjsgaSsrKSB7Ci0JCXB4ZnJhbWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeG1pdF9mcmFtZSksIEdGUF9LRVJORUwpOwotCQlpZiAoIXB4ZnJhbWUpCi0JCQlicmVhazsKLQkJSU5JVF9MSVNUX0hFQUQoJnB4ZnJhbWUtPmxpc3QpOwotCi0JCXB4ZnJhbWUtPnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0JCXB4ZnJhbWUtPmZyYW1lX3RhZyA9IE5VTExfRlJBTUVUQUc7Ci0KLQkJcHhmcmFtZS0+cGt0ID0gTlVMTDsKLQotCQlweGZyYW1lLT5idWZfYWRkciA9IE5VTEw7Ci0JCXB4ZnJhbWUtPnB4bWl0YnVmID0gTlVMTDsKLQotCQlweGZyYW1lLT5leHRfdGFnID0gMTsKLQotCQlsaXN0X2FkZF90YWlsKCZweGZyYW1lLT5saXN0LAotCQkJICAgICAgJnB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X3F1ZXVlLnF1ZXVlKTsKLQl9Ci0JcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250ID0gaTsKLQotCS8qICBJbml0IHhtaXQgZXh0ZW5zaW9uIGJ1ZmYgKi8KLQlfcnR3X2luaXRfcXVldWUyM2EoJnB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJnB4bWl0cHJpdi0+eG1pdGV4dGJ1Zl9saXN0KTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1feG1pdF9leHRidWY7IGkrKykgewotCQlweG1pdGJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB4bWl0X2J1ZiksIEdGUF9LRVJORUwpOwotCQlpZiAoIXB4bWl0YnVmKQotCQkJZ290byBmYWlsOwotCQlJTklUX0xJU1RfSEVBRCgmcHhtaXRidWYtPmxpc3QpOwotCQlJTklUX0xJU1RfSEVBRCgmcHhtaXRidWYtPmxpc3QyKTsKLQotCQlweG1pdGJ1Zi0+cGFkYXB0ZXIgPSBwYWRhcHRlcjsKLQotCQkvKiBUeCBidWYgYWxsb2NhdGlvbiBtYXkgZmFpbCBzb21ldGltZXMsIHNvIHNsZWVwIGFuZCByZXRyeS4gKi8KLQkJcmVzID0gcnR3X29zX3htaXRfcmVzb3VyY2VfYWxsb2MyM2EocGFkYXB0ZXIsIHB4bWl0YnVmLAotCQkJCQkJIG1heF94bWl0X2V4dGJ1Zl9zaXplICsgWE1JVEJVRl9BTElHTl9TWik7Ci0JCWlmIChyZXMgPT0gX0ZBSUwpIHsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCWxpc3RfYWRkX3RhaWwoJnB4bWl0YnVmLT5saXN0LAotCQkJICAgICAgJnB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9xdWV1ZS5xdWV1ZSk7Ci0JCWxpc3RfYWRkX3RhaWwoJnB4bWl0YnVmLT5saXN0MiwKLQkJCSAgICAgICZweG1pdHByaXYtPnhtaXRleHRidWZfbGlzdCk7Ci0JfQotCi0JcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX2NudCA9IG51bV94bWl0X2V4dGJ1ZjsKLQotCXJ0d19hbGxvY19od3htaXRzMjNhKHBhZGFwdGVyKTsKLQlydHdfaW5pdF9od3htaXRzMjNhKHB4bWl0cHJpdi0+aHd4bWl0cywgcHhtaXRwcml2LT5od3htaXRfZW50cnkpOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkgKyspCi0JCXB4bWl0cHJpdi0+d21tX3BhcmFfc2VxW2ldID0gaTsKLQotCXNlbWFfaW5pdCgmcHhtaXRwcml2LT50eF9yZXRldnQsIDApOwotCi0JcHhtaXRwcml2LT5hY2tfdHggPSBmYWxzZTsKLQltdXRleF9pbml0KCZweG1pdHByaXYtPmFja190eF9tdXRleCk7Ci0JcnR3X3NjdHhfaW5pdDIzYSgmcHhtaXRwcml2LT5hY2tfdHhfb3BzLCAwKTsKLQl0YXNrbGV0X2luaXQoJnBhZGFwdGVyLT54bWl0cHJpdi54bWl0X3Rhc2tsZXQsCi0JCSAgICAgKHZvaWQoKikodW5zaWduZWQgbG9uZykpcnRsODcyM2F1X3htaXRfdGFza2xldCwKLQkJICAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7Ci0KLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotZmFpbDoKLQlnb3RvIGV4aXQ7Ci19Ci0KLXZvaWQgX3J0d19mcmVlX3htaXRfcHJpdjIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHB4bWl0cHJpdi0+YWRhcHRlcjsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhmcmFtZSwgKnB0bXA7Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZiwgKnB0bXAyOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4ZnJhbWUsIHB0bXAsCi0JCQkJICZweG1pdHByaXYtPmZyZWVfeG1pdF9xdWV1ZS5xdWV1ZSwgbGlzdCkgewotCQlsaXN0X2RlbF9pbml0KCZweGZyYW1lLT5saXN0KTsKLQkJcnR3X29zX3htaXRfY29tcGxldGUyM2EocGFkYXB0ZXIsIHB4ZnJhbWUpOwotCQlrZnJlZShweGZyYW1lKTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHhtaXRidWYsIHB0bXAyLAotCQkJCSAmcHhtaXRwcml2LT54bWl0YnVmX2xpc3QsIGxpc3QyKSB7Ci0JCWxpc3RfZGVsX2luaXQoJnB4bWl0YnVmLT5saXN0Mik7Ci0JCXJ0d19vc194bWl0X3Jlc291cmNlX2ZyZWUyM2EocGFkYXB0ZXIsIHB4bWl0YnVmKTsKLQkJa2ZyZWUocHhtaXRidWYpOwotCX0KLQotCS8qIGZyZWUgeGZyYW1lX2V4dCBxdWV1ZSwgIHRoZSBzYW1lIGNvdW50IGFzIGV4dGJ1ZiAgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHhmcmFtZSwgcHRtcCwKLQkJCQkgJnB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X3F1ZXVlLnF1ZXVlLAotCQkJCSBsaXN0KSB7Ci0JCWxpc3RfZGVsX2luaXQoJnB4ZnJhbWUtPmxpc3QpOwotCQlydHdfb3NfeG1pdF9jb21wbGV0ZTIzYShwYWRhcHRlciwgcHhmcmFtZSk7Ci0JCWtmcmVlKHB4ZnJhbWUpOwotCX0KLQotCS8qICBmcmVlIHhtaXQgZXh0ZW5zaW9uIGJ1ZmYgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHhtaXRidWYsIHB0bXAyLAotCQkJCSAmcHhtaXRwcml2LT54bWl0ZXh0YnVmX2xpc3QsIGxpc3QyKSB7Ci0JCWxpc3RfZGVsX2luaXQoJnB4bWl0YnVmLT5saXN0Mik7Ci0JCXJ0d19vc194bWl0X3Jlc291cmNlX2ZyZWUyM2EocGFkYXB0ZXIsIHB4bWl0YnVmKTsKLQkJa2ZyZWUocHhtaXRidWYpOwotCX0KLQotCXJ0d19mcmVlX2h3eG1pdHMyM2EocGFkYXB0ZXIpOwotCW11dGV4X2Rlc3Ryb3koJnB4bWl0cHJpdi0+YWNrX3R4X211dGV4KTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2F0dHJpYl92Y3NfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQl1MzIJc3o7Ci0Jc3RydWN0IHBrdF9hdHRyaWIJKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBzdGFfaW5mbwkqcHN0YSA9IHBhdHRyaWItPnBzdGE7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCWlmIChwYXR0cmliLT5wc3RhKSB7Ci0JCXBzdGEgPSBwYXR0cmliLT5wc3RhOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiJXMsIGNhbGwgcnR3X2dldF9zdGFpbmZvMjNhKClcbiIsIF9fZnVuY19fKTsKLQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsICZwYXR0cmliLT5yYVswXSk7Ci0JfQotCi0JaWYgKHBzdGEgPT0gTlVMTCkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCEocHN0YS0+c3RhdGUgJl9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEtPnN0YXRlKDB4JXgpICE9IF9GV19MSU5LRURcbiIsIF9fZnVuY19fLCBwc3RhLT5zdGF0ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocGF0dHJpYi0+bnJfZnJhZ3MgIT0gMSkKLQkJc3ogPSBwYWRhcHRlci0+eG1pdHByaXYuZnJhZ19sZW47Ci0JZWxzZSAvKiBubyBmcmFnICovCi0JCXN6ID0gcGF0dHJpYi0+bGFzdF90eGNtZHN6OwotCi0JLyogICgxKSBSVFNfVGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvIHRoZSBNUERVLCBub3QgTVNEVS4gKi8KLQkvKiAgKDIpIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGZyYWcgaW4gIHRoaXMgTVNEVSwgb25seSB0aGUgZmlyc3QgZnJhZyB1c2VzIHByb3RlY3Rpb24gZnJhbWUuICovCi0JLyoJCU90aGVyIGZyYWdtZW50cyBhcmUgcHJvdGVjdGVkIGJ5IHByZXZpb3VzIGZyYWdtZW50LiAqLwotCS8qCQlTbyB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIGxlbmd0aCBvZiBmaXJzdCBmcmFnbWVudC4gKi8KLQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlIDwgV0lSRUxFU1NfMTFfMjROICB8fCBwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYykgewotCQlpZiAoc3ogPiBwYWRhcHRlci0+cmVnaXN0cnlwcml2LnJ0c190aHJlc2gpIHsKLQkJCXBhdHRyaWItPnZjc19tb2RlID0gUlRTX0NUUzsKLQkJfSBlbHNlIHsKLQkJCWlmIChwc3RhLT5ydHNlbikKLQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IFJUU19DVFM7Ci0JCQllbHNlIGlmIChwc3RhLT5jdHMyc2VsZikKLQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IENUU19UT19TRUxGOwotCQkJZWxzZQotCQkJCXBhdHRyaWItPnZjc19tb2RlID0gTk9ORV9WQ1M7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAodHJ1ZSkgewotCQkJLyogSU9UIGFjdGlvbiAqLwotCQkJaWYgKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX0FUSEVST1MgJiYKLQkJCSAgICBwYXR0cmliLT5hbXBkdV9lbiAmJgotCQkJICAgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9PQotCQkJICAgIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVApIHsKLQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IENUU19UT19TRUxGOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBjaGVjayBFUlAgcHJvdGVjdGlvbiAqLwotCQkJaWYgKHBzdGEtPnJ0c2VuIHx8IHBzdGEtPmN0czJzZWxmKSB7Ci0JCQkJaWYgKHBzdGEtPnJ0c2VuKQotCQkJCQlwYXR0cmliLT52Y3NfbW9kZSA9IFJUU19DVFM7Ci0JCQkJZWxzZSBpZiAocHN0YS0+Y3RzMnNlbGYpCi0JCQkJCXBhdHRyaWItPnZjc19tb2RlID0gQ1RTX1RPX1NFTEY7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogY2hlY2sgSFQgb3AgbW9kZSAqLwotCQkJaWYgKHBhdHRyaWItPmh0X2VuKSB7Ci0JCQkJdTggSFRPcE1vZGUgPSBwbWxtZWluZm8tPkhUX3Byb3RlY3Rpb247Ci0KLQkJCQlpZiAoKHBtbG1lZXh0LT5jdXJfYndtb2RlICYmIChIVE9wTW9kZSA9PSAyIHx8IEhUT3BNb2RlID09IDMpKSB8fAotCQkJCSAgICAoIXBtbG1lZXh0LT5jdXJfYndtb2RlICYmIEhUT3BNb2RlID09IDMpKSB7Ci0JCQkJCXBhdHRyaWItPnZjc19tb2RlID0gUlRTX0NUUzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBjaGVjayBydHMgKi8KLQkJCWlmIChzeiA+IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucnRzX3RocmVzaCkgewotCQkJCXBhdHRyaWItPnZjc19tb2RlID0gUlRTX0NUUzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogdG8gZG8gbGlzdDogY2hlY2sgTUlNTyBwb3dlciBzYXZlIGNvbmRpdGlvbi4gKi8KLQotCQkJLyogY2hlY2sgQU1QRFUgYWdncmVnYXRpb24gZm9yIFRYT1AgKi8KLQkJCWlmIChwYXR0cmliLT5hbXBkdV9lbikgewotCQkJCXBhdHRyaWItPnZjc19tb2RlID0gUlRTX0NUUzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJcGF0dHJpYi0+dmNzX21vZGUgPSBOT05FX1ZDUzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfYXR0cmliX3BoeV9pbmZvKHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0JLyppZiAocHN0YS0+cnRzZW4pCi0JCXBhdHRyaWItPnZjc19tb2RlID0gUlRTX0NUUzsKLQllbHNlIGlmIChwc3RhLT5jdHMyc2VsZikKLQkJcGF0dHJpYi0+dmNzX21vZGUgPSBDVFNfVE9fU0VMRjsKLQllbHNlCi0JCXBhdHRyaWItPnZjc19tb2RlID0gTk9ORV9WQ1M7Ki8KLQotCXBhdHRyaWItPm1kYXRhID0gMDsKLQlwYXR0cmliLT5lb3NwID0gMDsKLQlwYXR0cmliLT50cmlnZ2VyZWQgPSAwOwotCi0JLyogcW9zX2VuLCBodF9lbiwgaW5pdCByYXRlLCAsIGJ3LCBjaF9vZmZzZXQsIHNnaSAqLwotCXBhdHRyaWItPnFvc19lbiA9IHBzdGEtPnFvc19vcHRpb247Ci0KLQlwYXR0cmliLT5yYWlkID0gcHN0YS0+cmFpZDsKLQlwYXR0cmliLT5odF9lbiA9IHBzdGEtPmh0cHJpdi5odF9vcHRpb247Ci0JcGF0dHJpYi0+Yndtb2RlID0gcHN0YS0+aHRwcml2LmJ3bW9kZTsKLQlwYXR0cmliLT5jaF9vZmZzZXQgPSBwc3RhLT5odHByaXYuY2hfb2Zmc2V0OwotCXBhdHRyaWItPnNnaSA9IHBzdGEtPmh0cHJpdi5zZ2k7Ci0JcGF0dHJpYi0+YW1wZHVfZW4gPSBmYWxzZTsKLQotCXBhdHRyaWItPnJldHJ5X2N0cmwgPSBmYWxzZTsKLX0KLQotdTggcW9zX2FjbTIzYSh1OCBhY21fbWFzaywgdTggcHJpb3JpdHkpCi17Ci0JdTggY2hhbmdlX3ByaW9yaXR5ID0gcHJpb3JpdHk7Ci0KLQlzd2l0Y2ggKHByaW9yaXR5KSB7Ci0JY2FzZSAwOgotCWNhc2UgMzoKLQkJaWYgKGFjbV9tYXNrICYgQklUKDEpKQotCQkJY2hhbmdlX3ByaW9yaXR5ID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCWNhc2UgNToKLQkJaWYgKGFjbV9tYXNrICYgQklUKDIpKQotCQkJY2hhbmdlX3ByaW9yaXR5ID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCWNhc2UgNzoKLQkJaWYgKGFjbV9tYXNrICYgQklUKDMpKQotCQkJY2hhbmdlX3ByaW9yaXR5ID0gNTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJREJHXzg3MjNBKCJxb3NfYWNtMjNhKCk6IGludmFsaWQgcGF0dHJpYi0+cHJpb3JpdHk6ICVkISEhXG4iLAotCQkJICBwcmlvcml0eSk7Ci0JCWNoYW5nZV9wcmlvcml0eSA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBjaGFuZ2VfcHJpb3JpdHk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9xb3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIpCi17Ci0JdTggKnBmcmFtZSA9IHNrYi0+ZGF0YTsKLQlzdHJ1Y3QgaXBoZHIgKmlwX2hkcjsKLQl1OCBVc2VyUHJpb3JpdHkgPSAwOwotCi0JLyogIGdldCBVc2VyUHJpb3JpdHkgZnJvbSBJUCBoZHIgKi8KLQlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9JUCkgewotCQlpcF9oZHIgPSAoc3RydWN0IGlwaGRyICopKHBmcmFtZSArIEVUSF9ITEVOKTsKLQkJVXNlclByaW9yaXR5ID0gaXBfaGRyLT50b3MgPj4gNTsKLQl9IGVsc2UgaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB7Ci0JCS8qICAiV2hlbiBwcmlvcml0eSBwcm9jZXNzaW5nIG9mIGRhdGEgZnJhbWVzIGlzIHN1cHBvcnRlZCwgKi8KLQkJLyogIGEgU1RBJ3MgU01FIHNob3VsZCBzZW5kIEVBUE9MLUtleSBmcmFtZXMgYXQgdGhlIGhpZ2hlc3QKLQkJICAgIHByaW9yaXR5LiIgKi8KLQkJVXNlclByaW9yaXR5ID0gNzsKLQl9Ci0KLQlwYXR0cmliLT5wcmlvcml0eSA9IFVzZXJQcmlvcml0eTsKLQlwYXR0cmliLT5oZHJsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKTsKLQlwYXR0cmliLT50eXBlID0gSUVFRTgwMjExX0ZUWVBFX0RBVEEgfCBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEE7Ci19Ci0KLXN0YXRpYyBpbnQgdXBkYXRlX2F0dHJpYihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliKQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0JaW50IGJtY2FzdDsKLQlzdHJ1Y3Qgc3RhX3ByaXYJKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IGV0aGhkciAqZWhkciA9IChzdHJ1Y3QgZXRoaGRyICopIHNrYi0+ZGF0YTsKLQotCXBhdHRyaWItPmV0aGVyX3R5cGUgPSBudG9ocyhlaGRyLT5oX3Byb3RvKTsKLQotCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5kc3QsIGVoZHItPmhfZGVzdCk7Ci0JZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnNyYywgZWhkci0+aF9zb3VyY2UpOwotCi0JcGF0dHJpYi0+cGN0cmwgPSAwOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSB8fAotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5yYSwgcGF0dHJpYi0+ZHN0KTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnRhLCBwYXR0cmliLT5zcmMpOwotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJZXRoZXJfYWRkcl9jb3B5KHBhdHRyaWItPnJhLCBnZXRfYnNzaWQocG1sbWVwcml2KSk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgcGF0dHJpYi0+c3JjKTsKLQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewotCQlldGhlcl9hZGRyX2NvcHkocGF0dHJpYi0+cmEsIHBhdHRyaWItPmRzdCk7Ci0JCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgZ2V0X2Jzc2lkKHBtbG1lcHJpdikpOwotCX0KLQotCXBhdHRyaWItPnBrdGxlbiA9IHNrYi0+bGVuIC0gRVRIX0hMRU47Ci0KLQlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9JUCkgewotCQkvKiAgVGhlIGZvbGxvd2luZyBpcyBmb3IgREhDUCBhbmQgQVJQIHBhY2tldCwgd2UgdXNlIGNjazFNCi0JCSAgICB0byB0eCB0aGVzZSBwYWNrZXRzIGFuZCBsZXQgTFBTIGF3YWtlIHNvbWUgdGltZSAqLwotCQkvKiAgdG8gcHJldmVudCBESENQIHByb3RvY29sIGZhaWwgKi8KLQkJcGF0dHJpYi0+ZGhjcF9wa3QgPSAwOwotCQkvKiBNSU5JTVVNX0RIQ1BfUEFDS0VUX1NJWkUpIHsgKi8KLQkJaWYgKHBhdHRyaWItPnBrdGxlbiA+IDI4MiArIDI0KSB7Ci0JCQlpZiAocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9JUCkgey8qICBJUCBoZWFkZXIgKi8KLQkJCQl1OCAqcGZyYW1lID0gc2tiLT5kYXRhOwotCi0JCQkJcGZyYW1lICs9IEVUSF9ITEVOOwotCi0JCQkJaWYgKChwZnJhbWVbMjFdID09IDY4ICYmIHBmcmFtZVsyM10gPT0gNjcpIHx8Ci0JCQkJICAgIChwZnJhbWVbMjFdID09IDY3ICYmIHBmcmFtZVsyM10gPT0gNjgpKSB7Ci0JCQkJCS8qICA2OCA6IFVEUCBCT09UUCBjbGllbnQgKi8KLQkJCQkJLyogIDY3IDogVURQIEJPT1RQIHNlcnZlciAqLwotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywKLQkJCQkJCSBfZHJ2X2Vycl8sCi0JCQkJCQkgIj09PT09PT09PT09PT09PT09PT09PT11cGRhdGVfYXR0cmliOiBnZXQgREhDUCBQYWNrZXRcbiIpOwotCQkJCQlwYXR0cmliLT5kaGNwX3BrdCA9IDE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX1BBRSkgewotCQlEQkdfODcyM0FfTEVWRUwoX2Rydl9hbHdheXNfLCAic2VuZCBlYXBvbCBwYWNrZXRcbiIpOwotCX0KLQotCWlmICgocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9QQUUpIHx8IChwYXR0cmliLT5kaGNwX3BrdCA9PSAxKSkgewotCQlydHdfc2V0X3NjYW5fZGVueShwYWRhcHRlciwgMzAwMCk7Ci0JfQotCi0JLyogIElmIEVBUE9MICwgQVJQICwgT1IgREhDUCBwYWNrZXQsIGRyaXZlciBtdXN0IGJlIGluIGFjdGl2ZSBtb2RlLiAqLwotCWlmICgocGF0dHJpYi0+ZXRoZXJfdHlwZSA9PSBFVEhfUF9BUlApIHx8Ci0JICAgIChwYXR0cmliLT5ldGhlcl90eXBlID09IEVUSF9QX1BBRSkgfHwgKHBhdHRyaWItPmRoY3BfcGt0ID09IDEpKSB7Ci0JCXJ0d19scHNfY3RybF93a19jbWQyM2EocGFkYXB0ZXIsIExQU19DVFJMX1NQRUNJQUxfUEFDS0VULCAxKTsKLQl9Ci0KLQlibWNhc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSk7Ci0KLQkvKiAgZ2V0IHN0YV9pbmZvICovCi0JaWYgKGJtY2FzdCkgewotCQlwc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCX0gZWxzZSB7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPnJhKTsKLQkJaWYgKHBzdGEgPT0gTlVMTCkgeyAvKiAgaWYgd2UgY2Fubm90IGdldCBwc3RhID0+IGRycnAgdGhlIHBrdCAqLwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfYWxlcnRfLAotCQkJCSAidXBkYXRlX2F0dHJpYiA9PiBnZXQgc3RhX2luZm8gZmFpbCwgcmE6JXBNXG4iLAotCQkJCSBwYXR0cmliLT5yYSk7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkgJiYKLQkJCSAgICghKHBzdGEtPnN0YXRlICYgX0ZXX0xJTktFRCkpKSB7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0KLQotCWlmIChwc3RhKSB7Ci0JCXBhdHRyaWItPm1hY19pZCA9IHBzdGEtPm1hY19pZDsKLQkJLyogREJHXzg3MjNBKCIlcyA9PT4gbWFjX2lkKCVkKVxuIiwgX19mdW5jX18sIHBhdHRyaWItPm1hY19pZCk7ICovCi0JCXBhdHRyaWItPnBzdGEgPSBwc3RhOwotCX0gZWxzZSB7Ci0JCS8qICBpZiB3ZSBjYW5ub3QgZ2V0IHBzdGEgPT4gZHJvcCB0aGUgcGt0ICovCi0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2FsZXJ0XywKLQkJCSAidXBkYXRlX2F0dHJpYiA9PiBnZXQgc3RhX2luZm8gZmFpbCwgcmE6JXBNXG4iLAotCQkJIHBhdHRyaWItPnJhKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwYXR0cmliLT5hY2tfcG9saWN5ID0gMDsKLQkvKiAgZ2V0IGV0aGVyX2hkcl9sZW4gKi8KLQotCS8qIHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gMHg4MTAwKSA/ICgxNCArIDQpOiAxNDsgdmxhbiB0YWcgKi8KLQlwYXR0cmliLT5wa3RfaGRybGVuID0gRVRIX0hMRU47Ci0KLQlwYXR0cmliLT5oZHJsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBhdHRyaWItPnR5cGUgPSBJRUVFODAyMTFfRlRZUEVfREFUQTsKLQlwYXR0cmliLT5wcmlvcml0eSA9IDA7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUgfCBXSUZJX0FESE9DX1NUQVRFIHwKLQkJCSAgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCWlmIChwc3RhLT5xb3Nfb3B0aW9uKQotCQkJc2V0X3Fvcyhza2IsIHBhdHRyaWIpOwotCX0gZWxzZSB7Ci0JCWlmIChwbWxtZXByaXYtPnFvc19vcHRpb24pIHsKLQkJCXNldF9xb3Moc2tiLCBwYXR0cmliKTsKLQotCQkJaWYgKHBtbG1lcHJpdi0+YWNtX21hc2sgIT0gMCkgewotCQkJCXBhdHRyaWItPnByaW9yaXR5ID0gcW9zX2FjbTIzYShwbWxtZXByaXYtPmFjbV9tYXNrLAotCQkJCQkJCSAgICBwYXR0cmliLT5wcmlvcml0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAocHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0gdHJ1ZSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICJwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9PSB0cnVlXG4iKTsKLQotCQlwYXR0cmliLT5lbmNyeXB0ID0gMDsKLQotCQlpZiAoKHBhdHRyaWItPmV0aGVyX3R5cGUgIT0gRVRIX1BfUEFFKSAmJgotCQkgICAgIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgInBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID09IHRydWUsICBwYXR0cmliLT5ldGhlcl90eXBlKCUuNHgpICE9IDB4ODg4ZVxuIiwKLQkJCQkgcGF0dHJpYi0+ZXRoZXJfdHlwZSk7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0gZWxzZSB7Ci0JCUdFVF9FTkNSWV9BTEdPKHBzZWN1cml0eXByaXYsIHBzdGEsIHBhdHRyaWItPmVuY3J5cHQsIGJtY2FzdCk7Ci0KLQkJc3dpdGNoIChwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtKSB7Ci0JCWNhc2UgZG90MTFBdXRoQWxncnRobV9PcGVuOgotCQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkOgotCQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fQXV0bzoKLQkJCXBhdHRyaWItPmtleV9pZHggPQotCQkJCSh1OClwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lLZXlJbmRleDsKLQkJCWJyZWFrOwotCQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fODAyMVg6Ci0JCQlpZiAoYm1jYXN0KQotCQkJCXBhdHRyaWItPmtleV9pZHggPQotCQkJCQkodTgpcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkOwotCQkJZWxzZQotCQkJCXBhdHRyaWItPmtleV9pZHggPSAwOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwYXR0cmliLT5rZXlfaWR4ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQlzd2l0Y2ggKHBhdHRyaWItPmVuY3J5cHQpIHsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQlwYXR0cmliLT5pdl9sZW4gPSBJRUVFODAyMTFfV0VQX0lWX0xFTjsKLQkJcGF0dHJpYi0+aWN2X2xlbiA9IElFRUU4MDIxMV9XRVBfSUNWX0xFTjsKLQkJYnJlYWs7Ci0KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCXBhdHRyaWItPml2X2xlbiA9IElFRUU4MDIxMV9US0lQX0lWX0xFTjsKLQkJcGF0dHJpYi0+aWN2X2xlbiA9IElFRUU4MDIxMV9US0lQX0lDVl9MRU47Ci0KLQkJaWYgKCFwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5KSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAicGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSglZCkgPT0gZmFsc2UgZHJvcCBwYWNrZXRcbiIsCi0JCQkJIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkpOwotCQkJcmVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJwYXR0cmliLT5lbmNyeXB0ID0lZCAoV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUClcbiIsCi0JCQkgcGF0dHJpYi0+ZW5jcnlwdCk7Ci0JCXBhdHRyaWItPml2X2xlbiA9IElFRUU4MDIxMV9DQ01QX0hEUl9MRU47Ci0JCXBhdHRyaWItPmljdl9sZW4gPSBJRUVFODAyMTFfQ0NNUF9NSUNfTEVOOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXBhdHRyaWItPml2X2xlbiA9IDA7Ci0JCXBhdHRyaWItPmljdl9sZW4gPSAwOwotCQlicmVhazsKLQl9Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJICJ1cGRhdGVfYXR0cmliOiBlbmNyeXB0ID0lZFxuIiwgcGF0dHJpYi0+ZW5jcnlwdCk7Ci0KLQlpZiAocGF0dHJpYi0+ZW5jcnlwdCAmJiAhcHNlY3VyaXR5cHJpdi0+aHdfZGVjcnlwdGVkKSB7Ci0JCXBhdHRyaWItPmJzd2VuYyA9IHRydWU7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInVwZGF0ZV9hdHRyaWI6IGVuY3J5cHQgPSVkIGJzd2VuYyA9IHRydWVcbiIsCi0JCQkgcGF0dHJpYi0+ZW5jcnlwdCk7Ci0JfSBlbHNlIHsKLQkJcGF0dHJpYi0+YnN3ZW5jID0gZmFsc2U7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJ1cGRhdGVfYXR0cmliOiBic3dlbmMgPSBmYWxzZVxuIik7Ci0JfQotCXVwZGF0ZV9hdHRyaWJfcGh5X2luZm8ocGF0dHJpYiwgcHN0YSk7Ci0KLWV4aXQ6Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50IHhtaXRmcmFtZV9hZGRtaWMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkgewotCXN0cnVjdCBtaWNfZGF0YSBtaWNkYXRhOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhaW5mbzsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCWludCBjdXJmcmFnbnVtLCBsZW5ndGg7Ci0JdTggKnBmcmFtZSwgKnBheWxvYWQsIG1pY1s4XTsKLQl1OCBwcmlvcml0eVs0XT0gezB4MCwgMHgwLCAweDAsIDB4MH07Ci0JdTggaHdfaGRyX29mZnNldCA9IDA7Ci0JaW50IGJtY3N0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpOwotCi0JaWYgKHBhdHRyaWItPnBzdGEpIHsKLQkJc3RhaW5mbyA9IHBhdHRyaWItPnBzdGE7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlzdGFpbmZvID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgJnBhdHRyaWItPnJhWzBdKTsKLQl9Ci0KLQlpZiAoIXN0YWluZm8pIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YSA9PSBOVUxcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCWlmICghKHN0YWluZm8tPnN0YXRlICZfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhLT5zdGF0ZSgweCV4KSAhPSBfRldfTElOS0VEXG4iLAotCQkJICBfX2Z1bmNfXywgc3RhaW5mby0+c3RhdGUpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaHdfaGRyX29mZnNldCA9IFRYREVTQ19PRkZTRVQ7Ci0KLQlpZiAocGF0dHJpYi0+ZW5jcnlwdCA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSB7Ci0JCS8qIGVuY29kZSBtaWMgY29kZSAqLwotCQlpZiAoc3RhaW5mbykgewotCQkJdTggbnVsbF9rZXlbMTZdPXsweDAsIDB4MCwgMHgwLCAweDAsCi0JCQkJCSAweDAsIDB4MCwgMHgwLCAweDAsCi0JCQkJCSAweDAsIDB4MCwgMHgwLCAweDAsCi0JCQkJCSAweDAsIDB4MCwgMHgwLCAweDB9OwotCi0JCQlwZnJhbWUgPSBweG1pdGZyYW1lLT5idWZfYWRkciArIGh3X2hkcl9vZmZzZXQ7Ci0KLQkJCWlmIChibWNzdCkgewotCQkJCWlmICghbWVtY21wKHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnB0eG1pY2tleVtwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWRdLnNrZXksIG51bGxfa2V5LCAxNikpIHsKLQkJCQkJcmV0dXJuIF9GQUlMOwotCQkJCX0KLQkJCQkvKiBzdGFydCB0byBjYWxjdWxhdGUgdGhlIG1pYyBjb2RlICovCi0JCQkJcnR3X3NlY21pY3NldGtleTIzYSgmbWljZGF0YSwgcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycHR4bWlja2V5W3BzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZF0uc2tleSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghbWVtY21wKCZzdGFpbmZvLT5kb3QxMXRraXB0eG1pY2tleS5za2V5WzBdLAotCQkJCQkgICAgbnVsbF9rZXksIDE2KSkgewotCQkJCQlyZXR1cm4gX0ZBSUw7Ci0JCQkJfQotCQkJCS8qIHN0YXJ0IHRvIGNhbGN1bGF0ZSB0aGUgbWljIGNvZGUgKi8KLQkJCQlydHdfc2VjbWljc2V0a2V5MjNhKCZtaWNkYXRhLCAmc3RhaW5mby0+ZG90MTF0a2lwdHhtaWNrZXkuc2tleVswXSk7Ci0JCQl9Ci0KLQkJCWlmIChwZnJhbWVbMV0gJiAxKSB7ICAgLyogVG9EUyA9PSAxICovCi0JCQkJLyogREEgKi8KLQkJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmcGZyYW1lWzE2XSwgNik7Ci0JCQkJaWYgKHBmcmFtZVsxXSAmIDIpICAvKiBGcm9tIERzID09IDEgKi8KLQkJCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwKLQkJCQkJCQkgJnBmcmFtZVsyNF0sIDYpOwotCQkJCWVsc2UKLQkJCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwKLQkJCQkJCQkgJnBmcmFtZVsxMF0sIDYpOwotCQkJfSBlbHNlIHsJLyogVG9EUyA9PSAwICovCi0JCQkJLyogREEgKi8KLQkJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmcGZyYW1lWzRdLCA2KTsKLQkJCQlpZiAocGZyYW1lWzFdICYgMikgIC8qIEZyb20gRHMgPT0gMSAqLwotCQkJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLAotCQkJCQkJCSAmcGZyYW1lWzE2XSwgNik7Ci0JCQkJZWxzZQotCQkJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLAotCQkJCQkJCSAmcGZyYW1lWzEwXSwgNik7Ci0JCQl9Ci0KLQkJCS8qIGlmIChwbWxtZXByaXYtPnFvc19vcHRpb24gPT0gMSkgKi8KLQkJCWlmIChwYXR0cmliLT5xb3NfZW4pCi0JCQkJcHJpb3JpdHlbMF0gPSAodTgpcHhtaXRmcmFtZS0+YXR0cmliLnByaW9yaXR5OwotCi0JCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmcHJpb3JpdHlbMF0sIDQpOwotCi0JCQlwYXlsb2FkID0gcGZyYW1lOwotCi0JCQlmb3IgKGN1cmZyYWdudW0gPSAwOyBjdXJmcmFnbnVtIDwgcGF0dHJpYi0+bnJfZnJhZ3M7Ci0JCQkgICAgIGN1cmZyYWdudW0rKykgewotCQkJCXBheWxvYWQgPSBQVFJfQUxJR04ocGF5bG9hZCwgNCk7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkJICI9PT0gY3VyZnJhZ251bSA9JWQsIHBmcmFtZSA9IDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCEhIVxuIiwKLQkJCQkJIGN1cmZyYWdudW0sICpwYXlsb2FkLCAqKHBheWxvYWQgKyAxKSwKLQkJCQkJICoocGF5bG9hZCArIDIpLCAqKHBheWxvYWQgKyAzKSwKLQkJCQkJICoocGF5bG9hZCArIDQpLCAqKHBheWxvYWQgKyA1KSwKLQkJCQkJICoocGF5bG9hZCArIDYpLCAqKHBheWxvYWQgKyA3KSk7Ci0KLQkJCQlwYXlsb2FkID0gcGF5bG9hZCArIHBhdHRyaWItPmhkcmxlbiArCi0JCQkJCXBhdHRyaWItPml2X2xlbjsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCQkgImN1cmZyYWdudW0gPSVkIHBhdHRyaWItPmhkcmxlbiA9JWQgcGF0dHJpYi0+aXZfbGVuID0lZFxuIiwKLQkJCQkJIGN1cmZyYWdudW0sCi0JCQkJCSBwYXR0cmliLT5oZHJsZW4sIHBhdHRyaWItPml2X2xlbik7Ci0JCQkJaWYgKChjdXJmcmFnbnVtICsgMSkgPT0gcGF0dHJpYi0+bnJfZnJhZ3MpIHsKLQkJCQkJbGVuZ3RoID0gcGF0dHJpYi0+bGFzdF90eGNtZHN6IC0KLQkJCQkJCXBhdHRyaWItPmhkcmxlbiAtCi0JCQkJCQlwYXR0cmliLT5pdl9sZW4gLQotCQkJCQkJKChwYXR0cmliLT5ic3dlbmMpID8KLQkJCQkJCSBwYXR0cmliLT5pY3ZfbGVuIDogMCk7Ci0JCQkJCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsIHBheWxvYWQsCi0JCQkJCQkJIGxlbmd0aCk7Ci0JCQkJCXBheWxvYWQgPSBwYXlsb2FkICsgbGVuZ3RoOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxlbmd0aCA9IHB4bWl0cHJpdi0+ZnJhZ19sZW4gLQotCQkJCQkJcGF0dHJpYi0+aGRybGVuIC0KLQkJCQkJCXBhdHRyaWItPml2X2xlbiAtCi0JCQkJCQkoKHBhdHRyaWItPmJzd2VuYykgPwotCQkJCQkJIHBhdHRyaWItPmljdl9sZW4gOiAwKTsKLQkJCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgcGF5bG9hZCwKLQkJCQkJCQkgbGVuZ3RoKTsKLQkJCQkJcGF5bG9hZCA9IHBheWxvYWQgKyBsZW5ndGggKwotCQkJCQkJcGF0dHJpYi0+aWN2X2xlbjsKLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sCi0JCQkJCQkgX2Rydl9lcnJfLAotCQkJCQkJICJjdXJmcmFnbnVtID0lZCBsZW5ndGggPSVkIHBhdHRyaWItPmljdl9sZW4gPSVkXG4iLAotCQkJCQkJIGN1cmZyYWdudW0sIGxlbmd0aCwKLQkJCQkJCSBwYXR0cmliLT5pY3ZfbGVuKTsKLQkJCQl9Ci0JCQl9Ci0JCQlydHdfc2VjZ2V0bWljMjNhKCZtaWNkYXRhLCAmbWljWzBdKTsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ4bWl0ZnJhbWVfYWRkbWljOiBiZWZvcmUgYWRkIG1pYyBjb2RlISFcbiIpOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgInhtaXRmcmFtZV9hZGRtaWM6IHBhdHRyaWItPmxhc3RfdHhjbWRzeiA9JWQhISFcbiIsCi0JCQkJIHBhdHRyaWItPmxhc3RfdHhjbWRzeik7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAieG1pdGZyYW1lX2FkZG1pYzogbWljWzBdPSAweCUuMnggLCBtaWNbMV09MHglLjJ4ICwgbWljWzJdPSAweCUuMnggLCBtaWNbM109IDB4JS4yeFxubWljWzRdPSAweCUuMnggLCBtaWNbNV09IDB4JS4yeCAsIG1pY1s2XT0gMHglLjJ4ICwgbWljWzddPSAweCUuMnggISEhIVxuIiwKLQkJCQkgbWljWzBdLCBtaWNbMV0sIG1pY1syXSwgbWljWzNdLAotCQkJCSBtaWNbNF0sIG1pY1s1XSwgbWljWzZdLCBtaWNbN10pOwotCQkJLyogYWRkIG1pYyBjb2RlICBhbmQgYWRkIHRoZSBtaWMgY29kZSBsZW5ndGgKLQkJCSAgIGluIGxhc3RfdHhjbWRzeiAqLwotCi0JCQltZW1jcHkocGF5bG9hZCwgJm1pY1swXSwgOCk7Ci0JCQlwYXR0cmliLT5sYXN0X3R4Y21kc3ogKz0gODsKLQotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICI9PT09PT09PSBsYXN0IHBrdCA9PT09PT09PVxuIik7Ci0JCQlwYXlsb2FkID0gcGF5bG9hZCAtIHBhdHRyaWItPmxhc3RfdHhjbWRzeiArIDg7Ci0JCQlmb3IgKGN1cmZyYWdudW0gPSAwOyBjdXJmcmFnbnVtIDwgcGF0dHJpYi0+bGFzdF90eGNtZHN6OwotCQkJICAgICBjdXJmcmFnbnVtID0gY3VyZnJhZ251bSArIDgpIHsKLQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkJICIlLjJ4LCAgJS4yeCwgICUuMngsICAlLjJ4LCAgJS4yeCwgICUuMngsICAlLjJ4LCAgJS4yeFxuIiwKLQkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0pLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDEpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDIpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDMpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDQpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDUpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDYpLAotCQkJCQkgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDcpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ4bWl0ZnJhbWVfYWRkbWljOiBydHdfZ2V0X3N0YWluZm8yM2EgPT1OVUxMISEhXG4iKTsKLQkJfQotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIGludCB4bWl0ZnJhbWVfc3dlbmNyeXB0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCi0JLyogaWYgKChwc2VjdXJpdHlwcml2LT5zd19lbmNyeXB0KXx8KHBhdHRyaWItPmJzd2VuYykpICovCi0JaWYgKHBhdHRyaWItPmJzd2VuYykgewotCQkvKiBEQkdfODcyM0EoInN0YXJ0IHhtaXRmcmFtZV9zd2VuY3J5cHRcbiIpOyAqLwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9hbGVydF8sCi0JCQkgIiMjIyB4bWl0ZnJhbWVfc3dlbmNyeXB0XG4iKTsKLQkJc3dpdGNoIChwYXR0cmliLT5lbmNyeXB0KSB7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQkJcnR3X3dlcF9lbmNyeXB0MjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCQlydHdfdGtpcF9lbmNyeXB0MjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCQlydHdfYWVzX2VuY3J5cHQyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgIiMjIyB4bWl0ZnJhbWVfaHdlbmNyeXB0XG4iKTsKLQl9Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X21ha2Vfd2xhbmhkcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaGRyLAotCQkJICAgIHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKWhkcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIgKnFvc2hkcjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXU4IHFvc19vcHRpb24gPSBmYWxzZTsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0KLQlpbnQgYm1jc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSk7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkgewotCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBjYWxsIHJ0d19nZXRfc3RhaW5mbzIzYSgpXG4iLCBfX2Z1bmNfXyk7Ci0JCWlmIChibWNzdCkgewotCQkJcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCBwYXR0cmliLT5yYSk7Ci0JCX0KLQl9Ci0KLQlpZiAocHN0YSA9PSBOVUxMKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEgPT0gTlVMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoIShwc3RhLT5zdGF0ZSAmX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwgX19mdW5jX18sIHBzdGEtPnN0YXRlKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCW1lbXNldChoZHIsIDAsIFdMQU5IRFJfT0ZGU0VUKTsKLQotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYocGF0dHJpYi0+dHlwZSk7Ci0KLQlpZiAocGF0dHJpYi0+dHlwZSAmIElFRUU4MDIxMV9GVFlQRV9EQVRBKSB7Ci0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJCS8qIHRvX2RzID0gMSwgZnJfZHMgPSAwOyAqLwotCQkJLyogRGF0YSB0cmFuc2ZlciB0byBBUCAqLwotCQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0KLQkJCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTKTsKLQkJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjEsIGdldF9ic3NpZChwbWxtZXByaXYpKTsKLQkJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjIsIHBhdHRyaWItPnNyYyk7Ci0JCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIzLCBwYXR0cmliLT5kc3QpOwotCi0JCQlpZiAocG1sbWVwcml2LT5xb3Nfb3B0aW9uKQotCQkJCXFvc19vcHRpb24gPSB0cnVlOwotCi0JCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsICBXSUZJX0FQX1NUQVRFKSkgewotCQkJLyogdG9fZHMgPSAwLCBmcl9kcyA9IDE7ICovCi0JCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7Ci0JCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBwYXR0cmliLT5kc3QpOwotCQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgZ2V0X2Jzc2lkKHBtbG1lcHJpdikpOwotCQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMywgcGF0dHJpYi0+c3JjKTsKLQotCQkJaWYgKHBzdGEtPnFvc19vcHRpb24pCi0JCQkJcW9zX29wdGlvbiA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpIHx8Ci0JCQkgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCQlldGhlcl9hZGRyX2NvcHkocHdsYW5oZHItPmFkZHIxLCBwYXR0cmliLT5kc3QpOwotCQkJZXRoZXJfYWRkcl9jb3B5KHB3bGFuaGRyLT5hZGRyMiwgcGF0dHJpYi0+c3JjKTsKLQkJCWV0aGVyX2FkZHJfY29weShwd2xhbmhkci0+YWRkcjMsIGdldF9ic3NpZChwbWxtZXByaXYpKTsKLQotCQkJaWYgKHBzdGEtPnFvc19vcHRpb24pCi0JCQkJcW9zX29wdGlvbiA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAiZndfc3RhdGU6JXggaXMgbm90IGFsbG93ZWQgdG8geG1pdCBmcmFtZVxuIiwKLQkJCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0JCQlyZXMgPSBfRkFJTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQlpZiAocGF0dHJpYi0+bWRhdGEpCi0JCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBKTsKLQkJaWYgKHBhdHRyaWItPmVuY3J5cHQpCi0JCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1BST1RFQ1RFRCk7Ci0JCWlmIChxb3Nfb3B0aW9uKSB7Ci0JCQlxb3NoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICopaGRyOwotCi0JCQlxb3NoZHItPnFvc19jdHJsID0gY3B1X3RvX2xlMTYoCi0JCQkJcGF0dHJpYi0+cHJpb3JpdHkgJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSyk7Ci0KLQkJCXFvc2hkci0+cW9zX2N0cmwgfD0gY3B1X3RvX2xlMTYoCi0JCQkJKHBhdHRyaWItPmFja19wb2xpY3kgPDwgNSkgJgotCQkJCUlFRUU4MDIxMV9RT1NfQ1RMX0FDS19QT0xJQ1lfTUFTSyk7Ci0KLQkJCWlmIChwYXR0cmliLT5lb3NwKQotCQkJCXFvc2hkci0+cW9zX2N0cmwgfD0KLQkJCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX1FPU19DVExfRU9TUCk7Ci0JCX0KLQkJLyogVE9ETzogZmlsbCBIVCBDb250cm9sIEZpZWxkICovCi0KLQkJLyogVXBkYXRlIFNlcSBOdW0gd2lsbCBiZSBoYW5kbGVkIGJ5IGYvdyAqLwotCQlpZiAocHN0YSkgewotCQkJcHN0YS0+c3RhX3htaXRwcml2LnR4c2VxX3RpZFtwYXR0cmliLT5wcmlvcml0eV0rKzsKLQkJCXBzdGEtPnN0YV94bWl0cHJpdi50eHNlcV90aWRbcGF0dHJpYi0+cHJpb3JpdHldICY9IDB4RkZGOwotCQkJcGF0dHJpYi0+c2VxbnVtID0gcHN0YS0+c3RhX3htaXRwcml2LnR4c2VxX3RpZFtwYXR0cmliLT5wcmlvcml0eV07Ci0JCQkvKiBXZSBkb250IG5lZWQgdG8gd29ycnkgYWJvdXQgZnJhZyBiaXRzIGhlcmUgKi8KLQkJCXB3bGFuaGRyLT5zZXFfY3RybCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TTl9UT19TRVEoCi0JCQkJCQkJICAgICAgcGF0dHJpYi0+c2VxbnVtKSk7Ci0JCQkvKiBjaGVjayBpZiBlbmFibGUgYW1wZHUgKi8KLQkJCWlmIChwYXR0cmliLT5odF9lbiAmJiBwc3RhLT5odHByaXYuYW1wZHVfZW5hYmxlKSB7Ci0JCQkJaWYgKHBhdHRyaWItPnByaW9yaXR5ID49IDE2KQotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSW52YWxpZCAiCi0JCQkJCSAgICAgICAicGF0dHJpYi0+cHJpb3JpdHkgJWlcbiIsCi0JCQkJCSAgICAgICBfX2Z1bmNfXywgcGF0dHJpYi0+cHJpb3JpdHkpOwotCQkJCWlmIChwc3RhLT5odHByaXYuYWdnX2VuYWJsZV9iaXRtYXAgJgotCQkJCSAgICBCSVQocGF0dHJpYi0+cHJpb3JpdHkpKQotCQkJCQlwYXR0cmliLT5hbXBkdV9lbiA9IHRydWU7Ci0JCQl9Ci0JCQkvKiByZS1jaGVjayBpZiBlbmFibGUgYW1wZHUgYnkgQkFfc3RhcnRpbmdfc2VxY3RybCAqLwotCQkJaWYgKHBhdHRyaWItPmFtcGR1X2VuKSB7Ci0JCQkJdTE2IHR4X3NlcTsKLQotCQkJCXR4X3NlcSA9IHBzdGEtPkJBX3N0YXJ0aW5nX3NlcWN0cmxbcGF0dHJpYi0+cHJpb3JpdHkgJiAweDBmXTsKLQotCQkJCS8qIGNoZWNrIEJBX3N0YXJ0aW5nX3NlcWN0cmwgKi8KLQkJCQlpZiAoU05fTEVTUyhwYXR0cmliLT5zZXFudW0sIHR4X3NlcSkpIHsKLQkJCQkJLyogREJHXzg3MjNBKCJ0eCBhbXBkdSBzZXFudW0oJWQpIDwgdHhfc2VxKCVkKVxuIiwgcGF0dHJpYi0+c2VxbnVtLCB0eF9zZXEpOyAqLwotCQkJCQlwYXR0cmliLT5hbXBkdV9lbiA9IGZhbHNlOy8qIEFHRyBCSyAqLwotCQkJCX0gZWxzZSBpZiAoU05fRVFVQUwocGF0dHJpYi0+c2VxbnVtLCB0eF9zZXEpKSB7Ci0JCQkJCXBzdGEtPkJBX3N0YXJ0aW5nX3NlcWN0cmxbcGF0dHJpYi0+cHJpb3JpdHkgJiAweDBmXSA9ICh0eF9zZXErMSkmMHhmZmY7Ci0JCQkJCXBhdHRyaWItPmFtcGR1X2VuID0gdHJ1ZTsvKiBBR0cgRU4gKi8KLQkJCQl9IGVsc2UgewotCQkJCQkvKiBEQkdfODcyM0EoInR4IGFtcGR1IG92ZXIgcnVuXG4iKTsgKi8KLQkJCQkJcHN0YS0+QkFfc3RhcnRpbmdfc2VxY3RybFtwYXR0cmliLT5wcmlvcml0eSAmIDB4MGZdID0gKHBhdHRyaWItPnNlcW51bSsxKSYweGZmZjsKLQkJCQkJcGF0dHJpYi0+YW1wZHVfZW4gPSB0cnVlOy8qIEFHRyBFTiAqLwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotczMyIHJ0d190eGZyYW1lc19wZW5kaW5nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCXJldHVybiAoIWxpc3RfZW1wdHkoJnB4bWl0cHJpdi0+YmVfcGVuZGluZy5xdWV1ZSkpIHx8Ci0JCSghbGlzdF9lbXB0eSgmcHhtaXRwcml2LT5ia19wZW5kaW5nLnF1ZXVlKSkgfHwKLQkJKCFsaXN0X2VtcHR5KCZweG1pdHByaXYtPnZpX3BlbmRpbmcucXVldWUpKSB8fAotCQkoIWxpc3RfZW1wdHkoJnB4bWl0cHJpdi0+dm9fcGVuZGluZy5xdWV1ZSkpOwotfQotCi1zMzIgcnR3X3R4ZnJhbWVzX3N0YV9hY19wZW5kaW5nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhOwotCXN0cnVjdCB0eF9zZXJ2cSAqcHR4c2VydnE7Ci0JaW50IHByaW9yaXR5ID0gcGF0dHJpYi0+cHJpb3JpdHk7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkgewotCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBjYWxsIHJ0d19nZXRfc3RhaW5mbzIzYSgpXG4iLCBfX2Z1bmNfXyk7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCAmcGF0dHJpYi0+cmFbMF0pOwotCX0KLQlpZiAocHN0YSA9PSBOVUxMKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEgPT0gTlVMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIShwc3RhLT5zdGF0ZSAmX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwgX19mdW5jX18sCi0JCQkgIHBzdGEtPnN0YXRlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXN3aXRjaCAocHJpb3JpdHkpIHsKLQljYXNlIDE6Ci0JY2FzZSAyOgotCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYuYmtfcTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCWNhc2UgNToKLQkJcHR4c2VydnEgPSAmcHN0YS0+c3RhX3htaXRwcml2LnZpX3E7Ci0JCWJyZWFrOwotCWNhc2UgNjoKLQljYXNlIDc6Ci0JCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi52b19xOwotCQlicmVhazsKLQljYXNlIDA6Ci0JY2FzZSAzOgotCWRlZmF1bHQ6Ci0JCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi5iZV9xOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHB0eHNlcnZxLT5xY250OwotfQotCi0vKiBMb2dpY2FsIExpbmsgQ29udHJvbChMTEMpIFN1Yk5ldHdvcmsgQXR0YWNobWVudCBQb2ludChTTkFQKSBoZWFkZXIKLSAqIElFRUUgTExDL1NOQVAgaGVhZGVyIGNvbnRhaW5zIDggb2N0ZXRzCi0gKiBGaXJzdCAzIG9jdGV0cyBjb21wcmlzZSB0aGUgTExDIHBvcnRpb24KLSAqIFNOQVAgcG9ydGlvbiwgNSBvY3RldHMsIGlzIGRpdmlkZWQgaW50byB0d28gZmllbGRzOgotICoJT3JnYW5pemF0aW9uYWxseSBVbmlxdWUgSWRlbnRpZmllcihPVUkpLCAzIG9jdGV0cywKLSAqCXR5cGUsIGRlZmluZWQgYnkgdGhhdCBvcmdhbml6YXRpb24sIDIgb2N0ZXRzLgotICovCi1zdGF0aWMgaW50IHJ0d19wdXRfc25hcCh1OCAqZGF0YSwgdTE2IGhfcHJvdG8pCi17Ci0JaWYgKGhfcHJvdG8gPT0gRVRIX1BfSVBYIHx8IGhfcHJvdG8gPT0gRVRIX1BfQUFSUCkKLQkJZXRoZXJfYWRkcl9jb3B5KGRhdGEsIGJyaWRnZV90dW5uZWxfaGVhZGVyKTsKLQllbHNlCi0JCWV0aGVyX2FkZHJfY29weShkYXRhLCByZmMxMDQyX2hlYWRlcik7Ci0KLQlkYXRhICs9IEVUSF9BTEVOOwotCXB1dF91bmFsaWduZWRfYmUxNihoX3Byb3RvLCBkYXRhKTsKLQlyZXR1cm4gRVRIX0FMRU4gKyBzaXplb2YodTE2KTsKLX0KLQotLyoKLQotVGhpcyBzdWItcm91dGluZSB3aWxsIHBlcmZvcm0gYWxsIHRoZSBmb2xsb3dpbmc6Ci0KLTEuIHJlbW92ZSA4MDIuMyBoZWFkZXIuCi0yLiBjcmVhdGUgd2xhbl9oZWFkZXIsIGJhc2VkIG9uIHRoZSBpbmZvIGluIHB4bWl0ZnJhbWUKLTMuIGFwcGVuZCBzdGEncyBpdi9leHQtaXYKLTQuIGFwcGVuZCBMTEMKLTUuIG1vdmUgZnJhZyBjaHVuayBmcm9tIHBmcmFtZSB0byBweG1pdGZyYW1lLT5tZW0KLTYuIGFwcGx5IHN3LWVuY3J5cHQsIGlmIG5lY2Vzc2FyeS4KLQotKi8KLWludCBydHdfeG1pdGZyYW1lX2NvYWxlc2NlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKLQlzMzIgZnJnX2lueCwgZnJnX2xlbiwgbXBkdV9sZW4sIGxsY19zeiwgbWVtX3N6OwotCXU4ICpwZnJhbWUsICptZW1fc3RhcnQ7Ci0JdTggaHdfaGRyX29mZnNldDsKLQl1OCAqcGJ1Zl9zdGFydDsKLQl1OCAqcGRhdGEgPSBza2ItPmRhdGE7Ci0JaW50IGRhdGFfbGVuID0gc2tiLT5sZW47Ci0JczMyIGJtY3N0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpOwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCWlmIChwYXR0cmliLT5wc3RhKQotCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQllbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwgcGF0dHJpYi0+cmEpOwotCX0KLQotCWlmICghcHN0YSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKCEocHN0YS0+c3RhdGUgJl9GV19MSU5LRUQpKSB7Ci0JCURCR184NzIzQSgiJXMsIHBzdGEtPnN0YXRlKDB4JXgpICE9IF9GV19MSU5LRURcbiIsCi0JCQkgIF9fZnVuY19fLCBwc3RhLT5zdGF0ZSk7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoIXB4bWl0ZnJhbWUtPmJ1Zl9hZGRyKSB7Ci0JCURCR184NzIzQSgiPT0+ICVzIGJ1Zl9hZGRyID09IE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCXBidWZfc3RhcnQgPSBweG1pdGZyYW1lLT5idWZfYWRkcjsKLQotCWh3X2hkcl9vZmZzZXQgPSBUWERFU0NfT0ZGU0VUOwotCi0JbWVtX3N0YXJ0ID0gcGJ1Zl9zdGFydCArIGh3X2hkcl9vZmZzZXQ7Ci0KLQlpZiAocnR3X21ha2Vfd2xhbmhkcihwYWRhcHRlciwgbWVtX3N0YXJ0LCBwYXR0cmliKSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogcnR3X21ha2Vfd2xhbmhkciBmYWlsOyBkcm9wIHBrdFxuIiwgX19mdW5jX18pOwotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBkYXRhICs9IHBhdHRyaWItPnBrdF9oZHJsZW47Ci0JZGF0YV9sZW4gLT0gcGF0dHJpYi0+cGt0X2hkcmxlbjsKLQotCWZyZ19pbnggPSAwOwotCWZyZ19sZW4gPSBweG1pdHByaXYtPmZyYWdfbGVuIC0gNDsvKiAyMzQ2LTQgPSAyMzQyICovCi0KLQl3aGlsZSAoMSkgewotCQlsbGNfc3ogPSAwOwotCi0JCW1wZHVfbGVuID0gZnJnX2xlbjsKLQotCQlwZnJhbWUgPSBtZW1fc3RhcnQ7Ci0JCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKW1lbV9zdGFydDsKLQotCQlwZnJhbWUgKz0gcGF0dHJpYi0+aGRybGVuOwotCQltcGR1X2xlbiAtPSBwYXR0cmliLT5oZHJsZW47Ci0KLQkJLyogYWRkaW5nIGljdiwgaWYgbmVjZXNzYXJ5Li4uICovCi0JCWlmIChwYXR0cmliLT5pdl9sZW4pIHsKLQkJCWlmIChwc3RhKSB7Ci0JCQkJc3dpdGNoIChwYXR0cmliLT5lbmNyeXB0KSB7Ci0JCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQkJCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJCQkJV0VQX0lWKHBhdHRyaWItPml2LCBwc3RhLT5kb3QxMXR4cG4sCi0JCQkJCSAgICAgICBwYXR0cmliLT5rZXlfaWR4KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJCQlpZiAoYm1jc3QpCi0JCQkJCQlUS0lQX0lWKHBhdHRyaWItPml2LAotCQkJCQkJCXBzdGEtPmRvdDExdHhwbiwKLQkJCQkJCQlwYXR0cmliLT5rZXlfaWR4KTsKLQkJCQkJZWxzZQotCQkJCQkJVEtJUF9JVihwYXR0cmliLT5pdiwKLQkJCQkJCQlwc3RhLT5kb3QxMXR4cG4sIDApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCQkJCWlmIChibWNzdCkKLQkJCQkJCUFFU19JVihwYXR0cmliLT5pdiwKLQkJCQkJCSAgICAgICBwc3RhLT5kb3QxMXR4cG4sCi0JCQkJCQkgICAgICAgcGF0dHJpYi0+a2V5X2lkeCk7Ci0JCQkJCWVsc2UKLQkJCQkJCUFFU19JVihwYXR0cmliLT5pdiwKLQkJCQkJCSAgICAgICBwc3RhLT5kb3QxMXR4cG4sIDApOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCW1lbWNweShwZnJhbWUsIHBhdHRyaWItPml2LCBwYXR0cmliLT5pdl9sZW4pOwotCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9ub3RpY2VfLAotCQkJCSAicnR3X3htaWFmcmFtZV9jb2FsZXNjZTIzYToga2V5aWQgPSVkIHBhdHRyaWItPml2WzNdPSUuMnggcGZyYW1lID0lLjJ4ICUuMnggJS4yeCAlLjJ4XG4iLAotCQkJCSBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUtleUluZGV4LAotCQkJCSBwYXR0cmliLT5pdlszXSwgKnBmcmFtZSwgKihwZnJhbWUrMSksCi0JCQkJICoocGZyYW1lKzIpLCAqKHBmcmFtZSszKSk7Ci0JCQlwZnJhbWUgKz0gcGF0dHJpYi0+aXZfbGVuOwotCQkJbXBkdV9sZW4gLT0gcGF0dHJpYi0+aXZfbGVuOwotCQl9Ci0JCWlmIChmcmdfaW54ID09IDApIHsKLQkJCWxsY19zeiA9IHJ0d19wdXRfc25hcChwZnJhbWUsIHBhdHRyaWItPmV0aGVyX3R5cGUpOwotCQkJcGZyYW1lICs9IGxsY19zejsKLQkJCW1wZHVfbGVuIC09IGxsY19zejsKLQkJfQotCi0JCWlmIChwYXR0cmliLT5pY3ZfbGVuID4gMCAmJiBwYXR0cmliLT5ic3dlbmMpCi0JCQltcGR1X2xlbiAtPSBwYXR0cmliLT5pY3ZfbGVuOwotCi0JCWlmIChibWNzdCkKLQkJCS8qICBkb24ndCBkbyBmcmFnbWVudCB0byBicm9hZGNhc3QvbXVsdGljYXN0IHBhY2tldHMgKi8KLQkJCW1lbV9zeiA9IG1pbl90KHMzMiwgZGF0YV9sZW4sIHBhdHRyaWItPnBrdGxlbik7Ci0JCWVsc2UKLQkJCW1lbV9zeiA9IG1pbl90KHMzMiwgZGF0YV9sZW4sIG1wZHVfbGVuKTsKLQotCQltZW1jcHkocGZyYW1lLCBwZGF0YSwgbWVtX3N6KTsKLQotCQlwZnJhbWUgKz0gbWVtX3N6OwotCQlwZGF0YSArPSBtZW1fc3o7Ci0JCWRhdGFfbGVuIC09IG1lbV9zejsKLQotCQlpZiAoKHBhdHRyaWItPmljdl9sZW4gPjApICYmIChwYXR0cmliLT5ic3dlbmMpKSB7Ci0JCQltZW1jcHkocGZyYW1lLCBwYXR0cmliLT5pY3YsIHBhdHRyaWItPmljdl9sZW4pOwotCQkJcGZyYW1lICs9IHBhdHRyaWItPmljdl9sZW47Ci0JCX0KLQotCQlmcmdfaW54Kys7Ci0KLQkJaWYgKGJtY3N0IHx8IGRhdGFfbGVuIDw9IDApIHsKLQkJCXBhdHRyaWItPm5yX2ZyYWdzID0gZnJnX2lueDsKLQotCQkJcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+aGRybGVuICsKLQkJCQkJCXBhdHRyaWItPml2X2xlbiArCi0JCQkJCQkoKHBhdHRyaWItPm5yX2ZyYWdzID09IDEpID8KLQkJCQkJCWxsY19zeiA6IDApICsKLQkJCQkJCSgocGF0dHJpYi0+YnN3ZW5jKSA/Ci0JCQkJCQlwYXR0cmliLT5pY3ZfbGVuIDogMCkgKyBtZW1fc3o7Ci0JCQloZHItPmZyYW1lX2NvbnRyb2wgJj0KLQkJCQl+Y3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKTsKLQotCQkJYnJlYWs7Ci0JCX0gZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAiJXM6IFRoZXJlJ3JlIHN0aWxsIHNvbWV0aGluZyBpbiBwYWNrZXQhXG4iLAotCQkJCSBfX2Z1bmNfXyk7Ci0JCX0KLQkJaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX01PUkVGUkFHUyk7Ci0KLQkJbWVtX3N0YXJ0ID0gUFRSX0FMSUdOKHBmcmFtZSwgNCkgKyBod19oZHJfb2Zmc2V0OwotCQltZW1jcHkobWVtX3N0YXJ0LCBwYnVmX3N0YXJ0ICsgaHdfaGRyX29mZnNldCwgcGF0dHJpYi0+aGRybGVuKTsKLQl9Ci0KLQlpZiAoeG1pdGZyYW1lX2FkZG1pYyhwYWRhcHRlciwgcHhtaXRmcmFtZSkgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCSAieG1pdGZyYW1lX2FkZG1pYyhwYWRhcHRlciwgcHhtaXRmcmFtZSkgPT0gX0ZBSUxcbiIpOwotCQlEQkdfODcyM0EoInhtaXRmcmFtZV9hZGRtaWMocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpID09IF9GQUlMXG4iKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQl4bWl0ZnJhbWVfc3dlbmNyeXB0KHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQotCWlmIChibWNzdCA9PSBmYWxzZSkKLQkJdXBkYXRlX2F0dHJpYl92Y3NfaW5mbyhwYWRhcHRlciwgcHhtaXRmcmFtZSk7Ci0JZWxzZQotCQlwYXR0cmliLT52Y3NfbW9kZSA9IE5PTkVfVkNTOwotCi1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLXZvaWQgcnR3X3VwZGF0ZV9wcm90ZWN0aW9uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICppZSwgdWludCBpZV9sZW4pCi17Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXVpbnQgcHJvdGVjdGlvbjsKLQljb25zdCB1OCAqcDsKLQotCXN3aXRjaCAocHJlZ2lzdHJ5cHJpdi0+dnJ0bF9jYXJyaWVyX3NlbnNlKSB7Ci0JY2FzZSBESVNBQkxFX1ZDUzoKLQkJcHhtaXRwcml2LT52Y3MgPSBOT05FX1ZDUzsKLQkJYnJlYWs7Ci0JY2FzZSBFTkFCTEVfVkNTOgotCQlicmVhazsKLQljYXNlIEFVVE9fVkNTOgotCWRlZmF1bHQ6Ci0JCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0VSUF9JTkZPLCBpZSwgaWVfbGVuKTsKLQkJaWYgKCFwKQotCQkJcHhtaXRwcml2LT52Y3MgPSBOT05FX1ZDUzsKLQkJZWxzZSB7Ci0JCQlwcm90ZWN0aW9uID0gKCoocCArIDIpKSAmIEJJVCgxKTsKLQkJCWlmIChwcm90ZWN0aW9uKSB7Ci0JCQkJaWYgKHByZWdpc3RyeXByaXYtPnZjc190eXBlID09IFJUU19DVFMpCi0JCQkJCXB4bWl0cHJpdi0+dmNzID0gUlRTX0NUUzsKLQkJCQllbHNlCi0JCQkJCXB4bWl0cHJpdi0+dmNzID0gQ1RTX1RPX1NFTEY7Ci0JCQl9IGVsc2UgewotCQkJCXB4bWl0cHJpdi0+dmNzID0gTk9ORV9WQ1M7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIHJ0d19jb3VudF90eF9zdGF0czIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSwgaW50IHN6KQotewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0Jc3RydWN0IHN0YWluZm9fc3RhdHMgKnBzdGF0cyA9IE5VTEw7Ci0Jc3RydWN0IHhtaXRfcHJpdgkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCi0JaWYgKHB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9PSBEQVRBX0ZSQU1FVEFHKSB7Ci0JCXB4bWl0cHJpdi0+dHhfYnl0ZXMgKz0gc3o7Ci0JCXBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uTnVtVHhPa0luUGVyaW9kKys7Ci0KLQkJcHN0YSA9IHB4bWl0ZnJhbWUtPmF0dHJpYi5wc3RhOwotCQlpZiAocHN0YSkgewotCQkJcHN0YXRzID0gJnBzdGEtPnN0YV9zdGF0czsKLQkJCXBzdGF0cy0+dHhfcGt0cysrOwotCQkJcHN0YXRzLT50eF9ieXRlcyArPSBzejsKLQkJfQotCX0KLX0KLQotc3RydWN0IHhtaXRfYnVmICpydHdfYWxsb2NfeG1pdGJ1ZjIzYV9leHQoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KQotewotCXVuc2lnbmVkIGxvbmcgaXJxTDsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmID0gIE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX3F1ZXVlOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBmcmVlX3F1ZXVlLT5sb2NrLCBpcnFMKTsKLQotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJlZV9xdWV1ZSk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkocGhlYWQpKSB7Ci0JCXB4bWl0YnVmID0gbGlzdF9maXJzdF9lbnRyeShwaGVhZCwgc3RydWN0IHhtaXRfYnVmLCBsaXN0KTsKLQotCQlsaXN0X2RlbF9pbml0KCZweG1pdGJ1Zi0+bGlzdCk7Ci0KLQkJcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX2NudC0tOwotCQlweG1pdGJ1Zi0+cHJpdl9kYXRhID0gTlVMTDsKLQkJcHhtaXRidWYtPmV4dF90YWcgPSB0cnVlOwotCi0JCWlmIChweG1pdGJ1Zi0+c2N0eCkgewotCQkJREJHXzg3MjNBKCIlcyBweG1pdGJ1Zi0+c2N0eCBpcyBub3QgTlVMTFxuIiwgX19mdW5jX18pOwotCQkJcnR3MjNhX3NjdHhfZG9uZV9lcnIoJnB4bWl0YnVmLT5zY3R4LCBSVFdfU0NUWF9ET05FX0JVRl9BTExPQyk7Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZnJlZV9xdWV1ZS0+bG9jaywgaXJxTCk7Ci0KLQlyZXR1cm4gcHhtaXRidWY7Ci19Ci0KLWludCBydHdfZnJlZV94bWl0YnVmX2V4dDIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsCi0JCQkgICAgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZikKLXsKLQl1bnNpZ25lZCBsb25nIGlycUw7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRfZXh0YnVmX3F1ZXVlOwotCi0JaWYgKHB4bWl0YnVmID09IE5VTEwpCi0JCXJldHVybiBfRkFJTDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwZnJlZV9xdWV1ZS0+bG9jaywgaXJxTCk7Ci0KLQlsaXN0X2RlbF9pbml0KCZweG1pdGJ1Zi0+bGlzdCk7Ci0KLQlsaXN0X2FkZF90YWlsKCZweG1pdGJ1Zi0+bGlzdCwgZ2V0X2xpc3RfaGVhZChwZnJlZV9xdWV1ZSkpOwotCXB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9jbnQrKzsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmcmVlX3F1ZXVlLT5sb2NrLCBpcnFMKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RydWN0IHhtaXRfYnVmICpydHdfYWxsb2NfeG1pdGJ1ZjIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFMOwotCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYgPSAgTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJlZV94bWl0YnVmX3F1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX3F1ZXVlOwotCi0JLyogREJHXzg3MjNBKCIrcnR3X2FsbG9jX3htaXRidWYyM2FcbiIpOyAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBmcmVlX3htaXRidWZfcXVldWUtPmxvY2ssIGlycUwpOwotCi0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmVlX3htaXRidWZfcXVldWUpOwotCi0JaWYgKCFsaXN0X2VtcHR5KHBoZWFkKSkgewotCQlweG1pdGJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkocGhlYWQsIHN0cnVjdCB4bWl0X2J1ZiwgbGlzdCk7Ci0KLQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRidWYtPmxpc3QpOwotCi0JCXB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX2NudC0tOwotCQlweG1pdGJ1Zi0+cHJpdl9kYXRhID0gTlVMTDsKLQkJcHhtaXRidWYtPmV4dF90YWcgPSBmYWxzZTsKLQkJcHhtaXRidWYtPmZsYWdzID0gWE1JVF9WT19RVUVVRTsKLQotCQlpZiAocHhtaXRidWYtPnNjdHgpIHsKLQkJCURCR184NzIzQSgiJXMgcHhtaXRidWYtPnNjdHggaXMgbm90IE5VTExcbiIsIF9fZnVuY19fKTsKLQkJCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9CVUZfQUxMT0MpOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZyZWVfeG1pdGJ1Zl9xdWV1ZS0+bG9jaywgaXJxTCk7Ci0KLQlyZXR1cm4gcHhtaXRidWY7Ci19Ci0KLWludCBydHdfZnJlZV94bWl0YnVmMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZikKLXsKLQl1bnNpZ25lZCBsb25nIGlycUw7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfeG1pdGJ1Zl9xdWV1ZSA9ICZweG1pdHByaXYtPmZyZWVfeG1pdGJ1Zl9xdWV1ZTsKLQotCS8qIERCR184NzIzQSgiK3J0d19mcmVlX3htaXRidWYyM2FcbiIpOyAqLwotCi0JaWYgKHB4bWl0YnVmID09IE5VTEwpCi0JCXJldHVybiBfRkFJTDsKLQotCWlmIChweG1pdGJ1Zi0+c2N0eCkgewotCQlEQkdfODcyM0EoIiVzIHB4bWl0YnVmLT5zY3R4IGlzIG5vdCBOVUxMXG4iLCBfX2Z1bmNfXyk7Ci0JCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9CVUZfRlJFRSk7Ci0JfQotCi0JaWYgKHB4bWl0YnVmLT5leHRfdGFnKSB7Ci0JCXJ0d19mcmVlX3htaXRidWZfZXh0MjNhKHB4bWl0cHJpdiwgcHhtaXRidWYpOwotCX0gZWxzZSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwZnJlZV94bWl0YnVmX3F1ZXVlLT5sb2NrLCBpcnFMKTsKLQotCQlsaXN0X2RlbF9pbml0KCZweG1pdGJ1Zi0+bGlzdCk7Ci0KLQkJbGlzdF9hZGRfdGFpbCgmcHhtaXRidWYtPmxpc3QsCi0JCQkgICAgICBnZXRfbGlzdF9oZWFkKHBmcmVlX3htaXRidWZfcXVldWUpKTsKLQotCQlweG1pdHByaXYtPmZyZWVfeG1pdGJ1Zl9jbnQrKzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGZyZWVfeG1pdGJ1Zl9xdWV1ZS0+bG9jaywgaXJxTCk7Ci0JfQotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBydHdfaW5pdF94bWl0ZnJhbWUoc3RydWN0IHhtaXRfZnJhbWUgKnB4ZnJhbWUpCi17Ci0JaWYgKHB4ZnJhbWUgIT0gIE5VTEwpIHsKLQkJLyogZGVmYXVsdCB2YWx1ZSBzZXR0aW5nICovCi0JCXB4ZnJhbWUtPmJ1Zl9hZGRyID0gTlVMTDsKLQkJcHhmcmFtZS0+cHhtaXRidWYgPSBOVUxMOwotCi0JCW1lbXNldCgmcHhmcmFtZS0+YXR0cmliLCAwLCBzaXplb2Yoc3RydWN0IHBrdF9hdHRyaWIpKTsKLQkJLyogcHhmcmFtZS0+YXR0cmliLnBzdGEgPSBOVUxMOyAqLwotCi0JCXB4ZnJhbWUtPmZyYW1lX3RhZyA9IERBVEFfRlJBTUVUQUc7Ci0KLQkJcHhmcmFtZS0+cGt0ID0gTlVMTDsKLQkJcHhmcmFtZS0+cGt0X29mZnNldCA9IDE7LyogZGVmYXVsdCB1c2UgcGt0X29mZnNldCB0byBmaWxsIHR4IGRlc2MgKi8KLQotCQlweGZyYW1lLT5hY2tfcmVwb3J0ID0gMDsKLQl9Ci19Ci0KLS8qCi1DYWxsaW5nIGNvbnRleHQ6Ci0xLiBPU19UWEVOVFJZCi0yLiBSWEVOVFJZIChyeF90aHJlYWQgb3IgUlhfSVNSL1JYX0NhbGxCYWNrKQotCi1JZiB3ZSB0dXJuIG9uIFVTRV9SWFRIUkVBRCwgdGhlbiwgbm8gbmVlZCBmb3IgY3JpdGljYWwgc2VjdGlvbi4KLU90aGVyd2lzZSwgd2UgbXVzdCB1c2UgX2VudGVyL19leGl0IGNyaXRpY2FsIHRvIHByb3RlY3QgZnJlZV94bWl0X3F1ZXVlLi4uCi0KLU11c3QgYmUgdmVyeSB2ZXJ5IGNhdXRpb3VzLi4uCi0KLSovCi1zdGF0aWMgc3RydWN0IHhtaXRfZnJhbWUgKnJ0d19hbGxvY194bWl0ZnJhbWUoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpweGZyYW1lOwotCXN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3htaXRfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRfcXVldWU7Ci0KLQlzcGluX2xvY2tfYmgoJnBmcmVlX3htaXRfcXVldWUtPmxvY2spOwotCi0JcHhmcmFtZSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmcGZyZWVfeG1pdF9xdWV1ZS0+cXVldWUsCi0JCQkJCSAgIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKLQlpZiAoIXB4ZnJhbWUpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19hbGxvY194bWl0ZnJhbWU6JWRcbiIsCi0JCQkgcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQpOwotCX0gZWxzZSB7Ci0JCWxpc3RfZGVsX2luaXQoJnB4ZnJhbWUtPmxpc3QpOwotCQlweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudC0tOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X2FsbG9jX3htaXRmcmFtZSgpOmZyZWVfeG1pdGZyYW1lX2NudCA9JWRcbiIsCi0JCQkgcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQpOwotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwZnJlZV94bWl0X3F1ZXVlLT5sb2NrKTsKLQotCXJ0d19pbml0X3htaXRmcmFtZShweGZyYW1lKTsKLQotCXJldHVybiBweGZyYW1lOwotfQotCi1zdHJ1Y3QgeG1pdF9mcmFtZSAqcnR3X2FsbG9jX3htaXRmcmFtZTIzYV9leHQoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpweGZyYW1lOwotCXN0cnVjdCBydHdfcXVldWUgKnF1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X3F1ZXVlOwotCi0Jc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Ci0KLQlweGZyYW1lID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZxdWV1ZS0+cXVldWUsCi0JCQkJCSAgIHN0cnVjdCB4bWl0X2ZyYW1lLCBsaXN0KTsKLQlpZiAoIXB4ZnJhbWUpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19hbGxvY194bWl0ZnJhbWUyM2FfZXh0OiVkXG4iLAotCQkJIHB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudCk7Ci0JfSBlbHNlIHsKLQkJbGlzdF9kZWxfaW5pdCgmcHhmcmFtZS0+bGlzdCk7Ci0JCXB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudC0tOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X2FsbG9jX3htaXRmcmFtZTIzYV9leHQoKTpmcmVlX3htaXRmcmFtZV9jbnQgPSVkXG4iLAotCQkJIHB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudCk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKLQotCXJ0d19pbml0X3htaXRmcmFtZShweGZyYW1lKTsKLQotCXJldHVybiBweGZyYW1lOwotfQotCi1zMzIgcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcXVldWUgPSBOVUxMOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBweG1pdHByaXYtPmFkYXB0ZXI7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBuZGlzX3BrdCA9IE5VTEw7Ci0KLQlpZiAocHhtaXRmcmFtZSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgIj09PT09PSBydHdfZnJlZV94bWl0ZnJhbWUyM2EoKTpweG1pdGZyYW1lID09IE5VTEwhISEhISEhISEhXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChweG1pdGZyYW1lLT5wa3QpIHsKLQkJcG5kaXNfcGt0ID0gcHhtaXRmcmFtZS0+cGt0OwotCQlweG1pdGZyYW1lLT5wa3QgPSBOVUxMOwotCX0KLQotCWlmIChweG1pdGZyYW1lLT5leHRfdGFnID09IDApCi0JCXF1ZXVlID0gJnB4bWl0cHJpdi0+ZnJlZV94bWl0X3F1ZXVlOwotCWVsc2UgaWYgKHB4bWl0ZnJhbWUtPmV4dF90YWcgPT0gMSkKLQkJcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfcXVldWU7Ci0KLQlpZiAoIXF1ZXVlKQotCQlnb3RvIGNoZWNrX3BrdF9jb21wbGV0ZTsKLQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKLQotCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCWxpc3RfYWRkX3RhaWwoJnB4bWl0ZnJhbWUtPmxpc3QsIGdldF9saXN0X2hlYWQocXVldWUpKTsKLQlpZiAocHhtaXRmcmFtZS0+ZXh0X3RhZyA9PSAwKSB7Ci0JCXB4bWl0cHJpdi0+ZnJlZV94bWl0ZnJhbWVfY250Kys7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2RlYnVnXywKLQkJCSAicnR3X2ZyZWVfeG1pdGZyYW1lMjNhKCk6ZnJlZV94bWl0ZnJhbWVfY250ID0lZFxuIiwKLQkJCSBweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCk7Ci0JfSBlbHNlIGlmIChweG1pdGZyYW1lLT5leHRfdGFnID09IDEpIHsKLQkJcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250Kys7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2RlYnVnXywKLQkJCSAicnR3X2ZyZWVfeG1pdGZyYW1lMjNhKCk6ZnJlZV94ZnJhbWVfZXh0X2NudCA9JWRcbiIsCi0JCQkgcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250KTsKLQl9Ci0KLQlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwotCi1jaGVja19wa3RfY29tcGxldGU6Ci0KLQlpZiAocG5kaXNfcGt0KQotCQlydHdfb3NfcGt0X2NvbXBsZXRlMjNhKHBhZGFwdGVyLCBwbmRpc19wa3QpOwotCi1leGl0OgotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi12b2lkIHJ0d19mcmVlX3htaXRmcmFtZV9xdWV1ZTIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsCi0JCQkJIHN0cnVjdCBydHdfcXVldWUgKnBmcmFtZXF1ZXVlKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBoZWFkOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCAqcHRtcDsKLQotCXNwaW5fbG9ja19iaCgmcGZyYW1lcXVldWUtPmxvY2spOwotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJhbWVxdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4bWl0ZnJhbWUsIHB0bXAsIHBoZWFkLCBsaXN0KQotCQlydHdfZnJlZV94bWl0ZnJhbWUyM2EocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKLQlzcGluX3VubG9ja19iaCgmcGZyYW1lcXVldWUtPmxvY2spOwotCi19Ci0KLWludCBydHdfeG1pdGZyYW1lX2VucXVldWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JaWYgKHJ0d194bWl0MjNhX2NsYXNzaWZpZXIocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpID09IF9GQUlMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInJ0d194bWl0ZnJhbWVfZW5xdWV1ZTIzYTogZHJvcCB4bWl0IHBrdCBmb3IgY2xhc3NpZmllciBmYWlsXG4iKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHN0cnVjdCB4bWl0X2ZyYW1lICoKLWRlcXVldWVfb25lX3htaXRmcmFtZShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsIHN0cnVjdCBod194bWl0ICpwaHd4bWl0LAotCQkgICAgICBzdHJ1Y3QgdHhfc2VydnEgKnB0eHNlcnZxLCBzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJhbWVfcXVldWUpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSBOVUxMOwotCi0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKHBmcmFtZV9xdWV1ZSk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkocGhlYWQpKSB7Ci0JCXB4bWl0ZnJhbWUgPSBsaXN0X2ZpcnN0X2VudHJ5KHBoZWFkLCBzdHJ1Y3QgeG1pdF9mcmFtZSwgbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCQlwdHhzZXJ2cS0+cWNudC0tOwotCX0KLQlyZXR1cm4gcHhtaXRmcmFtZTsKLX0KLQotc3RydWN0IHhtaXRfZnJhbWUgKgotcnR3X2RlcXVldWVfeGZyYW1lMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgc3RydWN0IGh3X3htaXQgKnBod3htaXRfaSwKLQkJICAgaW50IGVudHJ5KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnN0YV9waGVhZDsKLQlzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdDsKLQlzdHJ1Y3QgdHhfc2VydnEgKnB0eHNlcnZxID0gTlVMTCwgKnB0bXA7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyYW1lX3F1ZXVlID0gTlVMTDsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSA9IE5VTEw7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHB4bWl0cHJpdi0+YWRhcHRlcjsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdgkqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlpbnQgaSwgaW54WzRdOwotCi0JaW54WzBdID0gMDsKLQlpbnhbMV0gPSAxOwotCWlueFsyXSA9IDI7Ci0JaW54WzNdID0gMzsKLQlpZiAocHJlZ3ByaXYtPndpZmlfc3BlYyA9PSAxKSB7Ci0JCWludCBqOwotCi0JCWZvciAoaiA9IDA7IGogPCA0OyBqKyspCi0JCQlpbnhbal0gPSBweG1pdHByaXYtPndtbV9wYXJhX3NlcVtqXTsKLQl9Ci0KLQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZW50cnk7IGkrKykgewotCQlwaHd4bWl0ID0gcGh3eG1pdF9pICsgaW54W2ldOwotCi0JCXN0YV9waGVhZCA9IGdldF9saXN0X2hlYWQocGh3eG1pdC0+c3RhX3F1ZXVlKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0eHNlcnZxLCBwdG1wLCBzdGFfcGhlYWQsCi0JCQkJCSB0eF9wZW5kaW5nKSB7Ci0JCQlwZnJhbWVfcXVldWUgPSAmcHR4c2VydnEtPnN0YV9wZW5kaW5nOwotCi0JCQlweG1pdGZyYW1lID0gZGVxdWV1ZV9vbmVfeG1pdGZyYW1lKHB4bWl0cHJpdiwgcGh3eG1pdCwgcHR4c2VydnEsIHBmcmFtZV9xdWV1ZSk7Ci0KLQkJCWlmIChweG1pdGZyYW1lKSB7Ci0JCQkJcGh3eG1pdC0+YWNjbnQtLTsKLQotCQkJCS8qIFJlbW92ZSBzdGEgbm9kZSB3aGVuIHRoZXJlIGlzIG5vIHBlbmRpbmcgcGFja2V0cy4gKi8KLQkJCQkvKiBtdXN0IGJlIGRvbmUgYWZ0ZXIgZ2V0X25leHQgYW5kCi0JCQkJICAgYmVmb3JlIGJyZWFrICovCi0JCQkJaWYgKGxpc3RfZW1wdHkoJnBmcmFtZV9xdWV1ZS0+cXVldWUpKQotCQkJCQlsaXN0X2RlbF9pbml0KCZwdHhzZXJ2cS0+dHhfcGVuZGluZyk7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQl9Ci0JfQotZXhpdDoKLQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQlyZXR1cm4gcHhtaXRmcmFtZTsKLX0KLQotc3RydWN0IHR4X3NlcnZxICpydHdfZ2V0X3N0YV9wZW5kaW5nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgaW50IHVwLCB1OCAqYWMpCi17Ci0Jc3RydWN0IHR4X3NlcnZxICpwdHhzZXJ2cSA9IE5VTEw7Ci0KLQlzd2l0Y2ggKHVwKSB7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJcHR4c2VydnEgPSAmcHN0YS0+c3RhX3htaXRwcml2LmJrX3E7Ci0JCSooYWMpID0gMzsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInJ0d19nZXRfc3RhX3BlbmRpbmcyM2EgOiBCS1xuIik7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQljYXNlIDU6Ci0JCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi52aV9xOwotCQkqKGFjKSA9IDE7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJydHdfZ2V0X3N0YV9wZW5kaW5nMjNhIDogVklcbiIpOwotCQlicmVhazsKLQljYXNlIDY6Ci0JY2FzZSA3OgotCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYudm9fcTsKLQkJKihhYykgPSAwOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X2dldF9zdGFfcGVuZGluZzIzYSA6IFZPXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCWNhc2UgMzoKLQlkZWZhdWx0OgotCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYuYmVfcTsKLQkJKihhYykgPSAyOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnR3X2dldF9zdGFfcGVuZGluZzIzYSA6IEJFXG4iKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBwdHhzZXJ2cTsKLX0KLQotLyoKLSAqIFdpbGwgZW5xdWV1ZSBweG1pdGZyYW1lIHRvIHRoZSBwcm9wZXIgcXVldWUsCi0gKiBhbmQgaW5kaWNhdGUgaXQgdG8geHhfcGVuZGluZyBsaXN0Li4uLi4KLSAqLwotaW50IHJ0d194bWl0MjNhX2NsYXNzaWZpZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQotewotCXN0cnVjdCBzdGFfaW5mbwkqcHN0YTsKLQlzdHJ1Y3QgdHhfc2VydnEJKnB0eHNlcnZxOwotCXN0cnVjdCBwa3RfYXR0cmliCSpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3Qgc3RhX3ByaXYJKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBod194bWl0CSpwaHd4bWl0cyA9ICBwYWRhcHRlci0+eG1pdHByaXYuaHd4bWl0czsKLQl1OAlhY19pbmRleDsKLQlpbnQgcmVzID0gX1NVQ0NFU1M7Ci0KLQlpZiAocGF0dHJpYi0+cHN0YSkgewotCQlwc3RhID0gcGF0dHJpYi0+cHN0YTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBjYWxsIHJ0d19nZXRfc3RhaW5mbzIzYSgpXG4iLCBfX2Z1bmNfXyk7Ci0JCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPnJhKTsKLQl9Ci0JaWYgKHBzdGEgPT0gTlVMTCkgewotCQlyZXMgPSBfRkFJTDsKLQkJREJHXzg3MjNBKCJydHdfeG1pdDIzYV9jbGFzc2lmaWVyOiBwc3RhID09IE5VTExcbiIpOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfeG1pdDIzYV9jbGFzc2lmaWVyOiBwc3RhID09IE5VTExcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCWlmICghKHBzdGEtPnN0YXRlICYgX0ZXX0xJTktFRCkpIHsKLQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwgX19mdW5jX18sCi0JCQkgIHBzdGEtPnN0YXRlKTsKLQkJcmV0dXJuIF9GQUlMOwotCX0KLQlwdHhzZXJ2cSA9IHJ0d19nZXRfc3RhX3BlbmRpbmcyM2EocGFkYXB0ZXIsIHBzdGEsIHBhdHRyaWItPnByaW9yaXR5LAotCQkJCSAgICAgICAodTggKikoJmFjX2luZGV4KSk7Ci0KLQlpZiAobGlzdF9lbXB0eSgmcHR4c2VydnEtPnR4X3BlbmRpbmcpKSB7Ci0JCWxpc3RfYWRkX3RhaWwoJnB0eHNlcnZxLT50eF9wZW5kaW5nLAotCQkJICAgICAgZ2V0X2xpc3RfaGVhZChwaHd4bWl0c1thY19pbmRleF0uc3RhX3F1ZXVlKSk7Ci0JfQotCi0JbGlzdF9hZGRfdGFpbCgmcHhtaXRmcmFtZS0+bGlzdCwgZ2V0X2xpc3RfaGVhZCgmcHR4c2VydnEtPnN0YV9wZW5kaW5nKSk7Ci0JcHR4c2VydnEtPnFjbnQrKzsKLQlwaHd4bWl0c1thY19pbmRleF0uYWNjbnQrKzsKLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBydHdfYWxsb2NfaHd4bWl0czIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBod194bWl0ICpod3htaXRzOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0JaW50IHNpemU7Ci0KLQlweG1pdHByaXYtPmh3eG1pdF9lbnRyeSA9IEhXWE1JVF9FTlRSWTsKLQotCXNpemUgPSBzaXplb2Yoc3RydWN0IGh3X3htaXQpICogKHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5ICsgMSk7Ci0JcHhtaXRwcml2LT5od3htaXRzID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQotCWh3eG1pdHMgPSBweG1pdHByaXYtPmh3eG1pdHM7Ci0KLQlpZiAocHhtaXRwcml2LT5od3htaXRfZW50cnkgPT0gNSkgewotCQkvKiBweG1pdHByaXYtPmJtY190eHF1ZXVlLmhlYWQgPSAwOyAqLwotCQkvKiBod3htaXRzWzBdIC5waHd0eHF1ZXVlID0gJnB4bWl0cHJpdi0+Ym1jX3R4cXVldWU7ICovCi0JCWh3eG1pdHNbMF0gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPmJtX3BlbmRpbmc7Ci0KLQkJLyogcHhtaXRwcml2LT52b190eHF1ZXVlLmhlYWQgPSAwOyAqLwotCQkvKiBod3htaXRzWzFdIC5waHd0eHF1ZXVlID0gJnB4bWl0cHJpdi0+dm9fdHhxdWV1ZTsgKi8KLQkJaHd4bWl0c1sxXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dm9fcGVuZGluZzsKLQotCQkvKiBweG1pdHByaXYtPnZpX3R4cXVldWUuaGVhZCA9IDA7ICovCi0JCS8qIGh3eG1pdHNbMl0gLnBod3R4cXVldWUgPSAmcHhtaXRwcml2LT52aV90eHF1ZXVlOyAqLwotCQlod3htaXRzWzJdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT52aV9wZW5kaW5nOwotCi0JCS8qIHB4bWl0cHJpdi0+YmtfdHhxdWV1ZS5oZWFkID0gMDsgKi8KLQkJLyogaHd4bWl0c1szXSAucGh3dHhxdWV1ZSA9ICZweG1pdHByaXYtPmJrX3R4cXVldWU7ICovCi0JCWh3eG1pdHNbM10gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPmJrX3BlbmRpbmc7Ci0KLQkJLyogcHhtaXRwcml2LT5iZV90eHF1ZXVlLmhlYWQgPSAwOyAqLwotCQkvKiBod3htaXRzWzRdIC5waHd0eHF1ZXVlID0gJnB4bWl0cHJpdi0+YmVfdHhxdWV1ZTsgKi8KLQkJaHd4bWl0c1s0XSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmVfcGVuZGluZzsKLQotCX0gZWxzZSBpZiAocHhtaXRwcml2LT5od3htaXRfZW50cnkgPT0gNCkgewotCi0JCS8qIHB4bWl0cHJpdi0+dm9fdHhxdWV1ZS5oZWFkID0gMDsgKi8KLQkJLyogaHd4bWl0c1swXSAucGh3dHhxdWV1ZSA9ICZweG1pdHByaXYtPnZvX3R4cXVldWU7ICovCi0JCWh3eG1pdHNbMF0gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPnZvX3BlbmRpbmc7Ci0KLQkJLyogcHhtaXRwcml2LT52aV90eHF1ZXVlLmhlYWQgPSAwOyAqLwotCQkvKiBod3htaXRzWzFdIC5waHd0eHF1ZXVlID0gJnB4bWl0cHJpdi0+dmlfdHhxdWV1ZTsgKi8KLQkJaHd4bWl0c1sxXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dmlfcGVuZGluZzsKLQotCQkvKiBweG1pdHByaXYtPmJlX3R4cXVldWUuaGVhZCA9IDA7ICovCi0JCS8qIGh3eG1pdHNbMl0gLnBod3R4cXVldWUgPSAmcHhtaXRwcml2LT5iZV90eHF1ZXVlOyAqLwotCQlod3htaXRzWzJdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT5iZV9wZW5kaW5nOwotCi0JCS8qIHB4bWl0cHJpdi0+YmtfdHhxdWV1ZS5oZWFkID0gMDsgKi8KLQkJLyogaHd4bWl0c1szXSAucGh3dHhxdWV1ZSA9ICZweG1pdHByaXYtPmJrX3R4cXVldWU7ICovCi0JCWh3eG1pdHNbM10gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPmJrX3BlbmRpbmc7Ci0JfSBlbHNlIHsKLQotCX0KLX0KLQotdm9pZCBydHdfZnJlZV9od3htaXRzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGh3X3htaXQgKmh3eG1pdHM7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCWh3eG1pdHMgPSBweG1pdHByaXYtPmh3eG1pdHM7Ci0Ja2ZyZWUoaHd4bWl0cyk7Ci19Ci0KLXZvaWQgcnR3X2luaXRfaHd4bWl0czIzYShzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdCwgaW50IGVudHJ5KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGVudHJ5OyBpKyssIHBod3htaXQrKykKLQkJcGh3eG1pdC0+YWNjbnQgPSAwOwotfQotCi11MzIgcnR3X2dldF9mZl9od2FkZHIyM2Eoc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17Ci0JdTMyIGFkZHI7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCi0Jc3dpdGNoIChwYXR0cmliLT5xc2VsKSB7Ci0JY2FzZSAwOgotCWNhc2UgMzoKLQkJYWRkciA9IEJFX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCWNhc2UgMjoKLQkJYWRkciA9IEJLX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCWNhc2UgNToKLQkJYWRkciA9IFZJX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSA2OgotCWNhc2UgNzoKLQkJYWRkciA9IFZPX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSAweDEwOgotCQlhZGRyID0gQkNOX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSAweDExOi8qIEJDL01DIGluIFBTIChISVEpICovCi0JCWFkZHIgPSBISUdIX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSAweDEyOgotCWRlZmF1bHQ6Ci0JCWFkZHIgPSBNR1RfUVVFVUVfSU5YOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLQotLyoKLSAqIFRoZSBtYWluIHRyYW5zbWl0KHR4KSBlbnRyeQotICoKLSAqIFJldHVybgotICoJMQllbnF1ZXVlCi0gKgkwCXN1Y2Nlc3MsIGhhcmR3YXJlIHdpbGwgaGFuZGxlIHRoaXMgeG1pdCBmcmFtZShwYWNrZXQpCi0gKgk8MAlmYWlsCi0gKi8KLWludCBydHdfeG1pdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSBOVUxMOwotCWludCByZXM7Ci0KLQlweG1pdGZyYW1lID0gcnR3X2FsbG9jX3htaXRmcmFtZShweG1pdHByaXYpOwotCi0JaWYgKHB4bWl0ZnJhbWUgPT0gTlVMTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3htaXQyM2E6IG5vIG1vcmUgcHhtaXRmcmFtZVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXMgPSB1cGRhdGVfYXR0cmliKHBhZGFwdGVyLCBza2IsICZweG1pdGZyYW1lLT5hdHRyaWIpOwotCi0JaWYgKHJlcyA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3htaXQyM2E6IHVwZGF0ZSBhdHRyaWIgZmFpbFxuIik7Ci0JCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXB4bWl0ZnJhbWUtPnBrdCA9IHNrYjsKLQotCXB4bWl0ZnJhbWUtPmF0dHJpYi5xc2VsID0gcHhtaXRmcmFtZS0+YXR0cmliLnByaW9yaXR5OwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Jc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCWlmICh4bWl0ZnJhbWVfZW5xdWV1ZV9mb3Jfc2xlZXBpbmdfc3RhMjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKSkgewotCQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQkJcmV0dXJuIDE7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotI2VuZGlmCi0KLQlpZiAocnRsODcyM2F1X2hhbF94bWl0KHBhZGFwdGVyLCBweG1pdGZyYW1lKSA9PSBmYWxzZSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmIGRlZmluZWQoQ09ORklHXzg3MjNBVV9BUF9NT0RFKQotCi1pbnQgeG1pdGZyYW1lX2VucXVldWVfZm9yX3NsZWVwaW5nX3N0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlpbnQgcmV0ID0gZmFsc2U7Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCWludCBibWNzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKTsKLQotCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHBhdHRyaWItPnBzdGEpIHsKLQkJcHN0YSA9IHBhdHRyaWItPnBzdGE7Ci0JfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8yM2EoKVxuIiwgX19mdW5jX18pOwotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5yYSk7Ci0JfQotCi0JaWYgKHBzdGEgPT0gTlVMTCkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JaWYgKCEocHN0YS0+c3RhdGUgJiBfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzLCBwc3RhLT5zdGF0ZSgweCV4KSAhPSBfRldfTElOS0VEXG4iLCBfX2Z1bmNfXywKLQkJCSAgcHN0YS0+c3RhdGUpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JaWYgKHBhdHRyaWItPnRyaWdnZXJlZCA9PSAxKSB7Ci0JCWlmIChibWNzdCkKLQkJCXBhdHRyaWItPnFzZWwgPSAweDExOy8qIEhJUSAqLwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChibWNzdCkgewotCQlzcGluX2xvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7Ci0KLQkJaWYgKHBzdGFwcml2LT5zdGFfZHpfYml0bWFwKSB7Ci0JCQkvKiBpZiBhbnlvbmUgc3RhIGlzIGluIHBzIG1vZGUgKi8KLQkJCWxpc3RfZGVsX2luaXQoJnB4bWl0ZnJhbWUtPmxpc3QpOwotCi0JCQkvKiBzcGluX2xvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7ICovCi0KLQkJCWxpc3RfYWRkX3RhaWwoJnB4bWl0ZnJhbWUtPmxpc3QsIGdldF9saXN0X2hlYWQoJnBzdGEtPnNsZWVwX3EpKTsKLQotCQkJcHN0YS0+c2xlZXBxX2xlbisrOwotCi0JCQlwc3RhcHJpdi0+dGltX2JpdG1hcCB8PSBCSVQoMCk7LyogICovCi0JCQlwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCB8PSBCSVQoMCk7Ci0KLQkJCS8qIERCR184NzIzQSgiZW5xdWV1ZSwgc3FfbGVuID0lZCwgdGltID0leFxuIiwgcHN0YS0+c2xlZXBxX2xlbiwgcHN0YXByaXYtPnRpbV9iaXRtYXApOyAqLwotCi0JCQkvKiB0eCBiYy9tYyBwYWNrZXRzIGFmdGVyIHVwZGF0ZSBiY24gKi8KLQkJCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX1RJTSwgTlVMTCwgZmFsc2UpOwotCi0JCQkvKiBzcGluX3VubG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsgKi8KLQotCQkJcmV0ID0gdHJ1ZTsKLQotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfYmgoJnBzdGEtPnNsZWVwX3EubG9jayk7Ci0KLQkJcmV0dXJuIHJldDsKLQotCX0KLQotCXNwaW5fbG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsKLQotCWlmIChwc3RhLT5zdGF0ZSZXSUZJX1NMRUVQX1NUQVRFKSB7Ci0JCXU4IHdtbXBzX2FjID0gMDsKLQotCQlpZiAocHN0YXByaXYtPnN0YV9kel9iaXRtYXAgJiBDSEtCSVQocHN0YS0+YWlkKSkgewotCQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRmcmFtZS0+bGlzdCk7Ci0KLQkJCS8qIHNwaW5fbG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsgKi8KLQotCQkJbGlzdF9hZGRfdGFpbCgmcHhtaXRmcmFtZS0+bGlzdCwgZ2V0X2xpc3RfaGVhZCgmcHN0YS0+c2xlZXBfcSkpOwotCi0JCQlwc3RhLT5zbGVlcHFfbGVuKys7Ci0KLQkJCXN3aXRjaCAocGF0dHJpYi0+cHJpb3JpdHkpIHsKLQkJCWNhc2UgMToKLQkJCWNhc2UgMjoKLQkJCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX2JrICYgQklUKDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0OgotCQkJY2FzZSA1OgotCQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2RfdmkgJiBCSVQoMCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDY6Ci0JCQljYXNlIDc6Ci0JCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF92byAmIEJJVCgwKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMDoKLQkJCWNhc2UgMzoKLQkJCWRlZmF1bHQ6Ci0JCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF9iZSAmIEJJVCgwKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKHdtbXBzX2FjKQotCQkJCXBzdGEtPnNsZWVwcV9hY19sZW4rKzsKLQotCQkJaWYgKCgocHN0YS0+aGFzX2xlZ2FjeV9hYykgJiYgKCF3bW1wc19hYykpIHx8Ci0JCQkgICAoKCFwc3RhLT5oYXNfbGVnYWN5X2FjKSAmJiAod21tcHNfYWMpKSkgewotCQkJCXBzdGFwcml2LT50aW1fYml0bWFwIHw9IENIS0JJVChwc3RhLT5haWQpOwotCi0JCQkJaWYgKHBzdGEtPnNsZWVwcV9sZW4gPT0gMSkgewotCQkJCQkvKiB1cGRhdGUgQkNOIGZvciBUSU0gSUUgKi8KLQkJCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfVElNLAotCQkJCQkJCSBOVUxMLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBzcGluX3VubG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsgKi8KLQotCQkJLyogaWYgKHBzdGEtPnNsZWVwcV9sZW4gPiAoTlJfWE1JVEZSQU1FPj4zKSkgKi8KLQkJCS8qICAqLwotCQkJLyoJd2FrZXVwX3N0YV90b194bWl0MjNhKHBhZGFwdGVyLCBwc3RhKTsgKi8KLQkJCS8qICAqLwotCi0JCQlyZXQgPSB0cnVlOwotCi0JCX0KLQotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhLT5zbGVlcF9xLmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQKLWRlcXVldWVfeG1pdGZyYW1lc190b19zbGVlcGluZ19xdWV1ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgc3RydWN0IHN0YV9pbmZvICpwc3RhLAotCQkJCSAgICAgc3RydWN0IHJ0d19xdWV1ZSAqcGZyYW1lcXVldWUpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQl1OCBhY19pbmRleDsKLQlzdHJ1Y3QgdHhfc2VydnEJKnB0eHNlcnZxOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCAqcHRtcDsKLQlzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdHMgPSBwYWRhcHRlci0+eG1pdHByaXYuaHd4bWl0czsKLQotCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJhbWVxdWV1ZSk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB4bWl0ZnJhbWUsIHB0bXAsIHBoZWFkLCBsaXN0KSB7Ci0JCXJldCA9IHhtaXRmcmFtZV9lbnF1ZXVlX2Zvcl9zbGVlcGluZ19zdGEyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCi0JCWlmIChyZXQgPT0gdHJ1ZSkgewotCQkJcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0KLQkJCXB0eHNlcnZxID0gcnR3X2dldF9zdGFfcGVuZGluZzIzYShwYWRhcHRlciwgcHN0YSwgcGF0dHJpYi0+cHJpb3JpdHksICh1OCAqKSgmYWNfaW5kZXgpKTsKLQotCQkJcHR4c2VydnEtPnFjbnQtLTsKLQkJCXBod3htaXRzW2FjX2luZGV4XS5hY2NudC0tOwotCQl9IGVsc2UgewotCQkJLyogREJHXzg3MjNBKCJ4bWl0ZnJhbWVfZW5xdWV1ZV9mb3Jfc2xlZXBpbmdfc3RhMjNhIHJldHVybiBmYWxzZVxuIik7ICovCi0JCX0KLQl9Ci19Ci0KLXZvaWQgc3RvcF9zdGFfeG1pdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpwc3RhX2JtYzsKLQlzdHJ1Y3Qgc3RhX3htaXRfcHJpdiAqcHN0YXhtaXRwcml2OwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCXBzdGF4bWl0cHJpdiA9ICZwc3RhLT5zdGFfeG1pdHByaXY7Ci0KLQkvKiBmb3IgQkMvTUMgRnJhbWVzICovCi0JcHN0YV9ibWMgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0KLQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0KLQlwc3RhLT5zdGF0ZSB8PSBXSUZJX1NMRUVQX1NUQVRFOwotCi0JcHN0YXByaXYtPnN0YV9kel9iaXRtYXAgfD0gQ0hLQklUKHBzdGEtPmFpZCk7Ci0KLQlkZXF1ZXVlX3htaXRmcmFtZXNfdG9fc2xlZXBpbmdfcXVldWUocGFkYXB0ZXIsIHBzdGEsICZwc3RheG1pdHByaXYtPnZvX3Euc3RhX3BlbmRpbmcpOwotCWxpc3RfZGVsX2luaXQoJnBzdGF4bWl0cHJpdi0+dm9fcS50eF9wZW5kaW5nKTsKLQotCWRlcXVldWVfeG1pdGZyYW1lc190b19zbGVlcGluZ19xdWV1ZShwYWRhcHRlciwgcHN0YSwgJnBzdGF4bWl0cHJpdi0+dmlfcS5zdGFfcGVuZGluZyk7Ci0JbGlzdF9kZWxfaW5pdCgmcHN0YXhtaXRwcml2LT52aV9xLnR4X3BlbmRpbmcpOwotCi0JZGVxdWV1ZV94bWl0ZnJhbWVzX3RvX3NsZWVwaW5nX3F1ZXVlKHBhZGFwdGVyLCBwc3RhLAotCQkJCQkgICAgICZwc3RheG1pdHByaXYtPmJlX3Euc3RhX3BlbmRpbmcpOwotCWxpc3RfZGVsX2luaXQoJnBzdGF4bWl0cHJpdi0+YmVfcS50eF9wZW5kaW5nKTsKLQotCWRlcXVldWVfeG1pdGZyYW1lc190b19zbGVlcGluZ19xdWV1ZShwYWRhcHRlciwgcHN0YSwKLQkJCQkJICAgICAmcHN0YXhtaXRwcml2LT5ia19xLnN0YV9wZW5kaW5nKTsKLQlsaXN0X2RlbF9pbml0KCZwc3RheG1pdHByaXYtPmJrX3EudHhfcGVuZGluZyk7Ci0KLQkvKiBmb3IgQkMvTUMgRnJhbWVzICovCi0JcHN0YXhtaXRwcml2ID0gJnBzdGFfYm1jLT5zdGFfeG1pdHByaXY7Ci0JZGVxdWV1ZV94bWl0ZnJhbWVzX3RvX3NsZWVwaW5nX3F1ZXVlKHBhZGFwdGVyLCBwc3RhX2JtYywKLQkJCQkJICAgICAmcHN0YXhtaXRwcml2LT5iZV9xLnN0YV9wZW5kaW5nKTsKLQlsaXN0X2RlbF9pbml0KCZwc3RheG1pdHByaXYtPmJlX3EudHhfcGVuZGluZyk7Ci0KLQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLX0KLQotdm9pZCB3YWtldXBfc3RhX3RvX3htaXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKQotewotCXU4IHVwZGF0ZV9tYXNrID0gMCwgd21tcHNfYWMgPSAwOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YV9ibWM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSBOVUxMLCAqcHRtcDsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhLT5zbGVlcF9xKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHhtaXRmcmFtZSwgcHRtcCwgcGhlYWQsIGxpc3QpIHsKLQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRmcmFtZS0+bGlzdCk7Ci0KLQkJc3dpdGNoIChweG1pdGZyYW1lLT5hdHRyaWIucHJpb3JpdHkpIHsKLQkJY2FzZSAxOgotCQljYXNlIDI6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX2JrICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJY2FzZSA1OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF92aSAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQljYXNlIDY6Ci0JCWNhc2UgNzoKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2Rfdm8gJiBCSVQoMSk7Ci0JCQlicmVhazsKLQkJY2FzZSAwOgotCQljYXNlIDM6Ci0JCWRlZmF1bHQ6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX2JlICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwc3RhLT5zbGVlcHFfbGVuLS07Ci0JCWlmIChwc3RhLT5zbGVlcHFfbGVuID4gMCkKLQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDE7Ci0JCWVsc2UKLQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDA7Ci0KLQkJaWYgKHdtbXBzX2FjKSB7Ci0JCQlwc3RhLT5zbGVlcHFfYWNfbGVuLS07Ci0JCQlpZiAocHN0YS0+c2xlZXBxX2FjX2xlbiA+IDApIHsKLQkJCQlweG1pdGZyYW1lLT5hdHRyaWIubWRhdGEgPSAxOwotCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5lb3NwID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcHhtaXRmcmFtZS0+YXR0cmliLm1kYXRhID0gMDsKLQkJCQlweG1pdGZyYW1lLT5hdHRyaWIuZW9zcCA9IDE7Ci0JCQl9Ci0JCX0KLQotCQlweG1pdGZyYW1lLT5hdHRyaWIudHJpZ2dlcmVkID0gMTsKLQkJcnRsODcyM2F1X2hhbF94bWl0ZnJhbWVfZW5xdWV1ZShwYWRhcHRlciwgcHhtaXRmcmFtZSk7Ci0JfQotCi0JaWYgKHBzdGEtPnNsZWVwcV9sZW4gPT0gMCkgewotCQlwc3RhcHJpdi0+dGltX2JpdG1hcCAmPSB+Q0hLQklUKHBzdGEtPmFpZCk7Ci0KLQkJLyogdXBkYXRlIEJDTiBmb3IgVElNIElFICovCi0JCXVwZGF0ZV9tYXNrID0gQklUKDApOwotCi0JCWlmIChwc3RhLT5zdGF0ZSZXSUZJX1NMRUVQX1NUQVRFKQotCQkJcHN0YS0+c3RhdGUgXj0gV0lGSV9TTEVFUF9TVEFURTsKLQotCQlpZiAocHN0YS0+c3RhdGUgJiBXSUZJX1NUQV9BTElWRV9DSEtfU1RBVEUpIHsKLQkJCXBzdGEtPmV4cGlyZV90byA9IHBzdGFwcml2LT5leHBpcmVfdG87Ci0JCQlwc3RhLT5zdGF0ZSBePSBXSUZJX1NUQV9BTElWRV9DSEtfU1RBVEU7Ci0JCX0KLQotCQlwc3RhcHJpdi0+c3RhX2R6X2JpdG1hcCAmPSB+Q0hLQklUKHBzdGEtPmFpZCk7Ci0JfQotCS8qIHNwaW5fdW5sb2NrX2JoKCZwc3RhLT5zbGVlcF9xLmxvY2spOyAqLwotCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JLyogZm9yIEJDL01DIEZyYW1lcyAqLwotCXBzdGFfYm1jID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCWlmICghcHN0YV9ibWMpCi0JCXJldHVybjsKLQotCWlmICgocHN0YXByaXYtPnN0YV9kel9iaXRtYXAmMHhmZmZlKSA9PSAweDApIHsKLQkJLyogbm8gYW55IHN0YSBpbiBwcyBtb2RlICovCi0JCXNwaW5fbG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQkJcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhX2JtYy0+c2xlZXBfcSk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShweG1pdGZyYW1lLCBwdG1wLCBwaGVhZCwgbGlzdCkgewotCQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRmcmFtZS0+bGlzdCk7Ci0KLQkJCXBzdGFfYm1jLT5zbGVlcHFfbGVuLS07Ci0JCQlpZiAocHN0YV9ibWMtPnNsZWVwcV9sZW4gPiAwKQotCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5tZGF0YSA9IDE7Ci0JCQllbHNlCi0JCQkJcHhtaXRmcmFtZS0+YXR0cmliLm1kYXRhID0gMDsKLQotCQkJcHhtaXRmcmFtZS0+YXR0cmliLnRyaWdnZXJlZCA9IDE7Ci0JCQlydGw4NzIzYXVfaGFsX3htaXRmcmFtZV9lbnF1ZXVlKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQkJfQotCQlpZiAocHN0YV9ibWMtPnNsZWVwcV9sZW4gPT0gMCkgewotCQkJcHN0YXByaXYtPnRpbV9iaXRtYXAgJj0gfkJJVCgwKTsKLQkJCXBzdGFwcml2LT5zdGFfZHpfYml0bWFwICY9IH5CSVQoMCk7Ci0KLQkJCS8qIHVwZGF0ZSBCQ04gZm9yIFRJTSBJRSAqLwotCQkJLyogdXBkYXRlX0JDTlRJTShwYWRhcHRlcik7ICovCi0JCQl1cGRhdGVfbWFzayB8PSBCSVQoMSk7Ci0JCX0KLQkJLyogc3Bpbl91bmxvY2tfYmgoJnBzdGFfYm1jLT5zbGVlcF9xLmxvY2spOyAqLwotCQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQl9Ci0KLQlpZiAodXBkYXRlX21hc2spCi0JCXVwZGF0ZV9iZWFjb24yM2EocGFkYXB0ZXIsIFdMQU5fRUlEX1RJTSwgTlVMTCwgZmFsc2UpOwotfQotCi12b2lkIHhtaXRfZGVsaXZlcnlfZW5hYmxlZF9mcmFtZXMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKLXsKLQl1OCB3bW1wc19hYyA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUsICpwdG1wOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCS8qIHNwaW5fbG9ja19iaCgmcHN0YS0+c2xlZXBfcS5sb2NrKTsgKi8KLQlzcGluX2xvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci0JcGhlYWQgPSBnZXRfbGlzdF9oZWFkKCZwc3RhLT5zbGVlcF9xKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHhtaXRmcmFtZSwgcHRtcCwgcGhlYWQsIGxpc3QpIHsKLQkJc3dpdGNoIChweG1pdGZyYW1lLT5hdHRyaWIucHJpb3JpdHkpIHsKLQkJY2FzZSAxOgotCQljYXNlIDI6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX2JrICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJY2FzZSA1OgotCQkJd21tcHNfYWMgPSBwc3RhLT51YXBzZF92aSAmIEJJVCgxKTsKLQkJCWJyZWFrOwotCQljYXNlIDY6Ci0JCWNhc2UgNzoKLQkJCXdtbXBzX2FjID0gcHN0YS0+dWFwc2Rfdm8gJiBCSVQoMSk7Ci0JCQlicmVhazsKLQkJY2FzZSAwOgotCQljYXNlIDM6Ci0JCWRlZmF1bHQ6Ci0JCQl3bW1wc19hYyA9IHBzdGEtPnVhcHNkX2JlICYgQklUKDEpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoIXdtbXBzX2FjKQotCQkJY29udGludWU7Ci0KLQkJbGlzdF9kZWxfaW5pdCgmcHhtaXRmcmFtZS0+bGlzdCk7Ci0KLQkJcHN0YS0+c2xlZXBxX2xlbi0tOwotCQlwc3RhLT5zbGVlcHFfYWNfbGVuLS07Ci0KLQkJaWYgKHBzdGEtPnNsZWVwcV9hY19sZW4gPiAwKSB7Ci0JCQlweG1pdGZyYW1lLT5hdHRyaWIubWRhdGEgPSAxOwotCQkJcHhtaXRmcmFtZS0+YXR0cmliLmVvc3AgPSAwOwotCQl9IGVsc2UgewotCQkJcHhtaXRmcmFtZS0+YXR0cmliLm1kYXRhID0gMDsKLQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5lb3NwID0gMTsKLQkJfQotCi0JCXB4bWl0ZnJhbWUtPmF0dHJpYi50cmlnZ2VyZWQgPSAxOwotCi0JCXJ0bDg3MjNhdV9oYWxfeG1pdGZyYW1lX2VucXVldWUocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCi0JCWlmICgocHN0YS0+c2xlZXBxX2FjX2xlbiA9PSAwKSAmJiAoIXBzdGEtPmhhc19sZWdhY3lfYWMpICYmCi0JCSAgICAod21tcHNfYWMpKSB7Ci0JCQlwc3RhcHJpdi0+dGltX2JpdG1hcCAmPSB+Q0hLQklUKHBzdGEtPmFpZCk7Ci0KLQkJCS8qIHVwZGF0ZSBCQ04gZm9yIFRJTSBJRSAqLwotCQkJdXBkYXRlX2JlYWNvbjIzYShwYWRhcHRlciwgV0xBTl9FSURfVElNLCBOVUxMLCBmYWxzZSk7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnB4bWl0cHJpdi0+bG9jayk7Ci19Ci0KLSNlbmRpZgotCi12b2lkIHJ0d19zY3R4X2luaXQyM2Eoc3RydWN0IHN1Ym1pdF9jdHggKnNjdHgsIGludCB0aW1lb3V0X21zKQotewotCXNjdHgtPnRpbWVvdXRfbXMgPSB0aW1lb3V0X21zOwotCWluaXRfY29tcGxldGlvbigmc2N0eC0+ZG9uZSk7Ci0Jc2N0eC0+c3RhdHVzID0gUlRXX1NDVFhfU1VCTUlUVEVEOwotfQotCi1pbnQgcnR3X3NjdHhfd2FpdDIzYShzdHJ1Y3Qgc3VibWl0X2N0eCAqc2N0eCkKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0JdW5zaWduZWQgbG9uZyBleHBpcmU7Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQlleHBpcmUgPSBzY3R4LT50aW1lb3V0X21zID8gbXNlY3NfdG9famlmZmllcyhzY3R4LT50aW1lb3V0X21zKSA6Ci0JCSBNQVhfU0NIRURVTEVfVElNRU9VVDsKLQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmc2N0eC0+ZG9uZSwgZXhwaXJlKSkgewotCQkvKiB0aW1lb3V0LCBkbyBzb21ldGhpbmc/PyAqLwotCQlzdGF0dXMgPSBSVFdfU0NUWF9ET05FX1RJTUVPVVQ7Ci0JCURCR184NzIzQSgiJXMgdGltZW91dFxuIiwgX19mdW5jX18pOwotCX0gZWxzZSB7Ci0JCXN0YXR1cyA9IHNjdHgtPnN0YXR1czsKLQl9Ci0KLQlpZiAoc3RhdHVzID09IFJUV19TQ1RYX0RPTkVfU1VDQ0VTUykKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgYm9vbCBydHdfc2N0eF9jaGtfd2FyaW5nX3N0YXR1cyhpbnQgc3RhdHVzKQotewotCXN3aXRjaCAoc3RhdHVzKSB7Ci0JY2FzZSBSVFdfU0NUWF9ET05FX1VOS05PV046Ci0JY2FzZSBSVFdfU0NUWF9ET05FX0JVRl9BTExPQzoKLQljYXNlIFJUV19TQ1RYX0RPTkVfQlVGX0ZSRUU6Ci0JY2FzZSBSVFdfU0NUWF9ET05FX0RSVl9TVE9QOgotCWNhc2UgUlRXX1NDVFhfRE9ORV9ERVZfUkVNT1ZFOgotCQlyZXR1cm4gdHJ1ZTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi12b2lkIHJ0dzIzYV9zY3R4X2RvbmVfZXJyKHN0cnVjdCBzdWJtaXRfY3R4ICoqc2N0eCwgaW50IHN0YXR1cykKLXsKLQlpZiAoKnNjdHgpIHsKLQkJaWYgKHJ0d19zY3R4X2Noa193YXJpbmdfc3RhdHVzKHN0YXR1cykpCi0JCQlEQkdfODcyM0EoIiVzIHN0YXR1czolZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7Ci0JCSgqc2N0eCktPnN0YXR1cyA9IHN0YXR1czsKLQkJY29tcGxldGUoJigqc2N0eCktPmRvbmUpOwotCQkqc2N0eCA9IE5VTEw7Ci0JfQotfQotCi1pbnQgcnR3X2Fja190eF93YWl0MjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwgdTMyIHRpbWVvdXRfbXMpCi17Ci0Jc3RydWN0IHN1Ym1pdF9jdHggKnBhY2tfdHhfb3BzID0gJnB4bWl0cHJpdi0+YWNrX3R4X29wczsKLQotCXBhY2tfdHhfb3BzLT50aW1lb3V0X21zID0gdGltZW91dF9tczsKLQlwYWNrX3R4X29wcy0+c3RhdHVzID0gUlRXX1NDVFhfU1VCTUlUVEVEOwotCi0JcmV0dXJuIHJ0d19zY3R4X3dhaXQyM2EocGFja190eF9vcHMpOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWw4NzIzUHdyU2VxLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWw4NzIzUHdyU2VxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0N2Y4NmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsODcyM1B3clNlcS5jCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJIYWw4NzIzUHdyU2VxLmgiCi0KLS8qCi0gICAgZHJpdmVycyBzaG91bGQgcGFyc2UgYmVsb3cgYXJyYXlzIGFuZCBkbyB0aGUgY29ycmVzcG9uZGluZyBhY3Rpb25zCi0qLwotLyogMyBQb3dlciBvbiAgQXJyYXkgKi8KLXN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX3Bvd2VyX29uX2Zsb3dbUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19BQ1RfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0FDVAotCVJUTDg3MjNBX1RSQU5TX0VORAotfTsKLQotLyogMyBSYWRpbyBvZmYgR1BJTyBBcnJheSAqLwotc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfcmFkaW9fb2ZmX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQlSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVQotCVJUTDg3MjNBX1RSQU5TX0VORAotfTsKLQotLyogMyBDYXJkIERpc2FibGUgQXJyYXkgKi8KLXN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX2NhcmRfZGlzYWJsZV9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVUKLQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0NBUkRESVMKLQlSVEw4NzIzQV9UUkFOU19FTkQKLX07Ci0KLS8qIDMgQ2FyZCBFbmFibGUgQXJyYXkgKi8KLXN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX2NhcmRfZW5hYmxlX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19QRE5fU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQlSVEw4NzIzQV9UUkFOU19DQVJERElTX1RPX0NBUkRFTVUKLQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0FDVAotCVJUTDg3MjNBX1RSQU5TX0VORAotfTsKLQotLyogMyBTdXNwZW5kIEFycmF5ICovCi1zdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9zdXNwZW5kX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19TVVNfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQlSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVQotCVJUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fU1VTCi0JUlRMODcyM0FfVFJBTlNfRU5ECi19OwotCi0vKiAzIFJlc3VtZSBBcnJheSAqLwotc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfcmVzdW1lX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19TVVNfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQlSVEw4NzIzQV9UUkFOU19TVVNfVE9fQ0FSREVNVQotCVJUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fQUNUCi0JUlRMODcyM0FfVFJBTlNfRU5ECi19OwotCi0vKiAzIEhXUEROIEFycmF5ICovCi1zdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9od3Bkbl9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVUKLQlSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1BETgotCVJUTDg3MjNBX1RSQU5TX0VORAotfTsKLQotLyogMyBFbnRlciBMUFMgKi8KLXN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX2VudGVyX2xwc19mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19MUFNfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXSA9IHsKLQkvKiBGVyBiZWhhdmlvciAqLwotCVJUTDg3MjNBX1RSQU5TX0FDVF9UT19MUFMKLQlSVEw4NzIzQV9UUkFOU19FTkQKLX07Ci0KLS8qIDMgTGVhdmUgTFBTICovCi1zdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9sZWF2ZV9scHNfZmxvd1tSVEw4NzIzQV9UUkFOU19MUFNfVE9fQUNUX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU10gPSB7Ci0JLyogRlcgYmVoYXZpb3IgKi8KLQlSVEw4NzIzQV9UUkFOU19MUFNfVE9fQUNUCi0JUlRMODcyM0FfVFJBTlNfRU5ECi19OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsODcyM1VIV0ltZ19DRS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsODcyM1VIV0ltZ19DRS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjgzM2RhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbDg3MjNVSFdJbWdfQ0UuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLypDcmVhdGVkIG9uICAyMDEzLzAxLzE0LCAxNTo1MSovCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLQotdTMyIFJ0bDg3MjNVUEhZX1JFR19BcnJheV9QR1tSdGw4NzIzVVBIWV9SRUdfQXJyYXlfUEdMZW5ndGhdID0gewotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDBhMGMwYzBjLAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDBhMGMwZDBlLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDBhMGMwZDBlLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDBhMGMwYzBjLAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDBhMGMwZDBlLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDBhMGMwZDBlLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAyMDQwNjA4LAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDA0MDQwNDA0LAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDIwMjA0LAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDA2MDYwNjA2LAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDIwNDA2LAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDA0MDQwNDA0LAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDIwMjA0LAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDA2MDYwNjA2LAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDIwNDA2LAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDA0MDQwNDA0LAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDIwMjA0LAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDA0MDQwNDA0LAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDIwMjA0LAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTAwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ZTEwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTE4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ZTFjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODMwLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM0LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODM4LCAweGZmZmZmZjAwLCAweDAwMDAwMDAwLAotCTB4ODZjLCAweDAwMDAwMGZmLCAweDAwMDAwMDAwLAotCTB4ODNjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODQ4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODRjLCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCTB4ODY4LCAweGZmZmZmZmZmLCAweDAwMDAwMDAwLAotCX07Ci0KLXUzMiBSdGw4NzIzVU1BQ1BIWV9BcnJheV9QR1tSdGw4NzIzVU1BQ1BIWV9BcnJheV9QR0xlbmd0aF0gPSB7Ci0JMHgwLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbERNT3V0U3JjODcyM0FfQ0UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbERNT3V0U3JjODcyM0FfQ0UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y5ZWM5ZTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsRE1PdXRTcmM4NzIzQV9DRS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTA5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICBEZXNjcmlwdGlvbjogKi8KLS8qICBUaGlzIGZpbGUgaXMgZm9yIDkyQ0UvOTJDVSBkeW5hbWljIG1lY2hhbmlzbSBvbmx5ICovCi0KLS8qICBpbmNsdWRlIGZpbGVzICovCi0KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotI2RlZmluZQkJRFBLX0RFTFRBX01BUFBJTkdfTlVNCTEzCi0jZGVmaW5lCQlpbmRleF9tYXBwaW5nX0hQX05VTQkxNQotLyogMDkxMjEyIGNoaXlva29saW4gKi8KLXN0YXRpYyB2b2lkCi1vZG1fVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tfVGhlcm1hbE1ldGVyXzkyQyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCXU4IFRoZXJtYWxWYWx1ZSA9IDAsIGRlbHRhLCBkZWx0YV9MQ0ssIGRlbHRhX0lRSywgZGVsdGFfSFA7Ci0JaW50IGVsZV9BLCBlbGVfRCwgVGVtcENDaywgWCwgdmFsdWUzMjsKLQlpbnQgWSwgZWxlX0M7Ci0JczggT0ZETV9pbmRleFsyXSwgQ0NLX2luZGV4ID0gMCwgT0ZETV9pbmRleF9vbGRbMl0gPSB7MH07Ci0JczggQ0NLX2luZGV4X29sZCA9IDA7Ci0JaW50IGkgPSAwOwotCXU4IE9GRE1fbWluX2luZGV4ID0gNiwgcmY7IC8qIE9GRE0gQkIgU3dpbmcgc2hvdWxkIGJlIGxlc3MgdGhhbiArMy4wZEIqLwotCXU4IFRoZXJtYWxWYWx1ZV9IUF9jb3VudCA9IDA7Ci0JdTMyIFRoZXJtYWxWYWx1ZV9IUCA9IDA7Ci0JczMyIGluZGV4X21hcHBpbmdfSFBbaW5kZXhfbWFwcGluZ19IUF9OVU1dID0gewotCQkwLCAxLCAzLCA0LCA2LAotCQk3LCA5LCAxMCwgMTIsIDEzLAotCQkxNSwgMTYsIDE4LCAxOSwgMjEKLQl9OwotCXM4IGluZGV4X0hQOwotCi0JcGRtcHJpdi0+VFhQb3dlclRyYWNraW5nQ2FsbGJhY2tDbnQrKzsJLyogY29zYSBhZGQgZm9yIGRlYnVnICovCi0JcGRtcHJpdi0+YlRYUG93ZXJUcmFja2luZ0luaXQgPSB0cnVlOwotCi0JaWYgKHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCA9PSAxNCAmJiAhcGRtcHJpdi0+YkNDS2luQ0gxNCkKLQkJcGRtcHJpdi0+YkNDS2luQ0gxNCA9IHRydWU7Ci0JZWxzZSBpZiAocEhhbERhdGEtPkN1cnJlbnRDaGFubmVsICE9IDE0ICYmIHBkbXByaXYtPmJDQ0tpbkNIMTQpCi0JCXBkbXByaXYtPmJDQ0tpbkNIMTQgPSBmYWxzZTsKLQotCVRoZXJtYWxWYWx1ZSA9ICh1OClQSFlfUXVlcnlSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX1RfTUVURVIsCi0JCQkJCSAgMHgxZik7LyogIDB4MjQ6IFJGIFJlZ1s0OjBdCSAqLwotCi0JcnRsODcyM2FfcGh5X2FwX2NhbGlicmF0ZShBZGFwdGVyLCAoVGhlcm1hbFZhbHVlIC0KLQkJCQkgIHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpKTsKLQotCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKQotCQlyZiA9IDI7Ci0JZWxzZQotCQlyZiA9IDE7Ci0KLQlpZiAoVGhlcm1hbFZhbHVlKSB7Ci0JCS8qIFF1ZXJ5IE9GRE0gcGF0aCBBIGRlZmF1bHQgc2V0dGluZwkgKi8KLQkJZWxlX0QgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UpICYKLQkJCWJNYXNrT0ZETV9EOwotCQlmb3IgKGkgPSAwOyBpIDwgT0ZETV9UQUJMRV9TSVpFXzkyQzsgaSsrKSB7Ci0JCQkvKiBmaW5kIHRoZSBpbmRleCAqLwotCQkJaWYgKGVsZV9EID09IChPRkRNU3dpbmdUYWJsZTIzQVtpXSZiTWFza09GRE1fRCkpIHsKLQkJCQlPRkRNX2luZGV4X29sZFswXSA9ICh1OClpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLyogUXVlcnkgT0ZETSBwYXRoIEIgZGVmYXVsdCBzZXR0aW5nICAqLwotCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikgewotCQkJZWxlX0QgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsCi0JCQkJCQkgck9GRE0wX1hCVHhJUUltYmFsYW5jZSk7Ci0JCQllbGVfRCAmPSBiTWFza09GRE1fRDsKLQkJCWZvciAoaSA9IDA7IGkgPCBPRkRNX1RBQkxFX1NJWkVfOTJDOyBpKyspIHsJLyogZmluZCB0aGUgaW5kZXggICovCi0JCQkJaWYgKGVsZV9EID09IChPRkRNU3dpbmdUYWJsZTIzQVtpXSZiTWFza09GRE1fRCkpIHsKLQkJCQkJT0ZETV9pbmRleF9vbGRbMV0gPSAodTgpaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyogUXVlcnkgQ0NLIGRlZmF1bHQgc2V0dGluZyBGcm9tIDB4YTI0ICovCi0JCVRlbXBDQ2sgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJDQ0swX1R4RmlsdGVyMikgJiBiTWFza0NDSzsKLQkJZm9yIChpID0gMCA7IGkgPCBDQ0tfVEFCTEVfU0laRSA7IGkrKykgewotCQkJaWYgKHBkbXByaXYtPmJDQ0tpbkNIMTQpIHsKLQkJCQlpZiAoIW1lbWNtcCgmVGVtcENDaywKLQkJCQkJICAgICZDQ0tTd2luZ1RhYmxlX0NoMTQyM0FbaV1bMl0sIDQpKSB7Ci0JCQkJCUNDS19pbmRleF9vbGQgPSAodTgpaTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoIW1lbWNtcCgmVGVtcENDaywKLQkJCQkJICAgICZDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzMjNBW2ldWzJdLCA0KSkgewotCQkJCQlDQ0tfaW5kZXhfb2xkID0gKHU4KWk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICghcGRtcHJpdi0+VGhlcm1hbFZhbHVlKSB7Ci0JCQlwZG1wcml2LT5UaGVybWFsVmFsdWUgPSBwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyOwotCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0xDSyA9IFRoZXJtYWxWYWx1ZTsKLQkJCXBkbXByaXYtPlRoZXJtYWxWYWx1ZV9JUUsgPSBUaGVybWFsVmFsdWU7Ci0JCQlwZG1wcml2LT5UaGVybWFsVmFsdWVfRFBLID0gcEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlcjsKLQotCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspIHsKLQkJCQlwZG1wcml2LT5PRkRNX2luZGV4X0hQW2ldID0gT0ZETV9pbmRleF9vbGRbaV07Ci0JCQkJcGRtcHJpdi0+T0ZETV9pbmRleFtpXSA9IE9GRE1faW5kZXhfb2xkW2ldOwotCQkJfQotCQkJcGRtcHJpdi0+Q0NLX2luZGV4X0hQID0gQ0NLX2luZGV4X29sZDsKLQkJCXBkbXByaXYtPkNDS19pbmRleCA9IENDS19pbmRleF9vbGQ7Ci0JCX0KLQotCQlpZiAocEhhbERhdGEtPkJvYXJkVHlwZSA9PSBCT0FSRF9VU0JfSGlnaF9QQSkgewotCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQW3BkbXByaXYtPlRoZXJtYWxWYWx1ZV9IUF9pbmRleF0gPSBUaGVybWFsVmFsdWU7Ci0JCQlwZG1wcml2LT5UaGVybWFsVmFsdWVfSFBfaW5kZXgrKzsKLQkJCWlmIChwZG1wcml2LT5UaGVybWFsVmFsdWVfSFBfaW5kZXggPT0gSFBfVEhFUk1BTF9OVU0pCi0JCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQX2luZGV4ID0gMDsKLQotCQkJZm9yIChpID0gMDsgaSA8IEhQX1RIRVJNQUxfTlVNOyBpKyspIHsKLQkJCQlpZiAocGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQW2ldKSB7Ci0JCQkJCVRoZXJtYWxWYWx1ZV9IUCArPSBwZG1wcml2LT5UaGVybWFsVmFsdWVfSFBbaV07Ci0JCQkJCVRoZXJtYWxWYWx1ZV9IUF9jb3VudCsrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKFRoZXJtYWxWYWx1ZV9IUF9jb3VudCkKLQkJCQlUaGVybWFsVmFsdWUgPSAodTgpKFRoZXJtYWxWYWx1ZV9IUCAvIFRoZXJtYWxWYWx1ZV9IUF9jb3VudCk7Ci0JCX0KLQotCQlkZWx0YSA9IChUaGVybWFsVmFsdWUgPiBwZG1wcml2LT5UaGVybWFsVmFsdWUpID8KLQkJCShUaGVybWFsVmFsdWUgLSBwZG1wcml2LT5UaGVybWFsVmFsdWUpIDoKLQkJCShwZG1wcml2LT5UaGVybWFsVmFsdWUgLSBUaGVybWFsVmFsdWUpOwotCQlpZiAocEhhbERhdGEtPkJvYXJkVHlwZSA9PSBCT0FSRF9VU0JfSGlnaF9QQSkgewotCQkJaWYgKHBkbXByaXYtPmJEb25lVHhwb3dlcikKLQkJCQlkZWx0YV9IUCA9IChUaGVybWFsVmFsdWUgPiBwZG1wcml2LT5UaGVybWFsVmFsdWUpID8KLQkJCQkJICAgKFRoZXJtYWxWYWx1ZSAtIHBkbXByaXYtPlRoZXJtYWxWYWx1ZSkgOgotCQkJCQkgICAocGRtcHJpdi0+VGhlcm1hbFZhbHVlIC0gVGhlcm1hbFZhbHVlKTsKLQkJCWVsc2UKLQkJCQlkZWx0YV9IUCA9IFRoZXJtYWxWYWx1ZSA+IHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgPwotCQkJCQkgICAoVGhlcm1hbFZhbHVlIC0gcEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlcikgOgotCQkJCQkgICAocEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlciAtIFRoZXJtYWxWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlkZWx0YV9IUCA9IDA7Ci0JCX0KLQkJZGVsdGFfTENLID0gKFRoZXJtYWxWYWx1ZSA+IHBkbXByaXYtPlRoZXJtYWxWYWx1ZV9MQ0spID8KLQkJCSAgICAoVGhlcm1hbFZhbHVlIC0gcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0xDSykgOgotCQkJICAgIChwZG1wcml2LT5UaGVybWFsVmFsdWVfTENLIC0gVGhlcm1hbFZhbHVlKTsKLQkJZGVsdGFfSVFLID0gKFRoZXJtYWxWYWx1ZSA+IHBkbXByaXYtPlRoZXJtYWxWYWx1ZV9JUUspID8KLQkJCSAgICAoVGhlcm1hbFZhbHVlIC0gcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0lRSykgOgotCQkJICAgIChwZG1wcml2LT5UaGVybWFsVmFsdWVfSVFLIC0gVGhlcm1hbFZhbHVlKTsKLQotCQlpZiAoZGVsdGFfTENLID4gMSkgewotCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0xDSyA9IFRoZXJtYWxWYWx1ZTsKLQkJCXJ0bDg3MjNhX3BoeV9sY19jYWxpYnJhdGUoQWRhcHRlcik7Ci0JCX0KLQotCQlpZiAoKGRlbHRhID4gMCB8fCBkZWx0YV9IUCA+IDApICYmIHBkbXByaXYtPlR4UG93ZXJUcmFja0NvbnRyb2wpIHsKLQkJCWlmIChwSGFsRGF0YS0+Qm9hcmRUeXBlID09IEJPQVJEX1VTQl9IaWdoX1BBKSB7Ci0JCQkJcGRtcHJpdi0+YkRvbmVUeHBvd2VyID0gdHJ1ZTsKLQkJCQlkZWx0YV9IUCA9IFRoZXJtYWxWYWx1ZSA+IHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgPwotCQkJCQkgICAoVGhlcm1hbFZhbHVlIC0gcEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlcikgOgotCQkJCQkgICAocEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlciAtIFRoZXJtYWxWYWx1ZSk7Ci0KLQkJCQlpZiAoZGVsdGFfSFAgPiBpbmRleF9tYXBwaW5nX0hQX05VTS0xKQotCQkJCQlpbmRleF9IUCA9IGluZGV4X21hcHBpbmdfSFBbaW5kZXhfbWFwcGluZ19IUF9OVU0tMV07Ci0JCQkJZWxzZQotCQkJCQlpbmRleF9IUCA9IGluZGV4X21hcHBpbmdfSFBbZGVsdGFfSFBdOwotCi0JCQkJaWYgKFRoZXJtYWxWYWx1ZSA+IHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpIHsKLQkJCQkJLyogc2V0IGxhcmdlciBUeCBwb3dlciAqLwotCQkJCQlmb3IgKGkgPSAwOyBpIDwgcmY7IGkrKykKLQkJCQkJCU9GRE1faW5kZXhbaV0gPSBwZG1wcml2LT5PRkRNX2luZGV4X0hQW2ldIC0gaW5kZXhfSFA7Ci0JCQkJCUNDS19pbmRleCA9IHBkbXByaXYtPkNDS19pbmRleF9IUCAtIGluZGV4X0hQOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCByZjsgaSsrKQotCQkJCQkJT0ZETV9pbmRleFtpXSA9IHBkbXByaXYtPk9GRE1faW5kZXhfSFBbaV0gKyBpbmRleF9IUDsKLQkJCQkJQ0NLX2luZGV4ID0gcGRtcHJpdi0+Q0NLX2luZGV4X0hQICsgaW5kZXhfSFA7Ci0JCQkJfQotCi0JCQkJZGVsdGFfSFAgPSAoVGhlcm1hbFZhbHVlID4gcGRtcHJpdi0+VGhlcm1hbFZhbHVlKSA/Ci0JCQkJCSAgIChUaGVybWFsVmFsdWUgLSBwZG1wcml2LT5UaGVybWFsVmFsdWUpIDoKLQkJCQkJICAgKHBkbXByaXYtPlRoZXJtYWxWYWx1ZSAtIFRoZXJtYWxWYWx1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChUaGVybWFsVmFsdWUgPiBwZG1wcml2LT5UaGVybWFsVmFsdWUpIHsKLQkJCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspCi0JCQkJCQlwZG1wcml2LT5PRkRNX2luZGV4W2ldIC09IGRlbHRhOwotCQkJCQlwZG1wcml2LT5DQ0tfaW5kZXggLT0gZGVsdGE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspCi0JCQkJCQlwZG1wcml2LT5PRkRNX2luZGV4W2ldICs9IGRlbHRhOwotCQkJCQlwZG1wcml2LT5DQ0tfaW5kZXggKz0gZGVsdGE7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBubyBhZGp1c3QgKi8KLQkJCWlmIChwSGFsRGF0YS0+Qm9hcmRUeXBlICE9IEJPQVJEX1VTQl9IaWdoX1BBKSB7Ci0JCQkJaWYgKFRoZXJtYWxWYWx1ZSA+IHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpIHsKLQkJCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspCi0JCQkJCQlPRkRNX2luZGV4W2ldID0gcGRtcHJpdi0+T0ZETV9pbmRleFtpXSsxOwotCQkJCQlDQ0tfaW5kZXggPSBwZG1wcml2LT5DQ0tfaW5kZXgrMTsKLQkJCQl9IGVsc2UgewotCQkJCQlmb3IgKGkgPSAwOyBpIDwgcmY7IGkrKykKLQkJCQkJCU9GRE1faW5kZXhbaV0gPSBwZG1wcml2LT5PRkRNX2luZGV4W2ldOwotCQkJCQlDQ0tfaW5kZXggPSBwZG1wcml2LT5DQ0tfaW5kZXg7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChpID0gMDsgaSA8IHJmOyBpKyspIHsKLQkJCQlpZiAoT0ZETV9pbmRleFtpXSA+IChPRkRNX1RBQkxFX1NJWkVfOTJDLTEpKQotCQkJCQlPRkRNX2luZGV4W2ldID0gKE9GRE1fVEFCTEVfU0laRV85MkMtMSk7Ci0JCQkJZWxzZSBpZiAoT0ZETV9pbmRleFtpXSA8IE9GRE1fbWluX2luZGV4KQotCQkJCQlPRkRNX2luZGV4W2ldID0gT0ZETV9taW5faW5kZXg7Ci0JCQl9Ci0KLQkJCWlmIChDQ0tfaW5kZXggPiAoQ0NLX1RBQkxFX1NJWkUtMSkpCi0JCQkJQ0NLX2luZGV4ID0gQ0NLX1RBQkxFX1NJWkUtMTsKLQkJCWVsc2UgaWYgKENDS19pbmRleCA8IDApCi0JCQkJQ0NLX2luZGV4ID0gMDsKLQkJfQotCi0JCWlmIChwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sICYmCi0JCSAgICAoZGVsdGEgIT0gMCB8fCBkZWx0YV9IUCAhPSAwKSkgewotCQkJLyogQWR1anN0IE9GRE0gQW50X0EgYWNjb3JkaW5nIHRvIElRSyByZXN1bHQgKi8KLQkJCWVsZV9EID0gKE9GRE1Td2luZ1RhYmxlMjNBW09GRE1faW5kZXhbMF1dICYgMHhGRkMwMDAwMCk+PjIyOwotCQkJWCA9IHBkbXByaXYtPlJlZ0U5NDsKLQkJCVkgPSBwZG1wcml2LT5SZWdFOUM7Ci0KLQkJCWlmIChYICE9IDApIHsKLQkJCQlpZiAoKFggJiAweDAwMDAwMjAwKSAhPSAwKQotCQkJCQlYID0gWCB8IDB4RkZGRkZDMDA7Ci0JCQkJZWxlX0EgPSAoKFggKiBlbGVfRCk+PjgpJjB4MDAwMDAzRkY7Ci0KLQkJCQkvKiBuZXcgZWxlbWVudCBDID0gZWxlbWVudCBEIHggWSAqLwotCQkJCWlmICgoWSAmIDB4MDAwMDAyMDApICE9IDApCi0JCQkJCVkgPSBZIHwgMHhGRkZGRkMwMDsKLQkJCQllbGVfQyA9ICgoWSAqIGVsZV9EKT4+OCkmMHgwMDAwMDNGRjsKLQotCQkJCS8qIHdyaXRlIG5ldyBlbGVtZW50cyBBLCBDLCBEIHRvIHJlZ0M4MCBhbmQgcmVnQzk0LCBlbGVtZW50IEIgaXMgYWx3YXlzIDAgKi8KLQkJCQl2YWx1ZTMyID0gKGVsZV9EPDwyMil8KChlbGVfQyYweDNGKTw8MTYpfGVsZV9BOwotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsCi0JCQkJCQkgIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCi0JCQkJCQkgIHZhbHVlMzIpOwotCi0JCQkJdmFsdWUzMiA9IChlbGVfQyYweDAwMDAwM0MwKT4+NjsKLQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1hDVHhBRkUsIGJNYXNrSDRCaXRzLCB2YWx1ZTMyKTsKLQotCQkJCXZhbHVlMzIgPSAoKFggKiBlbGVfRCk+PjcpJjB4MDE7Ci0JCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLAotCQkJCQkgICAgIEJJVCgzMSksIHZhbHVlMzIpOwotCi0JCQkJdmFsdWUzMiA9ICgoWSAqIGVsZV9EKT4+NykmMHgwMTsKLQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsCi0JCQkJCSAgICAgQklUKDI5KSwgdmFsdWUzMik7Ci0JCQl9IGVsc2UgewotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsCi0JCQkJCQkgIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCi0JCQkJCQkgIE9GRE1Td2luZ1RhYmxlMjNBW09GRE1faW5kZXhbMF1dKTsKLQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1hDVHhBRkUsCi0JCQkJCSAgICAgYk1hc2tINEJpdHMsIDB4MDApOwotCQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwKLQkJCQkJICAgICBCSVQoMzEpIHwgQklUKDI5KSwgMHgwMCk7Ci0JCQl9Ci0KLQkJCS8qIEFkanVzdCBDQ0sgYWNjb3JkaW5nIHRvIElRSyByZXN1bHQgKi8KLQkJCWlmICghcGRtcHJpdi0+YkNDS2luQ0gxNCkgewotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjIsIENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX2luZGV4XVswXSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyMywgQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxMzIzQVtDQ0tfaW5kZXhdWzFdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI0LCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzMjNBW0NDS19pbmRleF1bMl0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjUsIENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX2luZGV4XVszXSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyNiwgQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxMzIzQVtDQ0tfaW5kZXhdWzRdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI3LCBDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzMjNBW0NDS19pbmRleF1bNV0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjgsIENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX2luZGV4XVs2XSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyOSwgQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxMzIzQVtDQ0tfaW5kZXhdWzddKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyMiwgQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW0NDS19pbmRleF1bMF0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjMsIENDS1N3aW5nVGFibGVfQ2gxNDIzQVtDQ0tfaW5kZXhdWzFdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI0LCBDQ0tTd2luZ1RhYmxlX0NoMTQyM0FbQ0NLX2luZGV4XVsyXSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyNSwgQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW0NDS19pbmRleF1bM10pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjYsIENDS1N3aW5nVGFibGVfQ2gxNDIzQVtDQ0tfaW5kZXhdWzRdKTsKLQkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI3LCBDQ0tTd2luZ1RhYmxlX0NoMTQyM0FbQ0NLX2luZGV4XVs1XSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGEyOCwgQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW0NDS19pbmRleF1bNl0pOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhhMjksIENDS1N3aW5nVGFibGVfQ2gxNDIzQVtDQ0tfaW5kZXhdWzddKTsKLQkJCX0KLQotCQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpIHsKLQkJCQllbGVfRCA9IChPRkRNU3dpbmdUYWJsZTIzQVsodTgpT0ZETV9pbmRleFsxXV0gJiAweEZGQzAwMDAwKT4+MjI7Ci0KLQkJCQkvKiBuZXcgZWxlbWVudCBBID0gZWxlbWVudCBEIHggWCAqLwotCQkJCVggPSBwZG1wcml2LT5SZWdFQjQ7Ci0JCQkJWSA9IHBkbXByaXYtPlJlZ0VCQzsKLQotCQkJCWlmIChYICE9IDApIHsKLQkJCQkJaWYgKChYICYgMHgwMDAwMDIwMCkgIT0gMCkJLyogY29uc2lkZXIgbWludXMgKi8KLQkJCQkJCVggPSBYIHwgMHhGRkZGRkMwMDsKLQkJCQkJZWxlX0EgPSAoKFggKiBlbGVfRCk+PjgpJjB4MDAwMDAzRkY7Ci0KLQkJCQkJLyogbmV3IGVsZW1lbnQgQyA9IGVsZW1lbnQgRCB4IFkgKi8KLQkJCQkJaWYgKChZICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCQkJCVkgPSBZIHwgMHhGRkZGRkMwMDsKLQkJCQkJZWxlX0MgPSAoKFkgKiBlbGVfRCk+PjgpJjB4MDAwMDNGRjsKLQotCQkJCQkvKiB3cml0ZSBuZXcgZWxlbWVudHMgQSwgQywgRCB0byByZWdDODggYW5kIHJlZ0M5QywgZWxlbWVudCBCIGlzIGFsd2F5cyAwICovCi0JCQkJCXZhbHVlMzIgPSAoZWxlX0Q8PDIyKXwoKGVsZV9DJjB4M0YpPDwxNikgfCBlbGVfQTsKLQkJCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwgdmFsdWUzMik7Ci0KLQkJCQkJdmFsdWUzMiA9IChlbGVfQyYweDAwMDAwM0MwKT4+NjsKLQkJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9YRFR4QUZFLCBiTWFza0g0Qml0cywgdmFsdWUzMik7Ci0KLQkJCQkJdmFsdWUzMiA9ICgoWCAqIGVsZV9EKT4+NykmMHgwMTsKLQkJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsCi0JCQkJCQkgICAgIHJPRkRNMF9FQ0NBVGhyZXNob2xkLAotCQkJCQkJICAgICBCSVQoMjcpLCB2YWx1ZTMyKTsKLQotCQkJCQl2YWx1ZTMyID0gKChZICogZWxlX0QpPj43KSYweDAxOwotCQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwKLQkJCQkJCSAgICAgck9GRE0wX0VDQ0FUaHJlc2hvbGQsCi0JCQkJCQkgICAgIEJJVCgyNSksIHZhbHVlMzIpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsCi0JCQkJCQkJICByT0ZETTBfWEJUeElRSW1iYWxhbmNlLAotCQkJCQkJCSAgT0ZETVN3aW5nVGFibGUyM0FbT0ZETV9pbmRleFsxXV0pOwotCQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwKLQkJCQkJCSAgICAgck9GRE0wX1hEVHhBRkUsCi0JCQkJCQkgICAgIGJNYXNrSDRCaXRzLCAweDAwKTsKLQkJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsCi0JCQkJCQkgICAgIHJPRkRNMF9FQ0NBVGhyZXNob2xkLAotCQkJCQkJICAgICBCSVQoMjcpIHwgQklUKDI1KSwgMHgwMCk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJaWYgKGRlbHRhX0lRSyA+IDMpIHsKLQkJCXBkbXByaXYtPlRoZXJtYWxWYWx1ZV9JUUsgPSBUaGVybWFsVmFsdWU7Ci0JCQlydGw4NzIzYV9waHlfaXFfY2FsaWJyYXRlKEFkYXB0ZXIsIGZhbHNlKTsKLQkJfQotCi0JCS8qIHVwZGF0ZSB0aGVybWFsIG1ldGVyIHZhbHVlICovCi0JCWlmIChwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sKQotCQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlID0gVGhlcm1hbFZhbHVlOwotCX0KLQlwZG1wcml2LT5UWFBvd2VyY291bnQgPSAwOwotfQotCi0vKglEZXNjcmlwdGlvbjogKi8KLS8qCQktIERpc3BhdGNoIFR4UG93ZXIgVHJhY2tpbmcgZGlyZWN0IGNhbGwgT05MWSBmb3IgOTJzLiAqLwotLyoJCS0gV2Ugc2hhbGwgTk9UIHNjaGVkdWxlIFdvcmtpdGVtIHdpdGhpbiBQQVNTSVZFIExFVkVMLCB3aGljaCB3aWxsIGNhdXNlIHN5c3RlbSByZXNvdXJjZSAqLwotLyoJCSAgIGxlYWthZ2UgdW5kZXIgc29tZSBwbGF0Zm9ybS4gKi8KLS8qCUFzc3VtcHRpb246ICovCi0vKgkJUEFTU0lWRV9MRVZFTCB3aGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQuICovCi1zdGF0aWMgdm9pZCBPRE1fVFhQb3dlclRyYWNraW5nOTJDRGlyZWN0Q2FsbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jb2RtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RoZXJtYWxNZXRlcl85MkMoQWRhcHRlcik7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffb2RtX2NoZWNrX3R4X3Bvd2VyX3RyYWNraW5nKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0KLQlpZiAoIXBkbXByaXYtPlRNX1RyaWdnZXIpIHsJCS8qIGF0IGxlYXN0IGRlbGF5IDEgc2VjICovCi0JCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX1RfTUVURVIsIGJSRlJlZ09mZnNldE1hc2ssIDB4NjApOwotCi0JCXBkbXByaXYtPlRNX1RyaWdnZXIgPSAxOwotCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJT0RNX1RYUG93ZXJUcmFja2luZzkyQ0RpcmVjdENhbGwoQWRhcHRlcik7Ci0JCXBkbXByaXYtPlRNX1RyaWdnZXIgPSAwOwotCX0KLX0KLQotLyoJSVFLICovCi0jZGVmaW5lIE1BWF9UT0xFUkFOQ0UJCTUKLSNkZWZpbmUgSVFLX0RFTEFZX1RJTUUJCTEJLyogbXMgKi8KLQotc3RhdGljIHU4IF9QSFlfUGF0aEFfSVFLKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGJvb2wgY29uZmlnUGF0aEIpCi17Ci0JdTMyIHJlZ0VBQywgcmVnRTk0LCByZWdFOUMsIHJlZ0VBNDsKLQl1OCByZXN1bHQgPSAweDAwOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCi0JLyogcGF0aC1BIElRSyBzZXR0aW5nICovCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJUeF9JUUtfVG9uZV9BLCAweDEwMDA4YzFmKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRS19Ub25lX0EsIDB4MTAwMDhjMWYpOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1BJX0EsIDB4ODIxNDAxMDIpOwotCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJSeF9JUUtfUElfQSwgY29uZmlnUGF0aEIgPyAweDI4MTYwMjAyIDoKLQkJSVNfODF4eENfVkVORE9SX1VNQ19CX0NVVChwSGFsRGF0YS0+VmVyc2lvbklEKT8weDI4MTYwMjAyOjB4MjgxNjA1MDIpOwotCi0JLyogcGF0aC1CIElRSyBzZXR0aW5nICovCi0JaWYgKGNvbmZpZ1BhdGhCKSB7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1RvbmVfQiwgMHgxMDAwOGMyMik7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByUnhfSVFLX1RvbmVfQiwgMHgxMDAwOGMyMik7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1BJX0IsIDB4ODIxNDAxMDIpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRS19QSV9CLCAweDI4MTYwMjAyKTsKLQl9Ci0KLQkvKiBMTyBjYWxpYnJhdGlvbiBzZXR0aW5nICovCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJJUUtfQUdDX1JzcCwgMHgwMDEwMjhkMSk7Ci0KLQkvKiBPbmUgc2hvdCwgcGF0aCBBIExPSyAmIElRSyAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBySVFLX0FHQ19QdHMsIDB4ZjkwMDAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBySVFLX0FHQ19QdHMsIDB4ZjgwMDAwMDApOwotCi0JLyogIGRlbGF5IHggbXMgKi8KLQkvKiBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKElRS19ERUxBWV9USU1FKjEwMDApOyAqLwotCXVkZWxheShJUUtfREVMQVlfVElNRSoxMDAwKTsKLQotCS8qICBDaGVjayBmYWlsZWQgKi8KLQlyZWdFQUMgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByUnhfUG93ZXJfQWZ0ZXJfSVFLX0FfMik7Ci0JcmVnRTk0ID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQSk7Ci0JcmVnRTlDID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19BKTsKLQlyZWdFQTQgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByUnhfUG93ZXJfQmVmb3JlX0lRS19BXzIpOwotCi0JaWYgKCEocmVnRUFDICYgQklUKDI4KSkgJiYKLQkgICAgKCgocmVnRTk0ICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDE0MikgJiYKLQkgICAgKCgocmVnRTlDICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDQyKSkKLQkJcmVzdWx0IHw9IDB4MDE7Ci0JZWxzZQkJCS8qIGlmIFR4IG5vdCBPSywgaWdub3JlIFJ4ICovCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlpZiAoIShyZWdFQUMgJiBCSVQoMjcpKSAmJiAvKiBpZiBUeCBpcyBPSywgY2hlY2sgd2hldGhlciBSeCBpcyBPSyAqLwotCSAgICAoKChyZWdFQTQgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4MTMyKSAmJgotCSAgICAoKChyZWdFQUMgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4MzYpKQotCQlyZXN1bHQgfD0gMHgwMjsKLQllbHNlCi0JCURCR184NzIzQSgiUGF0aCBBIFJ4IElRSyBmYWlsISFcbiIpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB1OCBfUEhZX1BhdGhCX0lRSyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyKQotewotCXUzMiByZWdFQUMsIHJlZ0VCNCwgcmVnRUJDLCByZWdFQzQsIHJlZ0VDQzsKLQl1OCByZXN1bHQgPSAweDAwOwotCi0JLyogT25lIHNob3QsIHBhdGggQiBMT0sgJiBJUUsgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgcklRS19BR0NfQ29udCwgMHgwMDAwMDAwMik7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJJUUtfQUdDX0NvbnQsIDB4MDAwMDAwMDApOwotCi0JLyogIGRlbGF5IHggbXMgKi8KLQl1ZGVsYXkoSVFLX0RFTEFZX1RJTUUqMTAwMCk7Ci0KLQkvKiAgQ2hlY2sgZmFpbGVkICovCi0JcmVnRUFDID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19BXzIpOwotCXJlZ0VCNCA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0IpOwotCXJlZ0VCQyA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQik7Ci0JcmVnRUM0ID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQl8yKTsKLQlyZWdFQ0MgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByUnhfUG93ZXJfQWZ0ZXJfSVFLX0JfMik7Ci0KLQlpZiAoIShyZWdFQUMgJiBCSVQoMzEpKSAmJgotCSAgICAoKChyZWdFQjQgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4MTQyKSAmJgotCSAgICAoKChyZWdFQkMgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4NDIpKQotCQlyZXN1bHQgfD0gMHgwMTsKLQllbHNlCi0JCXJldHVybiByZXN1bHQ7Ci0KLQlpZiAoIShyZWdFQUMgJiBCSVQoMzApKSAmJgotCSAgICAoKChyZWdFQzQgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4MTMyKSAmJgotCSAgICAoKChyZWdFQ0MgJiAweDAzRkYwMDAwKT4+MTYpICE9IDB4MzYpKQotCQlyZXN1bHQgfD0gMHgwMjsKLQllbHNlCi0JCURCR184NzIzQSgiUGF0aCBCIFJ4IElRSyBmYWlsISFcbiIpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfUGF0aEFGaWxsSVFLTWF0cml4KHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsCi0JYm9vbCBiSVFLT0ssCi0JaW50IHJlc3VsdFtdWzhdLAotCXU4IGZpbmFsX2NhbmRpZGF0ZSwKLQlib29sIGJUeE9ubHkKLQkpCi17Ci0JdTMyIE9sZHZhbF8wLCBYLCBUWDBfQSwgcmVnOwotCXMzMiBZLCBUWDBfQzsKLQotCURCR184NzIzQSgiUGF0aCBBIElRIENhbGlicmF0aW9uICVzICFcbiIsIChiSVFLT0spPyJTdWNjZXNzIjoiRmFpbGVkIik7Ci0KLQlpZiAoZmluYWxfY2FuZGlkYXRlID09IDB4RkYpIHsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoYklRS09LKSB7Ci0JCU9sZHZhbF8wID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSk7Ci0JCU9sZHZhbF8wID0gKE9sZHZhbF8wID4+IDIyKSAmIDB4M0ZGOwotCi0JCVggPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVswXTsKLQkJaWYgKChYICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCVggPSBYIHwgMHhGRkZGRkMwMDsKLQkJVFgwX0EgPSAoWCAqIE9sZHZhbF8wKSA+PiA4OwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIDB4M0ZGLCBUWDBfQSk7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIEJJVCgzMSksCi0JCQkgICAgICgoWCAqIE9sZHZhbF8wPj43KSAmIDB4MSkpOwotCi0JCVkgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVsxXTsKLQkJaWYgKChZICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCVkgPSBZIHwgMHhGRkZGRkMwMDsKLQkJVFgwX0MgPSAoWSAqIE9sZHZhbF8wKSA+PiA4OwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQ1R4QUZFLCAweEYwMDAwMDAwLAotCQkJICAgICAoKFRYMF9DJjB4M0MwKT4+NikpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIDB4MDAzRjAwMDAsCi0JCQkgICAgIChUWDBfQyYweDNGKSk7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIEJJVCgyOSksCi0JCQkgICAgICgoWSAqIE9sZHZhbF8wPj43KSAmIDB4MSkpOwotCi0JCWlmIChiVHhPbmx5KSB7Ci0JCQlEQkdfODcyM0EoIl9QSFlfUGF0aEFGaWxsSVFLTWF0cml4IG9ubHkgVHggT0tcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVnID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bMl07Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hBUnhJUUltYmFsYW5jZSwgMHgzRkYsIHJlZyk7Ci0KLQkJcmVnID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bM10gJiAweDNGOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQVJ4SVFJbWJhbGFuY2UsIDB4RkMwMCwgcmVnKTsKLQotCQlyZWcgPSAocmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bM10gPj4gNikgJiAweEY7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1J4SVFFeHRBbnRhLCAweEYwMDAwMDAwLCByZWcpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX1BIWV9QYXRoQkZpbGxJUUtNYXRyaXgoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgYm9vbCBiSVFLT0ssIGludCByZXN1bHRbXVs4XSwgdTggZmluYWxfY2FuZGlkYXRlLCBib29sIGJUeE9ubHkpCi17Ci0JdTMyIE9sZHZhbF8xLCBYLCBUWDFfQSwgcmVnOwotCXMzMiBZLCBUWDFfQzsKLQotCURCR184NzIzQSgiUGF0aCBCIElRIENhbGlicmF0aW9uICVzICFcbiIsIChiSVFLT0spPyJTdWNjZXNzIjoiRmFpbGVkIik7Ci0KLQlpZiAoZmluYWxfY2FuZGlkYXRlID09IDB4RkYpIHsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoYklRS09LKSB7Ci0JCU9sZHZhbF8xID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSk7Ci0JCU9sZHZhbF8xID0gKE9sZHZhbF8xID4+IDIyKSAmIDB4M0ZGOwotCi0JCVggPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs0XTsKLQkJaWYgKChYICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCVggPSBYIHwgMHhGRkZGRkMwMDsKLQkJVFgxX0EgPSAoWCAqIE9sZHZhbF8xKSA+PiA4OwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UsIDB4M0ZGLCBUWDFfQSk7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIEJJVCgyNyksCi0JCQkgICAgICgoWCAqIE9sZHZhbF8xID4+IDcpICYgMHgxKSk7Ci0KLQkJWSA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzVdOwotCQlpZiAoKFkgJiAweDAwMDAwMjAwKSAhPSAwKQotCQkJWSA9IFkgfCAweEZGRkZGQzAwOwotCQlUWDFfQyA9IChZICogT2xkdmFsXzEpID4+IDg7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hEVHhBRkUsIDB4RjAwMDAwMDAsCi0JCQkgICAgICgoVFgxX0MgJiAweDNDMCkgPj4gNikpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UsIDB4MDAzRjAwMDAsCi0JCQkgICAgIChUWDFfQyAmIDB4M0YpKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgQklUKDI1KSwKLQkJCSAgICAgKChZICogT2xkdmFsXzEgPj4gNykgJiAweDEpKTsKLQotCQlpZiAoYlR4T25seSkKLQkJCXJldHVybjsKLQotCQlyZWcgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs2XTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEJSeElRSW1iYWxhbmNlLCAweDNGRiwgcmVnKTsKLQotCQlyZWcgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs3XSAmIDB4M0Y7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hCUnhJUUltYmFsYW5jZSwgMHhGQzAwLCByZWcpOwotCi0JCXJlZyA9IChyZXN1bHRbZmluYWxfY2FuZGlkYXRlXVs3XSA+PiA2KSAmIDB4RjsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfQUdDUlNTSVRhYmxlLCAweDAwMDBGMDAwLCByZWcpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX1BIWV9TYXZlQUREQVJlZ2lzdGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgKkFEREFSZWcsIHUzMiAqQUREQUJhY2t1cCwgdTMyIFJlZ2lzdGVyTnVtKQotewotCXUzMiBpOwotCi0JZm9yIChpID0gMCA7IGkgPCBSZWdpc3Rlck51bSA7IGkrKykgewotCQlBRERBQmFja3VwW2ldID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgQUREQVJlZ1tpXSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfUEhZX1NhdmVNQUNSZWdpc3RlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTMyICpNQUNSZWcsCi0JCQkJICB1MzIgKk1BQ0JhY2t1cCkKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDAgOyBpIDwgKElRS19NQUNfUkVHX05VTSAtIDEpOyBpKyspIHsKLQkJTUFDQmFja3VwW2ldID0gcnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLCBNQUNSZWdbaV0pOwotCX0KLQlNQUNCYWNrdXBbaV0gPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCBNQUNSZWdbaV0pOwotfQotCi1zdGF0aWMgdm9pZCBfUEhZX1JlbG9hZEFEREFSZWdpc3RlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwKLQkJCQkgICAgIHUzMiAqQUREQVJlZywgdTMyICpBRERBQmFja3VwLAotCQkJCSAgICAgdTMyIFJlZ2llc3Rlck51bSkKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDAgOyBpIDwgUmVnaWVzdGVyTnVtIDsgaSsrKSB7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBBRERBUmVnW2ldLCBBRERBQmFja3VwW2ldKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfUmVsb2FkTUFDUmVnaXN0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsCi0JCQkJICAgIHUzMiAqTUFDUmVnLCB1MzIgKk1BQ0JhY2t1cCkKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDAgOyBpIDwgKElRS19NQUNfUkVHX05VTSAtIDEpOyBpKyspCi0JCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIE1BQ1JlZ1tpXSwgKHU4KU1BQ0JhY2t1cFtpXSk7Ci0KLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgTUFDUmVnW2ldLCBNQUNCYWNrdXBbaV0pOwotfQotCi1zdGF0aWMgdm9pZCBfUEhZX1BhdGhBRERBT24oc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTMyICpBRERBUmVnLAotCQkJICAgIGJvb2wgaXNQYXRoQU9uLCBib29sIGlzMlQpCi17Ci0JdTMyIHBhdGhPbjsKLQl1MzIgaTsKLQotCXBhdGhPbiA9IGlzUGF0aEFPbiA/IDB4MDRkYjI1YTQgOiAweDBiMWIyNWE0OwotCWlmICghaXMyVCkgewotCQlwYXRoT24gPSAweDBiZGIyNWEwOwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgQUREQVJlZ1swXSwgMHgwYjFiMjVhMCk7Ci0JfSBlbHNlIHsKLQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIEFEREFSZWdbMF0sIHBhdGhPbik7Ci0JfQotCi0JZm9yIChpID0gMSA7IGkgPCBJUUtfQUREQV9SRUdfTlVNIDsgaSsrKQotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgQUREQVJlZ1tpXSwgcGF0aE9uKTsKLX0KLQotc3RhdGljIHZvaWQgX1BIWV9NQUNTZXR0aW5nQ2FsaWJyYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwKLQkJCQkgICAgICAgdTMyICpNQUNSZWcsIHUzMiAqTUFDQmFja3VwKQotewotCXUzMiBpID0gMDsKLQotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIE1BQ1JlZ1tpXSwgMHgzRik7Ci0KLQlmb3IgKGkgPSAxIDsgaSA8IChJUUtfTUFDX1JFR19OVU0gLSAxKTsgaSsrKSB7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIE1BQ1JlZ1tpXSwKLQkJCQkgKHU4KShNQUNCYWNrdXBbaV0gJiB+QklUKDMpKSk7Ci0JfQotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIE1BQ1JlZ1tpXSwgKHU4KShNQUNCYWNrdXBbaV0gJiB+QklUKDUpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfUGF0aEFTdGFuZEJ5KHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIpCi17Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4MCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIDB4ODQwLCAweDAwMDEwMDAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckZQR0EwX0lRSywgMHg4MDgwMDAwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfUElNb2RlU3dpdGNoKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGJvb2wgUElNb2RlKQotewotCXUzMiBtb2RlOwotCi0JbW9kZSA9IFBJTW9kZSA/IDB4MDEwMDAxMDAgOiAweDAxMDAwMDAwOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCAweDgyMCwgbW9kZSk7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIDB4ODI4LCBtb2RlKTsKLX0KLQotLyoKLXJldHVybiBmYWxzZSA9PiBkbyBJUUsgYWdhaW4KLSovCi1zdGF0aWMgYm9vbCBfUEhZX1NpbXVsYXJpdHlDb21wYXJlKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGludCByZXN1bHRbXVs4XSwgdTggYzEsIHU4IGMyKQotewotCXUzMiBpLCBqLCBkaWZmLCBTaW11bGFyaXR5Qml0TWFwLCBib3VuZCA9IDA7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7Ci0JdTggZmluYWxfY2FuZGlkYXRlWzJdID0gezB4RkYsIDB4RkZ9OwkvKiBmb3IgcGF0aCBBIGFuZCBwYXRoIEIgKi8KLQlib29sIGJSZXN1bHQgPSB0cnVlOwotCi0JaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpCi0JCWJvdW5kID0gODsKLQllbHNlCi0JCWJvdW5kID0gNDsKLQotCVNpbXVsYXJpdHlCaXRNYXAgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGJvdW5kOyBpKyspIHsKLQkJZGlmZiA9IChyZXN1bHRbYzFdW2ldID4gcmVzdWx0W2MyXVtpXSkgPyAocmVzdWx0W2MxXVtpXSAtIHJlc3VsdFtjMl1baV0pIDogKHJlc3VsdFtjMl1baV0gLSByZXN1bHRbYzFdW2ldKTsKLQkJaWYgKGRpZmYgPiBNQVhfVE9MRVJBTkNFKSB7Ci0JCQlpZiAoKGkgPT0gMiB8fCBpID09IDYpICYmICFTaW11bGFyaXR5Qml0TWFwKSB7Ci0JCQkJaWYgKHJlc3VsdFtjMV1baV0rcmVzdWx0W2MxXVtpKzFdID09IDApCi0JCQkJCWZpbmFsX2NhbmRpZGF0ZVsoaS80KV0gPSBjMjsKLQkJCQllbHNlIGlmIChyZXN1bHRbYzJdW2ldK3Jlc3VsdFtjMl1baSsxXSA9PSAwKQotCQkJCQlmaW5hbF9jYW5kaWRhdGVbKGkvNCldID0gYzE7Ci0JCQkJZWxzZQotCQkJCQlTaW11bGFyaXR5Qml0TWFwID0gU2ltdWxhcml0eUJpdE1hcHwoMTw8aSk7Ci0JCQl9IGVsc2UgewotCQkJCVNpbXVsYXJpdHlCaXRNYXAgPSBTaW11bGFyaXR5Qml0TWFwfCgxPDxpKTsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChTaW11bGFyaXR5Qml0TWFwID09IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IChib3VuZC80KTsgaSsrKSB7Ci0JCQlpZiAoZmluYWxfY2FuZGlkYXRlW2ldICE9IDB4RkYpIHsKLQkJCQlmb3IgKGogPSBpKjQ7IGogPCAoaSsxKSo0LTI7IGorKykKLQkJCQkJcmVzdWx0WzNdW2pdID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZVtpXV1bal07Ci0JCQkJYlJlc3VsdCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBiUmVzdWx0OwotCX0gZWxzZSBpZiAoIShTaW11bGFyaXR5Qml0TWFwICYgMHgwRikpIHsKLQkJLyogcGF0aCBBIE9LICovCi0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCQlyZXN1bHRbM11baV0gPSByZXN1bHRbYzFdW2ldOwotCQlyZXR1cm4gZmFsc2U7Ci0JfSBlbHNlIGlmICghKFNpbXVsYXJpdHlCaXRNYXAgJiAweEYwKSAmJiBwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKSB7Ci0JCS8qIHBhdGggQiBPSyAqLwotCQlmb3IgKGkgPSA0OyBpIDwgODsgaSsrKQotCQkJcmVzdWx0WzNdW2ldID0gcmVzdWx0W2MxXVtpXTsKLQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9QSFlfSVFDYWxpYnJhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgaW50IHJlc3VsdFtdWzhdLCB1OCB0LCBib29sIGlzMlQpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYgKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQl1MzIgaTsKLQl1OCBQYXRoQU9LLCBQYXRoQk9LOwotCXUzMiBBRERBX1JFR1tJUUtfQUREQV9SRUdfTlVNXSA9IHsKLQkJckZQR0EwX1hDRF9Td2l0Y2hDb250cm9sLCByQmx1ZV9Ub290aCwKLQkJclJ4X1dhaXRfQ0NBLCByVHhfQ0NLX1JGT04sCi0JCXJUeF9DQ0tfQkJPTiwgclR4X09GRE1fUkZPTiwKLQkJclR4X09GRE1fQkJPTiwgclR4X1RvX1J4LAotCQlyVHhfVG9fVHgsIHJSeF9DQ0ssCi0JCXJSeF9PRkRNLCByUnhfV2FpdF9SSUZTLAotCQlyUnhfVE9fUngsIHJTdGFuZGJ5LAotCQlyU2xlZXAsIHJQTVBEX0FOQUVOCi0JfTsKLQotCXUzMiBJUUtfTUFDX1JFR1tJUUtfTUFDX1JFR19OVU1dID0gewotCQlSRUdfVFhQQVVTRSwgUkVHX0JDTl9DVFJMLAotCQlSRUdfQkNOX0NUUkxfMSwgUkVHX0dQSU9fTVVYQ0ZHCi0JfTsKLQotCXUzMiBJUUtfQkJfUkVHXzkyQ1tJUUtfQkJfUkVHX05VTV0gPSB7Ci0JCXJPRkRNMF9UUnhQYXRoRW5hYmxlLCByT0ZETTBfVFJNdXhQYXIsCi0JCXJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVywgckNvbmZpZ19BbnRBLCByQ29uZmlnX0FudEIsCi0JCXJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVywgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsCi0JCXJGUEdBMF9YQl9SRkludGVyZmFjZU9FLCByRlBHQTBfUkZNT0QKLQl9OwotCi0JY29uc3QgdTMyIHJldHJ5Q291bnQgPSAyOwotCi0JLyogIE5vdGU6IElRIGNhbGlicmF0aW9uIG11c3QgYmUgcGVyZm9ybWVkIGFmdGVyIGxvYWRpbmcgICovCi0JLyoJCVBIWV9SRUcudHh0ICwgYW5kIHJhZGlvX2EsIHJhZGlvX2IudHh0CSAqLwotCi0JdTMyIGJidmFsdWU7Ci0KLQlpZiAodCA9PSAwKSB7Ci0JCWJidmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByRlBHQTBfUkZNT0QpOwotCi0JCS8qICBTYXZlIEFEREEgcGFyYW1ldGVycywgdHVybiBQYXRoIEEgQUREQSBvbiAqLwotCQlfUEhZX1NhdmVBRERBUmVnaXN0ZXJzKHBBZGFwdGVyLCBBRERBX1JFRywgcGRtcHJpdi0+QUREQV9iYWNrdXAsIElRS19BRERBX1JFR19OVU0pOwotCQlfUEhZX1NhdmVNQUNSZWdpc3RlcnMocEFkYXB0ZXIsIElRS19NQUNfUkVHLCBwZG1wcml2LT5JUUtfTUFDX2JhY2t1cCk7Ci0JCV9QSFlfU2F2ZUFEREFSZWdpc3RlcnMocEFkYXB0ZXIsIElRS19CQl9SRUdfOTJDLCBwZG1wcml2LT5JUUtfQkJfYmFja3VwLCBJUUtfQkJfUkVHX05VTSk7Ci0JfQotCV9QSFlfUGF0aEFEREFPbihwQWRhcHRlciwgQUREQV9SRUcsIHRydWUsIGlzMlQpOwotCi0JaWYgKHQgPT0gMCkKLQkJcGRtcHJpdi0+YlJmUGlFbmFibGUgPSAodTgpCi0JCQlQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIxLAotCQkJCSAgICAgICBCSVQoOCkpOwotCi0JaWYgKCFwZG1wcml2LT5iUmZQaUVuYWJsZSkgewotCQkvKiAgU3dpdGNoIEJCIHRvIFBJIG1vZGUgdG8gZG8gSVEgQ2FsaWJyYXRpb24uICovCi0JCV9QSFlfUElNb2RlU3dpdGNoKHBBZGFwdGVyLCB0cnVlKTsKLQl9Ci0KLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgQklUKDI0KSwgMHgwMCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweDAzYTA1NjAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgck9GRE0wX1RSTXV4UGFyLCAweDAwMDgwMGU0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXLCAweDIyMjA0MDAwKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVywgQklUKDEwKSwgMHgwMSk7Ci0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1csIEJJVCgyNiksIDB4MDEpOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIEJJVCgxMCksIDB4MDApOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hCX1JGSW50ZXJmYWNlT0UsIEJJVCgxMCksIDB4MDApOwotCi0JaWYgKGlzMlQpIHsKLQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsCi0JCQkJICByRlBHQTBfWEFfTFNTSVBhcmFtZXRlciwgMHgwMDAxMDAwMCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLAotCQkJCSAgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIsIDB4MDAwMTAwMDApOwotCX0KLQotCS8qIE1BQyBzZXR0aW5ncyAqLwotCV9QSFlfTUFDU2V0dGluZ0NhbGlicmF0aW9uKHBBZGFwdGVyLCBJUUtfTUFDX1JFRywgcGRtcHJpdi0+SVFLX01BQ19iYWNrdXApOwotCi0JLyogUGFnZSBCIGluaXQgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckNvbmZpZ19BbnRBLCAweDAwMDgwMDAwKTsKLQotCWlmIChpczJUKQotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckNvbmZpZ19BbnRCLCAweDAwMDgwMDAwKTsKLQotCS8qICBJUSBjYWxpYnJhdGlvbiBzZXR0aW5nICovCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4ODA4MDAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLLCAweDAxMDA3YzAwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRSywgMHgwMTAwNDgwMCk7Ci0KLQlmb3IgKGkgPSAwIDsgaSA8IHJldHJ5Q291bnQgOyBpKyspIHsKLQkJUGF0aEFPSyA9IF9QSFlfUGF0aEFfSVFLKHBBZGFwdGVyLCBpczJUKTsKLQkJaWYgKFBhdGhBT0sgPT0gMHgwMykgewotCQkJCURCR184NzIzQSgiUGF0aCBBIElRSyBTdWNjZXNzISFcbiIpOwotCQkJCXJlc3VsdFt0XVswXSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19BKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bMV0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19BKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bMl0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQV8yKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bM10gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19BXzIpJjB4M0ZGMDAwMCk+PjE2OwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAoaSA9PSAocmV0cnlDb3VudC0xKSAmJiBQYXRoQU9LID09IDB4MDEpIHsKLQkJCS8qIFR4IElRSyBPSyAqLwotCQkJREJHXzg3MjNBKCJQYXRoIEEgSVFLIE9ubHkgIFR4IFN1Y2Nlc3MhIVxuIik7Ci0KLQkJCXJlc3VsdFt0XVswXSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19BKSYweDNGRjAwMDApPj4xNjsKLQkJCXJlc3VsdFt0XVsxXSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQWZ0ZXJfSVFLX0EpJjB4M0ZGMDAwMCk+PjE2OwotCQl9Ci0JfQotCi0JaWYgKDB4MDAgPT0gUGF0aEFPSykgewotCQlEQkdfODcyM0EoIlBhdGggQSBJUUsgZmFpbGVkISFcbiIpOwotCX0KLQotCWlmIChpczJUKSB7Ci0JCV9QSFlfUGF0aEFTdGFuZEJ5KHBBZGFwdGVyKTsKLQotCQkvKiAgVHVybiBQYXRoIEIgQUREQSBvbiAqLwotCQlfUEhZX1BhdGhBRERBT24ocEFkYXB0ZXIsIEFEREFfUkVHLCBmYWxzZSwgaXMyVCk7Ci0KLQkJZm9yIChpID0gMCA7IGkgPCByZXRyeUNvdW50IDsgaSsrKSB7Ci0JCQlQYXRoQk9LID0gX1BIWV9QYXRoQl9JUUsocEFkYXB0ZXIpOwotCQkJaWYgKFBhdGhCT0sgPT0gMHgwMykgewotCQkJCURCR184NzIzQSgiUGF0aCBCIElRSyBTdWNjZXNzISFcbiIpOwotCQkJCXJlc3VsdFt0XVs0XSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19CKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bNV0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19CKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bNl0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQl8yKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bN10gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19CXzIpJjB4M0ZGMDAwMCk+PjE2OwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChpID09IChyZXRyeUNvdW50IC0gMSkgJiYgUGF0aEJPSyA9PSAweDAxKSB7Ci0JCQkJLyogVHggSVFLIE9LICovCi0JCQkJREJHXzg3MjNBKCJQYXRoIEIgT25seSBUeCBJUUsgU3VjY2VzcyEhXG4iKTsKLQkJCQlyZXN1bHRbdF1bNF0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQikmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzVdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQikmMHgzRkYwMDAwKT4+MTY7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoMHgwMCA9PSBQYXRoQk9LKSB7Ci0JCQlEQkdfODcyM0EoIlBhdGggQiBJUUsgZmFpbGVkISFcbiIpOwotCQl9Ci0JfQotCi0JLyogQmFjayB0byBCQiBtb2RlLCBsb2FkIG9yaWdpbmFsIHZhbHVlICovCi0JcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9JUUssIDApOwotCi0JaWYgKHQgIT0gMCkgewotCQlpZiAoIXBkbXByaXYtPmJSZlBpRW5hYmxlKSB7Ci0JCQkvKiAgU3dpdGNoIGJhY2sgQkIgdG8gU0kgbW9kZSBhZnRlciBmaW5pc2ggSVEgQ2FsaWJyYXRpb24uICovCi0JCQlfUEhZX1BJTW9kZVN3aXRjaChwQWRhcHRlciwgZmFsc2UpOwotCQl9Ci0KLQkJLyogIFJlbG9hZCBBRERBIHBvd2VyIHNhdmluZyBwYXJhbWV0ZXJzICovCi0JCV9QSFlfUmVsb2FkQUREQVJlZ2lzdGVycyhwQWRhcHRlciwgQUREQV9SRUcsIHBkbXByaXYtPkFEREFfYmFja3VwLCBJUUtfQUREQV9SRUdfTlVNKTsKLQotCQkvKiAgUmVsb2FkIE1BQyBwYXJhbWV0ZXJzICovCi0JCV9QSFlfUmVsb2FkTUFDUmVnaXN0ZXJzKHBBZGFwdGVyLCBJUUtfTUFDX1JFRywgcGRtcHJpdi0+SVFLX01BQ19iYWNrdXApOwotCi0JCS8qICBSZWxvYWQgQkIgcGFyYW1ldGVycyAqLwotCQlfUEhZX1JlbG9hZEFEREFSZWdpc3RlcnMocEFkYXB0ZXIsIElRS19CQl9SRUdfOTJDLCBwZG1wcml2LT5JUUtfQkJfYmFja3VwLCBJUUtfQkJfUkVHX05VTSk7Ci0KLQkJLyogIFJlc3RvcmUgUlggaW5pdGlhbCBnYWluICovCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLAotCQkJCSAgckZQR0EwX1hBX0xTU0lQYXJhbWV0ZXIsIDB4MDAwMzJlZDMpOwotCQlpZiAoaXMyVCkgewotCQkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsCi0JCQkJCSAgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIsIDB4MDAwMzJlZDMpOwotCQl9Ci0KLQkJLyogbG9hZCAweGUzMCBJUUMgZGVmYXVsdCB2YWx1ZSAqLwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclR4X0lRS19Ub25lX0EsIDB4MDEwMDhjMDApOwotCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRS19Ub25lX0EsIDB4MDEwMDhjMDApOwotCi0JfQotfQotCi1zdGF0aWMgdm9pZCBfUEhZX0xDQ2FsaWJyYXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGJvb2wgaXMyVCkKLXsKLQl1OCB0bXBSZWc7Ci0JdTMyIFJGX0Ftb2RlID0gMCwgUkZfQm1vZGUgPSAwLCBMQ19DYWw7Ci0KLQkvKiBDaGVjayBjb250aW51b3VzIFRYIGFuZCBQYWNrZXQgVFggKi8KLQl0bXBSZWcgPSBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIDB4ZDAzKTsKLQotCWlmICgodG1wUmVnJjB4NzApICE9IDApIHsKLQkJLyogRGVhbCB3aXRoIGNvbnRpc3VvdXMgVFggY2FzZSAqLwotCQkvKiBkaXNhYmxlIGFsbCBjb250aW51b3VzIFRYICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIDB4ZDAzLCB0bXBSZWcmMHg4Rik7Ci0JfSBlbHNlIHsKLQkJLyogIERlYWwgd2l0aCBQYWNrZXQgVFggY2FzZSAqLwotCQkvKiAgYmxvY2sgYWxsIHF1ZXVlcyAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBBZGFwdGVyLCBSRUdfVFhQQVVTRSwgMHhGRik7Ci0JfQotCi0JaWYgKCh0bXBSZWcmMHg3MCkgIT0gMCkgewotCQkvKiAxLiBSZWFkIG9yaWdpbmFsIFJGIG1vZGUgKi8KLQkJLyogUGF0aC1BICovCi0JCVJGX0Ftb2RlID0gUEhZX1F1ZXJ5UkZSZWcocEFkYXB0ZXIsIFJGX1BBVEhfQSwgUkZfQUMsIGJNYXNrMTJCaXRzKTsKLQotCQkvKiBQYXRoLUIgKi8KLQkJaWYgKGlzMlQpCi0JCQlSRl9CbW9kZSA9IFBIWV9RdWVyeVJGUmVnKHBBZGFwdGVyLCBSRl9QQVRIX0IsIFJGX0FDLCBiTWFzazEyQml0cyk7Ci0KLQkJLyogMi4gU2V0IFJGIG1vZGUgPSBzdGFuZGJ5IG1vZGUgKi8KLQkJLyogUGF0aC1BICovCi0JCVBIWV9TZXRSRlJlZyhwQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9BQywgYk1hc2sxMkJpdHMsIChSRl9BbW9kZSYweDhGRkZGKXwweDEwMDAwKTsKLQotCQkvKiBQYXRoLUIgKi8KLQkJaWYgKGlzMlQpCi0JCQlQSFlfU2V0UkZSZWcocEFkYXB0ZXIsIFJGX1BBVEhfQiwgUkZfQUMsIGJNYXNrMTJCaXRzLCAoUkZfQm1vZGUmMHg4RkZGRil8MHgxMDAwMCk7Ci0JfQotCi0JLyogMy4gUmVhZCBSRiByZWcxOCAqLwotCUxDX0NhbCA9IFBIWV9RdWVyeVJGUmVnKHBBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYk1hc2sxMkJpdHMpOwotCi0JLyogNC4gU2V0IExDIGNhbGlicmF0aW9uIGJlZ2luICovCi0JUEhZX1NldFJGUmVnKHBBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYk1hc2sxMkJpdHMsIExDX0NhbHwweDA4MDAwKTsKLQotCW1zbGVlcCgxMDApOwotCi0JLyogUmVzdG9yZSBvcmlnaW5hbCBzaXR1YXRpb24gKi8KLQlpZiAoKHRtcFJlZyYweDcwKSAhPSAwKSB7CS8qIERlYWwgd2l0aCBjb250dW91cyBUWCBjYXNlICAqLwotCQkvKiBQYXRoLUEgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgMHhkMDMsIHRtcFJlZyk7Ci0JCVBIWV9TZXRSRlJlZyhwQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9BQywgYk1hc2sxMkJpdHMsIFJGX0Ftb2RlKTsKLQotCQkvKiBQYXRoLUIgKi8KLQkJaWYgKGlzMlQpCi0JCQlQSFlfU2V0UkZSZWcocEFkYXB0ZXIsIFJGX1BBVEhfQiwgUkZfQUMsIGJNYXNrMTJCaXRzLCBSRl9CbW9kZSk7Ci0JfSBlbHNlIC8qICBEZWFsIHdpdGggUGFja2V0IFRYIGNhc2UgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwQWRhcHRlciwgUkVHX1RYUEFVU0UsIDB4MDApOwotfQotCi0vKiBBbmFsb2cgUHJlLWRpc3RvcnRpb24gY2FsaWJyYXRpb24gKi8KLSNkZWZpbmUJCUFQS19CQl9SRUdfTlVNCTgKLSNkZWZpbmUJCUFQS19DVVJWRV9SRUdfTlVNIDQKLSNkZWZpbmUJCVBBVEhfTlVNCQkyCi0KLXZvaWQgcnRsODcyM2FfcGh5X2lxX2NhbGlicmF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBib29sIGJSZUNvdmVyeSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCXMzMiByZXN1bHRbNF1bOF07CS8qIGxhc3QgaXMgZmluYWwgcmVzdWx0ICovCi0JdTggaSwgZmluYWxfY2FuZGlkYXRlOwotCWJvb2wgYlBhdGhBT0ssIGJQYXRoQk9LOwotCXMzMiBSZWdFOTQsIFJlZ0U5QywgUmVnRUE0LCBSZWdFQUMsIFJlZ0VCNCwgUmVnRUJDLCBSZWdFQzQ7Ci0JczMyIFJlZ0VDQywgUmVnVG1wID0gMDsKLQlib29sIGlzMTJzaW11bGFyLCBpczEzc2ltdWxhciwgaXMyM3NpbXVsYXI7Ci0JYm9vbCBiU3RhcnRDb250VHggPSBmYWxzZSwgYlNpbmdsZVRvbmUgPSBmYWxzZTsKLQlib29sIGJDYXJyaWVyU3VwcHJlc3Npb24gPSBmYWxzZTsKLQl1MzIgSVFLX0JCX1JFR185MkNbSVFLX0JCX1JFR19OVU1dID0gewotCQlyT0ZETTBfWEFSeElRSW1iYWxhbmNlLCByT0ZETTBfWEJSeElRSW1iYWxhbmNlLAotCQlyT0ZETTBfRUNDQVRocmVzaG9sZCwgck9GRE0wX0FHQ1JTU0lUYWJsZSwKLQkJck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwKLQkJck9GRE0wX1hDVHhBRkUsIHJPRkRNMF9YRFR4QUZFLAotCQlyT0ZETTBfUnhJUUV4dEFudGEKLQl9OwotCi0JLyogaWdub3JlIElRSyB3aGVuIGNvbnRpbnVvdXMgVHggKi8KLQlpZiAoYlN0YXJ0Q29udFR4IHx8IGJTaW5nbGVUb25lIHx8IGJDYXJyaWVyU3VwcHJlc3Npb24pCi0JCXJldHVybjsKLQotCWlmIChiUmVDb3ZlcnkpIHsKLQkJX1BIWV9SZWxvYWRBRERBUmVnaXN0ZXJzKHBBZGFwdGVyLCBJUUtfQkJfUkVHXzkyQywgcGRtcHJpdi0+SVFLX0JCX2JhY2t1cF9yZWNvdmVyLCA5KTsKLQkJcmV0dXJuOwotCX0KLQlEQkdfODcyM0EoIklRSzpTdGFydCEhIVxuIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXJlc3VsdFswXVtpXSA9IDA7Ci0JCXJlc3VsdFsxXVtpXSA9IDA7Ci0JCXJlc3VsdFsyXVtpXSA9IDA7Ci0JCXJlc3VsdFszXVtpXSA9IDA7Ci0JfQotCWZpbmFsX2NhbmRpZGF0ZSA9IDB4ZmY7Ci0JYlBhdGhBT0sgPSBmYWxzZTsKLQliUGF0aEJPSyA9IGZhbHNlOwotCWlzMTJzaW11bGFyID0gZmFsc2U7Ci0JaXMyM3NpbXVsYXIgPSBmYWxzZTsKLQlpczEzc2ltdWxhciA9IGZhbHNlOwotCi0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikKLQkJCV9QSFlfSVFDYWxpYnJhdGUocEFkYXB0ZXIsIHJlc3VsdCwgaSwgdHJ1ZSk7Ci0JCWVsc2UgLyogIEZvciA4OEMgMVQxUiAqLwotCQkJX1BIWV9JUUNhbGlicmF0ZShwQWRhcHRlciwgcmVzdWx0LCBpLCBmYWxzZSk7Ci0KLQkJaWYgKGkgPT0gMSkgewotCQkJaXMxMnNpbXVsYXIgPSBfUEhZX1NpbXVsYXJpdHlDb21wYXJlKHBBZGFwdGVyLCByZXN1bHQsIDAsIDEpOwotCQkJaWYgKGlzMTJzaW11bGFyKSB7Ci0JCQkJZmluYWxfY2FuZGlkYXRlID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChpID09IDIpIHsKLQkJCWlzMTNzaW11bGFyID0gX1BIWV9TaW11bGFyaXR5Q29tcGFyZShwQWRhcHRlciwgcmVzdWx0LCAwLCAyKTsKLQkJCWlmIChpczEzc2ltdWxhcikgewotCQkJCWZpbmFsX2NhbmRpZGF0ZSA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlzMjNzaW11bGFyID0gX1BIWV9TaW11bGFyaXR5Q29tcGFyZShwQWRhcHRlciwgcmVzdWx0LCAxLCAyKTsKLQkJCWlmIChpczIzc2ltdWxhcikgewotCQkJCWZpbmFsX2NhbmRpZGF0ZSA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCQkJCVJlZ1RtcCArPSByZXN1bHRbM11baV07Ci0KLQkJCQlpZiAoUmVnVG1wICE9IDApCi0JCQkJCWZpbmFsX2NhbmRpZGF0ZSA9IDM7Ci0JCQkJZWxzZQotCQkJCQlmaW5hbF9jYW5kaWRhdGUgPSAweEZGOwotCQkJfQotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQlSZWdFOTQgPSByZXN1bHRbaV1bMF07Ci0JCVJlZ0U5QyA9IHJlc3VsdFtpXVsxXTsKLQkJUmVnRUE0ID0gcmVzdWx0W2ldWzJdOwotCQlSZWdFQUMgPSByZXN1bHRbaV1bM107Ci0JCVJlZ0VCNCA9IHJlc3VsdFtpXVs0XTsKLQkJUmVnRUJDID0gcmVzdWx0W2ldWzVdOwotCQlSZWdFQzQgPSByZXN1bHRbaV1bNl07Ci0JCVJlZ0VDQyA9IHJlc3VsdFtpXVs3XTsKLQl9Ci0KLQlpZiAoZmluYWxfY2FuZGlkYXRlICE9IDB4ZmYpIHsKLQkJUmVnRTk0ID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bMF07Ci0JCXBkbXByaXYtPlJlZ0U5NCA9ICBSZWdFOTQ7Ci0JCVJlZ0U5QyA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzFdOwotCQlwZG1wcml2LT5SZWdFOUMgPSBSZWdFOUM7Ci0JCVJlZ0VBNCA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzJdOwotCQlSZWdFQUMgPSByZXN1bHRbZmluYWxfY2FuZGlkYXRlXVszXTsKLQkJUmVnRUI0ID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNF07Ci0JCXBkbXByaXYtPlJlZ0VCNCA9IFJlZ0VCNDsKLQkJUmVnRUJDID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNV07Ci0JCXBkbXByaXYtPlJlZ0VCQyA9IFJlZ0VCQzsKLQkJUmVnRUM0ID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNl07Ci0JCVJlZ0VDQyA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzddOwotCQlEQkdfODcyM0EoIklRSzogZmluYWxfY2FuZGlkYXRlIGlzICV4XG4iLCBmaW5hbF9jYW5kaWRhdGUpOwotCQlEQkdfODcyM0EoIklRSzogUmVnRTk0ID0leCBSZWdFOUMgPSV4IFJlZ0VBNCA9JXggUmVnRUFDID0leCBSZWdFQjQgPSV4IFJlZ0VCQyA9JXggUmVnRUM0ID0leCBSZWdFQ0MgPSV4XG4gIiwKLQkJCSAgUmVnRTk0LCBSZWdFOUMsIFJlZ0VBNCwgUmVnRUFDLCBSZWdFQjQsIFJlZ0VCQywgUmVnRUM0LCBSZWdFQ0MpOwotCQliUGF0aEFPSyA9IGJQYXRoQk9LID0gdHJ1ZTsKLQl9IGVsc2UgewotCQlSZWdFOTQgPSBSZWdFQjQgPSBwZG1wcml2LT5SZWdFOTQgPSBwZG1wcml2LT5SZWdFQjQgPSAweDEwMDsJLyogWCBkZWZhdWx0IHZhbHVlICovCi0JCVJlZ0U5QyA9IFJlZ0VCQyA9IHBkbXByaXYtPlJlZ0U5QyA9IHBkbXByaXYtPlJlZ0VCQyA9IDB4MDsJCS8qIFkgZGVmYXVsdCB2YWx1ZSAqLwotCX0KLQotCWlmICgoUmVnRTk0ICE9IDApLyomJihSZWdFQTQgIT0gMCkqLykKLQkJX1BIWV9QYXRoQUZpbGxJUUtNYXRyaXgocEFkYXB0ZXIsIGJQYXRoQU9LLCByZXN1bHQsIGZpbmFsX2NhbmRpZGF0ZSwgKFJlZ0VBNCA9PSAwKSk7Ci0KLQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikgewotCQlpZiAoKFJlZ0VCNCAhPSAwKS8qJiYoUmVnRUM0ICE9IDApKi8pCi0JCQlfUEhZX1BhdGhCRmlsbElRS01hdHJpeChwQWRhcHRlciwgYlBhdGhCT0ssIHJlc3VsdCwKLQkJCQkJCWZpbmFsX2NhbmRpZGF0ZSwgKFJlZ0VDNCA9PSAwKSk7Ci0JfQotCi0JX1BIWV9TYXZlQUREQVJlZ2lzdGVycyhwQWRhcHRlciwgSVFLX0JCX1JFR185MkMsIHBkbXByaXYtPklRS19CQl9iYWNrdXBfcmVjb3ZlciwgOSk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfcGh5X2xjX2NhbGlicmF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwQWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JYm9vbCBiU3RhcnRDb250VHggPSBmYWxzZSwgYlNpbmdsZVRvbmUgPSBmYWxzZSwgYkNhcnJpZXJTdXBwcmVzc2lvbiA9IGZhbHNlOwotCi0JLyogaWdub3JlIElRSyB3aGVuIGNvbnRpbnVvdXMgVHggKi8KLQlpZiAoYlN0YXJ0Q29udFR4IHx8IGJTaW5nbGVUb25lIHx8IGJDYXJyaWVyU3VwcHJlc3Npb24pCi0JCXJldHVybjsKLQotCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPT0gU0NBTl9QUk9DRVNTKQotCQlyZXR1cm47Ci0KLQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikKLQkJX1BIWV9MQ0NhbGlicmF0ZShwQWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQkvKiAgRm9yIDg4QyAxVDFSICovCi0JCV9QSFlfTENDYWxpYnJhdGUocEFkYXB0ZXIsIGZhbHNlKTsKLX0KLQotdm9pZAotcnRsODcyM2FfcGh5X2FwX2NhbGlicmF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBjaGFyIGRlbHRhKQotewotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9CQi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9CQi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDNlYTZjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfQkIuYworKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0qIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSogbW9yZSBkZXRhaWxzLgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLQotc3RhdGljIGJvb2wgQ2hlY2tDb25kaXRpb24oY29uc3QgdTMyICBDb25kaXRpb24sIGNvbnN0IHUzMiAgSGV4KQotewotCXUzMiBfYm9hcmQgICAgID0gKEhleCAmIDB4MDAwMDAwRkYpOwotCXUzMiBfaW50ZXJmYWNlID0gKEhleCAmIDB4MDAwMEZGMDApID4+IDg7Ci0JdTMyIF9wbGF0Zm9ybSAgPSAoSGV4ICYgMHgwMEZGMDAwMCkgPj4gMTY7Ci0JdTMyIGNvbmQgPSBDb25kaXRpb247Ci0KLQlpZiAoQ29uZGl0aW9uID09IDB4Q0RDRENEQ0QpCi0JCXJldHVybiB0cnVlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDAwMDAwRkY7Ci0JaWYgKChfYm9hcmQgPT0gY29uZCkgJiYgY29uZCAhPSAweDAwKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQljb25kID0gQ29uZGl0aW9uICYgMHgwMDAwRkYwMDsKLQljb25kID4+PSA4OwotCWlmICgoX2ludGVyZmFjZSAmIGNvbmQpID09IDAgJiYgY29uZCAhPSAweDA3KQotCQlyZXR1cm4gZmFsc2U7Ci0KLQljb25kID0gQ29uZGl0aW9uICYgMHgwMEZGMDAwMDsKLQljb25kID4+PSAxNjsKLQlpZiAoKF9wbGF0Zm9ybSAmIGNvbmQpID09IDAgJiYgY29uZCAhPSAweDBGKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBBR0NfVEFCXzFULlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdTMyIEFycmF5X0FHQ19UQUJfMVRfODcyM0FbXSA9IHsKLQkweEM3OCwgMHg3QjAwMDAwMSwKLQkweEM3OCwgMHg3QjAxMDAwMSwKLQkweEM3OCwgMHg3QjAyMDAwMSwKLQkweEM3OCwgMHg3QjAzMDAwMSwKLQkweEM3OCwgMHg3QjA0MDAwMSwKLQkweEM3OCwgMHg3QjA1MDAwMSwKLQkweEM3OCwgMHg3QTA2MDAwMSwKLQkweEM3OCwgMHg3OTA3MDAwMSwKLQkweEM3OCwgMHg3ODA4MDAwMSwKLQkweEM3OCwgMHg3NzA5MDAwMSwKLQkweEM3OCwgMHg3NjBBMDAwMSwKLQkweEM3OCwgMHg3NTBCMDAwMSwKLQkweEM3OCwgMHg3NDBDMDAwMSwKLQkweEM3OCwgMHg3MzBEMDAwMSwKLQkweEM3OCwgMHg3MjBFMDAwMSwKLQkweEM3OCwgMHg3MTBGMDAwMSwKLQkweEM3OCwgMHg3MDEwMDAwMSwKLQkweEM3OCwgMHg2RjExMDAwMSwKLQkweEM3OCwgMHg2RTEyMDAwMSwKLQkweEM3OCwgMHg2RDEzMDAwMSwKLQkweEM3OCwgMHg2QzE0MDAwMSwKLQkweEM3OCwgMHg2QjE1MDAwMSwKLQkweEM3OCwgMHg2QTE2MDAwMSwKLQkweEM3OCwgMHg2OTE3MDAwMSwKLQkweEM3OCwgMHg2ODE4MDAwMSwKLQkweEM3OCwgMHg2NzE5MDAwMSwKLQkweEM3OCwgMHg2NjFBMDAwMSwKLQkweEM3OCwgMHg2NTFCMDAwMSwKLQkweEM3OCwgMHg2NDFDMDAwMSwKLQkweEM3OCwgMHg2MzFEMDAwMSwKLQkweEM3OCwgMHg2MjFFMDAwMSwKLQkweEM3OCwgMHg2MTFGMDAwMSwKLQkweEM3OCwgMHg2MDIwMDAwMSwKLQkweEM3OCwgMHg0OTIxMDAwMSwKLQkweEM3OCwgMHg0ODIyMDAwMSwKLQkweEM3OCwgMHg0NzIzMDAwMSwKLQkweEM3OCwgMHg0NjI0MDAwMSwKLQkweEM3OCwgMHg0NTI1MDAwMSwKLQkweEM3OCwgMHg0NDI2MDAwMSwKLQkweEM3OCwgMHg0MzI3MDAwMSwKLQkweEM3OCwgMHg0MjI4MDAwMSwKLQkweEM3OCwgMHg0MTI5MDAwMSwKLQkweEM3OCwgMHg0MDJBMDAwMSwKLQkweEM3OCwgMHgyNjJCMDAwMSwKLQkweEM3OCwgMHgyNTJDMDAwMSwKLQkweEM3OCwgMHgyNDJEMDAwMSwKLQkweEM3OCwgMHgyMzJFMDAwMSwKLQkweEM3OCwgMHgyMjJGMDAwMSwKLQkweEM3OCwgMHgyMTMwMDAwMSwKLQkweEM3OCwgMHgyMDMxMDAwMSwKLQkweEM3OCwgMHgwNjMyMDAwMSwKLQkweEM3OCwgMHgwNTMzMDAwMSwKLQkweEM3OCwgMHgwNDM0MDAwMSwKLQkweEM3OCwgMHgwMzM1MDAwMSwKLQkweEM3OCwgMHgwMjM2MDAwMSwKLQkweEM3OCwgMHgwMTM3MDAwMSwKLQkweEM3OCwgMHgwMDM4MDAwMSwKLQkweEM3OCwgMHgwMDM5MDAwMSwKLQkweEM3OCwgMHgwMDNBMDAwMSwKLQkweEM3OCwgMHgwMDNCMDAwMSwKLQkweEM3OCwgMHgwMDNDMDAwMSwKLQkweEM3OCwgMHgwMDNEMDAwMSwKLQkweEM3OCwgMHgwMDNFMDAwMSwKLQkweEM3OCwgMHgwMDNGMDAwMSwKLQkweEM3OCwgMHg3QjQwMDAwMSwKLQkweEM3OCwgMHg3QjQxMDAwMSwKLQkweEM3OCwgMHg3QjQyMDAwMSwKLQkweEM3OCwgMHg3QjQzMDAwMSwKLQkweEM3OCwgMHg3QjQ0MDAwMSwKLQkweEM3OCwgMHg3QjQ1MDAwMSwKLQkweEM3OCwgMHg3QTQ2MDAwMSwKLQkweEM3OCwgMHg3OTQ3MDAwMSwKLQkweEM3OCwgMHg3ODQ4MDAwMSwKLQkweEM3OCwgMHg3NzQ5MDAwMSwKLQkweEM3OCwgMHg3NjRBMDAwMSwKLQkweEM3OCwgMHg3NTRCMDAwMSwKLQkweEM3OCwgMHg3NDRDMDAwMSwKLQkweEM3OCwgMHg3MzREMDAwMSwKLQkweEM3OCwgMHg3MjRFMDAwMSwKLQkweEM3OCwgMHg3MTRGMDAwMSwKLQkweEM3OCwgMHg3MDUwMDAwMSwKLQkweEM3OCwgMHg2RjUxMDAwMSwKLQkweEM3OCwgMHg2RTUyMDAwMSwKLQkweEM3OCwgMHg2RDUzMDAwMSwKLQkweEM3OCwgMHg2QzU0MDAwMSwKLQkweEM3OCwgMHg2QjU1MDAwMSwKLQkweEM3OCwgMHg2QTU2MDAwMSwKLQkweEM3OCwgMHg2OTU3MDAwMSwKLQkweEM3OCwgMHg2ODU4MDAwMSwKLQkweEM3OCwgMHg2NzU5MDAwMSwKLQkweEM3OCwgMHg2NjVBMDAwMSwKLQkweEM3OCwgMHg2NTVCMDAwMSwKLQkweEM3OCwgMHg2NDVDMDAwMSwKLQkweEM3OCwgMHg2MzVEMDAwMSwKLQkweEM3OCwgMHg2MjVFMDAwMSwKLQkweEM3OCwgMHg2MTVGMDAwMSwKLQkweEM3OCwgMHg2MDYwMDAwMSwKLQkweEM3OCwgMHg0OTYxMDAwMSwKLQkweEM3OCwgMHg0ODYyMDAwMSwKLQkweEM3OCwgMHg0NzYzMDAwMSwKLQkweEM3OCwgMHg0NjY0MDAwMSwKLQkweEM3OCwgMHg0NTY1MDAwMSwKLQkweEM3OCwgMHg0NDY2MDAwMSwKLQkweEM3OCwgMHg0MzY3MDAwMSwKLQkweEM3OCwgMHg0MjY4MDAwMSwKLQkweEM3OCwgMHg0MTY5MDAwMSwKLQkweEM3OCwgMHg0MDZBMDAwMSwKLQkweEM3OCwgMHgyNjZCMDAwMSwKLQkweEM3OCwgMHgyNTZDMDAwMSwKLQkweEM3OCwgMHgyNDZEMDAwMSwKLQkweEM3OCwgMHgyMzZFMDAwMSwKLQkweEM3OCwgMHgyMjZGMDAwMSwKLQkweEM3OCwgMHgyMTcwMDAwMSwKLQkweEM3OCwgMHgyMDcxMDAwMSwKLQkweEM3OCwgMHgwNjcyMDAwMSwKLQkweEM3OCwgMHgwNTczMDAwMSwKLQkweEM3OCwgMHgwNDc0MDAwMSwKLQkweEM3OCwgMHgwMzc1MDAwMSwKLQkweEM3OCwgMHgwMjc2MDAwMSwKLQkweEM3OCwgMHgwMTc3MDAwMSwKLQkweEM3OCwgMHgwMDc4MDAwMSwKLQkweEM3OCwgMHgwMDc5MDAwMSwKLQkweEM3OCwgMHgwMDdBMDAwMSwKLQkweEM3OCwgMHgwMDdCMDAwMSwKLQkweEM3OCwgMHgwMDdDMDAwMSwKLQkweEM3OCwgMHgwMDdEMDAwMSwKLQkweEM3OCwgMHgwMDdFMDAwMSwKLQkweEM3OCwgMHgwMDdGMDAwMSwKLQkweEM3OCwgMHgzODAwMDAxRSwKLQkweEM3OCwgMHgzODAxMDAxRSwKLQkweEM3OCwgMHgzODAyMDAxRSwKLQkweEM3OCwgMHgzODAzMDAxRSwKLQkweEM3OCwgMHgzODA0MDAxRSwKLQkweEM3OCwgMHgzODA1MDAxRSwKLQkweEM3OCwgMHgzODA2MDAxRSwKLQkweEM3OCwgMHgzODA3MDAxRSwKLQkweEM3OCwgMHgzODA4MDAxRSwKLQkweEM3OCwgMHgzQzA5MDAxRSwKLQkweEM3OCwgMHgzRTBBMDAxRSwKLQkweEM3OCwgMHg0MDBCMDAxRSwKLQkweEM3OCwgMHg0NDBDMDAxRSwKLQkweEM3OCwgMHg0ODBEMDAxRSwKLQkweEM3OCwgMHg0QzBFMDAxRSwKLQkweEM3OCwgMHg1MDBGMDAxRSwKLQkweEM3OCwgMHg1MjEwMDAxRSwKLQkweEM3OCwgMHg1NjExMDAxRSwKLQkweEM3OCwgMHg1QTEyMDAxRSwKLQkweEM3OCwgMHg1RTEzMDAxRSwKLQkweEM3OCwgMHg2MDE0MDAxRSwKLQkweEM3OCwgMHg2MDE1MDAxRSwKLQkweEM3OCwgMHg2MDE2MDAxRSwKLQkweEM3OCwgMHg2MjE3MDAxRSwKLQkweEM3OCwgMHg2MjE4MDAxRSwKLQkweEM3OCwgMHg2MjE5MDAxRSwKLQkweEM3OCwgMHg2MjFBMDAxRSwKLQkweEM3OCwgMHg2MjFCMDAxRSwKLQkweEM3OCwgMHg2MjFDMDAxRSwKLQkweEM3OCwgMHg2MjFEMDAxRSwKLQkweEM3OCwgMHg2MjFFMDAxRSwKLQkweEM3OCwgMHg2MjFGMDAxRSwKLX07Ci0KLSNkZWZpbmUgUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKQkJCVwKLQlkbyB7CQkJCQkJXAotCQlpICs9IDI7IHYxID0gQXJyYXlbaV07IHYyID0gQXJyYXlbaSsxXTsJXAotCX0gd2hpbGUgKDApCi0KLXZvaWQgT0RNX1JlYWRBbmRDb25maWdfQUdDX1RBQl8xVF84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0JdTMyIGhleDsKLQl1MzIgaTsKLQl1OCBwbGF0Zm9ybSA9IDB4MDQ7Ci0JdTggYm9hcmQgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7Ci0JdTMyIEFycmF5TGVuID0gQVJSQVlfU0laRShBcnJheV9BR0NfVEFCXzFUXzg3MjNBKTsKLQl1MzIgKkFycmF5ID0gQXJyYXlfQUdDX1RBQl8xVF84NzIzQTsKLQotCWhleCA9IGJvYXJkOwotCWhleCArPSBPRE1fSVRSRl9VU0IgPDwgODsKLQloZXggKz0gcGxhdGZvcm0gPDwgMTY7Ci0JaGV4ICs9IDB4RkYwMDAwMDA7Ci0JZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKLQkJdTMyIHYxID0gQXJyYXlbaV07Ci0JCXUzMiB2MiA9IEFycmF5W2krMV07Ci0KLQkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwotCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnQkJfQUdDXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMgKi8KLQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCWkgLT0gMjsgLyogIHByZXZlbnQgZnJvbSBmb3ItbG9vcCArPSAyICovCi0JCQl9IGVsc2UgewotCQkJCS8qICBDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0bwotCQkJCSAgICBlbmQgb2YgaWYtZWxzZS4gKi8KLQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKSB7Ci0JCQkJCW9kbV9Db25maWdCQl9BR0NfODcyM0EocERNX09kbSwgdjEsIHYyKTsKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX1JFR18xVC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUzMiBBcnJheV9QSFlfUkVHXzFUXzg3MjNBW10gPSB7Ci0JMHg4MDAsIDB4ODAwNDAwMDAsCi0JMHg4MDQsIDB4MDAwMDAwMDMsCi0JMHg4MDgsIDB4MDAwMEZDMDAsCi0JMHg4MEMsIDB4MDAwMDAwMEEsCi0JMHg4MTAsIDB4MTAwMDEzMzEsCi0JMHg4MTQsIDB4MDIwQzNEMTAsCi0JMHg4MTgsIDB4MDIyMDAzODUsCi0JMHg4MUMsIDB4MDAwMDAwMDAsCi0JMHg4MjAsIDB4MDEwMDAxMDAsCi0JMHg4MjQsIDB4MDAzOTAwMDQsCi0JMHg4MjgsIDB4MDAwMDAwMDAsCi0JMHg4MkMsIDB4MDAwMDAwMDAsCi0JMHg4MzAsIDB4MDAwMDAwMDAsCi0JMHg4MzQsIDB4MDAwMDAwMDAsCi0JMHg4MzgsIDB4MDAwMDAwMDAsCi0JMHg4M0MsIDB4MDAwMDAwMDAsCi0JMHg4NDAsIDB4MDAwMTAwMDAsCi0JMHg4NDQsIDB4MDAwMDAwMDAsCi0JMHg4NDgsIDB4MDAwMDAwMDAsCi0JMHg4NEMsIDB4MDAwMDAwMDAsCi0JMHg4NTAsIDB4MDAwMDAwMDAsCi0JMHg4NTQsIDB4MDAwMDAwMDAsCi0JMHg4NTgsIDB4NTY5QTU2OUEsCi0JMHg4NUMsIDB4MDAxQjI1QTQsCi0JMHg4NjAsIDB4NjZGNjAxMTAsCi0JMHg4NjQsIDB4MDYxRjAxMzAsCi0JMHg4NjgsIDB4MDAwMDAwMDAsCi0JMHg4NkMsIDB4MzIzMjMyMDAsCi0JMHg4NzAsIDB4MDcwMDA3NjAsCi0JMHg4NzQsIDB4MjIwMDQwMDAsCi0JMHg4NzgsIDB4MDAwMDA4MDgsCi0JMHg4N0MsIDB4MDAwMDAwMDAsCi0JMHg4ODAsIDB4QzAwODMwNzAsCi0JMHg4ODQsIDB4MDAwMDA0RDUsCi0JMHg4ODgsIDB4MDAwMDAwMDAsCi0JMHg4OEMsIDB4Q0NDMDAwQzAsCi0JMHg4OTAsIDB4MDAwMDA4MDAsCi0JMHg4OTQsIDB4RkZGRkZGRkUsCi0JMHg4OTgsIDB4NDAzMDIwMTAsCi0JMHg4OUMsIDB4MDA3MDYwNTAsCi0JMHg5MDAsIDB4MDAwMDAwMDAsCi0JMHg5MDQsIDB4MDAwMDAwMjMsCi0JMHg5MDgsIDB4MDAwMDAwMDAsCi0JMHg5MEMsIDB4ODExMjExMTEsCi0JMHhBMDAsIDB4MDBEMDQ3QzgsCi0JMHhBMDQsIDB4ODBGRjAwMEMsCi0JMHhBMDgsIDB4OEM4MzgzMDAsCi0JMHhBMEMsIDB4MkU2ODEyMEYsCi0JMHhBMTAsIDB4OTUwMEJCNzgsCi0JMHhBMTQsIDB4MTExNDQwMjgsCi0JMHhBMTgsIDB4MDA4ODExMTcsCi0JMHhBMUMsIDB4ODkxNDBGMDAsCi0JMHhBMjAsIDB4MUExQjAwMDAsCi0JMHhBMjQsIDB4MDkwRTEzMTcsCi0JMHhBMjgsIDB4MDAwMDAyMDQsCi0JMHhBMkMsIDB4MDBEMzAwMDAsCi0JMHhBNzAsIDB4MTAxRkJGMDAsCi0JMHhBNzQsIDB4MDAwMDAwMDcsCi0JMHhBNzgsIDB4MDAwMDA5MDAsCi0JMHhDMDAsIDB4NDgwNzFENDAsCi0JMHhDMDQsIDB4MDNBMDU2MTEsCi0JMHhDMDgsIDB4MDAwMDAwRTQsCi0JMHhDMEMsIDB4NkM2QzZDNkMsCi0JMHhDMTAsIDB4MDg4MDAwMDAsCi0JMHhDMTQsIDB4NDAwMDAxMDAsCi0JMHhDMTgsIDB4MDg4MDAwMDAsCi0JMHhDMUMsIDB4NDAwMDAxMDAsCi0JMHhDMjAsIDB4MDAwMDAwMDAsCi0JMHhDMjQsIDB4MDAwMDAwMDAsCi0JMHhDMjgsIDB4MDAwMDAwMDAsCi0JMHhDMkMsIDB4MDAwMDAwMDAsCi0JMHhDMzAsIDB4NjlFOUFDNDQsCi0JMHhGRjBGMDExRiwgMHhBQkNELAotCTB4QzM0LCAweDQ2OTY1MkNGLAotCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKLQkweEMzNCwgMHg0Njk2NTJBRiwKLQkweEZGMEYwMTFGLCAweERFQUQsCi0JMHhDMzgsIDB4NDk3OTU5OTQsCi0JMHhDM0MsIDB4MEE5Nzk3MUMsCi0JMHhDNDAsIDB4MUY3QzQwM0YsCi0JMHhDNDQsIDB4MDAwMTAwQjcsCi0JMHhDNDgsIDB4RUMwMjAxMDcsCi0JMHhDNEMsIDB4MDA3RjAzN0YsCi0JMHhDNTAsIDB4Njk1NDM0MjAsCi0JMHhDNTQsIDB4NDNCQzAwOTQsCi0JMHhDNTgsIDB4Njk1NDM0MjAsCi0JMHhDNUMsIDB4NDMzQzAwOTQsCi0JMHhDNjAsIDB4MDAwMDAwMDAsCi0JMHhGRjBGMDExRiwgMHhBQkNELAotCTB4QzY0LCAweDcxMTY4NDhCLAotCTB4Q0RDRENEQ0QsIDB4Q0RDRCwKLQkweEM2NCwgMHg3MTEyODQ4QiwKLQkweEZGMEYwMTFGLCAweERFQUQsCi0JMHhDNjgsIDB4NDdDMDBCRkYsCi0JMHhDNkMsIDB4MDAwMDAwMzYsCi0JMHhDNzAsIDB4MkM3RjAwMEQsCi0JMHhDNzQsIDB4MDE4NjEwREIsCi0JMHhDNzgsIDB4MDAwMDAwMUYsCi0JMHhDN0MsIDB4MDBCOTE2MTIsCi0JMHhDODAsIDB4NDAwMDAxMDAsCi0JMHhDODQsIDB4MjBGNjAwMDAsCi0JMHhDODgsIDB4NDAwMDAxMDAsCi0JMHhDOEMsIDB4MjAyMDAwMDAsCi0JMHhDOTAsIDB4MDAxMjE4MjAsCi0JMHhDOTQsIDB4MDAwMDAwMDAsCi0JMHhDOTgsIDB4MDAxMjE4MjAsCi0JMHhDOUMsIDB4MDAwMDdGN0YsCi0JMHhDQTAsIDB4MDAwMDAwMDAsCi0JMHhDQTQsIDB4MDAwMDAwODAsCi0JMHhDQTgsIDB4MDAwMDAwMDAsCi0JMHhDQUMsIDB4MDAwMDAwMDAsCi0JMHhDQjAsIDB4MDAwMDAwMDAsCi0JMHhDQjQsIDB4MDAwMDAwMDAsCi0JMHhDQjgsIDB4MDAwMDAwMDAsCi0JMHhDQkMsIDB4MjgwMDAwMDAsCi0JMHhDQzAsIDB4MDAwMDAwMDAsCi0JMHhDQzQsIDB4MDAwMDAwMDAsCi0JMHhDQzgsIDB4MDAwMDAwMDAsCi0JMHhDQ0MsIDB4MDAwMDAwMDAsCi0JMHhDRDAsIDB4MDAwMDAwMDAsCi0JMHhDRDQsIDB4MDAwMDAwMDAsCi0JMHhDRDgsIDB4NjRCMjI0MjcsCi0JMHhDREMsIDB4MDA3NjY5MzIsCi0JMHhDRTAsIDB4MDAyMjIyMjIsCi0JMHhDRTQsIDB4MDAwMDAwMDAsCi0JMHhDRTgsIDB4Mzc2NDQzMDIsCi0JMHhDRUMsIDB4MkY5N0Q0MEMsCi0JMHhEMDAsIDB4MDAwODA3NDAsCi0JMHhEMDQsIDB4MDAwMjA0MDEsCi0JMHhEMDgsIDB4MDAwMDkwN0YsCi0JMHhEMEMsIDB4MjAwMTAyMDEsCi0JMHhEMTAsIDB4QTA2MzMzMzMsCi0JMHhEMTQsIDB4MzMzM0JDNDMsCi0JMHhEMTgsIDB4N0E4RjVCNkIsCi0JMHhEMkMsIDB4Q0M5Nzk5NzUsCi0JMHhEMzAsIDB4MDAwMDAwMDAsCi0JMHhEMzQsIDB4ODA2MDgwMDAsCi0JMHhEMzgsIDB4MDAwMDAwMDAsCi0JMHhEM0MsIDB4MDAwMjcyOTMsCi0JMHhENDAsIDB4MDAwMDAwMDAsCi0JMHhENDQsIDB4MDAwMDAwMDAsCi0JMHhENDgsIDB4MDAwMDAwMDAsCi0JMHhENEMsIDB4MDAwMDAwMDAsCi0JMHhENTAsIDB4NjQzNzE0MEEsCi0JMHhENTQsIDB4MDAwMDAwMDAsCi0JMHhENTgsIDB4MDAwMDAwMDAsCi0JMHhENUMsIDB4MzAwMzIwNjQsCi0JMHhENjAsIDB4NDY1M0RFNjgsCi0JMHhENjQsIDB4MDQ1MThBM0MsCi0JMHhENjgsIDB4MDAwMDIxMDEsCi0JMHhENkMsIDB4MkEyMDFDMTYsCi0JMHhENzAsIDB4MTgxMjM2MkUsCi0JMHhENzQsIDB4MzIyQzIyMjAsCi0JMHhENzgsIDB4MDAwRTNDMjQsCi0JMHhFMDAsIDB4MkEyQTJBMkEsCi0JMHhFMDQsIDB4MkEyQTJBMkEsCi0JMHhFMDgsIDB4MDM5MDJBMkEsCi0JMHhFMTAsIDB4MkEyQTJBMkEsCi0JMHhFMTQsIDB4MkEyQTJBMkEsCi0JMHhFMTgsIDB4MkEyQTJBMkEsCi0JMHhFMUMsIDB4MkEyQTJBMkEsCi0JMHhFMjgsIDB4MDAwMDAwMDAsCi0JMHhFMzAsIDB4MTAwMERDMUYsCi0JMHhFMzQsIDB4MTAwMDhDMUYsCi0JMHhFMzgsIDB4MDIxNDAxMDIsCi0JMHhFM0MsIDB4NjgxNjA0QzIsCi0JMHhFNDAsIDB4MDEwMDdDMDAsCi0JMHhFNDQsIDB4MDEwMDQ4MDAsCi0JMHhFNDgsIDB4RkIwMDAwMDAsCi0JMHhFNEMsIDB4MDAwMDI4RDEsCi0JMHhFNTAsIDB4MTAwMERDMUYsCi0JMHhFNTQsIDB4MTAwMDhDMUYsCi0JMHhFNTgsIDB4MDIxNDAxMDIsCi0JMHhFNUMsIDB4MjgxNjBEMDUsCi0JMHhFNjAsIDB4MDAwMDAwMDgsCi0JMHhFNjgsIDB4MDAxQjI1QTQsCi0JMHhFNkMsIDB4NjMxQjI1QTAsCi0JMHhFNzAsIDB4NjMxQjI1QTAsCi0JMHhFNzQsIDB4MDgxQjI1QTAsCi0JMHhFNzgsIDB4MDgxQjI1QTAsCi0JMHhFN0MsIDB4MDgxQjI1QTAsCi0JMHhFODAsIDB4MDgxQjI1QTAsCi0JMHhFODQsIDB4NjMxQjI1QTAsCi0JMHhFODgsIDB4MDgxQjI1QTAsCi0JMHhFOEMsIDB4NjMxQjI1QTAsCi0JMHhFRDAsIDB4NjMxQjI1QTAsCi0JMHhFRDQsIDB4NjMxQjI1QTAsCi0JMHhFRDgsIDB4NjMxQjI1QTAsCi0JMHhFREMsIDB4MDAxQjI1QTAsCi0JMHhFRTAsIDB4MDAxQjI1QTAsCi0JMHhFRUMsIDB4NkIxQjI1QTAsCi0JMHhGMTQsIDB4MDAwMDAwMDMsCi0JMHhGNEMsIDB4MDAwMDAwMDAsCi0JMHhGMDAsIDB4MDAwMDAzMDAsCi19OwotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX1BIWV9SRUdfMVRfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXUzMiBoZXggPSAwOwotCXUzMiBpID0gMDsKLQl1OCAgcGxhdGZvcm0gPSAweDA0OwotCXU4ICBib2FyZCA9IHBETV9PZG0tPkJvYXJkVHlwZTsKLQl1MzIgQXJyYXlMZW4gPSBBUlJBWV9TSVpFKEFycmF5X1BIWV9SRUdfMVRfODcyM0EpOwotCXUzMiAqQXJyYXkgPSBBcnJheV9QSFlfUkVHXzFUXzg3MjNBOwotCi0JaGV4ICs9IGJvYXJkOwotCWhleCArPSBPRE1fSVRSRl9VU0IgPDwgODsKLQloZXggKz0gcGxhdGZvcm0gPDwgMTY7Ci0JaGV4ICs9IDB4RkYwMDAwMDA7Ci0JZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKLQkJdTMyIHYxID0gQXJyYXlbaV07Ci0JCXUzMiB2MiA9IEFycmF5W2krMV07Ci0KLQkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwotCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMgKi8KLQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCWkgLT0gMjsgLyogIHByZXZlbnQgZnJvbSBmb3ItbG9vcCArPSAyICovCi0JCQl9IGVsc2UgewotCQkJCS8qICBDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0bwotCQkJCSAgICBlbmQgb2YgaWYtZWxzZS4gKi8KLQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKSB7Ci0JCQkJCW9kbV9Db25maWdCQl9QSFlfODcyM0EocERNX09kbSwgdjEsIHYyKTsKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX1JFR19NUC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUzMiBBcnJheV9QSFlfUkVHX01QXzg3MjNBW10gPSB7Ci0JMHhDMzAsIDB4NjlFOUFDNEEsCi0JMHhDM0MsIDB4MEE5Nzk3MTgsCi19OwotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX1BIWV9SRUdfTVBfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXUzMiBoZXggPSAwOwotCXUzMiBpOwotCXU4IHBsYXRmb3JtID0gMHgwNDsKLQl1OCBib2FyZCA9IHBETV9PZG0tPkJvYXJkVHlwZTsKLQl1MzIgQXJyYXlMZW4gPSBBUlJBWV9TSVpFKEFycmF5X1BIWV9SRUdfTVBfODcyM0EpOwotCXUzMiAqQXJyYXkgPSBBcnJheV9QSFlfUkVHX01QXzg3MjNBOwotCi0JaGV4ICs9IGJvYXJkOwotCWhleCArPSBPRE1fSVRSRl9VU0IgPDwgODsKLQloZXggKz0gcGxhdGZvcm0gPDwgMTY7Ci0JaGV4ICs9IDB4RkYwMDAwMDA7Ci0JZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKLQkJdTMyIHYxID0gQXJyYXlbaV07Ci0JCXUzMiB2MiA9IEFycmF5W2krMV07Ci0KLQkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwotCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMgKi8KLQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKLQkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCWkgLT0gMjsgLyogIHByZXZlbnQgZnJvbSBmb3ItbG9vcCArPSAyICovCi0JCQl9IGVsc2UgewotCQkJCS8qIENvbmZpZ3VyZSBtYXRjaGVkIHBhaXJzIGFuZCBza2lwIHRvCi0JCQkJICAgZW5kIG9mIGlmLWVsc2UuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikgewotCQkJCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7Ci0JCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7Ci0JCQkJfQotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfTUFDLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX01BQy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmY2ODU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfTUFDLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0qIG1vcmUgZGV0YWlscy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0KLXN0YXRpYyBib29sIENoZWNrQ29uZGl0aW9uKGNvbnN0IHUzMiAgQ29uZGl0aW9uLCBjb25zdCB1MzIgIEhleCkKLXsKLQl1MzIgX2JvYXJkICAgICA9IChIZXggJiAweDAwMDAwMEZGKTsKLQl1MzIgX2ludGVyZmFjZSA9IChIZXggJiAweDAwMDBGRjAwKSA+PiA4OwotCXUzMiBfcGxhdGZvcm0gID0gKEhleCAmIDB4MDBGRjAwMDApID4+IDE2OwotCXUzMiBjb25kID0gQ29uZGl0aW9uOwotCi0JaWYgKENvbmRpdGlvbiA9PSAweENEQ0RDRENEKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWNvbmQgPSBDb25kaXRpb24gJiAweDAwMDAwMEZGOwotCWlmICgoX2JvYXJkID09IGNvbmQpICYmIGNvbmQgIT0gMHgwMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDAwMEZGMDA7Ci0JY29uZCA+Pj0gODsKLQlpZiAoKF9pbnRlcmZhY2UgJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwNykKLQkJcmV0dXJuIGZhbHNlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDBGRjAwMDA7Ci0JY29uZCA+Pj0gMTY7Ci0JaWYgKChfcGxhdGZvcm0gJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwRikKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFDX1JFRy5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUzMiBBcnJheV9NQUNfUkVHXzg3MjNBW10gPSB7Ci0JCTB4NDIwLCAweDAwMDAwMDgwLAotCQkweDQyMywgMHgwMDAwMDAwMCwKLQkJMHg0MzAsIDB4MDAwMDAwMDAsCi0JCTB4NDMxLCAweDAwMDAwMDAwLAotCQkweDQzMiwgMHgwMDAwMDAwMCwKLQkJMHg0MzMsIDB4MDAwMDAwMDEsCi0JCTB4NDM0LCAweDAwMDAwMDA0LAotCQkweDQzNSwgMHgwMDAwMDAwNSwKLQkJMHg0MzYsIDB4MDAwMDAwMDYsCi0JCTB4NDM3LCAweDAwMDAwMDA3LAotCQkweDQzOCwgMHgwMDAwMDAwMCwKLQkJMHg0MzksIDB4MDAwMDAwMDAsCi0JCTB4NDNBLCAweDAwMDAwMDAwLAotCQkweDQzQiwgMHgwMDAwMDAwMSwKLQkJMHg0M0MsIDB4MDAwMDAwMDQsCi0JCTB4NDNELCAweDAwMDAwMDA1LAotCQkweDQzRSwgMHgwMDAwMDAwNiwKLQkJMHg0M0YsIDB4MDAwMDAwMDcsCi0JCTB4NDQwLCAweDAwMDAwMDVELAotCQkweDQ0MSwgMHgwMDAwMDAwMSwKLQkJMHg0NDIsIDB4MDAwMDAwMDAsCi0JCTB4NDQ0LCAweDAwMDAwMDE1LAotCQkweDQ0NSwgMHgwMDAwMDBGMCwKLQkJMHg0NDYsIDB4MDAwMDAwMEYsCi0JCTB4NDQ3LCAweDAwMDAwMDAwLAotCQkweDQ1OCwgMHgwMDAwMDA0MSwKLQkJMHg0NTksIDB4MDAwMDAwQTgsCi0JCTB4NDVBLCAweDAwMDAwMDcyLAotCQkweDQ1QiwgMHgwMDAwMDBCOSwKLQkJMHg0NjAsIDB4MDAwMDAwNjYsCi0JCTB4NDYxLCAweDAwMDAwMDY2LAotCQkweDQ2MiwgMHgwMDAwMDAwOCwKLQkJMHg0NjMsIDB4MDAwMDAwMDMsCi0JCTB4NEM4LCAweDAwMDAwMEZGLAotCQkweDRDOSwgMHgwMDAwMDAwOCwKLQkJMHg0Q0MsIDB4MDAwMDAwRkYsCi0JCTB4NENELCAweDAwMDAwMEZGLAotCQkweDRDRSwgMHgwMDAwMDAwMSwKLQkJMHg1MDAsIDB4MDAwMDAwMjYsCi0JCTB4NTAxLCAweDAwMDAwMEEyLAotCQkweDUwMiwgMHgwMDAwMDAyRiwKLQkJMHg1MDMsIDB4MDAwMDAwMDAsCi0JCTB4NTA0LCAweDAwMDAwMDI4LAotCQkweDUwNSwgMHgwMDAwMDBBMywKLQkJMHg1MDYsIDB4MDAwMDAwNUUsCi0JCTB4NTA3LCAweDAwMDAwMDAwLAotCQkweDUwOCwgMHgwMDAwMDAyQiwKLQkJMHg1MDksIDB4MDAwMDAwQTQsCi0JCTB4NTBBLCAweDAwMDAwMDVFLAotCQkweDUwQiwgMHgwMDAwMDAwMCwKLQkJMHg1MEMsIDB4MDAwMDAwNEYsCi0JCTB4NTBELCAweDAwMDAwMEE0LAotCQkweDUwRSwgMHgwMDAwMDAwMCwKLQkJMHg1MEYsIDB4MDAwMDAwMDAsCi0JCTB4NTEyLCAweDAwMDAwMDFDLAotCQkweDUxNCwgMHgwMDAwMDAwQSwKLQkJMHg1MTUsIDB4MDAwMDAwMTAsCi0JCTB4NTE2LCAweDAwMDAwMDBBLAotCQkweDUxNywgMHgwMDAwMDAxMCwKLQkJMHg1MUEsIDB4MDAwMDAwMTYsCi0JCTB4NTI0LCAweDAwMDAwMDBGLAotCQkweDUyNSwgMHgwMDAwMDA0RiwKLQkJMHg1NDYsIDB4MDAwMDAwNDAsCi0JCTB4NTQ3LCAweDAwMDAwMDAwLAotCQkweDU1MCwgMHgwMDAwMDAxMCwKLQkJMHg1NTEsIDB4MDAwMDAwMTAsCi0JCTB4NTU5LCAweDAwMDAwMDAyLAotCQkweDU1QSwgMHgwMDAwMDAwMiwKLQkJMHg1NUQsIDB4MDAwMDAwRkYsCi0JCTB4NjA1LCAweDAwMDAwMDMwLAotCQkweDYwOCwgMHgwMDAwMDAwRSwKLQkJMHg2MDksIDB4MDAwMDAwMkEsCi0JCTB4NjUyLCAweDAwMDAwMDIwLAotCQkweDYzQywgMHgwMDAwMDAwQSwKLQkJMHg2M0QsIDB4MDAwMDAwMEEsCi0JCTB4NjNFLCAweDAwMDAwMDBFLAotCQkweDYzRiwgMHgwMDAwMDAwRSwKLQkJMHg2NkUsIDB4MDAwMDAwMDUsCi0JCTB4NzAwLCAweDAwMDAwMDIxLAotCQkweDcwMSwgMHgwMDAwMDA0MywKLQkJMHg3MDIsIDB4MDAwMDAwNjUsCi0JCTB4NzAzLCAweDAwMDAwMDg3LAotCQkweDcwOCwgMHgwMDAwMDAyMSwKLQkJMHg3MDksIDB4MDAwMDAwNDMsCi0JCTB4NzBBLCAweDAwMDAwMDY1LAotCQkweDcwQiwgMHgwMDAwMDA4NywKLX07Ci0KLXZvaWQgT0RNX1JlYWRBbmRDb25maWdfTUFDX1JFR184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0JI2RlZmluZSBSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpCQkJXAotCQkgZG8gewkJCQkJCVwKLQkJCWkgKz0gMjsgdjEgPSBBcnJheVtpXTsgdjIgPSBBcnJheVtpKzFdOwlcCi0JCSB9IHdoaWxlICgwKQotCi0JdTMyICAgICBoZXggICAgICAgICA9IDA7Ci0JdTMyICAgICBpICAgICAgICAgICA9IDA7Ci0JdTggICAgIHBsYXRmb3JtICAgID0gMHgwNDsKLQl1OCAgICAgYm9hcmQgICAgICAgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7Ci0JdTMyICAgICBBcnJheUxlbiAgICA9IEFSUkFZX1NJWkUoQXJyYXlfTUFDX1JFR184NzIzQSk7Ci0JdTMyICpBcnJheSAgICAgICA9IEFycmF5X01BQ19SRUdfODcyM0E7Ci0KLQloZXggKz0gYm9hcmQ7Ci0JaGV4ICs9IE9ETV9JVFJGX1VTQiA8PCA4OwotCWhleCArPSBwbGF0Zm9ybSA8PCAxNjsKLQloZXggKz0gMHhGRjAwMDAwMDsKLQlmb3IgKGkgPSAwOyBpIDwgQXJyYXlMZW47IGkgKz0gMikgewotCQl1MzIgdjEgPSBBcnJheVtpXTsKLQkJdTMyIHYyID0gQXJyYXlbaSsxXTsKLQotCQkvKiAgVGhpcyAob2Zmc2V0LCBkYXRhKSBwYWlyIG1lZXRzIHRoZSBjb25kaXRpb24uICovCi0JCWlmICh2MSA8IDB4Q0RDRENEQ0QpIHsKLQkJCW9kbV9Db25maWdNQUNfODcyM0EocERNX09kbSwgdjEsICh1OCl2Mik7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQlpIC09IDI7IC8qICBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiAqLwotCQkJfSBlbHNlIHsKLQkJCQkvKiAgQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8gZW5kIG9mIGlmLWVsc2UuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikgewotCQkJCQlvZG1fQ29uZmlnTUFDXzg3MjNBKHBETV9PZG0sIHYxLCAodTgpdjIpOwotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCX0KLQotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfUkYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfUkYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2ZjNlYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX1JGLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0qIG1vcmUgZGV0YWlscy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0KLXN0YXRpYyBib29sIENoZWNrQ29uZGl0aW9uKGNvbnN0IHUzMiAgQ29uZGl0aW9uLCBjb25zdCB1MzIgIEhleCkKLXsKLQl1MzIgX2JvYXJkICAgICA9IChIZXggJiAweDAwMDAwMEZGKTsKLQl1MzIgX2ludGVyZmFjZSA9IChIZXggJiAweDAwMDBGRjAwKSA+PiA4OwotCXUzMiBfcGxhdGZvcm0gID0gKEhleCAmIDB4MDBGRjAwMDApID4+IDE2OwotCXUzMiBjb25kID0gQ29uZGl0aW9uOwotCi0JaWYgKENvbmRpdGlvbiA9PSAweENEQ0RDRENEKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWNvbmQgPSBDb25kaXRpb24gJiAweDAwMDAwMEZGOwotCWlmICgoX2JvYXJkID09IGNvbmQpICYmIGNvbmQgIT0gMHgwMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDAwMEZGMDA7Ci0JY29uZCA+Pj0gODsKLQlpZiAoKF9pbnRlcmZhY2UgJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwNykKLQkJcmV0dXJuIGZhbHNlOwotCi0JY29uZCA9IENvbmRpdGlvbiAmIDB4MDBGRjAwMDA7Ci0JY29uZCA+Pj0gMTY7Ci0JaWYgKChfcGxhdGZvcm0gJiBjb25kKSA9PSAwICYmIGNvbmQgIT0gMHgwRikKLQkJcmV0dXJuIGZhbHNlOwotCXJldHVybiB0cnVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9BXzFULlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdTMyIEFycmF5X1JhZGlvQV8xVF84NzIzQVtdID0gewotCTB4MDAwLCAweDAwMDMwMTU5LAotCTB4MDAxLCAweDAwMDMxMjg0LAotCTB4MDAyLCAweDAwMDk4MDAwLAotCTB4RkYwRjAxMUYsIDB4QUJDRCwKLQkweDAwMywgMHgwMDAxOEM2MywKLQkweENEQ0RDRENELCAweENEQ0QsCi0JMHgwMDMsIDB4MDAwMzlDNjMsCi0JMHhGRjBGMDExRiwgMHhERUFELAotCTB4MDA0LCAweDAwMDIxMEU3LAotCTB4MDA5LCAweDAwMDIwNDRGLAotCTB4MDBBLCAweDAwMDFBM0YxLAotCTB4MDBCLCAweDAwMDE0Nzg3LAotCTB4MDBDLCAweDAwMDg5NkZFLAotCTB4MDBELCAweDAwMDBFMDJDLAotCTB4MDBFLCAweDAwMDM5Q0U3LAotCTB4MDBGLCAweDAwMDAwNDUxLAotCTB4MDE5LCAweDAwMDAwMDAwLAotCTB4MDFBLCAweDAwMDMwMzU1LAotCTB4MDFCLCAweDAwMDYwQTAwLAotCTB4MDFDLCAweDAwMEZDMzc4LAotCTB4MDFELCAweDAwMEExMjUwLAotCTB4MDFFLCAweDAwMDAwMjRGLAotCTB4MDFGLCAweDAwMDAwMDAwLAotCTB4MDIwLCAweDAwMDBCNjE0LAotCTB4MDIxLCAweDAwMDZDMDAwLAotCTB4MDIyLCAweDAwMDAwMDAwLAotCTB4MDIzLCAweDAwMDAxNTU4LAotCTB4MDI0LCAweDAwMDAwMDYwLAotCTB4MDI1LCAweDAwMDAwNDgzLAotCTB4MDI2LCAweDAwMDRGMDAwLAotCTB4MDI3LCAweDAwMEVDN0Q5LAotCTB4MDI4LCAweDAwMDU3NzMwLAotCTB4MDI5LCAweDAwMDA0NzgzLAotCTB4MDJBLCAweDAwMDAwMDAxLAotCTB4MDJCLCAweDAwMDIxMzM0LAotCTB4MDJBLCAweDAwMDAwMDAwLAotCTB4MDJCLCAweDAwMDAwMDU0LAotCTB4MDJBLCAweDAwMDAwMDAxLAotCTB4MDJCLCAweDAwMDAwODA4LAotCTB4MDJCLCAweDAwMDUzMzMzLAotCTB4MDJDLCAweDAwMDAwMDBDLAotCTB4MDJBLCAweDAwMDAwMDAyLAotCTB4MDJCLCAweDAwMDAwODA4LAotCTB4MDJCLCAweDAwMDVCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDAzLAotCTB4MDJCLCAweDAwMDAwODA4LAotCTB4MDJCLCAweDAwMDYzMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA0LAotCTB4MDJCLCAweDAwMDAwODA4LAotCTB4MDJCLCAweDAwMDZCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA1LAotCTB4MDJCLCAweDAwMDAwODA4LAotCTB4MDJCLCAweDAwMDczMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA2LAotCTB4MDJCLCAweDAwMDAwNzA5LAotCTB4MDJCLCAweDAwMDVCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA3LAotCTB4MDJCLCAweDAwMDAwNzA5LAotCTB4MDJCLCAweDAwMDYzMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA4LAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDRCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDA5LAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDUzMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDBBLAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDVCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDBCLAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDYzMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDBDLAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDZCMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDBELAotCTB4MDJCLCAweDAwMDAwNjBBLAotCTB4MDJCLCAweDAwMDczMzMzLAotCTB4MDJDLCAweDAwMDAwMDBELAotCTB4MDJBLCAweDAwMDAwMDBFLAotCTB4MDJCLCAweDAwMDAwNTBCLAotCTB4MDJCLCAweDAwMDY2NjY2LAotCTB4MDJDLCAweDAwMDAwMDFBLAotCTB4MDJBLCAweDAwMEUwMDAwLAotCTB4MDEwLCAweDAwMDQwMDBGLAotCTB4MDExLCAweDAwMEUzMUZDLAotCTB4MDEwLCAweDAwMDYwMDBGLAotCTB4MDExLCAweDAwMEZGOUY4LAotCTB4MDEwLCAweDAwMDIwMDBGLAotCTB4MDExLCAweDAwMDIwM0Y5LAotCTB4MDEwLCAweDAwMDMwMDBGLAotCTB4MDExLCAweDAwMEZGNTAwLAotCTB4MDEwLCAweDAwMDAwMDAwLAotCTB4MDExLCAweDAwMDAwMDAwLAotCTB4MDEwLCAweDAwMDgwMDBGLAotCTB4MDExLCAweDAwMDNGMTAwLAotCTB4MDEwLCAweDAwMDkwMDBGLAotCTB4MDExLCAweDAwMDIzMTAwLAotCTB4MDEyLCAweDAwMDMyMDAwLAotCTB4MDEyLCAweDAwMDcxMDAwLAotCTB4MDEyLCAweDAwMEIwMDAwLAotCTB4MDEyLCAweDAwMEZDMDAwLAotCTB4MDEzLCAweDAwMDI4N0IzLAotCTB4MDEzLCAweDAwMDI0NEI3LAotCTB4MDEzLCAweDAwMDIwNEFCLAotCTB4MDEzLCAweDAwMDFDNDlGLAotCTB4MDEzLCAweDAwMDE4NDkzLAotCTB4MDEzLCAweDAwMDE0MjlCLAotCTB4MDEzLCAweDAwMDEwMjk5LAotCTB4MDEzLCAweDAwMDBDMjlDLAotCTB4MDEzLCAweDAwMDA4MUEwLAotCTB4MDEzLCAweDAwMDA0MEFDLAotCTB4MDEzLCAweDAwMDAwMDIwLAotCTB4MDE0LCAweDAwMDE5NDRDLAotCTB4MDE0LCAweDAwMDU5NDQ0LAotCTB4MDE0LCAweDAwMDk5NDRDLAotCTB4MDE0LCAweDAwMEQ5NDQ0LAotCTB4RkYwRjAxMUYsIDB4QUJDRCwKLQkweDAxNSwgMHgwMDAwRjQyNCwKLQkweDAxNSwgMHgwMDA0RjQyNCwKLQkweDAxNSwgMHgwMDA4RjQyNCwKLQkweDAxNSwgMHgwMDBDRjQyNCwKLQkweENEQ0RDRENELCAweENEQ0QsCi0JMHgwMTUsIDB4MDAwMEY0NzQsCi0JMHgwMTUsIDB4MDAwNEY0NzcsCi0JMHgwMTUsIDB4MDAwOEY0NTUsCi0JMHgwMTUsIDB4MDAwQ0Y0NTUsCi0JMHhGRjBGMDExRiwgMHhERUFELAotCTB4MDE2LCAweDAwMDAwMzM5LAotCTB4MDE2LCAweDAwMDQwMzM5LAotCTB4MDE2LCAweDAwMDgwMzM5LAotCTB4RkYwRjAxMUYsIDB4QUJDRCwKLQkweDAxNiwgMHgwMDBDMDM1NiwKLQkweENEQ0RDRENELCAweENEQ0QsCi0JMHgwMTYsIDB4MDAwQzAzNjYsCi0JMHhGRjBGMDExRiwgMHhERUFELAotCTB4MDAwLCAweDAwMDEwMTU5LAotCTB4MDE4LCAweDAwMDBGNDAxLAotCTB4MEZFLCAweDAwMDAwMDAwLAotCTB4MEZFLCAweDAwMDAwMDAwLAotCTB4MDFGLCAweDAwMDAwMDAzLAotCTB4MEZFLCAweDAwMDAwMDAwLAotCTB4MEZFLCAweDAwMDAwMDAwLAotCTB4MDFFLCAweDAwMDAwMjQ3LAotCTB4MDFGLCAweDAwMDAwMDAwLAotCTB4MDAwLCAweDAwMDMwMTU5LAotfTsKLQotdm9pZCBPRE1fUmVhZEFuZENvbmZpZ19SYWRpb0FfMVRfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCSNkZWZpbmUgUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKQkJCVwKLQkJIGRvIHsJCQkJCQlcCi0JCQkgaSArPSAyOyB2MSA9IEFycmF5W2ldOyB2MiA9IEFycmF5W2krMV07XAotCQkgfSB3aGlsZSAoMCkKLQotCXUzMiAgICAgaGV4ICAgICAgICAgPSAwOwotCXUzMiAgICAgaSAgICAgICAgICAgPSAwOwotCXU4ICAgICBwbGF0Zm9ybSAgICA9IDB4MDQ7Ci0JdTggICAgIGJvYXJkICAgICAgID0gcERNX09kbS0+Qm9hcmRUeXBlOwotCXUzMiAgICAgQXJyYXlMZW4gICAgPSBBUlJBWV9TSVpFKEFycmF5X1JhZGlvQV8xVF84NzIzQSk7Ci0JdTMyICpBcnJheSA9IEFycmF5X1JhZGlvQV8xVF84NzIzQTsKLQotCWhleCArPSBib2FyZDsKLQloZXggKz0gT0RNX0lUUkZfVVNCIDw8IDg7Ci0JaGV4ICs9IHBsYXRmb3JtIDw8IDE2OwotCWhleCArPSAweEZGMDAwMDAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKLQkJdTMyIHYxID0gQXJyYXlbaV07Ci0JCXUzMiB2MiA9IEFycmF5W2krMV07Ci0KLQkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwotCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnUkZSZWdfODcyM0EocERNX09kbSwgdjEsIHYyLCBSRl9QQVRIX0EsIHYxKTsKLQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgewotCQkJaWYgKCFDaGVja0NvbmRpdGlvbihBcnJheVtpXSwgaGV4KSkgewotCQkJCS8qICBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQlpIC09IDI7IC8qICBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiAqLwotCQkJfSBlbHNlIHsKLQkJCQkvKiAgQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8gZW5kIG9mIGlmLWVsc2UuICovCi0JCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCi0JCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikgewotCQkJCQlvZG1fQ29uZmlnUkZSZWdfODcyM0EocERNX09kbSwgdjEsIHYyLAotCQkJCQkJCSAgICAgIFJGX1BBVEhfQSwgdjEpOwotCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwotCQkJCX0KLQotCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IEFycmF5TGVuIC0gMikKLQkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbFB3clNlcUNtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsUHdyU2VxQ21kLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2Q5NmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsUHdyU2VxQ21kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKisrCi1Db3B5cmlnaHQgKGMpIFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1Nb2R1bGUgTmFtZToKLQlIYWxQd3JTZXFDbWQuYwotCi1BYnN0cmFjdDoKLQlJbXBsZW1lbnQgSFcgUG93ZXIgc2VxdWVuY2UgY29uZmlndXJhdGlvbiBDTUQgaGFuZGxpbmcgcm91dGluZSBmb3IKLQlSZWFsdGVrIGRldmljZXMuCi0KLU1ham9yIENoYW5nZSBIaXN0b3J5OgotCVdoZW4gICAgICAgV2hvICAgICAgICAgICAgICAgV2hhdAotCS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCTIwMTEtMTAtMjYgTHVjYXMgICAgICAgICAgICBNb2RpZnkgdG8gYmUgY29tcGF0aWJsZSB3aXRoIFNENC1DRSBkcml2ZXIuCi0JMjAxMS0wNy0wNyBSb2dlciAgICAgICAgICAgIENyZWF0ZS4KLQotLS0qLwotI2luY2x1ZGUgPEhhbFB3clNlcUNtZC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotLyogICovCi0vKglEZXNjcmlwdGlvbjogKi8KLS8qCQlUaGlzIHJvdXRpbmUgZGVhbCB3aXRoIHRoZSBQb3dlciBDb25maWd1cmF0aW9uIENNRHMgcGFyc2luZwotCQlmb3IgUlRMODcyMy9SVEw4MTg4RSBTZXJpZXMgSUMuICovCi0vKiAgKi8KLS8qCUFzc3VtcHRpb246ICovCi0vKgkJV2Ugc2hvdWxkIGZvbGxvdyBzcGVjaWZpYyBmb3JtYXQgd2hpY2ggd2FzIHJlbGVhc2VkIGZyb20KLQkJSFcgU0QuICovCi0vKiAgKi8KLS8qCTIwMTEuMDcuMDcsIGFkZGVkIGJ5IFJvZ2VyLiAqLwotLyogICovCi11OCBIYWxQd3JTZXFDbWRQYXJzaW5nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEN1dFZlcnNpb24sCi0JCSAgICAgICB1OCBGYWJWZXJzaW9uLCB1OCBJbnRlcmZhY2VUeXBlLAotCQkgICAgICAgc3RydWN0IHdsYW5fcHdyX2NmZyBQd3JTZXFDbWRbXSkKLXsKLQlzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIFB3ckNmZ0NtZDsKLQl1OCBiUG9sbGluZ0JpdDsKLQl1MzIgQXJ5SWR4ID0gMDsKLQl1OCB2YWx1ZTsKLQl1MzIgb2Zmc2V0OwotCXUzMiBwb2xsaW5nQ291bnQgPSAwOwkvKiAgcG9sbGluZyBhdXRvbG9hZCBkb25lLiAqLwotCXUzMiBtYXhQb2xsaW5nQ250ID0gNTAwMDsKLQotCWRvIHsKLQkJUHdyQ2ZnQ21kID0gUHdyU2VxQ21kW0FyeUlkeF07Ci0KLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogb2Zmc2V0KCUjeCkgY3V0X21zayglI3gpIGZhYl9tc2soJSN4KSBpbnRlcmZhY2VfbXNrKCUjeCkgYmFzZSglI3gpIGNtZCglI3gpIG1zayglI3gpIHZhbHVlKCUjeClcbiIsCi0JCQkgR0VUX1BXUl9DRkdfT0ZGU0VUKFB3ckNmZ0NtZCksCi0JCQkgR0VUX1BXUl9DRkdfQ1VUX01BU0soUHdyQ2ZnQ21kKSwKLQkJCSBHRVRfUFdSX0NGR19GQUJfTUFTSyhQd3JDZmdDbWQpLAotCQkJIEdFVF9QV1JfQ0ZHX0lOVEZfTUFTSyhQd3JDZmdDbWQpLAotCQkJIEdFVF9QV1JfQ0ZHX0JBU0UoUHdyQ2ZnQ21kKSwKLQkJCSBHRVRfUFdSX0NGR19DTUQoUHdyQ2ZnQ21kKSwKLQkJCSBHRVRfUFdSX0NGR19NQVNLKFB3ckNmZ0NtZCksCi0JCQkgR0VUX1BXUl9DRkdfVkFMVUUoUHdyQ2ZnQ21kKSk7Ci0KLQkJLyogMiBPbmx5IEhhbmRsZSB0aGUgY29tbWFuZCB3aG9zZSBGQUIsIENVVCwgYW5kIEludGVyZmFjZSBhcmUKLQkJICAgbWF0Y2hlZCAqLwotCQlpZiAoKEdFVF9QV1JfQ0ZHX0ZBQl9NQVNLKFB3ckNmZ0NtZCkgJiBGYWJWZXJzaW9uKSAmJgotCQkgICAgKEdFVF9QV1JfQ0ZHX0NVVF9NQVNLKFB3ckNmZ0NtZCkgJiBDdXRWZXJzaW9uKSAmJgotCQkgICAgKEdFVF9QV1JfQ0ZHX0lOVEZfTUFTSyhQd3JDZmdDbWQpICYgSW50ZXJmYWNlVHlwZSkpIHsKLQkJCXN3aXRjaCAoR0VUX1BXUl9DRkdfQ01EKFB3ckNmZ0NtZCkpIHsKLQkJCWNhc2UgUFdSX0NNRF9SRUFEOgotCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogUFdSX0NNRF9SRUFEXG4iKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBQV1JfQ01EX1dSSVRFOgotCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogUFdSX0NNRF9XUklURVxuIik7Ci0JCQkJb2Zmc2V0ID0gR0VUX1BXUl9DRkdfT0ZGU0VUKFB3ckNmZ0NtZCk7Ci0KLQkJCQkvKiAgUmVhZCB0aGUgdmFsdWUgZnJvbSBzeXN0ZW0gcmVnaXN0ZXIgKi8KLQkJCQl2YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgb2Zmc2V0KTsKLQotCQkJCXZhbHVlICY9IH4oR0VUX1BXUl9DRkdfTUFTSyhQd3JDZmdDbWQpKTsKLQkJCQl2YWx1ZSB8PSAoR0VUX1BXUl9DRkdfVkFMVUUoUHdyQ2ZnQ21kKSAmCi0JCQkJCSAgR0VUX1BXUl9DRkdfTUFTSyhQd3JDZmdDbWQpKTsKLQotCQkJCS8qICBXcml0ZSB0aGUgdmFsdWUgYmFjayB0byBzeXN0ZW0gcmVnaXN0ZXIgKi8KLQkJCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBvZmZzZXQsIHZhbHVlKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBQV1JfQ01EX1BPTExJTkc6Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBQV1JfQ01EX1BPTExJTkdcbiIpOwotCi0JCQkJYlBvbGxpbmdCaXQgPSBmYWxzZTsKLQkJCQlvZmZzZXQgPSBHRVRfUFdSX0NGR19PRkZTRVQoUHdyQ2ZnQ21kKTsKLQkJCQlkbyB7Ci0JCQkJCXZhbHVlID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLAotCQkJCQkJCQlvZmZzZXQpOwotCi0JCQkJCXZhbHVlICY9IEdFVF9QV1JfQ0ZHX01BU0soUHdyQ2ZnQ21kKTsKLQkJCQkJaWYgKHZhbHVlID09Ci0JCQkJCSAgICAoR0VUX1BXUl9DRkdfVkFMVUUoUHdyQ2ZnQ21kKSAmCi0JCQkJCSAgICAgR0VUX1BXUl9DRkdfTUFTSyhQd3JDZmdDbWQpKSkKLQkJCQkJCWJQb2xsaW5nQml0ID0gdHJ1ZTsKLQkJCQkJZWxzZQotCQkJCQkJdWRlbGF5KDEwKTsKLQotCQkJCQlpZiAocG9sbGluZ0NvdW50KysgPiBtYXhQb2xsaW5nQ250KSB7Ci0JCQkJCQlEQkdfODcyM0EoIkZhaWwgdG8gcG9sbGluZyAiCi0JCQkJCQkJICAiT2Zmc2V0WyUjeF1cbiIsCi0JCQkJCQkJICBvZmZzZXQpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfSB3aGlsZSAoIWJQb2xsaW5nQml0KTsKLQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFBXUl9DTURfREVMQVk6Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBQV1JfQ01EX0RFTEFZXG4iKTsKLQkJCQlpZiAoR0VUX1BXUl9DRkdfVkFMVUUoUHdyQ2ZnQ21kKSA9PQotCQkJCSAgICBQV1JTRVFfREVMQVlfVVMpCi0JCQkJCXVkZWxheShHRVRfUFdSX0NGR19PRkZTRVQoUHdyQ2ZnQ21kKSk7Ci0JCQkJZWxzZQotCQkJCQl1ZGVsYXkoR0VUX1BXUl9DRkdfT0ZGU0VUKFB3ckNmZ0NtZCkgKgotCQkJCQkgICAgICAgMTAwMCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUFdSX0NNRF9FTkQ6Ci0JCQkJLyogIFdoZW4gdGhpcyBjb21tYW5kIGlzIHBhcnNlZCwgZW5kCi0JCQkJICAgIHRoZSBwcm9jZXNzICovCi0JCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBQV1JfQ01EX0VORFxuIik7Ci0JCQkJcmV0dXJuIHRydWU7Ci0KLQkJCWRlZmF1bHQ6Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJCQkgIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6IFVua25vd24gQ01EISFcbiIpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJQXJ5SWR4Kys7CS8qIEFkZCBBcnJheSBJbmRleCAqLwotCX0gd2hpbGUgKDEpOwotCi0JcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9oYWxfY29tLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9oYWxfY29tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkN2IxMWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvaGFsX2NvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsODUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2luY2x1ZGUgPGhhbF9pbnRmLmg+Ci0jaW5jbHVkZSA8aGFsX2NvbS5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotI2RlZmluZSBfSEFMX0lOSVRfQ18KLQotI2RlZmluZQlFRVBST01fQ0hBTk5FTF9QTEFOX0JZX0hXX01BU0sJMHg4MAotCi0vKiByZXR1cm4gdGhlIGZpbmFsIGNoYW5uZWwgcGxhbiBkZWNpc2lvbiAqLwotLyogaHdfY2hhbm5lbF9wbGFuOiAgY2hhbm5lbCBwbGFuIGZyb20gSFcgKGVmdXNlL2VlcHJvbSkgKi8KLS8qIHN3X2NoYW5uZWxfcGxhbjogIGNoYW5uZWwgcGxhbiBmcm9tIFNXIChyZWdpc3RyeS9tb2R1bGUgcGFyYW0pICovCi0vKiBkZWZfY2hhbm5lbF9wbGFuOiBjaGFubmVsIHBsYW4gdXNlZCB3aGVuIHRoZSBmb3JtZXIgdHdvIGlzIGludmFsaWQgKi8KLXU4IGhhbF9jb21fZ2V0X2NoYW5uZWxfcGxhbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBod19jaGFubmVsX3BsYW4sCi0JCQkgICAgdTggc3dfY2hhbm5lbF9wbGFuLCB1OCBkZWZfY2hhbm5lbF9wbGFuLAotCQkJICAgIGJvb2wgQXV0b0xvYWRGYWlsKQotewotCXU4IHN3Q29uZmlnOwotCXU4IGNobmxQbGFuOwotCi0Jc3dDb25maWcgPSB0cnVlOwotCWlmICghQXV0b0xvYWRGYWlsKSB7Ci0JCWlmICghcnR3X2lzX2NoYW5uZWxfcGxhbl92YWxpZChzd19jaGFubmVsX3BsYW4pKQotCQkJc3dDb25maWcgPSBmYWxzZTsKLQkJaWYgKGh3X2NoYW5uZWxfcGxhbiAmIEVFUFJPTV9DSEFOTkVMX1BMQU5fQllfSFdfTUFTSykKLQkJCXN3Q29uZmlnID0gZmFsc2U7Ci0JfQotCi0JaWYgKHN3Q29uZmlnID09IHRydWUpCi0JCWNobmxQbGFuID0gc3dfY2hhbm5lbF9wbGFuOwotCWVsc2UKLQkJY2hubFBsYW4gPSBod19jaGFubmVsX3BsYW4gJiAofkVFUFJPTV9DSEFOTkVMX1BMQU5fQllfSFdfTUFTSyk7Ci0KLQlpZiAoIXJ0d19pc19jaGFubmVsX3BsYW5fdmFsaWQoY2hubFBsYW4pKQotCQljaG5sUGxhbiA9IGRlZl9jaGFubmVsX3BsYW47Ci0KLQlyZXR1cm4gY2hubFBsYW47Ci19Ci0KLXU4IE1SYXRlVG9Id1JhdGUyM2EodTggcmF0ZSkKLXsKLQl1OCByZXQgPSBERVNDX1JBVEUxTTsKLQotCXN3aXRjaCAocmF0ZSkgewotCQkvKiAgQ0NLIGFuZCBPRkRNIG5vbi1IVCByYXRlcyAqLwotCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzFNQjoKLQkJcmV0ID0gREVTQ19SQVRFMU07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzJNQjoKLQkJcmV0ID0gREVTQ19SQVRFMk07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzVNQjoKLQkJcmV0ID0gREVTQ19SQVRFNV81TTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjoKLQkJcmV0ID0gREVTQ19SQVRFMTFNOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgotCQlyZXQgPSBERVNDX1JBVEU2TTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQjoKLQkJcmV0ID0gREVTQ19SQVRFOU07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xMk1COgotCQlyZXQgPSBERVNDX1JBVEUxMk07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8xOE1COgotCQlyZXQgPSBERVNDX1JBVEUxOE07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COgotCQlyZXQgPSBERVNDX1JBVEUyNE07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8zNk1COgotCQlyZXQgPSBERVNDX1JBVEUzNk07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV80OE1COgotCQlyZXQgPSBERVNDX1JBVEU0OE07Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV81NE1COgotCQlyZXQgPSBERVNDX1JBVEU1NE07Ci0JCWJyZWFrOwotCi0JCS8qICBIVCByYXRlcyBzaW5jZSBoZXJlICovCi0JCS8qIGNhc2UgTUdOX01DUzA6CXJldCA9IERFU0NfUkFURU1DUzA7ICAgIGJyZWFrOyAqLwotCQkvKiBjYXNlIE1HTl9NQ1MxOglyZXQgPSBERVNDX1JBVEVNQ1MxOyAgICBicmVhazsgKi8KLQkJLyogY2FzZSBNR05fTUNTMjoJcmV0ID0gREVTQ19SQVRFTUNTMjsgICAgYnJlYWs7ICovCi0JCS8qIGNhc2UgTUdOX01DUzM6CXJldCA9IERFU0NfUkFURU1DUzM7ICAgIGJyZWFrOyAqLwotCQkvKiBjYXNlIE1HTl9NQ1M0OglyZXQgPSBERVNDX1JBVEVNQ1M0OyAgICBicmVhazsgKi8KLQkJLyogY2FzZSBNR05fTUNTNToJcmV0ID0gREVTQ19SQVRFTUNTNTsgICAgYnJlYWs7ICovCi0JCS8qIGNhc2UgTUdOX01DUzY6CXJldCA9IERFU0NfUkFURU1DUzY7ICAgIGJyZWFrOyAqLwotCQkvKiBjYXNlIE1HTl9NQ1M3OglyZXQgPSBERVNDX1JBVEVNQ1M3OyAgICBicmVhazsgKi8KLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIEhhbFNldEJyYXRlQ2ZnMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICptQnJhdGVzT1MpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggaSwgaXNfYnJhdGUsIGJyYXRlOwotCXUxNiBicmF0ZV9jZmcgPSAwOwotCXU4IHJhdGVfaW5kZXg7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYOyBpKyspIHsKLQkJaXNfYnJhdGUgPSBtQnJhdGVzT1NbaV0gJiBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLOwotCQlicmF0ZSA9IG1CcmF0ZXNPU1tpXSAmIDB4N2Y7Ci0KLQkJaWYgKGlzX2JyYXRlKSB7Ci0JCQlzd2l0Y2ggKGJyYXRlKSB7Ci0JCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfMU07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfMk07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9DQ0tfUkFURV81TUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfNV81TTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzExTUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfMTFNOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV82TTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUVFRTgwMjExX09GRE1fUkFURV85TUI6Ci0JCQkJYnJhdGVfY2ZnIHw9IFJBVEVfOU07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV8xMk07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV8xOE07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV8yNE07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV8zNk07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV80OE07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjoKLQkJCQlicmF0ZV9jZmcgfD0gUkFURV81NE07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAgMjAwNy4wMS4xNiwgYnkgRW1pbHkgKi8KLQkvKiAgU2VsZWN0IFJSU1IgKGluIExlZ2FjeS1PRkRNIGFuZCBDQ0spICovCi0JLyogIEZvciA4MTkwLCB3ZSBzZWxlY3Qgb25seSAyNE0sIDEyTSwgNk0sIDExTSwgNS41TSwgMk0sCi0JICAgIGFuZCAxTSBmcm9tIHRoZSBCYXNpYyByYXRlLiAqLwotCS8qICBXZSBkbyBub3QgdXNlIG90aGVyIHJhdGVzLiAqLwotCS8qIDIwMTEuMDMuMzAgYWRkIGJ5IEx1a2UgTGVlICovCi0JLyogQ0NLIDJNIEFDSyBzaG91bGQgYmUgZGlzYWJsZWQgZm9yIHNvbWUgQkNNIGFuZCBBdGhlcm9zIEFQIElPVCAqLwotCS8qIGJlY2F1c2UgQ0NLIDJNIGhhcyBwb29yIFRYRVZNICovCi0JLyogQ0NLIDUuNU0gJiAxMU0gQUNLIHNob3VsZCBiZSBlbmFibGVkIGZvciBiZXR0ZXIKLQkgICBwZXJmb3JtYW5jZSAqLwotCi0JYnJhdGVfY2ZnID0gKGJyYXRlX2NmZyB8IDB4ZCkgJiAweDE1ZDsKLQlwSGFsRGF0YS0+QmFzaWNSYXRlU2V0ID0gYnJhdGVfY2ZnOwotCWJyYXRlX2NmZyB8PSAweDAxOwkvKiAgZGVmYXVsdCBlbmFibGUgMU0gQUNLIHJhdGUgKi8KLQlEQkdfODcyM0EoIkhXX1ZBUl9CQVNJQ19SQVRFOiBCcmF0ZUNmZyglI3gpXG4iLCBicmF0ZV9jZmcpOwotCi0JLyogIFNldCBSUlNSIHJhdGUgdGFibGUuICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JSU1IsIGJyYXRlX2NmZyAmIDB4ZmYpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SUlNSICsgMSwgKGJyYXRlX2NmZyA+PiA4KSAmIDB4ZmYpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SUlNSICsgMiwKLQkJCSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19SUlNSICsgMikgJiAweGYwKTsKLQotCXJhdGVfaW5kZXggPSAwOwotCS8qICBTZXQgUlRTIGluaXRpYWwgcmF0ZSAqLwotCXdoaWxlIChicmF0ZV9jZmcgPiAweDEpIHsKLQkJYnJhdGVfY2ZnID4+PSAxOwotCQlyYXRlX2luZGV4Kys7Ci0JfQotCQkvKiAgWml2IC0gQ2hlY2sgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfSU5JUlRTX1JBVEVfU0VMLCByYXRlX2luZGV4KTsKLX0KLQotc3RhdGljIHZvaWQgX09uZU91dFBpcGVNYXBwaW5nKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBBZGFwdGVyKTsKLQotCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMF0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07CS8qIFZPICovCi0JcGR2b2JqcHJpdi0+UXVldWUyUGlwZVsxXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsJLyogVkkgKi8KLQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzJdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOwkvKiBCRSAqLwotCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbM10gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07CS8qIEJLICovCi0KLQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzRdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOwkvKiBCQ04gKi8KLQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzVdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOwkvKiBNR1QgKi8KLQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzZdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOwkvKiBISUdIICovCi0JcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs3XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsJLyogVFhDTUQgKi8KLX0KLQotc3RhdGljIHZvaWQgX1R3b091dFBpcGVNYXBwaW5nKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIGJvb2wgYldJRklDZmcpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBBZGFwdGVyKTsKLQotCWlmIChiV0lGSUNmZykgewkJLyogV01NICovCi0JCS8qICAgIEJLLCAgIEJFLCAgIFZJLCAgIFZPLCAgIEJDTiwgIENNRCwgIE1HVCwgSElHSCwgSENDQSAqLwotCQkvKiAgICAgMCwgICAgMSwgICAgMCwgICAgMSwgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfTsgKi8KLQkJLyogMDpILCAxOkwgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVswXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVsxXTsgLyogVk8gKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVsxXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogVkkgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVsyXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVsxXTsgLyogQkUgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVszXSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogQksgKi8KLQotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzRdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBCQ04gKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs1XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogTUdUICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNl0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIEhJR0ggKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs3XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogVFhDTUQqLwotCX0gZWxzZSB7CQkvKiB0eXBpY2FsIHNldHRpbmcgKi8KLQkJLyogICAgQkssICAgQkUsICAgVkksICAgVk8sICAgQkNOLCAgQ01ELCAgTUdULCBISUdILCBIQ0NBICovCi0JCS8qICAgICAxLCAgICAxLCAgICAwLCAgICAwLCAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9OyAqLwotCQkvKiAwOkgsIDE6TCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzBdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBWTyAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzFdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBWSSAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzJdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzFdOyAvKiBCRSAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzNdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzFdOyAvKiBCSyAqLwotCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNF0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIEJDTiAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzVdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBNR1QgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs2XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogSElHSCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzddID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBUWENNRCovCi0JfQotfQotCi1zdGF0aWMgdm9pZCBfVGhyZWVPdXRQaXBlTWFwcGluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBib29sIGJXSUZJQ2ZnKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwQWRhcHRlcik7Ci0KLQlpZiAoYldJRklDZmcpIHsJCS8qIGZvciBXTU0gKi8KLQkJLyogICAgQkssICAgQkUsICAgVkksICAgVk8sICAgQkNOLCAgQ01ELCAgTUdULCBISUdILCBIQ0NBICovCi0JCS8qICAgICAxLCAgICAyLCAgICAxLCAgICAwLCAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9OyAqLwotCQkvKiAwOkgsIDE6TiwgMjpMICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMF0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIFZPICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMV0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMV07IC8qIFZJICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbMl0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMl07IC8qIEJFICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbM10gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMV07IC8qIEJLICovCi0KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs0XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogQkNOICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNV0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIE1HVCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzZdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBISUdIICovCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbN10gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIFRYQ01EKi8KLQl9IGVsc2UgewkJLyogdHlwaWNhbCBzZXR0aW5nICovCi0JCS8qICAgIEJLLCAgIEJFLCAgIFZJLCAgIFZPLCAgIEJDTiwgIENNRCwgIE1HVCwgSElHSCwgSENDQSAqLwotCQkvKiAgICAgMiwgICAgMiwgICAgMSwgICAgMCwgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfTsgKi8KLQkJLyogMDpILCAxOk4sIDI6TCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzBdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBWTyAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzFdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzFdOyAvKiBWSSAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzJdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzJdOyAvKiBCRSAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzNdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzJdOyAvKiBCSyAqLwotCi0JCXBkdm9ianByaXYtPlF1ZXVlMlBpcGVbNF0gPSBwZHZvYmpwcml2LT5SdE91dFBpcGVbMF07IC8qIEJDTiAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzVdID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBNR1QgKi8KLQkJcGR2b2JqcHJpdi0+UXVldWUyUGlwZVs2XSA9IHBkdm9ianByaXYtPlJ0T3V0UGlwZVswXTsgLyogSElHSCAqLwotCQlwZHZvYmpwcml2LT5RdWV1ZTJQaXBlWzddID0gcGR2b2JqcHJpdi0+UnRPdXRQaXBlWzBdOyAvKiBUWENNRCovCi0JfQotfQotCi1ib29sIEhhbF9NYXBwaW5nT3V0UGlwZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBOdW1PdXRQaXBlKQotewotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJnBBZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JYm9vbCBiV0lGSUNmZyA9IChwcmVnaXN0cnlwcml2LT53aWZpX3NwZWMpID8gdHJ1ZSA6IGZhbHNlOwotCWJvb2wgcmVzdWx0ID0gdHJ1ZTsKLQotCXN3aXRjaCAoTnVtT3V0UGlwZSkgewotCWNhc2UgMjoKLQkJX1R3b091dFBpcGVNYXBwaW5nKHBBZGFwdGVyLCBiV0lGSUNmZyk7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJX1RocmVlT3V0UGlwZU1hcHBpbmcocEFkYXB0ZXIsIGJXSUZJQ2ZnKTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlfT25lT3V0UGlwZU1hcHBpbmcocEFkYXB0ZXIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXN1bHQgPSBmYWxzZTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSogQzJIIGV2ZW50IGZvcm1hdDoKLSogRmllbGQJIFRSSUdHRVIJCUNPTlRFTlQJICAgQ01EX1NFUQlDTURfTEVOCQkgQ01EX0lECi0qIEJJVFMJIFsxMjc6MTIwXQlbMTE5OjE2XSAgICAgIFsxNTo4XQkJICBbNzo0XQkJICAgWzM6MF0KLSovCi0KLXZvaWQgYzJoX2V2dF9jbGVhcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JcnRsODcyM2F1X3dyaXRlOChhZGFwdGVyLCBSRUdfQzJIRVZUX0NMRUFSLCBDMkhfRVZUX0hPU1RfQ0xPU0UpOwotfQotCi1pbnQgYzJoX2V2dF9yZWFkMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggKmJ1ZikKLXsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0Jc3RydWN0IGMyaF9ldnRfaGRyICpjMmhfZXZ0OwotCWludCBpOwotCXU4IHRyaWdnZXI7Ci0KLQlpZiAoYnVmID09IE5VTEwpCi0JCWdvdG8gZXhpdDsKLQotCXRyaWdnZXIgPSBydGw4NzIzYXVfcmVhZDgoYWRhcHRlciwgUkVHX0MySEVWVF9DTEVBUik7Ci0KLQlpZiAodHJpZ2dlciA9PSBDMkhfRVZUX0hPU1RfQ0xPU0UpCi0JCWdvdG8gZXhpdDsJLyogTm90IHJlYWR5ICovCi0JaWYgKHRyaWdnZXIgIT0gQzJIX0VWVF9GV19DTE9TRSkKLQkJZ290byBjbGVhcl9ldnQ7CS8qIE5vdCBhIHZhbGlkIHZhbHVlICovCi0KLQljMmhfZXZ0ID0gKHN0cnVjdCBjMmhfZXZ0X2hkciAqKWJ1ZjsKLQotCW1lbXNldChjMmhfZXZ0LCAwLCAxNik7Ci0KLQkqYnVmID0gcnRsODcyM2F1X3JlYWQ4KGFkYXB0ZXIsIFJFR19DMkhFVlRfTVNHX05PUk1BTCk7Ci0JKihidWYgKyAxKSA9IHJ0bDg3MjNhdV9yZWFkOChhZGFwdGVyLCBSRUdfQzJIRVZUX01TR19OT1JNQUwgKyAxKTsKLQotCVJUX1BSSU5UX0RBVEEoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgImMyaF9ldnRfcmVhZDIzYSgpOiAiLAotCQkgICAgICAmYzJoX2V2dCwgc2l6ZW9mKGMyaF9ldnQpKTsKLQotCWlmICgwKSB7Ci0JCURCR184NzIzQSgiJXMgaWQ6JXUsIGxlbjoldSwgc2VxOiV1LCB0cmlnZ2VyOjB4JTAyeFxuIiwKLQkJCSAgX19mdW5jX18sIGMyaF9ldnQtPmlkLCBjMmhfZXZ0LT5wbGVuLCBjMmhfZXZ0LT5zZXEsCi0JCQkgIHRyaWdnZXIpOwotCX0KLQotCS8qIFJlYWQgdGhlIGNvbnRlbnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgYzJoX2V2dC0+cGxlbjsgaSsrKQotCQljMmhfZXZ0LT5wYXlsb2FkW2ldID0gcnRsODcyM2F1X3JlYWQ4KGFkYXB0ZXIsCi0JCQkJCQlSRUdfQzJIRVZUX01TR19OT1JNQUwgKwotCQkJCQkJc2l6ZW9mKCpjMmhfZXZ0KSArIGkpOwotCi0JUlRfUFJJTlRfREFUQShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgICAgICAiYzJoX2V2dF9yZWFkMjNhKCk6IENvbW1hbmQgQ29udGVudDpcbiIsIGMyaF9ldnQtPnBheWxvYWQsCi0JCSAgICAgIGMyaF9ldnQtPnBsZW4pOwotCi0JcmV0ID0gX1NVQ0NFU1M7Ci0KLWNsZWFyX2V2dDoKLQkvKgotCSAqIENsZWFyIGV2ZW50IHRvIG5vdGlmeSBGVyB3ZSBoYXZlIHJlYWQgdGhlIGNvbW1hbmQuCi0JICogSWYgdGhpcyBmaWVsZCBpc24ndCBjbGVhciwgdGhlIEZXIHdvbid0IHVwZGF0ZSB0aGUKLQkgKiBuZXh0IGNvbW1hbmQgbWVzc2FnZS4KLQkgKi8KLQljMmhfZXZ0X2NsZWFyMjNhKGFkYXB0ZXIpOwotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkCi1ydGw4NzIzYV9zZXRfYW1wZHVfbWluX3NwYWNlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IE1pblNwYWNpbmdUb1NldCkKLXsKLQl1OCBTZWNNaW5TcGFjZTsKLQotCWlmIChNaW5TcGFjaW5nVG9TZXQgPD0gNykgewotCQlzd2l0Y2ggKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSkgewotCQljYXNlIDA6Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJCVNlY01pblNwYWNlID0gMDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCQlTZWNNaW5TcGFjZSA9IDY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVNlY01pblNwYWNlID0gNzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKE1pblNwYWNpbmdUb1NldCA8IFNlY01pblNwYWNlKQotCQkJTWluU3BhY2luZ1RvU2V0ID0gU2VjTWluU3BhY2U7Ci0KLQkJTWluU3BhY2luZ1RvU2V0IHw9Ci0JCQlydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19BTVBEVV9NSU5fU1BBQ0UpICYgMHhmODsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0FNUERVX01JTl9TUEFDRSwKLQkJCQkgTWluU3BhY2luZ1RvU2V0KTsKLQl9Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X2FtcGR1X2ZhY3RvcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBGYWN0b3JUb1NldCkKLXsKLQl1OCBSZWdUb1NldF9Ob3JtYWxbNF0gPSB7IDB4NDEsIDB4YTgsIDB4NzIsIDB4YjkgfTsKLQl1OCBNYXhBZ2dOdW07Ci0JdTggKnBSZWdUb1NldDsKLQl1OCBpbmRleCA9IDA7Ci0KLQlwUmVnVG9TZXQgPSBSZWdUb1NldF9Ob3JtYWw7CS8qICAweGI5NzJhODQxOyAqLwotCi0JaWYgKHJ0bDg3MjNhX0JUX2VuYWJsZWQocGFkYXB0ZXIpICYmCi0JICAgIHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikpCi0JCU1heEFnZ051bSA9IDB4ODsKLQllbHNlCi0JCU1heEFnZ051bSA9IDB4RjsKLQotCWlmIChGYWN0b3JUb1NldCA8PSAzKSB7Ci0JCUZhY3RvclRvU2V0ID0gMSA8PCAoRmFjdG9yVG9TZXQgKyAyKTsKLQkJaWYgKEZhY3RvclRvU2V0ID4gTWF4QWdnTnVtKQotCQkJRmFjdG9yVG9TZXQgPSBNYXhBZ2dOdW07Ci0KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNDsgaW5kZXgrKykgewotCQkJaWYgKChwUmVnVG9TZXRbaW5kZXhdICYgMHhmMCkgPiAoRmFjdG9yVG9TZXQgPDwgNCkpCi0JCQkJcFJlZ1RvU2V0W2luZGV4XSA9IChwUmVnVG9TZXRbaW5kZXhdICYgMHgwZikgfAotCQkJCQkoRmFjdG9yVG9TZXQgPDwgNCk7Ci0KLQkJCWlmICgocFJlZ1RvU2V0W2luZGV4XSAmIDB4MGYpID4gRmFjdG9yVG9TZXQpCi0JCQkJcFJlZ1RvU2V0W2luZGV4XSA9IChwUmVnVG9TZXRbaW5kZXhdICYgMHhmMCkgfAotCQkJCQlGYWN0b3JUb1NldDsKLQotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0FHR0xFTl9MTVQgKyBpbmRleCwKLQkJCQkJIHBSZWdUb1NldFtpbmRleF0pOwotCQl9Ci0JfQotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9hY21fY3RybChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBjdHJsKQotewotCXU4IGh3Y3RybCA9IDA7Ci0KLQlpZiAoY3RybCAhPSAwKSB7Ci0JCWh3Y3RybCB8PSBBY21Id19Id0VuOwotCi0JCWlmIChjdHJsICYgQklUKDEpKQkvKiAgQkUgKi8KLQkJCWh3Y3RybCB8PSBBY21Id19CZXFFbjsKLQotCQlpZiAoY3RybCAmIEJJVCgyKSkJLyogIFZJICovCi0JCQlod2N0cmwgfD0gQWNtSHdfVmlxRW47Ci0KLQkJaWYgKGN0cmwgJiBCSVQoMykpCS8qICBWTyAqLwotCQkJaHdjdHJsIHw9IEFjbUh3X1ZvcUVuOwotCX0KLQotCURCR184NzIzQSgiW0hXX1ZBUl9BQ01fQ1RSTF0gV3JpdGUgMHglMDJYXG4iLCBod2N0cmwpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19BQ01IV0NUUkwsIGh3Y3RybCk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzdGF0dXMpCi17Ci0JdTggdmFsODsKLQotCXZhbDggPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIE1TUikgJiAweDBjOwotCXZhbDggfD0gc3RhdHVzOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIE1TUiwgdmFsOCk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1czEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc3RhdHVzKQotewotCXU4IHZhbDg7Ci0KLQl2YWw4ID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBNU1IpICYgMHgwMzsKLQl2YWw4IHw9IHN0YXR1cyA8PCAyOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIE1TUiwgdmFsOCk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X2Jjbl9mdW5jKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHZhbCkKLXsKLQlpZiAodmFsKQotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCBFTl9CQ05fRlVOQ1RJT04gfCBFTl9UWEJDTl9SUFQsIDApOwotCWVsc2UKLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgMCwgRU5fQkNOX0ZVTkNUSU9OIHwgRU5fVFhCQ05fUlBUKTsKLX0KLQotdm9pZCBydGw4NzIzYV9jaGVja19ic3NpZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWwpCi17Ci0JdTMyIHZhbDMyOwotCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUkNSKTsKLQlpZiAodmFsKQotCQl2YWwzMiB8PSBSQ1JfQ0JTU0lEX0RBVEEgfCBSQ1JfQ0JTU0lEX0JDTjsKLQllbHNlCi0JCXZhbDMyICY9IH4oUkNSX0NCU1NJRF9EQVRBIHwgUkNSX0NCU1NJRF9CQ04pOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUkNSLCB2YWwzMik7Ci19Ci0KLXZvaWQgcnRsODcyM2FfbWxtZV9zaXRlc3VydmV5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGZsYWcpCi17Ci0JaWYgKGZsYWcpIHsJLyogdW5kZXIgc2l0ZXN1cnZleSAqLwotCQl1MzIgdjMyOwotCi0JCS8qICBjb25maWcgUkNSIHRvIHJlY2VpdmUgZGlmZmVyZW50IEJTU0lEICYgbm90Ci0JCSAgICB0byByZWNlaXZlIGRhdGEgZnJhbWUgKi8KLQkJdjMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1JDUik7Ci0JCXYzMiAmPSB+KFJDUl9DQlNTSURfQkNOKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsIHYzMik7Ci0JCS8qICByZWplY3QgYWxsIGRhdGEgZnJhbWUgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19SWEZMVE1BUDIsIDApOwotCi0JCS8qICBkaXNhYmxlIHVwZGF0ZSBUU0YgKi8KLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgRElTX1RTRl9VRFQsIDApOwotCX0gZWxzZSB7CS8qIHNpdGVzdXJ2ZXkgZG9uZSAqLwotCi0JCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm87Ci0JCXUzMiB2MzI7Ci0KLQkJcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCQlpZiAoKGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwMjNhKHBhZGFwdGVyKSA9PSB0cnVlKSB8fAotCQkgICAgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FESE9DKSB8fAotCQkgICAgKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FQKSkgewotCQkJLyogIGVuYWJsZSB0byByeCBkYXRhIGZyYW1lICovCi0JCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1JYRkxUTUFQMiwgMHhGRkZGKTsKLQotCQkJLyogIGVuYWJsZSB1cGRhdGUgVFNGICovCi0JCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCAwLCBESVNfVFNGX1VEVCk7Ci0JCX0KLQotCQl2MzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUkNSKTsKLQkJdjMyIHw9IFJDUl9DQlNTSURfQkNOOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX1JDUiwgdjMyKTsKLQl9Ci0KLQlydGw4NzIzYV9CVF93aWZpc2Nhbl9ub3RpZnkocGFkYXB0ZXIsIGZsYWcgPyB0cnVlIDogZmFsc2UpOwotfQotCi12b2lkIHJ0bDg3MjNhX29uX3Jjcl9hbShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUkNSLAotCQkgICAgcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1JDUikgfCBSQ1JfQU0pOwotCURCR184NzIzQSgiJXMsICVkLCBSQ1IgPSAleFxuIiwgX19mdW5jX18sIF9fTElORV9fLAotCQkgIHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19SQ1IpKTsKLX0KLQotdm9pZCBydGw4NzIzYV9vZmZfcmNyX2FtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsCi0JCSAgICBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUkNSKSAmICh+UkNSX0FNKSk7Ci0JREJHXzg3MjNBKCIlcywgJWQsIFJDUiA9ICV4XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCi0JCSAgcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1JDUikpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9zbG90X3RpbWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2xvdHRpbWUpCi17Ci0JdTggdTFiQUlGUywgYVNpZnNUaW1lOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU0xPVCwgc2xvdHRpbWUpOwotCi0JaWYgKHBtbG1laW5mby0+V01NX2VuYWJsZSA9PSAwKSB7Ci0JCWlmIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPT0gV0lSRUxFU1NfMTFCKQotCQkJYVNpZnNUaW1lID0gMTA7Ci0JCWVsc2UKLQkJCWFTaWZzVGltZSA9IDE2OwotCi0JCXUxYkFJRlMgPSBhU2lmc1RpbWUgKyAoMiAqIHBtbG1laW5mby0+c2xvdFRpbWUpOwotCi0JCS8qICA8Um9nZXJfRVhQPiBUZW1wb3JhcnkgcmVtb3ZlZCwgMjAwOC4wNi4yMC4gKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0VEQ0FfVk9fUEFSQU0sIHUxYkFJRlMpOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRURDQV9WSV9QQVJBTSwgdTFiQUlGUyk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19FRENBX0JFX1BBUkFNLCB1MWJBSUZTKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0VEQ0FfQktfUEFSQU0sIHUxYkFJRlMpOwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9hY2tfcHJlYW1ibGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlNob3J0UHJlYW1ibGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggcmVnVG1wOwotCi0JLyogIEpvc2VwaCBtYXJrZWQgb3V0IGZvciBOZXRnZWFyIDM1MDAgVEtJUAotCSAgICBjaGFubmVsIDcgaXNzdWUuKFRlbXBvcmFyaWx5KSAqLwotCXJlZ1RtcCA9IChwSGFsRGF0YS0+bkN1cjQwTWh6UHJpbWVTQykgPDwgNTsKLQkvKiByZWdUbXAgPSAwOyAqLwotCWlmIChiU2hvcnRQcmVhbWJsZSkKLQkJcmVnVG1wIHw9IDB4ODA7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JSU1IgKyAyLCByZWdUbXApOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9zZWNfY2ZnKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNlYykKLXsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU0VDQ0ZHLCBzZWMpOwotfQotCi12b2lkIHJ0bDg3MjNhX2NhbV9lbXB0eV9lbnRyeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB1Y0luZGV4KQotewotCXU4IGk7Ci0JdTMyIHVsQ29tbWFuZCA9IDA7Ci0JdTMyIHVsQ29udGVudCA9IDA7Ci0JdTMyIHVsRW5jQWxnbyA9IENBTV9BRVM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQ0FNX0NPTlRFTlRfQ09VTlQ7IGkrKykgewotCQkvKiAgZmlsbGVkIGlkIGluIENBTSBjb25maWcgMiBieXRlICovCi0JCWlmIChpID09IDApIHsKLQkJCXVsQ29udGVudCB8PSAodWNJbmRleCAmIDB4MDMpIHwKLQkJCQkoKHUxNikgKHVsRW5jQWxnbykgPDwgMik7Ci0JCQkvKiB1bENvbnRlbnQgfD0gQ0FNX1ZBTElEOyAqLwotCQl9IGVsc2UgewotCQkJdWxDb250ZW50ID0gMDsKLQkJfQotCQkvKiAgcG9sbGluZyBiaXQsIGFuZCBObyBXcml0ZSBlbmFibGUsIGFuZCBhZGRyZXNzICovCi0JCXVsQ29tbWFuZCA9IENBTV9DT05URU5UX0NPVU5UICogdWNJbmRleCArIGk7Ci0JCXVsQ29tbWFuZCA9IHVsQ29tbWFuZCB8IENBTV9QT0xMSU5JRyB8IENBTV9XUklURTsKLQkJLyogIHdyaXRlIGNvbnRlbnQgMCBpcyBlcXVhbGwgdG8gbWFyayBpbnZhbGlkICovCi0JCS8qIGRlbGF5X21zKDQwKTsgKi8KLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFdDQU1JLCB1bENvbnRlbnQpOwotCQkvKiBkZWxheV9tcyg0MCk7ICovCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfQ0FNQ01ELCB1bENvbW1hbmQpOwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9jYW1faW52YWxpZGF0ZV9hbGwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0NBTUNNRCwgQ0FNX1BPTExJTklHIHwgQklUKDMwKSk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfY2FtX3dyaXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1OCBlbnRyeSwgdTE2IGN0cmwsIGNvbnN0IHU4ICptYWMsIGNvbnN0IHU4ICprZXkpCi17Ci0JdTMyIGNtZDsKLQl1bnNpZ25lZCBpbnQgaSwgdmFsLCBhZGRyOwotCWludCBqOwotCi0JYWRkciA9IGVudHJ5IDw8IDM7Ci0KLQlmb3IgKGogPSA1OyBqID49IDA7IGotLSkgewotCQlzd2l0Y2ggKGopIHsKLQkJY2FzZSAwOgotCQkJdmFsID0gY3RybCB8IChtYWNbMF0gPDwgMTYpIHwgKG1hY1sxXSA8PCAyNCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJdmFsID0gbWFjWzJdIHwgKG1hY1szXSA8PCA4KSB8Ci0JCQkJKG1hY1s0XSA8PCAxNikgfCAobWFjWzVdIDw8IDI0KTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaSA9IChqIC0gMikgPDwgMjsKLQkJCXZhbCA9IGtleVtpXSB8IChrZXlbaSsxXSA8PCA4KSB8Ci0JCQkJKGtleVtpKzJdIDw8IDE2KSB8IChrZXlbaSszXSA8PCAyNCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBXQ0FNSSwgdmFsKTsKLQkJY21kID0gQ0FNX1BPTExJTklHIHwgQ0FNX1dSSVRFIHwgKGFkZHIgKyBqKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19DQU1DTUQsIGNtZCk7Ci0KLQkJLyogREJHXzg3MjNBKCIlcyA9PiBjYW0gd3JpdGU6ICV4LCAleFxuIiwgX19mdW5jX18sIGNtZCwgdmFsKTsqLwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9maWZvX2NsZWFudXAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLSNkZWZpbmUgUldfUkVMRUFTRV9FTgkJQklUKDE4KQotI2RlZmluZSBSWERNQV9JRExFCQlCSVQoMTcpCi0KLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQl1OCB0cnljbnQgPSAxMDA7Ci0KLQkvKiAgcGF1c2UgdHggKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfVFhQQVVTRSwgMHhmZik7Ci0KLQkvKiAga2VlcCBzbiAqLwotCXBhZGFwdGVyLT54bWl0cHJpdi5ucW9zX3NzbiA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX05RT1NfU0VRKTsKLQotCWlmIChwd3Jwcml2LT5ia2VlcGZ3YWxpdmUgIT0gdHJ1ZSkgewotCQl1MzIgdjMyOwotCi0JCS8qICBSWCBETUEgc3RvcCAqLwotCQl2MzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUlhQS1RfTlVNKTsKLQkJdjMyIHw9IFJXX1JFTEVBU0VfRU47Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfUlhQS1RfTlVNLCB2MzIpOwotCQlkbyB7Ci0JCQl2MzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLAotCQkJCQkgICAgICAgUkVHX1JYUEtUX05VTSkgJiBSWERNQV9JRExFOwotCQkJaWYgKCF2MzIpCi0JCQkJYnJlYWs7Ci0JCX0gd2hpbGUgKHRyeWNudC0tKTsKLQkJaWYgKHRyeWNudCA9PSAwKQotCQkJREJHXzg3MjNBKCJTdG9wIFJYIERNQSBmYWlsZWQuLi4uLi5cbiIpOwotCi0JCS8qICBSUVBOIExvYWQgMCAqLwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1JRUE5fTlBRLCAwKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SUVBOLCAweDgwMDAwMDAwKTsKLQkJbWRlbGF5KDEwKTsKLQl9Ci19Ci0KLXZvaWQgcnRsODcyM2FfYmNuX3ZhbGlkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JLyogQkNOX1ZBTElELCBCSVQxNiBvZiBSRUdfVERFQ1RSTCA9IEJJVDAgb2YgUkVHX1RERUNUUkwrMiwKLQkgICB3cml0ZSAxIHRvIGNsZWFyLCBDbGVhciBieSBzdyAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19UREVDVFJMICsgMiwKLQkJCSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19UREVDVFJMICsgMikgfCBCSVQoMCkpOwotfQotCi1ib29sIHJ0bDg3MjNhX2dldF9iY25fdmFsaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlib29sIHJldHZhbDsKLQotCXJldHZhbCA9IChydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19UREVDVFJMICsgMikgJiBCSVQoMCkpID8gdHJ1ZSA6IGZhbHNlOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfYmVhY29uX2ludGVydmFsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBpbnRlcnZhbCkKLXsKLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX0JDTl9JTlRFUlZBTCwgaW50ZXJ2YWwpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9yZXNwX3NpZnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICB1OCByMnQxLCB1OCByMnQyLCB1OCB0MnQxLCB1OCB0MnQyKQotewotCS8qIFNJRlNfVGltZXIgPSAweDBhMGEwODA4OyAqLwotCS8qIFJFU1BfU0lGUyBmb3IgQ0NLICovCi0JLyogIFNJRlNfVDJUX0NDSyAoMHgwOCkgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfUjJUX1NJRlMsIHIydDEpOwotCS8qIFNJRlNfUjJUX0NDSygweDA4KSAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SMlRfU0lGUyArIDEsIHIydDIpOwotCS8qIFJFU1BfU0lGUyBmb3IgT0ZETSAqLwotCS8qIFNJRlNfVDJUX09GRE0gKDB4MGEpICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1QyVF9TSUZTLCB0MnQxKTsKLQkvKiBTSUZTX1IyVF9PRkRNKDB4MGEpICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1QyVF9TSUZTICsgMSwgdDJ0Mik7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X2FjX3BhcmFtX3ZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2bykKLXsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0VEQ0FfVk9fUEFSQU0sIHZvKTsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfYWNfcGFyYW1fdmkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHZpKQotewotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfRURDQV9WSV9QQVJBTSwgdmkpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9hY19wYXJhbV9iZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYmUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+QWNQYXJhbV9CRSA9IGJlOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfRURDQV9CRV9QQVJBTSwgYmUpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9hY19wYXJhbV9iayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYmspCi17Ci0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19FRENBX0JLX1BBUkFNLCBiayk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X3J4ZG1hX2FnZ19wZ190aChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWwpCi17Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JYRE1BX0FHR19QR19USCwgdmFsKTsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfaW5pdGlhbF9nYWluKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiByeF9nYWluKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBkaWdfdCAqcERpZ1RhYmxlID0gJnBIYWxEYXRhLT5vZG1wcml2LkRNX0RpZ1RhYmxlOwotCi0JaWYgKHJ4X2dhaW4gPT0gMHhmZikJLyogcmVzdG9yZSByeCBnYWluICovCi0JCU9ETV9Xcml0ZV9ESUcyM2EoJnBIYWxEYXRhLT5vZG1wcml2LCBwRGlnVGFibGUtPkJhY2t1cElHVmFsdWUpOwotCWVsc2UgewotCQlwRGlnVGFibGUtPkJhY2t1cElHVmFsdWUgPSBwRGlnVGFibGUtPkN1cklHVmFsdWU7Ci0JCU9ETV9Xcml0ZV9ESUcyM2EoJnBIYWxEYXRhLT5vZG1wcml2LCByeF9nYWluKTsKLQl9Ci19Ci0KLXZvaWQgcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9yZXN0b3JlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+b2RtcHJpdi5TdXBwb3J0QWJpbGl0eSA9IHBIYWxEYXRhLT5vZG1wcml2LkJLX1N1cHBvcnRBYmlsaXR5OwotfQotCi12b2lkIHJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfYmFja3VwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+b2RtcHJpdi5CS19TdXBwb3J0QWJpbGl0eSA9IHBIYWxEYXRhLT5vZG1wcml2LlN1cHBvcnRBYmlsaXR5OwotfQotCi12b2lkIHJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2YWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAodmFsID09IERZTkFNSUNfQUxMX0ZVTkNfRU5BQkxFKQotCQlwSGFsRGF0YS0+b2RtcHJpdi5TdXBwb3J0QWJpbGl0eSA9IHBIYWxEYXRhLT5kbXByaXYuSW5pdE9ETUZsYWc7Ci0JZWxzZQotCQlwSGFsRGF0YS0+b2RtcHJpdi5TdXBwb3J0QWJpbGl0eSB8PSB2YWw7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9jbHIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHZhbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCXBIYWxEYXRhLT5vZG1wcml2LlN1cHBvcnRBYmlsaXR5ICY9IHZhbDsKLX0KLQotdm9pZCBydGw4NzIzYV9zZXRfcnB3bShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWwpCi17Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1VTQl9IUlBXTSwgdmFsKTsKLX0KLQotdTggcnRsODcyM2FfZ2V0X3JmX3R5cGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCXJldHVybiBwSGFsRGF0YS0+cmZfdHlwZTsKLX0KLQotYm9vbCBydGw4NzIzYV9nZXRfZndscHNfcmZfb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlib29sIHJldHZhbDsKLQl1MzIgdmFsUkNSOwotCi0JLyogIFdoZW4gd2UgaGFsdCBOSUMsIHdlIHNob3VsZCBjaGVjayBpZiBGVyBMUFMgaXMgbGVhdmUuICovCi0KLQlpZiAoKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUpIHx8Ci0JICAgIChwYWRhcHRlci0+cHdyY3RybHByaXYucmZfcHdyc3RhdGUgPT0gcmZfb2ZmKSkgewotCQkvKiAgSWYgaXQgaXMgaW4gSFcvU1cgUmFkaW8gT0ZGIG9yIElQUyBzdGF0ZSwgd2UgZG8KLQkJICAgIG5vdCBjaGVjayBGdyBMUFMgTGVhdmUsIGJlY2F1c2UgRncgaXMgdW5sb2FkLiAqLwotCQlyZXR2YWwgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCXZhbFJDUiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19SQ1IpOwotCQlpZiAodmFsUkNSICYgMHgwMDA3MDAwMCkKLQkJCXJldHZhbCA9IGZhbHNlOwotCQllbHNlCi0JCQlyZXR2YWwgPSB0cnVlOwotCX0KLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLWJvb2wgcnRsODcyM2FfY2hrX2hpX3F1ZXVlX2VtcHR5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIGhncTsKLQotCWhncSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19IR1FfSU5GT1JNQVRJT04pOwotCi0JcmV0dXJuICgoaGdxICYgMHgwMDAwZmYwMCkgPT0gMCkgPyB0cnVlIDogZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9oYWxfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvaGFsX2ludGYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM4M2U2OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9oYWxfaW50Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgX0hBTF9JTlRGX0NfCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0jaW5jbHVkZSA8aGFsX2ludGYuaD4KLQotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotCi12b2lkIHJ0d19oYWxfdXBkYXRlX3JhX21hc2syM2Eoc3RydWN0IHN0YV9pbmZvICpwc3RhLCB1OCByc3NpX2xldmVsKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCi0JaWYgKCFwc3RhKQotCQlyZXR1cm47Ci0KLQlwYWRhcHRlciA9IHBzdGEtPnBhZGFwdGVyOwotCi0JcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkJYWRkX1JBVGlkMjNhKHBhZGFwdGVyLCBwc3RhLCByc3NpX2xldmVsKTsKLSNlbmRpZgotCX0gZWxzZQotCQlydGw4NzIzYV91cGRhdGVfcmFtYXNrKHBhZGFwdGVyLCBwc3RhLT5tYWNfaWQsIHJzc2lfbGV2ZWwpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3OWMzNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG0uYworKysgL2Rldi9udWxsCkBAIC0xLDE3MzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotI2luY2x1ZGUgInVzYl9vcHNfbGludXguaCIKLQotc3RhdGljIGNvbnN0IHUxNiBkQl9JbnZlcnRfVGFibGVbOF1bMTJdID0gewotCXsxLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCA0LCA0fSwKLQl7NCwgNSwgNiwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTQsIDE2fSwKLQl7MTgsIDIwLCAyMiwgMjUsIDI4LCAzMiwgMzUsIDQwLCA0NSwgNTAsIDU2LCA2M30sCi0JezcxLCA3OSwgODksIDEwMCwgMTEyLCAxMjYsIDE0MSwgMTU4LCAxNzgsIDIwMCwgMjI0LCAyNTF9LAotCXsyODIsIDMxNiwgMzU1LCAzOTgsIDQ0NywgNTAxLCA1NjIsIDYzMSwgNzA4LCA3OTQsIDg5MSwgMTAwMH0sCi0JezExMjIsIDEyNTksIDE0MTMsIDE1ODUsIDE3NzgsIDE5OTUsIDIyMzksIDI1MTIsIDI4MTgsIDMxNjIsIDM1NDgsIDM5ODF9LAotCXs0NDY3LCA1MDEyLCA1NjIzLCA2MzEwLCA3MDc5LCA3OTQzLCA4OTEzLCAxMDAwMCwgMTEyMjAsIDEyNTg5LCAxNDEyNSwgMTU4NDl9LAotCXsxNzc4MywgMTk5NTMsIDIyMzg3LCAyNTExOSwgMjgxODQsIDMxNjIzLCAzNTQ4MSwgMzk4MTEsIDQ0NjY4LCA1MDExOSwgNTYyMzQsIDY1NTM1fQotfTsKLQotc3RhdGljIHUzMiBFRENBUGFyYW1bSFRfSU9UX1BFRVJfTUFYXVszXSA9IHsgICAgICAgICAgLyogIFVMCQkJREwgKi8KLQl7MHg1ZWE0MmIsIDB4NWVhNDJiLCAweDVlYTQyYn0sIC8qIDA6dW5rbm93biBBUCAqLwotCXsweGE0NGYsIDB4NWVhNDRmLCAweDVlNDMxY30sIC8qICAxOnJlYWx0ZWsgQVAgKi8KLQl7MHg1ZWE0MmIsIDB4NWVhNDJiLCAweDVlYTQyYn0sIC8qICAyOnVua25vd24gQVAgPT4gcmVhbHRla185MlNFICovCi0JezB4NWVhMzJiLCAweDVlYTQyYiwgMHg1ZTQzMjJ9LCAvKiAgMzpicm9hZGNvbSBBUCAqLwotCXsweDVlYTQyMiwgMHgwMGE0NGYsIDB4MDBhNDRmfSwgLyogIDQ6cmFsaW5rIEFQICovCi0JezB4NWVhMzIyLCAweDAwYTYzMCwgMHgwMGE0NGZ9LCAvKiAgNTphdGhlcm9zIEFQICovCi0JezB4NWU0MzIyLCAweDVlNDMyMiwgMHg1ZTQzMjJ9LC8qICA2OmNpc2NvIEFQICovCi0JezB4NWVhNDRmLCAweDAwYTQ0ZiwgMHg1ZWE0MmJ9LCAvKiAgODptYXJ2ZWxsIEFQICovCi0JezB4NWVhNDJiLCAweDVlYTQyYiwgMHg1ZWE0MmJ9LCAvKiAgMTA6dW5rbm93biBBUCA9PiA5MlUgQVAgKi8KLQl7MHg1ZWE0MmIsIDB4YTYzMCwgMHg1ZTQzMWN9LCAvKiAgMTE6YWlyZ29jYXAgQVAgKi8KLX07Ci0KLS8qICBFRENBIFBhcmFtZXRlciBmb3IgQVAvQURTTCAgIGJ5IE1pbmd6aGkgMjAxMS0xMS0yMiAqLwotCi0vKiAgR2xvYmFsIHZhciAqLwotdTMyIE9GRE1Td2luZ1RhYmxlMjNBW09GRE1fVEFCTEVfU0laRV85MkRdID0gewotCTB4N2Y4MDAxZmUsIC8qICAwLCArNi4wZEIgKi8KLQkweDc4ODAwMWUyLCAvKiAgMSwgKzUuNWRCICovCi0JMHg3MWMwMDFjNywgLyogIDIsICs1LjBkQiAqLwotCTB4NmI4MDAxYWUsIC8qICAzLCArNC41ZEIgKi8KLQkweDY1NDAwMTk1LCAvKiAgNCwgKzQuMGRCICovCi0JMHg1ZmMwMDE3ZiwgLyogIDUsICszLjVkQiAqLwotCTB4NWE0MDAxNjksIC8qICA2LCArMy4wZEIgKi8KLQkweDU1NDAwMTU1LCAvKiAgNywgKzIuNWRCICovCi0JMHg1MDgwMDE0MiwgLyogIDgsICsyLjBkQiAqLwotCTB4NGMwMDAxMzAsIC8qICA5LCArMS41ZEIgKi8KLQkweDQ3YzAwMTFmLCAvKiAgMTAsICsxLjBkQiAqLwotCTB4NDNjMDAxMGYsIC8qICAxMSwgKzAuNWRCICovCi0JMHg0MDAwMDEwMCwgLyogIDEyLCArMGRCICovCi0JMHgzYzgwMDBmMiwgLyogIDEzLCAtMC41ZEIgKi8KLQkweDM5MDAwMGU0LCAvKiAgMTQsIC0xLjBkQiAqLwotCTB4MzVjMDAwZDcsIC8qICAxNSwgLTEuNWRCICovCi0JMHgzMmMwMDBjYiwgLyogIDE2LCAtMi4wZEIgKi8KLQkweDMwMDAwMGMwLCAvKiAgMTcsIC0yLjVkQiAqLwotCTB4MmQ0MDAwYjUsIC8qICAxOCwgLTMuMGRCICovCi0JMHgyYWMwMDBhYiwgLyogIDE5LCAtMy41ZEIgKi8KLQkweDI4ODAwMGEyLCAvKiAgMjAsIC00LjBkQiAqLwotCTB4MjYwMDAwOTgsIC8qICAyMSwgLTQuNWRCICovCi0JMHgyNDAwMDA5MCwgLyogIDIyLCAtNS4wZEIgKi8KLQkweDIyMDAwMDg4LCAvKiAgMjMsIC01LjVkQiAqLwotCTB4MjAwMDAwODAsIC8qICAyNCwgLTYuMGRCICovCi0JMHgxZTQwMDA3OSwgLyogIDI1LCAtNi41ZEIgKi8KLQkweDFjODAwMDcyLCAvKiAgMjYsIC03LjBkQiAqLwotCTB4MWIwMDAwNmMsIC8qICAyNy4gLTcuNWRCICovCi0JMHgxOTgwMDA2NiwgLyogIDI4LCAtOC4wZEIgKi8KLQkweDE4MDAwMDYwLCAvKiAgMjksIC04LjVkQiAqLwotCTB4MTZjMDAwNWIsIC8qICAzMCwgLTkuMGRCICovCi0JMHgxNTgwMDA1NiwgLyogIDMxLCAtOS41ZEIgKi8KLQkweDE0NDAwMDUxLCAvKiAgMzIsIC0xMC4wZEIgKi8KLQkweDEzMDAwMDRjLCAvKiAgMzMsIC0xMC41ZEIgKi8KLQkweDEyMDAwMDQ4LCAvKiAgMzQsIC0xMS4wZEIgKi8KLQkweDExMDAwMDQ0LCAvKiAgMzUsIC0xMS41ZEIgKi8KLQkweDEwMDAwMDQwLCAvKiAgMzYsIC0xMi4wZEIgKi8KLQkweDBmMDAwMDNjLC8qICAzNywgLTEyLjVkQiAqLwotCTB4MGU0MDAwMzksLyogIDM4LCAtMTMuMGRCICovCi0JMHgwZDgwMDAzNiwvKiAgMzksIC0xMy41ZEIgKi8KLQkweDBjYzAwMDMzLC8qICA0MCwgLTE0LjBkQiAqLwotCTB4MGMwMDAwMzAsLyogIDQxLCAtMTQuNWRCICovCi0JMHgwYjQwMDAyZCwvKiAgNDIsIC0xNS4wZEIgKi8KLX07Ci0KLXU4IENDS1N3aW5nVGFibGVfQ2gxX0NoMTMyM0FbQ0NLX1RBQkxFX1NJWkVdWzhdID0gewotCXsweDM2LCAweDM1LCAweDJlLCAweDI1LCAweDFjLCAweDEyLCAweDA5LCAweDA0fSwgLyogIDAsICswZEIgKi8KLQl7MHgzMywgMHgzMiwgMHgyYiwgMHgyMywgMHgxYSwgMHgxMSwgMHgwOCwgMHgwNH0sIC8qICAxLCAtMC41ZEIgKi8KLQl7MHgzMCwgMHgyZiwgMHgyOSwgMHgyMSwgMHgxOSwgMHgxMCwgMHgwOCwgMHgwM30sIC8qICAyLCAtMS4wZEIgKi8KLQl7MHgyZCwgMHgyZCwgMHgyNywgMHgxZiwgMHgxOCwgMHgwZiwgMHgwOCwgMHgwM30sIC8qICAzLCAtMS41ZEIgKi8KLQl7MHgyYiwgMHgyYSwgMHgyNSwgMHgxZSwgMHgxNiwgMHgwZSwgMHgwNywgMHgwM30sIC8qICA0LCAtMi4wZEIgKi8KLQl7MHgyOCwgMHgyOCwgMHgyMiwgMHgxYywgMHgxNSwgMHgwZCwgMHgwNywgMHgwM30sIC8qICA1LCAtMi41ZEIgKi8KLQl7MHgyNiwgMHgyNSwgMHgyMSwgMHgxYiwgMHgxNCwgMHgwZCwgMHgwNiwgMHgwM30sIC8qICA2LCAtMy4wZEIgKi8KLQl7MHgyNCwgMHgyMywgMHgxZiwgMHgxOSwgMHgxMywgMHgwYywgMHgwNiwgMHgwM30sIC8qICA3LCAtMy41ZEIgKi8KLQl7MHgyMiwgMHgyMSwgMHgxZCwgMHgxOCwgMHgxMSwgMHgwYiwgMHgwNiwgMHgwMn0sIC8qICA4LCAtNC4wZEIgKi8KLQl7MHgyMCwgMHgyMCwgMHgxYiwgMHgxNiwgMHgxMSwgMHgwOCwgMHgwNSwgMHgwMn0sIC8qICA5LCAtNC41ZEIgKi8KLQl7MHgxZiwgMHgxZSwgMHgxYSwgMHgxNSwgMHgxMCwgMHgwYSwgMHgwNSwgMHgwMn0sIC8qICAxMCwgLTUuMGRCICovCi0JezB4MWQsIDB4MWMsIDB4MTgsIDB4MTQsIDB4MGYsIDB4MGEsIDB4MDUsIDB4MDJ9LCAvKiAgMTEsIC01LjVkQiAqLwotCXsweDFiLCAweDFhLCAweDE3LCAweDEzLCAweDBlLCAweDA5LCAweDA0LCAweDAyfSwgLyogIDEyLCAtNi4wZEIgKi8KLQl7MHgxYSwgMHgxOSwgMHgxNiwgMHgxMiwgMHgwZCwgMHgwOSwgMHgwNCwgMHgwMn0sIC8qICAxMywgLTYuNWRCICovCi0JezB4MTgsIDB4MTcsIDB4MTUsIDB4MTEsIDB4MGMsIDB4MDgsIDB4MDQsIDB4MDJ9LCAvKiAgMTQsIC03LjBkQiAqLwotCXsweDE3LCAweDE2LCAweDEzLCAweDEwLCAweDBjLCAweDA4LCAweDA0LCAweDAyfSwgLyogIDE1LCAtNy41ZEIgKi8KLQl7MHgxNiwgMHgxNSwgMHgxMiwgMHgwZiwgMHgwYiwgMHgwNywgMHgwNCwgMHgwMX0sIC8qICAxNiwgLTguMGRCICovCi0JezB4MTQsIDB4MTQsIDB4MTEsIDB4MGUsIDB4MGIsIDB4MDcsIDB4MDMsIDB4MDJ9LCAvKiAgMTcsIC04LjVkQiAqLwotCXsweDEzLCAweDEzLCAweDEwLCAweDBkLCAweDBhLCAweDA2LCAweDAzLCAweDAxfSwgLyogIDE4LCAtOS4wZEIgKi8KLQl7MHgxMiwgMHgxMiwgMHgwZiwgMHgwYywgMHgwOSwgMHgwNiwgMHgwMywgMHgwMX0sIC8qICAxOSwgLTkuNWRCICovCi0JezB4MTEsIDB4MTEsIDB4MGYsIDB4MGMsIDB4MDksIDB4MDYsIDB4MDMsIDB4MDF9LCAvKiAgMjAsIC0xMC4wZEIgKi8KLQl7MHgxMCwgMHgxMCwgMHgwZSwgMHgwYiwgMHgwOCwgMHgwNSwgMHgwMywgMHgwMX0sIC8qICAyMSwgLTEwLjVkQiAqLwotCXsweDBmLCAweDBmLCAweDBkLCAweDBiLCAweDA4LCAweDA1LCAweDAzLCAweDAxfSwgLyogIDIyLCAtMTEuMGRCICovCi0JezB4MGUsIDB4MGUsIDB4MGMsIDB4MGEsIDB4MDgsIDB4MDUsIDB4MDIsIDB4MDF9LCAvKiAgMjMsIC0xMS41ZEIgKi8KLQl7MHgwZCwgMHgwZCwgMHgwYywgMHgwYSwgMHgwNywgMHgwNSwgMHgwMiwgMHgwMX0sIC8qICAyNCwgLTEyLjBkQiAqLwotCXsweDBkLCAweDBjLCAweDBiLCAweDA5LCAweDA3LCAweDA0LCAweDAyLCAweDAxfSwgLyogIDI1LCAtMTIuNWRCICovCi0JezB4MGMsIDB4MGMsIDB4MGEsIDB4MDksIDB4MDYsIDB4MDQsIDB4MDIsIDB4MDF9LCAvKiAgMjYsIC0xMy4wZEIgKi8KLQl7MHgwYiwgMHgwYiwgMHgwYSwgMHgwOCwgMHgwNiwgMHgwNCwgMHgwMiwgMHgwMX0sIC8qICAyNywgLTEzLjVkQiAqLwotCXsweDBiLCAweDBhLCAweDA5LCAweDA4LCAweDA2LCAweDA0LCAweDAyLCAweDAxfSwgLyogIDI4LCAtMTQuMGRCICovCi0JezB4MGEsIDB4MGEsIDB4MDksIDB4MDcsIDB4MDUsIDB4MDMsIDB4MDIsIDB4MDF9LCAvKiAgMjksIC0xNC41ZEIgKi8KLQl7MHgwYSwgMHgwOSwgMHgwOCwgMHgwNywgMHgwNSwgMHgwMywgMHgwMiwgMHgwMX0sIC8qICAzMCwgLTE1LjBkQiAqLwotCXsweDA5LCAweDA5LCAweDA4LCAweDA2LCAweDA1LCAweDAzLCAweDAxLCAweDAxfSwgLyogIDMxLCAtMTUuNWRCICovCi0JezB4MDksIDB4MDgsIDB4MDcsIDB4MDYsIDB4MDQsIDB4MDMsIDB4MDEsIDB4MDF9CS8qICAzMiwgLTE2LjBkQiAqLwotfTsKLQotdTggQ0NLU3dpbmdUYWJsZV9DaDE0MjNBW0NDS19UQUJMRV9TSVpFXVs4XSA9IHsKLQl7MHgzNiwgMHgzNSwgMHgyZSwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAwLCArMGRCICovCi0JezB4MzMsIDB4MzIsIDB4MmIsIDB4MTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMSwgLTAuNWRCICovCi0JezB4MzAsIDB4MmYsIDB4MjksIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMiwgLTEuMGRCICovCi0JezB4MmQsIDB4MmQsIDB4MTcsIDB4MTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMywgLTEuNWRCICovCi0JezB4MmIsIDB4MmEsIDB4MjUsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgNCwgLTIuMGRCICovCi0JezB4MjgsIDB4MjgsIDB4MjQsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgNSwgLTIuNWRCICovCi0JezB4MjYsIDB4MjUsIDB4MjEsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgNiwgLTMuMGRCICovCi0JezB4MjQsIDB4MjMsIDB4MWYsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgNywgLTMuNWRCICovCi0JezB4MjIsIDB4MjEsIDB4MWQsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgOCwgLTQuMGRCICovCi0JezB4MjAsIDB4MjAsIDB4MWIsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgOSwgLTQuNWRCICovCi0JezB4MWYsIDB4MWUsIDB4MWEsIDB4MGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMTAsIC01LjBkQiAqLwotCXsweDFkLCAweDFjLCAweDE4LCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDExLCAtNS41ZEIgKi8KLQl7MHgxYiwgMHgxYSwgMHgxNywgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAxMiwgLTYuMGRCICovCi0JezB4MWEsIDB4MTksIDB4MTYsIDB4MGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMTMsIC02LjVkQiAqLwotCXsweDE4LCAweDE3LCAweDE1LCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDE0LCAtNy4wZEIgKi8KLQl7MHgxNywgMHgxNiwgMHgxMywgMHgwYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAxNSwgLTcuNWRCICovCi0JezB4MTYsIDB4MTUsIDB4MTIsIDB4MGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMTYsIC04LjBkQiAqLwotCXsweDE0LCAweDE0LCAweDExLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDE3LCAtOC41ZEIgKi8KLQl7MHgxMywgMHgxMywgMHgxMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAxOCwgLTkuMGRCICovCi0JezB4MTIsIDB4MTIsIDB4MGYsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMTksIC05LjVkQiAqLwotCXsweDExLCAweDExLCAweDBmLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDIwLCAtMTAuMGRCICovCi0JezB4MTAsIDB4MTAsIDB4MGUsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMjEsIC0xMC41ZEIgKi8KLQl7MHgwZiwgMHgwZiwgMHgwZCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAyMiwgLTExLjBkQiAqLwotCXsweDBlLCAweDBlLCAweDBjLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDIzLCAtMTEuNWRCICovCi0JezB4MGQsIDB4MGQsIDB4MGMsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMjQsIC0xMi4wZEIgKi8KLQl7MHgwZCwgMHgwYywgMHgwYiwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAyNSwgLTEyLjVkQiAqLwotCXsweDBjLCAweDBjLCAweDBhLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDI2LCAtMTMuMGRCICovCi0JezB4MGIsIDB4MGIsIDB4MGEsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMjcsIC0xMy41ZEIgKi8KLQl7MHgwYiwgMHgwYSwgMHgwOSwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAyOCwgLTE0LjBkQiAqLwotCXsweDBhLCAweDBhLCAweDA5LCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwgLyogIDI5LCAtMTQuNWRCICovCi0JezB4MGEsIDB4MDksIDB4MDgsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LCAvKiAgMzAsIC0xNS4wZEIgKi8KLQl7MHgwOSwgMHgwOSwgMHgwOCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sIC8qICAzMSwgLTE1LjVkQiAqLwotCXsweDA5LCAweDA4LCAweDA3LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwfQkvKiAgMzIsIC0xNi4wZEIgKi8KLX07Ci0KLS8qICBMb2NhbCBGdW5jdGlvbiBwcmVkZWZpbmUuICovCi0KLS8qIFNUQVJULS0tLS0tLS0tLS0tQ09NTU9OIElORk8gUkVMQVRFRC0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBvZG1fQ29tbW9uSW5mb1NlbGZJbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXN0YXRpYyB2b2lkIG9kbV9Db21tb25JbmZvU2VsZlVwZGF0ZShzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhKTsKLQotdm9pZCBvZG1fQ21uSW5mb0luaXRfRGVidWcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotdm9pZCBvZG1fQ21uSW5mb1VwZGF0ZV9EZWJ1ZzIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi0vKiBTVEFSVC0tLS0tLS0tLS0tLS0tLURJRy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBvZG1fRmFsc2VBbGFybUNvdW50ZXJTdGF0aXN0aWNzMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXZvaWQgb2RtX0RJRzIzYUluaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotdm9pZCBvZG1fRElHMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgb2RtX0NDS1BhY2tldERldGVjdGlvblRocmVzaDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotLyogRU5ELS0tLS0tLS0tLS0tLS0tRElHLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFNUQVJULS0tLS0tLUJCIFBPV0VSIFNBVkUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotdm9pZCBvZG0yM2FfRHluQkJQU0luaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotCi0vKiBFTkQtLS0tLS0tLS1CQiBQT1dFUiBTQVZFLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotdm9pZCBvZG1fRHluYW1pY1R4UG93ZXIyM2FJbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXN0YXRpYyB2b2lkIG9kbV9SU1NJTW9uaXRvckNoZWNrKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci12b2lkIG9kbV9EeW5hbWljVHhQb3dlcjIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi1zdGF0aWMgdm9pZCBvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2soc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotdm9pZCBvZG1fUmF0ZUFkYXB0aXZlTWFza0luaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotc3RhdGljIHZvaWQgb2RtX1RYUG93ZXJUcmFja2luZ0luaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotc3RhdGljIHZvaWQgb2RtX0VkY2FUdXJib0NoZWNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci1zdGF0aWMgdm9pZCBPRE1fRWRjYVR1cmJvSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi0jZGVmaW5lCQlSeERlZmF1bHRBbnQxCQkweDY1YTkKLSNkZWZpbmUJUnhEZWZhdWx0QW50MgkJMHg1NjlhCi0KLWJvb2wgb2RtX1N0YURlZkFudFNlbChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JdTMyIE9GRE1fQW50MV9DbnQsCi0JdTMyIE9GRE1fQW50Ml9DbnQsCi0JdTMyIENDS19BbnQxX0NudCwKLQl1MzIgQ0NLX0FudDJfQ250LAotCXU4ICpwRGVmQW50Ci0JKTsKLQotdm9pZCBvZG1fU2V0UnhJZGxlQW50KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQl1OCBBbnQsCi0JYm9vbCAgIGJEdWFsUGF0aAotKTsKLQotLyogMyBFeHBvcnQgSW50ZXJmYWNlICovCi0KLS8qICAyMDExLzA5LzIxIE1IIEFkZCB0byBkZXNjcmliZSBkaWZmZXJlbnQgdGVhbSBuZWNlc3NhcnkgcmVzb3VyY2UgYWxsb2NhdGU/PyAqLwotdm9pZCBPRE0yM2FfRE1Jbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQkvKiBGb3IgYWxsIElDIHNlcmllcyAqLwotCW9kbV9Db21tb25JbmZvU2VsZkluaXQyM2EocERNX09kbSk7Ci0Jb2RtX0NtbkluZm9Jbml0X0RlYnVnMjNhKHBETV9PZG0pOwotCW9kbV9ESUcyM2FJbml0KHBETV9PZG0pOwotCW9kbV9SYXRlQWRhcHRpdmVNYXNrSW5pdDIzYShwRE1fT2RtKTsKLQotCW9kbTIzYV9EeW5CQlBTSW5pdChwRE1fT2RtKTsKLQlvZG1fRHluYW1pY1R4UG93ZXIyM2FJbml0KHBETV9PZG0pOwotCW9kbV9UWFBvd2VyVHJhY2tpbmdJbml0KHBETV9PZG0pOwotCU9ETV9FZGNhVHVyYm9Jbml0MjNhKHBETV9PZG0pOwotfQotCi0vKiAgMjAxMS8wOS8yMCBNSCBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludGVyIGZvciBhbGwgdGVhbSB0byBleGVjdXRlIEhXIG91dCBzb3VyY2UgRE0uICovCi0vKiAgWW91IGNhbiBub3QgYWRkIGFueSBkdW1teSBmdW5jdGlvbiBoZXJlLCBiZSBjYXJlLCB5b3UgY2FuIG9ubHkgdXNlIERNIHN0cnVjdHVyZSAqLwotLyogIHRvIHBlcmZvcm0gYW55IG5ldyBPRE1fRE0uICovCi12b2lkIE9ETV9ETVdhdGNoZG9nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0ZXIpOwotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCS8qIDIwMTIuMDUuMDMgTHVrZTogRm9yIGFsbCBJQyBzZXJpZXMgKi8KLQlvZG1fQ21uSW5mb1VwZGF0ZV9EZWJ1ZzIzYShwRE1fT2RtKTsKLQlvZG1fQ29tbW9uSW5mb1NlbGZVcGRhdGUocEhhbERhdGEpOwotCW9kbV9GYWxzZUFsYXJtQ291bnRlclN0YXRpc3RpY3MyM2EocERNX09kbSk7Ci0Jb2RtX1JTU0lNb25pdG9yQ2hlY2socERNX09kbSk7Ci0KLQkvKiA4NzIzQSBvciA4MTg5RVMgcGxhdGZvcm0gKi8KLQkvKiBOZWlsQ2hlbi0tMjAxMi0tMDgtLTI0LS0gKi8KLQkvKiBGaXggTGVhdmUgTFBTIGlzc3VlICovCi0JaWYgKChwRE1fT2RtLT5BZGFwdGVyLT5wd3JjdHJscHJpdi5wd3JfbW9kZSAhPSBQU19NT0RFX0FDVElWRSkgJiYvKiAgaW4gTFBTIG1vZGUgKi8KLQkgICAgKHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgJiBPRE1fUlRMODcyM0EpKSB7Ci0JCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgiLS0tLVN0ZXAxOiBvZG1fRElHMjNhIGlzIGluIExQUyBtb2RlXG4iKSk7Ci0JCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgiLS0tU3RlcDI6IDg3MjNBUyBpcyBpbiBMUFMgbW9kZVxuIikpOwotCQkJb2RtX0RJRzIzYWJ5UlNTSV9MUFMocERNX09kbSk7Ci0JfSBlbHNlIHsKLQkJb2RtX0RJRzIzYShhZGFwdGVyKTsKLQl9Ci0KLQlvZG1fQ0NLUGFja2V0RGV0ZWN0aW9uVGhyZXNoMjNhKHBETV9PZG0pOwotCi0JaWYgKHB3cmN0cmxwcml2LT5icG93ZXJfc2F2aW5nKQotCQlyZXR1cm47Ci0KLQlvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2socERNX09kbSk7Ci0KLQotCW9kbV9FZGNhVHVyYm9DaGVjazIzYShwRE1fT2RtKTsKLX0KLQotLyogICovCi0vKiAgSW5pdCAvLi4gRml4ZWQgSFcgdmFsdWUuIE9ubHkgaW5pdCB0aW1lLiAqLwotLyogICovCi12b2lkIE9ETV9DbW5JbmZvSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JCWVudW0gb2RtX2NtbmluZm8gQ21uSW5mbywKLQkJdTMyIFZhbHVlCi0JKQotewotCS8qIE9ETV9SVF9UUkFDRShwRE1fT2RtLCk7ICovCi0KLQkvKiAgKi8KLQkvKiAgVGhpcyBzZWN0aW9uIGlzIHVzZWQgZm9yIGluaXQgdmFsdWUgKi8KLQkvKiAgKi8KLQlzd2l0Y2gJKENtbkluZm8pIHsKLQkvKiAgRml4ZWQgT0RNIHZhbHVlLiAqLwotCWNhc2UJT0RNX0NNTklORk9fTVBfVEVTVF9DSElQOgotCQlwRE1fT2RtLT5iSXNNUENoaXAgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fSUNfVFlQRToKLQkJcERNX09kbS0+U3VwcG9ydElDVHlwZSA9IFZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0NVVF9WRVI6Ci0JCXBETV9PZG0tPkN1dFZlcnNpb24gPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fRkFCX1ZFUjoKLQkJcERNX09kbS0+RmFiVmVyc2lvbiA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19CT0FSRF9UWVBFOgotCQlwRE1fT2RtLT5Cb2FyZFR5cGUgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fRVhUX0xOQToKLQkJcERNX09kbS0+RXh0TE5BID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX0VYVF9QQToKLQkJcERNX09kbS0+RXh0UEEgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fRVhUX1RSU1c6Ci0JCXBETV9PZG0tPkV4dFRSU1cgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fQklOSENUX1RFU1Q6Ci0JCXBETV9PZG0tPmJJbkhjdFRlc3QgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19CV0lGSV9URVNUOgotCQlwRE1fT2RtLT5iV0lGSVRlc3QgPSAoYm9vbClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19TTUFSVF9DT05DVVJSRU5UOgotCQlwRE1fT2RtLT5iRHVhbE1hY1NtYXJ0Q29uY3VycmVudCA9IChib29sKVZhbHVlOwotCQlicmVhazsKLQkvKiBUbyByZW1vdmUgdGhlIGNvbXBpbGVyIHdhcm5pbmcsIG11c3QgYWRkIGFuIGVtcHR5IGRlZmF1bHQgc3RhdGVtZW50IHRvIGhhbmRsZSB0aGUgb3RoZXIgdmFsdWVzLiAqLwotCWRlZmF1bHQ6Ci0JCS8qIGRvIG5vdGhpbmcgKi8KLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIE9ETV9DbW5JbmZvUHRyQXJyYXlIb29rMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBvZG1fY21uaW5mbyBDbW5JbmZvLAotCQkJCXUxNiBJbmRleCwgdm9pZCAqcFZhbHVlKQotewotCS8qICBIb29rIGNhbGwgYnkgcmVmZXJlbmNlIHBvaW50ZXIuICovCi0Jc3dpdGNoCShDbW5JbmZvKSB7Ci0JLyogIER5bmFtaWMgY2FsbCBieSByZWZlcmVuY2UgcG9pbnRlci4gKi8KLQljYXNlCU9ETV9DTU5JTkZPX1NUQV9TVEFUVVM6Ci0JCXBETV9PZG0tPnBPRE1fU3RhSW5mb1tJbmRleF0gPSAoc3RydWN0IHN0YV9pbmZvICopcFZhbHVlOwotCQlicmVhazsKLQkvKiBUbyByZW1vdmUgdGhlIGNvbXBpbGVyIHdhcm5pbmcsIG11c3QgYWRkIGFuIGVtcHR5IGRlZmF1bHQgc3RhdGVtZW50IHRvIGhhbmRsZSB0aGUgb3RoZXIgdmFsdWVzLiAqLwotCWRlZmF1bHQ6Ci0JCS8qIGRvIG5vdGhpbmcgKi8KLQkJYnJlYWs7Ci0JfQotfQotCi0vKiAgVXBkYXRlIEJhbmQvQ0hhbm5lbC8uLiBUaGUgdmFsdWVzIGFyZSBkeW5hbWljIGJ1dCBub24tcGVyLXBhY2tldC4gKi8KLXZvaWQgT0RNX0NtbkluZm9VcGRhdGUyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgQ21uSW5mbywgdTY0IFZhbHVlKQotewotCS8qICBUaGlzIGluaXQgdmFyaWFibGUgbWF5IGJlIGNoYW5nZWQgaW4gcnVuIHRpbWUuICovCi0Jc3dpdGNoCShDbW5JbmZvKSB7Ci0JY2FzZQlPRE1fQ01OSU5GT19XSUZJX0RJUkVDVDoKLQkJcERNX09kbS0+YldJRklfRGlyZWN0ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fV0lGSV9ESVNQTEFZOgotCQlwRE1fT2RtLT5iV0lGSV9EaXNwbGF5ID0gKGJvb2wpVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fTElOSzoKLQkJcERNX09kbS0+YkxpbmtlZCA9IChib29sKVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JTU0lfTUlOOgotCQlwRE1fT2RtLT5SU1NJX01pbiA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19EQkdfQ09NUDoKLQkJcERNX09kbS0+RGVidWdDb21wb25lbnRzID0gVmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UJT0RNX0NNTklORk9fREJHX0xFVkVMOgotCQlwRE1fT2RtLT5EZWJ1Z0xldmVsID0gKHUzMilWYWx1ZTsKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19SQV9USFJFU0hPTERfSElHSDoKLQkJcERNX09kbS0+UmF0ZUFkYXB0aXZlLkhpZ2hSU1NJVGhyZXNoID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JBX1RIUkVTSE9MRF9MT1c6Ci0JCXBETV9PZG0tPlJhdGVBZGFwdGl2ZS5Mb3dSU1NJVGhyZXNoID0gKHU4KVZhbHVlOwotCQlicmVhazsKLQl9Ci0KLX0KLQotdm9pZCBvZG1fQ29tbW9uSW5mb1NlbGZJbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQl1MzIgdmFsMzI7Ci0KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocERNX09kbS0+QWRhcHRlciwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyKTsKLQlpZiAodmFsMzIgJiBCSVQoOSkpCi0JCXBETV9PZG0tPmJDY2tIaWdoUG93ZXIgPSB0cnVlOwotCWVsc2UKLQkJcERNX09kbS0+YkNja0hpZ2hQb3dlciA9IGZhbHNlOwotCi0JcERNX09kbS0+UkZQYXRoUnhFbmFibGUgPQotCQlydGw4NzIzYXVfcmVhZDMyKHBETV9PZG0tPkFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlKSAmIDB4MEY7Ci0KLQlPRE1fSW5pdERlYnVnU2V0dGluZzIzYShwRE1fT2RtKTsKLX0KLQotc3RhdGljIHZvaWQgb2RtX0NvbW1vbkluZm9TZWxmVXBkYXRlKHN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEpCi17Ci0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtID0gJnBIYWxEYXRhLT5vZG1wcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcEVudHJ5OwotCXU4IEVudHJ5Q250ID0gMDsKLQl1OCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE9ETV9BU1NPQ0lBVEVfRU5UUllfTlVNOyBpKyspIHsKLQkJcEVudHJ5ID0gcERNX09kbS0+cE9ETV9TdGFJbmZvW2ldOwotCQlpZiAocEVudHJ5KQotCQkJRW50cnlDbnQrKzsKLQl9Ci0JaWYgKEVudHJ5Q250ID09IDEpCi0JCXBETV9PZG0tPmJPbmVFbnRyeU9ubHkgPSB0cnVlOwotCWVsc2UKLQkJcERNX09kbS0+Yk9uZUVudHJ5T25seSA9IGZhbHNlOwotfQotCi12b2lkIG9kbV9DbW5JbmZvSW5pdF9EZWJ1ZzIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIm9kbV9DbW5JbmZvSW5pdF9EZWJ1ZzIzYSA9PT5cbiIpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiU3VwcG9ydEFiaWxpdHkgPSAweCV4XG4iLCBwRE1fT2RtLT5TdXBwb3J0QWJpbGl0eSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJTdXBwb3J0SUNUeXBlID0gMHgleFxuIiwgcERNX09kbS0+U3VwcG9ydElDVHlwZSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJDdXRWZXJzaW9uID0lZFxuIiwgcERNX09kbS0+Q3V0VmVyc2lvbikpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJGYWJWZXJzaW9uID0lZFxuIiwgcERNX09kbS0+RmFiVmVyc2lvbikpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJCb2FyZFR5cGUgPSVkXG4iLCBwRE1fT2RtLT5Cb2FyZFR5cGUpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiRXh0TE5BID0lZFxuIiwgcERNX09kbS0+RXh0TE5BKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkV4dFBBID0lZFxuIiwgcERNX09kbS0+RXh0UEEpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiRXh0VFJTVyA9JWRcbiIsIHBETV9PZG0tPkV4dFRSU1cpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiYkluSGN0VGVzdCA9JWRcbiIsIHBETV9PZG0tPmJJbkhjdFRlc3QpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiYldJRklUZXN0ID0lZFxuIiwgcERNX09kbS0+YldJRklUZXN0KSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoImJEdWFsTWFjU21hcnRDb25jdXJyZW50ID0lZFxuIiwgcERNX09kbS0+YkR1YWxNYWNTbWFydENvbmN1cnJlbnQpKTsKLQotfQotCi12b2lkIG9kbV9DbW5JbmZvVXBkYXRlX0RlYnVnMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgib2RtX0NtbkluZm9VcGRhdGVfRGVidWcyM2EgPT0+XG4iKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoImJXSUZJX0RpcmVjdCA9JWRcbiIsIHBETV9PZG0tPmJXSUZJX0RpcmVjdCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJiV0lGSV9EaXNwbGF5ID0lZFxuIiwgcERNX09kbS0+YldJRklfRGlzcGxheSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJiTGlua2VkID0lZFxuIiwgcERNX09kbS0+YkxpbmtlZCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJSU1NJX01pbiA9JWRcbiIsIHBETV9PZG0tPlJTU0lfTWluKSk7Ci19Ci0KLXZvaWQgT0RNX1dyaXRlX0RJRzIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCXU4IEN1cnJlbnRJR0kpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlzdHJ1Y3QgZGlnX3QgKnBETV9EaWdUYWJsZSA9ICZwRE1fT2RtLT5ETV9EaWdUYWJsZTsKLQl1MzIgdmFsMzI7Ci0KLQlpZiAocERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlICE9IEN1cnJlbnRJR0kpIHsKLQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfSUdJX0FfMTFOKTsKLQkJdmFsMzIgJj0gfk9ETV9CSVRfSUdJXzExTjsKLQkJdmFsMzIgfD0gQ3VycmVudElHSTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19JR0lfQV8xMU4sIHZhbDMyKTsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAotCQkJICAgICAoIkN1cnJlbnRJR0koMHglMDJ4KS4gXG4iLCBDdXJyZW50SUdJKSk7Ci0JCXBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IEN1cnJlbnRJR0k7Ci0JfQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIk9ETV9Xcml0ZV9ESUcyM2EoKTpDdXJyZW50SUdJID0gMHgleCBcbiIsIEN1cnJlbnRJR0kpKTsKLX0KLQotLyogTmVlZCBMUFMgbW9kZSBmb3IgQ0UgcGxhdGZvcm0gLS0yMDEyLS0wOC0tMjQtLS0gKi8KLS8qIDg3MjNBUy84MTg5RVMgKi8KLXZvaWQgb2RtX0RJRzIzYWJ5UlNTSV9MUFMoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cyAqcEZhbHNlQWxtQ250ID0gJnBETV9PZG0tPkZhbHNlQWxtQ250OwotCXU4IFJTU0lfTG93ZXIgPSBETV9ESUdfTUlOX05JQzsgICAvKiAweDFFIG9yIDB4MUMgKi8KLQl1OCBiRndDdXJyZW50SW5QU01vZGUgPSBmYWxzZTsKLQl1OCBDdXJyZW50SUdJID0gcERNX09kbS0+UlNTSV9NaW47Ci0KLQlpZiAoIShwRE1fT2RtLT5TdXBwb3J0SUNUeXBlICYgT0RNX1JUTDg3MjNBKSkKLQkJcmV0dXJuOwotCi0JQ3VycmVudElHSSA9IEN1cnJlbnRJR0krUlNTSV9PRkZTRVRfRElHOwotCWJGd0N1cnJlbnRJblBTTW9kZSA9IHBBZGFwdGVyLT5wd3JjdHJscHJpdi5iRndDdXJyZW50SW5QU01vZGU7Ci0KLQkvKiAgVXNpbmcgRlcgUFMgbW9kZSB0byBtYWtlIElHSSAqLwotCWlmIChiRndDdXJyZW50SW5QU01vZGUpIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAotCQkJICAgICAoIi0tLU5laWwtLS1vZG1fRElHMjNhIGlzIGluIExQUyBtb2RlXG4iKSk7Ci0JCS8qIEFkanVzdCBieSAgRkEgaW4gTFBTIE1PREUgKi8KLQkJaWYgKHBGYWxzZUFsbUNudC0+Q250X2FsbCA+IERNX0RJR19GQV9USDJfTFBTKQotCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0krMjsKLQkJZWxzZSBpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsID4gRE1fRElHX0ZBX1RIMV9MUFMpCi0JCQlDdXJyZW50SUdJID0gQ3VycmVudElHSSsxOwotCQllbHNlIGlmIChwRmFsc2VBbG1DbnQtPkNudF9hbGwgPCBETV9ESUdfRkFfVEgwX0xQUykKLQkJCUN1cnJlbnRJR0kgPSBDdXJyZW50SUdJLTE7Ci0JfSBlbHNlIHsKLQkJQ3VycmVudElHSSA9IFJTU0lfTG93ZXI7Ci0JfQotCi0JLyogTG93ZXIgYm91bmQgY2hlY2tpbmcgKi8KLQotCS8qIFJTU0kgTG93ZXIgYm91bmQgY2hlY2sgKi8KLQlpZiAoKHBETV9PZG0tPlJTU0lfTWluLTEwKSA+IERNX0RJR19NSU5fTklDKQotCQlSU1NJX0xvd2VyID0gKHBETV9PZG0tPlJTU0lfTWluLTEwKTsKLQllbHNlCi0JCVJTU0lfTG93ZXIgPSBETV9ESUdfTUlOX05JQzsKLQotCS8qIFVwcGVyIGFuZCBMb3dlciBCb3VuZCBjaGVja2luZyAqLwotCSBpZiAoQ3VycmVudElHSSA+IERNX0RJR19NQVhfTklDKQotCQlDdXJyZW50SUdJID0gRE1fRElHX01BWF9OSUM7Ci0JIGVsc2UgaWYgKEN1cnJlbnRJR0kgPCBSU1NJX0xvd2VyKQotCQlDdXJyZW50SUdJID0gUlNTSV9Mb3dlcjsKLQotCU9ETV9Xcml0ZV9ESUcyM2EocERNX09kbSwgQ3VycmVudElHSSk7Ci19Ci0KLXZvaWQgb2RtX0RJRzIzYUluaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBkaWdfdCAqcERNX0RpZ1RhYmxlID0gJnBETV9PZG0tPkRNX0RpZ1RhYmxlOwotCXUzMiB2YWwzMjsKLQotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihwRE1fT2RtLT5BZGFwdGVyLCBPRE1fUkVHX0lHSV9BXzExTik7Ci0JcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlID0gdmFsMzIgJiBPRE1fQklUX0lHSV8xMU47Ci0KLQlwRE1fRGlnVGFibGUtPlJzc2lMb3dUaHJlc2gJPSBETV9ESUdfVEhSRVNIX0xPVzsKLQlwRE1fRGlnVGFibGUtPlJzc2lIaWdoVGhyZXNoCT0gRE1fRElHX1RIUkVTSF9ISUdIOwotCXBETV9EaWdUYWJsZS0+RkFMb3dUaHJlc2gJPSBETV9GQUxTRUFMQVJNX1RIUkVTSF9MT1c7Ci0JcERNX0RpZ1RhYmxlLT5GQUhpZ2hUaHJlc2gJPSBETV9GQUxTRUFMQVJNX1RIUkVTSF9ISUdIOwotCWlmIChwRE1fT2RtLT5Cb2FyZFR5cGUgPT0gT0RNX0JPQVJEX0hJR0hQV1IpIHsKLQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heCA9IERNX0RJR19NQVhfTklDOwotCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluID0gRE1fRElHX01JTl9OSUM7Ci0JfSBlbHNlIHsKLQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heCA9IERNX0RJR19NQVhfTklDOwotCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluID0gRE1fRElHX01JTl9OSUM7Ci0JfQotCXBETV9EaWdUYWJsZS0+QmFja29mZlZhbCA9IERNX0RJR19CQUNLT0ZGX0RFRkFVTFQ7Ci0JcERNX0RpZ1RhYmxlLT5CYWNrb2ZmVmFsX3JhbmdlX21heCA9IERNX0RJR19CQUNLT0ZGX01BWDsKLQlwRE1fRGlnVGFibGUtPkJhY2tvZmZWYWxfcmFuZ2VfbWluID0gRE1fRElHX0JBQ0tPRkZfTUlOOwotCXBETV9EaWdUYWJsZS0+UHJlQ0NLX0NDQVRocmVzID0gMHhGRjsKLQlwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlcyA9IDB4ODM7Ci0JcERNX0RpZ1RhYmxlLT5Gb3JiaWRkZW5JR0kgPSBETV9ESUdfTUlOX05JQzsKLQlwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQgPSAwOwotCXBETV9EaWdUYWJsZS0+UmVjb3Zlcl9jbnQgPSAwOwotCXBETV9EaWdUYWJsZS0+RElHX0R5bmFtaWNfTUlOXzAgPSBETV9ESUdfTUlOX05JQzsKLQlwRE1fRGlnVGFibGUtPkRJR19EeW5hbWljX01JTl8xID0gRE1fRElHX01JTl9OSUM7Ci0JcERNX0RpZ1RhYmxlLT5iTWVkaWFDb25uZWN0XzAgPSBmYWxzZTsKLQlwRE1fRGlnVGFibGUtPmJNZWRpYUNvbm5lY3RfMSA9IGZhbHNlOwotfQotCi12b2lkIG9kbV9ESUcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHRlcik7Ci0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtID0gJnBIYWxEYXRhLT5vZG1wcml2OwotCXN0cnVjdCBkaWdfdCAqcERNX0RpZ1RhYmxlID0gJnBETV9PZG0tPkRNX0RpZ1RhYmxlOwotCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cyAqcEZhbHNlQWxtQ250ID0gJnBETV9PZG0tPkZhbHNlQWxtQ250OwotCXU4IERJR19EeW5hbWljX01JTjsKLQl1OCBESUdfTWF4T2ZNaW47Ci0JYm9vbCBGaXJzdENvbm5lY3QsIEZpcnN0RGlzQ29ubmVjdDsKLQl1OCBkbV9kaWdfbWF4LCBkbV9kaWdfbWluOwotCXU4IEN1cnJlbnRJR0kgPSBwRE1fRGlnVGFibGUtPkN1cklHVmFsdWU7Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJvZG1fRElHMjNhKCkgPT0+XG4iKSk7Ci0JaWYgKGFkYXB0ZXItPm1sbWVwcml2LmJTY2FuSW5Qcm9jZXNzKSB7Ci0JCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJCSAgICAgKCJvZG1fRElHMjNhKCkgUmV0dXJuOiBJbiBTY2FuIFByb2dyZXNzIFxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JRElHX0R5bmFtaWNfTUlOID0gcERNX0RpZ1RhYmxlLT5ESUdfRHluYW1pY19NSU5fMDsKLQlGaXJzdENvbm5lY3QgPSAocERNX09kbS0+YkxpbmtlZCkgJiYgKCFwRE1fRGlnVGFibGUtPmJNZWRpYUNvbm5lY3RfMCk7Ci0JRmlyc3REaXNDb25uZWN0ID0gKCFwRE1fT2RtLT5iTGlua2VkKSAmJgotCQkocERNX0RpZ1RhYmxlLT5iTWVkaWFDb25uZWN0XzApOwotCi0JLyogMSBCb3VuZGFyeSBEZWNpc2lvbiAqLwotCWlmICgocERNX09kbS0+U3VwcG9ydElDVHlwZSAmIE9ETV9SVEw4NzIzQSkgJiYKLQkgICAgKHBETV9PZG0tPkJvYXJkVHlwZSA9PSBPRE1fQk9BUkRfSElHSFBXUiB8fCBwRE1fT2RtLT5FeHRMTkEpKSB7Ci0JCWRtX2RpZ19tYXggPSBETV9ESUdfTUFYX05JQ19IUDsKLQkJZG1fZGlnX21pbiA9IERNX0RJR19NSU5fTklDX0hQOwotCQlESUdfTWF4T2ZNaW4gPSBETV9ESUdfTUFYX0FQX0hQOwotCX0gZWxzZSB7Ci0JCWRtX2RpZ19tYXggPSBETV9ESUdfTUFYX05JQzsKLQkJZG1fZGlnX21pbiA9IERNX0RJR19NSU5fTklDOwotCQlESUdfTWF4T2ZNaW4gPSBETV9ESUdfTUFYX0FQOwotCX0KLQotCWlmIChwRE1fT2RtLT5iTGlua2VkKSB7Ci0JICAgICAgLyogMiA4NzIzQSBTZXJpZXMsIG9mZnNldCBuZWVkIHRvIGJlIDEwICovCi0JCWlmIChwRE1fT2RtLT5TdXBwb3J0SUNUeXBlID09IE9ETV9SVEw4NzIzQSkgewotCQkJLyogMiBVcHBlciBCb3VuZCAqLwotCQkJaWYgKChwRE1fT2RtLT5SU1NJX01pbiArIDEwKSA+IERNX0RJR19NQVhfTklDKQotCQkJCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXggPSBETV9ESUdfTUFYX05JQzsKLQkJCWVsc2UgaWYgKChwRE1fT2RtLT5SU1NJX01pbiArIDEwKSA8IERNX0RJR19NSU5fTklDKQotCQkJCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXggPSBETV9ESUdfTUlOX05JQzsKLQkJCWVsc2UKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4ID0gcERNX09kbS0+UlNTSV9NaW4gKyAxMDsKLQotCQkJLyogMiBJZiBCVCBpcyBDb25jdXJyZW50LCBuZWVkIHRvIHNldCBMb3dlciBCb3VuZCAqLwotCQkJRElHX0R5bmFtaWNfTUlOID0gRE1fRElHX01JTl9OSUM7Ci0JCX0gZWxzZSB7Ci0JCQkvKiAyIE1vZGlmeSBESUcgdXBwZXIgYm91bmQgKi8KLQkJCWlmICgocERNX09kbS0+UlNTSV9NaW4gKyAyMCkgPiBkbV9kaWdfbWF4KQotCQkJCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXggPSBkbV9kaWdfbWF4OwotCQkJZWxzZSBpZiAoKHBETV9PZG0tPlJTU0lfTWluICsgMjApIDwgZG1fZGlnX21pbikKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4ID0gZG1fZGlnX21pbjsKLQkJCWVsc2UKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4ID0gcERNX09kbS0+UlNTSV9NaW4gKyAyMDsKLQotCQkJLyogMiBNb2RpZnkgRElHIGxvd2VyIGJvdW5kICovCi0JCQlpZiAocERNX09kbS0+Yk9uZUVudHJ5T25seSkgewotCQkJCWlmIChwRE1fT2RtLT5SU1NJX01pbiA8IGRtX2RpZ19taW4pCi0JCQkJCURJR19EeW5hbWljX01JTiA9IGRtX2RpZ19taW47Ci0JCQkJZWxzZSBpZiAocERNX09kbS0+UlNTSV9NaW4gPiBESUdfTWF4T2ZNaW4pCi0JCQkJCURJR19EeW5hbWljX01JTiA9IERJR19NYXhPZk1pbjsKLQkJCQllbHNlCi0JCQkJCURJR19EeW5hbWljX01JTiA9IHBETV9PZG0tPlJTU0lfTWluOwotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJCQkJICAgICAoIm9kbV9ESUcyM2EoKSA6IGJPbmVFbnRyeU9ubHkgPSB0cnVlLCAgRElHX0R5bmFtaWNfTUlOID0gMHgleFxuIiwKLQkJCQkJICAgICBESUdfRHluYW1pY19NSU4pKTsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCi0JCQkJCSAgICAgKCJvZG1fRElHMjNhKCkgOiBwRE1fT2RtLT5SU1NJX01pbiA9JWRcbiIsCi0JCQkJCSAgICAgcERNX09kbS0+UlNTSV9NaW4pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJRElHX0R5bmFtaWNfTUlOID0gZG1fZGlnX21pbjsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXggPSBkbV9kaWdfbWF4OwotCQlESUdfRHluYW1pY19NSU4gPSBkbV9kaWdfbWluOwotCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgib2RtX0RJRzIzYSgpIDogTm8gTGlua1xuIikpOwotCX0KLQotCS8qIDEgTW9kaWZ5IERJRyBsb3dlciBib3VuZCwgZGVhbCB3aXRoIGFibm9ybWFsbHkgbGFyZ2UgZmFsc2UgYWxhcm0gKi8KLQlpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsID4gMTAwMDApIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAotCQkJICAgICAoImRtX0RJRygpOiBBYm5vcm5hbGx5IGZhbHNlIGFsYXJtIGNhc2UuIFxuIikpOwotCi0JCWlmIChwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQgIT0gMykKLQkJCXBETV9EaWdUYWJsZS0+TGFyZ2VGQUhpdCsrOwotCQlpZiAocERNX0RpZ1RhYmxlLT5Gb3JiaWRkZW5JR0kgPCBDdXJyZW50SUdJKSB7Ci0JCQlwRE1fRGlnVGFibGUtPkZvcmJpZGRlbklHSSA9IEN1cnJlbnRJR0k7Ci0JCQlwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQgPSAxOwotCQl9Ci0KLQkJaWYgKHBETV9EaWdUYWJsZS0+TGFyZ2VGQUhpdCA+PSAzKSB7Ci0JCQlpZiAoKHBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJKzEpID4gcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heCkKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluID0gcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heDsKLQkJCWVsc2UKLQkJCQlwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWluID0gKHBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJICsgMSk7Ci0JCQlwRE1fRGlnVGFibGUtPlJlY292ZXJfY250ID0gMzYwMDsgLyogMzYwMCA9IDJociAqLwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogUmVjb3ZlcnkgbWVjaGFuaXNtIGZvciBJR0kgbG93ZXIgYm91bmQgKi8KLQkJaWYgKHBETV9EaWdUYWJsZS0+UmVjb3Zlcl9jbnQgIT0gMCkgewotCQkJcERNX0RpZ1RhYmxlLT5SZWNvdmVyX2NudC0tOwotCQl9IGVsc2UgewotCQkJaWYgKHBETV9EaWdUYWJsZS0+TGFyZ2VGQUhpdCA8IDMpIHsKLQkJCQlpZiAoKHBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJIC0gMSkgPCBESUdfRHluYW1pY19NSU4pIHsKLQkJCQkJcERNX0RpZ1RhYmxlLT5Gb3JiaWRkZW5JR0kgPSBESUdfRHluYW1pY19NSU47IC8qIERNX0RJR19NSU47ICovCi0JCQkJCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9taW4gPSBESUdfRHluYW1pY19NSU47IC8qIERNX0RJR19NSU47ICovCi0JCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKLQkJCQkJCSAgICAgKCJvZG1fRElHMjNhKCk6IE5vcm1hbCBDYXNlOiBBdCBMb3dlciBCb3VuZFxuIikpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBETV9EaWdUYWJsZS0+Rm9yYmlkZGVuSUdJLS07Ci0JCQkJCXBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9taW4gPSAocERNX0RpZ1RhYmxlLT5Gb3JiaWRkZW5JR0kgKyAxKTsKLQkJCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAotCQkJCQkJICAgICAoIm9kbV9ESUcyM2EoKTogTm9ybWFsIENhc2U6IEFwcHJvYWNoIExvd2VyIEJvdW5kXG4iKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlwRE1fRGlnVGFibGUtPkxhcmdlRkFIaXQgPSAwOwotCQkJfQotCQl9Ci0JfQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwgKCJvZG1fRElHMjNhKCk6IHBETV9EaWdUYWJsZS0+TGFyZ2VGQUhpdCA9JWRcbiIsIHBETV9EaWdUYWJsZS0+TGFyZ2VGQUhpdCkpOwotCi0JLyogMSBBZGp1c3QgaW5pdGlhbCBnYWluIGJ5IGZhbHNlIGFsYXJtICovCi0JaWYgKHBETV9PZG0tPmJMaW5rZWQpIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKTogRElHIEFmdGVyTGlua1xuIikpOwotCQlpZiAoRmlyc3RDb25uZWN0KSB7Ci0JCQlDdXJyZW50SUdJID0gcERNX09kbS0+UlNTSV9NaW47Ci0JCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgiRElHOiBGaXJzdCBDb25uZWN0XG4iKSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsID4gRE1fRElHX0ZBX1RIMikKLQkJCQlDdXJyZW50SUdJID0gQ3VycmVudElHSSArIDQ7LyogcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlID0gcERNX0RpZ1RhYmxlLT5QcmVJR1ZhbHVlKzI7ICovCi0JCQllbHNlIGlmIChwRmFsc2VBbG1DbnQtPkNudF9hbGwgPiBETV9ESUdfRkFfVEgxKQotCQkJCUN1cnJlbnRJR0kgPSBDdXJyZW50SUdJICsgMjsvKiBwRE1fRGlnVGFibGUtPkN1cklHVmFsdWUgPSBwRE1fRGlnVGFibGUtPlByZUlHVmFsdWUrMTsgKi8KLQkJCWVsc2UgaWYgKHBGYWxzZUFsbUNudC0+Q250X2FsbCA8IERNX0RJR19GQV9USDApCi0JCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0kgLSAyOy8qIHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IHBETV9EaWdUYWJsZS0+UHJlSUdWYWx1ZS0xOyAqLwotCQl9Ci0JfSBlbHNlIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKTogRElHIEJlZm9yZUxpbmtcbiIpKTsKLQkJaWYgKEZpcnN0RGlzQ29ubmVjdCkgewotCQkJQ3VycmVudElHSSA9IHBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9taW47Ci0JCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgib2RtX0RJRzIzYSgpOiBGaXJzdCBEaXNDb25uZWN0IFxuIikpOwotCQl9IGVsc2UgewotCQkJLyogMjAxMi4wMy4zMCBMdWtlTGVlOiBlbmFibGUgRElHIGJlZm9yZSBsaW5rIGJ1dCB3aXRoIHZlcnkgaGlnaCB0aHJlc2hvbGRzICovCi0JCQlpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsID4gMTAwMDApCi0JCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0kgKyAyOy8qIHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IHBETV9EaWdUYWJsZS0+UHJlSUdWYWx1ZSsyOyAqLwotCQkJZWxzZSBpZiAocEZhbHNlQWxtQ250LT5DbnRfYWxsID4gODAwMCkKLQkJCQlDdXJyZW50SUdJID0gQ3VycmVudElHSSArIDE7LyogcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlID0gcERNX0RpZ1RhYmxlLT5QcmVJR1ZhbHVlKzE7ICovCi0JCQllbHNlIGlmIChwRmFsc2VBbG1DbnQtPkNudF9hbGwgPCA1MDApCi0JCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0kgLSAxOy8qIHBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IHBETV9EaWdUYWJsZS0+UHJlSUdWYWx1ZS0xOyAqLwotCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKTogRW5nbGFuZCBESUcgXG4iKSk7Ci0JCX0KLQl9Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKTogRElHIEVuZCBBZGp1c3QgSUdJXG4iKSk7Ci0JLyogMSBDaGVjayBpbml0aWFsIGdhaW4gYnkgdXBwZXIvbG93ZXIgYm91bmQgKi8KLQlpZiAoQ3VycmVudElHSSA+IHBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9tYXgpCi0JCUN1cnJlbnRJR0kgPSBwRE1fRGlnVGFibGUtPnJ4X2dhaW5fcmFuZ2VfbWF4OwotCWlmIChDdXJyZW50SUdJIDwgcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21pbikKLQkJQ3VycmVudElHSSA9IHBETV9EaWdUYWJsZS0+cnhfZ2Fpbl9yYW5nZV9taW47Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgib2RtX0RJRzIzYSgpOiByeF9nYWluX3JhbmdlX21heCA9IDB4JXgsIHJ4X2dhaW5fcmFuZ2VfbWluID0gMHgleFxuIiwKLQkJcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21heCwgcERNX0RpZ1RhYmxlLT5yeF9nYWluX3JhbmdlX21pbikpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwgKCJvZG1fRElHMjNhKCk6IFRvdGFsRkEgPSVkXG4iLCBwRmFsc2VBbG1DbnQtPkNudF9hbGwpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgib2RtX0RJRzIzYSgpOiBDdXJJR1ZhbHVlID0gMHgleFxuIiwgQ3VycmVudElHSSkpOwotCi0JLyogMiBIaWdoIHBvd2VyIFJTU0kgdGhyZXNob2xkICovCi0KLQlPRE1fV3JpdGVfRElHMjNhKHBETV9PZG0sIEN1cnJlbnRJR0kpOy8qIE9ETV9Xcml0ZV9ESUcyM2EocERNX09kbSwgcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlKTsgKi8KLQlwRE1fRGlnVGFibGUtPmJNZWRpYUNvbm5lY3RfMCA9IHBETV9PZG0tPmJMaW5rZWQ7Ci0JcERNX0RpZ1RhYmxlLT5ESUdfRHluYW1pY19NSU5fMCA9IERJR19EeW5hbWljX01JTjsKLX0KLQotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgRkFTTEUgQUxBUk0gQ0hFQ0sgKi8KLS8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLXZvaWQgb2RtX0ZhbHNlQWxhcm1Db3VudGVyU3RhdGlzdGljczIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlzdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdHMgKkZhbHNlQWxtQ250ID0gJnBETV9PZG0tPkZhbHNlQWxtQ250OwotCXUzMiByZXRfdmFsdWUsIHZhbDMyOwotCi0JLyogaG9sZCBvZmRtIGNvdW50ZXIgKi8KLQkvKiBob2xkIHBhZ2UgQyBjb3VudGVyICovCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9IT0xEQ18xMU4pOwotCXZhbDMyIHw9IEJJVCgzMSk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX0hPTERDXzExTiwgdmFsMzIpOwotCS8qIGhvbGQgcGFnZSBEIGNvdW50ZXIgKi8KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOKTsKLQl2YWwzMiB8PSBCSVQoMzEpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTiwgdmFsMzIpOwotCXJldF92YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1RZUEUxXzExTik7Ci0JRmFsc2VBbG1DbnQtPkNudF9GYXN0X0ZzeW5jID0gKHJldF92YWx1ZSYweGZmZmYpOwotCUZhbHNlQWxtQ250LT5DbnRfU0JfU2VhcmNoX2ZhaWwgPSAocmV0X3ZhbHVlICYgMHhmZmZmMDAwMCk+PjE2OwotCXJldF92YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1RZUEUyXzExTik7Ci0JRmFsc2VBbG1DbnQtPkNudF9PRkRNX0NDQSA9IChyZXRfdmFsdWUmMHhmZmZmKTsKLQlGYWxzZUFsbUNudC0+Q250X1Bhcml0eV9GYWlsID0gKHJldF92YWx1ZSAmIDB4ZmZmZjAwMDApPj4xNjsKLQlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9UWVBFM18xMU4pOwotCUZhbHNlQWxtQ250LT5DbnRfUmF0ZV9JbGxlZ2FsID0gKHJldF92YWx1ZSYweGZmZmYpOwotCUZhbHNlQWxtQ250LT5DbnRfQ3JjOF9mYWlsID0gKHJldF92YWx1ZSAmIDB4ZmZmZjAwMDApPj4xNjsKLQlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9UWVBFNF8xMU4pOwotCUZhbHNlQWxtQ250LT5DbnRfTWNzX2ZhaWwgPSAocmV0X3ZhbHVlJjB4ZmZmZik7Ci0KLQlGYWxzZUFsbUNudC0+Q250X09mZG1fZmFpbCA9IEZhbHNlQWxtQ250LT5DbnRfUGFyaXR5X0ZhaWwgKwotCQlGYWxzZUFsbUNudC0+Q250X1JhdGVfSWxsZWdhbCArCi0JCUZhbHNlQWxtQ250LT5DbnRfQ3JjOF9mYWlsICsKLQkJRmFsc2VBbG1DbnQtPkNudF9NY3NfZmFpbCArCi0JCUZhbHNlQWxtQ250LT5DbnRfRmFzdF9Gc3luYyArCi0JCUZhbHNlQWxtQ250LT5DbnRfU0JfU2VhcmNoX2ZhaWw7Ci0JLyogaG9sZCBjY2sgY291bnRlciAqLwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOKTsKLQl2YWwzMiB8PSAoQklUKDEyKSB8IEJJVCgxNCkpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sIHZhbDMyKTsKLQotCXJldF92YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfTFNCXzExTikgJiAweGZmOwotCUZhbHNlQWxtQ250LT5DbnRfQ2NrX2ZhaWwgPSByZXRfdmFsdWU7Ci0JcmV0X3ZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9NU0JfMTFOKSA+PiAxNjsKLQlGYWxzZUFsbUNudC0+Q250X0Nja19mYWlsICs9IChyZXRfdmFsdWUgJiAweGZmMDApOwotCi0JcmV0X3ZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19DQ0FfQ05UXzExTik7Ci0JRmFsc2VBbG1DbnQtPkNudF9DQ0tfQ0NBID0KLQkJKChyZXRfdmFsdWUmMHhGRik8PDgpIHwgKChyZXRfdmFsdWUmMHhGRjAwKT4+OCk7Ci0KLQlGYWxzZUFsbUNudC0+Q250X2FsbCA9IChGYWxzZUFsbUNudC0+Q250X0Zhc3RfRnN5bmMgKwotCQkJCUZhbHNlQWxtQ250LT5DbnRfU0JfU2VhcmNoX2ZhaWwgKwotCQkJCUZhbHNlQWxtQ250LT5DbnRfUGFyaXR5X0ZhaWwgKwotCQkJCUZhbHNlQWxtQ250LT5DbnRfUmF0ZV9JbGxlZ2FsICsKLQkJCQlGYWxzZUFsbUNudC0+Q250X0NyYzhfZmFpbCArCi0JCQkJRmFsc2VBbG1DbnQtPkNudF9NY3NfZmFpbCArCi0JCQkJRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCk7Ci0KLQlGYWxzZUFsbUNudC0+Q250X0NDQV9hbGwgPQotCQlGYWxzZUFsbUNudC0+Q250X09GRE1fQ0NBICsgRmFsc2VBbG1DbnQtPkNudF9DQ0tfQ0NBOwotCi0JaWYgKHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgPj0gT0RNX1JUTDg3MjNBKSB7Ci0JCS8qIHJlc2V0IGZhbHNlIGFsYXJtIGNvdW50ZXIgcmVnaXN0ZXJzICovCi0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNUQ18xMU4pOwotCQl2YWwzMiB8PSBCSVQoMzEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNUQ18xMU4sIHZhbDMyKTsKLQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1RDXzExTik7Ci0JCXZhbDMyICY9IH5CSVQoMzEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNUQ18xMU4sIHZhbDMyKTsKLQotCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOKTsKLQkJdmFsMzIgfD0gQklUKDI3KTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOLCB2YWwzMik7Ci0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4pOwotCQl2YWwzMiAmPSB+QklUKDI3KTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOLCB2YWwzMik7Ci0KLQkJLyogdXBkYXRlIG9mZG0gY291bnRlciAqLwotCQkgLyogdXBkYXRlIHBhZ2UgQyBjb3VudGVyICovCi0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfSE9MRENfMTFOKTsKLQkJdmFsMzIgJj0gfkJJVCgzMSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9IT0xEQ18xMU4sIHZhbDMyKTsKLQotCQkgLyogdXBkYXRlIHBhZ2UgRCBjb3VudGVyICovCi0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4pOwotCQl2YWwzMiAmPSB+QklUKDMxKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOLCB2YWwzMik7Ci0KLQkJLyogcmVzZXQgQ0NLIENDQSBjb3VudGVyICovCi0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOKTsKLQkJdmFsMzIgJj0gfihCSVQoMTIpIHwgQklUKDEzKSB8IEJJVCgxNCkgfCBCSVQoMTUpKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTiwgdmFsMzIpOwotCi0JCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOKTsKLQkJdmFsMzIgfD0gKEJJVCgxMykgfCBCSVQoMTUpKTsKLQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTiwgdmFsMzIpOwotCX0KLQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIkVudGVyIG9kbV9GYWxzZUFsYXJtQ291bnRlclN0YXRpc3RpY3MyM2FcbiIpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJDbnRfRmFzdF9Gc3luYyA9JWQsIENudF9TQl9TZWFyY2hfZmFpbCA9JWRcbiIsCi0JCSAgICAgIEZhbHNlQWxtQ250LT5DbnRfRmFzdF9Gc3luYywKLQkJICAgICAgRmFsc2VBbG1DbnQtPkNudF9TQl9TZWFyY2hfZmFpbCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIkNudF9QYXJpdHlfRmFpbCA9JWQsIENudF9SYXRlX0lsbGVnYWwgPSVkXG4iLAotCQkgICAgICBGYWxzZUFsbUNudC0+Q250X1Bhcml0eV9GYWlsLAotCQkgICAgICBGYWxzZUFsbUNudC0+Q250X1JhdGVfSWxsZWdhbCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIkNudF9DcmM4X2ZhaWwgPSVkLCBDbnRfTWNzX2ZhaWwgPSVkXG4iLAotCQkgICAgICBGYWxzZUFsbUNudC0+Q250X0NyYzhfZmFpbCwgRmFsc2VBbG1DbnQtPkNudF9NY3NfZmFpbCkpOwotCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0ZBX0NOVCwgT0RNX0RCR19MT1VELAotCQkgICAgICgiQ250X0Nja19mYWlsID0lZFxuIiwgRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIkNudF9PZmRtX2ZhaWwgPSVkXG4iLCBGYWxzZUFsbUNudC0+Q250X09mZG1fZmFpbCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIlRvdGFsIEZhbHNlIEFsYXJtID0lZFxuIiwgRmFsc2VBbG1DbnQtPkNudF9hbGwpKTsKLX0KLQotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgQ0NLIFBhY2tldCBEZXRlY3QgVGhyZXNob2xkICovCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi12b2lkIG9kbV9DQ0tQYWNrZXREZXRlY3Rpb25UaHJlc2gyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cyAqRmFsc2VBbG1DbnQgPSAmcERNX09kbS0+RmFsc2VBbG1DbnQ7Ci0JdTggQ3VyQ0NLX0NDQVRocmVzOwotCi0JaWYgKHBETV9PZG0tPkV4dExOQSkKLQkJcmV0dXJuOwotCi0JaWYgKHBETV9PZG0tPmJMaW5rZWQpIHsKLQkJaWYgKHBETV9PZG0tPlJTU0lfTWluID4gMjUpIHsKLQkJCUN1ckNDS19DQ0FUaHJlcyA9IDB4Y2Q7Ci0JCX0gZWxzZSBpZiAocERNX09kbS0+UlNTSV9NaW4gPD0gMjUgJiYgcERNX09kbS0+UlNTSV9NaW4gPiAxMCkgewotCQkJQ3VyQ0NLX0NDQVRocmVzID0gMHg4MzsKLQkJfSBlbHNlIHsKLQkJCWlmIChGYWxzZUFsbUNudC0+Q250X0Nja19mYWlsID4gMTAwMCkKLQkJCQlDdXJDQ0tfQ0NBVGhyZXMgPSAweDgzOwotCQkJZWxzZQotCQkJCUN1ckNDS19DQ0FUaHJlcyA9IDB4NDA7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCA+IDEwMDApCi0JCQlDdXJDQ0tfQ0NBVGhyZXMgPSAweDgzOwotCQllbHNlCi0JCQlDdXJDQ0tfQ0NBVGhyZXMgPSAweDQwOwotCX0KLQotCU9ETV9Xcml0ZV9DQ0tfQ0NBX1RocmVzMjNhKHBETV9PZG0sIEN1ckNDS19DQ0FUaHJlcyk7Ci19Ci0KLXZvaWQgT0RNX1dyaXRlX0NDS19DQ0FfVGhyZXMyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1OCBDdXJDQ0tfQ0NBVGhyZXMpCi17Ci0Jc3RydWN0IGRpZ190ICpwRE1fRGlnVGFibGUgPSAmcERNX09kbS0+RE1fRGlnVGFibGU7Ci0KLQlpZiAocERNX0RpZ1RhYmxlLT5DdXJDQ0tfQ0NBVGhyZXMgIT0gQ3VyQ0NLX0NDQVRocmVzKQotCQlydGw4NzIzYXVfd3JpdGU4KHBETV9PZG0tPkFkYXB0ZXIsIE9ETV9SRUcoQ0NLX0NDQSwgcERNX09kbSksCi0JCQkJIEN1ckNDS19DQ0FUaHJlcyk7Ci0JcERNX0RpZ1RhYmxlLT5QcmVDQ0tfQ0NBVGhyZXMgPSBwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlczsKLQlwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlcyA9IEN1ckNDS19DQ0FUaHJlczsKLX0KLQotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgQkIgUG93ZXIgU2F2ZSAqLwotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXZvaWQgb2RtMjNhX0R5bkJCUFNJbml0KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3QgZHluYW1pY19wd3Jfc2F2ICpwRE1fUFNUYWJsZSA9ICZwRE1fT2RtLT5ETV9QU1RhYmxlOwotCi0JcERNX1BTVGFibGUtPlByZUNDQVN0YXRlID0gQ0NBX01BWDsKLQlwRE1fUFNUYWJsZS0+Q3VyQ0NBU3RhdGUgPSBDQ0FfTUFYOwotCXBETV9QU1RhYmxlLT5QcmVSRlN0YXRlID0gUkZfTUFYOwotCXBETV9QU1RhYmxlLT5DdXJSRlN0YXRlID0gUkZfTUFYOwotCXBETV9QU1RhYmxlLT5Sc3NpX3ZhbF9taW4gPSAwOwotCXBETV9QU1RhYmxlLT5pbml0aWFsaXplID0gMDsKLX0KLQotCi12b2lkIE9ETV9SRl9TYXZpbmcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1OCBiRm9yY2VJbk5vcm1hbCkKLXsKLQlzdHJ1Y3QgZHluYW1pY19wd3Jfc2F2ICpwRE1fUFNUYWJsZSA9ICZwRE1fT2RtLT5ETV9QU1RhYmxlOwotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JdTMyIHZhbDMyOwotCXU4IFJzc2lfVXBfYm91bmQgPSAzMDsKLQl1OCBSc3NpX0xvd19ib3VuZCA9IDI1OwotCWlmIChwRE1fUFNUYWJsZS0+aW5pdGlhbGl6ZSA9PSAwKSB7Ci0KLQkJcERNX1BTVGFibGUtPlJlZzg3NCA9Ci0JCQlydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODc0KSAmIDB4MUNDMDAwOwotCQlwRE1fUFNUYWJsZS0+UmVnQzcwID0KLQkJCXJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHhjNzApICYgQklUKDMpOwotCQlwRE1fUFNUYWJsZS0+UmVnODVDID0KLQkJCXJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NWMpICYgMHhGRjAwMDAwMDsKLQkJcERNX1BTVGFibGUtPlJlZ0E3NCA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHhhNzQpICYgMHhGMDAwOwotCQlwRE1fUFNUYWJsZS0+aW5pdGlhbGl6ZSA9IDE7Ci0JfQotCi0JaWYgKCFiRm9yY2VJbk5vcm1hbCkgewotCQlpZiAocERNX09kbS0+UlNTSV9NaW4gIT0gMHhGRikgewotCQkJaWYgKHBETV9QU1RhYmxlLT5QcmVSRlN0YXRlID09IFJGX05vcm1hbCkgewotCQkJCWlmIChwRE1fT2RtLT5SU1NJX01pbiA+PSBSc3NpX1VwX2JvdW5kKQotCQkJCQlwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSA9IFJGX1NhdmU7Ci0JCQkJZWxzZQotCQkJCQlwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSA9IFJGX05vcm1hbDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBETV9PZG0tPlJTU0lfTWluIDw9IFJzc2lfTG93X2JvdW5kKQotCQkJCQlwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSA9IFJGX05vcm1hbDsKLQkJCQllbHNlCi0JCQkJCXBETV9QU1RhYmxlLT5DdXJSRlN0YXRlID0gUkZfU2F2ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXBETV9QU1RhYmxlLT5DdXJSRlN0YXRlID0gUkZfTUFYOwotCQl9Ci0JfSBlbHNlIHsKLQkJcERNX1BTVGFibGUtPkN1clJGU3RhdGUgPSBSRl9Ob3JtYWw7Ci0JfQotCi0JaWYgKHBETV9QU1RhYmxlLT5QcmVSRlN0YXRlICE9IHBETV9QU1RhYmxlLT5DdXJSRlN0YXRlKSB7Ci0JCWlmIChwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSA9PSBSRl9TYXZlKSB7Ci0JCQkvKiAgPHR5bmxpX25vdGU+IDg3MjMgUlNTSSByZXBvcnQgd2lsbCBiZSB3cm9uZy4KLQkJCSAqIFNldCAweDg3NFs1XT0gMSB3aGVuIGVudGVyIEJCIHBvd2VyIHNhdmluZyBtb2RlLiAqLwotCQkJLyogIFN1Z2dlc3RlZCBieSBTRDMgWXUtTmFuLiAyMDExLjAxLjIwLiAqLwotCQkJLyogUmVnODc0WzVdPSAxYicxICovCi0JCQlpZiAocERNX09kbS0+U3VwcG9ydElDVHlwZSA9PSBPRE1fUlRMODcyM0EpIHsKLQkJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOwotCQkJCXZhbDMyIHw9IEJJVCg1KTsKLQkJCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweDg3NCwgdmFsMzIpOwotCQkJfQotCQkJLyogUmVnODc0WzIwOjE4XT0gMydiMDEwICovCi0JCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOwotCQkJdmFsMzIgJj0gfihCSVQoMTgpIHwgQklUKDIwKSk7Ci0JCQl2YWwzMiB8PSBCSVQoMTkpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKLQkJCS8qIFJlZ0M3MFszXT0gMSdiMCAqLwotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4YzcwKTsKLQkJCXZhbDMyICY9IH5CSVQoMyk7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweGM3MCwgdmFsMzIpOwotCQkJLyogUmVnODVDWzMxOjI0XT0gMHg2MyAqLwotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODVjKTsKLQkJCXZhbDMyICY9IDB4MDBmZmZmZmY7Ci0JCQl2YWwzMiB8PSAweDYzMDAwMDAwOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NWMsIHZhbDMyKTsKLQkJCS8qIFJlZzg3NFsxNToxNF09IDInYjEwICovCi0JCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOwotCQkJdmFsMzIgJj0gfkJJVCgxNCk7Ci0JCQl2YWwzMiB8PSBCSVQoMTUpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKLQkJCS8qIFJlZ0E3NVs3OjRdPSAweDMgKi8KLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweGE3NCk7Ci0JCQl2YWwzMiAmPSB+KEJJVCgxNCkgfCBCSVQoMTUpKTsKLQkJCXZhbDMyIHw9IChCSVQoMTIpIHwgQklUKDEzKSk7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweGE3NCwgdmFsMzIpOwotCQkJLyogUmVnODE4WzI4XT0gMSdiMCAqLwotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODE4KTsKLQkJCXZhbDMyICY9IH5CSVQoMjgpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MTgsIHZhbDMyKTsKLQkJCS8qIFJlZzgxOFsyOF09IDEnYjEgKi8KLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgxOCk7Ci0JCQl2YWwzMiB8PSBCSVQoMjgpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MTgsIHZhbDMyKTsKLQkJfSBlbHNlIHsKLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDg3NCk7Ci0JCQl2YWwzMiB8PSBwRE1fUFNUYWJsZS0+UmVnODc0OwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKLQotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4YzcwKTsKLQkJCXZhbDMyIHw9IHBETV9QU1RhYmxlLT5SZWdDNzA7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweGM3MCwgdmFsMzIpOwotCi0JCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NWMpOwotCQkJdmFsMzIgfD0gcERNX1BTVGFibGUtPlJlZzg1QzsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODVjLCB2YWwzMik7Ci0KLQkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweGE3NCk7Ci0JCQl2YWwzMiB8PSBwRE1fUFNUYWJsZS0+UmVnQTc0OwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHhhNzQsIHZhbDMyKTsKLQotCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODE4KTsKLQkJCXZhbDMyICY9IH5CSVQoMjgpOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MTgsIHZhbDMyKTsKLQotCQkJLyogUmVnODc0WzVdPSAxYicwICovCi0JCQlpZiAocERNX09kbS0+U3VwcG9ydElDVHlwZSA9PSBPRE1fUlRMODcyM0EpIHsKLQkJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOwotCQkJCXZhbDMyICY9IH5CSVQoNSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKLQkJCX0KLQkJfQotCQlwRE1fUFNUYWJsZS0+UHJlUkZTdGF0ZSA9IHBETV9QU1RhYmxlLT5DdXJSRlN0YXRlOwotCX0KLX0KLQotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgUkFUUiBNQVNLICovCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgUmF0ZSBBZGFwdGl2ZSAqLwotLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotdm9pZCBvZG1fUmF0ZUFkYXB0aXZlTWFza0luaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBvZG1fcmF0ZV9hZGFwdCAqcE9kbVJBID0gJnBETV9PZG0tPlJhdGVBZGFwdGl2ZTsKLQotCXBPZG1SQS0+VHlwZSA9IERNX1R5cGVfQnlEcml2ZXI7Ci0KLQlwT2RtUkEtPlJBVFJTdGF0ZSA9IERNX1JBVFJfU1RBX0lOSVQ7Ci0JcE9kbVJBLT5IaWdoUlNTSVRocmVzaCA9IDUwOwotCXBPZG1SQS0+TG93UlNTSVRocmVzaCA9IDIwOwotfQotCi11MzIgT0RNX0dldF9SYXRlX0JpdG1hcDIzYShzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhLCB1MzIgbWFjaWQsCi0JCQkgICB1MzIgcmFfbWFzaywgdTggcnNzaV9sZXZlbCkKLXsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0Jc3RydWN0IHN0YV9pbmZvICpwRW50cnk7Ci0JdTMyIHJhdGVfYml0bWFwID0gMHgwZmZmZmZmZjsKLQl1OCBXaXJlbGVzc01vZGU7Ci0KLQlwRW50cnkgPSBwRE1fT2RtLT5wT0RNX1N0YUluZm9bbWFjaWRdOwotCWlmICghcEVudHJ5KQotCQlyZXR1cm4gcmFfbWFzazsKLQotCVdpcmVsZXNzTW9kZSA9IHBFbnRyeS0+d2lyZWxlc3NfbW9kZTsKLQotCXN3aXRjaCAoV2lyZWxlc3NNb2RlKSB7Ci0JY2FzZSBPRE1fV01fQjoKLQkJaWYgKHJhX21hc2sgJiAweDAwMDAwMDBjKQkJLyogMTFNIG9yIDUuNU0gZW5hYmxlICovCi0JCQlyYXRlX2JpdG1hcCA9IDB4MDAwMDAwMGQ7Ci0JCWVsc2UKLQkJCXJhdGVfYml0bWFwID0gMHgwMDAwMDAwZjsKLQkJYnJlYWs7Ci0JY2FzZSAoT0RNX1dNX0F8T0RNX1dNX0cpOgotCQlpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9ISUdIKQotCQkJcmF0ZV9iaXRtYXAgPSAweDAwMDAwZjAwOwotCQllbHNlCi0JCQlyYXRlX2JpdG1hcCA9IDB4MDAwMDBmZjA7Ci0JCWJyZWFrOwotCWNhc2UgKE9ETV9XTV9CfE9ETV9XTV9HKToKLQkJaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfSElHSCkKLQkJCXJhdGVfYml0bWFwID0gMHgwMDAwMGYwMDsKLQkJZWxzZSBpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9NSURETEUpCi0JCQlyYXRlX2JpdG1hcCA9IDB4MDAwMDBmZjA7Ci0JCWVsc2UKLQkJCXJhdGVfYml0bWFwID0gMHgwMDAwMGZmNTsKLQkJYnJlYWs7Ci0JY2FzZSAoT0RNX1dNX0J8T0RNX1dNX0d8T0RNX1dNX04yNEcpOgotCWNhc2UgKE9ETV9XTV9BfE9ETV9XTV9CfE9ETV9XTV9HfE9ETV9XTV9OMjRHKToKLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzFUMlIgfHwKLQkJICAgIHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzFUMVIpIHsKLQkJCWlmIChyc3NpX2xldmVsID09IERNX1JBVFJfU1RBX0hJR0gpIHsKLQkJCQlyYXRlX2JpdG1hcCA9IDB4MDAwZjAwMDA7Ci0JCQl9IGVsc2UgaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfTUlERExFKSB7Ci0JCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmMDAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcgPT0KLQkJCQkgICAgSFRfQ0hBTk5FTF9XSURUSF80MCkKLQkJCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmMDE1OwotCQkJCWVsc2UKLQkJCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmMDA1OwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfSElHSCkgewotCQkJCXJhdGVfYml0bWFwID0gMHgwZjhmMDAwMDsKLQkJCX0gZWxzZSBpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9NSURETEUpIHsKLQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZmYwMDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyA9PQotCQkJCSAgICBIVF9DSEFOTkVMX1dJRFRIXzQwKQotCQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZmYwMTU7Ci0JCQkJZWxzZQotCQkJCQlyYXRlX2JpdG1hcCA9IDB4MGY4ZmYwMDU7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogY2FzZSBXSVJFTEVTU18xMV8yNE46ICovCi0JCS8qIGNhc2UgV0lSRUxFU1NfMTFfNU46ICovCi0JCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8xVDJSKQotCQkJcmF0ZV9iaXRtYXAgPSAweDAwMGZmZmZmOwotCQllbHNlCi0JCQlyYXRlX2JpdG1hcCA9IDB4MGZmZmZmZmY7Ci0JCWJyZWFrOwotCX0KLQotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9SQV9NQVNLLCBPRE1fREJHX0xPVUQsCi0JKCIgPT0+IHJzc2lfbGV2ZWw6MHglMDJ4LCBXaXJlbGVzc01vZGU6MHglMDJ4LCByYXRlX2JpdG1hcDoweCUwOHggXG4iLAotCSByc3NpX2xldmVsLCBXaXJlbGVzc01vZGUsIHJhdGVfYml0bWFwKSk7Ci0KLQlyZXR1cm4gcmF0ZV9iaXRtYXA7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOglvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2soKQotICoKLSAqIE92ZXJ2aWV3OglVcGRhdGUgcmF0ZSB0YWJsZSBtYXNrIGFjY29yZGluZyB0byByc3NpCi0gKgotICogSW5wdXQ6CQlOT05FCi0gKgotICogT3V0cHV0OgkJTk9ORQotICoKLSAqIFJldHVybjoJCU5PTkUKLSAqCi0gKiBSZXZpc2VkIEhpc3Rvcnk6Ci0gKldoZW4JCVdobwkJUmVtYXJrCi0gKjA1LzI3LzIwMDkJaHBmYW4JQ3JlYXRlIFZlcnNpb24gMC4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2soc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCXUzMiBzbW9vdGhlZDsKLQl1OCBpOwotCi0JaWYgKHBBZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkgewotCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfUkFfTUFTSywgT0RNX0RCR19UUkFDRSwKLQkJCSAgICAgKCI8LS0tLSAlczogZHJpdmVyIGlzIGdvaW5nIHRvIHVubG9hZFxuIiwKLQkJCSAgICAgIF9fZnVuY19fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgT0RNX0FTU09DSUFURV9FTlRSWV9OVU07IGkrKykgewotCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGF0ID0gcERNX09kbS0+cE9ETV9TdGFJbmZvW2ldOwotCQlpZiAocHN0YXQpIHsKLQkJCXNtb290aGVkID0gcHN0YXQtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQkJCWlmIChPRE1fUkFTdGF0ZUNoZWNrMjNhKHBETV9PZG0sIHNtb290aGVkLCBmYWxzZSwKLQkJCQkJCSZwc3RhdC0+cnNzaV9sZXZlbCkpIHsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfUkFfTUFTSywKLQkJCQkJICAgICBPRE1fREJHX0xPVUQsCi0JCQkJCSAgICAgKCJSU1NJOiVkLCBSU1NJX0xFVkVMOiVkXG4iLAotCQkJCQkgICAgICBzbW9vdGhlZCwKLQkJCQkJICAgICAgcHN0YXQtPnJzc2lfbGV2ZWwpKTsKLQkJCQlydHdfaGFsX3VwZGF0ZV9yYV9tYXNrMjNhKHBzdGF0LAotCQkJCQkJCSAgcHN0YXQtPnJzc2lfbGV2ZWwpOwotCQkJfQotCQl9Ci0JfQotfQotCi0vKiAgUmV0dXJuIFZhbHVlOiBib29sICovCi0vKiAgLSB0cnVlOiBSQVRSU3RhdGUgaXMgY2hhbmdlZC4gKi8KLWJvb2wgT0RNX1JBU3RhdGVDaGVjazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHMzMiBSU1NJLCBib29sIGJGb3JjZVVwZGF0ZSwKLQkJCSB1OCAqcFJBVFJTdGF0ZSkKLXsKLQlzdHJ1Y3Qgb2RtX3JhdGVfYWRhcHQgKnBSQSA9ICZwRE1fT2RtLT5SYXRlQWRhcHRpdmU7Ci0JY29uc3QgdTggR29VcEdhcCA9IDU7Ci0JdTggSGlnaFJTU0lUaHJlc2hGb3JSQSA9IHBSQS0+SGlnaFJTU0lUaHJlc2g7Ci0JdTggTG93UlNTSVRocmVzaEZvclJBID0gcFJBLT5Mb3dSU1NJVGhyZXNoOwotCXU4IFJBVFJTdGF0ZTsKLQotCS8qICBUaHJlc2hvbGQgQWRqdXN0bWVudDogKi8KLQkvKiAgd2hlbiBSU1NJIHN0YXRlIHRyZW5kcyB0byBnbyB1cCBvbmUgb3IgdHdvIGxldmVscywgbWFrZSBzdXJlIFJTU0kgaXMgaGlnaCBlbm91Z2guICovCi0JLyogIEhlcmUgR29VcEdhcCBpcyBhZGRlZCB0byBzb2x2ZSB0aGUgYm91bmRhcnkncyBsZXZlbCBhbHRlcm5hdGlvbiBpc3N1ZS4gKi8KLQlzd2l0Y2ggKCpwUkFUUlN0YXRlKSB7Ci0JY2FzZSBETV9SQVRSX1NUQV9JTklUOgotCWNhc2UgRE1fUkFUUl9TVEFfSElHSDoKLQkJYnJlYWs7Ci0JY2FzZSBETV9SQVRSX1NUQV9NSURETEU6Ci0JCUhpZ2hSU1NJVGhyZXNoRm9yUkEgKz0gR29VcEdhcDsKLQkJYnJlYWs7Ci0JY2FzZSBETV9SQVRSX1NUQV9MT1c6Ci0JCUhpZ2hSU1NJVGhyZXNoRm9yUkEgKz0gR29VcEdhcDsKLQkJTG93UlNTSVRocmVzaEZvclJBICs9IEdvVXBHYXA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU9ETV9SVF9BU1NFUlQocERNX09kbSwgZmFsc2UsICgid3JvbmcgcnNzaSBsZXZlbCBzZXR0aW5nICVkICEiLAotCQkJCQkgICAgICAgKnBSQVRSU3RhdGUpKTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogIERlY2lkZSBSQVRSU3RhdGUgYnkgUlNTSS4gKi8KLQlpZiAoUlNTSSA+IEhpZ2hSU1NJVGhyZXNoRm9yUkEpCi0JCVJBVFJTdGF0ZSA9IERNX1JBVFJfU1RBX0hJR0g7Ci0JZWxzZSBpZiAoUlNTSSA+IExvd1JTU0lUaHJlc2hGb3JSQSkKLQkJUkFUUlN0YXRlID0gRE1fUkFUUl9TVEFfTUlERExFOwotCWVsc2UKLQkJUkFUUlN0YXRlID0gRE1fUkFUUl9TVEFfTE9XOwotCi0JaWYgKCpwUkFUUlN0YXRlICE9IFJBVFJTdGF0ZSB8fCBiRm9yY2VVcGRhdGUpIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX1JBX01BU0ssIE9ETV9EQkdfTE9VRCwKLQkJCSAgICAgKCJSU1NJIExldmVsICVkIC0+ICVkXG4iLCAqcFJBVFJTdGF0ZSwgUkFUUlN0YXRlKSk7Ci0JCSpwUkFUUlN0YXRlID0gUkFUUlN0YXRlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogMyBEeW5hbWljIFR4IFBvd2VyICovCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi12b2lkIG9kbV9EeW5hbWljVHhQb3dlcjIzYUluaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCi0JLyoKLQkgKiBUaGlzIGlzIG5ldmVyIGNoYW5nZWQsIHNvIHdlIHNob3VsZCBiZSBhYmxlIHRvIGNsZWFuIHVwIHRoZQotCSAqIGNvZGUgY2hlY2tpbmcgZm9yIGRpZmZlcmVudCB2YWx1ZXMgaW4gcnRsODcyM2FfcmY2MDUyLmMKLQkgKi8KLQlwZG1wcml2LT5EeW5hbWljVHhIaWdoUG93ZXJMdmwgPSBUeEhpZ2hQd3JMZXZlbF9Ob3JtYWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1GaW5kTWluaW11bVJTU0koc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBBZGFwdGVyKTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQotCS8qIDEgMS5EZXRlcm1pbmUgdGhlIG1pbmltdW0gUlNTSSAqLwotCi0JaWYgKCFwRE1fT2RtLT5iTGlua2VkICYmICFwZG1wcml2LT5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKQotCQlwZG1wcml2LT5NaW5VbmRlY29yYXRlZFBXREJGb3JETSA9IDA7Ci0JZWxzZQotCQlwZG1wcml2LT5NaW5VbmRlY29yYXRlZFBXREJGb3JETSA9Ci0JCQlwZG1wcml2LT5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotfQotCi1zdGF0aWMgdm9pZCBvZG1fUlNTSU1vbml0b3JDaGVjayhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0JaW50IGk7Ci0JaW50IE1heERCID0gMCwgTWluREIgPSAweGZmOwotCXU4IHN0YV9jbnQgPSAwOwotCXUzMiB0bXBkYjsKLQl1MzIgUFdEQl9yc3NpW05VTV9TVEFdID0gezB9Oy8qIDB+MTVdOk1BQ0lELCBbMTZ+MzFdOlBXREJfcnNzaSAqLwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQotCWlmICghcERNX09kbS0+YkxpbmtlZCkKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IE9ETV9BU1NPQ0lBVEVfRU5UUllfTlVNOyBpKyspIHsKLQkJcHN0YSA9IHBETV9PZG0tPnBPRE1fU3RhSW5mb1tpXTsKLQkJaWYgKHBzdGEpIHsKLQkJCWlmIChwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPCBNaW5EQikKLQkJCQlNaW5EQiA9IHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQotCQkJaWYgKHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA+IE1heERCKQotCQkJCU1heERCID0gcHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCi0JCQlpZiAocHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCICE9IC0xKSB7Ci0JCQkJdG1wZGIgPSBwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JCQkJUFdEQl9yc3NpW3N0YV9jbnQrK10gPSBwc3RhLT5tYWNfaWQgfAotCQkJCQkodG1wZGIgPDwgMTYpOwotCQkJfQotCQl9Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IHN0YV9jbnQ7IGkrKykgewotCQlpZiAoUFdEQl9yc3NpW2ldICE9ICgwKSkKLQkJCXJ0bDg3MjNhX3NldF9yc3NpX2NtZChBZGFwdGVyLCBQV0RCX3Jzc2lbaV0pOwotCX0KLQotCXBkbXByaXYtPkVudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSBNYXhEQjsKLQotCWlmIChNaW5EQiAhPSAweGZmKSAvKiAgSWYgYXNzb2NpYXRlZCBlbnRyeSBpcyBmb3VuZCAqLwotCQlwZG1wcml2LT5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gTWluREI7Ci0JZWxzZQotCQlwZG1wcml2LT5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMDsKLQotCUZpbmRNaW5pbXVtUlNTSShBZGFwdGVyKTsvKiBnZXQgcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0gKi8KLQotCU9ETV9DbW5JbmZvVXBkYXRlMjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgT0RNX0NNTklORk9fUlNTSV9NSU4sCi0JCQkgICAgIHBkbXByaXYtPk1pblVuZGVjb3JhdGVkUFdEQkZvckRNKTsKLX0KLQotLyogZW5kaWYgKi8KLS8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAzIFR4IFBvd2VyIFRyYWNraW5nICovCi0vKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1zdGF0aWMgdm9pZCBvZG1fVFhQb3dlclRyYWNraW5nSW5pdChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0KLQlwZG1wcml2LT5iVFhQb3dlclRyYWNraW5nID0gdHJ1ZTsKLQlwZG1wcml2LT5UWFBvd2VyY291bnQgPSAwOwotCXBkbXByaXYtPmJUWFBvd2VyVHJhY2tpbmdJbml0ID0gZmFsc2U7Ci0JcGRtcHJpdi0+VHhQb3dlclRyYWNrQ29udHJvbCA9IHRydWU7Ci0JTVNHXzg3MjNBKCJwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sID0gJWRcbiIsCi0JCSAgcGRtcHJpdi0+VHhQb3dlclRyYWNrQ29udHJvbCk7Ci0KLQlwRE1fT2RtLT5SRkNhbGlicmF0ZUluZm8uVHhQb3dlclRyYWNrQ29udHJvbCA9IHRydWU7Ci19Ci0KLS8qIEVEQ0EgVHVyYm8gKi8KLXN0YXRpYyB2b2lkIE9ETV9FZGNhVHVyYm9Jbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCi0JcERNX09kbS0+RE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSA9IGZhbHNlOwotCUFkYXB0ZXItPnJlY3Zwcml2LmJJc0FueU5vbkJFUGt0cyA9IGZhbHNlOwotCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIk9yZ2luaWFsIFZPIFBBUkFNOiAweCV4XG4iLAotCQkgICAgICBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX1ZPX1BBUkFNKSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJPcmdpbmlhbCBWSSBQQVJBTTogMHgleFxuIiwKLQkJICAgICAgcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBPRE1fRURDQV9WSV9QQVJBTSkpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELAotCQkgICAgICgiT3JnaW5pYWwgQkUgUEFSQU06IDB4JXhcbiIsCi0JCSAgICAgIHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgT0RNX0VEQ0FfQkVfUEFSQU0pKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIk9yZ2luaWFsIEJLIFBBUkFNOiAweCV4XG4iLAotCQkgICAgICBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX0JLX1BBUkFNKSkpOwotfQotCi1zdGF0aWMgdm9pZCBvZG1fRWRjYVR1cmJvQ2hlY2syM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmQWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJkFkYXB0ZXItPnJlY3Zwcml2OwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVncHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJkFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXUzMiB0cmFmZmljSW5kZXg7Ci0JdTMyIGVkY2FfcGFyYW07Ci0JdTY0IGN1cl90eF9ieXRlczsKLQl1NjQgY3VyX3J4X2J5dGVzOwotCi0JLyogIEZvciBBUC9BRFNMIHVzZSBzdHJ1Y3QgcnRsODcyM2FfcHJpdiAqICovCi0JLyogIEZvciBDRS9OSUMgdXNlIHN0cnVjdCBydHdfYWRhcHRlciAqICovCi0KLQkvKgotCSAqIDIwMTEvMDkvMjkgTUggSW4gSFcgaW50ZWdyYXRpb24gZmlyc3Qgc3RhZ2UsIHdlIHByb3ZpZGUgNAotCSAqIGRpZmZlcmVudCBoYW5kbGUgdG8gb3BlcmF0ZSBhdCB0aGUgc2FtZSB0aW1lLiBJbiB0aGUgc3RhZ2UyLzMsCi0JICogd2UgbmVlZCB0byBwcml2ZSB1bml2ZXJzYWwgaW50ZXJmYWNlIGFuZCBtZXJnZSBhbGwgSFcgZHluYW1pYwotCSAqIG1lY2hhbmlzbS4KLQkgKi8KLQotCWlmICgocHJlZ3ByaXYtPndpZmlfc3BlYyA9PSAxKSkvKiAgKHBtbG1laW5mby0+SFRfZW5hYmxlID09IDApKSAqLwotCQlnb3RvIGRtX0NoZWNrRWRjYVR1cmJvX0VYSVQ7Ci0KLQlpZiAocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPj0gIEhUX0lPVF9QRUVSX01BWCkKLQkJZ290byBkbV9DaGVja0VkY2FUdXJib19FWElUOwotCi0JaWYgKHJ0bDg3MjNhX0JUX2Rpc2FibGVfRURDQV90dXJibyhBZGFwdGVyKSkKLQkJZ290byBkbV9DaGVja0VkY2FUdXJib19FWElUOwotCi0JLyogIENoZWNrIGlmIHRoZSBzdGF0dXMgbmVlZHMgdG8gYmUgY2hhbmdlZC4gKi8KLQlpZiAoIXByZWN2cHJpdi0+YklzQW55Tm9uQkVQa3RzKSB7Ci0JCWN1cl90eF9ieXRlcyA9IHB4bWl0cHJpdi0+dHhfYnl0ZXMgLSBweG1pdHByaXYtPmxhc3RfdHhfYnl0ZXM7Ci0JCWN1cl9yeF9ieXRlcyA9IHByZWN2cHJpdi0+cnhfYnl0ZXMgLSBwcmVjdnByaXYtPmxhc3RfcnhfYnl0ZXM7Ci0KLQkJLyogdHJhZmZpYywgVFggb3IgUlggKi8KLQkJaWYgKChwbWxtZWluZm8tPmFzc29jX0FQX3ZlbmRvciA9PSBIVF9JT1RfUEVFUl9SQUxJTkspIHx8Ci0JCSAgICAocG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3IgPT0gSFRfSU9UX1BFRVJfQVRIRVJPUykpIHsKLQkJCWlmIChjdXJfdHhfYnl0ZXMgPiAoY3VyX3J4X2J5dGVzIDw8IDIpKSB7Ci0JCQkJLyogIFVwbGluayBUUCBpcyBwcmVzZW50LiAqLwotCQkJCXRyYWZmaWNJbmRleCA9IFVQX0xJTks7Ci0JCQl9IGVsc2UgeyAvKiAgQmFsYW5jZSBUUCBpcyBwcmVzZW50LiAqLwotCQkJCXRyYWZmaWNJbmRleCA9IERPV05fTElOSzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChjdXJfcnhfYnl0ZXMgPiAoY3VyX3R4X2J5dGVzIDw8IDIpKSB7Ci0JCQkJLyogIERvd25saW5rIFRQIGlzIHByZXNlbnQuICovCi0JCQkJdHJhZmZpY0luZGV4ID0gRE9XTl9MSU5LOwotCQkJfSBlbHNlIHsgLyogIEJhbGFuY2UgVFAgaXMgcHJlc2VudC4gKi8KLQkJCQl0cmFmZmljSW5kZXggPSBVUF9MSU5LOwotCQkJfQotCQl9Ci0KLQkJaWYgKChwRE1fT2RtLT5ETV9FRENBX1RhYmxlLnBydl90cmFmZmljX2lkeCAhPSB0cmFmZmljSW5kZXgpIHx8Ci0JCSAgICAoIXBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EpKSB7Ci0JCQlpZiAoKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX0NJU0NPKSAmJgotCQkJICAgIChwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMV8yNE4pKQotCQkJCWVkY2FfcGFyYW0gPSBFRENBUGFyYW1bcG1sbWVpbmZvLT5hc3NvY19BUF92ZW5kb3JdW3RyYWZmaWNJbmRleF07Ci0JCQllbHNlCi0JCQkJZWRjYV9wYXJhbSA9IEVEQ0FQYXJhbVtIVF9JT1RfUEVFUl9VTktOT1dOXVt0cmFmZmljSW5kZXhdOwotCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0VEQ0FfQkVfUEFSQU0sCi0JCQkJCSAgZWRjYV9wYXJhbSk7Ci0KLQkJCXBETV9PZG0tPkRNX0VEQ0FfVGFibGUucHJ2X3RyYWZmaWNfaWR4ID0gdHJhZmZpY0luZGV4OwotCQl9Ci0KLQkJcERNX09kbS0+RE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJLyogIFR1cm4gT2ZmIEVEQ0EgdHVyYm8gaGVyZS4gKi8KLQkJLyogIFJlc3RvcmUgb3JpZ2luYWwgRURDQSBhY2NvcmRpbmcgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIEFQLiAqLwotCQlpZiAocERNX09kbS0+RE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSkgewotCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0VEQ0FfQkVfUEFSQU0sCi0JCQkJCSAgcEhhbERhdGEtPkFjUGFyYW1fQkUpOwotCQkJcERNX09kbS0+RE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSA9IGZhbHNlOwotCQl9Ci0JfQotCi1kbV9DaGVja0VkY2FUdXJib19FWElUOgotCS8qICBTZXQgdmFyaWFibGVzIGZvciBuZXh0IHRpbWUuICovCi0JcHJlY3Zwcml2LT5iSXNBbnlOb25CRVBrdHMgPSBmYWxzZTsKLQlweG1pdHByaXYtPmxhc3RfdHhfYnl0ZXMgPSBweG1pdHByaXYtPnR4X2J5dGVzOwotCXByZWN2cHJpdi0+bGFzdF9yeF9ieXRlcyA9IHByZWN2cHJpdi0+cnhfYnl0ZXM7Ci19Ci0KLXUzMiBHZXRQU0REYXRhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdW5zaWduZWQgaW50IHBvaW50LAotCSAgICAgICB1OCBpbml0aWFsX2dhaW5fcHNkKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JdTMyIHBzZF9yZXBvcnQsIHZhbDMyOwotCi0JLyogU2V0IERDTyBmcmVxdWVuY3kgaW5kZXgsIG9mZnNldCA9ICg0ME1Iei9TYW1wbGVQdHMpKnBvaW50ICovCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODA4KTsKLQl2YWwzMiAmPSB+MHgzZmY7Ci0JdmFsMzIgfD0gKHBvaW50ICYgMHgzZmYpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODA4LCB2YWwzMik7Ci0KLQkvKiBTdGFydCBQU0QgY2FsY3VsYXRpb24sIFJlZzgwOFsyMl09IDAtPjEgKi8KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4MDgpOwotCXZhbDMyIHw9IEJJVCgyMik7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MDgsIHZhbDMyKTsKLQkvKiBOZWVkIHRvIHdhaXQgZm9yIEhXIFBTRCByZXBvcnQgKi8KLQl1ZGVsYXkoMzApOwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgwOCk7Ci0JdmFsMzIgJj0gfkJJVCgyMik7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MDgsIHZhbDMyKTsKLQkvKiBSZWFkIFBTRCByZXBvcnQsIFJlZzhCNFsxNTowXSAqLwotCXBzZF9yZXBvcnQgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4OEI0KSAmIDB4MDAwMEZGRkY7Ci0KLQlwc2RfcmVwb3J0ID0gKHUzMikoQ29udmVydFRvX2RCMjNhKHBzZF9yZXBvcnQpKSArCi0JCSh1MzIpKGluaXRpYWxfZ2Fpbl9wc2QtMHgxYyk7Ci0KLQlyZXR1cm4gcHNkX3JlcG9ydDsKLX0KLQotdTMyIENvbnZlcnRUb19kQjIzYSh1MzIgVmFsdWUpCi17Ci0JdTggaTsKLQl1OCBqOwotCXUzMiBkQjsKLQotCVZhbHVlID0gVmFsdWUgJiAweEZGRkY7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmIChWYWx1ZSA8PSBkQl9JbnZlcnRfVGFibGVbaV1bMTFdKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKGkgPj0gOCkKLQkJcmV0dXJuIDk2OwkvKiAgbWF4aW11bSA5NiBkQiAqLwotCi0JZm9yIChqID0gMDsgaiA8IDEyOyBqKyspIHsKLQkJaWYgKFZhbHVlIDw9IGRCX0ludmVydF9UYWJsZVtpXVtqXSkKLQkJCWJyZWFrOwotCX0KLQotCWRCID0gaSoxMiArIGogKyAxOwotCi0JcmV0dXJuIGRCOwotfQotCi0vKiAgKi8KLS8qICBEZXNjcmlwdGlvbjogKi8KLS8qIFNldCBTaW5nbGUvRHVhbCBBbnRlbm5hIGRlZmF1bHQgc2V0dGluZyBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QKLSAqIGRvIGRldGVjdGlvbiBpbiBhZHZhbmNlLiAqLwotLyogICovCi0vKiAgQWRkZWQgYnkgSm9zZXBoLCAyMDEyLjAzLjIyICovCi0vKiAgKi8KLXZvaWQgT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGVmYXVsdFNldHRpbmcoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXN0cnVjdCBzd19hbnRfc3cgKnBETV9TV0FUX1RhYmxlID0gJnBETV9PZG0tPkRNX1NXQVRfVGFibGU7Ci0KLQlwRE1fU1dBVF9UYWJsZS0+QU5UQV9PTiA9IHRydWU7Ci0JcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSB0cnVlOwotfQotCi0vKiAyIDg3MjNBIEFOVCBERVRFQ1QgKi8KLQotc3RhdGljIHZvaWQgb2RtX1BIWV9TYXZlQUZFUmVnaXN0ZXJzKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyICpBRkVSZWcsCi0JCQkJICAgICB1MzIgKkFGRUJhY2t1cCwgdTMyIFJlZ2lzdGVyTnVtKQotewotCXUzMiBpOwotCi0JZm9yIChpID0gMCA7IGkgPCBSZWdpc3Rlck51bSA7IGkrKykKLQkJQUZFQmFja3VwW2ldID0gcnRsODcyM2F1X3JlYWQzMihwRE1fT2RtLT5BZGFwdGVyLCBBRkVSZWdbaV0pOwotfQotCi1zdGF0aWMgdm9pZCBvZG1fUEhZX1JlbG9hZEFGRVJlZ2lzdGVycyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiAqQUZFUmVnLAotCQkJCSAgICAgICB1MzIgKkFGRUJhY2t1cCwgdTMyIFJlZ2llc3Rlck51bSkKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDAgOyBpIDwgUmVnaWVzdGVyTnVtOyBpKyspCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBETV9PZG0tPkFkYXB0ZXIsIEFGRVJlZ1tpXSwgQUZFQmFja3VwW2ldKTsKLX0KLQotLyogMiA4NzIzQSBBTlQgREVURUNUICovCi0vKiAgRGVzY3JpcHRpb246ICovCi0vKiBJbXBsZW1lbnQgSVFLIHNpbmdsZSB0b25lIGZvciBSRiBEUEsgbG9vcGJhY2sgYW5kIEJCIFBTRCBzY2FubmluZy4gKi8KLS8qIFRoaXMgZnVuY3Rpb24gaXMgY29vcGVyYXRlZCB3aXRoIEJCIHRlYW0gTmVpbC4gKi8KLWJvb2wgT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGV0ZWN0aW9uKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTggbW9kZSkKLXsKLQlzdHJ1Y3Qgc3dfYW50X3N3ICpwRE1fU1dBVF9UYWJsZSA9ICZwRE1fT2RtLT5ETV9TV0FUX1RhYmxlOwotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0JdTMyIEN1cnJlbnRDaGFubmVsLCBSZkxvb3BSZWc7Ci0JdTggbjsKLQl1MzIgUmVnODhjLCBSZWdjMDgsIFJlZzg3NCwgUmVnYzUwLCB2YWwzMjsKLQl1OCBpbml0aWFsX2dhaW4gPSAweDVhOwotCXUzMiBQU0RfcmVwb3J0X3RtcDsKLQl1MzIgQW50QV9yZXBvcnQgPSAweDAsIEFudEJfcmVwb3J0ID0gMHgwLCBBbnRPX3JlcG9ydCA9IDB4MDsKLQlib29sIGJSZXN1bHQgPSB0cnVlOwotCXUzMiBBRkVfQmFja3VwWzE2XTsKLQl1MzIgQUZFX1JFR184NzIzQVsxNl0gPSB7Ci0JCXJSeF9XYWl0X0NDQSwgclR4X0NDS19SRk9OLAotCQlyVHhfQ0NLX0JCT04sIHJUeF9PRkRNX1JGT04sCi0JCXJUeF9PRkRNX0JCT04sIHJUeF9Ub19SeCwKLQkJclR4X1RvX1R4LCByUnhfQ0NLLAotCQlyUnhfT0ZETSwgclJ4X1dhaXRfUklGUywKLQkJclJ4X1RPX1J4LCByU3RhbmRieSwKLQkJclNsZWVwLCByUE1QRF9BTkFFTiwKLQkJckZQR0EwX1hDRF9Td2l0Y2hDb250cm9sLCByQmx1ZV9Ub290aH07Ci0KLQlpZiAoIShwRE1fT2RtLT5TdXBwb3J0SUNUeXBlICYgT0RNX1JUTDg3MjNBKSkKLQkJcmV0dXJuIGJSZXN1bHQ7Ci0KLQlpZiAoIShwRE1fT2RtLT5TdXBwb3J0QWJpbGl0eSZPRE1fQkJfQU5UX0RJVikpCi0JCXJldHVybiBiUmVzdWx0OwotCS8qIDEgQmFja3VwIEN1cnJlbnQgUkYvQkIgU2V0dGluZ3MgKi8KLQotCUN1cnJlbnRDaGFubmVsID0gT0RNX0dldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgT0RNX0NIQU5ORUwsCi0JCQkJICAgICAgYlJGUmVnT2Zmc2V0TWFzayk7Ci0JUmZMb29wUmVnID0gT0RNX0dldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgMHgwMCwgYlJGUmVnT2Zmc2V0TWFzayk7Ci0JLyogIGNoYW5nZSB0byBBbnRlbm5hIEEgKi8KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UpOwotCXZhbDMyICY9IH4weDMwMDsKLQl2YWwzMiB8PSAweDEwMDsJCS8qIEVuYWJsZSBhbnRlbm5hIEEgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSwgdmFsMzIpOwotCi0JLyogIFN0ZXAgMTogVVNFIElRSyB0byB0cmFuc21pdHRlciBzaW5nbGUgdG9uZSAqLwotCi0JdWRlbGF5KDEwKTsKLQotCS8qIFN0b3JlIEEgUGF0aCBSZWdpc3RlciA4OGMsIGMwOCwgODc0LCBjNTAgKi8KLQlSZWc4OGMgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0KTsKLQlSZWdjMDggPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJPRkRNMF9UUk11eFBhcik7Ci0JUmVnODc0ID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1cpOwotCVJlZ2M1MCA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgck9GRE0wX1hBQUdDQ29yZTEpOwotCi0JLyogIFN0b3JlIEFGRSBSZWdpc3RlcnMgKi8KLQlvZG1fUEhZX1NhdmVBRkVSZWdpc3RlcnMocERNX09kbSwgQUZFX1JFR184NzIzQSwgQUZFX0JhY2t1cCwgMTYpOwotCi0JLyogU2V0IFBTRCAxMjggcHRzICovCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9QU0RGdW5jdGlvbik7Ci0JdmFsMzIgJj0gfihCSVQoMTQpIHwgQklUKDE1KSk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1BTREZ1bmN0aW9uLCB2YWwzMik7Ci0KLQkvKiAgVG8gU0VUIENIMSB0byBkbyAqLwotCU9ETV9TZXRSRlJlZyhwRE1fT2RtLCBSRl9QQVRIX0EsIE9ETV9DSEFOTkVMLCBiUkZSZWdPZmZzZXRNYXNrLCAweDAxKTsKLQotCS8qICBBRkUgYWxsIG9uIHN0ZXAgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByUnhfV2FpdF9DQ0EsIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9DQ0tfUkZPTiwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X0NDS19CQk9OLCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfT0ZETV9SRk9OLCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfT0ZETV9CQk9OLCAweDZGREIyNUE0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfVG9fUngsIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9Ub19UeCwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0NDSywgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X09GRE0sIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9XYWl0X1JJRlMsIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9UT19SeCwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclN0YW5kYnksIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJTbGVlcCwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclBNUERfQU5BRU4sIDB4NkZEQjI1QTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbCwgMHg2RkRCMjVBNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckJsdWVfVG9vdGgsIDB4NkZEQjI1QTQpOwotCi0JLyogIDMgd2lyZSBEaXNhYmxlICovCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQsIDB4Q0NGMDAwQzApOwotCi0JLyogQkIgSVFLIFNldHRpbmcgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByT0ZETTBfVFJNdXhQYXIsIDB4MDAwODAwRTQpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVywgMHgyMjIwODAwMCk7Ci0KLQkvKiBJUUsgc2V0dGluZyB0b25lQCA0LjM0TWh6ICovCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X0lRS19Ub25lX0EsIDB4MTAwMDhDMUMpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9JUUssIDB4MDEwMDdjMDApOwotCi0JLyogUGFnZSBCIGluaXQgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByQ29uZmlnX0FudEEsIDB4MDAwODAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJDb25maWdfQW50QSwgMHgwZjYwMDAwMCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0lRSywgMHgwMTAwNDgwMCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0lRS19Ub25lX0EsIDB4MTAwMDhjMWYpOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9JUUtfUElfQSwgMHg4MjE1MDAwOCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0lRS19QSV9BLCAweDI4MTUwMDA4KTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBySVFLX0FHQ19Sc3AsIDB4MDAxMDI4ZDApOwotCi0JLyogUkYgbG9vcCBTZXR0aW5nICovCi0JT0RNX1NldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgMHgwLCAweEZGRkZGLCAweDUwMDA4KTsKLQotCS8qIElRSyBTaW5nbGUgdG9uZSBzdGFydCAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4ODA4MDAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJJUUtfQUdDX1B0cywgMHhmODAwMDAwMCk7Ci0JdWRlbGF5KDEwMDApOwotCVBTRF9yZXBvcnRfdG1wID0gMHgwOwotCi0JZm9yIChuID0gMDsgbiA8IDI7IG4rKykgewotCQlQU0RfcmVwb3J0X3RtcCA9ICBHZXRQU0REYXRhKHBETV9PZG0sIDE0LCBpbml0aWFsX2dhaW4pOwotCQlpZiAoUFNEX3JlcG9ydF90bXAgPiBBbnRBX3JlcG9ydCkKLQkJCUFudEFfcmVwb3J0ID0gUFNEX3JlcG9ydF90bXA7Ci0JfQotCi0JUFNEX3JlcG9ydF90bXAgPSAweDA7Ci0KLQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UpOwotCXZhbDMyICY9IH4weDMwMDsKLQl2YWwzMiB8PSAweDIwMDsJCS8qIEVuYWJsZSBhbnRlbm5hIEIgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSwgdmFsMzIpOwotCXVkZWxheSgxMCk7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgMjsgbisrKSB7Ci0JCVBTRF9yZXBvcnRfdG1wID0gIEdldFBTRERhdGEocERNX09kbSwgMTQsIGluaXRpYWxfZ2Fpbik7Ci0JCWlmIChQU0RfcmVwb3J0X3RtcCA+IEFudEJfcmVwb3J0KQotCQkJQW50Ql9yZXBvcnQgPSBQU0RfcmVwb3J0X3RtcDsKLQl9Ci0KLQkvKiAgY2hhbmdlIHRvIG9wZW4gY2FzZSAqLwotCS8qICBjaGFuZ2UgdG8gQW50IEEgYW5kIEIgYWxsIG9wZW4gY2FzZSAqLwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSk7Ci0JdmFsMzIgJj0gfjB4MzAwOwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCB2YWwzMik7Ci0JdWRlbGF5KDEwKTsKLQotCWZvciAobiA9IDA7IG4gPCAyOyBuKyspIHsKLQkJUFNEX3JlcG9ydF90bXAgPSAgR2V0UFNERGF0YShwRE1fT2RtLCAxNCwgaW5pdGlhbF9nYWluKTsKLQkJaWYgKFBTRF9yZXBvcnRfdG1wID4gQW50T19yZXBvcnQpCi0JCQlBbnRPX3JlcG9ydCA9IFBTRF9yZXBvcnRfdG1wOwotCX0KLQotCS8qIENsb3NlIElRSyBTaW5nbGUgVG9uZSBmdW5jdGlvbiAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4MDAwMDAwMDApOwotCVBTRF9yZXBvcnRfdG1wID0gMHgwOwotCi0JLyogMSBSZXR1cm4gdG8gYW50YW5uYSBBICovCi0JdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FKTsKLQl2YWwzMiAmPSB+MHgzMDA7Ci0JdmFsMzIgfD0gMHgxMDA7CQkvKiBFbmFibGUgYW50ZW5uYSBBICovCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIHZhbDMyKTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgUmVnODhjKTsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByT0ZETTBfVFJNdXhQYXIsIFJlZ2MwOCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXLCBSZWc4NzQpOwotCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByT0ZETTBfWEFBR0NDb3JlMSk7Ci0JdmFsMzIgJj0gfjB4N2Y7Ci0JdmFsMzIgfD0gMHg0MDsKLQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByT0ZETTBfWEFBR0NDb3JlMSwgdmFsMzIpOwotCi0JcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgck9GRE0wX1hBQUdDQ29yZTEsIFJlZ2M1MCk7Ci0JT0RNX1NldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgUkZfQ0hOTEJXLCBiUkZSZWdPZmZzZXRNYXNrLAotCQkgICAgIEN1cnJlbnRDaGFubmVsKTsKLQlPRE1fU2V0UkZSZWcocERNX09kbSwgUkZfUEFUSF9BLCAweDAwLCBiUkZSZWdPZmZzZXRNYXNrLCBSZkxvb3BSZWcpOwotCi0JLyogUmVsb2FkIEFGRSBSZWdpc3RlcnMgKi8KLQlvZG1fUEhZX1JlbG9hZEFGRVJlZ2lzdGVycyhwRE1fT2RtLCBBRkVfUkVHXzg3MjNBLCBBRkVfQmFja3VwLCAxNik7Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELAotCQkgICAgICgicHNkX3JlcG9ydF9BWyVkXT0gJWQgXG4iLCAyNDE2LCBBbnRBX3JlcG9ydCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCJwc2RfcmVwb3J0X0JbJWRdPSAlZCBcbiIsIDI0MTYsIEFudEJfcmVwb3J0KSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoInBzZF9yZXBvcnRfT1slZF09ICVkIFxuIiwgMjQxNiwgQW50T19yZXBvcnQpKTsKLQotCS8qIDIgVGVzdCBBbnQgQiBiYXNlZCBvbiBBbnQgQSBpcyBPTiAqLwotCWlmIChtb2RlID09IEFOVFRFU1RCKSB7Ci0JCWlmIChBbnRBX3JlcG9ydCA+PSAxMDApIHsKLQkJCWlmIChBbnRCX3JlcG9ydCA+IChBbnRBX3JlcG9ydCsxKSkgewotCQkJCXBETV9TV0FUX1RhYmxlLT5BTlRCX09OID0gZmFsc2U7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwgKCJPRE1fU2luZ2xlRHVhbEFudGVubmFEZXRlY3Rpb24oKTogU2luZ2xlIEFudGVubmEgQVxuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IHRydWU7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwgKCJPRE1fU2luZ2xlRHVhbEFudGVubmFEZXRlY3Rpb24oKTogRHVhbCBBbnRlbm5hIGlzIEEgYW5kIEJcbiIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsICgiT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGV0ZWN0aW9uKCk6IE5lZWQgdG8gY2hlY2sgYWdhaW5cbiIpKTsKLQkJCXBETV9TV0FUX1RhYmxlLT5BTlRCX09OID0gZmFsc2U7IC8qICBTZXQgQW50ZW5uYSBCIG9mZiBhcyBkZWZhdWx0ICovCi0JCQliUmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQl9IGVsc2UgaWYgKG1vZGUgPT0gQU5UVEVTVEFMTCkgewotCQkvKiAyIFRlc3QgQW50IEEgYW5kIEIgYmFzZWQgb24gRFBEVCBPcGVuICovCi0JCWlmICgoQW50T19yZXBvcnQgPj0gMTAwKSAmIChBbnRPX3JlcG9ydCA8IDExOCkpIHsKLQkJCWlmIChBbnRBX3JlcG9ydCA+IChBbnRPX3JlcG9ydCsxKSkgewotCQkJCXBETV9TV0FUX1RhYmxlLT5BTlRBX09OID0gZmFsc2U7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsCi0JCQkJCSAgICAgT0RNX0RCR19MT1VELCAoIkFudCBBIGlzIE9GRiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcERNX1NXQVRfVGFibGUtPkFOVEFfT04gPSB0cnVlOwotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLAotCQkJCQkgICAgIE9ETV9EQkdfTE9VRCwgKCJBbnQgQSBpcyBPTiIpKTsKLQkJCX0KLQotCQkJaWYgKEFudEJfcmVwb3J0ID4gKEFudE9fcmVwb3J0KzIpKSB7Ci0JCQkJcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSBmYWxzZTsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwKLQkJCQkJICAgICBPRE1fREJHX0xPVUQsICgiQW50IEIgaXMgT0ZGIikpOwotCQkJfSBlbHNlIHsKLQkJCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IHRydWU7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsCi0JCQkJCSAgICAgT0RNX0RCR19MT1VELCAoIkFudCBCIGlzIE9OIikpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwKLQkJKCJPRE1fU2luZ2xlRHVhbEFudGVubmFEZXRlY3Rpb24oKTogTmVlZCB0byBjaGVjayBhZ2FpblxuIikpOwotCQkvKiAgU2V0IEFudGVubmEgQSBvbiBhcyBkZWZhdWx0ICovCi0JCXBETV9TV0FUX1RhYmxlLT5BTlRBX09OID0gdHJ1ZTsKLQkJLyogIFNldCBBbnRlbm5hIEIgb2ZmIGFzIGRlZmF1bHQgKi8KLQkJcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSBmYWxzZTsKLQkJYlJlc3VsdCA9IGZhbHNlOwotCX0KLQotCXJldHVybiBiUmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX0hXQ29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fSFdDb25maWcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2MmY2MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fSFdDb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogICovCi0vKiAgaW5jbHVkZSBmaWxlcyAqLwotLyogICovCi0KLSNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgotCi1zdGF0aWMgdTggb2RtX1F1ZXJ5UnhQd3JQZXJjZW50YWdlKHM4IEFudFBvd2VyKQotewotCWlmICgoQW50UG93ZXIgPD0gLTEwMCkgfHwgKEFudFBvd2VyID49IDIwKSkKLQkJcmV0dXJuCTA7Ci0JZWxzZSBpZiAoQW50UG93ZXIgPj0gMCkKLQkJcmV0dXJuCTEwMDsKLQllbHNlCi0JCXJldHVybgkxMDAgKyBBbnRQb3dlcjsKLX0KLQotc3RhdGljIHMzMiBvZG1fU2lnbmFsU2NhbGVNYXBwaW5nXzkyQ1NlcmllcyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHMzMiBDdXJyU2lnKQotewotCXMzMiBSZXRTaWcgPSAwOwotCi0JaWYgKEN1cnJTaWcgPj0gNTEgJiYgQ3VyclNpZyA8PSAxMDApCi0JCVJldFNpZyA9IDEwMDsKLQllbHNlIGlmIChDdXJyU2lnID49IDQxICYmIEN1cnJTaWcgPD0gNTApCi0JCVJldFNpZyA9IDgwICsgKChDdXJyU2lnIC0gNDApKjIpOwotCWVsc2UgaWYgKEN1cnJTaWcgPj0gMzEgJiYgQ3VyclNpZyA8PSA0MCkKLQkJUmV0U2lnID0gNjYgKyAoQ3VyclNpZyAtIDMwKTsKLQllbHNlIGlmIChDdXJyU2lnID49IDIxICYmIEN1cnJTaWcgPD0gMzApCi0JCVJldFNpZyA9IDU0ICsgKEN1cnJTaWcgLSAyMCk7Ci0JZWxzZSBpZiAoQ3VyclNpZyA+PSAxMCAmJiBDdXJyU2lnIDw9IDIwKQotCQlSZXRTaWcgPSA0MiArICgoKEN1cnJTaWcgLSAxMCkgKiAyKSAvIDMpOwotCWVsc2UgaWYgKEN1cnJTaWcgPj0gNSAmJiBDdXJyU2lnIDw9IDkpCi0JCVJldFNpZyA9IDIyICsgKCgoQ3VyclNpZyAtIDUpICogMykgLyAyKTsKLQllbHNlIGlmIChDdXJyU2lnID49IDEgJiYgQ3VyclNpZyA8PSA0KQotCQlSZXRTaWcgPSA2ICsgKCgoQ3VyclNpZyAtIDEpICogMykgLyAyKTsKLQllbHNlCi0JCVJldFNpZyA9IEN1cnJTaWc7Ci0KLQlyZXR1cm4gUmV0U2lnOwotfQotCi1zdGF0aWMgczMyIG9kbV9TaWduYWxTY2FsZU1hcHBpbmcoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCBzMzIgQ3VyclNpZykKLXsKLQlyZXR1cm4gb2RtX1NpZ25hbFNjYWxlTWFwcGluZ185MkNTZXJpZXMocERNX09kbSwgQ3VyclNpZyk7Ci19Ci0KLXN0YXRpYyB1OAotb2RtX0VWTWRiVG9QZXJjZW50YWdlKAotCXM4IFZhbHVlCi0gICkKLXsKLQkvKiAgKi8KLQkvKiAgLTMzZEJ+MGRCIHRvIDAlfjk5JSAqLwotCS8qICAqLwotCXM4IHJldF92YWw7Ci0KLQlyZXRfdmFsID0gVmFsdWU7Ci0KLQlpZiAocmV0X3ZhbCA+PSAwKQotCQlyZXRfdmFsID0gMDsKLQlpZiAocmV0X3ZhbCA8PSAtMzMpCi0JCXJldF92YWwgPSAtMzM7Ci0KLQlyZXRfdmFsID0gMCAtIHJldF92YWw7Ci0JcmV0X3ZhbCAqPSAzOwotCi0JaWYgKHJldF92YWwgPT0gOTkpCi0JCXJldF92YWwgPSAxMDA7Ci0KLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIHZvaWQgb2RtX1J4UGh5U3RhdHVzOTJDU2VyaWVzX1BhcnNpbmcoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCQkJCQkgICAgIHN0cnVjdCBwaHlfaW5mbyAqcFBoeUluZm8sCi0JCQkJCSAgICAgdTggKnBQaHlTdGF0dXMsCi0JCQkJCSAgICAgc3RydWN0IG9kbV9wYWNrZXRfaW5mbyAqcFBrdGluZm8pCi17Ci0Jc3RydWN0IHBoeV9zdGF0dXNfcnB0ICpwUGh5U3RhUnB0ID0gKHN0cnVjdCBwaHlfc3RhdHVzX3JwdCAqKXBQaHlTdGF0dXM7Ci0JdTggaSwgTWF4X3NwYXRpYWxfc3RyZWFtOwotCXM4IHJ4X3B3cls0XSwgcnhfcHdyX2FsbCA9IDA7Ci0JdTggRVZNLCBQV0RCX0FMTCA9IDAsIFBXREJfQUxMX0JUOwotCXU4IFJTU0ksIHRvdGFsX3Jzc2kgPSAwOwotCXU4IGlzQ0NLcmF0ZSA9IDA7Ci0JdTggcmZfcnhfbnVtID0gMDsKLQl1OCBjY2tfaGlnaHB3ciA9IDA7Ci0KLQlpc0NDS3JhdGUgPSAocFBrdGluZm8tPlJhdGUgPD0gREVTQzkyQ19SQVRFMTFNKSA/IHRydWUgOiBmYWxzZTsKLQlwUGh5SW5mby0+UnhNSU1PU2lnbmFsUXVhbGl0eVtSRl9QQVRIX0FdID0gLTE7Ci0JcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFF1YWxpdHlbUkZfUEFUSF9CXSA9IC0xOwotCi0JaWYgKGlzQ0NLcmF0ZSkgewotCQl1OCByZXBvcnQ7Ci0JCXU4IGNja19hZ2NfcnB0OwotCi0JCXBETV9PZG0tPlBoeURiZ0luZm8uTnVtUXJ5UGh5U3RhdHVzQ0NLKys7Ci0JCS8qICAoMSlIYXJkd2FyZSBkb2VzIG5vdCBwcm92aWRlIFJTU0kgZm9yIENDSyAqLwotCQkvKiAgKDIpUFdEQiwgQXZlcmFnZSBQV0RCIGNhY2x1YXRlZCBieSBoYXJkd2FyZSAoZm9yIHJhdGUgYWRhcHRpdmUpICovCi0KLQkJY2NrX2hpZ2hwd3IgPSBwRE1fT2RtLT5iQ2NrSGlnaFBvd2VyOwotCi0JCWNja19hZ2NfcnB0ID0gIHBQaHlTdGFScHQtPmNja19hZ2NfcnB0X29mZG1fY2Zvc2hvX2E7Ci0KLQkJLyogVGhlIFJTU0kgZm9ybXVsYSBzaG91bGQgYmUgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBnYWluIHRhYmxlICovCi0JCWlmICghY2NrX2hpZ2hwd3IpIHsKLQkJCXJlcG9ydCA9IChjY2tfYWdjX3JwdCAmIDB4YzApPj42OwotCQkJc3dpdGNoIChyZXBvcnQpIHsKLQkJCS8qICBNb2RpZnkgdGhlIFJGIFJOQSBnYWluIHZhbHVlIHRvIC00MCwgLTIwLCAtMiwgMTQgYnkgSmVueXUncyBzdWdnZXN0aW9uICovCi0JCQkvKiAgTm90ZTogZGlmZmVyZW50IFJGIHdpdGggdGhlIGRpZmZlcmVudCBSTkEgZ2Fpbi4gKi8KLQkJCWNhc2UgMHgzOgotCQkJCXJ4X3B3cl9hbGwgPSAtNDYgLSAoY2NrX2FnY19ycHQgJiAweDNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgyOgotCQkJCXJ4X3B3cl9hbGwgPSAtMjYgLSAoY2NrX2FnY19ycHQgJiAweDNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgxOgotCQkJCXJ4X3B3cl9hbGwgPSAtMTIgLSAoY2NrX2FnY19ycHQgJiAweDNlKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgwOgotCQkJCXJ4X3B3cl9hbGwgPSAxNiAtIChjY2tfYWdjX3JwdCAmIDB4M2UpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmVwb3J0ID0gKGNja19hZ2NfcnB0ICYgMHg2MCk+PjU7Ci0JCQlzd2l0Y2ggKHJlcG9ydCkgewotCQkJY2FzZSAweDM6Ci0JCQkJcnhfcHdyX2FsbCA9IC00NiAtICgoY2NrX2FnY19ycHQgJiAweDFmKTw8MSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4MjoKLQkJCQlyeF9wd3JfYWxsID0gLTI2IC0gKChjY2tfYWdjX3JwdCAmIDB4MWYpPDwxKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgxOgotCQkJCXJ4X3B3cl9hbGwgPSAtMTIgLSAoKGNja19hZ2NfcnB0ICYgMHgxZik8PDEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAweDA6Ci0JCQkJcnhfcHdyX2FsbCA9IDE2IC0gKChjY2tfYWdjX3JwdCAmIDB4MWYpPDwxKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCVBXREJfQUxMID0gb2RtX1F1ZXJ5UnhQd3JQZXJjZW50YWdlKHJ4X3B3cl9hbGwpOwotCi0JCS8qIE1vZGlmaWNhdGlvbiBmb3IgZXh0LUxOQSBib2FyZCAqLwotCQlpZiAocERNX09kbS0+Qm9hcmRUeXBlID09IE9ETV9CT0FSRF9ISUdIUFdSKSB7Ci0JCQlpZiAoKGNja19hZ2NfcnB0Pj43KSA9PSAwKSB7Ci0JCQkJUFdEQl9BTEwgPSAoUFdEQl9BTEwgPiA5NCkgPyAxMDAgOiAoUFdEQl9BTEwrNik7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChQV0RCX0FMTCA+IDM4KQotCQkJCQlQV0RCX0FMTCAtPSAxNjsKLQkJCQllbHNlCi0JCQkJCVBXREJfQUxMID0gKFBXREJfQUxMIDw9IDE2KSA/IChQV0RCX0FMTD4+MikgOiAoUFdEQl9BTEwtMTIpOwotCQkJfQotCi0JCQkvKiBDQ0sgbW9kaWZpY2F0aW9uICovCi0JCQlpZiAoUFdEQl9BTEwgPiAyNSAmJiBQV0RCX0FMTCA8PSA2MCkKLQkJCQlQV0RCX0FMTCArPSA2OwotCQl9IGVsc2UgeyAvKiBNb2RpZmljYXRpb24gZm9yIGludC1MTkEgYm9hcmQgKi8KLQkJCWlmIChQV0RCX0FMTCA+IDk5KQotCQkJCVBXREJfQUxMIC09IDg7Ci0JCQllbHNlIGlmIChQV0RCX0FMTCA+IDUwICYmIFBXREJfQUxMIDw9IDY4KQotCQkJCVBXREJfQUxMICs9IDQ7Ci0JCX0KLQkJcFBoeUluZm8tPlJ4UFdEQkFsbCA9IFBXREJfQUxMOwotCQlwUGh5SW5mby0+QlRSeFJTU0lQZXJjZW50YWdlID0gUFdEQl9BTEw7Ci0JCXBQaHlJbmZvLT5SZWN2U2lnbmFsUG93ZXIgPSByeF9wd3JfYWxsOwotCQkvKiAgKDMpIEdldCBTaWduYWwgUXVhbGl0eSAoRVZNKSAqLwotCQlpZiAocFBrdGluZm8tPmJQYWNrZXRNYXRjaEJTU0lEKSB7Ci0JCQl1OAlTUSwgU1FfcnB0OwotCi0JCQlTUV9ycHQgPSBwUGh5U3RhUnB0LT5jY2tfc2lnX3F1YWxfb2ZkbV9wd2RiX2FsbDsKLQotCQkJaWYgKFNRX3JwdCA+IDY0KQotCQkJCVNRID0gMDsKLQkJCWVsc2UgaWYgKFNRX3JwdCA8IDIwKQotCQkJCVNRID0gMTAwOwotCQkJZWxzZQotCQkJCVNRID0gKCg2NC1TUV9ycHQpICogMTAwKSAvIDQ0OwotCi0JCQlwUGh5SW5mby0+U2lnbmFsUXVhbGl0eSA9IFNROwotCQkJcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFF1YWxpdHlbUkZfUEFUSF9BXSA9IFNROwotCQkJcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFF1YWxpdHlbUkZfUEFUSF9CXSA9IC0xOwotCQl9Ci0JfSBlbHNlIHsgLyogaXMgT0ZETSByYXRlICovCi0JCXBETV9PZG0tPlBoeURiZ0luZm8uTnVtUXJ5UGh5U3RhdHVzT0ZETSsrOwotCi0JCS8qICAoMSlHZXQgUlNTSSBmb3IgSFQgcmF0ZSAqLwotCi0JCWZvciAoaSA9IFJGX1BBVEhfQTsgaSA8IFJGX1BBVEhfTUFYOyBpKyspIHsKLQkJCS8qICAyMDA4LzAxLzMwIE1IIHdlIHdpbGwganVkZ2UgUkYgUlggcGF0aCBub3cuICovCi0JCQlpZiAocERNX09kbS0+UkZQYXRoUnhFbmFibGUgJiBCSVQoaSkpCi0JCQkJcmZfcnhfbnVtKys7Ci0KLQkJCXJ4X3B3cltpXSA9ICgocFBoeVN0YVJwdC0+cGF0aF9hZ2NbaV0uZ2FpbiAmIDB4M0YpKjIpIC0gMTEwOwotCi0JCQlwUGh5SW5mby0+UnhQd3JbaV0gPSByeF9wd3JbaV07Ci0KLQkJCS8qIFRyYW5zbGF0ZSBEQk0gdG8gcGVyY2VudGFnZS4gKi8KLQkJCVJTU0kgPSBvZG1fUXVlcnlSeFB3clBlcmNlbnRhZ2UocnhfcHdyW2ldKTsKLQkJCXRvdGFsX3Jzc2kgKz0gUlNTSTsKLQotCQkJLyogTW9kaWZpY2F0aW9uIGZvciBleHQtTE5BIGJvYXJkICovCi0JCQlpZiAocERNX09kbS0+Qm9hcmRUeXBlID09IE9ETV9CT0FSRF9ISUdIUFdSKSB7Ci0JCQkJaWYgKChwUGh5U3RhUnB0LT5wYXRoX2FnY1tpXS50cnN3KSA9PSAxKQotCQkJCQlSU1NJID0gKFJTU0kgPiA5NCkgPyAxMDAgOiAoUlNTSSs2KTsKLQkJCQllbHNlCi0JCQkJCVJTU0kgPSAoUlNTSSA8PSAxNikgPyAoUlNTST4+MykgOiAoUlNTSS0xNik7Ci0KLQkJCQlpZiAoKFJTU0kgPD0gMzQpICYmIChSU1NJID49IDQpKQotCQkJCQlSU1NJIC09IDQ7Ci0JCQl9Ci0KLQkJCXBQaHlJbmZvLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtpXSA9ICh1OCkgUlNTSTsKLQotCQkJLyogR2V0IFJ4IHNuciB2YWx1ZSBpbiBEQiAqLwotCQkJcFBoeUluZm8tPlJ4U05SW2ldID0gcERNX09kbS0+UGh5RGJnSW5mby5SeFNOUmRCW2ldID0gKHMzMikocFBoeVN0YVJwdC0+cGF0aF9yeHNucltpXS8yKTsKLQkJfQotCi0JCS8qICAoMilQV0RCLCBBdmVyYWdlIFBXREIgY2FjbHVhdGVkIGJ5IGhhcmR3YXJlIChmb3IgcmF0ZSBhZGFwdGl2ZSkgKi8KLQkJcnhfcHdyX2FsbCA9ICgoKHBQaHlTdGFScHQtPmNja19zaWdfcXVhbF9vZmRtX3B3ZGJfYWxsKSA+PiAxKSAmIDB4N2YpLTExMDsKLQotCQlQV0RCX0FMTCA9IG9kbV9RdWVyeVJ4UHdyUGVyY2VudGFnZShyeF9wd3JfYWxsKTsKLQkJUFdEQl9BTExfQlQgPSBQV0RCX0FMTDsKLQotCQlwUGh5SW5mby0+UnhQV0RCQWxsID0gUFdEQl9BTEw7Ci0JCXBQaHlJbmZvLT5CVFJ4UlNTSVBlcmNlbnRhZ2UgPSBQV0RCX0FMTF9CVDsKLQkJcFBoeUluZm8tPlJ4UG93ZXIgPSByeF9wd3JfYWxsOwotCQlwUGh5SW5mby0+UmVjdlNpZ25hbFBvd2VyID0gcnhfcHdyX2FsbDsKLQotCQkvKiAgKDMpRVZNIG9mIEhUIHJhdGUgKi8KLQkJaWYgKHBQa3RpbmZvLT5SYXRlID49IERFU0M5MkNfUkFURU1DUzggJiYgcFBrdGluZm8tPlJhdGUgPD0gREVTQzkyQ19SQVRFTUNTMTUpCi0JCQlNYXhfc3BhdGlhbF9zdHJlYW0gPSAyOyAvKiBib3RoIHNwYXRpYWwgc3RyZWFtIG1ha2Ugc2Vuc2UgKi8KLQkJZWxzZQotCQkJTWF4X3NwYXRpYWxfc3RyZWFtID0gMTsgLyogb25seSBzcGF0aWFsIHN0cmVhbSAxIG1ha2VzIHNlbnNlICovCi0KLQkJZm9yIChpID0gMDsgaSA8IE1heF9zcGF0aWFsX3N0cmVhbTsgaSsrKSB7Ci0JCQkvKiAgRG8gbm90IHVzZSBzaGlmdCBvcGVyYXRpb24gbGlrZSAicnhfZXZtWCA+Pj0gMSIgYmVjYXVzZSB0aGUgY29tcGlsb3Igb2YgZnJlZSBidWlsZCBlbnZpcm9ubWVudCAqLwotCQkJLyogIGZpbGwgbW9zdCBzaWduaWZpY2FudCBiaXQgdG8gInplcm8iIHdoZW4gZG9pbmcgc2hpZnRpbmcgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2UgYSBuZWdhdGl2ZSAqLwotCQkJLyogIHZhbHVlIHRvIHBvc2l0aXZlIG9uZSwgdGhlbiB0aGUgZGJtIHZhbHVlICh3aGljaCBpcyBzdXBwb3NlZCB0byBiZSBuZWdhdGl2ZSkgIGlzIG5vdCBjb3JyZWN0IGFueW1vcmUuICovCi0JCQlFVk0gPSBvZG1fRVZNZGJUb1BlcmNlbnRhZ2UoKHBQaHlTdGFScHQtPnN0cmVhbV9yeGV2bVtpXSkpOwkvKiBkYm0gKi8KLQotCQkJaWYgKHBQa3RpbmZvLT5iUGFja2V0TWF0Y2hCU1NJRCkgewotCQkJCWlmIChpID09IFJGX1BBVEhfQSkgewotCQkJCQkvKiAgRmlsbCB2YWx1ZSBpbiBSRkQsIEdldCB0aGUgZmlyc3Qgc3BhdGlhbCBzdHJlYW0gb25seSAqLwotCQkJCQlwUGh5SW5mby0+U2lnbmFsUXVhbGl0eSA9ICh1OCkoRVZNICYgMHhmZik7Ci0JCQkJfQotCQkJCXBQaHlJbmZvLT5SeE1JTU9TaWduYWxRdWFsaXR5W2ldID0gKHU4KShFVk0gJiAweGZmKTsKLQkJCX0KLQkJfQotCX0KLQkvKiBVSSBCU1MgTGlzdCBzaWduYWwgc3RyZW5ndGgoaW4gcGVyY2VudGFnZSksIG1ha2UgaXQgZ29vZCBsb29raW5nLCBmcm9tIDB+MTAwLiAqLwotCS8qIEl0IGlzIGFzc2lnbmVkIHRvIHRoZSBCU1MgTGlzdCBpbiBHZXRWYWx1ZUZyb21CZWFjb25PclByb2JlUnNwKCkuICovCi0JaWYgKGlzQ0NLcmF0ZSkgewotCQlwUGh5SW5mby0+U2lnbmFsU3RyZW5ndGggPSAodTgpKG9kbV9TaWduYWxTY2FsZU1hcHBpbmcocERNX09kbSwgUFdEQl9BTEwpKTsvKiBQV0RCX0FMTDsgKi8KLQl9IGVsc2UgewotCQlpZiAocmZfcnhfbnVtICE9IDApCi0JCQlwUGh5SW5mby0+U2lnbmFsU3RyZW5ndGggPSAodTgpKG9kbV9TaWduYWxTY2FsZU1hcHBpbmcocERNX09kbSwgdG90YWxfcnNzaSAvPSByZl9yeF9udW0pKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIG9kbV9Qcm9jZXNzX1JTU0lGb3JETShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JCQkJICBzdHJ1Y3QgcGh5X2luZm8gKnBQaHlJbmZvLAotCQkJCSAgc3RydWN0IG9kbV9wYWNrZXRfaW5mbyAqcFBrdGluZm8pCi17Ci0JczMyIFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCLCBVbmRlY29yYXRlZFNtb290aGVkQ0NLOwotCXMzMiBVbmRlY29yYXRlZFNtb290aGVkT0ZETSwgUlNTSV9BdmU7Ci0JdTggaXNDQ0tyYXRlID0gMDsKLQl1OCBSU1NJX21heCwgUlNTSV9taW4sIGk7Ci0JdTMyIE9GRE1fcGt0ID0gMDsKLQl1MzIgV2VpZ2h0aW5nID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBFbnRyeTsKLQotCWlmIChwUGt0aW5mby0+U3RhdGlvbklEID09IDB4RkYpCi0JCXJldHVybjsKLQotCXBFbnRyeSA9IHBETV9PZG0tPnBPRE1fU3RhSW5mb1twUGt0aW5mby0+U3RhdGlvbklEXTsKLQlpZiAoIXBFbnRyeSkKLQkJcmV0dXJuOwotCWlmICgoIXBQa3RpbmZvLT5iUGFja2V0TWF0Y2hCU1NJRCkpCi0JCXJldHVybjsKLQotCWlzQ0NLcmF0ZSA9IChwUGt0aW5mby0+UmF0ZSA8PSBERVNDOTJDX1JBVEUxMU0pID8gdHJ1ZSA6IGZhbHNlOwotCi0JLyogU21hcnQgQW50ZW5uYSBEZWJ1ZyBNZXNzYWdlLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCVVuZGVjb3JhdGVkU21vb3RoZWRDQ0sgPSAgcEVudHJ5LT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZENDSzsKLQlVbmRlY29yYXRlZFNtb290aGVkT0ZETSA9IHBFbnRyeS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRPRkRNOwotCVVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gcEVudHJ5LT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0KLQlpZiAocFBrdGluZm8tPmJQYWNrZXRUb1NlbGYgfHwgcFBrdGluZm8tPmJQYWNrZXRCZWFjb24pIHsKLQkJaWYgKCFpc0NDS3JhdGUpIHsgLyogb2ZkbSByYXRlICovCi0JCQlpZiAocFBoeUluZm8tPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfQl0gPT0gMCkgewotCQkJCVJTU0lfQXZlID0gcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfQV07Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwUGh5SW5mby0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbUkZfUEFUSF9BXSA+IHBQaHlJbmZvLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtSRl9QQVRIX0JdKSB7Ci0JCQkJCVJTU0lfbWF4ID0gcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfQV07Ci0JCQkJCVJTU0lfbWluID0gcFBoeUluZm8tPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW1JGX1BBVEhfQl07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUlNTSV9tYXggPSBwUGh5SW5mby0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbUkZfUEFUSF9CXTsKLQkJCQkJUlNTSV9taW4gPSBwUGh5SW5mby0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbUkZfUEFUSF9BXTsKLQkJCQl9Ci0JCQkJaWYgKChSU1NJX21heCAtIFJTU0lfbWluKSA8IDMpCi0JCQkJCVJTU0lfQXZlID0gUlNTSV9tYXg7Ci0JCQkJZWxzZSBpZiAoKFJTU0lfbWF4IC0gUlNTSV9taW4pIDwgNikKLQkJCQkJUlNTSV9BdmUgPSBSU1NJX21heCAtIDE7Ci0JCQkJZWxzZSBpZiAoKFJTU0lfbWF4IC0gUlNTSV9taW4pIDwgMTApCi0JCQkJCVJTU0lfQXZlID0gUlNTSV9tYXggLSAyOwotCQkJCWVsc2UKLQkJCQkJUlNTSV9BdmUgPSBSU1NJX21heCAtIDM7Ci0JCQl9Ci0KLQkJCS8qIDEgUHJvY2VzcyBPRkRNIFJTU0kgKi8KLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkT0ZETSA8PSAwKSB7Ci0JCQkJLyogIGluaXRpYWxpemUgKi8KLQkJCQlVbmRlY29yYXRlZFNtb290aGVkT0ZETSA9IHBQaHlJbmZvLT5SeFBXREJBbGw7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwUGh5SW5mby0+UnhQV0RCQWxsID4gKHUzMilVbmRlY29yYXRlZFNtb290aGVkT0ZETSkgewotCQkJCQlVbmRlY29yYXRlZFNtb290aGVkT0ZETSA9Ci0JCQkJCQkJKCgoVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0pKihSeF9TbW9vdGhfRmFjdG9yLTEpKSArCi0JCQkJCQkJKFJTU0lfQXZlKSkgLyAoUnhfU21vb3RoX0ZhY3Rvcik7Ci0JCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRPRkRNID0gVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0gKyAxOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRPRkRNID0KLQkJCQkJCQkoKChVbmRlY29yYXRlZFNtb290aGVkT0ZETSkqKFJ4X1Ntb290aF9GYWN0b3ItMSkpICsKLQkJCQkJCQkoUlNTSV9BdmUpKSAvIChSeF9TbW9vdGhfRmFjdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwRW50cnktPnJzc2lfc3RhdC5QYWNrZXRNYXAgPQotCQkJCShwRW50cnktPnJzc2lfc3RhdC5QYWNrZXRNYXA8PDEpIHwgQklUKDApOwotCQl9IGVsc2UgewotCQkJUlNTSV9BdmUgPSBwUGh5SW5mby0+UnhQV0RCQWxsOwotCi0JCQkvKiAxIFByb2Nlc3MgQ0NLIFJTU0kgKi8KLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkQ0NLIDw9IDApIHsKLQkJCQkvKiAgaW5pdGlhbGl6ZSAqLwotCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRDQ0sgPSBwUGh5SW5mby0+UnhQV0RCQWxsOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocFBoeUluZm8tPlJ4UFdEQkFsbCA+ICh1MzIpVW5kZWNvcmF0ZWRTbW9vdGhlZENDSykgewotCQkJCQlVbmRlY29yYXRlZFNtb290aGVkQ0NLID0KLQkJCQkJCQkoKChVbmRlY29yYXRlZFNtb290aGVkQ0NLKSooUnhfU21vb3RoX0ZhY3Rvci0xKSkgKwotCQkJCQkJCShwUGh5SW5mby0+UnhQV0RCQWxsKSkgLyAoUnhfU21vb3RoX0ZhY3Rvcik7Ci0JCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRDQ0sgPSBVbmRlY29yYXRlZFNtb290aGVkQ0NLICsgMTsKLQkJCQl9IGVsc2UgewotCQkJCQlVbmRlY29yYXRlZFNtb290aGVkQ0NLID0KLQkJCQkJCQkoKChVbmRlY29yYXRlZFNtb290aGVkQ0NLKSooUnhfU21vb3RoX0ZhY3Rvci0xKSkgKwotCQkJCQkJCShwUGh5SW5mby0+UnhQV0RCQWxsKSkgLyAoUnhfU21vb3RoX0ZhY3Rvcik7Ci0JCQkJfQotCQkJfQotCQkJcEVudHJ5LT5yc3NpX3N0YXQuUGFja2V0TWFwID0gcEVudHJ5LT5yc3NpX3N0YXQuUGFja2V0TWFwPDwxOwotCQl9Ci0KLQkJLyogMjAxMS4wNy4yOCBMdWtlTGVlOiBtb2RpZmllZCB0byBwcmV2ZW50IHVuc3RhYmxlIENDSyBSU1NJICovCi0JCWlmIChwRW50cnktPnJzc2lfc3RhdC5WYWxpZEJpdCA+PSA2NCkKLQkJCXBFbnRyeS0+cnNzaV9zdGF0LlZhbGlkQml0ID0gNjQ7Ci0JCWVsc2UKLQkJCXBFbnRyeS0+cnNzaV9zdGF0LlZhbGlkQml0Kys7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHBFbnRyeS0+cnNzaV9zdGF0LlZhbGlkQml0OyBpKyspCi0JCQlPRkRNX3BrdCArPQotCQkJCSh1OCkocEVudHJ5LT5yc3NpX3N0YXQuUGFja2V0TWFwPj5pKSAmIEJJVCgwKTsKLQotCQlpZiAocEVudHJ5LT5yc3NpX3N0YXQuVmFsaWRCaXQgPT0gNjQpIHsKLQkJCVdlaWdodGluZyA9ICgoT0ZETV9wa3Q8PDQpID4gNjQpPzY0OihPRkRNX3BrdDw8NCk7Ci0JCQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IChXZWlnaHRpbmcqVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0rKDY0LVdlaWdodGluZykqVW5kZWNvcmF0ZWRTbW9vdGhlZENDSyk+PjY7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocEVudHJ5LT5yc3NpX3N0YXQuVmFsaWRCaXQgIT0gMCkKLQkJCQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IChPRkRNX3BrdCpVbmRlY29yYXRlZFNtb290aGVkT0ZETSsocEVudHJ5LT5yc3NpX3N0YXQuVmFsaWRCaXQtT0ZETV9wa3QpKlVuZGVjb3JhdGVkU21vb3RoZWRDQ0spL3BFbnRyeS0+cnNzaV9zdGF0LlZhbGlkQml0OwotCQkJZWxzZQotCQkJCVVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMDsKLQkJfQotCQlwRW50cnktPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkQ0NLID0gVW5kZWNvcmF0ZWRTbW9vdGhlZENDSzsKLQkJcEVudHJ5LT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE0gPSBVbmRlY29yYXRlZFNtb290aGVkT0ZETTsKLQkJcEVudHJ5LT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSBVbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQl9Ci19Ci0KLXZvaWQgT0RNX1BoeVN0YXR1c1F1ZXJ5MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgc3RydWN0IHBoeV9pbmZvICpwUGh5SW5mbywKLQkJCSAgIHU4ICpwUGh5U3RhdHVzLCBzdHJ1Y3Qgb2RtX3BhY2tldF9pbmZvICpwUGt0aW5mbykKLXsKLQlvZG1fUnhQaHlTdGF0dXM5MkNTZXJpZXNfUGFyc2luZyhwRE1fT2RtLCBwUGh5SW5mbywKLQkJCQkJIHBQaHlTdGF0dXMsIHBQa3RpbmZvKTsKLQotCW9kbV9Qcm9jZXNzX1JTU0lGb3JETShwRE1fT2RtLCBwUGh5SW5mbywgcFBrdGluZm8pOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX1JlZ0NvbmZpZzg3MjNBLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fUmVnQ29uZmlnODcyM0EuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzYzZjYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fUmVnQ29uZmlnODcyM0EuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLSNpbmNsdWRlICJ1c2Jfb3BzX2xpbnV4LmgiCi0KLXZvaWQKLW9kbV9Db25maWdSRlJlZ184NzIzQSgKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JdTMyCQkJCQlBZGRyLAotCXUzMgkJCQkJRGF0YSwKLQllbnVtIFJGX1JBRElPX1BBVEggICAgIFJGX1BBVEgsCi0JdTMyCQkJCSAgICBSZWdBZGRyCi0JKQotewotCWlmIChBZGRyID09IDB4ZmUpIHsKLQkJbXNsZWVwKDUwKTsKLQl9IGVsc2UgaWYgKEFkZHIgPT0gMHhmZCkgewotCQltZGVsYXkoNSk7Ci0JfSBlbHNlIGlmIChBZGRyID09IDB4ZmMpIHsKLQkJbWRlbGF5KDEpOwotCX0gZWxzZSBpZiAoQWRkciA9PSAweGZiKSB7Ci0JCXVkZWxheSg1MCk7Ci0JfSBlbHNlIGlmIChBZGRyID09IDB4ZmEpIHsKLQkJdWRlbGF5KDUpOwotCX0gZWxzZSBpZiAoQWRkciA9PSAweGY5KSB7Ci0JCXVkZWxheSgxKTsKLQl9IGVsc2UgewotCQlPRE1fU2V0UkZSZWcocERNX09kbSwgUkZfUEFUSCwgUmVnQWRkciwgYlJGUmVnT2Zmc2V0TWFzaywgRGF0YSk7Ci0JCS8qICBBZGQgMXVzIGRlbGF5IGJldHdlZW4gQkIvUkYgcmVnaXN0ZXIgc2V0dGluZy4gKi8KLQkJdWRlbGF5KDEpOwotCX0KLX0KLQotdm9pZCBvZG1fQ29uZmlnTUFDXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIGFkZHIsIHU4CWRhdGEpCi17Ci0JcnRsODcyM2F1X3dyaXRlOChwRE1fT2RtLT5BZGFwdGVyLCBhZGRyLCBkYXRhKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfSU5JVCwgT0RNX0RCR19MT1VELAotCQkgICAgICgiPT09PiAlczogW01BQ19SRUddICUwOFggJTA4WFxuIiwgX19mdW5jX18sIGFkZHIsIGRhdGEpKTsKLX0KLQotdm9pZCBvZG1fQ29uZmlnQkJfQUdDXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIGFkZHIsIHUzMiBkYXRhKQotewotCXJ0bDg3MjNhdV93cml0ZTMyKHBETV9PZG0tPkFkYXB0ZXIsIGFkZHIsIGRhdGEpOwotCS8qICBBZGQgMXVzIGRlbGF5IGJldHdlZW4gQkIvUkYgcmVnaXN0ZXIgc2V0dGluZy4gKi8KLQl1ZGVsYXkoMSk7Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfSU5JVCwgT0RNX0RCR19MT1VELAotCQkgICAgICgiPT09PiAlczogW0FHQ19UQUJdICUwOFggJTA4WFxuIiwgX19mdW5jX18sIGFkZHIsIGRhdGEpKTsKLX0KLQotdm9pZAotb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBhZGRyLCB1MzIgZGF0YSkKLXsKLQlpZiAoYWRkciA9PSAweGZlKQotCQltc2xlZXAoNTApOwotCWVsc2UgaWYgKGFkZHIgPT0gMHhmZCkKLQkJbWRlbGF5KDUpOwotCWVsc2UgaWYgKGFkZHIgPT0gMHhmYykKLQkJbWRlbGF5KDEpOwotCWVsc2UgaWYgKGFkZHIgPT0gMHhmYikKLQkJdWRlbGF5KDUwKTsKLQllbHNlIGlmIChhZGRyID09IDB4ZmEpCi0JCXVkZWxheSg1KTsKLQllbHNlIGlmIChhZGRyID09IDB4ZjkpCi0JCXVkZWxheSgxKTsKLQllbHNlIGlmIChhZGRyID09IDB4YTI0KQotCQlwRE1fT2RtLT5SRkNhbGlicmF0ZUluZm8uUmVnQTI0ID0gZGF0YTsKLQlydGw4NzIzYXVfd3JpdGUzMihwRE1fT2RtLT5BZGFwdGVyLCBhZGRyLCBkYXRhKTsKLQotCS8qICBBZGQgMXVzIGRlbGF5IGJldHdlZW4gQkIvUkYgcmVnaXN0ZXIgc2V0dGluZy4gKi8KLQl1ZGVsYXkoMSk7Ci0KLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfSU5JVCwgT0RNX0RCR19MT1VELAotCQkgICAgICgiPT09PiAlczogW1BIWV9SRUddICUwOFggJTA4WFxuIiwgX19mdW5jX18sIGFkZHIsIGRhdGEpKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9kZWJ1Zy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2RlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMmJkZGEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2RlYnVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0KLXZvaWQgT0RNX0luaXREZWJ1Z1NldHRpbmcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotCXBETV9PZG0tPkRlYnVnTGV2ZWwgPSBPRE1fREJHX1RSQUNFOwotCXBETV9PZG0tPkRlYnVnQ29tcG9uZW50cyA9IDA7Ci19Ci0KLXUzMiBHbG9iYWxEZWJ1Z0xldmVsMjNBOwotCi12b2lkIHJ0X3RyYWNlKGludCBjb21wLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXN0cnVjdCB2YV9mb3JtYXQgdmFmOwotCXZhX2xpc3QgYXJnczsKLQotCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7Ci0KLQl2YWYuZm10ID0gZm10OwotCXZhZi52YSA9ICZhcmdzOwotCi0JcHJfaW5mbyhEUklWRVJfUFJFRklYICIgWzB4JTA4eCwlZF0gJXBWIiwgY29tcCwgbGV2ZWwsICZ2YWYpOwotCi0JdmFfZW5kKGFyZ3MpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2ludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2ludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGY2NzkwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9pbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAgKi8KLS8qICBpbmNsdWRlIGZpbGVzICovCi0vKiAgKi8KLQotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0vKiAgKi8KLS8qICBPRE0gSU8gUmVsYXRpdmUgQVBJLiAqLwotLyogICovCi0jaW5jbHVkZSA8dXNiX29wc19saW51eC5oPgotCi12b2lkIE9ETV9TZXRSRlJlZygKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JZW51bSBSRl9SQURJT19QQVRICWVSRlBhdGgsCi0JdTMyCQkJCVJlZ0FkZHIsCi0JdTMyCQkJCUJpdE1hc2ssCi0JdTMyCQkJCURhdGEKLQkpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQotCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBlUkZQYXRoLCBSZWdBZGRyLCBCaXRNYXNrLCBEYXRhKTsKLX0KLQotdTMyIE9ETV9HZXRSRlJlZygKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JZW51bSBSRl9SQURJT19QQVRICWVSRlBhdGgsCi0JdTMyCQkJCVJlZ0FkZHIsCi0JdTMyCQkJCUJpdE1hc2sKLQkpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQotCXJldHVybiBQSFlfUXVlcnlSRlJlZyhBZGFwdGVyLCBlUkZQYXRoLCBSZWdBZGRyLCBCaXRNYXNrKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2J0LWNvZXhpc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2J0LWNvZXhpc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjYmQ3YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9idC1jb2V4aXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKnB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotI2RlZmluZSBESVNfUFNfUlhfQkNOCi0KLXUzMiBCVENvZXhEYmdMZXZlbCA9IF9idF9kYmdfb2ZmXzsKLQotI2RlZmluZSBSVFBSSU5UKF9Db21wLCBfTGV2ZWwsIEZtdClcCi1kbyB7XAotCWlmICgoQlRDb2V4RGJnTGV2ZWwgPT0gX2J0X2RiZ19vbl8pKSB7XAotCQlwcmludGsgRm10O1wKLQl9CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFJUUFJJTlRfQUREUihkYmd0eXBlLCBkYmdmbGFnLCBwcmludHN0ciwgX1B0cilcCi1pZiAoKEJUQ29leERiZ0xldmVsID09IF9idF9kYmdfb25fKSkge1wKLQl1MzIgX19pOwkJCQkJCVwKLQl1OCAqcHRyID0gKHU4ICopX1B0cjsJXAotCXByaW50ayBwcmludHN0cjsJCQkJXAotCXByaW50aygiICIpOwkJCQkJXAotCWZvciAoX19pID0gMDsgX19pIDwgNjsgX19pKyspCQlcCi0JCXByaW50aygiJTAyWCVzIiwgcHRyW19faV0sIChfX2kgPT0gNSk/IiI6Ii0iKTsJCVwKLQlwcmludGsoIlxuIik7CQkJCQkJCVwKLX0KLSNkZWZpbmUgUlRQUklOVF9EQVRBKGRiZ3R5cGUsIGRiZ2ZsYWcsIF9UaXRsZVN0cmluZywgX0hleERhdGEsIF9IZXhEYXRhTGVuKVwKLWlmICgoQlRDb2V4RGJnTGV2ZWwgPT0gX2J0X2RiZ19vbl8pKSB7XAotCXUzMiBfX2k7CQkJCQkJXAotCXU4ICpwdHIgPSAodTggKilfSGV4RGF0YTsJCQkJXAotCXByaW50ayhfVGl0bGVTdHJpbmcpOwkJCQkJXAotCWZvciAoX19pID0gMDsgX19pIDwgKHUzMilfSGV4RGF0YUxlbjsgX19pKyspIHsJCVwKLQkJcHJpbnRrKCIlMDJYJXMiLCBwdHJbX19pXSwgKCgoX19pICsgMSkgJSA0KSA9PSAwKT8iICAiOiIgIik7XAotCQlpZiAoKChfX2kgKyAxKSAlIDE2KSA9PSAwKQkJCVwKLQkJCXByaW50aygiXG4iKTsJCQkJXAotCX0JCQkJCQkJCVwKLQlwcmludGsoIlxuIik7CQkJCQkJCVwKLX0KLS8qICBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0yMi4gKi8KLSNkZWZpbmUgTUFYX1NUUl9MRU4JNjQKLS8qICBJIHdhbnQgdG8gc2VlIEFTQ0lJIDMzIHRvIDEyNiBvbmx5LiBPdGhlcndpc2UsIEkgcHJpbnQgJz8nLiAqLwotI2RlZmluZSBQUklOVEFCTEUoX2NoKQkoX2NoID49ICcgJyAmJiBfY2ggPD0gJ34nKQotI2RlZmluZSBSVF9QUklOVF9TVFIoX0NvbXAsIF9MZXZlbCwgX1RpdGxlU3RyaW5nLCBfUHRyLCBfTGVuKQkJXAotCXsJCQkJCQkJCVwKLQkJdTMyIF9faTsJCQkJCQlcCi0JCXU4IGJ1ZmZlcltNQVhfU1RSX0xFTl07CQkJCQlcCi0JCXUzMiBsZW5ndGggPSAoX0xlbiA8IE1BWF9TVFJfTEVOKSA/IF9MZW4gOiAoTUFYX1NUUl9MRU4tMSk7XAotCQltZW1zZXQoYnVmZmVyLCAwLCBNQVhfU1RSX0xFTik7CQkJCVwKLQkJbWVtY3B5KGJ1ZmZlciwgKHU4ICopX1B0ciwgbGVuZ3RoKTsJCQlcCi0JCWZvciAoX19pID0gMDsgX19pIDwgbGVuZ3RoOyBfX2krKykgewkJCVwKLQkJCWlmICghUFJJTlRBQkxFKGJ1ZmZlcltfX2ldKSkJCQlcCi0JCQkJYnVmZmVyW19faV0gPSAnPyc7CQkJXAotCQl9CQkJCQkJCVwKLQkJYnVmZmVyW2xlbmd0aF0gPSAnXDAnOwkJCQkJXAotCQlwcmludGsoX1RpdGxlU3RyaW5nKTsJCQkJCVwKLQkJcHJpbnRrKCI6ICVkLCA8JXM+XG4iLCBfTGVuLCBidWZmZXIpOwkJCVwKLQl9Ci0KLSNkZWZpbmUgRENNRF9QcmludGYoLi4uKQotI2RlZmluZSBSVF9BU1NFUlQoLi4uKQotCi0KLSNkZWZpbmUgR2V0RGVmYXVsdEFkYXB0ZXIocGFkYXB0ZXIpCXBhZGFwdGVyCi0KLSNkZWZpbmUgUGxhdGZvcm1aZXJvTWVtb3J5KHB0ciwgc3opCW1lbXNldChwdHIsIDAsIHN6KQotCi0jZGVmaW5lIEdFVF9VTkRFQ09SQVRFRF9BVkVSQUdFX1JTU0kocGFkYXB0ZXIpCVwKLQkJCShHRVRfSEFMX0RBVEEocGFkYXB0ZXIpLT5kbXByaXYuRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQikKLSNkZWZpbmUgUlRfUkZfQ0hBTkdFX1NPVVJDRSB1MzIKLQotZW51bSB7Ci0JUlRfSk9JTl9JTkZSQSAgID0gMSwKLQlSVF9KT0lOX0lCU1MgID0gMiwKLQlSVF9TVEFSVF9JQlNTID0gMywKLQlSVF9OT19BQ1RJT04gID0gNCwKLX07Ci0KLS8qICBwb3dlciBzYXZpbmcgKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBDT01NT00vQlQuYyA9PT09PSAqLwotCi1zdGF0aWMgdTggQlRfT3BlcmF0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+QnRPcGVyYXRpb25PbikKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB1OCBCVF9Jc0xlZ2FsQ2hhbm5lbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBjaGFubmVsKQotewotCXN0cnVjdCBydF9jaGFubmVsX2luZm8gKnBDaGFubmVMaXN0ID0gTlVMTDsKLQl1OCBjaGFubmVsTGVuLCBpOwotCi0JcENoYW5uZUxpc3QgPSBwYWRhcHRlci0+bWxtZWV4dHByaXYuY2hhbm5lbF9zZXQ7Ci0JY2hhbm5lbExlbiA9IHBhZGFwdGVyLT5tbG1lZXh0cHJpdi5tYXhfY2hhbl9udW1zOwotCi0JZm9yIChpID0gMDsgaSA8IGNoYW5uZWxMZW47IGkrKykgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsCi0JCQkoIkNoZWNrIGlmIGNobmwoJWQpIGluIGNoYW5uZWwgcGxhbiBjb250YWlucyBidCB0YXJnZXQgY2hubCglZCkgZm9yIEJUIGNvbm5lY3Rpb25cbiIsCi0JCQkgcENoYW5uZUxpc3RbaV0uQ2hhbm5lbE51bSwgY2hhbm5lbCkpOwotCQlpZiAoKGNoYW5uZWwgPT0gcENoYW5uZUxpc3RbaV0uQ2hhbm5lbE51bSkgfHwKLQkJICAgIChjaGFubmVsID09IHBDaGFubmVMaXN0W2ldLkNoYW5uZWxOdW0gKyAyKSkKLQkJCXJldHVybiBjaGFubmVsOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBCVF9TaWduYWxDb21wZW5zYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnJzc2lfd2lmaSwgdTggKnJzc2lfYnQpCi17Ci0JQlRETV9TaWduYWxDb21wZW5zYXRpb24ocGFkYXB0ZXIsIHJzc2lfd2lmaSwgcnNzaV9idCk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfQlRfd2lmaXNjYW5fbm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNjYW5UeXBlKQotewotCUJUSENJX1dpZmlTY2FuTm90aWZ5KHBhZGFwdGVyLCBzY2FuVHlwZSk7Ci0JQlRETV9DaGVja0FudFNlbE1vZGUocGFkYXB0ZXIpOwotCUJURE1fV2lmaVNjYW5Ob3RpZnkocGFkYXB0ZXIsIHNjYW5UeXBlKTsKLX0KLQotdm9pZCBydGw4NzIzYV9CVF93aWZpYXNzb2NpYXRlX25vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBhY3Rpb24pCi17Ci0JLyogIGFjdGlvbiA6ICovCi0JLyogIHRydWUgPSBhc3NvY2lhdGUgc3RhcnQgKi8KLQkvKiAgZmFsc2UgPSBhc3NvY2lhdGUgZmluaXNoZWQgKi8KLQlpZiAoYWN0aW9uKQotCQlCVERNX0NoZWNrQW50U2VsTW9kZShwYWRhcHRlcik7Ci0KLQlCVERNX1dpZmlBc3NvY2lhdGVOb3RpZnkocGFkYXB0ZXIsIGFjdGlvbik7Ci19Ci0KLXZvaWQgQlRfSGFsdFByb2Nlc3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlCVERNX0ZvckhhbHQocGFkYXB0ZXIpOwotfQotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIENPTU1PTS9CVC5jID09PT09ICovCi0KLSNkZWZpbmUgaTY0Zm10CQkibGwiCi0jZGVmaW5lIFVJTlQ2NF9DKHYpICAodikKLQotI2RlZmluZSBGaWxsT2N0ZXRTdHJpbmcoX29zLCBfb2N0ZXQsIF9sZW4pCQlcCi0JKF9vcykuT2N0ZXQgPSAodTggKikoX29jdGV0KTsJCQlcCi0JKF9vcykuTGVuZ3RoID0gKF9sZW4pOwotCi1zdGF0aWMgZW51bSBydF9zdGF0dXMgUGxhdGZvcm1JbmRpY2F0ZUJURXZlbnQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl2b2lkCQkJCQkJKnBFdm50RGF0YSwKLQl1MzIJCQkJCQlkYXRhTGVuCi0JKQotewotCWVudW0gcnRfc3RhdHVzCXJ0X3N0YXR1cyA9IFJUX1NUQVRVU19GQUlMVVJFOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5UX0RFVEFJTCwgKCJCVCBldmVudCBzdGFydCwgJWQgYnl0ZXMgZGF0YSB0byBUcmFuc2ZlcnJlZCEhXG4iLCBkYXRhTGVuKSk7Ci0JUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfRVZFTlRfREVUQUlMLCAiVG8gdHJhbnNmZXIgSGV4IERhdGEgOlxuIiwKLQkJcEV2bnREYXRhLCBkYXRhTGVuKTsKLQotCUJUX0V2ZW50UGFyc2UocGFkYXB0ZXIsIHBFdm50RGF0YSwgZGF0YUxlbik7Ci0KLQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTGludXggaGFzIG5vIHdheSB0byByZXBvcnQgQlQgZXZlbnQhIVxuIiwgX19mdW5jX18pOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5UX0RFVEFJTCwgKCJCVCBldmVudCBlbmQsICVzXG4iLAotCQkocnRfc3RhdHVzID09IFJUX1NUQVRVU19TVUNDRVNTKSA/ICJTVUNDRVNTIiA6ICJGQUlMIikpOwotCi0JcmV0dXJuIHJ0X3N0YXR1czsKLX0KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBDT01NT00vYnRfaGNpLmMgPT09PT0gKi8KLQotc3RhdGljIHU4IGJ0aGNpX0dldExvY2FsQ2hhbm5lbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJldHVybiBwYWRhcHRlci0+bWxtZWV4dHByaXYuY3VyX2NoYW5uZWw7Ci19Ci0KLXN0YXRpYyB1OCBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggUGh5SGFuZGxlKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JdTggaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGkrKykgewotCQlpZiAoKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLmJVc2VkKSAmJgotCQkgICAgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSA9PSBQaHlIYW5kbGUpKQotCQkJcmV0dXJuIGk7Ci0JfQotCi0JcmV0dXJuIDB4RkY7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aGNpX0RlY2lkZUJUQ2hhbm5lbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSkKLXsKLS8qUE1HTlRfSU5GTyBwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdjsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250OwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbzsKLQlzdHJ1Y3QgY2hubF90eHBvd2VyX3RyaXBsZSAqcFRyaXBsZV9zdWJiYW5kID0gTlVMTDsKLQlzdHJ1Y3QgY29tbW9uX3RyaXBsZSAqcFRyaXBsZTsKLQl1OCBpLCBqLCBsb2NhbGNobmwsIGZpcnN0UmVtb3RlTGVnYWxDaG5sSW5UcmlwbGV0ID0gMDsKLQl1OCByZWd1bGF0b3J5X3NraXBMZW4gPSAwOwotCXU4IHN1YmJhbmRUcmlwbGV0Q250ID0gMDsKLQotCXBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQotCXBCdE1nbnQtPkNoZWNrQ2hubElzU3VpdCA9IHRydWU7Ci0JbG9jYWxjaG5sID0gYnRoY2lfR2V0TG9jYWxDaGFubmVsKHBhZGFwdGVyKTsKLQotCXBUcmlwbGUgPSAoc3RydWN0IGNvbW1vbl90cmlwbGUgKikKLQkJJnBCdEhjaUluZm8tPkJUUHJlQ2hubGxpc3RbQ09VTlRSWV9TVFJfTEVOXTsKLQotCS8qICBjb250YWlucyBjb3VudHJ5IHN0cmluZywgbGVuIGlzIDMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgKHBCdEhjaUluZm8tPkJ0UHJlQ2hubExpc3RMZW4tQ09VTlRSWV9TVFJfTEVOKTsgaSArPSAzLCBwVHJpcGxlKyspIHsKLQkJLyogICovCi0JCS8qICBjaGVjayBldmVyeSB0cmlwbGV0LCBhbiB0cmlwbGV0IG1heSBiZSAqLwotCQkvKiAgcmVndWxhdG9yeSBleHRlbnNpb24gaWRlbnRpZmllciBvciBzdWItYmFuZCB0cmlwbGV0ICovCi0JCS8qICAqLwotCQlpZiAocFRyaXBsZS0+Ynl0ZV8xc3QgPT0gMHhjOSkgewotCQkJLyogIFJlZ3VsYXRvcnkgRXh0ZW5zaW9uIElkZW50aWZpZXIsIHNraXAgaXQgKi8KLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLAotCQkJCSgiRmluZCBSZWd1bGF0b3J5IElELCByZWd1bGF0b3J5IGNsYXNzID0gJWRcbiIsIHBUcmlwbGUtPmJ5dGVfMm5kKSk7Ci0JCQlyZWd1bGF0b3J5X3NraXBMZW4gKz0gMzsKLQkJCXBUcmlwbGVfc3ViYmFuZCA9IE5VTEw7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIHsJLyogIFN1Yi1iYW5kIHRyaXBsZXQgKi8KLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIkZpbmQgU3ViLWJhbmQgdHJpcGxldCBcbiIpKTsKLQkJCXN1YmJhbmRUcmlwbGV0Q250Kys7Ci0JCQlwVHJpcGxlX3N1YmJhbmQgPSAoc3RydWN0IGNobmxfdHhwb3dlcl90cmlwbGUgKilwVHJpcGxlOwotCQkJLyogIGlmIHJlbW90ZSBmaXJzdCBsZWdhbCBjaGFubmVsIG5vdCBmb3VuZCwgdGhlbiBmaW5kIGZpcnN0IHJlbW90ZSBjaGFubmVsICovCi0JCQkvKiAgYW5kIGl0J3MgbGVnYWwgZm9yIG91ciBjaGFubmVsIHBsYW4uICovCi0KLQkJCS8qICBzZWFyY2ggdGhlIHN1Yi1iYW5kIHRyaXBsZXQgYW5kIGZpbmQgaWYgcmVtb3RlIGNoYW5uZWwgaXMgbGVnYWwgdG8gb3VyIGNoYW5uZWwgcGxhbi4gKi8KLQkJCWZvciAoaiA9IHBUcmlwbGVfc3ViYmFuZC0+Rmlyc3RDaG5sOyBqIDwgKHBUcmlwbGVfc3ViYmFuZC0+Rmlyc3RDaG5sK3BUcmlwbGVfc3ViYmFuZC0+TnVtQ2hubHMpOyBqKyspIHsKLQkJCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCIgQ2hlY2sgaWYgY2hubCglZCkgaXMgbGVnYWxcbiIsIGopKTsKLQkJCQlpZiAoQlRfSXNMZWdhbENoYW5uZWwocGFkYXB0ZXIsIGopKSB7Ci0JCQkJCS8qICByZW1vdGUgY2hhbm5lbCBpcyBsZWdhbCBmb3Igb3VyIGNoYW5uZWwgcGxhbi4gKi8KLQkJCQkJZmlyc3RSZW1vdGVMZWdhbENobmxJblRyaXBsZXQgPSBqOwotCQkJCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwKLQkJCQkJCSgiRmluZCBmaXJzdCByZW1vdGUgbGVnYWwgY2hhbm5lbCA6ICVkXG4iLAotCQkJCQkJZmlyc3RSZW1vdGVMZWdhbENobmxJblRyaXBsZXQpKTsKLQotCQkJCQkvKiAgSWYgd2UgZmluZCBhIHJlbW90ZSBsZWdhbCBjaGFubmVsIGluIHRoZSBzdWItYmFuZCB0cmlwbGV0ICovCi0JCQkJCS8qICBhbmQgb25seSBCVCBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkKGxvY2FsIG5vdCBjb25uZWN0IHRvIGFueSBBUCBvciBJQlNTKSwgKi8KLQkJCQkJLyogIHRoZW4gd2UganVzdCBzd2l0Y2ggY2hhbm5lbCB0byByZW1vdGUgY2hhbm5lbC4gKi8KLQkJCQkJaWYgKCEoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVNPQ19TVEFURXxXSUZJX0FESE9DX1NUQVRFfFdJRklfQVBfU1RBVEUpIHx8Ci0JCQkJCSAgICBCVEhDSV9Ic0Nvbm5lY3Rpb25Fc3RhYmxpc2hlZChwYWRhcHRlcikpKSB7Ci0JCQkJCQlwQnRNZ250LT5CVENoYW5uZWwgPSBmaXJzdFJlbW90ZUxlZ2FsQ2hubEluVHJpcGxldDsKLQkJCQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIlJlbW90ZSBsZWdhbCBjaGFubmVsICglZCkgaXMgc2VsZWN0ZWQsIExvY2FsIG5vdCBjb25uZWN0IHRvIGFueSEhXG4iLCBwQnRNZ250LT5CVENoYW5uZWwpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICgobG9jYWxjaG5sID49IGZpcnN0UmVtb3RlTGVnYWxDaG5sSW5UcmlwbGV0KSAmJgotCQkJCQkJICAgIChsb2NhbGNobmwgPCAocFRyaXBsZV9zdWJiYW5kLT5GaXJzdENobmwrcFRyaXBsZV9zdWJiYW5kLT5OdW1DaG5scykpKSB7Ci0JCQkJCQkJcEJ0TWdudC0+QlRDaGFubmVsID0gbG9jYWxjaG5sOwotCQkJCQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIkxvY2FsIGNoYW5uZWwgKCVkKSBpcyBzZWxlY3RlZCwgd2lmaSBvciBCVCBjb25uZWN0aW9uIGV4aXN0c1xuIiwgcEJ0TWdudC0+QlRDaGFubmVsKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWlmIChzdWJiYW5kVHJpcGxldENudCkgewotCQkvKiBpZiBhbnkgcHJlZmVycmVkIGNoYW5uZWwgdHJpcGxldCBleGlzdHMgKi8KLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiVGhlcmUgYXJlICVkIHN1YiBiYW5kIHRyaXBsZXQgZXhpc3RzLCAiLCBzdWJiYW5kVHJpcGxldENudCkpOwotCQlpZiAoZmlyc3RSZW1vdGVMZWdhbENobmxJblRyaXBsZXQgPT0gMCkgewotCQkJLyogbm8gbGVnYWwgY2hhbm5lbCBpcyBmb3VuZCwgcmVqZWN0IHRoZSBjb25uZWN0aW9uLiAqLwotCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgibm8gbGVnYWwgY2hhbm5lbCBpcyBmb3VuZCEhXG4iKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiAgUmVtb3RlIExlZ2FsIGNoYW5uZWwgaXMgZm91bmQgYnV0IG5vdCBtYXRjaCB0byBsb2NhbCAqLwotCQkJLyogd2lmaSBjb25uZWN0aW9uIGV4aXN0cyksIHNvIHJlamVjdCB0aGUgY29ubmVjdGlvbi4gKi8KLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLAotCQkJCSgiUmVtb3RlIExlZ2FsIGNoYW5uZWwgaXMgZm91bmQgYnV0IG5vdCBtYXRjaCB0byBsb2NhbCh3aWZpIGNvbm5lY3Rpb24gZXhpc3RzKSEhXG4iKSk7Ci0JCX0KLQkJcEJ0TWdudC0+Q2hlY2tDaG5sSXNTdWl0ID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJLyogIFRoZXJlIGFyZSBub3QgYW55IHByZWZlcnJlZCBjaGFubmVsIHRyaXBsZXQgZXhpc3RzICovCi0JCS8qICBVc2UgY3VycmVudCBsZWdhbCBjaGFubmVsIGFzIHRoZSBidCBjaGFubmVsLiAqLwotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJObyBzdWIgYmFuZCB0cmlwbGV0IGV4aXN0cyEhXG4iKSk7Ci0JfQotCXBCdE1nbnQtPkJUQ2hhbm5lbCA9IGxvY2FsY2hubDsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJMb2NhbCBjaGFubmVsICglZCkgaXMgc2VsZWN0ZWQhIVxuIiwgcEJ0TWdudC0+QlRDaGFubmVsKSk7Ci19Ci0KLS8qIFN1Y2Nlc3M6cmV0dXJuIHRydWUgKi8KLS8qIEZhaWw6cmV0dXJuIGZhbHNlICovCi1zdGF0aWMgdTggYnRoY2lfR2V0QXNzb2NJbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEVudHJ5TnVtKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvOwotCXU4IHRlbXBCdWZbMjU2XTsKLQl1OCBpID0gMDsKLQl1OCBCYXNlTWVtb3J5U2hpZnQgPSAwOwotCXUxNglUb3RhbExlbiA9IDA7Ci0Jc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKnBBbXBBc29jOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJHZXRBc3NvY0luZm8gc3RhcnRcbiIpKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCi0JaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhciA9PSAwKSB7Ci0JCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW4gPCAoTUFYX0FNUF9BU1NPQ19GUkFHX0xFTikpCi0JCQlUb3RhbExlbiA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY1JlbUxlbjsKLQkJZWxzZSBpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jUmVtTGVuID09IChNQVhfQU1QX0FTU09DX0ZSQUdfTEVOKSkKLQkJCVRvdGFsTGVuID0gTUFYX0FNUF9BU1NPQ19GUkFHX0xFTjsKLQl9IGVsc2UgaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhciA+IDApCi0JCVRvdGFsTGVuID0gcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkxlblNvRmFyOwotCi0Jd2hpbGUgKChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuTGVuU29GYXIgPj0gQmFzZU1lbW9yeVNoaWZ0KSB8fCBUb3RhbExlbiA+IEJhc2VNZW1vcnlTaGlmdCkgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0RFVEFJTCwgKCJHZXRBc3NvY0luZm8sIFRvdGFsTGVuID0lZCwgQmFzZU1lbW9yeVNoaWZ0ID0lZFxuIiwgVG90YWxMZW4sIEJhc2VNZW1vcnlTaGlmdCkpOwotCQltZW1jcHkodGVtcEJ1ZiwKLQkJCSh1OCAqKXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY2ZyYWdtZW50K0Jhc2VNZW1vcnlTaGlmdCwKLQkJCVRvdGFsTGVuLUJhc2VNZW1vcnlTaGlmdCk7Ci0JCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9ERVRBSUwsICJHZXRBc3NvY0luZm8gOlxuIiwKLQkJCXRlbXBCdWYsIFRvdGFsTGVuLUJhc2VNZW1vcnlTaGlmdCk7Ci0KLQkJcEFtcEFzb2MgPSAoc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKil0ZW1wQnVmOwotCQlsZTE2X3RvX2NwdXMoJnBBbXBBc29jLT5MZW5ndGgpOwotCQlCYXNlTWVtb3J5U2hpZnQgKz0gMyArIHBBbXBBc29jLT5MZW5ndGg7Ci0KLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJUeXBlSUQgPSAweCV4LCAiLCBwQW1wQXNvYy0+VHlwZUlEKSk7Ci0JCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgIkhleCBEYXRhOiBcbiIsIHBBbXBBc29jLT5EYXRhLCBwQW1wQXNvYy0+TGVuZ3RoKTsKLQkJc3dpdGNoIChwQW1wQXNvYy0+VHlwZUlEKSB7Ci0JCWNhc2UgQU1QX01BQ19BRERSOgotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCI9PT4gQU1QX01BQ19BRERSXG4iKSk7Ci0JCQlpZiAocEFtcEFzb2MtPkxlbmd0aCA+IDYpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJbWVtY3B5KHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CVFJlbW90ZU1BQ0FkZHIsIHBBbXBBc29jLT5EYXRhLCA2KTsKLQkJCVJUUFJJTlRfQUREUihGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJSZW1vdGUgTWFjIGFkZHJlc3MgXG4iKSwgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJUUmVtb3RlTUFDQWRkcik7Ci0JCQlicmVhazsKLQkJY2FzZSBBTVBfUFJFRkVSUkVEX0NIQU5ORUxfTElTVDoKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiPT0+IEFNUF9QUkVGRVJSRURfQ0hBTk5FTF9MSVNUXG4iKSk7Ci0JCQlwQnRIY2lJbmZvLT5CdFByZUNobmxMaXN0TGVuID0gcEFtcEFzb2MtPkxlbmd0aDsKLQkJCW1lbWNweShwQnRIY2lJbmZvLT5CVFByZUNobmxsaXN0LAotCQkJCXBBbXBBc29jLT5EYXRhLAotCQkJCXBCdEhjaUluZm8tPkJ0UHJlQ2hubExpc3RMZW4pOwotCQkJUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAiUHJlZmVycmVkIGNoYW5uZWwgbGlzdCA6IFxuIiwgcEJ0SGNpSW5mby0+QlRQcmVDaG5sbGlzdCwgcEJ0SGNpSW5mby0+QnRQcmVDaG5sTGlzdExlbik7Ci0JCQlidGhjaV9EZWNpZGVCVENoYW5uZWwocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLQkJCWJyZWFrOwotCQljYXNlIEFNUF9DT05ORUNURURfQ0hBTk5FTDoKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiPT0+IEFNUF9DT05ORUNURURfQ0hBTk5FTFxuIikpOwotCQkJcEJ0SGNpSW5mby0+QlRDb25uZWN0Q2hubExpc3RMZW4gPSBwQW1wQXNvYy0+TGVuZ3RoOwotCQkJbWVtY3B5KHBCdEhjaUluZm8tPkJUQ29ubmVjdENobmxsaXN0LAotCQkJCXBBbXBBc29jLT5EYXRhLAotCQkJCXBCdEhjaUluZm8tPkJUQ29ubmVjdENobmxMaXN0TGVuKTsKLQkJCWJyZWFrOwotCQljYXNlIEFNUF84MDIxMV9QQUxfQ0FQX0xJU1Q6Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIj09PiBBTVBfODAyMTFfUEFMX0NBUF9MSVNUXG4iKSk7Ci0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQlRDYXBhYmlsaXR5ID0gKih1MzIgKikocEFtcEFzb2MtPkRhdGEpOwotCQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CVENhcGFiaWxpdHkgJiAweDAwMDAwMDAxKSB7Ci0JCQkJLyogIFRPRE86ICovCi0KLQkJCQkvKiBTaWduaWZpZXMgUEFMIGNhcGFibGUgb2YgdXRpbGl6aW5nIHJlY2VpdmVkIGFjdGl2aXR5IHJlcG9ydHMuICovCi0JCQl9Ci0JCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJUQ2FwYWJpbGl0eSAmIDB4MDAwMDAwMDIpIHsKLQkJCQkvKiAgVE9ETzogKi8KLQkJCQkvKiBTaWduaWZpZXMgUEFMIGlzIGNhcGFibGUgb2YgdXRpbGl6aW5nIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gcmVjZWl2ZWQgaW4gYW4gYWN0aXZpdHkgcmVwb3J0cy4gKi8KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEFNUF84MDIxMV9QQUxfVklTSU9OOgotCQkJcEJ0SGNpSW5mby0+QlRQYWxWZXJzaW9uID0gKih1OCAqKShwQW1wQXNvYy0+RGF0YSk7Ci0JCQlwQnRIY2lJbmZvLT5CVFBhbENvbXBhbnlJRCA9ICoodTE2ICopKCgodTggKikocEFtcEFzb2MtPkRhdGEpKSsxKTsKLQkJCXBCdEhjaUluZm8tPkJUUGFsc3VidmVyc2lvbiA9ICoodTE2ICopKCgodTggKikocEFtcEFzb2MtPkRhdGEpKSszKTsKLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIj09PiBBTVBfODAyMTFfUEFMX1ZJU0lPTiBQYWxWZXJzaW9uICAweCV4LCBQYWxDb21wYW55SUQgIDB4JXgsIFBhbHN1YnZlcnNpb24gMHgleFxuIiwKLQkJCQlwQnRIY2lJbmZvLT5CVFBhbFZlcnNpb24sCi0JCQkJcEJ0SGNpSW5mby0+QlRQYWxDb21wYW55SUQsCi0JCQkJcEJ0SGNpSW5mby0+QlRQYWxzdWJ2ZXJzaW9uKSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiPT0+IFVuc3VwcG9ydCBUeXBlSUQgISFcbiIpKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWkrKzsKLQl9Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJHZXRBc3NvY0luZm8gZW5kXG4iKSk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHU4IGJ0aGNpX0FkZEVudHJ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQl1OCBpOwotCi0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGkrKykgewotCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbaV0uYlVzZWQgPT0gZmFsc2UpIHsKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLmJVc2VkID0gdHJ1ZTsKLQkJCXBCdE1nbnQtPkN1cnJlbnRDb25uZWN0RW50cnlOdW0gPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoaSA9PSBNQVhfQlRfQVNPQ19FTlRSWV9OVU0pIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoImJ0aGNpX0FkZEVudHJ5KCksIEFkZCBlbnRyeSBmYWlsISFcbiIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHU4IGJ0aGNpX0Rpc2NhcmRUeFBhY2tldHMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IExMSCkKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB1OAotYnRoY2lfQ2hlY2tMb2dMaW5rQmVoYXZpb3IoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgaGNpX2Zsb3dfc3BlYwkJCVR4Rmxvd1NwZWMKLQkpCi17Ci0JdTggSUQgPSBUeEZsb3dTcGVjLklkZW50aWZpZXI7Ci0JdTggU2VydmljZVR5cGUgPSBUeEZsb3dTcGVjLlNlcnZpY2VUeXBlOwotCXUxNglNYXhTRFVTaXplID0gVHhGbG93U3BlYy5NYXhpbXVtU0RVU2l6ZTsKLQl1MzIJU0RVSW50ZXJBcnJpdmF0aW1lID0gVHhGbG93U3BlYy5TRFVJbnRlckFycml2YWxUaW1lOwotCXU4IG1hdGNoID0gZmFsc2U7Ci0KLQlzd2l0Y2ggKElEKSB7Ci0JY2FzZSAxOgotCQlpZiAoU2VydmljZVR5cGUgPT0gQlRfTExfQkUpIHsKLQkJCW1hdGNoID0gdHJ1ZTsKLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTG9naWNhbCBMaW5rIFR5cGUgPSAgVFggYmVzdCBlZmZvcnQgZmxvd3NwZWNcbiIpKTsKLQkJfSBlbHNlIGlmICgoU2VydmljZVR5cGUgPT0gQlRfTExfR1UpICYmIChNYXhTRFVTaXplID09IDB4ZmZmZikpIHsKLQkJCW1hdGNoID0gdHJ1ZTsKLQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTG9naWNhbCBMaW5rIFR5cGUgPSAgUlggZ3VhcmFudGVlZCBsYXRlbmN5IGZsb3dzcGVjXG4iKSk7Ci0JCX0gZWxzZSBpZiAoKFNlcnZpY2VUeXBlID09IEJUX0xMX0dVKSAmJiAoTWF4U0RVU2l6ZSA9PSAyNTAwKSkgewotCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJMb2dpY2FsIExpbmsgVHlwZSA9ICBSWCBndWFyYW50ZWVkIExhcmdlIGxhdGVuY3kgZmxvd3NwZWNcbiIpKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDI6Ci0JCWlmIChTZXJ2aWNlVHlwZSA9PSBCVF9MTF9CRSkgewotCQkJbWF0Y2ggPSB0cnVlOwotCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJMb2dpY2FsIExpbmsgVHlwZSA9ICBSWCBiZXN0IGVmZm9ydCBmbG93c3BlY1xuIikpOwotCi0JCX0KLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlpZiAoKFNlcnZpY2VUeXBlID09IEJUX0xMX0dVKSAmJiAoTWF4U0RVU2l6ZSA9PSAxNDkyKSkgewotCQkJbWF0Y2ggPSB0cnVlOwotCQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJMb2dpY2FsIExpbmsgVHlwZSA9ICBUWCBndWFyYW50ZWVkIGxhdGVuY3kgZmxvd3NwZWNcbiIpKTsKLQkJfSBlbHNlIGlmICgoU2VydmljZVR5cGUgPT0gQlRfTExfR1UpICYmIChNYXhTRFVTaXplID09IDI1MDApKSB7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIkxvZ2ljYWwgTGluayBUeXBlID0gIFRYIGd1YXJhbnRlZWQgTGFyZ2UgbGF0ZW5jeSBmbG93c3BlY1xuIikpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJaWYgKFNlcnZpY2VUeXBlID09IEJUX0xMX0JFKSB7Ci0JCQlpZiAoKFNEVUludGVyQXJyaXZhdGltZSA9PSAweGZmZmZmZmZmKSAmJiAoU2VydmljZVR5cGUgPT0gQlRfTExfQkUpICYmIChNYXhTRFVTaXplID09IDE0OTIpKSB7Ci0JCQkJbWF0Y2ggPSB0cnVlOwotCQkJCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTG9naWNhbCBMaW5rIFR5cGUgPSAgVFgvUlggYWdncmVnYXRlZCBiZXN0IGVmZm9ydCBmbG93c3BlY1xuIikpOwotCQkJfQotCQl9IGVsc2UgaWYgKFNlcnZpY2VUeXBlID09IEJUX0xMX0dVKSB7Ci0JCQlpZiAoU0RVSW50ZXJBcnJpdmF0aW1lID09IDEwMCkgewotCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIkxvZ2ljYWwgTGluayBUeXBlID0gIFRYL1JYIGd1YXJhbnRlZWQgYmFuZHdpZHRoIGZsb3dzcGVjXG4iKSk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJMb2dpY2FsIExpbmsgVHlwZSA9ICBVbmtub3cgVHlwZSAhISEhISEhIVxuIikpOwotCQlicmVhazsKLQl9Ci0KLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwKLQkJKCJJRCA9IDB4JXgsIFNlcnZpY2VUeXBlID0gMHgleCwgTWF4aW11bVNEVVNpemUgPSAweCV4LCBTRFVJbnRlckFycml2YWxUaW1lID0gMHgleCwgQWNjZXNzTGF0ZW5jeSA9IDB4JXgsIEZsdXNoVGltZW91dCA9IDB4JXhcbiIsCi0JCVR4Rmxvd1NwZWMuSWRlbnRpZmllciwgVHhGbG93U3BlYy5TZXJ2aWNlVHlwZSwgTWF4U0RVU2l6ZSwKLQkJU0RVSW50ZXJBcnJpdmF0aW1lLCBUeEZsb3dTcGVjLkFjY2Vzc0xhdGVuY3ksIFR4Rmxvd1NwZWMuRmx1c2hUaW1lb3V0KSk7Ci0JcmV0dXJuIG1hdGNoOwotfQotCi1zdGF0aWMgdTE2IGJ0aGNpX0Fzc29jTUFDQWRkcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkCSpwYnVmKQotewotCXN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICpwQXNzb1N0cmMgPSAoc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKilwYnVmOwotCXBBc3NvU3RyYy0+VHlwZUlEID0gQU1QX01BQ19BRERSOwotCXBBc3NvU3RyYy0+TGVuZ3RoID0gMHgwNjsKLQltZW1jcHkoJnBBc3NvU3RyYy0+RGF0YVswXSwgcGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIsIDYpOwotCVJUUFJJTlRfREFUQShGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwKLQkJICAgICAoIkFzc29jTUFDQWRkciA6IFxuIiksIHBBc3NvU3RyYywgcEFzc29TdHJjLT5MZW5ndGgrMyk7Ci0KLQlyZXR1cm4gcEFzc29TdHJjLT5MZW5ndGggKyAzOwotfQotCi1zdGF0aWMgdTE2Ci1idGhjaV9QQUxDYXBhYmlsaXRpZXMoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl2b2lkCSpwYnVmCi0JKQotewotCXN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICpwQXNzb1N0cmMgPSAoc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKilwYnVmOwotCi0JcEFzc29TdHJjLT5UeXBlSUQgPSBBTVBfODAyMTFfUEFMX0NBUF9MSVNUOwotCXBBc3NvU3RyYy0+TGVuZ3RoID0gMHgwNDsKLQotCXBBc3NvU3RyYy0+RGF0YVswXSA9IDB4MDA7Ci0JcEFzc29TdHJjLT5EYXRhWzFdID0gMHgwMDsKLQotCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9ERVRBSUwsICgiUEFMQ2FwYWJpbGl0aWVzOlxuIiksIHBBc3NvU3RyYywgcEFzc29TdHJjLT5MZW5ndGgrMyk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0xPR08sICgiUEFMQ2FwYWJpbGl0aWVzIFxuIikpOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0xPR08sICgiIFR5cGVJRCA9IDB4JXgsXG4gTGVuZ3RoID0gMHgleCxcbiBDb250ZW50ID0gMHgwMDAwXG4iLAotCQlwQXNzb1N0cmMtPlR5cGVJRCwKLQkJcEFzc29TdHJjLT5MZW5ndGgpKTsKLQotCXJldHVybiBwQXNzb1N0cmMtPkxlbmd0aCArIDM7Ci19Ci0KLXN0YXRpYyB1MTYgYnRoY2lfQXNzb2NQcmVmZXJyZWRDaGFubmVsTGlzdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQkgICB2b2lkICpwYnVmLCB1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICpwQXNzb1N0cmM7Ci0Jc3RydWN0IGFtcF9wcmVmX2NobmxfcmVndWxhdG9yeSAqcFJlZzsKLQlzdHJ1Y3QgY2hubF90eHBvd2VyX3RyaXBsZSAqcFRyaXBsZTsKLQljaGFyIGN0clN0cmluZ1szXSA9IHsnWCcsICdYJywgJ1gnfTsKLQl1MzIgbGVuID0gMDsKLQl1OCBwcmVmZXJyZWRDaG5sOwotCi0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQXNzb1N0cmMgPSAoc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKilwYnVmOwotCXBSZWcgPSAoc3RydWN0IGFtcF9wcmVmX2NobmxfcmVndWxhdG9yeSAqKSZwQXNzb1N0cmMtPkRhdGFbM107Ci0KLQlwcmVmZXJyZWRDaG5sID0gYnRoY2lfR2V0TG9jYWxDaGFubmVsKHBhZGFwdGVyKTsKLQlwQXNzb1N0cmMtPlR5cGVJRCA9IEFNUF9QUkVGRVJSRURfQ0hBTk5FTF9MSVNUOwotCi0JLyogIGxvY2FsZSB1bmtub3duICovCi0JbWVtY3B5KCZwQXNzb1N0cmMtPkRhdGFbMF0sICZjdHJTdHJpbmdbMF0sIDMpOwotCXBSZWctPnJlWElkID0gMjAxOwotCXBSZWctPnJlZ3VsYXRvcnlDbGFzcyA9IDI1NDsKLQlwUmVnLT5jb3ZlcmFnZUNsYXNzID0gMDsKLQlsZW4gKz0gNjsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRCB8IElPQ1RMX0JUX0xPR08pLCAoIlBSRUZFUlJFRF9DSE5MX0xJU1RcbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRCB8IElPQ1RMX0JUX0xPR08pLCAoIlhYWCwgMjAxLCAyNTQsIDBcbiIpKTsKLQkvKiAgYXQgdGhlIGZvbGxvd2luZywgY2hubCAxfjExIHNob3VsZCBiZSBjb250YWluZWQgKi8KLQlwVHJpcGxlID0gKHN0cnVjdCBjaG5sX3R4cG93ZXJfdHJpcGxlICopJnBBc3NvU3RyYy0+RGF0YVtsZW5dOwotCi0JLyogICgxKSBpZiBhbnkgd2lmaSBvciBidCBIUyBjb25uZWN0aW9uIGV4aXN0cyAqLwotCWlmICgocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfQ1JFQVRPUikgfHwKLQkgICAgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BU09DX1NUQVRFIHwKLQkJCSAgIFdJRklfQURIT0NfU1RBVEUgfCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSB8Ci0JCQkgICBXSUZJX0FQX1NUQVRFKSkgfHwKLQkgICAgQlRIQ0lfSHNDb25uZWN0aW9uRXN0YWJsaXNoZWQocGFkYXB0ZXIpKSB7Ci0JCXBUcmlwbGUtPkZpcnN0Q2hubCA9IHByZWZlcnJlZENobmw7Ci0JCXBUcmlwbGUtPk51bUNobmxzID0gMTsKLQkJcFRyaXBsZS0+TWF4VHhQb3dlckluRGJtID0gMjA7Ci0JCWxlbiArPSAzOwotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRCB8IElPQ1RMX0JUX0xPR08pLCAoIkZpcnN0IENoYW5uZWwgPSAlZCwgQ2hhbm5lbCBOdW0gPSAlZCwgTWF4RGJtID0gJWRcbiIsCi0JCQlwVHJpcGxlLT5GaXJzdENobmwsCi0JCQlwVHJpcGxlLT5OdW1DaG5scywKLQkJCXBUcmlwbGUtPk1heFR4UG93ZXJJbkRibSkpOwotCX0KLQotCXBBc3NvU3RyYy0+TGVuZ3RoID0gKHUxNilsZW47Ci0JUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkFzc29jUHJlZmVycmVkQ2hhbm5lbExpc3QgOiBcbiIpLCBwQXNzb1N0cmMsIHBBc3NvU3RyYy0+TGVuZ3RoKzMpOwotCi0JcmV0dXJuIHBBc3NvU3RyYy0+TGVuZ3RoICsgMzsKLX0KLQotc3RhdGljIHUxNiBidGhjaV9Bc3NvY1BBTFZlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkICpwYnVmKQotewotCXN0cnVjdCBhbXBfYXNzb2Nfc3RydWN0dXJlICpwQXNzb1N0cmMgPSAoc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgKilwYnVmOwotCXU4ICpwdTFUbXA7Ci0JdTE2CSpwdTJUbXA7Ci0KLQlwQXNzb1N0cmMtPlR5cGVJRCA9IEFNUF84MDIxMV9QQUxfVklTSU9OOwotCXBBc3NvU3RyYy0+TGVuZ3RoID0gMHg1OwotCXB1MVRtcCA9ICZwQXNzb1N0cmMtPkRhdGFbMF07Ci0JKnB1MVRtcCA9IDB4MTsJLyogIFBBTCBWZXJzaW9uICovCi0JcHUyVG1wID0gKHUxNiAqKSZwQXNzb1N0cmMtPkRhdGFbMV07Ci0JKnB1MlRtcCA9IDB4NUQ7CS8qICBTSUcgQ29tcGFueSBpZGVudGlmaWVyIG9mIDgwMi4xMSBQQUwgdmVuZG9yICovCi0JcHUyVG1wID0gKHUxNiAqKSZwQXNzb1N0cmMtPkRhdGFbM107Ci0JKnB1MlRtcCA9IDB4MTsJLyogIFBBTCBTdWItdmVyc2lvbiBzcGVjaWZpZXIgKi8KLQotCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9ERVRBSUwsICgiQXNzb2NQQUxWZXIgOiBcbiIpLCBwQXNzb1N0cmMsIHBBc3NvU3RyYy0+TGVuZ3RoKzMpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9MT0dPLCAoIkFzc29jUEFMVmVyIFxuIikpOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0xPR08sICgiIFR5cGVJRCA9IDB4JXgsXG4gTGVuZ3RoID0gMHgleCxcbiBQQUwgVmVyc2lvbiA9IDB4MDEsXG4gUEFMIHZlbmRvciA9IDB4MDEsXG4gUEFMIFN1Yi12ZXJzaW9uIHNwZWNpZmllciA9IDB4MDFcbiIsCi0JCXBBc3NvU3RyYy0+VHlwZUlELAotCQlwQXNzb1N0cmMtPkxlbmd0aCkpOwotCXJldHVybiBwQXNzb1N0cmMtPkxlbmd0aCArIDM7Ci19Ci0KLXN0YXRpYyB1OCBidGhjaV9DaGVja1JmU3RhdGVCZWZvcmVDb25uZWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlCQlSZlN0YXRlOwotCi0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQotCVJmU3RhdGUgPSBwYWRhcHRlci0+cHdyY3RybHByaXYucmZfcHdyc3RhdGU7Ci0KLQlpZiAoUmZTdGF0ZSAhPSByZl9vbikgewotCQltb2RfdGltZXIoJnBCVEluZm8tPkJUUHNEaXNhYmxlVGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aGNpX1Jlc3BvbmRlclN0YXJ0VG9TY2FuKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci19Ci0KLXN0YXRpYyB1OCBidGhjaV9QaHlMaW5rQ29ubmVjdGlvbkluUHJvZ3Jlc3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggUGh5TGlua0hhbmRsZSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250OwotCi0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWlmIChwQnRNZ250LT5iUGh5TGlua0luUHJvZ3Jlc3MgJiYKLQkJKHBCdE1nbnQtPkJ0Q3VycmVudFBoeUxpbmtoYW5kbGUgPT0gUGh5TGlua0hhbmRsZSkpCi0JCXJldHVybiB0cnVlOwotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgYnRoY2lfUmVzZXRGbG93U3BlYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSwgdTggaW5kZXgpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbzsKLQotCXBCVGluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0KLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLkJ0TG9nTGlua2hhbmRsZSA9IDA7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5CdFBoeUxpbmtoYW5kbGUgPSAwOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uYkxMQ29tcGxldGVFdmVudElzU2V0ID0gZmFsc2U7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5iTExDYW5jZWxDTURJc1NldGFuZENvbXBsZXRlID0gZmFsc2U7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5CdFR4Rmxvd1NwZWNJRCA9IDA7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5UeFBhY2tldENvdW50ID0gMDsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uVHhfRmxvd19TcGVjLklkZW50aWZpZXIgPSAweDAxOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uVHhfRmxvd19TcGVjLlNlcnZpY2VUeXBlID0gU0VSVklDRV9CRVNUX0VGRk9SVDsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlR4X0Zsb3dfU3BlYy5NYXhpbXVtU0RVU2l6ZSA9IDB4ZmZmZjsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlR4X0Zsb3dfU3BlYy5TRFVJbnRlckFycml2YWxUaW1lID0gMHhmZmZmZmZmZjsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlR4X0Zsb3dfU3BlYy5BY2Nlc3NMYXRlbmN5ID0gMHhmZmZmZmZmZjsKLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaW5kZXhdLlR4X0Zsb3dfU3BlYy5GbHVzaFRpbWVvdXQgPSAweGZmZmZmZmZmOwotCi0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5SeF9GbG93X1NwZWMuSWRlbnRpZmllciA9IDB4MDE7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2luZGV4XS5SeF9GbG93X1NwZWMuU2VydmljZVR5cGUgPSBTRVJWSUNFX0JFU1RfRUZGT1JUOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uUnhfRmxvd19TcGVjLk1heGltdW1TRFVTaXplID0gMHhmZmZmOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uUnhfRmxvd19TcGVjLlNEVUludGVyQXJyaXZhbFRpbWUgPSAweGZmZmZmZmZmOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uUnhfRmxvd19TcGVjLkFjY2Vzc0xhdGVuY3kgPSAweGZmZmZmZmZmOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpbmRleF0uUnhfRmxvd19TcGVjLkZsdXNoVGltZW91dCA9IDB4ZmZmZmZmZmY7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aGNpX1Jlc2V0RW50cnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggRW50cnlOdW0pCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQl1OCBqOwotCi0JcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVGluZm8tPkJ0TWdudDsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iVXNlZCA9IGZhbHNlOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdEN1cnJlbnRTdGF0ZSA9IEhDSV9TVEFURV9ESVNDT05ORUNURUQ7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0TmV4dFN0YXRlID0gSENJX1NUQVRFX0RJU0NPTk5FQ1RFRDsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY1JlbUxlbiA9IDA7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSA9IDA7Ci0JaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY2ZyYWdtZW50ICE9IE5VTEwpCi0JCW1lbXNldChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NmcmFnbWVudCwgMCwgVE9UQUxfQUxMT0NJQVRFX0FTU09DX0xFTik7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkxlblNvRmFyID0gMDsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleVR5cGUgPSAwOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUgPSAwOwotCW1lbXNldChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXksIDAsCi0JICAgICAgIHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleUxlbik7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5TGVuID0gMDsKLQotCS8qIDB4NjQwOyAwLjYyNW1zKjE2MDAgPSAxMDAwbXMsIDAuNjI1bXMqMTYwMDAgPSAxMDAwMG1zICovCi0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkxpbmtTdXBlcnZlcnNpb25UaW1lb3V0ID0gMHgzZTgwOwotCi0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFNUFJvbGUgPSBBTVBfQlRBUF9OT05FOwotCi0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLm1Bc3NvYyA9IGZhbHNlOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iNHdheVN1Y2Nlc3MgPSBmYWxzZTsKLQotCS8qICBSZXNldCBCVCBXUEEgKi8KLQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uS2V5UmVwbGF5Q291bnRlciA9IDA7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJUV1BBQXV0aFN0YXRlID0gU1RBVEVfV1BBX0FVVEhfVU5JTklUSUFMSVpFRDsKLQotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iU2VuZFN1cGVydmlzaW9uUGFja2V0ID0gZmFsc2U7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLk5vUnhQa3RDbnQgPSAwOwotCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5TaG9ydFJhbmdlTW9kZSA9IDA7Ci0JcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLnJ4U3V2cFBrdENudCA9IDA7Ci0KLQlmb3IgKGogPSAwOyBqIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGorKykKLQkJYnRoY2lfUmVzZXRGbG93U3BlYyhwYWRhcHRlciwgRW50cnlOdW0sIGopOwotCi0JcEJ0TWdudC0+QlRBdXRoQ291bnQgPSAwOwotCXBCdE1nbnQtPkJUQXNvY0NvdW50ID0gMDsKLQlwQnRNZ250LT5CVEN1cnJlbnRDb25uZWN0VHlwZSA9IEJUX0RJU0NPTk5FQ1Q7Ci0JcEJ0TWdudC0+QlRSZWNlaXZlQ29ubmVjdFBrdCA9IEJUX0RJU0NPTk5FQ1Q7Ci0KLQlIQUxCVF9SZW1vdmVLZXkocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLX0KLQotc3RhdGljIHZvaWQgYnRoY2lfUmVtb3ZlRW50cnlCeUVudHJ5TnVtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEVudHJ5TnVtKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JYnRoY2lfUmVzZXRFbnRyeShwYWRhcHRlciwgRW50cnlOdW0pOwotCi0JaWYgKHBCdE1nbnQtPkN1cnJlbnRCVENvbm5lY3Rpb25DbnQgPiAwKQotCQlwQnRNZ250LT5DdXJyZW50QlRDb25uZWN0aW9uQ250LS07Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBDdXJyZW50QlRDb25uZWN0aW9uQ250ID0gJWQhIVxuIiwKLQkJcEJ0TWdudC0+Q3VycmVudEJUQ29ubmVjdGlvbkNudCkpOwotCi0JaWYgKHBCdE1nbnQtPkN1cnJlbnRCVENvbm5lY3Rpb25DbnQgPiAwKSB7Ci0JCXBCdE1nbnQtPkJ0T3BlcmF0aW9uT24gPSB0cnVlOwotCX0gZWxzZSB7Ci0JCXBCdE1nbnQtPkJ0T3BlcmF0aW9uT24gPSBmYWxzZTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQnQgT3BlcmF0aW9uIE9GRiEhXG4iKSk7Ci0JfQotCi0JaWYgKCFwQnRNZ250LT5CdE9wZXJhdGlvbk9uKSB7Ci0JCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSURpc2NhcmRBY2xEYXRhVGltZXIpOwotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRCZWFjb25UaW1lcik7Ci0JCXBCdE1nbnQtPmJTdGFydFNlbmRTdXBlcnZpc2lvblBrdCA9IGZhbHNlOwotCX0KLX0KLQotc3RhdGljIHU4Ci1idGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoCi0JdTggKnBidWYsCi0JdTE2CQlPR0YsCi0JdTE2CQlPQ0YsCi0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cwotCSkKLXsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKXBidWY7Ci0JdTggTnVtSENJX0NvbW0gPSAweDE7Ci0KLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9DT01NQU5EX0NPTVBMRVRFOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IE51bUhDSV9Db21tOwkvKiBwYWNrZXQgIyAqLwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsxXSA9IEhDSU9QQ09ERUxPVyhPQ0YsIE9HRik7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzJdID0gSENJT1BDT0RFSElHSFQoT0NGLCBPR0YpOwotCi0JaWYgKE9HRiA9PSBPR0ZfRVhURU5TSU9OKSB7Ci0JCWlmIChPQ0YgPT0gSENJX1NFVF9SU1NJX1ZBTFVFKSB7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UX1BFUklPRElDQUwpLAotCQkJCSgiW0JUIGV2ZW50XSwgQ29tbWFuZENvbXBsZXRlLCBOdW1fSENJX0NvbW0gPSAweCV4LCBPcGNvZGUgPSAweCUwMnglMDJ4LCBzdGF0dXMgPSAweCV4LCBPR0YgPSAweCV4LCBPQ0YgPSAweCV4XG4iLAotCQkJCU51bUhDSV9Db21tLCAoSENJT1BDT0RFSElHSFQoT0NGLCBPR0YpKSwgKEhDSU9QQ09ERUxPVyhPQ0YsIE9HRikpLCBzdGF0dXMsIE9HRiwgT0NGKSk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9FWFQpLAotCQkJCSgiW0JUIGV2ZW50XSwgQ29tbWFuZENvbXBsZXRlLCBOdW1fSENJX0NvbW0gPSAweCV4LCBPcGNvZGUgPSAweCUwMnglMDJ4LCBzdGF0dXMgPSAweCV4LCBPR0YgPSAweCV4LCBPQ0YgPSAweCV4XG4iLAotCQkJCU51bUhDSV9Db21tLCAoSENJT1BDT0RFSElHSFQoT0NGLCBPR0YpKSwgKEhDSU9QQ09ERUxPVyhPQ0YsIE9HRikpLCBzdGF0dXMsIE9HRiwgT0NGKSk7Ci0JCX0KLQl9IGVsc2UgewotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLAotCQkJKCJbQlQgZXZlbnRdLCBDb21tYW5kQ29tcGxldGUsIE51bV9IQ0lfQ29tbSA9IDB4JXgsIE9wY29kZSA9IDB4JTAyeCUwMngsIHN0YXR1cyA9IDB4JXgsIE9HRiA9IDB4JXgsIE9DRiA9IDB4JXhcbiIsCi0JCQlOdW1IQ0lfQ29tbSwgKEhDSU9QQ09ERUhJR0hUKE9DRiwgT0dGKSksIChIQ0lPUENPREVMT1coT0NGLCBPR0YpKSwgc3RhdHVzLCBPR0YsIE9DRikpOwotCX0KLQlyZXR1cm4gMzsKLX0KLQotc3RhdGljIHU4IGJ0aGNpX0V4dGVuc2lvbkV2ZW50SGVhZGVyUnRrKHU4ICpwYnVmLCB1OCBleHRlbnNpb25FdmVudCkKLXsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKXBidWY7Ci0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfRVhURU5TSU9OX1JUSzsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBleHRlbnNpb25FdmVudDsJLyogZXh0ZW5zaW9uIGV2ZW50IGNvZGUgKi8KLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgZW51bSBydF9zdGF0dXMKLWJ0aGNpX0luZGljYXRlRXZlbnQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl2b2lkCQkqcEV2bnREYXRhLAotCXUzMgkJZGF0YUxlbgotCSkKLXsKLQlyZXR1cm4gUGxhdGZvcm1JbmRpY2F0ZUJURXZlbnQocGFkYXB0ZXIsIHBFdm50RGF0YSwgZGF0YUxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudFdyaXRlUmVtb3RlQW1wQXNzb2MoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQllbnVtIGhjaV9zdGF0dXMJc3RhdHVzLAotCXU4IFBMSGFuZGxlCi0JKQotewotCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCVBsYXRmb3JtWmVyb01lbW9yeSgmbG9jYWxCdWZbMF0sIFRtcExvY2FsQnVmU2l6ZSk7Ci0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU1RBVFVTX1BBUkFNRVRFUlMsCi0JCUhDSV9XUklURV9SRU1PVEVfQU1QX0FTU09DLAotCQlzdGF0dXMpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIlBoeUxpbmtIYW5kbGUgPSAweCV4LCBzdGF0dXMgPSAlZFxuIiwgUExIYW5kbGUsIHN0YXR1cykpOwotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JcFJldFBhclsxXSA9IFBMSGFuZGxlOwotCWxlbiArPSAyOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudEVuaGFuY2VkRmx1c2hDb21wbGV0ZSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXUxNgkJCQkJTExICi0JKQotewotCXU4IGxvY2FsQnVmWzRdID0gIiI7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULCAoIkV2ZW50RW5oYW5jZWRGbHVzaENvbXBsZXRlLCBMTEggPSAweCV4XG4iLCBMTEgpKTsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfRU5IQU5DRURfRkxVU0hfQ09NUExFVEU7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAyOwotCS8qIExvZ2ljYWwgbGluayBoYW5kbGUgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBUV09CWVRFX0xPV0JZVEUoTExIKTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBUV09CWVRFX0hJR0hUQllURShMTEgpOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA0KTsKLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX0V2ZW50U2hvcnRSYW5nZU1vZGVDaGFuZ2VDb21wbGV0ZSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCWVudW0gaGNpX3N0YXR1cwkJCQlIY2lTdGF0dXMsCi0JdTggCQlTaG9ydFJhbmdlU3RhdGUsCi0JdTggCQlFbnRyeU51bQotCSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbNV0gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlpZiAoIShwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyICYgRU1QMl9IQ0lfRVZFTlRfU0hPUlRfUkFOR0VfTU9ERV9DSEFOR0VfQ09NUExFVEUpKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwKLQkJCSgiW0JUIGV2ZW50XSwgU2hvcnQgUmFuZ2UgTW9kZSBDaGFuZ2UgQ29tcGxldGUsIElnbm9yZSB0byBzZW5kIHRoaXMgZXZlbnQgZHVlIHRvIGV2ZW50IG1hc2sgcGFnZSAyXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULCAoIltCVCBldmVudF0sIFNob3J0IFJhbmdlIE1vZGUgQ2hhbmdlIENvbXBsZXRlLCBTdGF0dXMgPSAlZFxuICwgUExIID0gMHgleFxuLCBTaG9ydF9SYW5nZV9Nb2RlX1N0YXRlID0gMHgleFxuIiwKLQkJSGNpU3RhdHVzLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlLCBTaG9ydFJhbmdlU3RhdGUpKTsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfU0hPUlRfUkFOR0VfTU9ERV9DSEFOR0VfQ09NUExFVEU7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAzOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IEhjaVN0YXR1czsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsyXSA9IFNob3J0UmFuZ2VTdGF0ZTsKLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDUpOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9FdmVudFNlbmRGbG93U3BlY01vZGlmeUNvbXBsZXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCQkgIGVudW0gaGNpX3N0YXR1cyBIY2lTdGF0dXMsCi0JCQkJCQkgIHUxNiBsb2dpY0hhbmRsZSkKLXsKLQl1OCBsb2NhbEJ1Zls1XSA9ICIiOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0KLQlpZiAoIShwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyICYgRU1QMl9IQ0lfRVZFTlRfRkxPV19TUEVDX01PRElGWV9DT01QTEVURSkpIHsKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwKLQkJCSgiW0JUIGV2ZW50XSwgRmxvdyBTcGVjIE1vZGlmeSBDb21wbGV0ZSwgSWdub3JlIHRvIHNlbmQgdGhpcyBldmVudCBkdWUgdG8gZXZlbnQgbWFzayBwYWdlIDJcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLAotCQkoIltCVCBldmVudF0sIEZsb3cgU3BlYyBNb2RpZnkgQ29tcGxldGUsIHN0YXR1cyA9IDB4JXgsIExMSCA9IDB4JXhcbiIsIEhjaVN0YXR1cywgbG9naWNIYW5kbGUpKTsKLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0ZMT1dfU1BFQ19NT0RJRllfQ09NUExFVEU7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAzOwotCi0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gSGNpU3RhdHVzOwotCS8qIExvZ2ljYWwgbGluayBoYW5kbGUgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBUV09CWVRFX0xPV0JZVEUobG9naWNIYW5kbGUpOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsyXSA9IFRXT0JZVEVfSElHSFRCWVRFKGxvZ2ljSGFuZGxlKTsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudEV4dFdpZmlTY2FuTm90aWZ5KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JdTggCQkJc2NhblR5cGUKLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggbGVuID0gMDsKLQl1OCBsb2NhbEJ1Zls3XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4ICpwdTFUZW1wOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCWlmICghcEJ0TWdudC0+QnRPcGVyYXRpb25PbikKLQkJcmV0dXJuOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9FeHRlbnNpb25FdmVudEhlYWRlclJ0aygmbG9jYWxCdWZbMF0sIEhDSV9FVkVOVF9FWFRfV0lGSV9TQ0FOX05PVElGWSk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcHUxVGVtcCA9ICh1OCAqKSZwUmV0UGFyWzBdOwotCSpwdTFUZW1wID0gc2NhblR5cGU7Ci0JbGVuICs9IDE7Ci0KLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWlmIChidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKSA9PSBSVF9TVEFUVVNfU1VDQ0VTUykgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsICgiW0JUIGV2ZW50XSwgV2lmaSBzY2FuIG5vdGlmeSwgc2NhbiB0eXBlID0gJWRcbiIsCi0JCQlzY2FuVHlwZSkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX0V2ZW50QU1QUmVjZWl2ZXJSZXBvcnQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCBSZWFzb24KLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCi0JaWYgKHBCdEhjaUluZm8tPmJUZXN0TmVlZFJlcG9ydCkgewotCQl1OCBsb2NhbEJ1ZlsyMF0gPSAiIjsKLQkJdTMyCSpwdTRUZW1wOwotCQl1MTYJKnB1MlRlbXA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIiBIQ0lfRVZFTlRfQU1QX1JFQ0VJVkVSX1JFUE9SVFxuIikpOwotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9BTVBfUkVDRUlWRVJfUkVQT1JUOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDI7Ci0KLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gcEJ0SGNpSW5mby0+VGVzdEN0clR5cGU7Ci0KLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gUmVhc29uOwotCi0JCXB1NFRlbXAgPSAodTMyICopJlBQYWNrZXRJcnBFdmVudC0+RGF0YVsyXTsKLQkJKnB1NFRlbXAgPSBwQnRIY2lJbmZvLT5UZXN0RXZlbnRUeXBlOwotCi0JCXB1MlRlbXAgPSAodTE2ICopJlBQYWNrZXRJcnBFdmVudC0+RGF0YVs2XTsKLQkJKnB1MlRlbXAgPSBwQnRIY2lJbmZvLT5UZXN0TnVtT2ZGcmFtZTsKLQotCQlwdTJUZW1wID0gKHUxNiAqKSZQUGFja2V0SXJwRXZlbnQtPkRhdGFbOF07Ci0JCSpwdTJUZW1wID0gcEJ0SGNpSW5mby0+VGVzdE51bU9mRXJyRnJhbWU7Ci0KLQkJcHU0VGVtcCA9ICh1MzIgKikmUFBhY2tldElycEV2ZW50LT5EYXRhWzEwXTsKLQkJKnB1NFRlbXAgPSBwQnRIY2lJbmZvLT5UZXN0TnVtT2ZCaXRzOwotCi0JCXB1NFRlbXAgPSAodTMyICopJlBQYWNrZXRJcnBFdmVudC0+RGF0YVsxNF07Ci0JCSpwdTRUZW1wID0gcEJ0SGNpSW5mby0+VGVzdE51bU9mRXJyQml0czsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDIwKTsKLQotCQkvKiBSZXR1cm4gdG8gSWRlbCBzdGF0ZSB3aXRoIFJYIGFuZCBUWCBvZmYuICovCi0KLQl9Ci0KLQlwQnRIY2lJbmZvLT5UZXN0TnVtT2ZGcmFtZSA9IDB4MDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudENoYW5uZWxTZWxlY3RlZCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXU4IAlFbnRyeU51bQotCSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbM10gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlpZiAoIShwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyICYgRU1QMl9IQ0lfRVZFTlRfQ0hBTk5FTF9TRUxFQ1QpKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwKLQkJCSgiW0JUIGV2ZW50XSwgQ2hhbm5lbCBTZWxlY3RlZCwgSWdub3JlIHRvIHNlbmQgdGhpcyBldmVudCBkdWUgdG8gZXZlbnQgbWFzayBwYWdlIDJcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVHxJT0NUTF9TVEFURSwKLQkJKCJbQlQgZXZlbnRdLCBDaGFubmVsIFNlbGVjdGVkLCBQaHlMaW5rSGFuZGxlICVkXG4iLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlKSk7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0NIQU5ORUxfU0VMRUNUOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gMTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlOwotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgMyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudERpc2Nvbm5lY3RQaHlMaW5rQ29tcGxldGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQllbnVtIGhjaV9zdGF0dXMJCQkJSGNpU3RhdHVzLAotCWVudW0gaGNpX3N0YXR1cwkJCQlSZWFzb24sCi0JdTggCQlFbnRyeU51bQotCSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbNV0gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlpZiAoIShwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyICYgRU1QMl9IQ0lfRVZFTlRfRElTQ09OTkVDVF9QSFlfTElOS19DT01QTEVURSkpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULAotCQkJKCJbQlQgZXZlbnRdLCBEaXNjb25uZWN0IFBoeXNpY2FsIExpbmsgQ29tcGxldGUsIElnbm9yZSB0byBzZW5kIHRoaXMgZXZlbnQgZHVlIHRvIGV2ZW50IG1hc2sgcGFnZSAyXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULAotCQkoIltCVCBldmVudF0sIERpc2Nvbm5lY3QgUGh5c2ljYWwgTGluayBDb21wbGV0ZSwgU3RhdHVzID0gMHgleCwgUExIID0gMHgleCBSZWFzb24gPSAweCV4XG4iLAotCQlIY2lTdGF0dXMsIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUsIFJlYXNvbikpOwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfRElTQ09OTkVDVF9QSFlfTElOS19DT01QTEVURTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDM7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gSGNpU3RhdHVzOwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsxXSA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGU7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzJdID0gUmVhc29uOwotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudFBoeXNpY2FsTGlua0NvbXBsZXRlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JZW51bSBoY2lfc3RhdHVzCQkJCUhjaVN0YXR1cywKLQl1OCAJCUVudHJ5TnVtLAotCXU4IAkJUExIYW5kbGUKLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JdTggbG9jYWxCdWZbNF0gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTggUExfaGFuZGxlOwotCi0JcEJ0TWdudC0+YlBoeUxpbmtJblByb2dyZXNzID0gZmFsc2U7Ci0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZFBoeUxpbmtTdGF0dXMgPSBIY2lTdGF0dXM7Ci0JaWYgKCEocEJ0SGNpSW5mby0+QlRFdmVudE1hc2tQYWdlMiAmIEVNUDJfSENJX0VWRU5UX1BIWV9MSU5LX0NPTVBMRVRFKSkgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsCi0JCQkoIltCVCBldmVudF0sIFBoeXNpY2FsIExpbmsgQ29tcGxldGUsIElnbm9yZSB0byBzZW5kIHRoaXMgZXZlbnQgZHVlIHRvIGV2ZW50IG1hc2sgcGFnZSAyXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoRW50cnlOdW0gPT0gMHhmZikgewotCQkvKiAgY29ubmVjdGlvbiBub3Qgc3RhcnRlZCB5ZXQsIGp1c3QgdXNlIHRoZSBpbnB1dCBwaHlzaWNhbCBsaW5rIGhhbmRsZSB0byByZXNwb25zZS4gKi8KLQkJUExfaGFuZGxlID0gUExIYW5kbGU7Ci0JfSBlbHNlIHsKLQkJLyogIGNvbm5lY3Rpb24gaXMgdW5kZXIgcHJvZ3Jlc3MsIHVzZSB0aGUgcGh5IGxpbmsgaGFuZGxlIHdlIHJlY29yZGVkLiAqLwotCQlQTF9oYW5kbGUgID0gcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZTsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLmJOZWVkUGh5c0xpbmtDb21wbGV0ZUV2ZW50ID0gZmFsc2U7Ci0JfQotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULCAoIltCVCBldmVudF0sIFBoeXNpY2FsIExpbmsgQ29tcGxldGUsIFN0YXR1cyA9IDB4JXggUGh5TGlua0hhbmRsZSA9IDB4JXhcbiIsIEhjaVN0YXR1cywKLQkJUExfaGFuZGxlKSk7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX1BIWV9MSU5LX0NPTVBMRVRFOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gMjsKLQotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IEhjaVN0YXR1czsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBQTF9oYW5kbGU7Ci0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA0KTsKLQotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JdTggCQlPR0YsCi0JdTE2CQkJCQlPQ0YsCi0JZW51bSBoY2lfc3RhdHVzCQkJCUhjaVN0YXR1cwotCSkKLXsKLQotCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXU4IE51bV9IY2lfQ29tbSA9IDB4MTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfRVZFTlQsCi0JCSgiW0JUIGV2ZW50XSwgQ29tbWFuZFN0YXR1cywgT3Bjb2RlID0gMHglMDJ4JTAyeCwgT0dGID0gMHgleCwgIE9DRiA9IDB4JXgsIFN0YXR1cyA9IDB4JXgsIE51bV9IQ0lfQ09NTSA9IDB4JXhcbiIsCi0JCShIQ0lPUENPREVISUdIVChPQ0YsIE9HRikpLCAoSENJT1BDT0RFTE9XKE9DRiwgT0dGKSksIE9HRiwgT0NGLCBIY2lTdGF0dXMsIE51bV9IY2lfQ29tbSkpOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9DT01NQU5EX1NUQVRVUzsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDQ7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gSGNpU3RhdHVzOwkvKiBjdXJyZW50IHBlbmRpbmcgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBOdW1fSGNpX0NvbW07CS8qIHBhY2tldCAjICovCi0JUFBhY2tldElycEV2ZW50LT5EYXRhWzJdID0gSENJT1BDT0RFTE9XKE9DRiwgT0dGKTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbM10gPSBIQ0lPUENPREVISUdIVChPQ0YsIE9HRik7Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDYpOwotCi19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudExvZ2ljYWxMaW5rQ29tcGxldGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQllbnVtIGhjaV9zdGF0dXMJCQkJSGNpU3RhdHVzLAotCXU4IAkJUGh5TGlua0hhbmRsZSwKLQl1MTYJCQkJCUxvZ0xpbmtIYW5kbGUsCi0JdTggCQlMb2dMaW5rSW5kZXgsCi0JdTggCQlFbnRyeU51bQotCSkKLXsKLS8qUE1HTlRfSU5GTyBwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1Zls3XSA9ICIiOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCWlmICghKHBCdEhjaUluZm8tPkJURXZlbnRNYXNrUGFnZTIgJiBFTVAyX0hDSV9FVkVOVF9MT0dJQ0FMX0xJTktfQ09NUExFVEUpKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwKLQkJCSgiW0JUIGV2ZW50XSwgTG9naWNhbCBMaW5rIENvbXBsZXRlLCBJZ25vcmUgdG8gc2VuZCB0aGlzIGV2ZW50IGR1ZSB0byBldmVudCBtYXNrIHBhZ2UgMlxuIikpOwotCQlyZXR1cm47Ci0JfQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwgKCJbQlQgZXZlbnRdLCBMb2dpY2FsIExpbmsgQ29tcGxldGUsIFBoeUxpbmtIYW5kbGUgPSAweCV4LCAgTG9nTGlua0hhbmRsZSA9IDB4JXgsIFN0YXR1cyA9IDB4JXhcbiIsCi0JCVBoeUxpbmtIYW5kbGUsIExvZ0xpbmtIYW5kbGUsIEhjaVN0YXR1cykpOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9MT0dJQ0FMX0xJTktfQ09NUExFVEU7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSA1OwotCi0JUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gSGNpU3RhdHVzOy8qIHN0YXR1cyBjb2RlICovCi0JLyogTG9naWNhbCBsaW5rIGhhbmRsZSAqLwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsxXSA9IFRXT0JZVEVfTE9XQllURShMb2dMaW5rSGFuZGxlKTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMl0gPSBUV09CWVRFX0hJR0hUQllURShMb2dMaW5rSGFuZGxlKTsKLQkvKiBQaHlzaWNhbCBsaW5rIGhhbmRsZSAqLwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVszXSA9IFRXT0JZVEVfTE9XQllURShQaHlMaW5rSGFuZGxlKTsKLQkvKiBjb3JyZXNwb25kaW5nIFR4IGZsb3cgc3BlYyBJRCAqLwotCWlmIChIY2lTdGF0dXMgPT0gSENJX1NUQVRVU19TVUNDRVNTKSB7Ci0JCVBQYWNrZXRJcnBFdmVudC0+RGF0YVs0XSA9Ci0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbTG9nTGlua0luZGV4XS5UeF9GbG93X1NwZWMuSWRlbnRpZmllcjsKLQl9IGVsc2UgewotCQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbNF0gPSAweDA7Ci0JfQotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA3KTsKLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX0V2ZW50RGlzY29ubmVjdExvZ2ljYWxMaW5rQ29tcGxldGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQllbnVtIGhjaV9zdGF0dXMJCQkJSGNpU3RhdHVzLAotCXUxNgkJCQkJTG9nTGlua0hhbmRsZSwKLQllbnVtIGhjaV9zdGF0dXMJCQkJUmVhc29uCi0JKQotewotCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCWlmICghKHBCdEhjaUluZm8tPkJURXZlbnRNYXNrUGFnZTIgJiBFTVAyX0hDSV9FVkVOVF9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DT01QTEVURSkpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULCAoIltCVCBldmVudF0sIERpc2Nvbm5lY3QgTG9naWNhbCBMaW5rIENvbXBsZXRlLCBJZ25vcmUgdG8gc2VuZCB0aGlzIGV2ZW50IGR1ZSB0byBldmVudCBtYXNrIHBhZ2UgMlxuIikpOwotCQlyZXR1cm47Ci0JfQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwgKCJbQlQgZXZlbnRdLCBEaXNjb25uZWN0IExvZ2ljYWwgTGluayBDb21wbGV0ZSwgU3RhdHVzID0gMHgleCwgTExIID0gMHgleCBSZWFzb24gPSAweCV4XG4iLCBIY2lTdGF0dXMsIExvZ0xpbmtIYW5kbGUsIFJlYXNvbikpOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9ESVNDT05ORUNUX0xPR0lDQUxfTElOS19DT01QTEVURTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDQ7Ci0KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBIY2lTdGF0dXM7Ci0JLyogTG9naWNhbCBsaW5rIGhhbmRsZSAqLwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVsxXSA9IFRXT0JZVEVfTE9XQllURShMb2dMaW5rSGFuZGxlKTsKLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMl0gPSBUV09CWVRFX0hJR0hUQllURShMb2dMaW5rSGFuZGxlKTsKLQkvKiBEaXNjb25uZWN0IHJlYXNvbiAqLwotCVBQYWNrZXRJcnBFdmVudC0+RGF0YVszXSA9IFJlYXNvbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNik7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9FdmVudEZsdXNoT2NjdXJyZWQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1MTYJCQkJCUxvZ0xpbmtIYW5kbGUKLQkpCi17Ci0JdTggbG9jYWxCdWZbNF0gPSAiIjsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5ULCAoImJ0aGNpX0V2ZW50Rmx1c2hPY2N1cnJlZCgpLCBMTEggPSAweCV4XG4iLCBMb2dMaW5rSGFuZGxlKSk7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0ZMVVNIX09DQ1JVRUQ7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAyOwotCS8qIExvZ2ljYWwgbGluayBoYW5kbGUgKi8KLQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMF0gPSBUV09CWVRFX0xPV0JZVEUoTG9nTGlua0hhbmRsZSk7Ci0JUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gVFdPQllURV9ISUdIVEJZVEUoTG9nTGlua0hhbmRsZSk7Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDQpOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9CdWlsZFBoeXNpY2FsTGluaygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kLAotCXUxNglPQ0YKLSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQl1OCBFbnRyeU51bSwgUExIOwotCi0JLyogU2VuZCBIQ0kgQ29tbWFuZCBzdGF0dXMgZXZlbnQgdG8gQU1QLiAqLwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCU9DRiwKLQkJCUhDSV9TVEFUVVNfU1VDQ0VTUyk7Ci0KLQlQTEggPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCi0JLyogIENoZWNrIGlmIHJlc291cmNlIG9yIGJ0IGNvbm5lY3Rpb24gaXMgdW5kZXIgcHJvZ3Jlc3MsIGlmIHllcywgcmVqZWN0IHRoZSBsaW5rIGNyZWF0aW9uLiAqLwotCWlmICghYnRoY2lfQWRkRW50cnkocGFkYXB0ZXIpKSB7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OTkVDVF9SSlRfTElNSVRfUkVTT1VSQ0U7Ci0JCWJ0aGNpX0V2ZW50UGh5c2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsIHN0YXR1cywgSU5WQUxJRF9FTlRSWV9OVU0sIFBMSCk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JRW50cnlOdW0gPSBwQnRNZ250LT5DdXJyZW50Q29ubmVjdEVudHJ5TnVtOwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUgPSBQTEg7Ci0JcEJ0TWdudC0+QnRDdXJyZW50UGh5TGlua2hhbmRsZSA9IFBMSDsKLQotCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NmcmFnbWVudCA9PSBOVUxMKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIkNyZWF0ZS9BY2NlcHQgUGh5c2ljYWxMaW5rLCBBTVAgY29udHJvbGxlciBpcyBidXN5XG4iKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OVFJPTExFUl9CVVNZOwotCQlidGhjaV9FdmVudFBoeXNpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLCBzdGF0dXMsIElOVkFMSURfRU5UUllfTlVNLCBQTEgpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qICBSZWNvcmQgS2V5IGFuZCB0aGUgaW5mbyAqLwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleUxlbiA9ICgqKCh1OCAqKXBIY2lDbWQtPkRhdGErMSkpOwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleVR5cGUgPSAoKigodTggKilwSGNpQ21kLT5EYXRhKzIpKTsKLQltZW1jcHkocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5LAotCQkoKCh1OCAqKXBIY2lDbWQtPkRhdGErMykpLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXlMZW4pOwotCW1lbWNweShwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUE1LLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXksIFBNS19MRU4pOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiQnVpbGRQaHlzaWNhbExpbmssIEVudHJ5TnVtID0gJWQsIFBMSCA9IDB4JXggIEtleUxlbiA9IDB4JXgsIEtleVR5cGUgPSAweCV4XG4iLAotCQlFbnRyeU51bSwgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSwKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5TGVuLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRBTVBLZXlUeXBlKSk7Ci0JUlRQUklOVF9EQVRBKEZJT0NUTCwgKElPQ1RMX0JUX0xPR098SU9DVExfQlRfSENJQ01EKSwgKCJCdEFNUEtleVxuIiksIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdEFNUEtleSwKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0QU1QS2V5TGVuKTsKLQlSVFBSSU5UX0RBVEEoRklPQ1RMLCAoSU9DVExfQlRfTE9HT3xJT0NUTF9CVF9IQ0lDTUQpLCAoIlBNS1xuIiksIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QTUssCi0JCVBNS19MRU4pOwotCi0JaWYgKE9DRiA9PSBIQ0lfQ1JFQVRFX1BIWVNJQ0FMX0xJTkspIHsKLQkJLyogVGhlc2UgbWFjcm9zIHJlcXVpcmUgYnJhY2VzICovCi0JCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX0RJU0NPTk5FQ1RFRCwgU1RBVEVfQ01EX0NSRUFURV9QSFlfTElOSywgRW50cnlOdW0pOwotCX0gZWxzZSBpZiAoT0NGID09IEhDSV9BQ0NFUFRfUEhZU0lDQUxfTElOSykgewotCQlCVEhDSV9TTV9XSVRIX0lORk8ocGFkYXB0ZXIsIEhDSV9TVEFURV9ESVNDT05ORUNURUQsIFNUQVRFX0NNRF9BQ0NFUFRfUEhZX0xJTkssIEVudHJ5TnVtKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZAotYnRoY2lfQnVpbGRMb2dpY2FsTGluaygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kLAotCXUxNiBPQ0YKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVGluZm8tPkJ0TWdudDsKLQl1OCBQaHlMaW5rSGFuZGxlLCBFbnRyeU51bTsKLQlzdGF0aWMgdTE2IEFzc2lnbkxvZ0hhbmRsZSA9IDE7Ci0KLQlzdHJ1Y3QgaGNpX2Zsb3dfc3BlYwlUeEZsb3dTcGVjOwotCXN0cnVjdCBoY2lfZmxvd19zcGVjCVJ4Rmxvd1NwZWM7Ci0JdTMyCU1heFNEVVNpemUsIEFycml2ZVRpbWUsIEJhbmR3aWR0aDsKLQotCVBoeUxpbmtIYW5kbGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCi0JRW50cnlOdW0gPSBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0ocGFkYXB0ZXIsIFBoeUxpbmtIYW5kbGUpOwotCi0JbWVtY3B5KCZUeEZsb3dTcGVjLAotCQkmcEhjaUNtZC0+RGF0YVsxXSwgc2l6ZW9mKHN0cnVjdCBoY2lfZmxvd19zcGVjKSk7Ci0JbWVtY3B5KCZSeEZsb3dTcGVjLAotCQkmcEhjaUNtZC0+RGF0YVsxN10sIHNpemVvZihzdHJ1Y3QgaGNpX2Zsb3dfc3BlYykpOwotCi0JTWF4U0RVU2l6ZSA9IFR4Rmxvd1NwZWMuTWF4aW11bVNEVVNpemU7Ci0JQXJyaXZlVGltZSA9IFR4Rmxvd1NwZWMuU0RVSW50ZXJBcnJpdmFsVGltZTsKLQotCWlmIChidGhjaV9DaGVja0xvZ0xpbmtCZWhhdmlvcihwYWRhcHRlciwgVHhGbG93U3BlYykgJiYgYnRoY2lfQ2hlY2tMb2dMaW5rQmVoYXZpb3IocGFkYXB0ZXIsIFJ4Rmxvd1NwZWMpKQotCQlCYW5kd2lkdGggPSBCVFRPVEFMQkFORFdJRFRIOwotCWVsc2UgaWYgKE1heFNEVVNpemUgPT0gMHhmZmZmICYmIEFycml2ZVRpbWUgPT0gMHhmZmZmZmZmZikKLQkJQmFuZHdpZHRoID0gQlRUT1RBTEJBTkRXSURUSDsKLQllbHNlCi0JCUJhbmR3aWR0aCA9IE1heFNEVVNpemUqOCoxMDAwLyhBcnJpdmVUaW1lKzI0NCk7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELAotCQkoIkJ1aWxkTG9naWNhbExpbmssIFBoeUxpbmtIYW5kbGUgPSAweCV4LCBNYXhpbXVtU0RVU2l6ZSA9IDB4JXgsIFNEVUludGVyQXJyaXZhbFRpbWUgPSAweCV4LCBCYW5kd2lkdGggPSAweCV4XG4iLAotCQlQaHlMaW5rSGFuZGxlLCBNYXhTRFVTaXplLCBBcnJpdmVUaW1lLCBCYW5kd2lkdGgpKTsKLQotCWlmIChFbnRyeU51bSA9PSAweGZmKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSW52YWxpZCBQaHlzaWNhbCBMaW5rIGhhbmRsZSA9IDB4JXgsIHN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQsIHJldHVyblxuIiwgUGh5TGlua0hhbmRsZSkpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JCS8qIFdoZW4gd2UgcmVjZWl2ZSBDcmVhdGUvQWNjZXB0IGxvZ2ljYWwgbGluayBjb21tYW5kLCB3ZSBzaG91bGQgc2VuZCBjb21tYW5kIHN0YXR1cyBldmVudCBmaXJzdC4gKi8KLQkJYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKHBhZGFwdGVyLAotCQkJTElOS19DT05UUk9MX0NPTU1BTkRTLAotCQkJT0NGLAotCQkJc3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghcEJ0TWdudC0+YkxvZ0xpbmtJblByb2dyZXNzKSB7Ci0JCWlmIChidGhjaV9QaHlMaW5rQ29ubmVjdGlvbkluUHJvZ3Jlc3MocGFkYXB0ZXIsIFBoeUxpbmtIYW5kbGUpKSB7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlBoeXNpY2FsIGxpbmsgY29ubmVjdGlvbiBpbiBwcm9ncmVzcywgc3RhdHVzID0gSENJX1NUQVRVU19DTURfRElTQUxMT1csIHJldHVyblxuIikpOwotCQkJc3RhdHVzID0gSENJX1NUQVRVU19DTURfRElTQUxMT1c7Ci0KLQkJCXBCdE1nbnQtPmJQaHlMaW5rSW5Qcm9ncmVzc1N0YXJ0TEwgPSB0cnVlOwotCQkJLyogV2hlbiB3ZSByZWNlaXZlIENyZWF0ZS9BY2NlcHQgbG9naWNhbCBsaW5rIGNvbW1hbmQsIHdlIHNob3VsZCBzZW5kIGNvbW1hbmQgc3RhdHVzIGV2ZW50IGZpcnN0LiAqLwotCQkJYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKHBhZGFwdGVyLAotCQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCQlPQ0YsCi0JCQkJc3RhdHVzKTsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKEJhbmR3aWR0aCA+IEJUVE9UQUxCQU5EV0lEVEgpIHsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgic3RhdHVzID0gSENJX1NUQVRVU19RT1NfUkVKRUNULCBCYW5kd2lkdGggPSAweCV4LCByZXR1cm5cbiIsIEJhbmR3aWR0aCkpOwotCQkJc3RhdHVzID0gSENJX1NUQVRVU19RT1NfUkVKRUNUOwotCi0JCQkvKiBXaGVuIHdlIHJlY2VpdmUgQ3JlYXRlL0FjY2VwdCBsb2dpY2FsIGxpbmsgY29tbWFuZCwgd2Ugc2hvdWxkIHNlbmQgY29tbWFuZCBzdGF0dXMgZXZlbnQgZmlyc3QuICovCi0JCQlidGhjaV9FdmVudENvbW1hbmRTdGF0dXMocGFkYXB0ZXIsCi0JCQkJTElOS19DT05UUk9MX0NPTU1BTkRTLAotCQkJCU9DRiwKLQkJCQlzdGF0dXMpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1NcbiIpKTsKLQkJCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQotCQkJLyogV2hlbiB3ZSByZWNlaXZlIENyZWF0ZS9BY2NlcHQgbG9naWNhbCBsaW5rIGNvbW1hbmQsIHdlIHNob3VsZCBzZW5kIGNvbW1hbmQgc3RhdHVzIGV2ZW50IGZpcnN0LiAqLwotCQkJYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKHBhZGFwdGVyLAotCQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCQlPQ0YsCi0JCQkJc3RhdHVzKTsKLQotCQl9Ci0KLQkJaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdEN1cnJlbnRTdGF0ZSAhPSBIQ0lfU1RBVEVfQ09OTkVDVEVEKSB7Ci0JCQlidGhjaV9FdmVudExvZ2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCQkJSENJX1NUQVRVU19DTURfRElTQUxMT1csIDAsIDAsIDAsIEVudHJ5TnVtKTsKLQkJfSBlbHNlIHsKLQkJCXU4IGksIGZpbmQgPSAwOwotCi0JCQlwQnRNZ250LT5iTG9nTGlua0luUHJvZ3Jlc3MgPSB0cnVlOwotCi0JCQkvKiAgZmluZCBhbiB1bnVzZWQgbG9naWNhbCBsaW5rIGluZGV4IGFuZCBjb3B5IHRoZSBkYXRhICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGkrKykgewotCQkJCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlID09IDApIHsKLQkJCQkJZW51bSBoY2lfc3RhdHVzIExvZ0NvbXBFdmVudHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQotCQkJCQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uQnRQaHlMaW5raGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQkJCQkJcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLkJ0TG9nTGlua2hhbmRsZSA9IEFzc2lnbkxvZ0hhbmRsZTsKLQkJCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJCdWlsZExvZ2ljYWxMaW5rLCBFbnRyeU51bSA9ICVkLCBwaHlzaWNhbCBsaW5rIGhhbmRsZSA9IDB4JXgsIGxvZ2ljYWwgbGluayBoYW5kbGUgPSAweCV4XG4iLAotCQkJCQkJRW50cnlOdW0sIHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGUsCi0JCQkJCQkJCSAgcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLkJ0TG9nTGlua2hhbmRsZSkpOwotCQkJCQltZW1jcHkoJnBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5UeF9GbG93X1NwZWMsCi0JCQkJCQkmVHhGbG93U3BlYywgc2l6ZW9mKHN0cnVjdCBoY2lfZmxvd19zcGVjKSk7Ci0JCQkJCW1lbWNweSgmcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLlJ4X0Zsb3dfU3BlYywKLQkJCQkJCSZSeEZsb3dTcGVjLCBzaXplb2Yoc3RydWN0IGhjaV9mbG93X3NwZWMpKTsKLQotCQkJCQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uYkxMQ29tcGxldGVFdmVudElzU2V0ID0gZmFsc2U7Ci0KLQkJCQkJaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5iTExDYW5jZWxDTURJc1NldGFuZENvbXBsZXRlKQotCQkJCQkJTG9nQ29tcEV2ZW50c3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQkJCQkJYnRoY2lfRXZlbnRMb2dpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQkJCQkJTG9nQ29tcEV2ZW50c3RhdHVzLAotCQkJCQkJcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLkJ0UGh5TGlua2hhbmRsZSwKLQkJCQkJCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUsIGksIEVudHJ5TnVtKTsKLQotCQkJCQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uYkxMQ29tcGxldGVFdmVudElzU2V0ID0gdHJ1ZTsKLQotCQkJCQlmaW5kID0gMTsKLQkJCQkJcEJ0TWdudC0+QnRDdXJyZW50TG9nTGlua2hhbmRsZSA9IEFzc2lnbkxvZ0hhbmRsZTsKLQkJCQkJQXNzaWduTG9nSGFuZGxlKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFmaW5kKSB7Ci0JCQkJYnRoY2lfRXZlbnRMb2dpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQkJCQlIQ0lfU1RBVFVTX0NPTk5FQ1RfUkpUX0xJTUlUX1JFU09VUkNFLCAwLCAwLCAwLCBFbnRyeU51bSk7Ci0JCQl9Ci0JCQlwQnRNZ250LT5iTG9nTGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWJ0aGNpX0V2ZW50TG9naWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJCUhDSV9TVEFUVVNfQ09OVFJPTExFUl9CVVNZLCAwLCAwLCAwLCBFbnRyeU51bSk7Ci0JfQotCi19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9TdGFydEJlYWNvbkFuZENvbm5lY3QoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCwKLQl1OCBDdXJyZW50QXNzb2NOdW0KLQkpCi17Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiU3RhcnRCZWFjb25BbmRDb25uZWN0LCBDdXJyZW50QXNzb2NOdW0gPSVkLCBBTVBSb2xlID0lZFxuIiwKLQkJQ3VycmVudEFzc29jTnVtLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFNUFJvbGUpKTsKLQotCWlmICghcEJ0TWdudC0+Q2hlY2tDaG5sSXNTdWl0KSB7Ci0JCWJ0aGNpX0V2ZW50UGh5c2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsIEhDSV9TVEFUVVNfQ09OTkVDVF9SRUpfTk9UX1NVSVRfQ0hOTF9GT1VORCwgQ3VycmVudEFzc29jTnVtLCBJTlZBTElEX1BMX0hBTkRMRSk7Ci0JCWJ0aGNpX1JlbW92ZUVudHJ5QnlFbnRyeU51bShwYWRhcHRlciwgQ3VycmVudEFzc29jTnVtKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfQ1JFQVRPUikgewotCQlzbnByaW50ZigoY2hhciAqKXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQlRTc2lkQnVmLCAzMiwKLQkJCSAiQU1QLSVwTUYiLCBwYWRhcHRlci0+ZWVwcm9tcHJpdi5tYWNfYWRkcik7Ci0JfSBlbHNlIGlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfSk9JTkVSKSB7Ci0JCXNucHJpbnRmKChjaGFyICopcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5CVFNzaWRCdWYsIDMyLAotCQkJICJBTVAtJXBNRiIsIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQlRSZW1vdGVNQUNBZGRyKTsKLQl9Ci0KLQlGaWxsT2N0ZXRTdHJpbmcocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5CVFNzaWQsIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQlRTc2lkQnVmLCAyMSk7Ci0JcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5CVFNzaWQuTGVuZ3RoID0gMjE7Ci0KLQkvKiBUbyBhdm9pZCBzZXQgdGhlIHN0YXJ0IGFwIG9yIGNvbm5lY3QgdHdpY2UsIG9yIHRoZSBvcmlnaW5hbCBjb25uZWN0aW9uIHdpbGwgYmUgZGlzY29ubmVjdGVkLiAqLwotCWlmICghcEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MpIHsKLQkJcEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MgPSB0cnVlOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBCVCBDb25uZWN0IGluIHByb2dyZXNzIE9OISFcbiIpKTsKLQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfU1RBUlRJTkcsIFNUQVRFX0NNRF9NQUNfU1RBUlRfQ09NUExFVEUsIEN1cnJlbnRBc3NvY051bSk7Ci0KLQkJLyogIDIwMTAwMzI1IEpvc2VwaDogQ2hlY2sgUkYgT04vT0ZGLiAqLwotCQkvKiAgSWYgUkYgT0ZGLCBpdCByZXNjaGVkdWxlIGNvbm5lY3Rpbmcgb3BlcmF0aW9uIGFmdGVyIDUwbXMuICovCi0JCWlmICghYnRoY2lfQ2hlY2tSZlN0YXRlQmVmb3JlQ29ubmVjdChwYWRhcHRlcikpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQU1QUm9sZSA9PSBBTVBfQlRBUF9DUkVBVE9SKSB7Ci0JCQkvKiBUaGVzZSBtYWNyb3MgbmVlZCBicmFjZXMgKi8KLQkJCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX0NPTk5FQ1RJTkcsIFNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DT01QTEVURSwgQ3VycmVudEFzc29jTnVtKTsKLQkJfSBlbHNlIGlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfSk9JTkVSKSB7Ci0JCQlidGhjaV9SZXNwb25kZXJTdGFydFRvU2NhbihwYWRhcHRlcik7Ci0JCX0KLQl9Ci0JUlRfUFJJTlRfU1RSKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAgICAgIlN0YXJ0QmVhY29uQW5kQ29ubmVjdCwgU1NJRDpcbiIsCi0JCSAgICAgcEJUSW5mby0+QnRBc29jRW50cnlbcEJ0TWdudC0+Q3VycmVudENvbm5lY3RFbnRyeU51bV0uQlRTc2lkLk9jdGV0LAotCQkgICAgIHBCVEluZm8tPkJ0QXNvY0VudHJ5W3BCdE1nbnQtPkN1cnJlbnRDb25uZWN0RW50cnlOdW1dLkJUU3NpZC5MZW5ndGgpOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9SZXNldEJ0TWdudChzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCkKLXsKLQlwQnRNZ250LT5CdE9wZXJhdGlvbk9uID0gZmFsc2U7Ci0JcEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQlwQnRNZ250LT5iTG9nTGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQlwQnRNZ250LT5iUGh5TGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQlwQnRNZ250LT5iUGh5TGlua0luUHJvZ3Jlc3NTdGFydExMID0gZmFsc2U7Ci0JcEJ0TWdudC0+RGlzY29ubmVjdEVudHJ5TnVtID0gMHhmZjsKLQlwQnRNZ250LT5iU3RhcnRTZW5kU3VwZXJ2aXNpb25Qa3QgPSBmYWxzZTsKLQlwQnRNZ250LT5Kb2luZXJOZWVkU2VuZEF1dGggPSBmYWxzZTsKLQlwQnRNZ250LT5DdXJyZW50QlRDb25uZWN0aW9uQ250ID0gMDsKLQlwQnRNZ250LT5CVEN1cnJlbnRDb25uZWN0VHlwZSA9IEJUX0RJU0NPTk5FQ1Q7Ci0JcEJ0TWdudC0+QlRSZWNlaXZlQ29ubmVjdFBrdCA9IEJUX0RJU0NPTk5FQ1Q7Ci0JcEJ0TWdudC0+QlRBdXRoQ291bnQgPSAwOwotCXBCdE1nbnQtPmJ0TG9nb1Rlc3QgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9SZXNldEJ0SGNpSW5mbyhzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8pCi17Ci0JcEJ0SGNpSW5mby0+QlRFdmVudE1hc2sgPSAwOwotCXBCdEhjaUluZm8tPkJURXZlbnRNYXNrUGFnZTIgPSAwOwotCXBCdEhjaUluZm8tPkNvbm5BY2NlcHRUaW1lb3V0ID0gIDEwMDAwOwotCXBCdEhjaUluZm8tPlBhZ2VUaW1lb3V0ICA9ICAweDMwOwotCXBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluQXdhcmUgPSAweDA7Ci0JcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW4gPSAweDU4NTg7Ci0JcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW5PcHRpb25zID0gMHg1ODsKLQlwQnRIY2lJbmZvLT5Mb2NhdGlvbk9wdGlvbnMgPSAweDA7Ci0JcEJ0SGNpSW5mby0+Rmxvd0NvbnRyb2xNb2RlID0gMHgxOwkvKiAgMDpQYWNrZXQgYmFzZWQgZGF0YSBmbG93IGNvbnRyb2wgbW9kZShCUi9FRFIpLCAxOiBEYXRhIGJsb2NrIGJhc2VkIGRhdGEgZmxvdyBjb250cm9sIG1vZGUoQU1QKS4gKi8KLQotCXBCdEhjaUluZm8tPmVuRmx1c2hfTExIID0gMDsKLQlwQnRIY2lJbmZvLT5GTFRPX0xMSCA9IDA7Ci0KLQkvKiBUZXN0IGNvbW1hbmQgb25seSAqLwotCXBCdEhjaUluZm8tPmJUZXN0SXNFbmQgPSB0cnVlOwotCXBCdEhjaUluZm8tPmJJblRlc3RNb2RlID0gZmFsc2U7Ci0JcEJ0SGNpSW5mby0+YlRlc3ROZWVkUmVwb3J0ID0gZmFsc2U7Ci0JcEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvID0gMHhmZjsKLQlwQnRIY2lJbmZvLT5UZXN0UmVwb3J0SW50ZXJ2YWwgPSAweDAxOwotCXBCdEhjaUluZm8tPlRlc3RDdHJUeXBlID0gMHg1ZDsKLQlwQnRIY2lJbmZvLT5UZXN0RXZlbnRUeXBlID0gMHgwMDsKLQlwQnRIY2lJbmZvLT5UZXN0TnVtT2ZGcmFtZSA9IDA7Ci0JcEJ0SGNpSW5mby0+VGVzdE51bU9mRXJyRnJhbWUgPSAwOwotCXBCdEhjaUluZm8tPlRlc3ROdW1PZkJpdHMgPSAwOwotCXBCdEhjaUluZm8tPlRlc3ROdW1PZkVyckJpdHMgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBidGhjaV9SZXNldEJ0U2VjKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBidF9zZWN1cml0eSAqcEJ0U2VjKQotewotLypQTUdOVF9JTkZPCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0KLQkvKiAgU2V0IEJUIHVzZWQgSFcgb3IgU1cgZW5jcnlwdCAhISAqLwotCWlmIChHRVRfSEFMX0RBVEEocGFkYXB0ZXIpLT5iQlRNb2RlKQotCQlwQnRTZWMtPmJVc2VkSHdFbmNyeXB0ID0gdHJ1ZTsKLQllbHNlCi0JCXBCdFNlYy0+YlVzZWRId0VuY3J5cHQgPSBmYWxzZTsKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6IGJVc2VkSHdFbmNyeXB0ID0lZFxuIiwgX19mdW5jX18sIHBCdFNlYy0+YlVzZWRId0VuY3J5cHQpOwotCi0JcEJ0U2VjLT5SU05JRS5PY3RldCA9IHBCdFNlYy0+UlNOSUVCdWY7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0aGNpX1Jlc2V0QnRFeHRJbmZvKHN0cnVjdCBidF9tZ250ICpwQnRNZ250KQotewotCXU4IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBpKyspIHsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkNvbm5lY3RIYW5kbGUgPSAwOwotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uSW5jb21pbmdUcmFmZmljTW9kZSA9IDA7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5PdXRnb2luZ1RyYWZmaWNNb2RlID0gMDsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUUHJvZmlsZSA9IEJUX1BST0ZJTEVfTk9ORTsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUQ29yZVNwZWMgPSBCVF9TUEVDXzJfMV9FRFI7Ci0JCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVF9SU1NJID0gMDsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLlRyYWZmaWNQcm9maWxlID0gQlRfUFJPRklMRV9OT05FOwotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0ubGlua1JvbGUgPSBCVF9MSU5LX01BU1RFUjsKLQl9Ci0KLQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudENvbm5lY3RIYW5kbGUgPSAwOwotCXBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50SW5jb21pbmdUcmFmZmljTW9kZSA9IDA7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLkN1cnJlbnRPdXRnb2luZ1RyYWZmaWNNb2RlID0gMDsKLQlwQnRNZ250LT5FeHRDb25maWcuTUlOX0JUX1JTU0kgPSAwOwotCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9IDA7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID0gMDsKLQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudEJUU3RhdHVzID0gMDsKLQlwQnRNZ250LT5FeHRDb25maWcuSENJRXh0ZW5zaW9uVmVyID0gMDsKLQotCXBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCA9IGZhbHNlOwotCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gZmFsc2U7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEEyRFBCdXN5ID0gZmFsc2U7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVzZXQoc3RydWN0IHJ0d19hZGFwdGVyICpfcGFkYXB0ZXIsIHU4IGJOZWVkU2VuZEV2ZW50KQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLS8qUE1HTlRfSU5GTyBwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvOwotCXN0cnVjdCBidF9zZWN1cml0eSAqcEJ0U2VjOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZzsKLQl1OCBpOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJidGhjaV9DbWRSZXNldCgpXG4iKSk7Ci0KLQlwYWRhcHRlciA9IEdldERlZmF1bHRBZGFwdGVyKF9wYWRhcHRlcik7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQlwQnRTZWMgPSAmcEJUSW5mby0+QnRTZWM7Ci0JcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCi0JcEJUSW5mby0+cGFkYXB0ZXIgPSBwYWRhcHRlcjsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGkrKykKLQkJYnRoY2lfUmVzZXRFbnRyeShwYWRhcHRlciwgaSk7Ci0KLQlidGhjaV9SZXNldEJ0TWdudChwQnRNZ250KTsKLQlidGhjaV9SZXNldEJ0SGNpSW5mbyhwQnRIY2lJbmZvKTsKLQlidGhjaV9SZXNldEJ0U2VjKHBhZGFwdGVyLCBwQnRTZWMpOwotCi0JcEJ0TWdudC0+QlRDaGFubmVsID0gQlRfRGVmYXVsdF9DaG5sOwotCXBCdE1nbnQtPkNoZWNrQ2hubElzU3VpdCA9IHRydWU7Ci0KLQlwQlRJbmZvLT5CVEJlYWNvblRtck9uID0gZmFsc2U7Ci0KLQlwQnRNZ250LT5iQ3JlYXRlU3Bwb3J0UW9zID0gdHJ1ZTsKLQotCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSURpc2NhcmRBY2xEYXRhVGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEJlYWNvblRpbWVyKTsKLQotCUhBTEJUX1NldFJ0c0N0c05vTGVuTGltaXQocGFkYXB0ZXIpOwotCS8qICAqLwotCS8qICBNYXliZSB3ZSBuZWVkIHRvIHRha2UgY2FyZSBHcm91cCAhPSBBRVMgY2FzZSAhISAqLwotCS8qICBub3cgd2UgUGFpcndpc2UgYW5kIEdyb3VwIGFsbCB1c2VkIEFFUyAhISAqLwotCi0JYnRoY2lfUmVzZXRCdEV4dEluZm8ocEJ0TWdudCk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlpZiAoYk5lZWRTZW5kRXZlbnQpIHsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCQlIQ0lfUkVTRVQsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFdyaXRlUmVtb3RlQU1QQXNzb2MoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCXU4IEN1cnJlbnRBc3NvY051bTsKLQl1OCBQaHlMaW5rSGFuZGxlOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudFdyaXRlUmVtb3RlQW1wQXNzb2MrKzsKLQlQaHlMaW5rSGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQlDdXJyZW50QXNzb2NOdW0gPSBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0ocGFkYXB0ZXIsIFBoeUxpbmtIYW5kbGUpOwotCi0JaWYgKEN1cnJlbnRBc3NvY051bSA9PSAweGZmKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIldyaXRlUmVtb3RlQU1QQXNzb2MsIE5vIHN1Y2ggSGFuZGxlIGluIHRoZSBFbnRyeVxuIikpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCQlidGhjaV9FdmVudFdyaXRlUmVtb3RlQW1wQXNzb2MocGFkYXB0ZXIsIHN0YXR1cywgUGh5TGlua0hhbmRsZSk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NmcmFnbWVudCA9PSBOVUxMKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIldyaXRlUmVtb3RlQU1QQXNzb2MsIEFNUCBjb250cm9sbGVyIGlzIGJ1c3lcbiIpKTsKLQkJc3RhdHVzID0gSENJX1NUQVRVU19DT05UUk9MTEVSX0JVU1k7Ci0JCWJ0aGNpX0V2ZW50V3JpdGVSZW1vdGVBbXBBc3NvYyhwYWRhcHRlciwgc3RhdHVzLCBQaHlMaW5rSGFuZGxlKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSA9IFBoeUxpbmtIYW5kbGU7LyogdTggKilwSGNpQ21kLT5EYXRhKTsgKi8KLQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkxlblNvRmFyID0gKigodTE2ICopKCh1OCAqKXBIY2lDbWQtPkRhdGErMSkpOwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW4gPSAqKCh1MTYgKikoKHU4ICopcEhjaUNtZC0+RGF0YSszKSk7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksICgiV3JpdGVSZW1vdGVBTVBBc3NvYywgTGVuU29GYXIgPSAweCV4LCBBc3NvY1JlbUxlbiA9IDB4JXhcbiIsCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuTGVuU29GYXIsCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW4pKTsKLQotCVJUUFJJTlRfREFUQShGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLAotCQkgICAgICgiV3JpdGVSZW1vdGVBTVBBc3NvYyBmcmFnbWVudCBcbiIpLAotCQkgICAgIHBIY2lDbWQtPkRhdGEsCi0JCSAgICAgcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY1JlbUxlbis1KTsKLQlpZiAoKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NSZW1MZW4pID4gTUFYX0FNUF9BU1NPQ19GUkFHX0xFTikgewotCQltZW1jcHkoKCh1OCAqKXBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRBc3NvY051bV0uQW1wQXNvY0NtZERhdGEuQU1QQXNzb2NmcmFnbWVudCsocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0Zhciooc2l6ZW9mKHU4KSkpKSwKLQkJCSh1OCAqKXBIY2lDbWQtPkRhdGErNSwKLQkJCU1BWF9BTVBfQVNTT0NfRlJBR19MRU4pOwotCX0gZWxzZSB7Ci0JCW1lbWNweSgodTggKikocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY2ZyYWdtZW50KSsocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0Zhciooc2l6ZW9mKHU4KSkpLAotCQkJKCh1OCAqKXBIY2lDbWQtPkRhdGErNSksCi0JCQkocEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEFzc29jTnVtXS5BbXBBc29jQ21kRGF0YS5BTVBBc3NvY1JlbUxlbikpOwotCi0JCVJUUFJJTlRfREFUQShGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAiV3JpdGVSZW1vdGVBTVBBc3NvYyA6XG4iLAotCQkJcEhjaUNtZC0+RGF0YSs1LCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50QXNzb2NOdW1dLkFtcEFzb2NDbWREYXRhLkFNUEFzc29jUmVtTGVuKTsKLQotCQlpZiAoIWJ0aGNpX0dldEFzc29jSW5mbyhwYWRhcHRlciwgQ3VycmVudEFzc29jTnVtKSkKLQkJCXN0YXR1cyA9IEhDSV9TVEFUVVNfSU5WQUxJRF9IQ0lfQ01EX1BBUkFfVkFMVUU7Ci0KLQkJYnRoY2lfRXZlbnRXcml0ZVJlbW90ZUFtcEFzc29jKHBhZGFwdGVyLCBzdGF0dXMsIFBoeUxpbmtIYW5kbGUpOwotCi0JCWJ0aGNpX1N0YXJ0QmVhY29uQW5kQ29ubmVjdChwYWRhcHRlciwgcEhjaUNtZCwgQ3VycmVudEFzc29jTnVtKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiA3LjMuMTMgKi8KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVhZENvbm5lY3Rpb25BY2NlcHRUaW1lb3V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4IGxvY2FsQnVmWzhdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTE2ICpwdTJUZW1wOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJSENJX1JFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsxXTsJCS8qICBDb25uX0FjY2VwdF9UaW1lb3V0ICovCi0JKnB1MlRlbXAgPSBwQnRIY2lJbmZvLT5Db25uQWNjZXB0VGltZW91dDsKLQlsZW4gKz0gMzsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogNy4zLjE0ICovCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXUxNgkqcHUyVGVtcDsKLQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JcHUyVGVtcCA9ICh1MTYgKikmcEhjaUNtZC0+RGF0YVswXTsKLQlwQnRIY2lJbmZvLT5Db25uQWNjZXB0VGltZW91dCA9ICpwdTJUZW1wOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfREVUQUlMLCAoIkNvbm5BY2NlcHRUaW1lb3V0ID0gMHgleCIsCi0JCXBCdEhjaUluZm8tPkNvbm5BY2NlcHRUaW1lb3V0KSk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVCwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JbGVuICs9IDE7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFJlYWRQYWdlVGltZW91dCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXUxNiAqcHUyVGVtcDsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCUhDSV9SRUFEX1BBR0VfVElNRU9VVCwKLQkJc3RhdHVzKTsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUmVhZCBQYWdlVGltZW91dCA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPlBhZ2VUaW1lb3V0KSk7Ci0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzFdOwkJLyogIFBhZ2VfVGltZW91dCAqLwotCSpwdTJUZW1wID0gcEJ0SGNpSW5mby0+UGFnZVRpbWVvdXQ7Ci0JbGVuICs9IDM7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFdyaXRlUGFnZVRpbWVvdXQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTE2CSpwdTJUZW1wOwotCi0JcHUyVGVtcCA9ICh1MTYgKikmcEhjaUNtZC0+RGF0YVswXTsKLQlwQnRIY2lJbmZvLT5QYWdlVGltZW91dCA9ICpwdTJUZW1wOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiV3JpdGUgUGFnZVRpbWVvdXQgPSAweCV4XG4iLAotCQlwQnRIY2lJbmZvLT5QYWdlVGltZW91dCkpOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJCUhDSV9XUklURV9QQUdFX1RJTUVPVVQsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXU4IHBoeXNpY2FsTGlua0hhbmRsZSwgRW50cnlOdW07Ci0KLQlwaHlzaWNhbExpbmtIYW5kbGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCi0JRW50cnlOdW0gPSBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0ocGFkYXB0ZXIsIHBoeXNpY2FsTGlua0hhbmRsZSk7Ci0KLQlpZiAoRW50cnlOdW0gPT0gMHhmZikgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0LCBObyBzdWNoIEhhbmRsZSBpbiB0aGUgRW50cnlcbiIpKTsKLQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlpZiAocEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZSAhPSBwaHlzaWNhbExpbmtIYW5kbGUpCi0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzEwXSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCQl1MTYgKnB1MlRlbXA7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQkJSENJX1JFQURfTElOS19TVVBFUlZJU0lPTl9USU1FT1VULAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwotCQlwUmV0UGFyWzFdID0gcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtDbWREYXRhLkJ0UGh5TGlua2hhbmRsZTsKLQkJcFJldFBhclsyXSA9IDA7Ci0JCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbM107CQkvKiAgQ29ubl9BY2NlcHRfVGltZW91dCAqLwotCQkqcHUyVGVtcCA9IHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5MaW5rU3VwZXJ2ZXJzaW9uVGltZW91dDsKLQkJbGVuICs9IDU7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFdyaXRlTGlua1N1cGVydmlzaW9uVGltZW91dCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1OCBwaHlzaWNhbExpbmtIYW5kbGUsIEVudHJ5TnVtOwotCi0JcGh5c2ljYWxMaW5rSGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQotCUVudHJ5TnVtID0gYnRoY2lfR2V0Q3VycmVudEVudHJ5TnVtKHBhZGFwdGVyLCBwaHlzaWNhbExpbmtIYW5kbGUpOwotCi0JaWYgKEVudHJ5TnVtID09IDB4ZmYpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJXcml0ZUxpbmtTdXBlcnZpc2lvblRpbWVvdXQsIE5vIHN1Y2ggSGFuZGxlIGluIHRoZSBFbnRyeVxuIikpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCX0gZWxzZSB7Ci0JCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlICE9IHBoeXNpY2FsTGlua0hhbmRsZSkgewotCQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQkJfSBlbHNlIHsKLQkJCXBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5MaW5rU3VwZXJ2ZXJzaW9uVGltZW91dCA9ICooKHUxNiAqKSgoKHU4ICopcEhjaUNtZC0+RGF0YSkrMikpOwotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIkJUIFdyaXRlIExpbmtTdXBlcnZlcnNpb25UaW1lb3V0WyVkXSA9IDB4JXhcbiIsCi0JCQkJRW50cnlOdW0sIHBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5MaW5rU3VwZXJ2ZXJzaW9uVGltZW91dCkpOwotCQl9Ci0JfQotCi0JewotCQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJCUhDSV9XUklURV9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0JCXBSZXRQYXJbMV0gPSBwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0NtZERhdGEuQnRQaHlMaW5raGFuZGxlOwotCQlwUmV0UGFyWzJdID0gMDsKLQkJbGVuICs9IDM7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZEVuaGFuY2VkRmx1c2goCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRpbmZvLT5CdEhjaUluZm87Ci0JdTE2CQlsb2dpY0hhbmRsZTsKLQl1OCBQYWNrZXRfVHlwZTsKLQotCWxvZ2ljSGFuZGxlID0gKigodTE2ICopJnBIY2lDbWQtPkRhdGFbMF0pOwotCVBhY2tldF9UeXBlID0gcEhjaUNtZC0+RGF0YVsyXTsKLQotCWlmIChQYWNrZXRfVHlwZSAhPSAwKQotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX0lOVkFMSURfSENJX0NNRF9QQVJBX1ZBTFVFOwotCWVsc2UKLQkJcEJ0SGNpSW5mby0+ZW5GbHVzaF9MTEggPSBsb2dpY0hhbmRsZTsKLQotCWlmIChidGhjaV9EaXNjYXJkVHhQYWNrZXRzKHBhZGFwdGVyLCBwQnRIY2lJbmZvLT5lbkZsdXNoX0xMSCkpCi0JCWJ0aGNpX0V2ZW50Rmx1c2hPY2N1cnJlZChwYWRhcHRlciwgcEJ0SGNpSW5mby0+ZW5GbHVzaF9MTEgpOwotCi0JLyogIHNob3VsZCBzZW5kIGNvbW1hbmQgc3RhdHVzIGV2ZW50ICovCi0JYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKHBhZGFwdGVyLAotCQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCQlIQ0lfRU5IQU5DRURfRkxVU0gsCi0JCQlzdGF0dXMpOwotCi0JaWYgKHBCdEhjaUluZm8tPmVuRmx1c2hfTExIKSB7Ci0JCWJ0aGNpX0V2ZW50RW5oYW5jZWRGbHVzaENvbXBsZXRlKHBhZGFwdGVyLCBwQnRIY2lJbmZvLT5lbkZsdXNoX0xMSCk7Ci0JCXBCdEhjaUluZm8tPmVuRmx1c2hfTExIID0gMDsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRSZWFkTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0KAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4IGxvY2FsQnVmWzhdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTE2ICpwdTJUZW1wOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJSENJX1JFQURfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VULAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0KLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzFdOwkJLyogIENvbm5fQWNjZXB0X1RpbWVvdXQgKi8KLQkqcHUyVGVtcCA9IHBCdEhjaUluZm8tPkxvZ2ljYWxBY2NlcHRUaW1lb3V0OwotCWxlbiArPSAzOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXcml0ZUxvZ2ljYWxMaW5rQWNjZXB0VGltZW91dCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JcEJ0SGNpSW5mby0+TG9naWNhbEFjY2VwdFRpbWVvdXQgPSAqKCh1MTYgKilwSGNpQ21kLT5EYXRhKTsKLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCUhDSV9XUklURV9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVQsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsKLQotCWxlbiArPSAxOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kU2V0RXZlbnRNYXNrKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4ICpwdThUZW1wOwotCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlwdThUZW1wID0gKHU4ICopJnBIY2lDbWQtPkRhdGFbMF07Ci0JcEJ0SGNpSW5mby0+QlRFdmVudE1hc2sgPSAqcHU4VGVtcDsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0RFVEFJTCwgKCJCVEV2ZW50TWFzayA9IDB4JSJpNjRmbXQieFxuIiwKLQkJcEJ0SGNpSW5mby0+QlRFdmVudE1hc2spKTsKLQotCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCUhDSV9TRVRfRVZFTlRfTUFTSywKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JbGVuICs9IDE7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qICA3LjMuNjkgKi8KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFNldEV2ZW50TWFza1BhZ2UyKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4ICpwdThUZW1wOwotCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQlwdThUZW1wID0gKHU4ICopJnBIY2lDbWQtPkRhdGFbMF07Ci0JcEJ0SGNpSW5mby0+QlRFdmVudE1hc2tQYWdlMiA9ICpwdThUZW1wOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJCVEV2ZW50TWFza1BhZ2UyID0gMHglImk2NGZtdCJ4XG4iLAotCQlwQnRIY2lJbmZvLT5CVEV2ZW50TWFza1BhZ2UyKSk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfU0VUX0VWRU5UX01BU0tfUEFHRV8yLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlsZW4gKz0gMTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kUmVhZExvY2F0aW9uRGF0YSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwkJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1ZlsxMl0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgKnB1MlRlbXA7Ci0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfUkVBRF9MT0NBVElPTl9EQVRBLAotCQlzdGF0dXMpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiRG9tYWluQXdhcmUgPSAweCV4XG4iLCBwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbkF3YXJlKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJEb21haW4gPSAweCV4XG4iLCBwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbikpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiRG9tYWluT3B0aW9ucyA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluT3B0aW9ucykpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiT3B0aW9ucyA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPkxvY2F0aW9uT3B0aW9ucykpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0KLQlwUmV0UGFyWzFdID0gcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW5Bd2FyZTsJLyogMHgwOwkgTG9jYXRpb25fRG9tYWluX0F3YXJlICovCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsyXTsJCQkJCS8qICBMb2NhdGlvbl9Eb21haW4gKi8KLQkqcHUyVGVtcCA9IHBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluOwkJLyogMHg1ODU4OyAqLwotCXBSZXRQYXJbNF0gPSBwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbk9wdGlvbnM7CS8qIDB4NTg7CUxvY2F0aW9uX0RvbWFpbl9PcHRpb25zICovCi0JcFJldFBhcls1XSA9IHBCdEhjaUluZm8tPkxvY2F0aW9uT3B0aW9uczsJCS8qIDB4MDsJTG9jYXRpb25fT3B0aW9ucyAqLwotCWxlbiArPSA2OwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kV3JpdGVMb2NhdGlvbkRhdGEoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1MTYJKnB1MlRlbXA7Ci0JdTggbG9jYWxCdWZbNl0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCXBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluQXdhcmUgPSBwSGNpQ21kLT5EYXRhWzBdOwotCXB1MlRlbXAgPSAodTE2ICopJnBIY2lDbWQtPkRhdGFbMV07Ci0JcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW4gPSAqcHUyVGVtcDsKLQlwQnRIY2lJbmZvLT5Mb2NhdGlvbkRvbWFpbk9wdGlvbnMgPSBwSGNpQ21kLT5EYXRhWzNdOwotCXBCdEhjaUluZm8tPkxvY2F0aW9uT3B0aW9ucyA9IHBIY2lDbWQtPkRhdGFbNF07Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJEb21haW5Bd2FyZSA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluQXdhcmUpKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkRvbWFpbiA9IDB4JXhcbiIsIHBCdEhjaUluZm8tPkxvY2F0aW9uRG9tYWluKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJEb21haW5PcHRpb25zID0gMHgleFxuIiwgcEJ0SGNpSW5mby0+TG9jYXRpb25Eb21haW5PcHRpb25zKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJPcHRpb25zID0gMHgleFxuIiwgcEJ0SGNpSW5mby0+TG9jYXRpb25PcHRpb25zKSk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfV1JJVEVfTE9DQVRJT05fREFUQSwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JbGVuICs9IDE7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFJlYWRGbG93Q29udHJvbE1vZGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1Zls3XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJSENJX1JFQURfRkxPV19DT05UUk9MX01PREUsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsKLQlwUmV0UGFyWzFdID0gcEJ0SGNpSW5mby0+Rmxvd0NvbnRyb2xNb2RlOwkvKiAgRmxvdyBDb250cm9sIE1vZGUgKi8KLQlsZW4gKz0gMjsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFdyaXRlRmxvd0NvbnRyb2xNb2RlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0JdTggbG9jYWxCdWZbNl0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCXBCdEhjaUluZm8tPkZsb3dDb250cm9sTW9kZSA9IHBIY2lDbWQtPkRhdGFbMF07Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQlIQ0lfV1JJVEVfRkxPV19DT05UUk9MX01PREUsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCWxlbiArPSAxOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRSZWFkQmVzdEVmZm9ydEZsdXNoVGltZW91dCgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1MTYgaSwgaiwgbG9naWNIYW5kbGU7Ci0JdTMyIEJlc3RFZmZvcnRGbHVzaFRpbWVvdXQgPSAweGZmZmZmZmZmOwotCXU4IGZpbmQgPSAwOwotCi0JbG9naWNIYW5kbGUgPSAqKCh1MTYgKilwSGNpQ21kLT5EYXRhKTsKLQkvKiAgZmluZCBhbiBtYXRjaGVkIGxvZ2ljYWwgbGluayBpbmRleCBhbmQgY29weSB0aGUgZGF0YSAqLwotCWZvciAoaiA9IDA7IGogPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGorKykgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGkrKykgewotCQkJaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W2pdLkxvZ0xpbmtDbWREYXRhW2ldLkJ0TG9nTGlua2hhbmRsZSA9PSBsb2dpY0hhbmRsZSkgewotCQkJCUJlc3RFZmZvcnRGbHVzaFRpbWVvdXQgPSBwQlRpbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5CZXN0RWZmb3J0Rmx1c2hUaW1lb3V0OwotCQkJCWZpbmQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCFmaW5kKQotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JewotCQl1OCBsb2NhbEJ1ZlsxMF0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQkJdTMyICpwdTRUZW1wOwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORCwKLQkJCUhDSV9SRUFEX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVQsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0JCXB1NFRlbXAgPSAodTMyICopJnBSZXRQYXJbMV07CS8qICBCZXN0X0VmZm9ydF9GbHVzaF9UaW1lb3V0ICovCi0JCSpwdTRUZW1wID0gQmVzdEVmZm9ydEZsdXNoVGltZW91dDsKLQkJbGVuICs9IDU7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXcml0ZUJlc3RFZmZvcnRGbHVzaFRpbWVvdXQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVGluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JdTE2IGksIGosIGxvZ2ljSGFuZGxlOwotCXUzMiBCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0ID0gMHhmZmZmZmZmZjsKLQl1OCBmaW5kID0gMDsKLQotCWxvZ2ljSGFuZGxlID0gKigodTE2ICopcEhjaUNtZC0+RGF0YSk7Ci0JQmVzdEVmZm9ydEZsdXNoVGltZW91dCA9ICooKHUzMiAqKShwSGNpQ21kLT5EYXRhKzEpKTsKLQotCS8qICBmaW5kIGFuIG1hdGNoZWQgbG9naWNhbCBsaW5rIGluZGV4IGFuZCBjb3B5IHRoZSBkYXRhICovCi0JZm9yIChqID0gMDsgaiA8IE1BWF9CVF9BU09DX0VOVFJZX05VTTsgaisrKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9HSUNBTF9MSU5LX05VTTsgaSsrKSB7Ci0JCQlpZiAocEJUaW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlID09IGxvZ2ljSGFuZGxlKSB7Ci0JCQkJcEJUaW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uQmVzdEVmZm9ydEZsdXNoVGltZW91dCA9IEJlc3RFZmZvcnRGbHVzaFRpbWVvdXQ7Ci0JCQkJZmluZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoIWZpbmQpCi0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQkJSENJX1dSSVRFX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVQsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7Ci0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kU2hvcnRSYW5nZU1vZGUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JdTggUGh5TGlua0hhbmRsZSwgRW50cnlOdW0sIFNob3J0UmFuZ2VNb2RlOwotCi0JUGh5TGlua0hhbmRsZSA9IHBIY2lDbWQtPkRhdGFbMF07Ci0JU2hvcnRSYW5nZU1vZGUgPSBwSGNpQ21kLT5EYXRhWzFdOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUExIID0gMHgleCwgU2hvcnRfUmFuZ2VfTW9kZSA9IDB4JXhcbiIsIFBoeUxpbmtIYW5kbGUsIFNob3J0UmFuZ2VNb2RlKSk7Ci0KLQlFbnRyeU51bSA9IGJ0aGNpX0dldEN1cnJlbnRFbnRyeU51bShwYWRhcHRlciwgUGh5TGlua0hhbmRsZSk7Ci0JaWYgKEVudHJ5TnVtICE9IDB4ZmYpIHsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlNob3J0UmFuZ2VNb2RlID0gU2hvcnRSYW5nZU1vZGU7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJObyBzdWNoIFBMSCgweCV4KVxuIiwgUGh5TGlua0hhbmRsZSkpOwotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCX0KLQotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCU9HRl9TRVRfRVZFTlRfTUFTS19DT01NQU5ELAotCQkJSENJX1NIT1JUX1JBTkdFX01PREUsCi0JCQlzdGF0dXMpOwotCi0JYnRoY2lfRXZlbnRTaG9ydFJhbmdlTW9kZUNoYW5nZUNvbXBsZXRlKHBhZGFwdGVyLCBzdGF0dXMsIFNob3J0UmFuZ2VNb2RlLCBFbnRyeU51bSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzIGJ0aGNpX0NtZFJlYWRMb2NhbFN1cHBvcnRlZENvbW1hbmRzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXIsICpwU3VwcG9ydGVkQ21kczsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCS8qICBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQbGF0Zm9ybVplcm9NZW1vcnkoJmxvY2FsQnVmWzBdLCBUbXBMb2NhbEJ1ZlNpemUpOwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX0lORk9STUFUSU9OQUxfUEFSQU1FVEVSUywKLQkJSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0NPTU1BTkRTLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlsZW4gKz0gMTsKLQlwU3VwcG9ydGVkQ21kcyA9ICZwUmV0UGFyWzFdOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzVdPSAweGMwXG5CaXQgWzZdPSBTZXQgRXZlbnQgTWFzaywgWzddPSBSZXNldFxuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzVdID0gMHhjMDsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFs2XT0gMHgwMVxuQml0IFswXT0gU2V0IEV2ZW50IEZpbHRlclxuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzZdID0gMHgwMTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFs3XT0gMHgwY1xuQml0IFsyXT0gUmVhZCBDb25uZWN0aW9uIEFjY2VwdCBUaW1lb3V0LCBbM109IFdyaXRlIENvbm5lY3Rpb24gQWNjZXB0IFRpbWVvdXRcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1s3XSA9IDB4MGM7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiT2N0ZXRbMTBdPSAweDgwXG5CaXQgWzddPSBIb3N0IE51bWJlciBPZiBDb21wbGV0ZWQgUGFja2V0c1xuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzEwXSA9IDB4ODA7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiT2N0ZXRbMTFdPSAweDAzXG5CaXQgWzBdPSBSZWFkIExpbmsgU3VwZXJ2aXNpb24gVGltZW91dCwgWzFdPSBXcml0ZSBMaW5rIFN1cGVydmlzaW9uIFRpbWVvdXRcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1sxMV0gPSAweDAzOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzE0XT0gMHhhOFxuQml0IFszXT0gUmVhZCBMb2NhbCBWZXJzaW9uIEluZm9ybWF0aW9uLCBbNV09IFJlYWQgTG9jYWwgU3VwcG9ydGVkIEZlYXR1cmVzLCBbN109IFJlYWQgQnVmZmVyIFNpemVcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1sxNF0gPSAweGE4OwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzE1XT0gMHgxY1xuQml0IFsyXT0gUmVhZCBGYWlsZWQgQ29udGFjdCBDb3VudCwgWzNdPSBSZXNldCBGYWlsZWQgQ29udGFjdCBDb3VudCwgWzRdPSBHZXQgTGluayBRdWFsaXR5XG4iKSk7Ci0JcFN1cHBvcnRlZENtZHNbMTVdID0gMHgxYzsKLQkvKiBwU3VwcG9ydGVkQ21kc1sxNl0gPSAweDA0OyAqLwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzE5XT0gMHg0MFxuQml0IFs2XT0gRW5oYW5jZWQgRmx1c2hcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1sxOV0gPSAweDQwOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzIxXT0gMHhmZlxuQml0IFswXT0gQ3JlYXRlIFBoeXNpY2FsIExpbmssIFsxXT0gQWNjZXB0IFBoeXNpY2FsIExpbmssIFsyXT0gRGlzY29ubmVjdCBQaHlzaWNhbCBMaW5rLCBbM109IENyZWF0ZSBMb2dpY2FsIExpbmtcbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCIJWzRdPSBBY2NlcHQgTG9naWNhbCBMaW5rLCBbNV09IERpc2Nvbm5lY3QgTG9naWNhbCBMaW5rLCBbNl09IExvZ2ljYWwgTGluayBDYW5jZWwsIFs3XT0gRmxvdyBTcGVjIE1vZGlmeVxuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzIxXSA9IDB4ZmY7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTUR8SU9DVExfQlRfTE9HTyksICgiT2N0ZXRbMjJdPSAweGZmXG5CaXQgWzBdPSBSZWFkIExvZ2ljYWwgTGluayBBY2NlcHQgVGltZW91dCwgWzFdPSBXcml0ZSBMb2dpY2FsIExpbmsgQWNjZXB0IFRpbWVvdXQsIFsyXT0gU2V0IEV2ZW50IE1hc2sgUGFnZSAyLCBbM109IFJlYWQgTG9jYXRpb24gRGF0YVxuIikpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIglbNF09IFdyaXRlIExvY2F0aW9uIERhdGEsIFs1XT0gUmVhZCBMb2NhbCBBTVAgSW5mbywgWzZdPSBSZWFkIExvY2FsIEFNUF9BU1NPQywgWzddPSBXcml0ZSBSZW1vdGUgQU1QX0FTU09DXG4iKSk7Ci0JcFN1cHBvcnRlZENtZHNbMjJdID0gMHhmZjsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRHxJT0NUTF9CVF9MT0dPKSwgKCJPY3RldFsyM109IDB4MDdcbkJpdCBbMF09IFJlYWQgRmxvdyBDb250cm9sIE1vZGUsIFsxXT0gV3JpdGUgRmxvdyBDb250cm9sIE1vZGUsIFsyXT0gUmVhZCBEYXRhIEJsb2NrIFNpemVcbiIpKTsKLQlwU3VwcG9ydGVkQ21kc1syM10gPSAweDA3OwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EfElPQ1RMX0JUX0xPR08pLCAoIk9jdGV0WzI0XT0gMHgxY1xuQml0IFsyXT0gUmVhZCBCZXN0IEVmZm9ydCBGbHVzaCBUaW1lb3V0LCBbM109IFdyaXRlIEJlc3QgRWZmb3J0IEZsdXNoIFRpbWVvdXQsIFs0XT0gU2hvcnQgUmFuZ2UgTW9kZVxuIikpOwotCXBTdXBwb3J0ZWRDbWRzWzI0XSA9IDB4MWM7Ci0JbGVuICs9IDY0OwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzIGJ0aGNpX0NtZFJlYWRMb2NhbFN1cHBvcnRlZEZlYXR1cmVzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQlQbGF0Zm9ybVplcm9NZW1vcnkoJmxvY2FsQnVmWzBdLCBUbXBMb2NhbEJ1ZlNpemUpOwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX0lORk9STUFUSU9OQUxfUEFSQU1FVEVSUywKLQkJSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0ZFQVRVUkVTLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlsZW4gKz0gOTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVhZExvY2FsQU1QQXNzb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQl1OCBQaHlMaW5rSGFuZGxlLCBFbnRyeU51bTsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRSZWFkTG9jYWxBbXBBc3NvYysrOwotCVBoeUxpbmtIYW5kbGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCUVudHJ5TnVtID0gYnRoY2lfR2V0Q3VycmVudEVudHJ5TnVtKHBhZGFwdGVyLCBQaHlMaW5rSGFuZGxlKTsKLQotCWlmICgoRW50cnlOdW0gPT0gMHhmZikgJiYgUGh5TGlua0hhbmRsZSAhPSAwKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUmVhZExvY2FsQU1QQXNzb2MsIEVudHJ5TnVtID0gJWQgICEhISEhLCBwaHlzaWNhbCBsaW5rIGhhbmRsZSA9IDB4JXhcbiIsCi0JCUVudHJ5TnVtLCBQaHlMaW5rSGFuZGxlKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JfSBlbHNlIGlmIChwQnRNZ250LT5iUGh5TGlua0luUHJvZ3Jlc3NTdGFydExMKSB7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JCXBCdE1nbnQtPmJQaHlMaW5rSW5Qcm9ncmVzc1N0YXJ0TEwgPSBmYWxzZTsKLQl9IGVsc2UgewotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuQnRQaHlMaW5raGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFtcEFzb2NDbWREYXRhLkxlblNvRmFyID0gKigodTE2ICopKCh1OCAqKXBIY2lDbWQtPkRhdGErMSkpOwotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQW1wQXNvY0NtZERhdGEuTWF4UmVtb3RlQVNTT0NMZW4gPSAqKCh1MTYgKikoKHU4ICopcEhjaUNtZC0+RGF0YSszKSk7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfREVUQUlMLCAoIlJlYWRMb2NhbEFNUEFzc29jLCBMZW5Tb0ZhciA9JWQsIE1heFJlbW90ZUFTU09DTGVuID0lZFxuIiwKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhciwKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5NYXhSZW1vdGVBU1NPQ0xlbikpOwotCX0KLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUmVhZExvY2FsQU1QQXNzb2MsIEVudHJ5TnVtID0gJWQgICEhISEhLCBwaHlzaWNhbCBsaW5rIGhhbmRsZSA9IDB4JXgsIExlbmd0aFNvRmFyID0gJXggIFxuIiwKLQkJRW50cnlOdW0sIFBoeUxpbmtIYW5kbGUsIHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BbXBBc29jQ21kRGF0YS5MZW5Tb0ZhcikpOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JewotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJLyogUFZPSUQgYnVmZmVyID0gcGFkYXB0ZXItPklycEhDSUxvY2FsYnVmLlB0cjsgKi8KLQkJdTggbG9jYWxCdWZbVG1wTG9jYWxCdWZTaXplXSA9ICIiOwotCQl1MTYJKnBSZW1haW5MZW47Ci0JCXUzMgl0b3RhbExlbiA9IDA7Ci0JCXUxNgl0eXBlTGVuID0gMCwgcmVtYWluTGVuID0gMCwgcmV0X2luZGV4ID0gMDsKLQkJdTggKnBSZXRQYXI7Ci0KLQkJUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQkJLyogUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoYnVmZmVyKTsgKi8KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQl0b3RhbExlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1NUQVRVU19QQVJBTUVURVJTLAotCQkJSENJX1JFQURfTE9DQUxfQU1QX0FTU09DLAotCQkJc3RhdHVzKTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJSZWFkTG9jYWxBTVBBc3NvYywgUmVtYWluaW5nX0xlbiA9JWQgIFxuIiwgcmVtYWluTGVuKSk7Ci0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW3RvdGFsTGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCQlwUmV0UGFyWzFdID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQkJcFJlbWFpbkxlbiA9ICh1MTYgKikmcFJldFBhclsyXTsJLyogQU1QX0FTU09DX1JlbWFpbmluZ19MZW5ndGggKi8KLQkJdG90YWxMZW4gKz0gNDsJLyogMF1+WzNdICovCi0JCXJldF9pbmRleCA9IDQ7Ci0KLQkJdHlwZUxlbiA9IGJ0aGNpX0Fzc29jTUFDQWRkcihwYWRhcHRlciwgJnBSZXRQYXJbcmV0X2luZGV4XSk7Ci0JCXRvdGFsTGVuICs9IHR5cGVMZW47Ci0JCXJlbWFpbkxlbiArPSB0eXBlTGVuOwotCQlyZXRfaW5kZXggKz0gdHlwZUxlbjsKLQkJdHlwZUxlbiA9IGJ0aGNpX0Fzc29jUHJlZmVycmVkQ2hhbm5lbExpc3QocGFkYXB0ZXIsICZwUmV0UGFyW3JldF9pbmRleF0sIEVudHJ5TnVtKTsKLQkJdG90YWxMZW4gKz0gdHlwZUxlbjsKLQkJcmVtYWluTGVuICs9IHR5cGVMZW47Ci0JCXJldF9pbmRleCArPSB0eXBlTGVuOwotCQl0eXBlTGVuID0gYnRoY2lfUEFMQ2FwYWJpbGl0aWVzKHBhZGFwdGVyLCAmcFJldFBhcltyZXRfaW5kZXhdKTsKLQkJdG90YWxMZW4gKz0gdHlwZUxlbjsKLQkJcmVtYWluTGVuICs9IHR5cGVMZW47Ci0JCXJldF9pbmRleCArPSB0eXBlTGVuOwotCQl0eXBlTGVuID0gYnRoY2lfQXNzb2NQQUxWZXIocGFkYXB0ZXIsICZwUmV0UGFyW3JldF9pbmRleF0pOwotCQl0b3RhbExlbiArPSB0eXBlTGVuOwotCQlyZW1haW5MZW4gKz0gdHlwZUxlbjsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAodTgpdG90YWxMZW47Ci0JCSpwUmVtYWluTGVuID0gcmVtYWluTGVuOwkvKiAgQU1QX0FTU09DX1JlbWFpbmluZ19MZW5ndGggKi8KLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJSZWFkTG9jYWxBTVBBc3NvYywgUmVtYWluaW5nX0xlbiA9JWQgIFxuIiwgcmVtYWluTGVuKSk7Ci0JCVJUUFJJTlRfREFUQShGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAoIkFNUF9BU1NPQ19mcmFnbWVudCA6IFxuIiksIFBQYWNrZXRJcnBFdmVudC0+RGF0YSwgdG90YWxMZW4pOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgdG90YWxMZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cyBidGhjaV9DbWRSZWFkRmFpbGVkQ29udGFjdENvdW50ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICAgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCi0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgaGFuZGxlOwotCi0JaGFuZGxlID0gKigodTE2ICopcEhjaUNtZC0+RGF0YSk7Ci0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9TVEFUVVNfUEFSQU1FVEVSUywKLQkJSENJX1JFQURfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUiwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JcFJldFBhclsxXSA9IFRXT0JZVEVfTE9XQllURShoYW5kbGUpOwotCXBSZXRQYXJbMl0gPSBUV09CWVRFX0hJR0hUQllURShoYW5kbGUpOwotCXBSZXRQYXJbM10gPSBUV09CWVRFX0xPV0JZVEUocEJ0SGNpSW5mby0+RmFpbENvbnRhY3RDb3VudCk7Ci0JcFJldFBhcls0XSA9IFRXT0JZVEVfSElHSFRCWVRFKHBCdEhjaUluZm8tPkZhaWxDb250YWN0Q291bnQpOwotCWxlbiArPSA1OwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRSZXNldEZhaWxlZENvbnRhY3RDb3VudGVyKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCXUxNgkJaGFuZGxlOwotCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCWhhbmRsZSA9ICooKHUxNiAqKXBIY2lDbWQtPkRhdGEpOwotCXBCdEhjaUluZm8tPkZhaWxDb250YWN0Q291bnQgPSAwOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQkvKiBQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKShidWZmZXIpOyAqLwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NUQVRVU19QQVJBTUVURVJTLAotCQlIQ0lfUkVTRVRfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUiwKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JcFJldFBhclsxXSA9IFRXT0JZVEVfTE9XQllURShoYW5kbGUpOwotCXBSZXRQYXJbMl0gPSBUV09CWVRFX0hJR0hUQllURShoYW5kbGUpOwotCWxlbiArPSAzOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogICovCi0vKiAgQlQgMy4wK0hTIFtWb2wgMl0gNy40LjEgKi8KLS8qICAqLwotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kUmVhZExvY2FsVmVyc2lvbkluZm9ybWF0aW9uKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXI7Ci0JdTggbGVuID0gMDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTE2ICpwdTJUZW1wOwotCi0JUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9JTkZPUk1BVElPTkFMX1BBUkFNRVRFUlMsCi0JCUhDSV9SRUFEX0xPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT04sCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCXBSZXRQYXJbMV0gPSAweDA1OwkJCS8qICBIQ0lfVmVyc2lvbiAqLwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbMl07CQkvKiAgSENJX1JldmlzaW9uICovCi0JKnB1MlRlbXAgPSAweDAwMDE7Ci0JcFJldFBhcls0XSA9IDB4MDU7CQkJLyogIExNUC9QQUxfVmVyc2lvbiAqLwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbNV07CQkvKiAgTWFudWZhY3R1cmVyX05hbWUgKi8KLQkqcHUyVGVtcCA9IDB4MDA1ZDsKLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzddOwkJLyogIExNUC9QQUxfU3VidmVyc2lvbiAqLwotCSpwdTJUZW1wID0gMHgwMDAxOwotCWxlbiArPSA5OwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAoIkxPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT05cbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksICgiU3RhdHVzICAleFxuIiwgc3RhdHVzKSk7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAoIkhDSV9WZXJzaW9uID0gMHgwNVxuIikpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJIQ0lfUmV2aXNpb24gPSAweDAwMDFcbiIpKTsKLQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0hDSUNNRF9ERVRBSUx8SU9DVExfQlRfTE9HTyksICgiTE1QL1BBTF9WZXJzaW9uID0gMHgwNVxuIikpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJNYW51ZmFjdHVyZXJfTmFtZSA9IDB4MDAwMVxuIikpOwotCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgKCJMTVAvUEFMX1N1YnZlcnNpb24gPSAweDAwMDFcbiIpKTsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyogNy40LjcgKi8KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVhZERhdGFCbG9ja1NpemUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQllbnVtIGhjaV9zdGF0dXMJCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0JdTggbG9jYWxCdWZbVG1wTG9jYWxCdWZTaXplXSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXUxNiAqcHUyVGVtcDsKLQotCVBsYXRmb3JtWmVyb01lbW9yeSgmbG9jYWxCdWZbMF0sIFRtcExvY2FsQnVmU2l6ZSk7Ci0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfSU5GT1JNQVRJT05BTF9QQVJBTUVURVJTLAotCQlIQ0lfUkVBRF9EQVRBX0JMT0NLX1NJWkUsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsJLyogc3RhdHVzICovCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsxXTsJCS8qICBNYXhfQUNMX0RhdGFfUGFja2V0X0xlbmd0aCAqLwotCSpwdTJUZW1wID0gTWF4ODAyMTFQQUxQRFVTaXplOwotCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclszXTsJCS8qICBEYXRhX0Jsb2NrX0xlbmd0aCAqLwotCSpwdTJUZW1wID0gTWF4ODAyMTFQQUxQRFVTaXplOwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbNV07CQkvKiAgVG90YWxfTnVtX0RhdGFfQmxvY2tzICovCi0JKnB1MlRlbXAgPSBCVFRvdGFsRGF0YUJsb2NrTnVtOwotCWxlbiArPSA3OwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKiAgNy40LjUgKi8KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVhZEJ1ZmZlclNpemUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgKnB1MlRlbXA7Ci0KLQlQbGF0Zm9ybVplcm9NZW1vcnkoJmxvY2FsQnVmWzBdLCBUbXBMb2NhbEJ1ZlNpemUpOwotCS8qIFBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKGJ1ZmZlcik7ICovCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQlPR0ZfSU5GT1JNQVRJT05BTF9QQVJBTUVURVJTLAotCQlIQ0lfUkVBRF9CVUZGRVJfU0laRSwKLQkJc3RhdHVzKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIlN5bmNocm9ub3VzX0RhdGFfUGFja2V0X0xlbmd0aCA9IDB4JXhcbiIsIEJUU3luRGF0YVBhY2tldExlbmd0aCkpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiVG90YWxfTnVtX0FDTF9EYXRhX1BhY2tldHMgPSAweCV4XG4iLCBCVFRvdGFsRGF0YUJsb2NrTnVtKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJUb3RhbF9OdW1fU3luY2hyb25vdXNfRGF0YV9QYWNrZXRzID0gMHgleFxuIiwgQlRUb3RhbERhdGFCbG9ja051bSkpOwotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsxXTsJCS8qICBIQ19BQ0xfRGF0YV9QYWNrZXRfTGVuZ3RoICovCi0JKnB1MlRlbXAgPSBNYXg4MDIxMVBBTFBEVVNpemU7Ci0KLQlwUmV0UGFyWzNdID0gQlRTeW5EYXRhUGFja2V0TGVuZ3RoOwkvKiAgSENfU3luY2hyb25vdXNfRGF0YV9QYWNrZXRfTGVuZ3RoICovCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhcls0XTsJCS8qICBIQ19Ub3RhbF9OdW1fQUNMX0RhdGFfUGFja2V0cyAqLwotCSpwdTJUZW1wID0gQlRUb3RhbERhdGFCbG9ja051bTsKLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzZdOwkJLyogIEhDX1RvdGFsX051bV9TeW5jaHJvbm91c19EYXRhX1BhY2tldHMgKi8KLQkqcHUyVGVtcCA9IEJUVG90YWxEYXRhQmxvY2tOdW07Ci0JbGVuICs9IDg7Ci0JUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMgYnRoY2lfQ21kUmVhZExvY2FsQU1QSW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWVudW0gaGNpX3N0YXR1cwlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHB3cmN0cmwgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCXU4IGxvY2FsQnVmW1RtcExvY2FsQnVmU2l6ZV0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQl1MTYgKnB1MlRlbXA7Ci0JdTMyICpwdTRUZW1wOwotCXUzMglUb3RhbEJhbmR3aWR0aCA9IEJUVE9UQUxCQU5EV0lEVEgsIE1heEJhbmRHVUJhbmR3aWR0aCA9IEJUTUFYQkFOREdVQkFORFdJRFRIOwotCXU4IENvbnRyb2xUeXBlID0gMHgwMSwgQW1wU3RhdHVzID0gMHgwMTsKLQl1MzIJTWF4Rmx1c2hUaW1lb3V0ID0gMTAwMDAsIEJlc3RFZmZvcnRGbHVzaFRpbWVvdXQgPSA1MDAwOwotCXUxNiBNYXhQRFVTaXplID0gTWF4ODAyMTFQQUxQRFVTaXplLCBQYWxDYXAgPSAweDEsIEFtcEFzc29jTGVuID0gTWF4ODAyMTFBTVBBU1NPQ0xlbiwgTWluTGF0ZW5jeSA9IDIwOwotCi0JaWYgKChwcHdyY3RybC0+cmZvZmZfcmVhc29uICYgUkZfQ0hBTkdFX0JZX0hXKSB8fAotCSAgICAocHB3cmN0cmwtPnJmb2ZmX3JlYXNvbiAmIFJGX0NIQU5HRV9CWV9TVykpIHsKLQkJQW1wU3RhdHVzID0gQU1QX1NUQVRVU19OT19DQVBBQ0lUWV9GT1JfQlQ7Ci0JfQotCi0JUGxhdGZvcm1aZXJvTWVtb3J5KCZsb2NhbEJ1ZlswXSwgVG1wTG9jYWxCdWZTaXplKTsKLQkvKiBQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKShidWZmZXIpOyAqLwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NUQVRVU19QQVJBTUVURVJTLAotCQlIQ0lfUkVBRF9MT0NBTF9BTVBfSU5GTywKLQkJc3RhdHVzKTsKLQotCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJCS8qIHN0YXR1cyAqLwotCXBSZXRQYXJbMV0gPSBBbXBTdGF0dXM7CQkJLyogIEFNUF9TdGF0dXMgKi8KLQlwdTRUZW1wID0gKHUzMiAqKSZwUmV0UGFyWzJdOwkJLyogIFRvdGFsX0JhbmR3aWR0aCAqLwotCSpwdTRUZW1wID0gVG90YWxCYW5kd2lkdGg7CQkvKiAweDE5YmZjYzAwOzB4NzUzMDsgKi8KLQlwdTRUZW1wID0gKHUzMiAqKSZwUmV0UGFyWzZdOwkJLyogIE1heF9HdWFyYW50ZWVkX0JhbmR3aWR0aCAqLwotCSpwdTRUZW1wID0gTWF4QmFuZEdVQmFuZHdpZHRoOwkJLyogMHgxOWJmY2MwMDsweDRlMjA7ICovCi0JcHU0VGVtcCA9ICh1MzIgKikmcFJldFBhclsxMF07CQkvKiAgTWluX0xhdGVuY3kgKi8KLQkqcHU0VGVtcCA9IE1pbkxhdGVuY3k7CQkJLyogMTUwOyAqLwotCXB1NFRlbXAgPSAodTMyICopJnBSZXRQYXJbMTRdOwkJLyogIE1heF9QRFVfU2l6ZSAqLwotCSpwdTRUZW1wID0gTWF4UERVU2l6ZTsKLQlwUmV0UGFyWzE4XSA9IENvbnRyb2xUeXBlOwkJLyogIENvbnRyb2xsZXJfVHlwZSAqLwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbMTldOwkJLyogIFBBTF9DYXBhYmlsaXRpZXMgKi8KLQkqcHUyVGVtcCA9IFBhbENhcDsKLQlwdTJUZW1wID0gKHUxNiAqKSZwUmV0UGFyWzIxXTsJCS8qICBBTVBfQVNTT0NfTGVuZ3RoICovCi0JKnB1MlRlbXAgPSBBbXBBc3NvY0xlbjsKLQlwdTRUZW1wID0gKHUzMiAqKSZwUmV0UGFyWzIzXTsJCS8qICBNYXhfRmx1c2hfVGltZW91dCAqLwotCSpwdTRUZW1wID0gTWF4Rmx1c2hUaW1lb3V0OwotCXB1NFRlbXAgPSAodTMyICopJnBSZXRQYXJbMjddOwkJLyogIEJlc3RfRWZmb3J0X0ZsdXNoX1RpbWVvdXQgKi8KLQkqcHU0VGVtcCA9IEJlc3RFZmZvcnRGbHVzaFRpbWVvdXQ7Ci0JbGVuICs9IDMxOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiQW1wU3RhdHVzID0gMHgleFxuIiwKLQkJQW1wU3RhdHVzKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJUb3RhbEJhbmR3aWR0aCA9IDB4JXgsIE1heEJhbmRHVUJhbmR3aWR0aCA9IDB4JXgsIE1pbkxhdGVuY3kgPSAweCV4LCBcbiBNYXhQRFVTaXplID0gMHgleCwgQ29udHJvbFR5cGUgPSAweCV4XG4iLAotCQlUb3RhbEJhbmR3aWR0aCwgTWF4QmFuZEdVQmFuZHdpZHRoLCBNaW5MYXRlbmN5LCBNYXhQRFVTaXplLCBDb250cm9sVHlwZSkpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUGFsQ2FwID0gMHgleCwgQW1wQXNzb2NMZW4gPSAweCV4LCBNYXhGbHVzaFRpbWVvdXQgPSAweCV4LCBCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0ID0gMHgleFxuIiwKLQkJUGFsQ2FwLCBBbXBBc3NvY0xlbiwgTWF4Rmx1c2hUaW1lb3V0LCBCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0KSk7Ci0JYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kQ3JlYXRlUGh5c2ljYWxMaW5rKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0KLQlwQnREYmctPmRiZ0hjaUluZm8uaGNpQ21kQ250Q3JlYXRlUGh5TGluaysrOwotCi0JcmV0dXJuIGJ0aGNpX0J1aWxkUGh5c2ljYWxMaW5rKHBhZGFwdGVyLAotCQlwSGNpQ21kLCBIQ0lfQ1JFQVRFX1BIWVNJQ0FMX0xJTkspOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRSZWFkTGlua1F1YWxpdHkoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1MTYJCQkJUExIOwotCXU4IAlFbnRyeU51bSwgTGlua1F1YWxpdHkgPSAweDU1OwotCi0JUExIID0gKigodTE2ICopJnBIY2lDbWQtPkRhdGFbMF0pOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiUExIID0gMHgleFxuIiwgUExIKSk7Ci0KLQlFbnRyeU51bSA9IGJ0aGNpX0dldEN1cnJlbnRFbnRyeU51bShwYWRhcHRlciwgKHU4KVBMSCk7Ci0JaWYgKEVudHJ5TnVtID09IDB4ZmYpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJObyBzdWNoIFBMSCgweCV4KVxuIiwgUExIKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JfQotCi0JewotCQl1OCBsb2NhbEJ1ZlsxMV0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1NUQVRVU19QQVJBTUVURVJTLAotCQkJSENJX1JFQURfTElOS19RVUFMSVRZLAotCQkJc3RhdHVzKTsKLQotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIiBQTEggPSAweCV4XG4gTGluayBRdWFsaXR5ID0gMHgleFxuIiwgUExILCBMaW5rUXVhbGl0eSkpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkJLyogc3RhdHVzICovCi0JCSooKHUxNiAqKSZwUmV0UGFyWzFdKSA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rQ21kRGF0YS5CdFBoeUxpbmtoYW5kbGU7CS8qICBIYW5kbGUgKi8KLQkJcFJldFBhclszXSA9IDB4NTU7CS8qIExpbmsgUXVhaWx0eSAqLwotCQlsZW4gKz0gNDsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kQ3JlYXRlTG9naWNhbExpbmsoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRDcmVhdGVMb2dMaW5rKys7Ci0KLQlidGhjaV9CdWlsZExvZ2ljYWxMaW5rKHBhZGFwdGVyLCBwSGNpQ21kLAotCQlIQ0lfQ1JFQVRFX0xPR0lDQUxfTElOSyk7Ci0KLQlyZXR1cm4gSENJX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRBY2NlcHRMb2dpY2FsTGluaygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudEFjY2VwdExvZ0xpbmsrKzsKLQotCWJ0aGNpX0J1aWxkTG9naWNhbExpbmsocGFkYXB0ZXIsIHBIY2lDbWQsCi0JCUhDSV9BQ0NFUFRfTE9HSUNBTF9MSU5LKTsKLQotCXJldHVybiBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZERpc2Nvbm5lY3RMb2dpY2FsTGluaygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVGluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUaW5mby0+QnREYmc7Ci0JdTE2CWxvZ2ljSGFuZGxlOwotCXU4IGksIGosIGZpbmQgPSAwLCBMb2dMaW5rQ291bnQgPSAwOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudERpc2Nvbm5lY3RMb2dMaW5rKys7Ci0KLQlsb2dpY0hhbmRsZSA9ICooKHUxNiAqKXBIY2lDbWQtPkRhdGEpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiRGlzY29ubmVjdExvZ2ljYWxMaW5rLCBsb2dpY0hhbmRsZSA9IDB4JXhcbiIsIGxvZ2ljSGFuZGxlKSk7Ci0KLQkvKiAgZmluZCBhbiBjcmVhdGVkIGxvZ2ljYWwgbGluayBpbmRleCBhbmQgY2xlYXIgdGhlIGRhdGEgKi8KLQlmb3IgKGogPSAwOyBqIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBqKyspIHsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9MT0dJQ0FMX0xJTktfTlVNOyBpKyspIHsKLQkJCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUgPT0gbG9naWNIYW5kbGUpIHsKLQkJCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkRpc2Nvbm5lY3RMb2dpY2FsTGluaywgbG9naWNIYW5kbGUgaXMgbWF0Y2hlZCAgMHgleFxuIiwgbG9naWNIYW5kbGUpKTsKLQkJCQlidGhjaV9SZXNldEZsb3dTcGVjKHBhZGFwdGVyLCBqLCBpKTsKLQkJCQlmaW5kID0gMTsKLQkJCQlwQnRNZ250LT5EaXNjb25uZWN0RW50cnlOdW0gPSBqOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKCFmaW5kKQotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JLyogIFRvIGNoZWNrIGVhY2ggKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGkrKykgewotCQlpZiAocEJUaW5mby0+QnRBc29jRW50cnlbcEJ0TWdudC0+RGlzY29ubmVjdEVudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUgIT0gMCkKLQkJCUxvZ0xpbmtDb3VudCsrOwotCX0KLQotCS8qIFdoZW4gd2UgcmVjZWl2ZSBDcmVhdGUgbG9naWNhbCBsaW5rIGNvbW1hbmQsIHdlIHNob3VsZCBzZW5kIGNvbW1hbmQgc3RhdHVzIGV2ZW50IGZpcnN0LiAqLwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCUhDSV9ESVNDT05ORUNUX0xPR0lDQUxfTElOSywKLQkJCXN0YXR1cyk7Ci0JLyogICovCi0JLyogV2hlbiB3ZSBkZXRlcm1pbmVzIHRoZSBsb2dpY2FsIGxpbmsgaXMgZXN0YWJsaXNoZWQsIHdlIHNob3VsZCBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQuICovCi0JLyogICovCi0JaWYgKHN0YXR1cyA9PSBIQ0lfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJYnRoY2lfRXZlbnREaXNjb25uZWN0TG9naWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwgc3RhdHVzLAotCQkJbG9naWNIYW5kbGUsIEhDSV9TVEFUVVNfQ09OTkVDVF9URVJNSU5BVEVfTE9DQUxfSE9TVCk7Ci0JfQotCi0JaWYgKExvZ0xpbmtDb3VudCA9PSAwKQotCQltb2RfdGltZXIoJnBCVGluZm8tPkJURGlzY29ubmVjdFBoeUxpbmtUaW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRMb2dpY2FsTGlua0NhbmNlbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVGluZm8tPkJ0TWdudDsKLQl1OCBDdXJyZW50RW50cnlOdW0sIEN1cnJlbnRMb2dFbnRyeU51bTsKLQotCXU4IHBoeXNpY2FsTGlua0hhbmRsZSwgVHhGbG93U3BlY0lELCBpOwotCXUxNglDdXJyZW50TG9naWNhbEhhbmRsZTsKLQotCXBoeXNpY2FsTGlua0hhbmRsZSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JVHhGbG93U3BlY0lEID0gKigoKHU4ICopcEhjaUNtZC0+RGF0YSkrMSk7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkxvZ2ljYWxMaW5rQ2FuY2VsLCBwaHlzaWNhbExpbmtIYW5kbGUgPSAweCV4LCBUeEZsb3dTcGVjSUQgPSAweCV4XG4iLAotCQlwaHlzaWNhbExpbmtIYW5kbGUsIFR4Rmxvd1NwZWNJRCkpOwotCi0JQ3VycmVudEVudHJ5TnVtID0gcEJ0TWdudC0+Q3VycmVudENvbm5lY3RFbnRyeU51bTsKLQlDdXJyZW50TG9naWNhbEhhbmRsZSA9IHBCdE1nbnQtPkJ0Q3VycmVudExvZ0xpbmtoYW5kbGU7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkN1cnJlbnRFbnRyeU51bSA9IDB4JXgsIEN1cnJlbnRMb2dpY2FsSGFuZGxlID0gMHgleFxuIiwKLQkJQ3VycmVudEVudHJ5TnVtLCBDdXJyZW50TG9naWNhbEhhbmRsZSkpOwotCi0JQ3VycmVudExvZ0VudHJ5TnVtID0gMHhmZjsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPR0lDQUxfTElOS19OVU07IGkrKykgewotCQlpZiAoKEN1cnJlbnRMb2dpY2FsSGFuZGxlID09IHBCVGluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbaV0uQnRMb2dMaW5raGFuZGxlKSAmJgotCQkJKHBoeXNpY2FsTGlua0hhbmRsZSA9PSBwQlRpbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50RW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW2ldLkJ0UGh5TGlua2hhbmRsZSkpIHsKLQkJCUN1cnJlbnRMb2dFbnRyeU51bSA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChDdXJyZW50TG9nRW50cnlOdW0gPT0gMHhmZikgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkxvZ2ljYWxMaW5rQ2FuY2VsLCBDdXJyZW50TG9nRW50cnlOdW0gPT0gMHhmZiAhISEhXG4iKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfSBlbHNlIHsKLQkJaWYgKHBCVGluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRFbnRyeU51bV0uTG9nTGlua0NtZERhdGFbQ3VycmVudExvZ0VudHJ5TnVtXS5iTExDb21wbGV0ZUV2ZW50SXNTZXQpIHsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiTG9naWNhbExpbmtDYW5jZWwsIExMQ29tcGxldGVFdmVudElzU2V0ISEhIVxuIikpOwotCQkJc3RhdHVzID0gSENJX1NUQVRVU19BQ0xfQ09OTkVDVF9FWElTVFM7Ci0JCX0KLQl9Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzhdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCUxJTktfQ09OVFJPTF9DT01NQU5EUywKLQkJCUhDSV9MT0dJQ0FMX0xJTktfQ0FOQ0VMLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCXBSZXRQYXJbMV0gPSBwQlRpbmZvLT5CdEFzb2NFbnRyeVtDdXJyZW50RW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhW0N1cnJlbnRMb2dFbnRyeU51bV0uQnRQaHlMaW5raGFuZGxlOwotCQlwUmV0UGFyWzJdID0gcEJUaW5mby0+QnRBc29jRW50cnlbQ3VycmVudEVudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtDdXJyZW50TG9nRW50cnlOdW1dLkJ0VHhGbG93U3BlY0lEOwotCQlsZW4gKz0gMzsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcEJUaW5mby0+QnRBc29jRW50cnlbQ3VycmVudEVudHJ5TnVtXS5Mb2dMaW5rQ21kRGF0YVtDdXJyZW50TG9nRW50cnlOdW1dLmJMTENhbmNlbENNRElzU2V0YW5kQ29tcGxldGUgPSB0cnVlOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kRmxvd1NwZWNNb2RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXU4IGksIGosIGZpbmQgPSAwOwotCXUxNiBsb2dpY0hhbmRsZTsKLQotCWxvZ2ljSGFuZGxlID0gKigodTE2ICopcEhjaUNtZC0+RGF0YSk7Ci0JLyogIGZpbmQgYW4gbWF0Y2hlZCBsb2dpY2FsIGxpbmsgaW5kZXggYW5kIGNvcHkgdGhlIGRhdGEgKi8KLQlmb3IgKGogPSAwOyBqIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBqKyspIHsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9MT0dJQ0FMX0xJTktfTlVNOyBpKyspIHsKLQkJCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUgPT0gbG9naWNIYW5kbGUpIHsKLQkJCQltZW1jcHkoJnBCVGluZm8tPkJ0QXNvY0VudHJ5W2pdLkxvZ0xpbmtDbWREYXRhW2ldLlR4X0Zsb3dfU3BlYywKLQkJCQkJJnBIY2lDbWQtPkRhdGFbMl0sIHNpemVvZihzdHJ1Y3QgaGNpX2Zsb3dfc3BlYykpOwotCQkJCW1lbWNweSgmcEJUaW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uUnhfRmxvd19TcGVjLAotCQkJCQkmcEhjaUNtZC0+RGF0YVsxOF0sIHNpemVvZihzdHJ1Y3QgaGNpX2Zsb3dfc3BlYykpOwotCi0JCQkJYnRoY2lfQ2hlY2tMb2dMaW5rQmVoYXZpb3IocGFkYXB0ZXIsIHBCVGluZm8tPkJ0QXNvY0VudHJ5W2pdLkxvZ0xpbmtDbWREYXRhW2ldLlR4X0Zsb3dfU3BlYyk7Ci0JCQkJZmluZCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0xPR08sICgiRmxvd1NwZWNNb2RpZnksIExMSCA9IDB4JXgsIFxuIiwgbG9naWNIYW5kbGUpKTsKLQotCS8qIFdoZW4gd2UgcmVjZWl2ZSBGbG93IFNwZWMgTW9kaWZ5IGNvbW1hbmQsIHdlIHNob3VsZCBzZW5kIGNvbW1hbmQgc3RhdHVzIGV2ZW50IGZpcnN0LiAqLwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJTElOS19DT05UUk9MX0NPTU1BTkRTLAotCQlIQ0lfRkxPV19TUEVDX01PRElGWSwKLQkJSENJX1NUQVRVU19TVUNDRVNTKTsKLQotCWlmICghZmluZCkKLQkJc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfQ09OTkVDVF9JRDsKLQotCWJ0aGNpX0V2ZW50U2VuZEZsb3dTcGVjTW9kaWZ5Q29tcGxldGUocGFkYXB0ZXIsIHN0YXR1cywgbG9naWNIYW5kbGUpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kQWNjZXB0UGh5c2ljYWxMaW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0KLQlwQnREYmctPmRiZ0hjaUluZm8uaGNpQ21kQ250QWNjZXB0UGh5TGluaysrOwotCi0JcmV0dXJuIGJ0aGNpX0J1aWxkUGh5c2ljYWxMaW5rKHBhZGFwdGVyLAotCQlwSGNpQ21kLCBIQ0lfQUNDRVBUX1BIWVNJQ0FMX0xJTkspOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWREaXNjb25uZWN0UGh5c2ljYWxMaW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQl1OCBQTEgsIEN1cnJlbnRFbnRyeU51bSwgUGh5c0xpbmtEaXNjb25uZWN0UmVhc29uOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudERpc2Nvbm5lY3RQaHlMaW5rKys7Ci0KLQlQTEggPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCVBoeXNMaW5rRGlzY29ubmVjdFJlYXNvbiA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSsxKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9ESVNDT05ORUNUX1BIWVNJQ0FMX0xJTksgIFBoeUhhbmRsZSA9IDB4JXgsIFJlYXNvbiA9IDB4JXhcbiIsCi0JCVBMSCwgUGh5c0xpbmtEaXNjb25uZWN0UmVhc29uKSk7Ci0KLQlDdXJyZW50RW50cnlOdW0gPSBidGhjaV9HZXRDdXJyZW50RW50cnlOdW0ocGFkYXB0ZXIsIFBMSCk7Ci0KLQlpZiAoQ3VycmVudEVudHJ5TnVtID09IDB4ZmYpIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwKLQkJCSgiRGlzY29ubmVjdFBoeXNpY2FsTGluaywgTm8gc3VjaCBIYW5kbGUgaW4gdGhlIEVudHJ5XG4iKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0JfSBlbHNlIHsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbQ3VycmVudEVudHJ5TnVtXS5QaHlMaW5rRGlzY29ubmVjdFJlYXNvbiA9Ci0JCQkoZW51bSBoY2lfc3RhdHVzKVBoeXNMaW5rRGlzY29ubmVjdFJlYXNvbjsKLQl9Ci0JLyogU2VuZCBIQ0kgQ29tbWFuZCBzdGF0dXMgZXZlbnQgdG8gQU1QLiAqLwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwgTElOS19DT05UUk9MX0NPTU1BTkRTLAotCQkJCSBIQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LLCBzdGF0dXMpOwotCi0JaWYgKHN0YXR1cyAhPSBIQ0lfU1RBVFVTX1NVQ0NFU1MpCi0JCXJldHVybiBzdGF0dXM7Ci0KLQkvKiBUaGUgbWFjcm9zIGJlbG93IHJlcXVpcmUgeyBhbmQgfSBpbiB0aGUgaWYgc3RhdGVtZW50ICovCi0JaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0N1cnJlbnRFbnRyeU51bV0uQnRDdXJyZW50U3RhdGUgPT0gSENJX1NUQVRFX0RJU0NPTk5FQ1RFRCkgewotCQlCVEhDSV9TTV9XSVRIX0lORk8ocGFkYXB0ZXIsIEhDSV9TVEFURV9ESVNDT05ORUNURUQsIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LLCBDdXJyZW50RW50cnlOdW0pOwotCX0gZWxzZSB7Ci0JCUJUSENJX1NNX1dJVEhfSU5GTyhwYWRhcHRlciwgSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkcsIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LLCBDdXJyZW50RW50cnlOdW0pOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRTZXRBQ0xMaW5rRGF0YUZsb3dNb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCXU4IGxlbiA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXUxNiAqcHUyVGVtcDsKLQotCXBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50Q29ubmVjdEhhbmRsZSA9ICooKHUxNiAqKXBIY2lDbWQtPkRhdGEpOwotCXBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50SW5jb21pbmdUcmFmZmljTW9kZSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSkrMjsKLQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudE91dGdvaW5nVHJhZmZpY01vZGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpKzM7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiQ29ubmVjdGlvbiBIYW5kbGUgPSAweCV4LCBJbmNvbWluZyBUcmFmZmljIG1vZGUgPSAweCV4LCBPdXRnb2luZyBUcmFmZmljIG1vZGUgPSAweCV4IiwKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLkN1cnJlbnRDb25uZWN0SGFuZGxlLAotCQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudEluY29taW5nVHJhZmZpY01vZGUsCi0JCXBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50T3V0Z29pbmdUcmFmZmljTW9kZSkpOwotCi0KLQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCU9HRl9FWFRFTlNJT04sCi0JCUhDSV9TRVRfQUNMX0xJTktfREFUQV9GTE9XX01PREUsCi0JCXN0YXR1cyk7Ci0KLQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCi0JcHUyVGVtcCA9ICh1MTYgKikmcFJldFBhclsxXTsKLQkqcHUyVGVtcCA9IHBCdE1nbnQtPkV4dENvbmZpZy5DdXJyZW50Q29ubmVjdEhhbmRsZTsKLQlsZW4gKz0gMzsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFNldEFDTExpbmtTdGF0dXMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JdTggaTsKLQl1OCAqcFRyaXBsZTsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRTZXRBY2xMaW5rU3RhdHVzKys7Ci0JUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgIlNldEFDTExpbmtTdGF0dXMsIEhleCBEYXRhIDpcbiIsCi0JCQkmcEhjaUNtZC0+RGF0YVswXSwgcEhjaUNtZC0+TGVuZ3RoKTsKLQotCS8qICBPbmx5IENvcmUgU3RhY2sgdjI1MSBhbmQgbGF0ZXIgdmVyc2lvbiBzdXBwb3J0IHRoaXMgY29tbWFuZC4gKi8KLQlwQnRNZ250LT5iU3VwcG9ydFByb2ZpbGUgPSB0cnVlOwotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJOdW1iZXJPZkhhbmRsZSA9IDB4JXhcbiIsIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSkpOwotCi0JcFRyaXBsZSA9ICZwSGNpQ21kLT5EYXRhWzFdOwotCWZvciAoaSA9IDA7IGkgPCBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGU7IGkrKykgewotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQ29ubmVjdEhhbmRsZSA9ICooKHUxNiAqKSZwVHJpcGxlWzBdKTsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkluY29taW5nVHJhZmZpY01vZGUgPSBwVHJpcGxlWzJdOwotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uT3V0Z29pbmdUcmFmZmljTW9kZSA9IHBUcmlwbGVbM107Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULAotCQkJKCJDb25uZWN0aW9uX0hhbmRsZSA9IDB4JXgsIEluY29taW5nIFRyYWZmaWMgbW9kZSA9IDB4JXgsIE91dGdvaW5nIFRyYWZmaWMgTW9kZSA9IDB4JXhcbiIsCi0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQ29ubmVjdEhhbmRsZSwKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5JbmNvbWluZ1RyYWZmaWNNb2RlLAotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLk91dGdvaW5nVHJhZmZpY01vZGUpKTsKLQkJcFRyaXBsZSArPSA0OwotCX0KLQotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9TRVRfQUNMX0xJTktfU1RBVFVTLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFNldFNDT0xpbmtTdGF0dXMoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRTZXRTY29MaW5rU3RhdHVzKys7Ci0JcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJOdW1iZXJPZlNDTyA9IDB4JXhcbiIsCi0JCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZlNDTykpOwotCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfRVhURU5TSU9OLAotCQkJSENJX1NFVF9TQ09fTElOS19TVEFUVVMsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQotCQlsZW4gKz0gMTsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kU2V0UlNTSVZhbHVlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzOAkJbWluX2J0X3Jzc2kgPSAwOwotCXU4IGk7Ci0JZm9yIChpID0gMDsgaSA8IHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZTsgaSsrKSB7Ci0JCWlmIChwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQ29ubmVjdEhhbmRsZSA9PSAqKCh1MTYgKikmcEhjaUNtZC0+RGF0YVswXSkpIHsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVF9SU1NJID0gKHM4KShwSGNpQ21kLT5EYXRhWzJdKTsKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVF9QRVJJT0RJQ0FMLAotCQkJKCJDb25uZWN0aW9uX0hhbmRsZSA9IDB4JXgsIFJTU0kgPSAlZCBcbiIsCi0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQ29ubmVjdEhhbmRsZSwKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVF9SU1NJKSk7Ci0JCX0KLQkJLyogIGdldCB0aGUgbWluaW11bSBidCByc3NpIHZhbHVlICovCi0JCWlmIChwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRfUlNTSSA8PSBtaW5fYnRfcnNzaSkKLQkJCW1pbl9idF9yc3NpID0gcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUX1JTU0k7Ci0JfQotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLk1JTl9CVF9SU1NJID0gbWluX2J0X3Jzc2k7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltidCByc3NpXSwgdGhlIG1pbiByc3NpIGlzICVkXG4iLCBtaW5fYnRfcnNzaSkpOwotCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfRVhURU5TSU9OLAotCQkJSENJX1NFVF9SU1NJX1ZBTFVFLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZFNldEN1cnJlbnRCbHVldG9vdGhTdGF0dXMoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotLypQTUdOVF9JTkZPCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlwQnRNZ250LT5FeHRDb25maWcuQ3VycmVudEJUU3RhdHVzID0gKigodTggKikmcEhjaUNtZC0+RGF0YVswXSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiU2V0Q3VycmVudEJsdWV0b290aFN0YXR1cywgQ3VycmVudEJUU3RhdHVzID0gMHgleFxuIiwKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLkN1cnJlbnRCVFN0YXR1cykpOwotCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfRVhURU5TSU9OLAotCQkJSENJX1NFVF9DVVJSRU5UX0JMVUVUT09USF9TVEFUVVMsCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQkJbGVuICs9IDE7Ci0KLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kRXh0ZW5zaW9uVmVyc2lvbk5vdGlmeSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cwlzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudEV4dGVuc2lvblZlcnNpb25Ob3RpZnkrKzsKLQlSVFBSSU5UX0RBVEEoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAiRXh0ZW5zaW9uVmVyc2lvbk5vdGlmeSwgSGV4IERhdGEgOlxuIiwKLQkJCSZwSGNpQ21kLT5EYXRhWzBdLCBwSGNpQ21kLT5MZW5ndGgpOwotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLkhDSUV4dGVuc2lvblZlciA9ICooKHUxNiAqKSZwSGNpQ21kLT5EYXRhWzBdKTsKLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lFeHRlbnNpb25WZXIgPSAweCV4XG4iLCBwQnRNZ250LT5FeHRDb25maWcuSENJRXh0ZW5zaW9uVmVyKSk7Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9FWFRFTlNJT04sCi0JCQlIQ0lfRVhURU5TSU9OX1ZFUlNJT05fTk9USUZZLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0KLQkJbGVuICs9IDE7Ci0JCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCX0KLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZExpbmtTdGF0dXNOb3RpZnkoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQl1OCBpOwotCXU4ICpwVHJpcGxlOwotCi0JcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudExpbmtTdGF0dXNOb3RpZnkrKzsKLQlSVFBSSU5UX0RBVEEoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAiTGlua1N0YXR1c05vdGlmeSwgSGV4IERhdGEgOlxuIiwKLQkJCSZwSGNpQ21kLT5EYXRhWzBdLCBwSGNpQ21kLT5MZW5ndGgpOwotCi0JLyogIEN1cnJlbnQgb25seSBSVEw4NzIzIHN1cHBvcnQgdGhpcyBjb21tYW5kLiAqLwotCXBCdE1nbnQtPmJTdXBwb3J0UHJvZmlsZSA9IHRydWU7Ci0KLQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIk51bWJlck9mSGFuZGxlID0gMHgleFxuIiwgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlKSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiSENJRXh0ZW5zaW9uVmVyID0gJWRcbiIsIHBCdE1nbnQtPkV4dENvbmZpZy5IQ0lFeHRlbnNpb25WZXIpKTsKLQotCXBUcmlwbGUgPSAmcEhjaUNtZC0+RGF0YVsxXTsKLQlmb3IgKGkgPSAwOyBpIDwgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlOyBpKyspIHsKLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5IQ0lFeHRlbnNpb25WZXIgPCAxKSB7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQ29ubmVjdEhhbmRsZSA9ICooKHUxNiAqKSZwVHJpcGxlWzBdKTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVFByb2ZpbGUgPSBwVHJpcGxlWzJdOwotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUQ29yZVNwZWMgPSBwVHJpcGxlWzNdOwotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsCi0JCQkJKCJDb25uZWN0aW9uX0hhbmRsZSA9IDB4JXgsIEJUUHJvZmlsZSA9JWQsIEJUU3BlYyA9JWRcbiIsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkNvbm5lY3RIYW5kbGUsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUUHJvZmlsZSwKLQkJCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRDb3JlU3BlYykpOwotCQkJcFRyaXBsZSArPSA0OwotCQl9IGVsc2UgaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5IQ0lFeHRlbnNpb25WZXIgPj0gMSkgewotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkNvbm5lY3RIYW5kbGUgPSAqKCh1MTYgKikmcFRyaXBsZVswXSk7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRQcm9maWxlID0gcFRyaXBsZVsyXTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVENvcmVTcGVjID0gcFRyaXBsZVszXTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5saW5rUm9sZSA9IHBUcmlwbGVbNF07Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwKLQkJCQkoIkNvbm5lY3Rpb25fSGFuZGxlID0gMHgleCwgQlRQcm9maWxlID0lZCwgQlRTcGVjID0lZCwgTGlua1JvbGUgPSVkXG4iLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5Db25uZWN0SGFuZGxlLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVFByb2ZpbGUsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUQ29yZVNwZWMsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLmxpbmtSb2xlKSk7Ci0JCQlwVHJpcGxlICs9IDU7Ci0JCX0KLQotCX0KLQlCVEhDSV9VcGRhdGVCVFByb2ZpbGVSVEtUb01vdG8ocGFkYXB0ZXIpOwotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9MSU5LX1NUQVRVU19OT1RJRlksCi0JCQlzdGF0dXMpOwotCi0JCS8qICBSZXR1cm4gcGFyYW1ldGVycyBzdGFydHMgZnJvbSBoZXJlICovCi0JCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQotCQlsZW4gKz0gMTsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kQnRPcGVyYXRpb25Ob3RpZnkoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZAotCSkKLXsKLQllbnVtIGhjaV9zdGF0dXMJc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JUlRQUklOVF9EQVRBKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgIkJ0IE9wZXJhdGlvbiBub3RpZnksIEhleCBEYXRhIDpcbiIsCi0JCQkmcEhjaUNtZC0+RGF0YVswXSwgcEhjaUNtZC0+TGVuZ3RoKTsKLQotCXBCdE1nbnQtPkV4dENvbmZpZy5idE9wZXJhdGlvbkNvZGUgPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoImJ0T3BlcmF0aW9uQ29kZSA9IDB4JXhcbiIsIHBCdE1nbnQtPkV4dENvbmZpZy5idE9wZXJhdGlvbkNvZGUpKTsKLQlzd2l0Y2ggKHBCdE1nbnQtPkV4dENvbmZpZy5idE9wZXJhdGlvbkNvZGUpIHsKLQljYXNlIEhDSV9CVF9PUF9OT05FOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IE9wZXJhdGlvbiBOb25lISFcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQlRfT1BfSU5RVUlSWV9TVEFSVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiW2J0IG9wZXJhdGlvbl0gOiBJbnF1aXJlIHN0YXJ0ISFcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQlRfT1BfSU5RVUlSWV9GSU5JU0g6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIltidCBvcGVyYXRpb25dIDogSW5xdWlyZSBmaW5pc2hlZCEhXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QX1BBR0lOR19TVEFSVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiW2J0IG9wZXJhdGlvbl0gOiBQYWdpbmcgaXMgc3RhcnRlZCEhXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QX1BBR0lOR19TVUNDRVNTOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IFBhZ2luZyBjb21wbGV0ZSBzdWNjZXNzZnVsbHkhIVxuIikpOwotCQlicmVhazsKLQljYXNlIEhDSV9CVF9PUF9QQUdJTkdfVU5TVUNDRVNTOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IFBhZ2luZyBjb21wbGV0ZSB1bnN1Y2Nlc3NmdWxseSEhXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QX1BBSVJJTkdfU1RBUlQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIltidCBvcGVyYXRpb25dIDogUGFpcmluZyBzdGFydCEhXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QX1BBSVJJTkdfRklOSVNIOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IFBhaXJpbmcgZmluaXNoZWQhIVxuIikpOwotCQlicmVhazsKLQljYXNlIEhDSV9CVF9PUF9CVF9ERVZfRU5BQkxFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJbYnQgb3BlcmF0aW9uXSA6IEJUIERldmljZSBpcyBlbmFibGVkISFcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQlRfT1BfQlRfREVWX0RJU0FCTEU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIltidCBvcGVyYXRpb25dIDogQlQgRGV2aWNlIGlzIGRpc2FibGVkISFcbiIpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiW2J0IG9wZXJhdGlvbl0gOiBVbmtub3duLCBlcnJvciEhXG4iKSk7Ci0JCWJyZWFrOwotCX0KLQlCVERNX0FkanVzdEZvckJ0T3BlcmF0aW9uKHBhZGFwdGVyKTsKLQl7Ci0JCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9FWFRFTlNJT04sCi0JCQlIQ0lfQlRfT1BFUkFUSU9OX05PVElGWSwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCi0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRFbmFibGVXaWZpU2Nhbk5vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlRfREFUQShGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICJFbmFibGUgV2lmaSBzY2FuIG5vdGlmeSwgSGV4IERhdGEgOlxuIiwKLQkJCSZwSGNpQ21kLT5EYXRhWzBdLCBwSGNpQ21kLT5MZW5ndGgpOwotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLmJFbmFibGVXaWZpU2Nhbk5vdGlmeSA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRF9FWFQsICgiYkVuYWJsZVdpZmlTY2FuTm90aWZ5ID0gJWRcbiIsIHBCdE1nbnQtPkV4dENvbmZpZy5iRW5hYmxlV2lmaVNjYW5Ob3RpZnkpKTsKLQotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9FTkFCTEVfV0lGSV9TQ0FOX05PVElGWSwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCi0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXSUZJQ3VycmVudENoYW5uZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JdTggY2hubCA9IHBtbG1lZXh0LT5jdXJfY2hhbm5lbDsKLQotCWlmIChwbWxtZWV4dC0+Y3VyX2J3bW9kZSA9PSBIVF9DSEFOTkVMX1dJRFRIXzQwKSB7Ci0JCWlmIChwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCQljaG5sICs9IDI7Ci0JCWVsc2UgaWYgKHBtbG1lZXh0LT5jdXJfY2hfb2Zmc2V0ID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUikKLQkJCWNobmwgLT0gMjsKLQl9Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJDdXJyZW50IENoYW5uZWwgID0gMHgleFxuIiwgY2hubCkpOwotCi0JewotCQl1OCBsb2NhbEJ1Zls4XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfRVhURU5TSU9OLAotCQkJSENJX1dJRklfQ1VSUkVOVF9DSEFOTkVMLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCXBSZXRQYXJbMV0gPSBjaG5sOwkJCS8qIGN1cnJlbnQgY2hhbm5lbCAqLwotCQlsZW4gKz0gMjsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kV0lGSUN1cnJlbnRCYW5kd2lkdGgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0JZW51bSBodF9jaGFubmVsX3dpZHRoIGJ3OwotCXU4IEN1cnJlbnRCVyA9IDA7Ci0KLQlidyA9IHBhZGFwdGVyLT5tbG1lZXh0cHJpdi5jdXJfYndtb2RlOwotCi0JaWYgKGJ3ID09IEhUX0NIQU5ORUxfV0lEVEhfMjApCi0JCUN1cnJlbnRCVyA9IDA7Ci0JZWxzZSBpZiAoYncgPT0gSFRfQ0hBTk5FTF9XSURUSF80MCkKLQkJQ3VycmVudEJXID0gMTsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkN1cnJlbnQgQlcgPSAweCV4XG4iLAotCQlDdXJyZW50QlcpKTsKLQotCXsKLQkJdTggbG9jYWxCdWZbOF0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX0VYVEVOU0lPTiwKLQkJCUhDSV9XSUZJX0NVUlJFTlRfQkFORFdJRFRILAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCXBSZXRQYXJbMV0gPSBDdXJyZW50Qlc7CQkvKiBjdXJyZW50IEJXICovCi0JCWxlbiArPSAyOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRXSUZJQ29ubmVjdGlvblN0YXR1cygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kCi0JKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0JdTggY29ubmVjdFN0YXR1cyA9IEhDSV9XSUZJX05PVF9DT05ORUNURUQ7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgewotCQlpZiAocGFkYXB0ZXItPnN0YXByaXYuYXNvY19zdGFfY291bnQgPj0gMykKLQkJCWNvbm5lY3RTdGF0dXMgPSBIQ0lfV0lGSV9DT05ORUNURUQ7Ci0JCWVsc2UKLQkJCWNvbm5lY3RTdGF0dXMgPSBIQ0lfV0lGSV9OT1RfQ09OTkVDVEVEOwotCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFfFdJRklfQURIT0NfTUFTVEVSX1NUQVRFfFdJRklfQVNPQ19TVEFURSkpIHsKLQkJY29ubmVjdFN0YXR1cyA9IEhDSV9XSUZJX0NPTk5FQ1RFRDsKLQl9IGVsc2UgaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9MSU5LSU5HKSkgewotCQljb25uZWN0U3RhdHVzID0gSENJX1dJRklfQ09OTkVDVF9JTl9QUk9HUkVTUzsKLQl9IGVsc2UgewotCQljb25uZWN0U3RhdHVzID0gSENJX1dJRklfTk9UX0NPTk5FQ1RFRDsKLQl9Ci0KLQl7Ci0JCXU4IGxvY2FsQnVmWzhdID0gIiI7Ci0JCXU4ICpwUmV0UGFyOwotCQl1OCBsZW4gPSAwOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJCU9HRl9FWFRFTlNJT04sCi0JCQlIQ0lfV0lGSV9DT05ORUNUSU9OX1NUQVRVUywKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCQkvKiBzdGF0dXMgKi8KLQkJcFJldFBhclsxXSA9IGNvbm5lY3RTdGF0dXM7CS8qIGNvbm5lY3Qgc3RhdHVzICovCi0JCWxlbiArPSAyOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRFbmFibGVEZXZpY2VVbmRlclRlc3RNb2RlKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0KLQlwQnRIY2lJbmZvLT5iSW5UZXN0TW9kZSA9IHRydWU7Ci0JcEJ0SGNpSW5mby0+YlRlc3RJc0VuZCA9IGZhbHNlOwotCi0JLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JewotCQl1OCBsb2NhbEJ1Zls2XSA9ICIiOwotCQl1OCAqcFJldFBhcjsKLQkJdTggbGVuID0gMDsKLQkJc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCi0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJbGVuICs9IGJ0aGNpX0NvbW1hbmRDb21wbGV0ZUhlYWRlcigmbG9jYWxCdWZbMF0sCi0JCQlPR0ZfVEVTVElOR19DT01NQU5EUywKLQkJCUhDSV9FTkFCTEVfREVWSUNFX1VOREVSX1RFU1RfTU9ERSwKLQkJCXN0YXR1cyk7Ci0KLQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJcFJldFBhciA9ICZQUGFja2V0SXJwRXZlbnQtPkRhdGFbbGVuXTsKLQkJcFJldFBhclswXSA9IHN0YXR1czsJCS8qIHN0YXR1cyAqLwotCQlsZW4gKz0gMTsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSBsZW47Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfQ21kQU1QVGVzdEVuZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0KLQlpZiAoIXBCdEhjaUluZm8tPmJJblRlc3RNb2RlKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiTm90IGluIFRlc3QgbW9kZSwgcmV0dXJuIHN0YXR1cyA9IEhDSV9TVEFUVVNfQ01EX0RJU0FMTE9XXG4iKSk7Ci0JCXN0YXR1cyA9IEhDSV9TVEFUVVNfQ01EX0RJU0FMTE9XOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXBCdEhjaUluZm8tPmJUZXN0SXNFbmQgPSB0cnVlOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBCVEluZm8tPkJUVGVzdFNlbmRQYWNrZXRUaW1lcik7Ci0KLQlydGw4NzIzYV9jaGVja19ic3NpZChwYWRhcHRlciwgdHJ1ZSk7Ci0KLQkvKiBzZW5kIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgaGVyZSB3aGVuIGFsbCBkYXRhIGFyZSByZWNlaXZlZC4gKi8KLQl7Ci0JCXU4IGxvY2FsQnVmWzRdID0gIiI7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIkFNUCBUZXN0IEVuZCBFdmVudCBcbiIpKTsKLQkJUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQkJUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfQU1QX1RFU1RfRU5EOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDI7Ci0KLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gc3RhdHVzOwotCQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW87Ci0KLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCA0KTsKLQl9Ci0KLQlidGhjaV9FdmVudEFNUFJlY2VpdmVyUmVwb3J0KHBhZGFwdGVyLCAweDAxKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0NtZEFNUFRlc3RDb21tYW5kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQotCWlmICghcEJ0SGNpSW5mby0+YkluVGVzdE1vZGUpIHsKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJOb3QgaW4gVGVzdCBtb2RlLCByZXR1cm4gc3RhdHVzID0gSENJX1NUQVRVU19DTURfRElTQUxMT1dcbiIpKTsKLQkJc3RhdHVzID0gSENJX1NUQVRVU19DTURfRElTQUxMT1c7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvID0gKigodTggKilwSGNpQ21kLT5EYXRhKTsKLQotCWlmIChwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW8gPT0gMHgwMSkKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJUWCBTaW5nbGUgVGVzdCBcbiIpKTsKLQllbHNlIGlmIChwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW8gPT0gMHgwMikKLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJSZWNlaXZlIEZyYW1lIFRlc3QgXG4iKSk7Ci0JZWxzZQotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIk5vIFN1Y2ggVGVzdCAhISEhISEhISEhISEhISEhISEgXG4iKSk7Ci0KLQlpZiAocEJ0SGNpSW5mby0+YlRlc3RJc0VuZCkgewotCQl1OCBsb2NhbEJ1Zls1XSA9ICIiOwotCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9FVkVOVHxJT0NUTF9CVF9MT0dPKSwgKCJBTVAgVGVzdCBFbmQgRXZlbnQgXG4iKSk7Ci0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0FNUF9URVNUX0VORDsKLQkJUFBhY2tldElycEV2ZW50LT5MZW5ndGggPSAyOwotCi0JCVBQYWNrZXRJcnBFdmVudC0+RGF0YVswXSA9IHN0YXR1czsKLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzFdID0gcEJ0SGNpSW5mby0+VGVzdFNjZW5hcmlvIDsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIDQpOwotCi0JCS8qIFJldHVybiB0byBJZGVsIHN0YXRlIHdpdGggUlggYW5kIFRYIG9mZi4gKi8KLQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qICBzaG91bGQgc2VuZCBjb21tYW5kIHN0YXR1cyBldmVudCAqLwotCWJ0aGNpX0V2ZW50Q29tbWFuZFN0YXR1cyhwYWRhcHRlciwKLQkJCU9HRl9URVNUSU5HX0NPTU1BTkRTLAotCQkJSENJX0FNUF9URVNUX0NPTU1BTkQsCi0JCQlzdGF0dXMpOwotCi0JLyogVGhlIEhDSV9BTVBfU3RhcnQgVGVzdCBFdmVudCBzaGFsbCBiZSBnZW5lcmF0ZWQgd2hlbiB0aGUgKi8KLQkvKiBIQ0lfQU1QX1Rlc3RfQ29tbWFuZCBoYXMgY29tcGxldGVkIGFuZCB0aGUgZmlyc3QgZGF0YSBpcyByZWFkeSB0byBiZSBzZW50ICovCi0JLyogb3IgcmVjZWl2ZWQuICovCi0KLQl7Ci0JCXU4IGxvY2FsQnVmWzVdID0gIiI7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIiBIQ0lfQU1QX1N0YXJ0IFRlc3QgRXZlbnQgXG4iKSk7Ci0JCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JCVBQYWNrZXRJcnBFdmVudC0+RXZlbnRDb2RlID0gSENJX0VWRU5UX0FNUF9TVEFSVF9URVNUOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IDI7Ci0KLQkJUFBhY2tldElycEV2ZW50LT5EYXRhWzBdID0gc3RhdHVzOwotCQlQUGFja2V0SXJwRXZlbnQtPkRhdGFbMV0gPSBwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW8gOwotCi0JCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgNCk7Ci0KLQkJLyogUmV0dXJuIHRvIElkZWwgc3RhdGUgd2l0aCBSWCBhbmQgVFggb2ZmLiAqLwotCX0KLQotCWlmIChwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW8gPT0gMHgwMSkgewotCQkvKgotCQkJV2hlbiBpbiBhIHRyYW5zbWl0dGVyIHRlc3Qgc2NlbmFyaW8gYW5kIHRoZSBmcmFtZXMvYnVyc3RzIGNvdW50IGhhdmUgYmVlbgotCQkJdHJhbnNtaXR0ZWQgdGhlIEhDSV9BTVBfVGVzdF9FbmQgZXZlbnQgc2hhbGwgYmUgc2VudC4KLQkJKi8KLQkJbW9kX3RpbWVyKCZwQlRJbmZvLT5CVFRlc3RTZW5kUGFja2V0VGltZXIsCi0JCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKSk7Ci0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfQlRfTE9HTyksICgiVFggU2luZ2xlIFRlc3QgXG4iKSk7Ci0JfSBlbHNlIGlmIChwQnRIY2lJbmZvLT5UZXN0U2NlbmFyaW8gPT0gMHgwMikgewotCQlydGw4NzIzYV9jaGVja19ic3NpZChwYWRhcHRlciwgZmFsc2UpOwotCQlSVFBSSU5UKEZJT0NUTCwgKElPQ1RMX0JUX0VWRU5UfElPQ1RMX0JUX0xPR08pLCAoIlJlY2VpdmUgRnJhbWUgVGVzdCBcbiIpKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRFbmFibGVBTVBSZWNlaXZlclJlcG9ydHMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfaGNpX2luZm8gKnBCdEhjaUluZm8gPSAmcEJUSW5mby0+QnRIY2lJbmZvOwotCi0JaWYgKCFwQnRIY2lJbmZvLT5iSW5UZXN0TW9kZSkgewotCQlzdGF0dXMgPSBIQ0lfU1RBVFVTX0NNRF9ESVNBTExPVzsKLQkJLyogc2VuZCBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGhlcmUgd2hlbiBhbGwgZGF0YSBhcmUgcmVjZWl2ZWQuICovCi0JCXsKLQkJCXU4IGxvY2FsQnVmWzZdID0gIiI7Ci0JCQl1OCAqcFJldFBhcjsKLQkJCXU4IGxlbiA9IDA7Ci0JCQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0KLQkJCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQkJCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJCU9HRl9URVNUSU5HX0NPTU1BTkRTLAotCQkJCUhDSV9FTkFCTEVfQU1QX1JFQ0VJVkVSX1JFUE9SVFMsCi0JCQkJc3RhdHVzKTsKLQotCQkJLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQkJCXBSZXRQYXIgPSAmUFBhY2tldElycEV2ZW50LT5EYXRhW2xlbl07Ci0JCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCQlsZW4gKz0gMTsKLQkJCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCi0JCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXBCdEhjaUluZm8tPmJUZXN0TmVlZFJlcG9ydCA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSk7Ci0JcEJ0SGNpSW5mby0+VGVzdFJlcG9ydEludGVydmFsID0gKCooKHU4ICopcEhjaUNtZC0+RGF0YSsyKSk7Ci0KLQlidGhjaV9FdmVudEFNUFJlY2VpdmVyUmVwb3J0KHBhZGFwdGVyLCAweDAwKTsKLQotCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCXsKLQkJdTggbG9jYWxCdWZbNl0gPSAiIjsKLQkJdTggKnBSZXRQYXI7Ci0JCXU4IGxlbiA9IDA7Ci0JCXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKlBQYWNrZXRJcnBFdmVudDsKLQotCQlQUGFja2V0SXJwRXZlbnQgPSAoc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqKSgmbG9jYWxCdWZbMF0pOwotCi0JCWxlbiArPSBidGhjaV9Db21tYW5kQ29tcGxldGVIZWFkZXIoJmxvY2FsQnVmWzBdLAotCQkJT0dGX1RFU1RJTkdfQ09NTUFORFMsCi0JCQlIQ0lfRU5BQkxFX0FNUF9SRUNFSVZFUl9SRVBPUlRTLAotCQkJc3RhdHVzKTsKLQotCQkvKiAgUmV0dXJuIHBhcmFtZXRlcnMgc3RhcnRzIGZyb20gaGVyZSAqLwotCQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCQlwUmV0UGFyWzBdID0gc3RhdHVzOwkJLyogc3RhdHVzICovCi0JCWxlbiArPSAxOwotCQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCQlidGhjaV9JbmRpY2F0ZUV2ZW50KHBhZGFwdGVyLCBQUGFja2V0SXJwRXZlbnQsIGxlbisyKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9DbWRIb3N0QnVmZmVyU2l6ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0JdTggbG9jYWxCdWZbNl0gPSAiIjsKLQl1OCAqcFJldFBhcjsKLQl1OCBsZW4gPSAwOwotCi0JcEJUSW5mby0+QnRBc29jRW50cnlbcEJ0TWdudC0+Q3VycmVudENvbm5lY3RFbnRyeU51bV0uQUNMUGFja2V0c0RhdGEuQUNMRGF0YVBhY2tldExlbiA9ICooKHUxNiAqKXBIY2lDbWQtPkRhdGEpOwotCXBCVEluZm8tPkJ0QXNvY0VudHJ5W3BCdE1nbnQtPkN1cnJlbnRDb25uZWN0RW50cnlOdW1dLlN5bmNEYXRhUGFja2V0TGVuID0gKigodTggKikocEhjaUNtZC0+RGF0YSsyKSk7Ci0JcEJUSW5mby0+QnRBc29jRW50cnlbcEJ0TWdudC0+Q3VycmVudENvbm5lY3RFbnRyeU51bV0uVG90YWxOdW1BQ0xEYXRhUGFja2V0cyA9ICooKHUxNiAqKShwSGNpQ21kLT5EYXRhKzMpKTsKLQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtwQnRNZ250LT5DdXJyZW50Q29ubmVjdEVudHJ5TnVtXS5Ub3RhbFN5bmNOdW1EYXRhUGFja2V0cyA9ICooKHUxNiAqKShwSGNpQ21kLT5EYXRhKzUpKTsKLQotCS8qIHNlbmQgY29tbWFuZCBjb21wbGV0ZSBldmVudCBoZXJlIHdoZW4gYWxsIGRhdGEgYXJlIHJlY2VpdmVkLiAqLwotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0KLQlsZW4gKz0gYnRoY2lfQ29tbWFuZENvbXBsZXRlSGVhZGVyKCZsb2NhbEJ1ZlswXSwKLQkJT0dGX1NFVF9FVkVOVF9NQVNLX0NPTU1BTkQsCi0JCUhDSV9IT1NUX0JVRkZFUl9TSVpFLAotCQlzdGF0dXMpOwotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVtsZW5dOwotCXBSZXRQYXJbMF0gPSBzdGF0dXM7CQkvKiBzdGF0dXMgKi8KLQlsZW4gKz0gMTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQotCWJ0aGNpX0luZGljYXRlRXZlbnQocGFkYXB0ZXIsIFBQYWNrZXRJcnBFdmVudCwgbGVuKzIpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfVW5rbm93bkNNRChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19VTktOT1dfSENJX0NNRDsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnRVbmtub3duKys7Ci0JYnRoY2lfRXZlbnRDb21tYW5kU3RhdHVzKHBhZGFwdGVyLAotCQkJKHU4KXBIY2lDbWQtPk9HRiwKLQkJCXBIY2lDbWQtPk9DRiwKLQkJCXN0YXR1cyk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9IYW5kbGVPR0ZJbmZvcm1hdGlvbmFsUGFyYW1ldGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCi0Jc3dpdGNoIChwSGNpQ21kLT5PQ0YpIHsKLQljYXNlIEhDSV9SRUFEX0xPQ0FMX1ZFUlNJT05fSU5GT1JNQVRJT046Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTE9DQUxfVkVSU0lPTl9JTkZPUk1BVElPTlxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkTG9jYWxWZXJzaW9uSW5mb3JtYXRpb24ocGFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9DT01NQU5EUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9MT0NBTF9TVVBQT1JURURfQ09NTUFORFNcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZExvY2FsU3VwcG9ydGVkQ29tbWFuZHMocGFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0xPQ0FMX1NVUFBPUlRFRF9GRUFUVVJFUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9MT0NBTF9TVVBQT1JURURfRkVBVFVSRVNcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZExvY2FsU3VwcG9ydGVkRmVhdHVyZXMocGFkYXB0ZXIpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0JVRkZFUl9TSVpFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0JVRkZFUl9TSVpFXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRCdWZmZXJTaXplKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9EQVRBX0JMT0NLX1NJWkU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfREFUQV9CTE9DS19TSVpFXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWREYXRhQmxvY2tTaXplKHBhZGFwdGVyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJidGhjaV9IYW5kbGVPR0ZJbmZvcm1hdGlvbmFsUGFyYW1ldGVycygpLCBVbmtub3duIGNhc2UgPSAweCV4XG4iLCBwSGNpQ21kLT5PQ0YpKTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfVU5LTk9XTl9DT01NQU5EXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX1Vua25vd25DTUQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfSGFuZGxlT0dGU2V0RXZlbnRNYXNrQ01EKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQotCXN3aXRjaCAocEhjaUNtZC0+T0NGKSB7Ci0JY2FzZSBIQ0lfU0VUX0VWRU5UX01BU0s6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1NFVF9FVkVOVF9NQVNLXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFNldEV2ZW50TWFzayhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFU0VUOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRVNFVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZXNldChwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9DT05ORUNUSU9OX0FDQ0VQVF9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRDb25uZWN0aW9uQWNjZXB0VGltZW91dChwYWRhcHRlcik7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1NFVF9FVkVOVF9GSUxURVI6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1NFVF9FVkVOVF9GSUxURVJcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXcml0ZUNvbm5lY3Rpb25BY2NlcHRUaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9QQUdFX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfUEFHRV9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRQYWdlVGltZW91dChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX1BBR0VfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfUEFHRV9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFdyaXRlUGFnZVRpbWVvdXQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9IT1NUX05VTUJFUl9PRl9DT01QTEVURURfUEFDS0VUUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfSE9TVF9OVU1CRVJfT0ZfQ09NUExFVEVEX1BBQ0tFVFNcbiIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfV1JJVEVfTElOS19TVVBFUlZJU0lPTl9USU1FT1VUOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9XUklURV9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kV3JpdGVMaW5rU3VwZXJ2aXNpb25UaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfRU5IQU5DRURfRkxVU0g6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0VOSEFOQ0VEX0ZMVVNIXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZEVuaGFuY2VkRmx1c2gocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0xPR0lDQUxfTElOS19BQ0NFUFRfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZExvZ2ljYWxMaW5rQWNjZXB0VGltZW91dChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX0xPR0lDQUxfTElOS19BQ0NFUFRfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfTE9HSUNBTF9MSU5LX0FDQ0VQVF9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFdyaXRlTG9naWNhbExpbmtBY2NlcHRUaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfU0VUX0VWRU5UX01BU0tfUEFHRV8yOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9TRVRfRVZFTlRfTUFTS19QQUdFXzJcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kU2V0RXZlbnRNYXNrUGFnZTIocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9SRUFEX0xPQ0FUSU9OX0RBVEE6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTE9DQVRJT05fREFUQVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkTG9jYXRpb25EYXRhKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfV1JJVEVfTE9DQVRJT05fREFUQToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfTE9DQVRJT05fREFUQVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXcml0ZUxvY2F0aW9uRGF0YShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfRkxPV19DT05UUk9MX01PREU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfRkxPV19DT05UUk9MX01PREVcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZEZsb3dDb250cm9sTW9kZShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX0ZMT1dfQ09OVFJPTF9NT0RFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9XUklURV9GTE9XX0NPTlRST0xfTU9ERVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXcml0ZUZsb3dDb250cm9sTW9kZShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfQkVTVF9FRkZPUlRfRkxVU0hfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9CRVNUX0VGRk9SVF9GTFVTSF9USU1FT1VUXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRCZXN0RWZmb3J0Rmx1c2hUaW1lb3V0KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfV1JJVEVfQkVTVF9FRkZPUlRfRkxVU0hfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfV1JJVEVfQkVTVF9FRkZPUlRfRkxVU0hfVElNRU9VVFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXcml0ZUJlc3RFZmZvcnRGbHVzaFRpbWVvdXQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9TSE9SVF9SQU5HRV9NT0RFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9TSE9SVF9SQU5HRV9NT0RFXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFNob3J0UmFuZ2VNb2RlKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfSE9TVF9CVUZGRVJfU0laRToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfSE9TVF9CVUZGRVJfU0laRVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRIb3N0QnVmZmVyU2l6ZShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiYnRoY2lfSGFuZGxlT0dGU2V0RXZlbnRNYXNrQ01EKCksIFVua25vd24gY2FzZSA9IDB4JXhcbiIsIHBIY2lDbWQtPk9DRikpOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9VTktOT1dOX0NPTU1BTkRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfVW5rbm93bkNNRChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgZW51bSBoY2lfc3RhdHVzCi1idGhjaV9IYW5kbGVPR0ZTdGF0dXNQYXJhbWV0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQpCi17Ci0JZW51bSBoY2lfc3RhdHVzIHN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQotCXN3aXRjaCAocEhjaUNtZC0+T0NGKSB7Ci0JY2FzZSBIQ0lfUkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0ZBSUxFRF9DT05UQUNUX0NPVU5URVJcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZEZhaWxlZENvbnRhY3RDb3VudGVyKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVTRVRfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUjoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVTRVRfRkFJTEVEX0NPTlRBQ1RfQ09VTlRFUlxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZXNldEZhaWxlZENvbnRhY3RDb3VudGVyKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfUkVBRF9MSU5LX1FVQUxJVFk6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTElOS19RVUFMSVRZXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFJlYWRMaW5rUXVhbGl0eShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfUlNTSToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfUkVBRF9SU1NJXG4iKSk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfTE9DQUxfQU1QX0lORk86Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1JFQURfTE9DQUxfQU1QX0lORk9cbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kUmVhZExvY2FsQU1QSW5mbyhwYWRhcHRlcik7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1JFQURfTE9DQUxfQU1QX0FTU09DOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9SRUFEX0xPQ0FMX0FNUF9BU1NPQ1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRSZWFkTG9jYWxBTVBBc3NvYyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dSSVRFX1JFTU9URV9BTVBfQVNTT0M6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1dSSVRFX1JFTU9URV9BTVBfQVNTT0NcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kV3JpdGVSZW1vdGVBTVBBc3NvYyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiYnRoY2lfSGFuZGxlT0dGU3RhdHVzUGFyYW1ldGVycygpLCBVbmtub3duIGNhc2UgPSAweCV4XG4iLCBwSGNpQ21kLT5PQ0YpKTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfVU5LTk9XTl9DT01NQU5EXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX1Vua25vd25DTUQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfSGFuZGxlT0dGTGlua0NvbnRyb2xDTUQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0KLQlzd2l0Y2ggKHBIY2lDbWQtPk9DRikgewotCWNhc2UgSENJX0NSRUFURV9QSFlTSUNBTF9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9DUkVBVEVfUEhZU0lDQUxfTElOS1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRDcmVhdGVQaHlzaWNhbExpbmsocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9BQ0NFUFRfUEhZU0lDQUxfTElOSzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfQUNDRVBUX1BIWVNJQ0FMX0xJTktcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kQWNjZXB0UGh5c2ljYWxMaW5rKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfRElTQ09OTkVDVF9QSFlTSUNBTF9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9ESVNDT05ORUNUX1BIWVNJQ0FMX0xJTktcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kRGlzY29ubmVjdFBoeXNpY2FsTGluayhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0NSRUFURV9MT0dJQ0FMX0xJTks6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0NSRUFURV9MT0dJQ0FMX0xJTktcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kQ3JlYXRlTG9naWNhbExpbmsocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9BQ0NFUFRfTE9HSUNBTF9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9BQ0NFUFRfTE9HSUNBTF9MSU5LXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZEFjY2VwdExvZ2ljYWxMaW5rKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTks6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0RJU0NPTk5FQ1RfTE9HSUNBTF9MSU5LXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZERpc2Nvbm5lY3RMb2dpY2FsTGluayhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0xPR0lDQUxfTElOS19DQU5DRUw6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0xPR0lDQUxfTElOS19DQU5DRUxcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kTG9naWNhbExpbmtDYW5jZWwocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9GTE9XX1NQRUNfTU9ESUZZOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9GTE9XX1NQRUNfTU9ESUZZXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZEZsb3dTcGVjTW9kaWZ5KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJidGhjaV9IYW5kbGVPR0ZMaW5rQ29udHJvbENNRCgpLCBVbmtub3duIGNhc2UgPSAweCV4XG4iLCBwSGNpQ21kLT5PQ0YpKTsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfVU5LTk9XTl9DT01NQU5EXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX1Vua25vd25DTUQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGVudW0gaGNpX3N0YXR1cwotYnRoY2lfSGFuZGxlT0dGVGVzdGluZ0NNRChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCkKLXsKLQllbnVtIGhjaV9zdGF0dXMgc3RhdHVzID0gSENJX1NUQVRVU19TVUNDRVNTOwotCXN3aXRjaCAocEhjaUNtZC0+T0NGKSB7Ci0JY2FzZSBIQ0lfRU5BQkxFX0RFVklDRV9VTkRFUl9URVNUX01PREU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0VOQUJMRV9ERVZJQ0VfVU5ERVJfVEVTVF9NT0RFXG4iKSk7Ci0JCWJ0aGNpX0NtZEVuYWJsZURldmljZVVuZGVyVGVzdE1vZGUocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9BTVBfVEVTVF9FTkQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX0FNUF9URVNUX0VORFxuIikpOwotCQlidGhjaV9DbWRBTVBUZXN0RW5kKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfQU1QX1RFU1RfQ09NTUFORDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfQU1QX1RFU1RfQ09NTUFORFxuIikpOwotCQlidGhjaV9DbWRBTVBUZXN0Q29tbWFuZChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0VOQUJMRV9BTVBfUkVDRUlWRVJfUkVQT1JUUzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0lfRU5BQkxFX0FNUF9SRUNFSVZFUl9SRVBPUlRTXG4iKSk7Ci0JCWJ0aGNpX0NtZEVuYWJsZUFNUFJlY2VpdmVyUmVwb3J0cyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiSENJX1VOS05PV05fQ09NTUFORFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9Vbmtub3duQ01EKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBlbnVtIGhjaV9zdGF0dXMKLWJ0aGNpX0hhbmRsZU9HRkV4dGVuc2lvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHN0cnVjdCBwYWNrZXRfaXJwX2hjaWNtZF9kYXRhICpwSGNpQ21kKQotewotCWVudW0gaGNpX3N0YXR1cyBzdGF0dXMgPSBIQ0lfU1RBVFVTX1NVQ0NFU1M7Ci0Jc3dpdGNoIChwSGNpQ21kLT5PQ0YpIHsKLQljYXNlIEhDSV9TRVRfQUNMX0xJTktfREFUQV9GTE9XX01PREU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9TRVRfQUNMX0xJTktfREFUQV9GTE9XX01PREVcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kU2V0QUNMTGlua0RhdGFGbG93TW9kZShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1NFVF9BQ0xfTElOS19TVEFUVVM6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9TRVRfQUNMX0xJTktfU1RBVFVTXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFNldEFDTExpbmtTdGF0dXMocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9TRVRfU0NPX0xJTktfU1RBVFVTOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfU0VUX1NDT19MSU5LX1NUQVRVU1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRTZXRTQ09MaW5rU3RhdHVzKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfU0VUX1JTU0lfVkFMVUU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVF9QRVJJT0RJQ0FMLCAoIkhDSV9TRVRfUlNTSV9WQUxVRVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRTZXRSU1NJVmFsdWUocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9TRVRfQ1VSUkVOVF9CTFVFVE9PVEhfU1RBVFVTOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfU0VUX0NVUlJFTlRfQkxVRVRPT1RIX1NUQVRVU1xuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRTZXRDdXJyZW50Qmx1ZXRvb3RoU3RhdHVzKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JLyogVGhlIGZvbGxvd2luZyBpcyBmb3IgUlRLODcyMyAqLwotCi0JY2FzZSBIQ0lfRVhURU5TSU9OX1ZFUlNJT05fTk9USUZZOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfRVhURU5TSU9OX1ZFUlNJT05fTk9USUZZXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZEV4dGVuc2lvblZlcnNpb25Ob3RpZnkocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9MSU5LX1NUQVRVU19OT1RJRlk6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9MSU5LX1NUQVRVU19OT1RJRllcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfQ21kTGlua1N0YXR1c05vdGlmeShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX0JUX09QRVJBVElPTl9OT1RJRlk6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9CVF9PUEVSQVRJT05fTk9USUZZXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZEJ0T3BlcmF0aW9uTm90aWZ5KHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIQ0lfRU5BQkxFX1dJRklfU0NBTl9OT1RJRlk6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9FTkFCTEVfV0lGSV9TQ0FOX05PVElGWVxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRFbmFibGVXaWZpU2Nhbk5vdGlmeShwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCi0JLyogVGhlIGZvbGxvd2luZyBpcyBmb3IgSVZUICovCi0JY2FzZSBIQ0lfV0lGSV9DVVJSRU5UX0NIQU5ORUw6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9XSUZJX0NVUlJFTlRfQ0hBTk5FTFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXSUZJQ3VycmVudENoYW5uZWwocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQljYXNlIEhDSV9XSUZJX0NVUlJFTlRfQkFORFdJRFRIOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfV0lGSV9DVVJSRU5UX0JBTkRXSURUSFxuIikpOwotCQlzdGF0dXMgPSBidGhjaV9DbWRXSUZJQ3VycmVudEJhbmR3aWR0aChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgSENJX1dJRklfQ09OTkVDVElPTl9TVEFUVVM6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIkhDSV9XSUZJX0NPTk5FQ1RJT05fU1RBVFVTXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX0NtZFdJRklDb25uZWN0aW9uU3RhdHVzKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0VYVCwgKCJIQ0lfVU5LTk9XTl9DT01NQU5EXG4iKSk7Ci0JCXN0YXR1cyA9IGJ0aGNpX1Vua25vd25DTUQocGFkYXB0ZXIsIHBIY2lDbWQpOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX1N0YXRlU3RhcnRpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgIGVudW0gaGNpX3N0YXRlX3dpdGhfY21kIFN0YXRlQ21kLCB1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJbQlQgc3RhdGVdLCBbU3RhcnRpbmddLCAiKSk7Ci0Jc3dpdGNoIChTdGF0ZUNtZCkgewotCWNhc2UgU1RBVEVfQ01EX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVFxuIikpOwotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVDsKLQkJcEJ0TWdudC0+Yk5lZWROb3RpZnlBTVBOb0NhcCA9IHRydWU7Ci0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTks6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOS1xuIikpOwotCi0JCWJ0aGNpX0V2ZW50RGlzY29ubmVjdFBoeUxpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJSENJX1NUQVRVU19TVUNDRVNTLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0Rpc2Nvbm5lY3RSZWFzb24sCi0JCUVudHJ5TnVtKTsKLQotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lKb2luVGltZW91dFRpbWVyKTsKLQotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0KLQkJQlRIQ0lfRGlzY29ubmVjdFBlZXIocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfTUFDX1NUQVJUX0NPTVBMRVRFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX01BQ19TVEFSVF9DT01QTEVURVxuIikpOwotCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfQ1JFQVRPUikKLQkJCWJ0aGNpX0V2ZW50Q2hhbm5lbFNlbGVjdGVkKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTdGF0ZSBjb21tYW5kKCVkKSBpcyBXcm9uZyAhISFcbiIsIFN0YXRlQ21kKSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX1N0YXRlQ29ubmVjdGluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICBlbnVtIGhjaV9zdGF0ZV93aXRoX2NtZCBTdGF0ZUNtZCwgdTggRW50cnlOdW0pCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIHN0YXRlXSwgW0Nvbm5lY3RpbmddLCAiKSk7Ci0Jc3dpdGNoIChTdGF0ZUNtZCkgewotCWNhc2UgU1RBVEVfQ01EX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVFxuIikpOwotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVDsKLQkJcEJ0TWdudC0+Yk5lZWROb3RpZnlBTVBOb0NhcCA9IHRydWU7Ci0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX01BQ19DT05ORUNUX0NPTVBMRVRFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX01BQ19DT05ORUNUX0NPTVBMRVRFXG4iKSk7Ci0KLQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BTVBSb2xlID09IEFNUF9CVEFQX0pPSU5FUikgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiU3RhdGVDb25uZWN0aW5nXG4iKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTktcbiIpKTsKLQotCQlidGhjaV9FdmVudERpc2Nvbm5lY3RQaHlMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCUhDSV9TVEFUVVNfU1VDQ0VTUywKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtEaXNjb25uZWN0UmVhc29uLAotCQlFbnRyeU51bSk7Ci0KLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeXNMaW5rQ29tcGxldGVTdGF0dXMgPSBIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lEOwotCi0JCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSUpvaW5UaW1lb3V0VGltZXIpOwotCi0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0KLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfTUFDX0NPTk5FQ1RfQ0FOQ0VMX0lORElDQVRFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURVxuIikpOwotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfQ09OVFJPTExFUl9CVVNZOwotCQkvKiAgQmVjYXVzZSB0aGlzIHN0YXRlIGNtZCBpcyBjYXVzZWQgYnkgdGhlIEJUSENJX0V2ZW50QU1QU3RhdHVzQ2hhbmdlKCksICovCi0JCS8qICB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgZXZlbnQgaW4gdGhlIGZvbGxvd2luZyBCVEhDSV9EaXNjb25uZWN0UGVlcigpIGFnYWluLiAqLwotCQlwQnRNZ250LT5iTmVlZE5vdGlmeUFNUE5vQ2FwID0gZmFsc2U7Ci0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTdGF0ZSBjb21tYW5kKCVkKSBpcyBXcm9uZyAhISFcbiIsIFN0YXRlQ21kKSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX1N0YXRlQ29ubmVjdGVkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgZW51bSBoY2lfc3RhdGVfd2l0aF9jbWQgU3RhdGVDbWQsIHU4IEVudHJ5TnVtKQotewotLypQTUdOVF9JTkZPIHBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggaTsKLQl1MTYgbG9naWNIYW5kbGUgPSAwOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBzdGF0ZV0sIFtDb25uZWN0ZWRdLCAiKSk7Ci0Jc3dpdGNoIChTdGF0ZUNtZCkgewotCWNhc2UgU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTks6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOS1xuIikpOwotCi0JCS8qIFdoZW4gd2UgYXJlIHRyeWluZyB0byBkaXNjb25uZWN0IHRoZSBwaHkgbGluaywgd2Ugc2hvdWxkIGRpc2Nvbm5lY3QgbG9nIGxpbmsgZmlyc3QsICovCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9HSUNBTF9MSU5LX05VTTsgaSsrKSB7Ci0JCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhLT5CdExvZ0xpbmtoYW5kbGUgIT0gMCkgewotCQkJCWxvZ2ljSGFuZGxlID0gcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhLT5CdExvZ0xpbmtoYW5kbGU7Ci0KLQkJCQlidGhjaV9FdmVudERpc2Nvbm5lY3RMb2dpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLCBIQ0lfU1RBVFVTX1NVQ0NFU1MsCi0JCQkJCWxvZ2ljSGFuZGxlLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0Rpc2Nvbm5lY3RSZWFzb24pOwotCi0JCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkxvZ0xpbmtDbWREYXRhLT5CdExvZ0xpbmtoYW5kbGUgPSAwOwotCQkJfQotCQl9Ci0KLQkJYnRoY2lfRXZlbnREaXNjb25uZWN0UGh5TGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQlIQ0lfU1RBVFVTX1NVQ0NFU1MsCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rRGlzY29ubmVjdFJlYXNvbiwKLQkJRW50cnlOdW0pOwotCi0JCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSUpvaW5UaW1lb3V0VGltZXIpOwotCi0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBTVEFURV9DTURfTUFDX0RJU0NPTk5FQ1RfSU5ESUNBVEU6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfTUFDX0RJU0NPTk5FQ1RfSU5ESUNBVEVcbiIpKTsKLQotCQlidGhjaV9FdmVudERpc2Nvbm5lY3RQaHlMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCUhDSV9TVEFUVVNfU1VDQ0VTUywKLQkJLyogIFRPRE86IFJlbW90ZSBIb3N0IG5vdCBsb2NhbCBob3N0ICovCi0JCUhDSV9TVEFUVVNfQ09OTkVDVF9URVJNSU5BVEVfTE9DQUxfSE9TVCwKLQkJRW50cnlOdW0pOwotCQlCVEhDSV9EaXNjb25uZWN0UGVlcihwYWRhcHRlciwgRW50cnlOdW0pOwotCi0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX0VOVEVSX1NUQVRFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0VOVEVSX1NUQVRFXG4iKSk7Ci0KLQkJaWYgKHBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzKSB7Ci0JCQlwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQlQgQ29ubmVjdCBpbiBwcm9ncmVzcyBPRkYhIVxuIikpOwotCQl9Ci0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdEN1cnJlbnRTdGF0ZSA9IEhDSV9TVEFURV9DT05ORUNURUQ7Ci0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iNHdheVN1Y2Nlc3MgPSB0cnVlOwotCQlwQnRNZ250LT5iU3RhcnRTZW5kU3VwZXJ2aXNpb25Qa3QgPSB0cnVlOwotCi0JCS8qICBmb3IgcmF0ZSBhZGFwdGl2ZSAqLwotCi0JCXJ0bDg3MjNhX3VwZGF0ZV9yYW1hc2socGFkYXB0ZXIsCi0JCQkJICAgICAgIE1BWF9GV19TVVBQT1JUX01BQ0lEX05VTS0xLUVudHJ5TnVtLCAwKTsKLQotCQlIYWxTZXRCcmF0ZUNmZzIzYShwYWRhcHRlciwgcGFkYXB0ZXItPm1sbWVwcml2LmN1cl9uZXR3b3JrLm5ldHdvcmsuU3VwcG9ydGVkUmF0ZXMpOwotCQlCVERNX1NldEZ3Q2hubEluZm8ocGFkYXB0ZXIsIFJUX01FRElBX0NPTk5FQ1QpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU3RhdGUgY29tbWFuZCglZCkgaXMgV3JvbmcgISEhXG4iLCBTdGF0ZUNtZCkpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9TdGF0ZUF1dGgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgZW51bSBoY2lfc3RhdGVfd2l0aF9jbWQgU3RhdGVDbWQsCi0JCXU4IEVudHJ5TnVtKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBzdGF0ZV0sIFtBdXRoZW50aWNhdGluZ10sICIpKTsKLQlzd2l0Y2ggKFN0YXRlQ21kKSB7Ci0JY2FzZSBTVEFURV9DTURfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9DT05ORUNUX0FDQ0VQVF9USU1FT1VUXG4iKSk7Ci0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlzTGlua0NvbXBsZXRlU3RhdHVzID0gSENJX1NUQVRVU19DT05ORUNUX0FDQ0VQVF9USU1FT1VUOwotCQlwQnRNZ250LT5iTmVlZE5vdGlmeUFNUE5vQ2FwID0gdHJ1ZTsKLQkJQlRIQ0lfRGlzY29ubmVjdFBlZXIocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOSzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LXG4iKSk7Ci0JCWJ0aGNpX0V2ZW50RGlzY29ubmVjdFBoeUxpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJSENJX1NUQVRVU19TVUNDRVNTLAotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5TGlua0Rpc2Nvbm5lY3RSZWFzb24sCi0JCUVudHJ5TnVtKTsKLQotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfVU5LTk9XX0NPTk5FQ1RfSUQ7Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJnBCVEluZm8tPkJUSENJSm9pblRpbWVvdXRUaW1lcik7Ci0KLQkJQlRIQ0lfRGlzY29ubmVjdFBlZXIocGFkYXB0ZXIsIEVudHJ5TnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfNFdBWV9GQUlMRUQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfNFdBWV9GQUlMRURcbiIpKTsKLQotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cyA9IEhDSV9TVEFUVVNfQVVUSF9GQUlMOwotCQlwQnRNZ250LT5iTmVlZE5vdGlmeUFNUE5vQ2FwID0gdHJ1ZTsKLQotCQlCVEhDSV9EaXNjb25uZWN0UGVlcihwYWRhcHRlciwgRW50cnlOdW0pOwotCi0JCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSUpvaW5UaW1lb3V0VGltZXIpOwotCQlicmVhazsKLQljYXNlIFNUQVRFX0NNRF80V0FZX1NVQ0NFU1NFRDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF80V0FZX1NVQ0NFU1NFRFxuIikpOwotCi0JCWJ0aGNpX0V2ZW50UGh5c2ljYWxMaW5rQ29tcGxldGUocGFkYXB0ZXIsIEhDSV9TVEFUVVNfU1VDQ0VTUywgRW50cnlOdW0sIElOVkFMSURfUExfSEFORExFKTsKLQotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lKb2luVGltZW91dFRpbWVyKTsKLQotCQlCVEhDSV9TTV9XSVRIX0lORk8ocGFkYXB0ZXIsIEhDSV9TVEFURV9DT05ORUNURUQsIFNUQVRFX0NNRF9FTlRFUl9TVEFURSwgRW50cnlOdW0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU3RhdGUgY29tbWFuZCglZCkgaXMgV3JvbmcgISEhXG4iLCBTdGF0ZUNtZCkpOwotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGhjaV9TdGF0ZURpc2Nvbm5lY3Rpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBlbnVtIGhjaV9zdGF0ZV93aXRoX2NtZCBTdGF0ZUNtZCwgdTggRW50cnlOdW0pCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIHN0YXRlXSwgW0Rpc2Nvbm5lY3RpbmddLCAiKSk7Ci0Jc3dpdGNoIChTdGF0ZUNtZCkgewotCWNhc2UgU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURToKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9NQUNfQ09OTkVDVF9DQU5DRUxfSU5ESUNBVEVcbiIpKTsKLQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iTmVlZFBoeXNMaW5rQ29tcGxldGVFdmVudCkgewotCQkJYnRoY2lfRXZlbnRQaHlzaWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uUGh5c0xpbmtDb21wbGV0ZVN0YXR1cywKLQkJCQlFbnRyeU51bSwgSU5WQUxJRF9QTF9IQU5ETEUpOwotCQl9Ci0KLQkJaWYgKHBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzKSB7Ci0JCQlwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBGbGFnXSwgQlQgQ29ubmVjdCBpbiBwcm9ncmVzcyBPRkYhIVxuIikpOwotCQl9Ci0KLQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfRElTQ09OTkVDVEVELCBTVEFURV9DTURfRU5URVJfU1RBVEUsIEVudHJ5TnVtKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFURV9DTURfRElTQ09OTkVDVF9QSFlfTElOSzoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LXG4iKSk7Ci0KLQkJYnRoY2lfRXZlbnREaXNjb25uZWN0UGh5TGlua0NvbXBsZXRlKHBhZGFwdGVyLAotCQlIQ0lfU1RBVFVTX1NVQ0NFU1MsCi0JCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5QaHlMaW5rRGlzY29ubmVjdFJlYXNvbiwKLQkJRW50cnlOdW0pOwotCi0JCWRlbF90aW1lcl9zeW5jKCZwQlRJbmZvLT5CVEhDSUpvaW5UaW1lb3V0VGltZXIpOwotCi0JCUJUSENJX0Rpc2Nvbm5lY3RQZWVyKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTdGF0ZSBjb21tYW5kKCVkKSBpcyBXcm9uZyAhISFcbiIsIFN0YXRlQ21kKSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLWJ0aGNpX1N0YXRlRGlzY29ubmVjdGVkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQllbnVtIGhjaV9zdGF0ZV93aXRoX2NtZCBTdGF0ZUNtZCwgdTggRW50cnlOdW0pCi17Ci0vKlBNR05UX0lORk8gcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9oY2lfaW5mbyAqcEJ0SGNpSW5mbyA9ICZwQlRJbmZvLT5CdEhjaUluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBzdGF0ZV0sIFtEaXNjb25uZWN0ZWRdLCAiKSk7Ci0Jc3dpdGNoIChTdGF0ZUNtZCkgewotCWNhc2UgU1RBVEVfQ01EX0NSRUFURV9QSFlfTElOSzoKLQljYXNlIFNUQVRFX0NNRF9BQ0NFUFRfUEhZX0xJTks6Ci0JCWlmIChTdGF0ZUNtZCA9PSBTVEFURV9DTURfQ1JFQVRFX1BIWV9MSU5LKQotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9DUkVBVEVfUEhZX0xJTktcbiIpKTsKLQkJZWxzZQotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNUQVRFX0NNRF9BQ0NFUFRfUEhZX0xJTktcbiIpKTsKLQotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIFBTXSwgRGlzYWJsZSBJUFMgYW5kIExQU1xuIikpOwotCQlpcHNfbGVhdmUyM2EocGFkYXB0ZXIpOwotCQlMUFNfTGVhdmUyM2EocGFkYXB0ZXIpOwotCi0JCXBCdE1nbnQtPmJQaHlMaW5rSW5Qcm9ncmVzcyA9IHRydWU7Ci0JCXBCdE1nbnQtPkJUQ3VycmVudENvbm5lY3RUeXBlID0gQlRfRElTQ09OTkVDVDsKLQkJcEJ0TWdudC0+Q3VycmVudEJUQ29ubmVjdGlvbkNudCsrOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBDdXJyZW50QlRDb25uZWN0aW9uQ250ID0gJWRcbiIsCi0JCQlwQnRNZ250LT5DdXJyZW50QlRDb25uZWN0aW9uQ250KSk7Ci0JCXBCdE1nbnQtPkJ0T3BlcmF0aW9uT24gPSB0cnVlOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBCdCBPcGVyYXRpb24gT04hISBDdXJyZW50Q29ubmVjdEVudHJ5TnVtID0gJWRcbiIsCi0JCQlwQnRNZ250LT5DdXJyZW50Q29ubmVjdEVudHJ5TnVtKSk7Ci0KLQkJaWYgKHBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzKSB7Ci0JCQlidGhjaV9FdmVudFBoeXNpY2FsTGlua0NvbXBsZXRlKHBhZGFwdGVyLCBIQ0lfU1RBVFVTX0NPTlRST0xMRVJfQlVTWSwgSU5WQUxJRF9FTlRSWV9OVU0sIHBCdE1nbnQtPkJ0Q3VycmVudFBoeUxpbmtoYW5kbGUpOwotCQkJYnRoY2lfUmVtb3ZlRW50cnlCeUVudHJ5TnVtKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoU3RhdGVDbWQgPT0gU1RBVEVfQ01EX0NSRUFURV9QSFlfTElOSykKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5BTVBSb2xlID0gQU1QX0JUQVBfQ1JFQVRPUjsKLQkJZWxzZQotCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFNUFJvbGUgPSBBTVBfQlRBUF9KT0lORVI7Ci0KLQkJLyogIDEuIE1BQyBub3QgeWV0IGluIHNlbGVjdGVkIGNoYW5uZWwgKi8KLQkJd2hpbGUgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BU09DX1NUQVRFfFdJRklfU0lURV9NT05JVE9SKSkgewotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIlNjYW4vUm9hbWluZy9XaWZpIExpbmsgaXMgaW4gUHJvZ3Jlc3MsIHdhaXQgMjAwIG1zXG4iKSk7Ci0JCQltZGVsYXkoMjAwKTsKLQkJfQotCQkvKiAgMi4gTUFDIGFscmVhZHkgaW4gc2VsZWN0ZWQgY2hhbm5lbCAqLwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiQ2hhbm5lbCBpcyBSZWFkeVxuIikpOwotCQltb2RfdGltZXIoJnBCVEluZm8tPkJUSENJSm9pblRpbWVvdXRUaW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMocEJ0SGNpSW5mby0+Q29ubkFjY2VwdFRpbWVvdXQpKTsKLQotCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uYk5lZWRQaHlzTGlua0NvbXBsZXRlRXZlbnQgPSB0cnVlOwotCQlicmVhazsKLQljYXNlIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTktcbiIpKTsKLQotCQlkZWxfdGltZXJfc3luYygmcEJUSW5mby0+QlRIQ0lKb2luVGltZW91dFRpbWVyKTsKLQotCQlidGhjaV9FdmVudERpc2Nvbm5lY3RQaHlMaW5rQ29tcGxldGUocGFkYXB0ZXIsCi0JCUhDSV9TVEFUVVNfU1VDQ0VTUywKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLlBoeUxpbmtEaXNjb25uZWN0UmVhc29uLAotCQlFbnRyeU51bSk7Ci0KLQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iTmVlZFBoeXNMaW5rQ29tcGxldGVFdmVudCkgewotCQkJYnRoY2lfRXZlbnRQaHlzaWNhbExpbmtDb21wbGV0ZShwYWRhcHRlciwKLQkJCQlIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lELAotCQkJCUVudHJ5TnVtLCBJTlZBTElEX1BMX0hBTkRMRSk7Ci0JCX0KLQotCQlpZiAocEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MpIHsKLQkJCXBCdE1nbnQtPmJCVENvbm5lY3RJblByb2dyZXNzID0gZmFsc2U7Ci0JCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBCVCBDb25uZWN0IGluIHByb2dyZXNzIE9GRiEhXG4iKSk7Ci0JCX0KLQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfRElTQ09OTkVDVEVELCBTVEFURV9DTURfRU5URVJfU1RBVEUsIEVudHJ5TnVtKTsKLQkJYnRoY2lfUmVtb3ZlRW50cnlCeUVudHJ5TnVtKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0JCWJyZWFrOwotCWNhc2UgU1RBVEVfQ01EX0VOVEVSX1NUQVRFOgotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiU1RBVEVfQ01EX0VOVEVSX1NUQVRFXG4iKSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTdGF0ZSBjb21tYW5kKCVkKSBpcyBXcm9uZyAhISFcbiIsIFN0YXRlQ21kKSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCBCVEhDSV9FdmVudFBhcnNlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHZvaWQgKnBFdm50RGF0YSwgdTMyIGRhdGFMZW4pCi17Ci19Ci0KLXU4IEJUSENJX0hzQ29ubmVjdGlvbkVzdGFibGlzaGVkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYkJ0Q29ubmVjdGlvbkV4aXN0ID0gZmFsc2U7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJ0aW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1OCBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9CVF9BU09DX0VOVFJZX05VTTsgaSsrKSB7Ci0JCWlmIChwQnRpbmZvLT5CdEFzb2NFbnRyeVtpXS5iNHdheVN1Y2Nlc3MpIHsKLQkJCWJCdENvbm5lY3Rpb25FeGlzdCA9IHRydWU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotLypSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiIEJUSENJX0hzQ29ubmVjdGlvbkVzdGFibGlzaGVkKCksIGNvbm5lY3Rpb24gZXhpc3QgPSAlZFxuIiwgYkJ0Q29ubmVjdGlvbkV4aXN0KSk7ICovCi0KLQlyZXR1cm4gYkJ0Q29ubmVjdGlvbkV4aXN0OwotfQotCi1zdGF0aWMgdTgKLUJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQllbnVtIGJ0X3RyYWZmaWNfbW9kZV9wcm9maWxlIFByb2ZpbGUpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggSXNQUm9maWxlID0gZmFsc2U7Ci0JdTggaSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlOyBpKyspIHsKLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5UcmFmZmljUHJvZmlsZSA9PSBQcm9maWxlKSB7Ci0JCQlJc1BSb2ZpbGUgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gSXNQUm9maWxlOwotfQotCi12b2lkIEJUSENJX1VwZGF0ZUJUUHJvZmlsZVJUS1RvTW90byhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXU4IGkgPSAwOwotCi0JcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGU7IGkrKykgewotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uVHJhZmZpY1Byb2ZpbGUgPSBCVF9QUk9GSUxFX05PTkU7Ci0KLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5CVFByb2ZpbGUgPT0gQlRfUFJPRklMRV9TQ08pCi0JCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZTQ08rKzsKLQotCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uVHJhZmZpY1Byb2ZpbGUgPSBwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRQcm9maWxlOwotCQlzd2l0Y2ggKHBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5UcmFmZmljUHJvZmlsZSkgewotCQljYXNlIEJUX1BST0ZJTEVfU0NPOgotCQkJYnJlYWs7Ci0JCWNhc2UgQlRfUFJPRklMRV9QQU46Ci0JCQlwQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uSW5jb21pbmdUcmFmZmljTW9kZSA9IEJUX01PVE9SX0VYVF9CRTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5PdXRnb2luZ1RyYWZmaWNNb2RlID0gQlRfTU9UT1JfRVhUX0JFOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlRfUFJPRklMRV9BMkRQOgotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkluY29taW5nVHJhZmZpY01vZGUgPSBCVF9NT1RPUl9FWFRfR1VMQjsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5PdXRnb2luZ1RyYWZmaWNNb2RlID0gQlRfTU9UT1JfRVhUX0dVTEI7Ci0JCQlicmVhazsKLQkJY2FzZSBCVF9QUk9GSUxFX0hJRDoKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5JbmNvbWluZ1RyYWZmaWNNb2RlID0gQlRfTU9UT1JfRVhUX0dVTDsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5PdXRnb2luZ1RyYWZmaWNNb2RlID0gQlRfTU9UT1JfRVhUX0JFOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlRLLCBOdW1iZXJPZkhhbmRsZSA9ICVkLCBOdW1iZXJPZlNDTyA9ICVkXG4iLAotCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUsIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZlNDTykpOwotfQotCi12b2lkIEJUSENJX1dpZmlTY2FuTm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNjYW5UeXBlKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iRW5hYmxlV2lmaVNjYW5Ob3RpZnkpCi0JCWJ0aGNpX0V2ZW50RXh0V2lmaVNjYW5Ob3RpZnkocGFkYXB0ZXIsIHNjYW5UeXBlKTsKLX0KLQotdm9pZAotQlRIQ0lfU3RhdGVNYWNoaW5lKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JdTggCQlTdGF0ZVRvRW50ZXIsCi0JZW51bSBoY2lfc3RhdGVfd2l0aF9jbWQJCVN0YXRlQ21kLAotCXU4IAkJRW50cnlOdW0KLQkpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAoRW50cnlOdW0gPT0gMHhmZikgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiIFN0YXRlTWFjaGluZSwgZXJyb3IgRW50cnlOdW0gPSAweCV4IFxuIiwgRW50cnlOdW0pKTsKLQkJcmV0dXJuOwotCX0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiIFN0YXRlTWFjaGluZSwgRW50cnlOdW0gPSAweCV4LCBDdXJyZW50U3RhdGUgPSAweCV4LCBCdE5leHRTdGF0ZSA9IDB4JXgsICBTdGF0ZUNtZCA9IDB4JXggLCBTdGF0ZVRvRW50ZXIgPSAweCV4XG4iLAotCQlFbnRyeU51bSwgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0Q3VycmVudFN0YXRlLCBwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnROZXh0U3RhdGUsIFN0YXRlQ21kLCBTdGF0ZVRvRW50ZXIpKTsKLQotCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnROZXh0U3RhdGUgJiBTdGF0ZVRvRW50ZXIpIHsKLQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0Q3VycmVudFN0YXRlID0gU3RhdGVUb0VudGVyOwotCi0JCXN3aXRjaCAoU3RhdGVUb0VudGVyKSB7Ci0JCWNhc2UgSENJX1NUQVRFX1NUQVJUSU5HOgotCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0TmV4dFN0YXRlID0gSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkcgfCBIQ0lfU1RBVEVfQ09OTkVDVElORzsKLQkJCWJ0aGNpX1N0YXRlU3RhcnRpbmcocGFkYXB0ZXIsIFN0YXRlQ21kLCBFbnRyeU51bSk7Ci0JCQlicmVhazsKLQkJY2FzZSBIQ0lfU1RBVEVfQ09OTkVDVElORzoKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdE5leHRTdGF0ZSA9IEhDSV9TVEFURV9DT05ORUNUSU5HIHwgSENJX1NUQVRFX0RJU0NPTk5FQ1RJTkcgfCBIQ0lfU1RBVEVfQVVUSEVOVElDQVRJTkc7Ci0JCQlidGhjaV9TdGF0ZUNvbm5lY3RpbmcocGFkYXB0ZXIsIFN0YXRlQ21kLCBFbnRyeU51bSk7Ci0JCQlicmVhazsKLQkJY2FzZSBIQ0lfU1RBVEVfQVVUSEVOVElDQVRJTkc6Ci0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnROZXh0U3RhdGUgPSBIQ0lfU1RBVEVfRElTQ09OTkVDVElORyB8IEhDSV9TVEFURV9DT05ORUNURUQ7Ci0JCQlidGhjaV9TdGF0ZUF1dGgocGFkYXB0ZXIsIFN0YXRlQ21kLCBFbnRyeU51bSk7Ci0JCQlicmVhazsKLQkJY2FzZSBIQ0lfU1RBVEVfQ09OTkVDVEVEOgotCQkJcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJ0TmV4dFN0YXRlID0gSENJX1NUQVRFX0NPTk5FQ1RFRCB8IEhDSV9TVEFURV9ESVNDT05ORUNUSU5HOwotCQkJYnRoY2lfU3RhdGVDb25uZWN0ZWQocGFkYXB0ZXIsIFN0YXRlQ21kLCBFbnRyeU51bSk7Ci0JCQlicmVhazsKLQkJY2FzZSBIQ0lfU1RBVEVfRElTQ09OTkVDVElORzoKLQkJCXBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5CdE5leHRTdGF0ZSA9IEhDSV9TVEFURV9ESVNDT05ORUNURUQgfCBIQ0lfU1RBVEVfRElTQ09OTkVDVElORzsKLQkJCWJ0aGNpX1N0YXRlRGlzY29ubmVjdGluZyhwYWRhcHRlciwgU3RhdGVDbWQsIEVudHJ5TnVtKTsKLQkJCWJyZWFrOwotCQljYXNlIEhDSV9TVEFURV9ESVNDT05ORUNURUQ6Ci0JCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uQnROZXh0U3RhdGUgPSBIQ0lfU1RBVEVfRElTQ09OTkVDVEVEIHwgSENJX1NUQVRFX1NUQVJUSU5HIHwgSENJX1NUQVRFX0NPTk5FQ1RJTkc7Ci0JCQlidGhjaV9TdGF0ZURpc2Nvbm5lY3RlZChwYWRhcHRlciwgU3RhdGVDbWQsIEVudHJ5TnVtKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIiBTdGF0ZU1hY2hpbmUsIFVua25vd24gc3RhdGUgdG8gZW50ZXIhISFcbiIpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIiBTdGF0ZU1hY2hpbmUsIFdyb25nIHN0YXRlIHRvIGVudGVyXG4iKSk7Ci0JfQotCi0JLyogIDIwMTAwMzI1IEpvc2VwaDogRGlzYWJsZS9FbmFibGUgSVBTL0xQUyBhY2NvcmRpbmcgdG8gQlQgc3RhdHVzLiAqLwotCWlmICghcEJ0TWdudC0+YkJUQ29ubmVjdEluUHJvZ3Jlc3MgJiYgIXBCdE1nbnQtPkJ0T3BlcmF0aW9uT24pIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIltCVCBQU10sIGlwc19lbnRlcjIzYSgpXG4iKSk7Ci0JCWlwc19lbnRlcjIzYShwYWRhcHRlcik7Ci0JfQotfQotCi12b2lkIEJUSENJX0Rpc2Nvbm5lY3RQZWVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEVudHJ5TnVtKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCIgQlRIQ0lfRGlzY29ubmVjdFBlZXIoKVxuIikpOwotCi0JQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfRElTQ09OTkVDVElORywgU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURSwgRW50cnlOdW0pOwotCi0JaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXS5iVXNlZCkgewotLypCVFBLVF9TZW5kRGVhdXRoZW50aWNhdGlvbihwYWRhcHRlciwgcEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkJUUmVtb3RlTUFDQWRkciwgdW5zcGVjX3JlYXNvbik7IG5vdCBwb3J0aW5nIHlldCAqLwotCX0KLQotCWlmIChwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcykgewotCQlwQnRNZ250LT5iQlRDb25uZWN0SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEZsYWddLCBCVCBDb25uZWN0IGluIHByb2dyZXNzIE9GRiEhXG4iKSk7Ci0JfQotCi0JYnRoY2lfUmVtb3ZlRW50cnlCeUVudHJ5TnVtKHBhZGFwdGVyLCBFbnRyeU51bSk7Ci0KLQlpZiAocEJ0TWdudC0+Yk5lZWROb3RpZnlBTVBOb0NhcCkgewotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfU1RBVEUsICgiW0JUIEFNUFN0YXR1c10sIHNldCB0byBpbnZhbGlkIGluIEJUSENJX0Rpc2Nvbm5lY3RQZWVyKClcbiIpKTsKLQkJQlRIQ0lfRXZlbnRBTVBTdGF0dXNDaGFuZ2UocGFkYXB0ZXIsIEFNUF9TVEFUVVNfTk9fQ0FQQUNJVFlfRk9SX0JUKTsKLQl9Ci19Ci0KLXZvaWQgQlRIQ0lfRXZlbnROdW1PZkNvbXBsZXRlZERhdGFCbG9ja3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLS8qUE1HTlRfSU5GTyBwTWdudEluZm8gPSAmcGFkYXB0ZXItPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvICpwQnRIY2lJbmZvID0gJnBCVEluZm8tPkJ0SGNpSW5mbzsKLQl1OCBsb2NhbEJ1ZltUbXBMb2NhbEJ1ZlNpemVdID0gIiI7Ci0JdTggKnBSZXRQYXIsICpwVHJpcGxlOwotCXU4IGxlbiA9IDAsIGksIGosIGhhbmRsZU51bSA9IDA7Ci0Jc3RydWN0IHBhY2tldF9pcnBfaGNpZXZlbnRfZGF0YSAqUFBhY2tldElycEV2ZW50OwotCXUxNiAqcHUyVGVtcCwgKnBQYWNrZXRzLCAqcEhhbmRsZSwgKnBEYmxvY2tzOwotCXU4IHNlbnQgPSAwOwotCi0JUFBhY2tldElycEV2ZW50ID0gKHN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgKikoJmxvY2FsQnVmWzBdKTsKLQotCWlmICghKHBCdEhjaUluZm8tPkJURXZlbnRNYXNrUGFnZTIgJiBFTVAyX0hDSV9FVkVOVF9OVU1fT0ZfQ09NUExFVEVfREFUQV9CTE9DS1MpKSB7Ci0JCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVCwgKCJbQlQgZXZlbnRdLCBOdW0gT2YgQ29tcGxldGVkIERhdGFCbG9ja3MsIElnbm9yZSB0byBzZW5kIE51bU9mQ29tcGxldGVkRGF0YUJsb2Nrc0V2ZW50IGR1ZSB0byBldmVudCBtYXNrIHBhZ2UgMlxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVswXTsKLQlwVHJpcGxlID0gJnBSZXRQYXJbM107Ci0JZm9yIChqID0gMDsgaiA8IE1BWF9CVF9BU09DX0VOVFJZX05VTTsgaisrKSB7Ci0KLQkJZm9yIChpID0gMDsgaSA8IE1BWF9MT0dJQ0FMX0xJTktfTlVNOyBpKyspIHsKLQkJCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGUpIHsKLQkJCQloYW5kbGVOdW0rKzsKLQkJCQlwSGFuZGxlID0gKHUxNiAqKSZwVHJpcGxlWzBdOwkvKiAgSGFuZGxlW2ldICovCi0JCQkJcFBhY2tldHMgPSAodTE2ICopJnBUcmlwbGVbMl07CS8qICBOdW1fT2ZfQ29tcGxldGVkX1BhY2tldHNbaV0gKi8KLQkJCQlwRGJsb2NrcyA9ICh1MTYgKikmcFRyaXBsZVs0XTsJLyogIE51bV9PZl9Db21wbGV0ZWRfQmxvY2tzW2ldICovCi0JCQkJKnBIYW5kbGUgPSBwQlRJbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5CdExvZ0xpbmtoYW5kbGU7Ci0JCQkJKnBQYWNrZXRzID0gKHUxNilwQlRJbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5UeFBhY2tldENvdW50OwotCQkJCSpwRGJsb2NrcyA9ICh1MTYpcEJUSW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uVHhQYWNrZXRDb3VudDsKLQkJCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbal0uTG9nTGlua0NtZERhdGFbaV0uVHhQYWNrZXRDb3VudCkgewotCQkJCQlzZW50ID0gMTsKLQkJCQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0VWRU5UX0RFVEFJTCwKLQkJCQkJCSgiW0JUIGV2ZW50XSwgTnVtIE9mIENvbXBsZXRlZCBEYXRhQmxvY2tzLCBIYW5kbGUgPSAweCV4LCBOdW1fT2ZfQ29tcGxldGVkX1BhY2tldHMgPSAweCV4LCBOdW1fT2ZfQ29tcGxldGVkX0Jsb2NrcyA9IDB4JXhcbiIsCi0JCQkJCSpwSGFuZGxlLCAqcFBhY2tldHMsICpwRGJsb2NrcykpOwotCQkJCX0KLQkJCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtqXS5Mb2dMaW5rQ21kRGF0YVtpXS5UeFBhY2tldENvdW50ID0gMDsKLQkJCQlsZW4gKz0gNjsKLQkJCQlwVHJpcGxlICs9IGxlbjsKLQkJCX0KLQkJfQotCX0KLQotCXBSZXRQYXJbMl0gPSBoYW5kbGVOdW07CQkJCS8qICBOdW1iZXJfb2ZfSGFuZGxlcyAqLwotCWxlbiArPSAxOwotCXB1MlRlbXAgPSAodTE2ICopJnBSZXRQYXJbMF07Ci0JKnB1MlRlbXAgPSBCVFRvdGFsRGF0YUJsb2NrTnVtOwotCWxlbiArPSAyOwotCi0JUFBhY2tldElycEV2ZW50LT5FdmVudENvZGUgPSBIQ0lfRVZFTlRfTlVNX09GX0NPTVBMRVRFX0RBVEFfQkxPQ0tTOwotCVBQYWNrZXRJcnBFdmVudC0+TGVuZ3RoID0gbGVuOwotCWlmIChoYW5kbGVOdW0gJiYgc2VudCkKLQkJYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMik7Ci19Ci0KLXZvaWQgQlRIQ0lfRXZlbnRBTVBTdGF0dXNDaGFuZ2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggQU1QX1N0YXR1cykKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICpQUGFja2V0SXJwRXZlbnQ7Ci0JdTggbGVuID0gMDsKLQl1OCBsb2NhbEJ1Zls3XSA9ICIiOwotCXU4ICpwUmV0UGFyOwotCi0JaWYgKEFNUF9TdGF0dXMgPT0gQU1QX1NUQVRVU19OT19DQVBBQ0lUWV9GT1JfQlQpIHsKLQkJcEJ0TWdudC0+QlROZWVkQU1QU3RhdHVzQ2hnID0gdHJ1ZTsKLQkJcEJ0TWdudC0+Yk5lZWROb3RpZnlBTVBOb0NhcCA9IGZhbHNlOwotCi0JCUJUSENJX0Rpc2Nvbm5lY3RBbGwocGFkYXB0ZXIpOwotCX0gZWxzZSBpZiAoQU1QX1N0YXR1cyA9PSBBTVBfU1RBVFVTX0ZVTExfQ0FQQUNJVFlfRk9SX0JUKSB7Ci0JCXBCdE1nbnQtPkJUTmVlZEFNUFN0YXR1c0NoZyA9IGZhbHNlOwotCX0KLQotCVBQYWNrZXRJcnBFdmVudCA9IChzdHJ1Y3QgcGFja2V0X2lycF9oY2lldmVudF9kYXRhICopKCZsb2NhbEJ1ZlswXSk7Ci0JLyogIFJldHVybiBwYXJhbWV0ZXJzIHN0YXJ0cyBmcm9tIGhlcmUgKi8KLQlwUmV0UGFyID0gJlBQYWNrZXRJcnBFdmVudC0+RGF0YVswXTsKLQotCXBSZXRQYXJbMF0gPSAwOwkvKiAgU3RhdHVzICovCi0JbGVuICs9IDE7Ci0JcFJldFBhclsxXSA9IEFNUF9TdGF0dXM7CS8qICBBTVBfU3RhdHVzICovCi0JbGVuICs9IDE7Ci0KLQlQUGFja2V0SXJwRXZlbnQtPkV2ZW50Q29kZSA9IEhDSV9FVkVOVF9BTVBfU1RBVFVTX0NIQU5HRTsKLQlQUGFja2V0SXJwRXZlbnQtPkxlbmd0aCA9IGxlbjsKLQlpZiAoYnRoY2lfSW5kaWNhdGVFdmVudChwYWRhcHRlciwgUFBhY2tldElycEV2ZW50LCBsZW4rMikgPT0gUlRfU1RBVFVTX1NVQ0NFU1MpCi0JCVJUUFJJTlQoRklPQ1RMLCAoSU9DVExfQlRfRVZFTlR8SU9DVExfU1RBVEUpLCAoIltCVCBldmVudF0sIEFNUCBTdGF0dXMgQ2hhbmdlLCBBTVBfU3RhdHVzID0gJWRcbiIsIEFNUF9TdGF0dXMpKTsKLX0KLQotdm9pZCBCVEhDSV9EaXNjb25uZWN0QWxsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQl1OCBpOwotCi0JUlRQUklOVChGSU9DVEwsIElPQ1RMX1NUQVRFLCAoIiBEaXNjb25uZWN0QUxMKClcbiIpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfQlRfQVNPQ19FTlRSWV9OVU07IGkrKykgewotCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbaV0uYjR3YXlTdWNjZXNzKSB7Ci0JCQlCVEhDSV9TTV9XSVRIX0lORk8ocGFkYXB0ZXIsIEhDSV9TVEFURV9DT05ORUNURUQsIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LLCBpKTsKLQkJfSBlbHNlIGlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5iVXNlZCkgewotCQkJaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLkJ0Q3VycmVudFN0YXRlID09IEhDSV9TVEFURV9DT05ORUNUSU5HKSB7Ci0JCQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfQ09OTkVDVElORywgU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURSwgaSk7Ci0JCQl9IGVsc2UgaWYgKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLkJ0Q3VycmVudFN0YXRlID09IEhDSV9TVEFURV9ESVNDT05ORUNUSU5HKSB7Ci0JCQkJQlRIQ0lfU01fV0lUSF9JTkZPKHBhZGFwdGVyLCBIQ0lfU1RBVEVfRElTQ09OTkVDVElORywgU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURSwgaSk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLWVudW0gaGNpX3N0YXR1cwotQlRIQ0lfSGFuZGxlSENJQ01EKAotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0Jc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgKnBIY2lDbWQKLQkpCi17Ci0JZW51bSBoY2lfc3RhdHVzCXN0YXR1cyA9IEhDSV9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTUQsICgiXG4iKSk7Ci0JUlRQUklOVChGSU9DVEwsIChJT0NUTF9CVF9IQ0lDTURfREVUQUlMfElPQ1RMX0JUX0xPR08pLCAoIkhDSSBDb21tYW5kIHN0YXJ0LCBPR0YgPSAweCV4LCBPQ0YgPSAweCV4LCBMZW5ndGggPSAweCV4XG4iLAotCQlwSGNpQ21kLT5PR0YsIHBIY2lDbWQtPk9DRiwgcEhjaUNtZC0+TGVuZ3RoKSk7Ci0JaWYgKHBIY2lDbWQtPkxlbmd0aCkgewotCQlSVFBSSU5UX0RBVEEoRklPQ1RMLCAoSU9DVExfQlRfSENJQ01EX0RFVEFJTHxJT0NUTF9CVF9MT0dPKSwgIkhDSSBDb21tYW5kLCBIZXggRGF0YSA6XG4iLAotCQkJJnBIY2lDbWQtPkRhdGFbMF0sIHBIY2lDbWQtPkxlbmd0aCk7Ci0JfQotCWlmIChwSGNpQ21kLT5PR0YgPT0gT0dGX0VYVEVOU0lPTikgewotCQlpZiAocEhjaUNtZC0+T0NGID09IEhDSV9TRVRfUlNTSV9WQUxVRSkKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9FVkVOVF9QRVJJT0RJQ0FMLCAoIltCVCBjbWRdLCAiKSk7Ci0JCWVsc2UKLQkJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9CVF9IQ0lDTURfRVhULCAoIltCVCBjbWRdLCAiKSk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJbQlQgY21kXSwgIikpOwotCX0KLQotCXBCdERiZy0+ZGJnSGNpSW5mby5oY2lDbWRDbnQrKzsKLQotCXN3aXRjaCAocEhjaUNtZC0+T0dGKSB7Ci0JY2FzZSBMSU5LX0NPTlRST0xfQ09NTUFORFM6Ci0JCXN0YXR1cyA9IGJ0aGNpX0hhbmRsZU9HRkxpbmtDb250cm9sQ01EKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBIT0xEX01PREVfQ09NTUFORDoKLQkJYnJlYWs7Ci0JY2FzZSBPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORDoKLQkJc3RhdHVzID0gYnRoY2lfSGFuZGxlT0dGU2V0RXZlbnRNYXNrQ01EKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBPR0ZfSU5GT1JNQVRJT05BTF9QQVJBTUVURVJTOgotCQlzdGF0dXMgPSBidGhjaV9IYW5kbGVPR0ZJbmZvcm1hdGlvbmFsUGFyYW1ldGVycyhwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgT0dGX1NUQVRVU19QQVJBTUVURVJTOgotCQlzdGF0dXMgPSBidGhjaV9IYW5kbGVPR0ZTdGF0dXNQYXJhbWV0ZXJzKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JY2FzZSBPR0ZfVEVTVElOR19DT01NQU5EUzoKLQkJc3RhdHVzID0gYnRoY2lfSGFuZGxlT0dGVGVzdGluZ0NNRChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCWNhc2UgT0dGX0VYVEVOU0lPTjoKLQkJc3RhdHVzID0gYnRoY2lfSGFuZGxlT0dGRXh0ZW5zaW9uKHBhZGFwdGVyLCBwSGNpQ21kKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJUlRQUklOVChGSU9DVEwsIElPQ1RMX0JUX0hDSUNNRCwgKCJIQ0kgQ29tbWFuZCgpLCBVbmtub3duIE9HRiA9IDB4JXhcbiIsIHBIY2lDbWQtPk9HRikpOwotCQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9VTktOT1dOX0NPTU1BTkRcbiIpKTsKLQkJc3RhdHVzID0gYnRoY2lfVW5rbm93bkNNRChwYWRhcHRlciwgcEhjaUNtZCk7Ci0JCWJyZWFrOwotCX0KLQlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01EX0RFVEFJTCwgKCJIQ0kgQ29tbWFuZCBleGVjdXRpb24gZW5kISFcbiIpKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9NL2J0X2hjaS5jID09PT09ICovCi0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBCdFN0YXRlU3RyaW5nW10gPSB7Ci0JIkJUX0RJU0FCTEVEIiwKLQkiQlRfTk9fQ09OTkVDVElPTiIsCi0JIkJUX0NPTk5FQ1RfSURMRSIsCi0JIkJUX0lOUV9PUl9QQUciLAotCSJCVF9BQ0xfT05MWV9CVVNZIiwKLQkiQlRfU0NPX09OTFlfQlVTWSIsCi0JIkJUX0FDTF9TQ09fQlVTWSIsCi0JIkJUX0FDTF9JTlFfT1JfUEFHIiwKLQkiQlRfU1RBVEVfTk9UX0RFRklORUQiCi19OwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjODcyMzFBbnQuYyA9PT09PSAqLwotCi1zdGF0aWMgdm9pZCBidGRtX1NldEZ3SWdub3JlV2xhbkFjdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiRW5hYmxlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IEgyQ19QYXJhbWV0ZXJbMV0gPSB7MH07Ci0KLQlpZiAoYkVuYWJsZSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEJUIElnbm9yZSBXbGFuX0FjdCAhIVxuIikpOwotCQlIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVCgwKTsJCS8qICBmdW5jdGlvbiBlbmFibGUgKi8KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgZG9uJ3QgaWdub3JlIFdsYW5fQWN0ICEhXG4iKSk7Ci0JfQotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBzZXQgRlcgZm9yIEJUIElnbm9yZSBXbGFuX0FjdCwgd3JpdGUgMHgyNSA9IDB4JTAyeFxuIiwKLQkJSDJDX1BhcmFtZXRlclswXSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgQlRfSUdOT1JFX1dMQU5fQUNUX0VJRCwgMSwgSDJDX1BhcmFtZXRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fTm90aWZ5RndTY2FuKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNjYW5UeXBlKQotewotCXU4IEgyQ19QYXJhbWV0ZXJbMV0gPSB7MH07Ci0KLQlpZiAoc2NhblR5cGUgPT0gdHJ1ZSkKLQkJSDJDX1BhcmFtZXRlclswXSA9IDB4MTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgTm90aWZ5IEZXIGZvciB3aWZpIHNjYW4sIHdyaXRlIDB4M2IgPSAweCUwMnhcbiIsCi0JCUgyQ19QYXJhbWV0ZXJbMF0pKTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIDB4M2IsIDEsIEgyQ19QYXJhbWV0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBidGRtXzFBbnRTZXRQU01vZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICB1OCBlbmFibGUsIHU4IHNtYXJ0cHMsIHU4IG1vZGUpCi17Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdyY3RybDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQ3VycmVudCBMUFMoJXMsICVkKSwgc21hcnRwcyA9JWRcbiIsIGVuYWJsZSA9PSB0cnVlPyJPTiI6Ik9GRiIsIG1vZGUsIHNtYXJ0cHMpKTsKLQotCXB3cmN0cmwgPSAmcGFkYXB0ZXItPnB3cmN0cmxwcml2OwotCi0JaWYgKGVuYWJsZSA9PSB0cnVlKSB7Ci0JCXJ0d19zZXRfcHNfbW9kZTIzYShwYWRhcHRlciwgUFNfTU9ERV9NSU4sIHNtYXJ0cHMsIG1vZGUpOwotCX0gZWxzZSB7Ci0JCXJ0d19zZXRfcHNfbW9kZTIzYShwYWRhcHRlciwgUFNfTU9ERV9BQ1RJVkUsIDAsIDApOwotCQlMUFNfUkZfT05fY2hlY2syM2EocGFkYXB0ZXIsIDEwMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBidGRtXzFBbnRUU0ZTd2l0Y2goc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggZW5hYmxlKQotewotCXU4IG9sZFZhbCwgbmV3VmFsOwotCi0Jb2xkVmFsID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCAweDU1MCk7Ci0KLQlpZiAoZW5hYmxlKQotCQluZXdWYWwgPSBvbGRWYWwgfCBFTl9CQ05fRlVOQ1RJT047Ci0JZWxzZQotCQluZXdWYWwgPSBvbGRWYWwgJiB+RU5fQkNOX0ZVTkNUSU9OOwotCi0JaWYgKG9sZFZhbCAhPSBuZXdWYWwpCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NTUwLCBuZXdWYWwpOwotfQotCi1zdGF0aWMgdTggYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudDsKLQotCWlmICgocEJ0ZG04NzIzLT5iUHJlUHNUZG1hT24gIT0gcEJ0ZG04NzIzLT5iQ3VyUHNUZG1hT24pIHx8Ci0JCShwQnRkbTg3MjMtPnByZVBzVGRtYSAhPSBwQnRkbTg3MjMtPmN1clBzVGRtYSkpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi0vKiAgQmVmb3JlIGVudGVyIFRETUEsIG1ha2Ugc3VyZSBQb3dlciBTYXZpbmcgaXMgZW5hYmxlISAqLwotc3RhdGljIHZvaWQKLWJ0ZG1fMUFudFBzVGRtYSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXU4IGJUdXJuT24sCi0JdTggdHlwZQotCSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQ7Ci0KLQlwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbiA9IGJUdXJuT247Ci0JcEJ0ZG04NzIzLT5jdXJQc1RkbWEgPSB0eXBlOwotCWlmIChiVHVybk9uKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQljYXNlIDE6CS8qICBBMkRQIExldmVsLTEgb3IgRlRQL09QUCAqLwotCQlkZWZhdWx0OgotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIHdpZGUgZHVyYXRpb24gZm9yIFdpRmkgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4ZDMsIDB4MWEsIDB4MWEsIDB4MCwgMHg1OCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAyOgkvKiAgQTJEUCBMZXZlbC0yICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpIHsKLQkJCQkvKiAgbm9ybWFsIGR1cmF0aW9uIGZvciBXaUZpICovCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGQzLCAweDEyLCAweDEyLCAweDAsIDB4NTgpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMzoJLyogIEJUIEZUUC9PUFAgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBub3JtYWwgZHVyYXRpb24gZm9yIFdpRmkgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4ZDMsIDB4MzAsIDB4MDMsIDB4MTAsIDB4NTgpOwotCi0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSA0OgkvKiAgZm9yIHdpZmkgc2NhbiAmIEJUIGlzIGNvbm5lY3RlZCAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIHByb3RlY3QgMyBiZWFjb25zIGluIDMtYmVhY29uIHBlcmlvZCAmIG5vIFR4IHBhdXNlIGF0IEJUIHNsb3QgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4OTMsIDB4MTUsIDB4MDMsIDB4MTQsIDB4MCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSA1OgkvKiAgZm9yIFdpRmkgY29ubmVjdGVkLWJ1c3kgJiBCVCBpcyBOb24tQ29ubmVjdGVkLUlkbGUgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBTQ08gbW9kZSwgQW50IGZpeGVkIGF0IFdpRmksIFdMQU5fQWN0IHRvZ2dsZSAqLwotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHg2MSwgMHgxNSwgMHgwMywgMHgzMSwgMHgwMCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSA5OgkvKiAgQUNMIGhpZ2gtcmV0cnkgdHlwZSAtIDIgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBuYXJyb3cgZHVyYXRpb24gZm9yIFdpRmkgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4ZDMsIDB4YSwgMHhhLCAweDAsIDB4NTgpOyAvKiBuYXJyb3cgZHVyYXRpb24gZm9yIFdpRmkgKi8KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDEwOiAvKiAgZm9yIFdpRmkgY29ubmVjdCBpZGxlICYgQlQgQUNMIGJ1c3kgb3IgV2lGaSBDb25uZWN0ZWQtQnVzeSAmIEJUIGlzIElucXVpcnkgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4MTMsIDB4YSwgMHhhLCAweDAsIDB4NDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTE6IC8qICBBQ0wgaGlnaC1yZXRyeSB0eXBlIC0gMyAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIG5hcnJvdyBkdXJhdGlvbiBmb3IgV2lGaSAqLwotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhkMywgMHgwNSwgMHgwNSwgMHgwMCwgMHg1OCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAxMjogLyogIGZvciBXaUZpIENvbm5lY3RlZC1CdXN5ICYgQlQgaXMgQ29ubmVjdGVkLUlkbGUgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBBbGxvdyBIaWdoLVByaSBCVCAqLwotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhlYiwgMHgwYSwgMHgwMywgMHgzMSwgMHgxOCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAyMDogLyogIFdpRmkgb25seSBidXN5ICwgVERNQSBtb2RlIGZvciBwb3dlciBzYXZpbmcgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4MTMsIDB4MjUsIDB4MjUsIDB4MDAsIDB4MDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjc6IC8qICBXaUZpIERIQ1AvU2l0ZSBTdXJ2ZXkgJiBCVCBTQ08gYnVzeSAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKQotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhhMywgMHgyNSwgMHgwMywgMHgzMSwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyODogLyogIFdpRmkgREhDUC9TaXRlIFN1cnZleSAmIEJUIGlkbGUgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4NjksIDB4MjUsIDB4MDMsIDB4MzEsIDB4MDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjk6IC8qICBXaUZpIERIQ1AvU2l0ZSBTdXJ2ZXkgJiBCVCBBQ0wgYnVzeSAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGViLCAweDFhLCAweDFhLCAweDAxLCAweDE4KTsKLQkJCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzAsIDB4NWFmYTVhZmEpOwotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjNCwgMHg1YWZhNWFmYSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAzMDogLyogIFdpRmkgaWRsZSAmIEJUIElucXVpcnkgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4OTMsIDB4MTUsIDB4MDMsIDB4MTQsIDB4MDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzE6ICAvKiAgQlQgSElEICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGQzLCAweDFhLCAweDFhLCAweDAwLCAweDU4KTsKLQkJCWJyZWFrOwotCQljYXNlIDMyOiAgLyogIEJUIFNDTyAmIElucXVpcnkgKi8KLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkKLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4YWIsIDB4MGEsIDB4MDMsIDB4MTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzM6ICAvKiAgQlQgU0NPICYgV2lGaSBzaXRlIHN1cnZleSAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKQotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhhMywgMHgyNSwgMHgwMywgMHgzMCwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAzNDogIC8qICBCVCBISUQgJiBXaUZpIHNpdGUgc3VydmV5ICovCi0JCQlpZiAoYnRkbV9JczFBbnRQc1RkbWFTdGF0ZUNoYW5nZShwYWRhcHRlcikpCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweGQzLCAweDFhLCAweDFhLCAweDAwLCAweDE4KTsKLQkJCWJyZWFrOwotCQljYXNlIDM1OiAgLyogIEJUIEhJRCAmIFdpRmkgQ29ubmVjdGluZyAqLwotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKQotCQkJCUJURE1fU2V0RnczYShwYWRhcHRlciwgMHhlMywgMHgxYSwgMHgxYSwgMHgwMCwgMHgxOCk7Ci0JCQlicmVhazsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qICBkaXNhYmxlIFBTLVRETUEgKi8KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgODoKLQkJCWlmIChidGRtX0lzMUFudFBzVGRtYVN0YXRlQ2hhbmdlKHBhZGFwdGVyKSkgewotCQkJCS8qICBBbnRlbm5hIGNvbnRyb2wgYnkgUFRBLCAweDg3MCA9IDB4MzEwICovCi0JCQkJQlRETV9TZXRGdzNhKHBhZGFwdGVyLCAweDgsIDB4MCwgMHgwLCAweDAsIDB4MCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAwOgotCQlkZWZhdWx0OgotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIEFudGVubmEgY29udHJvbCBieSBQVEEsIDB4ODcwID0gMHgzMTAgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKLQkJCX0KLQkJCS8qICBTd2l0Y2ggQW50ZW5uYSB0byBCVCAqLwotCQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIDB4ODYwLCAweDIxMCk7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDB4ODYwID0gMHgyMTAsIFN3aXRjaCBBbnRlbm5hIHRvIEJUXG4iKSk7Ci0JCQlicmVhazsKLQkJY2FzZSA5OgotCQkJaWYgKGJ0ZG1fSXMxQW50UHNUZG1hU3RhdGVDaGFuZ2UocGFkYXB0ZXIpKSB7Ci0JCQkJLyogIEFudGVubmEgY29udHJvbCBieSBQVEEsIDB4ODcwID0gMHgzMTAgKi8KLQkJCQlCVERNX1NldEZ3M2EocGFkYXB0ZXIsIDB4MCwgMHgwLCAweDAsIDB4OCwgMHgwKTsKLQkJCX0KLQkJCS8qICBTd2l0Y2ggQW50ZW5uYSB0byBXaUZpICovCi0JCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgMHg4NjAsIDB4MTEwKTsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgMHg4NjAgPSAweDExMCwgU3dpdGNoIEFudGVubmEgdG8gV2lGaVxuIikpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEN1cnJlbnQgVERNQSglcywgJWQpXG4iLAotCQlwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbj8iT04iOiJPRkYiLCBwQnRkbTg3MjMtPmN1clBzVGRtYSkpOwotCi0JLyogIHVwZGF0ZSBwcmUgc3RhdGUgKi8KLQlwQnRkbTg3MjMtPmJQcmVQc1RkbWFPbiA9IHBCdGRtODcyMy0+YkN1clBzVGRtYU9uOwotCXBCdGRtODcyMy0+cHJlUHNUZG1hID0gcEJ0ZG04NzIzLT5jdXJQc1RkbWE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1fYnRkbV8xQW50U2V0UFNURE1BKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJQU0VuLCB1OCBzbWFydHBzLAotCQkgICAgdTggcHNPcHRpb24sIHU4IGJURE1BT24sIHU4IHRkbWFUeXBlKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnB3cmN0cmw7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjM7Ci0JdTggcHNNb2RlOwotCXU4IGJTd2l0Y2hQUzsKLQotCWlmICghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpICYmCi0JICAgIChnZXRfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2KSAhPSBXSUZJX05VTExfU1RBVEUpKSB7Ci0JCWJ0ZG1fMUFudFBzVGRtYShwYWRhcHRlciwgYlRETUFPbiwgdGRtYVR5cGUpOwotCQlyZXR1cm47Ci0JfQotCXBzT3B0aW9uICY9IH5CSVQoMCk7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCSgiW0JUQ29leF0sIFNldCBMUFMoJXMsICVkKSBURE1BKCVzLCAlZClcbiIsCi0JCWJQU0VuID09IHRydWU/Ik9OIjoiT0ZGIiwgcHNPcHRpb24sCi0JCWJURE1BT24gPT0gdHJ1ZT8iT04iOiJPRkYiLCB0ZG1hVHlwZSkpOwotCi0JcHdyY3RybCA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudDsKLQotCWlmIChiUFNFbikgewotCQlpZiAocEJ0ZG04NzIzLT5iV2lGaUhhbHQpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRW5hYmxlIFBTIEZhaWwsIFdpRmkgaW4gSGFsdCEhXG4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAocHdyY3RybC0+YkluU3VzcGVuZCkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFbmFibGUgUFMgRmFpbCwgV2lGaSBpbiBTdXNwZW5kISFcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRW5hYmxlIFBTIEZhaWwsIFdpRmkgZHJpdmVyIHN0b3BwZWQhIVxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVuYWJsZSBQUyBGYWlsLCBXaUZpIFN1cnByaXNlIFJlbW92ZWQhIVxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcHNNb2RlID0gUFNfTU9ERV9NSU47Ci0JfSBlbHNlIHsKLQkJcHNNb2RlID0gUFNfTU9ERV9BQ1RJVkU7Ci0JCXBzT3B0aW9uID0gMDsKLQl9Ci0KLQlpZiAocHNNb2RlICE9IHB3cmN0cmwtPnB3cl9tb2RlKSB7Ci0JCWJTd2l0Y2hQUyA9IHRydWU7Ci0JfSBlbHNlIGlmIChwc01vZGUgIT0gUFNfTU9ERV9BQ1RJVkUpIHsKLQkJaWYgKHBzT3B0aW9uICE9IHB3cmN0cmwtPmJjbl9hbnRfbW9kZSkKLQkJCWJTd2l0Y2hQUyA9IHRydWU7Ci0JCWVsc2UgaWYgKHNtYXJ0cHMgIT0gcHdyY3RybC0+c21hcnRfcHMpCi0JCQliU3dpdGNoUFMgPSB0cnVlOwotCQllbHNlCi0JCQliU3dpdGNoUFMgPSBmYWxzZTsKLQl9IGVsc2UgewotCQliU3dpdGNoUFMgPSBmYWxzZTsKLQl9Ci0KLQlpZiAoYlN3aXRjaFBTKSB7Ci0JCS8qICBkaXNhYmxlIFRETUEgKi8KLQkJaWYgKHBCdGRtODcyMy0+YkN1clBzVGRtYU9uKSB7Ci0JCQlpZiAoIWJURE1BT24pIHsKLQkJCQlidGRtXzFBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCB0ZG1hVHlwZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghcnRsODcyM2FfQlRfZW5hYmxlZChwYWRhcHRlcikgfHwKLQkJCQkgICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmMyaEJ0SW5mbyA9PSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT04pIHx8Ci0JCQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5jMmhCdEluZm8gPT0gQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEUpIHx8Ci0JCQkJICAgICh0ZG1hVHlwZSA9PSAyOSkpCi0JCQkJCWJ0ZG1fMUFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDkpOwotCQkJCWVsc2UKLQkJCQkJYnRkbV8xQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0JCQl9Ci0JCX0KLQotCQkvKiAgY2hhbmdlIFBvd2VyIFNhdmUgU3RhdGUgKi8KLQkJYnRkbV8xQW50U2V0UFNNb2RlKHBhZGFwdGVyLCBiUFNFbiwgc21hcnRwcywgcHNPcHRpb24pOwotCX0KLQotCWJ0ZG1fMUFudFBzVGRtYShwYWRhcHRlciwgYlRETUFPbiwgdGRtYVR5cGUpOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8xQW50U2V0UFNURE1BKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJQU0VuLAotCQkgICB1OCBwc09wdGlvbiwgdTggYlRETUFPbiwgdTggdGRtYVR5cGUpCi17Ci0JX2J0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgYlBTRW4sIDAsIHBzT3B0aW9uLCBiVERNQU9uLCB0ZG1hVHlwZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMUFudFdpZmlQYXJhQWRqdXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJFbmFibGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0xQW50OwotCi0JaWYgKGJFbmFibGUpIHsKLQkJcEJ0ZG04NzIzLT5jdXJXaWZpUGFyYSA9IDE7Ci0JCWlmIChwQnRkbTg3MjMtPnByZVdpZmlQYXJhICE9IHBCdGRtODcyMy0+Y3VyV2lmaVBhcmEpCi0JCQlCVERNX1NldFN3UGVuYWx0eVR4UmF0ZUFkYXB0aXZlKHBhZGFwdGVyLCBCVF9UWF9SQVRFX0FEQVBUSVZFX0xPV19QRU5BTFRZKTsKLQl9IGVsc2UgewotCQlwQnRkbTg3MjMtPmN1cldpZmlQYXJhID0gMjsKLQkJaWYgKHBCdGRtODcyMy0+cHJlV2lmaVBhcmEgIT0gcEJ0ZG04NzIzLT5jdXJXaWZpUGFyYSkKLQkJCUJURE1fU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUocGFkYXB0ZXIsIEJUX1RYX1JBVEVfQURBUFRJVkVfTk9STUFMKTsKLQl9Ci0KLX0KLQotc3RhdGljIHZvaWQgYnRkbV8xQW50UHRhUGFyYVJlbG9hZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCS8qICBQVEEgcGFyYW1ldGVyICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgMHg2Y2MsIDB4MCk7CQkvKiAgMS1BbnQgY29leCAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjOCwgMHhmZmZmKTsJLyogIHdpZmkgYnJlYWsgdGFibGUgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzQsIDB4NTU1NTU1NTUpOwkvKiAgY29leCB0YWJsZSAqLwotCi0JLyogIEFudGVubmEgc3dpdGNoIGNvbnRyb2wgcGFyYW1ldGVyICovCi0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4ODU4LCAweGFhYWFhYWFhKTsKLQlpZiAoSVNfODcyM0FfQV9DVVQoR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+VmVyc2lvbklEKSkgewotCQkvKiAgU1BEVChjb25uZWN0ZWQgd2l0aCBUUlNXKSBjb250cm9sIGJ5IGhhcmR3YXJlIFBUQSAqLwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg4NzAsIDB4MCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NDAsIDB4MjQpOwotCX0gZWxzZSB7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NDAsIDB4MjApOwotCQkvKiAgc2V0IGFudGVubmEgYXQgYnQgc2lkZSBpZiBBTlRTVyBpcyBzb2Z0d2FyZSBjb250cm9sICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCAweDg2MCwgMHgyMTApOwotCQkvKiAgU1BEVChjb25uZWN0ZWQgd2l0aCBUUlNXKSBjb250cm9sIGJ5IGhhcmR3YXJlIFBUQSAqLwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg4NzAsIDB4MzAwKTsKLQkJLyogIEFOVFNXIGtlZXAgYnkgR05UX0JUICovCi0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDg3NCwgMHgyMjgwNDAwMCk7Ci0JfQotCi0JLyogIGNvZXhpc3RlbmNlIHBhcmFtZXRlcnMgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDc3OCwgMHgxKTsJLyogIGVuYWJsZSBSVEsgbW9kZSBQVEEgKi8KLQotCS8qICBCVCBkb24ndCBpZ25vcmUgV0xBTl9BY3QgKi8KLQlidGRtX1NldEZ3SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotfQotCi0vKgotICogUmV0dXJuCi0gKjE6IHVwZ3JhZGUgKGFkZCBXaUZpIGR1cmF0aW9uIHRpbWUpCi0gKjA6IGtlZXAKLSAqLTE6IGRvd25ncmFkZSAoYWRkIEJUIGR1cmF0aW9uIHRpbWUpCi0gKi8KLXN0YXRpYyBzOCBidGRtXzFBbnRUZG1hSnVkZ2VtZW50KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHJldHJ5KQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzOwotCXN0YXRpYyBzOCB1cCwgZG4sIG0gPSAxLCBXYWl0Q291bnQ7Ci0JczggcmV0OwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudDsKLQlyZXQgPSAwOwotCi0JaWYgKHBCdGRtODcyMy0+cHNUZG1hTW9uaXRvckNudCA9PSAwKSB7Ci0JCXVwID0gMDsKLQkJZG4gPSAwOwotCQltID0gMTsKLQkJV2FpdENvdW50ID0gMDsKLQl9IGVsc2UgewotCQlXYWl0Q291bnQrKzsKLQl9Ci0KLQlpZiAocmV0cnkgPT0gMCkgewotCS8qICBubyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbiAqLwotCQl1cCsrOwotCQlkbi0tOwotCQlpZiAoZG4gPCAwKQotCQkJZG4gPSAwOwotCQlpZiAodXAgPj0gMyptKSB7Ci0JCQkvKiAgcmV0cnkgPSAwIGluIGNvbnNlY3V0aXZlIDNtKigycyksIGFkZCBXaUZpIGR1cmF0aW9uICovCi0JCQlyZXQgPSAxOwotCQkJdXAgPSAwOwotCQkJZG4gPSAwOwotCQkJV2FpdENvdW50ID0gMDsKLQkJfQotCX0gZWxzZSBpZiAocmV0cnkgPD0gMykgewotCQkvKiAgcmV0cnk8PSAzIGluIHRoZSBsYXN0IDItc2Vjb25kIGR1cmF0aW9uICovCi0JCXVwLS07Ci0JCWRuKys7Ci0JCWlmICh1cCA8IDApCi0JCQl1cCA9IDA7Ci0KLQkJaWYgKGRuID09IDIpIHsKLQkJCS8qICByZXRyeTw9IDMgaW4gY29uc2VjdXRpdmUgMiooMnMpLCBtaW51cyBXaUZpIGR1cmF0aW9uIChhZGQgQlQgZHVyYXRpb24pICovCi0JCQlyZXQgPSAtMTsKLQotCQkJLyogIHJlY29yZCBob3cgbWFueSB0aW1lIGRvd25ncmFkIFdpRmkgZHVyYXRpb24gKi8KLQkJCWlmIChXYWl0Q291bnQgPD0gMikKLQkJCQltKys7Ci0JCQllbHNlCi0JCQkJbSA9IDE7Ci0JCQkvKiAgdGhlIG1heCBudW1iZXIgb2YgbSBpcyAyMCAqLwotCQkJLyogIHRoZSBsb25nZXN0IHRpbWUgb2YgdXBncmFkZSBXaUZpIGR1cmF0aW9uIGlzIDIwKjMqMnMgPSAxMjBzICovCi0JCQlpZiAobSA+PSAyMCkKLQkJCQltID0gMjA7Ci0JCQl1cCA9IDA7Ci0JCQlkbiA9IDA7Ci0JCQlXYWl0Q291bnQgPSAwOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogIHJldHJ5IGNvdW50ID4gMyAqLwotCQkvKiAgcmV0cnk+MywgbWludXMgV2lGaSBkdXJhdGlvbiAoYWRkIEJUIGR1cmF0aW9uKSAqLwotCQlyZXQgPSAtMTsKLQotCQkvKiAgcmVjb3JkIGhvdyBtYW55IHRpbWUgZG93bmdyYWQgV2lGaSBkdXJhdGlvbiAqLwotCQlpZiAoV2FpdENvdW50ID09IDEpCi0JCQltKys7Ci0JCWVsc2UKLQkJCW0gPSAxOwotCQlpZiAobSA+PSAyMCkKLQkJCW0gPSAyMDsKLQotCQl1cCA9IDA7Ci0JCWRuID0gMDsKLQkJV2FpdENvdW50ID0gMDsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV8xQW50VGRtYUR1cmF0aW9uQWRqdXN0Rm9yQUNMKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0xQW50OwotCi0JaWYgKHBCdGRtODcyMy0+cHNUZG1hR2xvYmFsQ250ICE9IHBCdGRtODcyMy0+cHNUZG1hTW9uaXRvckNudCkgewotCQlwQnRkbTg3MjMtPnBzVGRtYU1vbml0b3JDbnQgPSAwOwotCQlwQnRkbTg3MjMtPnBzVGRtYUdsb2JhbENudCA9IDA7Ci0JfQotCWlmIChwQnRkbTg3MjMtPnBzVGRtYU1vbml0b3JDbnQgPT0gMCkgewotCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIDIpOwotCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDI7Ci0JfSBlbHNlIHsKLQkJLyogIE5vdyB3ZSBvbmx5IGhhdmUgNCBsZXZlbCBQcyBUZG1hLCAqLwotCQkvKiAgaWYgdGhhdCdzIG5vdCB0aGUgZm9sbG93aW5nIDQgbGV2ZWwod2lsbCBjaGFuZ2VkIGJ5IHdpZmkgc2NhbiwgZGhjcC4uLiksICovCi0JCS8qICB0aGVuIHdlIGhhdmUgdG8gYWRqdXN0IGl0IGJhY2sgdG8gdGhlIHByZXZpb3VzIHJlY29yZCBvbmUuICovCi0JCWlmICgocEJ0ZG04NzIzLT5jdXJQc1RkbWEgIT0gMSkgJiYKLQkJICAgIChwQnRkbTg3MjMtPmN1clBzVGRtYSAhPSAyKSAmJgotCQkgICAgKHBCdGRtODcyMy0+Y3VyUHNUZG1hICE9IDkpICYmCi0JCSAgICAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgIT0gMTEpKSB7Ci0JCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIHBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlKTsKLQkJfSBlbHNlIHsKLQkJCXMzMiBqdWRnZTsKLQotCQkJanVkZ2UgPSBidGRtXzFBbnRUZG1hSnVkZ2VtZW50KHBhZGFwdGVyLCBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idFJldHJ5Q250KTsKLQkJCWlmIChqdWRnZSA9PSAtMSkgewotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxKSB7Ci0JCQkJCS8qICBEZWNyZWFzZSBXaUZpIGR1cmF0aW9uIGZvciBoaWdoIEJUIHJldHJ5ICovCi0JCQkJCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idEluZm9FeHQpCi0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDk7Ci0JCQkJCWVsc2UKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMjsKLQkJCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCBwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSk7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAyKSB7Ci0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgOSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gOTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDkpIHsKLQkJCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCAxMSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChqdWRnZSA9PSAxKSB7Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDExKSB7Ci0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgOSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gOTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDkpIHsKLQkJCQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5mb0V4dCkKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gOTsKLQkJCQkJZWxzZQotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIHBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlKTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5mb0V4dCkKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gOTsKLQkJCQkJZWxzZQotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxOwotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIHBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJKCJbQlRDb2V4XSwgQUNMIGN1cnJlbnQgVERNQSglcywgJWQpXG4iLAotCQkJKHBCdGRtODcyMy0+YkN1clBzVGRtYU9uID8gIk9OIiA6ICJPRkYiKSwgcEJ0ZG04NzIzLT5jdXJQc1RkbWEpKTsKLQl9Ci0JcEJ0ZG04NzIzLT5wc1RkbWFNb25pdG9yQ250Kys7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMUFudENvZXhQcm9jZXNzRm9yV2lmaUNvbm5lY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXY7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leDsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjM7Ci0JdTggQnRTdGF0ZTsKLQotCXBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0JcEJ0ZG04NzIzID0gJnBCdENvZXgtPmJ0ZG0xQW50OwotCUJ0U3RhdGUgPSBwQnRDb2V4LT5jMmhCdEluZm87Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFdpRmkgaXMgJXNcbiIsCi0JCQkJQlRETV9Jc1dpZmlCdXN5KHBhZGFwdGVyKT8iQnVzeSI6IklETEUiKSk7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBCVCBpcyAlc1xuIiwKLQkJCQlCdFN0YXRlU3RyaW5nW0J0U3RhdGVdKSk7Ci0KLQlwYWRhcHRlci0+cHdyY3RybHByaXYuYnRjb2V4X3Jmb24gPSBmYWxzZTsKLQotCWlmICghQlRETV9Jc1dpZmlCdXN5KHBhZGFwdGVyKSAmJgotCSAgICAhY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSAmJgotCSAgICAoQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT04gfHwKLQkgICAgIEJ0U3RhdGUgPT0gQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEUpKSB7Ci0JCXN3aXRjaCAoQnRTdGF0ZSkgewotCQljYXNlIEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTjoKLQkJCV9idGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDIsIDB4MjYsIGZhbHNlLCA5KTsKLQkJCWJyZWFrOwotCQljYXNlIEJUX0lORk9fU1RBVEVfQ09OTkVDVF9JRExFOgotCQkJX2J0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMiwgMHgyNiwgZmFsc2UsIDApOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKEJ0U3RhdGUpIHsKLQkJY2FzZSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT046Ci0JCWNhc2UgQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEU6Ci0JCQkvKiAgV2lGaSBpcyBCdXN5ICovCi0JCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLCB0cnVlLCA1KTsKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjMCwgMHg1YTVhNWE1YSk7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHg2YzQsIDB4NWE1YTVhNWEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlRfSU5GT19TVEFURV9BQ0xfSU5RX09SX1BBRzoKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkoIltCVENvZXhdLCBCVCBQUk9GSUxFIGlzICIKLQkJCQkgIkJUX0lORk9fU1RBVEVfQUNMX0lOUV9PUl9QQUdcbiIpKTsKLQkJY2FzZSBCVF9JTkZPX1NUQVRFX0lOUV9PUl9QQUc6Ci0JCQlwYWRhcHRlci0+cHdyY3RybHByaXYuYnRjb2V4X3Jmb24gPSB0cnVlOwotCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCAzMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBCVF9JTkZPX1NUQVRFX1NDT19PTkxZX0JVU1k6Ci0JCWNhc2UgQlRfSU5GT19TVEFURV9BQ0xfU0NPX0JVU1k6Ci0JCQlpZiAodHJ1ZSA9PSBwQnRDb2V4LT5iQzJoQnRJbnF1aXJ5UGFnZSkKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJICAgdHJ1ZSwgMzIpOwotCQkJZWxzZSB7Ci0jaWZkZWYgQlRDT0VYX0NNQ0NfVEVTVAotCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsCi0JCQkJCQkgICB0cnVlLCAyMyk7Ci0jZWxzZSAvKiAgIUJUQ09FWF9DTUNDX1RFU1QgKi8KLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJICAgZmFsc2UsIDgpOwotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjMCwgMHg1YTVhNWE1YSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4NmM0LCAweDVhNWE1YTVhKTsKLSNlbmRpZiAvKiAgIUJUQ09FWF9DTUNDX1RFU1QgKi8KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEJUX0lORk9fU1RBVEVfQUNMX09OTFlfQlVTWToKLQkJCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5idGNvZXhfcmZvbiA9IHRydWU7Ci0JCQlpZiAocEJ0Q29leC0+YzJoQnRQcm9maWxlID09IEJUX0lORk9fSElEKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCQkoIltCVENvZXhdLCBCVCBQUk9GSUxFIGlzIEhJRFxuIikpOwotCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgMzEpOwotCQkJfSBlbHNlIGlmIChwQnRDb2V4LT5jMmhCdFByb2ZpbGUgPT0gQlRfSU5GT19GVFApIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJCSgiW0JUQ29leF0sIEJUIFBST0ZJTEUgaXMgRlRQL09QUFxuIikpOwotCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgMyk7Ci0JCQl9IGVsc2UgaWYgKHBCdENvZXgtPmMyaEJ0UHJvZmlsZSA9PSAoQlRfSU5GT19BMkRQfEJUX0lORk9fRlRQKSkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkJKCJbQlRDb2V4XSwgQlQgUFJPRklMRSBpcyBBMkRQX0ZUUFxuIikpOwotCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwgdHJ1ZSwgMTEpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocEJ0Q29leC0+YzJoQnRQcm9maWxlID09IEJUX0lORk9fQTJEUCkKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCQkJKCJbQlRDb2V4XSwgQlQgUFJPRklMRSBpcyAiCi0JCQkJCQkgIkEyRFBcbiIpKTsKLQkJCQllbHNlCi0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkJCSgiW0JUQ29leF0sIEJUIFBST0ZJTEUgaXMgIgotCQkJCQkJICJVTktOT1dOKDB4JTAyWCkhIFVzZSBBMkRQICIKLQkJCQkJCSAiUHJvZmlsZVxuIiwKLQkJCQkJCSBwQnRDb2V4LT5jMmhCdFByb2ZpbGUpKTsKLQkJCQlidGRtXzFBbnRUZG1hRHVyYXRpb25BZGp1c3RGb3JBQ0wocGFkYXB0ZXIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwQnRkbTg3MjMtPnBzVGRtYUdsb2JhbENudCsrOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8xQW50VXBkYXRlSGFsUkFNYXNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBtYWNfaWQsIHUzMiBmaWx0ZXIpCi17Ci0JdTggaW5pdF9yYXRlID0gMDsKLQl1OCByYWlkLCBhcmc7Ci0JdTMyIG1hc2s7Ci0JdTggc2hvcnRHSXJhdGUgPSBmYWxzZTsKLQlpbnQgc3VwcG9ydFJhdGVOdW0gPSAwOwotCXN0cnVjdCBzdGFfaW5mbwkqcHN0YTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yazsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgJXMsIE1BQ0lEID0lZCwgZmlsdGVyID0gMHglMDh4ISFcbiIsCi0JCQkJX19mdW5jX18sIG1hY19pZCwgZmlsdGVyKSk7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCXBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCWN1cl9uZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQotCWlmIChtYWNfaWQgPj0gTlVNX1NUQSkgeyAvKiBDQU1fU0laRSAqLwotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sICVzLCBNQUNJRCA9JWQgaWxsZWdhbCEhXG4iLAotCQkJCQlfX2Z1bmNfXywgbWFjX2lkKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwc3RhID0gcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLnBzdGE7Ci0JaWYgKCFwc3RhKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgJXMsIENhbid0IGZpbmQgc3RhdGlvbiEhXG4iLAotCQkJCQlfX2Z1bmNfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JcmFpZCA9IHBzdGEtPnJhaWQ7Ci0KLQlzd2l0Y2ggKG1hY19pZCkgewotCWNhc2UgMDovKiAgZm9yIGluZnJhIG1vZGUgKi8KLQkJc3VwcG9ydFJhdGVOdW0gPQotCQkJcnR3X2dldF9yYXRlc2V0X2xlbjIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCQltYXNrID0gdXBkYXRlX3N1cHBvcnRlZF9yYXRlMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkJCXN1cHBvcnRSYXRlTnVtKTsKLQkJbWFzayB8PSAocG1sbWVpbmZvLT5IVF9lbmFibGUpID8KLQkJCXVwZGF0ZV9NU0NfcmF0ZTIzYSgmcG1sbWVpbmZvLT5odF9jYXApOjA7Ci0JCWlmIChzdXBwb3J0X3Nob3J0X0dJMjNhKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5odF9jYXApKQotCQkJc2hvcnRHSXJhdGUgPSB0cnVlOwotCQlicmVhazsKLQljYXNlIDE6LyogZm9yIGJyb2FkY2FzdC9tdWx0aWNhc3QgKi8KLQkJc3VwcG9ydFJhdGVOdW0gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKAotCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLlN1cHBvcnRlZFJhdGVzKTsKLQkJbWFzayA9IHVwZGF0ZV9iYXNpY19yYXRlMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkJICAgIHN1cHBvcnRSYXRlTnVtKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDogLyogZm9yIGVhY2ggc3RhIGluIElCU1MgKi8KLQkJc3VwcG9ydFJhdGVOdW0gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKAotCQkJcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdLlN1cHBvcnRlZFJhdGVzKTsKLQkJbWFzayA9IHVwZGF0ZV9zdXBwb3J0ZWRfcmF0ZTIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsCi0JCQkJCQlzdXBwb3J0UmF0ZU51bSk7Ci0JCWJyZWFrOwotCX0KLQltYXNrIHw9ICgocmFpZDw8MjgpJjB4ZjAwMDAwMDApOwotCW1hc2sgJj0gMHhmZmZmZmZmZjsKLQltYXNrICY9IH5maWx0ZXI7Ci0JaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EobWFzaykmMHgzZjsKLQotCWFyZyA9IG1hY19pZCYweDFmOy8qIE1BQ0lEICovCi0JYXJnIHw9IEJJVCg3KTsKLQlpZiAodHJ1ZSA9PSBzaG9ydEdJcmF0ZSkKLQkJYXJnIHw9IEJJVCg1KTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJKCJbQlRDb2V4XSwgVXBkYXRlIEZXIFJBSUQgZW50cnksIE1BU0sgPSAweCUwOHgsICIKLQkJICJhcmcgPSAweCUwMnhcbiIsIG1hc2ssIGFyZykpOwotCi0JcnRsODcyM2Ffc2V0X3JhaWRfY21kKHBhZGFwdGVyLCBtYXNrLCBhcmcpOwotCi0JcHN0YS0+aW5pdF9yYXRlID0gaW5pdF9yYXRlOwotCXBkbXByaXYtPklOSURBVEFfUkFURVttYWNfaWRdID0gaW5pdF9yYXRlOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8xQW50VXBkYXRlSGFsUkFNYXNrRm9yU0NPKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGZvcmNlVXBkYXRlKQotewotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMzsKLQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2OwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yazsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0JdTMyIG1hY2lkOwotCXUzMiBmaWx0ZXIgPSAwOwotCi0JcEJ0ZG04NzIzID0gJkdFVF9IQUxfREFUQShwYWRhcHRlciktPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQ7Ci0KLQlpZiAocEJ0ZG04NzIzLT5iUkFDaGFuZ2VkID09IHRydWUgJiYgZm9yY2VVcGRhdGUgPT0gZmFsc2UpCi0JCXJldHVybjsKLQotCXBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCWN1cl9uZXR3b3JrID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdi5tbG1leHRfaW5mby5uZXR3b3JrOwotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIGN1cl9uZXR3b3JrLT5NYWNBZGRyZXNzKTsKLQltYWNpZCA9IHBzdGEtPm1hY19pZDsKLQotCWZpbHRlciB8PSBCSVQoXzFNX1JBVEVfKTsKLQlmaWx0ZXIgfD0gQklUKF8yTV9SQVRFXyk7Ci0JZmlsdGVyIHw9IEJJVChfNU1fUkFURV8pOwotCWZpbHRlciB8PSBCSVQoXzExTV9SQVRFXyk7Ci0JZmlsdGVyIHw9IEJJVChfNk1fUkFURV8pOwotCWZpbHRlciB8PSBCSVQoXzlNX1JBVEVfKTsKLQotCWJ0ZG1fMUFudFVwZGF0ZUhhbFJBTWFzayhwYWRhcHRlciwgbWFjaWQsIGZpbHRlcik7Ci0KLQlwQnRkbTg3MjMtPmJSQUNoYW5nZWQgPSB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBidGRtXzFBbnRSZWNvdmVySGFsUkFNYXNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzOwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXY7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1cl9uZXR3b3JrOwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQotCXBCdGRtODcyMyA9ICZHRVRfSEFMX0RBVEEocGFkYXB0ZXIpLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0xQW50OwotCi0JaWYgKHBCdGRtODcyMy0+YlJBQ2hhbmdlZCA9PSBmYWxzZSkKLQkJcmV0dXJuOwotCi0JcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JY3VyX25ldHdvcmsgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2Lm1sbWV4dF9pbmZvLm5ldHdvcms7Ci0JcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgY3VyX25ldHdvcmstPk1hY0FkZHJlc3MpOwotCi0JVXBkYXRlX1JBX0VudHJ5MjNhKHBhZGFwdGVyLCBwc3RhKTsKLQotCXBCdGRtODcyMy0+YlJBQ2hhbmdlZCA9IGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8xQW50QlRTdGF0ZUNoYW5nZUhhbmRsZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIGVudW0gYnRfc3RhdGVfMWFudCBvbGRTdGF0ZSwKLQkJCSAgICAgIGVudW0gYnRfc3RhdGVfMWFudCBuZXdTdGF0ZSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBoYWxkYXRhOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgc3RhdGUgY2hhbmdlLCAlcyA9PiAlc1xuIiwKLQkJCQlCdFN0YXRlU3RyaW5nW29sZFN0YXRlXSwKLQkJCQlCdFN0YXRlU3RyaW5nW25ld1N0YXRlXSkpOwotCi0JLyogIEJUIGRlZmF1bHQgaWdub3JlIHdsYW4gYWN0aXZlLCAqLwotCS8qICBXaUZpIE1VU1QgZGlzYWJsZSB0aGlzIHdoZW4gQlQgaXMgZW5hYmxlICovCi0JaWYgKG5ld1N0YXRlID4gQlRfSU5GT19TVEFURV9ESVNBQkxFRCkKLQkJYnRkbV9TZXRGd0lnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQotCWlmICgoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSAmJgotCSAgICAoQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3QocGFkYXB0ZXIpKSkgewotCQlpZiAoKG5ld1N0YXRlID09IEJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWSkgfHwKLQkJICAgIChuZXdTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9TQ09fQlVTWSkpIHsKLQkJCWJ0ZG1fMUFudFVwZGF0ZUhhbFJBTWFza0ZvclNDTyhwYWRhcHRlciwgZmFsc2UpOwotCQl9IGVsc2UgewotCQkJLyogIFJlY292ZXIgb3JpZ2luYWwgUkEgc2V0dGluZyAqLwotCQkJYnRkbV8xQW50UmVjb3ZlckhhbFJBTWFzayhwYWRhcHRlcik7Ci0JCX0KLQl9IGVsc2UgewotCQlwaGFsZGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JCXBoYWxkYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0xQW50LmJSQUNoYW5nZWQgPSBmYWxzZTsKLQl9Ci0KLQlpZiAob2xkU3RhdGUgPT0gbmV3U3RhdGUpCi0JCXJldHVybjsKLQotCWlmIChvbGRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9PTkxZX0JVU1kpIHsKLQkJc3RydWN0IGhhbF9kYXRhXzg3MjNhICpIYWwgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCQlIYWwtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTFBbnQucHNUZG1hTW9uaXRvckNudCA9IDA7Ci0JCUhhbC0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudC5wc1RkbWFNb25pdG9yQ250Rm9yU0NPID0gMDsKLQl9Ci0KLQlpZiAoKG9sZFN0YXRlID09IEJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWSkgfHwKLQkgICAgKG9sZFN0YXRlID09IEJUX0lORk9fU1RBVEVfQUNMX1NDT19CVVNZKSkgewotCQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKkhhbCA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JCUhhbC0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudC5wc1RkbWFNb25pdG9yQ250Rm9yU0NPID0gMDsKLQl9Ci0KLQkvKiAgQWN0aXZlIDJBbnQgbWVjaGFuaXNtIHdoZW4gQlQgQ29ubmVjdGVkICovCi0JaWYgKChvbGRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0RJU0FCTEVEKSB8fAotCSAgICAob2xkU3RhdGUgPT0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OKSkgewotCQlpZiAoKG5ld1N0YXRlICE9IEJUX0lORk9fU1RBVEVfRElTQUJMRUQpICYmCi0JCSAgICAobmV3U3RhdGUgIT0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OKSkgewotCQkJQlRETV9TZXRTd1JmUnhMcGZDb3JuZXIocGFkYXB0ZXIsCi0JCQkJCQlCVF9SRl9SWF9MUEZfQ09STkVSX1NIUklOSyk7Ci0JCQlCVERNX0FHQ1RhYmxlKHBhZGFwdGVyLCBCVF9BR0NUQUJMRV9PTik7Ci0JCQlCVERNX0JCQmFja09mZkxldmVsKHBhZGFwdGVyLCBCVF9CQl9CQUNLT0ZGX09OKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICgobmV3U3RhdGUgPT0gQlRfSU5GT19TVEFURV9ESVNBQkxFRCkgfHwKLQkJICAgIChuZXdTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT04pKSB7Ci0JCQlCVERNX1NldFN3UmZSeExwZkNvcm5lcihwYWRhcHRlciwKLQkJCQkJCUJUX1JGX1JYX0xQRl9DT1JORVJfUkVTVU1FKTsKLQkJCUJURE1fQUdDVGFibGUocGFkYXB0ZXIsIEJUX0FHQ1RBQkxFX09GRik7Ci0JCQlCVERNX0JCQmFja09mZkxldmVsKHBhZGFwdGVyLCBCVF9CQl9CQUNLT0ZGX09GRik7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMUFudEJ0Q29leGlzdEhhbmRsZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4ODcyMzsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8xYW50ICpwQnRkbTg3MjM7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJ0Q29leDg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0JcEJ0ZG04NzIzID0gJnBCdENvZXg4NzIzLT5idGRtMUFudDsKLQlwYWRhcHRlci0+cHdyY3RybHByaXYuYnRjb2V4X3Jmb24gPSBmYWxzZTsKLQlpZiAoIXJ0bDg3MjNhX0JUX2VuYWJsZWQocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgaXMgZGlzYWJsZWRcbiIpKTsKLQotCQlpZiAoQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3QocGFkYXB0ZXIpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJKCJbQlRDb2V4XSwgd2lmaSBpcyBjb25uZWN0ZWRcbiIpKTsKLQotCQkJaWYgKEJURE1fSXNXaWZpQnVzeShwYWRhcHRlcikpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJCSgiW0JUQ29leF0sIFdpZmkgaXMgYnVzeVxuIikpOwotCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsCi0JCQkJCQkgICBmYWxzZSwgOSk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCQkJKCJbQlRDb2V4XSwgV2lmaSBpcyBpZGxlXG4iKSk7Ci0JCQkJX2J0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMiwgMSwKLQkJCQkJCSAgICBmYWxzZSwgOSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJKCJbQlRDb2V4XSwgd2lmaSBpcyBkaXNjb25uZWN0ZWRcbiIpKTsKLQotCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwgZmFsc2UsIDkpOwotCQl9Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBCVCBpcyBlbmFibGVkXG4iKSk7Ci0KLQkJaWYgKEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCSgiW0JUQ29leF0sIHdpZmkgaXMgY29ubmVjdGVkXG4iKSk7Ci0KLQkJCWJ0ZG1fMUFudFdpZmlQYXJhQWRqdXN0KHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMUFudENvZXhQcm9jZXNzRm9yV2lmaUNvbm5lY3QocGFkYXB0ZXIpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCSgiW0JUQ29leF0sIHdpZmkgaXMgZGlzY29ubmVjdGVkXG4iKSk7Ci0KLQkJCS8qICBBbnRlbm5hIHN3aXRjaCBhdCBCVCBzaWRlKDB4ODcwID0gMHgzMDAsCi0JCQkgICAgMHg4NjAgPSAweDIxMCkgYWZ0ZXIgUFNURE1BIG9mZiAqLwotCQkJYnRkbV8xQW50V2lmaVBhcmFBZGp1c3QocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsIGZhbHNlLCAwKTsKLQkJfQotCX0KLQotCWJ0ZG1fMUFudEJUU3RhdGVDaGFuZ2VIYW5kbGVyKHBhZGFwdGVyLCBwQnRDb2V4ODcyMy0+cHJlYzJoQnRJbmZvLAotCQkJCSAgICAgIHBCdENvZXg4NzIzLT5jMmhCdEluZm8pOwotCXBCdENvZXg4NzIzLT5wcmVjMmhCdEluZm8gPSBwQnRDb2V4ODcyMy0+YzJoQnRJbmZvOwotfQotCi12b2lkIEJURE1fMUFudFNpZ25hbENvbXBlbnNhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSB1OCAqcnNzaV93aWZpLCB1OCAqcnNzaV9idCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMzsKLQl1OCBSU1NJX1dpRmlfQ21wbnN0biwgUlNTSV9CVF9DbXBuc3RuOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudDsKLQlSU1NJX1dpRmlfQ21wbnN0biA9IDA7Ci0JUlNTSV9CVF9DbXBuc3RuID0gMDsKLQotCXN3aXRjaCAocEJ0ZG04NzIzLT5jdXJQc1RkbWEpIHsKLQljYXNlIDE6IC8qICBXaUZpIDUybXMgKi8KLQkJUlNTSV9XaUZpX0NtcG5zdG4gPSAxMTsgLyogIDIyKjAuNDggKi8KLQkJYnJlYWs7Ci0JY2FzZSAyOiAvKiAgV2lGaSAzNm1zICovCi0JCVJTU0lfV2lGaV9DbXBuc3RuID0gMTQ7IC8qICAyMiowLjY0ICovCi0JCWJyZWFrOwotCWNhc2UgOTogLyogIFdpRmkgMjBtcyAqLwotCQlSU1NJX1dpRmlfQ21wbnN0biA9IDE4OyAvKiAgMjIqMC44MCAqLwotCQlicmVhazsKLQljYXNlIDExOiAvKiAgV2lGaSAxMG1zICovCi0JCVJTU0lfV2lGaV9DbXBuc3RuID0gMjA7IC8qICAyMiowLjkwICovCi0JCWJyZWFrOwotCWNhc2UgNDogLyogIFdpRmkgMjFtcyAqLwotCQlSU1NJX1dpRmlfQ21wbnN0biA9IDE3OyAvKiAgMjIqMC43OSAqLwotCQlicmVhazsKLQljYXNlIDE2OiAvKiAgV2lGaSAyNG1zICovCi0JCVJTU0lfV2lGaV9DbXBuc3RuID0gMTg7IC8qICAyMiowLjc2ICovCi0JCWJyZWFrOwotCWNhc2UgMTg6IC8qICBXaUZpIDM3bXMgKi8KLQkJUlNTSV9XaUZpX0NtcG5zdG4gPSAxNDsgLyogIDIyKjAuNjQgKi8KLQkJYnJlYWs7Ci0JY2FzZSAyMzogLyogTGV2ZWwtMSwgQW50ZW5uYSBzd2l0Y2ggdG8gQlQgYXQgYWxsIHRpbWUgKi8KLQljYXNlIDI0OiAvKiBMZXZlbC0yLCBBbnRlbm5hIHN3aXRjaCB0byBCVCBhdCBhbGwgdGltZSAqLwotCWNhc2UgMjU6IC8qIExldmVsLTNhLCBBbnRlbm5hIHN3aXRjaCB0byBCVCBhdCBhbGwgdGltZSAqLwotCWNhc2UgMjY6IC8qIExldmVsLTNiLCBBbnRlbm5hIHN3aXRjaCB0byBCVCBhdCBhbGwgdGltZSAqLwotCWNhc2UgMjc6IC8qIExldmVsLTNiLCBBbnRlbm5hIHN3aXRjaCB0byBCVCBhdCBhbGwgdGltZSAqLwotCWNhc2UgMzM6IC8qIEJUIFNDTyAmIFdpRmkgc2l0ZSBzdXJ2ZXkgKi8KLQkJUlNTSV9XaUZpX0NtcG5zdG4gPSAyMjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJzc2lfd2lmaSAmJiBSU1NJX1dpRmlfQ21wbnN0bikgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkoIltCVENvZXhdLCAxQW50U2dubENtcG5zdG4sIGNhc2UgJWQsIFdpRmlDbXBuc3RuICIKLQkJCSAiPSVkKCVkID0+ICVkKVxuIiwgcEJ0ZG04NzIzLT5jdXJQc1RkbWEsCi0JCQkgUlNTSV9XaUZpX0NtcG5zdG4sICpyc3NpX3dpZmksCi0JCQkgKnJzc2lfd2lmaStSU1NJX1dpRmlfQ21wbnN0bikpOwotCQkqcnNzaV93aWZpICs9IFJTU0lfV2lGaV9DbXBuc3RuOwotCX0KLQotCWlmIChyc3NpX2J0ICYmIFJTU0lfQlRfQ21wbnN0bikgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkoIltCVENvZXhdLCAxQW50U2dubENtcG5zdG4sIGNhc2UgJWQsIEJUQ21wbnN0biAiCi0JCQkgIj0lZCglZCA9PiAlZClcbiIsIHBCdGRtODcyMy0+Y3VyUHNUZG1hLAotCQkJIFJTU0lfQlRfQ21wbnN0biwgKnJzc2lfYnQsICpyc3NpX2J0K1JTU0lfQlRfQ21wbnN0bikpOwotCQkqcnNzaV9idCArPSBSU1NJX0JUX0NtcG5zdG47Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBCVERNXzFBbnRQYXJhSW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXg7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMWFudCAqcEJ0ZG04NzIzOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0JcEJ0ZG04NzIzID0gJnBCdENvZXgtPmJ0ZG0xQW50OwotCi0JLyogIEVuYWJsZSBjb3VudGVyIHN0YXRpc3RpY3MgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDc2ZSwgMHg0KTsKLQlidGRtXzFBbnRQdGFQYXJhUmVsb2FkKHBhZGFwdGVyKTsKLQotCXBCdGRtODcyMy0+d2lmaVJzc2lUaHJlc2ggPSA0ODsKLQotCXBCdGRtODcyMy0+YldpRmlIYWx0ID0gZmFsc2U7Ci0JcEJ0ZG04NzIzLT5iUkFDaGFuZ2VkID0gZmFsc2U7Ci0KLQlpZiAoKHBCdENvZXgtPmMyaEJ0SW5mbyAhPSBCVF9JTkZPX1NUQVRFX0RJU0FCTEVEKSAmJgotCSAgICAocEJ0Q29leC0+YzJoQnRJbmZvICE9IEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTikpIHsKLQkJQlRETV9TZXRTd1JmUnhMcGZDb3JuZXIocGFkYXB0ZXIsIEJUX1JGX1JYX0xQRl9DT1JORVJfU0hSSU5LKTsKLQkJQlRETV9BR0NUYWJsZShwYWRhcHRlciwgQlRfQUdDVEFCTEVfT04pOwotCQlCVERNX0JCQmFja09mZkxldmVsKHBhZGFwdGVyLCBCVF9CQl9CQUNLT0ZGX09OKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIEJURE1fMUFudEZvckhhbHQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiXG5bQlRDb2V4XSwgMUFudCBmb3IgaGFsdFxuIikpOwotCi0JR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudC5iV2lGaUhhbHQgPQotCQl0cnVlOwotCi0JYnRkbV8xQW50V2lmaVBhcmFBZGp1c3QocGFkYXB0ZXIsIGZhbHNlKTsKLQotCS8qICBkb24ndCB1c2UgYnRkbV8xQW50U2V0UFNURE1BKCkgaGVyZSAqLwotCS8qICBpdCB3aWxsIGNhbGwgcnR3X3NldF9wc19tb2RlMjNhKCkgYW5kIHJlcXVlc3QgcHdycHJpdi0+bG9jay4gKi8KLQkvKiAgVGhpcyB3aWxsIGxlYWQgdG8gZGVhZGxvY2ssIGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIElQUyAqLwotCS8qICBMdWNhc0AyMDEzMDIwNSAqLwotCWJ0ZG1fMUFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDApOwotCi0JYnRkbV9TZXRGd0lnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIHRydWUpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNXzFBbnRMcHNMZWF2ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJcbltCVENvZXhdLCAxQW50IGZvciBMUFMgTGVhdmVcbiIpKTsKLQotCS8qICBQcmV2ZW50IGZyb20gZW50ZXJpbmcgTFBTIGFnYWluICovCi0JR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudC5iV2lGaUhhbHQgPQotCQl0cnVlOwotCi0JYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwgZmFsc2UsIDgpOwotLypidGRtXzFBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCA4KTsgKi8KLX0KLQotc3RhdGljIHZvaWQgQlRETV8xQW50V2lmaUFzc29jaWF0ZU5vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIlxuW0JUQ29leF0sIDFBbnQgZm9yIGFzc29jaWF0ZSwgdHlwZSA9JWRcbiIsIHR5cGUpKTsKLQotCWlmICh0eXBlKSB7Ci0JCXJ0bDg3MjNhX0NoZWNrQW50ZW5uYV9TZWxlY3Rpb24ocGFkYXB0ZXIpOwotCQlpZiAoIXJ0bDg3MjNhX0JUX2VuYWJsZWQocGFkYXB0ZXIpKQotCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwgZmFsc2UsIDkpOwotCQllbHNlIHsKLQkJCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4OwotCQkJdTggQnRTdGF0ZTsKLQotCQkJcEJ0Q29leCA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMzsKLQkJCUJ0U3RhdGUgPSBwQnRDb2V4LT5jMmhCdEluZm87Ci0KLQkJCWJ0ZG1fMUFudFRTRlN3aXRjaChwYWRhcHRlciwgdHJ1ZSk7Ci0KLQkJCWlmIChCdFN0YXRlID09IEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTiB8fAotCQkJICAgIEJ0U3RhdGUgPT0gQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEUpIHsKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJICAgdHJ1ZSwgMjgpOwotCQkJfSBlbHNlIGlmIChCdFN0YXRlID09IEJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWSB8fAotCQkJCSAgIEJ0U3RhdGUgPT0gQlRfSU5GT19TVEFURV9BQ0xfU0NPX0JVU1kpIHsKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJICAgZmFsc2UsIDgpOwotCQkJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjMCwgMHg1YTVhNWE1YSk7Ci0JCQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIDB4NmM0LCAweDVhNWE1YTVhKTsKLQkJCX0gZWxzZSBpZiAoQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9PTkxZX0JVU1kgfHwKLQkJCQkgICBCdFN0YXRlID09IEJUX0lORk9fU1RBVEVfQUNMX0lOUV9PUl9QQUcpIHsKLQkJCQlpZiAocEJ0Q29leC0+YzJoQnRQcm9maWxlID09IEJUX0lORk9fSElEKQotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIGZhbHNlLCAwLAotCQkJCQkJCSAgIHRydWUsIDM1KTsKLQkJCQllbHNlCi0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsCi0JCQkJCQkJICAgdHJ1ZSwgMjkpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFydGw4NzIzYV9CVF9lbmFibGVkKHBhZGFwdGVyKSkgewotCQkJaWYgKCFCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikpIHsKLQkJCQlidGRtXzFBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQkJCQlidGRtXzFBbnRUU0ZTd2l0Y2gocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCX0KLQkJfQotCi0JCWJ0ZG1fMUFudEJ0Q29leGlzdEhhbmRsZXIocGFkYXB0ZXIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLUJURE1fMUFudE1lZGlhU3RhdHVzTm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKQotewotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4OwotCi0JcEJ0Q29leCA9ICZHRVRfSEFMX0RBVEEocGFkYXB0ZXIpLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIlxuXG5bQlRDb2V4XSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgTWVkaWFTdGF0dXMsIFdpRmkgJXMgISFcbiIsCi0JCQltc3RhdHVzID09IFJUX01FRElBX0NPTk5FQ1Q/IkNPTk5FQ1QiOiJESVNDT05ORUNUIikpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIikpOwotCi0JaWYgKFJUX01FRElBX0NPTk5FQ1QgPT0gbXN0YXR1cykgewotCQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCQlpZiAocEJ0Q29leC0+YzJoQnRJbmZvID09IEJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWSB8fAotCQkJICAgIHBCdENvZXgtPmMyaEJ0SW5mbyA9PSBCVF9JTkZPX1NUQVRFX0FDTF9TQ09fQlVTWSkKLQkJCQlidGRtXzFBbnRVcGRhdGVIYWxSQU1hc2tGb3JTQ08ocGFkYXB0ZXIsIHRydWUpOwotCQl9Ci0KLQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2LkRlbGF5TFBTTGFzdFRpbWVTdGFtcCA9IGppZmZpZXM7Ci0JCUJURE1fMUFudEZvckRoY3AocGFkYXB0ZXIpOwotCX0gZWxzZSB7Ci0JCS8qIERCR184NzIzQSgiJXMgcnRsODcyM2FfRGVpbml0QW50ZW5uYV9TZWxlY3Rpb25cbiIsCi0JCSAgIF9fZnVuY19fKTsgKi8KLQkJcnRsODcyM2FfRGVpbml0QW50ZW5uYV9TZWxlY3Rpb24ocGFkYXB0ZXIpOwotCQlidGRtXzFBbnRCdENvZXhpc3RIYW5kbGVyKHBhZGFwdGVyKTsKLQkJcEJ0Q29leC0+YnRkbTFBbnQuYlJBQ2hhbmdlZCA9IGZhbHNlOwotCX0KLX0KLQotdm9pZCBCVERNXzFBbnRGb3JEaGNwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQl1OCBCdFN0YXRlOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4OwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMzsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCUJ0U3RhdGUgPSBwQnRDb2V4LT5jMmhCdEluZm87Ci0JcEJ0ZG04NzIzID0gJnBCdENvZXgtPmJ0ZG0xQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlxuW0JUQ29leF0sIDFBbnQgZm9yIERIQ1BcbiIpKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDFBbnQgZm9yIERIQ1AsIFdpRmkgaXMgJXNcbiIsCi0JCQkJQlRETV9Jc1dpZmlCdXN5KHBhZGFwdGVyKT8iQnVzeSI6IklETEUiKSk7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCAxQW50IGZvciBESENQLCAlc1xuIiwKLQkJCQlCdFN0YXRlU3RyaW5nW0J0U3RhdGVdKSk7Ci0KLQlCVERNXzFBbnRXaWZpQXNzb2NpYXRlTm90aWZ5KHBhZGFwdGVyLCB0cnVlKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV8xQW50V2lmaVNjYW5Ob3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2NhblR5cGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQl1OCBCdFN0YXRlOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4OwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgKnBCdGRtODcyMzsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlCdFN0YXRlID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYzJoQnRJbmZvOwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0JcEJ0ZG04NzIzID0gJnBCdENvZXgtPmJ0ZG0xQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlxuW0JUQ29leF0sIDFBbnQgZm9yIHdpZmkgc2NhbiA9JWQhIVxuIiwKLQkJCQlzY2FuVHlwZSkpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgMUFudCBmb3Igd2lmaSBzY2FuLCBXaUZpIGlzICVzXG4iLAotCQkJCUJURE1fSXNXaWZpQnVzeShwYWRhcHRlcik/IkJ1c3kiOiJJRExFIikpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgMUFudCBmb3Igd2lmaSBzY2FuLCAlc1xuIiwKLQkJCQlCdFN0YXRlU3RyaW5nW0J0U3RhdGVdKSk7Ci0KLQlpZiAoc2NhblR5cGUpIHsKLQkJcnRsODcyM2FfQ2hlY2tBbnRlbm5hX1NlbGVjdGlvbihwYWRhcHRlcik7Ci0JCWlmICghcnRsODcyM2FfQlRfZW5hYmxlZChwYWRhcHRlcikpIHsKLQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgZmFsc2UsIDAsIGZhbHNlLCA5KTsKLQkJfSBlbHNlIGlmIChCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikgPT0gZmFsc2UpIHsKLQkJCUJURE1fMUFudFdpZmlBc3NvY2lhdGVOb3RpZnkocGFkYXB0ZXIsIHRydWUpOwotCQl9IGVsc2UgewotCQkJaWYgKChCdFN0YXRlID09IEJUX0lORk9fU1RBVEVfU0NPX09OTFlfQlVTWSkgfHwKLQkJCSAgICAoQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9TQ09fQlVTWSkpIHsKLQkJCQlpZiAocEJ0Q29leC0+YkMyaEJ0SW5xdWlyeVBhZ2UpIHsKLQkJCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCBmYWxzZSwgMCwKLQkJCQkJCQkgICB0cnVlLCAzMik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJ0Y29leF9yZm9uID0KLQkJCQkJCXRydWU7Ci0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwKLQkJCQkJCQkgICB0cnVlLCAzMyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0cnVlID09IHBCdENvZXgtPmJDMmhCdElucXVpcnlQYWdlKSB7Ci0JCQkJcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJ0Y29leF9yZm9uID0gdHJ1ZTsKLQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsIHRydWUsIDMwKTsKLQkJCX0gZWxzZSBpZiAoQnRTdGF0ZSA9PSBCVF9JTkZPX1NUQVRFX0FDTF9PTkxZX0JVU1kpIHsKLQkJCQlwYWRhcHRlci0+cHdyY3RybHByaXYuYnRjb2V4X3Jmb24gPSB0cnVlOwotCQkJCWlmIChwQnRDb2V4LT5jMmhCdFByb2ZpbGUgPT0gQlRfSU5GT19ISUQpCi0JCQkJCWJ0ZG1fMUFudFNldFBTVERNQShwYWRhcHRlciwgdHJ1ZSwgMCwKLQkJCQkJCQkgICB0cnVlLCAzNCk7Ci0JCQkJZWxzZQotCQkJCQlidGRtXzFBbnRTZXRQU1RETUEocGFkYXB0ZXIsIHRydWUsIDAsCi0JCQkJCQkJICAgdHJ1ZSwgNCk7Ci0JCQl9IGVsc2UgewotCQkJCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5idGNvZXhfcmZvbiA9IHRydWU7Ci0JCQkJYnRkbV8xQW50U2V0UFNURE1BKHBhZGFwdGVyLCB0cnVlLCAwLCB0cnVlLCA1KTsKLQkJCX0KLQkJfQotCi0JCWJ0ZG1fTm90aWZ5RndTY2FuKHBhZGFwdGVyLCAxKTsKLQl9IGVsc2UgewotCQkvKiAgV2lGaV9GaW5pc2hfU2NhbiAqLwotCQlidGRtX05vdGlmeUZ3U2NhbihwYWRhcHRlciwgMCk7Ci0JCWJ0ZG1fMUFudEJ0Q29leGlzdEhhbmRsZXIocGFkYXB0ZXIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgQlRETV8xQW50RndDMmhCdEluZm84NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leDsKLQl1OCB1MXRtcCwgYnRTdGF0ZTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0KLQl1MXRtcCA9IHBCdENvZXgtPmMyaEJ0SW5mb09yaWdpbmFsOwotCS8qICBzY28gQlVTWSBiaXQgaXMgbm90IHVzZWQgb24gdm9pY2Ugb3ZlciBQQ00gcGxhdGZvcm0gKi8KLQlidFN0YXRlID0gdTF0bXAgJiAweEY7Ci0JcEJ0Q29leC0+YzJoQnRQcm9maWxlID0gdTF0bXAgJiAweEUwOwotCi0JLyogIGRlZmF1bHQgc2V0IGJ0IHRvIGlkbGUgc3RhdGUuICovCi0JcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kgPSBmYWxzZTsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVF9JRExFOwotCi0JLyogIGNoZWNrIEJJVDIgZmlyc3QgPT0+IGNoZWNrIGlmIGJ0IGlzIHVuZGVyIGlucXVpcnkgb3IgcGFnZSBzY2FuICovCi0JaWYgKGJ0U3RhdGUgJiBCSVQoMikpCi0JCXBCdENvZXgtPmJDMmhCdElucXVpcnlQYWdlID0gdHJ1ZTsKLQllbHNlCi0JCXBCdENvZXgtPmJDMmhCdElucXVpcnlQYWdlID0gZmFsc2U7Ci0JYnRTdGF0ZSAmPSB+QklUKDIpOwotCi0JaWYgKCEoYnRTdGF0ZSAmIEJJVCgwKSkpCi0JCXBCdENvZXgtPmMyaEJ0SW5mbyA9IEJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTjsKLQllbHNlIHsKLQkJaWYgKGJ0U3RhdGUgPT0gMHgxKQotCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9DT05ORUNUX0lETEU7Ci0JCWVsc2UgaWYgKGJ0U3RhdGUgPT0gMHg5KSB7Ci0JCQlpZiAocEJ0Q29leC0+YkMyaEJ0SW5xdWlyeVBhZ2UgPT0gdHJ1ZSkKLQkJCQlwQnRDb2V4LT5jMmhCdEluZm8gPQotCQkJCQlCVF9JTkZPX1NUQVRFX0FDTF9JTlFfT1JfUEFHOwotCQkJZWxzZQotCQkJCXBCdENvZXgtPmMyaEJ0SW5mbyA9Ci0JCQkJCUJUX0lORk9fU1RBVEVfQUNMX09OTFlfQlVTWTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChidFN0YXRlID09IDB4MykgewotCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9TQ09fT05MWV9CVVNZOwotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGJ0U3RhdGUgPT0gMHhiKSB7Ci0JCQlwQnRDb2V4LT5jMmhCdEluZm8gPSBCVF9JTkZPX1NUQVRFX0FDTF9TQ09fQlVTWTsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gdHJ1ZTsKLQkJfSBlbHNlCi0JCQlwQnRDb2V4LT5jMmhCdEluZm8gPSBCVF9JTkZPX1NUQVRFX01BWDsKLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5KQotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9Ci0JCQkJfkJUX0NPRVhfU1RBVEVfQlRfSURMRTsKLQl9Ci0KLQlpZiAoQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OID09IHBCdENvZXgtPmMyaEJ0SW5mbyB8fAotCSAgICBCVF9JTkZPX1NUQVRFX0NPTk5FQ1RfSURMRSA9PSBwQnRDb2V4LT5jMmhCdEluZm8pIHsKLQkJaWYgKHBCdENvZXgtPmJDMmhCdElucXVpcnlQYWdlKQotCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9JTlFfT1JfUEFHOwotCX0KLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDMkhdLCAlcyglZClcbiIsCi0JCQlCdFN0YXRlU3RyaW5nW3BCdENvZXgtPmMyaEJ0SW5mb10sIHBCdENvZXgtPmMyaEJ0SW5mbykpOwotCi0JaWYgKHBCdENvZXgtPmMyaEJ0UHJvZmlsZSAhPSBCVF9JTkZPX0hJRCkKLQkJcEJ0Q29leC0+YzJoQnRQcm9maWxlICY9IH5CVF9JTkZPX0hJRDsKLX0KLQotdm9pZCBCVERNXzFBbnRCdENvZXhpc3Q4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXVuc2lnbmVkIGxvbmcgZGVsdGFfdGltZTsKLQotCXBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NJVEVfTU9OSVRPUikpIHsKLQkJLyogIGFscmVhZHkgZG9uZSBpbiBCVERNXzFBbnRGb3JTY2FuKCkgKi8KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJKCJbQlRDb2V4XSwgd2lmaSBpcyB1bmRlciBzY2FuIHByb2dyZXNzISFcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9VTkRFUl9MSU5LSU5HKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkoIltCVENvZXhdLCB3aWZpIGlzIHVuZGVyIGxpbmsgcHJvZ3Jlc3MhIVxuIikpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogIHVuZGVyIERIQ1AoU3BlY2lhbCBwYWNrZXQpICovCi0JZGVsdGFfdGltZSA9IGppZmZpZXMgLSBwYWRhcHRlci0+cHdyY3RybHByaXYuRGVsYXlMUFNMYXN0VGltZVN0YW1wOwotCWRlbHRhX3RpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGRlbHRhX3RpbWUpOwotCWlmIChkZWx0YV90aW1lIDwgNTAwKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgd2lmaSBpcyB1bmRlciBESENQICIKLQkJCQkJInByb2dyZXNzKCVsaSBtcykhIVxuIiwgZGVsdGFfdGltZSkpOwotCQlyZXR1cm47Ci0JfQotCi0JQlRETV9DaGVja1dpRmlTdGF0ZShwYWRhcHRlcik7Ci0KLQlidGRtXzFBbnRCdENvZXhpc3RIYW5kbGVyKHBhZGFwdGVyKTsKLX0KLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMxQW50LmMgPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMyQW50LmMgPT09PT0gKi8KLQotLyogIGxvY2FsIGZ1bmN0aW9uIHN0YXJ0IHdpdGggYnRkbV8gKi8KLXN0YXRpYyB1OCBidGRtX0FjdGlvbkFsZ29yaXRobShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQl1OCBiU2NvRXhpc3QgPSBmYWxzZSwgYkJ0TGlua0V4aXN0ID0gZmFsc2UsIGJCdEhzTW9kZUV4aXN0ID0gZmFsc2U7Ci0JdTggYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fVU5ERUZJTkVEOwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSkKLQkJYkJ0TGlua0V4aXN0ID0gdHJ1ZTsKLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPKQotCQliU2NvRXhpc3QgPSB0cnVlOwotCWlmIChCVF9Ic0Nvbm5lY3Rpb25Fc3RhYmxpc2hlZChwYWRhcHRlcikpCi0JCWJCdEhzTW9kZUV4aXN0ID0gdHJ1ZTsKLQotCS8qICBoZXJlIHdlIGdldCBCVCBzdGF0dXMgZmlyc3QgKi8KLQkvKiAgMSkgaW5pdGlhbGl6ZSAqLwotCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19JRExFOwotCi0JaWYgKChiU2NvRXhpc3QpIHx8IChiQnRIc01vZGVFeGlzdCkgfHwKLQkgICAgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU0NPIG9yIEhJRCBvciBIUyBleGlzdHMsIHNldCBCVCBub24taWRsZSAhISFcbiIpKTsKLQkJcEJ0ZG04NzIzLT5idFN0YXR1cyA9IEJUXzJBTlRfQlRfU1RBVFVTX05PTl9JRExFOwotCX0gZWxzZSB7Ci0JCS8qICBBMmRwIHByb2ZpbGUgKi8KLQkJaWYgKChwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPT0gMSkgJiYKLQkJICAgIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKSkpIHsKLQkJCWlmIChCVERNX0J0VHhSeENvdW50ZXJMKHBhZGFwdGVyKSA8IDEwMCkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCwgbG93IHByaW9yaXR5IHR4K3J4IDwgMTAwLCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKLQkJCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCwgbG93IHByaW9yaXR5IHR4K3J4ID49IDEwMCwgc2V0IEJUIG5vbi1pZGxlISEhXG4iKSk7Ci0JCQkJcEJ0ZG04NzIzLT5idFN0YXR1cyA9IEJUXzJBTlRfQlRfU1RBVFVTX05PTl9JRExFOwotCQkJfQotCQl9Ci0JCS8qICBQYW4gcHJvZmlsZSAqLwotCQlpZiAoKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAxKSAmJgotCQkgICAgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikpKSB7Ci0JCQlpZiAoQlRETV9CdFR4UnhDb3VudGVyTChwYWRhcHRlcikgPCA2MDApIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFBBTiwgbG93IHByaW9yaXR5IHR4K3J4IDwgNjAwLCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKLQkJCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4KSB7Ci0JCQkJCWlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlSeCAvCi0JCQkJCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4KSA+IDkpIHsKLQkJCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOLCBsb3cgcHJpb3JpdHkgcngvdHggPiA5LCBzZXQgQlQgY29ubmVjdGVkLWlkbGUhISFcbiIpKTsKLQkJCQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChCVF8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRSAhPSBwQnRkbTg3MjMtPmJ0U3RhdHVzKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBQQU4sIHNldCBCVCBub24taWRsZSEhIVxuIikpOwotCQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19OT05fSURMRTsKLQkJCX0KLQkJfQotCQkvKiAgUGFuK0EyZHAgcHJvZmlsZSAqLwotCQlpZiAoKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAyKSAmJgotCQkgICAgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSAmJgotCQkgICAgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikpKSB7Ci0JCQlpZiAoQlRETV9CdFR4UnhDb3VudGVyTChwYWRhcHRlcikgPCA2MDApIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFBBTitBMkRQLCBsb3cgcHJpb3JpdHkgdHgrcnggPCA2MDAsIHNldCBCVCBjb25uZWN0ZWQtaWRsZSEhIVxuIikpOwotCQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5VHgpIHsKLQkJCQkJaWYgKChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVJ4IC8KLQkJCQkJICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5VHgpID4gOSkgewotCQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBQQU4rQTJEUCwgbG93IHByaW9yaXR5IHJ4L3R4ID4gOSwgc2V0IEJUIGNvbm5lY3RlZC1pZGxlISEhXG4iKSk7Ci0JCQkJCQlwQnRkbTg3MjMtPmJ0U3RhdHVzID0gQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgIT0gcEJ0ZG04NzIzLT5idFN0YXR1cykgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOK0EyRFAsIHNldCBCVCBub24taWRsZSEhIVxuIikpOwotCQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19OT05fSURMRTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoQlRfMkFOVF9CVF9TVEFUVVNfSURMRSAhPSBwQnRkbTg3MjMtPmJ0U3RhdHVzKQotCQlwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSA9IHRydWU7Ci0JZWxzZQotCQlwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSA9IGZhbHNlOwotCi0JaWYgKCFiQnRMaW5rRXhpc3QpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBObyBwcm9maWxlIGV4aXN0cyEhIVxuIikpOwotCQlyZXR1cm4gYWxnb3JpdGhtOwotCX0KLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUgPT0gMSkgewotCQlpZiAoYlNjb0V4aXN0KSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvbmx5XG4iKSk7Ci0JCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19TQ087Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfSElEKSkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEIG9ubHlcbiIpKTsKLQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISUQ7Ci0JCQl9IGVsc2UgaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQIG9ubHlcbiIpKTsKLQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19BMkRQOwotCQkJfSBlbHNlIGlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pKSB7Ci0JCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOKEhTKSBvbmx5XG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1BBTkhTOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOKEVEUikgb25seVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFI7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIE5PIG1hdGNoZWQgcHJvZmlsZSBmb3IgTnVtYmVyT2ZIYW5kbGUgPSVkIFxuIiwKLQkJCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUpKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID09IDIpIHsKLQkJaWYgKGJTY29FeGlzdCkgewotCQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIEhJRFxuIikpOwotCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRDsKLQkJCX0gZWxzZSBpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEEyRFBcbiIpKTsKLQkJCX0gZWxzZSBpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfUEFOKSkgewotCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIFBBTihIUylcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fU0NPOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgUEFOKEVEUilcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPIGV4aXN0cyBidXQgd2h5IE5PIG1hdGNoZWQgQUNMIHByb2ZpbGUgZm9yIE51bWJlck9mSGFuZGxlID0lZFxuIiwKLQkJCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFBcbiIpKTsKLQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKLQkJfSBlbHNlIGlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCQkgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pKSB7Ci0JCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgUEFOKEhTKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9ISUQ7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pICYmCi0JCQkJICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQICsgUEFOKEhTKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19BMkRQOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBOTyBtYXRjaGVkIHByb2ZpbGUgZm9yIE51bWJlck9mSGFuZGxlID0lZFxuIiwKLQkJCQkJcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlKSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAzKSB7Ci0JCWlmIChiU2NvRXhpc3QpIHsKLQkJCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEhJRCArIEEyRFBcbiIpKTsKLQkJCX0gZWxzZSBpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfSElEKSAmJgotCQkJCSAgIEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikpIHsKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISUQgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU0NPICsgSElEICsgUEFOKEVEUilcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikgJiYKLQkJCQkgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKSkgewotCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEEyRFAgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1NDTzsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIFNDTyArIEEyRFAgKyBQQU4oRURSKVxuIikpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBTQ08gZXhpc3RzIGJ1dCB3aHkgTk8gbWF0Y2hlZCBwcm9maWxlIGZvciBOdW1iZXJPZkhhbmRsZSA9JWRcbiIsCi0JCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkgJiYKLQkJCSAgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pICYmCi0JCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBBMkRQICsgUEFOKEhTKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5IUzsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oRURSKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEVycm9yISEhIE5PIG1hdGNoZWQgcHJvZmlsZSBmb3IgTnVtYmVyT2ZIYW5kbGUgPSVkXG4iLAotCQkJCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUpKTsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID49IDMpIHsKLQkJaWYgKGJTY29FeGlzdCkgewotCQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkgJiYKLQkJCSAgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pICYmCi0JCQkgICAgQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkpIHsKLQkJCQlpZiAoYkJ0SHNNb2RlRXhpc3QpCi0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgSElEICsgQTJEUCArIFBBTihIUylcbiIpKTsKLQkJCQllbHNlCi0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPICsgSElEICsgQTJEUCArIFBBTihFRFIpXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgU0NPIGV4aXN0cyBidXQgd2h5IE5PIG1hdGNoZWQgcHJvZmlsZSBmb3IgTnVtYmVyT2ZIYW5kbGUgPSVkXG4iLAotCQkJCQlwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGUpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRXJyb3IhISEgTk8gbWF0Y2hlZCBwcm9maWxlIGZvciBOdW1iZXJPZkhhbmRsZSA9JWRcbiIsCi0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlKSk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGFsZ29yaXRobTsKLX0KLQotc3RhdGljIHU4IGJ0ZG1fTmVlZFRvRGVjQnRQd3Ioc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBiUmV0ID0gZmFsc2U7Ci0KLQlpZiAoQlRfT3BlcmF0aW9uKHBhZGFwdGVyKSkgewotCQlpZiAocEhhbERhdGEtPmRtcHJpdi5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID4gNDcpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJOZWVkIHRvIGRlY3JlYXNlIGJ0IHBvd2VyIGZvciBIUyBtb2RlISFcbiIpKTsKLQkJCWJSZXQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIk5PIE5lZWQgdG8gZGVjcmVhc2UgYnQgcG93ZXIgZm9yIEhTIG1vZGUhIVxuIikpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIk5lZWQgdG8gZGVjcmVhc2UgYnQgcG93ZXIgZm9yIFdpZmkgaXMgY29ubmVjdGVkISFcbiIpKTsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBiUmV0OwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV9TZXRDb2V4VGFibGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHZhbDB4NmMwLAotCQkgIHUzMiB2YWwweDZjOCwgdTggdmFsMHg2Y2MpCi17Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoInNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzAgPSAweCV4XG4iLCB2YWwweDZjMCkpOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjMCwgdmFsMHg2YzApOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoInNldCBjb2V4IHRhYmxlLCBzZXQgMHg2YzggPSAweCV4XG4iLCB2YWwweDZjOCkpOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweDZjOCwgdmFsMHg2YzgpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoInNldCBjb2V4IHRhYmxlLCBzZXQgMHg2Y2MgPSAweCV4XG4iLCB2YWwweDZjYykpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NmNjLCB2YWwweDZjYyk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGRtX1NldFN3RnVsbFRpbWVEYWNTd2luZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiU3dEYWNTd2luZ09uLAotCQkJICAgdTMyIHN3RGFjU3dpbmdMdmwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAoYlN3RGFjU3dpbmdPbikgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFN3RGFjU3dpbmcgPSAweCV4XG4iLCBzd0RhY1N3aW5nTHZsKSk7Ci0JCVBIWV9TZXRCQlJlZyhwYWRhcHRlciwgMHg4ODAsIDB4ZmYwMDAwMDAsIHN3RGFjU3dpbmdMdmwpOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iU1dDb2V4aXN0QWxsT2ZmID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTd0RhY1N3aW5nIE9mZiFcbiIpKTsKLQkJUEhZX1NldEJCUmVnKHBhZGFwdGVyLCAweDg4MCwgMHhmZjAwMDAwMCwgMHhjMCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotYnRkbV9TZXRGd0RhY1N3aW5nTGV2ZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggZGFjU3dpbmdMdmwpCi17Ci0JdTggSDJDX1BhcmFtZXRlclsxXSA9IHswfTsKLQotCUgyQ19QYXJhbWV0ZXJbMF0gPSBkYWNTd2luZ0x2bDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgU2V0IERhYyBTd2luZyBMZXZlbCA9IDB4JXhcbiIsIGRhY1N3aW5nTHZsKSk7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCB3cml0ZSAweDI5ID0gMHgleFxuIiwgSDJDX1BhcmFtZXRlclswXSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHgyOSwgMSwgSDJDX1BhcmFtZXRlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudERlY0J0UHdyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJEZWNCdFB3cikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCSgiW0JUQ29leF0sIERlYyBCVCBwb3dlciA9ICVzXG4iLAotCQkoKGJEZWNCdFB3cikgPyAiT04iIDogIk9GRiIpKSk7Ci0JcEJ0ZG04NzIzLT5iQ3VyRGVjQnRQd3IgPSBiRGVjQnRQd3I7Ci0KLQlpZiAocEJ0ZG04NzIzLT5iUHJlRGVjQnRQd3IgPT0gcEJ0ZG04NzIzLT5iQ3VyRGVjQnRQd3IpCi0JCXJldHVybjsKLQotCUJURE1fU2V0RndEZWNCdFB3cihwYWRhcHRlciwgcEJ0ZG04NzIzLT5iQ3VyRGVjQnRQd3IpOwotCi0JcEJ0ZG04NzIzLT5iUHJlRGVjQnRQd3IgPSBwQnRkbTg3MjMtPmJDdXJEZWNCdFB3cjsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggZndEYWNTd2luZ0x2bCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIHNldCBGVyBEYWMgU3dpbmcgbGV2ZWwgPSAlZFxuIiwgIGZ3RGFjU3dpbmdMdmwpKTsKLQlwQnRkbTg3MjMtPmN1ckZ3RGFjU3dpbmdMdmwgPSBmd0RhY1N3aW5nTHZsOwotCi0JLyogUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBwcmVGd0RhY1N3aW5nTHZsID0lZCwgY3VyRndEYWNTd2luZ0x2bCA9JWRcbiIsICovCi0JLypwQnRkbTg3MjMtPnByZUZ3RGFjU3dpbmdMdmwsIHBCdGRtODcyMy0+Y3VyRndEYWNTd2luZ0x2bCkpOyAqLwotCi0JaWYgKHBCdGRtODcyMy0+cHJlRndEYWNTd2luZ0x2bCA9PSBwQnRkbTg3MjMtPmN1ckZ3RGFjU3dpbmdMdmwpCi0JCXJldHVybjsKLQotCWJ0ZG1fU2V0RndEYWNTd2luZ0xldmVsKHBhZGFwdGVyLCBwQnRkbTg3MjMtPmN1ckZ3RGFjU3dpbmdMdmwpOwotCi0JcEJ0ZG04NzIzLT5wcmVGd0RhY1N3aW5nTHZsID0gcEJ0ZG04NzIzLT5jdXJGd0RhY1N3aW5nTHZsOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8yQW50UmZTaHJpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlJ4UmZTaHJpbmtPbikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCSgiW0JUQ29leF0sIHR1cm4gUnggUkYgU2hyaW5rID0gJXNcbiIsCi0JCSgoYlJ4UmZTaHJpbmtPbikgPyAiT04iIDogIk9GRiIpKSk7Ci0JcEJ0ZG04NzIzLT5iQ3VyUmZSeExwZlNocmluayA9IGJSeFJmU2hyaW5rT247Ci0KLQkvKiBSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIGJQcmVSZlJ4THBmU2hyaW5rID0lZCwgYkN1clJmUnhMcGZTaHJpbmsgPSVkXG4iLCAqLwotCS8qcEJ0ZG04NzIzLT5iUHJlUmZSeExwZlNocmluaywgcEJ0ZG04NzIzLT5iQ3VyUmZSeExwZlNocmluaykpOyAqLwotCi0JaWYgKHBCdGRtODcyMy0+YlByZVJmUnhMcGZTaHJpbmsgPT0gcEJ0ZG04NzIzLT5iQ3VyUmZSeExwZlNocmluaykKLQkJcmV0dXJuOwotCi0JQlRETV9TZXRTd1JmUnhMcGZDb3JuZXIocGFkYXB0ZXIsICh1OClwQnRkbTg3MjMtPmJDdXJSZlJ4THBmU2hyaW5rKTsKLQotCXBCdGRtODcyMy0+YlByZVJmUnhMcGZTaHJpbmsgPSBwQnRkbTg3MjMtPmJDdXJSZlJ4THBmU2hyaW5rOwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8yQW50TG93UGVuYWx0eVJhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJMb3dQZW5hbHR5UmEpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCB0dXJuIExvd1BlbmFsdHlSQSA9ICVzXG4iLAotCQkoKGJMb3dQZW5hbHR5UmEpID8gIk9OIiA6ICJPRkYiKSkpOwotCXBCdGRtODcyMy0+YkN1ckxvd1BlbmFsdHlSYSA9IGJMb3dQZW5hbHR5UmE7Ci0KLQkvKiBSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIGJQcmVMb3dQZW5hbHR5UmEgPSVkLCBiQ3VyTG93UGVuYWx0eVJhID0lZFxuIiwgKi8KLQkvKnBCdGRtODcyMy0+YlByZUxvd1BlbmFsdHlSYSwgcEJ0ZG04NzIzLT5iQ3VyTG93UGVuYWx0eVJhKSk7ICovCi0KLQlpZiAocEJ0ZG04NzIzLT5iUHJlTG93UGVuYWx0eVJhID09IHBCdGRtODcyMy0+YkN1ckxvd1BlbmFsdHlSYSkKLQkJcmV0dXJuOwotCi0JQlRETV9TZXRTd1BlbmFsdHlUeFJhdGVBZGFwdGl2ZShwYWRhcHRlciwgKHU4KXBCdGRtODcyMy0+YkN1ckxvd1BlbmFsdHlSYSk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVMb3dQZW5hbHR5UmEgPSBwQnRkbTg3MjMtPmJDdXJMb3dQZW5hbHR5UmE7Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGRtXzJBbnREYWNTd2luZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgIHU4IGJEYWNTd2luZ09uLCB1MzIgZGFjU3dpbmdMdmwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCB0dXJuIERhY1N3aW5nID0lcywgZGFjU3dpbmdMdmwgPSAweCV4XG4iLAotCQkoYkRhY1N3aW5nT24gPyAiT04iIDogIk9GRiIpLCBkYWNTd2luZ0x2bCkpOwotCXBCdGRtODcyMy0+YkN1ckRhY1N3aW5nT24gPSBiRGFjU3dpbmdPbjsKLQlwQnRkbTg3MjMtPmN1ckRhY1N3aW5nTHZsID0gZGFjU3dpbmdMdmw7Ci0KLQlpZiAoKHBCdGRtODcyMy0+YlByZURhY1N3aW5nT24gPT0gcEJ0ZG04NzIzLT5iQ3VyRGFjU3dpbmdPbikgJiYKLQkgICAgKHBCdGRtODcyMy0+cHJlRGFjU3dpbmdMdmwgPT0gcEJ0ZG04NzIzLT5jdXJEYWNTd2luZ0x2bCkpCi0JCXJldHVybjsKLQotCW1kZWxheSgzMCk7Ci0JYnRkbV9TZXRTd0Z1bGxUaW1lRGFjU3dpbmcocGFkYXB0ZXIsIGJEYWNTd2luZ09uLCBkYWNTd2luZ0x2bCk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVEYWNTd2luZ09uID0gcEJ0ZG04NzIzLT5iQ3VyRGFjU3dpbmdPbjsKLQlwQnRkbTg3MjMtPnByZURhY1N3aW5nTHZsID0gcEJ0ZG04NzIzLT5jdXJEYWNTd2luZ0x2bDsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV8yQW50QWRjQmFja09mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiQWRjQmFja09mZikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCSgiW0JUQ29leF0sIHR1cm4gQWRjQmFja09mZiA9ICVzXG4iLAotCQkoKGJBZGNCYWNrT2ZmKSA/ICJPTiIgOiAiT0ZGIikpKTsKLQlwQnRkbTg3MjMtPmJDdXJBZGNCYWNrT2ZmID0gYkFkY0JhY2tPZmY7Ci0KLQlpZiAocEJ0ZG04NzIzLT5iUHJlQWRjQmFja09mZiA9PSBwQnRkbTg3MjMtPmJDdXJBZGNCYWNrT2ZmKQotCQlyZXR1cm47Ci0KLQlCVERNX0JCQmFja09mZkxldmVsKHBhZGFwdGVyLCAodTgpcEJ0ZG04NzIzLT5iQ3VyQWRjQmFja09mZik7Ci0KLQlwQnRkbTg3MjMtPmJQcmVBZGNCYWNrT2ZmID0gcEJ0ZG04NzIzLT5iQ3VyQWRjQmFja09mZjsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV8yQW50QWdjVGFibGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYkFnY1RhYmxlRW4pCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCAlcyBBZ2MgVGFibGVcbiIsICgoYkFnY1RhYmxlRW4pID8gIkVuYWJsZSIgOiAiRGlzYWJsZSIpKSk7Ci0JcEJ0ZG04NzIzLT5iQ3VyQWdjVGFibGVFbiA9IGJBZ2NUYWJsZUVuOwotCi0JLyogUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBiUHJlQWdjVGFibGVFbiA9JWQsIGJDdXJBZ2NUYWJsZUVuID0lZFxuIiwgKi8KLQkvKnBCdGRtODcyMy0+YlByZUFnY1RhYmxlRW4sIHBCdGRtODcyMy0+YkN1ckFnY1RhYmxlRW4pKTsgKi8KLQotCWlmIChwQnRkbTg3MjMtPmJQcmVBZ2NUYWJsZUVuID09IHBCdGRtODcyMy0+YkN1ckFnY1RhYmxlRW4pCi0JCXJldHVybjsKLQotCUJURE1fQUdDVGFibGUocGFkYXB0ZXIsICh1OCliQWdjVGFibGVFbik7Ci0KLQlwQnRkbTg3MjMtPmJQcmVBZ2NUYWJsZUVuID0gcEJ0ZG04NzIzLT5iQ3VyQWdjVGFibGVFbjsKLX0KLQotc3RhdGljIHZvaWQKLWJ0ZG1fMkFudENvZXhUYWJsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICB1MzIgdmFsMHg2YzAsIHUzMiB2YWwweDZjOCwgdTggdmFsMHg2Y2MpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCB3cml0ZSBDb2V4IFRhYmxlIDB4NmMwID0gMHgleCwgMHg2YzggPSAweCV4LCAweDZjYyA9IDB4JXhcbiIsCi0JCXZhbDB4NmMwLCB2YWwweDZjOCwgdmFsMHg2Y2MpKTsKLQlwQnRkbTg3MjMtPmN1clZhbDB4NmMwID0gdmFsMHg2YzA7Ci0JcEJ0ZG04NzIzLT5jdXJWYWwweDZjOCA9IHZhbDB4NmM4OwotCXBCdGRtODcyMy0+Y3VyVmFsMHg2Y2MgPSB2YWwweDZjYzsKLQotCS8qIFJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgcHJlVmFsMHg2YzAgPSAweCV4LCBwcmVWYWwweDZjOCA9IDB4JXgsIHByZVZhbDB4NmNjID0gMHgleCAhIVxuIiwgKi8KLQkvKnBCdGRtODcyMy0+cHJlVmFsMHg2YzAsIHBCdGRtODcyMy0+cHJlVmFsMHg2YzgsIHBCdGRtODcyMy0+cHJlVmFsMHg2Y2MpKTsgKi8KLQkvKiBSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIGN1clZhbDB4NmMwID0gMHgleCwgY3VyVmFsMHg2YzggPSAweCV4LCBjdXJWYWwweDZjYyA9IDB4JXggISFcbiIsICovCi0JLypwQnRkbTg3MjMtPmN1clZhbDB4NmMwLCBwQnRkbTg3MjMtPmN1clZhbDB4NmM4LCBwQnRkbTg3MjMtPmN1clZhbDB4NmNjKSk7ICovCi0KLQlpZiAoKHBCdGRtODcyMy0+cHJlVmFsMHg2YzAgPT0gcEJ0ZG04NzIzLT5jdXJWYWwweDZjMCkgJiYKLQkgICAgKHBCdGRtODcyMy0+cHJlVmFsMHg2YzggPT0gcEJ0ZG04NzIzLT5jdXJWYWwweDZjOCkgJiYKLQkgICAgKHBCdGRtODcyMy0+cHJlVmFsMHg2Y2MgPT0gcEJ0ZG04NzIzLT5jdXJWYWwweDZjYykpCi0JCXJldHVybjsKLQotCWJ0ZG1fU2V0Q29leFRhYmxlKHBhZGFwdGVyLCB2YWwweDZjMCwgdmFsMHg2YzgsIHZhbDB4NmNjKTsKLQotCXBCdGRtODcyMy0+cHJlVmFsMHg2YzAgPSBwQnRkbTg3MjMtPmN1clZhbDB4NmMwOwotCXBCdGRtODcyMy0+cHJlVmFsMHg2YzggPSBwQnRkbTg3MjMtPmN1clZhbDB4NmM4OwotCXBCdGRtODcyMy0+cHJlVmFsMHg2Y2MgPSBwQnRkbTg3MjMtPmN1clZhbDB4NmNjOwotfQotCi1zdGF0aWMgdm9pZCBidGRtXzJBbnRJZ25vcmVXbGFuQWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJFbmFibGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVENvZXhdLCB0dXJuIElnbm9yZSBXbGFuQWN0ICVzXG4iLCAoYkVuYWJsZSA/ICJPTiIgOiAiT0ZGIikpKTsKLQlwQnRkbTg3MjMtPmJDdXJJZ25vcmVXbGFuQWN0ID0gYkVuYWJsZTsKLQotCi0JaWYgKHBCdGRtODcyMy0+YlByZUlnbm9yZVdsYW5BY3QgPT0gcEJ0ZG04NzIzLT5iQ3VySWdub3JlV2xhbkFjdCkKLQkJcmV0dXJuOwotCi0JYnRkbV9TZXRGd0lnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGJFbmFibGUpOwotCXBCdGRtODcyMy0+YlByZUlnbm9yZVdsYW5BY3QgPSBwQnRkbTg3MjMtPmJDdXJJZ25vcmVXbGFuQWN0OwotfQotCi1zdGF0aWMgdm9pZAotYnRkbV8yQW50U2V0RnczYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBieXRlMSwgdTggYnl0ZTIsCi0JCSB1OCBieXRlMywgdTggYnl0ZTQsIHU4IGJ5dGU1KQotewotCXU4IEgyQ19QYXJhbWV0ZXJbNV0gPSB7MH07Ci0KLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICBieXRlMVsxOjBdICE9IDAgbWVhbnMgZW5hYmxlIHBzdGRtYSAqLwotCS8qICBmb3IgMkFudCBidCBjb2V4aXN0LCBpZiBieXRlMSAhPSAwIG1lYW5zIGVuYWJsZSBwc3RkbWEgKi8KLQlpZiAoYnl0ZTEpCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQlIMkNfUGFyYW1ldGVyWzBdID0gYnl0ZTE7Ci0JSDJDX1BhcmFtZXRlclsxXSA9IGJ5dGUyOwotCUgyQ19QYXJhbWV0ZXJbMl0gPSBieXRlMzsKLQlIMkNfUGFyYW1ldGVyWzNdID0gYnl0ZTQ7Ci0JSDJDX1BhcmFtZXRlcls0XSA9IGJ5dGU1OwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuZnczYVZhbFswXSA9IGJ5dGUxOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmZ3M2FWYWxbMV0gPSBieXRlMjsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5mdzNhVmFsWzJdID0gYnl0ZTM7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuZnczYVZhbFszXSA9IGJ5dGU0OwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmZ3M2FWYWxbNF0gPSBieXRlNTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgRlcgd3JpdGUgMHgzYSg1Ynl0ZXMpID0gMHgleCUwOHhcbiIsCi0JCUgyQ19QYXJhbWV0ZXJbMF0sCi0JCUgyQ19QYXJhbWV0ZXJbMV08PDI0fEgyQ19QYXJhbWV0ZXJbMl08PDE2fEgyQ19QYXJhbWV0ZXJbM108PDh8SDJDX1BhcmFtZXRlcls0XSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHgzYSwgNSwgSDJDX1BhcmFtZXRlcik7Ci0JfQotCi1zdGF0aWMgdm9pZCBidGRtXzJBbnRQc1RkbWEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlR1cm5PbiwgdTggdHlwZSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0JdTMyCQkJYnRUeFJ4Q250ID0gMDsKLQl1OCBiVHVybk9uQnlDbnQgPSBmYWxzZTsKLQl1OCBwc1RkbWFUeXBlQnlDbnQgPSAwOwotCi0JYnRUeFJ4Q250ID0gQlRETV9CdFR4UnhDb3VudGVySChwYWRhcHRlcikrQlRETV9CdFR4UnhDb3VudGVyTChwYWRhcHRlcik7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBCVCBUeFJ4IENvdW50ZXJzID0gJWRcbiIsIGJ0VHhSeENudCkpOwotCWlmIChidFR4UnhDbnQgPiAzMDAwKSB7Ci0JCWJUdXJuT25CeUNudCA9IHRydWU7Ci0JCXBzVGRtYVR5cGVCeUNudCA9IDg7Ci0KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJKCJbQlRDb2V4XSwgRm9yIEJUVHhSeENvdW50ZXJzLCB0dXJuICVzIFBTIFRETUEsIHR5cGUgPSVkXG4iLAotCQkJKGJUdXJuT25CeUNudCA/ICJPTiIgOiAiT0ZGIiksIHBzVGRtYVR5cGVCeUNudCkpOwotCQlwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbiA9IGJUdXJuT25CeUNudDsKLQkJcEJ0ZG04NzIzLT5jdXJQc1RkbWEgPSBwc1RkbWFUeXBlQnlDbnQ7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJKCJbQlRDb2V4XSwgdHVybiAlcyBQUyBURE1BLCB0eXBlID0lZFxuIiwKLQkJCShiVHVybk9uID8gIk9OIiA6ICJPRkYiKSwgdHlwZSkpOwotCQlwQnRkbTg3MjMtPmJDdXJQc1RkbWFPbiA9IGJUdXJuT247Ci0JCXBCdGRtODcyMy0+Y3VyUHNUZG1hID0gdHlwZTsKLQl9Ci0KLQlpZiAoKHBCdGRtODcyMy0+YlByZVBzVGRtYU9uID09IHBCdGRtODcyMy0+YkN1clBzVGRtYU9uKSAmJgotCSAgICAocEJ0ZG04NzIzLT5wcmVQc1RkbWEgPT0gcEJ0ZG04NzIzLT5jdXJQc1RkbWEpKQotCQlyZXR1cm47Ci0KLQlpZiAoYlR1cm5PbikgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSAxOgotCQlkZWZhdWx0OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHgxYSwgMHgxYSwgMHhhMSwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHgxMiwgMHgxMiwgMHhhMSwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHhhLCAweGEsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4YTMsIDB4NSwgMHg1LCAweGExLCAweDgwKTsKLQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDFhLCAweDFhLCAweDIwLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDY6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDEyLCAweDEyLCAweDIwLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDc6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweGEsIDB4YSwgMHgyMCwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSA4OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhhMywgMHg1LCAweDUsIDB4MjAsIDB4ODApOwotCQkJYnJlYWs7Ci0JCWNhc2UgOToKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4MWEsIDB4MWEsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTA6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDEyLCAweDEyLCAweGExLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDExOgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHhhLCAweGEsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTI6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDUsIDB4NSwgMHhhMSwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxMzoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4MWEsIDB4MWEsIDB4MjAsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTQ6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDEyLCAweDEyLCAweDIwLCAweDk4KTsKLQkJCWJyZWFrOwotCQljYXNlIDE1OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHhlMywgMHhhLCAweGEsIDB4MjAsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDUsIDB4NSwgMHgyMCwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxNzoKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4YTMsIDB4MmYsIDB4MmYsIDB4MjAsIDB4ODApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMTg6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDUsIDB4NSwgMHhhMSwgMHg5OCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxOToKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4ZTMsIDB4MjUsIDB4MjUsIDB4YTEsIDB4OTgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjA6Ci0JCQlidGRtXzJBbnRTZXRGdzNhKHBhZGFwdGVyLCAweGUzLCAweDI1LCAweDI1LCAweDIwLCAweDk4KTsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogIGRpc2FibGUgUFMgdGRtYSAqLwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSAwOgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHgwLCAweDAsIDB4MCwgMHg4LCAweDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWJ0ZG1fMkFudFNldEZ3M2EocGFkYXB0ZXIsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnRkbV8yQW50U2V0RnczYShwYWRhcHRlciwgMHgwLCAweDAsIDB4MCwgMHg4LCAweDApOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKiAgdXBkYXRlIHByZSBzdGF0ZSAqLwotCXBCdGRtODcyMy0+YlByZVBzVGRtYU9uID0gIHBCdGRtODcyMy0+YkN1clBzVGRtYU9uOwotCXBCdGRtODcyMy0+cHJlUHNUZG1hID0gcEJ0ZG04NzIzLT5jdXJQc1RkbWE7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudEJ0SW5xdWlyeVBhZ2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlidGRtXzJBbnRDb2V4VGFibGUocGFkYXB0ZXIsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKLQlidGRtXzJBbnRJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0JYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA4KTsKLX0KLQotc3RhdGljIHU4IGJ0ZG1fSG9sZEZvckJ0SW5xUGFnZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXUzMiBjdXJUaW1lID0gamlmZmllczsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5iQzJoQnRJbnF1aXJ5UGFnZSkgewotCQkvKiAgYnQgaW5xdWlyeSBvciBwYWdlIGlzIHN0YXJ0ZWQuICovCi0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idElucVBhZ2VTdGFydFRpbWUgPT0gMCkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbnFQYWdlU3RhcnRUaW1lID0gY3VyVGltZTsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgSW5xdWlyeS9wYWdlIGlzIHN0YXJ0ZWQgYXQgdGltZSA6IDB4JWx4IFxuIiwKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5xUGFnZVN0YXJ0VGltZSkpOwotCQl9Ci0JfQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQlQgSW5xdWlyeS9wYWdlIHN0YXJ0ZWQgdGltZSA6IDB4JWx4LCBjdXJUaW1lIDogMHgleCBcbiIsCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5xUGFnZVN0YXJ0VGltZSwgY3VyVGltZSkpOwotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5xUGFnZVN0YXJ0VGltZSkgewotCQlpZiAoKChjdXJUaW1lIC0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbnFQYWdlU3RhcnRUaW1lKS8xMDAwMDAwKSA+PSAxMCkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBCVCBJbnF1aXJ5L3BhZ2UgPj0gMTBzZWMhISEiKSk7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idElucVBhZ2VTdGFydFRpbWUgPSAwOwotCQl9Ci0JfQotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5xUGFnZVN0YXJ0VGltZSkgewotCQlidGRtXzJBbnRDb2V4VGFibGUocGFkYXB0ZXIsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKLQkJYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9IGVsc2UgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQotCi1zdGF0aWMgdTggYnRkbV9JczJBbnQ4NzIzQUNvbW1vbkFjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQl1OCBiQ29tbW9uID0gZmFsc2U7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiJXMgOkJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0ID0leCBjaGVja19md3N0YXRlID0leCBwbWxtZXByaXYtPmZ3X3N0YXRlID0gMHgleFxuIiwgX19mdW5jX18sIEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSwgY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCAoX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpLCBwYWRhcHRlci0+bWxtZXByaXYuZndfc3RhdGUpKTsKLQotCWlmICgoIUJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkgJiYKLQkgICAgKCFjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIChfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkpICYmCi0JICAgIChCVF8yQU5UX0JUX1NUQVRVU19JRExFID09IHBCdGRtODcyMy0+YnRTdGF0dXMpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIGlkbGUgKyBCdCBpZGxlISFcbiIpKTsKLQotCQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50UmZTaHJpbmsocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50Q29leFRhYmxlKHBhZGFwdGVyLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Ci0KLQkJYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQkJYnRkbV8yQW50RndEYWNTd2luZ0x2bChwYWRhcHRlciwgMHgyMCk7Ci0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCi0JCWJDb21tb24gPSB0cnVlOwotCX0gZWxzZSBpZiAoKChCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikpIHx8Ci0JCSAgIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIChfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkpKSAmJgotCQkgICAoQlRfMkFOVF9CVF9TVEFUVVNfSURMRSA9PSBwQnRkbTg3MjMtPmJ0U3RhdHVzKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSBub24taWRsZSArIEJUIGlkbGUhIVxuIikpOwotCi0JCWJ0ZG1fMkFudExvd1BlbmFsdHlSYShwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudFJmU2hyaW5rKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotCi0JCWJ0ZG1fMkFudElnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0JCWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwocGFkYXB0ZXIsIDB4MjApOwotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCi0JCWJDb21tb24gPSB0cnVlOwotCX0gZWxzZSBpZiAoKCFCVERNX0lzV2lmaUNvbm5lY3Rpb25FeGlzdChwYWRhcHRlcikpICYmCi0JCSAgICghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCAoX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpKSAmJgotCQkgICAoQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUgPT0gcEJ0ZG04NzIzLT5idFN0YXR1cykpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgaWRsZSArIEJ0IGNvbm5lY3RlZCBpZGxlISFcbiIpKTsKLQotCQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnRSZlNocmluayhwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotCi0JCWJ0ZG1fMkFudElnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0JCWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwocGFkYXB0ZXIsIDB4MjApOwotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQotCQliQ29tbW9uID0gdHJ1ZTsKLQl9IGVsc2UgaWYgKCgoQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3QocGFkYXB0ZXIpKSB8fAotCQkgICAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCAoX0ZXX1VOREVSX1NVUlZFWXxfRldfVU5ERVJfTElOS0lORykpKSkgJiYKLQkJICAgKEJUXzJBTlRfQlRfU1RBVFVTX0NPTk5FQ1RFRF9JRExFID09IHBCdGRtODcyMy0+YnRTdGF0dXMpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIG5vbi1pZGxlICsgQnQgY29ubmVjdGVkIGlkbGUhIVxuIikpOwotCi0JCWJ0ZG1fMkFudExvd1BlbmFsdHlSYShwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudFJmU2hyaW5rKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50Q29leFRhYmxlKHBhZGFwdGVyLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Ci0KLQkJYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQkJYnRkbV8yQW50RndEYWNTd2luZ0x2bChwYWRhcHRlciwgMHgyMCk7Ci0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0KLQkJYkNvbW1vbiA9IHRydWU7Ci0JfSBlbHNlIGlmICgoIUJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkgJiYKLQkJICAgKCFjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIChfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkpICYmCi0JCSAgIChCVF8yQU5UX0JUX1NUQVRVU19OT05fSURMRSA9PSBwQnRkbTg3MjMtPmJ0U3RhdHVzKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSBpZGxlICsgQlQgbm9uLWlkbGUhIVxuIikpOwotCi0JCWJ0ZG1fMkFudExvd1BlbmFsdHlSYShwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudFJmU2hyaW5rKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50Q29leFRhYmxlKHBhZGFwdGVyLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Ci0KLQkJYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQkJYnRkbV8yQW50RndEYWNTd2luZ0x2bChwYWRhcHRlciwgMHgyMCk7Ci0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCi0JCWJDb21tb24gPSB0cnVlOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIG5vbi1pZGxlICsgQlQgbm9uLWlkbGUhIVxuIikpOwotCQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnRSZlNocmluayhwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotCQlidGRtXzJBbnRJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwocGFkYXB0ZXIsIDB4MjApOwotCi0JCWJDb21tb24gPSBmYWxzZTsKLQl9Ci0JcmV0dXJuIGJDb21tb247Ci19Ci0KLXN0YXRpYyB2b2lkCi1idGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlNjb0hpZCwKLQkJCSAgICB1OCBiVHhQYXVzZSwgdTggbWF4SW50ZXJ2YWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudCAqcEJ0ZG04NzIzID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0ZG0yQW50OwotCXN0YXRpYyBzMzIJCXVwLCBkbiwgbSwgbiwgV2FpdENvdW50OwotCXMzMgkJCXJlc3VsdDsgICAvKiAwOiBubyBjaGFuZ2UsICsxOiBpbmNyZWFzZSBXaUZpIGR1cmF0aW9uLCAtMTogZGVjcmVhc2UgV2lGaSBkdXJhdGlvbiAqLwotCXU4IHJldHJ5Q291bnQgPSAwOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBUZG1hRHVyYXRpb25BZGp1c3QoKVxuIikpOwotCi0JaWYgKHBCdGRtODcyMy0+YlJlc2V0VGRtYUFkanVzdCkgewotCQlwQnRkbTg3MjMtPmJSZXNldFRkbWFBZGp1c3QgPSBmYWxzZTsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBmaXJzdCBydW4gVGRtYUR1cmF0aW9uQWRqdXN0KCkhIVxuIikpOwotCQlpZiAoYlNjb0hpZCkgewotCQkJaWYgKGJUeFBhdXNlKSB7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChiVHhQYXVzZSkgewotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJfSBlbHNlIHsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCX0KLQkJfQotCQl1cCA9IDA7Ci0JCWRuID0gMDsKLQkJbSA9IDE7Ci0JCW4gPSAzOwotCQlyZXN1bHQgPSAwOwotCQlXYWl0Q291bnQgPSAwOwotCX0gZWxzZSB7Ci0JCS8qIGFjY3F1aXJlIHRoZSBCVCBUUnggcmV0cnkgY291bnQgZnJvbSBCVF9JbmZvIGJ5dGUyICovCi0JCXJldHJ5Q291bnQgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idFJldHJ5Q250OwotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIHJldHJ5Q291bnQgPSAlZFxuIiwgcmV0cnlDb3VudCkpOwotCQlyZXN1bHQgPSAwOwotCQlXYWl0Q291bnQrKzsKLQotCQlpZiAocmV0cnlDb3VudCA9PSAwKSB7ICAvKiAgbm8gcmV0cnkgaW4gdGhlIGxhc3QgMi1zZWNvbmQgZHVyYXRpb24gKi8KLQkJCXVwKys7Ci0JCQlkbi0tOwotCi0JCQlpZiAoZG4gPD0gMCkKLQkJCQlkbiA9IDA7Ci0KLQkJCWlmICh1cCA+PSBuKSB7CS8qICBpZiCzc8TyIG4grdMyrO0gcmV0cnkgY291bnSssDAsIKtovdW8ZVdpRmkgZHVyYXRpb24gKi8KLQkJCQlXYWl0Q291bnQgPSAwOwotCQkJCW4gPSAzOwotCQkJCXVwID0gMDsKLQkJCQlkbiA9IDA7Ci0JCQkJcmVzdWx0ID0gMTsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEluY3JlYXNlIHdpZmkgZHVyYXRpb24hIVxuIikpOwotCQkJfQotCQl9IGVsc2UgaWYgKHJldHJ5Q291bnQgPD0gMykgewkvKiAgPD0gMyByZXRyeSBpbiB0aGUgbGFzdCAyLXNlY29uZCBkdXJhdGlvbiAqLwotCQkJdXAtLTsKLQkJCWRuKys7Ci0KLQkJCWlmICh1cCA8PSAwKQotCQkJCXVwID0gMDsKLQotCQkJaWYgKGRuID09IDIpIHsJLyogIGlmILNzxPIgMiCt0zKs7SByZXRyeSBjb3VudDwgMywgq2i91a+2V2lGaSBkdXJhdGlvbiAqLwotCQkJCWlmIChXYWl0Q291bnQgPD0gMikKLQkJCQkJbSsrOyAvKiAgwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXiAqLwotCQkJCWVsc2UKLQkJCQkJbSA9IDE7Ci0KLQkJCQlpZiAobSA+PSAyMCkgLyogbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4gKi8KLQkJCQkJbSA9IDIwOwotCi0JCQkJbiA9IDMqbTsKLQkJCQl1cCA9IDA7Ci0JCQkJZG4gPSAwOwotCQkJCVdhaXRDb3VudCA9IDA7Ci0JCQkJcmVzdWx0ID0gLTE7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBEZWNyZWFzZSB3aWZpIGR1cmF0aW9uIGZvciByZXRyeUNvdW50ZXI8MyEhXG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7ICAvKiByZXRyeSBjb3VudCA+IDMsIKV1rW4xprggcmV0cnkgY291bnQgPiAzLCCraL3Vr7ZXaUZpIGR1cmF0aW9uICovCi0JCQlpZiAoV2FpdENvdW50ID09IDEpCi0JCQkJbSsrOyAvKiAgwdenS6RAqr2mYqjirdNsZXZlbKSkqNOmXiAqLwotCQkJZWxzZQotCQkJCW0gPSAxOwotCi0JCQlpZiAobSA+PSAyMCkgLyogbSCzzKRqrcggPSAyMCAnILPMpGoxMjCs7SByZWNoZWNrrE+nX73VvuMgV2lGaSBkdXJhdGlvbi4gKi8KLQkJCQltID0gMjA7Ci0JCQluID0gMyptOwotCQkJdXAgPSAwOwotCQkJZG4gPSAwOwotCQkJV2FpdENvdW50ID0gMDsKLQkJCXJlc3VsdCA9IC0xOwotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBEZWNyZWFzZSB3aWZpIGR1cmF0aW9uIGZvciByZXRyeUNvdW50ZXI+MyEhXG4iKSk7Ci0JCX0KLQotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIG1heCBJbnRlcnZhbCA9ICVkXG4iLCBtYXhJbnRlcnZhbCkpOwotCQlpZiAobWF4SW50ZXJ2YWwgPT0gMSkgewotCQkJaWYgKGJUeFBhdXNlKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMVxuIikpOwotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA2OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMykgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA0KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gODsKLQkJCQl9Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDkpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMyk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTM7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMCkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDExKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTIpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNik7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTY7Ci0JCQkJfQotCi0JCQkJaWYgKHJlc3VsdCA9PSAtMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNjsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA2KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDg7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTMpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE2KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTY7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA4KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDY7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA1KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTQpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTMpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMzsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMFxuIikpOwotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA1KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDYpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNykgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA4KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNDsKLQkJCQl9Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEzKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gOTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE0KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTUpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNikgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEyKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMjsKLQkJCQl9Ci0KLQkJCQlpZiAocmVzdWx0ID09IC0xKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDIpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA0KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA5KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEwKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTA7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTApIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAzKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDIpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEwOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEwKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDkpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA5OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG1heEludGVydmFsID09IDIpIHsKLQkJCWlmIChiVHhQYXVzZSkgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgVHhQYXVzZSA9IDFcbiIpKTsKLQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDY7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAyKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNik7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNjsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDMpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNCkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDgpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDg7Ci0JCQkJfQotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA5KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE0OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTApIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTQ7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEyKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTYpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE2OwotCQkJCX0KLQkJCQlpZiAocmVzdWx0ID09IC0xKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA2OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDYpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA4KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gODsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE0OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE0KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTUpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTYpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNjsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAocmVzdWx0ID09IDEpIHsKLQkJCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDgpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNjsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA2KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA2OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE2KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTUpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE0OwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFR4UGF1c2UgPSAwXG4iKSk7Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDUpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAyOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNikgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDIpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDI7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA3KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDgpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA0KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA0OwotCQkJCX0KLQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTMpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTA7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNCkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEwKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTYpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMik7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTI7Ci0JCQkJfQotCQkJCWlmIChyZXN1bHQgPT0gLTEpIHsKLQkJCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDI7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAzKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDQpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA0OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDkpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDExKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEyKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA0KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDMpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDI7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMjsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDExKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEwKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTA7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTApIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChtYXhJbnRlcnZhbCA9PSAzKSB7Ci0JCQlpZiAoYlR4UGF1c2UpIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFR4UGF1c2UgPSAxXG4iKSk7Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMikgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAzKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDQpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA4KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA4OwotCQkJCX0KLQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gOSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEwKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTEpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMikgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE2KTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNjsKLQkJCQl9Ci0JCQkJaWYgKHJlc3VsdCA9PSAtMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA2KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgOCk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDg7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTMpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE2KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTY7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHJlc3VsdCA9PSAxKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA4KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDcpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSA3OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDcpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDc7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA3KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNikgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDE1OwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE1KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE1KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTU7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTQpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTUpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxNTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBUeFBhdXNlID0gMFxuIikpOwotCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA1KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDYpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNykgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA4KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgNCk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNDsKLQkJCQl9Ci0JCQkJaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEzKSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTQpIHsKLQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxNSkgewotCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDE2KSB7Ci0JCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTIpOwotCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwotCQkJCX0KLQkJCQlpZiAocmVzdWx0ID09IC0xKSB7Ci0JCQkJCWlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMykgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA0KTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gNDsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSA5KSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTApIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMik7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDEyOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChyZXN1bHQgPT0gMSkgewotCQkJCQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gNCkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAzKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMzsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAzKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDMpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAzOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMyk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDM7Ci0JCQkJCX0gZWxzZSBpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgPT0gMTIpIHsKLQkJCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTEpOwotCQkJCQkJcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUgPSAxMTsKLQkJCQkJfSBlbHNlIGlmIChwQnRkbTg3MjMtPmN1clBzVGRtYSA9PSAxMSkgewotCQkJCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCQkJCQlwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSA9IDExOwotCQkJCQl9IGVsc2UgaWYgKHBCdGRtODcyMy0+Y3VyUHNUZG1hID09IDEwKSB7Ci0JCQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDExKTsKLQkJCQkJCXBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlID0gMTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBQc1RkbWEgdHlwZSA6IHJlY29yZFBzVGRtYSA9JWRcbiIsIHBCdGRtODcyMy0+cHNUZG1hRHVBZGpUeXBlKSk7Ci0JLyogIGlmIGN1cnJlbnQgUHNUZG1hIG5vdCBtYXRjaCB3aXRoIHRoZSByZWNvcmRlZCBvbmUgKHdoZW4gc2NhbiwgZGhjcC4uLiksICovCi0JLyogIHRoZW4gd2UgaGF2ZSB0byBhZGp1c3QgaXQgYmFjayB0byB0aGUgcHJldmlvdXMgcmVjb3JkIG9uZS4gKi8KLQlpZiAocEJ0ZG04NzIzLT5jdXJQc1RkbWEgIT0gcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBQc1RkbWEgdHlwZSBkaXNtYXRjaCEhISwgY3VyUHNUZG1hID0lZCwgcmVjb3JkUHNUZG1hID0lZFxuIiwKLQkJCXBCdGRtODcyMy0+Y3VyUHNUZG1hLCBwQnRkbTg3MjMtPnBzVGRtYUR1QWRqVHlwZSkpOwotCi0JCWlmICghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgcEJ0ZG04NzIzLT5wc1RkbWFEdUFkalR5cGUpOwotCQllbHNlCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIHJvYW1pbmcvbGluay9zY2FuIGlzIHVuZGVyIHByb2dyZXNzLCB3aWxsIGFkanVzdCBuZXh0IHRpbWUhISFcbiIpKTsKLQl9Ci19Ci0KLS8qICBkZWZhdWx0IEFjdGlvbiAqLwotLyogIFNDTyBvbmx5IG9yIFNDTytQQU4oSFMpICovCi1zdGF0aWMgdm9pZCBidGRtXzJBbnQ4NzIzQVNDT0FjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGJ0UnNzaVN0YXRlLCBidFJzc2lTdGF0ZTE7Ci0KLQlpZiAoYnRkbV9OZWVkVG9EZWNCdFB3cihwYWRhcHRlcikpCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQllbHNlCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwXG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgbG93IFxuIikpOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCX0KLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDIwIG9yIExlZ2FjeVxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCWJ0UnNzaVN0YXRlMSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlMShwYWRhcHRlciwgMiwgMjcsIDApOwotCi0JCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMSk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgbG93IFxuIikpOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxNSk7Ci0JCX0KLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYnRkbV8yQW50ODcyM0FISURBY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBidFJzc2lTdGF0ZSwgYnRSc3NpU3RhdGUxOwotCi0JaWYgKGJ0ZG1fTmVlZFRvRGVjQnRQd3IocGFkYXB0ZXIpKQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JaWYgKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQ0MFxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGhpZ2ggXG4iKSk7Ci0JCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKHBhZGFwdGVyLCAweDg4MywgMHg0MCk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDkpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTMpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJYnRSc3NpU3RhdGUxID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUxKHBhZGFwdGVyLCAyLCAyNywgMCk7Ci0KLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGhpZ2ggXG4iKSk7Ci0JCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKHBhZGFwdGVyLCAweDg4MywgMHg0MCk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDkpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTMpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0KLQl9Ci19Ci0KLS8qIEEyRFAgb25seSAvIFBBTihFRFIpIG9ubHkvIEEyRFArUEFOKEhTKSAqLwotc3RhdGljIHZvaWQgYnRkbV8yQW50ODcyM0FBMkRQQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBidEluZm9FeHQgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idEluZm9FeHQ7Ci0KLQlpZiAoYnRkbV9OZWVkVG9EZWNCdFB3cihwYWRhcHRlcikpCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQllbHNlCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwXG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIGZhbHNlLCBmYWxzZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIGZhbHNlLCAxKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgdHJ1ZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgdHJ1ZSwgMSk7Ci0JCQl9Ci0JCX0KLQotCQkvKiAgc3cgbWVjaGFuaXNtICovCi0JCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDIwIG9yIExlZ2FjeVxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCWJ0UnNzaVN0YXRlMSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlMShwYWRhcHRlciwgMiwgMjcsIDApOwotCi0JCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgZmFsc2UsIDMpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIGZhbHNlLCBmYWxzZSwgMSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgbG93IFxuIikpOwotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgdHJ1ZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIHRydWUsIDEpOwotCQkJfQotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudDg3MjNBUEFORURSQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMTsKLQotCWlmIChidGRtX05lZWRUb0RlY0J0UHdyKHBhZGFwdGVyKSkKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCWVsc2UKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIGZhbHNlKTsKLQotCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUNDBcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCi0JCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7Ci0JCQlQbGF0Zm9ybUVGSU9Xcml0ZTFCeXRlKHBhZGFwdGVyLCAweDg4MywgMHg0MCk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDIpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlidFJzc2lTdGF0ZTEgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEocGFkYXB0ZXIsIDIsIDI3LCAwKTsKLQotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMik7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgbG93IFxuIikpOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi0vKiBQQU4oSFMpIG9ubHkgKi8KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudDg3MjNBUEFOSFNBY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBidFJzc2lTdGF0ZTsKLQotCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUNDBcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgNDcsIDApOwotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCQl9Ci0JCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgZmFsc2UsIDApOwotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDQ3LCAwKTsKLQotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaFxuIikpOwotCQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0KLQkJCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93XG4iKSk7Ci0JCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0KLQkJCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi0vKiBQQU4oRURSKStBMkRQICovCi1zdGF0aWMgdm9pZCBidGRtXzJBbnQ4NzIzQVBBTkVEUkEyRFBBY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBidFJzc2lTdGF0ZSwgYnRSc3NpU3RhdGUxLCBidEluZm9FeHQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlidEluZm9FeHQgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idEluZm9FeHQ7Ci0KLQlpZiAoYnRkbV9OZWVkVG9EZWNCdFB3cihwYWRhcHRlcikpCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQllbHNlCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwXG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCS8qICBmdyBtZWNoYW5pc20gKi8KLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA2KTsKLQkJCX0KLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJYnRSc3NpU3RhdGUxID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUxKHBhZGFwdGVyLCAyLCAyNywgMCk7Ci0KLQkJaWYgKChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQkJaWYgKGJ0SW5mb0V4dCZCSVQoMCkpIHsJLyogYTJkcCByYXRlLCAxOmJhc2ljIC8wOmVkciAqLwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGJhc2ljIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCA0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBsb3cgXG4iKSk7Ci0JCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDgpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDYpOwotCQkJfQotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fMkFudDg3MjNBUEFORURSSElEQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMTsKLQotCWlmIChidGRtX05lZWRUb0RlY0J0UHdyKHBhZGFwdGVyKSkKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIHRydWUpOwotCWVsc2UKLQkJYnRkbV8yQW50RGVjQnRQd3IocGFkYXB0ZXIsIGZhbHNlKTsKLQotCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUNDBcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlidFJzc2lTdGF0ZTEgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEocGFkYXB0ZXIsIDIsIDI3LCAwKTsKLQotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTApOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTQpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgaGlnaCBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2kgbG93IFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudEFkY0JhY2tPZmYocGFkYXB0ZXIsIGZhbHNlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0KLQl9Ci19Ci0KLS8qICBISUQrQTJEUCtQQU4oRURSKSAqLwotc3RhdGljIHZvaWQgYnRkbV8yQW50ODcyM0FISURBMkRQUEFORURSQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMSwgYnRJbmZvRXh0OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JYnRJbmZvRXh0ID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbmZvRXh0OwotCi0JaWYgKGJ0ZG1fTmVlZFRvRGVjQnRQd3IocGFkYXB0ZXIpKQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JaWYgKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQ0MFxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTYpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJCX0KLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JfSBlbHNlIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAgb3IgTGVnYWN5XG4iKSk7Ci0JCWJ0UnNzaVN0YXRlMSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlMShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAyNywgMCk7Ci0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDEyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCB0cnVlLCAxMCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFBzVGRtYShwYWRhcHRlciwgdHJ1ZSwgMTYpOwotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBlZHIgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIHRydWUsIDE0KTsKLQkJCX0KLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGhpZ2ggXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYnRkbV8yQW50ODcyM0FISURBMkRQQWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggYnRSc3NpU3RhdGUsIGJ0UnNzaVN0YXRlMSwgYnRJbmZvRXh0OwotCi0JYnRJbmZvRXh0ID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRJbmZvRXh0OwotCi0JaWYgKGJ0ZG1fTmVlZFRvRGVjQnRQd3IocGFkYXB0ZXIpKQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgdHJ1ZSk7Ci0JZWxzZQotCQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotCi0JaWYgKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQ0MFxuIikpOwotCQlidFJzc2lTdGF0ZSA9IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHBhZGFwdGVyLCAyLCAzNywgMCk7Ci0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIHRydWUsIGZhbHNlLCAzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCB0cnVlLCBmYWxzZSwgMSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgdHJ1ZSwgdHJ1ZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgdHJ1ZSwgdHJ1ZSwgMSk7Ci0JCQl9Ci0JCX0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMzcsIDApOwotCQlidFJzc2lTdGF0ZTEgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgMjcsIDApOwotCi0JCWlmICgoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCi0JCQlpZiAoYnRJbmZvRXh0JkJJVCgwKSkgewkvKiBhMmRwIHJhdGUsIDE6YmFzaWMgLzA6ZWRyICovCi0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgYmFzaWMgcmF0ZSBcbiIpKTsKLQkJCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIHRydWUsIGZhbHNlLCAzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoImEyZHAgZWRyIHJhdGUgXG4iKSk7Ci0JCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCB0cnVlLCBmYWxzZSwgMSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWlmIChidEluZm9FeHQmQklUKDApKSB7CS8qIGEyZHAgcmF0ZSwgMTpiYXNpYyAvMDplZHIgKi8KLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiYTJkcCBiYXNpYyByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgdHJ1ZSwgdHJ1ZSwgMyk7Ci0JCQl9IGVsc2UgewotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJhMmRwIGVkciByYXRlIFxuIikpOwotCQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgdHJ1ZSwgdHJ1ZSwgMSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9ISUdIKSB8fAotCQkgICAgKGJ0UnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQkJYnRkbV8yQW50QWdjVGFibGUocGFkYXB0ZXIsIHRydWUpOwotCQkJYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBidGRtXzJBbnQ4NzIzQUEyZHAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBidFJzc2lTdGF0ZSwgYnRSc3NpU3RhdGUxLCBidEluZm9FeHQ7Ci0KLQlidEluZm9FeHQgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idEluZm9FeHQ7Ci0KLQlpZiAoYnRkbV9OZWVkVG9EZWNCdFB3cihwYWRhcHRlcikpCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCB0cnVlKTsKLQllbHNlCi0JCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0JLyogIGNvZXggdGFibGUgKi8KLQlidGRtXzJBbnRDb2V4VGFibGUocGFkYXB0ZXIsIDB4NTU1NTU1NTUsIDB4ZmZmZiwgMHgzKTsKLQlidGRtXzJBbnRJZ25vcmVXbGFuQWN0KHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIVDQwXG4iKSk7Ci0JCWJ0UnNzaVN0YXRlID0gQlRETV9DaGVja0NvZXhSU1NJU3RhdGUocGFkYXB0ZXIsIDIsIDM3LCAwKTsKLQkJLyogIGZ3IG1lY2hhbmlzbSAqLwotCQlpZiAoKGJ0UnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSCkpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBoaWdoIFxuIikpOwotCQkJUGxhdGZvcm1FRklPV3JpdGUxQnl0ZShwYWRhcHRlciwgMHg4ODMsIDB4NDApOwotCQkJYnRkbV8yQW50VGRtYUR1cmF0aW9uQWRqdXN0KHBhZGFwdGVyLCBmYWxzZSwgZmFsc2UsIDEpOwotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmkgcnNzaS0xIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIHRydWUsIDEpOwotCQl9Ci0KLQkJLyogIHN3IG1lY2hhbmlzbSAqLwotCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiSFQyMCBvciBMZWdhY3lcbiIpKTsKLQkJYnRSc3NpU3RhdGUgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShwYWRhcHRlciwgMiwgNDcsIDApOwotCQlidFJzc2lTdGF0ZTEgPSBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEocGFkYXB0ZXIsIDIsIDI3LCAwKTsKLQotCQkvKiAgZncgbWVjaGFuaXNtICovCi0JCWlmICgoYnRSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfSElHSCkgfHwKLQkJICAgIChidFJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpLTEgaGlnaCBcbiIpKTsKLQkJCVBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUocGFkYXB0ZXIsIDB4ODgzLCAweDQwKTsKLQkJCWJ0ZG1fMkFudFRkbWFEdXJhdGlvbkFkanVzdChwYWRhcHRlciwgZmFsc2UsIGZhbHNlLCAxKTsKLQkJfSBlbHNlIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpIHJzc2ktMSBsb3cgXG4iKSk7Ci0JCQlidGRtXzJBbnRUZG1hRHVyYXRpb25BZGp1c3QocGFkYXB0ZXIsIGZhbHNlLCB0cnVlLCAxKTsKLQkJfQotCi0JCS8qICBzdyBtZWNoYW5pc20gKi8KLQkJaWYgKChidFJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0hJR0gpIHx8Ci0JCSAgICAoYnRSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGhpZ2ggXG4iKSk7Ci0JCQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgdHJ1ZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCB0cnVlKTsKLQkJCWJ0ZG1fMkFudERhY1N3aW5nKHBhZGFwdGVyLCBmYWxzZSwgMHhjMCk7Ci0JCX0gZWxzZSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiV2lmaSByc3NpIGxvdyBcbiIpKTsKLQkJCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnRBZGNCYWNrT2ZmKHBhZGFwdGVyLCBmYWxzZSk7Ci0JCQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCQl9Ci0JfQotfQotCi0vKiAgZXh0ZXJuIGZ1bmN0aW9uIHN0YXJ0IHdpdGggQlRETV8gKi8KLXN0YXRpYyB2b2lkIEJURE1fMkFudFBhcmFJbml0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0KLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDJBbnQgUGFyYW1ldGVyIEluaXQhIVxuIikpOwotCi0JLyogIEVuYWJsZSBjb3VudGVyIHN0YXRpc3RpY3MgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDc2ZSwgMHg0KTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDc3OCwgMHgzKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDQwLCAweDIwKTsKLQotCS8qICBmb3JjZSB0byByZXNldCBjb2V4IG1lY2hhbmlzbSAqLwotCXBCdGRtODcyMy0+cHJlVmFsMHg2YzAgPSAweDA7Ci0JYnRkbV8yQW50Q29leFRhYmxlKHBhZGFwdGVyLCAweDU1NTU1NTU1LCAweGZmZmYsIDB4Myk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVQc1RkbWFPbiA9IHRydWU7Ci0JYnRkbV8yQW50UHNUZG1hKHBhZGFwdGVyLCBmYWxzZSwgMCk7Ci0KLQlwQnRkbTg3MjMtPnByZUZ3RGFjU3dpbmdMdmwgPSAweDEwOwotCWJ0ZG1fMkFudEZ3RGFjU3dpbmdMdmwocGFkYXB0ZXIsIDB4MjApOwotCi0JcEJ0ZG04NzIzLT5iUHJlRGVjQnRQd3IgPSB0cnVlOwotCWJ0ZG1fMkFudERlY0J0UHdyKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVBZ2NUYWJsZUVuID0gdHJ1ZTsKLQlidGRtXzJBbnRBZ2NUYWJsZShwYWRhcHRlciwgZmFsc2UpOwotCi0JcEJ0ZG04NzIzLT5iUHJlQWRjQmFja09mZiA9IHRydWU7Ci0JYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCi0JcEJ0ZG04NzIzLT5iUHJlTG93UGVuYWx0eVJhID0gdHJ1ZTsKLQlidGRtXzJBbnRMb3dQZW5hbHR5UmEocGFkYXB0ZXIsIGZhbHNlKTsKLQotCXBCdGRtODcyMy0+YlByZVJmUnhMcGZTaHJpbmsgPSB0cnVlOwotCWJ0ZG1fMkFudFJmU2hyaW5rKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlwQnRkbTg3MjMtPmJQcmVEYWNTd2luZ09uID0gdHJ1ZTsKLQlidGRtXzJBbnREYWNTd2luZyhwYWRhcHRlciwgZmFsc2UsIDB4YzApOwotCi0JcEJ0ZG04NzIzLT5iUHJlSWdub3JlV2xhbkFjdCA9IHRydWU7Ci0JYnRkbV8yQW50SWdub3JlV2xhbkFjdChwYWRhcHRlciwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNXzJBbnRId0NvZXhBbGxPZmY4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWJ0ZG1fMkFudENvZXhUYWJsZShwYWRhcHRlciwgMHg1NTU1NTU1NSwgMHhmZmZmLCAweDMpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNXzJBbnRGd0NvZXhBbGxPZmY4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWJ0ZG1fMkFudElnbm9yZVdsYW5BY3QocGFkYXB0ZXIsIGZhbHNlKTsKLQlidGRtXzJBbnRQc1RkbWEocGFkYXB0ZXIsIGZhbHNlLCAwKTsKLQlidGRtXzJBbnRGd0RhY1N3aW5nTHZsKHBhZGFwdGVyLCAweDIwKTsKLQlidGRtXzJBbnREZWNCdFB3cihwYWRhcHRlciwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNXzJBbnRTd0NvZXhBbGxPZmY4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWJ0ZG1fMkFudEFnY1RhYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JYnRkbV8yQW50QWRjQmFja09mZihwYWRhcHRlciwgZmFsc2UpOwotCWJ0ZG1fMkFudExvd1BlbmFsdHlSYShwYWRhcHRlciwgZmFsc2UpOwotCWJ0ZG1fMkFudFJmU2hyaW5rKHBhZGFwdGVyLCBmYWxzZSk7Ci0JYnRkbV8yQW50RGFjU3dpbmcocGFkYXB0ZXIsIGZhbHNlLCAweGMwKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV8yQW50RndDMmhCdEluZm84NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidGRtXzg3MjNhXzJhbnQgKnBCdGRtODcyMyA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudDsKLQl1OCBidEluZm8gPSAwOwotCXU4IGFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX1VOREVGSU5FRDsKLQl1OCBiQnRMaW5rRXhpc3QgPSBmYWxzZSwgYkJ0SHNNb2RlRXhpc3QgPSBmYWxzZTsKLQotCWJ0SW5mbyA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmMyaEJ0SW5mb09yaWdpbmFsOwotCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19JRExFOwotCi0JLyogIGNoZWNrIEJJVDIgZmlyc3QgPT0+IGNoZWNrIGlmIGJ0IGlzIHVuZGVyIGlucXVpcnkgb3IgcGFnZSBzY2FuICovCi0JaWYgKGJ0SW5mbyAmIEJJVCgyKSkgewotCQlpZiAoIXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJDMmhCdElucXVpcnlQYWdlKSB7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRGb3JCdE9wZXJhdGlvbiA9IHRydWU7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQgPSAxOwotCQkJYnRkbV8yQW50QnRJbnF1aXJ5UGFnZShwYWRhcHRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQrKzsKLQkJCWJ0ZG1fSG9sZEZvckJ0SW5xUGFnZShwYWRhcHRlcik7Ci0JCX0KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYkMyaEJ0SW5xdWlyeVBhZ2UgPSB0cnVlOwotCi0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYkMyaEJ0SW5xdWlyeVBhZ2UgPSBmYWxzZTsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkRm9yQnRPcGVyYXRpb24gPSBmYWxzZTsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkUGVyaW9kQ250ID0gMDsKLQotCX0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCSgiW0JUQzJIXSwgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYkMyaEJ0SW5xdWlyeVBhZ2UgPSV4IHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCA9JXggcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkRm9yQnRPcGVyYXRpb24gPSV4XG4iLAotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5iQzJoQnRJbnF1aXJ5UGFnZSwKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkUGVyaW9kQ250LAotCQlwQnRNZ250LT5FeHRDb25maWcuYkhvbGRGb3JCdE9wZXJhdGlvbikpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkoIltCVEMySF0sICAgYnRJbmZvID0leCAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmMyaEJ0SW5mb09yaWdpbmFsID0leFxuIiwKLQkJYnRJbmZvLCBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5jMmhCdEluZm9PcmlnaW5hbCkpOwotCWlmIChidEluZm8mQlRfSU5GT19BQ0wpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVEMySF0sIEJUSW5mbzogYkNvbm5lY3QgPSB0cnVlICAgYnRJbmZvID0leFxuIiwgYnRJbmZvKSk7Ci0JCWJCdExpbmtFeGlzdCA9IHRydWU7Ci0JCWlmICgoKGJ0SW5mbyYoQlRfSU5GT19GVFB8QlRfSU5GT19BMkRQfEJUX0lORk9fSElEfEJUX0lORk9fU0NPX0JVU1kpKSAhPSAwKSB8fAotCQkgICAgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRSZXRyeUNudCA+IDApIHsKLQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19OT05fSURMRTsKLQkJfSBlbHNlIHsKLQkJCXBCdGRtODcyMy0+YnRTdGF0dXMgPSBCVF8yQU5UX0JUX1NUQVRVU19DT05ORUNURURfSURMRTsKLQkJfQotCi0JCWlmIChidEluZm8mQlRfSU5GT19TQ08gfHwgYnRJbmZvJkJUX0lORk9fU0NPX0JVU1kpIHsKLQkJCWlmIChidEluZm8mQlRfSU5GT19GVFAgfHwgYnRJbmZvJkJUX0lORk9fQTJEUCB8fCBidEluZm8mQlRfSU5GT19ISUQpIHsKLQkJCQlzd2l0Y2ggKGJ0SW5mbyYweGUwKSB7Ci0JCQkJY2FzZSBCVF9JTkZPX0hJRDoKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBISURcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEJUX0lORk9fQTJEUDoKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBFcnJvciEhISBTQ08gKyBBMkRQXG4iKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQlRfSU5GT19GVFA6Ci0JCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBTQ08gKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19TQ087Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKEJUX0lORk9fSElEIHwgQlRfSU5GT19BMkRQKToKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBBMkRQXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIChCVF9JTkZPX0hJRCB8IEJUX0lORk9fRlRQKToKLQkJCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihIUylcbiIpKTsKLQkJCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwotCQkJCQl9IGVsc2UgewotCQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oRURSKVxuIikpOwotCQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIChCVF9JTkZPX0EyRFAgfCBCVF9JTkZPX0ZUUCk6Ci0JCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBBMkRQICsgUEFOKEhTKVxuIikpOwotCQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fQTJEUDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIChCVF9JTkZPX0hJRCB8IEJUX0lORk9fQTJEUCB8IEJUX0lORk9fRlRQKToKLQkJCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIFNDTyBvbmx5XG4iKSk7Ci0JCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fU0NPOwotCQkJfQotCQl9IGVsc2UgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBub24gU0NPXG4iKSk7Ci0JCQlzd2l0Y2ggKGJ0SW5mbyYweGUwKSB7Ci0JCQljYXNlIEJUX0lORk9fSElEOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEXG4iKSk7Ci0JCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF9JTkZPX0EyRFA6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCAgQTJEUFxuIikpOwotCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0EyRFA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUX0lORk9fRlRQOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUEFOKEVEUilcbiIpKTsKLQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoQlRfSU5GT19ISUQgfCBCVF9JTkZPX0EyRFApOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUFxuIikpOwotCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoQlRfSU5GT19ISUR8QlRfSU5GT19GVFApOgotCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIFBBTihIUylcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBISUQgKyBQQU4oRURSKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgKEJUX0lORk9fQTJEUHxCVF9JTkZPX0ZUUCk6Ci0JCQkJaWYgKGJCdEhzTW9kZUV4aXN0KSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgQTJEUCArIFBBTihIUylcbiIpKTsKLQkJCQkJYWxnb3JpdGhtID0gQlRfMkFOVF9DT0VYX0FMR09fQTJEUDsKLQkJCQl9IGVsc2UgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEEyRFAgKyBQQU4oRURSKVxuIikpOwotCQkJCQlhbGdvcml0aG0gPSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChCVF9JTkZPX0hJRHxCVF9JTkZPX0EyRFB8QlRfSU5GT19GVFApOgotCQkJCWlmIChiQnRIc01vZGVFeGlzdCkgewotCQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEhJRCArIEEyRFAgKyBQQU4oSFMpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOwotCQkJCX0gZWxzZSB7Ci0JCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgSElEICsgQTJEUCArIFBBTihFRFIpXG4iKSk7Ci0JCQkJCWFsZ29yaXRobSA9IEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDMkhdLCBCVEluZm86IGJDb25uZWN0ID0gZmFsc2VcbiIpKTsKLQkJcEJ0ZG04NzIzLT5idFN0YXR1cyA9IEJUXzJBTlRfQlRfU1RBVFVTX0lETEU7Ci0JfQotCi0JcEJ0ZG04NzIzLT5jdXJBbGdvcml0aG0gPSBhbGdvcml0aG07Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBBbGdvcml0aG0gPSAlZCBcbiIsIHBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtKSk7Ci0KLS8qIEZyb20gKi8KLQlCVERNX0NoZWNrV2lGaVN0YXRlKHBhZGFwdGVyKTsKLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gTWFudWFsIGNvbnRyb2wsIHdvbid0IGV4ZWN1dGUgYnQgY29leGlzdCBtZWNoYW5pc20hIVxuIikpOwotCQlyZXR1cm47Ci0JfQotfQotCi12b2lkIEJURE1fMkFudEJ0Q29leGlzdDg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCXU4IGJ0SW5mb09yaWdpbmFsID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRkbV84NzIzYV8yYW50ICpwQnRkbTg3MjMgPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRkbTJBbnQ7Ci0KLQlpZiAoQlRETV9CdFByb2ZpbGVTdXBwb3J0KHBhZGFwdGVyKSkgewotCQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkRm9yQnRPcGVyYXRpb24pIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gZm9yIEJUIE9wZXJhdGlvbiBhZGp1c3QhIVxuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChwQnRNZ250LT5FeHRDb25maWcuYkhvbGRQZXJpb2RDbnQpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIb2xkIEJUIGlucXVpcnkvcGFnZSBzY2FuIHNldHRpbmcgKGNudCA9ICVkKSEhXG4iLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCkpOwotCQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCA+PSAxMSkgewotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCA9IDA7Ci0JCQkJLyogIG5leHQgdGltZSB0aGUgY29leGlzdCBwYXJhbWV0ZXJzIHNob3VsZCBiZSByZXNldCBhZ2Fpbi4gKi8KLQkJCX0gZWxzZSB7Ci0JCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkUGVyaW9kQ250Kys7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAocEJ0RGJnLT5kYmdDdHJsKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltEYmcgY29udHJvbF0sICIpKTsKLQotCQlwQnRkbTg3MjMtPmN1ckFsZ29yaXRobSA9IGJ0ZG1fQWN0aW9uQWxnb3JpdGhtKHBhZGFwdGVyKTsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBBbGdvcml0aG0gPSAlZCBcbiIsIHBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtKSk7Ci0KLQkJaWYgKGJ0ZG1fSXMyQW50ODcyM0FDb21tb25BY3Rpb24ocGFkYXB0ZXIpKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50IGNvbW1vbi5cbiIpKTsKLQkJCXBCdGRtODcyMy0+YlJlc2V0VGRtYUFkanVzdCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocEJ0ZG04NzIzLT5jdXJBbGdvcml0aG0gIT0gcEJ0ZG04NzIzLT5wcmVBbGdvcml0aG0pIHsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIHByZUFsZ29yaXRobSA9JWQsIGN1ckFsZ29yaXRobSA9JWRcbiIsCi0JCQkJcEJ0ZG04NzIzLT5wcmVBbGdvcml0aG0sIHBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtKSk7Ci0JCQkJcEJ0ZG04NzIzLT5iUmVzZXRUZG1hQWRqdXN0ID0gdHJ1ZTsKLQkJCX0KLQkJCXN3aXRjaCAocEJ0ZG04NzIzLT5jdXJBbGdvcml0aG0pIHsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fU0NPOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFNDTy5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQVNDT0FjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX0hJRDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBISUQuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FISURBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19BMkRQOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEEyRFAuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FBMkRQQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFORURSOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTihFRFIpLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBUEFORURSQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFOSFM6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSFMgbW9kZS5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQVBBTkhTQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0EyRFA6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gUEFOK0EyRFAuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FQQU5FRFJBMkRQQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fUEFORURSX0hJRDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBQQU4oRURSKStISUQuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FQQU5FRFJISURBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFI6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSElEK0EyRFArUEFOLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBSElEQTJEUFBBTkVEUkFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhJRCtBMkRQLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBSElEQTJEUEFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IDAuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FBMkRQQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXBCdGRtODcyMy0+cHJlQWxnb3JpdGhtID0gcEJ0ZG04NzIzLT5jdXJBbGdvcml0aG07Ci0JCX0KLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0gR2V0IGJ0IGluZm8gYnkgZnchIVxuIikpOwotCQkvKiBtc2cgc2hvd3MgYzJoIHJzcCBmb3IgYnRfaW5mbyBpcyByZWNlaXZlZCBvciBub3QuICovCi0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5iQzJoQnRJbmZvUmVxU2VudCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSBjMmggZm9yIGJ0SW5mbyBub3QgcmN2ZCB5ZXQhIVxuIikpOwotCi0JCWJ0SW5mb09yaWdpbmFsID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYzJoQnRJbmZvT3JpZ2luYWw7Ci0KLQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZEZvckJ0T3BlcmF0aW9uKSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIGZvciBCVCBPcGVyYXRpb24gYWRqdXN0ISFcbiIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJIb2xkUGVyaW9kQ250KSB7Ci0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsCi0JCQkJKCJIb2xkIEJUIGlucXVpcnkvcGFnZSBzY2FuIHNldHRpbmcgKGNudCA9ICVkKSEhXG4iLAotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCkpOwotCQkJaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCA+PSAxMSkgewotCQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCA9IDA7Ci0JCQkJLyogIG5leHQgdGltZSB0aGUgY29leGlzdCBwYXJhbWV0ZXJzIHNob3VsZCBiZSByZXNldCBhZ2Fpbi4gKi8KLQkJCX0gZWxzZSB7Ci0JCQkJIHBCdE1nbnQtPkV4dENvbmZpZy5iSG9sZFBlcmlvZENudCsrOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHBCdERiZy0+ZGJnQ3RybCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRGJnIGNvbnRyb2xdLCAiKSk7Ci0JCWlmIChidGRtX0lzMkFudDg3MjNBQ29tbW9uQWN0aW9uKHBhZGFwdGVyKSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCBjb21tb24uXG4iKSk7Ci0JCQlwQnRkbTg3MjMtPmJSZXNldFRkbWFBZGp1c3QgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKHBCdGRtODcyMy0+Y3VyQWxnb3JpdGhtICE9IHBCdGRtODcyMy0+cHJlQWxnb3JpdGhtKSB7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLAotCQkJCQkoIltCVENvZXhdLCBwcmVBbGdvcml0aG0gPSVkLCBjdXJBbGdvcml0aG0gPSVkXG4iLAotCQkJCQlwQnRkbTg3MjMtPnByZUFsZ29yaXRobSwKLQkJCQkJcEJ0ZG04NzIzLT5jdXJBbGdvcml0aG0pKTsKLQkJCQlwQnRkbTg3MjMtPmJSZXNldFRkbWFBZGp1c3QgPSB0cnVlOwotCQkJfQotCQkJc3dpdGNoIChwQnRkbTg3MjMtPmN1ckFsZ29yaXRobSkgewotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19TQ086Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gU0NPLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBU0NPQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fSElEOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IEhJRC5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQUhJREFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX0EyRFA6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gQTJEUC5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQUEyZHAocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFI6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gUEFOKEVEUikuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FQQU5FRFJBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19QQU5IUzoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBIUyBtb2RlLlxuIikpOwotCQkJCWJ0ZG1fMkFudDg3MjNBUEFOSFNBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfQTJEUDoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBQQU4rQTJEUC5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQVBBTkVEUkEyRFBBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElEOgotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJBY3Rpb24gMi1BbnQsIGFsZ29yaXRobSA9IFBBTihFRFIpK0hJRC5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQVBBTkVEUkhJREFjdGlvbihwYWRhcHRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEJUXzJBTlRfQ09FWF9BTEdPX0hJRF9BMkRQX1BBTkVEUjoKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQWN0aW9uIDItQW50LCBhbGdvcml0aG0gPSBISUQrQTJEUCtQQU4uXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FISURBMkRQUEFORURSQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFA6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gSElEK0EyRFAuXG4iKSk7Ci0JCQkJYnRkbV8yQW50ODcyM0FISURBMkRQQWN0aW9uKHBhZGFwdGVyKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkFjdGlvbiAyLUFudCwgYWxnb3JpdGhtID0gMC5cbiIpKTsKLQkJCQlidGRtXzJBbnQ4NzIzQUEyRFBBY3Rpb24ocGFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcEJ0ZG04NzIzLT5wcmVBbGdvcml0aG0gPSBwQnRkbTg3MjMtPmN1ckFsZ29yaXRobTsKLQkJfQotCX0KLX0KLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMyQW50LmMgPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMuYyA9PT09PSAqLwotCi1zdGF0aWMgdTggYnRDb2V4RGJnQnVmW0JUX1RNUF9CVUZfU0laRV07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBCdFByb2ZpbGVTdHJpbmdbXSA9IHsKLQkiTk9ORSIsCi0JIkEyRFAiLAotCSJQQU4iLAotCSJISUQiLAotCSJTQ08iLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEJ0U3BlY1N0cmluZ1tdID0gewotCSIxLjBiIiwKLQkiMS4xIiwKLQkiMS4yIiwKLQkiMi4wK0VEUiIsCi0JIjIuMStFRFIiLAotCSIzLjArSFMiLAotCSI0LjAiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEJ0TGlua1JvbGVTdHJpbmdbXSA9IHsKLQkiTWFzdGVyIiwKLQkiU2xhdmUiLAotfTsKLQotc3RhdGljIHU4IGJ0ZG1fQnRXaWZpQW50TnVtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0KLQlpZiAoQW50X3gyID09IHBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9OdW0pIHsKLQkJaWYgKEFudF94MiA9PSBwQnRDb2V4LT5Ub3RhbEFudE51bSkKLQkJCXJldHVybiBBbnRfeDI7Ci0JCWVsc2UKLQkJCXJldHVybiBBbnRfeDE7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIEFudF94MTsKLQl9Ci0JcmV0dXJuIEFudF94MjsKLX0KLQotc3RhdGljIHZvaWQgYnRkbV9CdEh3Q291bnRlcnNNb25pdG9yKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTMyCXJlZ0hQVHhSeCwgcmVnTFBUeFJ4LCB1NFRtcDsKLQl1MzIJcmVnSFBUeCA9IDAsIHJlZ0hQUnggPSAwLCByZWdMUFR4ID0gMCwgcmVnTFBSeCA9IDA7Ci0KLQlyZWdIUFR4UnggPSBSRUdfSElHSF9QUklPUklUWV9UWFJYOwotCXJlZ0xQVHhSeCA9IFJFR19MT1dfUFJJT1JJVFlfVFhSWDsKLQotCXU0VG1wID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgcmVnSFBUeFJ4KTsKLQlyZWdIUFR4ID0gdTRUbXAgJiBiTWFza0xXb3JkOwotCXJlZ0hQUnggPSAodTRUbXAgJiBiTWFza0hXb3JkKT4+MTY7Ci0KLQl1NFRtcCA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIHJlZ0xQVHhSeCk7Ci0JcmVnTFBUeCA9IHU0VG1wICYgYk1hc2tMV29yZDsKLQlyZWdMUFJ4ID0gKHU0VG1wICYgYk1hc2tIV29yZCk+PjE2OwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5VHggPSByZWdIUFR4OwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVJ4ID0gcmVnSFBSeDsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4ID0gcmVnTFBUeDsKLQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVJ4ID0gcmVnTFBSeDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJIaWdoIFByaW9yaXR5IFR4L1J4ID0gJWQgLyAlZFxuIiwgcmVnSFBUeCwgcmVnSFBSeCkpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJMb3cgUHJpb3JpdHkgVHgvUnggPSAlZCAvICVkXG4iLCByZWdMUFR4LCByZWdMUFJ4KSk7Ci0KLQkvKiAgcmVzZXQgY291bnRlciAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NzZlLCAweGMpOwotfQotCi0vKiAgVGhpcyBmdW5jdGlvbiBjaGVjayBpZiA4NzIzIGJ0IGlzIGRpc2FibGVkICovCi1zdGF0aWMgdm9pZCBidGRtX0J0RW5hYmxlRGlzYWJsZUNoZWNrODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBidEFsaWZlID0gdHJ1ZTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotI2lmZGVmIENIRUNLX0JUX0VYSVNUX0ZST01fUkVHCi0JdTggdmFsODsKLQotCS8qICBveDY4WzI4XT0gMSA9PiBCVCBlbmFibGU7IG90aGVyd2lzZSBkaXNhYmxlICovCi0JdmFsOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg2Qik7Ci0JaWYgKCEodmFsOCAmIEJJVCg0KSkpCi0JCWJ0QWxpZmUgPSBmYWxzZTsKLQotCWlmIChidEFsaWZlKQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iQ3VyQnREaXNhYmxlZCA9IGZhbHNlOwotCWVsc2UKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQgPSB0cnVlOwotI2Vsc2UKLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5VHggPT0gMCAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5oaWdoUHJpb3JpdHlSeCA9PSAwICYmCi0JICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5VHggPT0gMCAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVJ4ID09IDApCi0JCWJ0QWxpZmUgPSBmYWxzZTsKLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5VHggPT0gMHhlYWVhICYmCi0JICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVJ4ID09IDB4ZWFlYSAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVR4ID09IDB4ZWFlYSAmJgotCSAgICBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5sb3dQcmlvcml0eVJ4ID09IDB4ZWFlYSkKLQkJYnRBbGlmZSA9IGZhbHNlOwotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5oaWdoUHJpb3JpdHlUeCA9PSAweGZmZmYgJiYKLQkgICAgcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5UnggPT0gMHhmZmZmICYmCi0JICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5VHggPT0gMHhmZmZmICYmCi0JICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5UnggPT0gMHhmZmZmKQotCQlidEFsaWZlID0gZmFsc2U7Ci0JaWYgKGJ0QWxpZmUpIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYnRBY3RpdmVaZXJvQ250ID0gMDsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQgPSBmYWxzZTsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIjg3MjNBIEJUIGlzIGVuYWJsZWQgISFcbiIpKTsKLQl9IGVsc2UgewotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5idEFjdGl2ZVplcm9DbnQrKzsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIjg3MjNBIGJ0IGFsbCBjb3VudGVycyA9IDAsICVkIHRpbWVzISFcbiIsCi0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYnRBY3RpdmVaZXJvQ250KSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5idEFjdGl2ZVplcm9DbnQgPj0gMikgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQgPSB0cnVlOwotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIjg3MjNBIEJUIGlzIGRpc2FibGVkICEhXG4iKSk7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCWlmICghcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQpIHsKLQkJaWYgKEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHBhZGFwdGVyKSkKLQkJCUJURE1fU2V0RndDaG5sSW5mbyhwYWRhcHRlciwgUlRfTUVESUFfQ09OTkVDVCk7Ci0JCWVsc2UKLQkJCUJURE1fU2V0RndDaG5sSW5mbyhwYWRhcHRlciwgUlRfTUVESUFfRElTQ09OTkVDVCk7Ci0JfQotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmJQcmVCdERpc2FibGVkICE9Ci0JICAgIHBIYWxEYXRhLT5idF9jb2V4aXN0LmJDdXJCdERpc2FibGVkKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCI4NzIzQSBCVCBpcyBmcm9tICVzIHRvICVzISFcbiIsCi0JCQkocEhhbERhdGEtPmJ0X2NvZXhpc3QuYlByZUJ0RGlzYWJsZWQgPyAiZGlzYWJsZWQiOiJlbmFibGVkIiksCi0JCQkocEhhbERhdGEtPmJ0X2NvZXhpc3QuYkN1ckJ0RGlzYWJsZWQgPyAiZGlzYWJsZWQiOiJlbmFibGVkIikpKTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYlByZUJ0RGlzYWJsZWQgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5iQ3VyQnREaXNhYmxlZDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0ZG1fQlRDb2V4aXN0ODcyM0FIYW5kbGVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChidGRtX0J0V2lmaUFudE51bShwYWRhcHRlcikgPT0gQW50X3gyKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgMiBBbnQgbWVjaGFuaXNtXG4iKSk7Ci0JCUJURE1fMkFudEJ0Q29leGlzdDg3MjNBKHBhZGFwdGVyKTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIDEgQW50IG1lY2hhbmlzbVxuIikpOwotCQlCVERNXzFBbnRCdENvZXhpc3Q4NzIzQShwYWRhcHRlcik7Ci0JfQotCi0JaWYgKCFCVERNX0lzU2FtZUNvZXhpc3RTdGF0ZShwYWRhcHRlcikpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVENvZXhdLCBDb2V4aXN0IFN0YXRlW2JpdE1hcF0gY2hhbmdlIGZyb20gMHglImk2NGZtdCJ4IHRvIDB4JSJpNjRmbXQieFxuIiwKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUsCi0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUpKTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuUHJldmlvdXNTdGF0ZSA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZTsKLQotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiWyIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfQlQzMCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVCAzLjAsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUMjAsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9IVDQwKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkhUNDAsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9MRUdBQ1kpCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiTGVnYWN5LCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1cpCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiUnNzaV9Mb3csICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX01FRElVTSkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJSc3NpX01pZCwgIikpOwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfSElHSCkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJSc3NpX0hpZ2gsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfV0lGSV9JRExFKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmlfSWRsZSwgIikpOwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9XSUZJX1VQTElOSykKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJXaWZpX1VwbGluaywgIikpOwotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9XSUZJX0RPV05MSU5LKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIldpZmlfRG93bmxpbmssICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfQlRfSURMRSkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVF9pZGxlLCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfSElEKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlBST19ISUQsICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlBST19BMkRQLCAiKSk7Ci0JCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfUEFOKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlBST19QQU4sICIpKTsKLQkJaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmIEJUX0NPRVhfU1RBVEVfUFJPRklMRV9TQ08pCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiUFJPX1NDTywgIikpOwotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiXVxuIikpOwotCX0KLX0KLQotLyogIGV4dGVybiBmdW5jdGlvbiBzdGFydCB3aXRoIEJURE1fICovCi11MzIgQlRETV9CdFR4UnhDb3VudGVySChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXUzMgljb3VudGVyczsKLQotCWNvdW50ZXJzID0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5VHgrCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmhpZ2hQcmlvcml0eVJ4OwotCXJldHVybiBjb3VudGVyczsKLX0KLQotdTMyIEJURE1fQnRUeFJ4Q291bnRlckwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1MzIJY291bnRlcnM7Ci0KLQljb3VudGVycyA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5VHgrCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmxvd1ByaW9yaXR5Ung7Ci0JcmV0dXJuIGNvdW50ZXJzOwotfQotCi12b2lkIEJURE1fU2V0RndDaG5sSW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKQotewotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggSDJDX1BhcmFtZXRlclszXSA9IHswfTsKLQl1OCBjaG5sOwotCi0JLyogIG9wTW9kZSAqLwotCWlmIChSVF9NRURJQV9DT05ORUNUID09IG1zdGF0dXMpCi0JCUgyQ19QYXJhbWV0ZXJbMF0gPSAweDE7CS8qICAwOiBkaXNjb25uZWN0ZWQsIDE6Y29ubmVjdGVkICovCi0KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX0FTT0NfU1RBVEUpKSB7Ci0JCS8qICBjaGFubmVsICovCi0JCWNobmwgPSBwbWxtZWV4dC0+Y3VyX2NoYW5uZWw7Ci0JCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpIHsKLQkJCWlmIChwbWxtZWV4dC0+Y3VyX2NoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCQkJY2hubCAtPSAyOwotCQkJZWxzZSBpZiAocG1sbWVleHQtPmN1cl9jaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSKQotCQkJCWNobmwgKz0gMjsKLQkJfQotCQlIMkNfUGFyYW1ldGVyWzFdID0gY2hubDsKLQl9IGVsc2UgewkvKiAgY2hlY2sgaWYgSFMgbGluayBpcyBleGlzdHMgKi8KLQkJLyogIGNoYW5uZWwgKi8KLQkJaWYgKEJUX09wZXJhdGlvbihwYWRhcHRlcikpCi0JCQlIMkNfUGFyYW1ldGVyWzFdID0gcEJ0TWdudC0+QlRDaGFubmVsOwotCQllbHNlCi0JCQlIMkNfUGFyYW1ldGVyWzFdID0gcG1sbWVleHQtPmN1cl9jaGFubmVsOwotCX0KLQotCWlmIChCVERNX0lzSFQ0MChwYWRhcHRlcikpCi0JCUgyQ19QYXJhbWV0ZXJbMl0gPSAweDMwOwotCWVsc2UKLQkJSDJDX1BhcmFtZXRlclsyXSA9IDB4MjA7Ci0KLQlGaWxsSDJDQ21kKHBhZGFwdGVyLCAweDE5LCAzLCBIMkNfUGFyYW1ldGVyKTsKLX0KLQotdTggQlRETV9Jc1dpZmlDb25uZWN0aW9uRXhpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBiUmV0ID0gZmFsc2U7Ci0KLQlpZiAoQlRIQ0lfSHNDb25uZWN0aW9uRXN0YWJsaXNoZWQocGFkYXB0ZXIpKQotCQliUmV0ID0gdHJ1ZTsKLQotCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfQVNPQ19TVEFURSkgPT0gdHJ1ZSkKLQkJYlJldCA9IHRydWU7Ci0KLQlyZXR1cm4gYlJldDsKLX0KLQotdm9pZCBCVERNX1NldEZ3M2EoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCBieXRlMSwKLQl1OCBieXRlMiwKLQl1OCBieXRlMywKLQl1OCBieXRlNCwKLQl1OCBieXRlNQotCSkKLXsKLQl1OCBIMkNfUGFyYW1ldGVyWzVdID0gezB9OwotCi0JaWYgKHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShwYWRhcHRlcikpIHsKLQkJaWYgKCghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSAmJgotCQkgICAgKGdldF9md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYpICE9IFdJRklfTlVMTF9TVEFURSkpIHsKLQkJCS8qICBmb3Igc29mdGFwIG1vZGUgKi8KLQkJCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCQkJc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0JCQl1OCBCdFN0YXRlID0gcEJ0Q29leC0+YzJoQnRJbmZvOwotCi0JCQlpZiAoKEJ0U3RhdGUgIT0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OKSAmJgotCQkJICAgIChCdFN0YXRlICE9IEJUX0lORk9fU1RBVEVfQ09OTkVDVF9JRExFKSkgewotCQkJCWlmIChieXRlMSAmIEJJVCg0KSkgewotCQkJCQlieXRlMSAmPSB+QklUKDQpOwotCQkJCQlieXRlMSB8PSBCSVQoNSk7Ci0JCQkJfQotCi0JCQkJYnl0ZTUgfD0gQklUKDUpOwotCQkJCWlmIChieXRlNSAmIEJJVCg2KSkKLQkJCQkJYnl0ZTUgJj0gfkJJVCg2KTsKLQkJCX0KLQkJfQotCX0KLQotCUgyQ19QYXJhbWV0ZXJbMF0gPSBieXRlMTsKLQlIMkNfUGFyYW1ldGVyWzFdID0gYnl0ZTI7Ci0JSDJDX1BhcmFtZXRlclsyXSA9IGJ5dGUzOwotCUgyQ19QYXJhbWV0ZXJbM10gPSBieXRlNDsKLQlIMkNfUGFyYW1ldGVyWzRdID0gYnl0ZTU7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIEZXIHdyaXRlIDB4M2EoNWJ5dGVzKSA9IDB4JTAyeCUwOHhcbiIsCi0JCUgyQ19QYXJhbWV0ZXJbMF0sCi0JCUgyQ19QYXJhbWV0ZXJbMV08PDI0fEgyQ19QYXJhbWV0ZXJbMl08PDE2fEgyQ19QYXJhbWV0ZXJbM108PDh8SDJDX1BhcmFtZXRlcls0XSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHgzYSwgNSwgSDJDX1BhcmFtZXRlcik7Ci19Ci0KLXZvaWQgQlRETV9RdWVyeUJ0SW5mb3JtYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBIMkNfUGFyYW1ldGVyWzFdID0gezB9OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXg7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJ0Q29leCA9ICZwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMzsKLQotCWlmICghcnRsODcyM2FfQlRfZW5hYmxlZChwYWRhcHRlcikpIHsKLQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9ESVNBQkxFRDsKLQkJcEJ0Q29leC0+YkMyaEJ0SW5mb1JlcVNlbnQgPSBmYWxzZTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwQnRDb2V4LT5jMmhCdEluZm8gPT0gQlRfSU5GT19TVEFURV9ESVNBQkxFRCkKLQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9OT19DT05ORUNUSU9OOwotCi0JaWYgKHBCdENvZXgtPmJDMmhCdEluZm9SZXFTZW50ID09IHRydWUpCi0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgZGlkbid0IHJlY3YgcHJldmlvdXMgQnRJbmZvIHJlcG9ydCFcbiIpKTsKLQllbHNlCi0JCXBCdENvZXgtPmJDMmhCdEluZm9SZXFTZW50ID0gdHJ1ZTsKLQotCUgyQ19QYXJhbWV0ZXJbMF0gfD0gQklUKDApOwkvKiAgdHJpZ2dlciAqLwotCi0vKlJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgUXVlcnkgQnQgaW5mb3JtYXRpb24sIHdyaXRlIDB4MzggPSAweCV4XG4iLCAqLwotLypIMkNfUGFyYW1ldGVyWzBdKSk7ICovCi0KLQlGaWxsSDJDQ21kKHBhZGFwdGVyLCAweDM4LCAxLCBIMkNfUGFyYW1ldGVyKTsKLX0KLQotdm9pZCBCVERNX1NldFN3UmZSeExwZkNvcm5lcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKEJUX1JGX1JYX0xQRl9DT1JORVJfU0hSSU5LID09IHR5cGUpIHsKLQkJLyogU2hyaW5rIFJGIFJ4IExQRiBjb3JuZXIgKi8KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlNocmluayBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgMHgxZSwgYlJGUmVnT2Zmc2V0TWFzaywgMHhmMGZmNyk7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJTV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9IGVsc2UgaWYgKEJUX1JGX1JYX0xQRl9DT1JORVJfUkVTVU1FID09IHR5cGUpIHsKLQkJLyogUmVzdW1lIFJGIFJ4IExQRiBjb3JuZXIgKi8KLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIlJlc3VtZSBSRiBSeCBMUEYgY29ybmVyISFcbiIpKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgMHgxZSwgYlJGUmVnT2Zmc2V0TWFzaywgcEhhbERhdGEtPmJ0X2NvZXhpc3QuQnRSZlJlZ09yaWdpbjFFKTsKLQl9Ci19Ci0KLXZvaWQKLUJURE1fU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCByYVR5cGUKLQkpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggdG1wVTE7Ci0KLQl0bXBVMSA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg0ZmQpOwotCXRtcFUxIHw9IEJJVCgwKTsKLQlpZiAoQlRfVFhfUkFURV9BREFQVElWRV9MT1dfUEVOQUxUWSA9PSByYVR5cGUpIHsKLQkJdG1wVTEgJj0gfkJJVCgyKTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYlNXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0gZWxzZSBpZiAoQlRfVFhfUkFURV9BREFQVElWRV9OT1JNQUwgPT0gcmFUeXBlKSB7Ci0JCXRtcFUxIHw9IEJJVCgyKTsKLQl9Ci0KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCAweDRmZCwgdG1wVTEpOwotfQotCi12b2lkIEJURE1fU2V0RndEZWNCdFB3cihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiRGVjQnRQd3IpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggSDJDX1BhcmFtZXRlclsxXSA9IHswfTsKLQotCUgyQ19QYXJhbWV0ZXJbMF0gPSAwOwotCi0JaWYgKGJEZWNCdFB3cikgewotCQlIMkNfUGFyYW1ldGVyWzBdIHw9IEJJVCgxKTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0KLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgZGVjcmVhc2UgQnQgUG93ZXIgOiAlcywgd3JpdGUgMHgyMSA9IDB4JXhcbiIsCi0JCShiRGVjQnRQd3IgPyAiWWVzISEiIDogIk5vISEiKSwgSDJDX1BhcmFtZXRlclswXSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHgyMSwgMSwgSDJDX1BhcmFtZXRlcik7Ci19Ci0KLXU4IEJURE1fQnRQcm9maWxlU3VwcG9ydChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGJSZXQgPSBmYWxzZTsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChwQnRNZ250LT5iU3VwcG9ydFByb2ZpbGUgJiYKLQkgICAgIXBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJGb3JjZUZ3QnRJbmZvKQotCQliUmV0ID0gdHJ1ZTsKLQotCXJldHVybiBiUmV0OwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0FkanVzdEZvckJ0T3BlcmF0aW9uODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQkvKiBCVERNXzJBbnRBZGp1c3RGb3JCdE9wZXJhdGlvbjg3MjMocGFkYXB0ZXIpOyAqLwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0Z3QzJoQnRSc3NpODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnRtcEJ1ZikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBwZXJjZW50LCB1MXRtcDsKLQotCXUxdG1wID0gdG1wQnVmWzBdOwotCXBlcmNlbnQgPSB1MXRtcCoyKzEwOwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRSc3NpID0gcGVyY2VudDsKLS8qUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVEMySF0sIEJUIFJTU0kgPSVkXG4iLCBwZXJjZW50KSk7ICovCi19Ci0KLXZvaWQKLXJ0bDg3MjNhX2Z3X2MyaF9CVF9pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICp0bXBCdWYsIHU4IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXg7Ci0JdTggaTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0KLQlwQnRDb2V4LT5iQzJoQnRJbmZvUmVxU2VudCA9IGZhbHNlOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVEMySF0sIEJUIGluZm9bJWRdPVsiLCBsZW5ndGgpKTsKLQotCXBCdENvZXgtPmJ0UmV0cnlDbnQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQlzd2l0Y2ggKGkpIHsKLQkJY2FzZSAwOgotCQkJcEJ0Q29leC0+YzJoQnRJbmZvT3JpZ2luYWwgPSB0bXBCdWZbaV07Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcEJ0Q29leC0+YnRSZXRyeUNudCA9IHRtcEJ1ZltpXTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlCVERNX0Z3QzJoQnRSc3NpODcyM0EocGFkYXB0ZXIsICZ0bXBCdWZbaV0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCXBCdENvZXgtPmJ0SW5mb0V4dCA9IHRtcEJ1ZltpXSZCSVQoMCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChpID09IGxlbmd0aC0xKQotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIjB4JTAyeF1cbiIsIHRtcEJ1ZltpXSkpOwotCQllbHNlCi0JCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiMHglMDJ4LCAiLCB0bXBCdWZbaV0pKTsKLQl9Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVEMySF0sIEJUIFJTU0kgPSVkXG4iLCBwQnRDb2V4LT5idFJzc2kpKTsKLQlpZiAocEJ0Q29leC0+YnRJbmZvRXh0KQotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQzJIXSwgcEJ0Q29leC0+YnRJbmZvRXh0ID0leFxuIiwgcEJ0Q29leC0+YnRJbmZvRXh0KSk7Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJQlRETV8xQW50RndDMmhCdEluZm84NzIzQShwYWRhcHRlcik7Ci0JZWxzZQotCQlCVERNXzJBbnRGd0MyaEJ0SW5mbzg3MjNBKHBhZGFwdGVyKTsKLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIiVzOiBBY3Rpb24gTWFudWFsIGNvbnRyb2whIVxuIiwgX19mdW5jX18pKTsKLQkJcmV0dXJuOwotCX0KLQotCWJ0ZG1fQlRDb2V4aXN0ODcyM0FIYW5kbGVyKHBhZGFwdGVyKTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV9EaXNwbGF5ODcyM0FCdENvZXhJbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgKnBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JdTggdTFUbXAsIHUxVG1wMSwgdTFUbXAyLCBpLCBidEluZm9FeHQsIHBzVGRtYUNhc2UgPSAwOwotCXUzMiB1NFRtcFs0XTsKLQl1OCBhbnROdW0gPSBBbnRfeDI7Ci0KLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gPT09PT09PT09PT09W0JUIENvZXhpc3QgaW5mb109PT09PT09PT09PT0iKTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JaWYgKCFydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkgewotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gQlQgbm90IGV4aXN0cyAhISEiKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJcmV0dXJuOwotCX0KLQotCWFudE51bSA9IGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKTsKLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZC8lZCAiLCAiQW50IG1lY2hhbmlzbSBQRy9Ob3cgcnVuIDoiLCBcCi0JCSgocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bSA9PSBBbnRfeDIpID8gMiA6IDEpLCAoKGFudE51bSA9PSBBbnRfeDIpID8gMiA6IDEpKTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkgewotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiW0FjdGlvbiBNYW51YWwgY29udHJvbF0hISIpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCX0gZWxzZSB7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICVzIC8gJWQiLCAiQlQgc3RhY2svIGhjaSBleHQgdmVyIiwgXAotCQkJKChwQnRNZ250LT5iU3VwcG9ydFByb2ZpbGUpID8gIlllcyIgOiAiTm8iKSwgcEJ0TWdudC0+RXh0Q29uZmlnLkhDSUV4dGVuc2lvblZlcik7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JfQotCi0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcbiAlLTM1cyA9IC8gJWQiLCAiRG90MTEgY2hhbm5lbCAvIEJUIGNoYW5uZWwiLCBcCi0JCXBCdE1nbnQtPkJUQ2hhbm5lbCk7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxuICUtMzVzID0gJWQgLyAlZCAvICVkIiwgIldpZmkvQlQvSFMgcnNzaSIsIFwKLQkJQlRETV9HZXRSeFNTKHBhZGFwdGVyKSwKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuYnRSc3NpLAotCQlwSGFsRGF0YS0+ZG1wcml2LkVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIpOwotCQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCWlmICghcEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKSB7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXG4gJS0zNXMgPSAlcyAvICVzICIsICJXSWZpIHN0YXR1cyIsCi0JCQkoKEJURE1fTGVnYWN5KHBhZGFwdGVyKSkgPyAiTGVnYWN5IiA6ICgoKEJURE1fSXNIVDQwKHBhZGFwdGVyKSkgPyAiSFQ0MCIgOiAiSFQyMCIpKSksCi0JCQkoKCFCVERNX0lzV2lmaUJ1c3kocGFkYXB0ZXIpKSA/ICJpZGxlIiA6ICgoQlRETV9Jc1dpZmlVcGxpbmsocGFkYXB0ZXIpKSA/ICJ1cGxpbmsiIDogImRvd25saW5rIikpKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCQlpZiAocEJ0TWdudC0+YlN1cHBvcnRQcm9maWxlKSB7Ci0JCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkIC8gJWQgLyAlZCIsICJTQ08vSElEL1BBTi9BMkRQIiwKLQkJCQkoKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1NDTykpID8gMSA6IDApLAotCQkJCSgoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfSElEKSkgPyAxIDogMCksCi0JCQkJKChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pKSA/IDEgOiAwKSwKLQkJCQkoKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0EyRFApKSA/IDEgOiAwKSk7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBwQnRNZ250LT5FeHRDb25maWcuTnVtYmVyT2ZIYW5kbGU7IGkrKykgewotCQkJCWlmIChwQnRNZ250LT5FeHRDb25maWcuSENJRXh0ZW5zaW9uVmVyID49IDEpIHsKLQkJCQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMvICVzLyAlcyIsICJCdCBsaW5rIHR5cGUvc3BlYy9yb2xlIiwKLQkJCQkJCUJ0UHJvZmlsZVN0cmluZ1twQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRQcm9maWxlXSwKLQkJCQkJCUJ0U3BlY1N0cmluZ1twQnRNZ250LT5FeHRDb25maWcubGlua0luZm9baV0uQlRDb3JlU3BlY10sCi0JCQkJCQlCdExpbmtSb2xlU3RyaW5nW3BCdE1nbnQtPkV4dENvbmZpZy5saW5rSW5mb1tpXS5saW5rUm9sZV0pOwotCQkJCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JCQkJCWJ0SW5mb0V4dCA9IHBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzLmJ0SW5mb0V4dDsKLQkJCQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJXMiLCAiQTJEUCByYXRlIiwgXAotCQkJCQkJIChidEluZm9FeHQgJiBCSVQoMCkpID8KLQkJCQkJCSAiQmFzaWMgcmF0ZSIgOiAiRURSIHJhdGUiKTsKLQkJCQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlcy8gJXMiLCAiQnQgbGluayB0eXBlL3NwZWMiLCBcCi0JCQkJCQlCdFByb2ZpbGVTdHJpbmdbcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUUHJvZmlsZV0sCi0JCQkJCQlCdFNwZWNTdHJpbmdbcEJ0TWdudC0+RXh0Q29uZmlnLmxpbmtJbmZvW2ldLkJUQ29yZVNwZWNdKTsKLQkJCQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAgU3cgbWVjaGFuaXNtICovCi0JaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpIHsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtTdyBCVCBDb2V4IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgIiwgIkFHQyBUYWJsZSIsIFwKLQkJCXBCdENvZXgtPmJ0ZG0yQW50LmJDdXJBZ2NUYWJsZUVuKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgIiwgIkFEQyBCYWNrb2ZmIiwgXAotCQkJcEJ0Q29leC0+YnRkbTJBbnQuYkN1ckFkY0JhY2tPZmYpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAiLCAiTG93IHBlbmFsdHkgUkEiLCBcCi0JCQlwQnRDb2V4LT5idGRtMkFudC5iQ3VyTG93UGVuYWx0eVJhKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgIiwgIlJGIFJ4IExQRiBTaHJpbmsiLCBcCi0JCQlwQnRDb2V4LT5idGRtMkFudC5iQ3VyUmZSeExwZlNocmluayk7Ci0JCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JfQotCXU0VG1wWzBdID0gUEhZX1F1ZXJ5UkZSZWcocGFkYXB0ZXIsIFBhdGhBLCAweDFlLCAweGZmMCk7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8gMHgleCIsICJSRi1BLCAweDFlWzExOjRdL29yaWdpbmFsIHZhbCIsIFwKLQkJdTRUbXBbMF0sIHBIYWxEYXRhLT5idF9jb2V4aXN0LkJ0UmZSZWdPcmlnaW4xRSk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCS8qICBGdyBtZWNoYW5pc20gKi8KLQlpZiAoIXBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkgewotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMiLCAiPT09PT09PT09PT09W0Z3IEJUIENvZXggbWVjaGFuaXNtXT09PT09PT09PT09PSIpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCX0KLQlpZiAoIXBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkgewotCQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJCXBzVGRtYUNhc2UgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMUFudC5jdXJQc1RkbWE7Ci0JCWVsc2UKLQkJCXBzVGRtYUNhc2UgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5idGRtMkFudC5jdXJQc1RkbWE7Ci0JCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9ICUqcGggY2FzZS0lZCIsCi0JCQkgIlBTIFRETUEoMHgzYSkiLCA1LCBwSGFsRGF0YS0+YnRfY29leGlzdC5mdzNhVmFsLCBwc1RkbWFDYXNlKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAiLCAiRGVjcmVhc2UgQnQgUG93ZXIiLCBcCi0JCQlwQnRDb2V4LT5idGRtMkFudC5iQ3VyRGVjQnRQd3IpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCX0KLQl1MVRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg3NzgpOwotCXUxVG1wMSA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg3ODMpOwotCXUxVG1wMiA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg3OTYpOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgiLCAiMHg3NzgvIDB4NzgzLyAweDc5NiIsIFwKLQkJdTFUbXAsIHUxVG1wMSwgdTFUbXAyKTsKLQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCi0JaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpIHsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCAvIDB4JXgiLCAiU3cgRGFjU3dpbmcgQ3RybC9WYWwiLCBcCi0JCQlwQnRDb2V4LT5idGRtMkFudC5iQ3VyRGFjU3dpbmdPbiwgcEJ0Q29leC0+YnRkbTJBbnQuY3VyRGFjU3dpbmdMdmwpOwotCQlEQ01EX1ByaW50ZihidENvZXhEYmdCdWYpOwotCX0KLQl1NFRtcFswXSA9ICBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCAweDg4MCk7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDg4MCIsIFwKLQkJdTRUbXBbMF0pOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQkvKiAgSHcgbWVjaGFuaXNtICovCi0JaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpIHsKLQkJc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzIiwgIj09PT09PT09PT09PVtIdyBCVCBDb2V4IG1lY2hhbmlzbV09PT09PT09PT09PT0iKTsKLQkJRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQl9Ci0KLQl1MVRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg0MCk7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQwIiwgXAotCQl1MVRtcCk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCXU0VG1wWzBdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHg1NTApOwotCXUxVG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCAweDUyMik7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleC8weCV4IiwgIjB4NTUwKGJjbiBjb250cmwpLzB4NTIyIiwgXAotCQl1NFRtcFswXSwgdTFUbXApOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQl1NFRtcFswXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NDg0KTsKLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAweCV4IiwgIjB4NDg0KHJhdGUgYWRhcHRpdmUpIiwgXAotCQl1NFRtcFswXSk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCXU0VG1wWzBdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHg1MCk7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweGM1MChkaWcpIiwgXAotCQl1NFRtcFswXSk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCXU0VG1wWzBdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHhkYTApOwotCXU0VG1wWzFdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHhkYTQpOwotCXU0VG1wWzJdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHhkYTgpOwotCXU0VG1wWzNdID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgMHhkYWMpOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLCAiMHhkYTAvMHhkYTQvMHhkYTgvMHhkYWMoRkEgY250KSIsIFwKLQkJdTRUbXBbMF0sIHU0VG1wWzFdLCB1NFRtcFsyXSwgdTRUbXBbM10pOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQl1NFRtcFswXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NmMwKTsKLQl1NFRtcFsxXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NmM0KTsKLQl1NFRtcFsyXSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NmM4KTsKLQl1MVRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgMHg2Y2MpOwotCXNucHJpbnRmKGJ0Q29leERiZ0J1ZiwgQlRfVE1QX0JVRl9TSVpFLCAiXHJcbiAlLTM1cyA9IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgiLCAiMHg2YzAvMHg2YzQvMHg2YzgvMHg2Y2MoY29leFRhYmxlKSIsIFwKLQkJdTRUbXBbMF0sIHU0VG1wWzFdLCB1NFRtcFsyXSwgdTFUbXApOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0KLQkvKiB1NFRtcCA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIDB4NzcwKTsgKi8KLQlzbnByaW50ZihidENvZXhEYmdCdWYsIEJUX1RNUF9CVUZfU0laRSwgIlxyXG4gJS0zNXMgPSAlZCAvICVkIiwgIjB4NzcwKEhpIHByaSBSeFszMToxNl0vVHhbMTU6MF0pIiwgXAotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5oYWxDb2V4ODcyMy5oaWdoUHJpb3JpdHlSeCwKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMuaGlnaFByaW9yaXR5VHgpOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0JLyogdTRUbXAgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCAweDc3NCk7ICovCi0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gJWQgLyAlZCIsICIweDc3NChMbyBwcmkgUnhbMzE6MTZdL1R4WzE1OjBdKSIsIFwKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlSeCwKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjMubG93UHJpb3JpdHlUeCk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLQotCS8qICBUeCBtZ250IHF1ZXVlIGhhbmcgb3Igbm90LCAweDQxYiBzaG91bGQgPSAweGYsIGV4OiAweGQgPT0+aGFuZyAqLwotCXUxVG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCAweDQxYik7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICIweDQxYiAoaGFuZyBjaGsgPT0gMHhmKSIsIFwKLQkJdTFUbXApOwotCURDTURfUHJpbnRmKGJ0Q29leERiZ0J1Zik7Ci0Jc25wcmludGYoYnRDb2V4RGJnQnVmLCBCVF9UTVBfQlVGX1NJWkUsICJcclxuICUtMzVzID0gMHgleCIsICJsYXN0SE1FQm94TnVtIiwgXAotCQlwSGFsRGF0YS0+TGFzdEhNRUJveE51bSk7Ci0JRENNRF9QcmludGYoYnRDb2V4RGJnQnVmKTsKLX0KLQotc3RhdGljIHZvaWQKLUJURE1fODcyM0FTaWduYWxDb21wZW5zYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgdTggKnJzc2lfd2lmaSwgdTggKnJzc2lfYnQpCi17Ci0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDEpCi0JCUJURE1fMUFudFNpZ25hbENvbXBlbnNhdGlvbihwYWRhcHRlciwgcnNzaV93aWZpLCByc3NpX2J0KTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV84NzIzQUluaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MikKLQkJQlRETV8yQW50UGFyYUluaXQocGFkYXB0ZXIpOwotCWVsc2UKLQkJQlRETV8xQW50UGFyYUluaXQocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0hXQ29leEFsbE9mZjg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MikKLQkJQlRETV8yQW50SHdDb2V4QWxsT2ZmODcyM0EocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0ZXQ29leEFsbE9mZjg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MikKLQkJQlRETV8yQW50RndDb2V4QWxsT2ZmODcyM0EocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX1NXQ29leEFsbE9mZjg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MikKLQkJQlRETV8yQW50U3dDb2V4QWxsT2ZmODcyM0EocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZAotQlRETV9TZXQ4NzIzQUJ0Q29leEN1cnJBbnROdW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYW50TnVtKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9jb2V4aXN0Xzg3MjNhICpwQnRDb2V4ID0gJnBIYWxEYXRhLT5idF9jb2V4aXN0LmhhbENvZXg4NzIzOwotCi0JaWYgKGFudE51bSA9PSAxKQotCQlwQnRDb2V4LT5Ub3RhbEFudE51bSA9IEFudF94MTsKLQllbHNlIGlmIChhbnROdW0gPT0gMikKLQkJcEJ0Q29leC0+VG90YWxBbnROdW0gPSBBbnRfeDI7Ci19Ci0KLXZvaWQgcnRsODcyM2FfQlRfbHBzX2xlYXZlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJQlRETV8xQW50THBzTGVhdmUocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0ZvckhhbHQ4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCi0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDEpCi0JCUJURE1fMUFudEZvckhhbHQocGFkYXB0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX1dpZmlTY2FuTm90aWZ5ODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2NhblR5cGUpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJQlRETV8xQW50V2lmaVNjYW5Ob3RpZnkocGFkYXB0ZXIsIHNjYW5UeXBlKTsKLX0KLQotc3RhdGljIHZvaWQKLUJURE1fV2lmaUFzc29jaWF0ZU5vdGlmeTg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGFjdGlvbikKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuYk1hbnVhbENvbnRyb2wpCi0JCXJldHVybjsKLQotCWlmIChidGRtX0J0V2lmaUFudE51bShwYWRhcHRlcikgPT0gQW50X3gxKQotCQlCVERNXzFBbnRXaWZpQXNzb2NpYXRlTm90aWZ5KHBhZGFwdGVyLCBhY3Rpb24pOwotfQotCi1zdGF0aWMgdm9pZAotQlRETV9NZWRpYVN0YXR1c05vdGlmeTg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgZW51bSBydF9tZWRpYV9zdGF0dXMgbXN0YXR1cykKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRDb2V4XSwgTWVkaWFTdGF0dXNOb3RpZnksICVzXG4iLAotCQltc3RhdHVzPyJjb25uZWN0IjoiZGlzY29ubmVjdCIpKTsKLQotCUJURE1fU2V0RndDaG5sSW5mbyhwYWRhcHRlciwgbXN0YXR1cyk7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKQotCQlyZXR1cm47Ci0KLQlpZiAoYnRkbV9CdFdpZmlBbnROdW0ocGFkYXB0ZXIpID09IEFudF94MSkKLQkJQlRETV8xQW50TWVkaWFTdGF0dXNOb3RpZnkocGFkYXB0ZXIsIG1zdGF0dXMpOwotfQotCi1zdGF0aWMgdm9pZCBCVERNX0ZvckRoY3A4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCi0JaWYgKGJ0ZG1fQnRXaWZpQW50TnVtKHBhZGFwdGVyKSA9PSBBbnRfeDEpCi0JCUJURE1fMUFudEZvckRoY3AocGFkYXB0ZXIpOwotfQotCi1ib29sIHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWlmIChidGRtX0J0V2lmaUFudE51bShwYWRhcHRlcikgPT0gQW50X3gxKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgQlRETV9CVENvZXhpc3Q4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfY29leGlzdF84NzIzYSAqcEJ0Q29leDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdENvZXggPSAmcEhhbERhdGEtPmJ0X2NvZXhpc3QuaGFsQ29leDg3MjM7Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIGJlYWNvbiBSU1NJID0gMHgleCglZClcbiIsCi0JCXBIYWxEYXRhLT5kbXByaXYuRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiwKLQkJcEhhbERhdGEtPmRtcHJpdi5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCKSk7Ci0KLQlidGRtX0J0SHdDb3VudGVyc01vbml0b3IocGFkYXB0ZXIpOwotCWJ0ZG1fQnRFbmFibGVEaXNhYmxlQ2hlY2s4NzIzQShwYWRhcHRlcik7Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLmJNYW51YWxDb250cm9sKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCIlczogQWN0aW9uIE1hbnVhbCBjb250cm9sISFcbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocEJ0Q29leC0+YkMyaEJ0SW5mb1JlcVNlbnQpIHsKLQkJaWYgKCFydGw4NzIzYV9CVF9lbmFibGVkKHBhZGFwdGVyKSkgewotCQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9ESVNBQkxFRDsKLQkJfSBlbHNlIHsKLQkJCWlmIChwQnRDb2V4LT5jMmhCdEluZm8gPT0gQlRfSU5GT19TVEFURV9ESVNBQkxFRCkKLQkJCQlwQnRDb2V4LT5jMmhCdEluZm8gPSBCVF9JTkZPX1NUQVRFX05PX0NPTk5FQ1RJT047Ci0JCX0KLQotCQlidGRtX0JUQ29leGlzdDg3MjNBSGFuZGxlcihwYWRhcHRlcik7Ci0JfSBlbHNlIGlmICghcnRsODcyM2FfQlRfZW5hYmxlZChwYWRhcHRlcikpIHsKLQkJcEJ0Q29leC0+YzJoQnRJbmZvID0gQlRfSU5GT19TVEFURV9ESVNBQkxFRDsKLQkJYnRkbV9CVENvZXhpc3Q4NzIzQUhhbmRsZXIocGFkYXB0ZXIpOwotCX0KLQotCUJURE1fUXVlcnlCdEluZm9ybWF0aW9uKHBhZGFwdGVyKTsKLX0KLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Yzg3MjMuYyA9PT09PSAqLwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjQ3NyMUFudC5jID09PT09ICovCi0KLS8qICBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGJ0ZG1fICovCi0vKiAgZXh0ZXJuIGZ1bmN0aW9uIHN0YXJ0IHdpdGggQlRETV8gKi8KLQotc3RhdGljIHZvaWQgQlRETV9TZXRBbnRlbm5hKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHdobykKLXsKLX0KLQotdm9pZAotQlRETV9TaW5nbGVBbnQoCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQl1OCBiU2luZ2xlQW50T24sCi0JdTggYkludGVycnVwdE9uLAotCXU4IGJNdWx0aU5BVk9uCi0JKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IEgyQ19QYXJhbWV0ZXJbM10gPSB7MH07Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bSAhPSBBbnRfeDEpCi0JCXJldHVybjsKLQotCUgyQ19QYXJhbWV0ZXJbMl0gPSAwOwotCUgyQ19QYXJhbWV0ZXJbMV0gPSAwOwotCUgyQ19QYXJhbWV0ZXJbMF0gPSAwOwotCi0JaWYgKGJJbnRlcnJ1cHRPbikgewotCQlIMkNfUGFyYW1ldGVyWzJdIHw9IDB4MDI7CS8qIEJJVDEgKi8KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iSW50ZXJydXB0T24gPSBiSW50ZXJydXB0T247Ci0KLQlpZiAoYlNpbmdsZUFudE9uKSB7Ci0JCUgyQ19QYXJhbWV0ZXJbMl0gfD0gMHgxMDsJLyogQklUNCAqLwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iRldDb2V4aXN0QWxsT2ZmID0gZmFsc2U7Ci0JfQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJTaW5nbGVBbnRPbiA9IGJTaW5nbGVBbnRPbjsKLQotCWlmIChiTXVsdGlOQVZPbikgewotCQlIMkNfUGFyYW1ldGVyWzJdIHw9IDB4MjA7CS8qIEJJVDUgKi8KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iTXVsdGlOQVZPbiA9IGJNdWx0aU5BVk9uOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBTaW5nbGVBbnRlbm5hID1bJXM6JXM6JXNdLCB3cml0ZSAweGUgPSAweCV4XG4iLAotCQliU2luZ2xlQW50T24/Ik9OIjoiT0ZGIiwgYkludGVycnVwdE9uPyJPTiI6Ik9GRiIsIGJNdWx0aU5BVk9uPyJPTiI6Ik9GRiIsCi0JCUgyQ19QYXJhbWV0ZXJbMF08PDE2fEgyQ19QYXJhbWV0ZXJbMV08PDh8SDJDX1BhcmFtZXRlclsyXSkpOwotfQotCi12b2lkIEJURE1fQ2hlY2tCVElkbGVDaGFuZ2UxQW50KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0JdTggCXN0YXRlQ2hhbmdlID0gZmFsc2U7Ci0JdTMyCQkJQlRfUG9sbGluZywgUmF0aW9fQWN0LCBSYXRpb19TVEE7Ci0JdTMyCQkJCUJUX0FjdGl2ZSwgQlRfU3RhdGU7Ci0JdTMyCQkJCXJlZ0JUQWN0aXZlID0gMCwgcmVnQlRTdGF0ZSA9IDAsIHJlZ0JUUG9sbGluZyA9IDA7Ci0KLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0JaWYgKHBCdE1nbnQtPkV4dENvbmZpZy5iTWFudWFsQ29udHJvbCkKLQkJcmV0dXJuOwotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9Db2V4aXN0VHlwZSAhPSBCVF9DU1JfQkM4KQotCQlyZXR1cm47Ci0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9OdW0gIT0gQW50X3gxKQotCQlyZXR1cm47Ci0KLQkvKiAgVGhlIGZvbGxvd2luZyB3ZSBvbmx5IGNvbnNpZGVyIENTUiBCQzggYW5kIGZ3IHZlcnNpb24gc2hvdWxkIGJlID49IDYyICovCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBGaXJtd2FyZVZlcnNpb24gPSAweCV4KCVkKVxuIiwKLQlwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uLCBwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uKSk7Ci0JcmVnQlRBY3RpdmUgPSBSRUdfQlRfQUNUSVZFOwotCXJlZ0JUU3RhdGUgPSBSRUdfQlRfU1RBVEU7Ci0JaWYgKHBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24gPj0gRldfVkVSX0JUX1JFRzEpCi0JCXJlZ0JUUG9sbGluZyA9IFJFR19CVF9QT0xMSU5HMTsKLQllbHNlCi0JCXJlZ0JUUG9sbGluZyA9IFJFR19CVF9QT0xMSU5HOwotCi0JQlRfQWN0aXZlID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgcmVnQlRBY3RpdmUpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQlRfQWN0aXZlKDB4JXgpID0leFxuIiwgcmVnQlRBY3RpdmUsIEJUX0FjdGl2ZSkpOwotCUJUX0FjdGl2ZSA9IEJUX0FjdGl2ZSAmIDB4MDBmZmZmZmY7Ci0KLQlCVF9TdGF0ZSA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIHJlZ0JUU3RhdGUpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQlRfU3RhdGUoMHgleCkgPSV4XG4iLCByZWdCVFN0YXRlLCBCVF9TdGF0ZSkpOwotCUJUX1N0YXRlID0gQlRfU3RhdGUgJiAweDAwZmZmZmZmOwotCi0JQlRfUG9sbGluZyA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIHJlZ0JUUG9sbGluZyk7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBCVF9Qb2xsaW5nKDB4JXgpID0leFxuIiwgcmVnQlRQb2xsaW5nLCBCVF9Qb2xsaW5nKSk7Ci0KLQlpZiAoQlRfQWN0aXZlID09IDB4ZmZmZmZmZmYgJiYgQlRfU3RhdGUgPT0gMHhmZmZmZmZmZiAmJiBCVF9Qb2xsaW5nID09IDB4ZmZmZmZmZmYpCi0JCXJldHVybjsKLQlpZiAoQlRfUG9sbGluZyA9PSAwKQotCQlyZXR1cm47Ci0KLQlSYXRpb19BY3QgPSBCVF9BY3RpdmUqMTAwMC9CVF9Qb2xsaW5nOwotCVJhdGlvX1NUQSA9IEJUX1N0YXRlKjEwMDAvQlRfUG9sbGluZzsKLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LlJhdGlvX1R4ID0gUmF0aW9fQWN0OwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LlJhdGlvX1BSSSA9IFJhdGlvX1NUQTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUmF0aW9fQWN0ID0lZFxuIiwgUmF0aW9fQWN0KSk7Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSYXRpb19TVEEgPSVkXG4iLCBSYXRpb19TVEEpKTsKLQotCWlmIChSYXRpb19TVEEgPCA2MCAmJiBSYXRpb19BY3QgPCA1MDApIHsJLyogIEJUIFBBTiBpZGxlICovCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX0JUX1BBTl9JRExFOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfQlRfUEFOX0RPV05MSU5LOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfQlRfUEFOX1VQTElOSzsKLQl9IGVsc2UgewotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfQlRfUEFOX0lETEU7Ci0KLQkJaWYgKFJhdGlvX1NUQSkgewotCQkJLyogIENoZWNrIGlmIEJUIFBBTiAodW5kZXIgQlQgMi4xKSBpcyB1cGxpbmsgb3IgZG93bmxpbmsgKi8KLQkJCWlmICgoUmF0aW9fQWN0L1JhdGlvX1NUQSkgPCAyKSB7Ci0JCQkJLyogIEJUIFBBTiBVcGxpbmsgKi8KLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5CVDIxVHJhZmZpY1N0YXRpc3RpY3MuYlR4QnVzeVRyYWZmaWMgPSB0cnVlOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX0JUX1BBTl9VUExJTks7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQlQyMVRyYWZmaWNTdGF0aXN0aWNzLmJSeEJ1c3lUcmFmZmljID0gZmFsc2U7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX1BBTl9ET1dOTElOSzsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogIEJUIFBBTiBkb3dubGluayAqLwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUMjFUcmFmZmljU3RhdGlzdGljcy5iVHhCdXN5VHJhZmZpYyA9IGZhbHNlOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9CVF9QQU5fVVBMSU5LOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUMjFUcmFmZmljU3RhdGlzdGljcy5iUnhCdXN5VHJhZmZpYyA9IHRydWU7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfQlRfUEFOX0RPV05MSU5LOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogIEJUIFBBTiBkb3dubGluayAqLwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQlQyMVRyYWZmaWNTdGF0aXN0aWNzLmJUeEJ1c3lUcmFmZmljID0gZmFsc2U7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfQlRfUEFOX1VQTElOSzsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUMjFUcmFmZmljU3RhdGlzdGljcy5iUnhCdXN5VHJhZmZpYyA9IHRydWU7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVF9QQU5fRE9XTkxJTks7Ci0JCX0KLQl9Ci0KLQkvKiAgQ2hlY2sgQlQgaXMgaWRsZSBvciBub3QgKi8KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID09IDAgJiYKLQkgICAgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID09IDApIHsKLQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfQlRfSURMRTsKLQl9IGVsc2UgewotCQlpZiAoUmF0aW9fU1RBIDwgNjApIHsKLQkJCXBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5ID0gZmFsc2U7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVF9JRExFOwotCQl9IGVsc2UgewotCQkJcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3kgPSB0cnVlOwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX0lETEU7Ci0JCX0KLQl9Ci0KLQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mSGFuZGxlID09IDAgJiYKLQkgICAgcEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID09IDApIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX1JTU0lfTE9XOwotCQlwQnRNZ250LT5FeHRDb25maWcuTUlOX0JUX1JTU0kgPSAwOwotCQlCVERNX1NldEFudGVubmEocGFkYXB0ZXIsIEJURE1fQU5UX0JUX0lETEUpOwotCX0gZWxzZSB7Ci0JCWlmIChwQnRNZ250LT5FeHRDb25maWcuTUlOX0JUX1JTU0kgPD0gLTUpIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX0JUX1JTU0lfTE9XOwotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBjb3JlIHN0YWNrIG5vdGlmeSBidCByc3NpIExvd1xuIikpOwotCQl9IGVsc2UgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUX1JTU0lfTE9XOwotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBjb3JlIHN0YWNrIG5vdGlmeSBidCByc3NpIE5vcm1hbFxuIikpOwotCQl9Ci0JfQotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmJCVEJ1c3lUcmFmZmljICE9IHBCdE1nbnQtPkV4dENvbmZpZy5iQlRCdXN5KSB7Ci0JCS8qICBCVCBpZGxlIG9yIEJUIG5vbi1pZGxlICovCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJCVEJ1c3lUcmFmZmljID0gcEJ0TWdudC0+RXh0Q29uZmlnLmJCVEJ1c3k7Ci0JCXN0YXRlQ2hhbmdlID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoc3RhdGVDaGFuZ2UpIHsKLQkJaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSkKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQlQgaXMgaWRsZSBvciBkaXNhYmxlXG4iKSk7Ci0JCWVsc2UKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQlQgaXMgbm9uLWlkbGVcbiIpKTsKLQl9Ci0JaWYgKCFwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIEJUIGlzIGlkbGUgb3IgZGlzYWJsZVxuIikpOwotCQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1VOREVSX0xJTktJTkd8V0lGSV9TSVRFX01PTklUT1IpID09IHRydWUpCi0JCQlCVERNX1NldEFudGVubmEocGFkYXB0ZXIsIEJURE1fQU5UX1dJRkkpOwotCX0KLX0KLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Y0NzcjFBbnQuYyA9PT09PSAqLwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjQ3NyMkFudC5jID09PT09ICovCi0KLS8qICBsb2NhbCBmdW5jdGlvbiBzdGFydCB3aXRoIGJ0ZG1fICovCi0KLS8qICBOb3RlOiAqLwotLyogIEluIHRoZSBmb2xsb3dpbmcsIEZXIHNob3VsZCBiZSBkb25lIGJlZm9yZSBTVyBtZWNoYW5pc20uICovCi0vKiAgQlRETV9CYWxhbmNlKCksIEJURE1fRGltaW5pc2hXaUZpKCksIEJUX05BVigpIHNob3VsZCBiZSBkb25lICovCi0vKiAgYmVmb3JlIEJURE1fQUdDVGFibGUoKSwgQlRETV9CQkJhY2tPZmZMZXZlbCgpLCBidGRtX0RhY1N3aW5nKCkuICovCi0KLS8qICBleHRlcm4gZnVuY3Rpb24gc3RhcnQgd2l0aCBCVERNXyAqLwotCi12b2lkCi1CVERNX0RpbWluaXNoV2lGaSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXU4IGJEQUNPbiwKLQl1OCBiSW50ZXJydXB0T24sCi0JdTggREFDU3dpbmdMZXZlbCwKLQl1OCBiTkFWT24KLQkpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggSDJDX1BhcmFtZXRlclszXSA9IHswfTsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9BbnRfTnVtICE9IEFudF94MikKLQkJcmV0dXJuOwotCi0JaWYgKChwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJiBCVF9DT0VYX1NUQVRFX0JUX1JTU0lfTE9XKSAmJgotCSAgICAoREFDU3dpbmdMZXZlbCA9PSAweDIwKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUXURpbWluaXNoV2lGaSAweDIwIG9yaWdpbmFsLCBidXQgc2V0IDB4MTggZm9yIExvdyBSU1NJIVxuIikpOwotCQlEQUNTd2luZ0xldmVsID0gMHgxODsKLQl9Ci0KLQlIMkNfUGFyYW1ldGVyWzJdID0gMDsKLQlIMkNfUGFyYW1ldGVyWzFdID0gREFDU3dpbmdMZXZlbDsKLQlIMkNfUGFyYW1ldGVyWzBdID0gMDsKLQlpZiAoYkRBQ09uKSB7Ci0JCUgyQ19QYXJhbWV0ZXJbMl0gfD0gMHgwMTsJLyogQklUMCAqLwotCQlpZiAoYkludGVycnVwdE9uKQotCQkJSDJDX1BhcmFtZXRlclsyXSB8PSAweDAyOwkvKiBCSVQxICovCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9Ci0JaWYgKGJOQVZPbikgewotCQlIMkNfUGFyYW1ldGVyWzJdIHw9IDB4MDg7CS8qIEJJVDMgKi8KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkZXQ29leGlzdEFsbE9mZiA9IGZhbHNlOwotCX0KLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgYkRBQ09uID0gJXMsIGJJbnRlcnJ1cHRPbiA9ICVzLCB3cml0ZSAweGUgPSAweCV4XG4iLAotCQliREFDT24/Ik9OIjoiT0ZGIiwgYkludGVycnVwdE9uPyJPTiI6Ik9GRiIsCi0JCUgyQ19QYXJhbWV0ZXJbMF08PDE2fEgyQ19QYXJhbWV0ZXJbMV08PDh8SDJDX1BhcmFtZXRlclsyXSkpOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgYk5BVk9uID0gJXNcbiIsCi0JCWJOQVZPbj8iT04iOiJPRkYiKSk7Ci19Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGNDc3IyQW50LmMgPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Q29leGlzdC5jID09PT09ICovCi0KLS8qICBsb2NhbCBmdW5jdGlvbiAqLwotc3RhdGljIHZvaWQgYnRkbV9SZXNldEZXQ29leFN0YXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgPSAwOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBidGRtX0luaXRCdENvZXhpc3RETShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JLyogIDIwMTAwNDE1IEpvc2VwaDogUmVzdG9yZSBSRiByZWdpc3RlciAweDFFIGFuZCAweDFGIHZhbHVlIGZvciBmdXJ0aGVyIHVzYWdlLiAqLwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJ0UmZSZWdPcmlnaW4xRSA9IFBIWV9RdWVyeVJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUkNLMSwgYlJGUmVnT2Zmc2V0TWFzayk7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuQnRSZlJlZ09yaWdpbjFGID0gUEhZX1F1ZXJ5UkZSZWcocGFkYXB0ZXIsIFBhdGhBLCBSRl9SQ0syLCAweGYwKTsKLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSA9IDA7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuUHJldmlvdXNTdGF0ZSA9IDA7Ci0KLQlCVERNXzg3MjNBSW5pdChwYWRhcHRlcik7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkluaXRsaXplZCA9IHRydWU7Ci19Ci0KLS8qICAqLwotLyogIGV4dGVybiBmdW5jdGlvbiAqLwotLyogICovCi12b2lkIEJURE1fQ2hlY2tBbnRTZWxNb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci19Ci0KLXZvaWQgQlRETV9Gd0MyaEJ0UnNzaShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqdG1wQnVmKQotewotCUJURE1fRndDMmhCdFJzc2k4NzIzQShwYWRhcHRlciwgdG1wQnVmKTsKLX0KLQotdm9pZCBCVERNX0Rpc3BsYXlCdENvZXhJbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JQlRETV9EaXNwbGF5ODcyM0FCdENvZXhJbmZvKHBhZGFwdGVyKTsKLX0KLQotdm9pZCBCVERNX1JlamVjdEFQQWdncmVnYXRlZFBhY2tldChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBiUmVqZWN0KQotewotfQotCi11OCBCVERNX0lzSFQ0MChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IGlzaHQ0MCA9IHRydWU7Ci0JZW51bSBodF9jaGFubmVsX3dpZHRoIGJ3OwotCi0JYncgPSBwYWRhcHRlci0+bWxtZWV4dHByaXYuY3VyX2J3bW9kZTsKLQotCWlmIChidyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwKQotCQlpc2h0NDAgPSBmYWxzZTsKLQllbHNlIGlmIChidyA9PSBIVF9DSEFOTkVMX1dJRFRIXzQwKQotCQlpc2h0NDAgPSB0cnVlOwotCi0JcmV0dXJuIGlzaHQ0MDsKLX0KLQotdTggQlRETV9MZWdhY3koc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7Ci0JdTggaXNMZWdhY3kgPSBmYWxzZTsKLQotCXBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlpZiAoKHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU18xMUIpIHx8Ci0JCShwbWxtZWV4dC0+Y3VyX3dpcmVsZXNzX21vZGUgPT0gV0lSRUxFU1NfMTFHKSB8fAotCQkocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID09IFdJUkVMRVNTXzExQkcpKQotCQlpc0xlZ2FjeSA9IHRydWU7Ci0KLQlyZXR1cm4gaXNMZWdhY3k7Ci19Ci0KLXZvaWQgQlRETV9DaGVja1dpRmlTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCi0JaWYgKHBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljKSB7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0lETEU7Ci0KLQkJaWYgKHBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYlR4QnVzeVRyYWZmaWMpCi0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1VQTElOSzsKLQkJZWxzZQotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfVVBMSU5LOwotCi0JCWlmIChwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJSeEJ1c3lUcmFmZmljKQotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9ET1dOTElOSzsKLQkJZWxzZQotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfRE9XTkxJTks7Ci0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9JRExFOwotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9VUExJTks7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0RPV05MSU5LOwotCX0KLQotCWlmIChCVERNX0xlZ2FjeShwYWRhcHRlcikpIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9MRUdBQ1k7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0hUMjA7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX0hUNDA7Ci0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfTEVHQUNZOwotCQlpZiAoQlRETV9Jc0hUNDAocGFkYXB0ZXIpKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX0hUNDA7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwOwotCQl9IGVsc2UgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwOwotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfSFQ0MDsKLQkJfQotCX0KLQotCWlmIChwQnRNZ250LT5CdE9wZXJhdGlvbk9uKQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9CVDMwOwotCWVsc2UKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX0JUMzA7Ci19Ci0KLXMzMiBCVERNX0dldFJ4U1Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLS8qUE1HTlRfSU5GTwkJcE1nbnRJbmZvID0gJnBhZGFwdGVyLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXY7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzMzIJCQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDA7Ci0KLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSBHRVRfVU5ERUNPUkFURURfQVZFUkFHRV9SU1NJKHBhZGFwdGVyKTsKLQl9IGVsc2UgeyAvKiAgYXNzb2NpYXRlZCBlbnRyeSBwd2RiICovCi0JCVVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gcEhhbERhdGEtPmRtcHJpdi5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCQkvKiBwSGFsRGF0YS0+QlRfRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiAqLwotCX0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlRETV9HZXRSeFNTKCkgPSAlZFxuIiwgVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIpKTsKLQlyZXR1cm4gVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci19Ci0KLXN0YXRpYyBzMzIgQlRETV9HZXRSeEJlYWNvblNTKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZwYWRhcHRlci0+TWdudEluZm87ICovCi0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0JczMyCQkJcHdkYkJlYWNvbiA9IDA7Ci0KLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJLyogcHdkYkJlYWNvbiA9IHBIYWxEYXRhLT5kbXByaXYuVW5kZWNvcmF0ZWRTbW9vdGhlZEJlYWNvbjsgKi8KLQkJcHdkYkJlYWNvbiA9IHBIYWxEYXRhLT5kbXByaXYuRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQl9Ci0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkJURE1fR2V0UnhCZWFjb25TUygpID0gJWRcbiIsIHB3ZGJCZWFjb24pKTsKLQlyZXR1cm4gcHdkYkJlYWNvbjsKLX0KLQotLyogIEdldCBiZWFjb24gcnNzaSBzdGF0ZSAqLwotdTggQlRETV9DaGVja0NvZXhCY25Sc3NpU3RhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbGV2ZWxOdW0sCi0JCQkgICAgICB1OCBSc3NpVGhyZXNoLCB1OCBSc3NpVGhyZXNoMSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzMzIgcHdkYkJlYWNvbiA9IDA7Ci0JdTggYmNuUnNzaVN0YXRlID0gMDsKLQotCXB3ZGJCZWFjb24gPSBCVERNX0dldFJ4QmVhY29uU1MocGFkYXB0ZXIpOwotCi0JaWYgKGxldmVsTnVtID09IDIpIHsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTUVESVVNOwotCi0JCWlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlQmVhY29uID09IEJUX1JTU0lfU1RBVEVfTE9XKSB8fAotCQkgICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZUJlYWNvbiA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfTE9XKSkgewotCQkJaWYgKHB3ZGJCZWFjb24gPj0gKFJzc2lUaHJlc2grQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgewotCQkJCWJjblJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTE9XOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV9CRUFDT04gc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocHdkYkJlYWNvbiA8IFJzc2lUaHJlc2gpIHsKLQkJCQliY25Sc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV9CRUFDT04gc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwotCQkJfSBlbHNlIHsKLQkJCQliY25Sc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX1NUQVlfSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChsZXZlbE51bSA9PSAzKSB7Ci0JCWlmIChSc3NpVGhyZXNoID4gUnNzaVRocmVzaDEpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV9CRUFDT04gdGhyZXNoIGVycm9yISFcbiIpKTsKLQkJCXJldHVybiBwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGVCZWFjb247Ci0JCX0KLQotCQlpZiAoKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZUJlYWNvbiA9PSBCVF9SU1NJX1NUQVRFX0xPVykgfHwKLQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGVCZWFjb24gPT0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKLQkJCWlmIChwd2RiQmVhY29uID49IChSc3NpVGhyZXNoK0JUX0ZXX0NPRVhfVEhSRVNIX1RPTCkpIHsKLQkJCQliY25Sc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX01FRElVTTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX01FRElVTTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN3aXRjaCB0byBNZWRpdW1cbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN0YXkgYXQgTG93XG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZUJlYWNvbiA9PSBCVF9SU1NJX1NUQVRFX01FRElVTSkgfHwKLQkJCSAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGVCZWFjb24gPT0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpIHsKLQkJCWlmIChwd2RiQmVhY29uID49IChSc3NpVGhyZXNoMStCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTUVESVVNOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV9CRUFDT04gc3RhdGUgc3dpdGNoIHRvIEhpZ2hcbiIpKTsKLQkJCX0gZWxzZSBpZiAocHdkYkJlYWNvbiA8IFJzc2lUaHJlc2gpIHsKLQkJCQliY25Sc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX01FRElVTTsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTTsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfQkVBQ09OIHN0YXRlIHN0YXkgYXQgTWVkaXVtXG4iKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocHdkYkJlYWNvbiA8IFJzc2lUaHJlc2gxKSB7Ci0JCQkJYmNuUnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fSElHSDsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJX0JFQUNPTiBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJjblJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV9CRUFDT04gc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGVCZWFjb24gPSBiY25Sc3NpU3RhdGU7Ci0KLQlyZXR1cm4gYmNuUnNzaVN0YXRlOwotfQotCi11OCBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZTEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbGV2ZWxOdW0sCi0JCQkgICAgdTggUnNzaVRocmVzaCwgdTggUnNzaVRocmVzaDEpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JczMyIFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMDsKLQl1OCBidFJzc2lTdGF0ZSA9IDA7Ci0KLQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IEJURE1fR2V0UnhTUyhwYWRhcHRlcik7Ci0KLQlpZiAobGV2ZWxOdW0gPT0gMikgewotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNOwotCi0JCWlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlMSA9PSBCVF9SU1NJX1NUQVRFX0xPVykgfHwKLQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1cpKSB7Ci0JCQlpZiAoVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPj0gKFJzc2lUaHJlc2grQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzd2l0Y2ggdG8gSGlnaFxuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IFJzc2lUaHJlc2gpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKGxldmVsTnVtID09IDMpIHsKLQkJaWYgKFJzc2lUaHJlc2ggPiBSc3NpVGhyZXNoMSkgewotCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgdGhyZXNoIGVycm9yISFcbiIpKTsKLQkJCXJldHVybiBwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxOwotCQl9Ci0KLQkJaWYgKChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfTE9XKSB8fAotCQkgICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA+PSAoUnNzaVRocmVzaCtCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX01FRElVTTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfSElHSDsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzdGF5IGF0IExvd1xuIikpOwotCQkJfQotCQl9IGVsc2UgaWYgKChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxID09IEJUX1JTU0lfU1RBVEVfTUVESVVNKSB8fAotCQkJICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZTEgPT0gQlRfUlNTSV9TVEFURV9TVEFZX01FRElVTSkpIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA+PSAoUnNzaVRocmVzaDErQlRfRldfQ09FWF9USFJFU0hfVE9MKSkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTUVESVVNOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSV8xIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7Ci0JCQl9IGVsc2UgaWYgKFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCIDwgUnNzaVRocmVzaCkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJXzFfTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9NRURJVU07Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3dpdGNoIHRvIExvd1xuIikpOwotCQkJfSBlbHNlIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfU1RBWV9NRURJVU07Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3RheSBhdCBNZWRpdW1cbiIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IFJzc2lUaHJlc2gxKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX01FRElVTTsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0lfMSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJXzEgc3RhdGUgc3RheSBhdCBIaWdoXG4iKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUxID0gYnRSc3NpU3RhdGU7Ci0KLQlyZXR1cm4gYnRSc3NpU3RhdGU7Ci19Ci0KLXU4IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGxldmVsTnVtLAotCQkJICAgdTggUnNzaVRocmVzaCwgdTggUnNzaVRocmVzaDEpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JczMyIFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMDsKLQl1OCBidFJzc2lTdGF0ZSA9IDA7Ci0KLQlVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IEJURE1fR2V0UnhTUyhwYWRhcHRlcik7Ci0KLQlpZiAobGV2ZWxOdW0gPT0gMikgewotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX01FRElVTTsKLQotCQlpZiAoKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX0xPVykgfHwKLQkJICAgIChwSGFsRGF0YS0+YnRfY29leGlzdC5wcmVSc3NpU3RhdGUgPT0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVykpIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA+PSAoUnNzaVRocmVzaCtCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1c7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChVbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IFJzc2lUaHJlc2gpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTE9XOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTG93XG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChsZXZlbE51bSA9PSAzKSB7Ci0JCWlmIChSc3NpVGhyZXNoID4gUnNzaVRocmVzaDEpIHsKLQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSB0aHJlc2ggZXJyb3IhIVxuIikpOwotCQkJcmV0dXJuIHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZTsKLQkJfQotCi0JCWlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfTE9XKSB8fAotCQkgICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfTE9XKSkgewotCQkJaWYgKFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID49IChSc3NpVGhyZXNoK0JUX0ZXX0NPRVhfVEhSRVNIX1RPTCkpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTUVESVVNOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdIOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0xPVzsKLQkJCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIFJTU0kgc3RhdGUgc3RheSBhdCBMb3dcbiIpKTsKLQkJCX0KLQkJfSBlbHNlIGlmICgocEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlID09IEJUX1JTU0lfU1RBVEVfTUVESVVNKSB8fAotCQkJICAgKHBIYWxEYXRhLT5idF9jb2V4aXN0LnByZVJzc2lTdGF0ZSA9PSBCVF9SU1NJX1NUQVRFX1NUQVlfTUVESVVNKSkgewotCQkJaWYgKFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID49IChSc3NpVGhyZXNoMStCVF9GV19DT0VYX1RIUkVTSF9UT0wpKSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN3aXRjaCB0byBIaWdoXG4iKSk7Ci0JCQl9IGVsc2UgaWYgKFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCIDwgUnNzaVRocmVzaCkgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9MT1c7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0xPVzsKLQkJCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgJj0gfkJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0hJR0g7Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN3aXRjaCB0byBMb3dcbiIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnRSc3NpU3RhdGUgPSBCVF9SU1NJX1NUQVRFX1NUQVlfTUVESVVNOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzdGF5IGF0IE1lZGl1bVxuIikpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCIDwgUnNzaVRocmVzaDEpIHsKLQkJCQlidFJzc2lTdGF0ZSA9IEJUX1JTU0lfU1RBVEVfTUVESVVNOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9NRURJVU07Ci0JCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5CVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9ISUdIOwotCQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSAmPSB+QlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfTE9XOwotCQkJCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgUlNTSSBzdGF0ZSBzd2l0Y2ggdG8gTWVkaXVtXG4iKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ0UnNzaVN0YXRlID0gQlRfUlNTSV9TVEFURV9TVEFZX0hJR0g7Ci0JCQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBSU1NJIHN0YXRlIHN0YXkgYXQgSGlnaFxuIikpOwotCQkJfQotCQl9Ci0JfQotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QucHJlUnNzaVN0YXRlID0gYnRSc3NpU3RhdGU7Ci0KLQlyZXR1cm4gYnRSc3NpU3RhdGU7Ci19Ci0KLWJvb2wgcnRsODcyM2FfQlRfZGlzYWJsZV9FRENBX3R1cmJvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQl1OCBiQnRDaGFuZ2VFRENBID0gZmFsc2U7Ci0JdTMyIEVEQ0FfQlRfQkUgPSAweDVlYTQyYiwgY3VyX0VEQ0FfcmVnOwotCWJvb2wgYlJldCA9IGZhbHNlOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEhhbERhdGEtPkJ0SW5mby5CdE1nbnQ7Ci0KLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKSB7Ci0JCWJSZXQgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QubGFzdEJ0RWRjYSA9IDA7Ci0JCXJldHVybiBiUmV0OwotCX0KLQlpZiAoISgocEJ0TWdudC0+YlN1cHBvcnRQcm9maWxlKSB8fAotCSAgICAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQ29leGlzdFR5cGUgPT0gQlRfQ1NSX0JDOCkpKSB7Ci0JCWJSZXQgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QubGFzdEJ0RWRjYSA9IDA7Ci0JCXJldHVybiBiUmV0OwotCX0KLQotCWlmIChydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKSB7Ci0JCWJSZXQgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QubGFzdEJ0RWRjYSA9IDA7Ci0JCXJldHVybiBiUmV0OwotCX0KLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5leGVjX2NudCA8IDMpCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmV4ZWNfY250Kys7Ci0JZWxzZQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iRURDQUluaXRpYWxpemVkID0gdHJ1ZTsKLQotCS8qICBXaGVuIEJUIGlzIG5vbiBpZGxlICovCi0JaWYgKCEocEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICYgQlRfQ09FWF9TVEFURV9CVF9JRExFKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlQgc3RhdGUgbm9uIGlkbGUsIHNldCBidCBFRENBXG4iKSk7Ci0KLQkJLyogYWdncl9udW0gPSAweDA5MDk7ICovCi0JCWlmIChwSGFsRGF0YS0+b2RtcHJpdi5ETV9FRENBX1RhYmxlLmJDdXJyZW50VHVyYm9FRENBKSB7Ci0JCQliQnRDaGFuZ2VFRENBID0gdHJ1ZTsKLQkJCXBIYWxEYXRhLT5vZG1wcml2LkRNX0VEQ0FfVGFibGUuYkN1cnJlbnRUdXJib0VEQ0EgPSBmYWxzZTsKLQkJCXBIYWxEYXRhLT5kbXByaXYucHJ2X3RyYWZmaWNfaWR4ID0gMzsKLQkJfQotCQljdXJfRURDQV9yZWcgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfRURDQV9CRV9QQVJBTSk7Ci0KLQkJaWYgKGN1cl9FRENBX3JlZyAhPSBFRENBX0JUX0JFKQotCQkJYkJ0Q2hhbmdlRURDQSA9IHRydWU7Ci0JCWlmIChiQnRDaGFuZ2VFRENBIHx8ICFwSGFsRGF0YS0+YnRfY29leGlzdC5iRURDQUluaXRpYWxpemVkKSB7Ci0JCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX0VEQ0FfQkVfUEFSQU0sCi0JCQkJCSAgRURDQV9CVF9CRSk7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5sYXN0QnRFZGNhID0gRURDQV9CVF9CRTsKLQkJfQotCQliUmV0ID0gdHJ1ZTsKLQl9IGVsc2UgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlQgc3RhdGUgaWRsZSwgc2V0IG9yaWdpbmFsIEVEQ0FcbiIpKTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QubGFzdEJ0RWRjYSA9IDA7Ci0JCWJSZXQgPSBmYWxzZTsKLQl9Ci0JcmV0dXJuIGJSZXQ7Ci19Ci0KLXZvaWQKLUJURE1fQmFsYW5jZSgKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCXU4IGJCYWxhbmNlT24sCi0JdTggbXMwLAotCXU4IG1zMQotCSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1OCBIMkNfUGFyYW1ldGVyWzNdID0gezB9OwotCi0JaWYgKGJCYWxhbmNlT24pIHsKLQkJSDJDX1BhcmFtZXRlclsyXSA9IDE7Ci0JCUgyQ19QYXJhbWV0ZXJbMV0gPSBtczE7Ci0JCUgyQ19QYXJhbWV0ZXJbMF0gPSBtczA7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9IGVsc2UgewotCQlIMkNfUGFyYW1ldGVyWzJdID0gMDsKLQkJSDJDX1BhcmFtZXRlclsxXSA9IDA7Ci0JCUgyQ19QYXJhbWV0ZXJbMF0gPSAwOwotCX0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iQmFsYW5jZU9uID0gYkJhbGFuY2VPbjsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQmFsYW5jZSA9WyVzOiVkbXM6JWRtc10sIHdyaXRlIDB4YyA9IDB4JXhcbiIsCi0JCWJCYWxhbmNlT24/Ik9OIjoiT0ZGIiwgbXMwLCBtczEsCi0JCUgyQ19QYXJhbWV0ZXJbMF08PDE2fEgyQ19QYXJhbWV0ZXJbMV08PDh8SDJDX1BhcmFtZXRlclsyXSkpOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgMHhjLCAzLCBIMkNfUGFyYW1ldGVyKTsKLX0KLQotdm9pZCBCVERNX0FHQ1RhYmxlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHR5cGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JaWYgKHR5cGUgPT0gQlRfQUdDVEFCTEVfT0ZGKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRdQUdDVGFibGUgT2ZmIVxuIikpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NjQxYzAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NjMxZDAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NjIxZTAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NjExZjAwMDEpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjNzgsIDB4NjAyMDAwMDEpOwotCi0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHgzMjAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHg3MTAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHhiMDAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0FHQ19IUCwgYlJGUmVnT2Zmc2V0TWFzaywgMHhmYzAwMCk7Ci0JCVBIWV9TZXRSRlJlZyhwYWRhcHRlciwgUGF0aEEsIFJGX1JYX0cxLCBiUkZSZWdPZmZzZXRNYXNrLCAweDMwMzU1KTsKLQotCQlwSGFsRGF0YS0+YnRfY29leGlzdC5iODcyM2FBZ2NUYWJsZU9uID0gZmFsc2U7Ci0JfSBlbHNlIGlmICh0eXBlID09IEJUX0FHQ1RBQkxFX09OKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbQlRdQUdDVGFibGUgT24hXG4iKSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGM3OCwgMHg0ZTFjMDAwMSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGM3OCwgMHg0ZDFkMDAwMSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGM3OCwgMHg0YzFlMDAwMSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGM3OCwgMHg0YjFmMDAwMSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGM3OCwgMHg0YTIwMDAwMSk7Ci0KLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUlhfQUdDX0hQLCBiUkZSZWdPZmZzZXRNYXNrLCAweGRjMDAwKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUlhfQUdDX0hQLCBiUkZSZWdPZmZzZXRNYXNrLCAweDkwMDAwKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUlhfQUdDX0hQLCBiUkZSZWdPZmZzZXRNYXNrLCAweDUxMDAwKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUlhfQUdDX0hQLCBiUkZSZWdPZmZzZXRNYXNrLCAweDEyMDAwKTsKLQkJUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBQYXRoQSwgUkZfUlhfRzEsIGJSRlJlZ09mZnNldE1hc2ssIDB4MDAzNTUpOwotCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmI4NzIzYUFnY1RhYmxlT24gPSB0cnVlOwotCi0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJTV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9Ci19Ci0KLXZvaWQgQlRETV9CQkJhY2tPZmZMZXZlbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKHR5cGUgPT0gQlRfQkJfQkFDS09GRl9PRkYpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVF1CQkJhY2tPZmZMZXZlbCBPZmYhXG4iKSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCAweGMwNCwgMHgzYTA1NjExKTsKLQl9IGVsc2UgaWYgKHR5cGUgPT0gQlRfQkJfQkFDS09GRl9PTikgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUXUJCQmFja09mZkxldmVsIE9uIVxuIikpOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgMHhjMDQsIDB4M2EwNzYxMSk7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJTV0NvZXhpc3RBbGxPZmYgPSBmYWxzZTsKLQl9Ci19Ci0KLXZvaWQgQlRETV9GV0NvZXhBbGxPZmYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVERNX0ZXQ29leEFsbE9mZigpXG4iKSk7Ci0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LmJGV0NvZXhpc3RBbGxPZmYpCi0JCXJldHVybjsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiQlRETV9GV0NvZXhBbGxPZmYoKSwgcmVhbCBEb1xuIikpOwotCi0JQlRETV9GV0NvZXhBbGxPZmY4NzIzQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iRldDb2V4aXN0QWxsT2ZmID0gdHJ1ZTsKLX0KLQotdm9pZCBCVERNX1NXQ29leEFsbE9mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkJURE1fU1dDb2V4QWxsT2ZmKClcbiIpKTsKLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuYlNXQ29leGlzdEFsbE9mZikKLQkJcmV0dXJuOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVERNX1NXQ29leEFsbE9mZigpLCByZWFsIERvXG4iKSk7Ci0JQlRETV9TV0NvZXhBbGxPZmY4NzIzQShwYWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+YnRfY29leGlzdC5iU1dDb2V4aXN0QWxsT2ZmID0gdHJ1ZTsKLX0KLQotdm9pZCBCVERNX0hXQ29leEFsbE9mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIkJURE1fSFdDb2V4QWxsT2ZmKClcbiIpKTsKLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuYkhXQ29leGlzdEFsbE9mZikKLQkJcmV0dXJuOwotCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJCVERNX0hXQ29leEFsbE9mZigpLCByZWFsIERvXG4iKSk7Ci0KLQlCVERNX0hXQ29leEFsbE9mZjg3MjNBKHBhZGFwdGVyKTsKLQotCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJIV0NvZXhpc3RBbGxPZmYgPSB0cnVlOwotfQotCi12b2lkIEJURE1fQ29leEFsbE9mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCUJURE1fRldDb2V4QWxsT2ZmKHBhZGFwdGVyKTsKLQlCVERNX1NXQ29leEFsbE9mZihwYWRhcHRlcik7Ci0JQlRETV9IV0NvZXhBbGxPZmYocGFkYXB0ZXIpOwotfQotCi12b2lkIHJ0bDg3MjNhX0JUX2Rpc2FibGVfY29leGlzdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBwd3JjdHJsX3ByaXYgKnBwd3JjdHJsID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCWlmICghcnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikpCi0JCXJldHVybjsKLQotCS8qICA4NzIzIDFBbnQgZG9lc24ndCBuZWVkIHRvIHR1cm4gb2ZmIGJ0IGNvZXhpc3QgbWVjaGFuaXNtLiAqLwotCWlmIChydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0KLQkvKiAgQmVmb3JlIGVudGVyIElQUywgdHVybiBvZmYgRlcgQlQgQ28tZXhpc3QgbWVjaGFuaXNtICovCi0JaWYgKHBwd3JjdHJsLT5yZWdfcmZvZmYgPT0gcmZfb24pIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltCVF1bRE1dLCBCZWZvcmUgZW50ZXIgSVBTLCB0dXJuIG9mZiBhbGwgQ29leGlzdCBETVxuIikpOwotCQlidGRtX1Jlc2V0RldDb2V4U3RhdGUocGFkYXB0ZXIpOwotCQlCVERNX0NvZXhBbGxPZmYocGFkYXB0ZXIpOwotCQlCVERNX1NldEFudGVubmEocGFkYXB0ZXIsIEJURE1fQU5UX0JUKTsKLQl9Ci19Ci0KLXZvaWQgQlRETV9TaWduYWxDb21wZW5zYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnJzc2lfd2lmaSwgdTggKnJzc2lfYnQpCi17Ci0JQlRETV84NzIzQVNpZ25hbENvbXBlbnNhdGlvbihwYWRhcHRlciwgcnNzaV93aWZpLCByc3NpX2J0KTsKLX0KLQotdm9pZCBydGw4NzIzYV9CVF9kb19jb2V4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQlQgbm90IGV4aXN0cyEhXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIXBIYWxEYXRhLT5idF9jb2V4aXN0LmJJbml0bGl6ZWQpIHsKLQkJUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBidGRtX0luaXRCdENvZXhpc3RETSgpXG4iKSk7Ci0JCWJ0ZG1fSW5pdEJ0Q29leGlzdERNKHBhZGFwdGVyKTsKLQl9Ci0KLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiXG5cbltETV1bQlRdLCBCVERNIHN0YXJ0ISFcbiIpKTsKLQotCUJURE1fUFdEQk1vbml0b3IocGFkYXB0ZXIpOwotCi0JUlRQUklOVChGQlQsIEJUX1RSQUNFLCAoIltETV1bQlRdLCBIVyB0eXBlIGlzIDg3MjNcbiIpKTsKLQlCVERNX0JUQ29leGlzdDg3MjNBKHBhZGFwdGVyKTsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0RNXVtCVF0sIEJURE0gZW5kISFcblxuIikpOwotfQotCi12b2lkIEJURE1fVXBkYXRlQ29leFN0YXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAoIUJURE1fSXNTYW1lQ29leGlzdFN0YXRlKHBhZGFwdGVyKSkgewotCQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUQ29leF0sIENvZXhpc3QgU3RhdGVbYml0TWFwXSBjaGFuZ2UgZnJvbSAweCUiaTY0Zm10InggdG8gMHglImk2NGZtdCJ4LCAgY2hhbmdlQml0cyA9IDB4JSJpNjRmbXQieFxuIiwKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUsCi0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUsCi0JCQkocEhhbERhdGEtPmJ0X2NvZXhpc3QuUHJldmlvdXNTdGF0ZV5wSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUpKSk7Ci0JCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUgPSBwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGU7Ci0JfQotfQotCi11OCBCVERNX0lzU2FtZUNvZXhpc3RTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKHBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUgPT0gcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0gZWxzZSB7Ci0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwgKCJbRE1dW0JUXSwgQ29leGlzdCBzdGF0ZSBjaGFuZ2VkISFcbiIpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLQotdm9pZCBCVERNX1BXREJNb25pdG9yKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbyA9IEdFVF9CVF9JTkZPKEdldERlZmF1bHRBZGFwdGVyKHBhZGFwdGVyKSk7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IEgyQ19QYXJhbWV0ZXJbM10gPSB7MH07Ci0JczMyIHRtcEJURW50cnlNYXhQV0RCID0gMCwgdG1wQlRFbnRyeU1pblBXREIgPSAweGZmOwotCXU4IGk7Ci0KLQlpZiAocEJ0TWdudC0+QnRPcGVyYXRpb25PbikgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0JUX0FTT0NfRU5UUllfTlVNOyBpKyspIHsKLQkJCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5iVXNlZCkgewotCQkJCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IHRtcEJURW50cnlNaW5QV0RCKQotCQkJCQl0bXBCVEVudHJ5TWluUFdEQiA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCQkJCWlmIChwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA+IHRtcEJURW50cnlNYXhQV0RCKQotCQkJCQl0bXBCVEVudHJ5TWF4UFdEQiA9IHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwotCQkJCS8qICBSZXBvcnQgZXZlcnkgQlQgY29ubmVjdGlvbiAoSFMgbW9kZSkgUlNTSSB0byBGVyAqLwotCQkJCUgyQ19QYXJhbWV0ZXJbMl0gPSAodTgpKHBCVEluZm8tPkJ0QXNvY0VudHJ5W2ldLlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCICYgMHhGRik7Ci0JCQkJSDJDX1BhcmFtZXRlclswXSA9IChNQVhfRldfU1VQUE9SVF9NQUNJRF9OVU0tMS1pKTsKLQkJCQlSVFBSSU5UKEZETSwgRE1fQlQzMCwgKCJSU1NJIHJlcG9ydCBmb3IgQlRbJWRdLCBIMkNfUGFyID0gMHgleFxuIiwgaSwgSDJDX1BhcmFtZXRlclswXSkpOwotCQkJCUZpbGxIMkNDbWQocGFkYXB0ZXIsIFJTU0lfU0VUVElOR19FSUQsIDMsIEgyQ19QYXJhbWV0ZXIpOwotCQkJCVJUUFJJTlRfQUREUihGRE0sIChETV9QV0RCfERNX0JUMzApLCAoIkJUX0VudHJ5IE1hYyA6IiksCi0JCQkJCSAgICAgcEJUSW5mby0+QnRBc29jRW50cnlbaV0uQlRSZW1vdGVNQUNBZGRyKQotCQkJCVJUUFJJTlQoRkRNLCAoRE1fUFdEQnxETV9CVDMwKSwKLQkJCQkJKCJCVCByeCBwd2RiWyVkXSA9IDB4JXgoJWQpXG4iLCBpLAotCQkJCQlwQlRJbmZvLT5CdEFzb2NFbnRyeVtpXS5VbmRlY29yYXRlZFNtb290aGVkUFdEQiwKLQkJCQkJcEJUSW5mby0+QnRBc29jRW50cnlbaV0uVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIpKTsKLQkJCX0KLQkJfQotCQlpZiAodG1wQlRFbnRyeU1heFBXREIgIT0gMCkgewkvKiAgSWYgYXNzb2NpYXRlZCBlbnRyeSBpcyBmb3VuZCAqLwotCQkJcEhhbERhdGEtPmRtcHJpdi5CVF9FbnRyeU1heFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gdG1wQlRFbnRyeU1heFBXREI7Ci0JCQlSVFBSSU5UKEZETSwgKERNX1BXREJ8RE1fQlQzMCksICgiQlRfRW50cnlNYXhQV0RCID0gMHgleCglZClcbiIsCi0JCQkJdG1wQlRFbnRyeU1heFBXREIsIHRtcEJURW50cnlNYXhQV0RCKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwSGFsRGF0YS0+ZG1wcml2LkJUX0VudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSAwOwotCQl9Ci0JCWlmICh0bXBCVEVudHJ5TWluUFdEQiAhPSAweGZmKSB7IC8qICBJZiBhc3NvY2lhdGVkIGVudHJ5IGlzIGZvdW5kICovCi0JCQlwSGFsRGF0YS0+ZG1wcml2LkJUX0VudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSB0bXBCVEVudHJ5TWluUFdEQjsKLQkJCVJUUFJJTlQoRkRNLCAoRE1fUFdEQnxETV9CVDMwKSwgKCJCVF9FbnRyeU1pblBXREIgPSAweCV4KCVkKVxuIiwKLQkJCQl0bXBCVEVudHJ5TWluUFdEQiwgdG1wQlRFbnRyeU1pblBXREIpKTsKLQkJfSBlbHNlIHsKLQkJCXBIYWxEYXRhLT5kbXByaXYuQlRfRW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDA7Ci0JCX0KLQl9Ci19Ci0KLXU4IEJURE1fSXNCVEJ1c3koc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250ID0gJnBCVEluZm8tPkJ0TWdudDsKLQotCWlmIChwQnRNZ250LT5FeHRDb25maWcuYkJUQnVzeSkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXU4IEJURE1fSXNXaWZpQnVzeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotLypQTUdOVF9JTkZPCQlwTWdudEluZm8gPSAmR2V0RGVmYXVsdEFkYXB0ZXIocGFkYXB0ZXIpLT5NZ250SW5mbzsgKi8KLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmR2V0RGVmYXVsdEFkYXB0ZXIocGFkYXB0ZXIpLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXN0cnVjdCBidF90cmFmZmljICpwQnRUcmFmZmljID0gJnBCVEluZm8tPkJ0VHJhZmZpYzsKLQotCWlmIChwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJCdXN5VHJhZmZpYyB8fAotCQlwQnRUcmFmZmljLT5CdDMwVHJhZmZpY1N0YXRpc3RpY3MuYlR4QnVzeVRyYWZmaWMgfHwKLQkJcEJ0VHJhZmZpYy0+QnQzMFRyYWZmaWNTdGF0aXN0aWNzLmJSeEJ1c3lUcmFmZmljKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotdTggQlRETV9Jc0NvZXhpc3RTdGF0ZUNoYW5nZWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5QcmV2aW91c1N0YXRlID09IHBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSkKLQkJcmV0dXJuIGZhbHNlOwotCWVsc2UKLQkJcmV0dXJuIHRydWU7Ci19Ci0KLXU4IEJURE1fSXNXaWZpVXBsaW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZHZXREZWZhdWx0QWRhcHRlcihwYWRhcHRlciktPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdjsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF90cmFmZmljICpwQnRUcmFmZmljOwotCi0JcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdFRyYWZmaWMgPSAmcEJUSW5mby0+QnRUcmFmZmljOwotCi0JaWYgKChwbWxtZXByaXYtPkxpbmtEZXRlY3RJbmZvLmJUeEJ1c3lUcmFmZmljKSB8fAotCQkocEJ0VHJhZmZpYy0+QnQzMFRyYWZmaWNTdGF0aXN0aWNzLmJUeEJ1c3lUcmFmZmljKSkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXU4IEJURE1fSXNXaWZpRG93bmxpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLS8qUE1HTlRfSU5GTwkJcE1nbnRJbmZvID0gJkdldERlZmF1bHRBZGFwdGVyKHBhZGFwdGVyKS0+TWdudEluZm87ICovCi0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2OwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X3RyYWZmaWMgKnBCdFRyYWZmaWM7Ci0KLQlwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0VHJhZmZpYyA9ICZwQlRJbmZvLT5CdFRyYWZmaWM7Ci0KLQlpZiAoKHBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYlJ4QnVzeVRyYWZmaWMpIHx8Ci0JCShwQnRUcmFmZmljLT5CdDMwVHJhZmZpY1N0YXRpc3RpY3MuYlJ4QnVzeVRyYWZmaWMpKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotdTggQlRETV9Jc0JUSFNNb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKlBNR05UX0lORk8JCXBNZ250SW5mbyA9ICZHZXREZWZhdWx0QWRhcHRlcihwYWRhcHRlciktPk1nbnRJbmZvOyAqLwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0X21nbnQgKnBCdE1nbnQ7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJ0TWdudCA9ICZwSGFsRGF0YS0+QnRJbmZvLkJ0TWdudDsKLQotCWlmIChwQnRNZ250LT5CdE9wZXJhdGlvbk9uKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotdTggQlRETV9Jc0JUVXBsaW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlQyMVRyYWZmaWNTdGF0aXN0aWNzLmJUeEJ1c3lUcmFmZmljKQotCQlyZXR1cm4gdHJ1ZTsKLQllbHNlCi0JCXJldHVybiBmYWxzZTsKLX0KLQotdTggQlRETV9Jc0JURG93bmxpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5CVDIxVHJhZmZpY1N0YXRpc3RpY3MuYlJ4QnVzeVRyYWZmaWMpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEJURE1fQWRqdXN0Rm9yQnRPcGVyYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlSVFBSSU5UKEZCVCwgQlRfVFJBQ0UsICgiW0JUXVtETV0sIEJURE1fQWRqdXN0Rm9yQnRPcGVyYXRpb24oKVxuIikpOwotCUJURE1fQWRqdXN0Rm9yQnRPcGVyYXRpb244NzIzQShwYWRhcHRlcik7Ci19Ci0KLXZvaWQgQlRETV9TZXRCdENvZXhDdXJyQW50TnVtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGFudE51bSkKLXsKLQlCVERNX1NldDg3MjNBQnRDb2V4Q3VyckFudE51bShwYWRhcHRlciwgYW50TnVtKTsKLX0KLQotdm9pZCBCVERNX0ZvckhhbHQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0KLQlCVERNX0ZvckhhbHQ4NzIzQShwYWRhcHRlcik7Ci0JR0VUX0hBTF9EQVRBKHBhZGFwdGVyKS0+YnRfY29leGlzdC5iSW5pdGxpemVkID0gZmFsc2U7Ci19Ci0KLXZvaWQgQlRETV9XaWZpU2Nhbk5vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzY2FuVHlwZSkKLXsKLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0KLQlCVERNX1dpZmlTY2FuTm90aWZ5ODcyM0EocGFkYXB0ZXIsIHNjYW5UeXBlKTsKLX0KLQotdm9pZCBCVERNX1dpZmlBc3NvY2lhdGVOb3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYWN0aW9uKQotewotCWlmICghcnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikpCi0JCXJldHVybjsKLQotCUJURE1fV2lmaUFzc29jaWF0ZU5vdGlmeTg3MjNBKHBhZGFwdGVyLCBhY3Rpb24pOwotfQotCi12b2lkIHJ0bDg3MjNhX0JUX21lZGlhc3RhdHVzX25vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKQotewotCWlmICghcnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikpCi0JCXJldHVybjsKLQotCUJURE1fTWVkaWFTdGF0dXNOb3RpZnk4NzIzQShwYWRhcHRlciwgbXN0YXR1cyk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfQlRfc3BlY2lhbHBhY2tldF9ub3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpZiAoIXJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKQotCQlyZXR1cm47Ci0KLQlCVERNX0ZvckRoY3A4NzIzQShwYWRhcHRlcik7Ci19Ci0KLXZvaWQgQlRETV9SZXNldEFjdGlvblByb2ZpbGVTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlICY9IH5cCi0JCShCVF9DT0VYX1NUQVRFX1BST0ZJTEVfSElEfEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQfAotCQlCVF9DT0VYX1NUQVRFX1BST0ZJTEVfUEFOfEJUX0NPRVhfU1RBVEVfUFJPRklMRV9TQ08pOwotfQotCi11OCBCVERNX0lzQWN0aW9uU0NPKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9tZ250ICpwQnRNZ250OwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZzsKLQl1OCBiUmV0OwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0TWdudCA9ICZwQlRJbmZvLT5CdE1nbnQ7Ci0JcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCWJSZXQgPSBmYWxzZTsKLQotCWlmIChwQnREYmctPmRiZ0N0cmwpIHsKLQkJaWYgKHBCdERiZy0+ZGJnUHJvZmlsZSA9PSBCVF9EQkdfUFJPRklMRV9TQ08pIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfU0NPOwotCQkJYlJldCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAocEJ0TWdudC0+RXh0Q29uZmlnLk51bWJlck9mU0NPID4gMCkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfUFJPRklMRV9TQ087Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotdTggQlRETV9Jc0FjdGlvbkhJRChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmc7Ci0JdTggYlJldDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQliUmV0ID0gZmFsc2U7Ci0KLQlpZiAocEJ0RGJnLT5kYmdDdHJsKSB7Ci0JCWlmIChwQnREYmctPmRiZ1Byb2ZpbGUgPT0gQlRfREJHX1BST0ZJTEVfSElEKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9QUk9GSUxFX0hJRDsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX0hJRCkgJiYKLQkJICAgIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAxKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9QUk9GSUxFX0hJRDsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBiUmV0OwotfQotCi11OCBCVERNX0lzQWN0aW9uQTJEUChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmc7Ci0JdTggYlJldDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQliUmV0ID0gZmFsc2U7Ci0KLQlpZiAocEJ0RGJnLT5kYmdDdHJsKSB7Ci0JCWlmIChwQnREYmctPmRiZ1Byb2ZpbGUgPT0gQlRfREJHX1BST0ZJTEVfQTJEUCkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQOwotCQkJYlJldCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfQTJEUCkgJiYKLQkJICAgIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAxKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9QUk9GSUxFX0EyRFA7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotdTggQlRETV9Jc0FjdGlvblBBTihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmc7Ci0JdTggYlJldDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQliUmV0ID0gZmFsc2U7Ci0KLQlpZiAocEJ0RGJnLT5kYmdDdHJsKSB7Ci0JCWlmIChwQnREYmctPmRiZ1Byb2ZpbGUgPT0gQlRfREJHX1BST0ZJTEVfUEFOKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTjsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKEJUSENJX0NoZWNrUHJvZmlsZUV4aXN0KHBhZGFwdGVyLCBCVF9QUk9GSUxFX1BBTikgJiYKLQkJICAgIHBCdE1nbnQtPkV4dENvbmZpZy5OdW1iZXJPZkhhbmRsZSA9PSAxKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gQlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTjsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBiUmV0OwotfQotCi11OCBCVERNX0lzQWN0aW9uSElEQTJEUChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IGJ0XzMwaW5mbyAqcEJUSW5mbzsKLQlzdHJ1Y3QgYnRfbWdudCAqcEJ0TWdudDsKLQlzdHJ1Y3QgYnRfZGdiICpwQnREYmc7Ci0JdTggYlJldDsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlwQlRJbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdE1nbnQgPSAmcEJUSW5mby0+QnRNZ250OwotCXBCdERiZyA9ICZwQlRJbmZvLT5CdERiZzsKLQliUmV0ID0gZmFsc2U7Ci0KLQlpZiAocEJ0RGJnLT5kYmdDdHJsKSB7Ci0JCWlmIChwQnREYmctPmRiZ1Byb2ZpbGUgPT0gQlRfREJHX1BST0ZJTEVfSElEX0EyRFApIHsKLQkJCXBIYWxEYXRhLT5idF9jb2V4aXN0LkN1cnJlbnRTdGF0ZSB8PSAoQlRfQ09FWF9TVEFURV9QUk9GSUxFX0hJRHxCVF9DT0VYX1NUQVRFX1BST0ZJTEVfQTJEUCk7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCSAgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKSkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IChCVF9DT0VYX1NUQVRFX1BST0ZJTEVfSElEfEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQKTsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBiUmV0OwotfQotCi11OCBCVERNX0lzQWN0aW9uSElEUEFOKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRJbmZvOwotCXN0cnVjdCBidF9kZ2IgKnBCdERiZzsKLQl1OCBiUmV0OwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBCVEluZm8gPSBHRVRfQlRfSU5GTyhwYWRhcHRlcik7Ci0JcEJ0RGJnID0gJnBCVEluZm8tPkJ0RGJnOwotCWJSZXQgPSBmYWxzZTsKLQotCWlmIChwQnREYmctPmRiZ0N0cmwpIHsKLQkJaWYgKHBCdERiZy0+ZGJnUHJvZmlsZSA9PSBCVF9EQkdfUFJPRklMRV9ISURfUEFOKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gKEJUX0NPRVhfU1RBVEVfUFJPRklMRV9ISUR8QlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTik7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9ISUQpICYmCi0JCSAgICBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9QQU4pKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gKEJUX0NPRVhfU1RBVEVfUFJPRklMRV9ISUR8QlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTik7Ci0JCQliUmV0ID0gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gYlJldDsKLX0KLQotdTggQlRETV9Jc0FjdGlvblBBTkEyRFAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBidF8zMGluZm8gKnBCVEluZm87Ci0Jc3RydWN0IGJ0X2RnYiAqcEJ0RGJnOwotCXU4IGJSZXQ7Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcEJUSW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnREYmcgPSAmcEJUSW5mby0+QnREYmc7Ci0JYlJldCA9IGZhbHNlOwotCi0JaWYgKHBCdERiZy0+ZGJnQ3RybCkgewotCQlpZiAocEJ0RGJnLT5kYmdQcm9maWxlID09IEJUX0RCR19QUk9GSUxFX1BBTl9BMkRQKSB7Ci0JCQlwSGFsRGF0YS0+YnRfY29leGlzdC5DdXJyZW50U3RhdGUgfD0gKEJUX0NPRVhfU1RBVEVfUFJPRklMRV9QQU58QlRfQ09FWF9TVEFURV9QUk9GSUxFX0EyRFApOwotCQkJYlJldCA9IHRydWU7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoQlRIQ0lfQ2hlY2tQcm9maWxlRXhpc3QocGFkYXB0ZXIsIEJUX1BST0ZJTEVfUEFOKSAmJiBCVEhDSV9DaGVja1Byb2ZpbGVFeGlzdChwYWRhcHRlciwgQlRfUFJPRklMRV9BMkRQKSkgewotCQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlIHw9IChCVF9DT0VYX1NUQVRFX1BST0ZJTEVfUEFOfEJUX0NPRVhfU1RBVEVfUFJPRklMRV9BMkRQKTsKLQkJCWJSZXQgPSB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBiUmV0OwotfQotCi1ib29sIHJ0bDg3MjNhX0JUX2VuYWJsZWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5iQ3VyQnREaXNhYmxlZCkKLQkJcmV0dXJuIGZhbHNlOwotCWVsc2UKLQkJcmV0dXJuIHRydWU7Ci19Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdENvZXhpc3QuYyA9PT09PSAqLwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9IYWxCVC5jID09PT09ICovCi0KLS8qICAqLwotLypsb2NhbCBmdW5jdGlvbiAqLwotLyogICovCi0KLXN0YXRpYyB2b2lkIGhhbGJ0X0luaXRId0NvbmZpZzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci19Ci0KLS8qICAqLwotLypleHRlcm4gZnVuY3Rpb24gKi8KLS8qICAqLwotdTggSEFMQlRfR2V0UEdBbnROdW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCXJldHVybiBwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9BbnRfTnVtOwotfQotCi12b2lkIEhBTEJUX1NldEtleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvOwotCXN0cnVjdCBidF9hc29jX2VudHJ5ICpwQnRBc3NvY0VudHJ5OwotCXUxNgkJCQl1c0NvbmZpZyA9IDA7Ci0KLQlwQlRpbmZvID0gR0VUX0JUX0lORk8ocGFkYXB0ZXIpOwotCXBCdEFzc29jRW50cnkgPSAmcEJUaW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dOwotCi0JcEJ0QXNzb2NFbnRyeS0+SHdDQU1JbmRleCA9IEJUX0hXQ0FNX1NUQVIgKyBFbnRyeU51bTsKLQotCXVzQ29uZmlnID0gQ0FNX1ZBTElEIHwgKENBTV9BRVMgPDwgMik7Ci0JcnRsODcyM2FfY2FtX3dyaXRlKHBhZGFwdGVyLCBwQnRBc3NvY0VudHJ5LT5Id0NBTUluZGV4LCB1c0NvbmZpZywKLQkJCSAgIHBCdEFzc29jRW50cnktPkJUUmVtb3RlTUFDQWRkciwKLQkJCSAgIHBCdEFzc29jRW50cnktPlBUSyArIFRLSVBfRU5DX0tFWV9QT1MpOwotfQotCi12b2lkIEhBTEJUX1JlbW92ZUtleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSkKLXsKLQlzdHJ1Y3QgYnRfMzBpbmZvICpwQlRpbmZvOwotCXN0cnVjdCBidF9hc29jX2VudHJ5ICpwQnRBc3NvY0VudHJ5OwotCi0JcEJUaW5mbyA9IEdFVF9CVF9JTkZPKHBhZGFwdGVyKTsKLQlwQnRBc3NvY0VudHJ5ID0gJnBCVGluZm8tPkJ0QXNvY0VudHJ5W0VudHJ5TnVtXTsKLQotCWlmIChwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uSHdDQU1JbmRleCAhPSAwKSB7Ci0JCS8qICBUb0RvIDogYWRkIE5ldyBIQUxCVF9SZW1vdmVLZXkgZnVuY3Rpb24gISEgKi8KLQkJaWYgKHBCdEFzc29jRW50cnktPkh3Q0FNSW5kZXggPj0gQlRfSFdDQU1fU1RBUiAmJgotCQkgICAgcEJ0QXNzb2NFbnRyeS0+SHdDQU1JbmRleCA8IEhBTEZfQ0FNX0VOVFJZKQotCQkJcnRsODcyM2FfY2FtX2VtcHR5X2VudHJ5KHBhZGFwdGVyLAotCQkJCQkJIHBCdEFzc29jRW50cnktPkh3Q0FNSW5kZXgpOwotCQlwQlRpbmZvLT5CdEFzb2NFbnRyeVtFbnRyeU51bV0uSHdDQU1JbmRleCA9IDA7Ci0JfQotfQotCi12b2lkIHJ0bDg3MjNhX0JUX2luaXRfaGFsX3ZhcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuQmx1ZXRvb3RoQ29leGlzdCA9IHBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhDb2V4aXN0OwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0FudF9OdW0gPSBwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQW50TnVtOwotCXBIYWxEYXRhLT5idF9jb2V4aXN0LkJUX0NvZXhpc3RUeXBlID0gcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aFR5cGU7Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X2lzb2xhdGlvbiA9IHBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnRJc29sYXRpb247Ci0JcEhhbERhdGEtPmJ0X2NvZXhpc3QuYnRfcmFkaW9zaGFyZWR0eXBlID0gcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aFJhZGlvU2hhcmVkOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICJCVCBDb2V4aXN0YW5jZSA9IDB4JXhcbiIsIHJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKTsKLQotCWlmIChydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkgewotCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bSA9PSBBbnRfeDIpIHsKLQkJCUJURE1fU2V0QnRDb2V4Q3VyckFudE51bShwYWRhcHRlciwgMik7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiQmx1ZVRvb3RoIEJUX0FudF9OdW0gPSBBbnR4MlxuIik7Ci0JCX0gZWxzZSBpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bSA9PSBBbnRfeDEpIHsKLQkJCUJURE1fU2V0QnRDb2V4Q3VyckFudE51bShwYWRhcHRlciwgMSk7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiQmx1ZVRvb3RoIEJUX0FudF9OdW0gPSBBbnR4MVxuIik7Ci0JCX0KLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkJUQnVzeVRyYWZmaWMgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkJUVHJhZmZpY01vZGVTZXQgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuYkJUTm9uVHJhZmZpY01vZGVTZXQgPSBmYWxzZTsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuQ3VycmVudFN0YXRlID0gMDsKLQkJcEhhbERhdGEtPmJ0X2NvZXhpc3QuUHJldmlvdXNTdGF0ZSA9IDA7Ci0KLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAiYnRfcmFkaW9zaGFyZWRUeXBlID0gMHgleFxuIiwKLQkJCSBwSGFsRGF0YS0+YnRfY29leGlzdC5idF9yYWRpb3NoYXJlZHR5cGUpOwotCX0KLX0KLQotYm9vbCBydGw4NzIzYV9CVF9jb2V4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQmx1ZXRvb3RoQ29leGlzdCkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXU4IEhBTEJUX0JUQ2hpcFR5cGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCXJldHVybiBwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9Db2V4aXN0VHlwZTsKLX0KLQotdm9pZCBydGw4NzIzYV9CVF9pbml0X2h3Y29uZmlnKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaGFsYnRfSW5pdEh3Q29uZmlnODcyM0EocGFkYXB0ZXIpOwotCXJ0bDg3MjNhX0JUX2RvX2NvZXhpc3QocGFkYXB0ZXIpOwotfQotCi12b2lkIEhBTEJUX1NldFJ0c0N0c05vTGVuTGltaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLX0KLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvSGFsQlQuYyA9PT09PSAqLwotCi12b2lkIHJ0bDg3MjNhX2R1YWxfYW50ZW5uYV9kZXRlY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbTsKLQlzdHJ1Y3Qgc3dfYW50X3N3ICpwRE1fU1dBVF9UYWJsZTsKLQl1OCBpOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0JcERNX1NXQVRfVGFibGUgPSAmcERNX09kbS0+RE1fU1dBVF9UYWJsZTsKLQotCS8qICAqLwotCS8qICA8Um9nZXJfTm90ZXM+IFJUTDg3MjNBIFNpbmdsZSBhbmQgRHVhbCBhbnRlbm5hIGR5bmFtaWMgZGV0ZWN0aW9uCi0JICAgIG1lY2hhbmlzbSB3aGVuIFJGIHBvd2VyIHN0YXRlIGlzIG9uLiAqLwotCS8qICBXZSBzaG91bGQgdGFrZSBwb3dlciB0cmFja2luZywgSVFLLCBMQ0ssIFJDSyBSRiByZWFkL3dyaXRlCi0JICAgIG9wZXJhdGlvbiBpbnRvIGNvbnNpZGVyYXRpb24uICovCi0JLyogIDIwMTEuMTIuMTUuICovCi0JLyogICovCi0JaWYgKCFwSGFsRGF0YS0+YkFudGVubmFEZXRlY3RlZCkgewotCQl1OCBidEFudE51bSA9IEJUX0dldFBHQW50TnVtKHBhZGFwdGVyKTsKLQotCQkvKiAgU2V0IGRlZmF1bHQgYW50ZW5uYSBCIHN0YXR1cyAqLwotCQlpZiAoYnRBbnROdW0gPT0gQW50X3gyKQotCQkJcERNX1NXQVRfVGFibGUtPkFOVEJfT04gPSB0cnVlOwotCQllbHNlIGlmIChidEFudE51bSA9PSBBbnRfeDEpCi0JCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IGZhbHNlOwotCQllbHNlCi0JCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IHRydWU7Ci0KLQkJaWYgKHBIYWxEYXRhLT5DdXN0b21lcklEICE9IFJUX0NJRF9UT1NISUJBKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0FOVEVOTkFfREVURUNUSU9OX0NOVDsgaSsrKSB7Ci0JCQkJaWYgKE9ETV9TaW5nbGVEdWFsQW50ZW5uYURldGVjdGlvbgotCQkJCSAgICAoJnBIYWxEYXRhLT5vZG1wcml2LCBBTlRURVNUQUxMKSA9PSB0cnVlKQotCQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogIFNldCBkZWZhdWx0IGFudGVubmEgbnVtYmVyIGZvciBCVCBjb2V4aXN0ZW5jZSAqLwotCQkJaWYgKGJ0QW50TnVtID09IEFudF94MikKLQkJCQlCVF9TZXRCdENvZXhDdXJyQW50TnVtKHBhZGFwdGVyLAotCQkJCQkJICAgICAgIHBETV9TV0FUX1RhYmxlLT4KLQkJCQkJCSAgICAgICBBTlRCX09OID8gMiA6IDEpOwotCQl9Ci0JCXBIYWxEYXRhLT5iQW50ZW5uYURldGVjdGVkID0gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2NtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjMwZjRjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2NtZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRMODcyM0FfQ01EX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLSNkZWZpbmUgUlRMOTJDX01BWF9IMkNfQk9YX05VTVMJCTQKLSNkZWZpbmUgUlRMOTJDX01BWF9DTURfTEVOCQk1Ci0jZGVmaW5lIE1FU1NBR0VfQk9YX1NJWkUJCTQKLSNkZWZpbmUgRVhfTUVTU0FHRV9CT1hfU0laRQkJMgotCi1zdGF0aWMgdTggX2lzX2Z3X3JlYWRfY21kX2Rvd24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbXNnYm94X251bSkKLXsKLQl1OCByZWFkX2Rvd24gPSBmYWxzZTsKLQlpbnQJcmV0cnlfY250cyA9IDEwMDsKLQl1OCB2YWxpZDsKLQotCWRvIHsKLQkJdmFsaWQgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19ITUVURlIpICYgQklUKG1zZ2JveF9udW0pOwotCQlpZiAoMCA9PSB2YWxpZCkKLQkJCXJlYWRfZG93biA9IHRydWU7Ci0JfSB3aGlsZSAoKCFyZWFkX2Rvd24pICYmIChyZXRyeV9jbnRzLS0pKTsKLQotCXJldHVybiByZWFkX2Rvd247Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBIMkMgTXNnIGZvcm1hdCA6Ci0qfCAzMSAtIDgJCXw3CQl8IDYgLSAwCXwKLSp8IGgyY19tc2cJfEV4dF9iaXQJfENNRF9JRAl8Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgRmlsbEgyQ0NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbGVtZW50SUQsIHUzMiBDbWRMZW4sCi0JICAgICAgIHU4ICpwQ21kQnVmZmVyKQotewotCXU4IGJjbWRfZG93biA9IGZhbHNlOwotCXMzMiByZXRyeV9jbnRzID0gMTAwOwotCXU4IGgyY19ib3hfbnVtOwotCXUzMiBtc2dib3hfYWRkcjsKLQl1MzIgbXNnYm94X2V4X2FkZHI7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQl1MzIgaDJjX2NtZCA9IDA7Ci0JdTE2IGgyY19jbWRfZXggPSAwOwotCWludCByZXQgPSBfRkFJTDsKLQotCXBhZGFwdGVyID0gR0VUX1BSSU1BUllfQURBUFRFUihwYWRhcHRlcik7Ci0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JbXV0ZXhfbG9jaygmYWRhcHRlcl90b19kdm9iaihwYWRhcHRlciktPmgyY19md2NtZF9tdXRleCk7Ci0KLQlpZiAoIXBDbWRCdWZmZXIpCi0JCWdvdG8gZXhpdDsKLQlpZiAoQ21kTGVuID4gUlRMOTJDX01BWF9DTURfTEVOKQotCQlnb3RvIGV4aXQ7Ci0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHBheSBhdHRlbnRpb24gdG8gaWYgIHJhY2UgY29uZGl0aW9uIGhhcHBlbmVkIGluICBIMkMgY21kIHNldHRpbmcuICovCi0JZG8gewotCQloMmNfYm94X251bSA9IHBIYWxEYXRhLT5MYXN0SE1FQm94TnVtOwotCi0JCWlmICghX2lzX2Z3X3JlYWRfY21kX2Rvd24ocGFkYXB0ZXIsIGgyY19ib3hfbnVtKSkgewotCQkJREJHXzg3MjNBKCIgZncgcmVhZCBjbWQgZmFpbGVkLi4uXG4iKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCWlmIChDbWRMZW4gPD0gMykgewotCQkJbWVtY3B5KCh1OCAqKSgmaDJjX2NtZCkrMSwgcENtZEJ1ZmZlciwgQ21kTGVuKTsKLQkJfSBlbHNlIHsKLQkJCW1lbWNweSgodTggKikoJmgyY19jbWRfZXgpLCBwQ21kQnVmZmVyLCBFWF9NRVNTQUdFX0JPWF9TSVpFKTsKLQkJCW1lbWNweSgodTggKikoJmgyY19jbWQpKzEsIHBDbWRCdWZmZXIrMiwgKENtZExlbi1FWF9NRVNTQUdFX0JPWF9TSVpFKSk7Ci0JCQkqKHU4ICopKCZoMmNfY21kKSB8PSBCSVQoNyk7Ci0JCX0KLQotCQkqKHU4ICopKCZoMmNfY21kKSB8PSBFbGVtZW50SUQ7Ci0KLQkJaWYgKGgyY19jbWQgJiBCSVQoNykpIHsKLQkJCW1zZ2JveF9leF9hZGRyID0gUkVHX0hNRUJPWF9FWFRfMCArIChoMmNfYm94X251bSAqIEVYX01FU1NBR0VfQk9YX1NJWkUpOwotCQkJaDJjX2NtZF9leCA9IGxlMTZfdG9fY3B1KGgyY19jbWRfZXgpOwotCQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIG1zZ2JveF9leF9hZGRyLCBoMmNfY21kX2V4KTsKLQkJfQotCQltc2dib3hfYWRkciA9IFJFR19ITUVCT1hfMCArIChoMmNfYm94X251bSAqIE1FU1NBR0VfQk9YX1NJWkUpOwotCQloMmNfY21kID0gbGUzMl90b19jcHUoaDJjX2NtZCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBtc2dib3hfYWRkciwgaDJjX2NtZCk7Ci0KLQkJYmNtZF9kb3duID0gdHJ1ZTsKLQotCQlwSGFsRGF0YS0+TGFzdEhNRUJveE51bSA9IChoMmNfYm94X251bSsxKSAlIFJUTDkyQ19NQVhfSDJDX0JPWF9OVU1TOwotCi0JfSB3aGlsZSAoKCFiY21kX2Rvd24pICYmIChyZXRyeV9jbnRzLS0pKTsKLQotCXJldCA9IF9TVUNDRVNTOwotCi1leGl0OgotCW11dGV4X3VubG9jaygmYWRhcHRlcl90b19kdm9iaihwYWRhcHRlciktPmgyY19md2NtZF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0bDg3MjNhX3NldF9yc3NpX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgcGFyYW0pCi17Ci0JX19sZTMyIGNtZCA9IGNwdV90b19sZTMyKHBhcmFtKTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIFJTU0lfU0VUVElOR19FSUQsIDMsICh2b2lkICopJmNtZCk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLWludCBydGw4NzIzYV9zZXRfcmFpZF9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIG1hc2ssIHU4IGFyZykKLXsKLQl1OCBidWZbNV07Ci0KLQltZW1zZXQoYnVmLCAwLCA1KTsKLQlwdXRfdW5hbGlnbmVkX2xlMzIobWFzaywgYnVmKTsKLQlidWZbNF0gID0gYXJnOwotCi0JRmlsbEgyQ0NtZChwYWRhcHRlciwgTUFDSURfQ09ORklHX0VJRCwgNSwgYnVmKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotLyogYml0bWFwWzA6MjddID0gdHhfcmF0ZV9iaXRtYXAgKi8KLS8qIGJpdG1hcFsyODozMV09IFJhdGUgQWRhcHRpdmUgaWQgKi8KLS8qIGFyZ1swOjRdID0gbWFjaWQgKi8KLS8qIGFyZ1s1XSA9IFNob3J0IEdJICovCi12b2lkIHJ0bDg3MjNhX2FkZF9yYXRlYXRpZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgYml0bWFwLCB1OCBhcmcsIHU4IHJzc2lfbGV2ZWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7Ci0JdTggbWFjaWQgPSBhcmcgJiAweDFmOwotCXUzMiByYWlkID0gYml0bWFwICYgMHhmMDAwMDAwMDsKLQotCWJpdG1hcCAmPSAweDBmZmZmZmZmOwotCWlmIChyc3NpX2xldmVsICE9IERNX1JBVFJfU1RBX0lOSVQpCi0JCWJpdG1hcCA9IE9ETV9HZXRfUmF0ZV9CaXRtYXAyM2EocEhhbERhdGEsIG1hY2lkLCBiaXRtYXAsCi0JCQkJCQlyc3NpX2xldmVsKTsKLQotCWJpdG1hcCB8PSByYWlkOwotCi0JcnRsODcyM2Ffc2V0X3JhaWRfY21kKHBBZGFwdGVyLCBiaXRtYXAsIGFyZyk7Ci19Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X0Z3UHdyTW9kZV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggTW9kZSkKLXsKLQlzdHJ1Y3Qgc2V0cHdybW9kZV9wYXJtIEgyQ1NldFB3ck1vZGU7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQlEQkdfODcyM0EoIiVzOiBNb2RlID0lZCBTbWFydFBTID0lZCBVQVBTRCA9JWQgQmNuTW9kZSA9IDB4JTAyeFxuIiwgX19mdW5jX18sCi0JCQlNb2RlLCBwd3Jwcml2LT5zbWFydF9wcywgcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi51YXBzZF9lbmFibGUsIHB3cnByaXYtPmJjbl9hbnRfbW9kZSk7Ci0KLQkvKiAgRm9yZWNlIGxlYXZlIFJGIGxvdyBwb3dlciBtb2RlIGZvciAxVDFSIHRvCi0JICAgIHByZXZlbnQgY29uZmljdGluZyBzZXR0aW5nIGluIEZ3IHBvd2VyICovCi0JLyogIHNhdmluZyBzZXF1ZW5jZS4gMjAxMC4wNi4wNy4gQWRkZWQgYnkgdHlubGkuCi0JICAgIFN1Z2dlc3RlZCBieSBTRDMgeXNjaGFuZy4gKi8KLQlpZiAoTW9kZSAhPSBQU19NT0RFX0FDVElWRSAmJiBwSGFsRGF0YS0+cmZfdHlwZSAhPSBSRl8yVDJSKQotCQlPRE1fUkZfU2F2aW5nMjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgdHJ1ZSk7Ci0KLQlIMkNTZXRQd3JNb2RlLk1vZGUgPSBNb2RlOwotCUgyQ1NldFB3ck1vZGUuU21hcnRQUyA9IHB3cnByaXYtPnNtYXJ0X3BzOwotCUgyQ1NldFB3ck1vZGUuQXdha2VJbnRlcnZhbCA9IDE7Ci0JSDJDU2V0UHdyTW9kZS5iQWxsUXVldWVVQVBTRCA9IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYudWFwc2RfZW5hYmxlOwotCUgyQ1NldFB3ck1vZGUuQmNuQW50TW9kZSA9IHB3cnByaXYtPmJjbl9hbnRfbW9kZTsKLQotCUZpbGxIMkNDbWQocGFkYXB0ZXIsIFNFVF9QV1JNT0RFX0VJRCwgc2l6ZW9mKEgyQ1NldFB3ck1vZGUpLCAodTggKikmSDJDU2V0UHdyTW9kZSk7Ci0KLX0KLQotc3RhdGljIHZvaWQKLUNvbnN0cnVjdEJlYWNvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGZyYW1lLCB1MzIgKnBMZW5ndGgpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwotCXUzMiByYXRlX2xlbiwgcGt0bGVuOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmN1cl9uZXR3b3JrID0gJnBtbG1laW5mby0+bmV0d29yazsKLQl1OCBiY19hZGRyW10gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci0KLQkvKiBEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7ICovCi0KLQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXBmcmFtZTsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOwotCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmRhLCBiY19hZGRyKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC0+c2EsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQtPmJzc2lkLCBnZXRfbXlfYnNzaWQyM2EoY3VyX25ldHdvcmspKTsKLQotCS8qIEEgQmVhY29uIGZyYW1lIHNob3VsZG4ndCBoYXZlIGZyYWdtZW50IGJpdHMgc2V0ICovCi0JbWdtdC0+c2VxX2N0cmwgPSAwOwotCi0JLyogdGltZXN0YW1wIHdpbGwgYmUgaW5zZXJ0ZWQgYnkgaGFyZHdhcmUgKi8KLQotCXB1dF91bmFsaWduZWRfbGUxNihjdXJfbmV0d29yay0+YmVhY29uX2ludGVydmFsLAotCQkJICAgJm1nbXQtPnUuYmVhY29uLmJlYWNvbl9pbnQpOwotCi0JcHV0X3VuYWxpZ25lZF9sZTE2KGN1cl9uZXR3b3JrLT5jYXBhYmlsaXR5LAotCQkJICAgJm1nbXQtPnUuYmVhY29uLmNhcGFiX2luZm8pOwotCi0JcGZyYW1lID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGU7Ci0JcGt0bGVuID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmJlYWNvbi52YXJpYWJsZSk7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0FQKSB7Ci0JCS8qIERCR184NzIzQSgiaWUgbGVuID0lZFxuIiwgY3VyX25ldHdvcmstPklFTGVuZ3RoKTsgKi8KLQkJcGt0bGVuICs9IGN1cl9uZXR3b3JrLT5JRUxlbmd0aDsKLQkJbWVtY3B5KHBmcmFtZSwgY3VyX25ldHdvcmstPklFcywgcGt0bGVuKTsKLQotCQlnb3RvIF9Db25zdHJ1Y3RCZWFjb247Ci0JfQotCi0JLyogYmVsb3cgZm9yIGFkLWhvYyBtb2RlICovCi0KLQkvKiAgU1NJRCAqLwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TU0lELAotCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWRfbGVuLAotCQkJICAgICAgIGN1cl9uZXR3b3JrLT5Tc2lkLnNzaWQsICZwa3RsZW4pOwotCi0JLyogIHN1cHBvcnRlZCByYXRlcy4uLiAqLwotCXJhdGVfbGVuID0gcnR3X2dldF9yYXRlc2V0X2xlbjIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMpOwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9TVVBQX1JBVEVTLCAoKHJhdGVfbGVuID4gOCkgPwotCQkJICAgICAgIDggOiByYXRlX2xlbiksIGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywgJnBrdGxlbik7Ci0KLQkvKiAgRFMgcGFyYW1ldGVyIHNldCAqLwotCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9EU19QQVJBTVMsIDEsICh1bnNpZ25lZCBjaGFyICopCi0JCQkgICAgICAgJmN1cl9uZXR3b3JrLT5EU0NvbmZpZywgJnBrdGxlbik7Ci0KLQlpZiAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gTVNSX0FESE9DKSB7Ci0JCXUzMiBBVElNV2luZG93OwotCQkvKiAgSUJTUyBQYXJhbWV0ZXIgU2V0Li4uICovCi0JCS8qIEFUSU1XaW5kb3cgPSBjdXItPkFUSU1XaW5kb3c7ICovCi0JCUFUSU1XaW5kb3cgPSAwOwotCQlwZnJhbWUgPSBydHdfc2V0X2llMjNhKHBmcmFtZSwgV0xBTl9FSURfSUJTU19QQVJBTVMsIDIsCi0JCQkJICAgICAgICh1bnNpZ25lZCBjaGFyICopJkFUSU1XaW5kb3csICZwa3RsZW4pOwotCX0KLQotCS8qIHRvZG86IEVSUCBJRSAqLwotCi0JLyogIEVYVEVSTkRFRCBTVVBQT1JURUQgUkFURSAqLwotCWlmIChyYXRlX2xlbiA+IDgpCi0JCXBmcmFtZSA9IHJ0d19zZXRfaWUyM2EocGZyYW1lLCBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUywKLQkJCQkgICAgICAgKHJhdGVfbGVuIC0gOCksCi0JCQkJICAgICAgIChjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMgKyA4KSwKLQkJCQkgICAgICAgJnBrdGxlbik7Ci0KLQkvKiB0b2RvOkhUIGZvciBhZGhvYyAqLwotCi1fQ29uc3RydWN0QmVhY29uOgotCi0JaWYgKChwa3RsZW4gKyBUWERFU0NfU0laRSkgPiA1MTIpIHsKLQkJREJHXzg3MjNBKCJiZWFjb24gZnJhbWUgdG9vIGxhcmdlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCSpwTGVuZ3RoID0gcGt0bGVuOwotCi0JLyogREJHXzg3MjNBKCIlcyBiY25fc3ogPSVkXG4iLCBfX2Z1bmNfXywgcGt0bGVuKTsgKi8KLQotfQotCi1zdGF0aWMgdm9pZCBDb25zdHJ1Y3RQU1BvbGwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICB1OCAqcGZyYW1lLCB1MzIgKnBMZW5ndGgpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKLQotCS8qICBGcmFtZSBjb250cm9sLiAqLwotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sID0KLQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0NUTCB8IElFRUU4MDIxMV9TVFlQRV9QU1BPTEwpOwotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1BNKTsKLQotCS8qICBBSUQuICovCi0JcHdsYW5oZHItPmR1cmF0aW9uX2lkID0gY3B1X3RvX2xlMTYocG1sbWVpbmZvLT5haWQgfCAweGMwMDApOwotCi0JLyogIEJTU0lELiAqLwotCW1lbWNweShwd2xhbmhkci0+YWRkcjEsIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pOwotCi0JLyogIFRBLiAqLwotCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pOwotCi0JKnBMZW5ndGggPSAxNjsKLX0KLQotc3RhdGljIHZvaWQKLUNvbnN0cnVjdE51bGxGdW5jdGlvbkRhdGEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnBmcmFtZSwKLQkJCSAgdTMyICpwTGVuZ3RoLCB1OCAqU3RhQWRkciwgdTggYlFvUywgdTggQUMsCi0JCQkgIHU4IGJFb3NwLCB1OCBiRm9yY2VQb3dlclNhdmUpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwotCXUzMiBwa3RsZW47Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjdXJfbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0KLQlwd2xhbmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXBmcmFtZTsKLQotCXB3bGFuaGRyLT5mcmFtZV9jb250cm9sID0gMDsKLQlwd2xhbmhkci0+c2VxX2N0cmwgPSAwOwotCi0JaWYgKGJGb3JjZVBvd2VyU2F2ZSkKLQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfUE0pOwotCi0Jc3dpdGNoIChjdXJfbmV0d29yay0+bmV0d29yay5pZm1vZGUpIHsKLQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9UT0RTKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwKLQkJICAgICAgIGdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIyLCBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdiksCi0JCSAgICAgICBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIFN0YUFkZHIsIEVUSF9BTEVOKTsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKLQkJcHdsYW5oZHItPmZyYW1lX2NvbnRyb2wgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfRlJPTURTKTsKLQkJbWVtY3B5KHB3bGFuaGRyLT5hZGRyMSwgU3RhQWRkciwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIyLAotCQkgICAgICAgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjMsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwKLQkJICAgICAgIEVUSF9BTEVOKTsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQlkZWZhdWx0OgotCQltZW1jcHkocHdsYW5oZHItPmFkZHIxLCBTdGFBZGRyLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwd2xhbmhkci0+YWRkcjIsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSwgRVRIX0FMRU4pOwotCQltZW1jcHkocHdsYW5oZHItPmFkZHIzLAotCQkgICAgICAgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspLCBFVEhfQUxFTik7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChiUW9TID09IHRydWUpIHsKLQkJc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICpxb3NoZHI7Ci0JCXFvc2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIgKilwZnJhbWU7Ci0KLQkJcW9zaGRyLT5mcmFtZV9jb250cm9sIHw9Ci0JCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8Ci0JCQkJICAgIElFRUU4MDIxMV9TVFlQRV9RT1NfTlVMTEZVTkMpOwotCi0JCXFvc2hkci0+cW9zX2N0cmwgPSBjcHVfdG9fbGUxNihBQyAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLKTsKLQkJaWYgKGJFb3NwKQotCQkJcW9zaGRyLT5xb3NfY3RybCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfUU9TX0NUTF9FT1NQKTsKLQotCQlwa3RsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKTsKLQl9IGVsc2UgewotCQlwd2xhbmhkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfAotCQkJCSAgICBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMpOwotCi0JCXBrdGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JfQotCi0JKnBMZW5ndGggPSBwa3RsZW47Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnN0cnVjdFByb2JlUnNwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwZnJhbWUsCi0JCQkgICAgICB1MzIgKnBMZW5ndGgsIHU4ICpTdGFBZGRyLCBib29sIGJIaWRlU1NJRCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdTggKm1hYywgKmJzc2lkOwotCXUzMiBwa3RsZW47Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqY3VyX25ldHdvcmsgPSAmcG1sbWVpbmZvLT5uZXR3b3JrOwotCi0JLyogREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOyAqLwotCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilwZnJhbWU7Ci0KLQltYWMgPSBteWlkKCZwYWRhcHRlci0+ZWVwcm9tcHJpdik7Ci0JYnNzaWQgPSBjdXJfbmV0d29yay0+TWFjQWRkcmVzczsKLQotCW1nbXQtPmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKTsKLQotCW1nbXQtPnNlcV9jdHJsID0gMDsKLQotCW1lbWNweShtZ210LT5kYSwgU3RhQWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShtZ210LT5zYSwgbWFjLCBFVEhfQUxFTik7Ci0JbWVtY3B5KG1nbXQtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwotCi0JcHV0X3VuYWxpZ25lZF9sZTY0KGN1cl9uZXR3b3JrLT50c2YsCi0JCQkgICAmbWdtdC0+dS5wcm9iZV9yZXNwLnRpbWVzdGFtcCk7Ci0JcHV0X3VuYWxpZ25lZF9sZTE2KGN1cl9uZXR3b3JrLT5iZWFjb25faW50ZXJ2YWwsCi0JCQkgICAmbWdtdC0+dS5wcm9iZV9yZXNwLmJlYWNvbl9pbnQpOwotCXB1dF91bmFsaWduZWRfbGUxNihjdXJfbmV0d29yay0+Y2FwYWJpbGl0eSwKLQkJCSAgICZtZ210LT51LnByb2JlX3Jlc3AuY2FwYWJfaW5mbyk7Ci0KLQlwa3RsZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUucHJvYmVfcmVzcC52YXJpYWJsZSk7Ci0KLQlpZiAoY3VyX25ldHdvcmstPklFTGVuZ3RoID4gTUFYX0lFX1NaKQotCQlyZXR1cm47Ci0KLQltZW1jcHkobWdtdC0+dS5wcm9iZV9yZXNwLnZhcmlhYmxlLCBjdXJfbmV0d29yay0+SUVzLAotCSAgICAgICBjdXJfbmV0d29yay0+SUVMZW5ndGgpOwotCXBrdGxlbiArPSAoY3VyX25ldHdvcmstPklFTGVuZ3RoKTsKLQotCSpwTGVuZ3RoID0gcGt0bGVuOwotfQotCi0vKiAgKi8KLS8qICBEZXNjcmlwdGlvbjogRmlsbCB0aGUgcmVzZXJ2ZWQgcGFja2V0cyB0aGF0IEZXIHdpbGwgdXNlIHRvIFJTVkQgcGFnZS4gKi8KLS8qCQkJTm93IHdlIGp1c3Qgc2VuZCA0IHR5cGVzIHBhY2tldCB0byByc3ZkIHBhZ2UuICovCi0vKgkJCSgxKUJlYWNvbiwgKDIpUHMtcG9sbCwgKDMpTnVsbCBkYXRhLCAoNClQcm9iZVJzcC4gKi8KLS8qCUlucHV0OiAqLwotLyoJICAgIGJETEZpbmlzaGVkIC0gZmFsc2U6IEF0IHRoZSBmaXJzdCB0aW1lIHdlIHdpbGwgc2VuZCBhbGwgdGhlIHBhY2tldHMgYXMgYSBsYXJnZSBwYWNrZXQgdG8gSHcsICovCi0vKgkJCQkJCXNvIHdlIG5lZWQgdG8gc2V0IHRoZSBwYWNrZXQgbGVuZ3RoIHRvIHRvdGFsIGxlbmdoLiAqLwotLyoJCQkgICAgICB0cnVlOiBBdCB0aGUgc2Vjb25kIHRpbWUsIHdlIHNob3VsZCBzZW5kIHRoZSBmaXJzdCBwYWNrZXQgKGRlZmF1bHQ6YmVhY29uKSAqLwotLyoJCQkJCQl0byBIdyBhZ2FpbiBhbmQgc2V0IHRoZSBsZW5naCBpbiBkZXNjcmlwdG9yIHRvIHRoZSByZWFsIGJlYWNvbiBsZW5naC4gKi8KLS8qICAyMDA5LjEwLjE1IGJ5IHR5bmxpLiAqLwotc3RhdGljIHZvaWQgU2V0RndSc3ZkUGFnZVBrdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBib29sIGJETEZpbmlzaGVkKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGE7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWI7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dDsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvOwotCXUzMiBCZWFjb25MZW5ndGggPSAwLCBQcm9iZVJzcExlbmd0aCA9IDAsIFBTUG9sbExlbmd0aDsKLQl1MzIgTnVsbERhdGFMZW5ndGgsIFFvc051bGxMZW5ndGgsIEJUUW9zTnVsbExlbmd0aDsKLQl1OCAqUmVzZXJ2ZWRQYWdlUGFja2V0OwotCXU4IFBhZ2VOdW0sIFBhZ2VOZWVkLCBUeERlc2NMZW47Ci0JdTE2IEJ1ZkluZGV4OwotCXUzMiBUb3RhbFBhY2tldExlbjsKLQlzdHJ1Y3QgcnN2ZHBhZ2VfbG9jCVJzdmRQYWdlTG9jOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JUmVzZXJ2ZWRQYWdlUGFja2V0ID0ga3phbGxvYygxMDAwLCBHRlBfS0VSTkVMKTsKLQlpZiAoUmVzZXJ2ZWRQYWdlUGFja2V0ID09IE5VTEwpIHsKLQkJREJHXzg3MjNBKCIlczogYWxsb2MgUmVzZXJ2ZWRQYWdlUGFja2V0IGZhaWwhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCVR4RGVzY0xlbiA9IFRYREVTQ19TSVpFOwotCVBhZ2VOdW0gPSAwOwotCi0JLyogMyAoMSkgYmVhY29uICovCi0JQnVmSW5kZXggPSBUWERFU0NfT0ZGU0VUOwotCUNvbnN0cnVjdEJlYWNvbihwYWRhcHRlciwgJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleF0sICZCZWFjb25MZW5ndGgpOwotCi0JLyogIFdoZW4gd2UgY291bnQgdGhlIGZpcnN0IHBhZ2Ugc2l6ZSwgd2UgbmVlZCB0byByZXNlcnZlIGRlc2NyaXB0aW9uIHNpemUgZm9yIHRoZSBSU1ZEICovCi0JLyogIHBhY2tldCwgaXQgd2lsbCBiZSBmaWxsZWQgaW4gZnJvbnQgb2YgdGhlIHBhY2tldCBpbiBUWFBLVEJVRi4gKi8KLQlQYWdlTmVlZCA9ICh1OClQYWdlTnVtXzEyOChUeERlc2NMZW4gKyBCZWFjb25MZW5ndGgpOwotCS8qICBUbyByZXNlcnZlZCAyIHBhZ2VzIGZvciBiZWFjb24gYnVmZmVyLiAyMDEwLjA2LjI0LiAqLwotCWlmIChQYWdlTmVlZCA9PSAxKQotCQlQYWdlTmVlZCArPSAxOwotCVBhZ2VOdW0gKz0gUGFnZU5lZWQ7Ci0JcEhhbERhdGEtPkZ3UnN2ZFBhZ2VTdGFydE9mZnNldCA9IFBhZ2VOdW07Ci0KLQlCdWZJbmRleCArPSBQYWdlTmVlZCoxMjg7Ci0KLQkvKiAzICgyKSBwcy1wb2xsICovCi0JUnN2ZFBhZ2VMb2MuTG9jUHNQb2xsID0gUGFnZU51bTsKLQlDb25zdHJ1Y3RQU1BvbGwocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXhdLCAmUFNQb2xsTGVuZ3RoKTsKLQlydGw4NzIzYV9maWxsX2Zha2VfdHhkZXNjKHBhZGFwdGVyLCAmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4LVR4RGVzY0xlbl0sIFBTUG9sbExlbmd0aCwgdHJ1ZSwgZmFsc2UpOwotCi0JUGFnZU5lZWQgPSAodTgpUGFnZU51bV8xMjgoVHhEZXNjTGVuICsgUFNQb2xsTGVuZ3RoKTsKLQlQYWdlTnVtICs9IFBhZ2VOZWVkOwotCi0JQnVmSW5kZXggKz0gUGFnZU5lZWQqMTI4OwotCi0JLyogMyAoMykgbnVsbCBkYXRhICovCi0JUnN2ZFBhZ2VMb2MuTG9jTnVsbERhdGEgPSBQYWdlTnVtOwotCUNvbnN0cnVjdE51bGxGdW5jdGlvbkRhdGEocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXhdLAotCQkJCSAgJk51bGxEYXRhTGVuZ3RoLAotCQkJCSAgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspLAotCQkJCSAgZmFsc2UsIDAsIDAsIGZhbHNlKTsKLQlydGw4NzIzYV9maWxsX2Zha2VfdHhkZXNjKHBhZGFwdGVyLAotCQkJCSAgJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleC1UeERlc2NMZW5dLAotCQkJCSAgTnVsbERhdGFMZW5ndGgsIGZhbHNlLCBmYWxzZSk7Ci0KLQlQYWdlTmVlZCA9ICh1OClQYWdlTnVtXzEyOChUeERlc2NMZW4gKyBOdWxsRGF0YUxlbmd0aCk7Ci0JUGFnZU51bSArPSBQYWdlTmVlZDsKLQotCUJ1ZkluZGV4ICs9IFBhZ2VOZWVkKjEyODsKLQotCS8qIDMgKDQpIHByb2JlIHJlc3BvbnNlICovCi0JUnN2ZFBhZ2VMb2MuTG9jUHJvYmVSc3AgPSBQYWdlTnVtOwotCUNvbnN0cnVjdFByb2JlUnNwKAotCQlwYWRhcHRlciwKLQkJJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleF0sCi0JCSZQcm9iZVJzcExlbmd0aCwKLQkJZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspLAotCQlmYWxzZSk7Ci0JcnRsODcyM2FfZmlsbF9mYWtlX3R4ZGVzYyhwYWRhcHRlciwgJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleC1UeERlc2NMZW5dLCBQcm9iZVJzcExlbmd0aCwgZmFsc2UsIGZhbHNlKTsKLQotCVBhZ2VOZWVkID0gKHU4KVBhZ2VOdW1fMTI4KFR4RGVzY0xlbiArIFByb2JlUnNwTGVuZ3RoKTsKLQlQYWdlTnVtICs9IFBhZ2VOZWVkOwotCi0JQnVmSW5kZXggKz0gUGFnZU5lZWQqMTI4OwotCi0JLyogMyAoNSkgUW9zIG51bGwgZGF0YSAqLwotCVJzdmRQYWdlTG9jLkxvY1Fvc051bGwgPSBQYWdlTnVtOwotCUNvbnN0cnVjdE51bGxGdW5jdGlvbkRhdGEoCi0JCXBhZGFwdGVyLAotCQkmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4XSwKLQkJJlFvc051bGxMZW5ndGgsCi0JCWdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwKLQkJdHJ1ZSwgMCwgMCwgZmFsc2UpOwotCXJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2MocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXgtVHhEZXNjTGVuXSwgUW9zTnVsbExlbmd0aCwgZmFsc2UsIGZhbHNlKTsKLQotCVBhZ2VOZWVkID0gKHU4KVBhZ2VOdW1fMTI4KFR4RGVzY0xlbiArIFFvc051bGxMZW5ndGgpOwotCVBhZ2VOdW0gKz0gUGFnZU5lZWQ7Ci0KLQlCdWZJbmRleCArPSBQYWdlTmVlZCoxMjg7Ci0KLQkvKiAzICg2KSBCVCBRb3MgbnVsbCBkYXRhICovCi0JUnN2ZFBhZ2VMb2MuTG9jQlRRb3NOdWxsID0gUGFnZU51bTsKLQlDb25zdHJ1Y3ROdWxsRnVuY3Rpb25EYXRhKAotCQlwYWRhcHRlciwKLQkJJlJlc2VydmVkUGFnZVBhY2tldFtCdWZJbmRleF0sCi0JCSZCVFFvc051bGxMZW5ndGgsCi0JCWdldF9teV9ic3NpZDIzYSgmcG1sbWVpbmZvLT5uZXR3b3JrKSwKLQkJdHJ1ZSwgMCwgMCwgZmFsc2UpOwotCXJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2MocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXgtVHhEZXNjTGVuXSwgQlRRb3NOdWxsTGVuZ3RoLCBmYWxzZSwgdHJ1ZSk7Ci0KLQlUb3RhbFBhY2tldExlbiA9IEJ1ZkluZGV4ICsgQlRRb3NOdWxsTGVuZ3RoOwotCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmIChwbWdudGZyYW1lID09IE5VTEwpCi0JCWdvdG8gZXhpdDsKLQotCS8qICB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCXBhdHRyaWItPnFzZWwgPSAweDEwOwotCXBhdHRyaWItPnBrdGxlbiA9IHBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IFRvdGFsUGFja2V0TGVuIC0gVFhERVNDX09GRlNFVDsKLQltZW1jcHkocG1nbnRmcmFtZS0+YnVmX2FkZHIsIFJlc2VydmVkUGFnZVBhY2tldCwgVG90YWxQYWNrZXRMZW4pOwotCi0JcnRsODcyM2F1X21nbnRfeG1pdChwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0KLQlEQkdfODcyM0EoIiVzOiBTZXQgUlNWRCBwYWdlIGxvY2F0aW9uIHRvIEZ3XG4iLCBfX2Z1bmNfXyk7Ci0JRmlsbEgyQ0NtZChwYWRhcHRlciwgUlNWRF9QQUdFX0VJRCwgc2l6ZW9mKFJzdmRQYWdlTG9jKSwgKHU4ICopJlJzdmRQYWdlTG9jKTsKLQotZXhpdDoKLQlrZnJlZShSZXNlcnZlZFBhZ2VQYWNrZXQpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9Gd0pvaW5Cc3NSZXBvcnRfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1zdGF0dXMpCi17Ci0Jc3RydWN0IGpvaW5ic3NycHRfcGFybQlKb2luQnNzUnB0UGFybTsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JREJHXzg3MjNBKCIlcyBtc3RhdHVzKCV4KVxuIiwgX19mdW5jX18sIG1zdGF0dXMpOwotCi0JaWYgKG1zdGF0dXMgPT0gMSkgewotCQlib29sIGJSZWNvdmVyID0gZmFsc2U7Ci0JCXU4IHY4OwotCi0JCS8qICBXZSBzaG91bGQgc2V0IEFJRCwgY29ycmVjdCBUU0YsIEhXIHNlcSBlbmFibGUgYmVmb3JlIHNldCBKb2luQnNzUmVwb3J0IHRvIEZ3IGluIDg4LzkyQy4gKi8KLQkJLyogIFN1Z2dlc3RlZCBieSBmaWxlbi4gQWRkZWQgYnkgdHlubGkuICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfQkNOX1BTUl9SUFQsCi0JCQkJICAweEMwMDB8cG1sbWVpbmZvLT5haWQpOwotCQkvKiAgRG8gbm90IHNldCBUU0YgYWdhaW4gaGVyZSBvciB2V2lGaSBiZWFjb24gRE1BIElOVCB3aWxsIG5vdCB3b3JrLiAqLwotCQkvKiBjb3JyZWN0X1RTRjIzYShwYWRhcHRlciwgcG1sbWVleHQpOyAqLwotCQkvKiAgSHcgc2VxdWVuZGUgZW5hYmxlIGJ5IGRlZGF1bHQuIDIwMTAuMDYuMjMuIGJ5IHR5bmxpLiAqLwotCQkvKiBydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX05RT1NfU0VRLCAoKHBtbG1lZXh0LT5tZ250X3NlcSsxMDApJjB4RkZGKSk7ICovCi0JCS8qIHJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19IV1NFUV9DVFJMLCAweEZGKTsgKi8KLQotCQkvKiAgc2V0IFJFR19DUiBiaXQgOCAqLwotCQl2OCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0NSKzEpOwotCQl2OCB8PSBCSVQoMCk7IC8qICBFTlNXQkNOICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsICBSRUdfQ1IrMSwgdjgpOwotCi0JCS8qICBEaXNhYmxlIEh3IHByb3RlY3Rpb24gZm9yIGEgdGltZSB3aGljaCByZXZzZXJkIGZvciBIdyBzZW5kaW5nIGJlYWNvbi4gKi8KLQkJLyogIEZpeCBkb3dubG9hZCByZXNlcnZlZCBwYWdlIHBhY2tldCBmYWlsIHRoYXQgYWNjZXNzIGNvbGxpc2lvbiB3aXRoIHRoZSBwcm90ZWN0aW9uIHRpbWUuICovCi0JCS8qICAyMDEwLjA1LjExLiBBZGRlZCBieSB0eW5saS4gKi8KLS8qCQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgMCwgQklUKDMpKTsgKi8KLS8qCQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgQklUKDQpLCAwKTsgKi8KLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgQklUKDQpLCBCSVQoMykpOwotCi0JCS8qICBTZXQgRldIV19UWFFfQ1RSTCAweDQyMls2XT0gMCB0byB0ZWxsIEh3IHRoZSBwYWNrZXQgaXMgbm90IGEgcmVhbCBiZWFjb24gZnJhbWUuICovCi0JCWlmIChwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgJiBCSVQoNikpCi0JCQliUmVjb3ZlciA9IHRydWU7Ci0KLQkJLyogIFRvIHRlbGwgSHcgdGhlIHBhY2tldCBpcyBub3QgYSByZWFsIGJlYWNvbiBmcmFtZS4gKi8KLQkJLyogVTFiVG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfRldIV19UWFFfQ1RSTCsyKTsgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAotCQkJCSBwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgJiB+QklUKDYpKTsKLQkJcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsICY9IH5CSVQoNik7Ci0JCVNldEZ3UnN2ZFBhZ2VQa3QocGFkYXB0ZXIsIDApOwotCi0JCS8qICAyMDEwLjA1LjExLiBBZGRlZCBieSB0eW5saS4gKi8KLQkJU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgQklUKDMpLCBCSVQoNCkpOwotCi0JCS8qICBUbyBtYWtlIHN1cmUgdGhhdCBpZiB0aGVyZSBleGlzdHMgYW4gYWRhcHRlciB3aGljaCB3b3VsZCBsaWtlIHRvIHNlbmQgYmVhY29uLiAqLwotCQkvKiAgSWYgZXhpc3RzLCB0aGUgb3JpZ2lhbmwgdmFsdWUgb2YgMHg0MjJbNl0gd2lsbCBiZSAxLCB3ZSBzaG91bGQgY2hlY2sgdGhpcyB0byAqLwotCQkvKiAgcHJldmVudCBmcm9tIHNldHRpbmcgMHg0MjJbNl0gdG8gMCBhZnRlciBkb3dubG9hZCByZXNlcnZlZCBwYWdlLCBvciBpdCB3aWxsIGNhdXNlICovCi0JCS8qICB0aGUgYmVhY29uIGNhbm5vdCBiZSBzZW50IGJ5IEhXLiAqLwotCQkvKiAgMjAxMC4wNi4yMy4gQWRkZWQgYnkgdHlubGkuICovCi0JCWlmIChiUmVjb3ZlcikgewotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAotCQkJCQkgcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsIHwgQklUKDYpKTsKLQkJCXBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCB8PSBCSVQoNik7Ci0JCX0KLQotCQkvKiAgQ2xlYXIgQ1JbOF0gb3IgYmVhY29uIHBhY2tldCB3aWxsIG5vdCBiZSBzZW5kIHRvIFR4QnVmIGFueW1vcmUuICovCi0JCXY4ID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfQ1IrMSk7Ci0JCXY4ICY9IH5CSVQoMCk7IC8qICB+RU5TV0JDTiAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfQ1IrMSwgdjgpOwotCX0KLQotCUpvaW5Cc3NScHRQYXJtLk9wTW9kZSA9IG1zdGF0dXM7Ci0KLQlGaWxsSDJDQ21kKHBhZGFwdGVyLCBKT0lOQlNTX1JQVF9FSUQsIHNpemVvZihKb2luQnNzUnB0UGFybSksICh1OCAqKSZKb2luQnNzUnB0UGFybSk7Ci0KLX0KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQlRfQ09FWElTVAotc3RhdGljIHZvaWQgU2V0RndSc3ZkUGFnZVBrdF9CVENvZXgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQ7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbzsKLQl1OCBmYWtlbWFjWzZdID0gezB4MDAsIDB4ZTAsIDB4NGMsIDB4MDAsIDB4MDAsIDB4MDB9OwotCXUzMiBOdWxsRGF0YUxlbmd0aCwgQlRRb3NOdWxsTGVuZ3RoOwotCXU4ICpSZXNlcnZlZFBhZ2VQYWNrZXQ7Ci0JdTggUGFnZU51bSwgUGFnZU5lZWQsIFR4RGVzY0xlbjsKLQl1MTYgQnVmSW5kZXg7Ci0JdTMyIFRvdGFsUGFja2V0TGVuOwotCXN0cnVjdCByc3ZkcGFnZV9sb2MJUnN2ZFBhZ2VMb2M7Ci0KLQlEQkdfODcyM0EoIislc1xuIiwgX19mdW5jX18pOwotCi0JUmVzZXJ2ZWRQYWdlUGFja2V0ID0ga3phbGxvYygxMDI0LCBHRlBfS0VSTkVMKTsKLQlpZiAoUmVzZXJ2ZWRQYWdlUGFja2V0ID09IE5VTEwpIHsKLQkJREJHXzg3MjNBKCIlczogYWxsb2MgUmVzZXJ2ZWRQYWdlUGFja2V0IGZhaWwhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0JcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCVR4RGVzY0xlbiA9IFRYREVTQ19TSVpFOwotCVBhZ2VOdW0gPSAwOwotCi0JLyogMyAoMSkgYmVhY29uICovCi0JQnVmSW5kZXggPSBUWERFU0NfT0ZGU0VUOwotCS8qICBza2lwIEJlYWNvbiBQYWNrZXQgKi8KLQlQYWdlTmVlZCA9IDM7Ci0KLQlQYWdlTnVtICs9IFBhZ2VOZWVkOwotCXBIYWxEYXRhLT5Gd1JzdmRQYWdlU3RhcnRPZmZzZXQgPSBQYWdlTnVtOwotCi0JQnVmSW5kZXggKz0gUGFnZU5lZWQqMTI4OwotCi0JLyogMyAoMykgbnVsbCBkYXRhICovCi0JUnN2ZFBhZ2VMb2MuTG9jTnVsbERhdGEgPSBQYWdlTnVtOwotCUNvbnN0cnVjdE51bGxGdW5jdGlvbkRhdGEoCi0JCXBhZGFwdGVyLAotCQkmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4XSwKLQkJJk51bGxEYXRhTGVuZ3RoLAotCQlmYWtlbWFjLAotCQlmYWxzZSwgMCwgMCwgZmFsc2UpOwotCXJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2MocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXgtVHhEZXNjTGVuXSwgTnVsbERhdGFMZW5ndGgsIGZhbHNlLCBmYWxzZSk7Ci0KLQlQYWdlTmVlZCA9ICh1OClQYWdlTnVtXzEyOChUeERlc2NMZW4gKyBOdWxsRGF0YUxlbmd0aCk7Ci0JUGFnZU51bSArPSBQYWdlTmVlZDsKLQotCUJ1ZkluZGV4ICs9IFBhZ2VOZWVkKjEyODsKLQotCS8qIDMgKDYpIEJUIFFvcyBudWxsIGRhdGEgKi8KLQlSc3ZkUGFnZUxvYy5Mb2NCVFFvc051bGwgPSBQYWdlTnVtOwotCUNvbnN0cnVjdE51bGxGdW5jdGlvbkRhdGEoCi0JCXBhZGFwdGVyLAotCQkmUmVzZXJ2ZWRQYWdlUGFja2V0W0J1ZkluZGV4XSwKLQkJJkJUUW9zTnVsbExlbmd0aCwKLQkJZmFrZW1hYywKLQkJdHJ1ZSwgMCwgMCwgZmFsc2UpOwotCXJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2MocGFkYXB0ZXIsICZSZXNlcnZlZFBhZ2VQYWNrZXRbQnVmSW5kZXgtVHhEZXNjTGVuXSwgQlRRb3NOdWxsTGVuZ3RoLCBmYWxzZSwgdHJ1ZSk7Ci0KLQlUb3RhbFBhY2tldExlbiA9IEJ1ZkluZGV4ICsgQlRRb3NOdWxsTGVuZ3RoOwotCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmIChwbWdudGZyYW1lID09IE5VTEwpCi0JCWdvdG8gZXhpdDsKLQotCS8qICB1cGRhdGUgYXR0cmlidXRlICovCi0JcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2EocGFkYXB0ZXIsIHBhdHRyaWIpOwotCXBhdHRyaWItPnFzZWwgPSAweDEwOwotCXBhdHRyaWItPnBrdGxlbiA9IHBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IFRvdGFsUGFja2V0TGVuIC0gVFhERVNDX09GRlNFVDsKLQltZW1jcHkocG1nbnRmcmFtZS0+YnVmX2FkZHIsIFJlc2VydmVkUGFnZVBhY2tldCwgVG90YWxQYWNrZXRMZW4pOwotCi0JcnRsODcyM2F1X21nbnRfeG1pdChwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0KLQlEQkdfODcyM0EoIiVzOiBTZXQgUlNWRCBwYWdlIGxvY2F0aW9uIHRvIEZ3XG4iLCBfX2Z1bmNfXyk7Ci0JRmlsbEgyQ0NtZChwYWRhcHRlciwgUlNWRF9QQUdFX0VJRCwgc2l6ZW9mKFJzdmRQYWdlTG9jKSwgKHU4ICopJlJzdmRQYWdlTG9jKTsKLQotZXhpdDoKLQlrZnJlZShSZXNlcnZlZFBhZ2VQYWNrZXQpOwotfQotCi12b2lkIHJ0bDg3MjNhX3NldF9CVENvZXhfQVBfbW9kZV9Gd1JzdmRQa3RfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQl1OCBiUmVjb3ZlciA9IGZhbHNlOwotCi0JREJHXzg3MjNBKCIrJXNcbiIsIF9fZnVuY19fKTsKLQotCXBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICBTZXQgRldIV19UWFFfQ1RSTCAweDQyMls2XT0gMCB0byB0ZWxsIEh3IHRoZSBwYWNrZXQgaXMgbm90IGEgcmVhbCBiZWFjb24gZnJhbWUuICovCi0JaWYgKHBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCAmIEJJVCg2KSkKLQkJYlJlY292ZXIgPSB0cnVlOwotCi0JLyogIFRvIHRlbGwgSHcgdGhlIHBhY2tldCBpcyBub3QgYSByZWFsIGJlYWNvbiBmcmFtZS4gKi8KLQlwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgJj0gfkJJVCg2KTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRldIV19UWFFfQ1RSTCArIDIsCi0JCQkgcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsKTsKLQlTZXRGd1JzdmRQYWdlUGt0X0JUQ29leChwYWRhcHRlcik7Ci0KLQkvKiAgVG8gbWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUgZXhpc3RzIGFuIGFkYXB0ZXIgd2hpY2ggd291bGQgbGlrZSB0byBzZW5kIGJlYWNvbi4gKi8KLQkvKiAgSWYgZXhpc3RzLCB0aGUgb3JpZ2lhbmwgdmFsdWUgb2YgMHg0MjJbNl0gd2lsbCBiZSAxLCB3ZSBzaG91bGQgY2hlY2sgdGhpcyB0byAqLwotCS8qICBwcmV2ZW50IGZyb20gc2V0dGluZyAweDQyMls2XSB0byAwIGFmdGVyIGRvd25sb2FkIHJlc2VydmVkIHBhZ2UsIG9yIGl0IHdpbGwgY2F1c2UgKi8KLQkvKiAgdGhlIGJlYWNvbiBjYW5ub3QgYmUgc2VudCBieSBIVy4gKi8KLQkvKiAgMjAxMC4wNi4yMy4gQWRkZWQgYnkgdHlubGkuICovCi0JaWYgKGJSZWNvdmVyKSB7Ci0JCXBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCB8PSBCSVQoNik7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMICsgMiwKLQkJCQkgcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsKTsKLQl9Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9kbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTgzMWYyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2RtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgKi8KLS8qICBEZXNjcmlwdGlvbjogKi8KLS8qICAqLwotLyogIFRoaXMgZmlsZSBpcyBmb3IgOTJDRS85MkNVIGR5bmFtaWMgbWVjaGFuaXNtIG9ubHkgKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgX1JUTDg3MjNBX0RNX0NfCi0KLS8qICAqLwotLyogIGluY2x1ZGUgZmlsZXMgKi8KLS8qICAqLwotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotLyogICovCi0vKiAgR2xvYmFsIHZhciAqLwotLyogICovCi0KLXN0YXRpYyB2b2lkIGRtX0NoZWNrUGJjR1BJTyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4CXRtcDFieXRlOwotCXU4CWJQYmNQcmVzc2VkID0gZmFsc2U7Ci0KLQlpZiAoIXBhZGFwdGVyLT5yZWdpc3RyeXByaXYuaHdfd3BzX3BiYykKLQkJcmV0dXJuOwotCi0JdG1wMWJ5dGUgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIEdQSU9fSU9fU0VMKTsKLQl0bXAxYnl0ZSB8PSAoSEFMXzgxOTJDX0hXX0dQSU9fV1BTX0JJVCk7Ci0JLyogZW5hYmxlIEdQSU9bMl0gYXMgb3V0cHV0IG1vZGUgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBHUElPX0lPX1NFTCwgdG1wMWJ5dGUpOwotCi0JdG1wMWJ5dGUgJj0gfihIQUxfODE5MkNfSFdfR1BJT19XUFNfQklUKTsKLQkvKiByZXNldCB0aGUgZmxvYXRpbmcgdm9sdGFnZSBsZXZlbCAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsICBHUElPX0lOLCB0bXAxYnl0ZSk7Ci0KLQl0bXAxYnl0ZSA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgR1BJT19JT19TRUwpOwotCXRtcDFieXRlICY9IH4oSEFMXzgxOTJDX0hXX0dQSU9fV1BTX0JJVCk7Ci0JLyogZW5hYmxlIEdQSU9bMl0gYXMgaW5wdXQgbW9kZSAqLwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIEdQSU9fSU9fU0VMLCB0bXAxYnl0ZSk7Ci0KLQl0bXAxYnl0ZSA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgR1BJT19JTik7Ci0KLQlpZiAodG1wMWJ5dGUgPT0gMHhmZikKLQkJcmV0dXJuOwotCi0JaWYgKHRtcDFieXRlJkhBTF84MTkyQ19IV19HUElPX1dQU19CSVQpCi0JCWJQYmNQcmVzc2VkID0gdHJ1ZTsKLQotCWlmIChiUGJjUHJlc3NlZCkgewotCQkvKiAgSGVyZSB3ZSBvbmx5IHNldCBiUGJjUHJlc3NlZCB0byB0cnVlICovCi0JCS8qICBBZnRlciB0cmlnZ2VyIFBCQywgdGhlIHZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvIGZhbHNlICovCi0JCURCR184NzIzQSgiQ2hlY2tQYmNHUElPIC0gUEJDIGlzIHByZXNzZWRcbiIpOwotCi0JCWlmIChwYWRhcHRlci0+cGlkWzBdID09IDApIHsKLQkJCS8qIDAgaXMgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIGl0IG1lYW5zIHRoZSBhcHBsaWNhdGlvbgotCQkJICogbW9uaXRvcnMgdGhlIEhXIFBCQyBkb2Vzbid0IHByaXZkZSBpdHMgcGlkIHRvIGRyaXZlci4KLQkJCSAqLwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJa2lsbF9waWQoZmluZF92cGlkKHBhZGFwdGVyLT5waWRbMF0pLCBTSUdVU1IxLCAxKTsKLQl9Ci19Ci0KLS8qICBJbml0aWFsaXplIEdQSU8gc2V0dGluZyByZWdpc3RlcnMgKi8KLS8qICBmdW5jdGlvbnMgKi8KLQotdm9pZCBydGw4NzIzYV9pbml0X2RtX3ByaXYoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0JdTggY3V0X3ZlciwgZmFiX3ZlcjsKLQotCW1lbXNldChwZG1wcml2LCAwLCBzaXplb2Yoc3RydWN0IGRtX3ByaXYpKTsKLQltZW1zZXQocERNX09kbSwgMCwgc2l6ZW9mKCpwRE1fT2RtKSk7Ci0KLQlwRE1fT2RtLT5BZGFwdGVyID0gQWRhcHRlcjsKLQotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19JQ19UWVBFLCBPRE1fUlRMODcyM0EpOwotCi0JaWYgKElTXzg3MjNBX0FfQ1VUKHBIYWxEYXRhLT5WZXJzaW9uSUQpKSB7Ci0JCWZhYl92ZXIgPSBPRE1fVU1DOwotCQljdXRfdmVyID0gT0RNX0NVVF9BOwotCX0gZWxzZSBpZiAoSVNfODcyM0FfQl9DVVQocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKLQkJZmFiX3ZlciA9IE9ETV9VTUM7Ci0JCWN1dF92ZXIgPSBPRE1fQ1VUX0I7Ci0JfSBlbHNlIHsKLQkJZmFiX3ZlciA9IE9ETV9UU01DOwotCQljdXRfdmVyID0gT0RNX0NVVF9BOwotCX0KLQlPRE1fQ21uSW5mb0luaXQyM2EocERNX09kbSwgT0RNX0NNTklORk9fRkFCX1ZFUiwgZmFiX3Zlcik7Ci0JT0RNX0NtbkluZm9Jbml0MjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX0NVVF9WRVIsIGN1dF92ZXIpOwotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19NUF9URVNUX0NISVAsIElTX05PUk1BTF9DSElQKHBIYWxEYXRhLT5WZXJzaW9uSUQpKTsKLQotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19CT0FSRF9UWVBFLCBwSGFsRGF0YS0+Qm9hcmRUeXBlKTsKLQotCWlmIChwSGFsRGF0YS0+Qm9hcmRUeXBlID09IEJPQVJEX1VTQl9IaWdoX1BBKSB7Ci0JCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19FWFRfTE5BLCB0cnVlKTsKLQkJT0RNX0NtbkluZm9Jbml0MjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX0VYVF9QQSwgdHJ1ZSk7Ci0JfQotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19CV0lGSV9URVNULCBBZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjKTsKLX0KLQotc3RhdGljIHZvaWQgVXBkYXRlX09ETV9Db21JbmZvXzg3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCWludCBpOwotCXBkbXByaXYtPkluaXRPRE1GbGFnID0gMDsKLQkvKiAgUG9pbnRlciByZWZlcmVuY2UgKi8KLQlydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X3NldChBZGFwdGVyLCBEWU5BTUlDX0FMTF9GVU5DX0VOQUJMRSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1NUQTsgaSsrKQotCQlPRE1fQ21uSW5mb1B0ckFycmF5SG9vazIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19TVEFfU1RBVFVTLCBpLCBOVUxMKTsKLX0KLQotdm9pZCBydGw4NzIzYV9Jbml0SGFsRG0oc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0gPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0JdTgJaTsKLQotCVVwZGF0ZV9PRE1fQ29tSW5mb184NzIzYShBZGFwdGVyKTsKLQlPRE0yM2FfRE1Jbml0KHBETV9PZG0pOwotCS8qICBTYXZlIFJFR19JTklEQVRBX1JBVEVfU0VMIHZhbHVlIGZvciBUWERFU0MuICovCi0JZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCi0JCXBkbXByaXYtPklOSURBVEFfUkFURVtpXSA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfSU5JREFUQV9SQVRFX1NFTCtpKSAmIDB4M2Y7Ci19Ci0KLXZvaWQKLXJ0bDg3MjNhX0hhbERtV2F0Y2hEb2coCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyCi0JKQotewotCWJvb2wJCWJGd0N1cnJlbnRJblBTTW9kZSA9IGZhbHNlOwotCWJvb2wJCWJGd1BTQXdha2UgPSB0cnVlOwotCXU4IGJMaW5rZWQgPSBmYWxzZTsKLQl1OCBod19pbml0X2NvbXBsZXRlZCA9IGZhbHNlOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYJKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQotCWh3X2luaXRfY29tcGxldGVkID0gQWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQ7Ci0KLQlpZiAoaHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UpCi0JCWdvdG8gc2tpcF9kbTsKLQotCWJGd0N1cnJlbnRJblBTTW9kZSA9IEFkYXB0ZXItPnB3cmN0cmxwcml2LmJGd0N1cnJlbnRJblBTTW9kZTsKLQliRndQU0F3YWtlID0gcnRsODcyM2FfZ2V0X2Z3bHBzX3JmX29uKEFkYXB0ZXIpOwotCi0JaWYgKCFiRndDdXJyZW50SW5QU01vZGUgJiYgYkZ3UFNBd2FrZSkgewotCQkvKiAgUmVhZCBSRUdfSU5JREFUQV9SQVRFX1NFTCB2YWx1ZSBmb3IgVFhERVNDLiAqLwotCQlpZiAoY2hlY2tfZndzdGF0ZSgmQWRhcHRlci0+bWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkpIHsKLQkJCXBkbXByaXYtPklOSURBVEFfUkFURVswXSA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfSU5JREFUQV9SQVRFX1NFTCkgJiAweDNmOwotCQl9IGVsc2UgewotCQkJdTgJaTsKLQkJCWZvciAoaSA9IDEgOyBpIDwgKEFkYXB0ZXItPnN0YXByaXYuYXNvY19zdGFfY291bnQgKyAxKTsgaSsrKQotCQkJCXBkbXByaXYtPklOSURBVEFfUkFURVtpXSA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCAoUkVHX0lOSURBVEFfUkFURV9TRUwraSkpICYgMHgzZjsKLQkJfQotCX0KLQotCS8qIE9ETSAqLwotCWlmIChydHdfbGlua2VkX2NoZWNrKEFkYXB0ZXIpKQotCQliTGlua2VkID0gdHJ1ZTsKLQotCU9ETV9DbW5JbmZvVXBkYXRlMjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgT0RNX0NNTklORk9fTElOSywgYkxpbmtlZCk7Ci0JT0RNX0RNV2F0Y2hkb2cyM2EoQWRhcHRlcik7Ci0KLXNraXBfZG06Ci0KLQkvKiAgQ2hlY2sgR1BJTyB0byBkZXRlcm1pbmUgY3VycmVudCBSRiBvbi9vZmYgYW5kIFBiYyBzdGF0dXMuICovCi0JLyogIENoZWNrIEhhcmR3YXJlIFJhZGlvIE9OL09GRiBvciBub3QgKi8KLQlkbV9DaGVja1BiY0dQSU8oQWRhcHRlcik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9oYWxfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfaGFsX2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhMGFmNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9oYWxfaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX0hBTF9JTklUX0NfCi0KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJ0d19lZnVzZS5oPgotCi0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0jaW5jbHVkZSA8dXNiX29wc19saW51eC5oPgotCi1zdGF0aWMgdm9pZCBfRldEb3dubG9hZEVuYWJsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBib29sIGVuYWJsZSkKLXsKLQl1OCB0bXA7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCS8qICA4MDUxIGVuYWJsZSAqLwotCQl0bXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiArIDEpOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4gKyAxLCB0bXAgfCAweDA0KTsKLQotCQkvKiAgTUNVIGZpcm13YXJlIGRvd25sb2FkIGVuYWJsZS4gKi8KLQkJdG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfTUNVRldETCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMLCB0bXAgfCAweDAxKTsKLQotCQkvKiAgODA1MSByZXNldCAqLwotCQl0bXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMICsgMik7Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMICsgMiwgdG1wICYgMHhmNyk7Ci0JfSBlbHNlIHsKLQkJLyogIE1DVSBmaXJtd2FyZSBkb3dubG9hZCBkaXNhYmxlLiAqLwotCQl0bXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX01DVUZXREwsIHRtcCAmIDB4ZmUpOwotCi0JCS8qICBSZXNlcnZlZCBmb3IgZncgZXh0ZW5zaW9uLiAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTUNVRldETCArIDEsIDB4MDApOwotCX0KLX0KLQotc3RhdGljIGludAotX1BhZ2VXcml0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgcGFnZSwgdm9pZCAqYnVmZmVyLCB1MzIgc2l6ZSkKLXsKLQl1OCB2YWx1ZTg7Ci0JdTggdThQYWdlID0gKHU4KSAocGFnZSAmIDB4MDcpOwotCi0JaWYgKHNpemUgPiBNQVhfUEFHRV9TSVpFKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQl2YWx1ZTggPSAocnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfTUNVRldETCArIDIpICYgMHhGOCkgfCB1OFBhZ2U7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX01DVUZXREwgKyAyLCB2YWx1ZTgpOwotCi0JcmV0dXJuIHJ0bDg3MjNhdV93cml0ZU4ocGFkYXB0ZXIsIEZXXzg3MjNBX1NUQVJUX0FERFJFU1MsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLXN0YXRpYyBpbnQgX1dyaXRlRlcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdm9pZCAqYnVmZmVyLCB1MzIgc2l6ZSkKLXsKLQkvKiAgU2luY2Ugd2UgbmVlZCBkeW5hbWljIGRlY2lkZSBtZXRob2Qgb2YgZHdvbmxvYWQgZncsIHNvIHdlCi0JICAgIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBnZXQgY2hpcCB2ZXJzaW9uLiAqLwotCS8qICBXZSBjYW4gcmVtb3ZlIF9SZWFkQ2hpcFZlcnNpb24gZnJvbSBSZWFkcGFkYXB0ZXJJbmZvODE5MkMgbGF0ZXIuICovCi0JaW50IHJldCA9IF9TVUNDRVNTOwotCXUzMiBwYWdlTnVtcywgcmVtYWluU2l6ZTsKLQl1MzIgcGFnZSwgb2Zmc2V0OwotCXU4ICpidWZmZXJQdHIgPSAodTggKikgYnVmZmVyOwotCi0JcGFnZU51bXMgPSBzaXplIC8gTUFYX1BBR0VfU0laRTsKLQkvKiBSVF9BU1NFUlQoKHBhZ2VOdW1zIDw9IDQpLAotCSAgICgiUGFnZSBudW1iZXJzIHNob3VsZCBub3QgZ3JlYXRlciB0aGVuIDQgXG4iKSk7ICovCi0JcmVtYWluU2l6ZSA9IHNpemUgJSBNQVhfUEFHRV9TSVpFOwotCi0JZm9yIChwYWdlID0gMDsgcGFnZSA8IHBhZ2VOdW1zOyBwYWdlKyspIHsKLQkJb2Zmc2V0ID0gcGFnZSAqIE1BWF9QQUdFX1NJWkU7Ci0JCXJldCA9IF9QYWdlV3JpdGUocGFkYXB0ZXIsIHBhZ2UsIGJ1ZmZlclB0ciArIG9mZnNldCwKLQkJCQkgTUFYX1BBR0VfU0laRSk7Ci0KLQkJaWYgKHJldCA9PSBfRkFJTCkKLQkJCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKHJlbWFpblNpemUpIHsKLQkJb2Zmc2V0ID0gcGFnZU51bXMgKiBNQVhfUEFHRV9TSVpFOwotCQlwYWdlID0gcGFnZU51bXM7Ci0JCXJldCA9IF9QYWdlV3JpdGUocGFkYXB0ZXIsIHBhZ2UsIGJ1ZmZlclB0ciArIG9mZnNldCwKLQkJCQkgcmVtYWluU2l6ZSk7Ci0KLQkJaWYgKHJldCA9PSBfRkFJTCkKLQkJCWdvdG8gZXhpdDsKLQl9Ci0JUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICJfV3JpdGVGVyBEb25lLSBmb3IgTm9ybWFsIGNoaXAuXG4iKTsKLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9GV0ZyZWVUb0dvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIGNvdW50ZXIgPSAwOwotCXUzMiB2YWx1ZTMyOwotCi0JLyogIHBvbGxpbmcgQ2hlY2tTdW0gcmVwb3J0ICovCi0JZG8gewotCQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX01DVUZXREwpOwotCQlpZiAodmFsdWUzMiAmIEZXRExfQ2hrU3VtX3JwdCkKLQkJCWJyZWFrOwotCX0gd2hpbGUgKGNvdW50ZXIrKyA8IFBPTExJTkdfUkVBRFlfVElNRU9VVF9DT1VOVCk7Ci0KLQlpZiAoY291bnRlciA+PSBQT0xMSU5HX1JFQURZX1RJTUVPVVRfQ09VTlQpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogY2hrc3VtIHJlcG9ydCBmYWlsISBSRUdfTUNVRldETDoweCUwOHhcbiIsCi0JCQkgX19mdW5jX18sIHZhbHVlMzIpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6IENoZWNrc3VtIHJlcG9ydCBPSyEgUkVHX01DVUZXREw6MHglMDh4XG4iLCBfX2Z1bmNfXywKLQkJIHZhbHVlMzIpOwotCi0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19NQ1VGV0RMKTsKLQl2YWx1ZTMyIHw9IE1DVUZXRExfUkRZOwotCXZhbHVlMzIgJj0gfldJTlRJTklfUkRZOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfTUNVRldETCwgdmFsdWUzMik7Ci0KLQkvKiAgcG9sbGluZyBmb3IgRlcgcmVhZHkgKi8KLQljb3VudGVyID0gMDsKLQlkbyB7Ci0JCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfTUNVRldETCk7Ci0JCWlmICh2YWx1ZTMyICYgV0lOVElOSV9SRFkpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICIlczogUG9sbGluZyBGVyByZWFkeSBzdWNjZXNzISEgUkVHX01DVUZXREw6MHglMDh4XG4iLAotCQkJCSBfX2Z1bmNfXywgdmFsdWUzMik7Ci0JCQlyZXR1cm4gX1NVQ0NFU1M7Ci0JCX0KLQkJdWRlbGF5KDUpOwotCX0gd2hpbGUgKGNvdW50ZXIrKyA8IFBPTExJTkdfUkVBRFlfVElNRU9VVF9DT1VOVCk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCSAiJXM6IFBvbGxpbmcgRlcgcmVhZHkgZmFpbCEhIFJFR19NQ1VGV0RMOjB4JTA4eFxuIiwKLQkJIF9fZnVuY19fLCB2YWx1ZTMyKTsKLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLSNkZWZpbmUgSVNfRldfODF4eEMocGFkYXB0ZXIpCSgoKEdFVF9IQUxfREFUQShwYWRhcHRlcikpLT5GaXJtd2FyZVNpZ25hdHVyZSAmIDB4RkZGMCkgPT0gMHg4OEMwKQotCi12b2lkIHJ0bDg3MjNhX0Zpcm13YXJlU2VsZlJlc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JdTggdTFiVG1wOwotCXU4IERlbGF5ID0gMTAwOwotCi0JaWYgKCEoSVNfRldfODF4eEMocGFkYXB0ZXIpICYmCi0JICAgICAgKChwSGFsRGF0YS0+RmlybXdhcmVWZXJzaW9uIDwgMHgyMSkgfHwKLQkgICAgICAgKHBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24gPT0gMHgyMSAmJgotCQlwSGFsRGF0YS0+RmlybXdhcmVTdWJWZXJzaW9uIDwgMHgwMSkpKSkgewotCQkvKiAgYWZ0ZXIgODhDIEZ3IHYzMy4xICovCi0JCS8qIDB4MWNmID0gMHgyMC4gSW5mb3JtIDgwNTEgdG8gcmVzZXQuIDIwMDkuMTIuMjUuIHR5bmxpX3Rlc3QgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0hNRVRGUiArIDMsIDB4MjApOwotCi0JCXUxYlRtcCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOICsgMSk7Ci0JCXdoaWxlICh1MWJUbXAgJiBCSVQoMikpIHsKLQkJCURlbGF5LS07Ci0JCQlpZiAoRGVsYXkgPT0gMCkKLQkJCQlicmVhazsKLQkJCXVkZWxheSg1MCk7Ci0JCQl1MWJUbXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiArIDEpOwotCQl9Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIi0lczogODA1MSByZXNldCBzdWNjZXNzICglZClcbiIsIF9fZnVuY19fLAotCQkJIERlbGF5KTsKLQotCQlpZiAoKERlbGF5ID09IDApKSB7Ci0JCQkvKiBmb3JjZSBmaXJtd2FyZSByZXNldCAqLwotCQkJdTFiVG1wID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4gKyAxKTsKLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiArIDEsCi0JCQkJCSB1MWJUbXAgJiB+QklUKDIpKTsKLQkJfQotCX0KLX0KLQotLyogICovCi0vKglEZXNjcmlwdGlvbjogKi8KLS8qCQlEb3dubG9hZCA4MTkyQyBmaXJtd2FyZSBjb2RlLiAqLwotLyogICovCi0vKiAgKi8KLWludCBydGw4NzIzYV9GaXJtd2FyZURvd25sb2FkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IHJ0U3RhdHVzID0gX1NVQ0NFU1M7Ci0JdTggd3JpdGVGV19yZXRyeSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmd2RsX3N0YXJ0X3RpbWU7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IGRldmljZSAqZGV2aWNlID0gZHZvYmpfdG9fZGV2KGR2b2JqKTsKLQlzdHJ1Y3QgcnRfODcyM2FfZmlybXdhcmVfaGRyICpwRndIZHIgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7Ci0JY2hhciAqZndfbmFtZTsKLQl1OCAqZmlybXdhcmVfYnVmID0gTlVMTDsKLQl1OCAqYnVmOwotCWludCBmd19zaXplOwotCXN0YXRpYyBpbnQgbG9nX3ZlcnNpb247Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAiKyVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoSVNfODcyM0FfQV9DVVQocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKLQkJZndfbmFtZSA9ICJydGx3aWZpL3J0bDg3MjNhdWZ3X0EuYmluIjsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAicnRsODcyM2FfRmlybXdhcmVEb3dubG9hZDogUjg3MjNGd0ltYWdlQXJyYXlfVU1DIGZvciBSVEw4NzIzQSBBIENVVFxuIik7Ci0JfSBlbHNlIGlmIChJU184NzIzQV9CX0NVVChwSGFsRGF0YS0+VmVyc2lvbklEKSkgewotCQkvKiAgV0xBTiBGdy4gKi8KLQkJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjID09IDEpIHsKLQkJCWZ3X25hbWUgPSAicnRsd2lmaS9ydGw4NzIzYXVmd19CX05vQlQuYmluIjsKLQkJCURCR184NzIzQSgiIFJ0bDg3MjNfRndVTUNCQ3V0SW1hZ2VBcnJheVdpdGhvdXRCVCBmb3IgIgotCQkJCSAgIlJUTDg3MjNBIEIgQ1VUXG4iKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkgewotCQkJCWZ3X25hbWUgPSAicnRsd2lmaS9ydGw4NzIzYXVmd19CLmJpbiI7Ci0JCQkJREJHXzg3MjNBKCIgUnRsODcyM19Gd1VNQ0JDdXRJbWFnZUFycmF5V2l0aEJUICIKLQkJCQkJICAiZm9yIFJUTDg3MjNBIEIgQ1VUXG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZndfbmFtZSA9ICJydGx3aWZpL3J0bDg3MjNhdWZ3X0JfTm9CVC5iaW4iOwotCQkJCURCR184NzIzQSgiIFJ0bDg3MjNfRndVTUNCQ3V0SW1hZ2VBcnJheVdpdGhvdXQgIgotCQkJCQkgICJCVCBmb3IgUlRMODcyM0EgQiBDVVRcbiIpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJLyogIDxSb2dlcl9UT0RPPiBXZSBzaG91bGQgZG93bmxvYWQgcHJvcGVyIFJBTSBDb2RlIGhlcmUKLQkJICAgIHRvIG1hdGNoIHRoZSBST00gY29kZS4gKi8KLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogdW5rbm93biB2ZXJzaW9uIVxuIiwgX19mdW5jX18pOwotCQlydFN0YXR1cyA9IF9GQUlMOwotCQlnb3RvIEV4aXQ7Ci0JfQotCi0JcHJfaW5mbygicnRsODcyM2F1OiBMb2FkaW5nIGZpcm13YXJlICVzXG4iLCBmd19uYW1lKTsKLQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X25hbWUsIGRldmljZSkpIHsKLQkJcHJfZXJyKCJydGw4NzIzYXU6IHJlcXVlc3RfZmlybXdhcmUgbG9hZCBmYWlsZWRcbiIpOwotCQlydFN0YXR1cyA9IF9GQUlMOwotCQlnb3RvIEV4aXQ7Ci0JfQotCWlmICghZncpIHsKLQkJcHJfZXJyKCJydGw4NzIzYXU6IEZpcm13YXJlICVzIG5vdCBhdmFpbGFibGVcbiIsIGZ3X25hbWUpOwotCQlydFN0YXR1cyA9IF9GQUlMOwotCQlnb3RvIEV4aXQ7Ci0JfQotCWZpcm13YXJlX2J1ZiA9IGttZW1kdXAoZnctPmRhdGEsIGZ3LT5zaXplLCBHRlBfS0VSTkVMKTsKLQlmd19zaXplID0gZnctPnNpemU7Ci0JcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0JaWYgKCFmaXJtd2FyZV9idWYpIHsKLQkJcnRTdGF0dXMgPSBfRkFJTDsKLQkJZ290byBFeGl0OwotCX0KLQlidWYgPSBmaXJtd2FyZV9idWY7Ci0KLQkvKiAgVG8gQ2hlY2sgRncgaGVhZGVyLiBBZGRlZCBieSB0eW5saS4gMjAwOS4xMi4wNC4gKi8KLQlwRndIZHIgPSAoc3RydWN0IHJ0Xzg3MjNhX2Zpcm13YXJlX2hkciAqKWZpcm13YXJlX2J1ZjsKLQotCXBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24gPSBsZTE2X3RvX2NwdShwRndIZHItPlZlcnNpb24pOwotCXBIYWxEYXRhLT5GaXJtd2FyZVN1YlZlcnNpb24gPSBwRndIZHItPlN1YnZlcnNpb247Ci0JcEhhbERhdGEtPkZpcm13YXJlU2lnbmF0dXJlID0gbGUxNl90b19jcHUocEZ3SGRyLT5TaWduYXR1cmUpOwotCi0JREJHXzg3MjNBKCIlczogZndfdmVyID0lZCBmd19zdWJ2ZXIgPSVkIHNpZyA9IDB4JXhcbiIsCi0JCSAgX19mdW5jX18sIHBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24sCi0JCSAgcEhhbERhdGEtPkZpcm13YXJlU3ViVmVyc2lvbiwgcEhhbERhdGEtPkZpcm13YXJlU2lnbmF0dXJlKTsKLQotCWlmICghbG9nX3ZlcnNpb24rKykKLQkJcHJfaW5mbygiJXNGaXJtd2FyZSBWZXJzaW9uICVkLCBTdWJWZXJzaW9uICVkLCBTaWduYXR1cmUgIgotCQkJIjB4JXhcbiIsIERSSVZFUl9QUkVGSVgsIHBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24sCi0JCQlwSGFsRGF0YS0+RmlybXdhcmVTdWJWZXJzaW9uLAotCQkJcEhhbERhdGEtPkZpcm13YXJlU2lnbmF0dXJlKTsKLQotCWlmIChJU19GV19IRUFERVJfRVhJU1QocEZ3SGRyKSkgewotCQkvKiAgU2hpZnQgMzIgYnl0ZXMgZm9yIEZXIGhlYWRlciAqLwotCQlidWYgPSBidWYgKyAzMjsKLQkJZndfc2l6ZSA9IGZ3X3NpemUgLSAzMjsKLQl9Ci0KLQkvKiAgU3VnZ2VzdGVkIGJ5IEZpbGVuLiBJZiA4MDUxIGlzIHJ1bm5pbmcgaW4gUkFNIGNvZGUsIGRyaXZlciBzaG91bGQKLQkgICAgaW5mb3JtIEZ3IHRvIHJlc2V0IGJ5IGl0c2VsZiwgKi8KLQkvKiAgb3IgaXQgd2lsbCBjYXVzZSBkb3dubG9hZCBGdyBmYWlsLiAyMDEwLjAyLjAxLiBieSB0eW5saS4gKi8KLQlpZiAocnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfTUNVRldETCkgJiBSQU1fRExfU0VMKSB7Ci0JCS8qIDgwNTEgUkFNIGNvZGUgKi8KLQkJcnRsODcyM2FfRmlybXdhcmVTZWxmUmVzZXQocGFkYXB0ZXIpOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTUNVRldETCwgMHgwMCk7Ci0JfQotCi0JX0ZXRG93bmxvYWRFbmFibGUocGFkYXB0ZXIsIHRydWUpOwotCWZ3ZGxfc3RhcnRfdGltZSA9IGppZmZpZXM7Ci0Jd2hpbGUgKDEpIHsKLQkJLyogcmVzZXQgdGhlIEZXREwgY2hrc3VtICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMLAotCQkJCSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19NQ1VGV0RMKSB8Ci0JCQkJIEZXRExfQ2hrU3VtX3JwdCk7Ci0KLQkJcnRTdGF0dXMgPSBfV3JpdGVGVyhwYWRhcHRlciwgYnVmLCBmd19zaXplKTsKLQotCQlpZiAocnRTdGF0dXMgPT0gX1NVQ0NFU1MgfHwKLQkJICAgIChqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBmd2RsX3N0YXJ0X3RpbWUpID4gNTAwICYmCi0JCSAgICAgd3JpdGVGV19yZXRyeSsrID49IDMpKQotCQkJYnJlYWs7Ci0KLQkJREJHXzg3MjNBKCIlcyB3cml0ZUZXX3JldHJ5OiV1LCB0aW1lIGFmdGVyIGZ3ZGxfc3RhcnRfdGltZToiCi0JCQkgICIldW1zXG4iLCBfX2Z1bmNfXywgd3JpdGVGV19yZXRyeSwKLQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gZndkbF9zdGFydF90aW1lKSk7Ci0JfQotCV9GV0Rvd25sb2FkRW5hYmxlKHBhZGFwdGVyLCBmYWxzZSk7Ci0JaWYgKF9TVUNDRVNTICE9IHJ0U3RhdHVzKSB7Ci0JCURCR184NzIzQSgiREwgRmlybXdhcmUgZmFpbGVkIVxuIik7Ci0JCWdvdG8gRXhpdDsKLQl9Ci0KLQlydFN0YXR1cyA9IF9GV0ZyZWVUb0dvKHBhZGFwdGVyKTsKLQlpZiAoX1NVQ0NFU1MgIT0gcnRTdGF0dXMpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICJETCBGaXJtd2FyZSBmYWlsZWQhXG4iKTsKLQkJZ290byBFeGl0OwotCX0KLQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIkZpcm13YXJlIGlzIHJlYWR5IHRvIHJ1biFcbiIpOwotCi1FeGl0OgotCWtmcmVlKGZpcm13YXJlX2J1Zik7Ci0JcmV0dXJuIHJ0U3RhdHVzOwotfQotCi12b2lkIHJ0bDg3MjNhX0luaXRpYWxpemVGaXJtd2FyZVZhcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICBJbml0IEZ3IExQUyByZWxhdGVkLiAqLwotCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5iRndDdXJyZW50SW5QU01vZGUgPSBmYWxzZTsKLQotCS8qICBJbml0IEgyQyBjb3VudGVyLiBieSB0eW5saS4gMjAwOS4xMi4wOS4gKi8KLQlwSGFsRGF0YS0+TGFzdEhNRUJveE51bSA9IDA7Ci19Ci0KLS8qICAqLwotLyoJCQkJRWZ1c2UgcmVsYXRlZCBjb2RlICovCi0vKiAgKi8KLXN0YXRpYyB1OAotaGFsX0VmdXNlU3dpdGNoVG9CYW5rKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJhbmspCi17Ci0JdTggYlJldCA9IGZhbHNlOwotCXUzMiB2YWx1ZTMyID0gMDsKLQotCURCR184NzIzQSgiJXM6IEVmdXNlIHN3aXRjaCBiYW5rIHRvICVkXG4iLCBfX2Z1bmNfXywgYmFuayk7Ci0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIEVGVVNFX1RFU1QpOwotCWJSZXQgPSB0cnVlOwotCXN3aXRjaCAoYmFuaykgewotCWNhc2UgMDoKLQkJdmFsdWUzMiA9ICh2YWx1ZTMyICYgfkVGVVNFX1NFTF9NQVNLKSB8Ci0JCQlFRlVTRV9TRUwoRUZVU0VfV0lGSV9TRUxfMCk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJdmFsdWUzMiA9ICh2YWx1ZTMyICYgfkVGVVNFX1NFTF9NQVNLKSB8Ci0JCQlFRlVTRV9TRUwoRUZVU0VfQlRfU0VMXzApOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXZhbHVlMzIgPSAodmFsdWUzMiAmIH5FRlVTRV9TRUxfTUFTSykgfAotCQkJRUZVU0VfU0VMKEVGVVNFX0JUX1NFTF8xKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQl2YWx1ZTMyID0gKHZhbHVlMzIgJiB+RUZVU0VfU0VMX01BU0spIHwKLQkJCUVGVVNFX1NFTChFRlVTRV9CVF9TRUxfMik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXZhbHVlMzIgPSAodmFsdWUzMiAmIH5FRlVTRV9TRUxfTUFTSykgfAotCQkJRUZVU0VfU0VMKEVGVVNFX1dJRklfU0VMXzApOwotCQliUmV0ID0gZmFsc2U7Ci0JCWJyZWFrOwotCX0KLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgRUZVU0VfVEVTVCwgdmFsdWUzMik7Ci0KLQlyZXR1cm4gYlJldDsKLX0KLQotc3RhdGljIHZvaWQKLWhhbF9SZWFkRUZ1c2VfV2lGaShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICB1MTYgX29mZnNldCwgdTE2IF9zaXplX2J5dGUsIHU4ICpwYnVmKQotewotCXU4ICplZnVzZVRibCA9IE5VTEw7Ci0JdTE2IGVGdXNlX0FkZHIgPSAwOwotCXU4IG9mZnNldCwgd2RlbjsKLQl1OCBlZnVzZUhlYWRlciwgZWZ1c2VFeHRIZHIsIGVmdXNlRGF0YTsKLQl1MTYgaSwgdG90YWwsIHVzZWQ7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQkvKiAgRG8gTk9UIGV4Y2VzcyB0b3RhbCBzaXplIG9mIEVGdXNlIHRhYmxlLgotCSAgICBBZGRlZCBieSBSb2dlciwgMjAwOC4xMS4xMC4gKi8KLQlpZiAoKF9vZmZzZXQgKyBfc2l6ZV9ieXRlKSA+IEVGVVNFX01BUF9MRU5fODcyM0EpIHsKLQkJREJHXzg3MjNBKCIlczogSW52YWxpZCBvZmZzZXQoJSN4KSB3aXRoIHJlYWQgYnl0ZXMoJSN4KSEhXG4iLAotCQkJICBfX2Z1bmNfXywgX29mZnNldCwgX3NpemVfYnl0ZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQllZnVzZVRibCA9IGttYWxsb2MoRUZVU0VfTUFQX0xFTl84NzIzQSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlZnVzZVRibCkKLQkJcmV0dXJuOwotCS8qICAweGZmIHdpbGwgYmUgZWZ1c2UgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkIG9mIDB4MDAuICovCi0JbWVtc2V0KGVmdXNlVGJsLCAweEZGLCBFRlVTRV9NQVBfTEVOXzg3MjNBKTsKLQotCS8qICBzd2l0Y2ggYmFuayBiYWNrIHRvIGJhbmsgMCBmb3IgbGF0ZXIgQlQgYW5kIHdpZmkgdXNlLiAqLwotCWhhbF9FZnVzZVN3aXRjaFRvQmFuayhwYWRhcHRlciwgMCk7Ci0KLQl3aGlsZSAoQVZBSUxBQkxFX0VGVVNFX0FERFIoZUZ1c2VfQWRkcikpIHsKLQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwgZUZ1c2VfQWRkcisrLCAmZWZ1c2VIZWFkZXIpOwotCQlpZiAoZWZ1c2VIZWFkZXIgPT0gMHhGRikgewotCQkJREJHXzg3MjNBKCIlczogZGF0YSBlbmQgYXQgYWRkcmVzcyA9JSN4XG4iLCBfX2Z1bmNfXywKLQkJCQkgIGVGdXNlX0FkZHIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiAgQ2hlY2sgUEcgaGVhZGVyIGZvciBzZWN0aW9uIG51bS4gKi8KLQkJaWYgKEVYVF9IRUFERVIoZWZ1c2VIZWFkZXIpKSB7CS8qIGV4dGVuZGVkIGhlYWRlciAqLwotCQkJb2Zmc2V0ID0gR0VUX0hEUl9PRkZTRVRfMl8wKGVmdXNlSGVhZGVyKTsKLQotCQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwgZUZ1c2VfQWRkcisrLCAmZWZ1c2VFeHRIZHIpOwotCQkJaWYgKEFMTF9XT1JEU19ESVNBQkxFRChlZnVzZUV4dEhkcikpCi0JCQkJY29udGludWU7Ci0KLQkJCW9mZnNldCB8PSAoKGVmdXNlRXh0SGRyICYgMHhGMCkgPj4gMSk7Ci0JCQl3ZGVuID0gZWZ1c2VFeHRIZHIgJiAweDBGOwotCQl9IGVsc2UgewotCQkJb2Zmc2V0ID0gKGVmdXNlSGVhZGVyID4+IDQpICYgMHgwZjsKLQkJCXdkZW4gPSBlZnVzZUhlYWRlciAmIDB4MGY7Ci0JCX0KLQotCQlpZiAob2Zmc2V0IDwgRUZVU0VfTUFYX1NFQ1RJT05fODcyM0EpIHsKLQkJCXUxNiBhZGRyOwotCQkJLyogIEdldCB3b3JkIGVuYWJsZSB2YWx1ZSBmcm9tIFBHIGhlYWRlciAqLwotCi0JCQlhZGRyID0gb2Zmc2V0ICogUEdQS1RfREFUQV9TSVpFOwotCQkJZm9yIChpID0gMDsgaSA8IEVGVVNFX01BWF9XT1JEX1VOSVQ7IGkrKykgewotCQkJCS8qIENoZWNrIHdvcmQgZW5hYmxlIGNvbmRpdGlvbiBpbiB0aGUgc2VjdGlvbiAqLwotCQkJCWlmICghKHdkZW4gJiAoMHgwMSA8PCBpKSkpIHsKLQkJCQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwgZUZ1c2VfQWRkcisrLAotCQkJCQkJICAgICAgJmVmdXNlRGF0YSk7Ci0JCQkJCWVmdXNlVGJsW2FkZHJdID0gZWZ1c2VEYXRhOwotCi0JCQkJCVJlYWRFRnVzZUJ5dGUyM2EocGFkYXB0ZXIsIGVGdXNlX0FkZHIrKywKLQkJCQkJCSAgICAgICZlZnVzZURhdGEpOwotCQkJCQllZnVzZVRibFthZGRyICsgMV0gPSBlZnVzZURhdGE7Ci0JCQkJfQotCQkJCWFkZHIgKz0gMjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCURCR184NzIzQShLRVJOX0VSUiAiJXM6IG9mZnNldCglZCkgaXMgaWxsZWdhbCEhXG4iLAotCQkJCSAgX19mdW5jX18sIG9mZnNldCk7Ci0JCQllRnVzZV9BZGRyICs9IEVmdXNlX0NhbGN1bGF0ZVdvcmRDbnRzMjNhKHdkZW4pICogMjsKLQkJfQotCX0KLQotCS8qICBDb3B5IGZyb20gRWZ1c2UgbWFwIHRvIG91dHB1dCBwb2ludGVyIG1lbW9yeSEhISAqLwotCWZvciAoaSA9IDA7IGkgPCBfc2l6ZV9ieXRlOyBpKyspCi0JCXBidWZbaV0gPSBlZnVzZVRibFtfb2Zmc2V0ICsgaV07Ci0KLQkvKiAgQ2FsY3VsYXRlIEVmdXNlIHV0aWxpemF0aW9uICovCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9XSUZJLAotCQkJCSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19UT1RBTCwgJnRvdGFsKTsKLQl1c2VkID0gZUZ1c2VfQWRkciAtIDE7Ci0JcEhhbERhdGEtPkVmdXNlVXNlZEJ5dGVzID0gdXNlZDsKLQotCWtmcmVlKGVmdXNlVGJsKTsKLX0KLQotc3RhdGljIHZvaWQKLWhhbF9SZWFkRUZ1c2VfQlQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJIHUxNiBfb2Zmc2V0LCB1MTYgX3NpemVfYnl0ZSwgdTggKnBidWYpCi17Ci0JdTggKmVmdXNlVGJsOwotCXU4IGJhbms7Ci0JdTE2IGVGdXNlX0FkZHI7Ci0JdTggZWZ1c2VIZWFkZXIsIGVmdXNlRXh0SGRyLCBlZnVzZURhdGE7Ci0JdTggb2Zmc2V0LCB3ZGVuOwotCXUxNiBpLCB0b3RhbCwgdXNlZDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICBEbyBOT1QgZXhjZXNzIHRvdGFsIHNpemUgb2YgRUZ1c2UgdGFibGUuCi0JICAgIEFkZGVkIGJ5IFJvZ2VyLCAyMDA4LjExLjEwLiAqLwotCWlmICgoX29mZnNldCArIF9zaXplX2J5dGUpID4gRUZVU0VfQlRfTUFQX0xFTikgewotCQlEQkdfODcyM0EoIiVzOiBJbnZhbGlkIG9mZnNldCglI3gpIHdpdGggcmVhZCBieXRlcyglI3gpISFcbiIsCi0JCQkgIF9fZnVuY19fLCBfb2Zmc2V0LCBfc2l6ZV9ieXRlKTsKLQkJcmV0dXJuOwotCX0KLQotCWVmdXNlVGJsID0ga21hbGxvYyhFRlVTRV9CVF9NQVBfTEVOLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVmdXNlVGJsKQotCQlyZXR1cm47Ci0JLyogIDB4ZmYgd2lsbCBiZSBlZnVzZSBkZWZhdWx0IHZhbHVlIGluc3RlYWQgb2YgMHgwMC4gKi8KLQltZW1zZXQoZWZ1c2VUYmwsIDB4RkYsIEVGVVNFX0JUX01BUF9MRU4pOwotCi0JRUZVU0VfR2V0RWZ1c2VEZWZpbml0aW9uMjNhKHBhZGFwdGVyLCBFRlVTRV9CVCwKLQkJCQkgVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSywgJnRvdGFsKTsKLQotCWZvciAoYmFuayA9IDE7IGJhbmsgPCBFRlVTRV9NQVhfQkFOSzsgYmFuaysrKSB7Ci0JCWlmIChoYWxfRWZ1c2VTd2l0Y2hUb0JhbmsocGFkYXB0ZXIsIGJhbmspID09IGZhbHNlKSB7Ci0JCQlEQkdfODcyM0EoIiVzOiBoYWxfRWZ1c2VTd2l0Y2hUb0JhbmsgRmFpbCEhXG4iLAotCQkJCSAgX19mdW5jX18pOwotCQkJZ290byBleGl0OwotCQl9Ci0KLQkJZUZ1c2VfQWRkciA9IDA7Ci0KLQkJd2hpbGUgKEFWQUlMQUJMRV9FRlVTRV9BRERSKGVGdXNlX0FkZHIpKSB7Ci0JCQlSZWFkRUZ1c2VCeXRlMjNhKHBhZGFwdGVyLCBlRnVzZV9BZGRyKyssICZlZnVzZUhlYWRlcik7Ci0JCQlpZiAoZWZ1c2VIZWFkZXIgPT0gMHhGRikKLQkJCQlicmVhazsKLQotCQkJLyogIENoZWNrIFBHIGhlYWRlciBmb3Igc2VjdGlvbiBudW0uICovCi0JCQlpZiAoRVhUX0hFQURFUihlZnVzZUhlYWRlcikpIHsJLyogZXh0ZW5kZWQgaGVhZGVyICovCi0JCQkJb2Zmc2V0ID0gR0VUX0hEUl9PRkZTRVRfMl8wKGVmdXNlSGVhZGVyKTsKLQotCQkJCVJlYWRFRnVzZUJ5dGUyM2EocGFkYXB0ZXIsIGVGdXNlX0FkZHIrKywKLQkJCQkJICAgICAgJmVmdXNlRXh0SGRyKTsKLQkJCQlpZiAoQUxMX1dPUkRTX0RJU0FCTEVEKGVmdXNlRXh0SGRyKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlvZmZzZXQgfD0gKChlZnVzZUV4dEhkciAmIDB4RjApID4+IDEpOwotCQkJCXdkZW4gPSBlZnVzZUV4dEhkciAmIDB4MEY7Ci0JCQl9IGVsc2UgewotCQkJCW9mZnNldCA9IChlZnVzZUhlYWRlciA+PiA0KSAmIDB4MGY7Ci0JCQkJd2RlbiA9IGVmdXNlSGVhZGVyICYgMHgwZjsKLQkJCX0KLQotCQkJaWYgKG9mZnNldCA8IEVGVVNFX0JUX01BWF9TRUNUSU9OKSB7Ci0JCQkJdTE2IGFkZHI7Ci0KLQkJCQkvKiAgR2V0IHdvcmQgZW5hYmxlIHZhbHVlIGZyb20gUEcgaGVhZGVyICovCi0KLQkJCQlhZGRyID0gb2Zmc2V0ICogUEdQS1RfREFUQV9TSVpFOwotCQkJCWZvciAoaSA9IDA7IGkgPCBFRlVTRV9NQVhfV09SRF9VTklUOyBpKyspIHsKLQkJCQkJLyogIENoZWNrIHdvcmQgZW5hYmxlIGNvbmRpdGlvbiBpbgotCQkJCQkgICAgdGhlIHNlY3Rpb24gKi8KLQkJCQkJaWYgKCEod2RlbiAmICgweDAxIDw8IGkpKSkgewotCQkJCQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwKLQkJCQkJCQkgICAgICBlRnVzZV9BZGRyKyssCi0JCQkJCQkJICAgICAgJmVmdXNlRGF0YSk7Ci0JCQkJCQllZnVzZVRibFthZGRyXSA9IGVmdXNlRGF0YTsKLQotCQkJCQkJUmVhZEVGdXNlQnl0ZTIzYShwYWRhcHRlciwKLQkJCQkJCQkgICAgICBlRnVzZV9BZGRyKyssCi0JCQkJCQkJICAgICAgJmVmdXNlRGF0YSk7Ci0JCQkJCQllZnVzZVRibFthZGRyICsgMV0gPSBlZnVzZURhdGE7Ci0JCQkJCX0KLQkJCQkJYWRkciArPSAyOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJREJHXzg3MjNBKEtFUk5fRVJSCi0JCQkJCSAgIiVzOiBvZmZzZXQoJWQpIGlzIGlsbGVnYWwhIVxuIiwKLQkJCQkJICBfX2Z1bmNfXywgb2Zmc2V0KTsKLQkJCQllRnVzZV9BZGRyICs9IEVmdXNlX0NhbGN1bGF0ZVdvcmRDbnRzMjNhKHdkZW4pICogMjsKLQkJCX0KLQkJfQotCi0JCWlmICgoZUZ1c2VfQWRkciAtIDEpIDwgdG90YWwpIHsKLQkJCURCR184NzIzQSgiJXM6IGJhbmsoJWQpIGRhdGEgZW5kIGF0ICUjeFxuIiwKLQkJCQkgIF9fZnVuY19fLCBiYW5rLCBlRnVzZV9BZGRyIC0gMSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qICBzd2l0Y2ggYmFuayBiYWNrIHRvIGJhbmsgMCBmb3IgbGF0ZXIgQlQgYW5kIHdpZmkgdXNlLiAqLwotCWhhbF9FZnVzZVN3aXRjaFRvQmFuayhwYWRhcHRlciwgMCk7Ci0KLQkvKiAgQ29weSBmcm9tIEVmdXNlIG1hcCB0byBvdXRwdXQgcG9pbnRlciBtZW1vcnkhISEgKi8KLQlmb3IgKGkgPSAwOyBpIDwgX3NpemVfYnl0ZTsgaSsrKQotCQlwYnVmW2ldID0gZWZ1c2VUYmxbX29mZnNldCArIGldOwotCi0JLyogICovCi0JLyogIENhbGN1bGF0ZSBFZnVzZSB1dGlsaXphdGlvbi4gKi8KLQkvKiAgKi8KLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2EocGFkYXB0ZXIsIEVGVVNFX0JULAotCQkJCSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19UT1RBTCwgJnRvdGFsKTsKLQl1c2VkID0gKEVGVVNFX0JUX1JFQUxfQkFOS19DT05URU5UX0xFTiAqIChiYW5rIC0gMSkpICsgZUZ1c2VfQWRkciAtIDE7Ci0JcEhhbERhdGEtPkJURWZ1c2VVc2VkQnl0ZXMgPSB1c2VkOwotCi1leGl0OgotCWtmcmVlKGVmdXNlVGJsKTsKLX0KLQotdm9pZAotcnRsODcyM2FfcmVhZGVmdXNlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgIHU4IGVmdXNlVHlwZSwgdTE2IF9vZmZzZXQsIHUxNiBfc2l6ZV9ieXRlLCB1OCAqcGJ1ZikKLXsKLQlpZiAoZWZ1c2VUeXBlID09IEVGVVNFX1dJRkkpCi0JCWhhbF9SZWFkRUZ1c2VfV2lGaShwYWRhcHRlciwgX29mZnNldCwgX3NpemVfYnl0ZSwgcGJ1Zik7Ci0JZWxzZQotCQloYWxfUmVhZEVGdXNlX0JUKHBhZGFwdGVyLCBfb2Zmc2V0LCBfc2l6ZV9ieXRlLCBwYnVmKTsKLX0KLQotdTE2IHJ0bDg3MjNhX0VmdXNlR2V0Q3VycmVudFNpemVfV2lGaShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUxNiBlZnVzZV9hZGRyID0gMDsKLQl1OCBob2Zmc2V0ID0gMCwgaHdvcmRlbiA9IDA7Ci0JdTggZWZ1c2VfZGF0YSwgd29yZF9jbnRzID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWVmdXNlX2FkZHIgPSBwSGFsRGF0YS0+RWZ1c2VVc2VkQnl0ZXM7Ci0KLQlEQkdfODcyM0EoIiVzOiBzdGFydF9lZnVzZV9hZGRyID0gMHglWFxuIiwgX19mdW5jX18sIGVmdXNlX2FkZHIpOwotCi0JLyogIHN3aXRjaCBiYW5rIGJhY2sgdG8gYmFuayAwIGZvciBsYXRlciBCVCBhbmQgd2lmaSB1c2UuICovCi0JaGFsX0VmdXNlU3dpdGNoVG9CYW5rKHBhZGFwdGVyLCAwKTsKLQotCXdoaWxlIChBVkFJTEFCTEVfRUZVU0VfQUREUihlZnVzZV9hZGRyKSkgewotCQlpZiAoZWZ1c2VfT25lQnl0ZVJlYWQyM2EocGFkYXB0ZXIsIGVmdXNlX2FkZHIsICZlZnVzZV9kYXRhKSA9PQotCQkgICAgX0ZBSUwpIHsKLQkJCURCR184NzIzQShLRVJOX0VSUiAiJXM6IGVmdXNlX09uZUJ5dGVSZWFkMjNhIEZhaWwhICIKLQkJCQkgICJhZGRyID0gMHglWCAhIVxuIiwgX19mdW5jX18sIGVmdXNlX2FkZHIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoZWZ1c2VfZGF0YSA9PSAweEZGKQotCQkJYnJlYWs7Ci0KLQkJaWYgKEVYVF9IRUFERVIoZWZ1c2VfZGF0YSkpIHsKLQkJCWhvZmZzZXQgPSBHRVRfSERSX09GRlNFVF8yXzAoZWZ1c2VfZGF0YSk7Ci0JCQllZnVzZV9hZGRyKys7Ci0JCQllZnVzZV9PbmVCeXRlUmVhZDIzYShwYWRhcHRlciwgZWZ1c2VfYWRkciwgJmVmdXNlX2RhdGEpOwotCQkJaWYgKEFMTF9XT1JEU19ESVNBQkxFRChlZnVzZV9kYXRhKSkKLQkJCQljb250aW51ZTsKLQotCQkJaG9mZnNldCB8PSAoKGVmdXNlX2RhdGEgJiAweEYwKSA+PiAxKTsKLQkJCWh3b3JkZW4gPSBlZnVzZV9kYXRhICYgMHgwRjsKLQkJfSBlbHNlIHsKLQkJCWhvZmZzZXQgPSAoZWZ1c2VfZGF0YSA+PiA0KSAmIDB4MEY7Ci0JCQlod29yZGVuID0gZWZ1c2VfZGF0YSAmIDB4MEY7Ci0JCX0KLQotCQl3b3JkX2NudHMgPSBFZnVzZV9DYWxjdWxhdGVXb3JkQ250czIzYShod29yZGVuKTsKLQkJZWZ1c2VfYWRkciArPSAod29yZF9jbnRzICogMikgKyAxOwotCX0KLQotCXBIYWxEYXRhLT5FZnVzZVVzZWRCeXRlcyA9IGVmdXNlX2FkZHI7Ci0KLQlEQkdfODcyM0EoIiVzOiBDdXJyZW50U2l6ZSA9JWRcbiIsIF9fZnVuY19fLCBlZnVzZV9hZGRyKTsKLQotCXJldHVybiBlZnVzZV9hZGRyOwotfQotCi11MTYgcnRsODcyM2FfRWZ1c2VHZXRDdXJyZW50U2l6ZV9CVChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUxNiBidHVzZWRieXRlczsKLQl1MTYgZWZ1c2VfYWRkcjsKLQl1OCBiYW5rLCBzdGFydEJhbms7Ci0JdTggaG9mZnNldCA9IDAsIGh3b3JkZW4gPSAwOwotCXU4IGVmdXNlX2RhdGEsIHdvcmRfY250cyA9IDA7Ci0JdTE2IHJldFUyID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWJ0dXNlZGJ5dGVzID0gcEhhbERhdGEtPkJURWZ1c2VVc2VkQnl0ZXM7Ci0KLQllZnVzZV9hZGRyID0gKHUxNikgKChidHVzZWRieXRlcyAlIEVGVVNFX0JUX1JFQUxfQkFOS19DT05URU5UX0xFTikpOwotCXN0YXJ0QmFuayA9ICh1OCkgKDEgKyAoYnR1c2VkYnl0ZXMgLyBFRlVTRV9CVF9SRUFMX0JBTktfQ09OVEVOVF9MRU4pKTsKLQotCURCR184NzIzQSgiJXM6IHN0YXJ0IGZyb20gYmFuayA9JWQgYWRkciA9IDB4JVhcbiIsIF9fZnVuY19fLCBzdGFydEJhbmssCi0JCSAgZWZ1c2VfYWRkcik7Ci0KLQlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2EocGFkYXB0ZXIsIEVGVVNFX0JULAotCQkJCSBUWVBFX0FWQUlMQUJMRV9FRlVTRV9CWVRFU19CQU5LLCAmcmV0VTIpOwotCi0JZm9yIChiYW5rID0gc3RhcnRCYW5rOyBiYW5rIDwgRUZVU0VfTUFYX0JBTks7IGJhbmsrKykgewotCQlpZiAoaGFsX0VmdXNlU3dpdGNoVG9CYW5rKHBhZGFwdGVyLCBiYW5rKSA9PSBmYWxzZSkgewotCQkJREJHXzg3MjNBKEtFUk5fRVJSICIlczogc3dpdGNoIGJhbmsoJWQpIEZhaWwhIVxuIiwKLQkJCQkgIF9fZnVuY19fLCBiYW5rKTsKLQkJCWJhbmsgPSBFRlVTRV9NQVhfQkFOSzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogIG9ubHkgd2hlbiBiYW5rIGlzIHN3aXRjaGVkIHdlIGhhdmUgdG8gcmVzZXQKLQkJICAgIHRoZSBlZnVzZV9hZGRyLiAqLwotCQlpZiAoYmFuayAhPSBzdGFydEJhbmspCi0JCQllZnVzZV9hZGRyID0gMDsKLQotCQl3aGlsZSAoQVZBSUxBQkxFX0VGVVNFX0FERFIoZWZ1c2VfYWRkcikpIHsKLQkJCWlmIChlZnVzZV9PbmVCeXRlUmVhZDIzYShwYWRhcHRlciwgZWZ1c2VfYWRkciwKLQkJCQkJICAgICAgJmVmdXNlX2RhdGEpID09IF9GQUlMKSB7Ci0JCQkJREJHXzg3MjNBKEtFUk5fRVJSICIlczogZWZ1c2VfT25lQnl0ZVJlYWQyM2EgRmFpbCEiCi0JCQkJCSAgIiBhZGRyID0gMHglWCAhIVxuIiwKLQkJCQkJICBfX2Z1bmNfXywgZWZ1c2VfYWRkcik7Ci0JCQkJYmFuayA9IEVGVVNFX01BWF9CQU5LOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoZWZ1c2VfZGF0YSA9PSAweEZGKQotCQkJCWJyZWFrOwotCi0JCQlpZiAoRVhUX0hFQURFUihlZnVzZV9kYXRhKSkgewotCQkJCWhvZmZzZXQgPSBHRVRfSERSX09GRlNFVF8yXzAoZWZ1c2VfZGF0YSk7Ci0JCQkJZWZ1c2VfYWRkcisrOwotCQkJCWVmdXNlX09uZUJ5dGVSZWFkMjNhKHBhZGFwdGVyLCBlZnVzZV9hZGRyLAotCQkJCQkJICAmZWZ1c2VfZGF0YSk7Ci0JCQkJaWYgKEFMTF9XT1JEU19ESVNBQkxFRChlZnVzZV9kYXRhKSkgewotCQkJCQllZnVzZV9hZGRyKys7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWhvZmZzZXQgfD0gKChlZnVzZV9kYXRhICYgMHhGMCkgPj4gMSk7Ci0JCQkJaHdvcmRlbiA9IGVmdXNlX2RhdGEgJiAweDBGOwotCQkJfSBlbHNlIHsKLQkJCQlob2Zmc2V0ID0gKGVmdXNlX2RhdGEgPj4gNCkgJiAweDBGOwotCQkJCWh3b3JkZW4gPSBlZnVzZV9kYXRhICYgMHgwRjsKLQkJCX0KLQkJCXdvcmRfY250cyA9IEVmdXNlX0NhbGN1bGF0ZVdvcmRDbnRzMjNhKGh3b3JkZW4pOwotCQkJLyogcmVhZCBuZXh0IGhlYWRlciAqLwotCQkJZWZ1c2VfYWRkciArPSAod29yZF9jbnRzICogMikgKyAxOwotCQl9Ci0KLQkJLyogIENoZWNrIGlmIHdlIG5lZWQgdG8gY2hlY2sgbmV4dCBiYW5rIGVmdXNlICovCi0JCWlmIChlZnVzZV9hZGRyIDwgcmV0VTIpCi0JCQlicmVhazsJLyogIGRvbid0IG5lZWQgdG8gY2hlY2sgbmV4dCBiYW5rLiAqLwotCX0KLQotCXJldFUyID0gKChiYW5rIC0gMSkgKiBFRlVTRV9CVF9SRUFMX0JBTktfQ09OVEVOVF9MRU4pICsgZWZ1c2VfYWRkcjsKLQlwSGFsRGF0YS0+QlRFZnVzZVVzZWRCeXRlcyA9IHJldFUyOwotCi0JREJHXzg3MjNBKCIlczogQ3VycmVudFNpemUgPSVkXG4iLCBfX2Z1bmNfXywgcmV0VTIpOwotCXJldHVybiByZXRVMjsKLX0KLQotdm9pZCBydGw4NzIzYV9yZWFkX2NoaXBfdmVyc2lvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXUzMiB2YWx1ZTMyOwotCXN0cnVjdCBoYWxfdmVyc2lvbiBDaGlwVmVyc2lvbjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19TWVNfQ0ZHKTsKLQlDaGlwVmVyc2lvbi5JQ1R5cGUgPSBDSElQXzg3MjNBOwotCUNoaXBWZXJzaW9uLkNoaXBUeXBlID0gKCh2YWx1ZTMyICYgUlRMX0lEKSA/IFRFU1RfQ0hJUCA6IE5PUk1BTF9DSElQKTsKLQlwSGFsRGF0YS0+cmZfdHlwZSA9IFJGXzFUMVI7Ci0JQ2hpcFZlcnNpb24uVmVuZG9yVHlwZSA9Ci0JCSgodmFsdWUzMiAmIFZFTkRPUl9JRCkgPyBDSElQX1ZFTkRPUl9VTUMgOiBDSElQX1ZFTkRPUl9UU01DKTsKLQlDaGlwVmVyc2lvbi5DVVRWZXJzaW9uID0gKHZhbHVlMzIgJiBDSElQX1ZFUl9SVExfTUFTSykgPj4gQ0hJUF9WRVJfUlRMX1NISUZUOwkvKiAgSUMgdmVyc2lvbiAoQ1VUKSAqLwotCi0JLyogIEZvciByZWd1bGF0b3IgbW9kZS4gYnkgdHlubGkuIDIwMTEuMDEuMTQgKi8KLQlwSGFsRGF0YS0+UmVndWxhdG9yTW9kZSA9ICgodmFsdWUzMiAmIFNQU19TRUwpID8KLQkJCQkgICBSVF9MRE9fUkVHVUxBVE9SIDogUlRfU1dJVENISU5HX1JFR1VMQVRPUik7Ci0KLQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX0dQSU9fT1VUU1RTKTsKLQkvKiAgUk9NIGNvZGUgdmVyc2lvbi4gKi8KLQlDaGlwVmVyc2lvbi5ST01WZXIgPSAodmFsdWUzMiAmIFJGX1JMX0lEKSA+PiAyMDsKLQotCS8qICBGb3IgbXVsdGktZnVuY3Rpb24gY29uc2lkZXJhdGlvbi4gQWRkZWQgYnkgUm9nZXIsIDIwMTAuMTAuMDYuICovCi0JcEhhbERhdGEtPk11bHRpRnVuYyA9IFJUX01VTFRJX0ZVTkNfTk9ORTsKLQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX01VTFRJX0ZVTkNfQ1RSTCk7Ci0JcEhhbERhdGEtPk11bHRpRnVuYyB8PQotCQkoKHZhbHVlMzIgJiBXTF9GVU5DX0VOKSA/IFJUX01VTFRJX0ZVTkNfV0lGSSA6IDApOwotCXBIYWxEYXRhLT5NdWx0aUZ1bmMgfD0gKCh2YWx1ZTMyICYgQlRfRlVOQ19FTikgPyBSVF9NVUxUSV9GVU5DX0JUIDogMCk7Ci0JcEhhbERhdGEtPk11bHRpRnVuYyB8PQotCQkoKHZhbHVlMzIgJiBHUFNfRlVOQ19FTikgPyBSVF9NVUxUSV9GVU5DX0dQUyA6IDApOwotCXBIYWxEYXRhLT5Qb2xhcml0eUN0bCA9Ci0JCSgodmFsdWUzMiAmIFdMX0hXUEROX1NMKSA/IFJUX1BPTEFSSVRZX0hJR0hfQUNUIDoKLQkJIFJUX1BPTEFSSVRZX0xPV19BQ1QpOwotCXBIYWxEYXRhLT5WZXJzaW9uSUQgPSBDaGlwVmVyc2lvbjsKLQotCU1TR184NzIzQSgiUkZfVHlwZSBpcyAleCEhXG4iLCBwSGFsRGF0YS0+cmZfdHlwZSk7Ci19Ci0KLS8qICAqLwotLyogICovCi0vKiAgMjAxMDAyMDkgSm9zZXBoOiAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBvbmx5IGZvciA5MkMgdG8gc2V0IFJFR19CQ05fQ1RSTCgweDU1MCkgcmVnaXN0ZXIuICovCi0vKiAgV2UganVzdCByZXNlcnZlIHRoZSB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgaW4gdmFyaWFibGUKLSAgICBwSGFsRGF0YS0+UmVnQmNuQ3RybFZhbCBhbmQgdGhlbiBvcGVyYXRlICovCi0vKiAgdGhlIHZhbHVlIG9mIHRoZSByZWdpc3RlciB2aWEgYXRvbWljIG9wZXJhdGlvbi4gKi8KLS8qICBUaGlzIHByZXZlbnRzIGZyb20gcmFjZSBjb25kaXRpb24gd2hlbiBzZXR0aW5nIHRoaXMgcmVnaXN0ZXIuICovCi0vKiAgVGhlIHZhbHVlIG9mIHBIYWxEYXRhLT5SZWdCY25DdHJsVmFsIGlzIGluaXRpYWxpemVkIGluCi0gICAgSHdDb25maWd1cmVSVEw4MTkyQ0UoKSBmdW5jdGlvbi4gKi8KLS8qICAqLwotdm9pZCBTZXRCY25DdHJsUmVnMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IFNldEJpdHMsIHU4IENsZWFyQml0cykKLXsKLQl1OCB2YWw4OwotCi0JdmFsOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0JDTl9DVFJMKTsKLQl2YWw4IHw9IFNldEJpdHM7Ci0JdmFsOCAmPSB+Q2xlYXJCaXRzOwotCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0JDTl9DVFJMLCB2YWw4KTsKLX0KLQotdm9pZCBydGw4NzIzYV9Jbml0QmVhY29uUGFyYW1ldGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfQkNOX0NUUkwsIDB4MTAxMCk7Ci0KLQkvKiAgVE9ETzogUmVtb3ZlIHRoZXNlIG1hZ2ljIG51bWJlciAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfVEJUVF9QUk9ISUJJVCwgMHg2NDA0KTsJLyogIG1zICovCi0JLyogIEZpcm13YXJlIHdpbGwgY29udHJvbCBSRUdfRFJWRVJMWUlOVCB3aGVuIHBvd2VyIHNhdmluZyBpcyBlbmFibGUsICovCi0JLyogIHNvIGRvbid0IHNldCB0aGlzIHJlZ2lzdGVyIG9uIFNUQSBtb2RlLiAqLwotCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgPT0gZmFsc2UpCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19EUlZFUkxZSU5ULAotCQkJCSBEUklWRVJfRUFSTFlfSU5UX1RJTUUpOwotCS8qICAybXMgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfQkNORE1BVElNLCBCQ05fRE1BX0FUSU1FX0lOVF9USU1FKTsKLQotCS8qICBTdWdnZXN0ZWQgYnkgZGVzaWduZXIgdGltY2hlbi4gQ2hhbmdlIGJlYWNvbiBBSUZTIHRvIHRoZQotCSAgICBsYXJnZXN0IG51bWJlciBiZWFjYXVzZSB0ZXN0IGNoaXAgZG9lcyBub3QgY29udGVuc2lvbiBiZWZvcmUKLQkgICAgc2VuZGluZyBiZWFjb24uIGJ5IHR5bmxpLiAyMDA5LjExLjAzICovCi0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19CQ05UQ0ZHLCAweDY2MEYpOwotfQotCi1zdGF0aWMgdm9pZCBSZXN1bWVUeEJlYWNvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JLyogIDIwMTAuMDMuMDEuIE1hcmtlZCBieSB0eW5saS4gTm8gbmVlZCB0byBjYWxsIHdvcmtpdGVtIGJlYWNhdXNlCi0JICAgIHdlIHJlY29yZCB0aGUgdmFsdWUgKi8KLQkvKiAgd2hpY2ggc2hvdWxkIGJlIHJlYWQgZnJvbSByZWdpc3RlciB0byBhIGdsb2JhbCB2YXJpYWJsZS4gKi8KLQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAiK1Jlc3VtZVR4QmVhY29uXG4iKTsKLQotCXBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCB8PSBCSVQoNik7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAotCQkJIHBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCk7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1RCVFRfUFJPSElCSVQgKyAxLCAweGZmKTsKLQlwSGFsRGF0YS0+UmVnUmVnNTQyIHw9IEJJVCgwKTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfVEJUVF9QUk9ISUJJVCArIDIsIHBIYWxEYXRhLT5SZWdSZWc1NDIpOwotfQotCi1zdGF0aWMgdm9pZCBTdG9wVHhCZWFjb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCS8qICAyMDEwLjAzLjAxLiBNYXJrZWQgYnkgdHlubGkuIE5vIG5lZWQgdG8gY2FsbCB3b3JraXRlbSBiZWFjYXVzZQotCSAgICB3ZSByZWNvcmQgdGhlIHZhbHVlICovCi0JLyogIHdoaWNoIHNob3VsZCBiZSByZWFkIGZyb20gcmVnaXN0ZXIgdG8gYSBnbG9iYWwgdmFyaWFibGUuICovCi0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgIitTdG9wVHhCZWFjb25cbiIpOwotCi0JcEhhbERhdGEtPlJlZ0Z3SHdUeFFDdHJsICY9IH5CSVQoNik7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwgKyAyLAotCQkJIHBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCk7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1RCVFRfUFJPSElCSVQgKyAxLCAweDY0KTsKLQlwSGFsRGF0YS0+UmVnUmVnNTQyICY9IH5CSVQoMCk7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1RCVFRfUFJPSElCSVQgKyAyLCBwSGFsRGF0YS0+UmVnUmVnNTQyKTsKLX0KLQotc3RhdGljIHZvaWQgX0JlYWNvbkZ1bmN0aW9uRW5hYmxlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEVuYWJsZSwKLQkJCQkgIHU4IExpbmtlZCkKLXsKLQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCBESVNfVFNGX1VEVCB8IEVOX0JDTl9GVU5DVElPTiB8IERJU19CQ05RX1NVQiwKLQkJICAgICAgMCk7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JEX0NUUkwgKyAxLCAweDZGKTsKLX0KLQotdm9pZCBydGw4NzIzYV9TZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTMyIHZhbHVlMzI7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfaW5mbyAqcG1sbWVpbmZvID0gJnBtbG1lZXh0LT5tbG1leHRfaW5mbzsKLQotCS8qIHJlc2V0IFRTRiwgZW5hYmxlIHVwZGF0ZSBUU0YsIGNvcnJlY3RpbmcgVFNGIE9uIEJlYWNvbiAqLwotCi0JLyogUkVHX0JDTl9JTlRFUlZBTCAqLwotCS8qIFJFR19CQ05ETUFUSU0gKi8KLQkvKiBSRUdfQVRJTVdORCAqLwotCS8qIFJFR19UQlRUX1BST0hJQklUICovCi0JLyogUkVHX0RSVkVSTFlJTlQgKi8KLQkvKiBSRUdfQkNOX01BWF9FUlIgKi8KLQkvKiBSRUdfQkNOVENGRyAoMHg1MTApICovCi0JLyogUkVHX0RVQUxfVFNGX1JTVCAqLwotCS8qIFJFR19CQ05fQ1RSTCAoMHg1NTApICovCi0KLQkvKiAgKi8KLQkvKiAgQVRJTSB3aW5kb3cgKi8KLQkvKiAgKi8KLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX0FUSU1XTkQsIDIpOwotCi0JLyogICovCi0JLyogIEJlYWNvbiBpbnRlcnZhbCAoaW4gdW5pdCBvZiBUVSkuICovCi0JLyogICovCi0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19CQ05fSU5URVJWQUwsIHBtbG1laW5mby0+YmNuX2ludGVydmFsKTsKLQotCXJ0bDg3MjNhX0luaXRCZWFjb25QYXJhbWV0ZXJzKHBhZGFwdGVyKTsKLQotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19TTE9ULCAweDA5KTsKLQotCS8qICAqLwotCS8qICBSZXNldCBUU0YgVGltZXIgdG8gemVybywgYWRkZWQgYnkgUm9nZXIuIDIwMDguMDYuMjQgKi8KLQkvKiAgKi8KLQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgUkVHX1RDUik7Ci0JdmFsdWUzMiAmPSB+VFNGUlNUOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfVENSLCB2YWx1ZTMyKTsKLQotCXZhbHVlMzIgfD0gVFNGUlNUOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfVENSLCB2YWx1ZTMyKTsKLQotCS8qICBOT1RFOiBGaXggdGVzdCBjaGlwJ3MgYnVnIChhYm91dCBjb250ZW50aW9uIHdpbmRvd3MncyByYW5kb21uZXNzKSAqLwotCWlmIChjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUgfAotCQkJICBXSUZJX0FESE9DX01BU1RFUl9TVEFURSB8IFdJRklfQVBfU1RBVEUpID09IHRydWUpIHsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JYVFNGX09GRlNFVF9DQ0ssIDB4NTApOwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfUlhUU0ZfT0ZGU0VUX09GRE0sIDB4NTApOwotCX0KLQotCV9CZWFjb25GdW5jdGlvbkVuYWJsZShwYWRhcHRlciwgdHJ1ZSwgdHJ1ZSk7Ci0KLQlSZXN1bWVUeEJlYWNvbihwYWRhcHRlcik7Ci0JU2V0QmNuQ3RybFJlZzIzYShwYWRhcHRlciwgRElTX0JDTlFfU1VCLCAwKTsKLX0KLQotdm9pZCBydGw4NzIzYV9TZXRIYWxPRE1WYXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJICAgZW51bSBoYWxfb2RtX3ZhcmlhYmxlIGVWYXJpYWJsZSwKLQkJCSAgIHZvaWQgKnBWYWx1ZTEsIGJvb2wgYlNldCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9vZG1fdCAqcG9kbXByaXYgPSAmcEhhbERhdGEtPm9kbXByaXY7Ci0Jc3dpdGNoIChlVmFyaWFibGUpIHsKLQljYXNlIEhBTF9PRE1fU1RBX0lORk86Ci0JewotCQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSAoc3RydWN0IHN0YV9pbmZvICopcFZhbHVlMTsKLQotCQlpZiAoYlNldCkgewotCQkJREJHXzg3MjNBKCJTZXQgU1RBXyglZCkgaW5mb1xuIiwgcHN0YS0+bWFjX2lkKTsKLQkJCU9ETV9DbW5JbmZvUHRyQXJyYXlIb29rMjNhKHBvZG1wcml2LAotCQkJCQkJT0RNX0NNTklORk9fU1RBX1NUQVRVUywKLQkJCQkJCXBzdGEtPm1hY19pZCwgcHN0YSk7Ci0JCX0gZWxzZSB7Ci0JCQlEQkdfODcyM0EoIkNsZWFuIFNUQV8oJWQpIGluZm9cbiIsIHBzdGEtPm1hY19pZCk7Ci0JCQkJT0RNX0NtbkluZm9QdHJBcnJheUhvb2syM2EocG9kbXByaXYsCi0JCQkJCQkJT0RNX0NNTklORk9fU1RBX1NUQVRVUywKLQkJCQkJCQlwc3RhLT5tYWNfaWQsIE5VTEwpOwotCQl9Ci0JfQotCQlicmVhazsKLQljYXNlIEhBTF9PRE1fUDJQX1NUQVRFOgotCQlPRE1fQ21uSW5mb1VwZGF0ZTIzYShwb2RtcHJpdiwgT0RNX0NNTklORk9fV0lGSV9ESVJFQ1QsIGJTZXQpOwotCQlicmVhazsKLQljYXNlIEhBTF9PRE1fV0lGSV9ESVNQTEFZX1NUQVRFOgotCQlPRE1fQ21uSW5mb1VwZGF0ZTIzYShwb2RtcHJpdiwgT0RNX0NNTklORk9fV0lGSV9ESVNQTEFZLCBiU2V0KTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIHJ0bDg3MjNhX25vdGNoX2ZpbHRlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgZW5hYmxlKQotewotCWlmIChlbmFibGUpIHsKLQkJREJHXzg3MjNBKCJFbmFibGUgbm90Y2ggZmlsdGVyXG4iKTsKLQkJcnRsODcyM2F1X3dyaXRlOChhZGFwdGVyLCByT0ZETTBfUnhEU1AgKyAxLAotCQkJCSBydGw4NzIzYXVfcmVhZDgoYWRhcHRlciwgck9GRE0wX1J4RFNQICsgMSkgfAotCQkJCSBCSVQoMSkpOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiRGlzYWJsZSBub3RjaCBmaWx0ZXJcbiIpOwotCQlydGw4NzIzYXVfd3JpdGU4KGFkYXB0ZXIsIHJPRkRNMF9SeERTUCArIDEsCi0JCQkgICBydGw4NzIzYXVfcmVhZDgoYWRhcHRlciwgck9GRE0wX1J4RFNQICsgMSkgJgotCQkJCSB+QklUKDEpKTsKLQl9Ci19Ci0KLWJvb2wgYzJoX2lkX2ZpbHRlcl9jY3hfODcyM2EodTggaWQpCi17Ci0JYm9vbCByZXQgPSBmYWxzZTsKLQlpZiAoaWQgPT0gQzJIX0NDWF9UWF9SUFQpCi0JCXJldCA9IHRydWU7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYzJoX2hhbmRsZXJfODcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGMyaF9ldnRfaGRyICpjMmhfZXZ0KQotewotCWludCByZXQgPSBfU1VDQ0VTUzsKLQl1OCBpID0gMDsKLQotCWlmIChjMmhfZXZ0ID09IE5VTEwpIHsKLQkJREJHXzg3MjNBKCIlcyBjMmhfZXZ0IGlzIE5VTExcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlzd2l0Y2ggKGMyaF9ldnQtPmlkKSB7Ci0JY2FzZSBDMkhfREJHOgotCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJDMkhDb21tYW5kSGFuZGxlcjogJXNcbiIsIGMyaF9ldnQtPnBheWxvYWQpOwotCQlicmVhazsKLQotCWNhc2UgQzJIX0NDWF9UWF9SUFQ6Ci0JCWhhbmRsZV90eHJwdF9jY3hfODcyM2EocGFkYXB0ZXIsIGMyaF9ldnQtPnBheWxvYWQpOwotCQlicmVhazsKLQljYXNlIEMySF9FWFRfUkFfUlBUOgotCQlicmVhazsKLQljYXNlIEMySF9IV19JTkZPX0VYQ0g6Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIltCVF0sIEMySF9IV19JTkZPX0VYQ0hcbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgYzJoX2V2dC0+cGxlbjsgaSsrKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiW0JUXSwgdG1wQnVmWyVkXT0gMHgleFxuIiwgaSwKLQkJCQkgYzJoX2V2dC0+cGF5bG9hZFtpXSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEMySF9DMkhfSDJDX1RFU1Q6Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIltCVF0sIEMySF9IMkNfVEVTVFxuIik7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIltCVF0sIHRtcEJ1ZlswXS9bMV0vWzJdL1szXS9bNF09IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgvIDB4JXhcbiIsCi0JCQkgYzJoX2V2dC0+cGF5bG9hZFswXSwKLQkJCSBjMmhfZXZ0LT5wYXlsb2FkWzFdLCBjMmhfZXZ0LT5wYXlsb2FkWzJdLAotCQkJIGMyaF9ldnQtPnBheWxvYWRbM10sIGMyaF9ldnQtPnBheWxvYWRbNF0pOwotCQlicmVhazsKLQotCWNhc2UgQzJIX0JUX0lORk86Ci0JCURCR184NzIzQSgiJXMgLCAgR290ICBDMkhfQlRfSU5GTyBcbiIsIF9fZnVuY19fKTsKLQkJcnRsODcyM2FfZndfYzJoX0JUX2luZm8ocGFkYXB0ZXIsCi0JCQkJCWMyaF9ldnQtPnBheWxvYWQsIGMyaF9ldnQtPnBsZW4pOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldCA9IF9GQUlMOwotCQlicmVhazsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBoYW5kbGVfdHhycHRfY2N4Xzg3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdm9pZCAqYnVmKQotewotCXN0cnVjdCB0eHJwdF9jY3hfODcyM2EgKnR4cnB0X2NjeCA9IGJ1ZjsKLQlzdHJ1Y3Qgc3VibWl0X2N0eCAqcGFja190eF9vcHMgPSAmYWRhcHRlci0+eG1pdHByaXYuYWNrX3R4X29wczsKLQotCWlmICh0eHJwdF9jY3gtPmludF9jY3ggJiYgYWRhcHRlci0+eG1pdHByaXYuYWNrX3R4KSB7Ci0JCWlmICh0eHJwdF9jY3gtPnBrdF9vaykKLQkJCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZwYWNrX3R4X29wcywKLQkJCQkJICAgICBSVFdfU0NUWF9ET05FX1NVQ0NFU1MpOwotCQllbHNlCi0JCQlydHcyM2Ffc2N0eF9kb25lX2VycigmcGFja190eF9vcHMsCi0JCQkJCSAgICAgUlRXX1NDVFhfRE9ORV9DQ1hfUEtUX0ZBSUwpOwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9Jbml0QW50ZW5uYV9TZWxlY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCB2YWw7Ci0KLQl2YWwgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19MRURDRkcyKTsKLQkvKiAgTGV0IDgwNTEgdGFrZSBjb250cm9sIGFudGVubmEgc2V0dGluZyAqLwotCXZhbCB8PSBCSVQoNyk7CQkvKiAgRFBEVF9TRUxfRU4sIDB4NENbMjNdICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0xFRENGRzIsIHZhbCk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfQ2hlY2tBbnRlbm5hX1NlbGVjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IHZhbDsKLQotCXZhbCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0xFRENGRzIpOwotCS8qICBMZXQgODA1MSB0YWtlIGNvbnRyb2wgYW50ZW5uYSBzZXR0aW5nICovCi0JaWYgKCEodmFsICYgQklUKDcpKSkgewotCQl2YWwgfD0gQklUKDcpOwkvKiAgRFBEVF9TRUxfRU4sIDB4NENbMjNdICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19MRURDRkcyLCB2YWwpOwotCX0KLX0KLQotdm9pZCBydGw4NzIzYV9EZWluaXRBbnRlbm5hX1NlbGVjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU4IHZhbDsKLQotCXZhbCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0xFRENGRzIpOwotCS8qICBMZXQgODA1MSB0YWtlIGNvbnRyb2wgYW50ZW5uYSBzZXR0aW5nICovCi0JdmFsICY9IH5CSVQoNyk7CQkvKiAgRFBEVF9TRUxfRU4sIGNsZWFyIDB4NENbMjNdICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0xFRENGRzIsIHZhbCk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfaW5pdF9kZWZhdWx0X3ZhbHVlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YTsKLQlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdjsKLQl1OCBpOwotCi0JcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQotCS8qICBpbml0IGRlZmF1bHQgdmFsdWUgKi8KLQlwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkID0gZmFsc2U7Ci0JaWYgKCFwYWRhcHRlci0+cHdyY3RybHByaXYuYmtlZXBmd2FsaXZlKQotCQlwSGFsRGF0YS0+TGFzdEhNRUJveE51bSA9IDA7Ci0KLQlwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKiAgaW5pdCBkbSBkZWZhdWx0IHZhbHVlICovCi0JcGRtcHJpdi0+VE1fVHJpZ2dlciA9IDA7CS8qIGZvciBJUUsgKi8KLS8qCXBkbXByaXYtPmJpbml0aWFsaXplZCA9IGZhbHNlOyAqLwotLyoJcGRtcHJpdi0+cHJ2X3RyYWZmaWNfaWR4ID0gMzsgKi8KLS8qCXBkbXByaXYtPmluaXRpYWxpemUgPSAwOyAqLwotCi0JcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQX2luZGV4ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgSFBfVEhFUk1BTF9OVU07IGkrKykKLQkJcGRtcHJpdi0+VGhlcm1hbFZhbHVlX0hQW2ldID0gMDsKLQotCS8qICBpbml0IEVmdXNlIHZhcmlhYmxlcyAqLwotCXBIYWxEYXRhLT5FZnVzZVVzZWRCeXRlcyA9IDA7Ci0JcEhhbERhdGEtPkJURWZ1c2VVc2VkQnl0ZXMgPSAwOwotfQotCi11OCBHZXRFRVBST01TaXplODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1OCBzaXplID0gMDsKLQl1MzIgY3I7Ci0KLQljciA9IHJ0bDg3MjNhdV9yZWFkMTYocGFkYXB0ZXIsIFJFR185MzQ2Q1IpOwotCS8qICA2OiBFRVBST00gdXNlZCBpcyA5M0M0NiwgNDogYm9vdCBmcm9tIEUtRnVzZS4gKi8KLQlzaXplID0gKGNyICYgQk9PVF9GUk9NX0VFUFJPTSkgPyA2IDogNDsKLQotCU1TR184NzIzQSgiRUVQUk9NIHR5cGUgaXMgJXNcbiIsIHNpemUgPT0gNCA/ICJFLUZVU0UiIDogIjkzQzQ2Iik7Ci0KLQlyZXR1cm4gc2l6ZTsKLX0KLQotLyogICovCi0vKiAgKi8KLS8qICBMTFQgUi9XL0luaXQgZnVuY3Rpb24gKi8KLS8qICAqLwotLyogICovCi1zdGF0aWMgaW50IF9MTFRXcml0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYWRkcmVzcywgdTMyIGRhdGEpCi17Ci0JaW50IHN0YXR1cyA9IF9TVUNDRVNTOwotCXMzMiBjb3VudCA9IDA7Ci0JdTMyIHZhbHVlID0gX0xMVF9JTklUX0FERFIoYWRkcmVzcykgfCBfTExUX0lOSVRfREFUQShkYXRhKSB8Ci0JCSAgICBfTExUX09QKF9MTFRfV1JJVEVfQUNDRVNTKTsKLQl1MTYgTExUUmVnID0gUkVHX0xMVF9JTklUOwotCi0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIExMVFJlZywgdmFsdWUpOwotCi0JLyogcG9sbGluZyAqLwotCWRvIHsKLQkJdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBMTFRSZWcpOwotCQlpZiAoX0xMVF9OT19BQ1RJVkUgPT0gX0xMVF9PUF9WQUxVRSh2YWx1ZSkpCi0JCQlicmVhazsKLQotCQlpZiAoY291bnQgPiBQT0xMSU5HX0xMVF9USFJFU0hPTEQpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgIkZhaWxlZCB0byBwb2xsaW5nIHdyaXRlIExMVCBkb25lIGF0IGFkZHJlc3MgJWQhXG4iLAotCQkJCSBhZGRyZXNzKTsKLQkJCXN0YXR1cyA9IF9GQUlMOwotCQkJYnJlYWs7Ci0JCX0KLQl9IHdoaWxlIChjb3VudCsrKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBJbml0TExUVGFibGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGJvdW5kYXJ5KQotewotCWludCBzdGF0dXMgPSBfU1VDQ0VTUzsKLQl1MzIgaTsKLQl1MzIgdHhwa3RidWZfYm5keSA9IGJvdW5kYXJ5OwotCXUzMiBMYXN0X0VudHJ5X09mX1R4UGt0QnVmID0gTEFTVF9FTlRSWV9PRl9UWF9QS1RfQlVGRkVSOwotCi0JZm9yIChpID0gMDsgaSA8ICh0eHBrdGJ1Zl9ibmR5IC0gMSk7IGkrKykgewotCQlzdGF0dXMgPSBfTExUV3JpdGUocGFkYXB0ZXIsIGksIGkgKyAxKTsKLQkJaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykKLQkJCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JLyogIGVuZCBvZiBsaXN0ICovCi0Jc3RhdHVzID0gX0xMVFdyaXRlKHBhZGFwdGVyLCAodHhwa3RidWZfYm5keSAtIDEpLCAweEZGKTsKLQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKQotCQlyZXR1cm4gc3RhdHVzOwotCi0JLyogIE1ha2UgdGhlIG90aGVyIHBhZ2VzIGFzIHJpbmcgYnVmZmVyICovCi0JLyogIFRoaXMgcmluZyBidWZmZXIgaXMgdXNlZCBhcyBiZWFjb24gYnVmZmVyIGlmIHdlIGNvbmZpZyB0aGlzCi0JICAgIE1BQyBhcyB0d28gTUFDIHRyYW5zZmVyLiAqLwotCS8qICBPdGhlcndpc2UgdXNlZCBhcyBsb2NhbCBsb29wYmFjayBidWZmZXIuICovCi0JZm9yIChpID0gdHhwa3RidWZfYm5keTsgaSA8IExhc3RfRW50cnlfT2ZfVHhQa3RCdWY7IGkrKykgewotCQlzdGF0dXMgPSBfTExUV3JpdGUocGFkYXB0ZXIsIGksIChpICsgMSkpOwotCQlpZiAoX1NVQ0NFU1MgIT0gc3RhdHVzKQotCQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQkvKiAgTGV0IGxhc3QgZW50cnkgcG9pbnQgdG8gdGhlIHN0YXJ0IGVudHJ5IG9mIHJpbmcgYnVmZmVyICovCi0Jc3RhdHVzID0gX0xMVFdyaXRlKHBhZGFwdGVyLCBMYXN0X0VudHJ5X09mX1R4UGt0QnVmLCB0eHBrdGJ1Zl9ibmR5KTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyB2b2lkIF9EaXNhYmxlR1BJTyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotai4gR1BJT19QSU5fQ1RSTCAweDQ0WzMxOjBdPSAweDAwMAotay5WYWx1ZSA9IEdQSU9fUElOX0NUUkxbNzowXQotbC4gR1BJT19QSU5fQ1RSTCAweDQ0WzMxOjBdID0gMHgwMEZGMDAwMCB8ICh2YWx1ZSA8PDgpOyB3cml0ZSBleHRlcm5hbCBQSU4gbGV2ZWwKLW0uIEdQSU9fTVVYQ0ZHIDB4NDIgWzE1OjBdID0gMHgwNzgwCi1uLiBMRURDRkcgMHg0Q1sxNTowXSA9IDB4ODA4MAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXUzMiB2YWx1ZTMyOwotCXUzMiB1NGJUbXA7Ci0KLQkvKiAxLiBEaXNhYmxlIEdQSU9bNzowXSAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfR1BJT19QSU5fQ1RSTCArIDIsIDB4MDAwMCk7Ci0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19HUElPX1BJTl9DVFJMKSAmIDB4RkZGRjAwRkY7Ci0JdTRiVG1wID0gdmFsdWUzMiAmIDB4MDAwMDAwRkY7Ci0JdmFsdWUzMiB8PSAoKHU0YlRtcCA8PCA4KSB8IDB4MDBGRjAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfR1BJT19QSU5fQ1RSTCwgdmFsdWUzMik7Ci0KLQkvKiAgKi8KLQkvKiAgPFJvZ2VyX05vdGVzPiBGb3IgUlRMODcyM3UgbXVsdGktZnVuY3Rpb24gY29uZmlndXJhdGlvbiB3aGljaAotCSAgICB3YXMgYXV0b2xvYWQgZnJvbSBFZnVzZSBvZmZzZXQgMHgwYSBhbmQgMHgwYiwgKi8KLQkvKiAgV0xBTiBIVyBHUElPWzldLCBHUFMgSFcgR1BJT1sxMF0gYW5kIEJUIEhXIEdQSU9bMTFdLiAqLwotCS8qICBBZGRlZCBieSBSb2dlciwgMjAxMC4xMC4wNy4gKi8KLQkvKiAgKi8KLQkvKiAyLiBEaXNhYmxlIEdQSU9bOF0gYW5kIEdQSU9bMTJdICovCi0KLQkvKiAgQ29uZmlndXJlIGFsbCBwaW5zIGFzIGlucHV0IG1vZGUuICovCi0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19HUElPX0lPX1NFTF8yLCAweDAwMDApOwotCXZhbHVlMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfR1BJT19QSU5fQ1RSTF8yKSAmIDB4RkZGRjAwMUY7Ci0JdTRiVG1wID0gdmFsdWUzMiAmIDB4MDAwMDAwMUY7Ci0JLyogIFNldCBwaW4gOCwgMTAsIDExIGFuZCBwaW4gMTIgdG8gb3V0cHV0IG1vZGUuICovCi0JdmFsdWUzMiB8PSAoKHU0YlRtcCA8PCA4KSB8IDB4MDAxRDAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfR1BJT19QSU5fQ1RSTF8yLCB2YWx1ZTMyKTsKLQotCS8qIDMuIERpc2FibGUgTEVEMCAmIDEgKi8KLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX0xFRENGRzAsIDB4ODA4MCk7Ci19CQkJCS8qIGVuZCBvZiBfRGlzYWJsZUdQSU8oKSAqLwotCi1zdGF0aWMgdm9pZCBfRGlzYWJsZVJGQUZFQW5kUmVzZXRCQjgxOTJDKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWEuCVRYUEFVU0UgMHg1MjJbNzowXSA9IDB4RkYJCVBhdXNlIE1BQyBUWCBxdWV1ZQotYi4JUkYgcGF0aCAwIG9mZnNldCAweDAwID0gMHgwMAkJZGlzYWJsZSBSRgotYy4JQVBTRF9DVFJMIDB4NjAwWzc6MF0gPSAweDQwCi1kLglTWVNfRlVOQ19FTiAweDAyWzc6MF0gPSAweDE2CQlyZXNldCBCQiBzdGF0ZSBtYWNoaW5lCi1lLglTWVNfRlVOQ19FTiAweDAyWzc6MF0gPSAweDE0CQlyZXNldCBCQiBzdGF0ZSBtYWNoaW5lCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0JdTggdmFsdWU4OwotCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1RYUEFVU0UsIDB4RkYpOwotCi0JUEhZX1NldFJGUmVnKHBhZGFwdGVyLCBSRl9QQVRIX0EsIDB4MCwgYk1hc2tCeXRlMCwgMHgwKTsKLQotCXZhbHVlOCA9IEFQU0RPRkY7Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0FQU0RfQ1RSTCwgdmFsdWU4KTsJLyogMHg0MCAqLwotCi0JLyogIFNldCBCQiByZXNldCBhdCBmaXJzdCAqLwotCXZhbHVlOCA9IEZFTl9VU0JEIHwgRkVOX1VTQkEgfCBGRU5fQkJfR0xCX1JTVG47Ci0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOLCB2YWx1ZTgpOwkvKiAweDE2ICovCi0KLQkvKiAgU2V0IGdsb2JhbCByZXNldC4gKi8KLQl2YWx1ZTggJj0gfkZFTl9CQl9HTEJfUlNUbjsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4sIHZhbHVlOCk7CS8qIDB4MTQgKi8KLQotCS8qICAyMDEwLzA4LzEyIE1IIFdlIG5lZWQgdG8gc2V0IEJCL0dMQkFMIHJlc2V0IHRvIHNhdmUgcG93ZXIKLQkgICAgZm9yIFNTIG1vZGUuICovCi19Ci0KLXN0YXRpYyB2b2lkIF9SZXNldERpZ2l0YWxQcm9jZWR1cmUxXzkyQyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQlib29sIGJXaXRob3V0SFdTTSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmIChJU19GV184MXh4QyhwYWRhcHRlcikgJiYgKHBIYWxEYXRhLT5GaXJtd2FyZVZlcnNpb24gPD0gMHgyMCkpIHsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQlmLglNQ1VGV0RMIDB4ODBbNzowXT0gMAkJcmVzZXQgTUNVIHJlYWR5IHN0YXR1cwotCWcuCVNZU19GVU5DX0VOIDB4MDJbMTBdPSAwCQlyZXNldCBNQ1UgcmVnaXN0ZXIsICg4MDUxIHJlc2V0KQotCWguCVNZU19GVU5DX0VOIDB4MDJbMTUtMTJdPSA1CXJlc2V0IE1BQyByZWdpc3RlciwgRENPUkUKLQlpLiAgICAgU1lTX0ZVTkNfRU4gMHgwMlsxMF09IDEJCWVuYWJsZSBNQ1UgcmVnaXN0ZXIsCi0JCQkJCQkoODA1MSBlbmFibGUpCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCQl1MTYgdmFsdTE2OwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfTUNVRldETCwgMCk7Ci0KLQkJdmFsdTE2ID0gcnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKTsKLQkJLyogcmVzZXQgTUNVICwgODA1MSAqLwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOLAotCQkJCSAgdmFsdTE2ICYgfkZFTl9DUFVFTik7Ci0KLQkJdmFsdTE2ID0gcnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKSAmIDB4MEZGRjsKLQkJLyogcmVzZXQgTUFDICovCi0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4sCi0JCQkJICB2YWx1MTYgfCBGRU5fSFdQRE4gfCBGRU5fRUxEUik7Ci0KLQkJdmFsdTE2ID0gcnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKTsKLQkJLyogZW5hYmxlIE1DVSAsIDgwNTEgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiwKLQkJCQkgIHZhbHUxNiB8IEZFTl9DUFVFTik7Ci0JfSBlbHNlIHsKLQkJdTggcmV0cnlfY250cyA9IDA7Ci0JCXU4IHZhbDg7Ci0KLQkJdmFsOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX01DVUZXREwpOwotCi0JCS8qICAyMDEwLzA4LzEyIE1IIEZvciBVU0IgU1MsIHdlIGNhbiBub3Qgc3RvcCA4MDUxIHdoZW4gd2UKLQkJICAgIGFyZSB0cnlpbmcgdG8gZW50ZXIgSVBTL0hXJlNXIHJhZGlvIG9mZi4gRm9yCi0JCSAgICBTMy9TNC9TNS9EaXNhYmxlLCB3ZSBjYW4gc3RvcCA4MDUxIGJlY2F1c2UgKi8KLQkJLyogIHdlIHdpbGwgaW5pdCBGVyB3aGVuIHBvd2VyIG9uIGFnYWluLiAqLwotCQkvKiAgSWYgd2Ugd2FudCB0byBTUyBtb2RlLCB3ZSBjYW4gbm90IHJlc2V0IDgwNTEuICovCi0JCWlmICgodmFsOCAmIEJJVCgxKSkgJiYgcGFkYXB0ZXItPmJGV1JlYWR5KSB7Ci0JCQkvKiBJRiBmdyBpbiBSQU0gY29kZSwgZG8gcmVzZXQgKi8KLQkJCS8qICAyMDEwLzA4LzI1IE1IIEFjY29yZGluZyB0byBSRCBhbGZyZWQncwotCQkJICAgIHN1Z2dlc3Rpb24sIHdlIG5lZWQgdG8gZGlzYWJsZSBvdGhlciAqLwotCQkJLyogIEhSQ1YgSU5UIHRvIGluZmx1ZW5jZSA4MDUxIHJlc2V0LiAqLwotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZXSU1SLCAweDIwKTsKLQkJCS8qICAyMDExLzAyLzE1IE1IIEFjY29yZGluZyB0byBBbGV4J3MKLQkJCSAgICBzdWdnZXN0aW9uLCBjbG9zZSBtYXNrIHRvIHByZXZlbnQKLQkJCSAgICBpbmNvcnJlY3QgRlcgd3JpdGUgb3BlcmF0aW9uLiAqLwotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0ZUSU1SLCAweDAwKTsKLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GU0lNUiwgMHgwMCk7Ci0KLQkJCS8qIDgwNTEgcmVzZXQgYnkgc2VsZiAqLwotCQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0hNRVRGUiArIDMsIDB4MjApOwotCi0JCQl3aGlsZSAoKHJldHJ5X2NudHMrKyA8IDEwMCkgJiYKLQkJCSAgICAgICAocnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKSAmCi0JCQkJRkVOX0NQVUVOKSkgewotCQkJCXVkZWxheSg1MCk7CS8qIHVzICovCi0JCQl9Ci0KLQkJCWlmIChyZXRyeV9jbnRzID49IDEwMCkgewotCQkJCS8qIFJlc2V0IE1BQyBhbmQgRW5hYmxlIDgwNTEgKi8KLQkJCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLAotCQkJCQkJIFJFR19TWVNfRlVOQ19FTiArIDEsIDB4NTApOwotCQkJCW1kZWxheSgxMCk7Ci0JCQl9Ci0JCX0KLQkJLyogUmVzZXQgTUFDIGFuZCBFbmFibGUgODA1MSAqLwotCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4gKyAxLCAweDU0KTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX01DVUZXREwsIDApOwotCX0KLQotCWlmIChiV2l0aG91dEhXU00pIHsKLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJV2l0aG91dCBIVyBhdXRvIHN0YXRlIG1hY2hpbmUKLQlnLglTWVNfQ0xLUiAweDA4WzE1OjBdID0gMHgzMEEzCQlkaXNhYmxlIE1BQyBjbG9jawotCWguCUFGRV9QTExfQ1RSTCAweDI4Wzc6MF0gPSAweDgwCQlkaXNhYmxlIEFGRSBQTEwKLQlpLglBRkVfWFRBTF9DVFJMIDB4MjRbMTU6MF0gPSAweDg4MEYJZ2F0ZWQgQUZFIERJR19DTE9DSwotCWouCVNZU19JU09fQ1RSTCAweDAwWzc6MF0gPSAweEY5CQlpc29sYXRlZCBkaWdpdGFsIHRvIFBPTgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJLyogbW9kaWZ5IHRvIDB4NzBBMyBieSBTY290dC4gKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19TWVNfQ0xLUiwgMHg3MEEzKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCwgMHg4MCk7Ci0JCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfQUZFX1hUQUxfQ1RSTCwgMHg4ODBGKTsKLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NZU19JU09fQ1RSTCwgMHhGOSk7Ci0JfSBlbHNlIHsKLQkJLyogIERpc2FibGUgYWxsIFJGL0JCIHBvd2VyICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SRl9DVFJMLCAweDAwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9SZXNldERpZ2l0YWxQcm9jZWR1cmUyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLWsuCVNZU19GVU5DX0VOIDB4MDNbNzowXSA9IDB4NDQJCWRpc2FibGUgRUxEUiBydW5jdGlvbgotbC4JU1lTX0NMS1IgMHgwOFsxNTowXSA9IDB4MzA4MwkJZGlzYWJsZSBFTERSIGNsb2NrCi1tLglTWVNfSVNPX0NUUkwgMHgwMVs3OjBdID0gMHg4MwkJaXNvbGF0ZWQgRUxEUiB0byBQT04KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiBtb2RpZnkgdG8gMHg3MGEzIGJ5IFNjb3R0LiAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfU1lTX0NMS1IsIDB4NzBhMyk7Ci0JLyogbW9kaWZ5IHRvIDB4ODIgYnkgU2NvdHQuICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NZU19JU09fQ1RSTCArIDEsIDB4ODIpOwotfQotCi1zdGF0aWMgdm9pZCBfRGlzYWJsZUFuYWxvZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBib29sIGJXaXRob3V0SFdTTSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQl1MTYgdmFsdWUxNjsKLQl1OCB2YWx1ZTg7Ci0KLQlpZiAoYldpdGhvdXRIV1NNKSB7Ci0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0Jbi4JTERPQTE1X0NUUkwgMHgyMFs3OjBdID0gMHgwNAlkaXNhYmxlIEExNSBwb3dlcgotCW8uCUxET1YxMkRfQ1RSTCAweDIxWzc6MF0gPSAweDU0CWRpc2FibGUgZGlnaXRhbCBjb3JlIHBvd2VyCi0Jci4JV2hlbiBkcml2ZXIgY2FsbCBkaXNhYmxlLCB0aGUgQVNJQyB3aWxsIHR1cm4gb2ZmIHJlbWFpbmluZwotCQljbG9jayBhdXRvbWF0aWNhbGx5Ci0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19MRE9BMTVfQ1RSTCwgMHgwNCk7Ci0JCS8qIHJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19MRE9WMTJEX0NUUkwsIDB4NTQpOyAqLwotCi0JCXZhbHVlOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0xET1YxMkRfQ1RSTCk7Ci0JCXZhbHVlOCAmPSB+TERWMTJfRU47Ci0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19MRE9WMTJEX0NUUkwsIHZhbHVlOCk7Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JaC4JU1BTMF9DVFJMIDB4MTFbNzowXSA9IDB4MjMJCWVudGVyIFBGTSBtb2RlCi0JaS4JQVBTX0ZTTUNPIDB4MDRbMTU6MF0gPSAweDQ4MDIJCXNldCBVU0Igc3VzcGVuZAotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl2YWx1ZTggPSAweDIzOwotCWlmIChJU184MXh4Q19WRU5ET1JfVU1DX0JfQ1VUKHBIYWxEYXRhLT5WZXJzaW9uSUQpKQotCQl2YWx1ZTggfD0gQklUKDMpOwotCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1NQUzBfQ1RSTCwgdmFsdWU4KTsKLQotCWlmIChiV2l0aG91dEhXU00pIHsKLQkJLyogdmFsdWUxNiB8PSAoQVBETV9IT1NUIHwgRlNNX0hTVVMgfC9QRk1fQUxETik7ICovCi0JCS8qICAyMDEwLzA4LzMxIEFjY29yZGluZyB0byBGaWxlbiBkZXNjcmlwdGlvbiwgd2UgbmVlZCB0bwotCQkgICAgdXNlIEhXIHRvIHNodXQgZG93biA4MDUxIGF1dG9tYXRpY2FsbHkuICovCi0JCS8qICBCZWNhdXNlIHN1c3BlbmQgb3BlcmF0aW9uIG5lZWQgdGhlIGFzaXN0YW5jZSBvZiA4MDUxCi0JCSAgICB0byB3YWl0IGZvciAzbXMuICovCi0JCXZhbHVlMTYgPSBBUERNX0hPU1QgfCBBRlNNX0hTVVMgfCBQRk1fQUxETjsKLQl9IGVsc2UgewotCQl2YWx1ZTE2ID0gQVBETV9IT1NUIHwgQUZTTV9IU1VTIHwgUEZNX0FMRE47Ci0JfQotCi0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19BUFNfRlNNQ08sIHZhbHVlMTYpOwkvKiAweDQ4MDIgKi8KLQotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19SU1ZfQ1RSTCwgMHgwZSk7Ci19Ci0KLS8qICBIVyBBdXRvIHN0YXRlIG1hY2hpbmUgKi8KLWludCBDYXJkRGlzYWJsZUhXU00oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggcmVzZXRNQ1UpCi17Ci0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQkvKiAgUkYgT2ZmIFNlcXVlbmNlID09PT0gKi8KLQlfRGlzYWJsZVJGQUZFQW5kUmVzZXRCQjgxOTJDKHBhZGFwdGVyKTsKLQotCS8qICAgPT09PSBSZXNldCBkaWdpdGFsIHNlcXVlbmNlICAgPT09PT09ICovCi0JX1Jlc2V0RGlnaXRhbFByb2NlZHVyZTFfOTJDKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQkvKiAgID09PT0gUHVsbCBHUElPIFBJTiB0byBiYWxhbmNlIGxldmVsIGFuZCBMRUQgY29udHJvbCA9PT09PT0gKi8KLQlfRGlzYWJsZUdQSU8ocGFkYXB0ZXIpOwotCi0JLyogICA9PT09IERpc2FibGUgYW5hbG9nIHNlcXVlbmNlID09PSAqLwotCV9EaXNhYmxlQW5hbG9nKHBhZGFwdGVyLCBmYWxzZSk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICI9PT09PT0+IENhcmQgZGlzYWJsZSBmaW5pc2hlZC5cbiIpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKiAgd2l0aG91dCBIVyBBdXRvIHN0YXRlIG1hY2hpbmUgKi8KLWludCBDYXJkRGlzYWJsZVdpdGhvdXRIV1NNKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKQotCQlyZXR1cm4gX1NVQ0NFU1M7Ci0KLQkvKiAgUkYgT2ZmIFNlcXVlbmNlID09PT0gKi8KLQlfRGlzYWJsZVJGQUZFQW5kUmVzZXRCQjgxOTJDKHBhZGFwdGVyKTsKLQotCS8qICAgPT09PSBSZXNldCBkaWdpdGFsIHNlcXVlbmNlICAgPT09PT09ICovCi0JX1Jlc2V0RGlnaXRhbFByb2NlZHVyZTFfOTJDKHBhZGFwdGVyLCB0cnVlKTsKLQotCS8qICAgPT09PSBQdWxsIEdQSU8gUElOIHRvIGJhbGFuY2UgbGV2ZWwgYW5kIExFRCBjb250cm9sID09PT09PSAqLwotCV9EaXNhYmxlR1BJTyhwYWRhcHRlcik7Ci0KLQkvKiAgID09PT0gUmVzZXQgZGlnaXRhbCBzZXF1ZW5jZSAgID09PT09PSAqLwotCV9SZXNldERpZ2l0YWxQcm9jZWR1cmUyKHBhZGFwdGVyKTsKLQotCS8qICAgPT09PSBEaXNhYmxlIGFuYWxvZyBzZXF1ZW5jZSA9PT0gKi8KLQlfRGlzYWJsZUFuYWxvZyhwYWRhcHRlciwgdHJ1ZSk7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgSGFsX0luaXRQR0RhdGEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKlBST01Db250ZW50KQotewotCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihwYWRhcHRlcik7Ci0KLQlpZiAoIXBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpIHsJLyogIGF1dG9sb2FkIE9LLiAqLwotCQlpZiAoIXBFRVBST00tPkVlcHJvbU9yRWZ1c2UpIHsKLQkJCS8qICBSZWFkIEVGVVNFIHJlYWwgbWFwIHRvIHNoYWRvdy4gKi8KLQkJCUVGVVNFX1NoYWRvd01hcFVwZGF0ZTIzYShwYWRhcHRlciwgRUZVU0VfV0lGSSk7Ci0JCQltZW1jcHkoUFJPTUNvbnRlbnQsIHBFRVBST00tPmVmdXNlX2VlcHJvbV9kYXRhLAotCQkJICAgICAgIEhXU0VUX01BWF9TSVpFKTsKLQkJfQotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgIkF1dG9Mb2FkIEZhaWwgcmVwb3J0ZWQgZnJvbSBDUjkzNDYhIVxuIik7Ci0JCS8qIHVwZGF0ZSB0byBkZWZhdWx0IHZhbHVlIDB4RkYgKi8KLQkJaWYgKCFwRUVQUk9NLT5FZXByb21PckVmdXNlKQotCQkJRUZVU0VfU2hhZG93TWFwVXBkYXRlMjNhKHBhZGFwdGVyLCBFRlVTRV9XSUZJKTsKLQkJbWVtY3B5KFBST01Db250ZW50LCBwRUVQUk9NLT5lZnVzZV9lZXByb21fZGF0YSwKLQkJICAgICAgIEhXU0VUX01BWF9TSVpFKTsKLQl9Ci19Ci0KLXZvaWQgSGFsX0VmdXNlUGFyc2VJRENvZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbykKLXsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYocGFkYXB0ZXIpOwotLyoJc3RydWN0IGhhbF9kYXRhXzg3MjNhCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7ICovCi0JdTE2IEVFUFJPTUlkOwotCi0JLyogIENoZWNsIDB4ODEyOSBhZ2FpbiBmb3IgbWFraW5nIHN1cmUgYXV0b2xvYWQgc3RhdHVzISEgKi8KLQlFRVBST01JZCA9IGxlMTZfdG9fY3B1KCooKF9fbGUxNiAqKSBod2luZm8pKTsKLQlpZiAoRUVQUk9NSWQgIT0gUlRMX0VFUFJPTV9JRCkgewotCQlEQkdfODcyM0EoIkVFUFJPTSBJRCglI3gpIGlzIGludmFsaWQhIVxuIiwgRUVQUk9NSWQpOwotCQlwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnID0gdHJ1ZTsKLQl9IGVsc2UgewotCQlwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnID0gZmFsc2U7Ci0JfQotCi0JUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICJFRVBST00gSUQgPSAweCUwNHhcbiIsIEVFUFJPTUlkKTsKLX0KLQotc3RhdGljIHZvaWQKLUhhbF9SZWFkUG93ZXJWYWx1ZUZyb21QUk9NXzg3MjNBKHN0cnVjdCB0eHBvd2VyaW5mbyAqcHdySW5mbywKLQkJCQkgdTggKlBST01Db250ZW50LCBib29sIEF1dG9Mb2FkRmFpbCkKLXsKLQl1MzIgcmZQYXRoLCBlZUFkZHIsIGdyb3VwLCByZlBhdGhNYXggPSAxOwotCi0JbWVtc2V0KHB3ckluZm8sIDAsIHNpemVvZigqcHdySW5mbykpOwotCi0JaWYgKEF1dG9Mb2FkRmFpbCkgewotCQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBNQVhfQ0hOTF9HUk9VUDsgZ3JvdXArKykgewotCQkJZm9yIChyZlBhdGggPSAwOyByZlBhdGggPCByZlBhdGhNYXg7IHJmUGF0aCsrKSB7Ci0JCQkJcHdySW5mby0+Q0NLSW5kZXhbcmZQYXRoXVtncm91cF0gPQotCQkJCQlFRVBST01fRGVmYXVsdF9UeFBvd2VyTGV2ZWw7Ci0JCQkJcHdySW5mby0+SFQ0MF8xU0luZGV4W3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkJRUVQUk9NX0RlZmF1bHRfVHhQb3dlckxldmVsOwotCQkJCXB3ckluZm8tPkhUNDBfMlNJbmRleERpZmZbcmZQYXRoXVtncm91cF0gPQotCQkJCQlFRVBST01fRGVmYXVsdF9IVDQwXzJTRGlmZjsKLQkJCQlwd3JJbmZvLT5IVDIwSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkJRUVQUk9NX0RlZmF1bHRfSFQyMF9EaWZmOwotCQkJCXB3ckluZm8tPk9GRE1JbmRleERpZmZbcmZQYXRoXVtncm91cF0gPQotCQkJCQlFRVBST01fRGVmYXVsdF9MZWdhY3lIVFR4UG93ZXJEaWZmOwotCQkJCXB3ckluZm8tPkhUNDBNYXhPZmZzZXRbcmZQYXRoXVtncm91cF0gPQotCQkJCQlFRVBST01fRGVmYXVsdF9IVDQwX1B3ck1heE9mZnNldDsKLQkJCQlwd3JJbmZvLT5IVDIwTWF4T2Zmc2V0W3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkJRUVQUk9NX0RlZmF1bHRfSFQyMF9Qd3JNYXhPZmZzZXQ7Ci0JCQl9Ci0JCX0KLQkJcHdySW5mby0+VFNTSV9BWzBdID0gRUVQUk9NX0RlZmF1bHRfVFNTSTsKLQkJcmV0dXJuOwotCX0KLQotCWZvciAocmZQYXRoID0gMDsgcmZQYXRoIDwgcmZQYXRoTWF4OyByZlBhdGgrKykgewotCQlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBNQVhfQ0hOTF9HUk9VUDsgZ3JvdXArKykgewotCQkJZWVBZGRyID0KLQkJCSAgICBFRVBST01fQ0NLX1RYX1BXUl9JTlhfODcyM0EgKyAocmZQYXRoICogMykgKyBncm91cDsKLQotCQkJcHdySW5mby0+Q0NLSW5kZXhbcmZQYXRoXVtncm91cF0gPSBQUk9NQ29udGVudFtlZUFkZHJdOwotCQkJaWYgKHB3ckluZm8tPkNDS0luZGV4W3JmUGF0aF1bZ3JvdXBdID4gNjMpCi0JCQkJcHdySW5mby0+Q0NLSW5kZXhbcmZQYXRoXVtncm91cF0gPQotCQkJCQlFRVBST01fRGVmYXVsdF9UeFBvd2VyTGV2ZWw7Ci0KLQkJCWVlQWRkciA9IEVFUFJPTV9IVDQwXzFTX1RYX1BXUl9JTlhfODcyM0EgKwotCQkJCShyZlBhdGggKiAzKSArIGdyb3VwOwotCQkJcHdySW5mby0+SFQ0MF8xU0luZGV4W3JmUGF0aF1bZ3JvdXBdID0KLQkJCQlQUk9NQ29udGVudFtlZUFkZHJdOwotCQkJaWYgKHB3ckluZm8tPkhUNDBfMVNJbmRleFtyZlBhdGhdW2dyb3VwXSA+IDYzKQotCQkJCXB3ckluZm8tPkhUNDBfMVNJbmRleFtyZlBhdGhdW2dyb3VwXSA9Ci0JCQkJCUVFUFJPTV9EZWZhdWx0X1R4UG93ZXJMZXZlbDsKLQkJfQotCX0KLQotCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IE1BWF9DSE5MX0dST1VQOyBncm91cCsrKSB7Ci0JCWZvciAocmZQYXRoID0gMDsgcmZQYXRoIDwgcmZQYXRoTWF4OyByZlBhdGgrKykgewotCQkJcHdySW5mby0+SFQ0MF8yU0luZGV4RGlmZltyZlBhdGhdW2dyb3VwXSA9IDA7Ci0JCQlwd3JJbmZvLT5IVDIwSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdID0KLQkJCQkoUFJPTUNvbnRlbnQKLQkJCQkgW0VFUFJPTV9IVDIwX1RYX1BXUl9JTlhfRElGRl84NzIzQSArCi0JCQkJICBncm91cF0gPj4gKHJmUGF0aCAqIDQpKSAmIDB4RjsKLQkJCS8qIDRiaXQgc2lnbiBudW1iZXIgdG8gOCBiaXQgc2lnbiBudW1iZXIgKi8KLQkJCWlmIChwd3JJbmZvLT5IVDIwSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdICYgQklUKDMpKQotCQkJCXB3ckluZm8tPkhUMjBJbmRleERpZmZbcmZQYXRoXVtncm91cF0gfD0gMHhGMDsKLQotCQkJcHdySW5mby0+T0ZETUluZGV4RGlmZltyZlBhdGhdW2dyb3VwXSA9Ci0JCQkJKFBST01Db250ZW50W0VFUFJPTV9PRkRNX1RYX1BXUl9JTlhfRElGRl84NzIzQSArCi0JCQkJCSAgICAgZ3JvdXBdID4+IChyZlBhdGggKiA0KSkgJiAweEY7Ci0KLQkJCXB3ckluZm8tPkhUNDBNYXhPZmZzZXRbcmZQYXRoXVtncm91cF0gPQotCQkJCShQUk9NQ29udGVudFtFRVBST01fSFQ0MF9NQVhfUFdSX09GRlNFVF84NzIzQSArCi0JCQkJCSAgICAgZ3JvdXBdID4+IChyZlBhdGggKiA0KSkgJiAweEY7Ci0KLQkJCXB3ckluZm8tPkhUMjBNYXhPZmZzZXRbcmZQYXRoXVtncm91cF0gPQotCQkJCShQUk9NQ29udGVudFtFRVBST01fSFQyMF9NQVhfUFdSX09GRlNFVF84NzIzQSArCi0JCQkJCSAgICAgZ3JvdXBdID4+IChyZlBhdGggKiA0KSkgJiAweEY7Ci0JCX0KLQl9Ci0KLQlwd3JJbmZvLT5UU1NJX0FbMF0gPSBQUk9NQ29udGVudFtFRVBST01fVFNTSV9BXzg3MjNBXTsKLX0KLQotc3RhdGljIHU4IEhhbF9HZXRDaG5sR3JvdXAodTggY2hubCkKLXsKLQl1OCBncm91cCA9IDA7Ci0KLQlpZiAoY2hubCA8IDMpCQkvKiAgQ2phbmVsIDEtMyAqLwotCQlncm91cCA9IDA7Ci0JZWxzZSBpZiAoY2hubCA8IDkpCS8qICBDaGFubmVsIDQtOSAqLwotCQlncm91cCA9IDE7Ci0JZWxzZQkJCS8qICBDaGFubmVsIDEwLTE0ICovCi0JCWdyb3VwID0gMjsKLQotCXJldHVybiBncm91cDsKLX0KLQotdm9pZAotSGFsX0VmdXNlUGFyc2V0eHBvd2VyaW5mb184NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXU4ICpQUk9NQ29udGVudCwgYm9vbCBBdXRvTG9hZEZhaWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IHR4cG93ZXJpbmZvIHB3ckluZm87Ci0JdTggcmZQYXRoLCBjaCwgZ3JvdXAsIHJmUGF0aE1heCA9IDE7Ci0JdTggcHdyLCBkaWZmOwotCi0JSGFsX1JlYWRQb3dlclZhbHVlRnJvbVBST01fODcyM0EoJnB3ckluZm8sIFBST01Db250ZW50LCBBdXRvTG9hZEZhaWwpOwotCWZvciAocmZQYXRoID0gMDsgcmZQYXRoIDwgcmZQYXRoTWF4OyByZlBhdGgrKykgewotCQlmb3IgKGNoID0gMDsgY2ggPCBDSEFOTkVMX01BWF9OVU1CRVI7IGNoKyspIHsKLQkJCWdyb3VwID0gSGFsX0dldENobmxHcm91cChjaCk7Ci0KLQkJCXBIYWxEYXRhLT5UeFB3ckxldmVsQ2NrW3JmUGF0aF1bY2hdID0KLQkJCQlwd3JJbmZvLkNDS0luZGV4W3JmUGF0aF1bZ3JvdXBdOwotCQkJcEhhbERhdGEtPlR4UHdyTGV2ZWxIVDQwXzFTW3JmUGF0aF1bY2hdID0KLQkJCQlwd3JJbmZvLkhUNDBfMVNJbmRleFtyZlBhdGhdW2dyb3VwXTsKLQotCQkJcEhhbERhdGEtPlR4UHdySHQyMERpZmZbcmZQYXRoXVtjaF0gPQotCQkJCXB3ckluZm8uSFQyMEluZGV4RGlmZltyZlBhdGhdW2dyb3VwXTsKLQkJCXBIYWxEYXRhLT5UeFB3ckxlZ2FjeUh0RGlmZltyZlBhdGhdW2NoXSA9Ci0JCQkJcHdySW5mby5PRkRNSW5kZXhEaWZmW3JmUGF0aF1bZ3JvdXBdOwotCQkJcEhhbERhdGEtPlB3ckdyb3VwSFQyMFtyZlBhdGhdW2NoXSA9Ci0JCQkJcHdySW5mby5IVDIwTWF4T2Zmc2V0W3JmUGF0aF1bZ3JvdXBdOwotCQkJcEhhbERhdGEtPlB3ckdyb3VwSFQ0MFtyZlBhdGhdW2NoXSA9Ci0JCQkJcHdySW5mby5IVDQwTWF4T2Zmc2V0W3JmUGF0aF1bZ3JvdXBdOwotCi0JCQlwd3IgPSBwd3JJbmZvLkhUNDBfMVNJbmRleFtyZlBhdGhdW2dyb3VwXTsKLQkJCWRpZmYgPSBwd3JJbmZvLkhUNDBfMlNJbmRleERpZmZbcmZQYXRoXVtncm91cF07Ci0KLQkJCXBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8yU1tyZlBhdGhdW2NoXSA9Ci0JCQkgICAgKHB3ciA+IGRpZmYpID8gKHB3ciAtIGRpZmYpIDogMDsKLQkJfQotCX0KLQlmb3IgKHJmUGF0aCA9IDA7IHJmUGF0aCA8IFJGX1BBVEhfTUFYOyByZlBhdGgrKykgewotCQlmb3IgKGNoID0gMDsgY2ggPCBDSEFOTkVMX01BWF9OVU1CRVI7IGNoKyspIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiUkYoJXUpLUNoKCV1KSBbQ0NLIC8gSFQ0MF8xUyAvIEhUNDBfMlNdID0gWzB4JXggLyAweCV4IC8gMHgleF1cbiIsCi0JCQkJIHJmUGF0aCwgY2gsCi0JCQkJIHBIYWxEYXRhLT5UeFB3ckxldmVsQ2NrW3JmUGF0aF1bY2hdLAotCQkJCSBwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMVNbcmZQYXRoXVtjaF0sCi0JCQkJIHBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8yU1tyZlBhdGhdW2NoXSk7Ci0KLQkJfQotCX0KLQlmb3IgKGNoID0gMDsgY2ggPCBDSEFOTkVMX01BWF9OVU1CRVI7IGNoKyspIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIlJGLUEgSHQyMCB0byBIVDQwIERpZmZbJXVdID0gMHgleCglZClcbiIsIGNoLAotCQkJIHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW1JGX1BBVEhfQV1bY2hdLAotCQkJIHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW1JGX1BBVEhfQV1bY2hdKTsKLQl9Ci0JZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKQotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAiUkYtQSBMZWdhY3kgdG8gSHQ0MCBEaWZmWyV1XSA9IDB4JXhcbiIsIGNoLAotCQkJIHBIYWxEYXRhLT5UeFB3ckxlZ2FjeUh0RGlmZltSRl9QQVRIX0FdW2NoXSk7Ci0JZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJSRi1CIEh0MjAgdG8gSFQ0MCBEaWZmWyV1XSA9IDB4JXgoJWQpXG4iLCBjaCwKLQkJCSBwSGFsRGF0YS0+VHhQd3JIdDIwRGlmZltSRl9QQVRIX0JdW2NoXSwKLQkJCSBwSGFsRGF0YS0+VHhQd3JIdDIwRGlmZltSRl9QQVRIX0JdW2NoXSk7Ci0JfQotCWZvciAoY2ggPSAwOyBjaCA8IENIQU5ORUxfTUFYX05VTUJFUjsgY2grKykKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgIlJGLUIgTGVnYWN5IHRvIEhUNDAgRGlmZlsldV0gPSAweCV4XG4iLCBjaCwKLQkJCSBwSGFsRGF0YS0+VHhQd3JMZWdhY3lIdERpZmZbUkZfUEFUSF9CXVtjaF0pOwotCWlmICghQXV0b0xvYWRGYWlsKSB7Ci0JCXN0cnVjdCByZWdpc3RyeV9wcml2ICpyZWdpc3RyeV9wYXIgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQkJaWYgKHJlZ2lzdHJ5X3Bhci0+cmVndWxhdG9yeV90aWQgPT0gMHhmZikgewotCQkJaWYgKFBST01Db250ZW50W1JGX09QVElPTjFfODcyM0FdID09IDB4ZmYpCi0JCQkJcEhhbERhdGEtPkVFUFJPTVJlZ3VsYXRvcnkgPSAwOwotCQkJZWxzZQotCQkJCXBIYWxEYXRhLT5FRVBST01SZWd1bGF0b3J5ID0KLQkJCQkJUFJPTUNvbnRlbnRbUkZfT1BUSU9OMV84NzIzQV0gJiAweDc7Ci0JCX0gZWxzZSB7Ci0JCQlwSGFsRGF0YS0+RUVQUk9NUmVndWxhdG9yeSA9Ci0JCQkgICAgcmVnaXN0cnlfcGFyLT5yZWd1bGF0b3J5X3RpZDsKLQkJfQotCX0gZWxzZSB7Ci0JCXBIYWxEYXRhLT5FRVBST01SZWd1bGF0b3J5ID0gMDsKLQl9Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiRUVQUk9NUmVndWxhdG9yeSA9IDB4JXhcbiIsIHBIYWxEYXRhLT5FRVBST01SZWd1bGF0b3J5KTsKLQotCWlmICghQXV0b0xvYWRGYWlsKQotCQlwSGFsRGF0YS0+YlRYUG93ZXJEYXRhUmVhZEZyb21FRVBPUk0gPSB0cnVlOwotfQotCi12b2lkCi1IYWxfRWZ1c2VQYXJzZUJUQ29leGlzdEluZm9fODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXU4IHRlbXB2YWw7Ci0JdTMyIHRtcHU0OwotCi0JaWYgKCFBdXRvTG9hZEZhaWwpIHsKLQkJdG1wdTQgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfTVVMVElfRlVOQ19DVFJMKTsKLQkJaWYgKHRtcHU0ICYgQlRfRlVOQ19FTikKLQkJCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhDb2V4aXN0ID0gMTsKLQkJZWxzZQotCQkJcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aENvZXhpc3QgPSAwOwotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoVHlwZSA9IEJUX1JUTDg3MjNBOwotCi0JCS8qICBUaGUgZm9sbG93aW5nIG5lZWQgdG8gYmUgY2hlY2tlZCB3aXRoIG5ld2VyIHZlcnNpb24gb2YgKi8KLQkJLyogIGVlcHJvbSBzcGVjICovCi0JCXRlbXB2YWwgPSBod2luZm9bUkZfT1BUSU9ONF84NzIzQV07Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnROdW0gPSAodGVtcHZhbCAmIDB4MSk7Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnRJc29sYXRpb24gPSAodGVtcHZhbCAmIDB4MTApID4+IDQ7Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhSYWRpb1NoYXJlZCA9ICh0ZW1wdmFsICYgMHgyMCkgPj4gNTsKLQl9IGVsc2UgewotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoQ29leGlzdCA9IDA7Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhUeXBlID0gQlRfUlRMODcyM0E7Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnROdW0gPSBBbnRfeDI7Ci0JCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhBbnRJc29sYXRpb24gPSAwOwotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoUmFkaW9TaGFyZWQgPSBCVF9SYWRpb19TaGFyZWQ7Ci0JfQotCi0JcnRsODcyM2FfQlRfaW5pdF9oYWxfdmFycyhwYWRhcHRlcik7Ci19Ci0KLXZvaWQKLUhhbF9FZnVzZVBhcnNlRUVQUk9NVmVyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQotCWlmICghQXV0b0xvYWRGYWlsKQotCQlwSGFsRGF0YS0+RUVQUk9NVmVyc2lvbiA9IGh3aW5mb1tFRVBST01fVkVSU0lPTl84NzIzQV07Ci0JZWxzZQotCQlwSGFsRGF0YS0+RUVQUk9NVmVyc2lvbiA9IDE7Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiSGFsX0VmdXNlUGFyc2VFRVBST01WZXIoKSwgRUVWZXIgPSAlZFxuIiwKLQkJIHBIYWxEYXRhLT5FRVBST01WZXJzaW9uKTsKLX0KLQotdm9pZAotcnRsODcyM2FfRWZ1c2VQYXJzZUNobmxQbGFuKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCi17Ci0JcGFkYXB0ZXItPm1sbWVwcml2LkNoYW5uZWxQbGFuID0KLQkJaGFsX2NvbV9nZXRfY2hhbm5lbF9wbGFuMjNhKHBhZGFwdGVyLCBod2luZm8gPwotCQkJCQkgaHdpbmZvW0VFUFJPTV9DaGFubmVsUGxhbl84NzIzQV06MHhGRiwKLQkJCQkJIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYuY2hhbm5lbF9wbGFuLAotCQkJCQkgUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV8xMywKLQkJCQkJIEF1dG9Mb2FkRmFpbCk7Ci0KLQlEQkdfODcyM0EoIm1sbWVwcml2LkNoYW5uZWxQbGFuID0gMHglMDJ4XG4iLAotCQkgIHBhZGFwdGVyLT5tbG1lcHJpdi5DaGFubmVsUGxhbik7Ci19Ci0KLXZvaWQKLUhhbF9FZnVzZVBhcnNlQ3VzdG9tZXJJRChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCi0JaWYgKCFBdXRvTG9hZEZhaWwpIHsKLQkJcEhhbERhdGEtPkVFUFJPTUN1c3RvbWVySUQgPSBod2luZm9bRUVQUk9NX0N1c3RvbUlEXzg3MjNBXTsKLQkJcEhhbERhdGEtPkVFUFJPTVN1YkN1c3RvbWVySUQgPQotCQkgICAgaHdpbmZvW0VFUFJPTV9TdWJDdXN0b21JRF84NzIzQV07Ci0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPkVFUFJPTUN1c3RvbWVySUQgPSAwOwotCQlwSGFsRGF0YS0+RUVQUk9NU3ViQ3VzdG9tZXJJRCA9IDA7Ci0JfQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIkVFUFJPTSBDdXN0b21lciBJRDogMHglMnhcbiIsIHBIYWxEYXRhLT5FRVBST01DdXN0b21lcklEKTsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICJFRVBST00gU3ViQ3VzdG9tZXIgSUQ6IDB4JTAyeFxuIiwKLQkJIHBIYWxEYXRhLT5FRVBST01TdWJDdXN0b21lcklEKTsKLX0KLQotdm9pZAotSGFsX0VmdXNlUGFyc2VBbnRlbm5hRGl2ZXJzaXR5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCi17Ci19Ci0KLXZvaWQKLUhhbF9FZnVzZVBhcnNlUmF0ZUluZGljYXRpb25PcHRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICB1OCAqaHdpbmZvLCBib29sIEF1dG9Mb2FkRmFpbCkKLXsKLX0KLQotdm9pZAotSGFsX0VmdXNlUGFyc2VYdGFsXzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsCi0JCQkgdTggKmh3aW5mbywgdTggQXV0b0xvYWRGYWlsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCi0JaWYgKCFBdXRvTG9hZEZhaWwpIHsKLQkJcEhhbERhdGEtPkNyeXN0YWxDYXAgPSBod2luZm9bRUVQUk9NX1hUQUxfS184NzIzQV07Ci0JCWlmIChwSGFsRGF0YS0+Q3J5c3RhbENhcCA9PSAweEZGKQotCQkJcEhhbERhdGEtPkNyeXN0YWxDYXAgPSBFRVBST01fRGVmYXVsdF9DcnlzdGFsQ2FwXzg3MjNBOwotCX0gZWxzZSB7Ci0JCXBIYWxEYXRhLT5DcnlzdGFsQ2FwID0gRUVQUk9NX0RlZmF1bHRfQ3J5c3RhbENhcF84NzIzQTsKLQl9Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6IENyeXN0YWxDYXAgPSAweCUyeFxuIiwgX19mdW5jX18sCi0JCSBwSGFsRGF0YS0+Q3J5c3RhbENhcCk7Ci19Ci0KLXZvaWQKLUhhbF9FZnVzZVBhcnNlVGhlcm1hbE1ldGVyXzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJIHU4ICpQUk9NQ29udGVudCwgYm9vbCBBdXRvbG9hZEZhaWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0KLQkvKiAgKi8KLQkvKiAgVGhlcm1hbE1ldGVyIGZyb20gRUVQUk9NICovCi0JLyogICovCi0JaWYgKCFBdXRvbG9hZEZhaWwpCi0JCXBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgPQotCQkgICAgUFJPTUNvbnRlbnRbRUVQUk9NX1RIRVJNQUxfTUVURVJfODcyM0FdOwotCWVsc2UKLQkJcEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlciA9IEVFUFJPTV9EZWZhdWx0X1RoZXJtYWxNZXRlcjsKLQotCWlmICgocEhhbERhdGEtPkVFUFJPTVRoZXJtYWxNZXRlciA9PSAweGZmKSB8fCBBdXRvbG9hZEZhaWwpIHsKLQkJcEhhbERhdGEtPmJBUEtUaGVybWFsTWV0ZXJJZ25vcmUgPSB0cnVlOwotCQlwSGFsRGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyID0gRUVQUk9NX0RlZmF1bHRfVGhlcm1hbE1ldGVyOwotCX0KLQotCURCR184NzIzQSgiJXM6IFRoZXJtYWxNZXRlciA9IDB4JXhcbiIsIF9fZnVuY19fLAotCQkgIHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBydGw4NzIzYV9jYWxfdHhkZXNjX2Noa3N1bShzdHJ1Y3QgdHhfZGVzYyAqcHR4ZGVzYykKLXsKLQlfX2xlMTYgKnVzUHRyID0gKF9fbGUxNiAqKXB0eGRlc2M7Ci0JdTMyIGNvdW50ID0gMTY7CQkvKiAgKDMyIGJ5dGVzIC8gMiBieXRlcyBwZXIgWE9SKSA9PiAxNiB0aW1lcyAqLwotCXUzMiBpbmRleDsKLQl1MTYgY2hlY2tzdW0gPSAwOwotCi0JLyogIENsZWFyIGZpcnN0ICovCi0JcHR4ZGVzYy0+dHhkdzcgJj0gY3B1X3RvX2xlMzIoMHhmZmZmMDAwMCk7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykKLQkJY2hlY2tzdW0gXj0gbGUxNl90b19jcHUodXNQdHJbaW5kZXhdKTsKLQotCXB0eGRlc2MtPnR4ZHc3IHw9IGNwdV90b19sZTMyKGNoZWNrc3VtICYgMHgwMDAwZmZmZik7Ci19Ci0KLS8qCi0gKiAgRGVzY3JpcHRpb246IEluIG5vcm1hbCBjaGlwLCB3ZSBzaG91bGQgc2VuZCBzb21lIHBhY2tldCB0byBIdyB3aGljaAotICogIHdpbGwgYmUgdXNlZCBieSBGdyBpbiBGVyBMUFMgbW9kZS4gVGhlIGZ1bmN0aW9uIGlzIHRvIGZpbGwgdGhlIFR4Ci0gKiBkZXNjcmlwdG9yIG9mIHRoaXMgcGFja2V0cywgdGhlbgotICovCi0vKgkJCUZ3IGNhbiB0ZWxsIEh3IHRvIHNlbmQgdGhlc2UgcGFja2V0IGRlcmVjdGx5LiAqLwotLyogIEFkZGVkIGJ5IHR5bmxpLiAyMDA5LjEwLjE1LiAqLwotLyogICovCi12b2lkIHJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnBEZXNjLAotCQkJICAgICAgIHUzMiBCdWZmZXJMZW4sIHU4IElzUHNQb2xsLCB1OCBJc0JUUW9zTnVsbCkKLXsKLQlzdHJ1Y3QgdHhfZGVzYyAqcHR4ZGVzYzsKLQotCS8qICBDbGVhciBhbGwgc3RhdHVzICovCi0JcHR4ZGVzYyA9IChzdHJ1Y3QgdHhfZGVzYyAqKXBEZXNjOwotCW1lbXNldChwRGVzYywgMCwgVFhERVNDX1NJWkUpOwotCi0JLyogb2Zmc2V0IDAgKi8KLQkvKiBvd24sIGJGaXJzdFNlZywgYkxhc3RTZWc7ICovCi0JcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoT1dOIHwgRlNHIHwgTFNHKTsKLQotCS8qIDMyIGJ5dGVzIGZvciBUWCBEZXNjICovCi0JcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoKChUWERFU0NfU0laRSArIE9GRlNFVF9TWikgPDwKLQkJCQkgICAgICAgT0ZGU0VUX1NIVCkgJiAweDAwZmYwMDAwKTsKLQotCS8qICBCdWZmZXIgc2l6ZSArIGNvbW1hbmQgaGVhZGVyICovCi0JcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoQnVmZmVyTGVuICYgMHgwMDAwZmZmZik7Ci0KLQkvKiBvZmZzZXQgNCAqLwotCS8qICBGaXhlZCBxdWV1ZSBvZiBNZ250IHF1ZXVlICovCi0JcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoKFFTTFRfTUdOVCA8PCBRU0VMX1NIVCkgJiAweDAwMDAxZjAwKTsKLQotCS8qIFNldCBOQVZVU0VIRFIgdG8gcHJldmVudCBQcy1wb2xsIEFJZCBmaWxlZCB0byBiZSBjaGFuZ2VkCi0JICAgdG8gZXJyb3IgdmxhdWUgYnkgSHcuICovCi0JaWYgKElzUHNQb2xsKSB7Ci0JCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKE5BVlVTRUhEUik7Ci0JfSBlbHNlIHsKLQkJLyogIEh3IHNldCBzZXF1ZW5jZSBudW1iZXIgKi8KLQkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoQklUKDcpKTsKLQkJLyogc2V0IGJpdDMgdG8gMS4gU3V1Z2VzdGVkIGJ5IFRpbUNoZW4uIDIwMDkuMTIuMjkuICovCi0JCXB0eGRlc2MtPnR4ZHczIHw9IGNwdV90b19sZTMyKCg4IDw8IDI4KSk7Ci0JfQotCi0JaWYgKHRydWUgPT0gSXNCVFFvc051bGwpCi0JCXB0eGRlc2MtPnR4ZHcyIHw9IGNwdV90b19sZTMyKEJJVCgyMykpOwkvKiAgQlQgTlVMTCAqLwotCi0JLyogb2Zmc2V0IDE2ICovCi0JcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoQklUKDgpKTsJLyogZHJpdmVyIHVzZXMgcmF0ZSAqLwotCi0JLyogIFVTQiBpbnRlcmZhY2UgZHJvcCBwYWNrZXQgaWYgdGhlIGNoZWNrc3VtIG9mIGRlc2NyaXB0b3IgaXNuJ3QKLQkgICAgY29ycmVjdC4gKi8KLQkvKiAgVXNpbmcgdGhpcyBjaGVja3N1bSBjYW4gbGV0IGhhcmR3YXJlIHJlY292ZXJ5IGZyb20gcGFja2V0IGJ1bGsKLQkgICAgb3V0IGVycm9yIChlLmcuIENhbmNlbCBVUkMsIEJ1bGsgb3V0IGVycm9yLikuICovCi0JcnRsODcyM2FfY2FsX3R4ZGVzY19jaGtzdW0ocHR4ZGVzYyk7Ci19Ci0KLXZvaWQgaHdfdmFyX3NldF9vcG1vZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbW9kZSkKLXsKLQl1OCB2YWw4OwotCi0JaWYgKG1vZGUgPT0gTVNSX0lORlJBIHx8IG1vZGUgPT0gTVNSX05PTElOSykgewotCQlTdG9wVHhCZWFjb24ocGFkYXB0ZXIpOwotCi0JCS8qICBkaXNhYmxlIGF0aW0gd25kICovCi0JCXZhbDggPSBESVNfVFNGX1VEVCB8IEVOX0JDTl9GVU5DVElPTiB8IERJU19BVElNOwotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCB2YWw4LCB+dmFsOCk7Ci0JfSBlbHNlIGlmIChtb2RlID09IE1TUl9BREhPQykgewotCQlSZXN1bWVUeEJlYWNvbihwYWRhcHRlcik7Ci0KLQkJdmFsOCA9IERJU19UU0ZfVURUIHwgRU5fQkNOX0ZVTkNUSU9OIHwgRElTX0JDTlFfU1VCOwotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCB2YWw4LCB+dmFsOCk7Ci0JfSBlbHNlIGlmIChtb2RlID09IE1TUl9BUCkgewotCQkvKiAgYWRkIE5VTEwgRGF0YSBhbmQgQlQgTlVMTCBEYXRhIFBhY2tldHMgdG8gRlcgUlNWRCBQYWdlICovCi0JCXJ0bDg3MjNhX3NldF9CVENvZXhfQVBfbW9kZV9Gd1JzdmRQa3RfY21kKHBhZGFwdGVyKTsKLQotCQlSZXN1bWVUeEJlYWNvbihwYWRhcHRlcik7Ci0KLQkJdmFsOCA9IERJU19UU0ZfVURUIHwgRElTX0JDTlFfU1VCOwotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCB2YWw4LCB+dmFsOCk7Ci0KLQkJLyogIFNldCBSQ1IgKi8KLQkJLyogcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsIDB4NzAwMDJhOGUpOwotCQkgICBDQlNTSURfREFUQSBtdXN0IHNldCB0byAwICovCi0JCS8qIENCU1NJRF9EQVRBIG11c3Qgc2V0IHRvIDAgKi8KLQkJcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsIDB4NzAwMDIyOGUpOwotCQkvKiAgZW5hYmxlIHRvIHJ4IGRhdGEgZnJhbWUgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19SWEZMVE1BUDIsIDB4RkZGRik7Ci0JCS8qICBlbmFibGUgdG8gcnggcHMtcG9sbCAqLwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1JYRkxUTUFQMSwgMHgwNDAwKTsKLQotCQkvKiAgQmVhY29uIENvbnRyb2wgcmVsYXRlZCByZWdpc3RlciBmb3IgZmlyc3QgdGltZSAqLwotCQkvKiAgMm1zICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19CQ05ETUFUSU0sIDB4MDIpOwotCQkvKiAgNW1zICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19EUlZFUkxZSU5ULCAweDA1KTsKLQkJLyogIDEwbXMgZm9yIHBvcnQwICovCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19BVElNV05ELCAweDBhKTsKLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19CQ05UQ0ZHLCAweDAwKTsKLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19UQlRUX1BST0hJQklULCAweGZmMDQpOwotCQkvKiAgKzMyNzY3ICh+MzJtcykgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19UU0ZUUl9TWU5fT0ZGU0VULCAweDdmZmYpOwotCi0JCS8qICByZXNldCBUU0YgKi8KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0RVQUxfVFNGX1JTVCwgQklUKDApKTsKLQotCQkvKiAgZW5hYmxlIEJDTiBGdW5jdGlvbiAqLwotCQkvKiAgZG9uJ3QgZW5hYmxlIHVwZGF0ZSBUU0YgKGR1ZSB0byBUU0YgdXBkYXRlIHdoZW4KLQkJICAgIGJlYWNvbi9wcm9iZSByc3AgYXJlIHJlY2VpdmVkKSAqLwotCQl2YWw4ID0gRElTX1RTRl9VRFQgfCBFTl9CQ05fRlVOQ1RJT04gfAotCQkgICAgICAgRU5fVFhCQ05fUlBUIHwgRElTX0JDTlFfU1VCOwotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCB2YWw4LCB+dmFsOCk7Ci0JfQotCi0JdmFsOCA9IHJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgTVNSKTsKLQl2YWw4ID0gKHZhbDggJiAweEMpIHwgbW9kZTsKLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBNU1IsIHZhbDgpOwotfQotCi12b2lkIGh3X3Zhcl9zZXRfbWFjYWRkcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqdmFsKQotewotCXU4IGlkeCA9IDA7Ci0JdTMyIHJlZ19tYWNpZDsKLQotCXJlZ19tYWNpZCA9IFJFR19NQUNJRDsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgNjsgaWR4KyspCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIChyZWdfbWFjaWQgKyBpZHgpLCB2YWxbaWR4XSk7Ci19Ci0KLXZvaWQgaHdfdmFyX3NldF9ic3NpZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqdmFsKQotewotCXU4IGlkeCA9IDA7Ci0JdTMyIHJlZ19ic3NpZDsKLQotCXJlZ19ic3NpZCA9IFJFR19CU1NJRDsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgNjsgaWR4KyspCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIChyZWdfYnNzaWQgKyBpZHgpLCB2YWxbaWR4XSk7Ci19Ci0KLXZvaWQgaHdfdmFyX3NldF9jb3JyZWN0X3RzZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXU2NCB0c2Y7Ci0JdTMyIHJlZ190c2Z0cjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCi0JLyogdHNmID0gcG1sbWVleHQtPlRTRlZhbHVlIC0gKCh1MzIpcG1sbWVleHQtPlRTRlZhbHVlICUKLQkgICAocG1sbWVpbmZvLT5iY25faW50ZXJ2YWwqMTAyNCkpIC0gMTAyNDsgdXMgKi8KLQl0c2YgPSBwbWxtZWV4dC0+VFNGVmFsdWUgLQotCQlkb19kaXYocG1sbWVleHQtPlRTRlZhbHVlLAotCQkgICAgICAgKHBtbG1laW5mby0+YmNuX2ludGVydmFsICogMTAyNCkpIC0gMTAyNDsJLyogdXMgKi8KLQotCWlmICgoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQURIT0MpIHx8Ci0JICAgICgocG1sbWVpbmZvLT5zdGF0ZSAmIDB4MDMpID09IE1TUl9BUCkpIHsKLQkJLyogcEhhbERhdGEtPlJlZ1R4UGF1c2UgfD0gU1RPUF9CQ05RO0JJVCg2KSAqLwotCQkvKiBydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfVFhQQVVTRSwKLQkJICAgKHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfVFhQQVVTRSl8QklUKDYpKSk7ICovCi0JCVN0b3BUeEJlYWNvbihwYWRhcHRlcik7Ci0JfQotCi0JcmVnX3RzZnRyID0gUkVHX1RTRlRSOwotCi0JLyogIGRpc2FibGUgcmVsYXRlZCBUU0YgZnVuY3Rpb24gKi8KLQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCAwLCBFTl9CQ05fRlVOQ1RJT04pOwotCi0JcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIHJlZ190c2Z0ciwgdHNmKTsKLQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgcmVnX3RzZnRyICsgNCwgdHNmID4+IDMyKTsKLQotCS8qIGVuYWJsZSByZWxhdGVkIFRTRiBmdW5jdGlvbiAqLwotCVNldEJjbkN0cmxSZWcyM2EocGFkYXB0ZXIsIEVOX0JDTl9GVU5DVElPTiwgMCk7Ci0KLQlpZiAoKChwbWxtZWluZm8tPnN0YXRlICYgMHgwMykgPT0gTVNSX0FESE9DKSB8fAotCSAgICAoKHBtbG1laW5mby0+c3RhdGUgJiAweDAzKSA9PSBNU1JfQVApKQotCQlSZXN1bWVUeEJlYWNvbihwYWRhcHRlcik7Ci19Ci0KLXZvaWQgaHdfdmFyX3NldF9tbG1lX2Rpc2Nvbm5lY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQkvKiAgcmVqZWN0IGFsbCBkYXRhIGZyYW1lcyAqLwotCXJ0bDg3MjNhdV93cml0ZTE2KHBhZGFwdGVyLCBSRUdfUlhGTFRNQVAyLCAwKTsKLQotCS8qICByZXNldCBUU0YgKi8KLQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfRFVBTF9UU0ZfUlNULCBCSVQoMCkpOwotCi0JLyogIGRpc2FibGUgdXBkYXRlIFRTRiAqLwotCVNldEJjbkN0cmxSZWcyM2EocGFkYXB0ZXIsIERJU19UU0ZfVURULCAwKTsKLX0KLQotdm9pZCBod192YXJfc2V0X21sbWVfam9pbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKQotewotCXU4IFJldHJ5TGltaXQgPSAweDMwOwotCi0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWlmICh0eXBlID09IDApIHsJLyogIHByZXBhcmUgdG8gam9pbiAqLwotCQl1MzIgdjMyOwotCi0JCS8qICBlbmFibGUgdG8gcnggZGF0YSBmcmFtZS5BY2NlcHQgYWxsIGRhdGEgZnJhbWUgKi8KLQkJLyogcnRsODcyM2F1X3dyaXRlMzIocGFkYXB0ZXIsIFJFR19SQ1IsCi0JCSAgIHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19SQ1IpfFJDUl9BREYpOyAqLwotCQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1JYRkxUTUFQMiwgMHhGRkZGKTsKLQotCQl2MzIgPSBydGw4NzIzYXVfcmVhZDMyKHBhZGFwdGVyLCBSRUdfUkNSKTsKLQkJdjMyIHw9IFJDUl9DQlNTSURfREFUQSB8IFJDUl9DQlNTSURfQkNOOwotCQlydGw4NzIzYXVfd3JpdGUzMihwYWRhcHRlciwgUkVHX1JDUiwgdjMyKTsKLQotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgPT0gdHJ1ZSkKLQkJCVJldHJ5TGltaXQgPQotCQkJICAgIChwSGFsRGF0YS0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfQ0NYKSA/IDcgOiA0ODsKLQkJZWxzZQkJLyogIEFkLWhvYyBNb2RlICovCi0JCQlSZXRyeUxpbWl0ID0gMHg3OwotCX0gZWxzZSBpZiAodHlwZSA9PSAxKSB7CS8qICBqb2luYnNzX2V2ZW50IGNhbGxiYWNrIHdoZW4gam9pbiByZXMgPCAwICovCi0JCS8qICBjb25maWcgUkNSIHRvIHJlY2VpdmUgZGlmZmVyZW50IEJTU0lEICYgbm90IHRvCi0JCSAgICByZWNlaXZlIGRhdGEgZnJhbWUgZHVyaW5nIGxpbmtpbmcgKi8KLQkJcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19SWEZMVE1BUDIsIDApOwotCX0gZWxzZSBpZiAodHlwZSA9PSAyKSB7CS8qICBzdGEgYWRkIGV2ZW50IGNhbGxiYWNrICovCi0JCS8qICBlbmFibGUgdXBkYXRlIFRTRiAqLwotCQlTZXRCY25DdHJsUmVnMjNhKHBhZGFwdGVyLCAwLCBESVNfVFNGX1VEVCk7Ci0KLQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LAotCQkJCSAgV0lGSV9BREhPQ19TVEFURSB8IFdJRklfQURIT0NfTUFTVEVSX1NUQVRFKSkgewotCQkJLyogIGZpeGVkIGJlYWNvbiBpc3N1ZSBmb3IgODE5MXN1Li4uLi4uLi4uLi4gKi8KLQkJCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIDB4NTQyLCAweDAyKTsKLQkJCVJldHJ5TGltaXQgPSAweDc7Ci0JCX0KLQl9Ci0KLQlydGw4NzIzYXVfd3JpdGUxNihwYWRhcHRlciwgUkVHX1JMLAotCQkJICBSZXRyeUxpbWl0IDw8IFJFVFJZX0xJTUlUX1NIT1JUX1NISUZUIHwgUmV0cnlMaW1pdCA8PAotCQkJICBSRVRSWV9MSU1JVF9MT05HX1NISUZUKTsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgMDoKLQkJLyogIHByZXBhcmUgdG8gam9pbiAqLwotCQlydGw4NzIzYV9CVF93aWZpYXNzb2NpYXRlX25vdGlmeShwYWRhcHRlciwgdHJ1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJLyogIGpvaW5ic3NfZXZlbnQgY2FsbGJhY2sgd2hlbiBqb2luIHJlcyA8IDAgKi8KLQkJcnRsODcyM2FfQlRfd2lmaWFzc29jaWF0ZV9ub3RpZnkocGFkYXB0ZXIsIGZhbHNlKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkvKiAgc3RhIGFkZCBldmVudCBjYWxsYmFjayAqLwotLyoJCUJUX1dpZmlNZWRpYVN0YXR1c05vdGlmeShwYWRhcHRlciwgUlRfTUVESUFfQ09OTkVDVCk7ICovCi0JCWJyZWFrOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3BoeWNmZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcGh5Y2ZnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YTZjM2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcGh5Y2ZnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVEw4NzIzQV9QSFlDRkdfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgTG9jYWwgQ29uc3RhbnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogQ2hhbm5lbCBzd2l0Y2g6VGhlIHNpemUgb2YgY29tbWFuZCB0YWJsZXMgZm9yIHN3aXRjaCBjaGFubmVsKi8KLSNkZWZpbmUgTUFYX1BSRUNNRF9DTlQgMTYKLSNkZWZpbmUgTUFYX1JGREVQRU5EQ01EX0NOVCAxNgotI2RlZmluZSBNQVhfUE9TVENNRF9DTlQgMTYKLQotI2RlZmluZSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzl4IDY0Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIExvY2FsIENvbnN0YW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBsb2NhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZXhwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICBQbGVhc2UgcmVmZXIgdG8gaGVhZGVyIGZpbGUgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZXhwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRnVuY3Rpb24gQm9keS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICovCi0vKiAgMS4gQkIgcmVnaXN0ZXIgUi9XIEFQSSAqLwotLyogICovCi0KLS8qKgotKiBGdW5jdGlvbjoJcGh5X0NhbGN1bGF0ZUJpdFNoaWZ0Ci0qCi0qIE92ZXJWaWV3OglHZXQgc2hpZnRlZCBwb3NpdGlvbiBvZiB0aGUgQml0TWFzawotKgotKiBJbnB1dDoKLSoJCQl1MzIJCUJpdE1hc2ssCi0qCi0qIE91dHB1dDoJbm9uZQotKiBSZXR1cm46CQl1MzIJCVJldHVybiB0aGUgc2hpZnQgYml0IGJpdCBwb3NpdGlvbiBvZiB0aGUgbWFzawotKi8KLXN0YXRpYwl1MzIgcGh5X0NhbGN1bGF0ZUJpdFNoaWZ0KHUzMiBCaXRNYXNrKQotewotCXUzMiBpOwotCi0JZm9yIChpID0gMDsgaSA8PSAzMTsgaSsrKSB7Ci0JCWlmICgoKEJpdE1hc2s+PmkpICYgMHgxKSA9PSAxKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGk7Ci19Ci0KLS8qKgotKiBGdW5jdGlvbjoJUEhZX1F1ZXJ5QkJSZWcKLSoKLSogT3ZlclZpZXc6CVJlYWQgInNlcGNpZmljIGJpdHMiIGZyb20gQkIgcmVnaXN0ZXIKLSoKLSogSW5wdXQ6Ci0qCXN0cnVjdCBydHdfYWRhcHRlciAqCUFkYXB0ZXIsCi0qCXUzMgkJCVJlZ0FkZHIsCVRhcmdldCBhZGRyZXNzIHRvIGJlIHJlYWRiYWNrCi0qCXUzMgkJCUJpdE1hc2sJCVRhcmdldCBiaXQgcG9zaXRpb24gaW4gdGhlCi0qCQkJCQkJdGFyZ2V0IGFkZHJlc3MgdG8gYmUgcmVhZGJhY2sKLSogT3V0cHV0OgotKglOb25lCi0qIFJldHVybjoKLSoJdTMyCQkJRGF0YQkJVGhlIHJlYWRiYWNrIHJlZ2lzdGVyIHZhbHVlCi0qIE5vdGU6Ci0qCVRoaXMgZnVuY3Rpb24gaXMgZXF1YWwgdG8gIkdldFJlZ1NldHRpbmciIGluIFBIWSBwcm9ncmFtbWluZyBndWlkZQotKi8KLXUzMgotUEhZX1F1ZXJ5QkJSZWcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2spCi17Ci0JdTMyCVJldHVyblZhbHVlID0gMCwgT3JpZ2luYWxWYWx1ZSwgQml0U2hpZnQ7Ci0KLQlPcmlnaW5hbFZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBSZWdBZGRyKTsKLQlCaXRTaGlmdCA9IHBoeV9DYWxjdWxhdGVCaXRTaGlmdChCaXRNYXNrKTsKLQlSZXR1cm5WYWx1ZSA9IChPcmlnaW5hbFZhbHVlICYgQml0TWFzaykgPj4gQml0U2hpZnQ7Ci0JcmV0dXJuIFJldHVyblZhbHVlOwotfQotCi0vKioKLSogRnVuY3Rpb246CVBIWV9TZXRCQlJlZwotKgotKiBPdmVyVmlldzoJV3JpdGUgIlNwZWNpZmljIGJpdHMiIHRvIEJCIHJlZ2lzdGVyIChwYWdlIDh+KQotKgotKiBJbnB1dDoKLSoJc3RydWN0IHJ0d19hZGFwdGVyICoJQWRhcHRlciwKLSoJdTMyCQkJUmVnQWRkciwJVGFyZ2V0IGFkZHJlc3MgdG8gYmUgbW9kaWZpZWQKLSoJdTMyCQkJQml0TWFzawkJVGFyZ2V0IGJpdCBwb3NpdGlvbiBpbiB0aGUKLSoJCQkJCQl0YXJnZXQgYWRkcmVzcyB0byBiZSBtb2RpZmllZAotKgl1MzIJCQlEYXRhCQlUaGUgbmV3IHJlZ2lzdGVyIHZhbHVlIGluIHRoZQotKgkJCQkJCXRhcmdldCBiaXQgcG9zaXRpb24gb2YgdGhlCi0qCQkJCQkJIHRhcmdldCBhZGRyZXNzCi0qCi0qIE91dHB1dDoKLSoJTm9uZQotKiBSZXR1cm46Ci0qCU5vbmUKLSogTm90ZToKLSoJVGhpcyBmdW5jdGlvbiBpcyBlcXVhbCB0byAiUHV0UmVnU2V0dGluZyIgaW4gUEhZIHByb2dyYW1taW5nIGd1aWRlCi0qLwotCi12b2lkCi1QSFlfU2V0QkJSZWcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2ssIHUzMglEYXRhKQotewotCXUzMiBPcmlnaW5hbFZhbHVlLCBCaXRTaGlmdDsKLQotCWlmIChCaXRNYXNrICE9IGJNYXNrRFdvcmQpIHsvKiBpZiBub3QgImRvdWJsZSB3b3JkIiB3cml0ZSAqLwotCQlPcmlnaW5hbFZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBSZWdBZGRyKTsKLQkJQml0U2hpZnQgPSBwaHlfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7Ci0JCURhdGEgPSAoT3JpZ2luYWxWYWx1ZSAmICh+Qml0TWFzaykpIHwgKERhdGEgPDwgQml0U2hpZnQpOwotCX0KLQotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJlZ0FkZHIsIERhdGEpOwotCi0JLyogUlRQUklOVChGUEhZLCBQSFlfQkJXLCAoIkJCVyBNQVNLID0gMHglbHggQWRkclsweCVseF09IDB4JWx4XG4iLCBCaXRNYXNrLCBSZWdBZGRyLCBEYXRhKSk7ICovCi19Ci0KLS8qICAqLwotLyogIDIuIFJGIHJlZ2lzdGVyIFIvVyBBUEkgKi8KLS8qICAqLwotCi0vKioKLSogRnVuY3Rpb246CXBoeV9SRlNlcmlhbFJlYWQKLSoKLSogT3ZlclZpZXc6CVJlYWQgcmVnc3RlciBmcm9tIFJGIGNoaXBzCi0qCi0qIElucHV0OgotKgkJc3RydWN0IHJ0d19hZGFwdGVyICoJCUFkYXB0ZXIsCi0qCQllbnVtIFJGX1JBRElPX1BBVEgJZVJGUGF0aCwJUmFkaW8gcGF0aCBvZiBBL0IvQy9ECi0qCQl1MzIgT2Zmc2V0LAkJCVRoZSB0YXJnZXQgYWRkcmVzcyB0byBiZSByZWFkCi0qCi0qIE91dHB1dDoJTm9uZQotKiBSZXR1cm46CXUzMgkJCXJlYmFjayB2YWx1ZQotKiBOb3RlOgkJVGhyZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBzZXJpYWwgb3BlcmF0aW9uczoKLSoJCTEuIFNvZnR3YXJlIHNlcmlhbCB3cml0ZQotKgkJMi4gSGFyZHdhcmUgTFNTSS1Mb3cgU3BlZWQgU2VyaWFsIEludGVyZmFjZQotKgkJMy4gSGFyZHdhcmUgSFNTSS1IaWdoIHNwZWVkCi0qCQlzZXJpYWwgd3JpdGUuIERyaXZlciBuZWVkIHRvIGltcGxlbWVudCAoMSkgYW5kICgyKS4KLSoJCVRoaXMgZnVuY3Rpb24gaXMgZXF1YWwgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIFJGX1JlYWRSZWcoKSBhbmQKLSoJCVJGTFNTSVJlYWQoKQotKi8KLXN0YXRpYyB1MzIKLXBoeV9SRlNlcmlhbFJlYWQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCBlbnVtIFJGX1JBRElPX1BBVEggZVJGUGF0aCwKLQkJIHUzMiBPZmZzZXQpCi17Ci0JdTMyIHJldFZhbHVlID0gMDsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBiYl9yZWdfZGVmaW5lICpwUGh5UmVnID0gJnBIYWxEYXRhLT5QSFlSZWdEZWZbZVJGUGF0aF07Ci0JdTMyIE5ld09mZnNldDsKLQl1MzIgdG1wbG9uZywgdG1wbG9uZzI7Ci0JdTggUmZQaUVuYWJsZSA9IDA7Ci0JLyogICovCi0JLyogIE1ha2Ugc3VyZSBSRiByZWdpc3RlciBvZmZzZXQgaXMgY29ycmVjdCAqLwotCS8qICAqLwotCU9mZnNldCAmPSAweDNmOwotCi0JLyogICovCi0JLyogIFN3aXRjaCBwYWdlIGZvciA4MjU2IFJGIElDICovCi0JLyogICovCi0JTmV3T2Zmc2V0ID0gT2Zmc2V0OwotCi0JLyogIDIwMDkvMDYvMTcgTUggV2UgY2FuIG5vdCBleGVjdXRlIElPIGZvciBwb3dlciBzYXZlIG9yCi0JICAgIG90aGVyIGFjY2lkZW50IG1vZGUuICovCi0JLyogaWYgKFJUX0NBTk5PVF9JTyhBZGFwdGVyKSkgKi8KLQkvKiAgKi8KLQkvKglSVFBSSU5UKEZQSFksIFBIWV9SRlIsICgicGh5X1JGU2VyaWFsUmVhZCByZXR1cm4gYWxsIG9uZVxuIikpOyAqLwotCS8qCXJldHVybgkweEZGRkZGRkZGOyAqLwotCS8qICAqLwotCi0JLyogIEZvciA5MlMgTFNTSSBSZWFkIFJGTFNTSVJlYWQgKi8KLQkvKiAgRm9yIFJGIEEvQiB3cml0ZSAweDgyNC84MmMoZG9lcyBub3Qgd29yayBpbiB0aGUgZnV0dXJlKSAqLwotCS8qICBXZSBtdXN0IHVzZSAweDgyNCBmb3IgUkYgQSBhbmQgQiB0byBleGVjdXRlIHJlYWQgdHJpZ2dlciAqLwotCXRtcGxvbmcgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMik7Ci0JaWYgKGVSRlBhdGggPT0gUkZfUEFUSF9BKQotCQl0bXBsb25nMiA9IHRtcGxvbmc7Ci0JZWxzZQotCQl0bXBsb25nMiA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgcFBoeVJlZy0+cmZIU1NJUGFyYTIpOwotCi0JdG1wbG9uZzIgPSAodG1wbG9uZzIgJiB+YkxTU0lSZWFkQWRkcmVzcykgfAotCQkoTmV3T2Zmc2V0IDw8IDIzKSB8IGJMU1NJUmVhZEVkZ2U7CS8qIFQ2NSBSRiAqLwotCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLAotCQkJICB0bXBsb25nICYgKH5iTFNTSVJlYWRFZGdlKSk7Ci0JdWRlbGF5KDEwKTsvKiAgUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbigxMCk7ICovCi0KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwgdG1wbG9uZzIpOwotCXVkZWxheSgxMDApOy8qIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oMTAwKTsgKi8KLQotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMiwKLQkJCSAgdG1wbG9uZyB8IGJMU1NJUmVhZEVkZ2UpOwotCXVkZWxheSgxMCk7LyogUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbigxMCk7ICovCi0KLQlpZiAoZVJGUGF0aCA9PSBSRl9QQVRIX0EpCi0JCVJmUGlFbmFibGUgPSAodTgpUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwKLQkJCQkJCXJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMSwKLQkJCQkJCUJJVCg4KSk7Ci0JZWxzZSBpZiAoZVJGUGF0aCA9PSBSRl9QQVRIX0IpCi0JCVJmUGlFbmFibGUgPSAodTgpUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwKLQkJCQkJCXJGUEdBMF9YQl9IU1NJUGFyYW1ldGVyMSwKLQkJCQkJCUJJVCg4KSk7Ci0KLQlpZiAoUmZQaUVuYWJsZSkJewotCQkvKiBSZWFkIGZyb20gQkJyZWc4YjgsIDEyIGJpdHMgZm9yIDgxOTAsIDIwYml0cyBmb3IgVDY1IFJGICovCi0JCXJldFZhbHVlID0gUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwgcFBoeVJlZy0+cmZMU1NJUmVhZEJhY2tQaSwKLQkJCQkJICBiTFNTSVJlYWRCYWNrRGF0YSk7Ci0JCS8qIERCR184NzIzQSgiUmVhZGJhY2sgZnJvbSBSRi1QSSA6IDB4JXhcbiIsIHJldFZhbHVlKTsgKi8KLQl9IGVsc2UgewotCQkvKiBSZWFkIGZyb20gQkJyZWc4YTAsIDEyIGJpdHMgZm9yIDgxOTAsIDIwIGJpdHMgZm9yIFQ2NSBSRiAqLwotCQlyZXRWYWx1ZSA9IFBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmTFNTSVJlYWRCYWNrLAotCQkJCQkgIGJMU1NJUmVhZEJhY2tEYXRhKTsKLQkJLyogREJHXzg3MjNBKCJSZWFkYmFjayBmcm9tIFJGLVNJIDogMHgleFxuIiwgcmV0VmFsdWUpOyAqLwotCX0KLQkvKiBEQkdfODcyM0EoIlJGUi0lZCBBZGRyWzB4JXhdPSAweCV4XG4iLCBlUkZQYXRoLCBwUGh5UmVnLT5yZkxTU0lSZWFkQmFjaywgcmV0VmFsdWUpOyAqLwotCi0JcmV0dXJuIHJldFZhbHVlOwotfQotCi0vKioKLSogRnVuY3Rpb246CXBoeV9SRlNlcmlhbFdyaXRlCi0qCi0qIE92ZXJWaWV3OglXcml0ZSBkYXRhIHRvIFJGIHJlZ2lzdGVyIChwYWdlIDh+KQotKgotKiBJbnB1dDoKLSoJc3RydWN0IHJ0d19hZGFwdGVyICoJCUFkYXB0ZXIsCi0qCWVudW0gUkZfUkFESU9fUEFUSAllUkZQYXRoLAlSYWRpbyBwYXRoIG9mIEEvQi9DL0QKLSoJdTMyIE9mZnNldCwJCQlUaGUgdGFyZ2V0IGFkZHJlc3MgdG8gYmUgcmVhZAotKgl1MzIgRGF0YQkJCVRoZSBuZXcgcmVnaXN0ZXIgRGF0YSBpbiB0aGUgdGFyZ2V0Ci0qCQkJCQliaXQgcG9zaXRpb24gb2YgdGhlIHRhcmdldCB0byBiZSByZWFkCi0qCi0qIE91dHB1dDoKLSoJTm9uZQotKiBSZXR1cm46Ci0qCU5vbmUKLSogTm90ZToKLSoJVGhyZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBzZXJpYWwgb3BlcmF0aW9uczoKLSoJCTEuIFNvZnR3YXJlIHNlcmlhbCB3cml0ZQotKgkJMi4gSGFyZHdhcmUgTFNTSS1Mb3cgU3BlZWQgU2VyaWFsIEludGVyZmFjZQotKgkJMy4gSGFyZHdhcmUgSFNTSS1IaWdoIHNwZWVkCi0qCQlzZXJpYWwgd3JpdGUuIERyaXZlciBuZWVkIHRvIGltcGxlbWVudCAoMSkgYW5kICgyKS4KLSoJCVRoaXMgZnVuY3Rpb24gaXMgZXF1YWwgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIFJGX1JlYWRSZWcoKSBhbmQKLSoJCVJGTFNTSVJlYWQoKQotKgotKiBOb3RlOgkgIEZvciBSRjgyNTYgb25seQotKiBUaGUgdG90YWwgY291bnQgb2YgUlRMODI1NihaZWJyYTQpIHJlZ2lzdGVyIGlzIGFyb3VuZCAzNiBiaXQgaXQgb25seSBlbXBsb3lzCi0qIDQtYml0IFJGIGFkZHJlc3MuIFJUTDgyNTYgdXNlcyAicmVnaXN0ZXIgbW9kZSBjb250cm9sIGJpdCIKLSogKFJlZzAwWzEyXSwgUmVnMDBbMTBdKSB0byBhY2Nlc3MgcmVnaXN0ZXIgYWRkcmVzcyBiaWdnZXIgdGhhbiAweGYuCi0qIFNlZSAiQXBwZW5kaXgtNCBpbiBQSFkgQ29uZmlndXJhdGlvbiBwcm9ncmFtbWluZyBndWlkZSIgZm9yIG1vcmUgZGV0YWlscy4KLSogVGh1cywgd2UgZGVmaW5lIGEgc3ViLWZpbmN0aW9uIGZvciBSVEw4NTI2IHJlZ2lzdGVyIGFkZHJlc3MgY29udmVyc2lvbgotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiBSZWdpc3RlciBNb2RlOglSZWdDVExbMV0JUmVnQ1RMWzBdCU5vdGUKLSoJCQkoUmVnMDBbMTJdKQkoUmVnMDBbMTBdKQotKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKiBSZWdfTW9kZTAJCTAJCXgJCVJlZyAwIH4xNSgweDAgfiAweGYpCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBSZWdfTW9kZTEJCTEJCTAJCVJlZyAxNiB+MzAoMHgxIH4gMHhmKQotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogUmVnX01vZGUyCQkxCQkxCQlSZWcgMzEgfiA0NSgweDEgfiAweGYpCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKgkyMDA4LzA5LzAyCU1ICUFkZCA5MlMgUkYgZGVmaW5pdGlvbgotKi8KLXN0YXRpYwl2b2lkCi1waHlfUkZTZXJpYWxXcml0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIGVudW0gUkZfUkFESU9fUEFUSCBlUkZQYXRoLAotCQkgIHUzMiBPZmZzZXQsIHUzMiBEYXRhKQotewotCXUzMiBEYXRhQW5kQWRkciA9IDA7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgYmJfcmVnX2RlZmluZSAqcFBoeVJlZyA9ICZwSGFsRGF0YS0+UEhZUmVnRGVmW2VSRlBhdGhdOwotCXUzMiBOZXdPZmZzZXQ7Ci0KLQkvKiAgMjAwOS8wNi8xNyBNSCBXZSBjYW4gbm90IGV4ZWN1dGUgSU8gZm9yIHBvd2VyIHNhdmUgb3IKLQkgICAgb3RoZXIgYWNjaWRlbnQgbW9kZS4gKi8KLQkvKiBpZiAoUlRfQ0FOTk9UX0lPKEFkYXB0ZXIpKSAqLwotCS8qICAqLwotCS8qCVJUUFJJTlQoRlBIWSwgUEhZX1JGVywgKCJwaHlfUkZTZXJpYWxXcml0ZSBzdG9wXG4iKSk7ICovCi0JLyoJcmV0dXJuOyAqLwotCS8qICAqLwotCi0JT2Zmc2V0ICY9IDB4M2Y7Ci0KLQkvKiAgKi8KLQkvKiAgU2hhZG93IFVwZGF0ZSAqLwotCS8qICAqLwotCS8qIFBIWV9SRlNoYWRvd1dyaXRlKEFkYXB0ZXIsIGVSRlBhdGgsIE9mZnNldCwgRGF0YSk7ICovCi0KLQkvKiAgKi8KLQkvKiAgU3dpdGNoIHBhZ2UgZm9yIDgyNTYgUkYgSUMgKi8KLQkvKiAgKi8KLQlOZXdPZmZzZXQgPSBPZmZzZXQ7Ci0KLQkvKiAgKi8KLQkvKiAgUHV0IHdyaXRlIGFkZHIgaW4gWzU6MF0gIGFuZCB3cml0ZSBkYXRhIGluIFszMToxNl0gKi8KLQkvKiAgKi8KLQkvKiBEYXRhQW5kQWRkciA9IChEYXRhPDwxNikgfCAoTmV3T2Zmc2V0JjB4M2YpOyAqLwotCS8qICBUNjUgUkYgKi8KLQlEYXRhQW5kQWRkciA9ICgoTmV3T2Zmc2V0PDwyMCkgfCAoRGF0YSYweDAwMGZmZmZmKSkgJiAweDBmZmZmZmZmOwotCi0JLyogICovCi0JLyogIFdyaXRlIE9wZXJhdGlvbiAqLwotCS8qICAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIERhdGFBbmRBZGRyKTsKLX0KLQotLyoqCi0qIEZ1bmN0aW9uOglQSFlfUXVlcnlSRlJlZwotKgotKiBPdmVyVmlldzoJUXVlcnkgIlNwZWNpZmljIGJpdHMiIHRvIFJGIHJlZ2lzdGVyIChwYWdlIDh+KQotKgotKiBJbnB1dDoKLSoJc3RydWN0IHJ0d19hZGFwdGVyICoJCUFkYXB0ZXIsCi0qCWVudW0gUkZfUkFESU9fUEFUSAllUkZQYXRoLAlSYWRpbyBwYXRoIG9mIEEvQi9DL0QKLSoJdTMyIFJlZ0FkZHIsCQkJVGhlIHRhcmdldCBhZGRyZXNzIHRvIGJlIHJlYWQKLSoJdTMyQml0TWFzawkJCVRoZSB0YXJnZXQgYml0IHBvc2l0aW9uIGluIHRoZSB0YXJnZXQKLSoJCQkJCWFkZHJlc3MJdG8gYmUgcmVhZAotKgotKiBPdXRwdXQ6Ci0qCU5vbmUKLSogUmV0dXJuOgotKgl1MzIJCQkJUmVhZGJhY2sgdmFsdWUKLSogTm90ZToKLSoJVGhpcyBmdW5jdGlvbiBpcyBlcXVhbCB0byAiR2V0UkZSZWdTZXR0aW5nIiBpbiBQSFkgcHJvZ3JhbW1pbmcgZ3VpZGUKLSovCi11MzIKLVBIWV9RdWVyeVJGUmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsCi0JICAgICAgIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzaykKLXsKLQl1MzIgT3JpZ2luYWxfVmFsdWUsIFJlYWRiYWNrX1ZhbHVlLCBCaXRTaGlmdDsKLQkvKiBzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOyAqLwotCS8qIHU4CVJGV2FpdENvdW50ZXIgPSAwOyAqLwotCS8qIF9pcnFMCWlycUw7ICovCi0KLQlPcmlnaW5hbF9WYWx1ZSA9IHBoeV9SRlNlcmlhbFJlYWQoQWRhcHRlciwgZVJGUGF0aCwgUmVnQWRkcik7Ci0KLQlCaXRTaGlmdCA9ICBwaHlfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7Ci0JUmVhZGJhY2tfVmFsdWUgPSAoT3JpZ2luYWxfVmFsdWUgJiBCaXRNYXNrKSA+PiBCaXRTaGlmdDsKLQotCXJldHVybiBSZWFkYmFja19WYWx1ZTsKLX0KLQotLyoqCi0qIEZ1bmN0aW9uOglQSFlfU2V0UkZSZWcKLSoKLSogT3ZlclZpZXc6CVdyaXRlICJTcGVjaWZpYyBiaXRzIiB0byBSRiByZWdpc3RlciAocGFnZSA4fikKLSoKLSogSW5wdXQ6Ci0qCXN0cnVjdCBydHdfYWRhcHRlciAqCQlBZGFwdGVyLAotKgllbnVtIFJGX1JBRElPX1BBVEgJZVJGUGF0aCwJUmFkaW8gcGF0aCBvZiBBL0IvQy9ECi0qCXUzMiBSZWdBZGRyLAkJCVRoZSB0YXJnZXQgYWRkcmVzcyB0byBiZSBtb2RpZmllZAotKgl1MzIgQml0TWFzawkJCVRoZSB0YXJnZXQgYml0IHBvc2l0aW9uIGluIHRoZSB0YXJnZXQKLSoJCQkJCWFkZHJlc3MgdG8gYmUgbW9kaWZpZWQKLSoJdTMyIERhdGEJCQlUaGUgbmV3IHJlZ2lzdGVyIERhdGEgaW4gdGhlIHRhcmdldAotKgkJCQkJYml0IHBvc2l0aW9uIG9mIHRoZSB0YXJnZXQgYWRkcmVzcwotKgotKiBPdXRwdXQ6Ci0qCU5vbmUKLSogUmV0dXJuOgotKglOb25lCi0qIE5vdGU6CVRoaXMgZnVuY3Rpb24gaXMgZXF1YWwgdG8gIlB1dFJGUmVnU2V0dGluZyIgaW4gUEhZIHByb2dyYW1taW5nIGd1aWRlCi0qLwotdm9pZAotUEhZX1NldFJGUmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsCi0JICAgICB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2ssIHUzMiBEYXRhKQotewotCS8qIHN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7ICovCi0JLyogdTggUkZXYWl0Q291bnRlcgk9IDA7ICovCi0JdTMyIE9yaWdpbmFsX1ZhbHVlLCBCaXRTaGlmdDsKLQotCS8qICBSRiBkYXRhIGlzIDEyIGJpdHMgb25seSAqLwotCWlmIChCaXRNYXNrICE9IGJSRlJlZ09mZnNldE1hc2spIHsKLQkJT3JpZ2luYWxfVmFsdWUgPSBwaHlfUkZTZXJpYWxSZWFkKEFkYXB0ZXIsIGVSRlBhdGgsIFJlZ0FkZHIpOwotCQlCaXRTaGlmdCA9ICBwaHlfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7Ci0JCURhdGEgPSAoT3JpZ2luYWxfVmFsdWUgJiAofkJpdE1hc2spKSB8IChEYXRhIDw8IEJpdFNoaWZ0KTsKLQl9Ci0KLQlwaHlfUkZTZXJpYWxXcml0ZShBZGFwdGVyLCBlUkZQYXRoLCBSZWdBZGRyLCBEYXRhKTsKLX0KLQotLyogIDMuIEluaXRpYWwgTUFDL0JCL1JGIGNvbmZpZyBieSByZWFkaW5nIE1BQy9CQi9SRiB0eHQuICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiAgICBQSFlfTUFDQ29uZmlnODcyM0EKLSAqCi0gKiBPdmVydmlldzoJQ29uZGlnIE1BQyBieSBoZWFkZXIgZmlsZSBvciBwYXJhbWV0ZXIgZmlsZS4KLSAqCi0gKiBJbnB1dDogICAgICAgTk9ORQotICoKLSAqIE91dHB1dDogICAgICBOT05FCi0gKgotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqCi0gKiBSZXZpc2VkIEhpc3Rvcnk6Ci0gKiAgV2hlbgkJV2hvCQlSZW1hcmsKLSAqICAwOC8xMi8yMDA4CU1IQwkJQ3JlYXRlIFZlcnNpb24gMC4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgUEhZX01BQ0NvbmZpZzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JLyogICovCi0JLyogIENvbmZpZyBNQUMgKi8KLQkvKiAgKi8KLQlPRE1fUmVhZEFuZENvbmZpZ19NQUNfUkVHXzg3MjNBKCZwSGFsRGF0YS0+b2RtcHJpdik7Ci0KLQkvKiAgMjAxMC4wNy4xMyBBTVBEVSBhZ2dyZWdhdGlvbiBudW1iZXIgOSAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX01BWF9BR0dSX05VTSwgMHgwQSk7Ci0JaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIgJiYKLQkgICAgQk9BUkRfVVNCX0RPTkdMRSA9PSBwSGFsRGF0YS0+Qm9hcmRUeXBlKQotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4NDAsIDB4MDQpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKioKLSogRnVuY3Rpb246CXBoeV9Jbml0QkJSRlJlZ2lzdGVyRGVmaW5pdGlvbgotKgotKiBPdmVyVmlldzoJSW5pdGlhbGl6ZSBSZWdpc3RlciBkZWZpbml0aW9uIG9mZnNldCBmb3IgUmFkaW8gUGF0aCBBL0IvQy9ECi0qCi0qIElucHV0OgotKgkJCXN0cnVjdCBydHdfYWRhcHRlciAqCQlBZGFwdGVyLAotKgotKiBPdXRwdXQ6CU5vbmUKLSogUmV0dXJuOgkJTm9uZQotKiBOb3RlOgotKglUaGUgaW5pdGlhbGl6YXRpb24gdmFsdWUgaXMgY29uc3RhbnQgYW5kIGl0IHNob3VsZCBuZXZlciBiZSBjaGFuZ2VzCi0qLwotc3RhdGljCXZvaWQKLXBoeV9Jbml0QkJSRlJlZ2lzdGVyRGVmaW5pdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCS8qICBSRiBJbnRlcmZhY2UgU293cnR3YXJlIENvbnRyb2wgKi8KLQkgLyogIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg3MCAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOwotCSAvKiAgMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODcwICgxNi1iaXQgZm9yIDB4ODcyKSAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOwotCi0JLyogIFJGIEludGVyZmFjZSBSZWFkYmFjayBWYWx1ZSAqLwotCS8qICAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4RTAgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZpbnRmaSA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VSQjsKLQkvKiAgMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4OEUwICgxNi1iaXQgZm9yIDB4OEUyKSAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZmludGZpID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVJCOwotCi0JLyogIFJGIEludGVyZmFjZSBPdXRwdXQgKGFuZCBFbmFibGUpICovCi0JLyogIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2MCAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZmludGZvID0gckZQR0EwX1hBX1JGSW50ZXJmYWNlT0U7Ci0JIC8qICAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjQgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZpbnRmbyA9IHJGUEdBMF9YQl9SRkludGVyZmFjZU9FOwotCi0JLyogIFJGIEludGVyZmFjZSAoT3V0cHV0IGFuZCkgIEVuYWJsZSAqLwotCSAvKiAgMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODYwICgxNi1iaXQgZm9yIDB4ODYyKSAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZmludGZlID0gckZQR0EwX1hBX1JGSW50ZXJmYWNlT0U7Ci0JLyogIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2NCAoMTYtYml0IGZvciAweDg2NikgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZpbnRmZSA9IHJGUEdBMF9YQl9SRkludGVyZmFjZU9FOwotCi0JLyogQWRkciBvZiBMU1NJLiBXaXJ0ZSBSRiByZWdpc3RlciBieSBkcml2ZXIgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQV9MU1NJUGFyYW1ldGVyOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZjN3aXJlT2Zmc2V0ID0gckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXI7Ci0KLQkvKiAgUkYgcGFyYW1ldGVyICovCi0JLyogQkIgQmFuZCBTZWxlY3QgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXI7Ci0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWEFCX1JGUGFyYW1ldGVyOwotCi0JLyogIFR4IEFHQyBHYWluIFN0YWdlIChzYW1lIGZvciBhbGwgcGF0aC4gU2hvdWxkIHdlIHJlbW92ZSB0aGlzPykgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKLQotCS8qICBUcmFuY2VpdmVyIEF+RCBIU1NJIFBhcmFtZXRlci0xICovCi0JLyogd2lyZSBjb250cm9sIHBhcmFtZXRlcjEgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZIU1NJUGFyYTEgPSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjE7Ci0JLyogd2lyZSBjb250cm9sIHBhcmFtZXRlcjEgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZIU1NJUGFyYTEgPSByRlBHQTBfWEJfSFNTSVBhcmFtZXRlcjE7Ci0KLQkvKiAgVHJhbmNlaXZlciBBfkQgSFNTSSBQYXJhbWV0ZXItMiAqLwotCS8qIHdpcmUgY29udHJvbCBwYXJhbWV0ZXIyICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyOwotCS8qIHdpcmUgY29udHJvbCBwYXJhbWV0ZXIyICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIyOwotCi0JLyogIFJGIHN3aXRjaCBDb250cm9sICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmU3dpdGNoQ29udHJvbCA9Ci0JCXJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbDsgLyogVFIvQW50IHN3aXRjaCBjb250cm9sICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmU3dpdGNoQ29udHJvbCA9Ci0JCXJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbDsKLQotCS8qICBBR0MgY29udHJvbCAxICovCi0JcEhhbERhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWEFBR0NDb3JlMTsKLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZBR0NDb250cm9sMSA9IHJPRkRNMF9YQkFHQ0NvcmUxOwotCi0JLyogIEFHQyBjb250cm9sIDIgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZBR0NDb250cm9sMiA9IHJPRkRNMF9YQUFHQ0NvcmUyOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hCQUdDQ29yZTI7Ci0KLQkvKiAgUlggQUZFIGNvbnRyb2wgMSAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZlJ4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEFSeElRSW1iYWxhbmNlOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZlJ4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEJSeElRSW1iYWxhbmNlOwotCi0JLyogIFJYIEFGRSBjb250cm9sIDEgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZSeEFGRSA9IHJPRkRNMF9YQVJ4QUZFOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZlJ4QUZFID0gck9GRE0wX1hCUnhBRkU7Ci0KLQkvKiAgVHggQUZFIGNvbnRyb2wgMSAqLwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEFUeElRSW1iYWxhbmNlOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEJUeElRSW1iYWxhbmNlOwotCi0JLyogIFR4IEFGRSBjb250cm9sIDIgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZUeEFGRSA9IHJPRkRNMF9YQVR4QUZFOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZlR4QUZFID0gck9GRE0wX1hCVHhBRkU7Ci0KLQkvKiAgVHJhbmNlaXZlciBMU1NJIFJlYWRiYWNrIFNJIG1vZGUgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWEFfTFNTSVJlYWRCYWNrOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQl9MU1NJUmVhZEJhY2s7Ci0KLQkvKiAgVHJhbmNlaXZlciBMU1NJIFJlYWRiYWNrIFBJIG1vZGUgKi8KLQlwSGFsRGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZMU1NJUmVhZEJhY2tQaSA9Ci0JCVRyYW5zY2VpdmVyQV9IU1BJX1JlYWRiYWNrOwotCXBIYWxEYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZkxTU0lSZWFkQmFja1BpID0KLQkJVHJhbnNjZWl2ZXJCX0hTUElfUmVhZGJhY2s7Ci19Ci0KLS8qICBUaGUgZm9sbG93aW5nIGlzIGZvciBIaWdoIFBvd2VyIFBBICovCi1zdGF0aWMgdm9pZAotc3RvcmVQd3JJbmRleERpZmZSYXRlT2Zmc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTMyIFJlZ0FkZHIsCi0JCQkgICAgdTMyIEJpdE1hc2ssIHUzMiBEYXRhKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9SYXRlMThfMDYpIHsKLQkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bMF0gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9SYXRlNTRfMjQpIHsKLQkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bMV0gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9DQ0sxX01jczMyKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzZdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExICYmIEJpdE1hc2sgPT0gMHhmZmZmZmYwMCkgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs3XSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19BX01jczAzX01jczAwKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzJdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0FfTWNzMDdfTWNzMDQpIHsKLQkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bM10gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9NY3MxMV9NY3MwOCkgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs0XSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19BX01jczE1X01jczEyKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzVdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfUmF0ZTE4XzA2KSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzhdID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfUmF0ZTU0XzI0KSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzldID0gRGF0YTsKLQl9Ci0JaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfQ0NLMV81NV9NY3MzMikgewotCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxNF0gPSBEYXRhOwotCX0KLQlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9DQ0sxMV9BX0NDSzJfMTEgJiYgQml0TWFzayA9PSAweDAwMDAwMGZmKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzE1XSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX01jczAzX01jczAwKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzEwXSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX01jczA3X01jczA0KSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzExXSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX01jczExX01jczA4KSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzEyXSA9IERhdGE7Ci0JfQotCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX01jczE1X01jczEyKSB7Ci0JCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzEzXSA9IERhdGE7Ci0JCXBIYWxEYXRhLT5wd3JHcm91cENudCsrOwotCX0KLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRnVuY3Rpb246CXBoeV9Db25maWdCQldpdGhQZ0hlYWRlckZpbGUKLSAqCi0gKiBPdmVydmlldzoJQ29uZmlnIFBIWV9SRUdfUEcgYXJyYXkKLSAqCi0gKiBJbnB1dDogICAgICAgTk9ORQotICoKLSAqIE91dHB1dDogICAgICBOT05FCi0gKgotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqCi0gKiBSZXZpc2VkIEhpc3Rvcnk6Ci0gKiBXaGVuCQlXaG8JUmVtYXJrCi0gKiAxMS8wNi8yMDA4CU1IQwlBZGQgbGF0ZXIhISEhISEuLiBQbGVhc2UgbW9kaWZ5IGZvciBuZXcgZmlsZXMhISEhCi0gKiAxMS8xMC8yMDA4CXR5bmxpCU1vZGlmeSB0byBtZXcgZmlsZXMuCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMJaW50Ci1waHlfQ29uZmlnQkJXaXRoUGdIZWFkZXJGaWxlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlpbnQgaTsKLQl1MzIgKlJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVfUEc7Ci0JdTE2IFBIWV9SRUdBcnJheVBHTGVuOwotCi0JUEhZX1JFR0FycmF5UEdMZW4gPSBSdGw4NzIzX1BIWV9SRUdfQXJyYXlfUEdMZW5ndGg7Ci0JUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZV9QRyA9ICh1MzIgKilSdGw4NzIzX1BIWV9SRUdfQXJyYXlfUEc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUEhZX1JFR0FycmF5UEdMZW47IGkgPSBpICsgMykgewotCQlzdG9yZVB3ckluZGV4RGlmZlJhdGVPZmZzZXQoQWRhcHRlciwKLQkJCQkJICAgIFJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVfUEdbaV0sCi0JCQkJCSAgICBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlX1BHW2krMV0sCi0JCQkJCSAgICBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlX1BHW2krMl0pOwotCX0KLQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotc3RhdGljIHZvaWQKLXBoeV9CQjgxOTJDX0NvbmZpZ18xVChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JLyogZm9yIHBhdGggLSBCICovCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9UeEluZm8sIDB4MywgMHgyKTsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0ExX1R4SW5mbywgMHgzMDAwMzMsIDB4MjAwMDIyKTsKLQotCS8qICAyMDEwMDUxOSBKb3NlcGg6IEFkZCBmb3IgMVQyUiBjb25maWcuIFN1Z2dlc3RlZCBieSBLZXZpbiwKLQkgICAgSmVueXUgYW5kIFl1bmFuLiAqLwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByQ0NLMF9BRkVTZXR0aW5nLCBiTWFza0J5dGUzLCAweDQ1KTsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1RSeFBhdGhFbmFibGUsIGJNYXNrQnl0ZTAsIDB4MjMpOwotCS8qICBCIHBhdGggZmlyc3QgQUdDICovCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9BR0NQYXJhbWV0ZXIxLCAweDMwLCAweDEpOwotCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIDB4ZTc0LCAweDBjMDAwMDAwLCAweDIpOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCAweGU3OCwgMHgwYzAwMDAwMCwgMHgyKTsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgMHhlN2MsIDB4MGMwMDAwMDAsIDB4Mik7Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIDB4ZTgwLCAweDBjMDAwMDAwLCAweDIpOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCAweGU4OCwgMHgwYzAwMDAwMCwgMHgyKTsKLX0KLQotc3RhdGljIGludAotcGh5X0JCODcyM2FfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBFRVBST00gPSBHRVRfRUVQUk9NX0VGVVNFX1BSSVYoQWRhcHRlcik7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlpbnQgcnRTdGF0dXMgPSBfU1VDQ0VTUzsKLQotCS8qICAqLwotCS8qICAxLiBSZWFkIFBIWV9SRUcuVFhUIEJCIElOSVQhISAqLwotCS8qICBXZSB3aWxsIHNlcGFyYXRlIGFzIDg4QyAvIDkyQyBhY2NvcmRpbmcgdG8gY2hpcCB2ZXJzaW9uICovCi0JLyogICovCi0JT0RNX1JlYWRBbmRDb25maWdfUEhZX1JFR18xVF84NzIzQSgmcEhhbERhdGEtPm9kbXByaXYpOwotCi0JLyogICovCi0JLyogIDIwMTAwMzE4IEpvc2VwaDogQ29uZmlnIDJUMlIgdG8gMVQyUiBpZiBuZWNlc3NhcnkuICovCi0JLyogICovCi0JaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzFUMlIpIHsKLQkJcGh5X0JCODE5MkNfQ29uZmlnXzFUKEFkYXB0ZXIpOwotCQlEQkdfODcyM0EoInBoeV9CQjg3MjNhX0NvbmZpZ19QYXJhRmlsZSgpOkNvbmZpZyB0byAxVCEhXG4iKTsKLQl9Ci0KLQkvKiAgKi8KLQkvKiAgMi4gSWYgRUVQUk9NIG9yIEVGVVNFIGF1dG9sb2FkIE9LLCBXZSBtdXN0IGNvbmZpZyBieQotCSAgICBQSFlfUkVHX1BHLnR4dCAqLwotCS8qICAqLwotCWlmIChwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnID09IGZhbHNlKSB7Ci0JCXBIYWxEYXRhLT5wd3JHcm91cENudCA9IDA7Ci0KLQkJcnRTdGF0dXMgPSBwaHlfQ29uZmlnQkJXaXRoUGdIZWFkZXJGaWxlKEFkYXB0ZXIpOwotCX0KLQotCWlmIChydFN0YXR1cyAhPSBfU1VDQ0VTUykKLQkJZ290byBwaHlfQkI4MTkwX0NvbmZpZ19QYXJhRmlsZV9GYWlsOwotCi0JLyogICovCi0JLyogIDMuIEJCIEFHQyB0YWJsZSBJbml0aWFsaXphdGlvbiAqLwotCS8qICAqLwotCU9ETV9SZWFkQW5kQ29uZmlnX0FHQ19UQUJfMVRfODcyM0EoJnBIYWxEYXRhLT5vZG1wcml2KTsKLQotcGh5X0JCODE5MF9Db25maWdfUGFyYUZpbGVfRmFpbDoKLQotCXJldHVybiBydFN0YXR1czsKLX0KLQotaW50Ci1QSFlfQkJDb25maWc4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JaW50IHJ0U3RhdHVzID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhCSpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1OCBUbXBVMUIgPSAwOwotCXU4IENyeXN0YWxDYXA7Ci0KLQlwaHlfSW5pdEJCUkZSZWdpc3RlckRlZmluaXRpb24oQWRhcHRlcik7Ci0KLQkvKiAgU3VnZ2VzdGVkIGJ5IFNjb3R0LiB0eW5saV90ZXN0LiAyMDEwLjEyLjMwLiAqLwotCS8qIDEuIDB4MjhbMV0gPSAxICovCi0JVG1wVTFCID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwpOwotCXVkZWxheSgyKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwsIFRtcFUxQiB8IEJJVCgxKSk7Ci0JdWRlbGF5KDIpOwotCi0JLyogMi4gMHgyOVs3OjBdID0gMHhGRiAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCsxLCAweGZmKTsKLQl1ZGVsYXkoMik7Ci0KLQkvKiAzLiAweDAyWzE6MF0gPSAyYicxMSAqLwotCVRtcFUxQiA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4pOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1NZU19GVU5DX0VOLAotCQkJIChUbXBVMUIgfCBGRU5fQkJfR0xCX1JTVG4gfCBGRU5fQkJSU1RCKSk7Ci0KLQkvKiA0LiAweDI1WzZdID0gMCAqLwotCVRtcFUxQiA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfQUZFX1hUQUxfQ1RSTCArIDEpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX0FGRV9YVEFMX0NUUkwrMSwgVG1wVTFCICYgfkJJVCg2KSk7Ci0KLQkvKiA1LiAweDI0WzIwXSA9IDAJQWR2aXNlZCBieSBTRDMgQWxleCBXYW5nLiAyMDExLjAyLjA5LiAqLwotCVRtcFUxQiA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfQUZFX1hUQUxfQ1RSTCsyKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19BRkVfWFRBTF9DVFJMKzIsIFRtcFUxQiAmIH5CSVQoNCkpOwotCi0JLyogNi4gMHgxZls3OjBdID0gMHgwNyAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JGX0NUUkwsIDB4MDcpOwotCi0JLyogICovCi0JLyogIENvbmZpZyBCQiBhbmQgQUdDICovCi0JLyogICovCi0JcnRTdGF0dXMgPSBwaHlfQkI4NzIzYV9Db25maWdfUGFyYUZpbGUoQWRhcHRlcik7Ci0KLS8qIG9ubHkgZm9yIEItY3V0ICovCi0JaWYgKHBIYWxEYXRhLT5FRVBST01WZXJzaW9uID49IDB4MDEpIHsKLQkJQ3J5c3RhbENhcCA9IHBIYWxEYXRhLT5DcnlzdGFsQ2FwICYgMHgzRjsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIFJFR19NQUNfUEhZX0NUUkwsIDB4RkZGMDAwLAotCQkJICAgICAoQ3J5c3RhbENhcCB8IChDcnlzdGFsQ2FwIDw8IDYpKSk7Ci0JfQotCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0xET0ExNV9DVFJMLCAweDAxNTcyNTA1KTsKLQlyZXR1cm4gcnRTdGF0dXM7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiAgICBTZXRUeFBvd2VyTGV2ZWw4NzIzQSgpCi0gKgotICogT3ZlcnZpZXc6ICAgIFRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0IHRvICJIYWxDb21tb24iIG1vdWR1bGUKLSAqCQkJV2UgbXVzdCBjb25zaWRlciBSRiBwYXRoIGxhdGVyISEhISEhIQotICoKLSAqIElucHV0OiAgICAgICBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKgkJQWRhcHRlcgotICoJCQl1OAkJY2hhbm5lbAotICoKLSAqIE91dHB1dDogICAgICBOT05FCi0gKgotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIFBIWV9TZXRUeFBvd2VyTGV2ZWw4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGNoYW5uZWwpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1OCBjY2twd3JbMl0sIG9mZG1wd3JbMl07CS8qICBbMF06UkYtQSwgWzFdOlJGLUIgKi8KLQlpbnQgaSA9IGNoYW5uZWwgLSAxOwotCi0JaWYgKHBIYWxEYXRhLT5iVFhQb3dlckRhdGFSZWFkRnJvbUVFUE9STSA9PSBmYWxzZSkKLQkJcmV0dXJuOwotCi0JLyogIDEuIENDSyAqLwotCWNja3B3cltSRl9QQVRIX0FdID0gcEhhbERhdGEtPlR4UHdyTGV2ZWxDY2tbUkZfUEFUSF9BXVtpXTsKLQljY2twd3JbUkZfUEFUSF9CXSA9IHBIYWxEYXRhLT5UeFB3ckxldmVsQ2NrW1JGX1BBVEhfQl1baV07Ci0KLQkvKiAgMi4gT0ZETSBmb3IgMVMgb3IgMlMgKi8KLQlpZiAoR0VUX1JGX1RZUEUoQWRhcHRlcikgPT0gUkZfMVQyUiB8fAotCSAgICBHRVRfUkZfVFlQRShBZGFwdGVyKSA9PSBSRl8xVDFSKSB7Ci0JCS8qICBSZWFkIEhUIDQwIE9GRE0gVFggcG93ZXIgKi8KLQkJb2ZkbXB3cltSRl9QQVRIX0FdID0gcEhhbERhdGEtPlR4UHdyTGV2ZWxIVDQwXzFTW1JGX1BBVEhfQV1baV07Ci0JCW9mZG1wd3JbUkZfUEFUSF9CXSA9IHBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8xU1tSRl9QQVRIX0JdW2ldOwotCX0gZWxzZSBpZiAoR0VUX1JGX1RZUEUoQWRhcHRlcikgPT0gUkZfMlQyUikgewotCQkvKiAgUmVhZCBIVCA0MCBPRkRNIFRYIHBvd2VyICovCi0JCW9mZG1wd3JbUkZfUEFUSF9BXSA9IHBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8yU1tSRl9QQVRIX0FdW2ldOwotCQlvZmRtcHdyW1JGX1BBVEhfQl0gPSBwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMlNbUkZfUEFUSF9CXVtpXTsKLQl9Ci0KLQlydGw4MjNhX3BoeV9yZjYwNTJzZXRjY2t0eHBvd2VyKEFkYXB0ZXIsICZjY2twd3JbMF0pOwotCXJ0bDg3MjNhX1BIWV9SRjYwNTJTZXRPRkRNVHhQb3dlcihBZGFwdGVyLCAmb2ZkbXB3clswXSwgY2hhbm5lbCk7Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiAgICBQSFlfU2V0QldNb2RlMjNhQ2FsbGJhY2s4MTkyQygpCi0gKgotICogT3ZlcnZpZXc6ICAgIFRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBTZXRTZXRCV01vZGUyM2EKLSAqCi0gKiBJbnB1dDoJCVBSVF9USU1FUgkJcFRpbWVyCi0gKgotICogT3V0cHV0OiAgICAgIE5PTkUKLSAqCi0gKiBSZXR1cm46ICAgICAgTk9ORQotICoKLSAqIE5vdGU6Ci0gKgkoMSkgV2UgZG8gbm90IHRha2UgaiBtb2RlIGludG8gY29uc2lkZXJhdGlvbiBub3cKLSAqCSgyKSBXaWxsIHR3byB3b3JraXRlbSBvZiAic3dpdGNoIGNoYW5uZWwiIGFuZAotICoJICAgICJzd2l0Y2ggY2hhbm5lbCBiYW5kd2lkdGgiIHJ1biBjb25jdXJyZW50bHk/Ci0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZAotX1BIWV9TZXRCV01vZGUyM2E5MkMoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JdTggcmVnQndPcE1vZGU7Ci0JdTggcmVnUlJTUl9SU0M7Ci0KLQlpZiAoQWRhcHRlci0+YkRyaXZlclN0b3BwZWQpCi0JCXJldHVybjsKLQotCS8qIDMgKi8KLQkvKiAzPDE+U2V0IE1BQyByZWdpc3RlciAqLwotCS8qIDMgKi8KLQotCXJlZ0J3T3BNb2RlID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19CV09QTU9ERSk7Ci0JcmVnUlJTUl9SU0MgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX1JSU1IrMik7Ci0KLQlzd2l0Y2ggKHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXKSB7Ci0JY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgotCQlyZWdCd09wTW9kZSB8PSBCV19PUE1PREVfMjBNSFo7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX0JXT1BNT0RFLCByZWdCd09wTW9kZSk7Ci0JCWJyZWFrOwotCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF80MDoKLQkJcmVnQndPcE1vZGUgJj0gfkJXX09QTU9ERV8yME1IWjsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfQldPUE1PREUsIHJlZ0J3T3BNb2RlKTsKLQkJcmVnUlJTUl9SU0MgPSAocmVnUlJTUl9SU0MgJiAweDkwKSB8Ci0JCQkocEhhbERhdGEtPm5DdXI0ME1oelByaW1lU0MgPDwgNSk7Ci0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JSU1IrMiwgcmVnUlJTUl9SU0MpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCS8qIDMgKi8KLQkvKiAzPDI+U2V0IFBIWSByZWxhdGVkIHJlZ2lzdGVyICovCi0JLyogMyAqLwotCXN3aXRjaCAocEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcpIHsKLQkJLyogMjAgTUh6IGNoYW5uZWwqLwotCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgYlJGTU9ELCAweDApOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0ExX1JGTU9ELCBiUkZNT0QsIDB4MCk7Ci0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMiwgQklUKDEwKSwgMSk7Ci0KLQkJYnJlYWs7Ci0KLQkJLyogNDAgTUh6IGNoYW5uZWwqLwotCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF80MDoKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgYlJGTU9ELCAweDEpOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0ExX1JGTU9ELCBiUkZNT0QsIDB4MSk7Ci0KLQkJLyogIFNldCBDb250cm9sIGNoYW5uZWwgdG8gdXBwZXIgb3IgbG93ZXIuIFRoZXNlIHNldHRpbmdzCi0JCSAgICBhcmUgcmVxdWlyZWQgb25seSBmb3IgNDBNSHogKi8KLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJDQ0swX1N5c3RlbSwgYkNDS1NpZGVCYW5kLAotCQkJICAgICAocEhhbERhdGEtPm5DdXI0ME1oelByaW1lU0MgPj4gMSkpOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0xX0xTVEYsIDB4QzAwLAotCQkJICAgICBwSGFsRGF0YS0+bkN1cjQwTWh6UHJpbWVTQyk7Ci0JCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMiwgQklUKDEwKSwgMCk7Ci0KLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIDB4ODE4LCBCSVQoMjYpIHwgQklUKDI3KSwKLQkJCSAgICAgKHBIYWxEYXRhLT5uQ3VyNDBNaHpQcmltZVNDID09Ci0JCQkgICAgICBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpID8gMjoxKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JLyogU2tpcCBvdmVyIHNldHRpbmcgb2YgSi1tb2RlIGluIEJCIHJlZ2lzdGVyIGhlcmUuIERlZmF1bHQgdmFsdWUKLQkgICBpcyAiTm9uZSBKIG1vZGUiLiBFbWlseSAyMDA3MDMxNSAqLwotCi0JLyogIEFkZGVkIGl0IGZvciAyMC80MCBtaHogc3dpdGNoIHRpbWUgZXZhbHVhdGlvbiBieSBndWFuZ2FuIDA3MDUzMSAqLwotCS8qIE5vd0wgPSBQbGF0Zm9ybUVGSU9SZWFkNEJ5dGUoQWRhcHRlciwgVFNGUik7ICovCi0JLyogTm93SCA9IFBsYXRmb3JtRUZJT1JlYWQ0Qnl0ZShBZGFwdGVyLCBUU0ZSKzQpOyAqLwotCS8qIEVuZFRpbWUgPSAoKHU2NClOb3dIIDw8IDMyKSArIE5vd0w7ICovCi0KLQlydGw4NzIzYV9waHlfcmY2MDUyc2V0X2J3KEFkYXB0ZXIsIHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXKTsKLX0KLQotIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiAgIFNldEJXTW9kZTIzYTgxOTBQY2koKQotICoKLSAqIE92ZXJ2aWV3OiAgVGhpcyBmdW5jdGlvbiBpcyBleHBvcnQgdG8gIkhhbENvbW1vbiIgbW91ZHVsZQotICoKLSAqIElucHV0OgkJc3RydWN0IHJ0d19hZGFwdGVyICoJCQlBZGFwdGVyCi0gKgkJCWVudW0gaHRfY2hhbm5lbF93aWR0aAlCYW5kd2lkdGgJMjBNIG9yIDQwTQotICoKLSAqIE91dHB1dDogICAgICBOT05FCi0gKgotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqCi0gKiBOb3RlOgkJV2UgZG8gbm90IHRha2UgaiBtb2RlIGludG8gY29uc2lkZXJhdGlvbiBub3cKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQKLVBIWV9TZXRCV01vZGUyM2E4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCSAgIGVudW0gaHRfY2hhbm5lbF93aWR0aCBCYW5kd2lkdGgsIHVuc2lnbmVkIGNoYXIgT2Zmc2V0KQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JZW51bSBodF9jaGFubmVsX3dpZHRoIHRtcEJXID0gcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlc7Ci0KLQlwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyA9IEJhbmR3aWR0aDsKLQotCXBIYWxEYXRhLT5uQ3VyNDBNaHpQcmltZVNDID0gT2Zmc2V0OwotCi0JaWYgKCghQWRhcHRlci0+YkRyaXZlclN0b3BwZWQpICYmICghQWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkpCi0JCV9QSFlfU2V0QldNb2RlMjNhOTJDKEFkYXB0ZXIpOwotCWVsc2UKLQkJcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcgPSB0bXBCVzsKLX0KLQotc3RhdGljIHZvaWQgX1BIWV9Td0Nobmw4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGNoYW5uZWwpCi17Ci0JZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGg7Ci0JdTMyIHBhcmFtMSwgcGFyYW0yOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQkvKiBzMS4gcHJlIGNvbW1vbiBjb21tYW5kIC0gQ21kSURfU2V0VHhQb3dlckxldmVsICovCi0JUEhZX1NldFR4UG93ZXJMZXZlbDg3MjNBKEFkYXB0ZXIsIGNoYW5uZWwpOwotCi0JLyogczIuIFJGIGRlcGVuZGVudCBjb21tYW5kIC0gQ21kSURfUkZfV3JpdGVSZWcsCi0JICAgcGFyYW0xID0gUkZfQ0hOTEJXLCBwYXJhbTIgPSBjaGFubmVsICovCi0JcGFyYW0xID0gUkZfQ0hOTEJXOwotCXBhcmFtMiA9IGNoYW5uZWw7Ci0JZm9yIChlUkZQYXRoID0gMDsgZVJGUGF0aCA8IHBIYWxEYXRhLT5OdW1Ub3RhbFJGUGF0aDsgZVJGUGF0aCsrKSB7Ci0JCXBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbZVJGUGF0aF0gPQotCQkJKHBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbZVJGUGF0aF0gJiAweGZmZmZmYzAwKSB8IHBhcmFtMjsKLQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIGVSRlBhdGgsIHBhcmFtMSwKLQkJCSAgICAgYlJGUmVnT2Zmc2V0TWFzaywgcEhhbERhdGEtPlJmUmVnQ2hubFZhbFtlUkZQYXRoXSk7Ci0JfQotCi0JLyogczMuIHBvc3QgY29tbW9uIGNvbW1hbmQgLSBDbWRJRF9FbmQsIE5vbmUgKi8KLX0KLQotdm9pZCBQSFlfU3dDaG5sODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCBjaGFubmVsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JdTggdG1wY2hhbm5lbCA9IHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbDsKLQlib29sICByZXN1bHQgPSB0cnVlOwotCi0JaWYgKGNoYW5uZWwgPT0gMCkKLQkJY2hhbm5lbCA9IDE7Ci0KLQlwSGFsRGF0YS0+Q3VycmVudENoYW5uZWwgPSBjaGFubmVsOwotCi0JaWYgKCghQWRhcHRlci0+YkRyaXZlclN0b3BwZWQpICYmICghQWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkpIHsKLQkJX1BIWV9Td0Nobmw4NzIzQShBZGFwdGVyLCBjaGFubmVsKTsKLQotCQlpZiAoIXJlc3VsdCkKLQkJCXBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCA9IHRtcGNoYW5uZWw7Ci0JfSBlbHNlIHsKLQkJcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsID0gdG1wY2hhbm5lbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9yZjYwNTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3JmNjA1Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGMwZmYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3JmNjA1Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqCi0gKiBNb2R1bGU6CXJ0bDgxOTJjX3JmNjA1Mi5jCShTb3VyY2UgQyBGaWxlKQotICoKLSAqIE5vdGU6CVByb3ZpZGUgUkYgNjA1MiBzZXJpZXMgcmVsYXRpdmUgQVBJLgotICoKLSAqIEZ1bmN0aW9uOgotICoKLSAqIEV4cG9ydDoKLSAqCi0gKiBBYmJyZXY6Ci0gKgotICogSGlzdG9yeToKLSAqIERhdGEJCQlXaG8JCVJlbWFyawotICoKLSAqIDA5LzI1LzIwMDgJTUhDCQlDcmVhdGUgaW5pdGlhbCB2ZXJzaW9uLgotICogMTEvMDUvMjAwOAlNSEMJCUFkZCBBUEkgZm9yIHR3IHBvd2VyIHNldHRpbmcuCi0gKgotICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBfUlRMODcyM0FfUkY2MDUyX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOiAgICBQSFlfUkY2MDUyU2V0QmFuZHdpZHRoKCkKLSAqCi0gKiBPdmVydmlldzogICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgU2V0QldNb2RlMjNhQ2FsbGJhY2s4MTkwUGNpKCkgb25seQotICoKLSAqIElucHV0OiAgICAgICBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKgkJCQlBZGFwdGVyCi0gKgkJCVdJUkVMRVNTX0JBTkRXSURUSF9FCUJhbmR3aWR0aAkyME0gb3IgNDBNCi0gKgotICogT3V0cHV0OiAgICAgIE5PTkUKLSAqCi0gKiBSZXR1cm46ICAgICAgTk9ORQotICoKLSAqIE5vdGU6CQlGb3IgUkYgdHlwZSAwMjIyRAotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBydGw4NzIzYV9waHlfcmY2MDUyc2V0X2J3KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCSAgICAgICBlbnVtIGh0X2NoYW5uZWxfd2lkdGggQmFuZHdpZHRoKQkvKiAyME0gb3IgNDBNICovCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCXN3aXRjaCAoQmFuZHdpZHRoKSB7Ci0JY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgotCQlwSGFsRGF0YS0+UmZSZWdDaG5sVmFsWzBdID0KLQkJCShwSGFsRGF0YS0+UmZSZWdDaG5sVmFsWzBdICYgMHhmZmZmZjNmZikgfCAweDA0MDA7Ci0JCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzaywKLQkJCSAgICAgcEhhbERhdGEtPlJmUmVnQ2hubFZhbFswXSk7Ci0JCWJyZWFrOwotCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF80MDoKLQkJcEhhbERhdGEtPlJmUmVnQ2hubFZhbFswXSA9Ci0JCQkocEhhbERhdGEtPlJmUmVnQ2hubFZhbFswXSAmIDB4ZmZmZmYzZmYpOwotCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9BLCBSRl9DSE5MQlcsIGJSRlJlZ09mZnNldE1hc2ssCi0JCQkgICAgIHBIYWxEYXRhLT5SZlJlZ0NobmxWYWxbMF0pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEZ1bmN0aW9uOglQSFlfUkY2MDUyU2V0Q2NrVHhQb3dlcgotICoKLSAqIE92ZXJ2aWV3OgotICoKLSAqIElucHV0OiAgICAgICBOT05FCi0gKgotICogT3V0cHV0OiAgICAgIE5PTkUKLSAqCi0gKiBSZXR1cm46ICAgICAgTk9ORQotICoKLSAqIFJldmlzZWQgSGlzdG9yeToKLSAqIFdoZW4JCQlXaG8JCVJlbWFyawotICogMTEvMDUvMjAwOAlNSEMJCVNpbXVsYXRlIDgxOTJzZXJpZXMuLgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotdm9pZCBydGw4MjNhX3BoeV9yZjYwNTJzZXRjY2t0eHBvd2VyKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCQkgICAgIHU4ICpwUG93ZXJsZXZlbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJkFkYXB0ZXItPm1sbWVleHRwcml2OwotCXUzMiBUeEFHQ1syXSA9IHswLCAwfSwgdG1wdmFsID0gMDsKLQl1OCBpZHgxLCBpZHgyOwotCXU4ICpwdHI7Ci0KLQlpZiAocG1sbWVleHQtPnNpdGVzdXJ2ZXlfcmVzLnN0YXRlID09IFNDQU5fUFJPQ0VTUykgewotCQlUeEFHQ1tSRl9QQVRIX0FdID0gMHgzZjNmM2YzZjsKLQkJVHhBR0NbUkZfUEFUSF9CXSA9IDB4M2YzZjNmM2Y7Ci0KLQkJZm9yIChpZHgxID0gUkZfUEFUSF9BOyBpZHgxIDw9IFJGX1BBVEhfQjsgaWR4MSsrKSB7Ci0JCQlUeEFHQ1tpZHgxXSA9IHBQb3dlcmxldmVsW2lkeDFdIHwKLQkJCQkocFBvd2VybGV2ZWxbaWR4MV0gPDwgOCkgfAotCQkJCShwUG93ZXJsZXZlbFtpZHgxXSA8PCAxNikgfAotCQkJCShwUG93ZXJsZXZlbFtpZHgxXSA8PCAyNCk7Ci0JCQkvKgotCQkJICogMjAxMC8xMC8xOCBNSCBGb3IgZXh0ZXJuYWwgUEEgbW9kdWxlLiBXZSBuZWVkCi0JCQkgKiB0byBsaW1pdCBwb3dlciBpbmRleCB0byBiZSBsZXNzIHRoYW4gMHgyMC4KLQkJCSAqLwotCQkJaWYgKFR4QUdDW2lkeDFdID4gMHgyMCAmJiBwSGFsRGF0YS0+RXh0ZXJuYWxQQSkKLQkJCQlUeEFHQ1tpZHgxXSA9IDB4MjA7Ci0JCX0KLQl9IGVsc2UgewotLyogIDIwMTAwNDI3IEpvc2VwaDogRHJpdmVyIGR5bmFtaWMgVHggcG93ZXIgc2hhbGwgbm90IGFmZmVjdCBUeAotICogIHBvd2VyLiBJdCBzaGFsbCBiZSBkZXRlcm1pbmVkIGJ5IHBvd2VyIHRyYWluaW5nIG1lY2hhbmlzbS4gKi8KLS8qICBDdXJyZW50bHksIHdlIGNhbm5vdCBmdWxseSBkaXNhYmxlIGRyaXZlciBkeW5hbWljIHR4IHBvd2VyCi0gKiAgbWVjaGFuaXNtIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZCBieSBCVCBjb2V4aXN0IG1lY2hhbmlzbS4gKi8KLS8qICBJbiB0aGUgZnV0dXJlLCB0d28gbWVjaGFuaXNtIHNoYWxsIGJlIHNlcGFyYXRlZCBmcm9tIGVhY2ggb3RoZXIKLSAqICBhbmQgbWFpbnRhaW5lZCBpbmRlcGVuZGVudGx5LiBUaGFua3MgZm9yIExhbmhzaW4ncyByZW1pbmRlci4gKi8KLQkJaWYgKHBkbXByaXYtPkR5bmFtaWNUeEhpZ2hQb3dlckx2bCA9PSBUeEhpZ2hQd3JMZXZlbF9MZXZlbDEpIHsKLQkJCVR4QUdDW1JGX1BBVEhfQV0gPSAweDEwMTAxMDEwOwotCQkJVHhBR0NbUkZfUEFUSF9CXSA9IDB4MTAxMDEwMTA7Ci0JCX0gZWxzZSBpZiAocGRtcHJpdi0+RHluYW1pY1R4SGlnaFBvd2VyTHZsID09Ci0JCQkgICBUeEhpZ2hQd3JMZXZlbF9MZXZlbDIpIHsKLQkJCVR4QUdDW1JGX1BBVEhfQV0gPSAweDAwMDAwMDAwOwotCQkJVHhBR0NbUkZfUEFUSF9CXSA9IDB4MDAwMDAwMDA7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGlkeDEgPSBSRl9QQVRIX0E7IGlkeDEgPD0gUkZfUEFUSF9COyBpZHgxKyspIHsKLQkJCQlUeEFHQ1tpZHgxXSA9IHBQb3dlcmxldmVsW2lkeDFdIHwKLQkJCQkJKHBQb3dlcmxldmVsW2lkeDFdIDw8IDgpIHwKLQkJCQkJKHBQb3dlcmxldmVsW2lkeDFdIDw8IDE2KSB8Ci0JCQkJCShwUG93ZXJsZXZlbFtpZHgxXSA8PCAyNCk7Ci0JCQl9Ci0KLQkJCWlmIChwSGFsRGF0YS0+RUVQUk9NUmVndWxhdG9yeSA9PSAwKSB7Ci0JCQkJdG1wdmFsID0gKHBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFswXVs2XSkgKwotCQkJCQkJKHBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFswXVs3XTw8OCk7Ci0JCQkJVHhBR0NbUkZfUEFUSF9BXSArPSB0bXB2YWw7Ci0KLQkJCQl0bXB2YWwgPSAocEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzBdWzE0XSkgKwotCQkJCQkJKHBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFswXVsxNV08PDI0KTsKLQkJCQlUeEFHQ1tSRl9QQVRIX0JdICs9IHRtcHZhbDsKLQkJCX0KLQkJfQotCX0KLQotCWZvciAoaWR4MSA9IFJGX1BBVEhfQTsgaWR4MSA8PSBSRl9QQVRIX0I7IGlkeDErKykgewotCQlwdHIgPSAodTggKikoJlR4QUdDW2lkeDFdKTsKLQkJZm9yIChpZHgyID0gMDsgaWR4MiA8IDQ7IGlkeDIrKykgewotCQkJaWYgKCpwdHIgPiBSRjYwNTJfTUFYX1RYX1BXUikKLQkJCQkqcHRyID0gUkY2MDUyX01BWF9UWF9QV1I7Ci0JCQlwdHIrKzsKLQkJfQotCX0KLQotCS8qICByZi1BIGNjayB0eCBwb3dlciAqLwotCXRtcHZhbCA9IFR4QUdDW1JGX1BBVEhfQV0gJiAweGZmOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByVHhBR0NfQV9DQ0sxX01jczMyLCBiTWFza0J5dGUxLCB0bXB2YWwpOwotCXRtcHZhbCA9IFR4QUdDW1JGX1BBVEhfQV0gPj4gODsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExLCAweGZmZmZmZjAwLCB0bXB2YWwpOwotCi0JLyogIHJmLUIgY2NrIHR4IHBvd2VyICovCi0JdG1wdmFsID0gVHhBR0NbUkZfUEFUSF9CXSA+PiAyNDsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExLCBiTWFza0J5dGUwLCB0bXB2YWwpOwotCXRtcHZhbCA9IFR4QUdDW1JGX1BBVEhfQl0gJiAweDAwZmZmZmZmOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByVHhBR0NfQl9DQ0sxXzU1X01jczMyLCAweGZmZmZmZjAwLCB0bXB2YWwpOwotfQkvKiBQSFlfUkY2MDUyU2V0Q2NrVHhQb3dlciAqLwotCi0vKiAgcG93ZXJiYXNlMCBmb3IgT0ZETSByYXRlcyAqLwotLyogIHBvd2VyYmFzZTEgZm9yIEhUIE1DUyByYXRlcyAqLwotc3RhdGljIHZvaWQgZ2V0UG93ZXJCYXNlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTggKnBQb3dlckxldmVsLAotCQkJIHU4IENoYW5uZWwsIHUzMiAqT2ZkbUJhc2UsIHUzMiAqTUNTQmFzZSkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXUzMiBvZmRtLCBtY3M7Ci0JdTggTGVnYWN5X3B3cmRpZmYgPSAwOwotCXM4IEhUMjBfcHdyZGlmZiA9IDA7Ci0JdTggaSwgcG93ZXJsZXZlbFsyXTsKLQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJcG93ZXJsZXZlbFtpXSA9IHBQb3dlckxldmVsW2ldOwotCQlMZWdhY3lfcHdyZGlmZiA9IHBIYWxEYXRhLT5UeFB3ckxlZ2FjeUh0RGlmZltpXVtDaGFubmVsLTFdOwotCQlvZmRtID0gcG93ZXJsZXZlbFtpXSArIExlZ2FjeV9wd3JkaWZmOwotCi0JCW9mZG0gPSBvZmRtIDw8IDI0IHwgb2ZkbSA8PCAxNiB8IG9mZG0gPDwgOCB8IG9mZG07Ci0JCSooT2ZkbUJhc2UgKyBpKSA9IG9mZG07Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQkvKiBDaGVjayBIVDIwIHRvIEhUNDAgZGlmZiAqLwotCQlpZiAocEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkgewotCQkJSFQyMF9wd3JkaWZmID0gcEhhbERhdGEtPlR4UHdySHQyMERpZmZbaV1bQ2hhbm5lbC0xXTsKLQkJCXBvd2VybGV2ZWxbaV0gKz0gSFQyMF9wd3JkaWZmOwotCQl9Ci0JCW1jcyA9IHBvd2VybGV2ZWxbaV07Ci0JCW1jcyA9IG1jcyA8PCAyNCB8IG1jcyA8PCAxNiB8IG1jcyA8PCA4IHwgbWNzOwotCQkqKE1DU0Jhc2UgKyBpKSA9IG1jczsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1nZXRUeFBvd2VyV3JpdGVWYWxCeVJlZ3VsYXRvcnkoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1OCBDaGFubmVsLAotCQkJICAgICAgIHU4IGluZGV4LCB1MzIgKnBvd2VyQmFzZTAsIHUzMiAqcG93ZXJCYXNlMSwKLQkJCSAgICAgICB1MzIgKnBPdXRXcml0ZVZhbCkKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0JdTggaSwgY2hubEdyb3VwID0gMCwgcHdyX2RpZmZfbGltaXRbNF07Ci0JdTMyIHdyaXRlVmFsLCBjdXN0b21lcl9saW1pdCwgcmY7Ci0KLQkvKiAgSW5kZXggMCAmIDEgPSBsZWdhY3kgT0ZETSwgMi01ID0gSFRfTUNTIHJhdGUgKi8KLQlmb3IgKHJmID0gMDsgcmYgPCAyOyByZisrKSB7Ci0JCXN3aXRjaCAocEhhbERhdGEtPkVFUFJPTVJlZ3VsYXRvcnkpIHsKLQkJY2FzZSAwOgkvKiAgUmVhbHRlayBiZXR0ZXIgcGVyZm9ybWFuY2UgKi8KLQkJCS8qICBpbmNyZWFzZSBwb3dlciBkaWZmIGRlZmluZWQgYnkgUmVhbHRlayBmb3IKLQkJCSAqICBsYXJnZSBwb3dlciAqLwotCQkJY2hubEdyb3VwID0gMDsKLQkJCXdyaXRlVmFsID0gcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2NobmxHcm91cF1baW5kZXgrKHJmPzg6MCldICsKLQkJCQkoKGluZGV4IDwgMikgPyBwb3dlckJhc2UwW3JmXSA6IHBvd2VyQmFzZTFbcmZdKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6CS8qICBSZWFsdGVrIHJlZ3VsYXRvcnkgKi8KLQkJCS8qICBpbmNyZWFzZSBwb3dlciBkaWZmIGRlZmluZWQgYnkgUmVhbHRlayBmb3IKLQkJCSAqICByZWd1bGF0b3J5ICovCi0JCQlpZiAocEhhbERhdGEtPnB3ckdyb3VwQ250ID09IDEpCi0JCQkJY2hubEdyb3VwID0gMDsKLQkJCWlmIChwSGFsRGF0YS0+cHdyR3JvdXBDbnQgPj0gMykgewotCQkJCWlmIChDaGFubmVsIDw9IDMpCi0JCQkJCWNobmxHcm91cCA9IDA7Ci0JCQkJZWxzZSBpZiAoQ2hhbm5lbCA+PSA0ICYmIENoYW5uZWwgPD0gOSkKLQkJCQkJY2hubEdyb3VwID0gMTsKLQkJCQllbHNlIGlmIChDaGFubmVsID4gOSkKLQkJCQkJY2hubEdyb3VwID0gMjsKLQotCQkJCWlmIChwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyA9PQotCQkJCSAgICBIVF9DSEFOTkVMX1dJRFRIXzIwKQotCQkJCQljaG5sR3JvdXArKzsKLQkJCQllbHNlCi0JCQkJCWNobmxHcm91cCArPSA0OwotCQkJfQotCQkJd3JpdGVWYWwgPSBwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbY2hubEdyb3VwXVtpbmRleCsocmY/ODowKV0gKwotCQkJCSAgICgoaW5kZXggPCAyKSA/IHBvd2VyQmFzZTBbcmZdIDoKLQkJCQkgICAgcG93ZXJCYXNlMVtyZl0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoJLyogIEJldHRlciByZWd1bGF0b3J5ICovCi0JCQkvKiAgZG9uJ3QgaW5jcmVhc2UgYW55IHBvd2VyIGRpZmYgKi8KLQkJCXdyaXRlVmFsID0gKGluZGV4IDwgMikgPyBwb3dlckJhc2UwW3JmXSA6Ci0JCQkJICAgIHBvd2VyQmFzZTFbcmZdOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoJLyogIEN1c3RvbWVyIGRlZmluZWQgcG93ZXIgZGlmZi4gKi8KLQkJCWNobmxHcm91cCA9IDA7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCQlwd3JfZGlmZl9saW1pdFtpXSA9ICh1OCkoKHBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtjaG5sR3JvdXBdW2luZGV4ICsKLQkJCQkJCSAgICAocmYgPyA4IDogMCldJigweDdmIDw8IChpKjgpKSkgPj4gKGkqOCkpOwotCQkJCWlmIChwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzQwKSB7Ci0JCQkJCWlmIChwd3JfZGlmZl9saW1pdFtpXSA+IHBIYWxEYXRhLT5Qd3JHcm91cEhUNDBbcmZdW0NoYW5uZWwtMV0pCi0JCQkJCQlwd3JfZGlmZl9saW1pdFtpXSA9IHBIYWxEYXRhLT5Qd3JHcm91cEhUNDBbcmZdW0NoYW5uZWwtMV07Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKHB3cl9kaWZmX2xpbWl0W2ldID4gcEhhbERhdGEtPlB3ckdyb3VwSFQyMFtyZl1bQ2hhbm5lbC0xXSkKLQkJCQkJCXB3cl9kaWZmX2xpbWl0W2ldID0gcEhhbERhdGEtPlB3ckdyb3VwSFQyMFtyZl1bQ2hhbm5lbC0xXTsKLQkJCQl9Ci0JCQl9Ci0JCQljdXN0b21lcl9saW1pdCA9IChwd3JfZGlmZl9saW1pdFszXTw8MjQpIHwgKHB3cl9kaWZmX2xpbWl0WzJdPDwxNikgfAotCQkJCQkJCShwd3JfZGlmZl9saW1pdFsxXTw8OCkgfCAocHdyX2RpZmZfbGltaXRbMF0pOwotCQkJd3JpdGVWYWwgPSBjdXN0b21lcl9saW1pdCArICgoaW5kZXg8Mik/cG93ZXJCYXNlMFtyZl06cG93ZXJCYXNlMVtyZl0pOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQljaG5sR3JvdXAgPSAwOwotCQkJd3JpdGVWYWwgPSBwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbY2hubEdyb3VwXVtpbmRleCsocmY/ODowKV0gKwotCQkJCQkoKGluZGV4IDwgMikgPyBwb3dlckJhc2UwW3JmXSA6IHBvd2VyQmFzZTFbcmZdKTsKLQkJCWJyZWFrOwotCQl9Ci0KLS8qICAyMDEwMDQyNyBKb3NlcGg6IERyaXZlciBkeW5hbWljIFR4IHBvd2VyIHNoYWxsIG5vdCBhZmZlY3QgVHggcG93ZXIuCi0gICAgSXQgc2hhbGwgYmUgZGV0ZXJtaW5lZCBieSBwb3dlciB0cmFpbmluZyBtZWNoYW5pc20uICovCi0vKiAgQ3VycmVudGx5LCB3ZSBjYW5ub3QgZnVsbHkgZGlzYWJsZSBkcml2ZXIgZHluYW1pYyB0eCBwb3dlciBtZWNoYW5pc20KLSAgICBiZWNhdXNlIGl0IGlzIHJlZmVyZW5jZWQgYnkgQlQgY29leGlzdCBtZWNoYW5pc20uICovCi0vKiAgSW4gdGhlIGZ1dHVyZSwgdHdvIG1lY2hhbmlzbSBzaGFsbCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyIGFuZAotICAgIG1haW50YWluZWQgaW5kZXBlbmRlbnRseS4gVGhhbmtzIGZvciBMYW5oc2luJ3MgcmVtaW5kZXIuICovCi0KLQkJaWYgKHBkbXByaXYtPkR5bmFtaWNUeEhpZ2hQb3dlckx2bCA9PSBUeEhpZ2hQd3JMZXZlbF9MZXZlbDEpCi0JCQl3cml0ZVZhbCA9IDB4MTQxNDE0MTQ7Ci0JCWVsc2UgaWYgKHBkbXByaXYtPkR5bmFtaWNUeEhpZ2hQb3dlckx2bCA9PQotCQkJIFR4SGlnaFB3ckxldmVsX0xldmVsMikKLQkJCXdyaXRlVmFsID0gMHgwMDAwMDAwMDsKLQotCQkvKiAyMDEwMDYyOCBKb3NlcGg6IEhpZ2ggcG93ZXIgbW9kZSBmb3IgQlQtQ29leGlzdCBtZWNoYW5pc20uICovCi0JCS8qIFRoaXMgbWVjaGFuaXNtIGlzIG9ubHkgYXBwbGllZCB3aGVuCi0JCSAgIERyaXZlci1IaWdocG93ZXItTWVjaGFuaXNtIGlzIE9GRi4gKi8KLQkJaWYgKHBkbXByaXYtPkR5bmFtaWNUeEhpZ2hQb3dlckx2bCA9PSBUeEhpZ2hQd3JMZXZlbF9CVDEpCi0JCQl3cml0ZVZhbCA9IHdyaXRlVmFsIC0gMHgwNjA2MDYwNjsKLQkJZWxzZSBpZiAocGRtcHJpdi0+RHluYW1pY1R4SGlnaFBvd2VyTHZsID09IFR4SGlnaFB3ckxldmVsX0JUMikKLQkJCXdyaXRlVmFsID0gd3JpdGVWYWw7Ci0JCSoocE91dFdyaXRlVmFsICsgcmYpID0gd3JpdGVWYWw7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3cml0ZU9GRE1Qb3dlclJlZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGluZGV4LAotCQkJICAgICAgdTMyICpwVmFsdWUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1MTYgUmVnT2Zmc2V0X0FbNl0gPSB7Ci0JCXJUeEFHQ19BX1JhdGUxOF8wNiwgclR4QUdDX0FfUmF0ZTU0XzI0LAotCQlyVHhBR0NfQV9NY3MwM19NY3MwMCwgclR4QUdDX0FfTWNzMDdfTWNzMDQsCi0JCXJUeEFHQ19BX01jczExX01jczA4LCByVHhBR0NfQV9NY3MxNV9NY3MxMgotCX07Ci0JdTE2IFJlZ09mZnNldF9CWzZdID0gewotCQlyVHhBR0NfQl9SYXRlMThfMDYsIHJUeEFHQ19CX1JhdGU1NF8yNCwKLQkJclR4QUdDX0JfTWNzMDNfTWNzMDAsIHJUeEFHQ19CX01jczA3X01jczA0LAotCQlyVHhBR0NfQl9NY3MxMV9NY3MwOCwgclR4QUdDX0JfTWNzMTVfTWNzMTIKLQl9OwotCXU4IGksIHJmLCBwd3JfdmFsWzRdOwotCXUzMiB3cml0ZVZhbDsKLQl1MTYgUmVnT2Zmc2V0OwotCi0JZm9yIChyZiA9IDA7IHJmIDwgMjsgcmYrKykgewotCQl3cml0ZVZhbCA9IHBWYWx1ZVtyZl07Ci0JCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJCXB3cl92YWxbaV0gPSAodTgpKCh3cml0ZVZhbCAmCi0JCQkJCSAgICgweDdmIDw8IChpICogOCkpKSA+PiAoaSAqIDgpKTsKLQkJCWlmIChwd3JfdmFsW2ldID4gUkY2MDUyX01BWF9UWF9QV1IpCi0JCQkJcHdyX3ZhbFtpXSAgPSBSRjYwNTJfTUFYX1RYX1BXUjsKLQkJfQotCQl3cml0ZVZhbCA9IHB3cl92YWxbM10gPDwgMjQgfCBwd3JfdmFsWzJdIDw8IDE2IHwKLQkJCXB3cl92YWxbMV0gPDwgOCB8IHB3cl92YWxbMF07Ci0KLQkJaWYgKHJmID09IDApCi0JCQlSZWdPZmZzZXQgPSBSZWdPZmZzZXRfQVtpbmRleF07Ci0JCWVsc2UKLQkJCVJlZ09mZnNldCA9IFJlZ09mZnNldF9CW2luZGV4XTsKLQotCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSZWdPZmZzZXQsIHdyaXRlVmFsKTsKLQotCQkvKiAgMjAxMDA1MTE1IEpvc2VwaDogU2V0IFR4IFBvd2VyIGRpZmYgZm9yIFR4IHBvd2VyCi0JCSAgICB0cmFpbmluZyBtZWNoYW5pc20uICovCi0JCWlmICgoKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpICYmCi0JCSAgICAoUmVnT2Zmc2V0ID09IHJUeEFHQ19BX01jczE1X01jczEyIHx8Ci0JCSAgICAgUmVnT2Zmc2V0ID09IHJUeEFHQ19CX01jczE1X01jczEyKSkgfHwKLQkJICAgICgocEhhbERhdGEtPnJmX3R5cGUgIT0gUkZfMlQyUikgJiYKLQkJICAgICAoUmVnT2Zmc2V0ID09IHJUeEFHQ19BX01jczA3X01jczA0IHx8Ci0JCSAgICAgIFJlZ09mZnNldCA9PSByVHhBR0NfQl9NY3MwN19NY3MwNCkpKSB7Ci0JCQl3cml0ZVZhbCA9IHB3cl92YWxbM107Ci0JCQlpZiAoUmVnT2Zmc2V0ID09IHJUeEFHQ19BX01jczE1X01jczEyIHx8Ci0JCQkgICAgUmVnT2Zmc2V0ID09IHJUeEFHQ19BX01jczA3X01jczA0KQotCQkJCVJlZ09mZnNldCA9IDB4YzkwOwotCQkJaWYgKFJlZ09mZnNldCA9PSByVHhBR0NfQl9NY3MxNV9NY3MxMiB8fAotCQkJICAgIFJlZ09mZnNldCA9PSByVHhBR0NfQl9NY3MwN19NY3MwNCkKLQkJCQlSZWdPZmZzZXQgPSAweGM5ODsKLQkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAyKQotCQkJCQl3cml0ZVZhbCA9ICh3cml0ZVZhbCA+IDgpID8KLQkJCQkJCSh3cml0ZVZhbCAtIDgpIDogMDsKLQkJCQllbHNlCi0JCQkJCXdyaXRlVmFsID0gKHdyaXRlVmFsID4gNikgPwotCQkJCQkJKHdyaXRlVmFsIC0gNikgOiAwOwotCQkJCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUmVnT2Zmc2V0ICsgaSwKLQkJCQkJCSAodTgpd3JpdGVWYWwpOwotCQkJfQotCQl9Ci0JfQotfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRnVuY3Rpb246CVBIWV9SRjYwNTJTZXRPRkRNVHhQb3dlcgotICoKLSAqIE92ZXJ2aWV3OglGb3IgbGVnYWN5IGFuZCBIWSBPRkRNLCB3ZSBtdXN0IHJlYWQgRUVQUk9NIFRYIHBvd2VyIGluZGV4IGZvcgotICoJCWRpZmZlcmVudCBjaGFubmVsIGFuZCByZWFkIG9yaWdpbmFsIHZhbHVlIGluIFRYIHBvd2VyCi0gKgkJcmVnaXN0ZXIgYXJlYSBmcm9tIDB4ZTAwLiBXZSBpbmNyZWFzZSBvZmZzZXQgYW5kCi0gKgkJb3JpZ2luYWwgdmFsdWUgdG8gYmUgY29ycmVjdCB0eCBwd3IuCi0gKgotICogSW5wdXQ6ICAgICAgIE5PTkUKLSAqCi0gKiBPdXRwdXQ6ICAgICAgTk9ORQotICoKLSAqIFJldHVybjogICAgICBOT05FCi0gKgotICogUmV2aXNlZCBIaXN0b3J5OgotICogV2hlbgkJCVJlbWFyawotICogMTEvMDUvMjAwOAlNSEMJU2ltdWxhdGUgODE5MiBzZXJpZXMgbWV0aG9kLgotICogMDEvMDYvMjAwOQlNSEMJMS4gUHJldmVudCBQYXRoIEIgdHggcG93ZXIgb3ZlcmZsb3cgb3IKLSAqCQkJdW5kZXJmbG93IGR1cmUgdG8gQS9CIHB3ciBkaWZmZXJlbmNlIG9yCi0gKgkJCWxlZ2FjeS9IVCBwd3IgZGlmZi4KLSAqCQkJMi4gV2UgY29uY2VybiB3aXRoIHBhdGggQiBsZWdhY3kvSFQgT0ZETSBkaWZmZXJlbmNlLgotICogMDEvMjIvMjAwOQlNSEMJU3VwcG9ydCBuZXcgRVBSTyBmb3JtYXQgZnJvbSBTRDMuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBydGw4NzIzYV9QSFlfUkY2MDUyU2V0T0ZETVR4UG93ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJCSAgICAgICB1OCAqcFBvd2VyTGV2ZWwsIHU4IENoYW5uZWwpCi17Ci0JdTMyIHdyaXRlVmFsWzJdLCBwb3dlckJhc2UwWzJdLCBwb3dlckJhc2UxWzJdOwotCXU4IGluZGV4ID0gMDsKLQotCWdldFBvd2VyQmFzZShBZGFwdGVyLCBwUG93ZXJMZXZlbCwgQ2hhbm5lbCwKLQkJICAgICAmcG93ZXJCYXNlMFswXSwgJnBvd2VyQmFzZTFbMF0pOwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXgrKykgewotCQlnZXRUeFBvd2VyV3JpdGVWYWxCeVJlZ3VsYXRvcnkoQWRhcHRlciwgQ2hhbm5lbCwgaW5kZXgsCi0JCQkmcG93ZXJCYXNlMFswXSwgJnBvd2VyQmFzZTFbMF0sICZ3cml0ZVZhbFswXSk7Ci0KLQkJd3JpdGVPRkRNUG93ZXJSZWcoQWRhcHRlciwgaW5kZXgsICZ3cml0ZVZhbFswXSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IHBoeV9SRjYwNTJfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQl1MzIgdTRSZWdWYWx1ZSA9IDA7Ci0JdTggZVJGUGF0aDsKLQlzdHJ1Y3QgYmJfcmVnX2RlZmluZSAqcFBoeVJlZzsKLQlpbnQgcnRTdGF0dXMgPSBfU1VDQ0VTUzsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0JLyogMy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0JLyogMyA8Mj4gSW5pdGlhbGl6ZSBSRiAqLwotCS8qIDMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWZvciAoZVJGUGF0aCA9IDA7IGVSRlBhdGggPCBwSGFsRGF0YS0+TnVtVG90YWxSRlBhdGg7IGVSRlBhdGgrKykgewotCi0JCXBQaHlSZWcgPSAmcEhhbERhdGEtPlBIWVJlZ0RlZltlUkZQYXRoXTsKLQotCQkvKi0tLS1TdG9yZSBvcmlnaW5hbCBSRkVOViBjb250cm9sIHR5cGUtLS0tKi8KLQkJc3dpdGNoIChlUkZQYXRoKSB7Ci0JCWNhc2UgUkZfUEFUSF9BOgotCQkJdTRSZWdWYWx1ZSA9IFBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmaW50ZnMsCi0JCQkJCQkgICAgYlJGU0lfUkZFTlYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkZfUEFUSF9COgotCQkJdTRSZWdWYWx1ZSA9IFBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmaW50ZnMsCi0JCQkJCQkgICAgYlJGU0lfUkZFTlYgPDwgMTYpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKi0tLS1TZXQgUkZfRU5WIGVuYWJsZS0tLS0qLwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgcFBoeVJlZy0+cmZpbnRmZSwgYlJGU0lfUkZFTlYgPDwgMTYsIDB4MSk7Ci0JCXVkZWxheSgxKTsvKiBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKDEpOyAqLwotCi0JCS8qLS0tLVNldCBSRl9FTlYgb3V0cHV0IGhpZ2gtLS0tKi8KLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmaW50Zm8sIGJSRlNJX1JGRU5WLCAweDEpOwotCQl1ZGVsYXkoMSk7LyogUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbigxKTsgKi8KLQotCQkvKiBTZXQgYml0IG51bWJlciBvZiBBZGRyZXNzIGFuZCBEYXRhIGZvciBSRiByZWdpc3RlciAqLwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIGIzV2lyZUFkZHJlc3NMZW5ndGgsCi0JCQkgICAgIDB4MCk7CS8qICBTZXQgMSB0byA0IGJpdHMgZm9yIDgyNTUgKi8KLQkJdWRlbGF5KDEpOy8qIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oMSk7ICovCi0KLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCBiM1dpcmVEYXRhTGVuZ3RoLAotCQkJICAgICAweDApOwkvKiAgU2V0IDAgdG8gMTIgIGJpdHMgZm9yIDgyNTUgKi8KLQkJdWRlbGF5KDEpOy8qIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oMSk7ICovCi0KLQkJLyotLS0tSW5pdGlhbGl6ZSBSRiBmb20gY29ubmZpZ3VyYXRpb24gZmlsZS0tLS0qLwotCQlzd2l0Y2ggKGVSRlBhdGgpIHsKLQkJY2FzZSBSRl9QQVRIX0E6Ci0JCQlPRE1fUmVhZEFuZENvbmZpZ19SYWRpb0FfMVRfODcyM0EoJnBIYWxEYXRhLT5vZG1wcml2KTsKLQkJCWJyZWFrOwotCQljYXNlIFJGX1BBVEhfQjoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyotLS0tUmVzdG9yZSBSRkVOViBjb250cm9sIHR5cGUtLS0tKi8KLQkJc3dpdGNoIChlUkZQYXRoKSB7Ci0JCWNhc2UgUkZfUEFUSF9BOgotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmaW50ZnMsCi0JCQkJICAgICBiUkZTSV9SRkVOViwgdTRSZWdWYWx1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBSRl9QQVRIX0I6Ci0JCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgcFBoeVJlZy0+cmZpbnRmcywKLQkJCQkgICAgIGJSRlNJX1JGRU5WIDw8IDE2LCB1NFJlZ1ZhbHVlKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHJ0U3RhdHVzICE9IF9TVUNDRVNTKSB7Ci0JCQlnb3RvIHBoeV9SRjYwNTJfQ29uZmlnX1BhcmFGaWxlX0ZhaWw7Ci0JCX0KLQl9Ci1waHlfUkY2MDUyX0NvbmZpZ19QYXJhRmlsZV9GYWlsOgotCXJldHVybiBydFN0YXR1czsKLX0KLQotaW50IFBIWV9SRjYwNTJfQ29uZmlnODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQkvKiAgSW5pdGlhbGl6ZSBnZW5lcmFsIGdsb2JhbCB2YWx1ZSAqLwotCS8qICBUT0RPOiBFeHRlbmQgUkZfUEFUSF9DIGFuZCBSRl9QQVRIX0QgaW4gdGhlIGZ1dHVyZSAqLwotCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8xVDFSKQotCQlwSGFsRGF0YS0+TnVtVG90YWxSRlBhdGggPSAxOwotCWVsc2UKLQkJcEhhbERhdGEtPk51bVRvdGFsUkZQYXRoID0gMjsKLQotCS8qICBDb25maWcgQkIgYW5kIFJGICovCi0JcmV0dXJuIHBoeV9SRjYwNTJfQ29uZmlnX1BhcmFGaWxlKEFkYXB0ZXIpOwotfQotCi0vKiBFbmQgb2YgSGFsUmY2MDUyLmMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3J4ZGVzYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcnhkZXNjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYjVlZmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcnhkZXNjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JUTDg3MjNBX1JFREVTQ19DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3Jzc2koc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKLXsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZwcmZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0IHNpZ25hbF9zdGF0ICpzaWduYWxfc3RhdCA9ICZwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0cmVuZ3RoX2RhdGE7Ci0KLQlpZiAoc2lnbmFsX3N0YXQtPnVwZGF0ZV9yZXEpIHsKLQkJc2lnbmFsX3N0YXQtPnRvdGFsX251bSA9IDA7Ci0JCXNpZ25hbF9zdGF0LT50b3RhbF92YWwgPSAwOwotCQlzaWduYWxfc3RhdC0+dXBkYXRlX3JlcSA9IDA7Ci0JfQotCi0Jc2lnbmFsX3N0YXQtPnRvdGFsX251bSsrOwotCXNpZ25hbF9zdGF0LT50b3RhbF92YWwgICs9IHBhdHRyaWItPnBoeV9pbmZvLlNpZ25hbFN0cmVuZ3RoOwotCXNpZ25hbF9zdGF0LT5hdmdfdmFsID0gc2lnbmFsX3N0YXQtPnRvdGFsX3ZhbCAvIHNpZ25hbF9zdGF0LT50b3RhbF9udW07Ci19Ci0KLXN0YXRpYyB2b2lkIHByb2Nlc3NfbGlua19xdWFsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJmcmFtZSkKLXsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQlzdHJ1Y3Qgc2lnbmFsX3N0YXQgKnNpZ25hbF9zdGF0OwotCi0JaWYgKHByZnJhbWUgPT0gTlVMTCB8fCBwYWRhcHRlciA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlwYXR0cmliID0gJnByZnJhbWUtPmF0dHJpYjsKLQlzaWduYWxfc3RhdCA9ICZwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3F1YWxfZGF0YTsKLQotCWlmIChzaWduYWxfc3RhdC0+dXBkYXRlX3JlcSkgewotCQlzaWduYWxfc3RhdC0+dG90YWxfbnVtID0gMDsKLQkJc2lnbmFsX3N0YXQtPnRvdGFsX3ZhbCA9IDA7Ci0JCXNpZ25hbF9zdGF0LT51cGRhdGVfcmVxID0gMDsKLQl9Ci0KLQlzaWduYWxfc3RhdC0+dG90YWxfbnVtKys7Ci0Jc2lnbmFsX3N0YXQtPnRvdGFsX3ZhbCAgKz0gcGF0dHJpYi0+cGh5X2luZm8uU2lnbmFsUXVhbGl0eTsKLQlzaWduYWxfc3RhdC0+YXZnX3ZhbCA9IHNpZ25hbF9zdGF0LT50b3RhbF92YWwgLyBzaWduYWxfc3RhdC0+dG90YWxfbnVtOwotfQotCi0vKiB2b2lkIHJ0bDg3MjNhX3Byb2Nlc3NfcGh5X2luZm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSkgKi8KLXZvaWQgcnRsODcyM2FfcHJvY2Vzc19waHlfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkICpwcmZyYW1lKQotewotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lID0gcHJmcmFtZTsKLQkvKiAgQ2hlY2sgUlNTSSAqLwotCXByb2Nlc3NfcnNzaShwYWRhcHRlciwgcHJlY3ZmcmFtZSk7Ci0JLyogIENoZWNrIEVWTSAqLwotCXByb2Nlc3NfbGlua19xdWFsKHBhZGFwdGVyLCAgcHJlY3ZmcmFtZSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9zcmVzZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3NyZXNldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQ2Mjk0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3NyZXNldC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVEw4NzIzQV9TUkVTRVRfQ18KLQotI2luY2x1ZGUgPHJ0bDg3MjNhX3NyZXNldC5oPgotI2luY2x1ZGUgPHJ0bDg3MjNhX2hhbC5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLQotdm9pZCBydGw4NzIzYV9zcmVzZXRfeG1pdF9zdGF0dXNfY2hlY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3Qgc3Jlc2V0X3ByaXYgKnBzcnRwcml2ID0gJnBIYWxEYXRhLT5zcmVzdHByaXY7Ci0KLQl1bnNpZ25lZCBsb25nIGN1cnJlbnRfdGltZTsKLQlzdHJ1Y3QgeG1pdF9wcml2CSpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXVuc2lnbmVkIGludCBkaWZmX3RpbWU7Ci0JdTMyIHR4ZG1hX3N0YXR1czsKLQotCXR4ZG1hX3N0YXR1cyA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19UWERNQV9TVEFUVVMpOwotCWlmICh0eGRtYV9zdGF0dXMgIT0gMCkgewotCQlEQkdfODcyM0EoIiVzIFJFR19UWERNQV9TVEFUVVM6MHglMDh4XG4iLCBfX2Z1bmNfXywgdHhkbWFfc3RhdHVzKTsKLQkJcnR3X3NyZXNldF9yZXNldChwYWRhcHRlcik7Ci0JfQotCi0JY3VycmVudF90aW1lID0gamlmZmllczsKLQotCWlmICgwID09IHB4bWl0cHJpdi0+ZnJlZV94bWl0YnVmX2NudCB8fCAwID09IHB4bWl0cHJpdi0+ZnJlZV94bWl0X2V4dGJ1Zl9jbnQpIHsKLQotCQlkaWZmX3RpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBwc3J0cHJpdi0+bGFzdF90eF90aW1lKTsKLQotCQlpZiAoZGlmZl90aW1lID4gMjAwMCkgewotCQkJaWYgKHBzcnRwcml2LT5sYXN0X3R4X2NvbXBsZXRlX3RpbWUgPT0gMCkgewotCQkJCXBzcnRwcml2LT5sYXN0X3R4X2NvbXBsZXRlX3RpbWUgPSBjdXJyZW50X3RpbWU7Ci0JCQl9IGVsc2UgewotCQkJCWRpZmZfdGltZSA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHBzcnRwcml2LT5sYXN0X3R4X2NvbXBsZXRlX3RpbWUpOwotCQkJCWlmIChkaWZmX3RpbWUgPiA0MDAwKSB7Ci0JCQkJCURCR184NzIzQSgiJXMgdHggaGFuZ1xuIiwgX19mdW5jX18pOwotCQkJCQlydHdfc3Jlc2V0X3Jlc2V0KHBhZGFwdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2F1X3JlY3YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlYzg0Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfcmVjdi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfUlRMODE5MkNVX1JFQ1ZfQ18KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cmVjdl9vc2RlcC5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+Ci0jaW5jbHVkZSA8dXNiX29wcy5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotaW50IHJ0bDg3MjNhdV9pbml0X3JlY3ZfcHJpdihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0JaW50IGksIHNpemUsIHJlcyA9IF9TVUNDRVNTOwotCXN0cnVjdCByZWN2X2J1ZiAqcHJlY3ZidWY7Ci0JdW5zaWduZWQgbG9uZyB0bXBhZGRyOwotCXVuc2lnbmVkIGxvbmcgYWxpZ25tZW50OwotCXN0cnVjdCBza19idWZmICpwc2tiOwotCi0JdGFza2xldF9pbml0KCZwcmVjdnByaXYtPnJlY3ZfdGFza2xldCwKLQkJICAgICAodm9pZCgqKSh1bnNpZ25lZCBsb25nKSlydGw4NzIzYXVfcmVjdl90YXNrbGV0LAotCQkgICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKLQotCXByZWN2cHJpdi0+aW50X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcmVjdnByaXYtPmludF9pbl91cmIpCi0JCURCR184NzIzQSgiYWxsb2NfdXJiIGZvciBpbnRlcnJ1cHQgaW4gZW5kcG9pbnQgZmFpbCAhISEhXG4iKTsKLQlwcmVjdnByaXYtPmludF9pbl9idWYgPSBremFsbG9jKFVTQl9JTlRSX0NPTlRFTlRfTEVOR1RILCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByZWN2cHJpdi0+aW50X2luX2J1ZikKLQkJREJHXzg3MjNBKCJhbGxvY19tZW0gZm9yIGludGVycnVwdCBpbiBlbmRwb2ludCBmYWlsICEhISFcbiIpOwotCi0Jc2l6ZSA9IE5SX1JFQ1ZCVUZGICogc2l6ZW9mKHN0cnVjdCByZWN2X2J1Zik7Ci0JcHJlY3Zwcml2LT5wcmVjdl9idWYgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghcHJlY3Zwcml2LT5wcmVjdl9idWYpIHsKLQkJcmVzID0gX0ZBSUw7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgImFsbG9jIHJlY3ZfYnVmIGZhaWwhXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCXByZWN2YnVmID0gKHN0cnVjdCByZWN2X2J1ZiAqKXByZWN2cHJpdi0+cHJlY3ZfYnVmOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1JFQ1ZCVUZGOyBpKyspIHsKLQkJSU5JVF9MSVNUX0hFQUQoJnByZWN2YnVmLT5saXN0KTsKLQotCQlwcmVjdmJ1Zi0+cHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHJlY3ZidWYtPnB1cmIpCi0JCQlicmVhazsKLQotCQlwcmVjdmJ1Zi0+YWRhcHRlciA9IHBhZGFwdGVyOwotCi0JCXByZWN2YnVmKys7Ci0JfQotCi0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJlY3Zwcml2LT5yeF9za2JfcXVldWUpOwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfUFJFQUxMT0NfUkVDVl9TS0I7IGkrKykgewotCQlzaXplID0gTUFYX1JFQ1ZCVUZfU1ogKyBSRUNWQlVGRl9BTElHTl9TWjsKLQkJcHNrYiA9IF9fbmV0ZGV2X2FsbG9jX3NrYihwYWRhcHRlci0+cG5ldGRldiwgc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0KLQkJaWYgKHBza2IpIHsKLQkJCXBza2ItPmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCi0JCQl0bXBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcHNrYi0+ZGF0YTsKLQkJCWFsaWdubWVudCA9IHRtcGFkZHIgJiAoUkVDVkJVRkZfQUxJR05fU1otMSk7Ci0JCQlza2JfcmVzZXJ2ZShwc2tiLCAoUkVDVkJVRkZfQUxJR05fU1ogLSBhbGlnbm1lbnQpKTsKLQotCQkJc2tiX3F1ZXVlX3RhaWwoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSwgcHNrYik7Ci0JCX0KLQotCQlwc2tiID0gTlVMTDsKLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJlczsKLX0KLQotdm9pZCBydGw4NzIzYXVfZnJlZV9yZWN2X3ByaXYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpbnQJaTsKLQlzdHJ1Y3QgcmVjdl9idWYJKnByZWN2YnVmOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlwcmVjdmJ1ZiA9IChzdHJ1Y3QgcmVjdl9idWYgKilwcmVjdnByaXYtPnByZWN2X2J1ZjsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9SRUNWQlVGRjsgaSsrKSB7Ci0JCXVzYl9mcmVlX3VyYihwcmVjdmJ1Zi0+cHVyYik7Ci0KLQkJaWYgKHByZWN2YnVmLT5wc2tiKQotCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJlY3ZidWYtPnBza2IpOwotCi0JCXByZWN2YnVmKys7Ci0JfQotCi0Ja2ZyZWUocHJlY3Zwcml2LT5wcmVjdl9idWYpOwotCi0JdXNiX2ZyZWVfdXJiKHByZWN2cHJpdi0+aW50X2luX3VyYik7Ci0Ja2ZyZWUocHJlY3Zwcml2LT5pbnRfaW5fYnVmKTsKLQotCWlmIChza2JfcXVldWVfbGVuKCZwcmVjdnByaXYtPnJ4X3NrYl9xdWV1ZSkpCi0JCURCR184NzIzQShLRVJOX1dBUk5JTkcgInJ4X3NrYl9xdWV1ZSBub3QgZW1wdHlcbiIpOwotCi0Jc2tiX3F1ZXVlX3B1cmdlKCZwcmVjdnByaXYtPnJ4X3NrYl9xdWV1ZSk7Ci0KLQlpZiAoc2tiX3F1ZXVlX2xlbigmcHJlY3Zwcml2LT5mcmVlX3JlY3Zfc2tiX3F1ZXVlKSkgewotCQlEQkdfODcyM0EoS0VSTl9XQVJOSU5HICJmcmVlX3JlY3Zfc2tiX3F1ZXVlIG5vdCBlbXB0eSwgJWRcbiIsCi0JCQkgIHNrYl9xdWV1ZV9sZW4oJnByZWN2cHJpdi0+ZnJlZV9yZWN2X3NrYl9xdWV1ZSkpOwotCX0KLQotCXNrYl9xdWV1ZV9wdXJnZSgmcHJlY3Zwcml2LT5mcmVlX3JlY3Zfc2tiX3F1ZXVlKTsKLX0KLQotc3RydWN0IHJlY3Zfc3RhdF9jcHUgewotCXUzMiByeGR3MDsKLQl1MzIgcnhkdzE7Ci0JdTMyIHJ4ZHcyOwotCXUzMiByeGR3MzsKLQl1MzIgcnhkdzQ7Ci0JdTMyIHJ4ZHc1OwotfTsKLQotdm9pZCB1cGRhdGVfcmVjdmZyYW1lX2F0dHJpYihzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKLQkJCSAgICAgc3RydWN0IHJlY3Zfc3RhdCAqcHJ4c3RhdCkKLXsKLQlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcGF0dHJpYjsKLQlzdHJ1Y3QgcmVjdl9zdGF0X2NwdSByZXBvcnQ7Ci0Jc3RydWN0IHJ4cmVwb3J0Xzg3MjNhICpwcnhyZXBvcnQ7Ci0KLQlyZXBvcnQucnhkdzAgPSBsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCk7Ci0JcmVwb3J0LnJ4ZHcxID0gbGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzEpOwotCXJlcG9ydC5yeGR3MiA9IGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcyKTsKLQlyZXBvcnQucnhkdzMgPSBsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3Myk7Ci0JcmVwb3J0LnJ4ZHc0ID0gbGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzQpOwotCXJlcG9ydC5yeGR3NSA9IGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHc1KTsKLQotCXByeHJlcG9ydCA9IChzdHJ1Y3QgcnhyZXBvcnRfODcyM2EgKikmcmVwb3J0OwotCi0JcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7Ci0JbWVtc2V0KHBhdHRyaWIsIDAsIHNpemVvZihzdHJ1Y3QgcnhfcGt0X2F0dHJpYikpOwotCi0JLyogIHVwZGF0ZSByeCByZXBvcnQgdG8gcmVjdl9mcmFtZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliLT5wa3RfbGVuID0gKHUxNilwcnhyZXBvcnQtPnBrdGxlbjsKLQlwYXR0cmliLT5kcnZpbmZvX3N6ID0gKHU4KShwcnhyZXBvcnQtPmRydmluZm9zaXplIDw8IDMpOwotCXBhdHRyaWItPnBoeXN0ID0gKHU4KXByeHJlcG9ydC0+cGh5c3Q7Ci0KLQlwYXR0cmliLT5jcmNfZXJyID0gKHU4KXByeHJlcG9ydC0+Y3JjMzI7Ci0JcGF0dHJpYi0+aWN2X2VyciA9ICh1OClwcnhyZXBvcnQtPmljdmVycjsKLQotCXBhdHRyaWItPmJkZWNyeXB0ZWQgPSAodTgpKHByeHJlcG9ydC0+c3dkZWMgPyAwIDogMSk7Ci0JcGF0dHJpYi0+ZW5jcnlwdCA9ICh1OClwcnhyZXBvcnQtPnNlY3VyaXR5OwotCi0JcGF0dHJpYi0+cW9zID0gKHU4KXByeHJlcG9ydC0+cW9zOwotCXBhdHRyaWItPnByaW9yaXR5ID0gKHU4KXByeHJlcG9ydC0+dGlkOwotCi0JcGF0dHJpYi0+YW1zZHUgPSAodTgpcHJ4cmVwb3J0LT5hbXNkdTsKLQotCXBhdHRyaWItPnNlcV9udW0gPSAodTE2KXByeHJlcG9ydC0+c2VxOwotCXBhdHRyaWItPmZyYWdfbnVtID0gKHU4KXByeHJlcG9ydC0+ZnJhZzsKLQlwYXR0cmliLT5tZnJhZyA9ICh1OClwcnhyZXBvcnQtPm1mOwotCXBhdHRyaWItPm1kYXRhID0gKHU4KXByeHJlcG9ydC0+bWQ7Ci0KLQlwYXR0cmliLT5tY3NfcmF0ZSA9ICh1OClwcnhyZXBvcnQtPnJ4bWNzOwotCXBhdHRyaWItPnJ4aHQgPSAodTgpcHJ4cmVwb3J0LT5yeGh0OwotfQotCi12b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfcGh5aW5mbyhzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSwKLQkJCSAgICAgIHN0cnVjdCBwaHlfc3RhdCAqcHBoeV9zdGF0dXMpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHByZWN2ZnJhbWUtPmFkYXB0ZXI7Ci0Jc3RydWN0IHJ4X3BrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHJlY3ZmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBwaHlfaW5mbyAqcFBIWUluZm8gPSAmcGF0dHJpYi0+cGh5X2luZm87Ci0Jc3RydWN0IG9kbV9wYWNrZXRfaW5mbyBwa3RfaW5mbzsKLQl1OCAqc2EgPSBOVUxMLCAqZGE7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2ZnJhbWUtPnBrdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQlib29sIG1hdGNoYnNzaWQgPSBmYWxzZTsKLQl1OCAqYnNzaWQ7Ci0KLQltYXRjaGJzc2lkID0gIWllZWU4MDIxMV9pc19jdGwoaGRyLT5mcmFtZV9jb250cm9sKSAmJgotCQkgICAgICAhcGF0dHJpYi0+aWN2X2VyciAmJiAhcGF0dHJpYi0+Y3JjX2VycjsKLQotCWlmIChtYXRjaGJzc2lkKSB7Ci0JCXN3aXRjaCAoaGRyLT5mcmFtZV9jb250cm9sICYKLQkJCWNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1RPRFMgfAotCQkJCSAgICBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSB7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfVE9EUyk6Ci0JCQlic3NpZCA9IGhkci0+YWRkcjE7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9GUk9NRFMpOgotCQkJYnNzaWQgPSBoZHItPmFkZHIyOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoMCk6Ci0JCQlic3NpZCA9IGhkci0+YWRkcjM7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJzc2lkID0gTlVMTDsKLQkJCW1hdGNoYnNzaWQgPSBmYWxzZTsKLQkJfQotCi0JCWlmIChic3NpZCkKLQkJCW1hdGNoYnNzaWQgPSBldGhlcl9hZGRyX2VxdWFsKAotCQkJCWdldF9ic3NpZCgmcGFkYXB0ZXItPm1sbWVwcml2KSwgYnNzaWQpOwotCX0KLQotCXBrdF9pbmZvLmJQYWNrZXRNYXRjaEJTU0lEID0gbWF0Y2hic3NpZDsKLQotCWRhID0gaWVlZTgwMjExX2dldF9EQShoZHIpOwotCXBrdF9pbmZvLmJQYWNrZXRUb1NlbGYgPSBwa3RfaW5mby5iUGFja2V0TWF0Y2hCU1NJRCAmJgotCQkoIW1lbWNtcChkYSwgbXlpZCgmcGFkYXB0ZXItPmVlcHJvbXByaXYpLCBFVEhfQUxFTikpOwotCi0JcGt0X2luZm8uYlBhY2tldEJlYWNvbiA9IHBrdF9pbmZvLmJQYWNrZXRNYXRjaEJTU0lEICYmCi0JCWllZWU4MDIxMV9pc19iZWFjb24oaGRyLT5mcmFtZV9jb250cm9sKTsKLQotCXBrdF9pbmZvLlN0YXRpb25JRCA9IDB4RkY7Ci0JaWYgKHBrdF9pbmZvLmJQYWNrZXRCZWFjb24pIHsKLQkJaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSA9PSB0cnVlKQotCQkJc2EgPSBwYWRhcHRlci0+bWxtZXByaXYuY3VyX25ldHdvcmsubmV0d29yay5NYWNBZGRyZXNzOwotCQkvKiB0byBkbyBBZC1ob2MgKi8KLQl9IGVsc2UgewotCQlzYSA9IGllZWU4MDIxMV9nZXRfU0EoaGRyKTsKLQl9Ci0KLQlwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBzYSk7Ci0JaWYgKHBzdGEpIHsKLQkJcGt0X2luZm8uU3RhdGlvbklEID0gcHN0YS0+bWFjX2lkOwotCQkvKiBwcmludGsoIiVzID09PiBTdGF0aW9uSUQoJWQpXG4iLCBfX2Z1bmNfXywgcGt0X2luZm8uU3RhdGlvbklEKTsgKi8KLQl9Ci0JcGt0X2luZm8uUmF0ZSA9IHBhdHRyaWItPm1jc19yYXRlOwotCi0JT0RNX1BoeVN0YXR1c1F1ZXJ5MjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgcFBIWUluZm8sCi0JCQkgICAgICAodTggKilwcGh5X3N0YXR1cywgJnBrdF9pbmZvKTsKLQlwcmVjdmZyYW1lLT5wc3RhID0gTlVMTDsKLQlpZiAocGt0X2luZm8uYlBhY2tldE1hdGNoQlNTSUQgJiYKLQkgICAgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkgPT0gdHJ1ZSkpIHsKLQkJaWYgKHBzdGEpIHsKLQkJCXByZWN2ZnJhbWUtPnBzdGEgPSBwc3RhOwotCQkJcnRsODcyM2FfcHJvY2Vzc19waHlfaW5mbyhwYWRhcHRlciwgcHJlY3ZmcmFtZSk7Ci0JCX0KLQl9IGVsc2UgaWYgKHBrdF9pbmZvLmJQYWNrZXRUb1NlbGYgfHwgcGt0X2luZm8uYlBhY2tldEJlYWNvbikgewotCQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LAotCQkJCSAgV0lGSV9BREhPQ19TVEFURXxXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgPT0KLQkJICAgIHRydWUpIHsKLQkJCWlmIChwc3RhKQotCQkJCXByZWN2ZnJhbWUtPnBzdGEgPSBwc3RhOwotCQl9Ci0JCXJ0bDg3MjNhX3Byb2Nlc3NfcGh5X2luZm8ocGFkYXB0ZXIsIHByZWN2ZnJhbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhdV94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfeG1pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDc0NmRkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhdV94bWl0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9SVEw4MTkyQ19YTUlUX0NfCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+Ci0jaW5jbHVkZSA8dXNiX29wcy5oPgotLyogaW5jbHVkZSA8cnRsODE5MmNfaGFsLmg+ICovCi0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0KLXN0YXRpYyBpbnQgdXJiX3plcm9fcGFja2V0X2NoayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgc3opCi17Ci0JaW50IGJsblNldFR4RGVzY09mZnNldDsKLQlzdHJ1Y3QgZHZvYmpfcHJpdgkqcGR2b2JqID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0KLQlpZiAocGR2b2JqLT5pc2hpZ2hzcGVlZCkgewotCQlpZiAoKChzeiArIFRYREVTQ19TSVpFKSAlIDUxMikgPT0gMCkKLQkJCWJsblNldFR4RGVzY09mZnNldCA9IDE7Ci0JCWVsc2UKLQkJCWJsblNldFR4RGVzY09mZnNldCA9IDA7Ci0JfSBlbHNlIHsKLQkJaWYgKCgoc3ogKyBUWERFU0NfU0laRSkgJSA2NCkgPT0gMCkKLQkJCWJsblNldFR4RGVzY09mZnNldCA9IDE7Ci0JCWVsc2UKLQkJCWJsblNldFR4RGVzY09mZnNldCA9IDA7Ci0JfQotCXJldHVybiBibG5TZXRUeERlc2NPZmZzZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJjdV9jYWxfdHhkZXNjX2Noa3N1bShzdHJ1Y3QgdHhfZGVzYwkqcHR4ZGVzYykKLXsKLQkJX19sZTE2CSp1c1B0ciA9IChfX2xlMTYgKilwdHhkZXNjOwotCQl1MzIgY291bnQgPSAxNjsJCS8qICAoMzIgYnl0ZXMgLyAyIGJ5dGVzIHBlciBYT1IpID0+IDE2IHRpbWVzICovCi0JCXUzMiBpbmRleDsKLQkJdTE2IGNoZWNrc3VtID0gMDsKLQotCQkvKiBDbGVhciBmaXJzdCAqLwotCQlwdHhkZXNjLT50eGR3NyAmPSBjcHVfdG9fbGUzMigweGZmZmYwMDAwKTsKLQotCQlmb3IgKGluZGV4ID0gMCA7IGluZGV4IDwgY291bnQgOyBpbmRleCsrKQotCQkJY2hlY2tzdW0gPSBjaGVja3N1bSBeIGxlMTZfdG9fY3B1KCoodXNQdHIgKyBpbmRleCkpOwotCi0JCXB0eGRlc2MtPnR4ZHc3IHw9IGNwdV90b19sZTMyKDB4MDAwMGZmZmYmY2hlY2tzdW0pOwotfQotCi1zdGF0aWMgdm9pZCBmaWxsX3R4ZGVzY19zZWN0eXBlKHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliLCBzdHJ1Y3QgdHhfZGVzYyAqcHR4ZGVzYykKLXsKLQlpZiAoKHBhdHRyaWItPmVuY3J5cHQgPiAwKSAmJiAhcGF0dHJpYi0+YnN3ZW5jKSB7Ci0JCXN3aXRjaCAocGF0dHJpYi0+ZW5jcnlwdCkgewotCQkvKiBTRUNfVFlQRSAqLwotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKCgweDAxPDwyMikmMHgwMGMwMDAwMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJLyogcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoKDB4MDI8PDIyKSYweDAwYzAwMDAwKTsgKi8KLQkJCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKCgweDAxPDwyMikmMHgwMGMwMDAwMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoKDB4MDM8PDIyKSYweDAwYzAwMDAwKTsKLQkJCWJyZWFrOwotCQljYXNlIDA6Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgZmlsbF90eGRlc2NfdmNzKHN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliLCBfX2xlMzIgKnBkdykKLXsKLQkvKiBEQkdfODcyM0EoImN2c19tb2RlID0lZFxuIiwgcGF0dHJpYi0+dmNzX21vZGUpOyAqLwotCi0Jc3dpdGNoIChwYXR0cmliLT52Y3NfbW9kZSkgewotCWNhc2UgUlRTX0NUUzoKLQkJKnBkdyB8PSBjcHVfdG9fbGUzMihCSVQoMTIpKTsKLQkJYnJlYWs7Ci0JY2FzZSBDVFNfVE9fU0VMRjoKLQkJKnBkdyB8PSBjcHVfdG9fbGUzMihCSVQoMTEpKTsKLQkJYnJlYWs7Ci0JY2FzZSBOT05FX1ZDUzoKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAocGF0dHJpYi0+dmNzX21vZGUpIHsKLQkJKnBkdyB8PSBjcHVfdG9fbGUzMihCSVQoMTMpKTsKLQotCQkvKiAgU2V0IFJUUyBCVyAqLwotCQlpZiAocGF0dHJpYi0+aHRfZW4pIHsKLQkJCSpwZHcgfD0gKHBhdHRyaWItPmJ3bW9kZSZIVF9DSEFOTkVMX1dJRFRIXzQwKSA/CWNwdV90b19sZTMyKEJJVCgyNykpIDogMDsKLQotCQkJaWYgKHBhdHRyaWItPmNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpCi0JCQkJKnBkdyB8PSBjcHVfdG9fbGUzMigoMHgwMTw8MjgpJjB4MzAwMDAwMDApOwotCQkJZWxzZSBpZiAocGF0dHJpYi0+Y2hfb2Zmc2V0ID09IEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUikKLQkJCQkqcGR3IHw9IGNwdV90b19sZTMyKCgweDAyPDwyOCkmMHgzMDAwMDAwMCk7Ci0JCQllbHNlIGlmIChwYXR0cmliLT5jaF9vZmZzZXQgPT0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0RPTlRfQ0FSRSkKLQkJCQkqcGR3IHw9IDA7Ci0JCQllbHNlCi0JCQkJKnBkdyB8PSBjcHVfdG9fbGUzMigoMHgwMzw8MjgpJjB4MzAwMDAwMDApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBmaWxsX3R4ZGVzY19waHkoc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIsIF9fbGUzMiAqcGR3KQotewotCWlmIChwYXR0cmliLT5odF9lbikgewotCQkqcGR3IHw9IChwYXR0cmliLT5id21vZGUmSFRfQ0hBTk5FTF9XSURUSF80MCkgPyBjcHVfdG9fbGUzMihCSVQoMjUpKSA6IDA7Ci0KLQkJaWYgKHBhdHRyaWItPmNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIpCi0JCQkqcGR3IHw9IGNwdV90b19sZTMyKCgweDAxPDwyMCkmMHgwMDNmMDAwMCk7Ci0JCWVsc2UgaWYgKHBhdHRyaWItPmNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCQkqcGR3IHw9IGNwdV90b19sZTMyKCgweDAyPDwyMCkmMHgwMDNmMDAwMCk7Ci0JCWVsc2UgaWYgKHBhdHRyaWItPmNoX29mZnNldCA9PSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFKQotCQkJKnBkdyB8PSAwOwotCQllbHNlCi0JCQkqcGR3IHw9IGNwdV90b19sZTMyKCgweDAzPDwyMCkmMHgwMDNmMDAwMCk7Ci0JfQotfQotCi1zdGF0aWMgczMyIHVwZGF0ZV90eGRlc2Moc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUsIHU4ICpwbWVtLCBzMzIgc3opCi17Ci0JaW50CXB1bGwgPSAwOwotCXVpbnQJcXNlbDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIJKnBhZGFwdGVyID0gcHhtaXRmcmFtZS0+cGFkYXB0ZXI7Ci0Jc3RydWN0IHBrdF9hdHRyaWIJKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOwotCXN0cnVjdCBkbV9wcml2CSpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7Ci0Jc3RydWN0IHR4X2Rlc2MJKnB0eGRlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKilwbWVtOwotCXN0cnVjdCBtbG1lX2V4dF9wcml2CSpwbWxtZWV4dCA9ICZwYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8JKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0JaW50CWJtY3N0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpOwotCi0JaWYgKHVyYl96ZXJvX3BhY2tldF9jaGsocGFkYXB0ZXIsIHN6KSA9PSAwKSB7Ci0JCXB0eGRlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKikocG1lbStQQUNLRVRfT0ZGU0VUX1NaKTsKLQkJcHVsbCA9IDE7Ci0JCXB4bWl0ZnJhbWUtPnBrdF9vZmZzZXQtLTsKLQl9Ci0KLQltZW1zZXQocHR4ZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSk7Ci0KLQlpZiAocHhtaXRmcmFtZS0+ZnJhbWVfdGFnID09IERBVEFfRlJBTUVUQUcpIHsKLQkJLyogb2Zmc2V0IDQgKi8KLQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIocGF0dHJpYi0+bWFjX2lkJjB4MWYpOwotCi0JCXFzZWwgPSAodWludCkocGF0dHJpYi0+cXNlbCAmIDB4MDAwMDAwMWYpOwotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigocXNlbCA8PCBRU0VMX1NIVCkgJiAweDAwMDAxZjAwKTsKLQotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigocGF0dHJpYi0+cmFpZDw8MTYpICYgMHgwMDBmMDAwMCk7Ci0KLQkJZmlsbF90eGRlc2Nfc2VjdHlwZShwYXR0cmliLCBwdHhkZXNjKTsKLQotCQlpZiAocGF0dHJpYi0+YW1wZHVfZW4pCi0JCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMihCSVQoNSkpOy8qIEFHRyBFTiAqLwotCQllbHNlCi0JCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMihCSVQoNikpOy8qIEFHRyBCSyAqLwotCi0JCS8qIG9mZnNldCA4ICovCi0KLQkJLyogb2Zmc2V0IDEyICovCi0JCXB0eGRlc2MtPnR4ZHczIHw9IGNwdV90b19sZTMyKChwYXR0cmliLT5zZXFudW08PDE2KSYweGZmZmYwMDAwKTsKLQotCQkvKiBvZmZzZXQgMTYgLCBvZmZzZXQgMjAgKi8KLQkJaWYgKHBhdHRyaWItPnFvc19lbikKLQkJCXB0eGRlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKEJJVCg2KSk7LyogUW9TICovCi0KLQkJaWYgKChwYXR0cmliLT5ldGhlcl90eXBlICE9IDB4ODg4ZSkgJiYKLQkJICAgIChwYXR0cmliLT5ldGhlcl90eXBlICE9IDB4MDgwNikgJiYKLQkJICAgIChwYXR0cmliLT5kaGNwX3BrdCAhPSAxKSkgewotCQkJLyogTm9uIEVBUCAmIEFSUCAmIERIQ1AgdHlwZSBkYXRhIHBhY2tldCAqLwotCi0JCQlmaWxsX3R4ZGVzY192Y3MocGF0dHJpYiwgJnB0eGRlc2MtPnR4ZHc0KTsKLQkJCWZpbGxfdHhkZXNjX3BoeShwYXR0cmliLCAmcHR4ZGVzYy0+dHhkdzQpOwotCi0JCQlwdHhkZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMigweDAwMDAwMDA4KTsvKiBSVFMgUmF0ZSA9IDI0TSAqLwotCQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoMHgwMDAxZmYwMCk7LyogICovCi0KLQkJCS8qIHVzZSBSRUdfSU5JREFUQV9SQVRFX1NFTCB2YWx1ZSAqLwotCQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIocGRtcHJpdi0+SU5JREFUQV9SQVRFW3BhdHRyaWItPm1hY19pZF0pOwotCQl9IGVsc2UgewotCQkJLyogIEVBUCBkYXRhIHBhY2tldCBhbmQgQVJQIHBhY2tldC4gKi8KLQkJCS8qICBVc2UgdGhlIDFNIGRhdGEgcmF0ZSB0byBzZW5kIHRoZSBFQVAvQVJQIHBhY2tldC4gKi8KLQkJCS8qICBUaGlzIHdpbGwgbWF5YmUgbWFrZSB0aGUgaGFuZHNoYWtlIHNtb290aC4gKi8KLQotCQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoQklUKDYpKTsvKiBBR0cgQksgKi8KLQotCQkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoQklUKDgpKTsvKiBkcml2ZXIgdXNlcyByYXRlICovCi0KLQkJCWlmIChwbWxtZWluZm8tPnByZWFtYmxlX21vZGUgPT0gUFJFQU1CTEVfU0hPUlQpCi0JCQkJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoQklUKDI0KSk7LyogIERBVEFfU0hPUlQgKi8KLQotCQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoTVJhdGVUb0h3UmF0ZTIzYShwbWxtZWV4dC0+dHhfcmF0ZSkpOwotCQl9Ci0JfSBlbHNlIGlmIChweG1pdGZyYW1lLT5mcmFtZV90YWcgPT0gTUdOVF9GUkFNRVRBRykgewotCQkvKiBvZmZzZXQgNCAqLwotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMihwYXR0cmliLT5tYWNfaWQmMHgxZik7Ci0KLQkJcXNlbCA9ICh1aW50KShwYXR0cmliLT5xc2VsJjB4MDAwMDAwMWYpOwotCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigocXNlbDw8UVNFTF9TSFQpJjB4MDAwMDFmMDApOwotCi0JCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKChwYXR0cmliLT5yYWlkPDwxNikgJiAweDAwMGYwMDAwKTsKLQotCQkvKiBvZmZzZXQgOCAqLwotCQkvKiBDQ1gtVFhSUFQgYWNrIGZvciB4bWl0IG1nbXQgZnJhbWVzLiAqLwotCQlpZiAocHhtaXRmcmFtZS0+YWNrX3JlcG9ydCkKLQkJCXB0eGRlc2MtPnR4ZHcyIHw9IGNwdV90b19sZTMyKEJJVCgxOSkpOwotCi0JCS8qIG9mZnNldCAxMiAqLwotCQlwdHhkZXNjLT50eGR3MyB8PSBjcHVfdG9fbGUzMigocGF0dHJpYi0+c2VxbnVtPDwxNikmMHhmZmZmMDAwMCk7Ci0KLQkJLyogb2Zmc2V0IDE2ICovCi0JCXB0eGRlc2MtPnR4ZHc0IHw9IGNwdV90b19sZTMyKEJJVCg4KSk7LyogZHJpdmVyIHVzZXMgcmF0ZSAqLwotCi0JCS8qIG9mZnNldCAyMCAqLwotCQlwdHhkZXNjLT50eGR3NSB8PSBjcHVfdG9fbGUzMihCSVQoMTcpKTsvKiByZXRyeSBsaW1pdCBlbmFibGUgKi8KLQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoMHgwMDE4MDAwMCk7LyogcmV0cnkgbGltaXQgPSA2ICovCi0KLQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoTVJhdGVUb0h3UmF0ZTIzYShwbWxtZWV4dC0+dHhfcmF0ZSkpOwotCX0gZWxzZSBpZiAocHhtaXRmcmFtZS0+ZnJhbWVfdGFnID09IFRYQUdHX0ZSQU1FVEFHKSB7Ci0JCURCR184NzIzQSgicHhtaXRmcmFtZS0+ZnJhbWVfdGFnID09IFRYQUdHX0ZSQU1FVEFHXG4iKTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoInB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9ICVkXG4iLAotCQkJICBweG1pdGZyYW1lLT5mcmFtZV90YWcpOwotCi0JCS8qIG9mZnNldCA0ICovCi0JCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKCg0KSYweDFmKTsvKiBDQU1fSUQoTUFDX0lEKSAqLwotCi0JCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKCg2PDwxNikgJiAweDAwMGYwMDAwKTsvKiByYWlkICovCi0KLQkJLyogb2Zmc2V0IDggKi8KLQotCQkvKiBvZmZzZXQgMTIgKi8KLQkJcHR4ZGVzYy0+dHhkdzMgfD0gY3B1X3RvX2xlMzIoKHBhdHRyaWItPnNlcW51bTw8MTYpJjB4ZmZmZjAwMDApOwotCi0JCS8qIG9mZnNldCAxNiAqLwotCQlwdHhkZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihCSVQoOCkpOy8qIGRyaXZlciB1c2VzIHJhdGUgKi8KLQotCQkvKiBvZmZzZXQgMjAgKi8KLQkJcHR4ZGVzYy0+dHhkdzUgfD0gY3B1X3RvX2xlMzIoTVJhdGVUb0h3UmF0ZTIzYShwbWxtZWV4dC0+dHhfcmF0ZSkpOwotCX0KLQotCS8qICAoMSkgVGhlIHNlcXVlbmNlIG51bWJlciBvZiBlYWNoIG5vbi1Rb3MgZnJhbWUgLyBicm9hZGNhc3QgLyBtdWx0aWNhc3QgLyAqLwotCS8qICBtZ250IGZyYW1lIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IEh3IGJlY2F1c2UgRncgd2lsbCBhbHNvIHNlbmQgbnVsbCBkYXRhICovCi0JLyogIHdoaWNoIHdlIGNhbm5vdCBjb250cm9sIHdoZW4gRncgTFBTIGVuYWJsZS4gKi8KLQkvKiAgLS0+IGRlZmF1bHQgZW5hYmxlIG5vbi1Rb3MgZGF0YSBzZXF1ZW5zZSBudW1iZXIuIDIwMTAuMDYuMjMuIGJ5IHR5bmxpLiAqLwotCS8qICAoMikgRW5hYmxlIEhXIFNFUSBjb250cm9sIGZvciBiZWFjb24gcGFja2V0LCBiZWNhdXNlIHdlIHVzZSBIdyBiZWFjb24uICovCi0JLyogICgzKSBVc2UgSFcgUW9zIFNFUSB0byBjb250cm9sIHRoZSBzZXEgbnVtIG9mIEV4dCBwb3J0IG5vbi1Rb3MgcGFja2V0cy4gKi8KLQlpZiAoIXBhdHRyaWItPnFvc19lbikgewotCQkvKiAgSHcgc2V0IHNlcXVlbmNlIG51bWJlciAqLwotCQlwdHhkZXNjLT50eGR3NCB8PSBjcHVfdG9fbGUzMihCSVQoNykpOwotCQkvKiBzZXQgYml0MyB0byAxLiAqLwotCQlwdHhkZXNjLT50eGR3MyB8PSBjcHVfdG9fbGUzMigoOCA8PCAyOCkpOwotCX0KLQotCS8qIG9mZnNldCAwICovCi0JcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoc3omMHgwMDAwZmZmZik7Ci0JcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoT1dOIHwgRlNHIHwgTFNHKTsKLQlwdHhkZXNjLT50eGR3MCB8PSBjcHVfdG9fbGUzMigoKFRYREVTQ19TSVpFK09GRlNFVF9TWik8PE9GRlNFVF9TSFQpJjB4MDBmZjAwMDApOy8qIDMyIGJ5dGVzIGZvciBUWCBEZXNjICovCi0KLQlpZiAoYm1jc3QpCi0JCXB0eGRlc2MtPnR4ZHcwIHw9IGNwdV90b19sZTMyKEJJVCgyNCkpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCSAib2Zmc2V0MC10eGRlc2MgPSAweCV4XG4iLCBwdHhkZXNjLT50eGR3MCk7Ci0KLQkvKiBvZmZzZXQgNCAqLwotCS8qICBwa3Rfb2Zmc2V0LCB1bml0OjggYnl0ZXMgcGFkZGluZyAqLwotCWlmIChweG1pdGZyYW1lLT5wa3Rfb2Zmc2V0ID4gMCkKLQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoKHB4bWl0ZnJhbWUtPnBrdF9vZmZzZXQgPDwgMjYpICYgMHg3YzAwMDAwMCk7Ci0KLQlydGw4MTkyY3VfY2FsX3R4ZGVzY19jaGtzdW0ocHR4ZGVzYyk7Ci0JcmV0dXJuIHB1bGw7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2R1bXBfeGZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0JaW50IGlubmVyX3JldCA9IF9TVUNDRVNTOwotCWludCB0LCBzeiwgd19zeiwgcHVsbCA9IDA7Ci0JdTggKm1lbV9hZGRyOwotCXUzMiBmZl9od2FkZHI7Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZiA9IHB4bWl0ZnJhbWUtPnB4bWl0YnVmOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliID0gJnB4bWl0ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCi0JaWYgKHB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9PSBEQVRBX0ZSQU1FVEFHICYmCi0JICAgIHB4bWl0ZnJhbWUtPmF0dHJpYi5ldGhlcl90eXBlICE9IEVUSF9QX0FSUCAmJgotCSAgICBweG1pdGZyYW1lLT5hdHRyaWIuZXRoZXJfdHlwZSAhPSBFVEhfUF9QQUUgJiYKLQkgICAgcHhtaXRmcmFtZS0+YXR0cmliLmRoY3BfcGt0ICE9IDEpCi0JCXJ0d19pc3N1ZV9hZGRiYXJlcV9jbWQyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCi0JbWVtX2FkZHIgPSBweG1pdGZyYW1lLT5idWZfYWRkcjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAicnR3X2R1bXBfeGZyYW1lKClcbiIpOwotCi0JZm9yICh0ID0gMDsgdCA8IHBhdHRyaWItPm5yX2ZyYWdzOyB0KyspIHsKLQkJaWYgKGlubmVyX3JldCAhPSBfU1VDQ0VTUyAmJiByZXQgPT0gX1NVQ0NFU1MpCi0JCQlyZXQgPSBfRkFJTDsKLQotCQlpZiAodCAhPSAocGF0dHJpYi0+bnJfZnJhZ3MgLSAxKSkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgInBhdHRyaWItPm5yX2ZyYWdzID0lZFxuIiwgcGF0dHJpYi0+bnJfZnJhZ3MpOwotCi0JCQlzeiA9IHB4bWl0cHJpdi0+ZnJhZ19sZW47Ci0JCQlzeiA9IHN6IC0gNCAtIHBhdHRyaWItPmljdl9sZW47Ci0JCX0gZWxzZSB7Ci0JCQkvKiBubyBmcmFnICovCi0JCQlzeiA9IHBhdHRyaWItPmxhc3RfdHhjbWRzejsKLQkJfQotCi0JCXB1bGwgPSB1cGRhdGVfdHhkZXNjKHB4bWl0ZnJhbWUsIG1lbV9hZGRyLCBzeik7Ci0KLQkJaWYgKHB1bGwpIHsKLQkJCW1lbV9hZGRyICs9IFBBQ0tFVF9PRkZTRVRfU1o7IC8qIHB1bGwgdHhkZXNjIGhlYWQgKi8KLQotCQkJcHhtaXRmcmFtZS0+YnVmX2FkZHIgPSBtZW1fYWRkcjsKLQotCQkJd19zeiA9IHN6ICsgVFhERVNDX1NJWkU7Ci0JCX0gZWxzZSB7Ci0JCQl3X3N6ID0gc3ogKyBUWERFU0NfU0laRSArIFBBQ0tFVF9PRkZTRVRfU1o7Ci0JCX0KLQotCQlmZl9od2FkZHIgPSBydHdfZ2V0X2ZmX2h3YWRkcjIzYShweG1pdGZyYW1lKTsKLQkJaW5uZXJfcmV0ID0gcnRsODcyM2F1X3dyaXRlX3BvcnQocGFkYXB0ZXIsIGZmX2h3YWRkciwKLQkJCQkJCSB3X3N6LCBweG1pdGJ1Zik7Ci0JCXJ0d19jb3VudF90eF9zdGF0czIzYShwYWRhcHRlciwgcHhtaXRmcmFtZSwgc3opOwotCi0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJydHdfd3JpdGVfcG9ydCwgd19zeiA9JWRcbiIsIHdfc3opOwotCi0JCW1lbV9hZGRyICs9IHdfc3o7Ci0KLQkJbWVtX2FkZHIgPSBQVFJfQUxJR04obWVtX2FkZHIsIDQpOwotCX0KLQotCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwotCi0JaWYgIChyZXQgIT0gX1NVQ0NFU1MpCi0JCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9VTktOT1dOKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWJvb2wgcnRsODcyM2F1X3htaXRmcmFtZV9jb21wbGV0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LAotCQkJCSAgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZikKLXsKLQlzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdHM7Ci0Jc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWU7Ci0JaW50IGh3ZW50cnk7Ci0JaW50IHJlcyA9IF9TVUNDRVNTLCB4Y250ID0gMDsKLQotCXBod3htaXRzID0gcHhtaXRwcml2LT5od3htaXRzOwotCWh3ZW50cnkgPSBweG1pdHByaXYtPmh3eG1pdF9lbnRyeTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAieG1pdGZyYW1lX2NvbXBsZXRlKClcbiIpOwotCi0JaWYgKHB4bWl0YnVmID09IE5VTEwpIHsKLQkJcHhtaXRidWYgPSBydHdfYWxsb2NfeG1pdGJ1ZjIzYShweG1pdHByaXYpOwotCQlpZiAoIXB4bWl0YnVmKQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQlweG1pdGZyYW1lID0gIHJ0d19kZXF1ZXVlX3hmcmFtZTIzYShweG1pdHByaXYsIHBod3htaXRzLCBod2VudHJ5KTsKLQotCWlmIChweG1pdGZyYW1lKSB7Ci0JCXB4bWl0ZnJhbWUtPnB4bWl0YnVmID0gcHhtaXRidWY7Ci0KLQkJcHhtaXRmcmFtZS0+YnVmX2FkZHIgPSBweG1pdGJ1Zi0+cGJ1ZjsKLQotCQlweG1pdGJ1Zi0+cHJpdl9kYXRhID0gcHhtaXRmcmFtZTsKLQotCQlpZiAocHhtaXRmcmFtZS0+ZnJhbWVfdGFnID09IERBVEFfRlJBTUVUQUcpIHsKLQkJCWlmIChweG1pdGZyYW1lLT5hdHRyaWIucHJpb3JpdHkgPD0gMTUpLyogVElEMH4xNSAqLwotCQkJCXJlcyA9IHJ0d194bWl0ZnJhbWVfY29hbGVzY2UyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUtPnBrdCwgcHhtaXRmcmFtZSk7Ci0KLQkJCXJ0d19vc194bWl0X2NvbXBsZXRlMjNhKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsvKiBhbHdheXMgcmV0dXJuIG5kaXNfcGFja2V0IGFmdGVyIHJ0d194bWl0ZnJhbWVfY29hbGVzY2UyM2EgKi8KLQkJfQotCi0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJ4bWl0ZnJhbWVfY29tcGxldGUoKTogcnR3X2R1bXBfeGZyYW1lXG4iKTsKLQotCQlpZiAocmVzID09IF9TVUNDRVNTKSB7Ci0JCQlydHdfZHVtcF94ZnJhbWUocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCQl9IGVsc2UgewotCQkJcnR3X2ZyZWVfeG1pdGJ1ZjIzYShweG1pdHByaXYsIHB4bWl0YnVmKTsKLQkJCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwotCQl9Ci0JCXhjbnQrKzsKLQl9IGVsc2UgewotCQlydHdfZnJlZV94bWl0YnVmMjNhKHB4bWl0cHJpdiwgcHhtaXRidWYpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IHhtaXRmcmFtZV9kaXJlY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlpbnQgcmVzOwotCi0JcmVzID0gcnR3X3htaXRmcmFtZV9jb2FsZXNjZTIzYShwYWRhcHRlciwgcHhtaXRmcmFtZS0+cGt0LCBweG1pdGZyYW1lKTsKLQlpZiAocmVzID09IF9TVUNDRVNTKQotCQlydHdfZHVtcF94ZnJhbWUocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qCi0gKiBSZXR1cm4KLSAqCXRydWUJZHVtcCBwYWNrZXQgZGlyZWN0bHkKLSAqCWZhbHNlCWVucXVldWUgcGFja2V0Ci0gKi8KLWJvb2wgcnRsODcyM2F1X2hhbF94bWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlpbnQgcmVzOwotCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYgPSBOVUxMOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlwYXR0cmliLT5xc2VsID0gcGF0dHJpYi0+cHJpb3JpdHk7Ci0Jc3Bpbl9sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JaWYgKHhtaXRmcmFtZV9lbnF1ZXVlX2Zvcl9zbGVlcGluZ19zdGEyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpKSB7Ci0JCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQkJc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCQlpZiAocGF0dHJpYi0+cHN0YSkKLQkJCXBzdGEgPSBwYXR0cmliLT5wc3RhOwotCQllbHNlCi0JCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5yYSk7Ci0KLQkJaWYgKHBzdGEpIHsKLQkJCWlmIChwc3RhLT5zbGVlcHFfbGVuID4gKE5SX1hNSVRGUkFNRT4+MykpCi0JCQkJd2FrZXVwX3N0YV90b194bWl0MjNhKHBhZGFwdGVyLCBwc3RhKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0jZW5kaWYKLQotCWlmIChydHdfdHhmcmFtZXNfc3RhX2FjX3BlbmRpbmcyM2EocGFkYXB0ZXIsIHBhdHRyaWIpID4gMCkKLQkJZ290byBlbnF1ZXVlOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSA9PSB0cnVlKQotCQlnb3RvIGVucXVldWU7Ci0KLQlweG1pdGJ1ZiA9IHJ0d19hbGxvY194bWl0YnVmMjNhKHB4bWl0cHJpdik7Ci0JaWYgKHB4bWl0YnVmID09IE5VTEwpCi0JCWdvdG8gZW5xdWV1ZTsKLQotCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JcHhtaXRmcmFtZS0+cHhtaXRidWYgPSBweG1pdGJ1ZjsKLQlweG1pdGZyYW1lLT5idWZfYWRkciA9IHB4bWl0YnVmLT5wYnVmOwotCXB4bWl0YnVmLT5wcml2X2RhdGEgPSBweG1pdGZyYW1lOwotCi0JaWYgKHhtaXRmcmFtZV9kaXJlY3QocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpICE9IF9TVUNDRVNTKSB7Ci0JCXJ0d19mcmVlX3htaXRidWYyM2EocHhtaXRwcml2LCBweG1pdGJ1Zik7Ci0JCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLQotZW5xdWV1ZToKLQlyZXMgPSBydHdfeG1pdGZyYW1lX2VucXVldWUyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCXNwaW5fdW5sb2NrX2JoKCZweG1pdHByaXYtPmxvY2spOwotCi0JaWYgKHJlcyAhPSBfU1VDQ0VTUykgewotCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAicHJlX3htaXRmcmFtZTogZW5xdWV1ZSB4bWl0ZnJhbWUgZmFpbFxuIik7Ci0JCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwotCi0JCS8qICBUcmljaywgbWFrZSB0aGUgc3RhdGlzdGljcyBjb3JyZWN0ICovCi0JCXB4bWl0cHJpdi0+dHhfcGt0cy0tOwotCQlweG1pdHByaXYtPnR4X2Ryb3ArKzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotaW50IHJ0bDg3MjNhdV9tZ250X3htaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKQotewotCXJldHVybiBydHdfZHVtcF94ZnJhbWUocGFkYXB0ZXIsIHBtZ250ZnJhbWUpOwotfQotCi1pbnQgcnRsODcyM2F1X2hhbF94bWl0ZnJhbWVfZW5xdWV1ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKLXsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCWludCBlcnI7Ci0KLQllcnIgPSBydHdfeG1pdGZyYW1lX2VucXVldWUyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCWlmIChlcnIgIT0gX1NVQ0NFU1MpIHsKLQkJcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKHB4bWl0cHJpdiwgcHhtaXRmcmFtZSk7Ci0KLQkJLyogIFRyaWNrLCBtYWtlIHRoZSBzdGF0aXN0aWNzIGNvcnJlY3QgKi8KLQkJcHhtaXRwcml2LT50eF9wa3RzLS07Ci0JCXB4bWl0cHJpdi0+dHhfZHJvcCsrOwotCX0gZWxzZSB7Ci0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnB4bWl0cHJpdi0+eG1pdF90YXNrbGV0KTsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9oYWxpbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2JfaGFsaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTQ3YWViLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9oYWxpbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBfSENJX0hBTF9JTklUX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cnR3X2VmdXNlLmg+Ci0KLSNpbmNsdWRlIDxIYWxQd3JTZXFDbWQuaD4KLSNpbmNsdWRlIDxIYWw4NzIzUHdyU2VxLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0jaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+Ci0KLSNpbmNsdWRlIDx1c2Jfb3BzLmg+Ci0KLXN0YXRpYyB2b2lkIHBoeV9Tc1B3clN3aXRjaDkyQ1Uoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgZVJGUG93ZXJTdGF0ZSk7Ci0KLXN0YXRpYyB2b2lkCi1fQ29uZmlnQ2hpcE91dEVQKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IE51bU91dFBpcGUpCi17Ci0JdTggdmFsdWU4OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwotCi0JcEhhbERhdGEtPk91dEVwUXVldWVTZWwgPSAwOwotCXBIYWxEYXRhLT5PdXRFcE51bWJlciA9IDA7Ci0KLQkvKiAgTm9ybWFsIGFuZCBIaWdoIHF1ZXVlICovCi0JdmFsdWU4ID0gcnRsODcyM2F1X3JlYWQ4KHBBZGFwdGVyLCAoUkVHX05PUk1BTF9TSUVfRVAgKyAxKSk7Ci0KLQlpZiAodmFsdWU4ICYgVVNCX05PUk1BTF9TSUVfRVBfTUFTSykgewotCQlwSGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCB8PSBUWF9TRUxFX0hROwotCQlwSGFsRGF0YS0+T3V0RXBOdW1iZXIrKzsKLQl9Ci0KLQlpZiAoKHZhbHVlOCA+PiBVU0JfTk9STUFMX1NJRV9FUF9TSElGVCkgJiBVU0JfTk9STUFMX1NJRV9FUF9NQVNLKSB7Ci0JCXBIYWxEYXRhLT5PdXRFcFF1ZXVlU2VsIHw9IFRYX1NFTEVfTlE7Ci0JCXBIYWxEYXRhLT5PdXRFcE51bWJlcisrOwotCX0KLQotCS8qICBMb3cgcXVldWUgKi8KLQl2YWx1ZTggPSBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsIChSRUdfTk9STUFMX1NJRV9FUCArIDIpKTsKLQlpZiAodmFsdWU4ICYgVVNCX05PUk1BTF9TSUVfRVBfTUFTSykgewotCQlwSGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCB8PSBUWF9TRUxFX0xROwotCQlwSGFsRGF0YS0+T3V0RXBOdW1iZXIrKzsKLQl9Ci0KLQkvKiAgVE9ETzogRXJyb3IgcmVjb3ZlcnkgZm9yIHRoaXMgY2FzZSAqLwotCS8qIFJUX0FTU0VSVCgoTnVtT3V0UGlwZSA9PSBwSGFsRGF0YS0+T3V0RXBOdW1iZXIpLAotCSAgICgiT3V0IEVQIG51bWJlciBpc24ndCBtYXRjaCEgJWQoRGVzY3JpcHRvcikgIT0gJWQgKFNJRSByZWcpXG4iLAotCSAgICh1MzIpTnVtT3V0UGlwZSwgKHUzMilwSGFsRGF0YS0+T3V0RXBOdW1iZXIpKTsgKi8KLX0KLQotYm9vbCBydGw4NzIzYXVfY2hpcF9jb25maWd1cmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqcHJpdiA9IGFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpOwotCXU4IE51bUluUGlwZSA9IHBkdm9ianByaXYtPlJ0TnVtSW5QaXBlczsKLQl1OCBOdW1PdXRQaXBlID0gcGR2b2JqcHJpdi0+UnROdW1PdXRQaXBlczsKLQotCV9Db25maWdDaGlwT3V0RVAocGFkYXB0ZXIsIE51bU91dFBpcGUpOwotCi0JLyogIE5vcm1hbCBjaGlwIHdpdGggb25lIElOIGFuZCBvbmUgT1VUIGRvZXNuJ3QgaGF2ZSBpbnRlcnJ1cHQgSU4gRVAuICovCi0JaWYgKHBIYWxEYXRhLT5PdXRFcE51bWJlciA9PSAxKSB7Ci0JCWlmIChOdW1JblBpcGUgIT0gMSkKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gSGFsX01hcHBpbmdPdXRQaXBlMjNhKHBhZGFwdGVyLCBOdW1PdXRQaXBlKTsKLX0KLQotc3RhdGljIGludCBfSW5pdFBvd2VyT24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQl1MTYgdmFsdWUxNjsKLQl1OCB2YWx1ZTg7Ci0KLQkvKiAgUlNWX0NUUkwgMHgxQ1s3OjBdID0gMHgwMAotCSAgICB1bmxvY2sgSVNPL0NMSy9Qb3dlciBjb250cm9sIHJlZ2lzdGVyICovCi0JcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX1JTVl9DVFJMLCAweDApOwotCi0JLyogIEhXIFBvd2VyIG9uIHNlcXVlbmNlICovCi0JaWYgKCFIYWxQd3JTZXFDbWRQYXJzaW5nMjNhKHBhZGFwdGVyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywKLQkJCQkgUFdSX0lOVEZfVVNCX01TSywgcnRsODcyM0FVX2NhcmRfZW5hYmxlX2Zsb3cpKQotCQlyZXR1cm4gX0ZBSUw7Ci0KLQkvKiAgMHgwNFsxOV0gPSAxLCBzdWdnZXN0IGJ5IEphY2tpZSAyMDExLjA1LjA5LCByZXNldCA4MDUxICovCi0JdmFsdWU4ID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfQVBTX0ZTTUNPKzIpOwotCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19BUFNfRlNNQ08gKyAyLCB2YWx1ZTggfCBCSVQoMykpOwotCi0JLyogIEVuYWJsZSBNQUMgRE1BL1dNQUMvU0NIRURVTEUvU0VDIGJsb2NrICovCi0JLyogIFNldCBDUiBiaXQxMCB0byBlbmFibGUgMzJrIGNhbGlicmF0aW9uLiBTdWdnZXN0ZWQgYnkgU0QxIEdpbW15LgotCSAgICBBZGRlZCBieSB0eW5saS4gMjAxMS4wOC4zMS4gKi8KLQl2YWx1ZTE2ID0gcnRsODcyM2F1X3JlYWQxNihwYWRhcHRlciwgUkVHX0NSKTsKLQl2YWx1ZTE2IHw9IChIQ0lfVFhETUFfRU4gfCBIQ0lfUlhETUFfRU4gfCBUWERNQV9FTiB8IFJYRE1BX0VOIHwKLQkJICAgIFBST1RPQ09MX0VOIHwgU0NIRURVTEVfRU4gfCBNQUNUWEVOIHwgTUFDUlhFTiB8Ci0JCSAgICBFTlNFQyB8IENBTFRNUl9FTik7Ci0JcnRsODcyM2F1X3dyaXRlMTYocGFkYXB0ZXIsIFJFR19DUiwgdmFsdWUxNik7Ci0KLQkvKiBmb3IgRWZ1c2UgUEcsIHN1Z2dlc3QgYnkgSmFja2llIDIwMTEuMTEuMjMgKi8KLQlQSFlfU2V0QkJSZWcocGFkYXB0ZXIsIFJFR19FRlVTRV9DVFJMLCBCSVQoMjgpfEJJVCgyOSl8QklUKDMwKSwgMHgwNik7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLS8qICBTaGFsbCBVU0IgaW50ZXJmYWNlIGluaXQgdGhpcz8gKi8KLXN0YXRpYyB2b2lkIF9Jbml0SW50ZXJydXB0KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQl1MzIgdmFsdWUzMjsKLQotCS8qICBISVNSIC0gdHVybiBhbGwgb24gKi8KLQl2YWx1ZTMyID0gMHhGRkZGRkZGRjsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfSElTUiwgdmFsdWUzMik7Ci0KLQkvKiAgSElNUiAtIHR1cm4gYWxsIG9uICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0hJTVIsIHZhbHVlMzIpOwotfQotCi1zdGF0aWMgdm9pZCBfSW5pdFF1ZXVlUmVzZXJ2ZWRQYWdlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJkFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQl1MzIgbnVtSFEgPSAwOwotCXUzMiBudW1MUSA9IDA7Ci0JdTMyIG51bU5RID0gMDsKLQl1MzIgbnVtUHViUTsKLQl1MzIgdmFsdWUzMjsKLQl1OCB2YWx1ZTg7Ci0JYm9vbCBiV2lGaUNvbmZpZyA9IHByZWdpc3RyeXByaXYtPndpZmlfc3BlYzsKLQotCS8qIFJUX0FTU0VSVCgob3V0RVBOdW0+PSAyKSwgKCJmb3IgV01NICwgbnVtYmVyIG9mIG91dC1lcCAiCi0JICAgIm11c3QgbW9yZSB0aGFuIG9yIGVxdWFsIHRvIDIhXG4iKSk7ICovCi0KLQludW1QdWJRID0gYldpRmlDb25maWcgPyBXTU1fTk9STUFMX1BBR0VfTlVNX1BVQlEgOiBOT1JNQUxfUEFHRV9OVU1fUFVCUTsKLQotCWlmIChwSGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCAmIFRYX1NFTEVfSFEpIHsKLQkJbnVtSFEgPSBiV2lGaUNvbmZpZyA/Ci0JCQlXTU1fTk9STUFMX1BBR0VfTlVNX0hQUSA6IE5PUk1BTF9QQUdFX05VTV9IUFE7Ci0JfQotCi0JaWYgKHBIYWxEYXRhLT5PdXRFcFF1ZXVlU2VsICYgVFhfU0VMRV9MUSkgewotCQludW1MUSA9IGJXaUZpQ29uZmlnID8KLQkJCVdNTV9OT1JNQUxfUEFHRV9OVU1fTFBRIDogTk9STUFMX1BBR0VfTlVNX0xQUTsKLQl9Ci0JLyogIE5PVEU6IFRoaXMgc3RlcCBzaGFsbCBiZSBwcm9jZWVkIGJlZm9yZQotCSAgICB3cml0dGluZyBSRUdfUlFQTi4gKi8KLQlpZiAocEhhbERhdGEtPk91dEVwUXVldWVTZWwgJiBUWF9TRUxFX05RKSB7Ci0JCW51bU5RID0gYldpRmlDb25maWcgPwotCQkJV01NX05PUk1BTF9QQUdFX05VTV9OUFEgOiBOT1JNQUxfUEFHRV9OVU1fTlBROwotCX0KLQl2YWx1ZTggPSAodTgpX05QUShudW1OUSk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfUlFQTl9OUFEsIHZhbHVlOCk7Ci0KLQkvKiAgVFggRE1BICovCi0JdmFsdWUzMiA9IF9IUFEobnVtSFEpIHwgX0xQUShudW1MUSkgfCBfUFVCUShudW1QdWJRKSB8IExEX1JRUE47Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX1JRUE4sIHZhbHVlMzIpOwotfQotCi1zdGF0aWMgdm9pZCBfSW5pdFR4QnVmZmVyQm91bmRhcnkoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJkFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQotCXU4IHR4cGt0YnVmX2JuZHk7Ci0KLQlpZiAoIXByZWdpc3RyeXByaXYtPndpZmlfc3BlYykKLQkJdHhwa3RidWZfYm5keSA9IFRYX1BBR0VfQk9VTkRBUlk7Ci0JZWxzZSAvKiBmb3IgV01NICovCi0JCXR4cGt0YnVmX2JuZHkgPSBXTU1fTk9STUFMX1RYX1BBR0VfQk9VTkRBUlk7Ci0KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19UWFBLVEJVRl9CQ05RX0JETlksIHR4cGt0YnVmX2JuZHkpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1RYUEtUQlVGX01HUV9CRE5ZLCB0eHBrdGJ1Zl9ibmR5KTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19UWFBLVEJVRl9XTUFDX0xCS19CRl9IRCwgdHhwa3RidWZfYm5keSk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfVFJYRkZfQk5EWSwgdHhwa3RidWZfYm5keSk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfVERFQ1RSTCsxLCB0eHBrdGJ1Zl9ibmR5KTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRQYWdlQm91bmRhcnkoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCS8qICBSWCBQYWdlIEJvdW5kYXJ5ICovCi0JLyogc3JhbmQoc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pih0aW1lKE5VTEwpKSk7ICovCi0JdTE2IHJ4ZmZfYm5keSA9IDB4MjdGRjsvKiByYW5kKCkgJSAxKSA/IDB4MjdGRiA6IDB4MjNGRjsgKi8KLQotCXJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIChSRUdfVFJYRkZfQk5EWSArIDIpLCByeGZmX2JuZHkpOwotCi0JLyogIFRPRE86ID8/IHNoYWxsIHdlIHNldCB0eCBib3VuZGFyeT8gKi8KLX0KLQotc3RhdGljIHZvaWQKLV9Jbml0Tm9ybWFsQ2hpcFJlZ1ByaW9yaXR5KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTE2IGJlUSwgdTE2IGJrUSwKLQkJCSAgIHUxNiB2aVEsIHUxNiB2b1EsIHUxNiBtZ3RRLCB1MTYgaGlRKQotewotCXUxNiB2YWx1ZTE2ID0gcnRsODcyM2F1X3JlYWQxNihBZGFwdGVyLCBSRUdfVFJYRE1BX0NUUkwpICYgMHg3OwotCi0JdmFsdWUxNiB8PSBfVFhETUFfQkVRX01BUChiZVEpIHwgX1RYRE1BX0JLUV9NQVAoYmtRKSB8Ci0JCV9UWERNQV9WSVFfTUFQKHZpUSkgfCBfVFhETUFfVk9RX01BUCh2b1EpIHwKLQkJX1RYRE1BX01HUV9NQVAobWd0USkgfCBfVFhETUFfSElRX01BUChoaVEpOwotCi0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1RSWERNQV9DVFJMLCB2YWx1ZTE2KTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXROb3JtYWxDaGlwT25lT3V0RXBQcmlvcml0eShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1MTYgdmFsdWUgPSAwOwotCi0Jc3dpdGNoIChwSGFsRGF0YS0+T3V0RXBRdWV1ZVNlbCkgewotCWNhc2UgVFhfU0VMRV9IUToKLQkJdmFsdWUgPSBRVUVVRV9ISUdIOwotCQlicmVhazsKLQljYXNlIFRYX1NFTEVfTFE6Ci0JCXZhbHVlID0gUVVFVUVfTE9XOwotCQlicmVhazsKLQljYXNlIFRYX1NFTEVfTlE6Ci0JCXZhbHVlID0gUVVFVUVfTk9STUFMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQkvKiBSVF9BU1NFUlQoZmFsc2UsICgiU2hhbGwgbm90IHJlYWNoIGhlcmUhXG4iKSk7ICovCi0JCWJyZWFrOwotCX0KLQotCV9Jbml0Tm9ybWFsQ2hpcFJlZ1ByaW9yaXR5KEFkYXB0ZXIsIHZhbHVlLCB2YWx1ZSwgdmFsdWUsCi0JCQkJICAgdmFsdWUsIHZhbHVlLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0Tm9ybWFsQ2hpcFR3b091dEVwUHJpb3JpdHkoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmQWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXUxNiBiZVEsIGJrUSwgdmlRLCB2b1EsIG1ndFEsIGhpUTsKLQl1MTYgdmFsdWVIaSA9IDA7Ci0JdTE2IHZhbHVlTG93ID0gMDsKLQotCXN3aXRjaCAocEhhbERhdGEtPk91dEVwUXVldWVTZWwpIHsKLQljYXNlIChUWF9TRUxFX0hRIHwgVFhfU0VMRV9MUSk6Ci0JCXZhbHVlSGkgPSBRVUVVRV9ISUdIOwotCQl2YWx1ZUxvdyA9IFFVRVVFX0xPVzsKLQkJYnJlYWs7Ci0JY2FzZSAoVFhfU0VMRV9OUSB8IFRYX1NFTEVfTFEpOgotCQl2YWx1ZUhpID0gUVVFVUVfTk9STUFMOwotCQl2YWx1ZUxvdyA9IFFVRVVFX0xPVzsKLQkJYnJlYWs7Ci0JY2FzZSAoVFhfU0VMRV9IUSB8IFRYX1NFTEVfTlEpOgotCQl2YWx1ZUhpID0gUVVFVUVfSElHSDsKLQkJdmFsdWVMb3cgPSBRVUVVRV9OT1JNQUw7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIFJUX0FTU0VSVChmYWxzZSwgKCJTaGFsbCBub3QgcmVhY2ggaGVyZSFcbiIpKTsgKi8KLQkJYnJlYWs7Ci0JfQotCi0JaWYgKCFwcmVnaXN0cnlwcml2LT53aWZpX3NwZWMpIHsKLQkJYmVRID0gdmFsdWVMb3c7Ci0JCWJrUSA9IHZhbHVlTG93OwotCQl2aVEgPSB2YWx1ZUhpOwotCQl2b1EgPSB2YWx1ZUhpOwotCQltZ3RRID0gdmFsdWVIaTsKLQkJaGlRID0gdmFsdWVIaTsKLQl9IGVsc2Ugey8qIGZvciBXTU0gLCBDT05GSUdfT1VUX0VQX1dJRklfTU9ERSAqLwotCQliZVEgPSB2YWx1ZUxvdzsKLQkJYmtRID0gdmFsdWVIaTsKLQkJdmlRID0gdmFsdWVIaTsKLQkJdm9RID0gdmFsdWVMb3c7Ci0JCW1ndFEgPSB2YWx1ZUhpOwotCQloaVEgPSB2YWx1ZUhpOwotCX0KLQotCV9Jbml0Tm9ybWFsQ2hpcFJlZ1ByaW9yaXR5KEFkYXB0ZXIsIGJlUSwgYmtRLCB2aVEsIHZvUSwgbWd0USwgaGlRKTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXROb3JtYWxDaGlwVGhyZWVPdXRFcFByaW9yaXR5KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JdTE2IGJlUSwgYmtRLCB2aVEsIHZvUSwgbWd0USwgaGlROwotCi0JaWYgKCFwcmVnaXN0cnlwcml2LT53aWZpX3NwZWMpIHsvKiAgdHlwaWNhbCBzZXR0aW5nICovCi0JCWJlUSA9IFFVRVVFX0xPVzsKLQkJYmtRID0gUVVFVUVfTE9XOwotCQl2aVEgPSBRVUVVRV9OT1JNQUw7Ci0JCXZvUSA9IFFVRVVFX0hJR0g7Ci0JCW1ndFEgPSBRVUVVRV9ISUdIOwotCQloaVEgPSBRVUVVRV9ISUdIOwotCX0gZWxzZSB7LyogIGZvciBXTU0gKi8KLQkJYmVRID0gUVVFVUVfTE9XOwotCQlia1EgPSBRVUVVRV9OT1JNQUw7Ci0JCXZpUSA9IFFVRVVFX05PUk1BTDsKLQkJdm9RID0gUVVFVUVfSElHSDsKLQkJbWd0USA9IFFVRVVFX0hJR0g7Ci0JCWhpUSA9IFFVRVVFX0hJR0g7Ci0JfQotCV9Jbml0Tm9ybWFsQ2hpcFJlZ1ByaW9yaXR5KEFkYXB0ZXIsIGJlUSwgYmtRLCB2aVEsIHZvUSwgbWd0USwgaGlRKTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRRdWV1ZVByaW9yaXR5KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCi0Jc3dpdGNoIChwSGFsRGF0YS0+T3V0RXBOdW1iZXIpIHsKLQljYXNlIDE6Ci0JCV9Jbml0Tm9ybWFsQ2hpcE9uZU91dEVwUHJpb3JpdHkoQWRhcHRlcik7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJX0luaXROb3JtYWxDaGlwVHdvT3V0RXBQcmlvcml0eShBZGFwdGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlfSW5pdE5vcm1hbENoaXBUaHJlZU91dEVwUHJpb3JpdHkoQWRhcHRlcik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIFJUX0FTU0VSVChmYWxzZSwgKCJTaGFsbCBub3QgcmVhY2ggaGVyZSFcbiIpKTsgKi8KLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfSW5pdFRyYW5zZmVyUGFnZVNpemUoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCS8qICBUeCBwYWdlIHNpemUgaXMgYWx3YXlzIDEyOC4gKi8KLQotCXU4IHZhbHVlODsKLQl2YWx1ZTggPSBfUFNSWChQQlBfMTI4KSB8IF9QU1RYKFBCUF8xMjgpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1BCUCwgdmFsdWU4KTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXREcml2ZXJJbmZvU2l6ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGRydkluZm9TaXplKQotewotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JYX0RSVklORk9fU1osIGRydkluZm9TaXplKTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRXTUFDU2V0dGluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCS8qICBkb24ndCB0dXJuIG9uIEFBUCwgaXQgd2lsbCBhbGxvdyBhbGwgcGFja2V0cyB0byBkcml2ZXIgKi8KLQlwSGFsRGF0YS0+UmVjZWl2ZUNvbmZpZyA9IFJDUl9BUE0gfCBSQ1JfQU0gfCBSQ1JfQUIgfCBSQ1JfQ0JTU0lEX0RBVEEgfAotCQkJCSAgUkNSX0NCU1NJRF9CQ04gfCBSQ1JfQVBQX0lDViB8IFJDUl9BTUYgfAotCQkJCSAgUkNSX0hUQ19MT0NfQ1RSTCB8IFJDUl9BUFBfTUlDIHwKLQkJCQkgIFJDUl9BUFBfUEhZU1RTOwotCi0JLyogIHNvbWUgUkVHX1JDUiB3aWxsIGJlIG1vZGlmaWVkIGxhdGVyIGJ5Ci0JICAgIHBoeV9Db25maWdNQUNXaXRoSGVhZGVyRmlsZSgpICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX1JDUiwgcEhhbERhdGEtPlJlY2VpdmVDb25maWcpOwotCi0JLyogIEFjY2VwdCBhbGwgbXVsdGljYXN0IGFkZHJlc3MgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfTUFSLCAweEZGRkZGRkZGKTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfTUFSICsgNCwgMHhGRkZGRkZGRik7Ci0KLQkvKiAgQWNjZXB0IGFsbCBkYXRhIGZyYW1lcyAqLwotCS8qIHZhbHVlMTYgPSAweEZGRkY7ICovCi0JLyogcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1JYRkxUTUFQMiwgdmFsdWUxNik7ICovCi0KLQkvKiAgMjAxMC4wOS4wOCBocGZhbiAqLwotCS8qICBTaW5jZSBBREYgaXMgcmVtb3ZlZCBmcm9tIFJDUiwgcHMtcG9sbCB3aWxsIG5vdCBiZSBpbmRpY2F0ZQotCSAgICB0byBkcml2ZXIsICovCi0JLyogIFJ4RmlsdGVyTWFwIHNob3VsZCBtYXNrIHBzLXBvbGwgdG8gZ3VhcmFudGVlIEFQIG1vZGUgY2FuCi0JICAgIHJ4IHBzLXBvbGwuICovCi0JLyogdmFsdWUxNiA9IDB4NDAwOyAqLwotCS8qIHJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19SWEZMVE1BUDEsIHZhbHVlMTYpOyAqLwotCi0JLyogIEFjY2VwdCBhbGwgbWFuYWdlbWVudCBmcmFtZXMgKi8KLQkvKiB2YWx1ZTE2ID0gMHhGRkZGOyAqLwotCS8qIHJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19SWEZMVE1BUDAsIHZhbHVlMTYpOyAqLwotCi0JLyogZW5hYmxlIFJYX1NISUZUIGJpdHMgKi8KLQkvKiBydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19UUlhETUFfQ1RSTCwgcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsCi0JICAgUkVHX1RSWERNQV9DVFJMKXxCSVQoMSkpOyAqLwotfQotCi1zdGF0aWMgdm9pZCBfSW5pdEFkYXB0aXZlQ3RybChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JdTE2IHZhbHVlMTY7Ci0JdTMyIHZhbHVlMzI7Ci0KLQkvKiAgUmVzcG9uc2UgUmF0ZSBTZXQgKi8KLQl2YWx1ZTMyID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBSRUdfUlJTUik7Ci0JdmFsdWUzMiAmPSB+UkFURV9CSVRNQVBfQUxMOwotCXZhbHVlMzIgfD0gUkFURV9SUlNSX0NDS19PTkxZXzFNOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19SUlNSLCB2YWx1ZTMyKTsKLQotCS8qICBDRi1FTkQgVGhyZXNob2xkICovCi0JLyogbV9zcElvQmFzZS0+cnRsODcyM2F1X3dyaXRlOChSRUdfQ0ZFTkRfVEgsIDB4MSk7ICovCi0KLQkvKiAgU0lGUyAodXNlZCBpbiBOQVYpICovCi0JdmFsdWUxNiA9IF9TUEVDX1NJRlNfQ0NLKDB4MTApIHwgX1NQRUNfU0lGU19PRkRNKDB4MTApOwotCXJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19TUEVDX1NJRlMsIHZhbHVlMTYpOwotCi0JLyogIFJldHJ5IExpbWl0ICovCi0JdmFsdWUxNiA9IF9MUkwoMHgzMCkgfCBfU1JMKDB4MzApOwotCXJ0bDg3MjNhdV93cml0ZTE2KEFkYXB0ZXIsIFJFR19STCwgdmFsdWUxNik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0UmF0ZUZhbGxiYWNrKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQkvKiAgU2V0IERhdGEgQXV0byBSYXRlIEZhbGxiYWNrIFJldHJ5IENvdW50IHJlZ2lzdGVyLiAqLwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19EQVJGUkMsIDB4MDAwMDAwMDApOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19EQVJGUkMrNCwgMHgxMDA4MDQwNCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX1JBUkZSQywgMHgwNDAzMDIwMSk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX1JBUkZSQys0LCAweDA4MDcwNjA1KTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRFRENBKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQkvKiAgU2V0IFNwZWMgU0lGUyAodXNlZCBpbiBOQVYpICovCi0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1NQRUNfU0lGUywgMHgxMDBhKTsKLQlydGw4NzIzYXVfd3JpdGUxNihBZGFwdGVyLCBSRUdfTUFDX1NQRUNfU0lGUywgMHgxMDBhKTsKLQotCS8qICBTZXQgU0lGUyBmb3IgQ0NLICovCi0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1NJRlNfQ1RYLCAweDEwMGEpOwotCi0JLyogIFNldCBTSUZTIGZvciBPRkRNICovCi0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1NJRlNfVFJYLCAweDEwMGEpOwotCi0JLyogIFRYT1AgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfRURDQV9CRV9QQVJBTSwgMHgwMDVFQTQyQik7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0VEQ0FfQktfUEFSQU0sIDB4MDAwMEE0NEYpOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19FRENBX1ZJX1BBUkFNLCAweDAwNUVBMzI0KTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfRURDQV9WT19QQVJBTSwgMHgwMDJGQTIyNik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0UkRHU2V0dGluZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfUkRfQ1RSTCwgMHhGRik7Ci0JcnRsODcyM2F1X3dyaXRlMTYoQWRhcHRlciwgUkVHX1JEX05BVl9OWFQsIDB4MjAwKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19SRF9SRVNQX1BLVF9USCwgMHgwNSk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9Jbml0UmV0cnlGdW5jdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JdTggdmFsdWU4OwotCi0JdmFsdWU4ID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMKTsKLQl2YWx1ZTggfD0gRU5fQU1QRFVfUlRZX05FVzsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMLCB2YWx1ZTgpOwotCi0JLyogIFNldCBBQ0sgdGltZW91dCAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX0FDS1RPLCAweDQwKTsKLX0KLQotc3RhdGljIHZvaWQgX0luaXRSRlR5cGUoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlwSGFsRGF0YS0+cmZfdHlwZSA9IFJGXzFUMVI7Ci19Ci0KLS8qICBTZXQgQ0NLIGFuZCBPRkRNIEJsb2NrICJPTiIgKi8KLXN0YXRpYyB2b2lkIF9CQlR1cm5PbkJsb2NrKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKLXsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1JGTU9ELCBiQ0NLRW4sIDB4MSk7Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgYk9GRE1FbiwgMHgxKTsKLX0KLQotI2RlZmluZSBNZ250QWN0U2V0X1JGX1N0YXRlKC4uLikKLXN0YXRpYyB2b2lkIF9SZlBvd2VyU2F2ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotfQotCi1lbnVtIHsKLQlBbnRlbm5hX0xmZXQgPSAxLAotCUFudGVubmFfUmlnaHQgPSAyLAotfTsKLQotZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBSZk9uT2ZmRGV0ZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIpCi17Ci0JLyogc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7ICovCi0JdTggdmFsODsKLQllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHJmcG93ZXJzdGF0ZSA9IHJmX29mZjsKLQotCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIFJFR19NQUNfUElOTVVYX0NGRywKLQkJCSBydGw4NzIzYXVfcmVhZDgocEFkYXB0ZXIsCi0JCQkJCSBSRUdfTUFDX1BJTk1VWF9DRkcpICYgfkJJVCgzKSk7Ci0JdmFsOCA9IHJ0bDg3MjNhdV9yZWFkOChwQWRhcHRlciwgUkVHX0dQSU9fSU9fU0VMKTsKLQlEQkdfODcyM0EoIkdQSU9fSU4gPSUwMnhcbiIsIHZhbDgpOwotCXJmcG93ZXJzdGF0ZSA9ICh2YWw4ICYgQklUKDMpKSA/IHJmX29uIDogcmZfb2ZmOwotCi0JcmV0dXJuIHJmcG93ZXJzdGF0ZTsKLX0KLQotaW50IHJ0bDg3MjNhdV9oYWxfaW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZBZGFwdGVyLT5wd3JjdHJscHJpdjsKLQlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiA9ICZBZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0JdTggdmFsOCA9IDA7Ci0JdTMyIGJvdW5kYXJ5OwotCWludCBzdGF0dXMgPSBfU1VDQ0VTUzsKLQlib29sIG1hY19vbjsKLQotCXVuc2lnbmVkIGxvbmcgaW5pdF9zdGFydF90aW1lID0gamlmZmllczsKLQotCUFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkID0gZmFsc2U7Ci0KLQlpZiAoQWRhcHRlci0+cHdyY3RybHByaXYuYmtlZXBmd2FsaXZlKSB7Ci0JCXBoeV9Tc1B3clN3aXRjaDkyQ1UoQWRhcHRlciwgcmZfb24pOwotCi0JCWlmIChwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkKSB7Ci0JCQlydGw4NzIzYV9waHlfaXFfY2FsaWJyYXRlKEFkYXB0ZXIsIHRydWUpOwotCQl9IGVsc2UgewotCQkJcnRsODcyM2FfcGh5X2lxX2NhbGlicmF0ZShBZGFwdGVyLCBmYWxzZSk7Ci0JCQlwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCQlydGw4NzIzYV9vZG1fY2hlY2tfdHhfcG93ZXJfdHJhY2tpbmcoQWRhcHRlcik7Ci0JCXJ0bDg3MjNhX3BoeV9sY19jYWxpYnJhdGUoQWRhcHRlcik7Ci0KLQkJZ290byBleGl0OwotCX0KLQotCS8qICBDaGVjayBpZiBNQUMgaGFzIGFscmVhZHkgcG93ZXIgb24uIGJ5IHR5bmxpLiAyMDExLjA1LjI3LiAqLwotCXZhbDggPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX0NSKTsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICIlczogUkVHX0NSIDB4MTAwID0gMHglMDJ4XG4iLCBfX2Z1bmNfXywgdmFsOCk7Ci0JLyogRml4IDkyRFUtVkMgUzMgaGFuZyB3aXRoIHRoZSByZWFzb24gaXMgdGhhdCBzZWNvbmRhcnkgbWFjIGlzIG5vdAotCSAgIGluaXRpYWxpemVkLiAqLwotCS8qIDB4MTAwIHZhbHVlIG9mIGZpcnN0IG1hYyBpcyAweEVBIHdoaWxlIDB4MTAwIHZhbHVlIG9mIHNlY29uZGFyeQotCSAgIGlzIDB4MDAgKi8KLQlpZiAodmFsOCA9PSAweEVBKSB7Ci0JCW1hY19vbiA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCW1hY19vbiA9IHRydWU7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICIlczogTUFDIGhhcyBhbHJlYWR5IHBvd2VyIG9uXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0Jc3RhdHVzID0gX0luaXRQb3dlck9uKEFkYXB0ZXIpOwotCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCSAiRmFpbGVkIHRvIGluaXQgcG93ZXIgb24hXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICghcHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjKSB7Ci0JCWJvdW5kYXJ5ID0gVFhfUEFHRV9CT1VOREFSWTsKLQl9IGVsc2UgewotCQkvKiAgZm9yIFdNTSAqLwotCQlib3VuZGFyeSA9IFdNTV9OT1JNQUxfVFhfUEFHRV9CT1VOREFSWTsKLQl9Ci0KLQlpZiAoIW1hY19vbikgewotCQlzdGF0dXMgPSAgSW5pdExMVFRhYmxlMjNhKEFkYXB0ZXIsIGJvdW5kYXJ5KTsKLQkJaWYgKHN0YXR1cyA9PSBfRkFJTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgIkZhaWxlZCB0byBpbml0IExMVCB0YWJsZVxuIik7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQl9Ci0KLQlpZiAocEhhbERhdGEtPmJSREdFbmFibGUpCi0JCV9Jbml0UkRHU2V0dGluZyhBZGFwdGVyKTsKLQotCXN0YXR1cyA9IHJ0bDg3MjNhX0Zpcm13YXJlRG93bmxvYWQoQWRhcHRlcik7Ci0JaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykgewotCQlBZGFwdGVyLT5iRldSZWFkeSA9IGZhbHNlOwotCQlEQkdfODcyM0EoImZ3IGRvd25sb2FkIGZhaWwhXG4iKTsKLQkJZ290byBleGl0OwotCX0gZWxzZSB7Ci0JCUFkYXB0ZXItPmJGV1JlYWR5ID0gdHJ1ZTsKLQkJREJHXzg3MjNBKCJmdyBkb3dubG9hZCBvayFcbiIpOwotCX0KLQotCXJ0bDg3MjNhX0luaXRpYWxpemVGaXJtd2FyZVZhcnMoQWRhcHRlcik7Ci0KLQlpZiAocHdyY3RybHByaXYtPnJlZ19yZm9mZiA9PSB0cnVlKSB7Ci0JCXB3cmN0cmxwcml2LT5yZl9wd3JzdGF0ZSA9IHJmX29mZjsKLQl9Ci0KLQkvKiAgMjAxMC8wOC8wOSBNSCBXZSBuZWVkIHRvIGNoZWNrIGlmIHdlIG5lZWQgdG8gdHVybm9uIG9yIG9mZiBSRiBhZnRlciBkZXRlY3RpbmcgKi8KLQkvKiAgSFcgR1BJTyBwaW4uIEJlZm9yZSBQSFlfUkZDb25maWc4MTkyQy4gKi8KLQkvKiBIYWxEZXRlY3RQd3JEb3duTW9kZShBZGFwdGVyKTsgKi8KLQkvKiAgMjAxMC8wOC8yNiBNSCBJZiBFZnVzZSBkb2VzIG5vdCBzdXBwb3J0IHNlY3RpdmUgc3VzcGVuZCB0aGVuIGRpc2FibGUgdGhlIGZ1bmN0aW9uLiAqLwotCS8qIEhhbERldGVjdFNlbGVjdGl2ZVN1c3BlbmRNb2RlKEFkYXB0ZXIpOyAqLwotCi0JLyogIFNldCBSRiB0eXBlIGZvciBCQi9SRiBjb25maWd1cmF0aW9uICovCi0JX0luaXRSRlR5cGUoQWRhcHRlcik7LyogX1JlYWRSRlR5cGUoKSAqLwotCi0JLyogIFNhdmUgdGFyZ2V0IGNoYW5uZWwgKi8KLQkvKiAgPFJvZ2VyX05vdGVzPiBDdXJyZW50IENoYW5uZWwgd2lsbCBiZSB1cGRhdGVkIGFnYWluIGxhdGVyLiAqLwotCXBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCA9IDY7LyogZGVmYXVsdCBzZXQgdG8gNiAqLwotCi0Jc3RhdHVzID0gUEhZX01BQ0NvbmZpZzg3MjNBKEFkYXB0ZXIpOwotCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKLQkJREJHXzg3MjNBKCJQSFlfTUFDQ29uZmlnODcyM0EgZmF1bHQgISFcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogICovCi0JLyogZC4gSW5pdGlhbGl6ZSBCQiByZWxhdGVkIGNvbmZpZ3VyYXRpb25zLiAqLwotCS8qICAqLwotCXN0YXR1cyA9IFBIWV9CQkNvbmZpZzg3MjNBKEFkYXB0ZXIpOwotCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKLQkJREJHXzg3MjNBKCJQSFlfQkJDb25maWc4NzIzQSBmYXVsdCAhIVxuIik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiAgQWRkIGZvciB0eCBwb3dlciBieSByYXRlIGZpbmUgdHVuZS4gV2UgbmVlZCB0byBjYWxsIHRoZSBmdW5jdGlvbiBhZnRlciBCQiBjb25maWcuICovCi0JLyogIEJlY2F1c2UgdGhlIHR4IHBvd2VyIGJ5IHJhdGUgdGFibGUgaXMgaW5pdGVkIGluIEJCIGNvbmZpZy4gKi8KLQotCXN0YXR1cyA9IFBIWV9SRjYwNTJfQ29uZmlnODcyM0EoQWRhcHRlcik7Ci0JaWYgKHN0YXR1cyA9PSBfRkFJTCkgewotCQlEQkdfODcyM0EoIlBIWV9SRjYwNTJfQ29uZmlnODcyM0EgZmFpbGVkISFcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogcmVkdWNpbmcgODBNIHNwdXIgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfQUZFX1hUQUxfQ1RSTCwgMHgwMzgxODA4ZCk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCwgMHhmMGZmZmY4Myk7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCwgMHhmMGZmZmY4Mik7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCwgMHhmMGZmZmY4Myk7Ci0KLQkvKiBSRlNXIENvbnRyb2wgKi8KLQkvKiAweDgwNFsxNF09IDAgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByRlBHQTBfVHhJbmZvLCAweDAwMDAwMDAzKTsKLQkvKiAweDg3MFs2OjVdPSBiJzExICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgckZQR0EwX1hBQl9SRkludGVyZmFjZVNXLCAweDA3MDAwNzYwKTsKLQkvKiAweDg2MFs2OjVdPSBiJzAwICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIDB4NjZGNjAyMTApOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6IDB4ODcwID0gdmFsdWUgMHgleFxuIiwgX19mdW5jX18sCi0JCSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIDB4ODcwKSk7Ci0KLQkvKiAgKi8KLQkvKiAgSm9zZXBoIE5vdGU6IEtlZXAgUmZSZWdDaG5sVmFsIGZvciBsYXRlciB1c2UuICovCi0JLyogICovCi0JcEhhbERhdGEtPlJmUmVnQ2hubFZhbFswXSA9IFBIWV9RdWVyeVJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQSwKLQkJCQkJCSAgIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzayk7Ci0JcEhhbERhdGEtPlJmUmVnQ2hubFZhbFsxXSA9IFBIWV9RdWVyeVJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQiwKLQkJCQkJCSAgIFJGX0NITkxCVywgYlJGUmVnT2Zmc2V0TWFzayk7Ci0KLQlpZiAoIW1hY19vbikgewotCQlfSW5pdFF1ZXVlUmVzZXJ2ZWRQYWdlKEFkYXB0ZXIpOwotCQlfSW5pdFR4QnVmZmVyQm91bmRhcnkoQWRhcHRlcik7Ci0JfQotCV9Jbml0UXVldWVQcmlvcml0eShBZGFwdGVyKTsKLQlfSW5pdFBhZ2VCb3VuZGFyeShBZGFwdGVyKTsKLQlfSW5pdFRyYW5zZmVyUGFnZVNpemUoQWRhcHRlcik7Ci0KLQkvKiAgR2V0IFJ4IFBIWSBzdGF0dXMgaW4gb3JkZXIgdG8gcmVwb3J0IFJTU0kgYW5kIG90aGVycy4gKi8KLQlfSW5pdERyaXZlckluZm9TaXplKEFkYXB0ZXIsIERSVklORk9fU1opOwotCi0JX0luaXRJbnRlcnJ1cHQoQWRhcHRlcik7Ci0JaHdfdmFyX3NldF9tYWNhZGRyKEFkYXB0ZXIsIEFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIpOwotCXJ0bDg3MjNhX3NldF9tZWRpYV9zdGF0dXMoQWRhcHRlciwgTVNSX0lORlJBKTsKLQlfSW5pdFdNQUNTZXR0aW5nKEFkYXB0ZXIpOwotCV9Jbml0QWRhcHRpdmVDdHJsKEFkYXB0ZXIpOwotCV9Jbml0RURDQShBZGFwdGVyKTsKLQlfSW5pdFJhdGVGYWxsYmFjayhBZGFwdGVyKTsKLQlfSW5pdFJldHJ5RnVuY3Rpb24oQWRhcHRlcik7Ci0JcnRsODcyM2FfSW5pdEJlYWNvblBhcmFtZXRlcnMoQWRhcHRlcik7Ci0KLQlfQkJUdXJuT25CbG9jayhBZGFwdGVyKTsKLQkvKiBOaWNJRlNldE1hY0FkZHJlc3MocGFkYXB0ZXIsIHBhZGFwdGVyLT5QZXJtYW5lbnRBZGRyZXNzKTsgKi8KLQotCXJ0bDg3MjNhX2NhbV9pbnZhbGlkYXRlX2FsbChBZGFwdGVyKTsKLQotCS8qICAyMDEwLzEyLzE3IE1IIFdlIG5lZWQgdG8gc2V0IFRYIHBvd2VyIGFjY29yZGluZyB0byBFRlVTRSBjb250ZW50IGF0IGZpcnN0LiAqLwotCVBIWV9TZXRUeFBvd2VyTGV2ZWw4NzIzQShBZGFwdGVyLCBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWwpOwotCi0JcnRsODcyM2FfSW5pdEFudGVubmFfU2VsZWN0aW9uKEFkYXB0ZXIpOwotCi0JLyogIEhXIFNFUSBDVFJMICovCi0JLyogc2V0IDB4MCB0byAweEZGIGJ5IHR5bmxpLiBEZWZhdWx0IGVuYWJsZSBIVyBTRVEgTlVNLiAqLwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX0hXU0VRX0NUUkwsIDB4RkYpOwotCi0JLyogICovCi0JLyogIERpc2FibGUgQkFSLCBzdWdnZXN0ZWQgYnkgU2NvdHQgKi8KLQkvKiAgMjAxMC4wNC4wOSBhZGQgYnkgaHBmYW4gKi8KLQkvKiAgKi8KLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfQkFSX01PREVfQ1RSTCwgMHgwMjAxZmZmZik7Ci0KLQlpZiAocHJlZ2lzdHJ5cHJpdi0+d2lmaV9zcGVjKQotCQlydGw4NzIzYXVfd3JpdGUxNihBZGFwdGVyLCBSRUdfRkFTVF9FRENBX0NUUkwsIDApOwotCi0JLyogIE1vdmUgYnkgTmVvIGZvciBVU0IgU1MgZnJvbSBhYm92ZSBzZXRwICovCi0JX1JmUG93ZXJTYXZlKEFkYXB0ZXIpOwotCi0JLyogIDIwMTAvMDgvMjYgTUggTWVyZ2UgZnJvbSA4MTkyQ0UuICovCi0JLyogc2hlcnJ5IG1hc2tlZCB0aGF0IGl0IGhhcyBiZWVuIGRvbmUgaW4gX1JmUG93ZXJTYXZlICovCi0JLyogMjAxMTA5MjcgKi8KLQkvKiByZWNvdmVyeSBmb3IgODE5MmN1IGFuZCA5NzIzQXUgMjAxMTEwMTcgKi8KLQlpZiAocHdyY3RybHByaXYtPnJmX3B3cnN0YXRlID09IHJmX29uKSB7Ci0JCWlmIChwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkKSB7Ci0JCQlydGw4NzIzYV9waHlfaXFfY2FsaWJyYXRlKEFkYXB0ZXIsIHRydWUpOwotCQl9IGVsc2UgewotCQkJcnRsODcyM2FfcGh5X2lxX2NhbGlicmF0ZShBZGFwdGVyLCBmYWxzZSk7Ci0JCQlwSGFsRGF0YS0+YklRS0luaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCi0JCXJ0bDg3MjNhX29kbV9jaGVja190eF9wb3dlcl90cmFja2luZyhBZGFwdGVyKTsKLQotCQlydGw4NzIzYV9waHlfbGNfY2FsaWJyYXRlKEFkYXB0ZXIpOwotCi0JCXJ0bDg3MjNhX2R1YWxfYW50ZW5uYV9kZXRlY3Rpb24oQWRhcHRlcik7Ci0JfQotCi0JLyogZml4ZWQgVVNCIGludGVyZmFjZSBpbnRlcmZlcmVuY2UgaXNzdWUgKi8KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4ZmU0MCwgMHhlMCk7Ci0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweGZlNDEsIDB4OGQpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhmZTQyLCAweDgwKTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCAweDIwYywgMHhmZDAzMjApOwotCS8qIFNvbHZlIHRvbyBtYW55IHByb3RvY29sIGVycm9yIG9uIFVTQiBidXMgKi8KLQlpZiAoIUlTXzgxeHhDX1ZFTkRPUl9VTUNfQV9DVVQocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKLQkJLyogIDB4RTYgPSAweDk0ICovCi0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQwLCAweEU2KTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDEsIDB4OTQpOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MiwgMHg4MCk7Ci0KLQkJLyogIDB4RTAgPSAweDE5ICovCi0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQwLCAweEUwKTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDEsIDB4MTkpOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MiwgMHg4MCk7Ci0KLQkJLyogIDB4RTUgPSAweDkxICovCi0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQwLCAweEU1KTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDEsIDB4OTEpOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MiwgMHg4MCk7Ci0KLQkJLyogIDB4RTIgPSAweDgxICovCi0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgMHhGRTQwLCAweEUyKTsKLQkJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCAweEZFNDEsIDB4ODEpOwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4RkU0MiwgMHg4MCk7Ci0KLQl9Ci0KLS8qCV9Jbml0UEFCaWFzKEFkYXB0ZXIpOyAqLwotCi0JLyogIEluaXQgQlQgaHcgY29uZmlnLiAqLwotCXJ0bDg3MjNhX0JUX2luaXRfaHdjb25maWcoQWRhcHRlcik7Ci0KLQlydGw4NzIzYV9Jbml0SGFsRG0oQWRhcHRlcik7Ci0KLQl2YWw4ID0gRElWX1JPVU5EX1VQKFdpRmlOYXZVcHBlclVzLCBIQUxfODcyM0FfTkFWX1VQUEVSX1VOSVQpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX05BVl9VUFBFUiwgdmFsOCk7Ci0KLQkvKiAgMjAxMS8wMy8wOSBNSCBkZWJ1ZyBvbmx5LCBVTUMtQiBjdXQgcGFzcyAyNTAwIFM1IHRlc3QsIGJ1dCB3ZSBuZWVkIHRvIGZpbiByb290IGNhdXNlLiAqLwotCWlmICgoKHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgckZQR0EwX1JGTU9EKSAmIDB4RkYwMDAwMDApICE9Ci0JICAgICAweDgzMDAwMDAwKSkgewotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1JGTU9ELCBCSVQoMjQpLCAxKTsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6IElRSyBmYWlsIHJlY292ZXJcbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQkvKiBhY2sgZm9yIHhtaXQgbWdtdCBmcmFtZXMuICovCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwsCi0JCQkgIHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgUkVHX0ZXSFdfVFhRX0NUUkwpfEJJVCgxMikpOwotCi1leGl0OgotCWlmIChzdGF0dXMgPT0gX1NVQ0NFU1MpIHsKLQkJQWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQgPSB0cnVlOwotCi0JCWlmIChBZGFwdGVyLT5yZWdpc3RyeXByaXYubm90Y2hfZmlsdGVyID09IDEpCi0JCQlydGw4NzIzYV9ub3RjaF9maWx0ZXIoQWRhcHRlciwgMSk7Ci0JfQotCi0JREJHXzg3MjNBKCIlcyBpbiAlZG1zXG4iLCBfX2Z1bmNfXywKLQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBpbml0X3N0YXJ0X3RpbWUpKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBwaHlfU3NQd3JTd2l0Y2g5MkNVKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCQllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIGVSRlBvd2VyU3RhdGUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQl1OCBzcHMwOwotCi0Jc3BzMCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfU1BTMF9DVFJMKTsKLQotCXN3aXRjaCAoZVJGUG93ZXJTdGF0ZSkgewotCWNhc2UgcmZfb246Ci0JCS8qICAxLiBFbmFibGUgTUFDIENsb2NrLiBDYW4gbm90IGJlIGVuYWJsZWQgbm93LiAqLwotCQkvKiBXcml0ZVhCWVRFKFJFR19TWVNfQ0xLUisxLAotCQkgICBSZWFkWEJZVEUoUkVHX1NZU19DTEtSKzEpIHwgQklUKDMpKTsgKi8KLQotCQkvKiAgMi4gRm9yY2UgUFdNLCBFbmFibGUgU1BTMThfTERPX01hcmNvX0Jsb2NrICovCi0JCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1NQUzBfQ1RSTCwKLQkJCQkgc3BzMCB8IEJJVCgwKSB8IEJJVCgzKSk7Ci0KLQkJLyogIDMuIHJlc3RvcmUgQkIsIEFGRSBjb250cm9sIHJlZ2lzdGVyLiAqLwotCQkvKiBSRiAqLwotCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzJUMlIpCi0JCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1hBQl9SRlBhcmFtZXRlciwKLQkJCQkgICAgIDB4MzgwMDM4LCAxKTsKLQkJZWxzZQotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIsCi0JCQkJICAgICAweDM4LCAxKTsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweGYwLCAxKTsKLQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgQklUKDEpLCAwKTsKLQotCQkvKiBBRkUgKi8KLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKQotCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgclJ4X1dhaXRfQ0NBLCAweDYzREIyNUEwKTsKLQkJZWxzZSBpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzFUMVIpCi0JCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIDB4NjMxQjI1QTApOwotCi0JCS8qICA0LiBpc3N1ZSAzLXdpcmUgY29tbWFuZCB0aGF0IFJGIHNldCB0byBSeCBpZGxlCi0JCSAgICBtb2RlLiBUaGlzIGlzIHVzZWQgdG8gcmUtd3JpdGUgdGhlIFJYIGlkbGUgbW9kZS4gKi8KLQkJLyogIFdlIGNhbiBvbmx5IHBydmlkZSBhIHVzdWFsIHZhbHVlIGluc3RlYWQgYW5kIHRoZW4KLQkJICAgIEhXIHdpbGwgbW9kaWZ5IHRoZSB2YWx1ZSBieSBpdHNlbGYuICovCi0JCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0FDLAotCQkJICAgICBiUkZSZWdPZmZzZXRNYXNrLCAweDMyRDk1KTsKLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKSB7Ci0JCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9CLCBSRl9BQywKLQkJCQkgICAgIGJSRlJlZ09mZnNldE1hc2ssIDB4MzJEOTUpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgcmZfc2xlZXA6Ci0JY2FzZSByZl9vZmY6Ci0JCWlmIChJU184MXh4Q19WRU5ET1JfVU1DX0JfQ1VUKHBIYWxEYXRhLT5WZXJzaW9uSUQpKQotCQkJc3BzMCAmPSB+QklUKDApOwotCQllbHNlCi0JCQlzcHMwICY9IH4oQklUKDApIHwgQklUKDMpKTsKLQotCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sICJTUyBMVkwxXG4iKTsKLQkJLyogIERpc2FibGUgUkYgYW5kIEJCIG9ubHkgZm9yIFNlbGVjdFN1c3BlbmQuICovCi0KLQkJLyogIDEuIFNldCBCQi9SRiB0byBzaHV0ZG93bi4gKi8KLQkJLyoJKDEpIFJlZzg3OFs1OjNdPSAwCVJGIHJ4X2NvZGUgZm9yCi0JCQkJCQlwcmVhbWJsZSBwb3dlciBzYXZpbmcgKi8KLQkJLyoJKDIpUmVnODc4WzIxOjE5XT0gMAlUdXJuIG9mZiBSRi1CICovCi0JCS8qCSgzKSBSZWdDMDRbNzo0XT0gMAlUdXJuIG9mZiBhbGwgcGF0aHMKLQkJCQkJCWZvciBwYWNrZXQgZGV0ZWN0aW9uICovCi0JCS8qCSg0KSBSZWc4MDBbMV0gPSAxCWVuYWJsZSBwcmVhbWJsZSBwb3dlciBzYXZpbmcgKi8KLQkJQWRhcHRlci0+cHdyY3RybHByaXYuUFNfQkJSZWdCYWNrdXBbUFNCQlJFR19SRjBdID0KLQkJCXJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgckZQR0EwX1hBQl9SRlBhcmFtZXRlcik7Ci0JCUFkYXB0ZXItPnB3cmN0cmxwcml2LlBTX0JCUmVnQmFja3VwW1BTQkJSRUdfUkYxXSA9Ci0JCQlydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlKTsKLQkJQWRhcHRlci0+cHdyY3RybHByaXYuUFNfQkJSZWdCYWNrdXBbUFNCQlJFR19SRjJdID0KLQkJCXJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgckZQR0EwX1JGTU9EKTsKLQkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKQotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIsCi0JCQkJICAgICAweDM4MDAzOCwgMCk7Ci0JCWVsc2UgaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8xVDFSKQotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIsIDB4MzgsIDApOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1RSeFBhdGhFbmFibGUsIDB4ZjAsIDApOwotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1JGTU9ELCBCSVQoMSksIDEpOwotCi0JCS8qICAyIC5BRkUgY29udHJvbCByZWdpc3RlciB0byBwb3dlciBkb3duLiBiaXRbMzA6MjJdICovCi0JCUFkYXB0ZXItPnB3cmN0cmxwcml2LlBTX0JCUmVnQmFja3VwW1BTQkJSRUdfQUZFMF0gPQotCQkJcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByUnhfV2FpdF9DQ0EpOwotCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzJUMlIpCi0JCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIDB4MDBEQjI1QTApOwotCQllbHNlIGlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSAgUkZfMVQxUikKLQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJSeF9XYWl0X0NDQSwgMHgwMDFCMjVBMCk7Ci0KLQkJLyogIDMuIGlzc3VlIDMtd2lyZSBjb21tYW5kIHRoYXQgUkYgc2V0IHRvIHBvd2VyIGRvd24uKi8KLQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQSwgUkZfQUMsIGJSRlJlZ09mZnNldE1hc2ssIDApOwotCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzJUMlIpCi0JCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9CLCBSRl9BQywKLQkJCQkgICAgIGJSRlJlZ09mZnNldE1hc2ssIDApOwotCi0JCS8qICA0LiBGb3JjZSBQRk0gLCBkaXNhYmxlIFNQUzE4X0xET19NYXJjb19CbG9jayAqLwotCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19TUFMwX0NUUkwsIHNwczApOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIENhcmREaXNhYmxlUlRMODcyM1Uoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXU4CQl1MWJUbXA7Ci0KLQlEQkdfODcyM0EoIkNhcmREaXNhYmxlUlRMODcyM1VcbiIpOwotCS8qICBVU0ItTUYgQ2FyZCBEaXNhYmxlIEZsb3cgKi8KLQkvKiAgMS4gUnVuIExQUyBXTCBSRk9GRiBmbG93ICovCi0JSGFsUHdyU2VxQ21kUGFyc2luZzIzYShBZGFwdGVyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywKLQkJCSAgICBQV1JfSU5URl9VU0JfTVNLLCBydGw4NzIzQVVfZW50ZXJfbHBzX2Zsb3cpOwotCi0JLyogIDIuIDB4MUZbNzowXSA9IDAJCXR1cm4gb2ZmIFJGICovCi0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfUkZfQ1RSTCwgMHgwMCk7Ci0KLQkvKgk9PT09IFJlc2V0IGRpZ2l0YWwgc2VxdWVuY2UgICA9PT09PT0gKi8KLQlpZiAoKHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfTUNVRldETCkgJiBCSVQoNykpICYmCi0JICAgIEFkYXB0ZXItPmJGV1JlYWR5KSAvKiA4MDUxIFJBTSBjb2RlICovCi0JCXJ0bDg3MjNhX0Zpcm13YXJlU2VsZlJlc2V0KEFkYXB0ZXIpOwotCi0JLyogIFJlc2V0IE1DVS4gU3VnZ2VzdGVkIGJ5IEZpbGVuLiAyMDExLjAxLjI2LiBieSB0eW5saS4gKi8KLQl1MWJUbXAgPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKzEpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKzEsIHUxYlRtcCAmIH5CSVQoMikpOwotCi0JLyogIGcuCU1DVUZXREwgMHg4MFsxOjBdPSAwCQlyZXNldCBNQ1UgcmVhZHkgc3RhdHVzICovCi0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfTUNVRldETCwgMHgwMCk7Ci0KLQkvKgk9PT09IFJlc2V0IGRpZ2l0YWwgc2VxdWVuY2UgZW5kID09PT09PSAqLwotCS8qICBDYXJkIGRpc2FibGUgcG93ZXIgYWN0aW9uIGZsb3cgKi8KLQlIYWxQd3JTZXFDbWRQYXJzaW5nMjNhKEFkYXB0ZXIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLAotCQkJICAgICAgIFBXUl9JTlRGX1VTQl9NU0ssCi0JCQkgICAgICAgcnRsODcyM0FVX2NhcmRfZGlzYWJsZV9mbG93KTsKLQotCS8qICBSZXNldCBNQ1UgSU8gV3JhcHBlciwgYWRkZWQgYnkgUm9nZXIsIDIwMTEuMDguMzAuICovCi0JdTFiVG1wID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR19SU1ZfQ1RSTCArIDEpOwotCXJ0bDg3MjNhdV93cml0ZTgoQWRhcHRlciwgUkVHX1JTVl9DVFJMKzEsIHUxYlRtcCAmIH5CSVQoMCkpOwotCXUxYlRtcCA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBSRUdfUlNWX0NUUkwgKyAxKTsKLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19SU1ZfQ1RSTCsxLCB1MWJUbXAgfCBCSVQoMCkpOwotCi0JLyogIDcuIFJTVl9DVFJMIDB4MUNbNzowXSA9IDB4MEUgIGxvY2sgSVNPL0NMSy9Qb3dlciBjb250cm9sIHJlZ2lzdGVyICovCi0JcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfUlNWX0NUUkwsIDB4MGUpOwotfQotCi1pbnQgcnRsODcyM2F1X2hhbF9kZWluaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlEQkdfODcyM0EoIj09PiAlc1xuIiwgX19mdW5jX18pOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi0JQlRfSGFsdFByb2Nlc3MocGFkYXB0ZXIpOwotI2VuZGlmCi0JLyogIDIwMTEvMDIvMTggVG8gRml4IFJVIExOQSAgcG93ZXIgbGVha2FnZSBwcm9ibGVtLiBXZSBuZWVkIHRvCi0JICAgIGV4ZWN1dGUgYmVsb3cgYmVsb3cgaW4gQWRhcHRlciBpbml0IGFuZCBoYWx0IHNlcXVlbmNlLgotCSAgICBBY2NvcmRpbmcgdG8gRUVjaG91J3Mgb3Bpbmlvbiwgd2UgY2FuIGVuYWJsZSB0aGUgYWJpbGl0eSBmb3IgYWxsICovCi0JLyogIElDLiBBY2NvcmQgdG8gam9obm55J3Mgb3Bpbmlvbiwgb25seSBSVSBuZWVkIHRoZSBzdXBwb3J0LiAqLwotCUNhcmREaXNhYmxlUlRMODcyM1UocGFkYXB0ZXIpOwotCi0JcGFkYXB0ZXItPmh3X2luaXRfY29tcGxldGVkID0gZmFsc2U7Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLWludCBydGw4NzIzYXVfaW5pcnBfaW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JdTggaTsKLQlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOwotCWludCBzdGF0dXM7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJkFkYXB0ZXItPnJlY3Zwcml2OwotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlzdGF0dXMgPSBfU1VDQ0VTUzsKLQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAiPT09PiB1c2JfaW5pcnBfaW5pdFxuIik7Ci0KLQkvKiBpc3N1ZSBSeCBpcnAgdG8gcmVjZWl2ZSBkYXRhICovCi0JcHJlY3ZidWYgPSAoc3RydWN0IHJlY3ZfYnVmICopcHJlY3Zwcml2LT5wcmVjdl9idWY7Ci0JZm9yIChpID0gMDsgaSA8IE5SX1JFQ1ZCVUZGOyBpKyspIHsKLQkJaWYgKHJ0bDg3MjNhdV9yZWFkX3BvcnQoQWRhcHRlciwgMCwgcHJlY3ZidWYpID09IF9GQUlMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAidXNiX3J4X2luaXQ6IHVzYl9yZWFkX3BvcnQgZXJyb3JcbiIpOwotCQkJc3RhdHVzID0gX0ZBSUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJcHJlY3ZidWYrKzsKLQl9Ci0JaWYgKHJ0bDg3MjNhdV9yZWFkX2ludGVycnVwdChBZGFwdGVyKSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICIlczogdXNiX3JlYWRfaW50ZXJydXB0IGVycm9yXG4iLCBfX2Z1bmNfXyk7Ci0JCXN0YXR1cyA9IF9GQUlMOwotCX0KLQlwSGFsRGF0YS0+SW50ck1hc2tbMF0gPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIFJFR19VU0JfSElNUik7Ci0JTVNHXzg3MjNBKCJwSGFsRGF0YS0+SW50ck1hc2sgPSAweCUwNHhcbiIsIHBIYWxEYXRhLT5JbnRyTWFza1swXSk7Ci0JcEhhbERhdGEtPkludHJNYXNrWzBdIHw9IFVISU1SX0MySENNRHxVSElNUl9DUFdNOwotCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19VU0JfSElNUiwgcEhhbERhdGEtPkludHJNYXNrWzBdKTsKLWV4aXQ6Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAiPD09PSB1c2JfaW5pcnBfaW5pdFxuIik7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotaW50IHJ0bDg3MjNhdV9pbmlycF9kZWluaXQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICI9PT0+IHVzYl9yeF9kZWluaXRcbiIpOwotCXJ0bDg3MjNhdV9yZWFkX3BvcnRfY2FuY2VsKEFkYXB0ZXIpOwotCXBIYWxEYXRhLT5JbnRyTWFza1swXSA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgUkVHX1VTQl9ISU1SKTsKLQlNU0dfODcyM0EoIiVzIHBIYWxEYXRhLT5JbnRyTWFzayA9IDB4JTA0eFxuIiwgX19mdW5jX18sCi0JCSAgcEhhbERhdGEtPkludHJNYXNrWzBdKTsKLQlwSGFsRGF0YS0+SW50ck1hc2tbMF0gPSAweDA7Ci0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX1VTQl9ISU1SLCBwSGFsRGF0YS0+SW50ck1hc2tbMF0pOwotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgIjw9PT0gdXNiX3J4X2RlaW5pdFxuIik7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBfUmVhZEJvYXJkVHlwZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4ICpQUk9NQ29udGVudCwKLQkJCSAgIGJvb2wgQXV0b2xvYWRGYWlsKQotewotCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7Ci0JdTggYm9hcmRUeXBlID0gQk9BUkRfVVNCX0RPTkdMRTsKLQotCWlmIChBdXRvbG9hZEZhaWwpIHsKLQkJaWYgKElTXzg3MjNfU0VSSUVTKHBIYWxEYXRhLT5WZXJzaW9uSUQpKQotCQkJcEhhbERhdGEtPnJmX3R5cGUgPSBSRl8xVDFSOwotCQllbHNlCi0JCQlwSGFsRGF0YS0+cmZfdHlwZSA9IFJGXzJUMlI7Ci0JCXBIYWxEYXRhLT5Cb2FyZFR5cGUgPSBib2FyZFR5cGU7Ci0JCXJldHVybjsKLQl9Ci0KLQlib2FyZFR5cGUgPSBQUk9NQ29udGVudFtFRVBST01fTk9STUFMX0JvYXJkVHlwZV07Ci0JYm9hcmRUeXBlICY9IEJPQVJEX1RZUEVfTk9STUFMX01BU0s7LyogYml0Wzc6NV0gKi8KLQlib2FyZFR5cGUgPj49IDU7Ci0KLQlwSGFsRGF0YS0+Qm9hcmRUeXBlID0gYm9hcmRUeXBlOwotCU1TR184NzIzQSgiX1JlYWRCb2FyZFR5cGUoJXgpXG4iLCBwSGFsRGF0YS0+Qm9hcmRUeXBlKTsKLQotCWlmIChib2FyZFR5cGUgPT0gQk9BUkRfVVNCX0hpZ2hfUEEpCi0JCXBIYWxEYXRhLT5FeHRlcm5hbFBBID0gMTsKLX0KLQotc3RhdGljIHZvaWQgSGFsX0VmdXNlUGFyc2VNQUNBZGRyXzg3MjNBVShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQkgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpCi17Ci0JdTE2IGk7Ci0JdTggc01hY0FkZHJbRVRIX0FMRU5dID0gezB4MDAsIDB4RTAsIDB4NEMsIDB4ODcsIDB4MjMsIDB4MDB9OwotCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihwYWRhcHRlcik7Ci0KLQlpZiAoQXV0b0xvYWRGYWlsKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0JCQlwRUVQUk9NLT5tYWNfYWRkcltpXSA9IHNNYWNBZGRyW2ldOwotCX0gZWxzZSB7Ci0JCS8qIFJlYWQgUGVybWFuZW50IE1BQyBhZGRyZXNzICovCi0JCW1lbWNweShwRUVQUk9NLT5tYWNfYWRkciwgJmh3aW5mb1tFRVBST01fTUFDX0FERFJfODcyM0FVXSwKLQkJICAgICAgIEVUSF9BTEVOKTsKLQl9Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9ub3RpY2VfLAotCQkgIkhhbF9FZnVzZVBhcnNlTUFDQWRkcl84NzIzQVU6IFBlcm1hbmVudCBBZGRyZXNzID0lcE1cbiIsCi0JCSBwRUVQUk9NLT5tYWNfYWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlYWRBZGFwdGVySW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBlZXByb21fcHJpdiAqcEVFUFJPTSA9IEdFVF9FRVBST01fRUZVU0VfUFJJVihwYWRhcHRlcik7Ci0JLyogc3RydWN0IGhhbF9kYXRhXzg3MjNhICogcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocGFkYXB0ZXIpOyAqLwotCXU4IGh3aW5mb1tIV1NFVF9NQVhfU0laRV07Ci0KLQlIYWxfSW5pdFBHRGF0YShwYWRhcHRlciwgaHdpbmZvKTsKLQlIYWxfRWZ1c2VQYXJzZUlEQ29kZShwYWRhcHRlciwgaHdpbmZvKTsKLQlIYWxfRWZ1c2VQYXJzZUVFUFJPTVZlcihwYWRhcHRlciwgaHdpbmZvLAotCQkJCXBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCUhhbF9FZnVzZVBhcnNlTUFDQWRkcl84NzIzQVUocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQkgICAgIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCUhhbF9FZnVzZVBhcnNldHhwb3dlcmluZm9fODcyM0EocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQkJcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyk7Ci0JX1JlYWRCb2FyZFR5cGUocGFkYXB0ZXIsIGh3aW5mbywgcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyk7Ci0JSGFsX0VmdXNlUGFyc2VCVENvZXhpc3RJbmZvXzg3MjNBKHBhZGFwdGVyLCBod2luZm8sCi0JCQkJCSAgcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyk7Ci0KLQlydGw4NzIzYV9FZnVzZVBhcnNlQ2hubFBsYW4ocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQkgICAgcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyk7Ci0JSGFsX0VmdXNlUGFyc2VUaGVybWFsTWV0ZXJfODcyM0EocGFkYXB0ZXIsIGh3aW5mbywKLQkJCQkJIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotLyoJX1JlYWRSRlNldHRpbmcoQWRhcHRlciwgUFJPTUNvbnRlbnQsIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOyAqLwotLyoJX1JlYWRQU1NldHRpbmcoQWRhcHRlciwgUFJPTUNvbnRlbnQsIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOyAqLwotCUhhbF9FZnVzZVBhcnNlQW50ZW5uYURpdmVyc2l0eShwYWRhcHRlciwgaHdpbmZvLAotCQkJCSAgICAgICBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsKLQotCUhhbF9FZnVzZVBhcnNlRUVQUk9NVmVyKHBhZGFwdGVyLCBod2luZm8sIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCUhhbF9FZnVzZVBhcnNlQ3VzdG9tZXJJRChwYWRhcHRlciwgaHdpbmZvLAotCQkJCSBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsKLQlIYWxfRWZ1c2VQYXJzZVJhdGVJbmRpY2F0aW9uT3B0aW9uKHBhZGFwdGVyLCBod2luZm8sCi0JCQkJCSAgIHBFRVBST00tPmJhdXRvbG9hZF9mYWlsX2ZsYWcpOwotCUhhbF9FZnVzZVBhcnNlWHRhbF84NzIzQShwYWRhcHRlciwgaHdpbmZvLAotCQkJCSBwRUVQUk9NLT5iYXV0b2xvYWRfZmFpbF9mbGFnKTsKLQotCS8qIGhhbF9DdXN0b21pemVkQmVoYXZpb3JfODcyM1UoQWRhcHRlcik7ICovCi0KLS8qCUFkYXB0ZXItPmJEb25nbGUgPSAoUFJPTUNvbnRlbnRbRUVQUk9NX0VBU1lfUkVQTEFDRU1FTlRdID09IDEpPyAwOiAxOyAqLwotCURCR184NzIzQSgiJXMoKTogUkVQTEFDRU1FTlQgPSAleFxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT5iRG9uZ2xlKTsKLX0KLQotc3RhdGljIHZvaWQgX1JlYWRQUk9NQ29udGVudChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGVlcHJvbV9wcml2ICpwRUVQUk9NID0gR0VUX0VFUFJPTV9FRlVTRV9QUklWKEFkYXB0ZXIpOwotCXU4IGVlVmFsdWU7Ci0KLQllZVZhbHVlID0gcnRsODcyM2F1X3JlYWQ4KEFkYXB0ZXIsIFJFR185MzQ2Q1IpOwotCS8qICBUbyBjaGVjayBzeXN0ZW0gYm9vdCBzZWxlY3Rpb24uICovCi0JcEVFUFJPTS0+RWVwcm9tT3JFZnVzZSA9IChlZVZhbHVlICYgQk9PVF9GUk9NX0VFUFJPTSkgPyB0cnVlIDogZmFsc2U7Ci0JcEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyA9IChlZVZhbHVlICYgRUVQUk9NX0VOKSA/IGZhbHNlIDogdHJ1ZTsKLQotCURCR184NzIzQSgiQm9vdCBmcm9tICVzLCBBdXRvbG9hZCAlcyAhXG4iLAotCQkgIChwRUVQUk9NLT5FZXByb21PckVmdXNlID8gIkVFUFJPTSIgOiAiRUZVU0UiKSwKLQkJICAocEVFUFJPTS0+YmF1dG9sb2FkX2ZhaWxfZmxhZyA/ICJGYWlsIiA6ICJPSyIpKTsKLQotCXJlYWRBZGFwdGVySW5mbyhBZGFwdGVyKTsKLX0KLQotLyogICovCi0vKglEZXNjcmlwdGlvbjogKi8KLS8qCQlXZSBzaG91bGQgc2V0IEVmdXNlIGNlbGwgc2VsZWN0aW9uIHRvIFdpRmkgY2VsbCBpbiBkZWZhdWx0LiAqLwotLyogICovCi0vKglBc3N1bXB0aW9uOiAqLwotLyoJCVBBU1NJVkVfTEVWRUwgKi8KLS8qICAqLwotLyoJQWRkZWQgYnkgUm9nZXIsIDIwMTAuMTEuMjMuICovCi0vKiAgKi8KLXN0YXRpYyB2b2lkIGhhbF9FZnVzZUNlbGxTZWwoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQotewotCXUzMiB2YWx1ZTMyOwotCi0JdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgRUZVU0VfVEVTVCk7Ci0JdmFsdWUzMiA9ICh2YWx1ZTMyICYgfkVGVVNFX1NFTF9NQVNLKSB8IEVGVVNFX1NFTChFRlVTRV9XSUZJX1NFTF8wKTsKLQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBFRlVTRV9URVNULCB2YWx1ZTMyKTsKLX0KLQotdm9pZCBydGw4NzIzYV9yZWFkX2FkYXB0ZXJfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7Ci0KLQkvKiAgUmVhZCBFRVBST00gc2l6ZSBiZWZvcmUgY2FsbCBhbnkgRUVQUk9NIGZ1bmN0aW9uICovCi0JQWRhcHRlci0+RWVwcm9tQWRkcmVzc1NpemUgPSBHZXRFRVBST01TaXplODcyM0EoQWRhcHRlcik7Ci0KLQlNU0dfODcyM0EoIj09PT0+IF9SZWFkQWRhcHRlckluZm84NzIzQVVcbiIpOwotCi0JaGFsX0VmdXNlQ2VsbFNlbChBZGFwdGVyKTsKLQotCV9SZWFkUFJPTUNvbnRlbnQoQWRhcHRlcik7Ci0KLQlNU0dfODcyM0EoIjw9PT09IF9SZWFkQWRhcHRlckluZm84NzIzQVUgaW4gJWQgbXNcbiIsCi0JCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKLX0KLQotLyogICovCi0vKglEZXNjcmlwdGlvbjogKi8KLS8qCQlRdWVyeSBzZXR0aW5nIG9mIHNwZWNpZmllZCB2YXJpYWJsZS4gKi8KLS8qICAqLwotaW50IEdldEhhbERlZlZhcjgxOTJDVXNiKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJCSBlbnVtIGhhbF9kZWZfdmFyaWFibGUgZVZhcmlhYmxlLCB2b2lkICpwVmFsdWUpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlpbnQgYlJlc3VsdCA9IF9TVUNDRVNTOwotCi0Jc3dpdGNoIChlVmFyaWFibGUpIHsKLQljYXNlIEhBTF9ERUZfVU5ERVJDT1JBVEVEU01PT1RIRURQV0RCOgotCQkqKChpbnQgKilwVmFsdWUpID0gcEhhbERhdGEtPmRtcHJpdi5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQkJYnJlYWs7Ci0JY2FzZSBIQUxfREVGX0lTX1NVUFBPUlRfQU5UX0RJVjoKLQkJYnJlYWs7Ci0JY2FzZSBIQUxfREVGX0NVUlJFTlRfQU5URU5OQToKLQkJYnJlYWs7Ci0JY2FzZSBIQUxfREVGX0RSVklORk9fU1o6Ci0JCSooKHUzMiAqKXBWYWx1ZSkgPSBEUlZJTkZPX1NaOwotCQlicmVhazsKLQljYXNlIEhBTF9ERUZfTUFYX1JFQ1ZCVUZfU1o6Ci0JCSooKHUzMiAqKXBWYWx1ZSkgPSBNQVhfUkVDVkJVRl9TWjsKLQkJYnJlYWs7Ci0JY2FzZSBIQUxfREVGX1JYX1BBQ0tFVF9PRkZTRVQ6Ci0JCSooKHUzMiAqKXBWYWx1ZSkgPSBSWERFU0NfU0laRSArIERSVklORk9fU1o7Ci0JCWJyZWFrOwotCWNhc2UgSEFMX0RFRl9EQkdfRFVNUF9SWFBLVDoKLQkJKigodTggKilwVmFsdWUpID0gcEhhbERhdGEtPmJEdW1wUnhQa3Q7Ci0JCWJyZWFrOwotCWNhc2UgSEFMX0RFRl9EQkdfRE1fRlVOQzoKLQkJKigodTMyICopcFZhbHVlKSA9IHBIYWxEYXRhLT5vZG1wcml2LlN1cHBvcnRBYmlsaXR5OwotCQlicmVhazsKLQljYXNlIEhXX1ZBUl9NQVhfUlhfQU1QRFVfRkFDVE9SOgotCQkqKCh1MzIgKilwVmFsdWUpID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEs7Ci0JCWJyZWFrOwotCWNhc2UgSFdfREVGX09ETV9EQkdfRkxBRzoKLQl7Ci0JCXN0cnVjdCBkbV9vZG1fdAkqcERNX09kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKLQkJcHJpbnRrKCJwRE1fT2RtLT5EZWJ1Z0NvbXBvbmVudHMgPSAweCVsbHhcbiIsCi0JCSAgICAgICBwRE1fT2RtLT5EZWJ1Z0NvbXBvbmVudHMpOwotCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYlJlc3VsdCA9IF9GQUlMOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYlJlc3VsdDsKLX0KLQotdm9pZCBydGw4NzIzYV91cGRhdGVfcmFtYXNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgdTMyIG1hY19pZCwgdTggcnNzaV9sZXZlbCkKLXsKLQlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGE7Ci0Jc3RydWN0IEZXX1N0YV9JbmZvICpmd19zdGE7Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0Jc3RydWN0IGRtX3ByaXYgKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JdTggaW5pdF9yYXRlLCBuZXR3b3JrVHlwZSwgcmFpZCwgYXJnOwotCXUzMiBtYXNrLCByYXRlX2JpdG1hcDsKLQl1OCBzaG9ydEdJcmF0ZSA9IGZhbHNlOwotCWludCBzdXBwb3J0UmF0ZU51bTsKLQotCWlmIChtYWNfaWQgPj0gTlVNX1NUQSkgLyogQ0FNX1NJWkUgKi8KLQkJcmV0dXJuOwotCi0JcHN0YSA9IHBtbG1laW5mby0+Rldfc3RhX2luZm9bbWFjX2lkXS5wc3RhOwotCWlmIChwc3RhID09IE5VTEwpCi0JCXJldHVybjsKLQotCXN3aXRjaCAobWFjX2lkKSB7Ci0JY2FzZSAwOi8qICBmb3IgaW5mcmEgbW9kZSAqLwotCQlzdXBwb3J0UmF0ZU51bSA9Ci0JCQlydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcyk7Ci0JCW5ldHdvcmtUeXBlID0ganVkZ2VfbmV0d29ya190eXBlMjNhKHBhZGFwdGVyLAotCQkJCQkJIGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkJCSBzdXBwb3J0UmF0ZU51bSkgJiAweGY7Ci0JCS8qIHBtbG1lZXh0LT5jdXJfd2lyZWxlc3NfbW9kZSA9IG5ldHdvcmtUeXBlOyAqLwotCQlyYWlkID0gbmV0d29ya3R5cGVfdG9fcmFpZDIzYShuZXR3b3JrVHlwZSk7Ci0KLQkJbWFzayA9IHVwZGF0ZV9zdXBwb3J0ZWRfcmF0ZTIzYShjdXJfbmV0d29yay0+U3VwcG9ydGVkUmF0ZXMsCi0JCQkJCSAgICAgc3VwcG9ydFJhdGVOdW0pOwotCQltYXNrIHw9IChwbWxtZWluZm8tPkhUX2VuYWJsZSkgPwotCQkJdXBkYXRlX01TQ19yYXRlMjNhKCZwbWxtZWluZm8tPmh0X2NhcCkgOiAwOwotCi0JCWlmIChzdXBwb3J0X3Nob3J0X0dJMjNhKHBhZGFwdGVyLCAmcG1sbWVpbmZvLT5odF9jYXApKQotCQkJc2hvcnRHSXJhdGUgPSB0cnVlOwotCQlicmVhazsKLQotCWNhc2UgMTovKiBmb3IgYnJvYWRjYXN0L211bHRpY2FzdCAqLwotCQlmd19zdGEgPSAmcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdOyAKLQkJc3VwcG9ydFJhdGVOdW0gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKGZ3X3N0YS0+U3VwcG9ydGVkUmF0ZXMpOwotCQlpZiAocG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFCKQotCQkJbmV0d29ya1R5cGUgPSBXSVJFTEVTU18xMUI7Ci0JCWVsc2UKLQkJCW5ldHdvcmtUeXBlID0gV0lSRUxFU1NfMTFHOwotCQlyYWlkID0gbmV0d29ya3R5cGVfdG9fcmFpZDIzYShuZXR3b3JrVHlwZSk7Ci0KLQkJbWFzayA9IHVwZGF0ZV9iYXNpY19yYXRlMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkJIHN1cHBvcnRSYXRlTnVtKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OiAvKiBmb3IgZWFjaCBzdGEgaW4gSUJTUyAqLwotCQlmd19zdGEgPSAmcG1sbWVpbmZvLT5GV19zdGFfaW5mb1ttYWNfaWRdOyAKLQkJc3VwcG9ydFJhdGVOdW0gPSBydHdfZ2V0X3JhdGVzZXRfbGVuMjNhKGZ3X3N0YS0+U3VwcG9ydGVkUmF0ZXMpOwotCQluZXR3b3JrVHlwZSA9IGp1ZGdlX25ldHdvcmtfdHlwZTIzYShwYWRhcHRlciwKLQkJCQkJCSAgICBmd19zdGEtPlN1cHBvcnRlZFJhdGVzLAotCQkJCQkJICAgIHN1cHBvcnRSYXRlTnVtKSAmIDB4ZjsKLQkJLyogcG1sbWVleHQtPmN1cl93aXJlbGVzc19tb2RlID0gbmV0d29ya1R5cGU7ICovCi0JCXJhaWQgPSBuZXR3b3JrdHlwZV90b19yYWlkMjNhKG5ldHdvcmtUeXBlKTsKLQotCQltYXNrID0gdXBkYXRlX3N1cHBvcnRlZF9yYXRlMjNhKGN1cl9uZXR3b3JrLT5TdXBwb3J0ZWRSYXRlcywKLQkJCQkJCXN1cHBvcnRSYXRlTnVtKTsKLQotCQkvKiB0b2RvOiBzdXBwb3J0IEhUIGluIElCU1MgKi8KLQkJYnJlYWs7Ci0JfQotCi0JLyogbWFzayAmPSAweDBmZmZmZmZmOyAqLwotCXJhdGVfYml0bWFwID0gT0RNX0dldF9SYXRlX0JpdG1hcDIzYShwSGFsRGF0YSwgbWFjX2lkLCBtYXNrLAotCQkJCQkgICAgIHJzc2lfbGV2ZWwpOwotCURCR184NzIzQSgiJXMgPT4gbWFjX2lkOiVkLCBuZXR3b3JrVHlwZToweCUwMngsICIKLQkJICAibWFzazoweCUwOHhcblx0ID09PiByc3NpX2xldmVsOiVkLCByYXRlX2JpdG1hcDoweCUwOHhcbiIsCi0JCSAgX19mdW5jX18sIG1hY19pZCwgbmV0d29ya1R5cGUsIG1hc2ssIHJzc2lfbGV2ZWwsIHJhdGVfYml0bWFwKTsKLQotCW1hc2sgJj0gcmF0ZV9iaXRtYXA7Ci0JbWFzayB8PSAoKHJhaWQgPDwgMjgpICYgMHhmMDAwMDAwMCk7Ci0KLQlpbml0X3JhdGUgPSBnZXRfaGlnaGVzdF9yYXRlX2lkeDIzYShtYXNrKSAmIDB4M2Y7Ci0KLQlhcmcgPSBtYWNfaWQgJiAweDFmOy8qIE1BQ0lEICovCi0JYXJnIHw9IEJJVCg3KTsKLQotCWlmIChzaG9ydEdJcmF0ZSA9PSB0cnVlKQotCQlhcmcgfD0gQklUKDUpOwotCi0JREJHXzg3MjNBKCJ1cGRhdGUgcmFpZCBlbnRyeSwgbWFzayA9IDB4JXgsIGFyZyA9IDB4JXhcbiIsIG1hc2ssIGFyZyk7Ci0KLQlydGw4NzIzYV9zZXRfcmFpZF9jbWQocGFkYXB0ZXIsIG1hc2ssIGFyZyk7Ci0KLQkvKiBzZXQgcmFfaWQgKi8KLQlwc3RhLT5yYWlkID0gcmFpZDsKLQlwc3RhLT5pbml0X3JhdGUgPSBpbml0X3JhdGU7Ci0KLQkvKiBzZXQgY29ycmVjdCBpbml0aWFsIGRhdGUgcmF0ZSBmb3IgZWFjaCBtYWNfaWQgKi8KLQlwZG1wcml2LT5JTklEQVRBX1JBVEVbbWFjX2lkXSA9IGluaXRfcmF0ZTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9vcHNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9vcHNfbGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4MWZmNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2Jfb3BzX2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9IQ0lfT1BTX09TX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotI2luY2x1ZGUgPHVzYl9vcHMuaD4KLSNpbmNsdWRlIDxyZWN2X29zZGVwLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfcmVjdi5oPgotCi11OCBydGw4NzIzYXVfcmVhZDgoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHBkdm9ianByaXYtPnB1c2JkZXY7Ci0JaW50IGxlbjsKLQl1OCBkYXRhOwotCi0JbXV0ZXhfbG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCWxlbiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRLCBSRUFMVEVLX1VTQl9WRU5RVF9SRUFELAotCQkJICAgICAgYWRkciwgMCwgJnBkdm9ianByaXYtPnVzYl9idWYudmFsOCwgc2l6ZW9mKGRhdGEpLAotCQkJICAgICAgUlRXX1VTQl9DT05UUk9MX01TR19USU1FT1VUKTsKLQotCWRhdGEgPSBwZHZvYmpwcml2LT51c2JfYnVmLnZhbDg7Ci0JbXV0ZXhfdW5sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotdTE2IHJ0bDg3MjNhdV9yZWFkMTYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHBkdm9ianByaXYtPnB1c2JkZXY7Ci0JaW50IGxlbjsKLQl1MTYgZGF0YTsKLQotCW11dGV4X2xvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQlsZW4gPSB1c2JfY29udHJvbF9tc2codWRldiwgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAotCQkJICAgICAgUkVBTFRFS19VU0JfVkVOUVRfQ01EX1JFUSwgUkVBTFRFS19VU0JfVkVOUVRfUkVBRCwKLQkJCSAgICAgIGFkZHIsIDAsICZwZHZvYmpwcml2LT51c2JfYnVmLnZhbDE2LCBzaXplb2YoZGF0YSksCi0JCQkgICAgICBSVFdfVVNCX0NPTlRST0xfTVNHX1RJTUVPVVQpOwotCi0JZGF0YSA9IGxlMTZfdG9fY3B1KHBkdm9ianByaXYtPnVzYl9idWYudmFsMTYpOwotCW11dGV4X3VubG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCi0JcmV0dXJuIGRhdGE7Ci19Ci0KLXUzMiBydGw4NzIzYXVfcmVhZDMyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwZHZvYmpwcml2LT5wdXNiZGV2OwotCWludCBsZW47Ci0JdTMyIGRhdGE7Ci0KLQltdXRleF9sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0JbGVuID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKLQkJCSAgICAgIFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVEsIFJFQUxURUtfVVNCX1ZFTlFUX1JFQUQsCi0JCQkgICAgICBhZGRyLCAwLCAmcGR2b2JqcHJpdi0+dXNiX2J1Zi52YWwzMiwgc2l6ZW9mKGRhdGEpLAotCQkJICAgICAgUlRXX1VTQl9DT05UUk9MX01TR19USU1FT1VUKTsKLQotCWRhdGEgPSBsZTMyX3RvX2NwdShwZHZvYmpwcml2LT51c2JfYnVmLnZhbDMyKTsKLQltdXRleF91bmxvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQotCXJldHVybiBkYXRhOwotfQotCi1pbnQgcnRsODcyM2F1X3dyaXRlOChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTggdmFsKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2ID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwZHZvYmpwcml2LT5wdXNiZGV2OwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0JcGR2b2JqcHJpdi0+dXNiX2J1Zi52YWw4ID0gdmFsOwotCi0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKLQkJCSAgICAgIFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVEsCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9XUklURSwKLQkJCSAgICAgIGFkZHIsIDAsICZwZHZvYmpwcml2LT51c2JfYnVmLnZhbDgsIHNpemVvZih2YWwpLAotCQkJICAgICAgUlRXX1VTQl9DT05UUk9MX01TR19USU1FT1VUKTsKLQotCWlmIChyZXQgIT0gc2l6ZW9mKHZhbCkpCi0JCXJldCA9IF9GQUlMOwotCWVsc2UKLQkJcmV0ID0gX1NVQ0NFU1M7Ci0KLQltdXRleF91bmxvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgcnRsODcyM2F1X3dyaXRlMTYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIsIHUxNiB2YWwpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHBkdm9ianByaXYtPnB1c2JkZXY7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJnBkdm9ianByaXYtPnVzYl92ZW5kb3JfcmVxX211dGV4KTsKLQlwZHZvYmpwcml2LT51c2JfYnVmLnZhbDE2ID0gY3B1X3RvX2xlMTYodmFsKTsKLQotCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRLAotCQkJICAgICAgUkVBTFRFS19VU0JfVkVOUVRfV1JJVEUsCi0JCQkgICAgICBhZGRyLCAwLCAmcGR2b2JqcHJpdi0+dXNiX2J1Zi52YWwxNiwgc2l6ZW9mKHZhbCksCi0JCQkgICAgICBSVFdfVVNCX0NPTlRST0xfTVNHX1RJTUVPVVQpOwotCi0JaWYgKHJldCAhPSBzaXplb2YodmFsKSkKLQkJcmV0ID0gX0ZBSUw7Ci0JZWxzZQotCQlyZXQgPSBfU1VDQ0VTUzsKLQotCW11dGV4X3VubG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydGw4NzIzYXVfd3JpdGUzMihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTMyIHZhbCkKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqcHJpdiA9IGFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcGR2b2JqcHJpdi0+cHVzYmRldjsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmcGR2b2JqcHJpdi0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCXBkdm9ianByaXYtPnVzYl9idWYudmFsMzIgPSBjcHVfdG9fbGUzMih2YWwpOwotCi0JcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKLQkJCSAgICAgIFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVEsCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9XUklURSwKLQkJCSAgICAgIGFkZHIsIDAsICZwZHZvYmpwcml2LT51c2JfYnVmLnZhbDMyLCBzaXplb2YodmFsKSwKLQkJCSAgICAgIFJUV19VU0JfQ09OVFJPTF9NU0dfVElNRU9VVCk7Ci0KLQlpZiAocmV0ICE9IHNpemVvZih2YWwpKQotCQlyZXQgPSBfRkFJTDsKLQllbHNlCi0JCXJldCA9IF9TVUNDRVNTOwotCi0JbXV0ZXhfdW5sb2NrKCZwZHZvYmpwcml2LT51c2JfdmVuZG9yX3JlcV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJ0bDg3MjNhdV93cml0ZU4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIsIHUxNiBsZW4sIHU4ICpidWYpCi17Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9ianByaXYgPSBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHBkdm9ianByaXYtPnB1c2JkZXY7Ci0JaW50IHJldDsKLQotCXJldCA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgICBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRLAotCQkJICAgICAgUkVBTFRFS19VU0JfVkVOUVRfV1JJVEUsCi0JCQkgICAgICBhZGRyLCAwLCBidWYsIGxlbiwgUlRXX1VTQl9DT05UUk9MX01TR19USU1FT1VUKTsKLQotCWlmIChyZXQgIT0gbGVuKQotCQlyZXR1cm4gX0ZBSUw7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi0vKgotICogRGVzY3JpcHRpb246Ci0gKglSZWNvZ25pemUgdGhlIGludGVycnVwdCBjb250ZW50IGJ5IHJlYWRpbmcgdGhlIGludGVycnVwdAotICoJcmVnaXN0ZXIgb3IgY29udGVudCBhbmQgbWFza2luZyBpbnRlcnJ1cHQgbWFzayAoSU1SKQotICoJaWYgaXQgaXMgb3VyIE5JQydzIGludGVycnVwdC4gQWZ0ZXIgcmVjb2duaXppbmcsIHdlIG1heSBjbGVhcgotICoJdGhlIGFsbCBpbnRlcnJ1cHRzIChJU1IpLgotICogQXJndW1lbnRzOgotICoJW2luXSBBZGFwdGVyIC0KLSAqCQlUaGUgYWRhcHRlciBjb250ZXh0LgotICoJW2luXSBwQ29udGVudCAtCi0gKgkJVW5kZXIgUENJIGludGVyZmFjZSwgdGhpcyBmaWVsZCBpcyBpZ25vcmQuCi0gKgkJVW5kZXIgVVNCIGludGVyZmFjZSwgdGhlIGNvbnRlbnQgaXMgdGhlIGludGVycnVwdAotICoJCWNvbnRlbnQgcG9pbnRlci4KLSAqCQlVbmRlciBTRElPIGludGVyZmFjZSwgdGhpcyBpcyB0aGUgaW50ZXJydXB0IHR5cGUgd2hpY2gKLSAqCQlpcyBMb2NhbCBpbnRlcnJ1cHQgb3Igc3lzdGVtIGludGVycnVwdC4KLSAqCVtpbl0gQ29udGVudExlbiAtCi0gKgkJVGhlIGxlbmd0aCBpbiBieXRlIG9mIHBDb250ZW50LgotICogUmV0dXJuOgotICoJSWYgYW55IGludGVycnVwdCBtYXRjaGVzIHRoZSBtYXNrIChJTVIpLCByZXR1cm4gdHJ1ZSwgYW5kCi0gKglyZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgYm9vbAotSW50ZXJydXB0UmVjb2duaXplZDg3MjNBVShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHZvaWQgKnBDb250ZW50LAotCQkJICB1MzIgQ29udGVudExlbikKLXsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCXU4ICpidWZmZXIgPSAodTggKilwQ29udGVudDsKLQlzdHJ1Y3QgcmVwb3J0cHdyc3RhdGVfcGFybSByZXBvcnQ7Ci0KLQltZW1jcHkoJnBIYWxEYXRhLT5JbnRBcnJheVswXSwgJmJ1ZmZlcltVU0JfSU5UUl9DT05URU5UX0hJU1JfT0ZGU0VUXSwKLQkgICAgICAgNCk7Ci0JcEhhbERhdGEtPkludEFycmF5WzBdICY9IHBIYWxEYXRhLT5JbnRyTWFza1swXTsKLQotCS8qIEZvciBISVNSIGV4dGVuc2lvbi4gQWRkZWQgYnkgdHlubGkuIDIwMDkuMTAuMDcuICovCi0JbWVtY3B5KCZwSGFsRGF0YS0+SW50QXJyYXlbMV0sCi0JICAgICAgICZidWZmZXJbVVNCX0lOVFJfQ09OVEVOVF9ISVNSRV9PRkZTRVRdLCA0KTsKLQlwSGFsRGF0YS0+SW50QXJyYXlbMV0gJj0gcEhhbERhdGEtPkludHJNYXNrWzFdOwotCi0JLyogV2Ugc2hvbHVkIHJlbW92ZSB0aGlzIGZ1bmN0aW9uIGxhdGVyIGJlY2F1c2UgRERLIHN1Z2dlc3QKLQkgKiBub3QgdG8gZXhlY3V0aW5nIHRvbyBtYW55IG9wZXJhdGlvbnMgaW4gTVBJU1IgICovCi0KLQltZW1jcHkoJnJlcG9ydC5zdGF0ZSwgJmJ1ZmZlcltVU0JfSU5UUl9DUFdNX09GRlNFVF0sIDEpOwotCi0JcmV0dXJuIChwSGFsRGF0YS0+SW50QXJyYXlbMF0gJiBwSGFsRGF0YS0+SW50ck1hc2tbMF0pICE9IDAgfHwKLQkJKHBIYWxEYXRhLT5JbnRBcnJheVsxXSAmIHBIYWxEYXRhLT5JbnRyTWFza1sxXSkgIT0gMDsKLX0KLQotc3RhdGljIHZvaWQgdXNiX3JlYWRfaW50ZXJydXB0X2NvbXBsZXRlKHN0cnVjdCB1cmIgKnB1cmIpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKXB1cmItPmNvbnRleHQ7Ci0KLQlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgfHwgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8Ci0JICAgIHBhZGFwdGVyLT5iUmVhZFBvcnRDYW5jZWwpIHsKLQkJREJHXzg3MjNBKCIlcygpIFJYIFdhcm5pbmchIGJEcml2ZXJTdG9wcGVkKCVkKSBPUiAiCi0JCQkgICJiU3VycHJpc2VSZW1vdmVkKCVkKSBiUmVhZFBvcnRDYW5jZWwoJWQpXG4iLAotCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLAotCQkJICBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCwKLQkJCSAgcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocHVyYi0+c3RhdHVzID09IDApIHsKLQkJc3RydWN0IGMyaF9ldnRfaGRyICpjMmhfZXZ0OwotCi0JCWMyaF9ldnQgPSAoc3RydWN0IGMyaF9ldnRfaGRyICopcHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotCi0JCWlmIChwdXJiLT5hY3R1YWxfbGVuZ3RoID4gVVNCX0lOVFJfQ09OVEVOVF9MRU5HVEgpIHsKLQkJCURCR184NzIzQSgidXNiX3JlYWRfaW50ZXJydXB0X2NvbXBsZXRlOiBwdXJiLT5hY3R1YWxfIgotCQkJCSAgImxlbmd0aCA+IFVTQl9JTlRSX0NPTlRFTlRfTEVOR1RIXG4iKTsKLQkJCWdvdG8gdXJiX3N1Ym1pdDsKLQkJfQotCi0JCUludGVycnVwdFJlY29nbml6ZWQ4NzIzQVUocGFkYXB0ZXIsIHB1cmItPnRyYW5zZmVyX2J1ZmZlciwKLQkJCQkJICBwdXJiLT5hY3R1YWxfbGVuZ3RoKTsKLQotCQlpZiAoYzJoX2V2dF9leGlzdChjMmhfZXZ0KSkgewotCQkJaWYgKGMyaF9pZF9maWx0ZXJfY2N4Xzg3MjNhKGMyaF9ldnQtPmlkKSkgewotCQkJCS8qIEhhbmRsZSBDQ1ggcmVwb3J0IGhlcmUgKi8KLQkJCQloYW5kbGVfdHhycHRfY2N4Xzg3MjNhKHBhZGFwdGVyLCAodm9pZCAqKQotCQkJCQkJICAgICAgIGMyaF9ldnQtPnBheWxvYWQpOwotCQkJCXNjaGVkdWxlX3dvcmsoJnBhZGFwdGVyLT5ldnRwcml2LmlycV93ayk7Ci0JCQl9IGVsc2UgewotCQkJCXN0cnVjdCBldnRfd29yayAqYzJ3OwotCQkJCWludCByZXM7Ci0KLQkJCQljMncgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXZ0X3dvcmspLAotCQkJCQkJR0ZQX0FUT01JQyk7Ci0KLQkJCQlpZiAoIWMydykKLQkJCQkJZ290byB1cmJfc3VibWl0OwotCi0JCQkJYzJ3LT5hZGFwdGVyID0gcGFkYXB0ZXI7Ci0JCQkJSU5JVF9XT1JLKCZjMnctPndvcmssIHJ0d19ldnRfd29yayk7Ci0JCQkJbWVtY3B5KGMydy0+dS5idWYsIHB1cmItPnRyYW5zZmVyX2J1ZmZlciwgMTYpOwotCi0JCQkJcmVzID0gcXVldWVfd29yayhwYWRhcHRlci0+ZXZ0cHJpdi53cSwKLQkJCQkJCSAmYzJ3LT53b3JrKTsKLQotCQkJCWlmICghcmVzKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbGwgdG8gIgotCQkJCQkgICAgICAgInF1ZXVlX3dvcmsoKSBmYWlsZWRcbiIsCi0JCQkJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCQkJCWtmcmVlKGMydyk7Ci0JCQkJCWdvdG8gdXJiX3N1Ym1pdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotdXJiX3N1Ym1pdDoKLQkJZXJyID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChlcnIgJiYgKGVyciAhPSAtRVBFUk0pKSB7Ci0JCQlEQkdfODcyM0EoImNhbm5vdCBzdWJtaXQgaW50ZXJydXB0IGluLXRva2VuKGVyciA9ICIKLQkJCQkgICIweCUwOHgpLCB1cmJfc3RhdHVzID0gJWRcbiIsCi0JCQkJICBlcnIsIHB1cmItPnN0YXR1cyk7Ci0JCX0KLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiMjIz0+IHVzYl9yZWFkX2ludGVycnVwdF9jb21wbGV0ZSA9PiB1cmIgIgotCQkJICAic3RhdHVzKCVkKVxuIiwgcHVyYi0+c3RhdHVzKTsKLQotCQlzd2l0Y2ggKHB1cmItPnN0YXR1cykgewotCQljYXNlIC1FSU5WQUw6Ci0JCWNhc2UgLUVQSVBFOgotCQljYXNlIC1FTk9ERVY6Ci0JCWNhc2UgLUVTSFVURE9XTjoKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiU3VycHJpc2VSZW1vdmVkID10cnVlXG4iKTsKLQkJCS8qIEZhbGwgVGhyb3VnaCBoZXJlICovCi0JCWNhc2UgLUVOT0VOVDoKLQkJCXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9IHRydWU7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YkRyaXZlclN0b3BwZWQgPXRydWVcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgLUVQUk9UTzoKLQkJCWJyZWFrOwotCQljYXNlIC1FSU5QUk9HUkVTUzoKLQkJCURCR184NzIzQSgiRVJST1I6IFVSQiBJUyBJTiBQUk9HUkVTUyFcbiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotaW50IHJ0bDg3MjNhdV9yZWFkX2ludGVycnVwdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBpbnQgcGlwZTsKLQlpbnQgcmV0ID0gX1NVQ0NFU1M7Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9iaiA9IGFkYXB0ZXJfdG9fZHZvYmooYWRhcHRlcik7Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJmFkYXB0ZXItPnJlY3Zwcml2OwotCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiZCA9IHBkdm9iai0+cHVzYmRldjsKLQotCS8qIHRyYW5zbGF0ZSBETUEgRklGTyBhZGRyIHRvIHBpcGVoYW5kbGUgKi8KLQlwaXBlID0gdXNiX3JjdmludHBpcGUocHVzYmQsIHBkdm9iai0+UnRJblBpcGVbMV0pOwotCi0JdXNiX2ZpbGxfaW50X3VyYihwcmVjdnByaXYtPmludF9pbl91cmIsIHB1c2JkLCBwaXBlLAotCQkJIHByZWN2cHJpdi0+aW50X2luX2J1ZiwgVVNCX0lOVFJfQ09OVEVOVF9MRU5HVEgsCi0JCQkgdXNiX3JlYWRfaW50ZXJydXB0X2NvbXBsZXRlLCBhZGFwdGVyLCAxKTsKLQotCWVyciA9IHVzYl9zdWJtaXRfdXJiKHByZWN2cHJpdi0+aW50X2luX3VyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKGVyciAmJiAoZXJyICE9IC1FUEVSTSkpIHsKLQkJREJHXzg3MjNBKCJjYW5ub3Qgc3VibWl0IGludGVycnVwdCBpbi10b2tlbihlcnIgPSAweCUwOHgpLCIKLQkJCSAgInVyYl9zdGF0dXMgPSAlZFxuIiwgZXJyLAotCQkJICBwcmVjdnByaXYtPmludF9pbl91cmItPnN0YXR1cyk7Ci0JCXJldCA9IF9GQUlMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcmVjdmJ1ZjJyZWN2ZnJhbWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnBza2IpCi17Ci0JdTgJKnBidWY7Ci0JdTgJc2hpZnRfc3ogPSAwOwotCXUxNglwa3RfY250OwotCXUzMglwa3Rfb2Zmc2V0LCBza2JfbGVuLCBhbGxvY19zejsKLQlpbnQJdHJhbnNmZXJfbGVuOwotCXN0cnVjdCByZWN2X3N0YXQgKnByeHN0YXQ7Ci0Jc3RydWN0IHBoeV9zdGF0CSpwcGh5X2luZm87Ci0Jc3RydWN0IHNrX2J1ZmYgKnBrdF9jb3B5OwotCXN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lOwotCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0Jc3RydWN0IHJ0d19xdWV1ZSAqcGZyZWVfcmVjdl9xdWV1ZSA9ICZwcmVjdnByaXYtPmZyZWVfcmVjdl9xdWV1ZTsKLQotCXRyYW5zZmVyX2xlbiA9IChpbnQpcHNrYi0+bGVuOwotCXBidWYgPSBwc2tiLT5kYXRhOwotCi0JcHJ4c3RhdCA9IChzdHJ1Y3QgcmVjdl9zdGF0ICopcGJ1ZjsKLQlwa3RfY250ID0gKGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcyKSA+PiAxNikgJiAweGZmOwotCi0JZG8gewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHJ4ZGVzYyA9IG9mZnNzZXQgMDoweCUwOHgsIDQ6MHglMDh4LCA4OjB4JTA4eCwgQzoweCUwOHhcbiIsCi0JCQkgcHJ4c3RhdC0+cnhkdzAsIHByeHN0YXQtPnJ4ZHcxLAotCQkJIHByeHN0YXQtPnJ4ZHcyLCBwcnhzdGF0LT5yeGR3NCk7Ci0KLQkJcHJ4c3RhdCA9IChzdHJ1Y3QgcmVjdl9zdGF0ICopcGJ1ZjsKLQotCQlwcmVjdmZyYW1lID0gcnR3X2FsbG9jX3JlY3ZmcmFtZTIzYShwZnJlZV9yZWN2X3F1ZXVlKTsKLQkJaWYgKCFwcmVjdmZyYW1lKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHByZWN2ZnJhbWUgPT0gTlVMTFxuIik7Ci0JCQlEQkdfODcyM0EoIiVzKCktJWQ6IHJ0d19hbGxvY19yZWN2ZnJhbWUyM2EoKSBmYWlsZWQhIFJYICIKLQkJCQkgICJEcm9wIVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7Ci0JCX0KLQotCQlJTklUX0xJU1RfSEVBRCgmcHJlY3ZmcmFtZS0+bGlzdCk7Ci0KLQkJdXBkYXRlX3JlY3ZmcmFtZV9hdHRyaWIocHJlY3ZmcmFtZSwgcHJ4c3RhdCk7Ci0KLQkJcGF0dHJpYiA9ICZwcmVjdmZyYW1lLT5hdHRyaWI7Ci0KLQkJaWYgKHBhdHRyaWItPmNyY19lcnIpIHsKLQkJCURCR184NzIzQSgiJXMoKS0lZDogUlggV2FybmluZyEgcnggQ1JDIEVSUk9SICEhXG4iLAotCQkJCSAgX19mdW5jX18sIF9fTElORV9fKTsKLQkJCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdmZyYW1lKTsKLQkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7Ci0JCX0KLQotCQlwa3Rfb2Zmc2V0ID0gUlhERVNDX1NJWkUgKyBwYXR0cmliLT5kcnZpbmZvX3N6ICsKLQkJCXBhdHRyaWItPnNoaWZ0X3N6ICsgcGF0dHJpYi0+cGt0X2xlbjsKLQotCQlpZiAocGF0dHJpYi0+cGt0X2xlbiA8PSAwIHx8IHBrdF9vZmZzZXQgPiB0cmFuc2Zlcl9sZW4pIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHBrdF9sZW48PSAwXG4iKTsKLQkJCURCR184NzIzQSgiJXMoKS0lZDogUlggV2FybmluZyFcbiIsCi0JCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2ZnJhbWUpOwotCQkJZ290byBfZXhpdF9yZWN2YnVmMnJlY3ZmcmFtZTsKLQkJfQotCi0JCS8qCU1vZGlmaWVkIGJ5IEFsYmVydCAyMDEwMTIxMyAqLwotCQkvKglGb3IgOCBieXRlcyBJUCBoZWFkZXIgYWxpZ25tZW50LiAqLwotCQkvKglRb3MgZGF0YSwgd2lyZWxlc3MgbGFuIGhlYWRlciBsZW5ndGggaXMgMjYgKi8KLQkJaWYgKHBhdHRyaWItPnFvcykKLQkJCXNoaWZ0X3N6ID0gNjsKLQkJZWxzZQotCQkJc2hpZnRfc3ogPSAwOwotCi0JCXNrYl9sZW4gPSBwYXR0cmliLT5wa3RfbGVuOwotCi0JCS8qIGZvciBmaXJzdCBmcmFnbWVudCBwYWNrZXQsIGRyaXZlciBuZWVkIGFsbG9jYXRlCi0JCSAqIDE1MzYrZHJ2aW5mb19zeitSWERFU0NfU0laRSB0byBkZWZyYWcgcGFja2V0LgotCQkgKiBtb2RpZnkgYWxsb2Nfc3ogZm9yIHJlY3ZpdmUgY3JjIGVycm9yIHBhY2tldAotCQkgKiBieSB0aG9tYXMgMjAxMS0wNi0wMiAqLwotCQlpZiAocGF0dHJpYi0+bWZyYWcgPT0gMSAmJiBwYXR0cmliLT5mcmFnX251bSA9PSAwKSB7Ci0JCQkvKiBhbGxvY19zeiA9IDE2NjQ7CTE2NjQgaXMgMTI4IGFsaWdubWVudC4gKi8KLQkJCWlmIChza2JfbGVuIDw9IDE2NTApCi0JCQkJYWxsb2Nfc3ogPSAxNjY0OwotCQkJZWxzZQotCQkJCWFsbG9jX3N6ID0gc2tiX2xlbiArIDE0OwotCQl9IGVsc2UgewotCQkJYWxsb2Nfc3ogPSBza2JfbGVuOwotCQkvKiAgNiBpcyBmb3IgSVAgaGVhZGVyIDggYnl0ZXMgYWxpZ25tZW50IGluIFFvUyBwYWNrZXQgY2FzZS4gKi8KLQkJLyogIDggaXMgZm9yIHNrYi0+ZGF0YSA0IGJ5dGVzIGFsaWdubWVudC4gKi8KLQkJCWFsbG9jX3N6ICs9IDE0OwotCQl9Ci0KLQkJcGt0X2NvcHkgPSBuZXRkZXZfYWxsb2Nfc2tiKHBhZGFwdGVyLT5wbmV0ZGV2LCBhbGxvY19zeik7Ci0JCWlmIChwa3RfY29weSkgewotCQkJcGt0X2NvcHktPmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCQkJcHJlY3ZmcmFtZS0+cGt0ID0gcGt0X2NvcHk7Ci0JCQkvKiBmb3JjZSBwa3RfY29weS0+ZGF0YSBhdCA4LWJ5dGUgYWxpZ25tZW50IGFkZHJlc3MgKi8KLQkJCXNrYl9yZXNlcnZlKHBrdF9jb3B5LCA4IC0KLQkJCQkgICAgKCh1bnNpZ25lZCBsb25nKShwa3RfY29weS0+ZGF0YSkgJiA3KSk7Ci0JCQkvKmZvcmNlIGlwX2hkciBhdCA4LWJ5dGUgYWxpZ25tZW50IGFkZHJlc3MKLQkJCSAgYWNjb3JkaW5nIHRvIHNoaWZ0X3N6LiAqLwotCQkJc2tiX3Jlc2VydmUocGt0X2NvcHksIHNoaWZ0X3N6KTsKLQkJCW1lbWNweShwa3RfY29weS0+ZGF0YSwgcGJ1ZiArIHBhdHRyaWItPnNoaWZ0X3N6ICsKLQkJCSAgICAgICBwYXR0cmliLT5kcnZpbmZvX3N6ICsgUlhERVNDX1NJWkUsIHNrYl9sZW4pOwotCQkJc2tiX3B1dChwa3RfY29weSwgc2tiX2xlbik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocGF0dHJpYi0+bWZyYWcgPT0gMSAmJiBwYXR0cmliLT5mcmFnX251bSA9PSAwKSB7Ci0JCQkJREJHXzg3MjNBKCJyZWN2YnVmMnJlY3ZmcmFtZTogYWxsb2Nfc2tiIGZhaWwsICIKLQkJCQkJICAiZHJvcCBmcmFnIGZyYW1lIFxuIik7Ci0JCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2ZnJhbWUpOwotCQkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7Ci0JCQl9Ci0KLQkJCXByZWN2ZnJhbWUtPnBrdCA9IHNrYl9jbG9uZShwc2tiLCBHRlBfQVRPTUlDKTsKLQkJCWlmICghcHJlY3ZmcmFtZS0+cGt0KSB7Ci0JCQkJREJHXzg3MjNBKCJyZWN2YnVmMnJlY3ZmcmFtZTogc2tiX2Nsb25lICIKLQkJCQkJICAiZmFpbFxuIik7Ci0JCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2ZnJhbWUpOwotCQkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocGF0dHJpYi0+cGh5c3QpIHsKLQkJCXBwaHlfaW5mbyA9IChzdHJ1Y3QgcGh5X3N0YXQgKikocGJ1ZiArIFJYREVTQ19PRkZTRVQpOwotCQkJdXBkYXRlX3JlY3ZmcmFtZV9waHlpbmZvKHByZWN2ZnJhbWUsIHBwaHlfaW5mbyk7Ci0JCX0KLQotCQlpZiAocnR3X3JlY3ZfZW50cnkyM2EocHJlY3ZmcmFtZSkgIT0gX1NVQ0NFU1MpCi0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHJ0d19yZWN2X2VudHJ5MjNhKHByZWN2ZnJhbWUpICE9IF9TVUNDRVNTXG4iKTsKLQotCQlwa3RfY250LS07Ci0JCXRyYW5zZmVyX2xlbiAtPSBwa3Rfb2Zmc2V0OwotCQlwYnVmICs9IHBrdF9vZmZzZXQ7Ci0JCXByZWN2ZnJhbWUgPSBOVUxMOwotCQlwa3RfY29weSA9IE5VTEw7Ci0KLQkJaWYgKHRyYW5zZmVyX2xlbiA+IDAgJiYgcGt0X2NudCA9PSAwKQotCQkJcGt0X2NudCA9IChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3Mik+PjE2KSAmIDB4ZmY7Ci0KLQl9IHdoaWxlICh0cmFuc2Zlcl9sZW4gPiAwICYmIHBrdF9jbnQgPiAwKTsKLQotX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU6Ci0KLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLXZvaWQgcnRsODcyM2F1X3JlY3ZfdGFza2xldCh2b2lkICpwcml2KQotewotCXN0cnVjdCBza19idWZmICpwc2tiOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IHJ0d19hZGFwdGVyICopcHJpdjsKLQlzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYgPSAmcGFkYXB0ZXItPnJlY3Zwcml2OwotCi0Jd2hpbGUgKE5VTEwgIT0gKHBza2IgPSBza2JfZGVxdWV1ZSgmcHJlY3Zwcml2LT5yeF9za2JfcXVldWUpKSkgewotCQlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7Ci0JCQlEQkdfODcyM0EoInJlY3ZfdGFza2xldCA9PiBiRHJpdmVyU3RvcHBlZCBvciAiCi0JCQkJICAiYlN1cnByaXNlUmVtb3ZlZCBcbiIpOwotCQkJZGV2X2tmcmVlX3NrYl9hbnkocHNrYik7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJlY3ZidWYycmVjdmZyYW1lKHBhZGFwdGVyLCBwc2tiKTsKLQkJc2tiX3Jlc2V0X3RhaWxfcG9pbnRlcihwc2tiKTsKLQotCQlwc2tiLT5sZW4gPSAwOwotCi0JCXNrYl9xdWV1ZV90YWlsKCZwcmVjdnByaXYtPmZyZWVfcmVjdl9za2JfcXVldWUsIHBza2IpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdXNiX3JlYWRfcG9ydF9jb21wbGV0ZShzdHJ1Y3QgdXJiICpwdXJiKQotewotCXN0cnVjdCByZWN2X2J1ZiAqcHJlY3ZidWYgPSAoc3RydWN0IHJlY3ZfYnVmICopcHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKXByZWN2YnVmLT5hZGFwdGVyOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlISEhXG4iKTsKLQotCXByZWN2cHJpdi0+cnhfcGVuZGluZ19jbnQtLTsKLQotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwKLQkgICAgcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCkgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCglZCkgT1IgYlN1cnByaXNlUmVtb3ZlZCglZClcbiIsCi0JCQkgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCk7Ci0KLQkJREJHXzg3MjNBKCIlcygpLSVkOiBSWCBXYXJuaW5nISBiRHJpdmVyU3RvcHBlZCglZCkgT1IgIgotCQkJICAiYlN1cnByaXNlUmVtb3ZlZCglZCkgYlJlYWRQb3J0Q2FuY2VsKCVkKVxuIiwKLQkJCSAgX19mdW5jX18sIF9fTElORV9fLCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsCi0JCQkgIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkLCBwYWRhcHRlci0+YlJlYWRQb3J0Q2FuY2VsKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChwdXJiLT5zdGF0dXMgPT0gMCkgewotCQlpZiAocHVyYi0+YWN0dWFsX2xlbmd0aCA+IE1BWF9SRUNWQlVGX1NaIHx8Ci0JCSAgICBwdXJiLT5hY3R1YWxfbGVuZ3RoIDwgUlhERVNDX1NJWkUpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTogKHB1cmItPmFjdHVhbF9sZW5ndGggPiBNQVhfUkVDVkJVRl9TWikgfHwgKHB1cmItPmFjdHVhbF9sZW5ndGggPCBSWERFU0NfU0laRSlcbiIpOwotCQkJcnRsODcyM2F1X3JlYWRfcG9ydChwYWRhcHRlciwgMCwgcHJlY3ZidWYpOwotCQkJREJHXzg3MjNBKCIlcygpLSVkOiBSWCBXYXJuaW5nIVxuIiwKLQkJCQkgIF9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCX0gZWxzZSB7Ci0JCQlydHdfcmVzZXRfY29udGludWFsX3VyYl9lcnJvcigKLQkJCQlhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKSk7Ci0KLQkJCXNrYl9wdXQocHJlY3ZidWYtPnBza2IsIHB1cmItPmFjdHVhbF9sZW5ndGgpOwotCQkJc2tiX3F1ZXVlX3RhaWwoJnByZWN2cHJpdi0+cnhfc2tiX3F1ZXVlLAotCQkJCSAgICAgICBwcmVjdmJ1Zi0+cHNrYik7Ci0KLQkJCWlmIChza2JfcXVldWVfbGVuKCZwcmVjdnByaXYtPnJ4X3NrYl9xdWV1ZSkgPD0gMSkKLQkJCQl0YXNrbGV0X3NjaGVkdWxlKCZwcmVjdnByaXYtPnJlY3ZfdGFza2xldCk7Ci0KLQkJCXByZWN2YnVmLT5wc2tiID0gTlVMTDsKLQkJCXJ0bDg3MjNhdV9yZWFkX3BvcnQocGFkYXB0ZXIsIDAsIHByZWN2YnVmKTsKLQkJfQotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlIDogcHVyYi0+c3RhdHVzKCVkKSAhPSAwXG4iLAotCQkJIHB1cmItPnN0YXR1cyk7Ci0JCXNrYl9wdXQocHJlY3ZidWYtPnBza2IsIHB1cmItPmFjdHVhbF9sZW5ndGgpOwotCQlwcmVjdmJ1Zi0+cHNrYiA9IE5VTEw7Ci0KLQkJREJHXzg3MjNBKCIjIyM9PiB1c2JfcmVhZF9wb3J0X2NvbXBsZXRlID0+IHVyYiBzdGF0dXMoJWQpXG4iLAotCQkJICBwdXJiLT5zdGF0dXMpOwotCi0JCWlmIChydHdfaW5jX2FuZF9jaGtfY29udGludWFsX3VyYl9lcnJvcigKLQkJCSAgICBhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKSkpIHsKLQkJCXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID0gdHJ1ZTsKLQkJfQotCi0JCXN3aXRjaCAocHVyYi0+c3RhdHVzKSB7Ci0JCWNhc2UgLUVJTlZBTDoKLQkJY2FzZSAtRVBJUEU6Ci0JCWNhc2UgLUVOT0RFVjoKLQkJY2FzZSAtRVNIVVRET1dOOgotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlOmJTdXJwcmlzZVJlbW92ZWQgPSB0cnVlXG4iKTsKLQkJCS8qIEludGVudGlvbmFsIGZhbGwgdGhyb3VnaCBoZXJlICovCi0JCWNhc2UgLUVOT0VOVDoKLQkJCXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9IHRydWU7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YkRyaXZlclN0b3BwZWQgPSB0cnVlXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIC1FUFJPVE86Ci0JCWNhc2UgLUVPVkVSRkxPVzoKLQkJCXJ0bDg3MjNhdV9yZWFkX3BvcnQocGFkYXB0ZXIsIDAsIHByZWN2YnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIC1FSU5QUk9HUkVTUzoKLQkJCURCR184NzIzQSgiRVJST1I6IFVSQiBJUyBJTiBQUk9HUkVTUyFcbiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotaW50IHJ0bDg3MjNhdV9yZWFkX3BvcnQoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1MzIgY250LAotCQkJc3RydWN0IHJlY3ZfYnVmICpwcmVjdmJ1ZikKLXsKLQlzdHJ1Y3QgdXJiICpwdXJiOwotCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmogPSBhZGFwdGVyX3RvX2R2b2JqKGFkYXB0ZXIpOwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZhZGFwdGVyLT5yZWN2cHJpdjsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYmQgPSBwZHZvYmotPnB1c2JkZXY7Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBpbnQgcGlwZTsKLQl1bnNpZ25lZCBsb25nIHRtcGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBhbGlnbm1lbnQ7Ci0JaW50IHJldCA9IF9TVUNDRVNTOwotCi0JaWYgKGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInVzYl9yZWFkX3BvcnQ6KHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSEhIVxuIik7Ci0JCXJldHVybiBfRkFJTDsKLQl9Ci0KLQlpZiAoIXByZWN2YnVmKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICJ1c2JfcmVhZF9wb3J0OnByZWN2YnVmID09IE5VTExcbiIpOwotCQlyZXR1cm4gX0ZBSUw7Ci0JfQotCi0JaWYgKCFwcmVjdmJ1Zi0+cHNrYikKLQkJcHJlY3ZidWYtPnBza2IgPSBza2JfZGVxdWV1ZSgmcHJlY3Zwcml2LT5mcmVlX3JlY3Zfc2tiX3F1ZXVlKTsKLQotCS8qIHJlLWFzc2lnbiBmb3IgbGludXggYmFzZWQgb24gc2tiICovCi0JaWYgKCFwcmVjdmJ1Zi0+cHNrYikgewotCQlwcmVjdmJ1Zi0+cHNrYiA9IG5ldGRldl9hbGxvY19za2IoYWRhcHRlci0+cG5ldGRldiwgTUFYX1JFQ1ZCVUZfU1ogKyBSRUNWQlVGRl9BTElHTl9TWik7Ci0JCWlmIChwcmVjdmJ1Zi0+cHNrYiA9PSBOVUxMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgImluaXRfcmVjdmJ1ZigpOiBhbGxvY19za2IgZmFpbCFcbiIpOwotCQkJcmV0dXJuIF9GQUlMOwotCQl9Ci0KLQkJdG1wYWRkciA9ICh1bnNpZ25lZCBsb25nKXByZWN2YnVmLT5wc2tiLT5kYXRhOwotCQlhbGlnbm1lbnQgPSB0bXBhZGRyICYgKFJFQ1ZCVUZGX0FMSUdOX1NaLTEpOwotCQlza2JfcmVzZXJ2ZShwcmVjdmJ1Zi0+cHNrYiwgKFJFQ1ZCVUZGX0FMSUdOX1NaIC0gYWxpZ25tZW50KSk7Ci0JfQotCi0JcHJlY3Zwcml2LT5yeF9wZW5kaW5nX2NudCsrOwotCi0JcHVyYiA9IHByZWN2YnVmLT5wdXJiOwotCi0JLyogdHJhbnNsYXRlIERNQSBGSUZPIGFkZHIgdG8gcGlwZWhhbmRsZSAqLwotCXBpcGUgPSB1c2JfcmN2YnVsa3BpcGUocHVzYmQsIHBkdm9iai0+UnRJblBpcGVbMF0pOwotCi0JdXNiX2ZpbGxfYnVsa191cmIocHVyYiwgcHVzYmQsIHBpcGUsIHByZWN2YnVmLT5wc2tiLT5kYXRhLAotCQkJICBNQVhfUkVDVkJVRl9TWiwgdXNiX3JlYWRfcG9ydF9jb21wbGV0ZSwKLQkJCSAgcHJlY3ZidWYpOy8qIGNvbnRleHQgaXMgcHJlY3ZidWYgKi8KLQotCWVyciA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwotCWlmICgoZXJyKSAmJiAoZXJyICE9IC1FUEVSTSkpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgImNhbm5vdCBzdWJtaXQgcnggaW4tdG9rZW4oZXJyID0gMHglLjh4KSwgVVJCX1NUQVRVUyA9IDB4JS44eFxuIiwKLQkJCSBlcnIsIHB1cmItPnN0YXR1cyk7Ci0JCURCR184NzIzQSgiY2Fubm90IHN1Ym1pdCByeCBpbi10b2tlbihlcnIgPSAweCUwOHgpLCB1cmJfc3RhdHVzICIKLQkJCSAgIj0gJWRcbiIsIGVyciwgcHVyYi0+c3RhdHVzKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcnRsODcyM2F1X3htaXRfdGFza2xldCh2b2lkICpwcml2KQotewotCWludCByZXQ7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKilwcml2OwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkKLQkJcmV0dXJuOwotCi0Jd2hpbGUgKDEpIHsKLQkJaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fAotCQkgICAgcGFkYXB0ZXItPmJXcml0ZVBvcnRDYW5jZWwpIHsKLQkJCURCR184NzIzQSgieG1pdF90YXNrbGV0ID0+IGJEcml2ZXJTdG9wcGVkIG9yICIKLQkJCQkgICJiU3VycHJpc2VSZW1vdmVkIG9yIGJXcml0ZVBvcnRDYW5jZWxcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXQgPSBydGw4NzIzYXVfeG1pdGZyYW1lX2NvbXBsZXRlKHBhZGFwdGVyLCBweG1pdHByaXYsIE5VTEwpOwotCi0JCWlmICghcmV0KQotCQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIHJ0bDg3MjNhdV9zZXRfaHdfdHlwZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXBhZGFwdGVyLT5jaGlwX3R5cGUgPSBSVEw4NzIzQTsKLQlwYWRhcHRlci0+SGFyZHdhcmVUeXBlID0gSEFSRFdBUkVfVFlQRV9SVEw4NzIzQVU7Ci0JREJHXzg3MjNBKCJDSElQIFRZUEU6IFJUTDg3MjNBXG4iKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzQVBoeUNmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNBUGh5Q2ZnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZjM2NTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNBUGh5Q2ZnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0lOQ19IQUw4NzIzUEhZQ0ZHX0hfXwotI2RlZmluZSBfX0lOQ19IQUw4NzIzUEhZQ0ZHX0hfXwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWVudW0gUkZfUkFESU9fUEFUSCB7Ci0JUkZfUEFUSF9BID0gMCwJCQkvKiBSYWRpbyBQYXRoIEEgKi8KLQlSRl9QQVRIX0IgPSAxLAkJCS8qIFJhZGlvIFBhdGggQiAqLwotCVJGX1BBVEhfTUFYCQkJLyogTWF4IFJGIG51bWJlciA5MCBzdXBwb3J0ICovCi19OwotCi0jZGVmaW5lIENIQU5ORUxfTUFYX05VTUJFUgkJMTQJLyogIDE0IGlzIHRoZSBtYXggY2hhbm5lbCBudW1iZXIgKi8KLQotZW51bSBXSVJFTEVTU19NT0RFIHsKLQlXSVJFTEVTU19NT0RFX1VOS05PV04JPSAweDAwLAotCVdJUkVMRVNTX01PREVfQQkJPSBCSVQoMiksCi0JV0lSRUxFU1NfTU9ERV9CCQk9IEJJVCgwKSwKLQlXSVJFTEVTU19NT0RFX0cJCT0gQklUKDEpLAotCVdJUkVMRVNTX01PREVfQVVUTwk9IEJJVCg1KSwKLQlXSVJFTEVTU19NT0RFX05fMjRHCT0gQklUKDMpLAotCVdJUkVMRVNTX01PREVfTl81Rwk9IEJJVCg0KSwKLQlXSVJFTEVTU19NT0RFX0FDCT0gQklUKDYpCi19OwotCi1zdHJ1Y3QgYmJfcmVnX2RlZmluZSB7Ci0JdTMyIHJmaW50ZnM7CQkvKiAgc2V0IHNvZnR3YXJlIGNvbnRyb2w6ICovCi0JCQkJLyoJCTB4ODcwfjB4ODc3WzggYnl0ZXNdICovCi0JdTMyIHJmaW50Zmk7CQkvKiAgcmVhZGJhY2sgZGF0YTogKi8KLQkJCQkvKgkJMHg4ZTB+MHg4ZTdbOCBieXRlc10gKi8KLQl1MzIgcmZpbnRmbzsJCS8qICBvdXRwdXQgZGF0YTogKi8KLQkJCQkvKgkJMHg4NjB+MHg4NmYgWzE2IGJ5dGVzXSAqLwotCXUzMiByZmludGZlOwkJLyogIG91dHB1dCBlbmFibGU6ICovCi0JCQkJLyoJCTB4ODYwfjB4ODZmIFsxNiBieXRlc10gKi8KLQl1MzIgcmYzd2lyZU9mZnNldDsJLyogIExTU0kgZGF0YTogKi8KLQkJCQkvKgkJMHg4NDB+MHg4NGYgWzE2IGJ5dGVzXSAqLwotCXUzMiByZkxTU0lfU2VsZWN0OwkvKiAgQkIgQmFuZCBTZWxlY3Q6ICovCi0JCQkJLyoJCTB4ODc4fjB4ODdmIFs4IGJ5dGVzXSAqLwotCXUzMiByZlR4R2FpblN0YWdlOwkvKiAgVHggZ2FpbiBzdGFnZTogKi8KLQkJCQkvKgkJMHg4MGN+MHg4MGYgWzQgYnl0ZXNdICovCi0JdTMyIHJmSFNTSVBhcmExOwkvKiAgd2lyZSBwYXJhbWV0ZXIgY29udHJvbDEgOiAqLwotCQkJCS8qCQkweDgyMH4weDgyMywgMHg4Mjh+MHg4MmIsIDB4ODMwfjB4ODMzLCAweDgzOH4weDgzYiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmSFNTSVBhcmEyOwkvKiAgd2lyZSBwYXJhbWV0ZXIgY29udHJvbDIgOiAqLwotCQkJCS8qCQkweDgyNH4weDgyNywgMHg4MmN+MHg4MmYsIDB4ODM0fjB4ODM3LCAweDgzY34weDgzZiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmU3dpdGNoQ29udHJvbDsgLyogVHggUnggYW50ZW5uYSBjb250cm9sIDogKi8KLQkJCQkvKgkJMHg4NTh+MHg4NWYgWzE2IGJ5dGVzXSAqLwotCXUzMiByZkFHQ0NvbnRyb2wxOwkvKiBBR0MgcGFyYW1ldGVyIGNvbnRyb2wxIDogKi8KLQkJCQkvKgkweGM1MH4weGM1MywgMHhjNTh+MHhjNWIsIDB4YzYwfjB4YzYzLCAweGM2OH4weGM2YiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmQUdDQ29udHJvbDI7CS8qIEFHQyBwYXJhbWV0ZXIgY29udHJvbDIgOiAqLwotCQkJCS8qCQkweGM1NH4weGM1NywgMHhjNWN+MHhjNWYsIDB4YzY0fjB4YzY3LCAweGM2Y34weGM2ZiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmUnhJUUltYmFsYW5jZTsgLyogT0ZETSBSeCBJUSBpbWJhbGFuY2UgbWF0cml4IDogKi8KLQkJCQkvKgkJMHhjMTR+MHhjMTcsIDB4YzFjfjB4YzFmLCAweGMyNH4weGMyNywgMHhjMmN+MHhjMmYgWzE2IGJ5dGVzXSAqLwotCXUzMiByZlJ4QUZFOwkJLyogUnggSVEgREMgb2ZzZXQgYW5kIFJ4IGRpZ2l0YWwgZmlsdGVyLCBSeCBEQyBub3RjaCBmaWx0ZXIgOiAqLwotCQkJCS8qCTB4YzEwfjB4YzEzLCAweGMxOH4weGMxYiwgMHhjMjB+MHhjMjMsIDB4YzI4fjB4YzJiIFsxNiBieXRlc10gKi8KLQl1MzIgcmZUeElRSW1iYWxhbmNlOyAvKiBPRkRNIFR4IElRIGltYmFsYW5jZSBtYXRyaXggKi8KLQkJCQkvKgkweGM4MH4weGM4MywgMHhjODh+MHhjOGIsIDB4YzkwfjB4YzkzLCAweGM5OH4weGM5YiBbMTYgYnl0ZXNdICovCi0JdTMyIHJmVHhBRkU7CQkvKiBUeCBJUSBEQyBPZmZzZXQgYW5kIFR4IERGSVIgdHlwZSAqLwotCQkJCS8qCTB4Yzg0fjB4Yzg3LCAweGM4Y34weGM4ZiwgMHhjOTR+MHhjOTcsIDB4YzljfjB4YzlmIFsxNiBieXRlc10gKi8KLQl1MzIgcmZMU1NJUmVhZEJhY2s7CS8qIExTU0kgUkYgcmVhZGJhY2sgZGF0YSBTSSBtb2RlICovCi0JCQkJLyoJMHg4YTB+MHg4YWYgWzE2IGJ5dGVzXSAqLwotCXUzMiByZkxTU0lSZWFkQmFja1BpOwkvKiBMU1NJIFJGIHJlYWRiYWNrIGRhdGEgUEkgbW9kZSAweDhiOC04YmMgZm9yIFBhdGggQSBhbmQgQiAqLwotfTsKLQotc3RydWN0IHJfYW50ZW5uYV9zZWxfb2ZkbSB7Ci0JdTMyCQkJcl90eF9hbnRlbm5hOjQ7Ci0JdTMyCQkJcl9hbnRfbDo0OwotCXUzMgkJCXJfYW50X25vbl9odDo0OwotCXUzMgkJCXJfYW50X2h0MTo0OwotCXUzMgkJCXJfYW50X2h0Mjo0OwotCXUzMgkJCXJfYW50X2h0X3MxOjQ7Ci0JdTMyCQkJcl9hbnRfbm9uX2h0X3MxOjQ7Ci0JdTMyCQkJT0ZETV9UWFNDOjI7Ci0JdTMyCQkJUmVzZXJ2ZWQ6MjsKLX07Ci0KLXN0cnVjdCByX2FudGVubmFfc2VsX2NjayB7Ci0JdTgJCQlyX2Nja3J4X2VuYWJsZV8yOjI7Ci0JdTgJCQlyX2Nja3J4X2VuYWJsZToyOwotCXU4CQkJcl9jY2t0eF9lbmFibGU6NDsKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgTWFjcm8gRGVmaW5pdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYWNybyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAqLwotLyogIEJCIGFuZCBSRiByZWdpc3RlciByZWFkL3dyaXRlICovCi0vKiAgKi8KLXUzMglQSFlfUXVlcnlCQlJlZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUzMiBSZWdBZGRyLAotCQkgICAgICAgdTMyIEJpdE1hc2spOwotdm9pZAlQSFlfU2V0QkJSZWcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MzIgUmVnQWRkciwKLQkJICAgICB1MzIgQml0TWFzaywgdTMyIERhdGEpOwotdTMyCVBIWV9RdWVyeVJGUmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJICAgICAgIGVudW0gUkZfUkFESU9fUEFUSAllUkZQYXRoLCB1MzIgUmVnQWRkciwKLQkJICAgICAgIHUzMiBCaXRNYXNrKTsKLXZvaWQJUEhZX1NldFJGUmVnKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwKLQkJICAgICBlbnVtIFJGX1JBRElPX1BBVEggZVJGUGF0aCwgdTMyIFJlZ0FkZHIsCi0JCSAgICAgdTMyIEJpdE1hc2ssICB1MzIJRGF0YSk7Ci0KLS8qICAqLwotLyogIEJCIFRYIFBvd2VyIFIvVyAqLwotLyogICovCi12b2lkIFBIWV9TZXRUeFBvd2VyTGV2ZWw4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGNoYW5uZWwpOwotCi0vKiAgKi8KLS8qICBTd2l0Y2ggYmFuZHdpZHRoIGZvciA4NzIzQSAqLwotLyogICovCi12b2lkCVBIWV9TZXRCV01vZGUyM2E4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLAotCQkJICAgZW51bSBodF9jaGFubmVsX3dpZHRoIENobmxXaWR0aCwKLQkJCSAgIHVuc2lnbmVkIGNoYXIgT2Zmc2V0KTsKLQotLyogICovCi0vKiAgY2hhbm5lbCBzd2l0Y2ggcmVsYXRlZCBmdW5jaXRvbiAqLwotLyogICovCi12b2lkCVBIWV9Td0Nobmw4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBjaGFubmVsKTsKLQkJCQkvKiAgQ2FsbCBhZnRlciBpbml0aWFsaXphdGlvbiAqLwotdm9pZCBDaGtGd0NtZElvRG9uZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpOwotCi0vKiAgKi8KLS8qICBNb2RpZnkgdGhlIHZhbHVlIG9mIHRoZSBodyByZWdpc3RlciB3aGVuIGJlYWNvbiBpbnRlcnZhbCBiZSBjaGFuZ2VkLiAqLwotLyogICovCi12b2lkCi1ydGw4MTkyY19QSFlfU2V0QmVhY29uSHdSZWcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLCB1MTYgQmVhY29uSW50ZXJ2YWwpOwotCi0KLXZvaWQgUEhZX1N3aXRjaEVwaHlQYXJhbWV0ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKTsKLQotdm9pZCBQSFlfRW5hYmxlSG9zdENsa1JlcShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpOwotCi1ib29sCi1TZXRBbnRlbm5hQ29uZmlnOTJDKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTggRGVmYXVsdEFudCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnRlZCBGdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIFBIWV9TZXRNYWNSZWcJUEhZX1NldEJCUmVnCi0KLS8qIE1BQy9CQi9SRiBIQUwgY29uZmlnICovCi1pbnQgUEhZX0JCQ29uZmlnODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKTsKLXMzMiBQSFlfTUFDQ29uZmlnODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNBUGh5UmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM0FQaHlSZWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU5OTI4Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM0FQaHlSZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0lOQ19IQUw4NzIzQVBIWVJFR19IX18KLSNkZWZpbmUgX19JTkNfSEFMODcyM0FQSFlSRUdfSF9fCi0KLS8qICAxLiBQTUFDIGR1cGxpY2F0ZSByZWdpc3RlciBkdWUgdG8gY29ubmVjdGlvbjogUkZfTW9kZSwgVFJ4Uk4sIE51bU9mIEwtU1RGICovCi0vKiAgMS4gUGFnZTEoMHgxMDApICovCi0jZGVmaW5lIHJQTUFDX1Jlc2V0CQkJCTB4MTAwCi0jZGVmaW5lIHJQTUFDX1R4U3RhcnQJCQkJMHgxMDQKLSNkZWZpbmUgclBNQUNfVHhMZWdhY3lTSUcJCQkweDEwOAotI2RlZmluZSByUE1BQ19UeEhUU0lHMQkJCQkweDEwYwotI2RlZmluZSByUE1BQ19UeEhUU0lHMgkJCQkweDExMAotI2RlZmluZSByUE1BQ19QSFlEZWJ1ZwkJCQkweDExNAotI2RlZmluZSByUE1BQ19UeFBhY2tldE51bQkJCTB4MTE4Ci0jZGVmaW5lIHJQTUFDX1R4SWRsZQkJCQkweDExYwotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjAJCQkweDEyMAotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjEJCQkweDEyNAotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjIJCQkweDEyOAotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjMJCQkweDEyYwotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjQJCQkweDEzMAotI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjUJCQkweDEzNAotI2RlZmluZSByUE1BQ19UeERhdGFUeXBlCQkJMHgxMzgKLSNkZWZpbmUgclBNQUNfVHhSYW5kb21TZWVkCQkJMHgxM2MKLSNkZWZpbmUgclBNQUNfQ0NLUExDUFByZWFtYmxlCQkJMHgxNDAKLSNkZWZpbmUgclBNQUNfQ0NLUExDUEhlYWRlcgkJCTB4MTQ0Ci0jZGVmaW5lIHJQTUFDX0NDS0NSQzE2CQkJCTB4MTQ4Ci0jZGVmaW5lIHJQTUFDX09GRE1SeENSQzMyT0sJCQkweDE3MAotI2RlZmluZSByUE1BQ19PRkRNUnhDUkMzMkVyCQkJMHgxNzQKLSNkZWZpbmUgclBNQUNfT0ZETVJ4UGFyaXR5RXIJCQkweDE3OAotI2RlZmluZSByUE1BQ19PRkRNUnhDUkM4RXIJCQkweDE3YwotI2RlZmluZSByUE1BQ19DQ0tDUnhSQzE2RXIJCQkweDE4MAotI2RlZmluZSByUE1BQ19DQ0tDUnhSQzMyRXIJCQkweDE4NAotI2RlZmluZSByUE1BQ19DQ0tDUnhSQzMyT0sJCQkweDE4OAotI2RlZmluZSByUE1BQ19UeFN0YXR1cwkJCQkweDE4YwotCi0vKiAgMi4gUGFnZTIoMHgyMDApICovCi0vKiAgVGhlIGZvbGxvd2luZyB0d28gZGVmaW5pdGlvbiBhcmUgb25seSB1c2VkIGZvciBVU0IgaW50ZXJmYWNlLiAqLwotI2RlZmluZSBSRl9CQl9DTURfQUREUgkJMHgwMmMwCS8qICBSRi9CQiByZWFkL3dyaXRlIGNvbW1hbmQgYWRkcmVzcy4gKi8KLSNkZWZpbmUgUkZfQkJfQ01EX0RBVEEJCTB4MDJjNAkvKiAgUkYvQkIgcmVhZC93cml0ZSBjb21tYW5kIGRhdGEuICovCi0KLS8qICAzLiBQYWdlOCgweDgwMCkgKi8KLSNkZWZpbmUgckZQR0EwX1JGTU9ECQkweDgwMAkvKiBSRiBtb2RlICYgQ0NLIFR4U0MgIFJGIEJXIFNldHRpbmc/PyAqLwotCi0jZGVmaW5lIHJGUEdBMF9UeEluZm8JCTB4ODA0CS8qICBTdGF0dXMgcmVwb3J0Pz8gKi8KLSNkZWZpbmUgckZQR0EwX1BTREZ1bmN0aW9uCTB4ODA4Ci0KLSNkZWZpbmUgckZQR0EwX1R4R2FpblN0YWdlCTB4ODBjCS8qICBTZXQgVFggUFdSIGluaXQgZ2Fpbj8gKi8KLQotI2RlZmluZSByRlBHQTBfUkZUaW1pbmcxCTB4ODEwCS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByRlBHQTBfUkZUaW1pbmcyCTB4ODE0Ci0KLSNkZWZpbmUgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIxCTB4ODIwCS8qICBSRiAzIHdpcmUgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyCTB4ODI0Ci0jZGVmaW5lIHJGUEdBMF9YQl9IU1NJUGFyYW1ldGVyMQkweDgyOAotI2RlZmluZSByRlBHQTBfWEJfSFNTSVBhcmFtZXRlcjIJMHg4MmMKLSNkZWZpbmUgclR4QUdDX0JfUmF0ZTE4XzA2CQkweDgzMAotI2RlZmluZSByVHhBR0NfQl9SYXRlNTRfMjQJCTB4ODM0Ci0jZGVmaW5lIHJUeEFHQ19CX0NDSzFfNTVfTWNzMzIJCTB4ODM4Ci0jZGVmaW5lIHJUeEFHQ19CX01jczAzX01jczAwCQkweDgzYwotCi0jZGVmaW5lIHJUeEFHQ19CX01jczA3X01jczA0CQkweDg0OAotI2RlZmluZSByVHhBR0NfQl9NY3MxMV9NY3MwOAkJMHg4NGMKLQotI2RlZmluZSByRlBHQTBfWEFfTFNTSVBhcmFtZXRlcgkJMHg4NDAKLSNkZWZpbmUgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIJCTB4ODQ0Ci0KLSNkZWZpbmUgckZQR0EwX1JGV2FrZVVwUGFyYW1ldGVyCTB4ODUwCS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByRlBHQTBfUkZTbGVlcFVwUGFyYW1ldGVyCTB4ODU0Ci0KLSNkZWZpbmUgckZQR0EwX1hBQl9Td2l0Y2hDb250cm9sCTB4ODU4CS8qICBSRiBDaGFubmVsIHN3aXRjaCAqLwotI2RlZmluZSByRlBHQTBfWENEX1N3aXRjaENvbnRyb2wJMHg4NWMKLQotI2RlZmluZSByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRQkJMHg4NjAJLyogIFJGIENoYW5uZWwgc3dpdGNoICovCi0jZGVmaW5lIHJGUEdBMF9YQl9SRkludGVyZmFjZU9FCQkweDg2NAotCi0jZGVmaW5lIHJUeEFHQ19CX01jczE1X01jczEyCQkweDg2OAotI2RlZmluZSByVHhBR0NfQl9DQ0sxMV9BX0NDSzJfMTEJMHg4NmMKLQotI2RlZmluZSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1cJMHg4NzAJLyogIFJGIEludGVyZmFjZSBTb2Z0d2FyZSBDb250cm9sICovCi0jZGVmaW5lIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVwkweDg3NAotCi0jZGVmaW5lIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIJCTB4ODc4CS8qICBSRiBQYXJhbWV0ZXIgKi8KLSNkZWZpbmUgckZQR0EwX1hDRF9SRlBhcmFtZXRlcgkJMHg4N2MKLQotI2RlZmluZSByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMQkJMHg4ODAJLyogIENyeXN0YWwgY2FwIHNldHRpbmcgUkYtUi9XIHByb3RlY3Rpb24gZm9yIHBhcmFtZXRlcjQ/PyAqLwotI2RlZmluZSByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMgkJMHg4ODQKLSNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjMJCTB4ODg4CS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNAkJMHg4OGMKLQotI2RlZmluZSByRlBHQTBfWEFfTFNTSVJlYWRCYWNrCQkweDhhMAkvKiAgVHJhbmNlaXZlciBMU1NJIFJlYWRiYWNrICovCi0jZGVmaW5lIHJGUEdBMF9YQl9MU1NJUmVhZEJhY2sJCTB4OGE0Ci0jZGVmaW5lIHJGUEdBMF9YQ19MU1NJUmVhZEJhY2sJCTB4OGE4Ci0jZGVmaW5lIHJGUEdBMF9YRF9MU1NJUmVhZEJhY2sJCTB4OGFjCi0KLSNkZWZpbmUgckZQR0EwX1BTRFJlcG9ydAkJMHg4YjQJLyogIFVzZWxlc3Mgbm93ICovCi0jZGVmaW5lIFRyYW5zY2VpdmVyQV9IU1BJX1JlYWRiYWNrCTB4OGI4CS8qICBUcmFuc2NlaXZlciBBIEhTUEkgUmVhZGJhY2sgKi8KLSNkZWZpbmUgVHJhbnNjZWl2ZXJCX0hTUElfUmVhZGJhY2sJMHg4YmMJLyogIFRyYW5zY2VpdmVyIEIgSFNQSSBSZWFkYmFjayAqLwotI2RlZmluZSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkIJMHg4ZTAJLyogIFVzZWxlc3Mgbm93IFJGIEludGVyZmFjZSBSZWFkYmFjayBWYWx1ZSAqLwotI2RlZmluZSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkIJMHg4ZTQJLyogIFVzZWxlc3Mgbm93ICovCi0KLS8qICA0LiBQYWdlOSgweDkwMCkgKi8KLSNkZWZpbmUgckZQR0ExX1JGTU9ECQkJMHg5MDAJLyogUkYgbW9kZSAmIE9GRE0gVHhTQyBSRiBCVyBTZXR0aW5nPz8gKi8KLQotI2RlZmluZSByRlBHQTFfVHhCbG9jawkJCTB4OTA0CS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByRlBHQTFfRGVidWdTZWxlY3QJCTB4OTA4CS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByRlBHQTFfVHhJbmZvCQkJMHg5MGMJLyogIFVzZWxlc3Mgbm93IFN0YXR1cyByZXBvcnQ/PyAqLwotCi0vKiAgNS4gUGFnZUEoMHhBMDApICovCi0vKiAgU2V0IENvbnRyb2wgY2hhbm5lbCB0byB1cHBlciBvciBsb3dlci4gVGhlc2Ugc2V0dGluZ3MgYXJlIHJlcXVpcmVkIG9ubHkgZm9yIDQwTUh6ICovCi0jZGVmaW5lIHJDQ0swX1N5c3RlbQkJCTB4YTAwCi0KLSNkZWZpbmUgckNDSzBfQUZFU2V0dGluZwkJMHhhMDQJLyogIERpc2FibGUgaW5pdCBnYWluIG5vdyBTZWxlY3QgUlggcGF0aCBieSBSU1NJICovCi0jZGVmaW5lIHJDQ0swX0NDQQkJCTB4YTA4CS8qICBEaXNhYmxlIGluaXQgZ2FpbiBub3cgSW5pdCBnYWluICovCi0KLSNkZWZpbmUgckNDSzBfUnhBR0MxCQkJMHhhMGMJLyogQUdDIGRlZmF1bHQgdmFsdWUsIHNhdHVyYXRpb24gbGV2ZWwgQW50ZW5uYSBEaXZlcnNpdHksIFJYIEFHQywgTE5BIFRocmVzaG9sZCwgUlggTE5BIFRocmVzaG9sZCB1c2VsZXNzIG5vdy4gTm90IHRoZSBzYW1lIGFzIDkwIHNlcmllcyAqLwotI2RlZmluZSByQ0NLMF9SeEFHQzIJCQkweGExMAkvKiBBR0MgJiBEQUdDICovCi0KLSNkZWZpbmUgckNDSzBfUnhIUAkJCTB4YTE0Ci0KLSNkZWZpbmUgckNDSzBfRFNQUGFyYW1ldGVyMQkJMHhhMTgJLyogVGltaW5nIHJlY292ZXJ5ICYgQ2hhbm5lbCBlc3RpbWF0aW9uIHRocmVzaG9sZCAqLwotI2RlZmluZSByQ0NLMF9EU1BQYXJhbWV0ZXIyCQkweGExYwkvKiBTUSB0aHJlc2hvbGQgKi8KLQotI2RlZmluZSByQ0NLMF9UeEZpbHRlcjEJCQkweGEyMAotI2RlZmluZSByQ0NLMF9UeEZpbHRlcjIJCQkweGEyNAotI2RlZmluZSByQ0NLMF9EZWJ1Z1BvcnQJCQkweGEyOAkvKiBkZWJ1ZyBwb3J0IGFuZCBUeCBmaWx0ZXIzICovCi0jZGVmaW5lIHJDQ0swX0ZhbHNlQWxhcm1SZXBvcnQJCTB4YTJjCS8qIDB4YTJkCXVzZWxlc3Mgbm93IDB4YTMwLWE0ZiBjaGFubmVsIHJlcG9ydCAqLwotI2RlZmluZSByQ0NLMF9UUlNTSVJlcG9ydAkJMHhhNTAKLSNkZWZpbmUgckNDSzBfUnhSZXBvcnQJCQkweGE1NCAgLyogMHhhNTcgKi8KLSNkZWZpbmUgckNDSzBfRkFDb3VudGVyTG93ZXIJCTB4YTVjICAvKiAweGE1YiAqLwotI2RlZmluZSByQ0NLMF9GQUNvdW50ZXJVcHBlcgkJMHhhNTggIC8qIDB4YTVjICovCi0vKiAgUGFnZUIoMHhCMDApICovCi0jZGVmaW5lIHJQZHBfQW50QQkJCTB4YjAwCi0jZGVmaW5lIHJQZHBfQW50QV80CQkJMHhiMDQKLSNkZWZpbmUgckNvbmZpZ19QbXBkX0FudEEJCTB4YjI4Ci0jZGVmaW5lIHJDb25maWdfQW50QQkJCTB4YjY4Ci0jZGVmaW5lIHJDb25maWdfQW50QgkJCTB4YjZjCi0jZGVmaW5lIHJQZHBfQW50QgkJCTB4YjcwCi0jZGVmaW5lIHJQZHBfQW50Ql80CQkJMHhiNzQKLSNkZWZpbmUgckNvbmZpZ19QbXBkX0FudEIJCTB4Yjk4Ci0jZGVmaW5lIHJBUEsJCQkJMHhiZDgKLQotLyogIDYuIFBhZ2VDKDB4QzAwKSAqLwotI2RlZmluZSByT0ZETTBfTFNURgkJCTB4YzAwCi0KLSNkZWZpbmUgck9GRE0wX1RSeFBhdGhFbmFibGUJCTB4YzA0Ci0jZGVmaW5lIHJPRkRNMF9UUk11eFBhcgkJCTB4YzA4Ci0jZGVmaW5lIHJPRkRNMF9UUlNXSXNvbGF0aW9uCQkweGMwYwotCi0jZGVmaW5lIHJPRkRNMF9YQVJ4QUZFCQkJMHhjMTAgIC8qIFJ4SVEgREMgb2Zmc2V0LCBSeCBkaWdpdGFsIGZpbHRlciwgREMgbm90Y2ggZmlsdGVyICovCi0jZGVmaW5lIHJPRkRNMF9YQVJ4SVFJbWJhbGFuY2UJCTB4YzE0ICAvKiBSeElRIGltYmxhbmNlIG1hdHJpeCAqLwotI2RlZmluZSByT0ZETTBfWEJSeEFGRQkJCTB4YzE4Ci0jZGVmaW5lIHJPRkRNMF9YQlJ4SVFJbWJhbGFuY2UJCTB4YzFjCi0jZGVmaW5lIHJPRkRNMF9YQ1J4QUZFCQkJMHhjMjAKLSNkZWZpbmUgck9GRE0wX1hDUnhJUUltYmFsYW5jZQkJMHhjMjQKLSNkZWZpbmUgck9GRE0wX1hEUnhBRkUJCQkweGMyOAotI2RlZmluZSByT0ZETTBfWERSeElRSW1iYWxhbmNlCQkweGMyYwotCi0jZGVmaW5lIHJPRkRNMF9SeERldGVjdG9yMQkJMHhjMzAgIC8qIFBELEJXICYgU0JECURNIHR1bmUgaW5pdCBnYWluICovCi0jZGVmaW5lIHJPRkRNMF9SeERldGVjdG9yMgkJMHhjMzQgIC8qIFNCRCAmIEZhbWUgU3luYy4gKi8KLSNkZWZpbmUgck9GRE0wX1J4RGV0ZWN0b3IzCQkweGMzOCAgLyogRnJhbWUgU3luYy4gKi8KLSNkZWZpbmUgck9GRE0wX1J4RGV0ZWN0b3I0CQkweGMzYyAgLyogUEQsIFNCRCwgRnJhbWUgU3luYyAmIFNob3J0LUdJICovCi0KLSNkZWZpbmUgck9GRE0wX1J4RFNQCQkJMHhjNDAgIC8qIFJ4IFN5bmMgUGF0aCAqLwotI2RlZmluZSByT0ZETTBfQ0ZPYW5kREFHQwkJMHhjNDQgIC8qIENGTyAmIERBR0MgKi8KLSNkZWZpbmUgck9GRE0wX0NDQURyb3BUaHJlc2hvbGQJMHhjNDggLyogQ0NBIERyb3AgdGhyZXNob2xkICovCi0jZGVmaW5lIHJPRkRNMF9FQ0NBVGhyZXNob2xkCQkweGM0YyAvKiAgZW5lcmd5IENDQSAqLwotCi0jZGVmaW5lIHJPRkRNMF9YQUFHQ0NvcmUxCQkweGM1MAkvKiAgRElHICovCi0jZGVmaW5lIHJPRkRNMF9YQUFHQ0NvcmUyCQkweGM1NAotI2RlZmluZSByT0ZETTBfWEJBR0NDb3JlMQkJMHhjNTgKLSNkZWZpbmUgck9GRE0wX1hCQUdDQ29yZTIJCTB4YzVjCi0jZGVmaW5lIHJPRkRNMF9YQ0FHQ0NvcmUxCQkweGM2MAotI2RlZmluZSByT0ZETTBfWENBR0NDb3JlMgkJMHhjNjQKLSNkZWZpbmUgck9GRE0wX1hEQUdDQ29yZTEJCTB4YzY4Ci0jZGVmaW5lIHJPRkRNMF9YREFHQ0NvcmUyCQkweGM2YwotCi0jZGVmaW5lIHJPRkRNMF9BR0NQYXJhbWV0ZXIxCQkweGM3MAotI2RlZmluZSByT0ZETTBfQUdDUGFyYW1ldGVyMgkJMHhjNzQKLSNkZWZpbmUgck9GRE0wX0FHQ1JTU0lUYWJsZQkJMHhjNzgKLSNkZWZpbmUgck9GRE0wX0hUU1RGQUdDCQkJMHhjN2MKLQotI2RlZmluZSByT0ZETTBfWEFUeElRSW1iYWxhbmNlCQkweGM4MAkvKiAgVFggUFdSIFRSQUNLIGFuZCBESUcgKi8KLSNkZWZpbmUgck9GRE0wX1hBVHhBRkUJCQkweGM4NAotI2RlZmluZSByT0ZETTBfWEJUeElRSW1iYWxhbmNlCQkweGM4OAotI2RlZmluZSByT0ZETTBfWEJUeEFGRQkJCTB4YzhjCi0jZGVmaW5lIHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UJCTB4YzkwCi0jZGVmaW5lIHJPRkRNMF9YQ1R4QUZFCQkJMHhjOTQKLSNkZWZpbmUgck9GRE0wX1hEVHhJUUltYmFsYW5jZQkJMHhjOTgKLSNkZWZpbmUgck9GRE0wX1hEVHhBRkUJCQkweGM5YwotCi0jZGVmaW5lIHJPRkRNMF9SeElRRXh0QW50YQkJMHhjYTAKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmYxCQkJMHhjYTQKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmYyCQkJMHhjYTgKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmYzCQkJMHhjYWMKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmY0CQkJMHhjYjAKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmY1CQkJMHhjYjQKLSNkZWZpbmUgck9GRE0wX1R4Q29lZmY2CQkJMHhjYjgKLSNkZWZpbmUgck9GRE0wX1J4SFBQYXJhbWV0ZXIJCTB4Y2UwCi0jZGVmaW5lIHJPRkRNMF9UeFBzZXVkb05vaXNlV2d0CQkweGNlNAotI2RlZmluZSByT0ZETTBfRnJhbWVTeW5jCQkweGNmMAotI2RlZmluZSByT0ZETTBfREZTUmVwb3J0CQkweGNmNAotCi0vKiAgNy4gUGFnZUQoMHhEMDApICovCi0jZGVmaW5lIHJPRkRNMV9MU1RGCQkJMHhkMDAKLSNkZWZpbmUgck9GRE0xX1RSeFBhdGhFbmFibGUJCTB4ZDA0Ci0KLSNkZWZpbmUgck9GRE0xX0NGTwkJCTB4ZDA4CS8qICBObyBzZXR0aW5nIG5vdyAqLwotI2RlZmluZSByT0ZETTFfQ1NJMQkJCTB4ZDEwCi0jZGVmaW5lIHJPRkRNMV9TQkQJCQkweGQxNAotI2RlZmluZSByT0ZETTFfQ1NJMgkJCTB4ZDE4Ci0jZGVmaW5lIHJPRkRNMV9DRk9UcmFja2luZwkJMHhkMmMKLSNkZWZpbmUgck9GRE0xX1RSeE1lc2F1cmUxCQkweGQzNAotI2RlZmluZSByT0ZETTFfSW50ZkRldAkJCTB4ZDNjCi0jZGVmaW5lIHJPRkRNMV9Qc2V1ZG9Ob2lzZVN0YXRlQUIJMHhkNTAKLSNkZWZpbmUgck9GRE0xX1BzZXVkb05vaXNlU3RhdGVDRAkweGQ1NAotI2RlZmluZSByT0ZETTFfUnhQc2V1ZG9Ob2lzZVdndAkJMHhkNTgKLQotI2RlZmluZSByT0ZETV9QSFlDb3VudGVyMQkJMHhkYTAgIC8qIGNjYSwgcGFyaXR5IGZhaWwgKi8KLSNkZWZpbmUgck9GRE1fUEhZQ291bnRlcjIJCTB4ZGE0ICAvKiByYXRlIGlsbGVnYWwsIGNyYzggZmFpbCAqLwotI2RlZmluZSByT0ZETV9QSFlDb3VudGVyMwkJMHhkYTggIC8qIE1DUyBub3Qgc3VwcG9ydCAqLwotCi0jZGVmaW5lIHJPRkRNX1Nob3J0Q0ZPQUIJCTB4ZGFjCS8qICBObyBzZXR0aW5nIG5vdyAqLwotI2RlZmluZSByT0ZETV9TaG9ydENGT0NECQkweGRiMAotI2RlZmluZSByT0ZETV9Mb25nQ0ZPQUIJCQkweGRiNAotI2RlZmluZSByT0ZETV9Mb25nQ0ZPQ0QJCQkweGRiOAotI2RlZmluZSByT0ZETV9UYWlsQ0ZPQUIJCQkweGRiYwotI2RlZmluZSByT0ZETV9UYWlsQ0ZPQ0QJCQkweGRjMAotI2RlZmluZSByT0ZETV9QV01lYXN1cmUxCQkweGRjNAotI2RlZmluZSByT0ZETV9QV01lYXN1cmUyCQkweGRjOAotI2RlZmluZSByT0ZETV9CV1JlcG9ydAkJCTB4ZGNjCi0jZGVmaW5lIHJPRkRNX0FHQ1JlcG9ydAkJCTB4ZGQwCi0jZGVmaW5lIHJPRkRNX1J4U05SCQkJMHhkZDQKLSNkZWZpbmUgck9GRE1fUnhFVk1DU0kJCQkweGRkOAotI2RlZmluZSByT0ZETV9TSUdSZXBvcnQJCQkweGRkYwotCi0KLS8qICA4LiBQYWdlRSgweEUwMCkgKi8KLSNkZWZpbmUgclR4QUdDX0FfUmF0ZTE4XzA2CQkweGUwMAotI2RlZmluZSByVHhBR0NfQV9SYXRlNTRfMjQJCTB4ZTA0Ci0jZGVmaW5lIHJUeEFHQ19BX0NDSzFfTWNzMzIJCTB4ZTA4Ci0jZGVmaW5lIHJUeEFHQ19BX01jczAzX01jczAwCQkweGUxMAotI2RlZmluZSByVHhBR0NfQV9NY3MwN19NY3MwNAkJMHhlMTQKLSNkZWZpbmUgclR4QUdDX0FfTWNzMTFfTWNzMDgJCTB4ZTE4Ci0jZGVmaW5lIHJUeEFHQ19BX01jczE1X01jczEyCQkweGUxYwotCi0jZGVmaW5lIHJGUEdBMF9JUUsJCQkweGUyOAotI2RlZmluZSByVHhfSVFLX1RvbmVfQQkJCTB4ZTMwCi0jZGVmaW5lIHJSeF9JUUtfVG9uZV9BCQkJMHhlMzQKLSNkZWZpbmUgclR4X0lRS19QSV9BCQkJMHhlMzgKLSNkZWZpbmUgclJ4X0lRS19QSV9BCQkJMHhlM2MKLQotI2RlZmluZSByVHhfSVFLCQkJCTB4ZTQwCi0jZGVmaW5lIHJSeF9JUUsJCQkJMHhlNDQKLSNkZWZpbmUgcklRS19BR0NfUHRzCQkJMHhlNDgKLSNkZWZpbmUgcklRS19BR0NfUnNwCQkJMHhlNGMKLSNkZWZpbmUgclR4X0lRS19Ub25lX0IJCQkweGU1MAotI2RlZmluZSByUnhfSVFLX1RvbmVfQgkJCTB4ZTU0Ci0jZGVmaW5lIHJUeF9JUUtfUElfQgkJCTB4ZTU4Ci0jZGVmaW5lIHJSeF9JUUtfUElfQgkJCTB4ZTVjCi0jZGVmaW5lIHJJUUtfQUdDX0NvbnQJCQkweGU2MAotCi0jZGVmaW5lIHJCbHVlX1Rvb3RoCQkJMHhlNmMKLSNkZWZpbmUgclJ4X1dhaXRfQ0NBCQkJMHhlNzAKLSNkZWZpbmUgclR4X0NDS19SRk9OCQkJMHhlNzQKLSNkZWZpbmUgclR4X0NDS19CQk9OCQkJMHhlNzgKLSNkZWZpbmUgclR4X09GRE1fUkZPTgkJCTB4ZTdjCi0jZGVmaW5lIHJUeF9PRkRNX0JCT04JCQkweGU4MAotI2RlZmluZSByVHhfVG9fUngJCQkweGU4NAotI2RlZmluZSByVHhfVG9fVHgJCQkweGU4OAotI2RlZmluZSByUnhfQ0NLCQkJCTB4ZThjCi0KLSNkZWZpbmUgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQQkJMHhlOTQKLSNkZWZpbmUgclR4X1Bvd2VyX0FmdGVyX0lRS19BCQkweGU5YwotCi0jZGVmaW5lIHJSeF9Qb3dlcl9CZWZvcmVfSVFLX0EJCTB4ZWEwCi0jZGVmaW5lIHJSeF9Qb3dlcl9CZWZvcmVfSVFLX0FfMgkweGVhNAotI2RlZmluZSByUnhfUG93ZXJfQWZ0ZXJfSVFLX0EJCTB4ZWE4Ci0jZGVmaW5lIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQV8yCQkweGVhYwotCi0jZGVmaW5lIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0IJCTB4ZWI0Ci0jZGVmaW5lIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQgkJMHhlYmMKLQotI2RlZmluZSByUnhfUG93ZXJfQmVmb3JlX0lRS19CCQkweGVjMAotI2RlZmluZSByUnhfUG93ZXJfQmVmb3JlX0lRS19CXzIJMHhlYzQKLSNkZWZpbmUgclJ4X1Bvd2VyX0FmdGVyX0lRS19CCQkweGVjOAotI2RlZmluZSByUnhfUG93ZXJfQWZ0ZXJfSVFLX0JfMgkJMHhlY2MKLQotI2RlZmluZSByUnhfT0ZETQkJCTB4ZWQwCi0jZGVmaW5lIHJSeF9XYWl0X1JJRlMJCQkweGVkNAotI2RlZmluZSByUnhfVE9fUngJCQkweGVkOAotI2RlZmluZSByU3RhbmRieQkJCTB4ZWRjCi0jZGVmaW5lIHJTbGVlcAkJCQkweGVlMAotI2RlZmluZSByUE1QRF9BTkFFTgkJCTB4ZWVjCi0KLS8qICA3LiBSRiBSZWdpc3RlciAweDAwLTB4MkUgKFJGIDgyNTYpICovCi0vKiAgICAgUkYtMDIyMkQgMHgwMC0zRiAqLwotLyogWmVicmExICovCi0jZGVmaW5lIHJaZWJyYTFfSFNTSUVuYWJsZQkJMHgwCS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByWmVicmExX1RSeEVuYWJsZTEJCTB4MQotI2RlZmluZSByWmVicmExX1RSeEVuYWJsZTIJCTB4MgotI2RlZmluZSByWmVicmExX0FHQwkJCTB4NAotI2RlZmluZSByWmVicmExX0NoYXJnZVB1bXAJCTB4NQotI2RlZmluZSByWmVicmExX0NoYW5uZWwJCQkweDcJLyogIFJGIGNoYW5uZWwgc3dpdGNoICovCi0KLSNkZWZpbmUgclplYnJhMV9UeEdhaW4JCQkweDgJLyogIFVzZWxlc3Mgbm93ICovCi0jZGVmaW5lIHJaZWJyYTFfVHhMUEYJCQkweDkKLSNkZWZpbmUgclplYnJhMV9SeExQRgkJCTB4YgotI2RlZmluZSByWmVicmExX1J4SFBGQ29ybmVyCQkweGMKLQotLyogWmVicmE0ICovCi0jZGVmaW5lIHJHbG9iYWxDdHJsCQkJMAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgclJUTDgyNTZfVHhMUEYJCQkxOQotI2RlZmluZSByUlRMODI1Nl9SeExQRgkJCTExCi0KLS8qIFJUTDgyNTggKi8KLSNkZWZpbmUgclJUTDgyNThfVHhMUEYJCQkweDExCS8qICBVc2VsZXNzIG5vdyAqLwotI2RlZmluZSByUlRMODI1OF9SeExQRgkJCTB4MTMKLSNkZWZpbmUgclJUTDgyNThfUlNTSUxQRgkJMHhhCi0KLS8qICBSTDYwNTIgUmVnaXN0ZXIgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBSRl9BQwkJCQkweDAwCi0jZGVmaW5lIFJGX0lRQURKX0cxCQkJMHgwMQotI2RlZmluZSBSRl9JUUFESl9HMgkJCTB4MDIKLSNkZWZpbmUgUkZfQlNfUEFfQVBTRVRfRzFfRzQJCTB4MDMKLSNkZWZpbmUgUkZfQlNfUEFfQVBTRVRfRzVfRzgJCTB4MDQKLSNkZWZpbmUgUkZfUE9XX1RSU1cJCQkweDA1Ci0jZGVmaW5lIFJGX0dBSU5fUlgJCQkweDA2Ci0jZGVmaW5lIFJGX0dBSU5fVFgJCQkweDA3Ci0jZGVmaW5lIFJGX1RYTV9JREFDCQkJMHgwOAotI2RlZmluZSBSRl9JUEFfRwkJCTB4MDkKLSNkZWZpbmUgUkZfVFhCSUFTX0cJCQkweDBBCi0jZGVmaW5lIFJGX1RYUEFfQUcJCQkweDBCCi0jZGVmaW5lIFJGX0lQQV9BCQkJMHgwQwotI2RlZmluZSBSRl9UWEJJQVNfQQkJCTB4MEQKLSNkZWZpbmUgUkZfQlNfUEFfQVBTRVRfRzlfRzExCQkweDBFCi0jZGVmaW5lIFJGX0JTX0lRR0VOCQkJMHgwRgotI2RlZmluZSBSRl9NT0RFMQkJCTB4MTAKLSNkZWZpbmUgUkZfTU9ERTIJCQkweDExCi0jZGVmaW5lIFJGX1JYX0FHQ19IUAkJCTB4MTIKLSNkZWZpbmUgUkZfVFhfQUdDCQkJMHgxMwotI2RlZmluZSBSRl9CSUFTCQkJCTB4MTQKLSNkZWZpbmUgUkZfSVBBCQkJCTB4MTUKLSNkZWZpbmUgUkZfVFhCSUFTCQkJMHgxNgotI2RlZmluZSBSRl9QT1dfQUJJTElUWQkJCTB4MTcKLSNkZWZpbmUgUkZfTU9ERV9BRwkJCTB4MTgKLSNkZWZpbmUgclJmQ2hhbm5lbAkJCTB4MTgJLyogIFJGIGNoYW5uZWwgYW5kIEJXIHN3aXRjaCAqLwotI2RlZmluZSBSRl9DSE5MQlcJCQkweDE4CS8qICBSRiBjaGFubmVsIGFuZCBCVyBzd2l0Y2ggKi8KLSNkZWZpbmUgUkZfVE9QCQkJCTB4MTkKLSNkZWZpbmUgUkZfUlhfRzEJCQkweDFBCi0jZGVmaW5lIFJGX1JYX0cyCQkJMHgxQgotI2RlZmluZSBSRl9SWF9CQjIJCQkweDFDCi0jZGVmaW5lIFJGX1JYX0JCMQkJCTB4MUQKLSNkZWZpbmUgUkZfUkNLMQkJCQkweDFFCi0jZGVmaW5lIFJGX1JDSzIJCQkJMHgxRgotI2RlZmluZSBSRl9UWF9HMQkJCTB4MjAKLSNkZWZpbmUgUkZfVFhfRzIJCQkweDIxCi0jZGVmaW5lIFJGX1RYX0czCQkJMHgyMgotI2RlZmluZSBSRl9UWF9CQjEJCQkweDIzCi0jZGVmaW5lIFJGX1RfTUVURVIJCQkweDI0Ci0jZGVmaW5lIFJGX1NZTl9HMQkJCTB4MjUJLyogIFJGIFRYIFBvd2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUkZfU1lOX0cyCQkJMHgyNgkvKiAgUkYgVFggUG93ZXIgY29udHJvbCAqLwotI2RlZmluZSBSRl9TWU5fRzMJCQkweDI3CS8qICBSRiBUWCBQb3dlciBjb250cm9sICovCi0jZGVmaW5lIFJGX1NZTl9HNAkJCTB4MjgJLyogIFJGIFRYIFBvd2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUkZfU1lOX0c1CQkJMHgyOQkvKiAgUkYgVFggUG93ZXIgY29udHJvbCAqLwotI2RlZmluZSBSRl9TWU5fRzYJCQkweDJBCS8qICBSRiBUWCBQb3dlciBjb250cm9sICovCi0jZGVmaW5lIFJGX1NZTl9HNwkJCTB4MkIJLyogIFJGIFRYIFBvd2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgUkZfU1lOX0c4CQkJMHgyQwkvKiAgUkYgVFggUG93ZXIgY29udHJvbCAqLwotCi0jZGVmaW5lIFJGX1JDS19PUwkJCTB4MzAJLyogIFJGIFRYIFBBIGNvbnRyb2wgKi8KLQotI2RlZmluZSBSRl9UWFBBX0cxCQkJMHgzMQkvKiAgUkYgVFggUEEgY29udHJvbCAqLwotI2RlZmluZSBSRl9UWFBBX0cyCQkJMHgzMgkvKiAgUkYgVFggUEEgY29udHJvbCAqLwotI2RlZmluZSBSRl9UWFBBX0czCQkJMHgzMwkvKiAgUkYgVFggUEEgY29udHJvbCAqLwotCi0vKiBCaXQgTWFzayAqLwotLyogIDEuIFBhZ2UxKDB4MTAwKSAqLwotI2RlZmluZSBiQkJSZXNldEIJCQkweDEwMAkvKiAgVXNlbGVzcyBub3c/ICovCi0jZGVmaW5lIGJHbG9iYWxSZXNldEIJCQkweDIwMAotI2RlZmluZSBiT0ZETVR4U3RhcnQJCQkweDQKLSNkZWZpbmUgYkNDS1R4U3RhcnQJCQkweDgKLSNkZWZpbmUgYkNSQzMyRGVidWcJCQkweDEwMAotI2RlZmluZSBiUE1BQ0xvb3BiYWNrCQkJMHgxMAotI2RlZmluZSBiVHhMU0lHCQkJCTB4ZmZmZmZmCi0jZGVmaW5lIGJPRkRNVHhSYXRlCQkJMHhmCi0jZGVmaW5lIGJPRkRNVHhSZXNlcnZlZAkJCTB4MTAKLSNkZWZpbmUgYk9GRE1UeExlbmd0aAkJCTB4MWZmZTAKLSNkZWZpbmUgYk9GRE1UeFBhcml0eQkJCTB4MjAwMDAKLSNkZWZpbmUgYlR4SFRTSUcxCQkJMHhmZmZmZmYKLSNkZWZpbmUgYlR4SFRNQ1NSYXRlCQkJMHg3ZgotI2RlZmluZSBiVHhIVEJXCQkJCTB4ODAKLSNkZWZpbmUgYlR4SFRMZW5ndGgJCQkweGZmZmYwMAotI2RlZmluZSBiVHhIVFNJRzIJCQkweGZmZmZmZgotI2RlZmluZSBiVHhIVFNtb290aGluZwkJCTB4MQotI2RlZmluZSBiVHhIVFNvdW5kaW5nCQkJMHgyCi0jZGVmaW5lIGJUeEhUUmVzZXJ2ZWQJCQkweDQKLSNkZWZpbmUgYlR4SFRBZ2dyZWF0aW9uCQkJMHg4Ci0jZGVmaW5lIGJUeEhUU1RCQwkJCTB4MzAKLSNkZWZpbmUgYlR4SFRBZHZhbmNlQ29kaW5nCQkweDQwCi0jZGVmaW5lIGJUeEhUU2hvcnRHSQkJCTB4ODAKLSNkZWZpbmUgYlR4SFROdW1iZXJIVF9MVEYJCTB4MzAwCi0jZGVmaW5lIGJUeEhUQ1JDOAkJCTB4M2ZjMDAKLSNkZWZpbmUgYkNvdW50ZXJSZXNldAkJCTB4MTAwMDAKLSNkZWZpbmUgYk51bU9mT0ZETVR4CQkJMHhmZmZmCi0jZGVmaW5lIGJOdW1PZkNDS1R4CQkJMHhmZmZmMDAwMAotI2RlZmluZSBiVHhJZGxlSW50ZXJ2YWwJCQkweGZmZmYKLSNkZWZpbmUgYk9GRE1TZXJ2aWNlCQkJMHhmZmZmMDAwMAotI2RlZmluZSBiVHhNQUNIZWFkZXIJCQkweGZmZmZmZmZmCi0jZGVmaW5lIGJUeERhdGFJbml0CQkJMHhmZgotI2RlZmluZSBiVHhIVE1vZGUJCQkweDEwMAotI2RlZmluZSBiVHhEYXRhVHlwZQkJCTB4MzAwMDAKLSNkZWZpbmUgYlR4UmFuZG9tU2VlZAkJCTB4ZmZmZmZmZmYKLSNkZWZpbmUgYkNDS1R4UHJlYW1ibGUJCQkweDEKLSNkZWZpbmUgYkNDS1R4U0ZECQkJMHhmZmZmMDAwMAotI2RlZmluZSBiQ0NLVHhTSUcJCQkweGZmCi0jZGVmaW5lIGJDQ0tUeFNlcnZpY2UJCQkweGZmMDAKLSNkZWZpbmUgYkNDS0xlbmd0aEV4dAkJCTB4ODAwMAotI2RlZmluZSBiQ0NLVHhMZW5ndGgJCQkweGZmZmYwMDAwCi0jZGVmaW5lIGJDQ0tUeENSQzE2CQkJMHhmZmZmCi0jZGVmaW5lIGJDQ0tUeFN0YXR1cwkJCTB4MQotI2RlZmluZSBiT0ZETVR4U3RhdHVzCQkJMHgyCi0KLSNkZWZpbmUgSVNfQkJfUkVHX09GRlNFVF85MlMoX09mZnNldCkJCQlcCi0JKChfT2Zmc2V0ID49IDB4ODAwKSAmJiAoX09mZnNldCA8PSAweGZmZikpCi0KLS8qICAyLiBQYWdlOCgweDgwMCkgKi8KLSNkZWZpbmUgYlJGTU9ECQkJCTB4MQkvKiAgUmVnIDB4ODAwIHJGUEdBMF9SRk1PRCAqLwotI2RlZmluZSBiSmFwYW5Nb2RlCQkJMHgyCi0jZGVmaW5lIGJDQ0tUeFNDCQkJMHgzMAotI2RlZmluZSBiQ0NLRW4JCQkJMHgxMDAwMDAwCi0jZGVmaW5lIGJPRkRNRW4JCQkJMHgyMDAwMDAwCi0KLSNkZWZpbmUgYk9GRE1SeEFEQ1BoYXNlCQkJMHgxMDAwMAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgYk9GRE1UeERBQ1BoYXNlCQkJMHg0MDAwMAotI2RlZmluZSBiWEFUeEFHQwkJCTB4M2YKLQotI2RlZmluZSBiQW50ZW5uYVNlbGVjdAkJCTB4MDMwMAotCi0jZGVmaW5lIGJYQlR4QUdDCQkJMHhmMDAJLyogIFJlZyA4MGMgckZQR0EwX1R4R2FpblN0YWdlICovCi0jZGVmaW5lIGJYQ1R4QUdDCQkJMHhmMDAwCi0jZGVmaW5lIGJYRFR4QUdDCQkJMHhmMDAwMAotCi0jZGVmaW5lIGJQQVN0YXJ0CQkJMHhmMDAwMDAwMAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgYlRSU3RhcnQJCQkweDAwZjAwMDAwCi0jZGVmaW5lIGJSRlN0YXJ0CQkJMHgwMDAwZjAwMAotI2RlZmluZSBiQkJTdGFydAkJCTB4MDAwMDAwZjAKLSNkZWZpbmUgYkJCQ0NLU3RhcnQJCQkweDAwMDAwMDBmCi0jZGVmaW5lIGJQQUVuZAkJCQkweGYgICAgICAgICAgLyogUmVnMHg4MTQgKi8KLSNkZWZpbmUgYlRSRW5kCQkJCTB4MGYwMDAwMDAKLSNkZWZpbmUgYlJGRW5kCQkJCTB4MDAwZjAwMDAKLSNkZWZpbmUgYkNDQU1hc2sJCQkweDAwMDAwMGYwICAgLyogVDJSICovCi0jZGVmaW5lIGJSMlJDQ0FNYXNrCQkJMHgwMDAwMGYwMAotI2RlZmluZSBiSFNTSV9SMlREZWxheQkJCTB4ZjgwMDAwMDAKLSNkZWZpbmUgYkhTU0lfVDJSRGVsYXkJCQkweGY4MDAwMAotI2RlZmluZSBiQ29udFR4SFNTSQkJCTB4NDAwICAgICAvKiBjaGFuZSBnYWluIGF0IGNvbnRpbnVlIFR4ICovCi0jZGVmaW5lIGJJR0Zyb21DQ0sJCQkweDIwMAotI2RlZmluZSBiQUdDQWRkcmVzcwkJCTB4M2YKLSNkZWZpbmUgYlJ4SFBUeAkJCQkweDcwMDAKLSNkZWZpbmUgYlJ4SFBUMlIJCQkweDM4MDAwCi0jZGVmaW5lIGJSeEhQQ0NLSW5pCQkJMHhjMDAwMAotI2RlZmluZSBiQUdDVHhDb2RlCQkJMHhjMDAwMDAKLSNkZWZpbmUgYkFHQ1J4Q29kZQkJCTB4MzAwMDAwCi0KLSNkZWZpbmUgYjNXaXJlRGF0YUxlbmd0aAkJMHg4MDAJLyogIFJlZyAweDgyMH44NGYgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIxICovCi0jZGVmaW5lIGIzV2lyZUFkZHJlc3NMZW5ndGgJCTB4NDAwCi0KLSNkZWZpbmUgYjNXaXJlUkZQb3dlckRvd24JCTB4MQkvKiAgVXNlbGVzcyBub3cgKi8KLS8qIGRlZmluZSBiSFdTSVNlbGVjdAkJCTB4OCAqLwotI2RlZmluZSBiNUdQQVBFUG9sYXJpdHkJCQkweDQwMDAwMDAwCi0jZGVmaW5lIGIyR1BBUEVQb2xhcml0eQkJCTB4ODAwMDAwMDAKLSNkZWZpbmUgYlJGU1dfVHhEZWZhdWx0QW50CQkweDMKLSNkZWZpbmUgYlJGU1dfVHhPcHRpb25BbnQJCTB4MzAKLSNkZWZpbmUgYlJGU1dfUnhEZWZhdWx0QW50CQkweDMwMAotI2RlZmluZSBiUkZTV19SeE9wdGlvbkFudAkJMHgzMDAwCi0jZGVmaW5lIGJSRlNJXzNXaXJlRGF0YQkJCTB4MQotI2RlZmluZSBiUkZTSV8zV2lyZUNsb2NrCQkweDIKLSNkZWZpbmUgYlJGU0lfM1dpcmVMb2FkCQkJMHg0Ci0jZGVmaW5lIGJSRlNJXzNXaXJlUlcJCQkweDgKLSNkZWZpbmUgYlJGU0lfM1dpcmUJCQkweGYKLQotI2RlZmluZSBiUkZTSV9SRkVOVgkJCTB4MTAJLyogIFJlZyAweDg3MCByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1cgKi8KLQotI2RlZmluZSBiUkZTSV9UUlNXCQkJMHgyMAkvKiAgVXNlbGVzcyBub3cgKi8KLSNkZWZpbmUgYlJGU0lfVFJTV0IJCQkweDQwCi0jZGVmaW5lIGJSRlNJX0FOVFNXCQkJMHgxMDAKLSNkZWZpbmUgYlJGU0lfQU5UU1dCCQkJMHgyMDAKLSNkZWZpbmUgYlJGU0lfUEFQRQkJCTB4NDAwCi0jZGVmaW5lIGJSRlNJX1BBUEU1RwkJCTB4ODAwCi0jZGVmaW5lIGJCYW5kU2VsZWN0CQkJMHgxCi0jZGVmaW5lIGJIVFNJRzJfR0kJCQkweDgwCi0jZGVmaW5lIGJIVFNJRzJfU21vb3RoaW5nCQkweDAxCi0jZGVmaW5lIGJIVFNJRzJfU291bmRpbmcJCTB4MDIKLSNkZWZpbmUgYkhUU0lHMl9BZ2dyZWF0b24JCTB4MDgKLSNkZWZpbmUgYkhUU0lHMl9TVEJDCQkJMHgzMAotI2RlZmluZSBiSFRTSUcyX0FkdkNvZGluZwkJMHg0MAotI2RlZmluZSBiSFRTSUcyX051bU9mSFRMVEYJCTB4MzAwCi0jZGVmaW5lIGJIVFNJRzJfQ1JDOAkJCTB4M2ZjCi0jZGVmaW5lIGJIVFNJRzFfTUNTCQkJMHg3ZgotI2RlZmluZSBiSFRTSUcxX0JhbmRXaWR0aAkJMHg4MAotI2RlZmluZSBiSFRTSUcxX0hUTGVuZ3RoCQkweGZmZmYKLSNkZWZpbmUgYkxTSUdfUmF0ZQkJCTB4ZgotI2RlZmluZSBiTFNJR19SZXNlcnZlZAkJCTB4MTAKLSNkZWZpbmUgYkxTSUdfTGVuZ3RoCQkJMHgxZmZmZQotI2RlZmluZSBiTFNJR19QYXJpdHkJCQkweDIwCi0jZGVmaW5lIGJDQ0tSeFBoYXNlCQkJMHg0Ci0KLSNkZWZpbmUgYkxTU0lSZWFkQWRkcmVzcwkJMHg3ZjgwMDAwMCAgIC8qICBUNjUgUkYgKi8KLQotI2RlZmluZSBiTFNTSVJlYWRFZGdlCQkJMHg4MDAwMDAwMCAgIC8qIExTU0kgIlJlYWQiIGVkZ2Ugc2lnbmFsICovCi0KLSNkZWZpbmUgYkxTU0lSZWFkQmFja0RhdGEJCTB4ZmZmZmYJCS8qICBUNjUgUkYgKi8KLQotI2RlZmluZSBiTFNTSVJlYWRPS0ZsYWcJCQkweDEwMDAJLyogIFVzZWxlc3Mgbm93ICovCi0jZGVmaW5lIGJDQ0tTYW1wbGVSYXRlCQkJMHg4ICAgICAgIC8qIDA6IDQ0TUh6LCAxOjg4TUh6ICovCi0jZGVmaW5lIGJSZWd1bGF0b3IwU3RhbmRieQkJMHgxCi0jZGVmaW5lIGJSZWd1bGF0b3JQTExTdGFuZGJ5CQkweDIKLSNkZWZpbmUgYlJlZ3VsYXRvcjFTdGFuZGJ5CQkweDQKLSNkZWZpbmUgYlBMTFBvd2VyVXAJCQkweDgKLSNkZWZpbmUgYkRQTExQb3dlclVwCQkJMHgxMAotI2RlZmluZSBiREExMFBvd2VyVXAJCQkweDIwCi0jZGVmaW5lIGJBRDdQb3dlclVwCQkJMHgyMDAKLSNkZWZpbmUgYkRBNlBvd2VyVXAJCQkweDIwMDAKLSNkZWZpbmUgYlh0YWxQb3dlclVwCQkJMHg0MDAwCi0jZGVmaW5lIGI0ME1EQ2xrUG93ZXJVUAkJCTB4ODAwMAotI2RlZmluZSBiREE2RGVidWdNb2RlCQkJMHgyMDAwMAotI2RlZmluZSBiREE2U3dpbmcJCQkweDM4MDAwMAotCi0jZGVmaW5lIGJBRENsa1BoYXNlCQkJMHg0MDAwMDAwCS8qICBSZWcgMHg4ODAgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEgMjAvNDAgQ0NLIHN1cHBvcnQgc3dpdGNoIDQwLzgwIEJCIE1IWiAqLwotCi0jZGVmaW5lIGI4ME1DbGtEZWxheQkJCTB4MTgwMDAwMDAJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYkFGRVdhdGNoRG9nRW5hYmxlCQkweDIwMDAwMDAwCi0KLSNkZWZpbmUgYlh0YWxDYXAwMQkJCTB4YzAwMDAwMDAJLyogIFJlZyAweDg4NCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMiBDcnlzdGFsIGNhcCAqLwotI2RlZmluZSBiWHRhbENhcDIzCQkJMHgzCi0jZGVmaW5lIGJYdGFsQ2FwOTJ4CQkJMHgwZjAwMDAwMAotI2RlZmluZQkJYlh0YWxDYXAJCTB4MGYwMDAwMDAKLQotI2RlZmluZSBiSW50RGlmQ2xrRW5hYmxlCQkweDQwMAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiRXh0U2lnQ2xrRW5hYmxlCQkweDgwMAotI2RlZmluZSBiQmFuZGdhcE1iaWFzUG93ZXJVcAkJMHgxMDAwMAotI2RlZmluZSBiQUQxMVNIR2FpbgkJCTB4YzAwMDAKLSNkZWZpbmUgYkFEMTFJbnB1dFJhbmdlCQkJMHg3MDAwMDAKLSNkZWZpbmUgYkFEMTFPUEN1cnJlbnQJCQkweDM4MDAwMDAKLSNkZWZpbmUgYklQYXRoTG9vcGJhY2sJCQkweDQwMDAwMDAKLSNkZWZpbmUgYlFQYXRoTG9vcGJhY2sJCQkweDgwMDAwMDAKLSNkZWZpbmUgYkFGRUxvb3BiYWNrCQkJMHgxMDAwMDAwMAotI2RlZmluZSBiREExMFN3aW5nCQkJMHg3ZTAKLSNkZWZpbmUgYkRBMTBSZXZlcnNlCQkJMHg4MDAKLSNkZWZpbmUgYkRBQ2xrU291cmNlCQkJMHgxMDAwCi0jZGVmaW5lIGJBRDdJbnB1dFJhbmdlCQkJMHg2MDAwCi0jZGVmaW5lIGJBRDdHYWluCQkJMHgzODAwMAotI2RlZmluZSBiQUQ3T3V0cHV0Q01Nb2RlCQkweDQwMDAwCi0jZGVmaW5lIGJBRDdJbnB1dENNTW9kZQkJCTB4MzgwMDAwCi0jZGVmaW5lIGJBRDdDdXJyZW50CQkJMHhjMDAwMDAKLSNkZWZpbmUgYlJlZ3VsYXRvckFkanVzdAkJMHg3MDAwMDAwCi0jZGVmaW5lIGJBRDExUG93ZXJVcEF0VHgJCTB4MQotI2RlZmluZSBiREExMFBTQXRUeAkJCTB4MTAKLSNkZWZpbmUgYkFEMTFQb3dlclVwQXRSeAkJMHgxMDAKLSNkZWZpbmUgYkRBMTBQU0F0UngJCQkweDEwMDAKLSNkZWZpbmUgYkNDS1J4QUdDRm9ybWF0CQkJMHgyMDAKLSNkZWZpbmUgYlBTREZGVFNhbXBsZXBQb2ludAkJMHhjMDAwCi0jZGVmaW5lIGJQU0RBdmVyYWdlTnVtCQkJMHgzMDAwCi0jZGVmaW5lIGJJUVBhdGhDb250cm9sCQkJMHhjMDAKLSNkZWZpbmUgYlBTREZyZXEJCQkweDNmZgotI2RlZmluZSBiUFNEQW50ZW5uYVBhdGgJCQkweDMwCi0jZGVmaW5lIGJQU0RJUVN3aXRjaAkJCTB4NDAKLSNkZWZpbmUgYlBTRFJ4VHJpZ2dlcgkJCTB4NDAwMDAwCi0jZGVmaW5lIGJQU0RUeFRyaWdnZXIJCQkweDgwMDAwMDAwCi0jZGVmaW5lIGJQU0RTaW5lVG9uZVNjYWxlCQkweDdmMDAwMDAwCi0jZGVmaW5lIGJQU0RSZXBvcnQJCQkweGZmZmYKLQotLyogIDMuIFBhZ2U5KDB4OTAwKSAqLwotI2RlZmluZSBiT0ZETVR4U0MJCQkweDMwMDAwMDAwCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJDQ0tUeE9uCQkJMHgxCi0jZGVmaW5lIGJPRkRNVHhPbgkJCTB4MgotI2RlZmluZSBiRGVidWdQYWdlCQkJMHhmZmYgIC8qIHJlc2V0IGRlYnVnIHBhZ2UgYW5kIGFsc28gSFdvcmQsIExXb3JkICovCi0jZGVmaW5lIGJEZWJ1Z0l0ZW0JCQkweGZmICAgLyogcmVzZXQgZGVidWcgcGFnZSBhbmQgTFdvcmQgKi8KLSNkZWZpbmUgYkFudEwJCQkJMHgxMAotI2RlZmluZSBiQW50Tm9uSFQJCQkweDEwMAotI2RlZmluZSBiQW50SFQxCQkJCTB4MTAwMAotI2RlZmluZSBiQW50SFQyCQkJCTB4MTAwMDAKLSNkZWZpbmUgYkFudEhUMVMxCQkJMHgxMDAwMDAKLSNkZWZpbmUgYkFudE5vbkhUUzEJCQkweDEwMDAwMDAKLQotLyogIDQuIFBhZ2VBKDB4QTAwKSAqLwotI2RlZmluZSBiQ0NLQkJNb2RlCQkJMHgzCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJDQ0tUeFBvd2VyU2F2aW5nCQkweDgwCi0jZGVmaW5lIGJDQ0tSeFBvd2VyU2F2aW5nCQkweDQwCi0KLSNkZWZpbmUgYkNDS1NpZGVCYW5kCQkJMHgxMAkvKiAgUmVnIDB4YTAwIHJDQ0swX1N5c3RlbSAyMC80MCBzd2l0Y2ggKi8KLQotI2RlZmluZSBiQ0NLU2NyYW1ibGUJCQkweDgJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYkNDS0FudERpdmVyc2l0eQkJMHg4MDAwCi0jZGVmaW5lIGJDQ0tDYXJyaWVyUmVjb3ZlcnkJCTB4NDAwMAotI2RlZmluZSBiQ0NLVHhSYXRlCQkJMHgzMDAwCi0jZGVmaW5lIGJDQ0tEQ0NhbmNlbAkJCTB4MDgwMAotI2RlZmluZSBiQ0NLSVNJQ2FuY2VsCQkJMHgwNDAwCi0jZGVmaW5lIGJDQ0tNYXRjaEZpbHRlcgkJCTB4MDIwMAotI2RlZmluZSBiQ0NLRXF1YWxpemVyCQkJMHgwMTAwCi0jZGVmaW5lIGJDQ0tQcmVhbWJsZURldGVjdAkJMHg4MDAwMDAKLSNkZWZpbmUgYkNDS0Zhc3RGYWxzZUNDQQkJMHg0MDAwMDAKLSNkZWZpbmUgYkNDS0NoRXN0U3RhcnQJCQkweDMwMDAwMAotI2RlZmluZSBiQ0NLQ0NBQ291bnQJCQkweDA4MDAwMAotI2RlZmluZSBiQ0NLY3NfbGltCQkJMHgwNzAwMDAKLSNkZWZpbmUgYkNDS0Jpc3RNb2RlCQkJMHg4MDAwMDAwMAotI2RlZmluZSBiQ0NLQ0NBTWFzawkJCTB4NDAwMDAwMDAKLSNkZWZpbmUgYkNDS1R4REFDUGhhc2UJCQkweDQKLSNkZWZpbmUgYkNDS1J4QURDUGhhc2UJCQkweDIwMDAwMDAwICAgLyogcl9yeF9jbGsgKi8KLSNkZWZpbmUgYkNDS3JfY3BfbW9kZTAJCQkweDAxMDAKLSNkZWZpbmUgYkNDS1R4RENPZmZzZXQJCQkweGYwCi0jZGVmaW5lIGJDQ0tSeERDT2Zmc2V0CQkJMHhmCi0jZGVmaW5lIGJDQ0tDQ0FNb2RlCQkJMHhjMDAwCi0jZGVmaW5lIGJDQ0tGYWxzZUNTX2xpbQkJCTB4M2YwMAotI2RlZmluZSBiQ0NLQ1NfcmF0aW8JCQkweGMwMDAwMAotI2RlZmluZSBiQ0NLQ29yZ0JpdF9zZWwJCQkweDMwMDAwMAotI2RlZmluZSBiQ0NLUERfbGltCQkJMHgwZjAwMDAKLSNkZWZpbmUgYkNDS05ld0NDQQkJCTB4ODAwMDAwMDAKLSNkZWZpbmUgYkNDS1J4SFBvZklHCQkJMHg4MDAwCi0jZGVmaW5lIGJDQ0tSeElHCQkJMHg3ZjAwCi0jZGVmaW5lIGJDQ0tMTkFQb2xhcml0eQkJCTB4ODAwMDAwCi0jZGVmaW5lIGJDQ0tSeDFzdEdhaW4JCQkweDdmMDAwMAotI2RlZmluZSBiQ0NLUkZFeHRlbmQJCQkweDIwMDAwMDAwIC8qIENDSyBSeCBJaW5pdGFsIGdhaW4gcG9sYXJpdHkgKi8KLSNkZWZpbmUgYkNDS1J4QUdDU2F0TGV2ZWwJCTB4MWYwMDAwMDAKLSNkZWZpbmUgYkNDS1J4QUdDU2F0Q291bnQJCTB4ZTAKLSNkZWZpbmUgYkNDS1J4UkZTZXR0bGUJCQkweDFmICAgICAgIC8qIEFHQ3NhbXBfZGx5ICovCi0jZGVmaW5lIGJDQ0tGaXhlZFJ4QUdDCQkJMHg4MDAwCi0vKiBkZWZpbmUgYkNDS1J4QUdDRm9ybWF0CQkweDQwMDAgICByZW1vdmUgdG8gSFNTSSByZWdpc3RlciAweDgyNCAqLwotI2RlZmluZSBiQ0NLQW50ZW5uYVBvbGFyaXR5CQkweDIwMDAKLSNkZWZpbmUgYkNDS1R4RmlsdGVyVHlwZQkJMHgwYzAwCi0jZGVmaW5lIGJDQ0tSeEFHQ1JlcG9ydFR5cGUJCTB4MDMwMAotI2RlZmluZSBiQ0NLUnhEQUdDRW4JCQkweDgwMDAwMDAwCi0jZGVmaW5lIGJDQ0tSeERBR0NQZXJpb2QJCTB4MjAwMDAwMDAKLSNkZWZpbmUgYkNDS1J4REFHQ1NhdExldmVsCQkweDFmMDAwMDAwCi0jZGVmaW5lIGJDQ0tUaW1pbmdSZWNvdmVyeQkJMHg4MDAwMDAKLSNkZWZpbmUgYkNDS1R4QzAJCQkweDNmMDAwMAotI2RlZmluZSBiQ0NLVHhDMQkJCTB4M2YwMDAwMDAKLSNkZWZpbmUgYkNDS1R4QzIJCQkweDNmCi0jZGVmaW5lIGJDQ0tUeEMzCQkJMHgzZjAwCi0jZGVmaW5lIGJDQ0tUeEM0CQkJMHgzZjAwMDAKLSNkZWZpbmUgYkNDS1R4QzUJCQkweDNmMDAwMDAwCi0jZGVmaW5lIGJDQ0tUeEM2CQkJMHgzZgotI2RlZmluZSBiQ0NLVHhDNwkJCTB4M2YwMAotI2RlZmluZSBiQ0NLRGVidWdQb3J0CQkJMHhmZjAwMDAKLSNkZWZpbmUgYkNDS0RBQ0RlYnVnCQkJMHgwZjAwMDAwMAotI2RlZmluZSBiQ0NLRmFsc2VBbGFybUVuYWJsZQkJMHg4MDAwCi0jZGVmaW5lIGJDQ0tGYWxzZUFsYXJtUmVhZAkJMHg0MDAwCi0jZGVmaW5lIGJDQ0tUUlNTSQkJCTB4N2YKLSNkZWZpbmUgYkNDS1J4QUdDUmVwb3J0CQkJMHhmZQotI2RlZmluZSBiQ0NLUnhSZXBvcnRfQW50U2VsCQkweDgwMDAwMDAwCi0jZGVmaW5lIGJDQ0tSeFJlcG9ydF9NRk9mZgkJMHg0MDAwMDAwMAotI2RlZmluZSBiQ0NLUnhSeFJlcG9ydF9TUUxvc3MJCTB4MjAwMDAwMDAKLSNkZWZpbmUgYkNDS1J4UmVwb3J0X1BrdGxvc3MJCTB4MTAwMDAwMDAKLSNkZWZpbmUgYkNDS1J4UmVwb3J0X0xvY2tlZGJpdAkJMHgwODAwMDAwMAotI2RlZmluZSBiQ0NLUnhSZXBvcnRfUmF0ZUVycm9yCQkweDA0MDAwMDAwCi0jZGVmaW5lIGJDQ0tSeFJlcG9ydF9SeFJhdGUJCTB4MDMwMDAwMDAKLSNkZWZpbmUgYkNDS1J4RkFDb3VudGVyTG93ZXIJCTB4ZmYKLSNkZWZpbmUgYkNDS1J4RkFDb3VudGVyVXBwZXIJCTB4ZmYwMDAwMDAKLSNkZWZpbmUgYkNDS1J4SFBBR0NTdGFydAkJMHhlMDAwCi0jZGVmaW5lIGJDQ0tSeEhQQUdDRmluYWwJCTB4MWMwMAotI2RlZmluZSBiQ0NLUnhGYWxzZUFsYXJtRW5hYmxlCQkweDgwMDAKLSNkZWZpbmUgYkNDS0ZBQ291bnRlckZyZWV6ZQkJMHg0MDAwCi0jZGVmaW5lIGJDQ0tUeFBhdGhTZWwJCQkweDEwMDAwMDAwCi0jZGVmaW5lIGJDQ0tEZWZhdWx0UnhQYXRoCQkweGMwMDAwMDAKLSNkZWZpbmUgYkNDS09wdGlvblJ4UGF0aAkJMHgzMDAwMDAwCi0KLS8qICA1LiBQYWdlQygweEMwMCkgKi8KLSNkZWZpbmUgYk51bU9mU1RGCQkJMHgzCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJTaGlmdF9MCQkJMHhjMAotI2RlZmluZSBiR0lfVEgJCQkJMHhjCi0jZGVmaW5lIGJSeFBhdGhBCQkJMHgxCi0jZGVmaW5lIGJSeFBhdGhCCQkJMHgyCi0jZGVmaW5lIGJSeFBhdGhDCQkJMHg0Ci0jZGVmaW5lIGJSeFBhdGhECQkJMHg4Ci0jZGVmaW5lIGJUeFBhdGhBCQkJMHgxCi0jZGVmaW5lIGJUeFBhdGhCCQkJMHgyCi0jZGVmaW5lIGJUeFBhdGhDCQkJMHg0Ci0jZGVmaW5lIGJUeFBhdGhECQkJMHg4Ci0jZGVmaW5lIGJUUlNTSUZyZXEJCQkweDIwMAotI2RlZmluZSBiQURDQmFja29mZgkJCTB4MzAwMAotI2RlZmluZSBiREZJUkJhY2tvZmYJCQkweGMwMDAKLSNkZWZpbmUgYlRSU1NJTGF0Y2hQaGFzZQkJMHgxMDAwMAotI2RlZmluZSBiUnhJRENPZmZzZXQJCQkweGZmCi0jZGVmaW5lIGJSeFFEQ09mZnNldAkJCTB4ZmYwMAotI2RlZmluZSBiUnhERklSTW9kZQkJCTB4MTgwMDAwMAotI2RlZmluZSBiUnhEQ05GVHlwZQkJCTB4ZTAwMDAwMAotI2RlZmluZSBiUlhJUUltYl9BCQkJMHgzZmYKLSNkZWZpbmUgYlJYSVFJbWJfQgkJCTB4ZmMwMAotI2RlZmluZSBiUlhJUUltYl9DCQkJMHgzZjAwMDAKLSNkZWZpbmUgYlJYSVFJbWJfRAkJCTB4ZmZjMDAwMDAKLSNkZWZpbmUgYkRDX2RjX05vdGNoCQkJMHg2MDAwMAotI2RlZmluZSBiUnhOQklOb3RjaAkJCTB4MWYwMDAwMDAKLSNkZWZpbmUgYlBEX1RICQkJCTB4ZgotI2RlZmluZSBiUERfVEhfT3B0MgkJCTB4YzAwMAotI2RlZmluZSBiUFdFRF9USAkJCTB4NzAwCi0jZGVmaW5lIGJJZk1GX1dpbl9MCQkJMHg4MDAKLSNkZWZpbmUgYlBEX09wdGlvbgkJCTB4MTAwMAotI2RlZmluZSBiTUZfV2luX0wJCQkweGUwMDAKLSNkZWZpbmUgYkJXX1NlYXJjaF9MCQkJMHgzMDAwMAotI2RlZmluZSBid2luX2VuaF9MCQkJMHhjMDAwMAotI2RlZmluZSBiQldfVEgJCQkJMHg3MDAwMDAKLSNkZWZpbmUgYkVEX1RIMgkJCQkweDM4MDAwMDAKLSNkZWZpbmUgYkJXX29wdGlvbgkJCTB4NDAwMDAwMAotI2RlZmluZSBiUmF0aW9fVEgJCQkweDE4MDAwMDAwCi0jZGVmaW5lIGJXaW5kb3dfTAkJCTB4ZTAwMDAwMDAKLSNkZWZpbmUgYlNCRF9PcHRpb24JCQkweDEKLSNkZWZpbmUgYkZyYW1lX1RICQkJMHgxYwotI2RlZmluZSBiRlNfT3B0aW9uCQkJMHg2MAotI2RlZmluZSBiRENfU2xvcGVfY2hlY2sJCQkweDgwCi0jZGVmaW5lIGJGR3VhcmRfQ291bnRlcl9EQ19MCQkweGUwMAotI2RlZmluZSBiRnJhbWVfV2VpZ2h0X1Nob3J0CQkweDcwMDAKLSNkZWZpbmUgYlN1Yl9UdW5lCQkJMHhlMDAwMDAKLSNkZWZpbmUgYkZyYW1lX0RDX0xlbmd0aAkJMHhlMDAwMDAwCi0jZGVmaW5lIGJTQkRfc3RhcnRfb2Zmc2V0CQkweDMwMDAwMDAwCi0jZGVmaW5lIGJGcmFtZV9USF8yCQkJMHg3Ci0jZGVmaW5lIGJGcmFtZV9HSTJfVEgJCQkweDM4Ci0jZGVmaW5lIGJHSTJfU3luY19lbgkJCTB4NDAKLSNkZWZpbmUgYlNhcmNoX1Nob3J0X0Vhcmx5CQkweDMwMAotI2RlZmluZSBiU2FyY2hfU2hvcnRfTGF0ZQkJMHhjMDAKLSNkZWZpbmUgYlNhcmNoX0dJMl9MYXRlCQkJMHg3MDAwMAotI2RlZmluZSBiQ0ZPQW50U3VtCQkJMHgxCi0jZGVmaW5lIGJDRk9BY2MJCQkJMHgyCi0jZGVmaW5lIGJDRk9TdGFydE9mZnNldAkJCTB4YwotI2RlZmluZSBiQ0ZPTG9va0JhY2sJCQkweDcwCi0jZGVmaW5lIGJDRk9TdW1XZWlnaHQJCQkweDgwCi0jZGVmaW5lIGJEQUdDRW5hYmxlCQkJMHgxMDAwMAotI2RlZmluZSBiVFhJUUltYl9BCQkJMHgzZmYKLSNkZWZpbmUgYlRYSVFJbWJfQgkJCTB4ZmMwMAotI2RlZmluZSBiVFhJUUltYl9DCQkJMHgzZjAwMDAKLSNkZWZpbmUgYlRYSVFJbWJfRAkJCTB4ZmZjMDAwMDAKLSNkZWZpbmUgYlR4SURDT2Zmc2V0CQkJMHhmZgotI2RlZmluZSBiVHhRRENPZmZzZXQJCQkweGZmMDAKLSNkZWZpbmUgYlR4REZJUk1vZGUJCQkweDEwMDAwCi0jZGVmaW5lIGJUeFBlc3Vkb05vaXNlT24JCTB4NDAwMDAwMAotI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZV9BCQkweGZmCi0jZGVmaW5lIGJUeFBlc3Vkb05vaXNlX0IJCTB4ZmYwMAotI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZV9DCQkweGZmMDAwMAotI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZV9ECQkweGZmMDAwMDAwCi0jZGVmaW5lIGJDQ0FEcm9wT3B0aW9uCQkJMHgyMDAwMAotI2RlZmluZSBiQ0NBRHJvcFRocmVzCQkJMHhmZmYwMDAwMAotI2RlZmluZSBiRURDQ0FfSAkJCTB4ZgotI2RlZmluZSBiRURDQ0FfTAkJCTB4ZjAKLSNkZWZpbmUgYkxhbWJkYV9FRAkJCTB4MzAwCi0jZGVmaW5lIGJSeEluaXRpYWxHYWluCQkJMHg3ZgotI2RlZmluZSBiUnhBbnREaXZFbgkJCTB4ODAKLSNkZWZpbmUgYlJ4QUdDQWRkcmVzc0ZvckxOQQkJMHg3ZjAwCi0jZGVmaW5lIGJSeEhpZ2hQb3dlckZsb3cJCTB4ODAwMAotI2RlZmluZSBiUnhBR0NGcmVlemVUaHJlcwkJMHhjMDAwMAotI2RlZmluZSBiUnhGcmVlemVTdGVwX0FHQzEJCTB4MzAwMDAwCi0jZGVmaW5lIGJSeEZyZWV6ZVN0ZXBfQUdDMgkJMHhjMDAwMDAKLSNkZWZpbmUgYlJ4RnJlZXplU3RlcF9BR0MzCQkweDMwMDAwMDAKLSNkZWZpbmUgYlJ4RnJlZXplU3RlcF9BR0MwCQkweGMwMDAwMDAKLSNkZWZpbmUgYlJ4UnNzaV9DbXBfRW4JCQkweDEwMDAwMDAwCi0jZGVmaW5lIGJSeFF1aWNrQUdDRW4JCQkweDIwMDAwMDAwCi0jZGVmaW5lIGJSeEFHQ0ZyZWV6ZVRocmVzTW9kZQkJMHg0MDAwMDAwMAotI2RlZmluZSBiUnhPdmVyRmxvd0NoZWNrVHlwZQkJMHg4MDAwMDAwMAotI2RlZmluZSBiUnhBR0NTaGlmdAkJCTB4N2YKLSNkZWZpbmUgYlRSU1dfVHJpX09ubHkJCQkweDgwCi0jZGVmaW5lIGJQb3dlclRocmVzCQkJMHgzMDAKLSNkZWZpbmUgYlJ4QUdDRW4JCQkweDEKLSNkZWZpbmUgYlJ4QUdDVG9nZXRoZXJFbgkJMHgyCi0jZGVmaW5lIGJSeEFHQ01pbgkJCTB4NAotI2RlZmluZSBiUnhIUF9JbmkJCQkweDcKLSNkZWZpbmUgYlJ4SFBfVFJMTkEJCQkweDcwCi0jZGVmaW5lIGJSeEhQX1JTU0kJCQkweDcwMAotI2RlZmluZSBiUnhIUF9CQlAxCQkJMHg3MDAwCi0jZGVmaW5lIGJSeEhQX0JCUDIJCQkweDcwMDAwCi0jZGVmaW5lIGJSeEhQX0JCUDMJCQkweDcwMDAwMAotI2RlZmluZSBiUlNTSV9ICQkJCTB4N2YwMDAwICAgICAvKiB0aGUgdGhyZXNob2xkIGZvciBoaWdoIHBvd2VyICovCi0jZGVmaW5lIGJSU1NJX0dlbgkJCTB4N2YwMDAwMDAgICAvKiB0aGUgdGhyZXNob2xkIGZvciBhbnQgZGl2ZXJzaXR5ICovCi0jZGVmaW5lIGJSeFNldHRsZV9UUlNXCQkJMHg3Ci0jZGVmaW5lIGJSeFNldHRsZV9MTkEJCQkweDM4Ci0jZGVmaW5lIGJSeFNldHRsZV9SU1NJCQkJMHgxYzAKLSNkZWZpbmUgYlJ4U2V0dGxlX0JCUAkJCTB4ZTAwCi0jZGVmaW5lIGJSeFNldHRsZV9SeEhQCQkJMHg3MDAwCi0jZGVmaW5lIGJSeFNldHRsZV9BbnRTV19SU1NJCQkweDM4MDAwCi0jZGVmaW5lIGJSeFNldHRsZV9BbnRTVwkJCTB4YzAwMDAKLSNkZWZpbmUgYlJ4UHJvY2Vzc1RpbWVfREFHQwkJMHgzMDAwMDAKLSNkZWZpbmUgYlJ4U2V0dGxlX0hTU0kJCQkweDQwMDAwMAotI2RlZmluZSBiUnhQcm9jZXNzVGltZV9CQlBQVwkJMHg4MDAwMDAKLSNkZWZpbmUgYlJ4QW50ZW5uYVBvd2VyU2hpZnQJCTB4MzAwMDAwMAotI2RlZmluZSBiUlNTSVRhYmxlU2VsZWN0CQkweGMwMDAwMDAKLSNkZWZpbmUgYlJ4SFBfRmluYWwJCQkweDcwMDAwMDAKLSNkZWZpbmUgYlJ4SFRTZXR0bGVfQkJQCQkJMHg3Ci0jZGVmaW5lIGJSeEhUU2V0dGxlX0hTU0kJCTB4OAotI2RlZmluZSBiUnhIVFNldHRsZV9SeEhQCQkweDcwCi0jZGVmaW5lIGJSeEhUU2V0dGxlX0JCUFBXCQkweDgwCi0jZGVmaW5lIGJSeEhUU2V0dGxlX0lkbGUJCTB4MzAwCi0jZGVmaW5lIGJSeEhUU2V0dGxlX1Jlc2VydmVkCQkweDFjMDAKLSNkZWZpbmUgYlJ4SFRSeEhQRW4JCQkweDgwMDAKLSNkZWZpbmUgYlJ4SFRBR0NGcmVlemVUaHJlcwkJMHgzMDAwMAotI2RlZmluZSBiUnhIVEFHQ1RvZ2V0aGVyRW4JCTB4NDAwMDAKLSNkZWZpbmUgYlJ4SFRBR0NNaW4JCQkweDgwMDAwCi0jZGVmaW5lIGJSeEhUQUdDRW4JCQkweDEwMDAwMAotI2RlZmluZSBiUnhIVERBR0NFbgkJCTB4MjAwMDAwCi0jZGVmaW5lIGJSeEhUUnhIUF9CQlAJCQkweDFjMDAwMDAKLSNkZWZpbmUgYlJ4SFRSeEhQX0ZpbmFsCQkJMHhlMDAwMDAwMAotI2RlZmluZSBiUnhQV1JhdGlvVEgJCQkweDMKLSNkZWZpbmUgYlJ4UFdSYXRpb0VuCQkJMHg0Ci0jZGVmaW5lIGJSeE1GSG9sZAkJCTB4MzgwMAotI2RlZmluZSBiUnhQRF9EZWxheV9USDEJCQkweDM4Ci0jZGVmaW5lIGJSeFBEX0RlbGF5X1RIMgkJCTB4MWMwCi0jZGVmaW5lIGJSeFBEX0RDX0NPVU5UX01BWAkJMHg2MDAKLS8qIGRlZmluZSBiUnhNRl9Ib2xkICAgICAgICAgICAJICAgIDB4MzgwMCAqLwotI2RlZmluZSBiUnhQRF9EZWxheV9USAkJCTB4ODAwMAotI2RlZmluZSBiUnhQcm9jZXNzX0RlbGF5CQkweGYwMDAwCi0jZGVmaW5lIGJSeFNlYXJjaHJhbmdlX0dJMl9FYXJseQkweDcwMDAwMAotI2RlZmluZSBiUnhGcmFtZV9HdWFyZF9Db3VudGVyX0wJMHgzODAwMDAwCi0jZGVmaW5lIGJSeFNHSV9HdWFyZF9MCQkJMHhjMDAwMDAwCi0jZGVmaW5lIGJSeFNHSV9TZWFyY2hfTAkJCTB4MzAwMDAwMDAKLSNkZWZpbmUgYlJ4U0dJX1RICQkJMHhjMDAwMDAwMAotI2RlZmluZSBiREZTQ250MAkJCTB4ZmYKLSNkZWZpbmUgYkRGU0NudDEJCQkweGZmMDAKLSNkZWZpbmUgYkRGU0ZsYWcJCQkweGYwMDAwCi0jZGVmaW5lIGJNRldlaWdodFN1bQkJCTB4MzAwMDAwCi0jZGVmaW5lIGJNaW5JZHhUSAkJCTB4N2YwMDAwMDAKLSNkZWZpbmUgYkRBRm9ybWF0CQkJMHg0MDAwMAotI2RlZmluZSBiVHhDaEVtdUVuYWJsZQkJCTB4MDEwMDAwMDAKLSNkZWZpbmUgYlRSU1dJc29sYXRpb25fQQkJMHg3ZgotI2RlZmluZSBiVFJTV0lzb2xhdGlvbl9CCQkweDdmMDAKLSNkZWZpbmUgYlRSU1dJc29sYXRpb25fQwkJMHg3ZjAwMDAKLSNkZWZpbmUgYlRSU1dJc29sYXRpb25fRAkJMHg3ZjAwMDAwMAotI2RlZmluZSBiRXh0TE5BR2FpbgkJCTB4N2MwMAotCi0vKiAgNi4gUGFnZUUoMHhFMDApICovCi0jZGVmaW5lIGJTVEJDRW4JCQkJMHg0CS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJBbnRlbm5hTWFwcGluZwkJCTB4MTAKLSNkZWZpbmUgYk5zcwkJCQkweDIwCi0jZGVmaW5lIGJDRk9BbnRTdW1ECQkJMHgyMDAKLSNkZWZpbmUgYlBIWUNvdW50ZXJSZXNldAkJMHg4MDAwMDAwCi0jZGVmaW5lIGJDRk9SZXBvcnRHZXQJCQkweDQwMDAwMDAKLSNkZWZpbmUgYk9GRE1Db250aW51ZVR4CQkJMHgxMDAwMDAwMAotI2RlZmluZSBiT0ZETVNpbmdsZUNhcnJpZXIJCTB4MjAwMDAwMDAKLSNkZWZpbmUgYk9GRE1TaW5nbGVUb25lCQkJMHg0MDAwMDAwMAotLyogZGVmaW5lIGJSeFBhdGgxICAgICAgICAgICAgICAgICAweDAxICovCi0vKiBkZWZpbmUgYlJ4UGF0aDIgICAgICAgICAgICAgICAgIDB4MDIgKi8KLS8qIGRlZmluZSBiUnhQYXRoMyAgICAgICAgICAgICAgICAgMHgwNCAqLwotLyogZGVmaW5lIGJSeFBhdGg0ICAgICAgICAgICAgICAgICAweDA4ICovCi0vKiBkZWZpbmUgYlR4UGF0aDEgICAgICAgICAgICAgICAgIDB4MTAgKi8KLS8qIGRlZmluZSBiVHhQYXRoMiAgICAgICAgICAgICAgICAgMHgyMCAqLwotI2RlZmluZSBiSFREZXRlY3QJCQkweDEwMAotI2RlZmluZSBiQ0ZPRW4JCQkJMHgxMDAwMAotI2RlZmluZSBiQ0ZPVmFsdWUJCQkweGZmZjAwMDAwCi0jZGVmaW5lIGJTaWdUb25lX1JlCQkJMHgzZgotI2RlZmluZSBiU2lnVG9uZV9JbQkJCTB4N2YwMAotI2RlZmluZSBiQ291bnRlcl9DQ0EJCQkweGZmZmYKLSNkZWZpbmUgYkNvdW50ZXJfUGFyaXR5RmFpbAkJMHhmZmZmMDAwMAotI2RlZmluZSBiQ291bnRlcl9SYXRlSWxsZWdhbAkJMHhmZmZmCi0jZGVmaW5lIGJDb3VudGVyX0NSQzhGYWlsCQkweGZmZmYwMDAwCi0jZGVmaW5lIGJDb3VudGVyX01DU05vU3VwcG9ydAkJMHhmZmZmCi0jZGVmaW5lIGJDb3VudGVyX0Zhc3RTeW5jCQkweGZmZmYKLSNkZWZpbmUgYlNob3J0Q0ZPCQkJMHhmZmYKLSNkZWZpbmUgYlNob3J0Q0ZPVExlbmd0aAkJMTIgICAvKiB0b3RhbCAqLwotI2RlZmluZSBiU2hvcnRDRk9GTGVuZ3RoCQkxMSAgIC8qIGZyYWN0aW9uICovCi0jZGVmaW5lIGJMb25nQ0ZPCQkJMHg3ZmYKLSNkZWZpbmUgYkxvbmdDRk9UTGVuZ3RoCQkJMTEKLSNkZWZpbmUgYkxvbmdDRk9GTGVuZ3RoCQkJMTEKLSNkZWZpbmUgYlRhaWxDRk8JCQkweDFmZmYKLSNkZWZpbmUgYlRhaWxDRk9UTGVuZ3RoCQkJMTMKLSNkZWZpbmUgYlRhaWxDRk9GTGVuZ3RoCQkJMTIKLSNkZWZpbmUgYm1heF9lbl9wd2RCCQkJMHhmZmZmCi0jZGVmaW5lIGJDQ19wb3dlcl9kQgkJCTB4ZmZmZjAwMDAKLSNkZWZpbmUgYm5vaXNlX3B3ZEIJCQkweGZmZmYKLSNkZWZpbmUgYlBvd2VyTWVhc1RMZW5ndGgJCTEwCi0jZGVmaW5lIGJQb3dlck1lYXNGTGVuZ3RoCQkzCi0jZGVmaW5lIGJSeF9IVF9CVwkJCTB4MQotI2RlZmluZSBiUnhTQwkJCQkweDYKLSNkZWZpbmUgYlJ4X0hUCQkJCTB4OAotI2RlZmluZSBiTkJfaW50Zl9kZXRfb24JCQkweDEKLSNkZWZpbmUgYkludGZfd2luX2xlbl9jZmcJCTB4MzAKLSNkZWZpbmUgYk5CX0ludGZfVEhfY2ZnCQkJMHgxYzAKLSNkZWZpbmUgYlJGR2FpbgkJCQkweDNmCi0jZGVmaW5lIGJUYWJsZVNlbAkJCTB4NDAKLSNkZWZpbmUgYlRSU1cJCQkJMHg4MAotI2RlZmluZSBiUnhTTlJfQQkJCTB4ZmYKLSNkZWZpbmUgYlJ4U05SX0IJCQkweGZmMDAKLSNkZWZpbmUgYlJ4U05SX0MJCQkweGZmMDAwMAotI2RlZmluZSBiUnhTTlJfRAkJCTB4ZmYwMDAwMDAKLSNkZWZpbmUgYlNOUkVWTVRMZW5ndGgJCQk4Ci0jZGVmaW5lIGJTTlJFVk1GTGVuZ3RoCQkJMQotI2RlZmluZSBiQ1NJMXN0CQkJCTB4ZmYKLSNkZWZpbmUgYkNTSTJuZAkJCQkweGZmMDAKLSNkZWZpbmUgYlJ4RVZNMXN0CQkJMHhmZjAwMDAKLSNkZWZpbmUgYlJ4RVZNMm5kCQkJMHhmZjAwMDAwMAotI2RlZmluZSBiU0lHRVZNCQkJCTB4ZmYKLSNkZWZpbmUgYlBXREIJCQkJMHhmZjAwCi0jZGVmaW5lIGJTR0lFTgkJCQkweDEwMDAwCi0KLSNkZWZpbmUgYlNGYWN0b3JRQU0xCQkJMHhmCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJTRmFjdG9yUUFNMgkJCTB4ZjAKLSNkZWZpbmUgYlNGYWN0b3JRQU0zCQkJMHhmMDAKLSNkZWZpbmUgYlNGYWN0b3JRQU00CQkJMHhmMDAwCi0jZGVmaW5lIGJTRmFjdG9yUUFNNQkJCTB4ZjAwMDAKLSNkZWZpbmUgYlNGYWN0b3JRQU02CQkJMHhmMDAwMAotI2RlZmluZSBiU0ZhY3RvclFBTTcJCQkweGYwMDAwMAotI2RlZmluZSBiU0ZhY3RvclFBTTgJCQkweGYwMDAwMDAKLSNkZWZpbmUgYlNGYWN0b3JRQU05CQkJMHhmMDAwMDAwMAotI2RlZmluZSBiQ1NJU2NoZW1lCQkJMHgxMDAwMDAKLQotI2RlZmluZSBiTm9pc2VMdmxUb3BTZXQJCQkweDMJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYkNoU21vb3RoCQkJMHg0Ci0jZGVmaW5lIGJDaFNtb290aENmZzEJCQkweDM4Ci0jZGVmaW5lIGJDaFNtb290aENmZzIJCQkweDFjMAotI2RlZmluZSBiQ2hTbW9vdGhDZmczCQkJMHhlMDAKLSNkZWZpbmUgYkNoU21vb3RoQ2ZnNAkJCTB4NzAwMAotI2RlZmluZSBiTVJDTW9kZQkJCTB4ODAwMDAwCi0jZGVmaW5lIGJUSEVWTUNmZwkJCTB4NzAwMDAwMAotCi0jZGVmaW5lIGJMb29wRml0VHlwZQkJCTB4MQkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiVXBkQ0ZPCQkJCTB4NDAKLSNkZWZpbmUgYlVwZENGT09mZkRhdGEJCQkweDgwCi0jZGVmaW5lIGJBZHZVcGRDRk8JCQkweDEwMAotI2RlZmluZSBiQWR2VGltZUN0cmwJCQkweDgwMAotI2RlZmluZSBiVXBkQ2xrbwkJCTB4MTAwMAotI2RlZmluZSBiRkMJCQkJMHg2MDAwCi0jZGVmaW5lIGJUcmFja2luZ01vZGUJCQkweDgwMDAKLSNkZWZpbmUgYlBoQ21wRW5hYmxlCQkJMHgxMDAwMAotI2RlZmluZSBiVXBkQ2xrb0xURgkJCTB4MjAwMDAKLSNkZWZpbmUgYkNvbUNoQ0ZPCQkJMHg0MDAwMAotI2RlZmluZSBiQ1NJRXN0aU1vZGUJCQkweDgwMDAwCi0jZGVmaW5lIGJBZHZVcGRFcXoJCQkweDEwMDAwMAotI2RlZmluZSBiVUNoQ2ZnCQkJCTB4NzAwMDAwMAotI2RlZmluZSBiVXBkRXF6CQkJCTB4ODAwMDAwMAotCi0vKiBSeCBQc2VkdW8gbm9pc2UgKi8KLSNkZWZpbmUgYlJ4UGVzdWRvTm9pc2VPbgkJMHgyMDAwMDAwMAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9BCQkweGZmCi0jZGVmaW5lIGJSeFBlc3Vkb05vaXNlX0IJCTB4ZmYwMAotI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9DCQkweGZmMDAwMAotI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9ECQkweGZmMDAwMDAwCi0jZGVmaW5lIGJQZXN1ZG9Ob2lzZVN0YXRlX0EJCTB4ZmZmZgotI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9CCQkweGZmZmYwMDAwCi0jZGVmaW5lIGJQZXN1ZG9Ob2lzZVN0YXRlX0MJCTB4ZmZmZgotI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9ECQkweGZmZmYwMDAwCi0KLS8qIDcuIFJGIFJlZ2lzdGVyICovCi0vKiBaZWJyYTEgKi8KLSNkZWZpbmUgYlplYnJhMV9IU1NJRW5hYmxlCQkweDgJCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIGJaZWJyYTFfVFJ4Q29udHJvbAkJMHhjMDAKLSNkZWZpbmUgYlplYnJhMV9UUnhHYWluU2V0dGluZwkJMHgwN2YKLSNkZWZpbmUgYlplYnJhMV9SeENvcm5lcgkJMHhjMDAKLSNkZWZpbmUgYlplYnJhMV9UeENoYXJnZVB1bXAJCTB4MzgKLSNkZWZpbmUgYlplYnJhMV9SeENoYXJnZVB1bXAJCTB4NwotI2RlZmluZSBiWmVicmExX0NoYW5uZWxOdW0JCTB4ZjgwCi0jZGVmaW5lIGJaZWJyYTFfVHhMUEZCVwkJCTB4NDAwCi0jZGVmaW5lIGJaZWJyYTFfUnhMUEZCVwkJCTB4NjAwCi0KLS8qIFplYnJhNCAqLwotI2RlZmluZSBiUlRMODI1NlJlZ01vZGVDdHJsMQkJMHgxMDAJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYlJUTDgyNTZSZWdNb2RlQ3RybDAJCTB4NDAKLSNkZWZpbmUgYlJUTDgyNTZfVHhMUEZCVwkJMHgxOAotI2RlZmluZSBiUlRMODI1Nl9SeExQRkJXCQkweDYwMAotCi0vKiBSVEw4MjU4ICovCi0jZGVmaW5lIGJSVEw4MjU4X1R4TFBGQlcJCTB4YwkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiUlRMODI1OF9SeExQRkJXCQkweGMwMAotI2RlZmluZSBiUlRMODI1OF9SU1NJTFBGQlcJCTB4YzAKLQotCi0vKiAgT3RoZXIgRGVmaW5pdGlvbiAqLwotCi0vKiBieXRlIGVuZGFibGUgZm9yIHNiX3dyaXRlICovCi0jZGVmaW5lIGJCeXRlMAkJCQkweDEJLyogIFVzZWxlc3MgKi8KLSNkZWZpbmUgYkJ5dGUxCQkJCTB4MgotI2RlZmluZSBiQnl0ZTIJCQkJMHg0Ci0jZGVmaW5lIGJCeXRlMwkJCQkweDgKLSNkZWZpbmUgYldvcmQwCQkJCTB4MwotI2RlZmluZSBiV29yZDEJCQkJMHhjCi0jZGVmaW5lIGJEV29yZAkJCQkweGYKLQotLyogZm9yIFB1dFJlZ3NldHRpbmcgJiBHZXRSZWdTZXR0aW5nIEJpdE1hc2sgKi8KLSNkZWZpbmUgYk1hc2tCeXRlMAkJCTB4ZmYJLyogIFJlZyAweGM1MCByT0ZETTBfWEFBR0NDb3JlfjB4QzZmICovCi0jZGVmaW5lIGJNYXNrQnl0ZTEJCQkweGZmMDAKLSNkZWZpbmUgYk1hc2tCeXRlMgkJCTB4ZmYwMDAwCi0jZGVmaW5lIGJNYXNrQnl0ZTMJCQkweGZmMDAwMDAwCi0jZGVmaW5lIGJNYXNrSFdvcmQJCQkweGZmZmYwMDAwCi0jZGVmaW5lIGJNYXNrTFdvcmQJCQkweDAwMDBmZmZmCi0jZGVmaW5lIGJNYXNrRFdvcmQJCQkweGZmZmZmZmZmCi0jZGVmaW5lIGJNYXNrMTJCaXRzCQkJMHhmZmYKLSNkZWZpbmUgYk1hc2tINEJpdHMJCQkweGYwMDAwMDAwCi0jZGVmaW5lIGJNYXNrT0ZETV9ECQkJMHhmZmMwMDAwMAotI2RlZmluZSBiTWFza0NDSwkJCTB4M2YzZjNmM2YKLQotLyogZm9yIFB1dFJGUmVnc2V0dGluZyAmIEdldFJGUmVnU2V0dGluZyBCaXRNYXNrICovCi0jZGVmaW5lCQliUkZSZWdPZmZzZXRNYXNrCTB4ZmZmZmYKLQotI2RlZmluZSBiRGlzYWJsZQkJCTB4MAotCi0jZGVmaW5lIExlZnRBbnRlbm5hCQkJMHgwCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIFJpZ2h0QW50ZW5uYQkJCTB4MQotCi0jZGVmaW5lIHRDaGVja1R4U3RhdHVzCQkJNTAwICAgLyogNTAwbXMgVXNlbGVzcyAqLwotI2RlZmluZSB0VXBkYXRlUnhDb3VudGVyCQkxMDAgICAvKiAxMDBtcyAqLwotCi0jZGVmaW5lIHJhdGVDQ0sJCQkJMAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSByYXRlT0ZETQkJCTEKLSNkZWZpbmUgcmF0ZUhUCQkJCTIKLQotLyogZGVmaW5lIFJlZ2lzdGVyLUVuZCAqLwotI2RlZmluZSBiUE1BQ19FbmQJCQkweDFmZgkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiRlBHQVBIWTBfRW5kCQkJMHg4ZmYKLSNkZWZpbmUgYkZQR0FQSFkxX0VuZAkJCTB4OWZmCi0jZGVmaW5lIGJDQ0tQSFkwX0VuZAkJCTB4YWZmCi0jZGVmaW5lIGJPRkRNUEhZMF9FbmQJCQkweGNmZgotI2RlZmluZSBiT0ZETVBIWTFfRW5kCQkJMHhkZmYKLQotLyogZGVmaW5lIG1heCBkZWJ1ZyBpdGVtIGluIGVhY2ggZGVidWcgcGFnZSAqLwotLyogZGVmaW5lIGJNYXhJdGVtX0ZQR0FfUEhZMCAgICAgICAgMHg5ICovCi0vKiBkZWZpbmUgYk1heEl0ZW1fRlBHQV9QSFkxICAgICAgICAweDMgKi8KLS8qIGRlZmluZSBiTWF4SXRlbV9QSFlfMTFCICAgICAgICAgIDB4MTYgKi8KLS8qIGRlZmluZSBiTWF4SXRlbV9PRkRNX1BIWTAgICAgICAgIDB4MjkgKi8KLS8qIGRlZmluZSBiTWF4SXRlbV9PRkRNX1BIWTEgICAgICAgIDB4MCAqLwotCi0jZGVmaW5lIGJQTUFDQ29udHJvbAkJCTB4MAkvKiAgVXNlbGVzcyAqLwotI2RlZmluZSBiV01BQ0NvbnRyb2wJCQkweDEKLSNkZWZpbmUgYldOSUNDb250cm9sCQkJMHgyCi0KLSNkZWZpbmUgUGF0aEEJCQkJMHgwCS8qICBVc2VsZXNzICovCi0jZGVmaW5lIFBhdGhCCQkJCTB4MQotI2RlZmluZSBQYXRoQwkJCQkweDIKLSNkZWZpbmUgUGF0aEQJCQkJMHgzCi0KLS8qICBQYWdlQigweEIwMCkgKi8KLSNkZWZpbmUgclBkcF9BbnRBCQkJMHhiMDAKLSNkZWZpbmUgclBkcF9BbnRBXzQJCQkweGIwNAotI2RlZmluZSByUGRwX0FudEFfOAkJCTB4YjA4Ci0jZGVmaW5lIHJQZHBfQW50QV9DCQkJMHhiMGMKLSNkZWZpbmUgclBkcF9BbnRBXzE4CQkJMHhiMTgKLSNkZWZpbmUgclBkcF9BbnRBXzFDCQkJMHhiMWMKLSNkZWZpbmUgclBkcF9BbnRBXzIwCQkJMHhiMjAKLSNkZWZpbmUgclBkcF9BbnRBXzI0CQkJMHhiMjQKLQotI2RlZmluZSByQ29uZmlnX1BtcGRfQW50QQkJMHhiMjgKLSNkZWZpbmUgckNvbmZpZ19yYW02NHgxNgkJMHhiMmMKLQotI2RlZmluZSByQm5kQQkJCQkweGIzMAotI2RlZmluZSBySHNzaVBhcgkJCTB4YjM0Ci0KLSNkZWZpbmUgckNvbmZpZ19BbnRBCQkJMHhiNjgKLSNkZWZpbmUgckNvbmZpZ19BbnRCCQkJMHhiNmMKLQotI2RlZmluZSByUGRwX0FudEIJCQkweGI3MAotI2RlZmluZSByUGRwX0FudEJfNAkJCTB4Yjc0Ci0jZGVmaW5lIHJQZHBfQW50Ql84CQkJMHhiNzgKLSNkZWZpbmUgclBkcF9BbnRCX0MJCQkweGI3YwotI2RlZmluZSByUGRwX0FudEJfMTAJCQkweGI4MAotI2RlZmluZSByUGRwX0FudEJfMTQJCQkweGI4NAotI2RlZmluZSByUGRwX0FudEJfMTgJCQkweGI4OAotI2RlZmluZSByUGRwX0FudEJfMUMJCQkweGI4YwotI2RlZmluZSByUGRwX0FudEJfMjAJCQkweGI5MAotI2RlZmluZSByUGRwX0FudEJfMjQJCQkweGI5NAotCi0jZGVmaW5lIHJDb25maWdfUG1wZF9BbnRCCQkweGI5OAotCi0jZGVmaW5lIHJCbmRCCQkJCTB4YmEwCi0KLSNkZWZpbmUgckFQSwkJCQkweGJkOAotI2RlZmluZSByUG1fUngwX0FudEEJCQkweGJkYwotI2RlZmluZSByUG1fUngxX0FudEEJCQkweGJlMAotI2RlZmluZSByUG1fUngyX0FudEEJCQkweGJlNAotI2RlZmluZSByUG1fUngzX0FudEEJCQkweGJlOAotI2RlZmluZSByUG1fUngwX0FudEIJCQkweGJlYwotI2RlZmluZSByUG1fUngxX0FudEIJCQkweGJmMAotI2RlZmluZSByUG1fUngyX0FudEIJCQkweGJmNAotI2RlZmluZSByUG1fUngzX0FudEIJCQkweGJmOAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzUHdyU2VxLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM1B3clNlcS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzcxZDZiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzUHdyU2VxLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotI2lmbmRlZiBfX0hBTDg3MjNQV1JTRVFfSF9fCi0jZGVmaW5lIF9fSEFMODcyM1BXUlNFUV9IX18KLS8qCi0JQ2hlY2sgZG9jdW1lbnQgV00tMjAxMTA2MDctUGF1bC1SVEw4NzIzQV9Qb3dlcl9BcmNoaXRlY3R1cmUtUjAyLnZzZAotCVRoZXJlIGFyZSA2IEhXIFBvd2VyIFN0YXRlczoKLQkwOiBQT0ZGLS1Qb3dlciBPZmYKLQkxOiBQRE4tLVBvd2VyIERvd24KLQkyOiBDQVJERU1VLS1DYXJkIEVtdWxhdGlvbgotCTM6IEFDVC0tQWN0aXZlIE1vZGUKLQk0OiBMUFMtLUxvdyBQb3dlciBTdGF0ZQotCTU6IFNVUy0tU3VzcGVuZAotCi0JVGhlIHRyYW5zaXNpb24gZnJvbSBkaWZmZXJlbnQgc3RhdGVzIGFyZSBkZWZpbmVkIGJlbG93Ci0JVFJBTlNfQ0FSREVNVV9UT19BQ1QKLQlUUkFOU19BQ1RfVE9fQ0FSREVNVQotCVRSQU5TX0NBUkRFTVVfVE9fU1VTCi0JVFJBTlNfU1VTX1RPX0NBUkRFTVUKLQlUUkFOU19DQVJERU1VX1RPX1BETgotCVRSQU5TX0FDVF9UT19MUFMKLQlUUkFOU19MUFNfVE9fQUNUCi0KLQlUUkFOU19FTkQKLSovCi0jaW5jbHVkZSAiSGFsUHdyU2VxQ21kLmgiCi0jaW5jbHVkZSAicnRsODcyM2Ffc3BlYy5oIgotCi0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fQUNUX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fU1VTX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX1NVU19UT19DQVJERU1VX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX1BETl9UT19DQVJERU1VX1NURVBTCTE1Ci0jZGVmaW5lCVJUTDg3MjNBX1RSQU5TX0FDVF9UT19MUFNfU1RFUFMJMTUKLSNkZWZpbmUJUlRMODcyM0FfVFJBTlNfTFBTX1RPX0FDVF9TVEVQUwkxNQotI2RlZmluZQlSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFMJMQotCi0KLS8qIGZvcm1hdAotICogeyBvZmZzZXQsIGN1dF9tc2ssIGZhYl9tc2t8aW50ZXJmYWNlX21zaywgYmFzZXxjbWQsIG1zaywgdmFsdWUgfSwgIGNvbW1lbnRzIGhlcmUKLSAqLwotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0FDVAkJCQkJCQkJCQkJCQkJXAotCXsweDAwMjAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMCksIEJJVCgwKX0sIC8qMHgyMFswXSA9IDFiJzEgZW5hYmxlIExET0ExMiBNQUNSTyBibG9jayBmb3IgYWxsIGludGVyZmFjZSovIFwKLQl7MHgwMDY3LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDQpLCAwfSwgLyoweDY3WzBdID0gMCB0byBkaXNhYmxlIEJUX0dQU19TRUwgcGlucyovCVwKLQl7MHgwMDAxLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9ERUxBWSwgMSwgUFdSU0VRX0RFTEFZX01TfSwvKkRlbGF5IDFtcyovICAgXAotCXsweDAwMDAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoNSksIDB9LCAvKjB4MDBbNV0gPSAxYicwIHJlbGVhc2UgYW5hbG9nIElwcyB0byBkaWdpdGFsICwgMTppc29sYXRpb24qLyAgIFwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDIpLCAwfSwvKiBkaXNhYmxlIFNXIExQUyAweDA0WzEwXT0gMCovCVwKLQl7MHgwMDA2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCBCSVQoMSksIEJJVCgxKX0sLyogd2FpdCB0aWxsIDB4MDRbMTddID0gMSAgICBwb3dlciByZWFkeSovCVwKLQl7MHgwMDA2LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDApLCBCSVQoMCl9LC8qIHJlbGVhc2UgV0xPTiByZXNldCAgMHgwNFsxNl09IDEqLyBcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg3KSwgMH0sLyogZGlzYWJsZSBIV1BETiAweDA0WzE1XT0gMCovCVwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgKEJJVCg0KXxCSVQoMykpLCAwfSwvKiBkaXNhYmxlIFdMIHN1c3BlbmQqLwlcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgwKSwgQklUKDApfSwvKiBwb2xsaW5nIHVudGlsIHJldHVybiAwKi8JXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1BPTExJTkcsIEJJVCgwKSwgMH0sLyoqLwlcCi0JezB4MDA0RSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg3KSwgMX0sLyoweDRDWzIzXSA9IDB4NEVbN10gPSAxLCBzd2l0Y2ggRFBEVF9TRUxfUCBvdXRwdXQgZnJvbSBXTCBCQiAqL1wKLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19BQ1RfVE9fQ0FSREVNVQkJCQkJCQkJCQkJCQlcCi0JezB4MDAxRiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIDB4RkYsIDB9LC8qMHgxRls3OjBdID0gMCB0dXJuIG9mZiBSRiovCVwKLQl7MHgwMDRFLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDcpLCAwfSwvKjB4NENbMjNdID0gMHg0RVs3XSA9IDAsIHN3aXRjaCBEUERUX1NFTF9QIG91dHB1dCBmcm9tIHJlZ2lzdGVyIDB4NjVbMl0gKi9cCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgxKSwgQklUKDEpfSwgLyoweDA0WzldID0gMSB0dXJuIG9mZiBNQUMgYnkgSFcgc3RhdGUgbWFjaGluZSovCVwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCBCSVQoMSksIDB9LCAvKndhaXQgdGlsbCAweDA0WzldID0gMCBwb2xsaW5nIHVudGlsIHJldHVybiAwIHRvIGRpc2FibGUqLwlcCi0JezB4MDAwMCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg1KSwgQklUKDUpfSwgLyoweDAwWzVdID0gMWInMSBhbmFsb2cgSXBzIHRvIGRpZ2l0YWwgLCAxOmlzb2xhdGlvbiovICAgXAotCXsweDAwMjAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMCksIDB9LCAvKjB4MjBbMF0gPSAxYicwIGRpc2FibGUgTERPQTEyIE1BQ1JPIGJsb2NrKi8gICBcCi0KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1NVUwkJCQkJCQkJCQkJCQlcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgzKXxCSVQoNCksIEJJVCgzKX0sIC8qMHgwNFsxMjoxMV0gPSAyYicwMSBlbmFibGUgV0wgc3VzcGVuZCovCi0KLSNkZWZpbmUgUlRMODcyM0FfVFJBTlNfU1VTX1RPX0NBUkRFTVUJCQkJCQkJCQkJCQkJXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMykgfCBCSVQoNyksIDB9LCAvKmNsZWFyIHN1c3BlbmQgZW5hYmxlIGFuZCBwb3dlciBkb3duIGVuYWJsZSovCVwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDMpfEJJVCg0KSwgMH0sIC8qMHgwNFsxMjoxMV0gPSAyYicwMWVuYWJsZSBXTCBzdXNwZW5kKi8KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0NBUkRESVMJCQkJCQkJCQkJCQkJXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMyl8QklUKDQpLCBCSVQoMyl9LCAvKjB4MDRbMTI6MTFdID0gMmInMDEgZW5hYmxlIFdMIHN1c3BlbmQqLwlcCi0JezB4MDA0QSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgwKSwgQklUKDApfSwgLyoweDQ4WzE2XSA9IDEgdG8gZW5hYmxlIEdQSU85IGFzIEVYVCBXQUtFVVAqLwotCi0jZGVmaW5lIFJUTDg3MjNBX1RSQU5TX0NBUkRESVNfVE9fQ0FSREVNVQkJCQkJCQkJCQkJCQlcCi0JezB4MDAwNSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgzKSB8IEJJVCg3KSwgMH0sIC8qY2xlYXIgc3VzcGVuZCBlbmFibGUgYW5kIHBvd2VyIGRvd24gZW5hYmxlKi8JXAotCXsweDAwNEEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9VU0JfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMCksIDB9LCAvKjB4NDhbMTZdID0gMCB0byBkaXNhYmxlIEdQSU85IGFzIEVYVCBXQUtFVVAqLyAgIFwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDMpfEJJVCg0KSwgMH0sIC8qMHgwNFsxMjoxMV0gPSAyYicwMWVuYWJsZSBXTCBzdXNwZW5kKi8KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX1BETgkJCQkJCQkJCQkJCVwKLQl7MHgwMDA3LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfVVNCX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgMHhGRiwgMHgyMH0sIC8qMHgwN1s3OjBdID0gMHgyMCBTT1Agb3B0aW9uIHRvIGRpc2FibGUgQkcvTUIvQUNLL1NXUiovICAgXAotCXsweDAwMDYsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMCksIDB9LC8qIDB4MDRbMTZdID0gMCovXAotCXsweDAwMDUsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoNyksIEJJVCg3KX0sLyogMHgwNFsxNV0gPSAxKi8KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19QRE5fVE9fQ0FSREVNVQkJCQkJCQkJCQkJCVwKLQl7MHgwMDA1LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDcpLCAwfSwvKiAweDA0WzE1XSA9IDAqLwotCi0jZGVmaW5lIFJUTDg3MjNBX1RSQU5TX0FDVF9UT19MUFMJCQkJCQkJCQkJCQkJCVwKLQl7MHgwNTIyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgMHhGRiwgMHhGRn0sLypUeCBQYXVzZSovCVwKLQl7MHgwNUY4LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCAweEZGLCAwfSwvKlNob3VsZCBiZSB6ZXJvIGlmIG5vIHBhY2tldCBpcyB0cmFuc21pdHRpbmcqLwlcCi0JezB4MDVGOSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfUE9MTElORywgMHhGRiwgMH0sLypTaG91bGQgYmUgemVybyBpZiBubyBwYWNrZXQgaXMgdHJhbnNtaXR0aW5nKi8JXAotCXsweDA1RkEsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1BPTExJTkcsIDB4RkYsIDB9LC8qU2hvdWxkIGJlIHplcm8gaWYgbm8gcGFja2V0IGlzIHRyYW5zbWl0dGluZyovCVwKLQl7MHgwNUZCLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCAweEZGLCAwfSwvKlNob3VsZCBiZSB6ZXJvIGlmIG5vIHBhY2tldCBpcyB0cmFuc21pdHRpbmcqLwlcCi0JezB4MDAwMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgwKSwgMH0sLypDQ0sgYW5kIE9GRE0gYXJlIGRpc2FibGVkLCBhbmQgY2xvY2sgYXJlIGdhdGVkKi8JXAotCXsweDAwMDIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX0RFTEFZLCAwLCBQV1JTRVFfREVMQVlfVVN9LC8qRGVsYXkgMXVzKi8JXAotCXsweDAwMDIsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCBCSVQoMSksIDB9LC8qV2hvbGUgQkIgaXMgcmVzZXQqLwlcCi0JezB4MDEwMCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4MDN9LC8qUmVzZXQgTUFDIFRSWCovCVwKLQl7MHgwMTAxLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDEpLCAwfSwvKmNoZWNrIGlmIHJlbW92ZWQgbGF0ZXIqLwlcCi0JezB4MDU1MywgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCg1KSwgQklUKDUpfSwvKlJlc3BvbmQgVHhPSyB0byBzY2hlZHVsZXIqLwotCi0jZGVmaW5lIFJUTDg3MjNBX1RSQU5TX0xQU19UT19BQ1QJCQkJCQkJCQkJCQkJCQlcCi0JezB4RkU1OCwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX1VTQl9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIDB4RkYsIDB4ODR9LCAvKlVTQiBSUFdNKi9cCi0JezB4MDAwMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfREVMQVksIDAsIFBXUlNFUV9ERUxBWV9NU30sIC8qRGVsYXkqL1wKLQl7MHgwMDA4LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDQpLCAwfSwgLyouCTB4MDhbNF0gPSAwCQkgc3dpdGNoIFRTRiB0byA0ME0qL1wKLQl7MHgwMTA5LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9QT0xMSU5HLCBCSVQoNyksIDB9LCAvKlBvbGxpbmcgMHgxMDlbN109IDAgIFRTRiBpbiA0ME0qL1wKLQl7MHgwMDI5LCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDYpfEJJVCg3KSwgMH0sIC8qLgkweDI5Wzc6Nl0gPSAyYicwMAkgZW5hYmxlIEJCIGNsb2NrKi9cCi0JezB4MDEwMSwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIEJJVCgxKSwgQklUKDEpfSwgLyouCTB4MTAxWzFdID0gMSovXAotCXsweDAxMDAsIFBXUl9DVVRfQUxMX01TSywgUFdSX0ZBQl9BTExfTVNLLCBQV1JfSU5URl9BTExfTVNLLCBQV1JfQkFTRUFERFJfTUFDLCBQV1JfQ01EX1dSSVRFLCAweEZGLCAweEZGfSwgLyouCTB4MTAwWzc6MF0gPSAweEZGCSBlbmFibGUgV01BQyBUUlgqL1wKLQl7MHgwMDAyLCBQV1JfQ1VUX0FMTF9NU0ssIFBXUl9GQUJfQUxMX01TSywgUFdSX0lOVEZfQUxMX01TSywgUFdSX0JBU0VBRERSX01BQywgUFdSX0NNRF9XUklURSwgQklUKDEpfEJJVCgwKSwgQklUKDEpfEJJVCgwKX0sIC8qLgkweDAyWzE6MF0gPSAyYicxMQkgZW5hYmxlIEJCIG1hY3JvKi9cCi0JezB4MDUyMiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIFBXUl9CQVNFQUREUl9NQUMsIFBXUl9DTURfV1JJVEUsIDB4RkYsIDB9LCAvKi4JMHg1MjIgPSAwKi8KLQotI2RlZmluZSBSVEw4NzIzQV9UUkFOU19FTkQJCQkJCQkJCQkJCQkJCQlcCi0JezB4RkZGRiwgUFdSX0NVVF9BTExfTVNLLCBQV1JfRkFCX0FMTF9NU0ssIFBXUl9JTlRGX0FMTF9NU0ssIDAsIFBXUl9DTURfRU5ELCAwLCAwfSwKLQotCi1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfcG93ZXJfb25fZmxvd1tSVEw4NzIzQV9UUkFOU19DQVJERU1VX1RPX0FDVF9TVEVQUytSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFNdOwotZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX3JhZGlvX29mZl9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU107Ci1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfY2FyZF9kaXNhYmxlX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19QRE5fU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXTsKLWV4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9jYXJkX2VuYWJsZV9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU107Ci1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfc3VzcGVuZF9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fU1VTX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU107Ci1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfcmVzdW1lX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0NBUkRFTVVfU1RFUFMrUlRMODcyM0FfVFJBTlNfQ0FSREVNVV9UT19TVVNfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXTsKLWV4dGVybiBzdHJ1Y3Qgd2xhbl9wd3JfY2ZnIHJ0bDg3MjNBVV9od3Bkbl9mbG93W1JUTDg3MjNBX1RSQU5TX0FDVF9UT19DQVJERU1VX1NURVBTK1JUTDg3MjNBX1RSQU5TX0NBUkRFTVVfVE9fUEROX1NURVBTK1JUTDg3MjNBX1RSQU5TX0VORF9TVEVQU107Ci1leHRlcm4gc3RydWN0IHdsYW5fcHdyX2NmZyBydGw4NzIzQVVfZW50ZXJfbHBzX2Zsb3dbUlRMODcyM0FfVFJBTlNfQUNUX1RPX0xQU19TVEVQUytSVEw4NzIzQV9UUkFOU19FTkRfU1RFUFNdOwotZXh0ZXJuIHN0cnVjdCB3bGFuX3B3cl9jZmcgcnRsODcyM0FVX2xlYXZlX2xwc19mbG93W1JUTDg3MjNBX1RSQU5TX0xQU19UT19BQ1RfU1RFUFMrUlRMODcyM0FfVFJBTlNfRU5EX1NURVBTXTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM1VIV0ltZ19DRS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbDg3MjNVSFdJbWdfQ0UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgzNGIzYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM1VIV0ltZ19DRS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotI2lmbmRlZiBfX0lOQ19IQUw4NzIzVV9GV19JTUdfSAotI2RlZmluZSBfX0lOQ19IQUw4NzIzVV9GV19JTUdfSAotCi0vKkNyZWF0ZWQgb24gIDIwMTMvMDEvMTQsIDE1OjUxKi8KLQotLyogRlcgdjE2IGVuYWJsZSB1c2IgaW50ZXJydXB0ICovCi0jZGVmaW5lIFJ0bDg3MjNVSW1nQXJyYXlMZW5ndGggMjIxNzIKLWV4dGVybiB1OCBSdGw4NzIzVUZ3SW1nQXJyYXlbUnRsODcyM1VJbWdBcnJheUxlbmd0aF07Ci0jZGVmaW5lIFJ0bDg3MjNVQlRJbWdBcnJheUxlbmd0aCAxCi1leHRlcm4gdTggUnRsODcyM1VGd0JUSW1nQXJyYXlbUnRsODcyM1VCVEltZ0FycmF5TGVuZ3RoXTsKLQotI2RlZmluZSBSdGw4NzIzVVVNQ0JDdXRJbWdBcnJheVdpdGhCVExlbmd0aCAyNDExOAotI2RlZmluZSBSdGw4NzIzVVVNQ0JDdXRJbWdBcnJheVdpdGhvdXRCVExlbmd0aCAxOTIwMAotCi1leHRlcm4gdTggUnRsODcyM1VGd1VNQ0JDdXRJbWdBcnJheVdpdGhCVFtSdGw4NzIzVVVNQ0JDdXRJbWdBcnJheVdpdGhCVExlbmd0aF07Ci1leHRlcm4gdTggUnRsODcyM1VGd1VNQ0JDdXRJbWdBcnJheVdpdGhvdXRCVFtSdGw4NzIzVVVNQ0JDdXRJbWdBcnJheVdpdGhvdXRCVExlbmd0aF07Ci0KLSNkZWZpbmUgUnRsODcyM1NVTUNCQ3V0TVBJbWdBcnJheUxlbmd0aCAyNDE3NAotZXh0ZXJuIGNvbnN0IHU4IFJ0bDg3MjNTRndVTUNCQ3V0TVBJbWdBcnJheVtSdGw4NzIzU1VNQ0JDdXRNUEltZ0FycmF5TGVuZ3RoXTsKLQotI2RlZmluZSBSdGw4NzIzRUJUSW1nQXJyYXlMZW5ndGggMTUyNzYKLWV4dGVybiB1OCBSdGw4NzIzRUZ3QlRJbWdBcnJheVtSdGw4NzIzRUJUSW1nQXJyYXlMZW5ndGhdOwotCi0jZGVmaW5lIFJ0bDg3MjNVUEhZX1JFR19BcnJheV9QR0xlbmd0aCAzMzYKLWV4dGVybiB1MzIgUnRsODcyM1VQSFlfUkVHX0FycmF5X1BHW1J0bDg3MjNVUEhZX1JFR19BcnJheV9QR0xlbmd0aF07Ci0jZGVmaW5lIFJ0bDg3MjNVTUFDUEhZX0FycmF5X1BHTGVuZ3RoIDEKLWV4dGVybiB1MzIgUnRsODcyM1VNQUNQSFlfQXJyYXlfUEdbUnRsODcyM1VNQUNQSFlfQXJyYXlfUEdMZW5ndGhdOwotCi0jZW5kaWYgLyogaWZuZGVmIF9fSU5DX0hBTDg3MjNVX0ZXX0lNR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsRE1PdXRTcmM4NzIzQS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbERNT3V0U3JjODcyM0EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc2NTFmNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsRE1PdXRTcmM4NzIzQS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZglfX1JUTDg3MjNBX09ETV9IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9PRE1fSF9fCi0vKiAgKi8KLQotI2RlZmluZQlSU1NJX0NDSwkwCi0jZGVmaW5lCVJTU0lfT0ZETQkxCi0jZGVmaW5lCVJTU0lfREVGQVVMVAkyCi0KLSNkZWZpbmUgSVFLX01BQ19SRUdfTlVNCQk0Ci0jZGVmaW5lIElRS19BRERBX1JFR19OVU0JCTE2Ci0jZGVmaW5lIElRS19CQl9SRUdfTlVNCQkJOQotI2RlZmluZSBIUF9USEVSTUFMX05VTQkJOAotCi0KLS8qICAqLwotLyogIHN0cnVjdHVyZSBhbmQgZGVmaW5lICovCi0vKiAgKi8KLQotCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IE1hcmNvIERlZmluaXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogZGVmaW5lIERNX011bHRpU1RBX0luaXRHYWluQ2hhbmdlTm90aWZ5KEV2ZW50KSB7RE1fRGlnVGFibGUuQ3VyTXVsdGlTVEFDb25uZWN0U3RhdGUgPSBFdmVudDt9ICovCi0KLQotLyogICovCi0vKiAgZnVuY3Rpb24gcHJvdG90eXBlICovCi0vKiAgKi8KLQotLyogICovCi0vKiAgSVEgY2FsaWJyYXRlICovCi0vKiAgKi8KLXZvaWQgcnRsODcyM2FfcGh5X2lxX2NhbGlicmF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBib29sIGJSZUNvdmVyeSk7Ci0KLS8qICAqLwotLyogIExDIGNhbGlicmF0ZSAqLwotLyogICovCi12b2lkIHJ0bDg3MjNhX3BoeV9sY19jYWxpYnJhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlcik7Ci0KLS8qICAqLwotLyogIEFQIGNhbGlicmF0ZSAqLwotLyogICovCi12b2lkIHJ0bDg3MjNhX3BoeV9hcF9jYWxpYnJhdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgY2hhciBkZWx0YSk7Ci0KLXZvaWQgcnRsODcyM2Ffb2RtX2NoZWNrX3R4X3Bvd2VyX3RyYWNraW5nKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfQkIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX0JCLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzYwOTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfQkIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0qIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0qIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0qIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotKiBtb3JlIGRldGFpbHMuCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19JTkNfQkJfODcyM0FfSFdfSU1HX0gKLSNkZWZpbmUgX19JTkNfQkJfODcyM0FfSFdfSU1HX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFHQ19UQUJfMVQuVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgT0RNX1JlYWRBbmRDb25maWdfQUdDX1RBQl8xVF84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX1JFR18xVC5UWFQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBPRE1fUmVhZEFuZENvbmZpZ19QSFlfUkVHXzFUXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogICAgICAgICAgICAgICAgICAgICAgICAgICBQSFlfUkVHX01QLlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX1BIWV9SRUdfTVBfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotI2VuZGlmIC8qICBlbmQgb2YgSFdJTUdfU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfRlcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX0ZXLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTM2M2IuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfRlcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0qIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0qIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0qIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotKiBtb3JlIGRldGFpbHMuCi0qCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19JTkNfRldfODcyM0FfSFdfSU1HX0gKLSNkZWZpbmUgX19JTkNfRldfODcyM0FfSFdfSU1HX0gKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRsODcyM2Z3X0IuVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgT0RNX1JlYWRGaXJtd2FyZV84NzIzQV9ydGw4NzIzZndfQihzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JCQkJCXU4ICpwRmlybXdhcmUsIHUzMiAqcEZpcm13YXJlU2l6ZSk7Ci0KLSNlbmRpZiAvKiAgZW5kIG9mIEhXSU1HX1NVUFBPUlQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxIV0ltZzg3MjNBX01BQy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfTUFDLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMWJlMWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfTUFDLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKgotKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0qIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSogbW9yZSBkZXRhaWxzLgotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fSU5DX01BQ184NzIzQV9IV19JTUdfSAotI2RlZmluZSBfX0lOQ19NQUNfODcyM0FfSFdfSU1HX0gKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BQ19SRUcuVFhUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgT0RNX1JlYWRBbmRDb25maWdfTUFDX1JFR184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi0jZW5kaWYgLyogIGVuZCBvZiBIV0lNR19TVVBQT1JUICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsSFdJbWc4NzIzQV9SRi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbEhXSW1nODcyM0FfUkYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhZjFjMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsSFdJbWc4NzIzQV9SRi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0qIG1vcmUgZGV0YWlscy4KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0lOQ19SRl84NzIzQV9IV19JTUdfSAotI2RlZmluZSBfX0lOQ19SRl84NzIzQV9IV19JTUdfSAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9BXzFULlRYVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE9ETV9SZWFkQW5kQ29uZmlnX1JhZGlvQV8xVF84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi0jZW5kaWYgLyogIGVuZCBvZiBIV0lNR19TVVBQT1JUICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsUHdyU2VxQ21kLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsUHdyU2VxQ21kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZTAzYTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbFB3clNlcUNtZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19IQUxQV1JTRVFDTURfSF9fCi0jZGVmaW5lIF9fSEFMUFdSU0VRQ01EX0hfXwotCi0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgUFdSX0NNRF9SRUFECQkJMHgwMAotICAgICAvKiAgb2Zmc2V0OiB0aGUgcmVhZCByZWdpc3RlciBvZmZzZXQgKi8KLSAgICAgLyogIG1zazogdGhlIG1hc2sgb2YgdGhlIHJlYWQgdmFsdWUgKi8KLSAgICAgLyogIHZhbHVlOiBOL0EsIGxlZnQgYnkgMCAqLwotICAgICAvKiAgbm90ZTogZGlydmVyIHNoYWxsIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGJ5IHJlYWQgJiBtc2sgKi8KLQotI2RlZmluZSBQV1JfQ01EX1dSSVRFCQkJMHgwMQotICAgICAvKiAgb2Zmc2V0OiB0aGUgcmVhZCByZWdpc3RlciBvZmZzZXQgKi8KLSAgICAgLyogIG1zazogdGhlIG1hc2sgb2YgdGhlIHdyaXRlIGJpdHMgKi8KLSAgICAgLyogIHZhbHVlOiB3cml0ZSB2YWx1ZSAqLwotICAgICAvKiAgbm90ZTogZHJpdmVyIHNoYWxsIGltcGxlbWVudCB0aGlzIGNtZCBieSByZWFkICYgbXNrIGFmdGVyIHdyaXRlICovCi0KLSNkZWZpbmUgUFdSX0NNRF9QT0xMSU5HCQkJMHgwMgotICAgICAvKiAgb2Zmc2V0OiB0aGUgcmVhZCByZWdpc3RlciBvZmZzZXQgKi8KLSAgICAgLyogIG1zazogdGhlIG1hc2sgb2YgdGhlIHBvbGxlZCB2YWx1ZSAqLwotICAgICAvKiAgdmFsdWU6IHRoZSB2YWx1ZSB0byBiZSBwb2xsZWQsIG1hc2tlZCBieSB0aGUgbXNkIGZpZWxkLiAqLwotICAgICAvKiAgbm90ZTogZHJpdmVyIHNoYWxsIGltcGxlbWVudCB0aGlzIGNtZCBieSAqLwotICAgICAvKiAgZG97ICovCi0gICAgIC8qICBpZiggKFJlYWQob2Zmc2V0KSAmIG1zaykgPT0gKHZhbHVlICYgbXNrKSApICovCi0gICAgIC8qICBicmVhazsgKi8KLSAgICAgLyogIH0gd2hpbGUobm90IHRpbWVvdXQpOyAqLwotCi0jZGVmaW5lIFBXUl9DTURfREVMQVkJCQkweDAzCi0gICAgIC8qICBvZmZzZXQ6IHRoZSB2YWx1ZSB0byBkZWxheSAqLwotICAgICAvKiAgbXNrOiBOL0EgKi8KLSAgICAgLyogIHZhbHVlOiB0aGUgdW5pdCBvZiBkZWxheSwgMDogdXMsIDE6IG1zICovCi0KLSNkZWZpbmUgUFdSX0NNRF9FTkQJCQkJMHgwNAotICAgICAvKiAgb2Zmc2V0OiBOL0EgKi8KLSAgICAgLyogIG1zazogTi9BICovCi0gICAgIC8qICB2YWx1ZTogTi9BICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIDMgVGhlIHZhbHVlIG9mIGJhc2U6IDQgYml0cyAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgLyogIGRlZmluZSB0aGUgYmFzZSBhZGRyZXNzIG9mIGVhY2ggYmxvY2sgKi8KLSNkZWZpbmUgUFdSX0JBU0VBRERSX01BQwkJMHgwMAotI2RlZmluZSBQV1JfQkFTRUFERFJfVVNCCQkweDAxCi0jZGVmaW5lIFBXUl9CQVNFQUREUl9QQ0lFCQkweDAyCi0jZGVmaW5lIFBXUl9CQVNFQUREUl9TRElPCQkweDAzCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIDMgVGhlIHZhbHVlIG9mIGludGVyZmFjZV9tc2s6IDQgYml0cyAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZQlQV1JfSU5URl9TRElPX01TSwkJQklUKDApCi0jZGVmaW5lCVBXUl9JTlRGX1VTQl9NU0sJCUJJVCgxKQotI2RlZmluZQlQV1JfSU5URl9QQ0lfTVNLCQlCSVQoMikKLSNkZWZpbmUJUFdSX0lOVEZfQUxMX01TSwkJKEJJVCgwKXxCSVQoMSl8QklUKDIpfEJJVCgzKSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogMyBUaGUgdmFsdWUgb2YgZmFiX21zazogNCBiaXRzICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCVBXUl9GQUJfVFNNQ19NU0sJCUJJVCgwKQotI2RlZmluZQlQV1JfRkFCX1VNQ19NU0sJCQlCSVQoMSkKLSNkZWZpbmUJUFdSX0ZBQl9BTExfTVNLCQkJKEJJVCgwKXxCSVQoMSl8QklUKDIpfEJJVCgzKSkKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogMyBUaGUgdmFsdWUgb2YgY3V0X21zazogOCBiaXRzICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lCVBXUl9DVVRfVEVTVENISVBfTVNLCUJJVCgwKQotI2RlZmluZQlQV1JfQ1VUX0FfTVNLCQkJQklUKDEpCi0jZGVmaW5lCVBXUl9DVVRfQl9NU0sJCQlCSVQoMikKLSNkZWZpbmUJUFdSX0NVVF9DX01TSwkJCUJJVCgzKQotI2RlZmluZQlQV1JfQ1VUX0RfTVNLCQkJQklUKDQpCi0jZGVmaW5lCVBXUl9DVVRfRV9NU0sJCQlCSVQoNSkKLSNkZWZpbmUJUFdSX0NVVF9GX01TSwkJCUJJVCg2KQotI2RlZmluZQlQV1JfQ1VUX0dfTVNLCQkJQklUKDcpCi0jZGVmaW5lCVBXUl9DVVRfQUxMX01TSwkJCTB4RkYKLQotCi1lbnVtIHB3cnNlcV9kZWxheV91bml0IHsKLQlQV1JTRVFfREVMQVlfVVMsCi0JUFdSU0VRX0RFTEFZX01TLAotfTsKLQotc3RydWN0IHdsYW5fcHdyX2NmZyB7Ci0JdTE2IG9mZnNldDsKLQl1OCBjdXRfbXNrOwotCXU4IGZhYl9tc2s6NDsKLQl1OCBpbnRlcmZhY2VfbXNrOjQ7Ci0JdTggYmFzZTo0OwotCXU4IGNtZDo0OwotCXU4IG1zazsKLQl1OCB2YWx1ZTsKLX07Ci0KLQotI2RlZmluZSBHRVRfUFdSX0NGR19PRkZTRVQoX19QV1JfQ01EKQkJX19QV1JfQ01ELm9mZnNldAotI2RlZmluZSBHRVRfUFdSX0NGR19DVVRfTUFTSyhfX1BXUl9DTUQpCQlfX1BXUl9DTUQuY3V0X21zawotI2RlZmluZSBHRVRfUFdSX0NGR19GQUJfTUFTSyhfX1BXUl9DTUQpCQlfX1BXUl9DTUQuZmFiX21zawotI2RlZmluZSBHRVRfUFdSX0NGR19JTlRGX01BU0soX19QV1JfQ01EKQlfX1BXUl9DTUQuaW50ZXJmYWNlX21zawotI2RlZmluZSBHRVRfUFdSX0NGR19CQVNFKF9fUFdSX0NNRCkJCQlfX1BXUl9DTUQuYmFzZQotI2RlZmluZSBHRVRfUFdSX0NGR19DTUQoX19QV1JfQ01EKQkJCV9fUFdSX0NNRC5jbWQKLSNkZWZpbmUgR0VUX1BXUl9DRkdfTUFTSyhfX1BXUl9DTUQpCQkJX19QV1JfQ01ELm1zawotI2RlZmluZSBHRVRfUFdSX0NGR19WQUxVRShfX1BXUl9DTUQpCQlfX1BXUl9DTUQudmFsdWUKLQotCi0vKiAgKi8KLS8qCVByb3RvdHlwZSBvZiBwcm90ZWN0ZWQgZnVuY3Rpb24uICovCi0vKiAgKi8KLXU4IEhhbFB3clNlcUNtZFBhcnNpbmcyM2EoCi0Jc3RydWN0IHJ0d19hZGFwdGVyCQkqcGFkYXB0ZXIsCi0JdTgJCQkJQ3V0VmVyc2lvbiwKLQl1OAkJCQlGYWJWZXJzaW9uLAotCXU4CQkJCUludGVyZmFjZVR5cGUsCi0Jc3RydWN0IHdsYW5fcHdyX2NmZwlQd3JDZmdDbWRbXSk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbFZlckRlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbFZlckRlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTBlNGVhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxWZXJEZWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19IQUxfVkVSU0lPTl9ERUZfSF9fCi0jZGVmaW5lIF9fSEFMX1ZFUlNJT05fREVGX0hfXwotCi1lbnVtIGhhbF9pY190eXBlIHsKLQlDSElQXzgxOTJTCQk9CTAsCi0JQ0hJUF84MTg4Qwk9CTEsCi0JQ0hJUF84MTkyQwk9CTIsCi0JQ0hJUF84MTkyRAk9CTMsCi0JQ0hJUF84NzIzQQk9CTQsCi0JQ0hJUF84MTg4RQk9CTUsCi0JQ0hJUF84ODgxQQk9CTYsCi0JQ0hJUF84ODEyQQk9CTcsCi0JQ0hJUF84ODIxQQk9CTgsCi0JQ0hJUF84NzIzQgk9CTksCi0JQ0hJUF84MTkyRQkJPQkxMCwKLX07Ci0KLWVudW0gaGFsX2NoaXBfdHlwZSB7Ci0JVEVTVF9DSElQCQk9CTAsCi0JTk9STUFMX0NISVAJCT0JMSwKLQlGUEdBCQkJPQkyLAotfTsKLQotZW51bSBoYWxfY3V0X3ZlcnNpb24gewotCUFfQ1VUX1ZFUlNJT04JCT0JMCwKLQlCX0NVVF9WRVJTSU9OCQk9CTEsCi0JQ19DVVRfVkVSU0lPTgkJPQkyLAotCURfQ1VUX1ZFUlNJT04JCT0JMywKLQlFX0NVVF9WRVJTSU9OCQk9CTQsCi0JRl9DVVRfVkVSU0lPTgkJPQk1LAotCUdfQ1VUX1ZFUlNJT04JCT0JNiwKLX07Ci0KLS8qICBIQUxfTWFudWZhY3R1cmVyICovCi1lbnVtIGhhbF92ZW5kb3IgewotCUNISVBfVkVORE9SX1RTTUMJPQkwLAotCUNISVBfVkVORE9SX1VNQwkJPQkxLAotfTsKLQotc3RydWN0IGhhbF92ZXJzaW9uIHsKLQllbnVtIGhhbF9pY190eXBlCUlDVHlwZTsKLQllbnVtIGhhbF9jaGlwX3R5cGUJQ2hpcFR5cGU7Ci0JZW51bSBoYWxfY3V0X3ZlcnNpb24JQ1VUVmVyc2lvbjsKLQllbnVtIGhhbF92ZW5kb3IJCVZlbmRvclR5cGU7Ci0JdTgJCQlST01WZXI7Ci19OwotCi0vKiAgR2V0IGVsZW1lbnQgKi8KLSNkZWZpbmUgR0VUX0NWSURfSUNfVFlQRSh2ZXJzaW9uKQkoKHZlcnNpb24pLklDVHlwZSkKLSNkZWZpbmUgR0VUX0NWSURfQ0hJUF9UWVBFKHZlcnNpb24pCSgodmVyc2lvbikuQ2hpcFR5cGUpCi0jZGVmaW5lIEdFVF9DVklEX01BTlVGQUNUVUVSKHZlcnNpb24pCSgodmVyc2lvbikuVmVuZG9yVHlwZSkKLSNkZWZpbmUgR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikJKCh2ZXJzaW9uKS5DVVRWZXJzaW9uKQotI2RlZmluZSBHRVRfQ1ZJRF9ST01fVkVSU0lPTih2ZXJzaW9uKQkoKCh2ZXJzaW9uKS5ST01WZXIpICYgUk9NX1ZFUlNJT05fTUFTSykKLQotLyogQ29tbW9uIE1hY3JvLiAtLSAqLwotCi0jZGVmaW5lIElTXzgxWFhDKHZlcnNpb24pCQkJXAotCSgoKEdFVF9DVklEX0lDX1RZUEUodmVyc2lvbikgPT0gQ0hJUF84MTkyQykgfHwJXAotCSAoR0VUX0NWSURfSUNfVFlQRSh2ZXJzaW9uKSA9PSBDSElQXzgxODhDKSkgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTXzg3MjNfU0VSSUVTKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfSUNfVFlQRSh2ZXJzaW9uKSA9PSBDSElQXzg3MjNBKSA/IHRydWUgOiBmYWxzZSkKLQotI2RlZmluZSBJU19URVNUX0NISVAodmVyc2lvbikJCQlcCi0JKChHRVRfQ1ZJRF9DSElQX1RZUEUodmVyc2lvbikgPT0gVEVTVF9DSElQKSA/IHRydWUgOiBmYWxzZSkKLSNkZWZpbmUgSVNfTk9STUFMX0NISVAodmVyc2lvbikJCQlcCi0JKChHRVRfQ1ZJRF9DSElQX1RZUEUodmVyc2lvbikgPT0gTk9STUFMX0NISVApID8gdHJ1ZSA6IGZhbHNlKQotCi0jZGVmaW5lIElTX0FfQ1VUKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikgPT0gQV9DVVRfVkVSU0lPTikgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTX0JfQ1VUKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikgPT0gQl9DVVRfVkVSU0lPTikgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTX0NfQ1VUKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikgPT0gQ19DVVRfVkVSU0lPTikgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTX0RfQ1VUKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikgPT0gRF9DVVRfVkVSU0lPTikgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTX0VfQ1VUKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfQ1VUX1ZFUlNJT04odmVyc2lvbikgPT0gRV9DVVRfVkVSU0lPTikgPyB0cnVlIDogZmFsc2UpCi0KLSNkZWZpbmUgSVNfQ0hJUF9WRU5ET1JfVFNNQyh2ZXJzaW9uKQkJXAotCSgoR0VUX0NWSURfTUFOVUZBQ1RVRVIodmVyc2lvbikgPT0gQ0hJUF9WRU5ET1JfVFNNQykgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElTX0NISVBfVkVORE9SX1VNQyh2ZXJzaW9uKQkJXAotCSgoR0VUX0NWSURfTUFOVUZBQ1RVRVIodmVyc2lvbikgPT0gQ0hJUF9WRU5ET1JfVU1DKSA/IHRydWUgOiBmYWxzZSkKLQotLyogQ2hpcCB2ZXJzaW9uIE1hY3JvLiAtLSAqLwotCi0jZGVmaW5lIElTXzgxeHhDX1ZFTkRPUl9VTUNfQV9DVVQodmVyc2lvbikJCQlcCi0JKElTXzgxWFhDKHZlcnNpb24pPyhJU19DSElQX1ZFTkRPUl9VTUModmVyc2lvbikgPwlcCi0JKElTX0FfQ1VUKHZlcnNpb24pID8gdHJ1ZSA6IGZhbHNlKSA6IGZhbHNlKSA6IGZhbHNlKQotI2RlZmluZSBJU184MXh4Q19WRU5ET1JfVU1DX0JfQ1VUKHZlcnNpb24pCQkJXAotCShJU184MVhYQyh2ZXJzaW9uKSA/IChJU19DSElQX1ZFTkRPUl9VTUModmVyc2lvbikgPwlcCi0JIChJU19CX0NVVCh2ZXJzaW9uKSA/IHRydWUgOiBmYWxzZSkgOiBmYWxzZSk6IGZhbHNlKQotI2RlZmluZSBJU184MXh4Q19WRU5ET1JfVU1DX0NfQ1VUKHZlcnNpb24pCQkJXAotCShJU184MVhYQyh2ZXJzaW9uKT8oSVNfQ0hJUF9WRU5ET1JfVU1DKHZlcnNpb24pID8JXAotCShJU19DX0NVVCh2ZXJzaW9uKSA/IHRydWUgOiBmYWxzZSkgOiBmYWxzZSkgOiBmYWxzZSkKLSNkZWZpbmUgSVNfODcyM0FfQV9DVVQodmVyc2lvbikJCQkJXAotCSgoSVNfODcyM19TRVJJRVModmVyc2lvbikpID8gKElTX0FfQ1VUKHZlcnNpb24pID8gdHJ1ZSA6IGZhbHNlKSA6IGZhbHNlKQotI2RlZmluZSBJU184NzIzQV9CX0NVVCh2ZXJzaW9uKQkJCQkJXAotCSgoSVNfODcyM19TRVJJRVModmVyc2lvbikpID8gKElTX0JfQ1VUKHZlcnNpb24pID8gdHJ1ZSA6IGZhbHNlKSA6IGZhbHNlKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9kcnZfdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9kcnZfdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgzNDYzYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvZHJ2X3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQlGb3IgdHlwZSBkZWZpbmVzIGFuZCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVzCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotI2lmbmRlZiBfX0RSVl9UWVBFU19IX18KLSNkZWZpbmUgX19EUlZfVFlQRVNfSF9fCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8d2xhbl9ic3NkZWYuaD4KLQotCi1lbnVtIF9OSUNfVkVSU0lPTiB7Ci0JUlRMODcxMV9OSUMsCi0JUlRMODcxMl9OSUMsCi0JUlRMODcxM19OSUMsCi0JUlRMODcxNl9OSUMKLQotfTsKLQotCi0jaW5jbHVkZSA8cnR3X2h0Lmg+Ci0KLSNpbmNsdWRlIDxydHdfY21kLmg+Ci0jaW5jbHVkZSA8cnR3X3htaXQuaD4KLSNpbmNsdWRlIDxydHdfcmVjdi5oPgotI2luY2x1ZGUgPGhhbF9pbnRmLmg+Ci0jaW5jbHVkZSA8aGFsX2NvbS5oPgotI2luY2x1ZGUgPHJ0d19zZWN1cml0eS5oPgotI2luY2x1ZGUgPHJ0d19wd3JjdHJsLmg+Ci0jaW5jbHVkZSA8cnR3X2lvLmg+Ci0jaW5jbHVkZSA8cnR3X2VlcHJvbS5oPgotI2luY2x1ZGUgPHN0YV9pbmZvLmg+Ci0jaW5jbHVkZSA8cnR3X21sbWUuaD4KLSNpbmNsdWRlIDxydHdfZGVidWcuaD4KLSNpbmNsdWRlIDxydHdfcmYuaD4KLSNpbmNsdWRlIDxydHdfZXZlbnQuaD4KLSNpbmNsdWRlIDxydHdfbWxtZV9leHQuaD4KLSNpbmNsdWRlIDxydHdfYXAuaD4KLQotI2luY2x1ZGUgImlvY3RsX2NmZzgwMjExLmgiCi0KLXN0cnVjdCByZWdpc3RyeV9wcml2IHsKLQl1OAljaGlwX3ZlcnNpb247Ci0JdTgJcmZpbnRmczsKLQlzdHJ1Y3QJY2ZnODAyMTFfc3NpZCBzc2lkOwotCXU4CWNoYW5uZWw7LyogYWQtaG9jIHN1cHBvcnQgcmVxdWlyZW1lbnQgKi8KLQl1OAl3aXJlbGVzc19tb2RlOy8qIEEsIEIsIEcsIGF1dG8gKi8KLQl1OAlzY2FuX21vZGU7LyogYWN0aXZlLCBwYXNzaXZlICovCi0JdTgJcHJlYW1ibGU7LyogbG9uZywgc2hvcnQsIGF1dG8gKi8KLQl1OAl2cnRsX2NhcnJpZXJfc2Vuc2U7LyogRW5hYmxlLCBEaXNhYmxlLCBBdXRvICovCi0JdTgJdmNzX3R5cGU7LyogUlRTL0NUUywgQ1RTLXRvLXNlbGYgKi8KLQl1MTYJcnRzX3RocmVzaDsKLQl1MTYgIGZyYWdfdGhyZXNoOwotCXU4CWFkaG9jX3R4X3B3cjsKLQl1OAlzb2Z0X2FwOwotCXU4CXBvd2VyX21nbnQ7Ci0JdTgJaXBzX21vZGU7Ci0JdTgJc21hcnRfcHM7Ci0JdTgJbG9uZ19yZXRyeV9sbXQ7Ci0JdTgJc2hvcnRfcmV0cnlfbG10OwotCXUxNglidXN5X3RocmVzaDsKLQl1OAlhY2tfcG9saWN5OwotCXU4CXNvZnR3YXJlX2VuY3J5cHQ7Ci0JdTgJc29mdHdhcmVfZGVjcnlwdDsKLQl1OAlhY21fbWV0aG9kOwotCSAgLyogVUFQU0QgKi8KLQl1OAl3bW1fZW5hYmxlOwotCXU4CXVhcHNkX2VuYWJsZTsKLQotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICAgIGRldl9uZXR3b3JrOwotCi0JdTgJaHRfZW5hYmxlOwotCXU4CWNidzQwX2VuYWJsZTsKLQl1OAlhbXBkdV9lbmFibGU7LyogZm9yIHR4ICovCi0JdTgJcnhfc3RiYzsKLQl1OAlhbXBkdV9hbXNkdTsvKiBBLU1QRFUgU3VwcG9ydHMgQS1NU0RVIGlzIHBlcm1pdHRlZCAqLwotCXU4CWxvd3JhdGVfdHdvX3htaXQ7Ci0KLQl1OAlyZl9jb25maWc7Ci0JdTgJbG93X3Bvd2VyOwotCi0JdTgJd2lmaV9zcGVjOy8qICAhdHVyYm9fbW9kZSAqLwotCi0JdTgJY2hhbm5lbF9wbGFuOwotI2lmZGVmIENPTkZJR184NzIzQVVfQlRfQ09FWElTVAotCXU4CWJ0Y29leDsKLQl1OAlidF9pc287Ci0JdTgJYnRfc2NvOwotCXU4CWJ0X2FtcGR1OwotI2VuZGlmCi0JYm9vbAliQWNjZXB0QWRkYmFSZXE7Ci0KLQl1OAlhbnRkaXZfY2ZnOwotCXU4CWFudGRpdl90eXBlOwotCi0JdTgJaHdwZG5fbW9kZTsvKiAwOmRpc2FibGUsMTplbmFibGUsMjpkZWNpZGUgYnkgRUZVU0UgY29uZmlnICovCi0JdTgJaHdwd3JwX2RldGVjdDsvKiAwOmRpc2FibGUsMTplbmFibGUgKi8KLQotCXU4CWh3X3dwc19wYmM7LyogMDpkaXNhYmxlLDE6ZW5hYmxlICovCi0KLQl1OAltYXhfcm9hbWluZ190aW1lczsgLyogbWF4IG51bWJlciBkcml2ZXIgd2lsbCB0cnkgdG8gcm9hbWluZyAqLwotCi0JdTggZW5hYmxlODAyMTFkOwotCi0JdTggaWZuYW1lWzE2XTsKLQl1OCBpZjJuYW1lWzE2XTsKLQotCXU4IG5vdGNoX2ZpbHRlcjsKLQotCXU4IHJlZ3VsYXRvcnlfdGlkOwotfTsKLQotCi0jZGVmaW5lIE1BWF9DT05USU5VQUxfVVJCX0VSUiA0Ci0KLSNkZWZpbmUgR0VUX1BSSU1BUllfQURBUFRFUihwYWRhcHRlcikJCQkJCVwKLQkoKChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKilwYWRhcHRlciktPmR2b2JqLT5pZjEpCi0KLWVudW0gX0lGQUNFX0lEIHsKLQlJRkFDRV9JRDAsIC8qIG1hcGluZyB0byBQUklNQVJZX0FEQVBURVIgKi8KLQlJRkFDRV9JRDEsIC8qIG1hcGluZyB0byBTRUNPTkRBUllfQURBUFRFUiAqLwotCUlGQUNFX0lEMiwKLQlJRkFDRV9JRDMsCi0JSUZBQ0VfSURfTUFYLAotfTsKLQotc3RydWN0IGR2b2JqX3ByaXYgewotCXN0cnVjdCBydHdfYWRhcHRlciAqaWYxOyAvKiBQUklNQVJZX0FEQVBURVIgKi8KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmlmMjsgLyogU0VDT05EQVJZX0FEQVBURVIgKi8KLQotCS8qIGZvciBsb2NhbC9nbG9iYWwgc3luY2hyb25pemF0aW9uICovCi0Jc3RydWN0IG11dGV4IGh3X2luaXRfbXV0ZXg7Ci0Jc3RydWN0IG11dGV4IGgyY19md2NtZF9tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggc2V0Y2hfbXV0ZXg7Ci0Jc3RydWN0IG11dGV4IHNldGJ3X211dGV4OwotCi0JdW5zaWduZWQgY2hhcglvcGVyX2NoYW5uZWw7IC8qIHNhdmVkIGNoYW4gaW5mbyB3aGVuIHNldCBjaGFuIGJ3ICovCi0JdW5zaWduZWQgY2hhcglvcGVyX2J3bW9kZTsKLQl1bnNpZ25lZCBjaGFyCW9wZXJfY2hfb2Zmc2V0Oy8qIFBSSU1FX0NITkxfT0ZGU0VUICovCi0KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyc1tJRkFDRV9JRF9NQVhdOwotCXU4IGlmYWNlX251bXM7IC8qICB0b3RhbCBudW1iZXIgb2YgaWZhY2VzIHVzZWQgcnVudGltZSAqLwotCi0JLyogRm9yIDkyRCwgRE1EUCBoYXZlIDIgaW50ZXJmYWNlLiAqLwotCXU4CUludGVyZmFjZU51bWJlcjsKLQl1OAlOdW1JbnRlcmZhY2VzOwotCi0JLyogSW4gL091dCBQaXBlIGluZm9ybWF0aW9uICovCi0JaW50CVJ0SW5QaXBlWzJdOwotCWludAlSdE91dFBpcGVbM107Ci0JdTgJUXVldWUyUGlwZVtIV19RVUVVRV9FTlRSWV07LyogZm9yIG91dCBwaXBlIG1hcHBpbmcgKi8KLQotLyotLS0tLS0tLSBiZWxvdyBpcyBmb3IgVVNCIElOVEVSRkFDRSAtLS0tLS0tLSovCi0KLQl1OAlucl9lbmRwb2ludDsKLQl1OAlpc2hpZ2hzcGVlZDsKLQl1OAlSdE51bUluUGlwZXM7Ci0JdTgJUnROdW1PdXRQaXBlczsKLQlpbnQJZXBfbnVtWzVdOyAvKiBlbmRwb2ludCBudW1iZXIgKi8KLQotCXN0cnVjdCBtdXRleCB1c2JfdmVuZG9yX3JlcV9tdXRleDsKLQotCXVuaW9uIHsKLQkJX19sZTMyIHZhbDMyOwotCQlfX2xlMTYgdmFsMTY7Ci0JCXU4IHZhbDg7Ci0JfSB1c2JfYnVmOwotCi0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JpbnRmOwotCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiZGV2OwotCWF0b21pY190IGNvbnRpbnVhbF91cmJfZXJyb3I7Ci0KLS8qLS0tLS0tLS0gYmVsb3cgaXMgZm9yIFBDSUUgSU5URVJGQUNFIC0tLS0tLS0tKi8KLQotfTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlICpkdm9ial90b19kZXYoc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqKQotewotCS8qIHRvZG86IGdldCBpbnRlcmZhY2UgdHlwZSBmcm9tIGR2b2JqIGFuZCB0aGUgcmV0dXJuIHRoZSBkZXYgYWNjb3JkaW5nbHkgKi8KLQlyZXR1cm4gJmR2b2JqLT5wdXNiaW50Zi0+ZGV2OwotfQotCi1lbnVtIF9JRkFDRV9UWVBFIHsKLQlJRkFDRV9QT1JUMCwgLyogbWFwcGluZyB0byBwb3J0MCBmb3IgQy9EIHNlcmllcyBjaGlwcyAqLwotCUlGQUNFX1BPUlQxLCAvKiBtYXBwaW5nIHRvIHBvcnQxIGZvciBDL0Qgc2VyaWVzIGNoaXAgKi8KLQlNQVhfSUZBQ0VfUE9SVCwKLX07Ci0KLWVudW0gX0FEQVBURVJfVFlQRSB7Ci0JUFJJTUFSWV9BREFQVEVSLAotCVNFQ09OREFSWV9BREFQVEVSLAotCU1BWF9BREFQVEVSLAotfTsKLQotc3RydWN0IHJ0d19hZGFwdGVyIHsKLQlpbnQJcGlkWzNdOy8qIHByb2Nlc3MgaWQgZnJvbSBVSSwgMDp3cHMsIDE6aG9zdGFwZCwgMjpkaGNwY2QgKi8KLQlpbnQJYkRvbmdsZTsvKiBidWlsZC1pbiBtb2R1bGUgb3IgZXh0ZXJuYWwgZG9uZ2xlICovCi0JdTE2CWNoaXBfdHlwZTsKLQl1MTYJSGFyZHdhcmVUeXBlOwotCi0Jc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqOwotCXN0cnVjdAltbG1lX3ByaXYgbWxtZXByaXY7Ci0Jc3RydWN0CW1sbWVfZXh0X3ByaXYgbWxtZWV4dHByaXY7Ci0Jc3RydWN0CWNtZF9wcml2CWNtZHByaXY7Ci0Jc3RydWN0CWV2dF9wcml2CWV2dHByaXY7Ci0Jc3RydWN0CXhtaXRfcHJpdgl4bWl0cHJpdjsKLQlzdHJ1Y3QJcmVjdl9wcml2CXJlY3Zwcml2OwotCXN0cnVjdAlzdGFfcHJpdglzdGFwcml2OwotCXN0cnVjdAlzZWN1cml0eV9wcml2CXNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QJcmVnaXN0cnlfcHJpdglyZWdpc3RyeXByaXY7Ci0Jc3RydWN0CXB3cmN0cmxfcHJpdglwd3JjdHJscHJpdjsKLQlzdHJ1Y3QJZWVwcm9tX3ByaXYgZWVwcm9tcHJpdjsKLQotCXUzMglzZXRiYW5kOwotCi0Jdm9pZCAqSGFsRGF0YTsKLQotCXMzMgliRHJpdmVyU3RvcHBlZDsKLQlzMzIJYlN1cnByaXNlUmVtb3ZlZDsKLQlzMzIgIGJDYXJkRGlzYWJsZVdPSFNNOwotCi0JdTMyCUlzckNvbnRlbnQ7Ci0JdTMyCUltckNvbnRlbnQ7Ci0KLQl1OAlFZXByb21BZGRyZXNzU2l6ZTsKLQl1OAlod19pbml0X2NvbXBsZXRlZDsKLQl1OAliRHJpdmVySXNHb2luZ1RvVW5sb2FkOwotCXU4CWluaXRfYWRwdF9pbl9wcm9ncmVzczsKLQl1OAliSGFsdEluUHJvZ3Jlc3M7Ci0KLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldjsKLQotCS8qICB1c2VkIGJ5IHJ0d19yZXJlZ19uZF9uYW1lIHJlbGF0ZWQgZnVuY3Rpb24gKi8KLQlpbnQgYnVwOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCi0Jc3RydWN0IHdpcmVsZXNzX2RldiAqcnR3X3dkZXY7Ci0JaW50IG5ldF9jbG9zZWQ7Ci0KLQl1OCBiRldSZWFkeTsKLQl1OCBiUmVhZFBvcnRDYW5jZWw7Ci0JdTggYldyaXRlUG9ydENhbmNlbDsKLQotCS8qIGV4dGVuZCB0byBzdXBwb3J0IG11bHRpIGludGVyZmFjZSAqLwotCS8qIElGQUNFX0lEMCBpcyBlcXVhbHMgdG8gUFJJTUFSWV9BREFQVEVSICovCi0JLyogSUZBQ0VfSUQxIGlzIGVxdWFscyB0byBTRUNPTkRBUllfQURBUFRFUiAqLwotCXU4IGlmYWNlX2lkOwotfTsKLQotI2RlZmluZSBhZGFwdGVyX3RvX2R2b2JqKGFkYXB0ZXIpIChhZGFwdGVyLT5kdm9iaikKLQotc3RhdGljIGlubGluZSB1OCAqbXlpZChzdHJ1Y3QgZWVwcm9tX3ByaXYgKnBlZXByaXYpCi17Ci0JcmV0dXJuIHBlZXByaXYtPm1hY19hZGRyOwotfQotCi0jZW5kaWYgLyogX19EUlZfVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaGFsX2NvbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9jb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM1MDMyMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaGFsX2NvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX0hBTF9DT01NT05fSF9fCi0jZGVmaW5lIF9fSEFMX0NPTU1PTl9IX18KLQotLyogICovCi0vKiAgICAgICAgUmF0ZSBEZWZpbml0aW9uICovCi0vKiAgKi8KLS8qIENDSyAqLwotI2RlZmluZQlSQVRSXzFNCQkJCQkweDAwMDAwMDAxCi0jZGVmaW5lCVJBVFJfMk0JCQkJCTB4MDAwMDAwMDIKLSNkZWZpbmUJUkFUUl81NU0JCQkJMHgwMDAwMDAwNAotI2RlZmluZQlSQVRSXzExTQkJCQkweDAwMDAwMDA4Ci0vKiBPRkRNICovCi0jZGVmaW5lCVJBVFJfNk0JCQkJCTB4MDAwMDAwMTAKLSNkZWZpbmUJUkFUUl85TQkJCQkJMHgwMDAwMDAyMAotI2RlZmluZQlSQVRSXzEyTQkJCQkweDAwMDAwMDQwCi0jZGVmaW5lCVJBVFJfMThNCQkJCTB4MDAwMDAwODAKLSNkZWZpbmUJUkFUUl8yNE0JCQkJMHgwMDAwMDEwMAotI2RlZmluZQlSQVRSXzM2TQkJCQkweDAwMDAwMjAwCi0jZGVmaW5lCVJBVFJfNDhNCQkJCTB4MDAwMDA0MDAKLSNkZWZpbmUJUkFUUl81NE0JCQkJMHgwMDAwMDgwMAotLyogTUNTIDEgU3BhdGlhbCBTdHJlYW0gKi8KLSNkZWZpbmUJUkFUUl9NQ1MwCQkJCTB4MDAwMDEwMDAKLSNkZWZpbmUJUkFUUl9NQ1MxCQkJCTB4MDAwMDIwMDAKLSNkZWZpbmUJUkFUUl9NQ1MyCQkJCTB4MDAwMDQwMDAKLSNkZWZpbmUJUkFUUl9NQ1MzCQkJCTB4MDAwMDgwMDAKLSNkZWZpbmUJUkFUUl9NQ1M0CQkJCTB4MDAwMTAwMDAKLSNkZWZpbmUJUkFUUl9NQ1M1CQkJCTB4MDAwMjAwMDAKLSNkZWZpbmUJUkFUUl9NQ1M2CQkJCTB4MDAwNDAwMDAKLSNkZWZpbmUJUkFUUl9NQ1M3CQkJCTB4MDAwODAwMDAKLS8qIE1DUyAyIFNwYXRpYWwgU3RyZWFtICovCi0jZGVmaW5lCVJBVFJfTUNTOAkJCQkweDAwMTAwMDAwCi0jZGVmaW5lCVJBVFJfTUNTOQkJCQkweDAwMjAwMDAwCi0jZGVmaW5lCVJBVFJfTUNTMTAJCQkJMHgwMDQwMDAwMAotI2RlZmluZQlSQVRSX01DUzExCQkJCTB4MDA4MDAwMDAKLSNkZWZpbmUJUkFUUl9NQ1MxMgkJCQkweDAxMDAwMDAwCi0jZGVmaW5lCVJBVFJfTUNTMTMJCQkJMHgwMjAwMDAwMAotI2RlZmluZQlSQVRSX01DUzE0CQkJCTB4MDQwMDAwMDAKLSNkZWZpbmUJUkFUUl9NQ1MxNQkJCQkweDA4MDAwMDAwCi0KLS8qIENDSyAqLwotI2RlZmluZSBSQVRFXzFNCQkJCQlCSVQoMCkKLSNkZWZpbmUgUkFURV8yTQkJCQkJQklUKDEpCi0jZGVmaW5lIFJBVEVfNV81TQkJCQlCSVQoMikKLSNkZWZpbmUgUkFURV8xMU0JCQkJQklUKDMpCi0vKiBPRkRNICovCi0jZGVmaW5lIFJBVEVfNk0JCQkJCUJJVCg0KQotI2RlZmluZSBSQVRFXzlNCQkJCQlCSVQoNSkKLSNkZWZpbmUgUkFURV8xMk0JCQkJQklUKDYpCi0jZGVmaW5lIFJBVEVfMThNCQkJCUJJVCg3KQotI2RlZmluZSBSQVRFXzI0TQkJCQlCSVQoOCkKLSNkZWZpbmUgUkFURV8zNk0JCQkJQklUKDkpCi0jZGVmaW5lIFJBVEVfNDhNCQkJCUJJVCgxMCkKLSNkZWZpbmUgUkFURV81NE0JCQkJQklUKDExKQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUeCBEZXNjIGRlZmluaXRpb24gTWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIHByYWdtYSBtYXJrIC0tIFR4IERlc2MgcmVsYXRlZCBkZWZpbml0aW9uLiAtLSAqLwotLyogICovCi0vKiAgKi8KLS8qCVJhdGUgKi8KLS8qICAqLwotLyogIENDSyBSYXRlcywgVHhIVCA9IDAgKi8KLSNkZWZpbmUgREVTQ19SQVRFMU0JCQkJMHgwMAotI2RlZmluZSBERVNDX1JBVEUyTQkJCQkweDAxCi0jZGVmaW5lIERFU0NfUkFURTVfNU0JCQkJMHgwMgotI2RlZmluZSBERVNDX1JBVEUxMU0JCQkJMHgwMwotCi0vKiAgT0ZETSBSYXRlcywgVHhIVCA9IDAgKi8KLSNkZWZpbmUgREVTQ19SQVRFNk0JCQkJMHgwNAotI2RlZmluZSBERVNDX1JBVEU5TQkJCQkweDA1Ci0jZGVmaW5lIERFU0NfUkFURTEyTQkJCQkweDA2Ci0jZGVmaW5lIERFU0NfUkFURTE4TQkJCQkweDA3Ci0jZGVmaW5lIERFU0NfUkFURTI0TQkJCQkweDA4Ci0jZGVmaW5lIERFU0NfUkFURTM2TQkJCQkweDA5Ci0jZGVmaW5lIERFU0NfUkFURTQ4TQkJCQkweDBhCi0jZGVmaW5lIERFU0NfUkFURTU0TQkJCQkweDBiCi0KLS8qICBNQ1MgUmF0ZXMsIFR4SFQgPSAxICovCi0jZGVmaW5lIERFU0NfUkFURU1DUzAJCQkJMHgwYwotI2RlZmluZSBERVNDX1JBVEVNQ1MxCQkJCTB4MGQKLSNkZWZpbmUgREVTQ19SQVRFTUNTMgkJCQkweDBlCi0jZGVmaW5lIERFU0NfUkFURU1DUzMJCQkJMHgwZgotI2RlZmluZSBERVNDX1JBVEVNQ1M0CQkJCTB4MTAKLSNkZWZpbmUgREVTQ19SQVRFTUNTNQkJCQkweDExCi0jZGVmaW5lIERFU0NfUkFURU1DUzYJCQkJMHgxMgotI2RlZmluZSBERVNDX1JBVEVNQ1M3CQkJCTB4MTMKLSNkZWZpbmUgREVTQ19SQVRFTUNTOAkJCQkweDE0Ci0jZGVmaW5lIERFU0NfUkFURU1DUzkJCQkJMHgxNQotI2RlZmluZSBERVNDX1JBVEVNQ1MxMAkJCQkweDE2Ci0jZGVmaW5lIERFU0NfUkFURU1DUzExCQkJCTB4MTcKLSNkZWZpbmUgREVTQ19SQVRFTUNTMTIJCQkJMHgxOAotI2RlZmluZSBERVNDX1JBVEVNQ1MxMwkJCQkweDE5Ci0jZGVmaW5lIERFU0NfUkFURU1DUzE0CQkJCTB4MWEKLSNkZWZpbmUgREVTQ19SQVRFTUNTMTUJCQkJMHgxYgotI2RlZmluZSBERVNDX1JBVEVNQ1MxNV9TRwkJCTB4MWMKLSNkZWZpbmUgREVTQ19SQVRFTUNTMzIJCQkJMHgyMAotCi0jZGVmaW5lIFJFR19QMlBfQ1RXSU4JCQkJCTB4MDU3MiAvKiAgMSBCeXRlIGxvbmcgKGluIHVuaXQgb2YgVFUpICovCi0jZGVmaW5lIFJFR19OT0FfREVTQ19TRUwJCQkJMHgwNUNGCi0jZGVmaW5lIFJFR19OT0FfREVTQ19EVVJBVElPTgkJMHgwNUUwCi0jZGVmaW5lIFJFR19OT0FfREVTQ19JTlRFUlZBTAkJCTB4MDVFNAotI2RlZmluZSBSRUdfTk9BX0RFU0NfU1RBUlQJCQkweDA1RTgKLSNkZWZpbmUgUkVHX05PQV9ERVNDX0NPVU5UCQkJMHgwNUVDCi0KLSNpbmNsdWRlICJIYWxWZXJEZWYuaCIKLQotCi11OAkvKiByZXR1cm4gdGhlIGZpbmFsIGNoYW5uZWwgcGxhbiBkZWNpc2lvbiAqLwotaGFsX2NvbV9nZXRfY2hhbm5lbF9wbGFuMjNhKAotCXN0cnVjdCBydHdfYWRhcHRlcgkqcGFkYXB0ZXIsCi0JdTgJCQlod19jaGFubmVsX3BsYW4sCS8qIGNoYW5uZWwgcGxhbiBmcm9tIEhXIChlZnVzZS9lZXByb20pICovCi0JdTgJCQlzd19jaGFubmVsX3BsYW4sCS8qIGNoYW5uZWwgcGxhbiBmcm9tIFNXIChyZWdpc3RyeS9tb2R1bGUgcGFyYW0pICovCi0JdTgJCQlkZWZfY2hhbm5lbF9wbGFuLAkvKiBjaGFubmVsIHBsYW4gdXNlZCB3aGVuIHRoZSBmb3JtZXIgdHdvIGlzIGludmFsaWQgKi8KLQlib29sCQlBdXRvTG9hZEZhaWwKLQkpOwotCi11OAlNUmF0ZVRvSHdSYXRlMjNhKHU4IHJhdGUpOwotCi12b2lkIEhhbFNldEJyYXRlQ2ZnMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICptQnJhdGVzT1MpOwotCi1ib29sCi1IYWxfTWFwcGluZ091dFBpcGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggTnVtT3V0UGlwZSk7Ci0KLXZvaWQgYzJoX2V2dF9jbGVhcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotczMyIGMyaF9ldnRfcmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpidWYpOwotCi12b2lkIHJ0bDg3MjNhX3NldF9hbXBkdV9taW5fc3BhY2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggTWluU3BhY2luZ1RvU2V0KTsKLXZvaWQgcnRsODcyM2Ffc2V0X2FtcGR1X2ZhY3RvcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBGYWN0b3JUb1NldCk7Ci12b2lkIHJ0bDg3MjNhX3NldF9hY21fY3RybChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBjdHJsKTsKLXZvaWQgcnRsODcyM2Ffc2V0X21lZGlhX3N0YXR1cyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzdGF0dXMpOwotdm9pZCBydGw4NzIzYV9zZXRfbWVkaWFfc3RhdHVzMShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzdGF0dXMpOwotdm9pZCBydGw4NzIzYV9zZXRfYmNuX2Z1bmMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsKTsKLXZvaWQgcnRsODcyM2FfY2hlY2tfYnNzaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsKTsKLXZvaWQgcnRsODcyM2FfbWxtZV9zaXRlc3VydmV5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGZsYWcpOwotdm9pZCBydGw4NzIzYV9vbl9yY3JfYW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX29mZl9yY3JfYW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX3NldF9zbG90X3RpbWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggc2xvdHRpbWUpOwotdm9pZCBydGw4NzIzYV9hY2tfcHJlYW1ibGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlNob3J0UHJlYW1ibGUpOwotdm9pZCBydGw4NzIzYV9zZXRfc2VjX2NmZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzZWMpOwotdm9pZCBydGw4NzIzYV9jYW1fZW1wdHlfZW50cnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdWNJbmRleCk7Ci12b2lkIHJ0bDg3MjNhX2NhbV9pbnZhbGlkYXRlX2FsbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfY2FtX3dyaXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQl1OCBlbnRyeSwgdTE2IGN0cmwsIGNvbnN0IHU4ICptYWMsIGNvbnN0IHU4ICprZXkpOwotdm9pZCBydGw4NzIzYV9maWZvX2NsZWFudXAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX3NldF9hcGZtX29uX21hYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWwpOwotdm9pZCBydGw4NzIzYV9iY25fdmFsaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHJ0bDg3MjNhX2dldF9iY25fdmFsaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX3NldF9iZWFjb25faW50ZXJ2YWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGludGVydmFsKTsKLXZvaWQgcnRsODcyM2Ffc2V0X3Jlc3Bfc2lmcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIHU4IHIydDEsIHU4IHIydDIsIHU4IHQydDEsIHU4IHQydDIpOwotdm9pZCBydGw4NzIzYV9zZXRfYWNfcGFyYW1fdm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHZvKTsKLXZvaWQgcnRsODcyM2Ffc2V0X2FjX3BhcmFtX3ZpKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2aSk7Ci12b2lkIHJ0bDg3MjNhX3NldF9hY19wYXJhbV9iZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgYmUpOwotdm9pZCBydGw4NzIzYV9zZXRfYWNfcGFyYW1fYmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGJrKTsKLXZvaWQgcnRsODcyM2Ffc2V0X3J4ZG1hX2FnZ19wZ190aChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWwpOwotdm9pZCBydGw4NzIzYV9zZXRfaW5pdGlhbF9nYWluKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiByeF9nYWluKTsKLQotdm9pZCBydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X3dyaXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiB2YWwpOwotdm9pZCBydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X2JhY2t1cChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9yZXN0b3JlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9vZG1fc3VwcG9ydF9hYmlsaXR5X3NldChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgdmFsKTsKLXZvaWQgcnRsODcyM2Ffb2RtX3N1cHBvcnRfYWJpbGl0eV9jbHIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIHZhbCk7Ci0KLXZvaWQgcnRsODcyM2Ffc2V0X3Jwd20oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdmFsKTsKLXU4IHJ0bDg3MjNhX2dldF9yZl90eXBlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBydGw4NzIzYV9nZXRfZndscHNfcmZfb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHJ0bDg3MjNhX2Noa19oaV9xdWV1ZV9lbXB0eShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotI2VuZGlmIC8qIF9fSEFMX0NPTU1PTl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9oYWxfaW50Zi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9pbnRmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjRkNDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9pbnRmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fSEFMX0lOVEZfSF9fCi0jZGVmaW5lIF9fSEFMX0lOVEZfSF9fCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLWVudW0gX0NISVBfVFlQRSB7Ci0JTlVMTF9DSElQX1RZUEUsCi0JUlRMODcxMl84MTg4U184MTkxU184MTkyUywKLQlSVEw4MTg4Q184MTkyQywKLQlSVEw4MTkyRCwKLQlSVEw4NzIzQSwKLQlSVEw4MTg4RSwKLQlNQVhfQ0hJUF9UWVBFCi19OwotCi1lbnVtIGhhbF9kZWZfdmFyaWFibGUgewotCUhBTF9ERUZfVU5ERVJDT1JBVEVEU01PT1RIRURQV0RCLAotCUhBTF9ERUZfSVNfU1VQUE9SVF9BTlRfRElWLAotCUhBTF9ERUZfQ1VSUkVOVF9BTlRFTk5BLAotCUhBTF9ERUZfRFJWSU5GT19TWiwKLQlIQUxfREVGX01BWF9SRUNWQlVGX1NaLAotCUhBTF9ERUZfUlhfUEFDS0VUX09GRlNFVCwKLQlIQUxfREVGX0RCR19EVU1QX1JYUEtULC8qIGZvciBkYmcgKi8KLQlIQUxfREVGX0RCR19ETV9GVU5DLC8qIGZvciBkYmcgKi8KLQlIQUxfREVGX1JBX0RFQ0lTSU9OX1JBVEUsCi0JSEFMX0RFRl9SQV9TR0ksCi0JSEFMX0RFRl9QVF9QV1JfU1RBVFVTLAotCUhXX1ZBUl9NQVhfUlhfQU1QRFVfRkFDVE9SLAotCUhXX0RFRl9SQV9JTkZPX0RVTVAsCi0JSEFMX0RFRl9EQkdfRFVNUF9UWFBLVCwKLQlIV19ERUZfRkFfQ05UX0RVTVAsCi0JSFdfREVGX09ETV9EQkdfRkxBRywKLX07Ci0KLWVudW0gaGFsX29kbV92YXJpYWJsZSB7Ci0JSEFMX09ETV9TVEFfSU5GTywKLQlIQUxfT0RNX1AyUF9TVEFURSwKLQlIQUxfT0RNX1dJRklfRElTUExBWV9TVEFURSwKLX07Ci0KLWVudW0gcnRfZWVwcm9tX3R5cGUgewotCUVFUFJPTV85M0M0NiwKLQlFRVBST01fOTNDNTYsCi0JRUVQUk9NX0JPT1RfRUZVU0UsCi19OwotCi0KLQotI2RlZmluZSBSRl9DSEFOR0VfQllfSU5JVAkwCi0jZGVmaW5lIFJGX0NIQU5HRV9CWV9JUFMJQklUKDI4KQotI2RlZmluZSBSRl9DSEFOR0VfQllfUFMJCUJJVCgyOSkKLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX0hXCQlCSVQoMzApCi0jZGVmaW5lIFJGX0NIQU5HRV9CWV9TVwkJQklUKDMxKQotCi1lbnVtIGhhcmR3YXJlX3R5cGUgewotCUhBUkRXQVJFX1RZUEVfUlRMODE4MCwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxODUsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTg3LAotCUhBUkRXQVJFX1RZUEVfUlRMODE4OCwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTBQLAotCUhBUkRXQVJFX1RZUEVfUlRMODE5MkUsCi0JSEFSRFdBUkVfVFlQRV9SVEw4MTl4VSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJTRSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJTVSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJDRSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJDVSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJERSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxOTJEVSwKLQlIQVJEV0FSRV9UWVBFX1JUTDg3MjNBRSwKLQlIQVJEV0FSRV9UWVBFX1JUTDg3MjNBVSwKLQlIQVJEV0FSRV9UWVBFX1JUTDg3MjNBUywKLQlIQVJEV0FSRV9UWVBFX1JUTDgxODhFRSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxODhFVSwKLQlIQVJEV0FSRV9UWVBFX1JUTDgxODhFUywKLQlIQVJEV0FSRV9UWVBFX01BWCwKLX07Ci0KLSNkZWZpbmUgR0VUX0VFUFJPTV9FRlVTRV9QUklWKGFkYXB0ZXIpICgmYWRhcHRlci0+ZWVwcm9tcHJpdikKLQotdm9pZCBydHdfaGFsX2RlZl92YWx1ZV9pbml0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotaW50IHBtX25ldGRldl9vcGVuMjNhKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2LCB1OCBibm9ybWFsKTsKLQotaW50IHJ0bDg3MjNhdV9oYWxfaW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBydGw4NzIzYXVfaGFsX2RlaW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnR3X2hhbF9zdG9wKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0d19oYWxfdXBkYXRlX3JhX21hc2syM2Eoc3RydWN0IHN0YV9pbmZvICpwc3RhLCB1OCByc3NpX2xldmVsKTsKLXZvaWQJcnR3X2hhbF9jbG9uZV9kYXRhKHN0cnVjdCBydHdfYWRhcHRlciAqZHN0X3BhZGFwdGVyLCBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnNyY19wYWRhcHRlcik7Ci0KLXZvaWQgaHdfdmFyX3NldF9jb3JyZWN0X3RzZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgaHdfdmFyX3NldF9tbG1lX2Rpc2Nvbm5lY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIGh3X3Zhcl9zZXRfb3Btb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1vZGUpOwotdm9pZCBod192YXJfc2V0X21hY2FkZHIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnZhbCk7Ci12b2lkIGh3X3Zhcl9zZXRfYnNzaWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnZhbCk7Ci12b2lkIGh3X3Zhcl9zZXRfbWxtZV9qb2luKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHR5cGUpOwotCi1pbnQgR2V0SGFsRGVmVmFyODE5MkNVc2Ioc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJIGVudW0gaGFsX2RlZl92YXJpYWJsZSBlVmFyaWFibGUsIHZvaWQgKnBWYWx1ZSk7Ci0KLSNlbmRpZiAvKiBfX0hBTF9JTlRGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2llZWU4MDIxMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQxMDJlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9pZWVlODAyMTEuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19JRUVFODAyMTFfSAotI2RlZmluZSBfX0lFRUU4MDIxMV9ICi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSAibGludXgvaWVlZTgwMjExLmgiCi0jaW5jbHVkZSAid2lmaS5oIgotCi0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLQotI2lmIChXSVJFTEVTU19FWFQgPCAyMikKLSNlcnJvciAiT2Jzb2xldGUgcHJlIDIwMDcgd2lyZWxlc3MgZXh0ZW5zaW9ucyBhcmUgbm90IHN1cHBvcnRlZCIKLSNlbmRpZgotCi0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQotLyogU1RBIGZsYWdzICovCi0jZGVmaW5lIFdMQU5fU1RBX0FVVEggQklUKDApCi0jZGVmaW5lIFdMQU5fU1RBX0FTU09DIEJJVCgxKQotI2RlZmluZSBXTEFOX1NUQV9QUyBCSVQoMikKLSNkZWZpbmUgV0xBTl9TVEFfVElNIEJJVCgzKQotI2RlZmluZSBXTEFOX1NUQV9QRVJNIEJJVCg0KQotI2RlZmluZSBXTEFOX1NUQV9BVVRIT1JJWkVEIEJJVCg1KQotI2RlZmluZSBXTEFOX1NUQV9QRU5ESU5HX1BPTEwgQklUKDYpIC8qIHBlbmRpbmcgYWN0aXZpdHkgcG9sbCBub3QgQUNLZWQgKi8KLSNkZWZpbmUgV0xBTl9TVEFfU0hPUlRfUFJFQU1CTEUgQklUKDcpCi0jZGVmaW5lIFdMQU5fU1RBX1BSRUFVVEggQklUKDgpCi0jZGVmaW5lIFdMQU5fU1RBX1dNRSBCSVQoOSkKLSNkZWZpbmUgV0xBTl9TVEFfTUZQIEJJVCgxMCkKLSNkZWZpbmUgV0xBTl9TVEFfSFQgQklUKDExKQotI2RlZmluZSBXTEFOX1NUQV9XUFMgQklUKDEyKQotI2RlZmluZSBXTEFOX1NUQV9NQVlCRV9XUFMgQklUKDEzKQotI2RlZmluZSBXTEFOX1NUQV9OT05FUlAgQklUKDMxKQotCi0jZW5kaWYKLQotI2RlZmluZSBXUEFfQ0lQSEVSX05PTkUJCUJJVCgwKQotI2RlZmluZSBXUEFfQ0lQSEVSX1dFUDQwCUJJVCgxKQotI2RlZmluZSBXUEFfQ0lQSEVSX1dFUDEwNAlCSVQoMikKLSNkZWZpbmUgV1BBX0NJUEhFUl9US0lQCQlCSVQoMykKLSNkZWZpbmUgV1BBX0NJUEhFUl9DQ01QCQlCSVQoNCkKLQotCi0KLSNkZWZpbmUgV1BBX1NFTEVDVE9SX0xFTiA0Ci1leHRlcm4gdTggUlRXX1dQQV9PVUkyM0FfVFlQRVtdIDsKLWV4dGVybiB1MTYgUlRXX1dQQV9WRVJTSU9OMjNBIDsKLWV4dGVybiB1OCBXUEFfQVVUSF9LRVlfTUdNVF9OT05FMjNBW107Ci1leHRlcm4gdTggV1BBX0FVVEhfS0VZX01HTVRfVU5TUEVDXzgwMl8xWDIzQVtdOwotZXh0ZXJuIHU4IFdQQV9BVVRIX0tFWV9NR01UX1BTS19PVkVSXzgwMl8xWDIzQVtdOwotZXh0ZXJuIHU4IFdQQV9DSVBIRVJfU1VJVEVfTk9ORTIzQVtdOwotZXh0ZXJuIHU4IFdQQV9DSVBIRVJfU1VJVEVfV0VQNDAyM0FbXTsKLWV4dGVybiB1OCBXUEFfQ0lQSEVSX1NVSVRFX1RLSVAyM0FbXTsKLWV4dGVybiB1OCBXUEFfQ0lQSEVSX1NVSVRFX1dSQVAyM0FbXTsKLWV4dGVybiB1OCBXUEFfQ0lQSEVSX1NVSVRFX0NDTVAyM0FbXTsKLWV4dGVybiB1OCBXUEFfQ0lQSEVSX1NVSVRFX1dFUDEwNDIzQVtdOwotCi0KLSNkZWZpbmUgUlNOX0hFQURFUl9MRU4gNAotI2RlZmluZSBSU05fU0VMRUNUT1JfTEVOIDQKLQotZXh0ZXJuIHU4IFJTTl9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVgyM0FbXTsKLWV4dGVybiB1OCBSU05fQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVgyM0FbXTsKLWV4dGVybiB1OCBSU05fQ0lQSEVSX1NVSVRFX05PTkUyM0FbXTsKLWV4dGVybiB1OCBSU05fQ0lQSEVSX1NVSVRFX1dFUDQwMjNBW107Ci1leHRlcm4gdTggUlNOX0NJUEhFUl9TVUlURV9US0lQMjNBW107Ci1leHRlcm4gdTggUlNOX0NJUEhFUl9TVUlURV9XUkFQMjNBW107Ci1leHRlcm4gdTggUlNOX0NJUEhFUl9TVUlURV9DQ01QMjNBW107Ci1leHRlcm4gdTggUlNOX0NJUEhFUl9TVUlURV9XRVAxMDQyM0FbXTsKLQotZW51bSByYXRyX3RhYmxlX21vZGUgewotCVJBVFJfSU5YX1dJUkVMRVNTX05HQiA9IDAsCS8qICBCR04gNDAgTWh6IDJTUyAxU1MgKi8KLQlSQVRSX0lOWF9XSVJFTEVTU19ORyA9IDEsCS8qICBHTiBvciBOICovCi0JUkFUUl9JTlhfV0lSRUxFU1NfTkIgPSAyLAkvKiAgQkdOIDIwIE1oeiAyU1MgMVNTICBvciBCTiAqLwotCVJBVFJfSU5YX1dJUkVMRVNTX04gPSAzLAotCVJBVFJfSU5YX1dJUkVMRVNTX0dCID0gNCwKLQlSQVRSX0lOWF9XSVJFTEVTU19HID0gNSwKLQlSQVRSX0lOWF9XSVJFTEVTU19CID0gNiwKLQlSQVRSX0lOWF9XSVJFTEVTU19NQyA9IDcsCi0JUkFUUl9JTlhfV0lSRUxFU1NfQUNfTiA9IDgsCi19OwotCi1lbnVtIE5FVFdPUktfVFlQRQotewotCVdJUkVMRVNTX0lOVkFMSUQgPSAwLAotCS8qIFN1Yi1FbGVtZW50ICovCi0JLyogIHR4OiBjY2sgb25seSAsIHJ4OiBjY2sgb25seSwgaHc6IGNjayAqLwotCVdJUkVMRVNTXzExQiA9IEJJVCgwKSwKLQkvKiAgdHg6IG9mZG0gb25seSwgcng6IG9mZG0gJiBjY2ssIGh3OiBjY2sgJiBvZmRtICovCi0JV0lSRUxFU1NfMTFHID0gQklUKDEpLAotCS8qICB0eDogb2ZkbSBvbmx5LCByeDogb2ZkbSBvbmx5LCBodzogb2ZkbSBvbmx5ICovCi0JV0lSRUxFU1NfMTFBID0gQklUKDIpLAotCS8qICB0eDogTUNTIG9ubHksIHJ4OiBNQ1MgJiBjY2ssIGh3OiBNQ1MgJiBjY2sgKi8KLQlXSVJFTEVTU18xMV8yNE4gPSBCSVQoMyksCi0JLyogIHR4OiBNQ1Mgb25seSwgcng6IE1DUyAmIG9mZG0sIGh3OiBvZmRtIG9ubHkgKi8KLQlXSVJFTEVTU18xMV81TiA9IEJJVCg0KSwKLQkvKiBXSVJFTEVTU19BVVRPCQk9IEJJVCg1KSwgKi8KLQlXSVJFTEVTU19BQyA9IEJJVCg2KSwKLQotCS8qIENvbWJpbmF0aW9uICovCi0JIC8qICB0eDogY2NrICYgb2ZkbSwgcng6IGNjayAmIG9mZG0gJiBNQ1MsIGh3OiBjY2sgJiBvZmRtICovCi0JV0lSRUxFU1NfMTFCRyA9IFdJUkVMRVNTXzExQnxXSVJFTEVTU18xMUcsCi0JLyogIHR4OiBvZmRtICYgTUNTLCByeDogb2ZkbSAmIGNjayAmIE1DUywgaHc6IGNjayAmIG9mZG0gKi8KLQlXSVJFTEVTU18xMUdfMjROID0gV0lSRUxFU1NfMTFHIHwgV0lSRUxFU1NfMTFfMjROLAotCS8qICB0eDogb2ZkbSAmIE1DUywgcng6IG9mZG0gJiBNQ1MsIGh3OiBvZmRtIG9ubHkgKi8KLQlXSVJFTEVTU18xMUFfNU4gPSBXSVJFTEVTU18xMUEgfCBXSVJFTEVTU18xMV81TiwKLQkvKiAgdHg6IG9mZG0gJiBjY2sgJiBNQ1MsIHJ4OiBvZmRtICYgY2NrICYgTUNTLCBodzogb2ZkbSAmIGNjayAqLwotCVdJUkVMRVNTXzExQkdfMjROID0gV0lSRUxFU1NfMTFCIHwgV0lSRUxFU1NfMTFHIHwgV0lSRUxFU1NfMTFfMjROLAotCS8qICB0eDogb2ZkbSAmIE1DUywgcng6IG9mZG0gJiBNQ1MsIGh3OiBvZmRtIG9ubHkgKi8KLQlXSVJFTEVTU18xMUFHTiA9IFdJUkVMRVNTXzExQSB8IFdJUkVMRVNTXzExRyB8IFdJUkVMRVNTXzExXzI0TiB8Ci0JCQkJV0lSRUxFU1NfMTFfNU4sCi0JV0lSRUxFU1NfMTFBQkdOID0gV0lSRUxFU1NfMTFBIHwgV0lSRUxFU1NfMTFCIHwgV0lSRUxFU1NfMTFHIHwKLQkJCQlXSVJFTEVTU18xMV8yNE4gfCBXSVJFTEVTU18xMV81TiwKLX07Ci0KLSNkZWZpbmUgU1VQUE9SVEVEXzI0R19ORVRUWVBFX01TSyAoV0lSRUxFU1NfMTFCIHwgV0lSRUxFU1NfMTFHIHwgV0lSRUxFU1NfMTFfMjROKQotI2RlZmluZSBTVVBQT1JURURfNUdfTkVUVFlQRV9NU0sgKFdJUkVMRVNTXzExQSB8IFdJUkVMRVNTXzExXzVOKQotCi0jZGVmaW5lIElzU3VwcG9ydGVkMjRHKE5ldFR5cGUpIChOZXRUeXBlICYgU1VQUE9SVEVEXzI0R19ORVRUWVBFX01TSyA/IHRydWUgOiBmYWxzZSkKLSNkZWZpbmUgSXNTdXBwb3J0ZWQ1RyhOZXRUeXBlKSAoTmV0VHlwZSAmIFNVUFBPUlRFRF81R19ORVRUWVBFX01TSyA/IHRydWUgOiBmYWxzZSkKLQotI2RlZmluZSBJc0VuYWJsZUhXQ0NLKE5ldFR5cGUpIElzU3VwcG9ydGVkMjRHKE5ldFR5cGUpCi0jZGVmaW5lIElzRW5hYmxlSFdPRkRNKE5ldFR5cGUpIChOZXRUeXBlICYgKFdJUkVMRVNTXzExR3xXSVJFTEVTU18xMV8yNE58U1VQUE9SVEVEXzVHX05FVFRZUEVfTVNLKSA/IHRydWUgOiBmYWxzZSkKLQotI2RlZmluZSBJc1N1cHBvcnRlZFJ4Q0NLKE5ldFR5cGUpIElzRW5hYmxlSFdDQ0soTmV0VHlwZSkKLSNkZWZpbmUgSXNTdXBwb3J0ZWRSeE9GRE0oTmV0VHlwZSkgSXNFbmFibGVIV09GRE0oTmV0VHlwZSkKLSNkZWZpbmUgSXNTdXBwb3J0ZWRSeE1DUyhOZXRUeXBlKSBJc0VuYWJsZUhXT0ZETShOZXRUeXBlKQotCi0jZGVmaW5lIElzU3VwcG9ydGVkVHhDQ0soTmV0VHlwZSkgKE5ldFR5cGUgJiAoV0lSRUxFU1NfMTFCKSA/IHRydWUgOiBmYWxzZSkKLSNkZWZpbmUgSXNTdXBwb3J0ZWRUeE9GRE0oTmV0VHlwZSkgKE5ldFR5cGUgJiAoV0lSRUxFU1NfMTFHfFdJUkVMRVNTXzExQSkgPyB0cnVlIDogZmFsc2UpCi0jZGVmaW5lIElzU3VwcG9ydGVkVHhNQ1MoTmV0VHlwZSkgKE5ldFR5cGUgJiAoV0lSRUxFU1NfMTFfMjROfFdJUkVMRVNTXzExXzVOKSA/IHRydWUgOiBmYWxzZSkKLQotCi0jZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgMjU2VQotI2RlZmluZQlNQVhfRlJBR19USFJFU0hPTEQgICAgIDIzNDZVCi0KLS8qIFFvUyxRT1MgKi8KLSNkZWZpbmUgTk9STUFMX0FDSwkJCTAKLSNkZWZpbmUgTk9fQUNLCQkJCTEKLSNkZWZpbmUgTk9OX0VYUExJQ0lUX0FDSwkJMgotI2RlZmluZSBCTE9DS19BQ0sJCQkzCi0KLS8qIElFRUUgODAyLjExIGRlZmluZXMgKi8KLQotI2RlZmluZSBQODAyMTFfT1VJX0xFTiAzCi0KLXN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgewotCXU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KLQl1OCAgICBzc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCi0JdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLwotCXU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCi0KLSNkZWZpbmUgV0xBTl9SRUFTT05fSk9JTl9XUk9OR19DSEFOTkVMICAgICAgIDY1NTM0Ci0jZGVmaW5lIFdMQU5fUkVBU09OX0VYUElSQVRJT05fQ0hLIDY1NTM1Ci0KLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFX0xFTgkJCTQKLSNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTTEVOCTgKLQotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUIJCSAgICAgICAgMHgwMgotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1CCQkgICAgICAgIDB4MDQKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzVNQgkJICAgICAgICAweDBCCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CCQkgICAgICAgIDB4MTYKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV9MRU4JCQk4Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CCQkgICAgICAgIDB4MEMKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUIJCSAgICAgICAgMHgxMgotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUIJCTB4MTgKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CCQkweDI0Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQgkJMHgzMAotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUIJCTB4NDgKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CCQkweDYwCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQgkJMHg2QwotI2RlZmluZSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLCQkweDgwCi0KLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLCQkoMTw8MCkKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLCQkoMTw8MSkKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLCQkoMTw8MikKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzExTUJfTUFTSwkJKDE8PDMpCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1CX01BU0sJCSgxPDw0KQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzlNQl9NQVNLCQkoMTw8NSkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CX01BU0sJCSgxPDw2KQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUJfTUFTSwkJKDE8PDcpCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQl9NQVNLCQkoMTw8OCkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CX01BU0sJCSgxPDw5KQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUJfTUFTSwkJKDE8PDEwKQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUJfTUFTSwkJKDE8PDExKQotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURVNfTUFTSwkgICAgICAgIDB4MDAwMDAwMEYKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLCShJRUVFODAyMTFfQ0NLX1JBVEVfMU1CX01BU0sgfCBcCi0JSUVFRTgwMjExX0NDS19SQVRFXzJNQl9NQVNLKQotI2RlZmluZSBJRUVFODAyMTFfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19CQVNJQ19SQVRFU19NQVNLIHwgXAotCUlFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQotCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQotI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCi0JCQkJICAgICAgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0spCi0KLSNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTCSAgICA4Ci0jZGVmaW5lIElFRUU4MDIxMV9OVU1fQ0NLX1JBVEVTCSAgICAgICAgICAgIDQKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fU0hJRlRfTUFTS19BICAgICAgICAgNAotCi0jZGVmaW5lIFdFUF9LRVlTIDQKLQotCi0vKiBNQVhfUkFURVNfTEVOR1RIIG5lZWRzIHRvIGJlIDEyLiAgVGhlIHNwZWMgc2F5cyA4LCBhbmQgbWFueSBBUHMKLSAqIG9ubHkgdXNlIDgsIGFuZCB0aGVuIHVzZSBleHRlbmRlZCByYXRlcyBmb3IgdGhlIHJlbWFpbmluZyBzdXBwb3J0ZWQKLSAqIHJhdGVzLiAgT3RoZXIgQVBzLCBob3dldmVyLCBzdGljayBhbGwgb2YgdGhlaXIgc3VwcG9ydGVkIHJhdGVzIG9uIHRoZQotICogbWFpbiByYXRlcyBpbmZvcm1hdGlvbiBlbGVtZW50Li4uICovCi0jZGVmaW5lIE1BWF9SQVRFU19MRU5HVEgJMTIKLSNkZWZpbmUgTUFYX1JBVEVTX0VYX0xFTkdUSAkxNgotI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIJMTYxCi0jZGVmaW5lIFJUV19DSF9NQVhfMkdfQ0hBTk5FTAkxNAkvKiBNYXggY2hhbm5lbCBpbiAyRyBiYW5kICovCi0KLSNkZWZpbmUgTUFYX1dQQV9JRV9MRU4JCTI1NgotI2RlZmluZSBNQVhfV1BTX0lFX0xFTgkJMjU2Ci0jZGVmaW5lIE1BWF9QMlBfSUVfTEVOCQkyNTYKLSNkZWZpbmUgTUFYX1dGRF9JRV9MRU4JCTEyOAotCi0vKgotam9pbl9yZXM6Ci0tMTogYXV0aGVudGljYXRpb24gZmFpbAotLTI6IGFzc29jaWF0aW9uIGZhaWwKLT4gMDogVElECi0qLwotCi0jZGVmaW5lIE1BWFRJRAkxNgotCi0jZGVmaW5lIFdNRV9PVUlfVFlQRSAyCi0jZGVmaW5lIFdNRV9PVUlfU1VCVFlQRV9JTkZPUk1BVElPTl9FTEVNRU5UIDAKLSNkZWZpbmUgV01FX09VSV9TVUJUWVBFX1BBUkFNRVRFUl9FTEVNRU5UIDEKLSNkZWZpbmUgV01FX09VSV9TVUJUWVBFX1RTUEVDX0VMRU1FTlQgMgotI2RlZmluZSBXTUVfVkVSU0lPTiAxCi0KLQotI2RlZmluZSBPVUlfQlJPQURDT00gMHgwMDkwNGMgLyogQnJvYWRjb20gKEVwaWdyYW0pICovCi0KLSNkZWZpbmUgVkVORE9SX0hUX0NBUEFCX09VSV9UWVBFIDB4MzMgLyogMDAtOTAtNGM6MHgzMyAqLwotCi0vKiBSZXByZXNlbnQgY2hhbm5lbCBkZXRhaWxzLCBzdWJzZXQgb2YgaWVlZTgwMjExX2NoYW5uZWwgKi8KLXN0cnVjdCBydHdfaWVlZTgwMjExX2NoYW5uZWwgewotCS8qIGVudW0gbmw4MDIxMV9iYW5kIGJhbmQ7ICovCi0JLyogdTE2IGNlbnRlcl9mcmVxOyAqLwotCXUxNiBod192YWx1ZTsKLQl1MzIgZmxhZ3M7Ci0JLyogaW50IG1heF9hbnRlbm5hX2dhaW47ICovCi0JLyogaW50IG1heF9wb3dlcjsgKi8KLQkvKiBpbnQgbWF4X3JlZ19wb3dlcjsgKi8KLQkvKiBib29sIGJlYWNvbl9mb3VuZDsgKi8KLQkvKiB1MzIgb3JpZ19mbGFnczsgKi8KLQkvKiBpbnQgb3JpZ19tYWc7ICovCi0JLyogaW50IG9yaWdfbXB3cjsgKi8KLX07Ci0KLSNkZWZpbmUgQ0hBTl9GTVQgXAotCS8qImJhbmQ6JWQsICIqLyBcCi0JLyoiY2VudGVyX2ZyZXE6JXUsICIqLyBcCi0JImh3X3ZhbHVlOiV1LCAiIFwKLQkiZmxhZ3M6MHglMDh4IiBcCi0JLyoibWF4X2FudGVubmFfZ2FpbjolZFxuIiovIFwKLQkvKiJtYXhfcG93ZXI6JWRcbiIqLyBcCi0JLyoibWF4X3JlZ19wb3dlcjolZFxuIiovIFwKLQkvKiJiZWFjb25fZm91bmQ6JXVcbiIqLyBcCi0JLyoib3JpZ19mbGFnczoweCUwOHhcbiIqLyBcCi0JLyoib3JpZ19tYWc6JWRcbiIqLyBcCi0JLyoib3JpZ19tcHdyOiVkXG4iKi8KLQotI2RlZmluZSBDSEFOX0FSRyhjaGFubmVsKSBcCi0JLyooY2hhbm5lbCktPmJhbmQqLyBcCi0JLyosIChjaGFubmVsKS0+Y2VudGVyX2ZyZXEqLyBcCi0JKGNoYW5uZWwpLT5od192YWx1ZSBcCi0JLCAoY2hhbm5lbCktPmZsYWdzIFwKLQkvKiwgKGNoYW5uZWwpLT5tYXhfYW50ZW5uYV9nYWluKi8gXAotCS8qLCAoY2hhbm5lbCktPm1heF9wb3dlciovIFwKLQkvKiwgKGNoYW5uZWwpLT5tYXhfcmVnX3Bvd2VyKi8gXAotCS8qLCAoY2hhbm5lbCktPmJlYWNvbl9mb3VuZCovIFwKLQkvKiwgKGNoYW5uZWwpLT5vcmlnX2ZsYWdzKi8gXAotCS8qLCAoY2hhbm5lbCktPm9yaWdfbWFnKi8gXAotCS8qLCAoY2hhbm5lbCktPm9yaWdfbXB3ciovIFwKLQotdTggKnJ0d19zZXRfaWUyM2EodTggKnBidWYsIGludCBpbmRleCwgdWludCBsZW4sIGNvbnN0IHU4ICpzb3VyY2UsIHVpbnQgKmZybGVuKTsKLQotdTggaGFsX2NoX29mZnNldF90b19zZWNvbmRhcnlfY2hfb2Zmc2V0MjNhKHU4IGNoX29mZnNldCk7Ci11OCAqcnR3X3NldF9pZTIzYV9jaF9zd2l0Y2godTggKmJ1ZiwgdTMyICpidWZfbGVuLCB1OCBjaF9zd2l0Y2hfbW9kZSwgdTggbmV3X2NoLCB1OCBjaF9zd2l0Y2hfY250KTsKLXU4ICpydHdfc2V0X2llMjNhX3NlY29uZGFyeV9jaF9vZmZzZXQodTggKmJ1ZiwgdTMyICpidWZfbGVuLCB1OCBzZWNvbmRhcnlfY2hfb2Zmc2V0KTsKLQotdTggKnJ0d19nZXRfaWUyM2EodTgqcGJ1ZiwgaW50IGluZGV4LCBpbnQgKmxlbiwgaW50IGxpbWl0KTsKLXU4ICpydHdfZ2V0X2llMjNhX2V4KHU4ICppbl9pZSwgdWludCBpbl9sZW4sIHU4IGVpZCwgdTggKm91aSwgdTggb3VpX2xlbiwgdTggKmllLCB1aW50ICppZWxlbik7Ci1pbnQgcnR3X2llc19yZW1vdmVfaWUyM2EodTggKmllcywgdWludCAqaWVzX2xlbiwgdWludCBvZmZzZXQsIHU4IGVpZCwgdTggKm91aSwgdTggb3VpX2xlbik7Ci0KLXZvaWQgcnR3X3NldF9zdXBwb3J0ZWRfcmF0ZTIzYSh1OCAqU3VwcG9ydGVkUmF0ZXMsIHVpbnQgbW9kZSk7Ci0KLWludCBydHdfcGFyc2Vfd3BhX2llMjNhKGNvbnN0IHU4KiB3cGFfaWUsIGludCB3cGFfaWVfbGVuLCBpbnQgKmdyb3VwX2NpcGhlciwgaW50ICpwYWlyd2lzZV9jaXBoZXIsIGludCAqaXNfODAyMXgpOwotaW50IHJ0d19wYXJzZV93cGEyX2llMjNhKGNvbnN0IHU4KiB3cGFfaWUsIGludCB3cGFfaWVfbGVuLCBpbnQgKmdyb3VwX2NpcGhlciwgaW50ICpwYWlyd2lzZV9jaXBoZXIsIGludCAqaXNfODAyMXgpOwotCi1jb25zdCB1OCAqcnR3X2dldF93cHNfYXR0cjIzYShjb25zdCB1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwgdTE2IHRhcmdldF9hdHRyX2lkICx1OCAqYnVmX2F0dHIsIHUzMiAqbGVuX2F0dHIpOwotY29uc3QgdTggKnJ0d19nZXRfd3BzX2F0dHJfY29udGVudDIzYShjb25zdCB1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwgdTE2IHRhcmdldF9hdHRyX2lkICx1OCAqYnVmX2NvbnRlbnQpOwotCi11aW50CXJ0d19nZXRfcmF0ZXNldF9sZW4yM2EodTgJKnJhdGVzZXQpOwotCi1zdHJ1Y3QgcmVnaXN0cnlfcHJpdjsKLWludCBydHdfZ2VuZXJhdGVfaWUyM2Eoc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYpOwotCi0KLWludCBydHdfZ2V0X2JpdF92YWx1ZV9mcm9tX2llZWVfdmFsdWUyM2EodTggdmFsKTsKLQotaW50IHJ0d19jaGVja19uZXR3b3JrX3R5cGUyM2EodW5zaWduZWQgY2hhciAqcmF0ZSwgaW50IHJhdGVsZW4sIGludCBjaGFubmVsKTsKLQotdm9pZCBydHdfZ2V0X2Jjbl9pbmZvMjNhKHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKTsKLQotdTE2IHJ0d19tY3NfcmF0ZTIzYSh1OCByZl90eXBlLCB1OCBid180ME1IeiwgdTggc2hvcnRfR0lfMjAsIHU4IHNob3J0X0dJXzQwLAotCQkgICAgc3RydWN0IGllZWU4MDIxMV9tY3NfaW5mbyAqbWNzKTsKLQotI2VuZGlmIC8qIElFRUU4MDIxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaW9jdGxfY2ZnODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9pb2N0bF9jZmc4MDIxMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTRlYWQ1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9pb2N0bF9jZmc4MDIxMS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fSU9DVExfQ0ZHODAyMTFfSF9fCi0jZGVmaW5lIF9fSU9DVExfQ0ZHODAyMTFfSF9fCi0KLXN0cnVjdCBydHdfd2Rldl9wcml2IHsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpydHdfd2RldjsKLQotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0KLQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcXVlc3Q7Ci0Jc3BpbmxvY2tfdCBzY2FuX3JlcV9sb2NrOwotCi0Jc3RydWN0IG5ldF9kZXZpY2UgKnBtb25fbmRldjsvKiBmb3IgbW9uaXRvciBpbnRlcmZhY2UgKi8KLQljaGFyIGlmbmFtZV9tb25bSUZOQU1TSVogKyAxXTsgLyogbmFtZSBmb3IgbW9uaXRvciBpbnRlcmZhY2UgKi8KLQotCXU4IHAycF9lbmFibGVkOwotCi0JYm9vbCBwb3dlcl9tZ210OwotfTsKLQotI2RlZmluZSB3ZGV2X3RvX3ByaXYodykgKChzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqKSh3ZGV2X3ByaXYodykpKQotCi0jZGVmaW5lIHdpcGh5X3RvX2FkYXB0ZXIoeCkJCQkJCVwKLQkoc3RydWN0IHJ0d19hZGFwdGVyICopKCgoc3RydWN0IHJ0d193ZGV2X3ByaXYgKikJXAotCXdpcGh5X3ByaXYoeCkpLT5wYWRhcHRlcikKLQotI2RlZmluZSB3aXBoeV90b193ZGV2KHgpCQkJCQlcCi0JKHN0cnVjdCB3aXJlbGVzc19kZXYgKikoKChzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqKQlcCi0Jd2lwaHlfcHJpdih4KSktPnJ0d193ZGV2KQotCi1pbnQgcnR3X3dkZXZfYWxsb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGRldmljZSAqZGV2KTsKLXZvaWQgcnR3X3dkZXZfZnJlZShzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKLXZvaWQgcnR3X3dkZXZfdW5yZWdpc3RlcihzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKLQotdm9pZCBydHdfY2ZnODAyMTFfaW5pdF93aXBoeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBydHdfY2ZnODAyMTFfc3VydmV5ZG9uZV9ldmVudF9jYWxsYmFjayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfY29ubmVjdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnR3X2NmZzgwMjExX2luZGljYXRlX2Rpc2Nvbm5lY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zY2FuX2RvbmUoc3RydWN0IHJ0d193ZGV2X3ByaXYgKnB3ZGV2X3ByaXYsCi0JCQkJICAgICBib29sIGFib3J0ZWQpOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zdGFfYXNzb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgIHU4ICpwbWdtdF9mcmFtZSwgdWludCBmcmFtZV9sZW4pOwotdm9pZCBydHdfY2ZnODAyMTFfaW5kaWNhdGVfc3RhX2Rpc2Fzc29jKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJCXVuc2lnbmVkIGNoYXIgKmRhLCB1bnNpZ25lZCBzaG9ydCByZWFzb24pOwotI2VuZGlmIC8qIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCi1ib29sIHJ0d19jZmc4MDIxMV9wd3JfbWdtdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi0jZW5kaWYgLyogX19JT0NUTF9DRkc4MDIxMV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9tbG1lX29zZGVwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvbWxtZV9vc2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI1NTI1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9tbG1lX29zZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYJX19NTE1FX09TREVQX0hfCi0jZGVmaW5lIF9fTUxNRV9PU0RFUF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi12b2lkIHJ0d19vc19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIHJ0d19yZXNldF9zZWN1cml0eXByaXYyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotI2VuZGlmCS8qIF9NTE1FX09TREVQX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZjJmMjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbS5oCisrKyAvZGV2L251bGwKQEAgLTEsODYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYJX19IQUxETU9VVFNSQ19IX18KLSNkZWZpbmUgX19IQUxETU9VVFNSQ19IX18KLQotLyogICovCi0vKiAgRGVmaW5pdGlvbiAqLwotLyogICovCi0vKiAgKi8KLS8qICAyMDExLzA5LzIyIE1IIERlZmluZSBhbGwgdGVhbSBzdXBwcnQgYWJpbGl0eS4gKi8KLS8qICAqLwotCi0vKiAgKi8KLS8qICAyMDExLzA5LzIyIE1IIERlZmluZSBmb3IgYWxsIHRlYW1zLiBQbGVhc2UgRGVmaW5lIHRoZSBjb25zdGFuIGluIHlvdXIgcHJlY29tcCBoZWFkZXIuICovCi0vKiAgKi8KLS8qIGRlZmluZQkJRE1fT0RNX1NVUFBPUlRfQVAJCQkwICovCi0vKiBkZWZpbmUJCURNX09ETV9TVVBQT1JUX0FEU0wJCQkwICovCi0vKiBkZWZpbmUJCURNX09ETV9TVVBQT1JUX0NFCQkJMCAqLwotLyogZGVmaW5lCQlETV9PRE1fU1VQUE9SVF9NUAkJCTEgKi8KLQotI2RlZmluZQlUUF9NT0RFCQkwCi0jZGVmaW5lCVJTU0lfTU9ERQkJMQotI2RlZmluZQlUUkFGRklDX0xPVwkwCi0jZGVmaW5lCVRSQUZGSUNfSElHSAkxCi0KLQotLyogICovCi0vKiAzIFR4IFBvd2VyIFRyYWNraW5nICovCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lCQlEUEtfREVMVEFfTUFQUElOR19OVU0JMTMKLSNkZWZpbmUJCWluZGV4X21hcHBpbmdfSFBfTlVNCTE1Ci0KLQotLyogICovCi0vKiAzIFBTRCBIYW5kbGVyICovCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLSNkZWZpbmUJQUZIX1BTRAkJMQkvKiAwOm5vcm1hbCBQU0Qgc2NhbiwgMTogb25seSBkbyAyMCBwdHMgUFNEICovCi0jZGVmaW5lCU1PREVfNDBNCQkwCS8qIDA6MjBNLCAxOjQwTSAqLwotI2RlZmluZQlQU0RfVEgyCQkzCi0jZGVmaW5lCVBTRF9DSE1JTgkJMjAgICAvKiAgTWluaW11bSBjaGFubmVsIG51bWJlciBmb3IgQlQgQUZIICovCi0jZGVmaW5lCVNJUl9TVEVQX1NJWkUJMwotI2RlZmluZSAgIFNtb290aF9TaXplXzEJCTUKLSNkZWZpbmUJU21vb3RoX1RIXzEJMwotI2RlZmluZSAgIFNtb290aF9TaXplXzIJCTEwCi0jZGVmaW5lCVNtb290aF9USF8yCTQKLSNkZWZpbmUgICBTbW9vdGhfU2l6ZV8zCQkyMAotI2RlZmluZQlTbW9vdGhfVEhfMwk0Ci0jZGVmaW5lICAgU21vb3RoX1N0ZXBfU2l6ZSA1Ci0jZGVmaW5lCUFkYXB0aXZlX1NJUgkxCi0jZGVmaW5lCVBTRF9SRVNDQU4JCTQKLSNkZWZpbmUJUFNEX1NDQU5fSU5URVJWQUwJNzAwIC8qIG1zICovCi0KLS8qIDg3MjNBIEhpZ2ggUG93ZXIgSUdJIFNldHRpbmcgKi8KLSNkZWZpbmUgRE1fRElHX0hJR0hfUFdSX0lHSV9MT1dFUl9CT1VORAkweDIyCi0jZGVmaW5lIERNX0RJR19HbW9kZV9ISUdIX1BXUl9JR0lfTE9XRVJfQk9VTkQgMHgyOAotI2RlZmluZSBETV9ESUdfSElHSF9QV1JfVEhSRVNIT0xECTB4M2EKLQotLyogIExQUyBkZWZpbmUgKi8KLSNkZWZpbmUgRE1fRElHX0ZBX1RIMF9MUFMJCQkJNCAvKiAgNCBpbiBscHMgKi8KLSNkZWZpbmUgRE1fRElHX0ZBX1RIMV9MUFMJCQkJMTUgLyogIDE1IGxwcyAqLwotI2RlZmluZSBETV9ESUdfRkFfVEgyX0xQUwkJCQkzMCAvKiAgMzAgbHBzICovCi0jZGVmaW5lIFJTU0lfT0ZGU0VUX0RJRwkJCQkJMHgwNTsKLQotLyogQU5UIFRlc3QgKi8KLSNkZWZpbmUJCQlBTlRURVNUQUxMCQkweDAwCQkvKiBBbnQgQSBvciBCIHdpbGwgYmUgVGVzdGluZyAqLwotI2RlZmluZQkJQU5UVEVTVEEJCTB4MDEJCS8qIEFudCBBIHdpbGwgYmUgVGVzdGluZyAqLwotI2RlZmluZQkJQU5UVEVTVEIJCTB4MDIJCS8qIEFudCBCIHdpbGwgYmUgdGVzdGluZyAqLwotCi0KLS8qICAqLwotLyogIHN0cnVjdHVyZSBhbmQgZGVmaW5lICovCi0vKiAgKi8KLQotc3RydWN0ICBkaWdfdCB7Ci0JdTgJCURpZ19FbmFibGVfRmxhZzsKLQl1OAkJRGlnX0V4dF9Qb3J0X1N0YWdlOwotCi0JaW50CQlSc3NpTG93VGhyZXNoOwotCWludAkJUnNzaUhpZ2hUaHJlc2g7Ci0KLQl1MzIJCUZBTG93VGhyZXNoOwotCXUzMgkJRkFIaWdoVGhyZXNoOwotCi0JdTgJCUN1clNUQUNvbm5lY3RTdGF0ZTsKLQl1OAkJUHJlU1RBQ29ubmVjdFN0YXRlOwotCXU4CQlDdXJNdWx0aVNUQUNvbm5lY3RTdGF0ZTsKLQotCXU4CQlQcmVJR1ZhbHVlOwotCXU4CQlDdXJJR1ZhbHVlOwotCXU4CQlCYWNrdXBJR1ZhbHVlOwotCi0JczgJCUJhY2tvZmZWYWw7Ci0JczgJCUJhY2tvZmZWYWxfcmFuZ2VfbWF4OwotCXM4CQlCYWNrb2ZmVmFsX3JhbmdlX21pbjsKLQl1OAkJcnhfZ2Fpbl9yYW5nZV9tYXg7Ci0JdTgJCXJ4X2dhaW5fcmFuZ2VfbWluOwotCXU4CQlSc3NpX3ZhbF9taW47Ci0KLQl1OAkJUHJlQ0NLX0NDQVRocmVzOwotCXU4CQlDdXJDQ0tfQ0NBVGhyZXM7Ci0JdTgJCVByZUNDS1BEU3RhdGU7Ci0JdTgJCUN1ckNDS1BEU3RhdGU7Ci0KLQl1OAkJTGFyZ2VGQUhpdDsKLQl1OAkJRm9yYmlkZGVuSUdJOwotCXUzMgkJUmVjb3Zlcl9jbnQ7Ci0KLQl1OAkJRElHX0R5bmFtaWNfTUlOXzA7Ci0JdTgJCURJR19EeW5hbWljX01JTl8xOwotCWJvb2wJCWJNZWRpYUNvbm5lY3RfMDsKLQlib29sCQliTWVkaWFDb25uZWN0XzE7Ci0KLQl1MzIJCVJTU0lfbWF4OwotfTsKLQotc3RydWN0IGR5bmFtaWNfcHdyX3NhdiB7Ci0JdTgJCVByZUNDQVN0YXRlOwotCXU4CQlDdXJDQ0FTdGF0ZTsKLQotCXU4CQlQcmVSRlN0YXRlOwotCXU4CQlDdXJSRlN0YXRlOwotCi0JaW50CQkgICAgUnNzaV92YWxfbWluOwotCi0JdTgJCWluaXRpYWxpemU7Ci0JdTMyCQlSZWc4NzQsIFJlZ0M3MCwgUmVnODVDLCBSZWdBNzQ7Ci19OwotCi1zdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdHMgewotCXUzMglDbnRfUGFyaXR5X0ZhaWw7Ci0JdTMyCUNudF9SYXRlX0lsbGVnYWw7Ci0JdTMyCUNudF9DcmM4X2ZhaWw7Ci0JdTMyCUNudF9NY3NfZmFpbDsKLQl1MzIJQ250X09mZG1fZmFpbDsKLQl1MzIJQ250X0Nja19mYWlsOwotCXUzMglDbnRfYWxsOwotCXUzMglDbnRfRmFzdF9Gc3luYzsKLQl1MzIJQ250X1NCX1NlYXJjaF9mYWlsOwotCXUzMglDbnRfT0ZETV9DQ0E7Ci0JdTMyCUNudF9DQ0tfQ0NBOwotCXUzMglDbnRfQ0NBX2FsbDsKLQl1MzIJQ250X0JXX1VTQzsJLyogR2FyeSAqLwotCXUzMglDbnRfQldfTFNDOwkvKiBHYXJ5ICovCi19OwotCi0jZGVmaW5lIEFTU09DSUFURV9FTlRSWV9OVU0JCQkJCTMyIC8qICBNYXggc2l6ZSBvZiBBc29jRW50cnlbXS4gKi8KLSNkZWZpbmUJT0RNX0FTU09DSUFURV9FTlRSWV9OVU0JCQkJQVNTT0NJQVRFX0VOVFJZX05VTQotCi0vKiAgVGhpcyBpbmRpY2F0ZXMgdHdvIGRpZmZlcmVudCB0aGUgc3RlcHMuICovCi0vKiAgSW4gU1dBV19TVEVQX1BFQUssIGRyaXZlciBuZWVkcyB0byBzd2l0Y2ggYW50ZW5uYSBhbmQgbGlzdGVuIHRvIHRoZSBzaWduYWwgb24gdGhlIGFpci4gKi8KLS8qICBJbiBTV0FXX1NURVBfREVURVJNSU5FLCBkcml2ZXIganVzdCBjb21wYXJlcyB0aGUgc2lnbmFsIGNhcHR1cmVkIGluIFNXQVdfU1RFUF9QRUFLICovCi0vKiAgd2l0aCBvcmlnaW5hbCBSU1NJIHRvIGRldGVybWluZSBpZiBpdCBpcyBuZWNlc3NhcnkgdG8gc3dpdGNoIGFudGVubmEuICovCi0jZGVmaW5lIFNXQVdfU1RFUF9QRUFLCQkwCi0jZGVmaW5lIFNXQVdfU1RFUF9ERVRFUk1JTkUJMQotCi0jZGVmaW5lCVRQX01PREUJCTAKLSNkZWZpbmUJUlNTSV9NT0RFCQkxCi0jZGVmaW5lCVRSQUZGSUNfTE9XCTAKLSNkZWZpbmUJVFJBRkZJQ19ISUdICTEKLQotc3RydWN0IHN3X2FudF9zdyB7Ci0JdTgJCXRyeV9mbGFnOwotCXMzMgkJUHJlUlNTSTsKLQl1OAkJQ3VyQW50ZW5uYTsKLQl1OAkJUHJlQW50ZW5uYTsKLQl1OAkJUlNTSV9Ucnlpbmc7Ci0JdTgJCVRlc3RNb2RlOwotCXU4CQliVHJpZ2dlckFudGVubmFTd2l0Y2g7Ci0JdTgJCVNlbGVjdEFudGVubmFNYXA7Ci0JdTgJCVJTU0lfdGFyZ2V0OwotCi0JLyogIEJlZm9yZSBsaW5rIEFudGVubmEgU3dpdGNoIGNoZWNrICovCi0JdTgJCVNXQVNfTm9MaW5rX1N0YXRlOwotCXUzMgkJU1dBU19Ob0xpbmtfQktfUmVnODYwOwotCWJvb2wJCUFOVEFfT047CS8qIFRvIGluZGljYXRlIEFudCBBIGlzIG9yIG5vdCAqLwotCWJvb2wJCUFOVEJfT047CS8qIFRvIGluZGljYXRlIEFudCBCIGlzIG9uIG9yIG5vdCAqLwotCi0JczMyCQlSU1NJX3N1bV9BOwotCXMzMgkJUlNTSV9zdW1fQjsKLQlzMzIJCVJTU0lfY250X0E7Ci0JczMyCQlSU1NJX2NudF9COwotCi0JdTY0CQlsYXN0VHhPa0NudDsKLQl1NjQJCWxhc3RSeE9rQ250OwotCXU2NAkJVFhCeXRlQ250X0E7Ci0JdTY0CQlUWEJ5dGVDbnRfQjsKLQl1NjQJCVJYQnl0ZUNudF9BOwotCXU2NAkJUlhCeXRlQ250X0I7Ci0JdTgJCVRyYWZmaWNMb2FkOwotfTsKLQotc3RydWN0IGVkY2FfdHVyYm8gewotCWJvb2wgYkN1cnJlbnRUdXJib0VEQ0E7Ci0JdTMyCXBydl90cmFmZmljX2lkeDsgLyogIGVkY2EgdHVyYm8gKi8KLX07Ci0KLXN0cnVjdCBvZG1fcmF0ZV9hZGFwdCB7Ci0JdTgJVHlwZTsJCS8qICBETV9UeXBlX0J5RlcvRE1fVHlwZV9CeURyaXZlciAqLwotCXU4CUhpZ2hSU1NJVGhyZXNoOwkvKiAgaWYgUlNTSSA+IEhpZ2hSU1NJVGhyZXNoCT0+IFJBVFJTdGF0ZSBpcyBETV9SQVRSX1NUQV9ISUdIICovCi0JdTgJTG93UlNTSVRocmVzaDsJLyogIGlmIFJTU0kgPD0gTG93UlNTSVRocmVzaAk9PiBSQVRSU3RhdGUgaXMgRE1fUkFUUl9TVEFfTE9XICovCi0JdTgJUkFUUlN0YXRlOwkvKiAgQ3VycmVudCBSU1NJIGxldmVsLCBETV9SQVRSX1NUQV9ISUdIL0RNX1JBVFJfU1RBX01JRERMRS9ETV9SQVRSX1NUQV9MT1cgKi8KLQl1MzIJTGFzdFJBVFI7CS8qICBSQVRSIFJlZ2lzdGVyIENvbnRlbnQgKi8KLX07Ci0KLSNkZWZpbmUgSVFLX01BQ19SRUdfTlVNCQk0Ci0jZGVmaW5lIElRS19BRERBX1JFR19OVU0JCTE2Ci0jZGVmaW5lIElRS19CQl9SRUdfTlVNX01BWAkxMAotI2RlZmluZSBJUUtfQkJfUkVHX05VTQkJOQotI2RlZmluZSBIUF9USEVSTUFMX05VTQkJOAotCi0jZGVmaW5lIEFWR19USEVSTUFMX05VTQkJOAotI2RlZmluZSBJUUtfTWF0cml4X1JFR19OVU0JOAotI2RlZmluZSBJUUtfTWF0cml4X1NldHRpbmdzX05VTQkxKzI0KzIxCi0KLSNkZWZpbmUJCURNX1R5cGVfQnlGVwkJCTAKLSNkZWZpbmUJCURNX1R5cGVfQnlEcml2ZXIJCTEKLQotLyogIERlY2xhcmUgZm9yIGNvbW1vbiBpbmZvICovCi0KLXN0cnVjdCBvZG1fcGh5X2RiZ19pbmZvIHsKLQkvKiBPRE0gV3JpdGUsZGVidWcgaW5mbyAqLwotCXM4CQlSeFNOUmRCW1JGX1BBVEhfTUFYXTsKLQl1NjQJCU51bVFyeVBoeVN0YXR1czsKLQl1NjQJCU51bVFyeVBoeVN0YXR1c0NDSzsKLQl1NjQJCU51bVFyeVBoeVN0YXR1c09GRE07Ci0JLyogT3RoZXJzICovCi0JczMyCQlSeEVWTVtSRl9QQVRIX01BWF07Ci0KLX07Ci0KLXN0cnVjdCBvZG1fcGFja2V0X2luZm8gewotCXU4CQlSYXRlOwotCXU4CQlTdGF0aW9uSUQ7Ci0JYm9vbAkJYlBhY2tldE1hdGNoQlNTSUQ7Ci0JYm9vbAkJYlBhY2tldFRvU2VsZjsKLQlib29sCQliUGFja2V0QmVhY29uOwotfTsKLQotCi1lbnVtIHsKLQkvKiAgQkIgVGVhbSAqLwotCU9ETV9ESUcJCQk9IDB4MDAwMDAwMDEsCi0JT0RNX0hJR0hfUE9XRVIJCT0gMHgwMDAwMDAwMiwKLQlPRE1fQ0NLX0NDQV9USAkJPSAweDAwMDAwMDA0LAotCU9ETV9GQV9TVEFUSVNUSUNTCT0gMHgwMDAwMDAwOCwKLQlPRE1fUkFNQVNLCQk9IDB4MDAwMDAwMTAsCi0JT0RNX1JTU0lfTU9OSVRPUgk9IDB4MDAwMDAwMjAsCi0JT0RNX1NXX0FOVERJVgkJPSAweDAwMDAwMDQwLAotCU9ETV9IV19BTlRESVYJCT0gMHgwMDAwMDA4MCwKLQlPRE1fQkJfUFdSU1YJCT0gMHgwMDAwMDEwMCwKLQlPRE1fMlRQQVRIRElWCQk9IDB4MDAwMDAyMDAsCi0JT0RNXzFUUEFUSERJVgkJPSAweDAwMDAwNDAwLAotCU9ETV9QU0QyQUZICQk9IDB4MDAwMDA4MDAKLX07Ci0KLS8qICAqLwotLyogIDIwMTEvMTAvMjAgTUggRGVmaW5lIENvbW1vbiBpbmZvIGVudW0gZm9yIGFsbCB0ZWFtLiAqLwotLyogICovCi0KLWVudW0gb2RtX2NtbmluZm8gewotCS8qICBGaXhlZCB2YWx1ZTogKi8KLQkvKiAgKi8KLQotCU9ETV9DTU5JTkZPX01QX1RFU1RfQ0hJUCA9IDIsCi0JT0RNX0NNTklORk9fSUNfVFlQRSwJCQkvKiAgZW51bSBvZG1faWNfdHlwZV9kZWYgKi8KLQlPRE1fQ01OSU5GT19DVVRfVkVSLAkJCS8qICBlbnVtIG9kbV9jdXRfdmVyc2lvbiAqLwotCU9ETV9DTU5JTkZPX0ZBQl9WRVIsCQkJLyogIGVudW0gb2RtX2ZhYl92ZXJzaW9uICovCi0JT0RNX0NNTklORk9fQk9BUkRfVFlQRSwJCQkvKiAgZW51bSBvZG1fYm9hcmRfdHlwZSAqLwotCU9ETV9DTU5JTkZPX0VYVF9MTkEsCQkJLyogIHRydWUgKi8KLQlPRE1fQ01OSU5GT19FWFRfUEEsCi0JT0RNX0NNTklORk9fRVhUX1RSU1csCi0JT0RNX0NNTklORk9fQklOSENUX1RFU1QsCi0JT0RNX0NNTklORk9fQldJRklfVEVTVCwKLQlPRE1fQ01OSU5GT19TTUFSVF9DT05DVVJSRU5ULAotCi0KLQkvKiAgKi8KLQkvKiAgRHluYW1pYyB2YWx1ZTogKi8KLQkvKiAgKi8KLQlPRE1fQ01OSU5GT19NUF9NT0RFLAotCi0JT0RNX0NNTklORk9fV0lGSV9ESVJFQ1QsCi0JT0RNX0NNTklORk9fV0lGSV9ESVNQTEFZLAotCU9ETV9DTU5JTkZPX0xJTkssCi0JT0RNX0NNTklORk9fUlNTSV9NSU4sCi0JT0RNX0NNTklORk9fREJHX0NPTVAsCQkJCS8qICB1NjQgKi8KLQlPRE1fQ01OSU5GT19EQkdfTEVWRUwsCQkJCS8qICB1MzIgKi8KLQlPRE1fQ01OSU5GT19SQV9USFJFU0hPTERfSElHSCwJCS8qICB1OCAqLwotCU9ETV9DTU5JTkZPX1JBX1RIUkVTSE9MRF9MT1csCQkvKiAgdTggKi8KLQlPRE1fQ01OSU5GT19SRl9BTlRFTk5BX1RZUEUsCQkvKiAgdTggKi8KLQlPRE1fQ01OSU5GT19CVF9ESVNBQkxFRCwKLQlPRE1fQ01OSU5GT19CVF9PUEVSQVRJT04sCi0JT0RNX0NNTklORk9fQlRfRElHLAotCU9ETV9DTU5JTkZPX0JUX0JVU1ksCQkJCQkvKiBDaGVjayBCdCBpcyB1c2luZyBvciBub3QgKi8KLQlPRE1fQ01OSU5GT19CVF9ESVNBQkxFX0VEQ0EsCi0KLQkvKiAgKi8KLQkvKiAgRHluYW1pYyBwdHIgYXJyYXkgaG9vayBpdG1zLiAqLwotCS8qICAqLwotCU9ETV9DTU5JTkZPX1NUQV9TVEFUVVMsCi0JT0RNX0NNTklORk9fUEhZX1NUQVRVUywKLQlPRE1fQ01OSU5GT19NQUNfU1RBVFVTLAotCi0JT0RNX0NNTklORk9fTUFYLAotfTsKLQotLyogIERlZmluZSBPRE0gc3VwcG9ydCBhYmlsaXR5LiAgT0RNX0NNTklORk9fQUJJTElUWSAqLwotZW51bSB7Ci0JLyogIEJCIE9ETSBzZWN0aW9uIEJJVCAwLTE1ICovCi0JT0RNX0JCX0FOVF9ESVYJCQkJPSBCSVQoNiksCi19OwotCi0vKglPRE1fQ01OSU5GT19JTlRFUkZBQ0UgKi8KLWVudW0gb2RtX2ludGVyZmFjZV9kZWYgewotCU9ETV9JVFJGX1BDSUUJPQkweDEsCi0JT0RNX0lUUkZfVVNCCT0JMHgyLAotCU9ETV9JVFJGX1NESU8JPQkweDQsCi0JT0RNX0lUUkZfQUxMCT0JMHg3LAotfTsKLQotLyogIE9ETV9DTU5JTkZPX0lDX1RZUEUgKi8KLWVudW0gb2RtX2ljX3R5cGVfZGVmIHsKLQlPRE1fUlRMODE5MlMJPQlCSVQoMCksCi0JT0RNX1JUTDgxOTJDCT0JQklUKDEpLAotCU9ETV9SVEw4MTkyRAk9CUJJVCgyKSwKLQlPRE1fUlRMODcyM0EJPQlCSVQoMyksCi0JT0RNX1JUTDgxODhFCT0JQklUKDQpLAotCU9ETV9SVEw4ODEyCT0JQklUKDUpLAotCU9ETV9SVEw4ODIxCT0JQklUKDYpLAotfTsKLQotLyogT0RNX0NNTklORk9fQ1VUX1ZFUiAqLwotZW51bSBvZG1fY3V0X3ZlcnNpb24gewotCU9ETV9DVVRfQQkJPQkxLAotCU9ETV9DVVRfQgkJPQkyLAotCU9ETV9DVVRfQwkJPQkzLAotCU9ETV9DVVRfRAkJPQk0LAotCU9ETV9DVVRfRQkJPQk1LAotCU9ETV9DVVRfRgkJPQk2LAotCU9ETV9DVVRfVEVTVAkJPQk3LAotfTsKLQotLyogIE9ETV9DTU5JTkZPX0ZBQl9WRVIgKi8KLWVudW0gb2RtX2ZhYl92ZXJzaW9uIHsKLQlPRE1fVFNNQwk9CTAsCi0JT0RNX1VNQwkJPQkxLAotfTsKLQotLyogIEZvciBleGFtcGxlIDFUMlIgKEErQUIgPSBCSVQwfEJJVDR8QklUNSkgKi8KLWVudW0gcmZfcGF0aF9kZWYgewotCU9ETV9SRl9UWF9BCT0JQklUKDApLAotCU9ETV9SRl9UWF9CCT0JQklUKDEpLAotCU9ETV9SRl9UWF9DCT0JQklUKDIpLAotCU9ETV9SRl9UWF9ECT0JQklUKDMpLAotCU9ETV9SRl9SWF9BCT0JQklUKDQpLAotCU9ETV9SRl9SWF9CCT0JQklUKDUpLAotCU9ETV9SRl9SWF9DCT0JQklUKDYpLAotCU9ETV9SRl9SWF9ECT0JQklUKDcpLAotfTsKLQotLyogIE9ETSBEeW5hbWljIGNvbW1vbiBpbmZvIHZhbHVlIGRlZmluaXRpb24gKi8KLQotZW51bSBvZG1fbWFjX3BoeV9tb2RlIHsKLQlPRE1fU01TUAk9IDAsCi0JT0RNX0RNU1AJPSAxLAotCU9ETV9ETURQCT0gMiwKLX07Ci0KLQotZW51bSBvZG1fYnRfY29leGlzdCB7Ci0JT0RNX0JUX0JVU1kJCT0gMSwKLQlPRE1fQlRfT04JCT0gMiwKLQlPRE1fQlRfT0ZGCQk9IDMsCi0JT0RNX0JUX05PTkUJCT0gNCwKLX07Ci0KLS8qICBPRE1fQ01OSU5GT19PUF9NT0RFICovCi1lbnVtIG9kbV9vcGVyYXRpb25fbW9kZSB7Ci0JT0RNX05PX0xJTksJCT0gQklUKDApLAotCU9ETV9MSU5LCQk9IEJJVCgxKSwKLQlPRE1fU0NBTgkJPSBCSVQoMiksCi0JT0RNX1BPV0VSU0FWRQkJPSBCSVQoMyksCi0JT0RNX0FQX01PREUJCT0gQklUKDQpLAotCU9ETV9DTElFTlRfTU9ERQkJPSBCSVQoNSksCi0JT0RNX0FEX0hPQwkJPSBCSVQoNiksCi0JT0RNX1dJRklfRElSRUNUCQk9IEJJVCg3KSwKLQlPRE1fV0lGSV9ESVNQTEFZCT0gQklUKDgpLAotfTsKLQotLyogIE9ETV9DTU5JTkZPX1dNX01PREUgKi8KLWVudW0gb2RtX3dpcmVsZXNzX21vZGUgewotCU9ETV9XTV9VTktOT1cJCT0gMHgwLAotCU9ETV9XTV9CCQk9IEJJVCgwKSwKLQlPRE1fV01fRwkJPSBCSVQoMSksCi0JT0RNX1dNX0EJCT0gQklUKDIpLAotCU9ETV9XTV9OMjRHCQk9IEJJVCgzKSwKLQlPRE1fV01fTjVHCQk9IEJJVCg0KSwKLQlPRE1fV01fQVVUTwkJPSBCSVQoNSksCi0JT0RNX1dNX0FDCQk9IEJJVCg2KSwKLX07Ci0KLS8qICBPRE1fQ01OSU5GT19CQU5EICovCi1lbnVtIG9kbV9iYW5kX3R5cGUgewotCU9ETV9CQU5EXzJfNEcJCT0gQklUKDApLAotCU9ETV9CQU5EXzVHCQk9IEJJVCgxKSwKLQotfTsKLQotLyogIE9ETV9DTU5JTkZPX1NFQ19DSE5MX09GRlNFVCAqLwotZW51bSBvZG1fc2VjX2Nobmxfb2Zmc2V0IHsKLQlPRE1fRE9OVF9DQVJFCQk9IDAsCi0JT0RNX0JFTE9XCQk9IDEsCi0JT0RNX0FCT1ZFCQk9IDIKLX07Ci0KLS8qICBPRE1fQ01OSU5GT19DSE5MICovCi0KLS8qICBPRE1fQ01OSU5GT19CT0FSRF9UWVBFICovCi1lbnVtIG9kbV9ib2FyZF90eXBlIHsKLQlPRE1fQk9BUkRfTk9STUFMCT0gMCwKLQlPRE1fQk9BUkRfSElHSFBXUgk9IDEsCi0JT0RNX0JPQVJEX01JTklDQVJECT0gMiwKLQlPRE1fQk9BUkRfU0xJTQkJPSAzLAotCU9ETV9CT0FSRF9DT01CTwkJPSA0LAotCi19OwotCi0vKiAgT0RNX0NNTklORk9fT05FX1BBVEhfQ0NBICovCi1lbnVtIG9kbV9jY2FfcGF0aCB7Ci0JT0RNX0NDQV8yUgkJCT0gMCwKLQlPRE1fQ0NBXzFSX0EJCQk9IDEsCi0JT0RNX0NDQV8xUl9CCQkJPSAyLAotfTsKLQotc3RydWN0IGlxa19tYXRyaXhfcmVnc19zZXQgewotCWJvb2wJYklRS0RvbmU7Ci0JczMyCVZhbHVlWzFdW0lRS19NYXRyaXhfUkVHX05VTV07Ci19OwotCi1zdHJ1Y3Qgb2RtX3JmX2NhbF90IHsKLQkvKiBmb3IgdHggcG93ZXIgdHJhY2tpbmcgKi8KLQotCXUzMglSZWdBMjQ7IC8qICBmb3IgVGVtcENDSyAqLwotCXMzMglSZWdFOTQ7Ci0JczMyCVJlZ0U5QzsKLQlzMzIJUmVnRUI0OwotCXMzMglSZWdFQkM7Ci0KLQkvKiB1OCBiVFhQb3dlclRyYWNraW5nOyAqLwotCXU4CQlUWFBvd2VyY291bnQ7Ci0JYm9vbCBiVFhQb3dlclRyYWNraW5nSW5pdDsKLQlib29sIGJUWFBvd2VyVHJhY2tpbmc7Ci0JdTgJCVR4UG93ZXJUcmFja0NvbnRyb2w7IC8qIGZvciBtcCBtb2RlLCB0dXJuIG9mZiB0eHB3cnRyYWNraW5nIGFzIGRlZmF1bHQgKi8KLQl1OAkJVE1fVHJpZ2dlcjsKLQl1OAkJSW50ZXJuYWxQQTVHWzJdOwkvKiBwYXRoQSAvIHBhdGhCICovCi0KLQl1OAkJVGhlcm1hbE1ldGVyWzJdOyAgICAvKiAgVGhlcm1hbE1ldGVyLCBpbmRleCAwIGZvciBSRklDMCwgYW5kIDEgZm9yIFJGSUMxICovCi0JdTgJCVRoZXJtYWxWYWx1ZTsKLQl1OAkJVGhlcm1hbFZhbHVlX0xDSzsKLQl1OAkJVGhlcm1hbFZhbHVlX0lRSzsKLQl1OAlUaGVybWFsVmFsdWVfRFBLOwotCXU4CVRoZXJtYWxWYWx1ZV9BVkdbQVZHX1RIRVJNQUxfTlVNXTsKLQl1OAlUaGVybWFsVmFsdWVfQVZHX2luZGV4OwotCXU4CVRoZXJtYWxWYWx1ZV9SeEdhaW47Ci0JdTgJVGhlcm1hbFZhbHVlX0NyeXN0YWw7Ci0JdTgJVGhlcm1hbFZhbHVlX0RQS3N0b3JlOwotCXU4CVRoZXJtYWxWYWx1ZV9EUEt0cmFjazsKLQlib29sCVR4UG93ZXJUcmFja2luZ0luUHJvZ3Jlc3M7Ci0JYm9vbAliRFBLZW5hYmxlOwotCi0JYm9vbAliUmVsb2FkdHhwb3dlcmluZGV4OwotCXU4CWJSZlBpRW5hYmxlOwotCXUzMglUWFBvd2VyVHJhY2tpbmdDYWxsYmFja0NudDsgLyogY29zYSBhZGQgZm9yIGRlYnVnICovCi0KLQl1OAliQ0NLaW5DSDE0OwotCXU4CUNDS19pbmRleDsKLQl1OAlPRkRNX2luZGV4WzJdOwotCWJvb2wgYkRvbmVUeHBvd2VyOwotCi0JdTgJVGhlcm1hbFZhbHVlX0hQW0hQX1RIRVJNQUxfTlVNXTsKLQl1OAlUaGVybWFsVmFsdWVfSFBfaW5kZXg7Ci0Jc3RydWN0IGlxa19tYXRyaXhfcmVnc19zZXQgSVFLTWF0cml4UmVnU2V0dGluZ1tJUUtfTWF0cml4X1NldHRpbmdzX05VTV07Ci0KLQl1OAlEZWx0YV9JUUs7Ci0JdTgJRGVsdGFfTENLOwotCi0JLyogZm9yIElRSyAqLwotCXUzMglSZWdDMDQ7Ci0JdTMyCVJlZzg3NDsKLQl1MzIJUmVnQzA4OwotCXUzMglSZWdCNjg7Ci0JdTMyCVJlZ0I2QzsKLQl1MzIJUmVnODcwOwotCXUzMglSZWc4NjA7Ci0JdTMyCVJlZzg2NDsKLQotCWJvb2wJYklRS0luaXRpYWxpemVkOwotCWJvb2wgYkxDS0luUHJvZ3Jlc3M7Ci0JYm9vbAliQW50ZW5uYURldGVjdGVkOwotCXUzMglBRERBX2JhY2t1cFtJUUtfQUREQV9SRUdfTlVNXTsKLQl1MzIJSVFLX01BQ19iYWNrdXBbSVFLX01BQ19SRUdfTlVNXTsKLQl1MzIJSVFLX0JCX2JhY2t1cF9yZWNvdmVyWzldOwotCXUzMglJUUtfQkJfYmFja3VwW0lRS19CQl9SRUdfTlVNXTsKLQotCS8qIGZvciBBUEsgKi8KLQl1MzIJQVBLb3V0cHV0WzJdWzJdOyAvKiBwYXRoIEEvQjsgb3V0cHV0MV8xYS9vdXRwdXQxXzJhICovCi0JdTgJYkFQS2RvbmU7Ci0JdTgJYkFQS1RoZXJtYWxNZXRlcklnbm9yZTsKLQl1OAliRFBkb25lOwotCXU4CWJEUFBhdGhBT0s7Ci0JdTgJYkRQUGF0aEJPSzsKLX07Ci0KLWVudW0gYW50X2RpZl90eXBlIHsKLQlOT19BTlRESVYJCQk9IDB4RkYsCi0JQ0dfVFJYX0hXX0FOVERJVgkJPSAweDAxLAotCUNHQ1NfUlhfSFdfQU5URElWCQk9IDB4MDIsCi0JRklYRURfSFdfQU5URElWCQkJPSAweDAzLAotCUNHX1RSWF9TTUFSVF9BTlRESVYJCT0gMHgwNCwKLQlDR0NTX1JYX1NXX0FOVERJVgkJPSAweDA1LAotfTsKLQotLyogIDIwMTEvMDkvMjIgTUggQ29weSBmcm9tIFNENCBkZWZpbmVkIHN0cnVjdHVyZS4gV2UgdXNlIHRvIHN1cHBvcnQgUEhZIERNIGludGVncmF0aW9uLiAqLwotc3RydWN0IGRtX29kbV90IHsKLQkvKiAgKi8KLQkvKglBZGQgZm9yIGRpZmZlcmVudCB0ZWFtIHVzZSB0ZW1wb3JhcmlseSAqLwotCS8qICAqLwotCXN0cnVjdCBydHdfYWRhcHRlcgkqQWRhcHRlcjsJCS8qICBGb3IgQ0UvTklDIHRlYW0gKi8KLQotCXU2NAkJCURlYnVnQ29tcG9uZW50czsKLQl1MzIJCQlEZWJ1Z0xldmVsOwotCi0vKiAgT0RNIEhBTkRMRSwgRFJJVkVSIE5FRURTIE5PVCBUTyBIT09LLS0tLS0tICovCi0JYm9vbAkJCWJDY2tIaWdoUG93ZXI7Ci0JdTgJCQlSRlBhdGhSeEVuYWJsZTsJCS8qICBPRE1fQ01OSU5GT19SRlBBVEhfRU5BQkxFICovCi0vKiAgT0RNIEhBTkRMRSwgRFJJVkVSIE5FRURTIE5PVCBUTyBIT09LLS0tLS0tICovCi0KLS8qIDEgIENPTU1PTiBJTkZPUk1BVElPTiAqLwotCi0JLyogIEluaXQgVmFsdWUgKi8KLS8qIEhPT0sgQkVGT1JFIFJFRyBJTklULS0tLS0tLS0tLS0gKi8KLQkvKiAgT0RNIFN1cHBvcnQgQWJpbGl0eSBESUcvUkFUUi9UWF9QV1JfVFJBQ0svIKFLoUsgPSAxLzIvMy+hSyAqLwotCXUzMgkJCVN1cHBvcnRBYmlsaXR5OwotCS8qICBPRE0gY29tcG9zaXRlIG9yIGluZGVwZW5kZW50LiBCaXQgb3JpZW50ZWQvIDkyQys5MkQrIC4uLi4gb3IgYW55IG90aGVyIHR5cGUgPSAxLzIvMy8uLi4gKi8KLQl1MzIJCQlTdXBwb3J0SUNUeXBlOwotCS8qICBDdXQgVmVyc2lvbiBUZXN0Q2hpcC9BLWN1dC9CLWN1dC4uLiA9IDAvMS8yLzMvLi4uICovCi0JdTgJCQlDdXRWZXJzaW9uOwotCS8qICBGYWIgVmVyc2lvbiBUU01DL1VNQyA9IDAvMSAqLwotCXU4CQkJRmFiVmVyc2lvbjsKLQkvKiAgQm9hcmQgVHlwZSBOb3JtYWwvSGlnaFBvd2VyL01pbmlDYXJkL1NMSU0vQ29tYm8vLi4uID0gMC8xLzIvMy80Ly4uLiAqLwotCXU4CQkJQm9hcmRUeXBlOwotCS8qICB3aXRoIGV4dGVybmFsIExOQSAgTk8vWWVzID0gMC8xICovCi0JdTgJCQlFeHRMTkE7Ci0JLyogIHdpdGggZXh0ZXJuYWwgUEEgIE5PL1llcyA9IDAvMSAqLwotCXU4CQkJRXh0UEE7Ci0JLyogIHdpdGggZXh0ZXJuYWwgVFJTVyAgTk8vWWVzID0gMC8xICovCi0JdTgJCQlFeHRUUlNXOwotCWJvb2wJCQliSW5IY3RUZXN0OwotCWJvb2wJCQliV0lGSVRlc3Q7Ci0KLQlib29sCQkJYkR1YWxNYWNTbWFydENvbmN1cnJlbnQ7Ci0JdTMyCQkJQktfU3VwcG9ydEFiaWxpdHk7Ci0vKiBIT09LIEJFRk9SRSBSRUcgSU5JVC0tLS0tLS0tLS0tICovCi0KLQkvKiAgKi8KLQkvKiAgRHluYW1pYyBWYWx1ZSAqLwotCS8qICAqLwotLyogIFBPSU5URVIgUkVGRVJFTkNFLS0tLS0tLS0tLS0gKi8KLQotCXU4CQkJdThfdGVtcDsKLQlib29sCQkJYm9vbF90ZW1wOwotCXN0cnVjdCBydHdfYWRhcHRlcgkqUEFEQVBURVJfdGVtcDsKLQotLyogIFBPSU5URVIgUkVGRVJFTkNFLS0tLS0tLS0tLS0gKi8KLQkvKiAgKi8KLS8qIENBTEwgQlkgVkFMVUUtLS0tLS0tLS0tLS0tICovCi0JYm9vbAkJCWJXSUZJX0RpcmVjdDsKLQlib29sCQkJYldJRklfRGlzcGxheTsKLQlib29sCQkJYkxpbmtlZDsKLQl1OAkJCVJTU0lfTWluOwotCXU4CQkJSW50ZXJmYWNlSW5kZXg7IC8qICBBZGQgZm9yIDkyRCAgZHVhbCBNQUM6IDAtLU1hYzAgMS0tTWFjMSAqLwotCWJvb2wJCWJJc01QQ2hpcDsKLQlib29sCQkJYk9uZUVudHJ5T25seTsKLQkvKiAgQ29tbW9uIGluZm8gZm9yIEJURE0gKi8KLQlib29sCQkJYkJ0RGlzYWJsZWQ7CQkJLyogIEJUIGlzIGRpc2FibGVkICovCi0JYm9vbAkJCWJCdEhzT3BlcmF0aW9uOwkJLyogIEJUIEhTIG1vZGUgaXMgdW5kZXIgcHJvZ3Jlc3MgKi8KLQl1OAkJCWJ0SHNEaWdWYWw7CQkJLyogIHVzZSBCVCByc3NpIHRvIGRlY2lkZSB0aGUgRElHIHZhbHVlICovCi0JYm9vbAkJCWJCdERpc2FibGVFZGNhVHVyYm87CS8qICBVbmRlciBzb21lIGNvbmRpdGlvbiwgZG9uJ3QgZW5hYmxlIHRoZSBFRENBIFR1cmJvICovCi0JYm9vbAkJCWJCdEJ1c3k7CQkJLyogIEJUIGlzIGJ1c3kuICovCi0vKiBDQUxMIEJZIFZBTFVFLS0tLS0tLS0tLS0tLSAqLwotCi0JLyogMiBEZWZpbmUgU1RBIGluZm8uICovCi0JLyogIF9PRE1fU1RBX0lORk8gKi8KLQkvKiAgMjAxMi8wMS8xMiBNSCBGb3IgTVAsIHdlIG5lZWQgdG8gcmVkdWNlIG9uZSBhcnJheSBwb2ludGVyIGZvciBkZWZhdWx0IHBvcnQuPz8gKi8KLQlzdHJ1Y3Qgc3RhX2luZm8gKgkJcE9ETV9TdGFJbmZvW09ETV9BU1NPQ0lBVEVfRU5UUllfTlVNXTsKLQotCS8qICBMYXRlc3QgcGFja2V0IHBoeSBpbmZvIChPRE0gd3JpdGUpICovCi0Jc3RydWN0IG9kbV9waHlfZGJnX2luZm8JIFBoeURiZ0luZm87Ci0JLyogUEhZX0lORk9fODhFCQlQaHlJbmZvOyAqLwotCi0JLyogIExhdGVzdCBwYWNrZXQgcGh5IGluZm8gKE9ETSB3cml0ZSkgKi8KLQkvKiBNQUNfSU5GT184OEUJCU1hY0luZm87ICovCi0KLQkvKiAgRGlmZmVyZW50IFRlYW0gaW5kZXBlbmR0IHN0cnVjdHVyZT8/ICovCi0KLQkvKiAgKi8KLQkvKiBUWF9SVFBfQ01OCQlUWF9yZXRycG87ICovCi0JLyogVFhfUlRQXzg4RQkJVFhfcmV0cnBvOyAqLwotCS8qIFRYX1JUUF84MTk1CQlUWF9yZXRycG87ICovCi0KLQkvKiAgKi8KLQkvKiBPRE0gU3RydWN0dXJlICovCi0JLyogICovCi0Jc3RydWN0IGRpZ190CURNX0RpZ1RhYmxlOwotCXN0cnVjdCBkeW5hbWljX3B3cl9zYXYJCURNX1BTVGFibGU7Ci0Jc3RydWN0IGZhbHNlX2FsYXJtX3N0YXRzCUZhbHNlQWxtQ250OwotCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cwlGbGFzZUFsbUNudEJ1ZGR5QWRhcHRlcjsKLQlzdHJ1Y3Qgc3dfYW50X3N3CQlETV9TV0FUX1RhYmxlOwotCi0Jc3RydWN0IGVkY2FfdHVyYm8JCURNX0VEQ0FfVGFibGU7Ci0JdTMyCQlXTU1FRENBX0JFOwotCS8qICBDb3B5IGZyb20gU0Q0IHN0cnVjdHVyZSAqLwotCS8qICAqLwotCS8qICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCS8qICAqLwotCi0JLyogUFNEICovCi0JdTgJCQlSU1NJX0JUOwkJLyogY29tZSBmcm9tIEJUICovCi0Jc3RydWN0IG9kbV9yYXRlX2FkYXB0CVJhdGVBZGFwdGl2ZTsKLQotCi0Jc3RydWN0IG9kbV9yZl9jYWxfdAlSRkNhbGlicmF0ZUluZm87Ci19OwkvKiAgRE1fRHluYW1pY19NZWNoYW5pc21fU3RydWN0dXJlICovCi0KLWVudW0gb2RtX3JmX2NvbnRlbnQgewotCW9kbV9yYWRpb2FfdHh0ID0gMHgxMDAwLAotCW9kbV9yYWRpb2JfdHh0ID0gMHgxMDAxLAotCW9kbV9yYWRpb2NfdHh0ID0gMHgxMDAyLAotCW9kbV9yYWRpb2RfdHh0ID0gMHgxMDAzCi19OwotCi0vKiAgU3RhdHVzIGNvZGUgKi8KLWVudW0gcnRfc3RhdHVzIHsKLQlSVF9TVEFUVVNfU1VDQ0VTUywKLQlSVF9TVEFUVVNfRkFJTFVSRSwKLQlSVF9TVEFUVVNfUEVORElORywKLQlSVF9TVEFUVVNfUkVTT1VSQ0UsCi0JUlRfU1RBVFVTX0lOVkFMSURfQ09OVEVYVCwKLQlSVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIsCi0JUlRfU1RBVFVTX05PVF9TVVBQT1JULAotCVJUX1NUQVRVU19PU19BUElfRkFJTEVELAotfTsKLQotLyogaW5jbHVkZSAib2RtX2Z1bmN0aW9uLmgiICovCi0KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogMyBESUcgKi8KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi1lbnVtIGRtX2RpZ19vcCB7Ci0JRElHX1RZUEVfVEhSRVNIX0hJR0gJPSAwLAotCURJR19UWVBFX1RIUkVTSF9MT1cJPSAxLAotCURJR19UWVBFX0JBQ0tPRkYJCT0gMiwKLQlESUdfVFlQRV9SWF9HQUlOX01JTgk9IDMsCi0JRElHX1RZUEVfUlhfR0FJTl9NQVgJPSA0LAotCURJR19UWVBFX0VOQUJMRQkJCT0gNSwKLQlESUdfVFlQRV9ESVNBQkxFCQk9IDYsCi0JRElHX09QX1RZUEVfTUFYCi19OwotCi0jZGVmaW5lCQlETV9ESUdfVEhSRVNIX0hJR0gJCQk0MAotI2RlZmluZQkJRE1fRElHX1RIUkVTSF9MT1cJCQkzNQotCi0jZGVmaW5lCQlETV9TQ0FOX1JTU0lfVEgJCQkJMHgxNCAvKiBzY2FuIHJldHVybiBpc3N1ZSBmb3IgTEMgKi8KLQotCi0jZGVmaW5lCQlETV9GQUxTRUFMQVJNX1RIUkVTSF9MT1cJNDAwCi0jZGVmaW5lCQlETV9GQUxTRUFMQVJNX1RIUkVTSF9ISUdICTEwMDAKLQotI2RlZmluZQkJRE1fRElHX01BWF9OSUMJCQkJMHg0ZQotI2RlZmluZQkJRE1fRElHX01JTl9OSUMJCQkJMHgxZQotCi0jZGVmaW5lCQlETV9ESUdfTUFYX0FQCQkJCTB4MzIKLSNkZWZpbmUJCURNX0RJR19NSU5fQVAJCQkJMHgyMAotCi0jZGVmaW5lCQlETV9ESUdfTUFYX05JQ19IUAkJCTB4NDYKLSNkZWZpbmUJCURNX0RJR19NSU5fTklDX0hQCQkJMHgyZQotCi0jZGVmaW5lCQlETV9ESUdfTUFYX0FQX0hQCQkJCTB4NDIKLSNkZWZpbmUJCURNX0RJR19NSU5fQVBfSFAJCQkJMHgzMAotCi0vKiB2aXZpIDkyYyY5MmQgaGFzIGRpZmZlcmVudCBkZWZpbml0aW9uLCAyMDExMDUwNCAqLwotLyogdGhpcyBpcyBmb3IgOTJjICovCi0jZGVmaW5lCQlETV9ESUdfRkFfVEgwCQkJCTB4MjAwCi0jZGVmaW5lCQlETV9ESUdfRkFfVEgxCQkJCTB4MzAwCi0jZGVmaW5lCQlETV9ESUdfRkFfVEgyCQkJCTB4NDAwCi0vKiB0aGlzIGlzIGZvciA5MmQgKi8KLSNkZWZpbmUJCURNX0RJR19GQV9USDBfOTJECQkJMHgxMDAKLSNkZWZpbmUJCURNX0RJR19GQV9USDFfOTJECQkJMHg0MDAKLSNkZWZpbmUJCURNX0RJR19GQV9USDJfOTJECQkJMHg2MDAKLQotI2RlZmluZQkJRE1fRElHX0JBQ0tPRkZfTUFYCQkJMTIKLSNkZWZpbmUJCURNX0RJR19CQUNLT0ZGX01JTgkJCS00Ci0jZGVmaW5lCQlETV9ESUdfQkFDS09GRl9ERUZBVUxUCQkxMAotCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgQUdDIFJYIEhpZ2ggUG93ZXIgTW9kZSAqLwotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lICAgICAgICAgIExOQV9Mb3dfR2Fpbl8xICAgICAgICAgICAgICAgICAgICAgIDB4NjQKLSNkZWZpbmUgICAgICAgICAgTE5BX0xvd19HYWluXzIgICAgICAgICAgICAgICAgICAgICAgMHg1QQotI2RlZmluZSAgICAgICAgICBMTkFfTG93X0dhaW5fMyAgICAgICAgICAgICAgICAgICAgICAweDU4Ci0KLSNkZWZpbmUgICAgICAgICAgRkFfUlhIUF9USDEgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAwCi0jZGVmaW5lICAgICAgICAgIEZBX1JYSFBfVEgyICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwMAotI2RlZmluZSAgICAgICAgICBGQV9SWEhQX1RIMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAwCi0jZGVmaW5lICAgICAgICAgIEZBX1JYSFBfVEg0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MDAKLSNkZWZpbmUgICAgICAgICAgRkFfUlhIUF9USDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMAotCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgRURDQSAqLwotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogMyBEeW5hbWljIFR4IFBvd2VyICovCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIER5bmFtaWMgVHggUG93ZXIgQ29udHJvbCBUaHJlc2hvbGQgKi8KLSNkZWZpbmUJCVRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0xWTDIJNzQKLSNkZWZpbmUJCVRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0xWTDEJNjcKLSNkZWZpbmUJCVRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0FQCQkweDNGCi0KLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsX05vcm1hbAkJMAotI2RlZmluZQkJVHhIaWdoUHdyTGV2ZWxfTGV2ZWwxCQkxCi0jZGVmaW5lCQlUeEhpZ2hQd3JMZXZlbF9MZXZlbDIJCTIKLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsX0JUMQkJCTMKLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsX0JUMgkJCTQKLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsXzE1CQkJNQotI2RlZmluZQkJVHhIaWdoUHdyTGV2ZWxfMzUJCQk2Ci0jZGVmaW5lCQlUeEhpZ2hQd3JMZXZlbF81MAkJCTcKLSNkZWZpbmUJCVR4SGlnaFB3ckxldmVsXzcwCQkJOAotI2RlZmluZQkJVHhIaWdoUHdyTGV2ZWxfMTAwCQkJOQotCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgUmF0ZSBBZGFwdGl2ZSAqLwotLyogMz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lCQlETV9SQVRSX1NUQV9JTklUCQkJMAotI2RlZmluZQkJRE1fUkFUUl9TVEFfSElHSAkJCTEKLSNkZWZpbmUJCQlETV9SQVRSX1NUQV9NSURETEUJCTIKLSNkZWZpbmUJCQlETV9SQVRSX1NUQV9MT1cJCQkzCi0KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotLyogMyBCQiBQb3dlciBTYXZlICovCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotCi1lbnVtIGRtXzFyX2NjYSB7Ci0JQ0NBXzFSID0wLAotCUNDQV8yUiA9IDEsCi0JQ0NBX01BWCA9IDIsCi19OwotCi1lbnVtIGRtX3JmX2RlZiB7Ci0JUkZfU2F2ZSA9MCwKLQlSRl9Ob3JtYWwgPSAxLAotCVJGX01BWCA9IDIsCi19OwotCi0vKiAzPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLS8qIDMgQW50ZW5uYSBEaXZlcnNpdHkgKi8KLS8qIDM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotZW51bSBkbV9zd2FzIHsKLQlBbnRlbm5hX0EgPSAxLAotCUFudGVubmFfQiA9IDIsCi0JQW50ZW5uYV9NQVggPSAzLAotfTsKLQotLyogIE1heGltYWwgbnVtYmVyIG9mIGFudGVubmEgZGV0ZWN0aW9uIG1lY2hhbmlzbSBuZWVkcyB0byBwZXJmb3JtLCBhZGRlZCBieSBSb2dlciwgMjAxMS4xMi4yOC4gKi8KLSNkZWZpbmUJTUFYX0FOVEVOTkFfREVURUNUSU9OX0NOVAkxMAotCi0vKiAgKi8KLS8qICBFeHRlcm4gR2xvYmFsIFZhcmlhYmxlcy4gKi8KLS8qICAqLwotI2RlZmluZQlPRkRNX1RBQkxFX1NJWkVfOTJDCTM3Ci0jZGVmaW5lCU9GRE1fVEFCTEVfU0laRV85MkQJNDMKLSNkZWZpbmUJQ0NLX1RBQkxFX1NJWkUJCTMzCi0KLWV4dGVybgl1MzIgT0ZETVN3aW5nVGFibGUyM0FbT0ZETV9UQUJMRV9TSVpFXzkyRF07Ci1leHRlcm4JdTggQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxMzIzQVtDQ0tfVEFCTEVfU0laRV1bOF07Ci1leHRlcm4JdTggQ0NLU3dpbmdUYWJsZV9DaDE0MjNBIFtDQ0tfVEFCTEVfU0laRV1bOF07Ci0KLQotCi0vKiAgMjAxMDA1MTQgSm9zZXBoOiBBZGQgZGVmaW5pdGlvbiBmb3IgYW50ZW5uYSBzd2l0Y2hpbmcgdGVzdCBhZnRlciBsaW5rLiAqLwotLyogIFRoaXMgaW5kaWNhdGVzIHR3byBkaWZmZXJlbnQgdGhlIHN0ZXBzLiAqLwotLyogIEluIFNXQVdfU1RFUF9QRUFLLCBkcml2ZXIgbmVlZHMgdG8gc3dpdGNoIGFudGVubmEgYW5kIGxpc3RlbiB0byB0aGUgc2lnbmFsIG9uIHRoZSBhaXIuICovCi0vKiAgSW4gU1dBV19TVEVQX0RFVEVSTUlORSwgZHJpdmVyIGp1c3QgY29tcGFyZXMgdGhlIHNpZ25hbCBjYXB0dXJlZCBpbiBTV0FXX1NURVBfUEVBSyAqLwotLyogIHdpdGggb3JpZ2luYWwgUlNTSSB0byBkZXRlcm1pbmUgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIHN3aXRjaCBhbnRlbm5hLiAqLwotI2RlZmluZSBTV0FXX1NURVBfUEVBSwkJMAotI2RlZmluZSBTV0FXX1NURVBfREVURVJNSU5FCTEKLQotc3RydWN0IGhhbF9kYXRhXzg3MjNhOwotCi12b2lkIE9ETV9Xcml0ZV9ESUcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAl1OAlDdXJyZW50SUdJKTsKLXZvaWQgT0RNX1dyaXRlX0NDS19DQ0FfVGhyZXMyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1OAlDdXJDQ0tfQ0NBVGhyZXMpOwotCi12b2lkIE9ETV9TZXRBbnRlbm5hKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTggQW50ZW5uYSk7Ci0KLQotI2RlZmluZSBkbV9SRl9TYXZpbmcJT0RNX1JGX1NhdmluZzIzYQotdm9pZCBPRE1fUkZfU2F2aW5nMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTggYkZvcmNlSW5Ob3JtYWwpOwotCi0jZGVmaW5lIGRtX0NoZWNrVFhQb3dlclRyYWNraW5nCQlPRE1fVFhQb3dlclRyYWNraW5nQ2hlY2syM2EKLXZvaWQgT0RNX1RYUG93ZXJUcmFja2luZ0NoZWNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLWJvb2wgT0RNX1JBU3RhdGVDaGVjazIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHMzMiBSU1NJLCBib29sIGJGb3JjZVVwZGF0ZSwKLQkJICAgICAgdTggKnBSQVRSU3RhdGUpOwotCi0KLXUzMiBDb252ZXJ0VG9fZEIyM2EodTMyIFZhbHVlKTsKLQotdTMyIEdldFBTRERhdGEoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1bnNpZ25lZCBpbnQgcG9pbnQsIHU4IGluaXRpYWxfZ2Fpbl9wc2QpOwotCi12b2lkIG9kbV9ESUcyM2FieVJTU0lfTFBTKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXUzMiBPRE1fR2V0X1JhdGVfQml0bWFwMjNhKHN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEsIHUzMiBtYWNpZCwgdTMyIHJhX21hc2ssIHU4IHJzc2lfbGV2ZWwpOwotCi0KLXZvaWQgT0RNMjNhX0RNSW5pdChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi12b2lkIE9ETV9ETVdhdGNoZG9nMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgT0RNX0NtbkluZm9Jbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBvZG1fY21uaW5mbwlDbW5JbmZvLCB1MzIgVmFsdWUpOwotCi12b2lkIE9ETV9DbW5JbmZvUHRyQXJyYXlIb29rMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBvZG1fY21uaW5mbwlDbW5JbmZvLCB1MTYgSW5kZXgsIHZvaWQgKnBWYWx1ZSk7Ci0KLXZvaWQgT0RNX0NtbkluZm9VcGRhdGUyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgQ21uSW5mbywgdTY0IFZhbHVlKTsKLQotdm9pZCBPRE1fUmVzZXRJUUtSZXN1bHQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotdm9pZCBPRE1fQW50c2VsU3RhdGlzdGljc184OEMoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1OCBNYWNJZCwgdTMyIFBXREJBbGwsIGJvb2wgaXNDQ0tyYXRlKTsKLQotdm9pZCBPRE1fU2luZ2xlRHVhbEFudGVubmFEZWZhdWx0U2V0dGluZyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCi1ib29sIE9ETV9TaW5nbGVEdWFsQW50ZW5uYURldGVjdGlvbihzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHU4IG1vZGUpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fSFdDb25maWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fSFdDb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0OGQ1Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX0hXQ29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZglfX0hBTEhXT1VUU1JDX0hfXwotI2RlZmluZSBfX0hBTEhXT1VUU1JDX0hfXwotCi0jaW5jbHVkZSA8SGFsODcyM0FQaHlDZmcuaD4KLQotLyogICovCi0vKiAgRGVmaW5pdGlvbiAqLwotLyogICovCi0vKiAgKi8KLS8qICAqLwotLyogIENDSyBSYXRlcywgVHhIVCA9IDAgKi8KLSNkZWZpbmUgREVTQzkyQ19SQVRFMU0JCQkJCTB4MDAKLSNkZWZpbmUgREVTQzkyQ19SQVRFMk0JCQkJCTB4MDEKLSNkZWZpbmUgREVTQzkyQ19SQVRFNV81TQkJCQkweDAyCi0jZGVmaW5lIERFU0M5MkNfUkFURTExTQkJCQkweDAzCi0KLS8qICBPRkRNIFJhdGVzLCBUeEhUID0gMCAqLwotI2RlZmluZSBERVNDOTJDX1JBVEU2TQkJCQkJMHgwNAotI2RlZmluZSBERVNDOTJDX1JBVEU5TQkJCQkJMHgwNQotI2RlZmluZSBERVNDOTJDX1JBVEUxMk0JCQkJMHgwNgotI2RlZmluZSBERVNDOTJDX1JBVEUxOE0JCQkJMHgwNwotI2RlZmluZSBERVNDOTJDX1JBVEUyNE0JCQkJMHgwOAotI2RlZmluZSBERVNDOTJDX1JBVEUzNk0JCQkJMHgwOQotI2RlZmluZSBERVNDOTJDX1JBVEU0OE0JCQkJMHgwYQotI2RlZmluZSBERVNDOTJDX1JBVEU1NE0JCQkJMHgwYgotCi0vKiAgTUNTIFJhdGVzLCBUeEhUID0gMSAqLwotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MwCQkJCTB4MGMKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMQkJCQkweDBkCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzIJCQkJMHgwZQotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MzCQkJCTB4MGYKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTNAkJCQkweDEwCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzUJCQkJMHgxMQotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1M2CQkJCTB4MTIKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTNwkJCQkweDEzCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzgJCQkJMHgxNAotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1M5CQkJCTB4MTUKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMTAJCQkJMHgxNgotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MxMQkJCQkweDE3Ci0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzEyCQkJCTB4MTgKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMTMJCQkJMHgxOQotI2RlZmluZSBERVNDOTJDX1JBVEVNQ1MxNAkJCQkweDFhCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzE1CQkJCTB4MWIKLSNkZWZpbmUgREVTQzkyQ19SQVRFTUNTMTVfU0cJCQkweDFjCi0jZGVmaW5lIERFU0M5MkNfUkFURU1DUzMyCQkJCTB4MjAKLQotCi0vKiAgKi8KLS8qICBzdHJ1Y3R1cmUgYW5kIGRlZmluZSAqLwotLyogICovCi0KLXN0cnVjdCBwaHlfcnhfYWdjX2luZm8gewotCSNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KLQkJdTgJZ2Fpbjo3LCB0cnN3OjE7Ci0JI2Vsc2UKLQkJdTgJdHJzdzoxLCBnYWluOjc7Ci0JI2VuZGlmCi19OwotCi1zdHJ1Y3QgcGh5X3N0YXR1c19ycHQgewotCXN0cnVjdCBwaHlfcnhfYWdjX2luZm8gcGF0aF9hZ2NbUkZfUEFUSF9NQVhdOwotCXU4CWNoX2NvcnJbUkZfUEFUSF9NQVhdOwotCXU4CWNja19zaWdfcXVhbF9vZmRtX3B3ZGJfYWxsOwotCXU4CWNja19hZ2NfcnB0X29mZG1fY2Zvc2hvX2E7Ci0JdTgJY2NrX3JwdF9iX29mZG1fY2Zvc2hvX2I7Ci0JdTgJcnN2ZF8xOy8qIGNoX2NvcnJfbXNiOyAqLwotCXU4CW5vaXNlX3Bvd2VyX2RiX21zYjsKLQl1OAlwYXRoX2Nmb3RhaWxbUkZfUEFUSF9NQVhdOwotCXU4CXBjdHNfbWFza1tSRl9QQVRIX01BWF07Ci0JczgJc3RyZWFtX3J4ZXZtW1JGX1BBVEhfTUFYXTsKLQl1OAlwYXRoX3J4c25yW1JGX1BBVEhfTUFYXTsKLQl1OAlub2lzZV9wb3dlcl9kYl9sc2I7Ci0JdTgJcnN2ZF8yWzNdOwotCXU4CXN0cmVhbV9jc2lbUkZfUEFUSF9NQVhdOwotCXU4CXN0cmVhbV90YXJnZXRfY3NpW1JGX1BBVEhfTUFYXTsKLQlzOAlzaWdfZXZtOwotCXU4CXJzdmRfMzsKLQotI2lmZGVmIF9fTElUVExFX0VORElBTgotCXU4CWFudHNlbF9yeF9rZWVwXzI6MTsJLyogZXhfaW50Zl9mbGc6MTsgKi8KLQl1OAlzZ2lfZW46MTsKLQl1OAlyeHNjOjI7Ci0JdTgJaWRsZV9sb25nOjE7Ci0JdTgJcl9hbnRfdHJhaW5fZW46MTsKLQl1OAlhbnRfc2VsX2I6MTsKLQl1OAlhbnRfc2VsOjE7Ci0jZWxzZQkvKiAgX0JJR19FTkRJQU5fICovCi0JdTgJYW50X3NlbDoxOwotCXU4CWFudF9zZWxfYjoxOwotCXU4CXJfYW50X3RyYWluX2VuOjE7Ci0JdTgJaWRsZV9sb25nOjE7Ci0JdTgJcnhzYzoyOwotCXU4CXNnaV9lbjoxOwotCXU4CWFudHNlbF9yeF9rZWVwXzI6MTsJLyogZXhfaW50Zl9mbGc6MTsgKi8KLSNlbmRpZgotfTsKLQotCi1zdHJ1Y3QgcGh5X3N0YXR1c19ycHRfODE5NSB7Ci0Jc3RydWN0IHBoeV9yeF9hZ2NfaW5mbyBwYXRoX2FnY1syXTsKLQl1OAljaF9udW1bMl07Ci0JdTgJY2NrX3NpZ19xdWFsX29mZG1fcHdkYl9hbGw7Ci0JdTgJY2NrX2FnY19ycHRfb2ZkbV9jZm9zaG9fYTsKLQl1OAljY2tfYmJfcHdyX29mZG1fY2Zvc2hvX2I7Ci0JdTggICAgY2NrX3J4X3BhdGg7CS8qIENDS19SWF9QQVRIIFszOjBdICh3aXRoIHJlZ0EwN1szOjBdIGRlZmluaXRpb24pICovCi0JdTgJcnN2ZF8xOwotCXU4CXBhdGhfY2ZvdGFpbFsyXTsKLQl1OAlwY3RzX21hc2tbMl07Ci0JczgJc3RyZWFtX3J4ZXZtWzJdOwotCXU4CXBhdGhfcnhzbnJbMl07Ci0JdTgJcnN2ZF8yWzJdOwotCXU4CXN0cmVhbV9zbnJbMl07Ci0JdTgJc3RyZWFtX2NzaVsyXTsKLQl1OAlyc3ZkXzNbMl07Ci0JczgJc2lnX2V2bTsKLQl1OAlyc3ZkXzQ7Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0JdTgJYW50aWR4X2FudGE6MzsKLQl1OAlhbnRpZHhfYW50YjozOwotCXU4CXJzdmRfNToyOwotI2Vsc2UJLyogIF9CSUdfRU5ESUFOXyAqLwotCXU4CXJzdmRfNToyOwotCXU4CWFudGlkeF9hbnRiOjM7Ci0JdTgJYW50aWR4X2FudGE6MzsKLSNlbmRpZgotfTsKLQotCi12b2lkCi1PRE1fUGh5U3RhdHVzUXVlcnkyM2EoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXN0cnVjdCBwaHlfaW5mbyAqcFBoeUluZm8sCi0JdTggKgkJCQkJCXBQaHlTdGF0dXMsCi0Jc3RydWN0IG9kbV9wYWNrZXRfaW5mbyAqcFBrdGluZm8KLQkpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fUmVnQ29uZmlnODcyM0EuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fUmVnQ29uZmlnODcyM0EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhNTRkOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX1JlZ0NvbmZpZzg3MjNBLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19JTkNfT0RNX1JFR0NPTkZJR19IXzg3MjNBCi0jZGVmaW5lIF9fSU5DX09ETV9SRUdDT05GSUdfSF84NzIzQQotCi12b2lkIG9kbV9Db25maWdSRlJlZ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBBZGRyLCB1MzIgRGF0YSwKLQkJCSAgIGVudW0gUkZfUkFESU9fUEFUSCBSRl9QQVRILCB1MzIgUmVnQWRkcik7Ci0KLXZvaWQgb2RtX0NvbmZpZ01BQ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBBZGRyLCB1OCBEYXRhKTsKLQotdm9pZCBvZG1fQ29uZmlnQkJfQUdDXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIGFkZHIsIHUzMiBkYXRhKTsKLQotdm9pZCBvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIGFkZHIsIHUzMiBkYXRhKTsKLQotI2VuZGlmIC8qICBlbmQgb2YgU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9SZWdEZWZpbmUxMU4uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fUmVnRGVmaW5lMTFOLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NzgyMTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9SZWdEZWZpbmUxMU4uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZglfX09ETV9SRUdERUZJTkUxMU5fSF9fCi0jZGVmaW5lIF9fT0RNX1JFR0RFRklORTExTl9IX18KLQotCi0vKiAyIFJGIFJFRyBMSVNUICovCi0jZGVmaW5lCU9ETV9SRUdfUkZfTU9ERV8xMU4JCQkweDAwCi0jZGVmaW5lCU9ETV9SRUdfUkZfMEJfMTFOCQkJMHgwQgotI2RlZmluZQlPRE1fUkVHX0NITkJXXzExTgkJCTB4MTgKLSNkZWZpbmUJT0RNX1JFR19UX01FVEVSXzExTgkJCTB4MjQKLSNkZWZpbmUJT0RNX1JFR19SRl8yNV8xMU4JCQkweDI1Ci0jZGVmaW5lCU9ETV9SRUdfUkZfMjZfMTFOCQkJMHgyNgotI2RlZmluZQlPRE1fUkVHX1JGXzI3XzExTgkJCTB4MjcKLSNkZWZpbmUJT0RNX1JFR19SRl8yQl8xMU4JCQkweDJCCi0jZGVmaW5lCU9ETV9SRUdfUkZfMkNfMTFOCQkJMHgyQwotI2RlZmluZQlPRE1fUkVHX1JYUkZfQTNfMTFOCQkJMHgzQwotI2RlZmluZQlPRE1fUkVHX1RfTUVURVJfOTJEXzExTgkJCTB4NDIKLSNkZWZpbmUJT0RNX1JFR19UX01FVEVSXzg4RV8xMU4JCQkweDQyCi0KLQotCi0vKiAyIEJCIFJFRyBMSVNUICovCi0vKiBQQUdFIDggKi8KLSNkZWZpbmUJT0RNX1JFR19CQl9DVFJMXzExTgkJCTB4ODAwCi0jZGVmaW5lCU9ETV9SRUdfUkZfUElOXzExTgkJCTB4ODA0Ci0jZGVmaW5lCU9ETV9SRUdfUFNEX0NUUkxfMTFOCQkJMHg4MDgKLSNkZWZpbmUJT0RNX1JFR19UWF9BTlRfQ1RSTF8xMU4JCQkweDgwQwotI2RlZmluZQlPRE1fUkVHX0JCX1BXUl9TQVY1XzExTgkJCTB4ODE4Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX1JQVF9GT1JNQVRfMTFOCQkweDgyNAotI2RlZmluZQlPRE1fUkVHX1JYX0RFRlVBTFRfQV8xMU4JCTB4ODU4Ci0jZGVmaW5lCU9ETV9SRUdfUlhfREVGVUFMVF9CXzExTgkJMHg4NUEKLSNkZWZpbmUJT0RNX1JFR19CQl9QV1JfU0FWM18xMU4JCQkweDg1QwotI2RlZmluZQlPRE1fUkVHX0FOVFNFTF9DVFJMXzExTgkJCTB4ODYwCi0jZGVmaW5lCU9ETV9SRUdfUlhfQU5UX0NUUkxfMTFOCQkJMHg4NjQKLSNkZWZpbmUJT0RNX1JFR19QSU5fQ1RSTF8xMU4JCQkweDg3MAotI2RlZmluZQlPRE1fUkVHX0JCX1BXUl9TQVYxXzExTgkJCTB4ODc0Ci0jZGVmaW5lCU9ETV9SRUdfQU5UU0VMX1BBVEhfMTFOCQkJMHg4NzgKLSNkZWZpbmUJT0RNX1JFR19CQl8zV0lSRV8xMU4JCQkweDg4QwotI2RlZmluZQlPRE1fUkVHX1NDX0NOVF8xMU4JCQkweDhDNAotI2RlZmluZQlPRE1fUkVHX1BTRF9EQVRBXzExTgkJCTB4OEI0Ci0vKiBQQUdFIDkgKi8KLSNkZWZpbmUJT0RNX1JFR19BTlRfTUFQUElORzFfMTFOCQkweDkxNAotI2RlZmluZQlPRE1fUkVHX0FOVF9NQVBQSU5HMl8xMU4JCTB4OTE4Ci0vKiBQQUdFIEEgKi8KLSNkZWZpbmUJT0RNX1JFR19DQ0tfQU5URElWX1BBUkExXzExTgkJMHhBMDAKLSNkZWZpbmUJT0RNX1JFR19DQ0tfQ0NBXzExTgkJCTB4QTBBCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0FOVERJVl9QQVJBMl8xMU4JCTB4QTBDCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0FOVERJVl9QQVJBM18xMU4JCTB4QTEwCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0FOVERJVl9QQVJBNF8xMU4JCTB4QTE0Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBMV8xMU4JCTB4QTIyCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBMl8xMU4JCTB4QTIzCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBM18xMU4JCTB4QTI0Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBNF8xMU4JCTB4QTI1Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBNV8xMU4JCTB4QTI2Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBNl8xMU4JCTB4QTI3Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBN18xMU4JCTB4QTI4Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZJTFRFUl9QQVJBOF8xMU4JCTB4QTI5Ci0jZGVmaW5lCU9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4JCQkweEEyQwotI2RlZmluZQlPRE1fUkVHX0NDS19GQV9NU0JfMTFOCQkJMHhBNTgKLSNkZWZpbmUJT0RNX1JFR19DQ0tfRkFfTFNCXzExTgkJCTB4QTVDCi0jZGVmaW5lCU9ETV9SRUdfQ0NLX0NDQV9DTlRfMTFOCQkJMHhBNjAKLSNkZWZpbmUJT0RNX1JFR19CQl9QV1JfU0FWNF8xMU4JCQkweEE3NAotLyogUEFHRSBCICovCi0jZGVmaW5lCU9ETV9SRUdfTE5BX1NXSVRDSF8xMU4JCQkweEIyQwotI2RlZmluZQlPRE1fUkVHX1BBVEhfU1dJVENIXzExTgkJCTB4QjMwCi0jZGVmaW5lCU9ETV9SRUdfUlNTSV9DVFJMXzExTgkJCTB4QjM4Ci0jZGVmaW5lCU9ETV9SRUdfQ09ORklHX0FOVEFfMTFOCQkJMHhCNjgKLSNkZWZpbmUJT0RNX1JFR19SU1NJX0JUXzExTgkJCTB4QjlDCi0vKiBQQUdFIEMgKi8KLSNkZWZpbmUJT0RNX1JFR19PRkRNX0ZBX0hPTERDXzExTgkJMHhDMDAKLSNkZWZpbmUJT0RNX1JFR19SWF9QQVRIXzExTgkJCTB4QzA0Ci0jZGVmaW5lCU9ETV9SRUdfVFJNVVhfMTFOCQkJMHhDMDgKLSNkZWZpbmUJT0RNX1JFR19PRkRNX0ZBX1JTVENfMTFOCQkweEMwQwotI2RlZmluZQlPRE1fUkVHX1JYSVFJX01BVFJJWF8xMU4JCTB4QzE0Ci0jZGVmaW5lCU9ETV9SRUdfVFhJUUtfTUFUUklYX0xTQjFfMTFOCQkweEM0QwotI2RlZmluZQlPRE1fUkVHX0lHSV9BXzExTgkJCTB4QzUwCi0jZGVmaW5lCU9ETV9SRUdfQU5URElWX1BBUkEyXzExTgkJMHhDNTQKLSNkZWZpbmUJT0RNX1JFR19JR0lfQl8xMU4JCQkweEM1OAotI2RlZmluZQlPRE1fUkVHX0FOVERJVl9QQVJBM18xMU4JCTB4QzVDCi0jZGVmaW5lCU9ETV9SRUdfQkJfUFdSX1NBVjJfMTFOCQkJMHhDNzAKLSNkZWZpbmUJT0RNX1JFR19SWF9PRkZfMTFOCQkJMHhDN0MKLSNkZWZpbmUJT0RNX1JFR19UWElRS19NQVRSSVhBXzExTgkJMHhDODAKLSNkZWZpbmUJT0RNX1JFR19UWElRS19NQVRSSVhCXzExTgkJMHhDODgKLSNkZWZpbmUJT0RNX1JFR19UWElRS19NQVRSSVhBX0xTQjJfMTFOCQkweEM5NAotI2RlZmluZQlPRE1fUkVHX1RYSVFLX01BVFJJWEJfTFNCMl8xMU4JCTB4QzlDCi0jZGVmaW5lCU9ETV9SRUdfUlhJUUtfTUFUUklYX0xTQl8xMU4JCTB4Q0EwCi0jZGVmaW5lCU9ETV9SRUdfQU5URElWX1BBUkExXzExTgkJMHhDQTQKLSNkZWZpbmUJT0RNX1JFR19PRkRNX0ZBX1RZUEUxXzExTgkJMHhDRjAKLS8qIFBBR0UgRCAqLwotI2RlZmluZQlPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4JCTB4RDAwCi0jZGVmaW5lCU9ETV9SRUdfT0ZETV9GQV9UWVBFMl8xMU4JCTB4REEwCi0jZGVmaW5lCU9ETV9SRUdfT0ZETV9GQV9UWVBFM18xMU4JCTB4REE0Ci0jZGVmaW5lCU9ETV9SRUdfT0ZETV9GQV9UWVBFNF8xMU4JCTB4REE4Ci0vKiBQQUdFIEUgKi8KLSNkZWZpbmUJT0RNX1JFR19UWEFHQ19BXzZfMThfMTFOCQkweEUwMAotI2RlZmluZQlPRE1fUkVHX1RYQUdDX0FfMjRfNTRfMTFOCQkweEUwNAotI2RlZmluZQlPRE1fUkVHX1RYQUdDX0FfMV9NQ1MzMl8xMU4JCTB4RTA4Ci0jZGVmaW5lCU9ETV9SRUdfVFhBR0NfQV9NQ1MwXzNfMTFOCQkweEUxMAotI2RlZmluZQlPRE1fUkVHX1RYQUdDX0FfTUNTNF83XzExTgkJMHhFMTQKLSNkZWZpbmUJT0RNX1JFR19UWEFHQ19BX01DUzhfMTFfMTFOCQkweEUxOAotI2RlZmluZQlPRE1fUkVHX1RYQUdDX0FfTUNTMTJfMTVfMTFOCQkweEUxQwotI2RlZmluZQlPRE1fUkVHX0ZQR0EwX0lRS18xMU4JCQkweEUyOAotI2RlZmluZQlPRE1fUkVHX1RYSVFLX1RPTkVfQV8xMU4JCTB4RTMwCi0jZGVmaW5lCU9ETV9SRUdfUlhJUUtfVE9ORV9BXzExTgkJMHhFMzQKLSNkZWZpbmUJT0RNX1JFR19UWElRS19QSV9BXzExTgkJCTB4RTM4Ci0jZGVmaW5lCU9ETV9SRUdfUlhJUUtfUElfQV8xMU4JCQkweEUzQwotI2RlZmluZQlPRE1fUkVHX1RYSVFLXzExTgkJCTB4RTQwCi0jZGVmaW5lCU9ETV9SRUdfUlhJUUtfMTFOCQkJMHhFNDQKLSNkZWZpbmUJT0RNX1JFR19JUUtfQUdDX1BUU18xMU4JCQkweEU0OAotI2RlZmluZQlPRE1fUkVHX0lRS19BR0NfUlNQXzExTgkJCTB4RTRDCi0jZGVmaW5lCU9ETV9SRUdfQkxVRVRPT1RIXzExTgkJCTB4RTZDCi0jZGVmaW5lCU9ETV9SRUdfUlhfV0FJVF9DQ0FfMTFOCQkJMHhFNzAKLSNkZWZpbmUJT0RNX1JFR19UWF9DQ0tfUkZPTl8xMU4JCQkweEU3NAotI2RlZmluZQlPRE1fUkVHX1RYX0NDS19CQk9OXzExTgkJCTB4RTc4Ci0jZGVmaW5lCU9ETV9SRUdfT0ZETV9SRk9OXzExTgkJCTB4RTdDCi0jZGVmaW5lCU9ETV9SRUdfT0ZETV9CQk9OXzExTgkJCTB4RTgwCi0jZGVmaW5lIE9ETV9SRUdfVFgyUlhfMTFOCQkJMHhFODQKLSNkZWZpbmUJT0RNX1JFR19UWDJUWF8xMU4JCQkweEU4OAotI2RlZmluZQlPRE1fUkVHX1JYX0NDS18xMU4JCQkweEU4QwotI2RlZmluZQlPRE1fUkVHX1JYX09GRE1fMTFOCQkJMHhFRDAKLSNkZWZpbmUJT0RNX1JFR19SWF9XQUlUX1JJRlNfMTFOCQkweEVENAotI2RlZmluZQlPRE1fUkVHX1JYMlJYXzExTgkJCTB4RUQ4Ci0jZGVmaW5lCU9ETV9SRUdfU1RBTkRCWV8xMU4JCQkweEVEQwotI2RlZmluZQlPRE1fUkVHX1NMRUVQXzExTgkJCTB4RUUwCi0jZGVmaW5lCU9ETV9SRUdfUE1QRF9BTkFFTl8xMU4JCQkweEVFQwotCi0KLQotCi0KLQotCi0vKiAyIE1BQyBSRUcgTElTVCAqLwotI2RlZmluZQlPRE1fUkVHX0JCX1JTVF8xMU4JCQkweDAyCi0jZGVmaW5lCU9ETV9SRUdfQU5UU0VMX1BJTl8xMU4JCQkweDRDCi0jZGVmaW5lCU9ETV9SRUdfRUFSTFlfTU9ERV8xMU4JCQkweDREMAotI2RlZmluZQlPRE1fUkVHX1JTU0lfTU9OSVRPUl8xMU4JCTB4NEZFCi0jZGVmaW5lCU9ETV9SRUdfRURDQV9WT18xMU4JCQkweDUwMAotI2RlZmluZQlPRE1fUkVHX0VEQ0FfVklfMTFOCQkJMHg1MDQKLSNkZWZpbmUJT0RNX1JFR19FRENBX0JFXzExTgkJCTB4NTA4Ci0jZGVmaW5lCU9ETV9SRUdfRURDQV9CS18xMU4JCQkweDUwQwotI2RlZmluZQlPRE1fUkVHX1RYUEFVU0VfMTFOCQkJMHg1MjIKLSNkZWZpbmUJT0RNX1JFR19SRVNQX1RYXzExTgkJCTB4NkQ4Ci0jZGVmaW5lCU9ETV9SRUdfQU5UX1RSQUlOX1BBUkExXzExTgkJMHg3YjAKLSNkZWZpbmUJT0RNX1JFR19BTlRfVFJBSU5fUEFSQTJfMTFOCQkweDdiNAotCi0KLS8qIERJRyBSZWxhdGVkICovCi0jZGVmaW5lCU9ETV9CSVRfSUdJXzExTgkJCQkweDAwMDAwMDdGCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9kZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGIzNzVhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmCV9fT0RNX0RCR19IX18KLSNkZWZpbmUgX19PRE1fREJHX0hfXwotCi0KLS8qICAqLwotLyoJRGVmaW5lIHRoZSBkZWJ1ZyBsZXZlbHMgKi8KLS8qICAqLwotLyoJMS4JREJHX1RSQUNFIGFuZCBEQkdfTE9VRCBhcmUgdXNlZCBmb3Igbm9ybWFsIGNhc2VzLiAqLwotLyoJU28gdGhhdCwgdGhleSBjYW4gaGVscCBTVyBlbmdpbmVlciB0byBkZXZlbG9wIG9yIHRyYWNlIHN0YXRlcyBjaGFuZ2VkICovCi0vKglhbmQgYWxzbyBoZWxwIEhXIGVuZ2lubmVyIHRvIHRyYWNlIGV2ZXJ5IG9wZXJhdGlvbiB0byBhbmQgZnJvbSBIVywgKi8KLS8qCWUuZyBJTywgVHgsIFJ4LiAqLwotLyogICovCi0vKgkyLglEQkdfV0FSTk5JTkcgYW5kIERCR19TRVJJT1VTIGFyZSB1c2VkIGZvciB1bnVzdWFsIG9yIGVycm9yIGNhc2VzLCAqLwotLyoJd2hpY2ggaGVscCB1cyB0byBkZWJ1ZyBTVyBvciBIVy4gKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLS8qCU5ldmVyIHVzZWQgaW4gYSBjYWxsIHRvIE9ETV9SVF9UUkFDRSgpISAqLwotLyogICovCi0jZGVmaW5lIE9ETV9EQkdfT0ZGCQkJCQkxCi0KLS8qICAqLwotLyoJRmF0YWwgYnVnLiAqLwotLyoJRm9yIGV4YW1wbGUsIFR4L1J4L0lPIGxvY2tlZCB1cCwgT1MgaGFuZ3MsIG1lbW9yeSBhY2Nlc3MgdmlvbGF0aW9uLCAqLwotLyoJcmVzb3VyY2UgYWxsb2NhdGlvbiBmYWlsZWQsIHVuZXhwZWN0ZWQgSFcgYmVoYXZpb3IsIEhXIEJVRyBhbmQgc28gb24uICovCi0vKiAgKi8KLSNkZWZpbmUgT0RNX0RCR19TRVJJT1VTCQkJCTIKLQotLyogICovCi0vKglBYm5vcm1hbCwgcmFyZSwgb3IgdW5leHBldGVkIGNhc2VzLiAqLwotLyoJRm9yIGV4YW1wbGUsIElSUC9QYWNrZXQvT0lEIGNhbmNlbGVkLCBkZXZpY2Ugc3VwcmlzZWx5IHVucmVtb3ZlZCBhbmQgc28gb24uICovCi0vKiAgKi8KLSNkZWZpbmUgT0RNX0RCR19XQVJOSU5HCQkJCTMKLQotLyogICovCi0vKglOb3JtYWwgY2FzZSB3aXRoIHVzZWZ1bCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IFNXIG9yIEhXIHN0YXRlLiAqLwotLyoJRm9yIGV4YW1wbGUsIFR4L1J4IGRlc2NyaXB0b3IgdG8gZmlsbCwgVHgvUnggZGVzY3JpcHRvciBjb21wbGV0ZWQgc3RhdHVzLCAqLwotLyoJU1cgcHJvdG9jb2wgc3RhdGUgY2hhbmdlLCBkeW5hbWljIG1lY2hhbmlzbSBzdGF0ZSBjaGFuZ2UgYW5kIHNvIG9uLiAqLwotLyogICovCi0jZGVmaW5lIE9ETV9EQkdfTE9VRAkJCQkJNAotCi0vKiAgKi8KLS8qCU5vcm1hbCBjYXNlIHdpdGggZGV0YWlsIGV4ZWN1dGlvbiBmbG93IG9yIGluZm9ybWF0aW9uLiAqLwotLyogICovCi0jZGVmaW5lIE9ETV9EQkdfVFJBQ0UJCQkJCTUKLQotLyogICovCi0vKiAgRGVmaW5lIHRoZSB0cmFjaW5nIGNvbXBvbmVudHMgKi8KLS8qICAqLwotLyogICovCi0vKiBCQiBGdW5jdGlvbnMgKi8KLSNkZWZpbmUgT0RNX0NPTVBfRElHCQkJCUJJVCgwKQotI2RlZmluZSBPRE1fQ09NUF9SQV9NQVNLCQkJQklUKDEpCi0jZGVmaW5lIE9ETV9DT01QX0RZTkFNSUNfVFhQV1IJCQlCSVQoMikKLSNkZWZpbmUgT0RNX0NPTVBfRkFfQ05UCQkJCUJJVCgzKQotI2RlZmluZSBPRE1fQ09NUF9SU1NJX01PTklUT1IJCQlCSVQoNCkKLSNkZWZpbmUgT0RNX0NPTVBfQ0NLX1BECQkJCUJJVCg1KQotI2RlZmluZSBPRE1fQ09NUF9BTlRfRElWCQkJQklUKDYpCi0jZGVmaW5lIE9ETV9DT01QX1BXUl9TQVZFCQkJQklUKDcpCi0jZGVmaW5lIE9ETV9DT01QX1BXUl9UUkFJTgkJCUJJVCg4KQotI2RlZmluZSBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFCQkJQklUKDkpCi0jZGVmaW5lIE9ETV9DT01QX1BBVEhfRElWCQkJQklUKDEwKQotI2RlZmluZSBPRE1fQ09NUF9QU0QJCQkJQklUKDExKQotI2RlZmluZSBPRE1fQ09NUF9EWU5BTUlDX1BSSUNDQQkJCUJJVCgxMikKLSNkZWZpbmUgT0RNX0NPTVBfUlhIUAkJCQlCSVQoMTMpCi0vKiBNQUMgRnVuY3Rpb25zICovCi0jZGVmaW5lIE9ETV9DT01QX0VEQ0FfVFVSQk8JCQlCSVQoMTYpCi0jZGVmaW5lIE9ETV9DT01QX0VBUkxZX01PREUJCQlCSVQoMTcpCi0vKiBSRiBGdW5jdGlvbnMgKi8KLSNkZWZpbmUgT0RNX0NPTVBfVFhfUFdSX1RSQUNLCQkJQklUKDI0KQotI2RlZmluZSBPRE1fQ09NUF9SWF9HQUlOX1RSQUNLCQkJQklUKDI1KQotI2RlZmluZSBPRE1fQ09NUF9DQUxJQlJBVElPTgkJCUJJVCgyNikKLS8qIENvbW1vbiBGdW5jdGlvbnMgKi8KLSNkZWZpbmUgT0RNX0NPTVBfQ09NTU9OCQkJCUJJVCgzMCkKLSNkZWZpbmUgT0RNX0NPTVBfSU5JVAkJCQlCSVQoMzEpCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IE1hY3JvIERlZmluaXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCSNkZWZpbmUgUlRfUFJJTlRLKGZtdCwgYXJncy4uLikJcHJpbnRrKCIlcygpOiAiIGZtdCwgX19mdW5jX18sICMjIGFyZ3MpOwotCi0jaWZuZGVmIEFTU0VSVAotCSNkZWZpbmUgQVNTRVJUKGV4cHIpCi0jZW5kaWYKLQotI2RlZmluZSBPRE1fUlRfVFJBQ0UocERNX09kbSwgY29tcCwgbGV2ZWwsIGZtdCkJCQkJCQkJXAotCQlpZigoKGNvbXApICYgcERNX09kbS0+RGVidWdDb21wb25lbnRzKSAmJiAobGV2ZWwgPD0gcERNX09kbS0+RGVidWdMZXZlbCkpCVwKLQkJewkJCQkJCQkJCQlcCi0JCQlwcmludGsoIltPRE0tODcyM0FdICIpOwkJCQkJCVwKLQkJCVJUX1BSSU5USyBmbXQ7CQkJCQkJCQlcCi0JCX0KLQotI2RlZmluZSBPRE1fUlRfQVNTRVJUKHBETV9PZG0sIGV4cHIsIGZtdCkJCQkJCQkJXAotCQlpZighKGV4cHIpKSB7CQkJCQkJCQkJXAotCQkJcHJpbnRrKCJBc3NlcnRpb24gZmFpbGVkISAlcyBhdCAuLi4uLi5cbiIsICNleHByKTsJCQlcCi0JCQlwcmludGsoIiAgICAgIC4uLi4uLiVzLCVzLGxpbmU9JWRcbiIsIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pO1wKLQkJCVJUX1BSSU5USyBmbXQ7CQkJCQkJCQlcCi0JCQlBU1NFUlQoZmFsc2UpOwkJCQkJCQkJXAotCQl9Ci0KLXZvaWQgT0RNX0luaXREZWJ1Z1NldHRpbmcyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotI2VuZGlmCS8qICBfX09ETV9EQkdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX2ludGVyZmFjZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzYmYwMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX2ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZglfX09ETV9JTlRFUkZBQ0VfSF9fCi0jZGVmaW5lIF9fT0RNX0lOVEVSRkFDRV9IX18KLQotCi0vKiAgX2NhdDogaW1wbGVtZW50ZWQgYnkgVG9rZW4tUGFzdGluZyBPcGVyYXRvci4gKi8KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jZGVmaW5lIE9ETV9SRUdfRElHXzExTgkJMHhDNTAKLSNkZWZpbmUgT0RNX1JFR19ESUdfMTFBQwkweERERAotCi1PRE1fUkVHKERJRyxfcERNX09kbSkKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jZGVmaW5lIF9yZWdfMTFOKF9uYW1lKQkJCU9ETV9SRUdfIyNfbmFtZSMjXzExTgotI2RlZmluZSBfcmVnXzExQUMoX25hbWUpCQlPRE1fUkVHXyMjX25hbWUjI18xMUFDCi0jZGVmaW5lIF9iaXRfMTFOKF9uYW1lKQkJCU9ETV9CSVRfIyNfbmFtZSMjXzExTgotI2RlZmluZSBfYml0XzExQUMoX25hbWUpCQlPRE1fQklUXyMjX25hbWUjI18xMUFDCi0KLSNkZWZpbmUgX2NhdChfbmFtZSwgX2Z1bmMpCQkJCQlcCi0JKAkJCQkJCQlcCi0JCV9mdW5jIyNfMTFOKF9uYW1lKQkJCQlcCi0JKQotCi0vKiAgX25hbWU6IG5hbWUgb2YgcmVnaXN0ZXIgb3IgYml0LiAqLwotLyogIEV4YW1wbGU6ICJPRE1fUkVHKFJfQV9BR0NfQ09SRTEsIHBETV9PZG0pIiAqLwotLyogICAgICAgICBnZXRzICJPRE1fUl9BX0FHQ19DT1JFMSIgb3IgIk9ETV9SX0FfQUdDX0NPUkUxXzgxOTJDIiwgZGVwZW5kcyBvbiBTdXBwb3J0SUNUeXBlLiAqLwotI2RlZmluZSBPRE1fUkVHKF9uYW1lLCBfcERNX09kbSkJX2NhdChfbmFtZSwgX3JlZykKLSNkZWZpbmUgT0RNX0JJVChfbmFtZSwgX3BETV9PZG0pCV9jYXQoX25hbWUsIF9iaXQpCi0KLS8qICAqLwotLyogIDIwMTIvMDIvMTcgTUggRm9yIG5vbi1NUCBjb21waWxlIHBhc3Mgb25seS4gTGludXggZG9lcyBub3Qgc3VwcG9ydCB3b3JraXRlbS4gKi8KLS8qICBTdWdnZXN0IEhXIHRlYW0gdG8gdXNlIHRocmVhZCBpbnN0ZWFkIG9mIHdvcmtpdGVtLiBXaW5kb3dzIGFsc28gc3VwcG9ydCB0aGUgZmVhdHVyZS4gKi8KLS8qICAqLwotdHlwZWRlZiB2b2lkICgqUlRfV09SS0lURU1fQ0FMTF9CQUNLKShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnBDb250ZXh0KTsKLQotLyogICovCi0vKiAgPT09PT09PT09PT0gRVh0ZXJuIEZ1bmN0aW9uIFByb3RvdHlwZSAqLwotLyogICovCi0KLXZvaWQgT0RNX1NldFJGUmVnKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsCi0JCSAgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrLCB1MzIgRGF0YSk7Ci11MzIgT0RNX0dldFJGUmVnKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsCi0JCSB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2spOwotCi0jZW5kaWYJLyogIF9fT0RNX0lOVEVSRkFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fcHJlY29tcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9wcmVjb21wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNzkzYzguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9wcmVjb21wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZglfX09ETV9QUkVDT01QX0hfXwotI2RlZmluZSBfX09ETV9QUkVDT01QX0hfXwotCi0vKiAyIENvbmZpZyBGbGFncyBhbmQgU3RydWN0cyAtIGRlZmluZWQgYnkgZWFjaCBPRE0gVHlwZSAqLwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPGhhbF9pbnRmLmg+Ci0KLQotLyogMiBIYXJkd2FyZSBQYXJhbWV0ZXIgRmlsZXMgKi8KLSNpbmNsdWRlICJIYWw4NzIzVUhXSW1nX0NFLmgiCi0KLQotLyogMiBPdXRTcmMgSGVhZGVyIEZpbGVzICovCi0KLSNpbmNsdWRlICJvZG0uaCIKLSNpbmNsdWRlICJvZG1fSFdDb25maWcuaCIKLSNpbmNsdWRlICJvZG1fZGVidWcuaCIKLSNpbmNsdWRlICJvZG1fUmVnRGVmaW5lMTFOLmgiCi0KLSNpbmNsdWRlICJIYWxETU91dFNyYzg3MjNBLmgiIC8qIGZvciBJUUssTENLLFBvd2VyLXRyYWNraW5nICovCi0jaW5jbHVkZSAicnRsODcyM2FfaGFsLmgiCi0KLSNpbmNsdWRlICJvZG1faW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAib2RtX3JlZy5oIgotCi0jaW5jbHVkZSAiSGFsSFdJbWc4NzIzQV9NQUMuaCIKLSNpbmNsdWRlICJIYWxIV0ltZzg3MjNBX1JGLmgiCi0jaW5jbHVkZSAiSGFsSFdJbWc4NzIzQV9CQi5oIgotI2luY2x1ZGUgIkhhbEhXSW1nODcyM0FfRlcuaCIKLSNpbmNsdWRlICJvZG1fUmVnQ29uZmlnODcyM0EuaCIKLQotI2VuZGlmCS8qICBfX09ETV9QUkVDT01QX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9yZWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fcmVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODQzMzEyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fcmVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgKi8KLS8qICBGaWxlIE5hbWU6IG9kbV9yZWcuaCAqLwotLyogICovCi0vKiAgRGVzY3JpcHRpb246ICovCi0vKiAgKi8KLS8qICBUaGlzIGZpbGUgaXMgZm9yIGdlbmVyYWwgcmVnaXN0ZXIgZGVmaW5pdGlvbi4gKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLSNpZm5kZWYJX19IQUxfT0RNX1JFR19IX18KLSNkZWZpbmUgX19IQUxfT0RNX1JFR19IX18KLQotLyogICovCi0vKiAgUmVnaXN0ZXIgRGVmaW5pdGlvbiAqLwotLyogICovCi0KLS8qIE1BQyBSRUcgKi8KLSNkZWZpbmUJT0RNX0JCX1JFU0VUCQkJCQkweDAwMgotI2RlZmluZQlPRE1fRFVNTVkJCQkJCQkweDRmZQotI2RlZmluZQlPRE1fRURDQV9WT19QQVJBTQkJCTB4NTAwCi0jZGVmaW5lCU9ETV9FRENBX1ZJX1BBUkFNCQkJMHg1MDQKLSNkZWZpbmUJT0RNX0VEQ0FfQkVfUEFSQU0JCQkweDUwOAotI2RlZmluZQlPRE1fRURDQV9CS19QQVJBTQkJCTB4NTBDCi0jZGVmaW5lCU9ETV9UWFBBVVNFCQkJCQkweDUyMgotCi0vKiBCQiBSRUcgKi8KLSNkZWZpbmUJT0RNX0ZQR0FfUEhZMF9QQUdFOAkJCTB4ODAwCi0jZGVmaW5lCU9ETV9QU0RfU0VUVElORwkJCQkweDgwOAotI2RlZmluZQlPRE1fQUZFX1NFVFRJTkcJCQkJMHg4MTgKLSNkZWZpbmUJT0RNX1RYQUdDX0JfNl8xOAkJCQkweDgzMAotI2RlZmluZQlPRE1fVFhBR0NfQl8yNF81NAkJCTB4ODM0Ci0jZGVmaW5lCU9ETV9UWEFHQ19CX01DUzMyXzUJCQkweDgzOAotI2RlZmluZQlPRE1fVFhBR0NfQl9NQ1MwX01DUzMJCTB4ODNjCi0jZGVmaW5lCU9ETV9UWEFHQ19CX01DUzRfTUNTNwkJMHg4NDgKLSNkZWZpbmUJT0RNX1RYQUdDX0JfTUNTOF9NQ1MxMQkJMHg4NGMKLSNkZWZpbmUJT0RNX0FOQUxPR19SRUdJU1RFUgkJCTB4ODVjCi0jZGVmaW5lCU9ETV9SRl9JTlRFUkZBQ0VfT1VUUFVUCQkweDg2MAotI2RlZmluZQlPRE1fVFhBR0NfQl9NQ1MxMl9NQ1MxNQkweDg2OAotI2RlZmluZQlPRE1fVFhBR0NfQl8xMV9BXzJfMTEJCTB4ODZjCi0jZGVmaW5lCU9ETV9BRF9EQV9MU0JfTUFTSwkJCTB4ODc0Ci0jZGVmaW5lCU9ETV9FTkFCTEVfM19XSVJFCQkJMHg4OGMKLSNkZWZpbmUJT0RNX1BTRF9SRVBPUlQJCQkJMHg4YjQKLSNkZWZpbmUJT0RNX1JfQU5UX1NFTEVDVAkJCQkweDkwYwotI2RlZmluZQlPRE1fQ0NLX0FOVF9TRUxFQ1QJCQkweGEwNwotI2RlZmluZQlPRE1fQ0NLX1BEX1RIUkVTSAkJCTB4YTBhCi0jZGVmaW5lCU9ETV9DQ0tfUkZfUkVHMQkJCQkweGExMQotI2RlZmluZQlPRE1fQ0NLX01BVENIX0ZJTFRFUgkJCTB4YTIwCi0jZGVmaW5lCU9ETV9DQ0tfUkFLRV9NQUMJCQkJMHhhMmUKLSNkZWZpbmUJT0RNX0NDS19DTlRfUkVTRVQJCQkweGEyZAotI2RlZmluZQlPRE1fQ0NLX1RYX0RJVkVSU0lUWQkJCTB4YTJmCi0jZGVmaW5lCU9ETV9DQ0tfRkFfQ05UX01TQgkJCTB4YTViCi0jZGVmaW5lCU9ETV9DQ0tfRkFfQ05UX0xTQgkJCTB4YTVjCi0jZGVmaW5lCU9ETV9DQ0tfTkVXX0ZVTkNUSU9OCQkweGE3NQotI2RlZmluZQlPRE1fT0ZETV9QSFkwX1BBR0VfQwkJMHhjMDAKLSNkZWZpbmUJT0RNX09GRE1fUlhfQU5UCQkJCTB4YzA0Ci0jZGVmaW5lCU9ETV9SX0FfUlhJUUkJCQkJCTB4YzE0Ci0jZGVmaW5lCU9ETV9SX0FfQUdDX0NPUkUxCQkJMHhjNTAKLSNkZWZpbmUJT0RNX1JfQV9BR0NfQ09SRTIJCQkweGM1NAotI2RlZmluZQlPRE1fUl9CX0FHQ19DT1JFMQkJCTB4YzU4Ci0jZGVmaW5lCU9ETV9SX0FHQ19QQVIJCQkJCTB4YzcwCi0jZGVmaW5lCU9ETV9SX0hUU1RGX0FHQ19QQVIJCQkweGM3YwotI2RlZmluZQlPRE1fVFhfUFdSX1RSQUlOSU5HX0EJCTB4YzkwCi0jZGVmaW5lCU9ETV9UWF9QV1JfVFJBSU5JTkdfQgkJMHhjOTgKLSNkZWZpbmUJT0RNX09GRE1fRkFfQ05UMQkJCQkweGNmMAotI2RlZmluZQlPRE1fT0ZETV9QSFkwX1BBR0VfRAkJMHhkMDAKLSNkZWZpbmUJT0RNX09GRE1fRkFfQ05UMgkJCQkweGRhMAotI2RlZmluZQlPRE1fT0ZETV9GQV9DTlQzCQkJCTB4ZGE0Ci0jZGVmaW5lCU9ETV9PRkRNX0ZBX0NOVDQJCQkJMHhkYTgKLSNkZWZpbmUJT0RNX1RYQUdDX0FfNl8xOAkJCQkweGUwMAotI2RlZmluZQlPRE1fVFhBR0NfQV8yNF81NAkJCTB4ZTA0Ci0jZGVmaW5lCU9ETV9UWEFHQ19BXzFfTUNTMzIJCQkweGUwOAotI2RlZmluZQlPRE1fVFhBR0NfQV9NQ1MwX01DUzMJCTB4ZTEwCi0jZGVmaW5lCU9ETV9UWEFHQ19BX01DUzRfTUNTNwkJMHhlMTQKLSNkZWZpbmUJT0RNX1RYQUdDX0FfTUNTOF9NQ1MxMQkJMHhlMTgKLSNkZWZpbmUJT0RNX1RYQUdDX0FfTUNTMTJfTUNTMTUJCTB4ZTFjCi0KLS8qIFJGIFJFRyAqLwotI2RlZmluZQlPRE1fR0FJTl9TRVRUSU5HCQkJCTB4MDAKLSNkZWZpbmUJT0RNX0NIQU5ORUwJCQkJCTB4MTgKLQotLyogQW50IERldGVjdCBSZWcgKi8KLSNkZWZpbmUJT0RNX0RQRFQJCQkJCQkweDMwMAotCi0vKiBQU0QgSW5pdCAqLwotI2RlZmluZQlPRE1fUFNEUkVHCQkJCQkweDgwOAotCi0vKiA5MkQgUGF0aCBEaXYgKi8KLSNkZWZpbmUJUEFUSERJVl9SRUcJCQkJCTB4QjMwCi0jZGVmaW5lCVBBVEhESVZfVFJJCQkJCQkweEJBMAotCi0vKiAgKi8KLS8qICBCaXRtYXAgRGVmaW5pdGlvbiAqLwotLyogICovCi0KLSNkZWZpbmUJQklUX0ZBX1JFU0VUCQkJCQlCSVQoMCkKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb3NkZXBfaW50Zi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29zZGVwX2ludGYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1N2ViMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb3NkZXBfaW50Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19PU0RFUF9JTlRGX0hfCi0jZGVmaW5lIF9fT1NERVBfSU5URl9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi1pbnQgcnR3X2luaXRfZHJ2X3N3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotaW50IHJ0d19mcmVlX2Rydl9zdzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBydHdfcmVzZXRfZHJ2X3N3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0d19jYW5jZWxfYWxsX3RpbWVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi1pbnQgcnR3X2luaXRfbmV0ZGV2MjNhX25hbWUyM2Eoc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYsIGNvbnN0IGNoYXIgKmlmbmFtZSk7Ci1zdHJ1Y3QgbmV0X2RldmljZSAqcnR3X2luaXRfbmV0ZGV2MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi11MTYgcnR3X3JlY3Zfc2VsZWN0X3F1ZXVlMjNhKHN0cnVjdCBza19idWZmICpza2IpOwotCi12b2lkIHJ0d19pcHNfZGV2X3VubG9hZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotaW50IHJ0d19pcHNfcHdyX3VwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfaXBzX3B3cl9kb3duMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi1pbnQgcnR3X2Rydl9yZWdpc3Rlcl9uZXRkZXYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19uZGV2X2Rlc3RydWN0b3Ioc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOwotCi1pbnQgcnRsODcyM2F1X2luaXJwX2luaXQoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKTsKLWludCBydGw4NzIzYXVfaW5pcnBfZGVpbml0KHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX3VzYl9pbnRmX3N0b3Aoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLSNlbmRpZgkvKiBfT1NERVBfSU5URl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MjUwYjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX09TREVQX1NFUlZJQ0VfSF8KLSNkZWZpbmUgX19PU0RFUF9TRVJWSUNFX0hfCi0KLSNkZWZpbmUgX0ZBSUwJCTAKLSNkZWZpbmUgX1NVQ0NFU1MJMQotI2RlZmluZSBSVFdfUlhfSEFORExFRCAyCi0KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VtLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4JLyogIGZvciBzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKi8KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotCi0jaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgotI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgotCi1zdHJ1Y3QgcnR3X3F1ZXVlIHsKLQlzdHJ1Y3QJbGlzdF9oZWFkCXF1ZXVlOwotCXNwaW5sb2NrX3QJCWxvY2s7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBsaXN0X2hlYWQgKmdldF9saXN0X2hlYWQoc3RydWN0IHJ0d19xdWV1ZSAqcXVldWUpCi17Ci0JcmV0dXJuICZxdWV1ZS0+cXVldWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJ0d19uZXRpZl9xdWV1ZV9zdG9wcGVkKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQotewotCXJldHVybiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHBuZXRkZXYsIDApKSAmJgotCQluZXRpZl90eF9xdWV1ZV9zdG9wcGVkKG5ldGRldl9nZXRfdHhfcXVldWUocG5ldGRldiwgMSkpICYmCi0JCW5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQobmV0ZGV2X2dldF90eF9xdWV1ZShwbmV0ZGV2LCAyKSkgJiYKLQkJbmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHBuZXRkZXYsIDMpKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIENIS0JJVCh1MzIgeCkKLXsKLQlXQVJOX09OKHggPj0gMzIpOwotCWlmICh4ID49IDMyKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gQklUKHgpOwotfQotCi1leHRlcm4gdW5zaWduZWQgY2hhciBNQ1NfcmF0ZV8yUjIzQVsxNl07Ci0KLWV4dGVybiB1bnNpZ25lZCBjaGFyCU1DU19yYXRlXzJSMjNBWzE2XTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyCU1DU19yYXRlXzFSMjNBWzE2XTsKLQotdm9pZAlfcnR3X2luaXRfcXVldWUyM2Eoc3RydWN0IHJ0d19xdWV1ZSAqcHF1ZXVlKTsKLQotLyogTWFjcm9zIGZvciBoYW5kbGluZyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzICovCi0KLSNkZWZpbmUgUlRXX0dFVF9CRTI0KGEpICgoKCh1MzIpIChhKVswXSkgPDwgMTYpIHwgKCgodTMyKSAoYSlbMV0pIDw8IDgpIHwgXAotCQkJICgodTMyKSAoYSlbMl0pKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9yZWN2X29zZGVwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcmVjdl9vc2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmQzZjFiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9yZWN2X29zZGVwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SRUNWX09TREVQX0hfCi0jZGVmaW5lIF9fUkVDVl9PU0RFUF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi1pbnQgX3J0d19pbml0X3JlY3ZfcHJpdjIzYShzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYsIHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBfcnR3X2ZyZWVfcmVjdl9wcml2MjNhIChzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYpOwotCi1pbnQgcnR3X3JlY3ZfZW50cnkyM2Eoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLWludCBydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdl9mcmFtZSk7Ci0KLXZvaWQgcnR3X2hhbmRsZV90a2lwX21pY19lcnIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYmdyb3VwKTsKLQotaW50CXJ0d19pbml0X3JlY3ZfcHJpdihzdHJ1Y3QgcmVjdl9wcml2ICpwcmVjdnByaXYsIHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydHdfZnJlZV9yZWN2X3ByaXYgKHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdik7Ci0KLWludCBydHdfb3NfcmVjdl9yZXNvdXJjZV9pbml0KHN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiwgc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnR3X2luaXRfcmVjdl90aW1lcjIzYShzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKnByZW9yZGVyX2N0cmwpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9idC1jb2V4aXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfYnQtY29leGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWRkNWRmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9idC1jb2V4aXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUTDg3MjNBX0JUX0NPRVhJU1RfSF9fCi0jZGVmaW5lIF9fUlRMODcyM0FfQlRfQ09FWElTVF9IX18KLQotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgIm9kbV9wcmVjb21wLmgiCi0KLQotLyogIEhFQURFUi9QbGF0Zm9ybURlZi5oICovCi1lbnVtIHJ0X21lZGlhX3N0YXR1cyB7Ci0JUlRfTUVESUFfRElTQ09OTkVDVAk9IDAsCi0JUlRfTUVESUFfQ09OTkVDVAk9IDEKLX07Ci0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9OL0JULmggPT09PT0gKi8KLQotI2RlZmluZQlCVF9UTVBfQlVGX1NJWkUJCTEwMAotCi12b2lkIEJUX1NpZ25hbENvbXBlbnNhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgdTggKnJzc2lfd2lmaSwgdTggKnJzc2lfYnQpOwotdm9pZCBCVF9IYWx0UHJvY2VzcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRfTHBzTGVhdmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLQotI2RlZmluZQlCVF9Ic0Nvbm5lY3Rpb25Fc3RhYmxpc2hlZChBZGFwdGVyKQkJZmFsc2UKLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9OL0JULmggPT09PT0gKi8KLQotLyogIEhFQURFUi9TZWN1cml0eVR5cGUuaCAqLwotI2RlZmluZSBUS0lQX0VOQ19LRVlfUE9TCQkzMgkJLyogS0VLX0xFTitLRUtfTEVOKSAqLwotI2RlZmluZSBNQVhSU05JRUxFTgkJCQkyNTYKLQotLyogIENPTU1PTi9Qcm90b2NvbDgwMl8xMS5oICovCi0vKiAgKi8KLS8qICAgICAgIDgwMi4xMSBNYW5hZ2VtZW50IGZyYW1lIFN0YXR1cyBDb2RlIGZpZWxkICovCi0vKiAgKi8KLXN0cnVjdCBvY3RldF9zdHJpbmcgewotCXU4CQkqT2N0ZXQ7Ci0JdTE2CQlMZW5ndGg7Ci19OwotCi0KLS8qICBBRVNfQ0NNUCBzcGVjaWZpYyAqLwotZW51bSB7Ci0JQUVTQ0NNUF9CTEtfU0laRQkJPSAgIDE2LCAgICAgLyogICMgb2N0ZXRzIGluIGFuIEFFUyBibG9jayAqLwotCUFFU0NDTVBfTUFYX1BBQ0tFVAkJPSAgIDQqNTEyLCAgLyogIGxhcmdlc3QgcGFja2V0IHNpemUgKi8KLQlBRVNDQ01QX05fUkVTRVJWRUQJCT0gICAwLCAgICAgIC8qICByZXNlcnZlZCBub25jZSBvY3RldCB2YWx1ZSAqLwotCUFFU0NDTVBfQV9EQVRBCQkJPSAgIDB4NDAsICAgLyogIHRoZSBBZGF0YSBiaXQgaW4gdGhlIGZsYWdzICovCi0JQUVTQ0NNUF9NX1NISUZUCQkJPSAgIDMsICAgICAgLyogIGhvdyBtdWNoIHRvIHNoaWZ0IHRoZSAzLWJpdCBNIGZpZWxkICovCi0JQUVTQ0NNUF9MX1NISUZUCQkJPSAgIDAsICAgICAgLyogIGhvdyBtdWNoIHRvIHNoaWZ0IHRoZSAzLWJpdCBMIGZpZWxkICovCi0JQUVTQ0NNUF9MX1NJWkUJCQk9ICAgMiwgICAgICAgLyogIHNpemUgb2YgdGhlIGwobSkgbGVuZ3RoIGZpZWxkIChpbiBvY3RldHMpICovCi0JQUVTQ0NNUF9PRkZTRVRfU0MJCT0JMjIsCi0JQUVTQ0NNUF9PRkZTRVRfRFVSQVRJT04JPQk0LAotCUFFU0NDTVBfT0ZGU0VUX0EyCQk9CTEwLAotCUFFU0NDTVBfT0ZGU0VUX0E0CQk9CTI0LAotCUFFU0NDTVBfUUNfVElEX01BU0sJCT0JMHgwZiwKLQlBRVNDQ01QX0JMS19TSVpFX1RPVEFMCT0gICAxNioxNiwgICAgIC8qICBBZGRlZCBieSBBbm5pZSBmb3IgQ0tJUCBBRVMgTUlDIEJTT0QsIDIwMDYtMDgtMTcuICovCi0JCQkJCQkJCQkJCS8qICAxNio4IDwgNCo2MCAgUmVzb3ZlIHRvIDE2KjE2ICovCi19OwotCi0vKiAgS2V5IExlbmd0aCAqLwotI2RlZmluZSBQTUtfTEVOCQkJCTMyCi0jZGVmaW5lIFBUS19MRU5fVEtJUAkJCTY0Ci0jZGVmaW5lIEdUS19MRU4JCQkJMzIKLSNkZWZpbmUgS0VZX05PTkNFX0xFTgkJCTMyCi0KLQotLyogIENPTU1PTi9Eb3QxMWQuaCAqLwotc3RydWN0IGNobmxfdHhwb3dlcl90cmlwbGUgewotCXU4IEZpcnN0Q2hubDsKLQl1OCBOdW1DaG5sczsKLQlzOCBNYXhUeFBvd2VySW5EYm07Ci19OwotCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9OL2J0X2hjaS5oID09PT09ICovCi0vKiAgVGhlIGZvbGxvd2luZyBpcyBmb3IgQlQgMy4wICsgSFMgSENJIENPTU1BTkQgRVJST1JTIENPREVTICovCi0KLSNkZWZpbmUgTWF4ODAyMTFQQUxQRFVTaXplCQkJMTQ5MgotI2RlZmluZSBNYXg4MDIxMUFNUEFTU09DTGVuCQkJNjcyCi0jZGVmaW5lIE1pbkdVc2VyUHJpbwkJCQkJNAotI2RlZmluZSBNYXhHVXNlclByaW8JCQkJCTcKLSNkZWZpbmUgQkVVc2VyUHJpbzAJCQkJCQkwCi0jZGVmaW5lIEJFVXNlclByaW8xCQkJCQkJMwotI2RlZmluZSBNYXg4MDIxMUJlYWNvblBlcmlvZAkJMjAwMAotI2RlZmluZSBTaG9ydFJhbmdlTW9kZVBvd2VyTWF4CQk0Ci0KLSNkZWZpbmUgQlRfRGVmYXVsdF9DaG5sCQkJCQkxMAotI2RlZmluZSBBQ0xEYXRhSGVhZGVyTGVuCQkJCTQKLQotI2RlZmluZSBCVFRvdGFsRGF0YUJsb2NrTnVtCQkJMHgxMDAKLSNkZWZpbmUgQlRMb2NhbEJ1Zk51bQkJCQkJMHgyMDAKLSNkZWZpbmUgQlRNYXhEYXRhQmxvY2tMZW4JCQkJMHg4MDAKLSNkZWZpbmUgQlRUT1RBTEJBTkRXSURUSAkJCQkweDc1MzAKLSNkZWZpbmUgQlRNQVhCQU5ER1VCQU5EV0lEVEgJCTB4NGUyMAotI2RlZmluZSBUbXBMb2NhbEJ1ZlNpemUJCQkJCTB4MTAwCi0jZGVmaW5lIEJUU3luRGF0YVBhY2tldExlbmd0aAkJCTB4ZmYKLS8qICAqLwotCi0jZGVmaW5lIEJUTWF4QXV0aENvdW50CQkJCQk1Ci0jZGVmaW5lIEJUTWF4QXNvY0NvdW50CQkJCQk1Ci0KLSNkZWZpbmUgTUFYX0xPR0lDQUxfTElOS19OVU0JCQkyCS8qIHRlbXBvcmFyaWx5IGRlZmluZSAqLwotI2RlZmluZSBNQVhfQlRfQVNPQ19FTlRSWV9OVU0JCTIJLyogdGVtcG9yYXJpbHkgZGVmaW5lICovCi0KLSNkZWZpbmUgSU5WQUxJRF9QTF9IQU5ETEUJCQkJMHhmZgotI2RlZmluZSBJTlZBTElEX0VOVFJZX05VTQkJCQkweGZmCi0vKiAgKi8KLQotI2RlZmluZSBDQU1fQlRfU1RBUlRfSU5ERVgJCShIQUxGX0NBTV9FTlRSWSAtIDQpICAgLyogIE1BWF9CVF9BU09DX0VOVFJZX05VTSA6IDQgISEhICovCi0jZGVmaW5lIEJUX0hXQ0FNX1NUQVIJCQlDQU1fQlRfU1RBUlRfSU5ERVggIC8qICBXZSB1c2VkICBIQUxGX0NBTV9FTlRSWSB+IEhBTEZfQ0FNX0VOVFJZIC1NQVhfQlRfQVNPQ19FTlRSWV9OVU0gKi8KLQotZW51bSBoY2lfc3RhdHVzIHsKLQlIQ0lfU1RBVFVTX1NVQ0NFU1MJCQk9IDB4MDAsIC8qIFN1Y2Nlc3MgKi8KLQlIQ0lfU1RBVFVTX1VOS05PV19IQ0lfQ01ECQk9IDB4MDEsIC8qIFVua25vd24gSENJIENvbW1hbmQgKi8KLQlIQ0lfU1RBVFVTX1VOS05PV19DT05ORUNUX0lECQk9IDBYMDIsIC8qIFVua25vd24gQ29ubmVjdGlvbiBJZGVudGlmaWVyICovCi0JSENJX1NUQVRVU19IV19GQUlMCQkJPSAwWDAzLCAvKiBIYXJkd2FyZSBGYWlsdXJlICovCi0JSENJX1NUQVRVU19QQUdFX1RJTUVPVVQJCQk9IDBYMDQsIC8qIFBhZ2UgVGltZW91dCAqLwotCUhDSV9TVEFUVVNfQVVUSF9GQUlMCQkJPSAwWDA1LCAvKiBBdXRoZW50aWNhdGlvbiBGYWlsdXJlICovCi0JSENJX1NUQVRVU19QSU5fT1JfS0VZX01JU1NJTkcJCT0gMFgwNiwgLyogUElOIG9yIEtleSBNaXNzaW5nICovCi0JSENJX1NUQVRVU19NRU1fQ0FQX0VYQ0VFRAkJPSAwWDA3LCAvKiBNZW1vcnkgQ2FwYWNpdHkgRXhjZWVkZWQgKi8KLQlIQ0lfU1RBVFVTX0NPTk5FQ1RfVElNRU9VVAkJPSAwWDA4LCAvKiBDb25uZWN0aW9uIFRpbWVvdXQgKi8KLQlIQ0lfU1RBVFVTX0NPTk5FQ1RfTElNSVQJCT0gMFgwOSwgLyogQ29ubmVjdGlvbiBMaW1pdCBFeGNlZWRlZCAqLwotCUhDSV9TVEFUVVNfU1lOX0NPTk5FQ1RfTElNSVQJCT0gMFgwYSwgLyogU3luY2hyb25vdXMgQ29ubmVjdGlvbiBMaW1pdCBUbyBBIERldmljZSBFeGNlZWRlZCAqLwotCUhDSV9TVEFUVVNfQUNMX0NPTk5FQ1RfRVhJU1RTCQk9IDBYMGIsIC8qIEFDTCBDb25uZWN0aW9uIEFscmVhZHkgRXhpc3RzICovCi0JSENJX1NUQVRVU19DTURfRElTQUxMT1cJCQk9IDBYMGMsIC8qIENvbW1hbmQgRGlzYWxsb3dlZCAqLwotCUhDSV9TVEFUVVNfQ09OTkVDVF9SSlRfTElNSVRfUkVTT1VSQ0UJPSAwWDBkLCAvKiBDb25uZWN0aW9uIFJlamVjdGVkIGR1ZSB0byBMaW1pdGVkIFJlc291cmNlcyAqLwotCUhDSV9TVEFUVVNfQ09OTkVDVF9SSlRfU0VDX1JFQVNPTgk9IDBYMGUsIC8qIENvbm5lY3Rpb24gUmVqZWN0ZWQgRHVlIFRvIFNlY3VyaXR5IFJlYXNvbnMgKi8KLQlIQ0lfU1RBVFVTX0NPTk5FQ1RfUkpUX1VOQUNDRVBUX0JEX0FERFIJPSAwWDBmLCAvKiBDb25uZWN0aW9uIFJlamVjdGVkIGR1ZSB0byBVbmFjY2VwdGFibGUgQkRfQUREUiAqLwotCUhDSV9TVEFUVVNfQ09OTkVDVF9BQ0NFUFRfVElNRU9VVAk9IDBYMTAsIC8qIENvbm5lY3Rpb24gQWNjZXB0IFRpbWVvdXQgRXhjZWVkZWQgKi8KLQlIQ0lfU1RBVFVTX1VOU1VQUE9SVF9GRUFUVVJFX1BBUkFfVkFMVUUJPSAwWDExLCAvKiBVbnN1cHBvcnRlZCBGZWF0dXJlIG9yIFBhcmFtZXRlciBWYWx1ZSAqLwotCUhDSV9TVEFUVVNfSU5WQUxJRF9IQ0lfQ01EX1BBUkFfVkFMVUUJPSAwWDEyLCAvKiBJbnZhbGlkIEhDSSBDb21tYW5kIFBhcmFtZXRlcnMgKi8KLQlIQ0lfU1RBVFVTX1JFTU9URV9VU0VSX1RFUk1JTkFURV9DT05ORUNUID0gMFgxMywgLyogUmVtb3RlIFVzZXIgVGVybWluYXRlZCBDb25uZWN0aW9uICovCi0JSENJX1NUQVRVU19SRU1PVEVfREVWX1RFUk1JTkFURV9MT1dfUkVTT1VSQ0UgPSAwWDE0LCAvKiBSZW1vdGUgRGV2aWNlIFRlcm1pbmF0ZWQgQ29ubmVjdGlvbiBkdWUgdG8gTG93IFJlc291cmNlcyAqLwotCUhDSV9TVEFUVVNfUkVNT1RFX0RFVl9URVJNSU5BVEVfQ09OTkVDVF9QT1dFUl9PRkYgPSAwWDE1LCAvKiBSZW1vdGUgRGV2aWNlIFRlcm1pbmF0ZWQgQ29ubmVjdGlvbiBkdWUgdG8gUG93ZXIgT2ZmICovCi0JSENJX1NUQVRVU19DT05ORUNUX1RFUk1JTkFURV9MT0NBTF9IT1NUCT0gMFgxNiwgLyogQ29ubmVjdGlvbiBUZXJtaW5hdGVkIEJ5IExvY2FsIEhvc3QgKi8KLQlIQ0lfU1RBVFVTX1JFUEVBVEVfQVRURU1QVAkJPSAwWDE3LCAvKiBSZXBlYXRlZCBBdHRlbXB0cyAqLwotCUhDSV9TVEFUVVNfUEFJUl9OT1RfQUxMT1cJCT0gMFgxOCwgLyogUGFpcmluZyBOb3QgQWxsb3dlZCAqLwotCUhDSV9TVEFUVVNfVU5LTk9XX0xNUF9QRFUJCT0gMFgxOSwgLyogVW5rbm93biBMTVAgUERVICovCi0JSENJX1NUQVRVU19VTlNVUFBPUlRfUkVNT1RFX0xNUF9GRUFUVVJFCT0gMFgxYSwgLyogVW5zdXBwb3J0ZWQgUmVtb3RlIEZlYXR1cmUgLyBVbnN1cHBvcnRlZCBMTVAgRmVhdHVyZSAqLwotCUhDSV9TVEFUVVNfU09DX09GRlNFVF9SRUpFQ1QJCT0gMFgxYiwgLyogU0NPIE9mZnNldCBSZWplY3RlZCAqLwotCUhDSV9TVEFUVVNfU09DX0lOVEVSVkFMX1JFSkVDVAkJPSAwWDFjLCAvKiBTQ08gSW50ZXJ2YWwgUmVqZWN0ZWQgKi8KLQlIQ0lfU1RBVFVTX1NPQ19BSVJfTU9ERV9SRUpFQ1QJCT0gMFgxZCwvKiBTQ08gQWlyIE1vZGUgUmVqZWN0ZWQgKi8KLQlIQ0lfU1RBVFVTX0lOVkFMSURfTE1QX1BBUkEJCT0gMFgxZSwgLyogSW52YWxpZCBMTVAgUGFyYW1ldGVycyAqLwotCUhDSV9TVEFUVVNfVU5TUEVDSUZJQ19FUlJPUgkJPSAwWDFmLCAvKiBVbnNwZWNpZmllZCBFcnJvciAqLwotCUhDSV9TVEFUVVNfVU5TVVBQT1JUX0xNUF9QQVJBX1ZBTFVFCT0gMFgyMCwgLyogVW5zdXBwb3J0ZWQgTE1QIFBhcmFtZXRlciBWYWx1ZSAqLwotCUhDSV9TVEFUVVNfUk9MRV9DSEFOR0VfTk9UX0FMTE9XCT0gMFgyMSwgLyogUm9sZSBDaGFuZ2UgTm90IEFsbG93ZWQgKi8KLQlIQ0lfU1RBVFVTX0xNUF9SRVNQT05TRV9USU1FT1VUCQk9IDBYMjIsIC8qIExNUCBSZXNwb25zZSBUaW1lb3V0ICovCi0JSENJX1NUQVRVU19MTVBfRVJST1JfVFJBTlNBQ1RJT05fQ09MTElTSU9OID0gMFgyMywgLyogTE1QIEVycm9yIFRyYW5zYWN0aW9uIENvbGxpc2lvbiAqLwotCUhDSV9TVEFUVVNfTE1QX1BEVV9OT1RfQUxMT1cJCT0gMFgyNCwgLyogTE1QIFBEVSBOb3QgQWxsb3dlZCAqLwotCUhDSV9TVEFUVVNfRU5DUllQVElPTl9NT0RFX05PVF9BTExPVwk9IDBYMjUsIC8qIEVuY3J5cHRpb24gTW9kZSBOb3QgQWNjZXB0YWJsZSAqLwotCUhDSV9TVEFUVVNfTElOS19LRVlfQ0FOX05PVF9DSEFOR0UJPSAwWDI2LCAvKiBMaW5rIEtleSBDYW4gTm90IGJlIENoYW5nZWQgKi8KLQlIQ0lfU1RBVFVTX1JFUVVFU1RfUU9TX05PVF9TVVBQT1JUCT0gMFgyNywgLyogUmVxdWVzdGVkIFFvUyBOb3QgU3VwcG9ydGVkICovCi0JSENJX1NUQVRVU19JTlNUQU5UX1BBU1NFRAkJPSAwWDI4LCAvKiBJbnN0YW50IFBhc3NlZCAqLwotCUhDSV9TVEFUVVNfUEFJUklOR19VTklUX0tFWV9OT1RfU1VQUE9SVCA9IDBYMjksIC8qIFBhaXJpbmcgV2l0aCBVbml0IEtleSBOb3QgU3VwcG9ydGVkICovCi0JSENJX1NUQVRVU19ESUZGRVJFTlRfVFJBTlNBQ1RJT05fQ09MTElTSU9OID0gMFgyYSwgLyogRGlmZmVyZW50IFRyYW5zYWN0aW9uIENvbGxpc2lvbiAqLwotCUhDSV9TVEFUVVNfUkVTRVJWRV8xCQkJPSAwWDJiLCAvKiBSZXNlcnZlZCAqLwotCUhDSV9TVEFUVVNfUU9TX1VOQUNDRVBUX1BBUkEJCT0gMFgyYywgLyogUW9TIFVuYWNjZXB0YWJsZSBQYXJhbWV0ZXIgKi8KLQlIQ0lfU1RBVFVTX1FPU19SRUpFQ1QJCQk9IDBYMmQsIC8qIFFvUyBSZWplY3RlZCAqLwotCUhDSV9TVEFUVVNfQ0hOTF9DTEFTU0lGSUNBVElPTl9OT1RfU1VQUE9SVCA9IDBYMmUsIC8qIENoYW5uZWwgQ2xhc3NpZmljYXRpb24gTm90IFN1cHBvcnRlZCAqLwotCUhDSV9TVEFUVVNfSU5TVUZGSUNJRU5UX1NFQ1VSSVRZCT0gMFgyZiwgLyogSW5zdWZmaWNpZW50IFNlY3VyaXR5ICovCi0JSENJX1NUQVRVU19QQVJBX09VVF9PRl9SQU5HRQkJPSAweDMwLCAvKiBQYXJhbWV0ZXIgT3V0IE9mIE1hbmRhdG9yeSBSYW5nZSAqLwotCUhDSV9TVEFUVVNfUkVTRVJWRV8yCQkJPSAwWDMxLCAvKiBSZXNlcnZlZCAqLwotCUhDSV9TVEFUVVNfUk9MRV9TV0lUQ0hfUEVORElORwkJPSAwWDMyLCAvKiBSb2xlIFN3aXRjaCBQZW5kaW5nICovCi0JSENJX1NUQVRVU19SRVNFUlZFXzMJCQk9IDBYMzMsIC8qIFJlc2VydmVkICovCi0JSENJX1NUQVRVU19SRVNFUlZFX1NPTFRfVklPTEFUSU9OCT0gMFgzNCwgLyogUmVzZXJ2ZWQgU2xvdCBWaW9sYXRpb24gKi8KLQlIQ0lfU1RBVFVTX1JPTEVfU1dJVENIX0ZBSUwJCT0gMFgzNSwgLyogUm9sZSBTd2l0Y2ggRmFpbGVkICovCi0JSENJX1NUQVRVU19FWFRFTkRfSU5RVUlSWV9SU1BfVE9PX0xBUkdFCT0gMFgzNiwgLyogRXh0ZW5kZWQgSW5xdWlyeSBSZXNwb25zZSBUb28gTGFyZ2UgKi8KLQlIQ0lfU1RBVFVTX1NFQ19TSU1QTEVfUEFJUklOR19OT1RfU1VQUE9SVCA9IDBYMzcsIC8qIFNlY3VyZSBTaW1wbGUgUGFpcmluZyBOb3QgU3VwcG9ydGVkIEJ5IEhvc3QuICovCi0JSENJX1NUQVRVU19IT1NUX0JVU1lfUEFJUklORwkJPSAwWDM4LCAvKiBIb3N0IEJ1c3kgLSBQYWlyaW5nICovCi0JSENJX1NUQVRVU19DT05ORUNUX1JFSl9OT1RfU1VJVF9DSE5MX0ZPVU5EID0gMFgzOSwgLyogQ29ubmVjdGlvbiBSZWplY3RlZCBkdWUgdG8gTm8gU3VpdGFibGUgQ2hhbm5lbCBGb3VuZCAqLwotCUhDSV9TVEFUVVNfQ09OVFJPTExFUl9CVVNZCQk9IDBYM2EgIC8qIENPTlRST0xMRVIgQlVTWSAqLwotfTsKLQotLyogICovCi0vKiAgVGhlIGZvbGxvd2luZyBpcyBmb3IgQlQgMy4wICsgSFMgSENJIENPTU1BTkQgKi8KLS8qICAqLwotCi0vKiBiaXQgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNSAqLwotLyoJIHwJT0NGCQkJICAgICAgICAgICAgIHwJICAgT0dGICAgICAgIHwgKi8KLS8qICAqLwotCi0vKiBPR0YgMHgwMSAqLwotI2RlZmluZSBMSU5LX0NPTlRST0xfQ09NTUFORFMJCQkweDAxCi1lbnVtIGxpbmtfY29udHJvbF9jb21tYW5kcyB7Ci0JSENJX0lOUVVJUlkJCQkJCT0gMHgwMDAxLAotCUhDSV9JTlFVSVJZX0NBTkNFTAkJCQk9IDB4MDAwMiwKLQlIQ0lfUEVSSU9ESUNfSU5RVUlSWV9NT0RFCQkJPSAweDAwMDMsCi0JSENJX0VYSVRfUEVSSU9ESUNfSU5RVUlSWV9NT0RFCQkJPSAweDAwMDQsCi0JSENJX0NSRUFURV9DT05ORUNUSU9OCQkJCT0gMHgwMDA1LAotCUhDSV9ESVNDT05ORUNUCQkJCQk9IDB4MDAwNiwKLQlIQ0lfQ1JFQVRFX0NPTk5FQ1RJT05fQ0FOQ0VMCQkJPSAweDAwMDgsCi0JSENJX0FDQ0VQVF9DT05ORUNUSU9OUkVRVUVTVAkJCT0gMHgwMDA5LAotCUhDSV9SRUpFQ1RfQ09OTkVDVElPTl9SRVFVRVNUCQkJPSAweDAwMGEsCi0JSENJX0xJTktfS0VZX1JFUVVFU1RfUkVQTFkJCQk9IDB4MDAwYiwKLQlIQ0lfTElOS19LRVlfUkVRVUVTVF9ORUdBVElWRV9SRVBMWQkJPSAweDAwMGMsCi0JSENJX1BJTl9DT0RFX1JFUVVFU1RfUkVQTFkJCQk9IDB4MDAwZCwKLQlIQ0lfUElOX0NPREVfUkVRVUVTVF9ORUdBVElWRV9SRVBMWQkJPSAweDAwMGUsCi0JSENJX0NIQU5HRV9DT05ORUNUSU9OX1BBQ0tFVF9UWVBFCQk9IDB4MDAwZiwKLQlIQ0lfQVVUSEVOVElDQVRJT05fUkVRVUVTVEVECQkJPSAweDAwMTEsCi0JSENJX1NFVF9DT05ORUNUSU9OX0VOQ1JZUFRJT04JCQk9IDB4MDAxMywKLQlIQ0lfQ0hBTkdFX0NPTk5FQ1RJT05fTElOS19LRVkJCQk9IDB4MDAxNSwKLQlIQ0lfTUFTVEVSX0xJTktfS0VZCQkJCT0gMHgwMDE3LAotCUhDSV9SRU1PVEVfTkFNRV9SRVFVRVNUCQkJCT0gMHgwMDE5LAotCUhDSV9SRU1PVEVfTkFNRV9SRVFVRVNUX0NBTkNFTAkJCT0gMHgwMDFhLAotCUhDSV9SRUFEX1JFTU9URV9TVVBQT1JURURfRkVBVFVSRVMJCT0gMHgwMDFiLAotCUhDSV9SRUFEX1JFTU9URV9FWFRFTkRFRF9GRUFUVVJFUwkJPSAweDAwMWMsCi0JSENJX1JFQURfUkVNT1RFX1ZFUlNJT05fSU5GT1JNQVRJT04JCT0gMHgwMDFkLAotCUhDSV9SRUFEX0NMT0NLX09GRlNFVAkJCQk9IDB4MDAxZiwKLQlIQ0lfUkVBRF9MTVBfSEFORExFCQkJCT0gMHgwMDIwLAotCUhDSV9TRVRVUF9TWU5DSFJPTk9VU19DT05ORUNUSU9OCQk9IDB4MDAyOCwKLQlIQ0lfQUNDRVBUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT05fUkVRVUVTVAk9IDB4MDAyOSwKLQlIQ0lfUkVKRUNUX1NZTkNIUk9OT1VTX0NPTk5FQ1RJT05fUkVRVUVTVAk9IDB4MDAyYSwKLQlIQ0lfSU9fQ0FQQUJJTElUWV9SRVFVRVNUX1JFUExZCQkJPSAweDAwMmIsCi0JSENJX1VTRVJfQ09ORklSTUFUSU9OX1JFUVVFU1RfUkVQTFkJCT0gMHgwMDJjLAotCUhDSV9VU0VSX0NPTkZJUk1BVElPTl9SRVFVRVNUX05FR0FUSVZFX1JFUExZCT0gMHgwMDJkLAotCUhDSV9VU0VSX1BBU1NLRVlfUkVRVUVTVF9SRVBMWQkJCT0gMHgwMDJlLAotCUhDSV9VU0VSX1BBU1NLRVlfUkVRVUVTVE5FR0FUSVZFX1JFUExZCQk9IDB4MDAyZiwKLQlIQ0lfUkVNT1RFX09PQl9EQVRBX1JFUVVFU1RfUkVQTFkJCT0gMHgwMDMwLAotCUhDSV9SRU1PVEVfT09CX0RBVEFfUkVRVUVTVF9ORUdBVElWRV9SRVBMWQk9IDB4MDAzMywKLQlIQ0lfSU9fQ0FQQUJJTElUWV9SRVFVRVNUX05FR0FUSVZFX1JFUExZCT0gMHgwMDM0LAotCUhDSV9DUkVBVEVfUEhZU0lDQUxfTElOSwkJCT0gMHgwMDM1LAotCUhDSV9BQ0NFUFRfUEhZU0lDQUxfTElOSwkJCT0gMHgwMDM2LAotCUhDSV9ESVNDT05ORUNUX1BIWVNJQ0FMX0xJTksJCQk9IDB4MDAzNywKLQlIQ0lfQ1JFQVRFX0xPR0lDQUxfTElOSwkJCQk9IDB4MDAzOCwKLQlIQ0lfQUNDRVBUX0xPR0lDQUxfTElOSwkJCQk9IDB4MDAzOSwKLQlIQ0lfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTksJCQk9IDB4MDAzYSwKLQlIQ0lfTE9HSUNBTF9MSU5LX0NBTkNFTAkJCQk9IDB4MDAzYiwKLQlIQ0lfRkxPV19TUEVDX01PRElGWQkJCQk9IDB4MDAzYwotfTsKLQotLyogT0dGIDB4MDIgKi8KLSNkZWZpbmUgSE9MRF9NT0RFX0NPTU1BTkQJCQkJMHgwMgotZW51bSBob2xkX21vZGVfY29tbWFuZCB7Ci0JSENJX0hPTERfTU9ERQkJCQkJPSAweDAwMDEsCi0JSENJX1NOSUZGX01PREUJCQkJCT0gMHgwMDAyLAotCUhDSV9FWElUX1NOSUZGX01PREUJCQkJPSAweDAwMDMsCi0JSENJX1BBUktfU1RBVEUJCQkJCT0gMHgwMDA1LAotCUhDSV9FWElUX1BBUktfU1RBVEUJCQkJPSAweDAwMDYsCi0JSENJX1FPU19TRVRVUAkJCQkJPSAweDAwMDcsCi0JSENJX1JPTEVfRElTQ09WRVJZCQkJCT0gMHgwMDA5LAotCUhDSV9TV0lUQ0hfUk9MRQkJCQkJPSAweDAwMGIsCi0JSENJX1JFQURfTElOS19QT0xJQ1lfU0VUVElOR1MJCQk9IDB4MDAwYywKLQlIQ0lfV1JJVEVfTElOS19QT0xJQ1lfU0VUVElOR1MJCQk9IDB4MDAwZCwKLQlIQ0lfUkVBRF9ERUZBVUxUX0xJTktfUE9MSUNZX1NFVFRJTkdTCQk9IDB4MDAwZSwKLQlIQ0lfV1JJVEVfREVGQVVMVF9MSU5LX1BPTElDWV9TRVRUSU5HUwkJPSAweDAwMGYsCi0JSENJX0ZMT1dfU1BFQ0lGSUNBVElPTgkJCQk9IDB4MDAxMCwKLQlIQ0lfU05JRkZfU1VCUkFUSU5HCQkJCT0gMHgwMDExCi19OwotCi0vKiBPR0YgMHgwMyAqLwotI2RlZmluZSBPR0ZfU0VUX0VWRU5UX01BU0tfQ09NTUFORAkJCTB4MDMKLWVudW0gc2V0X2V2ZW50X21hc2tfY29tbWFuZCB7Ci0JSENJX1NFVF9FVkVOVF9NQVNLCQkJCT0gMHgwMDAxLAotCUhDSV9SRVNFVAkJCQkJPSAweDAwMDMsCi0JSENJX1NFVF9FVkVOVF9GSUxURVIJCQkJPSAweDAwMDUsCi0JSENJX0ZMVVNICQkJCQk9IDB4MDAwOCwKLQlIQ0lfUkVBRF9QSU5fVFlQRQkJCQk9IDB4MDAwOSwKLQlIQ0lfV1JJVEVfUElOX1RZUEUJCQkJPSAweDAwMGEsCi0JSENJX0NSRUFURV9ORVdfVU5JVF9LRVkJCQkJPSAweDAwMGIsCi0JSENJX1JFQURfU1RPUkVEX0xJTktfS0VZCQkJPSAweDAwMGQsCi0JSENJX1dSSVRFX1NUT1JFRF9MSU5LX0tFWQkJCT0gMHgwMDExLAotCUhDSV9ERUxFVEVfU1RPUkVEX0xJTktfS0VZCQkJPSAweDAwMTIsCi0JSENJX1dSSVRFX0xPQ0FMX05BTUUJCQkJPSAweDAwMTMsCi0JSENJX1JFQURfTE9DQUxfTkFNRQkJCQk9IDB4MDAxNCwKLQlIQ0lfUkVBRF9DT05ORUNUSU9OX0FDQ0VQVF9USU1FT1VUCQk9IDB4MDAxNSwKLQlIQ0lfV1JJVEVfQ09OTkVDVElPTl9BQ0NFUFRfVElNRU9VVAkJPSAweDAwMTYsCi0JSENJX1JFQURfUEFHRV9USU1FT1VUCQkJCT0gMHgwMDE3LAotCUhDSV9XUklURV9QQUdFX1RJTUVPVVQJCQkJPSAweDAwMTgsCi0JSENJX1JFQURfU0NBTl9FTkFCTEUJCQkJPSAweDAwMTksCi0JSENJX1dSSVRFX1NDQU5fRU5BQkxFCQkJCT0gMHgwMDFhLAotCUhDSV9SRUFEX1BBR0VfU0NBTl9BQ1RJVklUWQkJCT0gMHgwMDFiLAotCUhDSV9XUklURV9QQUdFX1NDQU5fQUNUSVZJVFkJCQk9IDB4MDAxYywKLQlIQ0lfUkVBRF9JTlFVSVJZX1NDQU5fQUNUSVZJVFkJCQk9IDB4MDAxZCwKLQlIQ0lfV1JJVEVfSU5RVUlSWV9TQ0FOX0FDVElWSVRZCQkJPSAweDAwMWUsCi0JSENJX1JFQURfQVVUSEVOVElDQVRJT05fRU5BQkxFCQkJPSAweDAwMWYsCi0JSENJX1dSSVRFX0FVVEhFTlRJQ0FUSU9OX0VOQUJMRQkJCT0gMHgwMDIwLAotCUhDSV9SRUFEX0NMQVNTX09GX0RFVklDRQkJCT0gMHgwMDIzLAotCUhDSV9XUklURV9DTEFTU19PRl9ERVZJQ0UJCQk9IDB4MDAyNCwKLQlIQ0lfUkVBRF9WT0lDRV9TRVRUSU5HCQkJCT0gMHgwMDI1LAotCUhDSV9XUklURV9WT0lDRV9TRVRUSU5HCQkJCT0gMHgwMDI2LAotCUhDSV9SRUFEX0FVVE9NQVRJQ19GTFVTSF9USU1FT1VUCQk9IDB4MDAyNywKLQlIQ0lfV1JJVEVfQVVUT01BVElDX0ZMVVNIX1RJTUVPVVQJCT0gMHgwMDI4LAotCUhDSV9SRUFEX05VTV9CUk9BRENBU1RfUkVUUkFOU01JU1NJT05TCQk9IDB4MDAyOSwKLQlIQ0lfV1JJVEVfTlVNX0JST0FEQ0FTVF9SRVRSQU5TTUlTU0lPTlMJCT0gMHgwMDJhLAotCUhDSV9SRUFEX0hPTERfTU9ERV9BQ1RJVklUWQkJCT0gMHgwMDJiLAotCUhDSV9XUklURV9IT0xEX01PREVfQUNUSVZJVFkJCQk9IDB4MDAyYywKLQlIQ0lfUkVBRF9TWU5DSFJPTk9VU19GTE9XX0NPTlRST0xfRU5BQkxFCT0gMHgwMDJlLAotCUhDSV9XUklURV9TWU5DSFJPTk9VU19GTE9XX0NPTlRST0xfRU5BQkxFCT0gMHgwMDJmLAotCUhDSV9TRVRfQ09OVFJPTExFUl9UT19IT1NUX0ZMT1dfQ09OVFJPTAkJPSAweDAwMzEsCi0JSENJX0hPU1RfQlVGRkVSX1NJWkUJCQkJPSAweDAwMzMsCi0JSENJX0hPU1RfTlVNQkVSX09GX0NPTVBMRVRFRF9QQUNLRVRTCQk9IDB4MDAzNSwKLQlIQ0lfUkVBRF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQJCT0gMHgwMDM2LAotCUhDSV9XUklURV9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVQJCT0gMHgwMDM3LAotCUhDSV9SRUFEX05VTUJFUl9PRl9TVVBQT1JURURfSUFDCQk9IDB4MDAzOCwKLQlIQ0lfUkVBRF9DVVJSRU5UX0lBQ19MQVAJCQk9IDB4MDAzOSwKLQlIQ0lfV1JJVEVfQ1VSUkVOVF9JQUNfTEFQCQkJPSAweDAwM2EsCi0JSENJX1JFQURfUEFHRV9TQ0FOX01PREUJCQkJPSAweDAwM2QsCi0JSENJX1dSSVRFX1BBR0VfU0NBTl9NT0RFCQkJPSAweDAwM2UsCi0JSENJX1NFVF9BRkhfSE9TVF9DSEFOTkVMX0NMQVNTSUZJQ0FUSU9OCQk9IDB4MDAzZiwKLQlIQ0lfUkVBRF9JTlFVSVJZX1NDQU5fVFlQRQkJCT0gMHgwMDQyLAotCUhDSV9XUklURV9JTlFVSVJZX1NDQU5fVFlQRQkJCT0gMHgwMDQzLAotCUhDSV9SRUFEX0lOUVVJUllfTU9ERQkJCQk9IDB4MDA0NCwKLQlIQ0lfV1JJVEVfSU5RVUlSWV9NT0RFCQkJCT0gMHgwMDQ1LAotCUhDSV9SRUFEX1BBR0VfU0NBTl9UWVBFCQkJCT0gMHgwMDQ2LAotCUhDSV9XUklURV9QQUdFX1NDQU5fVFlQRQkJCT0gMHgwMDQ3LAotCUhDSV9SRUFEX0FGSF9DSEFOTkVMX0FTU0VTU01FTlRfTU9ERQkJPSAweDAwNDgsCi0JSENJX1dSSVRFX0FGSF9DSEFOTkVMX0FTU0VTU01FTlRfTU9ERQkJPSAweDAwNDksCi0JSENJX1JFQURfRVhURU5ERURfSU5RVUlSWV9SRVNQT05TRQkJPSAweDAwNTEsCi0JSENJX1dSSVRFX0VYVEVOREVEX0lOUVVJUllfUkVTUE9OU0UJCT0gMHgwMDUyLAotCUhDSV9SRUZSRVNIX0VOQ1JZUFRJT05fS0VZCQkJPSAweDAwNTMsCi0JSENJX1JFQURfU0lNUExFX1BBSVJJTkdfTU9ERQkJCT0gMHgwMDU1LAotCUhDSV9XUklURV9TSU1QTEVfUEFJUklOR19NT0RFCQkJPSAweDAwNTYsCi0JSENJX1JFQURfTE9DQUxfT09CX0RBVEEJCQkJPSAweDAwNTcsCi0JSENJX1JFQURfSU5RVUlSWV9SRVNQT05TRV9UUkFOU01JVF9QT1dFUl9MRVZFTAk9IDB4MDA1OCwKLQlIQ0lfV1JJVEVfSU5RVUlSWV9UUkFOU01JVF9QT1dFUl9MRVZFTAkJPSAweDAwNTksCi0JSENJX1JFQURfREVGQVVMVF9FUlJPTkVPVVNfREFUQV9SRVBPUlRJTkcJPSAweDAwNWEsCi0JSENJX1dSSVRFX0RFRkFVTFRfRVJST05FT1VTX0RBVEFfUkVQT1JUSU5HCT0gMHgwMDViLAotCUhDSV9FTkhBTkNFRF9GTFVTSAkJCQk9IDB4MDA1ZiwKLQlIQ0lfU0VORF9LRVlQUkVTU19OT1RJRklDQVRJT04JCQk9IDB4MDA2MCwKLQlIQ0lfUkVBRF9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVQJCT0gMHgwMDYxLAotCUhDSV9XUklURV9MT0dJQ0FMX0xJTktfQUNDRVBUX1RJTUVPVVQJCT0gMHgwMDYyLAotCUhDSV9TRVRfRVZFTlRfTUFTS19QQUdFXzIJCQk9IDB4MDA2MywKLQlIQ0lfUkVBRF9MT0NBVElPTl9EQVRBCQkJCT0gMHgwMDY0LAotCUhDSV9XUklURV9MT0NBVElPTl9EQVRBCQkJCT0gMHgwMDY1LAotCUhDSV9SRUFEX0ZMT1dfQ09OVFJPTF9NT0RFCQkJPSAweDAwNjYsCi0JSENJX1dSSVRFX0ZMT1dfQ09OVFJPTF9NT0RFCQkJPSAweDAwNjcsCi0JSENJX1JFQURfRU5IQU5DRV9UUkFOU01JVF9QT1dFUl9MRVZFTAkJPSAweDAwNjgsCi0JSENJX1JFQURfQkVTVF9FRkZPUlRfRkxVU0hfVElNRU9VVAkJPSAweDAwNjksCi0JSENJX1dSSVRFX0JFU1RfRUZGT1JUX0ZMVVNIX1RJTUVPVVQJCT0gMHgwMDZhLAotCUhDSV9TSE9SVF9SQU5HRV9NT0RFCQkJCT0gMHgwMDZiCi19OwotCi0vKiBPR0YgMHgwNCAqLwotI2RlZmluZSBPR0ZfSU5GT1JNQVRJT05BTF9QQVJBTUVURVJTCQkJMHgwNAotZW51bSBpbmZvcm1hdGlvbmFsX3BhcmFtcyB7Ci0JSENJX1JFQURfTE9DQUxfVkVSU0lPTl9JTkZPUk1BVElPTgkJPSAweDAwMDEsCi0JSENJX1JFQURfTE9DQUxfU1VQUE9SVEVEX0NPTU1BTkRTCQk9IDB4MDAwMiwKLQlIQ0lfUkVBRF9MT0NBTF9TVVBQT1JURURfRkVBVFVSRVMJCT0gMHgwMDAzLAotCUhDSV9SRUFEX0xPQ0FMX0VYVEVOREVEX0ZFQVRVUkVTCQk9IDB4MDAwNCwKLQlIQ0lfUkVBRF9CVUZGRVJfU0laRQkJCQk9IDB4MDAwNSwKLQlIQ0lfUkVBRF9CRF9BRERSCQkJCT0gMHgwMDA5LAotCUhDSV9SRUFEX0RBVEFfQkxPQ0tfU0laRQkJCT0gMHgwMDBhCi19OwotCi0vKiBPR0YgMHgwNSAqLwotI2RlZmluZSBPR0ZfU1RBVFVTX1BBUkFNRVRFUlMJCQkJMHgwNQotZW51bSBzdGF0dXNfcGFyYW1zIHsKLQlIQ0lfUkVBRF9GQUlMRURfQ09OVEFDVF9DT1VOVEVSCQkJPSAweDAwMDEsCi0JSENJX1JFU0VUX0ZBSUxFRF9DT05UQUNUX0NPVU5URVIJCT0gMHgwMDAyLAotCUhDSV9SRUFEX0xJTktfUVVBTElUWQkJCQk9IDB4MDAwMywKLQlIQ0lfUkVBRF9SU1NJCQkJCQk9IDB4MDAwNSwKLQlIQ0lfUkVBRF9BRkhfQ0hBTk5FTF9NQVAJCQk9IDB4MDAwNiwKLQlIQ0lfUkVBRF9DTE9DSwkJCQkJPSAweDAwMDcsCi0JSENJX1JFQURfRU5DUllQVElPTl9LRVlfU0laRQkJCT0gMHgwMDA4LAotCUhDSV9SRUFEX0xPQ0FMX0FNUF9JTkZPCQkJCT0gMHgwMDA5LAotCUhDSV9SRUFEX0xPQ0FMX0FNUF9BU1NPQwkJCT0gMHgwMDBhLAotCUhDSV9XUklURV9SRU1PVEVfQU1QX0FTU09DCQkJPSAweDAwMGIKLX07Ci0KLS8qIE9HRiAweDA2ICovCi0jZGVmaW5lIE9HRl9URVNUSU5HX0NPTU1BTkRTCQkJCTB4MDYKLWVudW0gdGVzdGluZ19jb21tYW5kcyB7Ci0JSENJX1JFQURfTE9PUEJBQ0tfTU9ERQkJCQk9IDB4MDAwMSwKLQlIQ0lfV1JJVEVfTE9PUEJBQ0tfTU9ERQkJCQk9IDB4MDAwMiwKLQlIQ0lfRU5BQkxFX0RFVklDRV9VTkRFUl9URVNUX01PREUJCT0gMHgwMDAzLAotCUhDSV9XUklURV9TSU1QTEVfUEFJUklOR19ERUJVR19NT0RFCQk9IDB4MDAwNCwKLQlIQ0lfRU5BQkxFX0FNUF9SRUNFSVZFUl9SRVBPUlRTCQkJPSAweDAwMDcsCi0JSENJX0FNUF9URVNUX0VORAkJCQk9IDB4MDAwOCwKLQlIQ0lfQU1QX1RFU1RfQ09NTUFORAkJCQk9IDB4MDAwOQotfTsKLQotLyogT0dGIDB4M2YgKi8KLSNkZWZpbmUgT0dGX0VYVEVOU0lPTgkJCQkJMFgzZgotZW51bSBoY2lfZXh0ZW5zaW9uX2NvbW1hbmRzIHsKLQlIQ0lfU0VUX0FDTF9MSU5LX0RBVEFfRkxPV19NT0RFCQkJPSAweDAwMTAsCi0JSENJX1NFVF9BQ0xfTElOS19TVEFUVVMJCQkJPSAweDAwMjAsCi0JSENJX1NFVF9TQ09fTElOS19TVEFUVVMJCQkJPSAweDAwMzAsCi0JSENJX1NFVF9SU1NJX1ZBTFVFCQkJCT0gMHgwMDQwLAotCUhDSV9TRVRfQ1VSUkVOVF9CTFVFVE9PVEhfU1RBVFVTCQk9IDB4MDA0MSwKLQotCS8qIFRoZSBmb2xsb3dpbmcgaXMgZm9yIFJUSzg3MjMgKi8KLQlIQ0lfRVhURU5TSU9OX1ZFUlNJT05fTk9USUZZCQkJPSAweDAxMDAsCi0JSENJX0xJTktfU1RBVFVTX05PVElGWQkJCQk9IDB4MDEwMSwKLQlIQ0lfQlRfT1BFUkFUSU9OX05PVElGWQkJCQk9IDB4MDEwMiwKLQlIQ0lfRU5BQkxFX1dJRklfU0NBTl9OT1RJRlkJCQk9IDB4MDEwMywKLQotCi0JLyogVGhlIGZvbGxvd2luZyBpcyBmb3IgSVZUICovCi0JSENJX1dJRklfQ1VSUkVOVF9DSEFOTkVMCQkJPSAweDAzMDAsCi0JSENJX1dJRklfQ1VSUkVOVF9CQU5EV0lEVEgJCQk9IDB4MDMwMSwKLQlIQ0lfV0lGSV9DT05ORUNUSU9OX1NUQVRVUwkJCT0gMHgwMzAyLAotfTsKLQotZW51bSBidF9zcGVjIHsKLQlCVF9TUEVDXzFfMF9iCQkJCQk9IDB4MDAsCi0JQlRfU1BFQ18xXzEJCQkJCT0gMHgwMSwKLQlCVF9TUEVDXzFfMgkJCQkJPSAweDAyLAotCUJUX1NQRUNfMl8wX0VEUgkJCQkJPSAweDAzLAotCUJUX1NQRUNfMl8xX0VEUgkJCQkJPSAweDA0LAotCUJUX1NQRUNfM18wX0hTCQkJCQk9IDB4MDUsCi0JQlRfU1BFQ180XzAJCQkJCT0gMHgwNgotfTsKLQotLyogIFRoZSBmb2xsb3dpbmcgaXMgZm9yIEJUIDMuMCArIEhTIEVWRU5UUyAqLwotZW51bSBoY2lfZXZlbnQgewotCUhDSV9FVkVOVF9JTlFVSVJZX0NPTVBMRVRFCQkJPSAweDAxLAotCUhDSV9FVkVOVF9JTlFVSVJZX1JFU1VMVAkJCT0gMHgwMiwKLQlIQ0lfRVZFTlRfQ09OTkVDVElPTl9DT01QTEVURQkJCT0gMHgwMywKLQlIQ0lfRVZFTlRfQ09OTkVDVElPTl9SRVFVRVNUCQkJPSAweDA0LAotCUhDSV9FVkVOVF9ESVNDT05ORUNUSU9OX0NPTVBMRVRFCQk9IDB4MDUsCi0JSENJX0VWRU5UX0FVVEhFTlRJQ0FUSU9OX0NPTVBMRVRFCQk9IDB4MDYsCi0JSENJX0VWRU5UX1JFTU9URV9OQU1FX1JFUVVFU1RfQ09NUExFVEUJCT0gMHgwNywKLQlIQ0lfRVZFTlRfRU5DUllQVElPTl9DSEFOR0UJCQk9IDB4MDgsCi0JSENJX0VWRU5UX0NIQU5HRV9MSU5LX0tFWV9DT01QTEVURQkJPSAweDA5LAotCUhDSV9FVkVOVF9NQVNURVJfTElOS19LRVlfQ09NUExFVEUJCT0gMHgwYSwKLQlIQ0lfRVZFTlRfUkVBRF9SRU1PVEVfU1VQUE9SVF9GRUFUVVJFU19DT01QTEVURQk9IDB4MGIsCi0JSENJX0VWRU5UX1JFQURfUkVNT1RFX1ZFUl9JTkZPX0NPTVBMRVRFCQk9IDB4MGMsCi0JSENJX0VWRU5UX1FPU19TRVRVUF9DT01QTEVURQkJCT0gMHgwZCwKLQlIQ0lfRVZFTlRfQ09NTUFORF9DT01QTEVURQkJCT0gMHgwZSwKLQlIQ0lfRVZFTlRfQ09NTUFORF9TVEFUVVMJCQk9IDB4MGYsCi0JSENJX0VWRU5UX0hBUkRXQVJFX0VSUk9SCQkJPSAweDEwLAotCUhDSV9FVkVOVF9GTFVTSF9PQ0NSVUVECQkJCT0gMHgxMSwKLQlIQ0lfRVZFTlRfUk9MRV9DSEFOR0UJCQkJPSAweDEyLAotCUhDSV9FVkVOVF9OVU1CRVJfT0ZfQ09NUExFVEVfUEFDS0VUUwkJPSAweDEzLAotCUhDSV9FVkVOVF9NT0RFX0NIQU5HRQkJCQk9IDB4MTQsCi0JSENJX0VWRU5UX1JFVFVSTl9MSU5LX0tFWVMJCQk9IDB4MTUsCi0JSENJX0VWRU5UX1BJTl9DT0RFX1JFUVVFU1QJCQk9IDB4MTYsCi0JSENJX0VWRU5UX0xJTktfS0VZX1JFUVVFU1QJCQk9IDB4MTcsCi0JSENJX0VWRU5UX0xJTktfS0VZX05PVElGSUNBVElPTgkJCT0gMHgxOCwKLQlIQ0lfRVZFTlRfTE9PUEJBQ0tfQ09NTUFORAkJCT0gMHgxOSwKLQlIQ0lfRVZFTlRfREFUQV9CVUZGRVJfT1ZFUkZMT1cJCQk9IDB4MWEsCi0JSENJX0VWRU5UX01BWF9TTE9UU19DSEFOR0UJCQk9IDB4MWIsCi0JSENJX0VWRU5UX1JFQURfQ0xPQ0tfT0ZGU0VUX0NPTVBMRVRFCQk9IDB4MWMsCi0JSENJX0VWRU5UX0NPTk5FQ1RfUEFDS0VUX1RZUEVfQ0hBTkdFCQk9IDB4MWQsCi0JSENJX0VWRU5UX1FPU19WSU9MQVRJT04JCQkJPSAweDFlLAotCUhDSV9FVkVOVF9QQUdFX1NDQU5fUkVQRVRJVElPTl9NT0RFX0NIQU5HRQk9IDB4MjAsCi0JSENJX0VWRU5UX0ZMT1dfU0VQQ19DT01QTEVURQkJCT0gMHgyMSwKLQlIQ0lfRVZFTlRfSU5RVUlSWV9SRVNVTFRfV0lUSF9SU1NJCQk9IDB4MjIsCi0JSENJX0VWRU5UX1JFQURfUkVNT1RFX0VYVF9GRUFUVVJFU19DT01QTEVURQk9IDB4MjMsCi0JSENJX0VWRU5UX1NZTkNfQ09OTkVDVF9DT01QTEVURQkJCT0gMHgyYywKLQlIQ0lfRVZFTlRfU1lOQ19DT05ORUNUX0NIQU5HRQkJCT0gMHgyZCwKLQlIQ0lfRVZFTlRfU05JRkZFUl9TVUJSQVRJTkcJCQk9IDB4MmUsCi0JSENJX0VWRU5UX0VYVEVOVEVEX0lOUVVJUllfUkVTVUxUCQk9IDB4MmYsCi0JSENJX0VWRU5UX0VOQ1JZUFRJT05fS0VZX1JFRkxBU0hfQ09NUExFVEUJPSAweDMwLAotCUhDSV9FVkVOVF9JT19DQVBJQklMSVRZX0NPTVBMRVRFCQk9IDB4MzEsCi0JSENJX0VWRU5UX0lPX0NBUElCSUxJVFlfUkVTUE9OU0UJCT0gMHgzMiwKLQlIQ0lfRVZFTlRfVVNFUl9DT05GSVJNVElPTl9SRVFVRVNUCQk9IDB4MzMsCi0JSENJX0VWRU5UX1VTRVJfUEFTU0tFWV9SRVFVRVNUCQkJPSAweDM0LAotCUhDSV9FVkVOVF9SRU1PVEVfT09CX0RBVEFfUkVRVUVTVAkJPSAweDM1LAotCUhDSV9FVkVOVF9TSU1QTEVfUEFJUklOR19DT01QTEVURQkJPSAweDM2LAotCUhDSV9FVkVOVF9MSU5LX1NVUEVSVklTSU9OX1RJTUVPVVRfQ0hBTkdFCT0gMHgzOCwKLQlIQ0lfRVZFTlRfRU5IQU5DRURfRkxVU0hfQ09NUExFVEUJCT0gMHgzOSwKLQlIQ0lfRVZFTlRfVVNFUl9QQVNTS0VZX05PVElGSUNBVElPTgkJPSAweDNiLAotCUhDSV9FVkVOVF9LRVlQUkVTU19OT1RJRklDQVRJT04JCQk9IDB4M2MsCi0JSENJX0VWRU5UX1JFTU9URV9IT1NUX1NVUFBPUlRfRkVBVFVSRVNfTk9USUZJQ0FUSU9OCT0gMHgzZCwKLQlIQ0lfRVZFTlRfUEhZX0xJTktfQ09NUExFVEUJCQk9IDB4NDAsCi0JSENJX0VWRU5UX0NIQU5ORUxfU0VMRUNUCQkJPSAweDQxLAotCUhDSV9FVkVOVF9ESVNDT05ORUNUX1BIWV9MSU5LX0NPTVBMRVRFCQk9IDB4NDIsCi0JSENJX0VWRU5UX1BIWV9MSU5LX0xPU1NfRUFSTFlfV0FSTklORwkJPSAweDQzLAotCUhDSV9FVkVOVF9QSFlfTElOS19SRUNPVkVSCQkJPSAweDQ0LAotCUhDSV9FVkVOVF9MT0dJQ0FMX0xJTktfQ09NUExFVEUJCQk9IDB4NDUsCi0JSENJX0VWRU5UX0RJU0NPTk5FQ1RfTE9HSUNBTF9MSU5LX0NPTVBMRVRFCT0gMHg0NiwKLQlIQ0lfRVZFTlRfRkxPV19TUEVDX01PRElGWV9DT01QTEVURQkJPSAweDQ3LAotCUhDSV9FVkVOVF9OVU1fT0ZfQ09NUExFVEVfREFUQV9CTE9DS1MJCT0gMHg0OCwKLQlIQ0lfRVZFTlRfQU1QX1NUQVJUX1RFU1QJCQk9IDB4NDksCi0JSENJX0VWRU5UX0FNUF9URVNUX0VORAkJCQk9IDB4NGEsCi0JSENJX0VWRU5UX0FNUF9SRUNFSVZFUl9SRVBPUlQJCQk9IDB4NGIsCi0JSENJX0VWRU5UX1NIT1JUX1JBTkdFX01PREVfQ0hBTkdFX0NPTVBMRVRFCT0gMHg0YywKLQlIQ0lfRVZFTlRfQU1QX1NUQVRVU19DSEFOR0UJCQk9IDB4NGQsCi0JSENJX0VWRU5UX0VYVEVOU0lPTl9SVEsJCQkJPSAweGZlLAotCUhDSV9FVkVOVF9FWFRFTlNJT05fTU9UTwkJCT0gMHhmZiwKLX07Ci0KLWVudW0gaGNpX2V4dGVuc2lvbl9ldmVudF9tb3RvIHsKLQlIQ0lfRVZFTlRfR0VUX0JUX1JTU0kJCQkJPSAweDAxLAotfTsKLQotZW51bSBoY2lfZXh0ZW5zaW9uX2V2ZW50IHsKLQlIQ0lfRVZFTlRfRVhUX1dJRklfU0NBTl9OT1RJRlkJCQk9IDB4MDEsCi19OwotCi1lbnVtIGhjaV9ldmVudF9tYXNrX3BhZ2VfMiB7Ci0JRU1QMl9IQ0lfRVZFTlRfUEhZX0xJTktfQ09NUExFVEUJCT0gMHgwMDAwMDAwMDAwMDAwMDAxLAotCUVNUDJfSENJX0VWRU5UX0NIQU5ORUxfU0VMRUNUCQkJPSAweDAwMDAwMDAwMDAwMDAwMDIsCi0JRU1QMl9IQ0lfRVZFTlRfRElTQ09OTkVDVF9QSFlfTElOS19DT01QTEVURQk9IDB4MDAwMDAwMDAwMDAwMDAwNCwKLQlFTVAyX0hDSV9FVkVOVF9QSFlfTElOS19MT1NTX0VBUkxZX1dBUk5JTkcJPSAweDAwMDAwMDAwMDAwMDAwMDgsCi0JRU1QMl9IQ0lfRVZFTlRfUEhZX0xJTktfUkVDT1ZFUgkJCT0gMHgwMDAwMDAwMDAwMDAwMDEwLAotCUVNUDJfSENJX0VWRU5UX0xPR0lDQUxfTElOS19DT01QTEVURQkJPSAweDAwMDAwMDAwMDAwMDAwMjAsCi0JRU1QMl9IQ0lfRVZFTlRfRElTQ09OTkVDVF9MT0dJQ0FMX0xJTktfQ09NUExFVEUJPSAweDAwMDAwMDAwMDAwMDAwNDAsCi0JRU1QMl9IQ0lfRVZFTlRfRkxPV19TUEVDX01PRElGWV9DT01QTEVURQk9IDB4MDAwMDAwMDAwMDAwMDA4MCwKLQlFTVAyX0hDSV9FVkVOVF9OVU1fT0ZfQ09NUExFVEVfREFUQV9CTE9DS1MJPSAweDAwMDAwMDAwMDAwMDAxMDAsCi0JRU1QMl9IQ0lfRVZFTlRfQU1QX1NUQVJUX1RFU1QJCQk9IDB4MDAwMDAwMDAwMDAwMDIwMCwKLQlFTVAyX0hDSV9FVkVOVF9BTVBfVEVTVF9FTkQJCQk9IDB4MDAwMDAwMDAwMDAwMDQwMCwKLQlFTVAyX0hDSV9FVkVOVF9BTVBfUkVDRUlWRVJfUkVQT1JUCQk9IDB4MDAwMDAwMDAwMDAwMDgwMCwKLQlFTVAyX0hDSV9FVkVOVF9TSE9SVF9SQU5HRV9NT0RFX0NIQU5HRV9DT01QTEVURQk9IDB4MDAwMDAwMDAwMDAwMTAwMCwKLQlFTVAyX0hDSV9FVkVOVF9BTVBfU1RBVFVTX0NIQU5HRQkJPSAweDAwMDAwMDAwMDAwMDIwMDAsCi19OwotCi1lbnVtIGhjaV9zdGF0ZV9tYWNoaW5lIHsKLQlIQ0lfU1RBVEVfU1RBUlRJTkcJCQk9IDB4MDEsCi0JSENJX1NUQVRFX0NPTk5FQ1RJTkcJCQk9IDB4MDIsCi0JSENJX1NUQVRFX0FVVEhFTlRJQ0FUSU5HCQk9IDB4MDQsCi0JSENJX1NUQVRFX0NPTk5FQ1RFRAkJCT0gMHgwOCwKLQlIQ0lfU1RBVEVfRElTQ09OTkVDVElORwkJCT0gMHgxMCwKLQlIQ0lfU1RBVEVfRElTQ09OTkVDVEVECQkJPSAweDIwCi19OwotCi1lbnVtIGFtcF9hc3NvY19zdHJ1Y3R1cmVfdHlwZSB7Ci0JQU1QX01BQ19BRERSCQkJCT0gMHgwMSwKLQlBTVBfUFJFRkVSUkVEX0NIQU5ORUxfTElTVAkJPSAweDAyLAotCUFNUF9DT05ORUNURURfQ0hBTk5FTAkJCT0gMHgwMywKLQlBTVBfODAyMTFfUEFMX0NBUF9MSVNUCQkJPSAweDA0LAotCUFNUF84MDIxMV9QQUxfVklTSU9OCQkJPSAweDA1LAotCUFNUF9SRVNFUlZFRF9GT1JfVEVTVElORwkJPSAweDMzCi19OwotCi1lbnVtIGFtcF9idGFwX3R5cGUgewotCUFNUF9CVEFQX05PTkUsCi0JQU1QX0JUQVBfQ1JFQVRPUiwKLQlBTVBfQlRBUF9KT0lORVIKLX07Ci0KLWVudW0gaGNpX3N0YXRlX3dpdGhfY21kIHsKLQlTVEFURV9DTURfQ1JFQVRFX1BIWV9MSU5LLAotCVNUQVRFX0NNRF9BQ0NFUFRfUEhZX0xJTkssCi0JU1RBVEVfQ01EX0RJU0NPTk5FQ1RfUEhZX0xJTkssCi0JU1RBVEVfQ01EX0NPTk5FQ1RfQUNDRVBUX1RJTUVPVVQsCi0JU1RBVEVfQ01EX01BQ19TVEFSVF9DT01QTEVURSwKLQlTVEFURV9DTURfTUFDX1NUQVJUX0ZBSUxFRCwKLQlTVEFURV9DTURfTUFDX0NPTk5FQ1RfQ09NUExFVEUsCi0JU1RBVEVfQ01EX01BQ19DT05ORUNUX0ZBSUxFRCwKLQlTVEFURV9DTURfTUFDX0RJU0NPTk5FQ1RfSU5ESUNBVEUsCi0JU1RBVEVfQ01EX01BQ19DT05ORUNUX0NBTkNFTF9JTkRJQ0FURSwKLQlTVEFURV9DTURfNFdBWV9GQUlMRUQsCi0JU1RBVEVfQ01EXzRXQVlfU1VDQ0VTU0VELAotCVNUQVRFX0NNRF9FTlRFUl9TVEFURSwKLQlTVEFURV9DTURfTk9fU1VDSF9DTUQsCi19OwotCi1lbnVtIGhjaV9zZXJ2aWNlX3R5cGUgewotCVNFUlZJQ0VfTk9fVFJBRkZJQywKLQlTRVJWSUNFX0JFU1RfRUZGT1JULAotCVNFUlZJQ0VfR1VBUkFOVEVFCi19OwotCi1lbnVtIGhjaV90cmFmZmljX21vZGUgewotCVRSQUZGSUNfTU9ERV9CRVNUX0VGRk9SVAkJCT0gMHgwMCwKLQlUUkFGRklDX01PREVfR1VBUkFOVEVFRF9MQVRFTkNZCQkJPSAweDAxLAotCVRSQUZGSUNfTU9ERV9HVUFSQU5URUVEX0JBTkRXSURUSAkJPSAweDAyLAotCVRSQUZGSUNfTU9ERV9HVUFSQU5URUVEX0xBVEVOQ1lfQU5EX0JBTkRXSURUSAk9IDB4MDMKLX07Ci0KLSNkZWZpbmUgSENJT1BDT0RFKF9PQ0YsIF9PR0YpCQkoX09HRjw8MTB8X09DRikKLSNkZWZpbmUgSENJT1BDT0RFTE9XKF9PQ0YsIF9PR0YpCSh1OCkoSENJT1BDT0RFKF9PQ0YsIF9PR0YpJjB4MDBmZikKLSNkZWZpbmUgSENJT1BDT0RFSElHSFQoX09DRiwgX09HRikJKHU4KShIQ0lPUENPREUoX09DRiwgX09HRik+PjgpCi0KLSNkZWZpbmUgVFdPQllURV9ISUdIVEJZVEUoX0RBVEEpCSh1OCkoX0RBVEE+PjgpCi0jZGVmaW5lIFRXT0JZVEVfTE9XQllURShfREFUQSkJCSh1OCkoX0RBVEEpCi0KLWVudW0gYW1wX3N0YXR1cyB7Ci0JQU1QX1NUQVRVU19BVkFfUEhZX1BXUl9EV04JCT0gMHgwLAotCUFNUF9TVEFUVVNfQlRfVVNFX09OTFkJCQk9IDB4MSwKLQlBTVBfU1RBVFVTX05PX0NBUEFDSVRZX0ZPUl9CVAkJPSAweDIsCi0JQU1QX1NUQVRVU19MT1dfQ0FQQUNJVFlfRk9SX0JUCQk9IDB4MywKLQlBTVBfU1RBVFVTX01FRElVTV9DQVBBQ0lUWV9GT1JfQlQJPSAweDQsCi0JQU1QX1NUQVRVU19ISUdIX0NBUEFDSVRZX0ZPUl9CVAkJPSAweDUsCi0JQU1QX1NUQVRVU19GVUxMX0NBUEFDSVRZX0ZPUl9CVAkJPSAweDYKLX07Ci0KLWVudW0gYnRfd3BhX21zZ190eXBlIHsKLQlUeXBlX0JUXzR3YXkxc3QJPSAwLAotCVR5cGVfQlRfNHdheTJuZAk9IDEsCi0JVHlwZV9CVF80d2F5M3JkCT0gMiwKLQlUeXBlX0JUXzR3YXk0dGgJPSAzLAotCVR5cGVfQlRfdW5rbm93CT0gNAotfTsKLQotZW51bSBidF9jb25uZWN0X3R5cGUgewotCUJUX0NPTk5FQ1RfQVVUSF9SRVEJCQk9IDB4MDAsCi0JQlRfQ09OTkVDVF9BVVRIX1JTUAkJCT0gMHgwMSwKLQlCVF9DT05ORUNUX0FTT0NfUkVRCQkJPSAweDAyLAotCUJUX0NPTk5FQ1RfQVNPQ19SU1AJCQk9IDB4MDMsCi0JQlRfRElTQ09OTkVDVAkJCQk9IDB4MDQKLX07Ci0KLWVudW0gYnRfbGxfc2VydmljZV90eXBlIHsKLQlCVF9MTF9CRSA9IDB4MDEsCi0JQlRfTExfR1UgPSAweDAyCi19OwotCi1lbnVtIGJ0X2xsX2Zsb3dzcGVjIHsKLQlCVF9UWF9CRV9GUywJCQkvKiBUWCBiZXN0IGVmZm9ydCBmbG93c3BlYyAqLwotCUJUX1JYX0JFX0ZTLAkJCS8qIFJYIGJlc3QgZWZmb3J0IGZsb3dzcGVjICovCi0JQlRfVFhfR1VfRlMsCQkJLyogVFggZ3VhcmFudGVlZCBsYXRlbmN5IGZsb3dzcGVjICovCi0JQlRfUlhfR1VfRlMsCQkJLyogUlggZ3VhcmFudGVlZCBsYXRlbmN5IGZsb3dzcGVjICovCi0JQlRfVFhfQkVfQUdHX0ZTLAkJLyogVFggYWdncmVnYXRlZCBiZXN0IGVmZm9ydCBmbG93c3BlYyAqLwotCUJUX1JYX0JFX0FHR19GUywJCS8qIFJYIGFnZ3JlZ2F0ZWQgYmVzdCBlZmZvcnQgZmxvd3NwZWMgKi8KLQlCVF9UWF9HVV9CV19GUywJCQkvKiBUWCBndWFyYW50ZWVkIGJhbmR3aWR0aCBmbG93c3BlYyAqLwotCUJUX1JYX0dVX0JXX0ZTLAkJCS8qIFJYIGd1YXJhbnRlZWQgYmFuZHdpZHRoIGZsb3dzcGVjICovCi0JQlRfVFhfR1VfTEFSR0VfRlMsCQkvKiBUWCBndWFyYW50ZWVkIGxhdGVuY3kgZmxvd3NwZWMsIGZvciB0ZXN0aW5nIG9ubHkgKi8KLQlCVF9SWF9HVV9MQVJHRV9GUywJCS8qIFJYIGd1YXJhbnRlZWQgbGF0ZW5jeSBmbG93c3BlYywgZm9yIHRlc3Rpbmcgb25seSAqLwotfTsKLQotZW51bSBidF90cmFmZmljX21vZGUgewotCUJUX01PVE9SX0VYVF9CRQkJPSAweDAwLCAvKiBCZXN0IEVmZm9ydC4gRGVmYXVsdC4gZm9yIEhDUlAsIFBBTiwgU0RQLCBSRkNPTU0tYmFzZWQgcHJvZmlsZXMgbGlrZSBGVFAsIE9QUCwgU1BQLCBEVU4sIGV0Yy4gKi8KLQlCVF9NT1RPUl9FWFRfR1VMCT0gMHgwMSwgLyogR3VhcmFudGVlZCBMYXRlbmN5LiBUaGlzIHR5cGUgb2YgdHJhZmZpYyBpcyB1c2VkIGUuZy4gZm9yIEhJRCBhbmQgQVZSQ1AuICovCi0JQlRfTU9UT1JfRVhUX0dVQgk9IDBYMDIsIC8qIEd1YXJhbnRlZWQgQmFuZHdpZHRoLiAqLwotCUJUX01PVE9SX0VYVF9HVUxCCT0gMFgwMyAgLyogR3VhcmFudGVlZCBMYXRlbmN5IGFuZCBCYW5kd2lkdGguIGZvciBBMkRQIGFuZCBWRFAuICovCi19OwotCi1lbnVtIGJ0X3RyYWZmaWNfbW9kZV9wcm9maWxlIHsKLQlCVF9QUk9GSUxFX05PTkUsCi0JQlRfUFJPRklMRV9BMkRQLAotCUJUX1BST0ZJTEVfUEFOLAotCUJUX1BST0ZJTEVfSElELAotCUJUX1BST0ZJTEVfU0NPCi19OwotCi1lbnVtIGJ0X2xpbmtfcm9sZSB7Ci0JQlRfTElOS19NQVNURVIJPSAwLAotCUJUX0xJTktfU0xBVkUJPSAxCi19OwotCi1lbnVtIGJ0X3N0YXRlX3dwYV9hdXRoIHsKLQlTVEFURV9XUEFfQVVUSF9VTklOSVRJQUxJWkVELAotCVNUQVRFX1dQQV9BVVRIX1dBSVRfUEFDS0VUXzEsIC8qICBKb2luICovCi0JU1RBVEVfV1BBX0FVVEhfV0FJVF9QQUNLRVRfMiwgLyogIENyZWF0ICovCi0JU1RBVEVfV1BBX0FVVEhfV0FJVF9QQUNLRVRfMywKLQlTVEFURV9XUEFfQVVUSF9XQUlUX1BBQ0tFVF80LAotCVNUQVRFX1dQQV9BVVRIX1NVQ0NFU1NFRAotfTsKLQotI2RlZmluZSBCVF9XUEFfQVVUSF9USU1FT1VUX1BFUklPRAkJMTAwMAotI2RlZmluZSBCVE1heFdQQUF1dGhSZVRyYW5zbWl0Q291bgkJNQotCi0jZGVmaW5lIE1BWF9BTVBfQVNTT0NfRlJBR19MRU4JCQkyNDgKLSNkZWZpbmUgVE9UQUxfQUxMT0NJQVRFX0FTU09DX0xFTgkJCTEwMDAKLQotc3RydWN0IGhjaV9mbG93X3NwZWMgewotCXU4CQkJCUlkZW50aWZpZXI7Ci0JdTgJCQkJU2VydmljZVR5cGU7Ci0JdTE2CQkJCU1heGltdW1TRFVTaXplOwotCXUzMgkJCQlTRFVJbnRlckFycml2YWxUaW1lOwotCXUzMgkJCQlBY2Nlc3NMYXRlbmN5OwotCXUzMgkJCQlGbHVzaFRpbWVvdXQ7Ci19OwotCi1zdHJ1Y3QgaGNpX2xvZ19saW5rX2NtZF9kYXRhIHsKLQl1OAkJCQlCdFBoeUxpbmtoYW5kbGU7Ci0JdTE2CQkJCUJ0TG9nTGlua2hhbmRsZTsKLQl1OAkJCQlCdFR4Rmxvd1NwZWNJRDsKLQlzdHJ1Y3QgaGNpX2Zsb3dfc3BlYwkJVHhfRmxvd19TcGVjOwotCXN0cnVjdCBoY2lfZmxvd19zcGVjCQlSeF9GbG93X1NwZWM7Ci0JdTMyCQkJCVR4UGFja2V0Q291bnQ7Ci0JdTMyCQkJCUJlc3RFZmZvcnRGbHVzaFRpbWVvdXQ7Ci0KLQl1OAkJCQliTExDb21wbGV0ZUV2ZW50SXNTZXQ7Ci0KLQl1OAkJCQliTExDYW5jZWxDTURJc1NldGFuZENvbXBsZXRlOwotfTsKLQotc3RydWN0IGhjaV9waHlfbGlua19jbWRfZGF0YSB7Ci0JLyogUGh5c2ljYWxfTGlua19IYW5kbGUgKi8KLQl1OAkJCQlCdFBoeUxpbmtoYW5kbGU7Ci0KLQl1MTYJCQkJTGlua1N1cGVydmVyc2lvblRpbWVvdXQ7Ci0KLQkvKiB1MTYJCQkJU3VwZXJUaW1lT3V0Q250OyAqLwotCi0JLyogRGVkaWNhdGVkX0FNUF9LZXlfTGVuZ3RoICovCi0JdTgJCQkJQnRBTVBLZXlMZW47Ci0JLyogRGVkaWNhdGVkX0FNUF9LZXlfVHlwZSAqLwotCXU4CQkJCUJ0QU1QS2V5VHlwZTsKLQkvKiBEZWRpY2F0ZWRfQU1QX0tleSAqLwotCXU4CQkJCUJ0QU1QS2V5W1BNS19MRU5dOwotfTsKLQotc3RydWN0IGFtcF9hc3NvY19zdHJ1Y3R1cmUgewotCS8qIFRZUEUgSUQgKi8KLQl1OAkJCQlUeXBlSUQ7Ci0JLyogTGVuZ3RoICovCi0JdTE2CQkJCUxlbmd0aDsKLQkvKiBWYWx1ZSAqLwotCXU4CQkJCURhdGFbMV07Ci19OwotCi1zdHJ1Y3QgYW1wX3ByZWZfY2hubF9yZWd1bGF0b3J5IHsKLQl1OAkJCQlyZVhJZDsKLQl1OAkJCQlyZWd1bGF0b3J5Q2xhc3M7Ci0JdTgJCQkJY292ZXJhZ2VDbGFzczsKLX07Ci0KLXN0cnVjdCBhbXBfYXNzb2NfY21kX2RhdGEgewotCS8qIFBoeXNpY2FsX0xpbmtfSGFuZGxlICovCi0JdTgJCQkJQnRQaHlMaW5raGFuZGxlOwotCS8qIExlbmd0aF9Tb19GYXIgKi8KLQl1MTYJCQkJTGVuU29GYXI7Ci0KLQl1MTYJCQkJTWF4UmVtb3RlQVNTT0NMZW47Ci0JLyogQU1QX0FTU09DX1JlbWFpbmluZ19MZW5ndGggKi8KLQl1MTYJCQkJQU1QQXNzb2NSZW1MZW47Ci0JLyogQU1QX0FTU09DX2ZyYWdtZW50ICovCi0Jdm9pZAkJCQkqQU1QQXNzb2NmcmFnbWVudDsKLX07Ci0KLXN0cnVjdCBoY2lfbGlua19pbmZvIHsKLQl1MTYJCQkJQ29ubmVjdEhhbmRsZTsKLQl1OAkJCQlJbmNvbWluZ1RyYWZmaWNNb2RlOwotCXU4CQkJCU91dGdvaW5nVHJhZmZpY01vZGU7Ci0JdTgJCQkJQlRQcm9maWxlOwotCXU4CQkJCUJUQ29yZVNwZWM7Ci0JczgJCQkJQlRfUlNTSTsKLQl1OAkJCQlUcmFmZmljUHJvZmlsZTsKLQl1OAkJCQlsaW5rUm9sZTsKLX07Ci0KLXN0cnVjdCBoY2lfZXh0X2NvbmZpZyB7Ci0Jc3RydWN0IGhjaV9saW5rX2luZm8JCWxpbmtJbmZvW01BWF9CVF9BU09DX0VOVFJZX05VTV07Ci0JdTgJCQkJYnRPcGVyYXRpb25Db2RlOwotCXUxNgkJCQlDdXJyZW50Q29ubmVjdEhhbmRsZTsKLQl1OAkJCQlDdXJyZW50SW5jb21pbmdUcmFmZmljTW9kZTsKLQl1OAkJCQlDdXJyZW50T3V0Z29pbmdUcmFmZmljTW9kZTsKLQlzOAkJCQlNSU5fQlRfUlNTSTsKLQl1OAkJCQlOdW1iZXJPZkhhbmRsZTsKLQl1OAkJCQlOdW1iZXJPZlNDTzsKLQl1OAkJCQlDdXJyZW50QlRTdGF0dXM7Ci0JdTE2CQkJCUhDSUV4dGVuc2lvblZlcjsKLQotCS8qIEJ0IGNvZXhpc3QgcmVsYXRlZCAqLwotCXU4CQkJCWJ0UHJvZmlsZUNhc2U7Ci0JdTgJCQkJYnRQcm9maWxlQWN0aW9uOwotCXU4CQkJCWJNYW51YWxDb250cm9sOwotCXU4CQkJCWJCVEJ1c3k7Ci0JdTgJCQkJYkJUQTJEUEJ1c3k7Ci0JdTgJCQkJYkVuYWJsZVdpZmlTY2FuTm90aWZ5OwotCi0JdTgJCQkJYkhvbGRGb3JCdE9wZXJhdGlvbjsKLQl1MzIJCQkJYkhvbGRQZXJpb2RDbnQ7Ci19OwotCi1zdHJ1Y3QgaGNpX2FjbF9wYWNrZXRfZGF0YSB7Ci0JdTE2CQkJCUFDTERhdGFQYWNrZXRMZW47Ci0JdTgJCQkJU3luY0RhdGFQYWNrZXRMZW47Ci0JdTE2CQkJCVRvdGFsTnVtQUNMRGF0YVBhY2tldHM7Ci0JdTE2CQkJCVRvdGFsU3luY051bURhdGFQYWNrZXRzOwotfTsKLQotc3RydWN0IGhjaV9waHlfbGlua19ic3NfaW5mbyB7Ci0JdTE2CQkJCWJkQ2FwOwkvKiAgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiAqLwotfTsKLQotc3RydWN0IHBhY2tldF9pcnBfaGNpY21kX2RhdGEgewotCXUxNgkJT0NGOjEwOwotCXUxNgkJT0dGOjY7Ci0JdTgJCUxlbmd0aDsKLQl1OAkJRGF0YVsyMF07Ci19OwotCi1zdHJ1Y3QgYnRfYXNvY19lbnRyeSB7Ci0JdTgJCQkJCQliVXNlZDsKLQl1OAkJCQkJCW1Bc3NvYzsKLQl1OAkJCQkJCWI0d2F5U3VjY2VzczsKLQl1OAkJCQkJCUJzc2lkWzZdOwotCXN0cnVjdCBoY2lfcGh5X2xpbmtfY21kX2RhdGEJCVBoeUxpbmtDbWREYXRhOwotCi0Jc3RydWN0IGhjaV9sb2dfbGlua19jbWRfZGF0YQkJTG9nTGlua0NtZERhdGFbTUFYX0xPR0lDQUxfTElOS19OVU1dOwotCi0Jc3RydWN0IGhjaV9hY2xfcGFja2V0X2RhdGEJCQlBQ0xQYWNrZXRzRGF0YTsKLQotCXN0cnVjdCBhbXBfYXNzb2NfY21kX2RhdGEJCUFtcEFzb2NDbWREYXRhOwotCXN0cnVjdCBvY3RldF9zdHJpbmcJCQkJQlRTc2lkOwotCXU4CQkJCQkJQlRTc2lkQnVmWzMzXTsKLQotCWVudW0gaGNpX3N0YXR1cwkJCQkJCVBoeUxpbmtEaXNjb25uZWN0UmVhc29uOwotCi0JdTgJCQkJCQliU2VuZFN1cGVydmlzaW9uUGFja2V0OwotCS8qIHU4CQkJCQkJQ3VycmVudFN1ZXJ2aXNpb25QYWNrZXRTZW5kTnVtOyAqLwotCS8qIHU4CQkJCQkJTGFzdFN1ZXJ2aXNpb25QYWNrZXRTZW5kTnVtOyAqLwotCXUzMgkJCQkJCU5vUnhQa3RDbnQ7Ci0JLyogSXMgQ3JlYXRvciBvciBKb2luZXIgKi8KLQllbnVtIGFtcF9idGFwX3R5cGUJCQkJQU1QUm9sZTsKLQotCS8qIEJUIGN1cnJlbnQgc3RhdGUgKi8KLQl1OAkJCQkJCUJ0Q3VycmVudFN0YXRlOwotCS8qIEJUIG5leHQgc3RhdGUgKi8KLQl1OAkJCQkJCUJ0TmV4dFN0YXRlOwotCi0JdTgJCQkJCQliTmVlZFBoeXNMaW5rQ29tcGxldGVFdmVudDsKLQotCWVudW0gaGNpX3N0YXR1cwkJCQkJUGh5c0xpbmtDb21wbGV0ZVN0YXR1czsKLQotCXU4CQkJCQkJQlRSZW1vdGVNQUNBZGRyWzZdOwotCi0JdTMyCQkJCQkJQlRDYXBhYmlsaXR5OwotCi0JdTgJCQkJCQlTeW5jRGF0YVBhY2tldExlbjsKLQotCXUxNgkJCQkJCVRvdGFsU3luY051bURhdGFQYWNrZXRzOwotCXUxNgkJCQkJCVRvdGFsTnVtQUNMRGF0YVBhY2tldHM7Ci0KLQl1OAkJCQkJCVNob3J0UmFuZ2VNb2RlOwotCi0JdTgJCQkJCQlQVEtbUFRLX0xFTl9US0lQXTsKLQl1OAkJCQkJCUdUS1tHVEtfTEVOXTsKLQl1OAkJCQkJCUFOb25jZVtLRVlfTk9OQ0VfTEVOXTsKLQl1OAkJCQkJCVNOb25jZVtLRVlfTk9OQ0VfTEVOXTsKLQl1NjQJCQkJCQlLZXlSZXBsYXlDb3VudGVyOwotCXU4CQkJCQkJV1BBQXV0aFJlcGxheUNvdW50OwotCXU4CQkJCQkJQUVTS2V5QnVmW0FFU0NDTVBfQkxLX1NJWkVfVE9UQUxdOwotCXU4CQkJCQkJUE1LW1BNS19MRU5dOwotCWVudW0gYnRfc3RhdGVfd3BhX2F1dGgJCQlCVFdQQUF1dGhTdGF0ZTsKLQlzMzIJCQkJCQlVbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQotCS8qICBBZGQgZm9yIEhXIHNlY3VyaXR5ICEhICovCi0JdTgJCQkJCQlId0NBTUluZGV4OyAgLyogIENhbSBpbmRleCAqLwotCXU4CQkJCQkJYlBlZXJRb3NTdGE7Ci0KLQl1MzIJCQkJCQlyeFN1dnBQa3RDbnQ7Ci19OwotCi1zdHJ1Y3QgYnRfdHJhZmZpY19zdGF0aXN0aWNzIHsKLQl1OAkJCQliVHhCdXN5VHJhZmZpYzsKLQl1OAkJCQliUnhCdXN5VHJhZmZpYzsKLQl1OAkJCQliSWRsZTsKLQl1MzIJCQkJVHhQa3RDbnRJblBlcmlvZDsKLQl1MzIJCQkJUnhQa3RDbnRJblBlcmlvZDsKLQl1NjQJCQkJVHhQa3RMZW5JblBlcmlvZDsKLQl1NjQJCQkJUnhQa3RMZW5JblBlcmlvZDsKLX07Ci0KLXN0cnVjdCBidF9tZ250IHsKLQl1OAkJCQliQlRDb25uZWN0SW5Qcm9ncmVzczsKLQl1OAkJCQliTG9nTGlua0luUHJvZ3Jlc3M7Ci0JdTgJCQkJYlBoeUxpbmtJblByb2dyZXNzOwotCXU4CQkJCWJQaHlMaW5rSW5Qcm9ncmVzc1N0YXJ0TEw7Ci0JdTgJCQkJQnRDdXJyZW50UGh5TGlua2hhbmRsZTsKLQl1MTYJCQkJQnRDdXJyZW50TG9nTGlua2hhbmRsZTsKLQl1OAkJCQlDdXJyZW50Q29ubmVjdEVudHJ5TnVtOwotCXU4CQkJCURpc2Nvbm5lY3RFbnRyeU51bTsKLQl1OAkJCQlDdXJyZW50QlRDb25uZWN0aW9uQ250OwotCWVudW0gYnRfY29ubmVjdF90eXBlCQlCVEN1cnJlbnRDb25uZWN0VHlwZTsKLQllbnVtIGJ0X2Nvbm5lY3RfdHlwZQkJQlRSZWNlaXZlQ29ubmVjdFBrdDsKLQl1OAkJCQlCVEF1dGhDb3VudDsKLQl1OAkJCQlCVEFzb2NDb3VudDsKLQl1OAkJCQliU3RhcnRTZW5kU3VwZXJ2aXNpb25Qa3Q7Ci0JdTgJCQkJQnRPcGVyYXRpb25PbjsKLQl1OAkJCQlCVE5lZWRBTVBTdGF0dXNDaGc7Ci0JdTgJCQkJSm9pbmVyTmVlZFNlbmRBdXRoOwotCXN0cnVjdCBoY2lfcGh5X2xpbmtfYnNzX2luZm8JYnNzRGVzYzsKLQlzdHJ1Y3QgaGNpX2V4dF9jb25maWcJCUV4dENvbmZpZzsKLQl1OAkJCQliTmVlZE5vdGlmeUFNUE5vQ2FwOwotCXU4CQkJCWJDcmVhdGVTcHBvcnRRb3M7Ci0JdTgJCQkJYlN1cHBvcnRQcm9maWxlOwotCXU4CQkJCUJUQ2hhbm5lbDsKLQl1OAkJCQlDaGVja0NobmxJc1N1aXQ7Ci0JdTgJCQkJYkJ0U2NhbjsKLQl1OAkJCQlidExvZ29UZXN0OwotfTsKLQotc3RydWN0IGJ0X2hjaV9kZ2JfaW5mbyB7Ci0JdTMyCQkJCWhjaUNtZENudDsKLQl1MzIJCQkJaGNpQ21kQ250VW5rbm93bjsKLQl1MzIJCQkJaGNpQ21kQ250Q3JlYXRlUGh5TGluazsKLQl1MzIJCQkJaGNpQ21kQ250QWNjZXB0UGh5TGluazsKLQl1MzIJCQkJaGNpQ21kQ250RGlzY29ubmVjdFBoeUxpbms7Ci0JdTMyCQkJCWhjaUNtZFBoeUxpbmtTdGF0dXM7Ci0JdTMyCQkJCWhjaUNtZENudENyZWF0ZUxvZ0xpbms7Ci0JdTMyCQkJCWhjaUNtZENudEFjY2VwdExvZ0xpbms7Ci0JdTMyCQkJCWhjaUNtZENudERpc2Nvbm5lY3RMb2dMaW5rOwotCXUzMgkJCQloY2lDbWRDbnRSZWFkTG9jYWxBbXBBc3NvYzsKLQl1MzIJCQkJaGNpQ21kQ250V3JpdGVSZW1vdGVBbXBBc3NvYzsKLQl1MzIJCQkJaGNpQ21kQ250U2V0QWNsTGlua1N0YXR1czsKLQl1MzIJCQkJaGNpQ21kQ250U2V0U2NvTGlua1N0YXR1czsKLQl1MzIJCQkJaGNpQ21kQ250RXh0ZW5zaW9uVmVyc2lvbk5vdGlmeTsKLQl1MzIJCQkJaGNpQ21kQ250TGlua1N0YXR1c05vdGlmeTsKLX07Ci0KLXN0cnVjdCBidF9pcnBfZGdiX2luZm8gewotCXUzMgkJCQlpcnBNSkNyZWF0ZTsKLQkvKiAgSW8gQ29udHJvbCAqLwotCXUzMgkJCQlpcnBJb0NvbnRyb2w7Ci0JdTMyCQkJCWlycElvQ3RybEhjaUNtZDsKLQl1MzIJCQkJaXJwSW9DdHJsSGNpRXZlbnQ7Ci0JdTMyCQkJCWlycElvQ3RybEhjaVR4RGF0YTsKLQl1MzIJCQkJaXJwSW9DdHJsSGNpUnhEYXRhOwotCXUzMgkJCQlpcnBJb0N0cmxVbmtub3duOwotCi0JdTMyCQkJCWlycElvQ3RybEhjaVR4RGF0YTFzOwotfTsKLQotc3RydWN0IGJ0X3BhY2tldF9kZ2JfaW5mbyB7Ci0JdTMyCQkJCWJ0UGt0VHhQcm9iUmVxOwotCXUzMgkJCQlidFBrdFJ4UHJvYlJlcTsKLQl1MzIJCQkJYnRQa3RSeFByb2JSZXFGYWlsOwotCXUzMgkJCQlidFBrdFR4UHJvYlJzcDsKLQl1MzIJCQkJYnRQa3RSeFByb2JSc3A7Ci0JdTMyCQkJCWJ0UGt0VHhBdXRoOwotCXUzMgkJCQlidFBrdFJ4QXV0aDsKLQl1MzIJCQkJYnRQa3RSeEF1dGhCdXREcm9wOwotCXUzMgkJCQlidFBrdFR4QXNzb2NSZXE7Ci0JdTMyCQkJCWJ0UGt0UnhBc3NvY1JlcTsKLQl1MzIJCQkJYnRQa3RSeEFzc29jUmVxQnV0RHJvcDsKLQl1MzIJCQkJYnRQa3RUeEFzc29jUnNwOwotCXUzMgkJCQlidFBrdFJ4QXNzb2NSc3A7Ci0JdTMyCQkJCWJ0UGt0VHhEaXNhc3NvYzsKLQl1MzIJCQkJYnRQa3RSeERpc2Fzc29jOwotCXUzMgkJCQlidFBrdFJ4RGVhdXRoOwotCXUzMgkJCQlidFBrdFR4NHdheTFzdDsKLQl1MzIJCQkJYnRQa3RSeDR3YXkxc3Q7Ci0JdTMyCQkJCWJ0UGt0VHg0d2F5Mm5kOwotCXUzMgkJCQlidFBrdFJ4NHdheTJuZDsKLQl1MzIJCQkJYnRQa3RUeDR3YXkzcmQ7Ci0JdTMyCQkJCWJ0UGt0Ung0d2F5M3JkOwotCXUzMgkJCQlidFBrdFR4NHdheTR0aDsKLQl1MzIJCQkJYnRQa3RSeDR3YXk0dGg7Ci0JdTMyCQkJCWJ0UGt0VHhMaW5rU3VwZXJSZXE7Ci0JdTMyCQkJCWJ0UGt0UnhMaW5rU3VwZXJSZXE7Ci0JdTMyCQkJCWJ0UGt0VHhMaW5rU3VwZXJSc3A7Ci0JdTMyCQkJCWJ0UGt0UnhMaW5rU3VwZXJSc3A7Ci0JdTMyCQkJCWJ0UGt0VHhEYXRhOwotCXUzMgkJCQlidFBrdFJ4RGF0YTsKLX07Ci0KLXN0cnVjdCBidF9kZ2IgewotCXU4CQkJCWRiZ0N0cmw7Ci0JdTMyCQkJCWRiZ1Byb2ZpbGU7Ci0Jc3RydWN0IGJ0X2hjaV9kZ2JfaW5mbwkJZGJnSGNpSW5mbzsKLQlzdHJ1Y3QgYnRfaXJwX2RnYl9pbmZvCQlkYmdJcnBJbmZvOwotCXN0cnVjdCBidF9wYWNrZXRfZGdiX2luZm8JZGJnQnRQa3Q7Ci19OwotCi1zdHJ1Y3QgYnRfaGNpX2luZm8gewotCS8qIDgwMi4xMSBQYWwgdmVyc2lvbiBzcGVjaWZpZXIgKi8KLQl1OAkJCQlCVFBhbFZlcnNpb247Ci0JdTE2CQkJCUJUUGFsQ29tcGFueUlEOwotCXUxNgkJCQlCVFBhbHN1YnZlcnNpb247Ci0KLQkvKiBDb25uZWN0ZWQgY2hhbm5lbCBsaXN0ICovCi0JdTE2CQkJCUJUQ29ubmVjdENobmxMaXN0TGVuOwotCXU4CQkJCUJUQ29ubmVjdENobmxsaXN0WzY0XTsKLQotCS8qIEZhaWwgY29udGFjdCBjb3VudGVyICovCi0JdTE2CQkJCUZhaWxDb250YWN0Q291bnQ7Ci0KLQkvKiBFdmVudCBtYXNrICovCi0JdTY0CQkJCUJURXZlbnRNYXNrOwotCXU2NAkJCQlCVEV2ZW50TWFza1BhZ2UyOwotCi0JLyogdGltZW91dCB2YXIgKi8KLQl1MTYJCQkJQ29ubkFjY2VwdFRpbWVvdXQ7Ci0JdTE2CQkJCUxvZ2ljYWxBY2NlcHRUaW1lb3V0OwotCXUxNgkJCQlQYWdlVGltZW91dDsKLQotCXU4CQkJCUxvY2F0aW9uRG9tYWluQXdhcmU7Ci0JdTE2CQkJCUxvY2F0aW9uRG9tYWluOwotCXU4CQkJCUxvY2F0aW9uRG9tYWluT3B0aW9uczsKLQl1OAkJCQlMb2NhdGlvbk9wdGlvbnM7Ci0KLQl1OAkJCQlGbG93Q29udHJvbE1vZGU7Ci0KLQkvKiBQcmVmZXJyZWQgY2hhbm5lbCBsaXN0ICovCi0JdTE2CQkJCUJ0UHJlQ2hubExpc3RMZW47Ci0JdTgJCQkJQlRQcmVDaG5sbGlzdFs2NF07Ci0KLQl1MTYJCQkJZW5GbHVzaF9MTEg7CS8qIGVuaGFuY2VkIGZsdXNoIGhhbmRsZSAqLwotCXUxNgkJCQlGTFRPX0xMSDsJCS8qIGVuaGFuY2VkIGZsdXNoIGhhbmRsZSAqLwotCi0JLyogICovCi0JLyogVGVzdCBjb21tYW5kIG9ubHkuICovCi0JdTgJCQkJYkluVGVzdE1vZGU7Ci0JdTgJCQkJYlRlc3RJc0VuZDsKLQl1OAkJCQliVGVzdE5lZWRSZXBvcnQ7Ci0JdTgJCQkJVGVzdFNjZW5hcmlvOwotCXU4CQkJCVRlc3RSZXBvcnRJbnRlcnZhbDsKLQl1OAkJCQlUZXN0Q3RyVHlwZTsKLQl1MzIJCQkJVGVzdEV2ZW50VHlwZTsKLQl1MTYJCQkJVGVzdE51bU9mRnJhbWU7Ci0JdTE2CQkJCVRlc3ROdW1PZkVyckZyYW1lOwotCXUxNgkJCQlUZXN0TnVtT2ZCaXRzOwotCXUxNgkJCQlUZXN0TnVtT2ZFcnJCaXRzOwotCS8qICAqLwotfTsKLQotc3RydWN0IGJ0X3RyYWZmaWMgewotCS8qICBBZGQgZm9yIGNoZWNrIHJlcGxheSBkYXRhICovCi0JdTgJCQkJCUxhc3RSeFVuaUZyYWdOdW07Ci0JdTE2CQkJCQlMYXN0UnhVbmlTZXFOdW07Ci0KLQkvKiBzMzIJCQkJCUVudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7ICovCi0JLyogczMyCQkJCQlFbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOyAqLwotCi0Jc3RydWN0IGJ0X3RyYWZmaWNfc3RhdGlzdGljcwkJQnQzMFRyYWZmaWNTdGF0aXN0aWNzOwotfTsKLQotI2RlZmluZSBSVF9XT1JLX0lURU0gc3RydWN0IHdvcmtfc3RydWN0Ci0KLXN0cnVjdCBidF9zZWN1cml0eSB7Ci0JLyogIFdQQSBhdXRoIHN0YXRlCi0JICogIE1heSBuZWVkIHRvIHJlbW92ZSB0byBCVFNlY0luZm8gLi4uIAotCSAqIGVudW0gYnRfc3RhdGVfd3BhX2F1dGggQlRXUEFBdXRoU3RhdGU7Ci0JICovCi0Jc3RydWN0IG9jdGV0X3N0cmluZwlSU05JRTsKLQl1OAkJCVJTTklFQnVmW01BWFJTTklFTEVOXTsKLQl1OAkJCWJSZWdOb0VuY3J5cHQ7Ci0JdTgJCQliVXNlZEh3RW5jcnlwdDsKLX07Ci0KLXN0cnVjdCBidF8zMGluZm8gewotCXN0cnVjdCBydHdfYWRhcHRlcgkqcGFkYXB0ZXI7Ci0Jc3RydWN0IGJ0X2Fzb2NfZW50cnkJCUJ0QXNvY0VudHJ5W01BWF9CVF9BU09DX0VOVFJZX05VTV07Ci0Jc3RydWN0IGJ0X21nbnQJCQkJQnRNZ250OwotCXN0cnVjdCBidF9kZ2IJCQkJQnREYmc7Ci0Jc3RydWN0IGJ0X2hjaV9pbmZvCQkJQnRIY2lJbmZvOwotCXN0cnVjdCBidF90cmFmZmljCQkJQnRUcmFmZmljOwotCXN0cnVjdCBidF9zZWN1cml0eQkJCUJ0U2VjOwotCVJUX1dPUktfSVRFTQkJSENJQ21kV29ya0l0ZW07Ci0Jc3RydWN0IHRpbWVyX2xpc3QgQlRIQ0lDbWRUaW1lcjsKLQlSVF9XT1JLX0lURU0JCUJUUHNEaXNhYmxlV29ya0l0ZW07Ci0JUlRfV09SS19JVEVNCQlCVENvbm5lY3RXb3JrSXRlbTsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBCVEhDSURpc2NhcmRBY2xEYXRhVGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgQlRIQ0lKb2luVGltZW91dFRpbWVyOwotCXN0cnVjdCB0aW1lcl9saXN0IEJUVGVzdFNlbmRQYWNrZXRUaW1lcjsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBCVERpc2Nvbm5lY3RQaHlMaW5rVGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgQlRCZWFjb25UaW1lcjsKLQl1OAkJCQlCVEJlYWNvblRtck9uOwotCi0Jc3RydWN0IHRpbWVyX2xpc3QgQlRQc0Rpc2FibGVUaW1lcjsKLQotCXZvaWQgKgkJCQlwQnRDaG5sTGlzdDsKLX07Ci0KLXN0cnVjdCBwYWNrZXRfaXJwX2FjbF9kYXRhIHsKLQl1MTYJCUhhbmRsZToxMjsKLQl1MTYJCVBCX0ZsYWc6MjsKLQl1MTYJCUJDX0ZsYWc6MjsKLQl1MTYJCUxlbmd0aDsKLQl1OAkJRGF0YVsxXTsKLX07Ci0KLXN0cnVjdCBwYWNrZXRfaXJwX2hjaWV2ZW50X2RhdGEgewotCXU4CQlFdmVudENvZGU7Ci0JdTgJCUxlbmd0aDsKLQl1OAkJRGF0YVsyMF07Ci19OwotCi1zdHJ1Y3QgY29tbW9uX3RyaXBsZSB7Ci0JdTggYnl0ZV8xc3Q7Ci0JdTggYnl0ZV8ybmQ7Ci0JdTggYnl0ZV8zcmQ7Ci19OwotCi0jZGVmaW5lIENPVU5UUllfU1RSX0xFTgkJMwkvKiAgY291bnRyeSBzdHJpbmcgbGVuID0gMyAqLwotCi0jZGVmaW5lIExPQ0FMX1BNSwkwCi0KLWVudW0gaGNpX3dpZmlfY29ubmVjdF9zdGF0dXMgewotCUhDSV9XSUZJX05PVF9DT05ORUNURUQJCQk9IDB4MCwKLQlIQ0lfV0lGSV9DT05ORUNURUQJCQk9IDB4MSwKLQlIQ0lfV0lGSV9DT05ORUNUX0lOX1BST0dSRVNTCQk9IDB4MiwKLX07Ci0KLWVudW0gaGNpX2V4dF9icF9vcGVyYXRpb24gewotCUhDSV9CVF9PUF9OT05FCQkJCT0gMHgwLAotCUhDSV9CVF9PUF9JTlFVSVJZX1NUQVJUCQkJPSAweDEsCi0JSENJX0JUX09QX0lOUVVJUllfRklOSVNICQk9IDB4MiwKLQlIQ0lfQlRfT1BfUEFHSU5HX1NUQVJUCQkJPSAweDMsCi0JSENJX0JUX09QX1BBR0lOR19TVUNDRVNTCQk9IDB4NCwKLQlIQ0lfQlRfT1BfUEFHSU5HX1VOU1VDQ0VTUwkJPSAweDUsCi0JSENJX0JUX09QX1BBSVJJTkdfU1RBUlQJCQk9IDB4NiwKLQlIQ0lfQlRfT1BfUEFJUklOR19GSU5JU0gJCT0gMHg3LAotCUhDSV9CVF9PUF9CVF9ERVZfRU5BQkxFCQkJPSAweDgsCi0JSENJX0JUX09QX0JUX0RFVl9ESVNBQkxFCQk9IDB4OSwKLQlIQ0lfQlRfT1BfTUFYCi19OwotCi0jZGVmaW5lIEJUSENJX1NNX1dJVEhfSU5GTyhfQWRhcHRlciwgX1N0YXRlVG9FbnRlciwgX1N0YXRlQ21kLCBfRW50cnlOdW0pCVwKLXsJCQkJCQkJCQkJXAotCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJbQlQgc3RhdGUgY2hhbmdlXSBjYXVzZWQgYnkgIiIlcyIiLCBsaW5lID0lZFxuIiwgX19mdW5jX18sIF9fTElORV9fKSk7CQkJCQkJCVwKLQlCVEhDSV9TdGF0ZU1hY2hpbmUoX0FkYXB0ZXIsIF9TdGF0ZVRvRW50ZXIsIF9TdGF0ZUNtZCwgX0VudHJ5TnVtKTtcCi19Ci0KLXZvaWQgQlRIQ0lfRXZlbnRQYXJzZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB2b2lkICpwRXZudERhdGEsCi0JCSAgICAgIHUzMiBkYXRhTGVuKTsKLSNkZWZpbmUgQlRfRXZlbnRQYXJzZSBCVEhDSV9FdmVudFBhcnNlCi11OCBCVEhDSV9Ic0Nvbm5lY3Rpb25Fc3RhYmxpc2hlZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRIQ0lfVXBkYXRlQlRQcm9maWxlUlRLVG9Nb3RvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVEhDSV9XaWZpU2Nhbk5vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzY2FuVHlwZSk7Ci12b2lkIEJUSENJX1N0YXRlTWFjaGluZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBTdGF0ZVRvRW50ZXIsCi0JCQllbnVtIGhjaV9zdGF0ZV93aXRoX2NtZCBTdGF0ZUNtZCwgdTggRW50cnlOdW0pOwotdm9pZCBCVEhDSV9EaXNjb25uZWN0UGVlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSk7Ci12b2lkIEJUSENJX0V2ZW50TnVtT2ZDb21wbGV0ZWREYXRhQmxvY2tzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVEhDSV9FdmVudEFNUFN0YXR1c0NoYW5nZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBBTVBfU3RhdHVzKTsKLXZvaWQgQlRIQ0lfRGlzY29ubmVjdEFsbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWVudW0gaGNpX3N0YXR1cyBCVEhDSV9IYW5kbGVIQ0lDTUQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICBzdHJ1Y3QgcGFja2V0X2lycF9oY2ljbWRfZGF0YSAqcEhjaUNtZCk7Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgQ09NTU9OL2J0X2hjaS5oID09PT09ICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzMUFudC5oID09PT09ICovCi0jZGVmaW5lIEdFVF9CVF9JTkZPKHBhZGFwdGVyKQkoJkdFVF9IQUxfREFUQShwYWRhcHRlciktPkJ0SW5mbykKLQotI2RlZmluZQlCVENfRk9SX1NDQU5fU1RBUlQJCQkJMQotI2RlZmluZQlCVENfRk9SX1NDQU5fRklOSVNICQkJCTAKLQotI2RlZmluZQlCVF9UWFJYX0NOVF9USFJFU18xCQkJCTEyMDAKLSNkZWZpbmUJQlRfVFhSWF9DTlRfVEhSRVNfMgkJCQkxNDAwCi0jZGVmaW5lCUJUX1RYUlhfQ05UX1RIUkVTXzMJCQkJMzAwMAotI2RlZmluZQlCVF9UWFJYX0NOVF9MRVZFTF8wCQkJCTAJLyogIDwgMTIwMCAqLwotI2RlZmluZQlCVF9UWFJYX0NOVF9MRVZFTF8xCQkJCTEJLyogID49IDEyMDAgJiYgPCAxNDAwICovCi0jZGVmaW5lCUJUX1RYUlhfQ05UX0xFVkVMXzIJCQkJMgkvKiAgPj0gMTQwMCAqLwotI2RlZmluZQlCVF9UWFJYX0NOVF9MRVZFTF8zCQkJCTMJLyogID49IDMwMDAgKi8KLQotZW51bSBidF9zdGF0ZV8xYW50IHsKLQlCVF9JTkZPX1NUQVRFX0RJU0FCTEVECQkJPSAwLAotCUJUX0lORk9fU1RBVEVfTk9fQ09OTkVDVElPTgkJPSAxLAotCUJUX0lORk9fU1RBVEVfQ09OTkVDVF9JRExFCQk9IDIsCi0JQlRfSU5GT19TVEFURV9JTlFfT1JfUEFHCQk9IDMsCi0JQlRfSU5GT19TVEFURV9BQ0xfT05MWV9CVVNZCQk9IDQsCi0JQlRfSU5GT19TVEFURV9TQ09fT05MWV9CVVNZCQk9IDUsCi0JQlRfSU5GT19TVEFURV9BQ0xfU0NPX0JVU1kJCT0gNiwKLQlCVF9JTkZPX1NUQVRFX0FDTF9JTlFfT1JfUEFHCQk9IDcsCi0JQlRfSU5GT19TVEFURV9NQVgJCQk9IDgKLX07Ci0KLXN0cnVjdCBidGRtXzg3MjNhXzFhbnQgewotCXU4CQlwcmVQc1RkbWE7Ci0JdTgJCWN1clBzVGRtYTsKLQl1OAkJcHNUZG1hRHVBZGpUeXBlOwotCXU4CQliUHJlUHNUZG1hT247Ci0JdTgJCWJDdXJQc1RkbWFPbjsKLQl1OAkJcHJlV2lmaVBhcmE7Ci0JdTgJCWN1cldpZmlQYXJhOwotCXU4CQlwcmVDb2V4V2lmaUNvbjsKLQl1OAkJY3VyQ29leFdpZmlDb247Ci0JdTgJCXdpZmlSc3NpVGhyZXNoOwotCi0JdTMyCQlwc1RkbWFNb25pdG9yQ250OwotCXUzMgkJcHNUZG1hR2xvYmFsQ250OwotCi0JLyogRHVyYXRpb25BZGp1c3QgRm9yIFNDTyAqLwotCXUzMgkJcHNUZG1hTW9uaXRvckNudEZvclNDTzsKLQl1OAkJcHNUZG1hRHVBZGpUeXBlRm9yU0NPOwotCXU4CQlSU1NJX1dpRmlfTGFzdDsKLQl1OAkJUlNTSV9CVF9MYXN0OwotCi0JdTgJCWJXaUZpSGFsdDsKLQl1OAkJYlJBQ2hhbmdlZDsKLX07Ci0KLXZvaWQgQlRETV8xQW50U2lnbmFsQ29tcGVuc2F0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJIHU4ICpyc3NpX3dpZmksIHU4ICpyc3NpX2J0KTsKLXZvaWQgQlRETV8xQW50Rm9yRGhjcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV8xQW50QnRDb2V4aXN0ODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzMUFudC5oID09PT09ICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzMkFudC5oID09PT09ICovCi1lbnVtIGJ0XzJhbnRfYnRfc3RhdHVzIHsKLQlCVF8yQU5UX0JUX1NUQVRVU19JRExFCQkJPSAweDAsCi0JQlRfMkFOVF9CVF9TVEFUVVNfQ09OTkVDVEVEX0lETEUJPSAweDEsCi0JQlRfMkFOVF9CVF9TVEFUVVNfTk9OX0lETEUJCT0gMHgyLAotCUJUXzJBTlRfQlRfU1RBVFVTX01BWAotfTsKLQotZW51bSBidF8yYW50X2NvZXhfYWxnbyB7Ci0JQlRfMkFOVF9DT0VYX0FMR09fVU5ERUZJTkVECQkJPSAweDAsCi0JQlRfMkFOVF9DT0VYX0FMR09fU0NPCQkJCT0gMHgxLAotCUJUXzJBTlRfQ09FWF9BTEdPX0hJRAkJCQk9IDB4MiwKLQlCVF8yQU5UX0NPRVhfQUxHT19BMkRQCQkJCT0gMHgzLAotCUJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUgkJCT0gMHg0LAotCUJUXzJBTlRfQ09FWF9BTEdPX1BBTkhTCQkJCT0gMHg1LAotCUJUXzJBTlRfQ09FWF9BTEdPX1BBTkVEUl9BMkRQCQk9IDB4NiwKLQlCVF8yQU5UX0NPRVhfQUxHT19QQU5FRFJfSElECQk9IDB4NywKLQlCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5FRFIJPSAweDgsCi0JQlRfMkFOVF9DT0VYX0FMR09fSElEX0EyRFAJCQk9IDB4OSwKLQlCVF8yQU5UX0NPRVhfQUxHT19ISURfQTJEUF9QQU5IUwk9IDB4QSwKLQlCVF8yQU5UX0NPRVhfQUxHT19NQVgJCQkJPSAweEIsCi19OwotCi1zdHJ1Y3QgYnRkbV84NzIzYV8yYW50IHsKLQl1OAliUHJlRGVjQnRQd3I7Ci0JdTgJYkN1ckRlY0J0UHdyOwotCi0JdTgJcHJlV2xhbkFjdEhpOwotCXU4CWN1cldsYW5BY3RIaTsKLQl1OAlwcmVXbGFuQWN0TG87Ci0JdTgJY3VyV2xhbkFjdExvOwotCi0JdTgJcHJlRndEYWNTd2luZ0x2bDsKLQl1OAljdXJGd0RhY1N3aW5nTHZsOwotCi0JdTgJYlByZVJmUnhMcGZTaHJpbms7Ci0JdTgJYkN1clJmUnhMcGZTaHJpbms7Ci0KLQl1OAliUHJlTG93UGVuYWx0eVJhOwotCXU4CWJDdXJMb3dQZW5hbHR5UmE7Ci0KLQl1OAlwcmVCdFJldHJ5SW5kZXg7Ci0JdTgJY3VyQnRSZXRyeUluZGV4OwotCi0JdTgJYlByZURhY1N3aW5nT247Ci0JdTMyCXByZURhY1N3aW5nTHZsOwotCXU4CWJDdXJEYWNTd2luZ09uOwotCXUzMgljdXJEYWNTd2luZ0x2bDsKLQotCXU4CWJQcmVBZGNCYWNrT2ZmOwotCXU4CWJDdXJBZGNCYWNrT2ZmOwotCi0JdTgJYlByZUFnY1RhYmxlRW47Ci0JdTgJYkN1ckFnY1RhYmxlRW47Ci0KLQl1MzIJcHJlVmFsMHg2YzA7Ci0JdTMyCWN1clZhbDB4NmMwOwotCXUzMglwcmVWYWwweDZjODsKLQl1MzIJY3VyVmFsMHg2Yzg7Ci0JdTgJcHJlVmFsMHg2Y2M7Ci0JdTgJY3VyVmFsMHg2Y2M7Ci0KLQl1OAliQ3VySWdub3JlV2xhbkFjdDsKLQl1OAliUHJlSWdub3JlV2xhbkFjdDsKLQotCXU4CXByZVBzVGRtYTsKLQl1OAljdXJQc1RkbWE7Ci0JdTgJcHNUZG1hRHVBZGpUeXBlOwotCXU4CWJQcmVQc1RkbWFPbjsKLQl1OAliQ3VyUHNUZG1hT247Ci0KLQl1OAlwcmVBbGdvcml0aG07Ci0JdTgJY3VyQWxnb3JpdGhtOwotCXU4CWJSZXNldFRkbWFBZGp1c3Q7Ci0KLQl1OAlidFN0YXR1czsKLX07Ci0KLXZvaWQgQlRETV8yQW50QnRDb2V4aXN0ODcyM0Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjODcyMzJBbnQuaCA9PT09PSAqLwotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjODcyMy5oID09PT09ICovCi0KLSNkZWZpbmUJQlRfUV9QS1RfT0ZGCQkwCi0jZGVmaW5lCUJUX1FfUEtUX09OCQkxCi0KLSNkZWZpbmUJQlRfVFhfUFdSX09GRgkJMAotI2RlZmluZQlCVF9UWF9QV1JfT04JCTEKLQotLyogIFRETUEgbW9kZSBkZWZpbml0aW9uICovCi0jZGVmaW5lCVRETUFfMkFOVAkJCTAKLSNkZWZpbmUJVERNQV8xQU5UCQkJMQotI2RlZmluZQlURE1BX05BVl9PRkYJCTAKLSNkZWZpbmUJVERNQV9OQVZfT04JCTEKLSNkZWZpbmUJVERNQV9EQUNfU1dJTkdfT0ZGCTAKLSNkZWZpbmUJVERNQV9EQUNfU1dJTkdfT04JMQotCi0jZGVmaW5lCUJUX1JTU0lfTEVWRUxfSAkwCi0jZGVmaW5lCUJUX1JTU0lfTEVWRUxfTQkxCi0jZGVmaW5lCUJUX1JTU0lfTEVWRUxfTAkyCi0KLS8qICBQVEEgbW9kZSByZWxhdGVkIGRlZmluaXRpb24gKi8KLSNkZWZpbmUJQlRfUFRBX01PREVfT0ZGCQkwCi0jZGVmaW5lCUJUX1BUQV9NT0RFX09OCQkxCi0KLS8qICBQZW5hbHR5IFR4IFJhdGUgQWRhcHRpdmUgKi8KLSNkZWZpbmUJQlRfVFhfUkFURV9BREFQVElWRV9OT1JNQUwJCQkwCi0jZGVmaW5lCUJUX1RYX1JBVEVfQURBUFRJVkVfTE9XX1BFTkFMVFkJMQotCi0vKiAgUkYgQ29ybmVyICovCi0jZGVmaW5lCUJUX1JGX1JYX0xQRl9DT1JORVJfUkVTVU1FCQkJMAotI2RlZmluZQlCVF9SRl9SWF9MUEZfQ09STkVSX1NIUklOSwkJCTEKLQotI2RlZmluZSBCVF9JTkZPX0FDTAkJCUJJVCgwKQotI2RlZmluZSBCVF9JTkZPX1NDTwkJCUJJVCgxKQotI2RlZmluZSBCVF9JTkZPX0lOUV9QQUcJCUJJVCgyKQotI2RlZmluZSBCVF9JTkZPX0FDTF9CVVNZCUJJVCgzKQotI2RlZmluZSBCVF9JTkZPX1NDT19CVVNZCUJJVCg0KQotI2RlZmluZSBCVF9JTkZPX0hJRAkJCUJJVCg1KQotI2RlZmluZSBCVF9JTkZPX0EyRFAJCUJJVCg2KQotI2RlZmluZSBCVF9JTkZPX0ZUUAkJCUJJVCg3KQotCi0KLQotc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EgewotCXUzMgkJCQkJaGlnaFByaW9yaXR5VHg7Ci0JdTMyCQkJCQloaWdoUHJpb3JpdHlSeDsKLQl1MzIJCQkJCWxvd1ByaW9yaXR5VHg7Ci0JdTMyCQkJCQlsb3dQcmlvcml0eVJ4OwotCXU4CQkJCQlidFJzc2k7Ci0JdTgJCQkJCVRvdGFsQW50TnVtOwotCXU4CQkJCQliQzJoQnRJbmZvU3VwcG9ydDsKLQl1OAkJCQkJYzJoQnRJbmZvOwotCXU4CQkJCQljMmhCdEluZm9PcmlnaW5hbDsKLQl1OAkJCQkJcHJlYzJoQnRJbmZvOyAvKiAgZm9yIDFBbnQgKi8KLQl1OAkJCQkJYkMyaEJ0SW5xdWlyeVBhZ2U7Ci0JdW5zaWduZWQgbG9uZwkJCQlidElucVBhZ2VTdGFydFRpbWU7IC8qICBmb3IgMkFudCAqLwotCXU4CQkJCQljMmhCdFByb2ZpbGU7IC8qICBmb3IgMUFudCAqLwotCXU4CQkJCQlidFJldHJ5Q250OwotCXU4CQkJCQlidEluZm9FeHQ7Ci0JdTgJCQkJCWJDMmhCdEluZm9SZXFTZW50OwotCXU4CQkJCQliRm9yY2VGd0J0SW5mbzsKLQl1OAkJCQkJYkZvcmNlQTJkcFNpbms7Ci0Jc3RydWN0IGJ0ZG1fODcyM2FfMmFudAkJCWJ0ZG0yQW50OwotCXN0cnVjdCBidGRtXzg3MjNhXzFhbnQJCQlidGRtMUFudDsKLX07Ci0KLXZvaWQgQlRETV9TZXRGd0NobmxJbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQllbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKTsKLXU4IEJURE1fSXNXaWZpQ29ubmVjdGlvbkV4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1NldEZ3M2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYnl0ZTEsIHU4IGJ5dGUyLCB1OCBieXRlMywKLQkJICB1OCBieXRlNCwgdTggYnl0ZTUpOwotdm9pZCBCVERNX1F1ZXJ5QnRJbmZvcm1hdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9TZXRTd1JmUnhMcGZDb3JuZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdHlwZSk7Ci12b2lkIEJURE1fU2V0U3dQZW5hbHR5VHhSYXRlQWRhcHRpdmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggcmFUeXBlKTsKLXZvaWQgQlRETV9TZXRGd0RlY0J0UHdyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJEZWNCdFB3cik7Ci11OCBCVERNX0J0UHJvZmlsZVN1cHBvcnQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fTHBzTGVhdmUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGM4NzIzLmggPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Y0NzcjFBbnQuaCA9PT09PSAqLwotCi1lbnVtIEJUX0EyRFBfSU5ERVh7Ci0JQlRfQTJEUF9JTkRFWDAJCT0gMCwJCQkvKiAgMzIsIDEyOyB0aGUgbW9zdCBjcml0aWNhbCBmb3IgQlQgKi8KLQlCVF9BMkRQX0lOREVYMSwJCQkJCS8qICAxMiwgMjQgKi8KLQlCVF9BMkRQX0lOREVYMiwJCQkJCS8qICAwLCAwICovCi0JQlRfQTJEUF9JTkRFWF9NQVgKLX07Ci0KLSNkZWZpbmUgQlRfQTJEUF9TVEFURV9OT1RfRU5URVJFRAkJMAotI2RlZmluZSBCVF9BMkRQX1NUQVRFX0RFVEVDVElORwkJMQotI2RlZmluZSBCVF9BMkRQX1NUQVRFX0RFVEVDVEVECQkJMgotCi0jZGVmaW5lIEJURE1fQU5UX0JUX0lETEUJCQkJMAotI2RlZmluZSBCVERNX0FOVF9XSUZJCQkJCQkxCi0jZGVmaW5lIEJURE1fQU5UX0JUCQkJCQkJMgotCi0KLXZvaWQgQlRETV9TaW5nbGVBbnQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlNpbmdsZUFudE9uLAotCQkgICAgdTggYkludGVycnVwdE9uLCB1OCBiTXVsdGlOQVZPbik7Ci12b2lkIEJURE1fQ2hlY2tCVElkbGVDaGFuZ2UxQW50KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRjQ3NyMUFudC5oID09PT09ICovCi0KLS8qICA9PT09PSBCZWxvdyB0aGlzIGxpbmUgaXMgc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0JUQ29leGlzdC9IYWxCdGNDc3IyQW50LmggPT09PT0gKi8KLQotLyogICovCi0vKiAgRm9yIG9sZCBjb3JlIHN0YWNrIGJlZm9yZSB2MjUxICovCi0vKiAgKi8KLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9OT1JNQUxfUE9XRVIJQklUKDApCi0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfQU1EUFVfT0ZGCQlCSVQoMSkKLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9TUEVDSUFMX0xPVwlCSVQoMikKLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9CR19FRENBX0xPVwlCSVQoMykKLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9UWFBPV0VSX0xPVwlCSVQoNCkKLQotI2RlZmluZQlCVF9EQUNTV0lOR19PRkYJCQkJMAotI2RlZmluZQlCVF9EQUNTV0lOR19NNAkJCQkxCi0jZGVmaW5lCUJUX0RBQ1NXSU5HX003CQkJCTIKLSNkZWZpbmUJQlRfREFDU1dJTkdfTTEwCQkJCTMKLQotdm9pZCBCVERNX0RpbWluaXNoV2lGaShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHU4IGJEQUNPbiwgdTggYkludGVycnVwdE9uLAotCQkgICAgICAgdTggREFDU3dpbmdMZXZlbCwgdTggYk5BVk9uKTsKLQotLyogID09PT09IEVuZCBvZiBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvQlRDb2V4aXN0L0hhbEJ0Y0NzcjJBbnQuaCA9PT09PSAqLwotCi0vKiAgSEVBREVSL1R5cGVEZWYuaCAqLwotI2RlZmluZSBNQVhfRldfU1VQUE9SVF9NQUNJRF9OVU0JCQk2NAotCi0vKiAgPT09PT0gQmVsb3cgdGhpcyBsaW5lIGlzIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRDb2V4aXN0LmggPT09PT0gKi8KLQotI2RlZmluZQlGV19WRVJfQlRfUkVHCQkJNjIKLSNkZWZpbmUJRldfVkVSX0JUX1JFRzEJCTc0Ci0jZGVmaW5lCVJFR19CVF9BQ1RJVkUJCQkweDQ0NAotI2RlZmluZQlSRUdfQlRfU1RBVEUJCQkweDQ0OAotI2RlZmluZQlSRUdfQlRfUE9MTElORzEJCTB4NDRjCi0jZGVmaW5lCVJFR19CVF9QT0xMSU5HCQkJMHg3MDAKLQotI2RlZmluZQlSRUdfQlRfQUNUSVZFX09MRAkJMHg0ODgKLSNkZWZpbmUJUkVHX0JUX1NUQVRFX09MRAkJMHg0OGMKLSNkZWZpbmUJUkVHX0JUX1BPTExJTkdfT0xECTB4NDkwCi0KLS8qICBUaGUgcmVnIGRlZmluZSBpcyBmb3IgODcyMyAqLwotI2RlZmluZQlSRUdfSElHSF9QUklPUklUWV9UWFJYCQkJMHg3NzAKLSNkZWZpbmUJUkVHX0xPV19QUklPUklUWV9UWFJYCQkJMHg3NzQKLQotI2RlZmluZSBCVF9GV19DT0VYX1RIUkVTSF9UT0wJCQk2Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzIwCQkJCTIwCi0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzIzCQkJCTIzCi0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzI1CQkJCTI1Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzMwCQkJCTMwCi0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzM1CQkJCTM1Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzQwCQkJCTQwCi0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzQ1CQkJCTQ1Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzQ3CQkJCTQ3Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzUwCQkJCTUwCi0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzU1CQkJCTU1Ci0jZGVmaW5lIEJUX0ZXX0NPRVhfVEhSRVNIXzY1CQkJCTY1Ci0KLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVDMwCQkJQklUKDApCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9IVDIwCQkJQklUKDEpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9IVDQwCQkJQklUKDIpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9MRUdBQ1kJCUJJVCgzKQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0xPVwkJQklUKDQpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX01FRElVTQkJQklUKDUpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0hJR0gJCUJJVCg2KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0RFQ19CVF9QT1dFUgkJQklUKDcpCi0KLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX0lETEUJCQlCSVQoOCkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1VQTElOSwkJQklUKDkpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9ET1dOTElOSwkJQklUKDEwKQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfSU5RX1BBR0UJCUJJVCgxMSkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9JRExFCQkJQklUKDEyKQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUX1VQTElOSwkJCUJJVCgxMykKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9ET1dOTElOSwkJQklUKDE0KQotLyogICovCi0vKiAgVG9kbzogUmVtb3ZlIHRoZXNlIGRlZmluaXRpb25zICovCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfUEFOX0lETEUJCUJJVCgxNSkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9QQU5fVVBMSU5LCQlCSVQoMTYpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfUEFOX0RPV05MSU5LCQlCSVQoMTcpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfQTJEUF9JRExFCQlCSVQoMTgpCi0vKiAgKi8KLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9SU1NJX0xPVwkJQklUKDE5KQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfUFJPRklMRV9ISUQJCUJJVCgyMCkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9QUk9GSUxFX0EyRFAJCUJJVCgyMSkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9QUk9GSUxFX1BBTgkJQklUKDIyKQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1BST0ZJTEVfU0NPCQlCSVQoMjMpCi0KLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9MT1cJCUJJVCgyNCkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfMV9NRURJVU0JQklUKDI1KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV8xX0hJR0gJCUJJVCgyNikKLQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX1dJRklfUlNTSV9CRUFDT05fTE9XCUJJVCgyNykKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9XSUZJX1JTU0lfQkVBQ09OX01FRElVTQlCSVQoMjgpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfV0lGSV9SU1NJX0JFQUNPTl9ISUdICUJJVCgyOSkKLQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRJTkZPX0NPTU1PTgkJQklUKDMwKQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUSU5GT19CX0hJRF9TQ09FU0NPCUJJVCgzMSkKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVElORk9fQl9GVFBfQTJEUAkJQklUKDMyKQotCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfQ05UX0xFVkVMXzAJCUJJVCgzMykKLSNkZWZpbmUgQlRfQ09FWF9TVEFURV9CVF9DTlRfTEVWRUxfMQkJQklUKDM0KQotI2RlZmluZSBCVF9DT0VYX1NUQVRFX0JUX0NOVF9MRVZFTF8yCQlCSVQoMzUpCi0jZGVmaW5lIEJUX0NPRVhfU1RBVEVfQlRfQ05UX0xFVkVMXzMJCUJJVCgzNikKLQotI2RlZmluZSBCVF9SU1NJX1NUQVRFX0hJR0gJCQkwCi0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfTUVESVVNCQkJMQotI2RlZmluZSBCVF9SU1NJX1NUQVRFX0xPVwkJCTIKLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9TVEFZX0hJR0gJCQkzCi0jZGVmaW5lIEJUX1JTU0lfU1RBVEVfU1RBWV9NRURJVU0JCTQKLSNkZWZpbmUgQlRfUlNTSV9TVEFURV9TVEFZX0xPVwkJCTUKLQotI2RlZmluZQlCVF9BR0NUQUJMRV9PRkYJCQkJMAotI2RlZmluZQlCVF9BR0NUQUJMRV9PTgkJCQkxCi0KLSNkZWZpbmUJQlRfQkJfQkFDS09GRl9PRkYJCQkwCi0jZGVmaW5lCUJUX0JCX0JBQ0tPRkZfT04JCQkxCi0KLSNkZWZpbmUJQlRfRldfTkFWX09GRgkJCQkwCi0jZGVmaW5lCUJUX0ZXX05BVl9PTgkJCQkxCi0KLSNkZWZpbmUJQlRfQ09FWF9NRUNIX05PTkUJCQkwCi0jZGVmaW5lCUJUX0NPRVhfTUVDSF9TQ08JCQkxCi0jZGVmaW5lCUJUX0NPRVhfTUVDSF9ISUQJCQkyCi0jZGVmaW5lCUJUX0NPRVhfTUVDSF9BMkRQCQkJMwotI2RlZmluZQlCVF9DT0VYX01FQ0hfUEFOCQkJNAotI2RlZmluZQlCVF9DT0VYX01FQ0hfSElEX0EyRFAJCQk1Ci0jZGVmaW5lCUJUX0NPRVhfTUVDSF9ISURfUEFOCQkJNgotI2RlZmluZQlCVF9DT0VYX01FQ0hfUEFOX0EyRFAJCQk3Ci0jZGVmaW5lCUJUX0NPRVhfTUVDSF9ISURfU0NPX0VTQ08JCTgKLSNkZWZpbmUJQlRfQ09FWF9NRUNIX0ZUUF9BMkRQCQkJOQotI2RlZmluZQlCVF9DT0VYX01FQ0hfQ09NTU9OCQkJMTAKLSNkZWZpbmUJQlRfQ09FWF9NRUNIX01BWAkJCTExCi0vKglCVCBEYmcgQ3RybCAqLwotI2RlZmluZQlCVF9EQkdfUFJPRklMRV9OT05FCQkJMAotI2RlZmluZQlCVF9EQkdfUFJPRklMRV9TQ08JCQkxCi0jZGVmaW5lCUJUX0RCR19QUk9GSUxFX0hJRAkJCTIKLSNkZWZpbmUJQlRfREJHX1BST0ZJTEVfQTJEUAkJCTMKLSNkZWZpbmUJQlRfREJHX1BST0ZJTEVfUEFOCQkJNAotI2RlZmluZQlCVF9EQkdfUFJPRklMRV9ISURfQTJEUAkJCTUKLSNkZWZpbmUJQlRfREJHX1BST0ZJTEVfSElEX1BBTgkJCTYKLSNkZWZpbmUJQlRfREJHX1BST0ZJTEVfUEFOX0EyRFAJCQk3Ci0jZGVmaW5lCUJUX0RCR19QUk9GSUxFX01BWAkJCTkKLQotc3RydWN0IGJ0X2NvZXhpc3Rfc3RyIHsKLQl1OAkJCUJsdWV0b290aENvZXhpc3Q7Ci0JdTgJCQlCVF9BbnRfTnVtOwotCXU4CQkJQlRfQ29leGlzdFR5cGU7Ci0JdTgJCQlCVF9BbnRfaXNvbGF0aW9uOwkvKiAwOmdvb2QsIDE6YmFkICovCi0JdTgJCQlidF9yYWRpb3NoYXJlZHR5cGU7Ci0JdTMyCQkJUmF0aW9fVHg7Ci0JdTMyCQkJUmF0aW9fUFJJOwotCXU4CQkJYkluaXRsaXplZDsKLQl1MzIJCQlCdFJmUmVnT3JpZ2luMUU7Ci0JdTMyCQkJQnRSZlJlZ09yaWdpbjFGOwotCXU4CQkJYkJUQnVzeVRyYWZmaWM7Ci0JdTgJCQliQlRUcmFmZmljTW9kZVNldDsKLQl1OAkJCWJCVE5vblRyYWZmaWNNb2RlU2V0OwotCXN0cnVjdCBidF90cmFmZmljX3N0YXRpc3RpY3MJCUJUMjFUcmFmZmljU3RhdGlzdGljczsKLQl1NjQJCQlDdXJyZW50U3RhdGU7Ci0JdTY0CQkJUHJldmlvdXNTdGF0ZTsKLQl1OAkJCXByZVJzc2lTdGF0ZTsKLQl1OAkJCXByZVJzc2lTdGF0ZTE7Ci0JdTgJCQlwcmVSc3NpU3RhdGVCZWFjb247Ci0JdTgJCQliRldDb2V4aXN0QWxsT2ZmOwotCXU4CQkJYlNXQ29leGlzdEFsbE9mZjsKLQl1OAkJCWJIV0NvZXhpc3RBbGxPZmY7Ci0JdTgJCQliQmFsYW5jZU9uOwotCXU4CQkJYlNpbmdsZUFudE9uOwotCXU4CQkJYkludGVycnVwdE9uOwotCXU4CQkJYk11bHRpTkFWT247Ci0JdTgJCQlQcmVXTEFOQWN0SDsKLQl1OAkJCVByZVdMQU5BY3RMOwotCXU4CQkJV0xBTkFjdEg7Ci0JdTgJCQlXTEFOQWN0TDsKLQl1OAkJCUEyRFBTdGF0ZTsKLQl1OAkJCUFudGVubmFTdGF0ZTsKLQl1MzIJCQlsYXN0QnRFZGNhOwotCXUxNgkJCWxhc3RfYWdncl9udW07Ci0JdTgJCQliRURDQUluaXRpYWxpemVkOwotCXU4CQkJZXhlY19jbnQ7Ci0JdTgJCQliODcyM2FBZ2NUYWJsZU9uOwotCXU4CQkJYjkyREFnY1RhYmxlT247Ci0Jc3RydWN0IGJ0X2NvZXhpc3RfODcyM2EJaGFsQ29leDg3MjM7Ci0JdTgJCQlidEFjdGl2ZVplcm9DbnQ7Ci0JdTgJCQliQ3VyQnREaXNhYmxlZDsKLQl1OAkJCWJQcmVCdERpc2FibGVkOwotCXU4CQkJYk5lZWRUb1JvYW1Gb3JCdERpc2FibGVFbmFibGU7Ci0JdTgJCQlmdzNhVmFsWzVdOwotfTsKLQotdm9pZCBCVERNX0NoZWNrQW50U2VsTW9kZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9Gd0MyaEJ0UnNzaShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqdG1wQnVmKTsKLSNkZWZpbmUgQlRfRndDMmhCdFJzc2kgQlRETV9Gd0MyaEJ0UnNzaQotdm9pZCBCVERNX0Rpc3BsYXlCdENvZXhJbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotI2RlZmluZSBCVF9EaXNwbGF5QnRDb2V4SW5mbyBCVERNX0Rpc3BsYXlCdENvZXhJbmZvCi12b2lkIEJURE1fUmVqZWN0QVBBZ2dyZWdhdGVkUGFja2V0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJSZWplY3QpOwotdTggQlRETV9Jc0hUNDAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0xlZ2FjeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9DaGVja1dpRmlTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXMzMiBCVERNX0dldFJ4U1Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0NoZWNrQ29leEJjblJzc2lTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBsZXZlbE51bSwKLQkJCSAgICAgIHU4IFJzc2lUaHJlc2gsIHU4IFJzc2lUaHJlc2gxKTsKLXU4IEJURE1fQ2hlY2tDb2V4UlNTSVN0YXRlMShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBsZXZlbE51bSwKLQkJCSAgICB1OCBSc3NpVGhyZXNoLCB1OCBSc3NpVGhyZXNoMSk7Ci11OCBCVERNX0NoZWNrQ29leFJTU0lTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBsZXZlbE51bSwKLQkJCSAgIHU4IFJzc2lUaHJlc2gsIHU4IFJzc2lUaHJlc2gxKTsKLXZvaWQgQlRETV9CYWxhbmNlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGJCYWxhbmNlT24sIHU4IG1zMCwgdTggbXMxKTsKLXZvaWQgQlRETV9BR0NUYWJsZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKTsKLXZvaWQgQlRETV9CQkJhY2tPZmZMZXZlbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKTsKLXZvaWQgQlRETV9GV0NvZXhBbGxPZmYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEJURE1fU1dDb2V4QWxsT2ZmKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX0hXQ29leEFsbE9mZihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9Db2V4QWxsT2ZmKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1R1cm5PZmZCdENvZXhpc3RCZWZvcmVFbnRlcklQUyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9TaWduYWxDb21wZW5zYXRpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnJzc2lfd2lmaSwKLQkJCSAgICAgdTggKnJzc2lfYnQpOwotdm9pZCBCVERNX1VwZGF0ZUNvZXhTdGF0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXU4IEJURE1fSXNTYW1lQ29leGlzdFN0YXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1BXREJNb25pdG9yKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0JUQnVzeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLSNkZWZpbmUgQlRfSXNCdEJ1c3kgQlRETV9Jc0JUQnVzeQotdTggQlRETV9Jc1dpZmlCdXN5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0NvZXhpc3RTdGF0ZUNoYW5nZWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzV2lmaVVwbGluayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXU4IEJURE1fSXNXaWZpRG93bmxpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQlRIU01vZGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQlRVcGxpbmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQlREb3dubGluayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9BZGp1c3RGb3JCdE9wZXJhdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgQlRETV9Gb3JIYWx0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1dpZmlTY2FuTm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHNjYW5UeXBlKTsKLXZvaWQgQlRETV9XaWZpQXNzb2NpYXRlTm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGFjdGlvbik7Ci12b2lkIEJURE1fTWVkaWFTdGF0dXNOb3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKTsKLXZvaWQgQlRETV9Gb3JEaGNwKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1Jlc2V0QWN0aW9uUHJvZmlsZVN0YXRlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBCVERNX1NldEJ0Q29leEN1cnJBbnROdW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYW50TnVtKTsKLSNkZWZpbmUgQlRfU2V0QnRDb2V4Q3VyckFudE51bSBCVERNX1NldEJ0Q29leEN1cnJBbnROdW0KLXU4IEJURE1fSXNBY3Rpb25TQ08oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQWN0aW9uSElEKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0FjdGlvbkEyRFAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQWN0aW9uUEFOKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0FjdGlvbkhJREEyRFAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11OCBCVERNX0lzQWN0aW9uSElEUEFOKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdTggQlRETV9Jc0FjdGlvblBBTkEyRFAoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11MzIgQlRETV9CdFR4UnhDb3VudGVySChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXUzMiBCVERNX0J0VHhSeENvdW50ZXJMKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0vKiAgPT09PT0gRW5kIG9mIHN5bmMgZnJvbSBTRDcgZHJpdmVyIEhBTC9CVENvZXhpc3QvSGFsQnRDb2V4aXN0LmggPT09PT0gKi8KLQotLyogID09PT09IEJlbG93IHRoaXMgbGluZSBpcyBzeW5jIGZyb20gU0Q3IGRyaXZlciBIQUwvSGFsQlQuaCA9PT09PSAqLwotCi0jZGVmaW5lIFJUU19DVFNfTk9fTEVOX0xJTUlUCTAKLQotdTggSEFMQlRfR2V0UEdBbnROdW0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0jZGVmaW5lIEJUX0dldFBHQW50TnVtIEhBTEJUX0dldFBHQW50TnVtCi12b2lkIEhBTEJUX1NldEtleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSk7Ci12b2lkIEhBTEJUX1JlbW92ZUtleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBFbnRyeU51bSk7Ci11OCBIQUxCVF9Jc0JURXhpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0jZGVmaW5lIEJUX0lzQnRFeGlzdCBIQUxCVF9Jc0JURXhpc3QKLXU4IEhBTEJUX0JUQ2hpcFR5cGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIEhBTEJUX1NldFJ0c0N0c05vTGVuTGltaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLS8qICA9PT09PSBFbmQgb2Ygc3luYyBmcm9tIFNENyBkcml2ZXIgSEFML0hhbEJULmMgPT09PT0gKi8KLQotI2RlZmluZSBfYnRfZGJnX29mZl8JCTAKLSNkZWZpbmUgX2J0X2RiZ19vbl8JCTEKLQotZXh0ZXJuIHUzMiBCVENvZXhEYmdMZXZlbDsKLQotCi0KLSNlbmRpZiAvKiAgX19SVEw4NzIzQV9CVF9DT0VYSVNUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2J0X2ludGYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9idF9pbnRmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzM1NTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2J0X2ludGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodChjKSAyMDE0LCBKZXMgU29yZW5zZW4gPEplcy5Tb3JlbnNlbkByZWRoYXQuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRMODcyM0FfQlRfSU5URl9IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9CVF9JTlRGX0hfXwotCi0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLWVudW0gcnRfbWVkaWFfc3RhdHVzOwotYm9vbCBydGw4NzIzYV9CVF91c2luZ19hbnRlbm5hXzEoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHJ0bDg3MjNhX0JUX2VuYWJsZWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHJ0bDg3MjNhX0JUX2NvZXhpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0JUX2RvX2NvZXhpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0JUX3dpZmlzY2FuX25vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBzY2FuVHlwZSk7Ci12b2lkIHJ0bDg3MjNhX0JUX21lZGlhc3RhdHVzX25vdGlmeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICBlbnVtIHJ0X21lZGlhX3N0YXR1cyBtc3RhdHVzKTsKLXZvaWQgcnRsODcyM2FfQlRfc3BlY2lhbHBhY2tldF9ub3RpZnkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0JUX2xwc19sZWF2ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfQlRfZGlzYWJsZV9jb2V4aXN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBydGw4NzIzYV9CVF9kaXNhYmxlX0VEQ0FfdHVyYm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX2R1YWxfYW50ZW5uYV9kZXRlY3Rpb24oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0JUX2luaXRfaHdjb25maWcoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0JUX3dpZmlhc3NvY2lhdGVfbm90aWZ5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGFjdGlvbik7Ci12b2lkIHJ0bDg3MjNhX0JUX2luaXRfaGFsX3ZhcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX2Z3X2MyaF9CVF9pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICp0bXBCdWYsIHU4IGxlbmd0aCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBib29sIHJ0bDg3MjNhX0JUX3VzaW5nX2FudGVubmFfMShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJldHVybiBmYWxzZTsKLX0KLXN0YXRpYyBpbmxpbmUgYm9vbCBydGw4NzIzYV9CVF9lbmFibGVkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotc3RhdGljIGlubGluZSBib29sIHJ0bDg3MjNhX0JUX2NvZXhpc3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0jZGVmaW5lIHJ0bDg3MjNhX0JUX2RvX2NvZXhpc3QocGFkYXB0ZXIpCQkJZG8ge30gd2hpbGUoMCkKLSNkZWZpbmUgcnRsODcyM2FfQlRfd2lmaXNjYW5fbm90aWZ5KHBhZGFwdGVyLCBzY2FuVHlwZSkJCWRvIHt9IHdoaWxlKDApCi0jZGVmaW5lIHJ0bDg3MjNhX0JUX21lZGlhc3RhdHVzX25vdGlmeShwYWRhcHRlciwgbXN0YXR1cykJZG8ge30gd2hpbGUoMCkKLSNkZWZpbmUgcnRsODcyM2FfQlRfc3BlY2lhbHBhY2tldF9ub3RpZnkocGFkYXB0ZXIpCQlkbyB7fSB3aGlsZSgwKQotI2RlZmluZSBydGw4NzIzYV9CVF9scHNfbGVhdmUocGFkYXB0ZXIpCQkJCWRvIHt9IHdoaWxlKDApCi0jZGVmaW5lIHJ0bDg3MjNhX0JUX2Rpc2FibGVfY29leGlzdChwYWRhcHRlcikJCQlkbyB7fSB3aGlsZSgwKQotc3RhdGljIGlubGluZSBib29sIHJ0bDg3MjNhX0JUX2Rpc2FibGVfRURDQV90dXJibyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJldHVybiBmYWxzZTsKLX0KLSNkZWZpbmUgcnRsODcyM2FfZHVhbF9hbnRlbm5hX2RldGVjdGlvbihwYWRhcHRlcikJCWRvIHt9IHdoaWxlKDApCi0jZGVmaW5lIHJ0bDg3MjNhX0JUX2luaXRfaHdjb25maWcocGFkYXB0ZXIpCQkJZG8ge30gd2hpbGUoMCkKLSNkZWZpbmUgcnRsODcyM2FfQlRfd2lmaWFzc29jaWF0ZV9ub3RpZnkocGFkYXB0ZXIsIGFjdGlvbikJZG8ge30gd2hpbGUoMCkKLSNkZWZpbmUgcnRsODcyM2FfQlRfaW5pdF9oYWxfdmFycyhwYWRhcHRlcikJCQlkbyB7fSB3aGlsZSgwKQotI2RlZmluZSBydGw4NzIzYV9md19jMmhfQlRfaW5mbyhwYWRhcHRlciwgdG1wQnVmLCBsZW5ndGgpCWRvIHt9IHdoaWxlKDApCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfY21kLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NTUzNWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2NtZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUTDg3MjNBX0NNRF9IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9DTURfSF9fCi0KLQotI2RlZmluZSBIMkNfQlRfRldfUEFUQ0hfTEVOCQkzCi0jZGVmaW5lIEgyQ19CVF9QV1JfRk9SQ0VfTEVOCQkzCi0KLWVudW0gY21kX21zZ19lbGVtZW50X2lkCi17Ci0JTk9ORV9DTURNU0dfRUlELAotCUFQX09GRkxPQURfRUlEID0gMCwKLQlTRVRfUFdSTU9ERV9FSUQgPSAxLAotCUpPSU5CU1NfUlBUX0VJRCA9IDIsCi0JUlNWRF9QQUdFX0VJRCA9IDMsCi0JUlNTSV80X0VJRCA9IDQsCi0JUlNTSV9TRVRUSU5HX0VJRCA9IDUsCi0JTUFDSURfQ09ORklHX0VJRCA9IDYsCi0JTUFDSURfUFNfTU9ERV9FSUQgPSA3LAotCVAyUF9QU19PRkZMT0FEX0VJRCA9IDgsCi0JU0VMRUNUSVZFX1NVU1BFTkRfUk9GX0NNRCA9IDksCi0JQlRfUVVFVUVfUEtUX0VJRCA9IDE3LAotCUJUX0FOVF9URE1BX0VJRCA9IDIwLAotCUJUXzJBTlRfSElEX0VJRCA9IDIxLAotCVAyUF9QU19DVFdfQ01EX0VJRCA9IDMyLAotCUZPUkNFX0JUX1RYX1BXUl9FSUQgPSAzMywKLQlTRVRfVERNQV9XTEFOX0FDVF9USU1FX0VJRCA9IDM0LAotCVNFVF9CVF9UWF9SRVRSWV9JTkRFWF9FSUQgPSAzNSwKLQlISURfUFJPRklMRV9FTkFCTEVfRUlEID0gMzYsCi0JQlRfSUdOT1JFX1dMQU5fQUNUX0VJRCA9IDM3LAotCUJUX1BUQV9NQU5BR0VSX1VQREFURV9FTkFCTEVfRUlEID0gMzgsCi0JREFDX1NXSU5HX1ZBTFVFX0VJRCA9IDQxLAotCVRSQURJVElPTkFMX1RETUFfRU5fRUlEID0gNTEsCi0JSDJDX0JUX0ZXX1BBVENIID0gNTQsCi0JQl9UWVBFX1RETUFfRUlEID0gNTgsCi0JU0NBTl9FTl9FSUQgPSA1OSwKLQlMT1dQV1JfTFBTX0VJRCA9IDcxLAotCUgyQ19SRVNFVF9UU0YgPSA3NSwKLQlNQVhfQ01ETVNHX0VJRAotfTsKLQotc3RydWN0IGNtZF9tc2dfcGFybSB7Ci0JdTggZWlkOyAvKiBlbGVtZW50IGlkICovCi0JdTggc3o7IC8qICBzeiAqLwotCXU4IGJ1Zls2XTsKLX07Ci0KLXN0cnVjdCBzZXRwd3Jtb2RlX3Bhcm0gewotCXU4IE1vZGU7Ci0JdTggU21hcnRQUzsKLQl1OCBBd2FrZUludGVydmFsOwkvKiAgdW5pdDogYmVhY29uIGludGVydmFsICovCi0JdTggYkFsbFF1ZXVlVUFQU0Q7Ci0KLSNkZWZpbmUgU0VUUE1fTE9XUlhCQ04JCQlCSVQoMCkKLSNkZWZpbmUgU0VUUE1fQVVUT0FOVFNXSVRDSAkJQklUKDEpCi0jZGVmaW5lIFNFVFBNX1BTQUxMT1dCVEhJR0hQUkkJQklUKDIpCi0JdTggQmNuQW50TW9kZTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBIMkNfU1NfUkZPRkZfUEFSQU17Ci0JdTggUk9GT247IC8qICAxOiBvbiwgMDpvZmYgKi8KLQl1MTYgZ3Bpb19wZXJpb2Q7IC8qICB1bml0OiAxMDI0IHVzICovCi19X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0KLXN0cnVjdCBqb2luYnNzcnB0X3Bhcm0gewotCXU4IE9wTW9kZTsJLyogIGVudW0gcnRfbWVkaWFfc3RhdHVzICovCi19OwotCi1zdHJ1Y3QgcnN2ZHBhZ2VfbG9jIHsKLQl1OCBMb2NQcm9iZVJzcDsKLQl1OCBMb2NQc1BvbGw7Ci0JdTggTG9jTnVsbERhdGE7Ci0JdTggTG9jUW9zTnVsbDsKLQl1OCBMb2NCVFFvc051bGw7Ci19OwotCi1zdHJ1Y3QgUDJQX1BTX09mZmxvYWRfdCB7Ci0JdTggT2ZmbG9hZF9FbjoxOwotCXU4IHJvbGU6MTsgLyogIDE6IE93bmVyLCAwOiBDbGllbnQgKi8KLQl1OCBDVFdpbmRvd19FbjoxOwotCXU4IE5vQTBfRW46MTsKLQl1OCBOb0ExX0VuOjE7Ci0JdTggQWxsU3RhU2xlZXA6MTsgLyogIE9ubHkgdmFsaWQgaW4gT3duZXIgKi8KLQl1OCBkaXNjb3Zlcnk6MTsKLQl1OCByc3ZkOjE7Ci19OwotCi1zdHJ1Y3QgUDJQX1BTX0NUV1BlcmlvZF90IHsKLQl1OCBDVFdQZXJpb2Q7CS8qIFRVICovCi19OwotCi0jZGVmaW5lIEJfVERNQV9FTgkJCUJJVCgwKQotI2RlZmluZSBCX1RETUFfRklYQU5USU5CVAkJQklUKDEpCi0jZGVmaW5lIEJfVERNQV9UWFBTUE9MTAkJCUJJVCgyKQotI2RlZmluZSBCX1RETUFfVkFMODcwCQkJQklUKDMpCi0jZGVmaW5lIEJfVERNQV9BVVRPV0FLRVVQCQlCSVQoNCkKLSNkZWZpbmUgQl9URE1BX05PUFMJCQlCSVQoNSkKLSNkZWZpbmUgQl9URE1BX1dMQU5ISUdIUFJJCQlCSVQoNikKLQotc3RydWN0IGJfdHlwZV90ZG1hX3Bhcm0gewotCXU4IG9wdGlvbjsKLQotCXU4IFRCVFRPblBlcmlvZDsKLQl1OCBNZWRQZXJpb2Q7Ci0JdTggcnN2ZDMwOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHNjYW5fZW5fcGFybSB7Ci0JdTggRW47Ci19IF9fcGFja2VkOwotCi0vKiAgQlRfUFdSICovCi0jZGVmaW5lIFNFVF9IMkNDTURfQlRfUFdSX0lEWChfX3BIMkNDbWQsIF9fVmFsdWUpCQkJCQkJCVNFVF9CSVRTX1RPX0xFXzFCWVRFXzhCSVQoX19wSDJDQ21kLCAwLCA4LCBfX1ZhbHVlKQotCi0vKiAgQlRfRldfUEFUQ0ggKi8KLSNkZWZpbmUgU0VUX0gyQ0NNRF9CVF9GV19QQVRDSF9FTkFCTEUoX19wSDJDQ21kLCBfX1ZhbHVlKQkJCQkJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wSDJDQ21kLCAwLCA4LCBfX1ZhbHVlKSAvKglTRVRfQklUU19UT19MRV8xQllURShfX3BIMkNDbWQsIDAsIDgsIF9fVmFsdWUpICovCi0jZGVmaW5lIFNFVF9IMkNDTURfQlRfRldfUEFUQ0hfU0laRShfX3BIMkNDbWQsIF9fVmFsdWUpCQkJCQkJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX19wSDJDQ21kLCA4LCAxNiwgX19WYWx1ZSkgLyoJU0VUX0JJVFNfVE9fTEVfMkJZVEUoKF9fcEgyQ0NtZCkrMSwgMCwgMTYsIF9fVmFsdWUpICovCi0KLXN0cnVjdCBsb3dwd3JfbHBzX3Bhcm17Ci0JdTggYmNuX2NvdW50OjQ7Ci0JdTggdGJfYmNuX3RocmVzaG9sZDozOwotCXU4IGVuYWJsZToxOwotCXU4IGJjbl9pbnRlcnZhbDsKLQl1OCBkcm9wX3RocmVzaG9sZDsKLQl1OCBtYXhfZWFybHlfcGVyaW9kOwotCXU4IG1heF9iY25fdGltZW91dF9wZXJpb2Q7Ci19IF9fcGFja2VkOwotCi0KLS8qICBob3N0IG1lc3NhZ2UgdG8gZmlybXdhcmUgY21kICovCi12b2lkIHJ0bDg3MjNhX3NldF9Gd1B3ck1vZGVfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IE1vZGUpOwotdm9pZCBydGw4NzIzYV9zZXRfRndKb2luQnNzUmVwb3J0X2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBtc3RhdHVzKTsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLXZvaWQgcnRsODcyM2Ffc2V0X0JUQ29leF9BUF9tb2RlX0Z3UnN2ZFBrdF9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0jZWxzZQotI2RlZmluZSBydGw4NzIzYV9zZXRfQlRDb2V4X0FQX21vZGVfRndSc3ZkUGt0X2NtZChwYWRhcHRlcikgZG8ge30gd2hpbGUoMCkKLSNlbmRpZgotaW50IHJ0bDg3MjNhX3NldF9yc3NpX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgcGFyYW0pOwotaW50IHJ0bDg3MjNhX3NldF9yYWlkX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbWFzaywgdTggYXJnKTsKLXZvaWQgcnRsODcyM2FfYWRkX3JhdGVhdGlkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBiaXRtYXAsIHU4IGFyZywgdTggcnNzaV9sZXZlbCk7Ci0KLWludCBGaWxsSDJDQ21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IEVsZW1lbnRJRCwgdTMyIENtZExlbiwgdTggKnBDbWRCdWZmZXIpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2RtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjM2ZTguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2RtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRMODcyM0FfRE1fSF9fCi0jZGVmaW5lIF9fUlRMODcyM0FfRE1fSF9fCi0vKiAgKi8KLS8qICBEZXNjcmlwdGlvbjogKi8KLS8qICAqLwotLyogIFRoaXMgZmlsZSBpcyBmb3IgODcyM0EgZHluYW1pYyBtZWNoYW5pc20gb25seSAqLwotLyogICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBEWU5BTUlDX0ZVTkNfQlQgQklUKDApCi0KLWVudW17Ci0JVVBfTElOSywKLQlET1dOX0xJTkssCi19OwotLyogICovCi0vKiAgc3RydWN0dXJlIGFuZCBkZWZpbmUgKi8KLS8qICAqLwotCi0vKiAgZHVwbGljYXRlIGNvZGUsd2lsbCBtb3ZlIHRvIE9ETSAjIyMjIyMjIyMgKi8KLSNkZWZpbmUgSVFLX01BQ19SRUdfTlVNCQk0Ci0jZGVmaW5lIElRS19BRERBX1JFR19OVU0JCTE2Ci0jZGVmaW5lIElRS19CQl9SRUdfTlVNCQkJOQotI2RlZmluZSBIUF9USEVSTUFMX05VTQkJOAotLyogIGR1cGxpY2F0ZSBjb2RlLHdpbGwgbW92ZSB0byBPRE0gIyMjIyMjIyMjICovCi1zdHJ1Y3QgZG1fcHJpdiB7Ci0JdTMyCUluaXRPRE1GbGFnOwotCi0JLyogIFVwcGVyIGFuZCBMb3dlciBTaWduYWwgdGhyZXNob2xkIGZvciBSYXRlIEFkYXB0aXZlKi8KLQlpbnQJVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JaW50CVVuZGVjb3JhdGVkU21vb3RoZWRDQ0s7Ci0JaW50CUVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JaW50CUVudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JaW50CU1pblVuZGVjb3JhdGVkUFdEQkZvckRNOwotCWludAlMYXN0TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE07Ci0KLQlzMzIJVW5kZWNvcmF0ZWRTbW9vdGhlZEJlYWNvbjsKLQkjaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi0JczMyIEJUX0VudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JczMyIEJUX0VudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7Ci0JI2VuZGlmCi0KLQkvKiBmb3IgSGlnaCBQb3dlciAqLwotCXU4IER5bmFtaWNUeEhpZ2hQb3dlckx2bDsvKiBBZGQgYnkgSmFja2VuIFR4IFBvd2VyIENvbnRyb2wgZm9yIE5lYXIvRmFyIFJhbmdlIDIwMDgvMDMvMDYgKi8KLQotCS8qIGZvciB0eCBwb3dlciB0cmFja2luZyAqLwotCXU4CWJUWFBvd2VyVHJhY2tpbmc7Ci0JdTgJVFhQb3dlcmNvdW50OwotCXU4CWJUWFBvd2VyVHJhY2tpbmdJbml0OwotCXU4CVR4UG93ZXJUcmFja0NvbnRyb2w7CS8qIGZvciBtcCBtb2RlLCB0dXJuIG9mZiB0eHB3cnRyYWNraW5nIGFzIGRlZmF1bHQgKi8KLQl1OAlUTV9UcmlnZ2VyOwotCi0JdTgJVGhlcm1hbE1ldGVyWzJdOwkJCQkvKiAgVGhlcm1hbE1ldGVyLCBpbmRleCAwIGZvciBSRklDMCwgYW5kIDEgZm9yIFJGSUMxICovCi0JdTgJVGhlcm1hbFZhbHVlOwotCXU4CVRoZXJtYWxWYWx1ZV9MQ0s7Ci0JdTgJVGhlcm1hbFZhbHVlX0lRSzsKLQl1OAlUaGVybWFsVmFsdWVfRFBLOwotCi0JdTgJYlJmUGlFbmFibGU7Ci0KLQkvKiBmb3IgQVBLICovCi0JdTMyCUFQS291dHB1dFsyXVsyXTsJLyogcGF0aCBBL0I7IG91dHB1dDFfMWEvb3V0cHV0MV8yYSAqLwotCXU4CWJBUEtkb25lOwotCXU4CWJBUEtUaGVybWFsTWV0ZXJJZ25vcmU7Ci0JdTgJYkRQZG9uZTsKLQl1OAliRFBQYXRoQU9LOwotCXU4CWJEUFBhdGhCT0s7Ci0KLQkvKiBmb3IgSVFLICovCi0JdTMyCVJlZ0MwNDsKLQl1MzIJUmVnODc0OwotCXUzMglSZWdDMDg7Ci0JdTMyCVJlZ0I2ODsKLQl1MzIJUmVnQjZDOwotCXUzMglSZWc4NzA7Ci0JdTMyCVJlZzg2MDsKLQl1MzIJUmVnODY0OwotCXUzMglBRERBX2JhY2t1cFtJUUtfQUREQV9SRUdfTlVNXTsKLQl1MzIJSVFLX01BQ19iYWNrdXBbSVFLX01BQ19SRUdfTlVNXTsKLQl1MzIJSVFLX0JCX2JhY2t1cF9yZWNvdmVyWzldOwotCXUzMglJUUtfQkJfYmFja3VwW0lRS19CQl9SRUdfTlVNXTsKLQl1OAlQb3dlckluZGV4X2JhY2t1cFs2XTsKLQotCXU4CWJDQ0tpbkNIMTQ7Ci0KLQl1OAlDQ0tfaW5kZXg7Ci0JdTgJT0ZETV9pbmRleFsyXTsKLQotCXU4CWJEb25lVHhwb3dlcjsKLQl1OAlDQ0tfaW5kZXhfSFA7Ci0JdTgJT0ZETV9pbmRleF9IUFsyXTsKLQl1OAlUaGVybWFsVmFsdWVfSFBbSFBfVEhFUk1BTF9OVU1dOwotCXU4CVRoZXJtYWxWYWx1ZV9IUF9pbmRleDsKLQotCS8qIGZvciBUeFB3clRyYWNraW5nICovCi0JczMyCVJlZ0U5NDsKLQlzMzIgICAgIFJlZ0U5QzsKLQlzMzIJUmVnRUI0OwotCXMzMglSZWdFQkM7Ci0KLQl1MzIJVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tDbnQ7CS8qIGNvc2EgYWRkIGZvciBkZWJ1ZyAqLwotCi0JdTMyCXBydl90cmFmZmljX2lkeDsgLyogIGVkY2EgdHVyYm8gKi8KLQotCXMzMglPRkRNX1BrdF9DbnQ7Ci0JdTgJUlNTSV9TZWxlY3Q7Ci0vKgl1OAlESUdfRHluYW1pY19NSU4gOyAqLwotLyogIGR1cGxpY2F0ZSBjb2RlLHdpbGwgbW92ZSB0byBPRE0gIyMjIyMjIyMjICovCi0JLyogIEFkZCBmb3IgUmVhZGluZyBJbml0aWFsIERhdGEgUmF0ZSBTRUwgUmVnaXN0ZXIgMHg0ODQgZHVyaW5nIHdhdGNoZG9nLiBVc2luZyBmb3IgZmlsbCB0eCBkZXNjLiAyMDExLjMuMjEgYnkgVGhvbWFzICovCi0JdTgJSU5JREFUQV9SQVRFWzMyXTsKLX07Ci0KLQotLyogICovCi0vKiAgZnVuY3Rpb24gcHJvdG90eXBlICovCi0vKiAgKi8KLQotdm9pZCBydGw4NzIzYV9pbml0X2RtX3ByaXYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnRsODcyM2FfSW5pdEhhbERtKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9IYWxEbVdhdGNoRG9nKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9oYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9oYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdhMGZkNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfaGFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRMODcyM0FfSEFMX0hfXwotI2RlZmluZSBfX1JUTDg3MjNBX0hBTF9IX18KLQotI2luY2x1ZGUgInJ0bDg3MjNhX3NwZWMuaCIKLSNpbmNsdWRlICJydGw4NzIzYV9wZy5oIgotI2luY2x1ZGUgIkhhbDg3MjNBUGh5UmVnLmgiCi0jaW5jbHVkZSAiSGFsODcyM0FQaHlDZmcuaCIKLSNpbmNsdWRlICJydGw4NzIzYV9yZi5oIgotI2luY2x1ZGUgInJ0bDg3MjNhX2J0X2ludGYuaCIKLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLSNpbmNsdWRlICJydGw4NzIzYV9idC1jb2V4aXN0LmgiCi0jZW5kaWYKLSNpbmNsdWRlICJydGw4NzIzYV9kbS5oIgotI2luY2x1ZGUgInJ0bDg3MjNhX3JlY3YuaCIKLSNpbmNsdWRlICJydGw4NzIzYV94bWl0LmgiCi0jaW5jbHVkZSAicnRsODcyM2FfY21kLmgiCi0jaW5jbHVkZSAicnRsODcyM2Ffc3Jlc2V0LmgiCi0jaW5jbHVkZSAicnR3X2VmdXNlLmgiCi0jaW5jbHVkZSAicnR3X2VlcHJvbS5oIgotCi0jaW5jbHVkZSAib2RtX3ByZWNvbXAuaCIKLSNpbmNsdWRlICJvZG0uaCIKLQotCi0vKiAyVE9ETzogV2Ugc2hvdWxkIGRlZmluZSA4MTkyUyBmaXJtd2FyZSByZWxhdGVkIG1hY3JvIHNldHRpbmdzIGhlcmUhISAqLwotI2RlZmluZSBSVEw4MTlYX0RFRkFVTFRfUkZfVFlQRQkJCVJGXzFUMlIKLSNkZWZpbmUgUlRMODE5WF9UT1RBTF9SRl9QQVRICQkJCTIKLQotLyogICovCi0vKgkJUlRMODcyM1MgRnJvbSBoZWFkZXIgKi8KLS8qICAqLwotCi0vKiAgRncgQXJyYXkgKi8KLSNkZWZpbmUgUnRsODcyM19Gd0ltYWdlQXJyYXkJCQkJUnRsODcyM1VGd0ltZ0FycmF5Ci0jZGVmaW5lIFJ0bDg3MjNfRndVTUNCQ3V0SW1hZ2VBcnJheVdpdGhCVAkJUnRsODcyM1VGd1VNQ0JDdXRJbWdBcnJheVdpdGhCVAotI2RlZmluZSBSdGw4NzIzX0Z3VU1DQkN1dEltYWdlQXJyYXlXaXRob3V0QlQJUnRsODcyM1VGd1VNQ0JDdXRJbWdBcnJheVdpdGhvdXRCVAotCi0jZGVmaW5lIFJ0bDg3MjNfSW1nQXJyYXlMZW5ndGgJCQkJUnRsODcyM1VJbWdBcnJheUxlbmd0aAotI2RlZmluZSBSdGw4NzIzX1VNQ0JDdXRJbWdBcnJheVdpdGhCVExlbmd0aAkJUnRsODcyM1VVTUNCQ3V0SW1nQXJyYXlXaXRoQlRMZW5ndGgKLSNkZWZpbmUgUnRsODcyM19VTUNCQ3V0SW1nQXJyYXlXaXRob3V0QlRMZW5ndGgJUnRsODcyM1VVTUNCQ3V0SW1nQXJyYXlXaXRob3V0QlRMZW5ndGgKLQotI2RlZmluZSBSdGw4NzIzX1BIWV9SRUdfQXJyYXlfUEcJCQlSdGw4NzIzVVBIWV9SRUdfQXJyYXlfUEcKLSNkZWZpbmUgUnRsODcyM19QSFlfUkVHX0FycmF5X1BHTGVuZ3RoCQlSdGw4NzIzVVBIWV9SRUdfQXJyYXlfUEdMZW5ndGgKLQotI2RlZmluZSBSdGw4NzIzX0Z3VU1DQkN1dE1QSW1hZ2VBcnJheQkJUnRsODcyM1NGd1VNQ0JDdXRNUEltZ0FyCi0jZGVmaW5lIFJ0bDg3MjNfVU1DQkN1dE1QSW1nQXJyYXlMZW5ndGgJCVJ0bDg3MjNTVU1DQkN1dE1QSW1nQXJyYXlMZW5ndGgKLQotI2RlZmluZSBEUlZJTkZPX1NaCQkJCTQgLyogIHVuaXQgaXMgOGJ5dGVzICovCi0jZGVmaW5lIFBhZ2VOdW1fMTI4KF9MZW4pCQkodTMyKSgoKF9MZW4pPj43KSArICgoX0xlbikmMHg3RiA/IDE6MCkpCi0KLSNkZWZpbmUgRldfODcyM0FfU0laRQkJCTB4ODAwMAotI2RlZmluZSBGV184NzIzQV9TVEFSVF9BRERSRVNTCTB4MTAwMAotI2RlZmluZSBGV184NzIzQV9FTkRfQUREUkVTUwkJMHgxRkZGIC8qIDB4NUZGRiAqLwotCi0jZGVmaW5lIE1BWF9QQUdFX1NJWkUJCQk0MDk2CS8qICBAIHBhZ2UgOiA0ayBieXRlcyAqLwotCi0jZGVmaW5lIElTX0ZXX0hFQURFUl9FWElTVChfcEZ3SGRyKQkoKGxlMTZfdG9fY3B1KF9wRndIZHItPlNpZ25hdHVyZSkmMHhGRkYwKSA9PSAweDkyQzAgfHxcCi0JCQkJCQkJCQkobGUxNl90b19jcHUoX3BGd0hkci0+U2lnbmF0dXJlKSYweEZGRjApID09IDB4ODhDMCB8fFwKLQkJCQkJCQkJCShsZTE2X3RvX2NwdShfcEZ3SGRyLT5TaWduYXR1cmUpJjB4RkZGMCkgPT0gMHgyMzAwKQotCi0vKiAgKi8KLS8qICBUaGlzIHN0cnVjdHVyZSBtdXN0IGJlIGNhcmVkIGJ5dGUtb3JkZXJpbmcgKi8KLS8qICAqLwotLyogIEFkZGVkIGJ5IHR5bmxpLiAyMDA5LjEyLjA0LiAqLwotc3RydWN0IHJ0Xzg3MjNhX2Zpcm13YXJlX2hkciB7Ci0JLyogIDgtYnl0ZSBhbGlubWVudCByZXF1aXJlZCAqLwotCi0JLyogIExPTkcgV09SRCAwIC0tLS0gKi8KLQlfX2xlMTYJCVNpZ25hdHVyZTsgIC8qCi0JCQkJICAgICAqIDkyQzA6IHRlc3QgY2hpcDsgOTJDLCA4OEMwOiB0ZXN0IGNoaXA7Ci0JCQkJICAgICAqIDg4QzE6IE1QIEEtY3V0OyA5MkMxOiBNUCBBLWN1dAotCQkJCSAgICAgKi8KLQl1OAkJQ2F0ZWdvcnk7CS8qICBBUC9OSUMgYW5kIFVTQi9QQ0kgKi8KLQl1OAkJRnVuY3Rpb247CS8qICBSZXNlcnZlZCBmb3IgZGlmZmVyZW50IEZXIGZ1bmN0aW9uIGluZGNhdGlvbiwgZm9yIGZ1cnRoZXIgdXNlIHdoZW4gZHJpdmVyIG5lZWRzIHRvIGRvd25sb2FkIGRpZmZlcmVudCBGVyBpbiBkaWZmZXJlbnQgY29uZGl0aW9ucyAqLwotCV9fbGUxNgkJVmVyc2lvbjsJCS8qICBGVyBWZXJzaW9uICovCi0JdTgJCVN1YnZlcnNpb247CS8qICBGVyBTdWJ2ZXJzaW9uLCBkZWZhdWx0IDB4MDAgKi8KLQl1OAkJUnN2ZDE7Ci0KLQotCS8qICBMT05HIFdPUkQgMSAtLS0tICovCi0JdTgJCU1vbnRoOwkvKiAgUmVsZWFzZSB0aW1lIE1vbnRoIGZpZWxkICovCi0JdTgJCURhdGU7CS8qICBSZWxlYXNlIHRpbWUgRGF0ZSBmaWVsZCAqLwotCXU4CQlIb3VyOwkvKiAgUmVsZWFzZSB0aW1lIEhvdXIgZmllbGQgKi8KLQl1OAkJTWludXRlOwkvKiAgUmVsZWFzZSB0aW1lIE1pbnV0ZSBmaWVsZCAqLwotCV9fbGUxNgkJUmFtQ29kZVNpemU7CS8qICBUaGUgc2l6ZSBvZiBSQU0gY29kZSAqLwotCV9fbGUxNgkJUnN2ZDI7Ci0KLQkvKiAgTE9ORyBXT1JEIDIgLS0tLSAqLwotCV9fbGUzMgkJU3ZuSWR4OwkvKiAgVGhlIFNWTiBlbnRyeSBpbmRleCAqLwotCV9fbGUzMgkJUnN2ZDM7Ci0KLQkvKiAgTE9ORyBXT1JEIDMgLS0tLSAqLwotCV9fbGUzMgkJUnN2ZDQ7Ci0JX19sZTMyCQlSc3ZkNTsKLX07Ci0KLSNkZWZpbmUgRFJJVkVSX0VBUkxZX0lOVF9USU1FCQkweDA1Ci0jZGVmaW5lIEJDTl9ETUFfQVRJTUVfSU5UX1RJTUUJCTB4MDIKLQotCi0vKiAgQkssIEJFLCBWSSwgVk8sIEhDQ0EsIE1BTkFHRU1FTlQsIENPTU1BTkQsIEhJR0gsIEJFQUNPTi4gKi8KLSNkZWZpbmUgTUFYX1RYX1FVRVVFCQk5Ci0KLSNkZWZpbmUgVFhfU0VMRV9IUQkJCUJJVCgwKQkJLyogIEhpZ2ggUXVldWUgKi8KLSNkZWZpbmUgVFhfU0VMRV9MUQkJCUJJVCgxKQkJLyogIExvdyBRdWV1ZSAqLwotI2RlZmluZSBUWF9TRUxFX05RCQkJQklUKDIpCQkvKiAgTm9ybWFsIFF1ZXVlICovCi0KLS8qICBOb3RlOiBXZSB3aWxsIGRpdmlkZSBudW1iZXIgb2YgcGFnZSBlcXVhbGx5IGZvciBlYWNoIHF1ZXVlIG90aGVyIHRoYW4gcHVibGljIHF1ZXVlISAqLwotI2RlZmluZSBUWF9UT1RBTF9QQUdFX05VTUJFUgkweEY4Ci0jZGVmaW5lIFRYX1BBR0VfQk9VTkRBUlkJCShUWF9UT1RBTF9QQUdFX05VTUJFUiArIDEpCi0KLS8qICBGb3IgTm9ybWFsIENoaXAgU2V0dGluZyAqLwotLyogIChIUFEgKyBMUFEgKyBOUFEgKyBQVUJRKSBzaGFsbCBiZSBUWF9UT1RBTF9QQUdFX05VTUJFUiAqLwotI2RlZmluZSBOT1JNQUxfUEFHRV9OVU1fUFVCUQkweEU3Ci0jZGVmaW5lIE5PUk1BTF9QQUdFX05VTV9IUFEJCTB4MEMKLSNkZWZpbmUgTk9STUFMX1BBR0VfTlVNX0xQUQkJMHgwMgotI2RlZmluZSBOT1JNQUxfUEFHRV9OVU1fTlBRCQkweDAyCi0KLS8qICBGb3IgVGVzdCBDaGlwIFNldHRpbmcgKi8KLS8qICAoSFBRICsgTFBRICsgUFVCUSkgc2hhbGwgYmUgVFhfVE9UQUxfUEFHRV9OVU1CRVIgKi8KLSNkZWZpbmUgVEVTVF9QQUdFX05VTV9QVUJRCQkweDdFCi0KLS8qICBGb3IgVGVzdCBDaGlwIFNldHRpbmcgKi8KLSNkZWZpbmUgV01NX1RFU1RfVFhfVE9UQUxfUEFHRV9OVU1CRVIJMHhGNQotI2RlZmluZSBXTU1fVEVTVF9UWF9QQUdFX0JPVU5EQVJZCQkoV01NX1RFU1RfVFhfVE9UQUxfUEFHRV9OVU1CRVIgKyAxKSAvKiBGNiAqLwotCi0jZGVmaW5lIFdNTV9URVNUX1BBR0VfTlVNX1BVQlEJCTB4QTMKLSNkZWZpbmUgV01NX1RFU1RfUEFHRV9OVU1fSFBRCQkweDI5Ci0jZGVmaW5lIFdNTV9URVNUX1BBR0VfTlVNX0xQUQkJMHgyOQotCi0vKiAgTm90ZTogRm9yIE5vcm1hbCBDaGlwIFNldHRpbmcsIG1vZGlmeSBsYXRlciAqLwotI2RlZmluZSBXTU1fTk9STUFMX1RYX1RPVEFMX1BBR0VfTlVNQkVSCTB4RjUKLSNkZWZpbmUgV01NX05PUk1BTF9UWF9QQUdFX0JPVU5EQVJZCQkoV01NX1RFU1RfVFhfVE9UQUxfUEFHRV9OVU1CRVIgKyAxKSAvKiBGNiAqLwotCi0jZGVmaW5lIFdNTV9OT1JNQUxfUEFHRV9OVU1fUFVCUQkweEIwCi0jZGVmaW5lIFdNTV9OT1JNQUxfUEFHRV9OVU1fSFBRCQkweDI5Ci0jZGVmaW5lIFdNTV9OT1JNQUxfUEFHRV9OVU1fTFBRCQkweDFDCi0jZGVmaW5lIFdNTV9OT1JNQUxfUEFHRV9OVU1fTlBRCQkweDFDCi0KLQotLyogICovCi0vKglDaGlwIHNwZWNpZmljICovCi0vKiAgKi8KLSNkZWZpbmUgQ0hJUF9CT05ESU5HX0lERU5USUZJRVIoX3ZhbHVlKQkoKChfdmFsdWUpPj4yMikmMHgzKQotI2RlZmluZSBDSElQX0JPTkRJTkdfOTJDXzFUMlIJCQkweDEKLSNkZWZpbmUgQ0hJUF9CT05ESU5HXzg4Q19VU0JfTUNBUkQJCTB4MgotI2RlZmluZSBDSElQX0JPTkRJTkdfODhDX1VTQl9IUAkJCTB4MQotCi0jaW5jbHVkZSAiSGFsVmVyRGVmLmgiCi0jaW5jbHVkZSAiaGFsX2NvbS5oIgotCi0vKiAgKi8KLS8qCUNoYW5uZWwgUGxhbiAqLwotLyogICovCi1lbnVtIENoYW5uZWxQbGFuCi17Ci0JQ0hQTF9GQ0MJPSAwLAotCUNIUExfSUMJCT0gMSwKLQlDSFBMX0VUU0kJPSAyLAotCUNIUExfU1BBSU4JPSAzLAotCUNIUExfRlJBTkNFCT0gNCwKLQlDSFBMX01LSwk9IDUsCi0JQ0hQTF9NS0sxCT0gNiwKLQlDSFBMX0lTUkFFTAk9IDcsCi0JQ0hQTF9URUxFQwk9IDgsCi0JQ0hQTF9HTE9CQUwJPSA5LAotCUNIUExfV09STEQJPSAxMCwKLX07Ci0KLSNkZWZpbmUgRUZVU0VfUkVBTF9DT05URU5UX0xFTgkJNTEyCi0jZGVmaW5lIEVGVVNFX01BUF9MRU4JCQkJMTI4Ci0jZGVmaW5lIEVGVVNFX01BWF9TRUNUSU9OCQkJMTYKLSNkZWZpbmUgRUZVU0VfSUNfSURfT0ZGU0VUCQkJNTA2CS8qIEZvciBzb21lIGluZmVyaW9yaXR5IElDIHB1cnBvc2UuIGFkZGVkIGJ5IFJvZ2VyLCAyMDA5LjA5LjAyLiAqLwotI2RlZmluZSBBVkFJTEFCTEVfRUZVU0VfQUREUihhZGRyKQkoYWRkciA8IEVGVVNFX1JFQUxfQ09OVEVOVF9MRU4pCi0vKiAgKi8KLS8qICA8Um9nZXJfTm90ZXM+ICovCi0vKiAgVG8gcHJldmVudCBvdXQgb2YgYm91bmRhcnkgcHJvZ3JhbW1pbmcgY2FzZSwgKi8KLS8qICBsZWF2ZSAxYnl0ZSBhbmQgcHJvZ3JhbSBmdWxsIHNlY3Rpb24gKi8KLS8qICA5Ynl0ZXMgKyAxYnl0ICsgNWJ5dGVzIGFuZCBwcmUgMWJ5dGUuICovCi0vKiAgRm9yIHdvcnN0IGNhc2U6ICovCi0vKiAgfCAxYnl0ZXwtLS0tOGJ5dGVzLS0tLXwxYnl0ZXwtLTVieXRlcy0tfCAqLwotLyogIHwgICAgICAgICB8ICAgICAgICAgICAgUmVzZXJ2ZWQoMTRieXRlcykJICAgICAgfCAqLwotLyogICovCi0KLS8qICBQRyBkYXRhIGV4Y2x1ZGUgaGVhZGVyLCBkdW1teSA2IGJ5dGVzIGZyb20gQ1AgdGVzdCBhbmQgcmVzZXJ2ZWQgMWJ5dGUuICovCi0jZGVmaW5lIEVGVVNFX09PQl9QUk9URUNUX0JZVEVTCQkJMTUKLQotI2RlZmluZSBFRlVTRV9SRUFMX0NPTlRFTlRfTEVOXzg3MjNBCTUxMgotI2RlZmluZSBFRlVTRV9NQVBfTEVOXzg3MjNBCQkJCTI1NgotI2RlZmluZSBFRlVTRV9NQVhfU0VDVElPTl84NzIzQQkJCTMyCi0KLS8qICAqLwotLyoJCQlFRlVTRSBmb3IgQlQgZGVmaW5pdGlvbiAqLwotLyogICovCi0jZGVmaW5lIEVGVVNFX0JUX1JFQUxfQkFOS19DT05URU5UX0xFTgk1MTIKLSNkZWZpbmUgRUZVU0VfQlRfUkVBTF9DT05URU5UX0xFTgkJMTUzNgkvKiAgNTEyKjMgKi8KLSNkZWZpbmUgRUZVU0VfQlRfTUFQX0xFTgkJCQkxMDI0CS8qICAxayBieXRlcyAqLwotI2RlZmluZSBFRlVTRV9CVF9NQVhfU0VDVElPTgkJCTEyOAkJLyogIDEwMjQvOCAqLwotCi0jZGVmaW5lIEVGVVNFX1BST1RFQ1RfQllURVNfQkFOSwkJMTYKLQotLyogICovCi0vKiAgPFJvZ2VyX05vdGVzPiBGb3IgUlRMODcyMyBXaUZpL0JUL0dQUyBtdWx0aS1mdW5jdGlvbiBjb25maWd1cmF0aW9uLiAyMDEwLjEwLjA2LiAqLwotLyogICovCi1lbnVtIFJUX01VTFRJX0ZVTkMgewotCVJUX01VTFRJX0ZVTkNfTk9ORSA9IDB4MDAsCi0JUlRfTVVMVElfRlVOQ19XSUZJID0gMHgwMSwKLQlSVF9NVUxUSV9GVU5DX0JUID0gMHgwMiwKLQlSVF9NVUxUSV9GVU5DX0dQUyA9IDB4MDQsCi19OwotCi0vKiAgKi8KLS8qICA8Um9nZXJfTm90ZXM+IEZvciBSVEw4NzIzIFdpRmkgUERuL0dQSU8gcG9sYXJpdHkgY29udHJvbCBjb25maWd1cmF0aW9uLiAyMDEwLjEwLjA4LiAqLwotLyogICovCi1lbnVtIFJUX1BPTEFSSVRZX0NUTCB7Ci0JUlRfUE9MQVJJVFlfTE9XX0FDVCA9IDAsCi0JUlRfUE9MQVJJVFlfSElHSF9BQ1QgPSAxLAotfTsKLQotLyogIEZvciBSVEw4NzIzIHJlZ3VsYXRvciBtb2RlLiBieSB0eW5saS4gMjAxMS4wMS4xNC4gKi8KLWVudW0gUlRfUkVHVUxBVE9SX01PREUgewotCVJUX1NXSVRDSElOR19SRUdVTEFUT1IgPSAwLAotCVJUX0xET19SRUdVTEFUT1IgPSAxLAotfTsKLQotLyogIERlc2NyaXB0aW9uOiBEZXRlcm1pbmUgdGhlIHR5cGVzIG9mIEMySCBldmVudHMgdGhhdCBhcmUgdGhlIHNhbWUgaW4gZHJpdmVyIGFuZCBGdy4gKi8KLS8qICBGaXNydCBjb25zdHJ1Y3RlZCBieSB0eW5saS4gMjAwOS4xMC4wOS4gKi8KLWVudW0gewotCUMySF9EQkcgPSAwLAotCUMySF9UU0YgPSAxLAotCUMySF9BUF9SUFRfUlNQID0gMiwKLQlDMkhfQ0NYX1RYX1JQVCA9IDMsCS8qICBUaGUgRlcgbm90aWZ5IHRoZSByZXBvcnQgb2YgdGhlIHNwZWNpZmljIHR4IHBhY2tldC4gKi8KLQlDMkhfQlRfUlNTSSA9IDQsCi0JQzJIX0JUX09QX01PREUgPSA1LAotCUMySF9FWFRfUkFfUlBUID0gNiwKLQlDMkhfSFdfSU5GT19FWENIID0gMTAsCi0JQzJIX0MySF9IMkNfVEVTVCA9IDExLAotCUMySF9CVF9JTkZPID0gMTIsCi0JQzJIX0JUX01QX0lORk8gPSAxNSwKLQlNQVhfQzJIRVZFTlQKLX07Ci0KLXN0cnVjdCBoYWxfZGF0YV84NzIzYSB7Ci0Jc3RydWN0IGhhbF92ZXJzaW9uCQlWZXJzaW9uSUQ7Ci0JZW51bSBydF9jdXN0b21lcl9pZCBDdXN0b21lcklEOwotCi0JdTE2CUZpcm13YXJlVmVyc2lvbjsKLQl1MTYJRmlybXdhcmVWZXJzaW9uUmV2OwotCXUxNglGaXJtd2FyZVN1YlZlcnNpb247Ci0JdTE2CUZpcm13YXJlU2lnbmF0dXJlOwotCi0JLyogY3VycmVudCBXSUZJX1BIWSB2YWx1ZXMgKi8KLQl1MzIJUmVjZWl2ZUNvbmZpZzsKLQllbnVtIFdJUkVMRVNTX01PREUJCUN1cnJlbnRXaXJlbGVzc01vZGU7Ci0JZW51bSBodF9jaGFubmVsX3dpZHRoCUN1cnJlbnRDaGFubmVsQlc7Ci0JdTgJQ3VycmVudENoYW5uZWw7Ci0JdTgJbkN1cjQwTWh6UHJpbWVTQzsvKiAgQ29udHJvbCBjaGFubmVsIHN1Yi1jYXJyaWVyICovCi0KLQl1MTYJQmFzaWNSYXRlU2V0OwotCi0JLyogcmZfY3RybCAqLwotCXU4CXJmX3R5cGU7Ci0JdTgJTnVtVG90YWxSRlBhdGg7Ci0KLQl1OAlCb2FyZFR5cGU7Ci0JdTgJQ3J5c3RhbENhcDsKLQkvKiAgKi8KLQkvKiAgRUVQUk9NIHNldHRpbmcuICovCi0JLyogICovCi0JdTgJRUVQUk9NVmVyc2lvbjsKLQl1OAlFRVBST01DdXN0b21lcklEOwotCXU4CUVFUFJPTVN1YkN1c3RvbWVySUQ7Ci0JdTgJRUVQUk9NUmVndWxhdG9yeTsKLQl1OAlFRVBST01UaGVybWFsTWV0ZXI7Ci0JdTgJRUVQUk9NQmx1ZXRvb3RoQ29leGlzdDsKLQl1OAlFRVBST01CbHVldG9vdGhUeXBlOwotCXU4CUVFUFJPTUJsdWV0b290aEFudE51bTsKLQl1OAlFRVBST01CbHVldG9vdGhBbnRJc29sYXRpb247Ci0JdTgJRUVQUk9NQmx1ZXRvb3RoUmFkaW9TaGFyZWQ7Ci0KLQl1OAliVFhQb3dlckRhdGFSZWFkRnJvbUVFUE9STTsKLQl1OAliQVBLVGhlcm1hbE1ldGVySWdub3JlOwotCi0JdTgJYklRS0luaXRpYWxpemVkOwotCXU4CWJBbnRlbm5hRGV0ZWN0ZWQ7Ci0KLQl1OAlUeFB3ckxldmVsQ2NrW1JGX1BBVEhfTUFYXVtDSEFOTkVMX01BWF9OVU1CRVJdOwotCXU4CVR4UHdyTGV2ZWxIVDQwXzFTW1JGX1BBVEhfTUFYXVtDSEFOTkVMX01BWF9OVU1CRVJdOwkvKiAgRm9yIEhUIDQwTUhaIHB3ciAqLwotCXU4CVR4UHdyTGV2ZWxIVDQwXzJTW1JGX1BBVEhfTUFYXVtDSEFOTkVMX01BWF9OVU1CRVJdOwkvKiAgRm9yIEhUIDQwTUhaIHB3ciAqLwotCXU4CVR4UHdySHQyMERpZmZbUkZfUEFUSF9NQVhdW0NIQU5ORUxfTUFYX05VTUJFUl07LyogIEhUIDIwPC0+NDAgUHdyIGRpZmYgKi8KLQl1OAlUeFB3ckxlZ2FjeUh0RGlmZltSRl9QQVRIX01BWF1bQ0hBTk5FTF9NQVhfTlVNQkVSXTsvKiAgRm9yIEhUPC0+bGVnYWN5IHB3ciBkaWZmICovCi0JLyogIEZvciBwb3dlciBncm91cCAqLwotCXU4CVB3ckdyb3VwSFQyMFtSRl9QQVRIX01BWF1bQ0hBTk5FTF9NQVhfTlVNQkVSXTsKLQl1OAlQd3JHcm91cEhUNDBbUkZfUEFUSF9NQVhdW0NIQU5ORUxfTUFYX05VTUJFUl07Ci0KLQl1OAlMZWdhY3lIVFR4UG93ZXJEaWZmOy8qICBMZWdhY3kgdG8gSFQgcmF0ZSBwb3dlciBkaWZmICovCi0KLQkvKiAgUmVhZC93cml0ZSBhcmUgYWxsb3cgZm9yIGZvbGxvd2luZyBoYXJkd2FyZSBpbmZvcm1hdGlvbiB2YXJpYWJsZXMgKi8KLQl1OAlmcmFtZXN5bmM7Ci0JdTMyCWZyYW1lc3luY0MzNDsKLQl1OAlmcmFtZXN5bmNNb25pdG9yOwotCXU4CXB3ckdyb3VwQ250OwotCXUzMglNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFs3XVsxNl07Ci0JdTMyCUNDS1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0OwotCi0JdTMyCUFudGVubmFUeFBhdGg7CQkJCQkvKiAgQW50ZW5uYSBwYXRoIFR4ICovCi0JdTMyCUFudGVubmFSeFBhdGg7CQkJCQkvKiAgQW50ZW5uYSBwYXRoIFJ4ICovCi0JdTgJRXh0ZXJuYWxQQTsKLQotCXU4CWJMZWRPcGVuRHJhaW47IC8qICBTdXBwb3J0IE9wZW4tZHJhaW4gYXJyYW5nZW1lbnQgZm9yIGNvbnRyb2xsaW5nIHRoZSBMRUQuIEFkZGVkIGJ5IFJvZ2VyLCAyMDA5LjEwLjE2LiAqLwotCi0JdTgJYjF4MVJlY3ZDb21iaW5lOwkvKiAgZm9yIDFUMVIgcmVjZWl2ZSBjb21iaW5pbmcgKi8KLQotCS8qICBGb3IgRURDQSBUdXJibyBtb2RlICovCi0KLQl1MzIJQWNQYXJhbV9CRTsgLyogT3JpZ2luYWwgcGFyYW1ldGVyIGZvciBCRSwgdXNlIGZvciBFRENBIHR1cmJvLiAqLwotCi0JLyogdml2aSwgZm9yIHR4IHBvd2VyIHRyYWNraW5nLCAyMDA4MDQwNyAqLwotCS8qIHUxNglUU1NJXzEzZEJtOyAqLwotCS8qIHUzMglQd3JfVHJhY2s7ICovCi0JLyogIFRoZSBjdXJyZW50IFR4IFBvd2VyIExldmVsICovCi0JdTgJQ3VycmVudENja1R4UHdySWR4OwotCXU4CUN1cnJlbnRPZmRtMjRHVHhQd3JJZHg7Ci0KLQlzdHJ1Y3QgYmJfcmVnX2RlZmluZQlQSFlSZWdEZWZbNF07CS8qIFJhZGlvIEEvQi9DL0QgKi8KLQotCWJvb2wJCWJSRlBhdGhSeEVuYWJsZVs0XTsJLyogIFdlIHN1cHBvcnQgNCBSRiBwYXRoIG5vdy4gKi8KLQotCXUzMglSZlJlZ0NobmxWYWxbMl07Ci0KLQl1OAliQ2NrSGlnaFBvd2VyOwotCi0JLyogUkRHIGVuYWJsZSAqLwotCWJvb2wJIGJSREdFbmFibGU7Ci0KLQkvKiBmb3IgaG9zdCBtZXNzYWdlIHRvIGZ3ICovCi0JdTgJTGFzdEhNRUJveE51bTsKLQotCXU4CVJlZ1R4UGF1c2U7Ci0JLyogIEJlYWNvbiBmdW5jdGlvbiByZWxhdGVkIGdsb2JhbCB2YXJpYWJsZS4gKi8KLQl1OAlSZWdGd0h3VHhRQ3RybDsKLQl1OAlSZWdSZWc1NDI7Ci0KLQlzdHJ1Y3QgZG1fcHJpdglkbXByaXY7Ci0Jc3RydWN0IGRtX29kbV90CQlvZG1wcml2OwotCXN0cnVjdCBzcmVzZXRfcHJpdiBzcmVzdHByaXY7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLQl1OAkJCQliQlRNb2RlOwotCS8qICBCVCBvbmx5LiAqLwotCXN0cnVjdCBidF8zMGluZm8JCUJ0SW5mbzsKLQkvKiAgRm9yIGJsdWV0b290aCBjby1leGlzdGFuY2UgKi8KLQlzdHJ1Y3QgYnRfY29leGlzdF9zdHIJYnRfY29leGlzdDsKLSNlbmRpZgotCi0JdTgJYkR1bXBSeFBrdDsvKiBmb3IgZGVidWcgKi8KLQl1OAlGd1JzdmRQYWdlU3RhcnRPZmZzZXQ7IC8qIDIwMTAuMDYuMjMuIEFkZGVkIGJ5IHR5bmxpLiBSZXNlcnZlIHBhZ2Ugc3RhcnQgb2Zmc2V0IGV4Y2VwdCBiZWFjb24gaW4gVHhRLiAqLwotCi0JLyogIDIwMTAvMDgvMDkgTUggQWRkIENVIHBvd2VyIGRvd24gbW9kZS4gKi8KLQl1OAlwd3Jkb3duOwotCi0JdTgJT3V0RXBRdWV1ZVNlbDsKLQl1OAlPdXRFcE51bWJlcjsKLQotCS8qICAqLwotCS8qICBBZGQgRm9yIEVFUFJPTSBFZnVzZSBzd2l0Y2ggYW5kICBFZnVzZSBTaGFkb3cgbWFwIFNldHRpbmcgKi8KLQkvKiAgKi8KLQl1OAkJCUVlcHJvbU9yRWZ1c2U7Ci0JdTE2CQkJRWZ1c2VVc2VkQnl0ZXM7Ci0JdTE2CQkJQlRFZnVzZVVzZWRCeXRlczsKLQotCS8qICBJbnRlcnJ1cHQgcmVsYXRkIHJlZ2lzdGVyIGluZm9ybWF0aW9uLiAqLwotCXUzMgkJCVN5c0ludHJTdGF0dXM7Ci0JdTMyCQkJU3lzSW50ck1hc2s7Ci0KLQkvKiAgKi8KLQkvKiAgMjAxMS8wMi8yMyBNSCBBZGQgZm9yIDg3MjMgbXlsdGkgZnVuY3Rpb24gZGVmaW5pdGlvbi4gVGhlIGRlZmluZSBzaG91bGQgYmUgbW92ZWQgdG8gYW4gKi8KLQkvKiAgaW5kZXBlbmRlbnQgZmlsZSBpbiB0aGUgZnV0dXJlLiAqLwotCS8qICAqLwotCS8qIDg3MjMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0JZW51bSBSVF9NVUxUSV9GVU5DCU11bHRpRnVuYzsgLyogIEZvciBtdWx0aS1mdW5jdGlvbiBjb25zaWRlcmF0aW9uLiAqLwotCWVudW0gUlRfUE9MQVJJVFlfQ1RMCVBvbGFyaXR5Q3RsOyAvKiAgRm9yIFdpZmkgUERuIFBvbGFyaXR5IGNvbnRyb2wuICovCi0JZW51bSBSVF9SRUdVTEFUT1JfTU9ERQlSZWd1bGF0b3JNb2RlOyAvKiAgc3dpdGNoaW5nIHJlZ3VsYXRvciBvciBMRE8gKi8KLQkvKiA4NzIzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiAgMjAxMS8wMi8yMyBNSCBBZGQgZm9yIDg3MjMgbXlsdGkgZnVuY3Rpb24gZGVmaW5pdGlvbi4gVGhlIGRlZmluZSBzaG91bGQgYmUgbW92ZWQgdG8gYW4gKi8KLQkvKiAgaW5kZXBlbmRlbnQgZmlsZSBpbiB0aGUgZnV0dXJlLiAqLwotCi0JLyogIEludGVycnVwdCByZWxhdGVkIHJlZ2lzdGVyIGluZm9ybWF0aW9uLiAqLwotCXUzMglJbnRBcnJheVsyXTsKLQl1MzIJSW50ck1hc2tbMl07Ci19OwotCi0jZGVmaW5lIEdFVF9IQUxfREFUQShfX3BBZGFwdGVyKQkoKHN0cnVjdCBoYWxfZGF0YV84NzIzYSAqKSgoX19wQWRhcHRlciktPkhhbERhdGEpKQotI2RlZmluZSBHRVRfUkZfVFlQRShwcml2KQkJCShHRVRfSEFMX0RBVEEocHJpdiktPnJmX3R5cGUpCi0KLSNkZWZpbmUgSU5DTFVERV9NVUxUSV9GVU5DX0JUKF9BZGFwdGVyKQkJKEdFVF9IQUxfREFUQShfQWRhcHRlciktPk11bHRpRnVuYyAmIFJUX01VTFRJX0ZVTkNfQlQpCi0jZGVmaW5lIElOQ0xVREVfTVVMVElfRlVOQ19HUFMoX0FkYXB0ZXIpCShHRVRfSEFMX0RBVEEoX0FkYXB0ZXIpLT5NdWx0aUZ1bmMgJiBSVF9NVUxUSV9GVU5DX0dQUykKLQotc3RydWN0IHJ4cmVwb3J0Xzg3MjNhIHsKLQl1MzIgcGt0bGVuOjE0OwotCXUzMiBjcmMzMjoxOwotCXUzMiBpY3ZlcnI6MTsKLQl1MzIgZHJ2aW5mb3NpemU6NDsKLQl1MzIgc2VjdXJpdHk6MzsKLQl1MzIgcW9zOjE7Ci0JdTMyIHNoaWZ0OjI7Ci0JdTMyIHBoeXN0OjE7Ci0JdTMyIHN3ZGVjOjE7Ci0JdTMyIGxzOjE7Ci0JdTMyIGZzOjE7Ci0JdTMyIGVvcjoxOwotCXUzMiBvd246MTsKLQotCXUzMiBtYWNpZDo1OwotCXUzMiB0aWQ6NDsKLQl1MzIgaHdyc3ZkOjQ7Ci0JdTMyIGFtc2R1OjE7Ci0JdTMyIHBhZ2dyOjE7Ci0JdTMyIGZhZ2dyOjE7Ci0JdTMyIGExZml0OjQ7Ci0JdTMyIGEyZml0OjQ7Ci0JdTMyIHBhbToxOwotCXUzMiBwd3I6MTsKLQl1MzIgbWQ6MTsKLQl1MzIgbWY6MTsKLQl1MzIgdHlwZToyOwotCXUzMiBtYzoxOwotCXUzMiBiYzoxOwotCi0JdTMyIHNlcToxMjsKLQl1MzIgZnJhZzo0OwotCXUzMiBuZXh0cGt0bGVuOjE0OwotCXUzMiBuZXh0aW5kOjE7Ci0JdTMyIHJzdmQwODMxOjE7Ci0KLQl1MzIgcnhtY3M6NjsKLQl1MzIgcnhodDoxOwotCXUzMiBnZjoxOwotCXUzMiBzcGxjcDoxOwotCXUzMiBidzoxOwotCXUzMiBodGM6MTsKLQl1MzIgZW9zcDoxOwotCXUzMiBic3NpZGZpdDoyOwotCXUzMiByc3ZkMTIxNDoxNjsKLQl1MzIgdW5pY2FzdHdha2U6MTsKLQl1MzIgbWFnaWN3YWtlOjE7Ci0KLQl1MzIgcGF0dGVybjBtYXRjaDoxOwotCXUzMiBwYXR0ZXJuMW1hdGNoOjE7Ci0JdTMyIHBhdHRlcm4ybWF0Y2g6MTsKLQl1MzIgcGF0dGVybjNtYXRjaDoxOwotCXUzMiBwYXR0ZXJuNG1hdGNoOjE7Ci0JdTMyIHBhdHRlcm41bWF0Y2g6MTsKLQl1MzIgcGF0dGVybjZtYXRjaDoxOwotCXUzMiBwYXR0ZXJuN21hdGNoOjE7Ci0JdTMyIHBhdHRlcm44bWF0Y2g6MTsKLQl1MzIgcGF0dGVybjltYXRjaDoxOwotCXUzMiBwYXR0ZXJuYW1hdGNoOjE7Ci0JdTMyIHBhdHRlcm5ibWF0Y2g6MTsKLQl1MzIgcGF0dGVybmNtYXRjaDoxOwotCXUzMiByc3ZkMTYxMzoxOTsKLQotCXUzMiB0c2ZsOwotCi0JdTMyIGJhc3NuOjEyOwotCXUzMiBiYXZsZDoxOwotCXUzMiByc3ZkMjQxMzoxOTsKLX07Ci0KLS8qICBydGw4NzIzYV9oYWxfaW5pdC5jICovCi1zMzIgcnRsODcyM2FfRmlybXdhcmVEb3dubG9hZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfRmlybXdhcmVTZWxmUmVzZXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX0luaXRpYWxpemVGaXJtd2FyZVZhcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnRsODcyM2FfSW5pdEFudGVubmFfU2VsZWN0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9EZWluaXRBbnRlbm5hX1NlbGVjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfQ2hlY2tBbnRlbm5hX1NlbGVjdGlvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfaW5pdF9kZWZhdWx0X3ZhbHVlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi1zMzIgSW5pdExMVFRhYmxlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUzMiBib3VuZGFyeSk7Ci0KLXMzMiBDYXJkRGlzYWJsZUhXU00oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggcmVzZXRNQ1UpOwotczMyIENhcmREaXNhYmxlV2l0aG91dEhXU00oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLS8qICBFRnVzZSAqLwotdTggR2V0RUVQUk9NU2l6ZTg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBIYWxfSW5pdFBHRGF0YShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqUFJPTUNvbnRlbnQpOwotdm9pZCBIYWxfRWZ1c2VQYXJzZUlEQ29kZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaHdpbmZvKTsKLXZvaWQgSGFsX0VmdXNlUGFyc2V0eHBvd2VyaW5mb184NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqUFJPTUNvbnRlbnQsIGJvb2wgQXV0b0xvYWRGYWlsKTsKLXZvaWQgSGFsX0VmdXNlUGFyc2VCVENvZXhpc3RJbmZvXzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKTsKLXZvaWQgSGFsX0VmdXNlUGFyc2VFRVBST01WZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpOwotdm9pZCBydGw4NzIzYV9FZnVzZVBhcnNlQ2hubFBsYW4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpOwotdm9pZCBIYWxfRWZ1c2VQYXJzZUN1c3RvbWVySUQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpOwotdm9pZCBIYWxfRWZ1c2VQYXJzZUFudGVubmFEaXZlcnNpdHkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmh3aW5mbywgYm9vbCBBdXRvTG9hZEZhaWwpOwotdm9pZCBIYWxfRWZ1c2VQYXJzZVJhdGVJbmRpY2F0aW9uT3B0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKTsKLXZvaWQgSGFsX0VmdXNlUGFyc2VYdGFsXzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4ICpod2luZm8sIHU4IEF1dG9Mb2FkRmFpbCk7Ci12b2lkIEhhbF9FZnVzZVBhcnNlVGhlcm1hbE1ldGVyXzg3MjNBKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpod2luZm8sIGJvb2wgQXV0b0xvYWRGYWlsKTsKLQotLyogIHJlZ2lzdGVyICovCi12b2lkIFNldEJjbkN0cmxSZWcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggU2V0Qml0cywgdTggQ2xlYXJCaXRzKTsKLXZvaWQgcnRsODcyM2FfSW5pdEJlYWNvblBhcmFtZXRlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnRsODcyM2Ffc3RhcnRfdGhyZWFkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9zdG9wX3RocmVhZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotYm9vbCBjMmhfaWRfZmlsdGVyX2NjeF84NzIzYSh1OCBpZCk7Ci1pbnQgYzJoX2hhbmRsZXJfODcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGMyaF9ldnRfaGRyICpjMmhfZXZ0KTsKLQotdm9pZCBydGw4NzIzYV9yZWFkX2FkYXB0ZXJfaW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9yZWFkX2NoaXBfdmVyc2lvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2Ffbm90Y2hfZmlsdGVyKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgYm9vbCBlbmFibGUpOwotdm9pZCBydGw4NzIzYV9TZXRCZWFjb25SZWxhdGVkUmVnaXN0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYV9TZXRIYWxPRE1WYXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJICAgZW51bSBoYWxfb2RtX3ZhcmlhYmxlIGVWYXJpYWJsZSwKLQkJCSAgIHZvaWQgKnBWYWx1ZTEsIGJvb2wgYlNldCk7Ci12b2lkCi1ydGw4NzIzYV9yZWFkZWZ1c2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgdTggZWZ1c2VUeXBlLCB1MTYgX29mZnNldCwgdTE2IF9zaXplX2J5dGUsIHU4ICpwYnVmKTsKLXUxNiBydGw4NzIzYV9FZnVzZUdldEN1cnJlbnRTaXplX1dpRmkoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci11MTYgcnRsODcyM2FfRWZ1c2VHZXRDdXJyZW50U2l6ZV9CVChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnRsODcyM2FfdXBkYXRlX3JhbWFzayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgIHUzMiBtYWNfaWQsIHU4IHJzc2lfbGV2ZWwpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9wZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3BnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMmVjNDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3BnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVEw4NzIzQV9QR19IX18KLSNkZWZpbmUgX19SVEw4NzIzQV9QR19IX18KLQotLyoJCQlFRVBST00vRWZ1c2UgUEcgT2Zmc2V0IGZvciA4NzIzRS84NzIzVS84NzIzUyAqLwotI2RlZmluZSBFRVBST01fQ0NLX1RYX1BXUl9JTlhfODcyM0EJCQkweDEwCi0jZGVmaW5lIEVFUFJPTV9IVDQwXzFTX1RYX1BXUl9JTlhfODcyM0EJCTB4MTYKLSNkZWZpbmUgRUVQUk9NX0hUMjBfVFhfUFdSX0lOWF9ESUZGXzg3MjNBCTB4MUMKLSNkZWZpbmUgRUVQUk9NX09GRE1fVFhfUFdSX0lOWF9ESUZGXzg3MjNBCTB4MUYKLSNkZWZpbmUgRUVQUk9NX0hUNDBfTUFYX1BXUl9PRkZTRVRfODcyM0EJMHgyMgotI2RlZmluZSBFRVBST01fSFQyMF9NQVhfUFdSX09GRlNFVF84NzIzQQkweDI1Ci0KLSNkZWZpbmUgRUVQUk9NX0NoYW5uZWxQbGFuXzg3MjNBCQkJMHgyOAotI2RlZmluZSBFRVBST01fVFNTSV9BXzg3MjNBCQkJCQkweDI5Ci0jZGVmaW5lIEVFUFJPTV9USEVSTUFMX01FVEVSXzg3MjNBCQkJMHgyQQotI2RlZmluZSBSRl9PUFRJT04xXzg3MjNBCQkJCQkweDJCCi0jZGVmaW5lIFJGX09QVElPTjJfODcyM0EJCQkJCTB4MkMKLSNkZWZpbmUgUkZfT1BUSU9OM184NzIzQQkJCQkJMHgyRAotI2RlZmluZSBSRl9PUFRJT040Xzg3MjNBCQkJCQkweDJFCi0jZGVmaW5lIEVFUFJPTV9WRVJTSU9OXzg3MjNBCQkJCTB4MzAKLSNkZWZpbmUgRUVQUk9NX0N1c3RvbUlEXzg3MjNBCQkJCTB4MzEKLSNkZWZpbmUgRUVQUk9NX1N1YkN1c3RvbUlEXzg3MjNBCQkJMHgzMgotI2RlZmluZSBFRVBST01fWFRBTF9LXzg3MjNBCQkJCQkweDMzCi0jZGVmaW5lIEVFUFJPTV9DaGlwc2V0Xzg3MjNBCQkJCTB4MzQKLQotLyogIFJUTDg3MjNBRSAqLwotI2RlZmluZSBFRVBST01fVklEXzg3MjNBRQkJCQkJMHg0OQotI2RlZmluZSBFRVBST01fRElEXzg3MjNBRQkJCQkJMHg0QgotI2RlZmluZSBFRVBST01fU1ZJRF84NzIzQUUJCQkJCTB4NEQKLSNkZWZpbmUgRUVQUk9NX1NNSURfODcyM0FFCQkJCQkweDRGCi0jZGVmaW5lIEVFUFJPTV9NQUNfQUREUl84NzIzQUUJCQkJMHg2NwotCi0vKiAgUlRMODcyM0FVICovCi0jZGVmaW5lIEVFUFJPTV9NQUNfQUREUl84NzIzQVUJCQkJMHhDNgotI2RlZmluZSBFRVBST01fVklEXzg3MjNBVQkJCQkJMHhCNwotI2RlZmluZSBFRVBST01fUElEXzg3MjNBVQkJCQkJMHhCOQotCi0vKiAgUlRMODcyM0FTICovCi0jZGVmaW5lIEVFUFJPTV9NQUNfQUREUl84NzIzQVMJCQkJMHhBQQotCi0vKgkJCUVFUFJPTS9FZnVzZSBWYWx1ZSBUeXBlICovCi0jZGVmaW5lIEVFVFlQRV9UWF9QV1IJCQkJCQkweDAKLQotLyoJCQlFRVBST00vRWZ1c2UgRGVmYXVsdCBWYWx1ZSAqLwotI2RlZmluZSBFRVBST01fRGVmYXVsdF9DcnlzdGFsQ2FwXzg3MjNBCQkweDIwCi0KLQotLyogICAgICAgIEVFUFJPTS9FRlVTRSBkYXRhIHN0cnVjdHVyZSBkZWZpbml0aW9uLiAqLwotI2RlZmluZQlNQVhfQ0hOTF9HUk9VUAkJMys5Ci0KLXN0cnVjdCB0eHBvd2VyaW5mbyB7Ci0JdTggQ0NLSW5kZXhbUkZfUEFUSF9NQVhdW01BWF9DSE5MX0dST1VQXTsKLQl1OCBIVDQwXzFTSW5kZXhbUkZfUEFUSF9NQVhdW01BWF9DSE5MX0dST1VQXTsKLQl1OCBIVDQwXzJTSW5kZXhEaWZmW1JGX1BBVEhfTUFYXVtNQVhfQ0hOTF9HUk9VUF07Ci0JdTggSFQyMEluZGV4RGlmZltSRl9QQVRIX01BWF1bTUFYX0NITkxfR1JPVVBdOwotCXU4IE9GRE1JbmRleERpZmZbUkZfUEFUSF9NQVhdW01BWF9DSE5MX0dST1VQXTsKLQl1OCBIVDQwTWF4T2Zmc2V0W1JGX1BBVEhfTUFYXVtNQVhfQ0hOTF9HUk9VUF07Ci0JdTggSFQyME1heE9mZnNldFtSRl9QQVRIX01BWF1bTUFYX0NITkxfR1JPVVBdOwotCXU4IFRTU0lfQVszXTsKLQl1OCBUU1NJX0JbM107Ci0JdTggVFNTSV9BXzVHWzNdOwkJLyogNUdMLzVHTS81R0ggKi8KLQl1OCBUU1NJX0JfNUdbM107Ci19OwotCi1lbnVtIGJ0X2FudF9udW0gewotCUFudF94Mgk9IDAsCi0JQW50X3gxCT0gMQotfTsKLQotZW51bSBidF9jb3R5cGUgewotCUJUXzJXaXJlCQk9IDAsCi0JQlRfSVNTQ18zV2lyZQkJPSAxLAotCUJUX0FjY2VsCQk9IDIsCi0JQlRfQ1NSX0JDNAkJPSAzLAotCUJUX0NTUl9CQzgJCT0gNCwKLQlCVF9SVEw4NzU2CQk9IDUsCi0JQlRfUlRMODcyM0EJCT0gNgotfTsKLQotZW51bSBidF9yYWRpb3NoYXJlZCB7Ci0JQlRfUmFkaW9fU2hhcmVkCQk9IDAsCi0JQlRfUmFkaW9fSW5kaXZpZHVhbAk9IDEsCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9yZWN2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfcmVjdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzVkMzdiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9yZWN2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVEw4NzIzQV9SRUNWX0hfXwotI2RlZmluZSBfX1JUTDg3MjNBX1JFQ1ZfSF9fCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNkZWZpbmUgTlJfUkVDVkJVRkYJCQk0Ci0KLSNkZWZpbmUgTlJfUFJFQUxMT0NfUkVDVl9TS0IJCTgKLQotI2RlZmluZSBSRUNWX0JMS19TWgkJCTUxMgotI2RlZmluZSBSRUNWX0JMS19DTlQJCQkxNgotI2RlZmluZSBSRUNWX0JMS19USAkJCVJFQ1ZfQkxLX0NOVAotCi0jZGVmaW5lIE1BWF9SRUNWQlVGX1NaCQkJMTUzNjAgLyogIDE1ayA8IDE2ayAqLwotCi0jZGVmaW5lIFBIWV9SU1NJX1NMSURfV0lOX01BWAkJMTAwCi0jZGVmaW5lIFBIWV9MSU5LUVVBTElUWV9TTElEX1dJTl9NQVgJMjAKLQotCi1zdHJ1Y3QgcGh5X3N0YXQgewotCXVuc2lnbmVkIGludCBwaHlkdzA7Ci0JdW5zaWduZWQgaW50IHBoeWR3MTsKLQl1bnNpZ25lZCBpbnQgcGh5ZHcyOwotCXVuc2lnbmVkIGludCBwaHlkdzM7Ci0JdW5zaWduZWQgaW50IHBoeWR3NDsKLQl1bnNpZ25lZCBpbnQgcGh5ZHc1OwotCXVuc2lnbmVkIGludCBwaHlkdzY7Ci0JdW5zaWduZWQgaW50IHBoeWR3NzsKLX07Ci0KLS8qICBSeCBzbW9vdGggZmFjdG9yICovCi0jZGVmaW5lCVJ4X1Ntb290aF9GYWN0b3IJCTIwCi0KLXN0cnVjdCBpbnRlcnJ1cHRfbXNnX2Zvcm1hdCB7Ci0JdW5zaWduZWQgaW50IEMySF9NU0cwOwotCXVuc2lnbmVkIGludCBDMkhfTVNHMTsKLQl1bnNpZ25lZCBpbnQgQzJIX01TRzI7Ci0JdW5zaWduZWQgaW50IEMySF9NU0czOwotCXVuc2lnbmVkIGludCBISVNSOyAvKiAgZnJvbSBISVNSIFJlZzB4MTI0LCByZWFkIHRvIGNsZWFyICovCi0JdW5zaWduZWQgaW50IEhJU1JFOy8qICBmcm9tIEhJU1JFIFJlZzB4MTJjLCByZWFkIHRvIGNsZWFyICovCi0JdW5zaWduZWQgaW50ICBNU0dfRVg7Ci19OwotCi1pbnQgcnRsODcyM2F1X2luaXRfcmVjdl9wcml2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBydGw4NzIzYXVfZnJlZV9yZWN2X3ByaXYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0bDg3MjNhX3Byb2Nlc3NfcGh5X2luZm8oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdm9pZCAqcHJmcmFtZSk7Ci12b2lkIHVwZGF0ZV9yZWN2ZnJhbWVfYXR0cmliKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgcmVjdl9zdGF0ICpwcnhzdGF0KTsKLXZvaWQgdXBkYXRlX3JlY3ZmcmFtZV9waHlpbmZvKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lLCBzdHJ1Y3QgcGh5X3N0YXQgKnBwaHlfaW5mbyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3JmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfcmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzMjc5OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfcmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUTDg3MjNBX1JGX0hfXwotI2RlZmluZSBfX1JUTDg3MjNBX1JGX0hfXwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIFBhcmFtZXRlcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogICovCi0vKiAgRm9yIFJGIDYwNTIgU2VyaWVzICovCi0vKiAgKi8KLSNkZWZpbmUJCVJGNjA1Ml9NQVhfVFhfUFdSCQkJMHgzRgotI2RlZmluZQkJUkY2MDUyX01BWF9SRUcJCQkJMHgzRgotI2RlZmluZQkJUkY2MDUyX01BWF9QQVRICQkJCTIKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgUGFyYW1ldGVycy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYXJjbyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgTWFyY28gRGVmaW5pdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydGVkIEZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qICAqLwotLyogIFJGIFJMNjA1MiBTZXJpZXMgQVBJICovCi0vKiAgKi8KLXZvaWQgcnRsODcyM2FfcGh5X3JmNjA1MnNldF9idyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCQkgICAgICAgZW51bSBodF9jaGFubmVsX3dpZHRoIEJhbmR3aWR0aCk7Ci12b2lkIHJ0bDgyM2FfcGh5X3JmNjA1MnNldGNja3R4cG93ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJCSAgICAgIHU4ICpwUG93ZXJsZXZlbCk7Ci12b2lkIHJ0bDg3MjNhX1BIWV9SRjYwNTJTZXRPRkRNVHhQb3dlcihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsCi0JCQkJICAgICAgIHU4ICpwUG93ZXJMZXZlbCwgdTggQ2hhbm5lbCk7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnRlZCBGdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1pbnQJUEhZX1JGNjA1Ml9Db25maWc4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9zcGVjLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2Ffc3BlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjE4Njg5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9zcGVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVEw4NzIzQV9TUEVDX0hfXwotI2RlZmluZSBfX1JUTDg3MjNBX1NQRUNfSF9fCi0KLS8qICAqLwotLyogICovCi0vKgkweDAwMDBoIH4gMHgwMEZGaAlTeXN0ZW0gQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX1NZU19JU09fQ1RSTAkJMHgwMDAwCi0jZGVmaW5lIFJFR19TWVNfRlVOQ19FTgkJCTB4MDAwMgotI2RlZmluZSBSRUdfQVBTX0ZTTUNPCQkJMHgwMDA0Ci0jZGVmaW5lIFJFR19TWVNfQ0xLUgkJCTB4MDAwOAotI2RlZmluZSBSRUdfOTM0NkNSCQkJMHgwMDBBCi0jZGVmaW5lIFJFR19FRV9WUEQJCQkweDAwMEMKLSNkZWZpbmUgUkVHX0FGRV9NSVNDCQkJMHgwMDEwCi0jZGVmaW5lIFJFR19TUFMwX0NUUkwJCQkweDAwMTEKLSNkZWZpbmUgUkVHX1NQU19PQ1BfQ0ZHCQkJMHgwMDE4Ci0jZGVmaW5lIFJFR19SU1ZfQ1RSTAkJCTB4MDAxQwotI2RlZmluZSBSRUdfUkZfQ1RSTAkJCTB4MDAxRgotI2RlZmluZSBSRUdfTERPQTE1X0NUUkwJCQkweDAwMjAKLSNkZWZpbmUgUkVHX0xET1YxMkRfQ1RSTAkJMHgwMDIxCi0jZGVmaW5lIFJFR19MRE9IQ0kxMl9DVFJMCQkweDAwMjIKLSNkZWZpbmUgUkVHX0xQTERPX0NUUkwJCQkweDAwMjMKLSNkZWZpbmUgUkVHX0FGRV9YVEFMX0NUUkwJCTB4MDAyNAotI2RlZmluZSBSRUdfQUZFX1BMTF9DVFJMCQkweDAwMjgKLSNkZWZpbmUgUkVHX01BQ19QSFlfQ1RSTAkJMHgwMDJjCi0jZGVmaW5lIFJFR19FRlVTRV9DVFJMCQkJMHgwMDMwCi0jZGVmaW5lIFJFR19FRlVTRV9URVNUCQkJMHgwMDM0Ci0jZGVmaW5lIFJFR19QV1JfREFUQQkJCTB4MDAzOAotI2RlZmluZSBSRUdfQ0FMX1RJTUVSCQkJMHgwMDNDCi0jZGVmaW5lIFJFR19BQ0xLX01PTgkJCTB4MDAzRQotI2RlZmluZSBSRUdfR1BJT19NVVhDRkcJCQkweDAwNDAKLSNkZWZpbmUgUkVHX0dQSU9fSU9fU0VMCQkJMHgwMDQyCi0jZGVmaW5lIFJFR19NQUNfUElOTVVYX0NGRwkJMHgwMDQzCi0jZGVmaW5lIFJFR19HUElPX1BJTl9DVFJMCQkweDAwNDQKLSNkZWZpbmUgUkVHX0dQSU9fSU5UTQkJCTB4MDA0OAotI2RlZmluZSBSRUdfTEVEQ0ZHMAkJCTB4MDA0QwotI2RlZmluZSBSRUdfTEVEQ0ZHMQkJCTB4MDA0RAotI2RlZmluZSBSRUdfTEVEQ0ZHMgkJCTB4MDA0RQotI2RlZmluZSBSRUdfTEVEQ0ZHMwkJCTB4MDA0RgotI2RlZmluZSBSRUdfTEVEQ0ZHCQkJUkVHX0xFRENGRzIKLSNkZWZpbmUgUkVHX0ZTSU1SCQkJMHgwMDUwCi0jZGVmaW5lIFJFR19GU0lTUgkJCTB4MDA1NAotI2RlZmluZSBSRUdfSFNJTVIJCQkweDAwNTgKLSNkZWZpbmUgUkVHX0hTSVNSCQkJMHgwMDVjCi0gLyogIFJUTDg3MjMgV0lGSS9CVC9HUFMgTXVsdGktRnVuY3Rpb24gR1BJTyBQaW4gQ29udHJvbC4gKi8KLSNkZWZpbmUgUkVHX0dQSU9fUElOX0NUUkxfMgkJMHgwMDYwCi0gLyogIFJUTDg3MjMgV0lGSS9CVC9HUFMgTXVsdGktRnVuY3Rpb24gR1BJTyBTZWxlY3QuICovCi0jZGVmaW5lIFJFR19HUElPX0lPX1NFTF8yCQkweDAwNjIKLSAvKiAgUlRMODcyMyBXSUZJL0JUL0dQUyBNdWx0aS1GdW5jdGlvbiBjb250cm9sIHNvdXJjZS4gKi8KLSNkZWZpbmUgUkVHX01VTFRJX0ZVTkNfQ1RSTAkJMHgwMDY4Ci0jZGVmaW5lIFJFR19NQ1VGV0RMCQkJMHgwMDgwCi0jZGVmaW5lIFJFR19ITUVCT1hfRVhUXzAJCTB4MDA4OAotI2RlZmluZSBSRUdfSE1FQk9YX0VYVF8xCQkweDAwOEEKLSNkZWZpbmUgUkVHX0hNRUJPWF9FWFRfMgkJMHgwMDhDCi0jZGVmaW5lIFJFR19ITUVCT1hfRVhUXzMJCTB4MDA4RQotCS8qICBIb3N0IHN1c3BlbmQgY291bnRlciBvbiBGUEdBIHBsYXRmb3JtICovCi0jZGVmaW5lIFJFR19IT1NUX1NVU1BfQ05UCQkweDAwQkMKLQkvKiAgRWZ1c2UgYWNjZXNzIHByb3RlY3Rpb24gZm9yIFJUTDg3MjMgKi8KLSNkZWZpbmUgUkVHX0VGVVNFX0FDQ0VTUwkJMHgwMENGCi0jZGVmaW5lIFJFR19CSVNUX1NDQU4JCQkweDAwRDAKLSNkZWZpbmUgUkVHX0JJU1RfUlBUCQkJMHgwMEQ0Ci0jZGVmaW5lIFJFR19CSVNUX1JPTV9SUFQJCTB4MDBEOAotI2RlZmluZSBSRUdfVVNCX1NJRV9JTlRGCQkweDAwRTAKLSNkZWZpbmUgUkVHX1BDSUVfTUlPX0lOVEYJCTB4MDBFNAotI2RlZmluZSBSRUdfUENJRV9NSU9fSU5URAkJMHgwMEU4Ci0jZGVmaW5lIFJFR19IUE9OX0ZTTQkJCTB4MDBFQwotI2RlZmluZSBSRUdfU1lTX0NGRwkJCTB4MDBGMAotI2RlZmluZSBSRUdfR1BJT19PVVRTVFMJCQkweDAwRjQJLyogIEZvciBSVEw4NzIzIG9ubHkuICovCi0KLS8qICAqLwotLyogICovCi0vKgkweDAxMDBoIH4gMHgwMUZGaAlNQUNUT1AgR2VuZXJhbCBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfQ1IJCQkJMHgwMTAwCi0jZGVmaW5lIFJFR19QQlAJCQkJMHgwMTA0Ci0jZGVmaW5lIFJFR19UUlhETUFfQ1RSTAkJCTB4MDEwQwotI2RlZmluZSBSRUdfVFJYRkZfQk5EWQkJCTB4MDExNAotI2RlZmluZSBSRUdfVFJYRkZfU1RBVFVTCQkweDAxMTgKLSNkZWZpbmUgUkVHX1JYRkZfUFRSCQkJMHgwMTFDCi0jZGVmaW5lIFJFR19ISU1SCQkJMHgwMTIwCi0jZGVmaW5lIFJFR19ISVNSCQkJMHgwMTI0Ci0jZGVmaW5lIFJFR19ISU1SRQkJCTB4MDEyOAotI2RlZmluZSBSRUdfSElTUkUJCQkweDAxMkMKLSNkZWZpbmUgUkVHX0NQV00JCQkweDAxMkYKLSNkZWZpbmUgUkVHX0ZXSU1SCQkJMHgwMTMwCi0jZGVmaW5lIFJFR19GV0lTUgkJCTB4MDEzNAotI2RlZmluZSBSRUdfUEtUQlVGX0RCR19DVFJMCQkweDAxNDAKLSNkZWZpbmUgUkVHX1BLVEJVRl9EQkdfREFUQV9MCQkweDAxNDQKLSNkZWZpbmUgUkVHX1BLVEJVRl9EQkdfREFUQV9ICQkweDAxNDgKLQotI2RlZmluZSBSRUdfVEMwX0NUUkwJCQkweDAxNTAKLSNkZWZpbmUgUkVHX1RDMV9DVFJMCQkJMHgwMTU0Ci0jZGVmaW5lIFJFR19UQzJfQ1RSTAkJCTB4MDE1OAotI2RlZmluZSBSRUdfVEMzX0NUUkwJCQkweDAxNUMKLSNkZWZpbmUgUkVHX1RDNF9DVFJMCQkJMHgwMTYwCi0jZGVmaW5lIFJFR19UQ1VOSVRfQkFTRQkJCTB4MDE2NAotI2RlZmluZSBSRUdfTUJJU1RfU1RBUlQJCQkweDAxNzQKLSNkZWZpbmUgUkVHX01CSVNUX0RPTkUJCQkweDAxNzgKLSNkZWZpbmUgUkVHX01CSVNUX0ZBSUwJCQkweDAxN0MKLSNkZWZpbmUgUkVHX0MySEVWVF9NU0dfTk9STUFMCQkweDAxQTAKLSNkZWZpbmUgUkVHX0MySEVWVF9DTEVBUgkJMHgwMUFGCi0jZGVmaW5lIFJFR19DMkhFVlRfTVNHX1RFU1QJCTB4MDFCOAotI2RlZmluZSBSRUdfTUNVVFNUXzEJCQkweDAxYzAKLSNkZWZpbmUgUkVHX0ZNRVRIUgkJCTB4MDFDOAotI2RlZmluZSBSRUdfSE1FVEZSCQkJMHgwMUNDCi0jZGVmaW5lIFJFR19ITUVCT1hfMAkJCTB4MDFEMAotI2RlZmluZSBSRUdfSE1FQk9YXzEJCQkweDAxRDQKLSNkZWZpbmUgUkVHX0hNRUJPWF8yCQkJMHgwMUQ4Ci0jZGVmaW5lIFJFR19ITUVCT1hfMwkJCTB4MDFEQwotCi0jZGVmaW5lIFJFR19MTFRfSU5JVAkJCTB4MDFFMAotI2RlZmluZSBSRUdfQkJfQUNDRUVTU19DVFJMCQkweDAxRTgKLSNkZWZpbmUgUkVHX0JCX0FDQ0VTU19EQVRBCQkweDAxRUMKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMjAwaCB+IDB4MDI3RmgJVFhETUEgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX1JRUE4JCQkweDAyMDAKLSNkZWZpbmUgUkVHX0ZJRk9QQUdFCQkJMHgwMjA0Ci0jZGVmaW5lIFJFR19UREVDVFJMCQkJMHgwMjA4Ci0jZGVmaW5lIFJFR19UWERNQV9PRkZTRVRfQ0hLCQkweDAyMEMKLSNkZWZpbmUgUkVHX1RYRE1BX1NUQVRVUwkJMHgwMjEwCi0jZGVmaW5lIFJFR19SUVBOX05QUQkJCTB4MDIxNAotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMjgwaCB+IDB4MDJGRmgJUlhETUEgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX1JYRE1BX0FHR19QR19USAkJMHgwMjgwCi0jZGVmaW5lIFJFR19SWFBLVF9OVU0JCQkweDAyODQKLSNkZWZpbmUgUkVHX1JYRE1BX1NUQVRVUwkJMHgwMjg4Ci0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDMwMGggfiAweDAzRkZoCVBDSWUgKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lCVJFR19QQ0lFX0NUUkxfUkVHCQkweDAzMDAKLSNkZWZpbmUJUkVHX0lOVF9NSUcJCQkweDAzMDQJLyogIEludGVycnVwdCBNaWdyYXRpb24gKi8KLQkvKiAgVFggQmVhY29uIERlc2NyaXB0b3IgQWRkcmVzcyAqLwotI2RlZmluZQlSRUdfQkNOUV9ERVNBCQkJMHgwMzA4Ci0JLyogIFRYIEhpZ2ggUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzICovCi0jZGVmaW5lCVJFR19IUV9ERVNBCQkJMHgwMzEwCi0JLyogIFRYIE1hbmFnZSBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KLSNkZWZpbmUJUkVHX01HUV9ERVNBCQkJMHgwMzE4Ci0JLyogIFRYIFZPIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcyAqLwotI2RlZmluZQlSRUdfVk9RX0RFU0EJCQkweDAzMjAKLQkvKiAgVFggVkkgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzICovCi0jZGVmaW5lCVJFR19WSVFfREVTQQkJCTB4MDMyOAotCS8qICBUWCBCRSBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KLSNkZWZpbmUJUkVHX0JFUV9ERVNBCQkJMHgwMzMwCi0JLyogIFRYIEJLIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcyAqLwotI2RlZmluZQlSRUdfQktRX0RFU0EJCQkweDAzMzgKLQkvKiAgUlggUXVldWUJRGVzY3JpcHRvciBBZGRyZXNzICovCi0jZGVmaW5lCVJFR19SWF9ERVNBCQkJMHgwMzQwCi0JLyogIEJhY2tkb29yIFJFRyBmb3IgQWNjZXNzIENvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUJUkVHX0RCSQkJCQkweDAzNDgKLQkvKiAgTURJTyBmb3IgQWNjZXNzIFBDSUUgUEhZICovCi0jZGVmaW5lCVJFR19NRElPCQkJMHgwMzU0Ci0JLyogIERlYnVnIFNlbGVjdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlSRUdfREJHX1NFTAkJCTB4MDM2MAotCS8qIFBDSWUgUlBXTSAqLwotI2RlZmluZQlSRUdfUENJRV9IUlBXTQkJCTB4MDM2MQotCS8qIFBDSWUgQ1BXTSAqLwotI2RlZmluZQlSRUdfUENJRV9IQ1BXTQkJCTB4MDM2MwotCS8qICBVQVJUCUNvbnRyb2wgKi8KLSNkZWZpbmUJUkVHX1VBUlRfQ1RSTAkJCTB4MDM2NAotCS8qICBVQVJUIFRYIERlc2NyaXB0b3IgQWRkcmVzcyAqLwotI2RlZmluZQlSRUdfVUFSVF9UWF9ERVNBCQkweDAzNzAKLQkvKiAgVUFSVCBSeCBEZXNjcmlwdG9yIEFkZHJlc3MgKi8KLSNkZWZpbmUJUkVHX1VBUlRfUlhfREVTQQkJMHgwMzc4Ci0KLQotLyogIHNwZWMgdmVyc2lvbiAxMSAqLwotLyogICovCi0vKiAgKi8KLS8qCTB4MDQwMGggfiAweDA0N0ZoCVByb3RvY29sIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lIFJFR19WT1FfSU5GT1JNQVRJT04JCTB4MDQwMAotI2RlZmluZSBSRUdfVklRX0lORk9STUFUSU9OCQkweDA0MDQKLSNkZWZpbmUgUkVHX0JFUV9JTkZPUk1BVElPTgkJMHgwNDA4Ci0jZGVmaW5lIFJFR19CS1FfSU5GT1JNQVRJT04JCTB4MDQwQwotI2RlZmluZSBSRUdfTUdRX0lORk9STUFUSU9OCQkweDA0MTAKLSNkZWZpbmUgUkVHX0hHUV9JTkZPUk1BVElPTgkJMHgwNDE0Ci0jZGVmaW5lIFJFR19CQ05RX0lORk9STUFUSU9OCQkweDA0MTgKLQotCi0jZGVmaW5lIFJFR19DUFVfTUdRX0lORk9STUFUSU9OCQkweDA0MUMKLSNkZWZpbmUgUkVHX0ZXSFdfVFhRX0NUUkwJCTB4MDQyMAotI2RlZmluZSBSRUdfSFdTRVFfQ1RSTAkJCTB4MDQyMwotI2RlZmluZSBSRUdfVFhQS1RCVUZfQkNOUV9CRE5ZCQkweDA0MjQKLSNkZWZpbmUgUkVHX1RYUEtUQlVGX01HUV9CRE5ZCQkweDA0MjUKLSNkZWZpbmUgUkVHX0xJRkVUSU1FX0VOCQkJMHgwNDI2Ci0jZGVmaW5lIFJFR19NVUxUSV9CQ05RX09GRlNFVAkJMHgwNDI3Ci0jZGVmaW5lIFJFR19TUEVDX1NJRlMJCQkweDA0MjgKLSNkZWZpbmUgUkVHX1JMCQkJCTB4MDQyQQotI2RlZmluZSBSRUdfREFSRlJDCQkJMHgwNDMwCi0jZGVmaW5lIFJFR19SQVJGUkMJCQkweDA0MzgKLSNkZWZpbmUgUkVHX1JSU1IJCQkweDA0NDAKLSNkZWZpbmUgUkVHX0FSRlIwCQkJMHgwNDQ0Ci0jZGVmaW5lIFJFR19BUkZSMQkJCTB4MDQ0OAotI2RlZmluZSBSRUdfQVJGUjIJCQkweDA0NEMKLSNkZWZpbmUgUkVHX0FSRlIzCQkJMHgwNDUwCi0jZGVmaW5lIFJFR19BR0dMRU5fTE1UCQkJMHgwNDU4Ci0jZGVmaW5lIFJFR19BTVBEVV9NSU5fU1BBQ0UJCTB4MDQ1QwotI2RlZmluZSBSRUdfVFhQS1RCVUZfV01BQ19MQktfQkZfSEQJMHgwNDVECi0jZGVmaW5lIFJFR19GQVNUX0VEQ0FfQ1RSTAkJMHgwNDYwCi0jZGVmaW5lIFJFR19SRF9SRVNQX1BLVF9USAkJMHgwNDYzCi0jZGVmaW5lIFJFR19JTklSVFNfUkFURV9TRUwJCTB4MDQ4MAotI2RlZmluZSBSRUdfSU5JREFUQV9SQVRFX1NFTAkJMHgwNDg0Ci0KLQotI2RlZmluZSBSRUdfUE9XRVJfU1RBVFVTCQkweDA0QTQKLSNkZWZpbmUgUkVHX1BPV0VSX1NUQUdFMQkJMHgwNEI0Ci0jZGVmaW5lIFJFR19QT1dFUl9TVEFHRTIJCTB4MDRCOAotI2RlZmluZSBSRUdfUEtUX1ZPX1ZJX0xJRkVfVElNRQkJMHgwNEMwCi0jZGVmaW5lIFJFR19QS1RfQkVfQktfTElGRV9USU1FCQkweDA0QzIKLSNkZWZpbmUgUkVHX1NUQkNfU0VUVElORwkJMHgwNEM0Ci0jZGVmaW5lIFJFR19QUk9UX01PREVfQ1RSTAkJMHgwNEM4Ci0jZGVmaW5lIFJFR19NQVhfQUdHUl9OVU0JCTB4MDRDQQotI2RlZmluZSBSRUdfUlRTX01BWF9BR0dSX05VTQkJMHgwNENCCi0jZGVmaW5lIFJFR19CQVJfTU9ERV9DVFJMCQkweDA0Q0MKLSNkZWZpbmUgUkVHX1JBX1RSWV9SQVRFX0FHR19MTVQJCTB4MDRDRgotI2RlZmluZSBSRUdfTlFPU19TRVEJCQkweDA0REMKLSNkZWZpbmUgUkVHX1FPU19TRVEJCQkweDA0REUKLSNkZWZpbmUgUkVHX05FRURfQ1BVX0hBTkRMRQkJMHgwNEUwCi0jZGVmaW5lIFJFR19QS1RfTE9TRV9SUFQJCTB4MDRFMQotI2RlZmluZSBSRUdfUFRDTF9FUlJfU1RBVFVTCQkweDA0RTIKLSNkZWZpbmUgUkVHX0RVTU1ZCQkJMHgwNEZDCi0KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNTAwaCB+IDB4MDVGRmgJRURDQSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfRURDQV9WT19QQVJBTQkJMHgwNTAwCi0jZGVmaW5lIFJFR19FRENBX1ZJX1BBUkFNCQkweDA1MDQKLSNkZWZpbmUgUkVHX0VEQ0FfQkVfUEFSQU0JCTB4MDUwOAotI2RlZmluZSBSRUdfRURDQV9CS19QQVJBTQkJMHgwNTBDCi0jZGVmaW5lIFJFR19CQ05UQ0ZHCQkJMHgwNTEwCi0jZGVmaW5lIFJFR19QSUZTCQkJMHgwNTEyCi0jZGVmaW5lIFJFR19SREdfUElGUwkJCTB4MDUxMwotI2RlZmluZSBSRUdfU0lGU19DQ0sJCQkweDA1MTQKLSNkZWZpbmUgUkVHX1NJRlNfT0ZETQkJCTB4MDUxNgotI2RlZmluZSBSRUdfU0lGU19DVFgJCQkweDA1MTQKLSNkZWZpbmUgUkVHX1NJRlNfVFJYCQkJMHgwNTE2Ci0jZGVmaW5lIFJFR19UU0ZUUl9TWU5fT0ZGU0VUCQkweDA1MTgKLSNkZWZpbmUgUkVHX0FHR1JfQlJFQUtfVElNRQkJMHgwNTFBCi0jZGVmaW5lIFJFR19TTE9UCQkJMHgwNTFCCi0jZGVmaW5lIFJFR19UWF9QVENMX0NUUkwJCTB4MDUyMAotI2RlZmluZSBSRUdfVFhQQVVTRQkJCTB4MDUyMgotI2RlZmluZSBSRUdfRElTX1RYUkVRX0NMUgkJMHgwNTIzCi0jZGVmaW5lIFJFR19SRF9DVFJMCQkJMHgwNTI0Ci0jZGVmaW5lIFJFR19UQlRUX1BST0hJQklUCQkweDA1NDAKLSNkZWZpbmUgUkVHX1JEX05BVl9OWFQJCQkweDA1NDQKLSNkZWZpbmUgUkVHX05BVl9QUk9UX0xFTgkJMHgwNTQ2Ci0jZGVmaW5lIFJFR19CQ05fQ1RSTAkJCTB4MDU1MAotI2RlZmluZSBSRUdfQkNOX0NUUkxfMQkJCTB4MDU1MQotI2RlZmluZSBSRUdfTUJJRF9OVU0JCQkweDA1NTIKLSNkZWZpbmUgUkVHX0RVQUxfVFNGX1JTVAkJMHgwNTUzCi0JLyogIFRoZSBzYW1lIGFzIFJFR19NQlNTSURfQkNOX1NQQUNFICovCi0jZGVmaW5lIFJFR19CQ05fSU5URVJWQUwJCTB4MDU1NAotI2RlZmluZSBSRUdfTUJTU0lEX0JDTl9TUEFDRQkJMHgwNTU0Ci0jZGVmaW5lIFJFR19EUlZFUkxZSU5UCQkJMHgwNTU4Ci0jZGVmaW5lIFJFR19CQ05ETUFUSU0JCQkweDA1NTkKLSNkZWZpbmUgUkVHX0FUSU1XTkQJCQkweDA1NUEKLSNkZWZpbmUgUkVHX0JDTl9NQVhfRVJSCQkJMHgwNTVECi0jZGVmaW5lIFJFR19SWFRTRl9PRkZTRVRfQ0NLCQkweDA1NUUKLSNkZWZpbmUgUkVHX1JYVFNGX09GRlNFVF9PRkRNCQkweDA1NUYKLSNkZWZpbmUgUkVHX1RTRlRSCQkJMHgwNTYwCi0jZGVmaW5lIFJFR19UU0ZUUjEJCQkweDA1NjgKLSNkZWZpbmUgUkVHX0lOSVRfVFNGVFIJCQkweDA1NjQKLSNkZWZpbmUgUkVHX0FUSU1XTkRfMQkJCTB4MDU3MAotI2RlZmluZSBSRUdfUFNUSU1FUgkJCTB4MDU4MAotI2RlZmluZSBSRUdfVElNRVIwCQkJMHgwNTg0Ci0jZGVmaW5lIFJFR19USU1FUjEJCQkweDA1ODgKLSNkZWZpbmUgUkVHX0FDTUhXQ1RSTAkJCTB4MDVDMAotI2RlZmluZSBSRUdfQUNNUlNUQ1RSTAkJCTB4MDVDMQotI2RlZmluZSBSRUdfQUNNQVZHCQkJMHgwNUMyCi0jZGVmaW5lIFJFR19WT19BRE1USU1FCQkJMHgwNUM0Ci0jZGVmaW5lIFJFR19WSV9BRE1USU1FCQkJMHgwNUM2Ci0jZGVmaW5lIFJFR19CRV9BRE1USU1FCQkJMHgwNUM4Ci0jZGVmaW5lIFJFR19FRENBX1JBTkRPTV9HRU4JCTB4MDVDQwotI2RlZmluZSBSRUdfU0NIX1RYQ01ECQkJMHgwNUQwCi0KLS8qIGRlZmluZSBSRUdfRldfVFNGX1NZTkNfQ05UCQkweDA0QTAgKi8KLSNkZWZpbmUgUkVHX0ZXX1JFU0VUX1RTRl9DTlRfMQkJMHgwNUZDCi0jZGVmaW5lIFJFR19GV19SRVNFVF9UU0ZfQ05UXzAJCTB4MDVGRAotI2RlZmluZSBSRUdfRldfQkNOX0RJU19DTlQJCTB4MDVGRQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNjAwaCB+IDB4MDdGRmgJV01BQyBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfQVBTRF9DVFJMCQkJMHgwNjAwCi0jZGVmaW5lIFJFR19CV09QTU9ERQkJCTB4MDYwMwotI2RlZmluZSBSRUdfVENSCQkJCTB4MDYwNAotI2RlZmluZSBSRUdfUkNSCQkJCTB4MDYwOAotI2RlZmluZSBSRUdfUlhfUEtUX0xJTUlUCQkweDA2MEMKLSNkZWZpbmUgUkVHX1JYX0RMS19USU1FCQkJMHgwNjBECi0jZGVmaW5lIFJFR19SWF9EUlZJTkZPX1NaCQkweDA2MEYKLQotI2RlZmluZSBSRUdfTUFDSUQJCQkweDA2MTAKLSNkZWZpbmUgUkVHX0JTU0lECQkJMHgwNjE4Ci0jZGVmaW5lIFJFR19NQVIJCQkJMHgwNjIwCi0jZGVmaW5lIFJFR19NQklEQ0FNQ0ZHCQkJMHgwNjI4Ci0KLSNkZWZpbmUgUkVHX1VTVElNRV9FRENBCQkJMHgwNjM4Ci0jZGVmaW5lIFJFR19NQUNfU1BFQ19TSUZTCQkweDA2M0EKLQotLyogIDIwMTAwNzE5IEpvc2VwaDogSGFyZHdhcmUgcmVnaXN0ZXIgZGVmaW5pdGlvbiBjaGFuZ2UuIChIVyBkYXRhc2hlZXQgdjU0KSAqLwotCS8qICBbMTU6OF1TSUZTX1IyVF9PRkRNLCBbNzowXVNJRlNfUjJUX0NDSyAqLwotI2RlZmluZSBSRUdfUjJUX1NJRlMJCQkweDA2M0MKLQkvKiAgWzE1OjhdU0lGU19UMlRfT0ZETSwgWzc6MF1TSUZTX1QyVF9DQ0sgKi8KLSNkZWZpbmUgUkVHX1QyVF9TSUZTCQkJMHgwNjNFCi0jZGVmaW5lIFJFR19BQ0tUTwkJCTB4MDY0MAotI2RlZmluZSBSRUdfQ1RTMlRPCQkJMHgwNjQxCi0jZGVmaW5lIFJFR19FSUZTCQkJMHgwNjQyCi0KLS8qIFdNQSwgQkEsIENDWCAqLwotI2RlZmluZSBSRUdfTkFWX0NUUkwJCQkweDA2NTAKLSNkZWZpbmUgUkVHX0JBQ0FNQ01ECQkJMHgwNjU0Ci0jZGVmaW5lIFJFR19CQUNBTUNPTlRFTlQJCTB4MDY1OAotI2RlZmluZSBSRUdfTEJETFkJCQkweDA2NjAKLSNkZWZpbmUgUkVHX0ZXRExZCQkJMHgwNjYxCi0jZGVmaW5lIFJFR19SWEVSUl9SUFQJCQkweDA2NjQKLSNkZWZpbmUgUkVHX1dNQUNfVFJYUFRDTF9DVEwJCTB4MDY2OAotCi0KLS8qICBTZWN1cml0eSAqLwotI2RlZmluZSBSRUdfQ0FNQ01ECQkJMHgwNjcwCi0jZGVmaW5lIFJFR19DQU1XUklURQkJCTB4MDY3NAotI2RlZmluZSBSRUdfQ0FNUkVBRAkJCTB4MDY3OAotI2RlZmluZSBSRUdfQ0FNREJHCQkJMHgwNjdDCi0jZGVmaW5lIFJFR19TRUNDRkcJCQkweDA2ODAKLQotLyogIFBvd2VyICovCi0jZGVmaW5lIFJFR19XT1dfQ1RSTAkJCTB4MDY5MAotI2RlZmluZSBSRUdfUFNTVEFUVVMJCQkweDA2OTEKLSNkZWZpbmUgUkVHX1BTX1JYX0lORk8JCQkweDA2OTIKLSNkZWZpbmUgUkVHX0xQTkFWX0NUUkwJCQkweDA2OTQKLSNkZWZpbmUgUkVHX1dLRk1DQU1fQ01ECQkJMHgwNjk4Ci0jZGVmaW5lIFJFR19XS0ZNQ0FNX1JXRAkJCTB4MDY5QwotI2RlZmluZSBSRUdfUlhGTFRNQVAwCQkJMHgwNkEwCi0jZGVmaW5lIFJFR19SWEZMVE1BUDEJCQkweDA2QTIKLSNkZWZpbmUgUkVHX1JYRkxUTUFQMgkJCTB4MDZBNAotI2RlZmluZSBSRUdfQkNOX1BTUl9SUFQJCQkweDA2QTgKLSNkZWZpbmUgUkVHX0NBTEIzMktfQ1RSTAkJMHgwNkFDCi0jZGVmaW5lIFJFR19QS1RfTU9OX0NUUkwJCTB4MDZCNAotI2RlZmluZSBSRUdfQlRfQ09FWF9UQUJMRQkJMHgwNkMwCi0jZGVmaW5lIFJFR19XTUFDX1JFU1BfVFhJTkZPCQkweDA2RDgKLQotI2RlZmluZSBSRUdfTUFDSUQxCQkJMHgwNzAwCi0jZGVmaW5lIFJFR19CU1NJRDEJCQkweDA3MDgKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHhGRTAwaCB+IDB4RkU1NWgJVVNCIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lIFJFR19VU0JfSU5GTwkJCTB4RkUxNwotI2RlZmluZSBSRUdfVVNCX1NQRUNJQUxfT1BUSU9OCQkweEZFNTUKLSNkZWZpbmUgUkVHX1VTQl9ETUFfQUdHX1RPCQkweEZFNUIKLSNkZWZpbmUgUkVHX1VTQl9BR0dfVE8JCQkweEZFNUMKLSNkZWZpbmUgUkVHX1VTQl9BR0dfVEgJCQkweEZFNUQKLQotLyogIEZvciB0ZXN0IGNoaXAgKi8KLSNkZWZpbmUgUkVHX1RFU1RfVVNCX1RYUVMJCTB4RkU0OAotI2RlZmluZSBSRUdfVEVTVF9TSUVfVklECQkweEZFNjAJCS8qICAweEZFNjB+MHhGRTYxICovCi0jZGVmaW5lIFJFR19URVNUX1NJRV9QSUQJCTB4RkU2MgkJLyogIDB4RkU2Mn4weEZFNjMgKi8KLSNkZWZpbmUgUkVHX1RFU1RfU0lFX09QVElPTkFMCQkweEZFNjQKLSNkZWZpbmUgUkVHX1RFU1RfU0lFX0NISVJQX0sJCTB4RkU2NQotI2RlZmluZSBSRUdfVEVTVF9TSUVfUEhZCQkweEZFNjYJCS8qICAweEZFNjZ+MHhGRTZCICovCi0jZGVmaW5lIFJFR19URVNUX1NJRV9NQUNfQUREUgkJMHhGRTcwCQkvKiAgMHhGRTcwfjB4RkU3NSAqLwotI2RlZmluZSBSRUdfVEVTVF9TSUVfU1RSSU5HCQkweEZFODAJCS8qICAweEZFODB+MHhGRUI5ICovCi0KLQotLyogIEZvciBub3JtYWwgY2hpcCAqLwotI2RlZmluZSBSRUdfTk9STUFMX1NJRV9WSUQJCTB4RkU2MAkJLyogIDB4RkU2MH4weEZFNjEgKi8KLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfUElECQkweEZFNjIJCS8qICAweEZFNjJ+MHhGRTYzICovCi0jZGVmaW5lIFJFR19OT1JNQUxfU0lFX09QVElPTkFMCQkweEZFNjQKLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfRVAJCTB4RkU2NQkJLyogIDB4RkU2NX4weEZFNjcgKi8KLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfUEhZCQkweEZFNjgJCS8qICAweEZFNjh+MHhGRTZCICovCi0jZGVmaW5lIFJFR19OT1JNQUxfU0lFX09QVElPTkFMMgkweEZFNkMKLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfR1BTX0VQCQkweEZFNkQJCS8qICBSVEw4NzIzIG9ubHkgKi8KLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfTUFDX0FERFIJCTB4RkU3MAkJLyogIDB4RkU3MH4weEZFNzUgKi8KLSNkZWZpbmUgUkVHX05PUk1BTF9TSUVfU1RSSU5HCQkweEZFODAJCS8qICAweEZFODB+MHhGRURGICovCi0KLQotLyogICovCi0vKiAgKi8KLS8qCVJlZGlmaW5lIDgxOTJDIHJlZ2lzdGVyIGRlZmluaXRpb24gZm9yIGNvbXBhdGliaWxpdHkgKi8KLS8qICAqLwotLyogICovCi0KLS8qICBUT0RPOiB1c2UgdGhlc2UgZGVmaW5pdGlvbiB3aGVuIHVzaW5nIFJFR194eHggbmFtaW5nIHJ1bGUuICovCi0vKiAgTk9URTogRE8gTk9UIFJlbW92ZSB0aGVzZSBkZWZpbml0aW9uLiBVc2UgbGF0ZXIuICovCi0KLQkvKiAgU3lzdGVtIElzb2xhdGlvbiBJbnRlcmZhY2UgQ29udHJvbC4gKi8KLSNkZWZpbmUJU1lTX0lTT19DVFJMCQkJUkVHX1NZU19JU09fQ1RSTAotCS8qICBTeXN0ZW0gRnVuY3Rpb24gRW5hYmxlLiAqLwotI2RlZmluZQlTWVNfRlVOQ19FTgkJCVJFR19TWVNfRlVOQ19FTgotI2RlZmluZQlTWVNfQ0xLCQkJCVJFR19TWVNfQ0xLUgotCS8qICA5M0M0Ni85M0M1NiBDb21tYW5kIFJlZ2lzdGVyLiAqLwotI2RlZmluZQlDUjkzNDYJCQkJUkVHXzkzNDZDUgotCS8qICBFLUZ1c2UgQ29udHJvbC4gKi8KLSNkZWZpbmUJRUZVU0VfQ1RSTAkJCVJFR19FRlVTRV9DVFJMCi0JLyogIEUtRnVzZSBUZXN0LiAqLwotI2RlZmluZQlFRlVTRV9URVNUCQkJUkVHX0VGVVNFX1RFU1QKLQkvKiAgTWVkaWEgU3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lCU1TUgkJCQkoUkVHX0NSICsgMikKLSNkZWZpbmUJSVNSCQkJCVJFR19ISVNSCi0JLyogIFRpbWluZyBTeW5jIEZ1bmN0aW9uIFRpbWVyIFJlZ2lzdGVyLiAqLwotI2RlZmluZQlUU0ZSCQkJCVJFR19UU0ZUUgotCi0JLyogIE1BQyBJRCBSZWdpc3RlciwgT2Zmc2V0IDB4MDA1MC0weDAwNTMgKi8KLSNkZWZpbmUJTUFDSURSMAkJCQlSRUdfTUFDSUQKLQkvKiAgTUFDIElEIFJlZ2lzdGVyLCBPZmZzZXQgMHgwMDU0LTB4MDA1NSAqLwotI2RlZmluZQlNQUNJRFI0CQkJCShSRUdfTUFDSUQgKyA0KQotCi0jZGVmaW5lCVBCUAkJCQlSRUdfUEJQCi0KLQkvKiAgUmVkaWZpbmUgTUFDSUQgcmVnaXN0ZXIsIHRvIGNvbXBhdGlibGUgcHJpb3IgSUNzLiAqLwotI2RlZmluZQlJRFIwCQkJCU1BQ0lEUjAKLSNkZWZpbmUJSURSNAkJCQlNQUNJRFI0Ci0KLQotLyogICovCi0vKiAgOS4gU2VjdXJpdHkgQ29udHJvbCBSZWdpc3RlcnMJKE9mZnNldDogKSAqLwotLyogICovCi0JLyogIFNvZnR3YXJlIHdyaXRlIENBTSBpbnB1dCBjb250ZW50ICovCi0jZGVmaW5lCVdDQU1JCQkJCVJFR19DQU1XUklURQotCS8qICBTb2Z0d2FyZSByZWFkL3dyaXRlIENBTSBjb25maWcgKi8KLSNkZWZpbmUJUkNBTU8JCQkJUkVHX0NBTVJFQUQKLSNkZWZpbmUJQ0FNREJHCQkJCVJFR19DQU1EQkcKLQkvKiBTZWN1cml0eSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lCVNFQ1IJCQkJUkVHX1NFQ0NGRwotCi0vKiAgVW51c2VkIHJlZ2lzdGVyICovCi0jZGVmaW5lCVVudXNlZFJlZ2lzdGVyCQkJMHgxQkYKLSNkZWZpbmUJRENBTQkJCQlVbnVzZWRSZWdpc3RlcgotI2RlZmluZQlQU1IJCQkJVW51c2VkUmVnaXN0ZXIKLSNkZWZpbmUJQkJBZGRyCQkJCVVudXNlZFJlZ2lzdGVyCi0jZGVmaW5lCVBoeURhdGFSCQkJVW51c2VkUmVnaXN0ZXIKLQotI2RlZmluZQlJbnZhbGlkQkJSRlZhbHVlCQkweDEyMzQ1Njc4Ci0KLS8qICBNaW4gU3BhY2luZyByZWxhdGVkIHNldHRpbmdzLiAqLwotI2RlZmluZQlNQVhfTVNTX0RFTlNJVFlfMlQJCTB4MTMKLSNkZWZpbmUJTUFYX01TU19ERU5TSVRZXzFUCQkweDBBCi0KLS8qICAqLwotLyogODE5MkMgQ21kOTM0NkNSIGJpdHMJCQkoT2Zmc2V0IDB4QSwgMTZiaXQpICovCi0vKiAgKi8KLQkgLyogIEVFUFJPTSBlbmFibGUgd2hlbiBzZXQgMSAqLwotI2RlZmluZQlDbWRFRVBST01fRW4JCQlCSVQoNSkKLQkvKiAgU3lzdGVtIEVFUFJPTSBzZWxlY3QsIDA6IGJvb3QgZnJvbSBFLUZVU0UsCi0JICAgIDE6IFRoZSBFRVBST00gdXNlZCBpcyA5MzQ2ICovCi0jZGVmaW5lCUNtZEVFUlBPTVNFTAkJCUJJVCg0KQotI2RlZmluZQlDbWQ5MzQ2Q1JfOTM1NlNFTAkJQklUKDQpCi0jZGVmaW5lCUF1dG9Mb2FkRUVQUk9NCQkJKENtZEVFUFJPTV9FbnxDbWRFRVJQT01TRUwpCi0jZGVmaW5lCUF1dG9Mb2FkRUZVU0UJCQlDbWRFRVBST01fRW4KLQotLyogICovCi0vKiA4MTkyQyBHUElPIE1VWCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChvZmZzZXQgMHg0MCwgNCBieXRlKSAqLwotLyogICovCi0jZGVmaW5lCUdQSU9TRUxfR1BJTwkJCTAKLSNkZWZpbmUJR1BJT1NFTF9FTkJUCQkJQklUKDUpCi0KLS8qICAqLwotLyogICAgICAgIDgxOTJDIEdQSU8gUElOIENvbnRyb2wgUmVnaXN0ZXIgKG9mZnNldCAweDQ0LCA0IGJ5dGUpICovCi0vKiAgKi8KLQkvKiAgR1BJTyBwaW5zIGlucHV0IHZhbHVlICovCi0jZGVmaW5lCUdQSU9fSU4JCQkJUkVHX0dQSU9fUElOX0NUUkwKLQkvKiAgR1BJTyBwaW5zIG91dHB1dCB2YWx1ZSAqLwotI2RlZmluZQlHUElPX09VVAkJCShSRUdfR1BJT19QSU5fQ1RSTCsxKQotCS8qICBHUElPIHBpbnMgb3V0cHV0IGVuYWJsZSB3aGVuIGEgYml0IGlzIHNldCB0byAiMSI7Ci0JICAgIG90aGVyd2lzZSwgaW5wdXQgaXMgY29uZmlndXJlZC4gKi8KLSNkZWZpbmUJR1BJT19JT19TRUwJCQkoUkVHX0dQSU9fUElOX0NUUkwrMikKLSNkZWZpbmUJR1BJT19NT0QJCQkoUkVHX0dQSU9fUElOX0NUUkwrMykKLQotLyogICovCi0vKiA4MTkyQyAoTVNSKSBNZWRpYSBTdGF0dXMgUmVnaXN0ZXIJKE9mZnNldCAweDRDLCA4IGJpdHMpICovCi0vKiAgKi8KLS8qCi1OZXR3b3JrIFR5cGUKLTAwOiBObyBsaW5rCi0wMTogTGluayBpbiBhZCBob2MgbmV0d29yawotMTA6IExpbmsgaW4gaW5mcmFzdHJ1Y3R1cmUgbmV0d29yawotMTE6IEFQIG1vZGUKLURlZmF1bHQ6IDAwYi4KLSovCi0jZGVmaW5lCU1TUl9OT0xJTksJCQkweDAwCi0jZGVmaW5lCU1TUl9BREhPQwkJCTB4MDEKLSNkZWZpbmUJTVNSX0lORlJBCQkJMHgwMgotI2RlZmluZQlNU1JfQVAJCQkJMHgwMwotCi0vKiAgKi8KLS8qICA2LiBBZGFwdGl2ZSBDb250cm9sIFJlZ2lzdGVycyAgKE9mZnNldDogMHgwMTYwIC0gMHgwMUNGKSAqLwotLyogICovCi0vKiAgKi8KLS8qIDgxOTJDIFJlc3BvbnNlIFJhdGUgU2V0IFJlZ2lzdGVyCShvZmZzZXQgMHgxODEsIDI0Yml0cykgKi8KLS8qICAqLwotI2RlZmluZQlSUlNSX1JTQ19PRkZTRVQJCQkyMQotI2RlZmluZQlSUlNSX1NIT1JUX09GRlNFVAkJMjMKLSNkZWZpbmUJUlJTUl9SU0NfQldfNDBNCQkJMHg2MDAwMDAKLSNkZWZpbmUJUlJTUl9SU0NfVVBTVUJDSE5MCQkweDQwMDAwMAotI2RlZmluZQlSUlNSX1JTQ19MT1dTVUJDSE5MCQkweDIwMDAwMAotI2RlZmluZQlSUlNSX1NIT1JUCQkJMHg4MDAwMDAKLSNkZWZpbmUJUlJTUl8xTQkJCQlCSVQoMCkKLSNkZWZpbmUJUlJTUl8yTQkJCQlCSVQoMSkKLSNkZWZpbmUJUlJTUl81XzVNCQkJQklUKDIpCi0jZGVmaW5lCVJSU1JfMTFNCQkJQklUKDMpCi0jZGVmaW5lCVJSU1JfNk0JCQkJQklUKDQpCi0jZGVmaW5lCVJSU1JfOU0JCQkJQklUKDUpCi0jZGVmaW5lCVJSU1JfMTJNCQkJQklUKDYpCi0jZGVmaW5lCVJSU1JfMThNCQkJQklUKDcpCi0jZGVmaW5lCVJSU1JfMjRNCQkJQklUKDgpCi0jZGVmaW5lCVJSU1JfMzZNCQkJQklUKDkpCi0jZGVmaW5lCVJSU1JfNDhNCQkJQklUKDEwKQotI2RlZmluZQlSUlNSXzU0TQkJCUJJVCgxMSkKLSNkZWZpbmUJUlJTUl9NQ1MwCQkJQklUKDEyKQotI2RlZmluZQlSUlNSX01DUzEJCQlCSVQoMTMpCi0jZGVmaW5lCVJSU1JfTUNTMgkJCUJJVCgxNCkKLSNkZWZpbmUJUlJTUl9NQ1MzCQkJQklUKDE1KQotI2RlZmluZQlSUlNSX01DUzQJCQlCSVQoMTYpCi0jZGVmaW5lCVJSU1JfTUNTNQkJCUJJVCgxNykKLSNkZWZpbmUJUlJTUl9NQ1M2CQkJQklUKDE4KQotI2RlZmluZQlSUlNSX01DUzcJCQlCSVQoMTkpCi0jZGVmaW5lCUJSU1JfQWNrU2hvcnRQbWIJCUJJVCgyMykKLS8qICBDQ0sgQUNLOiB1c2UgU2hvcnQgUHJlYW1ibGUgb3Igbm90ICovCi0KLS8qICAqLwotLyogODE5MkMgQldfT1BNT0RFIGJpdHMJCQkoT2Zmc2V0IDB4MjAzLCA4Yml0KSAqLwotLyogICovCi0jZGVmaW5lCUJXX09QTU9ERV8yME1IWgkJCUJJVCgyKQotI2RlZmluZQlCV19PUE1PREVfNUcJCQlCSVQoMSkKLSNkZWZpbmUJQldfT1BNT0RFXzExSgkJCUJJVCgwKQotCi0KLS8qICAqLwotLyogODE5MkMgQ0FNIENvbmZpZyBTZXR0aW5nIChvZmZzZXQgMHgyNTAsIDEgYnl0ZSkgKi8KLS8qICAqLwotI2RlZmluZQlDQU1fVkFMSUQJCQlCSVQoMTUpCi0jZGVmaW5lCUNBTV9OT1RWQUxJRAkJCTB4MDAwMAotI2RlZmluZQlDQU1fVVNFREsJCQlCSVQoNSkKLQotI2RlZmluZQlDQU1fQ09OVEVOVF9DT1VOVAkJOAotCi0jZGVmaW5lCUNBTV9OT05FCQkJMHgwCi0jZGVmaW5lCUNBTV9XRVA0MAkJCTB4MDEKLSNkZWZpbmUJQ0FNX1RLSVAJCQkweDAyCi0jZGVmaW5lCUNBTV9BRVMJCQkJMHgwNAotI2RlZmluZQlDQU1fV0VQMTA0CQkJMHgwNQotCi0jZGVmaW5lCVRPVEFMX0NBTV9FTlRSWQkJCTMyCi0jZGVmaW5lCUhBTEZfQ0FNX0VOVFJZCQkJMTYKLQotI2RlZmluZQlDQU1fQ09ORklHX1VTRURLCQl0cnVlCi0jZGVmaW5lCUNBTV9DT05GSUdfTk9fVVNFREsJCWZhbHNlCi0KLSNkZWZpbmUJQ0FNX1dSSVRFCQkJQklUKDE2KQotI2RlZmluZQlDQU1fUkVBRAkJCTB4MDAwMDAwMDAKLSNkZWZpbmUJQ0FNX1BPTExJTklHCQkJQklUKDMxKQotCi0jZGVmaW5lCVNDUl9Vc2VESwkJCTB4MDEKLSNkZWZpbmUJU0NSX1R4U2VjRW5hYmxlCQkJMHgwMgotI2RlZmluZQlTQ1JfUnhTZWNFbmFibGUJCQkweDA0Ci0KLQotLyogICovCi0vKiAgMTIuIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlcnMJIChPZmZzZXQ6IDB4MDMwMCAtIDB4MDMwRikgKi8KLS8qICAqLwotLyogICovCi0vKiA4MTkwIElNUi9JU1IgYml0cwkJCShvZmZzZXQgMHhmZCwgIDhiaXRzKSAqLwotLyogICovCi0jZGVmaW5lCUlNUjgxOTBfRElTQUJMRUQJCTB4MAotLyogIElNUiBEVzAgQml0IDAtMzEgKi8KLQotI2RlZmluZQlJTVJfQkNORE1BSU5UNgkJCUJJVCgzMSkJLyogIEJlYWNvbiBETUEgSW50ZXJydXB0IDYgKi8KLSNkZWZpbmUJSU1SX0JDTkRNQUlOVDUJCQlCSVQoMzApCS8qICBCZWFjb24gRE1BIEludGVycnVwdCA1ICovCi0jZGVmaW5lCUlNUl9CQ05ETUFJTlQ0CQkJQklUKDI5KQkvKiAgQmVhY29uIERNQSBJbnRlcnJ1cHQgNCAqLwotI2RlZmluZQlJTVJfQkNORE1BSU5UMwkJCUJJVCgyOCkJLyogIEJlYWNvbiBETUEgSW50ZXJydXB0IDMgKi8KLSNkZWZpbmUJSU1SX0JDTkRNQUlOVDIJCQlCSVQoMjcpCS8qICBCZWFjb24gRE1BIEludGVycnVwdCAyICovCi0jZGVmaW5lCUlNUl9CQ05ETUFJTlQxCQkJQklUKDI2KQkvKiAgQmVhY29uIERNQSBJbnRlcnJ1cHQgMSAqLwotI2RlZmluZQlJTVJfQkNORE9LOAkJCUJJVCgyNSkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgOCAqLwotI2RlZmluZQlJTVJfQkNORE9LNwkJCUJJVCgyNCkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgNyAqLwotI2RlZmluZQlJTVJfQkNORE9LNgkJCUJJVCgyMykJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgNiAqLwotI2RlZmluZQlJTVJfQkNORE9LNQkJCUJJVCgyMikJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgNSAqLwotI2RlZmluZQlJTVJfQkNORE9LNAkJCUJJVCgyMSkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgNCAqLwotI2RlZmluZQlJTVJfQkNORE9LMwkJCUJJVCgyMCkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgMyAqLwotI2RlZmluZQlJTVJfQkNORE9LMgkJCUJJVCgxOSkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgMiAqLwotI2RlZmluZQlJTVJfQkNORE9LMQkJCUJJVCgxOCkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgMSAqLwotI2RlZmluZQlJTVJfVElNRU9VVDIJCQlCSVQoMTcpCS8qICBUaW1lb3V0IGludGVycnVwdCAyICovCi0jZGVmaW5lCUlNUl9USU1FT1VUMQkJCUJJVCgxNikJLyogIFRpbWVvdXQgaW50ZXJydXB0IDEgKi8KLSNkZWZpbmUJSU1SX1RYRk9WVwkJCUJJVCgxNSkJLyogIFRyYW5zbWl0IEZJRk8gT3ZlcmZsb3cgKi8KLSNkZWZpbmUJSU1SX1BTVElNRU9VVAkJCUJJVCgxNCkJLyogIFBvd2VyIHNhdmUgdGltZSBvdXQKLQkJCQkJCSAgICBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX0JjbkludAkJCUJJVCgxMykJLyogIEJlYWNvbiBETUEgSW50ZXJydXB0IDAgKi8KLSNkZWZpbmUJSU1SX1JYRk9WVwkJCUJJVCgxMikJLyogIFJlY2VpdmUgRklGTyBPdmVyZmxvdyAqLwotI2RlZmluZQlJTVJfUkRVCQkJCUJJVCgxMSkJLyogIFJlY2VpdmUgRGVzY3JpcHRvcgotCQkJCQkJICAgIFVuYXZhaWxhYmxlICovCi0jZGVmaW5lCUlNUl9BVElNRU5ECQkJQklUKDEwKQkvKiAgRm9yIDkyQyxBVElNIFdpbmRvdwotCQkJCQkJICAgIEVuZCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX0JET0sJCQlCSVQoOSkJLyogIEJlYWNvbiBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cCAqLwotI2RlZmluZQlJTVJfSElHSERPSwkJCUJJVCg4KQkvKiAgSGlnaCBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX1RCRE9LCQkJQklUKDcpCS8qICBUcmFuc21pdCBCZWFjb24gT0sKLQkJCQkJCSAgICBpbnRlcnJ1cCAqLwotI2RlZmluZQlJTVJfTUdOVERPSwkJCUJJVCg2KQkvKiAgTWFuYWdlbWVudCBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX1RCREVSCQkJQklUKDUpCS8qICBGb3IgOTJDLFRyYW5zbWl0IEJlYWNvbgotCQkJCQkJICAgIEVycm9yIEludGVycnVwdCAqLwotI2RlZmluZQlJTVJfQktET0sJCQlCSVQoNCkJLyogIEFDX0JLIERNQSBPSyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX0JFRE9LCQkJQklUKDMpCS8qICBBQ19CRSBETUEgT0sgSW50ZXJydXB0ICovCi0jZGVmaW5lCUlNUl9WSURPSwkJCUJJVCgyKQkvKiAgQUNfVkkgRE1BIE9LIEludGVycnVwdCAqLwotI2RlZmluZQlJTVJfVk9ET0sJCQlCSVQoMSkJLyogIEFDX1ZPIERNQSBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJSU1SX1JPSwkJCQlCSVQoMCkJLyogIFJlY2VpdmUgRE1BIE9LIEludGVycnVwdCAqLwotCi0jZGVmaW5lCUlNUl9SWF9NQVNLCQkJKElNUl9ST0t8SU1SX1JEVXxJTVJfUlhGT1ZXKQotI2RlZmluZQlJTVJfVFhfTUFTSwkJCShJTVJfVk9ET0t8SU1SX1ZJRE9LfElNUl9CRURPS3wgXAotCQkJCQkgSU1SX0JLRE9LfElNUl9NR05URE9LfElNUl9ISUdIRE9LfCBcCi0JCQkJCSBJTVJfQkRPSykKLQotLyogIDEzLiBIb3N0IEludGVycnVwdCBTdGF0dXMgRXh0ZW5zaW9uIFJlZ2lzdGVyIChPZmZzZXQ6IDB4MDEyQy0wMTJFaCkgKi8KLSNkZWZpbmUJSU1SX0JjbkludF9FCQkJQklUKDEyKQotI2RlZmluZQlJTVJfVFhFUlIJCQlCSVQoMTEpCi0jZGVmaW5lCUlNUl9SWEVSUgkJCUJJVCgxMCkKLSNkZWZpbmUJSU1SX0MySENNRAkJCUJJVCg5KQotI2RlZmluZQlJTVJfQ1BXTQkJCUJJVCg4KQotLyogUlNWRCBbMi03XSAqLwotI2RlZmluZQlJTVJfT0NQSU5UCQkJQklUKDEpCi0jZGVmaW5lCUlNUl9XTEFOT0ZGCQkJQklUKDApCi0KLQotLyogICAgICAgIDgxOTJDIEVFUFJPTS9FRlVTRSBzaGFyZSByZWdpc3RlciBkZWZpbml0aW9uLiAqLwotCi0vKiAgRGVmYXVsdCBWYWx1ZSBmb3IgRUVQUk9NIG9yIEVGVVNFISEhICovCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1RTU0kJCQkweDAKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVHhQb3dlckRpZmYJCTB4MAotI2RlZmluZSBFRVBST01fRGVmYXVsdF9DcnlzdGFsQ2FwCQkweDUKLSAvKiAgRGVmYXVsdDogMlgyLCBSVEw4MTkyQ0UoUUZQTjY4KSAqLwotI2RlZmluZSBFRVBST01fRGVmYXVsdF9Cb2FyZFR5cGUJCTB4MDIKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVHhQb3dlcgkJCTB4MTAxMAotI2RlZmluZSBFRVBST01fRGVmYXVsdF9IVDJUX1R4UHdyCQkweDEwCi0KLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfTGVnYWN5SFRUeFBvd2VyRGlmZgkweDMKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVGhlcm1hbE1ldGVyCQkweDEyCi0KLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfQW50VHhQb3dlckRpZmYJCTB4MAotI2RlZmluZSBFRVBST01fRGVmYXVsdF9UeFB3RGlmZl9DcnlzdGFsQ2FwCTB4NQotI2RlZmluZSBFRVBST01fRGVmYXVsdF9UeFBvd2VyTGV2ZWwJCTB4MjIKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfSFQ0MF8yU0RpZmYJCTB4MAotCS8qICBIVDIwPC0+NDAgZGVmYXVsdCBUeCBQb3dlciBJbmRleCBEaWZmZXJlbmNlICovCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X0hUMjBfRGlmZgkJMgotI2RlZmluZSBFRVBST01fRGVmYXVsdF9MZWdhY3lIVFR4UG93ZXJEaWZmCTB4MwotI2RlZmluZSBFRVBST01fRGVmYXVsdF9IVDQwX1B3ck1heE9mZnNldAkwCi0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X0hUMjBfUHdyTWF4T2Zmc2V0CTAKLQotLyogIEZvciBkZWJ1ZyAqLwotI2RlZmluZSBFRVBST01fRGVmYXVsdF9QSUQJCQkweDEyMzQKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVklECQkJMHg1Njc4Ci0jZGVmaW5lIEVFUFJPTV9EZWZhdWx0X0N1c3RvbWVySUQJCTB4QUIKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfU3ViQ3VzdG9tZXJJRAkJMHhDRAotI2RlZmluZSBFRVBST01fRGVmYXVsdF9WZXJzaW9uCQkJMAotCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fRkNDCQkJMHgwCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fSUMJCQkweDEKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9FVFNJCQkweDIKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9TUEFJTgkJMHgzCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fRlJBTkNFCQkweDQKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9NS0sJCQkweDUKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9NS0sxCQkweDYKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9JU1JBRUwJCTB4NwotI2RlZmluZSBFRVBST01fQ0hBTk5FTF9QTEFOX1RFTEVDCQkweDgKLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTl9HTE9CQUxfRE9NQUlOCTB4OQotI2RlZmluZSBFRVBST01fQ0hBTk5FTF9QTEFOX1dPUkxEX1dJREVfMTMJMHhBCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fTkNDCQkJMHhCCi0jZGVmaW5lIEVFUFJPTV9VU0JfT1BUSU9OQUwxCQkJMHhFCi0jZGVmaW5lIEVFUFJPTV9DSEFOTkVMX1BMQU5fQllfSFdfTUFTSwkJMHg4MAotCi0KLSNkZWZpbmUgRUVQUk9NX0NJRF9ERUZBVUxUCQkJMHgwCi0jZGVmaW5lIEVFUFJPTV9DSURfVE9TSElCQQkJCTB4NAotIC8qICBDQ1ggdGVzdC4gQnkgQnJ1Y2UsIDIwMDktMDItMjUuICovCi0jZGVmaW5lIEVFUFJPTV9DSURfQ0NYCQkJCTB4MTAKLSNkZWZpbmUgRUVQUk9NX0NJRF9RTUkJCQkJMHgwRAotIC8qICBhZGRlZCBieSBjaGl5b2tvIGZvciBkdG0sIDIwMDkwMTA4ICovCi0jZGVmaW5lIEVFUFJPTV9DSURfV0hRTAkJCQkweEZFCi0KLQotI2RlZmluZQlSVExfRUVQUk9NX0lECQkJCTB4ODEyOQotCi0jZGVmaW5lCVNVUFBPUlRfSFdfUkFESU9fREVURUNUKHBIYWxEYXRhKQkJXAotCShwSGFsRGF0YS0+Qm9hcmRUeXBlID09IEJPQVJEX01JTklDQVJEIHx8CVwKLQlwSGFsRGF0YS0+Qm9hcmRUeXBlID09IEJPQVJEX1VTQl9TT0xPIHx8CVwKLQlwSGFsRGF0YS0+Qm9hcmRUeXBlID09IEJPQVJEX1VTQl9DT01CTykKLQotLyogICovCi0vKiAgRUVQUk9NIGFkZHJlc3MgZm9yIFRlc3QgY2hpcCAqLwotLyogICovCi0jZGVmaW5lIEVFUFJPTV9URVNUX1VTQl9PUFQJCTB4MEUKLSNkZWZpbmUgRUVQUk9NX1RFU1RfQ0hJUlBfSwkJMHgwRgotI2RlZmluZSBFRVBST01fVEVTVF9FUF9TRVRUSU5HCQkweDBFCi0jZGVmaW5lIEVFUFJPTV9URVNUX1VTQl9QSFkJCTB4MTAKLQotCi0vKiAgKi8KLS8qICBFRVBST00gYWRkcmVzcyBmb3IgTm9ybWFsIGNoaXAgKi8KLS8qICAqLwotI2RlZmluZSBFRVBST01fTk9STUFMX1VTQl9PUFQJCTB4MEUKLSNkZWZpbmUgRUVQUk9NX05PUk1BTF9DSElSUF9LCQkweDBFCS8qICBDaGFuZ2VkICovCi0jZGVmaW5lIEVFUFJPTV9OT1JNQUxfRVBfU0VUVElORwkweDBGCS8qICBDaGFuZ2VkICovCi0jZGVmaW5lIEVFUFJPTV9OT1JNQUxfVVNCX1BIWQkJMHgxMgkvKiAgQ2hhbmdlZCAqLwotCi1lbnVtIHsKLQlCT0FSRF9VU0JfRE9OR0xFID0gMCwJLyogIFVTQiBkb25nbGUgKi8KLQlCT0FSRF9VU0JfSGlnaF9QQSA9IDEsCS8qICBVU0IgZG9uZ2xlIHdpdGggaGlnaCBwb3dlciBQQSAqLwotCUJPQVJEX01JTklDQVJEID0gMiwJLyogIE1pbmljYXJkICovCi0JQk9BUkRfVVNCX1NPTE8gPSAzLAkvKiAgVVNCIHNvbG8tU2xpbSBtb2R1bGUgKi8KLQlCT0FSRF9VU0JfQ09NQk8gPSA0LAkvKiAgVVNCIENvbWJvLVNsaW0gbW9kdWxlICovCi19OwotCi0vKiAgVGVzdCBjaGlwIGFuZCBub3JtYWwgY2hpcCBjb21tb24gZGVmaW5lICovCi0vKiAgKi8KLS8qICBFRVBST00gYWRkcmVzcyBmb3IgYm90aCAqLwotLyogICovCi0jZGVmaW5lIEVFUFJPTV9JRDAJCQkweDAwCi0jZGVmaW5lIEVFUFJPTV9JRDEJCQkweDAxCi0jZGVmaW5lIEVFUFJPTV9SVEtfUlNWMQkJCTB4MDIKLSNkZWZpbmUgRUVQUk9NX1JUS19SU1YyCQkJMHgwMwotI2RlZmluZSBFRVBST01fUlRLX1JTVjMJCQkweDA0Ci0jZGVmaW5lIEVFUFJPTV9SVEtfUlNWNAkJCTB4MDUKLSNkZWZpbmUgRUVQUk9NX1JUS19SU1Y1CQkJMHgwNgotI2RlZmluZSBFRVBST01fREJHX1NFTAkJCTB4MDcKLSNkZWZpbmUgRUVQUk9NX1JUS19SU1Y2CQkJMHgwOAotI2RlZmluZSBFRVBST01fVklECQkJMHgwQQotI2RlZmluZSBFRVBST01fUElECQkJMHgwQwotCi0jZGVmaW5lIEVFUFJPTV9NQUNfQUREUgkJCTB4MTYKLSNkZWZpbmUgRUVQUk9NX1NUUklORwkJCTB4MUMKLSNkZWZpbmUgRUVQUk9NX1NVQkNVU1RPTUVSX0lECQkweDU5Ci0jZGVmaW5lIEVFUFJPTV9DQ0tfVFhfUFdSX0lOWAkJMHg1QQotI2RlZmluZSBFRVBST01fSFQ0MF8xU19UWF9QV1JfSU5YCTB4NjAKLSNkZWZpbmUgRUVQUk9NX0hUNDBfMlNfVFhfUFdSX0lOWF9ESUZGCTB4NjYKLSNkZWZpbmUgRUVQUk9NX0hUMjBfVFhfUFdSX0lOWF9ESUZGCTB4NjkKLSNkZWZpbmUgRUVQUk9NX09GRE1fVFhfUFdSX0lOWF9ESUZGCTB4NkMKLSNkZWZpbmUgRUVQUk9NX0hUNDBfTUFYX1BXUl9PRkZTRVQJMHg2RgotI2RlZmluZSBFRVBST01fSFQyMF9NQVhfUFdSX09GRlNFVAkweDcyCi0KLSNkZWZpbmUgRUVQUk9NX0NIQU5ORUxfUExBTgkJMHg3NQotI2RlZmluZSBFRVBST01fVFNTSV9BCQkJMHg3NgotI2RlZmluZSBFRVBST01fVFNTSV9CCQkJMHg3NwotI2RlZmluZSBFRVBST01fVEhFUk1BTF9NRVRFUgkJMHg3OAotI2RlZmluZSBFRVBST01fUkZfT1BUMQkJCTB4NzkKLSNkZWZpbmUgRUVQUk9NX1JGX09QVDIJCQkweDdBCi0jZGVmaW5lIEVFUFJPTV9SRl9PUFQzCQkJMHg3QgotI2RlZmluZSBFRVBST01fUkZfT1BUNAkJCTB4N0MKLSNkZWZpbmUgRUVQUk9NX1ZFUlNJT04JCQkweDdFCi0jZGVmaW5lIEVFUFJPTV9DVVNUT01FUl9JRAkJMHg3RgotCi0JIC8qIDB4MDogUlRMODE4OFNVLCAweDE6IFJUTDgxOTFTVSwgMHgyOiBSVEw4MTkyU1UsIDB4MzogUlRMODE5MUdVICovCi0jZGVmaW5lIEVFUFJPTV9Cb2FyZFR5cGUJCTB4NTQKLQkvKiAweDVDLTB4NzYsIFR4IFBvd2VyIGluZGV4LiAqLwotI2RlZmluZSBFRVBST01fVHhQd0luZGV4CQkweDVDCi0JLyogIERpZmZlcmVuY2Ugb2YgZ2FpbiBpbmRleCBiZXR3ZWVuIGxlZ2FjeSBhbmQgaGlnaCB0aHJvdWdocHV0IE9GRE0uICovCi0jZGVmaW5lIEVFUFJPTV9Qd0RpZmYJCQkweDY3Ci0JLyogIENDSyBUeCBQb3dlciAqLwotI2RlZmluZSBFRVBST01fVHhQb3dlckNDSwkJMHg1QQotCi0vKiAgMjAwOS8wMi8wOSBDb3NhIEFkZCBmb3IgU0QzIHJlcXVpcmVtZW50ICovCi0JLyogIEhUMjAgVHggUG93ZXIgSW5kZXggRGlmZmVyZW5jZSAqLwotI2RlZmluZSBFRVBST01fVFhfUFdSX0hUMjBfRElGRgkJMHg2ZQotCS8qICBIVDIwPC0+NDAgZGVmYXVsdCBUeCBQb3dlciBJbmRleCBEaWZmZXJlbmNlICovCi0jZGVmaW5lIERFRkFVTFRfSFQyMF9UWFBXUl9ESUZGCQkyCi0JLyogIE9GRE0gVHggUG93ZXIgSW5kZXggRGlmZmVyZW5jZSAqLwotI2RlZmluZSBFRVBST01fVFhfUFdSX09GRE1fRElGRgkJMHg3MQotCi0JLyogIFBvd2VyIGRpZmYgZm9yIGNoYW5uZWwgZ3JvdXAgKi8KLSNkZWZpbmUgRUVQUk9NX1R4UFdSR3JvdXAJCTB4NzMKLQkvKiAgQ2hlY2sgaWYgcG93ZXIgc2FmZXR5IGlzIG5lZWQgKi8KLSNkZWZpbmUgRUVQUk9NX1JlZ3VsYXRvcnkJCTB4NzkKLQotCS8qICA5MmN1LCAweDdFWzRdICovCi0jZGVmaW5lIEVFUFJPTV9CTFVFVE9PVEhfQ09FWElTVAkweDdFCi0jZGVmaW5lIEVFUFJPTV9OT1JNQUxfQm9hcmRUeXBlCQlFRVBST01fUkZfT1BUMQkvKiA3OjVdICovCi0jZGVmaW5lIEJPQVJEX1RZUEVfTk9STUFMX01BU0sJCTB4RTAKLSNkZWZpbmUgQk9BUkRfVFlQRV9URVNUX01BU0sJCTB4MEYKLQkvKiBCSVQwIDEgZm9yIGJ1aWxkLWluIG1vZHVsZSwgMCBmb3IgZXh0ZXJuYWwgZG9uZ2xlICovCi0jZGVmaW5lIEVFUFJPTV9FQVNZX1JFUExBQ0VNRU5UCQkweDUwCi0vKiAgKi8KLS8qIEVQUk9NIGNvbnRlbnQgZGVmaW5pdGlvbnMgKi8KLS8qICAqLwotI2RlZmluZSBPU19MSU5LX1NQRUVECQkJQklUKDUpCi0KLSNkZWZpbmUgQk9BUkRfVFlQRV9NQVNLCQkJMHhGCi0KLSNkZWZpbmUgQlRfQ09FWElTVEVOQ0UJCQlCSVQoNCkKLSNkZWZpbmUgQlRfQ09fU0hJRlQJCQk0Ci0KLSNkZWZpbmUgRVBfTlVNQkVSX01BU0sJCQkweDMwCS8qIGJpdCA0OjUgMEVoICovCi0jZGVmaW5lIEVQX05VTUJFUl9TSElGVAkJCTQKLQotCi0jZGVmaW5lIFVTQl9QSFlfUEFSQV9TSVpFCQk1Ci0KLQotLyogICovCi0vKgkURUVQUk9NIGRlZmF1bHQgdmFsdWUgZGVmaW5pdGlvbnMgKi8KLS8qICAqLwotLyogIFVzZSAweEFCQ0QgaW5zdGVhZCBvZiAweDgxOTIgZm9yIGRlYnVnICovCi0jZGVmaW5lIEVFUFJPTV9ERUZfSURfMAkJCTB4Q0QJLyogIEJ5dGUgMHgwMCAqLwotI2RlZmluZSBFRVBST01fREVGX0lEXzEJCQkweEFCCS8qICBCeXRlIDB4MDEgKi8KLQotI2RlZmluZSBFRVBST01fREVGX1JUS19SU1ZfQTMJCTB4NzQJLyogIEJ5dGUgMHgwMyAqLwotI2RlZmluZSBFRVBST01fREVGX1JUS19SU1ZfQTQJCTB4NkQJLyogIEJ5dGUgMHgwNCAqLwotI2RlZmluZSBFRVBST01fREVGX1JUS19SU1ZfQTgJCTB4RkYJLyogIEJ5dGUgMHgwOCAqLwotCi0jZGVmaW5lIEVFUFJPTV9ERUZfVklEXzAJCTB4MEEJLyogIEJ5dGUgMHgwQSAqLwotI2RlZmluZSBFRVBST01fREVGX1ZJRF8xCQkweDBCCi0KLSNkZWZpbmUgRUVQUk9NX0RFRl9QSURfMAkJMHg5MgkvKiAgQnl0ZSAweDBDICovCi0jZGVmaW5lIEVFUFJPTV9ERUZfUElEXzEJCTB4ODEKLQotCi0jZGVmaW5lIEVFUFJPTV9URVNUX0RFRl9VU0JfT1BUCQkweDgwCS8qICBCeXRlIDB4MEUgKi8KLSNkZWZpbmUgRUVQUk9NX05PUk1BTF9ERUZfVVNCX09QVAkweDAwCS8qICBCeXRlIDB4MEUgKi8KLQotI2RlZmluZSBFRVBST01fREVGX0NISVJQSwkJMHgxNQkvKiAgQnl0ZSAweDBGICovCi0KLSNkZWZpbmUgRUVQUk9NX0RFRl9VU0JfUEhZXzAJCTB4ODUJLyogIEJ5dGUgMHgxMCAqLwotI2RlZmluZSBFRVBST01fREVGX1VTQl9QSFlfMQkJMHg2MgkvKiAgQnl0ZSAweDExICovCi0jZGVmaW5lIEVFUFJPTV9ERUZfVVNCX1BIWV8yCQkweDlFCS8qICBCeXRlIDB4MTIgKi8KLSNkZWZpbmUgRUVQUk9NX0RFRl9VU0JfUEhZXzMJCTB4MDYJLyogIEJ5dGUgMHgxMyAqLwotCi0jZGVmaW5lIEVFUFJPTV9ERUZfVFNTSV9BCQkweDA5CS8qICBCeXRlIDB4NzggKi8KLSNkZWZpbmUgRUVQUk9NX0RFRl9UU1NJX0IJCTB4MDkJLyogIEJ5dGUgMHg3OSAqLwotCi0KLSNkZWZpbmUgRUVQUk9NX0RFRl9USEVSTUFMX01FVEVSCTB4MTIJLyogIEJ5dGUgMHg3QSAqLwotCi0JLyogIENoZWNrIGlmIHBvd2VyIHNhZmV0eSBzcGVjIGlzIG5lZWQgKi8KLSNkZWZpbmUgUkZfT1BUSU9OMQkJCTB4NzkKLSNkZWZpbmUgUkZfT1BUSU9OMgkJCTB4N0EKLSNkZWZpbmUgUkZfT1BUSU9OMwkJCTB4N0IKLSNkZWZpbmUgUkZfT1BUSU9ONAkJCTB4N0MKLQotCi0jZGVmaW5lCUVFUFJPTV9VU0JfU04JCQlCSVQoMCkKLSNkZWZpbmUJRUVQUk9NX1VTQl9SRU1PVEVfV0FLRVVQCUJJVCgxKQotI2RlZmluZQlFRVBST01fVVNCX0RFVklDRV9QV1IJCUJJVCgyKQotI2RlZmluZQlFRVBST01fRVBfTlVNQkVSCQkoQklUKDMpfEJJVCg0KSkKLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUhlcmUgdGhlIHJlZ2lzdGVyIGRlZmluZXMgYXJlIGZvciA5MkMuIFdoZW4gdGhlIGRlZmluZSBpcyBhcyBzYW1lIHdpdGggOTJDLAotd2Ugd2lsbCB1c2UgdGhlIDkyQydzIGRlZmluZSBmb3IgdGhlIGNvbnNpc3RlbmN5Ci1TbyB0aGUgZm9sbG93aW5nIGRlZmluZXMgZm9yIDkyQyBpcyBub3QgZW50aXJlISEhISEhCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vKgotQmFzZWQgb24gRGF0YXNoZWV0IFYzMy0tLTA5MDQwMQotUmVnaXN0ZXIgU3VtbWFyeQotQ3VycmVudCBJT1JFRyBNQVAKLTB4MDAwMGggfiAweDAwRkZoICAgU3lzdGVtIENvbmZpZ3VyYXRpb24gKDI1NiBCeXRlcykKLTB4MDEwMGggfiAweDAxRkZoICAgTUFDVE9QIEdlbmVyYWwgQ29uZmlndXJhdGlvbiAoMjU2IEJ5dGVzKQotMHgwMjAwaCB+IDB4MDI3RmggICBUWERNQSBDb25maWd1cmF0aW9uICgxMjggQnl0ZXMpCi0weDAyODBoIH4gMHgwMkZGaCAgIFJYRE1BIENvbmZpZ3VyYXRpb24gKDEyOCBCeXRlcykKLTB4MDMwMGggfiAweDAzRkZoICAgUENJRSBFTUFDIFJlc2VydmVkIFJlZ2lvbiAoMjU2IEJ5dGVzKQotMHgwNDAwaCB+IDB4MDRGRmggICBQcm90b2NvbCBDb25maWd1cmF0aW9uICgyNTYgQnl0ZXMpCi0weDA1MDBoIH4gMHgwNUZGaCAgIEVEQ0EgQ29uZmlndXJhdGlvbiAoMjU2IEJ5dGVzKQotMHgwNjAwaCB+IDB4MDdGRmggICBXTUFDIENvbmZpZ3VyYXRpb24gKDUxMiBCeXRlcykKLTB4MjAwMGggfiAweDNGRkZoICAgODA1MSBGVyBEb3dubG9hZCBSZWdpb24gKDgxOTYgQnl0ZXMpCi0qLwotCi0vKiAgKi8KLS8qIDgxOTJDIChSQ1IpIFJlY2VpdmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgkoT2Zmc2V0IDB4NjA4LCAzMiBiaXRzKSAqLwotLyogICovCi0jZGVmaW5lCVJDUl9BUFBGQ1MJCQlCSVQoMzEpIC8qIFdNQUMgYXBwZW5kIEZDUyBhZnRlciBwYXlsb2FkKi8KLSNkZWZpbmUJUkNSX0FQUF9NSUMJCQlCSVQoMzApCi0jZGVmaW5lCVJDUl9BUFBfUEhZU1RTCQkJQklUKDI4KQotI2RlZmluZQlSQ1JfQVBQX0lDVgkJCUJJVCgyOSkKLSNkZWZpbmUJUkNSX0FQUF9QSFlTVF9SWEZGCQlCSVQoMjgpCi0jZGVmaW5lCVJDUl9BUFBfQkFfU1NOCQkJQklUKDI3KSAvKiBBY2NlcHQgQkEgU1NOICovCi0jZGVmaW5lCVJDUl9FTk1CSUQJCQlCSVQoMjQpIC8qIEVuYWJsZSBNdWx0aXBsZSBCc3NJZC4gKi8KLSNkZWZpbmUJUkNSX0xTSUdFTgkJCUJJVCgyMykKLSNkZWZpbmUJUkNSX01GQkVOCQkJQklUKDIyKQotI2RlZmluZQlSQ1JfSFRDX0xPQ19DVFJMCQlCSVQoMTQpIC8qIE1GQzwtLUhUQz0xIE1GQy0tPkhUQz0wICovCi0jZGVmaW5lCVJDUl9BTUYJCQkJQklUKDEzKSAvKiBBY2NlcHQgbWFuYWdlbWVudCB0eXBlIGZyYW1lICovCi0jZGVmaW5lCVJDUl9BQ0YJCQkJQklUKDEyKSAvKiBBY2NlcHQgY29udHJvbCB0eXBlIGZyYW1lICovCi0jZGVmaW5lCVJDUl9BREYJCQkJQklUKDExKSAvKiBBY2NlcHQgZGF0YSB0eXBlIGZyYW1lICovCi0jZGVmaW5lCVJDUl9BSUNWCQkJQklUKDkpICAvKiBBY2NlcHQgSUNWIGVycm9yIHBhY2tldCAqLwotI2RlZmluZQlSQ1JfQUNSQzMyCQkJQklUKDgpICAvKiBBY2NlcHQgQ1JDMzIgZXJyb3IgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9DQlNTSURfQkNOCQkJQklUKDcpICAvKiBBY2NlcHQgQlNTSUQgbWF0Y2ggcGFja2V0Ci0JCQkJCQkgKFJ4IGJlYWNvbiwgcHJvYmUgcnNwKSAqLwotI2RlZmluZQlSQ1JfQ0JTU0lEX0RBVEEJCQlCSVQoNikgIC8qIEFjY2VwdCBCU1NJRCBtYXRjaCBwYWNrZXQKLQkJCQkJCSAoRGF0YSkgKi8KLSNkZWZpbmUJUkNSX0NCU1NJRAkJCVJDUl9DQlNTSURfREFUQQkvKiBBY2NlcHQgQlNTSUQgbWF0Y2gKLQkJCQkJCQkgICBwYWNrZXQgKi8KLSNkZWZpbmUJUkNSX0FQV1JNR1QJCQlCSVQoNSkgIC8qIEFjY2VwdCBwb3dlciBtYW5hZ2VtZW50Ci0JCQkJCQkgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9BREQzCQkJQklUKDQpICAvKiBBY2NlcHQgYWRkcmVzcyAzIG1hdGNoCi0JCQkJCQkgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9BQgkJCQlCSVQoMykgIC8qIEFjY2VwdCBicm9hZGNhc3QgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9BTQkJCQlCSVQoMikgIC8qIEFjY2VwdCBtdWx0aWNhc3QgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9BUE0JCQkJQklUKDEpICAvKiBBY2NlcHQgcGh5c2ljYWwgbWF0Y2ggcGFja2V0ICovCi0jZGVmaW5lCVJDUl9BQVAJCQkJQklUKDApICAvKiBBY2NlcHQgYWxsIHVuaWNhc3QgcGFja2V0ICovCi0jZGVmaW5lCVJDUl9NWERNQV9PRkZTRVQJCTgKLSNkZWZpbmUJUkNSX0ZJRk9fT0ZGU0VUCQkJMTMKLQotCi0KLS8qICAqLwotLyogODE5MmMgVVNCIHNwZWNpZmljIFJlZ3NpdGVyIE9mZnNldCBhbmQgQ29udGVudCBkZWZpbml0aW9uLCAqLwotLyogMjAwOS4wOC4xOCwgYWRkZWQgYnkgdml2aS4gZm9yIG1lcmdlIDkyYyBhbmQgOTJDIGludG8gb25lIGRyaXZlciAqLwotLyogICovCi0vKiBkZWZpbmUgQVBTX0ZTTUNPCQkJMHgwMDA0ICBzYW1lIHdpdGggOTJDZSAqLwotI2RlZmluZSBSU1ZfQ1RSTAkJCTB4MDAxQwotI2RlZmluZSBSRF9DVFJMCQkJCTB4MDUyNAotCi0vKiAgKi8KLS8qICAqLwotLyoJMHhGRTAwaCB+IDB4RkU1NWgJVVNCIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0jZGVmaW5lIFJFR19VU0JfSU5GTwkJCTB4RkUxNwotI2RlZmluZSBSRUdfVVNCX1NQRUNJQUxfT1BUSU9OCQkweEZFNTUKLSNkZWZpbmUgUkVHX1VTQl9ETUFfQUdHX1RPCQkweEZFNUIKLSNkZWZpbmUgUkVHX1VTQl9BR0dfVE8JCQkweEZFNUMKLSNkZWZpbmUgUkVHX1VTQl9BR0dfVEgJCQkweEZFNUQKLQotI2RlZmluZSBSRUdfVVNCX1ZJRAkJCTB4RkU2MAotI2RlZmluZSBSRUdfVVNCX1BJRAkJCTB4RkU2MgotI2RlZmluZSBSRUdfVVNCX09QVElPTkFMCQkweEZFNjQKLSNkZWZpbmUgUkVHX1VTQl9DSElSUF9LCQkJMHhGRTY1Ci0jZGVmaW5lIFJFR19VU0JfUEhZCQkJMHhGRTY2Ci0jZGVmaW5lIFJFR19VU0JfTUFDX0FERFIJCTB4RkU3MAotCi0jZGVmaW5lIFJFR19VU0JfSFJQV00JCQkweEZFNTgKLSNkZWZpbmUgUkVHX1VTQl9IQ1BXTQkJCTB4RkU1NwotCi0jZGVmaW5lCUludmFsaWRCQlJGVmFsdWUJCTB4MTIzNDU2NzgKLQotLyogICovCi0vKiAgICAgICAgODE5MkMgUmVnc2l0ZXIgQml0IGFuZCBDb250ZW50IGRlZmluaXRpb24gKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLS8qCTB4MDAwMGggfiAweDAwRkZoCVN5c3RlbSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotCi0vKiAyIFNQUzBfQ1RSTCAqLwotI2RlZmluZSBTVzE4X0ZQV00JCQlCSVQoMykKLQotCi0vKiAyIFNZU19JU09fQ1RSTCAqLwotI2RlZmluZSBJU09fTUQyUFAJCQlCSVQoMCkKLSNkZWZpbmUgSVNPX1VBMlVTQgkJCUJJVCgxKQotI2RlZmluZSBJU09fVUQyQ09SRQkJCUJJVCgyKQotI2RlZmluZSBJU09fUEEyUENJRQkJCUJJVCgzKQotI2RlZmluZSBJU09fUEQyQ09SRQkJCUJJVCg0KQotI2RlZmluZSBJU09fSVAyTUFDCQkJQklUKDUpCi0jZGVmaW5lIElTT19ESU9QCQkJQklUKDYpCi0jZGVmaW5lIElTT19ESU9FCQkJQklUKDcpCi0jZGVmaW5lIElTT19FQjJDT1JFCQkJQklUKDgpCi0jZGVmaW5lIElTT19ESU9SCQkJQklUKDkpCi0KLSNkZWZpbmUgUFdDX0VWMjVWCQkJQklUKDE0KQotI2RlZmluZSBQV0NfRVYxMlYJCQlCSVQoMTUpCi0KLQotLyogMiBTWVNfRlVOQ19FTiAqLwotI2RlZmluZSBGRU5fQkJSU1RCCQkJQklUKDApCi0jZGVmaW5lIEZFTl9CQl9HTEJfUlNUbgkJCUJJVCgxKQotI2RlZmluZSBGRU5fVVNCQQkJCUJJVCgyKQotI2RlZmluZSBGRU5fVVBMTAkJCUJJVCgzKQotI2RlZmluZSBGRU5fVVNCRAkJCUJJVCg0KQotI2RlZmluZSBGRU5fRElPX1BDSUUJCQlCSVQoNSkKLSNkZWZpbmUgRkVOX1BDSUVBCQkJQklUKDYpCi0jZGVmaW5lIEZFTl9QUExMCQkJQklUKDcpCi0jZGVmaW5lIEZFTl9QQ0lFRAkJCUJJVCg4KQotI2RlZmluZSBGRU5fRElPRQkJCUJJVCg5KQotI2RlZmluZSBGRU5fQ1BVRU4JCQlCSVQoMTApCi0jZGVmaW5lIEZFTl9EQ09SRQkJCUJJVCgxMSkKLSNkZWZpbmUgRkVOX0VMRFIJCQlCSVQoMTIpCi0jZGVmaW5lIEZFTl9ESU9fUkYJCQlCSVQoMTMpCi0jZGVmaW5lIEZFTl9IV1BETgkJCUJJVCgxNCkKLSNkZWZpbmUgRkVOX01SRUdFTgkJCUJJVCgxNSkKLQotLyogMiBBUFNfRlNNQ08gKi8KLSNkZWZpbmUgUEZNX0xEQUxMCQkJQklUKDApCi0jZGVmaW5lIFBGTV9BTEROCQkJQklUKDEpCi0jZGVmaW5lIFBGTV9MREtQCQkJQklUKDIpCi0jZGVmaW5lIFBGTV9XT1dMCQkJQklUKDMpCi0jZGVmaW5lIEVuUEROCQkJCUJJVCg0KQotI2RlZmluZSBQRE5fUEwJCQkJQklUKDUpCi0jZGVmaW5lIEFQRk1fT05NQUMJCQlCSVQoOCkKLSNkZWZpbmUgQVBGTV9PRkYJCQlCSVQoOSkKLSNkZWZpbmUgQVBGTV9SU00JCQlCSVQoMTApCi0jZGVmaW5lIEFGU01fSFNVUwkJCUJJVCgxMSkKLSNkZWZpbmUgQUZTTV9QQ0lFCQkJQklUKDEyKQotI2RlZmluZSBBUERNX01BQwkJCUJJVCgxMykKLSNkZWZpbmUgQVBETV9IT1NUCQkJQklUKDE0KQotI2RlZmluZSBBUERNX0hQRE4JCQlCSVQoMTUpCi0jZGVmaW5lIFJEWV9NQUNPTgkJCUJJVCgxNikKLSNkZWZpbmUgU1VTX0hPU1QJCQlCSVQoMTcpCi0jZGVmaW5lIFJPUF9BTEQJCQkJQklUKDIwKQotI2RlZmluZSBST1BfUFdSCQkJCUJJVCgyMSkKLSNkZWZpbmUgUk9QX1NQUwkJCQlCSVQoMjIpCi0jZGVmaW5lIFNPUF9NUlNUCQkJQklUKDI1KQotI2RlZmluZSBTT1BfRlVTRQkJCUJJVCgyNikKLSNkZWZpbmUgU09QX0FCRwkJCQlCSVQoMjcpCi0jZGVmaW5lIFNPUF9BTUIJCQkJQklUKDI4KQotI2RlZmluZSBTT1BfUkNLCQkJCUJJVCgyOSkKLSNkZWZpbmUgU09QX0E4TQkJCQlCSVQoMzApCi0jZGVmaW5lIFhPUF9CVENLCQkJQklUKDMxKQotCi0vKiAyIFNZU19DTEtSICovCi0jZGVmaW5lIEFOQUQxNlZfRU4JCQlCSVQoMCkKLSNkZWZpbmUgQU5BOE0JCQkJQklUKDEpCi0jZGVmaW5lIE1BQ1NMUAkJCQlCSVQoNCkKLSNkZWZpbmUgTE9BREVSX0NMS19FTgkJCUJJVCg1KQotI2RlZmluZSBfODBNX1NTQ19ESVMJCQlCSVQoNykKLSNkZWZpbmUgXzgwTV9TU0NfRU5fSE8JCQlCSVQoOCkKLSNkZWZpbmUgUEhZX1NTQ19SU1RCCQkJQklUKDkpCi0jZGVmaW5lIFNFQ19DTEtfRU4JCQlCSVQoMTApCi0jZGVmaW5lIE1BQ19DTEtfRU4JCQlCSVQoMTEpCi0jZGVmaW5lIFNZU19DTEtfRU4JCQlCSVQoMTIpCi0jZGVmaW5lIFJJTkdfQ0xLX0VOCQkJQklUKDEzKQotCi0KLS8qIDIgOTM0NkNSICovCi0KLQotI2RlZmluZQkJRUVETwkJCUJJVCgwKQotI2RlZmluZQkJRUVESQkJCUJJVCgxKQotI2RlZmluZQkJRUVTSwkJCUJJVCgyKQotI2RlZmluZQkJRUVDUwkJCUJJVCgzKQotLyogZGVmaW5lCUVFUlBST01TRUwJCUJJVCg0KSAqLwotLyogZGVmaW5lCUVFUFJPTV9FTgkJQklUKDUpICovCi0jZGVmaW5lCQlCT09UX0ZST01fRUVQUk9NCUJJVCg0KQotI2RlZmluZQkJRUVQUk9NX0VOCQlCSVQoNSkKLSNkZWZpbmUJCUVFTTAJCQlCSVQoNikKLSNkZWZpbmUJCUVFTTEJCQlCSVQoNykKLQotCi0vKiAyIEFGRV9NSVNDICovCi0jZGVmaW5lIEFGRV9CR0VOCQkJQklUKDApCi0jZGVmaW5lIEFGRV9NQkVOCQkJQklUKDEpCi0jZGVmaW5lIE1BQ19JRF9FTgkJCUJJVCg3KQotCi0KLS8qIDIgU1BTMF9DVFJMICovCi0KLQotLyogMiBTUFNfT0NQX0NGRyAqLwotCi0KLS8qIDIgUlNWX0NUUkwgKi8KLSNkZWZpbmUgV0xPQ0tfQUxMCQkJQklUKDApCi0jZGVmaW5lIFdMT0NLXzAwCQkJQklUKDEpCi0jZGVmaW5lIFdMT0NLXzA0CQkJQklUKDIpCi0jZGVmaW5lIFdMT0NLXzA4CQkJQklUKDMpCi0jZGVmaW5lIFdMT0NLXzQwCQkJQklUKDQpCi0jZGVmaW5lIFJfRElTX1BSU1RfMAkJCUJJVCg1KQotI2RlZmluZSBSX0RJU19QUlNUXzEJCQlCSVQoNikKLSNkZWZpbmUgTE9DS19BTExfRU4JCQlCSVQoNykKLQotLyogMiBSRl9DVFJMICovCi0jZGVmaW5lIFJGX0VOCQkJCUJJVCgwKQotI2RlZmluZSBSRl9SU1RCCQkJCUJJVCgxKQotI2RlZmluZSBSRl9TRE1SU1RCCQkJQklUKDIpCi0KLQotCi0vKiAyIExET0ExNV9DVFJMICovCi0jZGVmaW5lIExEQTE1X0VOCQkJQklUKDApCi0jZGVmaW5lIExEQTE1X1NUQlkJCQlCSVQoMSkKLSNkZWZpbmUgTERBMTVfT0JVRgkJCUJJVCgyKQotI2RlZmluZSBMREExNV9SRUdfVk9TCQkJQklUKDMpCi0jZGVmaW5lIF9MREExNV9WT0FESih4KQkJCSgoKHgpICYgMHg3KSA8PCA0KQotCi0KLQotLyogMiBMRE9WMTJEX0NUUkwgKi8KLSNkZWZpbmUgTERWMTJfRU4JCQlCSVQoMCkKLSNkZWZpbmUgTERWMTJfU0RCWQkJCUJJVCgxKQotI2RlZmluZSBMUExET19IU00JCQlCSVQoMikKLSNkZWZpbmUgTFBMRE9fTFNNX0RJUwkJCUJJVCgzKQotI2RlZmluZSBfTERWMTJfVkFESih4KQkJCSgoKHgpICYgMHhGKSA8PCA0KQotCi0KLS8qIDIgQUZFX1hUQUxfQ1RSTCAqLwotI2RlZmluZSBYVEFMX0VOCQkJCUJJVCgwKQotI2RlZmluZSBYVEFMX0JTRUwJCQlCSVQoMSkKLSNkZWZpbmUgX1hUQUxfQk9TQyh4KQkJCSgoKHgpICYgMHgzKSA8PCAyKQotI2RlZmluZSBfWFRBTF9DQURKKHgpCQkJKCgoeCkgJiAweEYpIDw8IDQpCi0jZGVmaW5lIFhUQUxfR0FURV9VU0IJCQlCSVQoOCkKLSNkZWZpbmUgX1hUQUxfVVNCX0RSVih4KQkJKCgoeCkgJiAweDMpIDw8IDkpCi0jZGVmaW5lIFhUQUxfR0FURV9BRkUJCQlCSVQoMTEpCi0jZGVmaW5lIF9YVEFMX0FGRV9EUlYoeCkJCSgoKHgpICYgMHgzKSA8PCAxMikKLSNkZWZpbmUgWFRBTF9SRl9HQVRFCQkJQklUKDE0KQotI2RlZmluZSBfWFRBTF9SRl9EUlYoeCkJCQkoKCh4KSAmIDB4MykgPDwgMTUpCi0jZGVmaW5lIFhUQUxfR0FURV9ESUcJCQlCSVQoMTcpCi0jZGVmaW5lIF9YVEFMX0RJR19EUlYoeCkJCSgoKHgpICYgMHgzKSA8PCAxOCkKLSNkZWZpbmUgWFRBTF9CVF9HQVRFCQkJQklUKDIwKQotI2RlZmluZSBfWFRBTF9CVF9EUlYoeCkJCQkoKCh4KSAmIDB4MykgPDwgMjEpCi0jZGVmaW5lIF9YVEFMX0dQSU8oeCkJCQkoKCh4KSAmIDB4NykgPDwgMjMpCi0KLQotI2RlZmluZSBDS0RMWV9BRkUJCQlCSVQoMjYpCi0jZGVmaW5lIENLRExZX1VTQgkJCUJJVCgyNykKLSNkZWZpbmUgQ0tETFlfRElHCQkJQklUKDI4KQotI2RlZmluZSBDS0RMWV9CVAkJCUJJVCgyOSkKLQotCi0vKiAyIEFGRV9QTExfQ1RSTCAqLwotI2RlZmluZSBBUExMX0VOCQkJCUJJVCgwKQotI2RlZmluZSBBUExMXzMyMF9FTgkJCUJJVCgxKQotI2RlZmluZSBBUExMX0ZSRUZfU0VMCQkJQklUKDIpCi0jZGVmaW5lIEFQTExfRURHRV9TRUwJCQlCSVQoMykKLSNkZWZpbmUgQVBMTF9XRE9HQgkJCUJJVCg0KQotI2RlZmluZSBBUExMX0xQRkVOCQkJQklUKDUpCi0KLSNkZWZpbmUgQVBMTF9SRUZfQ0xLXzEzTUhaCQkweDEKLSNkZWZpbmUgQVBMTF9SRUZfQ0xLXzE5XzJNSFoJCTB4MgotI2RlZmluZSBBUExMX1JFRl9DTEtfMjBNSFoJCTB4MwotI2RlZmluZSBBUExMX1JFRl9DTEtfMjVNSFoJCTB4NAotI2RlZmluZSBBUExMX1JFRl9DTEtfMjZNSFoJCTB4NQotI2RlZmluZSBBUExMX1JFRl9DTEtfMzhfNE1IWgkJMHg2Ci0jZGVmaW5lIEFQTExfUkVGX0NMS180ME1IWgkJMHg3Ci0KLSNkZWZpbmUgQVBMTF8zMjBFTgkJCUJJVCgxNCkKLSNkZWZpbmUgQVBMTF84MEVOCQkJQklUKDE1KQotI2RlZmluZSBBUExMXzFNRU4JCQlCSVQoMjQpCi0KLQotLyogMiBFRlVTRV9DVFJMICovCi0jZGVmaW5lIEFMRF9FTgkJCQlCSVQoMTgpCi0jZGVmaW5lIEVGX1BECQkJCUJJVCgxOSkKLSNkZWZpbmUgRUZfRkxBRwkJCQlCSVQoMzEpCi0KLS8qIDIgRUZVU0VfVEVTVCAoRm9yIFJUTDg3MjMgcGFydGlhbGx5KSAqLwotI2RlZmluZSBFRl9UUlBUCQkJCUJJVCg3KQotCS8qICAwMDogV2lmaSBFZnVzZSwgMDE6IEJUIEVmdXNlMCwgMTA6IEJUIEVmdXNlMSwgMTE6IEJUIEVmdXNlMiAqLwotI2RlZmluZSBFRl9DRUxMX1NFTAkJCShCSVQoOCl8QklUKDkpKQotI2RlZmluZSBMRE9FMjVfRU4JCQlCSVQoMzEpCi0jZGVmaW5lIEVGVVNFX1NFTCh4KQkJCSgoKHgpICYgMHgzKSA8PCA4KQotI2RlZmluZSBFRlVTRV9TRUxfTUFTSwkJCTB4MzAwCi0jZGVmaW5lIEVGVVNFX1dJRklfU0VMXzAJCTB4MAotI2RlZmluZSBFRlVTRV9CVF9TRUxfMAkJCTB4MQotI2RlZmluZSBFRlVTRV9CVF9TRUxfMQkJCTB4MgotI2RlZmluZSBFRlVTRV9CVF9TRUxfMgkJCTB4MwotCi0jZGVmaW5lIEVGVVNFX0FDQ0VTU19PTgkJCTB4NjkJLyogIEZvciBSVEw4NzIzIG9ubHkuICovCi0jZGVmaW5lIEVGVVNFX0FDQ0VTU19PRkYJCTB4MDAJLyogIEZvciBSVEw4NzIzIG9ubHkuICovCi0KLS8qIDIgUFdSX0RBVEEgKi8KLQotLyogMiBDQUxfVElNRVIgKi8KLQotLyogMiBBQ0xLX01PTiAqLwotI2RlZmluZSBSU01fRU4JCQkJQklUKDApCi0jZGVmaW5lIFRpbWVyX0VOCQkJQklUKDQpCi0KLQotLyogMiBHUElPX01VWENGRyAqLwotI2RlZmluZSBUUlNXMEVOCQkJCUJJVCgyKQotI2RlZmluZSBUUlNXMUVOCQkJCUJJVCgzKQotI2RlZmluZSBFUk9NX0VOCQkJCUJJVCg0KQotI2RlZmluZSBFbkJUCQkJCUJJVCg1KQotI2RlZmluZSBFblVhcnQJCQkJQklUKDgpCi0jZGVmaW5lIFVhcnRfOTEwCQkJQklUKDkpCi0jZGVmaW5lIEVuUE1BQwkJCQlCSVQoMTApCi0jZGVmaW5lIFNJQ19TV1JTVAkJCUJJVCgxMSkKLSNkZWZpbmUgRW5TSUMJCQkJQklUKDEyKQotI2RlZmluZSBTSUNfMjMJCQkJQklUKDEzKQotI2RlZmluZSBFbkhEUAkJCQlCSVQoMTQpCi0jZGVmaW5lIFNJQ19MQksJCQkJQklUKDE1KQotCi0vKiAyIEdQSU9fUElOX0NUUkwgKi8KLQotLyogIEdQSU8gQklUICovCi0jZGVmaW5lIEhBTF84MTkyQ19IV19HUElPX1dQU19CSVQJQklUKDIpCi0KLS8qIDIgR1BJT19JTlRNICovCi0KLS8qIDIgTEVEQ0ZHICovCi0jZGVmaW5lIExFRDBQTAkJCQlCSVQoNCkKLSNkZWZpbmUgTEVEMERJUwkJCQlCSVQoNykKLSNkZWZpbmUgTEVEMURJUwkJCQlCSVQoMTUpCi0jZGVmaW5lIExFRDFQTAkJCQlCSVQoMTIpCi0KLSNkZWZpbmUgIFNFQ0NBTV9DTFIJCQlCSVQoMzApCi0KLQotLyogMiBGU0lNUiAqLwotCi0vKiAyIEZTSVNSICovCi0KLQotLyogMiA4MDUxRldETCAqLwotLyogMiBNQ1VGV0RMICovCi0jZGVmaW5lIE1DVUZXRExfRU4JCQlCSVQoMCkKLSNkZWZpbmUgTUNVRldETF9SRFkJCQlCSVQoMSkKLSNkZWZpbmUgRldETF9DaGtTdW1fcnB0CQkJQklUKDIpCi0jZGVmaW5lIE1BQ0lOSV9SRFkJCQlCSVQoMykKLSNkZWZpbmUgQkJJTklfUkRZCQkJQklUKDQpCi0jZGVmaW5lIFJGSU5JX1JEWQkJCUJJVCg1KQotI2RlZmluZSBXSU5USU5JX1JEWQkJCUJJVCg2KQotI2RlZmluZSBDUFJTVAkJCQlCSVQoMjMpCi0KLS8qIDJSRUdfSFBPTl9GU00gKi8KLSNkZWZpbmUgQk9ORDkyQ0VfMVQyUl9DRkcJCUJJVCgyMikKLQotCi0vKiAyIFJFR19TWVNfQ0ZHICovCi0jZGVmaW5lIFhDTEtfVkxECQkJQklUKDApCi0jZGVmaW5lIEFDTEtfVkxECQkJQklUKDEpCi0jZGVmaW5lIFVDTEtfVkxECQkJQklUKDIpCi0jZGVmaW5lIFBDTEtfVkxECQkJQklUKDMpCi0jZGVmaW5lIFBDSVJTVEIJCQkJQklUKDQpCi0jZGVmaW5lIFYxNV9WTEQJCQkJQklUKDUpCi0jZGVmaW5lIFRSUF9CMTVWX0VOCQkJQklUKDcpCi0jZGVmaW5lIFNJQ19JRExFCQkJQklUKDgpCi0jZGVmaW5lIEJEX01BQzIJCQkJQklUKDkpCi0jZGVmaW5lIEJEX01BQzEJCQkJQklUKDEwKQotI2RlZmluZSBJQ19NQUNQSFlfTU9ERQkJCUJJVCgxMSkKLSNkZWZpbmUgQ0hJUF9WRVIJCQkoQklUKDEyKXxCSVQoMTMpfEJJVCgxNCl8QklUKDE1KSkKLSNkZWZpbmUgQlRfRlVOQwkJCQlCSVQoMTYpCi0jZGVmaW5lIFZFTkRPUl9JRAkJCUJJVCgxOSkKLSNkZWZpbmUgUEFEX0hXUERfSUROCQkJQklUKDIyKQotI2RlZmluZSBUUlBfVkFVWF9FTgkJCUJJVCgyMykKLSNkZWZpbmUgVFJQX0JUX0VOCQkJQklUKDI0KQotI2RlZmluZSBCRF9QS0dfU0VMCQkJQklUKDI1KQotI2RlZmluZSBCRF9IQ0lfU0VMCQkJQklUKDI2KQotI2RlZmluZSBUWVBFX0lECQkJCUJJVCgyNykKLQotI2RlZmluZSBDSElQX1ZFUl9SVExfTUFTSwkJMHhGMDAwCS8qIEJpdCAxMiB+IDE1ICovCi0jZGVmaW5lIENISVBfVkVSX1JUTF9TSElGVAkJMTIKLQotLyogMlJFR19HUElPX09VVFNUUyAoRm9yIFJUTDg3MjMgb25seSkgKi8KLSNkZWZpbmUJRUZTX0hDSV9TRUwJCQkoQklUKDApfEJJVCgxKSkKLSNkZWZpbmUJUEFEX0hDSV9TRUwJCQkoQklUKDIpfEJJVCgzKSkKLSNkZWZpbmUJSENJX1NFTAkJCQkoQklUKDQpfEJJVCg1KSkKLSNkZWZpbmUJUEtHX1NFTF9IQ0kJCQlCSVQoNikKLSNkZWZpbmUJRkVOX0dQUwkJCQlCSVQoNykKLSNkZWZpbmUJRkVOX0JUCQkJCUJJVCg4KQotI2RlZmluZQlGRU5fV0wJCQkJQklUKDkpCi0jZGVmaW5lCUZFTl9QQ0kJCQkJQklUKDEwKQotI2RlZmluZQlGRU5fVVNCCQkJCUJJVCgxMSkKLSNkZWZpbmUJQlRSRl9IV1BETl9OCQkJQklUKDEyKQotI2RlZmluZQlXTFJGX0hXUEROX04JCQlCSVQoMTMpCi0jZGVmaW5lCVBETl9CVF9OCQkJQklUKDE0KQotI2RlZmluZQlQRE5fR1BTX04JCQlCSVQoMTUpCi0jZGVmaW5lCUJUX0NUTF9IV1BETgkJCUJJVCgxNikKLSNkZWZpbmUJR1BTX0NUTF9IV1BETgkJCUJJVCgxNykKLSNkZWZpbmUJUFBIWV9TVVNCCQkJQklUKDIwKQotI2RlZmluZQlVUEhZX1NVU0IJCQlCSVQoMjEpCi0jZGVmaW5lCVBDSV9TVVNFTgkJCUJJVCgyMikKLSNkZWZpbmUJVVNCX1NVU0VOCQkJQklUKDIzKQotI2RlZmluZQlSRl9STF9JRAkJCShCSVQoMzEpfEJJVCgzMCl8QklUKDI5KXxCSVQoMjgpKQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMTAwaCB+IDB4MDFGRmgJTUFDVE9QIEdlbmVyYWwgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotCi0vKiAyIEZ1bmN0aW9uIEVuYWJsZSBSZWdpc3RlcnMgKi8KLS8qIDIgQ1IgKi8KLQotI2RlZmluZSBSRUdfTEJNT0RFCQkJKFJFR19DUiArIDMpCi0KLQotI2RlZmluZSBIQ0lfVFhETUFfRU4JCQlCSVQoMCkKLSNkZWZpbmUgSENJX1JYRE1BX0VOCQkJQklUKDEpCi0jZGVmaW5lIFRYRE1BX0VOCQkJQklUKDIpCi0jZGVmaW5lIFJYRE1BX0VOCQkJQklUKDMpCi0jZGVmaW5lIFBST1RPQ09MX0VOCQkJQklUKDQpCi0jZGVmaW5lIFNDSEVEVUxFX0VOCQkJQklUKDUpCi0jZGVmaW5lIE1BQ1RYRU4JCQkJQklUKDYpCi0jZGVmaW5lIE1BQ1JYRU4JCQkJQklUKDcpCi0jZGVmaW5lIEVOU1dCQ04JCQkJQklUKDgpCi0jZGVmaW5lIEVOU0VDCQkJCUJJVCg5KQotCi0jZGVmaW5lIF9MQk1PREUoeCkJCQkoKCh4KSAmIDB4RikgPDwgMjQpCi0jZGVmaW5lIE1BU0tfTEJNT0RFCQkJMHhGMDAwMDAwCi0jZGVmaW5lIExPT1BCQUNLX05PUk1BTAkJCTB4MAotI2RlZmluZSBMT09QQkFDS19JTU1FRElBVEVMWQkJMHhCCi0jZGVmaW5lIExPT1BCQUNLX01BQ19ERUxBWQkJMHgzCi0jZGVmaW5lIExPT1BCQUNLX1BIWQkJCTB4MQotI2RlZmluZSBMT09QQkFDS19ETUEJCQkweDcKLQotCi0vKiAyIFBCUCAtIFBhZ2UgU2l6ZSBSZWdpc3RlciAqLwotI2RlZmluZSBHRVRfUlhfUEFHRV9TSVpFKHZhbHVlKQkJKCh2YWx1ZSkgJiAweEYpCi0jZGVmaW5lIEdFVF9UWF9QQUdFX1NJWkUodmFsdWUpCQkoKCh2YWx1ZSkgJiAweEYwKSA+PiA0KQotI2RlZmluZSBfUFNSWF9NQVNLCQkJMHhGCi0jZGVmaW5lIF9QU1RYX01BU0sJCQkweEYwCi0jZGVmaW5lIF9QU1JYKHgpCQkJKHgpCi0jZGVmaW5lIF9QU1RYKHgpCQkJKCh4KSA8PCA0KQotCi0jZGVmaW5lIFBCUF82NAkJCQkweDAKLSNkZWZpbmUgUEJQXzEyOAkJCQkweDEKLSNkZWZpbmUgUEJQXzI1NgkJCQkweDIKLSNkZWZpbmUgUEJQXzUxMgkJCQkweDMKLSNkZWZpbmUgUEJQXzEwMjQJCQkweDQKLQotCi0vKiAyIFRYL1JYRE1BICovCi0jZGVmaW5lIFJYRE1BX0FSQkJXX0VOCQkJQklUKDApCi0jZGVmaW5lIFJYU0hGVF9FTgkJCUJJVCgxKQotI2RlZmluZSBSWERNQV9BR0dfRU4JCQlCSVQoMikKLSNkZWZpbmUgUVNfVk9fUVVFVUUJCQlCSVQoOCkKLSNkZWZpbmUgUVNfVklfUVVFVUUJCQlCSVQoOSkKLSNkZWZpbmUgUVNfQkVfUVVFVUUJCQlCSVQoMTApCi0jZGVmaW5lIFFTX0JLX1FVRVVFCQkJQklUKDExKQotI2RlZmluZSBRU19NQU5BR0VSX1FVRVVFCQlCSVQoMTIpCi0jZGVmaW5lIFFTX0hJR0hfUVVFVUUJCQlCSVQoMTMpCi0KLSNkZWZpbmUgSFFTRUxfVk9RCQkJQklUKDApCi0jZGVmaW5lIEhRU0VMX1ZJUQkJCUJJVCgxKQotI2RlZmluZSBIUVNFTF9CRVEJCQlCSVQoMikKLSNkZWZpbmUgSFFTRUxfQktRCQkJQklUKDMpCi0jZGVmaW5lIEhRU0VMX01HVFEJCQlCSVQoNCkKLSNkZWZpbmUgSFFTRUxfSElRCQkJQklUKDUpCi0KLS8qICBGb3Igbm9ybWFsIGRyaXZlciwgMHgxMEMgKi8KLSNkZWZpbmUgX1RYRE1BX0hJUV9NQVAoeCkJCSgoKHgpJjB4MykgPDwgMTQpCi0jZGVmaW5lIF9UWERNQV9NR1FfTUFQKHgpCQkoKCh4KSYweDMpIDw8IDEyKQotI2RlZmluZSBfVFhETUFfQktRX01BUCh4KQkJKCgoeCkmMHgzKSA8PCAxMCkKLSNkZWZpbmUgX1RYRE1BX0JFUV9NQVAoeCkJCSgoKHgpJjB4MykgPDwgOCkKLSNkZWZpbmUgX1RYRE1BX1ZJUV9NQVAoeCkJCSgoKHgpJjB4MykgPDwgNikKLSNkZWZpbmUgX1RYRE1BX1ZPUV9NQVAoeCkJCSgoKHgpJjB4MykgPDwgNCkKLQotI2RlZmluZSBRVUVVRV9MT1cJCQkxCi0jZGVmaW5lIFFVRVVFX05PUk1BTAkJCTIKLSNkZWZpbmUgUVVFVUVfSElHSAkJCTMKLQotCi0KLS8qIDIgVFJYRkZfQk5EWSAqLwotCi0KLS8qIDIgTExUX0lOSVQgKi8KLSNkZWZpbmUgX0xMVF9OT19BQ1RJVkUJCQkweDAKLSNkZWZpbmUgX0xMVF9XUklURV9BQ0NFU1MJCTB4MQotI2RlZmluZSBfTExUX1JFQURfQUNDRVNTCQkweDIKLQotI2RlZmluZSBfTExUX0lOSVRfREFUQSh4KQkJKCh4KSAmIDB4RkYpCi0jZGVmaW5lIF9MTFRfSU5JVF9BRERSKHgpCQkoKCh4KSAmIDB4RkYpIDw8IDgpCi0jZGVmaW5lIF9MTFRfT1AoeCkJCQkoKCh4KSAmIDB4MykgPDwgMzApCi0jZGVmaW5lIF9MTFRfT1BfVkFMVUUoeCkJCSgoKHgpID4+IDMwKSAmIDB4MykKLQotCi0vKiAyIEJCX0FDQ0VTU19DVFJMICovCi0jZGVmaW5lIEJCX1dSSVRFX1JFQURfTUFTSwkJKEJJVCgzMSkgfCBCSVQoMzApKQotI2RlZmluZSBCQl9XUklURV9FTgkJCUJJVCgzMCkKLSNkZWZpbmUgQkJfUkVBRF9FTgkJCUJJVCgzMSkKLS8qIGRlZmluZSBCQl9BRERSX01BU0sJCQkweEZGRiAqLwotLyogZGVmaW5lIF9CQl9BRERSKHgpCQkJKCh4KSAmIEJCX0FERFJfTUFTSykgKi8KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDIwMGggfiAweDAyN0ZoCVRYRE1BIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0vKiAyIFJRUE4gKi8KLSNkZWZpbmUgX0hQUSh4KQkJCQkoKHgpICYgMHhGRikKLSNkZWZpbmUgX0xQUSh4KQkJCQkoKCh4KSAmIDB4RkYpIDw8IDgpCi0jZGVmaW5lIF9QVUJRKHgpCQkJKCgoeCkgJiAweEZGKSA8PCAxNikKLQkvKiAgTk9URTogaW4gUlFQTl9OUFEgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgX05QUSh4KQkJCQkoKHgpICYgMHhGRikKLQotCi0jZGVmaW5lIEhQUV9QVUJMSUNfRElTCQkJQklUKDI0KQotI2RlZmluZSBMUFFfUFVCTElDX0RJUwkJCUJJVCgyNSkKLSNkZWZpbmUgTERfUlFQTgkJCQlCSVQoMzEpCi0KLQotLyogMiBUREVDVFJMICovCi0jZGVmaW5lIEJDTl9WQUxJRAkJCUJJVCgxNikKLSNkZWZpbmUgQkNOX0hFQUQoeCkJCQkoKCh4KSAmIDB4RkYpIDw8IDgpCi0jZGVmaW5lCUJDTl9IRUFEX01BU0sJCQkweEZGMDAKLQotLyogMiBUREVDVEwgKi8KLSNkZWZpbmUgQkxLX0RFU0NfTlVNX1NISUZUCQk0Ci0jZGVmaW5lIEJMS19ERVNDX05VTV9NQVNLCQkweEYKLQotCi0vKiAyIFRYRE1BX09GRlNFVF9DSEsgKi8KLSNkZWZpbmUgRFJPUF9EQVRBX0VOCQkJQklUKDkpCi0KLS8qICAqLwotLyogICovCi0vKgkweDA0MDBoIH4gMHgwNDdGaAlQcm90b2NvbCBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotLyogMiBGV0hXX1RYUV9DVFJMICovCi0jZGVmaW5lIEVOX0FNUERVX1JUWV9ORVcJCUJJVCg3KQotCi0vKiAyIElOSVJUU01DU19TRUwgKi8KLSNkZWZpbmUgX0lOSVJUU01DU19TRUwoeCkJCSgoeCkgJiAweDNGKQotCi0KLS8qIDIgU1BFQyBTSUZTICovCi0jZGVmaW5lIF9TUEVDX1NJRlNfQ0NLKHgpCQkoKHgpICYgMHhGRikKLSNkZWZpbmUgX1NQRUNfU0lGU19PRkRNKHgpCQkoKCh4KSAmIDB4RkYpIDw8IDgpCi0KLQotLyogMiBSUlNSICovCi0KLSNkZWZpbmUgUkFURV9SRUdfQklUTUFQX0FMTAkJMHhGRkZGRgotCi0jZGVmaW5lIF9SUlNDX0JJVE1BUCh4KQkJCSgoeCkgJiAweEZGRkZGKQotCi0jZGVmaW5lIF9SUlNSX1JTQyh4KQkJCSgoKHgpICYgMHgzKSA8PCAyMSkKLSNkZWZpbmUgUlJTUl9SU0NfUkVTRVJWRUQJCTB4MAotI2RlZmluZSBSUlNSX1JTQ19VUFBFUl9TVUJDSEFOTkVMCTB4MQotI2RlZmluZSBSUlNSX1JTQ19MT1dFUl9TVUJDSEFOTkVMCTB4MgotI2RlZmluZSBSUlNSX1JTQ19EVVBMSUNBVEVfTU9ERQkJMHgzCi0KLQotLyogMiBBUkZSICovCi0jZGVmaW5lIFVTRV9TSE9SVF9HMQkJCUJJVCgyMCkKLQotLyogMiBBR0dMRU5fTE1UX0wgKi8KLSNkZWZpbmUgX0FHR0xNVF9NQ1MwKHgpCQkJKCh4KSAmIDB4RikKLSNkZWZpbmUgX0FHR0xNVF9NQ1MxKHgpCQkJKCgoeCkgJiAweEYpIDw8IDQpCi0jZGVmaW5lIF9BR0dMTVRfTUNTMih4KQkJCSgoKHgpICYgMHhGKSA8PCA4KQotI2RlZmluZSBfQUdHTE1UX01DUzMoeCkJCQkoKCh4KSAmIDB4RikgPDwgMTIpCi0jZGVmaW5lIF9BR0dMTVRfTUNTNCh4KQkJCSgoKHgpICYgMHhGKSA8PCAxNikKLSNkZWZpbmUgX0FHR0xNVF9NQ1M1KHgpCQkJKCgoeCkgJiAweEYpIDw8IDIwKQotI2RlZmluZSBfQUdHTE1UX01DUzYoeCkJCQkoKCh4KSAmIDB4RikgPDwgMjQpCi0jZGVmaW5lIF9BR0dMTVRfTUNTNyh4KQkJCSgoKHgpICYgMHhGKSA8PCAyOCkKLQotCi0vKiAyIFJMICovCi0jZGVmaW5lCVJFVFJZX0xJTUlUX1NIT1JUX1NISUZUCQk4Ci0jZGVmaW5lCVJFVFJZX0xJTUlUX0xPTkdfU0hJRlQJCTAKLQotCi0vKiAyIERBUkZSQyAqLwotI2RlZmluZSBfREFSRl9SQzEoeCkJCQkoKHgpICYgMHgxRikKLSNkZWZpbmUgX0RBUkZfUkMyKHgpCQkJKCgoeCkgJiAweDFGKSA8PCA4KQotI2RlZmluZSBfREFSRl9SQzMoeCkJCQkoKCh4KSAmIDB4MUYpIDw8IDE2KQotI2RlZmluZSBfREFSRl9SQzQoeCkJCQkoKCh4KSAmIDB4MUYpIDw8IDI0KQotLyogIE5PVEU6IHNoaWZ0IHN0YXJ0aW5nIGZyb20gYWRkcmVzcyAoREFSRlJDICsgNCkgKi8KLSNkZWZpbmUgX0RBUkZfUkM1KHgpCQkJKCh4KSAmIDB4MUYpCi0jZGVmaW5lIF9EQVJGX1JDNih4KQkJCSgoKHgpICYgMHgxRikgPDwgOCkKLSNkZWZpbmUgX0RBUkZfUkM3KHgpCQkJKCgoeCkgJiAweDFGKSA8PCAxNikKLSNkZWZpbmUgX0RBUkZfUkM4KHgpCQkJKCgoeCkgJiAweDFGKSA8PCAyNCkKLQotCi0vKiAyIFJBUkZSQyAqLwotI2RlZmluZSBfUkFSRl9SQzEoeCkJCQkoKHgpICYgMHgxRikKLSNkZWZpbmUgX1JBUkZfUkMyKHgpCQkJKCgoeCkgJiAweDFGKSA8PCA4KQotI2RlZmluZSBfUkFSRl9SQzMoeCkJCQkoKCh4KSAmIDB4MUYpIDw8IDE2KQotI2RlZmluZSBfUkFSRl9SQzQoeCkJCQkoKCh4KSAmIDB4MUYpIDw8IDI0KQotLyogIE5PVEU6IHNoaWZ0IHN0YXJ0aW5nIGZyb20gYWRkcmVzcyAoUkFSRlJDICsgNCkgKi8KLSNkZWZpbmUgX1JBUkZfUkM1KHgpCQkJKCh4KSAmIDB4MUYpCi0jZGVmaW5lIF9SQVJGX1JDNih4KQkJCSgoKHgpICYgMHgxRikgPDwgOCkKLSNkZWZpbmUgX1JBUkZfUkM3KHgpCQkJKCgoeCkgJiAweDFGKSA8PCAxNikKLSNkZWZpbmUgX1JBUkZfUkM4KHgpCQkJKCgoeCkgJiAweDFGKSA8PCAyNCkKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNTAwaCB+IDB4MDVGRmgJRURDQSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotCi0KLQotLyogMiBFRENBIHNldHRpbmcgKi8KLSNkZWZpbmUgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQJMTYKLSNkZWZpbmUgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQJCTEyCi0jZGVmaW5lIEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUCQk4Ci0jZGVmaW5lIEFDX1BBUkFNX0FJRlNfT0ZGU0VUCQkwCi0KLQotLyogMiBFRENBX1ZPX1BBUkFNICovCi0jZGVmaW5lIF9BSUZTKHgpCQkJKHgpCi0jZGVmaW5lIF9FQ1dfTUFYX01JTih4KQkJCSgoeCkgPDwgOCkKLSNkZWZpbmUgX1RYT1BfTElNSVQoeCkJCQkoKHgpIDw8IDE2KQotCi0KLSNkZWZpbmUgX0JDTklGUyh4KQkJCSgoeCkgJiAweEZGKQotI2RlZmluZSBfQkNORUNXKHgpCQkJKCgoeCkgJiAweEYpKTw8IDgpCi0KLQotI2RlZmluZSBfTFJMKHgpCQkJCSgoeCkgJiAweDNGKQotI2RlZmluZSBfU1JMKHgpCQkJCSgoKHgpICYgMHgzRikgPDwgOCkKLQotCi0vKiAyIFNJRlNfQ0NLICovCi0jZGVmaW5lIF9TSUZTX0NDS19DVFgoeCkJCSgoeCkgJiAweEZGKQotI2RlZmluZSBfU0lGU19DQ0tfVFJYKHgpCQkoKCh4KSAmIDB4RkYpIDw8IDgpOwotCi0KLS8qIDIgU0lGU19PRkRNICovCi0jZGVmaW5lIF9TSUZTX09GRE1fQ1RYKHgpCQkoKHgpICYgMHhGRikKLSNkZWZpbmUgX1NJRlNfT0ZETV9UUlgoeCkJCSgoKHgpICYgMHhGRikgPDwgOCk7Ci0KLQotLyogMiBUQlRUIFBST0hJQklUICovCi0jZGVmaW5lIF9UQlRUX1BST0hJQklUX0hPTEQoeCkJCSgoKHgpICYgMHhGRikgPDwgOCkKLQotCi0vKiAyIFJFR19SRF9DVFJMICovCi0jZGVmaW5lIERJU19FRENBX0NOVF9EV04JCUJJVCgxMSkKLQotCi0vKiAyIEJDTl9DVFJMICovCi0jZGVmaW5lIEVOX01CU1NJRAkJCUJJVCgxKQotI2RlZmluZSBFTl9UWEJDTl9SUFQJCQlCSVQoMikKLSNkZWZpbmUJRU5fQkNOX0ZVTkNUSU9OCQkJQklUKDMpCi0jZGVmaW5lIERJU19UU0ZfVVBEQVRFCQkJQklUKDMpCi0KLS8qICBUaGUgc2FtZSBmdW5jdGlvbiBidXQgZGlmZmVyZW50IGJpdCBmaWVsZC4gKi8KLSNkZWZpbmUJRElTX1RTRl9VRFQwX05PUk1BTF9DSElQCUJJVCg0KQotI2RlZmluZQlESVNfVFNGX1VEVDBfVEVTVF9DSElQCQlCSVQoNSkKLQotLyogMiBBQ01IV0NUUkwgKi8KLSNkZWZpbmUJQWNtSHdfSHdFbgkJCUJJVCgwKQotI2RlZmluZQlBY21Id19CZXFFbgkJCUJJVCgxKQotI2RlZmluZQlBY21Id19WaXFFbgkJCUJJVCgyKQotI2RlZmluZQlBY21Id19Wb3FFbgkJCUJJVCgzKQotI2RlZmluZQlBY21Id19CZXFTdGF0dXMJCQlCSVQoNCkKLSNkZWZpbmUJQWNtSHdfVmlxU3RhdHVzCQkJQklUKDUpCi0jZGVmaW5lCUFjbUh3X1ZvcVN0YXR1cwkJCUJJVCg2KQotCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDYwMGggfiAweDA3RkZoCVdNQUMgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBBUFNEX0NUUkwgKi8KLSNkZWZpbmUgQVBTRE9GRgkJCQlCSVQoNikKLSNkZWZpbmUgQVBTRE9GRl9TVEFUVVMJCQlCSVQoNykKLQotCi0vKiAyIEJXT1BNT0RFICovCi0jZGVmaW5lIEJXXzIwTUhaCQkJQklUKDIpCi0KLQotI2RlZmluZSBSQVRFX0JJVE1BUF9BTEwJCQkweEZGRkZGCi0KLS8qICBPbmx5IHVzZSBDQ0sgMU0gcmF0ZSBmb3IgQUNLICovCi0jZGVmaW5lIFJBVEVfUlJTUl9DQ0tfT05MWV8xTQkJMHhGRkZGMQotCi0vKiAyIFRDUiAqLwotI2RlZmluZSBUU0ZSU1QJCQkJQklUKDApCi0jZGVmaW5lIERJU19HQ0xLCQkJQklUKDEpCi0jZGVmaW5lIFBBRF9TRUwJCQkJQklUKDIpCi0jZGVmaW5lIFBXUl9TVAkJCQlCSVQoNikKLSNkZWZpbmUgUFdSQklUX09XX0VOCQkJQklUKDcpCi0jZGVmaW5lIEFDUkMJCQkJQklUKDgpCi0jZGVmaW5lIENGRU5ERk9STQkJCUJJVCg5KQotI2RlZmluZSBJQ1YJCQkJQklUKDEwKQotCi0KLQotLyogMiBSQ1IgKi8KLSNkZWZpbmUgQUFQCQkJCUJJVCgwKQotI2RlZmluZSBBUE0JCQkJQklUKDEpCi0jZGVmaW5lIEFNCQkJCUJJVCgyKQotI2RlZmluZSBBQgkJCQlCSVQoMykKLSNkZWZpbmUgQUREMwkJCQlCSVQoNCkKLSNkZWZpbmUgQVBXUk1HVAkJCQlCSVQoNSkKLSNkZWZpbmUgQ0JTU0lECQkJCUJJVCg2KQotI2RlZmluZSBDQlNTSURfQkNOCQkJQklUKDcpCi0jZGVmaW5lIEFDUkMzMgkJCQlCSVQoOCkKLSNkZWZpbmUgQUlDVgkJCQlCSVQoOSkKLSNkZWZpbmUgQURGCQkJCUJJVCgxMSkKLSNkZWZpbmUgQUNGCQkJCUJJVCgxMikKLSNkZWZpbmUgQU1GCQkJCUJJVCgxMykKLSNkZWZpbmUgSFRDX0xPQ19DVFJMCQkJQklUKDE0KQotI2RlZmluZSBVQ19EQVRBX0VOCQkJQklUKDE2KQotI2RlZmluZSBCTV9EQVRBX0VOCQkJQklUKDE3KQotI2RlZmluZSBNRkJFTgkJCQlCSVQoMjIpCi0jZGVmaW5lIExTSUdFTgkJCQlCSVQoMjMpCi0jZGVmaW5lIEVuTUJJRAkJCQlCSVQoMjQpCi0jZGVmaW5lIEFQUF9CQVNTTgkJCUJJVCgyNykKLSNkZWZpbmUgQVBQX1BIWVNUUwkJCUJJVCgyOCkKLSNkZWZpbmUgQVBQX0lDVgkJCQlCSVQoMjkpCi0jZGVmaW5lIEFQUF9NSUMJCQkJQklUKDMwKQotI2RlZmluZSBBUFBfRkNTCQkJCUJJVCgzMSkKLQotLyogMiBSWF9QS1RfTElNSVQgKi8KLQotLyogMiBSWF9ETEtfVElNRSAqLwotCi0vKiAyIE1CSURDQU1DRkcgKi8KLQotCi0KLS8qIDIgQU1QRFVfTUlOX1NQQUNFICovCi0jZGVmaW5lIF9NSU5fU1BBQ0UoeCkJCQkoKHgpICYgMHg3KQotI2RlZmluZSBfU0hPUlRfR0lfUEFERElORyh4KQkJKCgoeCkgJiAweDFGKSA8PCAzKQotCi0KLS8qIDIgUlhFUlJfUlBUICovCi0jZGVmaW5lIFJYRVJSX1RZUEVfT0ZETV9QUERVCQkwCi0jZGVmaW5lIFJYRVJSX1RZUEVfT0ZETWZhbHNlX0FMQVJNCTEKLSNkZWZpbmUJUlhFUlJfVFlQRV9PRkRNX01QRFVfT0sJCTIKLSNkZWZpbmUgUlhFUlJfVFlQRV9PRkRNX01QRFVfRkFJTAkzCi0jZGVmaW5lIFJYRVJSX1RZUEVfQ0NLX1BQRFUJCTQKLSNkZWZpbmUgUlhFUlJfVFlQRV9DQ0tmYWxzZV9BTEFSTQk1Ci0jZGVmaW5lIFJYRVJSX1RZUEVfQ0NLX01QRFVfT0sJCTYKLSNkZWZpbmUgUlhFUlJfVFlQRV9DQ0tfTVBEVV9GQUlMCTcKLSNkZWZpbmUgUlhFUlJfVFlQRV9IVF9QUERVCQk4Ci0jZGVmaW5lIFJYRVJSX1RZUEVfSFRmYWxzZV9BTEFSTQk5Ci0jZGVmaW5lIFJYRVJSX1RZUEVfSFRfTVBEVV9UT1RBTAkxMAotI2RlZmluZSBSWEVSUl9UWVBFX0hUX01QRFVfT0sJCTExCi0jZGVmaW5lIFJYRVJSX1RZUEVfSFRfTVBEVV9GQUlMCQkxMgotI2RlZmluZSBSWEVSUl9UWVBFX1JYX0ZVTExfRFJPUAkJMTUKLQotI2RlZmluZSBSWEVSUl9DT1VOVEVSX01BU0sJCTB4RkZGRkYKLSNkZWZpbmUgUlhFUlJfUlBUX1JTVAkJCUJJVCgyNykKLSNkZWZpbmUgX1JYRVJSX1JQVF9TRUwodHlwZSkJCSgodHlwZSkgPDwgMjgpCi0KLQotLyogMiBTRUNDRkcgKi8KLSNkZWZpbmUJU0NSX1R4VXNlREsJCQlCSVQoMCkJLyogRm9yY2UgVHggVXNlIERlZmF1bHQgS2V5ICovCi0jZGVmaW5lCVNDUl9SeFVzZURLCQkJQklUKDEpCS8qIEZvcmNlIFJ4IFVzZSBEZWZhdWx0IEtleSAqLwotI2RlZmluZQlTQ1JfVHhFbmNFbmFibGUJCQlCSVQoMikJLyogRW5hYmxlIFR4IEVuY3J5cHRpb24gKi8KLSNkZWZpbmUJU0NSX1J4RGVjRW5hYmxlCQkJQklUKDMpCS8qIEVuYWJsZSBSeCBEZWNyeXB0aW9uICovCi0jZGVmaW5lCVNDUl9TS0J5QTIJCQlCSVQoNCkJLyogU2VhcmNoIGtFWSBCWSBBMiAqLwotI2RlZmluZQlTQ1JfTm9TS01DCQkJQklUKDUpCS8qIE5vIEtleSBTZWFyY2ggTXVsdGljYXN0ICovCi0KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHhGRTAwaCB+IDB4RkU1NWgJVVNCIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0KLS8qIDIgVVNCIEluZm9ybWF0aW9uICgweEZFMTcpICovCi0jZGVmaW5lIFVTQl9JU19ISUdIX1NQRUVECQkwCi0jZGVmaW5lIFVTQl9JU19GVUxMX1NQRUVECQkxCi0jZGVmaW5lIFVTQl9TUEVFRF9NQVNLCQkJQklUKDUpCi0KLSNkZWZpbmUgVVNCX05PUk1BTF9TSUVfRVBfTUFTSwkJMHhGCi0jZGVmaW5lIFVTQl9OT1JNQUxfU0lFX0VQX1NISUZUCQk0Ci0KLSNkZWZpbmUgVVNCX1RFU1RfRVBfTUFTSwkJMHgzMAotI2RlZmluZSBVU0JfVEVTVF9FUF9TSElGVAkJNAotCi0vKiAyIFNwZWNpYWwgT3B0aW9uICovCi0jZGVmaW5lIFVTQl9BR0dfRU4JCQlCSVQoMykKLQotCi0vKiAyUkVHX0MySEVWVF9DTEVBUiAqLwotCS8qICBTZXQgYnkgZHJpdmVyIGFuZCBub3RpZnkgRlcgdGhhdCB0aGUgZHJpdmVyIGhhcyByZWFkIHRoZQotCSAgICBDMkggY29tbWFuZCBtZXNzYWdlICovCi0jZGVmaW5lIEMySF9FVlRfSE9TVF9DTE9TRQkJMHgwMAotCS8qICBTZXQgYnkgRlcgaW5kaWNhdGluZyB0aGF0IEZXIGhhZCBzZXQgdGhlIEMySCBjb21tYW5kIG1lc3NhZ2UKLQkgICAgYW5kIGl0J3Mgbm90IHlldCByZWFkIGJ5IGRyaXZlci4gKi8KLSNkZWZpbmUgQzJIX0VWVF9GV19DTE9TRQkJMHhGRgotCi0KLS8qIDJSRUdfTVVMVElfRlVOQ19DVFJMKEZvciBSVEw4NzIzIE9ubHkpICovCi0JLyogIEVuYWJsZSBHUElPWzldIGFzIFdpRmkgSFcgUERuIHNvdXJjZSAqLwotI2RlZmluZQlXTF9IV1BETl9FTgkJCUJJVCgwKQotCS8qICBXaUZpIEhXIFBEbiBwb2xhcml0eSBjb250cm9sICovCi0jZGVmaW5lCVdMX0hXUEROX1NMCQkJQklUKDEpCi0JLyogIFdpRmkgZnVuY3Rpb24gZW5hYmxlICovCi0jZGVmaW5lCVdMX0ZVTkNfRU4JCQlCSVQoMikKLQkvKiAgRW5hYmxlIEdQSU9bOV0gYXMgV2lGaSBSRiBIVyBQRG4gc291cmNlICovCi0jZGVmaW5lCVdMX0hXUk9GX0VOCQkJQklUKDMpCi0JLyogIEVuYWJsZSBHUElPWzExXSBhcyBCVCBIVyBQRG4gc291cmNlICovCi0jZGVmaW5lCUJUX0hXUEROX0VOCQkJQklUKDE2KQotCS8qICBCVCBIVyBQRG4gcG9sYXJpdHkgY29udHJvbCAqLwotI2RlZmluZQlCVF9IV1BETl9TTAkJCUJJVCgxNykKLQkvKiAgQlQgZnVuY3Rpb24gZW5hYmxlICovCi0jZGVmaW5lCUJUX0ZVTkNfRU4JCQlCSVQoMTgpCi0JLyogIEVuYWJsZSBHUElPWzExXSBhcyBCVC9HUFMgUkYgSFcgUERuIHNvdXJjZSAqLwotI2RlZmluZQlCVF9IV1JPRl9FTgkJCUJJVCgxOSkKLQkvKiAgRW5hYmxlIEdQSU9bMTBdIGFzIEdQUyBIVyBQRG4gc291cmNlICovCi0jZGVmaW5lCUdQU19IV1BETl9FTgkJCUJJVCgyMCkKLQkvKiAgR1BTIEhXIFBEbiBwb2xhcml0eSBjb250cm9sICovCi0jZGVmaW5lCUdQU19IV1BETl9TTAkJCUJJVCgyMSkKLQkvKiAgR1BTIGZ1bmN0aW9uIGVuYWJsZSAqLwotI2RlZmluZQlHUFNfRlVOQ19FTgkJCUJJVCgyMikKLQotLyogMyBSRUdfTElGRUNUUkxfQ1RSTCAqLwotI2RlZmluZQlIQUw5MkNfRU5fUEtUX0xJRkVfVElNRV9CSwlCSVQoMykKLSNkZWZpbmUJSEFMOTJDX0VOX1BLVF9MSUZFX1RJTUVfQkUJQklUKDIpCi0jZGVmaW5lCUhBTDkyQ19FTl9QS1RfTElGRV9USU1FX1ZJCUJJVCgxKQotI2RlZmluZQlIQUw5MkNfRU5fUEtUX0xJRkVfVElNRV9WTwlCSVQoMCkKLQotI2RlZmluZQlIQUw5MkNfTVNEVV9MSUZFX1RJTUVfVU5JVAkxMjgJLyogIGluIHVzLCBzYWlkIGJ5IFRpbS4gKi8KLQotLyogICovCi0vKiAgR2VuZXJhbCBkZWZpbml0aW9ucyAqLwotLyogICovCi0KLSNkZWZpbmUgTEFTVF9FTlRSWV9PRl9UWF9QS1RfQlVGRkVSCTI1NQotCi0jZGVmaW5lIFBPTExJTkdfTExUX1RIUkVTSE9MRAkJMjAKLSNkZWZpbmUgUE9MTElOR19SRUFEWV9USU1FT1VUX0NPVU5UCTEwMDAKLQotLyogIE1pbiBTcGFjaW5nIHJlbGF0ZWQgc2V0dGluZ3MuICovCi0jZGVmaW5lCU1BWF9NU1NfREVOU0lUWV8yVAkJMHgxMwotI2RlZmluZQlNQVhfTVNTX0RFTlNJVFlfMVQJCTB4MEEKLQotLyogICovCi0vKgk4NzIzQSBSZWdzaXRlciBvZmZzZXQgZGVmaW5pdGlvbiAqLwotLyogICovCi0jZGVmaW5lIEhBTF84NzIzQV9OQVZfVVBQRVJfVU5JVAkxMjgJCS8qICBtaWNyby1zZWNvbmQgKi8KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDAwMGggfiAweDAwRkZoCVN5c3RlbSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfU1lTT05fUkVHX0xPQ0sJCTB4MDAxQwotCi0KLS8qICAqLwotLyogICovCi0vKgkweDAxMDBoIH4gMHgwMUZGaAlNQUNUT1AgR2VuZXJhbCBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotI2RlZmluZSBSRUdfRlRJTVIJCQkweDAxMzgKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMjAwaCB+IDB4MDI3RmgJVFhETUEgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMjgwaCB+IDB4MDJGRmgJUlhETUEgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMzAwaCB+IDB4MDNGRmgJUENJZSAqLwotLyogICovCi0vKiAgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNDAwaCB+IDB4MDQ3RmgJUHJvdG9jb2wgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLSNkZWZpbmUgUkVHX0VBUkxZX01PREVfQ09OVFJPTAkJMHg0RDAKLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNTAwaCB+IDB4MDVGRmgJRURDQSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotCi0vKiAyIEJDTl9DVFJMICovCi0jZGVmaW5lIERJU19BVElNCQkJQklUKDApCi0jZGVmaW5lIERJU19CQ05RX1NVQgkJCUJJVCgxKQotI2RlZmluZSBESVNfVFNGX1VEVAkJCUJJVCg0KQotCi0KLS8qICAqLwotLyogICovCi0vKgkweDA2MDBoIH4gMHgwN0ZGaAlXTUFDIENvbmZpZ3VyYXRpb24gKi8KLS8qICAqLwotLyogICovCi0vKiAgKi8KLS8qICBOb3RlOiAqLwotLyoJVGhlIE5BViB1cHBlciB2YWx1ZSBpcyB2ZXJ5IGltcG9ydGFudCB0byBXaUZpIDExbiA1LjIuMyBOQVYgdGVzdC4KLSAqCVRoZSBkZWZhdWx0IHZhbHVlIGlzIGFsd2F5cyB0b28gc21hbGwsIGJ1dCB0aGUgV2lGaSBUZXN0UGxhbiB0ZXN0Ci0gKglieSAyNSwwMDAgbWljcm9zZWNvbmRzIG9mIE5BViB0aHJvdWdoIHNlbmRpbmcgQ1RTIGluIHRoZSBhaXIuIFdlCi0gKgltdXN0IHVwZGF0ZSB0aGlzIHZhbHVlIGdyZWF0ZXIgdGhhbiAyNSwwMDAgbWljcm9zZWNvbmRzIHRvIHBhc3MgdGhlCi0gKglpdGVtLgotKglUaGUgb2Zmc2V0IG9mIE5BVl9VUFBFUiBpbiA4MTkyQyBTcGVjIGlzIGluY29ycmVjdCwgYW5kIHRoZSBvZmZzZXQKLSoJc2hvdWxkIGJlIDB4MDY1Mi4gQ29tbWVudGVkIGJ5IFNEMSBTY290dC4gKi8KLS8qICBCeSBCcnVjZSwgMjAxMS0wNy0xOC4gKi8KLS8qICAqLwotI2RlZmluZQlSRUdfTkFWX1VQUEVSCQkJMHgwNjUyCS8qICB1bml0IG9mIDEyOCAqLwotCi0KLS8qICAqLwotLyoJODcyMyBSZWdzaXRlciBCaXQgYW5kIENvbnRlbnQgZGVmaW5pdGlvbiAqLwotLyogICovCi0KLS8qICAqLwotLyogICovCi0vKgkweDAwMDBoIH4gMHgwMEZGaAlTeXN0ZW0gQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBTUFMwX0NUUkwgKi8KLQotLyogMiBTWVNfSVNPX0NUUkwgKi8KLQotLyogMiBTWVNfRlVOQ19FTiAqLwotCi0vKiAyIEFQU19GU01DTyAqLwotI2RlZmluZSBFTl9XTE9OCQkJCUJJVCgxNikKLQotLyogMiBTWVNfQ0xLUiAqLwotCi0vKiAyIDkzNDZDUiAqLwotCi0vKiAyIEFGRV9NSVNDICovCi0KLS8qIDIgU1BTMF9DVFJMICovCi0KLS8qIDIgU1BTX09DUF9DRkcgKi8KLQotLyogMiBTWVNPTl9SRUdfTE9DSyAqLwotI2RlZmluZSBXTE9DS19BTEwJCQlCSVQoMCkKLSNkZWZpbmUgV0xPQ0tfMDAJCQlCSVQoMSkKLSNkZWZpbmUgV0xPQ0tfMDQJCQlCSVQoMikKLSNkZWZpbmUgV0xPQ0tfMDgJCQlCSVQoMykKLSNkZWZpbmUgV0xPQ0tfNDAJCQlCSVQoNCkKLSNkZWZpbmUgV0xPQ0tfMUNfQjYJCQlCSVQoNSkKLSNkZWZpbmUgUl9ESVNfUFJTVF8xCQkJQklUKDYpCi0jZGVmaW5lIExPQ0tfQUxMX0VOCQkJQklUKDcpCi0KLS8qIDIgUkZfQ1RSTCAqLwotCi0vKiAyIExET0ExNV9DVFJMICovCi0KLS8qIDIgTERPVjEyRF9DVFJMICovCi0KLS8qIDIgQUZFX1hUQUxfQ1RSTCAqLwotCi0vKiAyIEFGRV9QTExfQ1RSTCAqLwotCi0vKiAyIEVGVVNFX0NUUkwgKi8KLQotLyogMiBFRlVTRV9URVNUIChGb3IgUlRMODcyMyBwYXJ0aWFsbHkpICovCi0KLS8qIDIgUFdSX0RBVEEgKi8KLQotLyogMiBDQUxfVElNRVIgKi8KLQotLyogMiBBQ0xLX01PTiAqLwotCi0vKiAyIEdQSU9fTVVYQ0ZHICovCi0KLS8qIDIgR1BJT19QSU5fQ1RSTCAqLwotCi0vKiAyIEdQSU9fSU5UTSAqLwotCi0vKiAyIExFRENGRyAqLwotCi0vKiAyIEZTSU1SICovCi0KLS8qIDIgRlNJU1IgKi8KLQotLyogMiBIU0lNUiAqLwotLyogIDg3MjMgSG9zdCBTeXN0ZW0gSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKG9mZnNldCAweDU4LCAzMiBieXRlKSAqLwotI2RlZmluZSBIU0lNUl9HUElPMTJfMF9JTlRfRU4JCUJJVCgwKQotI2RlZmluZSBIU0lNUl9TUFNfT0NQX0lOVF9FTgkJQklUKDUpCi0jZGVmaW5lIEhTSU1SX1JPTl9JTlRfRU4JCUJJVCg2KQotI2RlZmluZSBIU0lNUl9QRE5JTlRfRU4JCQlCSVQoNykKLSNkZWZpbmUgSFNJTVJfR1BJTzlfSU5UX0VOCQlCSVQoMjUpCi0KLS8qIDIgSFNJU1IgKi8KLS8qICA4NzIzIEhvc3QgU3lzdGVtIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKG9mZnNldCAweDVDLCAzMiBieXRlKSAqLwotI2RlZmluZSBIU0lTUl9HUElPMTJfMF9JTlQJCUJJVCgwKQotI2RlZmluZSBIU0lTUl9TUFNfT0NQX0lOVAkJQklUKDUpCi0jZGVmaW5lIEhTSVNSX1JPTl9JTlQJCQlCSVQoNikKLSNkZWZpbmUgSFNJU1JfUEROSU5UCQkJQklUKDcpCi0jZGVmaW5lCUhTSVNSX0dQSU85X0lOVAkJCUJJVCgyNSkKLQotLyogIGludGVycnVwdCBtYXNrIHdoaWNoIG5lZWRzIHRvIGNsZWFyICovCi0jZGVmaW5lIE1BU0tfSFNJU1JfQ0xFQVIJCShIU0lTUl9HUElPMTJfMF9JTlQgfCBcCi0JCQkJCSBIU0lTUl9TUFNfT0NQX0lOVCB8IFwKLQkJCQkJIEhTSVNSX1JPTl9JTlQgfCBcCi0JCQkJCSBIU0lTUl9QRE5JTlQgfAlcCi0JCQkJCSBIU0lTUl9HUElPOV9JTlQpCi0KLS8qIDIgTUNVRldETCAqLwotI2RlZmluZSBSQU1fRExfU0VMCQkJQklUKDcpCS8qICAxOlJBTSwgMDpST00gKi8KLQotLyogMiBIUE9OX0ZTTSAqLwotCi0vKiAyIFNZU19DRkcgKi8KLSNkZWZpbmUgUlRMX0lECQkJCUJJVCgyMykJLyogIFRlc3RDaGlwIElELAotCQkJCQkJICAgIDE6VGVzdChSTEUpOyAwOk1QKFJMKSAqLwotI2RlZmluZSBTUFNfU0VMCQkJCUJJVCgyNCkgLyogIDE6TERPIHJlZ3VsYXRvciBtb2RlOwotCQkJCQkJICAgIDA6U3dpdGNoaW5nIHJlZ3VsYXRvciBtb2RlKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMTAwaCB+IDB4MDFGRmgJTUFDVE9QIEdlbmVyYWwgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBGdW5jdGlvbiBFbmFibGUgUmVnaXN0ZXJzICovCi0KLS8qIDIgQ1IgKi8KLSNkZWZpbmUgQ0FMVE1SX0VOCQkJQklUKDEwKQotCi0vKiAyIFBCUCAtIFBhZ2UgU2l6ZSBSZWdpc3RlciAqLwotCi0vKiAyIFRYL1JYRE1BICovCi0KLS8qIDIgVFJYRkZfQk5EWSAqLwotCi0vKiAyIExMVF9JTklUICovCi0KLS8qIDIgQkJfQUNDRVNTX0NUUkwgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwMjAwaCB+IDB4MDI3RmgJVFhETUEgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBSUVBOICovCi0KLS8qIDIgVERFQ1RSTCAqLwotCi0vKiAyIFRERUNUTCAqLwotCi0vKiAyIFRYRE1BX09GRlNFVF9DSEsgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNDAwaCB+IDB4MDQ3RmgJUHJvdG9jb2wgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBGV0hXX1RYUV9DVFJMICovCi0KLS8qIDIgSU5JUlRTTUNTX1NFTCAqLwotCi0vKiAyIFNQRUMgU0lGUyAqLwotCi0vKiAyIFJSU1IgKi8KLQotLyogMiBBUkZSICovCi0KLS8qIDIgQUdHTEVOX0xNVF9MICovCi0KLS8qIDIgUkwgKi8KLQotLyogMiBEQVJGUkMgKi8KLQotLyogMiBSQVJGUkMgKi8KLQotCi0vKiAgKi8KLS8qICAqLwotLyoJMHgwNTAwaCB+IDB4MDVGRmgJRURDQSBDb25maWd1cmF0aW9uICovCi0vKiAgKi8KLS8qICAqLwotCi0vKiAyIEVEQ0Egc2V0dGluZyAqLwotCi0vKiAyIEVEQ0FfVk9fUEFSQU0gKi8KLQotLyogMiBTSUZTX0NDSyAqLwotCi0vKiAyIFNJRlNfT0ZETSAqLwotCi0vKiAyIFRCVFQgUFJPSElCSVQgKi8KLQotLyogMiBSRUdfUkRfQ1RSTCAqLwotCi0vKiAyIEJDTl9DVFJMICovCi0KLS8qIDIgQUNNSFdDVFJMICovCi0KLQotLyogICovCi0vKiAgKi8KLS8qCTB4MDYwMGggfiAweDA3RkZoCVdNQUMgQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogMiBBUFNEX0NUUkwgKi8KLQotLyogMiBCV09QTU9ERSAqLwotCi0vKiAyIFRDUiAqLwotCi0vKiAyIFJDUiAqLwotCi0vKiAyIFJYX1BLVF9MSU1JVCAqLwotCi0vKiAyIFJYX0RMS19USU1FICovCi0KLS8qIDIgTUJJRENBTUNGRyAqLwotCi0vKiAyIEFNUERVX01JTl9TUEFDRSAqLwotCi0vKiAyIFJYRVJSX1JQVCAqLwotCi0vKiAyIFNFQ0NGRyAqLwotCi0KLS8qICAqLwotLyogICovCi0vKgkweEZFMDBoIH4gMHhGRTU1aAlSVEw4NzIzIFNESU8gQ29uZmlndXJhdGlvbiAqLwotLyogICovCi0vKiAgKi8KLQotLyogIEkvTyBidXMgZG9tYWluIGFkZHJlc3MgbWFwcGluZyAqLwotI2RlZmluZSBXTEFOX0lPUkVHX0JBU0UJCQkweDEwMjYwMDAwCi0jZGVmaW5lIEZJUk1XQVJFX0ZJRk9fQkFTRQkJMHgxMDI3MDAwMAotI2RlZmluZSBUWF9ISVFfQkFTRQkJCTB4MTAzMTAwMDAKLSNkZWZpbmUgVFhfTUlRX0JBU0UJCQkweDEwMzIwMDAwCi0jZGVmaW5lIFRYX0xPUV9CQVNFCQkJMHgxMDMzMDAwMAotI2RlZmluZSBSWF9SWDBGRl9CQVNFCQkJMHgxMDM0MDAwMAotCi0vKiAgU0RJTyBob3N0IGxvY2FsIHJlZ2lzdGVyIHNwYWNlIG1hcHBpbmcuICovCi0jZGVmaW5lIFdMQU5fSU9SRUdfTVNLCQkJMHg3RkZGCi0jZGVmaW5lIFdMQU5fRklGT19NU0sJCQkweDFGRkYJLyogIEFnZ3JlZ2F0aW9uIExlbmd0aFsxMjowXSAqLwotI2RlZmluZSBXTEFOX1JYMEZGX01TSwkJCTB4MDAwMwotCi0jZGVmaW5lIFdMQU5fUlgwRkZfREVWSUNFX0lECQk3CS8qICAwYlsxNl0sIDExMWJbMTU6MTNdICovCi0jZGVmaW5lIFdMQU5fSU9SRUdfREVWSUNFX0lECQk4CS8qICAxYlsxNl0gKi8KLQotLyogIDg3MjMgRUZVU0UgKi8KLSNkZWZpbmUgSFdTRVRfTUFYX1NJWkUJCQkyNTYKLQotCi0vKiBVU0IgaW50ZXJydXB0ICovCi0jZGVmaW5lCVVISU1SX1RJTUVPVVQyCQkJQklUKDMxKQotI2RlZmluZQlVSElNUl9USU1FT1VUMQkJCUJJVCgzMCkKLSNkZWZpbmUJVUhJTVJfUFNUSU1FT1VUCQkJQklUKDI5KQotI2RlZmluZQlVSElNUl9HVElOVDQJCQlCSVQoMjgpCi0jZGVmaW5lCVVISU1SX0dUSU5UMwkJCUJJVCgyNykKLSNkZWZpbmUJVUhJTVJfVFhCQ05FUlIJCQlCSVQoMjYpCi0jZGVmaW5lCVVISU1SX1RYQkNOT0sJCQlCSVQoMjUpCi0jZGVmaW5lCVVISU1SX1RTRl9CSVQzMl9UT0dHTEUJCUJJVCgyNCkKLSNkZWZpbmUJVUhJTVJfQkNORE1BSU5UMwkJQklUKDIzKQotI2RlZmluZQlVSElNUl9CQ05ETUFJTlQyCQlCSVQoMjIpCi0jZGVmaW5lCVVISU1SX0JDTkRNQUlOVDEJCUJJVCgyMSkKLSNkZWZpbmUJVUhJTVJfQkNORE1BSU5UMAkJQklUKDIwKQotI2RlZmluZQlVSElNUl9CQ05ET0szCQkJQklUKDE5KQotI2RlZmluZQlVSElNUl9CQ05ET0syCQkJQklUKDE4KQotI2RlZmluZQlVSElNUl9CQ05ET0sxCQkJQklUKDE3KQotI2RlZmluZQlVSElNUl9CQ05ET0swCQkJQklUKDE2KQotI2RlZmluZQlVSElNUl9IU0lTUl9JTkQJCQlCSVQoMTUpCi0jZGVmaW5lCVVISU1SX0JDTkRNQUlOVF9FCQlCSVQoMTQpCi0vKiBSU1ZECUJJVCgxMykgKi8KLSNkZWZpbmUJVUhJTVJfQ1RXX0VORAkJCUJJVCgxMikKLS8qIFJTVkQJQklUKDExKSAqLwotI2RlZmluZQlVSElNUl9DMkhDTUQJCQlCSVQoMTApCi0jZGVmaW5lCVVISU1SX0NQV00yCQkJQklUKDkpCi0jZGVmaW5lCVVISU1SX0NQV00JCQlCSVQoOCkKLSNkZWZpbmUJVUhJTVJfSElHSERPSwkJCUJJVCg3KQkvKiAgSGlnaCBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfTUdOVERPSwkJCUJJVCg2KQkvKiAgTWFuYWdlbWVudCBRdWV1ZSBETUEgT0sKLQkJCQkJCSAgICBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfQktET0sJCQlCSVQoNSkJLyogIEFDX0JLIERNQSBPSyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfQkVET0sJCQlCSVQoNCkJLyogIEFDX0JFIERNQSBPSyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfVklET0sJCQlCSVQoMykJLyogIEFDX1ZJIERNQSBPSyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfVk9ET0sJCQlCSVQoMikJLyogIEFDX1ZPIERNQSBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJVUhJTVJfUkRVCQkJQklUKDEpCS8qICBSZWNlaXZlIERlc2NyaXB0b3IKLQkJCQkJCSAgICBVbmF2YWlsYWJsZSAqLwotI2RlZmluZQlVSElNUl9ST0sJCQlCSVQoMCkJLyogIFJlY2VpdmUgRE1BIE9LIEludGVycnVwdCAqLwotCi0vKiAgVVNCIEhvc3QgSW50ZXJydXB0IFN0YXR1cyBFeHRlbnNpb24gYml0ICovCi0jZGVmaW5lCVVISU1SX0JDTkRNQUlOVDcJCUJJVCgyMykKLSNkZWZpbmUJVUhJTVJfQkNORE1BSU5UNgkJQklUKDIyKQotI2RlZmluZQlVSElNUl9CQ05ETUFJTlQ1CQlCSVQoMjEpCi0jZGVmaW5lCVVISU1SX0JDTkRNQUlOVDQJCUJJVCgyMCkKLSNkZWZpbmUJVUhJTVJfQkNORE9LNwkJCUJJVCgxOSkKLSNkZWZpbmUJVUhJTVJfQkNORE9LNgkJCUJJVCgxOCkKLSNkZWZpbmUJVUhJTVJfQkNORE9LNQkJCUJJVCgxNykKLSNkZWZpbmUJVUhJTVJfQkNORE9LNAkJCUJJVCgxNikKLS8qICBiaXQxNC0xNTogUlNWRCAqLwotI2RlZmluZQlVSElNUl9BVElNRU5EX0UJCQlCSVQoMTMpCi0jZGVmaW5lCVVISU1SX0FUSU1FTkQJCQlCSVQoMTIpCi0jZGVmaW5lCVVISU1SX1RYRVJSCQkJQklUKDExKQotI2RlZmluZQlVSElNUl9SWEVSUgkJCUJJVCgxMCkKLSNkZWZpbmUJVUhJTVJfVFhGT1ZXCQkJQklUKDkpCi0jZGVmaW5lCVVISU1SX1JYRk9WVwkJCUJJVCg4KQotLyogIGJpdDItNzogUlNWRCAqLwotI2RlZmluZQlVSElNUl9PQ1BJTlQJCQlCSVQoMSkKLS8qICBiaXQwOiBSU1ZEICovCi0KLSNkZWZpbmUJUkVHX1VTQl9ISU1SCQkJMHhGRTM4Ci0jZGVmaW5lCVJFR19VU0JfSElNUkUJCQkweEZFM0MKLSNkZWZpbmUJUkVHX1VTQl9ISVNSCQkJMHhGRTc4Ci0jZGVmaW5lCVJFR19VU0JfSElTUkUJCQkweEZFN0MKLQotI2RlZmluZQlVU0JfSU5UUl9DUFdNX09GRlNFVAkJMTYKLSNkZWZpbmUJVVNCX0lOVFJfQ09OVEVOVF9ISVNSX09GRlNFVAk0OAotI2RlZmluZQlVU0JfSU5UUl9DT05URU5UX0hJU1JFX09GRlNFVAk1MgotI2RlZmluZQlVU0JfSU5UUl9DT05URU5UX0xFTkdUSAkJNTYKLSNkZWZpbmUJVVNCX0MySF9DTURJRF9PRkZTRVQJCTAKLSNkZWZpbmUJVVNCX0MySF9TRVFfT0ZGU0VUCQkxCi0jZGVmaW5lCVVTQl9DMkhfRVZFTlRfT0ZGU0VUCQkyCi0vKiAgKi8KLS8qCUdlbmVyYWwgZGVmaW5pdGlvbnMgKi8KLS8qICAqLwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9zcmVzZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9zcmVzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5NzkxMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2Ffc3Jlc2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX1JUTDg3MjNBX1NSRVNFVF9IXwotI2RlZmluZSBfUlRMODcyM0FfU1JFU0VUX0hfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8cnR3X3NyZXNldC5oPgotCi12b2lkIHJ0bDg3MjNhX3NyZXNldF94bWl0X3N0YXR1c19jaGVjayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfeG1pdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX3htaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiMjlmNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfeG1pdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUTDg3MjNBX1hNSVRfSF9fCi0jZGVmaW5lIF9fUlRMODcyM0FfWE1JVF9IX18KLQotLyogICovCi0vKiAgUXVldWUgU2VsZWN0IFZhbHVlIGluIFR4RGVzYyAqLwotLyogICovCi0jZGVmaW5lIFFTTFRfQksJCQkJCQkJMHgyLyogMHgwMSAqLwotI2RlZmluZSBRU0xUX0JFCQkJCQkJCTB4MAotI2RlZmluZSBRU0xUX1ZJCQkJCQkJCTB4NS8qIDB4NCAqLwotI2RlZmluZSBRU0xUX1ZPCQkJCQkJCTB4Ny8qIDB4NiAqLwotI2RlZmluZSBRU0xUX0JFQUNPTgkJCQkJCTB4MTAKLSNkZWZpbmUgUVNMVF9ISUdICQkJCQkJMHgxMQotI2RlZmluZSBRU0xUX01HTlQJCQkJCQkweDEyCi0jZGVmaW5lIFFTTFRfQ01ECQkJCQkJMHgxMwotCi0vKiAgKi8KLS8qIGRlZmluZWQgZm9yIFRYIERFU0MgT3BlcmF0aW9uICovCi0vKiAgKi8KLQotI2RlZmluZSBNQVhfVElEICgxNSkKLQotLyogT0ZGU0VUIDAgKi8KLSNkZWZpbmUgT0ZGU0VUX1NaCTAKLSNkZWZpbmUgT0ZGU0VUX1NIVAkxNgotI2RlZmluZSBCTUMJCUJJVCgyNCkKLSNkZWZpbmUgTFNHCQlCSVQoMjYpCi0jZGVmaW5lIEZTRwkJQklUKDI3KQotI2RlZmluZSBPV04JCUJJVCgzMSkKLQotCi0vKiBPRkZTRVQgNCAqLwotI2RlZmluZSBQS1RfT0ZGU0VUX1NaCTAKLSNkZWZpbmUgQksJCUJJVCg2KQotI2RlZmluZSBRU0VMX1NIVAk4Ci0jZGVmaW5lIFJhdGVfSURfU0hUCTE2Ci0jZGVmaW5lIE5BVlVTRUhEUglCSVQoMjApCi0jZGVmaW5lIFBLVF9PRkZTRVRfU0hUCTI2Ci0jZGVmaW5lIEhXUEMJCUJJVCgzMSkKLQotLyogT0ZGU0VUIDggKi8KLSNkZWZpbmUgQUdHX0VOCQlCSVQoMjkpCi0KLS8qIE9GRlNFVCAxMiAqLwotI2RlZmluZSBTRVFfU0hUCQkxNgotCi0vKiBPRkZTRVQgMTYgKi8KLSNkZWZpbmUgUW9TCQlCSVQoNikKLSNkZWZpbmUgSFdfU0VRX0VOCUJJVCg3KQotI2RlZmluZSBVU0VSQVRFCQlCSVQoOCkKLSNkZWZpbmUgRElTREFUQUZCCUJJVCgxMCkKLSNkZWZpbmUgREFUQV9TSE9SVAlCSVQoMjQpCi0jZGVmaW5lIERBVEFfQlcJCUJJVCgyNSkKLQotLyogT0ZGU0VUIDIwICovCi0jZGVmaW5lIFNHSQkJQklUKDYpCi0KLXN0cnVjdCB0eGRlc2NfODcyM2EgewotCXUzMiBwa3RsZW46MTY7Ci0JdTMyIG9mZnNldDo4OwotCXUzMiBibWM6MTsKLQl1MzIgaHRjOjE7Ci0JdTMyIGxzOjE7Ci0JdTMyIGZzOjE7Ci0JdTMyIGxpbmlwOjE7Ci0JdTMyIG5vYWNtOjE7Ci0JdTMyIGdmOjE7Ci0JdTMyIG93bjoxOwotCi0JdTMyIG1hY2lkOjU7Ci0JdTMyIGFnZ19lbjoxOwotCXUzMiBiazoxOwotCXUzMiByZF9lbjoxOwotCXUzMiBxc2VsOjU7Ci0JdTMyIHJkX25hdl9leHQ6MTsKLQl1MzIgbHNpZ190eG9wX2VuOjE7Ci0JdTMyIHBpZnM6MTsKLQl1MzIgcmF0ZV9pZDo0OwotCXUzMiBuYXZ1c2VoZHI6MTsKLQl1MzIgZW5fZGVzY19pZDoxOwotCXUzMiBzZWN0eXBlOjI7Ci0JdTMyIHJzdmQwNDI0OjI7Ci0JdTMyIHBrdF9vZmZzZXQ6NTsJLyogIHVuaXQ6IDggYnl0ZXMgKi8KLQl1MzIgcnN2ZDA0MzE6MTsKLQotCXUzMiBydHNfcmM6NjsKLQl1MzIgZGF0YV9yYzo2OwotCXUzMiByc3ZkMDgxMjoyOwotCXUzMiBiYXJfcnR5X3RoOjI7Ci0JdTMyIHJzdmQwODE2OjE7Ci0JdTMyIG1vcmVmcmFnOjE7Ci0JdTMyIHJhdzoxOwotCXUzMiBjY3g6MTsKLQl1MzIgYW1wZHVfZGVuc2l0eTozOwotCXUzMiBidF9udWxsOjE7Ci0JdTMyIGFudF9zZWxfYToxOwotCXUzMiBhbnRfc2VsX2I6MTsKLQl1MzIgdHhfYW50X2NjazoyOwotCXUzMiB0eF9hbnRsOjI7Ci0JdTMyIHR4X2FudF9odDoyOwotCi0JdTMyIG5leHRoZWFkcGFnZTo4OwotCXUzMiB0YWlscGFnZTo4OwotCXUzMiBzZXE6MTI7Ci0JdTMyIGNwdV9oYW5kbGU6MTsKLQl1MzIgdGFnMToxOwotCXUzMiB0cmlnZ2VyX2ludDoxOwotCXUzMiBod3NlcV9lbjoxOwotCi0JdTMyIHJ0c3JhdGU6NTsKLQl1MzIgYXBfZGNmZToxOwotCXUzMiBod3NlcV9zZWw6MjsKLQl1MzIgdXNlcmF0ZToxOwotCXUzMiBkaXNydHNmYjoxOwotCXUzMiBkaXNkYXRhZmI6MTsKLQl1MzIgY3RzMnNlbGY6MTsKLQl1MzIgcnRzZW46MTsKLQl1MzIgaHdfcnRzX2VuOjE7Ci0JdTMyIHBvcnRfaWQ6MTsKLQl1MzIgcnN2ZDE2MTU6MzsKLQl1MzIgd2FpdF9kY3RzOjE7Ci0JdTMyIGN0czJhcF9lbjoxOwotCXUzMiBkYXRhX3NjOjI7Ci0JdTMyIGRhdGFfc3RiYzoyOwotCXUzMiBkYXRhX3Nob3J0OjE7Ci0JdTMyIGRhdGFfYnc6MTsKLQl1MzIgcnRzX3Nob3J0OjE7Ci0JdTMyIHJ0c19idzoxOwotCXUzMiBydHNfc2M6MjsKLQl1MzIgdmNzX3N0YmM6MjsKLQotCXUzMiBkYXRhcmF0ZTo2OwotCXUzMiBzZ2k6MTsKLQl1MzIgdHJ5X3JhdGU6MTsKLQl1MzIgZGF0YV9yYXRlZmJfbG10OjU7Ci0JdTMyIHJ0c19yYXRlZmJfbG10OjQ7Ci0JdTMyIHJ0eV9sbXRfZW46MTsKLQl1MzIgZGF0YV9ydF9sbXQ6NjsKLQl1MzIgdXNiX3R4YWdnX251bTo4OwotCi0JdTMyIHR4YWdnX2E6NTsKLQl1MzIgdHhhZ2dfYjo1OwotCXUzMiB1c2VfbWF4X2xlbjoxOwotCXUzMiBtYXhfYWdnX251bTo1OwotCXUzMiBtY3NnMV9tYXhfbGVuOjQ7Ci0JdTMyIG1jc2cyX21heF9sZW46NDsKLQl1MzIgbWNzZzNfbWF4X2xlbjo0OwotCXUzMiBtY3M3X3NnaV9tYXhfbGVuOjQ7Ci0KLQl1MzIgY2hlY2tzdW06MTY7CS8qICBUeEJ1ZmZTaXplKFBDSWUpL0NoZWNrU3VtKFVTQikgKi8KLQl1MzIgbWNzZzRfbWF4X2xlbjo0OwotCXUzMiBtY3NnNV9tYXhfbGVuOjQ7Ci0JdTMyIG1jc2c2X21heF9sZW46NDsKLQl1MzIgbWNzMTVfc2dpX21heF9sZW46NDsKLX07Ci0KLSNkZWZpbmUgdHhkZXNjX3NldF9jY3hfc3dfODcyM2EodHhkZXNjLCB2YWx1ZSkgXAotCWRvIHsgXAotCQkoKHN0cnVjdCB0eGRlc2NfODcyM2EgKikodHhkZXNjKSktPm1jc2c0X21heF9sZW4gPSAoKCh2YWx1ZSk+PjgpICYgMHgwZik7IFwKLQkJKChzdHJ1Y3QgdHhkZXNjXzg3MjNhICopKHR4ZGVzYykpLT5tY3MxNV9zZ2lfbWF4X2xlbj0gKCgodmFsdWUpPj40KSAmIDB4MGYpOyBcCi0JCSgoc3RydWN0IHR4ZGVzY184NzIzYSAqKSh0eGRlc2MpKS0+bWNzZzZfbWF4X2xlbiA9ICgodmFsdWUpICYgMHgwZik7IFwKLQl9IHdoaWxlICgwKQotCi1zdHJ1Y3QgdHhycHRfY2N4Xzg3MjNhIHsKLQkvKiBvZmZzZXQgMCAqLwotCXU4IHRhZzE6MTsKLQl1OCByc3ZkOjQ7Ci0JdTggaW50X2J0OjE7Ci0JdTggaW50X3RyaToxOwotCXU4IGludF9jY3g6MTsKLQotCS8qIG9mZnNldCAxICovCi0JdTggbWFjX2lkOjU7Ci0JdTggcGt0X2Ryb3A6MTsKLQl1OCBwa3Rfb2s6MTsKLQl1OCBibWM6MTsKLQotCS8qIG9mZnNldCAyICovCi0JdTggcmV0cnlfY250OjY7Ci0JdTggbGlmZXRpbWVfb3ZlcjoxOwotCXU4IHJldHJ5X292ZXI6MTsKLQotCS8qIG9mZnNldCAzICovCi0JdTggY2N4X3F0aW1lMDsKLQl1OCBjY3hfcXRpbWUxOwotCi0JLyogb2Zmc2V0IDUgKi8KLQl1OCBmaW5hbF9kYXRhX3JhdGU7Ci0KLQkvKiBvZmZzZXQgNiAqLwotCXU4IHN3MTo0OwotCXU4IHFzZWw6NDsKLQotCS8qIG9mZnNldCA3ICovCi0JdTggc3cwOwotfTsKLQotI2RlZmluZSB0eHJwdF9jY3hfc3dfODcyM2EodHhycHRfY2N4KSAoKHR4cnB0X2NjeCktPnN3MCArICgodHhycHRfY2N4KS0+c3cxPDw4KSkKLSNkZWZpbmUgdHhycHRfY2N4X3F0aW1lXzg3MjNhKHR4cnB0X2NjeCkgKCh0eHJwdF9jY3gpLT5jY3hfcXRpbWUwKygodHhycHRfY2N4KS0+Y2N4X3F0aW1lMTw8OCkpCi0KLXZvaWQgaGFuZGxlX3R4cnB0X2NjeF84NzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgKmJ1Zik7Ci12b2lkIHJ0bDg3MjNhX2ZpbGxfZmFrZV90eGRlc2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnBEZXNjLCB1MzIgQnVmZmVyTGVuLCB1OCBJc1BzUG9sbCwgdTggSXNCVFFvc051bGwpOwotCi1pbnQgcnRsODcyM2F1X2hhbF94bWl0ZnJhbWVfZW5xdWV1ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci1zMzIgcnRsODcyM2F1X3htaXRfYnVmX2hhbmRsZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0jZGVmaW5lIGhhbF94bWl0X2hhbmRsZXIgcnRsODcyM2F1X3htaXRfYnVmX2hhbmRsZXIKLWJvb2wgcnRsODcyM2F1X2hhbF94bWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKLWludCBydGw4NzIzYXVfbWdudF94bWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lKTsKLWJvb2wgcnRsODcyM2F1X3htaXRmcmFtZV9jb21wbGV0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpOwotCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19hcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE3MDhmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUV19BUF9IXwotI2RlZmluZSBfX1JUV19BUF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQotLyogZXh0ZXJuYWwgZnVuY3Rpb24gKi8KLQotdm9pZCBpbml0X21sbWVfYXBfaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgZnJlZV9tbG1lX2FwX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0vKiB2b2lkIHVwZGF0ZV9CQ05USU0oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7ICovCi12b2lkIHJ0d19hZGRfYmNuX2llKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29yaywgdTggaW5kZXgsIHU4ICpkYXRhLCB1OCBsZW4pOwotdm9pZCBydHdfcmVtb3ZlX2Jjbl9pZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmssIHU4IGluZGV4KTsKLXZvaWQgdXBkYXRlX2JlYWNvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCBpZV9pZCwgdTggKm91aSwgdTggdHgpOwotdm9pZCBhZGRfUkFUaWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhLCB1OCByc3NpX2xldmVsKTsKLXZvaWQgZXhwaXJlX3RpbWVvdXRfY2hrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCB1cGRhdGVfc3RhX2luZm8yM2FfYXBtb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci1pbnQgcnR3X2NoZWNrX2JlYWNvbl9kYXRhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgdW5zaWduZWQgaW50IGxlbik7Ci12b2lkIHJ0d19hcF9yZXN0b3JlX25ldHdvcmsoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19zZXRfbWFjYWRkcl9hY2wyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgaW50IG1vZGUpOwotCi12b2lkIGFzc29jaWF0ZWRfY2xpZW50c191cGRhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggdXBkYXRlZCk7Ci12b2lkIGJzc19jYXBfdXBkYXRlX29uX3N0YV9qb2luMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci11OCBic3NfY2FwX3VwZGF0ZV9vbl9zdGFfbGVhdmUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLXZvaWQgc3RhX2luZm9fdXBkYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci12b2lkIGFwX3N0YV9pbmZvX2RlZmVyX3VwZGF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotdTggYXBfZnJlZV9zdGEyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhLCBib29sIGFjdGl2ZSwgdTE2IHJlYXNvbik7Ci1pbnQgcnR3X3N0YV9mbHVzaDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgc3RhcnRfYXBfbW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgc3RvcF9hcF9tb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotI2VuZGlmIC8qIGVuZCBvZiBDT05GSUdfODcyM0FVX0FQX01PREUgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2NtZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19jbWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmYTk1ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2NtZC5oCisrKyAvZGV2L251bGwKQEAgLTEsODE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUV19DTURfSF8KLSNkZWZpbmUgX19SVFdfQ01EX0hfCi0KLSNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotI2luY2x1ZGUgPHJ0d19yZi5oPgotCi0jZGVmaW5lIEMySF9NRU1fU1ogKDE2KjEwMjQpCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8aWVlZTgwMjExLmg+IC8qICA8aWVlZTgwMjExL2llZWU4MDIxMS5oPiAqLwotCi0KLSNkZWZpbmUgTUFYX0NNRFNaCTEwMjQKLSNkZWZpbmUgTUFYX1JTUFNaCTUxMgotI2RlZmluZSBNQVhfRVZUU1oJMTAyNAotCi0jZGVmaW5lIENNREJVRkZfQUxJR05fU1ogNTEyCi0KLXN0cnVjdCBjbWRfb2JqIHsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyOwotCXUxNgljbWRjb2RlOwotCWludAlyZXM7Ci0JdTMyCWNtZHN6OwotCXU4CSpwYXJtYnVmOwotCXU4CSpyc3A7Ci0JdTMyCXJzcHN6OwotfTsKLQotc3RydWN0IGNtZF9wcml2IHsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7Ci0JdTMyCWNtZF9pc3N1ZWRfY250OwotCXUzMgljbWRfZG9uZV9jbnQ7Ci0JdTMyCXJzcF9jbnQ7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLX07Ci0KLSNkZWZpbmUgQzJIX1FVRVVFX01BWF9MRU4gMTAKLQotc3RydWN0CWV2dF9wcml2IHsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGlycV93azsKLX07Ci0KLSNkZWZpbmUgaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGNtZCwgcHBhcm0sIGNvZGUpIFwKLWRvIHtcCi0JcGNtZC0+Y21kY29kZSA9IGNvZGU7XAotCXBjbWQtPnBhcm1idWYgPSAodTggKikocHBhcm0pO1wKLQlwY21kLT5jbWRzeiA9IHNpemVvZiAoKnBwYXJtKTtcCi0JcGNtZC0+cnNwID0gTlVMTDtcCi0JcGNtZC0+cnNwc3ogPSAwO1wKLX0gd2hpbGUoMCkKLQotc3RydWN0IGMyaF9ldnRfaGRyIHsKLQl1OCBpZDo0OwotCXU4IHBsZW46NDsKLQl1OCBzZXE7Ci0JdTggcGF5bG9hZFswXTsKLX07Ci0KLS8qCi0gKiBEbyBub3QgcmVvcmRlciAtIHRoaXMgYWxsb3dzIGZvciBzdHJ1Y3QgZXZ0X3dvcmsgdG8gYmUgcGFzc2VkIG9uIHRvCi0gKiBydHdfYzJoX3drX2NtZDIzYSgpIGFzIGEgJ3N0cnVjdCBjMmhfZXZ0X2hkciAqJyB3aXRob3V0IG1ha2luZyBhbgotICogYWRkaXRpb25hbCBjb3B5LgotICovCi1zdHJ1Y3QgZXZ0X3dvcmsgewotCXVuaW9uIHsKLQkJc3RydWN0IGMyaF9ldnRfaGRyIGMyaF9ldnQ7Ci0JCXU4IGJ1ZlsxNl07Ci0JfSB1OwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcjsKLX07Ci0KLSNkZWZpbmUgYzJoX2V2dF9leGlzdChjMmhfZXZ0KSAoKGMyaF9ldnQpLT5pZCB8fCAoYzJoX2V2dCktPnBsZW4pCi0KLXZvaWQgcnR3X2V2dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KLWludCBydHdfZW5xdWV1ZV9jbWQyM2Eoc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiwgc3RydWN0IGNtZF9vYmogKm9iaik7Ci12b2lkIHJ0d19mcmVlX2NtZF9vYmoyM2Eoc3RydWN0IGNtZF9vYmogKnBjbWQpOwotCi1pbnQgcnR3X2NtZF90aHJlYWQyM2Eodm9pZCAqY29udGV4dCk7Ci0KLWludCBydHdfaW5pdF9jbWRfcHJpdjIzYShzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2KTsKLQotdTMyIHJ0d19pbml0X2V2dF9wcml2MjNhIChzdHJ1Y3QgZXZ0X3ByaXYgKnBldnRwcml2KTsKLXZvaWQgcnR3X2ZyZWVfZXZ0X3ByaXYyM2EgKHN0cnVjdCBldnRfcHJpdiAqcGV2dHByaXYpOwotdm9pZCBydHdfZXZ0X25vdGlmeV9pc3Ioc3RydWN0IGV2dF9wcml2ICpwZXZ0cHJpdik7Ci0KLWVudW0gcnR3X2RydmV4dHJhX2NtZF9pZAotewotCU5PTkVfV0tfQ0lELAotCURZTkFNSUNfQ0hLX1dLX0NJRCwKLQlETV9DVFJMX1dLX0NJRCwKLQlQQkNfUE9MTElOR19XS19DSUQsCi0JUE9XRVJfU0FWSU5HX0NUUkxfV0tfQ0lELC8qIElQUyxBVVRPU3VzcGVuZCAqLwotCUxQU19DVFJMX1dLX0NJRCwKLQlBTlRfU0VMRUNUX1dLX0NJRCwKLQlQMlBfUFNfV0tfQ0lELAotCVAyUF9QUk9UT19XS19DSUQsCi0JQ0hFQ0tfSElRX1dLX0NJRCwvKiBmb3Igc29mdGFwIG1vZGUsIGNoZWNrIGhpIHF1ZXVlIGlmIGVtcHR5ICovCi0JQzJIX1dLX0NJRCwKLQlSVFBfVElNRVJfQ0ZHX1dLX0NJRCwKLQlNQVhfV0tfQ0lECi19OwotCi1lbnVtIExQU19DVFJMX1RZUEUKLXsKLQlMUFNfQ1RSTF9TQ0FOPTAsCi0JTFBTX0NUUkxfSk9JTkJTUz0xLAotCUxQU19DVFJMX0NPTk5FQ1Q9MiwKLQlMUFNfQ1RSTF9ESVNDT05ORUNUPTMsCi0JTFBTX0NUUkxfU1BFQ0lBTF9QQUNLRVQ9NCwKLQlMUFNfQ1RSTF9MRUFWRT01LAotfTsKLQotZW51bSBSRklOVEZTIHsKLQlTV1NJLAotCUhXU0ksCi0JSFdQSSwKLX07Ci0KLS8qCi1DYWxsZXIgTW9kZTogSW5mcmEsIEFkLUhvQyhDKQotCi1Ob3RlczogVG8gZW50ZXIgVVNCIHN1c3BlbmQgbW9kZQotCi1Db21tYW5kIE1vZGUKLQotKi8KLXN0cnVjdCB1c2Jfc3VzcGVuZF9wYXJtIHsKLQl1MzIgYWN0aW9uOy8qICAxOiBzbGVlcCwgMDpyZXN1bWUgKi8KLX07Ci0KLS8qCi1DYWxsZXIgTW9kZTogSW5mcmEsIEFkLUhvQwotCi1Ob3RlczogVG8gam9pbiBhIGtub3duIEJTUy4KLQotQ29tbWFuZC1FdmVudCBNb2RlCi0KLSovCi0KLS8qCi1DYWxsZXIgTW9kZTogSW5mcmEsIEFkLUhvQyhDKQotCi1Ob3RlczogVG8gZGlzY29ubmVjdCB0aGUgY3VycmVudCBhc3NvY2lhdGVkIEJTUwotCi1Db21tYW5kIE1vZGUKLQotKi8KLXN0cnVjdCBkaXNjb25uZWN0X3Bhcm0gewotCXUzMiBkZWF1dGhfdGltZW91dF9tczsKLX07Ci0KLXN0cnVjdAlzZXRvcG1vZGVfcGFybSB7Ci0JZW51bSBubDgwMjExX2lmdHlwZSBtb2RlOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBUCwgQWQtSG9DLCBJbmZyYQotCi1Ob3RlczogVG8gYXNrIFJUTDg3MTEgcGVyZm9ybWluZyBzaXRlLXN1cnZleQotCi1Db21tYW5kLUV2ZW50IE1vZGUKLQotKi8KLQotI2RlZmluZSBSVFdfU1NJRF9TQ0FOX0FNT1VOVCA5IC8qICBmb3IgV0VYVF9DU0NBTl9BTU9VTlQgOSAqLwotI2RlZmluZSBSVFdfQ0hBTk5FTF9TQ0FOX0FNT1VOVCAoMTQrMzcpCi1zdHJ1Y3Qgc2l0ZXN1cnZleV9wYXJtIHsKLQlpbnQgc2Nhbl9tb2RlOwkvKiBhY3RpdmU6IDEsIHBhc3NpdmU6IDAgKi8KLQl1OCBzc2lkX251bTsKLQl1OCBjaF9udW07Ci0Jc3RydWN0IGNmZzgwMjExX3NzaWQgc3NpZFtSVFdfU1NJRF9TQ0FOX0FNT1VOVF07Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCBjaFtSVFdfQ0hBTk5FTF9TQ0FOX0FNT1VOVF07Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gc2V0IHRoZSBhdXRoIHR5cGUgb2YgUlRMODcxMS4gb3Blbi9zaGFyZWQvODAyLjF4Ci0KLUNvbW1hbmQgTW9kZQotCi0qLwotc3RydWN0IHNldGF1dGhfcGFybSB7Ci0JdTggbW9kZTsgIC8qIDA6IGxlZ2FjeSBvcGVuLCAxOiBsZWdhY3kgc2hhcmVkIDI6IDgwMi4xeCAqLwotCXU4IF8xeDsgICAvKiAwOiBQU0ssIDE6IFRMUyAqLwotCXU4IHJzdmRbMl07Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEluZnJhCi0KLWEuIGFsZ29yaXRobTogd2VwNDAsIHdlcDEwNCwgdGtpcCAmIGFlcwotYi4ga2V5dHlwZTogZ3JwIGtleS91bmljYXN0IGtleQotYy4ga2V5IGNvbnRlbnRzCi0KLXdoZW4gc2hhcmVkIGtleSA9PT4ga2V5aWQgaXMgdGhlIGNhbWlkCi13aGVuIDgwMi4xeCA9PT4ga2V5aWQgWzA6MV0gPT0+IGdycCBrZXkKLXdoZW4gODAyLjF4ID09PiBrZXlpZCA+IDIgPT0+IHVuaWNhc3Qga2V5Ci0KLSovCi1zdHJ1Y3Qgc2V0a2V5X3Bhcm0gewotCXUzMglhbGdvcml0aG07CS8qICBlbmNyeXB0aW9uIGFsZ29yaXRobSwgY291bGQgYmUgbm9uZSwgd2VwNDAsIFRLSVAsIENDTVAsIHdlcDEwNCAqLwotCXU4CWtleWlkOwotCXU4CWdycGtleTsJCS8qICAxOiB0aGlzIGlzIHRoZSBncnBrZXkgZm9yIDgwMi4xeC4gMDogdGhpcyBpcyB0aGUgdW5pY2FzdCBrZXkgZm9yIDgwMi4xeCAqLwotCXU4CXNldF90eDsJCS8qICAxOiBtYWluIHR4IGtleSBmb3Igd2VwLiAwOiBvdGhlciBrZXkuICovCi0JdTgJa2V5WzE2XTsJLyogIHRoaXMgY291bGQgYmUgNDAgb3IgMTA0ICovCi19OwotCi0vKgotV2hlbiBpbiBBUCBvciBBZC1Ib2MgbW9kZSwgdGhpcyBpcyB1c2VkIHRvCi1hbGxvY2F0ZSBhbiBzdy9odyBlbnRyeSBmb3IgYSBuZXdseSBhc3NvY2lhdGVkIHN0YS4KLQotQ29tbWFuZAotCi13aGVuIHNoYXJlZCBrZXkgPT0+IGFsZ29yaXRobS9rZXlpZAotCi0qLwotc3RydWN0IHNldF9zdGFrZXlfcGFybSB7Ci0JdTgJYWRkcltFVEhfQUxFTl07Ci0JdTgJaWQ7LyogIGN1cnJlbnRseSBmb3IgZXJhc2luZyBjYW0gZW50cnkgaWYgYWxnb3JpdGhtID09IF9OT19QUklWQUNZXyAqLwotCXUzMglhbGdvcml0aG07Ci0JdTgJa2V5WzE2XTsKLX07Ci0KLXN0cnVjdCBzZXRfc3Rha2V5X3JzcCB7Ci0JdTgJYWRkcltFVEhfQUxFTl07Ci0JdTgJa2V5aWQ7Ci0JdTgJcnN2ZDsKLX07Ci0KLS8qCi1DYWxsZXIgQWQtSG9jL0FQCi0KLUNvbW1hbmQgLVJzcChBSUQgPT0gQ0FNSUQpIG1vZGUKLQotVGhpcyBpcyB0byBmb3JjZSBmdyB0byBhZGQgYW4gc3RhX2RhdGEgZW50cnkgcGVyIGRyaXZlcidzIHJlcXVlc3QuCi0KLUZXIHdpbGwgd3JpdGUgYW4gY2FtIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCBpdC4KLQotKi8KLXN0cnVjdCBzZXRfYXNzb2NzdGFfcGFybSB7Ci0JdTgJYWRkcltFVEhfQUxFTl07Ci19OwotCi1zdHJ1Y3Qgc2V0X2Fzc29jc3RhX3JzcCB7Ci0JdTgJY2FtX2lkOwotCXU4CXJzdmRbM107Ci19OwotCi0vKgotCUNhbGxlciBBZC1Ib2MvQVAKLQotCUNvbW1hbmQgbW9kZQotCi0JVGhpcyBpcyB0byBmb3JjZSBmdyB0byBkZWwgYW4gc3RhX2RhdGEgZW50cnkgcGVyIGRyaXZlcidzIHJlcXVlc3QKLQotCUZXIHdpbGwgaW52YWxpZGF0ZSB0aGUgY2FtIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCBpdC4KLQotKi8KLXN0cnVjdCBkZWxfYXNzb2NzdGFfcGFybSB7Ci0JdTgJYWRkcltFVEhfQUxFTl07Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFQL0FkLUhvQyhNKQotCi1Ob3RlczogVG8gbm90aWZ5IGZ3IHRoYXQgZ2l2ZW4gc3RhaWQgaGFzIGNoYW5nZWQgaXRzIHBvd2VyIHN0YXRlCi0KLUNvbW1hbmQgTW9kZQotCi0qLwotc3RydWN0IHNldHN0YXB3cnN0YXRlX3Bhcm0gewotCXU4CXN0YWlkOwotCXU4CXN0YXR1czsKLQl1OAlod2FkZHJbNl07Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gc2V0dXAgdGhlIGJhc2ljIHJhdGUgb2YgUlRMODcxMQotCi1Db21tYW5kIE1vZGUKLQotKi8KLXN0cnVjdAlzZXRiYXNpY3JhdGVfcGFybSB7Ci0JdTgJYmFzaWNyYXRlc1tOdW1SYXRlc107Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gcmVhZCB0aGUgY3VycmVudCBiYXNpYyByYXRlCi0KLUNvbW1hbmQtUnNwIE1vZGUKLQotKi8KLXN0cnVjdCBnZXRiYXNpY3JhdGVfcGFybSB7Ci0JdTMyIHJzdmQ7Ci19OwotCi1zdHJ1Y3QgZ2V0YmFzaWNyYXRlX3JzcCB7Ci0JdTggYmFzaWNyYXRlc1tOdW1SYXRlc107Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gc2V0dXAgdGhlIGRhdGEgcmF0ZSBvZiBSVEw4NzExCi0KLUNvbW1hbmQgTW9kZQotCi0qLwotc3RydWN0IHNldGRhdGFyYXRlX3Bhcm0gewotCXU4CW1hY19pZDsKLQl1OAlkYXRhcmF0ZXNbTnVtUmF0ZXNdOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIHJlYWQgdGhlIGN1cnJlbnQgZGF0YSByYXRlCi0KLUNvbW1hbmQtUnNwIE1vZGUKLQotKi8KLXN0cnVjdCBnZXRkYXRhcmF0ZV9wYXJtIHsKLQl1MzIgcnN2ZDsKLX07Ci0KLXN0cnVjdCBnZXRkYXRhcmF0ZV9yc3AgewotCXU4IGRhdGFyYXRlc1tOdW1SYXRlc107Ci19OwotCi0KLS8qCi1DYWxsZXIgTW9kZTogQW55Ci1BUDogQVAgY2FuIHVzZSB0aGUgaW5mbyBmb3IgdGhlIGNvbnRlbnRzIG9mIGJlYWNvbiBmcmFtZQotSW5mcmE6IFNUQSBjYW4gdXNlIHRoZSBpbmZvIHdoZW4gc2l0ZXN1cnZleWluZwotQWQtSG9DKE0pOiBMaWtlIEFQCi1BZC1Ib0MoQyk6IExpa2UgU1RBCi0KLQotTm90ZXM6IFRvIHNldCB0aGUgcGh5IGNhcGFiaWxpdHkgb2YgdGhlIE5JQwotCi1Db21tYW5kIE1vZGUKLQotKi8KLQotc3RydWN0CXNldHBoeWluZm9fcGFybSB7Ci0Jc3RydWN0IHJlZ3VsYXRvcnlfY2xhc3MgY2xhc3Nfc2V0c1tOVU1fUkVHVUxBVE9SWVNdOwotCXU4CXN0YXR1czsKLX07Ci0KLXN0cnVjdAlnZXRwaHlpbmZvX3Bhcm0gewotCXUzMiByc3ZkOwotfTsKLQotc3RydWN0CWdldHBoeWluZm9fcnNwIHsKLQlzdHJ1Y3QgcmVndWxhdG9yeV9jbGFzcyBjbGFzc19zZXRzW05VTV9SRUdVTEFUT1JZU107Ci0JdTgJc3RhdHVzOwotfTsKLQotLyoKLUNhbGxlciBNb2RlOiBBbnkKLQotTm90ZXM6IFRvIHNldCB0aGUgY2hhbm5lbC9tb2RlbS9iYW5kCi1UaGlzIGNvbW1hbmQgd2lsbCBiZSB1c2VkIHdoZW4gY2hhbm5lbC9tb2RlbS9iYW5kIGlzIGNoYW5nZWQuCi0KLUNvbW1hbmQgTW9kZQotCi0qLwotc3RydWN0CXNldHBoeV9wYXJtIHsKLQl1OAlyZmNoYW5uZWw7Ci0JdTgJbW9kZW07Ci19OwotCi0vKgotQ2FsbGVyIE1vZGU6IEFueQotCi1Ob3RlczogVG8gZ2V0IHRoZSBjdXJyZW50IHNldHRpbmcgb2YgY2hhbm5lbC9tb2RlbS9iYW5kCi0KLUNvbW1hbmQtUnNwIE1vZGUKLQotKi8KLXN0cnVjdAlnZXRwaHlfcGFybSB7Ci0JdTMyIHJzdmQ7Ci19OwotCi1zdHJ1Y3QJZ2V0cGh5X3JzcCB7Ci0JdTgJcmZjaGFubmVsOwotCXU4CW1vZGVtOwotfTsKLQotc3RydWN0IHJlYWRCQl9wYXJtIHsKLQl1OAlvZmZzZXQ7Ci19OwotCi1zdHJ1Y3QgcmVhZEJCX3JzcCB7Ci0JdTgJdmFsdWU7Ci19OwotCi1zdHJ1Y3QgcmVhZFRTU0lfcGFybSB7Ci0JdTgJb2Zmc2V0OwotfTsKLQotc3RydWN0IHJlYWRUU1NJX3JzcCB7Ci0JdTgJdmFsdWU7Ci19OwotCi1zdHJ1Y3Qgd3JpdGVCQl9wYXJtIHsKLQl1OAlvZmZzZXQ7Ci0JdTgJdmFsdWU7Ci19OwotCi1zdHJ1Y3QgcmVhZFJGX3Bhcm0gewotCXU4CW9mZnNldDsKLX07Ci0KLXN0cnVjdCByZWFkUkZfcnNwIHsKLQl1MzIJdmFsdWU7Ci19OwotCi1zdHJ1Y3Qgd3JpdGVSRl9wYXJtIHsKLQl1MzIJb2Zmc2V0OwotCXUzMgl2YWx1ZTsKLX07Ci0KLXN0cnVjdCBnZXRyZmludGZzX3Bhcm0gewotCXU4CXJmaW50ZnM7Ci19OwotCi1zdHJ1Y3QgVHhfQmVhY29uX3BhcmFtIHsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCBuZXR3b3JrOwotfTsKLQotLyogIENNRCBwYXJhbSBGb3JtYXJ0IGZvciBkcml2ZXIgZXh0cmEgY21kIGhhbmRsZXIgKi8KLXN0cnVjdCBkcnZleHRyYV9jbWRfcGFybSB7Ci0JaW50IGVjX2lkOyAvKiBleHRyYSBjbWQgaWQgKi8KLQlpbnQgdHlwZV9zaXplOyAvKiAgQ2FuIHVzZSB0aGlzIGZpZWxkIGFzIHRoZSB0eXBlIGlkIG9yIGNvbW1hbmQgc2l6ZSAqLwotCXVuc2lnbmVkIGNoYXIgKnBidWY7Ci19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0gQmVsb3cgYXJlIHVzZWQgZm9yIFJGL0JCIHR1bm5pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RydWN0CXNldGFudGVubmFfcGFybSB7Ci0JdTgJdHhfYW50c2V0OwotCXU4CXJ4X2FudHNldDsKLQl1OAl0eF9hbnRlbm5hOwotCXU4CXJ4X2FudGVubmE7Ci19OwotCi1zdHJ1Y3QJZW5yYXRlYWRhcHRpdmVfcGFybSB7Ci0JdTMyCWVuOwotfTsKLQotc3RydWN0IHNldHR4YWdjdGJsX3Bhcm0gewotCXUzMgl0eGFnY1tNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBnZXR0eGFnY3RibF9wYXJtIHsKLQl1MzIgcnN2ZDsKLX07Ci0KLXN0cnVjdCBnZXR0eGFnY3RibF9yc3AgewotCXUzMgl0eGFnY1tNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBzZXRhZ2NjdHJsX3Bhcm0gewotCXUzMglhZ2NjdHJsOwkJLyogIDA6IHB1cmUgaHcsIDE6IGZ3ICovCi19OwotCi1zdHJ1Y3Qgc2V0c3N1cF9wYXJtCXsKLQl1MzIJc3NfRm9yY2VVcFtNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBnZXRzc3VwX3Bhcm0JewotCXUzMiByc3ZkOwotfTsKLQotc3RydWN0IGdldHNzdXBfcnNwCXsKLQl1OAlzc19Gb3JjZVVwW01BWF9SQVRFU19MRU5HVEhdOwotfTsKLQotc3RydWN0IHNldHNzZGxldmVsX3Bhcm0JewotCXU4CXNzX0RMZXZlbFtNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBnZXRzc2RsZXZlbF9wYXJtCXsKLQl1MzIgcnN2ZDsKLX07Ci0KLXN0cnVjdCBnZXRzc2RsZXZlbF9yc3AJewotCXU4CXNzX0RMZXZlbFtNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBzZXRzc3VsZXZlbF9wYXJtCXsKLQl1OAlzc19VTGV2ZWxbTUFYX1JBVEVTX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QgZ2V0c3N1bGV2ZWxfcGFybQl7Ci0JdTMyIHJzdmQ7Ci19OwotCi1zdHJ1Y3QgZ2V0c3N1bGV2ZWxfcnNwCXsKLQl1OAlzc19VTGV2ZWxbTUFYX1JBVEVTX0xFTkdUSF07Ci19OwotCi1zdHJ1Y3QJc2V0Y291bnRqdWRnZV9wYXJtIHsKLQl1OAljb3VudF9qdWRnZVtNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdAlnZXRjb3VudGp1ZGdlX3Bhcm0gewotCXUzMiByc3ZkOwotfTsKLQotc3RydWN0CWdldGNvdW50anVkZ2VfcnNwIHsKLQl1OAljb3VudF9qdWRnZVtNQVhfUkFURVNfTEVOR1RIXTsKLX07Ci0KLXN0cnVjdCBzZXRyYXRhYmxlX3Bhcm0gewotCXU4IHNzX0ZvcmNlVXBbTnVtUmF0ZXNdOwotCXU4IHNzX1VMZXZlbFtOdW1SYXRlc107Ci0JdTggc3NfRExldmVsW051bVJhdGVzXTsKLQl1OCBjb3VudF9qdWRnZVtOdW1SYXRlc107Ci19OwotCi1zdHJ1Y3QgZ2V0cmF0YWJsZV9wYXJtIHsKLQl1aW50IHJzdmQ7Ci19OwotCi1zdHJ1Y3QgZ2V0cmF0YWJsZV9yc3AgewotCXU4IHNzX0ZvcmNlVXBbTnVtUmF0ZXNdOwotCXU4IHNzX1VMZXZlbFtOdW1SYXRlc107Ci0JdTggc3NfRExldmVsW051bVJhdGVzXTsKLQl1OCBjb3VudF9qdWRnZVtOdW1SYXRlc107Ci19OwotCi0vKiB0byBnZXQgVFgsUlggcmV0cnkgY291bnQgKi8KLXN0cnVjdCBnZXR0eHJldHJ5Y250X3Bhcm17Ci0JdW5zaWduZWQgaW50IHJzdmQ7Ci19Owotc3RydWN0IGdldHR4cmV0cnljbnRfcnNwewotCXVuc2lnbmVkIGxvbmcgdHhfcmV0cnljbnQ7Ci19OwotCi1zdHJ1Y3QgZ2V0cnhyZXRyeWNudF9wYXJtewotCXVuc2lnbmVkIGludCByc3ZkOwotfTsKLXN0cnVjdCBnZXRyeHJldHJ5Y250X3JzcHsKLQl1bnNpZ25lZCBsb25nIHJ4X3JldHJ5Y250OwotfTsKLQotLyogdG8gZ2V0IEJDTk9LLEJDTkVSUiBjb3VudCAqLwotc3RydWN0IGdldGJjbm9rY250X3Bhcm17Ci0JdW5zaWduZWQgaW50IHJzdmQ7Ci19Owotc3RydWN0IGdldGJjbm9rY250X3JzcHsKLQl1bnNpZ25lZCBsb25nICBiY25va2NudDsKLX07Ci0KLXN0cnVjdCBnZXRiY25lcnJjbnRfcGFybXsKLQl1bnNpZ25lZCBpbnQgcnN2ZDsKLX07Ci1zdHJ1Y3QgZ2V0YmNuZXJyY250X3JzcHsKLQl1bnNpZ25lZCBsb25nIGJjbmVycmNudDsKLX07Ci0KLS8qICB0byBnZXQgY3VycmVudCBUWCBwb3dlciBsZXZlbCAqLwotc3RydWN0IGdldGN1cnR4cHdybGV2ZWxfcGFybXsKLQl1bnNpZ25lZCBpbnQgcnN2ZDsKLX07Ci0KLXN0cnVjdCBnZXRjdXJ0eHB3cmxldmVsX3JzcHsKLQl1bnNpZ25lZCBzaG9ydCB0eF9wb3dlcjsKLX07Ci0KLXN0cnVjdCBzZXRwcm9iZXJlcWV4dHJhaWVfcGFybSB7Ci0JdW5zaWduZWQgY2hhciBlX2lkOwotCXVuc2lnbmVkIGNoYXIgaWVfbGVuOwotCXVuc2lnbmVkIGNoYXIgaWVbMF07Ci19OwotCi1zdHJ1Y3Qgc2V0YXNzb2NyZXFleHRyYWllX3Bhcm0gewotCXVuc2lnbmVkIGNoYXIgZV9pZDsKLQl1bnNpZ25lZCBjaGFyIGllX2xlbjsKLQl1bnNpZ25lZCBjaGFyIGllWzBdOwotfTsKLQotc3RydWN0IHNldHByb2JlcnNwZXh0cmFpZV9wYXJtIHsKLQl1bnNpZ25lZCBjaGFyIGVfaWQ7Ci0JdW5zaWduZWQgY2hhciBpZV9sZW47Ci0JdW5zaWduZWQgY2hhciBpZVswXTsKLX07Ci0KLXN0cnVjdCBzZXRhc3NvY3JzcGV4dHJhaWVfcGFybSB7Ci0JdW5zaWduZWQgY2hhciBlX2lkOwotCXVuc2lnbmVkIGNoYXIgaWVfbGVuOwotCXVuc2lnbmVkIGNoYXIgaWVbMF07Ci19OwotCi1zdHJ1Y3QgYWRkQmFSZXFfcGFybSB7Ci0JdW5zaWduZWQgaW50IHRpZDsKLQl1OAlhZGRyW0VUSF9BTEVOXTsKLX07Ci0KLS8qSDJDIEhhbmRsZXIgaW5kZXg6IDQ2ICovCi1zdHJ1Y3Qgc2V0X2NoX3Bhcm0gewotCXU4IGNoOwotCXU4IGJ3OwotCXU4IGNoX29mZnNldDsKLX07Ci0KLS8qSDJDIEhhbmRsZXIgaW5kZXg6IDU5ICovCi1zdHJ1Y3QgU2V0Q2hhbm5lbFBsYW5fcGFyYW0gewotCXU4IGNoYW5uZWxfcGxhbjsKLX07Ci0KLS8qSDJDIEhhbmRsZXIgaW5kZXg6IDYwICovCi1zdHJ1Y3QgTGVkQmxpbmtfcGFyYW0gewotCXN0cnVjdCBsZWRfODcyM2EgKnBMZWQ7Ci19OwotCi0vKkgyQyBIYW5kbGVyIGluZGV4OiA2MSAqLwotc3RydWN0IFNldENoYW5uZWxTd2l0Y2hfcGFyYW0gewotCXU4IG5ld19jaF9ubzsKLX07Ci0KLS8qSDJDIEhhbmRsZXIgaW5kZXg6IDYyICovCi1zdHJ1Y3QgVERMU29wdGlvbl9wYXJhbSB7Ci0JdTggYWRkcltFVEhfQUxFTl07Ci0JdTggb3B0aW9uOwotfTsKLQotI2RlZmluZSBHRU5fQ01EX0NPREUoY21kKQljbWQgIyMgX0NNRF8KLQotCi0vKgotCi1SZXN1bHQ6Ci0weDAwOiBzdWNjZXNzCi0weDAxOiBzdWNjZXNzLCBhbmQgY2hlY2sgUmVzcG9uc2UuCi0weDAyOiBjbWQgaWdub3JlZCBkdWUgdG8gZHVwbGljYXRlZCBzZXF1Y25lIG51bWJlcgotMHgwMzogY21kIGRyb3BwZWQgZHVlIHRvIGludmFsaWQgY21kIGNvZGUKLTB4MDQ6IHJlc2VydmVkLgotCi0qLwotCi0jZGVmaW5lIEgyQ19SU1BfT0ZGU0VUCQkJNTEyCi0KLSNkZWZpbmUgSDJDX1NVQ0NFU1MJCQkweDAwCi0jZGVmaW5lIEgyQ19TVUNDRVNTX1JTUAkJCTB4MDEKLSNkZWZpbmUgSDJDX0RVUExJQ0FURUQJCQkweDAyCi0jZGVmaW5lIEgyQ19EUk9QUEVECQkJMHgwMwotI2RlZmluZSBIMkNfUEFSQU1FVEVSU19FUlJPUgkJMHgwNAotI2RlZmluZSBIMkNfUkVKRUNURUQJCQkweDA1Ci0jZGVmaW5lIEgyQ19DTURfT1ZFUkZMT1cJCTB4MDYKLSNkZWZpbmUgSDJDX1JFU0VSVkVECQkJMHgwNwotCi1pbnQgcnR3X3NldGFzc29jc3RhX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdTggKm1hY19hZGRyKTsKLWludCBydHdfc2V0c3RhbmRieV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdWludCBhY3Rpb24pOwotaW50IHJ0d19zaXRlc3VydmV5X2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgc3RydWN0IGNmZzgwMjExX3NzaWQgKnNzaWQsIGludCBzc2lkX251bSwgc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCAqY2gsIGludCBjaF9udW0pOwotaW50IHJ0d19jcmVhdGVic3NfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyKTsKLWludCBydHdfY3JlYXRlYnNzX2NtZDIzYV9leChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqcGJzcywgdW5zaWduZWQgaW50IHN6KTsKLWludCBydHdfc2V0cGh5X2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdTggbW9kZW0sIHU4IGNoKTsKLWludCBydHdfc2V0c3Rha2V5X2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdTggKnBzdGEsIHU4IHVuaWNhc3Rfa2V5KTsKLWludCBydHdfY2xlYXJzdGFrZXlfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwc3RhLCB1OCBlbnRyeSwgdTggZW5xdWV1ZSk7Ci1pbnQgcnR3X2pvaW5ic3NfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCBzdHJ1Y3Qgd2xhbl9uZXR3b3JrKiBwbmV0d29yayk7Ci1pbnQgcnR3X2Rpc2Fzc29jX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgZGVhdXRoX3RpbWVvdXRfbXMsIGJvb2wgZW5xdWV1ZSk7Ci1pbnQgcnR3X3NldG9wbW9kZV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgZW51bSBubDgwMjExX2lmdHlwZSBpZm1vZGUpOwotaW50IHJ0d19zZXRkYXRhcmF0ZV9jbWQoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHU4ICpyYXRlc2V0KTsKLWludCBydHdfc2V0YmFzaWNyYXRlX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdTggKnJhdGVzZXQpOwotaW50IHJ0d19zZXRiYnJlZ19jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggb2Zmc2V0LCB1OCB2YWwpOwotaW50IHJ0d19zZXRyZnJlZ19jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggb2Zmc2V0LCB1MzIgdmFsKTsKLWludCBydHdfZ2V0YmJyZWdfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG9mZnNldCwgdTggKnB2YWwpOwotaW50IHJ0d19nZXRyZnJlZ19jbWQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggb2Zmc2V0LCB1OCAqcHZhbCk7Ci1pbnQgcnR3X3NldHJmaW50ZnNfY21kKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCB1OCBtb2RlKTsKLWludCBydHdfc2V0cnR0YmxfY21kKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCBzdHJ1Y3Qgc2V0cmF0YWJsZV9wYXJtICpwcmF0ZV90YWJsZSk7Ci1pbnQgcnR3X2dldHJ0dGJsX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgc3RydWN0IGdldHJhdGFibGVfcnNwICpwdmFsKTsKLQotaW50IHJ0d19nZXR0c3NpX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgdTggb2Zmc2V0LCB1OCAqcHZhbCk7Ci1pbnQgcnR3X3NldGZ3ZGlnX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHU4IHR5cGUpOwotaW50IHJ0d19zZXRmd3JhX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHU4IHR5cGUpOwotCi1pbnQgcnR3X2FkZGJhcmVxX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHU4IHRpZCwgdTggKmFkZHIpOwotCi1pbnQgcnR3X2R5bmFtaWNfY2hrX3drX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi1pbnQgcnR3X2xwc19jdHJsX3drX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHU4IGxwc19jdHJsX3R5cGUsIHU4IGVucXVldWUpOwotCi1pbnQgcnR3X3BzX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIpOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi1pbnQgcnR3X2Noa19oaV9xdWV1ZV9jbWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyKnBhZGFwdGVyKTsKLSNlbmRpZgotCi1pbnQgcnR3X3NldF9jaHBsYW5fY21kKHN0cnVjdCBydHdfYWRhcHRlcipwYWRhcHRlciwgdTggY2hwbGFuLCB1OCBlbnF1ZXVlKTsKLWludCBydHdfbGVkX2JsaW5rX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHN0cnVjdCBsZWRfODcyM2EgKnBMZWQpOwotaW50IHJ0d19zZXRfY3NhX2NtZChzdHJ1Y3QgcnR3X2FkYXB0ZXIqcGFkYXB0ZXIsIHU4IG5ld19jaF9ubyk7Ci0KLWludCBydHdfYzJoX3drX2NtZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqYzJoX2V2dCk7Ci0KLWludCBydHdfZHJ2ZXh0cmFfY21kX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci0KLXZvaWQgcnR3X3N1cnZleV9jbWRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHN0cnVjdCBjbWRfb2JqICpwY21kKTsKLXZvaWQgcnR3X2Rpc2Fzc29jX2NtZDIzYV9jYWxsYmFjayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgc3RydWN0IGNtZF9vYmogKnBjbWQpOwotdm9pZCBydHdfam9pbmJzc19jbWQyM2FfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHN0cnVjdCBjbWRfb2JqICpwY21kKTsKLXZvaWQgcnR3X2NyZWF0ZWJzc19jbWQyM2FfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsIHN0cnVjdCBjbWRfb2JqICpwY21kKTsKLXZvaWQgcnR3X2dldGJicmZyZWdfY21kcnNwX2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAgKnBhZGFwdGVyLCBzdHJ1Y3QgY21kX29iaiAqcGNtZCk7Ci0KLXZvaWQgcnR3X3NldHN0YUtleV9jbWRyc3BfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsICBzdHJ1Y3QgY21kX29iaiAqcGNtZCk7Ci12b2lkIHJ0d19zZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICAqcGFkYXB0ZXIsICBzdHJ1Y3QgY21kX29iaiAqcGNtZCk7Ci0KLXN0cnVjdCBfY21kX2NhbGxiYWNrIHsKLQl1MzIJY21kX2NvZGU7Ci0Jdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgICpwYWRhcHRlciwgc3RydWN0IGNtZF9vYmogKmNtZCk7Ci19OwotCi1lbnVtIHJ0d19oMmNfY21kIHsKLQlHRU5fQ01EX0NPREUoX1JlYWRfTUFDUkVHKSAsCS8qMCovCi0JR0VOX0NNRF9DT0RFKF9Xcml0ZV9NQUNSRUcpICwKLQlHRU5fQ01EX0NPREUoX1JlYWRfQkJSRUcpICwKLQlHRU5fQ01EX0NPREUoX1dyaXRlX0JCUkVHKSAsCi0JR0VOX0NNRF9DT0RFKF9SZWFkX1JGUkVHKSAsCi0JR0VOX0NNRF9DT0RFKF9Xcml0ZV9SRlJFRykgLCAvKjUqLwotCUdFTl9DTURfQ09ERShfUmVhZF9FRVBST00pICwKLQlHRU5fQ01EX0NPREUoX1dyaXRlX0VFUFJPTSkgLAotCUdFTl9DTURfQ09ERShfUmVhZF9FRlVTRSkgLAotCUdFTl9DTURfQ09ERShfV3JpdGVfRUZVU0UpICwKLQotCUdFTl9DTURfQ09ERShfUmVhZF9DQU0pICwJLyoxMCovCi0JR0VOX0NNRF9DT0RFKF9Xcml0ZV9DQU0pICwKLQlHRU5fQ01EX0NPREUoX3NldEJDTklUViksCi0JR0VOX0NNRF9DT0RFKF9zZXRNQklEQ0ZHKSwKLQlHRU5fQ01EX0NPREUoX0pvaW5Cc3MpLCAgIC8qMTQqLwotCUdFTl9DTURfQ09ERShfRGlzQ29ubmVjdCkgLCAvKjE1Ki8KLQlHRU5fQ01EX0NPREUoX0NyZWF0ZUJzcykgLAotCUdFTl9DTURfQ09ERShfU2V0T3BNb2RlKSAsCi0JR0VOX0NNRF9DT0RFKF9TaXRlU3VydmV5KSwgIC8qMTgqLwotCUdFTl9DTURfQ09ERShfU2V0QXV0aCkgLAotCi0JR0VOX0NNRF9DT0RFKF9TZXRLZXkpICwJLyoyMCovCi0JR0VOX0NNRF9DT0RFKF9TZXRTdGFLZXkpICwKLQlHRU5fQ01EX0NPREUoX1NldEFzc29jU3RhKSAsCi0JR0VOX0NNRF9DT0RFKF9EZWxBc3NvY1N0YSkgLAotCUdFTl9DTURfQ09ERShfU2V0U3RhUHdyU3RhdGUpICwKLQlHRU5fQ01EX0NPREUoX1NldEJhc2ljUmF0ZSkgLCAvKjI1Ki8KLQlHRU5fQ01EX0NPREUoX0dldEJhc2ljUmF0ZSkgLAotCUdFTl9DTURfQ09ERShfU2V0RGF0YVJhdGUpICwKLQlHRU5fQ01EX0NPREUoX0dldERhdGFSYXRlKSAsCi0JR0VOX0NNRF9DT0RFKF9TZXRQaHlJbmZvKSAsCi0KLQlHRU5fQ01EX0NPREUoX0dldFBoeUluZm8pICwJLyozMCovCi0JR0VOX0NNRF9DT0RFKF9TZXRQaHkpICwKLQlHRU5fQ01EX0NPREUoX0dldFBoeSkgLAotCUdFTl9DTURfQ09ERShfcmVhZFJzc2kpICwKLQlHRU5fQ01EX0NPREUoX3JlYWRHYWluKSAsCi0JR0VOX0NNRF9DT0RFKF9TZXRBdGltKSAsIC8qMzUqLwotCUdFTl9DTURfQ09ERShfU2V0UHdyTW9kZSkgLAotCUdFTl9DTURfQ09ERShfSm9pbmJzc1JwdCksCi0JR0VOX0NNRF9DT0RFKF9TZXRSYVRhYmxlKSAsCi0JR0VOX0NNRF9DT0RFKF9HZXRSYVRhYmxlKSAsCi0KLQlHRU5fQ01EX0NPREUoX0dldENDWFJlcG9ydCksIC8qNDAqLwotCUdFTl9DTURfQ09ERShfR2V0RFRNUmVwb3J0KSwKLQlHRU5fQ01EX0NPREUoX0dldFRYUmF0ZVN0YXRpc3RpY3MpLAotCUdFTl9DTURfQ09ERShfU2V0VXNiU3VzcGVuZCksCi0JR0VOX0NNRF9DT0RFKF9TZXRIMmNMYmspLAotCUdFTl9DTURfQ09ERShfQWRkQkFSZXEpICwgLyo0NSovCi0JR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsKSwgLyo0NiovCi0JR0VOX0NNRF9DT0RFKF9TZXRUeFBvd2VyKSwKLQlHRU5fQ01EX0NPREUoX1N3aXRjaEFudGVubmEpLAotCUdFTl9DTURfQ09ERShfU2V0Q3J5c3RhbENhcCksCi0JR0VOX0NNRF9DT0RFKF9TZXRTaW5nbGVDYXJyaWVyVHgpLCAvKjUwKi8KLQotCUdFTl9DTURfQ09ERShfU2V0U2luZ2xlVG9uZVR4KSwvKjUxKi8KLQlHRU5fQ01EX0NPREUoX1NldENhcnJpZXJTdXBwcmVzc2lvblR4KSwKLQlHRU5fQ01EX0NPREUoX1NldENvbnRpbnVvdXNUeCksCi0JR0VOX0NNRF9DT0RFKF9Td2l0Y2hCYW5kd2lkdGgpLCAvKjU0Ki8KLQlHRU5fQ01EX0NPREUoX1RYX0JlYWNvbiksIC8qNTUqLwotCi0JR0VOX0NNRF9DT0RFKF9TZXRfTUxNRV9FVlQpLCAvKjU2Ki8KLQlHRU5fQ01EX0NPREUoX1NldF9EcnZfRXh0cmEpLCAvKjU3Ki8KLQlHRU5fQ01EX0NPREUoX1NldF9IMkNfTVNHKSwgLyo1OCovCi0KLQlHRU5fQ01EX0NPREUoX1NldENoYW5uZWxQbGFuKSwgLyo1OSovCi0JR0VOX0NNRF9DT0RFKF9MZWRCbGluayksIC8qNjAqLwotCi0JR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsU3dpdGNoKSwgLyo2MSovCi0JR0VOX0NNRF9DT0RFKF9URExTKSwgLyo2MiovCi0KLQlNQVhfSDJDQ01ECi19OwotCi1leHRlcm4gc3RydWN0IF9jbWRfY2FsbGJhY2sJcnR3X2NtZF9jYWxsYmFja1tdOwotCi0jZW5kaWYgLyogIF9DTURfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU5MTgzZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2RlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUV19ERUJVR19IX18KLSNkZWZpbmUgX19SVFdfREVCVUdfSF9fCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNkZWZpbmUgX2Rydl9hbHdheXNfCQkJMQotI2RlZmluZSBfZHJ2X2VtZXJnXwkJCTIKLSNkZWZpbmUgX2Rydl9hbGVydF8JCQkzCi0jZGVmaW5lIF9kcnZfZXJyXwkJCTQKLSNkZWZpbmUJX2Rydl93YXJuaW5nXwkJCTUKLSNkZWZpbmUgX2Rydl9ub3RpY2VfCQkJNgotI2RlZmluZSBfZHJ2X2luZm9fCQkJNwotI2RlZmluZQlfZHJ2X2RlYnVnXwkJCTgKLQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXwkJQklUKDApCi0jZGVmaW5lIF9tb2R1bGVfeG1pdF9vc2RlcF9jXwkJQklUKDEpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfCQlCSVQoMikKLSNkZWZpbmUgX21vZHVsZV9yZWN2X29zZGVwX2NfCQlCSVQoMykKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzF4X21sbWVfY18JCUJJVCg0KQotI2RlZmluZSBfbW9kdWxlX21sbWVfb3NkZXBfY18JCUJJVCg1KQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXwlCSVQoNikKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzF4X2NtZF9jXwkJQklUKDcpCi0jZGVmaW5lIF9tb2R1bGVfY21kX29zZGVwX2NfCQlCSVQoOCkKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzF4X2lvX2NfCQlCSVQoOSkKLSNkZWZpbmUgX21vZHVsZV9pb19vc2RlcF9jXwkJQklUKDEwKQotI2RlZmluZSBfbW9kdWxlX29zX2ludGZzX2NfCQlCSVQoMTEpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXwlCSVQoMTIpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9lZXByb21fY18JQklUKDEzKQotI2RlZmluZSBfbW9kdWxlX2hhbF9pbml0X2NfCQlCSVQoMTQpCi0jZGVmaW5lIF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfCQlCSVQoMTUpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9pb2N0bF9jXwlCSVQoMTYpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18JQklUKDE3KQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfaW9jdGxfcXVlcnlfY18JQklUKDE4KQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXwlCSVQoMTkpCi0jZGVmaW5lIF9tb2R1bGVfaGNpX2ludGZzX2NfCQlCSVQoMjApCi0jZGVmaW5lIF9tb2R1bGVfaGNpX29wc19jXwkJQklUKDIxKQotI2RlZmluZSBfbW9kdWxlX29zZGVwX3NlcnZpY2VfY18JQklUKDIyKQotI2RlZmluZSBfbW9kdWxlX21wXwkJCUJJVCgyMykKLSNkZWZpbmUgX21vZHVsZV9oY2lfb3BzX29zX2NfCQlCSVQoMjQpCi0jZGVmaW5lIF9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jCUJJVCgyNSkKLSNkZWZpbmUgX21vZHVsZV9ydGw4NzEyX2NtZF9jXwkJQklUKDI2KQotI2RlZmluZQlfbW9kdWxlX3J0bDgxOTJjX3htaXRfY18JQklUKDI4KQotI2RlZmluZSBfbW9kdWxlX2hhbF94bWl0X2NfCQlCSVQoMjgpIC8qIGR1cGxpY2F0aW9uIGludGVudGlvbmFsICovCi0jZGVmaW5lIF9tb2R1bGVfZWZ1c2VfCQkJQklUKDI5KQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MTJfcmVjdl9jXwkJQklUKDMwKQotI2RlZmluZSBfbW9kdWxlX3J0bDg3MTJfbGVkX2NfCQlCSVQoMzEpCi0KLSN1bmRlZiBfTU9EVUxFX0RFRklORV8KLQotI2lmIGRlZmluZWQgX1JUV19YTUlUX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X3htaXRfY18KLSNlbGlmIGRlZmluZWQgX1hNSVRfT1NERVBfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3htaXRfb3NkZXBfY18KLSNlbGlmIGRlZmluZWQgX1JUV19SRUNWX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18KLSNlbGlmIGRlZmluZWQgX1JFQ1ZfT1NERVBfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3JlY3Zfb3NkZXBfY18KLSNlbGlmIGRlZmluZWQgX1JUV19NTE1FX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X21sbWVfY18KLSNlbGlmIGRlZmluZWQgX01MTUVfT1NERVBfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX21sbWVfb3NkZXBfY18KLSNlbGlmIGRlZmluZWQgX1JUV19NTE1FX0VYVF9DXwotCSNkZWZpbmUgX01PRFVMRV9ERUZJTkVfIDEKLSNlbGlmIGRlZmluZWQgX1JUV19TVEFfTUdUX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X3N0YV9tZ3RfY18KLSNlbGlmIGRlZmluZWQgX1JUV19DTURfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3J0bDg3MXhfY21kX2NfCi0jZWxpZiBkZWZpbmVkIF9DTURfT1NERVBfQ18KLQkjZGVmaW5lIF9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2NtZF9vc2RlcF9jXwotI2VsaWYgZGVmaW5lZCBfUlRXX0lPX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X2lvX2NfCi0jZWxpZiBkZWZpbmVkIF9JT19PU0RFUF9DXwotCSNkZWZpbmUgX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfaW9fb3NkZXBfY18KLSNlbGlmIGRlZmluZWQgX09TX0lOVEZTX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9vc19pbnRmc19jXwotI2VsaWYgZGVmaW5lZCBfUlRXX1NFQ1VSSVRZX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfCi0jZWxpZiBkZWZpbmVkIF9SVFdfRUVQUk9NX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X2VlcHJvbV9jXwotI2VsaWYgZGVmaW5lZCBfSEFMX0lOVEZfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2hhbF9pbml0X2NfCi0jZWxpZiAoZGVmaW5lZCBfSENJX0hBTF9JTklUX0NfKSB8fCAoZGVmaW5lZCBfU0RJT19IQUxJTklUX0NfKQotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfaGNpX2hhbF9pbml0X2NfCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzFYX0lPQ1RMX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9ydGw4NzF4X2lvY3RsX2NfCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzFYX0lPQ1RMX1NFVF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18KLSNlbGlmIGRlZmluZWQgX1JUTDg3MVhfSU9DVExfUVVFUllfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX3J0bDg3MXhfaW9jdGxfcXVlcnlfY18KLSNlbGlmIGRlZmluZWQgX1JUTDg3MVhfUFdSQ1RSTF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfCi0jZWxpZiBkZWZpbmVkIF9SVFdfUFdSQ1RSTF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCTEKLSNlbGlmIGRlZmluZWQgX0hDSV9JTlRGX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9oY2lfaW50ZnNfY18KLSNlbGlmIGRlZmluZWQgX0hDSV9PUFNfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2hjaV9vcHNfY18KLSNlbGlmIGRlZmluZWQgX1NESU9fT1BTX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8gMQotI2VsaWYgZGVmaW5lZCBfT1NERVBfSENJX0lOVEZfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX2hjaV9pbnRmc19jXwotI2VsaWYgZGVmaW5lZCBfT1NERVBfU0VSVklDRV9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfb3NkZXBfc2VydmljZV9jXwotI2VsaWYgZGVmaW5lZCBfSENJX09QU19PU19DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfaGNpX29wc19vc19jXwotI2VsaWYgZGVmaW5lZCBfUlRMODcxWF9JT0NUTF9MSU5VWF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzEyX0NNRF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxMl9jbWRfY18KLSNlbGlmIGRlZmluZWQgX1JUTDgxOTJDX1hNSVRfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwkxCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzIzQVNfWE1JVF9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCTEKLSNlbGlmIGRlZmluZWQgX1JUTDg3MTJfUkVDVl9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxMl9yZWN2X2NfCi0jZWxpZiBkZWZpbmVkIF9SVEw4MTkyQ1VfUkVDVl9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfcnRsODcxMl9yZWN2X2NfCi0jZWxpZiBkZWZpbmVkIF9SVEw4NzFYX01MTUVfRVhUX0NfCi0JI2RlZmluZSBfTU9EVUxFX0RFRklORV8JX21vZHVsZV9tbG1lX29zZGVwX2NfCi0jZWxpZiBkZWZpbmVkIF9SVFdfTVBfQ18KLQkjZGVmaW5lCV9NT0RVTEVfREVGSU5FXwlfbW9kdWxlX21wXwotI2VsaWYgZGVmaW5lZCBfUlRXX01QX0lPQ1RMX0NfCi0JI2RlZmluZQlfTU9EVUxFX0RFRklORV8JX21vZHVsZV9tcF8KLSNlbGlmIGRlZmluZWQgX1JUV19FRlVTRV9DXwotCSNkZWZpbmUJX01PRFVMRV9ERUZJTkVfCV9tb2R1bGVfZWZ1c2VfCi0jZW5kaWYKLQotI2RlZmluZSBEUklWRVJfUFJFRklYCSJSVEw4NzIzQVU6ICIKLSNkZWZpbmUgREVCVUdfTEVWRUwJKF9kcnZfZXJyXykKLSNkZWZpbmUgREJHXzg3MjNBX0xFVkVMKF9sZXZlbCwgZm10LCBhcmcuLi4pCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWlmIChfbGV2ZWwgPD0gR2xvYmFsRGVidWdMZXZlbDIzQSkJCQkJXAotCQkJcHJfaW5mbyhEUklWRVJfUFJFRklYIGZtdCwgIyNhcmcpO1wKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIERCR184NzIzQSguLi4pCQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWlmIChfZHJ2X2Vycl8gPD0gR2xvYmFsRGVidWdMZXZlbDIzQSkJCQlcCi0JCQlwcl9pbmZvKERSSVZFUl9QUkVGSVggX19WQV9BUkdTX18pOwkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgTVNHXzg3MjNBKC4uLikJCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKF9kcnZfZXJyXyA8PSBHbG9iYWxEZWJ1Z0xldmVsMjNBKQkJCVwKLQkJCXByX2luZm8oRFJJVkVSX1BSRUZJWCBfX1ZBX0FSR1NfXyk7CQlcCi0JfSB3aGlsZSAoMCkKLQotZXh0ZXJuIHUzMiBHbG9iYWxEZWJ1Z0xldmVsMjNBOwotCi1fX3ByaW50ZigzLCA0KQotdm9pZCBydF90cmFjZShpbnQgY29tcCwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci0KLSNkZWZpbmUgUlRfVFJBQ0UoX0NvbXAsIF9MZXZlbCwgRm10LCAuLi4pCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKF9MZXZlbCA8PSBHbG9iYWxEZWJ1Z0xldmVsMjNBKQkJCQlcCi0JCXJ0X3RyYWNlKF9Db21wLCBfTGV2ZWwsIEZtdCwgIyNfX1ZBX0FSR1NfXyk7CQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFJUX1BSSU5UX0RBVEEoX0NvbXAsIF9MZXZlbCwgX1RpdGxlU3RyaW5nLCBfSGV4RGF0YSwJCVwKLQkJICAgICAgX0hleERhdGFMZW4pCQkJCQlcCi0JaWYgKF9MZXZlbCA8PSBHbG9iYWxEZWJ1Z0xldmVsMjNBKSB7CQkJCVwKLQkJaW50IF9faTsJCQkJCQlcCi0JCXU4CSpwdHIgPSAodTggKilfSGV4RGF0YTsJCQkJXAotCQlwcl9pbmZvKCIlcyIsIERSSVZFUl9QUkVGSVgpOwkJCQlcCi0JCXByX2luZm8oX1RpdGxlU3RyaW5nKTsJCQkJCVwKLQkJZm9yIChfX2kgPSAwOyBfX2kgPCAoaW50KV9IZXhEYXRhTGVuOyBfX2krKykgewkJXAotCQkJcHJpbnRrKCIlMDJYJXMiLCBwdHJbX19pXSwJCQlcCi0JCQkgICAgICAgKCgoX19pICsgMSkgJSA0KSA9PSAwKSA/ICIgICIgOiAiICIpOwlcCi0JCQlpZiAoKChfX2kgKyAxKSAlIDE2KSA9PSAwKQkJCVwKLQkJCQlwcmludGsoIlxuIik7CQkJCVwKLQkJfQkJCQkJCQlcCi0JCXByaW50aygiXG4iKTsJCQkJCQlcCi0JfQotCi0jZW5kaWYJLyogX19SVFdfREVCVUdfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2VlcHJvbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19lZXByb20uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2ZjM2ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2VlcHJvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUV19FRVBST01fSF9fCi0jZGVmaW5lIF9fUlRXX0VFUFJPTV9IX18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2RlZmluZQlSVEw4NzEyX0VFUFJPTV9JRAkJCTB4ODcxMgotLyogZGVmaW5lCUVFUFJPTV9NQVhfU0laRQkJCTI1NiAqLwotCi0jZGVmaW5lCUhXU0VUX01BWF9TSVpFXzUxMgkJNTEyCi0jZGVmaW5lCUVFUFJPTV9NQVhfU0laRQkJCUhXU0VUX01BWF9TSVpFXzUxMgotCi0jZGVmaW5lCUNMT0NLX1JBVEUJCQkJCTUwCQkJLyogMTAwdXMgKi8KLQotLyogIEVFUFJPTSBvcGNvZGVzICovCi0jZGVmaW5lIEVFUFJPTV9SRUFEX09QQ09ERQkJMDYKLSNkZWZpbmUgRUVQUk9NX1dSSVRFX09QQ09ERQkJMDUKLSNkZWZpbmUgRUVQUk9NX0VSQVNFX09QQ09ERQkJMDcKLSNkZWZpbmUgRUVQUk9NX0VXRU5fT1BDT0RFCQkxOSAgICAgIC8qICBFcmFzZS93cml0ZSBlbmFibGUgKi8KLSNkZWZpbmUgRUVQUk9NX0VXRFNfT1BDT0RFCQkxNiAgICAgIC8qICBFcmFzZS93cml0ZSBkaXNhYmxlICovCi0KLS8qIENvdW50cnkgY29kZXMgKi8KLSNkZWZpbmUgVVNBCQkJCQkJCTB4NTU1MzIwCi0jZGVmaW5lIEVVUk9QRQkJCQkJCTB4MSAvKiB0ZW1wLCBzaG91bGQgYmUgcHJvdmlkZWQgbGF0ZXIgKi8KLSNkZWZpbmUgSkFQQU4JCQkJCQkweDIgLyogdGVtcCwgc2hvdWxkIGJlIHByb3ZpZGVkIGxhdGVyICovCi0KLSNkZWZpbmUJRUVQUk9NX0NJRF9ERUZBVUxUCQkJMHgwCi0jZGVmaW5lCUVFUFJPTV9DSURfQUxQSEEJCQkJMHgxCi0jZGVmaW5lCUVFUFJPTV9DSURfU2VuYW8JCQkJMHgzCi0jZGVmaW5lCUVFUFJPTV9DSURfTmV0Q29yZQkJCQkweDUKLSNkZWZpbmUJRUVQUk9NX0NJRF9DQU1FTwkJCQkwWDgKLSNkZWZpbmUJRUVQUk9NX0NJRF9TSVRFQ09NCQkJCTB4OQotI2RlZmluZQlFRVBST01fQ0lEX0NPUkVHQQkJCQkweEIKLSNkZWZpbmUJRUVQUk9NX0NJRF9FRElNQVhfQkVMS0lOCQkweEMKLSNkZWZpbmUJRUVQUk9NX0NJRF9TRVJDT01NX0JFTEtJTgkJMHhFCi0jZGVmaW5lCUVFUFJPTV9DSURfQ0FNRU8xCQkJCTB4RgotI2RlZmluZQlFRVBST01fQ0lEX1dOQ19DT1JFR0EJCTB4MTIKLSNkZWZpbmUJRUVQUk9NX0NJRF9DTEVWTwkJCQkweDEzCi0jZGVmaW5lCUVFUFJPTV9DSURfV0hRTAkJCQkweEZFIC8qICBhZGRlZCBieSBjaGl5b2tvIGZvciBkdG0sIDIwMDkwMTA4ICovCi0KLS8qICAqLwotLyogIEN1c3RvbWVyIElELCBub3RlIHRoYXQ6ICovCi0vKiAgVGhpcyB2YXJpYWJsZSBpcyBpbml0aWFpbHplZCB0aHJvdWdoIEVFUFJPTSBvciByZWdpc3RyeSwgKi8KLS8qICBob3dldmVyLCBpdHMgZGVmaW5pdGlvbiBtYXkgYmUgZGlmZmVyZW50IHdpdGggdGhhdCBpbiBFRVBST00gZm9yICovCi0vKiAgRUVQUk9NIHNpemUgY29uc2lkZXJhdGlvbi4gU28sIHdlIGhhdmUgdG8gcGVyZm9ybSBwcm9wZXIgdHJhbnNsYXRpb24gYmV0d2VlbiB0aGVtLiAqLwotLyogIEJlc2lkZXMsIEN1c3RvbWVySUQgb2YgcmVnaXN0cnkgaGFzIHByZWNlZGVuY2Ugb2YgdGhhdCBvZiBFRVBST00uICovCi0vKiAgZGVmaW5lZCBiZWxvdy4gMDYwNzAzLCBieSByY25qa28uICovCi0vKiAgKi8KLWVudW0gcnRfY3VzdG9tZXJfaWQKLXsKLQlSVF9DSURfREVGQVVMVCA9IDAsCi0JUlRfQ0lEXzgxODdfQUxQSEEwID0gMSwKLQlSVF9DSURfODE4N19TRVJDT01NX1BTID0gMiwKLQlSVF9DSURfODE4N19IV19MRUQgPSAzLAotCVJUX0NJRF84MTg3X05FVEdFQVIgPSA0LAotCVJUX0NJRF9XSFFMID0gNSwKLQlSVF9DSURfODE5eF9DQU1FTyAgPSA2LAotCVJUX0NJRF84MTl4X1JVTlRPUCA9IDcsCi0JUlRfQ0lEXzgxOXhfU2VuYW8gPSA4LAotCVJUX0NJRF9UT1NISUJBID0gOSwJLyogIE1lcmdlIGJ5IEphY2tlbiwgMjAwOC8wMS8zMS4gKi8KLQlSVF9DSURfODE5eF9OZXRjb3JlID0gMTAsCi0JUlRfQ0lEX05ldHRyb25peCA9IDExLAotCVJUX0NJRF9ETElOSyA9IDEyLAotCVJUX0NJRF9QUk9ORVQgPSAxMywKLQlSVF9DSURfQ09SRUdBID0gMTQsCi0JUlRfQ0lEX0NISU5BX01PQklMRSA9IDE1LAotCVJUX0NJRF84MTl4X0FMUEhBID0gMTYsCi0JUlRfQ0lEXzgxOXhfU2l0ZWNvbSA9IDE3LAotCVJUX0NJRF9DQ1ggPSAxOCwgLyogIEl0J3Mgc2V0IHVuZGVyIENDWCBsb2dvIHRlc3QgYW5kIGlzbid0IGRlbWFuZGVkIGZvciBDQ1ggZnVuY3Rpb25zLCBidXQgZm9yIHRlc3QgYmVoYXZpb3IgbGlrZSByZXRyeSBsaW1pdCBhbmQgdHggcmVwb3J0LiBCeSBCcnVjZSwgMjAwOS0wMi0xNy4gKi8KLQlSVF9DSURfODE5eF9MZW5vdm8gPSAxOSwKLQlSVF9DSURfODE5eF9RTUkgPSAyMCwKLQlSVF9DSURfODE5eF9FZGltYXhfQmVsa2luID0gMjEsCi0JUlRfQ0lEXzgxOXhfU2VyY29tbV9CZWxraW4gPSAyMiwKLQlSVF9DSURfODE5eF9DQU1FTzEgPSAyMywKLQlSVF9DSURfODE5eF9NU0kgPSAyNCwKLQlSVF9DSURfODE5eF9BY2VyID0gMjUsCi0JUlRfQ0lEXzgxOXhfQXpXYXZlX0FTVVMgPSAyNiwKLQlSVF9DSURfODE5eF9BeldhdmUgPSAyNywgLyogIEZvciBBeldhdmUgaW4gUENJZSwgVGhlIElEIGlzIEF6V2F2ZSB1c2UgYW5kIG5vdCBvbmx5IEFzdXMgKi8KLQlSVF9DSURfODE5eF9IUCA9IDI4LAotCVJUX0NJRF84MTl4X1dOQ19DT1JFR0EgPSAyOSwKLQlSVF9DSURfODE5eF9BcmNhZHlhbl9CZWxraW4gPSAzMCwKLQlSVF9DSURfODE5eF9TQU1TVU5HID0gMzEsCi0JUlRfQ0lEXzgxOXhfQ0xFVk8gPSAzMiwKLQlSVF9DSURfODE5eF9ERUxMID0gMzMsCi0JUlRfQ0lEXzgxOXhfUFJPTkVUUyA9IDM0LAotCVJUX0NJRF84MTl4X0VkaW1heF9BU1VTID0gMzUsCi0JUlRfQ0lEXzgxOXhfQ0FNRU9fTkVUR0VBUiA9IDM2LAotCVJUX0NJRF9QTEFORVggPSAzNywKLQlSVF9DSURfQ0NfQyA9IDM4LAotCVJUX0NJRF84MTl4X1hhdmkgPSAzOSwKLQlSVF9DSURfODE5eF9GVU5BSV9UViA9IDQwLAotCVJUX0NJRF84MTl4X0FMUEhBX1dEPTQxLAotfTsKLQotc3RydWN0IGVlcHJvbV9wcml2IHsKLQl1OAkJbWFjX2FkZHJbNl07CS8qIFBlcm1hbmVudEFkZHJlc3MgKi8KLQl1OAkJYmF1dG9sb2FkX2ZhaWxfZmxhZzsKLQl1OAkJYmxvYWRmaWxlX2ZhaWxfZmxhZzsKLQl1OAkJYmxvYWRtYWNfZmFpbF9mbGFnOwotCS8qIHU4CQliZW1wdHk7ICovCi0JLyogdTgJCXN5c19jb25maWc7ICovCi0JLyogdTgJCWNvbmZpZzA7ICovCi0JdTE2CQljaGFubmVsX3BsYW47Ci0JLyogdTgJCWNvdW50cnlfc3RyaW5nWzNdOyAqLwotCS8qIHU4CQl0eF9wb3dlcl9iWzE1XTsgKi8KLQkvKiB1OAkJdHhfcG93ZXJfZ1sxNV07ICovCi0JLyogdTgJCXR4X3Bvd2VyX2FbMjAxXTsgKi8KLQotCXU4CQlFZXByb21PckVmdXNlOwotCi0JdTgJCWVmdXNlX2VlcHJvbV9kYXRhW0hXU0VUX01BWF9TSVpFXzUxMl07IC8qIDkyQzoyNTZieXRlcywgODhFOjUxMmJ5dGVzLCB3ZSB1c2UgdW5pb24gc2V0ICg1MTJieXRlcykgKi8KLX07Ci0KLXZvaWQgZWVwcm9tX3dyaXRlMTYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IHJlZywgdTE2IGRhdGEpOwotdTE2IGVlcHJvbV9yZWFkMTYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IHJlZyk7Ci12b2lkIHJlYWRfZWVwcm9tX2NvbnRlbnQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIGVlcHJvbV9yZWFkX3N6KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiByZWcsIHU4ICpkYXRhLCB1MzIgc3opOwotCi12b2lkIHJlYWRfZWVwcm9tX2NvbnRlbnRfYnlfYXR0cmliKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0jZW5kaWYgIC8qIF9fUlRMODcxWF9FRVBST01fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2VmdXNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2VmdXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NzdlMjYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19lZnVzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVFdfRUZVU0VfSF9fCi0jZGVmaW5lIF9fUlRXX0VGVVNFX0hfXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotCi0jZGVmaW5lCUVGVVNFX0VSUk9FX0hBTkRMRQkJMQotCi0jZGVmaW5lCVBHX1NUQVRFX0hFQURFUgkJCTB4MDEKLSNkZWZpbmUJUEdfU1RBVEVfV09SRF8wCQkweDAyCi0jZGVmaW5lCVBHX1NUQVRFX1dPUkRfMQkJMHgwNAotI2RlZmluZQlQR19TVEFURV9XT1JEXzIJCTB4MDgKLSNkZWZpbmUJUEdfU1RBVEVfV09SRF8zCQkweDEwCi0jZGVmaW5lCVBHX1NUQVRFX0RBVEEJCQkweDIwCi0KLSNkZWZpbmUJUEdfU1dCWVRFX0gJCQkweDAxCi0jZGVmaW5lCVBHX1NXQllURV9MCQkJMHgwMgotCi0jZGVmaW5lCVBHUEtUX0RBVEFfU0laRQkJOAotCi0jZGVmaW5lCUVGVVNFX1dJRkkJCQkJMAotI2RlZmluZQlFRlVTRV9CVAkJCQkxCi0KLWVudW0gX0VGVVNFX0RFRl9UWVBFIHsKLQlUWVBFX0VGVVNFX01BWF9TRUNUSU9OCQkJCT0gMCwKLQlUWVBFX0VGVVNFX1JFQUxfQ09OVEVOVF9MRU4JCQk9IDEsCi0JVFlQRV9BVkFJTEFCTEVfRUZVU0VfQllURVNfQkFOSwkJPSAyLAotCVRZUEVfQVZBSUxBQkxFX0VGVVNFX0JZVEVTX1RPVEFMCT0gMywKLQlUWVBFX0VGVVNFX01BUF9MRU4JCQkJCT0gNCwKLQlUWVBFX0VGVVNFX1BST1RFQ1RfQllURVNfQkFOSwkJPSA1LAotCVRZUEVfRUZVU0VfQ09OVEVOVF9MRU5fQkFOSwkJCT0gNiwKLX07Ci0KLS8qIEUtRnVzZSAqLwotI2RlZmluZSBFRlVTRV9NQVBfU0laRSAgICAgIDI1NgotCi0jZGVmaW5lIEVGVVNFX01BWF9TSVpFICAgICAgNTEyCi0vKiBlbmQgb2YgRS1GdXNlICovCi0KLSNkZWZpbmUJCUVGVVNFX01BWF9NQVBfTEVOCQkyNTYKLSNkZWZpbmUJCUVGVVNFX01BWF9IV19TSVpFCQk1MTIKLSNkZWZpbmUJCUVGVVNFX01BWF9TRUNUSU9OX0JBU0UJMTYKLQotI2RlZmluZSBFWFRfSEVBREVSKGhlYWRlcikgKChoZWFkZXIgJiAweDFGKSA9PSAweDBGKQotI2RlZmluZSBBTExfV09SRFNfRElTQUJMRUQod2RlKQkoKHdkZSAmIDB4MEYpID09IDB4MEYpCi0jZGVmaW5lIEdFVF9IRFJfT0ZGU0VUXzJfMChoZWFkZXIpICggKGhlYWRlciAmIDB4RTApID4+IDUpCi0KLSNkZWZpbmUJCUVGVVNFX1JFUEVBVF9USFJFU0hPTERfCQkJMwotCi0vKiAgKi8KLS8qCVRoZSBmb2xsb3dpbmcgaXMgZm9yIEJUIEVmdXNlIGRlZmluaXRpb24gKi8KLS8qICAqLwotI2RlZmluZQkJRUZVU0VfQlRfTUFYX01BUF9MRU4JCTEwMjQKLSNkZWZpbmUJCUVGVVNFX01BWF9CQU5LCQkJNAotI2RlZmluZQkJRUZVU0VfTUFYX0JUX0JBTksJCShFRlVTRV9NQVhfQkFOSy0xKQotLyogICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIFBhcmFtZXRlcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUJCUVGVVNFX01BWF9XT1JEX1VOSVQJCQk0Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RydWN0IHBnX3BrdF9zdHJ1Y3QgewotCXU4IG9mZnNldDsKLQl1OCB3b3JkX2VuOwotCXU4IGRhdGFbOF07Ci0JdTggd29yZF9jbnRzOwotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXUxNgllZnVzZV9HZXRNYXhTaXplMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotaW50CXJ0d19lZnVzZV9hY2Nlc3MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYlJlYWQsIHUxNiBzdGFydF9hZGRyLCB1MTYgY250cywgdTggKmRhdGEpOwotaW50CXJ0d19lZnVzZV9tYXBfcmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTE2IGNudHMsIHU4ICpkYXRhKTsKLXU4CXJ0d19lZnVzZV9tYXBfd3JpdGUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTE2IGFkZHIsIHUxNiBjbnRzLCB1OCAqZGF0YSk7Ci1pbnQJcnR3X0JUX2VmdXNlX21hcF9yZWFkMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyLCB1MTYgY250cywgdTggKmRhdGEpOwotdTgJcnR3X0JUX2VmdXNlX21hcF93cml0ZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTE2IGNudHMsIHU4ICpkYXRhKTsKLQotdTE2CUVmdXNlX0dldEN1cnJlbnRTaXplMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHU4IGVmdXNlVHlwZSk7Ci11OAlFZnVzZV9DYWxjdWxhdGVXb3JkQ250czIzYSh1OCB3b3JkX2VuKTsKLXZvaWQJUmVhZEVGdXNlQnl0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUxNiBfb2Zmc2V0LCB1OCAqcGJ1Zik7Ci12b2lkCUVGVVNFX0dldEVmdXNlRGVmaW5pdGlvbjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBlZnVzZVR5cGUsIHU4IHR5cGUsIHZvaWQgKnBPdXQpOwotaW50CWVmdXNlX09uZUJ5dGVSZWFkMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUxNiBhZGRyLCB1OCAqZGF0YSk7Ci1pbnQJZWZ1c2VfT25lQnl0ZVdyaXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUxNiBhZGRyLCB1OCBkYXRhKTsKLQotdm9pZAlFZnVzZV9Qb3dlclN3aXRjaDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBiV3JpdGUsCi0JCQkgICAgIHU4IFB3clN0YXRlKTsKLWludAlFZnVzZV9QZ1BhY2tldFJlYWQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggb2Zmc2V0LCB1OCAqZGF0YSk7Ci1pbnQJRWZ1c2VfUGdQYWNrZXRXcml0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBvZmZzZXQsIHU4IHdvcmRfZW4sIHU4ICpkYXRhKTsKLXZvaWQJZWZ1c2VfV29yZEVuYWJsZURhdGFSZWFkMjNhKHU4IHdvcmRfZW4sIHU4ICpzb3VyZGF0YSwgdTggKnRhcmdldGRhdGEpOwotdTgJRWZ1c2VfV29yZEVuYWJsZURhdGFXcml0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MTYgZWZ1c2VfYWRkciwgdTggd29yZF9lbiwgdTggKmRhdGEpOwotCi11OAlFRlVTRV9SZWFkMUJ5dGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTE2IEFkZHJlc3MpOwotdm9pZAlFRlVTRV9TaGFkb3dNYXBVcGRhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTggZWZ1c2VUeXBlKTsKLXZvaWQJRUZVU0VfU2hhZG93UmVhZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1OCBUeXBlLCB1MTYgT2Zmc2V0LCB1MzIgKlZhbHVlKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2V2ZW50LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2V2ZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NTdhZWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19ldmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9SVFdfRVZFTlRfSF8KLSNkZWZpbmUgX1JUV19FVkVOVF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPHdsYW5fYnNzZGVmLmg+Ci0KLS8qCi1Vc2VkIHRvIHJlcG9ydCBhIGJzcyBoYXMgYmVlbiBzY2FubmVkCi0qLwotc3RydWN0IHN1cnZleV9ldmVudCB7Ci0Jc3RydWN0IHdsYW5fYnNzaWRfZXggKmJzczsKLX07Ci0KLS8qCi1Vc2VkIHRvIHJlcG9ydCB0aGF0IHRoZSByZXF1ZXN0ZWQgc2l0ZSBzdXJ2ZXkgaGFzIGJlZW4gZG9uZS4KLWJzc19jbnQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYnNzIHRoYXQgaGFzIGJlZW4gcmVwb3J0ZWQuCi0qLwotc3RydWN0IHN1cnZleWRvbmVfZXZlbnQgewotCXVuc2lnbmVkIGludCBic3NfY250OwotfTsKLQotLyoKLVVzZWQgdG8gcmVwb3J0IHRoZSBsaW5rIHJlc3VsdCBvZiBqb2lubmluZyB0aGUgZ2l2ZW4gYnNzCi1qb2luX3JlczoKLS0xOiBhdXRoZW50aWNhdGlvbiBmYWlsCi0tMjogYXNzb2NpYXRpb24gZmFpbAotPiAwOiBUSUQKLSovCi1zdHJ1Y3Qgam9pbmJzc19ldmVudCB7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayBuZXR3b3JrOwotfTsKLQotLyoKLVVzZWQgdG8gcmVwb3J0IGEgZ2l2ZW4gU1RBIGhhcyBqb2lubmVkIHRoZSBjcmVhdGVkIEJTUy4KLUl0IGlzIHVzZWQgaW4gQVAvQWQtSG9DKE0pIG1vZGUuCi0qLwotc3RydWN0IHN0YXNzb2NfZXZlbnQgewotCXVuc2lnbmVkIGNoYXIgbWFjYWRkcls2XTsKLQl1bnNpZ25lZCBjaGFyIHJzdmRbMl07Ci0JaW50IGNhbV9pZDsKLX07Ci0KLXN0cnVjdCBzdGFkZWxfZXZlbnQgewotCXVuc2lnbmVkIGNoYXIgbWFjYWRkcls2XTsKLQl1bnNpZ25lZCBjaGFyIHJzdmRbMl07IC8qIGZvciByZWFzb24gKi8KLQlpbnQgbWFjX2lkOwotfTsKLQotc3RydWN0IGFkZGJhX2V2ZW50IHsKLQl1bnNpZ25lZCBpbnQgdGlkOwotfTsKLQotI2RlZmluZSBHRU5fRVZUX0NPREUoZXZlbnQpCWV2ZW50ICMjIF9FVlRfCi0KLXN0cnVjdCBmd2V2ZW50IHsKLQl1MzIgcGFybXNpemU7Ci0Jdm9pZCAoKmV2ZW50X2NhbGxiYWNrKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmRldiwgY29uc3QgdTggKnBidWYpOwotfTsKLQotI2VuZGlmIC8qICBfV0xBTkVWRU5UX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2h0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2h0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGViODkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19odC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9SVFdfSFRfSF8KLSNkZWZpbmUgX1JUV19IVF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgImxpbnV4L2llZWU4MDIxMS5oIgotI2luY2x1ZGUgIndpZmkuaCIKLQotc3RydWN0IGh0X3ByaXYgewotCWJvb2wJaHRfb3B0aW9uOwotCWJvb2wJYW1wZHVfZW5hYmxlOy8qIGZvciBlbmFibGUgVHggQS1NUERVICovCi0JLyogdTgJYmFkZGJhcmVxX2lzc3VlZFsxNl07ICovCi0JdTMyCXR4X2Ftc2R1X2VuYWJsZTsvKiBmb3IgZW5hYmxlIFR4IEEtTVNEVSAqLwotCXUzMgl0eF9hbWRzdV9tYXhsZW47IC8qICAxOiA4aywgMDo0ayA7IGRlZmF1bHQ6OGssIGZvciB0eCAqLwotCXUzMglyeF9hbXBkdV9tYXhsZW47IC8qIGZvciByeCByZW9yZGVyaW5nIGN0cmwgd2luX3N6LCB1cGRhdGVkIHdoZW4gam9pbl9jYWxsYmFjay4gKi8KLQotCXU4CWJ3bW9kZTsvKiAgKi8KLQl1OAljaF9vZmZzZXQ7LyogUFJJTUVfQ0hOTF9PRkZTRVQgKi8KLQl1OAlzZ2k7Lyogc2hvcnQgR0kgKi8KLQotCS8qIGZvciBwcm9jZXNzaW5nIFR4IEEtTVBEVSAqLwotCXUxNglhZ2dfZW5hYmxlX2JpdG1hcDsKLQkvKiB1OAlBRERCQV9yZXRyeV9jb3VudDsgKi8KLQl1MTYJY2FuZGlkYXRlX3RpZF9iaXRtYXA7Ci0KLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7Ci19OwotCi0jZW5kaWYJLyogX1JUTDg3MVhfSFRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxMTllMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX1JUV19JT19IXwotI2RlZmluZSBfUlRXX0lPX0hfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotCi0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLS8qIGluY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+ICovCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IvY2g5Lmg+Ci0KLSNkZWZpbmUgcnR3X3VzYl9idWZmZXJfYWxsb2MoZGV2LCBzaXplLCBkbWEpIHVzYl9hbGxvY19jb2hlcmVudCgoZGV2KSwgKHNpemUpLCAoaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCksIChkbWEpKQotI2RlZmluZSBydHdfdXNiX2J1ZmZlcl9mcmVlKGRldiwgc2l6ZSwgYWRkciwgZG1hKSB1c2JfZnJlZV9jb2hlcmVudCgoZGV2KSwgKHNpemUpLCAoYWRkciksIChkbWEpKQotCi0jZGVmaW5lIE5VTV9JT1JFUQkJOAotCi0jZGVmaW5lIE1BWF9QUk9UX1NaCSg2NC0xNikKLQotI2RlZmluZSBfSU9SRUFEWQkJCTAKLSNkZWZpbmUgX0lPX1dBSVRfQ09NUExFVEUgICAxCi0jZGVmaW5lIF9JT19XQUlUX1JTUCAgICAgICAgMgotCi0vKiAgSU8gQ09NTUFORCBUWVBFICovCi0jZGVmaW5lIF9JT1NaX01BU0tfCQkoMHg3RikKLSNkZWZpbmUgX0lPX1dSSVRFXwkJQklUKDcpCi0jZGVmaW5lIF9JT19GSVhFRF8JCUJJVCg4KQotI2RlZmluZSBfSU9fQlVSU1RfCQlCSVQoOSkKLSNkZWZpbmUgX0lPX0JZVEVfCQlCSVQoMTApCi0jZGVmaW5lIF9JT19IV18JCQlCSVQoMTEpCi0jZGVmaW5lIF9JT19XT1JEXwkJQklUKDEyKQotI2RlZmluZSBfSU9fU1lOQ18JCUJJVCgxMykKLSNkZWZpbmUgX0lPX0NNRE1BU0tfCSgweDFGODApCi0KLQotLyoKLQlGb3IgcHJvbXB0IG1vZGUgYWNjZXNzaW5nLCBjYWxsZXIgc2hhbGwgZnJlZSBpb19yZXEKLQlPdGhlcndpc2UsIGlvX2hhbmRsZXIgd2lsbCBmcmVlIGlvX3JlcQotKi8KLQotCi0KLS8qICBJTyBTVEFUVVMgVFlQRSAqLwotI2RlZmluZSBfSU9fRVJSXwkJQklUKDIpCi0jZGVmaW5lIF9JT19TVUNDRVNTXwlCSVQoMSkKLSNkZWZpbmUgX0lPX0RPTkVfCQlCSVQoMCkKLQotCi0jZGVmaW5lIElPX1JEMzIJCQkoX0lPX1NZTkNfIHwgX0lPX1dPUkRfKQotI2RlZmluZSBJT19SRDE2CQkJKF9JT19TWU5DXyB8IF9JT19IV18pCi0jZGVmaW5lIElPX1JEOAkJCShfSU9fU1lOQ18gfCBfSU9fQllURV8pCi0KLSNkZWZpbmUgSU9fUkQzMl9BU1lOQwkoX0lPX1dPUkRfKQotI2RlZmluZSBJT19SRDE2X0FTWU5DCShfSU9fSFdfKQotI2RlZmluZSBJT19SRDhfQVNZTkMJKF9JT19CWVRFXykKLQotI2RlZmluZSBJT19XUjMyCQkJKF9JT19XUklURV8gfCBfSU9fU1lOQ18gfCBfSU9fV09SRF8pCi0jZGVmaW5lIElPX1dSMTYJCQkoX0lPX1dSSVRFXyB8IF9JT19TWU5DXyB8IF9JT19IV18pCi0jZGVmaW5lIElPX1dSOAkJCShfSU9fV1JJVEVfIHwgX0lPX1NZTkNfIHwgX0lPX0JZVEVfKQotCi0jZGVmaW5lIElPX1dSMzJfQVNZTkMJKF9JT19XUklURV8gfCBfSU9fV09SRF8pCi0jZGVmaW5lIElPX1dSMTZfQVNZTkMJKF9JT19XUklURV8gfCBfSU9fSFdfKQotI2RlZmluZSBJT19XUjhfQVNZTkMJKF9JT19XUklURV8gfCBfSU9fQllURV8pCi0KLS8qCi0KLQlPbmx5IFN5bmMuIGJ1cnN0IGFjY2Vzc2luZyBpcyBwcm92aWRlZC4KLQotKi8KLQotI2RlZmluZSBJT19XUl9CVVJTVCh4KQkJKF9JT19XUklURV8gfCBfSU9fU1lOQ18gfCBfSU9fQlVSU1RfIHwgKCAoeCkgJiBfSU9TWl9NQVNLXykpCi0jZGVmaW5lIElPX1JEX0JVUlNUKHgpCQkoX0lPX1NZTkNfIHwgX0lPX0JVUlNUXyB8ICggKHgpICYgX0lPU1pfTUFTS18pKQotCi0KLQotLyogYmVsb3cgaXMgZm9yIHRoZSBpbnRmX29wdGlvbiBiaXQgZGVmaXRpb24uLi4gKi8KLQotI2RlZmluZSBfSU5URl9BU1lOQ18JQklUKDApCS8qIHN1cHBvcnQgYXN5bmMgaW8gKi8KLQotc3RydWN0IGludGZfcHJpdjsKLQotc3RydWN0IGlvX3JlcSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXUzMglhZGRyOwotCXZvbGF0aWxlIHUzMgl2YWw7Ci0JdTMyCWNvbW1hbmQ7Ci0JdTMyCXN0YXR1czsKLQl1OAkqcGJ1ZjsKLQlzdHJ1Y3Qgc2VtYXBob3JlCXNlbWE7Ci0KLQl2b2lkICgqX2FzeW5jX2lvX2NhbGxiYWNrKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGF0ZXIsIHN0cnVjdCBpb19yZXEgKnBpb19yZXEsIHU4ICpjbnh0KTsKLQl1OCAqY254dDsKLX07Ci0KLXN0cnVjdCByZWdfcHJvdG9jb2xfcmQgewotCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0KLQkvKiBEVzEgKi8KLQl1MzIJCU51bU9mVHJhbnM6NDsKLQl1MzIJCVJlc2VydmVkMTo0OwotCXUzMgkJUmVzZXJ2ZWQyOjI0OwotCS8qIERXMiAqLwotCXUzMgkJQnl0ZUNvdW50Ojc7Ci0JdTMyCQlXcml0ZUVuYWJsZToxOwkJLyogMDpyZWFkLCAxOndyaXRlICovCi0JdTMyCQlGaXhPckNvbnRpbnVvdXM6MTsJLyogMDpjb250aW51b3VzLCAxOiBGaXggKi8KLQl1MzIJCUJ1cnN0TW9kZToxOwotCXUzMgkJQnl0ZTFBY2Nlc3M6MTsKLQl1MzIJCUJ5dGUyQWNjZXNzOjE7Ci0JdTMyCQlCeXRlNEFjY2VzczoxOwotCXUzMgkJUmVzZXJ2ZWQzOjM7Ci0JdTMyCQlSZXNlcnZlZDQ6MTY7Ci0JLyogRFczICovCi0JdTMyCQlCdXNBZGRyZXNzOwotCS8qIERXNCAqLwotCS8qIHUzMgkJVmFsdWU7ICovCi0jZWxzZQotCi0KLS8qIERXMSAqLwotCXUzMiBSZXNlcnZlZDEgIDo0OwotCXUzMiBOdW1PZlRyYW5zIDo0OwotCi0JdTMyIFJlc2VydmVkMiAgOjI0OwotCi0JLyogRFcyICovCi0JdTMyIFdyaXRlRW5hYmxlIDogMTsKLQl1MzIgQnl0ZUNvdW50IDo3OwotCi0KLQl1MzIgUmVzZXJ2ZWQzIDogMzsKLQl1MzIgQnl0ZTRBY2Nlc3MgOiAxOwotCi0JdTMyIEJ5dGUyQWNjZXNzIDogMTsKLQl1MzIgQnl0ZTFBY2Nlc3MgOiAxOwotCXUzMiBCdXJzdE1vZGUgOjEgOwotCXUzMiBGaXhPckNvbnRpbnVvdXMgOiAxOwotCi0JdTMyIFJlc2VydmVkNCA6IDE2OwotCi0JLyogRFczICovCi0JdTMyCQlCdXNBZGRyZXNzOwotCi0JLyogRFc0ICovCi0JLyogdTMyCQlWYWx1ZTsgKi8KLQotI2VuZGlmCi0KLX07Ci0KLQotc3RydWN0IHJlZ19wcm90b2NvbF93dCB7Ci0KLQotI2lmZGVmIF9fTElUVExFX0VORElBTgotCi0JLyogRFcxICovCi0JdTMyCQlOdW1PZlRyYW5zOjQ7Ci0JdTMyCQlSZXNlcnZlZDE6NDsKLQl1MzIJCVJlc2VydmVkMjoyNDsKLQkvKiBEVzIgKi8KLQl1MzIJCUJ5dGVDb3VudDo3OwotCXUzMgkJV3JpdGVFbmFibGU6MTsJCS8qIDA6cmVhZCwgMTp3cml0ZSAqLwotCXUzMgkJRml4T3JDb250aW51b3VzOjE7CS8qIDA6Y29udGludW91cywgMTogRml4ICovCi0JdTMyCQlCdXJzdE1vZGU6MTsKLQl1MzIJCUJ5dGUxQWNjZXNzOjE7Ci0JdTMyCQlCeXRlMkFjY2VzczoxOwotCXUzMgkJQnl0ZTRBY2Nlc3M6MTsKLQl1MzIJCVJlc2VydmVkMzozOwotCXUzMgkJUmVzZXJ2ZWQ0OjE2OwotCS8qIERXMyAqLwotCXUzMgkJQnVzQWRkcmVzczsKLQkvKiBEVzQgKi8KLQl1MzIJCVZhbHVlOwotCi0jZWxzZQotCS8qIERXMSAqLwotCXUzMiBSZXNlcnZlZDEgIDo0OwotCXUzMiBOdW1PZlRyYW5zIDo0OwotCi0JdTMyIFJlc2VydmVkMiAgOjI0OwotCi0JLyogRFcyICovCi0JdTMyIFdyaXRlRW5hYmxlIDogMTsKLQl1MzIgQnl0ZUNvdW50IDo3OwotCi0JdTMyIFJlc2VydmVkMyA6IDM7Ci0JdTMyIEJ5dGU0QWNjZXNzIDogMTsKLQotCXUzMiBCeXRlMkFjY2VzcyA6IDE7Ci0JdTMyIEJ5dGUxQWNjZXNzIDogMTsKLQl1MzIgQnVyc3RNb2RlIDoxIDsKLQl1MzIgRml4T3JDb250aW51b3VzIDogMTsKLQotCXUzMiBSZXNlcnZlZDQgOiAxNjsKLQotCS8qIERXMyAqLwotCXUzMgkJQnVzQWRkcmVzczsKLQotCS8qIERXNCAqLwotCXUzMgkJVmFsdWU7Ci0KLSNlbmRpZgotCi19OwotCi0jZGVmaW5lIFBsYXRmb3JtRUZJT1dyaXRlMUJ5dGUoX2EsIF9iLCBfYykJCVwKLQlydGw4NzIzYXVfd3JpdGU4KF9hLCBfYiwgX2MpCi0jZGVmaW5lIFBsYXRmb3JtRUZJT1dyaXRlMkJ5dGUoX2EsIF9iLCBfYykJCVwKLQlydGw4NzIzYXVfd3JpdGUxNihfYSwgX2IsIF9jKQotI2RlZmluZSBQbGF0Zm9ybUVGSU9Xcml0ZTRCeXRlKF9hLCBfYiwgX2MpCQlcCi0JcnRsODcyM2F1X3dyaXRlMzIoX2EsIF9iLCBfYykKLQotI2RlZmluZSBQbGF0Zm9ybUVGSU9SZWFkMUJ5dGUoX2EsIF9iKQkJcnRsODcyM2F1X3JlYWQ4KF9hLCBfYikKLSNkZWZpbmUgUGxhdGZvcm1FRklPUmVhZDJCeXRlKF9hLCBfYikJCXJ0bDg3MjNhdV9yZWFkMTYoX2EsIF9iKQotI2RlZmluZSBQbGF0Zm9ybUVGSU9SZWFkNEJ5dGUoX2EsIF9iKQkJcnRsODcyM2F1X3JlYWQzMihfYSwgX2IpCi0KLSNlbmRpZgkvKiBfUlRMODcxMV9JT19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X21sbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJkM2E1Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X21sbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fUlRXX01MTUVfSF8KLSNkZWZpbmUgX19SVFdfTUxNRV9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotCi0jZGVmaW5lCU1BWF9CU1NfQ05UCTEyOAotI2RlZmluZSAgIE1BWF9KT0lOX1RJTUVPVVQJNjUwMAotCi0vKiBJbmNyZWFzZSB0aGUgc2Nhbm5pbmcgdGltZW91dCBiZWNhdXNlIG9mIGluY3JlYXNpbmcgdGhlIFNVUlZFWV9UTyB2YWx1ZS4gKi8KLQotI2RlZmluZQlTQ0FOTklOR19USU1FT1VUCTgwMDAKLQotI2RlZmluZQlTQ0FOX0lOVEVSVkFMCSgzMCkgLyogIHVuaXQ6MnNlYywgMzAqMiA9IDYwc2VjICovCi0KLSNkZWZpbmUJU0NBTlFVRVVFX0xJRkVUSU1FIDIwIC8qICB1bml0OnNlYyAqLwotCi0jZGVmaW5lCVdJRklfTlVMTF9TVEFURQkJMHgwMDAwMDAwMAotCi0jZGVmaW5lCVdJRklfQVNPQ19TVEFURQkJMHgwMDAwMDAwMSAvKiAgVW5kZXIgTGlua2VkIHN0YXRlLiovCi0jZGVmaW5lCVdJRklfUkVBU09DX1NUQVRFCTB4MDAwMDAwMDIKLSNkZWZpbmUJV0lGSV9TTEVFUF9TVEFURQkweDAwMDAwMDA0Ci0jZGVmaW5lCVdJRklfU1RBVElPTl9TVEFURQkweDAwMDAwMDA4Ci0KLSNkZWZpbmUJV0lGSV9BUF9TVEFURQkJMHgwMDAwMDAxMAotI2RlZmluZQlXSUZJX0FESE9DX1NUQVRFCTB4MDAwMDAwMjAKLSNkZWZpbmUgICBXSUZJX0FESE9DX01BU1RFUl9TVEFURQkweDAwMDAwMDQwCi0jZGVmaW5lICAgV0lGSV9VTkRFUl9MSU5LSU5HCTB4MDAwMDAwODAKLQotI2RlZmluZQlXSUZJX1VOREVSX1dQUwkJMHgwMDAwMDEwMAotI2RlZmluZQlXSUZJX1NUQV9BTElWRV9DSEtfU1RBVEUJMHgwMDAwMDQwMAotLyogdG8gaW5kaWNhdGUgdGhlIHN0YXRpb24gaXMgdW5kZXIgc2l0ZSBzdXJ2ZXlpbmcgKi8KLSNkZWZpbmUJV0lGSV9TSVRFX01PTklUT1IJMHgwMDAwMDgwMAotCi0jZGVmaW5lCVdJRklfTVBfU1RBVEUJCTB4MDAwMTAwMDAKLSNkZWZpbmUJV0lGSV9NUF9DVFhfQkFDS0dST1VORAkweDAwMDIwMDAwCS8qICBpbiBjb250aW51b3VzIHR4IGJhY2tncm91bmQgKi8KLSNkZWZpbmUJV0lGSV9NUF9DVFhfU1QJCTB4MDAwNDAwMDAJLyogIGluIGNvbnRpbnVvdXMgdHggd2l0aCBzaW5nbGUtdG9uZSAqLwotI2RlZmluZQlXSUZJX01QX0NUWF9CQUNLR1JPVU5EX1BFTkRJTkcJMHgwMDA4MDAwMAkvKiAgcGVuZGluZyBpbiBjb250aW51b3VzIHR4IGJhY2tncm91bmQgZHVlIHRvIG91dCBvZiBza2IgKi8KLSNkZWZpbmUJV0lGSV9NUF9DVFhfQ0NLX0hXCTB4MDAxMDAwMDAJLyogIGluIGNvbnRpbnVvdXMgdHggKi8KLSNkZWZpbmUJV0lGSV9NUF9DVFhfQ0NLX0NTCTB4MDAyMDAwMDAJLyogIGluIGNvbnRpbnVvdXMgdHggd2l0aCBjYXJyaWVyIHN1cHByZXNzaW9uICovCi0jZGVmaW5lICAgV0lGSV9NUF9MUEJLX1NUQVRFCTB4MDA0MDAwMDAKLQotI2RlZmluZSBfRldfVU5ERVJfTElOS0lORwlXSUZJX1VOREVSX0xJTktJTkcKLSNkZWZpbmUgX0ZXX0xJTktFRAkJV0lGSV9BU09DX1NUQVRFCi0jZGVmaW5lIF9GV19VTkRFUl9TVVJWRVkJV0lGSV9TSVRFX01PTklUT1IKLQotCi1lbnVtIGRvdDExQXV0aEFsZ3J0aG1OdW0gewotCWRvdDExQXV0aEFsZ3J0aG1fT3BlbiA9IDAsCi0JZG90MTFBdXRoQWxncnRobV9TaGFyZWQsCi0JZG90MTFBdXRoQWxncnRobV84MDIxWCwKLQlkb3QxMUF1dGhBbGdydGhtX0F1dG8sCi0JZG90MTFBdXRoQWxncnRobV9NYXhOdW0KLX07Ci0KLS8qICBTY2FuIHR5cGUgaW5jbHVkaW5nIGFjdGl2ZSBhbmQgcGFzc2l2ZSBzY2FuLiAqLwotZW51bSBydF9zY2FuX3R5cGUgewotCVNDQU5fUEFTU0lWRSwKLQlTQ0FOX0FDVElWRSwKLQlTQ0FOX01JWCwKLX07Ci0KLWVudW0gewotCUdIWjI0XzUwID0gMCwKLQlHSFpfNTAsCi0JR0haXzI0LAotfTsKLQotLyoKLQotdGhlcmUgYXJlIHNldmVyYWwgImxvY2tzIiBpbiBtbG1lX3ByaXYsCi1zaW5jZSBtbG1lX3ByaXYgaXMgYSBzaGFyZWQgcmVzb3VyY2UgYmV0d2VlbiBtYW55IHRocmVhZHMsCi1saWtlIElTUi9DYWxsLUJhY2sgZnVuY3Rpb25zLCB0aGUgT0lEIGhhbmRsZXJzLCBhbmQgZXZlbiB0aW1lciBmdW5jdGlvbnMuCi0KLQotRWFjaCBfcXVldWUgaGFzIGl0cyBvd24gbG9ja3MsIGFscmVhZHkuCi1PdGhlciBpdGVtcyBhcmUgcHJvdGVjdGVkIGJ5IG1sbWVfcHJpdi5sb2NrLgotCi1UbyBhdm9pZCBwb3NzaWJsZSBkZWFkIGxvY2ssIGFueSB0aHJlYWQgdHJ5aW5nIHRvIG1vZGlmaXlpbmcgbWxtZV9wcml2Ci1TSEFMTCBub3QgbG9jayB1cCBtb3JlIHRoYW4gb25lIGxvY2tzIGF0IGEgdGltZSEKLSovCi0KLXN0cnVjdCBydF9saW5rX2RldGVjdCB7Ci0JdTMyCU51bVR4T2tJblBlcmlvZDsKLQl1MzIJTnVtUnhPa0luUGVyaW9kOwotCXUzMglOdW1SeFVuaWNhc3RPa0luUGVyaW9kOwotCWJvb2wJYkJ1c3lUcmFmZmljOwotCWJvb2wJYlR4QnVzeVRyYWZmaWM7Ci0JYm9vbAliUnhCdXN5VHJhZmZpYzsKLQlib29sCWJIaWdoZXJCdXN5VHJhZmZpYzsgLyogIEZvciBpbnRlcnJ1cHQgbWlncmF0aW9uIHB1cnBvc2UuICovCi0JYm9vbAliSGlnaGVyQnVzeVJ4VHJhZmZpYzsgLyogIFdlIG1heSBkaXNhYmxlIFR4IGludGVycnVwdCBhY2NvcmRpbmcgYXMgUnggdHJhZmZpYy4gKi8KLQlib29sCWJIaWdoZXJCdXN5VHhUcmFmZmljOyAvKiAgV2UgbWF5IGRpc2FibGUgVHggaW50ZXJydXB0IGFjY29yZGluZyBhcyBUeCB0cmFmZmljLiAqLwotfTsKLQotc3RydWN0IG1sbWVfcHJpdiB7Ci0Jc3BpbmxvY2tfdAlsb2NrOwotCWludAlmd19zdGF0ZTsKLQl1OCBiU2NhbkluUHJvY2VzczsKLQl1OAl0b19qb2luOyAvKiBmbGFnICovCi0JdTggdG9fcm9hbWluZzsgLyogIHJvYW1pbmcgdHJ5aW5nIHRpbWVzICovCi0KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKm5pY19oZGw7Ci0KLQl1OAlub3RfaW5kaWNfZGlzY287Ci0Jc3RydWN0IHJ0d19xdWV1ZQlzY2FubmVkX3F1ZXVlOwotCi0Jc3RydWN0IGNmZzgwMjExX3NzaWQgYXNzb2Nfc3NpZDsKLQl1OAlhc3NvY19ic3NpZFs2XTsKLQotCXN0cnVjdCB3bGFuX25ldHdvcmsJY3VyX25ldHdvcms7Ci0KLQkvKiB1aW50IHdpcmVsZXNzX21vZGU7IG5vIHVzZWQsIHJlbW92ZSBpdCAqLwotCi0JdTMyCXNjYW5faW50ZXJ2YWw7Ci0KLQlzdHJ1Y3QgdGltZXJfbGlzdCBhc3NvY190aW1lcjsKLQotCXVpbnQgYXNzb2NfYnlfYnNzaWQ7Ci0JdWludCBhc3NvY19ieV9yc3NpOwotCi0Jc3RydWN0IHRpbWVyX2xpc3Qgc2Nhbl90b190aW1lcjsKLQotCXN0cnVjdCB0aW1lcl9saXN0IHNldF9zY2FuX2RlbnlfdGltZXI7Ci0JYXRvbWljX3Qgc2V0X3NjYW5fZGVueTsgLyogMDogYWxsb3dlZCwgMTogZGVueSAqLwotCi0JdW5zaWduZWQgaW50IHFvc19vcHRpb247Ci0KLQkvKiBOdW1iZXIgb2Ygbm9uLUhUIEFQL3N0YXRpb25zICovCi0JaW50IG51bV9zdGFfbm9faHQ7Ci0KLQlpbnQgbnVtX0ZvcnR5TUh6SW50b2xlcmFudDsKLQotCXN0cnVjdCBodF9wcml2CWh0cHJpdjsKLQotCXN0cnVjdCBydF9saW5rX2RldGVjdCBMaW5rRGV0ZWN0SW5mbzsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBkeW5hbWljX2Noa190aW1lcjsgLyogZHluYW1pYy9wZXJpb2RpYyBjaGVjayB0aW1lciAqLwotCi0JdTgJa2V5X21hc2s7IC8qIHVzZSBmb3IgaXBzIHRvIHNldCB3ZXAga2V5IGFmdGVyIGlwc19sZWF2ZTIzYSAqLwotCXU4CWFjbV9tYXNrOyAvKiAgZm9yIHdtbSBhY20gbWFzayAqLwotCXU4CUNoYW5uZWxQbGFuOwotCWVudW0gcnRfc2Nhbl90eXBlIHNjYW5fbW9kZTsgLyogIGFjdGl2ZTogMSwgcGFzc2l2ZTogMCAqLwotCi0JdTggKndwc19wcm9iZV9yZXFfaWU7Ci0JdTMyIHdwc19wcm9iZV9yZXFfaWVfbGVuOwotCXU4ICphc3NvY19yZXE7Ci0JdTMyIGFzc29jX3JlcV9sZW47Ci0JdTMyIGFzc29jX3JzcF9sZW47Ci0JdTggKmFzc29jX3JzcDsKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCS8qIE51bWJlciBvZiBhc3NvY2lhdGVkIE5vbi1FUlAgc3RhdGlvbnMgKGkuZS4sIHN0YXRpb25zIHVzaW5nIDgwMi4xMWIKLQkgKiBpbiA4MDIuMTFnIEJTUykgKi8KLQlpbnQgbnVtX3N0YV9ub25fZXJwOwotCi0JLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBTaG9ydCBTbG90IFRpbWUgKi8KLQlpbnQgbnVtX3N0YV9ub19zaG9ydF9zbG90X3RpbWU7Ci0KLQkvKiBOdW1iZXIgb2YgYXNzb2NpYXRlZCBzdGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFNob3J0IFByZWFtYmxlICovCi0JaW50IG51bV9zdGFfbm9fc2hvcnRfcHJlYW1ibGU7Ci0KLQlpbnQgb2xiYzsgLyogT3ZlcmxhcHBpbmcgTGVnYWN5IEJTUyBDb25kaXRpb24gKi8KLQotCS8qIE51bWJlciBvZiBIVCBhc3NvY2lhdGVkIHN0YXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgZ3JlZW5maWVsZCAqLwotCWludCBudW1fc3RhX2h0X25vX2dmOwotCi0JLyogTnVtYmVyIG9mIGFzc29jaWF0ZWQgbm9uLUhUIHN0YXRpb25zICovCi0JLyogaW50IG51bV9zdGFfbm9faHQ7ICovCi0KLQkvKiBOdW1iZXIgb2YgSFQgYXNzb2NpYXRlZCBzdGF0aW9ucyAyMCBNSHogKi8KLQlpbnQgbnVtX3N0YV9odF8yMG1oejsKLQotCS8qIE92ZXJsYXBwaW5nIEJTUyBpbmZvcm1hdGlvbiAqLwotCWludCBvbGJjX2h0OwotCi0JdTE2IGh0X29wX21vZGU7Ci0KLQlzcGlubG9ja190CWJjbl91cGRhdGVfbG9jazsKLQl1OAkJdXBkYXRlX2JjbjsKLQotI2VuZGlmIC8qIGlmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotfTsKLQotdm9pZCBydHdfam9pbmJzc19ldmVudF9wcmVoYW5kbGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCAqcGJ1Zik7Ci12b2lkIHJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci12b2lkIHJ0d19zdXJ2ZXlkb25lX2V2ZW50X2NhbGxiYWNrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotdm9pZCBydHcyM2Ffam9pbmJzc19ldmVudF9jYihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLXZvaWQgcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci12b2lkIHJ0d19zdGFkZWxfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci0KLWludCBldmVudF90aHJlYWQodm9pZCAqY29udGV4dCk7Ci12b2lkIHJ0dzIzYV9qb2luX3RvX2hhbmRsZXIodW5zaWduZWQgbG9uZyk7Ci0KLXZvaWQgcnR3X2ZyZWVfbmV0d29ya19xdWV1ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotaW50IHJ0d19pbml0X21sbWVfcHJpdjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi12b2lkIHJ0d19mcmVlX21sbWVfcHJpdjIzYShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpOwotCi1pbnQgcnR3X2RvX2pvaW5fYWRob2Moc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLWludCBydHdfZG9fam9pbl9uZXR3b3JrKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCXN0cnVjdCB3bGFuX25ldHdvcmsgKmNhbmRpZGF0ZSk7Ci1pbnQgcnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfcXVldWUyM2Eoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KTsKLWludCBydHdfc2V0X2tleTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2LCBpbnQga2V5aWQsIHU4IHNldF90eCk7Ci1pbnQgcnR3X3NldF9hdXRoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJIHN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2KTsKLQotc3RhdGljIGlubGluZSB1OCAqZ2V0X2Jzc2lkKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdikKLXsJLyogaWYgc3RhX21vZGU6cG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLk1hY0FkZHJlc3MgPT4gYnNzaWQgKi8KLQkvKiAgaWYgYWRob2NfbW9kZTpwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuTWFjQWRkcmVzcyA9PiBpYnNzIG1hYyBhZGRyZXNzICovCi0JcmV0dXJuIHBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yay5NYWNBZGRyZXNzOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY2hlY2tfZndzdGF0ZShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGludCBzdGF0ZSkKLXsKLQlpZiAocG1sbWVwcml2LT5md19zdGF0ZSAmIHN0YXRlKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ2V0X2Z3c3RhdGUoc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2KQotewotCXJldHVybiBwbWxtZXByaXYtPmZ3X3N0YXRlOwotfQotCi0vKgotICogTm8gTGltaXQgb24gdGhlIGNhbGxpbmcgY29udGV4dCwKLSAqIHRoZXJlZm9yZSBzZXQgaXQgdG8gYmUgdGhlIGNyaXRpY2FsIHNlY3Rpb24uLi4KLSAqCi0gKiAjIyMgTk9URTojIyMjICghISEhKQotICogTVVTVCBUQUtFIENBUkUgVEhBVCBCRUZPUkUgQ0FMTElORyBUSElTIEZVTkMsIFlPVSBTSE9VTEQgSEFWRSBMT0NLRUQgcG1sbWVwcml2LT5sb2NrCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZndzdGF0ZShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGludCBzdGF0ZSkKLXsKLQlwbWxtZXByaXYtPmZ3X3N0YXRlIHw9IHN0YXRlOwotCS8qIEZPUiBIVyBpbnRlZ3JhdGlvbiAqLwotCWlmIChfRldfVU5ERVJfU1VSVkVZID09IHN0YXRlKQotCQlwbWxtZXByaXYtPmJTY2FuSW5Qcm9jZXNzID0gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9jbHJfZndzdGF0ZV8oc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2LCBpbnQgc3RhdGUpCi17Ci0JcG1sbWVwcml2LT5md19zdGF0ZSAmPSB+c3RhdGU7Ci0JLyogRk9SIEhXIGludGVncmF0aW9uICovCi0JaWYgKF9GV19VTkRFUl9TVVJWRVkgPT0gc3RhdGUpCi0JCXBtbG1lcHJpdi0+YlNjYW5JblByb2Nlc3MgPSBmYWxzZTsKLX0KLQotLyoKLSAqIE5vIExpbWl0IG9uIHRoZSBjYWxsaW5nIGNvbnRleHQsCi0gKiB0aGVyZWZvcmUgc2V0IGl0IHRvIGJlIHRoZSBjcml0aWNhbCBzZWN0aW9uLi4uCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbHJfZndzdGF0ZShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGludCBzdGF0ZSkKLXsKLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBzdGF0ZSkpCi0JCXBtbG1lcHJpdi0+Zndfc3RhdGUgXj0gc3RhdGU7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbHJfZndzdGF0ZV9leChzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGludCBzdGF0ZSkKLXsKLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIHN0YXRlKTsKLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLX0KLQotdm9pZCBydHdfZGlzY29ubmVjdF9oZGwyM2FfdW5kZXJfbGlua2VkKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgdTggZnJlZV9hc3NvYyk7Ci12b2lkIHJ0d19nZW5lcmF0ZV9yYW5kb21faWJzczIzYSh1OCAqcGlic3MpOwotc3RydWN0IHdsYW5fbmV0d29yayAqcnR3X2ZpbmRfbmV0d29yazIzYShzdHJ1Y3QgcnR3X3F1ZXVlICpzY2FubmVkX3F1ZXVlLCB1OCAqYWRkcik7Ci1zdHJ1Y3Qgd2xhbl9uZXR3b3JrICpydHdfZ2V0X29sZGVzdF93bGFuX25ldHdvcmsyM2Eoc3RydWN0IHJ0d19xdWV1ZSAqc2Nhbm5lZF9xdWV1ZSk7Ci0KLXZvaWQgcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwKLQkJCSAgICAgIGludCBsb2NrX3NjYW5uZWRfcXVldWUpOwotdm9pZCBydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBydHdfaW5kaWNhdGVfY29ubmVjdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBydHdfc2Nhbl9hYm9ydDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotCi1pbnQgcnR3X3Jlc3RydWN0X3NlY19pZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICppbl9pZSwgdTggKm91dF9pZSwKLQkJCXVpbnQgaW5fbGVuKTsKLWludCBydHdfcmVzdHJ1Y3Rfd21tX2llMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggKmluX2llLCB1OCAqb3V0X2llLAotCQkJdWludCBpbl9sZW4sIHVpbnQgaW5pdGlhbF9vdXRfbGVuKTsKLXZvaWQgcnR3X2luaXRfcmVnaXN0cnlwcml2X2Rldl9uZXR3b3JrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgcnR3X3VwZGF0ZV9yZWdpc3RyeXByaXZfZGV2X25ldHdvcmsyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotdm9pZCBydHdfc2Nhbl90aW1lb3V0X2hhbmRsZXIyM2EodW5zaWduZWQgbG9uZyBkYXRhKTsKLQotdm9pZCBydHdfZHluYW1pY19jaGVja190aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1ib29sIHJ0d19pc19zY2FuX2Rlbnkoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgcnR3X2NsZWFyX3NjYW5fZGVueShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBydHdfc2V0X3NjYW5fZGVueV90aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKTsKLXZvaWQgcnR3X3NldF9zY2FuX2Rlbnkoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1MzIgbXMpOwotCi12b2lkIHJ0dzIzYV9mcmVlX21sbWVfcHJpdl9pZV9kYXRhKHN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdik7Ci0KLXZvaWQgX3J0d19mcmVlX21sbWVfcHJpdjIzYShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpOwotCi1zdHJ1Y3Qgd2xhbl9uZXR3b3JrICpydHdfYWxsb2NfbmV0d29yayhzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYsIGdmcF90IGdmcCk7Ci0KLWludCBydHdfaWZfdXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLWludCBydHdfbGlua2VkX2NoZWNrKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0d19qb2luYnNzX3Jlc2V0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi1ib29sIHJ0d19yZXN0cnVjdHVyZV9odF9pZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaW5faWUsCi0JCQkgICAgICB1OCAqb3V0X2llLCB1aW50IGluX2xlbiwgdWludCAqcG91dF9sZW4pOwotdm9pZCBydHdfdXBkYXRlX2h0X2NhcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgICAgdTggKnBpZSwgdWludCBpZV9sZW4pOwotdm9pZCBydHdfaXNzdWVfYWRkYmFyZXFfY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwotCi1ib29sIHJ0d19pc19zYW1lX2lic3MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkJIHN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrKTsKLWludCBpc19zYW1lX25ldHdvcmsyM2Eoc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYywgc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCk7Ci0KLXZvaWQgcnR3MjNhX3JvYW1pbmcoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLAotCQkgc3RydWN0IHdsYW5fbmV0d29yayAqdGd0X25ldHdvcmspOwotdm9pZCBydHdfc2V0X3JvYW1pbmcoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCB0b19yb2FtaW5nKTsKLQotI2VuZGlmIC8qIF9fUlRMODcxWF9NTE1FX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2QzZGE5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVFdfTUxNRV9FWFRfSF8KLSNkZWZpbmUgX19SVFdfTUxNRV9FWFRfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgotCi0KLS8qCUNvbW1lbnRlZCBieSBBbGJlcnQgMjAxMDExMDUgKi8KLS8qCUluY3JlYXNlIHRoZSBTVVJWRVlfVE8gdmFsdWUgZnJvbSAxMDAgdG8gMTUwICAoIDEwMG1zIHRvIDE1MG1zICkgKi8KLS8qCVRoZSBSZWFsdGVrIDgxODhDRSBTb2Z0QVAgd2lsbCBzcGVuZCBhcm91bmQgMTAwbXMgdG8gc2VuZCB0aGUgcHJvYmUgcmVzcG9uc2UgYWZ0ZXIgcmVjZWl2aW5nIHRoZSBwcm9iZSByZXF1ZXN0LiAqLwotLyoJU28sIHRoaXMgZHJpdmVyIHRyaWVkIHRvIGV4dGVuZCB0aGUgZHdlbGwgdGltZSBmb3IgZWFjaCBzY2FubmluZyBjaGFubmVsLiAqLwotLyoJVGhpcyB3aWxsIGluY3JlYXNlIHRoZSBjaGFuY2UgdG8gcmVjZWl2ZSB0aGUgcHJvYmUgcmVzcG9uc2UgZnJvbSBTb2Z0QVAuICovCi0KLSNkZWZpbmUgU1VSVkVZX1RPCQkoMTAwKQotI2RlZmluZSBSRUFVVEhfVE8JCSgzMDApIC8qIDUwKSAqLwotI2RlZmluZSBSRUFTU09DX1RPCQkoMzAwKSAvKiA1MCkgKi8KLS8qIGRlZmluZSBESVNDT05ORUNUX1RPCSgzMDAwKSAqLwotI2RlZmluZSBBRERCQV9UTwkJCSgyMDAwKQotCi0jZGVmaW5lIExJTktFRF9UTyAoMSkgLyogdW5pdDoyIHNlYywgMXgyPTIgc2VjICovCi0KLSNkZWZpbmUgUkVBVVRIX0xJTUlUCSg0KQotI2RlZmluZSBSRUFTU09DX0xJTUlUCSg0KQotI2RlZmluZSBSRUFEREJBX0xJTUlUCSgyKQotCi0jZGVmaW5lIFJPQU1JTkdfTElNSVQJOAotCi0jZGVmaW5lCURZTkFNSUNfRlVOQ19ESVNBQkxFCQkJKDB4MCkKLQotLyogID09PT09PSBlbnVtIG9kbV9hYmlsaXR5ID09PT09PT09ICovCi0vKiAgQkIgT0RNIHNlY3Rpb24gQklUIDAtMTUgKi8KLSNkZWZpbmUJRFlOQU1JQ19CQl9ESUcJCQkJQklUKDApCi0jZGVmaW5lCURZTkFNSUNfQkJfUkFfTUFTSwkJCUJJVCgxKQotI2RlZmluZQlEWU5BTUlDX0JCX0RZTkFNSUNfVFhQV1IJQklUKDIpCi0jZGVmaW5lCURZTkFNSUNfQkJfQkJfRkFfQ05UCQkJQklUKDMpCi0KLSNkZWZpbmUJCURZTkFNSUNfQkJfUlNTSV9NT05JVE9SCQlCSVQoNCkKLSNkZWZpbmUJCURZTkFNSUNfQkJfQ0NLX1BECQkJQklUKDUpCi0jZGVmaW5lCQlEWU5BTUlDX0JCX0FOVF9ESVYJCQlCSVQoNikKLSNkZWZpbmUJCURZTkFNSUNfQkJfUFdSX1NBVkUJCQlCSVQoNykKLSNkZWZpbmUJCURZTkFNSUNfQkJfUFdSX1RSQUlOCQkJQklUKDgpCi0jZGVmaW5lCQlEWU5BTUlDX0JCX1JBVEVfQURBUFRJVkUJCUJJVCg5KQotI2RlZmluZQkJRFlOQU1JQ19CQl9QQVRIX0RJVgkJCUJJVCgxMCkKLSNkZWZpbmUJCURZTkFNSUNfQkJfUFNECQkJCUJJVCgxMSkKLQotLyogIE1BQyBETSBzZWN0aW9uIEJJVCAxNi0yMyAqLwotI2RlZmluZQkJRFlOQU1JQ19NQUNfc3RydWN0IGVkY2FfdHVyYm9VUkJPCQlCSVQoMTYpCi0jZGVmaW5lCQlEWU5BTUlDX01BQ19FQVJMWV9NT0RFCQlCSVQoMTcpCi0KLS8qICBSRiBPRE0gc2VjdGlvbiBCSVQgMjQtMzEgKi8KLSNkZWZpbmUJCURZTkFNSUNfUkZfVFhfUFdSX1RSQUNLCQlCSVQoMjQpCi0jZGVmaW5lCQlEWU5BTUlDX1JGX1JYX0dBSU5fVFJBQ0sJCUJJVCgyNSkKLSNkZWZpbmUJCURZTkFNSUNfUkZfQ0FMSUJSQVRJT04JCUJJVCgyNikKLQotI2RlZmluZQkJRFlOQU1JQ19BTExfRlVOQ19FTkFCTEUJCTB4RkZGRkZGRgotCi0jZGVmaW5lIF9IV19TVEFURV9OT0xJTktfCQkweDAwCi0jZGVmaW5lIF9IV19TVEFURV9BREhPQ18JCTB4MDEKLSNkZWZpbmUgX0hXX1NUQVRFX1NUQVRJT05fCTB4MDIKLSNkZWZpbmUgX0hXX1NUQVRFX0FQXwkJCTB4MDMKLQotCi0jZGVmaW5lCQlfMU1fUkFURV8JMAotI2RlZmluZQkJXzJNX1JBVEVfCTEKLSNkZWZpbmUJCV81TV9SQVRFXwkyCi0jZGVmaW5lCQlfMTFNX1JBVEVfCTMKLSNkZWZpbmUJCV82TV9SQVRFXwk0Ci0jZGVmaW5lCQlfOU1fUkFURV8JNQotI2RlZmluZQkJXzEyTV9SQVRFXwk2Ci0jZGVmaW5lCQlfMThNX1JBVEVfCTcKLSNkZWZpbmUJCV8yNE1fUkFURV8JOAotI2RlZmluZQkJXzM2TV9SQVRFXwk5Ci0jZGVmaW5lCQlfNDhNX1JBVEVfCTEwCi0jZGVmaW5lCQlfNTRNX1JBVEVfCTExCi0KLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgV01NX09VSTIzQVtdOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgV1BTX09VSTIzQVtdOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgV0ZEX09VSTIzQVtdOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgUDJQX09VSTIzQVtdOwotCi1leHRlcm4gdW5zaWduZWQgY2hhciBXTU1fSU5GT19PVUkyM0FbXTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIFdNTV9QQVJBX09VSTIzQVtdOwotCi0KLS8qICAqLwotLyogIENoYW5uZWwgUGxhbiBUeXBlLiAqLwotLyogIE5vdGU6ICovCi0vKglXZSBqdXN0IGFkZCBuZXcgY2hhbm5lbCBwbGFuIHdoZW4gdGhlIG5ldyBjaGFubmVsIHBsYW4gaXMgZGlmZmVyZW50IGZyb20gYW55IG9mIHRoZSBmb2xsb3dpbmcgKi8KLS8qCWNoYW5uZWwgcGxhbi4gKi8KLS8qCUlmIHlvdSBqdXN0IHdhbnQgdG8gY3VzdG9taXplIHRoZSBhY3Rpb25zKHNjYW4gcGVyaW9kIG9yIGpvaW4gYWN0aW9ucykgYWJvdXQgb25lIG9mIHRoZSBjaGFubmVsIHBsYW4sICovCi0vKgljdXN0b21pemUgdGhlbSBpbiBzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvIGluIHRoZSBSVF9DSEFOTkVMX0xJU1QuICovCi0vKiAgKi8KLWVudW0gIHsgLyogX1JUX0NIQU5ORUxfRE9NQUlOICovCi0JLyogIG9sZCBjaGFubmVsIHBsYW4gbWFwcGluZyA9PT09PSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOX0ZDQyA9IDB4MDAsCi0JUlRfQ0hBTk5FTF9ET01BSU5fSUMgPSAweDAxLAotCVJUX0NIQU5ORUxfRE9NQUlOX0VUU0kgPSAweDAyLAotCVJUX0NIQU5ORUxfRE9NQUlOX1NQQUlOID0gMHgwMywKLQlSVF9DSEFOTkVMX0RPTUFJTl9GUkFOQ0UgPSAweDA0LAotCVJUX0NIQU5ORUxfRE9NQUlOX01LSyA9IDB4MDUsCi0JUlRfQ0hBTk5FTF9ET01BSU5fTUtLMSA9IDB4MDYsCi0JUlRfQ0hBTk5FTF9ET01BSU5fSVNSQUVMID0gMHgwNywKLQlSVF9DSEFOTkVMX0RPTUFJTl9URUxFQyA9IDB4MDgsCi0JUlRfQ0hBTk5FTF9ET01BSU5fR0xPQkFMX0RPQU1JTiA9IDB4MDksCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV8xMyA9IDB4MEEsCi0JUlRfQ0hBTk5FTF9ET01BSU5fVEFJV0FOID0gMHgwQiwKLQlSVF9DSEFOTkVMX0RPTUFJTl9DSElOQSA9IDB4MEMsCi0JUlRfQ0hBTk5FTF9ET01BSU5fU0lOR0FQT1JFX0lORElBX01FWElDTyA9IDB4MEQsCi0JUlRfQ0hBTk5FTF9ET01BSU5fS09SRUEgPSAweDBFLAotCVJUX0NIQU5ORUxfRE9NQUlOX1RVUktFWSA9IDB4MEYsCi0JUlRfQ0hBTk5FTF9ET01BSU5fSkFQQU4gPSAweDEwLAotCVJUX0NIQU5ORUxfRE9NQUlOX0ZDQ19OT19ERlMgPSAweDExLAotCVJUX0NIQU5ORUxfRE9NQUlOX0pBUEFOX05PX0RGUyA9IDB4MTIsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV81RyA9IDB4MTMsCi0JUlRfQ0hBTk5FTF9ET01BSU5fVEFJV0FOX05PX0RGUyA9IDB4MTQsCi0KLQkvKiAgbmV3IGNoYW5uZWwgcGxhbiBtYXBwaW5nLCAoMkdET01BSU5fNUdET01BSU4pID09PT09ICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfTlVMTCA9IDB4MjAsCi0JUlRfQ0hBTk5FTF9ET01BSU5fRVRTSTFfTlVMTCA9IDB4MjEsCi0JUlRfQ0hBTk5FTF9ET01BSU5fRkNDMV9OVUxMID0gMHgyMiwKLQlSVF9DSEFOTkVMX0RPTUFJTl9NS0sxX05VTEwgPSAweDIzLAotCVJUX0NIQU5ORUxfRE9NQUlOX0VUU0kyX05VTEwgPSAweDI0LAotCVJUX0NIQU5ORUxfRE9NQUlOX0ZDQzFfRkNDMSA9IDB4MjUsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRVRTSTEgPSAweDI2LAotCVJUX0NIQU5ORUxfRE9NQUlOX01LSzFfTUtLMSA9IDB4MjcsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfS0NDMSA9IDB4MjgsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRkNDMiA9IDB4MjksCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRkNDMyA9IDB4MzAsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRkNDNCA9IDB4MzEsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRkNDNSA9IDB4MzIsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRkNDNiA9IDB4MzMsCi0JUlRfQ0hBTk5FTF9ET01BSU5fRkNDMV9GQ0M3ID0gMHgzNCwKLQlSVF9DSEFOTkVMX0RPTUFJTl9XT1JMRF9FVFNJMiA9IDB4MzUsCi0JUlRfQ0hBTk5FTF9ET01BSU5fV09STERfRVRTSTMgPSAweDM2LAotCVJUX0NIQU5ORUxfRE9NQUlOX01LSzFfTUtLMiA9IDB4MzcsCi0JUlRfQ0hBTk5FTF9ET01BSU5fTUtLMV9NS0szID0gMHgzOCwKLQlSVF9DSEFOTkVMX0RPTUFJTl9GQ0MxX05DQzEgPSAweDM5LAotCVJUX0NIQU5ORUxfRE9NQUlOX0ZDQzFfTkNDMiA9IDB4NDAsCi0JUlRfQ0hBTk5FTF9ET01BSU5fR0xPQkFMX0RPQU1JTl8yRyA9IDB4NDEsCi0JLyogIEFkZCBuZXcgY2hhbm5lbCBwbGFuIGFib3ZlIHRoaXMgbGluZT09PT09PT09PT09PT09PSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOX01BWCwKLQlSVF9DSEFOTkVMX0RPTUFJTl9SRUFMVEVLX0RFRklORSA9IDB4N0YsCi19OwotCi1lbnVtIHsgLyogX1JUX0NIQU5ORUxfRE9NQUlOXzJHICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fMkdfV09STEQgPSAweDAwLAkJLyogV29ybGR3aXJkIDEzICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fMkdfRVRTSTEgPSAweDAxLAkJLyogRXVyb3BlICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fMkdfRkNDMSA9IDB4MDIsCQkvKiBVUyAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzJHX01LSzEgPSAweDAzLAkJLyogSmFwYW4gKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl8yR19FVFNJMiA9IDB4MDQsCQkvKiBGcmFuY2UgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl8yR19OVUxMID0gMHgwNSwKLQkvKiAgQWRkIG5ldyBjaGFubmVsIHBsYW4gYWJvdmUgdGhpcyBsaW5lPT09PT09PT09PT09PT09ICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fMkdfTUFYLAotfTsKLQotZW51bSB7IC8qIF9SVF9DSEFOTkVMX0RPTUFJTl81RyAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX05VTEwgPSAweDAwLAotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0VUU0kxID0gMHgwMSwJCS8qIEV1cm9wZSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0VUU0kyID0gMHgwMiwJCS8qIEF1c3RyYWxpYSwgTmV3IFplYWxhbmQgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19FVFNJMyA9IDB4MDMsCQkvKiBSdXNzaWEgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19GQ0MxID0gMHgwNCwJCS8qIFVTICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDMiA9IDB4MDUsCQkvKiBGQ0Mgby93IERGUyBDaGFubmVscyAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzMgPSAweDA2LAkJLyogSW5kaWEsIE1leGljbyAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzQgPSAweDA3LAkJLyogVmVuZXp1ZWxhICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDNSA9IDB4MDgsCQkvKiBDaGluYSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzYgPSAweDA5LAkJLyogSXNyYWVsICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDN19JQzEgPSAweDBBLAkvKiBVUywgQ2FuYWRhICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfS0NDMSA9IDB4MEIsCQkvKiBLb3JlYSAqLwotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX01LSzEgPSAweDBDLAkJLyogSmFwYW4gKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19NS0syID0gMHgwRCwJCS8qIEphcGFuIChXNTIsIFc1MykgKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19NS0szID0gMHgwRSwJCS8qIEphcGFuIChXNTYpICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfTkNDMSA9IDB4MEYsCQkvKiBUYWl3YW4gKi8KLQlSVF9DSEFOTkVMX0RPTUFJTl81R19OQ0MyID0gMHgxMCwJCS8qIFRhaXdhbiBvL3cgREZTICovCi0JLyogIEFkZCBuZXcgY2hhbm5lbCBwbGFuIGFib3ZlIHRoaXMgbGluZT09PT09PT09PT09PT09PSAqLwotCS8qICBEcml2ZXIgU2VsZiBEZWZpbmVkID09PT09ICovCi0JUlRfQ0hBTk5FTF9ET01BSU5fNUdfRkNDID0gMHgxMSwKLQlSVF9DSEFOTkVMX0RPTUFJTl81R19KQVBBTl9OT19ERlMgPSAweDEyLAotCVJUX0NIQU5ORUxfRE9NQUlOXzVHX0ZDQzRfTk9fREZTID0gMHgxMywKLQlSVF9DSEFOTkVMX0RPTUFJTl81R19NQVgsCi19OwotCi0jZGVmaW5lIHJ0d19pc19jaGFubmVsX3BsYW5fdmFsaWQoY2hwbGFuKSAoY2hwbGFuPFJUX0NIQU5ORUxfRE9NQUlOX01BWCB8fCBjaHBsYW4gPT0gUlRfQ0hBTk5FTF9ET01BSU5fUkVBTFRFS19ERUZJTkUpCi0KLXN0cnVjdCBydF9jaGFubmVsX3BsYW4gewotCXVuc2lnbmVkIGNoYXIJQ2hhbm5lbFtNQVhfQ0hBTk5FTF9OVU1dOwotCXVuc2lnbmVkIGNoYXIJTGVuOwotfTsKLQotc3RydWN0IHJ0X2NoYW5uZWxfcGxhbl8yZyB7Ci0JdW5zaWduZWQgY2hhcglDaGFubmVsW01BWF9DSEFOTkVMX05VTV8yR107Ci0JdW5zaWduZWQgY2hhcglMZW47Ci19OwotCi1zdHJ1Y3QgcnRfY2hhbm5lbF9wbGFuXzVnIHsKLQl1bnNpZ25lZCBjaGFyCUNoYW5uZWxbTUFYX0NIQU5ORUxfTlVNXzVHXTsKLQl1bnNpZ25lZCBjaGFyCUxlbjsKLX07Ci0KLXN0cnVjdCBydF9jaGFubmVsX3BsYW5fbWFwIHsKLQl1bnNpZ25lZCBjaGFyCUluZGV4Mkc7Ci0JdW5zaWduZWQgY2hhcglJbmRleDVHOwotfTsKLQotZW51bSBBc3NvY2lhdGVkX0FQIHsKLQlhdGhlcm9zQVAJPSAwLAotCWJyb2FkY29tQVAJPSAxLAotCWNpc2NvQVAJCT0gMiwKLQltYXJ2ZWxsQVAJPSAzLAotCXJhbGlua0FQCT0gNCwKLQlyZWFsdGVrQVAJPSA1LAotCWFpcmdvY2FwQVAJPSA2LAotCXVua25vd25BUAk9IDcsCi0JbWF4QVAsCi19OwotCi1lbnVtIHsgLyogSFRfSU9UX1BFRVJfRSAqLwotCUhUX0lPVF9QRUVSX1VOS05PV04JCT0gMCwKLQlIVF9JT1RfUEVFUl9SRUFMVEVLCQk9IDEsCi0JSFRfSU9UX1BFRVJfUkVBTFRFS185MlNFCT0gMiwKLQlIVF9JT1RfUEVFUl9CUk9BRENPTQkJPSAzLAotCUhUX0lPVF9QRUVSX1JBTElOSwkJPSA0LAotCUhUX0lPVF9QRUVSX0FUSEVST1MJCT0gNSwKLQlIVF9JT1RfUEVFUl9DSVNDTwkJPSA2LAotCUhUX0lPVF9QRUVSX01FUlUJCT0gNywKLQlIVF9JT1RfUEVFUl9NQVJWRUxMCQk9IDgsCi0JSFRfSU9UX1BFRVJfUkVBTFRFS19TT0ZUQVAJPSA5LC8qICBwZWVyIGlzIFJlYWxUZWsgU09GVF9BUCwgYnkgQm9obiwgMjAwOS4xMi4xNyAqLwotCUhUX0lPVF9QRUVSX1NFTEZfU09GVEFQCQk9IDEwLCAvKiAgU2VsZiBpcyBTb2Z0QVAgKi8KLQlIVF9JT1RfUEVFUl9BSVJHTwkJPSAxMSwKLQlIVF9JT1RfUEVFUl9JTlRFTAkJPSAxMiwKLQlIVF9JT1RfUEVFUl9SVEtfQVBDTElFTlQJPSAxMywKLQlIVF9JT1RfUEVFUl9SRUFMVEVLXzgxWFgJPSAxNCwKLQlIVF9JT1RfUEVFUl9SRUFMVEVLX1dPVwkJPSAxNSwKLQlIVF9JT1RfUEVFUl9URU5EQQkJPSAxNiwKLQlIVF9JT1RfUEVFUl9NQVgJCQk9IDE3Ci19OwotCi1lbnVtIFNDQU5fU1RBVEUgewotCVNDQU5fRElTQUJMRSA9IDAsCi0JU0NBTl9TVEFSVCA9IDEsCi0JU0NBTl9UWE5VTEwgPSAyLAotCVNDQU5fUFJPQ0VTUyA9IDMsCi0JU0NBTl9DT01QTEVURSA9IDQsCi0JU0NBTl9TVEFURV9NQVgsCi19OwotCi1zdHJ1Y3QgbWxtZV9oYW5kbGVyIHsKLQljaGFyICpzdHI7Ci0JaW50ICgqZnVuYykoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLX07Ci0KLXN0cnVjdCBhY3Rpb25faGFuZGxlciB7Ci0JdW5zaWduZWQgaW50ICAgbnVtOwotCWNoYXIgKnN0cjsKLQlpbnQgKCpmdW5jKShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotfTsKLQotc3RydWN0CXNzX3JlcyB7Ci0JaW50CXN0YXRlOwotCWludAlic3NfY250OwotCWludAljaGFubmVsX2lkeDsKLQlpbnQJc2Nhbl9tb2RlOwotCXU4IHNzaWRfbnVtOwotCXU4IGNoX251bTsKLQlzdHJ1Y3QgY2ZnODAyMTFfc3NpZCBzc2lkW1JUV19TU0lEX1NDQU5fQU1PVU5UXTsKLQlzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsIGNoW1JUV19DSEFOTkVMX1NDQU5fQU1PVU5UXTsKLX07Ci0KLSNkZWZpbmUJV0lGSV9GV19BVVRIX05VTEwJCQkweDAwMDAwMTAwCi0jZGVmaW5lCVdJRklfRldfQVVUSF9TVEFURQkJCTB4MDAwMDAyMDAKLSNkZWZpbmUJV0lGSV9GV19BVVRIX1NVQ0NFU1MJCQkweDAwMDAwNDAwCi0KLSNkZWZpbmUJV0lGSV9GV19BU1NPQ19TVEFURQkJCTB4MDAwMDIwMDAKLSNkZWZpbmUJV0lGSV9GV19BU1NPQ19TVUNDRVNTCQkweDAwMDA0MDAwCi0KLSNkZWZpbmUJV0lGSV9GV19MSU5LSU5HX1NUQVRFCQkoV0lGSV9GV19BVVRIX05VTEwgfCBXSUZJX0ZXX0FVVEhfU1RBVEUgfCBXSUZJX0ZXX0FVVEhfU1VDQ0VTUyB8V0lGSV9GV19BU1NPQ19TVEFURSkKLQotc3RydWN0IEZXX1N0YV9JbmZvIHsKLQlzdHJ1Y3Qgc3RhX2luZm8JKnBzdGE7Ci0JdTMyCXN0YXR1czsKLQl1MzIJcnhfcGt0OwotCXUzMglyZXRyeTsKLQl1bnNpZ25lZCBjaGFyIFN1cHBvcnRlZFJhdGVzW05ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWF07Ci19OwotCi0vKgotICogVXNhZ2U6Ci0gKiBXaGVuIG9uZSBpZmFjZSBhY3RlZCBhcyBBUCBtb2RlIGFuZCB0aGUgb3RoZXIgaWZhY2UgaXMgU1RBIG1vZGUgYW5kIHNjYW5uaW5nLAotICogaXQgc2hvdWxkIHN3aXRjaCBiYWNrIHRvIEFQJ3Mgb3BlcmF0aW5nIGNoYW5uZWwgcGVyaW9kaWNhbGx5LgotICogUGFyYW1ldGVycyBpbmZvOgotICogV2hlbiB0aGUgZHJpdmVyIHNjYW5uZWQgUlRXX1NDQU5fTlVNX09GX0NIIGNoYW5uZWxzLCBpdCB3b3VsZCBzd2l0Y2ggYmFjayB0byBBUCdzIG9wZXJhdGluZyBjaGFubmVsIGZvcgotICogUlRXX1NUQVlfQVBfQ0hfTUlMTElTRUNPTkQgKiBTVVJWRVlfVE8gbWlsbGlzZWNvbmRzLgotICogRXhhbXBsZToKLSAqIEZvciBjaGlwIHN1cHBvcnRzIDIuNEcgKyA1R0h6IGFuZCBBUCBtb2RlIGlzIG9wZXJhdGluZyBpbiBjaGFubmVsIDEsCi0gKiBSVFdfU0NBTl9OVU1fT0ZfQ0ggaXMgOCwgUlRXX1NUQVlfQVBfQ0hfTUlMTElTRUNPTkQgaXMgMyBhbmQgU1VSVkVZX1RPIGlzIDEwMC4KLSAqIFdoZW4gaXQncyBTVEEgbW9kZSBnZXRzIHNldF9zY2FuIGNvbW1hbmQsCi0gKiBpdCB3b3VsZAotICogMS4gRG9pbmcgdGhlIHNjYW4gb24gY2hhbm5lbCAxLjIuMy40LjUuNi43LjgKLSAqIDIuIEJhY2sgdG8gY2hhbm5lbCAxIGZvciAzMDAgbWlsbGlzZWNvbmRzCi0gKiAzLiBHbyB0aHJvdWdoIGRvaW5nIHNpdGUgc3VydmV5IG9uIGNoYW5uZWwgOS4xMC4xMS4zNi40MC40NC40OC41MgotICogNC4gQmFjayB0byBjaGFubmVsIDEgZm9yIDMwMCBtaWxsaXNlY29uZHMKLSAqIDUuIC4uLiBhbmQgc28gb24sIHRpbGwgc3VydmV5IGRvbmUuCi0gKi8KLQotc3RydWN0IG1sbWVfZXh0X2luZm8gewotCXUzMglzdGF0ZTsKLQl1MzIJcmVhdXRoX2NvdW50OwotCXUzMglyZWFzc29jX2NvdW50OwotCXUzMglsaW5rX2NvdW50OwotCXUzMglhdXRoX3NlcTsKLQl1MzIJYXV0aF9hbGdvOwkvKiAgODAyLjExIGF1dGgsIGNvdWxkIGJlIG9wZW4sIHNoYXJlZCwgYXV0byAqLwotCXUzMglhdXRoTW9kZVRvZ2dsZTsKLQl1MzIJZW5jX2FsZ287LyogZW5jcnlwdCBhbGdvcml0aG07ICovCi0JdTMyCWtleV9pbmRleDsJLyogIHRoaXMgaXMgb25seSB2YWxpZCBmb3IgbGVnZW5kYXJ5IHdlcCwgMH4zIGZvciBrZXkgaWQuICovCi0JdTMyCWl2OwotCXU4CWNoZ190eHRbMTI4XTsKLQl1MTYJYWlkOwotCXUxNgliY25faW50ZXJ2YWw7Ci0JdTE2CWNhcGFiaWxpdHk7Ci0JdTgJYXNzb2NfQVBfdmVuZG9yOwotCXU4CXNsb3RUaW1lOwotCXU4CXByZWFtYmxlX21vZGU7Ci0JdTgJV01NX2VuYWJsZTsKLQl1OAlFUlBfZW5hYmxlOwotCXU4CUVSUF9JRTsKLQl1OAlIVF9lbmFibGU7Ci0JdTgJSFRfY2Fwc19lbmFibGU7Ci0JdTgJSFRfaW5mb19lbmFibGU7Ci0JdTgJSFRfcHJvdGVjdGlvbjsKLQl1OAl0dXJib01vZGVfY3RzMnNlbGY7Ci0JdTgJdHVyYm9Nb2RlX3J0c2VuOwotCXU4CVNNX1BTOwotCXU4CUFEREJBX3JldHJ5X2NvdW50OwotCXU4CWRpYWxvZ1Rva2VuOwotCS8qICBBY2NlcHQgQUREQkEgUmVxdWVzdCAqLwotCWJvb2wgYkFjY2VwdEFkZGJhUmVxOwotCXU4CWJ3bW9kZV91cGRhdGVkOwotCXU4CWhpZGRlbl9zc2lkX21vZGU7Ci0KLQlzdHJ1Y3QgQUREQkFfcmVxdWVzdAkJQUREQkFfcmVxOwotCXN0cnVjdCBXTU1fcGFyYV9lbGVtZW50CVdNTV9wYXJhbTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXA7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gSFRfaW5mbzsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leAkJCW5ldHdvcms7Lyogam9pbiBuZXR3b3JrIG9yIGJzc19uZXR3b3JrLCBpZiBpbiBhcCBtb2RlLCBpdCBpcyB0aGUgc2FtZSB0byBjdXJfbmV0d29yay5uZXR3b3JrICovCi0Jc3RydWN0IEZXX1N0YV9JbmZvCQlGV19zdGFfaW5mb1tOVU1fU1RBXTsKLX07Ci0KLS8qICBUaGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNoYW5uZWwgaW5jbHVkaW5nIGpvaW5pbmcsIHNjYW5uaW5nLCBhbmQgcG93ZXIgY29uc3RyYWludHMuICovCi1zdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvIHsKLQl1OAkJQ2hhbm5lbE51bTsJCS8qICBUaGUgY2hhbm5lbCBudW1iZXIuICovCi0JZW51bSBydF9zY2FuX3R5cGUgU2NhblR5cGU7CQkvKiAgU2NhbiB0eXBlIHN1Y2ggYXMgcGFzc2l2ZSBvciBhY3RpdmUgc2Nhbi4gKi8KLX07Ci0KLWludCBydHdfY2hfc2V0X3NlYXJjaF9jaDIzYShzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvICpjaF9zZXQsIGNvbnN0IHUzMiBjaCk7Ci0KLS8qICBQMlBfTUFYX1JFR19DTEFTU0VTIC0gTWF4aW11bSBudW1iZXIgb2YgcmVndWxhdG9yeSBjbGFzc2VzICovCi0jZGVmaW5lIFAyUF9NQVhfUkVHX0NMQVNTRVMgMTAKLQotLyogIFAyUF9NQVhfUkVHX0NMQVNTX0NIQU5ORUxTIC0gTWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgcGVyIHJlZ3VsYXRvcnkgY2xhc3MgKi8KLSNkZWZpbmUgUDJQX01BWF9SRUdfQ0xBU1NfQ0hBTk5FTFMgMjAKLQotLyogICBzdHJ1Y3QgcDJwX2NoYW5uZWxzIC0gTGlzdCBvZiBzdXBwb3J0ZWQgY2hhbm5lbHMgKi8KLXN0cnVjdCBwMnBfY2hhbm5lbHMgewotCS8qICBzdHJ1Y3QgcDJwX3JlZ19jbGFzcyAtIFN1cHBvcnRlZCByZWd1bGF0b3J5IGNsYXNzICovCi0Jc3RydWN0IHAycF9yZWdfY2xhc3MgewotCQkvKiAgcmVnX2NsYXNzIC0gUmVndWxhdG9yeSBjbGFzcyAoSUVFRSA4MDIuMTEtMjAwNywgQW5uZXggSikgKi8KLQkJdTggcmVnX2NsYXNzOwotCi0JCS8qICBjaGFubmVsIC0gU3VwcG9ydGVkIGNoYW5uZWxzICovCi0JCXU4IGNoYW5uZWxbUDJQX01BWF9SRUdfQ0xBU1NfQ0hBTk5FTFNdOwotCi0JCS8qICBjaGFubmVscyAtIE51bWJlciBvZiBjaGFubmVsIGVudHJpZXMgaW4gdXNlICovCi0JCXNpemVfdCBjaGFubmVsczsKLQl9IHJlZ19jbGFzc1tQMlBfTUFYX1JFR19DTEFTU0VTXTsKLQotCS8qICByZWdfY2xhc3NlcyAtIE51bWJlciBvZiByZWdfY2xhc3MgZW50cmllcyBpbiB1c2UgKi8KLQlzaXplX3QgcmVnX2NsYXNzZXM7Ci19OwotCi1zdHJ1Y3QgcDJwX29wZXJfY2xhc3NfbWFwIHsKLQllbnVtIGh3X21vZGUge0lFRUU4MDIxMUcsIElFRUU4MDIxMUF9IG1vZGU7Ci0JdTggb3BfY2xhc3M7Ci0JdTggbWluX2NoYW47Ci0JdTggbWF4X2NoYW47Ci0JdTggaW5jOwotCWVudW0gewotCQlCVzIwLCBCVzQwUExVUywgQlc0ME1JTlVTCi0JfSBidzsKLX07Ci0KLXN0cnVjdCBtbG1lX2V4dF9wcml2IHsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIJKnBhZGFwdGVyOwotCXU4CW1sbWVleHRfaW5pdDsKLQlhdG9taWNfdAkJZXZlbnRfc2VxOwotCXUxNgltZ250X3NlcTsKLQotCS8qIHN0cnVjdCBmd19wcml2CWZ3cHJpdjsgKi8KLQotCXVuc2lnbmVkIGNoYXIJY3VyX2NoYW5uZWw7Ci0JdW5zaWduZWQgY2hhcgljdXJfYndtb2RlOwotCXVuc2lnbmVkIGNoYXIJY3VyX2NoX29mZnNldDsvKiBQUklNRV9DSE5MX09GRlNFVCAqLwotCXVuc2lnbmVkIGNoYXIJY3VyX3dpcmVsZXNzX21vZGU7CS8qICBORVRXT1JLX1RZUEUgKi8KLQotCXVuc2lnbmVkIGNoYXIJbWF4X2NoYW5fbnVtczsKLQlzdHJ1Y3QgcnRfY2hhbm5lbF9pbmZvCQljaGFubmVsX3NldFtNQVhfQ0hBTk5FTF9OVU1dOwotCXN0cnVjdCBwMnBfY2hhbm5lbHMgY2hhbm5lbF9saXN0OwotCXVuc2lnbmVkIGNoYXIJYmFzaWNyYXRlW051bVJhdGVzXTsKLQl1bnNpZ25lZCBjaGFyCWRhdGFyYXRlW051bVJhdGVzXTsKLQotCXN0cnVjdCBzc19yZXMJCXNpdGVzdXJ2ZXlfcmVzOwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvCW1sbWV4dF9pbmZvOy8qIGZvciBzdGEvYWRob2MgbW9kZSwgaW5jbHVkaW5nIGN1cnJlbnQgc2Nhbm5pbmcvY29ubmVjdGluZy9jb25uZWN0ZWQgcmVsYXRlZCBpbmZvLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgYXAgbW9kZSwgbmV0d29yayBpbmNsdWRlcyBhcCdzIGNhcF9pbmZvICovCi0Jc3RydWN0IHRpbWVyX2xpc3QJCXN1cnZleV90aW1lcjsKLQlzdHJ1Y3QgdGltZXJfbGlzdAkJbGlua190aW1lcjsKLQl1MTYJCQljaGFuX3NjYW5fdGltZTsKLQotCXU4CXNjYW5fYWJvcnQ7Ci0JdTgJdHhfcmF0ZTsgLyogIFRYUkFURSB3aGVuIFVTRVJBVEUgaXMgc2V0LiAqLwotCi0JdTMyCXJldHJ5OyAvKiByZXRyeSBmb3IgaXNzdWUgcHJvYmVyZXEgKi8KLQotCXU2NCBUU0ZWYWx1ZTsKLQotCXVuc2lnbmVkIGNoYXIgYnN0YXJ0X2JzczsKLQl1OCB1cGRhdGVfY2hhbm5lbF9wbGFuX2J5X2FwX2RvbmU7Ci0JLyogcmVjdl9kZWNhY2hlIGNoZWNrIGZvciBBY3Rpb25fcHVibGljIGZyYW1lICovCi0JdTggYWN0aW9uX3B1YmxpY19kaWFsb2dfdG9rZW47Ci0JdTE2CSBhY3Rpb25fcHVibGljX3J4c2VxOwotCXU4IGFjdGl2ZV9rZWVwX2FsaXZlX2NoZWNrOwotfTsKLQotaW50IGluaXRfbWxtZV9leHRfcHJpdjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBpbml0X2h3X21sbWVfZXh0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBmcmVlX21sbWVfZXh0X3ByaXYyM2EgKHN0cnVjdCBtbG1lX2V4dF9wcml2ICpwbWxtZWV4dCk7Ci12b2lkIGluaXRfbWxtZV9leHRfdGltZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIGluaXRfYWRkYmFfcmV0cnlfdGltZXIyM2Eoc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLXN0cnVjdCB4bWl0X2ZyYW1lICphbGxvY19tZ3R4bWl0ZnJhbWUyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KTsKLQotdW5zaWduZWQgY2hhciBuZXR3b3JrdHlwZV90b19yYWlkMjNhKHVuc2lnbmVkIGNoYXIgbmV0d29ya190eXBlKTsKLXU4IGp1ZGdlX25ldHdvcmtfdHlwZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpyYXRlLAotCQkgICAgICBpbnQgcmF0ZWxlbik7Ci12b2lkIGdldF9yYXRlX3NldDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpwYnNzcmF0ZSwKLQkJICBpbnQgKmJzc3JhdGVfbGVuKTsKLXZvaWQgVXBkYXRlQnJhdGVUYmwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKm1CcmF0ZXNPUyk7Ci12b2lkIFVwZGF0ZTIzYVRibEZvclNvZnRBUCh1OCAqYnNzcmF0ZXNldCwgdTMyIGJzc3JhdGVsZW4pOwotCi11OCBydHdfZ2V0X29wZXJfY2gyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgcnR3X3NldF9vcGVyX2NoMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciwgdTggY2gpOwotdm9pZCBydHdfc2V0X29wZXJfYncyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCB1OCBidyk7Ci12b2lkIHJ0d19zZXRfb3Blcl9jaDIzYW9mZnNldDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IG9mZnNldCk7Ci0KLXZvaWQgc2V0X2NoYW5uZWxfYndtb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgY2hhbm5lbCwKLQkJCXVuc2lnbmVkIGNoYXIgY2hhbm5lbF9vZmZzZXQsIHVuc2lnbmVkIHNob3J0IGJ3bW9kZSk7Ci12b2lkIFNlbGVjdENoYW5uZWwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciBjaGFubmVsKTsKLQotdW5zaWduZWQgaW50IGRlY2lkZV93YWl0X2Zvcl9iZWFjb25fdGltZW91dDIzYSh1bnNpZ25lZCBpbnQgYmNuX2ludGVydmFsKTsKLQotdm9pZCBjbGVhcl9jYW1fZW50cnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggZW50cnkpOwotCi12b2lkIGludmFsaWRhdGVfY2FtX2FsbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotaW50IGFsbG9jYXRlX2Z3X3N0YV9lbnRyeTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgZmx1c2hfYWxsX2NhbV9lbnRyeTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotYm9vbCBJc0xlZ2FsNUdDaGFubmVsKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciwgdTggY2hhbm5lbCk7Ci0KLXZvaWQgdXBkYXRlX25ldHdvcmsyM2Eoc3RydWN0IHdsYW5fYnNzaWRfZXggKmRzdCwgc3RydWN0IHdsYW5fYnNzaWRfZXggKnNyYywKLQkJICAgIHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGJvb2wgdXBkYXRlX2llKTsKLQotdTggKmdldF9teV9ic3NpZDIzYShzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcG5ldHdvcmspOwotCi1ib29sIGlzX2NsaWVudF9hc3NvY2lhdGVkX3RvX2FwMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBpc19jbGllbnRfYXNzb2NpYXRlZF90b19pYnNzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotYm9vbCBpc19JQlNTX2VtcHR5MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi11bnNpZ25lZCBjaGFyIGNoZWNrX2Fzc29jX0FQMjNhKHU4ICpwZnJhbWUsIHVpbnQgbGVuKTsKLQotaW50IFdNTV9wYXJhbV9oYW5kbGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwKTsKLXZvaWQgV01NT25Bc3NvY1JzcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotdm9pZCBIVF9jYXBzX2hhbmRsZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnApOwotdm9pZCBIVF9pbmZvX2hhbmRsZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnApOwotdm9pZCBIVE9uQXNzb2NSc3AyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgRVJQX0lFX2hhbmRsZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnApOwotdm9pZCBWQ1NfdXBkYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci0KLXZvaWQgdXBkYXRlX2JlYWNvbjIzYV9pbmZvKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHVpbnQgbGVuLAotCQkJICAgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLWludCBydHdfY2hlY2tfYmNuX2luZm8yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyLAotCQkJICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHUzMiBwYWNrZXRfbGVuKTsKLXZvaWQgdXBkYXRlX0lPVF9pbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCB1cGRhdGVfY2FwaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIsIHUxNiB1cGRhdGVDYXApOwotdm9pZCB1cGRhdGVfd2lyZWxlc3NfbW9kZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgdXBkYXRlX3R4X2Jhc2ljX3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbW9kdWxhdGlvbik7Ci12b2lkIHVwZGF0ZV9ibWNfc3RhX3N1cHBvcnRfcmF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbWFjX2lkKTsKLWludCB1cGRhdGVfc3RhX3N1cHBvcnRfcmF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcHZhcl9pZSwKLQkJCSAgICB1aW50IHZhcl9pZV9sZW4sIGludCBjYW1faWR4KTsKLQotLyogZm9yIHN0YS9hZGhvYyBtb2RlICovCi12b2lkIHVwZGF0ZV9zdGFfaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotdW5zaWduZWQgaW50IHVwZGF0ZV9iYXNpY19yYXRlMjNhKHVuc2lnbmVkIGNoYXIgKnB0biwgdW5zaWduZWQgaW50IHB0bl9zeik7Ci11bnNpZ25lZCBpbnQgdXBkYXRlX3N1cHBvcnRlZF9yYXRlMjNhKHVuc2lnbmVkIGNoYXIgKnB0biwgdW5zaWduZWQgaW50IHB0bl9zeik7Ci11bnNpZ25lZCBpbnQgdXBkYXRlX01TQ19yYXRlMjNhKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXApOwotdm9pZCBVcGRhdGVfUkFfRW50cnkyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLXZvaWQgc2V0X3N0YV9yYXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci0KLWludCByZWNlaXZlX2Rpc2Nvbm5lY3QyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgdW5zaWduZWQgY2hhciAqTWFjQWRkciwgdW5zaWduZWQgc2hvcnQgcmVhc29uKTsKLQotdW5zaWduZWQgY2hhciBnZXRfaGlnaGVzdF9yYXRlX2lkeDIzYSh1MzIgbWFzayk7Ci1pbnQgc3VwcG9ydF9zaG9ydF9HSTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcCk7Ci1ib29sIGlzX2FwX2luX3RraXAyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIGlzX2FwX2luX3dlcDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWJvb2wgc2hvdWxkX2ZvcmJpZF9uX3JhdGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcmVwb3J0X2pvaW5fcmVzMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGludCByZXMpOwotdm9pZCByZXBvcnRfc3VydmV5X2V2ZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2X2ZyYW1lKTsKLXZvaWQgcmVwb3J0X3N1cnZleWRvbmVfZXZlbnQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJlcG9ydF9kZWxfc3RhX2V2ZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuc2lnbmVkIGNoYXIgKk1hY0FkZHIsIHVuc2lnbmVkIHNob3J0IHJlYXNvbik7Ci12b2lkIHJlcG9ydF9hZGRfc3RhX2V2ZW50MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHVuc2lnbmVkIGNoYXIgKk1hY0FkZHIsIGludCBjYW1faWR4KTsKLQotaW50IHNldF90eF9iZWFjb25fY21kMjNhKHN0cnVjdCBydHdfYWRhcHRlcipwYWRhcHRlcik7Ci11bnNpZ25lZCBpbnQgc2V0dXBfYmVhY29uX2ZyYW1lKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJdW5zaWduZWQgY2hhciAqYmVhY29uX2ZyYW1lKTsKLXZvaWQgdXBkYXRlX21nbnRfdHhfcmF0ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCByYXRlKTsKLXZvaWQgdXBkYXRlX21nbnRmcmFtZV9hdHRyaWIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIpOwotdm9pZCBkdW1wX21nbnRmcmFtZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUpOwotczMyIGR1bXBfbWdudGZyYW1lMjNhX2FuZF93YWl0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWUsIGludCB0aW1lb3V0X21zKTsKLXMzMiBkdW1wX21nbnRmcmFtZTIzYV9hbmRfd2FpdF9hY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcG1nbnRmcmFtZSk7Ci0KLXZvaWQgaXNzdWVfYmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGludCB0aW1lb3V0X21zKTsKLWludCBpc3N1ZV9udWxsZGF0YTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyICpkYSwKLQkJICAgdW5zaWduZWQgaW50IHBvd2VyX21vZGUsIGludCB0cnlfY250LCBpbnQgd2FpdF9tcyk7Ci1pbnQgaXNzdWVfcW9zX251bGxkYXRhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKmRhLCB1MTYgdGlkLAotCQkgICAgICAgaW50IHRyeV9jbnQsIGludCB3YWl0X21zKTsKLWludCBpc3N1ZV9kZWF1dGgyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEsCi0JCSB1bnNpZ25lZCBzaG9ydCByZWFzb24pOwotdm9pZCBpc3N1ZV9hY3Rpb25fc3BjdF9jaF9zd2l0Y2gyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKnJhLAotCQkJCSB1OCBuZXdfY2gsIHU4IGNoX29mZnNldCk7Ci12b2lkIGlzc3VlX2FjdGlvbl9CQTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcmFkZHIsCi0JCQl1bnNpZ25lZCBjaGFyIGFjdGlvbiwgdW5zaWduZWQgc2hvcnQgc3RhdHVzKTsKLWludCBzZW5kX2RlbGJhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IGluaXRpYXRvciwgdTggKmFkZHIpOwotaW50IHNlbmRfYmVhY29uMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIG1sbWVleHRfam9pbmJzc19ldmVudF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBpbnQgam9pbl9yZXMpOwotdm9pZCBtbG1lZXh0X3N0YV9kZWxfZXZlbnRfY2FsbGJhY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIG1sbWVleHRfc3RhX2FkZF9ldmVudF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotCi12b2lkIGxpbmtlZF9zdGF0dXNfY2hrMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0jZGVmaW5lIHNldF9zdXJ2ZXlfdGltZXIobWxtZWV4dCwgbXMpIFwKLQkvKkRCR184NzIzQSgiJXMgc2V0X3N1cnZleV90aW1lciglcCwgJWQpXG4iLCBfX2Z1bmNfXywgKG1sbWVleHQpLCAobXMpKTsqLyBcCi0JbW9kX3RpbWVyKCZtbG1lZXh0LT5zdXJ2ZXlfdGltZXIsIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKG1zKSk7Ci0KLSNkZWZpbmUgc2V0X2xpbmtfdGltZXIobWxtZWV4dCwgbXMpIFwKLQkvKkRCR184NzIzQSgiJXMgc2V0X2xpbmtfdGltZXIoJXAsICVkKVxuIiwgX19mdW5jX18sIChtbG1lZXh0KSwgKG1zKSk7Ki8gXAotCW1vZF90aW1lcigmbWxtZWV4dC0+bGlua190aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMobXMpKTsKLQotaW50IGNja3JhdGVzX2luY2x1ZGVkMjNhKHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuKTsKLWludCBjY2tyYXRlc29ubHlfaW5jbHVkZWQyM2EodW5zaWduZWQgY2hhciAqcmF0ZSwgaW50IHJhdGVsZW4pOwotCi12b2lkIHByb2Nlc3NfYWRkYmFfcmVxMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYWRkYmFfcmVxLCB1OCAqYWRkcik7Ci0KLXZvaWQgY29ycmVjdF9UU0YyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0KTsKLQotc3RydWN0IGNtZF9oZGwgewotCXVpbnQJcGFybXNpemU7Ci0JaW50ICgqaDJjZnVucykoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotfTsKLQotCi1pbnQgcmVhZF9tYWNyZWdfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmKTsKLWludCB3cml0ZV9tYWNyZWdfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmKTsKLWludCByZWFkX2JicmVnX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGJ1Zik7Ci1pbnQgd3JpdGVfYmJyZWdfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmKTsKLWludCByZWFkX3JmcmVnX2hkbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqcGJ1Zik7Ci1pbnQgd3JpdGVfcmZyZWdfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpwYnVmKTsKLQotCi1pbnQgTlVMTF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IGpvaW5fY21kX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci1pbnQgZGlzY29ubmVjdF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IGNyZWF0ZWJzc19oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNldG9wbW9kZV9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNpdGVzdXJ2ZXlfY21kX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci1pbnQgc2V0YXV0aF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNldGtleV9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNldF9zdGFrZXlfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBzZXRfYXNzb2NzdGFfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBkZWxfYXNzb2NzdGFfaGRsKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBhZGRfYmFfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLQotaW50IG1sbWVfZXZ0X2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7Ci1pbnQgaDJjX21zZ19oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHR4X2JlYWNvbl9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNldF9jaF9oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotaW50IHNldF9jaHBsYW5faGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBsZWRfYmxpbmtfaGRsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKTsKLWludCBzZXRfY3NhX2hkbDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjb25zdCB1OCAqcGJ1Zik7CS8qIEt1cnQ6IEhhbmRsaW5nIERGUyBjaGFubmVsIHN3aXRjaCBhbm5vdW5jZW1lbnQgaWUuICovCi1pbnQgdGRsc19oZGwyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBidWYpOwotCi0jZGVmaW5lIEdFTl9EUlZfQ01EX0hBTkRMRVIoc2l6ZSwgY21kKQl7c2l6ZSwgJmNtZCAjIyBfaGRsMjNhfSwKLSNkZWZpbmUgR0VOX01MTUVfRVhUX0hBTkRMRVIoc2l6ZSwgY21kKQl7c2l6ZSwgY21kfSwKLQotc3RydWN0IEMySEV2ZW50X0hlYWRlciB7Ci0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0KLQl1bnNpZ25lZCBpbnQgbGVuOjE2OwotCXVuc2lnbmVkIGludCBJRDo4OwotCXVuc2lnbmVkIGludCBzZXE6ODsKLQotI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCi0KLQl1bnNpZ25lZCBpbnQgc2VxOjg7Ci0JdW5zaWduZWQgaW50IElEOjg7Ci0JdW5zaWduZWQgaW50IGxlbjoxNjsKLQotI2Vsc2UKLQotIyAgZXJyb3IgIk11c3QgYmUgTElUVExFIG9yIEJJRyBFbmRpYW4iCi0KLSNlbmRpZgotCi0JdW5zaWduZWQgaW50IHJzdmQ7Ci19OwotCi1lbnVtIHJ0d19jMmhfZXZlbnQgewotCUdFTl9FVlRfQ09ERShfUmVhZF9NQUNSRUcpID0gMCwgLyowKi8KLQlHRU5fRVZUX0NPREUoX1JlYWRfQkJSRUcpLAotCUdFTl9FVlRfQ09ERShfUmVhZF9SRlJFRyksCi0JR0VOX0VWVF9DT0RFKF9SZWFkX0VFUFJPTSksCi0JR0VOX0VWVF9DT0RFKF9SZWFkX0VGVVNFKSwKLQlHRU5fRVZUX0NPREUoX1JlYWRfQ0FNKSwJCQkvKjUqLwotCUdFTl9FVlRfQ09ERShfR2V0X0Jhc2ljUmF0ZSksCi0JR0VOX0VWVF9DT0RFKF9HZXRfRGF0YVJhdGUpLAotCUdFTl9FVlRfQ09ERShfU3VydmV5KSwJIC8qOCovCi0JR0VOX0VWVF9DT0RFKF9TdXJ2ZXlEb25lKSwJIC8qOSovCi0KLQlHRU5fRVZUX0NPREUoX0pvaW5Cc3MpICwgLyoxMCovCi0JR0VOX0VWVF9DT0RFKF9BZGRTVEEpLAotCUdFTl9FVlRfQ09ERShfRGVsU1RBKSwKLQlHRU5fRVZUX0NPREUoX0F0aW1Eb25lKSAsCi0JR0VOX0VWVF9DT0RFKF9UWF9SZXBvcnQpLAotCUdFTl9FVlRfQ09ERShfQ0NYX1JlcG9ydCksCQkJLyoxNSovCi0JR0VOX0VWVF9DT0RFKF9EVE1fUmVwb3J0KSwKLQlHRU5fRVZUX0NPREUoX1RYX1JhdGVfU3RhdGlzdGljcyksCi0JR0VOX0VWVF9DT0RFKF9DMkhMQkspLAotCUdFTl9FVlRfQ09ERShfRldEQkcpLAotCUdFTl9FVlRfQ09ERShfQzJIRkVFREJBQ0spLCAgICAgICAgICAgICAgIC8qMjAqLwotCUdFTl9FVlRfQ09ERShfQUREQkEpLAotCUdFTl9FVlRfQ09ERShfQzJIQkNOKSwKLQlHRU5fRVZUX0NPREUoX1JlcG9ydFB3clN0YXRlKSwJCS8qIGZpbGVuOiBvbmx5IGZvciBQQ0lFLCBVU0IgKi8KLQlHRU5fRVZUX0NPREUoX0Nsb3NlUkYpLAkJCQkvKiBmaWxlbjogb25seSBmb3IgUENJRSwgd29yayBhcm91bmQgQVNQTSAqLwotCU1BWF9DMkhFVlQKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19wd3JjdHJsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk5ZmVkOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3B3cmN0cmwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19SVFdfUFdSQ1RSTF9IXwotI2RlZmluZSBfX1JUV19QV1JDVFJMX0hfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNkZWZpbmUgRldfUFdSMAkJMAotI2RlZmluZSBGV19QV1IxCQkxCi0jZGVmaW5lIEZXX1BXUjIJCTIKLSNkZWZpbmUgRldfUFdSMwkJMwotCi0KLSNkZWZpbmUgSFdfUFdSMAkJNwotI2RlZmluZSBIV19QV1IxCQk2Ci0jZGVmaW5lIEhXX1BXUjIJCTIKLSNkZWZpbmUgSFdfUFdSMwkJMAotI2RlZmluZSBIV19QV1I0CQk4Ci0KLSNkZWZpbmUgRldfUFdSTVNLCTB4NwotCi0KLSNkZWZpbmUgWE1JVF9BTElWRQlCSVQoMCkKLSNkZWZpbmUgUkVDVl9BTElWRQlCSVQoMSkKLSNkZWZpbmUgQ01EX0FMSVZFCUJJVCgyKQotI2RlZmluZSBFVlRfQUxJVkUJQklUKDMpCi0KLWVudW0gUG93ZXJfTWdudCB7Ci0JUFNfTU9ERV9BQ1RJVkUJPSAwLAotCVBTX01PREVfTUlOLAotCVBTX01PREVfTUFYLAotCVBTX01PREVfRFRJTSwKLQlQU19NT0RFX1ZPSVAsCi0JUFNfTU9ERV9VQVBTRF9XTU0sCi0JUFNfTU9ERV9VQVBTRCwKLQlQU19NT0RFX0lCU1MsCi0JUFNfTU9ERV9XV0xBTiwKLQlQTV9SYWRpb19PZmYsCi0JUE1fQ2FyZF9EaXNhYmxlLAotCVBTX01PREVfTlVNCi19OwotCi0KLS8qIEJJVFsyOjBdID0gSFcgc3RhdGUKLSAqIEJJVFszXSA9IFByb3RvY29sIFBTIHN0YXRlLCAgMDogYWN0aXZlLCAxOiBzbGVlcCBzdGF0ZQotICogQklUWzRdID0gc3ViLXN0YXRlCi0gKi8KLQotI2RlZmluZSBQU19EUFMJCQlCSVQoMCkKLSNkZWZpbmUgUFNfTENMSwkJCShQU19EUFMpCi0jZGVmaW5lIFBTX1JGX09GRgkJQklUKDEpCi0jZGVmaW5lIFBTX0FMTF9PTgkJQklUKDIpCi0jZGVmaW5lIFBTX1NUX0FDVElWRQkJQklUKDMpCi0KLSNkZWZpbmUgUFNfSVNSX0VOQUJMRQkJQklUKDQpCi0jZGVmaW5lIFBTX0lNUl9FTkFCTEUJCUJJVCg1KQotI2RlZmluZSBQU19BQ0sJCQlCSVQoNikKLSNkZWZpbmUgUFNfVE9HR0xFCQlCSVQoNykKLQotI2RlZmluZSBQU19TVEFURV9NQVNLCQkoMHgwRikKLSNkZWZpbmUgUFNfU1RBVEVfSFdfTUFTSwkoMHgwNykKLSNkZWZpbmUgUFNfU0VRX01BU0sJCSgweGMwKQotCi0jZGVmaW5lIFBTX1NUQVRFKHgpCQkoUFNfU1RBVEVfTUFTSyAmICh4KSkKLSNkZWZpbmUgUFNfU1RBVEVfSFcoeCkJKFBTX1NUQVRFX0hXX01BU0sgJiAoeCkpCi0jZGVmaW5lIFBTX1NFUSh4KQkJKFBTX1NFUV9NQVNLICYgKHgpKQotCi0jZGVmaW5lIFBTX1NUQVRFX1MwCQkoUFNfRFBTKQotI2RlZmluZSBQU19TVEFURV9TMQkJKFBTX0xDTEspCi0jZGVmaW5lIFBTX1NUQVRFX1MyCQkoUFNfUkZfT0ZGKQotI2RlZmluZSBQU19TVEFURV9TMwkJKFBTX0FMTF9PTikKLSNkZWZpbmUgUFNfU1RBVEVfUzQJCSgoUFNfU1RfQUNUSVZFKSB8IChQU19BTExfT04pKQotCi0KLSNkZWZpbmUgUFNfSVNfUkZfT04oeCkJKCh4KSAmIChQU19BTExfT04pKQotI2RlZmluZSBQU19JU19BQ1RJVkUoeCkJKCh4KSAmIChQU19TVF9BQ1RJVkUpKQotI2RlZmluZSBDTFJfUFNfU1RBVEUoeCkJKCh4KSA9ICgoeCkgJiAoMHhGMCkpKQotCi0KLXN0cnVjdCByZXBvcnRwd3JzdGF0ZV9wYXJtIHsKLQl1bnNpZ25lZCBjaGFyIG1vZGU7Ci0JdW5zaWduZWQgY2hhciBzdGF0ZTsgLyogdGhlIENQV00gdmFsdWUgKi8KLQl1bnNpZ25lZCBzaG9ydCByc3ZkOwotfTsKLQotI2RlZmluZSBMUFNfREVMQVlfVElNRQkoMSpIWikgLyogIDEgc2VjICovCi0KLSNkZWZpbmUgRVhFX1BXUl9OT05FCQkweDAxCi0jZGVmaW5lIEVYRV9QV1JfSVBTCQkweDAyCi0jZGVmaW5lIEVYRV9QV1JfTFBTCQkweDA0Ci0KLS8qICBSRiBzdGF0ZS4gKi8KLWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgewotCXJmX29uLAkJLyogIFJGIGlzIG9uIGFmdGVyIFJGU2xlZXAgb3IgUkZPZmYgKi8KLQlyZl9zbGVlcCwJLyogIDgwMi4xMSBQb3dlciBTYXZlIG1vZGUgKi8KLQlyZl9vZmYsCQkvKiAgSFcvU1cgUmFkaW8gT0ZGIG9yIEluYWN0aXZlIFBvd2VyIFNhdmUgKi8KLQkvKiBBZGQgdGhlIG5ldyBSRiBzdGF0ZSBhYm92ZSB0aGlzIGxpbmU9PT09PSAqLwotCXJmX21heAotfTsKLQotLyogIFJGIE9mZiBMZXZlbCBmb3IgSVBTIG9yIEhXL1NXIHJhZGlvIG9mZiAqLwotI2RlZmluZQlSVF9SRl9PRkZfTEVWTF9BU1BNCQlCSVQoMCkJLyogIFBDSSBBU1BNICovCi0jZGVmaW5lCVJUX1JGX09GRl9MRVZMX0NMS19SRVEJCUJJVCgxKQkvKiAgUENJIGNsb2NrIHJlcXVlc3QgKi8KLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfUENJX0QzCQlCSVQoMikJLyogIFBDSSBEMyBtb2RlICovCi0vKiBOSUMgaGFsdCwgcmUtaW5pdCBodyBwYXJhbXMgKi8KLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfSEFMVF9OSUMJCUJJVCgzKQotLyogIEZXIGZyZWUsIHJlLWRvd25sb2FkIHRoZSBGVyAqLwotI2RlZmluZQlSVF9SRl9PRkZfTEVWTF9GUkVFX0ZXCQlCSVQoNCkKLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfRldfMzJLCQlCSVQoNSkJLyogIEZXIGluIDMyayAqLwotLyogIEFsd2F5cyBlbmFibGUgQVNQTSBhbmQgQ2xvY2sgUmVxIGluIGluaXRpYWxpemF0aW9uLiAqLwotI2RlZmluZQlSVF9SRl9QU19MRVZFTF9BTFdBWVNfQVNQTQlCSVQoNikKLS8qICBXaGVuIExQUyBpcyBvbiwgZGlzYWJsZSAyUiBpZiBubyBwYWNrZXQgaXMgcmVjZWl2ZWQgb3IgdHJhbnNtaXR0ZC4gKi8KLSNkZWZpbmUJUlRfUkZfTFBTX0RJU0FMQkVfMlIJCUJJVCgzMCkKLSNkZWZpbmUJUlRfUkZfTFBTX0xFVkVMX0FTUE0JCUJJVCgzMSkJLyogIExQUyB3aXRoIEFTUE0gKi8KLQotI2RlZmluZQlSVF9JTl9QU19MRVZFTChwcHNjLCBfUFNfRkxBRykJCQkJXAotCSgocHBzYy0+Y3VyX3BzX2xldmVsICYgX1BTX0ZMQUcpID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZQlSVF9DTEVBUl9QU19MRVZFTChwcHNjLCBfUFNfRkxBRykJCQlcCi0JKHBwc2MtPmN1cl9wc19sZXZlbCAmPSAofihfUFNfRkxBRykpKQotI2RlZmluZQlSVF9TRVRfUFNfTEVWRUwocHBzYywgX1BTX0ZMQUcpCQkJCVwKLQkocHBzYy0+Y3VyX3BzX2xldmVsIHw9IF9QU19GTEFHKQotCi0KLWVudW0gewotCVBTQkJSRUdfUkYwID0gMCwKLQlQU0JCUkVHX1JGMSwKLQlQU0JCUkVHX1JGMiwKLQlQU0JCUkVHX0FGRTAsCi0JUFNCQlJFR19UT1RBTENOVAotfTsKLQotZW51bSB7IC8qICBmb3IgaXBzX21vZGUgKi8KLQlJUFNfTk9ORSA9IDAsCi0JSVBTX05PUk1BTCwKLQlJUFNfTEVWRUxfMiwKLX07Ci0KLXN0cnVjdCBwd3JjdHJsX3ByaXYgewotCXN0cnVjdCBzZW1hcGhvcmUgbG9jazsKLQl2b2xhdGlsZSB1OCBycHdtOyAvKiByZXF1ZXN0ZWQgcG93ZXIgc3RhdGUgZm9yIGZ3ICovCi0Jdm9sYXRpbGUgdTggY3B3bTsgLyogZncgY3VycmVudCBwb3dlciBzdGF0ZS4gdXBkYXRlZCB3aGVuIDEuCi0JCQkgICAqIHJlYWQgZnJvbSBIQ1BXTSAyLiBkcml2ZXIgbG93ZXJzIHBvd2VyIGxldmVsCi0JCQkgICAqLwotCXZvbGF0aWxlIHU4IHRvZzsgLyogIHRvZ2dsaW5nICovCi0KLQl1OAlwd3JfbW9kZTsKLQl1OAlzbWFydF9wczsKLQl1OAliY25fYW50X21vZGU7Ci0KLQl1OAlicG93ZXJfc2F2aW5nOwotCi0JdTgJcmVnX3Jmb2ZmOwotCXUzMglyZm9mZl9yZWFzb247Ci0KLQkvKiBSRiBPRkYgTGV2ZWwgKi8KLQl1MzIJY3VyX3BzX2xldmVsOwotCXUzMglyZWdfcmZwc19sZXZlbDsKLQotCXVpbnQJaXBzX2VudGVyMjNhX2NudHM7Ci0JdWludAlpcHNfbGVhdmUyM2FfY250czsKLQotCXU4CWlwc19tb2RlOwotCXU4CWlwc19tb2RlX3JlcTsgLyogIHVzZWQgdG8gYWNjZXB0IHRoZSBtb2RlIHNldHRpbmcgcmVxdWVzdCAqLwotCXVpbnQgYmlwc19wcm9jZXNzaW5nOwotCXVuc2lnbmVkIGxvbmcgaXBzX2RlbnlfdGltZTsgLyogZGVueSBJUFMgd2hlbiBzeXN0ZW0gdGltZSBpcyBzbWFsbGVyICovCi0JdTggcHNfcHJvY2Vzc2luZzsgLyogdXNlZCB0byBtYXJrIHdoZXRoZXIgaW4gcnR3X3BzX3Byb2Nlc3NvcjIzYSAqLwotCi0JdTgJYkxlaXN1cmVQczsKLQl1OAlMcHNJZGxlQ291bnQ7Ci0JdTgJcG93ZXJfbWdudDsKLQl1OAliRndDdXJyZW50SW5QU01vZGU7Ci0JdW5zaWduZWQgbG9uZwlEZWxheUxQU0xhc3RUaW1lU3RhbXA7Ci0JdTgJYnRjb2V4X3Jmb247Ci0KLQl1OAkJYkluU3VzcGVuZDsKLSNpZmRlZglDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLQl1OAkJYkF1dG9SZXN1bWU7Ci0JdTgJCWF1dG9wbV9jbnQ7Ci0jZW5kaWYKLQl1OAkJYlN1cHBvcnRSZW1vdGVXYWtldXA7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJcHdyX3N0YXRlX2NoZWNrX3RpbWVyOwotCWludAkJcHdyX3N0YXRlX2NoZWNrX2ludGVydmFsOwotCXU4CQlwd3Jfc3RhdGVfY2hlY2tfY250czsKLQotCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUJcmZfcHdyc3RhdGU7LyogY3VyIHBvd2VyIHN0YXRlICovCi0JZW51bSBydF9yZl9wb3dlcl9zdGF0ZQljaGFuZ2VfcmZwd3JzdGF0ZTsKLQotCXU4CWJrZWVwZndhbGl2ZTsKLQl1bnNpZ25lZCBsb25nIFBTX0JCUmVnQmFja3VwW1BTQkJSRUdfVE9UQUxDTlRdOwotfTsKLQotI2RlZmluZSBSVFdfUFdSX1NUQVRFX0NIS19JTlRFUlZBTCAyMDAwCi0KLSNkZWZpbmUgX3J0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKHB3cmN0cmxwcml2LCBtcykgXAotCShtb2RfdGltZXIoJnB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfdGltZXIsIGppZmZpZXMgKwlcCi0JCSAgbXNlY3NfdG9famlmZmllcyhtcykpKQotCi0jZGVmaW5lIHJ0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKHB3cmN0cmxwcml2KQlcCi0JKF9ydHdfc2V0X3B3cl9zdGF0ZV9jaGVja190aW1lcigocHdyY3RybHByaXYpLAlcCi0JCQkgKHB3cmN0cmxwcml2KS0+cHdyX3N0YXRlX2NoZWNrX2ludGVydmFsKSkKLQotdm9pZCBydHdfaW5pdF9wd3JjdHJsX3ByaXYyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgcnR3X2ZyZWVfcHdyY3RybF9wcml2KHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXZvaWQgcnR3X3NldF9wc19tb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHBzX21vZGUsCi0JCSAgICAgdTggc21hcnRfcHMsIHU4IGJjbl9hbnRfbW9kZSk7Ci12b2lkIHJ0d19zZXRfcnB3bTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB2YWw4KTsKLXZvaWQgTGVhdmVBbGxQb3dlclNhdmVNb2RlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGlwc19lbnRlcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBpcHNfbGVhdmUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnR3X3BzX3Byb2Nlc3NvcjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBSZk9uT2ZmRGV0ZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcik7Ci0KLXMzMiBMUFNfUkZfT05fY2hlY2syM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGRlbGF5X21zKTsKLXZvaWQgTFBTX0VudGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotdm9pZCBMUFNfTGVhdmUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci0KLXZvaWQgcnR3X3NldF9pcHNfZGVueTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbXMpOwotaW50IF9ydHdfcHdyX3dha2V1cDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgaXBzX2RlZmZlcl9tcywKLQkJICAgIGNvbnN0IGNoYXIgKmNhbGxlcik7Ci0jZGVmaW5lIHJ0d19wd3Jfd2FrZXVwKGFkYXB0ZXIpIF9ydHdfcHdyX3dha2V1cDIzYShhZGFwdGVyLAkJXAotCSBSVFdfUFdSX1NUQVRFX0NIS19JTlRFUlZBTCwgX19mdW5jX18pCi1pbnQgcnR3X3BtX3NldF9pcHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbW9kZSk7Ci1pbnQgcnR3X3BtX3NldF9scHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggbW9kZSk7Ci0KLSNlbmRpZiAgLyogX19SVEw4NzFYX1BXUkNUUkxfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfcmVjdi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19yZWN2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTVlZGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19yZWN2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9SVFdfUkVDVl9IXwotI2RlZmluZSBfUlRXX1JFQ1ZfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxIYWw4NzIzQVBoeUNmZy5oPgotCi0jZGVmaW5lIE5SX1JFQ1ZGUkFNRQkJMjU2Ci0KLSNkZWZpbmUgTUFYX1JYRlJBTUVfQ05UCQk1MTIKLSNkZWZpbmUgTUFYX1JYX05VTUJMS1MJCSgzMikKLSNkZWZpbmUgUkVDVkZSQU1FX0hEUl9BTElHTgkxMjgKLQotI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCi0KLSNkZWZpbmUgTUFYX1NVQkZSQU1FX0NPVU5UCTY0Ci0KLS8qIGZvciBSeCByZW9yZGVyaW5nIGJ1ZmZlciBjb250cm9sICovCi1zdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgewotCXN0cnVjdCBydHdfYWRhcHRlcgkqcGFkYXB0ZXI7Ci0JdTggZW5hYmxlOwotCXUxNiBpbmRpY2F0ZV9zZXE7Lyogd3N0YXJ0X2IsIGluaXRfdmFsdWU9MHhmZmZmICovCi0JdTE2IHdlbmRfYjsKLQl1OCB3c2l6ZV9iOwotCXN0cnVjdCBydHdfcXVldWUgcGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgcmVvcmRlcmluZ19jdHJsX3RpbWVyOwotfTsKLQotc3RydWN0CXN0YWluZm9fcnhjYWNoZQl7Ci0JdTE2CXRpZF9yeHNlcVsxNl07Ci0vKgotCXVuc2lnbmVkIHNob3J0CXRpZDBfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMV9yeHNlcTsKLQl1bnNpZ25lZCBzaG9ydAl0aWQyX3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDNfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkNF9yeHNlcTsKLQl1bnNpZ25lZCBzaG9ydAl0aWQ1X3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDZfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkN19yeHNlcTsKLQl1bnNpZ25lZCBzaG9ydAl0aWQ4X3J4c2VxOwotCXVuc2lnbmVkIHNob3J0CXRpZDlfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTBfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTFfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTJfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTNfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTRfcnhzZXE7Ci0JdW5zaWduZWQgc2hvcnQJdGlkMTVfcnhzZXE7Ci0qLwotfTsKLQotc3RydWN0IHNtb290aF9yc3NpX2RhdGEgewotCXUzMgllbGVtZW50c1sxMDBdOwkvKiBhcnJheSB0byBzdG9yZSB2YWx1ZXMgKi8KLQl1MzIJaW5kZXg7CQkJLyogaW5kZXggdG8gY3VycmVudCBhcnJheSB0byBzdG9yZSAqLwotCXUzMgl0b3RhbF9udW07CQkvKiBudW0gb2YgdmFsaWQgZWxlbWVudHMgKi8KLQl1MzIJdG90YWxfdmFsOwkJLyogc3VtIG9mIHZhbGlkIGVsZW1lbnRzICovCi19OwotCi1zdHJ1Y3Qgc2lnbmFsX3N0YXQgewotCXU4CXVwZGF0ZV9yZXE7CQkvKiB1c2VkIHRvIGluZGljYXRlICovCi0JdTgJYXZnX3ZhbDsJCS8qIGF2ZyBvZiB2YWxpZCBlbGVtZW50cyAqLwotCXUzMgl0b3RhbF9udW07CQkvKiBudW0gb2YgdmFsaWQgZWxlbWVudHMgKi8KLQl1MzIJdG90YWxfdmFsOwkJLyogc3VtIG9mIHZhbGlkIGVsZW1lbnRzICovCi19OwotCi1zdHJ1Y3QgcGh5X2luZm8gewotCXU4CQlSeFBXREJBbGw7Ci0JdTgJCVNpZ25hbFF1YWxpdHk7CSAvKiAgaW4gMC0xMDAgaW5kZXguICovCi0JdTgJCVJ4TUlNT1NpZ25hbFF1YWxpdHlbUkZfUEFUSF9NQVhdOyAvKiBFVk0gKi8KLQl1OAkJUnhNSU1PU2lnbmFsU3RyZW5ndGhbUkZfUEFUSF9NQVhdOy8qIDB+MTAwICovCi0JczgJCVJ4UG93ZXI7IC8qICBpbiBkQm0gVHJhbnNsYXRlIGZyb20gUFdkQiAqLwotCS8qIFJlYWwgcG93ZXIgaW4gZEJtIGZvciB0aGlzIHBhY2tldCwgbm8gYmVhdXRpZmljYXRpb24gYW5kIGFnZ3JlZ2F0aW9uLgotCSAqIEtlZXAgdGhpcyByYXcgaW5mbyB0byBiZSB1c2VkIGZvciB0aGUgb3RoZXIgcHJvY2VkdXJlcy4KLQkgKi8KLQlzOAkJUmVjdlNpZ25hbFBvd2VyOwotCXU4CQlCVFJ4UlNTSVBlcmNlbnRhZ2U7Ci0JdTgJCVNpZ25hbFN0cmVuZ3RoOyAvKiAgaW4gMC0xMDAgaW5kZXguICovCi0JdTgJCVJ4UHdyW1JGX1BBVEhfTUFYXTsvKiBwZXItcGF0aCdzIHB3ZGIgKi8KLQl1OAkJUnhTTlJbUkZfUEFUSF9NQVhdOy8qIHBlci1wYXRoJ3MgU05SICovCi19OwotCi0KLXN0cnVjdCByeF9wa3RfYXR0cmliCXsKLQl1MTYJcGt0X2xlbjsKLQl1OAlwaHlzdDsKLQl1OAlkcnZpbmZvX3N6OwotCXU4CXNoaWZ0X3N6OwotCXU4CWhkcmxlbjsgLyogdGhlIFdMQU4gSGVhZGVyIExlbiAqLwotCXU4CWFtc2R1OwotCXU4CXFvczsKLQl1OAlwcmlvcml0eTsKLQl1OAlwd19zYXZlOwotCXU4CW1kYXRhOwotCXUxNglzZXFfbnVtOwotCXU4CWZyYWdfbnVtOwotCXU4CW1mcmFnOwotCXU4CW9yZGVyOwotCXU4CXByaXZhY3k7IC8qIGluIGZyYW1lX2N0cmwgZmllbGQgKi8KLQl1OAliZGVjcnlwdGVkOwotCS8qIHdoZW4gMCBpbmRpY2F0ZSBubyBlbmNyeXB0LiB3aGVuIG5vbi16ZXJvLCBpbmRpY2F0ZSB0aGUgYWxnb3JpdGggKi8KLQl1MzIJZW5jcnlwdDsKLQl1OAlpdl9sZW47Ci0JdTgJaWN2X2xlbjsKLQl1OAljcmNfZXJyOwotCXU4CWljdl9lcnI7Ci0KLQl1MTYgZXRoX3R5cGU7Ci0KLQl1OAlkc3RbRVRIX0FMRU5dOwotCXU4CXNyY1tFVEhfQUxFTl07Ci0JdTgJdGFbRVRIX0FMRU5dOwotCXU4CXJhW0VUSF9BTEVOXTsKLQl1OAlic3NpZFtFVEhfQUxFTl07Ci0KLQl1OCBhY2tfcG9saWN5OwotCi0JdTgJdGNwY2hrX3ZhbGlkOyAvKiAgMDogaW52YWxpZCwgMTogdmFsaWQgKi8KLQl1OAlpcF9jaGtycHQ7IC8qIDA6IGluY29ycmVjdCwgMTogY29ycmVjdCAqLwotCXU4CXRjcF9jaGtycHQ7IC8qIDA6IGluY29ycmVjdCwgMTogY29ycmVjdCAqLwotCXU4CWtleV9pbmRleDsKLQotCXU4CW1jc19yYXRlOwotCXU4CXJ4aHQ7Ci0JdTgJc2dpOwotCXU4CXBrdF9ycHRfdHlwZTsKLQl1MzIJTWFjSURWYWxpZEVudHJ5WzJdOwkvKiAgNjQgYml0cyBwcmVzZW50IDY0IGVudHJ5LiAqLwotCXN0cnVjdCBwaHlfaW5mbyBwaHlfaW5mbzsKLX07Ci0KLS8qIFRoZXNlIGRlZmluaXRpb24gaXMgdXNlZCBmb3IgUnggcGFja2V0IHJlb3JkZXJpbmcuICovCi0jZGVmaW5lIFNOX0xFU1MoYSwgYikJCSgoKGEtYikgJiAweDgwMCkgIT0gMCkKLSNkZWZpbmUgU05fRVFVQUwoYSwgYikJCShhID09IGIpCi0jZGVmaW5lIFJFT1JERVJfV0FJVF9USU1FCSg1MCkgLyogIChtcykgKi8KLQotI2RlZmluZSBSRUNWQlVGRl9BTElHTl9TWiA4Ci0KLSNkZWZpbmUgUlhERVNDX1NJWkUJMjQKLSNkZWZpbmUgUlhERVNDX09GRlNFVCBSWERFU0NfU0laRQotCi1zdHJ1Y3QgcmVjdl9zdGF0IHsKLQlfX2xlMzIgcnhkdzA7Ci0JX19sZTMyIHJ4ZHcxOwotCV9fbGUzMiByeGR3MjsKLQlfX2xlMzIgcnhkdzM7Ci0JX19sZTMyIHJ4ZHc0OwotCV9fbGUzMiByeGR3NTsKLX07Ci0KLS8qIGFjY2Vzc2VyIG9mIHJlY3ZfcHJpdjogcnR3X3JlY3ZfZW50cnkyM2EoZGlzcGF0Y2ggLyBwYXNzaXZlIGxldmVsKTsJXAotICogcmVjdl90aHJlYWQocGFzc2l2ZSkgOyByZXR1cm5wa3QoZGlzcGF0Y2gpIDsgaGFsdChwYXNzaXZlKSA7Ci0gKgotICogdXNpbmcgZW50ZXJfY3JpdGljYWwgc2VjdGlvbiB0byBwcm90ZWN0Ci0gKi8KLXN0cnVjdCByZWN2X3ByaXYgewotCXNwaW5sb2NrX3QJbG9jazsKLQotCXN0cnVjdCBydHdfcXVldWUJZnJlZV9yZWN2X3F1ZXVlOwotCXN0cnVjdCBydHdfcXVldWUJcmVjdl9wZW5kaW5nX3F1ZXVlOwotCXN0cnVjdCBydHdfcXVldWUJdWNfc3dkZWNfcGVuZGluZ19xdWV1ZTsKLQotCWludCBmcmVlX3JlY3ZmcmFtZV9jbnQ7Ci0KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIJKmFkYXB0ZXI7Ci0KLQl1MzIJYklzQW55Tm9uQkVQa3RzOwotCXU2NAlyeF9ieXRlczsKLQl1NjQJcnhfcGt0czsKLQl1NjQJcnhfZHJvcDsKLQl1NjQJbGFzdF9yeF9ieXRlczsKLQotCXVpbnQgIHJ4X2ljdl9lcnI7Ci0JdWludCAgcnhfbGFyZ2VwYWNrZXRfY3JjZXJyOwotCXVpbnQgIHJ4X3NtYWxscGFja2V0X2NyY2VycjsKLQl1aW50ICByeF9taWRkbGVwYWNrZXRfY3JjZXJyOwotCi0JLyogdTggKnBhbGxvY2F0ZWRfdXJiX2J1ZjsgKi8KLQl1OAlyeF9wZW5kaW5nX2NudDsKLQotCXN0cnVjdCB1cmIgKmludF9pbl91cmI7Ci0KLQl1OAkqaW50X2luX2J1ZjsKLQotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfcHJlcGFyZV9iZWFjb25fdGFza2xldDsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcmVjdl90YXNrbGV0OwotCXN0cnVjdCBza19idWZmX2hlYWQgZnJlZV9yZWN2X3NrYl9xdWV1ZTsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJ4X3NrYl9xdWV1ZTsKLQl1OCAqcHJlY3ZfYnVmOwotCi0JLyogRm9yIGRpc3BsYXkgdGhlIHBoeSBpbmZvcm1hdGlvbSAqLwotCXM4IHJ4cHdkYjsKLQl1OCBzaWduYWxfc3RyZW5ndGg7Ci0JdTggc2lnbmFsX3F1YWw7Ci0JdTggbm9pc2U7Ci0JaW50IFJ4U05SZEJbMl07Ci0JczggUnhSc3NpWzJdOwotCWludCBGYWxzZUFsbUNudF9hbGw7Ci0KLQlzdHJ1Y3QgdGltZXJfbGlzdCBzaWduYWxfc3RhdF90aW1lcjsKLQl1MzIgc2lnbmFsX3N0YXRfc2FtcGxpbmdfaW50ZXJ2YWw7Ci0JLyogdTMyIHNpZ25hbF9zdGF0X2NvbnZlcmdpbmdfY29uc3RhbnQ7ICovCi0Jc3RydWN0IHNpZ25hbF9zdGF0IHNpZ25hbF9xdWFsX2RhdGE7Ci0Jc3RydWN0IHNpZ25hbF9zdGF0IHNpZ25hbF9zdHJlbmd0aF9kYXRhOwotfTsKLQotI2RlZmluZSBydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKHJlY3Zwcml2KQkJCVwKLQkgbW9kX3RpbWVyKCYocmVjdnByaXYpLT5zaWduYWxfc3RhdF90aW1lciwgamlmZmllcyArCVwKLQkJICAgbXNlY3NfdG9famlmZmllcygocmVjdnByaXYpLT5zaWduYWxfc3RhdF9zYW1wbGluZ19pbnRlcnZhbCkpCi0KLXN0cnVjdCBzdGFfcmVjdl9wcml2IHsKLQlzcGlubG9ja190CWxvY2s7Ci0JaW50CW9wdGlvbjsKLQotCS8qIHN0cnVjdCBydHdfcXVldWUJYmxrX3N0cm1zW01BWF9SWF9OVU1CTEtTXTsgKi8KLQlzdHJ1Y3QgcnR3X3F1ZXVlIGRlZnJhZ19xOwkgLyoga2VlcGluZyB0aGUgZnJhZ21lbnQgZnJhbWUgdW50aWwgZGVmcmFnICovCi0KLQlzdHJ1Y3QJc3RhaW5mb19yeGNhY2hlIHJ4Y2FjaGU7Ci0KLQkvKiB1aW50CXN0YV9yeF9ieXRlczsgKi8KLQkvKiB1aW50CXN0YV9yeF9wa3RzOyAqLwotCS8qIHVpbnQJc3RhX3J4X2ZhaWw7ICovCi0KLX07Ci0KLQotc3RydWN0IHJlY3ZfYnVmIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXI7Ci0KLQlzdHJ1Y3QgdXJiICpwdXJiOwotCXN0cnVjdCBza19idWZmICpwc2tiOwotfTsKLQotLyoJaGVhZCAgLS0tLS0+Ci0gKgotICoJCWRhdGEgIC0tLS0tPgotICoKLSAqCQkJcGF5bG9hZAotICoKLSAqCQl0YWlsICAtLS0tLT4KLSAqCi0gKgllbmQgICAtLS0tLT4KLSAqCi0gKglsZW4gPSAodW5zaWduZWQgaW50ICkodGFpbCAtIGRhdGEpOwotICoKLSAqLwotc3RydWN0IHJlY3ZfZnJhbWUgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwotCi0Jc3RydWN0IHJ0d19hZGFwdGVyICAqYWRhcHRlcjsKLQotCXN0cnVjdCByeF9wa3RfYXR0cmliIGF0dHJpYjsKLQotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YTsKLQotCS8qIGZvciBBLU1QRFUgUnggcmVvcmRlcmluZyBidWZmZXIgY29udHJvbCAqLwotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybDsKLX07Ci0KLS8qIGdldCBhIGZyZWUgcmVjdl9mcmFtZSBmcm9tIHBmcmVlX3JlY3ZfcXVldWUgKi8KLXN0cnVjdCByZWN2X2ZyYW1lICpydHdfYWxsb2NfcmVjdmZyYW1lMjNhKHN0cnVjdCBydHdfcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpOwotaW50IHJ0d19mcmVlX3JlY3ZmcmFtZTIzYShzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSk7Ci0KLWludCBydHdfZW5xdWV1ZV9yZWN2ZnJhbWUyM2Eoc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUsIHN0cnVjdCBydHdfcXVldWUgKnF1ZXVlKTsKLQotdTMyIHJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotc3RydWN0IHJlY3ZfYnVmICpydHdfZGVxdWV1ZV9yZWN2YnVmMjNhKHN0cnVjdCBydHdfcXVldWUgKnF1ZXVlKTsKLQotdm9pZCBydHdfcmVvcmRlcmluZ19jdHJsX3RpbWVvdXRfaGFuZGxlcjIzYSh1bnNpZ25lZCBsb25nIHBjb250ZXh0KTsKLQotc3RhdGljIGlubGluZSBzMzIgdHJhbnNsYXRlX3BlcmNlbnRhZ2VfdG9fZGJtKHUzMiBTaWduYWxTdHJlbmd0aEluZGV4KQotewotCXMzMglTaWduYWxQb3dlcjsgLyogIGluIGRCbS4gKi8KLQotCS8qICBUcmFuc2xhdGUgdG8gZEJtICh4PTAuNXktOTUpLiAqLwotCVNpZ25hbFBvd2VyID0gKHMzMikoKFNpZ25hbFN0cmVuZ3RoSW5kZXggKyAxKSA+PiAxKTsKLQlTaWduYWxQb3dlciAtPSA5NTsKLQotCXJldHVybiBTaWduYWxQb3dlcjsKLX0KLQotCi1zdHJ1Y3Qgc3RhX2luZm87Ci0KLXZvaWQgX3J0d19pbml0X3N0YV9yZWN2X3ByaXYyM2Eoc3RydWN0IHN0YV9yZWN2X3ByaXYgKnBzdGFfcmVjdnByaXYpOwotCi12b2lkIG1ndF9kaXNwYXRjaGVyMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfcmYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfcmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdkZTcxNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3JmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmCV9fUlRXX1JGX0hfCi0jZGVmaW5lIF9fUlRXX1JGX0hfCi0KLSNpbmNsdWRlIDxydHdfY21kLmg+Ci0KLSNkZWZpbmUgT0ZETV9QSFkJCTEKLSNkZWZpbmUgTUlYRURfUEhZCQkyCi0jZGVmaW5lIENDS19QSFkJCQkzCi0KLSNkZWZpbmUgTnVtUmF0ZXMJCSgxMykKLQotLyogIHNsb3QgdGltZSBmb3IgMTFnICovCi0jZGVmaW5lIFNIT1JUX1NMT1RfVElNRQkJCTkKLSNkZWZpbmUgTk9OX1NIT1JUX1NMT1RfVElNRQkJMjAKLQotLyogIFdlIG5vdyBkZWZpbmUgdGhlIG1heCBjaGFubmVscyBpbiBlYWNoIGNoYW5uZWwgcGxhbi4gKi8KLSNkZWZpbmUJTUFYX0NIQU5ORUxfTlVNXzJHCTE0Ci0jZGVmaW5lCU1BWF9DSEFOTkVMX05VTV81RwkyNAotI2RlZmluZQlNQVhfQ0hBTk5FTF9OVU0JCTM4LyogMTQrMjQgKi8KLQotLyogZGVmaW5lIE5VTV9SRUdVTEFUT1JZUwkyMSAqLwotI2RlZmluZSBOVU1fUkVHVUxBVE9SWVMJMQotCi0vKiBDb3VudHJ5IGNvZGVzICovCi0jZGVmaW5lIFVTQQkJMHg1NTUzMjAKLSNkZWZpbmUgRVVST1BFCQkweDEgLyogdGVtcCwgc2hvdWxkIGJlIHByb3ZpZGVkIGxhdGVyICovCi0jZGVmaW5lIEpBUEFOCQkweDIgLyogdGVtcCwgc2hvdWxkIGJlIHByb3ZpZGVkIGxhdGVyICovCi0KLXN0cnVjdAlyZWd1bGF0b3J5X2NsYXNzIHsKLQl1MzIJc3RhcnRpbmdfZnJlcTsJCQkJCS8qIE1IeiwgKi8KLQl1OAljaGFubmVsX3NldFtNQVhfQ0hBTk5FTF9OVU1dOwotCXU4CWNoYW5uZWxfY2NrX3Bvd2VyW01BWF9DSEFOTkVMX05VTV07LyogZGJtICovCi0JdTgJY2hhbm5lbF9vZmRtX3Bvd2VyW01BWF9DSEFOTkVMX05VTV07LyogZGJtICovCi0JdTgJdHhwb3dlcl9saW1pdDsJCQkJCS8qIGRibSAqLwotCXU4CWNoYW5uZWxfc3BhY2luZzsJCQkJLyogTUh6ICovCi0JdTgJbW9kZW07Ci19OwotCi1lbnVtIHsKLQljRVNTCQk9IDB4MDAwMSwKLQljSUJTUwkJPSAweDAwMDIsCi0JY1BvbGxhYmxlCT0gMHgwMDA0LAotCWNQb2xsUmVxCT0gMHgwMDA4LAotCWNQcml2YWN5CT0gMHgwMDEwLAotCWNTaG9ydFByZWFtYmxlCT0gMHgwMDIwLAotCWNQQkNDCQk9IDB4MDA0MCwKLQljQ2hhbm5lbEFnaWxpdHkJPSAweDAwODAsCi0JY1NwZWN0cnVtTWdudAk9IDB4MDEwMCwKLQljUW9zCQk9IDB4MDIwMCwJLyogIEZvciBIQ0NBLCB1c2Ugd2l0aCBDRi1Qb2xsYWJsZSBhbmQgQ0YtUG9sbFJlcSAqLwotCWNTaG9ydFNsb3RUaW1lCT0gMHgwNDAwLAotCWNBUFNECQk9IDB4MDgwMCwKLQljUk0JCT0gMHgxMDAwLAkvKiAgUlJNIChSYWRpbyBSZXF1ZXN0IE1lYXN1cmVtZW50KSAqLwotCWNEU1NTX09GRE0JPSAweDIwMDAsCi0JY0RlbGF5ZWRCQQk9IDB4NDAwMCwKLQljSW1tZWRpYXRlQkEJPSAweDgwMDAsCi19OwotCi1lbnVtIHsKLQlQUkVBTUJMRV9MT05HCT0gMSwKLQlQUkVBTUJMRV9BVVRPCT0gMiwKLQlQUkVBTUJMRV9TSE9SVAk9IDMsCi19OwotCi0vKiAgQmFuZHdpZHRoIE9mZnNldCAqLwotI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFCTAKLSNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSCTEKLSNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSCTIKLQotLyogIFJlcHJlc2VudCBDaGFubmVsIFdpZHRoIGluIEhUIENhcGFiaWxpdGllcyAqLwotZW51bSBodF9jaGFubmVsX3dpZHRoIHsKLQlIVF9DSEFOTkVMX1dJRFRIXzIwID0gMCwKLQlIVF9DSEFOTkVMX1dJRFRIXzQwID0gMSwKLQlIVF9DSEFOTkVMX1dJRFRIXzgwID0gMiwKLQlIVF9DSEFOTkVMX1dJRFRIXzE2MCA9IDMsCi0JSFRfQ0hBTk5FTF9XSURUSF8xMCA9IDQsCi19OwotCi0vKiAyMDA3LzExLzE1IE1IIERlZmluZSBkaWZmZXJlbnQgUkYgdHlwZS4gKi8KLWVudW0gewotCVJGXzFUMlIgPSAwLAotCVJGXzJUNFIgPSAxLAotCVJGXzJUMlIgPSAyLAotCVJGXzFUMVIgPSAzLAotCVJGXzJUMlJfR1JFRU4gPSA0LAotCVJGXzgxOVhfTUFYX1RZUEUgPSA1LAotfTsKLQotI2VuZGlmIC8qIF9SVEw4NzExX1JGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3NlY3VyaXR5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3NlY3VyaXR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNGE5ZDcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19zZWN1cml0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1JUV19TRUNVUklUWV9IXwotI2RlZmluZSBfX1JUV19TRUNVUklUWV9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPG5ldC9saWI4MDIxMS5oPgotCi0KLSNkZWZpbmUgaXNfd2VwX2VuYyhhbGcpIChhbGcgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwgXAotCQkJIGFsZyA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpCi0KLSNkZWZpbmUgU0hBMjU2X01BQ19MRU4gMzIKLSNkZWZpbmUgQUVTX0JMT0NLX1NJWkUgMTYKLSNkZWZpbmUgQUVTX1BSSVZfU0laRSAoNCAqIDQ0KQotCi1lbnVtIEVOQ1JZUF9QUk9UT0NPTCB7Ci0JRU5DUllQX1BST1RPQ09MX09QRU5TWVMsICAgLyogb3BlbiBzeXN0ZW0gKi8KLQlFTkNSWVBfUFJPVE9DT0xfV0VQLCAgICAgICAvKiBXRVAgKi8KLQlFTkNSWVBfUFJPVE9DT0xfV1BBLCAgICAgICAvKiBXUEEgKi8KLQlFTkNSWVBfUFJPVE9DT0xfV1BBMiwgICAgICAvKiBXUEEyICovCi0JRU5DUllQX1BST1RPQ09MX01BWAotfTsKLQotI2lmbmRlZiBOZGlzODAyXzExQXV0aE1vZGVXUEEyCi0jZGVmaW5lIE5kaXM4MDJfMTFBdXRoTW9kZVdQQTIgKE5kaXM4MDJfMTFBdXRoTW9kZVdQQU5vbmUgKyAxKQotI2VuZGlmCi0KLSNpZm5kZWYgTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSwotI2RlZmluZSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLIChOZGlzODAyXzExQXV0aE1vZGVXUEFOb25lICsgMikKLSNlbmRpZgotCi11bmlvbiBwbjQ4IHsKLQl1NjQJdmFsOwotCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOCi0KLXN0cnVjdCB7Ci0JdTggVFNDMDsKLQl1OCBUU0MxOwotCXU4IFRTQzI7Ci0JdTggVFNDMzsKLQl1OCBUU0M0OwotCXU4IFRTQzU7Ci0JdTggVFNDNjsKLQl1OCBUU0M3OwotfSBfYnl0ZV87Ci0KLSNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCi1zdHJ1Y3QgewotCXU4IFRTQzc7Ci0JdTggVFNDNjsKLQl1OCBUU0M1OwotCXU4IFRTQzQ7Ci0JdTggVFNDMzsKLQl1OCBUU0MyOwotCXU4IFRTQzE7Ci0JdTggVFNDMDsKLX0gX2J5dGVfOwotI2Vsc2UKLSNlcnJvciBOZWVkIEJJRyBvciBMSVRUTEUgZW5kaWFuCi0KLSNlbmRpZgotCi19OwotCi11bmlvbiBLZXl0eXBlIHsKLQl1OCAgIHNrZXlbMTZdOwotCXUzMiAgICBsa2V5WzRdOwotfTsKLQotc3RydWN0IHJ0d193ZXBfa2V5IHsKLQl1OCBrZXlbV0xBTl9LRVlfTEVOX1dFUDEwNCArIDFdOyAvKiAxNCAqLwotCXUxNiBrZXlsZW47Ci19OwotCi1zdHJ1Y3QgcnRfcG1raWRfbGlzdCB7Ci0JdTgJYlVzZWQ7Ci0JdTgJQnNzaWRbNl07Ci0JdTgJUE1LSURbMTZdOwotCXU4CVNzaWRCdWZbMzNdOwotCXU4CSpzc2lkX29jdGV0OwotCXUxNglzc2lkX2xlbmd0aDsKLX07Ci0KLXN0cnVjdCBzZWN1cml0eV9wcml2IHsKLQl1MzIJICBkb3QxMUF1dGhBbGdydGhtOwkvKiAgODAyLjExIGF1dGgsIGNvdWxkIGJlIG9wZW4sIHNoYXJlZCwKLQkJCQkJICogODAyMXggYW5kIGF1dGhzd2l0Y2ggKi8KLQl1MzIJICBkb3QxMVByaXZhY3lBbGdydGhtOwkvKiBUaGlzIHNwZWNpZmllcyB0aGUgcHJpdmFjeSBmb3IKLQkJCQkJICogc2hhcmVkIGF1dGguIGFsZ29yaXRobS4KLQkJCQkJICovCi0JLyogV0VQICovCi0JdTMyCSAgZG90MTFQcml2YWN5S2V5SW5kZXg7CS8qICB0aGlzIGlzIG9ubHkgdmFsaWQgZm9yIGxlZ2VuZGFyeQotCQkJCQkgKiB3ZXAsIDB+MyBmb3Iga2V5IGlkLiAodHgga2V5IGluZGV4KQotCQkJCQkgKi8KLQlzdHJ1Y3QgcnR3X3dlcF9rZXkgd2VwX2tleVtOVU1fV0VQX0tFWVNdOwotCi0JdTMyIGRvdDExODAyMVhHcnBQcml2YWN5OwkvKiBzcGVjaWZ5IHRoZSBwcml2YWN5IGFsZ3RobS4KLQkJCQkJICogdXNlZCBmb3IgR3JwIGtleQotCQkJCQkgKi8KLQl1MzIJZG90MTE4MDIxWEdycEtleWlkOwkvKiAga2V5IGlkIHVzZWQgZm9yIEdycCBLZXkKLQkJCQkJICogKHR4IGtleSBpbmRleCkKLQkJCQkJICovCi0JdW5pb24gS2V5dHlwZQlkb3QxMTgwMjFYR3JwS2V5WzRdOy8qIDgwMi4xeCBHcnAgS2V5LCBpbngwIGFuZCBpbngxICovCi0JdW5pb24gS2V5dHlwZQlkb3QxMTgwMjFYR3JwdHhtaWNrZXlbNF07Ci0JdW5pb24gS2V5dHlwZQlkb3QxMTgwMjFYR3JwcnhtaWNrZXlbNF07Ci0JdW5pb24gcG40OAlkb3QxMUdycHR4cG47CQkvKiBQTjQ4IHVzZWQgZm9yIEdycCBLZXkgeG1pdC4qLwotCXVuaW9uIHBuNDgJZG90MTFHcnByeHBuOwkJLyogUE40OCB1c2VkIGZvciBHcnAgS2V5IHJlY3YuKi8KLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCS8qIGV4dGVuZCBzZWN1cml0eSBjYXBhYmlsaXRpZXMgZm9yIEFQX01PREUgKi8KLQl1bnNpZ25lZCBpbnQgZG90ODAyMXhhbGc7LyogMDpkaXNhYmxlLCAxOnBzaywgMjo4MDIuMXggKi8KLQl1bnNpZ25lZCBpbnQgd3BhX3BzazsvKiAwOmRpc2FibGUsIGJpdCgwKTogV1BBLCBiaXQoMSk6V1BBMiAqLwotCXVuc2lnbmVkIGludCB3cGFfZ3JvdXBfY2lwaGVyOwotCXVuc2lnbmVkIGludCB3cGEyX2dyb3VwX2NpcGhlcjsKLQl1bnNpZ25lZCBpbnQgd3BhX3BhaXJ3aXNlX2NpcGhlcjsKLQl1bnNpZ25lZCBpbnQgd3BhMl9wYWlyd2lzZV9jaXBoZXI7Ci0jZW5kaWYKLQotCXU4IHdwc19pZVtNQVhfV1BTX0lFX0xFTl07LyogYWRkZWQgaW4gYXNzb2MgcmVxICovCi0JaW50IHdwc19pZV9sZW47Ci0JdW5zaWduZWQgaW50IGJpbnN0YWxsR3Jwa2V5OjE7Ci0JdW5zaWduZWQgaW50IGJ1c2V0a2lwa2V5OjE7Ci0JdW5zaWduZWQgaW50IGJjaGVja19ncnBrZXk6MTsKLQl1bnNpZ25lZCBpbnQgaHdfZGVjcnlwdGVkOjE7Ci0JdTMyIG5kaXNhdXRodHlwZTsJLyogIGVudW0gbmRpc184MDJfMTFfYXV0aF9tb2RlICovCi0JdTMyIG5kaXNlbmNyeXB0c3RhdHVzOwkvKiAgTkRJU184MDJfMTFfRU5DUllQVElPTl9TVEFUVVMgKi8KLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCBzZWNfYnNzOyAgLyogZm9yIGpvaW5ic3MgKGgyYyBidWZmZXIpIHVzYWdlICovCi0JdTggYXNzb2NfaW5mb1s2MDBdOwotCXU4IHN6b2ZjYXBhYmlsaXR5WzI1Nl07IC8qIGZvciB3cGEyIHVzYWdlICovCi0JdTggb2lkYXNzb2NpYXRpb25bNTEyXTsgLyogZm9yIHdwYS93cGEyIHVzYWdlICovCi0JdTggc3VwcGxpY2FudF9pZVsyNTZdOyAgLyogc3RvcmUgc3RhIHNlY3VyaXR5IGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KLQotCS8qIGZvciB0a2lwIGNvdW50ZXJtZWFzdXJlICovCi0JdW5zaWduZWQgbG9uZyBsYXN0X21pY19lcnJfdGltZTsKLQl1OAlidGtpcF9jb3VudGVybWVhc3VyZTsKLQl1OAlidGtpcF93YWl0X3JlcG9ydDsKLQl1bnNpZ25lZCBsb25nIGJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWU7Ci0KLQkvKiAgRm9yIFdQQTIgUHJlLUF1dGhlbnRpY2F0aW9uLiAqLwotCXN0cnVjdCBydF9wbWtpZF9saXN0IFBNS0lETGlzdFtOVU1fUE1LSURfQ0FDSEVdOwotCXU4IFBNS0lESW5kZXg7Ci0JdTggYldlcERlZmF1bHRLZXlJZHhTZXQ7Ci19OwotCi1zdHJ1Y3Qgc2hhMjU2X3N0YXRlIHsKLQl1NjQgbGVuZ3RoOwotCXUzMiBzdGF0ZVs4XSwgY3VybGVuOwotCXU4IGJ1Zls2NF07Ci19OwotCi0jZGVmaW5lIEdFVF9FTkNSWV9BTEdPKHBzZWN1cml0eXByaXYsIHBzdGEsIGVuY3J5X2FsZ28sIGJtY3N0KVwKLWRvIHtcCi0Jc3dpdGNoIChwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtKSB7XAotCWNhc2UgZG90MTFBdXRoQWxncnRobV9PcGVuOlwKLQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fU2hhcmVkOlwKLQljYXNlIGRvdDExQXV0aEFsZ3J0aG1fQXV0bzpcCi0JCWVuY3J5X2FsZ28gPSBwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtO1wKLQkJYnJlYWs7XAotCWNhc2UgZG90MTFBdXRoQWxncnRobV84MDIxWDpcCi0JCWlmIChibWNzdClcCi0JCQllbmNyeV9hbGdvID0gcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3k7XAotCQllbHNlXAotCQkJZW5jcnlfYWxnbyA9IHBzdGEtPmRvdDExODAyMVhQcml2YWN5O1wKLQkJYnJlYWs7XAotCX0JXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBHRVRfVEtJUF9QTihpdiwgZG90MTF0eHBuKVwKLWRvIHtcCi0JZG90MTF0eHBuLl9ieXRlXy5UU0MwID0gaXZbMl07XAotCWRvdDExdHhwbi5fYnl0ZV8uVFNDMSA9IGl2WzBdO1wKLQlkb3QxMXR4cG4uX2J5dGVfLlRTQzIgPSBpdls0XTtcCi0JZG90MTF0eHBuLl9ieXRlXy5UU0MzID0gaXZbNV07XAotCWRvdDExdHhwbi5fYnl0ZV8uVFNDNCA9IGl2WzZdO1wKLQlkb3QxMXR4cG4uX2J5dGVfLlRTQzUgPSBpdls3XTtcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFJPTDMyKEEsIG4pICAoKChBKSA8PCAobikpIHwgKCgoQSk+PigzMi0obikpKSAgJiAoKDFVTCA8PCAobikpIC0gMSkpKQotI2RlZmluZSBST1IzMihBLCBuKSAgUk9MMzIoKEEpLCAzMi0obikpCi0KLXN0cnVjdCBtaWNfZGF0YSB7Ci0JdTMyICBLMCwgSzE7ICAgICAgICAgLyogIEtleSAqLwotCXUzMiAgTCwgUjsgICAgICAgICAgIC8qICBDdXJyZW50IHN0YXRlICovCi0JdTMyICBNOyAgICAgICAgICAgICAgLyogIE1lc3NhZ2UgYWNjdW11bGF0b3IgKHNpbmdsZSB3b3JkKSAqLwotCXUzMiAgICAgbkJ5dGVzSW5NOyAgICAgIC8qICAjIGJ5dGVzIGluIE0gKi8KLX07Ci0KLWV4dGVybiBjb25zdCB1MzIgVGUwWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRlMVsyNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiBUZTJbMjU2XTsKLWV4dGVybiBjb25zdCB1MzIgVGUzWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRlNFsyNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiBUZDBbMjU2XTsKLWV4dGVybiBjb25zdCB1MzIgVGQxWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRkMlsyNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiBUZDNbMjU2XTsKLWV4dGVybiBjb25zdCB1MzIgVGQ0WzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIHJjb25bMTBdOwotZXh0ZXJuIGNvbnN0IHU4IFRkNHNbMjU2XTsKLWV4dGVybiBjb25zdCB1OCByY29uc1sxMF07Ci0KLSNkZWZpbmUgUkNPTihpKSAocmNvbnNbKGkpXSA8PCAyNCkKLQotc3RhdGljIGlubGluZSB1MzIgcm90cih1MzIgdmFsLCBpbnQgYml0cykKLXsKLQlyZXR1cm4gKHZhbCA+PiBiaXRzKSB8ICh2YWwgPDwgKDMyIC0gYml0cykpOwotfQotCi0jZGVmaW5lIFRFMChpKSBUZTBbKChpKSA+PiAyNCkgJiAweGZmXQotI2RlZmluZSBURTEoaSkgcm90cihUZTBbKChpKSA+PiAxNikgJiAweGZmXSwgOCkKLSNkZWZpbmUgVEUyKGkpIHJvdHIoVGUwWygoaSkgPj4gOCkgJiAweGZmXSwgMTYpCi0jZGVmaW5lIFRFMyhpKSByb3RyKFRlMFsoaSkgJiAweGZmXSwgMjQpCi0jZGVmaW5lIFRFNDEoaSkgKChUZTBbKChpKSA+PiAyNCkgJiAweGZmXSA8PCA4KSAmIDB4ZmYwMDAwMDApCi0jZGVmaW5lIFRFNDIoaSkgKFRlMFsoKGkpID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkKLSNkZWZpbmUgVEU0MyhpKSAoVGUwWygoaSkgPj4gOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApCi0jZGVmaW5lIFRFNDQoaSkgKChUZTBbKGkpICYgMHhmZl0gPj4gOCkgJiAweDAwMDAwMGZmKQotI2RlZmluZSBURTQyMShpKSAoKFRlMFsoKGkpID4+IDE2KSAmIDB4ZmZdIDw8IDgpICYgMHhmZjAwMDAwMCkKLSNkZWZpbmUgVEU0MzIoaSkgKFRlMFsoKGkpID4+IDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKQotI2RlZmluZSBURTQ0MyhpKSAoVGUwWyhpKSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkKLSNkZWZpbmUgVEU0MTQoaSkgKChUZTBbKChpKSA+PiAyNCkgJiAweGZmXSA+PiA4KSAmIDB4MDAwMDAwZmYpCi0jZGVmaW5lIFRFNChpKSAoKFRlMFsoaSldID4+IDgpICYgMHgwMDAwMDBmZikKLQotI2RlZmluZSBURDAoaSkgVGQwWygoaSkgPj4gMjQpICYgMHhmZl0KLSNkZWZpbmUgVEQxKGkpIHJvdHIoVGQwWygoaSkgPj4gMTYpICYgMHhmZl0sIDgpCi0jZGVmaW5lIFREMihpKSByb3RyKFRkMFsoKGkpID4+IDgpICYgMHhmZl0sIDE2KQotI2RlZmluZSBURDMoaSkgcm90cihUZDBbKGkpICYgMHhmZl0sIDI0KQotI2RlZmluZSBURDQxKGkpIChUZDRzWygoaSkgPj4gMjQpICYgMHhmZl0gPDwgMjQpCi0jZGVmaW5lIFRENDIoaSkgKFRkNHNbKChpKSA+PiAxNikgJiAweGZmXSA8PCAxNikKLSNkZWZpbmUgVEQ0MyhpKSAoVGQ0c1soKGkpID4+IDgpICYgMHhmZl0gPDwgOCkKLSNkZWZpbmUgVEQ0NChpKSAoVGQ0c1soaSkgJiAweGZmXSkKLSNkZWZpbmUgVEQwXyhpKSBUZDBbKGkpICYgMHhmZl0KLSNkZWZpbmUgVEQxXyhpKSByb3RyKFRkMFsoaSkgJiAweGZmXSwgOCkKLSNkZWZpbmUgVEQyXyhpKSByb3RyKFRkMFsoaSkgJiAweGZmXSwgMTYpCi0jZGVmaW5lIFREM18oaSkgcm90cihUZDBbKGkpICYgMHhmZl0sIDI0KQotCi0jZGVmaW5lIEdFVFUzMihwdCkgKCgodTMyKShwdClbMF0gPDwgMjQpIF4gKCh1MzIpKHB0KVsxXSA8PCAxNikgXiBcCi0JCQkoKHUzMikocHQpWzJdIDw8ICA4KSBeICgodTMyKShwdClbM10pKQotCi0jZGVmaW5lIFBVVFUzMihjdCwgc3QpIHsgXAotKGN0KVswXSA9ICh1OCkoKHN0KSA+PiAyNCk7IChjdClbMV0gPSAodTgpKChzdCkgPj4gMTYpOyBcCi0oY3QpWzJdID0gKHU4KSgoc3QpID4+ICA4KTsgKGN0KVszXSA9ICh1OCkoc3QpOyB9Ci0KLSNkZWZpbmUgV1BBX0dFVF9CRTMyKGEpICgoKCh1MzIpIChhKVswXSkgPDwgMjQpIHwgKCgodTMyKSAoYSlbMV0pIDw8IDE2KSB8IFwKLQkJCSAoKCh1MzIpIChhKVsyXSkgPDwgOCkgfCAoKHUzMikgKGEpWzNdKSkKLQotI2RlZmluZSBXUEFfUFVUX0xFMTYoYSwgdmFsKQkJCVwKLQlkbyB7CQkJCQlcCi0JCShhKVsxXSA9ICgodTE2KSAodmFsKSkgPj4gODsJXAotCQkoYSlbMF0gPSAoKHUxNikgKHZhbCkpICYgMHhmZjsJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgV1BBX1BVVF9CRTMyKGEsIHZhbCkJCQkJCVwKLQlkbyB7CQkJCQkJCVwKLQkJKGEpWzBdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gMjQpICYgMHhmZik7CVwKLQkJKGEpWzFdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gMTYpICYgMHhmZik7CVwKLQkJKGEpWzJdID0gKHU4KSAoKCgodTMyKSAodmFsKSkgPj4gOCkgJiAweGZmKTsJXAotCQkoYSlbM10gPSAodTgpICgoKHUzMikgKHZhbCkpICYgMHhmZik7CQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBXUEFfUFVUX0JFNjQoYSwgdmFsKQkJCQlcCi0JZG8gewkJCQkJCVwKLQkJKGEpWzBdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA1Nik7CVwKLQkJKGEpWzFdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA0OCk7CVwKLQkJKGEpWzJdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA0MCk7CVwKLQkJKGEpWzNdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiAzMik7CVwKLQkJKGEpWzRdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiAyNCk7CVwKLQkJKGEpWzVdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiAxNik7CVwKLQkJKGEpWzZdID0gKHU4KSAoKCh1NjQpICh2YWwpKSA+PiA4KTsJXAotCQkoYSlbN10gPSAodTgpICgoKHU2NCkgKHZhbCkpICYgMHhmZik7CVwKLQl9IHdoaWxlICgwKQotCi0vKiA9PT09PSBzdGFydCAtIHB1YmxpYyBkb21haW4gU0hBMjU2IGltcGxlbWVudGF0aW9uID09PT09ICovCi0KLS8qIFRoaXMgaXMgYmFzZWQgb24gU0hBMjU2IGltcGxlbWVudGF0aW9uIGluIExpYlRvbUNyeXB0IHRoYXQgd2FzIHJlbGVhc2VkIGludG8KLSAqIHB1YmxpYyBkb21haW4gYnkgVG9tIFN0IERlbmlzLiAqLwotCi0vKiB0aGUgSyBhcnJheSAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgS1s2NF0gPSB7Ci0JMHg0MjhhMmY5OFVMLCAweDcxMzc0NDkxVUwsIDB4YjVjMGZiY2ZVTCwgMHhlOWI1ZGJhNVVMLCAweDM5NTZjMjViVUwsCi0JMHg1OWYxMTFmMVVMLCAweDkyM2Y4MmE0VUwsIDB4YWIxYzVlZDVVTCwgMHhkODA3YWE5OFVMLCAweDEyODM1YjAxVUwsCi0JMHgyNDMxODViZVVMLCAweDU1MGM3ZGMzVUwsIDB4NzJiZTVkNzRVTCwgMHg4MGRlYjFmZVVMLCAweDliZGMwNmE3VUwsCi0JMHhjMTliZjE3NFVMLCAweGU0OWI2OWMxVUwsIDB4ZWZiZTQ3ODZVTCwgMHgwZmMxOWRjNlVMLCAweDI0MGNhMWNjVUwsCi0JMHgyZGU5MmM2ZlVMLCAweDRhNzQ4NGFhVUwsIDB4NWNiMGE5ZGNVTCwgMHg3NmY5ODhkYVVMLCAweDk4M2U1MTUyVUwsCi0JMHhhODMxYzY2ZFVMLCAweGIwMDMyN2M4VUwsIDB4YmY1OTdmYzdVTCwgMHhjNmUwMGJmM1VMLCAweGQ1YTc5MTQ3VUwsCi0JMHgwNmNhNjM1MVVMLCAweDE0MjkyOTY3VUwsIDB4MjdiNzBhODVVTCwgMHgyZTFiMjEzOFVMLCAweDRkMmM2ZGZjVUwsCi0JMHg1MzM4MGQxM1VMLCAweDY1MGE3MzU0VUwsIDB4NzY2YTBhYmJVTCwgMHg4MWMyYzkyZVVMLCAweDkyNzIyYzg1VUwsCi0JMHhhMmJmZThhMVVMLCAweGE4MWE2NjRiVUwsIDB4YzI0YjhiNzBVTCwgMHhjNzZjNTFhM1VMLCAweGQxOTJlODE5VUwsCi0JMHhkNjk5MDYyNFVMLCAweGY0MGUzNTg1VUwsIDB4MTA2YWEwNzBVTCwgMHgxOWE0YzExNlVMLCAweDFlMzc2YzA4VUwsCi0JMHgyNzQ4Nzc0Y1VMLCAweDM0YjBiY2I1VUwsIDB4MzkxYzBjYjNVTCwgMHg0ZWQ4YWE0YVVMLCAweDViOWNjYTRmVUwsCi0JMHg2ODJlNmZmM1VMLCAweDc0OGY4MmVlVUwsIDB4NzhhNTYzNmZVTCwgMHg4NGM4NzgxNFVMLCAweDhjYzcwMjA4VUwsCi0JMHg5MGJlZmZmYVVMLCAweGE0NTA2Y2ViVUwsIDB4YmVmOWEzZjdVTCwgMHhjNjcxNzhmMlVMCi19OwotCi12b2lkIHJ0d19zZWNtaWNzZXRrZXkyM2Eoc3RydWN0IG1pY19kYXRhICpwbWljZGF0YSwgdTggKmtleSk7Ci12b2lkIHJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4IGIpOwotdm9pZCBydHdfc2VjbWljYXBwZW5kMjNhKHN0cnVjdCBtaWNfZGF0YSAqcG1pY2RhdGEsIHU4ICpzcmMsIHUzMiBuYkJ5dGVzKTsKLXZvaWQgcnR3X3NlY2dldG1pYzIzYShzdHJ1Y3QgbWljX2RhdGEgKnBtaWNkYXRhLCB1OCAqZHN0KTsKLQotdm9pZCBydHdfc2VjY2FsY3RraXBtaWMyM2EodTggKmtleSwgdTggKmhlYWRlciwgdTggKmRhdGEsIHUzMiBkYXRhX2xlbiwKLQkJCXU4ICpNaWNjb2RlLCB1OCBwcmlvcml0eWkpOwotCi1pbnQgcnR3X2Flc19lbmNyeXB0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci1pbnQgcnR3X3RraXBfZW5jcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKLXZvaWQgcnR3X3dlcF9lbmNyeXB0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCSAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwotaW50IHJ0d19hZXNfZGVjcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgc3RydWN0IHJlY3ZfZnJhbWUgKnByZWN2ZnJhbWUpOwotaW50IHJ0d190a2lwX2RlY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSk7Ci12b2lkIHJ0d193ZXBfZGVjcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSk7Ci0KLXZvaWQgcnR3X3VzZV90a2lwa2V5X2hhbmRsZXIyM2Eodm9pZCAqRnVuY3Rpb25Db250ZXh0KTsKLQotI2VuZGlmCS8qIF9fUlRMODcxWF9TRUNVUklUWV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19zcmVzZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfc3Jlc2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZmE4MjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19zcmVzZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfUlRXX1NSRVNFVF9DXwotI2RlZmluZSBfUlRXX1NSRVNFVF9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi1zdHJ1Y3Qgc3Jlc2V0X3ByaXYgewotCXN0cnVjdCBtdXRleAlzaWxlbnRyZXNldF9tdXRleDsKLQl1OAlzaWxlbnRfcmVzZXRfaW5wcm9ncmVzczsKLQl1bnNpZ25lZCBsb25nIGxhc3RfdHhfdGltZTsKLQl1bnNpZ25lZCBsb25nIGxhc3RfdHhfY29tcGxldGVfdGltZTsKLX07Ci0KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotdm9pZCBydHdfc3Jlc2V0X2luaXQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci12b2lkIHJ0d19zcmVzZXRfcmVzZXRfdmFsdWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1ib29sIHJ0d19zcmVzZXRfaW5wcm9ncmVzcyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgc3Jlc2V0X3NldF90cmlnZ2VyX3BvaW50KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHMzMiB0Z3ApOwotdm9pZCBydHdfc3Jlc2V0X3Jlc2V0KHN0cnVjdCBydHdfYWRhcHRlciAqYWN0aXZlX2FkYXB0ZXIpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfdmVyc2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d192ZXJzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDc3MzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d192ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jZGVmaW5lIERSSVZFUlZFUlNJT04JInY0LjEuNl83MzM2LjIwMTMwNDI2IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d194bWl0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3htaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3ZDZkMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X3htaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX1JUV19YTUlUX0hfCi0jZGVmaW5lIF9SVFdfWE1JVF9IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotCi0jZGVmaW5lIE1BWF9YTUlUQlVGX1NaCQkyMDQ4Ci0jZGVmaW5lIE5SX1hNSVRCVUZGCQk0Ci0KLSNkZWZpbmUgWE1JVEJVRl9BTElHTl9TWgk1MTIKLQotLyogIHhtaXQgZXh0ZW5zaW9uIGJ1ZmYgZGVmaW5hdGlvbiAqLwotI2RlZmluZSBNQVhfWE1JVF9FWFRCVUZfU1oJMTUzNgotI2RlZmluZSBOUl9YTUlUX0VYVEJVRkYJCTMyCi0KLSNkZWZpbmUgTUFYX05VTUJMS1MJCTEKLQotI2RlZmluZSBYTUlUX1ZPX1FVRVVFCQkwCi0jZGVmaW5lIFhNSVRfVklfUVVFVUUJCTEKLSNkZWZpbmUgWE1JVF9CRV9RVUVVRQkJMgotI2RlZmluZSBYTUlUX0JLX1FVRVVFCQkzCi0KLSNkZWZpbmUgVk9fUVVFVUVfSU5YCQkwCi0jZGVmaW5lIFZJX1FVRVVFX0lOWAkJMQotI2RlZmluZSBCRV9RVUVVRV9JTlgJCTIKLSNkZWZpbmUgQktfUVVFVUVfSU5YCQkzCi0jZGVmaW5lIEJDTl9RVUVVRV9JTlgJCTQKLSNkZWZpbmUgTUdUX1FVRVVFX0lOWAkJNQotI2RlZmluZSBISUdIX1FVRVVFX0lOWAkJNgotI2RlZmluZSBUWENNRF9RVUVVRV9JTlgJCTcKLQotI2RlZmluZSBIV19RVUVVRV9FTlRSWQkJOAotCi0jZGVmaW5lIFdFUF9JVihwYXR0cmliX2l2LCBkb3QxMXR4cG4sIGtleWlkeCkJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlwYXR0cmliX2l2WzBdID0gZG90MTF0eHBuLl9ieXRlXy5UU0MwOwkJCQlcCi0JcGF0dHJpYl9pdlsxXSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMTsJCQkJXAotCXBhdHRyaWJfaXZbMl0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzI7CQkJCVwKLQlwYXR0cmliX2l2WzNdID0gKChrZXlpZHggJiAweDMpIDw8IDYpOwkJCQlcCi0JZG90MTF0eHBuLnZhbCA9IChkb3QxMXR4cG4udmFsID09IDB4ZmZmZmZmKSA/IDAgOgkJXAotCQkJIChkb3QxMXR4cG4udmFsKzEpOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFRLSVBfSVYocGF0dHJpYl9pdiwgZG90MTF0eHBuLCBrZXlpZHgpCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JcGF0dHJpYl9pdlswXSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMTsJCQkJXAotCXBhdHRyaWJfaXZbMV0gPSAoZG90MTF0eHBuLl9ieXRlXy5UU0MxIHwgMHgyMCkgJiAweDdmOwkJXAotCXBhdHRyaWJfaXZbMl0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzA7CQkJCVwKLQlwYXR0cmliX2l2WzNdID0gQklUKDUpIHwgKChrZXlpZHggJiAweDMpPDw2KTsJCQlcCi0JcGF0dHJpYl9pdls0XSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMjsJCQkJXAotCXBhdHRyaWJfaXZbNV0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzM7CQkJCVwKLQlwYXR0cmliX2l2WzZdID0gZG90MTF0eHBuLl9ieXRlXy5UU0M0OwkJCQlcCi0JcGF0dHJpYl9pdls3XSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDNTsJCQkJXAotCWRvdDExdHhwbi52YWwgPSBkb3QxMXR4cG4udmFsID09IDB4ZmZmZmZmZmZmZmZmVUxMID8gMCA6CVwKLQkJCQkJIChkb3QxMXR4cG4udmFsKzEpOwkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBBRVNfSVYocGF0dHJpYl9pdiwgZG90MTF0eHBuLCBrZXlpZHgpXAotZG8gewkJCQkJCQkJCVwKLQlwYXR0cmliX2l2WzBdID0gZG90MTF0eHBuLl9ieXRlXy5UU0MwOwkJCQlcCi0JcGF0dHJpYl9pdlsxXSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMTsJCQkJXAotCXBhdHRyaWJfaXZbMl0gPSAwOwkJCQkJCVwKLQlwYXR0cmliX2l2WzNdID0gQklUKDUpIHwgKChrZXlpZHggJiAweDMpIDw8IDYpOwkJCVwKLQlwYXR0cmliX2l2WzRdID0gZG90MTF0eHBuLl9ieXRlXy5UU0MyOwkJCQlcCi0JcGF0dHJpYl9pdls1XSA9IGRvdDExdHhwbi5fYnl0ZV8uVFNDMzsJCQkJXAotCXBhdHRyaWJfaXZbNl0gPSBkb3QxMXR4cG4uX2J5dGVfLlRTQzQ7CQkJCVwKLQlwYXR0cmliX2l2WzddID0gZG90MTF0eHBuLl9ieXRlXy5UU0M1OwkJCQlcCi0JZG90MTF0eHBuLnZhbCA9IGRvdDExdHhwbi52YWwgPT0gMHhmZmZmZmZmZmZmZmZVTEwgPyAwIDoJXAotCQkJCQkgKGRvdDExdHhwbi52YWwrMSk7CQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIEhXWE1JVF9FTlRSWQk0Ci0KLSNkZWZpbmUgVFhERVNDX1NJWkUgMzIKLQotI2RlZmluZSBQQUNLRVRfT0ZGU0VUX1NaIDgKLSNkZWZpbmUgVFhERVNDX09GRlNFVCAoVFhERVNDX1NJWkUgKyBQQUNLRVRfT0ZGU0VUX1NaKQotCi1zdHJ1Y3QgdHhfZGVzYyB7Ci0JLyogRFdPUkQgMCAqLwotCV9fbGUzMiB0eGR3MDsKLQlfX2xlMzIgdHhkdzE7Ci0JX19sZTMyIHR4ZHcyOwotCV9fbGUzMiB0eGR3MzsKLQlfX2xlMzIgdHhkdzQ7Ci0JX19sZTMyIHR4ZHc1OwotCV9fbGUzMiB0eGR3NjsKLQlfX2xlMzIgdHhkdzc7Ci19OwotCi11bmlvbiB0eGRlc2MgewotCXN0cnVjdCB0eF9kZXNjIHR4ZGVzYzsKLQl1bnNpZ25lZCBpbnQgdmFsdWVbVFhERVNDX1NJWkU+PjJdOwotfTsKLQotc3RydWN0CWh3X3htaXQJewotCXN0cnVjdCBydHdfcXVldWUgKnN0YV9xdWV1ZTsKLQlpbnQJYWNjbnQ7Ci19OwotCi0vKiByZWR1Y2Ugc2l6ZSAqLwotc3RydWN0IHBrdF9hdHRyaWIgewotCXUxNgl0eXBlOwotCXU4CWJzd2VuYzsKLQl1OAlkaGNwX3BrdDsKLQl1MTYJZXRoZXJfdHlwZTsKLQl1MTYJc2VxbnVtOwotCXUxNglwa3RfaGRybGVuOwkvKiB0aGUgb3JpZ2luYWwgODAyLjMgcGt0IGhlYWRlciBsZW4gKi8KLQl1MTYJaGRybGVuOwkJLyogdGhlIFdMQU4gSGVhZGVyIExlbiAqLwotCXUzMglwa3RsZW47CQkvKiB0aGUgb3JpZ2luYWwgODAyLjMgcGt0IHJhd19kYXRhIGxlbiAqLwotCXUzMglsYXN0X3R4Y21kc3o7Ci0JdTMyCWVuY3J5cHQ7CS8qIHdoZW4gMCBpbmRpY2F0ZSBubyBlbmNyeXB0LiAqLwotCXU4CW5yX2ZyYWdzOwotCXU4CWl2X2xlbjsKLQl1OAlpY3ZfbGVuOwotCXU4CWl2WzE4XTsKLQl1OAlpY3ZbMTZdOwotCXU4CXByaW9yaXR5OwotCXU4CWFja19wb2xpY3k7Ci0JdTgJbWFjX2lkOwotCXU4CXZjc19tb2RlOwkvKiB2aXJ0dWFsIGNhcnJpZXIgc2Vuc2UgbWV0aG9kICovCi0JdTgJZHN0W0VUSF9BTEVOXTsKLQl1OAlzcmNbRVRIX0FMRU5dOwotCXU4CXRhW0VUSF9BTEVOXTsKLQl1OAlyYVtFVEhfQUxFTl07Ci0JdTgJa2V5X2lkeDsKLQl1OAlxb3NfZW47Ci0JdTgJaHRfZW47Ci0JdTgJcmFpZDsvKiByYXRlIGFkcGF0aXZlIGlkICovCi0JdTgJYndtb2RlOwotCXU4CWNoX29mZnNldDsvKiBQUklNRV9DSE5MX09GRlNFVCAqLwotCXU4CXNnaTsvKiBzaG9ydCBHSSAqLwotCXU4CWFtcGR1X2VuOy8qIHR4IGFtcGR1IGVuYWJsZSAqLwotCXU4CW1kYXRhOy8qIG1vcmUgZGF0YSBiaXQgKi8KLQl1OAlwY3RybDsvKiBwZXIgcGFja2V0IHR4ZGVzYyBjb250cm9sIGVuYWJsZSAqLwotCXU4CXRyaWdnZXJlZDsvKiBmb3IgYXAgbW9kZSBoYW5kbGluZyBQb3dlciBTYXZpbmcgc3RhICovCi0JdTgJcXNlbDsKLQl1OAllb3NwOwotCXU4CXJhdGU7Ci0JdTgJcmV0cnlfY3RybDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7Ci19OwotCi0jZGVmaW5lIFdMQU5IRFJfT0ZGU0VUCQk2NAotCi0jZGVmaW5lIE5VTExfRlJBTUVUQUcJCTB4MAotI2RlZmluZSBEQVRBX0ZSQU1FVEFHCQkweDAxCi0jZGVmaW5lIEwyX0ZSQU1FVEFHCQkweDAyCi0jZGVmaW5lIE1HTlRfRlJBTUVUQUcJCTB4MDMKLSNkZWZpbmUgQU1TRFVfRlJBTUVUQUcJCTB4MDQKLQotI2RlZmluZSBFSUlfRlJBTUVUQUcJCTB4MDUKLSNkZWZpbmUgSUVFRTgwMjNfRlJBTUVUQUcgCTB4MDYKLQotI2RlZmluZSBNUF9GUkFNRVRBRwkJMHgwNwotCi0jZGVmaW5lIFRYQUdHX0ZSQU1FVEFHCQkweDA4Ci0KLXN0cnVjdCAgc3VibWl0X2N0eCB7Ci0JdTMyIHRpbWVvdXRfbXM7IC8qIDwwOiBub3Qgc3luY2hyb25vdXMsIDA6IHdhaXQgZm9yZXZlciwKLQkJCSAqID4wOiB1cCB0byBtcyB3YWl0aW5nCi0JCQkgKi8KLQlpbnQgc3RhdHVzOyAvKiBzdGF0dXMgZm9yIG9wZXJhdGlvbiAqLwotCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7Ci19OwotCi1lbnVtIHsKLQlSVFdfU0NUWF9TVUJNSVRURUQgPSAtMSwKLQlSVFdfU0NUWF9ET05FX1NVQ0NFU1MgPSAwLAotCVJUV19TQ1RYX0RPTkVfVU5LTk9XTiwKLQlSVFdfU0NUWF9ET05FX1RJTUVPVVQsCi0JUlRXX1NDVFhfRE9ORV9CVUZfQUxMT0MsCi0JUlRXX1NDVFhfRE9ORV9CVUZfRlJFRSwKLQlSVFdfU0NUWF9ET05FX1dSSVRFX1BPUlRfRVJSLAotCVJUV19TQ1RYX0RPTkVfVFhfREVTQ19OQSwKLQlSVFdfU0NUWF9ET05FX1RYX0RFTlksCi0JUlRXX1NDVFhfRE9ORV9DQ1hfUEtUX0ZBSUwsCi0JUlRXX1NDVFhfRE9ORV9EUlZfU1RPUCwKLQlSVFdfU0NUWF9ET05FX0RFVl9SRU1PVkUsCi19OwotCi12b2lkIHJ0d19zY3R4X2luaXQyM2Eoc3RydWN0IHN1Ym1pdF9jdHggKnNjdHgsIGludCB0aW1lb3V0X21zKTsKLWludCBydHdfc2N0eF93YWl0MjNhKHN0cnVjdCBzdWJtaXRfY3R4ICpzY3R4KTsKLXZvaWQgcnR3MjNhX3NjdHhfZG9uZV9lcnIoc3RydWN0IHN1Ym1pdF9jdHggKipzY3R4LCBpbnQgc3RhdHVzKTsKLQotc3RydWN0IHhtaXRfYnVmIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3QsIGxpc3QyOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0KLQl1OCAqcGFsbG9jYXRlZF9idWY7Ci0JdTggKnBidWY7Ci0Jdm9pZCAqcHJpdl9kYXRhOwotCi0JdTE2IGV4dF90YWc7IC8qICAwOiBOb3JtYWwgeG1pdGJ1ZiwgMTogZXh0ZW5zaW9uIHhtaXRidWYuICovCi0JdTE2IGZsYWdzOwotCXUzMiBhbGxvY19zejsKLQl1MzIgIGxlbjsKLQlzdHJ1Y3Qgc3VibWl0X2N0eCAqc2N0eDsKLQl1MzIJZmZfaHdhZGRyOwotCXN0cnVjdCB1cmIgKnB4bWl0X3VyYls4XTsKLQl1OCBicGVuZGluZ1s4XTsKLQlpbnQgbGFzdFs4XTsKLSNpZiBkZWZpbmVkKERCR19YTUlUX0JVRikgfHwgZGVmaW5lZChEQkdfWE1JVF9CVUZfRVhUKQotCXU4IG5vOwotI2VuZGlmCi19OwotCi1zdHJ1Y3QgeG1pdF9mcmFtZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCXN0cnVjdCBwa3RfYXR0cmliIGF0dHJpYjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwotCWludAlmcmFtZV90YWc7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLQl1OAkqYnVmX2FkZHI7Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZjsKLQotCXM4CXBrdF9vZmZzZXQ7Ci0KLQl1OCBhY2tfcmVwb3J0OwotCi0JdTggZXh0X3RhZzsgLyogMDpkYXRhLCAxOm1nbXQgKi8KLX07Ci0KLXN0cnVjdCB0eF9zZXJ2cSB7Ci0Jc3RydWN0IGxpc3RfaGVhZAl0eF9wZW5kaW5nOwotCXN0cnVjdCBydHdfcXVldWUJc3RhX3BlbmRpbmc7Ci0JaW50IHFjbnQ7Ci19OwotCi1zdHJ1Y3Qgc3RhX3htaXRfcHJpdiB7Ci0Jc3BpbmxvY2tfdAlsb2NrOwotCWludAlvcHRpb247Ci0JaW50CWFwc2Rfc2V0dGluZzsJLyogV2hlbiBiaXQgbWFzayBpcyBvbiwgdGhlIGFzc29jaWF0ZWQgZWRjYQotCQkJCSAqIHF1ZXVlIHN1cHBvcnRzIEFQU0QuCi0JCQkJICovCi0Jc3RydWN0IHR4X3NlcnZxCWJlX3E7CQkJLyogcHJpb3JpdHkgPT0gMCwzICovCi0Jc3RydWN0IHR4X3NlcnZxCWJrX3E7CQkJLyogcHJpb3JpdHkgPT0gMSwyICovCi0Jc3RydWN0IHR4X3NlcnZxCXZpX3E7CQkJLyogcHJpb3JpdHkgPT0gNCw1ICovCi0Jc3RydWN0IHR4X3NlcnZxCXZvX3E7CQkJLyogcHJpb3JpdHkgPT0gNiw3ICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsZWdhY3lfZHo7Ci0Jc3RydWN0IGxpc3RfaGVhZCBhcHNkOwotCXUxNiB0eHNlcV90aWRbMTZdOwotfTsKLQotc3RydWN0CWh3X3R4cXVldWUgewotCXZvbGF0aWxlIGludCBoZWFkOwotCXZvbGF0aWxlIGludCB0YWlsOwotCXZvbGF0aWxlIGludCBmcmVlX3N6OwkvKiBpbiB1bml0cyBvZiA2NCBieXRlcyAqLwotCXZvbGF0aWxlIGludCBmcmVlX2NtZHN6OwotCXZvbGF0aWxlIGludCB0eHN6WzhdOwotCXVpbnQJZmZfaHdhZGRyOwotCXVpbnQJY21kX2h3YWRkcjsKLQlpbnQJYWNfdGFnOwotfTsKLQotc3RydWN0IGFnZ19wa3RfaW5mbyB7Ci0JdTE2IG9mZnNldDsKLQl1MTYgcGt0X2xlbjsKLX07Ci0KLXN0cnVjdAl4bWl0X3ByaXYgewotCXNwaW5sb2NrX3QJbG9jazsKLQotCXN0cnVjdCBzZW1hcGhvcmUJeG1pdF9zZW1hOwotCXN0cnVjdCBzZW1hcGhvcmUJdGVybWluYXRlX3htaXR0aHJlYWRfc2VtYTsKLQotCXN0cnVjdCBydHdfcXVldWUJYmVfcGVuZGluZzsKLQlzdHJ1Y3QgcnR3X3F1ZXVlCWJrX3BlbmRpbmc7Ci0Jc3RydWN0IHJ0d19xdWV1ZQl2aV9wZW5kaW5nOwotCXN0cnVjdCBydHdfcXVldWUJdm9fcGVuZGluZzsKLQlzdHJ1Y3QgcnR3X3F1ZXVlCWJtX3BlbmRpbmc7Ci0KLQlpbnQgZnJlZV94bWl0ZnJhbWVfY250OwotCXN0cnVjdCBydHdfcXVldWUJZnJlZV94bWl0X3F1ZXVlOwotCi0JaW50IGZyZWVfeGZyYW1lX2V4dF9jbnQ7Ci0Jc3RydWN0IHJ0d19xdWV1ZSBmcmVlX3hmcmFtZV9leHRfcXVldWU7Ci0KLQl1aW50CWZyYWdfbGVuOwotCi0Jc3RydWN0IHJ0d19hZGFwdGVyCSphZGFwdGVyOwotCi0JdTY0CXR4X2J5dGVzOwotCXU2NAl0eF9wa3RzOwotCXU2NAl0eF9kcm9wOwotCXU2NAlsYXN0X3R4X2J5dGVzOwotCXU2NAlsYXN0X3R4X3BrdHM7Ci0KLQlzdHJ1Y3QgaHdfeG1pdCAqaHd4bWl0czsKLQl1OAlod3htaXRfZW50cnk7Ci0JdTgJdmNzOwotCXU4CW5xb3Nfc3NuOwotCi0JdTgJd21tX3BhcmFfc2VxWzRdOy8qIHNlcXVlbmNlIGZvciB3bW0gYWMgcGFyYW1ldGVyIHN0cmVuZ3RoIGZyb20KLQkJCQkgKiBsYXJnZSB0byBzbWFsbC4gaXQncyB2YWx1ZSBpcyAwLT52bywgMS0+dmksCi0JCQkJICogMi0+YmUsIDMtPmJrLgotCQkJCSAqLwotCi0Jc3RydWN0IHNlbWFwaG9yZQl0eF9yZXRldnQ7LyogYWxsIHR4IHJldHVybiBldmVudDsgKi8KLQotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB4bWl0X3Rhc2tsZXQ7Ci0KLQlzdHJ1Y3QgcnR3X3F1ZXVlIGZyZWVfeG1pdGJ1Zl9xdWV1ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHhtaXRidWZfbGlzdDsJCS8qIHRyYWNrIGJ1ZmZlcnMgZm9yIGNsZWFudXAgKi8KLQlzdHJ1Y3QgcnR3X3F1ZXVlIHBlbmRpbmdfeG1pdGJ1Zl9xdWV1ZTsKLQl1aW50IGZyZWVfeG1pdGJ1Zl9jbnQ7Ci0KLQlzdHJ1Y3QgcnR3X3F1ZXVlIGZyZWVfeG1pdF9leHRidWZfcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCB4bWl0ZXh0YnVmX2xpc3Q7CS8qIHRyYWNrIGJ1ZmZlcnMgZm9yIGNsZWFudXAgKi8KLQl1aW50IGZyZWVfeG1pdF9leHRidWZfY250OwotCi0JaW50CWFja190eDsKLQlzdHJ1Y3QgbXV0ZXggYWNrX3R4X211dGV4OwotCXN0cnVjdCBzdWJtaXRfY3R4IGFja190eF9vcHM7Ci0Jc3BpbmxvY2tfdCBsb2NrX3NjdHg7Ci19OwotCi1zdHJ1Y3QgeG1pdF9idWYgKnJ0d19hbGxvY194bWl0YnVmMjNhX2V4dChzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpOwotczMyIHJ0d19mcmVlX3htaXRidWZfZXh0MjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwKLQkJCSBzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmKTsKLQotc3RydWN0IHhtaXRfYnVmICpydHdfYWxsb2NfeG1pdGJ1ZjIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpOwotczMyIHJ0d19mcmVlX3htaXRidWYyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LCBzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmKTsKLQotdm9pZCBydHdfY291bnRfdHhfc3RhdHMyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCBpbnQgc3opOwotdm9pZCBydHdfdXBkYXRlX3Byb3RlY3Rpb24yM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggKmllLCB1aW50IGllX2xlbik7Ci1zdHJ1Y3QgeG1pdF9mcmFtZSAqcnR3X2FsbG9jX3htaXRmcmFtZTIzYV9leHQoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KTsKLXN0cnVjdCB4bWl0X2ZyYW1lICpydHdfYWxsb2NfeG1pdGZyYW1lMjNhX29uY2Uoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2KTsKLXMzMiBydHdfZnJlZV94bWl0ZnJhbWUyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LAotCQkgICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpOwotdm9pZCBydHdfZnJlZV94bWl0ZnJhbWVfcXVldWUyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LCBzdHJ1Y3QgcnR3X3F1ZXVlICpwZnJhbWVxdWV1ZSk7Ci1zdHJ1Y3QgdHhfc2VydnEgKnJ0d19nZXRfc3RhX3BlbmRpbmcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSwgaW50IHVwLCB1OCAqYWMpOwotczMyIHJ0d194bWl0ZnJhbWVfZW5xdWV1ZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci1zdHJ1Y3QgeG1pdF9mcmFtZSAqcnR3X2RlcXVldWVfeGZyYW1lMjNhKHN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgaHdfeG1pdCAqcGh3eG1pdF9pLCBpbnQgZW50cnkpOwotczMyIHJ0d194bWl0MjNhX2NsYXNzaWZpZXIoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKLXMzMiBydHdfeG1pdGZyYW1lX2NvYWxlc2NlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpwa3QsCi0JCQkgICAgICBzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Ci1zMzIgX3J0d19pbml0X2h3X3R4cXVldWUoc3RydWN0IGh3X3R4cXVldWUgKnBod190eHF1ZXVlLCB1OCBhY190YWcpOwotdm9pZCBfcnR3X2luaXRfc3RhX3htaXRfcHJpdjIzYShzdHJ1Y3Qgc3RhX3htaXRfcHJpdiAqcHN0YV94bWl0cHJpdik7Ci0KLXMzMiBydHdfdHhmcmFtZXNfcGVuZGluZzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXMzMiBydHdfdHhmcmFtZXNfc3RhX2FjX3BlbmRpbmcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYik7Ci12b2lkIHJ0d19pbml0X2h3eG1pdHMyM2Eoc3RydWN0IGh3X3htaXQgKnBod3htaXQsIGludCBlbnRyeSk7Ci1pbnQgX3J0d19pbml0X3htaXRfcHJpdjIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYsCi0JCQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgX3J0d19mcmVlX3htaXRfcHJpdjIzYShzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYpOwotdm9pZCBydHdfYWxsb2NfaHd4bWl0czIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLXZvaWQgcnR3X2ZyZWVfaHd4bWl0czIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBydHdfeG1pdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KTsKLSNpZiBkZWZpbmVkKENPTkZJR184NzIzQVVfQVBfTU9ERSkKLWludCB4bWl0ZnJhbWVfZW5xdWV1ZV9mb3Jfc2xlZXBpbmdfc3RhMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJICAgICAgIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKLXZvaWQgc3RvcF9zdGFfeG1pdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpOwotdm9pZCB3YWtldXBfc3RhX3RvX3htaXQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLXZvaWQgeG1pdF9kZWxpdmVyeV9lbmFibGVkX2ZyYW1lczIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgc3RydWN0IHN0YV9pbmZvICpwc3RhKTsKLSNlbmRpZgotdTgJcW9zX2FjbTIzYSh1OCBhY21fbWFzaywgdTggcHJpb3JpdHkpOwotdTMyCXJ0d19nZXRfZmZfaHdhZGRyMjNhKHN0cnVjdCB4bWl0X2ZyYW1lCSpweG1pdGZyYW1lKTsKLWludCBydHdfYWNrX3R4X3dhaXQyM2Eoc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2LCB1MzIgdGltZW91dF9tcyk7Ci0KLS8qIGluY2x1ZGUgYWZ0ZXIgZGVjbGFyaW5nIHN0cnVjdCB4bWl0X2J1ZiwgaW4gb3JkZXIgdG8gYXZvaWQgd2FybmluZyAqLwotI2luY2x1ZGUgPHhtaXRfb3NkZXAuaD4KLQotI2VuZGlmCS8qIF9SVEw4NzFYX1hNSVRfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9zdGFfaW5mby5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3N0YV9pbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MjYwMDUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3N0YV9pbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fU1RBX0lORk9fSF8KLSNkZWZpbmUgX19TVEFfSU5GT19IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHdpZmkuaD4KLQotI2RlZmluZSBJQlNTX1NUQVJUX01BQ19JRAkyCi0jZGVmaW5lIE5VTV9TVEEgMzIKLSNkZWZpbmUgTlVNX0FDTCAxNgotCi0KLS8qIGlmIG1vZGUgPT0wLCB0aGVuIHRoZSBzdGEgaXMgYWxsb3dlZCBvbmNlIHRoZSBhZGRyIGlzIGhpdC4gKi8KLS8qIGlmIG1vZGUgPT0xLCB0aGVuIHRoZSBzdGEgaXMgcmVqZWN0ZWQgb25jZSB0aGUgYWRkciBpcyBub24taGl0LiAqLwotc3RydWN0IHJ0d193bGFuX2FjbF9ub2RlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0JdTggICAgICAgYWRkcltFVEhfQUxFTl07Ci0JdTggICAgICAgdmFsaWQ7Ci19OwotCi0vKiBtb2RlPTAsIGRpc2FibGUgKi8KLS8qIG1vZGU9MSwgYWNjZXB0IHVubGVzcyBpbiBkZW55IGxpc3QgKi8KLS8qIG1vZGU9MiwgZGVueSB1bmxlc3MgaW4gYWNjZXB0IGxpc3QgKi8KLXN0cnVjdCB3bGFuX2FjbF9wb29sIHsKLQlpbnQgbW9kZTsKLQlpbnQgbnVtOwotCXN0cnVjdCBydHdfd2xhbl9hY2xfbm9kZSBhY2xub2RlW05VTV9BQ0xdOwotCXN0cnVjdCBydHdfcXVldWUJYWNsX25vZGVfcTsKLX07Ci0KLXN0cnVjdCByc3NpX3N0YSAgewotCXMzMglVbmRlY29yYXRlZFNtb290aGVkUFdEQjsKLQlzMzIJVW5kZWNvcmF0ZWRTbW9vdGhlZENDSzsKLQlzMzIJVW5kZWNvcmF0ZWRTbW9vdGhlZE9GRE07Ci0JdTY0CVBhY2tldE1hcDsKLQl1OAlWYWxpZEJpdDsKLX07Ci0KLXN0cnVjdAlzdGFpbmZvX3N0YXRzCXsKLQl1NjQgcnhfbWdudF9wa3RzOwotCQl1NjQgcnhfYmVhY29uX3BrdHM7Ci0JCXU2NCByeF9wcm9iZXJlcV9wa3RzOwotCQl1NjQgcnhfcHJvYmVyc3BfcGt0czsKLQkJdTY0IHJ4X3Byb2JlcnNwX2JtX3BrdHM7Ci0JCXU2NCByeF9wcm9iZXJzcF91b19wa3RzOwotCXU2NCByeF9jdHJsX3BrdHM7Ci0JdTY0IHJ4X2RhdGFfcGt0czsKLQotCXU2NAlsYXN0X3J4X21nbnRfcGt0czsKLQkJdTY0IGxhc3RfcnhfYmVhY29uX3BrdHM7Ci0JCXU2NCBsYXN0X3J4X3Byb2JlcmVxX3BrdHM7Ci0JCXU2NCBsYXN0X3J4X3Byb2JlcnNwX3BrdHM7Ci0JCXU2NCBsYXN0X3J4X3Byb2JlcnNwX2JtX3BrdHM7Ci0JCXU2NCBsYXN0X3J4X3Byb2JlcnNwX3VvX3BrdHM7Ci0JdTY0CWxhc3RfcnhfY3RybF9wa3RzOwotCXU2NAlsYXN0X3J4X2RhdGFfcGt0czsKLQotCXU2NAlyeF9ieXRlczsKLQl1NjQJcnhfZHJvcHM7Ci0KLQl1NjQJdHhfcGt0czsKLQl1NjQJdHhfYnl0ZXM7Ci0JdTY0ICB0eF9kcm9wczsKLQotfTsKLQotc3RydWN0IHN0YV9pbmZvIHsKLQlzcGlubG9ja190CWxvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OyAvKiBmcmVlX3N0YV9xdWV1ZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQJaGFzaF9saXN0OyAvKiBzdGFfaGFzaCAqLwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7Ci0KLQlzdHJ1Y3Qgc3RhX3htaXRfcHJpdiBzdGFfeG1pdHByaXY7Ci0Jc3RydWN0IHN0YV9yZWN2X3ByaXYgc3RhX3JlY3Zwcml2OwotCi0Jc3RydWN0IHJ0d19xdWV1ZSBzbGVlcF9xOwotCXVuc2lnbmVkIGludCBzbGVlcHFfbGVuOwotCi0JdWludCBzdGF0ZTsKLQl1aW50IGFpZDsKLQl1aW50IG1hY19pZDsKLQl1aW50IHFvc19vcHRpb247Ci0JdTgJaHdhZGRyW0VUSF9BTEVOXTsKLQotCXVpbnQJaWVlZTgwMjF4X2Jsb2NrZWQ7CS8qIDA6IGFsbG93ZWQsIDE6YmxvY2tlZCAqLwotCXUzMglkb3QxMTgwMjFYUHJpdmFjeTsgLyogYWVzLCB0a2lwLi4uICovCi0JdW5pb24gS2V5dHlwZQlkb3QxMXRraXB0eG1pY2tleTsKLQl1bmlvbiBLZXl0eXBlCWRvdDExdGtpcHJ4bWlja2V5OwotCXVuaW9uIEtleXR5cGUJZG90MTE4MDIxeF9VbmNzdEtleTsKLQl1bmlvbiBwbjQ4CQlkb3QxMXR4cG47CQkJLyogIFBONDggdXNlZCBmb3IgVW5pY2FzdCB4bWl0LiAqLwotCXVuaW9uIHBuNDgJCWRvdDExcnhwbjsJCQkvKiAgUE40OCB1c2VkIGZvciBVbmljYXN0IHJlY3YuICovCi0KLQotCXU4CWJzc3JhdGVzZXRbMTZdOwotCXUzMglic3NyYXRlbGVuOwotCXMzMiAgcnNzaTsKLQlzMzIJc2lnbmFsX3F1YWxpdHk7Ci0KLQl1OAljdHMyc2VsZjsKLQl1OAlydHNlbjsKLQotCXU4CXJhaWQ7Ci0JdTgJaW5pdF9yYXRlOwotCXUzMglyYV9tYXNrOwotCXU4CXdpcmVsZXNzX21vZGU7CS8qICBORVRXT1JLX1RZUEUgKi8KLQlzdHJ1Y3Qgc3RhaW5mb19zdGF0cyBzdGFfc3RhdHM7Ci0KLQkvKiBmb3IgQS1NUERVIFRYLCBBRERCQSB0aW1lb3V0IGNoZWNrICovCi0Jc3RydWN0IHRpbWVyX2xpc3QgYWRkYmFfcmV0cnlfdGltZXI7Ci0KLQkvKiBmb3IgQS1NUERVIFJ4IHJlb3JkZXJpbmcgYnVmZmVyIGNvbnRyb2wgKi8KLQlzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgcmVjdnJlb3JkZXJfY3RybFsxNl07Ci0KLQkvKiBmb3IgQS1NUERVIFR4ICovCi0JLyogdW5zaWduZWQgY2hhcgkJYW1wZHVfdHhlbl9iaXRtYXA7ICovCi0JdTE2CUJBX3N0YXJ0aW5nX3NlcWN0cmxbMTZdOwotCi0Jc3RydWN0IGh0X3ByaXYJaHRwcml2OwotCi0JLyogTm90ZXM6ICovCi0JLyogU1RBX01vZGU6ICovCi0JLyogY3Vycl9uZXR3b3JrKG1sbWVfcHJpdi9zZWN1cml0eV9wcml2L3Fvcy9odCkgKyBzdGFfaW5mbzogKFNUQSAmIEFQKSBDQVAvSU5GTyAqLwotCS8qIHNjYW5fcTogQVAgQ0FQL0lORk8gKi8KLQotCS8qIEFQX01vZGU6ICovCi0JLyogY3Vycl9uZXR3b3JrKG1sbWVfcHJpdi9zZWN1cml0eV9wcml2L3Fvcy9odCkgOiBBUCBDQVAvSU5GTyAqLwotCS8qIHN0YV9pbmZvOiAoQVAgJiBTVEEpIENBUC9JTkZPICovCi0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGFzb2NfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGF1dGhfbGlzdDsKLQotCXVuc2lnbmVkIGludCBleHBpcmVfdG87Ci0JdW5zaWduZWQgaW50IGF1dGhfc2VxOwotCXVuc2lnbmVkIGludCBhdXRoYWxnOwotCXVuc2lnbmVkIGNoYXIgY2hnX3R4dFsxMjhdOwotCi0JdTE2IGNhcGFiaWxpdHk7Ci0JaW50IGZsYWdzOwotCi0JaW50IGRvdDgwMjF4YWxnOy8qIDA6ZGlzYWJsZSwgMTpwc2ssIDI6ODAyLjF4ICovCi0JaW50IHdwYV9wc2s7LyogMDpkaXNhYmxlLCBiaXQoMCk6IFdQQSwgYml0KDEpOldQQTIgKi8KLQlpbnQgd3BhX2dyb3VwX2NpcGhlcjsKLQlpbnQgd3BhMl9ncm91cF9jaXBoZXI7Ci0JaW50IHdwYV9wYWlyd2lzZV9jaXBoZXI7Ci0JaW50IHdwYTJfcGFpcndpc2VfY2lwaGVyOwotCi0JdTggYnBhaXJ3aXNlX2tleV9pbnN0YWxsZWQ7Ci0KLQl1OCB3cGFfaWVbMzJdOwotCi0JdTggbm9uZXJwX3NldDsKLQl1OCBub19zaG9ydF9zbG90X3RpbWVfc2V0OwotCXU4IG5vX3Nob3J0X3ByZWFtYmxlX3NldDsKLQl1OCBub19odF9nZl9zZXQ7Ci0JdTggbm9faHRfc2V0OwotCXU4IGh0XzIwbWh6X3NldDsKLQotCXVuc2lnbmVkIGludCB0eF9yYV9iaXRtYXA7Ci0JdTggcW9zX2luZm87Ci0KLQl1OCBtYXhfc3BfbGVuOwotCXU4IHVhcHNkX2JrOy8qIEJJVCgwKTogRGVsaXZlcnkgZW5hYmxlZCwgQklUKDEpOiBUcmlnZ2VyIGVuYWJsZWQgKi8KLQl1OCB1YXBzZF9iZTsKLQl1OCB1YXBzZF92aTsKLQl1OCB1YXBzZF92bzsKLQotCXU4IGhhc19sZWdhY3lfYWM7Ci0JdW5zaWduZWQgaW50IHNsZWVwcV9hY19sZW47Ci0KLQkvKiBwMnAgcHJpdiBkYXRhICovCi0JdTggaXNfcDJwX2RldmljZTsKLQl1OCBwMnBfc3RhdHVzX2NvZGU7Ci0KLQl1OCBrZWVwX2FsaXZlX3RyeWNudDsKLQotCS8qIHAycCBjbGllbnQgaW5mbyAqLwotCXU4IGRldl9hZGRyW0VUSF9BTEVOXTsKLQl1OCBkZXZfY2FwOwotCXUxNiBjb25maWdfbWV0aG9kczsKLQl1OCBwcmltYXJ5X2Rldl90eXBlWzhdOwotCXU4IG51bV9vZl9zZWNkZXZfdHlwZTsKLQl1OCBzZWNkZXZfdHlwZXNfbGlzdFszMl07LyogIDMyLzggPT0gNDsgKi8KLQl1MTYgZGV2X25hbWVfbGVuOwotCXU4IGRldl9uYW1lWzMyXTsKLQl1OCAqcGFzc29jX3JlcTsKLQl1MzIgYXNzb2NfcmVxX2xlbjsKLQotCS8qIGZvciBETSAqLwotCXN0cnVjdCByc3NpX3N0YQkgcnNzaV9zdGF0OwotCi0JLyogICovCi0JLyogID09PT09PT09PT09PT09PT1PRE0gUmVsYXRpdmUgSW5mbz09PT09PT09PT09PT09PT09PT09PT09ICovCi0JLyogIFBsZWFzZSBiZSBjYXJlLCBkb250IGRlY2xhcmUgdG9vIG11Y2ggc3RydWN0dXJlIGhlcmUuIEl0IHdpbGwgY29zdCBtZW1vcnkgKiBTVEEgc3VwcG9ydCBudW0uICovCi0JLyogICovCi0JLyogICovCi0JLyogIDIwMTEvMTAvMjAgTUggQWRkIGZvciBPRE0gU1RBIGluZm8uICovCi0JLyogICovCi0JLyogIERyaXZlciBXcml0ZSAqLwotCXU4CQliVmFsaWQ7CQkJCS8qICByZWNvcmQgdGhlIHN0YSBzdGF0dXMgbGluayBvciBub3Q/ICovCi0JdTgJCXJzc2lfbGV2ZWw7CQkJLyogZm9yIFJlZnJlc2ggUkEgbWFzayAqLwotCS8qICBPRE0gV3JpdGUgKi8KLQkvKiAxIFBIWV9TVEFUVVNfSU5GTyAqLwotCXU4CQlSU1NJX1BhdGhbNF07CQkvKiAgKi8KLQl1OAkJUlNTSV9BdmU7Ci0JdTgJCVJYRVZNWzRdOwotCXU4CQlSWFNOUls0XTsKLQotCS8qICBPRE0gV3JpdGUgKi8KLQkvKiAxIFRYX0lORk8gKG1heSBjaGFuZ2VkIGJ5IElDKSAqLwotCS8qICA9PT09PT09PT09PT09PT09T0RNIFJlbGF0aXZlIEluZm89PT09PT09PT09PT09PT09PT09PT09PSAqLwotCS8qICAqLwotCi0JLyogVG8gc3RvcmUgdGhlIHNlcXVlbmNlIG51bWJlciBvZiByZWNlaXZlZCBtYW5hZ2VtZW50IGZyYW1lICovCi0JdTE2IFJ4TWdtdEZyYW1lU2VxTnVtOwotfTsKLQotI2RlZmluZSBzdGFfcnhfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfbWdudF9wa3RzIFwKLQkrIHN0YS0+c3RhX3N0YXRzLnJ4X2N0cmxfcGt0cyBcCi0JKyBzdGEtPnN0YV9zdGF0cy5yeF9kYXRhX3BrdHMpCi0KLSNkZWZpbmUgc3RhX2xhc3RfcnhfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9tZ250X3BrdHMgXAotCSsgc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9jdHJsX3BrdHMgXAotCSsgc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9kYXRhX3BrdHMpCi0KLSNkZWZpbmUgc3RhX3J4X2RhdGFfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfZGF0YV9wa3RzKQotCi0jZGVmaW5lIHN0YV9sYXN0X3J4X2RhdGFfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9kYXRhX3BrdHMpCi0KLSNkZWZpbmUgc3RhX3J4X21nbnRfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfbWdudF9wa3RzKQotCi0jZGVmaW5lIHN0YV9sYXN0X3J4X21nbnRfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9tZ250X3BrdHMpCi0KLSNkZWZpbmUgc3RhX3J4X2JlYWNvbl9wa3RzKHN0YSkgXAotCShzdGEtPnN0YV9zdGF0cy5yeF9iZWFjb25fcGt0cykKLQotI2RlZmluZSBzdGFfbGFzdF9yeF9iZWFjb25fcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9iZWFjb25fcGt0cykKLQotI2RlZmluZSBzdGFfcnhfcHJvYmVyZXFfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyZXFfcGt0cykKLQotI2RlZmluZSBzdGFfbGFzdF9yeF9wcm9iZXJlcV9wa3RzKHN0YSkgXAotCShzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X3Byb2JlcmVxX3BrdHMpCi0KLSNkZWZpbmUgc3RhX3J4X3Byb2JlcnNwX3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcnNwX3BrdHMpCi0KLSNkZWZpbmUgc3RhX2xhc3RfcnhfcHJvYmVyc3BfcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9wcm9iZXJzcF9wa3RzKQotCi0jZGVmaW5lIHN0YV9yeF9wcm9iZXJzcF9ibV9wa3RzKHN0YSkgXAotCShzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF9ibV9wa3RzKQotCi0jZGVmaW5lIHN0YV9sYXN0X3J4X3Byb2JlcnNwX2JtX3BrdHMoc3RhKSBcCi0JKHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfcHJvYmVyc3BfYm1fcGt0cykKLQotI2RlZmluZSBzdGFfcnhfcHJvYmVyc3BfdW9fcGt0cyhzdGEpIFwKLQkoc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfdW9fcGt0cykKLQotI2RlZmluZSBzdGFfbGFzdF9yeF9wcm9iZXJzcF91b19wa3RzKHN0YSkgXAotCShzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X3Byb2JlcnNwX3VvX3BrdHMpCi0KLSNkZWZpbmUgc3RhX3VwZGF0ZV9sYXN0X3J4X3BrdHMoc3RhKSBcCi0JZG8geyBcCi0JCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfbWdudF9wa3RzID0gc3RhLT5zdGFfc3RhdHMucnhfbWdudF9wa3RzOyBcCi0JCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfYmVhY29uX3BrdHMgPSBzdGEtPnN0YV9zdGF0cy5yeF9iZWFjb25fcGt0czsgXAotCQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X3Byb2JlcmVxX3BrdHMgPSBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJlcV9wa3RzOyBcCi0JCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfcHJvYmVyc3BfcGt0cyA9IHN0YS0+c3RhX3N0YXRzLnJ4X3Byb2JlcnNwX3BrdHM7IFwKLQkJc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9wcm9iZXJzcF9ibV9wa3RzID0gc3RhLT5zdGFfc3RhdHMucnhfcHJvYmVyc3BfYm1fcGt0czsgXAotCQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X3Byb2JlcnNwX3VvX3BrdHMgPSBzdGEtPnN0YV9zdGF0cy5yeF9wcm9iZXJzcF91b19wa3RzOyBcCi0JCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfY3RybF9wa3RzID0gc3RhLT5zdGFfc3RhdHMucnhfY3RybF9wa3RzOyBcCi0JCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfZGF0YV9wa3RzID0gc3RhLT5zdGFfc3RhdHMucnhfZGF0YV9wa3RzOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBTVEFfUlhfUEtUU19BUkcoc3RhKSBcCi0Jc3RhLT5zdGFfc3RhdHMucnhfbWdudF9wa3RzIFwKLQksIHN0YS0+c3RhX3N0YXRzLnJ4X2N0cmxfcGt0cyBcCi0JLCBzdGEtPnN0YV9zdGF0cy5yeF9kYXRhX3BrdHMKLQotI2RlZmluZSBTVEFfTEFTVF9SWF9QS1RTX0FSRyhzdGEpIFwKLQlzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X21nbnRfcGt0cywgXAotCXN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfY3RybF9wa3RzLCBcCi0Jc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9kYXRhX3BrdHMKLQotI2RlZmluZSBTVEFfUlhfUEtUU19ESUZGX0FSRyhzdGEpIFwKLQlzdGEtPnN0YV9zdGF0cy5yeF9tZ250X3BrdHMgLSBzdGEtPnN0YV9zdGF0cy5sYXN0X3J4X21nbnRfcGt0cywgXAotCXN0YS0+c3RhX3N0YXRzLnJ4X2N0cmxfcGt0cyAtIHN0YS0+c3RhX3N0YXRzLmxhc3RfcnhfY3RybF9wa3RzLCBcCi0Jc3RhLT5zdGFfc3RhdHMucnhfZGF0YV9wa3RzIC0gc3RhLT5zdGFfc3RhdHMubGFzdF9yeF9kYXRhX3BrdHMKLQotI2RlZmluZSBTVEFfUEtUU19GTVQgIihtOiVsbHUsIGM6JWxsdSwgZDolbGx1KSIKLQotc3RydWN0IHN0YV9wcml2IHsKLQlzcGlubG9ja190IHN0YV9oYXNoX2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzdGFfaGFzaFtOVU1fU1RBXTsKLQlpbnQgYXNvY19zdGFfY291bnQ7Ci0KLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyOwotCXN0cnVjdCBsaXN0X2hlYWQgYXNvY19saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgYXV0aF9saXN0OwotCXNwaW5sb2NrX3QgYXNvY19saXN0X2xvY2s7Ci0Jc3BpbmxvY2tfdCBhdXRoX2xpc3RfbG9jazsKLQl1OCBhc29jX2xpc3RfY250OwotCXU4IGF1dGhfbGlzdF9jbnQ7Ci0KLQl1bnNpZ25lZCBpbnQgYXV0aF90bzsgIC8qIHNlYywgdGltZSB0byBleHBpcmUgaW4gYXV0aGVudGljYXRpbmcuICovCi0JdW5zaWduZWQgaW50IGFzc29jX3RvOyAvKiBzZWMsIHRpbWUgdG8gZXhwaXJlIGJlZm9yZSBhc3NvY2lhdGluZy4gKi8KLQl1bnNpZ25lZCBpbnQgZXhwaXJlX3RvOyAvKiBzZWMgLCB0aW1lIHRvIGV4cGlyZSBhZnRlciBhc3NvY2lhdGVkLiAqLwotCi0JLyogcG9pbnRlcnMgdG8gU1RBIGluZm87IGJhc2VkIG9uIGFsbG9jYXRlZCBBSUQgb3IgTlVMTCBpZiBBSUQgZnJlZQotCSAqIEFJRCBpcyBpbiB0aGUgcmFuZ2UgMS0yMDA3LCBzbyBzdGFfYWlkWzBdIGNvcnJlc3BvbmRlcnMgdG8gQUlEIDEKLQkgKiBhbmQgc28gb24KLQkgKi8KLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YV9haWRbTlVNX1NUQV07Ci0KLQl1MTYgc3RhX2R6X2JpdG1hcDsvKiBvbmx5IHN1cHBvcnQgMTUgc3RhdGlvbnMsIHN0YXRpb24gYWlkIGJpdG1hcAotCQkJICAgKiBmb3Igc2xlZXBpbmcgc3RhLiAqLwotCXUxNiB0aW1fYml0bWFwOy8qIG9ubHkgc3VwcG9ydCAxNSBzdGF0aW9ucywKLQkJCSogYWlkPTB+MTUgbWFwcGluZyBiaXQwfmJpdDE1ICovCi0KLQl1MTYgbWF4X251bV9zdGE7Ci0KLQlzdHJ1Y3Qgd2xhbl9hY2xfcG9vbCBhY2xfbGlzdDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIHdpZmlfbWFjX2hhc2goY29uc3QgdTggKm1hYykKLXsKLQl1MzIgeDsKLQotCXggPSBtYWNbMF07Ci0JeCA9ICh4IDw8IDIpIF4gbWFjWzFdOwotCXggPSAoeCA8PCAyKSBeIG1hY1syXTsKLQl4ID0gKHggPDwgMikgXiBtYWNbM107Ci0JeCA9ICh4IDw8IDIpIF4gbWFjWzRdOwotCXggPSAoeCA8PCAyKSBeIG1hY1s1XTsKLQotCXggXj0geCA+PiA4OwotCXggID0geCAmIChOVU1fU1RBIC0gMSk7Ci0KLQlyZXR1cm4geDsKLX0KLQotaW50IF9ydHdfaW5pdF9zdGFfcHJpdjIzYShzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2KTsKLWludCBfcnR3X2ZyZWVfc3RhX3ByaXYyM2Eoc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdik7Ci0KLXN0cnVjdCBzdGFfaW5mbyAqcnR3X2FsbG9jX3N0YWluZm8yM2Eoc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiwgY29uc3QgdTggKmh3YWRkciwgZ2ZwX3QgZ2ZwKTsKLWludCBydHdfZnJlZV9zdGFpbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSk7Ci12b2lkIHJ0d19mcmVlX2FsbF9zdGFpbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotc3RydWN0IHN0YV9pbmZvICpydHdfZ2V0X3N0YWluZm8yM2Eoc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiwgY29uc3QgdTggKmh3YWRkcik7Ci1pbnQgcnR3X2luaXRfYmNtY19zdGFpbmZvMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotc3RydWN0IHN0YV9pbmZvICpydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWJvb2wgcnR3X2FjY2Vzc19jdHJsMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICptYWNfYWRkcik7Ci0KLSNlbmRpZiAvKiBfU1RBX0lORk9fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS91c2Jfb3BzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvdXNiX29wcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjExZTEzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS91c2Jfb3BzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19VU0JfT1BTX0hfCi0jZGVmaW5lIF9fVVNCX09QU19IXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+Ci0KLSNkZWZpbmUgUkVBTFRFS19VU0JfVkVOUVRfUkVBRAkJMHhDMAotI2RlZmluZSBSRUFMVEVLX1VTQl9WRU5RVF9XUklURQkJMHg0MAotI2RlZmluZSBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVRCTB4MDUKLSNkZWZpbmUgUkVBTFRFS19VU0JfVkVOUVRfQ01EX0lEWAkweDAwCi0KLWVudW0gewotCVZFTkRPUl9XUklURSA9IDB4MDAsCi0JVkVORE9SX1JFQUQgPSAweDAxLAotfTsKLQotI2RlZmluZSBBTElHTk1FTlRfVU5JVAkJCQkxNgotI2RlZmluZSBNQVhfVkVORE9SX1JFUV9DTURfU0laRQkyNTQJCS8qIDgxODhjdSBTSUUgU3VwcG9ydCAqLwotI2RlZmluZSBNQVhfVVNCX0lPX0NUTF9TSVpFCShNQVhfVkVORE9SX1JFUV9DTURfU0laRSArQUxJR05NRU5UX1VOSVQpCi0KLXZvaWQgcnRsODcyM2F1X3NldF9od190eXBlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi12b2lkIHJ0bDg3MjNhdV9yZWN2X3Rhc2tsZXQodm9pZCAqcHJpdik7Ci0KLXZvaWQgcnRsODcyM2F1X3htaXRfdGFza2xldCh2b2lkICpwcml2KTsKLQotLyogSW5jcmVhc2UgYW5kIGNoZWNrIGlmIHRoZSBjb250aW51YWxfdXJiX2Vycm9yIG9mIHRoaXMgQHBhcmFtIGR2b2JqcHJpdmUgaXMKLSAqIGxhcmdlciB0aGFuIE1BWF9DT05USU5VQUxfVVJCX0VSUi4gUmV0dXJuIHJlc3VsdAotICovCi1zdGF0aWMgaW5saW5lIGludCBydHdfaW5jX2FuZF9jaGtfY29udGludWFsX3VyYl9lcnJvcihzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmopCi17Ci0JaW50IHJldCA9IGZhbHNlOwotCWludCB2YWx1ZTsKLQotCXZhbHVlID0gYXRvbWljX2luY19yZXR1cm4oJmR2b2JqLT5jb250aW51YWxfdXJiX2Vycm9yKTsKLQlpZiAodmFsdWUgPiBNQVhfQ09OVElOVUFMX1VSQl9FUlIpIHsKLQkJREJHXzg3MjNBKCJbZHZvYmo6JXBdW0VSUk9SXSBjb250aW51YWxfdXJiX2Vycm9yOiVkID4gJWRcbiIsCi0JCQkgIGR2b2JqLCB2YWx1ZSwgTUFYX0NPTlRJTlVBTF9VUkJfRVJSKTsKLQkJcmV0ID0gdHJ1ZTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogU2V0IHRoZSBjb250aW51YWxfdXJiX2Vycm9yIG9mIHRoaXMgQHBhcmFtIGR2b2JqcHJpdmUgdG8gMCAqLwotc3RhdGljIGlubGluZSB2b2lkIHJ0d19yZXNldF9jb250aW51YWxfdXJiX2Vycm9yKHN0cnVjdCBkdm9ial9wcml2ICpkdm9iaikKLXsKLQlhdG9taWNfc2V0KCZkdm9iai0+Y29udGludWFsX3VyYl9lcnJvciwgMCk7Ci19Ci0KLWJvb2wgcnRsODcyM2F1X2NoaXBfY29uZmlndXJlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpOwotCi0jZW5kaWYgLyogX19VU0JfT1BTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvdXNiX29wc19saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3VzYl9vcHNfbGludXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYyZjE0Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvdXNiX29wc19saW51eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fVVNCX09QU19MSU5VWF9IX18KLSNkZWZpbmUgX19VU0JfT1BTX0xJTlVYX0hfXwotCi0jZGVmaW5lIFZFTkRPUl9DTURfTUFYX0RBVEFfTEVOCTI1NAotCi0jZGVmaW5lIFJUV19VU0JfQ09OVFJPTF9NU0dfVElNRU9VVAk1MDAvKiBtcyAqLwotCi0jZGVmaW5lIE1BWF9VU0JDVFJMX1ZFTkRPUlJFUV9USU1FUwkxMAotCi1pbnQgcnRsODcyM2F1X3JlYWRfcG9ydChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBjbnQsCi0JCQlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmKTsKLXZvaWQgcnRsODcyM2F1X3JlYWRfcG9ydF9jYW5jZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcik7Ci1pbnQgcnRsODcyM2F1X3dyaXRlX3BvcnQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBjbnQsCi0JCQkgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1Zik7Ci12b2lkIHJ0bDg3MjNhdV93cml0ZV9wb3J0X2NhbmNlbChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLWludCBydGw4NzIzYXVfcmVhZF9pbnRlcnJ1cHQoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKTsKLQotdTggcnRsODcyM2F1X3JlYWQ4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyKTsKLXUxNiBydGw4NzIzYXVfcmVhZDE2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyKTsKLXUzMiBydGw4NzIzYXVfcmVhZDMyKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyKTsKLWludCBydGw4NzIzYXVfd3JpdGU4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyLCB1OCB2YWwpOwotaW50IHJ0bDg3MjNhdV93cml0ZTE2KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHUxNiBhZGRyLCB1MTYgdmFsKTsKLWludCBydGw4NzIzYXVfd3JpdGUzMihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MTYgYWRkciwgdTMyIHZhbCk7Ci1pbnQgcnRsODcyM2F1X3dyaXRlTihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkgICAgIHUxNiBhZGRyLCB1MTYgbGVuZ3RoLCB1OCAqcGRhdGEpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS93aWZpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvd2lmaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWQ1NzNjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS93aWZpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX1dJRklfSF8KLSNkZWZpbmUgX1dJRklfSF8KLQotLyogIFRoaXMgdmFsdWUgaXMgdGVzdGVkIGJ5IFdpRmkgMTFuIFRlc3QgUGxhbiA1LjIuMy4KLSAqICBUaGlzIHRlc3QgdmVyaWZpZXMgdGhlIFdMQU4gTklDIGNhbiB1cGRhdGUgdGhlIE5BViB0aHJvdWdoIHNlbmRpbmcKLSAqICB0aGUgQ1RTIHdpdGggbGFyZ2UgZHVyYXRpb24uCi0gKi8KLSNkZWZpbmUJV2lGaU5hdlVwcGVyVXMJCTMwMDAwCS8qICAzMCBtcyAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQkJQmVsb3cgaXMgdGhlIGRlZmluaXRpb24gZm9yIDgwMi4xMW4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0cnVjdCBBQ19wYXJhbSB7Ci0JdTgJCQlBQ0lfQUlGU047Ci0JdTgJCQlDVzsKLQlfX2xlMTYJCQlUWE9QX2xpbWl0OwotfSAgX19wYWNrZWQ7Ci0KLXN0cnVjdCBXTU1fcGFyYV9lbGVtZW50IHsKLQl1bnNpZ25lZCBjaGFyCQlRb1NfaW5mbzsKLQl1bnNpZ25lZCBjaGFyCQlyZXNlcnZlZDsKLQlzdHJ1Y3QgQUNfcGFyYW0JYWNfcGFyYW1bNF07Ci19ICBfX3BhY2tlZDsKLQotc3RydWN0IEFEREJBX3JlcXVlc3QgewotCXU4CQlkaWFsb2dfdG9rZW47Ci0JX19sZTE2CQlCQV9wYXJhX3NldDsKLQlfX2xlMTYJCUJBX3RpbWVvdXRfdmFsdWU7Ci0JX19sZTE2CQlCQV9zdGFydGluZ19zZXFjdHJsOwotfSAgX19wYWNrZWQ7Ci0KLQotLyoJPT09PT09PT09PT09PT09V1BTIFNlY3Rpb249PT09PT09PT09PT09PT0gKi8KLS8qCVdQUyBhdHRyaWJ1dGUgSUQgKi8KLSNkZWZpbmUgV1BTX0FUVFJfVkVSMQkJCQkweDEwNEEKLSNkZWZpbmUgV1BTX0FUVFJfU0lNUExFX0NPTkZfU1RBVEUJCTB4MTA0NAotI2RlZmluZSBXUFNfQVRUUl9SRVNQX1RZUEUJCQkweDEwM0IKLSNkZWZpbmUgV1BTX0FUVFJfVVVJRF9FCQkJCTB4MTA0NwotI2RlZmluZSBXUFNfQVRUUl9NQU5VRkFDVFVSRVIJCQkweDEwMjEKLSNkZWZpbmUgV1BTX0FUVFJfTU9ERUxfTkFNRQkJCTB4MTAyMwotI2RlZmluZSBXUFNfQVRUUl9NT0RFTF9OVU1CRVIJCQkweDEwMjQKLSNkZWZpbmUgV1BTX0FUVFJfU0VSSUFMX05VTUJFUgkJCTB4MTA0MgotI2RlZmluZSBXUFNfQVRUUl9QUklNQVJZX0RFVl9UWVBFCQkweDEwNTQKLSNkZWZpbmUgV1BTX0FUVFJfU0VDX0RFVl9UWVBFX0xJU1QJCTB4MTA1NQotI2RlZmluZSBXUFNfQVRUUl9ERVZJQ0VfTkFNRQkJCTB4MTAxMQotI2RlZmluZSBXUFNfQVRUUl9DT05GX01FVEhPRAkJCTB4MTAwOAotI2RlZmluZSBXUFNfQVRUUl9SRl9CQU5EUwkJCTB4MTAzQwotI2RlZmluZSBXUFNfQVRUUl9ERVZJQ0VfUFdJRAkJCTB4MTAxMgotI2RlZmluZSBXUFNfQVRUUl9SRVFVRVNUX1RZUEUJCQkweDEwM0EKLSNkZWZpbmUgV1BTX0FUVFJfQVNTT0NJQVRJT05fU1RBVEUJCTB4MTAwMgotI2RlZmluZSBXUFNfQVRUUl9DT05GSUdfRVJST1IJCQkweDEwMDkKLSNkZWZpbmUgV1BTX0FUVFJfVkVORE9SX0VYVAkJCTB4MTA0OQotI2RlZmluZSBXUFNfQVRUUl9TRUxFQ1RFRF9SRUdJU1RSQVIJCTB4MTA0MQotCi0vKglXUFMgQ29uZmlndXJhdGlvbiBNZXRob2QgKi8KLSNkZWZpbmUJV1BTX0NNX05PTkUJCQkJCTB4MDAwMAotI2RlZmluZQlXUFNfQ01fTEFCRUwJCQkJCTB4MDAwNAotI2RlZmluZQlXUFNfQ01fRElTUExZQQkJCQkJMHgwMDA4Ci0jZGVmaW5lCVdQU19DTV9FWFRFUk5BTF9ORkNfVE9LRU4JCQkweDAwMTAKLSNkZWZpbmUJV1BTX0NNX0lOVEVHUkFURURfTkZDX1RPS0VOCQkJMHgwMDIwCi0jZGVmaW5lCVdQU19DTV9ORkNfSU5URVJGQUNFCQkJCTB4MDA0MAotI2RlZmluZQlXUFNfQ01fUFVTSF9CVVRUT04JCQkJMHgwMDgwCi0jZGVmaW5lCVdQU19DTV9LRVlQQUQJCQkJCTB4MDEwMAotI2RlZmluZQlXUFNfQ01fU1dfUFVIU19CVVRUT04JCQkJMHgwMjgwCi0jZGVmaW5lCVdQU19DTV9IV19QVUhTX0JVVFRPTgkJCQkweDA0ODAKLSNkZWZpbmUJV1BTX0NNX1NXX0RJU1BMQVlfUElOCQkJCTB4MjAwOAotI2RlZmluZQlXUFNfQ01fTENEX0RJU1BMQVlfUElOCQkJCTB4NDAwOAotCi0jZW5kaWYgLyogIF9XSUZJX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS93bGFuX2Jzc2RlZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWIzMmUxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS93bGFuX2Jzc2RlZi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX1dMQU5fQlNTREVGX0hfXwotI2RlZmluZSBfX1dMQU5fQlNTREVGX0hfXwotCi0KLSNkZWZpbmUgTUFYX0lFX1NaCTc2OAotCi0KLSNkZWZpbmUgTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTICAgICAgICA4Ci0jZGVmaW5lIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCAgICAgMTYKLQotLyogTGVuZ3RoIGlzIHRoZSA0IGJ5dGVzIG11bHRpcGxlcyBvZiB0aGUgc3VtIG9mCi0gKiBzaXplb2YoNiAqIHNpemVvZih1bnNpZ25lZCBjaGFyKSkgKyAyICsgc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9zc2lkKSArCi0gKiBzaXplb2YodTMyKSArIHNpemVvZihsb25nKSArIHNpemVvZihlbnVtIG5kaXNfODAyXzExX25ldF90eXBlKSArCi0gKiBzaXplb2Yoc3RydWN0IG5kaXNfODAyXzExX2NvbmZpZykgKyBzaXplb2Yoc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICoKLSAqIE5ESVNfODAyXzExX0xFTkdUSF9SQVRFU19FWCkgKyBJRUxlbmd0aAotICoKLSAqIEV4Y2VwdCB0aGUgSUVMZW5ndGgsIGFsbCBvdGhlciBmaWVsZHMgYXJlIGZpeGVkIGxlbmd0aC4gVGhlcmVmb3JlLAotICogd2UgY2FuIGRlZmluZSBhIG1hY3JvIHRvIHByZXNlbnQgdGhlIHBhcnRpYWwgc3VtLgotICovCi0KLWVudW0gbmRpc184MDJfMTFfYXV0aF9tb2RlIHsKLQlOZGlzODAyXzExQXV0aE1vZGVPcGVuLAotCU5kaXM4MDJfMTFBdXRoTW9kZVNoYXJlZCwKLQlOZGlzODAyXzExQXV0aE1vZGVBdXRvU3dpdGNoLAotCU5kaXM4MDJfMTFBdXRoTW9kZVdQQSwKLQlOZGlzODAyXzExQXV0aE1vZGVXUEFQU0ssCi0JTmRpczgwMl8xMUF1dGhNb2RlV1BBTm9uZSwKLQlkaXM4MDJfMTFBdXRoTW9kZU1heCAgICAgICAvKiAgdXBwZXIgYm91bmQgKi8KLX07Ci0KLWVudW0gIHsKLQlOZGlzODAyXzExV0VQRW5hYmxlZCwKLQlOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkID0gTmRpczgwMl8xMVdFUEVuYWJsZWQsCi0JTmRpczgwMl8xMVdFUERpc2FibGVkLAotCU5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQsCi0JTmRpczgwMl8xMVdFUEtleUFic2VudCwKLQlOZGlzODAyXzExRW5jcnlwdGlvbjFLZXlBYnNlbnQgPSBOZGlzODAyXzExV0VQS2V5QWJzZW50LAotCU5kaXM4MDJfMTFXRVBOb3RTdXBwb3J0ZWQsCi0JTmRpczgwMl8xMUVuY3J5cHRpb25Ob3RTdXBwb3J0ZWQgPSBOZGlzODAyXzExV0VQTm90U3VwcG9ydGVkLAotCU5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQsCi0JTmRpczgwMl8xMUVuY3J5cHRpb24yS2V5QWJzZW50LAotCU5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQsCi0JTmRpczgwMl8xMUVuY3J5cHRpb24zS2V5QWJzZW50LAotfTsKLQotc3RydWN0IHdsYW5fYmNuX2luZm8gewotCS8qIHRoZXNlIGluZm9yIGdldCBmcm9tIHJ0d19nZXRfZW5jcnlwdF9pbmZvIHdoZW4KLQkgKgkgKiB0cmFuc2xhdGUgc2NhbiB0byBVSSAqLwotCXU4IGVuY3J5cF9wcm90b2NvbDsvKiBFTkNSWVBfUFJPVE9DT0xfRTogT1BFTi9XRVAvV1BBL1dQQTIgKi8KLQlpbnQgZ3JvdXBfY2lwaGVyOyAvKiBXUEEvV1BBMiBncm91cCBjaXBoZXIgKi8KLQlpbnQgcGFpcndpc2VfY2lwaGVyOy8qIFdQQS9XUEEyL1dFUCBwYWlyd2lzZSBjaXBoZXIgKi8KLQlpbnQgaXNfODAyMXg7Ci0KLQkvKiBid21vZGUgMjAvNDAgYW5kIGNoX29mZnNldCBVUC9MT1cgKi8KLX07Ci0KLXN0cnVjdCB3bGFuX2Jzc2lkX2V4IHsKLQl1MzIgIExlbmd0aDsKLQl1OCBNYWNBZGRyZXNzW0VUSF9BTEVOXTsKLQl1MTYgcmVzZXJ2ZWQ7Ci0Jc3RydWN0IGNmZzgwMjExX3NzaWQgU3NpZDsKLQl1MzIgIFByaXZhY3k7Ci0JbG9uZyAgUnNzaTsvKiBpbiBkQk0sIHJhdyBkYXRhICwgZ2V0IGZyb20gUEhZKSAqLwotCXUxNiBiZWFjb25faW50ZXJ2YWw7Ci0JdTE2IGNhcGFiaWxpdHk7Ci0JdTY0IHRzZjsKLQl1MzIgQVRJTVdpbmRvdzsgICAgICAgICAvKiAgdW5pdHMgYXJlIEt1c2VjICovCi0JdTMyIERTQ29uZmlnOyAgICAgICAgICAgLyogIEZyZXF1ZW5jeSwgdW5pdHMgYXJlIGtIeiAqLwotCWVudW0gbmw4MDIxMV9pZnR5cGUgaWZtb2RlOwotCXVuc2lnbmVkIGNoYXIgU3VwcG9ydGVkUmF0ZXNbTkRJU184MDJfMTFfTEVOR1RIX1JBVEVTX0VYXTsKLQl1OCBTaWduYWxTdHJlbmd0aDsvKiBpbiBwZXJjZW50YWdlICovCi0JdTggU2lnbmFsUXVhbGl0eTsvKiBpbiBwZXJjZW50YWdlICovCi0JdTMyICBJRUxlbmd0aDsKLQl1OCAgSUVzW01BWF9JRV9TWl07IC8qIHRpbWVzdGFtcCwgYmVhY29uIGludGVydmFsLCBhbmQgY2FwYWJpbGl0eSBpbmZvKi8KLX0gX19wYWNrZWQ7Ci0KLXN0YXRpYyBpbmxpbmUgdWludCBnZXRfd2xhbl9ic3NpZF9leF9zeihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYnNzKQotewotCXJldHVybiBzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpIC0gTUFYX0lFX1NaICsgYnNzLT5JRUxlbmd0aDsKLX0KLQotc3RydWN0CXdsYW5fbmV0d29yayB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCWludAluZXR3b3JrX3R5cGU7CS8qIHJlZmVyIHRvIGllZWU4MDIxMS5oIGZvciAxMUEvQi9HICovCi0JLyogIHNldCB0byBmaXhlZCB3aGVuIG5vdCB0byBiZSByZW1vdmVkIGFzIHNpdGUtc3VydmV5aW5nICovCi0JaW50CWZpeGVkOwotCXVuc2lnbmVkIGxvbmcJbGFzdF9zY2FubmVkOyAvKiB0aW1lc3RhbXAgZm9yIHRoZSBuZXR3b3JrICovCi0JaW50CWpvaW5fcmVzOwotCXN0cnVjdCB3bGFuX2Jzc2lkX2V4CW5ldHdvcms7IC8qIG11c3QgYmUgdGhlIGxhc3QgaXRlbSAqLwotCXN0cnVjdCB3bGFuX2Jjbl9pbmZvCUJjbkluZm87Ci19OwotCi1lbnVtIFZSVExfQ0FSUklFUl9TRU5TRSB7Ci0JRElTQUJMRV9WQ1MsCi0JRU5BQkxFX1ZDUywKLQlBVVRPX1ZDUwotfTsKLQotZW51bSBWQ1NfVFlQRSB7Ci0JTk9ORV9WQ1MsCi0JUlRTX0NUUywKLQlDVFNfVE9fU0VMRgotfTsKLQotLyogam9obiAqLwotI2RlZmluZSBOVU1fUFJFX0FVVEhfS0VZIDE2Ci0jZGVmaW5lIE5VTV9QTUtJRF9DQUNIRSBOVU1fUFJFX0FVVEhfS0VZCi0KLSNlbmRpZiAvKiBpZm5kZWYgV0xBTl9CU1NERUZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS94bWl0X29zZGVwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUveG1pdF9vc2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmUwNGM0OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUveG1pdF9vc2RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9fWE1JVF9PU0RFUF9IXwotI2RlZmluZSBfX1hNSVRfT1NERVBfSF8KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotCi0jZGVmaW5lIE5SX1hNSVRGUkFNRQkyNTYKLQotaW50IHJ0d194bWl0MjNhX2VudHJ5MjNhKHN0cnVjdCBza19idWZmICpwa3QsIHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KTsKLQotdm9pZCBydHdfb3NfeG1pdF9zY2hlZHVsZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKTsKLQotaW50IHJ0d19vc194bWl0X3Jlc291cmNlX2FsbG9jMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZiwgdTMyIGFsbG9jX3N6KTsKLXZvaWQgcnR3X29zX3htaXRfcmVzb3VyY2VfZnJlZTIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJICAgICAgIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpOwotCi12b2lkIHJ0d19vc19wa3RfY29tcGxldGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IHNrX2J1ZmYgKnBrdCk7Ci12b2lkIHJ0d19vc194bWl0X2NvbXBsZXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgIHN0cnVjdCB4bWl0X2ZyYW1lICpweGZyYW1lKTsKLWludCBuZXRkZXZfb3BlbjIzYShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldik7Ci0KLSNlbmRpZiAvKiBfX1hNSVRfT1NERVBfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL2lvY3RsX2NmZzgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9pb2N0bF9jZmc4MDIxMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGJhMzc3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL2lvY3RsX2NmZzgwMjExLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTIgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSAgX0lPQ1RMX0NGRzgwMjExX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8eG1pdF9vc2RlcC5oPgotCi0jaW5jbHVkZSAiaW9jdGxfY2ZnODAyMTEuaCIKLQotI2RlZmluZSBSVFdfTUFYX01HTVRfVFhfQ05UIDgKLQotI2RlZmluZSBSVFdfTUFYX1JFTUFJTl9PTl9DSEFOTkVMX0RVUkFUSU9OIDY1NTM1CS8qIG1zICovCi0jZGVmaW5lIFJUV19NQVhfTlVNX1BNS0lEUyA0Ci0KLXN0YXRpYyBjb25zdCB1MzIgcnR3X2NpcGhlcl9zdWl0ZXNbXSA9IHsKLQlXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCwKLQlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQsCi0JV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCwKLQlXTEFOX0NJUEhFUl9TVUlURV9DQ01QLAotfTsKLQotI2RlZmluZSBSQVRFVEFCX0VOVChfcmF0ZSwgX3JhdGVpZCwgX2ZsYWdzKSB7CQkJXAotCS5iaXRyYXRlCT0gKF9yYXRlKSwJCQkJXAotCS5od192YWx1ZQk9IChfcmF0ZWlkKSwJCQkJXAotCS5mbGFncwkJPSAoX2ZsYWdzKSwJCQkJXAotfQotCi0jZGVmaW5lIENIQU4yRyhfY2hhbm5lbCwgX2ZyZXEsIF9mbGFncykgewkJCVwKLQkuYmFuZAkJCT0gTkw4MDIxMV9CQU5EXzJHSFosCQlcCi0JLmNlbnRlcl9mcmVxCQk9IChfZnJlcSksCQkJXAotCS5od192YWx1ZQkJPSAoX2NoYW5uZWwpLAkJCVwKLQkuZmxhZ3MJCQk9IChfZmxhZ3MpLAkJCVwKLQkubWF4X2FudGVubmFfZ2Fpbgk9IDAsCQkJCVwKLQkubWF4X3Bvd2VyCQk9IDMwLAkJCQlcCi19Ci0KLSNkZWZpbmUgQ0hBTjVHKF9jaGFubmVsLCBfZmxhZ3MpIHsJCQkJXAotCS5iYW5kCQkJPSBOTDgwMjExX0JBTkRfNUdIWiwJCVwKLQkuY2VudGVyX2ZyZXEJCT0gNTAwMCArICg1ICogKF9jaGFubmVsKSksCVwKLQkuaHdfdmFsdWUJCT0gKF9jaGFubmVsKSwJCQlcCi0JLmZsYWdzCQkJPSAoX2ZsYWdzKSwJCQlcCi0JLm1heF9hbnRlbm5hX2dhaW4JPSAwLAkJCQlcCi0JLm1heF9wb3dlcgkJPSAzMCwJCQkJXAotfQotCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9yYXRlIHJ0d19yYXRlc1tdID0gewotCVJBVEVUQUJfRU5UKDEwLCAweDEsIDApLAotCVJBVEVUQUJfRU5UKDIwLCAweDIsIDApLAotCVJBVEVUQUJfRU5UKDU1LCAweDQsIDApLAotCVJBVEVUQUJfRU5UKDExMCwgMHg4LCAwKSwKLQlSQVRFVEFCX0VOVCg2MCwgMHgxMCwgMCksCi0JUkFURVRBQl9FTlQoOTAsIDB4MjAsIDApLAotCVJBVEVUQUJfRU5UKDEyMCwgMHg0MCwgMCksCi0JUkFURVRBQl9FTlQoMTgwLCAweDgwLCAwKSwKLQlSQVRFVEFCX0VOVCgyNDAsIDB4MTAwLCAwKSwKLQlSQVRFVEFCX0VOVCgzNjAsIDB4MjAwLCAwKSwKLQlSQVRFVEFCX0VOVCg0ODAsIDB4NDAwLCAwKSwKLQlSQVRFVEFCX0VOVCg1NDAsIDB4ODAwLCAwKSwKLX07Ci0KLSNkZWZpbmUgcnR3X2FfcmF0ZXMJCShydHdfcmF0ZXMgKyA0KQotI2RlZmluZSBSVFdfQV9SQVRFU19OVU0JOAotI2RlZmluZSBydHdfZ19yYXRlcwkJKHJ0d19yYXRlcyArIDApCi0jZGVmaW5lIFJUV19HX1JBVEVTX05VTQkxMgotCi0jZGVmaW5lIFJUV18yR19DSEFOTkVMU19OVU0gMTQKLSNkZWZpbmUgUlRXXzVHX0NIQU5ORUxTX05VTSAzNwotCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIHJ0d18yZ2h6X2NoYW5uZWxzW10gPSB7Ci0JQ0hBTjJHKDEsIDI0MTIsIDApLAotCUNIQU4yRygyLCAyNDE3LCAwKSwKLQlDSEFOMkcoMywgMjQyMiwgMCksCi0JQ0hBTjJHKDQsIDI0MjcsIDApLAotCUNIQU4yRyg1LCAyNDMyLCAwKSwKLQlDSEFOMkcoNiwgMjQzNywgMCksCi0JQ0hBTjJHKDcsIDI0NDIsIDApLAotCUNIQU4yRyg4LCAyNDQ3LCAwKSwKLQlDSEFOMkcoOSwgMjQ1MiwgMCksCi0JQ0hBTjJHKDEwLCAyNDU3LCAwKSwKLQlDSEFOMkcoMTEsIDI0NjIsIDApLAotCUNIQU4yRygxMiwgMjQ2NywgMCksCi0JQ0hBTjJHKDEzLCAyNDcyLCAwKSwKLQlDSEFOMkcoMTQsIDI0ODQsIDApLAotfTsKLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBydHdfNWdoel9hX2NoYW5uZWxzW10gPSB7Ci0JQ0hBTjVHKDM0LCAwKSwgQ0hBTjVHKDM2LCAwKSwKLQlDSEFONUcoMzgsIDApLCBDSEFONUcoNDAsIDApLAotCUNIQU41Ryg0MiwgMCksIENIQU41Ryg0NCwgMCksCi0JQ0hBTjVHKDQ2LCAwKSwgQ0hBTjVHKDQ4LCAwKSwKLQlDSEFONUcoNTIsIDApLCBDSEFONUcoNTYsIDApLAotCUNIQU41Ryg2MCwgMCksIENIQU41Ryg2NCwgMCksCi0JQ0hBTjVHKDEwMCwgMCksIENIQU41RygxMDQsIDApLAotCUNIQU41RygxMDgsIDApLCBDSEFONUcoMTEyLCAwKSwKLQlDSEFONUcoMTE2LCAwKSwgQ0hBTjVHKDEyMCwgMCksCi0JQ0hBTjVHKDEyNCwgMCksIENIQU41RygxMjgsIDApLAotCUNIQU41RygxMzIsIDApLCBDSEFONUcoMTM2LCAwKSwKLQlDSEFONUcoMTQwLCAwKSwgQ0hBTjVHKDE0OSwgMCksCi0JQ0hBTjVHKDE1MywgMCksIENIQU41RygxNTcsIDApLAotCUNIQU41RygxNjEsIDApLCBDSEFONUcoMTY1LCAwKSwKLQlDSEFONUcoMTg0LCAwKSwgQ0hBTjVHKDE4OCwgMCksCi0JQ0hBTjVHKDE5MiwgMCksIENIQU41RygxOTYsIDApLAotCUNIQU41RygyMDAsIDApLCBDSEFONUcoMjA0LCAwKSwKLQlDSEFONUcoMjA4LCAwKSwgQ0hBTjVHKDIxMiwgMCksCi0JQ0hBTjVHKDIxNiwgMCksCi19OwotCi1zdGF0aWMgdm9pZCBydHdfMmdfY2hhbm5lbHNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWxzKQotewotCW1lbWNweSgodm9pZCAqKWNoYW5uZWxzLCAodm9pZCAqKXJ0d18yZ2h6X2NoYW5uZWxzLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsKSAqIFJUV18yR19DSEFOTkVMU19OVU0pOwotfQotCi1zdGF0aWMgdm9pZCBydHdfNWdfY2hhbm5lbHNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWxzKQotewotCW1lbWNweSgodm9pZCAqKWNoYW5uZWxzLCAodm9pZCAqKXJ0d181Z2h6X2FfY2hhbm5lbHMsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwpICogUlRXXzVHX0NIQU5ORUxTX05VTSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0d18yZ19yYXRlc19pbml0KHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZXMpCi17Ci0JbWVtY3B5KHJhdGVzLCBydHdfZ19yYXRlcywKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSkgKiBSVFdfR19SQVRFU19OVU0pOwotfQotCi1zdGF0aWMgdm9pZCBydHdfNWdfcmF0ZXNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGVzKQotewotCW1lbWNweShyYXRlcywgcnR3X2FfcmF0ZXMsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JhdGUpICogUlRXX0FfUkFURVNfTlVNKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKgotcnR3X3NwdF9iYW5kX2FsbG9jKGVudW0gbmw4MDIxMV9iYW5kIGJhbmQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc3B0X2JhbmQgPSBOVUxMOwotCWludCBuX2NoYW5uZWxzLCBuX2JpdHJhdGVzOwotCi0JaWYgKGJhbmQgPT0gTkw4MDIxMV9CQU5EXzJHSFopIHsKLQkJbl9jaGFubmVscyA9IFJUV18yR19DSEFOTkVMU19OVU07Ci0JCW5fYml0cmF0ZXMgPSBSVFdfR19SQVRFU19OVU07Ci0JfSBlbHNlIGlmIChiYW5kID09IE5MODAyMTFfQkFORF81R0haKSB7Ci0JCW5fY2hhbm5lbHMgPSBSVFdfNUdfQ0hBTk5FTFNfTlVNOwotCQluX2JpdHJhdGVzID0gUlRXX0FfUkFURVNfTlVNOwotCX0gZWxzZSB7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0Jc3B0X2JhbmQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kKSArCi0JCQkgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsKSAqIG5fY2hhbm5lbHMgKwotCQkJICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcmF0ZSkgKiBuX2JpdHJhdGVzLAotCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzcHRfYmFuZCkKLQkJZ290byBleGl0OwotCi0Jc3B0X2JhbmQtPmNoYW5uZWxzID0KLQkJKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqKSgoKHU4ICopIHNwdF9iYW5kKSArCi0JCQkJCSAgICAgc2l6ZW9mKHN0cnVjdAotCQkJCQkJICAgIGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCkpOwotCXNwdF9iYW5kLT5iaXRyYXRlcyA9Ci0JCShzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKikoKCh1OCAqKSBzcHRfYmFuZC0+Y2hhbm5lbHMpICsKLQkJCQkJICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsKSAqCi0JCQkJCSAgbl9jaGFubmVscyk7Ci0Jc3B0X2JhbmQtPmJhbmQgPSBiYW5kOwotCXNwdF9iYW5kLT5uX2NoYW5uZWxzID0gbl9jaGFubmVsczsKLQlzcHRfYmFuZC0+bl9iaXRyYXRlcyA9IG5fYml0cmF0ZXM7Ci0KLQlpZiAoYmFuZCA9PSBOTDgwMjExX0JBTkRfMkdIWikgewotCQlydHdfMmdfY2hhbm5lbHNfaW5pdChzcHRfYmFuZC0+Y2hhbm5lbHMpOwotCQlydHdfMmdfcmF0ZXNfaW5pdChzcHRfYmFuZC0+Yml0cmF0ZXMpOwotCX0gZWxzZSBpZiAoYmFuZCA9PSBOTDgwMjExX0JBTkRfNUdIWikgewotCQlydHdfNWdfY2hhbm5lbHNfaW5pdChzcHRfYmFuZC0+Y2hhbm5lbHMpOwotCQlydHdfNWdfcmF0ZXNfaW5pdChzcHRfYmFuZC0+Yml0cmF0ZXMpOwotCX0KLQotCS8qIHNwdF9iYW5kLmh0X2NhcCAqLwotCi1leGl0OgotCXJldHVybiBzcHRfYmFuZDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhyeF9zdHlwZXMKLXJ0d19jZmc4MDIxMV9kZWZhdWx0X21nbXRfc3R5cGVzW05VTV9OTDgwMjExX0lGVFlQRVNdID0gewotCVtOTDgwMjExX0lGVFlQRV9BREhPQ10gPSB7Ci0JCS50eCA9IDB4ZmZmZiwKLQkJLnJ4ID0gQklUKElFRUU4MDIxMV9TVFlQRV9BQ1RJT04gPj4gNCkKLQl9LAotCVtOTDgwMjExX0lGVFlQRV9TVEFUSU9OXSA9IHsKLQkJLnR4ID0gMHhmZmZmLAotCQkucnggPSBCSVQoSUVFRTgwMjExX1NUWVBFX0FDVElPTiA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRID4+IDQpCi0JfSwKLQlbTkw4MDIxMV9JRlRZUEVfQVBdID0gewotCQkudHggPSAweGZmZmYsCi0JCS5yeCA9IEJJVChJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfQVVUSCA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfREVBVVRIID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9BQ1RJT04gPj4gNCkKLQl9LAotCVtOTDgwMjExX0lGVFlQRV9BUF9WTEFOXSA9IHsKLQkJLyogY29weSBBUCAqLwotCQkudHggPSAweGZmZmYsCi0JCS5yeCA9IEJJVChJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9ESVNBU1NPQyA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfQVVUSCA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfREVBVVRIID4+IDQpIHwKLQkJICAgICAgQklUKElFRUU4MDIxMV9TVFlQRV9BQ1RJT04gPj4gNCkKLQl9LAotCVtOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UXSA9IHsKLQkJLnR4ID0gMHhmZmZmLAotCQkucnggPSBCSVQoSUVFRTgwMjExX1NUWVBFX0FDVElPTiA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRID4+IDQpCi0JfSwKLQlbTkw4MDIxMV9JRlRZUEVfUDJQX0dPXSA9IHsKLQkJLnR4ID0gMHhmZmZmLAotCQkucnggPSBCSVQoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEgPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MgPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX0FVVEggPj4gNCkgfAotCQkgICAgICBCSVQoSUVFRTgwMjExX1NUWVBFX0RFQVVUSCA+PiA0KSB8Ci0JCSAgICAgIEJJVChJRUVFODAyMTFfU1RZUEVfQUNUSU9OID4+IDQpCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX2luZm9ybV9ic3Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICBzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKm5vdGlmeV9jaGFubmVsOwotCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKLQl1MTYgY2hhbm5lbDsKLQl1MzIgZnJlcTsKLQl1OCAqbm90aWZ5X2llOwotCXNpemVfdCBub3RpZnlfaWVsZW47Ci0JczMyIG5vdGlmeV9zaWduYWw7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IHBhZGFwdGVyLT5ydHdfd2RldjsKLQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCWNoYW5uZWwgPSBwbmV0d29yay0+bmV0d29yay5EU0NvbmZpZzsKLQlpZiAoY2hhbm5lbCA8PSBSVFdfQ0hfTUFYXzJHX0NIQU5ORUwpCi0JCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbm5lbCwKLQkJCQkJCSAgICAgIE5MODAyMTFfQkFORF8yR0haKTsKLQllbHNlCi0JCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbm5lbCwKLQkJCQkJCSAgICAgIE5MODAyMTFfQkFORF81R0haKTsKLQotCW5vdGlmeV9jaGFubmVsID0gaWVlZTgwMjExX2dldF9jaGFubmVsKHdpcGh5LCBmcmVxKTsKLQotCW5vdGlmeV9pZSA9IHBuZXR3b3JrLT5uZXR3b3JrLklFczsKLQlub3RpZnlfaWVsZW4gPSBwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aDsKLQotCS8qIFdlJ3ZlIHNldCB3aXBoeSdzIHNpZ25hbF90eXBlIGFzIENGRzgwMjExX1NJR05BTF9UWVBFX01CTToKLQkgKiAgc2lnbmFsIHN0cmVuZ3RoIGluIG1CbSAoMTAwKmRCbSkKLQkgKi8KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpICYmCi0JICAgIGlzX3NhbWVfbmV0d29yazIzYSgmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLAotCQkJICAgICZwbmV0d29yay0+bmV0d29yaykpIHsKLQkJbm90aWZ5X3NpZ25hbCA9IDEwMCAqIHRyYW5zbGF0ZV9wZXJjZW50YWdlX3RvX2RibShwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsX3N0cmVuZ3RoKTsJLyogZGJtICovCi0JfSBlbHNlIHsKLQkJbm90aWZ5X3NpZ25hbCA9IDEwMCAqIHRyYW5zbGF0ZV9wZXJjZW50YWdlX3RvX2RibSgKLQkJCXBuZXR3b3JrLT5uZXR3b3JrLlNpZ25hbFN0cmVuZ3RoKTsJLyogZGJtICovCi0JfQotCi0JYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwgbm90aWZ5X2NoYW5uZWwsCi0JCQkJICBDRkc4MDIxMV9CU1NfRlRZUEVfVU5LTk9XTiwKLQkJCQkgIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkJICBwbmV0d29yay0+bmV0d29yay50c2YsCi0JCQkJICBwbmV0d29yay0+bmV0d29yay5jYXBhYmlsaXR5LAotCQkJCSAgcG5ldHdvcmstPm5ldHdvcmsuYmVhY29uX2ludGVydmFsLAotCQkJCSAgbm90aWZ5X2llLCBub3RpZnlfaWVsZW4sCi0JCQkJICBub3RpZnlfc2lnbmFsLCBHRlBfQVRPTUlDKTsKLQotCWlmICh1bmxpa2VseSghYnNzKSkgewotCQlEQkdfODcyM0EoInJ0d19jZmc4MDIxMV9pbmZvcm1fYnNzIGVycm9yXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY2ZnODAyMTFfcHV0X2Jzcyh3aXBoeSwgYnNzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcnR3X2NmZzgwMjExX2luZGljYXRlX2Nvbm5lY3Qoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCB3bGFuX25ldHdvcmsgKmN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqcHdkZXYgPSBwYWRhcHRlci0+cnR3X3dkZXY7Ci0KLQlEQkdfODcyM0EoIiVzKHBhZGFwdGVyID0lcClcbiIsIF9fZnVuY19fLCBwYWRhcHRlcik7Ci0KLQlpZiAocHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCi0JICAgIHB3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkKLQkJcmV0dXJuOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkKLQkJcmV0dXJuOwotCi0JaWYgKHBhZGFwdGVyLT5tbG1lcHJpdi50b19yb2FtaW5nID4gMCkgewotCQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gcHdkZXYtPndpcGh5OwotCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKm5vdGlmeV9jaGFubmVsOwotCQl1MzIgZnJlcTsKLQkJdTE2IGNoYW5uZWwgPSBjdXJfbmV0d29yay0+bmV0d29yay5EU0NvbmZpZzsKLQotCQlpZiAoY2hhbm5lbCA8PSBSVFdfQ0hfTUFYXzJHX0NIQU5ORUwpCi0JCQlmcmVxID0KLQkJCSAgICBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koY2hhbm5lbCwKLQkJCQkJCQkgICBOTDgwMjExX0JBTkRfMkdIWik7Ci0JCWVsc2UKLQkJCWZyZXEgPQotCQkJICAgIGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaGFubmVsLAotCQkJCQkJCSAgIE5MODAyMTFfQkFORF81R0haKTsKLQotCQlub3RpZnlfY2hhbm5lbCA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbCh3aXBoeSwgZnJlcSk7Ci0KLQkJREJHXzg3MjNBKCIlcyBjYWxsIGNmZzgwMjExX3JvYW1lZFxuIiwgX19mdW5jX18pOwotCQljZmc4MDIxMV9yb2FtZWQocGFkYXB0ZXItPnBuZXRkZXYsIG5vdGlmeV9jaGFubmVsLAotCQkJCWN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkJcG1sbWVwcml2LT5hc3NvY19yZXEgKwotCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyAyLAotCQkJCXBtbG1lcHJpdi0+YXNzb2NfcmVxX2xlbiAtCi0JCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSAtIDIsCi0JCQkJcG1sbWVwcml2LT5hc3NvY19yc3AgKwotCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA2LAotCQkJCXBtbG1lcHJpdi0+YXNzb2NfcnNwX2xlbiAtCi0JCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSAtIDYsCi0JCQkJR0ZQX0FUT01JQyk7Ci0JfSBlbHNlIHsKLQkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQocGFkYXB0ZXItPnBuZXRkZXYsCi0JCQkJCWN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCi0JCQkJCXBtbG1lcHJpdi0+YXNzb2NfcmVxICsKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDIsCi0JCQkJCXBtbG1lcHJpdi0+YXNzb2NfcmVxX2xlbiAtCi0JCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgLSAyLAotCQkJCQlwbWxtZXByaXYtPmFzc29jX3JzcCArCi0JCQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA2LAotCQkJCQlwbWxtZXByaXYtPmFzc29jX3JzcF9sZW4gLQotCQkJCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpIC0gNiwKLQkJCQkJV0xBTl9TVEFUVVNfU1VDQ0VTUywgR0ZQX0FUT01JQyk7Ci0JfQotfQotCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9kaXNjb25uZWN0KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpwd2RldiA9IHBhZGFwdGVyLT5ydHdfd2RldjsKLQotCURCR184NzIzQSgiJXMocGFkYXB0ZXIgPSVwKVxuIiwgX19mdW5jX18sIHBhZGFwdGVyKTsKLQotCWlmIChwd2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKLQkgICAgcHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKQotCQlyZXR1cm47Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKQotCQlyZXR1cm47Ci0KLQlpZiAoIXBhZGFwdGVyLT5tbG1lcHJpdi5ub3RfaW5kaWNfZGlzY28pIHsKLQkJaWYgKGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9MSU5LSU5HKSkgewotCQkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQocGFkYXB0ZXItPnBuZXRkZXYsIE5VTEwsIE5VTEwsCi0JCQkJCQkwLCBOVUxMLCAwLAotCQkJCQkJV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSwKLQkJCQkJCUdGUF9BVE9NSUMpOwotCQl9IGVsc2UgewotCQkJY2ZnODAyMTFfZGlzY29ubmVjdGVkKHBhZGFwdGVyLT5wbmV0ZGV2LCAwLCBOVUxMLAotCQkJCQkgICAgICAwLCBmYWxzZSwgR0ZQX0FUT01JQyk7Ci0JCX0KLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLXN0YXRpYyBpbnQgc2V0X3BhaXJ3aXNlX2tleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBoMmM7Ci0Jc3RydWN0IHNldF9zdGFrZXlfcGFybSAqcHNldHN0YWtleV9wYXJhOwotCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7Ci0JaW50IHJlcyA9IF9TVUNDRVNTOwotCi0JcGgyYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBoMmMgPT0gTlVMTCkgewotCQlyZXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBzZXRzdGFrZXlfcGFyYSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRfc3Rha2V5X3Bhcm0pLCBHRlBfS0VSTkVMKTsKLQlpZiAocHNldHN0YWtleV9wYXJhID09IE5VTEwpIHsKLQkJa2ZyZWUocGgyYyk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHNldHN0YWtleV9wYXJhLCBfU2V0U3RhS2V5X0NNRF8pOwotCi0JcHNldHN0YWtleV9wYXJhLT5hbGdvcml0aG0gPSBwc3RhLT5kb3QxMTgwMjFYUHJpdmFjeTsKLQotCWV0aGVyX2FkZHJfY29weShwc2V0c3Rha2V5X3BhcmEtPmFkZHIsIHBzdGEtPmh3YWRkcik7Ci0KLQltZW1jcHkocHNldHN0YWtleV9wYXJhLT5rZXksICZwc3RhLT5kb3QxMTgwMjF4X1VuY3N0S2V5LCAxNik7Ci0KLQlyZXMgPSBydHdfZW5xdWV1ZV9jbWQyM2EocGNtZHByaXYsIHBoMmMpOwotCi1leGl0OgotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X2dyb3VwX2tleShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFybXMsCi0JCQkgdTMyIGFsZywgdTgga2V5aWQpCi17Ci0Jc3RydWN0IGNtZF9vYmogKnBjbWQ7Ci0Jc3RydWN0IHNldGtleV9wYXJtICpwc2V0a2V5cGFybTsKLQlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwotCWludCByZXMgPSBfU1VDQ0VTUzsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCWlmIChrZXlpZCA+PSA0KSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwY21kKSB7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXBzZXRrZXlwYXJtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNldGtleV9wYXJtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwc2V0a2V5cGFybSkgewotCQlrZnJlZShwY21kKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlwc2V0a2V5cGFybS0+a2V5aWQgPSBrZXlpZDsKLQlpZiAoaXNfd2VwX2VuYyhhbGcpKQotCQlwYWRhcHRlci0+bWxtZXByaXYua2V5X21hc2sgfD0gQklUKHBzZXRrZXlwYXJtLT5rZXlpZCk7Ci0KLQlwc2V0a2V5cGFybS0+YWxnb3JpdGhtID0gYWxnOwotCi0JcHNldGtleXBhcm0tPnNldF90eCA9IDE7Ci0KLQltZW1jcHkoJnBzZXRrZXlwYXJtLT5rZXksIHBhcm1zLT5rZXksIHBhcm1zLT5rZXlfbGVuKTsKLQotCXBjbWQtPmNtZGNvZGUgPSBfU2V0S2V5X0NNRF87Ci0JcGNtZC0+cGFybWJ1ZiA9ICh1OCAqKSBwc2V0a2V5cGFybTsKLQlwY21kLT5jbWRzeiA9IHNpemVvZihzdHJ1Y3Qgc2V0a2V5X3Bhcm0pOwotCXBjbWQtPnJzcCA9IE5VTEw7Ci0JcGNtZC0+cnNwc3ogPSAwOwotCi0JcmVzID0gcnR3X2VucXVldWVfY21kMjNhKHBjbWRwcml2LCBwY21kKTsKLQotZXhpdDoKLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50IHJ0d19jZmc4MDIxMV9hcF9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBrZXlfaW5kZXgsCi0JCQkJCSAgaW50IHNldF90eCwgY29uc3QgdTggKnN0YV9hZGRyLAotCQkJCQkgIHN0cnVjdCBrZXlfcGFyYW1zICprZXlwYXJtcykKLXsKLQlpbnQga2V5X2xlbjsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEgPSBOVUxMLCAqcGJjbWNfc3RhID0gTlVMTDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHN0YV9hZGRyKSkgewotCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBzdGFfYWRkcik7Ci0JCWlmICghcHN0YSkgewotCQkJLyogcmV0ID0gLUVJTlZBTDsgKi8KLQkJCURCR184NzIzQSgicnR3X3NldF9lbmNyeXB0aW9uKCksIHN0YSBoYXMgYWxyZWFkeSAiCi0JCQkJICAiYmVlbiByZW1vdmVkIG9yIG5ldmVyIGJlZW4gYWRkZWRcbiIpOwotCQkJZ290byBleGl0OwotCQl9Ci0JfQotCi0Ja2V5X2xlbiA9IGtleXBhcm1zLT5rZXlfbGVuOwotCi0JaWYgKCFwc3RhICYmIChrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8Ci0JCSAgICAgIGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSkgewotCQlEQkdfODcyM0EoInI4NzF4X3NldF9lbmNyeXB0aW9uLCBjcnlwdC5hbGcgPSBXRVBcbiIpOwotCi0JCURCR184NzIzQSgicjg3MXhfc2V0X2VuY3J5cHRpb24sIHdlcF9rZXlfaWR4ID0lZCwgbGVuID0lZFxuIiwKLQkJCSAga2V5X2luZGV4LCBrZXlfbGVuKTsKLQotCQlpZiAocHNlY3VyaXR5cHJpdi0+YldlcERlZmF1bHRLZXlJZHhTZXQgPT0gMCkgewotCQkJLyogd2VwIGRlZmF1bHQga2V5IGhhcyBub3QgYmVlbiBzZXQsIHNvIHVzZQotCQkJICAgdGhpcyBrZXkgaW5kZXggYXMgZGVmYXVsdCBrZXkuICovCi0KLQkJCXBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0KLQkJCQlOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9IGtleXBhcm1zLT5jaXBoZXI7Ci0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IGtleXBhcm1zLT5jaXBoZXI7Ci0KLQkJCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4ID0ga2V5X2luZGV4OwotCQl9Ci0KLQkJbWVtY3B5KCZwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleV9pbmRleF0ua2V5LAotCQkgICAgICAga2V5cGFybXMtPmtleSwga2V5X2xlbik7Ci0KLQkJcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlfaW5kZXhdLmtleWxlbiA9IGtleV9sZW47Ci0KLQkJc2V0X2dyb3VwX2tleShwYWRhcHRlciwga2V5cGFybXMsIGtleXBhcm1zLT5jaXBoZXIsIGtleV9pbmRleCk7Ci0KLQkJZ290byBleGl0OwotCX0KLQotCWlmICghcHN0YSkgewkvKiAgZ3JvdXAga2V5ICovCi0JCWlmIChzZXRfdHggPT0gMCkgewkvKiBncm91cCBrZXkgKi8KLQkJCWlmIChrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8Ci0JCQkgICAga2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpIHsKLQkJCQlEQkdfODcyM0EoIiVzLCBzZXQgZ3JvdXBfa2V5LCBXRVBcbiIsIF9fZnVuY19fKTsKLQotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycEtleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgIGtleXBhcm1zLT5rZXksIGtleV9sZW4pOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPQotCQkJCQlrZXlwYXJtcy0+Y2lwaGVyOwotCQkJfSBlbHNlIGlmIChrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApIHsKLQkJCQlEQkdfODcyM0EoIiVzLCBzZXQgZ3JvdXBfa2V5LCBUS0lQXG4iLAotCQkJCQkgIF9fZnVuY19fKTsKLQotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQkJV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDsKLQotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycEtleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgIGtleXBhcm1zLT5rZXksCi0JCQkJICAgICAgIChtaW4oMTYsIGtleV9sZW4pKSk7Ci0KLQkJCQkvKiBzZXQgbWljIGtleSAqLwotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycHR4bWlja2V5W2tleV9pbmRleF0uc2tleSwKLQkJCQkgICAgICAgJmtleXBhcm1zLT5rZXlbMTZdLCA4KTsKLQkJCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+Ci0JCQkJICAgICAgIGRvdDExODAyMVhHcnByeG1pY2tleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgICZrZXlwYXJtcy0+a2V5WzI0XSwgOCk7Ci0KLQkJCQlwc2VjdXJpdHlwcml2LT5idXNldGtpcGtleSA9IDE7Ci0KLQkJCX0gZWxzZSBpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKSB7Ci0JCQkJCURCR184NzIzQSgiJXMsIHNldCBncm91cF9rZXksIENDTVBcbiIsCi0JCQkJCSAgX19mdW5jX18pOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPQotCQkJCQlXTEFOX0NJUEhFUl9TVUlURV9DQ01QOwotCi0JCQkJbWVtY3B5KHBzZWN1cml0eXByaXYtPgotCQkJCSAgICAgICBkb3QxMTgwMjFYR3JwS2V5W2tleV9pbmRleF0uc2tleSwKLQkJCQkgICAgICAga2V5cGFybXMtPmtleSwKLQkJCQkgICAgICAgKG1pbigxNiwga2V5X2xlbikpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgc2V0IGdyb3VwX2tleSwgbm9uZVxuIiwKLQkJCQkJICBfX2Z1bmNfXyk7Ci0KLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IDA7Ci0JCQl9Ci0KLQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZCA9IGtleV9pbmRleDsKLQotCQkJcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkgPSAxOwotCi0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0KLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeTsKLQotCQkJc2V0X2dyb3VwX2tleShwYWRhcHRlciwga2V5cGFybXMsCi0JCQkJICAgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3ksCi0JCQkJICAgICAga2V5X2luZGV4KTsKLQotCQkJcGJjbWNfc3RhID0gcnR3X2dldF9iY21jX3N0YWluZm8yM2EocGFkYXB0ZXIpOwotCQkJaWYgKHBiY21jX3N0YSkgewotCQkJCXBiY21jX3N0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPSBmYWxzZTsKLQkJCQkvKiByeCB3aWxsIHVzZSBibWNfc3RhJ3MgZG90MTE4MDIxWFByaXZhY3kgKi8KLQkJCQlwYmNtY19zdGEtPmRvdDExODAyMVhQcml2YWN5ID0KLQkJCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3k7Ci0KLQkJCX0KLQotCQl9Ci0KLQkJZ290byBleGl0OwotCX0KLQotCWlmIChwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID09IGRvdDExQXV0aEFsZ3J0aG1fODAyMVggJiYgcHN0YSkgewotCQkvKiAgcHNrLzgwMl8xeCAqLwotCQlpZiAoc2V0X3R4ID09IDEpIHsKLQkJCS8qIHBhaXJ3aXNlIGtleSAqLwotCQkJbWVtY3B5KHBzdGEtPmRvdDExODAyMXhfVW5jc3RLZXkuc2tleSwKLQkJCSAgICAgICBrZXlwYXJtcy0+a2V5LCAobWluKDE2LCBrZXlfbGVuKSkpOwotCi0JCQlpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCQkJICAgIGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgc2V0IHBhaXJ3aXNlIGtleSwgV0VQXG4iLAotCQkJCQkgIF9fZnVuY19fKTsKLQotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQkJa2V5cGFybXMtPmNpcGhlcjsKLQkJCX0gZWxzZSBpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgc2V0IHBhaXJ3aXNlIGtleSwgVEtJUFxuIiwKLQkJCQkJICBfX2Z1bmNfXyk7Ci0KLQkJCQlwc3RhLT5kb3QxMTgwMjFYUHJpdmFjeSA9Ci0JCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA7Ci0KLQkJCQkvKiBzZXQgbWljIGtleSAqLwotCQkJCW1lbWNweShwc3RhLT5kb3QxMXRraXB0eG1pY2tleS5za2V5LAotCQkJCSAgICAgICAma2V5cGFybXMtPmtleVsxNl0sIDgpOwotCQkJCW1lbWNweShwc3RhLT5kb3QxMXRraXByeG1pY2tleS5za2V5LAotCQkJCSAgICAgICAma2V5cGFybXMtPmtleVsyNF0sIDgpOwotCi0JCQkJcHNlY3VyaXR5cHJpdi0+YnVzZXRraXBrZXkgPSAxOwotCi0JCQl9IGVsc2UgaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkgewotCQkJCURCR184NzIzQSgiJXMsIHNldCBwYWlyd2lzZSBrZXksIENDTVBcbiIsCi0JCQkJCSAgX19mdW5jX18pOwotCi0JCQkJcHN0YS0+ZG90MTE4MDIxWFByaXZhY3kgPQotCQkJCQlXTEFOX0NJUEhFUl9TVUlURV9DQ01QOwotCQkJfSBlbHNlIHsKLQkJCQlEQkdfODcyM0EoIiVzLCBzZXQgcGFpcndpc2Uga2V5LCBub25lXG4iLAotCQkJCQkgIF9fZnVuY19fKTsKLQotCQkJCXBzdGEtPmRvdDExODAyMVhQcml2YWN5ID0gMDsKLQkJCX0KLQotCQkJc2V0X3BhaXJ3aXNlX2tleShwYWRhcHRlciwgcHN0YSk7Ci0KLQkJCXBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gZmFsc2U7Ci0KLQkJCXBzdGEtPmJwYWlyd2lzZV9rZXlfaW5zdGFsbGVkID0gdHJ1ZTsKLQkJfSBlbHNlIHsJLyogZ3JvdXAga2V5Pz8/ICovCi0JCQlpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCQkJICAgIGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSB7Ci0JCQkJbWVtY3B5KHBzZWN1cml0eXByaXYtPgotCQkJCSAgICAgICBkb3QxMTgwMjFYR3JwS2V5W2tleV9pbmRleF0uc2tleSwKLQkJCQkgICAgICAga2V5cGFybXMtPmtleSwga2V5X2xlbik7Ci0KLQkJCQlwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9Ci0JCQkJCWtleXBhcm1zLT5jaXBoZXI7Ci0JCQl9IGVsc2UgaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCkgewotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQkJV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDsKLQotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycEtleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgIGtleXBhcm1zLT5rZXksCi0JCQkJICAgICAgIChtaW4oMTYsIGtleV9sZW4pKSk7Ci0KLQkJCQkvKiBzZXQgbWljIGtleSAqLwotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycHR4bWlja2V5W2tleV9pbmRleF0uc2tleSwKLQkJCQkgICAgICAgJmtleXBhcm1zLT5rZXlbMTZdLCA4KTsKLQkJCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+Ci0JCQkJICAgICAgIGRvdDExODAyMVhHcnByeG1pY2tleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgICZrZXlwYXJtcy0+a2V5WzI0XSwgOCk7Ci0KLQkJCQlwc2VjdXJpdHlwcml2LT5idXNldGtpcGtleSA9IDE7Ci0JCQl9IGVsc2UgaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkgewotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQkJV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDsKLQotCQkJCW1lbWNweShwc2VjdXJpdHlwcml2LT4KLQkJCQkgICAgICAgZG90MTE4MDIxWEdycEtleVtrZXlfaW5kZXhdLnNrZXksCi0JCQkJICAgICAgIGtleXBhcm1zLT5rZXksCi0JCQkJICAgICAgIChtaW4oMTYsIGtleV9sZW4pKSk7Ci0JCQl9IGVsc2UgewotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0gMDsKLQkJCX0KLQotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkID0ga2V5X2luZGV4OwotCi0JCQlwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSA9IDE7Ci0KLQkJCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPQotCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5OwotCi0JCQlzZXRfZ3JvdXBfa2V5KHBhZGFwdGVyLCBrZXlwYXJtcywKLQkJCQkgICAgICBwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSwKLQkJCQkgICAgICBrZXlfaW5kZXgpOwotCi0JCQlwYmNtY19zdGEgPSBydHdfZ2V0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0JCQlpZiAocGJjbWNfc3RhKSB7Ci0JCQkJLyogcnggd2lsbCB1c2UgYm1jX3N0YSdzCi0JCQkJICAgZG90MTE4MDIxWFByaXZhY3kgKi8KLQkJCQlwYmNtY19zdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gZmFsc2U7Ci0JCQkJcGJjbWNfc3RhLT5kb3QxMTgwMjFYUHJpdmFjeSA9Ci0JCQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5OwotCQkJfQotCQl9Ci0JfQotCi1leGl0OgotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfc2V0X2VuY3J5cHRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgga2V5X2luZGV4LAotCQkJCSAgICAgICBpbnQgc2V0X3R4LCBjb25zdCB1OCAqc3RhX2FkZHIsCi0JCQkJICAgICAgIHN0cnVjdCBrZXlfcGFyYW1zICprZXlwYXJtcykKLXsKLQlpbnQgcmV0ID0gMDsKLQlpbnQga2V5X2xlbjsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlrZXlfbGVuID0ga2V5cGFybXMtPmtleV9sZW47Ci0KLQlpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCSAgICBrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYywgX2Rydl9lcnJfLAotCQkJICJ3cGFfc2V0X2VuY3J5cHRpb24sIGNyeXB0LmFsZyA9IFdFUFxuIik7Ci0JCURCR184NzIzQSgid3BhX3NldF9lbmNyeXB0aW9uLCBjcnlwdC5hbGcgPSBXRVBcbiIpOwotCi0JCWlmIChwc2VjdXJpdHlwcml2LT5iV2VwRGVmYXVsdEtleUlkeFNldCA9PSAwKSB7Ci0JCQkvKiB3ZXAgZGVmYXVsdCBrZXkgaGFzIG5vdCBiZWVuIHNldCwgc28gdXNlIHRoaXMKLQkJCSAgIGtleSBpbmRleCBhcyBkZWZhdWx0IGtleS4gKi8KLQotCQkJcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0ga2V5cGFybXMtPmNpcGhlcjsKLQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0ga2V5cGFybXMtPmNpcGhlcjsKLQotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXggPSBrZXlfaW5kZXg7Ci0JCX0KLQotCQltZW1jcHkoJnBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5X2luZGV4XS5rZXksCi0JCSAgICAgICBrZXlwYXJtcy0+a2V5LCBrZXlfbGVuKTsKLQotCQlwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleV9pbmRleF0ua2V5bGVuID0ga2V5X2xlbjsKLQotCQlydHdfc2V0X2tleTIzYShwYWRhcHRlciwgcHNlY3VyaXR5cHJpdiwga2V5X2luZGV4LCAwKTsKLQotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFBdXRoQWxncnRobSA9PQotCSAgICBkb3QxMUF1dGhBbGdydGhtXzgwMjFYKSB7CS8qICA4MDJfMXggKi8KLQkJc3RydWN0IHN0YV9pbmZvICpwc3RhLCAqcGJjbWNfc3RhOwotCQlzdHJ1Y3Qgc3RhX3ByaXYgKnBzdGFwcml2ID0gJnBhZGFwdGVyLT5zdGFwcml2OwotCi0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwKLQkJCQkgIFdJRklfU1RBVElPTl9TVEFURSB8IFdJRklfTVBfU1RBVEUpKSB7Ci0JCQkvKiBzdGEgbW9kZSAqLwotCQkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgZ2V0X2Jzc2lkKHBtbG1lcHJpdikpOwotCQkJaWYgKHBzdGEgPT0gTlVMTCkgewotCQkJCURCR184NzIzQSgiJXMsIDogT2J0YWluIFN0YV9pbmZvIGZhaWxcbiIsCi0JCQkJCSAgX19mdW5jX18pOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBKZWZmOiBkb24ndCBkaXNhYmxlIGllZWU4MDIxeF9ibG9ja2VkCi0JCQkJICAgd2hpbGUgY2xlYXJpbmcga2V5ICovCi0JCQkJaWYgKGtleXBhcm1zLT5jaXBoZXIgIT0gSVdfQVVUSF9DSVBIRVJfTk9ORSAmJgotCQkJCSAgICBrZXlwYXJtcy0+Y2lwaGVyICE9IDApCi0JCQkJCXBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID0gZmFsc2U7Ci0KLQkJCQlpZiAoKHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPT0KLQkJCQkgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQpIHx8Ci0JCQkJICAgIChwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID09Ci0JCQkJICAgICBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkKSkgewotCQkJCQlwc3RhLT5kb3QxMTgwMjFYUHJpdmFjeSA9Ci0JCQkJCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LgotCQkJCQkJZG90MTFQcml2YWN5QWxncnRobTsKLQkJCQl9Ci0KLQkJCQlpZiAoc2V0X3R4ID09IDEpIHsKLQkJCQkJLyogcGFpcndpc2Uga2V5ICovCi0JCQkJCURCR184NzIzQSgiJXMsIDogc2V0X3R4ID09IDFcbiIsCi0JCQkJCQkgIF9fZnVuY19fKTsKLQotCQkJCQltZW1jcHkocHN0YS0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5LAotCQkJCQkgICAgICAga2V5cGFybXMtPmtleSwKLQkJCQkJICAgICAgIChtaW4oMTYsIGtleV9sZW4pKSk7Ci0KLQkJCQkJaWYgKGtleXBhcm1zLT5jaXBoZXIgPT0KLQkJCQkJICAgIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApIHsKLQkJCQkJCW1lbWNweShwc3RhLT5kb3QxMXRraXB0eG1pY2tleS4KLQkJCQkJCSAgICAgICBza2V5LAotCQkJCQkJICAgICAgICZrZXlwYXJtcy0+a2V5WzE2XSwgOCk7Ci0JCQkJCQltZW1jcHkocHN0YS0+ZG90MTF0a2lwcnhtaWNrZXkuCi0JCQkJCQkgICAgICAgc2tleSwKLQkJCQkJCSAgICAgICAma2V5cGFybXMtPmtleVsyNF0sIDgpOwotCi0JCQkJCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LgotCQkJCQkJCWJ1c2V0a2lwa2V5ID0gMDsKLQkJCQkJfQotCQkJCQlEQkdfODcyM0EoIiB+fn5+c2V0IHN0YSBrZXk6dW5pY2FzdGtleVxuIik7Ci0KLQkJCQkJcnR3X3NldHN0YWtleV9jbWQyM2EocGFkYXB0ZXIsCi0JCQkJCQkJICAodW5zaWduZWQgY2hhciAqKXBzdGEsCi0JCQkJCQkJICB0cnVlKTsKLQkJCQl9IGVsc2UgewkvKiBncm91cCBrZXkgKi8KLQkJCQkJbWVtY3B5KHBhZGFwdGVyLT5zZWN1cml0eXByaXYuCi0JCQkJCSAgICAgICBkb3QxMTgwMjFYR3JwS2V5W2tleV9pbmRleF0uc2tleSwKLQkJCQkJICAgICAgIGtleXBhcm1zLT5rZXksCi0JCQkJCSAgICAgICAobWluKDE2LCBrZXlfbGVuKSkpOwotCQkJCQltZW1jcHkocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi4KLQkJCQkJICAgICAgIGRvdDExODAyMVhHcnB0eG1pY2tleVtrZXlfaW5kZXhdLgotCQkJCQkgICAgICAgc2tleSwgJmtleXBhcm1zLT5rZXlbMTZdLCA4KTsKLQkJCQkJbWVtY3B5KHBhZGFwdGVyLT5zZWN1cml0eXByaXYuCi0JCQkJCSAgICAgICBkb3QxMTgwMjFYR3JwcnhtaWNrZXlba2V5X2luZGV4XS4KLQkJCQkJICAgICAgIHNrZXksICZrZXlwYXJtcy0+a2V5WzI0XSwgOCk7Ci0JCQkJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuYmluc3RhbGxHcnBrZXkgPQotCQkJCQkJMTsKLQkJCQkJREJHXzg3MjNBCi0JCQkJCSAgICAoIiB+fn5+c2V0IHN0YSBrZXk6Z3JvdXBrZXlcbiIpOwotCi0JCQkJCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuCi0JCQkJCSAgICBkb3QxMTgwMjFYR3JwS2V5aWQgPSBrZXlfaW5kZXg7Ci0KLQkJCQkJcnR3X3NldF9rZXkyM2EocGFkYXB0ZXIsCi0JCQkJCQkgICAgJnBhZGFwdGVyLT5zZWN1cml0eXByaXYsCi0JCQkJCQkgICAga2V5X2luZGV4LCAxKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXBiY21jX3N0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQkJCWlmIChwYmNtY19zdGEpIHsKLQkJCQkvKiBKZWZmOiBkb24ndCBkaXNhYmxlIGllZWU4MDIxeF9ibG9ja2VkCi0JCQkJICAgd2hpbGUgY2xlYXJpbmcga2V5ICovCi0JCQkJaWYgKGtleXBhcm1zLT5jaXBoZXIgIT0gSVdfQVVUSF9DSVBIRVJfTk9ORSAmJgotCQkJCSAgICBrZXlwYXJtcy0+Y2lwaGVyICE9IDApCi0JCQkJCXBiY21jX3N0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPSBmYWxzZTsKLQotCQkJCWlmICgocGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9PQotCQkJCSAgICAgTmRpczgwMl8xMUVuY3J5cHRpb24yRW5hYmxlZCkgfHwKLQkJCQkgICAgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPT0KLQkJCQkgICAgIE5kaXM4MDJfMTFFbmNyeXB0aW9uM0VuYWJsZWQpKSB7Ci0JCQkJCXBiY21jX3N0YS0+ZG90MTE4MDIxWFByaXZhY3kgPQotCQkJCQkgICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi4KLQkJCQkJICAgIGRvdDExUHJpdmFjeUFsZ3J0aG07Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi1leGl0OgotCi0JREJHXzg3MjNBKCIlcywgcmV0ID0lZFxuIiwgX19mdW5jX18sIHJldCk7Ci0KLQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfYWRkX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQl1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsCi0JCQkJY29uc3QgdTggKm1hY19hZGRyLCBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKQotewotCWludCBzZXRfdHgsIHJldCA9IDA7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqcnR3X3dkZXYgPSB3aXBoeV90b193ZGV2KHdpcGh5KTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gd2lwaHlfdG9fYWRhcHRlcih3aXBoeSk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQl1OCBzdGFfYWRkcltFVEhfQUxFTl07Ci0KLQlEQkdfODcyM0EoIiVzKCVzKTogYWRkaW5nIGtleSBmb3IgJXBNXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSwKLQkJICBtYWNfYWRkcik7Ci0JREJHXzg3MjNBKCJjaXBoZXIgPSAweCV4XG4iLCBwYXJhbXMtPmNpcGhlcik7Ci0JREJHXzg3MjNBKCJrZXlfbGVuID0gMHgleFxuIiwgcGFyYW1zLT5rZXlfbGVuKTsKLQlEQkdfODcyM0EoInNlcV9sZW4gPSAweCV4XG4iLCBwYXJhbXMtPnNlcV9sZW4pOwotCURCR184NzIzQSgia2V5X2luZGV4ID0lZFxuIiwga2V5X2luZGV4KTsKLQlEQkdfODcyM0EoInBhaXJ3aXNlID0lZFxuIiwgcGFpcndpc2UpOwotCi0Jc3dpdGNoIChwYXJhbXMtPmNpcGhlcikgewotCWNhc2UgSVdfQVVUSF9DSVBIRVJfTk9ORToKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQlpZiAocGFyYW1zLT5rZXlfbGVuICE9IFdMQU5fS0VZX0xFTl9XRVA0MCkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQlpZiAocGFyYW1zLT5rZXlfbGVuICE9IFdMQU5fS0VZX0xFTl9XRVAxMDQpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoa2V5X2luZGV4ID49IFdFUF9LRVlTIHx8IHBhcmFtcy0+a2V5X2xlbiA8IDApIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQotCWV0aF9icm9hZGNhc3RfYWRkcihzdGFfYWRkcik7Ci0KLQlpZiAoIW1hY19hZGRyIHx8IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1hY19hZGRyKSkKLQkJc2V0X3R4ID0gMDsJLyogZm9yIHdwYS93cGEyIGdyb3VwIGtleSAqLwotCWVsc2UKLQkJc2V0X3R4ID0gMTsJLyogZm9yIHdwYS93cGEyIHBhaXJ3aXNlIGtleSAqLwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCXJldCA9IHJ0d19jZmc4MDIxMV9zZXRfZW5jcnlwdGlvbihuZGV2LCBrZXlfaW5kZXgsIHNldF90eCwKLQkJCQkJCSAgc3RhX2FkZHIsIHBhcmFtcyk7Ci0JfSBlbHNlIGlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkpIHsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkJaWYgKG1hY19hZGRyKQotCQkJZXRoZXJfYWRkcl9jb3B5KHN0YV9hZGRyLCBtYWNfYWRkcik7Ci0KLQkJcmV0ID0gcnR3X2NmZzgwMjExX2FwX3NldF9lbmNyeXB0aW9uKG5kZXYsIGtleV9pbmRleCwgc2V0X3R4LAotCQkJCQkJICAgICBzdGFfYWRkciwgcGFyYW1zKTsKLSNlbmRpZgotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiZXJyb3IhIGZ3X3N0YXRlID0gMHgleCwgaWZ0eXBlID0lZFxuIiwKLQkJCSAgcG1sbWVwcml2LT5md19zdGF0ZSwgcnR3X3dkZXYtPmlmdHlwZSk7Ci0KLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotY2ZnODAyMTFfcnR3X2dldF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCSAgICAgdTgga2V5X2luZGV4LCBib29sIHBhaXJ3aXNlLCBjb25zdCB1OCAqbWFjX2FkZHIsCi0JCSAgICAgdm9pZCAqY29va2llLAotCQkgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmNvb2tpZSwgc3RydWN0IGtleV9wYXJhbXMgKikpCi17Ci0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZGVsX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQl1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsCi0JCQkJY29uc3QgdTggKm1hY19hZGRyKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGtleV9pbmRleCA9JWRcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lLCBrZXlfaW5kZXgpOwotCi0JaWYgKGtleV9pbmRleCA9PSBwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lLZXlJbmRleCkgewotCQkvKiBjbGVhciB0aGUgZmxhZyBvZiB3ZXAgZGVmYXVsdCBrZXkgc2V0LiAqLwotCQlwc2VjdXJpdHlwcml2LT5iV2VwRGVmYXVsdEtleUlkeFNldCA9IDA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X3NldF9kZWZhdWx0X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTgga2V5X2luZGV4LAotCQkJCQlib29sIHVuaWNhc3QsIGJvb2wgbXVsdGljYXN0KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGtleV9pbmRleCA9JWQsIHVuaWNhc3QgPSVkLCBtdWx0aWNhc3QgPSVkLlxuIiwKLQkJICBfX2Z1bmNfXywgbmRldi0+bmFtZSwga2V5X2luZGV4LCB1bmljYXN0LCBtdWx0aWNhc3QpOwotCi0JaWYgKGtleV9pbmRleCA8IE5VTV9XRVBfS0VZUyAmJgotCSAgICAocHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCSAgICAgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpKSB7Ci0JCS8qIHNldCB3ZXAgZGVmYXVsdCBrZXkgKi8KLQkJcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCi0JCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4ID0ga2V5X2luZGV4OwotCi0JCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJaWYgKHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5X2luZGV4XS5rZXlsZW4gPT0gMTMpIHsKLQkJCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPQotCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDsKLQkJCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCX0KLQotCQkvKiBzZXQgdGhlIGZsYWcgdG8gcmVwcmVzZW50IHRoYXQgd2VwIGRlZmF1bHQga2V5Ci0JCSAgIGhhcyBiZWVuIHNldCAqLwotCQlwc2VjdXJpdHlwcml2LT5iV2VwRGVmYXVsdEtleUlkeFNldCA9IDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1MTYgcnR3X2dldF9jdXJfbWF4X3JhdGUoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCWludCBpID0gMDsKLQljb25zdCB1OCAqcDsKLQl1MTYgcmF0ZSA9IDAsIG1heF9yYXRlID0gMDsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmYWRhcHRlci0+bWxtZWV4dHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmYWRhcHRlci0+cmVnaXN0cnlwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAgKnBjdXJfYnNzID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqcGh0X2NhcGllOwotCXU4IHJmX3R5cGUgPSAwOwotCXU4IGJ3XzQwTUh6ID0gMCwgc2hvcnRfR0lfMjAgPSAwLCBzaG9ydF9HSV80MCA9IDA7Ci0JdTE2IG1jc19yYXRlID0gMDsKLQotCXAgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX0hUX0NBUEFCSUxJVFksCi0JCQkgICAgIHBjdXJfYnNzLT5JRXMsIHBjdXJfYnNzLT5JRUxlbmd0aCk7Ci0JaWYgKHAgJiYgcFsxXSA+IDApIHsKLQkJcGh0X2NhcGllID0gKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICopKHAgKyAyKTsKLQotCQltZW1jcHkoJm1jc19yYXRlLCAmcGh0X2NhcGllLT5tY3MsIDIpOwotCi0JCS8qIGJ3XzQwTUh6ID0gKHBodF9jYXBpZS0+Y2FwX2luZm8mCi0JCSAgIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwKSA/IDE6MDsgKi8KLQkJLyogY3VyX2J3bW9kIGlzIHVwZGF0ZWQgYnkgYmVhY29uLCBwbWxtZWluZm8gaXMKLQkJICAgdXBkYXRlZCBieSBhc3NvY2lhdGlvbiByZXNwb25zZSAqLwotCQlid180ME1IeiA9IChwbWxtZWV4dC0+Y3VyX2J3bW9kZSAmJgotCQkJICAgIChwbWxtZWluZm8tPkhUX2luZm8uaHRfcGFyYW0gJgotCQkJICAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBTl9XSURUSF9BTlkpKSA/IDE6MDsKLQotCQkvKiBzaG9ydF9HSSA9IChwaHRfY2FwaWUtPmNhcF9pbmZvICYgKElFRUU4MDIxMV9IVF9DQVAKLQkJICAgX1NHSV8yMHxJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpID8gMSA6IDA7ICovCi0JCXNob3J0X0dJXzIwID0gKHBtbG1laW5mby0+aHRfY2FwLmNhcF9pbmZvICYKLQkJCSAgICAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkpID8gMTowOwotCQlzaG9ydF9HSV80MCA9IChwbWxtZWluZm8tPmh0X2NhcC5jYXBfaW5mbyAmCi0JCQkgICAgICAgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKSA/IDE6MDsKLQotCQlyZl90eXBlID0gcnRsODcyM2FfZ2V0X3JmX3R5cGUoYWRhcHRlcik7Ci0JCW1heF9yYXRlID0gcnR3X21jc19yYXRlMjNhKHJmX3R5cGUsIGJ3XzQwTUh6ICYKLQkJCQkJICAgcHJlZ2lzdHJ5cHJpdi0+Y2J3NDBfZW5hYmxlLAotCQkJCQkgICBzaG9ydF9HSV8yMCwgc2hvcnRfR0lfNDAsCi0JCQkJCSAgICZwbWxtZWluZm8tPmh0X2NhcC5tY3MpOwotCX0gZWxzZSB7Ci0JCXdoaWxlIChwY3VyX2Jzcy0+U3VwcG9ydGVkUmF0ZXNbaV0gIT0gMCAmJgotCQkgICAgICAgcGN1cl9ic3MtPlN1cHBvcnRlZFJhdGVzW2ldICE9IDB4RkYpIHsKLQkJCXJhdGUgPSBwY3VyX2Jzcy0+U3VwcG9ydGVkUmF0ZXNbaV0gJiAweDdGOwotCQkJaWYgKHJhdGUgPiBtYXhfcmF0ZSkKLQkJCQltYXhfcmF0ZSA9IHJhdGU7Ci0JCQlpKys7Ci0JCX0KLQotCQltYXhfcmF0ZSA9IG1heF9yYXRlICogMTAgLyAyOwotCX0KLQotCXJldHVybiBtYXhfcmF0ZTsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZ2V0X3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJICAgIGNvbnN0IHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0Jc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsKLQotCXNpbmZvLT5maWxsZWQgPSAwOwotCi0JaWYgKCFtYWMpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IG1hYyA9PSVwXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSwgbWFjKTsKLQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBleGl0OwotCX0KLQotCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIG1hYyk7Ci0JaWYgKHBzdGEgPT0gTlVMTCkgewotCQlEQkdfODcyM0EoIiVzLCBzdGFfaW5mbyBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JREJHXzg3MjNBKCIlcyglcyk6IG1hYz0lcE1cbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lLCBtYWMpOwotCi0JLyogZm9yIGluZnJhLi9QMlBDbGllbnQgbW9kZSAqLwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSAmJgotCSAgICBjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKLQkJc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQotCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobWFjLCBjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKSkgewotCQkJREJHXzg3MjNBKCIlcywgbWlzbWF0Y2ggYnNzaWQ9JXBNXG4iLAotCQkJCSAgX19mdW5jX18sIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwotCQkJcmV0ID0gLUVOT0VOVDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXNpbmZvLT5maWxsZWQgfD0gQklUKE5MODAyMTFfU1RBX0lORk9fU0lHTkFMKTsKLQkJc2luZm8tPnNpZ25hbCA9IHRyYW5zbGF0ZV9wZXJjZW50YWdlX3RvX2RibShwYWRhcHRlci0+cmVjdnByaXYuCi0JCQkJCQkJICAgIHNpZ25hbF9zdHJlbmd0aCk7Ci0KLQkJc2luZm8tPmZpbGxlZCB8PSBCSVQoTkw4MDIxMV9TVEFfSU5GT19UWF9CSVRSQVRFKTsKLQkJc2luZm8tPnR4cmF0ZS5sZWdhY3kgPSBydHdfZ2V0X2N1cl9tYXhfcmF0ZShwYWRhcHRlcik7Ci0KLQkJc2luZm8tPmZpbGxlZCB8PSBCSVQoTkw4MDIxMV9TVEFfSU5GT19SWF9QQUNLRVRTKTsKLQkJc2luZm8tPnJ4X3BhY2tldHMgPSBzdGFfcnhfZGF0YV9wa3RzKHBzdGEpOwotCi0JCXNpbmZvLT5maWxsZWQgfD0gQklUKE5MODAyMTFfU1RBX0lORk9fVFhfUEFDS0VUUyk7Ci0JCXNpbmZvLT50eF9wYWNrZXRzID0gcHN0YS0+c3RhX3N0YXRzLnR4X3BrdHM7Ci0JfQotCi0JLyogZm9yIEFkLUhvYy9BUCBtb2RlICovCi0JaWYgKChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkgfHwKLQkgICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkgfHwKLQkgICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgJiYKLQkgICAgY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpCi0JICAgICkgewotCQkvKiBUT0RPOiBzaG91bGQgYWNxdWlyZSBzdGF0aW9uIGluZm8uLi4gKi8KLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9pbmZyYXN0cnVjdHVyZV9tb2RlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkJIGVudW0gbmw4MDIxMV9pZnR5cGUgaWZtb2RlKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqY3VyX25ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQllbnVtIG5sODAyMTFfaWZ0eXBlIG9sZF9tb2RlOwotCi0Jb2xkX21vZGUgPSBjdXJfbmV0d29yay0+bmV0d29yay5pZm1vZGU7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X25vdGljZV8sCi0JCSAiKyVzOiBvbGQgPSVkIG5ldyA9JWQgZndfc3RhdGUgPSAweCUwOHhcbiIsIF9fZnVuY19fLAotCQkgb2xkX21vZGUsIGlmbW9kZSwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0KLQlpZiAob2xkX21vZGUgIT0gaWZtb2RlKSB7Ci0JCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJICJjaGFuZ2UgbW9kZSFcbiIpOwotCi0JCWlmIChvbGRfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAotCQkgICAgb2xkX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0dPKSB7Ci0JCQkvKiBjaGFuZ2UgdG8gb3RoZXIgbW9kZSBmcm9tIE5kaXM4MDJfMTFBUE1vZGUgKi8KLQkJCWN1cl9uZXR3b3JrLT5qb2luX3JlcyA9IC0xOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0JCQlzdG9wX2FwX21vZGUyM2EocGFkYXB0ZXIpOwotI2VuZGlmCi0JCX0KLQotCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpIHx8Ci0JCSAgICBvbGRfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKLQkJCXJ0d19kaXNhc3NvY19jbWQyM2EocGFkYXB0ZXIsIDAsIHRydWUpOwotCi0JCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgfHwKLQkJICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpCi0JCQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EocGFkYXB0ZXIsIDEpOwotCi0JCWlmIChvbGRfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8Ci0JCSAgICBvbGRfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UIHx8Ci0JCSAgICBvbGRfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgewotCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQkJCS8qIHdpbGwgY2xyIExpbmtlZF9zdGF0ZTsgYmVmb3JlIHRoaXMgZnVuY3Rpb24sCi0JCQkJICAgd2UgbXVzdCBoYXZlIGNoa2VkIHdoZXRoZXIgaXNzdWUKLQkJCQkgICBkaXMtYXNzb2NfY21kIG9yIG5vdCAqLwotCQkJCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQkJCX0KLQkgICAgICAgfQotCi0JCWN1cl9uZXR3b3JrLT5uZXR3b3JrLmlmbW9kZSA9IGlmbW9kZTsKLQotCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgfldJRklfTlVMTF9TVEFURSk7Ci0KLQkJc3dpdGNoIChpZm1vZGUpIHsKLQkJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSk7Ci0JCQlicmVhazsKLQotCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6Ci0JCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgotCQljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgotCQkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKTsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkJCXN0YXJ0X2FwX21vZGUyM2EocGFkYXB0ZXIpOwotCQkJLyogcnR3X2luZGljYXRlX2Nvbm5lY3QyM2EocGFkYXB0ZXIpOyAqLwotI2VuZGlmCi0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBTZWNDbGVhckFsbEtleXMoYWRhcHRlcik7ICovCi0KLQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0JfQotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19jaGFuZ2VfaWZhY2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLCB1MzIgKmZsYWdzLAotCQkJCSAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKLXsKLQllbnVtIG5sODAyMTFfaWZ0eXBlIG9sZF90eXBlOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCB3aXJlbGVzc19kZXYgKnJ0d193ZGV2ID0gd2lwaHlfdG9fd2Rldih3aXBoeSk7Ci0JaW50IHJldCA9IDA7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKTogY2FsbCBuZXRkZXZfb3BlbjIzYVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCi0Jb2xkX3R5cGUgPSBydHdfd2Rldi0+aWZ0eXBlOwotCURCR184NzIzQSgiJXMoJXMpOiBvbGRfaWZ0eXBlID0lZCwgbmV3X2lmdHlwZSA9JWRcbiIsCi0JCSAgX19mdW5jX18sIG5kZXYtPm5hbWUsIG9sZF90eXBlLCB0eXBlKTsKLQotCWlmIChvbGRfdHlwZSAhPSB0eXBlKSB7Ci0JCXBtbG1lZXh0LT5hY3Rpb25fcHVibGljX3J4c2VxID0gMHhmZmZmOwotCQlwbWxtZWV4dC0+YWN0aW9uX3B1YmxpY19kaWFsb2dfdG9rZW4gPSAweGZmOwotCX0KLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQlydHdfd2Rldi0+aWZ0eXBlID0gdHlwZTsKLQotCWlmIChjZmc4MDIxMV9pbmZyYXN0cnVjdHVyZV9tb2RlKHBhZGFwdGVyLCB0eXBlKSAhPSBfU1VDQ0VTUykgewotCQlydHdfd2Rldi0+aWZ0eXBlID0gb2xkX3R5cGU7Ci0JCXJldCA9IC1FUEVSTTsKLQkJZ290byBleGl0OwotCX0KLQotCXJ0d19zZXRvcG1vZGVfY21kMjNhKHBhZGFwdGVyLCB0eXBlKTsKLQotZXhpdDoKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zY2FuX2RvbmUoc3RydWN0IHJ0d193ZGV2X3ByaXYgKnB3ZGV2X3ByaXYsCi0JCQkJICAgICBib29sIGFib3J0ZWQpCi17Ci0Jc3Bpbl9sb2NrX2JoKCZwd2Rldl9wcml2LT5zY2FuX3JlcV9sb2NrKTsKLQlpZiAocHdkZXZfcHJpdi0+c2Nhbl9yZXF1ZXN0ICE9IE5VTEwpIHsKLQkJREJHXzg3MjNBKCIlcyB3aXRoIHNjYW4gcmVxXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJaWYgKHB3ZGV2X3ByaXYtPnNjYW5fcmVxdWVzdC0+d2lwaHkgIT0KLQkJICAgIHB3ZGV2X3ByaXYtPnJ0d193ZGV2LT53aXBoeSkgewotCQkJREJHXzg3MjNBKCJlcnJvciB3aXBoeSBjb21wYXJlXG4iKTsKLQkJfSBlbHNlIHsKLQkJCXN0cnVjdCBjZmc4MDIxMV9zY2FuX2luZm8gaW5mbyA9IHsKLQkJCQkuYWJvcnRlZCA9IGFib3J0ZWQsCi0JCQl9OwotCi0JCQljZmc4MDIxMV9zY2FuX2RvbmUocHdkZXZfcHJpdi0+c2Nhbl9yZXF1ZXN0LCAmaW5mbyk7Ci0JCX0KLQotCQlwd2Rldl9wcml2LT5zY2FuX3JlcXVlc3QgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCURCR184NzIzQSgiJXMgd2l0aG91dCBzY2FuIHJlcVxuIiwgX19mdW5jX18pOwotCX0KLQlzcGluX3VubG9ja19iaCgmcHdkZXZfcHJpdi0+c2Nhbl9yZXFfbG9jayk7Ci19Ci0KLXZvaWQgcnR3X2NmZzgwMjExX3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2soc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBydHdfcXVldWUgKnF1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yaywgKnB0bXA7Ci0KLQlzcGluX2xvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbmV0d29yaywgcHRtcCwgcGhlYWQsIGxpc3QpIHsKLQkJLyogcmVwb3J0IG5ldHdvcmsgb25seSBpZiB0aGUgY3VycmVudCBjaGFubmVsIHNldAotCQkgICBjb250YWlucyB0aGUgY2hhbm5lbCB0byB3aGljaCB0aGlzIG5ldHdvcmsgYmVsb25ncyAqLwotCQlpZiAocnR3X2NoX3NldF9zZWFyY2hfY2gyM2EKLQkJICAgIChwYWRhcHRlci0+bWxtZWV4dHByaXYuY2hhbm5lbF9zZXQsCi0JCSAgICAgcG5ldHdvcmstPm5ldHdvcmsuRFNDb25maWcpID49IDApCi0JCQlydHdfY2ZnODAyMTFfaW5mb3JtX2JzcyhwYWRhcHRlciwgcG5ldHdvcmspOwotCX0KLQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwotCi0JLyogY2FsbCB0aGlzIGFmdGVyIG90aGVyIHRoaW5ncyBoYXZlIGJlZW4gZG9uZSAqLwotCXJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zY2FuX2RvbmUod2Rldl90b19wcml2KHBhZGFwdGVyLT5ydHdfd2RldiksCi0JCQkJCWZhbHNlKTsKLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfc2V0X3Byb2JlX3JlcV93cHNwMnBpZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCQkgICAgICAgY2hhciAqYnVmLCBpbnQgbGVuKQotewotCWludCByZXQgPSAwOwotCWNvbnN0IHU4ICp3cHNfaWU7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCURCR184NzIzQSgiJXMsIGllbGVuID0lZFxuIiwgX19mdW5jX18sIGxlbik7Ci0KLQlpZiAobGVuID4gMCkgewotCQl3cHNfaWUgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJCQkgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BTLAotCQkJCQkJIGJ1ZiwgbGVuKTsKLQkJaWYgKHdwc19pZSkgewotCQkJREJHXzg3MjNBKCJwcm9iZV9yZXFfd3BzX2llbGVuID0lZFxuIiwgd3BzX2llWzFdKTsKLQotCQkJaWYgKHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSkgewotCQkJCXBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZV9sZW4gPSAwOwotCQkJCWtmcmVlKHBtbG1lcHJpdi0+d3BzX3Byb2JlX3JlcV9pZSk7Ci0JCQkJcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llID0gTlVMTDsKLQkJCX0KLQotCQkJcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llID0ga21lbWR1cCh3cHNfaWUsIHdwc19pZVsxXSwKLQkJCQkJCQkgICAgICBHRlBfS0VSTkVMKTsKLQkJCWlmIChwbWxtZXByaXYtPndwc19wcm9iZV9yZXFfaWUgPT0gTlVMTCkgewotCQkJCURCR184NzIzQSgiJXMoKS0lZDoga21hbGxvYygpIEVSUk9SIVxuIiwKLQkJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJcG1sbWVwcml2LT53cHNfcHJvYmVfcmVxX2llX2xlbiA9IHdwc19pZVsxXTsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X3NjYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCSAgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCkKLXsKLQlpbnQgaTsKLQl1OCBfc3RhdHVzID0gZmFsc2U7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IGNmZzgwMjExX3NzaWQgc3NpZFtSVFdfU1NJRF9TQ0FOX0FNT1VOVF07Ci0Jc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCBjaFtSVFdfQ0hBTk5FTF9TQ0FOX0FNT1VOVF07Ci0Jc3RydWN0IHJ0d193ZGV2X3ByaXYgKnB3ZGV2X3ByaXYgPSB3ZGV2X3RvX3ByaXYocGFkYXB0ZXItPnJ0d193ZGV2KTsKLQlzdHJ1Y3QgY2ZnODAyMTFfc3NpZCAqc3NpZHMgPSByZXF1ZXN0LT5zc2lkczsKLQlib29sIG5lZWRfaW5kaWNhdGVfc2Nhbl9kb25lID0gZmFsc2U7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQotCXNwaW5fbG9ja19iaCgmcHdkZXZfcHJpdi0+c2Nhbl9yZXFfbG9jayk7Ci0JcHdkZXZfcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gcmVxdWVzdDsKLQlzcGluX3VubG9ja19iaCgmcHdkZXZfcHJpdi0+c2Nhbl9yZXFfbG9jayk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0JCURCR184NzIzQSgiJXMgdW5kZXIgV0lGSV9BUF9TVEFURVxuIiwgX19mdW5jX18pOwotCQkvKiBuZWVkX2luZGljYXRlX3NjYW5fZG9uZSA9IHRydWU7ICovCi0JCS8qIGdvdG8gY2hlY2tfbmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmU7ICovCi0JfQotCi0JaWYgKHJ0d19wd3Jfd2FrZXVwKHBhZGFwdGVyKSA9PSBfRkFJTCkgewotCQluZWVkX2luZGljYXRlX3NjYW5fZG9uZSA9IHRydWU7Ci0JCWdvdG8gY2hlY2tfbmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmU7Ci0JfQotCi0JaWYgKHJlcXVlc3QtPmllICYmIHJlcXVlc3QtPmllX2xlbiA+IDApIHsKLQkJcnR3X2NmZzgwMjExX3NldF9wcm9iZV9yZXFfd3BzcDJwaWUocGFkYXB0ZXIsCi0JCQkJCQkgICAgKHU4ICopIHJlcXVlc3QtPmllLAotCQkJCQkJICAgIHJlcXVlc3QtPmllX2xlbik7Ci0JfQotCi0JaWYgKHBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID09IHRydWUpIHsKLQkJREJHXzg3MjNBKCIlcywgYkJ1c3lUcmFmZmljID09IHRydWVcbiIsIF9fZnVuY19fKTsKLQkJbmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmUgPSB0cnVlOwotCQlnb3RvIGNoZWNrX25lZWRfaW5kaWNhdGVfc2Nhbl9kb25lOwotCX0KLQlpZiAocnR3X2lzX3NjYW5fZGVueShwYWRhcHRlcikpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IHNjYW4gZGVueVxuIiwgX19mdW5jX18sCi0JCQkgIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lKTsKLQkJbmVlZF9pbmRpY2F0ZV9zY2FuX2RvbmUgPSB0cnVlOwotCQlnb3RvIGNoZWNrX25lZWRfaW5kaWNhdGVfc2Nhbl9kb25lOwotCX0KLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSB8IF9GV19VTkRFUl9MSU5LSU5HKSA9PQotCSAgICB0cnVlKSB7Ci0JCURCR184NzIzQSgiJXMsIGZ3c3RhdGUgPSAweCV4XG4iLCBfX2Z1bmNfXywgcG1sbWVwcml2LT5md19zdGF0ZSk7Ci0JCW5lZWRfaW5kaWNhdGVfc2Nhbl9kb25lID0gdHJ1ZTsKLQkJZ290byBjaGVja19uZWVkX2luZGljYXRlX3NjYW5fZG9uZTsKLQl9Ci0KLQltZW1zZXQoc3NpZCwgMCwgc2l6ZW9mKHN0cnVjdCBjZmc4MDIxMV9zc2lkKSAqIFJUV19TU0lEX1NDQU5fQU1PVU5UKTsKLQkvKiBwYXJzaW5nIHJlcXVlc3Qgc3NpZHMsIG5fc3NpZHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcmVxdWVzdC0+bl9zc2lkcyAmJiBpIDwgUlRXX1NTSURfU0NBTl9BTU9VTlQ7IGkrKykgewotCQlEQkdfODcyM0EoInNzaWQgPSVzLCBsZW4gPSVkXG4iLCBzc2lkc1tpXS5zc2lkLAotCQkJICBzc2lkc1tpXS5zc2lkX2xlbik7Ci0JCW1lbWNweShzc2lkW2ldLnNzaWQsIHNzaWRzW2ldLnNzaWQsIHNzaWRzW2ldLnNzaWRfbGVuKTsKLQkJc3NpZFtpXS5zc2lkX2xlbiA9IHNzaWRzW2ldLnNzaWRfbGVuOwotCX0KLQotCS8qIHBhcnNpbmcgY2hhbm5lbHMsIG5fY2hhbm5lbHMgKi8KLQltZW1zZXQoY2gsIDAsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsKSAqIFJUV19DSEFOTkVMX1NDQU5fQU1PVU5UKTsKLQotCWlmIChyZXF1ZXN0LT5uX2NoYW5uZWxzID09IDEpIHsKLQkJZm9yIChpID0gMDsgaSA8IHJlcXVlc3QtPm5fY2hhbm5lbHMgJiYKLQkJICAgICBpIDwgUlRXX0NIQU5ORUxfU0NBTl9BTU9VTlQ7IGkrKykgewotCQkJREJHXzg3MjNBKCIlczooJXMpOiIgQ0hBTl9GTVQgIlxuIiwKLQkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCQkgIENIQU5fQVJHKHJlcXVlc3QtPmNoYW5uZWxzW2ldKSk7Ci0JCQljaFtpXS5od192YWx1ZSA9IHJlcXVlc3QtPmNoYW5uZWxzW2ldLT5od192YWx1ZTsKLQkJCWNoW2ldLmZsYWdzID0gcmVxdWVzdC0+Y2hhbm5lbHNbaV0tPmZsYWdzOwotCQl9Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCWlmIChyZXF1ZXN0LT5uX2NoYW5uZWxzID09IDEpIHsKLQkJbWVtY3B5KCZjaFsxXSwgJmNoWzBdLCBzaXplb2Yoc3RydWN0IHJ0d19pZWVlODAyMTFfY2hhbm5lbCkpOwotCQltZW1jcHkoJmNoWzJdLCAmY2hbMF0sIHNpemVvZihzdHJ1Y3QgcnR3X2llZWU4MDIxMV9jaGFubmVsKSk7Ci0JCV9zdGF0dXMgPSBydHdfc2l0ZXN1cnZleV9jbWQyM2EocGFkYXB0ZXIsIHNzaWQsCi0JCQkJCSAgICAgUlRXX1NTSURfU0NBTl9BTU9VTlQsIGNoLCAzKTsKLQl9IGVsc2UgewotCQlfc3RhdHVzID0gcnR3X3NpdGVzdXJ2ZXlfY21kMjNhKHBhZGFwdGVyLCBzc2lkLAotCQkJCQkgICAgIFJUV19TU0lEX1NDQU5fQU1PVU5ULCBOVUxMLCAwKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7Ci0KLQlpZiAoX3N0YXR1cyA9PSBmYWxzZSkKLQkJcmV0ID0gLTE7Ci0KLWNoZWNrX25lZWRfaW5kaWNhdGVfc2Nhbl9kb25lOgotCWlmIChuZWVkX2luZGljYXRlX3NjYW5fZG9uZSkKLQkJcnR3X2NmZzgwMjExX3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2socGFkYXB0ZXIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X3NldF93aXBoeV9wYXJhbXMoc3RydWN0IHdpcGh5ICp3aXBoeSwgdTMyIGNoYW5nZWQpCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19qb2luX2lic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJICBzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMgKnBhcmFtcykKLXsKLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19sZWF2ZV9pYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX3NldF93cGFfdmVyc2lvbihzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiwKLQkJCQkJdTMyIHdwYV92ZXJzaW9uKQotewotCURCR184NzIzQSgiJXMsIHdwYV92ZXJzaW9uID0lZFxuIiwgX19mdW5jX18sIHdwYV92ZXJzaW9uKTsKLQotCWlmICghd3BhX3ZlcnNpb24pIHsKLQkJcHNlY3VyaXR5cHJpdi0+bmRpc2F1dGh0eXBlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHdwYV92ZXJzaW9uICYgKE5MODAyMTFfV1BBX1ZFUlNJT05fMSB8IE5MODAyMTFfV1BBX1ZFUlNJT05fMikpCi0JCXBzZWN1cml0eXByaXYtPm5kaXNhdXRodHlwZSA9IE5kaXM4MDJfMTFBdXRoTW9kZVdQQVBTSzsKLQotLyoKLQlpZiAod3BhX3ZlcnNpb24gJiBOTDgwMjExX1dQQV9WRVJTSU9OXzIpCi0JewotCQlwc2VjdXJpdHlwcml2LT5uZGlzYXV0aHR5cGUgPSBOZGlzODAyXzExQXV0aE1vZGVXUEEyUFNLOwotCX0KLSovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfc2V0X2F1dGhfdHlwZShzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiwKLQkJCQkgICAgICBlbnVtIG5sODAyMTFfYXV0aF90eXBlIHNtZV9hdXRoX3R5cGUpCi17Ci0JREJHXzg3MjNBKCIlcywgbmw4MDIxMV9hdXRoX3R5cGUgPSVkXG4iLCBfX2Z1bmNfXywgc21lX2F1dGhfdHlwZSk7Ci0KLQlzd2l0Y2ggKHNtZV9hdXRoX3R5cGUpIHsKLQljYXNlIE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDOgotCQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV9BdXRvOwotCi0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTToKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fT3BlbjsKLQotCQlpZiAocHNlY3VyaXR5cHJpdi0+bmRpc2F1dGh0eXBlID4gTmRpczgwMl8xMUF1dGhNb2RlV1BBKQotCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9Ci0JCQkJZG90MTFBdXRoQWxncnRobV84MDIxWDsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0FVVEhUWVBFX1NIQVJFRF9LRVk6Ci0JCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtX1NoYXJlZDsKLQotCQlwc2VjdXJpdHlwcml2LT5uZGlzZW5jcnlwdHN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtX09wZW47Ci0JCS8qIHJldHVybiAtRU5PVFNVUFA7ICovCi0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX3NldF9jaXBoZXIoc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYsCi0JCQkJICAgdTMyIGNpcGhlciwgYm9vbCB1Y2FzdCkKLXsKLQl1MzIgbmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCi0JdTMyICpwcm9maWxlX2NpcGhlciA9IHVjYXN0ID8gJnBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gOgotCSAgICAmcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3k7Ci0KLQlEQkdfODcyM0EoIiVzLCB1Y2FzdCA9JWQsIGNpcGhlciA9IDB4JXhcbiIsIF9fZnVuY19fLCB1Y2FzdCwgY2lwaGVyKTsKLQotCWlmICghY2lwaGVyKSB7Ci0JCSpwcm9maWxlX2NpcGhlciA9IDA7Ci0JCXBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0gbmRpc2VuY3J5cHRzdGF0dXM7Ci0JCXJldHVybiAwOwotCX0KLQotCXN3aXRjaCAoY2lwaGVyKSB7Ci0JY2FzZSBJV19BVVRIX0NJUEhFUl9OT05FOgotCQkqcHJvZmlsZV9jaXBoZXIgPSAwOwotCQluZGlzZW5jcnlwdHN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCSpwcm9maWxlX2NpcGhlciA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOwotCQluZGlzZW5jcnlwdHN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQkqcHJvZmlsZV9jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCW5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkqcHJvZmlsZV9jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOwotCQluZGlzZW5jcnlwdHN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJKnByb2ZpbGVfY2lwaGVyID0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDsKLQkJbmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlEQkdfODcyM0EoIlVuc3VwcG9ydGVkIGNpcGhlcjogMHgleFxuIiwgY2lwaGVyKTsKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQl9Ci0KLQlpZiAodWNhc3QpCi0JCXBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0gbmRpc2VuY3J5cHRzdGF0dXM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfc2V0X2tleV9tZ3Qoc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYsCi0JCQkJICAgIHUzMiBrZXlfbWd0KQotewotCURCR184NzIzQSgiJXMsIGtleV9tZ3QgPSAweCV4XG4iLCBfX2Z1bmNfXywga2V5X21ndCk7Ci0KLQlpZiAoa2V5X21ndCA9PSBXTEFOX0FLTV9TVUlURV84MDIxWCkKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0JZWxzZSBpZiAoa2V5X21ndCA9PSBXTEFOX0FLTV9TVUlURV9QU0spCi0JCXBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPSBkb3QxMUF1dGhBbGdydGhtXzgwMjFYOwotCWVsc2UKLQkJREJHXzg3MjNBKCJJbnZhbGlkIGtleSBtZ3Q6IDB4JXhcbiIsIGtleV9tZ3QpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX3NldF93cGFfaWUoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY29uc3QgdTggKnBpZSwKLQkJCQkgICBzaXplX3QgaWVsZW4pCi17Ci0JY29uc3QgdTggKndwc19pZTsKLQlpbnQgZ3JvdXBfY2lwaGVyID0gMCwgcGFpcndpc2VfY2lwaGVyID0gMDsKLQlpbnQgcmV0ID0gMDsKLQljb25zdCB1OCAqcHdwYSwgKnB3cGEyOwotCWludCBpOwotCi0JaWYgKCFwaWUgfHwgIWllbGVuKSB7Ci0JCS8qIFRyZWF0IHRoaXMgYXMgbm9ybWFsIGNhc2UsIGJ1dCBuZWVkIHRvIGNsZWFyCi0JCSAgIFdJRklfVU5ERVJfV1BTICovCi0JCV9jbHJfZndzdGF0ZV8oJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCWlmIChpZWxlbiA+IE1BWF9XUEFfSUVfTEVOICsgTUFYX1dQU19JRV9MRU4gKyBNQVhfUDJQX0lFX0xFTikgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogZHVtcCAqLwotCURCR184NzIzQSgic2V0IHdwYV9pZShsZW5ndGg6JXp1KTpcbiIsIGllbGVuKTsKLQlmb3IgKGkgPSAwOyBpIDwgaWVsZW47IGkgPSBpICsgOCkKLQkJREJHXzg3MjNBKCIweCUuMnggMHglLjJ4IDB4JS4yeCAweCUuMnggIgotCQkJICAiMHglLjJ4IDB4JS4yeCAweCUuMnggMHglLjJ4XG4iLAotCQkJICBwaWVbaV0sIHBpZVtpICsgMV0sIHBpZVtpICsgMl0sIHBpZVtpICsgM10sCi0JCQkgIHBpZVtpICsgNF0sIHBpZVtpICsgNV0sIHBpZVtpICsgNl0sIHBpZVtpICsgN10pOwotCWlmIChpZWxlbiA8IFJTTl9IRUFERVJfTEVOKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9vc19jLCBfZHJ2X2Vycl8sCi0JCQkgIkllIGxlbiB0b28gc2hvcnQgJWRcbiIsIChpbnQpaWVsZW4pOwotCQlyZXQgPSAtMTsKLQkJZ290byBleGl0OwotCX0KLQotCXB3cGEgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCi0JCQkJICAgICAgIFdMQU5fT1VJX1RZUEVfTUlDUk9TT0ZUX1dQQSwKLQkJCQkgICAgICAgcGllLCBpZWxlbik7Ci0JaWYgKHB3cGEgJiYgcHdwYVsxXSA+IDApIHsKLQkJaWYgKHJ0d19wYXJzZV93cGFfaWUyM2EocHdwYSwgcHdwYVsxXSArIDIsICZncm91cF9jaXBoZXIsCi0JCQkJCSZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0gPQotCQkJCWRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZSA9Ci0JCQkJTmRpczgwMl8xMUF1dGhNb2RlV1BBUFNLOwotCQkJbWVtY3B5KHBhZGFwdGVyLT5zZWN1cml0eXByaXYuc3VwcGxpY2FudF9pZSwgcHdwYSwKLQkJCSAgICAgICBwd3BhWzFdICsgMik7Ci0KLQkJCURCR184NzIzQSgiZ290IHdwYV9pZSwgd3BhX2llbGVuOiV1XG4iLCBwd3BhWzFdKTsKLQkJfQotCX0KLQotCXB3cGEyID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9SU04sIHBpZSwgaWVsZW4pOwotCWlmIChwd3BhMiAmJiBwd3BhMlsxXSA+IDApIHsKLQkJaWYgKHJ0d19wYXJzZV93cGEyX2llMjNhIChwd3BhMiwgcHdwYTJbMV0gKyAyLCAmZ3JvdXBfY2lwaGVyLAotCQkJCQkgICZwYWlyd2lzZV9jaXBoZXIsIE5VTEwpID09IF9TVUNDRVNTKSB7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0gPQotCQkJCWRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZSA9Ci0JCQkJTmRpczgwMl8xMUF1dGhNb2RlV1BBMlBTSzsKLQkJCW1lbWNweShwYWRhcHRlci0+c2VjdXJpdHlwcml2LnN1cHBsaWNhbnRfaWUsIHB3cGEyLAotCQkJICAgICAgIHB3cGEyWzFdICsgMik7Ci0KLQkJCURCR184NzIzQSgiZ290IHdwYTJfaWUsIHdwYTJfaWVsZW46JXVcbiIsIHB3cGEyWzFdKTsKLQkJfQotCX0KLQotCWlmIChncm91cF9jaXBoZXIgPT0gMCkgewotCQlncm91cF9jaXBoZXIgPSBXUEFfQ0lQSEVSX05PTkU7Ci0JfQotCWlmIChwYWlyd2lzZV9jaXBoZXIgPT0gMCkgewotCQlwYWlyd2lzZV9jaXBoZXIgPSBXUEFfQ0lQSEVSX05PTkU7Ci0JfQotCi0Jc3dpdGNoIChncm91cF9jaXBoZXIpIHsKLQljYXNlIFdQQV9DSVBIRVJfTk9ORToKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IDA7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXUEFfQ0lQSEVSX1dFUDQwOgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExODAyMVhHcnBQcml2YWN5ID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXUEFfQ0lQSEVSX1RLSVA6Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTE4MDIxWEdycFByaXZhY3kgPSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOwotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0KLQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMkVuYWJsZWQ7Ci0JCWJyZWFrOwotCWNhc2UgV1BBX0NJUEhFUl9DQ01QOgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExODAyMVhHcnBQcml2YWN5ID0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDsKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9Ci0JCQlOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQlicmVhazsKLQljYXNlIFdQQV9DSVBIRVJfV0VQMTA0OgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExODAyMVhHcnBQcml2YWN5ID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OwotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0KLQkJCU5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7Ci0JCWJyZWFrOwotCX0KLQotCXN3aXRjaCAocGFpcndpc2VfY2lwaGVyKSB7Ci0JY2FzZSBXUEFfQ0lQSEVSX05PTkU6Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5QWxncnRobSA9IDA7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLQkJYnJlYWs7Ci0JY2FzZSBXUEFfQ0lQSEVSX1dFUDQwOgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9Ci0JCQlOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOwotCQlicmVhazsKLQljYXNlIFdQQV9DSVBIRVJfVEtJUDoKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDsKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9Ci0JCQlOZGlzODAyXzExRW5jcnlwdGlvbjJFbmFibGVkOwotCQlicmVhazsKLQljYXNlIFdQQV9DSVBIRVJfQ0NNUDoKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDsKLQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyA9Ci0JCQlOZGlzODAyXzExRW5jcnlwdGlvbjNFbmFibGVkOwotCQlicmVhazsKLQljYXNlIFdQQV9DSVBIRVJfV0VQMTA0OgotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCXBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPQotCQkJTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQkJYnJlYWs7Ci0JfQotCi0Jd3BzX2llID0gY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCQkgV0xBTl9PVUlfVFlQRV9NSUNST1NPRlRfV1BTLAotCQkJCQkgcGllLCBpZWxlbik7Ci0JaWYgKHdwc19pZSAmJiB3cHNfaWVbMV0gPiAwKSB7Ci0JCURCR184NzIzQSgiZ290IHdwc19pZSwgd3BzX2llbGVuOiV1XG4iLCB3cHNfaWVbMV0pOwotCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2Lndwc19pZV9sZW4gPSB3cHNfaWVbMV07Ci0JCW1lbWNweShwYWRhcHRlci0+c2VjdXJpdHlwcml2Lndwc19pZSwgd3BzX2llLAotCQkgICAgICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi53cHNfaWVfbGVuKTsKLQkJc2V0X2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCX0gZWxzZSB7Ci0JCV9jbHJfZndzdGF0ZV8oJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpOwotCX0KLQotCS8qIFRLSVAgYW5kIEFFUyBkaXNhbGxvdyBtdWx0aWNhc3QgcGFja2V0cyB1bnRpbCBpbnN0YWxsaW5nIGdyb3VwIGtleSAqLwotCWlmIChwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUCB8fAotCSAgICBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPT0KLQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkKLQkJLyogV1BTIG9wZW4gbmVlZCB0byBlbmFibGUgbXVsdGljYXN0ICovCi0JCS8qIGNoZWNrX2Z3c3RhdGUoJnBhZGFwdGVyLT5tbG1lcHJpdiwgV0lGSV9VTkRFUl9XUFMpID09IHRydWUpKi8KLQkJcnRsODcyM2Ffb2ZmX3Jjcl9hbShwYWRhcHRlcik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYywgX2Rydl9pbmZvXywKLQkJICJydHdfc2V0X3dwYV9pZTogcGFpcndpc2VfY2lwaGVyID0gMHglMDh4IHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPSVkIHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2F1dGh0eXBlID0lZFxuIiwKLQkJIHBhaXJ3aXNlX2NpcGhlciwKLQkJIHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMsCi0JCSBwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZSk7Ci0KLWV4aXQ6Ci0JaWYgKHJldCkKLQkJX2Nscl9md3N0YXRlXygmcGFkYXB0ZXItPm1sbWVwcml2LCBXSUZJX1VOREVSX1dQUyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfYWRkX3dlcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCXN0cnVjdCBydHdfd2VwX2tleSAqd2VwLCB1OCBrZXlpZCkKLXsKLQlpbnQgcmVzOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQlpZiAoa2V5aWQgPj0gTlVNX1dFUF9LRVlTKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywKLQkJCSAiJXM6a2V5aWQ+NCA9PmZhaWxcbiIsIF9fZnVuY19fKTsKLQkJcmVzID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlzd2l0Y2ggKHdlcC0+a2V5bGVuKSB7Ci0JY2FzZSBXTEFOX0tFWV9MRU5fV0VQNDA6Ci0JCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCSAiJXM6d2VwLT5LZXlMZW5ndGggPSA1XG4iLCBfX2Z1bmNfXyk7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9LRVlfTEVOX1dFUDEwNDoKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCSAiJXM6d2VwLT5LZXlMZW5ndGggPSAxM1xuIiwgX19mdW5jX18pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gMDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCSAiJXM6d2VwLT5LZXlMZW5ndGghPSA1IG9yIDEzXG4iLCBfX2Z1bmNfXyk7Ci0JCXJlcyA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJICIlczpiZWZvcmUgbWVtY3B5LCB3ZXAtPktleUxlbmd0aCA9IDB4JXgga2V5aWQgPSV4XG4iLAotCQkgX19mdW5jX18sIHdlcC0+a2V5bGVuLCBrZXlpZCk7Ci0KLQltZW1jcHkoJnBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLCB3ZXAsIHNpemVvZihzdHJ1Y3QgcnR3X3dlcF9rZXkpKTsKLQotCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUtleUluZGV4ID0ga2V5aWQ7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOnNlY3VyaXR5IGtleSBtYXRlcmlhbCA6ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4XG4iLAotCQkgX19mdW5jX18sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMF0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMV0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMl0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbM10sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbNF0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbNV0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbNl0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbN10sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbOF0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbOV0sCi0JCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMTBdLAotCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzExXSwKLQkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVsxMl0pOwotCi0JcmVzID0gcnR3X3NldF9rZXkyM2EocGFkYXB0ZXIsIHBzZWN1cml0eXByaXYsIGtleWlkLCAxKTsKLQotZXhpdDoKLQotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X3NldF9zc2lkKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpuZXduZXR3b3JrKQotewotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yazsKLQlpbnQgc3RhdHVzID0gX1NVQ0NFU1M7Ci0JdTMyIGN1cl90aW1lID0gMDsKLQotCURCR184NzIzQV9MRVZFTChfZHJ2X2Fsd2F5c18sICJzZXQgc3NpZCBbJXNdIGZ3X3N0YXRlID0gMHglMDh4XG4iLAotCQkJbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCi0JaWYgKHBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCA9PSBmYWxzZSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgInNldF9zc2lkOiBod19pbml0X2NvbXBsZXRlZCA9PSBmYWxzZSA9PmV4aXQhISFcbiIpOwotCQlzdGF0dXMgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKLQotCURCR184NzIzQSgiU2V0IFNTSUQgdW5kZXIgZndfc3RhdGUgPSAweCUwOHhcbiIsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkpCi0JCWdvdG8gaGFuZGxlX3RraXBfY291bnRlcm1lYXN1cmU7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUR8V0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkgInNldF9zc2lkOiBfRldfTElOS0VEfHxXSUZJX0FESE9DX01BU1RFUl9TVEFURVxuIik7Ci0KLQkJaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbiA9PQotCQkgICAgbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuICYmCi0JCSAgICAhbWVtY21wKCZwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCwKLQkJCSAgICBuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCwKLQkJCSAgICBuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4pKSB7Ci0JCQlpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpKSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywKLQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJICJOZXcgU1NJRCBpcyBzYW1lIFNTSUQsIGZ3X3N0YXRlID0gMHglMDh4XG4iLAotCQkJCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7Ci0KLQkJCQlpZiAocnR3X2lzX3NhbWVfaWJzczIzYShwYWRhcHRlciwgcG5ldHdvcmspKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIGl0IG1lYW5zIGRyaXZlciBpcyBpbgotCQkJCQkgKiBXSUZJX0FESE9DX01BU1RFUl9TVEFURSwgd2UgbmVlZG4ndAotCQkJCQkgKiBjcmVhdGUgYnNzIGFnYWluLgotCQkJCQkgKi8KLQkJCQkJZ290byByZWxlYXNlX21sbWVfbG9jazsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIGlmIGluIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFIHwKLQkJCQkgKiBXSUZJX0FESE9DX1NUQVRFLCBjcmVhdGUgYnNzIG9yCi0JCQkJICogcmVqb2luIGFnYWluCi0JCQkJICovCi0JCQkJcnR3X2Rpc2Fzc29jX2NtZDIzYShwYWRhcHRlciwgMCwgdHJ1ZSk7Ci0KLQkJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKQotCQkJCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0KLQkJCQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EocGFkYXB0ZXIsIDEpOwotCi0JCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LAotCQkJCQkJICBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKLQkJCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsCi0JCQkJCQkgICAgICBXSUZJX0FESE9DX01BU1RFUl9TVEFURSk7Ci0JCQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwKLQkJCQkJCSAgICBXSUZJX0FESE9DX1NUQVRFKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJ0d19scHNfY3RybF93a19jbWQyM2EocGFkYXB0ZXIsCi0JCQkJCQkgICAgICAgTFBTX0NUUkxfSk9JTkJTUywgMSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAiU2V0IFNTSUQgbm90IHRoZSBzYW1lIHNzaWRcbiIpOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCQkgInNldF9zc2lkID1bJXNdIGxlbiA9IDB4JXhcbiIsCi0JCQkJIG5ld25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJCSBuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4pOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCQkgImFzc29jX3NzaWQgPVslc10gbGVuID0gMHgleFxuIiwKLQkJCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQsCi0JCQkJIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbik7Ci0KLQkJCXJ0d19kaXNhc3NvY19jbWQyM2EocGFkYXB0ZXIsIDAsIHRydWUpOwotCi0JCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpKQotCQkJCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQotCQkJcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKHBhZGFwdGVyLCAxKTsKLQotCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKLQkJCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpOwotCQkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLWhhbmRsZV90a2lwX2NvdW50ZXJtZWFzdXJlOgotCi0JaWYgKHBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnRraXBfY291bnRlcm1lYXN1cmUgPT0gdHJ1ZSkgewotCQljdXJfdGltZSA9IGppZmZpZXM7Ci0KLQkJaWYgKChjdXJfdGltZSAtCi0JCSAgICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idGtpcF9jb3VudGVybWVhc3VyZV90aW1lKSA+Ci0JCSAgICA2MCAqIEhaKSB7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ0a2lwX2NvdW50ZXJtZWFzdXJlID0gZmFsc2U7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWUgPSAwOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gX0ZBSUw7Ci0JCQlnb3RvIHJlbGVhc2VfbWxtZV9sb2NrOwotCQl9Ci0JfQotCi0JbWVtY3B5KCZwbWxtZXByaXYtPmFzc29jX3NzaWQsICZuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgY2ZnODAyMTFfc3NpZCkpOwotCi0JcG1sbWVwcml2LT5hc3NvY19ieV9ic3NpZCA9IGZhbHNlOwotCi0JcG1sbWVwcml2LT50b19qb2luID0gdHJ1ZTsKLQotCWlmICghY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpKSB7Ci0JCXBtbG1lcHJpdi0+Y3VyX25ldHdvcmsuam9pbl9yZXMgPSAtMjsKLQotCQlzdGF0dXMgPSBydHdfZG9fam9pbl9uZXR3b3JrKHBhZGFwdGVyLCBuZXduZXR3b3JrKTsKLQkJaWYgKHN0YXR1cyA9PSBfU1VDQ0VTUykgewotCQkJcG1sbWVwcml2LT50b19qb2luID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpKSB7Ci0JCQkJLyogc3dpdGNoIHRvIEFESE9DX01BU1RFUiAqLwotCQkJCXN0YXR1cyA9IHJ0d19kb19qb2luX2FkaG9jKHBhZGFwdGVyKTsKLQkJCQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKQotCQkJCQlnb3RvIHJlbGVhc2VfbWxtZV9sb2NrOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBjYW4ndCBhc3NvY2lhdGUgOyByZXNldCB1bmRlci1saW5raW5nICovCi0JCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKLQkJCQlzdGF0dXMgPSBfRkFJTDsKLQkJCQlwbWxtZXByaXYtPnRvX2pvaW4gPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLXJlbGVhc2VfbWxtZV9sb2NrOgotCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPmxvY2spOwotCi1leGl0OgotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywKLQkJICItJXM6IHN0YXR1cyA9JWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQlzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgKnNtZSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZCwgKnBsaXN0LCAqcHRtcDsKLQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpwbmV0d29yayA9IE5VTEw7Ci0JLyogdTggbWF0Y2hlZF9ieV9ic3NpZCA9IGZhbHNlOyAqLwotCS8qIHU4IG1hdGNoZWRfYnlfc3NpZCA9IGZhbHNlOyAqLwotCXU4IG1hdGNoZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gd2lwaHlfdG9fYWRhcHRlcih3aXBoeSk7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXN0cnVjdCBydHdfcXVldWUgKnF1ZXVlID0gJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZTsKLQotCURCR184NzIzQSgiPT4iICIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQlEQkdfODcyM0EoInByaXZhY3kgPSVkLCBrZXkgPSVwLCBrZXlfbGVuID0lZCwga2V5X2lkeCA9JWRcbiIsCi0JCSAgc21lLT5wcml2YWN5LCBzbWUtPmtleSwgc21lLT5rZXlfbGVuLCBzbWUtPmtleV9pZHgpOwotCi0JaWYgKF9GQUlMID09IHJ0d19wd3Jfd2FrZXVwKHBhZGFwdGVyKSkgewotCQlyZXQgPSAtRVBFUk07Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKSB7Ci0JCXJldCA9IC1FUEVSTTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmICghc21lLT5zc2lkIHx8ICFzbWUtPnNzaWRfbGVuIHx8Ci0JICAgIHNtZS0+c3NpZF9sZW4gPiBJRUVFODAyMTFfTUFYX1NTSURfTEVOKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlEQkdfODcyM0EoInNzaWQgPSVzLCBsZW4gPSV6dVxuIiwgc21lLT5zc2lkLCBzbWUtPnNzaWRfbGVuKTsKLQotCWlmIChzbWUtPmJzc2lkKQotCQlEQkdfODcyM0EoImJzc2lkPSVwTVxuIiwgc21lLT5ic3NpZCk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCURCR184NzIzQSgiJXMsIGZ3X3N0YXRlID0gMHgleCwgZ290byBleGl0XG4iLCBfX2Z1bmNfXywKLQkJCSAgcG1sbWVwcml2LT5md19zdGF0ZSk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkgewotCQlydHdfc2Nhbl9hYm9ydDIzYShwYWRhcHRlcik7Ci0JfQotCi0Jc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Ci0KLQlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBsaXN0LCBwdG1wLCBwaGVhZCkgewotCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7Ci0KLQkJaWYgKHNtZS0+YnNzaWQpIHsKLQkJCWlmICghZXRoZXJfYWRkcl9lcXVhbChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkJCQkgICAgICBzbWUtPmJzc2lkKSkKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChzbWUtPnNzaWQgJiYgc21lLT5zc2lkX2xlbikgewotCQkJaWYgKHBuZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4gIT0gc21lLT5zc2lkX2xlbiB8fAotCQkJICAgIG1lbWNtcChwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsIHNtZS0+c3NpZCwKLQkJCQkgICBzbWUtPnNzaWRfbGVuKSkKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChzbWUtPmJzc2lkKSB7Ci0JCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLAotCQkJCQkgICAgIHNtZS0+YnNzaWQpKSB7Ci0JCQkJREJHXzg3MjNBKCJtYXRjaGVkIGJ5IGJzc2lkXG4iKTsKLQotCQkJCW1hdGNoZWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgaWYgKHNtZS0+c3NpZCAmJiBzbWUtPnNzaWRfbGVuKSB7Ci0JCQlpZiAoIW1lbWNtcChwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsCi0JCQkJICAgIHNtZS0+c3NpZCwgc21lLT5zc2lkX2xlbikgJiYKLQkJCSAgICBwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuID09IHNtZS0+c3NpZF9sZW4pIHsKLQkJCQlEQkdfODcyM0EoIm1hdGNoZWQgYnkgc3NpZFxuIik7Ci0KLQkJCQltYXRjaGVkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7Ci0KLQlpZiAoIW1hdGNoZWQgfHwgIXBuZXR3b3JrKSB7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCURCR184NzIzQSgiY29ubmVjdCwgbWF0Y2hlZCA9PSBmYWxzZSwgZ290byBleGl0XG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChjZmc4MDIxMV9pbmZyYXN0cnVjdHVyZV9tb2RlKAotCQkgICAgcGFkYXB0ZXIsIHBuZXR3b3JrLT5uZXR3b3JrLmlmbW9kZSkgIT0gX1NVQ0NFU1MpIHsKLQkJcmV0ID0gLUVQRVJNOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHNlY3VyaXR5cHJpdi0+bmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbkRpc2FibGVkOwotCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPSAwOwotCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0gMDsKLQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV9PcGVuOwotCXBzZWN1cml0eXByaXYtPm5kaXNhdXRodHlwZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0KLQlyZXQgPSBydHdfY2ZnODAyMTFfc2V0X3dwYV92ZXJzaW9uKHBzZWN1cml0eXByaXYsCi0JCQkJCSAgIHNtZS0+Y3J5cHRvLndwYV92ZXJzaW9ucyk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXhpdDsKLQotCXJldCA9IHJ0d19jZmc4MDIxMV9zZXRfYXV0aF90eXBlKHBzZWN1cml0eXByaXYsIHNtZS0+YXV0aF90eXBlKTsKLQotCWlmIChyZXQgPCAwKQotCQlnb3RvIGV4aXQ7Ci0KLQlEQkdfODcyM0EoIiVzLCBpZV9sZW4gPSV6dVxuIiwgX19mdW5jX18sIHNtZS0+aWVfbGVuKTsKLQotCXJldCA9IHJ0d19jZmc4MDIxMV9zZXRfd3BhX2llKHBhZGFwdGVyLCBzbWUtPmllLCBzbWUtPmllX2xlbik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXhpdDsKLQotCWlmIChzbWUtPmNyeXB0by5uX2NpcGhlcnNfcGFpcndpc2UpIHsKLQkJcmV0ID0gcnR3X2NmZzgwMjExX3NldF9jaXBoZXIocHNlY3VyaXR5cHJpdiwKLQkJCQkJICAgICAgc21lLT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSwKLQkJCQkJICAgICAgdHJ1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBleGl0OwotCX0KLQotCS8qIEZvciBXRVAgU2hhcmVkIGF1dGggKi8KLQlpZiAoKHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPT0gZG90MTFBdXRoQWxncnRobV9TaGFyZWQgfHwKLQkgICAgIHBzZWN1cml0eXByaXYtPmRvdDExQXV0aEFsZ3J0aG0gPT0gZG90MTFBdXRoQWxncnRobV9BdXRvKSAmJgotCSAgICBzbWUtPmtleSkgewotCQlzdHJ1Y3QgcnR3X3dlcF9rZXkgd2VwX2tleTsKLQkJdTggd2VwX2tleV9pZHgsIHdlcF9rZXlfbGVuOwotCQlEQkdfODcyM0EoIiVzKCk6IFNoYXJlZC9BdXRvIFdFUFxuIiwgX19mdW5jX18pOwotCi0JCXdlcF9rZXlfaWR4ID0gc21lLT5rZXlfaWR4OwotCQl3ZXBfa2V5X2xlbiA9IHNtZS0+a2V5X2xlbjsKLQotCQlpZiAod2VwX2tleV9pZHggPiBXRVBfS0VZUyB8fCAhd2VwX2tleV9sZW4gfHwKLQkJICAgIHdlcF9rZXlfbGVuID4gV0xBTl9LRVlfTEVOX1dFUDEwNCkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCi0JCXdlcF9rZXlfbGVuID0gd2VwX2tleV9sZW4gPD0gNSA/IDUgOiAxMzsKLQotCQltZW1zZXQoJndlcF9rZXksIDAsIHNpemVvZihzdHJ1Y3QgcnR3X3dlcF9rZXkpKTsKLQotCQl3ZXBfa2V5LmtleWxlbiA9IHdlcF9rZXlfbGVuOwotCi0JCWlmICh3ZXBfa2V5X2xlbiA9PSAxMykgewotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMVByaXZhY3lBbGdydGhtID0KLQkJCQlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExODAyMVhHcnBQcml2YWN5ID0KLQkJCQlXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUFsZ3J0aG0gPQotCQkJCVdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOwotCQkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9Ci0JCQkJV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA7Ci0JCX0KLQotCQltZW1jcHkod2VwX2tleS5rZXksICh2b2lkICopc21lLT5rZXksIHdlcF9rZXkua2V5bGVuKTsKLQotCQlpZiAocnR3X2NmZzgwMjExX2FkZF93ZXAocGFkYXB0ZXIsICZ3ZXBfa2V5LCB3ZXBfa2V5X2lkeCkgIT0KLQkJICAgIF9TVUNDRVNTKQotCQkJcmV0ID0gLUVPUE5PVFNVUFA7Ci0KLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcmV0ID0gcnR3X2NmZzgwMjExX3NldF9jaXBoZXIocHNlY3VyaXR5cHJpdiwKLQkJCQkgICAgICBzbWUtPmNyeXB0by5jaXBoZXJfZ3JvdXAsIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBleGl0OwotCi0JaWYgKHNtZS0+Y3J5cHRvLm5fYWttX3N1aXRlcykgewotCQlyZXQgPSBydHdfY2ZnODAyMTFfc2V0X2tleV9tZ3QocHNlY3VyaXR5cHJpdiwKLQkJCQkJICAgICAgIHNtZS0+Y3J5cHRvLmFrbV9zdWl0ZXNbMF0pOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocHNlY3VyaXR5cHJpdi0+bmRpc2F1dGh0eXBlID4gMykKLQkJcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fODAyMVg7Ci0KLQlpZiAocnR3X3NldF9hdXRoMjNhKHBhZGFwdGVyLCBwc2VjdXJpdHlwcml2KSAhPSBfU1VDQ0VTUykgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBydHdfc2V0XzgwMl8xMV9lbmNyeXB0aW9uX21vZGUocGFkYXB0ZXIsCi0JICAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzZW5jcnlwdHN0YXR1cyk7ICovCi0KLQlpZiAocnR3X3NldF9zc2lkKHBhZGFwdGVyLCBwbmV0d29yaykgIT0gX1NVQ0NFU1MpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JREJHXzg3MjNBKCJzZXQgc3NpZDpkb3QxMUF1dGhBbGdydGhtID0lZCwgZG90MTFQcml2YWN5QWxncnRobSA9JWQsICIKLQkJICAiZG90MTE4MDIxWEdycFByaXZhY3kgPSVkXG4iLCBwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtLAotCQkgIHBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0sCi0JCSAgcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kpOwotCi1leGl0OgotCi0JREJHXzg3MjNBKCI8PSVzLCByZXQgJWRcbiIsIF9fZnVuY19fLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZGlzY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICB1MTYgcmVhc29uX2NvZGUpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQotCXJ0d19zZXRfcm9hbWluZyhwYWRhcHRlciwgMCk7Ci0KLQlpZiAoY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQlydHdfc2Nhbl9hYm9ydDIzYShwYWRhcHRlcik7Ci0JCUxlYXZlQWxsUG93ZXJTYXZlTW9kZTIzYShwYWRhcHRlcik7Ci0JCXJ0d19kaXNhc3NvY19jbWQyM2EocGFkYXB0ZXIsIDUwMCwgZmFsc2UpOwotCi0JCURCR184NzIzQSgiJXMuLi5jYWxsIHJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhXG4iLCBfX2Z1bmNfXyk7Ci0KLQkJcGFkYXB0ZXItPm1sbWVwcml2Lm5vdF9pbmRpY19kaXNjbyA9IHRydWU7Ci0JCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQkJcGFkYXB0ZXItPm1sbWVwcml2Lm5vdF9pbmRpY19kaXNjbyA9IGZhbHNlOwotCi0JCXJ0d19mcmVlX2Fzc29jX3Jlc291cmNlczIzYShwYWRhcHRlciwgMSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X3NldF90eHBvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCi0JCQkJICAgIGVudW0gbmw4MDIxMV90eF9wb3dlcl9zZXR0aW5nIHR5cGUsIGludCBtYm0pCi17Ci0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19nZXRfdHhwb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LCBpbnQgKmRibSkKLXsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JKmRibSA9IDEyOwotCXJldHVybiAwOwotfQotCi1pbmxpbmUgYm9vbCBydHdfY2ZnODAyMTFfcHdyX21nbXQoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBydHdfd2Rldl9wcml2ICpydHdfd2Rldl9wcml2ID0gd2Rldl90b19wcml2KGFkYXB0ZXItPnJ0d193ZGV2KTsKLQlyZXR1cm4gcnR3X3dkZXZfcHJpdi0+cG93ZXJfbWdtdDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfc2V0X3Bvd2VyX21nbXQoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJICAgICAgIGJvb2wgZW5hYmxlZCwgaW50IHRpbWVvdXQpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCXN0cnVjdCBydHdfd2Rldl9wcml2ICpydHdfd2Rldl9wcml2ID0gd2Rldl90b19wcml2KHBhZGFwdGVyLT5ydHdfd2Rldik7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKTogZW5hYmxlZDoldSwgdGltZW91dDolZFxuIiwKLQkJICBfX2Z1bmNfXywgbmRldi0+bmFtZSwgZW5hYmxlZCwgdGltZW91dCk7Ci0KLQlydHdfd2Rldl9wcml2LT5wb3dlcl9tZ210ID0gZW5hYmxlZDsKLQotCWlmICghZW5hYmxlZCkKLQkJTFBTX0xlYXZlMjNhKHBhZGFwdGVyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19zZXRfcG1rc2Eoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkJICBzdHJ1Y3QgY2ZnODAyMTFfcG1rc2EgKnBta3NhKQotewotCXU4IGluZGV4LCBibEluc2VydGVkID0gZmFsc2U7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5ldGRldi0+bmFtZSk7Ci0KLQlpZiAoaXNfemVyb19ldGhlcl9hZGRyKHBta3NhLT5ic3NpZCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYmxJbnNlcnRlZCA9IGZhbHNlOwotCi0JLyogb3ZlcndyaXRlIFBNS0lEICovCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTlVNX1BNS0lEX0NBQ0hFOyBpbmRleCsrKSB7Ci0JCWlmIChldGhlcl9hZGRyX2VxdWFsKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpbmRleF0uQnNzaWQsCi0JCQkJICAgICBwbWtzYS0+YnNzaWQpKSB7Ci0JCQkvKiBCU1NJRCBpcyBtYXRjaGVkLCB0aGUgc2FtZSBBUCA9PiByZXdyaXRlIHdpdGgKLQkJCSAgIG5ldyBQTUtJRC4gKi8KLQkJCURCR184NzIzQSgiJXMoJXMpOiAgQlNTSUQgZXhpc3RzIGluIHRoZSBQTUtMaXN0LlxuIiwKLQkJCQkgIF9fZnVuY19fLCBuZXRkZXYtPm5hbWUpOwotCi0JCQltZW1jcHkocHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2luZGV4XS5QTUtJRCwKLQkJCSAgICAgICBwbWtzYS0+cG1raWQsIFdMQU5fUE1LSURfTEVOKTsKLQkJCXBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpbmRleF0uYlVzZWQgPSB0cnVlOwotCQkJcHNlY3VyaXR5cHJpdi0+UE1LSURJbmRleCA9IGluZGV4ICsgMTsKLQkJCWJsSW5zZXJ0ZWQgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoIWJsSW5zZXJ0ZWQpIHsKLQkJLyogIEZpbmQgYSBuZXcgZW50cnkgKi8KLQkJREJHXzg3MjNBKCIlcyglcyk6IFVzZSBuZXcgZW50cnkgaW5kZXggPSAlZCBmb3IgdGhpcyBQTUtJRFxuIiwKLQkJCSAgX19mdW5jX18sIG5ldGRldi0+bmFtZSwgcHNlY3VyaXR5cHJpdi0+UE1LSURJbmRleCk7Ci0KLQkJZXRoZXJfYWRkcl9jb3B5KAotCQkJcHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W3BzZWN1cml0eXByaXYtPlBNS0lESW5kZXhdLgotCQkJQnNzaWQsIHBta3NhLT5ic3NpZCk7Ci0JCW1lbWNweShwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbcHNlY3VyaXR5cHJpdi0+UE1LSURJbmRleF0uCi0JCSAgICAgICBQTUtJRCwgcG1rc2EtPnBta2lkLCBXTEFOX1BNS0lEX0xFTik7Ci0KLQkJcHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W3BzZWN1cml0eXByaXYtPlBNS0lESW5kZXhdLmJVc2VkID0KLQkJCXRydWU7Ci0JCXBzZWN1cml0eXByaXYtPlBNS0lESW5kZXgrKzsKLQkJaWYgKHBzZWN1cml0eXByaXYtPlBNS0lESW5kZXggPT0gMTYpIHsKLQkJCXBzZWN1cml0eXByaXYtPlBNS0lESW5kZXggPSAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2RlbF9wbWtzYShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCQkgIHN0cnVjdCBjZmc4MDIxMV9wbWtzYSAqcG1rc2EpCi17Ci0JdTggaW5kZXgsIGJNYXRjaGVkID0gZmFsc2U7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5ldGRldi0+bmFtZSk7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOVU1fUE1LSURfQ0FDSEU7IGluZGV4KyspIHsKLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2luZGV4XS5Cc3NpZCwKLQkJCQkgICAgIHBta3NhLT5ic3NpZCkpIHsKLQkJCS8qIEJTU0lEIGlzIG1hdGNoZWQsIHRoZSBzYW1lIEFQID0+IFJlbW92ZSB0aGlzIFBNS0lECi0JCQkgICBpbmZvcm1hdGlvbiBhbmQgcmVzZXQgaXQuICovCi0JCQlldGhfemVyb19hZGRyKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpbmRleF0uQnNzaWQpOwotCQkJbWVtc2V0KHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtpbmRleF0uUE1LSUQsIDB4MDAsCi0JCQkgICAgICAgV0xBTl9QTUtJRF9MRU4pOwotCQkJcHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2luZGV4XS5iVXNlZCA9IGZhbHNlOwotCQkJYk1hdGNoZWQgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAoZmFsc2UgPT0gYk1hdGNoZWQpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IGRvIG5vdCBoYXZlIG1hdGNoZWQgQlNTSURcbiIsIF9fZnVuY19fLAotCQkJICBuZXRkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZmx1c2hfcG1rc2Eoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gd2lwaHlfdG9fYWRhcHRlcih3aXBoeSk7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmV0ZGV2LT5uYW1lKTsKLQotCW1lbXNldCgmcHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0WzBdLCAweDAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Bta2lkX2xpc3QpICogTlVNX1BNS0lEX0NBQ0hFKTsKLQlwc2VjdXJpdHlwcml2LT5QTUtJREluZGV4ID0gMDsKLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zdGFfYXNzb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgIHU4ICpwbWdtdF9mcmFtZSwgdWludCBmcmFtZV9sZW4pCi17Ci0JczMyIGZyZXE7Ci0JaW50IGNoYW5uZWw7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCi0JREJHXzg3MjNBKCIlcyhwYWRhcHRlciA9JXAsJXMpXG4iLCBfX2Z1bmNfXywgcGFkYXB0ZXIsIG5kZXYtPm5hbWUpOwotCi0jaWYgZGVmaW5lZChSVFdfVVNFX0NGRzgwMjExX1NUQV9FVkVOVCkKLQl7Ci0JCXN0cnVjdCBzdGF0aW9uX2luZm8gc2luZm87Ci0JCXU4IGllX29mZnNldDsKLQotCQlpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJaWVfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LAotCQkJCQkgICAgIHUuYXNzb2NfcmVxLnZhcmlhYmxlKTsKLQkJZWxzZQkJLyogIFdJRklfUkVBU1NPQ1JFUSAqLwotCQkJaWVfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LAotCQkJCQkgICAgIHUucmVhc3NvY19yZXEudmFyaWFibGUpOwotCi0JCXNpbmZvLmZpbGxlZCA9IDA7Ci0JCXNpbmZvLmFzc29jX3JlcV9pZXMgPSBwbWdtdF9mcmFtZSArIGllX29mZnNldDsKLQkJc2luZm8uYXNzb2NfcmVxX2llc19sZW4gPSBmcmFtZV9sZW4gLSBpZV9vZmZzZXQ7Ci0JCWNmZzgwMjExX25ld19zdGEobmRldiwgaGRyLT5hZGRyMiwgJnNpbmZvLCBHRlBfQVRPTUlDKTsKLQl9Ci0jZWxzZSAvKiBkZWZpbmVkKFJUV19VU0VfQ0ZHODAyMTFfU1RBX0VWRU5UKSAqLwotCWNoYW5uZWwgPSBwbWxtZWV4dC0+Y3VyX2NoYW5uZWw7Ci0JaWYgKGNoYW5uZWwgPD0gUlRXX0NIX01BWF8yR19DSEFOTkVMKQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfMkdIWik7Ci0JZWxzZQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfNUdIWik7Ci0KLQljZmc4MDIxMV9yeF9tZ210KHBhZGFwdGVyLT5ydHdfd2RldiwgZnJlcSwgMCwgcG1nbXRfZnJhbWUsIGZyYW1lX2xlbiwKLQkJCSAwKTsKLSNlbmRpZiAvKiBkZWZpbmVkKFJUV19VU0VfQ0ZHODAyMTFfU1RBX0VWRU5UKSAqLwotfQotCi12b2lkIHJ0d19jZmc4MDIxMV9pbmRpY2F0ZV9zdGFfZGlzYXNzb2Moc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkJdW5zaWduZWQgY2hhciAqZGEsCi0JCQkJCXVuc2lnbmVkIHNob3J0IHJlYXNvbikKLXsKLQlzMzIgZnJlcTsKLQlpbnQgY2hhbm5lbDsKLQl1aW50IGZyYW1lX2xlbjsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgbWdtdDsKLQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7Ci0KLQlEQkdfODcyM0EoIiVzKHBhZGFwdGVyID0lcCwlcylcbiIsIF9fZnVuY19fLCBwYWRhcHRlciwgbmRldi0+bmFtZSk7Ci0KLQltZW1zZXQoJm1nbXQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQpKTsKLQotI2lmIGRlZmluZWQoUlRXX1VTRV9DRkc4MDIxMV9TVEFfRVZFTlQpCi0JY2ZnODAyMTFfZGVsX3N0YShuZGV2LCBkYSwgR0ZQX0FUT01JQyk7Ci0jZWxzZSAvKiBkZWZpbmVkKFJUV19VU0VfQ0ZHODAyMTFfU1RBX0VWRU5UKSAqLwotCWNoYW5uZWwgPSBwbWxtZWV4dC0+Y3VyX2NoYW5uZWw7Ci0JaWYgKGNoYW5uZWwgPD0gUlRXX0NIX01BWF8yR19DSEFOTkVMKQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfMkdIWik7Ci0JZWxzZQotCQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsCi0JCQkJCQkgICAgICBOTDgwMjExX0JBTkRfNUdIWik7Ci0KLQltZ210LmZyYW1lX2NvbnRyb2wgPQotCQljcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOwotCi0JZXRoZXJfYWRkcl9jb3B5KG1nbXQuZGEsIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSk7Ci0JZXRoZXJfYWRkcl9jb3B5KG1nbXQuc2EsIGRhKTsKLQlldGhlcl9hZGRyX2NvcHkobWdtdC5ic3NpZCwgZ2V0X215X2Jzc2lkMjNhKCZwbWxtZWluZm8tPm5ldHdvcmspKTsKLQotCW1nbXQuc2VxX2N0cmwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU05fVE9fU0VRKHBtbG1lZXh0LT5tZ250X3NlcSkpOwotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JbWdtdC51LmRpc2Fzc29jLnJlYXNvbl9jb2RlID0gY3B1X3RvX2xlMTYocmVhc29uKTsKLQotCWZyYW1lX2xlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyAyOwotCi0JY2ZnODAyMTFfcnhfbWdtdChwYWRhcHRlci0+cnR3X3dkZXYsIGZyZXEsIDAsICh1OCAqKSZtZ210LCBmcmFtZV9sZW4sCi0JCQkgMCk7Ci0jZW5kaWYgLyogZGVmaW5lZChSVFdfVVNFX0NGRzgwMjExX1NUQV9FVkVOVCkgKi8KLX0KLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0d19jZmc4MDIxMV9tb25pdG9yX2lmX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJ0d19jZmc4MDIxMV9tb25pdG9yX2lmX3htaXRfZW50cnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IHJ0YXBfbGVuOwotCWludCBxb3NfbGVuID0gMDsKLQlpbnQgZG90MTFfaGRyX2xlbiA9IDI0OwotCWludCBzbmFwX2xlbiA9IDY7Ci0JdW5zaWduZWQgY2hhciAqcGRhdGE7Ci0JdW5zaWduZWQgY2hhciBzcmNfbWFjX2FkZHJbNl07Ci0JdW5zaWduZWQgY2hhciBkc3RfbWFjX2FkZHJbNl07Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmRvdDExX2hkcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciAqcnRhcF9oZHI7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KG5kZXYpOwotCi0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQotCWlmICh1bmxpa2VseShza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlcikpKQotCQlnb3RvIGZhaWw7Ci0KLQlydGFwX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciAqKXNrYi0+ZGF0YTsKLQlpZiAodW5saWtlbHkocnRhcF9oZHItPml0X3ZlcnNpb24pKQotCQlnb3RvIGZhaWw7Ci0KLQlydGFwX2xlbiA9IGllZWU4MDIxMV9nZXRfcmFkaW90YXBfbGVuKHNrYi0+ZGF0YSk7Ci0JaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgcnRhcF9sZW4pKQotCQlnb3RvIGZhaWw7Ci0KLQlpZiAocnRhcF9sZW4gIT0gMTQpIHsKLQkJREJHXzg3MjNBKCJyYWRpb3RhcCBsZW4gKHNob3VsZCBiZSAxNCk6ICVkXG4iLCBydGFwX2xlbik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBTa2lwIHRoZSByYXRpbyB0YXAgaGVhZGVyICovCi0Jc2tiX3B1bGwoc2tiLCBydGFwX2xlbik7Ci0KLQlkb3QxMV9oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7Ci0JLyogQ2hlY2sgaWYgdGhlIFFvUyBiaXQgaXMgc2V0ICovCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhKGRvdDExX2hkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJLyogQ2hlY2sgaWYgdGhpcyBpYSBhIFdpcmVsZXNzIERpc3RyaWJ1dGlvbiBTeXN0ZW0gKFdEUykgZnJhbWUKLQkJICogd2hpY2ggaGFzIDQgTUFDIGFkZHJlc3NlcwotCQkgKi8KLQkJaWYgKGllZWU4MDIxMV9pc19kYXRhX3Fvcyhkb3QxMV9oZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJcW9zX2xlbiA9IElFRUU4MDIxMV9RT1NfQ1RMX0xFTjsKLQkJaWYgKGllZWU4MDIxMV9oYXNfYTQoZG90MTFfaGRyLT5mcmFtZV9jb250cm9sKSkKLQkJCWRvdDExX2hkcl9sZW4gKz0gNjsKLQotCQltZW1jcHkoZHN0X21hY19hZGRyLCBkb3QxMV9oZHItPmFkZHIxLCBzaXplb2YoZHN0X21hY19hZGRyKSk7Ci0JCW1lbWNweShzcmNfbWFjX2FkZHIsIGRvdDExX2hkci0+YWRkcjIsIHNpemVvZihzcmNfbWFjX2FkZHIpKTsKLQotCQkvKgotCQkgKiBTa2lwIHRoZSA4MDIuMTEgaGVhZGVyLCBRb1MgKGlmIGFueSkgYW5kIFNOQVAsCi0JCSAqIGJ1dCBsZWF2ZSBzcGFjZXMgZm9yIHR3byBNQUMgYWRkcmVzc2VzCi0JCSAqLwotCQlza2JfcHVsbChza2IsIGRvdDExX2hkcl9sZW4gKyBxb3NfbGVuICsgc25hcF9sZW4gLQotCQkJIEVUSF9BTEVOICogMik7Ci0JCXBkYXRhID0gKHVuc2lnbmVkIGNoYXIgKilza2ItPmRhdGE7Ci0JCWV0aGVyX2FkZHJfY29weShwZGF0YSwgZHN0X21hY19hZGRyKTsKLQkJZXRoZXJfYWRkcl9jb3B5KHBkYXRhICsgRVRIX0FMRU4sIHNyY19tYWNfYWRkcik7Ci0KLQkJREJHXzg3MjNBKCJzaG91bGQgYmUgZWFwb2wgcGFja2V0XG4iKTsKLQotCQkvKiBVc2UgdGhlIHJlYWwgbmV0IGRldmljZSB0byB0cmFuc21pdCB0aGUgcGFja2V0ICovCi0JCXJldCA9IHJ0d194bWl0MjNhX2VudHJ5MjNhKHNrYiwgcGFkYXB0ZXItPnBuZXRkZXYpOwotCi0JCXJldHVybiByZXQ7Ci0KLQl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19hY3Rpb24oZG90MTFfaGRyLT5mcmFtZV9jb250cm9sKSkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JCS8qIG9ubHkgZm9yIGFjdGlvbiBmcmFtZXMgKi8KLQkJc3RydWN0IHhtaXRfZnJhbWUgKnBtZ250ZnJhbWU7Ci0JCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCQl1bnNpZ25lZCBjaGFyICpwZnJhbWU7Ci0JCS8qIHU4IGNhdGVnb3J5LCBhY3Rpb24sIE9VSV9TdWJ0eXBlLCBkaWFsb2dUb2tlbiA9IDA7ICovCi0JCS8qIHVuc2lnbmVkIGNoYXIgICAgICAgICpmcmFtZV9ib2R5OyAqLwotCQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCQlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwotCQl1MzIgbGVuID0gc2tiLT5sZW47Ci0JCXU4IGNhdGVnb3J5LCBhY3Rpb247Ci0KLQkJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilkb3QxMV9oZHI7Ci0KLQkJREJHXzg3MjNBKCJSVFdfVHg6ZGE9JXBNIHZpYSAlcyglcylcbiIsCi0JCQkgIG1nbXQtPmRhLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0JCWNhdGVnb3J5ID0gbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnk7Ci0JCWFjdGlvbiA9IG1nbXQtPnUuYWN0aW9uLnUud21lX2FjdGlvbi5hY3Rpb25fY29kZTsKLQkJREJHXzg3MjNBKCJSVFdfVHg6Y2F0ZWdvcnkoJXUpLCBhY3Rpb24oJXUpXG4iLAotCQkJICBjYXRlZ29yeSwgYWN0aW9uKTsKLQotCQkvKiBzdGFydGluZyBhbGxvYyBtZ210IGZyYW1lIHRvIGR1bXAgaXQgKi8KLQkJcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCQlpZiAocG1nbnRmcmFtZSA9PSBOVUxMKQotCQkJZ290byBmYWlsOwotCi0JCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQkJcGF0dHJpYiA9ICZwbWdudGZyYW1lLT5hdHRyaWI7Ci0JCXVwZGF0ZV9tZ250ZnJhbWVfYXR0cmliMjNhKHBhZGFwdGVyLCBwYXR0cmliKTsKLQkJcGF0dHJpYi0+cmV0cnlfY3RybCA9IGZhbHNlOwotCi0JCW1lbXNldChwbWdudGZyYW1lLT5idWZfYWRkciwgMCwgV0xBTkhEUl9PRkZTRVQgKyBUWERFU0NfT0ZGU0VUKTsKLQotCQlwZnJhbWUgPSAodTggKikocG1nbnRmcmFtZS0+YnVmX2FkZHIpICsgVFhERVNDX09GRlNFVDsKLQotCQltZW1jcHkocGZyYW1lLCBza2ItPmRhdGEsIGxlbik7Ci0JCXBhdHRyaWItPnBrdGxlbiA9IGxlbjsKLQotCQkvKiB1cGRhdGUgc2VxIG51bWJlciAqLwotCQlwbWxtZWV4dC0+bWdudF9zZXEgPSBsZTE2X3RvX2NwdShkb3QxMV9oZHItPnNlcV9jdHJsKSA+PiA0OwotCQlwYXR0cmliLT5zZXFudW0gPSBwbWxtZWV4dC0+bWdudF9zZXE7Ci0JCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JCXBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IHBhdHRyaWItPnBrdGxlbjsKLQotCQlkdW1wX21nbnRmcmFtZTIzYShwYWRhcHRlciwgcG1nbnRmcmFtZSk7Ci0JfQotCi1mYWlsOgotCi0JZGV2X2tmcmVlX3NrYihza2IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXJ0d19jZmc4MDIxMV9tb25pdG9yX2lmX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqYWRkcikKLXsKLQlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl9vcHMgPSB7Ci0JLm5kb19vcGVuID0gcnR3X2NmZzgwMjExX21vbml0b3JfaWZfb3BlbiwKLQkubmRvX3N0b3AgPSBydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl9jbG9zZSwKLQkubmRvX3N0YXJ0X3htaXQgPSBydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl94bWl0X2VudHJ5LAotCS5uZG9fc2V0X21hY19hZGRyZXNzID0gcnR3X2NmZzgwMjExX21vbml0b3JfaWZfc2V0X21hY19hZGRyZXNzLAotfTsKLQotc3RhdGljIGludCBydHdfY2ZnODAyMTFfYWRkX21vbml0b3JfaWYoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgY2hhciAqbmFtZSwKLQkJCQkgICAgICAgdW5zaWduZWQgY2hhciBuYW1lX2Fzc2lnbl90eXBlLAotCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqKm5kZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm1vbl9uZGV2ID0gTlVMTDsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICptb25fd2RldiA9IE5VTEw7Ci0Jc3RydWN0IHJ0d193ZGV2X3ByaXYgKnB3ZGV2X3ByaXYgPSB3ZGV2X3RvX3ByaXYocGFkYXB0ZXItPnJ0d193ZGV2KTsKLQotCWlmICghbmFtZSkgewotCQlEQkdfODcyM0EoIiVzKCVzKTogd2l0aG91dCBzcGVjaWZpYyBuYW1lXG4iLAotCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAocHdkZXZfcHJpdi0+cG1vbl9uZGV2KSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBtb25pdG9yIGludGVyZmFjZSBleGlzdDogJXNcbiIsIF9fZnVuY19fLAotCQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwgcHdkZXZfcHJpdi0+cG1vbl9uZGV2LT5uYW1lKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltb25fbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgcnR3X2FkYXB0ZXIpKTsKLQlpZiAoIW1vbl9uZGV2KSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiBhbGxvY2F0ZSBuZGV2IGZhaWxcbiIsIF9fZnVuY19fLAotCQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCW1vbl9uZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9SQURJT1RBUDsKLQlzdHJuY3B5KG1vbl9uZGV2LT5uYW1lLCBuYW1lLCBJRk5BTVNJWik7Ci0JbW9uX25kZXYtPm5hbWVbSUZOQU1TSVogLSAxXSA9IDA7Ci0JbW9uX25kZXYtPm5hbWVfYXNzaWduX3R5cGUgPSBuYW1lX2Fzc2lnbl90eXBlOwotCW1vbl9uZGV2LT5kZXN0cnVjdG9yID0gcnR3X25kZXZfZGVzdHJ1Y3RvcjsKLQotCW1vbl9uZGV2LT5uZXRkZXZfb3BzID0gJnJ0d19jZmc4MDIxMV9tb25pdG9yX2lmX29wczsKLQotCS8qICB3ZGV2ICovCi0JbW9uX3dkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2lyZWxlc3NfZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtb25fd2RldikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQltb25fd2Rldi0+d2lwaHkgPSBwYWRhcHRlci0+cnR3X3dkZXYtPndpcGh5OwotCW1vbl93ZGV2LT5uZXRkZXYgPSBtb25fbmRldjsKLQltb25fd2Rldi0+aWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsKLQltb25fbmRldi0+aWVlZTgwMjExX3B0ciA9IG1vbl93ZGV2OwotCi0JcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKG1vbl9uZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWdvdG8gb3V0OwotCX0KLQotCSpuZGV2ID0gcHdkZXZfcHJpdi0+cG1vbl9uZGV2ID0gbW9uX25kZXY7Ci0JbWVtY3B5KHB3ZGV2X3ByaXYtPmlmbmFtZV9tb24sIG5hbWUsIElGTkFNU0laICsgMSk7Ci0KLW91dDoKLQlpZiAocmV0KSB7Ci0JCWtmcmVlKG1vbl93ZGV2KTsKLQkJbW9uX3dkZXYgPSBOVUxMOwotCX0KLQotCWlmIChyZXQgJiYgbW9uX25kZXYpIHsKLQkJZnJlZV9uZXRkZXYobW9uX25kZXYpOwotCQkqbmRldiA9IG1vbl9uZGV2ID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHdpcmVsZXNzX2RldiAqCi1jZmc4MDIxMV9ydHdfYWRkX3ZpcnR1YWxfaW50ZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgICAgdW5zaWduZWQgY2hhciBuYW1lX2Fzc2lnbl90eXBlLAotCQkJICAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLCB1MzIgKmZsYWdzLAotCQkJICAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IE5VTEw7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciA9IHdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCi0JREJHXzg3MjNBKCIlcyglcyk6IHdpcGh5OiVzLCBuYW1lOiVzLCB0eXBlOiVkXG4iLCBfX2Z1bmNfXywKLQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwgd2lwaHlfbmFtZSh3aXBoeSksIG5hbWUsIHR5cGUpOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9XRFM6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgotCQlyZXQgPSAtRU5PREVWOwotCQlicmVhazsKLQljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6Ci0JCXJldCA9Ci0JCSAgICBydHdfY2ZnODAyMTFfYWRkX21vbml0b3JfaWYocGFkYXB0ZXIsIChjaGFyICopbmFtZSwKLQkJCQkJCW5hbWVfYXNzaWduX3R5cGUsICZuZGV2KTsKLQkJYnJlYWs7Ci0KLQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlyZXQgPSAtRU5PREVWOwotCQlicmVhazsKLQotCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCURCR184NzIzQSgiVW5zdXBwb3J0ZWQgaW50ZXJmYWNlIHR5cGVcbiIpOwotCQlicmVhazsKLQl9Ci0KLQlEQkdfODcyM0EoIiVzKCVzKTogbmRldjolcCwgcmV0OiVkXG4iLCBfX2Z1bmNfXywKLQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJICBuZGV2LCByZXQpOwotCi0JcmV0dXJuIG5kZXYgPyBuZGV2LT5pZWVlODAyMTFfcHRyIDogRVJSX1BUUihyZXQpOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19kZWxfdmlydHVhbF9pbnRmKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJCSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQotewotCXN0cnVjdCBydHdfd2Rldl9wcml2ICpwd2Rldl9wcml2ID0KLQkgICAgKHN0cnVjdCBydHdfd2Rldl9wcml2ICopd2lwaHlfcHJpdih3aXBoeSk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7Ci0JbmRldiA9IHdkZXYgPyB3ZGV2LT5uZXRkZXYgOiBOVUxMOwotCi0JaWYgKCFuZGV2KQotCQlnb3RvIGV4aXQ7Ci0KLQl1bnJlZ2lzdGVyX25ldGRldmljZShuZGV2KTsKLQotCWlmIChuZGV2ID09IHB3ZGV2X3ByaXYtPnBtb25fbmRldikgewotCQlwd2Rldl9wcml2LT5wbW9uX25kZXYgPSBOVUxMOwotCQlwd2Rldl9wcml2LT5pZm5hbWVfbW9uWzBdID0gJ1wwJzsKLQkJREJHXzg3MjNBKCIlcyglcyk6IHJlbW92ZSBtb25pdG9yIGludGVyZmFjZVxuIiwKLQkJCSAgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBydHdfYWRkX2JlYWNvbihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHU4ICpoZWFkLAotCQkJICBzaXplX3QgaGVhZF9sZW4sIGNvbnN0IHU4ICp0YWlsLCBzaXplX3QgdGFpbF9sZW4pCi17Ci0JaW50IHJldCA9IDA7Ci0JdTggKnBidWY7Ci0JdWludCBsZW4sIGllbGVuLCB3cHNfaWVsZW4gPSAwOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqYnNzID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKLQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopaGVhZDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKnRtcG1nbXQ7Ci0JLyogc3RydWN0IHN0YV9wcml2ICpwc3RhcHJpdiA9ICZwYWRhcHRlci0+c3RhcHJpdjsgKi8KLQotCURCR184NzIzQSgiJXMgYmVhY29uX2hlYWRfbGVuID0lenUsIGJlYWNvbl90YWlsX2xlbiA9JXp1XG4iLAotCQkgIF9fZnVuY19fLCBoZWFkX2xlbiwgdGFpbF9sZW4pOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSAhPSB0cnVlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChoZWFkX2xlbiA8IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBidWYgPSBremFsbG9jKGhlYWRfbGVuICsgdGFpbF9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghcGJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JdG1wbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilwYnVmOwotCi0JYnNzLT5iZWFjb25faW50ZXJ2YWwgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJm1nbXQtPnUuYmVhY29uLmJlYWNvbl9pbnQpOwotCWJzcy0+Y2FwYWJpbGl0eSA9IGdldF91bmFsaWduZWRfbGUxNigmbWdtdC0+dS5iZWFjb24uY2FwYWJfaW5mbyk7Ci0JYnNzLT50c2YgPSBnZXRfdW5hbGlnbmVkX2xlNjQoJm1nbXQtPnUuYmVhY29uLnRpbWVzdGFtcCk7Ci0KLQkvKiAgMjQgPSBiZWFjb24gaGVhZGVyIGxlbi4gKi8KLQltZW1jcHkocGJ1ZiwgKHZvaWQgKiloZWFkLCBoZWFkX2xlbik7Ci0JbWVtY3B5KHBidWYgKyBoZWFkX2xlbiwgKHZvaWQgKil0YWlsLCB0YWlsX2xlbik7Ci0KLQlsZW4gPSBoZWFkX2xlbiArIHRhaWxfbGVuOwotCWllbGVuID0gbGVuIC0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmJlYWNvbi52YXJpYWJsZSk7Ci0JLyogY2hlY2sgd3BzIGllIGlmIGluY2x1ZWQgKi8KLQlpZiAoY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUoV0xBTl9PVUlfTUlDUk9TT0ZULAotCQkJCSAgICBXTEFOX09VSV9UWVBFX01JQ1JPU09GVF9XUFMsCi0JCQkJICAgIHRtcG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlLCBpZWxlbikpCi0JCURCR184NzIzQSgiYWRkIGJjbiwgd3BzX2llbGVuID0lZFxuIiwgd3BzX2llbGVuKTsKLQotCS8qIHBic3NfbmV0d29yay0+SUVzIHdpbGwgbm90IGluY2x1ZGUgcDJwX2llLCB3ZmQgaWUgKi8KLQlydHdfaWVzX3JlbW92ZV9pZTIzYSh0bXBtZ210LT51LmJlYWNvbi52YXJpYWJsZSwgJmllbGVuLCAwLAotCQkJICAgICBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsIFAyUF9PVUkyM0EsIDQpOwotCXJ0d19pZXNfcmVtb3ZlX2llMjNhKHRtcG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlLCAmaWVsZW4sIDAsCi0JCQkgICAgIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQywgV0ZEX09VSTIzQSwgNCk7Ci0KLQlsZW4gPSBpZWxlbiArIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpOwotCWlmIChydHdfY2hlY2tfYmVhY29uX2RhdGEyM2EoYWRhcHRlciwgdG1wbWdtdCwgbGVuKSA9PSBfU1VDQ0VTUykgewotCQlyZXQgPSAwOwotCX0gZWxzZSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0Ja2ZyZWUocGJ1Zik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19zdGFydF9hcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgc3RydWN0IGNmZzgwMjExX2FwX3NldHRpbmdzICpzZXR0aW5ncykKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSB3aXBoeV90b19hZGFwdGVyKHdpcGh5KTsKLQotCURCR184NzIzQSgiJXMoJXMpOiBoaWRkZW5fc3NpZDolZCwgYXV0aF90eXBlOiVkXG4iLAotCQkgIF9fZnVuY19fLCBuZGV2LT5uYW1lLCBzZXR0aW5ncy0+aGlkZGVuX3NzaWQsCi0JCSAgc2V0dGluZ3MtPmF1dGhfdHlwZSk7Ci0KLQlyZXQgPSBydHdfYWRkX2JlYWNvbihhZGFwdGVyLCBzZXR0aW5ncy0+YmVhY29uLmhlYWQsCi0JCQkgICAgIHNldHRpbmdzLT5iZWFjb24uaGVhZF9sZW4sIHNldHRpbmdzLT5iZWFjb24udGFpbCwKLQkJCSAgICAgc2V0dGluZ3MtPmJlYWNvbi50YWlsX2xlbik7Ci0KLQlhZGFwdGVyLT5tbG1lZXh0cHJpdi5tbG1leHRfaW5mby5oaWRkZW5fc3NpZF9tb2RlID0KLQkJc2V0dGluZ3MtPmhpZGRlbl9zc2lkOwotCi0JaWYgKHNldHRpbmdzLT5zc2lkICYmIHNldHRpbmdzLT5zc2lkX2xlbikgewotCQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGJzc19uZXR3b3JrID0KLQkJCSZhZGFwdGVyLT5tbG1lcHJpdi5jdXJfbmV0d29yay5uZXR3b3JrOwotCQlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGJzc19uZXR3b3JrX2V4dCA9Ci0JCQkmYWRhcHRlci0+bWxtZWV4dHByaXYubWxtZXh0X2luZm8ubmV0d29yazsKLQotCQltZW1jcHkocGJzc19uZXR3b3JrLT5Tc2lkLnNzaWQsICh2b2lkICopc2V0dGluZ3MtPnNzaWQsCi0JCSAgICAgICBzZXR0aW5ncy0+c3NpZF9sZW4pOwotCQlwYnNzX25ldHdvcmstPlNzaWQuc3NpZF9sZW4gPSBzZXR0aW5ncy0+c3NpZF9sZW47Ci0JCW1lbWNweShwYnNzX25ldHdvcmtfZXh0LT5Tc2lkLnNzaWQsICh2b2lkICopc2V0dGluZ3MtPnNzaWQsCi0JCSAgICAgICBzZXR0aW5ncy0+c3NpZF9sZW4pOwotCQlwYnNzX25ldHdvcmtfZXh0LT5Tc2lkLnNzaWRfbGVuID0gc2V0dGluZ3MtPnNzaWRfbGVuOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2NoYW5nZV9iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfYmVhY29uX2RhdGEgKmluZm8pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gd2lwaHlfdG9fYWRhcHRlcih3aXBoeSk7Ci0KLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCi0JcmV0ID0gcnR3X2FkZF9iZWFjb24oYWRhcHRlciwgaW5mby0+aGVhZCwgaW5mby0+aGVhZF9sZW4sIGluZm8tPnRhaWwsCi0JCQkgICAgIGluZm8tPnRhaWxfbGVuKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X3N0b3BfYXAoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCi17Ci0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfYWRkX3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGNvbnN0IHU4ICptYWMsCi0JCQkJICAgIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcykKLXsKLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2RlbF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSAgICBzdHJ1Y3Qgc3RhdGlvbl9kZWxfcGFyYW1ldGVycyAqcGFyYW1zKQotewotCWNvbnN0IHU4ICptYWMgPSBwYXJhbXMtPm1hYzsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwaGVhZDsKLQl1OCB1cGRhdGVkID0gMDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGEsICpwdG1wOwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0KLQlEQkdfODcyM0EoIislcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgKF9GV19MSU5LRUQgfCBXSUZJX0FQX1NUQVRFKSkgIT0gdHJ1ZSkgewotCQlEQkdfODcyM0EoIiVzLCBmd19zdGF0ZSAhPSBGV19MSU5LRUR8V0lGSV9BUF9TVEFURVxuIiwKLQkJCSAgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoIW1hYykgewotCQlEQkdfODcyM0EoImZsdXNoIGFsbCBzdGEsIGFuZCBjYW1fZW50cnlcbiIpOwotCi0JCWZsdXNoX2FsbF9jYW1fZW50cnkyM2EocGFkYXB0ZXIpOwkvKiBjbGVhciBDQU0gKi8KLQotCQlyZXQgPSBydHdfc3RhX2ZsdXNoMjNhKHBhZGFwdGVyKTsKLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCURCR184NzIzQSgiZnJlZSBzdGEgbWFjYWRkcj0lcE1cbiIsIG1hYyk7Ci0KLQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIobWFjKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7Ci0JcGhlYWQgPSAmcHN0YXByaXYtPmFzb2NfbGlzdDsKLQkvKiBjaGVjayBhc29jX3F1ZXVlICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBzdGEsIHB0bXAsIHBoZWFkLCBhc29jX2xpc3QpIHsKLQkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobWFjLCBwc3RhLT5od2FkZHIpKSB7Ci0JCQlpZiAocHN0YS0+ZG90ODAyMXhhbGcgPT0gMSAmJgotCQkJICAgIHBzdGEtPmJwYWlyd2lzZV9rZXlfaW5zdGFsbGVkID09IGZhbHNlKSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgc3RhJ3MgZG90ODAyMXhhbGcgPSAxIGFuZCAiCi0JCQkJCSAgImtleV9pbnN0YWxsZWQgPSBmYWxzZVxuIiwgX19mdW5jX18pOwotCQkJfSBlbHNlIHsKLQkJCQlEQkdfODcyM0EoImZyZWUgcHN0YSA9JXAsIGFpZCA9JWRcbiIsIHBzdGEsCi0JCQkJCSAgcHN0YS0+YWlkKTsKLQotCQkJCWxpc3RfZGVsX2luaXQoJnBzdGEtPmFzb2NfbGlzdCk7Ci0JCQkJcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQtLTsKLQotCQkJCS8qIHNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOyAqLwotCQkJCXVwZGF0ZWQgPQotCQkJCSAgICBhcF9mcmVlX3N0YTIzYShwYWRhcHRlciwgcHN0YSwgdHJ1ZSwKLQkJCQkJCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKLQkJCQkvKiBzcGluX2xvY2tfYmgoJnBzdGFwcml2LT5hc29jX2xpc3RfbG9jayk7ICovCi0KLQkJCQlwc3RhID0gTlVMTDsKLQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwotCi0JYXNzb2NpYXRlZF9jbGllbnRzX3VwZGF0ZTIzYShwYWRhcHRlciwgdXBkYXRlZCk7Ci0KLQlEQkdfODcyM0EoIi0lcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X2NoYW5nZV9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBjb25zdCB1OCAqbWFjLAotCQkJCSAgICAgICBzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCi17Ci0JREJHXzg3MjNBKCIlcyglcylcbiIsIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjZmc4MDIxMV9ydHdfZHVtcF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IGlkeCwgdTggKm1hYywKLQkJCQkgICAgIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQotewotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0KLQkvKiBUT0RPOiBkdW1wIHNjYW5uZWQgcXVldWUgKi8KLQotCXJldHVybiAtRU5PRU5UOwotfQotCi1zdGF0aWMgaW50IGNmZzgwMjExX3J0d19jaGFuZ2VfYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSAgIHN0cnVjdCBic3NfcGFyYW1ldGVycyAqcGFyYW1zKQotewotCURCR184NzIzQSgiJXMoJXMpXG4iLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHXzg3MjNBVV9BUF9NT0RFICovCi0KLXN0YXRpYyBpbnQgX2NmZzgwMjExX3J0d19tZ210X3R4KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHR4X2NoLAotCQkJCSBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuKQotewotCXN0cnVjdCB4bWl0X2ZyYW1lICpwbWdudGZyYW1lOwotCXN0cnVjdCBwa3RfYXR0cmliICpwYXR0cmliOwotCXVuc2lnbmVkIGNoYXIgKnBmcmFtZTsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKnB3bGFuaGRyOwotCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7Ci0Jc3RydWN0IG1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKLQotCWlmIChfRkFJTCA9PSBydHdfcHdyX3dha2V1cChwYWRhcHRlcikpIHsKLQkJcmV0ID0gLUVGQVVMVDsKLQkJZ290byBleGl0OwotCX0KLQotCXJ0d19zZXRfc2Nhbl9kZW55KHBhZGFwdGVyLCAxMDAwKTsKLQotCXJ0d19zY2FuX2Fib3J0MjNhKHBhZGFwdGVyKTsKLQotCWlmICh0eF9jaCAhPSBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpKSB7Ci0JCWlmICghY2hlY2tfZndzdGF0ZSgmcGFkYXB0ZXItPm1sbWVwcml2LCBfRldfTElOS0VEKSkKLQkJCXBtbG1lZXh0LT5jdXJfY2hhbm5lbCA9IHR4X2NoOwotCQlzZXRfY2hhbm5lbF9id21vZGUyM2EocGFkYXB0ZXIsIHR4X2NoLAotCQkJCSAgIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUsCi0JCQkJICAgSFRfQ0hBTk5FTF9XSURUSF8yMCk7Ci0JfQotCi0JLyogc3RhcnRpbmcgYWxsb2MgbWdtdCBmcmFtZSB0byBkdW1wIGl0ICovCi0JcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwotCWlmICghcG1nbnRmcmFtZSkgewotCQkvKiByZXQgPSAtRU5PTUVNOyAqLwotCQlyZXQgPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIHVwZGF0ZSBhdHRyaWJ1dGUgKi8KLQlwYXR0cmliID0gJnBtZ250ZnJhbWUtPmF0dHJpYjsKLQl1cGRhdGVfbWdudGZyYW1lX2F0dHJpYjIzYShwYWRhcHRlciwgcGF0dHJpYik7Ci0JcGF0dHJpYi0+cmV0cnlfY3RybCA9IGZhbHNlOwotCi0JbWVtc2V0KHBtZ250ZnJhbWUtPmJ1Zl9hZGRyLCAwLCBXTEFOSERSX09GRlNFVCArIFRYREVTQ19PRkZTRVQpOwotCi0JcGZyYW1lID0gKHU4ICopIChwbWdudGZyYW1lLT5idWZfYWRkcikgKyBUWERFU0NfT0ZGU0VUOwotCi0JbWVtY3B5KHBmcmFtZSwgKHZvaWQgKilidWYsIGxlbik7Ci0JcGF0dHJpYi0+cGt0bGVuID0gbGVuOwotCi0JcHdsYW5oZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilwZnJhbWU7Ci0JLyogdXBkYXRlIHNlcSBudW1iZXIgKi8KLQlwbWxtZWV4dC0+bWdudF9zZXEgPSBsZTE2X3RvX2NwdShwd2xhbmhkci0+c2VxX2N0cmwpID4+IDQ7Ci0JcGF0dHJpYi0+c2VxbnVtID0gcG1sbWVleHQtPm1nbnRfc2VxOwotCXBtbG1lZXh0LT5tZ250X3NlcSsrOwotCi0JcGF0dHJpYi0+bGFzdF90eGNtZHN6ID0gcGF0dHJpYi0+cGt0bGVuOwotCi0JcmV0ID0gZHVtcF9tZ250ZnJhbWUyM2FfYW5kX3dhaXRfYWNrMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKLQotCWlmIChyZXQgICE9IF9TVUNDRVNTKQotCQlEQkdfODcyM0EoIiVzLCBhY2sgPT0gZmFsc2VcbiIsIF9fZnVuY19fKTsKLQllbHNlCi0JCURCR184NzIzQSgiJXMsIGFjayA9PSB0cnVlXG4iLCBfX2Z1bmNfXyk7Ci0KLWV4aXQ6Ci0KLQlEQkdfODcyM0EoIiVzLCByZXQgPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2ZnODAyMTFfcnR3X21nbXRfdHgoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKLQkJCQlzdHJ1Y3QgY2ZnODAyMTFfbWdtdF90eF9wYXJhbXMgKnBhcmFtcywKLQkJCQl1NjQgKmNvb2tpZSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0KLQkJKHN0cnVjdCBydHdfYWRhcHRlciAqKXdpcGh5X3RvX2FkYXB0ZXIod2lwaHkpOwotCWludCByZXQgPSAwOwotCWludCB0eF9yZXQ7Ci0JdTMyIGR1bXBfbGltaXQgPSBSVFdfTUFYX01HTVRfVFhfQ05UOwotCXUzMiBkdW1wX2NudCA9IDA7Ci0JYm9vbCBhY2sgPSB0cnVlOwotCXU4IGNhdGVnb3J5LCBhY3Rpb247Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IGppZmZpZXM7Ci0Jc2l6ZV90IGxlbiA9IHBhcmFtcy0+bGVuOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiA9IHBhcmFtcy0+Y2hhbjsKLQljb25zdCB1OCAqYnVmID0gcGFyYW1zLT5idWY7Ci0Jc3RydWN0IGllZWU4MDIxMV9tZ210ICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopYnVmOwotCXU4IHR4X2NoID0gKHU4KSBpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoY2hhbi0+Y2VudGVyX2ZyZXEpOwotCi0JaWYgKCFpZWVlODAyMTFfaXNfYWN0aW9uKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogY29va2llIGdlbmVyYXRpb24gKi8KLQkqY29va2llID0gKHVuc2lnbmVkIGxvbmcpYnVmOwotCi0JREJHXzg3MjNBKCIlcyglcyk6IGxlbiA9JXp1LCBjaCA9JWRcbiIsIF9fZnVuY19fLAotCQkgIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLCBsZW4sIHR4X2NoKTsKLQotCS8qIGluZGljYXRlIGFjayBiZWZvcmUgaXNzdWUgZnJhbWUgdG8gYXZvaWQgcmFjaW5nIHdpdGggcnNwIGZyYW1lICovCi0JY2ZnODAyMTFfbWdtdF90eF9zdGF0dXMocGFkYXB0ZXItPnJ0d193ZGV2LCAqY29va2llLCBidWYsIGxlbiwgYWNrLAotCQkJCUdGUF9LRVJORUwpOwotCi0JREJHXzg3MjNBKCJSVFdfVHg6dHhfY2ggPSVkLCBkYSA9JXBNXG4iLCB0eF9jaCwgaGRyLT5kYSk7Ci0JY2F0ZWdvcnkgPSBoZHItPnUuYWN0aW9uLmNhdGVnb3J5OwotCWFjdGlvbiA9IGhkci0+dS5hY3Rpb24udS53bWVfYWN0aW9uLmFjdGlvbl9jb2RlOwotCURCR184NzIzQSgiUlRXX1R4OmNhdGVnb3J5KCV1KSwgYWN0aW9uKCV1KVxuIiwgY2F0ZWdvcnksIGFjdGlvbik7Ci0KLQlkbyB7Ci0JCWR1bXBfY250Kys7Ci0JCXR4X3JldCA9IF9jZmc4MDIxMV9ydHdfbWdtdF90eChwYWRhcHRlciwgdHhfY2gsIGJ1ZiwgbGVuKTsKLQl9IHdoaWxlIChkdW1wX2NudCA8IGR1bXBfbGltaXQgJiYgdHhfcmV0ICE9IF9TVUNDRVNTKTsKLQotCWlmICh0eF9yZXQgIT0gX1NVQ0NFU1MgfHwgZHVtcF9jbnQgPiAxKSB7Ci0JCURCR184NzIzQSgiJXMoJXMpOiAlcyAoJWQvJWQpIGluICVkIG1zXG4iLAotCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkgIHR4X3JldCA9PSBfU1VDQ0VTUyA/ICJPSyIgOiAiRkFJTCIsIGR1bXBfY250LAotCQkJICBkdW1wX2xpbWl0LCBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNmZzgwMjExX3J0d19tZ210X2ZyYW1lX3JlZ2lzdGVyKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJCSAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKLQkJCQkJICAgICB1MTYgZnJhbWVfdHlwZSwgYm9vbCByZWcpCi17Ci0JaWYgKGZyYW1lX3R5cGUgIT0gKElFRUU4MDIxMV9GVFlQRV9NR01UIHwgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSkpCi0JCXJldHVybjsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9vcHMgcnR3X2NmZzgwMjExX29wcyA9IHsKLQkuY2hhbmdlX3ZpcnR1YWxfaW50ZiA9IGNmZzgwMjExX3J0d19jaGFuZ2VfaWZhY2UsCi0JLmFkZF9rZXkgPSBjZmc4MDIxMV9ydHdfYWRkX2tleSwKLQkuZ2V0X2tleSA9IGNmZzgwMjExX3J0d19nZXRfa2V5LAotCS5kZWxfa2V5ID0gY2ZnODAyMTFfcnR3X2RlbF9rZXksCi0JLnNldF9kZWZhdWx0X2tleSA9IGNmZzgwMjExX3J0d19zZXRfZGVmYXVsdF9rZXksCi0JLmdldF9zdGF0aW9uID0gY2ZnODAyMTFfcnR3X2dldF9zdGF0aW9uLAotCS5zY2FuID0gY2ZnODAyMTFfcnR3X3NjYW4sCi0JLnNldF93aXBoeV9wYXJhbXMgPSBjZmc4MDIxMV9ydHdfc2V0X3dpcGh5X3BhcmFtcywKLQkuY29ubmVjdCA9IGNmZzgwMjExX3J0d19jb25uZWN0LAotCS5kaXNjb25uZWN0ID0gY2ZnODAyMTFfcnR3X2Rpc2Nvbm5lY3QsCi0JLmpvaW5faWJzcyA9IGNmZzgwMjExX3J0d19qb2luX2lic3MsCi0JLmxlYXZlX2lic3MgPSBjZmc4MDIxMV9ydHdfbGVhdmVfaWJzcywKLQkuc2V0X3R4X3Bvd2VyID0gY2ZnODAyMTFfcnR3X3NldF90eHBvd2VyLAotCS5nZXRfdHhfcG93ZXIgPSBjZmc4MDIxMV9ydHdfZ2V0X3R4cG93ZXIsCi0JLnNldF9wb3dlcl9tZ210ID0gY2ZnODAyMTFfcnR3X3NldF9wb3dlcl9tZ210LAotCS5zZXRfcG1rc2EgPSBjZmc4MDIxMV9ydHdfc2V0X3Bta3NhLAotCS5kZWxfcG1rc2EgPSBjZmc4MDIxMV9ydHdfZGVsX3Bta3NhLAotCS5mbHVzaF9wbWtzYSA9IGNmZzgwMjExX3J0d19mbHVzaF9wbWtzYSwKLQotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCS5hZGRfdmlydHVhbF9pbnRmID0gY2ZnODAyMTFfcnR3X2FkZF92aXJ0dWFsX2ludGYsCi0JLmRlbF92aXJ0dWFsX2ludGYgPSBjZmc4MDIxMV9ydHdfZGVsX3ZpcnR1YWxfaW50ZiwKLQotCS5zdGFydF9hcCA9IGNmZzgwMjExX3J0d19zdGFydF9hcCwKLQkuY2hhbmdlX2JlYWNvbiA9IGNmZzgwMjExX3J0d19jaGFuZ2VfYmVhY29uLAotCS5zdG9wX2FwID0gY2ZnODAyMTFfcnR3X3N0b3BfYXAsCi0KLQkuYWRkX3N0YXRpb24gPSBjZmc4MDIxMV9ydHdfYWRkX3N0YXRpb24sCi0JLmRlbF9zdGF0aW9uID0gY2ZnODAyMTFfcnR3X2RlbF9zdGF0aW9uLAotCS5jaGFuZ2Vfc3RhdGlvbiA9IGNmZzgwMjExX3J0d19jaGFuZ2Vfc3RhdGlvbiwKLQkuZHVtcF9zdGF0aW9uID0gY2ZnODAyMTFfcnR3X2R1bXBfc3RhdGlvbiwKLQkuY2hhbmdlX2JzcyA9IGNmZzgwMjExX3J0d19jaGFuZ2VfYnNzLAotI2VuZGlmIC8qIENPTkZJR184NzIzQVVfQVBfTU9ERSAqLwotCi0JLm1nbXRfdHggPSBjZmc4MDIxMV9ydHdfbWdtdF90eCwKLQkubWdtdF9mcmFtZV9yZWdpc3RlciA9IGNmZzgwMjExX3J0d19tZ210X2ZyYW1lX3JlZ2lzdGVyLAotfTsKLQotc3RhdGljIHZvaWQgcnR3X2NmZzgwMjExX2luaXRfaHRfY2FwYWIoc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAsCi0JCQkJICAgICAgIGVudW0gbmw4MDIxMV9iYW5kIGJhbmQsIHU4IHJmX3R5cGUpCi17Ci0KLSNkZWZpbmUgTUFYX0JJVF9SQVRFXzQwTUhaX01DUzE1CTMwMAkvKiBNYnBzICovCi0jZGVmaW5lIE1BWF9CSVRfUkFURV80ME1IWl9NQ1M3CQkxNTAJLyogTWJwcyAqLwotCi0JaHRfY2FwLT5odF9zdXBwb3J0ZWQgPSB0cnVlOwotCi0JaHRfY2FwLT5jYXAgPSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCB8Ci0JICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfAotCSAgICBJRUVFODAyMTFfSFRfQ0FQX0RTU1NDQ0s0MCB8IElFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVOwotCi0JLyoKLQkgKk1heGltdW0gbGVuZ3RoIG9mIEFNUERVIHRoYXQgdGhlIFNUQSBjYW4gcmVjZWl2ZS4KLQkgKkxlbmd0aCA9IDIgXiAoMTMgKyBtYXhfYW1wZHVfbGVuZ3RoX2V4cCkgLSAxIChvY3RldHMpCi0JICovCi0JaHRfY2FwLT5hbXBkdV9mYWN0b3IgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SzsKLQotCS8qTWluaW11bSBNUERVIHN0YXJ0IHNwYWNpbmcgLCAqLwotCWh0X2NhcC0+YW1wZHVfZGVuc2l0eSA9IElFRUU4MDIxMV9IVF9NUERVX0RFTlNJVFlfMTY7Ci0KLQlodF9jYXAtPm1jcy50eF9wYXJhbXMgPSBJRUVFODAyMTFfSFRfTUNTX1RYX0RFRklORUQ7Ci0KLQkvKgotCSAqaHctPndpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfMkdIWl0KLQkgKmJhc2Ugb24gYW50X251bQotCSAqcnhfbWFzazogUlggbWFzawotCSAqaWYgcnhfYW50ID0gMSByeF9tYXNrWzBdPSAweGZmOz09Pk1DUzAtTUNTNwotCSAqaWYgcnhfYW50ID0gMiByeF9tYXNrWzFdPSAweGZmOz09Pk1DUzgtTUNTMTUKLQkgKmlmIHJ4X2FudCA+PSAzIHJ4X21hc2tbMl09IDB4ZmY7Ci0JICppZiBCV180MCByeF9tYXNrWzRdPSAweDAxOwotCSAqaGlnaGVzdCBzdXBwb3J0ZWQgUlggcmF0ZQotCSAqLwotCWlmIChyZl90eXBlID09IFJGXzFUMVIpIHsKLQkJaHRfY2FwLT5tY3MucnhfbWFza1swXSA9IDB4RkY7Ci0JCWh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPSAweDAwOwotCQlodF9jYXAtPm1jcy5yeF9tYXNrWzRdID0gMHgwMTsKLQotCQlodF9jYXAtPm1jcy5yeF9oaWdoZXN0ID0gY3B1X3RvX2xlMTYoTUFYX0JJVF9SQVRFXzQwTUhaX01DUzcpOwotCX0gZWxzZSBpZiAoKHJmX3R5cGUgPT0gUkZfMVQyUikgfHwgKHJmX3R5cGUgPT0gUkZfMlQyUikpIHsKLQkJaHRfY2FwLT5tY3MucnhfbWFza1swXSA9IDB4RkY7Ci0JCWh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPSAweEZGOwotCQlodF9jYXAtPm1jcy5yeF9tYXNrWzRdID0gMHgwMTsKLQotCQlodF9jYXAtPm1jcy5yeF9oaWdoZXN0ID0gY3B1X3RvX2xlMTYoTUFYX0JJVF9SQVRFXzQwTUhaX01DUzE1KTsKLQl9IGVsc2UgewotCQlEQkdfODcyM0EoIiVzLCBlcnJvciByZl90eXBlID0lZFxuIiwgX19mdW5jX18sIHJmX3R5cGUpOwotCX0KLQotfQotCi12b2lkIHJ0d19jZmc4MDIxMV9pbml0X3dpcGh5KHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JdTggcmZfdHlwZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpiYW5kczsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICpwd2RldiA9IHBhZGFwdGVyLT5ydHdfd2RldjsKLQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gcHdkZXYtPndpcGh5OwotCi0JcmZfdHlwZSA9IHJ0bDg3MjNhX2dldF9yZl90eXBlKHBhZGFwdGVyKTsKLQotCURCR184NzIzQSgiJXM6cmZfdHlwZSA9JWRcbiIsIF9fZnVuY19fLCByZl90eXBlKTsKLQotCS8qIGlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMUcpICovCi0JewotCQliYW5kcyA9IHdpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfMkdIWl07Ci0JCWlmIChiYW5kcykKLQkJCXJ0d19jZmc4MDIxMV9pbml0X2h0X2NhcGFiKCZiYW5kcy0+aHRfY2FwLAotCQkJCQkJICAgTkw4MDIxMV9CQU5EXzJHSFosCi0JCQkJCQkgICByZl90eXBlKTsKLQl9Ci0KLQkvKiBpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFBKSAqLwotCXsKLQkJYmFuZHMgPSB3aXBoeS0+YmFuZHNbTkw4MDIxMV9CQU5EXzVHSFpdOwotCQlpZiAoYmFuZHMpCi0JCQlydHdfY2ZnODAyMTFfaW5pdF9odF9jYXBhYigmYmFuZHMtPmh0X2NhcCwKLQkJCQkJCSAgIE5MODAyMTFfQkFORF81R0haLAotCQkJCQkJICAgcmZfdHlwZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBydHdfY2ZnODAyMTFfcHJlaW5pdF93aXBoeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAotCQkJCSAgICAgICBzdHJ1Y3Qgd2lwaHkgKndpcGh5KQotewotCXdpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX01CTTsKLQotCXdpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFJUV19TU0lEX1NDQU5fQU1PVU5UOwotCXdpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSBJRUVFODAyMTFfTUFYX0RBVEFfTEVOOwotCXdpcGh5LT5tYXhfbnVtX3Bta2lkcyA9IFJUV19NQVhfTlVNX1BNS0lEUzsKLQotCXdpcGh5LT5tYXhfcmVtYWluX29uX2NoYW5uZWxfZHVyYXRpb24gPQotCSAgICBSVFdfTUFYX1JFTUFJTl9PTl9DSEFOTkVMX0RVUkFUSU9OOwotCi0Jd2lwaHktPmludGVyZmFjZV9tb2RlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8Ci0JICAgIEJJVChOTDgwMjExX0lGVFlQRV9BREhPQykgfAotI2lmZGVmIENPTkZJR184NzIzQVVfQVBfTU9ERQotCSAgICBCSVQoTkw4MDIxMV9JRlRZUEVfQVApIHwgQklUKE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHwKLSNlbmRpZgotCSAgICAwOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9BUF9NT0RFCi0Jd2lwaHktPm1nbXRfc3R5cGVzID0gcnR3X2NmZzgwMjExX2RlZmF1bHRfbWdtdF9zdHlwZXM7Ci0jZW5kaWYgLyogQ09ORklHXzg3MjNBVV9BUF9NT0RFICovCi0KLQl3aXBoeS0+c29mdHdhcmVfaWZ0eXBlcyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfTU9OSVRPUik7Ci0KLQkvKgotCSAgIHdpcGh5LT5pZmFjZV9jb21iaW5hdGlvbnMgPSAmcnR3X2NvbWJpbmF0aW9uczsKLQkgICB3aXBoeS0+bl9pZmFjZV9jb21iaW5hdGlvbnMgPSAxOwotCSAqLwotCi0Jd2lwaHktPmNpcGhlcl9zdWl0ZXMgPSBydHdfY2lwaGVyX3N1aXRlczsKLQl3aXBoeS0+bl9jaXBoZXJfc3VpdGVzID0gQVJSQVlfU0laRShydHdfY2lwaGVyX3N1aXRlcyk7Ci0KLQkvKiBpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aXJlbGVzc19tb2RlICYgV0lSRUxFU1NfMTFHKSAqLwotCXdpcGh5LT5iYW5kc1tOTDgwMjExX0JBTkRfMkdIWl0gPQotCSAgICBydHdfc3B0X2JhbmRfYWxsb2MoTkw4MDIxMV9CQU5EXzJHSFopOwotCS8qIGlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpcmVsZXNzX21vZGUgJiBXSVJFTEVTU18xMUEpICovCi0Jd2lwaHktPmJhbmRzW05MODAyMTFfQkFORF81R0haXSA9Ci0JICAgIHJ0d19zcHRfYmFuZF9hbGxvYyhOTDgwMjExX0JBTkRfNUdIWik7Ci0KLQl3aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUw7Ci0Jd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfT0ZGQ0hBTl9UWCB8IFdJUEhZX0ZMQUdfSEFWRV9BUF9TTUU7Ci0KLQlpZiAocGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5wb3dlcl9tZ250ICE9IFBTX01PREVfQUNUSVZFKQotCQl3aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwotCWVsc2UKLQkJd2lwaHktPmZsYWdzICY9IH5XSVBIWV9GTEFHX1BTX09OX0JZX0RFRkFVTFQ7Ci19Ci0KLWludCBydHdfd2Rldl9hbGxvYyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHdpcGh5ICp3aXBoeTsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwotCXN0cnVjdCBydHdfd2Rldl9wcml2ICpwd2Rldl9wcml2OwotCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7Ci0KLQlEQkdfODcyM0EoIiVzKHBhZGFwdGVyID0lcClcbiIsIF9fZnVuY19fLCBwYWRhcHRlcik7Ci0KLQkvKiB3aXBoeSAqLwotCXdpcGh5ID0gd2lwaHlfbmV3KCZydHdfY2ZnODAyMTFfb3BzLCBzaXplb2Yoc3RydWN0IHJ0d193ZGV2X3ByaXYpKTsKLQlpZiAoIXdpcGh5KSB7Ci0JCURCR184NzIzQSgiQ291bGRuJ3QgYWxsb2NhdGUgd2lwaHkgZGV2aWNlXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qICB3ZGV2ICovCi0Jd2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3aXJlbGVzc19kZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdkZXYpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmcmVlX3dpcGh5OwotCX0KLQotCXNldF93aXBoeV9kZXYod2lwaHksIGRldik7Ci0JcnR3X2NmZzgwMjExX3ByZWluaXRfd2lwaHkocGFkYXB0ZXIsIHdpcGh5KTsKLQotCXJldCA9IHdpcGh5X3JlZ2lzdGVyKHdpcGh5KTsKLQlpZiAocmV0IDwgMCkgewotCQlEQkdfODcyM0EoIkNvdWxkbid0IHJlZ2lzdGVyIHdpcGh5IGRldmljZVxuIik7Ci0JCWdvdG8gZnJlZV93ZGV2OwotCX0KLQotCXdkZXYtPndpcGh5ID0gd2lwaHk7Ci0Jd2Rldi0+bmV0ZGV2ID0gcG5ldGRldjsKLQkvKiB3ZGV2LT5pZnR5cGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOyAqLwotCS8qICBmb3IgcnR3X3NldG9wbW9kZV9jbWQyM2EoKSBpbiBjZmc4MDIxMV9ydHdfY2hhbmdlX2lmYWNlKCkgKi8KLQl3ZGV2LT5pZnR5cGUgPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOwotCXBhZGFwdGVyLT5ydHdfd2RldiA9IHdkZXY7Ci0JcG5ldGRldi0+aWVlZTgwMjExX3B0ciA9IHdkZXY7Ci0KLQkvKiBpbml0IHB3ZGV2X3ByaXYgKi8KLQlwd2Rldl9wcml2ID0gd2Rldl90b19wcml2KHdkZXYpOwotCXB3ZGV2X3ByaXYtPnJ0d193ZGV2ID0gd2RldjsKLQlwd2Rldl9wcml2LT5wbW9uX25kZXYgPSBOVUxMOwotCXB3ZGV2X3ByaXYtPmlmbmFtZV9tb25bMF0gPSAnXDAnOwotCXB3ZGV2X3ByaXYtPnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0JcHdkZXZfcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKLQlzcGluX2xvY2tfaW5pdCgmcHdkZXZfcHJpdi0+c2Nhbl9yZXFfbG9jayk7Ci0KLQlwd2Rldl9wcml2LT5wMnBfZW5hYmxlZCA9IGZhbHNlOwotCi0JaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucG93ZXJfbWdudCAhPSBQU19NT0RFX0FDVElWRSkKLQkJcHdkZXZfcHJpdi0+cG93ZXJfbWdtdCA9IHRydWU7Ci0JZWxzZQotCQlwd2Rldl9wcml2LT5wb3dlcl9tZ210ID0gZmFsc2U7Ci0KLQlyZXR1cm4gcmV0OwotZnJlZV93ZGV2OgotCWtmcmVlKHdkZXYpOwotZnJlZV93aXBoeToKLQl3aXBoeV9mcmVlKHdpcGh5KTsKLWV4aXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBydHdfd2Rldl9mcmVlKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCi17Ci0JREJHXzg3MjNBKCIlcyh3ZGV2ID0lcClcbiIsIF9fZnVuY19fLCB3ZGV2KTsKLQotCWlmICghd2RldikKLQkJcmV0dXJuOwotCi0Ja2ZyZWUod2Rldi0+d2lwaHktPmJhbmRzW05MODAyMTFfQkFORF8yR0haXSk7Ci0Ja2ZyZWUod2Rldi0+d2lwaHktPmJhbmRzW05MODAyMTFfQkFORF81R0haXSk7Ci0KLQl3aXBoeV9mcmVlKHdkZXYtPndpcGh5KTsKLQotCWtmcmVlKHdkZXYpOwotfQotCi12b2lkIHJ0d193ZGV2X3VucmVnaXN0ZXIoc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldikKLXsKLQlzdHJ1Y3QgcnR3X3dkZXZfcHJpdiAqcHdkZXZfcHJpdjsKLQotCURCR184NzIzQSgiJXMod2RldiA9JXApXG4iLCBfX2Z1bmNfXywgd2Rldik7Ci0KLQlpZiAoIXdkZXYpCi0JCXJldHVybjsKLQotCXB3ZGV2X3ByaXYgPSB3ZGV2X3RvX3ByaXYod2Rldik7Ci0KLQlydHdfY2ZnODAyMTFfaW5kaWNhdGVfc2Nhbl9kb25lKHB3ZGV2X3ByaXYsIHRydWUpOwotCi0JaWYgKHB3ZGV2X3ByaXYtPnBtb25fbmRldikgewotCQlEQkdfODcyM0EoIiVzLCB1bnJlZ2lzdGVyIG1vbml0b3IgaW50ZXJmYWNlXG4iLCBfX2Z1bmNfXyk7Ci0JCXVucmVnaXN0ZXJfbmV0ZGV2KHB3ZGV2X3ByaXYtPnBtb25fbmRldik7Ci0JfQotCi0Jd2lwaHlfdW5yZWdpc3Rlcih3ZGV2LT53aXBoeSk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9tbG1lX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9tbG1lX2xpbnV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMjQzNjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvbWxtZV9saW51eC5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgX01MTUVfT1NERVBfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLSNpbmNsdWRlIDxtbG1lX29zZGVwLmg+Ci0KLXN0YXRpYyBzdHJ1Y3QgcnRfcG1raWRfbGlzdCBiYWNrdXBQTUtJRExpc3RbTlVNX1BNS0lEX0NBQ0hFXTsKLQotdm9pZCBydHdfcmVzZXRfc2VjdXJpdHlwcml2MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQl1OAliYWNrdXBQTUtJREluZGV4ID0gMDsKLQl1OAliYWNrdXBUS0lQQ291bnRlcm1lYXN1cmUgPSAweDAwOwotCXVuc2lnbmVkIGxvbmcgYmFja3VwVEtJUGNvdW50ZXJtZWFzdXJlX3RpbWUgPSAwOwotCi0JaWYgKGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtID09Ci0JICAgIGRvdDExQXV0aEFsZ3J0aG1fODAyMVgpIHsgLyogODAyLjF4ICovCi0JCS8qICBXZSBoYXZlIHRvIGJhY2t1cCB0aGUgUE1LIGluZm9ybWF0aW9uIGZvciBXaUZpIFBNSwotCQkgKiAgQ2FjaGluZyB0ZXN0IGl0ZW0uCi0JCSAqICBCYWNrdXAgdGhlIGJ0a2lwX2NvdW50ZXJtZWFzdXJlIGluZm9ybWF0aW9uLgotCQkgKiAgV2hlbiB0aGUgY291bnRlcm1lYXN1cmUgaXMgdHJpZ2dlciwgdGhlIGRyaXZlciBoYXZlIHRvCi0JCSAqICBkaXNjb25uZWN0IHdpdGggQVAgZm9yIDYwIHNlY29uZHMuCi0JCSAqLwotCQltZW1jcHkoJmJhY2t1cFBNS0lETGlzdFswXSwgJmFkYXB0ZXItPnNlY3VyaXR5cHJpdi5QTUtJRExpc3RbMF0sCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IHJ0X3Bta2lkX2xpc3QpICogTlVNX1BNS0lEX0NBQ0hFKTsKLQkJYmFja3VwUE1LSURJbmRleCA9IGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5QTUtJREluZGV4OwotCQliYWNrdXBUS0lQQ291bnRlcm1lYXN1cmUgPSBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnRraXBfY291bnRlcm1lYXN1cmU7Ci0JCWJhY2t1cFRLSVBjb3VudGVybWVhc3VyZV90aW1lID0gYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWU7Ci0KLQkJbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopJmFkYXB0ZXItPnNlY3VyaXR5cHJpdiwgMCwKLQkJICAgICAgIHNpemVvZiAoc3RydWN0IHNlY3VyaXR5X3ByaXYpKTsKLQkJLyogUmVzdG9yZSB0aGUgUE1LIGluZm9ybWF0aW9uIHRvIHNlY3VyaXR5cHJpdiBzdHJ1Y3R1cmUKLQkJICogZm9yIHRoZSBmb2xsb3dpbmcgY29ubmVjdGlvbi4KLQkJICovCi0JCW1lbWNweSgmYWRhcHRlci0+c2VjdXJpdHlwcml2LlBNS0lETGlzdFswXSwgJmJhY2t1cFBNS0lETGlzdFswXSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRfcG1raWRfbGlzdCkgKiBOVU1fUE1LSURfQ0FDSEUpOwotCQlhZGFwdGVyLT5zZWN1cml0eXByaXYuUE1LSURJbmRleCA9IGJhY2t1cFBNS0lESW5kZXg7Ci0JCWFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idGtpcF9jb3VudGVybWVhc3VyZSA9IGJhY2t1cFRLSVBDb3VudGVybWVhc3VyZTsKLQkJYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWUgPSBiYWNrdXBUS0lQY291bnRlcm1lYXN1cmVfdGltZTsKLQotCQlhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2F1dGh0eXBlID0gTmRpczgwMl8xMUF1dGhNb2RlT3BlbjsKLQkJYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCX0gZWxzZSB7ICAvKiByZXNldCB2YWx1ZXMgaW4gc2VjdXJpdHlwcml2ICovCi0JCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjX3ByaXYgPSAmYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCi0JCS8qIG9wZW4gc3lzdGVtICovCi0JCXBzZWNfcHJpdi0+ZG90MTFBdXRoQWxncnRobSA9IGRvdDExQXV0aEFsZ3J0aG1fT3BlbjsKLQkJcHNlY19wcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gMDsKLQkJcHNlY19wcml2LT5kb3QxMVByaXZhY3lLZXlJbmRleCA9IDA7Ci0KLQkJcHNlY19wcml2LT5kb3QxMTgwMjFYR3JwUHJpdmFjeSA9IDA7Ci0JCXBzZWNfcHJpdi0+ZG90MTE4MDIxWEdycEtleWlkID0gMTsKLQotCQlwc2VjX3ByaXYtPm5kaXNhdXRodHlwZSA9IE5kaXM4MDJfMTFBdXRoTW9kZU9wZW47Ci0JCXBzZWNfcHJpdi0+bmRpc2VuY3J5cHRzdGF0dXMgPSBOZGlzODAyXzExV0VQRGlzYWJsZWQ7Ci0JfQotfQotCi12b2lkIHJ0d19vc19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlcikKLXsKLQkvKiBEbyBpdCBmaXJzdCBmb3IgdHggYnJvYWRjYXN0IHBrdCBhZnRlciBkaXNjb25uZWN0aW9uIGlzc3VlISAqLwotCW5ldGlmX2NhcnJpZXJfb2ZmKGFkYXB0ZXItPnBuZXRkZXYpOwotCi0JcnR3X2NmZzgwMjExX2luZGljYXRlX2Rpc2Nvbm5lY3QoYWRhcHRlcik7Ci0KLQlydHdfcmVzZXRfc2VjdXJpdHlwcml2MjNhKGFkYXB0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvb3NfaW50ZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL29zX2ludGZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODQ4YzIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvb3NfaW50ZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDg1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX09TX0lOVEZTX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8eG1pdF9vc2RlcC5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDxoYWxfaW50Zi5oPgotI2luY2x1ZGUgPHJ0d192ZXJzaW9uLmg+Ci0KLSNpbmNsdWRlIDxydGw4NzIzYV9oYWwuaD4KLQotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWFsdGVrIFdpcmVsZXNzIExhbiBEcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIlJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiIpOwotTU9EVUxFX0FVVEhPUigiTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PiIpOwotTU9EVUxFX0FVVEhPUigiSmVzIFNvcmVuc2VuIDxKZXMuU29yZW5zZW5AcmVkaGF0LmNvbT4iKTsKLU1PRFVMRV9WRVJTSU9OKERSSVZFUlZFUlNJT04pOwotTU9EVUxFX0ZJUk1XQVJFKCJydGx3aWZpL3J0bDg3MjNhdWZ3X0EuYmluIik7Ci1NT0RVTEVfRklSTVdBUkUoInJ0bHdpZmkvcnRsODcyM2F1ZndfQi5iaW4iKTsKLU1PRFVMRV9GSVJNV0FSRSgicnRsd2lmaS9ydGw4NzIzYXVmd19CX05vQlQuYmluIik7Ci0KLS8qIG1vZHVsZSBwYXJhbSBkZWZhdWx0cyAqLwotc3RhdGljIGludCBydHdfY2hpcF92ZXJzaW9uOwotc3RhdGljIGludCBydHdfcmZpbnRmcyA9IEhXUEk7Ci1zdGF0aWMgaW50IHJ0d19kZWJ1ZyA9IDE7Ci0KLXN0YXRpYyBpbnQgcnR3X2NoYW5uZWwgPSAxOy8qIGFkLWhvYyBzdXBwb3J0IHJlcXVpcmVtZW50ICovCi1zdGF0aWMgaW50IHJ0d193aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfMTFCR18yNE47Ci1zdGF0aWMgaW50IHJ0d192cnRsX2NhcnJpZXJfc2Vuc2UgPSBBVVRPX1ZDUzsKLXN0YXRpYyBpbnQgcnR3X3Zjc190eXBlID0gUlRTX0NUUzsvKiAgKi8KLXN0YXRpYyBpbnQgcnR3X3J0c190aHJlc2ggPSAyMzQ3Oy8qICAqLwotc3RhdGljIGludCBydHdfZnJhZ190aHJlc2ggPSAyMzQ2Oy8qICAqLwotc3RhdGljIGludCBydHdfcHJlYW1ibGUgPSBQUkVBTUJMRV9MT05HOy8qIGxvbmcsIHNob3J0LCBhdXRvICovCi1zdGF0aWMgaW50IHJ0d19zY2FuX21vZGUgPSAxOy8qIGFjdGl2ZSwgcGFzc2l2ZSAqLwotc3RhdGljIGludCBydHdfYWRob2NfdHhfcHdyID0gMTsKLXN0YXRpYyBpbnQgcnR3X3NvZnRfYXA7Ci1zdGF0aWMgaW50IHJ0d19wb3dlcl9tZ250ID0gMTsKLXN0YXRpYyBpbnQgcnR3X2lwc19tb2RlID0gSVBTX05PUk1BTDsKLQotc3RhdGljIGludCBydHdfc21hcnRfcHMgPSAyOwotCi1tb2R1bGVfcGFyYW0ocnR3X2lwc19tb2RlLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhydHdfaXBzX21vZGUsICJUaGUgZGVmYXVsdCBJUFMgbW9kZSIpOwotCi1zdGF0aWMgaW50IHJ0d19sb25nX3JldHJ5X2xtdCA9IDc7Ci1zdGF0aWMgaW50IHJ0d19zaG9ydF9yZXRyeV9sbXQgPSA3Owotc3RhdGljIGludCBydHdfYnVzeV90aHJlc2ggPSA0MDsKLXN0YXRpYyBpbnQgcnR3X2Fja19wb2xpY3kgPSBOT1JNQUxfQUNLOwotCi1zdGF0aWMgaW50IHJ0d19hY21fbWV0aG9kOy8qICAwOkJ5IFNXIDE6QnkgSFcuICovCi0KLXN0YXRpYyBpbnQgcnR3X3dtbV9lbmFibGUgPSAxOy8qICBkZWZhdWx0IGlzIHNldCB0byBlbmFibGUgdGhlIHdtbS4gKi8KLXN0YXRpYyBpbnQgcnR3X3VhcHNkX2VuYWJsZTsKLQotc3RhdGljIGludCBydHdfaHRfZW5hYmxlID0gMTsKLS8qIDAgOmRpYWJsZSwgYml0KDApOiBlbmFibGUgMi40ZywgYml0KDEpOiBlbmFibGUgNWcgKi8KLXN0YXRpYyBpbnQgcnR3X2NidzQwX2VuYWJsZSA9IDM7Ci1zdGF0aWMgaW50IHJ0d19hbXBkdV9lbmFibGUgPSAxOy8qIGZvciBlbmFibGUgdHhfYW1wZHUgKi8KLS8qICAwOiBkaXNhYmxlLCBiaXQoMCk6ZW5hYmxlIDIuNGcsIGJpdCgxKTplbmFibGUgNWcsIGRlZmF1bHQgaXMgc2V0IHRvIGVuYWJsZQotICogMi40R0haIGZvciBJT1QgaXNzdWUgd2l0aCBidWZmbGFvJ3MgQVAgYXQgNUdIWgotICovCi1zdGF0aWMgaW50IHJ0d19yeF9zdGJjID0gMTsKLXN0YXRpYyBpbnQgcnR3X2FtcGR1X2Ftc2R1Oy8qICAwOiBkaXNhYmxlZCwgMTplbmFibGVkLCAyOmF1dG8gKi8KLQotLyogVXNlIDIgcGF0aCBUeCB0byB0cmFuc21pdCBNQ1MwfjcgYW5kIGxlZ2FjeSBtb2RlICovCi1zdGF0aWMgaW50IHJ0d19sb3dyYXRlX3R3b194bWl0ID0gMTsKLQotLyogaW50IHJmX2NvbmZpZyA9IFJGXzFUMlI7ICAxVDJSICovCi1zdGF0aWMgaW50IHJ0d19yZl9jb25maWcgPSBSRl84MTlYX01BWF9UWVBFOyAgLyogYXV0byAqLwotc3RhdGljIGludCBydHdfbG93X3Bvd2VyOwotc3RhdGljIGludCBydHdfd2lmaV9zcGVjOwotc3RhdGljIGludCBydHdfY2hhbm5lbF9wbGFuID0gUlRfQ0hBTk5FTF9ET01BSU5fTUFYOwotCi0jaWZkZWYgQ09ORklHXzg3MjNBVV9CVF9DT0VYSVNUCi1zdGF0aWMgaW50IHJ0d19idGNvZXhfZW5hYmxlID0gMTsKLXN0YXRpYyBpbnQgcnR3X2J0X2lzbyA9IDI7LyogIDA6TG93LCAxOkhpZ2gsIDI6RnJvbSBFZnVzZSAqLwotLyogIDA6SWRsZSwgMTpOb25lLVNDTywgMjpTQ08sIDM6RnJvbSBDb3VudGVyLCA0LkJ1c3ksIDUuT3RoZXJCdXN5ICovCi1zdGF0aWMgaW50IHJ0d19idF9zY28gPSAzOwotLyogIDA6RGlzYWJsZSBCVCBjb250cm9sIEEtTVBEVSwgMTpFbmFibGUgQlQgY29udHJvbCBBLU1QRFUuICovCi1zdGF0aWMgaW50IHJ0d19idF9hbXBkdSA9IDE7Ci0jZW5kaWYKLQotLyogIDA6UmVqZWN0IEFQJ3MgQWRkIEJBIHJlcSwgMTpBY2NlcHQgQVAncyBBZGQgQkEgcmVxLiAqLwotc3RhdGljIGludCBydHdfQWNjZXB0QWRkYmFSZXEgPSB0cnVlOwotCi1zdGF0aWMgaW50IHJ0d19hbnRkaXZfY2ZnID0gMjsgLyogIDA6T0ZGICwgMTpPTiwgMjpkZWNpZGUgYnkgRWZ1c2UgY29uZmlnICovCi1zdGF0aWMgaW50IHJ0d19hbnRkaXZfdHlwZTsgLyogMDpkZWNpZGUgYnkgZWZ1c2UgKi8KLQotc3RhdGljIGludCBydHdfZW51c2JzczsvKiAwOmRpc2FibGUsIDE6ZW5hYmxlICovCi0KLXN0YXRpYyBpbnQgcnR3X2h3cGRuX21vZGUgPSAyOy8qIDA6ZGlzYWJsZSwgMTplbmFibGUsIDI6IGJ5IEVGVVNFIGNvbmZpZyAqLwotCi1zdGF0aWMgaW50IHJ0d19od3B3cnBfZGV0ZWN0OyAvKiBIVyBwb3dlciAgcGluZyBkZXRlY3QgMDpkaXNhYmxlICwgMTplbmFibGUgKi8KLQotc3RhdGljIGludCBydHdfaHdfd3BzX3BiYyA9IDE7Ci0KLXN0YXRpYyBpbnQgcnR3XzgwMjExZDsKLQotc3RhdGljIGludCBydHdfcmVndWxhdG9yeV9pZCA9IDB4ZmY7LyogIFJlZ3VsYXRvcnkgdGFiIGlkLCAweGZmID0gZm9sbG93IGVmdXNlJ3Mgc2V0dGluZyAqLwotCi1tb2R1bGVfcGFyYW0ocnR3X3JlZ3VsYXRvcnlfaWQsIGludCwgMDY0NCk7Ci0KLXN0YXRpYyBjaGFyICppZm5hbWUgPSAid2xhbiVkIjsKLW1vZHVsZV9wYXJhbShpZm5hbWUsIGNoYXJwLCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaWZuYW1lLCAiVGhlIGRlZmF1bHQgbmFtZSB0byBhbGxvY2F0ZSBmb3IgZmlyc3QgaW50ZXJmYWNlIik7Ci0KLXN0YXRpYyBjaGFyICppZjJuYW1lID0gIndsYW4lZCI7Ci1tb2R1bGVfcGFyYW0oaWYybmFtZSwgY2hhcnAsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhpZjJuYW1lLCAiVGhlIGRlZmF1bHQgbmFtZSB0byBhbGxvY2F0ZSBmb3Igc2Vjb25kIGludGVyZmFjZSIpOwotCi1tb2R1bGVfcGFyYW0ocnR3X2NoYW5uZWxfcGxhbiwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfY2hpcF92ZXJzaW9uLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19yZmludGZzLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19jaGFubmVsLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d193bW1fZW5hYmxlLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d192cnRsX2NhcnJpZXJfc2Vuc2UsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X3Zjc190eXBlLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19idXN5X3RocmVzaCwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfaHRfZW5hYmxlLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19jYnc0MF9lbmFibGUsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2FtcGR1X2VuYWJsZSwgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfcnhfc3RiYywgaW50LCAwNjQ0KTsKLW1vZHVsZV9wYXJhbShydHdfYW1wZHVfYW1zZHUsIGludCwgMDY0NCk7Ci0KLW1vZHVsZV9wYXJhbShydHdfbG93cmF0ZV90d29feG1pdCwgaW50LCAwNjQ0KTsKLQotbW9kdWxlX3BhcmFtKHJ0d19yZl9jb25maWcsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X3Bvd2VyX21nbnQsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X3NtYXJ0X3BzLCBpbnQsIDA2NDQpOwotbW9kdWxlX3BhcmFtKHJ0d19sb3dfcG93ZXIsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X3dpZmlfc3BlYywgaW50LCAwNjQ0KTsKLQotbW9kdWxlX3BhcmFtKHJ0d19hbnRkaXZfY2ZnLCBpbnQsIDA2NDQpOwotCi1tb2R1bGVfcGFyYW0ocnR3X2VudXNic3MsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2h3cGRuX21vZGUsIGludCwgMDY0NCk7Ci1tb2R1bGVfcGFyYW0ocnR3X2h3cHdycF9kZXRlY3QsIGludCwgMDY0NCk7Ci0KLW1vZHVsZV9wYXJhbShydHdfaHdfd3BzX3BiYywgaW50LCAwNjQ0KTsKLQotc3RhdGljIHVpbnQgcnR3X21heF9yb2FtaW5nX3RpbWVzID0gMjsKLW1vZHVsZV9wYXJhbShydHdfbWF4X3JvYW1pbmdfdGltZXMsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhydHdfbWF4X3JvYW1pbmdfdGltZXMsICJUaGUgbWF4IHJvYW1pbmcgdGltZXMgdG8gdHJ5Iik7Ci0KLW1vZHVsZV9wYXJhbShydHdfODAyMTFkLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhydHdfODAyMTFkLCAiRW5hYmxlIDgwMi4xMWQgbWVjaGFuaXNtIik7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLW1vZHVsZV9wYXJhbShydHdfYnRjb2V4X2VuYWJsZSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MocnR3X2J0Y29leF9lbmFibGUsICJFbmFibGUgQlQgY28tZXhpc3RlbmNlIG1lY2hhbmlzbSIpOwotI2VuZGlmCi0KLXN0YXRpYyB1aW50IHJ0d19ub3RjaF9maWx0ZXI7Ci1tb2R1bGVfcGFyYW0ocnR3X25vdGNoX2ZpbHRlciwgdWludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHJ0d19ub3RjaF9maWx0ZXIsICIwOkRpc2FibGUsIDE6RW5hYmxlLCAyOkVuYWJsZSBvbmx5IGZvciBQMlAiKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgcnR3X2RlYnVnLCBpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlNldCBkZWJ1ZyBsZXZlbCAoMS05KSAoZGVmYXVsdCAxKSIpOwotCi1zdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldik7Ci0KLXN0YXRpYyB2b2lkIGxvYWRwYXJhbShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCAgc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpCi17Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgICpyZWdpc3RyeV9wYXIgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQotCUdsb2JhbERlYnVnTGV2ZWwyM0EgPSBydHdfZGVidWc7Ci0JcmVnaXN0cnlfcGFyLT5jaGlwX3ZlcnNpb24gPSAodTgpcnR3X2NoaXBfdmVyc2lvbjsKLQlyZWdpc3RyeV9wYXItPnJmaW50ZnMgPSAodTgpcnR3X3JmaW50ZnM7Ci0JbWVtY3B5KHJlZ2lzdHJ5X3Bhci0+c3NpZC5zc2lkLCAiQU5ZIiwgMyk7Ci0JcmVnaXN0cnlfcGFyLT5zc2lkLnNzaWRfbGVuID0gMzsKLQlyZWdpc3RyeV9wYXItPmNoYW5uZWwgPSAodTgpcnR3X2NoYW5uZWw7Ci0JcmVnaXN0cnlfcGFyLT53aXJlbGVzc19tb2RlID0gKHU4KXJ0d193aXJlbGVzc19tb2RlOwotCXJlZ2lzdHJ5X3Bhci0+dnJ0bF9jYXJyaWVyX3NlbnNlID0gKHU4KXJ0d192cnRsX2NhcnJpZXJfc2Vuc2U7Ci0JcmVnaXN0cnlfcGFyLT52Y3NfdHlwZSA9ICh1OClydHdfdmNzX3R5cGU7Ci0JcmVnaXN0cnlfcGFyLT5ydHNfdGhyZXNoID0gKHUxNilydHdfcnRzX3RocmVzaDsKLQlyZWdpc3RyeV9wYXItPmZyYWdfdGhyZXNoID0gKHUxNilydHdfZnJhZ190aHJlc2g7Ci0JcmVnaXN0cnlfcGFyLT5wcmVhbWJsZSA9ICh1OClydHdfcHJlYW1ibGU7Ci0JcmVnaXN0cnlfcGFyLT5zY2FuX21vZGUgPSAodTgpcnR3X3NjYW5fbW9kZTsKLQlyZWdpc3RyeV9wYXItPmFkaG9jX3R4X3B3ciA9ICh1OClydHdfYWRob2NfdHhfcHdyOwotCXJlZ2lzdHJ5X3Bhci0+c29mdF9hcCA9ICAodTgpcnR3X3NvZnRfYXA7Ci0JcmVnaXN0cnlfcGFyLT5zbWFydF9wcyA9ICAodTgpcnR3X3NtYXJ0X3BzOwotCXJlZ2lzdHJ5X3Bhci0+cG93ZXJfbWdudCA9ICh1OClydHdfcG93ZXJfbWdudDsKLQlyZWdpc3RyeV9wYXItPmlwc19tb2RlID0gKHU4KXJ0d19pcHNfbW9kZTsKLQlyZWdpc3RyeV9wYXItPmxvbmdfcmV0cnlfbG10ID0gKHU4KXJ0d19sb25nX3JldHJ5X2xtdDsKLQlyZWdpc3RyeV9wYXItPnNob3J0X3JldHJ5X2xtdCA9ICh1OClydHdfc2hvcnRfcmV0cnlfbG10OwotCXJlZ2lzdHJ5X3Bhci0+YnVzeV90aHJlc2ggPSAodTE2KXJ0d19idXN5X3RocmVzaDsKLQlyZWdpc3RyeV9wYXItPmFja19wb2xpY3kgPSAodTgpcnR3X2Fja19wb2xpY3k7Ci0JcmVnaXN0cnlfcGFyLT5hY21fbWV0aG9kID0gKHU4KXJ0d19hY21fbWV0aG9kOwotCSAvKiBVQVBTRCAqLwotCXJlZ2lzdHJ5X3Bhci0+d21tX2VuYWJsZSA9ICh1OClydHdfd21tX2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPnVhcHNkX2VuYWJsZSA9ICh1OClydHdfdWFwc2RfZW5hYmxlOwotCXJlZ2lzdHJ5X3Bhci0+aHRfZW5hYmxlID0gKHU4KXJ0d19odF9lbmFibGU7Ci0JcmVnaXN0cnlfcGFyLT5jYnc0MF9lbmFibGUgPSAodTgpcnR3X2NidzQwX2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPmFtcGR1X2VuYWJsZSA9ICh1OClydHdfYW1wZHVfZW5hYmxlOwotCXJlZ2lzdHJ5X3Bhci0+cnhfc3RiYyA9ICh1OClydHdfcnhfc3RiYzsKLQlyZWdpc3RyeV9wYXItPmFtcGR1X2Ftc2R1ID0gKHU4KXJ0d19hbXBkdV9hbXNkdTsKLQlyZWdpc3RyeV9wYXItPmxvd3JhdGVfdHdvX3htaXQgPSAodTgpcnR3X2xvd3JhdGVfdHdvX3htaXQ7Ci0JcmVnaXN0cnlfcGFyLT5yZl9jb25maWcgPSAodTgpcnR3X3JmX2NvbmZpZzsKLQlyZWdpc3RyeV9wYXItPmxvd19wb3dlciA9ICh1OClydHdfbG93X3Bvd2VyOwotCXJlZ2lzdHJ5X3Bhci0+d2lmaV9zcGVjID0gKHU4KXJ0d193aWZpX3NwZWM7Ci0JcmVnaXN0cnlfcGFyLT5jaGFubmVsX3BsYW4gPSAodTgpcnR3X2NoYW5uZWxfcGxhbjsKLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLQlyZWdpc3RyeV9wYXItPmJ0Y29leCA9ICh1OClydHdfYnRjb2V4X2VuYWJsZTsKLQlyZWdpc3RyeV9wYXItPmJ0X2lzbyA9ICh1OClydHdfYnRfaXNvOwotCXJlZ2lzdHJ5X3Bhci0+YnRfc2NvID0gKHU4KXJ0d19idF9zY287Ci0JcmVnaXN0cnlfcGFyLT5idF9hbXBkdSA9ICh1OClydHdfYnRfYW1wZHU7Ci0jZW5kaWYKLQlyZWdpc3RyeV9wYXItPmJBY2NlcHRBZGRiYVJlcSA9ICh1OClydHdfQWNjZXB0QWRkYmFSZXE7Ci0JcmVnaXN0cnlfcGFyLT5hbnRkaXZfY2ZnID0gKHU4KXJ0d19hbnRkaXZfY2ZnOwotCXJlZ2lzdHJ5X3Bhci0+YW50ZGl2X3R5cGUgPSAodTgpcnR3X2FudGRpdl90eXBlOwotCi0JLyogMDpkaXNhYmxlLCAxOmVuYWJsZSwgMjpieSBFRlVTRSBjb25maWcgKi8KLQlyZWdpc3RyeV9wYXItPmh3cGRuX21vZGUgPSAodTgpcnR3X2h3cGRuX21vZGU7Ci0JLyogMDpkaXNhYmxlLCAxOmVuYWJsZSAqLwotCXJlZ2lzdHJ5X3Bhci0+aHdwd3JwX2RldGVjdCA9ICh1OClydHdfaHdwd3JwX2RldGVjdDsKLQlyZWdpc3RyeV9wYXItPmh3X3dwc19wYmMgPSAodTgpcnR3X2h3X3dwc19wYmM7Ci0JcmVnaXN0cnlfcGFyLT5tYXhfcm9hbWluZ190aW1lcyA9ICh1OClydHdfbWF4X3JvYW1pbmdfdGltZXM7Ci0JcmVnaXN0cnlfcGFyLT5lbmFibGU4MDIxMWQgPSAodTgpcnR3XzgwMjExZDsKLQlzbnByaW50ZihyZWdpc3RyeV9wYXItPmlmbmFtZSwgMTYsICIlcyIsIGlmbmFtZSk7Ci0Jc25wcmludGYocmVnaXN0cnlfcGFyLT5pZjJuYW1lLCAxNiwgIiVzIiwgaWYybmFtZSk7Ci0JcmVnaXN0cnlfcGFyLT5ub3RjaF9maWx0ZXIgPSAodTgpcnR3X25vdGNoX2ZpbHRlcjsKLQlyZWdpc3RyeV9wYXItPnJlZ3VsYXRvcnlfdGlkID0gKHU4KXJ0d19yZWd1bGF0b3J5X2lkOwotfQotCi1zdGF0aWMgaW50IHJ0d19uZXRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2LCB2b2lkICpwKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKLQlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwotCi0JaWYgKCFwYWRhcHRlci0+YnVwKQotCQlldGhlcl9hZGRyX2NvcHkocGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIsIGFkZHItPnNhX2RhdGEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnJ0d19uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlwYWRhcHRlci0+c3RhdHMudHhfcGFja2V0cyA9IHB4bWl0cHJpdi0+dHhfcGt0czsKLQlwYWRhcHRlci0+c3RhdHMucnhfcGFja2V0cyA9IHByZWN2cHJpdi0+cnhfcGt0czsKLQlwYWRhcHRlci0+c3RhdHMudHhfZHJvcHBlZCA9IHB4bWl0cHJpdi0+dHhfZHJvcDsKLQlwYWRhcHRlci0+c3RhdHMucnhfZHJvcHBlZCA9IHByZWN2cHJpdi0+cnhfZHJvcDsKLQlwYWRhcHRlci0+c3RhdHMudHhfYnl0ZXMgPSBweG1pdHByaXYtPnR4X2J5dGVzOwotCXBhZGFwdGVyLT5zdGF0cy5yeF9ieXRlcyA9IHByZWN2cHJpdi0+cnhfYnl0ZXM7Ci0KLQlyZXR1cm4gJnBhZGFwdGVyLT5zdGF0czsKLX0KLQotLyoKLSAqIEFDIHRvIHF1ZXVlIG1hcHBpbmcKLSAqCi0gKiBBQ19WTyAtPiBxdWV1ZSAwCi0gKiBBQ19WSSAtPiBxdWV1ZSAxCi0gKiBBQ19CRSAtPiBxdWV1ZSAyCi0gKiBBQ19CSyAtPiBxdWV1ZSAzCi0gKi8KLXN0YXRpYyBjb25zdCB1MTYgcnR3XzFkX3RvX3F1ZXVlWzhdID0geyAyLCAzLCAzLCAyLCAxLCAxLCAwLCAwIH07Ci0KLS8qIEdpdmVuIGEgZGF0YSBmcmFtZSBkZXRlcm1pbmUgdGhlIDgwMi4xcC8xZCB0YWcgdG8gdXNlLiAqLwotc3RhdGljIHUzMiBydHdfY2xhc3NpZnk4MDIxZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXUzMiBkc2NwOwotCi0JLyogc2tiLT5wcmlvcml0eSB2YWx1ZXMgZnJvbSAyNTYtPjI2MyBhcmUgbWFnaWMgdmFsdWVzIHRvCi0JICogZGlyZWN0bHkgaW5kaWNhdGUgYSBzcGVjaWZpYyA4MDIuMWQgcHJpb3JpdHkuICBUaGlzIGlzIHVzZWQKLQkgKiB0byBhbGxvdyA4MDIuMWQgcHJpb3JpdHkgdG8gYmUgcGFzc2VkIGRpcmVjdGx5IGluIGZyb20gVkxBTgotCSAqIHRhZ3MsIGV0Yy4KLQkgKi8KLQlpZiAoc2tiLT5wcmlvcml0eSA+PSAyNTYgJiYgc2tiLT5wcmlvcml0eSA8PSAyNjMpCi0JCXJldHVybiBza2ItPnByaW9yaXR5IC0gMjU2OwotCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewotCWNhc2UgaHRvbnMoRVRIX1BfSVApOgotCQlkc2NwID0gaXBfaGRyKHNrYiktPnRvcyAmIDB4ZmM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gZHNjcCA+PiA1OwotfQotCi1zdGF0aWMgdTE2IHJ0d19zZWxlY3RfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICB2b2lkICphY2NlbF9wcml2LAotCQkJICAgIHNlbGVjdF9xdWV1ZV9mYWxsYmFja190IGZhbGxiYWNrKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQlza2ItPnByaW9yaXR5ID0gcnR3X2NsYXNzaWZ5ODAyMWQoc2tiKTsKLQotCWlmIChwbWxtZXByaXYtPmFjbV9tYXNrICE9IDApCi0JCXNrYi0+cHJpb3JpdHkgPSBxb3NfYWNtMjNhKHBtbG1lcHJpdi0+YWNtX21hc2ssIHNrYi0+cHJpb3JpdHkpOwotCXJldHVybiBydHdfMWRfdG9fcXVldWVbc2tiLT5wcmlvcml0eV07Ci19Ci0KLXUxNiBydHdfcmVjdl9zZWxlY3RfcXVldWUyM2Eoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXBoZHIgKnBpcGhkcjsKLQlzdHJ1Y3QgZXRoaGRyICpldGggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKLQl1bnNpZ25lZCBpbnQgZHNjcDsKLQl1MTYgZXRoX3R5cGUgPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmV0aC0+aF9wcm90byk7Ci0JdTMyIHByaW9yaXR5OwotCXU4ICpwZGF0YSA9IHNrYi0+ZGF0YTsKLQotCXN3aXRjaCAoZXRoX3R5cGUpIHsKLQljYXNlIEVUSF9QX0lQOgotCQlwaXBoZHIgPSAoc3RydWN0IGlwaGRyICopKHBkYXRhICsgRVRIX0hMRU4pOwotCQlkc2NwID0gcGlwaGRyLT50b3MgJiAweGZjOwotCQlwcmlvcml0eSA9IGRzY3AgPj4gNTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpb3JpdHkgPSAwOwotCX0KLQlyZXR1cm4gcnR3XzFkX3RvX3F1ZXVlW3ByaW9yaXR5XTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBydHdfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4gPSBuZXRkZXZfb3BlbjIzYSwKLQkubmRvX3N0b3AgPSBuZXRkZXZfY2xvc2UsCi0JLm5kb19zdGFydF94bWl0ID0gcnR3X3htaXQyM2FfZW50cnkyM2EsCi0JLm5kb19zZWxlY3RfcXVldWUgPSBydHdfc2VsZWN0X3F1ZXVlLAotCS5uZG9fc2V0X21hY19hZGRyZXNzID0gcnR3X25ldF9zZXRfbWFjX2FkZHJlc3MsCi0JLm5kb19nZXRfc3RhdHMgPSBydHdfbmV0X2dldF9zdGF0cywKLX07Ci0KLWludCBydHdfaW5pdF9uZXRkZXYyM2FfbmFtZTIzYShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiwgY29uc3QgY2hhciAqaWZuYW1lKQotewotCWlmIChkZXZfYWxsb2NfbmFtZShwbmV0ZGV2LCBpZm5hbWUpIDwgMCkgewotCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgImRldl9hbGxvY19uYW1lLCBmYWlsIVxuIik7Ci0JfQotCW5ldGlmX2NhcnJpZXJfb2ZmKHBuZXRkZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldmljZV90eXBlIHdsYW5fdHlwZSA9IHsKLQkubmFtZSA9ICJ3bGFuIiwKLX07Ci0KLXN0cnVjdCBuZXRfZGV2aWNlICpydHdfaW5pdF9uZXRkZXYyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpvbGRfcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldjsKLQotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICIraW5pdF9uZXRfZGV2XG4iKTsKLQotCXBuZXRkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2Yoc3RydWN0IHJ0d19hZGFwdGVyKSwgNCk7Ci0JaWYgKCFwbmV0ZGV2KQotCQlyZXR1cm4gTlVMTDsKLQotCXBuZXRkZXYtPmRldi50eXBlID0gJndsYW5fdHlwZTsKLQlwYWRhcHRlciA9IG5ldGRldl9wcml2KHBuZXRkZXYpOwotCXBhZGFwdGVyLT5wbmV0ZGV2ID0gcG5ldGRldjsKLQotCURCR184NzIzQSgicmVnaXN0ZXIgcnR3X25ldGRldl9vcHMgdG8gbmV0ZGV2X29wc1xuIik7Ci0JcG5ldGRldi0+bmV0ZGV2X29wcyA9ICZydHdfbmV0ZGV2X29wczsKLQotCXBuZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gSFoqMzsgLyogMyBzZWNvbmQgdGltZW91dCAqLwotCi0JbG9hZHBhcmFtKHBhZGFwdGVyLCBwbmV0ZGV2KTsKLQlyZXR1cm4gcG5ldGRldjsKLX0KLQotc3RhdGljIGludCBydHdfaW5pdF9kZWZhdWx0X3ZhbHVlKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQotCS8qIHhtaXRfcHJpdiAqLwotCXB4bWl0cHJpdi0+dmNzID0gcHJlZ2lzdHJ5cHJpdi0+dmNzX3R5cGU7Ci0JLyogcHhtaXRwcml2LT5ydHNfdGhyZXNoID0gcHJlZ2lzdHJ5cHJpdi0+cnRzX3RocmVzaDsgKi8KLQlweG1pdHByaXYtPmZyYWdfbGVuID0gcHJlZ2lzdHJ5cHJpdi0+ZnJhZ190aHJlc2g7Ci0KLQkvKiBtbG1lX3ByaXYgKi8KLQlwbWxtZXByaXYtPnNjYW5faW50ZXJ2YWwgPSBTQ0FOX0lOVEVSVkFMOy8qICAzMCoyIHNlYyA9IDYwc2VjICovCi0JcG1sbWVwcml2LT5zY2FuX21vZGUgPSBTQ0FOX0FDVElWRTsKLQotCS8qIGh0X3ByaXYgKi8KLQlwbWxtZXByaXYtPmh0cHJpdi5hbXBkdV9lbmFibGUgPSBmYWxzZTsvKiBzZXQgdG8gZGlzYWJsZWQgKi8KLQotCS8qIHNlY3VyaXR5X3ByaXYgKi8KLQlwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSA9IDA7Ci0KLQkgLyogb3BlbiBzeXN0ZW0gKi8KLQlwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtID0gZG90MTFBdXRoQWxncnRobV9PcGVuOwotCXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0gPSAwOwotCi0JcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5S2V5SW5kZXggPSAwOwotCi0JcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3kgPSAwOwotCXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlpZCA9IDE7Ci0KLQlwc2VjdXJpdHlwcml2LT5uZGlzYXV0aHR5cGUgPSBOZGlzODAyXzExQXV0aE1vZGVPcGVuOwotCXBzZWN1cml0eXByaXYtPm5kaXNlbmNyeXB0c3RhdHVzID0gTmRpczgwMl8xMVdFUERpc2FibGVkOwotCi0JLyogcmVnaXN0cnlfcHJpdiAqLwotCXJ0d19pbml0X3JlZ2lzdHJ5cHJpdl9kZXZfbmV0d29yazIzYShwYWRhcHRlcik7Ci0JcnR3X3VwZGF0ZV9yZWdpc3RyeXByaXZfZGV2X25ldHdvcmsyM2EocGFkYXB0ZXIpOwotCi0JLyogaGFsX3ByaXYgKi8KLQlydGw4NzIzYV9pbml0X2RlZmF1bHRfdmFsdWUocGFkYXB0ZXIpOwotCi0JLyogbWlzYy4gKi8KLQlwYWRhcHRlci0+YlJlYWRQb3J0Q2FuY2VsID0gZmFsc2U7Ci0JcGFkYXB0ZXItPmJXcml0ZVBvcnRDYW5jZWwgPSBmYWxzZTsKLQlyZXR1cm4gX1NVQ0NFU1M7Ci19Ci0KLWludCBydHdfcmVzZXRfZHJ2X3N3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0KLQkvKiBoYWxfcHJpdiAqLwotCXJ0bDg3MjNhX2luaXRfZGVmYXVsdF92YWx1ZShwYWRhcHRlcik7Ci0JcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCA9IGZhbHNlOwotCXBhZGFwdGVyLT5iV3JpdGVQb3J0Q2FuY2VsID0gZmFsc2U7Ci0JcG1sbWVwcml2LT5zY2FuX2ludGVydmFsID0gU0NBTl9JTlRFUlZBTDsvKiAgMzAqMiBzZWMgPSA2MHNlYyAqLwotCi0JcGFkYXB0ZXItPnhtaXRwcml2LnR4X3BrdHMgPSAwOwotCXBhZGFwdGVyLT5yZWN2cHJpdi5yeF9wa3RzID0gMDsKLQotCXBtbG1lcHJpdi0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID0gZmFsc2U7Ci0KLQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSB8IF9GV19VTkRFUl9MSU5LSU5HKTsKLQotCXJ0d19zcmVzZXRfcmVzZXRfdmFsdWUocGFkYXB0ZXIpOwotCXB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfY250cyA9IDA7Ci0KLQkvKiBtbG1lZXh0cHJpdiAqLwotCXBhZGFwdGVyLT5tbG1lZXh0cHJpdi5zaXRlc3VydmV5X3Jlcy5zdGF0ZSA9IFNDQU5fRElTQUJMRTsKLQotCXJ0d19zZXRfc2lnbmFsX3N0YXRfdGltZXIoJnBhZGFwdGVyLT5yZWN2cHJpdik7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1pbnQgcnR3X2luaXRfZHJ2X3N3MjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIpCi17Ci0JaW50IHJldDggPSBfU1VDQ0VTUzsKLQotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICIrcnR3X2luaXRfZHJ2X3N3MjNhXG4iKTsKLQotCWlmIChydHdfaW5pdF9jbWRfcHJpdjIzYSgmcGFkYXB0ZXItPmNtZHByaXYpID09IF9GQUlMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAiQ2FuJ3QgaW5pdCBjbWRfcHJpdlxuIik7Ci0JCXJldDggPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCXBhZGFwdGVyLT5jbWRwcml2LnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0KLQlpZiAocnR3X2luaXRfZXZ0X3ByaXYyM2EoJnBhZGFwdGVyLT5ldnRwcml2KSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkNhbid0IGluaXQgZXZ0X3ByaXZcbiIpOwotCQlyZXQ4ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAocnR3X2luaXRfbWxtZV9wcml2MjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkNhbid0IGluaXQgbWxtZV9wcml2XG4iKTsKLQkJcmV0OCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0KLQlpZiAoaW5pdF9tbG1lX2V4dF9wcml2MjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkNhbid0IGluaXQgbWxtZV9leHRfcHJpdlxuIik7Ci0JCXJldDggPSBfRkFJTDsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChfcnR3X2luaXRfeG1pdF9wcml2MjNhKCZwYWRhcHRlci0+eG1pdHByaXYsIHBhZGFwdGVyKSA9PSBfRkFJTCkgewotCQlEQkdfODcyM0EoIkNhbid0IF9ydHdfaW5pdF94bWl0X3ByaXYyM2FcbiIpOwotCQlyZXQ4ID0gX0ZBSUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoX3J0d19pbml0X3JlY3ZfcHJpdjIzYSgmcGFkYXB0ZXItPnJlY3Zwcml2LCBwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJREJHXzg3MjNBKCJDYW4ndCBfcnR3X2luaXRfcmVjdl9wcml2MjNhXG4iKTsKLQkJcmV0OCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKF9ydHdfaW5pdF9zdGFfcHJpdjIzYSgmcGFkYXB0ZXItPnN0YXByaXYpID09IF9GQUlMKSB7Ci0JCURCR184NzIzQSgiQ2FuJ3QgX3J0d19pbml0X3N0YV9wcml2MjNhXG4iKTsKLQkJcmV0OCA9IF9GQUlMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcGFkYXB0ZXItPnN0YXByaXYucGFkYXB0ZXIgPSBwYWRhcHRlcjsKLQlwYWRhcHRlci0+c2V0YmFuZCA9IEdIWjI0XzUwOwotCXJ0d19pbml0X2JjbWNfc3RhaW5mbzIzYShwYWRhcHRlcik7Ci0KLQlydHdfaW5pdF9wd3JjdHJsX3ByaXYyM2EocGFkYXB0ZXIpOwotCi0JcmV0OCA9IHJ0d19pbml0X2RlZmF1bHRfdmFsdWUocGFkYXB0ZXIpOwotCi0JcnRsODcyM2FfaW5pdF9kbV9wcml2KHBhZGFwdGVyKTsKLQotCXJ0d19zcmVzZXRfaW5pdChwYWRhcHRlcik7Ci0KLWV4aXQ6Ci0KLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiLXJ0d19pbml0X2Rydl9zdzIzYVxuIik7Ci0JcmV0dXJuIHJldDg7Ci19Ci0KLXZvaWQgcnR3X2NhbmNlbF9hbGxfdGltZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLAotCQkgIitydHdfY2FuY2VsX2FsbF90aW1lcjIzYVxuIik7Ci0KLQlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPm1sbWVwcml2LmFzc29jX3RpbWVyKTsKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOmNhbmNlbCBhc3NvY2lhdGlvbiB0aW1lciBjb21wbGV0ZSFcbiIsIF9fZnVuY19fKTsKLQotCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+bWxtZXByaXYuc2Nhbl90b190aW1lcik7Ci0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywKLQkJICIlczpjYW5jZWwgc2Nhbl90b190aW1lciFcbiIsIF9fZnVuY19fKTsKLQotCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIpOwotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sCi0JCSAiJXM6Y2FuY2VsIGR5bmFtaWNfY2hrX3RpbWVyIVxuIiwgX19mdW5jX18pOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5wd3JjdHJscHJpdi5wd3Jfc3RhdGVfY2hlY2tfdGltZXIpOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5tbG1lcHJpdi5zZXRfc2Nhbl9kZW55X3RpbWVyKTsKLQlydHdfY2xlYXJfc2Nhbl9kZW55KHBhZGFwdGVyKTsKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLAotCQkgIiVzOmNhbmNlbCBzZXRfc2Nhbl9kZW55X3RpbWVyIVxuIiwgX19mdW5jX18pOwotCi0JZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5yZWN2cHJpdi5zaWduYWxfc3RhdF90aW1lcik7Ci19Ci0KLWludCBydHdfZnJlZV9kcnZfc3cyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiPT0+cnR3X2ZyZWVfZHJ2X3N3MjNhXG4iKTsKLQotCWZyZWVfbWxtZV9leHRfcHJpdjIzYSgmcGFkYXB0ZXItPm1sbWVleHRwcml2KTsKLQotCXJ0d19mcmVlX2V2dF9wcml2MjNhKCZwYWRhcHRlci0+ZXZ0cHJpdik7Ci0KLQlydHdfZnJlZV9tbG1lX3ByaXYyM2EoJnBhZGFwdGVyLT5tbG1lcHJpdik7Ci0KLQlfcnR3X2ZyZWVfeG1pdF9wcml2MjNhKCZwYWRhcHRlci0+eG1pdHByaXYpOwotCi0JLyogd2lsbCBmcmVlIGJjbWNfc3RhaW5mbyBoZXJlICovCi0JX3J0d19mcmVlX3N0YV9wcml2MjNhKCZwYWRhcHRlci0+c3RhcHJpdik7Ci0KLQlfcnR3X2ZyZWVfcmVjdl9wcml2MjNhKCZwYWRhcHRlci0+cmVjdnByaXYpOwotCi0JcnR3X2ZyZWVfcHdyY3RybF9wcml2KHBhZGFwdGVyKTsKLQotCWtmcmVlKHBhZGFwdGVyLT5IYWxEYXRhKTsKLQlwYWRhcHRlci0+SGFsRGF0YSA9IE5VTEw7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiLXJ0d19mcmVlX2Rydl9zdzIzYVxuIik7Ci0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IF9ydHdfZHJ2X3JlZ2lzdGVyX25ldGRldihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7Ci0JaW50IHJldCA9IF9TVUNDRVNTOwotCi0JLyogYWxsb2MgbmV0ZGV2IG5hbWUgKi8KLQlydHdfaW5pdF9uZXRkZXYyM2FfbmFtZTIzYShwbmV0ZGV2LCBuYW1lKTsKLQotCWV0aGVyX2FkZHJfY29weShwbmV0ZGV2LT5kZXZfYWRkciwgcGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIpOwotCi0JLyogVGVsbCB0aGUgbmV0d29yayBzdGFjayB3ZSBleGlzdCAqLwotCWlmIChyZWdpc3Rlcl9uZXRkZXYocG5ldGRldikpIHsKLQkJREJHXzg3MjNBKCIlcyglcyk6IEZhaWxlZCFcbiIsIF9fZnVuY19fLCBwbmV0ZGV2LT5uYW1lKTsKLQkJcmV0ID0gX0ZBSUw7Ci0JCWdvdG8gZXJyb3JfcmVnaXN0ZXJfbmV0ZGV2OwotCX0KLQlEQkdfODcyM0EoIiVzLCBNQUMgQWRkcmVzcyAoaWYlZCkgPSAlcE1cbiIsCi0JCSAgX19mdW5jX18sIHBhZGFwdGVyLT5pZmFjZV9pZCArIDEsIHBuZXRkZXYtPmRldl9hZGRyKTsKLQlyZXR1cm4gcmV0OwotCi1lcnJvcl9yZWdpc3Rlcl9uZXRkZXY6Ci0KLQlpZiAocGFkYXB0ZXItPmlmYWNlX2lkID4gSUZBQ0VfSUQwKSB7Ci0JCXJ0d19mcmVlX2Rydl9zdzIzYShwYWRhcHRlcik7Ci0KLQkJZnJlZV9uZXRkZXYocG5ldGRldik7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBydHdfZHJ2X3JlZ2lzdGVyX25ldGRldihzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmlmMSkKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmogPSBpZjEtPmR2b2JqOwotCWludCBpLCBzdGF0dXMgPSBfU1VDQ0VTUzsKLQotCWlmIChkdm9iai0+aWZhY2VfbnVtcyA+PSBJRkFDRV9JRF9NQVgpIHsKLQkJc3RhdHVzID0gX0ZBSUw7IC8qIC1FSU5WQUwgKi8KLQkJZ290byBleGl0OwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBkdm9iai0+aWZhY2VfbnVtczsgaSsrKSB7Ci0JCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBkdm9iai0+cGFkYXB0ZXJzW2ldOwotCi0JCWlmIChwYWRhcHRlcikgewotCQkJY2hhciAqbmFtZTsKLQotCQkJaWYgKHBhZGFwdGVyLT5pZmFjZV9pZCA9PSBJRkFDRV9JRDApCi0JCQkJbmFtZSA9IGlmMS0+cmVnaXN0cnlwcml2LmlmbmFtZTsKLQkJCWVsc2UgaWYgKHBhZGFwdGVyLT5pZmFjZV9pZCA9PSBJRkFDRV9JRDEpCi0JCQkJbmFtZSA9IGlmMS0+cmVnaXN0cnlwcml2LmlmMm5hbWU7Ci0JCQllbHNlCi0JCQkJbmFtZSA9ICJ3bGFuJWQiOwotCQkJc3RhdHVzID0gX3J0d19kcnZfcmVnaXN0ZXJfbmV0ZGV2KHBhZGFwdGVyLCBuYW1lKTsKLQkJCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLWV4aXQ6Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotaW50IG5ldGRldl9vcGVuMjNhKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3JjdHJscHJpdjsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgc3RhdHVzOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIis4NzF4X2RydiAtIGRldl9vcGVuXG4iKTsKLQlEQkdfODcyM0EoIis4NzF4X2RydiAtIGRydl9vcGVuLCBidXAgPSVkXG4iLCBwYWRhcHRlci0+YnVwKTsKLQotCW11dGV4X2xvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5od19pbml0X211dGV4KTsKLQotCXB3cmN0cmxwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCWlmICghcGFkYXB0ZXItPmJ1cCkgewotCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSBmYWxzZTsKLQkJcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPSBmYWxzZTsKLQkJcGFkYXB0ZXItPmJDYXJkRGlzYWJsZVdPSFNNID0gZmFsc2U7Ci0KLQkJc3RhdHVzID0gcnRsODcyM2F1X2hhbF9pbml0KHBhZGFwdGVyKTsKLQkJaWYgKHN0YXR1cyA9PSBfRkFJTCkgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJCSAicnRsODcxeF9oYWxfaW5pdCgpOiBDYW4ndCBpbml0IGgvdyFcbiIpOwotCQkJZ290byBuZXRkZXZfb3BlbjIzYV9lcnJvcjsKLQkJfQotCi0JCURCR184NzIzQSgiTUFDIEFkZHJlc3MgPSAlcE1cbiIsIHBuZXRkZXYtPmRldl9hZGRyKTsKLQotCQlpZiAoaW5pdF9od19tbG1lX2V4dDIzYShwYWRhcHRlcikgPT0gX0ZBSUwpIHsKLQkJCURCR184NzIzQSgiY2FuJ3QgaW5pdCBtbG1lX2V4dF9wcml2XG4iKTsKLQkJCWdvdG8gbmV0ZGV2X29wZW4yM2FfZXJyb3I7Ci0JCX0KLQotCQlydGw4NzIzYXVfaW5pcnBfaW5pdChwYWRhcHRlcik7Ci0KLQkJcnR3X2NmZzgwMjExX2luaXRfd2lwaHkocGFkYXB0ZXIpOwotCi0JCXBhZGFwdGVyLT5idXAgPSB0cnVlOwotCX0KLQlwYWRhcHRlci0+bmV0X2Nsb3NlZCA9IGZhbHNlOwotCi0JbW9kX3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsCi0JCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOwotCi0JcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJpcHNfcHJvY2Vzc2luZyA9IGZhbHNlOwotCXJ0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKCZwYWRhcHRlci0+cHdyY3RybHByaXYpOwotCi0JLyogbmV0aWZfY2Fycmllcl9vbihwbmV0ZGV2KTtjYWxsIHRoaXMgZnVuYyB3aGVuCi0JICAgcnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgcmV0dXJuIHN1Y2Nlc3MgKi8KLQlpZiAoIXJ0d19uZXRpZl9xdWV1ZV9zdG9wcGVkKHBuZXRkZXYpKQotCQluZXRpZl90eF9zdGFydF9hbGxfcXVldWVzKHBuZXRkZXYpOwotCWVsc2UKLQkJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKHBuZXRkZXYpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIi04NzF4X2RydiAtIGRldl9vcGVuXG4iKTsKLQlEQkdfODcyM0EoIi04NzF4X2RydiAtIGRydl9vcGVuLCBidXAgPSVkXG4iLCBwYWRhcHRlci0+YnVwKTsKLWV4aXQ6Ci0JbXV0ZXhfdW5sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+aHdfaW5pdF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLQotbmV0ZGV2X29wZW4yM2FfZXJyb3I6Ci0JcGFkYXB0ZXItPmJ1cCA9IGZhbHNlOwotCi0JbmV0aWZfY2Fycmllcl9vZmYocG5ldGRldik7Ci0JbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKHBuZXRkZXYpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkgIi04NzF4X2RydiAtIGRldl9vcGVuLCBmYWlsIVxuIik7Ci0JREJHXzg3MjNBKCItODcxeF9kcnYgLSBkcnZfb3BlbiBmYWlsLCBidXAgPSVkXG4iLCBwYWRhcHRlci0+YnVwKTsKLQotCXJldCA9IC0xOwotCWdvdG8gZXhpdDsKLX0KLQotc3RhdGljIGludCBpcHNfbmV0ZHJ2X29wZW4oc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlpbnQgc3RhdHVzID0gX1NVQ0NFU1M7Ci0KLQlwYWRhcHRlci0+bmV0X2Nsb3NlZCA9IGZhbHNlOwotCURCR184NzIzQSgiPT09PiAlcy4uLi4uLi4uLlxuIiwgX19mdW5jX18pOwotCi0JcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID0gZmFsc2U7Ci0JcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPSBmYWxzZTsKLQlwYWRhcHRlci0+YkNhcmREaXNhYmxlV09IU00gPSBmYWxzZTsKLQotCXN0YXR1cyA9IHJ0bDg3MjNhdV9oYWxfaW5pdChwYWRhcHRlcik7Ci0JaWYgKHN0YXR1cyA9PSBfRkFJTCkgewotCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgImlwc19uZXRkcnZfb3BlbigpOiBDYW4ndCBpbml0IGgvdyFcbiIpOwotCQlnb3RvIG5ldGRldl9vcGVuMjNhX2Vycm9yOwotCX0KLQotCXJ0bDg3MjNhdV9pbmlycF9pbml0KHBhZGFwdGVyKTsKLQotCXJ0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKCZwYWRhcHRlci0+cHdyY3RybHByaXYpOwotCW1vZF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LmR5bmFtaWNfY2hrX3RpbWVyLAotCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMDApKTsKLQotCXJldHVybiBfU1VDQ0VTUzsKLQotbmV0ZGV2X29wZW4yM2FfZXJyb3I6Ci0JLyogcGFkYXB0ZXItPmJ1cCA9IGZhbHNlOyAqLwotCURCR184NzIzQSgiLWlwc19uZXRkcnZfb3BlbiAtIGRydl9vcGVuIGZhaWx1cmUsIGJ1cCA9JWRcbiIsCi0JCSAgcGFkYXB0ZXItPmJ1cCk7Ci0KLQlyZXR1cm4gX0ZBSUw7Ci19Ci0KLWludCBydHdfaXBzX3B3cl91cDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCWludCByZXN1bHQ7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gamlmZmllczsKLQotCURCR184NzIzQSgiPT09PiAgcnR3X2lwc19wd3JfdXAyM2EuLi4uLi4uLi4uLi4uLlxuIik7Ci0JcnR3X3Jlc2V0X2Rydl9zdzIzYShwYWRhcHRlcik7Ci0KLQlyZXN1bHQgPSBpcHNfbmV0ZHJ2X29wZW4ocGFkYXB0ZXIpOwotCi0JREJHXzg3MjNBKCI8PT09ICBydHdfaXBzX3B3cl91cDIzYS4uLi4uLi4uLi4uLi4uIGluICVkbXNcbiIsCi0JCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnRfdGltZSkpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgcnR3X2lwc19wd3JfZG93bjIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSA9IGppZmZpZXM7Ci0KLQlEQkdfODcyM0EoIj09PT4gcnR3X2lwc19wd3JfZG93bjIzYS4uLi4uLi4uLi4uLi4uLi4uLi5cbiIpOwotCi0JcGFkYXB0ZXItPmJDYXJkRGlzYWJsZVdPSFNNID0gdHJ1ZTsKLQlwYWRhcHRlci0+bmV0X2Nsb3NlZCA9IHRydWU7Ci0KLQlydHdfaXBzX2Rldl91bmxvYWQyM2EocGFkYXB0ZXIpOwotCXBhZGFwdGVyLT5iQ2FyZERpc2FibGVXT0hTTSA9IGZhbHNlOwotCURCR184NzIzQSgiPD09PSBydHdfaXBzX3B3cl9kb3duMjNhLi4uLi4uLi4uLi4uLi4uLi4uLi4uIGluICVkbXNcbiIsCi0JCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnRfdGltZSkpOwotfQotCi12b2lkIHJ0d19pcHNfZGV2X3VubG9hZDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXJ0bDg3MjNhX2ZpZm9fY2xlYW51cChwYWRhcHRlcik7Ci0KLQlydGw4NzIzYV91c2JfaW50Zl9zdG9wKHBhZGFwdGVyKTsKLQotCS8qIHM1LiAqLwotCWlmICghcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCi0JCXJ0bDg3MjNhdV9oYWxfZGVpbml0KHBhZGFwdGVyKTsKLX0KLQotaW50IHBtX25ldGRldl9vcGVuMjNhKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2LCB1OCBibm9ybWFsKQotewotCWludCBzdGF0dXM7Ci0KLQlpZiAoYm5vcm1hbCkKLQkJc3RhdHVzID0gbmV0ZGV2X29wZW4yM2EocG5ldGRldik7Ci0JZWxzZQotCQlzdGF0dXMgPSAoX1NVQ0NFU1MgPT0gaXBzX25ldGRydl9vcGVuKG5ldGRldl9wcml2KHBuZXRkZXYpKSkgPwotCQkJICgwKSA6ICgtMSk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IG5ldGRldl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldikKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiKzg3MXhfZHJ2IC0gZHJ2X2Nsb3NlXG4iKTsKLQotCXBhZGFwdGVyLT5uZXRfY2xvc2VkID0gdHJ1ZTsKLQotCWlmIChwYWRhcHRlci0+cHdyY3RybHByaXYucmZfcHdyc3RhdGUgPT0gcmZfb24pIHsKLQkJREJHXzg3MjNBKCIoMik4NzF4X2RydiAtIGRydl9jbG9zZSwgYnVwID0lZCwgIgotCQkJICAiaHdfaW5pdF9jb21wbGV0ZWQgPSVkXG4iLCBwYWRhcHRlci0+YnVwLAotCQkJICBwYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQpOwotCi0JCS8qIHMxLiAqLwotCQlpZiAocG5ldGRldikgewotCQkJaWYgKCFydHdfbmV0aWZfcXVldWVfc3RvcHBlZChwbmV0ZGV2KSkKLQkJCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocG5ldGRldik7Ci0JCX0KLQotCQkvKiBzMi4gKi8KLQkJTGVhdmVBbGxQb3dlclNhdmVNb2RlMjNhKHBhZGFwdGVyKTsKLQkJcnR3X2Rpc2Fzc29jX2NtZDIzYShwYWRhcHRlciwgNTAwLCBmYWxzZSk7Ci0JCS8qIHMyLTIuICBpbmRpY2F0ZSBkaXNjb25uZWN0IHRvIG9zICovCi0JCXJ0d19pbmRpY2F0ZV9kaXNjb25uZWN0MjNhKHBhZGFwdGVyKTsKLQkJLyogczItMy4gKi8KLQkJcnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhKHBhZGFwdGVyLCAxKTsKLQkJLyogczItNC4gKi8KLQkJcnR3X2ZyZWVfbmV0d29ya19xdWV1ZTIzYShwYWRhcHRlcik7Ci0JfQotCi0JcnR3X3NjYW5fYWJvcnQyM2EocGFkYXB0ZXIpOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIi04NzF4X2RydiAtIGRydl9jbG9zZVxuIik7Ci0JREJHXzg3MjNBKCItODcxeF9kcnYgLSBkcnZfY2xvc2UsIGJ1cCA9JWRcbiIsIHBhZGFwdGVyLT5idXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcnR3X25kZXZfZGVzdHJ1Y3RvcihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKLXsKLQlEQkdfODcyM0EoIiVzKCVzKVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUpOwotCWtmcmVlKG5kZXYtPmllZWU4MDIxMV9wdHIpOwotCWZyZWVfbmV0ZGV2KG5kZXYpOwotfQotCi12b2lkIF9ydHdfaW5pdF9xdWV1ZTIzYShzdHJ1Y3QgcnR3X3F1ZXVlICpwcXVldWUpCi17Ci0JSU5JVF9MSVNUX0hFQUQoJnBxdWV1ZS0+cXVldWUpOwotCXNwaW5fbG9ja19pbml0KCZwcXVldWUtPmxvY2spOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvcmVjdl9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvcmVjdl9saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRiNTA2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3JlY3ZfbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDExIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1JFQ1ZfT1NERVBfQ18KLQotI2luY2x1ZGUgPG9zZGVwX3NlcnZpY2UuaD4KLSNpbmNsdWRlIDxkcnZfdHlwZXMuaD4KLQotI2luY2x1ZGUgPHdpZmkuaD4KLSNpbmNsdWRlIDxyZWN2X29zZGVwLmg+Ci0KLSNpbmNsdWRlIDxvc2RlcF9pbnRmLmg+Ci0KLSNpbmNsdWRlIDx1c2Jfb3BzLmg+Ci0KLXZvaWQgcnR3X2hhbmRsZV90a2lwX21pY19lcnIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTggYmdyb3VwKQotewotCWVudW0gbmw4MDIxMV9rZXlfdHlwZSBrZXlfdHlwZSA9IDA7Ci0JdW5pb24gaXdyZXFfZGF0YSB3cnF1OwotCXN0cnVjdCBpd19taWNoYWVsbWljZmFpbHVyZSBldjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwotCXVuc2lnbmVkIGxvbmcgY3VyX3RpbWU7Ci0KLQlpZiAocHNlY3VyaXR5cHJpdi0+bGFzdF9taWNfZXJyX3RpbWUgPT0gMCkgewotCQlwc2VjdXJpdHlwcml2LT5sYXN0X21pY19lcnJfdGltZSA9IGppZmZpZXM7Ci0JfSBlbHNlIHsKLQkJY3VyX3RpbWUgPSBqaWZmaWVzOwotCi0JCWlmIChjdXJfdGltZSAtIHBzZWN1cml0eXByaXYtPmxhc3RfbWljX2Vycl90aW1lIDwgNjAqSFopIHsKLQkJCXBzZWN1cml0eXByaXYtPmJ0a2lwX2NvdW50ZXJtZWFzdXJlID0gdHJ1ZTsKLQkJCXBzZWN1cml0eXByaXYtPmxhc3RfbWljX2Vycl90aW1lID0gMDsKLQkJCXBzZWN1cml0eXByaXYtPmJ0a2lwX2NvdW50ZXJtZWFzdXJlX3RpbWUgPSBjdXJfdGltZTsKLQkJfSBlbHNlIHsKLQkJCXBzZWN1cml0eXByaXYtPmxhc3RfbWljX2Vycl90aW1lID0gamlmZmllczsKLQkJfQotCX0KLQotCWlmIChiZ3JvdXApCi0JCWtleV90eXBlIHw9IE5MODAyMTFfS0VZVFlQRV9HUk9VUDsKLQllbHNlCi0JCWtleV90eXBlIHw9IE5MODAyMTFfS0VZVFlQRV9QQUlSV0lTRTsKLQotCWNmZzgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUocGFkYXB0ZXItPnBuZXRkZXYsCi0JCQkJICAgICAodTggKikmcG1sbWVwcml2LT5hc3NvY19ic3NpZFswXSwKLQkJCQkgICAgIGtleV90eXBlLCAtMSwgTlVMTCwgR0ZQX0FUT01JQyk7Ci0KLQltZW1zZXQoJmV2LCAweDAwLCBzaXplb2YoZXYpKTsKLQlpZiAoYmdyb3VwKQotCQlldi5mbGFncyB8PSBJV19NSUNGQUlMVVJFX0dST1VQOwotCWVsc2UKLQkJZXYuZmxhZ3MgfD0gSVdfTUlDRkFJTFVSRV9QQUlSV0lTRTsKLQotCWV2LnNyY19hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQlldGhlcl9hZGRyX2NvcHkoZXYuc3JjX2FkZHIuc2FfZGF0YSwgJnBtbG1lcHJpdi0+YXNzb2NfYnNzaWRbMF0pOwotCi0JbWVtc2V0KCZ3cnF1LCAweDAwLCBzaXplb2Yod3JxdSkpOwotCXdycXUuZGF0YS5sZW5ndGggPSBzaXplb2YoZXYpOwotfQotCi1pbnQgcnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZfZnJhbWUpCi17Ci0Jc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2OwotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQotCXByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7Ci0KLQlza2IgPSBwcmVjdl9mcmFtZS0+cGt0OwotCWlmICghc2tiKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9lcnJfLAotCQkJICJydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYSgpOnNrYiA9PSBOVUxMISEhIVxuIik7Ci0JCWdvdG8gX3JlY3ZfaW5kaWNhdGVwa3RfZHJvcDsKLQl9Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCi0JCSAicnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EoKTpza2IgIT0gTlVMTCAhISFcbiIpOwotCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9pbmZvXywKLQkJICJydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYSgpOnByZWN2X2ZyYW1lLT5oZHIucnhfZGF0YSA9JXBcbiIsCi0JCSBwcmVjdl9mcmFtZS0+cGt0LT5kYXRhKTsKLQlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCi0JCSAic2tiLT5oZWFkID0lcCBza2ItPmRhdGEgPSVwIHNrYi0+dGFpbCA9JXAgc2tiLT5lbmQgPSVwIHNrYi0+bGVuID0lZFxuIiwKLQkJIHNrYi0+aGVhZCwgc2tiLT5kYXRhLAotCQkgc2tiX3RhaWxfcG9pbnRlcihza2IpLCBza2JfZW5kX3BvaW50ZXIoc2tiKSwgc2tiLT5sZW4pOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSA9PSB0cnVlKSB7Ci0JCXN0cnVjdCBza19idWZmICpwc2tiMiA9IE5VTEw7Ci0JCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7Ci0JCXN0cnVjdCBzdGFfcHJpdiAqcHN0YXByaXYgPSAmcGFkYXB0ZXItPnN0YXByaXY7Ci0JCXN0cnVjdCByeF9wa3RfYXR0cmliICpwYXR0cmliID0gJnByZWN2X2ZyYW1lLT5hdHRyaWI7Ci0JCWludCBibWNhc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5kc3QpOwotCi0JCS8qIERCR184NzIzQSgiYm1jYXN0ID0lZFxuIiwgYm1jYXN0KTsgKi8KLQotCQlpZiAoIWV0aGVyX2FkZHJfZXF1YWwocGF0dHJpYi0+ZHN0LAotCQkJCSAgICAgIG15aWQoJnBhZGFwdGVyLT5lZXByb21wcml2KSkpIHsKLQkJCS8qIERCR184NzIzQSgibm90IGFwIHBzdGEgPSVwLCBhZGRyID0lcE1cbiIsIHBzdGEsIHBhdHRyaWItPmRzdCk7ICovCi0JCQlpZiAoYm1jYXN0KSB7Ci0JCQkJcHN0YSA9IHJ0d19nZXRfYmNtY19zdGFpbmZvMjNhKHBhZGFwdGVyKTsKLQkJCQlwc2tiMiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwotCQkJfSBlbHNlIHsKLQkJCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBwYXR0cmliLT5kc3QpOwotCQkJfQotCi0JCQlpZiAocHN0YSkgewotCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gcGFkYXB0ZXItPnBuZXRkZXY7Ci0KLQkJCQkvKiBEQkdfODcyM0EoImRpcmVjdGx5IGZvcndhcmRpbmcgdG8gdGhlIHJ0d194bWl0MjNhX2VudHJ5MjNhXG4iKTsgKi8KLQotCQkJCS8qIHNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsgKi8KLQkJCQlza2ItPmRldiA9IHBuZXRkZXY7Ci0JCQkJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgcnR3X3JlY3Zfc2VsZWN0X3F1ZXVlMjNhKHNrYikpOwotCi0JCQkJcnR3X3htaXQyM2FfZW50cnkyM2Eoc2tiLCBwbmV0ZGV2KTsKLQotCQkJCWlmIChibWNhc3QpCi0JCQkJCXNrYiA9IHBza2IyOwotCQkJCWVsc2UKLQkJCQkJZ290byBfcmVjdl9pbmRpY2F0ZXBrdF9lbmQ7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8qICB0byBBUHNlbGYgKi8KLQkJCS8qIERCR184NzIzQSgidG8gQVBTZWxmXG4iKTsgKi8KLQkJfQotCX0KLQotCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQlza2ItPmRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHBhZGFwdGVyLT5wbmV0ZGV2KTsKLQotCW5ldGlmX3J4KHNrYik7Ci0KLV9yZWN2X2luZGljYXRlcGt0X2VuZDoKLQotCXByZWN2X2ZyYW1lLT5wa3QgPSBOVUxMOyAvKiAgcG9pbnRlcnMgdG8gTlVMTCBiZWZvcmUgcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKCkgKi8KLQotCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdl9mcmFtZSk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfaW5mb18sCi0JCSAicnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EgOmFmdGVyIG5ldGlmX3J4ISEhIVxuIik7Ci0JcmV0dXJuIF9TVUNDRVNTOwotCi1fcmVjdl9pbmRpY2F0ZXBrdF9kcm9wOgotCi0JIHJ0d19mcmVlX3JlY3ZmcmFtZTIzYShwcmVjdl9mcmFtZSk7Ci0JIHJldHVybiBfRkFJTDsKLX0KLQotdm9pZCBydHdfaW5pdF9yZWN2X3RpbWVyMjNhKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCkKLXsKLQlzZXR1cF90aW1lcigmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyLAotCQkgICAgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIyM2EsCi0JCSAgICAodW5zaWduZWQgbG9uZylwcmVvcmRlcl9jdHJsKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9pbnRmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC91c2JfaW50Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjgzZWZmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9pbnRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9IQ0lfSU5URl9DXwotCi0jaW5jbHVkZSA8b3NkZXBfc2VydmljZS5oPgotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHJlY3Zfb3NkZXAuaD4KLSNpbmNsdWRlIDx4bWl0X29zZGVwLmg+Ci0jaW5jbHVkZSA8aGFsX2ludGYuaD4KLSNpbmNsdWRlIDxydHdfdmVyc2lvbi5oPgotI2luY2x1ZGUgPG9zZGVwX2ludGYuaD4KLSNpbmNsdWRlIDx1c2Jfb3BzLmg+Ci0jaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+Ci0KLXN0YXRpYyBpbnQgcnR3X3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKTsKLXN0YXRpYyBpbnQgcnR3X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7Ci1zdGF0aWMgaW50IHJ0d19kcnZfaW5pdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRmLAotCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKnBkaWQpOwotc3RhdGljIHZvaWQgcnR3X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50Zik7Ci0KLSNkZWZpbmUgVVNCX1ZFTkRFUl9JRF9SRUFMVEVLCQkweDBCREEKLQotI2RlZmluZSBSVEw4NzIzQV9VU0JfSURTIFwKLQl7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDg3MjQsCVwKLQkgMHhmZiwgMHhmZiwgMHhmZil9LCAvKiA4NzIzQVUgMSoxICovIFwKLQl7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDE3MjQsCVwKLQkgMHhmZiwgMHhmZiwgMHhmZil9LCAvKiA4NzIzQVUgMSoxICovIFwKLQl7VVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDA3MjQsCVwKLQkgMHhmZiwgMHhmZiwgMHhmZil9LCAvKiA4NzIzQVUgMSoxICovCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBydGw4NzIzYV91c2JfaWRfdGJsW10gPSB7Ci0JUlRMODcyM0FfVVNCX0lEUwotCXt9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcnRsODcyM2FfdXNiX2lkX3RibCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBydGw4NzIzYV91c2JfZHJ2ID0gewotCS5uYW1lID0gKGNoYXIgKikicnRsODcyM2F1IiwKLQkucHJvYmUgPSBydHdfZHJ2X2luaXQsCi0JLmRpc2Nvbm5lY3QgPSBydHdfZGlzY29ubmVjdCwKLQkuaWRfdGFibGUgPSBydGw4NzIzYV91c2JfaWRfdGJsLAotCS5zdXNwZW5kID0gcnR3X3N1c3BlbmQsCi0JLnJlc3VtZSA9IHJ0d19yZXN1bWUsCi0JLnJlc2V0X3Jlc3VtZSAgPSBydHdfcmVzdW1lLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyICp1c2JfZHJ2ID0gJnJ0bDg3MjNhX3VzYl9kcnY7Ci0KLXN0YXRpYyBpbnQgcnR3X2luaXRfaW50Zl9wcml2KHN0cnVjdCBkdm9ial9wcml2ICpkdm9iaikKLXsKLQltdXRleF9pbml0KCZkdm9iai0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgaW50IHJ0d19kZWluaXRfaW50Zl9wcml2KHN0cnVjdCBkdm9ial9wcml2ICpkdm9iaikKLXsKLQltdXRleF9kZXN0cm95KCZkdm9iai0+dXNiX3ZlbmRvcl9yZXFfbXV0ZXgpOwotCi0JcmV0dXJuIF9TVUNDRVNTOwotfQotCi1zdGF0aWMgc3RydWN0IGR2b2JqX3ByaXYgKnVzYl9kdm9ial9pbml0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1c2JfaW50ZikKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqcHJpdjsKLQlzdHJ1Y3QgdXNiX2hvc3RfY29uZmlnCSAqcGhvc3RfY29uZjsKLQlzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9yICpwY29uZl9kZXNjOwotCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKnBob3N0X2lmYWNlOwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgKnBpZmFjZV9kZXNjOwotCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqcGVuZHBfZGVzYzsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYmQ7Ci0JaW50IGksIHN0YXR1cyA9IF9GQUlMOwotCi0JcGR2b2JqcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwZHZvYmpwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZHZvYmpwcml2KQotCQlnb3RvIGV4aXQ7Ci0KLQltdXRleF9pbml0KCZwZHZvYmpwcml2LT5od19pbml0X211dGV4KTsKLQltdXRleF9pbml0KCZwZHZvYmpwcml2LT5oMmNfZndjbWRfbXV0ZXgpOwotCW11dGV4X2luaXQoJnBkdm9ianByaXYtPnNldGNoX211dGV4KTsKLQltdXRleF9pbml0KCZwZHZvYmpwcml2LT5zZXRid19tdXRleCk7Ci0KLQlwZHZvYmpwcml2LT5wdXNiaW50ZiA9IHVzYl9pbnRmOwotCXB1c2JkID0gaW50ZXJmYWNlX3RvX3VzYmRldih1c2JfaW50Zik7Ci0JcGR2b2JqcHJpdi0+cHVzYmRldiA9IHB1c2JkOwotCXVzYl9zZXRfaW50ZmRhdGEodXNiX2ludGYsIHBkdm9ianByaXYpOwotCi0JcGR2b2JqcHJpdi0+UnROdW1JblBpcGVzID0gMDsKLQlwZHZvYmpwcml2LT5SdE51bU91dFBpcGVzID0gMDsKLQotCXBob3N0X2NvbmYgPSBwdXNiZC0+YWN0Y29uZmlnOwotCXBjb25mX2Rlc2MgPSAmcGhvc3RfY29uZi0+ZGVzYzsKLQotCXBob3N0X2lmYWNlID0gJnVzYl9pbnRmLT5hbHRzZXR0aW5nWzBdOwotCXBpZmFjZV9kZXNjID0gJnBob3N0X2lmYWNlLT5kZXNjOwotCi0JcGR2b2JqcHJpdi0+TnVtSW50ZXJmYWNlcyA9IHBjb25mX2Rlc2MtPmJOdW1JbnRlcmZhY2VzOwotCXBkdm9ianByaXYtPkludGVyZmFjZU51bWJlciA9IHBpZmFjZV9kZXNjLT5iSW50ZXJmYWNlTnVtYmVyOwotCXBkdm9ianByaXYtPm5yX2VuZHBvaW50ID0gcGlmYWNlX2Rlc2MtPmJOdW1FbmRwb2ludHM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGR2b2JqcHJpdi0+bnJfZW5kcG9pbnQ7IGkrKykgewotCQlwZW5kcF9kZXNjID0gJnBob3N0X2lmYWNlLT5lbmRwb2ludFtpXS5kZXNjOwotCi0JCURCR184NzIzQSgiXG51c2JfZW5kcG9pbnRfZGVzY3JpcHRvciglZCk6XG4iLCBpKTsKLQkJREJHXzg3MjNBKCJiTGVuZ3RoID0leFxuIiwgcGVuZHBfZGVzYy0+Ykxlbmd0aCk7Ci0JCURCR184NzIzQSgiYkRlc2NyaXB0b3JUeXBlID0leFxuIiwgcGVuZHBfZGVzYy0+YkRlc2NyaXB0b3JUeXBlKTsKLQkJREJHXzg3MjNBKCJiRW5kcG9pbnRBZGRyZXNzID0leFxuIiwKLQkJCSAgcGVuZHBfZGVzYy0+YkVuZHBvaW50QWRkcmVzcyk7Ci0JCURCR184NzIzQSgid01heFBhY2tldFNpemUgPSVkXG4iLAotCQkJICBsZTE2X3RvX2NwdShwZW5kcF9kZXNjLT53TWF4UGFja2V0U2l6ZSkpOwotCQlEQkdfODcyM0EoImJJbnRlcnZhbCA9JXhcbiIsIHBlbmRwX2Rlc2MtPmJJbnRlcnZhbCk7Ci0KLQkJaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX2luKHBlbmRwX2Rlc2MpKSB7Ci0JCQlEQkdfODcyM0EoInVzYl9lbmRwb2ludF9pc19idWxrX2luID0gJXhcbiIsCi0JCQkJICB1c2JfZW5kcG9pbnRfbnVtKHBlbmRwX2Rlc2MpKTsKLQkJCXBkdm9ianByaXYtPlJ0SW5QaXBlW3Bkdm9ianByaXYtPlJ0TnVtSW5QaXBlc10gPQotCQkJCXVzYl9lbmRwb2ludF9udW0ocGVuZHBfZGVzYyk7Ci0JCQlwZHZvYmpwcml2LT5SdE51bUluUGlwZXMrKzsKLQkJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfaXNfaW50X2luKHBlbmRwX2Rlc2MpKSB7Ci0JCQlEQkdfODcyM0EoInVzYl9lbmRwb2ludF9pc19pbnRfaW4gPSAleCwgSW50ZXJ2YWwgPSAiCi0JCQkJICAiJXhcbiIsIHVzYl9lbmRwb2ludF9udW0ocGVuZHBfZGVzYyksCi0JCQkJICBwZW5kcF9kZXNjLT5iSW50ZXJ2YWwpOwotCQkJcGR2b2JqcHJpdi0+UnRJblBpcGVbcGR2b2JqcHJpdi0+UnROdW1JblBpcGVzXSA9Ci0JCQkJdXNiX2VuZHBvaW50X251bShwZW5kcF9kZXNjKTsKLQkJCXBkdm9ianByaXYtPlJ0TnVtSW5QaXBlcysrOwotCQl9IGVsc2UgaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX291dChwZW5kcF9kZXNjKSkgewotCQkJREJHXzg3MjNBKCJ1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQgPSAleFxuIiwKLQkJCQkgIHVzYl9lbmRwb2ludF9udW0ocGVuZHBfZGVzYykpOwotCQkJcGR2b2JqcHJpdi0+UnRPdXRQaXBlW3Bkdm9ianByaXYtPlJ0TnVtT3V0UGlwZXNdID0KLQkJCQl1c2JfZW5kcG9pbnRfbnVtKHBlbmRwX2Rlc2MpOwotCQkJcGR2b2JqcHJpdi0+UnROdW1PdXRQaXBlcysrOwotCQl9Ci0JCXBkdm9ianByaXYtPmVwX251bVtpXSA9IHVzYl9lbmRwb2ludF9udW0ocGVuZHBfZGVzYyk7Ci0JfQotCURCR184NzIzQSgibnJfZW5kcG9pbnQgPSVkLCBpbl9udW0gPSVkLCBvdXRfbnVtID0lZFxuXG4iLAotCQkgIHBkdm9ianByaXYtPm5yX2VuZHBvaW50LCBwZHZvYmpwcml2LT5SdE51bUluUGlwZXMsCi0JCSAgcGR2b2JqcHJpdi0+UnROdW1PdXRQaXBlcyk7Ci0KLQlpZiAocHVzYmQtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSB7Ci0JCXBkdm9ianByaXYtPmlzaGlnaHNwZWVkID0gdHJ1ZTsKLQkJREJHXzg3MjNBKCJVU0JfU1BFRURfSElHSFxuIik7Ci0JfSBlbHNlIHsKLQkJcGR2b2JqcHJpdi0+aXNoaWdoc3BlZWQgPSBmYWxzZTsKLQkJREJHXzg3MjNBKCJOT04gVVNCX1NQRUVEX0hJR0hcbiIpOwotCX0KLQotCWlmIChydHdfaW5pdF9pbnRmX3ByaXYocGR2b2JqcHJpdikgPT0gX0ZBSUwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJDYW4ndCBJTklUIHJ0d19pbml0X2ludGZfcHJpdlxuIik7Ci0JCWdvdG8gZnJlZV9kdm9iajsKLQl9Ci0JLyogMyBtaXNjICovCi0JcnR3X3Jlc2V0X2NvbnRpbnVhbF91cmJfZXJyb3IocGR2b2JqcHJpdik7Ci0JdXNiX2dldF9kZXYocHVzYmQpOwotCXN0YXR1cyA9IF9TVUNDRVNTOwotZnJlZV9kdm9iajoKLQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTICYmIHBkdm9ianByaXYpIHsKLQkJdXNiX3NldF9pbnRmZGF0YSh1c2JfaW50ZiwgTlVMTCk7Ci0JCW11dGV4X2Rlc3Ryb3koJnBkdm9ianByaXYtPmh3X2luaXRfbXV0ZXgpOwotCQltdXRleF9kZXN0cm95KCZwZHZvYmpwcml2LT5oMmNfZndjbWRfbXV0ZXgpOwotCQltdXRleF9kZXN0cm95KCZwZHZvYmpwcml2LT5zZXRjaF9tdXRleCk7Ci0JCW11dGV4X2Rlc3Ryb3koJnBkdm9ianByaXYtPnNldGJ3X211dGV4KTsKLQkJa2ZyZWUocGR2b2JqcHJpdik7Ci0JCXBkdm9ianByaXYgPSBOVUxMOwotCX0KLWV4aXQ6Ci0JcmV0dXJuIHBkdm9ianByaXY7Ci19Ci0KLXN0YXRpYyB2b2lkIHVzYl9kdm9ial9kZWluaXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVzYl9pbnRmKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiA9IHVzYl9nZXRfaW50ZmRhdGEodXNiX2ludGYpOwotCi0JdXNiX3NldF9pbnRmZGF0YSh1c2JfaW50ZiwgTlVMTCk7Ci0JaWYgKGR2b2JqKSB7Ci0JCS8qIE1vZGlmeSBjb25kaXRpb24gZm9yIDkyRFUgRE1EUCAyMDEwLjExLjE4LCBieSBUaG9tYXMgKi8KLQkJaWYgKChkdm9iai0+TnVtSW50ZXJmYWNlcyAhPSAyICYmIGR2b2JqLT5OdW1JbnRlcmZhY2VzICE9IDMpIHx8Ci0JCSAgICAoZHZvYmotPkludGVyZmFjZU51bWJlciA9PSAxKSkgewotCQkJaWYgKGludGVyZmFjZV90b191c2JkZXYodXNiX2ludGYpLT5zdGF0ZSAhPQotCQkJICAgIFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkgewotCQkJCS8qIElmIHdlIGRpZG4ndCB1bnBsdWcgdXNiIGRvbmdsZSBhbmQKLQkJCQkgKiByZW1vdmUvaW5zZXJ0IG1vZHVsZSwgZHJpdmVyIGZhaWxzIG9uCi0JCQkJICogc2l0ZXN1cnZleSBmb3IgdGhlIGZpcnN0IHRpbWUgd2hlbgotCQkJCSAqIGRldmljZSBpcyB1cCAuCi0JCQkJICogUmVzZXQgdXNiIHBvcnQgZm9yIHNpdGVzdXJ2ZXkgZmFpbCBpc3N1ZS4KLQkJCQkgKi8KLQkJCQlEQkdfODcyM0EoInVzYiBhdHRhY2hlZC4uLiwgdHJ5IHRvIHJlc2V0IHVzYiBkZXZpY2VcbiIpOwotCQkJCXVzYl9yZXNldF9kZXZpY2UoaW50ZXJmYWNlX3RvX3VzYmRldih1c2JfaW50ZikpOwotCQkJfQotCQl9Ci0JCXJ0d19kZWluaXRfaW50Zl9wcml2KGR2b2JqKTsKLQkJbXV0ZXhfZGVzdHJveSgmZHZvYmotPmh3X2luaXRfbXV0ZXgpOwotCQltdXRleF9kZXN0cm95KCZkdm9iai0+aDJjX2Z3Y21kX211dGV4KTsKLQkJbXV0ZXhfZGVzdHJveSgmZHZvYmotPnNldGNoX211dGV4KTsKLQkJbXV0ZXhfZGVzdHJveSgmZHZvYmotPnNldGJ3X211dGV4KTsKLQkJa2ZyZWUoZHZvYmopOwotCX0KLQl1c2JfcHV0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KHVzYl9pbnRmKSk7Ci19Ci0KLXZvaWQgcnRsODcyM2FfdXNiX2ludGZfc3RvcChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICIrdXNiX2ludGZfc3RvcFxuIik7Ci0KLQkvKiBkaXNhYmxlX2h3X2ludGVycnVwdCAqLwotCWlmICghcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKLQkJLyogZGV2aWNlIHN0aWxsIGV4aXN0cywgc28gZHJpdmVyIGNhbiBkbyBpL28gb3BlcmF0aW9uCi0JCSAqIFRPRE86Ci0JCSAqLwotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJTdXJwcmlzZVJlbW92ZWQgPT0gZmFsc2VcbiIpOwotCX0KLQotCS8qIGNhbmNlbCBpbiBpcnAgKi8KLQlydGw4NzIzYXVfaW5pcnBfZGVpbml0KHBhZGFwdGVyKTsKLQotCS8qIGNhbmNlbCBvdXQgaXJwICovCi0JcnRsODcyM2F1X3dyaXRlX3BvcnRfY2FuY2VsKHBhZGFwdGVyKTsKLQotCS8qIHRvZG86Y2FuY2VsIG90aGVyIGlycHMgKi8KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiLXVzYl9pbnRmX3N0b3BcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBydHdfZGV2X3VubG9hZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQotewotCXN0cnVjdCBzdWJtaXRfY3R4ICpwYWNrX3R4X29wcyA9ICZwYWRhcHRlci0+eG1pdHByaXYuYWNrX3R4X29wczsKLQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICIrcnR3X2Rldl91bmxvYWRcbiIpOwotCi0JaWYgKHBhZGFwdGVyLT5idXApIHsKLQkJREJHXzg3MjNBKCI9PT0+IHJ0d19kZXZfdW5sb2FkXG4iKTsKLQotCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwotCQlpZiAocGFkYXB0ZXItPnhtaXRwcml2LmFja190eCkKLQkJCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZwYWNrX3R4X29wcywKLQkJCQkJICAgICBSVFdfU0NUWF9ET05FX0RSVl9TVE9QKTsKLQotCQkvKiBzMy4gKi8KLQkJcnRsODcyM2FfdXNiX2ludGZfc3RvcChwYWRhcHRlcik7Ci0KLQkJLyogczQuICovCi0JCWZsdXNoX3dvcmtxdWV1ZShwYWRhcHRlci0+Y21kcHJpdi53cSk7Ci0KLQkJLyogczUuICovCi0JCWlmICghcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKLQkJCXJ0bDg3MjNhdV9oYWxfZGVpbml0KHBhZGFwdGVyKTsKLQkJCXBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID0gdHJ1ZTsKLQkJfQotCQlwYWRhcHRlci0+YnVwID0gZmFsc2U7Ci0JfSBlbHNlIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAicjg3MXhfZGV2X3VubG9hZCgpOnBhZGFwdGVyLT5idXAgPT0gZmFsc2VcbiIpOwotCX0KLQlEQkdfODcyM0EoIjw9PT0gcnR3X2Rldl91bmxvYWRcbiIpOwotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICItcnR3X2Rldl91bmxvYWRcbiIpOwotfQotCi1zdGF0aWMgaW50IHJ0d19zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICpwdXNiX2ludGYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRmKTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gZHZvYmotPmlmMTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0Jc3RydWN0IHB3cmN0cmxfcHJpdiAqcHdycHJpdiA9ICZwYWRhcHRlci0+cHdyY3RybHByaXY7Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gamlmZmllczsKLQotCURCR184NzIzQSgiPT0+ICVzICglczolZClcbiIsIF9fZnVuY19fLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOwotCi0JaWYgKCghcGFkYXB0ZXItPmJ1cCkgfHwgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkgfHwKLQkgICAgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSkgewotCQlEQkdfODcyM0EoInBhZGFwdGVyLT5idXAgPSVkIGJEcml2ZXJTdG9wcGVkID0lZCBiU3VycHJpc2VSZW1vdmVkID0gJWRcbiIsCi0JCQkgIHBhZGFwdGVyLT5idXAsIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKLQkJCSAgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXB3cnByaXYtPmJJblN1c3BlbmQgPSB0cnVlOwotCXJ0d19jYW5jZWxfYWxsX3RpbWVyMjNhKHBhZGFwdGVyKTsKLQlMZWF2ZUFsbFBvd2VyU2F2ZU1vZGUyM2EocGFkYXB0ZXIpOwotCi0JZG93bigmcHdycHJpdi0+bG9jayk7Ci0JLyogcGFkYXB0ZXItPm5ldF9jbG9zZWQgPSB0cnVlOyAqLwotCS8qIHMxLiAqLwotCWlmIChwbmV0ZGV2KSB7Ci0JCW5ldGlmX2NhcnJpZXJfb2ZmKHBuZXRkZXYpOwotCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocG5ldGRldik7Ci0JfQotCi0JLyogczIuICovCi0JcnR3X2Rpc2Fzc29jX2NtZDIzYShwYWRhcHRlciwgMCwgZmFsc2UpOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpICYmCi0JICAgIGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewotCQlEQkdfODcyM0EoIiVzOiVkICVzKCVwTSksIGxlbmd0aDolZCBhc3NvY19zc2lkLmxlbmd0aDolZFxuIiwKLQkJCSAgX19mdW5jX18sIF9fTElORV9fLAotCQkJICBwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJICBwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuTWFjQWRkcmVzcywKLQkJCSAgcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLlNzaWQuc3NpZF9sZW4sCi0JCQkgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbik7Ci0KLQkJcnR3X3NldF9yb2FtaW5nKHBhZGFwdGVyLCAxKTsKLQl9Ci0JLyogczItMi4gIGluZGljYXRlIGRpc2Nvbm5lY3QgdG8gb3MgKi8KLQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0JLyogczItMy4gKi8KLQlydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EocGFkYXB0ZXIsIDEpOwotCS8qIHMyLTQuICovCi0JcnR3X2ZyZWVfbmV0d29ya19xdWV1ZTIzYShwYWRhcHRlcik7Ci0KLQlydHdfZGV2X3VubG9hZChwYWRhcHRlcik7Ci0JdXAoJnB3cnByaXYtPmxvY2spOwotCi0JaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkKLQkJcnR3X2NmZzgwMjExX2luZGljYXRlX3NjYW5fZG9uZSgKLQkJCXdkZXZfdG9fcHJpdihwYWRhcHRlci0+cnR3X3dkZXYpLCB0cnVlKTsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKQotCQlydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYShwYWRhcHRlcik7Ci0KLWV4aXQ6Ci0JREJHXzg3MjNBKCI8PT09ICAlcyByZXR1cm4gJWQuLi4uLi4uLi4uLi4uLiBpbiAlZG1zXG4iLCBfX2Z1bmNfXywKLQkJICByZXQsIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0X3RpbWUpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcnR3X3Jlc3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRmKQotewotCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iaiA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRmKTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gZHZvYmotPmlmMTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldjsKLQlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gTlVMTDsKLQlpbnQgcmV0ID0gLTE7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF90aW1lID0gamlmZmllczsKLQotCURCR184NzIzQSgiPT0+ICVzICglczolZClcbiIsIF9fZnVuY19fLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQpOwotCi0JaWYgKCFwYWRhcHRlcikKLQkJZ290byBleGl0OwotCXBuZXRkZXYgPSBwYWRhcHRlci0+cG5ldGRldjsKLQlwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKLQotCWRvd24oJnB3cnByaXYtPmxvY2spOwotCXJ0d19yZXNldF9kcnZfc3cyM2EocGFkYXB0ZXIpOwotCXB3cnByaXYtPmJrZWVwZndhbGl2ZSA9IGZhbHNlOwotCi0JREJHXzg3MjNBKCJia2VlcGZ3YWxpdmUoJXgpXG4iLCBwd3Jwcml2LT5ia2VlcGZ3YWxpdmUpOwotCWlmIChwbV9uZXRkZXZfb3BlbjIzYShwbmV0ZGV2LCB0cnVlKSAhPSAwKSB7Ci0JCXVwKCZwd3Jwcml2LT5sb2NrKTsKLQkJZ290byBleGl0OwotCX0KLQotCW5ldGlmX2RldmljZV9hdHRhY2gocG5ldGRldik7Ci0JbmV0aWZfY2Fycmllcl9vbihwbmV0ZGV2KTsKLQotCXVwKCZwd3Jwcml2LT5sb2NrKTsKLQotCWlmIChwYWRhcHRlci0+cGlkWzFdICE9IDApIHsKLQkJREJHXzg3MjNBKCJwaWRbMV06JWRcbiIsIHBhZGFwdGVyLT5waWRbMV0pOwotCQlraWxsX3BpZChmaW5kX3ZwaWQocGFkYXB0ZXItPnBpZFsxXSksIFNJR1VTUjIsIDEpOwotCX0KLQotCXJ0dzIzYV9yb2FtaW5nKHBhZGFwdGVyLCBOVUxMKTsKLQotCXJldCA9IDA7Ci1leGl0OgotCWlmIChwd3Jwcml2KQotCQlwd3Jwcml2LT5iSW5TdXNwZW5kID0gZmFsc2U7Ci0JREJHXzg3MjNBKCI8PT09ICAlcyByZXR1cm4gJWQuLi4uLi4uLi4uLi4uLiBpbiAlZG1zXG4iLCBfX2Z1bmNfXywKLQkJICByZXQsIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0X3RpbWUpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBkcnZfaW5pdCgpIC0gYSBkZXZpY2UgcG90ZW50aWFsbHkgZm9yIHVzCi0gKgotICogbm90ZXM6IGRydl9pbml0KCkgaXMgY2FsbGVkIHdoZW4gdGhlIGJ1cyBkcml2ZXIgaGFzIGxvY2F0ZWQgYSBjYXJkCi0gKiBmb3IgdXMgdG8gc3VwcG9ydC4KLSAqICAgICAgICBXZSBhY2NlcHQgdGhlIG5ldyBkZXZpY2UgYnkgcmV0dXJuaW5nIDAuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnJ0d191c2JfaWYxX2luaXQoc3RydWN0IGR2b2JqX3ByaXYgKmR2b2JqLAotCQkJCQkgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZiwKLQkJCQkJICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpwZGlkKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBOVUxMOwotCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2ID0gTlVMTDsKLQlpbnQgc3RhdHVzID0gX0ZBSUw7Ci0KLQlwbmV0ZGV2ID0gcnR3X2luaXRfbmV0ZGV2MjNhKHBhZGFwdGVyKTsKLQlpZiAoIXBuZXRkZXYpCi0JCWdvdG8gZnJlZV9hZGFwdGVyOwotCXBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7Ci0KLQlwYWRhcHRlci0+ZHZvYmogPSBkdm9iajsKLQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwotCWR2b2JqLT5pZjEgPSBwYWRhcHRlcjsKLQlkdm9iai0+cGFkYXB0ZXJzW2R2b2JqLT5pZmFjZV9udW1zKytdID0gcGFkYXB0ZXI7Ci0JcGFkYXB0ZXItPmlmYWNlX2lkID0gSUZBQ0VfSUQwOwotCi0JcnRsODcyM2F1X3NldF9od190eXBlKHBhZGFwdGVyKTsKLQotCVNFVF9ORVRERVZfREVWKHBuZXRkZXYsIGR2b2JqX3RvX2Rldihkdm9iaikpOwotCi0JaWYgKHJ0d193ZGV2X2FsbG9jKHBhZGFwdGVyLCBkdm9ial90b19kZXYoZHZvYmopKSkKLQkJZ290byBmcmVlX2FkYXB0ZXI7Ci0KLQkvKiBzdGVwIDIuIGFsbG9jYXRlIEhhbERhdGEgKi8KLQlwYWRhcHRlci0+SGFsRGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoYWxfZGF0YV84NzIzYSksIEdGUF9LRVJORUwpOwotCWlmICghcGFkYXB0ZXItPkhhbERhdGEpCi0JCWdvdG8gZnJlZV93ZGV2OwotCi0JLyogc3RlcCByZWFkX2NoaXBfdmVyc2lvbiAqLwotCXJ0bDg3MjNhX3JlYWRfY2hpcF92ZXJzaW9uKHBhZGFwdGVyKTsKLQotCS8qIHN0ZXAgdXNiIGVuZHBvaW50IG1hcHBpbmcgKi8KLQlpZiAoIXJ0bDg3MjNhdV9jaGlwX2NvbmZpZ3VyZShwYWRhcHRlcikpCi0JCWdvdG8gZnJlZV9oYWxfZGF0YTsKLQotCS8qIHN0ZXAgcmVhZCBlZnVzZS9lZXByb20gZGF0YSBhbmQgZ2V0IG1hY19hZGRyICovCi0JcnRsODcyM2FfcmVhZF9hZGFwdGVyX2luZm8ocGFkYXB0ZXIpOwotCi0JLyogc3RlcCA1LiAqLwotCWlmIChydHdfaW5pdF9kcnZfc3cyM2EocGFkYXB0ZXIpID09IF9GQUlMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgIkluaXRpYWxpemUgZHJpdmVyIHNvZnR3YXJlIHJlc291cmNlIEZhaWxlZCFcbiIpOwotCQlnb3RvIGZyZWVfaGFsX2RhdGE7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1BNCi0JaWYgKHBhZGFwdGVyLT5wd3JjdHJscHJpdi5iU3VwcG9ydFJlbW90ZVdha2V1cCkgewotCQlkdm9iai0+cHVzYmRldi0+ZG9fcmVtb3RlX3dha2V1cCA9IDE7Ci0JCXB1c2JfaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDE7Ci0JCWRldmljZV9pbml0X3dha2V1cCgmcHVzYl9pbnRmLT5kZXYsIDEpOwotCQlEQkdfODcyM0EoIlxuICBwYWRhcHRlci0+cHdyY3RybHByaXYuYlN1cHBvcnRSZW1vdGVXYWtldXB+fn5+fn5cbiIpOwotCQlEQkdfODcyM0EoIlxuICBwYWRhcHRlci0+cHdyY3RybHByaXYuYlN1cHBvcnRSZW1vdGVXYWtldXB+fn5bJWRdfn5+XG4iLAotCQkJICBkZXZpY2VfbWF5X3dha2V1cCgmcHVzYl9pbnRmLT5kZXYpKTsKLQl9Ci0jZW5kaWYKLQkvKiAyMDEyLTA3LTExIE1vdmUgaGVyZSB0byBwcmV2ZW50IHRoZSA4NzIzQVMtVkFVIEJUCi0JICogYXV0byBzdXNwZW5kIGluZmx1ZW5jZQotCSAqLwotCWlmICh1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UocHVzYl9pbnRmKSA8IDApCi0JCURCR184NzIzQSgiY2FuJ3QgZ2V0IGF1dG9wbTpcbiIpOwotI2lmZGVmCUNPTkZJR184NzIzQVVfQlRfQ09FWElTVAotCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5hdXRvcG1fY250ID0gMTsKLSNlbmRpZgotCi0JLyogSWYgdGhlIGVlcHJvbSBtYWMgYWRkcmVzcyBpcyBjb3JydXB0ZWQsIGFzc2lnbiBhIHJhbmRvbSBhZGRyZXNzICovCi0JaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBhZGFwdGVyLT5lZXByb21wcml2Lm1hY19hZGRyKSB8fAotCSAgICBpc196ZXJvX2V0aGVyX2FkZHIocGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIpKQotCQlldGhfcmFuZG9tX2FkZHIocGFkYXB0ZXItPmVlcHJvbXByaXYubWFjX2FkZHIpOwotCi0JREJHXzg3MjNBKCJiRHJpdmVyU3RvcHBlZDolZCwgYlN1cnByaXNlUmVtb3ZlZDolZCwgYnVwOiVkLCBod19pbml0X2NvbXBsZXRlZDolZFxuIiwKLQkJICBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkLAotCQkgIHBhZGFwdGVyLT5idXAsIHBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZAotCSk7Ci0Jc3RhdHVzID0gX1NVQ0NFU1M7Ci0KLWZyZWVfaGFsX2RhdGE6Ci0JaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykKLQkJa2ZyZWUocGFkYXB0ZXItPkhhbERhdGEpOwotZnJlZV93ZGV2OgotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpIHsKLQkJcnR3X3dkZXZfdW5yZWdpc3RlcihwYWRhcHRlci0+cnR3X3dkZXYpOwotCQlydHdfd2Rldl9mcmVlKHBhZGFwdGVyLT5ydHdfd2Rldik7Ci0JfQotZnJlZV9hZGFwdGVyOgotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpIHsKLQkJaWYgKHBuZXRkZXYpCi0JCQlmcmVlX25ldGRldihwbmV0ZGV2KTsKLQkJcGFkYXB0ZXIgPSBOVUxMOwotCX0KLQlyZXR1cm4gcGFkYXB0ZXI7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0d191c2JfaWYxX2RlaW5pdChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmlmMSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiA9IGlmMS0+cG5ldGRldjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmaWYxLT5tbG1lcHJpdjsKLQotCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpCi0JCXJ0d19kaXNhc3NvY19jbWQyM2EoaWYxLCAwLCBmYWxzZSk7Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQlmcmVlX21sbWVfYXBfaW5mbzIzYShpZjEpOwotI2VuZGlmCi0KLQlpZiAocG5ldGRldikKLQkJdW5yZWdpc3Rlcl9uZXRkZXYocG5ldGRldik7IC8qIHdpbGwgY2FsbCBuZXRkZXZfY2xvc2UoKSAqLwotCi0JcnR3X2NhbmNlbF9hbGxfdGltZXIyM2EoaWYxKTsKLQotCXJ0d19kZXZfdW5sb2FkKGlmMSk7Ci0KLQlEQkdfODcyM0EoIityODcxeHVfZGV2X3JlbW92ZSwgaHdfaW5pdF9jb21wbGV0ZWQgPSVkXG4iLAotCQkgIGlmMS0+aHdfaW5pdF9jb21wbGV0ZWQpOwotCi0JaWYgKGlmMS0+cnR3X3dkZXYpIHsKLQkJcnR3X3dkZXZfdW5yZWdpc3RlcihpZjEtPnJ0d193ZGV2KTsKLQkJcnR3X3dkZXZfZnJlZShpZjEtPnJ0d193ZGV2KTsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfODcyM0FVX0JUX0NPRVhJU1QKLQlpZiAoMSA9PSBpZjEtPnB3cmN0cmxwcml2LmF1dG9wbV9jbnQpIHsKLQkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGFkYXB0ZXJfdG9fZHZvYmooaWYxKS0+cHVzYmludGYpOwotCQlpZjEtPnB3cmN0cmxwcml2LmF1dG9wbV9jbnQtLTsKLQl9Ci0jZW5kaWYKLQotCXJ0d19mcmVlX2Rydl9zdzIzYShpZjEpOwotCi0JaWYgKHBuZXRkZXYpCi0JCWZyZWVfbmV0ZGV2KHBuZXRkZXYpOwotfQotCi1zdGF0aWMgaW50IHJ0d19kcnZfaW5pdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRmLAotCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKnBkaWQpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICppZjEgPSBOVUxMOwotCXN0cnVjdCBkdm9ial9wcml2ICpkdm9iajsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKLQlpbnQgc3RhdHVzID0gX0ZBSUw7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK3J0d19kcnZfaW5pdFxuIik7Ci0KLQkvKiBJbml0aWFsaXplIGR2b2JqX3ByaXYgKi8KLQlkdm9iaiA9IHVzYl9kdm9ial9pbml0KHB1c2JfaW50Zik7Ci0JaWYgKCFkdm9iaikgewotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICJpbml0aWFsaXplIGRldmljZSBvYmplY3QgcHJpdiBGYWlsZWQhXG4iKTsKLQkJZ290byBleGl0OwotCX0KLQotCXVkZXYgPSBkdm9iai0+cHVzYmRldjsKLQlkZXZfd2FybigmdWRldi0+ZGV2LCAiV0FSTklORzogVGhlIHJ0bDg3MjNhdSBkcml2ZXIgaXMgZGVwcmVjYXRlZCEiKTsKLQlkZXZfd2FybigmdWRldi0+ZGV2LCAiUGxlYXNlIHVzZSB0aGUgcnRsOHh4eHUgZHJpdmVyIGZvciB0aGlzIGRldmljZSEiKTsKLQotCWlmMSA9IHJ0d191c2JfaWYxX2luaXQoZHZvYmosIHB1c2JfaW50ZiwgcGRpZCk7Ci0JaWYgKCFpZjEpIHsKLQkJREJHXzg3MjNBKCJydHdfaW5pdF9wcmltYXJ5X2FkYXB0ZXIgRmFpbGVkIVxuIik7Ci0JCWdvdG8gZnJlZV9kdm9iajsKLQl9Ci0KLQkvKiBkZXZfYWxsb2NfbmFtZSAmJiByZWdpc3Rlcl9uZXRkZXYgKi8KLQlzdGF0dXMgPSBydHdfZHJ2X3JlZ2lzdGVyX25ldGRldihpZjEpOwotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpCi0JCWdvdG8gZnJlZV9pZjE7Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJICItODcxeF9kcnYgLSBkcnZfaW5pdCwgc3VjY2VzcyFcbiIpOwotCi0Jc3RhdHVzID0gX1NVQ0NFU1M7Ci0KLWZyZWVfaWYxOgotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MgJiYgaWYxKQotCQlydHdfdXNiX2lmMV9kZWluaXQoaWYxKTsKLWZyZWVfZHZvYmo6Ci0JaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykKLQkJdXNiX2R2b2JqX2RlaW5pdChwdXNiX2ludGYpOwotZXhpdDoKLQlyZXR1cm4gc3RhdHVzID09IF9TVUNDRVNTID8gMCA6IC1FTk9ERVY7Ci19Ci0KLS8qIGRldl9yZW1vdmUoKSAtIG91ciBkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZCAqLwotc3RhdGljIHZvaWQgcnR3X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZikKLXsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmo7Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldjsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXY7Ci0KLQlkdm9iaiA9IHVzYl9nZXRfaW50ZmRhdGEocHVzYl9pbnRmKTsKLQlpZiAoIWR2b2JqKQotCQlyZXR1cm47Ci0KLQlwYWRhcHRlciA9IGR2b2JqLT5pZjE7Ci0JcG5ldGRldiA9IHBhZGFwdGVyLT5wbmV0ZGV2OwotCXBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7Ci0KLQl1c2Jfc2V0X2ludGZkYXRhKHB1c2JfaW50ZiwgTlVMTCk7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK2Rldl9yZW1vdmUoKVxuIik7Ci0KLQlydHdfcG1fc2V0X2lwczIzYShwYWRhcHRlciwgSVBTX05PTkUpOwotCXJ0d19wbV9zZXRfbHBzMjNhKHBhZGFwdGVyLCBQU19NT0RFX0FDVElWRSk7Ci0KLQlMZWF2ZUFsbFBvd2VyU2F2ZU1vZGUyM2EocGFkYXB0ZXIpOwotCi0JcnR3X3VzYl9pZjFfZGVpbml0KHBhZGFwdGVyKTsKLQotCXVzYl9kdm9ial9kZWluaXQocHVzYl9pbnRmKTsKLQotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICItZGV2X3JlbW92ZSgpXG4iKTsKLQlEQkdfODcyM0EoIi1yODcxeHVfZGV2X3JlbW92ZSwgZG9uZVxuIik7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJ0d19kcnZfZW50cnkodm9pZCkKLXsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK3J0d19kcnZfZW50cnlcbiIpOwotCXJldHVybiB1c2JfcmVnaXN0ZXIodXNiX2Rydik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBydHdfZHJ2X2hhbHQodm9pZCkKLXsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiK3J0d19kcnZfaGFsdFxuIik7Ci0JREJHXzg3MjNBKCIrcnR3X2Rydl9oYWx0XG4iKTsKLQotCXVzYl9kZXJlZ2lzdGVyKHVzYl9kcnYpOwotCi0JREJHXzg3MjNBKCItcnR3X2Rydl9oYWx0XG4iKTsKLX0KLQotbW9kdWxlX2luaXQocnR3X2Rydl9lbnRyeSk7Ci1tb2R1bGVfZXhpdChydHdfZHJ2X2hhbHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvdXNiX29wc19saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvdXNiX29wc19saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRhNTA2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9vcHNfbGludXguYworKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEyIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgX1VTQl9PUFNfTElOVVhfQ18KLQotI2luY2x1ZGUgPGRydl90eXBlcy5oPgotI2luY2x1ZGUgPHVzYl9vcHNfbGludXguaD4KLSNpbmNsdWRlIDxydHdfc3Jlc2V0Lmg+Ci0KLXZvaWQgcnRsODcyM2F1X3JlYWRfcG9ydF9jYW5jZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOwotCWludCBpOwotCi0JcHJlY3ZidWYgPSAoc3RydWN0IHJlY3ZfYnVmICopcGFkYXB0ZXItPnJlY3Zwcml2LnByZWN2X2J1ZjsKLQotCURCR184NzIzQSgiJXNcbiIsIF9fZnVuY19fKTsKLQotCXBhZGFwdGVyLT5iUmVhZFBvcnRDYW5jZWwgPSB0cnVlOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX1JFQ1ZCVUZGIDsgaSsrKSB7Ci0JCWlmIChwcmVjdmJ1Zi0+cHVyYikKLQkJCXVzYl9raWxsX3VyYihwcmVjdmJ1Zi0+cHVyYik7Ci0JCXByZWN2YnVmKys7Ci0JfQotCXVzYl9raWxsX3VyYihwYWRhcHRlci0+cmVjdnByaXYuaW50X2luX3VyYik7Ci19Ci0KLXN0YXRpYyB2b2lkIHVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnB1cmIpCi17Ci0Jc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZiA9IChzdHJ1Y3QgeG1pdF9idWYgKilwdXJiLT5jb250ZXh0OwotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBweG1pdGJ1Zi0+cGFkYXB0ZXI7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBoYWxkYXRhOwotCXVuc2lnbmVkIGxvbmcgaXJxTDsKLQotCXN3aXRjaCAocHhtaXRidWYtPmZsYWdzKSB7Ci0JY2FzZSBISUdIX1FVRVVFX0lOWDoKLSNpZmRlZiBDT05GSUdfODcyM0FVX0FQX01PREUKLQkJcnR3X2Noa19oaV9xdWV1ZV9jbWQyM2EocGFkYXB0ZXIpOwotI2VuZGlmCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwKLQkgICAgcGFkYXB0ZXItPmJXcml0ZVBvcnRDYW5jZWwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOmJEcml2ZXJTdG9wcGVkKCVkKSBPUiBiU3VycHJpc2VSZW1vdmVkKCVkKVxuIiwKLQkJCSBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKTsKLQkJREJHXzg3MjNBKCIlcygpOiBUWCBXYXJuaW5nISBiRHJpdmVyU3RvcHBlZCglZCkgT1IgIgotCQkJICAiYlN1cnByaXNlUmVtb3ZlZCglZCkgYldyaXRlUG9ydENhbmNlbCglZCkgIgotCQkJICAicHhtaXRidWYtPmV4dF90YWcoJXgpXG4iLCBfX2Z1bmNfXywKLQkJCSAgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCwKLQkJCSAgcGFkYXB0ZXItPmJSZWFkUG9ydENhbmNlbCwgcHhtaXRidWYtPmV4dF90YWcpOwotCi0JCWdvdG8gY2hlY2tfY29tcGxldGlvbjsKLQl9Ci0KLQlpZiAocHVyYi0+c3RhdHVzKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZSA6IHB1cmItPnN0YXR1cyglZCkgIT0gMFxuIiwKLQkJCSBwdXJiLT5zdGF0dXMpOwotCQlEQkdfODcyM0EoIiMjIz0+IHVyYl93cml0ZV9wb3J0X2NvbXBsZXRlIHN0YXR1cyglZClcbiIsCi0JCQkgIHB1cmItPnN0YXR1cyk7Ci0JCWlmIChwdXJiLT5zdGF0dXMgPT0gLUVQSVBFIHx8IHB1cmItPnN0YXR1cyA9PSAtRVBST1RPKSB7Ci0JCX0gZWxzZSBpZiAocHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgewotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTogRUlOUFJPR0VTU1xuIik7Ci0JCQlnb3RvIGNoZWNrX2NvbXBsZXRpb247Ci0JCX0gZWxzZSBpZiAocHVyYi0+c3RhdHVzID09IC1FTk9FTlQpIHsKLQkJCURCR184NzIzQSgiJXM6IC1FTk9FTlRcbiIsIF9fZnVuY19fKTsKLQkJCWdvdG8gY2hlY2tfY29tcGxldGlvbjsKLQkJfSBlbHNlIGlmIChwdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpIHsKLQkJCURCR184NzIzQSgiJXM6IC1FQ09OTlJFU0VUXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIGNoZWNrX2NvbXBsZXRpb247Ci0JCX0gZWxzZSBpZiAocHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAidXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGU6IEVTSFVURE9XTlxuIik7Ci0JCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwotCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCA9IHRydWVcbiIpOwotCQkJZ290byBjaGVja19jb21wbGV0aW9uOwotCQl9IGVsc2UgewotCQkJcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPSB0cnVlOwotCQkJREJHXzg3MjNBKCJiU3VycHJpc2VSZW1vdmVkID0gdHJ1ZVxuIik7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOmJTdXJwcmlzZVJlbW92ZWQgPSB0cnVlXG4iKTsKLQkJCWdvdG8gY2hlY2tfY29tcGxldGlvbjsKLQkJfQotCX0KLQlwaGFsZGF0YSA9IEdFVF9IQUxfREFUQShwYWRhcHRlcik7Ci0JcGhhbGRhdGEtPnNyZXN0cHJpdi5sYXN0X3R4X2NvbXBsZXRlX3RpbWUgPSBqaWZmaWVzOwotCi1jaGVja19jb21wbGV0aW9uOgotCXNwaW5fbG9ja19pcnFzYXZlKCZweG1pdHByaXYtPmxvY2tfc2N0eCwgaXJxTCk7Ci0JcnR3MjNhX3NjdHhfZG9uZV9lcnIoJnB4bWl0YnVmLT5zY3R4LAotCQkJICAgICBwdXJiLT5zdGF0dXMgPyBSVFdfU0NUWF9ET05FX1dSSVRFX1BPUlRfRVJSIDoKLQkJCSAgICAgUlRXX1NDVFhfRE9ORV9TVUNDRVNTKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZweG1pdHByaXYtPmxvY2tfc2N0eCwgaXJxTCk7Ci0KLQlydHdfZnJlZV94bWl0YnVmMjNhKHB4bWl0cHJpdiwgcHhtaXRidWYpOwotCi0JdGFza2xldF9oaV9zY2hlZHVsZSgmcHhtaXRwcml2LT54bWl0X3Rhc2tsZXQpOwotfQotCi1pbnQgcnRsODcyM2F1X3dyaXRlX3BvcnQoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdTMyIGFkZHIsIHUzMiBjbnQsCi0JCQkgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZikKLXsKLQlzdHJ1Y3QgdXJiICpwdXJiID0gTlVMTDsKLQlzdHJ1Y3QgZHZvYmpfcHJpdiAqcGR2b2JqID0gYWRhcHRlcl90b19kdm9iaihwYWRhcHRlcik7Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqcHVzYmQgPSBwZHZvYmotPnB1c2JkZXY7Ci0JdW5zaWduZWQgbG9uZyBpcnFMOwotCXVuc2lnbmVkIGludCBwaXBlLCBlcF9udW07Ci0JaW50IHN0YXR1czsKLQlpbnQgcmV0ID0gX0ZBSUw7Ci0KLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywgIit1c2Jfd3JpdGVfcG9ydDIzYVxuIik7Ci0KLQlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICIlczoocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSEhIVxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwgUlRXX1NDVFhfRE9ORV9UWF9ERU5ZKTsKLQkJZ290byBleGl0OwotCX0KLQotCXB4bWl0ZnJhbWUgPSAoc3RydWN0IHhtaXRfZnJhbWUgKilweG1pdGJ1Zi0+cHJpdl9kYXRhOwotCXNwaW5fbG9ja19pcnFzYXZlKCZweG1pdHByaXYtPmxvY2ssIGlycUwpOwotCi0Jc3dpdGNoIChhZGRyKSB7Ci0JY2FzZSBWT19RVUVVRV9JTlg6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IFZPX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSBWSV9RVUVVRV9JTlg6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IFZJX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSBCRV9RVUVVRV9JTlg6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IEJFX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSBCS19RVUVVRV9JTlg6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IEJLX1FVRVVFX0lOWDsKLQkJYnJlYWs7Ci0JY2FzZSBISUdIX1FVRVVFX0lOWDoKLQkJcHhtaXRidWYtPmZsYWdzID0gSElHSF9RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXB4bWl0YnVmLT5mbGFncyA9IE1HVF9RVUVVRV9JTlg7Ci0JCWJyZWFrOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnB4bWl0cHJpdi0+bG9jaywgaXJxTCk7Ci0KLQlwdXJiID0gcHhtaXRidWYtPnB4bWl0X3VyYlswXTsKLQotCS8qIHRyYW5zbGF0ZSBETUEgRklGTyBhZGRyIHRvIHBpcGVoYW5kbGUgKi8KLQllcF9udW0gPSBwZHZvYmotPlF1ZXVlMlBpcGVbYWRkcl07Ci0JcGlwZSA9IHVzYl9zbmRidWxrcGlwZShwdXNiZCwgZXBfbnVtKTsKLQotCXVzYl9maWxsX2J1bGtfdXJiKHB1cmIsIHB1c2JkLCBwaXBlLAotCQkJICBweG1pdGZyYW1lLT5idWZfYWRkciwgLyogIHB4bWl0YnVmLT5wYnVmICovCi0JCQkgIGNudCwgdXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGUsCi0JCQkgIHB4bWl0YnVmKTsvKiBjb250ZXh0IGlzIHB4bWl0YnVmICovCi0KLQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXN0YXR1cykgewotCQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBoYWxkYXRhID0gR0VUX0hBTF9EQVRBKHBhZGFwdGVyKTsKLQkJcGhhbGRhdGEtPnNyZXN0cHJpdi5sYXN0X3R4X3RpbWUgPSBqaWZmaWVzOwotCX0gZWxzZSB7Ci0JCXJ0dzIzYV9zY3R4X2RvbmVfZXJyKCZweG1pdGJ1Zi0+c2N0eCwKLQkJCQkgICAgIFJUV19TQ1RYX0RPTkVfV1JJVEVfUE9SVF9FUlIpOwotCQlEQkdfODcyM0EoInVzYl93cml0ZV9wb3J0MjNhLCBzdGF0dXMgPSVkXG4iLCBzdGF0dXMpOwotCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAidXNiX3dyaXRlX3BvcnQyM2EoKTogdXNiX3N1Ym1pdF91cmIsIHN0YXR1cyA9JXhcbiIsCi0JCQkgc3RhdHVzKTsKLQotCQlzd2l0Y2ggKHN0YXR1cykgewotCQljYXNlIC1FTk9ERVY6Ci0JCQlwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlnb3RvIGV4aXQ7Ci0JfQotCXJldCA9IF9TVUNDRVNTOwotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLCAiLXVzYl93cml0ZV9wb3J0MjNhXG4iKTsKLQotZXhpdDoKLQlpZiAocmV0ICE9IF9TVUNDRVNTKQotCQlydHdfZnJlZV94bWl0YnVmMjNhKHB4bWl0cHJpdiwgcHhtaXRidWYpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBydGw4NzIzYXVfd3JpdGVfcG9ydF9jYW5jZWwoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmOwotCWludCBqOwotCi0JREJHXzg3MjNBKCIlc1xuIiwgX19mdW5jX18pOwotCi0JcGFkYXB0ZXItPmJXcml0ZVBvcnRDYW5jZWwgPSB0cnVlOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShweG1pdGJ1ZiwgJnBhZGFwdGVyLT54bWl0cHJpdi54bWl0YnVmX2xpc3QsCi0JCQkgICAgbGlzdDIpIHsKLQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotCQkJaWYgKHB4bWl0YnVmLT5weG1pdF91cmJbal0pCi0JCQkJdXNiX2tpbGxfdXJiKHB4bWl0YnVmLT5weG1pdF91cmJbal0pOwotCQl9Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50cnkocHhtaXRidWYsICZwYWRhcHRlci0+eG1pdHByaXYueG1pdGV4dGJ1Zl9saXN0LAotCQkJICAgIGxpc3QyKSB7Ci0JCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKLQkJCWlmIChweG1pdGJ1Zi0+cHhtaXRfdXJiW2pdKQotCQkJCXVzYl9raWxsX3VyYihweG1pdGJ1Zi0+cHhtaXRfdXJiW2pdKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3htaXRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3htaXRfbGludXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiZTcyYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC94bWl0X2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMiBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIF9YTUlUX09TREVQX0NfCi0KLSNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8d2lmaS5oPgotI2luY2x1ZGUgPG1sbWVfb3NkZXAuaD4KLSNpbmNsdWRlIDx4bWl0X29zZGVwLmg+Ci0jaW5jbHVkZSA8b3NkZXBfaW50Zi5oPgotCi1pbnQgcnR3X29zX3htaXRfcmVzb3VyY2VfYWxsb2MyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgICBzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmLCB1MzIgYWxsb2Nfc3opCi17Ci0JaW50IGk7Ci0KLQlweG1pdGJ1Zi0+cGFsbG9jYXRlZF9idWYgPSBremFsbG9jKGFsbG9jX3N6LCBHRlBfS0VSTkVMKTsKLQlpZiAocHhtaXRidWYtPnBhbGxvY2F0ZWRfYnVmID09IE5VTEwpCi0JCXJldHVybiBfRkFJTDsKLQotCXB4bWl0YnVmLT5wYnVmID0gUFRSX0FMSUdOKHB4bWl0YnVmLT5wYWxsb2NhdGVkX2J1ZiwgWE1JVEJVRl9BTElHTl9TWik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXB4bWl0YnVmLT5weG1pdF91cmJbaV0gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIXB4bWl0YnVmLT5weG1pdF91cmJbaV0pIHsKLQkJCURCR184NzIzQSgicHhtaXRidWYtPnB4bWl0X3VyYltpXT09TlVMTCIpOwotCQkJcmV0dXJuIF9GQUlMOwotCQl9Ci0JfQotCXJldHVybiBfU1VDQ0VTUzsKLX0KLQotdm9pZCBydHdfb3NfeG1pdF9yZXNvdXJjZV9mcmVlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCXVzYl9mcmVlX3VyYihweG1pdGJ1Zi0+cHhtaXRfdXJiW2ldKTsKLQlrZnJlZShweG1pdGJ1Zi0+cGFsbG9jYXRlZF9idWYpOwotfQotCi0jZGVmaW5lIFdNTV9YTUlUX1RIUkVTSE9MRAkoTlJfWE1JVEZSQU1FKjIvNSkKLQotdm9pZCBydHdfb3NfcGt0X2NvbXBsZXRlMjNhKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBza19idWZmICpwa3QpCi17Ci0Jc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQl1MTYJcXVldWU7Ci0KLQlxdWV1ZSA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhwa3QpOwotCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LndpZmlfc3BlYykgewotCQlpZiAoX19uZXRpZl9zdWJxdWV1ZV9zdG9wcGVkKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSkgJiYKLQkJICAgIChweG1pdHByaXYtPmh3eG1pdHNbcXVldWVdLmFjY250IDwgV01NX1hNSVRfVEhSRVNIT0xEKSkKLQkJCW5ldGlmX3dha2Vfc3VicXVldWUocGFkYXB0ZXItPnBuZXRkZXYsIHF1ZXVlKTsKLQl9IGVsc2UgewotCQlpZiAoX19uZXRpZl9zdWJxdWV1ZV9zdG9wcGVkKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSkpCi0JCQluZXRpZl93YWtlX3N1YnF1ZXVlKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSk7Ci0JfQotCWRldl9rZnJlZV9za2JfYW55KHBrdCk7Ci19Ci0KLXZvaWQgcnR3X29zX3htaXRfY29tcGxldGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgc3RydWN0IHhtaXRfZnJhbWUgKnB4ZnJhbWUpCi17Ci0JaWYgKHB4ZnJhbWUtPnBrdCkKLQkJcnR3X29zX3BrdF9jb21wbGV0ZTIzYShwYWRhcHRlciwgcHhmcmFtZS0+cGt0KTsKLQotCXB4ZnJhbWUtPnBrdCA9IE5VTEw7Ci19Ci0KLXZvaWQgcnR3X29zX3htaXRfc2NoZWR1bGUyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKLXsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXY7Ci0KLQlpZiAoIXBhZGFwdGVyKQotCQlyZXR1cm47Ci0JcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKLQotCXNwaW5fbG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLQotCWlmIChydHdfdHhmcmFtZXNfcGVuZGluZzIzYShwYWRhcHRlcikpCi0JCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnB4bWl0cHJpdi0+eG1pdF90YXNrbGV0KTsKLQlzcGluX3VubG9ja19iaCgmcHhtaXRwcml2LT5sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgcnR3X2NoZWNrX3htaXRfcmVzb3VyY2Uoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnBrdCkKLXsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCXUxNglxdWV1ZTsKLQotCXF1ZXVlID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHBrdCk7Ci0JaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjKSB7Ci0JCS8qIE5vIGZyZWUgc3BhY2UgZm9yIFR4LCB0eF93b3JrZXIgaXMgdG9vIHNsb3cgKi8KLQkJaWYgKHB4bWl0cHJpdi0+aHd4bWl0c1txdWV1ZV0uYWNjbnQgPiBXTU1fWE1JVF9USFJFU0hPTEQpCi0JCQluZXRpZl9zdG9wX3N1YnF1ZXVlKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSk7Ci0JfSBlbHNlIHsKLQkJaWYgKHB4bWl0cHJpdi0+ZnJlZV94bWl0ZnJhbWVfY250IDw9IDQpIHsKLQkJCWlmICghbmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHBhZGFwdGVyLT5wbmV0ZGV2LCBxdWV1ZSkpKQotCQkJCW5ldGlmX3N0b3Bfc3VicXVldWUocGFkYXB0ZXItPnBuZXRkZXYsIHF1ZXVlKTsKLQkJfQotCX0KLX0KLQotaW50IHJ0d194bWl0MjNhX2VudHJ5MjNhKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKLQlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmcGFkYXB0ZXItPnhtaXRwcml2OwotCWludCByZXMgPSAwOwotCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICIreG1pdF9lbnJ5XG4iKTsKLQotCWlmICghcnR3X2lmX3VwMjNhKHBhZGFwdGVyKSkgewotCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAicnR3X3htaXQyM2FfZW50cnkyM2E6IHJ0d19pZl91cDIzYSBmYWlsXG4iKTsKLQkJZ290byBkcm9wX3BhY2tldDsKLQl9Ci0KLQlydHdfY2hlY2tfeG1pdF9yZXNvdXJjZShwYWRhcHRlciwgc2tiKTsKLQotCXJlcyA9IHJ0d194bWl0MjNhKHBhZGFwdGVyLCBza2IpOwotCWlmIChyZXMgPCAwKQotCQlnb3RvIGRyb3BfcGFja2V0OwotCi0JcHhtaXRwcml2LT50eF9wa3RzKys7Ci0JUlRfVFJBQ0UoX21vZHVsZV94bWl0X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgInJ0d194bWl0MjNhX2VudHJ5MjNhOiB0eF9wa3RzPSVkXG4iLAotCQkgKHUzMilweG1pdHByaXYtPnR4X3BrdHMpOwotCWdvdG8gZXhpdDsKLQotZHJvcF9wYWNrZXQ6Ci0JcHhtaXRwcml2LT50eF9kcm9wKys7Ci0JZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfbm90aWNlXywKLQkJICJydHdfeG1pdDIzYV9lbnRyeTIzYTogZHJvcCwgdHhfZHJvcD0lZFxuIiwKLQkJICh1MzIpcHhtaXRwcml2LT50eF9kcm9wKTsKLWV4aXQ6Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuYwppbmRleCAwZjBjZDRhLi5mMjdkZjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmMKQEAgLTYzLDEyICs2MywxMiBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19CWVRFX0NOVCwgMHhGRiwgY250KTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNfQ0ZHLCAweEZGLCBjZmcpOwogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLAotCQkweDAxLCBQSU5HUE9OR19CVUZGRVIpOworCQkgICAgIDB4MDEsIFBJTkdQT05HX0JVRkZFUik7CiAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNGRVIsCi0JCTB4RkYsIE1TX1RSQU5TRkVSX1NUQVJUIHwgdHJhbnNfbW9kZSk7CisJCSAgICAgMHhGRiwgTVNfVFJBTlNGRVJfU1RBUlQgfCB0cmFuc19tb2RlKTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgTVNfVFJBTlNGRVIsCi0JCU1TX1RSQU5TRkVSX0VORCwgTVNfVFJBTlNGRVJfRU5EKTsKKwkJICAgICBNU19UUkFOU0ZFUl9FTkQsIE1TX1RSQU5TRkVSX0VORCk7CiAKIAlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBNU19UUkFOU19DRkcsIDAsIDApOwogCkBAIC0xMDksOCArMTA5LDggQEAKIH0KIAogc3RhdGljIGludCBtc190cmFuc2Zlcl9kYXRhKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IHRyYW5zX21vZGUsCi0JCQl1OCB0cGMsIHUxNiBzZWNfY250LCB1OCBjZmcsIGJvb2wgbW9kZV8yaywKLQkJCWludCB1c2Vfc2csIHZvaWQgKmJ1ZiwgaW50IGJ1Zl9sZW4pCisJCQkgICAgdTggdHBjLCB1MTYgc2VjX2NudCwgdTggY2ZnLCBib29sIG1vZGVfMmssCisJCQkgICAgaW50IHVzZV9zZywgdm9pZCAqYnVmLCBpbnQgYnVmX2xlbikKIHsKIAlpbnQgcmV0dmFsOwogCXU4IHZhbCwgZXJyX2NvZGUgPSAwOwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX0JZVEVfQ05ULCAweEZGLCBjbnQpOwogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUkFOU19DRkcsIDB4RkYsIGNmZyk7CiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfREFUQV9TT1VSQ0UsCi0JCTB4MDEsIFBJTkdQT05HX0JVRkZFUik7CisJCSAgICAgMHgwMSwgUElOR1BPTkdfQlVGRkVSKTsKIAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELAogCQkgICAgIE1TX1RSQU5TRkVSLCAweEZGLCBNU19UUkFOU0ZFUl9TVEFSVCB8IE1TX1RNX1dSSVRFX0JZVEVTKTsKQEAgLTI1Myw3ICsyNTMsNyBAQAogfQogCiBzdGF0aWMgaW50IG1zX3JlYWRfYnl0ZXMoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwKLQkJCXU4IHRwYywgdTggY250LCB1OCBjZmcsIHU4ICpkYXRhLCBpbnQgZGF0YV9sZW4pCisJCQkgdTggdHBjLCB1OCBjbnQsIHU4IGNmZywgdTggKmRhdGEsIGludCBkYXRhX2xlbikKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwogCWludCByZXR2YWwsIGk7CkBAIC0yNzAsMTIgKzI3MCwxMiBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19CWVRFX0NOVCwgMHhGRiwgY250KTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNfQ0ZHLCAweEZGLCBjZmcpOwogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLAotCQkweDAxLCBQSU5HUE9OR19CVUZGRVIpOworCQkgICAgIDB4MDEsIFBJTkdQT05HX0JVRkZFUik7CiAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNGRVIsIDB4RkYsCi0JCU1TX1RSQU5TRkVSX1NUQVJUIHwgTVNfVE1fUkVBRF9CWVRFUyk7CisJCSAgICAgTVNfVFJBTlNGRVJfU1RBUlQgfCBNU19UTV9SRUFEX0JZVEVTKTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgTVNfVFJBTlNGRVIsCi0JCU1TX1RSQU5TRkVSX0VORCwgTVNfVFJBTlNGRVJfRU5EKTsKKwkJICAgICBNU19UUkFOU0ZFUl9FTkQsIE1TX1RSQU5TRkVSX0VORCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZGF0YV9sZW4gLSAxOyBpKyspCiAJCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgaSwgMCwgMCk7CkBAIC0yODQsNyArMjg0LDcgQEAKIAkJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgUFBCVUZfQkFTRTIgKyBkYXRhX2xlbiwgMCwgMCk7CiAJZWxzZQogCQlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIGRhdGFfbGVuIC0gMSwKLQkJCTAsIDApOworCQkJICAgICAwLCAwKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgTVNfQ0FSRCwgNTAwMCk7CiAJaWYgKHJldHZhbCA8IDApIHsKQEAgLTMzNCw4ICszMzQsOCBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotc3RhdGljIGludCBtc19zZXRfcndfcmVnX2FkZHIoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwKLQkJdTggcmVhZF9zdGFydCwgdTggcmVhZF9jbnQsIHU4IHdyaXRlX3N0YXJ0LCB1OCB3cml0ZV9jbnQpCitzdGF0aWMgaW50IG1zX3NldF9yd19yZWdfYWRkcihzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCByZWFkX3N0YXJ0LAorCQkJICAgICAgdTggcmVhZF9jbnQsIHU4IHdyaXRlX3N0YXJ0LCB1OCB3cml0ZV9jbnQpCiB7CiAJaW50IHJldHZhbCwgaTsKIAl1OCBkYXRhWzRdOwpAQCAtMTQxNyw3ICsxNDE3LDYgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogc3RhdGljIGludCBtc19yZWFkX2V4dHJhX2RhdGEoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwKIAkJdTE2IGJsb2NrX2FkZHIsIHU4IHBhZ2VfbnVtLCB1OCAqYnVmLCBpbnQgYnVmX2xlbikKIHsKQEAgLTE1ODIsNyArMTU4MSw2IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KIHN0YXRpYyBpbnQgbXNfcmVhZF9wYWdlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUxNiBibG9ja19hZGRyLCB1OCBwYWdlX251bSkKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwpAQCAtMTY2Nyw3ICsxNjY1LDYgQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKLQogc3RhdGljIGludCBtc19zZXRfYmFkX2Jsb2NrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUxNiBwaHlfYmxrKQogewogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJmNoaXAtPm1zX2NhcmQ7CkBAIC0xNzM4LDcgKzE3MzUsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBzdGF0aWMgaW50IG1zX2VyYXNlX2Jsb2NrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUxNiBwaHlfYmxrKQogewogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJmNoaXAtPm1zX2NhcmQ7CkBAIC0xODA4LDcgKzE4MDQsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBzdGF0aWMgdm9pZCBtc19zZXRfcGFnZV9zdGF0dXModTE2IGxvZ19ibGssIHU4IHR5cGUsIHU4ICpleHRyYSwgaW50IGV4dHJhX2xlbikKIHsKIAlpZiAoIWV4dHJhIHx8IChleHRyYV9sZW4gPCBNU19FWFRSQV9TSVpFKSkKQEAgLTIxNTIsNyArMjE0Nyw2IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KIHN0YXRpYyBpbnQgcmVzZXRfbXMoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwpAQCAtMjQ3MSw3ICsyNDY1LDcgQEAKIAlpZiAoIW1zX2NhcmQtPnNlZ21lbnQpCiAJCXJldHVybiAweEZGRkY7CiAKLQlzZWdtZW50ID0gJihtc19jYXJkLT5zZWdtZW50W3NlZ19ub10pOworCXNlZ21lbnQgPSAmbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dOwogCiAJaWYgKHNlZ21lbnQtPmwycF90YWJsZSkKIAkJcmV0dXJuIHNlZ21lbnQtPmwycF90YWJsZVtsb2dfb2ZmXTsKQEAgLTI0ODgsNyArMjQ4Miw3IEBACiAJaWYgKCFtc19jYXJkLT5zZWdtZW50KQogCQlyZXR1cm47CiAKLQlzZWdtZW50ID0gJihtc19jYXJkLT5zZWdtZW50W3NlZ19ub10pOworCXNlZ21lbnQgPSAmbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dOwogCWlmIChzZWdtZW50LT5sMnBfdGFibGUpCiAJCXNlZ21lbnQtPmwycF90YWJsZVtsb2dfb2ZmXSA9IHBoeV9ibGs7CiB9CkBAIC0yNTAwLDcgKzI0OTQsNyBAQAogCWludCBzZWdfbm87CiAKIAlzZWdfbm8gPSAoaW50KXBoeV9ibGsgPj4gOTsKLQlzZWdtZW50ID0gJihtc19jYXJkLT5zZWdtZW50W3NlZ19ub10pOworCXNlZ21lbnQgPSAmbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dOwogCiAJc2VnbWVudC0+ZnJlZV90YWJsZVtzZWdtZW50LT5zZXRfaW5kZXgrK10gPSBwaHlfYmxrOwogCWlmIChzZWdtZW50LT5zZXRfaW5kZXggPj0gTVNfRlJFRV9UQUJMRV9DTlQpCkBAIC0yNTE1LDcgKzI1MDksNyBAQAogCXN0cnVjdCB6b25lX2VudHJ5ICpzZWdtZW50OwogCXUxNiBwaHlfYmxrOwogCi0Jc2VnbWVudCA9ICYobXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dKTsKKwlzZWdtZW50ID0gJm1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXTsKIAogCWlmIChzZWdtZW50LT51bnVzZWRfYmxrX2NudCA8PSAwKQogCQlyZXR1cm4gMHhGRkZGOwpAQCAtMjU0NCw3ICsyNTM4LDcgQEAKIAl1MTYgdG1wX2JsazsKIAogCXNlZ19ubyA9IChpbnQpcGh5X2JsayA+PiA5OwotCXNlZ21lbnQgPSAmKG1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXSk7CisJc2VnbWVudCA9ICZtc19jYXJkLT5zZWdtZW50W3NlZ19ub107CiAJdG1wX2JsayA9IHNlZ21lbnQtPmwycF90YWJsZVtsb2dfb2ZmXTsKIAogCWlmICh1czEgIT0gdXMyKSB7CkBAIC0yNjA4LDcgKzI2MDIsNyBAQAogCWVsc2UKIAkJdGFibGVfc2l6ZSA9IDQ5NjsKIAotCXNlZ21lbnQgPSAmKG1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXSk7CisJc2VnbWVudCA9ICZtc19jYXJkLT5zZWdtZW50W3NlZ19ub107CiAKIAlpZiAoIXNlZ21lbnQtPmwycF90YWJsZSkgewogCQlzZWdtZW50LT5sMnBfdGFibGUgPSB2bWFsbG9jKHRhYmxlX3NpemUgKiAyKTsKQEAgLTI3MTcsNyArMjcxMSw3IEBACiAJCXVzMiA9IGV4dHJhWzBdICYgMHgxMDsKIAogCQkodm9pZCltc19hcmJpdHJhdGVfbDJwKGNoaXAsIHBoeV9ibGssCi0JCQkJbG9nX2Jsay1tc19zdGFydF9pZHhbc2VnX25vXSwgdXMxLCB1czIpOworCQkJCWxvZ19ibGsgLSBtc19zdGFydF9pZHhbc2VnX25vXSwgdXMxLCB1czIpOwogCQljb250aW51ZTsKIAl9CiAKQEAgLTI4MDksNyArMjgwMyw2IEBACiAJcmV0dXJuIFNUQVRVU19GQUlMOwogfQogCi0KIGludCByZXNldF9tc19jYXJkKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmY2hpcC0+bXNfY2FyZDsKQEAgLTI4OTYsNyArMjg4OSw2IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KIHZvaWQgbXNwcm9fc3RvcF9zZXFfbW9kZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJmNoaXAtPm1zX2NhcmQ7CkBAIC0zMzEyLDcgKzMzMDQsNiBAQAogCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KIAotCiBzdGF0aWMgaW50IG1zX3JlYWRfbXVsdGlwbGVfcGFnZXMoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTE2IHBoeV9ibGssCiAJCQkJdTE2IGxvZ19ibGssIHU4IHN0YXJ0X3BhZ2UsIHU4IGVuZF9wYWdlLAogCQkJCXU4ICpidWYsIHVuc2lnbmVkIGludCAqaW5kZXgsCkBAIC0zNzE5LDcgKzM3MTAsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBzdGF0aWMgaW50IG1zX2ZpbmlzaF93cml0ZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1MTYgb2xkX2JsaywgdTE2IG5ld19ibGssCiAJCXUxNiBsb2dfYmxrLCB1OCBwYWdlX29mZikKIHsKQEAgLTM3NzAsNyArMzc2MCw3IEBACiBpbnQgbXNfZGVsYXlfd3JpdGUoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwotCXN0cnVjdCBtc19kZWxheV93cml0ZV90YWcgKmRlbGF5X3dyaXRlID0gJihtc19jYXJkLT5kZWxheV93cml0ZSk7CisJc3RydWN0IG1zX2RlbGF5X3dyaXRlX3RhZyAqZGVsYXlfd3JpdGUgPSAmbXNfY2FyZC0+ZGVsYXlfd3JpdGU7CiAJaW50IHJldHZhbDsKIAogCWlmIChkZWxheV93cml0ZS0+ZGVsYXlfd3JpdGVfZmxhZykgewpAQCAtMzgxNiw3ICszODA2LDcgQEAKIAl1OCBzdGFydF9wYWdlLCBlbmRfcGFnZSA9IDAsIHBhZ2VfY250OwogCXU4ICpwdHI7CiAjaWZkZWYgTVNfREVMQVlfV1JJVEUKLQlzdHJ1Y3QgbXNfZGVsYXlfd3JpdGVfdGFnICpkZWxheV93cml0ZSA9ICYobXNfY2FyZC0+ZGVsYXlfd3JpdGUpOworCXN0cnVjdCBtc19kZWxheV93cml0ZV90YWcgKmRlbGF5X3dyaXRlID0gJm1zX2NhcmQtPmRlbGF5X3dyaXRlOwogI2VuZGlmCiAKIAltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOwpAQCAtMzk5Niw3ICszOTg2LDcgQEAKIAogCQlmb3IgKHNlZ19ubyA9IDA7IHNlZ19ubyA8IEFSUkFZX1NJWkUobXNfc3RhcnRfaWR4KSAtIDE7CiAJCQkJc2VnX25vKyspIHsKLQkJCWlmIChsb2dfYmxrIDwgbXNfc3RhcnRfaWR4W3NlZ19ubysxXSkKKwkJCWlmIChsb2dfYmxrIDwgbXNfc3RhcnRfaWR4W3NlZ19ubyArIDFdKQogCQkJCWJyZWFrOwogCQl9CiAKQEAgLTQwODIsMTMgKzQwNzIsMTIgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi0KIHZvaWQgbXNfZnJlZV9sMnBfdGJsKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmY2hpcC0+bXNfY2FyZDsKIAlpbnQgaSA9IDA7CiAKLQlpZiAobXNfY2FyZC0+c2VnbWVudCAhPSBOVUxMKSB7CisJaWYgKG1zX2NhcmQtPnNlZ21lbnQpIHsKIAkJZm9yIChpID0gMDsgaSA8IG1zX2NhcmQtPnNlZ21lbnRfY250OyBpKyspIHsKIAkJCXZmcmVlKG1zX2NhcmQtPnNlZ21lbnRbaV0ubDJwX3RhYmxlKTsKIAkJCW1zX2NhcmQtPnNlZ21lbnRbaV0ubDJwX3RhYmxlID0gTlVMTDsKQEAgLTQzMTMsNyArNDMwMiw3IEBACiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7CiAJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCWdvdG8gR2V0RUtCRmluaXNoOworCQlnb3RvIGZyZWVfYnVmZmVyOwogCX0KIAogCXJldHZhbCA9IG1zX3RyYW5zZmVyX2RhdGEoY2hpcCwgTVNfVE1fQVVUT19SRUFELCBQUk9fUkVBRF9MT05HX0RBVEEsCkBAIC00MzIyLDE5ICs0MzExLDIwIEBACiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKIAkJcnRzeF90cmFjZShjaGlwKTsKLQkJZ290byBHZXRFS0JGaW5pc2g7CisJCWdvdG8gZnJlZV9idWZmZXI7CiAJfQogCWlmIChjaGVja19tc19lcnIoY2hpcCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOwogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwogCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCXJldHZhbCA9IFNUQVRVU19GQUlMOworCQlnb3RvIGZyZWVfYnVmZmVyOwogCX0KIAogCWJ1ZmZsZW4gPSBtaW5fdChpbnQsIDEwNTIsIHNjc2lfYnVmZmxlbihzcmIpKTsKIAlydHN4X3N0b3Jfc2V0X3hmZXJfYnVmKGJ1ZiwgYnVmZmxlbiwgc3JiKTsKIAotR2V0RUtCRmluaXNoOgorZnJlZV9idWZmZXI6CiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtNDU2Niw3ICs0NTU2LDcgQEAKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwogCQlydHN4X3RyYWNlKGNoaXApOwotCQlnb3RvIEdldElDVkZpbmlzaDsKKwkJZ290byBmcmVlX2J1ZmZlcjsKIAl9CiAKIAlyZXR2YWwgPSBtc190cmFuc2Zlcl9kYXRhKGNoaXAsIE1TX1RNX0FVVE9fUkVBRCwgUFJPX1JFQURfTE9OR19EQVRBLApAQCAtNDU3NSwxOSArNDU2NSwyMCBAQAogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKIAkJcnRzeF90cmFjZShjaGlwKTsKLQkJZ290byBHZXRJQ1ZGaW5pc2g7CisJCWdvdG8gZnJlZV9idWZmZXI7CiAJfQogCWlmIChjaGVja19tc19lcnIoY2hpcCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CiAJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJcmV0dmFsID0gU1RBVFVTX0ZBSUw7CisJCWdvdG8gZnJlZV9idWZmZXI7CiAJfQogCiAJYnVmZmxlbiA9IG1pbl90KGludCwgMTAyOCwgc2NzaV9idWZmbGVuKHNyYikpOwogCXJ0c3hfc3Rvcl9zZXRfeGZlcl9idWYoYnVmLCBidWZmbGVuLCBzcmIpOwogCi1HZXRJQ1ZGaW5pc2g6CitmcmVlX2J1ZmZlcjoKIAlrZnJlZShidWYpOwogCXJldHVybiByZXR2YWw7CiB9CkBAIC00NjU3LDggKzQ2NDgsOCBAQAogCiAJCXJ0c3hfc2VuZF9jbWRfbm9fd2FpdChjaGlwKTsKIAotCQlyZXR2YWwgPSBydHN4X3RyYW5zZmVyX2RhdGEoY2hpcCwgTVNfQ0FSRCwgYnVmICsgNCArIGkqNTEyLAotCQkJCQk1MTIsIDAsIERNQV9UT19ERVZJQ0UsIDMwMDApOworCQlyZXR2YWwgPSBydHN4X3RyYW5zZmVyX2RhdGEoY2hpcCwgTVNfQ0FSRCwgYnVmICsgNCArIGkgKiA1MTIsCisJCQkJCSAgICA1MTIsIDAsIERNQV9UT19ERVZJQ0UsIDMwMDApOwogCQlpZiAoKHJldHZhbCA8IDApIHx8IGNoZWNrX21zX2VycihjaGlwKSkgewogCQkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKIAkJCWlmIChtc19jYXJkLT5tZ19hdXRoID09IDApIHsKQEAgLTQ3MDUsNyArNDY5Niw3IEBACiAKIHZvaWQgbXNfY2xlYW51cF93b3JrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7Ci0Jc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJmNoaXAtPm1zX2NhcmQ7CiAKIAlpZiAoQ0hLX01TUFJPKG1zX2NhcmQpKSB7CiAJCWlmIChtc19jYXJkLT5zZXFfbW9kZSkgewpAQCAtNDc3MCw3ICs0NzYxLDcgQEAKIAogaW50IHJlbGVhc2VfbXNfY2FyZChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewotCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICZjaGlwLT5tc19jYXJkOwogCWludCByZXR2YWw7CiAKICNpZmRlZiBNU19ERUxBWV9XUklURQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmgKaW5kZXggZDkxOTE3MC4uZDc2ODYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5oCkBAIC0xMjUsNyArMTI1LDYgQEAKICNkZWZpbmUgUHJvX0NhdGFnb3J5UmVnCQkweDA2CiAjZGVmaW5lIFByb19DbGFzc1JlZwkJMHgwNwogCi0KICNkZWZpbmUgUHJvX1N5c3RlbVBhcm0JCTB4MTAKICNkZWZpbmUgUHJvX0RhdGFDb3VudDEJCTB4MTEKICNkZWZpbmUgUHJvX0RhdGFDb3VudDAJCTB4MTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYwppbmRleCAyNWQwOTVhLi41ZDY1YTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5jCkBAIC0zNCwyNyArMzQsMjcgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBkZWxheV91c2UgPSAxOwotbW9kdWxlX3BhcmFtKGRlbGF5X3VzZSwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGRlbGF5X3VzZSwgdWludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlbGF5X3VzZSwgInNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIHVzaW5nIGEgbmV3IGRldmljZSIpOwogCiBzdGF0aWMgaW50IHNzX2VuOwotbW9kdWxlX3BhcmFtKHNzX2VuLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShzc19lbiwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc3NfZW4sICJlbmFibGUgc2VsZWN0aXZlIHN1c3BlbmQiKTsKIAogc3RhdGljIGludCBzc19pbnRlcnZhbCA9IDUwOwotbW9kdWxlX3BhcmFtKHNzX2ludGVydmFsLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShzc19pbnRlcnZhbCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc3NfaW50ZXJ2YWwsICJJbnRlcnZhbCB0byBlbnRlciBzcyBzdGF0ZSBpbiBzZWNvbmRzIik7CiAKIHN0YXRpYyBpbnQgYXV0b19kZWxpbmtfZW47Ci1tb2R1bGVfcGFyYW0oYXV0b19kZWxpbmtfZW4sIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGF1dG9fZGVsaW5rX2VuLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhdXRvX2RlbGlua19lbiwgImVuYWJsZSBhdXRvIGRlbGluayIpOwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBhc3BtX2wwc19sMV9lbjsKLW1vZHVsZV9wYXJhbShhc3BtX2wwc19sMV9lbiwgYnl0ZSwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGFzcG1fbDBzX2wxX2VuLCBieXRlLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYXNwbV9sMHNfbDFfZW4sICJlbmFibGUgZGV2aWNlIGFzcG0iKTsKIAogc3RhdGljIGludCBtc2lfZW47Ci1tb2R1bGVfcGFyYW0obXNpX2VuLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShtc2lfZW4sIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1zaV9lbiwgImVuYWJsZSBtc2kiKTsKIAogc3RhdGljIGlycXJldHVybl90IHJ0c3hfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCk7CkBAIC04MSwxNCArODEsMTYgQEAKIAogc3RhdGljIGludCBzbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewotCS8qIFNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgKGFsbCBidXQgdGhlIGxhc3QpIG11c3QgaGF2ZSBhIGxlbmd0aAorCS8qCisJICogU2NhdHRlci1nYXRoZXIgYnVmZmVycyAoYWxsIGJ1dCB0aGUgbGFzdCkgbXVzdCBoYXZlIGEgbGVuZ3RoCiAJICogZGl2aXNpYmxlIGJ5IHRoZSBidWxrIG1heHBhY2tldCBzaXplLiAgT3RoZXJ3aXNlIGEgZGF0YSBwYWNrZXQKIAkgKiB3b3VsZCBlbmQgdXAgYmVpbmcgc2hvcnQsIGNhdXNpbmcgYSBwcmVtYXR1cmUgZW5kIHRvIHRoZSBkYXRhCiAJICogdHJhbnNmZXIuICBTaW5jZSBoaWdoLXNwZWVkIGJ1bGsgcGlwZXMgaGF2ZSBhIG1heHBhY2tldCBzaXplCiAJICogb2YgNTEyLCB3ZSdsbCB1c2UgdGhhdCBhcyB0aGUgc2NzaSBkZXZpY2UgcXVldWUncyBETUEgYWxpZ25tZW50CiAJICogbWFzay4gIEd1YXJhbnRlZWluZyBwcm9wZXIgYWxpZ25tZW50IG9mIHRoZSBmaXJzdCBidWZmZXIgd2lsbAogCSAqIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0IGJlY2F1c2UsIGV4Y2VwdCBhdCB0aGUgYmVnaW5uaW5nIGFuZAotCSAqIHRoZSBlbmQsIHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgZm9sbG93IHBhZ2UgYm91bmRhcmllcy4gKi8KKwkgKiB0aGUgZW5kLCBzY2F0dGVyLWdhdGhlciBidWZmZXJzIGZvbGxvdyBwYWdlIGJvdW5kYXJpZXMuCisJICovCiAJYmxrX3F1ZXVlX2RtYV9hbGlnbm1lbnQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgKDUxMiAtIDEpKTsKIAogCS8qIFNldCB0aGUgU0NTSSBsZXZlbCB0byBhdCBsZWFzdCAyLiAgV2UnbGwgbGVhdmUgaXQgYXQgMyBpZiB0aGF0J3MKQEAgLTExMSw3ICsxMTMsNiBAQAogCXJldHVybiAwOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogL3Byb2Mvc2NzaS8gZnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzAsNyArMTMxLDcgQEAKIAlzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwID0gZGV2LT5jaGlwOwogCiAJLyogY2hlY2sgZm9yIHN0YXRlLXRyYW5zaXRpb24gZXJyb3JzICovCi0JaWYgKGNoaXAtPnNyYiAhPSBOVUxMKSB7CisJaWYgKGNoaXAtPnNyYikgewogCQlkZXZfZXJyKCZkZXYtPnBjaS0+ZGV2LCAiRXJyb3I6IGNoaXAtPnNyYiA9ICVwXG4iLAogCQkJY2hpcC0+c3JiKTsKIAkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CkBAIC0xODYsOCArMTg3LDEwIEBACiAJcmV0dXJuIFNVQ0NFU1M7CiB9CiAKLS8qIFRoaXMgaW52b2tlcyB0aGUgdHJhbnNwb3J0IHJlc2V0IG1lY2hhbmlzbSB0byByZXNldCB0aGUgc3RhdGUgb2YgdGhlCi0gKiBkZXZpY2UgKi8KKy8qCisgKiBUaGlzIGludm9rZXMgdGhlIHRyYW5zcG9ydCByZXNldCBtZWNoYW5pc20gdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZQorICogZGV2aWNlCisgKi8KIHN0YXRpYyBpbnQgZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKQEAgLTIwOSw3ICsyMTIsNiBAQAogCXJldHVybiByZXN1bHQgPCAwID8gRkFJTEVEIDogU1VDQ0VTUzsKIH0KIAotCiAvKgogICogdGhpcyBkZWZpbmVzIG91ciBob3N0IHRlbXBsYXRlLCB3aXRoIHdoaWNoIHdlJ2xsIGFsbG9jYXRlIGhvc3RzCiAgKi8KQEAgLTI1OSw3ICsyNjEsNiBAQAogCS5tb2R1bGUgPQkJCVRISVNfTU9EVUxFCiB9OwogCi0KIHN0YXRpYyBpbnQgcnRzeF9hY3F1aXJlX2lycShzdHJ1Y3QgcnRzeF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwID0gZGV2LT5jaGlwOwpAQCAtMjgyLDcgKzI4Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogaW50IHJ0c3hfcmVhZF9wY2lfY2ZnX2J5dGUodTggYnVzLCB1OCBkZXYsIHU4IGZ1bmMsIHU4IG9mZnNldCwgdTggKnZhbCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKQEAgLTUxNSw3ICs1MTUsNiBAQAogCWNvbXBsZXRlX2FuZF9leGl0KCZkZXYtPmNvbnRyb2xfZXhpdCwgMCk7CiB9CiAKLQogc3RhdGljIGludCBydHN4X3BvbGxpbmdfdGhyZWFkKHZvaWQgKl9fZGV2KQogewogCXN0cnVjdCBydHN4X2RldiAqZGV2ID0gX19kZXY7CkBAIC02MjUsNyArNjI0LDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLQogLyogUmVsZWFzZSBhbGwgb3VyIGR5bmFtaWMgcmVzb3VyY2VzICovCiBzdGF0aWMgdm9pZCBydHN4X3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBydHN4X2RldiAqZGV2KQogewpAQCAtNjYwLDE1ICs2NTgsMTkgQEAKIAlrZnJlZShkZXYtPmNoaXApOwogfQogCi0vKiBGaXJzdCBzdGFnZSBvZiBkaXNjb25uZWN0IHByb2Nlc3Npbmc6IHN0b3AgYWxsIGNvbW1hbmRzIGFuZCByZW1vdmUKLSAqIHRoZSBob3N0ICovCisvKgorICogRmlyc3Qgc3RhZ2Ugb2YgZGlzY29ubmVjdCBwcm9jZXNzaW5nOiBzdG9wIGFsbCBjb21tYW5kcyBhbmQgcmVtb3ZlCisgKiB0aGUgaG9zdAorICovCiBzdGF0aWMgdm9pZCBxdWllc2NlX2FuZF9yZW1vdmVfaG9zdChzdHJ1Y3QgcnRzeF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcnRzeF90b19ob3N0KGRldik7CiAJc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCA9IGRldi0+Y2hpcDsKIAotCS8qIFByZXZlbnQgbmV3IHRyYW5zZmVycywgc3RvcCB0aGUgY3VycmVudCBjb21tYW5kLCBhbmQKLQkgKiBpbnRlcnJ1cHQgYSBTQ1NJLXNjYW4gb3IgZGV2aWNlLXJlc2V0IGRlbGF5ICovCisJLyoKKwkgKiBQcmV2ZW50IG5ldyB0cmFuc2ZlcnMsIHN0b3AgdGhlIGN1cnJlbnQgY29tbWFuZCwgYW5kCisJICogaW50ZXJydXB0IGEgU0NTSS1zY2FuIG9yIGRldmljZS1yZXNldCBkZWxheQorCSAqLwogCW11dGV4X2xvY2soJmRldi0+ZGV2X211dGV4KTsKIAlzY3NpX2xvY2soaG9zdCk7CiAJcnRzeF9zZXRfc3RhdChjaGlwLCBSVFNYX1NUQVRfRElTQ09OTkVDVCk7CkBAIC02ODAsOSArNjgyLDExIEBACiAJLyogV2FpdCBzb21lIHRpbWUgdG8gbGV0IG90aGVyIHRocmVhZHMgZXhpc3QgKi8KIAl3YWl0X3RpbWVvdXQoMTAwKTsKIAotCS8qIHF1ZXVlY29tbWFuZCB3b24ndCBhY2NlcHQgYW55IG5ldyBjb21tYW5kcyBhbmQgdGhlIGNvbnRyb2wKKwkvKgorCSAqIHF1ZXVlY29tbWFuZCB3b24ndCBhY2NlcHQgYW55IG5ldyBjb21tYW5kcyBhbmQgdGhlIGNvbnRyb2wKIAkgKiB0aHJlYWQgd29uJ3QgZXhlY3V0ZSBhIHByZXZpb3VzbHktcXVldWVkIGNvbW1hbmQuICBJZiB0aGVyZQotCSAqIGlzIHN1Y2ggYSBjb21tYW5kIHBlbmRpbmcsIGNvbXBsZXRlIGl0IHdpdGggYW4gZXJyb3IuICovCisJICogaXMgc3VjaCBhIGNvbW1hbmQgcGVuZGluZywgY29tcGxldGUgaXQgd2l0aCBhbiBlcnJvci4KKwkgKi8KIAltdXRleF9sb2NrKCZkZXYtPmRldl9tdXRleCk7CiAJaWYgKGNoaXAtPnNyYikgewogCQljaGlwLT5zcmItPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OwpAQCAtNzAyLDggKzcwNiwxMCBAQAogewogCXJ0c3hfcmVsZWFzZV9yZXNvdXJjZXMoZGV2KTsKIAotCS8qIERyb3Agb3VyIHJlZmVyZW5jZSB0byB0aGUgaG9zdDsgdGhlIFNDU0kgY29yZSB3aWxsIGZyZWUgaXQKLQkgKiB3aGVuIHRoZSByZWZjb3VudCBiZWNvbWVzIDAuICovCisJLyoKKwkgKiBEcm9wIG91ciByZWZlcmVuY2UgdG8gdGhlIGhvc3Q7IHRoZSBTQ1NJIGNvcmUgd2lsbCBmcmVlIGl0CisJICogd2hlbiB0aGUgcmVmY291bnQgYmVjb21lcyAwLgorCSAqLwogCXNjc2lfaG9zdF9wdXQocnRzeF90b19ob3N0KGRldikpOwogfQogCkBAIC05NDIsOCArOTQ4LDEwIEBACiAKIAlydHN4X2luaXRfY2hpcChkZXYtPmNoaXApOwogCi0JLyogc2V0IHRoZSBzdXBwb3J0ZWQgbWF4X2x1biBhbmQgbWF4X2lkIGZvciB0aGUgc2NzaSBob3N0Ci0JICogTk9URTogdGhlIG1pbmltYWwgdmFsdWUgb2YgbWF4X2lkIGlzIDEgKi8KKwkvKgorCSAqIHNldCB0aGUgc3VwcG9ydGVkIG1heF9sdW4gYW5kIG1heF9pZCBmb3IgdGhlIHNjc2kgaG9zdAorCSAqIE5PVEU6IHRoZSBtaW5pbWFsIHZhbHVlIG9mIG1heF9pZCBpcyAxCisJICovCiAJaG9zdC0+bWF4X2lkID0gMTsKIAlob3N0LT5tYXhfbHVuID0gZGV2LT5jaGlwLT5tYXhfbHVuOwogCkBAIC05OTQsNyArMTAwMiw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotCiBzdGF0aWMgdm9pZCBydHN4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQogewogCXN0cnVjdCBydHN4X2RldiAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmgKaW5kZXggMTM5NjI2My4uZTcyNWIxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guaApAQCAtNzAsMTQgKzcwLDEzIEBACiAjZGVmaW5lIHJ0c3hfd3JpdGVfY29uZmlnX2J5dGUoY2hpcCwgd2hlcmUsIHZhbCkgXAogCXBjaV93cml0ZV9jb25maWdfYnl0ZSgoY2hpcCktPnJ0c3gtPnBjaSwgd2hlcmUsIHZhbCkKIAotI2RlZmluZSB3YWl0X3RpbWVvdXRfeCh0YXNrX3N0YXRlLCBtc2VjcykJCVwKLWRvIHsJCQkJCQkJXAotCQlzZXRfY3VycmVudF9zdGF0ZSgodGFza19zdGF0ZSkpOwlcCi0JCXNjaGVkdWxlX3RpbWVvdXQoKG1zZWNzKSAqIEhaIC8gMTAwMCk7CVwKKyNkZWZpbmUgd2FpdF90aW1lb3V0X3godGFza19zdGF0ZSwgbXNlY3MpCVwKK2RvIHsJCQkJCQlcCisJc2V0X2N1cnJlbnRfc3RhdGUoKHRhc2tfc3RhdGUpKTsJXAorCXNjaGVkdWxlX3RpbWVvdXQoKG1zZWNzKSAqIEhaIC8gMTAwMCk7CVwKIH0gd2hpbGUgKDApCiAjZGVmaW5lIHdhaXRfdGltZW91dChtc2VjcykJd2FpdF90aW1lb3V0X3goVEFTS19JTlRFUlJVUFRJQkxFLCAobXNlY3MpKQogCi0KICNkZWZpbmUgU1RBVEVfVFJBTlNfTk9ORQkwCiAjZGVmaW5lIFNUQVRFX1RSQU5TX0NNRAkJMQogI2RlZmluZSBTVEFURV9UUkFOU19CVUYJCTIKQEAgLTg5LDggKzg4LDYgQEAKIAogI2RlZmluZSBTQ1NJX0xVTihzcmIpCQkoKHNyYiktPmRldmljZS0+bHVuKQogCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgREVMQVlfUEFSQV9UOwotCiBzdHJ1Y3QgcnRzeF9jaGlwOwogCiBzdHJ1Y3QgcnRzeF9kZXYgewpAQCAtMTMxLDE2ICsxMjgsMTUgQEAKIAlzdHJ1Y3QgcnRzeF9jaGlwCSpjaGlwOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgcnRzeF9kZXYgcnRzeF9kZXZfdDsKLQogLyogQ29udmVydCBiZXR3ZWVuIHJ0c3hfZGV2IGFuZCB0aGUgY29ycmVzcG9uZGluZyBTY3NpX0hvc3QgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IFNjc2lfSG9zdCAqcnRzeF90b19ob3N0KHN0cnVjdCBydHN4X2RldiAqZGV2KQogewotCXJldHVybiBjb250YWluZXJfb2YoKHZvaWQgKikgZGV2LCBzdHJ1Y3QgU2NzaV9Ib3N0LCBob3N0ZGF0YSk7CisJcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKWRldiwgc3RydWN0IFNjc2lfSG9zdCwgaG9zdGRhdGEpOwogfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBydHN4X2RldiAqaG9zdF90b19ydHN4KHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCiB7Ci0JcmV0dXJuIChzdHJ1Y3QgcnRzeF9kZXYgKikgaG9zdC0+aG9zdGRhdGE7CisJcmV0dXJuIChzdHJ1Y3QgcnRzeF9kZXYgKilob3N0LT5ob3N0ZGF0YTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGdldF9jdXJyZW50X3RpbWUodTggKnRpbWV2YWxfYnVmLCBpbnQgYnVmX2xlbikKQEAgLTE2NSw4ICsxNjEsMTAgQEAKIAl0aW1ldmFsX2J1Zls3XSA9ICh1OCkodHZfdXNlYyk7CiB9CiAKLS8qIFRoZSBzY3NpX2xvY2soKSBhbmQgc2NzaV91bmxvY2soKSBtYWNyb3MgcHJvdGVjdCB0aGUgc21fc3RhdGUgYW5kIHRoZQotICogc2luZ2xlIHF1ZXVlIGVsZW1lbnQgc3JiIGZvciB3cml0ZSBhY2Nlc3MgKi8KKy8qCisgKiBUaGUgc2NzaV9sb2NrKCkgYW5kIHNjc2lfdW5sb2NrKCkgbWFjcm9zIHByb3RlY3QgdGhlIHNtX3N0YXRlIGFuZCB0aGUKKyAqIHNpbmdsZSBxdWV1ZSBlbGVtZW50IHNyYiBmb3Igd3JpdGUgYWNjZXNzCisgKi8KICNkZWZpbmUgc2NzaV91bmxvY2soaG9zdCkJc3Bpbl91bmxvY2tfaXJxKGhvc3QtPmhvc3RfbG9jaykKICNkZWZpbmUgc2NzaV9sb2NrKGhvc3QpCQlzcGluX2xvY2tfaXJxKGhvc3QtPmhvc3RfbG9jaykKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYwppbmRleCAyMzE4MzNhLi45NzcxNzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuYwpAQCAtNjMxLDIxICs2MzEsMjEgQEAKIGludCBzd2l0Y2hfc3NjX2Nsb2NrKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGludCBjbGspCiB7CiAJaW50IHJldHZhbDsKLQl1OCBOID0gKHU4KShjbGsgLSAyKSwgbWluX04sIG1heF9OOworCXU4IG4gPSAodTgpKGNsayAtIDIpLCBtaW5fbiwgbWF4X247CiAJdTggbWN1X2NudCwgZGl2LCBtYXhfZGl2LCBzc2NfZGVwdGgsIHNzY19kZXB0aF9tYXNrOwogCWludCBzZF92cGNsa19waGFzZV9yZXNldCA9IDA7CiAKIAlpZiAoY2hpcC0+Y3VyX2NsayA9PSBjbGspCiAJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIAotCW1pbl9OID0gNjA7Ci0JbWF4X04gPSAxMjA7CisJbWluX24gPSA2MDsKKwltYXhfbiA9IDEyMDsKIAltYXhfZGl2ID0gQ0xLX0RJVl80OwogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlN3aXRjaCBTU0MgY2xvY2sgdG8gJWRNSHogKGN1cl9jbGsgPSAlZClcbiIsCiAJCWNsaywgY2hpcC0+Y3VyX2Nsayk7CiAKLQlpZiAoKGNsayA8PSAyKSB8fCAoTiA+IG1heF9OKSkgeworCWlmICgoY2xrIDw9IDIpIHx8IChuID4gbWF4X24pKSB7CiAJCXJ0c3hfdHJhY2UoY2hpcCk7CiAJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CkBAIC02NTUsMTUgKzY1NSwxNSBAQAogCQltY3VfY250ID0gNzsKIAogCWRpdiA9IENMS19ESVZfMTsKLQl3aGlsZSAoKE4gPCBtaW5fTikgJiYgKGRpdiA8IG1heF9kaXYpKSB7Ci0JCU4gPSAoTiArIDIpICogMiAtIDI7CisJd2hpbGUgKChuIDwgbWluX24pICYmIChkaXYgPCBtYXhfZGl2KSkgeworCQluID0gKG4gKyAyKSAqIDIgLSAyOwogCQlkaXYrKzsKIAl9Ci0JZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIk4gPSAlZCwgZGl2ID0gJWRcbiIsIE4sIGRpdik7CisJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIm4gPSAlZCwgZGl2ID0gJWRcbiIsIG4sIGRpdik7CiAKIAlpZiAoY2hpcC0+c3NjX2VuKSB7CiAJCXNzY19kZXB0aCA9IDB4MDE7Ci0JCU4gLT0gMjsKKwkJbiAtPSAyOwogCX0gZWxzZSB7CiAJCXNzY19kZXB0aCA9IDA7CiAJfQpAQCAtNjc3LDcgKzY3Nyw3IEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENMS19ESVYsIDB4RkYsIChkaXYgPDwgNCkgfCBtY3VfY250KTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU1NDX0NUTDEsIFNTQ19SU1RCLCAwKTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU1NDX0NUTDIsIHNzY19kZXB0aF9tYXNrLCBzc2NfZGVwdGgpOwotCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTU0NfRElWX05fMCwgMHhGRiwgTik7CisJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNTQ19ESVZfTl8wLCAweEZGLCBuKTsKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU1NDX0NUTDEsIFNTQ19SU1RCLCBTU0NfUlNUQik7CiAJaWYgKHNkX3ZwY2xrX3BoYXNlX3Jlc2V0KSB7CiAJCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9WUENMSzBfQ1RMLApAQCAtMTAyNywyNiArMTAyNywyNiBAQAogCiAJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7CiAJCW1hc2sgPSBDQVJEX1NIQVJFX01BU0s7Ci0JCWlmIChjYXJkID09IFNEX0NBUkQpCisJCWlmIChjYXJkID09IFNEX0NBUkQpIHsKIAkJCXZhbHVlID0gQ0FSRF9TSEFSRV80OF9TRDsKLQkJZWxzZSBpZiAoY2FyZCA9PSBNU19DQVJEKQorCQl9IGVsc2UgaWYgKGNhcmQgPT0gTVNfQ0FSRCkgewogCQkJdmFsdWUgPSBDQVJEX1NIQVJFXzQ4X01TOwotCQllbHNlIGlmIChjYXJkID09IFhEX0NBUkQpCisJCX0gZWxzZSBpZiAoY2FyZCA9PSBYRF9DQVJEKSB7CiAJCQl2YWx1ZSA9IENBUkRfU0hBUkVfNDhfWEQ7Ci0JCWVsc2UgeworCQl9IGVsc2UgewogCQkJcnRzeF90cmFjZShjaGlwKTsKIAkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJfSBlbHNlIGlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkgewogCQltYXNrID0gMHgwMzsKLQkJaWYgKGNhcmQgPT0gU0RfQ0FSRCkKKwkJaWYgKGNhcmQgPT0gU0RfQ0FSRCkgewogCQkJdmFsdWUgPSBDQVJEX1NIQVJFX0JBUk9TU0FfU0Q7Ci0JCWVsc2UgaWYgKGNhcmQgPT0gTVNfQ0FSRCkKKwkJfSBlbHNlIGlmIChjYXJkID09IE1TX0NBUkQpIHsKIAkJCXZhbHVlID0gQ0FSRF9TSEFSRV9CQVJPU1NBX01TOwotCQllbHNlIGlmIChjYXJkID09IFhEX0NBUkQpCisJCX0gZWxzZSBpZiAoY2FyZCA9PSBYRF9DQVJEKSB7CiAJCQl2YWx1ZSA9IENBUkRfU0hBUkVfQkFST1NTQV9YRDsKLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlydHN4X3RyYWNlKGNoaXApOwogCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CkBAIC0xMDY1LDcgKzEwNjUsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBpbnQgc2VsZWN0X2NhcmQoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgaW50IGNhcmQpCiB7CiAJaW50IHJldHZhbDsKQEAgLTEwNzMsMTUgKzEwNzIsMTUgQEAKIAlpZiAoY2hpcC0+Y3VyX2NhcmQgIT0gY2FyZCkgewogCQl1OCBtb2Q7CiAKLQkJaWYgKGNhcmQgPT0gU0RfQ0FSRCkKKwkJaWYgKGNhcmQgPT0gU0RfQ0FSRCkgewogCQkJbW9kID0gU0RfTU9EX1NFTDsKLQkJZWxzZSBpZiAoY2FyZCA9PSBNU19DQVJEKQorCQl9IGVsc2UgaWYgKGNhcmQgPT0gTVNfQ0FSRCkgewogCQkJbW9kID0gTVNfTU9EX1NFTDsKLQkJZWxzZSBpZiAoY2FyZCA9PSBYRF9DQVJEKQorCQl9IGVsc2UgaWYgKGNhcmQgPT0gWERfQ0FSRCkgewogCQkJbW9kID0gWERfTU9EX1NFTDsKLQkJZWxzZSBpZiAoY2FyZCA9PSBTUElfQ0FSRCkKKwkJfSBlbHNlIGlmIChjYXJkID09IFNQSV9DQVJEKSB7CiAJCQltb2QgPSBTUElfTU9EX1NFTDsKLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQlydHN4X3RyYWNlKGNoaXApOwogCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5jCmluZGV4IGJjYzRiNjYuLmExMGRkNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5jCkBAIC03NDMsNyArNzQzLDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJdTggdG1wID0gKHU4KShzZF9zcGVlZF9wcmlvciA+PiAoaSo4KSk7CisJCXU4IHRtcCA9ICh1OCkoc2Rfc3BlZWRfcHJpb3IgPj4gKGkgKiA4KSk7CiAKIAkJaWYgKCh0bXAgPCAweDAxKSB8fCAodG1wID4gMHgwNCkpIHsKIAkJCWZha2VfcGFyYSA9IHRydWU7CkBAIC03NjAsNyArNzYwLDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJdTggdG1wID0gKHU4KShzZF9jdXJyZW50X3ByaW9yID4+IChpKjgpKTsKKwkJdTggdG1wID0gKHU4KShzZF9jdXJyZW50X3ByaW9yID4+IChpICogOCkpOwogCiAJCWlmICh0bXAgPiAweDAzKSB7CiAJCQlmYWtlX3BhcmEgPSB0cnVlOwpAQCAtMjI4OCw3ICsyMjg4LDcgQEAKIAogCXB0ciA9IGJ1ZjsKIAlyZWdfYWRkciA9IFBQQlVGX0JBU0UyOwotCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuLzI1NjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGJ1Zl9sZW4gLyAyNTY7IGkrKykgewogCQlydHN4X2luaXRfY21kKGNoaXApOwogCiAJCWZvciAoaiA9IDA7IGogPCAyNTY7IGorKykKQEAgLTIzMDQsMTAgKzIzMDQsMTAgQEAKIAkJcHRyICs9IDI1NjsKIAl9CiAKLQlpZiAoYnVmX2xlbiUyNTYpIHsKKwlpZiAoYnVmX2xlbiAlIDI1NikgewogCQlydHN4X2luaXRfY21kKGNoaXApOwogCi0JCWZvciAoaiA9IDA7IGogPCBidWZfbGVuJTI1NjsgaisrKQorCQlmb3IgKGogPSAwOyBqIDwgYnVmX2xlbiAlIDI1NjsgaisrKQogCQkJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgcmVnX2FkZHIrKywgMCwgMCk7CiAKIAkJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAyNTApOwpAQCAtMjMxNyw3ICsyMzE3LDcgQEAKIAkJfQogCX0KIAotCW1lbWNweShwdHIsIHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApLCBidWZfbGVuJTI1Nik7CisJbWVtY3B5KHB0ciwgcnRzeF9nZXRfY21kX2RhdGEoY2hpcCksIGJ1Zl9sZW4gJSAyNTYpOwogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMjMzNiw3ICsyMzM2LDcgQEAKIAogCXB0ciA9IGJ1ZjsKIAlyZWdfYWRkciA9IFBQQlVGX0JBU0UyOwotCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuLzI1NjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGJ1Zl9sZW4gLyAyNTY7IGkrKykgewogCQlydHN4X2luaXRfY21kKGNoaXApOwogCiAJCWZvciAoaiA9IDA7IGogPCAyNTY7IGorKykgewpAQCAtMjM1MiwxMCArMjM1MiwxMCBAQAogCQl9CiAJfQogCi0JaWYgKGJ1Zl9sZW4lMjU2KSB7CisJaWYgKGJ1Zl9sZW4gJSAyNTYpIHsKIAkJcnRzeF9pbml0X2NtZChjaGlwKTsKIAotCQlmb3IgKGogPSAwOyBqIDwgYnVmX2xlbiUyNTY7IGorKykgeworCQlmb3IgKGogPSAwOyBqIDwgYnVmX2xlbiAlIDI1NjsgaisrKSB7CiAJCQlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgcmVnX2FkZHIrKywgMHhGRiwKIAkJCQkgICAgICpwdHIpOwogCQkJcHRyKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5oCmluZGV4IGMwODE2NGYuLmYzNjY0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5oCkBAIC00NCw4ICs0NCwxMCBAQAogCSNkZWZpbmUgTUdfU0VUX0lDVl9TTE9XCiAJLyogSFcgbWF5IG1pc3MgRVJSL0NNRE5LIHNpZ25hbCB3aGVuIHNhbXBsaW5nIElOVCBzdGF0dXMuICovCiAJI2RlZmluZSBNU19TQU1QTEVfSU5UX0VSUgotCS8qIEhXIERPIE5PVCBzdXBwb3J0IFdhaXRfSU5UIGZ1bmN0aW9uIGR1cmluZyBSRUFEX0JZVEVTCi0JICogdHJhbnNmZXIgbW9kZSAqLworCS8qCisJICogSFcgRE8gTk9UIHN1cHBvcnQgV2FpdF9JTlQgZnVuY3Rpb24KKwkgKiBkdXJpbmcgUkVBRF9CWVRFUyB0cmFuc2ZlciBtb2RlCisJICovCiAJI2RlZmluZSBSRUFEX0JZVEVTX1dBSVRfSU5UCiAjZW5kaWYKIApAQCAtMTAxLDE4ICsxMDMsMTcgQEAKICNkZWZpbmUgVFJBTlNQT1JUX05PX1NFTlNFCTIgIC8qIENvbW1hbmQgZmFpbGVkLCBubyBhdXRvLXNlbnNlICAgICovCiAjZGVmaW5lIFRSQU5TUE9SVF9FUlJPUgkJMyAgIC8qIFRyYW5zcG9ydCBiYWQgKGkuZS4gZGV2aWNlIGRlYWQpICovCiAKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIFN0YXJ0LVN0b3AtVW5pdAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFN0YXJ0LVN0b3AtVW5pdAorICovCiAjZGVmaW5lIFNUT1BfTUVESVVNCQkJMHgwMCAgICAvKiBhY2Nlc3MgZGlzYWJsZSAgICAgICAgICovCiAjZGVmaW5lIE1BS0VfTUVESVVNX1JFQURZCQkweDAxICAgIC8qIGFjY2VzcyBlbmFibGUgICAgICAgICAgKi8KICNkZWZpbmUgVU5MT0FEX01FRElVTQkJCTB4MDIgICAgLyogdW5sb2FkICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBMT0FEX01FRElVTQkJCTB4MDMgICAgLyogbG9hZCAgICAgICAgICAgICAgICAgICAqLwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgU1RBTkRBUkRfSU5RVUlSWQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNUQU5EQVJEX0lOUVVJUlkKKyAqLwogI2RlZmluZSBRVUxJRklSRSAgICAgICAgICAgICAgICAweDAwCiAjZGVmaW5lIEFFTkNfRk5DICAgICAgICAgICAgICAgIDB4MDAKICNkZWZpbmUgVFJNTF9JT1AgICAgICAgICAgICAgICAgMHgwMApAQCAtMTI5LDE3ICsxMzAsMTUgQEAKICNkZWZpbmUgUFJEQ1RfUkVWX0xFTiAgICAgICAgICAgNCAgICAgICAgICAgICAgIC8qIFByb2R1Y3QgTE9UIExlbmd0aCAgICAgICAqLwogCiAvKiBEeW5hbWljIGZsYWcgZGVmaW5pdGlvbnM6IHVzZWQgaW4gc2V0X2JpdCgpIGV0Yy4gKi8KLSNkZWZpbmUgUlRTWF9GTElEWF9UUkFOU19BQ1RJVkUJCTE4ICAvKiAweDAwMDQwMDAwICB0cmFuc2ZlciBpcyBhY3RpdmUgKi8KLSNkZWZpbmUgUlRTWF9GTElEWF9BQk9SVElORwkJMjAgIC8qIDB4MDAxMDAwMDAgYWJvcnQgaXMgaW4KLQkJCQkJICAgICAqIHByb2dyZXNzICovCi0jZGVmaW5lIFJUU1hfRkxJRFhfRElTQ09OTkVDVElORwkyMSAgLyogMHgwMDIwMDAwMCBkaXNjb25uZWN0Ci0JCQkJCSAgICAgKiBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBSVFNYX0ZMSURYX1RSQU5TX0FDVElWRQkJMTggIC8qIDB4MDAwNDAwMDAgdHJhbnNmZXIgaXMgYWN0aXZlCSAqLworI2RlZmluZSBSVFNYX0ZMSURYX0FCT1JUSU5HCQkyMCAgLyogMHgwMDEwMDAwMCBhYm9ydCBpcyBpbiBwcm9ncmVzcwkgKi8KKyNkZWZpbmUgUlRTWF9GTElEWF9ESVNDT05ORUNUSU5HCTIxICAvKiAweDAwMjAwMDAwIGRpc2Nvbm5lY3QgaW4gcHJvZ3Jlc3MgKi8KKwogI2RlZmluZSBBQk9SVElOR19PUl9ESVNDT05ORUNUSU5HCSgoMVVMIDw8IFVTX0ZMSURYX0FCT1JUSU5HKSB8IFwKIAkJCQkJICgxVUwgPDwgVVNfRkxJRFhfRElTQ09OTkVDVElORykpCi0jZGVmaW5lIFJUU1hfRkxJRFhfUkVTRVRUSU5HCQkyMiAgLyogMHgwMDQwMDAwMCBkZXZpY2UgcmVzZXQKLQkJCQkJICAgICAqIGluIHByb2dyZXNzICovCi0jZGVmaW5lIFJUU1hfRkxJRFhfVElNRURfT1VUCQkyMyAgLyogMHgwMDgwMDAwMCBTQ1NJCi0JCQkJCSAgICAgKiBtaWRsYXllciB0aW1lZCBvdXQgKi8KKworI2RlZmluZSBSVFNYX0ZMSURYX1JFU0VUVElORwkJMjIgIC8qIDB4MDA0MDAwMDAgZGV2aWNlIHJlc2V0IGluIHByb2dyZXNzICovCisjZGVmaW5lIFJUU1hfRkxJRFhfVElNRURfT1VUCQkyMyAgLyogMHgwMDgwMDAwMCBTQ1NJIG1pZGxheWVyIHRpbWVkIG91dCAgKi8KIAogI2RlZmluZSBEUkNUX0FDQ0VTU19ERVYgICAgICAgICAweDAwICAgIC8qIERpcmVjdCBBY2Nlc3MgRGV2aWNlICAgICAgKi8KICNkZWZpbmUgUk1CX0RJU0MgICAgICAgICAgICAgICAgMHg4MCAgICAvKiBUaGUgRGV2aWNlIGlzIFJlbW92YWJsZSAgICovCkBAIC0xNzQsOSArMTczLDkgQEAKICNkZWZpbmUJRklSU1RfUkVTRVQJCTB4MDEKICNkZWZpbmUJVVNFRF9FWElTVAkJMHgwMgogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgU0VOU0VfREFUQQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIFNFTlNFX0RBVEEKKyAqLwogLyotLS0tIHZhbGlkIC0tLS0qLwogI2RlZmluZSBTRU5TRV9WQUxJRCAgICAgICAgICAgICAweDgwICAgIC8qIFNlbnNlIGRhdGEgaXMgdmFsaWQgYXMgU0NTSTIgICAgICovCiAjZGVmaW5lIFNFTlNFX0lOVkFMSUQgICAgICAgICAgIDB4MDAgICAgLyogU2Vuc2UgZGF0YSBpcyBpbnZhbGlkIGFzIFNDU0kyICAgKi8KQEAgLTIyOCw3ICsyMjcsNiBAQAogI2RlZmluZSBBU0NRX0xPQURfRUpDVF9FUlIgICAgICAweDAwCiAjZGVmaW5lCUFTQ1FfV1JJVEVfUFJPVEVDVAkweDAwCiAKLQogc3RydWN0IHNlbnNlX2RhdGFfdCB7CiAJdW5zaWduZWQgY2hhciAgIGVycl9jb2RlOwkvKiBlcnJvciBjb2RlICovCiAJLyogYml0NyA6IHZhbGlkICovCkBAIC0yNjgsMjIgKzI2NiwyMiBAQAogI2RlZmluZSBUUklHX0RNQQkJKDB4MDEgPDwgMzEpCiAKIC8qIEJ1cyBpbnRlcnJ1cHQgcGVuZGluZyByZWdpc3RlciAqLwotI2RlZmluZSBDTURfRE9ORV9JTlQJCSgxIDw8IDMxKQotI2RlZmluZSBEQVRBX0RPTkVfSU5UCQkoMSA8PCAzMCkKLSNkZWZpbmUgVFJBTlNfT0tfSU5UCQkoMSA8PCAyOSkKLSNkZWZpbmUgVFJBTlNfRkFJTF9JTlQJCSgxIDw8IDI4KQotI2RlZmluZSBYRF9JTlQJCQkoMSA8PCAyNykKLSNkZWZpbmUgTVNfSU5UCQkJKDEgPDwgMjYpCi0jZGVmaW5lIFNEX0lOVAkJCSgxIDw8IDI1KQotI2RlZmluZSBHUElPMF9JTlQJCSgxIDw8IDI0KQotI2RlZmluZSBPQ19JTlQJCQkoMSA8PCAyMykKLSNkZWZpbmUgU0RfV1JJVEVfUFJPVEVDVAkoMSA8PCAxOSkKLSNkZWZpbmUgWERfRVhJU1QJCSgxIDw8IDE4KQotI2RlZmluZSBNU19FWElTVAkJKDEgPDwgMTcpCi0jZGVmaW5lIFNEX0VYSVNUCQkoMSA8PCAxNikKKyNkZWZpbmUgQ01EX0RPTkVfSU5UCQlCSVQoMzEpCisjZGVmaW5lIERBVEFfRE9ORV9JTlQJCUJJVCgzMCkKKyNkZWZpbmUgVFJBTlNfT0tfSU5UCQlCSVQoMjkpCisjZGVmaW5lIFRSQU5TX0ZBSUxfSU5UCQlCSVQoMjgpCisjZGVmaW5lIFhEX0lOVAkJCUJJVCgyNykKKyNkZWZpbmUgTVNfSU5UCQkJQklUKDI2KQorI2RlZmluZSBTRF9JTlQJCQlCSVQoMjUpCisjZGVmaW5lIEdQSU8wX0lOVAkJQklUKDI0KQorI2RlZmluZSBPQ19JTlQJCQlCSVQoMjMpCisjZGVmaW5lIFNEX1dSSVRFX1BST1RFQ1QJQklUKDE5KQorI2RlZmluZSBYRF9FWElTVAkJQklUKDE4KQorI2RlZmluZSBNU19FWElTVAkJQklUKDE3KQorI2RlZmluZSBTRF9FWElTVAkJQklUKDE2KQogI2RlZmluZSBERUxJTktfSU5UCQlHUElPMF9JTlQKLSNkZWZpbmUgTVNfT0NfSU5UCQkoMSA8PCAyMykKLSNkZWZpbmUgU0RfT0NfSU5UCQkoMSA8PCAyMikKKyNkZWZpbmUgTVNfT0NfSU5UCQlCSVQoMjMpCisjZGVmaW5lIFNEX09DX0lOVAkJQklUKDIyKQogCiAjZGVmaW5lIENBUkRfSU5UCQkoWERfSU5UIHwgTVNfSU5UIHwgU0RfSU5UKQogI2RlZmluZSBORUVEX0NPTVBMRVRFX0lOVAkoREFUQV9ET05FX0lOVCB8IFRSQU5TX09LX0lOVCB8IFRSQU5TX0ZBSUxfSU5UKQpAQCAtMzA1LDcgKzMwMyw2IEBACiAjZGVmaW5lIE1TX09DX0lOVF9FTgkJKDEgPDwgMjMpCiAjZGVmaW5lIFNEX09DX0lOVF9FTgkJKDEgPDwgMjIpCiAKLQogI2RlZmluZSBSRUFEX1JFR19DTUQJCTAKICNkZWZpbmUgV1JJVEVfUkVHX0NNRAkJMQogI2RlZmluZSBDSEVDS19SRUdfQ01ECQkyCkBAIC0zMTMsNyArMzEwLDYgQEAKICNkZWZpbmUgSE9TVF9UT19ERVZJQ0UJCTAKICNkZWZpbmUgREVWSUNFX1RPX0hPU1QJCTEKIAotCiAjZGVmaW5lIFJUU1hfUkVTVl9CVUZfTEVOCTQwOTYKICNkZWZpbmUgSE9TVF9DTURTX0JVRl9MRU4JMTAyNAogI2RlZmluZSBIT1NUX1NHX1RCTF9CVUZfTEVOCShSVFNYX1JFU1ZfQlVGX0xFTiAtIEhPU1RfQ01EU19CVUZfTEVOKQpAQCAtMzMyLDcgKzMyOCw2IEBACiAjZGVmaW5lIFhEX0ZSRUVfVEFCTEVfQ05UCTEyMDAKICNkZWZpbmUgTVNfRlJFRV9UQUJMRV9DTlQJNTEyCiAKLQogLyogQml0IE9wZXJhdGlvbiAqLwogI2RlZmluZSBTRVRfQklUKGRhdGEsIGlkeCkJKChkYXRhKSB8PSAxIDw8IChpZHgpKQogI2RlZmluZSBDTFJfQklUKGRhdGEsIGlkeCkJKChkYXRhKSAmPSB+KDEgPDwgKGlkeCkpKQpAQCAtNjE4LDcgKzYxMyw2IEBACiAJaW50IHNwaV9jbG9jazsKIH07CiAKLQogI2lmZGVmIF9NU0dfVFJBQ0UKIHN0cnVjdCB0cmFjZV9tc2dfdCB7CiAJdTE2IGxpbmU7CkBAIC02ODksNyArNjgzLDcgQEAKICNkZWZpbmUgQ0xSX1NESU9fSUdOT1JFRChjaGlwKQkJKChjaGlwKS0+c2Rpb19mdW5jX2V4aXN0ICY9IH5TRElPX0lHTk9SRUQpCiAKIHN0cnVjdCBydHN4X2NoaXAgewotCXJ0c3hfZGV2X3QJKnJ0c3g7CisJc3RydWN0IHJ0c3hfZGV2CSpydHN4OwogCiAJdTMyCQlpbnRfcmVnOyAvKiBCdXMgaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIgKi8KIAljaGFyCQltYXhfbHVuOwpAQCAtNzEyLDkgKzcwNiw5IEBACiAJaW50CQkJY3VyX2NhcmQ7CiAKIAl1bnNpZ25lZCBsb25nCW5lZWRfcmVsZWFzZTsJCS8qIG5lZWQgcmVsZWFzZSBiaXQgbWFwICovCi0JdW5zaWduZWQgbG9uZwluZWVkX3Jlc2V0OwkJLyogbmVlZCByZXNldAotCQkJCQkJICogYml0IG1hcCAqLwotCS8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIGNhcmQgaXMganVzdCByZXN1bWVkIGZyb20gU1Mgc3RhdGUsCisJdW5zaWduZWQgbG9uZwluZWVkX3Jlc2V0OwkJLyogbmVlZCByZXNldCBiaXQgbWFwICovCisJLyoKKwkgKiBGbGFnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBjYXJkIGlzIGp1c3QgcmVzdW1lZCBmcm9tIFNTIHN0YXRlLAogCSAqIGFuZCBuZWVkIHJlbGVhc2VkIGJlZm9yZSBiZWluZyByZXNldHRlZAogCSAqLwogCXVuc2lnbmVkIGxvbmcJCW5lZWRfcmVpbml0OwpAQCAtNzMyLDggKzcyNiwxMCBAQAogCXU4CWNhcmRfZWplY3RlZDsJLyogY2FyZCBlamVjdGVkIGJpdCBtYXAgKi8KIAl1OAljYXJkX3dwOwkvKiBjYXJkIHdyaXRlIHByb3RlY3RlZCBiaXQgbWFwICovCiAKLQl1OAlsdW5fbWM7CQkvKiBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdG8gYW5zd2VyCi0JCQkJICogTWVkaWFDaGFuZ2UgKi8KKwl1OAlsdW5fbWM7CQkvKgorCQkJCSAqIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0byBhbnN3ZXIKKwkJCQkgKiBNZWRpYUNoYW5nZQorCQkJCSAqLwogCiAjaWZuZGVmIExFRF9BVVRPX0JMSU5LCiAJaW50CQkJbGVkX3RvZ2dsZV9jb3VudGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zY3NpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYwppbmRleCBkMjAzMTA0Li5iZWNiNGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYwpAQCAtNDg0LDE0ICs0ODQsMTQgQEAKIAl1OCBjYXJkID0gZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bik7CiAJYm9vbCBwcm9fZm9ybWF0dGVyX2ZsYWcgPSBmYWxzZTsKIAl1bnNpZ25lZCBjaGFyIGlucXVpcnlfYnVmW10gPSB7Ci0JCVFVTElGSVJFfERSQ1RfQUNDRVNTX0RFViwKLQkJUk1CX0RJU0N8MHgwRCwKKwkJUVVMSUZJUkUgfCBEUkNUX0FDQ0VTU19ERVYsCisJCVJNQl9ESVNDIHwgMHgwRCwKIAkJMHgwMCwKIAkJMHgwMSwKIAkJMHgxZiwKIAkJMHgwMiwKIAkJMCwKLQkJUkVMX0FEUnxXQlVTXzMyfFdCVVNfMTZ8U1lOQ3xMSU5LRUR8Q01EX1FVRXxTRlRfUkUsCisJCVJFTF9BRFIgfCBXQlVTXzMyIHwgV0JVU18xNiB8IFNZTkMgfCBMSU5LRUQgfCBDTURfUVVFIHwgU0ZUX1JFLAogCX07CiAKIAlpZiAoQ0hFQ0tfTFVOX01PREUoY2hpcCwgU0RfTVNfMkxVTikpIHsKQEAgLTU1OCw3ICs1NTgsNiBAQAogCXJldHVybiBUUkFOU1BPUlRfR09PRDsKIH0KIAotCiBzdGF0aWMgaW50IHN0YXJ0X3N0b3BfdW5pdChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CkBAIC01OTQsNyArNTkzLDYgQEAKIAlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOwogfQogCi0KIHN0YXRpYyBpbnQgYWxsb3dfbWVkaXVtX3JlbW92YWwoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCWludCBwcmV2ZW50OwpAQCAtNjEzLDcgKzYxMSw2IEBACiAJcmV0dXJuIFRSQU5TUE9SVF9HT09EOwogfQogCi0KIHN0YXRpYyBpbnQgcmVxdWVzdF9zZW5zZShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IHNlbnNlX2RhdGFfdCAqc2Vuc2U7CkBAIC0xNDAwLDcgKzEzOTcsNyBAQAogCWJ1Zl9sZW4gPSA0ICsgKCgyICsgTVNHX0ZVTkNfTEVOICsgTVNHX0ZJTEVfTEVOICsgVElNRV9WQUxfTEVOKSAqCiAJCVRSQUNFX0lURU1fQ05UKTsKIAotCWlmICgoc2NzaV9idWZmbGVuKHNyYikgPCBidWZfbGVuKSB8fCAoc2NzaV9zZ2xpc3Qoc3JiKSA9PSBOVUxMKSkgeworCWlmICgoc2NzaV9idWZmbGVuKHNyYikgPCBidWZfbGVuKSB8fCAhc2NzaV9zZ2xpc3Qoc3JiKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwogCQlydHN4X3RyYWNlKGNoaXApOwpAQCAtMTUyMSw3ICsxNTE4LDcgQEAKIAogc3RhdGljIGludCBzZXRfdmFyaWFibGUoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewotCXVuc2lnbmVkIGx1biA9IFNDU0lfTFVOKHNyYik7CisJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CiAKIAlpZiAoc3JiLT5jbW5kWzNdID09IDEpIHsKIAkJLyogVmFyaWFibGUgQ2xvY2sgKi8KQEAgLTE5ODksOCArMTk4Niw4IEBACiAJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCQl9CiAKLQkJCWJ1ZlsyKmldID0gKHU4KSh2YWwgPj4gOCk7Ci0JCQlidWZbMippKzFdID0gKHU4KXZhbDsKKwkJCWJ1ZlsyICogaV0gPSAodTgpKHZhbCA+PiA4KTsKKwkJCWJ1ZlsyICogaSArIDFdID0gKHU4KXZhbDsKIAkJfQogCiAJCWxlbiA9ICh1bnNpZ25lZCBzaG9ydCltaW5fdCh1bnNpZ25lZCBpbnQsIHNjc2lfYnVmZmxlbihzcmIpLApAQCAtMjA0OCw3ICsyMDQ1LDcgQEAKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBsZW4gLyAyOyBpKyspIHsKLQkJCXZhbCA9ICgodTE2KWJ1ZlsyKmldIDw8IDgpIHwgYnVmWzIqaSsxXTsKKwkJCXZhbCA9ICgodTE2KWJ1ZlsyICogaV0gPDwgOCkgfCBidWZbMiAqIGkgKyAxXTsKIAkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKGNoaXAsIGFkZHIgKyBpLCB2YWwpOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXZmcmVlKGJ1Zik7CkBAIC0yNjA0LDcgKzI2MDEsNiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQogc3RhdGljIGludCByZWFkX3N0YXR1cyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJdTggcnRzeF9zdGF0dXNbMTZdOwpAQCAtMzA3MSwxOCArMzA2NywxOCBAQAogCWJ1ZltpKytdID0gMHg4MDsKIAlpZiAoKGRldl9pbmZvX2lkID09IDB4MTApIHx8IChkZXZfaW5mb19pZCA9PSAweDEzKSkgewogCQkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gKi8KLQkJbWVtY3B5KGJ1ZitpLCBtc19jYXJkLT5yYXdfc3lzX2luZm8sIDk2KTsKKwkJbWVtY3B5KGJ1ZiArIGksIG1zX2NhcmQtPnJhd19zeXNfaW5mbywgOTYpOwogCX0gZWxzZSB7CiAJCS8qIE1vZGVsIE5hbWUgKi8KLQkJbWVtY3B5KGJ1ZitpLCBtc19jYXJkLT5yYXdfbW9kZWxfbmFtZSwgNDgpOworCQltZW1jcHkoYnVmICsgaSwgbXNfY2FyZC0+cmF3X21vZGVsX25hbWUsIDQ4KTsKIAl9CiAKIAlydHN4X3N0b3Jfc2V0X3hmZXJfYnVmKGJ1ZiwgYnVmX2xlbiwgc3JiKTsKIAogCWlmIChkZXZfaW5mb19pZCA9PSAweDE1KQotCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpLTB4M0MpOworCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gMHgzQyk7CiAJZWxzZQotCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpLTB4NkMpOworCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gMHg2Qyk7CiAKIAlrZnJlZShidWYpOwogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc3lzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3N5cy5oCmluZGV4IDBiNmI0ZDQuLmY0OWJlZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc3lzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9zeXMuaApAQCAtMjgsOCArMjgsNiBAQAogI2luY2x1ZGUgInJ0c3hfY2hpcC5oIgogI2luY2x1ZGUgInJ0c3hfY2FyZC5oIgogCi10eXBlZGVmIGRtYV9hZGRyX3QgVUxPTkdfUFRSOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgcnRzeF9leGNsdXNpdmVfZW50ZXJfc3Moc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKIAlzdHJ1Y3QgcnRzeF9kZXYgKmRldiA9IGNoaXAtPnJ0c3g7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF90cmFuc3BvcnQuaAppbmRleCA4OTliYzIwLi40NzkxMzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfdHJhbnNwb3J0LmgKQEAgLTM4LDcgKzM4LDYgQEAKIAl1bnNpZ25lZCBpbnQgYnVmbGVuLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpOwogdm9pZCBydHN4X2ludm9rZV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKTsKIAotCiAjZGVmaW5lIHJ0c3hfaW5pdF9jbWQoY2hpcCkJCQkoKGNoaXApLT5jaSA9IDApCiAKIHZvaWQgcnRzeF9hZGRfY21kKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc2QuYwppbmRleCA2MjE5ZTA0Li5iMGJiYjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NkLmMKQEAgLTE0MjgsNyArMTQyOCw2IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0KIAkJaWYgKGZ1bmNfdG9fc3dpdGNoKQogCQkJYnJlYWs7CiAKQEAgLTE0MzcsOSArMTQzNiw5IEBACiAJCWZ1bmNfdG9fc3dpdGNoKTsKIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwotCWlmICgoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9TRFJfUlNUKQotCQkJJiYgKEREUjUwX1NVUFBPUlQgPT0gZnVuY190b19zd2l0Y2gpCi0JCQkmJiAoc2RfY2FyZC0+ZnVuY19ncm91cDFfbWFzayAmIFNEUjUwX1NVUFBPUlRfTUFTSykpIHsKKwlpZiAoKHNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICYgU0RfU0RSX1JTVCkgJiYKKwkgICAgKGZ1bmNfdG9fc3dpdGNoID09IEREUjUwX1NVUFBPUlQpICYmCisJICAgIChzZF9jYXJkLT5mdW5jX2dyb3VwMV9tYXNrICYgU0RSNTBfU1VQUE9SVF9NQVNLKSkgewogCQlmdW5jX3RvX3N3aXRjaCA9IFNEUjUwX1NVUFBPUlQ7CiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJVc2luZyBTRFI1MCBpbnN0ZWFkIG9mIEREUjUwIGZvciBTRCBMb2NrXG4iKTsKIAl9CkBAIC0yNTg5LDE2ICsyNTg4LDEyIEBACiAjZW5kaWYKIAogCXJldHZhbCA9IHNkX3ByZXBhcmVfcmVzZXQoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlyZXR2YWwgPSBzZF9kdW1teV9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCWlmIChDSEtfU0RJT19FWElTVChjaGlwKSAmJiAhQ0hLX1NESU9fSUdOT1JFRChjaGlwKSAmJiB0cnlfc2RpbykgewogCQlpbnQgcnR5X2NudCA9IDA7CkBAIC0yNjA2LDggKzI2MDEsNyBAQAogCQlmb3IgKDsgcnR5X2NudCA8IGNoaXAtPnNkaW9fcmV0cnlfY250OyBydHlfY250KyspIHsKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKTsKLQkJCQlydHN4X3RyYWNlKGNoaXApOwotCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQlnb3RvIFN0YXR1c19GYWlsOwogCQkJfQogCiAJCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIElPX1NFTkRfT1BfQ09ORCwgMCwKQEAgLTI2MTksOCArMjYxMyw3IEBACiAJCQkJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJTRF9JTyBjYXJkIChGdW5jdGlvbiBudW1iZXI6ICVkKSFcbiIsCiAJCQkJCQlmdW5jX251bSk7CiAJCQkJCWNoaXAtPnNkX2lvID0gMTsKLQkJCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCQlnb3RvIFN0YXR1c19GYWlsOwogCQkJCX0KIAogCQkJCWJyZWFrOwpAQCAtMjYzOCwxMCArMjYzMSw4IEBACiBSVFlfU0RfUlNUOgogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgR09fSURMRV9TVEFURSwgMCwgU0RfUlNQX1RZUEVfUjAsCiAJCQkJTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAl3YWl0X3RpbWVvdXQoMjApOwogCkBAIC0yNjU5LDEwICsyNjUwLDggQEAKIAogCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEdPX0lETEVfU1RBVEUsIDAsCiAJCQkJCVNEX1JTUF9UWVBFX1IwLCBOVUxMLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTDsKLQkJfQorCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJZ290byBTdGF0dXNfRmFpbDsKIAogCQl3YWl0X3RpbWVvdXQoMjApOwogCX0KQEAgLTI2NzMsMzkgKzI2NjIsMzIgQEAKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpOwotCQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCQl9CiAKIAkJCWorKzsKLQkJCWlmIChqIDwgMykgeworCQkJaWYgKGogPCAzKQogCQkJCWdvdG8gUlRZX1NEX1JTVDsKLQkJCX0gZWxzZSB7Ci0JCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCQl9CisJCQllbHNlCisJCQkJZ290byBTdGF0dXNfRmFpbDsKIAkJfQogCiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0RfQVBQX09QX0NPTkQsIHZvbHRhZ2UsCiAJCQkJCVNEX1JTUF9UWVBFX1IzLCByc3AsIDUpOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlrKys7Ci0JCQlpZiAoayA8IDMpIHsKKwkJCWlmIChrIDwgMykKIAkJCQlnb3RvIFJUWV9TRF9SU1Q7Ci0JCQl9IGVsc2UgewotCQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQkJfQorCQkJZWxzZQorCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCX0KIAogCQlpKys7CiAJCXdhaXRfdGltZW91dCgyMCk7CiAJfSB3aGlsZSAoIShyc3BbMV0gJiAweDgwKSAmJiAoaSA8IDI1NSkpOwogCi0JaWYgKGkgPT0gMjU1KSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKGkgPT0gMjU1KQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJaWYgKGhpX2NhcF9mbG93KSB7CiAJCWlmIChyc3BbMV0gJiAweDQwKQpAQCAtMjcyMiwyNiArMjcwNCwyMCBAQAogCiAJaWYgKHN1cHBvcnRfMXY4KSB7CiAJCXJldHZhbCA9IHNkX3ZvbHRhZ2Vfc3dpdGNoKGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQl9CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlnb3RvIFN0YXR1c19GYWlsOwogCX0KIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQUxMX1NFTkRfQ0lELCAwLCBTRF9SU1BfVFlQRV9SMiwKIAkJCQlOVUxMLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1JFTEFUSVZFX0FERFIsIDAsCiAJCQkJCVNEX1JTUF9UWVBFX1I2LCByc3AsIDUpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCQl9CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJCXNkX2NhcmQtPnNkX2FkZHIgPSAodTMyKXJzcFsxXSA8PCAyNDsKIAkJc2RfY2FyZC0+c2RfYWRkciArPSAodTMyKXJzcFsyXSA8PCAxNjsKQEAgLTI3NTEsMjQgKzI3MjcsMTggQEAKIAl9CiAKIAlyZXR2YWwgPSBzZF9jaGVja19jc2QoY2hpcCwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlyZXR2YWwgPSBzZF9zZWxlY3RfY2FyZChjaGlwLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogU0RfVU5MT0NLX0VOVFJZOgogCXJldHZhbCA9IHNkX3VwZGF0ZV9sb2NrX3N0YXR1cyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCWlmIChzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX0xPQ0tFRCkgewogCQlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyB8PSAoU0RfTE9DS18xQklUX01PREUgfCBTRF9QV0RfRVhJU1QpOwpAQCAtMjc4MCwzMiArMjc1MCwyNCBAQAogCiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0NMUl9DQVJEX0RFVEVDVCwgMCwKIAkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlpZiAoc3VwcG9ydF8xdjgpIHsKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCX0KKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQlVTX1dJRFRILCAyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCX0KKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJc3dpdGNoX2J1c193aWR0aCA9IFNEX0JVU19XSURUSF80OwogCX0gZWxzZSB7CkBAIC0yODE0LDE2ICsyNzc2LDEyIEBACiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9CTE9DS0xFTiwgMHgyMDAsIFNEX1JTUF9UWVBFX1IxLAogCQkJCU5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCX0KKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJcmV0dmFsID0gc2Rfc2V0X2Nsb2NrX2RpdmlkZXIoY2hpcCwgU0RfQ0xLX0RJVklERV8wKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCXJldHVybiBTVEFUVVNfRkFJTDsKLQl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJZ290byBTdGF0dXNfRmFpbDsKIAogCWlmICghKHNkX2NhcmQtPnJhd19jc2RbNF0gJiAweDQwKSkKIAkJc2RfZG9udF9zd2l0Y2ggPSB0cnVlOwpAQCAtMjg2MiwxNyArMjgyMCwxMyBAQAogCWlmICghc3VwcG9ydF8xdjgpIHsKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCX0KKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQlVTX1dJRFRILCAyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCX0KKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJfQogCiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCkBAIC0yODkwLDEwICsyODQ0LDggQEAKIAkJfQogCiAJCXJldHZhbCA9IHNkX3NldF9pbml0X3BhcmEoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCX0KKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkKIAkJCXJldHZhbCA9IHNkX2Rkcl90dW5pbmcoY2hpcCk7CkBAIC0yOTAyLDE0ICsyODU0LDExIEBACiAKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJaWYgKHNkMjBfbW9kZSkgewotCQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCQl9IGVsc2UgewogCQkJCXJldHZhbCA9IHNkX2luaXRfcG93ZXIoY2hpcCk7Ci0JCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCQlydHN4X3RyYWNlKGNoaXApOwotCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JCQkJfQorCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAkJCQl0cnlfc2RpbyA9IGZhbHNlOwogCQkJCXNkMjBfbW9kZSA9IHRydWU7CkBAIC0yOTMwLDE0ICsyODc5LDExIEBACiAJCQlyZXR2YWwgPSBzZF9yZWFkX2xiYTAoY2hpcCk7CiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJaWYgKHNkMjBfbW9kZSkgewotCQkJCQlydHN4X3RyYWNlKGNoaXApOwotCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCQkJfSBlbHNlIHsKIAkJCQkJcmV0dmFsID0gc2RfaW5pdF9wb3dlcihjaGlwKTsKLQkJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKLQkJCQkJfQorCQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCQkJZ290byBTdGF0dXNfRmFpbDsKIAogCQkJCQl0cnlfc2RpbyA9IGZhbHNlOwogCQkJCQlzZDIwX21vZGUgPSB0cnVlOwpAQCAtMjk0OCwxMCArMjg5NCw4IEBACiAJfQogCiAJcmV0dmFsID0gc2RfY2hlY2tfd3Bfc3RhdGUoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAljaGlwLT5jYXJkX2J1c193aWR0aFtjaGlwLT5jYXJkMmx1bltTRF9DQVJEXV0gPSA0OwogCkBAIC0yOTczLDggKzI5MTcsMTEgQEAKICNlbmRpZgogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotfQogCitTdGF0dXNfRmFpbDoKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBTVEFUVVNfRkFJTDsKK30KIAogc3RhdGljIGludCBtbWNfdGVzdF9zd2l0Y2hfYnVzKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IHdpZHRoKQogewpAQCAtMzEwNSw3ICszMDUyLDYgQEAKIAlyZXR1cm4gU1dJVENIX0ZBSUw7CiB9CiAKLQogc3RhdGljIGludCBtbWNfc3dpdGNoX3RpbWluZ19idXMoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgYm9vbCBzd2l0Y2hfZGRyKQogewogCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKQEAgLTMyMzAsNyArMzE3Niw2IEBACiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCi0KIHN0YXRpYyBpbnQgcmVzZXRfbW1jKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuYwppbmRleCAyNmViMmExLi4xM2M1MzljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuYwpAQCAtMzksNyArMzksOCBAQAogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNQSV9DT05UUk9MLCAweEZGLAotCQkJCSAgICAgQ1NfUE9MQVJJVFlfTE9XIHwgRFRPX01TQl9GSVJTVCB8IFNQSV9NQVNURVIgfCBTUElfTU9ERTAgfCBTUElfQVVUTyk7CisJCQkJICAgICBDU19QT0xBUklUWV9MT1cgfCBEVE9fTVNCX0ZJUlNUCisJCQkJICAgICB8IFNQSV9NQVNURVIgfCBTUElfTU9ERTAgfCBTUElfQVVUTyk7CiAJaWYgKHJldHZhbCkgewogCQlydHN4X3RyYWNlKGNoaXApOwogCQlyZXR1cm4gcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc3BpLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuaAppbmRleCBmYzgyNGI1Li5jOGQyYmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuaApAQCAtNjEsNSArNjEsNCBAQAogaW50IHNwaV9lcmFzZV9mbGFzaChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApOwogaW50IHNwaV93cml0ZV9mbGFzaF9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKTsKIAotCiAjZW5kaWYgIC8qIF9fUkVBTFRFS19SVFNYX1NQSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC94ZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgveGQuYwppbmRleCBmYzFkZmUwLi4xZGUwMmJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC94ZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3hkLmMKQEAgLTgzNCw3ICs4MzQsNiBAQAogCQkhPSAoWERfRUNDMV9BTEwxIHwgWERfRUNDMl9BTEwxKSkKIAkJcmV0dXJuIDA7CiAKLQogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJaWYgKHJlZHVudFtSRVNFUlZFRDAgKyBpXSAhPSAweEZGKQogCQkJcmV0dXJuIDA7CkBAIC05MzgsNyArOTM3LDcgQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiU2V0IHVudXNlZCBibG9jayB0byBpbmRleCAlZFxuIiwKIAkJem9uZS0+c2V0X2luZGV4KTsKIAotCXpvbmUtPmZyZWVfdGFibGVbem9uZS0+c2V0X2luZGV4KytdID0gKHUxNikgKHBoeV9ibGsgJiAweDNmZik7CisJem9uZS0+ZnJlZV90YWJsZVt6b25lLT5zZXRfaW5kZXgrK10gPSAodTE2KShwaHlfYmxrICYgMHgzZmYpOwogCWlmICh6b25lLT5zZXRfaW5kZXggPj0gWERfRlJFRV9UQUJMRV9DTlQpCiAJCXpvbmUtPnNldF9pbmRleCA9IDA7CiAJem9uZS0+dW51c2VkX2Jsa19jbnQrKzsKQEAgLTE0MDIsNyArMTQwMSw2IEBACiAJcmV0dXJuIFNUQVRVU19GQUlMOwogfQogCi0KIHN0YXRpYyBpbnQgeGRfYnVpbGRfbDJwX3RibChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCBpbnQgem9uZV9ubykKIHsKIAlzdHJ1Y3QgeGRfaW5mbyAqeGRfY2FyZCA9ICYoY2hpcC0+eGRfY2FyZCk7CkBAIC0xNjI0LDEwICsxNjIyLDggQEAKIAl1OCByZWdfdmFsLCBwYWdlX2NudDsKIAlpbnQgem9uZV9ubywgcmV0dmFsLCBpOwogCi0JaWYgKHN0YXJ0X3BhZ2UgPiBlbmRfcGFnZSkgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlwYWdlX2NudCA9IGVuZF9wYWdlIC0gc3RhcnRfcGFnZTsKIAl6b25lX25vID0gKGludCkobG9nX2JsayAvIDEwMDApOwpAQCAtMTY0Myw4ICsxNjM5LDcgQEAKIAogCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX05PX0NBUkQpOwotCQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCQl9CiAJCX0KIAl9CkBAIC0xNjc5LDggKzE2NzQsNyBAQAogCiAJCWlmIChyZXR2YWwgPT0gLUVUSU1FRE9VVCkgewogCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1RPX0VSUk9SKTsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQlnb3RvIFN0YXR1c19GYWlsOwogCQl9IGVsc2UgewogCQkJcnRzeF90cmFjZShjaGlwKTsKIAkJCWdvdG8gRmFpbDsKQEAgLTE3MTMsOCArMTcwNyw3IEBACiAKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfTk9fQ0FSRCk7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJZ290byBTdGF0dXNfRmFpbDsKIAkJfQogCiAJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9FQ0NfRVJST1IpOwpAQCAtMTcyMiw4ICsxNzE1LDcgQEAKIAkJbmV3X2JsayA9IHhkX2dldF91bnVzZWRfYmxvY2soY2hpcCwgem9uZV9ubyk7CiAJCWlmIChuZXdfYmxrID09IE5PX05FV19CTEspIHsKIAkJCVhEX0NMUl9CQURfT0xEQkxLKHhkX2NhcmQpOwotCQkJcnRzeF90cmFjZShjaGlwKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCWdvdG8gU3RhdHVzX0ZhaWw7CiAJCX0KIAogCQlyZXR2YWwgPSB4ZF9jb3B5X3BhZ2UoY2hpcCwgcGh5X2JsaywgbmV3X2JsaywgMCwKQEAgLTE3MzcsOCArMTcyOSw3IEBACiAJCQkJWERfQ0xSX0JBRF9ORVdCTEsoeGRfY2FyZCk7CiAJCQl9CiAJCQlYRF9DTFJfQkFEX09MREJMSyh4ZF9jYXJkKTsKLQkJCXJ0c3hfdHJhY2UoY2hpcCk7Ci0JCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQlnb3RvIFN0YXR1c19GYWlsOwogCQl9CiAJCXhkX3NldF9sMnBfdGJsKGNoaXAsIHpvbmVfbm8sIGxvZ19vZmYsICh1MTYpKG5ld19ibGsgJiAweDNGRikpOwogCQl4ZF9lcmFzZV9ibG9jayhjaGlwLCBwaHlfYmxrKTsKQEAgLTE3NDYsNiArMTczNyw3IEBACiAJCVhEX0NMUl9CQURfT0xEQkxLKHhkX2NhcmQpOwogCX0KIAorU3RhdHVzX0ZhaWw6CiAJcnRzeF90cmFjZShjaGlwKTsKIAlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CkBAIC0xODMwLDcgKzE4MjIsNiBAQAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAotCiBzdGF0aWMgaW50IHhkX3dyaXRlX211bHRpcGxlX3BhZ2VzKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHUzMiBvbGRfYmxrLAogCQkJCXUzMiBuZXdfYmxrLCB1MzIgbG9nX2JsaywgdTggc3RhcnRfcGFnZSwKIAkJCQl1OCBlbmRfcGFnZSwgdTggKmJ1ZiwgdW5zaWduZWQgaW50ICppbmRleCwKQEAgLTE4NDUsMTAgKzE4MzYsOCBAQAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICIlcywgb2xkX2JsayA9IDB4JXgsIG5ld19ibGsgPSAweCV4LCBsb2dfYmxrID0gMHgleFxuIiwKIAkJX19mdW5jX18sIG9sZF9ibGssIG5ld19ibGssIGxvZ19ibGspOwogCi0JaWYgKHN0YXJ0X3BhZ2UgPiBlbmRfcGFnZSkgewotCQlydHN4X3RyYWNlKGNoaXApOwotCQlyZXR1cm4gU1RBVFVTX0ZBSUw7Ci0JfQorCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpCisJCWdvdG8gU3RhdHVzX0ZhaWw7CiAKIAlwYWdlX2NudCA9IGVuZF9wYWdlIC0gc3RhcnRfcGFnZTsKIAl6b25lX25vID0gKGludCkobG9nX2JsayAvIDEwMDApOwpAQCAtMTg1NywxMCArMTg0Niw4IEBACiAJcGFnZV9hZGRyID0gKG5ld19ibGsgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQpICsgc3RhcnRfcGFnZTsKIAogCXJldHZhbCA9IHhkX3NlbmRfY21kKGNoaXAsIFJFQUQxXzEpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJcnRzeF90cmFjZShjaGlwKTsKLQkJcmV0dXJuIFNUQVRVU19GQUlMOwotCX0KKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlnb3RvIFN0YXR1c19GYWlsOwogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtMTg5NSw4ICsxODgyLDcgQEAKIAogCQlpZiAocmV0dmFsID09IC1FVElNRURPVVQpIHsKIAkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7Ci0JCQlydHN4X3RyYWNlKGNoaXApOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJZ290byBTdGF0dXNfRmFpbDsKIAkJfSBlbHNlIHsKIAkJCXJ0c3hfdHJhY2UoY2hpcCk7CiAJCQlnb3RvIEZhaWw7CkBAIC0xOTM2LDYgKzE5MjIsNyBAQAogCQl4ZF9tYXJrX2JhZF9ibG9jayhjaGlwLCBuZXdfYmxrKTsKIAl9CiAKK1N0YXR1c19GYWlsOgogCXJ0c3hfdHJhY2UoY2hpcCk7CiAJcmV0dXJuIFNUQVRVU19GQUlMOwogfQpAQCAtMjAwMCw3ICsxOTg3LDYgQEAKIAkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAotCiAJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCWNoaXAtPmNhcmRfZmFpbCB8PSBYRF9DQVJEOwogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpYy5oCmluZGV4IGNjMGFmZWUuLjQyMDU0NmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljLmgKQEAgLTkyLDYgKzkyLDcgQEAKIAl1MzIgICAgIGxhc3R0aW1lOwogCXUzMiAgICAgbGFzdGlkOwogfTsKKwogLyoKICAqIFNMSUMgSGFuZGxlIHN0cnVjdHVyZS4gIFVzZWQgdG8gcmVzdHJpY3QgaGFuZGxlIHZhbHVlcyB0bwogICogMzIgYml0cyBieSB1c2luZyBhbiBpbmRleCByYXRoZXIgdGhhbiBhbiBhZGRyZXNzLgpAQCAtMjIzLDggKzIyNCw4IEBACiAKIHN0cnVjdCBzbGljX2lmYWNlX3N0YXRzIHsKIAkvKgotCSogU3RhdHMKLQkqLworCSAqIFN0YXRzCisJICovCiAJdTY0ICAgICAgICB4bXRfYnl0ZXM7CiAJdTY0ICAgICAgICB4bXRfdWNhc3Q7CiAJdTY0ICAgICAgICB4bXRfbWNhc3Q7CkBAIC0zNTEsMTAgKzM1MiwzNSBAQAogCXVpbnQgICAgICAgICAgICAgICAgIGNhcmRudW1pbnVzZVtTTElDX01BWF9DQVJEU107CiB9OwogCi1zdHJ1Y3Qgc2xpY19zaG1lbSB7Ci0Jdm9sYXRpbGUgdTMyICAgICAgICAgIGlzcjsKLQl2b2xhdGlsZSB1MzIgICAgICAgICAgbGlua3N0YXR1czsKLQl2b2xhdGlsZSBzdHJ1Y3Qgc2xpY19zdGF0cyAgICAgaW5pY3N0YXRzOworc3RydWN0IHNsaWNfc3RhdHMgeworCS8qIHhtaXQgc3RhdHMgKi8KKwl1NjQgeG1pdF90Y3BfYnl0ZXM7CisJdTY0IHhtaXRfdGNwX3NlZ3M7CisJdTY0IHhtaXRfYnl0ZXM7CisJdTY0IHhtaXRfY29sbGlzaW9uczsKKwl1NjQgeG1pdF91bmljYXN0czsKKwl1NjQgeG1pdF9vdGhlcl9lcnJvcjsKKwl1NjQgeG1pdF9leGNlc3NfY29sbGlzaW9uczsKKwkvKiByY3Ygc3RhdHMgKi8KKwl1NjQgcmN2X3RjcF9ieXRlczsKKwl1NjQgcmN2X3RjcF9zZWdzOworCXU2NCByY3ZfYnl0ZXM7CisJdTY0IHJjdl91bmljYXN0czsKKwl1NjQgcmN2X290aGVyX2Vycm9yOworCXU2NCByY3ZfZHJvcHM7Cit9OworCitzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhIHsKKwl1MzIgaXNyOworCXUzMiBsbmtzdGF0dXM7CisJc3RydWN0IHNsaWNfc3RhdHMgc3RhdHM7Cit9OworCitzdHJ1Y3Qgc2xpY19zaG1lbW9yeSB7CisJZG1hX2FkZHJfdCBpc3JfcGhhZGRyOworCWRtYV9hZGRyX3QgbG5rc3RhdHVzX3BoYWRkcjsKKwlkbWFfYWRkcl90IHN0YXRzX3BoYWRkcjsKKwlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhIF9faW9tZW0gKnNobWVtX2RhdGE7CiB9OwogCiBzdHJ1Y3Qgc2xpY191cHIgewpAQCAtNDE0LDEwICs0NDAsOSBAQAogCXUzMiAgICAgICAgICAgICBpbnRycmVnaXN0ZXJlZDsKIAl1aW50ICAgICAgICAgICAgICAgIGlzcF9pbml0aWFsaXplZDsKIAl1aW50ICAgICAgICAgICAgICAgIGdlbm51bWJlcjsKLQlzdHJ1Y3Qgc2xpY19zaG1lbSAgICAgICpwc2htZW07CisJc3RydWN0IHNsaWNfc2htZW1vcnkgc2htZW07CiAJZG1hX2FkZHJfdCAgICAgICAgICBwaHlzX3NobWVtOwotCXUzMiAgICAgICAgICAgICBpc3Jjb3B5OwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAgICAgICAqc2xpY19yZWdzOworCXZvaWQgX19pb21lbSAqcmVnczsKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgc3RhdGU7CiAJdW5zaWduZWQgY2hhciAgICAgICAgICAgICAgIGxpbmtzdGF0ZTsKIAl1bnNpZ25lZCBjaGFyICAgICAgICAgICAgICAgbGlua3NwZWVkOwpAQCAtNDQ0LDggKzQ2OSw4IEBACiAJc3RydWN0IHNsaWNfY21kcXVldWUgICAgIGNtZHFfYWxsOwogCXN0cnVjdCBzbGljX2NtZHFtZW0gICAgICBjbWRxbWVtOwogCS8qCi0JKiAgU0xJQyBIYW5kbGVzCi0JKi8KKwkgKiBTTElDIEhhbmRsZXMKKwkgKi8KIAkvKiBPYmplY3QgaGFuZGxlcyovCiAJc3RydWN0IHNsaWNfaGFuZGxlIHNsaWNfaGFuZGxlc1tTTElDX0NNRFFfTUFYQ01EUyArIDFdOwogCS8qIEZyZWUgb2JqZWN0IGhhbmRsZXMqLwpAQCAtNDg3LDYgKzUxMiwzNCBAQAogCXN0cnVjdCBzbGljbmV0X3N0YXRzICAgICBzbGljX3N0YXRzOwogfTsKIAorc3RhdGljIGlubGluZSB1MzIgc2xpY19yZWFkMzIoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCByZWcpCit7CisJcmV0dXJuIGlvcmVhZDMyKGFkYXB0ZXItPnJlZ3MgKyByZWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2xpY193cml0ZTMyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJCXUzMiB2YWwpCit7CisJaW93cml0ZTMyKHZhbCwgYWRhcHRlci0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbGljX3dyaXRlNjQoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCByZWcsCisJCQkJdTMyIHZhbCwgdTMyIGhpYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19BRERSX1VQUEVSLCBoaWFkZHIpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCByZWcsIHZhbCk7CisJbW1pb3diKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbGljX2ZsdXNoX3dyaXRlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCWlvcmVhZDMyKGFkYXB0ZXItPnJlZ3MgKyBTTElDX1JFR19IT1NUSUQpOworfQorCiAjZGVmaW5lIFVQREFURV9TVEFUUyhsYXJnZXN0YXQsIG5ld3N0YXQsIG9sZHN0YXQpICAgICAgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlpZiAoKG5ld3N0YXQpIDwgKG9sZHN0YXQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNody5oIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY2h3LmgKaW5kZXggOTcyM2I0YS4uNDljYjkxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY2h3LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY2h3LmgKQEAgLTI4OSwyMjQgKzI4OSwxMTggQEAKIAl1MzIgcGFkMls0XTsKIH07CiAKLXN0cnVjdCBzbGljX3JlZ3MgewotCXUzMglzbGljX3Jlc2V0OwkvKiBSZXNldCBSZWdpc3RlciAqLwotCXUzMglwYWQwOworLyogUmVzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0xJQ19SRUdfUkVTRVQJCTB4MDAwMAorLyogSW50ZXJydXB0IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0xJQ19SRUdfSUNSCQkweDAwMDgKKy8qIEludGVycnVwdCBzdGF0dXMgcG9pbnRlciAqLworI2RlZmluZSBTTElDX1JFR19JU1AJCTB4MDAxMAorLyogSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBTTElDX1JFR19JU1IJCTB4MDAxOAorLyoKKyAqIEhlYWRlciBidWZmZXIgYWRkcmVzcyByZWcKKyAqIDMxLTggLSBwaHkgYWRkciBvZiBzZXQgb2YgY29udGlndW91cyBoZHIgYnVmZmVycworICogIDctMCAtIG51bWJlciBvZiBidWZmZXJzIHBhc3NlZAorICogQnVmZmVycyBhcmUgMjU2IGJ5dGVzIGxvbmcgb24gMjU2LWJ5dGUgYm91bmRhcmllcy4KKyAqLworI2RlZmluZSBTTElDX1JFR19IQkFSCQkweDAwMjAKKy8qCisgKiBEYXRhIGJ1ZmZlciBoYW5kbGUgJiBhZGRyZXNzIHJlZworICogNCBzZXRzIG9mIHJlZ2lzdGVyczsgQnVmZmVycyBhcmUgMksgYnl0ZXMgbG9uZyAyIHBlciA0SyBwYWdlLgorICovCisjZGVmaW5lIFNMSUNfUkVHX0RCQVIJCTB4MDAyOAorLyoKKyAqIFhtdCBDbWQgYnVmIGFkZHIgcmVncy4KKyAqIDEgcGVyIFhNVCBpbnRlcmZhY2UKKyAqIDMxLTUgLSBwaHkgYWRkciBvZiBob3N0IGNvbW1hbmQgYnVmZmVyCisgKiAgNC0wIC0gbGVuZ3RoIG9mIGNtZCBpbiBtdWx0aXBsZXMgb2YgMzIgYnl0ZXMKKyAqIEJ1ZmZlcnMgYXJlIDMyIGJ5dGVzIHVwIHRvIDUxMiBieXRlcyBsb25nCisgKi8KKyNkZWZpbmUgU0xJQ19SRUdfQ0JBUgkJMHgwMDMwCisvKiBXcml0ZSBjb250cm9sIHN0b3JlICovCisjZGVmaW5lCVNMSUNfUkVHX1dDUwkJMHgwMDM0CisvKgorICogUmVzcG9uc2UgYnVmZmVyIGFkZHJlc3MgcmVnLgorICogMzEtOCAtIHBoeSBhZGRyIG9mIHNldCBvZiBjb250aWd1b3VzIHJlc3BvbnNlIGJ1ZmZlcnMKKyAqIDctMCAtIG51bWJlciBvZiBidWZmZXJzIHBhc3NlZAorICogQnVmZmVycyBhcmUgMzIgYnl0ZXMgbG9uZyBvbiAzMi1ieXRlIGJvdW5kYXJpZXMuCisgKi8KKyNkZWZpbmUJU0xJQ19SRUdfUkJBUgkJMHgwMDM4CisvKiBSZWFkIHN0YXRpc3RpY3MgKFVQUikgKi8KKyNkZWZpbmUJU0xJQ19SRUdfUlNUQVQJCTB4MDA0MAorLyogUmVhZCBsaW5rIHN0YXR1cyAqLworI2RlZmluZQlTTElDX1JFR19MU1RBVAkJMHgwMDQ4CisvKiBXcml0ZSBNYWMgQ29uZmlnICovCisjZGVmaW5lCVNMSUNfUkVHX1dNQ0ZHCQkweDAwNTAKKy8qIFdyaXRlIHBoeSByZWdpc3RlciAqLworI2RlZmluZSBTTElDX1JFR19XUEhZCQkweDAwNTgKKy8qIFJjdiBDbWQgYnVmIGFkZHIgcmVnICovCisjZGVmaW5lCVNMSUNfUkVHX1JDQkFSCQkweDAwNjAKKy8qIFJlYWQgU0xJQyBDb25maWcqLworI2RlZmluZSBTTElDX1JFR19SQ09ORklHCTB4MDA2OAorLyogSW50ZXJydXB0IGFnZ3JlZ2F0aW9uIHRpbWUgKi8KKyNkZWZpbmUgU0xJQ19SRUdfSU5UQUdHCQkweDAwNzAKKy8qIFdyaXRlIFhNSVQgY29uZmlnIHJlZyAqLworI2RlZmluZQlTTElDX1JFR19XWENGRwkJMHgwMDc4CisvKiBXcml0ZSBSQ1YgY29uZmlnIHJlZyAqLworI2RlZmluZQlTTElDX1JFR19XUkNGRwkJMHgwMDgwCisvKiBXcml0ZSByY3YgYWRkciBhIGxvdyAqLworI2RlZmluZQlTTElDX1JFR19XUkFERFJBTAkweDAwODgKKy8qIFdyaXRlIHJjdiBhZGRyIGEgaGlnaCAqLworI2RlZmluZQlTTElDX1JFR19XUkFERFJBSAkweDAwOTAKKy8qIFdyaXRlIHJjdiBhZGRyIGIgbG93ICovCisjZGVmaW5lCVNMSUNfUkVHX1dSQUREUkJMCTB4MDA5OAorLyogV3JpdGUgcmN2IGFkZHIgYiBoaWdoICovCisjZGVmaW5lCVNMSUNfUkVHX1dSQUREUkJICTB4MDBhMAorLyogTG93IGJpdHMgb2YgbWNhc3QgbWFzayAqLworI2RlZmluZQlTTElDX1JFR19NQ0FTVExPVwkweDAwYTgKKy8qIEhpZ2ggYml0cyBvZiBtY2FzdCBtYXNrICovCisjZGVmaW5lCVNMSUNfUkVHX01DQVNUSElHSAkweDAwYjAKKy8qIFBpbmcgdGhlIGNhcmQgKi8KKyNkZWZpbmUgU0xJQ19SRUdfUElORwkJMHgwMGI4CisvKiBEdW1wIGNvbW1hbmQgKi8KKyNkZWZpbmUgU0xJQ19SRUdfRFVNUF9DTUQJMHgwMGMwCisvKiBEdW1wIGRhdGEgcG9pbnRlciAqLworI2RlZmluZSBTTElDX1JFR19EVU1QX0RBVEEJMHgwMGM4CisvKiBSZWFkIGNhcmQncyBwY2lfc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lCVNMSUNfUkVHX1BDSVNUQVRVUwkweDAwZDAKKy8qIFdyaXRlIGhvc3RpZCBmaWVsZCAqLworI2RlZmluZSBTTElDX1JFR19XUkhPU1RJRAkweDAwZDgKKy8qIFB1dCBjYXJkIGluIGEgbG93IHBvd2VyIHN0YXRlICovCisjZGVmaW5lIFNMSUNfUkVHX0xPV19QT1dFUgkweDAwZTAKKy8qIEZvcmNlIHNsaWMgaW50byBxdWllc2NlbnQgc3RhdGUgIGJlZm9yZSBzb2Z0IHJlc2V0ICovCisjZGVmaW5lIFNMSUNfUkVHX1FVSUVTQ0UJMHgwMGU4CisvKiBSZXNldCBpbnRlcmZhY2UgcXVldWVzICovCisjZGVmaW5lIFNMSUNfUkVHX1JFU0VUX0lGQUNFCTB4MDBmMAorLyoKKyAqIFJlZ2lzdGVyIGlzIG9ubHkgd3JpdHRlbiB3aGVuIGl0IGhhcyBjaGFuZ2VkLgorICogQml0cyA2My0zMiBmb3IgaG9zdCBpL2YgYWRkcnMuCisgKi8KKyNkZWZpbmUgU0xJQ19SRUdfQUREUl9VUFBFUgkweDAwZjgKKy8qIDY0IGJpdCBIZWFkZXIgYnVmZmVyIGFkZHJlc3MgcmVnICovCisjZGVmaW5lIFNMSUNfUkVHX0hCQVI2NAkJMHgwMTAwCisvKiA2NCBiaXQgRGF0YSBidWZmZXIgaGFuZGxlICYgYWRkcmVzcyByZWcgKi8KKyNkZWZpbmUgU0xJQ19SRUdfREJBUjY0CQkweDAxMDgKKy8qIDY0IGJpdCBYbXQgQ21kIGJ1ZiBhZGRyIHJlZ3MuICovCisjZGVmaW5lIFNMSUNfUkVHX0NCQVI2NAkJMHgwMTEwCisvKiA2NCBiaXQgUmVzcG9uc2UgYnVmZmVyIGFkZHJlc3MgcmVnLiovCisjZGVmaW5lIFNMSUNfUkVHX1JCQVI2NAkJMHgwMTE4CisvKiA2NCBiaXQgUmN2IENtZCBidWYgYWRkciByZWcqLworI2RlZmluZQlTTElDX1JFR19SQ0JBUjY0CTB4MDEyMAorLyogUmVhZCBzdGF0aXN0aWNzICg2NCBiaXQgVVBSKSAqLworI2RlZmluZQlTTElDX1JFR19SU1RBVDY0CTB4MDEyOAorLyogRG93bmxvYWQgR2lnYWJpdCBSQ1Ygc2VxdWVuY2VyIHVjb2RlICovCisjZGVmaW5lIFNMSUNfUkVHX1JDVl9XQ1MJMHgwMTMwCisvKiBXcml0ZSBWbGFuSWQgZmllbGQgKi8KKyNkZWZpbmUgU0xJQ19SRUdfV1JWTEFOSUQJMHgwMTM4CisvKiBSZWFkIFRyYW5zZm9ybWVyIGluZm8gKi8KKyNkZWZpbmUgU0xJQ19SRUdfUkVBRF9YRl9JTkZPCTB4MDE0MAorLyogV3JpdGUgVHJhbnNmb3JtZXIgaW5mbyAqLworI2RlZmluZSBTTElDX1JFR19XUklURV9YRl9JTkZPCTB4MDE0OAorLyogV3JpdGUgY2FyZCB0aWNrcyBwZXIgc2Vjb25kICovCisjZGVmaW5lIFNMSUNfUkVHX1RJQ0tTX1BFUl9TRUMJMHgwMTcwCiAKLQl1MzIJc2xpY19pY3I7CS8qIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyICovCi0JdTMyCXBhZDI7Ci0jZGVmaW5lIFNMSUNfSUNSCQkweDAwMDgKLQotCXUzMglzbGljX2lzcDsJLyogSW50ZXJydXB0IHN0YXR1cyBwb2ludGVyICovCi0JdTMyCXBhZDE7Ci0jZGVmaW5lIFNMSUNfSVNQCQkweDAwMTAKLQotCXUzMglzbGljX2lzcjsJLyogSW50ZXJydXB0IHN0YXR1cyAqLwotCXUzMglwYWQzOwotI2RlZmluZSBTTElDX0lTUgkJMHgwMDE4Ci0KLQl1MzIJc2xpY19oYmFyOwkvKiBIZWFkZXIgYnVmZmVyIGFkZHJlc3MgcmVnICovCi0JdTMyCXBhZDQ7Ci0JLyoKLQkgKiAzMS04IC0gcGh5IGFkZHIgb2Ygc2V0IG9mIGNvbnRpZ3VvdXMgaGRyIGJ1ZmZlcnMKLQkgKiAgNy0wIC0gbnVtYmVyIG9mIGJ1ZmZlcnMgcGFzc2VkCi0JICogQnVmZmVycyBhcmUgMjU2IGJ5dGVzIGxvbmcgb24gMjU2LWJ5dGUgYm91bmRhcmllcy4KLQkgKi8KLSNkZWZpbmUgU0xJQ19IQkFSCQkweDAwMjAKLSNkZWZpbmUgU0xJQ19IQkFSX0NOVF9NU0sJMHgwMDAwMDBGRgotCi0JdTMyCXNsaWNfZGJhcjsJLyogRGF0YSBidWZmZXIgaGFuZGxlICYgYWRkcmVzcyByZWcgKi8KLQl1MzIJcGFkNTsKLQotCS8qIDQgc2V0cyBvZiByZWdpc3RlcnM7IEJ1ZmZlcnMgYXJlIDJLIGJ5dGVzIGxvbmcgMiBwZXIgNEsgcGFnZS4gKi8KLSNkZWZpbmUgU0xJQ19EQkFSCQkweDAwMjgKLSNkZWZpbmUgU0xJQ19EQkFSX1NJWkUJCTIwNDgKLQotCXUzMglzbGljX2NiYXI7CS8qIFhtdCBDbWQgYnVmIGFkZHIgcmVncy4qLwotCS8qCi0JICogMSBwZXIgWE1UIGludGVyZmFjZQotCSAqIDMxLTUgLSBwaHkgYWRkciBvZiBob3N0IGNvbW1hbmQgYnVmZmVyCi0JICogIDQtMCAtIGxlbmd0aCBvZiBjbWQgaW4gbXVsdGlwbGVzIG9mIDMyIGJ5dGVzCi0JICogQnVmZmVycyBhcmUgMzIgYnl0ZXMgdXAgdG8gNTEyIGJ5dGVzIGxvbmcKLQkgKi8KLSNkZWZpbmUgU0xJQ19DQkFSCQkweDAwMzAKLSNkZWZpbmUgU0xJQ19DQkFSX0xFTl9NU0sJMHgwMDAwMDAxRgotI2RlZmluZSBTTElDX0NCQVJfQUxJR04JCTB4MDAwMDAwMjAKLQotCXUzMglzbGljX3djczsJLyogd3JpdGUgY29udHJvbCBzdG9yZSovCi0jZGVmaW5lCVNMSUNfV0NTCQkweDAwMzQKLSNkZWZpbmUgU0xJQ19XQ1NfU1RBUlQJCTB4ODAwMDAwMDAJLypTdGFydCB0aGUgU0xJQyAoSnVtcCB0byBXQ1MpKi8KLSNkZWZpbmUgU0xJQ19XQ1NfQ09NUEFSRQkweDQwMDAwMDAwCS8qIENvbXBhcmUgd2l0aCB2YWx1ZSBpbiBXQ1MqLwotCi0JdTMyCXNsaWNfcmJhcjsJLyogUmVzcG9uc2UgYnVmZmVyIGFkZHJlc3MgcmVnLiovCi0JdTMyCXBhZDc7Ci0JLyoKLQkgKiAzMS04IC0gcGh5IGFkZHIgb2Ygc2V0IG9mIGNvbnRpZ3VvdXMgcmVzcG9uc2UgYnVmZmVycwotCSAqIDctMCAtIG51bWJlciBvZiBidWZmZXJzIHBhc3NlZAotCSAqIEJ1ZmZlcnMgYXJlIDMyIGJ5dGVzIGxvbmcgb24gMzItYnl0ZSBib3VuZGFyaWVzLgotCSAqLwotI2RlZmluZSBTTElDX1JCQVIJCTB4MDAzOAotI2RlZmluZSBTTElDX1JCQVJfQ05UX01TSwkweDAwMDAwMEZGCi0jZGVmaW5lIFNMSUNfUkJBUl9TSVpFCQkzMgotCi0JdTMyCXNsaWNfc3RhdHM7CS8qIHJlYWQgc3RhdGlzdGljcyAoVVBSKSAqLwotCXUzMglwYWQ4OwotI2RlZmluZQlTTElDX1JTVEFUCQkweDAwNDAKLQotCXUzMglzbGljX3Jsc3I7CS8qIHJlYWQgbGluayBzdGF0dXMgKi8KLQl1MzIJcGFkOTsKLSNkZWZpbmUgU0xJQ19MU1RBVAkJMHgwMDQ4Ci0KLQl1MzIJc2xpY193bWNmZzsJLyogV3JpdGUgTWFjIENvbmZpZyAqLwotCXUzMglwYWQxMDsKLSNkZWZpbmUJU0xJQ19XTUNGRwkJMHgwMDUwCi0KLQl1MzIJc2xpY193cGh5OwkvKiBXcml0ZSBwaHkgcmVnaXN0ZXIgKi8KLQl1MzIJcGFkMTE7Ci0jZGVmaW5lIFNMSUNfV1BIWQkJMHgwMDU4Ci0KLQl1MzIJc2xpY19yY2JhcjsJLyogUmN2IENtZCBidWYgYWRkciByZWcgKi8KLQl1MzIJcGFkMTI7Ci0jZGVmaW5lCVNMSUNfUkNCQVIJCTB4MDA2MAotCi0JdTMyCXNsaWNfcmNvbmZpZzsJLyogUmVhZCBTTElDIENvbmZpZyovCi0JdTMyCXBhZDEzOwotI2RlZmluZSBTTElDX1JDT05GSUcJMHgwMDY4Ci0KLQl1MzIJc2xpY19pbnRhZ2c7CS8qIEludGVycnVwdCBhZ2dyZWdhdGlvbiB0aW1lICovCi0JdTMyCXBhZDE0OwotI2RlZmluZSBTTElDX0lOVEFHRwkJMHgwMDcwCi0KLQl1MzIJc2xpY193eGNmZzsJLyogV3JpdGUgWE1JVCBjb25maWcgcmVnKi8KLQl1MzIJcGFkMTY7Ci0jZGVmaW5lCVNMSUNfV1hDRkcJCTB4MDA3OAotCi0JdTMyCXNsaWNfd3JjZmc7CS8qIFdyaXRlIFJDViBjb25maWcgcmVnKi8KLQl1MzIJcGFkMTc7Ci0jZGVmaW5lCVNMSUNfV1JDRkcJCTB4MDA4MAotCi0JdTMyCXNsaWNfd3JhZGRyYWw7CS8qIFdyaXRlIHJjdiBhZGRyIGEgbG93Ki8KLQl1MzIJcGFkMTg7Ci0jZGVmaW5lCVNMSUNfV1JBRERSQUwJMHgwMDg4Ci0KLQl1MzIJc2xpY193cmFkZHJhaDsJLyogV3JpdGUgcmN2IGFkZHIgYSBoaWdoKi8KLQl1MzIJcGFkMTk7Ci0jZGVmaW5lCVNMSUNfV1JBRERSQUgJMHgwMDkwCi0KLQl1MzIJc2xpY193cmFkZHJibDsJLyogV3JpdGUgcmN2IGFkZHIgYiBsb3cqLwotCXUzMglwYWQyMDsKLSNkZWZpbmUJU0xJQ19XUkFERFJCTAkweDAwOTgKLQotCXUzMglzbGljX3dyYWRkcmJoOwkvKiBXcml0ZSByY3YgYWRkciBiIGhpZ2gqLwotCXUzMgkJcGFkMjE7Ci0jZGVmaW5lCVNMSUNfV1JBRERSQkgJMHgwMGEwCi0KLQl1MzIJc2xpY19tY2FzdGxvdzsJLyogTG93IGJpdHMgb2YgbWNhc3QgbWFzayovCi0JdTMyCQlwYWQyMjsKLSNkZWZpbmUJU0xJQ19NQ0FTVExPVwkweDAwYTgKLQotCXUzMglzbGljX21jYXN0aGlnaDsJLyogSGlnaCBiaXRzIG9mIG1jYXN0IG1hc2sqLwotCXUzMgkJcGFkMjM7Ci0jZGVmaW5lCVNMSUNfTUNBU1RISUdICTB4MDBiMAotCi0JdTMyCXNsaWNfcGluZzsJLyogUGluZyB0aGUgY2FyZCovCi0JdTMyCXBhZDI0OwotI2RlZmluZSBTTElDX1BJTkcJCTB4MDBiOAotCi0JdTMyCXNsaWNfZHVtcF9jbWQ7CS8qIER1bXAgY29tbWFuZCAqLwotCXUzMglwYWQyNTsKLSNkZWZpbmUgU0xJQ19EVU1QX0NNRAkweDAwYzAKLQotCXUzMglzbGljX2R1bXBfZGF0YTsJLyogRHVtcCBkYXRhIHBvaW50ZXIgKi8KLQl1MzIJcGFkMjY7Ci0jZGVmaW5lIFNMSUNfRFVNUF9EQVRBCTB4MDBjOAotCi0JdTMyCXNsaWNfcGNpc3RhdHVzOwkvKiBSZWFkIGNhcmQncyBwY2lfc3RhdHVzIHJlZ2lzdGVyICovCi0JdTMyCXBhZDI3OwotI2RlZmluZQlTTElDX1BDSVNUQVRVUwkweDAwZDAKLQotCXUzMglzbGljX3dyaG9zdGlkOwkvKiBXcml0ZSBob3N0aWQgZmllbGQgKi8KLQl1MzIJCXBhZDI4OwotI2RlZmluZSBTTElDX1dSSE9TVElECQkgMHgwMGQ4Ci0jZGVmaW5lIFNMSUNfUkRIT1NUSURfMUdCCSAweDE1NTQKLSNkZWZpbmUgU0xJQ19SREhPU1RJRF8yR0IJIDB4MTU1NAotCi0JdTMyCXNsaWNfbG93X3Bvd2VyOwkvKiBQdXQgY2FyZCBpbiBhIGxvdyBwb3dlciBzdGF0ZSAqLwotCXUzMglwYWQyOTsKLSNkZWZpbmUgU0xJQ19MT1dfUE9XRVIJMHgwMGUwCi0KLQl1MzIJc2xpY19xdWllc2NlOwkvKiBmb3JjZSBzbGljIGludG8gcXVpZXNjZW50IHN0YXRlCi0JCQkJICogYmVmb3JlIHNvZnQgcmVzZXQKLQkJCQkgKi8KLQl1MzIJcGFkMzA7Ci0jZGVmaW5lIFNMSUNfUVVJRVNDRQkweDAwZTgKLQotCXUzMglzbGljX3Jlc2V0X2lmYWNlOy8qIHJlc2V0IGludGVyZmFjZSBxdWV1ZXMgKi8KLQl1MzIJcGFkMzE7Ci0jZGVmaW5lIFNMSUNfUkVTRVRfSUZBQ0UgMHgwMGYwCi0KLQl1MzIJc2xpY19hZGRyX3VwcGVyOy8qIEJpdHMgNjMtMzIgZm9yIGhvc3QgaS9mIGFkZHJzICovCi0JdTMyCXBhZDMyOwotI2RlZmluZSBTTElDX0FERFJfVVBQRVIJMHgwMGY4IC8qUmVnaXN0ZXIgaXMgb25seSB3cml0dGVuIHdoZW4gaXQgaGFzIGNoYW5nZWQqLwotCi0JdTMyCXNsaWNfaGJhcjY0OwkvKiA2NCBiaXQgSGVhZGVyIGJ1ZmZlciBhZGRyZXNzIHJlZyAqLwotCXUzMglwYWQzMzsKLSNkZWZpbmUgU0xJQ19IQkFSNjQJCTB4MDEwMAotCi0JdTMyCXNsaWNfZGJhcjY0OwkvKiA2NCBiaXQgRGF0YSBidWZmZXIgaGFuZGxlICYgYWRkcmVzcyByZWcgKi8KLQl1MzIJcGFkMzQ7Ci0jZGVmaW5lIFNMSUNfREJBUjY0CQkweDAxMDgKLQotCXUzMglzbGljX2NiYXI2NDsJLyogNjQgYml0IFhtdCBDbWQgYnVmIGFkZHIgcmVncy4gKi8KLQl1MzIJcGFkMzU7Ci0jZGVmaW5lIFNMSUNfQ0JBUjY0CQkweDAxMTAKLQotCXUzMglzbGljX3JiYXI2NDsJLyogNjQgYml0IFJlc3BvbnNlIGJ1ZmZlciBhZGRyZXNzIHJlZy4qLwotCXUzMglwYWQzNjsKLSNkZWZpbmUgU0xJQ19SQkFSNjQJCTB4MDExOAotCi0JdTMyCXNsaWNfcmNiYXI2NDsJLyogNjQgYml0IFJjdiBDbWQgYnVmIGFkZHIgcmVnKi8KLQl1MzIJcGFkMzc7Ci0jZGVmaW5lCVNMSUNfUkNCQVI2NAkweDAxMjAKLQotCXUzMglzbGljX3N0YXRzNjQ7CS8qIHJlYWQgc3RhdGlzdGljcyAoNjQgYml0IFVQUikgKi8KLQl1MzIJcGFkMzg7Ci0jZGVmaW5lCVNMSUNfUlNUQVQ2NAkweDAxMjgKLQotCXUzMglzbGljX3Jjdl93Y3M7CS8qRG93bmxvYWQgR2lnYWJpdCBSQ1Ygc2VxdWVuY2VyIHVjb2RlKi8KLQl1MzIJcGFkMzk7Ci0jZGVmaW5lIFNMSUNfUkNWX1dDUwkweDAxMzAKLSNkZWZpbmUgU0xJQ19SQ1ZXQ1NfQkVHSU4JMHg0MDAwMDAwMAotI2RlZmluZSBTTElDX1JDVldDU19GSU5JU0gJMHg4MDAwMDAwMAotCi0JdTMyCXNsaWNfd3J2bGFuaWQ7CS8qIFdyaXRlIFZsYW5JZCBmaWVsZCAqLwotCXUzMglwYWQ0MDsKLSNkZWZpbmUgU0xJQ19XUlZMQU5JRAkweDAxMzgKLQotCXUzMglzbGljX3JlYWRfeGZfaW5mbzsJLyogUmVhZCBUcmFuc2Zvcm1lciBpbmZvICovCi0JdTMyCXBhZDQxOwotI2RlZmluZSBTTElDX1JFQURfWEZfSU5GTwkweDAxNDAKLQotCXUzMglzbGljX3dyaXRlX3hmX2luZm87CS8qIFdyaXRlIFRyYW5zZm9ybWVyIGluZm8gKi8KLQl1MzIJcGFkNDI7Ci0jZGVmaW5lIFNMSUNfV1JJVEVfWEZfSU5GTwkweDAxNDgKLQotCXUzMglSU1ZEMTsJCS8qIFRPRSBPbmx5ICovCi0JdTMyCXBhZDQzOwotCi0JdTMyCVJTVkQyOwkJLyogVE9FIE9ubHkgKi8KLQl1MzIJcGFkNDQ7Ci0KLQl1MzIJUlNWRDM7CQkvKiBUT0UgT25seSAqLwotCXUzMglwYWQ0NTsKLQotCXUzMglSU1ZENDsJCS8qIFRPRSBPbmx5ICovCi0JdTMyCXBhZDQ2OwotCi0JdTMyCXNsaWNfdGlja3NfcGVyX3NlYzsgLyogV3JpdGUgY2FyZCB0aWNrcyBwZXIgc2Vjb25kICovCi0JdTMyCXBhZDQ3OwotI2RlZmluZSBTTElDX1RJQ0tTX1BFUl9TRUMJMHgwMTcwCi19OworI2RlZmluZSBTTElDX1JFR19IT1NUSUQJCTB4MTU1NAogCiBlbnVtIFVQUl9SRVFVRVNUIHsKIAlTTElDX1VQUl9TVEFUUywKQEAgLTU2NSw4NSArNDU5LDYgQEAKIAlzdHJ1Y3Qgc2xpY3BtX3dha2V1cF9jYXBhYmlsaXRpZXMgd2FrZXVwX2NhcGFiaWxpdGllczsKIH07CiAKLXN0cnVjdCB4bXRfc3RhdHMgewotCXUzMiB4bWl0X3RjcF9ieXRlczsKLQl1MzIgeG1pdF90Y3Bfc2VnczsKLQl1MzIgeG1pdF9ieXRlczsKLQl1MzIgeG1pdF9jb2xsaXNpb25zOwotCXUzMiB4bWl0X3VuaWNhc3RzOwotCXUzMiB4bWl0X290aGVyX2Vycm9yOwotCXUzMiB4bWl0X2V4Y2Vzc19jb2xsaXNpb25zOwotfTsKLQotc3RydWN0IHJjdl9zdGF0cyB7Ci0JdTMyIHJjdl90Y3BfYnl0ZXM7Ci0JdTMyIHJjdl90Y3Bfc2VnczsKLQl1MzIgcmN2X2J5dGVzOwotCXUzMiByY3ZfdW5pY2FzdHM7Ci0JdTMyIHJjdl9vdGhlcl9lcnJvcjsKLQl1MzIgcmN2X2Ryb3BzOwotfTsKLQotc3RydWN0IHhtdF9zdGF0c2diIHsKLQl1NjQgeG1pdF90Y3BfYnl0ZXM7Ci0JdTY0IHhtaXRfdGNwX3NlZ3M7Ci0JdTY0IHhtaXRfYnl0ZXM7Ci0JdTY0IHhtaXRfY29sbGlzaW9uczsKLQl1NjQgeG1pdF91bmljYXN0czsKLQl1NjQgeG1pdF9vdGhlcl9lcnJvcjsKLQl1NjQgeG1pdF9leGNlc3NfY29sbGlzaW9uczsKLX07Ci0KLXN0cnVjdCByY3Zfc3RhdHNnYiB7Ci0JdTY0IHJjdl90Y3BfYnl0ZXM7Ci0JdTY0IHJjdl90Y3Bfc2VnczsKLQl1NjQgcmN2X2J5dGVzOwotCXU2NCByY3ZfdW5pY2FzdHM7Ci0JdTY0IHJjdl9vdGhlcl9lcnJvcjsKLQl1NjQgcmN2X2Ryb3BzOwotfTsKLQotc3RydWN0IHNsaWNfc3RhdHMgewotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXN0cnVjdCB4bXRfc3RhdHMgeG10MTAwOwotCQkJc3RydWN0IHJjdl9zdGF0cyByY3YxMDA7Ci0JCX0gc3RhdHNfMTAwOwotCQlzdHJ1Y3QgewotCQkJc3RydWN0IHhtdF9zdGF0c2diIHhtdEdCOwotCQkJc3RydWN0IHJjdl9zdGF0c2diIHJjdkdCOwotCQl9IHN0YXRzX0dCOwotCX0gdTsKLX07Ci0KLSNkZWZpbmUgeG1pdF90Y3Bfc2VnczEwMAkJdS5zdGF0c18xMDAueG10MTAwLnhtaXRfdGNwX3NlZ3MKLSNkZWZpbmUgeG1pdF90Y3BfYnl0ZXMxMDAJCXUuc3RhdHNfMTAwLnhtdDEwMC54bWl0X3RjcF9ieXRlcwotI2RlZmluZSB4bWl0X2J5dGVzMTAwCQkJdS5zdGF0c18xMDAueG10MTAwLnhtaXRfYnl0ZXMKLSNkZWZpbmUgeG1pdF9jb2xsaXNpb25zMTAwCQl1LnN0YXRzXzEwMC54bXQxMDAueG1pdF9jb2xsaXNpb25zCi0jZGVmaW5lIHhtaXRfdW5pY2FzdHMxMDAJCXUuc3RhdHNfMTAwLnhtdDEwMC54bWl0X3VuaWNhc3RzCi0jZGVmaW5lIHhtaXRfb3RoZXJfZXJyb3IxMDAJCXUuc3RhdHNfMTAwLnhtdDEwMC54bWl0X290aGVyX2Vycm9yCi0jZGVmaW5lIHhtaXRfZXhjZXNzX2NvbGxpc2lvbnMxMDAJdS5zdGF0c18xMDAueG10MTAwLnhtaXRfZXhjZXNzX2NvbGxpc2lvbnMKLSNkZWZpbmUgcmN2X3RjcF9zZWdzMTAwCQkJdS5zdGF0c18xMDAucmN2MTAwLnJjdl90Y3Bfc2VncwotI2RlZmluZSByY3ZfdGNwX2J5dGVzMTAwCQl1LnN0YXRzXzEwMC5yY3YxMDAucmN2X3RjcF9ieXRlcwotI2RlZmluZSByY3ZfYnl0ZXMxMDAJCQl1LnN0YXRzXzEwMC5yY3YxMDAucmN2X2J5dGVzCi0jZGVmaW5lIHJjdl91bmljYXN0czEwMAkJCXUuc3RhdHNfMTAwLnJjdjEwMC5yY3ZfdW5pY2FzdHMKLSNkZWZpbmUgcmN2X290aGVyX2Vycm9yMTAwCQl1LnN0YXRzXzEwMC5yY3YxMDAucmN2X290aGVyX2Vycm9yCi0jZGVmaW5lIHJjdl9kcm9wczEwMAkJCXUuc3RhdHNfMTAwLnJjdjEwMC5yY3ZfZHJvcHMKLSNkZWZpbmUgeG1pdF90Y3Bfc2Vnc19nYgkJdS5zdGF0c19HQi54bXRHQi54bWl0X3RjcF9zZWdzCi0jZGVmaW5lIHhtaXRfdGNwX2J5dGVzX2diCQl1LnN0YXRzX0dCLnhtdEdCLnhtaXRfdGNwX2J5dGVzCi0jZGVmaW5lIHhtaXRfYnl0ZXNfZ2IJCQl1LnN0YXRzX0dCLnhtdEdCLnhtaXRfYnl0ZXMKLSNkZWZpbmUgeG1pdF9jb2xsaXNpb25zX2diCQl1LnN0YXRzX0dCLnhtdEdCLnhtaXRfY29sbGlzaW9ucwotI2RlZmluZSB4bWl0X3VuaWNhc3RzX2diCQl1LnN0YXRzX0dCLnhtdEdCLnhtaXRfdW5pY2FzdHMKLSNkZWZpbmUgeG1pdF9vdGhlcl9lcnJvcl9nYgkJdS5zdGF0c19HQi54bXRHQi54bWl0X290aGVyX2Vycm9yCi0jZGVmaW5lIHhtaXRfZXhjZXNzX2NvbGxpc2lvbnNfZ2IJdS5zdGF0c19HQi54bXRHQi54bWl0X2V4Y2Vzc19jb2xsaXNpb25zCi0KLSNkZWZpbmUgcmN2X3RjcF9zZWdzX2diCQkJdS5zdGF0c19HQi5yY3ZHQi5yY3ZfdGNwX3NlZ3MKLSNkZWZpbmUgcmN2X3RjcF9ieXRlc19nYgkJdS5zdGF0c19HQi5yY3ZHQi5yY3ZfdGNwX2J5dGVzCi0jZGVmaW5lIHJjdl9ieXRlc19nYgkJCXUuc3RhdHNfR0IucmN2R0IucmN2X2J5dGVzCi0jZGVmaW5lIHJjdl91bmljYXN0c19nYgkJCXUuc3RhdHNfR0IucmN2R0IucmN2X3VuaWNhc3RzCi0jZGVmaW5lIHJjdl9vdGhlcl9lcnJvcl9nYgkJdS5zdGF0c19HQi5yY3ZHQi5yY3Zfb3RoZXJfZXJyb3IKLSNkZWZpbmUgcmN2X2Ryb3BzX2diCQkJdS5zdGF0c19HQi5yY3ZHQi5yY3ZfZHJvcHMKLQogc3RydWN0IHNsaWNfY29uZmlnX21hYyB7CiAJdTggbWFjYWRkckFbNl07CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCmluZGV4IGFjMTI2ZDQuLjA2MjMwN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKQEAgLTEyNCwzMSArMTI0LDEwIEBACiAJeyAwIH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc2xpY19ldGh0b29sX29wczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgc2xpY19ldGh0b29sX29wczsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHNsaWNfcGNpX3RibCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzbGljX3JlZzMyX3dyaXRlKHZvaWQgX19pb21lbSAqcmVnLCB1MzIgdmFsdWUsIGJvb2wgZmx1c2gpCi17Ci0Jd3JpdGVsKHZhbHVlLCByZWcpOwotCWlmIChmbHVzaCkKLQkJbWIoKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNsaWNfcmVnNjRfd3JpdGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHZvaWQgX19pb21lbSAqcmVnLAotCQkJCSAgICB1MzIgdmFsdWUsIHZvaWQgX19pb21lbSAqcmVnaCwgdTMyIHBhZGRyaCwKLQkJCQkgICAgYm9vbCBmbHVzaCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOwotCXdyaXRlbChwYWRkcmgsIHJlZ2gpOwotCXdyaXRlbCh2YWx1ZSwgcmVnKTsKLQlpZiAoZmx1c2gpCi0JCW1iKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNsaWNfbWNhc3Rfc2V0X2JpdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgY2hhciAqYWRkcmVzcykKIHsKIAl1bnNpZ25lZCBjaGFyIGNyY3BvbHk7CkBAIC0xNzIsOCArMTUxLDYgQEAKIAogc3RhdGljIHZvaWQgc2xpY19tY2FzdF9zZXRfbWFzayhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKLQogCWlmIChhZGFwdGVyLT5tYWNvcHRzICYgKE1BQ19BTExNQ0FTVCB8IE1BQ19QUk9NSVNDKSkgewogCQkvKgogCQkgKiBUdXJuIG9uIGFsbCBtdWx0aWNhc3QgYWRkcmVzc2VzLiBXZSBoYXZlIHRvIGRvIHRoaXMgZm9yCkBAIC0xODEsMTggKzE1OCwxNyBAQAogCQkgKiBNaWNyb2NvZGUgZnJvbSBoYXZpbmcgdG8ga2VlcCBzdGF0ZSBhYm91dCB0aGUgTUFDCiAJCSAqIGNvbmZpZ3VyYXRpb24uCiAJCSAqLwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfbWNhc3Rsb3csIDB4RkZGRkZGRkYsIEZMVVNIKTsKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX21jYXN0aGlnaCwgMHhGRkZGRkZGRiwKLQkJCQkgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfTUNBU1RMT1csIDB4RkZGRkZGRkYpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfTUNBU1RISUdILCAweEZGRkZGRkZGKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBDb21taXQgb3VyIG11bHRpY2FzdCBtYXN0IHRvIHRoZSBTTElDIGJ5IHdyaXRpbmcgdG8gdGhlCiAJCSAqIG11bHRpY2FzdCBhZGRyZXNzIG1hc2sgcmVnaXN0ZXJzCiAJCSAqLwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfbWNhc3Rsb3csCi0JCQkodTMyKShhZGFwdGVyLT5tY2FzdG1hc2sgJiAweEZGRkZGRkZGKSwgRkxVU0gpOwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfbWNhc3RoaWdoLAotCQkJKHUzMikoKGFkYXB0ZXItPm1jYXN0bWFzayA+PiAzMikgJiAweEZGRkZGRkZGKSwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfTUNBU1RMT1csCisJCQkgICAgICh1MzIpKGFkYXB0ZXItPm1jYXN0bWFzayAmIDB4RkZGRkZGRkYpKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX01DQVNUSElHSCwKKwkJCSAgICAgKHUzMikoKGFkYXB0ZXItPm1jYXN0bWFzayA+PiAzMikgJiAweEZGRkZGRkZGKSk7CiAJfQogfQogCkBAIC0yMDgsMTMgKzE4NCw2IEBACiAJYWRkX3RpbWVyKCZhZGFwdGVyLT5waW5ndGltZXIpOwogfQogCi1zdGF0aWMgdm9pZCBzbGljX3VubWFwX21taW9fc3BhY2Uoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKGFkYXB0ZXItPnNsaWNfcmVncykKLQkJaW91bm1hcChhZGFwdGVyLT5zbGljX3JlZ3MpOwotCWFkYXB0ZXItPnNsaWNfcmVncyA9IE5VTEw7Ci19Ci0KIC8qCiAgKiAgc2xpY19saW5rX2NvbmZpZwogICoKQEAgLTIyNCw3ICsxOTMsNiBAQAogc3RhdGljIHZvaWQgc2xpY19saW5rX2NvbmZpZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKIAkJICAgICAgdTMyIGxpbmtzcGVlZCwgdTMyIGxpbmtkdXBsZXgpCiB7Ci0JdTMyIF9faW9tZW0gKndwaHk7CiAJdTMyIHNwZWVkOwogCXUzMiBkdXBsZXg7CiAJdTMyIHBoeV9jb25maWc7CkBAIC0yMzksOCArMjA3LDYgQEAKIAlpZiAobGlua2R1cGxleCA+IExJTktfQVVUT0QpCiAJCWxpbmtkdXBsZXggPSBMSU5LX0FVVE9EOwogCi0Jd3BoeSA9ICZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfd3BoeTsKLQogCWlmICgobGlua3NwZWVkID09IExJTktfQVVUT1NQRUVEKSB8fCAobGlua3NwZWVkID09IExJTktfMTAwME1CKSkgewogCQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBBREFQVF9GTEFHU19GSUJFUk1FRElBKSB7CiAJCQkvKgpAQCAtMjUyLDcgKzIxOCw3IEBACiAJCQlwaHlfYWR2cmVnID0gKE1JSUNSX1JFR180IHwgKFBBUl9BRFYxMDAwWEZEKSk7CiAJCQkvKiBlbmFibGUgUEFVU0UgZnJhbWVzICAgICAgICAqLwogCQkJcGh5X2FkdnJlZyB8PSBQQVJfQVNZTVBBVVNFX0ZJQkVSOwotCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfYWR2cmVnLCBGTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwgcGh5X2FkdnJlZyk7CiAKIAkJCWlmIChsaW5rc3BlZWQgPT0gTElOS19BVVRPU1BFRUQpIHsKIAkJCQkvKiByZXNldCBwaHksIGVuYWJsZSBhdXRvLW5lZyAgKi8KQEAgLTI2MCwxNCArMjI2LDE3IEBACiAJCQkJICAgIChNSUlDUl9SRUdfUENSIHwKIAkJCQkgICAgIChQQ1JfUkVTRVQgfCBQQ1JfQVVUT05FRyB8CiAJCQkJICAgICAgUENSX0FVVE9ORUdfUlNUKSk7Ci0JCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7CisJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksCisJCQkJCSAgICAgcGh5X2NvbmZpZyk7CiAJCQl9IGVsc2UgewkvKiBmb3JjZWQgMTAwMCBNYiBGRCovCiAJCQkJLyoKIAkJCQkgKiBwb3dlciBkb3duIHBoeSB0byBicmVhayBsaW5rCiAJCQkJICogdGhpcyBtYXkgbm90IHdvcmspCiAJCQkJICovCiAJCQkJcGh5X2NvbmZpZyA9IChNSUlDUl9SRUdfUENSIHwgUENSX1BPV0VSRE9XTik7Ci0JCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7CisJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksCisJCQkJCSAgICAgcGh5X2NvbmZpZyk7CisJCQkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKIAkJCQkvKgogCQkJCSAqIHdhaXQsIE1hcnZlbGwgc2F5cyAxIHNlYywKIAkJCQkgKiB0cnkgdG8gZ2V0IGF3YXkgd2l0aCAxMCBtcwpAQCAtMjgyLDcgKzI1MSw4IEBACiAJCQkJICAgIChNSUlDUl9SRUdfUENSIHwKIAkJCQkgICAgIChQQ1JfUkVTRVQgfCBQQ1JfU1BFRURfMTAwMCB8CiAJCQkJICAgICAgUENSX0RVUExFWF9GVUxMKSk7Ci0JCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7CisJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksCisJCQkJCSAgICAgcGh5X2NvbmZpZyk7CiAJCQl9CiAJCX0gZWxzZSB7CS8qIGNvcHBlciBnaWdhYml0ICovCiAKQEAgLTMwOSwxMCArMjc5LDEwIEBACiAJCQlwaHlfYWR2cmVnIHw9IFBBUl9BU1lNUEFVU0U7CiAJCQkvKiByZXF1aXJlZCBieSB0aGUgQ2ljYWRhIFBIWSAgKi8KIAkJCXBoeV9hZHZyZWcgfD0gUEFSXzgwMl8zOwotCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfYWR2cmVnLCBGTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwgcGh5X2FkdnJlZyk7CiAJCQkvKiBhZHZlcnRpc2UgRkQgb25seSBAMTAwMCBNYiAgKi8KIAkJCXBoeV9nY3RscmVnID0gKE1JSUNSX1JFR185IHwgKFBHQ19BRFYxMDAwRkQpKTsKLQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2djdGxyZWcsIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLCBwaHlfZ2N0bHJlZyk7CiAKIAkJCWlmIChhZGFwdGVyLT5zdWJzeXNpZCAhPSBTTElDXzFHQl9DSUNBREFfU1VCU1lTX0lEKSB7CiAJCQkJLyoKQEAgLTMyMSwyMCArMjkxLDIzIEBACiAJCQkJICovCiAJCQkJcGh5X2NvbmZpZyA9CiAJCQkJICAgIChNSUlDUl9SRUdfMTYgfCAoTVJWX1JFRzE2X1hPVkVST04pKTsKLQkJCQlzbGljX3JlZzMyX3dyaXRlKHdwaHksIHBoeV9jb25maWcsIEZMVVNIKTsKKwkJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwKKwkJCQkJICAgICBwaHlfY29uZmlnKTsKIAogCQkJCS8qIHJlc2V0IHBoeSwgZW5hYmxlIGF1dG8tbmVnICAqLwogCQkJCXBoeV9jb25maWcgPQogCQkJCSAgICAoTUlJQ1JfUkVHX1BDUiB8CiAJCQkJICAgICAoUENSX1JFU0VUIHwgUENSX0FVVE9ORUcgfAogCQkJCSAgICAgIFBDUl9BVVRPTkVHX1JTVCkpOwotCQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOworCQkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLAorCQkJCQkgICAgIHBoeV9jb25maWcpOwogCQkJfSBlbHNlIHsJLyogaXQncyBhIENpY2FkYSBQSFkgICovCiAJCQkJLyogZW5hYmxlIGFuZCByZXN0YXJ0IGF1dG8tbmVnIChkb24ndCByZXNldCkgICovCiAJCQkJcGh5X2NvbmZpZyA9CiAJCQkJICAgIChNSUlDUl9SRUdfUENSIHwKIAkJCQkgICAgIChQQ1JfQVVUT05FRyB8IFBDUl9BVVRPTkVHX1JTVCkpOwotCQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOworCQkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLAorCQkJCQkgICAgIHBoeV9jb25maWcpOwogCQkJfQogCQl9CiAJfSBlbHNlIHsKQEAgLTM1NCwxMyArMzI3LDEzIEBACiAJCQkgKiBkaXNhYmxlIGF1dG8gY3Jvc3NvdmVyCiAJCQkgKi8KIAkJCXBoeV9jb25maWcgPSAoTUlJQ1JfUkVHXzE2IHwgKE1SVl9SRUcxNl9YT1ZFUk9GRikpOwotCQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwgcGh5X2NvbmZpZyk7CiAJCX0KIAogCQkvKiBwb3dlciBkb3duIHBoeSB0byBicmVhayBsaW5rICh0aGlzIG1heSBub3Qgd29yaykgICovCiAJCXBoeV9jb25maWcgPSAoTUlJQ1JfUkVHX1BDUiB8IChQQ1JfUE9XRVJET1dOIHwgc3BlZWQgfCBkdXBsZXgpKTsKLQkJc2xpY19yZWczMl93cml0ZSh3cGh5LCBwaHlfY29uZmlnLCBGTFVTSCk7Ci0KKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksIHBoeV9jb25maWcpOworCQlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOwogCQkvKiB3YWl0LCBNYXJ2ZWxsIHNheXMgMSBzZWMsIHRyeSB0byBnZXQgYXdheSB3aXRoIDEwIG1zICovCiAJCW1kZWxheSgxMCk7CiAKQEAgLTM3MiwxMSArMzQ1LDExIEBACiAJCQkgKi8KIAkJCXBoeV9jb25maWcgPQogCQkJICAgIChNSUlDUl9SRUdfUENSIHwgKFBDUl9SRVNFVCB8IHNwZWVkIHwgZHVwbGV4KSk7Ci0JCQlzbGljX3JlZzMyX3dyaXRlKHdwaHksIHBoeV9jb25maWcsIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XUEhZLCBwaHlfY29uZmlnKTsKIAkJfSBlbHNlIHsJLyogaXQncyBhIENpY2FkYSBQSFkgICovCiAJCQkvKiBkaXNhYmxlIGF1dG8tbmVnLCBzZXQgc3BlZWQsIHBvd2VydXAgICovCiAJCQlwaHlfY29uZmlnID0gKE1JSUNSX1JFR19QQ1IgfCAoc3BlZWQgfCBkdXBsZXgpKTsKLQkJCXNsaWNfcmVnMzJfd3JpdGUod3BoeSwgcGh5X2NvbmZpZywgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dQSFksIHBoeV9jb25maWcpOwogCQl9CiAJfQogfQpAQCAtMzg2LDcgKzM1OSw2IEBACiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKIAljb25zdCBjaGFyICpmaWxlID0gIiI7CiAJaW50IHJldDsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAl1MzIgY29kZWFkZHI7CiAJdTMyIGluc3RydWN0aW9uOwogCWludCBpbmRleCA9IDA7CkBAIC00MjcsMjcgKzM5OSwyOCBAQAogCQlicmVhazsKIAl9CiAJLyogc3RhcnQgZG93bmxvYWQgKi8KLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfcmN2X3djcywgU0xJQ19SQ1ZXQ1NfQkVHSU4sIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfUkNWX1dDUywgU0xJQ19SQ1ZXQ1NfQkVHSU4pOwogCS8qIGRvd25sb2FkIHRoZSByY3Ygc2VxdWVuY2VyIHVjb2RlICovCiAJZm9yIChjb2RlYWRkciA9IDA7IGNvZGVhZGRyIDwgcmN2dWNvZGVsZW47IGNvZGVhZGRyKyspIHsKIAkJLyogd3JpdGUgb3V0IGluc3RydWN0aW9uIGFkZHJlc3MgKi8KLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3Jjdl93Y3MsIGNvZGVhZGRyLCBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19SQ1ZfV0NTLCBjb2RlYWRkcik7CiAKIAkJaW5zdHJ1Y3Rpb24gPSAqKHUzMiAqKShmdy0+ZGF0YSArIGluZGV4KTsKIAkJaW5kZXggKz0gNDsKIAkJLyogd3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbiBkYXRhIGxvdyBhZGRyICovCi0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19yY3Zfd2NzLCBpbnN0cnVjdGlvbiwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfUkNWX1dDUywgaW5zdHJ1Y3Rpb24pOwogCiAJCWluc3RydWN0aW9uID0gKih1OCAqKShmdy0+ZGF0YSArIGluZGV4KTsKIAkJaW5kZXgrKzsKIAkJLyogd3JpdGUgb3V0IHRoZSBpbnN0cnVjdGlvbiBkYXRhIGhpZ2ggYWRkciAqLwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfcmN2X3djcywgKHU4KWluc3RydWN0aW9uLAotCQkJCSBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19SQ1ZfV0NTLCBpbnN0cnVjdGlvbik7CiAJfQogCiAJLyogZG93bmxvYWQgZmluaXNoZWQgKi8KIAlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfcmN2X3djcywgU0xJQ19SQ1ZXQ1NfRklOSVNILCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1JDVl9XQ1MsIFNMSUNfUkNWV0NTX0ZJTklTSCk7CisJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKKwogCXJldHVybiAwOwogfQogCkBAIC00NjIsNyArNDM1LDYgQEAKIAl1MzIgc2VjdGlvbjsKIAlpbnQgdGhpc3NlY3Rpb25zaXplOwogCWludCBjb2RlYWRkcjsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAl1MzIgaW5zdHJ1Y3Rpb247CiAJdTMyIGJhc2VhZGRyZXNzOwogCXUzMiBpOwpAQCAtNTA2LDE3ICs0NzgsMTcgQEAKIAogCQlmb3IgKGNvZGVhZGRyID0gMDsgY29kZWFkZHIgPCB0aGlzc2VjdGlvbnNpemU7IGNvZGVhZGRyKyspIHsKIAkJCS8qIFdyaXRlIG91dCBpbnN0cnVjdGlvbiBhZGRyZXNzICovCi0JCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd2NzLAotCQkJCQkgYmFzZWFkZHJlc3MgKyBjb2RlYWRkciwgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dDUywKKwkJCQkgICAgIGJhc2VhZGRyZXNzICsgY29kZWFkZHIpOwogCQkJLyogV3JpdGUgb3V0IGluc3RydWN0aW9uIHRvIGxvdyBhZGRyICovCi0JCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd2NzLAotCQkJCQlpbnN0cnVjdGlvbiwgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dDUywKKwkJCQkgICAgIGluc3RydWN0aW9uKTsKIAkJCWluc3RydWN0aW9uID0gKih1MzIgKikoZnctPmRhdGEgKyBpbmRleCk7CiAJCQlpbmRleCArPSA0OwogCiAJCQkvKiBXcml0ZSBvdXQgaW5zdHJ1Y3Rpb24gdG8gaGlnaCBhZGRyICovCi0JCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd2NzLAotCQkJCQlpbnN0cnVjdGlvbiwgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dDUywKKwkJCQkgICAgIGluc3RydWN0aW9uKTsKIAkJCWluc3RydWN0aW9uID0gKih1MzIgKikoZnctPmRhdGEgKyBpbmRleCk7CiAJCQlpbmRleCArPSA0OwogCQl9CkBAIC01MzEsMjcgKzUwMywyNSBAQAogCiAJCWZvciAoY29kZWFkZHIgPSAwOyBjb2RlYWRkciA8IHRoaXNzZWN0aW9uc2l6ZTsgY29kZWFkZHIrKykgewogCQkJLyogV3JpdGUgb3V0IGluc3RydWN0aW9uIGFkZHJlc3MgKi8KLQkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193Y3MsCi0JCQkJU0xJQ19XQ1NfQ09NUEFSRSB8IChiYXNlYWRkcmVzcyArIGNvZGVhZGRyKSwKLQkJCQlGTFVTSCk7CisJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV0NTLAorCQkJCSAgICAgU0xJQ19XQ1NfQ09NUEFSRSB8IChiYXNlYWRkcmVzcyArCisJCQkJCQkJIGNvZGVhZGRyKSk7CiAJCQkvKiBXcml0ZSBvdXQgaW5zdHJ1Y3Rpb24gdG8gbG93IGFkZHIgKi8KLQkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193Y3MsIGluc3RydWN0aW9uLAotCQkJCQkgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dDUywgaW5zdHJ1Y3Rpb24pOwogCQkJaW5zdHJ1Y3Rpb24gPSAqKHUzMiAqKShmdy0+ZGF0YSArIGluZGV4KTsKIAkJCWluZGV4ICs9IDQ7CiAJCQkvKiBXcml0ZSBvdXQgaW5zdHJ1Y3Rpb24gdG8gaGlnaCBhZGRyICovCi0JCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd2NzLCBpbnN0cnVjdGlvbiwKLQkJCQkJIEZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XQ1MsIGluc3RydWN0aW9uKTsKIAkJCWluc3RydWN0aW9uID0gKih1MzIgKikoZnctPmRhdGEgKyBpbmRleCk7CiAJCQlpbmRleCArPSA0OwotCiAJCX0KIAl9CiAJcmVsZWFzZV9maXJtd2FyZShmdyk7CiAJLyogRXZlcnl0aGluZyBPSywga2ljayBvZmYgdGhlIGNhcmQgKi8KIAltZGVsYXkoMTApOwotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193Y3MsIFNMSUNfV0NTX1NUQVJULCBGTFVTSCk7CiAKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV0NTLCBTTElDX1dDU19TVEFSVCk7CisJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKIAkvKgogCSAqIHN0YWxsIGZvciAyMCBtcywgbG9uZyBlbm91Z2ggZm9yIHVjb2RlIHRvIGluaXQgY2FyZAogCSAqIGFuZCByZWFjaCBtYWlubG9vcApAQCAtNTgzLDE5ICs1NTMsMjEgQEAKIAogc3RhdGljIHZvaWQgc2xpY19pbnRhZ2dfc2V0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgdmFsdWUpCiB7Ci0Jc2xpY19yZWczMl93cml0ZSgmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2ludGFnZywgdmFsdWUsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSU5UQUdHLCB2YWx1ZSk7CiAJYWRhcHRlci0+Y2FyZC0+bG9hZGxldmVsX2N1cnJlbnQgPSB2YWx1ZTsKIH0KIAogc3RhdGljIHZvaWQgc2xpY19zb2Z0X3Jlc2V0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCWlmIChhZGFwdGVyLT5jYXJkLT5zdGF0ZSA9PSBDQVJEX1VQKSB7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19xdWllc2NlLCAwLCBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19RVUlFU0NFLCAwKTsKKwkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKIAkJbWRlbGF5KDEpOwogCX0KIAotCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19yZXNldCwgU0xJQ19SRVNFVF9NQUdJQywKLQkJCSBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1JFU0VULCBTTElDX1JFU0VUX01BR0lDKTsKKwlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOworCiAJbWRlbGF5KDEpOwogfQogCkBAIC02MDMsMTcgKzU3NSwxNiBAQAogewogCXUzMiB2YWx1ZTsKIAl1MzIgdmFsdWUyOwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOwogCiAJdmFsdWUgPSBudG9obCgqKF9fYmUzMiAqKSZhZGFwdGVyLT5jdXJybWFjYWRkclsyXSk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dyYWRkcmFsLCB2YWx1ZSwgRkxVU0gpOwotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193cmFkZHJibCwgdmFsdWUsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1JBRERSQUwsIHZhbHVlKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1JBRERSQkwsIHZhbHVlKTsKIAogCXZhbHVlMiA9ICh1MzIpKChhZGFwdGVyLT5jdXJybWFjYWRkclswXSA8PCA4IHwKIAkJCSAgICAgYWRhcHRlci0+Y3Vycm1hY2FkZHJbMV0pICYgMHhGRkZGKTsKIAotCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193cmFkZHJhaCwgdmFsdWUyLCBGTFVTSCk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dyYWRkcmJoLCB2YWx1ZTIsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1JBRERSQUgsIHZhbHVlMik7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dSQUREUkJILCB2YWx1ZTIpOwogCiAJLyoKIAkgKiBXcml0ZSBvdXIgbXVsdGljYXN0IG1hc2sgb3V0IHRvIHRoZSBjYXJkLiAgVGhpcyBpcyBkb25lCkBAIC02MjYsNyArNTk3LDYgQEAKIHN0YXRpYyB2b2lkIHNsaWNfbWFjX2NvbmZpZyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcikKIHsKIAl1MzIgdmFsdWU7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CiAKIAkvKiBTZXR1cCBHTUFDIGdhcHMgKi8KIAlpZiAoYWRhcHRlci0+bGlua3NwZWVkID09IExJTktfMTAwME1CKSB7CkBAIC02NTAsNyArNjIwLDcgQEAKIAl9CiAKIAkvKiB3cml0ZSBtYWMgY29uZmlnICovCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dtY2ZnLCB2YWx1ZSwgRkxVU0gpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XTUNGRywgdmFsdWUpOwogCiAJLyogc2V0dXAgbWFjIGFkZHJlc3NlcyAqLwogCXNsaWNfbWFjX2FkZHJlc3NfY29uZmlnKGFkYXB0ZXIpOwpAQCAtNjYwLDcgKzYzMCw2IEBACiB7CiAJdTMyIHZhbHVlOwogCXUzMiBSY3JSZXNldDsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAogCWlmIChsaW5rY2hhbmdlKSB7CiAJCS8qIFNldHVwIE1BQyAqLwpAQCAtNjc3LDcgKzY0Niw3IEBACiAJCQkgR1hDUl9YTVRFTiB8CS8qIEVuYWJsZSB0cmFuc21pdCAgKi8KIAkJCSBHWENSX1BBVVNFRU4pOwkvKiBFbmFibGUgcGF1c2UgICAgICovCiAKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3d4Y2ZnLCB2YWx1ZSwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1hDRkcsIHZhbHVlKTsKIAogCQkvKiBTZXR1cCByY3ZjZmcgbGFzdCAqLwogCQl2YWx1ZSA9IChSY3JSZXNldCB8CS8qIFJlc2V0LCBpZiBsaW5rY2hhbmdlICovCkBAIC02OTAsNyArNjU5LDcgQEAKIAkJdmFsdWUgPSAoR1hDUl9SRVNFVCB8CS8qIEFsd2F5cyByZXNldCAgICAgKi8KIAkJCSBHWENSX1hNVEVOKTsJLyogRW5hYmxlIHRyYW5zbWl0ICAqLwogCi0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY193eGNmZywgdmFsdWUsIEZMVVNIKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dYQ0ZHLCB2YWx1ZSk7CiAKIAkJLyogU2V0dXAgcmN2Y2ZnIGxhc3QgKi8KIAkJdmFsdWUgPSAoUmNyUmVzZXQgfAkvKiBSZXNldCwgaWYgbGlua2NoYW5nZSAqLwpAQCAtNzA3LDcgKzY3Niw3IEBACiAJaWYgKGFkYXB0ZXItPm1hY29wdHMgJiBNQUNfUFJPTUlTQykKIAkJdmFsdWUgfD0gR1JDUl9SQ1ZBTEw7CiAKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd3JjZmcsIHZhbHVlLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dSQ0ZHLCB2YWx1ZSk7CiB9CiAKIC8qCkBAIC03MTcsMjQgKzY4NiwyMyBAQAogewogCXUzMiB2YWx1ZTsKIAl1MzIgcGh5X2NvbmZpZzsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKIAogCS8qIFNldHVwIHhtdGNmZyAqLwogCXZhbHVlID0gKEdYQ1JfUkVTRVQgfAkvKiBBbHdheXMgcmVzZXQgKi8KIAkJIEdYQ1JfUEFVU0VFTik7CS8qIEVuYWJsZSBwYXVzZSAqLwogCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3d4Y2ZnLCB2YWx1ZSwgRkxVU0gpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19XWENGRywgdmFsdWUpOwogCiAJdmFsdWUgPSAoR1JDUl9SRVNFVCB8CS8qIEFsd2F5cyByZXNldCAgICAgICovCiAJCSBHUkNSX0NUTEVOIHwJLyogRW5hYmxlIENUTCBmcmFtZXMgKi8KIAkJIEdSQ1JfQUREUkFFTiB8CS8qIEFkZHJlc3MgQSBlbmFibGUgICovCiAJCSAoR1JDUl9IQVNIU0laRSA8PCBHUkNSX0hBU0hTSVpFX1NISUZUKSk7CiAKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfd3JjZmcsIHZhbHVlLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1dSQ0ZHLCB2YWx1ZSk7CiAKIAkvKiBwb3dlciBkb3duIHBoeSAqLwogCXBoeV9jb25maWcgPSAoTUlJQ1JfUkVHX1BDUiB8IChQQ1JfUE9XRVJET1dOKSk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3dwaHksIHBoeV9jb25maWcsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfV1BIWSwgcGh5X2NvbmZpZyk7CiB9CiAKIHN0YXRpYyBib29sIHNsaWNfbWFjX2ZpbHRlcihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKQEAgLTgxMCwxMyArNzc4LDExIEBACiB7CiAJc3RydWN0IHNsaWNjYXJkICpjYXJkID0gKHN0cnVjdCBzbGljY2FyZCAqKWNhcmRhZGRyOwogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gY2FyZC0+bWFzdGVyOwotCXUzMiBfX2lvbWVtICppbnRhZ2c7CiAJdTMyIGxvYWQgPSBjYXJkLT5ldmVudHM7CiAJdTMyIGxldmVsID0gMDsKIAogCWlmICgoYWRhcHRlcikgJiYgKGFkYXB0ZXItPnN0YXRlID09IEFEQVBUX1VQKSAmJgogCSAgICAoY2FyZC0+c3RhdGUgPT0gQ0FSRF9VUCkgJiYgKHNsaWNfZ2xvYmFsLmR5bmFtaWNfaW50YWdnKSkgewotCQlpbnRhZ2cgPSAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2ludGFnZzsKIAkJaWYgKGFkYXB0ZXItPmRldmlkID09IFNMSUNfMUdCX0RFVklDRV9JRCkgewogCQkJaWYgKGFkYXB0ZXItPmxpbmtzcGVlZCA9PSBMSU5LXzEwMDBNQikKIAkJCQlsZXZlbCA9IDEwMDsKQEAgLTgzNiw3ICs4MDIsNyBAQAogCQkJfQogCQkJaWYgKGNhcmQtPmxvYWRsZXZlbF9jdXJyZW50ICE9IGxldmVsKSB7CiAJCQkJY2FyZC0+bG9hZGxldmVsX2N1cnJlbnQgPSBsZXZlbDsKLQkJCQlzbGljX3JlZzMyX3dyaXRlKGludGFnZywgbGV2ZWwsIEZMVVNIKTsKKwkJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSU5UQUdHLCBsZXZlbCk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAobG9hZCA+IFNMSUNfTE9BRF81KQpAQCAtODUzLDcgKzgxOSw3IEBACiAJCQkJbGV2ZWwgPSBTTElDX0lOVEFHR18wOwogCQkJaWYgKGNhcmQtPmxvYWRsZXZlbF9jdXJyZW50ICE9IGxldmVsKSB7CiAJCQkJY2FyZC0+bG9hZGxldmVsX2N1cnJlbnQgPSBsZXZlbDsKLQkJCQlzbGljX3JlZzMyX3dyaXRlKGludGFnZywgbGV2ZWwsIEZMVVNIKTsKKwkJCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSU5UQUdHLCBsZXZlbCk7CiAJCQl9CiAJCX0KIAl9CkBAIC04OTcsNyArODYzLDYgQEAKIHN0YXRpYyB2b2lkIHNsaWNfdXByX3N0YXJ0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBzbGljX3VwciAqdXByOwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOwogCiAJdXByID0gYWRhcHRlci0+dXByX2xpc3Q7CiAJaWYgKCF1cHIpCkBAIC05MDksMzEgKzg3NCwyNyBAQAogCXN3aXRjaCAodXByLT51cHJfcmVxdWVzdCkgewogCWNhc2UgU0xJQ19VUFJfU1RBVFM6CiAJCWlmICh1cHItPnVwcl9kYXRhX2ggPT0gMCkgewotCQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3N0YXRzLCB1cHItPnVwcl9kYXRhLAotCQkJCQkgRkxVU0gpOworCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1JTVEFULCB1cHItPnVwcl9kYXRhKTsKIAkJfSBlbHNlIHsKLQkJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJnNsaWNfcmVncy0+c2xpY19zdGF0czY0LAotCQkJCQkgdXByLT51cHJfZGF0YSwKLQkJCQkJICZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkJIHVwci0+dXByX2RhdGFfaCwgRkxVU0gpOworCQkJc2xpY193cml0ZTY0KGFkYXB0ZXIsIFNMSUNfUkVHX1JTVEFUNjQsIHVwci0+dXByX2RhdGEsCisJCQkJICAgICB1cHItPnVwcl9kYXRhX2gpOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBTTElDX1VQUl9STFNSOgotCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsICZzbGljX3JlZ3MtPnNsaWNfcmxzciwgdXByLT51cHJfZGF0YSwKLQkJCQkgJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLCB1cHItPnVwcl9kYXRhX2gsCi0JCQkJIEZMVVNIKTsKKwkJc2xpY193cml0ZTY0KGFkYXB0ZXIsIFNMSUNfUkVHX0xTVEFULCB1cHItPnVwcl9kYXRhLAorCQkJICAgICB1cHItPnVwcl9kYXRhX2gpOwogCQlicmVhazsKIAogCWNhc2UgU0xJQ19VUFJfUkNPTkZJRzoKLQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLCAmc2xpY19yZWdzLT5zbGljX3Jjb25maWcsCi0JCQkJIHVwci0+dXByX2RhdGEsICZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkgdXByLT51cHJfZGF0YV9oLCBGTFVTSCk7CisJCXNsaWNfd3JpdGU2NChhZGFwdGVyLCBTTElDX1JFR19SQ09ORklHLCB1cHItPnVwcl9kYXRhLAorCQkJICAgICB1cHItPnVwcl9kYXRhX2gpOwogCQlicmVhazsKIAljYXNlIFNMSUNfVVBSX1BJTkc6Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19waW5nLCAxLCBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19QSU5HLCAxKTsKIAkJYnJlYWs7CiAJfQorCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiB9CiAKIHN0YXRpYyBpbnQgc2xpY191cHJfcmVxdWVzdChzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwKQEAgLTk2MSw0MiArOTIyLDM0IEBACiAKIHN0YXRpYyB2b2lkIHNsaWNfbGlua191cHJfY29tcGxldGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBpc3IpCiB7Ci0JdTMyIGxpbmtzdGF0dXMgPSBhZGFwdGVyLT5wc2htZW0tPmxpbmtzdGF0dXM7CisJc3RydWN0IHNsaWNfc2htZW1vcnkgKnNtID0gJmFkYXB0ZXItPnNobWVtOworCXN0cnVjdCBzbGljX3NobWVtX2RhdGEgKnNtX2RhdGEgPSBzbS0+c2htZW1fZGF0YTsKKwl1MzIgbHN0ID0gc21fZGF0YS0+bG5rc3RhdHVzOwogCXVpbnQgbGlua3VwOwogCXVuc2lnbmVkIGNoYXIgbGlua3NwZWVkOwogCXVuc2lnbmVkIGNoYXIgbGlua2R1cGxleDsKIAogCWlmICgoaXNyICYgSVNSX1VQQ0VSUikgfHwgKGlzciAmIElTUl9VUENCU1kpKSB7Ci0JCXN0cnVjdCBzbGljX3NobWVtICpwc2htZW07CisJCWRtYV9hZGRyX3QgcGhhZGRyID0gc20tPmxua3N0YXR1c19waGFkZHI7CiAKLQkJcHNobWVtID0gKHN0cnVjdCBzbGljX3NobWVtICopKHVuc2lnbmVkIGxvbmcpCi0JCQkgYWRhcHRlci0+cGh5c19zaG1lbTsKLSNpZiBCSVRTX1BFUl9MT05HID09IDY0Ci0JCXNsaWNfdXByX3F1ZXVlX3JlcXVlc3QoYWRhcHRlciwKLQkJCQkgICAgICAgU0xJQ19VUFJfUkxTUiwKLQkJCQkgICAgICAgU0xJQ19HRVRfQUREUl9MT1coJnBzaG1lbS0+bGlua3N0YXR1cyksCi0JCQkJICAgICAgIFNMSUNfR0VUX0FERFJfSElHSCgmcHNobWVtLT5saW5rc3RhdHVzKSwKKwkJc2xpY191cHJfcXVldWVfcmVxdWVzdChhZGFwdGVyLCBTTElDX1VQUl9STFNSLAorCQkJCSAgICAgICBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKHBoYWRkcikpLAorCQkJCSAgICAgICBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKHBoYWRkcikpLAogCQkJCSAgICAgICAwLCAwKTsKLSNlbHNlCi0JCXNsaWNfdXByX3F1ZXVlX3JlcXVlc3QoYWRhcHRlciwKLQkJCQkgICAgICAgU0xJQ19VUFJfUkxTUiwKLQkJCQkgICAgICAgKHUzMikmcHNobWVtLT5saW5rc3RhdHVzLAotCQkJCSAgICAgICBTTElDX0dFVF9BRERSX0hJR0gocHNobWVtKSwgMCwgMCk7Ci0jZW5kaWYKIAkJcmV0dXJuOwogCX0KIAlpZiAoYWRhcHRlci0+c3RhdGUgIT0gQURBUFRfVVApCiAJCXJldHVybjsKIAotCWxpbmt1cCA9IGxpbmtzdGF0dXMgJiBHSUdfTElOS1VQID8gTElOS19VUCA6IExJTktfRE9XTjsKLQlpZiAobGlua3N0YXR1cyAmIEdJR19TUEVFRF8xMDAwKQorCWxpbmt1cCA9IGxzdCAmIEdJR19MSU5LVVAgPyBMSU5LX1VQIDogTElOS19ET1dOOworCWlmIChsc3QgJiBHSUdfU1BFRURfMTAwMCkKIAkJbGlua3NwZWVkID0gTElOS18xMDAwTUI7Ci0JZWxzZSBpZiAobGlua3N0YXR1cyAmIEdJR19TUEVFRF8xMDApCisJZWxzZSBpZiAobHN0ICYgR0lHX1NQRUVEXzEwMCkKIAkJbGlua3NwZWVkID0gTElOS18xMDBNQjsKIAllbHNlCiAJCWxpbmtzcGVlZCA9IExJTktfMTBNQjsKIAotCWlmIChsaW5rc3RhdHVzICYgR0lHX0ZVTExEVVBMRVgpCisJaWYgKGxzdCAmIEdJR19GVUxMRFVQTEVYKQogCQlsaW5rZHVwbGV4ID0gTElOS19GVUxMRDsKIAllbHNlCiAJCWxpbmtkdXBsZXggPSBMSU5LX0hBTEZEOwpAQCAtMTAxNiw2ICs5NjksNyBAQAogCS8qIGxpbmsgaGFzIGdvbmUgZnJvbSB1cCB0byBkb3duICovCiAJaWYgKGxpbmt1cCA9PSBMSU5LX0RPV04pIHsKIAkJYWRhcHRlci0+bGlua3N0YXRlID0gTElOS19ET1dOOworCQluZXRpZl9jYXJyaWVyX29mZihhZGFwdGVyLT5uZXRkZXYpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDI3LDcgKzk4MSw3IEBACiAJCS8qIHNldHVwIHRoZSBtYWMgKi8KIAkJc2xpY19jb25maWdfc2V0KGFkYXB0ZXIsIHRydWUpOwogCQlhZGFwdGVyLT5saW5rc3RhdGUgPSBMSU5LX1VQOwotCQluZXRpZl9zdGFydF9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOworCQluZXRpZl9jYXJyaWVyX29uKGFkYXB0ZXItPm5ldGRldik7CiAJfQogfQogCkBAIC0xMDQ3LDgxICsxMDAxLDY1IEBACiAJdXByLT5uZXh0ID0gTlVMTDsKIAlhZGFwdGVyLT51cHJfYnVzeSA9IDA7CiAJc3dpdGNoICh1cHItPnVwcl9yZXF1ZXN0KSB7Ci0JY2FzZSBTTElDX1VQUl9TVEFUUzoKLQkJewotCQkJc3RydWN0IHNsaWNfc3RhdHMgKnNsaWNzdGF0cyA9Ci0JCQkgICAgKHN0cnVjdCBzbGljX3N0YXRzICopJmFkYXB0ZXItPnBzaG1lbS0+aW5pY3N0YXRzOwotCQkJc3RydWN0IHNsaWNfc3RhdHMgKm5ld3N0YXRzID0gc2xpY3N0YXRzOwotCQkJc3RydWN0IHNsaWNfc3RhdHMgICpvbGQgPSAmYWRhcHRlci0+aW5pY3N0YXRzX3ByZXY7Ci0JCQlzdHJ1Y3Qgc2xpY25ldF9zdGF0cyAqc3RzdCA9ICZhZGFwdGVyLT5zbGljX3N0YXRzOworCWNhc2UgU0xJQ19VUFJfU1RBVFM6IHsKKwkJc3RydWN0IHNsaWNfc2htZW1vcnkgKnNtID0gJmFkYXB0ZXItPnNobWVtOworCQlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhICpzbV9kYXRhID0gc20tPnNobWVtX2RhdGE7CisJCXN0cnVjdCBzbGljX3N0YXRzICpzdGF0cyA9ICZzbV9kYXRhLT5zdGF0czsKKwkJc3RydWN0IHNsaWNfc3RhdHMgKm9sZCA9ICZhZGFwdGVyLT5pbmljc3RhdHNfcHJldjsKKwkJc3RydWN0IHNsaWNuZXRfc3RhdHMgKnN0c3QgPSAmYWRhcHRlci0+c2xpY19zdGF0czsKIAotCQkJaWYgKGlzciAmIElTUl9VUENFUlIpIHsKLQkJCQlkZXZfZXJyKCZhZGFwdGVyLT5uZXRkZXYtPmRldiwKLQkJCQkJIlNMSUNfVVBSX1NUQVRTIGNvbW1hbmQgZmFpbGVkIGlzclsleF1cbiIsCi0JCQkJCWlzcik7Ci0KLQkJCQlicmVhazsKLQkJCX0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AueG1pdF90Y3Bfc2VncywKLQkJCQkJbmV3c3RhdHMtPnhtaXRfdGNwX3NlZ3NfZ2IsCi0JCQkJCW9sZC0+eG1pdF90Y3Bfc2Vnc19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AueG1pdF90Y3BfYnl0ZXMsCi0JCQkJCW5ld3N0YXRzLT54bWl0X3RjcF9ieXRlc19nYiwKLQkJCQkJb2xkLT54bWl0X3RjcF9ieXRlc19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AucmN2X3RjcF9zZWdzLAotCQkJCQluZXdzdGF0cy0+cmN2X3RjcF9zZWdzX2diLAotCQkJCQlvbGQtPnJjdl90Y3Bfc2Vnc19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AucmN2X3RjcF9ieXRlcywKLQkJCQkJbmV3c3RhdHMtPnJjdl90Y3BfYnl0ZXNfZ2IsCi0JCQkJCW9sZC0+cmN2X3RjcF9ieXRlc19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfYnl0ZXMsCi0JCQkJCW5ld3N0YXRzLT54bWl0X2J5dGVzX2diLAotCQkJCQlvbGQtPnhtaXRfYnl0ZXNfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UueG10X3VjYXN0LAotCQkJCQluZXdzdGF0cy0+eG1pdF91bmljYXN0c19nYiwKLQkJCQkJb2xkLT54bWl0X3VuaWNhc3RzX2diKTsKLQotCQkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnJjdl9ieXRlcywKLQkJCQkJbmV3c3RhdHMtPnJjdl9ieXRlc19nYiwKLQkJCQkJb2xkLT5yY3ZfYnl0ZXNfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UucmN2X3VjYXN0LAotCQkJCQluZXdzdGF0cy0+cmN2X3VuaWNhc3RzX2diLAotCQkJCQlvbGQtPnJjdl91bmljYXN0c19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfZXJyb3JzLAotCQkJCQluZXdzdGF0cy0+eG1pdF9jb2xsaXNpb25zX2diLAotCQkJCQlvbGQtPnhtaXRfY29sbGlzaW9uc19nYik7Ci0KLQkJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfZXJyb3JzLAotCQkJCQluZXdzdGF0cy0+eG1pdF9leGNlc3NfY29sbGlzaW9uc19nYiwKLQkJCQkJb2xkLT54bWl0X2V4Y2Vzc19jb2xsaXNpb25zX2diKTsKLQotCQkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnhtdF9lcnJvcnMsCi0JCQkJCW5ld3N0YXRzLT54bWl0X290aGVyX2Vycm9yX2diLAotCQkJCQlvbGQtPnhtaXRfb3RoZXJfZXJyb3JfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UucmN2X2Vycm9ycywKLQkJCQkJbmV3c3RhdHMtPnJjdl9vdGhlcl9lcnJvcl9nYiwKLQkJCQkJb2xkLT5yY3Zfb3RoZXJfZXJyb3JfZ2IpOwotCi0JCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UucmN2X2Rpc2NhcmRzLAotCQkJCQluZXdzdGF0cy0+cmN2X2Ryb3BzX2diLAotCQkJCQlvbGQtPnJjdl9kcm9wc19nYik7Ci0KLQkJCWlmIChuZXdzdGF0cy0+cmN2X2Ryb3BzX2diID4gb2xkLT5yY3ZfZHJvcHNfZ2IpIHsKLQkJCQlhZGFwdGVyLT5yY3ZfZHJvcHMgKz0KLQkJCQkgICAgKG5ld3N0YXRzLT5yY3ZfZHJvcHNfZ2IgLQotCQkJCSAgICAgb2xkLT5yY3ZfZHJvcHNfZ2IpOwotCQkJfQotCQkJbWVtY3B5KG9sZCwgbmV3c3RhdHMsIHNpemVvZihzdHJ1Y3Qgc2xpY19zdGF0cykpOworCQlpZiAoaXNyICYgSVNSX1VQQ0VSUikgeworCQkJZGV2X2VycigmYWRhcHRlci0+bmV0ZGV2LT5kZXYsCisJCQkJIlNMSUNfVVBSX1NUQVRTIGNvbW1hbmQgZmFpbGVkIGlzclsleF1cbiIsIGlzcik7CiAJCQlicmVhazsKIAkJfQorCisJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AueG1pdF90Y3Bfc2Vncywgc3RhdHMtPnhtaXRfdGNwX3NlZ3MsCisJCQkJb2xkLT54bWl0X3RjcF9zZWdzKTsKKworCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+dGNwLnhtaXRfdGNwX2J5dGVzLCBzdGF0cy0+eG1pdF90Y3BfYnl0ZXMsCisJCQkJb2xkLT54bWl0X3RjcF9ieXRlcyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPnRjcC5yY3ZfdGNwX3NlZ3MsIHN0YXRzLT5yY3ZfdGNwX3NlZ3MsCisJCQkJb2xkLT5yY3ZfdGNwX3NlZ3MpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT50Y3AucmN2X3RjcF9ieXRlcywgc3RhdHMtPnJjdl90Y3BfYnl0ZXMsCisJCQkJb2xkLT5yY3ZfdGNwX2J5dGVzKTsKKworCQlVUERBVEVfU1RBVFNfR0Ioc3RzdC0+aWZhY2UueG10X2J5dGVzLCBzdGF0cy0+eG1pdF9ieXRlcywKKwkJCQlvbGQtPnhtaXRfYnl0ZXMpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfdWNhc3QsIHN0YXRzLT54bWl0X3VuaWNhc3RzLAorCQkJCW9sZC0+eG1pdF91bmljYXN0cyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnJjdl9ieXRlcywgc3RhdHMtPnJjdl9ieXRlcywKKwkJCQlvbGQtPnJjdl9ieXRlcyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnJjdl91Y2FzdCwgc3RhdHMtPnJjdl91bmljYXN0cywKKwkJCQlvbGQtPnJjdl91bmljYXN0cyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnhtdF9lcnJvcnMsIHN0YXRzLT54bWl0X2NvbGxpc2lvbnMsCisJCQkJb2xkLT54bWl0X2NvbGxpc2lvbnMpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS54bXRfZXJyb3JzLAorCQkJCXN0YXRzLT54bWl0X2V4Y2Vzc19jb2xsaXNpb25zLAorCQkJCW9sZC0+eG1pdF9leGNlc3NfY29sbGlzaW9ucyk7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnhtdF9lcnJvcnMsIHN0YXRzLT54bWl0X290aGVyX2Vycm9yLAorCQkJCW9sZC0+eG1pdF9vdGhlcl9lcnJvcik7CisKKwkJVVBEQVRFX1NUQVRTX0dCKHN0c3QtPmlmYWNlLnJjdl9lcnJvcnMsIHN0YXRzLT5yY3Zfb3RoZXJfZXJyb3IsCisJCQkJb2xkLT5yY3Zfb3RoZXJfZXJyb3IpOworCisJCVVQREFURV9TVEFUU19HQihzdHN0LT5pZmFjZS5yY3ZfZGlzY2FyZHMsIHN0YXRzLT5yY3ZfZHJvcHMsCisJCQkJb2xkLT5yY3ZfZHJvcHMpOworCisJCWlmIChzdGF0cy0+cmN2X2Ryb3BzID4gb2xkLT5yY3ZfZHJvcHMpCisJCQlhZGFwdGVyLT5yY3ZfZHJvcHMgKz0gKHN0YXRzLT5yY3ZfZHJvcHMgLQorCQkJCQkgICAgICAgb2xkLT5yY3ZfZHJvcHMpOworCQltZW1jcHlfZnJvbWlvKG9sZCwgc3RhdHMsIHNpemVvZigqc3RhdHMpKTsKKwkJYnJlYWs7CisJfQogCWNhc2UgU0xJQ19VUFJfUkxTUjoKIAkJc2xpY19saW5rX3Vwcl9jb21wbGV0ZShhZGFwdGVyLCBpc3IpOwogCQlicmVhazsKQEAgLTExODYsNyArMTEyNCw2IEBACiB7CiAJaW50IGk7CiAJc3RydWN0IHNsaWNfcnNwcXVldWUgKnJzcHEgPSAmYWRhcHRlci0+cnNwcXVldWU7Ci0JX19pb21lbSBzdHJ1Y3Qgc2xpY19yZWdzICpzbGljX3JlZ3MgPSBhZGFwdGVyLT5zbGljX3JlZ3M7CiAJdTMyIHBhZGRyaCA9IDA7CiAKIAltZW1zZXQocnNwcSwgMCwgc2l6ZW9mKHN0cnVjdCBzbGljX3JzcHF1ZXVlKSk7CkBAIC0xMjA1LDE0ICsxMTQyLDEyIEBACiAJCX0KIAogCQlpZiAocGFkZHJoID09IDApIHsKLQkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19yYmFyLAotCQkJCShyc3BxLT5wYWRkcltpXSB8IFNMSUNfUlNQUV9CVUZTSU5QQUdFKSwKLQkJCQlET05UX0ZMVVNIKTsKKwkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19SQkFSLAorCQkJCSAgICAgcnNwcS0+cGFkZHJbaV0gfCBTTElDX1JTUFFfQlVGU0lOUEFHRSk7CiAJCX0gZWxzZSB7Ci0JCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsICZzbGljX3JlZ3MtPnNsaWNfcmJhcjY0LAotCQkJCShyc3BxLT5wYWRkcltpXSB8IFNMSUNfUlNQUV9CVUZTSU5QQUdFKSwKLQkJCQkmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJcGFkZHJoLCBET05UX0ZMVVNIKTsKKwkJCXNsaWNfd3JpdGU2NChhZGFwdGVyLCBTTElDX1JFR19SQkFSNjQsCisJCQkJICAgICByc3BxLT5wYWRkcltpXSB8IFNMSUNfUlNQUV9CVUZTSU5QQUdFLAorCQkJCSAgICAgcGFkZHJoKTsKIAkJfQogCX0KIAlyc3BxLT5vZmZzZXQgPSAwOwpAQCAtMTIzMyw5ICsxMTY4LDkgQEAKIAlpZiAoKytyc3BxLT5vZmZzZXQgPCBTTElDX1JTUFFfQlVGU0lOUEFHRSkgewogCQlyc3BxLT5yc3BidWYrKzsKIAl9IGVsc2UgewotCQlzbGljX3JlZzY0X3dyaXRlKGFkYXB0ZXIsICZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfcmJhcjY0LAotCQkJKHJzcHEtPnBhZGRyW3JzcHEtPnBhZ2VpbmRleF0gfCBTTElDX1JTUFFfQlVGU0lOUEFHRSksCi0JCQkmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsIDAsIERPTlRfRkxVU0gpOworCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfUkJBUjY0LAorCQkJICAgICByc3BxLT5wYWRkcltyc3BxLT5wYWdlaW5kZXhdIHwKKwkJCSAgICAgU0xJQ19SU1BRX0JVRlNJTlBBR0UsIDApOwogCQlyc3BxLT5wYWdlaW5kZXggPSAocnNwcS0+cGFnZWluZGV4ICsgMSkgJSByc3BxLT5udW1fcGFnZXM7CiAJCXJzcHEtPm9mZnNldCA9IDA7CiAJCXJzcHEtPnJzcGJ1ZiA9IChzdHJ1Y3Qgc2xpY19yc3BidWYgKikKQEAgLTE1NjksMTQgKzE1MDQsMTEgQEAKIAkJCX0KICNlbmRpZgogCQkJaWYgKHBhZGRyaCA9PSAwKSB7Ci0JCQkJc2xpY19yZWczMl93cml0ZSgmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2hiYXIsCi0JCQkJCQkgKHUzMilwYWRkcmwsIERPTlRfRkxVU0gpOworCQkJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19IQkFSLAorCQkJCQkgICAgICh1MzIpcGFkZHJsKTsKIAkJCX0gZWxzZSB7Ci0JCQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLAotCQkJCQkmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2hiYXI2NCwKLQkJCQkJcGFkZHJsLAotCQkJCQkmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJCXBhZGRyaCwgRE9OVF9GTFVTSCk7CisJCQkJc2xpY193cml0ZTY0KGFkYXB0ZXIsIFNMSUNfUkVHX0hCQVI2NCwgcGFkZHJsLAorCQkJCQkgICAgIHBhZGRyaCk7CiAJCQl9CiAJCQlpZiAocmN2cS0+aGVhZCkKIAkJCQlyY3ZxLT50YWlsLT5uZXh0ID0gc2tiOwpAQCAtMTY5OCwxNCArMTYzMCwxMCBAQAogCQlkZXZfZXJyKGRldiwgIiAgICAgICAgIHJjdnEtPnRhaWxbJXBdXG4iLCByY3ZxLT50YWlsKTsKIAkJZGV2X2VycihkZXYsICIgICAgICAgICByY3ZxLT5jb3VudFsleF1cbiIsIHJjdnEtPmNvdW50KTsKIAl9Ci0JaWYgKHBhZGRyaCA9PSAwKSB7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19oYmFyLCAodTMyKXBhZGRybCwKLQkJCQkgRE9OVF9GTFVTSCk7Ci0JfSBlbHNlIHsKLQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLCAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2hiYXI2NCwKLQkJCQkgcGFkZHJsLCAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJIHBhZGRyaCwgRE9OVF9GTFVTSCk7Ci0JfQorCWlmIChwYWRkcmggPT0gMCkKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0hCQVIsICh1MzIpcGFkZHJsKTsKKwllbHNlCisJCXNsaWNfd3JpdGU2NChhZGFwdGVyLCBTTElDX1JFR19IQkFSNjQsIHBhZGRybCwgcGFkZHJoKTsKIAlpZiAocmN2cS0+aGVhZCkKIAkJcmN2cS0+dGFpbC0+bmV4dCA9IHNrYjsKIAllbHNlCkBAIC0xNzI4LDI2ICsxNjU2LDE3IEBACiBzdGF0aWMgaW50IHNsaWNfbGlua19ldmVudF9oYW5kbGVyKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewogCWludCBzdGF0dXM7Ci0Jc3RydWN0IHNsaWNfc2htZW0gKnBzaG1lbTsKKwlzdHJ1Y3Qgc2xpY19zaG1lbW9yeSAqc20gPSAmYWRhcHRlci0+c2htZW07CisJZG1hX2FkZHJfdCBwaGFkZHIgPSBzbS0+bG5rc3RhdHVzX3BoYWRkcjsKIAogCWlmIChhZGFwdGVyLT5zdGF0ZSAhPSBBREFQVF9VUCkgewogCQkvKiBBZGFwdGVyIGlzIG5vdCBvcGVyYXRpb25hbC4gIElnbm9yZS4gICovCiAJCXJldHVybiAtRU5PREVWOwogCX0KLQotCXBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKSh1bnNpZ25lZCBsb25nKWFkYXB0ZXItPnBoeXNfc2htZW07Ci0KLSNpZiBCSVRTX1BFUl9MT05HID09IDY0Ci0Jc3RhdHVzID0gc2xpY191cHJfcmVxdWVzdChhZGFwdGVyLAotCQkJCSAgU0xJQ19VUFJfUkxTUiwKLQkJCQkgIFNMSUNfR0VUX0FERFJfTE9XKCZwc2htZW0tPmxpbmtzdGF0dXMpLAotCQkJCSAgU0xJQ19HRVRfQUREUl9ISUdIKCZwc2htZW0tPmxpbmtzdGF0dXMpLAotCQkJCSAgMCwgMCk7Ci0jZWxzZQorCS8qIG5vIDRHQiB3cmFwIGd1YXJhbnRlZWQgKi8KIAlzdGF0dXMgPSBzbGljX3Vwcl9yZXF1ZXN0KGFkYXB0ZXIsIFNMSUNfVVBSX1JMU1IsCi0JCSh1MzIpJnBzaG1lbS0+bGlua3N0YXR1cywJLyogbm8gNEdCIHdyYXAgZ3VhcmFudGVlZCAqLwotCQkJCSAgMCwgMCwgMCk7Ci0jZW5kaWYKKwkJCQkgIGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMocGhhZGRyKSksCisJCQkJICBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKHBoYWRkcikpLCAwLCAwKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNzU3LDEyICsxNjc2LDEzIEBACiAJCWFkYXB0ZXItPmludHJyZWdpc3RlcmVkID0gMDsKIAkJZnJlZV9pcnEoYWRhcHRlci0+bmV0ZGV2LT5pcnEsIGFkYXB0ZXItPm5ldGRldik7CiAJfQotCWlmIChhZGFwdGVyLT5wc2htZW0pIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsCi0JCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2xpY19zaG1lbSksCi0JCQkJICAgIGFkYXB0ZXItPnBzaG1lbSwgYWRhcHRlci0+cGh5c19zaG1lbSk7Ci0JCWFkYXB0ZXItPnBzaG1lbSA9IE5VTEw7Ci0JCWFkYXB0ZXItPnBoeXNfc2htZW0gPSAoZG1hX2FkZHJfdCkodW5zaWduZWQgbG9uZylOVUxMOworCisJaWYgKGFkYXB0ZXItPnNobWVtLnNobWVtX2RhdGEpIHsKKwkJc3RydWN0IHNsaWNfc2htZW1vcnkgKnNtID0gJmFkYXB0ZXItPnNobWVtOworCQlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhICpzbV9kYXRhID0gc20tPnNobWVtX2RhdGE7CisKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wY2lkZXYsIHNpemVvZigqc21fZGF0YSksIHNtX2RhdGEsCisJCQkJICAgIHNtLT5pc3JfcGhhZGRyKTsKIAl9CiAKIAlpZiAoYWRhcHRlci0+cGluZ3RpbWVyc2V0KSB7CkBAIC0yMTQ3LDEzICsyMDY3LDE2IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHNsaWNfc2htZW1vcnkgKnNtID0gJmFkYXB0ZXItPnNobWVtOworCXN0cnVjdCBzbGljX3NobWVtX2RhdGEgKnNtX2RhdGEgPSBzbS0+c2htZW1fZGF0YTsKIAl1MzIgaXNyOwogCi0JaWYgKChhZGFwdGVyLT5wc2htZW0pICYmIChhZGFwdGVyLT5wc2htZW0tPmlzcikpIHsKLQkJc2xpY19yZWczMl93cml0ZSgmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2ljciwKLQkJCQkgSUNSX0lOVF9NQVNLLCBGTFVTSCk7Ci0JCWlzciA9IGFkYXB0ZXItPmlzcmNvcHkgPSBhZGFwdGVyLT5wc2htZW0tPmlzcjsKLQkJYWRhcHRlci0+cHNobWVtLT5pc3IgPSAwOworCWlmIChzbV9kYXRhLT5pc3IpIHsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lDUiwgSUNSX0lOVF9NQVNLKTsKKwkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKKworCQlpc3IgPSBzbV9kYXRhLT5pc3I7CisJCXNtX2RhdGEtPmlzciA9IDA7CiAJCWFkYXB0ZXItPm51bV9pc3JzKys7CiAJCXN3aXRjaCAoYWRhcHRlci0+Y2FyZC0+c3RhdGUpIHsKIAkJY2FzZSBDQVJEX1VQOgpAQCAtMjE2OSwxMCArMjA5Miw5IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWFkYXB0ZXItPmlzcmNvcHkgPSAwOwogCQlhZGFwdGVyLT5hbGxfcmVnX3dyaXRlcyArPSAyOwogCQlhZGFwdGVyLT5pc3JfcmVnX3dyaXRlcysrOwotCQlzbGljX3JlZzMyX3dyaXRlKCZhZGFwdGVyLT5zbGljX3JlZ3MtPnNsaWNfaXNyLCAwLCBGTFVTSCk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JU1IsIDApOwogCX0gZWxzZSB7CiAJCWFkYXB0ZXItPmZhbHNlX2ludGVycnVwdHMrKzsKIAl9CkBAIC0yMjI0LDEzICsyMTQ2LDExIEBACiAJfQogI2VuZGlmCiAJaWYgKGhjbWQtPnBhZGRyaCA9PSAwKSB7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJmFkYXB0ZXItPnNsaWNfcmVncy0+c2xpY19jYmFyLAotCQkJCSAoaGNtZC0+cGFkZHJsIHwgaGNtZC0+Y21kc2l6ZSksIERPTlRfRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfQ0JBUiwgKGhjbWQtPnBhZGRybCB8CisJCQkJCQkgICAgICBoY21kLT5jbWRzaXplKSk7CiAJfSBlbHNlIHsKLQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLCAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2NiYXI2NCwKLQkJCQkgKGhjbWQtPnBhZGRybCB8IGhjbWQtPmNtZHNpemUpLAotCQkJCSAmYWRhcHRlci0+c2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJIGhjbWQtPnBhZGRyaCwgRE9OVF9GTFVTSCk7CisJCXNsaWNfd3JpdGU2NChhZGFwdGVyLCBTTElDX1JFR19DQkFSNjQsCisJCQkgICAgIGhjbWQtPnBhZGRybCB8IGhjbWQtPmNtZHNpemUsIGhjbWQtPnBhZGRyaCk7CiAJfQogeG1pdF9kb25lOgogCXJldHVybiBORVRERVZfVFhfT0s7CkBAIC0yMjkwLDggKzIyMTAsOCBAQAogewogCXN0cnVjdCBzbGljY2FyZCAqY2FyZCA9IGFkYXB0ZXItPmNhcmQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXB0ZXItPm5ldGRldjsKLQlfX2lvbWVtIHN0cnVjdCBzbGljX3JlZ3MgKnNsaWNfcmVncyA9IGFkYXB0ZXItPnNsaWNfcmVnczsKLQlzdHJ1Y3Qgc2xpY19zaG1lbSAqcHNobWVtOworCXN0cnVjdCBzbGljX3NobWVtb3J5ICpzbSA9ICZhZGFwdGVyLT5zaG1lbTsKKwlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhICpzbV9kYXRhID0gc20tPnNobWVtX2RhdGE7CiAJaW50IHJjOwogCiAJLyogYWRhcHRlciBzaG91bGQgYmUgZG93biBhdCB0aGlzIHBvaW50ICovCkBAIC0yMzM1LDI4ICsyMjU1LDIwIEBACiAJCWFkYXB0ZXItPnF1ZXVlc19pbml0aWFsaXplZCA9IDE7CiAJfQogCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2ljciwgSUNSX0lOVF9PRkYsIEZMVVNIKTsKKwlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSUNSLCBJQ1JfSU5UX09GRik7CisJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKIAltZGVsYXkoMSk7CiAKIAlpZiAoIWFkYXB0ZXItPmlzcF9pbml0aWFsaXplZCkgewogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCXBzaG1lbSA9IChzdHJ1Y3Qgc2xpY19zaG1lbSAqKSh1bnNpZ25lZCBsb25nKQotCQkJIGFkYXB0ZXItPnBoeXNfc2htZW07Ci0KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOwotCi0jaWYgQklUU19QRVJfTE9ORyA9PSA2NAotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwKLQkJCQkgU0xJQ19HRVRfQUREUl9ISUdIKCZwc2htZW0tPmlzciksIERPTlRfRkxVU0gpOwotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaXNwLAotCQkJCSBTTElDX0dFVF9BRERSX0xPVygmcHNobWVtLT5pc3IpLCBGTFVTSCk7Ci0jZWxzZQotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfYWRkcl91cHBlciwgMCwgRE9OVF9GTFVTSCk7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pc3AsICh1MzIpJnBzaG1lbS0+aXNyLAotCQkJCUZMVVNIKTsKLSNlbmRpZgorCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfQUREUl9VUFBFUiwKKwkJCSAgICAgY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhzbS0+aXNyX3BoYWRkcikpKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lTUCwKKwkJCSAgICAgY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyhzbS0+aXNyX3BoYWRkcikpKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLCBmbGFncyk7CisKIAkJYWRhcHRlci0+aXNwX2luaXRpYWxpemVkID0gMTsKIAl9CiAKQEAgLTIzODMsMTcgKzIyOTUsMjAgQEAKIAkvKgogCSAqICAgIGNsZWFyIGFueSBwZW5kaW5nIGV2ZW50cywgdGhlbiBlbmFibGUgaW50ZXJydXB0cwogCSAqLwotCWFkYXB0ZXItPmlzcmNvcHkgPSAwOwotCWFkYXB0ZXItPnBzaG1lbS0+aXNyID0gMDsKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaXNyLCAwLCBGTFVTSCk7Ci0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2ljciwgSUNSX0lOVF9PTiwgRkxVU0gpOworCXNtX2RhdGEtPmlzciA9IDA7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lTUiwgMCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lDUiwgSUNSX0lOVF9PTik7CiAKIAlzbGljX2xpbmtfY29uZmlnKGFkYXB0ZXIsIExJTktfQVVUT1NQRUVELCBMSU5LX0FVVE9EKTsKKwlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOworCiAJcmMgPSBzbGljX2xpbmtfZXZlbnRfaGFuZGxlcihhZGFwdGVyKTsKIAlpZiAocmMpIHsKIAkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIHRoZW4gY2xlYXIgcGVuZGluZyBldmVudHMgKi8KLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2ljciwgSUNSX0lOVF9PRkYsIEZMVVNIKTsKLQkJc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX2lzciwgMCwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSUNSLCBJQ1JfSU5UX09GRik7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JU1IsIDApOworCQlzbGljX2ZsdXNoX3dyaXRlKGFkYXB0ZXIpOworCiAJCWlmIChhZGFwdGVyLT5waW5ndGltZXJzZXQpIHsKIAkJCWRlbF90aW1lcigmYWRhcHRlci0+cGluZ3RpbWVyKTsKIAkJCWFkYXB0ZXItPnBpbmd0aW1lcnNldCA9IDA7CkBAIC0yNDE3LDcgKzIzMzIsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN0YXR1czsKIAotCW5ldGlmX3N0b3BfcXVldWUoYWRhcHRlci0+bmV0ZGV2KTsKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLCBmbGFncyk7CiAJaWYgKCFhZGFwdGVyLT5hY3RpdmF0ZWQpIHsKQEAgLTI0NDAsNiArMjM1NSw5IEBACiAKIHNwaW5fdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwluZXRpZl9zdGFydF9xdWV1ZShhZGFwdGVyLT5uZXRkZXYpOworCiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMjQ2Myw3ICsyMzgxLDcgQEAKIAl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogCiAJc2xpY19hZGFwdGVyX2ZyZWVyZXNvdXJjZXMoYWRhcHRlcik7Ci0Jc2xpY191bm1hcF9tbWlvX3NwYWNlKGFkYXB0ZXIpOworCWlvdW5tYXAoYWRhcHRlci0+cmVncyk7CiAKIAkvKiBmcmVlIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KIAltbGlzdCA9IGFkYXB0ZXItPm1jYXN0YWRkcnM7CkBAIC0yNDk3LDcgKzI0MTUsNiBAQAogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc2xpY2NhcmQgKmNhcmQgPSBhZGFwdGVyLT5jYXJkOwotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc2xpY19nbG9iYWwuZHJpdmVyX2xvY2ssIGZsYWdzKTsKQEAgLTI1MDcsNyArMjQyNCw3IEBACiAJYWRhcHRlci0+dXByX2xpc3QgPSBOVUxMOwogCWFkYXB0ZXItPnVwcl9idXN5ID0gMDsKIAlhZGFwdGVyLT5kZXZmbGFnc19wcmV2ID0gMDsKLQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaWNyLCBJQ1JfSU5UX09GRiwgRkxVU0gpOworCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JQ1IsIElDUl9JTlRfT0ZGKTsKIAlhZGFwdGVyLT5hbGxfcmVnX3dyaXRlcysrOwogCWFkYXB0ZXItPmljcl9yZWdfd3JpdGVzKys7CiAJc2xpY19jb25maWdfY2xlYXIoYWRhcHRlcik7CkBAIC0yNTE3LDggKzI0MzQsMTAgQEAKIAkJYWRhcHRlci0+YWN0aXZhdGVkID0gMDsKIAl9CiAjaWZkZWYgQVVUT01BVElDX1JFU0VUCi0Jc2xpY19yZWczMl93cml0ZSgmc2xpY19yZWdzLT5zbGljX3Jlc2V0X2lmYWNlLCAwLCBGTFVTSCk7CisJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX1JFU0VUX0lGQUNFLCAwKTsKICNlbmRpZgorCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CisKIAkvKgogCSAqICBSZXNldCB0aGUgYWRhcHRlcidzIGNtZCBxdWV1ZXMKIAkgKi8KQEAgLTI1MzAsNiArMjQ0OSw5IEBACiAjZW5kaWYKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNsaWNfZ2xvYmFsLmRyaXZlcl9sb2NrLCBmbGFncyk7CisKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2NjEsMTQgKzI1ODMsMTQgQEAKIAogc3RhdGljIGludCBzbGljX2NhcmRfaW5pdChzdHJ1Y3Qgc2xpY2NhcmQgKmNhcmQsIHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewotCV9faW9tZW0gc3RydWN0IHNsaWNfcmVncyAqc2xpY19yZWdzID0gYWRhcHRlci0+c2xpY19yZWdzOworCXN0cnVjdCBzbGljX3NobWVtb3J5ICpzbSA9ICZhZGFwdGVyLT5zaG1lbTsKKwlzdHJ1Y3Qgc2xpY19zaG1lbV9kYXRhICpzbV9kYXRhID0gc20tPnNobWVtX2RhdGE7CiAJc3RydWN0IHNsaWNfZWVwcm9tICpwZWVwcm9tOwogCXN0cnVjdCBvc2xpY19lZXByb20gKnBPZWVwcm9tOwogCWRtYV9hZGRyX3QgcGh5c19jb25maWc7CiAJdTMyIHBoeXNfY29uZmlnaDsKIAl1MzIgcGh5c19jb25maWdsOwogCXUzMiBpID0gMDsKLQlzdHJ1Y3Qgc2xpY19zaG1lbSAqcHNobWVtOwogCWludCBzdGF0dXM7CiAJdWludCBtYWNhZGRycyA9IGNhcmQtPmNhcmRfc2l6ZTsKIAl1c2hvcnQgZWVjb2Rlc2l6ZTsKQEAgLTI2OTUsMjcgKzI2MTcsMjYgQEAKIAkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2xpY19lZXByb20pLAogCQkJCQkgICAgICAgJnBoeXNfY29uZmlnKTsKIAotCQlwaHlzX2NvbmZpZ2wgPSBTTElDX0dFVF9BRERSX0xPVyhwaHlzX2NvbmZpZyk7Ci0JCXBoeXNfY29uZmlnaCA9IFNMSUNfR0VUX0FERFJfSElHSChwaHlzX2NvbmZpZyk7Ci0KIAkJaWYgKCFwZWVwcm9tKSB7CiAJCQlkZXZfZXJyKCZhZGFwdGVyLT5wY2lkZXYtPmRldiwKIAkJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIERNQSBtZW1vcnkgZm9yIEVFUFJPTS5cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAorCQlwaHlzX2NvbmZpZ2wgPSBTTElDX0dFVF9BRERSX0xPVyhwaHlzX2NvbmZpZyk7CisJCXBoeXNfY29uZmlnaCA9IFNMSUNfR0VUX0FERFJfSElHSChwaHlzX2NvbmZpZyk7CisKIAkJbWVtc2V0KHBlZXByb20sIDAsIHNpemVvZihzdHJ1Y3Qgc2xpY19lZXByb20pKTsKIAotCQlzbGljX3JlZzMyX3dyaXRlKCZzbGljX3JlZ3MtPnNsaWNfaWNyLCBJQ1JfSU5UX09GRiwgRkxVU0gpOworCQlzbGljX3dyaXRlMzIoYWRhcHRlciwgU0xJQ19SRUdfSUNSLCBJQ1JfSU5UX09GRik7CisJCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiAJCW1kZWxheSgxKTsKLQkJcHNobWVtID0gKHN0cnVjdCBzbGljX3NobWVtICopKHVuc2lnbmVkIGxvbmcpCi0JCQkgYWRhcHRlci0+cGh5c19zaG1lbTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+Yml0NjRyZWdsb2NrLCBmbGFncyk7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLAotCQkJCSBTTElDX0dFVF9BRERSX0hJR0goJnBzaG1lbS0+aXNyKSwgRE9OVF9GTFVTSCk7Ci0JCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pc3AsCi0JCQkJIFNMSUNfR0VUX0FERFJfTE9XKCZwc2htZW0tPmlzciksIEZMVVNIKTsKKwkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0FERFJfVVBQRVIsCisJCQkgICAgIGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMoc20tPmlzcl9waGFkZHIpKSk7CisJCXNsaWNfd3JpdGUzMihhZGFwdGVyLCBTTElDX1JFR19JU1AsCisJCQkgICAgIGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMoc20tPmlzcl9waGFkZHIpKSk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmJpdDY0cmVnbG9jaywgZmxhZ3MpOwogCiAJCXN0YXR1cyA9IHNsaWNfY29uZmlnX2dldChhZGFwdGVyLCBwaHlzX2NvbmZpZ2wsIHBoeXNfY29uZmlnaCk7CkBAIC0yNzI2LDMzICsyNjQ3LDMxIEBACiAJCX0KIAogCQlmb3IgKDs7KSB7Ci0JCQlpZiAoYWRhcHRlci0+cHNobWVtLT5pc3IpIHsKLQkJCQlpZiAoYWRhcHRlci0+cHNobWVtLT5pc3IgJiBJU1JfVVBDKSB7Ci0JCQkJCWFkYXB0ZXItPnBzaG1lbS0+aXNyID0gMDsKLQkJCQkJc2xpY19yZWc2NF93cml0ZShhZGFwdGVyLAotCQkJCQkJJnNsaWNfcmVncy0+c2xpY19pc3AsIDAsCi0JCQkJCQkmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJCQkwLCBGTFVTSCk7Ci0JCQkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pc3IsCi0JCQkJCQkJIDAsIEZMVVNIKTsKKwkJCWlmIChzbV9kYXRhLT5pc3IpIHsKKwkJCQlpZiAoc21fZGF0YS0+aXNyICYgSVNSX1VQQykgeworCQkJCQlzbV9kYXRhLT5pc3IgPSAwOworCQkJCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfSVNQLCAwLAorCQkJCQkJICAgICAwKTsKKwkJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lTUiwgMCk7CisJCQkJCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiAKIAkJCQkJc2xpY191cHJfcmVxdWVzdF9jb21wbGV0ZShhZGFwdGVyLCAwKTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCi0JCQkJYWRhcHRlci0+cHNobWVtLT5pc3IgPSAwOwotCQkJCXNsaWNfcmVnMzJfd3JpdGUoJnNsaWNfcmVncy0+c2xpY19pc3IsCi0JCQkJCQkgMCwgRkxVU0gpOworCQkJCXNtX2RhdGEtPmlzciA9IDA7CisJCQkJc2xpY193cml0ZTMyKGFkYXB0ZXIsIFNMSUNfUkVHX0lTUiwgMCk7CisJCQkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKIAkJCX0gZWxzZSB7CiAJCQkJbWRlbGF5KDEpOwogCQkJCWkrKzsKIAkJCQlpZiAoaSA+IDUwMDApIHsKIAkJCQkJZGV2X2VycigmYWRhcHRlci0+cGNpZGV2LT5kZXYsCiAJCQkJCQkiRmV0Y2ggb2YgY29uZmlnIGRhdGEgdGltZWQgb3V0LlxuIik7Ci0JCQkJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwKLQkJCQkJCSZzbGljX3JlZ3MtPnNsaWNfaXNwLCAwLAotCQkJCQkJJnNsaWNfcmVncy0+c2xpY19hZGRyX3VwcGVyLAotCQkJCQkJMCwgRkxVU0gpOworCQkJCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfSVNQLAorCQkJCQkJICAgICAwLCAwKTsKKwkJCQkJc2xpY19mbHVzaF93cml0ZShhZGFwdGVyKTsKKwogCQkJCQlzdGF0dXMgPSAtRUlOVkFMOwogCQkJCQlnb3RvIGNhcmRfaW5pdF9lcnI7CiAJCQkJfQpAQCAtMjc5Niw3ICsyNzE1LDYgQEAKIAkJLyogIHNlZSBpZiB0aGUgRUVQUk9NIGlzIHZhbGlkIGJ5IGNoZWNraW5nIGl0J3MgY2hlY2tzdW0gKi8KIAkJaWYgKChlZWNvZGVzaXplIDw9IE1BWF9FRUNPREVfU0laRSkgJiYKIAkJICAgIChlZWNvZGVzaXplID49IE1JTl9FRUNPREVfU0laRSkpIHsKLQogCQkJZWVfY2hrc3VtID0KIAkJCSAgICAqKHUxNiAqKSgoY2hhciAqKXBlZXByb20gKyAoZWVjb2Rlc2l6ZSAtIDIpKTsKIAkJCS8qCkBAIC0yODMwLDkgKzI3NDgsOCBAQAogCQkJCSAgICBwZWVwcm9tLCBwaHlzX2NvbmZpZyk7CiAKIAkJaWYgKCFjYXJkLT5jb25maWcuRWVwcm9tVmFsaWQpIHsKLQkJCXNsaWNfcmVnNjRfd3JpdGUoYWRhcHRlciwgJnNsaWNfcmVncy0+c2xpY19pc3AsIDAsCi0JCQkJCSAmc2xpY19yZWdzLT5zbGljX2FkZHJfdXBwZXIsCi0JCQkJCSAwLCBGTFVTSCk7CisJCQlzbGljX3dyaXRlNjQoYWRhcHRlciwgU0xJQ19SRUdfSVNQLCAwLCAwKTsKKwkJCXNsaWNfZmx1c2hfd3JpdGUoYWRhcHRlcik7CiAJCQlkZXZfZXJyKCZhZGFwdGVyLT5wY2lkZXYtPmRldiwgIkVFUFJPTSBpbnZhbGlkLlxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMjg5NiwxNCArMjgxMywxNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc2xpY19pbml0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJCSAgICAgIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX3RibF9lbnRyeSwKLQkJCSAgICAgIHZvaWQgX19pb21lbSAqbWVtYWRkciwgaW50IGNoaXBfaWR4KQorc3RhdGljIGludCBzbGljX2luaXRfYWRhcHRlcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgICBzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX3RibF9lbnRyeSwKKwkJCSAgICAgdm9pZCBfX2lvbWVtICptZW1hZGRyLCBpbnQgY2hpcF9pZHgpCiB7CiAJdXNob3J0IGluZGV4OwogCXN0cnVjdCBzbGljX2hhbmRsZSAqcHNsaWNfaGFuZGxlOwogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3Qgc2xpY19zaG1lbW9yeSAqc20gPSAmYWRhcHRlci0+c2htZW07CisJc3RydWN0IHNsaWNfc2htZW1fZGF0YSAqc21fZGF0YTsKKwlkbWFfYWRkcl90IHBoYWRkcjsKIAogLyoJYWRhcHRlci0+cGNpZGV2ID0gcGNpZGV2OyovCiAJYWRhcHRlci0+dmVuZGlkID0gcGNpX3RibF9lbnRyeS0+dmVuZG9yOwpAQCAtMjkxMiw3ICsyODMyLDcgQEAKIAlhZGFwdGVyLT5idXNudW1iZXIgPSBwY2lkZXYtPmJ1cy0+bnVtYmVyOwogCWFkYXB0ZXItPnNsb3RudW1iZXIgPSAoKHBjaWRldi0+ZGV2Zm4gPj4gMykgJiAweDFGKTsKIAlhZGFwdGVyLT5mdW5jdGlvbm51bWJlciA9IChwY2lkZXYtPmRldmZuICYgMHg3KTsKLQlhZGFwdGVyLT5zbGljX3JlZ3MgPSBtZW1hZGRyOworCWFkYXB0ZXItPnJlZ3MgPSBtZW1hZGRyOwogCWFkYXB0ZXItPmlycSA9IHBjaWRldi0+aXJxOwogCWFkYXB0ZXItPmNoaXBpZCA9IGNoaXBfaWR4OwogCWFkYXB0ZXItPnBvcnQgPSAwOwpAQCAtMjkzMiwxOSArMjg1MiwyMyBAQAogCSAqLwogCWZvciAoaW5kZXggPSAxLCBwc2xpY19oYW5kbGUgPSAmYWRhcHRlci0+c2xpY19oYW5kbGVzWzFdOwogCSAgICAgaW5kZXggPCBTTElDX0NNRFFfTUFYQ01EUzsgaW5kZXgrKywgcHNsaWNfaGFuZGxlKyspIHsKLQogCQlwc2xpY19oYW5kbGUtPnRva2VuLmhhbmRsZV9pbmRleCA9IGluZGV4OwogCQlwc2xpY19oYW5kbGUtPnR5cGUgPSBTTElDX0hBTkRMRV9GUkVFOwogCQlwc2xpY19oYW5kbGUtPm5leHQgPSBhZGFwdGVyLT5wZnJlZV9zbGljX2hhbmRsZXM7CiAJCWFkYXB0ZXItPnBmcmVlX3NsaWNfaGFuZGxlcyA9IHBzbGljX2hhbmRsZTsKIAl9Ci0JYWRhcHRlci0+cHNobWVtID0gKHN0cnVjdCBzbGljX3NobWVtICopCi0JCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBzbGljX3NobWVtKSwKLQkJCQkJJmFkYXB0ZXItPgotCQkJCQlwaHlzX3NobWVtKTsKLQlpZiAoYWRhcHRlci0+cHNobWVtKQotCQltZW1zZXQoYWRhcHRlci0+cHNobWVtLCAwLCBzaXplb2Yoc3RydWN0IHNsaWNfc2htZW0pKTsKKwlzbV9kYXRhID0gcGNpX3phbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBjaWRldiwgc2l6ZW9mKCpzbV9kYXRhKSwKKwkJCQkJJnBoYWRkcik7CisJaWYgKCFzbV9kYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNtLT5zaG1lbV9kYXRhID0gc21fZGF0YTsKKwlzbS0+aXNyX3BoYWRkciA9IHBoYWRkcjsKKwlzbS0+bG5rc3RhdHVzX3BoYWRkciA9IHBoYWRkciArIG9mZnNldG9mKHN0cnVjdCBzbGljX3NobWVtX2RhdGEsCisJCQkJCQkgbG5rc3RhdHVzKTsKKwlzbS0+c3RhdHNfcGhhZGRyID0gcGhhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHNsaWNfc2htZW1fZGF0YSwgc3RhdHMpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgc2xpY19uZXRkZXZfb3BzID0gewpAQCAtMjk2NCwyNyArMjg4OCw5IEBACiAJc3RydWN0IHNsaWNjYXJkICpjYXJkID0gc2xpY19nbG9iYWwuc2xpY19jYXJkOwogCXN0cnVjdCBwaHlzY2FyZCAqcGh5c2NhcmQgPSBzbGljX2dsb2JhbC5waHlzX2NhcmQ7CiAJdXNob3J0IGNhcmRfaG9zdGlkOwotCXUxNiBfX2lvbWVtICpob3N0aWRfcmVnOwogCXVpbnQgaTsKLQl1aW50IHJkaG9zdGlkX29mZnNldCA9IDA7CiAKLQlzd2l0Y2ggKGFkYXB0ZXItPmRldmlkKSB7Ci0JY2FzZSBTTElDXzJHQl9ERVZJQ0VfSUQ6Ci0JCXJkaG9zdGlkX29mZnNldCA9IFNMSUNfUkRIT1NUSURfMkdCOwotCQlicmVhazsKLQljYXNlIFNMSUNfMUdCX0RFVklDRV9JRDoKLQkJcmRob3N0aWRfb2Zmc2V0ID0gU0xJQ19SREhPU1RJRF8xR0I7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWhvc3RpZF9yZWcgPQotCSAgICAodTE2IF9faW9tZW0gKikoKCh1OCBfX2lvbWVtICopKGFkYXB0ZXItPnNsaWNfcmVncykpICsKLQkgICAgcmRob3N0aWRfb2Zmc2V0KTsKLQotCS8qIHJlYWQgdGhlIDE2IGJpdCBob3N0aWQgZnJvbSBTUkFNICovCi0JY2FyZF9ob3N0aWQgPSAodXNob3J0KXJlYWR3KGhvc3RpZF9yZWcpOworCWNhcmRfaG9zdGlkID0gc2xpY19yZWFkMzIoYWRhcHRlciwgU0xJQ19SRUdfSE9TVElEKTsKIAogCS8qIEluaXRpYWxpemUgYSBuZXcgY2FyZCBzdHJ1Y3R1cmUgaWYgbmVlZCBiZSAqLwogCWlmIChjYXJkX2hvc3RpZCA9PSBTTElDX0hPU1RJRF9ERUZBVUxUKSB7CkBAIC0zMTMwLDcgKzMwMzYsNyBAQAogCW1taW9fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKIAltbWlvX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpZGV2LCAwKTsKIAotCW1lbW1hcHBlZF9pb2FkZHIgPSBpb3JlbWFwKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKKwltZW1tYXBwZWRfaW9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKG1taW9fc3RhcnQsIG1taW9fbGVuKTsKIAlpZiAoIW1lbW1hcHBlZF9pb2FkZHIpIHsKIAkJZGV2X2VycigmcGNpZGV2LT5kZXYsICJjYW5ub3QgcmVtYXAgTU1JTyByZWdpb24gJWx4IEAgJWx4XG4iLAogCQkJbW1pb19sZW4sIG1taW9fc3RhcnQpOwpAQCAtMzE0MiwxMyArMzA0OCwxNyBAQAogCiAJc2xpY19pbml0X2RyaXZlcigpOwogCi0Jc2xpY19pbml0X2FkYXB0ZXIobmV0ZGV2LAotCQkJICBwY2lkZXYsIHBjaV90YmxfZW50cnksIG1lbW1hcHBlZF9pb2FkZHIsIGNhcmRzX2ZvdW5kKTsKKwllcnIgPSBzbGljX2luaXRfYWRhcHRlcihuZXRkZXYsIHBjaWRldiwgcGNpX3RibF9lbnRyeSwgbWVtbWFwcGVkX2lvYWRkciwKKwkJCQljYXJkc19mb3VuZCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwY2lkZXYtPmRldiwgImZhaWxlZCB0byBpbml0IGFkYXB0ZXI6ICVpXG4iLCBlcnIpOworCQlnb3RvIGVycl9vdXRfdW5tYXA7CisJfQogCiAJZXJyID0gc2xpY19jYXJkX2xvY2F0ZShhZGFwdGVyKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiY2Fubm90IGxvY2F0ZSBjYXJkXG4iKTsKLQkJZ290byBlcnJfb3V0X3VubWFwOworCQlnb3RvIGVycl9jbGVhbl9pbml0OwogCX0KIAogCWNhcmQgPSBhZGFwdGVyLT5jYXJkOwpAQCAtMzE2MCw3ICszMDcwLDcgQEAKIAogCWVyciA9IHNsaWNfY2FyZF9pbml0KGNhcmQsIGFkYXB0ZXIpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dF91bm1hcDsKKwkJZ290byBlcnJfY2xlYW5faW5pdDsKIAogCXNsaWNfYWRhcHRlcl9zZXRfaHdhZGRyKGFkYXB0ZXIpOwogCkBAIC0zMTY4LDE3ICszMDc4LDIxIEBACiAJbmV0ZGV2LT5pcnEgPSBhZGFwdGVyLT5pcnE7CiAJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJnNsaWNfbmV0ZGV2X29wczsKIAorCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisKIAlzdHJjcHkobmV0ZGV2LT5uYW1lLCAiZXRoJWQiKTsKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBjaWRldi0+ZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX291dF91bm1hcDsKKwkJZ290byBlcnJfY2xlYW5faW5pdDsKIAl9CiAKIAljYXJkc19mb3VuZCsrOwogCiAJcmV0dXJuIDA7CiAKK2Vycl9jbGVhbl9pbml0OgorCXNsaWNfaW5pdF9jbGVhbnVwKGFkYXB0ZXIpOwogZXJyX291dF91bm1hcDoKIAlpb3VubWFwKG1lbW1hcHBlZF9pb2FkZHIpOwogZXJyX291dF9mcmVlX25ldGRldjoKQEAgLTMyMDksNyArMzEyMyw3IEBACiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzbGljX2RyaXZlcik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc2xpY19ldGh0b29sX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgc2xpY19ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2NvYWxlc2NlID0gc2xpY19nZXRfY29hbGVzY2UsCiAJLnNldF9jb2FsZXNjZSA9IHNsaWNfc2V0X2NvYWxlc2NlCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmMKaW5kZXggZjgwZWU3Ny4uODM5ZDY3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfY2hpcC5jCkBAIC02LDExICs2LDkgQEAKICNpbmNsdWRlICJkZGs3NTBfY2hpcC5oIgogI2luY2x1ZGUgImRkazc1MF9wb3dlci5oIgogCi0vKiBuIC8gZCArIDEgLyAyID0gKDJuICsgZCkgLyAyZCAqLwotI2RlZmluZSByb3VuZGVkRGl2KG51bSwgZGVub20pCSgoMiAqIChudW0pICsgKGRlbm9tKSkgLyAoMiAqIChkZW5vbSkpKQogI2RlZmluZSBNSHooeCkgKCh4KSAqIDEwMDAwMDApCiAKLWxvZ2ljYWxfY2hpcF90eXBlX3QgZ2V0Q2hpcFR5cGUodm9pZCkKK2xvZ2ljYWxfY2hpcF90eXBlX3Qgc203NTBfZ2V0X2NoaXBfdHlwZSh2b2lkKQogewogCXVuc2lnbmVkIHNob3J0IHBoeXNpY2FsSUQ7CiAJY2hhciBwaHlzaWNhbFJldjsKQEAgLTM3LDcgKzM1LDcgQEAKIAl1bnNpZ25lZCBpbnQgcGxsX3JlZzsKIAl1bnNpZ25lZCBpbnQgTSwgTiwgT0QsIFBPRDsKIAotCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKQogCQlyZXR1cm4gTUh6KDEzMCk7CiAKIAlwbGxfcmVnID0gUEVFSzMyKE1YQ0xLX1BMTF9DVFJMKTsKQEAgLTYwLDcgKzU4LDcgQEAKIAl1bnNpZ25lZCBpbnQgdWxBY3R1YWxNeENsazsKIAogCS8qIENoZW9rXzA1MDk6IEZvciBTTTc1MExFLCB0aGUgY2hpcCBjbG9jayBpcyBmaXhlZC4gTm90aGluZyB0byBzZXQuICovCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybjsKIAogCWlmIChmcmVxdWVuY3kpIHsKQEAgLTcxLDkgKzY5LDEwIEBACiAJCXBsbC5jbG9ja1R5cGUgPSBNWENMS19QTEw7CiAKIAkJLyoKLQkJKiBDYWxsIGNhbGNQbGxWYWx1ZSgpIHRvIGZpbGwgdXAgdGhlIG90aGVyIGZpZWxkcyBmb3IgUExMIHN0cnVjdHVyZS4KLQkJKiBTb21ldGltZSwgdGhlIGNoaXAgY2Fubm90IHNldCB1cCB0aGUgZXhhY3QgY2xvY2sgcmVxdWlyZWQgYnkgVXNlci4KLQkJKiBSZXR1cm4gdmFsdWUgZnJvbSBjYWxjUGxsVmFsdWUoKSBnaXZlcyB0aGUgYWN0dWFsIHBvc3NpYmxlIGNsb2NrLgorCQkqIENhbGwgY2FsY1BsbFZhbHVlKCkgdG8gZmlsbCB0aGUgb3RoZXIgZmllbGRzIG9mIFBMTCBzdHJ1Y3R1cmUuCisJCSogU29tZXRpbWUsIHRoZSBjaGlwIGNhbm5vdCBzZXQgdXAgdGhlIGV4YWN0IGNsb2NrCisJCSogcmVxdWlyZWQgYnkgdGhlIFVzZXIuCisJCSogUmV0dXJuIHZhbHVlIG9mIGNhbGNQbGxWYWx1ZSBnaXZlcyB0aGUgYWN0dWFsIHBvc3NpYmxlIGNsb2NrLgogCQkqLwogCQl1bEFjdHVhbE14Q2xrID0gY2FsY1BsbFZhbHVlKGZyZXF1ZW5jeSwgJnBsbCk7CiAKQEAgLTg2LDE4ICs4NSwyMiBAQAogewogCXVuc2lnbmVkIGludCByZWcsIGRpdmlzb3I7CiAKLQkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIG1lbW9yeSBjbG9jayBpcyBmaXhlZC4gTm90aGluZyB0byBzZXQuICovCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIG1lbW9yeSBjbG9jayBpcyBmaXhlZC4KKwkgKiBOb3RoaW5nIHRvIHNldC4KKwkgKi8KKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybjsKIAogCWlmIChmcmVxdWVuY3kpIHsKLQkJLyogU2V0IHRoZSBmcmVxdWVuY3kgdG8gdGhlIG1heGltdW0gZnJlcXVlbmN5IHRoYXQgdGhlIEREUiBNZW1vcnkgY2FuIHRha2UKLQkJd2hpY2ggaXMgMzM2TUh6LiAqLworCQkvKgorCQkgKiBTZXQgdGhlIGZyZXF1ZW5jeSB0byB0aGUgbWF4aW11bSBmcmVxdWVuY3kKKwkJICogdGhhdCB0aGUgRERSIE1lbW9yeSBjYW4gdGFrZSB3aGljaCBpcyAzMzZNSHouCisJCSAqLwogCQlpZiAoZnJlcXVlbmN5ID4gTUh6KDMzNikpCiAJCQlmcmVxdWVuY3kgPSBNSHooMzM2KTsKIAogCQkvKiBDYWxjdWxhdGUgdGhlIGRpdmlzb3IgKi8KLQkJZGl2aXNvciA9IHJvdW5kZWREaXYoZ2V0X214Y2xrX2ZyZXEoKSwgZnJlcXVlbmN5KTsKKwkJZGl2aXNvciA9IERJVl9ST1VORF9DTE9TRVNUKGdldF9teGNsa19mcmVxKCksIGZyZXF1ZW5jeSk7CiAKIAkJLyogU2V0IHRoZSBjb3JyZXNwb25kaW5nIGRpdmlzb3IgaW4gdGhlIHJlZ2lzdGVyLiAqLwogCQlyZWcgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKSAmIH5DVVJSRU5UX0dBVEVfTTJYQ0xLX01BU0s7CkBAIC0xMzMsMTggKzEzNiwyMSBAQAogewogCXVuc2lnbmVkIGludCByZWcsIGRpdmlzb3I7CiAKLQkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIG1lbW9yeSBjbG9jayBpcyBmaXhlZC4gTm90aGluZyB0byBzZXQuICovCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIG1lbW9yeSBjbG9jayBpcyBmaXhlZC4KKwkgKiBOb3RoaW5nIHRvIHNldC4KKwkgKi8KKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybjsKIAogCWlmIChmcmVxdWVuY3kpIHsKLQkJLyogU2V0IHRoZSBmcmVxdWVuY3kgdG8gdGhlIG1heGltdW0gZnJlcXVlbmN5IHRoYXQgdGhlIFNNNzUwIGVuZ2luZSBjYW4KLQkJcnVuLCB3aGljaCBpcyBhYm91dCAxOTAgTUh6LiAqLworCQkvKiBTZXQgdGhlIGZyZXF1ZW5jeSB0byB0aGUgbWF4aW11bSBmcmVxdWVuY3kKKwkJICogdGhhdCB0aGUgU003NTAgZW5naW5lIGNhbiBydW4sIHdoaWNoIGlzIGFib3V0IDE5MCBNSHouCisJCSAqLwogCQlpZiAoZnJlcXVlbmN5ID4gTUh6KDE5MCkpCiAJCQlmcmVxdWVuY3kgPSBNSHooMTkwKTsKIAogCQkvKiBDYWxjdWxhdGUgdGhlIGRpdmlzb3IgKi8KLQkJZGl2aXNvciA9IHJvdW5kZWREaXYoZ2V0X214Y2xrX2ZyZXEoKSwgZnJlcXVlbmN5KTsKKwkJZGl2aXNvciA9IERJVl9ST1VORF9DTE9TRVNUKGdldF9teGNsa19mcmVxKCksIGZyZXF1ZW5jeSk7CiAKIAkJLyogU2V0IHRoZSBjb3JyZXNwb25kaW5nIGRpdmlzb3IgaW4gdGhlIHJlZ2lzdGVyLiAqLwogCQlyZWcgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKSAmIH5DVVJSRU5UX0dBVEVfTUNMS19NQVNLOwpAQCAtMTc0LDcgKzE4MCw3IEBACiAJdW5zaWduZWQgaW50IGRhdGE7CiAKIAkvKiBzbTc1MGxlIG9ubHkgdXNlIDY0IG1iIG1lbW9yeSovCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybiBTWl82NE07CiAKIAkvKiBmb3IgNzUwLGFsd2F5cyB1c2UgcG93ZXIgbW9kZTAqLwpAQCAtMjEzLDcgKzIxOSw3IEBACiAJcmVnIHw9IChDVVJSRU5UX0dBVEVfRElTUExBWSB8IENVUlJFTlRfR0FURV9MT0NBTE1FTSk7CiAJc2V0Q3VycmVudEdhdGUocmVnKTsKIAotCWlmIChnZXRDaGlwVHlwZSgpICE9IFNNNzUwTEUpIHsKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpICE9IFNNNzUwTEUpIHsKIAkJLyoJc2V0IHBhbmVsIHBsbCBhbmQgZ3JhcGhpYyBtb2RlIHZpYSBtbWlvXzg4ICovCiAJCXJlZyA9IFBFRUszMihWR0FfQ09ORklHVVJBVElPTik7CiAJCXJlZyB8PSAoVkdBX0NPTkZJR1VSQVRJT05fUExMIHwgVkdBX0NPTkZJR1VSQVRJT05fTU9ERSk7CkBAIC0yMzYsOSArMjQyLDEwIEBACiAJc2V0TWFzdGVyQ2xvY2soTUh6KHBJbml0UGFyYW0tPm1hc3RlckNsb2NrKSk7CiAKIAotCS8qIFJlc2V0IHRoZSBtZW1vcnkgY29udHJvbGxlci4gSWYgdGhlIG1lbW9yeSBjb250cm9sbGVyIGlzIG5vdCByZXNldCBpbiBTTTc1MCwKLQkgICB0aGUgc3lzdGVtIG1pZ2h0IGhhbmcgd2hlbiBzdyBhY2Nlc3NlcyB0aGUgbWVtb3J5LgotCSAgIFRoZSBtZW1vcnkgc2hvdWxkIGJlIHJlc2V0dGVkIGFmdGVyIGNoYW5naW5nIHRoZSBNWENMSy4KKwkvKiBSZXNldCB0aGUgbWVtb3J5IGNvbnRyb2xsZXIuCisJICogSWYgdGhlIG1lbW9yeSBjb250cm9sbGVyIGlzIG5vdCByZXNldCBpbiBTTTc1MCwKKwkgKiB0aGUgc3lzdGVtIG1pZ2h0IGhhbmcgd2hlbiBzdyBhY2Nlc3NlcyB0aGUgbWVtb3J5LgorCSAqIFRoZSBtZW1vcnkgc2hvdWxkIGJlIHJlc2V0dGVkIGFmdGVyIGNoYW5naW5nIHRoZSBNWENMSy4KIAkgKi8KIAlpZiAocEluaXRQYXJhbS0+cmVzZXRNZW1vcnkgPT0gMSkgewogCQlyZWcgPSBQRUVLMzIoTUlTQ19DVFJMKTsKQEAgLTI4MiwyNCArMjg5LDI3IEBACiB9CiAKIC8qCi0JbW9uayBsaXUgQCA0LzYvMjAxMToKLQkJICAgcmUtd3JpdGUgdGhlIGNhbGN1bGF0ZVBMTCBmdW5jdGlvbiBvZiBkZGs3NTAuCi0JCSAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSBzb21lIG1hdGhlbWF0aWNzIHRyaWNrcyBhbmQgc2hvcnRjdXQKLQkJICAgd2hlbiBpdCBkb2luZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGJlc3QgTixNLEQgY29tYmluYXRpb24KLQkJICAgSSB0aGluayB0aGlzIHZlcnNpb24gZ2l2ZXMgYSBsaXR0bGUgdXBncmFkZSBpbiBzcGVlZAotCi0JNzUwIHBsbCBjbG9jayBmb3JtdWxhcjoKLQlSZXF1ZXN0IENsb2NrID0gKElucHV0IENsb2NrICogTSApLyhOICogWCkKLQotCUlucHV0IENsb2NrID0gMTQzMTgxODEgaHoKLQlYID0gMiBwb3dlciBECi0JRCA9ezAsMSwyLDMsNCw1LDZ9Ci0JTSA9IHsxLC4uLiwyNTV9Ci0JTiA9IHsyLC4uLiwxNX0KLSovCisgKiBtb25rIGxpdSBAIDQvNi8yMDExOgorICoJcmUtd3JpdGUgdGhlIGNhbGN1bGF0ZVBMTCBmdW5jdGlvbiBvZiBkZGs3NTAuCisgKgl0aGUgb3JpZ2luYWwgdmVyc2lvbiBmdW5jdGlvbiBkb2VzIG5vdCB1c2UKKyAqCXNvbWUgbWF0aGVtYXRpY3MgdHJpY2tzIGFuZCBzaG9ydGN1dAorICoJd2hlbiBpdCBkb2luZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGJlc3QgTixNLEQgY29tYmluYXRpb24KKyAqCUkgdGhpbmsgdGhpcyB2ZXJzaW9uIGdpdmVzIGEgbGl0dGxlIHVwZ3JhZGUgaW4gc3BlZWQKKyAqCisgKiA3NTAgcGxsIGNsb2NrIGZvcm11bGFyOgorICogUmVxdWVzdCBDbG9jayA9IChJbnB1dCBDbG9jayAqIE0gKS8oTiAqIFgpCisgKgorICogSW5wdXQgQ2xvY2sgPSAxNDMxODE4MSBoegorICogWCA9IDIgcG93ZXIgRAorICogRCA9ezAsMSwyLDMsNCw1LDZ9CisgKiBNID0gezEsLi4uLDI1NX0KKyAqIE4gPSB7MiwuLi4sMTV9CisgKi8KIHVuc2lnbmVkIGludCBjYWxjUGxsVmFsdWUodW5zaWduZWQgaW50IHJlcXVlc3Rfb3JpZywgcGxsX3ZhbHVlX3QgKnBsbCkKIHsKLQkvKiBhcyBzbTc1MCByZWdpc3RlciBkZWZpbml0aW9uLCBOIGxvY2F0ZWQgaW4gMiwxNSBhbmQgTSBsb2NhdGVkIGluIDEsMjU1CSovCisJLyogYXMgc203NTAgcmVnaXN0ZXIgZGVmaW5pdGlvbiwKKwkgKiBOIGxvY2F0ZWQgaW4gMiwxNSBhbmQgTSBsb2NhdGVkIGluIDEsMjU1CisJICovCiAJaW50IE4sIE0sIFgsIGQ7CiAJaW50IG1pbmlfZGlmZjsKIAl1bnNpZ25lZCBpbnQgUk4sIHF1bywgcmVtLCBmbF9xdW87CkBAIC0zMDgsOSArMzE4LDExIEBACiAJY29uc3QgaW50IG1heF9PRCA9IDM7CiAJaW50IG1heF9kID0gNjsKIAotCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpIHsKLQkJLyogU003NTBMRSBkb24ndCBoYXZlIHByZ3JhbW1hYmxlIFBMTCBhbmQgTS9OIHZhbHVlcyB0byB3b3JrIG9uLgotCQlKdXN0IHJldHVybiB0aGUgcmVxdWVzdGVkIGNsb2NrLiAqLworCWlmIChzbTc1MF9nZXRfY2hpcF90eXBlKCkgPT0gU003NTBMRSkgeworCQkvKiBTTTc1MExFIGRvbid0IGhhdmUKKwkJICogcHJvZ3JhbW1hYmxlIFBMTCBhbmQgTS9OIHZhbHVlcyB0byB3b3JrIG9uLgorCQkgKiBKdXN0IHJldHVybiB0aGUgcmVxdWVzdGVkIGNsb2NrLgorCQkgKi8KIAkJcmV0dXJuIHJlcXVlc3Rfb3JpZzsKIAl9CiAKQEAgLTMxOSwxOSArMzMxLDIzIEBACiAJcmVxdWVzdCA9IHJlcXVlc3Rfb3JpZyAvIDEwMDA7CiAJaW5wdXQgPSBwbGwtPmlucHV0RnJlcSAvIDEwMDA7CiAKLQkvKiBmb3IgTVhDTEsgcmVnaXN0ZXIgLCBubyBQT0QgcHJvdmlkZWQsIHNvIG5lZWQgYmUgdHJlYXRlZCBkaWZmZXJlbnRseQkqLworCS8qIGZvciBNWENMSyByZWdpc3RlciwKKwkgKiBubyBQT0QgcHJvdmlkZWQsIHNvIG5lZWQgYmUgdHJlYXRlZCBkaWZmZXJlbnRseQorCSAqLwogCWlmIChwbGwtPmNsb2NrVHlwZSA9PSBNWENMS19QTEwpCiAJCW1heF9kID0gMzsKIAogCWZvciAoTiA9IDE1OyBOID4gMTsgTi0tKSB7Ci0JCS8qIFJOIHdpbGwgbm90IGV4Y2VlZCBtYXhpbXVtIGxvbmcgaWYgQHJlcXVlc3QgPD0gMjg1IE1IWiAoZm9yIDMyYml0IGNwdSkgKi8KKwkJLyogUk4gd2lsbCBub3QgZXhjZWVkIG1heGltdW0gbG9uZworCQkgKiBpZiBAcmVxdWVzdCA8PSAyODUgTUhaIChmb3IgMzJiaXQgY3B1KQorCQkgKi8KIAkJUk4gPSBOICogcmVxdWVzdDsKIAkJcXVvID0gUk4gLyBpbnB1dDsKIAkJcmVtID0gUk4gJSBpbnB1dDsvKiByZW0gYWx3YXlzIHNtYWxsIHRoYW4gMTQzMTgxODEgKi8KIAkJZmxfcXVvID0gKHJlbSAqIDEwMDAwIC8gaW5wdXQpOwogCiAJCWZvciAoZCA9IG1heF9kOyBkID49IDA7IGQtLSkgewotCQkJWCA9ICgxIDw8IGQpOworCQkJWCA9IEJJVChkKTsKIAkJCU0gPSBxdW8gKiBYOwogCQkJTSArPSBmbF9xdW8gKiBYIC8gMTAwMDA7CiAJCQkvKiByb3VuZCBzdGVwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfY2hpcC5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuaAppbmRleCAwODkxMzg0Li4xNDM1N2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfY2hpcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmgKQEAgLTY5LDcgKzY5LDcgQEAKIH0KIGluaXRjaGlwX3BhcmFtX3Q7CiAKLWxvZ2ljYWxfY2hpcF90eXBlX3QgZ2V0Q2hpcFR5cGUodm9pZCk7Citsb2dpY2FsX2NoaXBfdHlwZV90IHNtNzUwX2dldF9jaGlwX3R5cGUodm9pZCk7CiB1bnNpZ25lZCBpbnQgY2FsY1BsbFZhbHVlKHVuc2lnbmVkIGludCByZXF1ZXN0LCBwbGxfdmFsdWVfdCAqcGxsKTsKIHVuc2lnbmVkIGludCBmb3JtYXRQbGxSZWcocGxsX3ZhbHVlX3QgKnBQTEwpOwogdm9pZCBkZGs3NTBfc2V0X21taW8odm9pZCBfX2lvbWVtICosIHVuc2lnbmVkIHNob3J0LCBjaGFyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kaXNwbGF5LmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5jCmluZGV4IGNhNDk3M2UuLjQwMjNjNDc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kaXNwbGF5LmMKQEAgLTY4LDggKzY4LDEwIEBACiAJaWYgKCFjdHJsKSB7CiAJCS8qIHByaW1hcnkgY29udHJvbGxlciAqLwogCi0JCS8qIERvIG5vdCB3YWl0IHdoZW4gdGhlIFByaW1hcnkgUExMIGlzIG9mZiBvciBkaXNwbGF5IGNvbnRyb2wgaXMgYWxyZWFkeSBvZmYuCi0JCSAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzb2Z0d2FyZSB0byB3YWl0IGZvcmV2ZXIuICovCisJCS8qCisJCSAqIERvIG5vdCB3YWl0IHdoZW4gdGhlIFByaW1hcnkgUExMIGlzIG9mZiBvciBkaXNwbGF5IGNvbnRyb2wgaXMKKwkJICogYWxyZWFkeSBvZmYuIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzb2Z0d2FyZSB0byB3YWl0IGZvcmV2ZXIuCisJCSAqLwogCQlpZiAoIShQRUVLMzIoUEFORUxfUExMX0NUUkwpICYgUExMX0NUUkxfUE9XRVIpIHx8CiAJCSAgICAhKFBFRUszMihQQU5FTF9ESVNQTEFZX0NUUkwpICYgRElTUExBWV9DVFJMX1RJTUlORykpIHsKIAkJCXJldHVybjsKQEAgLTg4LDkgKzkwLDEwIEBACiAJCX0KIAogCX0gZWxzZSB7Ci0KLQkJLyogRG8gbm90IHdhaXQgd2hlbiB0aGUgUHJpbWFyeSBQTEwgaXMgb2ZmIG9yIGRpc3BsYXkgY29udHJvbCBpcyBhbHJlYWR5IG9mZi4KLQkJCSAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzb2Z0d2FyZSB0byB3YWl0IGZvcmV2ZXIuICovCisJCS8qCisJCSAqIERvIG5vdCB3YWl0IHdoZW4gdGhlIFByaW1hcnkgUExMIGlzIG9mZiBvciBkaXNwbGF5IGNvbnRyb2wgaXMKKwkJICogYWxyZWFkeSBvZmYuIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzb2Z0d2FyZSB0byB3YWl0IGZvcmV2ZXIuCisJCSAqLwogCQlpZiAoIShQRUVLMzIoQ1JUX1BMTF9DVFJMKSAmIFBMTF9DVFJMX1BPV0VSKSB8fAogCQkgICAgIShQRUVLMzIoQ1JUX0RJU1BMQVlfQ1RSTCkgJiBESVNQTEFZX0NUUkxfVElNSU5HKSkgewogCQkJcmV0dXJuOwpAQCAtMTM0LDcgKzEzNyw2IEBACiAJcmVnIHw9IChkaXNwID8gUEFORUxfRElTUExBWV9DVFJMX0ZQRU4gOiAwKTsKIAlQT0tFMzIoUEFORUxfRElTUExBWV9DVFJMLCByZWcpOwogCXByaW1hcnlXYWl0VmVydGljYWxTeW5jKGRlbGF5KTsKLQogfQogCiB2b2lkIGRkazc1MF9zZXRMb2dpY2FsRGlzcE91dChkaXNwX291dHB1dF90IG91dHB1dCkKQEAgLTE1OSw3ICsxNjEsNiBAQAogCQkvKnNlIGJsYW5rIG9mZiAqLwogCQlyZWcgJj0gfkNSVF9ESVNQTEFZX0NUUkxfQkxBTks7CiAJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLCByZWcpOwotCiAJfQogCiAJaWYgKG91dHB1dCAmIFBSSV9UUF9VU0FHRSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kaXNwbGF5LmgKaW5kZXggY2EzNWFhMS4uZTNmZGU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5oCkBAIC0yLDEwMCArMiw5OCBAQAogI2RlZmluZSBEREs3NTBfRElTUExBWV9IX18KIAogLyogcGFuZWwgcGF0aCBzZWxlY3QKLQk4MDAwMFsyOToyOF0KLSovCisgKgk4MDAwMFsyOToyOF0KKyAqLwogCiAjZGVmaW5lIFBOTF8yX09GRlNFVCAwCiAjZGVmaW5lIFBOTF8yX01BU0sgKDMgPDwgUE5MXzJfT0ZGU0VUKQogI2RlZmluZSBQTkxfMl9VU0FHRQkoUE5MXzJfTUFTSyA8PCAxNikKLSNkZWZpbmUgUE5MXzJfUFJJCSgoMCA8PCBQTkxfMl9PRkZTRVQpfFBOTF8yX1VTQUdFKQotI2RlZmluZSBQTkxfMl9TRUMJKCgyIDw8IFBOTF8yX09GRlNFVCl8UE5MXzJfVVNBR0UpCisjZGVmaW5lIFBOTF8yX1BSSQkoKDAgPDwgUE5MXzJfT0ZGU0VUKSB8IFBOTF8yX1VTQUdFKQorI2RlZmluZSBQTkxfMl9TRUMJKCgyIDw8IFBOTF8yX09GRlNFVCkgfCBQTkxfMl9VU0FHRSkKIAogCiAvKiBwcmltYXJ5IHRpbWluZyAmIHBsYW5lIGVuYWJsZSBiaXQKLQkxOiA4MDAwMFs4XSAmIDgwMDAwWzJdIG9uCi0JMDogYm90aCBvZmYKLSovCisgKgkxOiA4MDAwMFs4XSAmIDgwMDAwWzJdIG9uCisgKgkwOiBib3RoIG9mZgorICovCiAjZGVmaW5lIFBSSV9UUF9PRkZTRVQgNAogI2RlZmluZSBQUklfVFBfTUFTSyBCSVQoUFJJX1RQX09GRlNFVCkKICNkZWZpbmUgUFJJX1RQX1VTQUdFIChQUklfVFBfTUFTSyA8PCAxNikKLSNkZWZpbmUgUFJJX1RQX09OICgoMHgxIDw8IFBSSV9UUF9PRkZTRVQpfFBSSV9UUF9VU0FHRSkKLSNkZWZpbmUgUFJJX1RQX09GRiAoKDB4MCA8PCBQUklfVFBfT0ZGU0VUKXxQUklfVFBfVVNBR0UpCisjZGVmaW5lIFBSSV9UUF9PTiAoKDB4MSA8PCBQUklfVFBfT0ZGU0VUKSB8IFBSSV9UUF9VU0FHRSkKKyNkZWZpbmUgUFJJX1RQX09GRiAoKDB4MCA8PCBQUklfVFBfT0ZGU0VUKSB8IFBSSV9UUF9VU0FHRSkKIAogCiAvKiBwYW5lbCBzZXF1ZW5jeSBzdGF0dXMKLQk4MDAwMFsyNzoyNF0KLSovCisgKgk4MDAwMFsyNzoyNF0KKyAqLwogI2RlZmluZSBQTkxfU0VRX09GRlNFVCA2CiAjZGVmaW5lIFBOTF9TRVFfTUFTSyBCSVQoUE5MX1NFUV9PRkZTRVQpCiAjZGVmaW5lIFBOTF9TRVFfVVNBR0UgKFBOTF9TRVFfTUFTSyA8PCAxNikKLSNkZWZpbmUgUE5MX1NFUV9PTiAoQklUKFBOTF9TRVFfT0ZGU0VUKXxQTkxfU0VRX1VTQUdFKQotI2RlZmluZSBQTkxfU0VRX09GRiAoKDAgPDwgUE5MX1NFUV9PRkZTRVQpfFBOTF9TRVFfVVNBR0UpCisjZGVmaW5lIFBOTF9TRVFfT04gKEJJVChQTkxfU0VRX09GRlNFVCkgfCBQTkxfU0VRX1VTQUdFKQorI2RlZmluZSBQTkxfU0VRX09GRiAoKDAgPDwgUE5MX1NFUV9PRkZTRVQpIHwgUE5MX1NFUV9VU0FHRSkKIAogLyogZHVhbCBkaWdpdGFsIG91dHB1dAotCTgwMDAwWzE5XQotKi8KKyAqCTgwMDAwWzE5XQorICovCiAjZGVmaW5lIERVQUxfVEZUX09GRlNFVCA4CiAjZGVmaW5lIERVQUxfVEZUX01BU0sgQklUKERVQUxfVEZUX09GRlNFVCkKICNkZWZpbmUgRFVBTF9URlRfVVNBR0UgKERVQUxfVEZUX01BU0sgPDwgMTYpCi0jZGVmaW5lIERVQUxfVEZUX09OIChCSVQoRFVBTF9URlRfT0ZGU0VUKXxEVUFMX1RGVF9VU0FHRSkKLSNkZWZpbmUgRFVBTF9URlRfT0ZGICgoMCA8PCBEVUFMX1RGVF9PRkZTRVQpfERVQUxfVEZUX1VTQUdFKQorI2RlZmluZSBEVUFMX1RGVF9PTiAoQklUKERVQUxfVEZUX09GRlNFVCkgfCBEVUFMX1RGVF9VU0FHRSkKKyNkZWZpbmUgRFVBTF9URlRfT0ZGICgoMCA8PCBEVUFMX1RGVF9PRkZTRVQpIHwgRFVBTF9URlRfVVNBR0UpCiAKIC8qIHNlY29uZGFyeSB0aW1pbmcgJiBwbGFuZSBlbmFibGUgYml0Ci0JMTo4MDIwMFs4XSAmIDgwMjAwWzJdIG9uCi0JMDogYm90aCBvZmYKLSovCisgKgkxOjgwMjAwWzhdICYgODAyMDBbMl0gb24KKyAqCTA6IGJvdGggb2ZmCisgKi8KICNkZWZpbmUgU0VDX1RQX09GRlNFVCA1CiAjZGVmaW5lIFNFQ19UUF9NQVNLIEJJVChTRUNfVFBfT0ZGU0VUKQogI2RlZmluZSBTRUNfVFBfVVNBR0UgKFNFQ19UUF9NQVNLIDw8IDE2KQotI2RlZmluZSBTRUNfVFBfT04gICgoMHgxIDw8IFNFQ19UUF9PRkZTRVQpfFNFQ19UUF9VU0FHRSkKLSNkZWZpbmUgU0VDX1RQX09GRiAoKDB4MCA8PCBTRUNfVFBfT0ZGU0VUKXxTRUNfVFBfVVNBR0UpCisjZGVmaW5lIFNFQ19UUF9PTiAgKCgweDEgPDwgU0VDX1RQX09GRlNFVCkgfCBTRUNfVFBfVVNBR0UpCisjZGVmaW5lIFNFQ19UUF9PRkYgKCgweDAgPDwgU0VDX1RQX09GRlNFVCkgfCBTRUNfVFBfVVNBR0UpCiAKIC8qIGNydCBwYXRoIHNlbGVjdAotCTgwMjAwWzE5OjE4XQotKi8KKyAqCTgwMjAwWzE5OjE4XQorICovCiAjZGVmaW5lIENSVF8yX09GRlNFVCAyCiAjZGVmaW5lIENSVF8yX01BU0sgKDMgPDwgQ1JUXzJfT0ZGU0VUKQogI2RlZmluZSBDUlRfMl9VU0FHRSAoQ1JUXzJfTUFTSyA8PCAxNikKLSNkZWZpbmUgQ1JUXzJfUFJJICgoMHgwIDw8IENSVF8yX09GRlNFVCl8Q1JUXzJfVVNBR0UpCi0jZGVmaW5lIENSVF8yX1NFQyAoKDB4MiA8PCBDUlRfMl9PRkZTRVQpfENSVF8yX1VTQUdFKQorI2RlZmluZSBDUlRfMl9QUkkgKCgweDAgPDwgQ1JUXzJfT0ZGU0VUKSB8IENSVF8yX1VTQUdFKQorI2RlZmluZSBDUlRfMl9TRUMgKCgweDIgPDwgQ1JUXzJfT0ZGU0VUKSB8IENSVF8yX1VTQUdFKQogCiAKIC8qIERBQyBhZmZlY3QgYm90aCBEVkkgYW5kIERTVUIKLQk0WzIwXQotKi8KKyAqCTRbMjBdCisgKi8KICNkZWZpbmUgREFDX09GRlNFVCA3CiAjZGVmaW5lIERBQ19NQVNLIEJJVChEQUNfT0ZGU0VUKQogI2RlZmluZSBEQUNfVVNBR0UgKERBQ19NQVNLIDw8IDE2KQotI2RlZmluZSBEQUNfT04gKCgweDAgPDwgREFDX09GRlNFVCl8REFDX1VTQUdFKQotI2RlZmluZSBEQUNfT0ZGICgoMHgxIDw8IERBQ19PRkZTRVQpfERBQ19VU0FHRSkKKyNkZWZpbmUgREFDX09OICgoMHgwIDw8IERBQ19PRkZTRVQpIHwgREFDX1VTQUdFKQorI2RlZmluZSBEQUNfT0ZGICgoMHgxIDw8IERBQ19PRkZTRVQpIHwgREFDX1VTQUdFKQogCiAvKiBEUE1TIG9ubHkgYWZmZWN0IEQtU1VCIGhlYWQKLQkwWzMxOjMwXQotKi8KKyAqCTBbMzE6MzBdCisgKi8KICNkZWZpbmUgRFBNU19PRkZTRVQgOQogI2RlZmluZSBEUE1TX01BU0sgKDMgPDwgRFBNU19PRkZTRVQpCiAjZGVmaW5lIERQTVNfVVNBR0UgKERQTVNfTUFTSyA8PCAxNikKLSNkZWZpbmUgRFBNU19PRkYgKCgzIDw8IERQTVNfT0ZGU0VUKXxEUE1TX1VTQUdFKQotI2RlZmluZSBEUE1TX09OICgoMCA8PCBEUE1TX09GRlNFVCl8RFBNU19VU0FHRSkKKyNkZWZpbmUgRFBNU19PRkYgKCgzIDw8IERQTVNfT0ZGU0VUKSB8IERQTVNfVVNBR0UpCisjZGVmaW5lIERQTVNfT04gKCgwIDw8IERQTVNfT0ZGU0VUKSB8IERQTVNfVVNBR0UpCiAKIAogCi0vKgotCUxDRDEgbWVhbnMgcGFuZWwgcGF0aCBURlQxICAmIHBhbmVsIHBhdGggRFZJIChzbyBlbmFibGUgREFDKQotCUNSVCBtZWFucyBjcnQgcGF0aCBEU1VCCi0qLworLyogTENEMSBtZWFucyBwYW5lbCBwYXRoIFRGVDEgICYgcGFuZWwgcGF0aCBEVkkgKHNvIGVuYWJsZSBEQUMpCisgKiBDUlQgbWVhbnMgY3J0IHBhdGggRFNVQgorICovCiB0eXBlZGVmIGVudW0gX2Rpc3Bfb3V0cHV0X3QgewotCWRvX0xDRDFfUFJJID0gUE5MXzJfUFJJfFBSSV9UUF9PTnxQTkxfU0VRX09OfERBQ19PTiwKLQlkb19MQ0QxX1NFQyA9IFBOTF8yX1NFQ3xTRUNfVFBfT058UE5MX1NFUV9PTnxEQUNfT04sCi0JZG9fTENEMl9QUkkgPSBDUlRfMl9QUkl8UFJJX1RQX09OfERVQUxfVEZUX09OLAotCWRvX0xDRDJfU0VDID0gQ1JUXzJfU0VDfFNFQ19UUF9PTnxEVUFMX1RGVF9PTiwKLQkvKgotCWRvX0RTVUJfUFJJID0gQ1JUXzJfUFJJfFBSSV9UUF9PTnxEUE1TX09OfERBQ19PTiwKLQlkb19EU1VCX1NFQyA9IENSVF8yX1NFQ3xTRUNfVFBfT058RFBNU19PTnxEQUNfT04sCi0JKi8KLQlkb19DUlRfUFJJID0gQ1JUXzJfUFJJfFBSSV9UUF9PTnxEUE1TX09OfERBQ19PTiwKLQlkb19DUlRfU0VDID0gQ1JUXzJfU0VDfFNFQ19UUF9PTnxEUE1TX09OfERBQ19PTiwKKwlkb19MQ0QxX1BSSSA9IFBOTF8yX1BSSSB8IFBSSV9UUF9PTiB8IFBOTF9TRVFfT04gfCBEQUNfT04sCisJZG9fTENEMV9TRUMgPSBQTkxfMl9TRUMgfCBTRUNfVFBfT04gfCBQTkxfU0VRX09OIHwgREFDX09OLAorCWRvX0xDRDJfUFJJID0gQ1JUXzJfUFJJIHwgUFJJX1RQX09OIHwgRFVBTF9URlRfT04sCisJZG9fTENEMl9TRUMgPSBDUlRfMl9TRUMgfCBTRUNfVFBfT04gfCBEVUFMX1RGVF9PTiwKKwkvKiBkb19EU1VCX1BSSSA9IENSVF8yX1BSSSB8IFBSSV9UUF9PTiB8IERQTVNfT058REFDX09OLAorCSAqIGRvX0RTVUJfU0VDID0gQ1JUXzJfU0VDIHwgU0VDX1RQX09OIHwgRFBNU19PTnxEQUNfT04sCisJICovCisJZG9fQ1JUX1BSSSA9IENSVF8yX1BSSSB8IFBSSV9UUF9PTiB8IERQTVNfT04gfCBEQUNfT04sCisJZG9fQ1JUX1NFQyA9IENSVF8yX1NFQyB8IFNFQ19UUF9PTiB8IERQTVNfT04gfCBEQUNfT04sCiB9CiBkaXNwX291dHB1dF90OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZHZpLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZHZpLmMKaW5kZXggYTRhMjU1MC4uODI1MmY3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2R2aS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kdmkuYwpAQCAtNiw5ICs2LDExIEBACiAjaW5jbHVkZSAiZGRrNzUwX3NpaTE2NC5oIgogCiAKLS8qIFRoaXMgZ2xvYmFsIHZhcmlhYmxlIGNvbnRhaW5zIGFsbCB0aGUgc3VwcG9ydGVkIGRyaXZlciBhbmQgaXRzIGNvcnJlc3BvbmRpbmcKLSAgIGZ1bmN0aW9uIEFQSS4gUGxlYXNlIHNldCB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBOVUxMIHdoZW5ldmVyIHRoZSBmdW5jdGlvbgotICAgaXMgbm90IHN1cHBvcnRlZC4gKi8KKy8qCisgKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBjb250YWlucyBhbGwgdGhlIHN1cHBvcnRlZCBkcml2ZXIgYW5kIGl0cyBjb3JyZXNwb25kaW5nCisgKiBmdW5jdGlvbiBBUEkuIFBsZWFzZSBzZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gTlVMTCB3aGVuZXZlciB0aGUgZnVuY3Rpb24KKyAqIGlzIG5vdCBzdXBwb3J0ZWQuCisgKi8KIHN0YXRpYyBkdmlfY3RybF9kZXZpY2VfdCBnX2RjZnRTdXBwb3J0ZWREdmlDb250cm9sbGVyW10gPSB7CiAjaWZkZWYgRFZJX0NUUkxfU0lJMTY0CiAJewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2h3aTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaHdpMmMuYwppbmRleCAzOWMzZTFjLi5kMzkxYzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaHdpMmMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaHdpMmMuYwpAQCAtMjEsNyArMjEsNyBAQAogCVBPS0UzMihHUElPX01VWCwgdmFsdWUpOwogCiAJLyogRW5hYmxlIEhhcmR3YXJlIEkyQyBwb3dlci4KLQkgVE9ETzogQ2hlY2sgaWYgd2UgbmVlZCB0byBlbmFibGUgR1BJTyBwb3dlcj8KKwkgKiBUT0RPOiBDaGVjayBpZiB3ZSBuZWVkIHRvIGVuYWJsZSBHUElPIHBvd2VyPwogCSAqLwogCWVuYWJsZUkyQygxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX21vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9tb2RlLmMKaW5kZXggY2NiNGUwNi4uMDViODM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX21vZGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfbW9kZS5jCkBAIC00LDE1ICs0LDE0IEBACiAjaW5jbHVkZSAiZGRrNzUwX21vZGUuaCIKICNpbmNsdWRlICJkZGs3NTBfY2hpcC5oIgogCi0vKgotCVNNNzUwTEUgb25seToKLSAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgZXh0cmEgcmVnaXN0ZXJzIGFuZCBiaXQgZmllbGRzIHJlcXVpcmVkIHRvIHNldAotICAgIHVwIGEgbW9kZSBpbiBTTTc1MExFCi0KLQlFeHBsYW5hdGlvbiBhYm91dCBEaXNwbGF5IENvbnRyb2wgcmVnaXN0ZXI6Ci0gICAgSFcgb25seSBzdXBwb3J0cyA3IHByZWRlZmluZWQgcGl4ZWwgY2xvY2tzLCBhbmQgY2xvY2sgc2VsZWN0IGlzCi0gICAgaW4gYml0IDI5OjI3IG9mCURpc3BsYXkgQ29udHJvbCByZWdpc3Rlci4KLSovCisvKiBTTTc1MExFIG9ubHk6CisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgZXh0cmEgcmVnaXN0ZXJzIGFuZCBiaXQgZmllbGRzIHJlcXVpcmVkIHRvIHNldAorICogdXAgYSBtb2RlIGluIFNNNzUwTEUKKyAqCisgKiBFeHBsYW5hdGlvbiBhYm91dCBEaXNwbGF5IENvbnRyb2wgcmVnaXN0ZXI6CisgKiBIVyBvbmx5IHN1cHBvcnRzIDcgcHJlZGVmaW5lZCBwaXhlbCBjbG9ja3MsIGFuZCBjbG9jayBzZWxlY3QgaXMKKyAqIGluIGJpdCAyOToyNyBvZiBEaXNwbGF5IENvbnRyb2wgcmVnaXN0ZXIuCisgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRpc3BsYXlDb250cm9sQWRqdXN0X1NNNzUwTEUobW9kZV9wYXJhbWV0ZXJfdCAqcE1vZGVQYXJhbSwgdW5zaWduZWQgbG9uZyBkaXNwQ29udHJvbCkKIHsKIAl1bnNpZ25lZCBsb25nIHgsIHk7CkBAIC0yMSw5ICsyMCw5IEBACiAJeSA9IHBNb2RlUGFyYW0tPnZlcnRpY2FsX2Rpc3BsYXlfZW5kOwogCiAJLyogU003NTBMRSBoYXMgdG8gc2V0IHVwIHRoZSB0b3AtbGVmdCBhbmQgYm90dG9tLXJpZ2h0Ci0JICAgcmVnaXN0ZXJzIGFzIHdlbGwuCi0JICAgTm90ZSB0aGF0IG5vcm1hbCBTTTc1MC9TTTcxOCBvbmx5IHVzZSB0aG9zZSB0d28gcmVnaXN0ZXIgZm9yCi0JICAgYXV0by1jZW50ZXJpbmcgbW9kZS4KKwkgKiByZWdpc3RlcnMgYXMgd2VsbC4KKwkgKiBOb3RlIHRoYXQgbm9ybWFsIFNNNzUwL1NNNzE4IG9ubHkgdXNlIHRob3NlIHR3byByZWdpc3RlciBmb3IKKwkgKiBhdXRvLWNlbnRlcmluZyBtb2RlLgogCSAqLwogCVBPS0UzMihDUlRfQVVUT19DRU5URVJJTkdfVEwsIDApOwogCkBAIC0zMyw4ICszMiw4IEBACiAJCSgoeCAtIDEpICYgQ1JUX0FVVE9fQ0VOVEVSSU5HX0JSX1JJR0hUX01BU0spKTsKIAogCS8qIEFzc3VtZSBjb21tb24gZmllbGRzIGluIGRpc3BDb250cm9sIGhhdmUgYmVlbiBwcm9wZXJseSBzZXQgYmVmb3JlCi0JICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotCSAgIFRoaXMgZnVuY3Rpb24gb25seSBzZXRzIHRoZSBleHRyYSBmaWVsZHMgaW4gZGlzcENvbnRyb2wuCisJICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorCSAqIFRoaXMgZnVuY3Rpb24gb25seSBzZXRzIHRoZSBleHRyYSBmaWVsZHMgaW4gZGlzcENvbnRyb2wuCiAJICovCiAKIAkvKiBDbGVhciBiaXQgMjk6Mjcgb2YgZGlzcGxheSBjb250cm9sIHJlZ2lzdGVyICovCkBAIC02Myw3ICs2Miw3IEBACiAJZGlzcENvbnRyb2wgfD0gKENSVF9ESVNQTEFZX0NUUkxfQ1JUU0VMRUNUIHwgQ1JUX0RJU1BMQVlfQ1RSTF9SR0JCSVQpOwogCiAJLyogU2V0IGJpdCAxNCBvZiBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KLQlkaXNwQ29udHJvbCA9IERJU1BMQVlfQ1RSTF9DTE9DS19QSEFTRTsKKwlkaXNwQ29udHJvbCB8PSBESVNQTEFZX0NUUkxfQ0xPQ0tfUEhBU0U7CiAKIAlQT0tFMzIoQ1JUX0RJU1BMQVlfQ1RSTCwgZGlzcENvbnRyb2wpOwogCkBAIC0xMTcsNyArMTE2LDcgQEAKIAkJaWYgKHBNb2RlUGFyYW0tPmhvcml6b250YWxfc3luY19wb2xhcml0eSkKIAkJCXRtcCB8PSBESVNQTEFZX0NUUkxfSFNZTkNfUEhBU0U7CiAKLQkJaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkgeworCQlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpIHsKIAkJCWRpc3BsYXlDb250cm9sQWRqdXN0X1NNNzUwTEUocE1vZGVQYXJhbSwgdG1wKTsKIAkJfSBlbHNlIHsKIAkJCXJlZyA9IFBFRUszMihDUlRfRElTUExBWV9DVFJMKSAmCkBAIC0yMDksNyArMjA4LDcgQEAKIAlwbGwuY2xvY2tUeXBlID0gY2xvY2s7CiAKIAl1aUFjdHVhbFBpeGVsQ2xrID0gY2FsY1BsbFZhbHVlKHBhcm0tPnBpeGVsX2Nsb2NrLCAmcGxsKTsKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKSB7CisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKSB7CiAJCS8qIHNldCBncmFwaGljIG1vZGUgdmlhIElPIG1ldGhvZCAqLwogCQlvdXRiX3AoMHg4OCwgMHgzZDQpOwogCQlvdXRiX3AoMHgwNiwgMHgzZDUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3Bvd2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuYwppbmRleCBiM2MzNzkxLi43Y2M2MTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuYwpAQCAtNiw3ICs2LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdmFsdWU7CiAKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKSB7CisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKSB7CiAJCXZhbHVlID0gUEVFSzMyKENSVF9ESVNQTEFZX0NUUkwpICYgfkNSVF9ESVNQTEFZX0NUUkxfRFBNU19NQVNLOwogCQl2YWx1ZSB8PSAoc3RhdGUgPDwgQ1JUX0RJU1BMQVlfQ1RSTF9EUE1TX1NISUZUKTsKIAkJUE9LRTMyKENSVF9ESVNQTEFZX0NUUkwsIHZhbHVlKTsKQEAgLTE5LDcgKzE5LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBnZXRQb3dlck1vZGUodm9pZCkKIHsKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKQorCWlmIChzbTc1MF9nZXRfY2hpcF90eXBlKCkgPT0gU003NTBMRSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIFBFRUszMihQT1dFUl9NT0RFX0NUUkwpICYgUE9XRVJfTU9ERV9DVFJMX01PREVfTUFTSzsKIH0KQEAgLTM1LDcgKzM1LDcgQEAKIAogCWNvbnRyb2xfdmFsdWUgPSBQRUVLMzIoUE9XRVJfTU9ERV9DVFJMKSAmIH5QT1dFUl9NT0RFX0NUUkxfTU9ERV9NQVNLOwogCi0JaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpCiAJCXJldHVybjsKIAogCXN3aXRjaCAocG93ZXJNb2RlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc2lpMTY0LmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc2lpMTY0LmMKaW5kZXggNjdmMzZlNy4uOTlhODY4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3NpaTE2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zaWkxNjQuYwpAQCAtMTc0LDggKzE3NCw4IEBACiAJCWkyY1dyaXRlUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0NPTkZJR1VSQVRJT04sIGNvbmZpZyk7CiAKIAkJLyogRGUtc2tldyBlbmFibGVkIHdpdGggZGVmYXVsdCAxMTFiIHZhbHVlLgotCQkgICBUaGlzIHdpbGwgZml4IHNvbWUgYXJ0aWZhY3RzIHByb2JsZW0gaW4gc29tZSBtb2RlIG9uIGJvYXJkIDIuMi4KLQkJICAgU29tZWhvdyB0aGlzIGZpeCBkb2VzIG5vdCBhZmZlY3QgYm9hcmQgMi4xLgorCQkgKiBUaGlzIGZpeGVzIHNvbWUgYXJ0aWZhY3RzIHByb2JsZW0gaW4gc29tZSBtb2RlIG9uIGJvYXJkIDIuMi4KKwkJICogU29tZWhvdyB0aGlzIGZpeCBkb2VzIG5vdCBhZmZlY3QgYm9hcmQgMi4xLgogCQkgKi8KIAkJaWYgKGRlc2tld0VuYWJsZSA9PSAwKQogCQkJY29uZmlnID0gU0lJMTY0X0RFU0tFV19ESVNBQkxFOwpAQCAtMzQ0LDcgKzM0NCw4IEBACiAJZGV0ZWN0UmVnID0gaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9ERVRFQ1QpOwogCiAJLyogRGVwZW5kaW5nIG9uIGVhY2ggRFZJIGNvbnRyb2xsZXIsIG5lZWQgdG8gZW5hYmxlIHRoZSBob3QgcGx1ZyBiYXNlZCBvbiBlYWNoCi0JICAgaW5kaXZpZHVhbCBjaGlwIGRlc2lnbi4gKi8KKwkgKiBpbmRpdmlkdWFsIGNoaXAgZGVzaWduLgorCSAqLwogCWlmIChlbmFibGVIb3RQbHVnICE9IDApCiAJCXNpaTE2NFNlbGVjdEhvdFBsdWdEZXRlY3Rpb25Nb2RlKFNJSTE2NF9IT1RQTFVHX1VTRV9NREkpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zd2kyYy5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3N3aTJjLmMKaW5kZXggOGQ2NDRhNy4uNzJhNDIzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3N3aTJjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3N3aTJjLmMKQEAgLTg5LDEyICs4OSwxMiBAQAogCSAqIGFsd2F5cyBiZSBub24temVybyx3aGljaCBtYWtlcyB0aGUgd2hpbGUgbG9vcAogCSAqIG5ldmVyIGZpbmlzaC4KIAkgKiB1c2Ugbm9uLXVsdGltYXRlIGZvciBsb29wIGJlbG93IGlzIHNhZmUKLQkgKiAqLworCSAqLwogCiAgICAgLyogQ2hhbmdlIHdhaXQgYWxnb3JpdGhtIHRvIHVzZSBQQ0kgYnVzIGNsb2NrLAotICAgICAgIGl0J3MgbW9yZSByZWxpYWJsZSB0aGFuIGNvdW50ZXIgbG9vcCAuLgotICAgICAgIHdyaXRlIDB4NjEgdG8gMHgzY2UgYW5kIHJlYWQgZnJvbSAweDNjZgotICAgICAgICovCisgICAgICogaXQncyBtb3JlIHJlbGlhYmxlIHRoYW4gY291bnRlciBsb29wIC4uCisgICAgICogd3JpdGUgMHg2MSB0byAweDNjZSBhbmQgcmVhZCBmcm9tIDB4M2NmCisgICAgICovCiAJaW50IGksIHRtcDsKIAogCWZvciAoaSA9IDA7IGkgPCA2MDA7IGkrKykgewpAQCAtNDAzLDcgKzQwMyw3IEBACiAJaWYgKChjbGtfZ3BpbyA+IDMxKSB8fCAoZGF0YV9ncGlvID4gMzEpKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKQorCWlmIChzbTc1MF9nZXRfY2hpcF90eXBlKCkgPT0gU003NTBMRSkKIAkJcmV0dXJuIHNtNzUwbGVfaTJjX2luaXQoY2xrX2dwaW8sIGRhdGFfZ3Bpbyk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBHUElPIHBpbiBmb3IgdGhlIGkyYyBDbG9jayBSZWdpc3RlciAqLwpAQCAtNTAxLDggKzUwMSw4IEBACiAJc3dfaTJjX3N0YXJ0KCk7CiAKIAkvKiBTZW5kIHRoZSBkZXZpY2UgYWRkcmVzcyBhbmQgcmVhZCB0aGUgZGF0YS4gQWxsIHNob3VsZCByZXR1cm4gc3VjY2VzcwotCSAgIGluIG9yZGVyIGZvciB0aGUgd3JpdGluZyBwcm9jZXNzZWQgdG8gYmUgc3VjY2Vzc2Z1bAotCSovCisJICogaW4gb3JkZXIgZm9yIHRoZSB3cml0aW5nIHByb2Nlc3NlZCB0byBiZSBzdWNjZXNzZnVsCisJICovCiAJaWYgKChzd19pMmNfd3JpdGVfYnl0ZShhZGRyKSAhPSAwKSB8fAogCSAgICAoc3dfaTJjX3dyaXRlX2J5dGUocmVnKSAhPSAwKSB8fAogCSAgICAoc3dfaTJjX3dyaXRlX2J5dGUoZGF0YSkgIT0gMCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MC5jCmluZGV4IDZlZDAwNGUuLjdkOTBlMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTAuYwpAQCAtMTE3Niw3ICsxMTc2LDcgQEAKIAkJZWxzZSB7CiAJCQlzdHJjYXQodG1wLCBvcHQpOwogCQkJdG1wICs9IHN0cmxlbihvcHQpOwotCQkJaWYgKG9wdGlvbnMgIT0gTlVMTCkKKwkJCWlmIChvcHRpb25zKQogCQkJCSp0bXArKyA9ICc6JzsKIAkJCWVsc2UKIAkJCQkqdG1wKysgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTAuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmgKaW5kZXggOGU3MGNlMC4uZmYzMWM1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MC5oCkBAIC0xNDcsMTcgKzE0NywxNyBAQAogCWludCBkcG1zOwogCWludCBwYXRoczsKIAkvKiB3aGljaCBwYXRocyhzKSB0aGlzIG91dHB1dCBzdGFuZHMgZm9yLGZvciBzbTc1MDoKLQkgICBwYXRocz0xOm1lYW5zIG91dHB1dCBmb3IgcGFuZWwgcGF0aHMKLQkgICBwYXRocz0yOm1lYW5zIG91dHB1dCBmb3IgY3J0IHBhdGhzCi0JICAgcGF0aHM9MzptZWFucyBvdXRwdXQgZm9yIGJvdGggcGFuZWwgYW5kIGNydCBwYXRocwotCSovCisJICogcGF0aHM9MTptZWFucyBvdXRwdXQgZm9yIHBhbmVsIHBhdGhzCisJICogcGF0aHM9MjptZWFucyBvdXRwdXQgZm9yIGNydCBwYXRocworCSAqIHBhdGhzPTM6bWVhbnMgb3V0cHV0IGZvciBib3RoIHBhbmVsIGFuZCBjcnQgcGF0aHMKKwkgKi8KIAogCWludCAqY2hhbm5lbDsKIAkvKiB3aGljaCBjaGFubmVsIHRoZXNlIG91dHB1dHMgbGlua2VkIHdpdGgsZm9yIHNtNzUwOgotCSAgICpjaGFubmVsPTAgbWVhbnMgcHJpbWFyeSBjaGFubmVsCi0JICAgKmNoYW5uZWw9MSBtZWFucyBzZWNvbmRhcnkgY2hhbm5lbAotCSAgIG91dHB1dC0+Y2hhbm5lbCA9PT4gJmNydGMtPmNoYW5uZWwKLQkqLworCSAqICpjaGFubmVsPTAgbWVhbnMgcHJpbWFyeSBjaGFubmVsCisJICogKmNoYW5uZWw9MSBtZWFucyBzZWNvbmRhcnkgY2hhbm5lbAorCSAqIG91dHB1dC0+Y2hhbm5lbCA9PT4gJmNydGMtPmNoYW5uZWwKKwkgKi8KIAl2b2lkICpwcml2OwogCiAJaW50ICgqcHJvY19zZXRCTEFOSykoc3RydWN0IGx5bnhmYl9vdXRwdXQqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfYWNjZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2FjY2VsLmMKaW5kZXggOWFhNDA2Ni4uMzhhZGFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfYWNjZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9hY2NlbC5jCkBAIC02Nyw3ICs2Nyw4IEBACiAKIC8qIHNldDJkZm9ybWF0IG9ubHkgYmUgY2FsbGVkIGZyb20gc2V0bW9kZSBmdW5jdGlvbnMKICAqIGJ1dCBpZiB5b3UgbmVlZCBkdWFsIGZyYW1lYnVmZmVyIGRyaXZlcixuZWVkIGNhbGwgc2V0MmRmb3JtYXQKLSAqIGV2ZXJ5IHRpbWUgeW91IHVzZSAyZCBmdW5jdGlvbiAqLworICogZXZlcnkgdGltZSB5b3UgdXNlIDJkIGZ1bmN0aW9uCisgKi8KIAogdm9pZCBod19zZXQyZGZvcm1hdChzdHJ1Y3QgbHlueF9hY2NlbCAqYWNjZWwsIGludCBmbXQpCiB7CkBAIC05MCw3ICs5MSw4IEBACiAKIAlpZiAoYWNjZWwtPmRlX3dhaXQoKSAhPSAwKSB7CiAJCS8qIGludCB0aW1lIHdhaXQgYW5kIGFsd2F5cyBidXN5LHNlZW1zIGhhcmR3YXJlCi0JCSAqIGdvdCBzb21ldGhpbmcgZXJyb3IgKi8KKwkJICogZ290IHNvbWV0aGluZyBlcnJvcgorCQkgKi8KIAkJcHJfZGVidWcoIkRlIGVuZ2luZSBhbHdheXMgYnVzeVxuIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xNTIsMjQgKzE1NCwyNiBAQAogCQkvKiBEZXRlcm1pbmUgZGlyZWN0aW9uIG9mIG9wZXJhdGlvbiAqLwogCQlpZiAoc3kgPCBkeSkgewogCQkJLyogKy0tLS0tLS0tLS0rCi0JCQkgICB8UyAgICAgICAgIHwKLQkJCSAgIHwgICArLS0tLS0tLS0tLSsKLQkJCSAgIHwgICB8ICAgICAgfCAgIHwKLQkJCSAgIHwgICB8ICAgICAgfCAgIHwKLQkJCSAgICstLS18LS0tLS0tKyAgIHwKLQkJCSAgIHwgICAgICAgICBEfAotCQkJICAgKy0tLS0tLS0tLS0rICovCisJCQkgKiB8UyAgICAgICAgIHwKKwkJCSAqIHwgICArLS0tLS0tLS0tLSsKKwkJCSAqIHwgICB8ICAgICAgfCAgIHwKKwkJCSAqIHwgICB8ICAgICAgfCAgIHwKKwkJCSAqICstLS18LS0tLS0tKyAgIHwKKwkJCSAqIHwgICAgICAgICBEfAorCQkJICogKy0tLS0tLS0tLS0rCisJCQkgKi8KIAogCQkJbkRpcmVjdGlvbiA9IEJPVFRPTV9UT19UT1A7CiAJCX0gZWxzZSBpZiAoc3kgPiBkeSkgewogCQkJLyogKy0tLS0tLS0tLS0rCi0JCQkgICB8RCAgICAgICAgIHwKLQkJCSAgIHwgICArLS0tLS0tLS0tLSsKLQkJCSAgIHwgICB8ICAgICAgfCAgIHwKLQkJCSAgIHwgICB8ICAgICAgfCAgIHwKLQkJCSAgICstLS18LS0tLS0tKyAgIHwKLQkJCSAgIHwgICAgICAgICBTfAotCQkJICAgKy0tLS0tLS0tLS0rICovCisJCQkgKiB8RCAgICAgICAgIHwKKwkJCSAqIHwgICArLS0tLS0tLS0tLSsKKwkJCSAqIHwgICB8ICAgICAgfCAgIHwKKwkJCSAqIHwgICB8ICAgICAgfCAgIHwKKwkJCSAqICstLS18LS0tLS0tKyAgIHwKKwkJCSAqIHwgICAgICAgICBTfAorCQkJICogKy0tLS0tLS0tLS0rCisJCQkgKi8KIAogCQkJbkRpcmVjdGlvbiA9IFRPUF9UT19CT1RUT007CiAJCX0gZWxzZSB7CkBAIC0xNzcsMjIgKzE4MSwyNCBAQAogCiAJCQlpZiAoc3ggPD0gZHgpIHsKIAkJCQkvKiArLS0tLS0tKy0tLSstLS0tLS0rCi0JCQkJICAgfFMgICAgIHwgICB8ICAgICBEfAotCQkJCSAgIHwgICAgICB8ICAgfCAgICAgIHwKLQkJCQkgICB8ICAgICAgfCAgIHwgICAgICB8Ci0JCQkJICAgfCAgICAgIHwgICB8ICAgICAgfAotCQkJCSAgICstLS0tLS0rLS0tKy0tLS0tLSsgKi8KKwkJCQkgKiB8UyAgICAgfCAgIHwgICAgIER8CisJCQkJICogfCAgICAgIHwgICB8ICAgICAgfAorCQkJCSAqIHwgICAgICB8ICAgfCAgICAgIHwKKwkJCQkgKiB8ICAgICAgfCAgIHwgICAgICB8CisJCQkJICogKy0tLS0tLSstLS0rLS0tLS0tKworCQkJCSAqLwogCiAJCQkJbkRpcmVjdGlvbiA9IFJJR0hUX1RPX0xFRlQ7CiAJCQl9IGVsc2UgewogCQkJLyogc3ggPiBkeCAqLwogCiAJCQkJLyogKy0tLS0tLSstLS0rLS0tLS0tKwotCQkJCSAgIHxEICAgICB8ICAgfCAgICAgU3wKLQkJCQkgICB8ICAgICAgfCAgIHwgICAgICB8Ci0JCQkJICAgfCAgICAgIHwgICB8ICAgICAgfAotCQkJCSAgIHwgICAgICB8ICAgfCAgICAgIHwKLQkJCQkgICArLS0tLS0tKy0tLSstLS0tLS0rICovCisJCQkJICogfEQgICAgIHwgICB8ICAgICBTfAorCQkJCSAqIHwgICAgICB8ICAgfCAgICAgIHwKKwkJCQkgKiB8ICAgICAgfCAgIHwgICAgICB8CisJCQkJICogfCAgICAgIHwgICB8ICAgICAgfAorCQkJCSAqICstLS0tLS0rLS0tKy0tLS0tLSsKKwkJCQkgKi8KIAogCQkJCW5EaXJlY3Rpb24gPSBMRUZUX1RPX1JJR0hUOwogCQkJfQpAQCAtMjA4LDMyICsyMTQsMzYgQEAKIAl9CiAKIAkvKiBOb3RlOgotCSAgIERFX0ZPUkVHUk9VTkQgYXJlIERFX0JBQ0tHUk9VTkQgYXJlIGRvbid0IGNhcmUuCi0JICBERV9DT0xPUl9DT01QQVJFIGFuZCBERV9DT0xPUl9DT01QQVJFX01BS1MgYXJlIHNldCBieSBzZXQgZGVTZXRUcmFuc3BhcmVuY3koKS4KKwkgKiBERV9GT1JFR1JPVU5EIGFyZSBERV9CQUNLR1JPVU5EIGFyZSBkb24ndCBjYXJlLgorCSAqIERFX0NPTE9SX0NPTVBBUkUgYW5kIERFX0NPTE9SX0NPTVBBUkVfTUFLUworCSAqIGFyZSBzZXQgYnkgc2V0IGRlU2V0VHJhbnNwYXJlbmN5KCkuCiAJICovCiAKIAkvKiAyRCBTb3VyY2UgQmFzZS4KLQkgSXQgaXMgYW4gYWRkcmVzcyBvZmZzZXQgKDEyOCBiaXQgYWxpZ25lZCkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZyYW1lIGJ1ZmZlci4KKwkgKiBJdCBpcyBhbiBhZGRyZXNzIG9mZnNldCAoMTI4IGJpdCBhbGlnbmVkKQorCSAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmcmFtZSBidWZmZXIuCiAJICovCiAJd3JpdGVfZHByKGFjY2VsLCBERV9XSU5ET1dfU09VUkNFX0JBU0UsIHNCYXNlKTsgLyogZHByNDAgKi8KIAogCS8qIDJEIERlc3RpbmF0aW9uIEJhc2UuCi0JIEl0IGlzIGFuIGFkZHJlc3Mgb2Zmc2V0ICgxMjggYml0IGFsaWduZWQpIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmcmFtZSBidWZmZXIuCisJICogSXQgaXMgYW4gYWRkcmVzcyBvZmZzZXQgKDEyOCBiaXQgYWxpZ25lZCkKKwkgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZnJhbWUgYnVmZmVyLgogCSAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsIGRCYXNlKTsgLyogZHByNDQgKi8KIAogICAgIC8qIFByb2dyYW0gcGl0Y2ggKGRpc3RhbmNlIGJldHdlZW4gdGhlIDFzdCBwb2ludHMgb2YgdHdvIGFkamFjZW50IGxpbmVzKS4KLSAgICAgICBOb3RlIHRoYXQgaW5wdXQgcGl0Y2ggaXMgQllURSB2YWx1ZSwgYnV0IHRoZSAyRCBQaXRjaCByZWdpc3RlciB1c2VzCi0gICAgICAgcGl4ZWwgdmFsdWVzLiBOZWVkIEJ5dGUgdG8gcGl4ZWwgY29udmVyc2lvbi4KLSAgICAqLworICAgICAqIE5vdGUgdGhhdCBpbnB1dCBwaXRjaCBpcyBCWVRFIHZhbHVlLCBidXQgdGhlIDJEIFBpdGNoIHJlZ2lzdGVyIHVzZXMKKyAgICAgKiBwaXhlbCB2YWx1ZXMuIE5lZWQgQnl0ZSB0byBwaXhlbCBjb252ZXJzaW9uLgorICAgICAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfUElUQ0gsCiAJCSAgKChkUGl0Y2ggLyBCcHAgPDwgREVfUElUQ0hfREVTVElOQVRJT05fU0hJRlQpICYKIAkJICAgREVfUElUQ0hfREVTVElOQVRJT05fTUFTSykgfAogCQkgIChzUGl0Y2ggLyBCcHAgJiBERV9QSVRDSF9TT1VSQ0VfTUFTSykpOyAvKiBkcHIxMCAqLwogCiAgICAgLyogU2NyZWVuIFdpbmRvdyB3aWR0aCBpbiBQaXhlbHMuCi0gICAgICAgMkQgZW5naW5lIHVzZXMgdGhpcyB2YWx1ZSB0byBjYWxjdWxhdGUgdGhlIGxpbmVhciBhZGRyZXNzIGluIGZyYW1lIGJ1ZmZlciBmb3IgYSBnaXZlbiBwb2ludC4KLSAgICAqLworICAgICAqIDJEIGVuZ2luZSB1c2VzIHRoaXMgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBsaW5lYXIgYWRkcmVzcyBpbiBmcmFtZSBidWZmZXIKKyAgICAgKiBmb3IgYSBnaXZlbiBwb2ludC4KKyAgICAgKi8KIAl3cml0ZV9kcHIoYWNjZWwsIERFX1dJTkRPV19XSURUSCwKIAkJICAoKGRQaXRjaCAvIEJwcCA8PCBERV9XSU5ET1dfV0lEVEhfRFNUX1NISUZUKSAmCiAJCSAgIERFX1dJTkRPV19XSURUSF9EU1RfTUFTSykgfApAQCAtMzA3LDMzICszMTcsMzcgQEAKIAkJcmV0dXJuIC0xOwogCiAJLyogMkQgU291cmNlIEJhc2UuCi0JIFVzZSAwIGZvciBIT1NUIEJsdC4KKwkgKiBVc2UgMCBmb3IgSE9TVCBCbHQuCiAJICovCiAJd3JpdGVfZHByKGFjY2VsLCBERV9XSU5ET1dfU09VUkNFX0JBU0UsIDApOwogCiAJLyogMkQgRGVzdGluYXRpb24gQmFzZS4KLQkgSXQgaXMgYW4gYWRkcmVzcyBvZmZzZXQgKDEyOCBiaXQgYWxpZ25lZCkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZyYW1lIGJ1ZmZlci4KKwkgKiBJdCBpcyBhbiBhZGRyZXNzIG9mZnNldCAoMTI4IGJpdCBhbGlnbmVkKQorCSAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmcmFtZSBidWZmZXIuCiAJICovCiAJd3JpdGVfZHByKGFjY2VsLCBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRSwgZEJhc2UpOwogICAgIC8qIFByb2dyYW0gcGl0Y2ggKGRpc3RhbmNlIGJldHdlZW4gdGhlIDFzdCBwb2ludHMgb2YgdHdvIGFkamFjZW50IGxpbmVzKS4KLSAgICAgICBOb3RlIHRoYXQgaW5wdXQgcGl0Y2ggaXMgQllURSB2YWx1ZSwgYnV0IHRoZSAyRCBQaXRjaCByZWdpc3RlciB1c2VzCi0gICAgICAgcGl4ZWwgdmFsdWVzLiBOZWVkIEJ5dGUgdG8gcGl4ZWwgY29udmVyc2lvbi4KLSAgICAqLworICAgICAqIE5vdGUgdGhhdCBpbnB1dCBwaXRjaCBpcyBCWVRFIHZhbHVlLCBidXQgdGhlIDJEIFBpdGNoIHJlZ2lzdGVyIHVzZXMKKyAgICAgKiBwaXhlbCB2YWx1ZXMuIE5lZWQgQnl0ZSB0byBwaXhlbCBjb252ZXJzaW9uLgorICAgICAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfUElUQ0gsCiAJCSAgKChkUGl0Y2ggLyBieXRlUGVyUGl4ZWwgPDwgREVfUElUQ0hfREVTVElOQVRJT05fU0hJRlQpICYKIAkJICAgREVfUElUQ0hfREVTVElOQVRJT05fTUFTSykgfAogCQkgIChkUGl0Y2ggLyBieXRlUGVyUGl4ZWwgJiBERV9QSVRDSF9TT1VSQ0VfTUFTSykpOyAvKiBkcHIxMCAqLwogCiAJLyogU2NyZWVuIFdpbmRvdyB3aWR0aCBpbiBQaXhlbHMuCi0JIDJEIGVuZ2luZSB1c2VzIHRoaXMgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBsaW5lYXIgYWRkcmVzcyBpbiBmcmFtZSBidWZmZXIgZm9yIGEgZ2l2ZW4gcG9pbnQuCisJICogMkQgZW5naW5lIHVzZXMgdGhpcyB2YWx1ZSB0byBjYWxjdWxhdGUgdGhlIGxpbmVhciBhZGRyZXNzCisJICogaW4gZnJhbWUgYnVmZmVyIGZvciBhIGdpdmVuIHBvaW50LgogCSAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfV0lORE9XX1dJRFRILAogCQkgICgoZFBpdGNoIC8gYnl0ZVBlclBpeGVsIDw8IERFX1dJTkRPV19XSURUSF9EU1RfU0hJRlQpICYKIAkJICAgREVfV0lORE9XX1dJRFRIX0RTVF9NQVNLKSB8CiAJCSAgKGRQaXRjaCAvIGJ5dGVQZXJQaXhlbCAmIERFX1dJTkRPV19XSURUSF9TUkNfTUFTSykpOwogCi0JIC8qIE5vdGU6IEZvciAyRCBTb3VyY2UgaW4gSG9zdCBXcml0ZSwgb25seSBYX0sxX01PTk8gZmllbGQgaXMgbmVlZGVkLCBhbmQgWV9LMiBmaWVsZCBpcyBub3QgdXNlZC4KLQkgICAgRm9yIG1vbm8gYml0bWFwLCB1c2Ugc3RhcnRCaXQgZm9yIFhfSzEuICovCisJIC8qIE5vdGU6IEZvciAyRCBTb3VyY2UgaW4gSG9zdCBXcml0ZSwgb25seSBYX0sxX01PTk8gZmllbGQgaXMgbmVlZGVkLAorCSAgKiBhbmQgWV9LMiBmaWVsZCBpcyBub3QgdXNlZC4KKwkgICogRm9yIG1vbm8gYml0bWFwLCB1c2Ugc3RhcnRCaXQgZm9yIFhfSzEuCisJICAqLwogCXdyaXRlX2RwcihhY2NlbCwgREVfU09VUkNFLAogCQkgIChzdGFydEJpdCA8PCBERV9TT1VSQ0VfWF9LMV9TSElGVCkgJgogCQkgIERFX1NPVVJDRV9YX0sxX01PTk9fTUFTSyk7IC8qIGRwcjAwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9ody5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfaHcuYwppbmRleCAyZGFlZWRkLi43ZGQyMDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9ody5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2h3LmMKQEAgLTM1LDE3ICszNSwxNyBAQAogCXByX2luZm8oIm1taW8gcGh5QWRkciA9ICVseFxuIiwgc203NTBfZGV2LT52aWRyZWdfc3RhcnQpOwogCiAJLyogcmVzZXJ2ZSB0aGUgdmlkcmVnIHNwYWNlIG9mIHNtaSBhZGFwdG9yCi0JICogaWYgeW91IGRvIHRoaXMsIHUgbmVlZCB0byBhZGQgcmVsZWFzZSByZWdpb24gY29kZQorCSAqIGlmIHlvdSBkbyB0aGlzLCB5b3UgbmVlZCB0byBhZGQgcmVsZWFzZSByZWdpb24gY29kZQogCSAqIGluIGx5bnhmYl9yZW1vdmUsIG9yIG1lbW9yeSB3aWxsIG5vdCBiZSBtYXBwZWQgYWdhaW4KIAkgKiBzdWNjZXNzZnVsbHkKLQkgKiAqLworCSAqLwogCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCAxLCAic203NTBmYiIpOwogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCJDYW4gbm90IHJlcXVlc3QgUENJIHJlZ2lvbnMuXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAotCS8qIG5vdyBtYXAgbW1pbyBhbmQgdmlkbWVtKi8KKwkvKiBub3cgbWFwIG1taW8gYW5kIHZpZG1lbSAqLwogCXNtNzUwX2Rldi0+cHZSZWcgPSBpb3JlbWFwX25vY2FjaGUoc203NTBfZGV2LT52aWRyZWdfc3RhcnQsCiAJCQkJCSAgIHNtNzUwX2Rldi0+dmlkcmVnX3NpemUpOwogCWlmICghc203NTBfZGV2LT5wdlJlZykgewpAQCAtNTYsNyArNTYsNiBAQAogCQlwcl9pbmZvKCJtbWlvIHZpcnR1YWwgYWRkciA9ICVwXG4iLCBzbTc1MF9kZXYtPnB2UmVnKTsKIAl9CiAKLQogCXNtNzUwX2Rldi0+YWNjZWwuZHByQmFzZSA9IHNtNzUwX2Rldi0+cHZSZWcgKyBERV9CQVNFX0FERFJfVFlQRTE7CiAJc203NTBfZGV2LT5hY2NlbC5kcFBvcnRCYXNlID0gc203NTBfZGV2LT5wdlJlZyArIERFX1BPUlRfQUREUl9UWVBFMTsKIApAQCAtNjQsMTAgKzYzLDEwIEBACiAKIAlzbTc1MF9kZXYtPnZpZG1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKIAkvKiBkb24ndCB1c2UgcGRldl9yZXNvdXJjZVt4XS5lbmQgLSByZXNvdXJjZVt4XS5zdGFydCB0bwotCSAqIGNhbGN1bGF0ZSB0aGUgcmVzb3VyY2Ugc2l6ZSxpdHMgb25seSB0aGUgbWF4aW11bSBhdmFpbGFibGUKLQkgKiBzaXplIGJ1dCBub3QgdGhlIGFjdHVhbCBzaXplLHVzZQorCSAqIGNhbGN1bGF0ZSB0aGUgcmVzb3VyY2Ugc2l6ZSwgaXQncyBvbmx5IHRoZSBtYXhpbXVtIGF2YWlsYWJsZQorCSAqIHNpemUgYnV0IG5vdCB0aGUgYWN0dWFsIHNpemUsIHVzaW5nCiAJICogQGRkazc1MF9nZXRWTVNpemUgZnVuY3Rpb24gY2FuIGJlIHNhZmUuCi0JICogKi8KKwkgKi8KIAlzbTc1MF9kZXYtPnZpZG1lbV9zaXplID0gZGRrNzUwX2dldFZNU2l6ZSgpOwogCXByX2luZm8oInZpZGVvIG1lbW9yeSBwaHlBZGRyID0gJWx4LCBzaXplID0gJXUgYnl0ZXNcbiIsCiAJCXNtNzUwX2Rldi0+dmlkbWVtX3N0YXJ0LCBzbTc1MF9kZXYtPnZpZG1lbV9zaXplKTsKQEAgLTg2LDMzICs4NSwzMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLQotCiBpbnQgaHdfc203NTBfaW5pdGh3KHN0cnVjdCBzbTc1MF9kZXYgKnNtNzUwX2Rldiwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGluaXRfc3RhdHVzICpwYXJtOwogCiAJcGFybSA9ICZzbTc1MF9kZXYtPmluaXRQYXJtOwogCWlmIChwYXJtLT5jaGlwX2NsayA9PSAwKQotCQlwYXJtLT5jaGlwX2NsayA9IChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpID8KKwkJcGFybS0+Y2hpcF9jbGsgPSAoc203NTBfZ2V0X2NoaXBfdHlwZSgpID09IFNNNzUwTEUpID8KIAkJCQkJCURFRkFVTFRfU003NTBMRV9DSElQX0NMT0NLIDoKIAkJCQkJCURFRkFVTFRfU003NTBfQ0hJUF9DTE9DSzsKIAogCWlmIChwYXJtLT5tZW1fY2xrID09IDApCiAJCXBhcm0tPm1lbV9jbGsgPSBwYXJtLT5jaGlwX2NsazsKIAlpZiAocGFybS0+bWFzdGVyX2NsayA9PSAwKQotCQlwYXJtLT5tYXN0ZXJfY2xrID0gcGFybS0+Y2hpcF9jbGsvMzsKKwkJcGFybS0+bWFzdGVyX2NsayA9IHBhcm0tPmNoaXBfY2xrIC8gMzsKIAogCWRkazc1MF9pbml0SHcoKGluaXRjaGlwX3BhcmFtX3QgKikmc203NTBfZGV2LT5pbml0UGFybSk7Ci0JLyogZm9yIHNtNzE4LG9wZW4gcGNpIGJ1cnN0ICovCisJLyogZm9yIHNtNzE4LCBvcGVuIHBjaSBidXJzdCAqLwogCWlmIChzbTc1MF9kZXYtPmRldmlkID09IDB4NzE4KSB7CiAJCVBPS0UzMihTWVNURU1fQ1RSTCwKIAkJICAgICAgIFBFRUszMihTWVNURU1fQ1RSTCkgfCBTWVNURU1fQ1RSTF9QQ0lfQlVSU1QpOwogCX0KIAotCWlmIChnZXRDaGlwVHlwZSgpICE9IFNNNzUwTEUpIHsKKwlpZiAoc203NTBfZ2V0X2NoaXBfdHlwZSgpICE9IFNNNzUwTEUpIHsKIAkJdW5zaWduZWQgaW50IHZhbDsKLQkJLyogZG9lcyB1c2VyIG5lZWQgQ1JUID8qLworCQkvKiBkb2VzIHVzZXIgbmVlZCBDUlQ/ICovCiAJCWlmIChzbTc1MF9kZXYtPm5vY3J0KSB7CiAJCQlQT0tFMzIoTUlTQ19DVFJMLAogCQkJICAgICAgIFBFRUszMihNSVNDX0NUUkwpIHwgTUlTQ19DVFJMX0RBQ19QT1dFUl9PRkYpOwpAQCAtMTQ0LDE5ICsxNDEsMjEgQEAKIAkJfQogCQlQT0tFMzIoUEFORUxfRElTUExBWV9DVFJMLCB2YWwpOwogCX0gZWxzZSB7Ci0JCS8qIGZvciA3NTBMRSAsbm8gRFZJIGNoaXAgaW5pdGlhbGl6YXRpb24gbWFrZXMgTW9uaXRvciBubyBzaWduYWwgKi8KLQkJLyogU2V0IHVwIEdQSU8gZm9yIHNvZnR3YXJlIEkyQyB0byBwcm9ncmFtIERWSSBjaGlwIGluIHRoZQotCQkgICBYaWxpbnggU1A2MDUgYm9hcmQsIGluIG9yZGVyIHRvIGhhdmUgdmlkZW8gc2lnbmFsLgorCQkvKiBmb3IgNzUwTEUsIG5vIERWSSBjaGlwIGluaXRpYWxpemF0aW9uCisJCSAqIG1ha2VzIE1vbml0b3Igbm8gc2lnbmFsCisJCSAqCisJCSAqIFNldCB1cCBHUElPIGZvciBzb2Z0d2FyZSBJMkMgdG8gcHJvZ3JhbSBEVkkgY2hpcCBpbiB0aGUKKwkJICogWGlsaW54IFNQNjA1IGJvYXJkLCBpbiBvcmRlciB0byBoYXZlIHZpZGVvIHNpZ25hbC4KIAkJICovCiAJCXNtNzUwX3N3X2kyY19pbml0KDAsIDEpOwogCiAJCS8qIEN1c3RvbWVyIG1heSBOT1QgdXNlIENINzMwMSBEVkkgY2hpcCwgd2hpY2ggaGFzIHRvIGJlCi0JCWluaXRpYWxpemVkIGRpZmZlcmVudGx5LgotCQkqLworCQkgKiBpbml0aWFsaXplZCBkaWZmZXJlbnRseS4KKwkJICovCiAJCWlmIChzbTc1MF9zd19pMmNfcmVhZF9yZWcoMHhlYywgMHg0YSkgPT0gMHg5NSkgewogCQkvKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVyIHZhbHVlcyBmb3IgQ0g3MzAxIGFyZSBmcm9tCi0JCSAgIENocm9udGVsIGFwcCBub3RlIGFuZCBvdXIgZXhwZXJpbWVudC4KLQkJKi8KKwkJICogQ2hyb250ZWwgYXBwIG5vdGUgYW5kIG91ciBleHBlcmltZW50LgorCQkgKi8KIAkJCXByX2luZm8oInllcyxDSDczMDEgRFZJIGNoaXAgZm91bmRcbiIpOwogCQkJc203NTBfc3dfaTJjX3dyaXRlX3JlZygweGVjLCAweDFkLCAweDE2KTsKIAkJCXNtNzUwX3N3X2kyY193cml0ZV9yZWcoMHhlYywgMHgyMSwgMHg5KTsKQEAgLTE3Myw3ICsxNzIsOCBAQAogfQogCiBpbnQgaHdfc203NTBfb3V0cHV0X3NldE1vZGUoc3RydWN0IGx5bnhmYl9vdXRwdXQgKm91dHB1dCwKLQkJCQkJCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCkKKwkJCSAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCkKIHsKIAlpbnQgcmV0OwogCWRpc3Bfb3V0cHV0X3QgZGlzcFNldDsKQEAgLTE4Myw4ICsxODMsNyBAQAogCWRpc3BTZXQgPSAwOwogCWNoYW5uZWwgPSAqb3V0cHV0LT5jaGFubmVsOwogCi0KLQlpZiAoZ2V0Q2hpcFR5cGUoKSAhPSBTTTc1MExFKSB7CisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSAhPSBTTTc1MExFKSB7CiAJCWlmIChjaGFubmVsID09IHNtNzUwX3ByaW1hcnkpIHsKIAkJCXByX2luZm8oInByaW1hcnkgY2hhbm5lbFxuIik7CiAJCQlpZiAob3V0cHV0LT5wYXRocyAmIHNtNzUwX3BhbmVsKQpAQCAtMTk4LDExICsxOTcsMTAgQEAKIAkJCQlkaXNwU2V0IHw9IGRvX0xDRDFfU0VDOwogCQkJaWYgKG91dHB1dC0+cGF0aHMgJiBzbTc1MF9jcnQpCiAJCQkJZGlzcFNldCB8PSBkb19DUlRfU0VDOwotCiAJCX0KIAkJZGRrNzUwX3NldExvZ2ljYWxEaXNwT3V0KGRpc3BTZXQpOwogCX0gZWxzZSB7Ci0JCS8qIGp1c3Qgb3BlbiBESVNQTEFZX0NPTlRST0xfNzUwTEUgcmVnaXN0ZXIgYml0IDM6MCovCisJCS8qIGp1c3Qgb3BlbiBESVNQTEFZX0NPTlRST0xfNzUwTEUgcmVnaXN0ZXIgYml0IDM6MCAqLwogCQl1MzIgcmVnOwogCiAJCXJlZyA9IFBFRUszMihESVNQTEFZX0NPTlRST0xfNzUwTEUpOwpAQCAtMjE0LDcgKzIxMiw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGh3X3NtNzUwX2NydGNfY2hlY2tNb2RlKHN0cnVjdCBseW54ZmJfY3J0YyAqY3J0Yywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCitpbnQgaHdfc203NTBfY3J0Y19jaGVja01vZGUoc3RydWN0IGx5bnhmYl9jcnRjICpjcnRjLAorCQkJICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewogCXN0cnVjdCBzbTc1MF9kZXYgKnNtNzUwX2RldjsKIAlzdHJ1Y3QgbHlueGZiX3BhciAqcGFyID0gY29udGFpbmVyX29mKGNydGMsIHN0cnVjdCBseW54ZmJfcGFyLCBjcnRjKTsKQEAgLTIzMywxOSArMjMyLDE1IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwotCiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLQotLyoKLQlzZXQgdGhlIGNvbnRyb2xsZXIncyBtb2RlIGZvciBAY3J0YyBjaGFyZ2VkIHdpdGggQHZhciBhbmQgQGZpeCBwYXJhbWV0ZXJzCi0qLworLyogc2V0IHRoZSBjb250cm9sbGVyJ3MgbW9kZSBmb3IgQGNydGMgY2hhcmdlZCB3aXRoIEB2YXIgYW5kIEBmaXggcGFyYW1ldGVycyAqLwogaW50IGh3X3NtNzUwX2NydGNfc2V0TW9kZShzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGMsCi0JCQkJCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCQkJCQkJCQlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCkKKwkJCSAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4KQogewogCWludCByZXQsIGZtdDsKIAl1MzIgcmVnOwpAQCAtMjU0LDcgKzI0OSw2IEBACiAJc3RydWN0IHNtNzUwX2RldiAqc203NTBfZGV2OwogCXN0cnVjdCBseW54ZmJfcGFyICpwYXI7CiAKLQogCXJldCA9IDA7CiAJcGFyID0gY29udGFpbmVyX29mKGNydGMsIHN0cnVjdCBseW54ZmJfcGFyLCBjcnRjKTsKIAlzbTc1MF9kZXYgPSBwYXItPmRldjsKQEAgLTI3OCwxNyArMjcyLDIyIEBACiAKIAkvKiBzZXQgdGltaW5nICovCiAJbW9kcGFybS5waXhlbF9jbG9jayA9IHBzX3RvX2h6KHZhci0+cGl4Y2xvY2spOwotCW1vZHBhcm0udmVydGljYWxfc3luY19wb2xhcml0eSA9ICh2YXItPnN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkgPyBQT1M6TkVHOwotCW1vZHBhcm0uaG9yaXpvbnRhbF9zeW5jX3BvbGFyaXR5ID0gKHZhci0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkgPyBQT1M6TkVHOwotCW1vZHBhcm0uY2xvY2tfcGhhc2VfcG9sYXJpdHkgPSAodmFyLT5zeW5jICYgRkJfU1lOQ19DT01QX0hJR0hfQUNUKSA/IFBPUzpORUc7CisJbW9kcGFybS52ZXJ0aWNhbF9zeW5jX3BvbGFyaXR5ID0gKHZhci0+c3luYyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUKQorCQkJCQkgPyBQT1MgOiBORUc7CisJbW9kcGFybS5ob3Jpem9udGFsX3N5bmNfcG9sYXJpdHkgPSAodmFyLT5zeW5jICYgRkJfU1lOQ19WRVJUX0hJR0hfQUNUKQorCQkJCQkgICA/IFBPUyA6IE5FRzsKKwltb2RwYXJtLmNsb2NrX3BoYXNlX3BvbGFyaXR5ID0gKHZhci0+c3luYyAmIEZCX1NZTkNfQ09NUF9ISUdIX0FDVCkKKwkJCQkgICAgICAgPyBQT1MgOiBORUc7CiAJbW9kcGFybS5ob3Jpem9udGFsX2Rpc3BsYXlfZW5kID0gdmFyLT54cmVzOwogCW1vZHBhcm0uaG9yaXpvbnRhbF9zeW5jX3dpZHRoID0gdmFyLT5oc3luY19sZW47CiAJbW9kcGFybS5ob3Jpem9udGFsX3N5bmNfc3RhcnQgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbjsKLQltb2RwYXJtLmhvcml6b250YWxfdG90YWwgPSB2YXItPnhyZXMgKyB2YXItPmxlZnRfbWFyZ2luICsgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbjsKKwltb2RwYXJtLmhvcml6b250YWxfdG90YWwgPSB2YXItPnhyZXMgKyB2YXItPmxlZnRfbWFyZ2luICsKKwkJCQkgICB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuOwogCW1vZHBhcm0udmVydGljYWxfZGlzcGxheV9lbmQgPSB2YXItPnlyZXM7CiAJbW9kcGFybS52ZXJ0aWNhbF9zeW5jX2hlaWdodCA9IHZhci0+dnN5bmNfbGVuOwogCW1vZHBhcm0udmVydGljYWxfc3luY19zdGFydCA9IHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luOwotCW1vZHBhcm0udmVydGljYWxfdG90YWwgPSB2YXItPnlyZXMgKyB2YXItPnVwcGVyX21hcmdpbiArIHZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW47CisJbW9kcGFybS52ZXJ0aWNhbF90b3RhbCA9IHZhci0+eXJlcyArIHZhci0+dXBwZXJfbWFyZ2luICsKKwkJCQkgdmFyLT5sb3dlcl9tYXJnaW4gKyB2YXItPnZzeW5jX2xlbjsKIAogCS8qIGNob29zZSBwbGwgKi8KIAlpZiAoY3J0Yy0+Y2hhbm5lbCAhPSBzbTc1MF9zZWNvbmRhcnkpCkBAIC0zMDQsMTIgKzMwMywxNCBAQAogCX0KIAogCWlmIChjcnRjLT5jaGFubmVsICE9IHNtNzUwX3NlY29uZGFyeSkgewotCQkvKiBzZXQgcGl0Y2gsIG9mZnNldCAsd2lkdGgsc3RhcnQgYWRkcmVzcyAsZXRjLi4uICovCisJCS8qIHNldCBwaXRjaCwgb2Zmc2V0LCB3aWR0aCwgc3RhcnQgYWRkcmVzcywgZXRjLi4uICovCiAJCVBPS0UzMihQQU5FTF9GQl9BRERSRVNTLAogCQkgICAgICAgY3J0Yy0+b1NjcmVlbiAmIFBBTkVMX0ZCX0FERFJFU1NfQUREUkVTU19NQVNLKTsKIAogCQlyZWcgPSB2YXItPnhyZXMgKiAodmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKTsKLQkJLyogY3J0Yy0+Y2hhbm5lbCBpcyBub3QgZXF1YWwgdG8gcGFyLT5pbmRleCBvbiBudW1lcmljLGJlIGF3YXJlIG9mIHRoYXQgKi8KKwkJLyogY3J0Yy0+Y2hhbm5lbCBpcyBub3QgZXF1YWwgdG8gcGFyLT5pbmRleCBvbiBudW1lcmljLAorCQkgKiBiZSBhd2FyZSBvZiB0aGF0CisJCSAqLwogCQlyZWcgPSBBTElHTihyZWcsIGNydGMtPmxpbmVfcGFkKTsKIAkJcmVnID0gKHJlZyA8PCBQQU5FTF9GQl9XSURUSF9XSURUSF9TSElGVCkgJgogCQkgICAgICAgUEFORUxfRkJfV0lEVEhfV0lEVEhfTUFTSzsKQEAgLTMyMSw4ICszMjIsOCBAQAogCQlyZWcgfD0gKHZhci0+eG9mZnNldCAmIFBBTkVMX1dJTkRPV19XSURUSF9YX01BU0spOwogCQlQT0tFMzIoUEFORUxfV0lORE9XX1dJRFRILCByZWcpOwogCi0JCXJlZyA9ICgodmFyLT55cmVzX3ZpcnR1YWwgLSAxKSA8PAotCQkgICAgICAgUEFORUxfV0lORE9XX0hFSUdIVF9IRUlHSFRfU0hJRlQpOworCQlyZWcgPSAodmFyLT55cmVzX3ZpcnR1YWwgLSAxKSA8PAorCQkgICAgICBQQU5FTF9XSU5ET1dfSEVJR0hUX0hFSUdIVF9TSElGVDsKIAkJcmVnICY9IFBBTkVMX1dJTkRPV19IRUlHSFRfSEVJR0hUX01BU0s7CiAJCXJlZyB8PSAodmFyLT55b2Zmc2V0ICYgUEFORUxfV0lORE9XX0hFSUdIVF9ZX01BU0spOwogCQlQT0tFMzIoUEFORUxfV0lORE9XX0hFSUdIVCwgcmVnKTsKQEAgLTM0MSw3ICszNDIsOSBAQAogCQkvKiBub3QgaW1wbGVtZW50ZWQgbm93ICovCiAJCVBPS0UzMihDUlRfRkJfQUREUkVTUywgY3J0Yy0+b1NjcmVlbik7CiAJCXJlZyA9IHZhci0+eHJlcyAqICh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpOwotCQkvKiBjcnRjLT5jaGFubmVsIGlzIG5vdCBlcXVhbCB0byBwYXItPmluZGV4IG9uIG51bWVyaWMsYmUgYXdhcmUgb2YgdGhhdCAqLworCQkvKiBjcnRjLT5jaGFubmVsIGlzIG5vdCBlcXVhbCB0byBwYXItPmluZGV4IG9uIG51bWVyaWMsCisJCSAqIGJlIGF3YXJlIG9mIHRoYXQKKwkJICovCiAJCXJlZyA9IEFMSUdOKHJlZywgY3J0Yy0+bGluZV9wYWQpIDw8IENSVF9GQl9XSURUSF9XSURUSF9TSElGVDsKIAkJcmVnICY9IENSVF9GQl9XSURUSF9XSURUSF9NQVNLOwogCQlyZWcgfD0gKGZpeC0+bGluZV9sZW5ndGggJiBDUlRfRkJfV0lEVEhfT0ZGU0VUX01BU0spOwpAQCAtMzUyLDIwICszNTUsMTkgQEAKIAkJcmVnIHw9ICgodmFyLT5iaXRzX3Blcl9waXhlbCA+PiA0KSAmCiAJCQlDUlRfRElTUExBWV9DVFJMX0ZPUk1BVF9NQVNLKTsKIAkJUE9LRTMyKENSVF9ESVNQTEFZX0NUUkwsIHJlZyk7Ci0KIAl9CiAKLQogZXhpdDoKIAlyZXR1cm4gcmV0OwogfQogCiBpbnQgaHdfc203NTBfc2V0Q29sUmVnKHN0cnVjdCBseW54ZmJfY3J0YyAqY3J0YywgdXNob3J0IGluZGV4LAotCQkJCQkJCQl1c2hvcnQgcmVkLCB1c2hvcnQgZ3JlZW4sIHVzaG9ydCBibHVlKQorCQkgICAgICAgdXNob3J0IHJlZCwgdXNob3J0IGdyZWVuLCB1c2hvcnQgYmx1ZSkKIHsKIAlzdGF0aWMgdW5zaWduZWQgaW50IGFkZFtdID0ge1BBTkVMX1BBTEVUVEVfUkFNLCBDUlRfUEFMRVRURV9SQU19OwogCi0JUE9LRTMyKGFkZFtjcnRjLT5jaGFubmVsXSArIGluZGV4KjQsIChyZWQ8PDE2KXwoZ3JlZW48PDgpfGJsdWUpOworCVBPS0UzMihhZGRbY3J0Yy0+Y2hhbm5lbF0gKyBpbmRleCAqIDQsCisJICAgICAgIChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxNCw3ICs0MTYsOSBAQAogewogCXVuc2lnbmVkIGludCBkcG1zLCBwcHMsIGNydGRiOwogCi0JZHBtcyA9IHBwcyA9IGNydGRiID0gMDsKKwlkcG1zID0gMDsKKwlwcHMgPSAwOworCWNydGRiID0gMDsKIAogCXN3aXRjaCAoYmxhbmspIHsKIAljYXNlIEZCX0JMQU5LX1VOQkxBTks6CkBAIC00NjEsMTQgKzQ2NSwxMyBAQAogCXJldHVybiAwOwogfQogCi0KIHZvaWQgaHdfc203NTBfaW5pdEFjY2VsKHN0cnVjdCBzbTc1MF9kZXYgKnNtNzUwX2RldikKIHsKIAl1MzIgcmVnOwogCiAJZW5hYmxlMkRFbmdpbmUoMSk7CiAKLQlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKSB7CisJaWYgKHNtNzUwX2dldF9jaGlwX3R5cGUoKSA9PSBTTTc1MExFKSB7CiAJCXJlZyA9IFBFRUszMihERV9TVEFURTEpOwogCQlyZWcgfD0gREVfU1RBVEUxX0RFX0FCT1JUOwogCQlQT0tFMzIoREVfU1RBVEUxLCByZWcpOwpAQCAtNTA5LDcgKzUxMiw2IEBACiAJcmV0dXJuIC0xOwogfQogCi0KIGludCBod19zbTc1MF9kZVdhaXQodm9pZCkKIHsKIAlpbnQgaSA9IDB4MTAwMDAwMDA7CkBAIC01MjksMTAgKzUzMSwxMCBAQAogfQogCiBpbnQgaHdfc203NTBfcGFuX2Rpc3BsYXkoc3RydWN0IGx5bnhmYl9jcnRjICpjcnRjLAotCWNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAotCWNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvKQorCQkJIGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJIGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvKQogewotCXVpbnQzMl90IHRvdGFsOworCXUzMiB0b3RhbDsKIAkvKiBjaGVjayBwYXJhbXMgKi8KIAlpZiAoKHZhci0+eG9mZnNldCArIHZhci0+eHJlcyA+IHZhci0+eHJlc192aXJ0dWFsKSB8fAogCSAgICAodmFyLT55b2Zmc2V0ICsgdmFyLT55cmVzID4gdmFyLT55cmVzX3ZpcnR1YWwpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9kZXZzeW50aC5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvZGV2c3ludGguYwppbmRleCA4NDk4OTcxLi41OGFiZDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9kZXZzeW50aC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2RldnN5bnRoLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAkJc3ludGhfd3JpdGUoYnVmLCBieXRlcyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywgZmxhZ3MpOwogCX0KLQlyZXR1cm4gKHNzaXplX3QpIG5ieXRlczsKKwlyZXR1cm4gKHNzaXplX3QpbmJ5dGVzOwogfQogCiBzdGF0aWMgc3NpemVfdCBzcGVha3VwX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZnAsIGNoYXIgX191c2VyICpidWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9rb2JqZWN0cy5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAva29iamVjdHMuYwppbmRleCA1MjhjYmRjLi5lNzQ0YWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9rb2JqZWN0cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2tvYmplY3RzLmMKQEAgLTI1MSw3ICsyNTEsNyBAQAogCX0KIAljcCArPSBzcHJpbnRmKGNwLCAiMCwgJWRcbiIsIEtFWV9NQVBfVkVSKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gKGludCkoY3AtYnVmKTsKKwlyZXR1cm4gKGludCkoY3AgLSBidWYpOwogfQogCiAvKgpAQCAtMjg4LDggKzI4OCw4IEBACiAJCWNwID0gc3BrX3MydWNoYXIoY3AsIGNwMSk7CiAJCWNwMSsrOwogCX0KLQlpID0gKGludCljcDFbLTJdKzE7Ci0JaSAqPSAoaW50KWNwMVstMV0rMTsKKwlpID0gKGludCljcDFbLTJdICsgMTsKKwlpICo9IChpbnQpY3AxWy0xXSArIDE7CiAJaSArPSAyOyAvKiAwIGFuZCBsYXN0IG1hcCB2ZXIgKi8KIAlpZiAoY3AxWy0zXSAhPSBLRVlfTUFQX1ZFUiB8fCBjcDFbLTFdID4gMTAgfHwKIAkJCWkrU0hJRlRfVEJMX1NJWkUrNCA+PSBzaXplb2Yoc3BrX2tleV9idWYpKSB7CkBAIC0zNTAsOSArMzUwLDkgQEAKIAl9IGVsc2UgewogCQlzaHV0ID0gMDsKIAl9Ci0JaWYgKGNoJjQpCisJaWYgKGNoICYgNCkKIAkJc2h1dCB8PSAweDQwOwotCWlmIChjaCYxKQorCWlmIChjaCAmIDEpCiAJCXNwa19zaHV0X3VwIHw9IHNodXQ7CiAJZWxzZQogCQlzcGtfc2h1dF91cCAmPSB+c2h1dDsKQEAgLTQxMSwxMSArNDExLDEzIEBACiAJaW50IGxlbjsKIAlpbnQgYnl0ZXM7CiAJY29uc3QgY2hhciAqcHRyID0gYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIXN5bnRoKQogCQlyZXR1cm4gLUVQRVJNOwogCiAJbGVuID0gc3RybGVuKGJ1Zik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywgZmxhZ3MpOwogCXdoaWxlIChsZW4gPiAwKSB7CiAJCWJ5dGVzID0gbWluX3Qoc2l6ZV90LCBsZW4sIDI1MCk7CiAJCXN0cm5jcHkodG1wLCBwdHIsIGJ5dGVzKTsKQEAgLTQyNSw2ICs0MjcsNyBAQAogCQlwdHIgKz0gYnl0ZXM7CiAJCWxlbiAtPSBieXRlczsKIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC05NzMsMTEgKzk3NiwxMSBAQAogICogY3JlYXRlZCBmb3IgdGhlIGF0dHJpYnV0ZXMgd2l0aCB0aGUgZGlyZWN0b3J5IGJlaW5nIHRoZSBuYW1lIG9mIHRoZQogICogYXR0cmlidXRlIGdyb3VwLgogICovCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYWluX2F0dHJfZ3JvdXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYWluX2F0dHJfZ3JvdXAgPSB7CiAJLmF0dHJzID0gbWFpbl9hdHRycywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGkxOG5fYXR0cl9ncm91cCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGkxOG5fYXR0cl9ncm91cCA9IHsKIAkuYXR0cnMgPSBpMThuX2F0dHJzLAogCS5uYW1lID0gImkxOG4iLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3N5bnRoLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zeW50aC5jCmluZGV4IDRmNDYyYzMuLjU0YjJmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3N5bnRoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3ludGguYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgInNlcmlhbGlvLmgiCiAKICNkZWZpbmUgTUFYU1lOVEhTICAgICAgIDE2ICAgICAgLyogTWF4IG51bWJlciBvZiBzeW50aHMgaW4gYXJyYXkuICovCi1zdGF0aWMgc3RydWN0IHNwa19zeW50aCAqc3ludGhzW01BWFNZTlRIU107CitzdGF0aWMgc3RydWN0IHNwa19zeW50aCAqc3ludGhzW01BWFNZTlRIUyArIDFdOwogc3RydWN0IHNwa19zeW50aCAqc3ludGg7CiBjaGFyIHNwa19waXRjaF9idWZmWzMyXSA9ICIiOwogc3RhdGljIGludCBtb2R1bGVfc3RhdHVzOwpAQCAtNDA3LDcgKzQwNyw3IEBACiAJaWYgKCFzcGtfcXVpZXRfYm9vdCkKIAkJc3ludGhfcHJpbnRmKCIlcyBmb3VuZFxuIiwgc3ludGgtPmxvbmdfbmFtZSk7CiAJaWYgKHN5bnRoLT5hdHRyaWJ1dGVzLm5hbWUKLQkmJiBzeXNmc19jcmVhdGVfZ3JvdXAoc3BlYWt1cF9rb2JqLCAmKHN5bnRoLT5hdHRyaWJ1dGVzKSkgPCAwKQorCSYmIHN5c2ZzX2NyZWF0ZV9ncm91cChzcGVha3VwX2tvYmosICZzeW50aC0+YXR0cmlidXRlcykgPCAwKQogCQlyZXR1cm4gLUVOT01FTTsKIAlzeW50aF9mbGFncyA9IHN5bnRoLT5mbGFnczsKIAl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZzcGVha3VwX2V2ZW50KTsKQEAgLTQyOSw3ICs0MjksNyBAQAogCWRlbF90aW1lcigmdGhyZWFkX3RpbWVyKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKIAlpZiAoc3ludGgtPmF0dHJpYnV0ZXMubmFtZSkKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKHNwZWFrdXBfa29iaiwgJihzeW50aC0+YXR0cmlidXRlcykpOworCQlzeXNmc19yZW1vdmVfZ3JvdXAoc3BlYWt1cF9rb2JqLCAmc3ludGgtPmF0dHJpYnV0ZXMpOwogCWZvciAodmFyID0gc3ludGgtPnZhcnM7IHZhci0+dmFyX2lkICE9IE1BWFZBUlM7IHZhcisrKQogCQlzcGVha3VwX3VucmVnaXN0ZXJfdmFyKHZhci0+dmFyX2lkKTsKIAlzcGtfc3RvcF9zZXJpYWxfaW50ZXJydXB0KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC92YXJoYW5kbGVycy5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvdmFyaGFuZGxlcnMuYwppbmRleCBlMTM5M2QyLi4yMTE4NmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC92YXJoYW5kbGVycy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3ZhcmhhbmRsZXJzLmMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCXVfY2hhciAqY3A7CiAJc2hvcnQgbWFzayA9IHNwa19wdW5jX2luZm9bd2hpY2hdLm1hc2s7CiAKLQlpZiAoaG93JjEpIHsKKwlpZiAoaG93ICYgMSkgewogCQlmb3IgKGNwID0gKHVfY2hhciAqKXNwa19wdW5jX2luZm9bM10udmFsdWU7ICpjcDsgY3ArKykKIAkJCXNwa19jaGFydGFiWypjcF0gJj0gfm1hc2s7CiAJfQpAQCAtMjkwLDE0ICsyOTAsMTQgQEAKIAkJCWlmIChtYXNrIDwgUFVOQykgewogCQkJCWlmICghKHNwa19jaGFydGFiWypjcF0gJiBQVU5DKSkKIAkJCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHNwa19jaGFydGFiWypjcF0mQl9OVU0pCisJCQl9IGVsc2UgaWYgKHNwa19jaGFydGFiWypjcF0gJiBCX05VTSkKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoKmNwKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWNwID0gKHVfY2hhciAqKWlucHV0OwogCX0KLQlpZiAoaG93JjIpIHsKKwlpZiAoaG93ICYgMikgewogCQlmb3IgKDsgKmNwOyBjcCsrKQogCQkJaWYgKCpjcCA+IFNQQUNFKQogCQkJCXNwa19jaGFydGFiWypjcF0gfD0gbWFzazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9jaGFubmVsLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvY2hhbm5lbC5oCmluZGV4IGRiNGU2YjIuLjI1OWVmNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9jaGFubmVsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2NoYW5uZWwuaApAQCAtNzUsMjggKzc1LDYgQEAKIAkJCQkvKiBhY2Nlc3MgY2hhbm5lbCBhbnl0aW1lICovCiB9OwogCi1zdGF0aWMgaW5saW5lIGNvbnN0IHU4ICoKLVVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKHUzMiBzdGF0ZSkKLXsKLQlzd2l0Y2ggKHN0YXRlKSB7Ci0JY2FzZSBDSEFOTkVMQ0xJX0RFVEFDSEVEOgotCQlyZXR1cm4gKGNvbnN0IHU4ICopKCJERVRBQ0hFRCIpOwotCWNhc2UgQ0hBTk5FTENMSV9ESVNBQkxFRDoKLQkJcmV0dXJuIChjb25zdCB1OCAqKSgiRElTQUJMRUQiKTsKLQljYXNlIENIQU5ORUxDTElfQVRUQUNISU5HOgotCQlyZXR1cm4gKGNvbnN0IHU4ICopKCJBVFRBQ0hJTkciKTsKLQljYXNlIENIQU5ORUxDTElfQVRUQUNIRUQ6Ci0JCXJldHVybiAoY29uc3QgdTggKikoIkFUVEFDSEVEIik7Ci0JY2FzZSBDSEFOTkVMQ0xJX0JVU1k6Ci0JCXJldHVybiAoY29uc3QgdTggKikoIkJVU1kiKTsKLQljYXNlIENIQU5ORUxDTElfT1dORUQ6Ci0JCXJldHVybiAoY29uc3QgdTggKikoIk9XTkVEIik7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAoY29uc3QgdTggKikoIj8iKTsKLX0KLQogI2RlZmluZSBTUEFSX0NIQU5ORUxfU0VSVkVSX1JFQURZKGNoKSBcCiAJKHJlYWRsKCYoY2gpLT5zcnZfc3RhdGUpID09IENIQU5ORUxTUlZfUkVBRFkpCiAKQEAgLTEzMiwyMiArMTEwLDYgQEAKIC8qIHRocm90dGxpbmcgaW52YWxpZCBib290IGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0byBidXN5IGNoYW5uZWwgKi8KICNkZWZpbmUgVUxUUkFfQ0xJRVJST1JCT09UX1RIUk9UVExFTVNHX0JVU1kgICAgICAgIDB4MDQKIAotLyogVmFsdWVzIGZvciBVTFRSQV9DSEFOTkVMX1BST1RPQ09MLkNsaUVycm9yT1M6ICovCi0vKiB0aHJvdHRsaW5nIGludmFsaWQgZ3Vlc3QgT1MgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvCi0gKiBjbGllbnQgZGlzYWJsZWQKLSAqLwotI2RlZmluZSBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX0RJU0FCTEVEICAgICAgMHgwMQotCi0vKiB0aHJvdHRsaW5nIGludmFsaWQgZ3Vlc3QgT1MgY2hhbm5lbCBzdGF0ZXRyYW5zaXRpb24gZXJyb3IgZHVlIHRvCi0gKiBjbGllbnQgbm90IGF0dGFjaGVkCi0gKi8KLSNkZWZpbmUgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19OT1RBVFRBQ0hFRCAgIDB4MDIKLQotLyogdGhyb3R0bGluZyBpbnZhbGlkIGd1ZXN0IE9TIGNoYW5uZWwgc3RhdGV0cmFuc2l0aW9uIGVycm9yIGR1ZSB0bwotICogYnVzeSBjaGFubmVsCi0gKi8KLSNkZWZpbmUgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19CVVNZICAgICAgICAgIDB4MDQKLQogLyogVmFsdWVzIGZvciBVTFRSQV9DSEFOTkVMX1BST1RPQ09MLkZlYXR1cmVzOiBUaGlzIGRlZmluZSBleGlzdHMgc28KICAqIHRoYXQgd2luZG93cyBndWVzdCBjYW4gbG9vayBhdCB0aGUgRmVhdHVyZUZsYWdzIGluIHRoZSBpbyBjaGFubmVsLAogICogYW5kIGNvbmZpZ3VyZSB0aGUgd2luZG93cyBkcml2ZXIgdG8gdXNlIGludGVycnVwdHMgb3Igbm90IGJhc2VkIG9uCkBAIC0zNDcsMTQ4ICszMDksNiBAQAogCXJldHVybiAxOwogfQogCi0vKiBHaXZlbiBhIGZpbGUgcGF0aG5hbWUgPHM+ICh3aXRoICcvJyBvciAnXCcgc2VwYXJhdGluZyBkaXJlY3Rvcnkgbm9kZXMpLAotICogcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBhIG5vZGUgd2l0aGluIHRoYXQgcGF0aG5hbWUgc3VjaAotICogdGhhdCB0aGUgbnVtYmVyIG9mIG5vZGVzIGZyb20gdGhhdCBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBpcwotICogTk9UIG1vcmUgdGhhbiA8bj4uICBOb3RlIHRoYXQgaWYgdGhlIHBhdGhuYW1lIGhhcyBsZXNzIHRoYW4gPG4+IG5vZGVzCi0gKiBpbiBpdCwgdGhlIHJldHVybiBwb2ludGVyIHdpbGwgYmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgotICovCi1zdGF0aWMgaW5saW5lIHU4ICoKLXBhdGhuYW1lX2xhc3Rfbl9ub2Rlcyh1OCAqcywgdW5zaWduZWQgaW50IG4pCi17Ci0JdTggKnAgPSBzOwotCXVuc2lnbmVkIGludCBub2RlX2NvdW50ID0gMDsKLQotCXdoaWxlICgqcCAhPSAnXDAnKSB7Ci0JCWlmICgoKnAgPT0gJy8nKSB8fCAoKnAgPT0gJ1xcJykpCi0JCQlub2RlX2NvdW50Kys7Ci0JCXArKzsKLQl9Ci0JaWYgKG5vZGVfY291bnQgPD0gbikKLQkJcmV0dXJuIHM7Ci0Jd2hpbGUgKG4gPiAwKSB7Ci0JCXAtLTsKLQkJaWYgKHAgPT0gcykKLQkJCWJyZWFrOwkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuLCB1bmxlc3Mgc29tZW9uZQotCQkJCSAqIGlzIGNoYW5naW5nIHRoZSBzdHJpbmcgd2hpbGUgd2UgYXJlCi0JCQkJICogbG9va2luZyBhdCBpdCEhCi0JCQkJICovCi0JCWlmICgoKnAgPT0gJy8nKSB8fCAoKnAgPT0gJ1xcJykpCi0JCQluLS07Ci0JfQotCXJldHVybiBwICsgMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLXNwYXJfY2hhbm5lbF9jbGllbnRfYWNxdWlyZV9vcyh2b2lkIF9faW9tZW0gKmNoLCB1OCAqaWQpCi17Ci0Jc3RydWN0IGNoYW5uZWxfaGVhZGVyIF9faW9tZW0gKmhkciA9IGNoOwotCi0JaWYgKHJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykgPT0gQ0hBTk5FTENMSV9ESVNBQkxFRCkgewotCQlpZiAoKHJlYWRiKCZoZHItPmNsaV9lcnJvcl9vcykKLQkJICAgICAmIFVMVFJBX0NMSUVSUk9ST1NfVEhST1RUTEVNU0dfRElTQUJMRUQpID09IDApIHsKLQkJCS8qIHdlIGFyZSBOT1QgdGhyb3R0bGluZyB0aGlzIG1lc3NhZ2UgKi8KLQkJCXdyaXRlYihyZWFkYigmaGRyLT5jbGlfZXJyb3Jfb3MpIHwKLQkJCSAgICAgICBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX0RJU0FCTEVELAotCQkJICAgICAgICZoZHItPmNsaV9lcnJvcl9vcyk7Ci0JCQkvKiB0aHJvdHRsZSB1bnRpbCBhY3F1aXJlIHN1Y2Nlc3NmdWwgKi8KLQotCQkJcHJfaW5mbygiJXMgQ2hhbm5lbCBTdGF0ZVRyYW5zaXRpb24gSU5WQUxJRCEgLSBhY3F1aXJlIGZhaWxlZCBiZWNhdXNlIE9TIGNsaWVudCBESVNBQkxFRFxuIiwKLQkJCQlpZCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCWlmICgocmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSAhPSBDSEFOTkVMQ0xJX09XTkVEKSAmJgotCSAgICAocmVhZGwoJmhkci0+Y2xpX3N0YXRlX2Jvb3QpID09IENIQU5ORUxDTElfRElTQUJMRUQpKSB7Ci0JCS8qIE91ciBjb21wZXRpdG9yIGlzIERJU0FCTEVELCBzbyB3ZSBjYW4gdHJhbnNpdGlvbiB0byBPV05FRCAqLwotCQlwcl9pbmZvKCIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiAoJXMpICVzKCVkKS0tPiVzKCVkKVxuIiwKLQkJCWlkLCAiY2xpX3N0YXRlX29zIiwKLQkJCVVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKHJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykpLAotCQkJcmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSwKLQkJCVVMVFJBX0NIQU5ORUxDTElfU1RSSU5HKENIQU5ORUxDTElfT1dORUQpLAotCQkJQ0hBTk5FTENMSV9PV05FRCk7Ci0JCXdyaXRlbChDSEFOTkVMQ0xJX09XTkVELCAmaGRyLT5jbGlfc3RhdGVfb3MpOwotCQltYigpOyAvKiByZXF1aXJlZCBmb3IgY2hhbm5lbCBzeW5jaCAqLwotCX0KLQlpZiAocmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSA9PSBDSEFOTkVMQ0xJX09XTkVEKSB7Ci0JCWlmIChyZWFkYigmaGRyLT5jbGlfZXJyb3Jfb3MpKSB7Ci0JCQkvKiB3ZSBhcmUgaW4gYW4gZXJyb3IgbXNnIHRocm90dGxpbmcgc3RhdGU7Ci0JCQkgKiBjb21lIG91dCBvZiBpdAotCQkJICovCi0JCQlwcl9pbmZvKCIlcyBDaGFubmVsIE9TIGNsaWVudCBhY3F1aXJlIG5vdyBzdWNjZXNzZnVsXG4iLAotCQkJCWlkKTsKLQkJCXdyaXRlYigwLCAmaGRyLT5jbGlfZXJyb3Jfb3MpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQotCS8qIFdlIGhhdmUgdG8gZG8gaXQgdGhlICJoYXJkIHdheSIuICBXZSB0cmFuc2l0aW9uIHRvIEJVU1ksCi0JICogYW5kIGNhbiB1c2UgdGhlIGNoYW5uZWwgaWZmIG91ciBjb21wZXRpdG9yIGhhcyBub3QgYWxzbwotCSAqIHRyYW5zaXRpb25lZCB0byBCVVNZLgotCSAqLwotCWlmIChyZWFkbCgmaGRyLT5jbGlfc3RhdGVfb3MpICE9IENIQU5ORUxDTElfQVRUQUNIRUQpIHsKLQkJaWYgKChyZWFkYigmaGRyLT5jbGlfZXJyb3Jfb3MpCi0JCSAgICAgJiBVTFRSQV9DTElFUlJPUk9TX1RIUk9UVExFTVNHX05PVEFUVEFDSEVEKSA9PSAwKSB7Ci0JCQkvKiB3ZSBhcmUgTk9UIHRocm90dGxpbmcgdGhpcyBtZXNzYWdlICovCi0JCQl3cml0ZWIocmVhZGIoJmhkci0+Y2xpX2Vycm9yX29zKSB8Ci0JCQkgICAgICAgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19OT1RBVFRBQ0hFRCwKLQkJCSAgICAgICAmaGRyLT5jbGlfZXJyb3Jfb3MpOwotCQkJLyogdGhyb3R0bGUgdW50aWwgYWNxdWlyZSBzdWNjZXNzZnVsICovCi0JCQlwcl9pbmZvKCIlcyBDaGFubmVsIFN0YXRlVHJhbnNpdGlvbiBJTlZBTElEISAtIGFjcXVpcmUgZmFpbGVkIGJlY2F1c2UgT1MgY2xpZW50IE5PVCBBVFRBQ0hFRCAoc3RhdGU9JXMoJWQpKVxuIiwKLQkJCQlpZCwgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoCi0JCQkJCQlyZWFkbCgmaGRyLT5jbGlfc3RhdGVfb3MpKSwKLQkJCQlyZWFkbCgmaGRyLT5jbGlfc3RhdGVfb3MpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0Jd3JpdGVsKENIQU5ORUxDTElfQlVTWSwgJmhkci0+Y2xpX3N0YXRlX29zKTsKLQltYigpOyAvKiByZXF1aXJlZCBmb3IgY2hhbm5lbCBzeW5jaCAqLwotCWlmIChyZWFkbCgmaGRyLT5jbGlfc3RhdGVfYm9vdCkgPT0gQ0hBTk5FTENMSV9CVVNZKSB7Ci0JCWlmICgocmVhZGIoJmhkci0+Y2xpX2Vycm9yX29zKQotCQkgICAgICYgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19CVVNZKSA9PSAwKSB7Ci0JCQkvKiB3ZSBhcmUgTk9UIHRocm90dGxpbmcgdGhpcyBtZXNzYWdlICovCi0JCQl3cml0ZWIocmVhZGIoJmhkci0+Y2xpX2Vycm9yX29zKSB8Ci0JCQkgICAgICAgVUxUUkFfQ0xJRVJST1JPU19USFJPVFRMRU1TR19CVVNZLAotCQkJICAgICAgICZoZHItPmNsaV9lcnJvcl9vcyk7Ci0JCQkvKiB0aHJvdHRsZSB1bnRpbCBhY3F1aXJlIHN1Y2Nlc3NmdWwgKi8KLQkJCXByX2luZm8oIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIGZhaWxlZCAtIGhvc3QgT1MgYWNxdWlyZSBmYWlsZWQgYmVjYXVzZSBib290IEJVU1lcbiIsCi0JCQkJaWQpOwotCQl9Ci0JCS8qIHJlc2V0IGJ1c3kgKi8KLQkJd3JpdGVsKENIQU5ORUxDTElfQVRUQUNIRUQsICZoZHItPmNsaV9zdGF0ZV9vcyk7Ci0JCW1iKCk7IC8qIHJlcXVpcmVkIGZvciBjaGFubmVsIHN5bmNoICovCi0JCXJldHVybiAwOwotCX0KLQlpZiAocmVhZGIoJmhkci0+Y2xpX2Vycm9yX29zKSkgewotCQkvKiB3ZSBhcmUgaW4gYW4gZXJyb3IgbXNnIHRocm90dGxpbmcgc3RhdGU7IGNvbWUgb3V0IG9mIGl0ICovCi0JCXByX2luZm8oIiVzIENoYW5uZWwgT1MgY2xpZW50IGFjcXVpcmUgbm93IHN1Y2Nlc3NmdWxcbiIsIGlkKTsKLQkJd3JpdGViKDAsICZoZHItPmNsaV9lcnJvcl9vcyk7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNwYXJfY2hhbm5lbF9jbGllbnRfcmVsZWFzZV9vcyh2b2lkIF9faW9tZW0gKmNoLCB1OCAqaWQpCi17Ci0Jc3RydWN0IGNoYW5uZWxfaGVhZGVyIF9faW9tZW0gKmhkciA9IGNoOwotCi0JaWYgKHJlYWRiKCZoZHItPmNsaV9lcnJvcl9vcykpIHsKLQkJLyogd2UgYXJlIGluIGFuIGVycm9yIG1zZyB0aHJvdHRsaW5nIHN0YXRlOyBjb21lIG91dCBvZiBpdCAqLwotCQlwcl9pbmZvKCIlcyBDaGFubmVsIE9TIGNsaWVudCBlcnJvciBzdGF0ZSBjbGVhcmVkXG4iLCBpZCk7Ci0JCXdyaXRlYigwLCAmaGRyLT5jbGlfZXJyb3Jfb3MpOwotCX0KLQlpZiAocmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSA9PSBDSEFOTkVMQ0xJX09XTkVEKQotCQlyZXR1cm47Ci0JaWYgKHJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykgIT0gQ0hBTk5FTENMSV9CVVNZKSB7Ci0JCXByX2luZm8oIiVzIENoYW5uZWwgU3RhdGVUcmFuc2l0aW9uIElOVkFMSUQhIC0gcmVsZWFzZSBmYWlsZWQgYmVjYXVzZSBPUyBjbGllbnQgTk9UIEJVU1kgKHN0YXRlPSVzKCVkKSlcbiIsCi0JCQlpZCwgVUxUUkFfQ0hBTk5FTENMSV9TVFJJTkcoCi0JCQkJCXJlYWRsKCZoZHItPmNsaV9zdGF0ZV9vcykpLAotCQkJcmVhZGwoJmhkci0+Y2xpX3N0YXRlX29zKSk7Ci0JCS8qIHJldHVybjsgKi8KLQl9Ci0Jd3JpdGVsKENIQU5ORUxDTElfQVRUQUNIRUQsICZoZHItPmNsaV9zdGF0ZV9vcyk7IC8qIHJlbGVhc2UgYnVzeSAqLwotfQotCiAvKgogKiBSb3V0aW5lIERlc2NyaXB0aW9uOgogKiBUcmllcyB0byBpbnNlcnQgdGhlIHByZWJ1aWx0IHNpZ25hbCBwb2ludGVkIHRvIGJ5IHBTaWduYWwgaW50byB0aGUgbnRoCkBAIC01NjksNCArMzg5LDQ1IEBACiB1bnNpZ25lZCBjaGFyIHNwYXJfc2lnbmFscXVldWVfZW1wdHkoc3RydWN0IGNoYW5uZWxfaGVhZGVyIF9faW9tZW0gKmNoLAogCQkJCSAgICAgdTMyIHF1ZXVlKTsKIAorLyoKKyAqIENIQU5ORUwgR3VpZHMKKyAqLworCisvKiB7NDE0ODE1ZWQtYzU4Yy0xMWRhLTk1YTktMDBlMDgxNjExNjVmfSAqLworI2RlZmluZSBTUEFSX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEIFwKKwkJVVVJRF9MRSgweDQxNDgxNWVkLCAweGM1OGMsIDB4MTFkYSwgXAorCQkJCTB4OTUsIDB4YTksIDB4MCwgMHhlMCwgMHg4MSwgMHg2MSwgMHgxNiwgMHg1ZikKK3N0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfdmhiYV9jaGFubmVsX3Byb3RvY29sX3V1aWQgPQorCVNQQVJfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1VVSUQ7CisjZGVmaW5lIFNQQVJfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1VVSURfU1RSIFwKKwkiNDE0ODE1ZWQtYzU4Yy0xMWRhLTk1YTktMDBlMDgxNjExNjVmIgorCisvKiB7OGNkNTk5NGQtYzU4ZS0xMWRhLTk1YTktMDBlMDgxNjExNjVmfSAqLworI2RlZmluZSBTUEFSX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEIFwKKwkJVVVJRF9MRSgweDhjZDU5OTRkLCAweGM1OGUsIDB4MTFkYSwgXAorCQkJCTB4OTUsIDB4YTksIDB4MCwgMHhlMCwgMHg4MSwgMHg2MSwgMHgxNiwgMHg1ZikKK3N0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfdm5pY19jaGFubmVsX3Byb3RvY29sX3V1aWQgPQorCVNQQVJfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1VVSUQ7CisjZGVmaW5lIFNQQVJfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1VVSURfU1RSIFwKKwkiOGNkNTk5NGQtYzU4ZS0xMWRhLTk1YTktMDBlMDgxNjExNjVmIgorCisvKiB7NzIxMjAwMDgtNEFBQi0xMURDLTg1MzAtNDQ0NTUzNTQ0MjAwfSAqLworI2RlZmluZSBTUEFSX1NJT1ZNX1VVSUQgXAorCQlVVUlEX0xFKDB4NzIxMjAwMDgsIDB4NEFBQiwgMHgxMURDLCBcCisJCQkJMHg4NSwgMHgzMCwgMHg0NCwgMHg0NSwgMHg1MywgMHg1NCwgMHg0MiwgMHgwMCkKK3N0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfc2lvdm1fdXVpZCA9IFNQQVJfU0lPVk1fVVVJRDsKKworLyogezViNTJjNWFjLWU1ZjUtNGQ0Mi04ZGZmLTQyOWVhZWNkMjIxZn0gKi8KKyNkZWZpbmUgU1BBUl9DT05UUk9MRElSRUNUT1JfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEICBcCisJCVVVSURfTEUoMHg1YjUyYzVhYywgMHhlNWY1LCAweDRkNDIsIFwKKwkJCQkweDhkLCAweGZmLCAweDQyLCAweDllLCAweGFlLCAweGNkLCAweDIyLCAweDFmKQorCitzdGF0aWMgY29uc3QgdXVpZF9sZSBzcGFyX2NvbnRyb2xkaXJlY3Rvcl9jaGFubmVsX3Byb3RvY29sX3V1aWQgPQorCVNQQVJfQ09OVFJPTERJUkVDVE9SX0NIQU5ORUxfUFJPVE9DT0xfVVVJRDsKKworLyoge2I0ZTc5NjI1LWFlZGUtNGVBQS05ZTExLUQzZWRkY2Q0NTA0Y30gKi8KKyNkZWZpbmUgU1BBUl9ESUFHX1BPT0xfQ0hBTk5FTF9QUk9UT0NPTF9VVUlECQkJCVwKKwkJVVVJRF9MRSgweGI0ZTc5NjI1LCAweGFlZGUsIDB4NGVhYSwgXAorCQkJCTB4OWUsIDB4MTEsIDB4ZDMsIDB4ZWQsIDB4ZGMsIDB4ZDQsIDB4NTAsIDB4NGMpCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2NoYW5uZWxfZ3VpZC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2NoYW5uZWxfZ3VpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2NiNDk5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9jaGFubmVsX2d1aWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0vKgotICogQ0hBTk5FTCBHdWlkcwotICovCi0KLS8qIHs0MTQ4MTVlZC1jNThjLTExZGEtOTVhOS0wMGUwODE2MTE2NWZ9ICovCi0jZGVmaW5lIFNQQVJfVkhCQV9DSEFOTkVMX1BST1RPQ09MX1VVSUQgXAotCQlVVUlEX0xFKDB4NDE0ODE1ZWQsIDB4YzU4YywgMHgxMWRhLCBcCi0JCQkJMHg5NSwgMHhhOSwgMHgwLCAweGUwLCAweDgxLCAweDYxLCAweDE2LCAweDVmKQotc3RhdGljIGNvbnN0IHV1aWRfbGUgc3Bhcl92aGJhX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCA9Ci0JU1BBUl9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfVVVJRDsKLSNkZWZpbmUgU1BBUl9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfVVVJRF9TVFIgXAotCSI0MTQ4MTVlZC1jNThjLTExZGEtOTVhOS0wMGUwODE2MTE2NWYiCi0KLS8qIHs4Y2Q1OTk0ZC1jNThlLTExZGEtOTVhOS0wMGUwODE2MTE2NWZ9ICovCi0jZGVmaW5lIFNQQVJfVk5JQ19DSEFOTkVMX1BST1RPQ09MX1VVSUQgXAotCQlVVUlEX0xFKDB4OGNkNTk5NGQsIDB4YzU4ZSwgMHgxMWRhLCBcCi0JCQkJMHg5NSwgMHhhOSwgMHgwLCAweGUwLCAweDgxLCAweDYxLCAweDE2LCAweDVmKQotc3RhdGljIGNvbnN0IHV1aWRfbGUgc3Bhcl92bmljX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCA9Ci0JU1BBUl9WTklDX0NIQU5ORUxfUFJPVE9DT0xfVVVJRDsKLSNkZWZpbmUgU1BBUl9WTklDX0NIQU5ORUxfUFJPVE9DT0xfVVVJRF9TVFIgXAotCSI4Y2Q1OTk0ZC1jNThlLTExZGEtOTVhOS0wMGUwODE2MTE2NWYiCi0KLS8qIHs3MjEyMDAwOC00QUFCLTExREMtODUzMC00NDQ1NTM1NDQyMDB9ICovCi0jZGVmaW5lIFNQQVJfU0lPVk1fVVVJRCBcCi0JCVVVSURfTEUoMHg3MjEyMDAwOCwgMHg0QUFCLCAweDExREMsIFwKLQkJCQkweDg1LCAweDMwLCAweDQ0LCAweDQ1LCAweDUzLCAweDU0LCAweDQyLCAweDAwKQotc3RhdGljIGNvbnN0IHV1aWRfbGUgc3Bhcl9zaW92bV91dWlkID0gU1BBUl9TSU9WTV9VVUlEOwotCi0vKiB7NWI1MmM1YWMtZTVmNS00ZDQyLThkZmYtNDI5ZWFlY2QyMjFmfSAqLwotI2RlZmluZSBTUEFSX0NPTlRST0xESVJFQ1RPUl9DSEFOTkVMX1BST1RPQ09MX1VVSUQgIFwKLQkJVVVJRF9MRSgweDViNTJjNWFjLCAweGU1ZjUsIDB4NGQ0MiwgXAotCQkJCTB4OGQsIDB4ZmYsIDB4NDIsIDB4OWUsIDB4YWUsIDB4Y2QsIDB4MjIsIDB4MWYpCi0KLXN0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfY29udHJvbGRpcmVjdG9yX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCA9Ci0JU1BBUl9DT05UUk9MRElSRUNUT1JfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEOwotCi0vKiB7YjRlNzk2MjUtYWVkZS00ZUFBLTllMTEtRDNlZGRjZDQ1MDRjfSAqLwotI2RlZmluZSBTUEFSX0RJQUdfUE9PTF9DSEFOTkVMX1BST1RPQ09MX1VVSUQJCQkJXAotCQlVVUlEX0xFKDB4YjRlNzk2MjUsIDB4YWVkZSwgMHg0ZWFhLCBcCi0JCQkJMHg5ZSwgMHgxMSwgMHhkMywgMHhlZCwgMHhkYywgMHhkNCwgMHg1MCwgMHg0YykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9kaWFnY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2RpYWdjaGFubmVsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlODEzYzcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2RpYWdjaGFubmVsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfRElBR19DSEFOTkVMX0hfCi0jZGVmaW5lIF9ESUFHX0NIQU5ORUxfSF8KLQotLyogTGV2ZWxzIG9mIHNldmVyaXR5IGZvciBkaWFnbm9zdGljIGV2ZW50cywgaW4gb3JkZXIgZnJvbSBsb3dlc3Qgc2V2ZXJpdHkgdG8KLSAqIGhpZ2hlc3QgKGkuZS4gZmF0YWwgZXJyb3JzIGFyZSB0aGUgbW9zdCBzZXZlcmUsIGFuZCBzaG91bGQgYWx3YXlzIGJlIGxvZ2dlZCwKLSAqIGJ1dCBpbmZvIGV2ZW50cyByYXJlbHkgbmVlZCB0byBiZSBsb2dnZWQgZXhjZXB0IGR1cmluZyBkZWJ1Z2dpbmcpLiBUaGUKLSAqIHZhbHVlcyBESUFHX1NFVkVSSVRZX0VOVU1fQkVHSU4gYW5kIERJQUdfU0VWRVJJVFlfRU5VTV9FTkQgYXJlIG5vdCB2YWxpZAotICogc2V2ZXJpdHkgdmFsdWVzLiAgVGhleSBleGlzdCBtZXJlbHkgdG8gZGlsaW5lYXRlIHRoZSBsaXN0LCBzbyB0aGF0IGZ1dHVyZQotICogYWRkaXRpb25zIHdvbid0IHJlcXVpcmUgY2hhbmdlcyB0byB0aGUgZHJpdmVyIChpLmUuIHdoZW4gY2hlY2tpbmcgZm9yCi0gKiBvdXQtb2YtcmFuZ2Ugc2V2ZXJpdGllcyBpbiBTZXRTZXZlcml0eSkuIFRoZSB2YWx1ZXMgRElBR19TRVZFUklUWV9PVkVSUklERQotICogYW5kIERJQUdfU0VWRVJJVFlfU0hVVE9GRiBhcmUgbm90IHZhbGlkIHNldmVyaXR5IHZhbHVlcyBmb3IgbG9nZ2luZyBldmVudHMKLSAqIGJ1dCB0aGV5IGFyZSB2YWxpZCBmb3IgY29udHJvbGxpbmcgdGhlIGFtb3VudCBvZiBldmVudCBkYXRhLiBDaGFuZ2VzIG1hZGUKLSAqIHRvIHRoZSBlbnVtLCBuZWVkIHRvIGJlIHJlZmxlY3RlZCBpbiBzLVBhci4KLSAqLwotZW51bSBkaWFnX3NldmVyaXR5IHsKLQkJRElBR19TRVZFUklUWV9WRVJCT1NFID0gMCwKLQkJRElBR19TRVZFUklUWV9JTkZPID0gMSwKLQkJRElBR19TRVZFUklUWV9XQVJOSU5HID0gMiwKLQkJRElBR19TRVZFUklUWV9FUlIgPSAzLAotCQlESUFHX1NFVkVSSVRZX1BSSU5UID0gNCwKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2d1ZXN0bGludXhkZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2d1ZXN0bGludXhkZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODEyODdmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9ndWVzdGxpbnV4ZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX0dVRVNUTElOVVhERUJVR19IX18KLSNkZWZpbmUgX19HVUVTVExJTlVYREVCVUdfSF9fCi0KLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydGluZyBpbnRlcmZhY2UgZm9yICJ2bWNhbGxpbnRlcmZhY2UuaCIsIHBhcnRpY3VsYXJseQotICogcmVnYXJkaW5nIGFkZGluZyBhZGRpdGlvbmFsIHN0cnVjdHVyZSBhbmQgZnVuY3Rpb25hbGl0eSB0byBsaW51eAotICogSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZCi0gKi8KLQotLyoqKioqKiogSU5GTyBPTiBJU1NVRV9QT1NUQ09ERV9MSU5VWCgpIEJFTE9XICoqKioqKiovCi1lbnVtIGRyaXZlcl9wYyB7CQkvKiBQT1NUQ09ERSBkcml2ZXIgaWRlbnRpZmllciB0dXBsZXMgKi8KLQkvKiB2aXNvcmNoaXBzZXQgZHJpdmVyIGZpbGVzICovCi0JVklTT1JfQ0hJUFNFVF9QQyA9IDB4QTAsCi0JVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fYyA9IDB4QTEsCi0JVklTT1JfQ0hJUFNFVF9QQ19jb250cm9sdm1fY20yID0gMHhBMiwKLQlWSVNPUl9DSElQU0VUX1BDX2NvbnRyb2x2bV9kaXJlY3RfYyA9IDB4QTMsCi0JVklTT1JfQ0hJUFNFVF9QQ19maWxlX2MgPSAweEE0LAotCVZJU09SX0NISVBTRVRfUENfcGFyc2VyX2MgPSAweEE1LAotCVZJU09SX0NISVBTRVRfUENfdGVzdGluZ19jID0gMHhBNiwKLQlWSVNPUl9DSElQU0VUX1BDX3Zpc29yY2hpcHNldF9tYWluX2MgPSAweEE3LAotCVZJU09SX0NISVBTRVRfUENfdmlzb3Jzd2l0Y2hidXNfYyA9IDB4QTgsCi0JLyogdmlzb3JidXMgZHJpdmVyIGZpbGVzICovCi0JVklTT1JfQlVTX1BDID0gMHhCMCwKLQlWSVNPUl9CVVNfUENfYnVzaW5zdF9hdHRyX2MgPSAweEIxLAotCVZJU09SX0JVU19QQ19jaGFubmVsX2F0dHJfYyA9IDB4QjIsCi0JVklTT1JfQlVTX1BDX2Rldm1ham9ybWlub3JfYXR0cl9jID0gMHhCMywKLQlWSVNPUl9CVVNfUENfdmlzb3JidXNfbWFpbl9jID0gMHhCNCwKLQkvKiB2aXNvcmNsaWVudGJ1cyBkcml2ZXIgZmlsZXMgKi8KLQlWSVNPUl9DTElFTlRfQlVTX1BDID0gMHhDMCwKLQlWSVNPUl9DTElFTlRfQlVTX1BDX3Zpc29yY2xpZW50YnVzX21haW5fYyA9IDB4QzEsCi0JLyogdmlydCBoYmEgZHJpdmVyIGZpbGVzICovCi0JVklSVF9IQkFfUEMgPSAweEMyLAotCVZJUlRfSEJBX1BDX3ZpcnRoYmFfYyA9IDB4QzMsCi0JLyogdmlydHBjaSBkcml2ZXIgZmlsZXMgKi8KLQlWSVJUX1BDSV9QQyA9IDB4QzQsCi0JVklSVF9QQ0lfUENfdmlydHBjaV9jID0gMHhDNSwKLQkvKiB2aXJ0bmljIGRyaXZlciBmaWxlcyAqLwotCVZJUlRfTklDX1BDID0gMHhDNiwKLQlWSVJUX05JQ19QX3ZpcnRuaWNfYyA9IDB4QzcsCi0JLyogdWlzbGliIGRyaXZlciBmaWxlcyAqLwotCVVJU0xJQl9QQyA9IDB4RDAsCi0JVUlTTElCX1BDX3Vpc2xpYl9jID0gMHhEMSwKLQlVSVNMSUJfUENfdWlzcXVldWVfYyA9IDB4RDIsCi0JVUlTTElCX1BDX3Vpc3RocmVhZF9jID0gMHhEMywKLQlVSVNMSUJfUENfdWlzdXRpbHNfYyA9IDB4RDQsCi19OwotCi1lbnVtIGV2ZW50X3BjIHsJCQkvKiBQT1NUQ09ERSBldmVudCBpZGVudGlmaWVyIHR1cGxlcyAqLwotCUFUVEFDSF9QT1JUX0VOVFJZX1BDID0gMHgwMDEsCi0JQVRUQUNIX1BPUlRfRkFJTFVSRV9QQyA9IDB4MDAyLAotCUFUVEFDSF9QT1JUX1NVQ0NFU1NfUEMgPSAweDAwMywKLQlCVVNfRkFJTFVSRV9QQyA9IDB4MDA0LAotCUJVU19DUkVBVEVfRU5UUllfUEMgPSAweDAwNSwKLQlCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDAwNiwKLQlCVVNfQ1JFQVRFX0VYSVRfUEMgPSAweDAwNywKLQlCVVNfQ09ORklHVVJFX0VOVFJZX1BDID0gMHgwMDgsCi0JQlVTX0NPTkZJR1VSRV9GQUlMVVJFX1BDID0gMHgwMDksCi0JQlVTX0NPTkZJR1VSRV9FWElUX1BDID0gMHgwMEEsCi0JQ0hJUFNFVF9JTklUX0VOVFJZX1BDID0gMHgwMEIsCi0JQ0hJUFNFVF9JTklUX1NVQ0NFU1NfUEMgPSAweDAwQywKLQlDSElQU0VUX0lOSVRfRkFJTFVSRV9QQyA9IDB4MDBELAotCUNISVBTRVRfSU5JVF9FWElUX1BDID0gMHgwMEUsCi0JQ1JFQVRFX1dPUktRVUVVRV9QQyA9IDB4MDBGLAotCUNSRUFURV9XT1JLUVVFVUVfRkFJTEVEX1BDID0gMHgwQTAsCi0JQ09OVFJPTFZNX0lOSVRfRkFJTFVSRV9QQyA9IDB4MEExLAotCURFVklDRV9DUkVBVEVfRU5UUllfUEMgPSAweDBBMiwKLQlERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBBMywKLQlERVZJQ0VfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBBNCwKLQlERVZJQ0VfQ1JFQVRFX0VYSVRfUEMgPSAweDBBNSwKLQlERVZJQ0VfQUREX1BDID0gMHgwQTYsCi0JREVWSUNFX1JFR0lTVEVSX0ZBSUxVUkVfUEMgPSAweDBBNywKLQlERVZJQ0VfQ0hBTkdFU1RBVEVfRU5UUllfUEMgPSAweDBBOCwKLQlERVZJQ0VfQ0hBTkdFU1RBVEVfRkFJTFVSRV9QQyA9IDB4MEE5LAotCURFVklDRV9DSEFOR0VTVEFURV9FWElUX1BDID0gMHgwQUEsCi0JRFJJVkVSX0VOVFJZX1BDID0gMHgwQUIsCi0JRFJJVkVSX0VYSVRfUEMgPSAweDBBQywKLQlNQUxMT0NfRkFJTFVSRV9QQyA9IDB4MEFELAotCVFVRVVFX0RFTEFZRURfV09SS19QQyA9IDB4MEFFLAotCVVJU0xJQl9USFJFQURfRkFJTFVSRV9QQyA9IDB4MEI3LAotCVZCVVNfQ0hBTk5FTF9FTlRSWV9QQyA9IDB4MEI4LAotCVZCVVNfQ0hBTk5FTF9GQUlMVVJFX1BDID0gMHgwQjksCi0JVkJVU19DSEFOTkVMX0VYSVRfUEMgPSAweDBCQSwKLQlWSEJBX0NSRUFURV9FTlRSWV9QQyA9IDB4MEJCLAotCVZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBCQywKLQlWSEJBX0NSRUFURV9FWElUX1BDID0gMHgwQkQsCi0JVkhCQV9DUkVBVEVfU1VDQ0VTU19QQyA9IDB4MEJFLAotCVZIQkFfQ09NTUFORF9IQU5ETEVSX1BDID0gMHgwQkYsCi0JVkhCQV9QUk9CRV9FTlRSWV9QQyA9IDB4MEMwLAotCVZIQkFfUFJPQkVfRkFJTFVSRV9QQyA9IDB4MEMxLAotCVZIQkFfUFJPQkVfRVhJVF9QQyA9IDB4MEMyLAotCVZOSUNfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQzMsCi0JVk5JQ19DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MEM0LAotCVZOSUNfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBDNSwKLQlWTklDX1BST0JFX0VOVFJZX1BDID0gMHgwQzYsCi0JVk5JQ19QUk9CRV9GQUlMVVJFX1BDID0gMHgwQzcsCi0JVk5JQ19QUk9CRV9FWElUX1BDID0gMHgwQzgsCi0JVlBDSV9DUkVBVEVfRU5UUllfUEMgPSAweDBDOSwKLQlWUENJX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQ0EsCi0JVlBDSV9DUkVBVEVfRVhJVF9QQyA9IDB4MENCLAotCVZQQ0lfUFJPQkVfRU5UUllfUEMgPSAweDBDQywKLQlWUENJX1BST0JFX0ZBSUxVUkVfUEMgPSAweDBDRCwKLQlWUENJX1BST0JFX0VYSVRfUEMgPSAweDBDRSwKLQlDUkFTSF9ERVZfRU5UUllfUEMgPSAweDBDRiwKLQlDUkFTSF9ERVZfRVhJVF9QQyA9IDB4MEQwLAotCUNSQVNIX0RFVl9IQUREUl9OVUxMID0gMHgwRDEsCi0JQ1JBU0hfREVWX0NPTlRST0xWTV9OVUxMID0gMHgwRDIsCi0JQ1JBU0hfREVWX1JEX0JVU19GQUlVTFJFX1BDID0gMHgwRDMsCi0JQ1JBU0hfREVWX1JEX0RFVl9GQUlVTFJFX1BDID0gMHgwRDQsCi0JQ1JBU0hfREVWX0JVU19OVUxMX0ZBSUxVUkVfUEMgPSAweDBENSwKLQlDUkFTSF9ERVZfREVWX05VTExfRkFJTFVSRV9QQyA9IDB4MEQ2LAotCUNSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMgPSAweDBENywKLQlDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQyA9IDB4MEQ4LAotCVNBVkVfTVNHX0JVU19GQUlMVVJFX1BDID0gMHgwRDksCi0JU0FWRV9NU0dfREVWX0ZBSUxVUkVfUEMgPSAweDBEQSwKLQlDQUxMSE9NRV9JTklUX0ZBSUxVUkVfUEMgPSAweDBEQgotfTsKLQotI2lmZGVmIF9fR05VQ19fCi0KLSNkZWZpbmUgUE9TVENPREVfU0VWRVJJVFlfRVJSIERJQUdfU0VWRVJJVFlfRVJSCi0jZGVmaW5lIFBPU1RDT0RFX1NFVkVSSVRZX1dBUk5JTkcgRElBR19TRVZFUklUWV9XQVJOSU5HCi0vKiBUT0RPLT4gSW5mbyBjdXJyZW50bHkgZG9lc24ndCBzaG93LCBzbyB3ZSBzZXQgaW5mbz13YXJuaW5nICovCi0jZGVmaW5lIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8gRElBR19TRVZFUklUWV9QUklOVAotCi0vKiBleGFtcGxlIGNhbGwgb2YgUE9TVENPREVfTElOVVhfMihWSVNPUl9DSElQU0VUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwotICogUGxlYXNlIGFsc28gbm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgcG9zdGNvZGUgaXMgaW4gaGV4LCBzbyBpZiB5b3UgYXJlCi0gKiBzZWFyY2hpbmcgZm9yIHRoZSBfX0xJTkVfXyBudW1iZXIsIGNvbnZlcnQgaXQgZmlyc3QgdG8gZGVjaW1hbC4gIFRoZSBsaW5lCi0gKiBudW1iZXIgY29tYmluZWQgd2l0aCBkcml2ZXIgYW5kIHR5cGUgb2YgY2FsbCwgd2lsbCBhbGxvdyB5b3UgdG8gdHJhY2sgZG93bgotICogZXhhY3RseSB3aGF0IGxpbmUgYW4gZXJyb3Igb2NjdXJyZWQgb24sIG9yIHdoZXJlIHRoZSBsYXN0IGRyaXZlcgotICogZW50ZXJlZC9leGl0ZWQgZnJvbS4KLSAqLwotCi0vKiBCQVNFIEZVTkNUSU9OUyAqLwotI2RlZmluZSBQT1NUQ09ERV9MSU5VWF9BKERSSVZFUl9QQywgRVZFTlRfUEMsIHBjMzJiaXQsIHNldmVyaXR5KQlcCi1kbyB7CQkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgbG9uZyBwb3N0X2NvZGVfdGVtcDsJCQkJXAotCXBvc3RfY29kZV90ZW1wID0gKCgodTY0KURSSVZFUl9QQykgPDwgNTYpIHwgKCgodTY0KUVWRU5UX1BDKSA8PCA0NCkgfCBcCi0JCSgoKCh1NjQpX19MSU5FX18pICYgMHhGRkYpIDw8IDMyKSB8CQkJXAotCQkoKCh1NjQpcGMzMmJpdCkgJiAweEZGRkZGRkZGKTsJCQkJXAotCUlTU1VFX0lPX1ZNQ0FMTF9QT1NUQ09ERV9TRVZFUklUWShwb3N0X2NvZGVfdGVtcCwgc2V2ZXJpdHkpOwlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFBPU1RDT0RFX0xJTlVYX0IoRFJJVkVSX1BDLCBFVkVOVF9QQywgcGMxNmJpdDEsIHBjMTZiaXQyLCBzZXZlcml0eSkgXAotZG8gewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIGxvbmcgcG9zdF9jb2RlX3RlbXA7CQkJCVwKLQlwb3N0X2NvZGVfdGVtcCA9ICgoKHU2NClEUklWRVJfUEMpIDw8IDU2KSB8ICgoKHU2NClFVkVOVF9QQykgPDwgNDQpIHwgXAotCQkoKCgodTY0KV9fTElORV9fKSAmIDB4RkZGKSA8PCAzMikgfAkJCVwKLQkJKCgoKHU2NClwYzE2Yml0MSkgJiAweEZGRkYpIDw8IDE2KSB8CQkJXAotCQkoKCh1NjQpcGMxNmJpdDIpICYgMHhGRkZGKTsJCQkJXAotCUlTU1VFX0lPX1ZNQ0FMTF9QT1NUQ09ERV9TRVZFUklUWShwb3N0X2NvZGVfdGVtcCwgc2V2ZXJpdHkpOwlcCi19IHdoaWxlICgwKQotCi0vKiBNT1NUIENPTU1PTiAqLwotI2RlZmluZSBQT1NUQ09ERV9MSU5VWF8yKEVWRU5UX1BDLCBzZXZlcml0eSkJCQkJXAotCVBPU1RDT0RFX0xJTlVYX0EoQ1VSUkVOVF9GSUxFX1BDLCBFVkVOVF9QQywgMHgwMDAwLCBzZXZlcml0eSkKLQotI2RlZmluZSBQT1NUQ09ERV9MSU5VWF8zKEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSkJCQlcCi0JUE9TVENPREVfTElOVVhfQShDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCBwYzMyYml0LCBzZXZlcml0eSkKLQotI2RlZmluZSBQT1NUQ09ERV9MSU5VWF80KEVWRU5UX1BDLCBwYzE2Yml0MSwgcGMxNmJpdDIsIHNldmVyaXR5KQlcCi0JUE9TVENPREVfTElOVVhfQihDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCBwYzE2Yml0MSwJCVwKLQkJCSBwYzE2Yml0Miwgc2V2ZXJpdHkpCi0KLSNlbmRpZgotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvaW9jaGFubmVsLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvaW9jaGFubmVsLmgKaW5kZXggNWNjZjgxNC4uY2JhNDQzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL2lvY2hhbm5lbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9pb2NoYW5uZWwuaApAQCAtMzMsNyArMzMsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvZG1hLWRpcmVjdGlvbi5oPgogI2luY2x1ZGUgImNoYW5uZWwuaCIKLSNpbmNsdWRlICJjaGFubmVsX2d1aWQuaCIKIAogI2RlZmluZSBVTFRSQV9WSEJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFIFVMVFJBX0NIQU5ORUxfUFJPVE9DT0xfU0lHTkFUVVJFCiAjZGVmaW5lIFVMVFJBX1ZOSUNfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUgVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTF9TSUdOQVRVUkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9wZXJpb2RpY193b3JrLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvcGVyaW9kaWNfd29yay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjMzMzVhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9wZXJpb2RpY193b3JrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKiBwZXJpb2RpY193b3JrLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX1BFUklPRElDX1dPUktfSF9fCi0jZGVmaW5lIF9fUEVSSU9ESUNfV09SS19IX18KLQotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotCi0vKiBQRVJJT0RJQ19XT1JLIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdG8gdXNlcnMuCi0gKiBGaWVsZHMgYXJlIGRlY2xhcmVkIG9ubHkgaW4gdGhlIGltcGxlbWVudGF0aW9uIC5jIGZpbGVzLgotICovCi1zdHJ1Y3QgcGVyaW9kaWNfd29yazsKLQotc3RydWN0IHBlcmlvZGljX3dvcmsgKgotdmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUodWxvbmcgamlmZnlfaW50ZXJ2YWwsCi0JCQkgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlLAotCQkJICAgdm9pZCAoKndvcmtmdW5jKSh2b2lkICopLAotCQkJICAgdm9pZCAqd29ya2Z1bmNhcmcsCi0JCQkgICBjb25zdCBjaGFyICpkZXZuYW0pOwotdm9pZCB2aXNvcl9wZXJpb2RpY193b3JrX2Rlc3Ryb3koc3RydWN0IHBlcmlvZGljX3dvcmsgKnB3KTsKLWJvb2wgdmlzb3JfcGVyaW9kaWNfd29ya19uZXh0cGVyaW9kKHN0cnVjdCBwZXJpb2RpY193b3JrICpwdyk7Ci1ib29sIHZpc29yX3BlcmlvZGljX3dvcmtfc3RhcnQoc3RydWN0IHBlcmlvZGljX3dvcmsgKnB3KTsKLWJvb2wgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKHN0cnVjdCBwZXJpb2RpY193b3JrICpwdyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZidXNoZWxwZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92YnVzaGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYjZhYWMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZidXNoZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIHZidXNoZWxwZXIuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMSAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fVkJVU0hFTFBFUl9IX18KLSNkZWZpbmUgX19WQlVTSEVMUEVSX0hfXwotCi0vKiBUQVJHRVRfSE9TVE5BTUUgc3BlY2lmaWVkIGFzIC1EVEFSR0VUX0hPU1ROQU1FPVwidGhlbmFtZVwiIG9uIHRoZQotICogY29tbWFuZCBsaW5lCi0gKi8KLQotI2RlZmluZSBUQVJHRVRfSE9TVE5BTUUgImxpbnV4Z3Vlc3QiCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBidXNfZGV2aWNlX2luZm9faW5pdCgKLQkJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqYnVzX2RldmljZV9pbmZvX3B0ciwKLQkJY29uc3QgY2hhciAqZGV2X3R5cGUsIGNvbnN0IGNoYXIgKmRydl9uYW1lLAotCQljb25zdCBjaGFyICp2ZXIsIGNvbnN0IGNoYXIgKnZlcl90YWcpCi17Ci0JbWVtc2V0KGJ1c19kZXZpY2VfaW5mb19wdHIsIDAsIHNpemVvZihzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvKSk7Ci0Jc25wcmludGYoYnVzX2RldmljZV9pbmZvX3B0ci0+ZGV2dHlwZSwKLQkJIHNpemVvZihidXNfZGV2aWNlX2luZm9fcHRyLT5kZXZ0eXBlKSwKLQkJICIlcyIsIChkZXZfdHlwZSkgPyBkZXZfdHlwZSA6ICJ1bmtub3duVHlwZSIpOwotCXNucHJpbnRmKGJ1c19kZXZpY2VfaW5mb19wdHItPmRydm5hbWUsCi0JCSBzaXplb2YoYnVzX2RldmljZV9pbmZvX3B0ci0+ZHJ2bmFtZSksCi0JCSAiJXMiLCAoZHJ2X25hbWUpID8gZHJ2X25hbWUgOiAidW5rbm93bkRyaXZlciIpOwotCXNucHJpbnRmKGJ1c19kZXZpY2VfaW5mb19wdHItPmluZm9zdHJzLAotCQkgc2l6ZW9mKGJ1c19kZXZpY2VfaW5mb19wdHItPmluZm9zdHJzKSwgIiVzXHQlc1x0JXMiLAotCQkgKHZlcikgPyB2ZXIgOiAidW5rbm93blZlciIsCi0JCSAodmVyX3RhZykgPyB2ZXJfdGFnIDogInVua25vd25WZXJUYWciLAotCQkgVEFSR0VUX0hPU1ROQU1FKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdmVyc2lvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkMWRhNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLS8qIHZlcnNpb24uaCAqLwotCi0vKiAgQ29tbW9uIHZlcnNpb24vcmVsZWFzZSBpbmZvIG5lZWRlZCBieSBhbGwgY29tcG9uZW50cyBnb2VzIGhlcmUuCi0gKiAgKFRoaXMgZmlsZSBtdXN0IGNvbXBpbGUgY2xlYW5seSBpbiBhbGwgZW52aXJvbm1lbnRzLikKLSAqICBVbHRpbWF0ZWx5LCB0aGlzIHdpbGwgYmUgY29tYmluZWQgd2l0aCBkZWZpbmVzIGdlbmVyYXRlZCBkeW5hbWljYWxseSBhcwotICogIHBhcnQgb2YgdGhlIHN5c2dlbiwgYW5kIHNvbWUgb2YgdGhlIGRlZmluZXMgYmVsb3cgbWF5IGluIGZhY3QgZW5kIHVwCi0gKiAgYmVpbmcgcmVwbGFjZWQgd2l0aCBkeW5hbWljYWxseSBnZW5lcmF0ZWQgb25lcy4KLSAqLwotI2lmbmRlZiBfX1ZFUlNJT05fSF9fCi0jZGVmaW5lIF9fVkVSU0lPTl9IX18KLQotI2RlZmluZSBTUEFSVkVSMSAiMSIKLSNkZWZpbmUgU1BBUlZFUjIgIjAiCi0jZGVmaW5lIFNQQVJWRVIzICIwIgotI2RlZmluZSBTUEFSVkVSNCAiMCIKLQotI2RlZmluZSAgVkVSU0lPTiAgICAgICAgU1BBUlZFUjEgIi4iIFNQQVJWRVIyICIuIiBTUEFSVkVSMyAiLiIgU1BBUlZFUjQKLQotLyogSGVyZSBhcmUgdmFyaW91cyB2ZXJzaW9uIGZvcm1zIG5lZWRlZCBpbiBXaW5kb3dzIGVudmlyb25tZW50cy4KLSAqLwotI2RlZmluZSBWSVNPUl9QUk9EVUNUVkVSU0lPTiAgICAgIFNQQVJWRVJDT01NQQotI2RlZmluZSBWSVNPUl9QUk9EVUNUVkVSU0lPTl9TVFIgIFNQQVJWRVIxICIuIiBTUEFSVkVSMiAiLiIgU1BBUlZFUjMgIi4iIFwKLQlTUEFSVkVSNAotI2RlZmluZSBWSVNPUl9PQkpFQ1RWRVJTSU9OX1NUUiAgIFNQQVJWRVIxICIsIiBTUEFSVkVSMiAiLCIgU1BBUlZFUjMgIiwiIFwKLQlTUEFSVkVSNAotCi0jZGVmaW5lICBDT1BZUklHSFQgICAgICAiVW5pc3lzIENvcnBvcmF0aW9uIgotI2RlZmluZSAgQ09QWVJJR0hUREFURSAgIjIwMTAgLSAyMDEzIgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS92aXNvcmJ1cy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Zpc29yYnVzLmgKaW5kZXggOWJhZjFlYy4uNjc3NjI3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Zpc29yYnVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Zpc29yYnVzLmgKQEAgLTM0LDggKzM0LDkgQEAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdXVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCi0jaW5jbHVkZSAicGVyaW9kaWNfd29yay5oIgogI2luY2x1ZGUgImNoYW5uZWwuaCIKIAogc3RydWN0IHZpc29yX2RyaXZlcjsKQEAgLTY1LDggKzY2LDYgQEAKICAqIHN0cnVjdCB2aXNvcl9kcml2ZXIgLSBJbmZvcm1hdGlvbiBwcm92aWRlZCBieSBlYWNoIHZpc29yIGRyaXZlciB3aGVuIGl0CiAgKiByZWdpc3RlcnMgd2l0aCB0aGUgdmlzb3JidXMgZHJpdmVyLgogICogQG5hbWU6CQlOYW1lIG9mIHRoZSB2aXNvciBkcml2ZXIuCi0gKiBAdmVyc2lvbjoJCVRoZSBudW1iZXJlZCB2ZXJzaW9uIG9mIHRoZSBkcml2ZXIgKHgueC54eHgpLgotICogQHZlcnRhZzoJCUEgaHVtYW4gcmVhZGFibGUgdmVyc2lvbiBzdHJpbmcuCiAgKiBAb3duZXI6CQlUaGUgbW9kdWxlIG93bmVyLgogICogQGNoYW5uZWxfdHlwZXM6CVR5cGVzIG9mIGNoYW5uZWxzIGhhbmRsZWQgYnkgdGhpcyBkcml2ZXIsIGVuZGluZyB3aXRoCiAgKgkJCWEgemVybyBHVUlELiBPdXIgc3BlY2lhbGl6ZWQgQlVTLm1hdGNoKCkgbWV0aG9kIGtub3dzCkBAIC05MywxMiArOTIsOSBAQAogICogQHJlc3VtZToJCUJlaGF2ZXMgc2ltaWxhciB0byBwYXVzZS4KICAqIEBkcml2ZXI6CQlQcml2YXRlIHJlZmVyZW5jZSB0byB0aGUgZGV2aWNlIGRyaXZlci4gRm9yIHVzZSBieSBidXMKICAqCQkJZHJpdmVyIG9ubHkuCi0gKiBAdmVyc2lvbl9hdHRyOglQcml2YXRlIHZlcnNpb24gZmllbGQuIEZvciB1c2UgYnkgYnVzIGRyaXZlciBvbmx5LgogICovCiBzdHJ1Y3Qgdmlzb3JfZHJpdmVyIHsKIAljb25zdCBjaGFyICpuYW1lOwotCWNvbnN0IGNoYXIgKnZlcnNpb247Ci0JY29uc3QgY2hhciAqdmVydGFnOwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogCXN0cnVjdCB2aXNvcl9jaGFubmVsdHlwZV9kZXNjcmlwdG9yICpjaGFubmVsX3R5cGVzOwogCWludCAoKnByb2JlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpOwpAQCAtMTExLDcgKzEwNyw2IEBACiAKIAkvKiBUaGVzZSBmaWVsZHMgYXJlIGZvciBwcml2YXRlIHVzZSBieSB0aGUgYnVzIGRyaXZlciBvbmx5LiAqLwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKLQlzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSB2ZXJzaW9uX2F0dHI7CiB9OwogCiAjZGVmaW5lIHRvX3Zpc29yX2RyaXZlcih4KSAoKHgpID8gXApAQCAtMTIwLDMzICsxMTUsMzMgQEAKIC8qKgogICogc3RydWN0IHZpc29yX2RldmljZSAtIEEgZGV2aWNlIHR5cGUgZm9yIHRoaW5ncyAicGx1Z2dlZCIgaW50byB0aGUgdmlzb3JidXMKICAqIGJ1cwotICogdmlzb3JjaGFubmVsOgkJUG9pbnRzIHRvIHRoZSBjaGFubmVsIHRoYXQgdGhlIGRldmljZSBpcworICogQHZpc29yY2hhbm5lbDoJCVBvaW50cyB0byB0aGUgY2hhbm5lbCB0aGF0IHRoZSBkZXZpY2UgaXMKICAqCQkJCWFzc29jaWF0ZWQgd2l0aC4KLSAqIGNoYW5uZWxfdHlwZV9ndWlkOgkJSWRlbnRpZmllcyB0aGUgY2hhbm5lbCB0eXBlIHRvIHRoZSBidXMgZHJpdmVyLgotICogZGV2aWNlOgkJCURldmljZSBzdHJ1Y3QgbWVhbnQgZm9yIHVzZSBieSB0aGUgYnVzIGRyaXZlcgorICogQGNoYW5uZWxfdHlwZV9ndWlkOgkJSWRlbnRpZmllcyB0aGUgY2hhbm5lbCB0eXBlIHRvIHRoZSBidXMgZHJpdmVyLgorICogQGRldmljZToJCQlEZXZpY2Ugc3RydWN0IG1lYW50IGZvciB1c2UgYnkgdGhlIGJ1cyBkcml2ZXIKICAqCQkJCW9ubHkuCi0gKiBsaXN0X2FsbDoJCQlVc2VkIGJ5IHRoZSBidXMgZHJpdmVyIHRvIGVudW1lcmF0ZSBkZXZpY2VzLgotICogcGVyaW9kaWNfd29yazoJCURldmljZSB3b3JrIHF1ZXVlLiBQcml2YXRlIHVzZSBieSBidXMgZHJpdmVyCi0gKgkJCQlvbmx5LgotICogYmVpbmdfcmVtb3ZlZDoJCUluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZCBmcm9tCisgKiBAbGlzdF9hbGw6CQkJVXNlZCBieSB0aGUgYnVzIGRyaXZlciB0byBlbnVtZXJhdGUgZGV2aWNlcy4KKyAqIEB0aW1lcjoJCSAgICAgICAgVGltZXIgZmlyZWQgcGVyaW9kaWNhbGx5IHRvIGRvIGludGVycnVwdC10eXBlCisgKgkJCQlhY3Rpdml0eS4KKyAqIEBiZWluZ19yZW1vdmVkOgkJSW5kaWNhdGVzIHRoYXQgdGhlIGRldmljZSBpcyBiZWluZyByZW1vdmVkIGZyb20KICAqCQkJCXRoZSBidXMuIFByaXZhdGUgYnVzIGRyaXZlciB1c2Ugb25seS4KLSAqIHZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2s6CVVzZWQgYnkgdGhlIGJ1cyBkcml2ZXIgdG8gbG9jayB3aGVuIGhhbmRsaW5nCisgKiBAdmlzb3Jkcml2ZXJfY2FsbGJhY2tfbG9jazoJVXNlZCBieSB0aGUgYnVzIGRyaXZlciB0byBsb2NrIHdoZW4gaGFuZGxpbmcKICAqCQkJCWNoYW5uZWwgZXZlbnRzLgotICogcGF1c2luZzoJCQlJbmRpY2F0ZXMgdGhhdCBhIGNoYW5nZSB0b3dhcmRzIGEgcGF1c2VkIHN0YXRlLgorICogQHBhdXNpbmc6CQkJSW5kaWNhdGVzIHRoYXQgYSBjaGFuZ2UgdG93YXJkcyBhIHBhdXNlZCBzdGF0ZS4KICAqCQkJCWlzIGluIHByb2dyZXNzLiBPbmx5IG1vZGlmaWVkIGJ5IHRoZSBidXMgZHJpdmVyLgotICogcmVzdW1pbmc6CQkJSW5kaWNhdGVzIHRoYXQgYSBjaGFuZ2UgdG93YXJkcyBhIHJ1bm5pbmcgc3RhdGUKKyAqIEByZXN1bWluZzoJCQlJbmRpY2F0ZXMgdGhhdCBhIGNoYW5nZSB0b3dhcmRzIGEgcnVubmluZyBzdGF0ZQogICoJCQkJaXMgaW4gcHJvZ3Jlc3MuIE9ubHkgbW9kaWZpZWQgYnkgdGhlIGJ1cyBkcml2ZXIuCi0gKiBjaGlwc2V0X2J1c19ubzoJCVByaXZhdGUgZmllbGQgdXNlZCBieSB0aGUgYnVzIGRyaXZlci4KLSAqIGNoaXBzZXRfZGV2X25vOgkJUHJpdmF0ZSBmaWVsZCB1c2VkIHRoZSBidXMgZHJpdmVyLgotICogc3RhdGU6CQkJVXNlZCB0byBpbmRpY2F0ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKKyAqIEBjaGlwc2V0X2J1c19ubzoJCVByaXZhdGUgZmllbGQgdXNlZCBieSB0aGUgYnVzIGRyaXZlci4KKyAqIEBjaGlwc2V0X2Rldl9ubzoJCVByaXZhdGUgZmllbGQgdXNlZCB0aGUgYnVzIGRyaXZlci4KKyAqIEBzdGF0ZToJCQlVc2VkIHRvIGluZGljYXRlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQogICoJCQkJZGV2aWNlLgotICogaW5zdDoJCQlVbmlxdWUgR1VJRCBmb3IgdGhpcyBpbnN0YW5jZSBvZiB0aGUgZGV2aWNlLgotICogbmFtZToJCQlOYW1lIG9mIHRoZSBkZXZpY2UuCi0gKiBwZW5kaW5nX21zZ19oZHI6CQlGb3IgcHJpdmF0ZSB1c2UgYnkgYnVzIGRyaXZlciB0byByZXNwb25kIHRvCisgKiBAaW5zdDoJCQlVbmlxdWUgR1VJRCBmb3IgdGhpcyBpbnN0YW5jZSBvZiB0aGUgZGV2aWNlLgorICogQG5hbWU6CQkJTmFtZSBvZiB0aGUgZGV2aWNlLgorICogQHBlbmRpbmdfbXNnX2hkcjoJCUZvciBwcml2YXRlIHVzZSBieSBidXMgZHJpdmVyIHRvIHJlc3BvbmQgdG8KICAqCQkJCWh5cGVydmlzb3IgcmVxdWVzdHMuCi0gKiB2YnVzX2hkcl9pbmZvOgkJQSBwb2ludGVyIHRvIGhlYWRlciBpbmZvLiBQcml2YXRlIHVzZSBieSBidXMKKyAqIEB2YnVzX2hkcl9pbmZvOgkJQSBwb2ludGVyIHRvIGhlYWRlciBpbmZvLiBQcml2YXRlIHVzZSBieSBidXMKICAqCQkJCWRyaXZlci4KLSAqIHBhcnRpdGlvbl91dWlkOgkJSW5kaWNhdGVzIGNsaWVudCBwYXJ0aW9uIGlkLiBUaGlzIHNob3VsZCBiZSB0aGUKKyAqIEBwYXJ0aXRpb25fdXVpZDoJCUluZGljYXRlcyBjbGllbnQgcGFydGlvbiBpZC4gVGhpcyBzaG91bGQgYmUgdGhlCiAgKgkJCQlzYW1lIGFjcm9zcyBhbGwgdmlzb3JfZGV2aWNlcyBpbiB0aGUgY3VycmVudAogICoJCQkJZ3Vlc3QuIFByaXZhdGUgdXNlIGJ5IGJ1cyBkcml2ZXIgb25seS4KICAqLwpAQCAtMTU3LDkgKzE1MiwxMCBAQAogCS8qIFRoZXNlIGZpZWxkcyBhcmUgZm9yIHByaXZhdGUgdXNlIGJ5IHRoZSBidXMgZHJpdmVyIG9ubHkuICovCiAJc3RydWN0IGRldmljZSBkZXZpY2U7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0X2FsbDsKLQlzdHJ1Y3QgcGVyaW9kaWNfd29yayAqcGVyaW9kaWNfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwlib29sIHRpbWVyX2FjdGl2ZTsKIAlib29sIGJlaW5nX3JlbW92ZWQ7Ci0Jc3RydWN0IHNlbWFwaG9yZSB2aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrOworCXN0cnVjdCBtdXRleCB2aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrOwogCWJvb2wgcGF1c2luZzsKIAlib29sIHJlc3VtaW5nOwogCXUzMiBjaGlwc2V0X2J1c19ubzsKQEAgLTE3NCw3ICsxNzAsNiBAQAogCiAjZGVmaW5lIHRvX3Zpc29yX2RldmljZSh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IHZpc29yX2RldmljZSwgZGV2aWNlKQogCi0jaWZuZGVmIFNUQU5EQUxPTkVfQ0xJRU5UCiBpbnQgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKHN0cnVjdCB2aXNvcl9kcml2ZXIgKik7CiB2b2lkIHZpc29yYnVzX3VucmVnaXN0ZXJfdmlzb3JfZHJpdmVyKHN0cnVjdCB2aXNvcl9kcml2ZXIgKik7CiBpbnQgdmlzb3JidXNfcmVhZF9jaGFubmVsKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwKQEAgLTE4Myw1MCArMTc4LDM0IEBACiBpbnQgdmlzb3JidXNfd3JpdGVfY2hhbm5lbChzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsCiAJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgdm9pZCAqc3JjLAogCQkJICAgdW5zaWduZWQgbG9uZyBuYnl0ZXMpOwotaW50IHZpc29yYnVzX2NsZWFyX2NoYW5uZWwoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LAotCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHU4IGNoLCB1bnNpZ25lZCBsb25nIG5ieXRlcyk7CiB2b2lkIHZpc29yYnVzX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KTsKIHZvaWQgdmlzb3JidXNfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KTsKLSNlbmRpZgogCi0vKiBOb3RlIHRoYXQgZm9yIHZpc29yY2hhbm5lbF9jcmVhdGUoKQotICogPGNoYW5uZWxfYnl0ZXM+IGFuZCA8Z3VpZD4gYXJndW1lbnRzIG1heSBiZSAwIGlmIHdlIGFyZSBhIGNoYW5uZWwgQ0xJRU5ULgotICogSW4gdGhpcyBjYXNlLCB0aGUgdmFsdWVzIGNhbiBzaW1wbHkgYmUgcmVhZCBmcm9tIHRoZSBjaGFubmVsIGhlYWRlci4KKy8qIExldmVscyBvZiBzZXZlcml0eSBmb3IgZGlhZ25vc3RpYyBldmVudHMsIGluIG9yZGVyIGZyb20gbG93ZXN0IHNldmVyaXR5IHRvCisgKiBoaWdoZXN0IChpLmUuIGZhdGFsIGVycm9ycyBhcmUgdGhlIG1vc3Qgc2V2ZXJlLCBhbmQgc2hvdWxkIGFsd2F5cyBiZSBsb2dnZWQsCisgKiBidXQgaW5mbyBldmVudHMgcmFyZWx5IG5lZWQgdG8gYmUgbG9nZ2VkIGV4Y2VwdCBkdXJpbmcgZGVidWdnaW5nKS4gVGhlCisgKiB2YWx1ZXMgRElBR19TRVZFUklUWV9FTlVNX0JFR0lOIGFuZCBESUFHX1NFVkVSSVRZX0VOVU1fRU5EIGFyZSBub3QgdmFsaWQKKyAqIHNldmVyaXR5IHZhbHVlcy4gIFRoZXkgZXhpc3QgbWVyZWx5IHRvIGRpbGluZWF0ZSB0aGUgbGlzdCwgc28gdGhhdCBmdXR1cmUKKyAqIGFkZGl0aW9ucyB3b24ndCByZXF1aXJlIGNoYW5nZXMgdG8gdGhlIGRyaXZlciAoaS5lLiB3aGVuIGNoZWNraW5nIGZvcgorICogb3V0LW9mLXJhbmdlIHNldmVyaXRpZXMgaW4gU2V0U2V2ZXJpdHkpLiBUaGUgdmFsdWVzIERJQUdfU0VWRVJJVFlfT1ZFUlJJREUKKyAqIGFuZCBESUFHX1NFVkVSSVRZX1NIVVRPRkYgYXJlIG5vdCB2YWxpZCBzZXZlcml0eSB2YWx1ZXMgZm9yIGxvZ2dpbmcgZXZlbnRzCisgKiBidXQgdGhleSBhcmUgdmFsaWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBhbW91bnQgb2YgZXZlbnQgZGF0YS4gQ2hhbmdlcyBtYWRlCisgKiB0byB0aGUgZW51bSwgbmVlZCB0byBiZSByZWZsZWN0ZWQgaW4gcy1QYXIuCiAgKi8KLXN0cnVjdCB2aXNvcmNoYW5uZWwgKnZpc29yY2hhbm5lbF9jcmVhdGUodTY0IHBoeXNhZGRyLAotCQkJCQkgdW5zaWduZWQgbG9uZyBjaGFubmVsX2J5dGVzLAotCQkJCQkgZ2ZwX3QgZ2ZwLCB1dWlkX2xlIGd1aWQpOwotc3RydWN0IHZpc29yY2hhbm5lbCAqdmlzb3JjaGFubmVsX2NyZWF0ZV93aXRoX2xvY2sodTY0IHBoeXNhZGRyLAotCQkJCQkJICAgdW5zaWduZWQgbG9uZyBjaGFubmVsX2J5dGVzLAotCQkJCQkJICAgZ2ZwX3QgZ2ZwLCB1dWlkX2xlIGd1aWQpOwotdm9pZCB2aXNvcmNoYW5uZWxfZGVzdHJveShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKLWludCB2aXNvcmNoYW5uZWxfcmVhZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCi0JCSAgICAgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpOwotaW50IHZpc29yY2hhbm5lbF93cml0ZShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCi0JCSAgICAgICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKTsKLWludCB2aXNvcmNoYW5uZWxfY2xlYXIoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAotCQkgICAgICAgdTggY2gsIHVsb25nIG5ieXRlcyk7Ci1ib29sIHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAotCQkJICAgICAgIHZvaWQgKm1zZyk7Ci1ib29sIHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAotCQkJICAgICAgIHZvaWQgKm1zZyk7Ci1ib29sIHZpc29yY2hhbm5lbF9zaWduYWxlbXB0eShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUpOworZW51bSBkaWFnX3NldmVyaXR5IHsKKwlESUFHX1NFVkVSSVRZX1ZFUkJPU0UgPSAwLAorCURJQUdfU0VWRVJJVFlfSU5GTyA9IDEsCisJRElBR19TRVZFUklUWV9XQVJOSU5HID0gMiwKKwlESUFHX1NFVkVSSVRZX0VSUiA9IDMsCisJRElBR19TRVZFUklUWV9QUklOVCA9IDQsCit9OwogCi1pbnQgdmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX3Nsb3RzX2F2YWlsKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsCi0JCQkJCSB1MzIgcXVldWUpOwotaW50IHZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9tYXhfc2xvdHMoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlKTsKLXU2NCB2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOwotdWxvbmcgdmlzb3JjaGFubmVsX2dldF9uYnl0ZXMoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCk7Ci1jaGFyICp2aXNvcmNoYW5uZWxfaWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgY2hhciAqcyk7Ci1jaGFyICp2aXNvcmNoYW5uZWxfem9uZWlkKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIGNoYXIgKnMpOwotdTY0IHZpc29yY2hhbm5lbF9nZXRfY2xpZW50cGFydGl0aW9uKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOwotaW50IHZpc29yY2hhbm5lbF9zZXRfY2xpZW50cGFydGl0aW9uKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsCi0JCQkJICAgICB1NjQgcGFydGl0aW9uX2hhbmRsZSk7CitpbnQgdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsCisJCQkgICAgICB2b2lkICptc2cpOworaW50IHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAorCQkJICAgICAgdm9pZCAqbXNnKTsKK2Jvb2wgdmlzb3JjaGFubmVsX3NpZ25hbGVtcHR5KHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSk7CiB1dWlkX2xlIHZpc29yY2hhbm5lbF9nZXRfdXVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKLWNoYXIgKnZpc29yY2hhbm5lbF91dWlkX2lkKHV1aWRfbGUgKmd1aWQsIGNoYXIgKnMpOwotdm9pZCB2aXNvcmNoYW5uZWxfZGVidWcoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgaW50IG51bV9xdWV1ZXMsCi0JCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdTMyIG9mZik7Ci12b2lkIF9faW9tZW0gKnZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOwogCiAjZGVmaW5lIEJVU19ST09UX0RFVklDRQkJVUlOVF9NQVgKIHN0cnVjdCB2aXNvcl9kZXZpY2UgKnZpc29yYnVzX2dldF9kZXZpY2VfYnlfaWQodTMyIGJ1c19ubywgdTMyIGRldl9ubywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL01ha2VmaWxlCmluZGV4IGZjNzkwZTcuLmYzNzMwZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9NYWtlZmlsZQpAQCAtNyw2ICs3LDUgQEAKIHZpc29yYnVzLXkgOj0gdmlzb3JidXNfbWFpbi5vCiB2aXNvcmJ1cy15ICs9IHZpc29yY2hhbm5lbC5vCiB2aXNvcmJ1cy15ICs9IHZpc29yY2hpcHNldC5vCi12aXNvcmJ1cy15ICs9IHBlcmlvZGljX3dvcmsubwogCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvY29udHJvbHZtY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9jb250cm9sdm1jaGFubmVsLmgKaW5kZXggMDNlMzZmYi4uZjBiZmM0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9jb250cm9sdm1jaGFubmVsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9jb250cm9sdm1jaGFubmVsLmgKQEAgLTQ4Miw0ICs0ODIsODAgQEAKIAl1MzIgcmVzZXJ2ZWQ7CQkvKiBOYXR1cmFsIGFsaWdubWVudCAqLwogfTsKIAorLyogR2VuZXJhbCBFcnJvcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMC05OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORSAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9JT1JFTUFQX0ZBSUxFRCAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTiAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX0lOVkFMSURfRk9SX0NMSUVOVCAgICAgIDUKKworLyogQ09OVFJPTFZNX0lOSVRfQ0hJUFNFVC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTAwLTE5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0xJRU5UX1NXSVRDSENPVU5UX05PTlpFUk8gICAgICAgICAxMDAKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfRVhQRUNURURfQ0hJUFNFVF9JTklUICAgICAgICAgICAgICAxMDEKKworLyogTWF4aW11bSBMaW1pdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMjAwLTI5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUFYX0JVU0VTCQkyMDEJLyogQlVTX0NSRUFURSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NQVhfREVWSUNFUyAgICAgICAgMjAyCS8qIERFVklDRV9DUkVBVEUgKi8KKy8qIFBheWxvYWQgYW5kIFBhcmFtZXRlciBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzQwMC00OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1BBWUxPQURfSU5WQUxJRAk0MDAJLyogU1dJVENIX0FUVEFDSEVYVFBPUlQsCisJCQkJCQkJICogREVWSUNFX0NPTkZJR1VSRQorCQkJCQkJCSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9JTklUSUFUT1JfUEFSQU1FVEVSX0lOVkFMSUQgNDAxCS8qIE11bHRpcGxlICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1RBUkdFVF9QQVJBTUVURVJfSU5WQUxJRCA0MDIgLyogREVWSUNFX0NPTkZJR1VSRSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DTElFTlRfUEFSQU1FVEVSX0lOVkFMSUQgNDAzIC8qIERFVklDRV9DT05GSUdVUkUgKi8KKy8qIFNwZWNpZmllZFtQYWNrZXQgU3RydWN0dXJlXSBWYWx1ZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNTAwLTU5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQJNTAwCS8qIFNXSVRDSF9BVFRBQ0hJTlRQT1JULAorCQkJCQkJCSAqIEJVU19DT05GSUdVUkUsCisJCQkJCQkJICogREVWSUNFX0NSRUFURSwKKwkJCQkJCQkgKiBERVZJQ0VfQ09ORklHCisJCQkJCQkJICogREVWSUNFX0RFU1RST1kKKwkJCQkJCQkgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX0lOVkFMSUQJNTAxIC8qIFNXSVRDSF9BVFRBQ0hJTlRQT1JUICovCisJCQkJCQkgICAgLyogREVWSUNFX0NSRUFURSwKKwkJCQkJCSAgICAgKiBERVZJQ0VfQ09ORklHVVJFLAorCQkJCQkJICAgICAqIERFVklDRV9ERVNUUk9ZCisJCQkJCQkgICAgICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfSU5WQUxJRAk1MDIgLyogREVWSUNFX0NSRUFURSwKKwkJCQkJCSAgICAgKiBERVZJQ0VfQ09ORklHVVJFCisJCQkJCQkgICAgICovCisvKiBQYXJ0aXRpb24gRHJpdmVyIENhbGxiYWNrIEludGVyZmFjZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNjAwLTY5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRSA2MDQJLyogQlVTX0NSRUFURSwKKwkJCQkJCQkgKiBCVVNfREVTVFJPWSwKKwkJCQkJCQkgKiBERVZJQ0VfQ1JFQVRFLAorCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZCisJCQkJCQkJICovCisvKiBVbmFibGUgdG8gaW52b2tlIFZJUlRQQ0kgY2FsbGJhY2sgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfQ0FMTEJBQ0tfRVJST1IgNjA1CisJCQkJCQkJLyogQlVTX0NSRUFURSwKKwkJCQkJCQkgKiBCVVNfREVTVFJPWSwKKwkJCQkJCQkgKiBERVZJQ0VfQ1JFQVRFLAorCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZCisJCQkJCQkJICovCisvKiBWSVJUUENJIENhbGxiYWNrIHJldHVybmVkIGVycm9yICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0dFTkVSSUNfRFJJVkVSX0NBTExCQUNLX0VSUk9SIDYwNgorCQkJCQkJCS8qIFNXSVRDSF9BVFRBQ0hFWFRQT1JULAorCQkJCQkJCSAqIFNXSVRDSF9ERVRBQ0hFWFRQT1JUCisJCQkJCQkJICogREVWSUNFX0NPTkZJR1VSRQorCQkJCQkJCSAqLworCisvKiBnZW5lcmljIGRldmljZSBjYWxsYmFjayByZXR1cm5lZCBlcnJvciAqLworLyogQnVzIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bNzAwLTc5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0RFVklDRV9BVFRBQ0hFRCA3MDAJLyogQlVTX0RFU1RST1kgKi8KKy8qIENoYW5uZWwgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzgwMC04OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfVFlQRV9VTktOT1dOIDgwMAkvKiBHRVRfQ0hBTk5FTElORk8sCisJCQkJCQkJICogREVWSUNFX0RFU1RST1kKKwkJCQkJCQkgKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9TSVpFX1RPT19TTUFMTCA4MDEJLyogREVWSUNFX0NSRUFURSAqLworLyogQ2hpcHNldCBTaHV0ZG93biBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzEwMDAtMTA5OV0gKi8KKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TSFVURE9XTl9GQUlMRUQgICAgICAgICAgICAxMDAwCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU0hVVERPV05fQUxSRUFEWV9BQ1RJVkUgICAgMTAwMQorCisvKiBDaGlwc2V0IFN0b3AgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTEwMC0xMTk5XSAqLworI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NUT1BfRkFJTEVEX0JVUyAgICAgICAgICAgIDExMDAKKyNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TVE9QX0ZBSUxFRF9TV0lUQ0ggICAgICAgICAxMTAxCisKKy8qIERldmljZSBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsxNDAwLTE0OTldICovCisjZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9VREVWX1RJTUVPVVQgICAgICAgICAgICAgICAgMTQwMAorCiAjZW5kaWYJCQkJLyogX19DT05UUk9MVk1DSEFOTkVMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9jb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL2NvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhZDBlYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL2NvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKiBjb250cm9sdm1jb21wbGV0aW9uc3RhdHVzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDE1IFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0vKiAgRGVmaW5lcyBmb3IgYWxsIHZhbGlkIHZhbHVlcyByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBoZWFkZXIKLSAqICBjb21wbGV0aW9uU3RhdHVzIGZpZWxkLiAgU2VlIGNvbnRyb2x2bWNoYW5uZWwuaCBmb3IgZGVzY3JpcHRpb24gb2YKLSAqICB0aGUgaGVhZGVyOiBfQ09OVFJPTFZNX01FU1NBR0VfSEVBREVSLgotICovCi0KLSNpZm5kZWYgX19DT05UUk9MVk1DT01QTEVUSU9OU1RBVFVTX0hfXwotI2RlZmluZSBfX0NPTlRST0xWTUNPTVBMRVRJT05TVEFUVVNfSF9fCi0KLS8qIEdlbmVyYWwgRXJyb3JzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzAtOTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkUgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfSU9SRU1BUF9GQUlMRUQgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX1VOS05PV04gICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9JTlZBTElEX0ZPUl9DTElFTlQgICAgICA1Ci0KLS8qIENPTlRST0xWTV9JTklUX0NISVBTRVQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzEwMC0xOTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NMSUVOVF9TV0lUQ0hDT1VOVF9OT05aRVJPICAgICAgICAgMTAwCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0VYUEVDVEVEX0NISVBTRVRfSU5JVCAgICAgICAgICAgICAgMTAxCi0KLS8qIE1heGltdW0gTGltaXQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzIwMC0yOTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX01BWF9CVVNFUwkJMjAxCS8qIEJVU19DUkVBVEUgKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfTUFYX0RFVklDRVMgICAgICAgIDIwMgkvKiBERVZJQ0VfQ1JFQVRFICovCi0vKiBQYXlsb2FkIGFuZCBQYXJhbWV0ZXIgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs0MDAtNDk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9QQVlMT0FEX0lOVkFMSUQJNDAwCS8qIFNXSVRDSF9BVFRBQ0hFWFRQT1JULAotCQkJCQkJCSAqIERFVklDRV9DT05GSUdVUkUKLQkJCQkJCQkgKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfSU5JVElBVE9SX1BBUkFNRVRFUl9JTlZBTElEIDQwMQkvKiBNdWx0aXBsZSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9UQVJHRVRfUEFSQU1FVEVSX0lOVkFMSUQgNDAyIC8qIERFVklDRV9DT05GSUdVUkUgKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0xJRU5UX1BBUkFNRVRFUl9JTlZBTElEIDQwMyAvKiBERVZJQ0VfQ09ORklHVVJFICovCi0vKiBTcGVjaWZpZWRbUGFja2V0IFN0cnVjdHVyZV0gVmFsdWUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzUwMC01OTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElECTUwMAkvKiBTV0lUQ0hfQVRUQUNISU5UUE9SVCwKLQkJCQkJCQkgKiBCVVNfQ09ORklHVVJFLAotCQkJCQkJCSAqIERFVklDRV9DUkVBVEUsCi0JCQkJCQkJICogREVWSUNFX0NPTkZJRwotCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZCi0JCQkJCQkJICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElECTUwMSAvKiBTV0lUQ0hfQVRUQUNISU5UUE9SVCAqLwotCQkJCQkJICAgIC8qIERFVklDRV9DUkVBVEUsCi0JCQkJCQkgICAgICogREVWSUNFX0NPTkZJR1VSRSwKLQkJCQkJCSAgICAgKiBERVZJQ0VfREVTVFJPWQotCQkJCQkJICAgICAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX0lOVkFMSUQJNTAyIC8qIERFVklDRV9DUkVBVEUsCi0JCQkJCQkgICAgICogREVWSUNFX0NPTkZJR1VSRQotCQkJCQkJICAgICAqLwotLyogUGFydGl0aW9uIERyaXZlciBDYWxsYmFjayBJbnRlcmZhY2UtLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzYwMC02OTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkUgNjA0CS8qIEJVU19DUkVBVEUsCi0JCQkJCQkJICogQlVTX0RFU1RST1ksCi0JCQkJCQkJICogREVWSUNFX0NSRUFURSwKLQkJCQkJCQkgKiBERVZJQ0VfREVTVFJPWQotCQkJCQkJCSAqLwotLyogVW5hYmxlIHRvIGludm9rZSBWSVJUUENJIGNhbGxiYWNrICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SIDYwNQotCQkJCQkJCS8qIEJVU19DUkVBVEUsCi0JCQkJCQkJICogQlVTX0RFU1RST1ksCi0JCQkJCQkJICogREVWSUNFX0NSRUFURSwKLQkJCQkJCQkgKiBERVZJQ0VfREVTVFJPWQotCQkJCQkJCSAqLwotLyogVklSVFBDSSBDYWxsYmFjayByZXR1cm5lZCBlcnJvciAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9HRU5FUklDX0RSSVZFUl9DQUxMQkFDS19FUlJPUiA2MDYKLQkJCQkJCQkvKiBTV0lUQ0hfQVRUQUNIRVhUUE9SVCwKLQkJCQkJCQkgKiBTV0lUQ0hfREVUQUNIRVhUUE9SVAotCQkJCQkJCSAqIERFVklDRV9DT05GSUdVUkUKLQkJCQkJCQkgKi8KLQotLyogZ2VuZXJpYyBkZXZpY2UgY2FsbGJhY2sgcmV0dXJuZWQgZXJyb3IgKi8KLS8qIEJ1cyBSZWxhdGVkLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzcwMC03OTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19ERVZJQ0VfQVRUQUNIRUQgNzAwCS8qIEJVU19ERVNUUk9ZICovCi0vKiBDaGFubmVsIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVs4MDAtODk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1RZUEVfVU5LTk9XTiA4MDAJLyogR0VUX0NIQU5ORUxJTkZPLAotCQkJCQkJCSAqIERFVklDRV9ERVNUUk9ZCi0JCQkJCQkJICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfU0laRV9UT09fU01BTEwgODAxCS8qIERFVklDRV9DUkVBVEUgKi8KLS8qIENoaXBzZXQgU2h1dGRvd24gUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsxMDAwLTEwOTldICovCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU0hVVERPV05fRkFJTEVEICAgICAgICAgICAgMTAwMAotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSElQU0VUX1NIVVRET1dOX0FMUkVBRFlfQUNUSVZFICAgIDEwMDEKLQotLyogQ2hpcHNldCBTdG9wIFJlbGF0ZWQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWzExMDAtMTE5OV0gKi8KLSNkZWZpbmUgQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hJUFNFVF9TVE9QX0ZBSUxFRF9CVVMgICAgICAgICAgICAxMTAwCi0jZGVmaW5lIENPTlRST0xWTV9SRVNQX0VSUk9SX0NISVBTRVRfU1RPUF9GQUlMRURfU1dJVENIICAgICAgICAgMTEwMQotCi0vKiBEZXZpY2UgUmVsYXRlZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bMTQwMC0xNDk5XSAqLwotI2RlZmluZSBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfVURFVl9USU1FT1VUICAgICAgICAgICAgICAgIDE0MDAKLQotI2VuZGlmIC8qIF9fQ09OVFJPTFZNQ09NUExFVElPTlNUQVRVU19IX18gbm90IGRlZmluZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvaW92bWNhbGxfZ251Yy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9pb3ZtY2FsbF9nbnVjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZWE3ZjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9pb3ZtY2FsbF9nbnVjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDE1IFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0vKiBMaW51eCBHQ0MgVmVyc2lvbiAoMzItYml0IGFuZCA2NC1iaXQpICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fdW5pc3lzX3ZtY2FsbF9nbnVjKHVuc2lnbmVkIGxvbmcgdHVwbGUsIHVuc2lnbmVkIGxvbmcgcmVnX2VieCwKLQkJICAgICB1bnNpZ25lZCBsb25nIHJlZ19lY3gpCi17Ci0JdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOwotCXVuc2lnbmVkIGludCBjcHVpZF9lYXgsIGNwdWlkX2VieCwgY3B1aWRfZWN4LCBjcHVpZF9lZHg7Ci0KLQljcHVpZCgweDAwMDAwMDAxLCAmY3B1aWRfZWF4LCAmY3B1aWRfZWJ4LCAmY3B1aWRfZWN4LCAmY3B1aWRfZWR4KTsKLQlpZiAoIShjcHVpZF9lY3ggJiAweDgwMDAwMDAwKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCV9fYXNtX18gX192b2xhdGlsZV9fKCIuYnl0ZSAweDAwZiwgMHgwMDEsIDB4MGMxIiA6ICI9YSIocmVzdWx0KSA6Ci0JCSJhIih0dXBsZSksICJiIihyZWdfZWJ4KSwgImMiKHJlZ19lY3gpKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fdW5pc3lzX2V4dGVuZGVkX3ZtY2FsbF9nbnVjKHVuc2lnbmVkIGxvbmcgbG9uZyB0dXBsZSwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZWdfZWJ4LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHJlZ19lY3gsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVnX2VkeCkKLXsKLQl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7Ci0JdW5zaWduZWQgaW50IGNwdWlkX2VheCwgY3B1aWRfZWJ4LCBjcHVpZF9lY3gsIGNwdWlkX2VkeDsKLQotCWNwdWlkKDB4MDAwMDAwMDEsICZjcHVpZF9lYXgsICZjcHVpZF9lYngsICZjcHVpZF9lY3gsICZjcHVpZF9lZHgpOwotCWlmICghKGNwdWlkX2VjeCAmIDB4ODAwMDAwMDApKQotCQlyZXR1cm4gLUVQRVJNOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oIi5ieXRlIDB4MDBmLCAweDAwMSwgMHgwYzEiIDogIj1hIihyZXN1bHQpIDoKLQkJImEiKHR1cGxlKSwgImIiKHJlZ19lYngpLCAiYyIocmVnX2VjeCksICJkIihyZWdfZWR4KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvcGVyaW9kaWNfd29yay5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9wZXJpb2RpY193b3JrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYjE1MjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy9wZXJpb2RpY193b3JrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyogcGVyaW9kaWNfd29yay5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxNSBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotLyoKLSAqICBIZWxwZXIgZnVuY3Rpb25zIHRvIHNjaGVkdWxlIHBlcmlvZGljIHdvcmsgaW4gTGludXgga2VybmVsIG1vZGUuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSAicGVyaW9kaWNfd29yay5oIgotCi0jZGVmaW5lIE1ZRFJWTkFNRSAicGVyaW9kaWNfd29yayIKLQotc3RydWN0IHBlcmlvZGljX3dvcmsgewotCXJ3bG9ja190IGxvY2s7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwotCXZvaWQgKCp3b3JrZnVuYykodm9pZCAqKTsKLQl2b2lkICp3b3JrZnVuY2FyZzsKLQlib29sIGlzX3NjaGVkdWxlZDsKLQlib29sIHdhbnRfdG9fc3RvcDsKLQl1bG9uZyBqaWZmeV9pbnRlcnZhbDsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOwotCWNvbnN0IGNoYXIgKmRldm5hbTsKLX07Ci0KLXN0YXRpYyB2b2lkIHBlcmlvZGljX3dvcmtfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IHBlcmlvZGljX3dvcmsgKnB3OwotCi0JcHcgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBlcmlvZGljX3dvcmssIHdvcmsud29yayk7Ci0JKCpwdy0+d29ya2Z1bmMpKHB3LT53b3JrZnVuY2FyZyk7Ci19Ci0KLXN0cnVjdCBwZXJpb2RpY193b3JrCi0qdmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUodWxvbmcgamlmZnlfaW50ZXJ2YWwsCi0JCQkgICAgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZSwKLQkJCSAgICB2b2lkICgqd29ya2Z1bmMpKHZvaWQgKiksCi0JCQkgICAgdm9pZCAqd29ya2Z1bmNhcmcsCi0JCQkgICAgY29uc3QgY2hhciAqZGV2bmFtKQotewotCXN0cnVjdCBwZXJpb2RpY193b3JrICpwdzsKLQotCXB3ID0ga3phbGxvYyhzaXplb2YoKnB3KSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmICghcHcpCi0JCXJldHVybiBOVUxMOwotCi0Jcndsb2NrX2luaXQoJnB3LT5sb2NrKTsKLQlwdy0+amlmZnlfaW50ZXJ2YWwgPSBqaWZmeV9pbnRlcnZhbDsKLQlwdy0+d29ya3F1ZXVlID0gd29ya3F1ZXVlOwotCXB3LT53b3JrZnVuYyA9IHdvcmtmdW5jOwotCXB3LT53b3JrZnVuY2FyZyA9IHdvcmtmdW5jYXJnOwotCXB3LT5kZXZuYW0gPSBkZXZuYW07Ci0JcmV0dXJuIHB3OwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUpOwotCi12b2lkIHZpc29yX3BlcmlvZGljX3dvcmtfZGVzdHJveShzdHJ1Y3QgcGVyaW9kaWNfd29yayAqcHcpCi17Ci0Ja2ZyZWUocHcpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcGVyaW9kaWNfd29ya19kZXN0cm95KTsKLQotLyoqIENhbGwgdGhpcyBmcm9tIHlvdXIgcGVyaW9kaWMgd29yayB3b3JrZXIgZnVuY3Rpb24gdG8gc2NoZWR1bGUgdGhlIG5leHQKLSAqICBjYWxsLgotICogIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwgdGhlcmUgd2FzIGEgZmFpbHVyZSBhbmQgdGhlCi0gKiAgcGVyaW9kaWMgd29yayBpcyBubyBsb25nZXIgc2NoZWR1bGVkCi0gKi8KLWJvb2wgdmlzb3JfcGVyaW9kaWNfd29ya19uZXh0cGVyaW9kKHN0cnVjdCBwZXJpb2RpY193b3JrICpwdykKLXsKLQlib29sIHJjID0gZmFsc2U7Ci0KLQl3cml0ZV9sb2NrKCZwdy0+bG9jayk7Ci0JaWYgKHB3LT53YW50X3RvX3N0b3ApIHsKLQkJcHctPmlzX3NjaGVkdWxlZCA9IGZhbHNlOwotCQlwdy0+d2FudF90b19zdG9wID0gZmFsc2U7Ci0JCXJjID0gdHJ1ZTsgIC8qIHllcywgdHJ1ZTsgc2VlIHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcCgpICovCi0JCWdvdG8gdW5sb2NrOwotCX0gZWxzZSBpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayhwdy0+d29ya3F1ZXVlLCAmcHctPndvcmssCi0JCQkJICAgICAgIHB3LT5qaWZmeV9pbnRlcnZhbCkpIHsKLQkJcHctPmlzX3NjaGVkdWxlZCA9IGZhbHNlOwotCQlyYyA9IGZhbHNlOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JcmMgPSB0cnVlOwotdW5sb2NrOgotCXdyaXRlX3VubG9jaygmcHctPmxvY2spOwotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yX3BlcmlvZGljX3dvcmtfbmV4dHBlcmlvZCk7Ci0KLS8qKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZmYgbmV3IHBlcmlvZGljIHdvcmsgd2FzIGFjdHVhbGx5IHN0YXJ0ZWQuCi0gKiAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCB0aGVuIG5vIHdvcmsgd2FzIHN0YXJ0ZWQKLSAqICAoZWl0aGVyIGJlY2F1c2UgaXQgd2FzIGFscmVhZHkgc3RhcnRlZCwgb3IgYmVjYXVzZSBvZiBhIGZhaWx1cmUpLgotICovCi1ib29sIHZpc29yX3BlcmlvZGljX3dvcmtfc3RhcnQoc3RydWN0IHBlcmlvZGljX3dvcmsgKnB3KQotewotCWJvb2wgcmMgPSBmYWxzZTsKLQotCXdyaXRlX2xvY2soJnB3LT5sb2NrKTsKLQlpZiAocHctPmlzX3NjaGVkdWxlZCkgewotCQlyYyA9IGZhbHNlOwotCQlnb3RvIHVubG9jazsKLQl9Ci0JaWYgKHB3LT53YW50X3RvX3N0b3ApIHsKLQkJcmMgPSBmYWxzZTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCUlOSVRfREVMQVlFRF9XT1JLKCZwdy0+d29yaywgJnBlcmlvZGljX3dvcmtfZnVuYyk7Ci0JaWYgKCFxdWV1ZV9kZWxheWVkX3dvcmsocHctPndvcmtxdWV1ZSwgJnB3LT53b3JrLAotCQkJCXB3LT5qaWZmeV9pbnRlcnZhbCkpIHsKLQkJcmMgPSBmYWxzZTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCXB3LT5pc19zY2hlZHVsZWQgPSB0cnVlOwotCXJjID0gdHJ1ZTsKLXVubG9jazoKLQl3cml0ZV91bmxvY2soJnB3LT5sb2NrKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX3N0YXJ0KTsKLQotLyoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmZiB5b3VyIGNhbGwgYWN0dWFsbHkgc3RvcHBlZCB0aGUgcGVyaW9kaWMKLSAqICB3b3JrLgotICoKLSAqICAtLSBQQVkgQVRURU5USU9OLi4uIHRoaXMgaXMgaW1wb3J0YW50IC0tCi0gKgotICogIE5PIE5PICMxCi0gKgotICogICAgIERvIE5PVCBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBzb21lIGZ1bmN0aW9uIHRoYXQgaXMgcnVubmluZyBvbiB0aGUKLSAqICAgICBzYW1lIHdvcmtxdWV1ZSBhcyB0aGUgd29yayB5b3UgYXJlIHRyeWluZyB0byBzdG9wIG1pZ2h0IGJlIHJ1bm5pbmcKLSAqICAgICBvbiEgIElmIHlvdSB2aW9sYXRlIHRoaXMgcnVsZSwgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKCkgTUlHSFQgd29yaywKLSAqICAgICBidXQgaXQgYWxzbyBNSUdIVCBnZXQgaHVuZyB1cCBpbiBhbiBpbmZpbml0ZSBsb29wIHNheWluZwotICogICAgICJ3YWl0aW5nIGZvciBkZWxheWVkIHdvcmsuLi4iLiAgVGhpcyB3aWxsIGhhcHBlbiBpZiB0aGUgZGVsYXllZCB3b3JrCi0gKiAgICAgeW91IGFyZSB0cnlpbmcgdG8gY2FuY2VsIGhhcyBiZWVuIHB1dCBpbiB0aGUgd29ya3F1ZXVlIGxpc3QsIGJ1dCBjYW4ndAotICogICAgIHJ1biB5ZXQgYmVjYXVzZSB3ZSBhcmUgcnVubmluZyB0aGF0IHNhbWUgd29ya3F1ZXVlIHRocmVhZCByaWdodCBub3cuCi0gKgotICogICAgIEJvdHRvbSBsaW5lOiBJZiB5b3UgbmVlZCB0byBjYWxsIHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcCgpIGZyb20gYQotICogICAgIHdvcmtpdGVtLCBiZSBzdXJlIHRoZSB3b3JraXRlbSBpcyBvbiBhIERJRkZFUkVOVCB3b3JrcXVldWUgdGhhbiB0aGUKLSAqICAgICB3b3JraXRlbSB0aGF0IHlvdSBhcmUgdHJ5aW5nIHRvIGNhbmNlbC4KLSAqCi0gKiAgICAgSWYgSSBjb3VsZCBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIGNoZWNrIGZvciB0aGlzICJubyBubyIgY29uZGl0aW9uIGluCi0gKiAgICAgdGhlIGNvZGUsIEkgd291bGQuICBJdCB3b3VsZCBoYXZlIHNhdmVkIG1lIHRoZSB0cm91YmxlIG9mIHdyaXRpbmcgdGhpcwotICogICAgIGxvbmcgY29tbWVudC4gIEFuZCBhbHNvLCBkb24ndCB0aGluayB0aGlzIGlzIHNvbWUgInRoZW9yZXRpY2FsIiByYWNlCi0gKiAgICAgY29uZGl0aW9uLiAgSXQgaXMgUkVBTCwgYXMgSSBoYXZlIHNwZW50IHRoZSBkYXkgY2hhc2luZyBpdC4KLSAqCi0gKiAgTk8gTk8gIzIKLSAqCi0gKiAgICAgVGFrZSBjbG9zZSBub3RlIG9mIHRoZSBsb2NrcyB0aGF0IHlvdSBvd24gd2hlbiB5b3UgY2FsbCB0aGlzIGZ1bmN0aW9uLgotICogICAgIFlvdSBtdXN0IE5PVCBvd24gYW55IGxvY2tzIHRoYXQgYXJlIG5lZWRlZCBieSB0aGUgcGVyaW9kaWMgd29yawotICogICAgIGZ1bmN0aW9uIHRoYXQgaXMgY3VycmVudGx5IGluc3RhbGxlZC4gIElmIHlvdSBETywgYSBkZWFkbG9jayBtYXkgcmVzdWx0LAotICogICAgIGJlY2F1c2Ugc3RvcHBpbmcgdGhlIHBlcmlvZGljIHdvcmsgb2Z0ZW4gaW52b2x2ZXMgd2FpdGluZyBmb3IgdGhlIGxhc3QKLSAqICAgICBpdGVyYXRpb24gb2YgdGhlIHBlcmlvZGljIHdvcmsgZnVuY3Rpb24gdG8gY29tcGxldGUuICBBZ2FpbiwgaWYgeW91IGhpdAotICogICAgIHRoaXMgZGVhZGxvY2ssIHlvdSB3aWxsIGdldCBodW5nIHVwIGluIGFuIGluZmluaXRlIGxvb3Agc2F5aW5nCi0gKiAgICAgIndhaXRpbmcgZm9yIGRlbGF5ZWQgd29yay4uLiIuCi0gKi8KLWJvb2wgdmlzb3JfcGVyaW9kaWNfd29ya19zdG9wKHN0cnVjdCBwZXJpb2RpY193b3JrICpwdykKLXsKLQlib29sIHN0b3BwZWRfc29tZXRoaW5nID0gZmFsc2U7Ci0KLQl3cml0ZV9sb2NrKCZwdy0+bG9jayk7Ci0Jc3RvcHBlZF9zb21ldGhpbmcgPSBwdy0+aXNfc2NoZWR1bGVkICYmICghcHctPndhbnRfdG9fc3RvcCk7Ci0Jd2hpbGUgKHB3LT5pc19zY2hlZHVsZWQpIHsKLQkJcHctPndhbnRfdG9fc3RvcCA9IHRydWU7Ci0JCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZwdy0+d29yaykpIHsKLQkJCS8qIFdlIGdldCBoZXJlIGlmIHRoZSBkZWxheWVkIHdvcmsgd2FzIHBlbmRpbmcgYXMKLQkJCSAqIGRlbGF5ZWQgd29yaywgYnV0IHdhcyBOT1QgcnVuLgotCQkJICovCi0JCQlXQVJOX09OKCFwdy0+aXNfc2NoZWR1bGVkKTsKLQkJCXB3LT5pc19zY2hlZHVsZWQgPSBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCS8qIElmIHdlIGdldCBoZXJlLCBlaXRoZXIgdGhlIGRlbGF5ZWQgd29yazoKLQkJCSAqIC0gd2FzIHJ1biwgT1IsCi0JCQkgKiAtIGlzIHJ1bm5pbmcgUklHSFQgTk9XIG9uIGFub3RoZXIgcHJvY2Vzc29yLCBPUiwKLQkJCSAqIC0gd2Fzbid0IGV2ZW4gc2NoZWR1bGVkICh0aGVyZSBpcyBhIG1pbmlzY3VsZQotCQkJICogICB0aW1pbmcgd2luZG93IHdoZXJlIHRoaXMgY291bGQgYmUgdGhlIGNhc2UpCi0JCQkgKiBmbHVzaF93b3JrcXVldWUoKSB3b3VsZCBtYWtlIHN1cmUgaXQgaXMgZmluaXNoZWQKLQkJCSAqIGV4ZWN1dGluZywgYnV0IHRoYXQgc3RpbGwgaXNuJ3QgdmVyeSB1c2VmdWwsIHdoaWNoCi0JCQkgKiBleHBsYWlucyB0aGUgbG9vcC4uLgotCQkJICovCi0JCX0KLQkJaWYgKHB3LT5pc19zY2hlZHVsZWQpIHsKLQkJCXdyaXRlX3VubG9jaygmcHctPmxvY2spOwotCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKLQkJCXdyaXRlX2xvY2soJnB3LT5sb2NrKTsKLQkJfSBlbHNlIHsKLQkJCXB3LT53YW50X3RvX3N0b3AgPSBmYWxzZTsKLQkJfQotCX0KLQl3cml0ZV91bmxvY2soJnB3LT5sb2NrKTsKLQlyZXR1cm4gc3RvcHBlZF9zb21ldGhpbmc7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wZXJpb2RpY193b3JrX3N0b3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92YnVzY2hhbm5lbC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92YnVzY2hhbm5lbC5oCmluZGV4IDkwZmExMmUuLmU5NzkxNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmJ1c2NoYW5uZWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3ZidXNjaGFubmVsLmgKQEAgLTIzLDcgKzIzLDYgQEAKICAqICB0aGUgY2xpZW50IGRldmljZXMgYW5kIGNsaWVudCBkcml2ZXJzIGZvciB0aGUgc2VydmVyIGVuZCB0byBzZWUuCiAgKi8KICNpbmNsdWRlIDxsaW51eC91dWlkLmg+Ci0jaW5jbHVkZSAidmJ1c2RldmljZWluZm8uaCIKICNpbmNsdWRlICJjaGFubmVsLmgiCiAKIC8qIHsxOTNiMzMxYi1jNThmLTExZGEtOTVhOS0wMGUwODE2MTE2NWZ9ICovCkBAIC01OCw2ICs1NywyMTYgQEAKIAkJCQkgICBhY3R1YWxfYnl0ZXMpKQogCiAjcHJhZ21hIHBhY2socHVzaCwgMSkJCS8qIGJvdGggR0NDIGFuZCBWQyBub3cgYWxsb3cgdGhpcyBwcmFnbWEgKi8KKworLyoKKyAqIEFuIGFycmF5IG9mIHRoaXMgc3RydWN0IGlzIHByZXNlbnQgaW4gdGhlIGNoYW5uZWwgYXJlYSBmb3IgZWFjaCB2YnVzLgorICogKFNlZSB2YnVzY2hhbm5lbC5oLikKKyAqIEl0IGlzIGZpbGxlZCBpbiBieSB0aGUgY2xpZW50IHNpZGUgdG8gcHJvdmlkZSBpbmZvIGFib3V0IHRoZSBkZXZpY2UKKyAqIGFuZCBkcml2ZXIgZnJvbSB0aGUgY2xpZW50J3MgcGVyc3BlY3RpdmUuCisgKi8KK3N0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8geworCXU4IGRldnR5cGVbMTZdOwkJLyogc2hvcnQgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBkZXZpY2UgdHlwZSAqLworCXU4IGRydm5hbWVbMTZdOwkJLyogZHJpdmVyIC5zeXMgZmlsZSBuYW1lICovCisJdTggaW5mb3N0cnNbOTZdOwkvKiBrZXJuZWwgdmVyc2lvbiAqLworCXU4IHJlc2VydmVkWzEyOF07CS8qIHBhZCBzaXplIHRvIDI1NiBieXRlcyAqLworfTsKKworLyoqCisgKiB2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIoKSAtIHJlbW92ZSBub24tcHJpbnRhYmxlIGNoYXJzIGZyb20gYnVmZmVyCisgKiBAcDogZGVzdGluYXRpb24gYnVmZmVyIHdoZXJlIGNoYXJzIGFyZSB3cml0dGVuIHRvCisgKiBAcmVtYWluOiBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiBzdGFydGluZyBhdCAjcAorICogQHNyYzogcG9pbnRlciB0byBzb3VyY2UgYnVmZmVyCisgKiBAc3JjbWF4OiBudW1iZXIgb2YgdmFsaWQgY2hhcmFjdGVycyBhdCAjc3JjCisgKgorICogUmVhZHMgY2hhcnMgZnJvbSB0aGUgYnVmZmVyIGF0IEBzcmMgZm9yIEBzcmNtYXggYnl0ZXMsIGFuZCB3cml0ZXMgdG8KKyAqIHRoZSBidWZmZXIgYXQgQHAsIHdoaWNoIGlzIEByZW1haW4gYnl0ZXMgbG9uZywgZW5zdXJpbmcgbmV2ZXIgdG8KKyAqIG92ZXJmbG93IHRoZSBidWZmZXIgYXQgQHAsIHVzaW5nIHRoZSBmb2xsb3dpbmcgcnVsZXM6CisgKiAtIHByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBzaW1wbHkgY29waWVkIGZyb20gdGhlIGJ1ZmZlciBhdCBAc3JjIHRvIHRoZQorICogICBidWZmZXIgYXQgQHAKKyAqIC0gaW50ZXJ2ZW5pbmcgc3RyZWFrcyBvZiBub24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gdGhlIGJ1ZmZlciBhdCBAc3JjCisgKiAgIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGluIHRoZSBidWZmZXIgYXQgQHAKKyAqIE5vdGUgdGhhdCB3ZSBwYXkgbm8gYXR0ZW50aW9uIHRvICdcMCctdGVybWluYXRpb24uCisgKgorICogUGFzcyBAcCA9PSBOVUxMIGFuZCBAcmVtYWluID09IDAgZm9yIHRoaXMgc3BlY2lhbCBiZWhhdmlvciAtLSBJbiB0aGlzCisgKiBjYXNlLCB3ZSBzaW1wbHkgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBXT1VMRCBIQVZFIGJlZW4gd3JpdHRlbgorICogdG8gYSBidWZmZXIgYXQgQHAsIGhhZCBpdCBiZWVuIGluZmluaXRlbHkgYmlnLgorICoKKyAqIFJldHVybjogdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIEBwIChvciBXT1VMRCBIQVZFIGJlZW4gd3JpdHRlbiB0bworICogICAgICAgICBAcCwgYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgpCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIoY2hhciAqcCwgaW50IHJlbWFpbiwgY2hhciAqc3JjLCBpbnQgc3JjbWF4KQoreworCWludCBjaGFycyA9IDA7CisJaW50IG5vbnByaW50YWJsZV9zdHJlYWsgPSAwOworCisJd2hpbGUgKHNyY21heCA+IDApIHsKKwkJaWYgKCgqc3JjID49ICcgJykgJiYgKCpzcmMgPCAweDdmKSkgeworCQkJaWYgKG5vbnByaW50YWJsZV9zdHJlYWspIHsKKwkJCQlpZiAocmVtYWluID4gMCkgeworCQkJCQkqcCA9ICcgJzsKKwkJCQkJcCsrOworCQkJCQlyZW1haW4tLTsKKwkJCQkJY2hhcnMrKzsKKwkJCQl9IGVsc2UgaWYgKCFwKSB7CisJCQkJCWNoYXJzKys7CisJCQkJfQorCQkJCW5vbnByaW50YWJsZV9zdHJlYWsgPSAwOworCQkJfQorCQkJaWYgKHJlbWFpbiA+IDApIHsKKwkJCQkqcCA9ICpzcmM7CisJCQkJcCsrOworCQkJCXJlbWFpbi0tOworCQkJCWNoYXJzKys7CisJCQl9IGVsc2UgaWYgKCFwKSB7CisJCQkJY2hhcnMrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW5vbnByaW50YWJsZV9zdHJlYWsgPSAxOworCQl9CisJCXNyYysrOworCQlzcmNtYXgtLTsKKwl9CisJcmV0dXJuIGNoYXJzOworfQorCisjZGVmaW5lIFZCVVNDSEFOTkVMX0FEREFDSEFSKGNoLCBwLCByZW1haW4sIGNoYXJzKSBcCisJZG8gewkJCQkJICAgXAorCQlpZiAocmVtYWluIDw9IDApCQkgICBcCisJCQlicmVhazsJCQkgICBcCisJCSpwID0gY2g7CQkJICAgXAorCQlwKys7ICBjaGFycysrOyAgcmVtYWluLS07CSAgIFwKKwl9IHdoaWxlICgwKQorCisvKioKKyAqIHZidXNjaGFubmVsX2l0b2EoKSAtIGNvbnZlcnQgbm9uLW5lZ2F0aXZlIGludCB0byBzdHJpbmcKKyAqIEBwOiBkZXN0aW5hdGlvbiBzdHJpbmcKKyAqIEByZW1haW46IG1heCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgd3JpdHRlbiB0byBAcAorICogQG51bTogaW5wdXQgaW50IHRvIGNvbnZlcnQKKyAqCisgKiBDb252ZXJ0cyB0aGUgbm9uLW5lZ2F0aXZlIHZhbHVlIGF0IEBudW0gdG8gYW4gYXNjaWkgZGVjaW1hbCBzdHJpbmcKKyAqIGF0IEBwLCB3cml0aW5nIGF0IG1vc3QgQHJlbWFpbiBieXRlcy4gIE5vdGUgdGhlcmUgaXMgTk8gJ1wwJyB0ZXJtaW5hdGlvbgorICogd3JpdHRlbiB0byBAcC4KKyAqCisgKiBSZXR1cm46IG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIEBwCisgKgorICovCitzdGF0aWMgaW5saW5lIGludAordmJ1c2NoYW5uZWxfaXRvYShjaGFyICpwLCBpbnQgcmVtYWluLCBpbnQgbnVtKQoreworCWludCBkaWdpdHMgPSAwOworCWNoYXIgc1szMl07CisJaW50IGk7CisKKwlpZiAobnVtID09IDApIHsKKwkJLyogJzAnIGlzIGEgc3BlY2lhbCBjYXNlICovCisJCWlmIChyZW1haW4gPD0gMCkKKwkJCXJldHVybiAwOworCQkqcCA9ICcwJzsKKwkJcmV0dXJuIDE7CisJfQorCS8qIGZvcm0gYSBiYWNrd2FyZHMgZGVjaW1hbCBhc2NpaSBzdHJpbmcgaW4gPHM+ICovCisJd2hpbGUgKG51bSA+IDApIHsKKwkJaWYgKGRpZ2l0cyA+PSAoaW50KXNpemVvZihzKSkKKwkJCXJldHVybiAwOworCQlzW2RpZ2l0cysrXSA9IChudW0gJSAxMCkgKyAnMCc7CisJCW51bSA9IG51bSAvIDEwOworCX0KKwlpZiAocmVtYWluIDwgZGlnaXRzKSB7CisJCS8qIG5vdCBlbm91Z2ggcm9vbSBsZWZ0IGF0IDxwPiB0byBob2xkIG51bWJlciwgc28gZmlsbCB3aXRoCisJCSAqICc/JworCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHJlbWFpbjsgaSsrLCBwKyspCisJCQkqcCA9ICc/JzsKKwkJcmV0dXJuIHJlbWFpbjsKKwl9CisJLyogcGx1ZyBpbiB0aGUgZGVjaW1hbCBhc2NpaSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIsIGJ5ICovCisJLyogcmV2ZXJzaW5nIHRoZSBzdHJpbmcgd2UganVzdCBidWlsdCBpbiA8cz4gKi8KKwlpID0gZGlnaXRzOworCXdoaWxlIChpID4gMCkgeworCQlpLS07CisJCSpwID0gc1tpXTsKKwkJcCsrOworCX0KKwlyZXR1cm4gZGlnaXRzOworfQorCisvKioKKyAqIHZidXNjaGFubmVsX2RldmluZm9fdG9fc3RyaW5nKCkgLSBmb3JtYXQgYSBzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSBwcmludGFibGUgc3RyaW5nCisgKiBAZGV2aW5mbzogdGhlIHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gdG8gZm9ybWF0CisgKiBAcDogZGVzdGluYXRpb24gc3RyaW5nIGFyZWEKKyAqIEByZW1haW46IHNpemUgb2YgZGVzdGluYXRpb24gc3RyaW5nIGFyZWEgaW4gYnl0ZXMKKyAqIEBkZXZpeDogdGhlIGRldmljZSBpbmRleCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGRhdGEsIG9yIC0xIGlmIG5vCisgKiAgICAgICAgIGRldmljZSBpbmRleCBpcyB0byBiZSBpbmNsdWRlZAorICoKKyAqIFJlYWRzIEBkZXZJbmZvLCBhbmQgY29udmVydHMgaXRzIGNvbnRlbnRzIHRvIGEgcHJpbnRhYmxlIHN0cmluZyBhdCBAcCwKKyAqIHdyaXRpbmcgYXQgbW9zdCBAcmVtYWluIGJ5dGVzLiBOb3RlIHRoZXJlIGlzIE5PICdcMCcgdGVybWluYXRpb24KKyAqIHdyaXR0ZW4gdG8gQHAuCisgKgorICogUmV0dXJuOiBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBAcAorICovCitzdGF0aWMgaW5saW5lIGludAordmJ1c2NoYW5uZWxfZGV2aW5mb190b19zdHJpbmcoc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqZGV2aW5mbywKKwkJCSAgICAgIGNoYXIgKnAsIGludCByZW1haW4sIGludCBkZXZpeCkKK3sKKwljaGFyICpwc3JjOworCWludCBuc3JjLCB4LCBpLCBwYWQ7CisJaW50IGNoYXJzID0gMDsKKworCXBzcmMgPSAmZGV2aW5mby0+ZGV2dHlwZVswXTsKKwluc3JjID0gc2l6ZW9mKGRldmluZm8tPmRldnR5cGUpOworCWlmICh2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIoTlVMTCwgMCwgcHNyYywgbnNyYykgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBlbWl0IGRldmljZSBpbmRleCAqLworCWlmIChkZXZpeCA+PSAwKSB7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCdbJywgcCwgcmVtYWluLCBjaGFycyk7CisJCXggPSB2YnVzY2hhbm5lbF9pdG9hKHAsIHJlbWFpbiwgZGV2aXgpOworCQlwICs9IHg7CisJCXJlbWFpbiAtPSB4OworCQljaGFycyArPSB4OworCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignXScsIHAsIHJlbWFpbiwgY2hhcnMpOworCX0gZWxzZSB7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7CisJfQorCisJLyogZW1pdCBkZXZpY2UgdHlwZSAqLworCXggPSB2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIocCwgcmVtYWluLCBwc3JjLCBuc3JjKTsKKwlwICs9IHg7CisJcmVtYWluIC09IHg7CisJY2hhcnMgKz0geDsKKwlwYWQgPSAxNSAtIHg7CQkvKiBwYWQgZGV2aWNlIHR5cGUgdG8gYmUgZXhhY3RseSAxNSBjaGFycyAqLworCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykKKwkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKwlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCisJLyogZW1pdCBkcml2ZXIgbmFtZSAqLworCXBzcmMgPSAmZGV2aW5mby0+ZHJ2bmFtZVswXTsKKwluc3JjID0gc2l6ZW9mKGRldmluZm8tPmRydm5hbWUpOworCXggPSB2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIocCwgcmVtYWluLCBwc3JjLCBuc3JjKTsKKwlwICs9IHg7CisJcmVtYWluIC09IHg7CisJY2hhcnMgKz0geDsKKwlwYWQgPSAxNSAtIHg7CQkvKiBwYWQgZHJpdmVyIG5hbWUgdG8gYmUgZXhhY3RseSAxNSBjaGFycyAqLworCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykKKwkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKKwlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOworCisJLyogZW1pdCBzdHJpbmdzICovCisJcHNyYyA9ICZkZXZpbmZvLT5pbmZvc3Ryc1swXTsKKwluc3JjID0gc2l6ZW9mKGRldmluZm8tPmluZm9zdHJzKTsKKwl4ID0gdmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKHAsIHJlbWFpbiwgcHNyYywgbnNyYyk7CisJcCArPSB4OworCXJlbWFpbiAtPSB4OworCWNoYXJzICs9IHg7CisJVkJVU0NIQU5ORUxfQUREQUNIQVIoJ1xuJywgcCwgcmVtYWluLCBjaGFycyk7CisKKwlyZXR1cm4gY2hhcnM7Cit9CisKIHN0cnVjdCBzcGFyX3ZidXNfaGVhZGVyaW5mbyB7CiAJdTMyIHN0cnVjdF9ieXRlczsJLyogc2l6ZSBvZiB0aGlzIHN0cnVjdCBpbiBieXRlcyAqLwogCXUzMiBkZXZpY2VfaW5mb19zdHJ1Y3RfYnl0ZXM7CS8qIHNpemVvZihVTFRSQV9WQlVTX0RFVklDRUlORk8pICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3ZidXNkZXZpY2VpbmZvLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3ZidXNkZXZpY2VpbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZGFiNGEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92YnVzZGV2aWNlaW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTUgVU5JU1lTIENPUlBPUkFUSU9OCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLSNpZm5kZWYgX19WQlVTREVWSUNFSU5GT19IX18KLSNkZWZpbmUgX19WQlVTREVWSUNFSU5GT19IX18KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNwcmFnbWEgcGFjayhwdXNoLCAxKQkJLyogYm90aCBHQ0MgYW5kIFZDIG5vdyBhbGxvdyB0aGlzIHByYWdtYSAqLwotCi0vKiBBbiBhcnJheSBvZiB0aGlzIHN0cnVjdCBpcyBwcmVzZW50IGluIHRoZSBjaGFubmVsIGFyZWEgZm9yIGVhY2ggdmJ1cy4KLSAqIChTZWUgdmJ1c2NoYW5uZWwuaC4pCi0gKiBJdCBpcyBmaWxsZWQgaW4gYnkgdGhlIGNsaWVudCBzaWRlIHRvIHByb3ZpZGUgaW5mbyBhYm91dCB0aGUgZGV2aWNlCi0gKiBhbmQgZHJpdmVyIGZyb20gdGhlIGNsaWVudCdzIHBlcnNwZWN0aXZlLgotICovCi1zdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvIHsKLQl1OCBkZXZ0eXBlWzE2XTsJCS8qIHNob3J0IHN0cmluZyBpZGVudGlmeWluZyB0aGUgZGV2aWNlIHR5cGUgKi8KLQl1OCBkcnZuYW1lWzE2XTsJCS8qIGRyaXZlciAuc3lzIGZpbGUgbmFtZSAqLwotCXU4IGluZm9zdHJzWzk2XTsJLyogc2VxdWVuY2Ugb2YgdGFiLWRlbGltaXRlZCBpZCBzdHJpbmdzOiAqLwotCS8qIDxEUklWRVJfUkVWPiA8RFJJVkVSX1ZFUlRBRz4gPERSSVZFUl9DT01QSUxFVElNRT4gKi8KLQl1OCByZXNlcnZlZFsxMjhdOwkvKiBwYWQgc2l6ZSB0byAyNTYgYnl0ZXMgKi8KLX07Ci0KLSNwcmFnbWEgcGFjayhwb3ApCi0KLS8qIFJlYWRzIGNoYXJzIGZyb20gdGhlIGJ1ZmZlciBhdCA8c3JjPiBmb3IgPHNyY21heD4gYnl0ZXMsIGFuZCB3cml0ZXMgdG8KLSAqIHRoZSBidWZmZXIgYXQgPHA+LCB3aGljaCBpcyA8cmVtYWluPiBieXRlcyBsb25nLCBlbnN1cmluZyBuZXZlciB0bwotICogb3ZlcmZsb3cgdGhlIGJ1ZmZlciBhdCA8cD4sIHVzaW5nIHRoZSBmb2xsb3dpbmcgcnVsZXM6Ci0gKiAtIHByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBzaW1wbHkgY29waWVkIGZyb20gdGhlIGJ1ZmZlciBhdCA8c3JjPiB0byB0aGUKLSAqICAgYnVmZmVyIGF0IDxwPgotICogLSBpbnRlcnZlbmluZyBzdHJlYWtzIG9mIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBpbiB0aGUgYnVmZmVyIGF0IDxzcmM+Ci0gKiAgIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGluIHRoZSBidWZmZXIgYXQgPHA+Ci0gKiBOb3RlIHRoYXQgd2UgcGF5IG5vIGF0dGVudGlvbiB0byAnXDAnLXRlcm1pbmF0aW9uLgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gPHA+LgotICoKLSAqIFBhc3MgPHA+ID09IE5VTEwgYW5kIDxyZW1haW4+ID09IDAgZm9yIHRoaXMgc3BlY2lhbCBiZWhhdmlvci4gIEluIHRoaXMKLSAqIGNhc2UsIHdlIHNpbXBseSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IFdPVUxEIEhBVkUgYmVlbiB3cml0dGVuCi0gKiB0byBhIGJ1ZmZlciBhdCA8cD4sIGhhZCBpdCBiZWVuIGluZmluaXRlbHkgYmlnLgotICovCi1zdGF0aWMgaW5saW5lIGludAotdmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKGNoYXIgKnAsIGludCByZW1haW4sIGNoYXIgKnNyYywgaW50IHNyY21heCkKLXsKLQlpbnQgY2hhcnMgPSAwOwotCWludCBub25wcmludGFibGVfc3RyZWFrID0gMDsKLQotCXdoaWxlIChzcmNtYXggPiAwKSB7Ci0JCWlmICgoKnNyYyA+PSAnICcpICYmICgqc3JjIDwgMHg3ZikpIHsKLQkJCWlmIChub25wcmludGFibGVfc3RyZWFrKSB7Ci0JCQkJaWYgKHJlbWFpbiA+IDApIHsKLQkJCQkJKnAgPSAnICc7Ci0JCQkJCXArKzsKLQkJCQkJcmVtYWluLS07Ci0JCQkJCWNoYXJzKys7Ci0JCQkJfSBlbHNlIGlmICghcCkgewotCQkJCQljaGFycysrOwotCQkJCX0KLQkJCQlub25wcmludGFibGVfc3RyZWFrID0gMDsKLQkJCX0KLQkJCWlmIChyZW1haW4gPiAwKSB7Ci0JCQkJKnAgPSAqc3JjOwotCQkJCXArKzsKLQkJCQlyZW1haW4tLTsKLQkJCQljaGFycysrOwotCQkJfSBlbHNlIGlmICghcCkgewotCQkJCWNoYXJzKys7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlub25wcmludGFibGVfc3RyZWFrID0gMTsKLQkJfQotCQlzcmMrKzsKLQkJc3JjbWF4LS07Ci0JfQotCXJldHVybiBjaGFyczsKLX0KLQotI2RlZmluZSBWQlVTQ0hBTk5FTF9BRERBQ0hBUihjaCwgcCwgcmVtYWluLCBjaGFycykgXAotCWRvIHsJCQkJCSAgIFwKLQkJaWYgKHJlbWFpbiA8PSAwKQkJICAgXAotCQkJYnJlYWs7CQkJICAgXAotCQkqcCA9IGNoOwkJCSAgIFwKLQkJcCsrOyAgY2hhcnMrKzsgIHJlbWFpbi0tOwkgICBcCi0JfSB3aGlsZSAoMCkKLQotLyogQ29udmVydHMgdGhlIG5vbi1uZWdhdGl2ZSB2YWx1ZSBhdCA8bnVtPiB0byBhbiBhc2NpaSBkZWNpbWFsIHN0cmluZwotICogYXQgPHA+LCB3cml0aW5nIGF0IG1vc3QgPHJlbWFpbj4gYnl0ZXMuICBOb3RlIHRoZXJlIGlzIE5PICdcMCcgdGVybWluYXRpb24KLSAqIHdyaXR0ZW4gdG8gPHA+LgotICoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIDxwPi4KLSAqCi0gKiBOb3RlIHRoYXQgd2UgY3JlYXRlIHRoaXMgZnVuY3Rpb24gYmVjYXVzZSB3ZSBuZWVkIHRvIGRvIHRoaXMgb3BlcmF0aW9uIGluCi0gKiBhbiBlbnZpcm9ubWVudC1pbmRlcGVuZGVudCB3YXkgKHNpbmNlIHdlIGFyZSBpbiBhIGNvbW1vbiBoZWFkZXIgZmlsZSkuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci12YnVzY2hhbm5lbF9pdG9hKGNoYXIgKnAsIGludCByZW1haW4sIGludCBudW0pCi17Ci0JaW50IGRpZ2l0cyA9IDA7Ci0JY2hhciBzWzMyXTsKLQlpbnQgaTsKLQotCWlmIChudW0gPT0gMCkgewotCQkvKiAnMCcgaXMgYSBzcGVjaWFsIGNhc2UgKi8KLQkJaWYgKHJlbWFpbiA8PSAwKQotCQkJcmV0dXJuIDA7Ci0JCSpwID0gJzAnOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogZm9ybSBhIGJhY2t3YXJkcyBkZWNpbWFsIGFzY2lpIHN0cmluZyBpbiA8cz4gKi8KLQl3aGlsZSAobnVtID4gMCkgewotCQlpZiAoZGlnaXRzID49IChpbnQpc2l6ZW9mKHMpKQotCQkJcmV0dXJuIDA7Ci0JCXNbZGlnaXRzKytdID0gKG51bSAlIDEwKSArICcwJzsKLQkJbnVtID0gbnVtIC8gMTA7Ci0JfQotCWlmIChyZW1haW4gPCBkaWdpdHMpIHsKLQkJLyogbm90IGVub3VnaCByb29tIGxlZnQgYXQgPHA+IHRvIGhvbGQgbnVtYmVyLCBzbyBmaWxsIHdpdGgKLQkJICogJz8nCi0JCSAqLwotCQlmb3IgKGkgPSAwOyBpIDwgcmVtYWluOyBpKyssIHArKykKLQkJCSpwID0gJz8nOwotCQlyZXR1cm4gcmVtYWluOwotCX0KLQkvKiBwbHVnIGluIHRoZSBkZWNpbWFsIGFzY2lpIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG51bWJlciwgYnkgKi8KLQkvKiByZXZlcnNpbmcgdGhlIHN0cmluZyB3ZSBqdXN0IGJ1aWx0IGluIDxzPiAqLwotCWkgPSBkaWdpdHM7Ci0Jd2hpbGUgKGkgPiAwKSB7Ci0JCWktLTsKLQkJKnAgPSBzW2ldOwotCQlwKys7Ci0JfQotCXJldHVybiBkaWdpdHM7Ci19Ci0KLS8qIFJlYWRzIDxkZXZJbmZvPiwgYW5kIGNvbnZlcnRzIGl0cyBjb250ZW50cyB0byBhIHByaW50YWJsZSBzdHJpbmcgYXQgPHA+LAotICogd3JpdGluZyBhdCBtb3N0IDxyZW1haW4+IGJ5dGVzLiAgTm90ZSB0aGVyZSBpcyBOTyAnXDAnIHRlcm1pbmF0aW9uCi0gKiB3cml0dGVuIHRvIDxwPi4KLSAqCi0gKiBQYXNzIDxkZXZpeD4gPj0gMCBpZiB5b3Ugd2FudCBhIGRldmljZSBpbmRleCBwcmVzZW50ZWQuCi0gKgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gPHA+LgotICovCi1zdGF0aWMgaW5saW5lIGludAotdmJ1c2NoYW5uZWxfZGV2aW5mb190b19zdHJpbmcoc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqZGV2aW5mbywKLQkJCSAgICAgIGNoYXIgKnAsIGludCByZW1haW4sIGludCBkZXZpeCkKLXsKLQljaGFyICpwc3JjOwotCWludCBuc3JjLCB4LCBpLCBwYWQ7Ci0JaW50IGNoYXJzID0gMDsKLQotCXBzcmMgPSAmZGV2aW5mby0+ZGV2dHlwZVswXTsKLQluc3JjID0gc2l6ZW9mKGRldmluZm8tPmRldnR5cGUpOwotCWlmICh2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIoTlVMTCwgMCwgcHNyYywgbnNyYykgPD0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBlbWl0IGRldmljZSBpbmRleCAqLwotCWlmIChkZXZpeCA+PSAwKSB7Ci0JCVZCVVNDSEFOTkVMX0FEREFDSEFSKCdbJywgcCwgcmVtYWluLCBjaGFycyk7Ci0JCXggPSB2YnVzY2hhbm5lbF9pdG9hKHAsIHJlbWFpbiwgZGV2aXgpOwotCQlwICs9IHg7Ci0JCXJlbWFpbiAtPSB4OwotCQljaGFycyArPSB4OwotCQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignXScsIHAsIHJlbWFpbiwgY2hhcnMpOwotCX0gZWxzZSB7Ci0JCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7Ci0JCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7Ci0JCVZCVVNDSEFOTkVMX0FEREFDSEFSKCcgJywgcCwgcmVtYWluLCBjaGFycyk7Ci0JfQotCi0JLyogZW1pdCBkZXZpY2UgdHlwZSAqLwotCXggPSB2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIocCwgcmVtYWluLCBwc3JjLCBuc3JjKTsKLQlwICs9IHg7Ci0JcmVtYWluIC09IHg7Ci0JY2hhcnMgKz0geDsKLQlwYWQgPSAxNSAtIHg7CQkvKiBwYWQgZGV2aWNlIHR5cGUgdG8gYmUgZXhhY3RseSAxNSBjaGFycyAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykKLQkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKLQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOwotCi0JLyogZW1pdCBkcml2ZXIgbmFtZSAqLwotCXBzcmMgPSAmZGV2aW5mby0+ZHJ2bmFtZVswXTsKLQluc3JjID0gc2l6ZW9mKGRldmluZm8tPmRydm5hbWUpOwotCXggPSB2YnVzY2hhbm5lbF9zYW5pdGl6ZV9idWZmZXIocCwgcmVtYWluLCBwc3JjLCBuc3JjKTsKLQlwICs9IHg7Ci0JcmVtYWluIC09IHg7Ci0JY2hhcnMgKz0geDsKLQlwYWQgPSAxNSAtIHg7CQkvKiBwYWQgZHJpdmVyIG5hbWUgdG8gYmUgZXhhY3RseSAxNSBjaGFycyAqLwotCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykKLQkJVkJVU0NIQU5ORUxfQUREQUNIQVIoJyAnLCBwLCByZW1haW4sIGNoYXJzKTsKLQlWQlVTQ0hBTk5FTF9BRERBQ0hBUignICcsIHAsIHJlbWFpbiwgY2hhcnMpOwotCi0JLyogZW1pdCBzdHJpbmdzICovCi0JcHNyYyA9ICZkZXZpbmZvLT5pbmZvc3Ryc1swXTsKLQluc3JjID0gc2l6ZW9mKGRldmluZm8tPmluZm9zdHJzKTsKLQl4ID0gdmJ1c2NoYW5uZWxfc2FuaXRpemVfYnVmZmVyKHAsIHJlbWFpbiwgcHNyYywgbnNyYyk7Ci0JcCArPSB4OwotCXJlbWFpbiAtPSB4OwotCWNoYXJzICs9IHg7Ci0JVkJVU0NIQU5ORUxfQUREQUNIQVIoJ1xuJywgcCwgcmVtYWluLCBjaGFycyk7Ci0KLQlyZXR1cm4gY2hhcnM7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmJ1c19tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yYnVzX21haW4uYwppbmRleCBkMzJiODk4Li5mZWMwYTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yYnVzX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yYnVzX21haW4uYwpAQCAtMTgsNjIgKzE4LDIyIEBACiAKICNpbmNsdWRlICJ2aXNvcmJ1cy5oIgogI2luY2x1ZGUgInZpc29yYnVzX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0jaW5jbHVkZSAicGVyaW9kaWNfd29yay5oIgotI2luY2x1ZGUgInZidXNjaGFubmVsLmgiCi0jaW5jbHVkZSAiZ3Vlc3RsaW51eGRlYnVnLmgiCiAjaW5jbHVkZSAidm1jYWxsaW50ZXJmYWNlLmgiCiAKICNkZWZpbmUgTVlEUlZOQU1FICJ2aXNvcmJ1cyIKIAogLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KLXN0YXRpYyBpbnQgdmlzb3JidXNfZGVidWc7CiBzdGF0aWMgaW50IHZpc29yYnVzX2ZvcmNlbWF0Y2g7CiBzdGF0aWMgaW50IHZpc29yYnVzX2ZvcmNlbm9tYXRjaDsKLXN0YXRpYyBpbnQgdmlzb3JidXNfZGVidWdyZWY7Ci0jZGVmaW5lIFNFUklBTExPT1BCQUNLQ0hBTkFERFIgKDEwMCAqIDEwMjQgKiAxMDI0KQogCiAvKiBEaXNwbGF5IHN0cmluZyB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgbm8gbG9uZ2VyIHRoZSA5OSBjaGFyYWN0ZXJzKi8KICNkZWZpbmUgTElORVNJWkUgOTkKIAogI2RlZmluZSBDVVJSRU5UX0ZJTEVfUEMgVklTT1JfQlVTX1BDX3Zpc29yYnVzX21haW5fYwotI2RlZmluZSBQT0xMSklGRklFU19URVNUV09SSyAgICAgICAgIDEwMAogI2RlZmluZSBQT0xMSklGRklFU19OT1JNQUxDSEFOTkVMICAgICAxMAogCiBzdGF0aWMgaW50IGJ1c3JlZ19yYyA9IC1FTk9ERVY7IC8qIHN0b3JlcyB0aGUgcmVzdWx0IGZyb20gYnVzIHJlZ2lzdHJhdGlvbiAqLwogCi1zdGF0aWMgaW50IHZpc29yYnVzX3VldmVudChzdHJ1Y3QgZGV2aWNlICp4ZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpOwotc3RhdGljIGludCB2aXNvcmJ1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICp4ZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqeGRydik7Ci1zdGF0aWMgdm9pZCBmaXhfdmJ1c19kZXZfaW5mbyhzdHJ1Y3Qgdmlzb3JfZGV2aWNlICp2aXNvcmRldik7Ci0KLS8qICBCVVMgdHlwZSBhdHRyaWJ1dGVzCi0gKgotICogIGRlZmluZSAmIGltcGxlbWVudCBkaXNwbGF5IG9mIGJ1cyBhdHRyaWJ1dGVzIHVuZGVyCi0gKiAgL3N5cy9idXMvdmlzb3JidXMuCi0gKgotICovCi0KLXN0YXRpYyBzc2l6ZV90IHZlcnNpb25fc2hvdyhzdHJ1Y3QgYnVzX3R5cGUgKmJ1cywgY2hhciAqYnVmKQotewotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBWRVJTSU9OKTsKLX0KLQotc3RhdGljIEJVU19BVFRSX1JPKHZlcnNpb24pOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmlzb3JidXNfYnVzX2F0dHJzW10gPSB7Ci0JJmJ1c19hdHRyX3ZlcnNpb24uYXR0ciwKLQlOVUxMLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdmlzb3JidXNfYnVzX2dyb3VwID0gewotCS5hdHRycyA9IHZpc29yYnVzX2J1c19hdHRycywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICp2aXNvcmJ1c19idXNfZ3JvdXBzW10gPSB7Ci0JJnZpc29yYnVzX2J1c19ncm91cCwKLQlOVUxMLAotfTsKLQogLyoKICAqIERFVklDRSB0eXBlIGF0dHJpYnV0ZXMKICAqCkBAIC0xMDYsNjEgKzY2LDE0IEBACiAJTlVMTCwKIH07CiAKLS8qKiBUaGlzIGRlc2NyaWJlcyB0aGUgVFlQRSBvZiBidXMuCi0gKiAgKERvbid0IGNvbmZ1c2UgdGhpcyB3aXRoIGFuIElOU1RBTkNFIG9mIHRoZSBidXMuKQotICovCi1zdHJ1Y3QgYnVzX3R5cGUgdmlzb3JidXNfdHlwZSA9IHsKLQkubmFtZSA9ICJ2aXNvcmJ1cyIsCi0JLm1hdGNoID0gdmlzb3JidXNfbWF0Y2gsCi0JLnVldmVudCA9IHZpc29yYnVzX3VldmVudCwKLQkuZGV2X2dyb3VwcyA9IHZpc29yYnVzX2Rldl9ncm91cHMsCi0JLmJ1c19ncm91cHMgPSB2aXNvcmJ1c19idXNfZ3JvdXBzLAotfTsKLQotc3RhdGljIHN0cnVjdCBkZWxheWVkX3dvcmsgcGVyaW9kaWNfd29yazsKLQotLyogWUVTLCB3ZSBuZWVkIDIgd29ya3F1ZXVlcy4KLSAqIFRoZSByZWFzb24gaXMsIHdvcmtpdGVtcyBvbiB0aGUgdGVzdCBxdWV1ZSBtYXkgbmVlZCB0byBjYW5jZWwKLSAqIHdvcmtpdGVtcyBvbiB0aGUgb3RoZXIgcXVldWUuICBZb3Ugd2lsbCBiZSBpbiBmb3IgdHJvdWJsZSBpZiB5b3UgdHJ5IHRvCi0gKiBkbyB0aGlzIHdpdGggd29ya2l0ZW1zIHF1ZXVlZCBvbiB0aGUgc2FtZSB3b3JrcXVldWUuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcGVyaW9kaWNfdGVzdF93b3JrcXVldWU7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnBlcmlvZGljX2Rldl93b3JrcXVldWU7Ci1zdGF0aWMgbG9uZyBsb25nIGJ1c19jb3VudDsJLyoqIG51bWJlciBvZiBidXMgaW5zdGFuY2VzICovCi0JCQkJCS8qKiBldmVyLWluY3JlYXNpbmcgKi8KLQotc3RhdGljIHZvaWQgY2hpcHNldF9idXNfY3JlYXRlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKLXN0YXRpYyB2b2lkIGNoaXBzZXRfYnVzX2Rlc3Ryb3koc3RydWN0IHZpc29yX2RldmljZSAqYnVzX2luZm8pOwotc3RhdGljIHZvaWQgY2hpcHNldF9kZXZpY2VfY3JlYXRlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKLXN0YXRpYyB2b2lkIGNoaXBzZXRfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8pOwotc3RhdGljIHZvaWQgY2hpcHNldF9kZXZpY2VfcGF1c2Uoc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8pOwotc3RhdGljIHZvaWQgY2hpcHNldF9kZXZpY2VfcmVzdW1lKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKLQotLyoqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgaGVyZWluLCBhbmQgYXJlIGNhbGxlZCBieSB0aGUgY2hpcHNldAotICogIGRyaXZlciB0byBub3RpZnkgdXMgYWJvdXQgc3BlY2lmaWMgZXZlbnRzLgotICovCi1zdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzIGNoaXBzZXRfbm90aWZpZXJzID0gewotCS5idXNfY3JlYXRlID0gY2hpcHNldF9idXNfY3JlYXRlLAotCS5idXNfZGVzdHJveSA9IGNoaXBzZXRfYnVzX2Rlc3Ryb3ksCi0JLmRldmljZV9jcmVhdGUgPSBjaGlwc2V0X2RldmljZV9jcmVhdGUsCi0JLmRldmljZV9kZXN0cm95ID0gY2hpcHNldF9kZXZpY2VfZGVzdHJveSwKLQkuZGV2aWNlX3BhdXNlID0gY2hpcHNldF9kZXZpY2VfcGF1c2UsCi0JLmRldmljZV9yZXN1bWUgPSBjaGlwc2V0X2RldmljZV9yZXN1bWUsCi19OwotCi0vKiogVGhlc2UgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgY2hpcHNldCBkcml2ZXIsIGFuZCB3ZSBjYWxsIHRoZW0KLSAqICBoZXJlaW4gd2hlbiB3ZSB3YW50IHRvIGFja25vd2xlZGdlIGEgc3BlY2lmaWMgZXZlbnQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9yZXNwb25kZXJzIGNoaXBzZXRfcmVzcG9uZGVyczsKLQogLyogZmlsbGVkIGluIHdpdGggaW5mbyBhYm91dCBwYXJlbnQgY2hpcHNldCBkcml2ZXIgd2hlbiB3ZSByZWdpc3RlciB3aXRoIGl0ICovCiBzdGF0aWMgc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyBjaGlwc2V0X2RyaXZlcmluZm87CiAvKiBmaWxsZWQgaW4gd2l0aCBpbmZvIGFib3V0IHRoaXMgZHJpdmVyLCB3cnQgaXQgc2VydmljaW5nIGNsaWVudCBidXNzZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvIGNsaWVudGJ1c19kcml2ZXJpbmZvOwogCi0vKiogbGlzdCBvZiB2aXNvcl9kZXZpY2Ugc3RydWN0cywgbGlua2VkIHZpYSAubGlzdF9hbGwgKi8KKy8qIGxpc3Qgb2Ygdmlzb3JfZGV2aWNlIHN0cnVjdHMsIGxpbmtlZCB2aWEgLmxpc3RfYWxsICovCiBzdGF0aWMgTElTVF9IRUFEKGxpc3RfYWxsX2J1c19pbnN0YW5jZXMpOwotLyoqIGxpc3Qgb2Ygdmlzb3JfZGV2aWNlIHN0cnVjdHMsIGxpbmtlZCB2aWEgLmxpc3RfYWxsICovCisvKiBsaXN0IG9mIHZpc29yX2RldmljZSBzdHJ1Y3RzLCBsaW5rZWQgdmlhIC5saXN0X2FsbCAqLwogc3RhdGljIExJU1RfSEVBRChsaXN0X2FsbF9kZXZpY2VfaW5zdGFuY2VzKTsKIAogc3RhdGljIGludApAQCAtMTc3LDkgKzkwLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgdXBvbiBhZGRpbmcgYSB2aXNvcl9kZXZpY2UgKGRldmljZV9hZGQpLCBvcgotICogYWRkaW5nIGEgdmlzb3JfZHJpdmVyICh2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIpLCBhbmQgcmV0dXJucyAxIGlmZiB0aGUKLSAqIHByb3ZpZGVkIGRyaXZlciBjYW4gY29udHJvbCB0aGUgc3BlY2lmaWVkIGRldmljZS4KKy8qKgorICogdmlzb3JidXNfbWF0Y2goKSAtIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHVwb24gYWRkaW5nIGEgdmlzb3JfZGV2aWNlCisgKiAgICAgICAgICAgICAgICAgICAgKGRldmljZV9hZGQpLCBvciBhZGRpbmcgYSB2aXNvcl9kcml2ZXIKKyAqICAgICAgICAgICAgICAgICAgICAodmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKQorICogQHhkZXY6IHN0cnVjdCBkZXZpY2UgZm9yIHRoZSBkZXZpY2UgYmVpbmcgbWF0Y2hlZAorICogQHhkcnY6IHN0cnVjdCBkZXZpY2VfZHJpdmVyIGZvciBkcml2ZXIgdG8gbWF0Y2ggZGV2aWNlIGFnYWluc3QKKyAqCisgKiBSZXR1cm46IDEgaWZmIHRoZSBwcm92aWRlZCBkcml2ZXIgY2FuIGNvbnRyb2wgdGhlIHNwZWNpZmllZCBkZXZpY2UKICAqLwogc3RhdGljIGludAogdmlzb3JidXNfbWF0Y2goc3RydWN0IGRldmljZSAqeGRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKnhkcnYpCkBAIC0yMTEsOSArMTI5LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRldmljZV91bnJlZ2lzdGVyKCkgaXMgY2FsbGVkIGZvciB0aGUgYnVzIGRldmljZQotICogIGluc3RhbmNlLCBhZnRlciBhbGwgb3RoZXIgdGFza3MgaW52b2x2ZWQgd2l0aCBkZXN0cm95aW5nIHRoZSBkZXZpY2UKLSAqICBhcmUgY29tcGxldGUuCisvKgorICogVGhpcyBkZXNjcmliZXMgdGhlIFRZUEUgb2YgYnVzLgorICogIChEb24ndCBjb25mdXNlIHRoaXMgd2l0aCBhbiBJTlNUQU5DRSBvZiB0aGUgYnVzLikKKyAqLworc3RydWN0IGJ1c190eXBlIHZpc29yYnVzX3R5cGUgPSB7CisJLm5hbWUgPSAidmlzb3JidXMiLAorCS5tYXRjaCA9IHZpc29yYnVzX21hdGNoLAorCS51ZXZlbnQgPSB2aXNvcmJ1c191ZXZlbnQsCisJLmRldl9ncm91cHMgPSB2aXNvcmJ1c19kZXZfZ3JvdXBzLAorfTsKKworLyoqCisgKiB2aXNvcmJ1c19yZWxlYWVfYnVzZGV2aWNlKCkgLSBjYWxsZWQgd2hlbiBkZXZpY2VfdW5yZWdpc3RlcigpIGlzIGNhbGxlZCBmb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBidXMgZGV2aWNlIGluc3RhbmNlLCBhZnRlciBhbGwgb3RoZXIgdGFza3MKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9sdmVkIHdpdGggZGVzdHJveWluZyB0aGUgZGV2IGFyZSBjb21wbGV0ZQorICogQHhkZXY6IHN0cnVjdCBkZXZpY2UgZm9yIHRoZSBidXMgYmVpbmcgcmVsZWFzZWQKICAqLwogc3RhdGljIHZvaWQKIHZpc29yYnVzX3JlbGVhc2VfYnVzZGV2aWNlKHN0cnVjdCBkZXZpY2UgKnhkZXYpCkBAIC0yMjMsMTggKzE1NCwxNiBAQAogCWtmcmVlKGRldik7CiB9CiAKLS8qKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRldmljZV91bnJlZ2lzdGVyKCkgaXMgY2FsbGVkIGZvciBlYWNoIGNoaWxkCi0gKiAgZGV2aWNlIGluc3RhbmNlLgorLyoqCisgKiB2aXNvcmJ1c19yZWxlYXNlX2RldmljZSgpIC0gY2FsbGVkIHdoZW4gZGV2aWNlX3VucmVnaXN0ZXIoKSBpcyBjYWxsZWQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBjaGlsZCBkZXZpY2UgaW5zdGFuY2UKKyAqIEB4ZGV2OiBzdHJ1Y3QgZGV2aWNlIGZvciB0aGUgdmlzb3IgZGV2aWNlIGJlaW5nIHJlbGVhc2VkCiAgKi8KIHN0YXRpYyB2b2lkCiB2aXNvcmJ1c19yZWxlYXNlX2RldmljZShzdHJ1Y3QgZGV2aWNlICp4ZGV2KQogewogCXN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiA9IHRvX3Zpc29yX2RldmljZSh4ZGV2KTsKIAotCWlmIChkZXYtPnBlcmlvZGljX3dvcmspIHsKLQkJdmlzb3JfcGVyaW9kaWNfd29ya19kZXN0cm95KGRldi0+cGVyaW9kaWNfd29yayk7Ci0JCWRldi0+cGVyaW9kaWNfd29yayA9IE5VTEw7Ci0JfQogCWlmIChkZXYtPnZpc29yY2hhbm5lbCkgewogCQl2aXNvcmNoYW5uZWxfZGVzdHJveShkZXYtPnZpc29yY2hhbm5lbCk7CiAJCWRldi0+dmlzb3JjaGFubmVsID0gTlVMTDsKQEAgLTI0Miw5ICsxNzEsMTEgQEAKIAlrZnJlZShkZXYpOwogfQogCi0vKiBiZWdpbiBpbXBsZW1lbnRhdGlvbiBvZiBzcGVjaWZpYyBjaGFubmVsIGF0dHJpYnV0ZXMgdG8gYXBwZWFyIHVuZGVyCi0qIC9zeXMvYnVzL3Zpc29yYnVzPHg+L2Rldjx5Pi9jaGFubmVsCi0qLworLyoKKyAqIGJlZ2luIGltcGxlbWVudGF0aW9uIG9mIHNwZWNpZmljIGNoYW5uZWwgYXR0cmlidXRlcyB0byBhcHBlYXIgdW5kZXIKKyAqIC9zeXMvYnVzL3Zpc29yYnVzPHg+L2Rldjx5Pi9jaGFubmVsCisgKi8KKwogc3RhdGljIHNzaXplX3QgcGh5c2FkZHJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgICBjaGFyICpidWYpCiB7CkBAIC0zNDksMTUgKzI4MCwxMSBAQAogCiAvKiBlbmQgaW1wbGVtZW50YXRpb24gb2Ygc3BlY2lmaWMgY2hhbm5lbCBhdHRyaWJ1dGVzICovCiAKLS8qICBCVVMgaW5zdGFuY2UgYXR0cmlidXRlcworLyoKKyAqICBCVVMgaW5zdGFuY2UgYXR0cmlidXRlcwogICoKICAqICBkZWZpbmUgJiBpbXBsZW1lbnQgZGlzcGxheSBvZiBidXMgYXR0cmlidXRlcyB1bmRlcgotICogIC9zeXMvYnVzL3Zpc29yYnVzL2J1c3Nlcy92aXNvcmJ1czxuPi4KLSAqCi0gKiAgVGhpcyBpcyBhIGJpdCBob2FreSBiZWNhdXNlIHRoZSBrZXJuZWwgZG9lcyBub3QgeWV0IGhhdmUgdGhlIGluZnJhc3RydWN0dXJlCi0gKiAgdG8gc2VwYXJhdGUgYnVzIElOU1RBTkNFIGF0dHJpYnV0ZXMgZnJvbSBidXMgVFlQRSBhdHRyaWJ1dGVzLi4uCi0gKiAgc28gd2Ugcm9sbCBvdXIgb3duLiAgU2VlIGJ1c2luc3QuYyAvIGJ1c2luc3QuaC4KLSAqCisgKiAgL3N5cy9idXMvdmlzb3JidXMvZGV2aWNlcy92aXNvcmJ1czxuPi4KICAqLwogCiBzdGF0aWMgc3NpemVfdCBwYXJ0aXRpb25faGFuZGxlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LApAQCAtNDM0LDggKzM2MSw4IEBACiAJCWlmICh2ZGV2LT5uYW1lKQogCQkJcGFydGl0aW9uX25hbWUgPSB2ZGV2LT5uYW1lOwogCQlzaGlmdCA9IHNucHJpbnRmKHBvcywgcmVtYWluLAotCQkJCSAiQ2xpZW50IGRldmljZSAvIGNsaWVudCBkcml2ZXIgaW5mbyBmb3IgJXMgZWFydGl0aW9uICh2YnVzICMlZCk6XG4iLAotCQkJCSBwYXJ0aXRpb25fbmFtZSwgdmRldi0+Y2hpcHNldF9kZXZfbm8pOworCQkJCSAiQ2xpZW50IGRldmljZSAvIGNsaWVudCBkcml2ZXIgaW5mbyBmb3IgJXMgcGFydGl0aW9uICh2YnVzICMldSk6XG4iLAorCQkJCSBwYXJ0aXRpb25fbmFtZSwgdmRldi0+Y2hpcHNldF9idXNfbm8pOwogCQlwb3MgKz0gc2hpZnQ7CiAJCXJlbWFpbiAtPSBzaGlmdDsKIAkJc2hpZnQgPSB2aXNvcmNoYW5uZWxfcmVhZChjaGFubmVsLApAQCAtNTA4LDEwMyArNDM1LDQ4IEBACiAJCU5VTEwKIH07CiAKLS8qICBEUklWRVIgYXR0cmlidXRlcwotICoKLSAqICBkZWZpbmUgJiBpbXBsZW1lbnQgZGlzcGxheSBvZiBkcml2ZXIgYXR0cmlidXRlcyB1bmRlcgotICogIC9zeXMvYnVzL3Zpc29yYnVzL2RyaXZlcnMvPGRyaXZlcm5hbWU+LgotICoKLSAqLwotCi1zdGF0aWMgc3NpemVfdAotRFJJVkVSX0FUVFJfdmVyc2lvbihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqeGRydiwgY2hhciAqYnVmKQotewotCXN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydiA9IHRvX3Zpc29yX2RyaXZlcih4ZHJ2KTsKLQotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBkcnYtPnZlcnNpb24pOwotfQotCi1zdGF0aWMgaW50Ci1yZWdpc3Rlcl9kcml2ZXJfYXR0cmlidXRlcyhzdHJ1Y3Qgdmlzb3JfZHJpdmVyICpkcnYpCi17Ci0Jc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgdmVyc2lvbiA9Ci0JICAgIF9fQVRUUih2ZXJzaW9uLCBTX0lSVUdPLCBEUklWRVJfQVRUUl92ZXJzaW9uLCBOVUxMKTsKLQlkcnYtPnZlcnNpb25fYXR0ciA9IHZlcnNpb247Ci0JcmV0dXJuIGRyaXZlcl9jcmVhdGVfZmlsZSgmZHJ2LT5kcml2ZXIsICZkcnYtPnZlcnNpb25fYXR0cik7Ci19Ci0KIHN0YXRpYyB2b2lkCi11bnJlZ2lzdGVyX2RyaXZlcl9hdHRyaWJ1dGVzKHN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydikKK2Rldl9wZXJpb2RpY193b3JrKHVuc2lnbmVkIGxvbmcgX19vcGFxdWUpCiB7Ci0JZHJpdmVyX3JlbW92ZV9maWxlKCZkcnYtPmRyaXZlciwgJmRydi0+dmVyc2lvbl9hdHRyKTsKLX0KLQotc3RhdGljIHZvaWQKLWRldl9wZXJpb2RpY193b3JrKHZvaWQgKnhkZXYpCi17Ci0Jc3RydWN0IHZpc29yX2RldmljZSAqZGV2ID0geGRldjsKKwlzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYgPSAoc3RydWN0IHZpc29yX2RldmljZSAqKV9fb3BhcXVlOwogCXN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydiA9IHRvX3Zpc29yX2RyaXZlcihkZXYtPmRldmljZS5kcml2ZXIpOwogCi0JZG93bigmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKIAlpZiAoZHJ2LT5jaGFubmVsX2ludGVycnVwdCkKIAkJZHJ2LT5jaGFubmVsX2ludGVycnVwdChkZXYpOwotCXVwKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOwotCWlmICghdmlzb3JfcGVyaW9kaWNfd29ya19uZXh0cGVyaW9kKGRldi0+cGVyaW9kaWNfd29yaykpCi0JCXB1dF9kZXZpY2UoJmRldi0+ZGV2aWNlKTsKKwltb2RfdGltZXIoJmRldi0+dGltZXIsIGppZmZpZXMgKyBQT0xMSklGRklFU19OT1JNQUxDSEFOTkVMKTsKIH0KIAogc3RhdGljIHZvaWQKIGRldl9zdGFydF9wZXJpb2RpY193b3JrKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldikKIHsKLQlpZiAoZGV2LT5iZWluZ19yZW1vdmVkKQorCWlmIChkZXYtPmJlaW5nX3JlbW92ZWQgfHwgZGV2LT50aW1lcl9hY3RpdmUpCiAJCXJldHVybjsKIAkvKiBub3cgdXAgYnkgYXQgbGVhc3QgMiAqLwogCWdldF9kZXZpY2UoJmRldi0+ZGV2aWNlKTsKLQlpZiAoIXZpc29yX3BlcmlvZGljX3dvcmtfc3RhcnQoZGV2LT5wZXJpb2RpY193b3JrKSkKLQkJcHV0X2RldmljZSgmZGV2LT5kZXZpY2UpOworCWRldi0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBQT0xMSklGRklFU19OT1JNQUxDSEFOTkVMOworCWFkZF90aW1lcigmZGV2LT50aW1lcik7CisJZGV2LT50aW1lcl9hY3RpdmUgPSB0cnVlOwogfQogCiBzdGF0aWMgdm9pZAogZGV2X3N0b3BfcGVyaW9kaWNfd29yayhzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpCiB7Ci0JaWYgKHZpc29yX3BlcmlvZGljX3dvcmtfc3RvcChkZXYtPnBlcmlvZGljX3dvcmspKQotCQlwdXRfZGV2aWNlKCZkZXYtPmRldmljZSk7CisJaWYgKCFkZXYtPnRpbWVyX2FjdGl2ZSkKKwkJcmV0dXJuOworCWRlbF90aW1lcl9zeW5jKCZkZXYtPnRpbWVyKTsKKwlkZXYtPnRpbWVyX2FjdGl2ZSA9IGZhbHNlOworCXB1dF9kZXZpY2UoJmRldi0+ZGV2aWNlKTsKIH0KIAotLyoqIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgdXBvbiBhZGRpbmcgYSB2aXNvcl9kZXZpY2UgKGRldmljZV9hZGQpLCBvcgotICogIGFkZGluZyBhIHZpc29yX2RyaXZlciAodmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKSwgYnV0IG9ubHkgYWZ0ZXIKLSAqICB2aXNvcmJ1c19tYXRjaCBoYXMgcmV0dXJuZWQgMSB0byBpbmRpY2F0ZSBhIHN1Y2Nlc3NmdWwgbWF0Y2ggYmV0d2VlbgotICogIGRyaXZlciBhbmQgZGV2aWNlLgotICovCi1zdGF0aWMgaW50Ci12aXNvcmRyaXZlcl9wcm9iZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqeGRldikKLXsKLQlpbnQgcmVzOwotCXN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydjsKLQlzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXY7Ci0KLQlkcnYgPSB0b192aXNvcl9kcml2ZXIoeGRldi0+ZHJpdmVyKTsKLQlkZXYgPSB0b192aXNvcl9kZXZpY2UoeGRldik7Ci0KLQlpZiAoIWRydi0+cHJvYmUpCi0JCXJldHVybiAtRU5PREVWOwotCi0JZG93bigmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKLQlkZXYtPmJlaW5nX3JlbW92ZWQgPSBmYWxzZTsKLQotCXJlcyA9IGRydi0+cHJvYmUoZGV2KTsKLQlpZiAocmVzID49IDApIHsKLQkJLyogc3VjY2VzczogcmVmZXJlbmNlIGtlcHQgdmlhIHVubWF0Y2hlZCBnZXRfZGV2aWNlKCkgKi8KLQkJZ2V0X2RldmljZSgmZGV2LT5kZXZpY2UpOwotCQlmaXhfdmJ1c19kZXZfaW5mbyhkZXYpOwotCX0KLQotCXVwKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRldmljZV91bnJlZ2lzdGVyKCkgaXMgY2FsbGVkIGZvciBlYWNoIGNoaWxkIGRldmljZQotICogIGluc3RhbmNlLCB0byBub3RpZnkgdGhlIGFwcHJvcHJpYXRlIHZpc29yYnVzX2RyaXZlciB0aGF0IHRoZSBkZXZpY2UgaXMKLSAqICBnb2luZyBhd2F5LCBhbmQgdG8gZGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZGV2aWNlLgorLyoqCisgKiB2aXNvcmRyaXZlcl9yZW1vdmVfZGV2aWNlKCkgLSBoYW5kbGUgdmlzb3IgZGV2aWNlIGdvaW5nIGF3YXkKKyAqIEB4ZGV2OiBzdHJ1Y3QgZGV2aWNlIGZvciB0aGUgdmlzb3IgZGV2aWNlIGJlaW5nIHJlbW92ZWQKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGRldmljZV91bnJlZ2lzdGVyKCkgaXMgY2FsbGVkIGZvciBlYWNoIGNoaWxkIGRldmljZQorICogaW5zdGFuY2UsIHRvIG5vdGlmeSB0aGUgYXBwcm9wcmlhdGUgdmlzb3JidXMgZnVuY3Rpb24gZHJpdmVyIHRoYXQgdGhlIGRldmljZQorICogaXMgZ29pbmcgYXdheSwgYW5kIHRvIGRlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGRldmljZS4KKyAqCisgKiBSZXR1cm46IDAgaWZmIHN1Y2Nlc3NmdWwKICAqLwogc3RhdGljIGludAogdmlzb3Jkcml2ZXJfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZGV2aWNlICp4ZGV2KQpAQCAtNjE0LDEwNSArNDg2LDQ0IEBACiAKIAlkZXYgPSB0b192aXNvcl9kZXZpY2UoeGRldik7CiAJZHJ2ID0gdG9fdmlzb3JfZHJpdmVyKHhkZXYtPmRyaXZlcik7Ci0JZG93bigmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKKwltdXRleF9sb2NrKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOwogCWRldi0+YmVpbmdfcmVtb3ZlZCA9IHRydWU7CiAJaWYgKGRydi0+cmVtb3ZlKQogCQlkcnYtPnJlbW92ZShkZXYpOwotCXVwKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOworCW11dGV4X3VubG9jaygmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKIAlkZXZfc3RvcF9wZXJpb2RpY193b3JrKGRldik7CiAKIAlwdXRfZGV2aWNlKCZkZXYtPmRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qKiBBIHBhcnRpY3VsYXIgdHlwZSBvZiB2aXNvciBkcml2ZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiB0byByZWdpc3RlcgotICogIHRoZSBkcml2ZXIuICBUaGUgY2FsbGVyIE1VU1QgZmlsbCBpbiB0aGUgZm9sbG93aW5nIGZpZWxkcyB3aXRoaW4gdGhlCi0gKiAgI2RydiBzdHJ1Y3R1cmU6Ci0gKiAgICAgIG5hbWUsIHZlcnNpb24sIG93bmVyLCBjaGFubmVsX3R5cGVzLCBwcm9iZSwgcmVtb3ZlCisvKioKKyAqIHZpc29yYnVzX3VucmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkgLSB1bnJlZ2lzdGVycyB0aGUgcHJvdmlkZWQgZHJpdmVyCisgKiBAZHJ2OiB0aGUgZHJpdmVyIHRvIHVucmVnaXN0ZXIKICAqCi0gKiAgSGVyZSdzIGhvdyB0aGUgd2hvbGUgTGludXggYnVzIC8gZHJpdmVyIC8gZGV2aWNlIG1vZGVsIHdvcmtzLgotICoKLSAqICBBdCBzeXN0ZW0gc3RhcnQtdXAsIHRoZSB2aXNvcmJ1cyBrZXJuZWwgbW9kdWxlIGlzIGxvYWRlZCwgd2hpY2ggcmVnaXN0ZXJzCi0gKiAgdmlzb3JidXNfdHlwZSBhcyBhIGJ1cyB0eXBlLCB1c2luZyBidXNfcmVnaXN0ZXIoKS4KLSAqCi0gKiAgQWxsIGtlcm5lbCBtb2R1bGVzIHRoYXQgc3VwcG9ydCBwYXJ0aWN1bGFyIGRldmljZSB0eXBlcyBvbiBhCi0gKiAgdmlzb3JidXMgYnVzIGFyZSBsb2FkZWQuICBFYWNoIG9mIHRoZXNlIGtlcm5lbCBtb2R1bGVzIGNhbGxzCi0gKiAgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkgaW4gdGhlaXIgaW5pdCBmdW5jdGlvbnMsIHBhc3NpbmcgYQotICogIHZpc29yX2RyaXZlciBzdHJ1Y3QuICB2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIoKSBpbiB0dXJuIGNhbGxzCi0gKiAgcmVnaXN0ZXJfZHJpdmVyKCZ2aXNvcl9kcml2ZXIuZHJpdmVyKS4gIFRoaXMgLmRyaXZlciBtZW1iZXIgaXMKLSAqICBpbml0aWFsaXplZCB3aXRoIGdlbmVyaWMgbWV0aG9kcyAobGlrZSBwcm9iZSksIHdob3NlIHNvbGUgcmVzcG9uc2liaWxpdHkKLSAqICBpcyB0byBhY3QgYXMgYSBicm9rZXIgZm9yIHRoZSByZWFsIG1ldGhvZHMsIHdoaWNoIGFyZSB3aXRoaW4gdGhlCi0gKiAgdmlzb3JfZHJpdmVyIHN0cnVjdC4gIChUaGlzIGlzIHRoZSB3YXkgdGhlIHN1YmNsYXNzIGJlaGF2aW9yIGlzCi0gKiAgaW1wbGVtZW50ZWQsIHNpbmNlIHZpc29yX2RyaXZlciBpcyBlc3NlbnRpYWxseSBhIHN1YmNsYXNzIG9mIHRoZQotICogIGdlbmVyaWMgZHJpdmVyLikgIFdoZW5ldmVyIGEgZHJpdmVyX3JlZ2lzdGVyKCkgaGFwcGVucywgY29yZSBidXMgY29kZSBpbgotICogIHRoZSBrZXJuZWwgZG9lcyAoc2VlIGRldmljZV9hdHRhY2goKSBpbiBkcml2ZXJzL2Jhc2UvZGQuYyk6Ci0gKgotICogICAgICBmb3IgZWFjaCBkZXYgYXNzb2NpYXRlZCB3aXRoIHRoZSBidXMgKHRoZSBidXMgdGhhdCBkcml2ZXIgaXMgb24pIHRoYXQKLSAqICAgICAgZG9lcyBub3QgeWV0IGhhdmUgYSBkcml2ZXIKLSAqICAgICAgICAgIGlmIGJ1cy5tYXRjaChkZXYsbmV3ZHJpdmVyKSA9PSB5ZXNfbWF0Y2hlZCAgKiogLm1hdGNoIHNwZWNpZmllZAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiogZHVyaW5nIGJ1c19yZWdpc3RlcigpLgotICogICAgICAgICAgICAgIG5ld2RyaXZlci5wcm9iZShkZXYpICAqKiBmb3Igdmlzb3IgZHJpdmVycywgdGhpcyB3aWxsIGNhbGwKLSAqICAgICAgICAgICAgICAgICAgICAqKiB0aGUgZ2VuZXJpYyBkcml2ZXIucHJvYmUgaW1wbGVtZW50ZWQgaW4gdmlzb3JidXMuYywKLSAqICAgICAgICAgICAgICAgICAgICAqKiB3aGljaCBpbiB0dXJuIGNhbGxzIHRoZSBwcm9iZSBzcGVjaWZpZWQgd2l0aGluIHRoZQotICogICAgICAgICAgICAgICAgICAgICoqIHN0cnVjdCB2aXNvcl9kcml2ZXIgKHdoaWNoIHdhcyBzcGVjaWZpZWQgYnkgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgKiogYWN0dWFsIGRldmljZSBkcml2ZXIgYXMgcGFydCBvZgotICogICAgICAgICAgICAgICAgICAgICoqIHZpc29yYnVzX3JlZ2lzdGVyX3Zpc29yX2RyaXZlcigpKS4KLSAqCi0gKiAgVGhlIGFib3ZlIGRhbmNlIGFsc28gaGFwcGVucyB3aGVuIGEgbmV3IGRldmljZSBhcHBlYXJzLgotICogIFNvIHRoZSBxdWVzdGlvbiBpcywgaG93IGFyZSBkZXZpY2VzIGNyZWF0ZWQgd2l0aGluIHRoZSBzeXN0ZW0/Ci0gKiAgQmFzaWNhbGx5LCBqdXN0IGNhbGwgZGV2aWNlX2FkZChkZXYpLiAgU2VlIHBjaV9idXNfYWRkX2RldmljZXMoKS4KLSAqICBwY2lfc2Nhbl9kZXZpY2UoKSBzaG93cyBhbiBleGFtcGxlIG9mIGhvdyB0byBidWlsZCBhIGRldmljZSBzdHJ1Y3QuICBJdAotICogIHJldHVybnMgdGhlIG5ld2x5LWNyZWF0ZWQgc3RydWN0IHRvIHBjaV9zY2FuX3NpbmdsZV9kZXZpY2UoKSwgd2hvIGFkZHMgaXQKLSAqICB0byB0aGUgbGlzdCBvZiBkZXZpY2VzIGF0IFBDSUJVUy5kZXZpY2VzLiAgVGhhdCBsaXN0IG9mIGRldmljZXMgaXMgd2hhdAotICogIGlzIHRyYXZlcnNlZCBieSBwY2lfYnVzX2FkZF9kZXZpY2VzKCkuCi0gKgotICovCi1pbnQgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKHN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydikKLXsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGJ1c3JlZ19yYyA8IDApCi0JCXJldHVybiAtRU5PREVWOyAvKmNhbid0IHJlZ2lzdGVyIG9uIGEgbm9uZXhpc3RlbnQgYnVzKi8KLQotCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7Ci0JZHJ2LT5kcml2ZXIuYnVzID0gJnZpc29yYnVzX3R5cGU7Ci0JZHJ2LT5kcml2ZXIucHJvYmUgPSB2aXNvcmRyaXZlcl9wcm9iZV9kZXZpY2U7Ci0JZHJ2LT5kcml2ZXIucmVtb3ZlID0gdmlzb3Jkcml2ZXJfcmVtb3ZlX2RldmljZTsKLQlkcnYtPmRyaXZlci5vd25lciA9IGRydi0+b3duZXI7Ci0KLQkvKiBkcml2ZXJfcmVnaXN0ZXIgZG9lcyB0aGlzOgotCSAqICAgYnVzX2FkZF9kcml2ZXIoZHJ2KQotCSAqICAgLT5pZiAoZHJ2LmJ1cykgICoqIChidXNfdHlwZSkgKioKLQkgKiAgICAgICBkcml2ZXJfYXR0YWNoKGRydikKLQkgKiAgICAgICAgIGZvciBlYWNoIGRldiB3aXRoIGJ1cyB0eXBlIG9mIGRydi5idXMKLQkgKiAgICAgICAgICAgaWYgKCFkZXYuZHJ2KSAgKiogbm8gZHJpdmVyIGFzc2lnbmVkIHlldCAqKgotCSAqICAgICAgICAgICAgIGlmIChidXMubWF0Y2goZGV2LGRydikpICBbdmlzb3JidXNfbWF0Y2hdCi0JICogICAgICAgICAgICAgICBkZXYuZHJ2ID0gZHJ2Ci0JICogICAgICAgICAgICAgICBpZiAoIWRydi5wcm9iZShkZXYpKSAgIFt2aXNvcmRyaXZlcl9wcm9iZV9kZXZpY2VdCi0JICogICAgICAgICAgICAgICAgIGRldi5kcnYgPSBOVUxMCi0JICovCi0KLQlyYyA9IGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlyYyA9IHJlZ2lzdGVyX2RyaXZlcl9hdHRyaWJ1dGVzKGRydik7Ci0JaWYgKHJjIDwgMCkKLQkJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIpOwotCi0vKiogQSBwYXJ0aWN1bGFyIHR5cGUgb2Ygdmlzb3IgZHJpdmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gdW5yZWdpc3RlcgotICogIHRoZSBkcml2ZXIsIGkuZS4sIHdpdGhpbiBpdHMgbW9kdWxlX2V4aXQgZnVuY3Rpb24uCisgKiBBIHZpc29yIGZ1bmN0aW9uIGRyaXZlciBjYWxscyB0aGlzIGZ1bmN0aW9uIHRvIHVucmVnaXN0ZXIgdGhlIGRyaXZlciwKKyAqIGkuZS4sIHdpdGhpbiBpdHMgbW9kdWxlX2V4aXQgZnVuY3Rpb24uCiAgKi8KIHZvaWQKIHZpc29yYnVzX3VucmVnaXN0ZXJfdmlzb3JfZHJpdmVyKHN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydikKIHsKLQl1bnJlZ2lzdGVyX2RyaXZlcl9hdHRyaWJ1dGVzKGRydik7CiAJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpc29yYnVzX3VucmVnaXN0ZXJfdmlzb3JfZHJpdmVyKTsKIAorLyoqCisgKiB2aXNvcmJ1c19yZWFkX2NoYW5uZWwoKSAtIHJlYWRzIGZyb20gdGhlIGRlc2lnbmF0ZWQgY2hhbm5lbCBpbnRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm92aWRlZCBidWZmZXIKKyAqIEBkZXY6ICAgIHRoZSBkZXZpY2Ugd2hvc2UgY2hhbm5lbCBpcyByZWFkIGZyb20KKyAqIEBvZmZzZXQ6IHRoZSBvZmZzZXQgaW50byB0aGUgY2hhbm5lbCBhdCB3aGljaCByZWFkaW5nIHN0YXJ0cworICogQGRlc3Q6ICAgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0aGF0IGlzIHdyaXR0ZW4gaW50byBmcm9tIHRoZSBjaGFubmVsCisgKiBAbmJ5dGVzOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgY2hhbm5lbAorICoKKyAqIElmIHJlY2VpdmluZyBhIG1lc3NhZ2UsIHVzZSB0aGUgdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZSgpCisgKiBmdW5jdGlvbiBpbnN0ZWFkLgorICoKKyAqIFJldHVybjogaW50ZWdlciBpbmRpY2F0aW5nIHN1Y2Nlc3MgKHplcm8pIG9yIGZhaWx1cmUgKG5vbi16ZXJvKQorICovCiBpbnQKIHZpc29yYnVzX3JlYWRfY2hhbm5lbChzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkgICAgICB2b2lkICpkZXN0LCB1bnNpZ25lZCBsb25nIG5ieXRlcykKQEAgLTcyMSw2ICs1MzIsMTkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpc29yYnVzX3JlYWRfY2hhbm5lbCk7CiAKKy8qKgorICogdmlzb3JidXNfd3JpdGVfY2hhbm5lbCgpIC0gd3JpdGVzIHRoZSBwcm92aWRlZCBidWZmZXIgaW50byB0aGUgZGVzaWduYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbAorICogQGRldjogICAgdGhlIGRldmljZSB3aG9zZSBjaGFubmVsIGlzIHdyaXR0ZW4gdG8KKyAqIEBvZmZzZXQ6IHRoZSBvZmZzZXQgaW50byB0aGUgY2hhbm5lbCBhdCB3aGljaCB3cml0aW5nIHN0YXJ0cworICogQHNyYzogICAgdGhlIHNvdXJjZSBidWZmZXIgdGhhdCBpcyB3cml0dGVuIGludG8gdGhlIGNoYW5uZWwKKyAqIEBuYnl0ZXM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgaW50byB0aGUgY2hhbm5lbAorICoKKyAqIElmIHNlbmRpbmcgYSBtZXNzYWdlLCB1c2UgdGhlIHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoKQorICogZnVuY3Rpb24gaW5zdGVhZC4KKyAqCisgKiBSZXR1cm46IGludGVnZXIgaW5kaWNhdGluZyBzdWNjZXNzICh6ZXJvKSBvciBmYWlsdXJlIChub24temVybykKKyAqLwogaW50CiB2aXNvcmJ1c193cml0ZV9jaGFubmVsKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCiAJCSAgICAgICB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgbmJ5dGVzKQpAQCAtNzI5LDE2ICs1NTMsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpc29yYnVzX3dyaXRlX2NoYW5uZWwpOwogCi1pbnQKLXZpc29yYnVzX2NsZWFyX2NoYW5uZWwoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdTggY2gsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIG5ieXRlcykKLXsKLQlyZXR1cm4gdmlzb3JjaGFubmVsX2NsZWFyKGRldi0+dmlzb3JjaGFubmVsLCBvZmZzZXQsIGNoLCBuYnl0ZXMpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JidXNfY2xlYXJfY2hhbm5lbCk7Ci0KLS8qKiBXZSBkb24ndCByZWFsbHkgaGF2ZSBhIHJlYWwgaW50ZXJydXB0LCBzbyBmb3Igbm93IHdlIGp1c3QgY2FsbCB0aGUKLSAqICBpbnRlcnJ1cHQgZnVuY3Rpb24gcGVyaW9kaWNhbGx5Li4uCisvKioKKyAqIHZpc29yYnVzX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoKSAtIGVuYWJsZXMgaW50ZXJydXB0cyBvbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbmF0ZWQgZGV2aWNlCisgKiBAZGV2OiB0aGUgZGV2aWNlIG9uIHdoaWNoIHRvIGVuYWJsZSBpbnRlcnJ1cHRzCisgKgorICogQ3VycmVudGx5IHdlIGRvbid0IHlldCBoYXZlIGEgcmVhbCBpbnRlcnJ1cHQsIHNvIGZvciBub3cgd2UganVzdCBjYWxsIHRoZQorICogaW50ZXJydXB0IGZ1bmN0aW9uIHBlcmlvZGljYWxseSB2aWEgYSB0aW1lci4KICAqLwogdm9pZAogdmlzb3JidXNfZW5hYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpCkBAIC03NDcsNiArNTY4LDExIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmJ1c19lbmFibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKTsKIAorLyoqCisgKiB2aXNvcmJ1c19kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cygpIC0gZGlzYWJsZXMgaW50ZXJydXB0cyBvbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ25hdGVkIGRldmljZQorICogQGRldjogdGhlIGRldmljZSBvbiB3aGljaCB0byBkaXNhYmxlIGludGVycnVwdHMKKyAqLwogdm9pZAogdmlzb3JidXNfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KQogewpAQCAtNzU0LDE5ICs1ODAsMjggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpc29yYnVzX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKTsKIAotLyoqIFRoaXMgaXMgaG93IGV2ZXJ5dGhpbmcgc3RhcnRzIGZyb20gdGhlIGRldmljZSBlbmQuCi0gKiAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGNoYW5uZWwgZmlyc3QgYXBwZWFycyB2aWEgYSBDb250cm9sVk0KLSAqICBtZXNzYWdlLiAgSW4gcmVzcG9uc2UsIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgdmlzb3JfZGV2aWNlIHRvCi0gKiAgY29ycmVzcG9uZCB0byB0aGUgbmV3IGNoYW5uZWwsIGFuZCBhdHRlbXB0cyB0byBjb25uZWN0IGl0IHRoZSBhcHByb3ByaWF0ZQotICogIGRyaXZlci4gIElmIHRoZSBhcHByb3ByaWF0ZSBkcml2ZXIgaXMgZm91bmQsIHRoZSB2aXNvcl9kcml2ZXIucHJvYmUoKQotICogIGZ1bmN0aW9uIGZvciB0aGF0IGRyaXZlciB3aWxsIGJlIGNhbGxlZCwgYW5kIHdpbGwgYmUgcGFzc2VkIHRoZSBuZXcKLSAqICB2aXNvcl9kZXZpY2UgdGhhdCB3ZSBqdXN0IGNyZWF0ZWQuCisvKioKKyAqIGNyZWF0ZV92aXNvcl9kZXZpY2UoKSAtIGNyZWF0ZSB2aXNvciBkZXZpY2UgYXMgYSByZXN1bHQgb2YgcmVjZWl2aW5nIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHZtIGRldmljZV9jcmVhdGUgbWVzc2FnZSBmb3IgYSBuZXcgZGV2aWNlCisgKiBAZGV2OiBhIGZyZXNobHktemVyb2VkIHN0cnVjdCB2aXNvcl9kZXZpY2UsIGNvbnRhaW5pbmcgb25seSBmaWxsZWQtaW4gdmFsdWVzCisgKiAgICAgICBmb3IgY2hpcHNldF9idXNfbm8gYW5kIGNoaXBzZXRfZGV2X25vLCB0aGF0IHdpbGwgYmUgaW5pdGlhbGl6ZWQKICAqCi0gKiAgSXQncyBvayBpZiB0aGUgYXBwcm9wcmlhdGUgZHJpdmVyIGlzIG5vdCB5ZXQgbG9hZGVkLCBiZWNhdXNlIGluIHRoYXQgY2FzZQotICogIHRoZSBuZXcgZGV2aWNlIHN0cnVjdCB3aWxsIGp1c3Qgc3RpY2sgYXJvdW5kIGluIHRoZSBidXMnIGxpc3Qgb2YgZGV2aWNlcy4KLSAqICBXaGVuIHRoZSBhcHByb3ByaWF0ZSBkcml2ZXIgY2FsbHMgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCksIHRoZQotICogIHZpc29yX2RyaXZlci5wcm9iZSgpIGZvciB0aGUgbmV3IGRyaXZlciB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcKLSAqICBkZXZpY2UuCisgKiBUaGlzIGlzIGhvdyBldmVyeXRoaW5nIHN0YXJ0cyBmcm9tIHRoZSBkZXZpY2UgZW5kLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIGNoYW5uZWwgZmlyc3QgYXBwZWFycyB2aWEgYSBDb250cm9sVk0KKyAqIG1lc3NhZ2UuICBJbiByZXNwb25zZSwgdGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgYSB2aXNvcl9kZXZpY2UgdG8KKyAqIGNvcnJlc3BvbmQgdG8gdGhlIG5ldyBjaGFubmVsLCBhbmQgYXR0ZW1wdHMgdG8gY29ubmVjdCBpdCB0aGUgYXBwcm9wcmlhdGUKKyAqIGRyaXZlci4gIElmIHRoZSBhcHByb3ByaWF0ZSBkcml2ZXIgaXMgZm91bmQsIHRoZSB2aXNvcl9kcml2ZXIucHJvYmUoKQorICogZnVuY3Rpb24gZm9yIHRoYXQgZHJpdmVyIHdpbGwgYmUgY2FsbGVkLCBhbmQgd2lsbCBiZSBwYXNzZWQgdGhlIG5ldworICogdmlzb3JfZGV2aWNlIHRoYXQgd2UganVzdCBjcmVhdGVkLgorICoKKyAqIEl0J3Mgb2sgaWYgdGhlIGFwcHJvcHJpYXRlIGRyaXZlciBpcyBub3QgeWV0IGxvYWRlZCwgYmVjYXVzZSBpbiB0aGF0IGNhc2UKKyAqIHRoZSBuZXcgZGV2aWNlIHN0cnVjdCB3aWxsIGp1c3Qgc3RpY2sgYXJvdW5kIGluIHRoZSBidXMnIGxpc3Qgb2YgZGV2aWNlcy4KKyAqIFdoZW4gdGhlIGFwcHJvcHJpYXRlIGRyaXZlciBjYWxscyB2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIoKSwgdGhlCisgKiB2aXNvcl9kcml2ZXIucHJvYmUoKSBmb3IgdGhlIG5ldyBkcml2ZXIgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3CisgKiBkZXZpY2UuCisgKgorICogUmV0dXJuOiAwIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSB0aGUgbmVnYXRpdmUgdmFsdWUgcmV0dXJuZWQgYnkKKyAqICAgICAgICAgZGV2aWNlX2FkZCgpIGluZGljYXRpbmcgdGhlIHJlYXNvbiBmb3IgZmFpbHVyZQogICovCiBzdGF0aWMgaW50CiBjcmVhdGVfdmlzb3JfZGV2aWNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldikKQEAgLTc3OCwzMyArNjEzLDI3IEBACiAJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0VOVFJZX1BDLCBjaGlwc2V0X2Rldl9ubywgY2hpcHNldF9idXNfbm8sCiAJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKLQlzZW1hX2luaXQoJmRldi0+dmlzb3Jkcml2ZXJfY2FsbGJhY2tfbG9jaywgMSk7CS8qIHVubG9ja2VkICovCisJbXV0ZXhfaW5pdCgmZGV2LT52aXNvcmRyaXZlcl9jYWxsYmFja19sb2NrKTsKIAlkZXYtPmRldmljZS5idXMgPSAmdmlzb3JidXNfdHlwZTsKIAlkZXYtPmRldmljZS5ncm91cHMgPSB2aXNvcmJ1c19jaGFubmVsX2dyb3VwczsKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmZGV2LT5kZXZpY2UpOwogCWRldi0+ZGV2aWNlLnJlbGVhc2UgPSB2aXNvcmJ1c19yZWxlYXNlX2RldmljZTsKIAkvKiBrZWVwIGEgcmVmZXJlbmNlIGp1c3QgZm9yIHVzIChub3cgMikgKi8KIAlnZXRfZGV2aWNlKCZkZXYtPmRldmljZSk7Ci0JZGV2LT5wZXJpb2RpY193b3JrID0KLQkJdmlzb3JfcGVyaW9kaWNfd29ya19jcmVhdGUoUE9MTEpJRkZJRVNfTk9STUFMQ0hBTk5FTCwKLQkJCQkJICAgcGVyaW9kaWNfZGV2X3dvcmtxdWV1ZSwKLQkJCQkJICAgZGV2X3BlcmlvZGljX3dvcmssCi0JCQkJCSAgIGRldiwgZGV2X25hbWUoJmRldi0+ZGV2aWNlKSk7Ci0JaWYgKCFkZXYtPnBlcmlvZGljX3dvcmspIHsKLQkJUE9TVENPREVfTElOVVhfMyhERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGNoaXBzZXRfZGV2X25vLAotCQkJCSBESUFHX1NFVkVSSVRZX0VSUik7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3B1dDsKLQl9CisJaW5pdF90aW1lcigmZGV2LT50aW1lcik7CisJZGV2LT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpKGRldik7CisJZGV2LT50aW1lci5mdW5jdGlvbiA9IGRldl9wZXJpb2RpY193b3JrOwogCi0JLyogYnVzX2lkIG11c3QgYmUgYSB1bmlxdWUgbmFtZSB3aXRoIHJlc3BlY3QgdG8gdGhpcyBidXMgVFlQRQorCS8qCisJICogYnVzX2lkIG11c3QgYmUgYSB1bmlxdWUgbmFtZSB3aXRoIHJlc3BlY3QgdG8gdGhpcyBidXMgVFlQRQogCSAqIChOT1QgYnVzIGluc3RhbmNlKS4gIFRoYXQncyB3aHkgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBidXMKIAkgKiBudW1iZXIgd2l0aGluIHRoZSBuYW1lLgogCSAqLwogCWRldl9zZXRfbmFtZSgmZGV2LT5kZXZpY2UsICJ2YnVzJXU6ZGV2JXUiLAogCQkgICAgIGNoaXBzZXRfYnVzX25vLCBjaGlwc2V0X2Rldl9ubyk7CiAKLQkvKiAgZGV2aWNlX2FkZCBkb2VzIHRoaXM6CisJLyoKKwkgKiBkZXZpY2VfYWRkIGRvZXMgdGhpczoKIAkgKiAgICBidXNfYWRkX2RldmljZShkZXYpCiAJICogICAgLT5kZXZpY2VfYXR0YWNoKGRldikKIAkgKiAgICAgIC0+Zm9yIGVhY2ggZHJpdmVyIGRydiByZWdpc3RlcmVkIG9uIHRoZSBidXMgdGhhdCBkZXYgaXMgb24KQEAgLTg2NCwxMSArNjkzLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlIHN0cnVjdAotICogc3Bhcl92YnVzX2NoYW5uZWxfcHJvdG9jb2wuY2hwX2luZm8uCisvKioKKyAqIHdyaXRlX3ZidXNfY2hwX2luZm8oKSAtIHdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlIHN0cnVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhcl92YnVzX2NoYW5uZWxfcHJvdG9jb2wuY2hwX2luZm8KKyAqIEBjaGFuOiAgICAgaW5kZW50aWZpZXMgdGhlIHMtUGFyIGNoYW5uZWwgdGhhdCB3aWxsIGJlIHVwZGF0ZWQKKyAqIEBoZHJfaW5mbzogdXNlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGNoYW5uZWwgb2Zmc2V0IHRvIHdyaXRlIGRhdGEKKyAqIEBpbmZvOiAgICAgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHRvIHdyaXRlCisgKgorICogV3JpdGVzIGNoaXBzZXQgaW5mbyBpbnRvIHRoZSBjaGFubmVsIG1lbW9yeSB0byBiZSB1c2VkIGZvciBkaWFnbm9zdGljCisgKiBwdXJwb3Nlcy4KKyAqCisgKiBSZXR1cm5zIG5vIHZhbHVlIHNpbmNlIHRoaXMgaXMgZGVidWcgaW5mb3JtYXRpb24gYW5kIG5vdCBuZWVkZWQgZm9yCisgKiBkZXZpY2UgZnVuY3Rpb25hbGl0eS4KICAqLwotCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogd3JpdGVfdmJ1c19jaHBfaW5mbyhzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFuLAogCQkgICAgc3RydWN0IHNwYXJfdmJ1c19oZWFkZXJpbmZvICpoZHJfaW5mbywKIAkJICAgIHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmluZm8pCkBAIC04NzYsMTggKzcxNCwyNSBAQAogCWludCBvZmYgPSBzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSArIGhkcl9pbmZvLT5jaHBfaW5mb19vZmZzZXQ7CiAKIAlpZiAoaGRyX2luZm8tPmNocF9pbmZvX29mZnNldCA9PSAwKQotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuOwogCi0JaWYgKHZpc29yY2hhbm5lbF93cml0ZShjaGFuLCBvZmYsIGluZm8sIHNpemVvZigqaW5mbykpIDwgMCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIDA7CisJdmlzb3JjaGFubmVsX3dyaXRlKGNoYW4sIG9mZiwgaW5mbywgc2l6ZW9mKCppbmZvKSk7CiB9CiAKLS8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlIHN0cnVjdAotICogc3Bhcl92YnVzX2NoYW5uZWxfcHJvdG9jb2wuYnVzX2luZm8uCisvKioKKyAqIHdyaXRlX3ZidXNfYnVzX2luZm8oKSAtIHdyaXRlIHRoZSBjb250ZW50cyBvZiA8aW5mbz4gdG8gdGhlIHN0cnVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgc3Bhcl92YnVzX2NoYW5uZWxfcHJvdG9jb2wuYnVzX2luZm8KKyAqIEBjaGFuOiAgICAgaW5kZW50aWZpZXMgdGhlIHMtUGFyIGNoYW5uZWwgdGhhdCB3aWxsIGJlIHVwZGF0ZWQKKyAqIEBoZHJfaW5mbzogdXNlZCB0byBmaW5kIGFwcHJvcHJpYXRlIGNoYW5uZWwgb2Zmc2V0IHRvIHdyaXRlIGRhdGEKKyAqIEBpbmZvOiAgICAgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHRvIHdyaXRlCisgKgorICogV3JpdGVzIGJ1cyBpbmZvIGludG8gdGhlIGNoYW5uZWwgbWVtb3J5IHRvIGJlIHVzZWQgZm9yIGRpYWdub3N0aWMKKyAqIHB1cnBvc2VzLgorICoKKyAqIFJldHVybnMgbm8gdmFsdWUgc2luY2UgdGhpcyBpcyBkZWJ1ZyBpbmZvcm1hdGlvbiBhbmQgbm90IG5lZWRlZCBmb3IKKyAqIGRldmljZSBmdW5jdGlvbmFsaXR5LgogICovCi0KLXN0YXRpYyBpbnQKK3N0YXRpYyB2b2lkCiB3cml0ZV92YnVzX2J1c19pbmZvKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW4sCiAJCSAgICBzdHJ1Y3Qgc3Bhcl92YnVzX2hlYWRlcmluZm8gKmhkcl9pbmZvLAogCQkgICAgc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqaW5mbykKQEAgLTg5NSwzNyArNzQwLDQ2IEBACiAJaW50IG9mZiA9IHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIpICsgaGRyX2luZm8tPmJ1c19pbmZvX29mZnNldDsKIAogCWlmIChoZHJfaW5mby0+YnVzX2luZm9fb2Zmc2V0ID09IDApCi0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm47CiAKLQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKGNoYW4sIG9mZiwgaW5mbywgc2l6ZW9mKCppbmZvKSkgPCAwKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKKwl2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbiwgb2ZmLCBpbmZvLCBzaXplb2YoKmluZm8pKTsKIH0KIAotLyogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIDxpbmZvPiB0byB0aGUKLSAqIHN0cnVjdCBzcGFyX3ZidXNfY2hhbm5lbF9wcm90b2NvbC5kZXZfaW5mb1s8ZGV2aXg+XS4KKy8qKgorICogd3JpdGVfdmJ1c19kZXZfaW5mbygpIC0gd3JpdGUgdGhlIGNvbnRlbnRzIG9mIDxpbmZvPiB0byB0aGUgc3RydWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzcGFyX3ZidXNfY2hhbm5lbF9wcm90b2NvbC5kZXZfaW5mb1s8ZGV2aXg+XQorICogQGNoYW46ICAgICBpbmRlbnRpZmllcyB0aGUgcy1QYXIgY2hhbm5lbCB0aGF0IHdpbGwgYmUgdXBkYXRlZAorICogQGhkcl9pbmZvOiB1c2VkIHRvIGZpbmQgYXBwcm9wcmlhdGUgY2hhbm5lbCBvZmZzZXQgdG8gd3JpdGUgZGF0YQorICogQGluZm86ICAgICBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gdG8gd3JpdGUKKyAqIEBkZXZpeDogICAgdGhlIHJlbGF0aXZlIGRldmljZSBudW1iZXIgKDAuLm4tMSkgb2YgdGhlIGRldmljZSBvbiB0aGUgYnVzCisgKgorICogV3JpdGVzIGRldmljZSBpbmZvIGludG8gdGhlIGNoYW5uZWwgbWVtb3J5IHRvIGJlIHVzZWQgZm9yIGRpYWdub3N0aWMKKyAqIHB1cnBvc2VzLgorICoKKyAqIFJldHVybnMgbm8gdmFsdWUgc2luY2UgdGhpcyBpcyBkZWJ1ZyBpbmZvcm1hdGlvbiBhbmQgbm90IG5lZWRlZCBmb3IKKyAqIGRldmljZSBmdW5jdGlvbmFsaXR5LgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogd3JpdGVfdmJ1c19kZXZfaW5mbyhzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFuLAogCQkgICAgc3RydWN0IHNwYXJfdmJ1c19oZWFkZXJpbmZvICpoZHJfaW5mbywKLQkJICAgIHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmluZm8sIGludCBkZXZpeCkKKwkJICAgIHN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmluZm8sIHVuc2lnbmVkIGludCBkZXZpeCkKIHsKIAlpbnQgb2ZmID0KIAkgICAgKHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIpICsgaGRyX2luZm8tPmRldl9pbmZvX29mZnNldCkgKwogCSAgICAoaGRyX2luZm8tPmRldmljZV9pbmZvX3N0cnVjdF9ieXRlcyAqIGRldml4KTsKIAogCWlmIChoZHJfaW5mby0+ZGV2X2luZm9fb2Zmc2V0ID09IDApCi0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm47CiAKLQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKGNoYW4sIG9mZiwgaW5mbywgc2l6ZW9mKCppbmZvKSkgPCAwKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gMDsKKwl2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbiwgb2ZmLCBpbmZvLCBzaXplb2YoKmluZm8pKTsKIH0KIAotLyogRm9yIGEgY2hpbGQgZGV2aWNlIGp1c3QgY3JlYXRlZCBvbiBhIGNsaWVudCBidXMsIGZpbGwgaW4KLSAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcml2ZXIgdGhhdCBpcyBjb250cm9sbGluZyB0aGlzIGRldmljZSBpbnRvCi0gKiB0aGUgdGhlIGFwcHJvcHJpYXRlIHNsb3Qgd2l0aGluIHRoZSB2YnVzIGNoYW5uZWwgb2YgdGhlIGJ1cwotICogaW5zdGFuY2UuCisvKioKKyAqIGZpeF92YnVzX2Rldl9pbmZvKCkgLSBmb3IgYSBjaGlsZCBkZXZpY2UganVzdCBjcmVhdGVkIG9uIGEgY2xpZW50IGJ1cywgZmlsbAorICogICAgICAgICAgICAgICAgICAgICAgIGluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkcml2ZXIgdGhhdCBpcyBjb250cm9sbGluZworICogICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZGV2aWNlIGludG8gdGhlIHRoZSBhcHByb3ByaWF0ZSBzbG90IHdpdGhpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICB2YnVzIGNoYW5uZWwgb2YgdGhlIGJ1cyBpbnN0YW5jZQorICogQHZpc29yZGV2OiBzdHJ1Y3Qgdmlzb3JfZGV2aWNlIGZvciB0aGUgZGVzaXJlZCBkZXZpY2UKICAqLwogc3RhdGljIHZvaWQKIGZpeF92YnVzX2Rldl9pbmZvKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnZpc29yZGV2KQpAQCAtOTMzLDggKzc4Nyw4IEBACiAJaW50IGk7CiAJc3RydWN0IHZpc29yX2RldmljZSAqYmRldjsKIAlzdHJ1Y3Qgdmlzb3JfZHJpdmVyICp2aXNvcmRydjsKLQlpbnQgYnVzX25vID0gdmlzb3JkZXYtPmNoaXBzZXRfYnVzX25vOwotCWludCBkZXZfbm8gPSB2aXNvcmRldi0+Y2hpcHNldF9kZXZfbm87CisJdTMyIGJ1c19ubyA9IHZpc29yZGV2LT5jaGlwc2V0X2J1c19ubzsKKwl1MzIgZGV2X25vID0gdmlzb3JkZXYtPmNoaXBzZXRfZGV2X25vOwogCXN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gZGV2X2luZm87CiAJY29uc3QgY2hhciAqY2hhbl90eXBlX25hbWUgPSBOVUxMOwogCXN0cnVjdCBzcGFyX3ZidXNfaGVhZGVyaW5mbyAqaGRyX2luZm87CkBAIC05NDIsMTcgKzc5NiwxNiBAQAogCWlmICghdmlzb3JkZXYtPmRldmljZS5kcml2ZXIpCiAJCXJldHVybjsKIAotCWhkcl9pbmZvID0gKHN0cnVjdCBzcGFyX3ZidXNfaGVhZGVyaW5mbyAqKXZpc29yZGV2LT52YnVzX2hkcl9pbmZvOwotCWlmICghaGRyX2luZm8pCi0JCXJldHVybjsKLQogCWJkZXYgPSB2aXNvcmJ1c19nZXRfZGV2aWNlX2J5X2lkKGJ1c19ubywgQlVTX1JPT1RfREVWSUNFLCBOVUxMKTsKIAlpZiAoIWJkZXYpCiAJCXJldHVybjsKLQorCWhkcl9pbmZvID0gKHN0cnVjdCBzcGFyX3ZidXNfaGVhZGVyaW5mbyAqKWJkZXYtPnZidXNfaGRyX2luZm87CisJaWYgKCFoZHJfaW5mbykKKwkJcmV0dXJuOwogCXZpc29yZHJ2ID0gdG9fdmlzb3JfZHJpdmVyKHZpc29yZGV2LT5kZXZpY2UuZHJpdmVyKTsKIAotCS8qIFdpdGhpbiB0aGUgbGlzdCBvZiBkZXZpY2UgdHlwZXMgKGJ5IEdVSUQpIHRoYXQgdGhlIGRyaXZlcgorCS8qCisJICogV2l0aGluIHRoZSBsaXN0IG9mIGRldmljZSB0eXBlcyAoYnkgR1VJRCkgdGhhdCB0aGUgZHJpdmVyCiAJICogc2F5cyBpdCBzdXBwb3J0cywgZmluZCBvdXQgd2hpY2ggb25lIG9mIHRob3NlIHR5cGVzIG1hdGNoZXMKIAkgKiB0aGUgdHlwZSBvZiB0aGlzIGRldmljZSwgc28gdGhhdCB3ZSBjYW4gaW5jbHVkZSB0aGUgZGV2aWNlCiAJICogdHlwZSBuYW1lCkBAIC05NjYsMjAgKzgxOSwxNDggQEAKIAkJfQogCX0KIAotCWJ1c19kZXZpY2VfaW5mb19pbml0KCZkZXZfaW5mbywgY2hhbl90eXBlX25hbWUsCi0JCQkgICAgIHZpc29yZHJ2LT5uYW1lLCB2aXNvcmRydi0+dmVyc2lvbiwKLQkJCSAgICAgdmlzb3JkcnYtPnZlcnRhZyk7CisJYnVzX2RldmljZV9pbmZvX2luaXQoJmRldl9pbmZvLCBjaGFuX3R5cGVfbmFtZSwgdmlzb3JkcnYtPm5hbWUpOwogCXdyaXRlX3ZidXNfZGV2X2luZm8oYmRldi0+dmlzb3JjaGFubmVsLCBoZHJfaW5mbywgJmRldl9pbmZvLCBkZXZfbm8pOwogCi0JLyogUmUtd3JpdGUgYnVzK2NoaXBzZXQgaW5mbywgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoaXMKLQkqIHdhcyBwcmV2aW91c2x5IHdyaXR0ZW4gYnkgb3VyIGV2aWwgY291bnRlcnBhcnQsIHZpcnRwY2kuCi0JKi8KKwkvKgorCSAqIFJlLXdyaXRlIGJ1cytjaGlwc2V0IGluZm8sIGJlY2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzCisJICogd2FzIHByZXZpb3VzbHkgd3JpdHRlbiBieSBvdXIgZXZpbCBjb3VudGVycGFydCwgdmlydHBjaS4KKwkgKi8KIAl3cml0ZV92YnVzX2NocF9pbmZvKGJkZXYtPnZpc29yY2hhbm5lbCwgaGRyX2luZm8sICZjaGlwc2V0X2RyaXZlcmluZm8pOwogCXdyaXRlX3ZidXNfYnVzX2luZm8oYmRldi0+dmlzb3JjaGFubmVsLCBoZHJfaW5mbywKIAkJCSAgICAmY2xpZW50YnVzX2RyaXZlcmluZm8pOwogfQogCi0vKiogQ3JlYXRlIGEgZGV2aWNlIGluc3RhbmNlIGZvciB0aGUgdmlzb3IgYnVzIGl0c2VsZi4KKy8qKgorICogdmlzb3Jkcml2ZXJfcHJvYmVfZGV2aWNlKCkgLSBoYW5kbGUgbmV3IHZpc29yIGRldmljZSBjb21pbmcgb25saW5lCisgKiBAeGRldjogc3RydWN0IGRldmljZSBmb3IgdGhlIHZpc29yIGRldmljZSBiZWluZyBwcm9iZWQKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHVwb24gYWRkaW5nIGEgdmlzb3JfZGV2aWNlIChkZXZpY2VfYWRkKSwgb3IKKyAqIGFkZGluZyBhIHZpc29yX2RyaXZlciAodmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKSwgYnV0IG9ubHkgYWZ0ZXIKKyAqIHZpc29yYnVzX21hdGNoKCkgaGFzIHJldHVybmVkIDEgdG8gaW5kaWNhdGUgYSBzdWNjZXNzZnVsIG1hdGNoIGJldHdlZW4KKyAqIGRyaXZlciBhbmQgZGV2aWNlLgorICoKKyAqIElmIHN1Y2Nlc3NmdWwsIGEgcmVmZXJlbmNlIHRvIHRoZSBkZXZpY2Ugd2lsbCBiZSBoZWxkIG9udG8gdmlhIGdldF9kZXZpY2UoKS4KKyAqCisgKiBSZXR1cm46IDAgaWYgc3VjY2Vzc2Z1bCwgbWVhbmluZyB0aGUgZnVuY3Rpb24gZHJpdmVyJ3MgcHJvYmUoKSBmdW5jdGlvbgorICogICAgICAgICB3YXMgc3VjY2Vzc2Z1bCB3aXRoIHRoaXMgZGV2aWNlLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubworICogICAgICAgICB2YWx1ZSBpbmRpY2F0aW5nIGZhaWx1cmUgcmVhc29uCisgKi8KK3N0YXRpYyBpbnQKK3Zpc29yZHJpdmVyX3Byb2JlX2RldmljZShzdHJ1Y3QgZGV2aWNlICp4ZGV2KQoreworCWludCByZXM7CisJc3RydWN0IHZpc29yX2RyaXZlciAqZHJ2OworCXN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldjsKKworCWRydiA9IHRvX3Zpc29yX2RyaXZlcih4ZGV2LT5kcml2ZXIpOworCWRldiA9IHRvX3Zpc29yX2RldmljZSh4ZGV2KTsKKworCWlmICghZHJ2LT5wcm9iZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOworCWRldi0+YmVpbmdfcmVtb3ZlZCA9IGZhbHNlOworCisJcmVzID0gZHJ2LT5wcm9iZShkZXYpOworCWlmIChyZXMgPj0gMCkgeworCQkvKiBzdWNjZXNzOiByZWZlcmVuY2Uga2VwdCB2aWEgdW5tYXRjaGVkIGdldF9kZXZpY2UoKSAqLworCQlnZXRfZGV2aWNlKCZkZXYtPmRldmljZSk7CisJCWZpeF92YnVzX2Rldl9pbmZvKGRldik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkZXYtPnZpc29yZHJpdmVyX2NhbGxiYWNrX2xvY2spOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkgLSByZWdpc3RlcnMgdGhlIHByb3ZpZGVkIHZpc29yIGRyaXZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaGFuZGxpbmcgb25lIG9yIG1vcmUgdmlzb3IgZGV2aWNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIChjaGFubmVsX3R5cGVzKQorICogQGRydjogdGhlIGRyaXZlciB0byByZWdpc3RlcgorICoKKyAqIEEgdmlzb3IgZnVuY3Rpb24gZHJpdmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gcmVnaXN0ZXIKKyAqIHRoZSBkcml2ZXIuICBUaGUgY2FsbGVyIE1VU1QgZmlsbCBpbiB0aGUgZm9sbG93aW5nIGZpZWxkcyB3aXRoaW4gdGhlCisgKiAjZHJ2IHN0cnVjdHVyZToKKyAqICAgICBuYW1lLCB2ZXJzaW9uLCBvd25lciwgY2hhbm5lbF90eXBlcywgcHJvYmUsIHJlbW92ZQorICoKKyAqIEhlcmUncyBob3cgdGhlIHdob2xlIExpbnV4IGJ1cyAvIGRyaXZlciAvIGRldmljZSBtb2RlbCB3b3Jrcy4KKyAqCisgKiBBdCBzeXN0ZW0gc3RhcnQtdXAsIHRoZSB2aXNvcmJ1cyBrZXJuZWwgbW9kdWxlIGlzIGxvYWRlZCwgd2hpY2ggcmVnaXN0ZXJzCisgKiB2aXNvcmJ1c190eXBlIGFzIGEgYnVzIHR5cGUsIHVzaW5nIGJ1c19yZWdpc3RlcigpLgorICoKKyAqIEFsbCBrZXJuZWwgbW9kdWxlcyB0aGF0IHN1cHBvcnQgcGFydGljdWxhciBkZXZpY2UgdHlwZXMgb24gYQorICogdmlzb3JidXMgYnVzIGFyZSBsb2FkZWQuICBFYWNoIG9mIHRoZXNlIGtlcm5lbCBtb2R1bGVzIGNhbGxzCisgKiB2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIoKSBpbiB0aGVpciBpbml0IGZ1bmN0aW9ucywgcGFzc2luZyBhCisgKiB2aXNvcl9kcml2ZXIgc3RydWN0LiAgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkgaW4gdHVybiBjYWxscworICogcmVnaXN0ZXJfZHJpdmVyKCZ2aXNvcl9kcml2ZXIuZHJpdmVyKS4gIFRoaXMgLmRyaXZlciBtZW1iZXIgaXMKKyAqIGluaXRpYWxpemVkIHdpdGggZ2VuZXJpYyBtZXRob2RzIChsaWtlIHByb2JlKSwgd2hvc2Ugc29sZSByZXNwb25zaWJpbGl0eQorICogaXMgdG8gYWN0IGFzIGEgYnJva2VyIGZvciB0aGUgcmVhbCBtZXRob2RzLCB3aGljaCBhcmUgd2l0aGluIHRoZQorICogdmlzb3JfZHJpdmVyIHN0cnVjdC4gIChUaGlzIGlzIHRoZSB3YXkgdGhlIHN1YmNsYXNzIGJlaGF2aW9yIGlzCisgKiBpbXBsZW1lbnRlZCwgc2luY2Ugdmlzb3JfZHJpdmVyIGlzIGVzc2VudGlhbGx5IGEgc3ViY2xhc3Mgb2YgdGhlCisgKiBnZW5lcmljIGRyaXZlci4pICBXaGVuZXZlciBhIGRyaXZlcl9yZWdpc3RlcigpIGhhcHBlbnMsIGNvcmUgYnVzIGNvZGUgaW4KKyAqIHRoZSBrZXJuZWwgZG9lcyAoc2VlIGRldmljZV9hdHRhY2goKSBpbiBkcml2ZXJzL2Jhc2UvZGQuYyk6CisgKgorICogICAgIGZvciBlYWNoIGRldiBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1cyAodGhlIGJ1cyB0aGF0IGRyaXZlciBpcyBvbikgdGhhdAorICogICAgIGRvZXMgbm90IHlldCBoYXZlIGEgZHJpdmVyCisgKiAgICAgICAgIGlmIGJ1cy5tYXRjaChkZXYsbmV3ZHJpdmVyKSA9PSB5ZXNfbWF0Y2hlZCAgKiogLm1hdGNoIHNwZWNpZmllZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiBkdXJpbmcgYnVzX3JlZ2lzdGVyKCkuCisgKiAgICAgICAgICAgICBuZXdkcml2ZXIucHJvYmUoZGV2KSAgKiogZm9yIHZpc29yIGRyaXZlcnMsIHRoaXMgd2lsbCBjYWxsCisgKiAgICAgICAgICAgICAgICAgICAqKiB0aGUgZ2VuZXJpYyBkcml2ZXIucHJvYmUgaW1wbGVtZW50ZWQgaW4gdmlzb3JidXMuYywKKyAqICAgICAgICAgICAgICAgICAgICoqIHdoaWNoIGluIHR1cm4gY2FsbHMgdGhlIHByb2JlIHNwZWNpZmllZCB3aXRoaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAqKiBzdHJ1Y3Qgdmlzb3JfZHJpdmVyICh3aGljaCB3YXMgc3BlY2lmaWVkIGJ5IHRoZQorICogICAgICAgICAgICAgICAgICAgKiogYWN0dWFsIGRldmljZSBkcml2ZXIgYXMgcGFydCBvZgorICogICAgICAgICAgICAgICAgICAgKiogdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKCkpLgorICoKKyAqIFRoZSBhYm92ZSBkYW5jZSBhbHNvIGhhcHBlbnMgd2hlbiBhIG5ldyBkZXZpY2UgYXBwZWFycy4KKyAqIFNvIHRoZSBxdWVzdGlvbiBpcywgaG93IGFyZSBkZXZpY2VzIGNyZWF0ZWQgd2l0aGluIHRoZSBzeXN0ZW0/CisgKiBCYXNpY2FsbHksIGp1c3QgY2FsbCBkZXZpY2VfYWRkKGRldikuICBTZWUgcGNpX2J1c19hZGRfZGV2aWNlcygpLgorICogcGNpX3NjYW5fZGV2aWNlKCkgc2hvd3MgYW4gZXhhbXBsZSBvZiBob3cgdG8gYnVpbGQgYSBkZXZpY2Ugc3RydWN0LiAgSXQKKyAqIHJldHVybnMgdGhlIG5ld2x5LWNyZWF0ZWQgc3RydWN0IHRvIHBjaV9zY2FuX3NpbmdsZV9kZXZpY2UoKSwgd2hvIGFkZHMgaXQKKyAqIHRvIHRoZSBsaXN0IG9mIGRldmljZXMgYXQgUENJQlVTLmRldmljZXMuICBUaGF0IGxpc3Qgb2YgZGV2aWNlcyBpcyB3aGF0CisgKiBpcyB0cmF2ZXJzZWQgYnkgcGNpX2J1c19hZGRfZGV2aWNlcygpLgorICoKKyAqIFJldHVybjogaW50ZWdlciBpbmRpY2F0aW5nIHN1Y2Nlc3MgKHplcm8pIG9yIGZhaWx1cmUgKG5vbi16ZXJvKQorICovCitpbnQgdmlzb3JidXNfcmVnaXN0ZXJfdmlzb3JfZHJpdmVyKHN0cnVjdCB2aXNvcl9kcml2ZXIgKmRydikKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKGJ1c3JlZ19yYyA8IDApCisJCXJldHVybiAtRU5PREVWOyAvKmNhbid0IHJlZ2lzdGVyIG9uIGEgbm9uZXhpc3RlbnQgYnVzKi8KKworCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CisJZHJ2LT5kcml2ZXIuYnVzID0gJnZpc29yYnVzX3R5cGU7CisJZHJ2LT5kcml2ZXIucHJvYmUgPSB2aXNvcmRyaXZlcl9wcm9iZV9kZXZpY2U7CisJZHJ2LT5kcml2ZXIucmVtb3ZlID0gdmlzb3Jkcml2ZXJfcmVtb3ZlX2RldmljZTsKKwlkcnYtPmRyaXZlci5vd25lciA9IGRydi0+b3duZXI7CisKKwkvKgorCSAqIGRyaXZlcl9yZWdpc3RlciBkb2VzIHRoaXM6CisJICogICBidXNfYWRkX2RyaXZlcihkcnYpCisJICogICAtPmlmIChkcnYuYnVzKSAgKiogKGJ1c190eXBlKSAqKgorCSAqICAgICAgIGRyaXZlcl9hdHRhY2goZHJ2KQorCSAqICAgICAgICAgZm9yIGVhY2ggZGV2IHdpdGggYnVzIHR5cGUgb2YgZHJ2LmJ1cworCSAqICAgICAgICAgICBpZiAoIWRldi5kcnYpICAqKiBubyBkcml2ZXIgYXNzaWduZWQgeWV0ICoqCisJICogICAgICAgICAgICAgaWYgKGJ1cy5tYXRjaChkZXYsZHJ2KSkgIFt2aXNvcmJ1c19tYXRjaF0KKwkgKiAgICAgICAgICAgICAgIGRldi5kcnYgPSBkcnYKKwkgKiAgICAgICAgICAgICAgIGlmICghZHJ2LnByb2JlKGRldikpICAgW3Zpc29yZHJpdmVyX3Byb2JlX2RldmljZV0KKwkgKiAgICAgICAgICAgICAgICAgZGV2LmRydiA9IE5VTEwKKwkgKi8KKworCXJjID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CisJaWYgKHJjIDwgMCkKKwkJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmJ1c19yZWdpc3Rlcl92aXNvcl9kcml2ZXIpOworCisvKioKKyAqIGNyZWF0ZV9idXNfaW5zdGFuY2UoKSAtIGNyZWF0ZSBhIGRldmljZSBpbnN0YW5jZSBmb3IgdGhlIHZpc29yIGJ1cyBpdHNlbGYKKyAqIEBkZXY6IHN0cnVjdCB2aXNvcl9kZXZpY2UgaW5kaWNhdGluZyB0aGUgYnVzIGluc3RhbmNlCisgKgorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBvdGhlcndpc2UgbmVnYXRpdmUgZXJybm8gdmFsdWUgaW5kaWNhdGluZyByZWFzb24gZm9yCisgKiAgICAgICAgIGZhaWx1cmUKICAqLwogc3RhdGljIGludAogY3JlYXRlX2J1c19pbnN0YW5jZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpCkBAIC0xMDE0LDI1ICs5OTUsMjYgQEAKIAl9IGVsc2UgewogCQlrZnJlZShoZHJfaW5mbyk7CiAJfQotCWJ1c19jb3VudCsrOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+bGlzdF9hbGwsICZsaXN0X2FsbF9idXNfaW5zdGFuY2VzKTsKIAlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2aWNlLCBkZXYpOwogCXJldHVybiAwOwogfQogCi0vKiogUmVtb3ZlIGEgZGV2aWNlIGluc3RhbmNlIGZvciB0aGUgdmlzb3IgYnVzIGl0c2VsZi4KKy8qKgorICogcmVtb3ZlX2J1c19pbnN0YW5jZSgpIC0gcmVtb3ZlIGEgZGV2aWNlIGluc3RhbmNlIGZvciB0aGUgdmlzb3IgYnVzIGl0c2VsZgorICogQGRldjogc3RydWN0IHZpc29yX2RldmljZSBpbmRlbnRpZnlpbmcgdGhlIGJ1cyB0byByZW1vdmUKICAqLwogc3RhdGljIHZvaWQKIHJlbW92ZV9idXNfaW5zdGFuY2Uoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KQogewotCS8qIE5vdGUgdGhhdCB0aGlzIHdpbGwgcmVzdWx0IGluIHRoZSByZWxlYXNlIG1ldGhvZCBmb3IKKwkvKgorCSAqIE5vdGUgdGhhdCB0aGlzIHdpbGwgcmVzdWx0IGluIHRoZSByZWxlYXNlIG1ldGhvZCBmb3IKIAkgKiBkZXYtPmRldiBiZWluZyBjYWxsZWQsIHdoaWNoIHdpbGwgY2FsbAogCSAqIHZpc29yYnVzX3JlbGVhc2VfYnVzZGV2aWNlKCkuICBUaGlzIGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aAogCSAqIHRoZSBwdXRfZGV2aWNlKCkgZG9uZSBpbiBkZXZpY2VfdW5yZWdpc3RlcigpLCBidXQgSSBoYXZlIG5ldmVyCiAJICogc3VjY2Vzc2Z1bGx5IGJlZW4gYWJsZSB0byB0cmFjZSB0aHJ1IHRoZSBjb2RlIHRvIHNlZSB3aGVyZS9ob3cKIAkgKiByZWxlYXNlKCkgZ2V0cyBjYWxsZWQuICBCdXQgSSBrbm93IGl0IGRvZXMuCiAJICovCi0JYnVzX2NvdW50LS07CiAJaWYgKGRldi0+dmlzb3JjaGFubmVsKSB7CiAJCXZpc29yY2hhbm5lbF9kZXN0cm95KGRldi0+dmlzb3JjaGFubmVsKTsKIAkJZGV2LT52aXNvcmNoYW5uZWwgPSBOVUxMOwpAQCAtMTA0Miw4ICsxMDI0LDExIEBACiAJZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2aWNlKTsKIH0KIAotLyoqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIG9uZS1hbmQtb25seSBvbmUgaW5zdGFuY2Ugb2YKLSAqICB0aGUgdmlzb3IgYnVzIHR5cGUgKHZpc29yYnVzX3R5cGUpLgorLyoqCisgKiBjcmVhdGVfYnVzX3R5cGUoKSAtIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIG9uZS1hbmQtb25seSBvbmUgaW5zdGFuY2Ugb2YKKyAqICAgICAgICAgICAgICAgICAgICAgdGhlIHZpc29yIGJ1cyB0eXBlICh2aXNvcmJ1c190eXBlKQorICogUmV0dXJuOiAwIGZvciBzdWNjZXNzLCBvdGhlcndpc2UgbmVnYXRpdmUgZXJybm8gdmFsdWUgcmV0dXJuZWQgYnkKKyAqICAgICAgICAgYnVzX3JlZ2lzdGVyKCkgaW5kaWNhdGluZyB0aGUgcmVhc29uIGZvciBmYWlsdXJlCiAgKi8KIHN0YXRpYyBpbnQKIGNyZWF0ZV9idXNfdHlwZSh2b2lkKQpAQCAtMTA1Miw3ICsxMDM3LDkgQEAKIAlyZXR1cm4gYnVzcmVnX3JjOwogfQogCi0vKiogUmVtb3ZlIHRoZSBvbmUtYW5kLW9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSB2aXNvciBidXMgdHlwZSAodmlzb3JidXNfdHlwZSkuCisvKioKKyAqIHJlbW92ZV9idXNfdHlwZSgpIC0gcmVtb3ZlIHRoZSBvbmUtYW5kLW9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSB2aXNvciBidXMKKyAqICAgICAgICAgICAgICAgICAgICAgdHlwZSAodmlzb3JidXNfdHlwZSkKICAqLwogc3RhdGljIHZvaWQKIHJlbW92ZV9idXNfdHlwZSh2b2lkKQpAQCAtMTA2MCw3ICsxMDQ3LDggQEAKIAlidXNfdW5yZWdpc3Rlcigmdmlzb3JidXNfdHlwZSk7CiB9CiAKLS8qKiBSZW1vdmUgYWxsIGNoaWxkIHZpc29yIGJ1cyBkZXZpY2UgaW5zdGFuY2VzLgorLyoqCisgKiByZW1vdmVfYWxsX3Zpc29yX2RldmljZXMoKSAtIHJlbW92ZSBhbGwgY2hpbGQgdmlzb3IgYnVzIGRldmljZSBpbnN0YW5jZXMKICAqLwogc3RhdGljIHZvaWQKIHJlbW92ZV9hbGxfdmlzb3JfZGV2aWNlcyh2b2lkKQpAQCAtMTA3NSw3ICsxMDYzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBjaGlwc2V0X2J1c19jcmVhdGUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KQogewogCWludCByYzsKQEAgLTEwOTIsMTkgKzEwODAsMTcgQEAKIAkJUE9TVENPREVfTElOVVhfMyhDSElQU0VUX0lOSVRfU1VDQ0VTU19QQywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKIAotCWlmIChjaGlwc2V0X3Jlc3BvbmRlcnMuYnVzX2NyZWF0ZSkKLQkJKCpjaGlwc2V0X3Jlc3BvbmRlcnMuYnVzX2NyZWF0ZSkgKGRldiwgcmMpOworCWJ1c19jcmVhdGVfcmVzcG9uc2UoZGV2LCByYyk7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBjaGlwc2V0X2J1c19kZXN0cm95KHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldikKIHsKIAlyZW1vdmVfYnVzX2luc3RhbmNlKGRldik7Ci0JaWYgKGNoaXBzZXRfcmVzcG9uZGVycy5idXNfZGVzdHJveSkKLQkJKCpjaGlwc2V0X3Jlc3BvbmRlcnMuYnVzX2Rlc3Ryb3kpKGRldiwgMCk7CisJYnVzX2Rlc3Ryb3lfcmVzcG9uc2UoZGV2LCAwKTsKIH0KIAotc3RhdGljIHZvaWQKK3ZvaWQKIGNoaXBzZXRfZGV2aWNlX2NyZWF0ZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbykKIHsKIAlpbnQgcmM7CkBAIC0xMTE1LDggKzExMDEsNyBAQAogCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCiAJcmMgPSBjcmVhdGVfdmlzb3JfZGV2aWNlKGRldl9pbmZvKTsKLQlpZiAoY2hpcHNldF9yZXNwb25kZXJzLmRldmljZV9jcmVhdGUpCi0JCWNoaXBzZXRfcmVzcG9uZGVycy5kZXZpY2VfY3JlYXRlKGRldl9pbmZvLCByYyk7CisJZGV2aWNlX2NyZWF0ZV9yZXNwb25zZShkZXZfaW5mbywgcmMpOwogCiAJaWYgKHJjIDwgMCkKIAkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLApAQCAtMTEyNiwxOCArMTExMSwyMiBAQAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKIH0KIAotc3RhdGljIHZvaWQKK3ZvaWQKIGNoaXBzZXRfZGV2aWNlX2Rlc3Ryb3koc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8pCiB7CiAJcmVtb3ZlX3Zpc29yX2RldmljZShkZXZfaW5mbyk7CiAKLQlpZiAoY2hpcHNldF9yZXNwb25kZXJzLmRldmljZV9kZXN0cm95KQotCQkoKmNoaXBzZXRfcmVzcG9uZGVycy5kZXZpY2VfZGVzdHJveSkgKGRldl9pbmZvLCAwKTsKKwlkZXZpY2VfZGVzdHJveV9yZXNwb25zZShkZXZfaW5mbywgMCk7CiB9CiAKLS8qIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHNwZWNpZmllZCBmb3IgYSBmdW5jdGlvbiBkcml2ZXIsIHRvCi0gKiBiZSBjYWxsZWQgd2hlbiBhIHBlbmRpbmcgInBhdXNlIGRldmljZSIgb3BlcmF0aW9uIGhhcyBiZWVuCi0gKiBjb21wbGV0ZWQuCisvKioKKyAqIHBhdXNlX3N0YXRlX2NoYW5nZV9jb21wbGV0ZSgpIC0gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc29yYnVzIGZ1bmN0aW9uIGRyaXZlciB3aGVuIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZyAicGF1c2UgZGV2aWNlIiBvcGVyYXRpb24gaGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZAorICogQGRldjogc3RydWN0IHZpc29yX2RldmljZSBpZGVudGlmeWluZyB0aGUgcGF1c2VkIGRldmljZQorICogQHN0YXR1czogMCBpZmYgdGhlIHBhdXNlIHN0YXRlIGNoYW5nZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBvdGhlcndpc2UKKyAqICAgICAgICAgIGEgbmVnYXRpdmUgZXJybm8gdmFsdWUgaW5kaWNhdGluZyB0aGUgcmVhc29uIGZvciBmYWlsdXJlCiAgKi8KIHN0YXRpYyB2b2lkCiBwYXVzZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LCBpbnQgc3RhdHVzKQpAQCAtMTE0NiwxOSArMTEzNSwxOCBAQAogCQlyZXR1cm47CiAKIAlkZXYtPnBhdXNpbmcgPSBmYWxzZTsKLQlpZiAoIWNoaXBzZXRfcmVzcG9uZGVycy5kZXZpY2VfcGF1c2UpIC8qIHRoaXMgY2FuIG5ldmVyIGhhcHBlbiEgKi8KLQkJcmV0dXJuOwogCi0JLyogTm90aWZ5IHRoZSBjaGlwc2V0IGRyaXZlciB0aGF0IHRoZSBwYXVzZSBpcyBjb21wbGV0ZSwgd2hpY2gKLQkgKiB3aWxsIHByZXN1bWFibHkgd2FudCB0byBzZW5kIHNvbWUgc29ydCBvZiByZXNwb25zZSB0byB0aGUKLQkgKiBpbml0aWF0b3IuCi0JICovCi0JKCpjaGlwc2V0X3Jlc3BvbmRlcnMuZGV2aWNlX3BhdXNlKSAoZGV2LCBzdGF0dXMpOworCWRldmljZV9wYXVzZV9yZXNwb25zZShkZXYsIHN0YXR1cyk7CiB9CiAKLS8qIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHNwZWNpZmllZCBmb3IgYSBmdW5jdGlvbiBkcml2ZXIsIHRvCi0gKiBiZSBjYWxsZWQgd2hlbiBhIHBlbmRpbmcgInJlc3VtZSBkZXZpY2UiIG9wZXJhdGlvbiBoYXMgYmVlbgotICogY29tcGxldGVkLgorLyoqCisgKiByZXN1bWVfc3RhdGVfY2hhbmdlX2NvbXBsZXRlKCkgLSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc29yYnVzIGZ1bmN0aW9uIGRyaXZlciB3aGVuIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcgInJlc3VtZSBkZXZpY2UiIG9wZXJhdGlvbiBoYXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZAorICogQGRldjogc3RydWN0IHZpc29yX2RldmljZSBpZGVudGlmeWluZyB0aGUgcmVzdW1lZCBkZXZpY2UKKyAqIEBzdGF0dXM6IDAgaWZmIHRoZSByZXN1bWUgc3RhdGUgY2hhbmdlIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIG90aGVyd2lzZQorICogICAgICAgICAgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZSBpbmRpY2F0aW5nIHRoZSByZWFzb24gZm9yIGZhaWx1cmUKICAqLwogc3RhdGljIHZvaWQKIHJlc3VtZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LCBpbnQgc3RhdHVzKQpAQCAtMTE2NywxOSArMTE1NSwyNSBAQAogCQlyZXR1cm47CiAKIAlkZXYtPnJlc3VtaW5nID0gZmFsc2U7Ci0JaWYgKCFjaGlwc2V0X3Jlc3BvbmRlcnMuZGV2aWNlX3Jlc3VtZSkgLyogdGhpcyBjYW4gbmV2ZXIgaGFwcGVuISAqLwotCQlyZXR1cm47CiAKLQkvKiBOb3RpZnkgdGhlIGNoaXBzZXQgZHJpdmVyIHRoYXQgdGhlIHJlc3VtZSBpcyBjb21wbGV0ZSwKKwkvKgorCSAqIE5vdGlmeSB0aGUgY2hpcHNldCBkcml2ZXIgdGhhdCB0aGUgcmVzdW1lIGlzIGNvbXBsZXRlLAogCSAqIHdoaWNoIHdpbGwgcHJlc3VtYWJseSB3YW50IHRvIHNlbmQgc29tZSBzb3J0IG9mIHJlc3BvbnNlIHRvCiAJICogdGhlIGluaXRpYXRvci4KIAkgKi8KLQkoKmNoaXBzZXRfcmVzcG9uZGVycy5kZXZpY2VfcmVzdW1lKSAoZGV2LCBzdGF0dXMpOworCWRldmljZV9yZXN1bWVfcmVzcG9uc2UoZGV2LCBzdGF0dXMpOwogfQogCi0vKiBUZWxsIHRoZSBzdWJvcmRpbmF0ZSBmdW5jdGlvbiBkcml2ZXIgZm9yIGEgc3BlY2lmaWMgZGV2aWNlIHRvIHBhdXNlCi0gKiBvciByZXN1bWUgdGhhdCBkZXZpY2UuICBSZXN1bHQgaXMgcmV0dXJuZWQgYXN5bmNocm9ub3VzbHkgdmlhIGEKLSAqIGNhbGxiYWNrIGZ1bmN0aW9uLgorLyoqCisgKiBpbml0aWF0ZV9jaGlwc2V0X2RldmljZV9wYXVzZV9yZXN1bWUoKSAtIHN0YXJ0IGEgcGF1c2Ugb3IgcmVzdW1lIG9wZXJhdGlvbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSB2aXNvciBkZXZpY2UKKyAqIEBkZXY6IHN0cnVjdCB2aXNvcl9kZXZpY2UgaWRlbnRpZnlpbmcgdGhlIGRldmljZSBiZWluZyBwYXVzZWQgb3IgcmVzdW1lZAorICogQGlzX3BhdXNlOiB0cnVlIHRvIGluZGljYXRlIHBhdXNlIG9wZXJhdGlvbiwgZmFsc2UgdG8gaW5kaWNhdGUgcmVzdW1lCisgKgorICogVGVsbCB0aGUgc3Vib3JkaW5hdGUgZnVuY3Rpb24gZHJpdmVyIGZvciBhIHNwZWNpZmljIGRldmljZSB0byBwYXVzZQorICogb3IgcmVzdW1lIHRoYXQgZGV2aWNlLiAgU3VjY2Vzcy9mYWlsdXJlIHJlc3VsdCBpcyByZXR1cm5lZCBhc3luY2hyb25vdXNseQorICogdmlhIGEgY2FsbGJhY2sgZnVuY3Rpb247IHNlZSBwYXVzZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoKSBhbmQKKyAqIHJlc3VtZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoKS4KICAqLwogc3RhdGljIHZvaWQKIGluaXRpYXRlX2NoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3VtZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsIGJvb2wgaXNfcGF1c2UpCkBAIC0xMTg5LDkgKzExODMsOSBAQAogCXZvaWQgKCpub3RpZnlfZnVuYykoc3RydWN0IHZpc29yX2RldmljZSAqZGV2LCBpbnQgcmVzcG9uc2UpID0gTlVMTDsKIAogCWlmIChpc19wYXVzZSkKLQkJbm90aWZ5X2Z1bmMgPSBjaGlwc2V0X3Jlc3BvbmRlcnMuZGV2aWNlX3BhdXNlOworCQlub3RpZnlfZnVuYyA9IGRldmljZV9wYXVzZV9yZXNwb25zZTsKIAllbHNlCi0JCW5vdGlmeV9mdW5jID0gY2hpcHNldF9yZXNwb25kZXJzLmRldmljZV9yZXN1bWU7CisJCW5vdGlmeV9mdW5jID0gZGV2aWNlX3Jlc3VtZV9yZXNwb25zZTsKIAlpZiAoIW5vdGlmeV9mdW5jKQogCQlyZXR1cm47CiAKQEAgLTEyMDYsNyArMTIwMCw4IEBACiAJCXJldHVybjsKIAl9CiAKLQkvKiBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggYm90aCBkcnYtPnBhdXNlKCkgYW5kIGRydi0+cmVzdW1lCisJLyoKKwkgKiBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggYm90aCBkcnYtPnBhdXNlKCkgYW5kIGRydi0+cmVzdW1lCiAJICogc3BlY2lmeSBhIGNhbGxiYWNrIGZ1bmN0aW9uLCBpdCBpcyBOT1QgbmVjZXNzYXJ5IGZvciB1cyB0bwogCSAqIGluY3JlbWVudCBvdXIgbG9jYWwgbW9kdWxlIHVzYWdlIGNvdW50LiAgUmVhc29uIGlzLCB0aGVyZQogCSAqIGlzIGFscmVhZHkgYSBsaW5rYWdlIGRlcGVuZGVuY3kgYmV0d2VlbiBjaGlsZCBmdW5jdGlvbgpAQCAtMTI0NiwzMyArMTI0MSw0MSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQKKy8qKgorICogY2hpcHNldF9kZXZpY2VfcGF1c2UoKSAtIHN0YXJ0IGEgcGF1c2Ugb3BlcmF0aW9uIGZvciBhIHZpc29yIGRldmljZQorICogQGRldl9pbmZvOiBzdHJ1Y3Qgdmlzb3JfZGV2aWNlIGlkZW50aWZ5aW5nIHRoZSBkZXZpY2UgYmVpbmcgcGF1c2VkCisgKgorICogVGVsbCB0aGUgc3Vib3JkaW5hdGUgZnVuY3Rpb24gZHJpdmVyIGZvciBhIHNwZWNpZmljIGRldmljZSB0byBwYXVzZQorICogdGhhdCBkZXZpY2UuICBTdWNjZXNzL2ZhaWx1cmUgcmVzdWx0IGlzIHJldHVybmVkIGFzeW5jaHJvbm91c2x5CisgKiB2aWEgYSBjYWxsYmFjayBmdW5jdGlvbjsgc2VlIHBhdXNlX3N0YXRlX2NoYW5nZV9jb21wbGV0ZSgpLgorICovCit2b2lkCiBjaGlwc2V0X2RldmljZV9wYXVzZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbykKIHsKIAlpbml0aWF0ZV9jaGlwc2V0X2RldmljZV9wYXVzZV9yZXN1bWUoZGV2X2luZm8sIHRydWUpOwogfQogCi1zdGF0aWMgdm9pZAorLyoqCisgKiBjaGlwc2V0X2RldmljZV9yZXN1bWUoKSAtIHN0YXJ0IGEgcmVzdW1lIG9wZXJhdGlvbiBmb3IgYSB2aXNvciBkZXZpY2UKKyAqIEBkZXZfaW5mbzogc3RydWN0IHZpc29yX2RldmljZSBpZGVudGlmeWluZyB0aGUgZGV2aWNlIGJlaW5nIHJlc3VtZWQKKyAqCisgKiBUZWxsIHRoZSBzdWJvcmRpbmF0ZSBmdW5jdGlvbiBkcml2ZXIgZm9yIGEgc3BlY2lmaWMgZGV2aWNlIHRvIHJlc3VtZQorICogdGhhdCBkZXZpY2UuICBTdWNjZXNzL2ZhaWx1cmUgcmVzdWx0IGlzIHJldHVybmVkIGFzeW5jaHJvbm91c2x5CisgKiB2aWEgYSBjYWxsYmFjayBmdW5jdGlvbjsgc2VlIHJlc3VtZV9zdGF0ZV9jaGFuZ2VfY29tcGxldGUoKS4KKyAqLwordm9pZAogY2hpcHNldF9kZXZpY2VfcmVzdW1lKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKQogewogCWluaXRpYXRlX2NoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3VtZShkZXZfaW5mbywgZmFsc2UpOwogfQogCi1zdHJ1Y3QgY2hhbm5lbF9zaXplX2luZm8gewotCXV1aWRfbGUgZ3VpZDsKLQl1bnNpZ25lZCBsb25nIG1pbl9zaXplOwotCXVuc2lnbmVkIGxvbmcgbWF4X3NpemU7Ci19OwotCiBpbnQKIHZpc29yYnVzX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwogCiAJUE9TVENPREVfTElOVVhfMyhEUklWRVJfRU5UUllfUEMsIDAsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwotCWJ1c19kZXZpY2VfaW5mb19pbml0KCZjbGllbnRidXNfZHJpdmVyaW5mbywKLQkJCSAgICAgImNsaWVudGJ1cyIsICJ2aXNvcmJ1cyIsCi0JCQkgICAgIFZFUlNJT04sIE5VTEwpOworCWJ1c19kZXZpY2VfaW5mb19pbml0KCZjbGllbnRidXNfZHJpdmVyaW5mbywgImNsaWVudGJ1cyIsICJ2aXNvcmJ1cyIpOwogCiAJZXJyID0gY3JlYXRlX2J1c190eXBlKCk7CiAJaWYgKGVyciA8IDApIHsKQEAgLTEyODAsMTkgKzEyODMsNyBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCXBlcmlvZGljX2Rldl93b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidmlzb3JidXNfZGV2Iik7Ci0JaWYgKCFwZXJpb2RpY19kZXZfd29ya3F1ZXVlKSB7Ci0JCVBPU1RDT0RFX0xJTlVYXzIoQ1JFQVRFX1dPUktRVUVVRV9QQywgRElBR19TRVZFUklUWV9FUlIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yOwotCX0KLQotCS8qIFRoaXMgZW5hYmxlcyB1cyB0byByZWNlaXZlIG5vdGlmaWNhdGlvbnMgd2hlbiBkZXZpY2VzIGFwcGVhciBmb3IKLQkgKiB3aGljaCB0aGlzIHNlcnZpY2UgcGFydGl0aW9uIGlzIHRvIGJlIGEgc2VydmVyIGZvci4KLQkgKi8KLQl2aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2KCZjaGlwc2V0X25vdGlmaWVycywKLQkJCQkgICAgICZjaGlwc2V0X3Jlc3BvbmRlcnMsCi0JCQkJICAgICAmY2hpcHNldF9kcml2ZXJpbmZvKTsKKwlidXNfZGV2aWNlX2luZm9faW5pdCgmY2hpcHNldF9kcml2ZXJpbmZvLCAiY2hpcHNldCIsICJ2aXNvcmNoaXBzZXQiKTsKIAogCXJldHVybiAwOwogCkBAIC0xMzA2LDIwICsxMjk3LDggQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ZW50cnksICpsaXN0dG1wOwogCi0Jdmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2RldihOVUxMLCBOVUxMLCBOVUxMKTsKIAlyZW1vdmVfYWxsX3Zpc29yX2RldmljZXMoKTsKIAotCWZsdXNoX3dvcmtxdWV1ZShwZXJpb2RpY19kZXZfd29ya3F1ZXVlKTsgLyogYmV0dGVyIG5vdCBiZSBhbnkgd29yayEgKi8KLQlkZXN0cm95X3dvcmtxdWV1ZShwZXJpb2RpY19kZXZfd29ya3F1ZXVlKTsKLQlwZXJpb2RpY19kZXZfd29ya3F1ZXVlID0gTlVMTDsKLQotCWlmIChwZXJpb2RpY190ZXN0X3dvcmtxdWV1ZSkgewotCQljYW5jZWxfZGVsYXllZF93b3JrKCZwZXJpb2RpY193b3JrKTsKLQkJZmx1c2hfd29ya3F1ZXVlKHBlcmlvZGljX3Rlc3Rfd29ya3F1ZXVlKTsKLQkJZGVzdHJveV93b3JrcXVldWUocGVyaW9kaWNfdGVzdF93b3JrcXVldWUpOwotCQlwZXJpb2RpY190ZXN0X3dvcmtxdWV1ZSA9IE5VTEw7Ci0JfQotCiAJbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3RlbnRyeSwgbGlzdHRtcCwgJmxpc3RfYWxsX2J1c19pbnN0YW5jZXMpIHsKIAkJc3RydWN0IHZpc29yX2RldmljZSAqZGV2ID0gbGlzdF9lbnRyeShsaXN0ZW50cnksCiAJCQkJCQkgICAgICBzdHJ1Y3Qgdmlzb3JfZGV2aWNlLApAQCAtMTMyOSw5ICsxMzA4LDYgQEAKIAlyZW1vdmVfYnVzX3R5cGUoKTsKIH0KIAotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCB2aXNvcmJ1c19kZWJ1ZywgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0Modmlzb3JidXNfZGVidWcsICIxIHRvIGRlYnVnIik7Ci0KIG1vZHVsZV9wYXJhbV9uYW1lZChmb3JjZW1hdGNoLCB2aXNvcmJ1c19mb3JjZW1hdGNoLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyh2aXNvcmJ1c19mb3JjZW1hdGNoLAogCQkgIjEgdG8gZm9yY2UgYSBzdWNjZXNzZnVsIGRldiA8LS0+IGRydiBtYXRjaCIpOwpAQCAtMTMzOSw2ICsxMzE1LDMgQEAKIG1vZHVsZV9wYXJhbV9uYW1lZChmb3JjZW5vbWF0Y2gsIHZpc29yYnVzX2ZvcmNlbm9tYXRjaCwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Modmlzb3JidXNfZm9yY2Vub21hdGNoLAogCQkgIjEgdG8gZm9yY2UgYW4gVU5zdWNjZXNzZnVsIGRldiA8LS0+IGRydiBtYXRjaCIpOwotCi1tb2R1bGVfcGFyYW1fbmFtZWQoZGVidWdyZWYsIHZpc29yYnVzX2RlYnVncmVmLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyh2aXNvcmJ1c19kZWJ1Z3JlZiwgIjEgdG8gZGVidWcgcmVmZXJlbmNlIGNvdW50aW5nIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yYnVzX3ByaXZhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JidXNfcHJpdmF0ZS5oCmluZGV4IDM5ZWRkMjAuLjE1NDAzZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JidXNfcHJpdmF0ZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JidXNfcHJpdmF0ZS5oCkBAIC0xLDQgKzEsNCBAQAotLyogdmlzb3JjaGlwc2V0LmgKKy8qIHZpc29yYnVzX3ByaXZhdGUuaAogICoKICAqIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTUgVU5JU1lTIENPUlBPUkFUSU9OCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgpAQCAtMTQsNTUgKzE0LDcyIEBACiAgKiBkZXRhaWxzLgogICovCiAKLSNpZm5kZWYgX19WSVNPUkNISVBTRVRfSF9fCi0jZGVmaW5lIF9fVklTT1JDSElQU0VUX0hfXworI2lmbmRlZiBfX1ZJU09SQlVTX1BSSVZBVEVfSF9fCisjZGVmaW5lIF9fVklTT1JCVVNfUFJJVkFURV9IX18KIAogI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAKICNpbmNsdWRlICJjb250cm9sdm1jaGFubmVsLmgiCi0jaW5jbHVkZSAidmJ1c2RldmljZWluZm8uaCIKLSNpbmNsdWRlICJ2YnVzaGVscGVyLmgiCisjaW5jbHVkZSAidmJ1c2NoYW5uZWwuaCIKIAotLyogIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiB2aXNvcmNoaXBzZXQgd2hlbiBjZXJ0YWluCi0gKiAgZXZlbnRzIGhhcHBlbi4gIChUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgZnVuY3Rpb25zIGlzIG91dHNpZGUgb2YKLSAqICB2aXNvcmNoaXBzZXQuKQorLyogVEFSR0VUX0hPU1ROQU1FIHNwZWNpZmllZCBhcyAtRFRBUkdFVF9IT1NUTkFNRT1cInRoZW5hbWVcIiBvbiB0aGUKKyAqIGNvbW1hbmQgbGluZQogICovCi1zdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9ub3RpZmllcnMgewotCXZvaWQgKCpidXNfY3JlYXRlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbyk7Ci0Jdm9pZCAoKmJ1c19kZXN0cm95KShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbyk7Ci0Jdm9pZCAoKmRldmljZV9jcmVhdGUpKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKLQl2b2lkICgqZGV2aWNlX2Rlc3Ryb3kpKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKLQl2b2lkICgqZGV2aWNlX3BhdXNlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpidXNfaW5mbyk7Ci0Jdm9pZCAoKmRldmljZV9yZXN1bWUpKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKLX07CiAKLS8qICBUaGVzZSBmdW5jdGlvbnMgbGl2ZSBpbnNpZGUgdmlzb3JjaGlwc2V0LCBhbmQgd2lsbCBiZSBjYWxsZWQgdG8gaW5kaWNhdGUKLSAqICByZXNwb25zZXMgdG8gc3BlY2lmaWMgZXZlbnRzIChieSBjb2RlIG91dHNpZGUgb2Ygdmlzb3JjaGlwc2V0KS4KLSAqICBGb3Igbm93LCB0aGUgdmFsdWUgZm9yIGVhY2ggcmVzcG9uc2UgaXMgc2ltcGx5IGVpdGhlcjoKLSAqICAgICAgIDAgPSBpdCB3b3JrZWQKLSAqICAgICAgLTEgPSBpdCBmYWlsZWQKLSAqLwotc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfcmVzcG9uZGVycyB7Ci0Jdm9pZCAoKmJ1c19jcmVhdGUpKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Ci0Jdm9pZCAoKmJ1c19kZXN0cm95KShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotCXZvaWQgKCpkZXZpY2VfY3JlYXRlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotCXZvaWQgKCpkZXZpY2VfZGVzdHJveSkoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKLQl2b2lkICgqZGV2aWNlX3BhdXNlKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotCXZvaWQgKCpkZXZpY2VfcmVzdW1lKShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBidXNfZGV2aWNlX2luZm9faW5pdCgKKwkJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqYnVzX2RldmljZV9pbmZvX3B0ciwKKwkJY29uc3QgY2hhciAqZGV2X3R5cGUsIGNvbnN0IGNoYXIgKmRydl9uYW1lKQoreworCW1lbXNldChidXNfZGV2aWNlX2luZm9fcHRyLCAwLCBzaXplb2Yoc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbykpOworCXNucHJpbnRmKGJ1c19kZXZpY2VfaW5mb19wdHItPmRldnR5cGUsCisJCSBzaXplb2YoYnVzX2RldmljZV9pbmZvX3B0ci0+ZGV2dHlwZSksCisJCSAiJXMiLCAoZGV2X3R5cGUpID8gZGV2X3R5cGUgOiAidW5rbm93blR5cGUiKTsKKwlzbnByaW50ZihidXNfZGV2aWNlX2luZm9fcHRyLT5kcnZuYW1lLAorCQkgc2l6ZW9mKGJ1c19kZXZpY2VfaW5mb19wdHItPmRydm5hbWUpLAorCQkgIiVzIiwgKGRydl9uYW1lKSA/IGRydl9uYW1lIDogInVua25vd25Ecml2ZXIiKTsKKwlzbnByaW50ZihidXNfZGV2aWNlX2luZm9fcHRyLT5pbmZvc3RycywKKwkJIHNpemVvZihidXNfZGV2aWNlX2luZm9fcHRyLT5pbmZvc3RycyksICJrZXJuZWwgdmVyLiAlcyIsCisJCSB1dHNuYW1lKCktPnJlbGVhc2UpOworfQogCi0vKiogUmVnaXN0ZXIgZnVuY3Rpb25zIChpbiB0aGUgYnVzIGRyaXZlcikgdG8gZ2V0IGNhbGxlZCBieSB2aXNvcmNoaXBzZXQKLSAqICB3aGVuZXZlciBhIGJ1cyBvciBkZXZpY2UgYXBwZWFycyBmb3Igd2hpY2ggdGhpcyBndWVzdCBpcyB0byBiZSB0aGUKLSAqICBjbGllbnQgZm9yLiAgdmlzb3JjaGlwc2V0IHdpbGwgZmlsbCBpbiA8cmVzcG9uZGVycz4sIHRvIGluZGljYXRlCi0gKiAgZnVuY3Rpb25zIHRoZSBidXMgZHJpdmVyIHNob3VsZCBjYWxsIHRvIGluZGljYXRlIG1lc3NhZ2UgcmVzcG9uc2VzLgotICovCi12b2lkCi12aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2KAotCQkJc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzICpub3RpZmllcnMsCi0JCQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9yZXNwb25kZXJzICpyZXNwb25kZXJzLAotCQkJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqZHJpdmVyX2luZm8pOwordm9pZCBjaGlwc2V0X2J1c19jcmVhdGUoc3RydWN0IHZpc29yX2RldmljZSAqYnVzX2luZm8pOwordm9pZCBjaGlwc2V0X2J1c19kZXN0cm95KHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvKTsKK3ZvaWQgY2hpcHNldF9kZXZpY2VfY3JlYXRlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKK3ZvaWQgY2hpcHNldF9kZXZpY2VfZGVzdHJveShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbyk7Cit2b2lkIGNoaXBzZXRfZGV2aWNlX3BhdXNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKK3ZvaWQgY2hpcHNldF9kZXZpY2VfcmVzdW1lKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvKTsKIAotLyogdmlzb3JidXMgaW5pdCBhbmQgZXhpdCBmdW5jdGlvbnMgKi8KK3ZvaWQgYnVzX2NyZWF0ZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwordm9pZCBidXNfZGVzdHJveV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwordm9pZCBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Cit2b2lkIGRldmljZV9kZXN0cm95X3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Cit2b2lkIGRldmljZV9yZXN1bWVfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKK3ZvaWQgZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7CisKIGludCB2aXNvcmJ1c19pbml0KHZvaWQpOwogdm9pZCB2aXNvcmJ1c19leGl0KHZvaWQpOworCisvKiB2aXNvcmNoYW5uZWwgYWNjZXNzIGZ1bmN0aW9ucyAqLworCitzdHJ1Y3Qgdmlzb3JjaGFubmVsICp2aXNvcmNoYW5uZWxfY3JlYXRlKHU2NCBwaHlzYWRkciwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9ieXRlcywKKwkJCQkJIGdmcF90IGdmcCwgdXVpZF9sZSBndWlkKTsKK3N0cnVjdCB2aXNvcmNoYW5uZWwgKnZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrKHU2NCBwaHlzYWRkciwKKwkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9ieXRlcywKKwkJCQkJCSAgIGdmcF90IGdmcCwgdXVpZF9sZSBndWlkKTsKK3ZvaWQgdmlzb3JjaGFubmVsX2Rlc3Ryb3koc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCk7CitpbnQgdmlzb3JjaGFubmVsX3JlYWQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAorCQkgICAgICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKTsKK2ludCB2aXNvcmNoYW5uZWxfd3JpdGUoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAorCQkgICAgICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcyk7Cit1NjQgdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKK3Vsb25nIHZpc29yY2hhbm5lbF9nZXRfbmJ5dGVzKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOworY2hhciAqdmlzb3JjaGFubmVsX2lkKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIGNoYXIgKnMpOworY2hhciAqdmlzb3JjaGFubmVsX3pvbmVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBjaGFyICpzKTsKK3U2NCB2aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKTsKK2ludCB2aXNvcmNoYW5uZWxfc2V0X2NsaWVudHBhcnRpdGlvbihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLAorCQkJCSAgICAgdTY0IHBhcnRpdGlvbl9oYW5kbGUpOworY2hhciAqdmlzb3JjaGFubmVsX3V1aWRfaWQodXVpZF9sZSAqZ3VpZCwgY2hhciAqcyk7Cit2b2lkIF9faW9tZW0gKnZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yY2hhbm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmNoYW5uZWwuYwppbmRleCA0MzM3MzU4Li4zMDBhNjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JjaGFubmVsLmMKQEAgLTE1LDE0ICsxNSwxMyBAQAogICovCiAKIC8qCi0gKiAgVGhpcyBwcm92aWRlcyBTdXBlcnZpc29yIGNoYW5uZWwgY29tbXVuaWNhdGlvbiBwcmltaXRpdmVzLCB3aGljaCBhcmUKKyAqICBUaGlzIHByb3ZpZGVzIHMtUGFyIGNoYW5uZWwgY29tbXVuaWNhdGlvbiBwcmltaXRpdmVzLCB3aGljaCBhcmUKICAqICBpbmRlcGVuZGVudCBvZiB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gYWNjZXNzIHRoZSBjaGFubmVsIGRhdGEuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgInZpc29yYnVzLmgiCiAjaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgogCkBAIC01NSwxMyArNTQsMzQyIEBACiAJdXVpZF9sZSBpbnN0OwogfTsKIAotLyogQ3JlYXRlcyB0aGUgc3RydWN0IHZpc29yY2hhbm5lbCBhYnN0cmFjdGlvbiBmb3IgYSBkYXRhIGFyZWEgaW4gbWVtb3J5LAotICogYnV0IGRvZXMgTk9UIG1vZGlmeSB0aGlzIGRhdGEgYXJlYS4KK3ZvaWQKK3Zpc29yY2hhbm5lbF9kZXN0cm95KHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCit7CisJaWYgKCFjaGFubmVsKQorCQlyZXR1cm47CisJaWYgKGNoYW5uZWwtPm1hcHBlZCkgeworCQltZW11bm1hcChjaGFubmVsLT5tYXBwZWQpOworCQlpZiAoY2hhbm5lbC0+cmVxdWVzdGVkKQorCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGNoYW5uZWwtPnBoeXNhZGRyLCBjaGFubmVsLT5uYnl0ZXMpOworCX0KKwlrZnJlZShjaGFubmVsKTsKK30KKwordTY0Cit2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCit7CisJcmV0dXJuIGNoYW5uZWwtPnBoeXNhZGRyOworfQorCit1bG9uZwordmlzb3JjaGFubmVsX2dldF9uYnl0ZXMoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlyZXR1cm4gY2hhbm5lbC0+bmJ5dGVzOworfQorCitjaGFyICoKK3Zpc29yY2hhbm5lbF91dWlkX2lkKHV1aWRfbGUgKmd1aWQsIGNoYXIgKnMpCit7CisJc3ByaW50ZihzLCAiJXBVTCIsIGd1aWQpOworCXJldHVybiBzOworfQorCitjaGFyICoKK3Zpc29yY2hhbm5lbF9pZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBjaGFyICpzKQoreworCXJldHVybiB2aXNvcmNoYW5uZWxfdXVpZF9pZCgmY2hhbm5lbC0+Z3VpZCwgcyk7Cit9CisKK2NoYXIgKgordmlzb3JjaGFubmVsX3pvbmVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBjaGFyICpzKQoreworCXJldHVybiB2aXNvcmNoYW5uZWxfdXVpZF9pZCgmY2hhbm5lbC0+Y2hhbl9oZHIuem9uZV91dWlkLCBzKTsKK30KKwordTY0Cit2aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQoreworCXJldHVybiBjaGFubmVsLT5jaGFuX2hkci5wYXJ0aXRpb25faGFuZGxlOworfQorCitpbnQKK3Zpc29yY2hhbm5lbF9zZXRfY2xpZW50cGFydGl0aW9uKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsCisJCQkJIHU2NCBwYXJ0aXRpb25faGFuZGxlKQoreworCWNoYW5uZWwtPmNoYW5faGRyLnBhcnRpdGlvbl9oYW5kbGUgPSBwYXJ0aXRpb25faGFuZGxlOworCXJldHVybiAwOworfQorCisvKioKKyAqIHZpc29yY2hhbm5lbF9nZXRfdXVpZCgpIC0gcXVlcmllcyB0aGUgVVVJRCBvZiB0aGUgZGVzaWduYXRlZCBjaGFubmVsCisgKiBAY2hhbm5lbDogdGhlIGNoYW5uZWwgdG8gcXVlcnkKKyAqCisgKiBSZXR1cm46IHRoZSBVVUlEIG9mIHRoZSBwcm92aWRlZCBjaGFubmVsCisgKi8KK3V1aWRfbGUKK3Zpc29yY2hhbm5lbF9nZXRfdXVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQoreworCXJldHVybiBjaGFubmVsLT5ndWlkOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF91dWlkKTsKKworaW50Cit2aXNvcmNoYW5uZWxfcmVhZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCisJCSAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKK3sKKwlpZiAob2Zmc2V0ICsgbmJ5dGVzID4gY2hhbm5lbC0+bmJ5dGVzKQorCQlyZXR1cm4gLUVJTzsKKworCW1lbWNweShsb2NhbCwgY2hhbm5lbC0+bWFwcGVkICsgb2Zmc2V0LCBuYnl0ZXMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAordmlzb3JjaGFubmVsX3dyaXRlKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKKwkJICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKK3sKKwlzaXplX3QgY2hkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcik7CisJc2l6ZV90IGNvcHlfc2l6ZTsKKworCWlmIChvZmZzZXQgKyBuYnl0ZXMgPiBjaGFubmVsLT5uYnl0ZXMpCisJCXJldHVybiAtRUlPOworCisJaWYgKG9mZnNldCA8IGNoZHJfc2l6ZSkgeworCQljb3B5X3NpemUgPSBtaW4oY2hkcl9zaXplIC0gb2Zmc2V0LCBuYnl0ZXMpOworCQltZW1jcHkoKChjaGFyICopKCZjaGFubmVsLT5jaGFuX2hkcikpICsgb2Zmc2V0LAorCQkgICAgICAgbG9jYWwsIGNvcHlfc2l6ZSk7CisJfQorCisJbWVtY3B5KGNoYW5uZWwtPm1hcHBlZCArIG9mZnNldCwgbG9jYWwsIG5ieXRlcyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2lvbWVtICAqCit2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQoreworCXJldHVybiAodm9pZCBfX2lvbWVtICopJmNoYW5uZWwtPmNoYW5faGRyOworfQorCisvKgorICogUmV0dXJuIG9mZnNldCBvZiBhIHNwZWNpZmljIFNJR05BTF9RVUVVRV9IRUFERVIgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGEKKyAqIGNoYW5uZWwgaGVhZGVyCisgKi8KKyNkZWZpbmUgU0lHX1FVRVVFX09GRlNFVChjaGFuX2hkciwgcSkgXAorCSgoY2hhbl9oZHIpLT5jaF9zcGFjZV9vZmZzZXQgKyBcCisJICgocSkgKiBzaXplb2Yoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIpKSkKKworLyoKKyAqIFJldHVybiBvZmZzZXQgb2YgYSBzcGVjaWZpYyBxdWV1ZSBlbnRyeSAoZGF0YSkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGEKKyAqIGNoYW5uZWwgaGVhZGVyCisgKi8KKyNkZWZpbmUgU0lHX0RBVEFfT0ZGU0VUKGNoYW5faGRyLCBxLCBzaWdfaGRyLCBzbG90KSBcCisJKFNJR19RVUVVRV9PRkZTRVQoY2hhbl9oZHIsIHEpICsgKHNpZ19oZHIpLT5zaWdfYmFzZV9vZmZzZXQgKyBcCisJICAgICgoc2xvdCkgKiAoc2lnX2hkciktPnNpZ25hbF9zaXplKSkKKworLyoKKyAqIFdyaXRlIHRoZSBjb250ZW50cyBvZiBhIHNwZWNpZmljIGZpZWxkIHdpdGhpbiBhIFNJR05BTF9RVUVVRV9IRUFERVIgYmFjaworICogaW50byBob3N0IG1lbW9yeQorICovCisjZGVmaW5lIFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgc2lnX2hkciwgRklFTEQpCQkJIFwKKwl2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbm5lbCwJCQkJCSBcCisJCQkgICBTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpICtcCisJCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciwgRklFTEQpLCBcCisJCQkgICAmKChzaWdfaGRyKS0+RklFTEQpLAkJCSBcCisJCQkgICBzaXplb2YoKHNpZ19oZHIpLT5GSUVMRCkpCisKK3N0YXRpYyBpbnQKK3NpZ19yZWFkX2hlYWRlcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsCisJCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyICpzaWdfaGRyKQoreworCWlmIChjaGFubmVsLT5jaGFuX2hkci5jaF9zcGFjZV9vZmZzZXQgPCBzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBSZWFkIHRoZSBhcHByb3ByaWF0ZSBTSUdOQUxfUVVFVUVfSEVBREVSIGludG8gbG9jYWwgbWVtb3J5LiAqLworCXJldHVybiB2aXNvcmNoYW5uZWxfcmVhZChjaGFubmVsLAorCQkJCSBTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpLAorCQkJCSBzaWdfaGRyLCBzaXplb2Yoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NpZ19yZWFkX2RhdGEoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAorCSAgICAgIHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyICpzaWdfaGRyLCB1MzIgc2xvdCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgc2lnbmFsX2RhdGFfb2Zmc2V0ID0gU0lHX0RBVEFfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUsCisJCQkJCQkgc2lnX2hkciwgc2xvdCk7CisKKwlyZXR1cm4gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwgc2lnbmFsX2RhdGFfb2Zmc2V0LAorCQkJCSBkYXRhLCBzaWdfaGRyLT5zaWduYWxfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzaWdfd3JpdGVfZGF0YShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsCisJICAgICAgIHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyICpzaWdfaGRyLCB1MzIgc2xvdCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgc2lnbmFsX2RhdGFfb2Zmc2V0ID0gU0lHX0RBVEFfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUsCisJCQkJCQkgc2lnX2hkciwgc2xvdCk7CisKKwlyZXR1cm4gdmlzb3JjaGFubmVsX3dyaXRlKGNoYW5uZWwsIHNpZ25hbF9kYXRhX29mZnNldCwKKwkJCQkgIGRhdGEsIHNpZ19oZHItPnNpZ25hbF9zaXplKTsKK30KKworc3RhdGljIGludAorc2lnbmFscmVtb3ZlX2lubmVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwgdm9pZCAqbXNnKQoreworCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmIChzaWdfaGRyLmhlYWQgPT0gc2lnX2hkci50YWlsKQorCQlyZXR1cm4gLUVJTzsJLyogbm8gc2lnbmFscyB0byByZW1vdmUgKi8KKworCXNpZ19oZHIudGFpbCA9IChzaWdfaGRyLnRhaWwgKyAxKSAlIHNpZ19oZHIubWF4X3Nsb3RzOworCisJZXJyb3IgPSBzaWdfcmVhZF9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci50YWlsLCBtc2cpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJc2lnX2hkci5udW1fcmVjZWl2ZWQrKzsKKworCS8qCisJICogRm9yIGVhY2ggZGF0YSBmaWVsZCBpbiBTSUdOQUxfUVVFVUVfSEVBREVSIHRoYXQgd2FzIG1vZGlmaWVkLAorCSAqIHVwZGF0ZSBob3N0IG1lbW9yeS4KKwkgKi8KKwltYigpOyAvKiByZXF1aXJlZCBmb3IgY2hhbm5lbCBzeW5jaCAqLworCisJZXJyb3IgPSBTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCB0YWlsKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIG51bV9yZWNlaXZlZCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKCkgLSByZW1vdmVzIGEgbWVzc2FnZSBmcm9tIHRoZSBkZXNpZ25hdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsL3F1ZXVlCisgKiBAY2hhbm5lbDogdGhlIGNoYW5uZWwgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW1vdmVkIGZyb20KKyAqIEBxdWV1ZTogICB0aGUgcXVldWUgdGhlIG1lc3NhZ2Ugd2lsbCBiZSByZW1vdmVkIGZyb20KKyAqIEBtc2c6ICAgICB0aGUgbWVzc2FnZSB0byByZW1vdmUKKyAqCisgKiBSZXR1cm46IGludGVnZXIgZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSBzdGF0dXMgb2YgdGhlIHJlbW92YWwKKyAqLworaW50Cit2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwgdm9pZCAqbXNnKQoreworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPnJlbW92ZV9sb2NrLCBmbGFncyk7CisJCXJjID0gc2lnbmFscmVtb3ZlX2lubmVyKGNoYW5uZWwsIHF1ZXVlLCBtc2cpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCXJjID0gc2lnbmFscmVtb3ZlX2lubmVyKGNoYW5uZWwsIHF1ZXVlLCBtc2cpOworCX0KKworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUpOworCisvKioKKyAqIHZpc29yY2hhbm5lbF9zaWduYWxlbXB0eSgpIC0gY2hlY2tzIGlmIHRoZSBkZXNpZ25hdGVkIGNoYW5uZWwvcXVldWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgYW55IG1lc3NhZ2VzCisgKiBAY2hhbm5lbDogdGhlIGNoYW5uZWwgdG8gcXVlcnkKKyAqIEBxdWV1ZTogICB0aGUgcXVldWUgaW4gdGhlIGNoYW5uZWwgdG8gcXVlcnkKKyAqCisgKiBSZXR1cm46IGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGFueSBtZXNzYWdlcyBpbiB0aGUgZGVzaWduYXRlZAorICogICAgICAgICBjaGFubmVsL3F1ZXVlIGFyZSBwcmVzZW50CisgKi8KK2Jvb2wKK3Zpc29yY2hhbm5lbF9zaWduYWxlbXB0eShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgc2lnX2hkcjsKKwlib29sIHJjID0gZmFsc2U7CisKKwlpZiAoY2hhbm5lbC0+bmVlZHNfbG9jaykKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPnJlbW92ZV9sb2NrLCBmbGFncyk7CisKKwlpZiAoc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpCisJCXJjID0gdHJ1ZTsKKwlpZiAoc2lnX2hkci5oZWFkID09IHNpZ19oZHIudGFpbCkKKwkJcmMgPSB0cnVlOworCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3NpZ25hbGVtcHR5KTsKKworc3RhdGljIGludAorc2lnbmFsaW5zZXJ0X2lubmVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwgdm9pZCAqbXNnKQoreworCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXNpZ19oZHIuaGVhZCA9IChzaWdfaGRyLmhlYWQgKyAxKSAlIHNpZ19oZHIubWF4X3Nsb3RzOworCWlmIChzaWdfaGRyLmhlYWQgPT0gc2lnX2hkci50YWlsKSB7CisJCXNpZ19oZHIubnVtX292ZXJmbG93cysrOworCQl2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbm5lbCwKKwkJCQkgICBTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpICsKKwkJCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciwKKwkJCQkJICAgIG51bV9vdmVyZmxvd3MpLAorCQkJCSAgICZzaWdfaGRyLm51bV9vdmVyZmxvd3MsCisJCQkJICAgc2l6ZW9mKHNpZ19oZHIubnVtX292ZXJmbG93cykpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwllcnJvciA9IHNpZ193cml0ZV9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci5oZWFkLCBtc2cpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJc2lnX2hkci5udW1fc2VudCsrOworCisJLyoKKwkgKiBGb3IgZWFjaCBkYXRhIGZpZWxkIGluIFNJR05BTF9RVUVVRV9IRUFERVIgdGhhdCB3YXMgbW9kaWZpZWQsCisJICogdXBkYXRlIGhvc3QgbWVtb3J5LgorCSAqLworCW1iKCk7IC8qIHJlcXVpcmVkIGZvciBjaGFubmVsIHN5bmNoICovCisKKwllcnJvciA9IFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIGhlYWQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgbnVtX3NlbnQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKCkgLSBjcmVhdGVzIHRoZSBzdHJ1Y3Qgdmlzb3JjaGFubmVsIGFic3RyYWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIGRhdGEgYXJlYSBpbiBtZW1vcnksIGJ1dCBkb2VzIE5PVCBtb2RpZnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBkYXRhIGFyZWEKKyAqIEBwaHlzYWRkcjogICAgICBwaHlzaWNhbCBhZGRyZXNzIG9mIHN0YXJ0IG9mIGNoYW5uZWwKKyAqIEBjaGFubmVsX2J5dGVzOiBzaXplIG9mIHRoZSBjaGFubmVsIGluIGJ5dGVzOyB0aGlzIG1heSAwIGlmIHRoZSBjaGFubmVsIGhhcworICogICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCBpbiBtZW1vcnkgKHdoaWNoIGlzIHRydWUgZm9yIGFsbAorICogICAgICAgICAgICAgICAgIGNoYW5uZWxzIHByb3ZpZGVkIHRvIGd1ZXN0IGVudmlyb25tZW50cyBieSB0aGUgcy1QYXIKKyAqICAgICAgICAgICAgICAgICBiYWNrLWVuZCksIGluIHdoaWNoIGNhc2UgdGhlIGFjdHVhbCBjaGFubmVsIHNpemUgd2lsbCBiZQorICogICAgICAgICAgICAgICAgIHJlYWQgZnJvbSB0aGUgY2hhbm5lbCBoZWFkZXIgaW4gbWVtb3J5CisgKiBAZ2ZwOiAgICAgICAgICAgZ2ZwX3QgdG8gdXNlIHdoZW4gYWxsb2NhdGluZyBtZW1vcnkgZm9yIHRoZSBkYXRhIHN0cnVjdAorICogQGd1aWQ6ICAgICAgICAgIHV1aWQgdGhhdCBpZGVudGlmaWVzIGNoYW5uZWwgdHlwZTsgdGhpcyBtYXkgMCBpZiB0aGUgY2hhbm5lbAorICogICAgICAgICAgICAgICAgIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgaW4gbWVtb3J5ICh3aGljaCBpcyB0cnVlIGZvciBhbGwKKyAqICAgICAgICAgICAgICAgICBjaGFubmVscyBwcm92aWRlZCB0byBndWVzdCBlbnZpcm9ubWVudHMgYnkgdGhlIHMtUGFyCisgKiAgICAgICAgICAgICAgICAgYmFjay1lbmQpLCBpbiB3aGljaCBjYXNlIHRoZSBhY3R1YWwgY2hhbm5lbCBndWlkIHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICByZWFkIGZyb20gdGhlIGNoYW5uZWwgaGVhZGVyIGluIG1lbW9yeQorICogQG5lZWRzX2xvY2s6ICAgIG11c3Qgc3BlY2lmeSB0cnVlIGlmIHlvdSBoYXZlIG11bHRpcGxlIHRocmVhZHMgb2YgZXhlY3V0aW9uCisgKiAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGNhbGxpbmcgdmlzb3JjaGFubmVsIG1ldGhvZHMgb2YgdGhpcworICogICAgICAgICAgICAgICAgIHZpc29yY2hhbm5lbCBhdCB0aGUgc2FtZSB0aW1lCisgKgorICogUmV0dXJuOiBwb2ludGVyIHRvIHZpc29yY2hhbm5lbCB0aGF0IHdhcyBjcmVhdGVkIGlmIHN1Y2Nlc3NmdWwsCisgKiAgICAgICAgIG90aGVyd2lzZSBOVUxMCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGFubmVsICoKIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cyh1NjQgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9ieXRlcywKLQkJCSBnZnBfdCBnZnAsIHVuc2lnbmVkIGxvbmcgb2ZmLAotCQkJIHV1aWRfbGUgZ3VpZCwgYm9vbCBuZWVkc19sb2NrKQorCQkJIGdmcF90IGdmcCwgdXVpZF9sZSBndWlkLCBib29sIG5lZWRzX2xvY2spCiB7CiAJc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbDsKIAlpbnQgZXJyOwpAQCAtNzgsNyArNDA2LDggQEAKIAlzcGluX2xvY2tfaW5pdCgmY2hhbm5lbC0+aW5zZXJ0X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZjaGFubmVsLT5yZW1vdmVfbG9jayk7CiAKLQkvKiBWaWRlbyBkcml2ZXIgY29uc3RhaW5zIHRoZSBlZmkgZnJhbWVidWZmZXIgc28gaXQgd2lsbCBnZXQgYQorCS8qCisJICogVmlkZW8gZHJpdmVyIGNvbnN0YWlucyB0aGUgZWZpIGZyYW1lYnVmZmVyIHNvIGl0IHdpbGwgZ2V0IGEKIAkgKiBjb25mbGljdCByZXNvdXJjZSB3aGVuIHJlcXVlc3RpbmcgaXRzIGZ1bGwgbWVtIHJlZ2lvbi4gU2luY2UKIAkgKiB3ZSBhcmUgb25seSB1c2luZyB0aGUgZWZpIGZyYW1lYnVmZmVyIGZvciB2aWRlbyB3ZSBjYW4gaWdub3JlCiAJICogdGhpcy4gUmVtZW1iZXIgdGhhdCB3ZSBoYXZlbid0IHJlcXVlc3RlZCBpdCBzbyB3ZSBkb24ndCB0cnkgdG8KQEAgLTE0NSwzNTIgKzQ3NCwzMSBAQAogdmlzb3JjaGFubmVsX2NyZWF0ZSh1NjQgcGh5c2FkZHIsIHVuc2lnbmVkIGxvbmcgY2hhbm5lbF9ieXRlcywKIAkJICAgIGdmcF90IGdmcCwgdXVpZF9sZSBndWlkKQogewotCXJldHVybiB2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHMocGh5c2FkZHIsIGNoYW5uZWxfYnl0ZXMsIGdmcCwgMCwgZ3VpZCwKKwlyZXR1cm4gdmlzb3JjaGFubmVsX2NyZWF0ZV9ndXRzKHBoeXNhZGRyLCBjaGFubmVsX2J5dGVzLCBnZnAsIGd1aWQsCiAJCQkJCWZhbHNlKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9jcmVhdGUpOwogCiBzdHJ1Y3Qgdmlzb3JjaGFubmVsICoKIHZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrKHU2NCBwaHlzYWRkciwgdW5zaWduZWQgbG9uZyBjaGFubmVsX2J5dGVzLAogCQkJICAgICAgZ2ZwX3QgZ2ZwLCB1dWlkX2xlIGd1aWQpCiB7Ci0JcmV0dXJuIHZpc29yY2hhbm5lbF9jcmVhdGVfZ3V0cyhwaHlzYWRkciwgY2hhbm5lbF9ieXRlcywgZ2ZwLCAwLCBndWlkLAorCXJldHVybiB2aXNvcmNoYW5uZWxfY3JlYXRlX2d1dHMocGh5c2FkZHIsIGNoYW5uZWxfYnl0ZXMsIGdmcCwgZ3VpZCwKIAkJCQkJdHJ1ZSk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfY3JlYXRlX3dpdGhfbG9jayk7CiAKLXZvaWQKLXZpc29yY2hhbm5lbF9kZXN0cm95KHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCi17Ci0JaWYgKCFjaGFubmVsKQotCQlyZXR1cm47Ci0JaWYgKGNoYW5uZWwtPm1hcHBlZCkgewotCQltZW11bm1hcChjaGFubmVsLT5tYXBwZWQpOwotCQlpZiAoY2hhbm5lbC0+cmVxdWVzdGVkKQotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGNoYW5uZWwtPnBoeXNhZGRyLCBjaGFubmVsLT5uYnl0ZXMpOwotCX0KLQlrZnJlZShjaGFubmVsKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9kZXN0cm95KTsKLQotdTY0Ci12aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCi17Ci0JcmV0dXJuIGNoYW5uZWwtPnBoeXNhZGRyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF9waHlzYWRkcik7Ci0KLXVsb25nCi12aXNvcmNoYW5uZWxfZ2V0X25ieXRlcyhzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQotewotCXJldHVybiBjaGFubmVsLT5uYnl0ZXM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZ2V0X25ieXRlcyk7Ci0KLWNoYXIgKgotdmlzb3JjaGFubmVsX3V1aWRfaWQodXVpZF9sZSAqZ3VpZCwgY2hhciAqcykKLXsKLQlzcHJpbnRmKHMsICIlcFVMIiwgZ3VpZCk7Ci0JcmV0dXJuIHM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfdXVpZF9pZCk7Ci0KLWNoYXIgKgotdmlzb3JjaGFubmVsX2lkKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIGNoYXIgKnMpCi17Ci0JcmV0dXJuIHZpc29yY2hhbm5lbF91dWlkX2lkKCZjaGFubmVsLT5ndWlkLCBzKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9pZCk7Ci0KLWNoYXIgKgotdmlzb3JjaGFubmVsX3pvbmVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBjaGFyICpzKQotewotCXJldHVybiB2aXNvcmNoYW5uZWxfdXVpZF9pZCgmY2hhbm5lbC0+Y2hhbl9oZHIuem9uZV91dWlkLCBzKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF96b25laWQpOwotCi11NjQKLXZpc29yY2hhbm5lbF9nZXRfY2xpZW50cGFydGl0aW9uKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCi17Ci0JcmV0dXJuIGNoYW5uZWwtPmNoYW5faGRyLnBhcnRpdGlvbl9oYW5kbGU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZ2V0X2NsaWVudHBhcnRpdGlvbik7Ci0KLWludAotdmlzb3JjaGFubmVsX3NldF9jbGllbnRwYXJ0aXRpb24oc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwKLQkJCQkgdTY0IHBhcnRpdGlvbl9oYW5kbGUpCi17Ci0JY2hhbm5lbC0+Y2hhbl9oZHIucGFydGl0aW9uX2hhbmRsZSA9IHBhcnRpdGlvbl9oYW5kbGU7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2V0X2NsaWVudHBhcnRpdGlvbik7Ci0KLXV1aWRfbGUKLXZpc29yY2hhbm5lbF9nZXRfdXVpZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQotewotCXJldHVybiBjaGFubmVsLT5ndWlkOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX2dldF91dWlkKTsKLQotaW50Ci12aXNvcmNoYW5uZWxfcmVhZChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1bG9uZyBvZmZzZXQsCi0JCSAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKLXsKLQlpZiAob2Zmc2V0ICsgbmJ5dGVzID4gY2hhbm5lbC0+bmJ5dGVzKQotCQlyZXR1cm4gLUVJTzsKLQotCW1lbWNweShsb2NhbCwgY2hhbm5lbC0+bWFwcGVkICsgb2Zmc2V0LCBuYnl0ZXMpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfcmVhZCk7Ci0KLWludAotdmlzb3JjaGFubmVsX3dyaXRlKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKLQkJICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKLXsKLQlzaXplX3QgY2hkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcik7Ci0Jc2l6ZV90IGNvcHlfc2l6ZTsKLQotCWlmIChvZmZzZXQgKyBuYnl0ZXMgPiBjaGFubmVsLT5uYnl0ZXMpCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKG9mZnNldCA8IGNoZHJfc2l6ZSkgewotCQljb3B5X3NpemUgPSBtaW4oY2hkcl9zaXplIC0gb2Zmc2V0LCBuYnl0ZXMpOwotCQltZW1jcHkoKChjaGFyICopKCZjaGFubmVsLT5jaGFuX2hkcikpICsgb2Zmc2V0LAotCQkgICAgICAgbG9jYWwsIGNvcHlfc2l6ZSk7Ci0JfQotCi0JbWVtY3B5KGNoYW5uZWwtPm1hcHBlZCArIG9mZnNldCwgbG9jYWwsIG5ieXRlcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF93cml0ZSk7Ci0KLWludAotdmlzb3JjaGFubmVsX2NsZWFyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwgdTggY2gsCi0JCSAgIHVsb25nIG5ieXRlcykKLXsKLQlpbnQgZXJyOwotCWludCBidWZzaXplID0gUEFHRV9TSVpFOwotCWludCB3cml0dGVuID0gMDsKLQl1OCAqYnVmOwotCi0JYnVmID0gKHU4ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbXNldChidWYsIGNoLCBidWZzaXplKTsKLQotCXdoaWxlIChuYnl0ZXMgPiAwKSB7Ci0JCWludCB0aGlzYnl0ZXMgPSBidWZzaXplOwotCi0JCWlmIChuYnl0ZXMgPCB0aGlzYnl0ZXMpCi0JCQl0aGlzYnl0ZXMgPSBuYnl0ZXM7Ci0JCWVyciA9IHZpc29yY2hhbm5lbF93cml0ZShjaGFubmVsLCBvZmZzZXQgKyB3cml0dGVuLAotCQkJCQkgYnVmLCB0aGlzYnl0ZXMpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXRfZnJlZV9wYWdlOwotCi0JCXdyaXR0ZW4gKz0gdGhpc2J5dGVzOwotCQluYnl0ZXMgLT0gdGhpc2J5dGVzOwotCX0KLQllcnIgPSAwOwotCi1vdXRfZnJlZV9wYWdlOgotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylidWYpOwotCXJldHVybiBlcnI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfY2xlYXIpOwotCi12b2lkIF9faW9tZW0gICoKLXZpc29yY2hhbm5lbF9nZXRfaGVhZGVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwpCi17Ci0JcmV0dXJuICh2b2lkIF9faW9tZW0gKikmY2hhbm5lbC0+Y2hhbl9oZHI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcik7Ci0KLS8qKiBSZXR1cm4gb2Zmc2V0IG9mIGEgc3BlY2lmaWMgU0lHTkFMX1FVRVVFX0hFQURFUiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgYQotICogIGNoYW5uZWwgaGVhZGVyCisvKioKKyAqIHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoKSAtIGluc2VydHMgYSBtZXNzYWdlIGludG8gdGhlIGRlc2lnbmF0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwvcXVldWUKKyAqIEBjaGFubmVsOiB0aGUgY2hhbm5lbCB0aGUgbWVzc2FnZSB3aWxsIGJlIGFkZGVkIHRvCisgKiBAcXVldWU6ICAgdGhlIHF1ZXVlIHRoZSBtZXNzYWdlIHdpbGwgYmUgYWRkZWQgdG8KKyAqIEBtc2c6ICAgICB0aGUgbWVzc2FnZSB0byBpbnNlcnQKKyAqCisgKiBSZXR1cm46IGludGVnZXIgZXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoZSBzdGF0dXMgb2YgdGhlIGluc2VydGlvbgogICovCi0jZGVmaW5lIFNJR19RVUVVRV9PRkZTRVQoY2hhbl9oZHIsIHEpIFwKLQkoKGNoYW5faGRyKS0+Y2hfc3BhY2Vfb2Zmc2V0ICsgXAotCSAoKHEpICogc2l6ZW9mKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyKSkpCi0KLS8qKiBSZXR1cm4gb2Zmc2V0IG9mIGEgc3BlY2lmaWMgcXVldWUgZW50cnkgKGRhdGEpIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhCi0gKiAgY2hhbm5lbCBoZWFkZXIKLSAqLwotI2RlZmluZSBTSUdfREFUQV9PRkZTRVQoY2hhbl9oZHIsIHEsIHNpZ19oZHIsIHNsb3QpIFwKLQkoU0lHX1FVRVVFX09GRlNFVChjaGFuX2hkciwgcSkgKyAoc2lnX2hkciktPnNpZ19iYXNlX29mZnNldCArIFwKLQkgICAgKChzbG90KSAqIChzaWdfaGRyKS0+c2lnbmFsX3NpemUpKQotCi0vKiogV3JpdGUgdGhlIGNvbnRlbnRzIG9mIGEgc3BlY2lmaWMgZmllbGQgd2l0aGluIGEgU0lHTkFMX1FVRVVFX0hFQURFUiBiYWNrCi0gKiAgaW50byBob3N0IG1lbW9yeQotICovCi0jZGVmaW5lIFNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgc2lnX2hkciwgRklFTEQpCQkJIFwKLQkodmlzb3JjaGFubmVsX3dyaXRlKGNoYW5uZWwsCQkJCQkgXAotCQkJICAgIFNJR19RVUVVRV9PRkZTRVQoJmNoYW5uZWwtPmNoYW5faGRyLCBxdWV1ZSkgK1wKLQkJCSAgICBvZmZzZXRvZihzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciwgRklFTEQpLCBcCi0JCQkgICAgJigoc2lnX2hkciktPkZJRUxEKSwJCQkgXAotCQkJICAgIHNpemVvZigoc2lnX2hkciktPkZJRUxEKSkgPj0gMCkKLQotc3RhdGljIGJvb2wKLXNpZ19yZWFkX2hlYWRlcihzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUsCi0JCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyICpzaWdfaGRyKQotewotCWludCBlcnI7Ci0KLQlpZiAoY2hhbm5lbC0+Y2hhbl9oZHIuY2hfc3BhY2Vfb2Zmc2V0IDwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qIFJlYWQgdGhlIGFwcHJvcHJpYXRlIFNJR05BTF9RVUVVRV9IRUFERVIgaW50byBsb2NhbCBtZW1vcnkuICovCi0JZXJyID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwKLQkJCQlTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpLAotCQkJCXNpZ19oZHIsIHNpemVvZihzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlcikpOwotCWlmIChlcnIpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLXNpZ19yZWFkX2RhdGEoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAotCSAgICAgIHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyICpzaWdfaGRyLCB1MzIgc2xvdCwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgZXJyOwotCWludCBzaWduYWxfZGF0YV9vZmZzZXQgPSBTSUdfREFUQV9PRkZTRVQoJmNoYW5uZWwtPmNoYW5faGRyLCBxdWV1ZSwKLQkJCQkJCSBzaWdfaGRyLCBzbG90KTsKLQotCWVyciA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW5uZWwsIHNpZ25hbF9kYXRhX29mZnNldCwKLQkJCQlkYXRhLCBzaWdfaGRyLT5zaWduYWxfc2l6ZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotc2lnX3dyaXRlX2RhdGEoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLAotCSAgICAgICBzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciAqc2lnX2hkciwgdTMyIHNsb3QsIHZvaWQgKmRhdGEpCi17Ci0JaW50IGVycjsKLQlpbnQgc2lnbmFsX2RhdGFfb2Zmc2V0ID0gU0lHX0RBVEFfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUsCi0JCQkJCQkgc2lnX2hkciwgc2xvdCk7Ci0KLQllcnIgPSB2aXNvcmNoYW5uZWxfd3JpdGUoY2hhbm5lbCwgc2lnbmFsX2RhdGFfb2Zmc2V0LAotCQkJCSBkYXRhLCBzaWdfaGRyLT5zaWduYWxfc2l6ZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sCi1zaWduYWxyZW1vdmVfaW5uZXIoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLCB2b2lkICptc2cpCi17Ci0Jc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgc2lnX2hkcjsKLQotCWlmICghc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpCi0JCXJldHVybiBmYWxzZTsKLQlpZiAoc2lnX2hkci5oZWFkID09IHNpZ19oZHIudGFpbCkKLQkJcmV0dXJuIGZhbHNlOwkvKiBubyBzaWduYWxzIHRvIHJlbW92ZSAqLwotCi0Jc2lnX2hkci50YWlsID0gKHNpZ19oZHIudGFpbCArIDEpICUgc2lnX2hkci5tYXhfc2xvdHM7Ci0JaWYgKCFzaWdfcmVhZF9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci50YWlsLCBtc2cpKQotCQlyZXR1cm4gZmFsc2U7Ci0Jc2lnX2hkci5udW1fcmVjZWl2ZWQrKzsKLQotCS8qIEZvciBlYWNoIGRhdGEgZmllbGQgaW4gU0lHTkFMX1FVRVVFX0hFQURFUiB0aGF0IHdhcyBtb2RpZmllZCwKLQkgKiB1cGRhdGUgaG9zdCBtZW1vcnkuCi0JICovCi0JbWIoKTsgLyogcmVxdWlyZWQgZm9yIGNoYW5uZWwgc3luY2ggKi8KLQlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIHRhaWwpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBudW1fcmVjZWl2ZWQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wKLXZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLCB2b2lkICptc2cpCi17Ci0JYm9vbCByYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW5uZWwtPnJlbW92ZV9sb2NrLCBmbGFncyk7Ci0JCXJjID0gc2lnbmFscmVtb3ZlX2lubmVyKGNoYW5uZWwsIHF1ZXVlLCBtc2cpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCXJjID0gc2lnbmFscmVtb3ZlX2lubmVyKGNoYW5uZWwsIHF1ZXVlLCBtc2cpOwotCX0KLQotCXJldHVybiByYzsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUpOwotCi1ib29sCi12aXNvcmNoYW5uZWxfc2lnbmFsZW1wdHkoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwotCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7Ci0JYm9vbCByYyA9IGZhbHNlOwotCi0JaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5yZW1vdmVfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkKLQkJcmMgPSB0cnVlOwotCWlmIChzaWdfaGRyLmhlYWQgPT0gc2lnX2hkci50YWlsKQotCQlyYyA9IHRydWU7Ci0JaWYgKGNoYW5uZWwtPm5lZWRzX2xvY2spCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW5uZWwtPnJlbW92ZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfc2lnbmFsZW1wdHkpOwotCi1zdGF0aWMgYm9vbAotc2lnbmFsaW5zZXJ0X2lubmVyKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSwgdm9pZCAqbXNnKQotewotCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7Ci0KLQlpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlzaWdfaGRyLmhlYWQgPSAoc2lnX2hkci5oZWFkICsgMSkgJSBzaWdfaGRyLm1heF9zbG90czsKLQlpZiAoc2lnX2hkci5oZWFkID09IHNpZ19oZHIudGFpbCkgewotCQlzaWdfaGRyLm51bV9vdmVyZmxvd3MrKzsKLQkJdmlzb3JjaGFubmVsX3dyaXRlKGNoYW5uZWwsCi0JCQkJICAgU0lHX1FVRVVFX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlKSArCi0JCQkJICAgb2Zmc2V0b2Yoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIsCi0JCQkJCSAgICBudW1fb3ZlcmZsb3dzKSwKLQkJCQkgICAmc2lnX2hkci5udW1fb3ZlcmZsb3dzLAotCQkJCSAgIHNpemVvZihzaWdfaGRyLm51bV9vdmVyZmxvd3MpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWlmICghc2lnX3dyaXRlX2RhdGEoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBzaWdfaGRyLmhlYWQsIG1zZykpCi0JCXJldHVybiBmYWxzZTsKLQotCXNpZ19oZHIubnVtX3NlbnQrKzsKLQotCS8qIEZvciBlYWNoIGRhdGEgZmllbGQgaW4gU0lHTkFMX1FVRVVFX0hFQURFUiB0aGF0IHdhcyBtb2RpZmllZCwKLQkgKiB1cGRhdGUgaG9zdCBtZW1vcnkuCi0JICovCi0JbWIoKTsgLyogcmVxdWlyZWQgZm9yIGNoYW5uZWwgc3luY2ggKi8KLQlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIGhlYWQpKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBudW1fc2VudCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi1ib29sCitpbnQKIHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoc3RydWN0IHZpc29yY2hhbm5lbCAqY2hhbm5lbCwgdTMyIHF1ZXVlLCB2b2lkICptc2cpCiB7Ci0JYm9vbCByYzsKKwlpbnQgcmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChjaGFubmVsLT5uZWVkc19sb2NrKSB7CkBAIC01MDQsMTMyICs1MTIsMyBAQAogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQpOwotCi1pbnQKLXZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9zbG90c19hdmFpbChzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCB1MzIgcXVldWUpCi17Ci0Jc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgc2lnX2hkcjsKLQl1MzIgc2xvdHNfYXZhaWwsIHNsb3RzX3VzZWQ7Ci0JdTMyIGhlYWQsIHRhaWw7Ci0KLQlpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKQotCQlyZXR1cm4gMDsKLQloZWFkID0gc2lnX2hkci5oZWFkOwotCXRhaWwgPSBzaWdfaGRyLnRhaWw7Ci0JaWYgKGhlYWQgPCB0YWlsKQotCQloZWFkID0gaGVhZCArIHNpZ19oZHIubWF4X3Nsb3RzOwotCXNsb3RzX3VzZWQgPSBoZWFkIC0gdGFpbDsKLQlzbG90c19hdmFpbCA9IHNpZ19oZHIubWF4X3NpZ25hbHMgLSBzbG90c191c2VkOwotCXJldHVybiAoaW50KXNsb3RzX2F2YWlsOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX3Nsb3RzX2F2YWlsKTsKLQotaW50Ci12aXNvcmNoYW5uZWxfc2lnbmFscXVldWVfbWF4X3Nsb3RzKHN0cnVjdCB2aXNvcmNoYW5uZWwgKmNoYW5uZWwsIHUzMiBxdWV1ZSkKLXsKLQlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciBzaWdfaGRyOwotCi0JaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIChpbnQpc2lnX2hkci5tYXhfc2lnbmFsczsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9tYXhfc2xvdHMpOwotCi1zdGF0aWMgdm9pZAotc2lncXVldWVfZGVidWcoc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgKnEsIGludCB3aGljaCwgc3RydWN0IHNlcV9maWxlICpzZXEpCi17Ci0Jc2VxX3ByaW50ZihzZXEsICJTaWduYWwgUXVldWUgIyVkXG4iLCB3aGljaCk7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICBWZXJzaW9uSWQgICAgICAgICAgPSAlbHVcbiIsICh1bG9uZylxLT52ZXJzaW9uKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgIFR5cGUgICAgICAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKXEtPmNodHlwZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICBvU2lnbmFsQmFzZSAgICAgICAgPSAlbGx1XG4iLAotCQkgICAobG9uZyBsb25nKXEtPnNpZ19iYXNlX29mZnNldCk7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICBTaWduYWxTaXplICAgICAgICAgPSAlbHVcbiIsICh1bG9uZylxLT5zaWduYWxfc2l6ZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICBNYXhTaWduYWxTbG90cyAgICAgPSAlbHVcbiIsCi0JCSAgICh1bG9uZylxLT5tYXhfc2xvdHMpOwotCXNlcV9wcmludGYoc2VxLCAiICAgTWF4U2lnbmFscyAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpcS0+bWF4X3NpZ25hbHMpOwotCXNlcV9wcmludGYoc2VxLCAiICAgRmVhdHVyZUZsYWdzICAgICAgID0gJS0xNi4xNkx4XG4iLAotCQkgICAobG9uZyBsb25nKXEtPmZlYXR1cmVzKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgIE51bVNpZ25hbHNTZW50ICAgICA9ICVsbHVcbiIsCi0JCSAgIChsb25nIGxvbmcpcS0+bnVtX3NlbnQpOwotCXNlcV9wcmludGYoc2VxLCAiICAgTnVtU2lnbmFsc1JlY2VpdmVkID0gJWxsdVxuIiwKLQkJICAgKGxvbmcgbG9uZylxLT5udW1fcmVjZWl2ZWQpOwotCXNlcV9wcmludGYoc2VxLCAiICAgTnVtT3ZlcmZsb3dzICAgICAgID0gJWxsdVxuIiwKLQkJICAgKGxvbmcgbG9uZylxLT5udW1fb3ZlcmZsb3dzKTsKLQlzZXFfcHJpbnRmKHNlcSwgIiAgIEhlYWQgICAgICAgICAgICAgICA9ICVsdVxuIiwgKHVsb25nKXEtPmhlYWQpOwotCXNlcV9wcmludGYoc2VxLCAiICAgVGFpbCAgICAgICAgICAgICAgID0gJWx1XG4iLCAodWxvbmcpcS0+dGFpbCk7Ci19Ci0KLXZvaWQKLXZpc29yY2hhbm5lbF9kZWJ1ZyhzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsLCBpbnQgbnVtX3F1ZXVlcywKLQkJICAgc3RydWN0IHNlcV9maWxlICpzZXEsIHUzMiBvZmYpCi17Ci0JdTY0IGFkZHIgPSAwOwotCXVsb25nIG5ieXRlcyA9IDAsIG5ieXRlc19yZWdpb24gPSAwOwotCXN0cnVjdCBjaGFubmVsX2hlYWRlciBoZHI7Ci0Jc3RydWN0IGNoYW5uZWxfaGVhZGVyICpwaGRyID0gJmhkcjsKLQlpbnQgaSA9IDA7Ci0JaW50IGVycmNvZGUgPSAwOwotCi0JaWYgKCFjaGFubmVsKQotCQlyZXR1cm47Ci0KLQlhZGRyID0gdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihjaGFubmVsKTsKLQluYnl0ZXNfcmVnaW9uID0gdmlzb3JjaGFubmVsX2dldF9uYnl0ZXMoY2hhbm5lbCk7Ci0JZXJyY29kZSA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW5uZWwsIG9mZiwKLQkJCQkgICAgcGhkciwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikpOwotCWlmIChlcnJjb2RlIDwgMCkgewotCQlzZXFfcHJpbnRmKHNlcSwKLQkJCSAgICJSZWFkIG9mIGNoYW5uZWwgaGVhZGVyIGZhaWxlZCB3aXRoIGVycmNvZGU9JWQpXG4iLAotCQkJICAgZXJyY29kZSk7Ci0JCWlmIChvZmYgPT0gMCkgewotCQkJcGhkciA9ICZjaGFubmVsLT5jaGFuX2hkcjsKLQkJCXNlcV9wdXRzKHNlcSwgIihmb2xsb3dpbmcgZGF0YSBtYXkgYmUgc3RhbGUpXG4iKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQluYnl0ZXMgPSAodWxvbmcpKHBoZHItPnNpemUpOwotCXNlcV9wcmludGYoc2VxLCAiLS0tIEJlZ2luIGNoYW5uZWwgQDB4JS0xNi4xNkx4IGZvciAweCVseCBieXRlcyAocmVnaW9uPTB4JWx4IGJ5dGVzKSAtLS1cbiIsCi0JCSAgIGFkZHIgKyBvZmYsIG5ieXRlcywgbmJ5dGVzX3JlZ2lvbik7Ci0Jc2VxX3ByaW50ZihzZXEsICJUeXBlICAgICAgICAgICAgPSAlcFVMXG4iLCAmcGhkci0+Y2h0eXBlKTsKLQlzZXFfcHJpbnRmKHNlcSwgIlpvbmVHdWlkICAgICAgICA9ICVwVUxcbiIsICZwaGRyLT56b25lX3V1aWQpOwotCXNlcV9wcmludGYoc2VxLCAiU2lnbmF0dXJlICAgICAgID0gMHglLTE2LjE2THhcbiIsCi0JCSAgIChsb25nIGxvbmcpcGhkci0+c2lnbmF0dXJlKTsKLQlzZXFfcHJpbnRmKHNlcSwgIkxlZ2FjeVN0YXRlICAgICA9ICVsdVxuIiwgKHVsb25nKXBoZHItPmxlZ2FjeV9zdGF0ZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJTcnZTdGF0ZSAgICAgICAgPSAlbHVcbiIsICh1bG9uZylwaGRyLT5zcnZfc3RhdGUpOwotCXNlcV9wcmludGYoc2VxLCAiQ2xpU3RhdGVCb290ICAgID0gJWx1XG4iLCAodWxvbmcpcGhkci0+Y2xpX3N0YXRlX2Jvb3QpOwotCXNlcV9wcmludGYoc2VxLCAiQ2xpU3RhdGVPUyAgICAgID0gJWx1XG4iLCAodWxvbmcpcGhkci0+Y2xpX3N0YXRlX29zKTsKLQlzZXFfcHJpbnRmKHNlcSwgIkhlYWRlclNpemUgICAgICA9ICVsdVxuIiwgKHVsb25nKXBoZHItPmhlYWRlcl9zaXplKTsKLQlzZXFfcHJpbnRmKHNlcSwgIlNpemUgICAgICAgICAgICA9ICVsbHVcbiIsIChsb25nIGxvbmcpcGhkci0+c2l6ZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJGZWF0dXJlcyAgICAgICAgPSAweCUtMTYuMTZsbHhcbiIsCi0JCSAgIChsb25nIGxvbmcpcGhkci0+ZmVhdHVyZXMpOwotCXNlcV9wcmludGYoc2VxLCAiUGFydGl0aW9uSGFuZGxlID0gMHglLTE2LjE2bGx4XG4iLAotCQkgICAobG9uZyBsb25nKXBoZHItPnBhcnRpdGlvbl9oYW5kbGUpOwotCXNlcV9wcmludGYoc2VxLCAiSGFuZGxlICAgICAgICAgID0gMHglLTE2LjE2bGx4XG4iLAotCQkgICAobG9uZyBsb25nKXBoZHItPmhhbmRsZSk7Ci0Jc2VxX3ByaW50ZihzZXEsICJWZXJzaW9uSWQgICAgICAgPSAlbHVcbiIsICh1bG9uZylwaGRyLT52ZXJzaW9uX2lkKTsKLQlzZXFfcHJpbnRmKHNlcSwgIm9DaGFubmVsU3BhY2UgICA9ICVsbHVcbiIsCi0JCSAgIChsb25nIGxvbmcpcGhkci0+Y2hfc3BhY2Vfb2Zmc2V0KTsKLQlpZiAoKHBoZHItPmNoX3NwYWNlX29mZnNldCA9PSAwKSB8fCAoZXJyY29kZSA8IDApKQotCQk7Ci0JZWxzZQotCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3F1ZXVlczsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciBxOwotCi0JCQllcnJjb2RlID0gdmlzb3JjaGFubmVsX3JlYWQoY2hhbm5lbCwKLQkJCQkJCSAgICBvZmYgKwotCQkJCQkJICAgIHBoZHItPmNoX3NwYWNlX29mZnNldCArCi0JCQkJCQkgICAgKGkgKiBzaXplb2YocSkpLAotCQkJCQkJICAgICZxLCBzaXplb2YocSkpOwotCQkJaWYgKGVycmNvZGUgPCAwKSB7Ci0JCQkJc2VxX3ByaW50ZihzZXEsCi0JCQkJCSAgICJmYWlsZWQgdG8gcmVhZCBzaWduYWwgcXVldWUgIyVkIGZyb20gY2hhbm5lbCBAMHglLTE2LjE2THggZXJyY29kZT0lZFxuIiwKLQkJCQkJICAgaSwgYWRkciwgZXJyY29kZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzaWdxdWV1ZV9kZWJ1ZygmcSwgaSwgc2VxKTsKLQkJfQotCXNlcV9wcmludGYoc2VxLCAiLS0tIEVuZCAgIGNoYW5uZWwgQDB4JS0xNi4xNkx4IGZvciAweCVseCBieXRlcyAtLS1cbiIsCi0JCSAgIGFkZHIgKyBvZmYsIG5ieXRlcyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoYW5uZWxfZGVidWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmNoaXBzZXQuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdmlzb3JjaGlwc2V0LmMKaW5kZXggZDI0OGM5NC4uNTk4NzE0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92aXNvcmNoaXBzZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3Zpc29yY2hpcHNldC5jCkBAIC0yNSwyMSArMjUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC91dWlkLmg+CiAjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgogCi0jaW5jbHVkZSAiY2hhbm5lbF9ndWlkLmgiCi0jaW5jbHVkZSAiY29udHJvbHZtY2hhbm5lbC5oIgotI2luY2x1ZGUgImNvbnRyb2x2bWNvbXBsZXRpb25zdGF0dXMuaCIKLSNpbmNsdWRlICJndWVzdGxpbnV4ZGVidWcuaCIKLSNpbmNsdWRlICJwZXJpb2RpY193b3JrLmgiCi0jaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgInZpc29yYnVzLmgiCiAjaW5jbHVkZSAidmlzb3JidXNfcHJpdmF0ZS5oIgogI2luY2x1ZGUgInZtY2FsbGludGVyZmFjZS5oIgogCiAjZGVmaW5lIENVUlJFTlRfRklMRV9QQyBWSVNPUl9DSElQU0VUX1BDX3Zpc29yY2hpcHNldF9tYWluX2MKIAotI2RlZmluZSBNQVhfTkFNRV9TSVpFIDEyOAotI2RlZmluZSBNQVhfSVBfU0laRSAgIDUwCi0jZGVmaW5lIE1BWE9VVFNUQU5ESU5HQ0hBTk5FTENPTU1BTkQgMjU2CiAjZGVmaW5lIFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVCAgIDEKICNkZWZpbmUgUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XIDEwMAogCkBAIC01OCw5ICs0OSw2IEBACiAgKiBNb2R1bGUgcGFyYW1ldGVycwogICovCiBzdGF0aWMgaW50IHZpc29yY2hpcHNldF9tYWpvcjsKLXN0YXRpYyBpbnQgdmlzb3JjaGlwc2V0X3Zpc29yYnVzcmVnd2FpdCA9IDE7CS8qIGRlZmF1bHQgaXMgb24gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkOwotc3RhdGljIHUzMiBkdW1wX3ZoYmFfYnVzOwogCiBzdGF0aWMgaW50CiB2aXNvcmNoaXBzZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTc5LDE1ICs2NywxNSBAQAogCXJldHVybiAwOwogfQogCi0vKiBXaGVuIHRoZSBjb250cm9sdm0gY2hhbm5lbCBpcyBpZGxlIGZvciBhdCBsZWFzdCBNSU5fSURMRV9TRUNPTkRTLAotKiB3ZSBzd2l0Y2ggdG8gc2xvdyBwb2xsaW5nIG1vZGUuICBBcyBzb29uIGFzIHdlIGdldCBhIGNvbnRyb2x2bQotKiBtZXNzYWdlLCB3ZSBzd2l0Y2ggYmFjayB0byBmYXN0IHBvbGxpbmcgbW9kZS4KLSovCisvKgorICogV2hlbiB0aGUgY29udHJvbHZtIGNoYW5uZWwgaXMgaWRsZSBmb3IgYXQgbGVhc3QgTUlOX0lETEVfU0VDT05EUywKKyAqIHdlIHN3aXRjaCB0byBzbG93IHBvbGxpbmcgbW9kZS4gQXMgc29vbiBhcyB3ZSBnZXQgYSBjb250cm9sdm0KKyAqIG1lc3NhZ2UsIHdlIHN3aXRjaCBiYWNrIHRvIGZhc3QgcG9sbGluZyBtb2RlLgorICovCiAjZGVmaW5lIE1JTl9JRExFX1NFQ09ORFMgMTAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKIC8qIHdoZW4gd2UgZ290IG91ciBsYXN0IGNvbnRyb2x2bSBtZXNzYWdlICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXM7Ci1zdGF0aWMgaW50IHZpc29yYnVzcmVnaXN0ZXJlZDsKIAogc3RydWN0IHBhcnNlcl9jb250ZXh0IHsKIAl1bnNpZ25lZCBsb25nIGFsbG9jYnl0ZXM7CkBAIC05OSw1MSArODcsMzYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZGVsYXllZF93b3JrIHBlcmlvZGljX2NvbnRyb2x2bV93b3JrOwotc3RhdGljIERFRklORV9TRU1BUEhPUkUobm90aWZpZXJfbG9jayk7CiAKIHN0YXRpYyBzdHJ1Y3QgY2RldiBmaWxlX2NkZXY7CiBzdGF0aWMgc3RydWN0IHZpc29yY2hhbm5lbCAqKmZpbGVfY29udHJvbHZtX2NoYW5uZWw7Ci1zdGF0aWMgc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCBnX2RldmljZWNoYW5nZXN0YXRlX3BhY2tldDsKLQotc3RhdGljIExJU1RfSEVBRChidXNfaW5mb19saXN0KTsKLXN0YXRpYyBMSVNUX0hFQUQoZGV2X2luZm9fbGlzdCk7CiAKIHN0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjb250cm9sdm1fY2hhbm5lbDsKIAogLyogTWFuYWdlcyB0aGUgcmVxdWVzdCBwYXlsb2FkIGluIHRoZSBjb250cm9sdm0gY2hhbm5lbCAqLwogc3RydWN0IHZpc29yX2NvbnRyb2x2bV9wYXlsb2FkX2luZm8gewogCXU4ICpwdHI7CQkvKiBwb2ludGVyIHRvIGJhc2UgYWRkcmVzcyBvZiBwYXlsb2FkIHBvb2wgKi8KLQl1NjQgb2Zmc2V0OwkJLyogb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGNvbnRyb2x2bQorCXU2NCBvZmZzZXQ7CQkvKgorCQkJCSAqIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiBjb250cm9sdm0KIAkJCQkgKiBjaGFubmVsIHRvIGJlZ2lubmluZyBvZiBwYXlsb2FkICogcG9vbAogCQkJCSAqLwogCXUzMiBieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyBpbiBwYXlsb2FkIHBvb2wgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgdmlzb3JfY29udHJvbHZtX3BheWxvYWRfaW5mbyBjb250cm9sdm1fcGF5bG9hZF9pbmZvOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY29udHJvbHZtX3BheWxvYWRfYnl0ZXNfYnVmZmVyZWQ7CiAKLS8qIFRoZSBmb2xsb3dpbmcgZ2xvYmFscyBhcmUgdXNlZCB0byBoYW5kbGUgdGhlIHNjZW5hcmlvIHdoZXJlIHdlIGFyZSB1bmFibGUgdG8KLSAqIG9mZmxvYWQgdGhlIHBheWxvYWQgZnJvbSBhIGNvbnRyb2x2bSBtZXNzYWdlIGR1ZSB0byBtZW1vcnkgcmVxdWlyZW1lbnRzLiAgSW4KKy8qCisgKiBUaGUgZm9sbG93aW5nIGdsb2JhbHMgYXJlIHVzZWQgdG8gaGFuZGxlIHRoZSBzY2VuYXJpbyB3aGVyZSB3ZSBhcmUgdW5hYmxlIHRvCisgKiBvZmZsb2FkIHRoZSBwYXlsb2FkIGZyb20gYSBjb250cm9sdm0gbWVzc2FnZSBkdWUgdG8gbWVtb3J5IHJlcXVpcmVtZW50cy4gSW4KICAqIHRoaXMgc2NlbmFyaW8sIHdlIHNpbXBseSBzdGFzaCB0aGUgY29udHJvbHZtIG1lc3NhZ2UsIHRoZW4gYXR0ZW1wdCB0bwogICogcHJvY2VzcyBpdCBhZ2FpbiB0aGUgbmV4dCB0aW1lIGNvbnRyb2x2bV9wZXJpb2RpY193b3JrKCkgcnVucy4KICAqLwogc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBjb250cm9sdm1fcGVuZGluZ19tc2c7CiBzdGF0aWMgYm9vbCBjb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQ7CiAKLS8qIFRoaXMgaWRlbnRpZmllcyBhIGRhdGEgYnVmZmVyIHRoYXQgaGFzIGJlZW4gcmVjZWl2ZWQgdmlhIGEgY29udHJvbHZtIG1lc3NhZ2VzCi0gKiBpbiBhIHJlbW90ZSAtLT4gbG9jYWwgQ09OVFJPTFZNX1RSQU5TTUlUX0ZJTEUgY29udmVyc2F0aW9uLgotICovCi1zdHJ1Y3QgcHV0ZmlsZV9idWZmZXJfZW50cnkgewotCXN0cnVjdCBsaXN0X2hlYWQgbmV4dDsJLyogcHV0ZmlsZV9idWZmZXJfZW50cnkgbGlzdCAqLwotCXN0cnVjdCBwYXJzZXJfY29udGV4dCAqcGFyc2VyX2N0eDsgLyogcG9pbnRzIHRvIGlucHV0IGRhdGEgYnVmZmVyICovCi19OwotCi0vKiBMaXN0IG9mIHN0cnVjdCBwdXRmaWxlX3JlcXVlc3QgKiwgdmlhIG5leHRfcHV0ZmlsZV9yZXF1ZXN0IG1lbWJlci4KLSAqIEVhY2ggZW50cnkgaW4gdGhpcyBsaXN0IGlkZW50aWZpZXMgYW4gb3V0c3RhbmRpbmcgVFJBTlNNSVRfRklMRQotICogY29udmVyc2F0aW9uLgotICovCi1zdGF0aWMgTElTVF9IRUFEKHB1dGZpbGVfcmVxdWVzdF9saXN0KTsKLQotLyogVGhpcyBkZXNjcmliZXMgYSBidWZmZXIgYW5kIGl0cyBjdXJyZW50IHN0YXRlIG9mIHRyYW5zZmVyIChlLmcuLCBob3cgbWFueQorLyoKKyAqIFRoaXMgZGVzY3JpYmVzIGEgYnVmZmVyIGFuZCBpdHMgY3VycmVudCBzdGF0ZSBvZiB0cmFuc2ZlciAoZS5nLiwgaG93IG1hbnkKICAqIGJ5dGVzIGhhdmUgYWxyZWFkeSBiZWVuIHN1cHBsaWVkIGFzIHB1dGZpbGUgZGF0YSwgYW5kIGhvdyBtYW55IGJ5dGVzIGFyZQogICogcmVtYWluaW5nKSBmb3IgYSBwdXRmaWxlX3JlcXVlc3QuCiAgKi8KQEAgLTE1NSw4ICsxMjgsOSBAQAogfTsKIAogI2RlZmluZSBQVVRGSUxFX1JFUVVFU1RfU0lHIDB4MDkwNjEwMTMwMjI4MTIxMQotLyogVGhpcyBpZGVudGlmaWVzIGEgc2luZ2xlIHJlbW90ZSAtLT4gbG9jYWwgQ09OVFJPTFZNX1RSQU5TTUlUX0ZJTEUKLSAqIGNvbnZlcnNhdGlvbi4gIFN0cnVjdHMgb2YgdGhpcyB0eXBlIGFyZSBkeW5hbWljYWxseSBsaW5rZWQgaW50bworLyoKKyAqIFRoaXMgaWRlbnRpZmllcyBhIHNpbmdsZSByZW1vdGUgLS0+IGxvY2FsIENPTlRST0xWTV9UUkFOU01JVF9GSUxFCisgKiBjb252ZXJzYXRpb24uIFN0cnVjdHMgb2YgdGhpcyB0eXBlIGFyZSBkeW5hbWljYWxseSBsaW5rZWQgaW50bwogICogPFB1dGZpbGVfcmVxdWVzdF9saXN0Pi4KICAqLwogc3RydWN0IHB1dGZpbGVfcmVxdWVzdCB7CkBAIC0xNjgsNyArMTQyLDggQEAKIAkvKiBsaW5rIHRvIG5leHQgc3RydWN0IHB1dGZpbGVfcmVxdWVzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbmV4dF9wdXRmaWxlX3JlcXVlc3Q7CiAKLQkvKiBoZWFkIG9mIHB1dGZpbGVfYnVmZmVyX2VudHJ5IGxpc3QsIHdoaWNoIGRlc2NyaWJlcyB0aGUgZGF0YSB0byBiZQorCS8qCisJICogaGVhZCBvZiBwdXRmaWxlX2J1ZmZlcl9lbnRyeSBsaXN0LCB3aGljaCBkZXNjcmliZXMgdGhlIGRhdGEgdG8gYmUKIAkgKiBzdXBwbGllZCBhcyBwdXRmaWxlIGRhdGE7CiAJICogLSB0aGlzIGxpc3QgaXMgYWRkZWQgdG8gd2hlbiBjb250cm9sdm0gbWVzc2FnZXMgY29tZSBpbiB0aGF0IHN1cHBseQogCSAqIGZpbGUgZGF0YQpAQCAtMTg0LDExICsxNTksMTMgQEAKIAkvKiBkYXRhIG5vdCB5ZXQgcmVhZCB3aXRoaW4gY3VycmVudCBwdXRmaWxlX2J1ZmZlcl9lbnRyeSAqLwogCXN0cnVjdCBwdXRmaWxlX2FjdGl2ZV9idWZmZXIgYWN0aXZlX2J1ZjsKIAotCS8qIDwwID0gZmFpbGVkLCAwID0gaW4tcHJvZ3Jlc3MsID4wID0gc3VjY2Vzc2Z1bDsgKi8KLQkvKiBub3RlIHRoYXQgdGhpcyBtdXN0IGJlIHNldCB3aXRoIHJlcV9saXN0X2xvY2ssIGFuZCBpZiB5b3Ugc2V0IDwwLCAqLwotCS8qIGl0IGlzIHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gYWxzbyBmcmVlIHVwIGFsbCBvZiB0aGUgb3RoZXIgb2JqZWN0cyAqLwotCS8qIGluIHRoaXMgc3RydWN0IChsaWtlIGlucHV0X2J1ZmZlcl9saXN0LCBhY3RpdmVfYnVmLnBhcnNlcl9jdHgpICovCi0JLyogYmVmb3JlIHJlbGVhc2luZyB0aGUgbG9jayAqLworCS8qCisJICogPDAgPSBmYWlsZWQsIDAgPSBpbi1wcm9ncmVzcywgPjAgPSBzdWNjZXNzZnVsOworCSAqIG5vdGUgdGhhdCB0aGlzIG11c3QgYmUgc2V0IHdpdGggcmVxX2xpc3RfbG9jaywgYW5kIGlmIHlvdSBzZXQgPDAsCisJICogaXQgaXMgeW91ciByZXNwb25zaWJpbGl0eSB0byBhbHNvIGZyZWUgdXAgYWxsIG9mIHRoZSBvdGhlciBvYmplY3RzCisJICogaW4gdGhpcyBzdHJ1Y3QgKGxpa2UgaW5wdXRfYnVmZmVyX2xpc3QsIGFjdGl2ZV9idWYucGFyc2VyX2N0eCkKKwkgKiBiZWZvcmUgcmVsZWFzaW5nIHRoZSBsb2NrCisJICovCiAJaW50IGNvbXBsZXRpb25fc3RhdHVzOwogfTsKIApAQCAtMTk5LDE5MyArMTc2LDE3OSBAQAogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBtc2c7CiB9OwogCi1zdGF0aWMgTElTVF9IRUFEKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsJLyogbG9jayBmb3IgYWJvdmUgKi8KLXN0YXRpYyB2b2lkIHBhcmFob3RwbHVnX3Byb2Nlc3NfbGlzdCh2b2lkKTsKLQotLyogTWFuYWdlcyB0aGUgaW5mbyBmb3IgYSBDT05UUk9MVk1fRFVNUF9DQVBUVVJFU1RBVEUgLwotICogQ09OVFJPTFZNX1JFUE9SVEVWRU5ULgotICovCi1zdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzIGJ1c2Rldl9ub3RpZmllcnM7Ci0KLXN0YXRpYyB2b2lkIGJ1c19jcmVhdGVfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqcCwgaW50IHJlc3BvbnNlKTsKLXN0YXRpYyB2b2lkIGJ1c19kZXN0cm95X3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Ci1zdGF0aWMgdm9pZCBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsIGludCByZXNwb25zZSk7Ci1zdGF0aWMgdm9pZCBkZXZpY2VfZGVzdHJveV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotc3RhdGljIHZvaWQgZGV2aWNlX3Jlc3VtZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpwLCBpbnQgcmVzcG9uc2UpOwotCi1zdGF0aWMgdm9pZCB2aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKnAsCi0JCQkJCSAgICAgICBpbnQgcmVzcG9uc2UpOwotCi1zdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfcmVzcG9uZGVycyBidXNkZXZfcmVzcG9uZGVycyA9IHsKLQkuYnVzX2NyZWF0ZSA9IGJ1c19jcmVhdGVfcmVzcG9uc2UsCi0JLmJ1c19kZXN0cm95ID0gYnVzX2Rlc3Ryb3lfcmVzcG9uc2UsCi0JLmRldmljZV9jcmVhdGUgPSBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlLAotCS5kZXZpY2VfZGVzdHJveSA9IGRldmljZV9kZXN0cm95X3Jlc3BvbnNlLAotCS5kZXZpY2VfcGF1c2UgPSB2aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlLAotCS5kZXZpY2VfcmVzdW1lID0gZGV2aWNlX3Jlc3VtZV9yZXNwb25zZSwKLX07Ci0KIC8qIGluZm8gZm9yIC9kZXYvdmlzb3JjaGlwc2V0ICovCi1zdGF0aWMgZGV2X3QgbWFqb3JfZGV2ID0gLTE7IC8qKjwgaW5kaWNhdGVzIG1ham9yIG51bSBmb3IgZGV2aWNlICovCitzdGF0aWMgZGV2X3QgbWFqb3JfZGV2ID0gLTE7IC8qPCBpbmRpY2F0ZXMgbWFqb3IgbnVtIGZvciBkZXZpY2UgKi8KIAogLyogcHJvdG90eXBlcyBmb3IgYXR0cmlidXRlcyAqLwogc3RhdGljIHNzaXplX3QgdG9vbGFjdGlvbl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjaGFyICpidWYpCit7CisJdTggdG9vbF9hY3Rpb24gPSAwOworCisJdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJCSAgIHRvb2xfYWN0aW9uKSwgJnRvb2xfYWN0aW9uLCBzaXplb2YodTgpKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHRvb2xfYWN0aW9uKTsKK30KKwogc3RhdGljIHNzaXplX3QgdG9vbGFjdGlvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXU4IHRvb2xfYWN0aW9uOworCWludCByZXQ7CisKKwlpZiAoa3N0cnRvdTgoYnVmLCAxMCwgJnRvb2xfYWN0aW9uKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKKwkJKGNvbnRyb2x2bV9jaGFubmVsLAorCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgIHRvb2xfYWN0aW9uKSwKKwkJICZ0b29sX2FjdGlvbiwgc2l6ZW9mKHU4KSk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBjb3VudDsKK30KIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyh0b29sYWN0aW9uKTsKIAogc3RhdGljIHNzaXplX3QgYm9vdHRvdG9vbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24gZWZpX3NwYXJfaW5kaWNhdGlvbjsKKworCXZpc29yY2hhbm5lbF9yZWFkKGNvbnRyb2x2bV9jaGFubmVsLAorCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCQkgICBlZmlfc3Bhcl9pbmQpLCAmZWZpX3NwYXJfaW5kaWNhdGlvbiwKKwkJCSAgc2l6ZW9mKHN0cnVjdCBlZmlfc3Bhcl9pbmRpY2F0aW9uKSk7CisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLAorCQkJIGVmaV9zcGFyX2luZGljYXRpb24uYm9vdF90b190b29sKTsKK30KKwogc3RhdGljIHNzaXplX3QgYm9vdHRvdG9vbF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQlzaXplX3QgY291bnQpOworCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCB2YWwsIHJldDsKKwlzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbiBlZmlfc3Bhcl9pbmRpY2F0aW9uOworCisJaWYgKGtzdHJ0b2ludChidWYsIDEwLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllZmlfc3Bhcl9pbmRpY2F0aW9uLmJvb3RfdG9fdG9vbCA9IHZhbDsKKwlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKKwkJKGNvbnRyb2x2bV9jaGFubmVsLAorCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgIGVmaV9zcGFyX2luZCksICYoZWZpX3NwYXJfaW5kaWNhdGlvbiksCisJCSBzaXplb2Yoc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24pKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGNvdW50OworfQogc3RhdGljIERFVklDRV9BVFRSX1JXKGJvb3R0b3Rvb2wpOwogCiBzdGF0aWMgc3NpemVfdCBlcnJvcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgIGNoYXIgKmJ1Zik7CisJCQkgIGNoYXIgKmJ1ZikKK3sKKwl1MzIgZXJyb3IgPSAwOworCisJdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJCSAgIGluc3RhbGxhdGlvbl9lcnJvciksCisJCQkgICZlcnJvciwgc2l6ZW9mKHUzMikpOworCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaVxuIiwgZXJyb3IpOworfQorCiBzdGF0aWMgc3NpemVfdCBlcnJvcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdTMyIGVycm9yOworCWludCByZXQ7CisKKwlpZiAoa3N0cnRvdTMyKGJ1ZiwgMTAsICZlcnJvcikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlCisJCShjb250cm9sdm1fY2hhbm5lbCwKKwkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJICBpbnN0YWxsYXRpb25fZXJyb3IpLAorCQkgJmVycm9yLCBzaXplb2YodTMyKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gY291bnQ7Cit9CiBzdGF0aWMgREVWSUNFX0FUVFJfUlcoZXJyb3IpOwogCiBzdGF0aWMgc3NpemVfdCB0ZXh0aWRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgY2hhciAqYnVmKTsKKwkJCSAgIGNoYXIgKmJ1ZikKK3sKKwl1MzIgdGV4dF9pZCA9IDA7CisKKwl2aXNvcmNoYW5uZWxfcmVhZAorCQkoY29udHJvbHZtX2NoYW5uZWwsCisJCSBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCSAgaW5zdGFsbGF0aW9uX3RleHRfaWQpLAorCQkgJnRleHRfaWQsIHNpemVvZih1MzIpKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHRleHRfaWQpOworfQorCiBzdGF0aWMgc3NpemVfdCB0ZXh0aWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdTMyIHRleHRfaWQ7CisJaW50IHJldDsKKworCWlmIChrc3RydG91MzIoYnVmLCAxMCwgJnRleHRfaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHZpc29yY2hhbm5lbF93cml0ZQorCQkoY29udHJvbHZtX2NoYW5uZWwsCisJCSBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCSAgaW5zdGFsbGF0aW9uX3RleHRfaWQpLAorCQkgJnRleHRfaWQsIHNpemVvZih1MzIpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBjb3VudDsKK30KIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyh0ZXh0aWQpOwogCiBzdGF0aWMgc3NpemVfdCByZW1haW5pbmdfc3RlcHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOworCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXUxNiByZW1haW5pbmdfc3RlcHMgPSAwOworCisJdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJCSAgIGluc3RhbGxhdGlvbl9yZW1haW5pbmdfc3RlcHMpLAorCQkJICAmcmVtYWluaW5nX3N0ZXBzLCBzaXplb2YodTE2KSk7CisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVodVxuIiwgcmVtYWluaW5nX3N0ZXBzKTsKK30KKwogc3RhdGljIHNzaXplX3QgcmVtYWluaW5nX3N0ZXBzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdTE2IHJlbWFpbmluZ19zdGVwczsKKwlpbnQgcmV0OworCisJaWYgKGtzdHJ0b3UxNihidWYsIDEwLCAmcmVtYWluaW5nX3N0ZXBzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKKwkJKGNvbnRyb2x2bV9jaGFubmVsLAorCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgIGluc3RhbGxhdGlvbl9yZW1haW5pbmdfc3RlcHMpLAorCQkgJnJlbWFpbmluZ19zdGVwcywgc2l6ZW9mKHUxNikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGNvdW50OworfQogc3RhdGljIERFVklDRV9BVFRSX1JXKHJlbWFpbmluZ19zdGVwcyk7CiAKLXN0YXRpYyBzc2l6ZV90IGRldmljZWRpc2FibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLXN0YXRpYyBERVZJQ0VfQVRUUl9XTyhkZXZpY2VkaXNhYmxlZCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGRldmljZWVuYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLXN0YXRpYyBERVZJQ0VfQVRUUl9XTyhkZXZpY2VlbmFibGVkKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnZpc29yY2hpcHNldF9pbnN0YWxsX2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX3Rvb2xhY3Rpb24uYXR0ciwKLQkmZGV2X2F0dHJfYm9vdHRvdG9vbC5hdHRyLAotCSZkZXZfYXR0cl9lcnJvci5hdHRyLAotCSZkZXZfYXR0cl90ZXh0aWQuYXR0ciwKLQkmZGV2X2F0dHJfcmVtYWluaW5nX3N0ZXBzLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdmlzb3JjaGlwc2V0X2luc3RhbGxfZ3JvdXAgPSB7Ci0JLm5hbWUgPSAiaW5zdGFsbCIsCi0JLmF0dHJzID0gdmlzb3JjaGlwc2V0X2luc3RhbGxfYXR0cnMKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2aXNvcmNoaXBzZXRfcGFyYWhvdHBsdWdfYXR0cnNbXSA9IHsKLQkmZGV2X2F0dHJfZGV2aWNlZGlzYWJsZWQuYXR0ciwKLQkmZGV2X2F0dHJfZGV2aWNlZW5hYmxlZC5hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZpc29yY2hpcHNldF9wYXJhaG90cGx1Z19ncm91cCA9IHsKLQkubmFtZSA9ICJwYXJhaG90cGx1ZyIsCi0JLmF0dHJzID0gdmlzb3JjaGlwc2V0X3BhcmFob3RwbHVnX2F0dHJzCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqdmlzb3JjaGlwc2V0X2Rldl9ncm91cHNbXSA9IHsKLQkmdmlzb3JjaGlwc2V0X2luc3RhbGxfZ3JvdXAsCi0JJnZpc29yY2hpcHNldF9wYXJhaG90cGx1Z19ncm91cCwKLQlOVUxMCi19OwotCi1zdGF0aWMgdm9pZCB2aXNvcmNoaXBzZXRfZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotfQotCi0vKiAvc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0ICovCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2aXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlID0gewotCS5uYW1lID0gInZpc29yY2hpcHNldCIsCi0JLmlkID0gLTEsCi0JLmRldi5ncm91cHMgPSB2aXNvcmNoaXBzZXRfZGV2X2dyb3VwcywKLQkuZGV2LnJlbGVhc2UgPSB2aXNvcmNoaXBzZXRfZGV2X3JlbGVhc2UsCi19OwotCi0vKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLAotCQkJICAgICAgaW50IHJlc3BvbnNlKTsKLXN0YXRpYyB2b2lkIGNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdCgKLQkJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnX2hkciwgaW50IHJlc3BvbnNlLAotCQllbnVtIHVsdHJhX2NoaXBzZXRfZmVhdHVyZSBmZWF0dXJlcyk7Ci1zdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKAotCQlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLCBpbnQgcmVzcG9uc2UsCi0JCXN0cnVjdCBzcGFyX3NlZ21lbnRfc3RhdGUgc3RhdGUpOwotCi1zdGF0aWMgdm9pZCBwYXJzZXJfZG9uZShzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKgotcGFyc2VyX2luaXRfYnl0ZV9zdHJlYW0odTY0IGFkZHIsIHUzMiBieXRlcywgYm9vbCBsb2NhbCwgYm9vbCAqcmV0cnkpCi17Ci0JaW50IGFsbG9jYnl0ZXMgPSBzaXplb2Yoc3RydWN0IHBhcnNlcl9jb250ZXh0KSArIGJ5dGVzOwotCXN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4OwotCi0JaWYgKHJldHJ5KQotCQkqcmV0cnkgPSBmYWxzZTsKLQotCS8qCi0JICogYWxsb2MgYW4gMCBleHRyYSBieXRlIHRvIGVuc3VyZSBwYXlsb2FkIGlzCi0JICogJ1wwJy10ZXJtaW5hdGVkCi0JICovCi0JYWxsb2NieXRlcysrOwotCWlmICgoY29udHJvbHZtX3BheWxvYWRfYnl0ZXNfYnVmZmVyZWQgKyBieXRlcykKLQkgICAgPiBNQVhfQ09OVFJPTFZNX1BBWUxPQURfQllURVMpIHsKLQkJaWYgKHJldHJ5KQotCQkJKnJldHJ5ID0gdHJ1ZTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWN0eCA9IGt6YWxsb2MoYWxsb2NieXRlcywgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmICghY3R4KSB7Ci0JCWlmIChyZXRyeSkKLQkJCSpyZXRyeSA9IHRydWU7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWN0eC0+YWxsb2NieXRlcyA9IGFsbG9jYnl0ZXM7Ci0JY3R4LT5wYXJhbV9ieXRlcyA9IGJ5dGVzOwotCWN0eC0+Y3VyciA9IE5VTEw7Ci0JY3R4LT5ieXRlc19yZW1haW5pbmcgPSAwOwotCWN0eC0+Ynl0ZV9zdHJlYW0gPSBmYWxzZTsKLQlpZiAobG9jYWwpIHsKLQkJdm9pZCAqcDsKLQotCQlpZiAoYWRkciA+IHZpcnRfdG9fcGh5cyhoaWdoX21lbW9yeSAtIDEpKQotCQkJZ290byBlcnJfZmluaXNoX2N0eDsKLQkJcCA9IF9fdmEoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKTsKLQkJbWVtY3B5KGN0eC0+ZGF0YSwgcCwgYnl0ZXMpOwotCX0gZWxzZSB7Ci0JCXZvaWQgKm1hcHBpbmcgPSBtZW1yZW1hcChhZGRyLCBieXRlcywgTUVNUkVNQVBfV0IpOwotCi0JCWlmICghbWFwcGluZykKLQkJCWdvdG8gZXJyX2ZpbmlzaF9jdHg7Ci0JCW1lbWNweShjdHgtPmRhdGEsIG1hcHBpbmcsIGJ5dGVzKTsKLQkJbWVtdW5tYXAobWFwcGluZyk7Ci0JfQotCi0JY3R4LT5ieXRlX3N0cmVhbSA9IHRydWU7Ci0JY29udHJvbHZtX3BheWxvYWRfYnl0ZXNfYnVmZmVyZWQgKz0gY3R4LT5wYXJhbV9ieXRlczsKLQotCXJldHVybiBjdHg7Ci0KLWVycl9maW5pc2hfY3R4OgotCXBhcnNlcl9kb25lKGN0eCk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIHN0YXRpYyB1dWlkX2xlCiBwYXJzZXJfaWRfZ2V0KHN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4KQogewpAQCAtMzk3LDggKzM2MCw5IEBACiAJcmV0dXJuIHBoZHItPmlkOwogfQogCi0vKiogRGVzY3JpYmVzIHRoZSBzdGF0ZSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB3aGljaCBjb250cm9sdm0gbWVzc2FnZXMgaGF2ZQotICogIGJlZW4gcmVjZWl2ZWQgZm9yIGEgYnVzIG9yIGRldmljZS4KKy8qCisgKiBEZXNjcmliZXMgdGhlIHN0YXRlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHdoaWNoIGNvbnRyb2x2bSBtZXNzYWdlcyBoYXZlCisgKiBiZWVuIHJlY2VpdmVkIGZvciBhIGJ1cyBvciBkZXZpY2UuCiAgKi8KIAogZW51bSBQQVJTRVJfV0hJQ0hfU1RSSU5HIHsKQEAgLTQ4MSwxNzAgKzQ0NSw2IEBACiAJcmV0dXJuIHZhbHVlOwogfQogCi1zdGF0aWMgc3NpemVfdCB0b29sYWN0aW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNoYXIgKmJ1ZikKLXsKLQl1OCB0b29sX2FjdGlvbiA9IDA7Ci0KLQl2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKLQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkJICAgdG9vbF9hY3Rpb24pLCAmdG9vbF9hY3Rpb24sIHNpemVvZih1OCkpOwotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwgdG9vbF9hY3Rpb24pOwotfQotCi1zdGF0aWMgc3NpemVfdCB0b29sYWN0aW9uX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1OCB0b29sX2FjdGlvbjsKLQlpbnQgcmV0OwotCi0JaWYgKGtzdHJ0b3U4KGJ1ZiwgMTAsICZ0b29sX2FjdGlvbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlCi0JCShjb250cm9sdm1fY2hhbm5lbCwKLQkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJICB0b29sX2FjdGlvbiksCi0JCSAmdG9vbF9hY3Rpb24sIHNpemVvZih1OCkpOwotCi0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJvb3R0b3Rvb2xfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBlZmlfc3Bhcl9pbmRpY2F0aW9uIGVmaV9zcGFyX2luZGljYXRpb247Ci0KLQl2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKLQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkJICAgZWZpX3NwYXJfaW5kKSwgJmVmaV9zcGFyX2luZGljYXRpb24sCi0JCQkgIHNpemVvZihzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbikpOwotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIldVxuIiwKLQkJCSBlZmlfc3Bhcl9pbmRpY2F0aW9uLmJvb3RfdG9fdG9vbCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGJvb3R0b3Rvb2xfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCWludCB2YWwsIHJldDsKLQlzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbiBlZmlfc3Bhcl9pbmRpY2F0aW9uOwotCi0JaWYgKGtzdHJ0b2ludChidWYsIDEwLCAmdmFsKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQllZmlfc3Bhcl9pbmRpY2F0aW9uLmJvb3RfdG9fdG9vbCA9IHZhbDsKLQlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKLQkJKGNvbnRyb2x2bV9jaGFubmVsLAotCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkgIGVmaV9zcGFyX2luZCksICYoZWZpX3NwYXJfaW5kaWNhdGlvbiksCi0JCSBzaXplb2Yoc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24pKTsKLQotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBlcnJvcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgIGNoYXIgKmJ1ZikKLXsKLQl1MzIgZXJyb3IgPSAwOwotCi0Jdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJCSAgIGluc3RhbGxhdGlvbl9lcnJvciksCi0JCQkgICZlcnJvciwgc2l6ZW9mKHUzMikpOwotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaVxuIiwgZXJyb3IpOwotfQotCi1zdGF0aWMgc3NpemVfdCBlcnJvcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdTMyIGVycm9yOwotCWludCByZXQ7Ci0KLQlpZiAoa3N0cnRvdTMyKGJ1ZiwgMTAsICZlcnJvcikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlCi0JCShjb250cm9sdm1fY2hhbm5lbCwKLQkJIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJICBpbnN0YWxsYXRpb25fZXJyb3IpLAotCQkgJmVycm9yLCBzaXplb2YodTMyKSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHRleHRpZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICBjaGFyICpidWYpCi17Ci0JdTMyIHRleHRfaWQgPSAwOwotCi0Jdmlzb3JjaGFubmVsX3JlYWQKLQkJKGNvbnRyb2x2bV9jaGFubmVsLAotCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkgIGluc3RhbGxhdGlvbl90ZXh0X2lkKSwKLQkJICZ0ZXh0X2lkLCBzaXplb2YodTMyKSk7Ci0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCB0ZXh0X2lkKTsKLX0KLQotc3RhdGljIHNzaXplX3QgdGV4dGlkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdTMyIHRleHRfaWQ7Ci0JaW50IHJldDsKLQotCWlmIChrc3RydG91MzIoYnVmLCAxMCwgJnRleHRfaWQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IHZpc29yY2hhbm5lbF93cml0ZQotCQkoY29udHJvbHZtX2NoYW5uZWwsCi0JCSBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCSAgaW5zdGFsbGF0aW9uX3RleHRfaWQpLAotCQkgJnRleHRfaWQsIHNpemVvZih1MzIpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgcmVtYWluaW5nX3N0ZXBzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXUxNiByZW1haW5pbmdfc3RlcHMgPSAwOwotCi0Jdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJCSAgIGluc3RhbGxhdGlvbl9yZW1haW5pbmdfc3RlcHMpLAotCQkJICAmcmVtYWluaW5nX3N0ZXBzLCBzaXplb2YodTE2KSk7Ci0JcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVodVxuIiwgcmVtYWluaW5nX3N0ZXBzKTsKLX0KLQotc3RhdGljIHNzaXplX3QgcmVtYWluaW5nX3N0ZXBzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0JdTE2IHJlbWFpbmluZ19zdGVwczsKLQlpbnQgcmV0OwotCi0JaWYgKGtzdHJ0b3UxNihidWYsIDEwLCAmcmVtYWluaW5nX3N0ZXBzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUKLQkJKGNvbnRyb2x2bV9jaGFubmVsLAotCQkgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkgIGluc3RhbGxhdGlvbl9yZW1haW5pbmdfc3RlcHMpLAotCQkgJnJlbWFpbmluZ19zdGVwcywgc2l6ZW9mKHUxNikpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIGNvdW50OwotfQotCiBzdHJ1Y3Qgdmlzb3JfYnVzZGV2IHsKIAl1MzIgYnVzX25vOwogCXUzMiBkZXZfbm87CkBAIC02ODMsNjQgKzQ4Myw2IEBACiAJCXZkZXYgPSB0b192aXNvcl9kZXZpY2UoZGV2KTsKIAlyZXR1cm4gdmRldjsKIH0KLUVYUE9SVF9TWU1CT0wodmlzb3JidXNfZ2V0X2RldmljZV9ieV9pZCk7Ci0KLXZvaWQKLXZpc29yY2hpcHNldF9yZWdpc3Rlcl9idXNkZXYoCi0JCQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9ub3RpZmllcnMgKm5vdGlmaWVycywKLQkJCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X3Jlc3BvbmRlcnMgKnJlc3BvbmRlcnMsCi0JCQlzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvICpkcml2ZXJfaW5mbykKLXsKLQlkb3duKCZub3RpZmllcl9sb2NrKTsKLQlpZiAoIW5vdGlmaWVycykgewotCQltZW1zZXQoJmJ1c2Rldl9ub3RpZmllcnMsIDAsCi0JCSAgICAgICBzaXplb2YoYnVzZGV2X25vdGlmaWVycykpOwotCQl2aXNvcmJ1c3JlZ2lzdGVyZWQgPSAwOwkvKiBjbGVhciBmbGFnICovCi0JfSBlbHNlIHsKLQkJYnVzZGV2X25vdGlmaWVycyA9ICpub3RpZmllcnM7Ci0JCXZpc29yYnVzcmVnaXN0ZXJlZCA9IDE7CS8qIHNldCBmbGFnICovCi0JfQotCWlmIChyZXNwb25kZXJzKQotCQkqcmVzcG9uZGVycyA9IGJ1c2Rldl9yZXNwb25kZXJzOwotCWlmIChkcml2ZXJfaW5mbykKLQkJYnVzX2RldmljZV9pbmZvX2luaXQoZHJpdmVyX2luZm8sICJjaGlwc2V0IiwgInZpc29yY2hpcHNldCIsCi0JCQkJICAgICBWRVJTSU9OLCBOVUxMKTsKLQotCXVwKCZub3RpZmllcl9sb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHZpc29yY2hpcHNldF9yZWdpc3Rlcl9idXNkZXYpOwotCi1zdGF0aWMgdm9pZAotY2hpcHNldF9pbml0KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2cpCi17Ci0Jc3RhdGljIGludCBjaGlwc2V0X2luaXRlZDsKLQllbnVtIHVsdHJhX2NoaXBzZXRfZmVhdHVyZSBmZWF0dXJlcyA9IDA7Ci0JaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKLQotCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKLQlpZiAoY2hpcHNldF9pbml0ZWQpIHsKLQkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOwotCQlnb3RvIG91dF9yZXNwb25kOwotCX0KLQljaGlwc2V0X2luaXRlZCA9IDE7Ci0JUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7Ci0KLQkvKiBTZXQgZmVhdHVyZXMgdG8gaW5kaWNhdGUgd2Ugc3VwcG9ydCBwYXJhaG90cGx1ZyAoaWYgQ29tbWFuZAotCSAqIGFsc28gc3VwcG9ydHMgaXQpLgotCSAqLwotCWZlYXR1cmVzID0KLQkgICAgaW5tc2ctPmNtZC5pbml0X2NoaXBzZXQuCi0JICAgIGZlYXR1cmVzICYgVUxUUkFfQ0hJUFNFVF9GRUFUVVJFX1BBUkFfSE9UUExVRzsKLQotCS8qIFNldCB0aGUgInJlcGx5IiBiaXQgc28gQ29tbWFuZCBrbm93cyB0aGlzIGlzIGEKLQkgKiBmZWF0dXJlcy1hd2FyZSBkcml2ZXIuCi0JICovCi0JZmVhdHVyZXMgfD0gVUxUUkFfQ0hJUFNFVF9GRUFUVVJFX1JFUExZOwotCi1vdXRfcmVzcG9uZDoKLQlpZiAoaW5tc2ctPmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKLQkJY29udHJvbHZtX3Jlc3BvbmRfY2hpcHNldF9pbml0KCZpbm1zZy0+aGRyLCByYywgZmVhdHVyZXMpOwotfQogCiBzdGF0aWMgdm9pZAogY29udHJvbHZtX2luaXRfcmVzcG9uc2Uoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlICptc2csCkBAIC03NTgsMjEgKzUwMCw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1jb250cm9sdm1fcmVzcG9uZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLCBpbnQgcmVzcG9uc2UpCi17Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIG91dG1zZzsKLQotCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZvdXRtc2csIG1zZ19oZHIsIHJlc3BvbnNlKTsKLQlpZiAob3V0bXNnLmhkci5mbGFncy50ZXN0X21lc3NhZ2UgPT0gMSkKLQkJcmV0dXJuOwotCi0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGNvbnRyb2x2bV9jaGFubmVsLAotCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKLQkJcmV0dXJuOwotCX0KLX0KLQotc3RhdGljIHZvaWQKIGNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLAogCQkJICAgICAgIGludCByZXNwb25zZSwKIAkJCSAgICAgICBlbnVtIHVsdHJhX2NoaXBzZXRfZmVhdHVyZSBmZWF0dXJlcykKQEAgLTc4MSw4ICs1MDgsNTcgQEAKIAogCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZvdXRtc2csIG1zZ19oZHIsIHJlc3BvbnNlKTsKIAlvdXRtc2cuY21kLmluaXRfY2hpcHNldC5mZWF0dXJlcyA9IGZlYXR1cmVzOwotCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKLQkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7CisJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkJICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjaGlwc2V0X2luaXQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlICppbm1zZykKK3sKKwlzdGF0aWMgaW50IGNoaXBzZXRfaW5pdGVkOworCWVudW0gdWx0cmFfY2hpcHNldF9mZWF0dXJlIGZlYXR1cmVzID0gMDsKKwlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOworCisJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRU5UUllfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCWlmIChjaGlwc2V0X2luaXRlZCkgeworCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CisJCWdvdG8gb3V0X3Jlc3BvbmQ7CisJfQorCWNoaXBzZXRfaW5pdGVkID0gMTsKKwlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKworCS8qCisJICogU2V0IGZlYXR1cmVzIHRvIGluZGljYXRlIHdlIHN1cHBvcnQgcGFyYWhvdHBsdWcgKGlmIENvbW1hbmQKKwkgKiBhbHNvIHN1cHBvcnRzIGl0KS4KKwkgKi8KKwlmZWF0dXJlcyA9CisJICAgIGlubXNnLT5jbWQuaW5pdF9jaGlwc2V0LgorCSAgICBmZWF0dXJlcyAmIFVMVFJBX0NISVBTRVRfRkVBVFVSRV9QQVJBX0hPVFBMVUc7CisKKwkvKgorCSAqIFNldCB0aGUgInJlcGx5IiBiaXQgc28gQ29tbWFuZCBrbm93cyB0aGlzIGlzIGEKKwkgKiBmZWF0dXJlcy1hd2FyZSBkcml2ZXIuCisJICovCisJZmVhdHVyZXMgfD0gVUxUUkFfQ0hJUFNFVF9GRUFUVVJFX1JFUExZOworCitvdXRfcmVzcG9uZDoKKwlpZiAoaW5tc2ctPmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKKwkJY29udHJvbHZtX3Jlc3BvbmRfY2hpcHNldF9pbml0KCZpbm1zZy0+aGRyLCByYywgZmVhdHVyZXMpOworfQorCitzdGF0aWMgdm9pZAorY29udHJvbHZtX3Jlc3BvbmQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnX2hkciwgaW50IHJlc3BvbnNlKQoreworCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBvdXRtc2c7CisKKwljb250cm9sdm1faW5pdF9yZXNwb25zZSgmb3V0bXNnLCBtc2dfaGRyLCByZXNwb25zZSk7CisJaWYgKG91dG1zZy5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpCisJCXJldHVybjsKKworCWlmICh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGNvbnRyb2x2bV9jaGFubmVsLAorCQkJCSAgICAgIENPTlRST0xWTV9RVUVVRV9SRVFVRVNULCAmb3V0bXNnKSkgewogCQlyZXR1cm47CiAJfQogfQpAQCAtNzk2LDggKzU3Miw4IEBACiAJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnX2hkciwgcmVzcG9uc2UpOwogCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSA9IHN0YXRlOwogCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5mbGFncy5waHlzX2RldmljZSA9IDE7Ci0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGNvbnRyb2x2bV9jaGFubmVsLAotCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKKwlpZiAodmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKIAkJcmV0dXJuOwogCX0KIH0KQEAgLTg5NCw4ICs2NzAsOCBAQAogCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5kZXZfbm8gPSBkZXZfbm87CiAJb3V0bXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlID0gcmVzcG9uc2Vfc3RhdGU7CiAKLQlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkJICAgICAgIENPTlRST0xWTV9RVUVVRV9SRVFVRVNULCAmb3V0bXNnKSkKKwlpZiAodmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpCiAJCXJldHVybjsKIH0KIApAQCAtOTIwLDIwICs2OTYsMjAgQEAKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICpwbXNnX2hkciA9IE5VTEw7CiAKLQlkb3duKCZub3RpZmllcl9sb2NrKTsKLQogCWlmICghYnVzX2luZm8pIHsKLQkJLyogcmVseWluZyBvbiBhIHZhbGlkIHBhc3NlZCBpbiByZXNwb25zZSBjb2RlICovCi0JCS8qIGJlIGxhenkgYW5kIHJlLXVzZSBtc2dfaGRyIGZvciB0aGlzIGZhaWx1cmUsIGlzIHRoaXMgb2s/PyAqLworCQkvKgorCQkgKiByZWx5aW5nIG9uIGEgdmFsaWQgcGFzc2VkIGluIHJlc3BvbnNlIGNvZGUKKwkJICogYmUgbGF6eSBhbmQgcmUtdXNlIG1zZ19oZHIgZm9yIHRoaXMgZmFpbHVyZSwgaXMgdGhpcyBvaz8/CisJCSAqLwogCQlwbXNnX2hkciA9IG1zZ19oZHI7Ci0JCWdvdG8gb3V0X3Jlc3BvbmRfYW5kX3VubG9jazsKKwkJZ290byBvdXRfcmVzcG9uZDsKIAl9CiAKIAlpZiAoYnVzX2luZm8tPnBlbmRpbmdfbXNnX2hkcikgewogCQkvKiBvbmx5IG5vbi1OVUxMIGlmIGRldiBpcyBzdGlsbCB3YWl0aW5nIG9uIGEgcmVzcG9uc2UgKi8KIAkJcmVzcG9uc2UgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9JTlZBTElEX0ZPUl9DTElFTlQ7CiAJCXBtc2dfaGRyID0gYnVzX2luZm8tPnBlbmRpbmdfbXNnX2hkcjsKLQkJZ290byBvdXRfcmVzcG9uZF9hbmRfdW5sb2NrOworCQlnb3RvIG91dF9yZXNwb25kOwogCX0KIAogCWlmIChuZWVkX3Jlc3BvbnNlKSB7CkBAIC05NDIsNyArNzE4LDcgQEAKIAkJCVBPU1RDT0RFX0xJTlVYXzQoTUFMTE9DX0ZBSUxVUkVfUEMsIGNtZCwKIAkJCQkJIGJ1c19pbmZvLT5jaGlwc2V0X2J1c19ubywKIAkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7Ci0JCQlnb3RvIG91dF91bmxvY2s7CisJCQlyZXR1cm47CiAJCX0KIAogCQltZW1jcHkocG1zZ19oZHIsIG1zZ19oZHIsCkBAIC05NTMsMjUgKzcyOSwxNiBAQAogCWlmIChyZXNwb25zZSA9PSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7CiAJCXN3aXRjaCAoY21kKSB7CiAJCWNhc2UgQ09OVFJPTFZNX0JVU19DUkVBVEU6Ci0JCQlpZiAoYnVzZGV2X25vdGlmaWVycy5idXNfY3JlYXRlKSB7Ci0JCQkJKCpidXNkZXZfbm90aWZpZXJzLmJ1c19jcmVhdGUpIChidXNfaW5mbyk7Ci0JCQkJZ290byBvdXRfdW5sb2NrOwotCQkJfQorCQkJY2hpcHNldF9idXNfY3JlYXRlKGJ1c19pbmZvKTsKIAkJCWJyZWFrOwogCQljYXNlIENPTlRST0xWTV9CVVNfREVTVFJPWToKLQkJCWlmIChidXNkZXZfbm90aWZpZXJzLmJ1c19kZXN0cm95KSB7Ci0JCQkJKCpidXNkZXZfbm90aWZpZXJzLmJ1c19kZXN0cm95KSAoYnVzX2luZm8pOwotCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJCX0KKwkJCWNoaXBzZXRfYnVzX2Rlc3Ryb3koYnVzX2luZm8pOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAKLW91dF9yZXNwb25kX2FuZF91bmxvY2s6CitvdXRfcmVzcG9uZDoKIAlidXNfcmVzcG9uZGVyKGNtZCwgcG1zZ19oZHIsIHJlc3BvbnNlKTsKLQotb3V0X3VubG9jazoKLQl1cCgmbm90aWZpZXJfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC05ODAsMzEgKzc0NywyOSBAQAogCSAgICAgIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSwKIAkgICAgICBib29sIG5lZWRfcmVzcG9uc2UsIGJvb2wgZm9yX3Zpc29yYnVzKQogewotCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X25vdGlmaWVycyAqbm90aWZpZXJzOwogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKnBtc2dfaGRyID0gTlVMTDsKIAotCW5vdGlmaWVycyA9ICZidXNkZXZfbm90aWZpZXJzOwotCi0JZG93bigmbm90aWZpZXJfbG9jayk7CiAJaWYgKCFkZXZfaW5mbykgewotCQkvKiByZWx5aW5nIG9uIGEgdmFsaWQgcGFzc2VkIGluIHJlc3BvbnNlIGNvZGUgKi8KLQkJLyogYmUgbGF6eSBhbmQgcmUtdXNlIG1zZ19oZHIgZm9yIHRoaXMgZmFpbHVyZSwgaXMgdGhpcyBvaz8/ICovCisJCS8qCisJCSAqIHJlbHlpbmcgb24gYSB2YWxpZCBwYXNzZWQgaW4gcmVzcG9uc2UgY29kZQorCQkgKiBiZSBsYXp5IGFuZCByZS11c2UgbXNnX2hkciBmb3IgdGhpcyBmYWlsdXJlLCBpcyB0aGlzIG9rPz8KKwkJICovCiAJCXBtc2dfaGRyID0gbXNnX2hkcjsKLQkJZ290byBvdXRfcmVzcG9uZF9hbmRfdW5sb2NrOworCQlnb3RvIG91dF9yZXNwb25kOwogCX0KIAogCWlmIChkZXZfaW5mby0+cGVuZGluZ19tc2dfaGRyKSB7CiAJCS8qIG9ubHkgbm9uLU5VTEwgaWYgZGV2IGlzIHN0aWxsIHdhaXRpbmcgb24gYSByZXNwb25zZSAqLwogCQlyZXNwb25zZSA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9NRVNTQUdFX0lEX0lOVkFMSURfRk9SX0NMSUVOVDsKIAkJcG1zZ19oZHIgPSBkZXZfaW5mby0+cGVuZGluZ19tc2dfaGRyOwotCQlnb3RvIG91dF9yZXNwb25kX2FuZF91bmxvY2s7CisJCWdvdG8gb3V0X3Jlc3BvbmQ7CiAJfQogCiAJaWYgKG5lZWRfcmVzcG9uc2UpIHsKIAkJcG1zZ19oZHIgPSBremFsbG9jKHNpemVvZigqcG1zZ19oZHIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFwbXNnX2hkcikgewogCQkJcmVzcG9uc2UgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQ7Ci0JCQlnb3RvIG91dF9yZXNwb25kX2FuZF91bmxvY2s7CisJCQlnb3RvIG91dF9yZXNwb25kOwogCQl9CiAKIAkJbWVtY3B5KHBtc2dfaGRyLCBtc2dfaGRyLApAQCAtMTAxNSw0OCArNzgwLDM0IEBACiAJaWYgKHJlc3BvbnNlID49IDApIHsKIAkJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NSRUFURToKLQkJCWlmIChub3RpZmllcnMtPmRldmljZV9jcmVhdGUpIHsKLQkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX2NyZWF0ZSkgKGRldl9pbmZvKTsKLQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCQl9CisJCQljaGlwc2V0X2RldmljZV9jcmVhdGUoZGV2X2luZm8pOwogCQkJYnJlYWs7CiAJCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURToKIAkJCS8qIFNlcnZlclJlYWR5IC8gU2VydmVyUnVubmluZyAvIFNlZ21lbnRTdGF0ZVJ1bm5pbmcgKi8KIAkJCWlmIChzdGF0ZS5hbGl2ZSA9PSBzZWdtZW50X3N0YXRlX3J1bm5pbmcuYWxpdmUgJiYKIAkJCSAgICBzdGF0ZS5vcGVyYXRpbmcgPT0KIAkJCQlzZWdtZW50X3N0YXRlX3J1bm5pbmcub3BlcmF0aW5nKSB7Ci0JCQkJaWYgKG5vdGlmaWVycy0+ZGV2aWNlX3Jlc3VtZSkgewotCQkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX3Jlc3VtZSkgKGRldl9pbmZvKTsKLQkJCQkJZ290byBvdXRfdW5sb2NrOwotCQkJCX0KKwkJCQljaGlwc2V0X2RldmljZV9yZXN1bWUoZGV2X2luZm8pOwogCQkJfQogCQkJLyogU2VydmVyTm90UmVhZHkgLyBTZXJ2ZXJMb3N0IC8gU2VnbWVudFN0YXRlU3RhbmRieSAqLwogCQkJZWxzZSBpZiAoc3RhdGUuYWxpdmUgPT0gc2VnbWVudF9zdGF0ZV9zdGFuZGJ5LmFsaXZlICYmCiAJCQkJIHN0YXRlLm9wZXJhdGluZyA9PQogCQkJCSBzZWdtZW50X3N0YXRlX3N0YW5kYnkub3BlcmF0aW5nKSB7Ci0JCQkJLyogdGVjaG5pY2FsbHkgdGhpcyBpcyBzdGFuZGJ5IGNhc2UKKwkJCQkvKgorCQkJCSAqIHRlY2huaWNhbGx5IHRoaXMgaXMgc3RhbmRieSBjYXNlCiAJCQkJICogd2hlcmUgc2VydmVyIGlzIGxvc3QKIAkJCQkgKi8KLQkJCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfcGF1c2UpIHsKLQkJCQkJKCpub3RpZmllcnMtPmRldmljZV9wYXVzZSkgKGRldl9pbmZvKTsKLQkJCQkJZ290byBvdXRfdW5sb2NrOwotCQkJCX0KKwkJCQljaGlwc2V0X2RldmljZV9wYXVzZShkZXZfaW5mbyk7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBDT05UUk9MVk1fREVWSUNFX0RFU1RST1k6Ci0JCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfZGVzdHJveSkgewotCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfZGVzdHJveSkgKGRldl9pbmZvKTsKLQkJCQlnb3RvIG91dF91bmxvY2s7Ci0JCQl9CisJCQljaGlwc2V0X2RldmljZV9kZXN0cm95KGRldl9pbmZvKTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi1vdXRfcmVzcG9uZF9hbmRfdW5sb2NrOgorb3V0X3Jlc3BvbmQ6CiAJZGV2aWNlX3Jlc3BvbmRlcihjbWQsIHBtc2dfaGRyLCByZXNwb25zZSk7Ci0KLW91dF91bmxvY2s6Ci0JdXAoJm5vdGlmaWVyX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTEwMywxMCArODU0LDggQEAKIAkJZ290byBvdXRfYnVzX2VwaWxvZzsKIAl9CiAJYnVzX2luZm8tPnZpc29yY2hhbm5lbCA9IHZpc29yY2hhbm5lbDsKLQlpZiAodXVpZF9sZV9jbXAoY21kLT5jcmVhdGVfYnVzLmJ1c19pbnN0X3V1aWQsIHNwYXJfc2lvdm1fdXVpZCkgPT0gMCkgewotCQlkdW1wX3ZoYmFfYnVzID0gYnVzX25vOworCWlmICh1dWlkX2xlX2NtcChjbWQtPmNyZWF0ZV9idXMuYnVzX2luc3RfdXVpZCwgc3Bhcl9zaW92bV91dWlkKSA9PSAwKQogCQlzYXZlX2NyYXNoX21lc3NhZ2UoaW5tc2csIENSQVNIX0JVUyk7Ci0JfQogCiAJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0VYSVRfUEMsIGJ1c19ubywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKQEAgLTEzMDMsMTEgKzEwNTIsMTkgQEAKIAkJCSAgICAgIGlubXNnLT5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQgPT0gMSwgMSk7CiB9CiAKLS8qIFdoZW4gcHJvdmlkZWQgd2l0aCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgY29udHJvbHZtIGNoYW5uZWwKKy8qKgorICogaW5pdGlhbGl6ZV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKCkgLSBpbml0IGNvbnRyb2x2bV9wYXlsb2FkX2luZm8gc3RydWN0CisgKiBAcGh5c19hZGRyOiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBjb250cm9sdm0gY2hhbm5lbAorICogQG9mZnNldDogICAgdGhlIG9mZnNldCB0byBwYXlsb2FkCisgKiBAYnl0ZXM6ICAgICB0aGUgc2l6ZSBvZiB0aGUgcGF5bG9hZCBpbiBieXRlcworICogQGluZm86ICAgICAgdGhlIHJldHVybmluZyB2YWxpZCBzdHJ1Y3QKKyAqCisgKiBXaGVuIHByb3ZpZGVkIHdpdGggdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2x2bSBjaGFubmVsCiAgKiAocGh5c19hZGRyKSwgdGhlIG9mZnNldCB0byB0aGUgcGF5bG9hZCBhcmVhIHdlIG5lZWQgdG8gbWFuYWdlCiAgKiAob2Zmc2V0KSwgYW5kIHRoZSBzaXplIG9mIHRoaXMgcGF5bG9hZCBhcmVhIChieXRlcyksIGZpbGxzIGluIHRoZQotICogY29udHJvbHZtX3BheWxvYWRfaW5mbyBzdHJ1Y3QuICBSZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3Mgb3IgZmFsc2UKLSAqIGZvciBmYWlsdXJlLgorICogY29udHJvbHZtX3BheWxvYWRfaW5mbyBzdHJ1Y3QuCisgKgorICogUmV0dXJuOiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZm9yIGZhaWx1cmUKICAqLwogc3RhdGljIGludAogaW5pdGlhbGl6ZV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKHU2NCBwaHlzX2FkZHIsIHU2NCBvZmZzZXQsIHUzMiBieXRlcywKQEAgLTEzNzEsOCArMTEyOCwzMTUgQEAKIAkJCQkJICAmY29udHJvbHZtX3BheWxvYWRfaW5mbyk7CiB9CiAKLS8qICBTZW5kIEFDVElPTj1vbmxpbmUgZm9yIERFVlBBVEg9L3N5cy9kZXZpY2VzL3BsYXRmb3JtL3Zpc29yY2hpcHNldC4KLSAqICBSZXR1cm5zIENPTlRST0xWTV9SRVNQX3h4eCBjb2RlLgorLyoKKyAqIFRoZSBnZW5lcmFsIHBhcmFob3RwbHVnIGZsb3cgd29ya3MgYXMgZm9sbG93cy4gVGhlIHZpc29yY2hpcHNldAorICogZHJpdmVyIHJlY2VpdmVzIGEgREVWSUNFX0NIQU5HRVNUQVRFIG1lc3NhZ2UgZnJvbSBDb21tYW5kCisgKiBzcGVjaWZ5aW5nIGEgcGh5c2ljYWwgZGV2aWNlIHRvIGVuYWJsZSBvciBkaXNhYmxlLiBUaGUgQ09OVFJPTFZNCisgKiBtZXNzYWdlIGhhbmRsZXIgY2FsbHMgcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlLCB3aGljaCB0aGVuIGFkZHMKKyAqIHRoZSBtZXNzYWdlIHRvIGEgZ2xvYmFsIGxpc3QgYW5kIGtpY2tzIG9mZiBhIHVkZXYgZXZlbnQgd2hpY2gKKyAqIGNhdXNlcyBhIHVzZXIgbGV2ZWwgc2NyaXB0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGVjaWZpZWQKKyAqIGRldmljZS4gVGhlIHVkZXYgc2NyaXB0IHRoZW4gd3JpdGVzIHRvCisgKiAvcHJvYy92aXNvcmNoaXBzZXQvcGFyYWhvdHBsdWcsIHdoaWNoIGNhdXNlcyBwYXJhaG90cGx1Z19wcm9jX3dyaXRlCisgKiB0byBnZXQgY2FsbGVkLCBhdCB3aGljaCBwb2ludCB0aGUgYXBwcm9wcmlhdGUgQ09OVFJPTFZNIG1lc3NhZ2UgaXMKKyAqIHJldHJpZXZlZCBmcm9tIHRoZSBsaXN0IGFuZCByZXNwb25kZWQgdG8uCisgKi8KKworI2RlZmluZSBQQVJBSE9UUExVR19USU1FT1VUX01TIDIwMDAKKworLyoqCisgKiBwYXJhaG90cGx1Z19uZXh0X2lkKCkgLSBnZW5lcmF0ZSB1bmlxdWUgaW50IHRvIG1hdGNoIGFuIG91dHN0YW5kaW5nIENPTlRST0xWTQorICogICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSB3aXRoIGEgdWRldiBzY3JpcHQgL3Byb2MgcmVzcG9uc2UKKyAqCisgKiBSZXR1cm46IGEgdW5pcXVlIGludGVnZXIgdmFsdWUKKyAqLworc3RhdGljIGludAorcGFyYWhvdHBsdWdfbmV4dF9pZCh2b2lkKQoreworCXN0YXRpYyBhdG9taWNfdCBpZCA9IEFUT01JQ19JTklUKDApOworCisJcmV0dXJuIGF0b21pY19pbmNfcmV0dXJuKCZpZCk7Cit9CisKKy8qKgorICogcGFyYWhvdHBsdWdfbmV4dF9leHBpcmF0aW9uKCkgLSByZXR1cm5zIHRoZSB0aW1lIChpbiBqaWZmaWVzKSB3aGVuIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVFJPTFZNIG1lc3NhZ2Ugb24gdGhlIGxpc3Qgc2hvdWxkIGV4cGlyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBQQVJBSE9UUExVR19USU1FT1VUX01TIGluIHRoZSBmdXR1cmUKKyAqCisgKiBSZXR1cm46IGV4cGVjdGVkIGV4cGlyYXRpb24gdGltZSAoaW4gamlmZmllcykKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3BhcmFob3RwbHVnX25leHRfZXhwaXJhdGlvbih2b2lkKQoreworCXJldHVybiBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhQQVJBSE9UUExVR19USU1FT1VUX01TKTsKK30KKworLyoqCisgKiBwYXJhaG90cGx1Z19yZXF1ZXN0X2NyZWF0ZSgpIC0gY3JlYXRlIGEgcGFyYWhvdHBsdWdfcmVxdWVzdCwgd2hpY2ggaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNpY2FsbHkgYSB3cmFwcGVyIGZvciBhIENPTlRST0xWTV9NRVNTQUdFCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3ZSBjYW4gc3RpY2sgb24gYSBsaXN0CisgKiBAbXNnOiB0aGUgbWVzc2FnZSB0byBpbnNlcnQgaW4gdGhlIHJlcXVlc3QKKyAqCisgKiBSZXR1cm46IHRoZSByZXF1ZXN0IGNvbnRhaW5pbmcgdGhlIHByb3ZpZGVkIG1lc3NhZ2UKKyAqLworc3RhdGljIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICoKK3BhcmFob3RwbHVnX3JlcXVlc3RfY3JlYXRlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXE7CisKKwlyZXEgPSBrbWFsbG9jKHNpemVvZigqcmVxKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOworCWlmICghcmVxKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcS0+aWQgPSBwYXJhaG90cGx1Z19uZXh0X2lkKCk7CisJcmVxLT5leHBpcmF0aW9uID0gcGFyYWhvdHBsdWdfbmV4dF9leHBpcmF0aW9uKCk7CisJcmVxLT5tc2cgPSAqbXNnOworCisJcmV0dXJuIHJlcTsKK30KKworLyoqCisgKiBwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3koKSAtIGZyZWUgYSBwYXJhaG90cGx1Z19yZXF1ZXN0CisgKiBAcmVxOiB0aGUgcmVxdWVzdCB0byBkZWFsbG9jYXRlCisgKi8KK3N0YXRpYyB2b2lkCitwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3koc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSkKK3sKKwlrZnJlZShyZXEpOworfQorCitzdGF0aWMgTElTVF9IRUFEKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsJLyogbG9jayBmb3IgYWJvdmUgKi8KKworLyoqCisgKiBwYXJhaG90cGx1Z19yZXF1ZXN0X2NvbXBsZXRlKCkgLSBtYXJrIHJlcXVlc3QgYXMgY29tcGxldGUKKyAqIEBpZDogICAgIHRoZSBpZCBvZiB0aGUgcmVxdWVzdAorICogQGFjdGl2ZTogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgYXNzaWduZWQgdG8gYWN0aXZlIHBhcnRpdGlvbgorICoKKyAqIENhbGxlZCBmcm9tIHRoZSAvcHJvYyBoYW5kbGVyLCB3aGljaCBtZWFucyB0aGUgdXNlciBzY3JpcHQgaGFzCisgKiBmaW5pc2hlZCB0aGUgZW5hYmxlL2Rpc2FibGUuIEZpbmQgdGhlIG1hdGNoaW5nIGlkZW50aWZpZXIsIGFuZAorICogcmVzcG9uZCB0byB0aGUgQ09OVFJPTFZNIG1lc3NhZ2Ugd2l0aCBzdWNjZXNzLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZmFpbHVyZQorICovCitzdGF0aWMgaW50CitwYXJhaG90cGx1Z19yZXF1ZXN0X2NvbXBsZXRlKGludCBpZCwgdTE2IGFjdGl2ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCisJc3Bpbl9sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisKKwkvKiBMb29rIGZvciBhIHJlcXVlc3QgbWF0Y2hpbmcgImlkIi4gKi8KKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0bXAsICZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpIHsKKwkJc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSA9CisJCSAgICBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QsIGxpc3QpOworCQlpZiAocmVxLT5pZCA9PSBpZCkgeworCQkJLyoKKwkJCSAqIEZvdW5kIGEgbWF0Y2guIFJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IGFuZAorCQkJICogcmVzcG9uZC4KKwkJCSAqLworCQkJbGlzdF9kZWwocG9zKTsKKwkJCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJCQlyZXEtPm1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZS5hY3RpdmUgPSBhY3RpdmU7CisJCQlpZiAocmVxLT5tc2cuaGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQorCQkJCWNvbnRyb2x2bV9yZXNwb25kX3BoeXNkZXZfY2hhbmdlc3RhdGUoCisJCQkJCSZyZXEtPm1zZy5oZHIsIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MsCisJCQkJCXJlcS0+bXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlKTsKKwkJCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlzcGluX3VubG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIGRldmljZWRpc2FibGVkX3N0b3JlKCkgLSBkaXNhYmxlcyB0aGUgaG90cGx1ZyBkZXZpY2UKKyAqIEBkZXY6ICAgc3lzZnMgaW50ZXJmYWNlIHZhcmlhYmxlIG5vdCB1dGlsaXplZCBpbiB0aGlzIGZ1bmN0aW9uCisgKiBAYXR0cjogIHN5c2ZzIGludGVyZmFjZSB2YXJpYWJsZSBub3QgdXRpbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorICogQGJ1ZjogICBidWZmZXIgY29udGFpbmluZyB0aGUgZGV2aWNlIGlkCisgKiBAY291bnQ6IHRoZSBzaXplIG9mIHRoZSBidWZmZXIKKyAqCisgKiBUaGUgcGFyYWhvdHBsdWcvZGV2aWNlZGlzYWJsZWQgaW50ZXJmYWNlIGdldHMgY2FsbGVkIGJ5IG91ciBzdXBwb3J0IHNjcmlwdAorICogd2hlbiBhbiBTUi1JT1YgZGV2aWNlIGhhcyBiZWVuIHNodXQgZG93bi4gVGhlIElEIGlzIHBhc3NlZCB0byB0aGUgc2NyaXB0CisgKiBhbmQgdGhlbiBwYXNzZWQgYmFjayB3aGVuIHRoZSBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZC4KKyAqCisgKiBSZXR1cm46IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgZm9yIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZm9yIGVycm9yCisgKi8KK3N0YXRpYyBzc2l6ZV90IGRldmljZWRpc2FibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGludCBpZDsKKwlpbnQgZXJyOworCisJaWYgKGtzdHJ0b3VpbnQoYnVmLCAxMCwgJmlkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBwYXJhaG90cGx1Z19yZXF1ZXN0X2NvbXBsZXRlKGlkLCAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfV08oZGV2aWNlZGlzYWJsZWQpOworCisvKioKKyAqIGRldmljZWVuYWJsZWRfc3RvcmUoKSAtIGVuYWJsZXMgdGhlIGhvdHBsdWcgZGV2aWNlCisgKiBAZGV2OiAgIHN5c2ZzIGludGVyZmFjZSB2YXJpYWJsZSBub3QgdXRpbGl6ZWQgaW4gdGhpcyBmdW5jdGlvbgorICogQGF0dHI6ICBzeXNmcyBpbnRlcmZhY2UgdmFyaWFibGUgbm90IHV0aWxpemVkIGluIHRoaXMgZnVuY3Rpb24KKyAqIEBidWY6ICAgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRldmljZSBpZAorICogQGNvdW50OiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgKgorICogVGhlIHBhcmFob3RwbHVnL2RldmljZWVuYWJsZWQgaW50ZXJmYWNlIGdldHMgY2FsbGVkIGJ5IG91ciBzdXBwb3J0IHNjcmlwdAorICogd2hlbiBhbiBTUi1JT1YgZGV2aWNlIGhhcyBiZWVuIHJlY292ZXJlZC4gVGhlIElEIGlzIHBhc3NlZCB0byB0aGUgc2NyaXB0CisgKiBhbmQgdGhlbiBwYXNzZWQgYmFjayB3aGVuIHRoZSBkZXZpY2UgaGFzIGJlZW4gYnJvdWdodCBiYWNrIHVwLgorICoKKyAqIFJldHVybjogdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBmb3Igc3VjY2VzcyBvciBuZWdhdGl2ZSBmb3IgZXJyb3IKKyAqLworc3RhdGljIHNzaXplX3QgZGV2aWNlZW5hYmxlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdW5zaWduZWQgaW50IGlkOworCisJaWYgKGtzdHJ0b3VpbnQoYnVmLCAxMCwgJmlkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwYXJhaG90cGx1Z19yZXF1ZXN0X2NvbXBsZXRlKGlkLCAxKTsKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfV08oZGV2aWNlZW5hYmxlZCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp2aXNvcmNoaXBzZXRfaW5zdGFsbF9hdHRyc1tdID0geworCSZkZXZfYXR0cl90b29sYWN0aW9uLmF0dHIsCisJJmRldl9hdHRyX2Jvb3R0b3Rvb2wuYXR0ciwKKwkmZGV2X2F0dHJfZXJyb3IuYXR0ciwKKwkmZGV2X2F0dHJfdGV4dGlkLmF0dHIsCisJJmRldl9hdHRyX3JlbWFpbmluZ19zdGVwcy5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZpc29yY2hpcHNldF9pbnN0YWxsX2dyb3VwID0geworCS5uYW1lID0gImluc3RhbGwiLAorCS5hdHRycyA9IHZpc29yY2hpcHNldF9pbnN0YWxsX2F0dHJzCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmlzb3JjaGlwc2V0X3BhcmFob3RwbHVnX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2RldmljZWRpc2FibGVkLmF0dHIsCisJJmRldl9hdHRyX2RldmljZWVuYWJsZWQuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB2aXNvcmNoaXBzZXRfcGFyYWhvdHBsdWdfZ3JvdXAgPSB7CisJLm5hbWUgPSAicGFyYWhvdHBsdWciLAorCS5hdHRycyA9IHZpc29yY2hpcHNldF9wYXJhaG90cGx1Z19hdHRycworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnZpc29yY2hpcHNldF9kZXZfZ3JvdXBzW10gPSB7CisJJnZpc29yY2hpcHNldF9pbnN0YWxsX2dyb3VwLAorCSZ2aXNvcmNoaXBzZXRfcGFyYWhvdHBsdWdfZ3JvdXAsCisJTlVMTAorfTsKKworc3RhdGljIHZvaWQgdmlzb3JjaGlwc2V0X2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKK30KKworLyogL3N5cy9kZXZpY2VzL3BsYXRmb3JtL3Zpc29yY2hpcHNldCAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugdmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZSA9IHsKKwkubmFtZSA9ICJ2aXNvcmNoaXBzZXQiLAorCS5pZCA9IC0xLAorCS5kZXYuZ3JvdXBzID0gdmlzb3JjaGlwc2V0X2Rldl9ncm91cHMsCisJLmRldi5yZWxlYXNlID0gdmlzb3JjaGlwc2V0X2Rldl9yZWxlYXNlLAorfTsKKworLyoqCisgKiBwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYoKSAtIGluaXRpYXRlIHBhcmFob3RwbHVnIHJlcXVlc3QKKyAqIEByZXE6IHRoZSByZXF1ZXN0IHRvIGluaXRpYXRlCisgKgorICogQ2F1c2UgdWV2ZW50IHRvIHJ1biB0aGUgdXNlciBsZXZlbCBzY3JpcHQgdG8gZG8gdGhlIGRpc2FibGUvZW5hYmxlIHNwZWNpZmllZAorICogaW4gdGhlIHBhcmFob3RwbHVnX3JlcXVlc3QuCisgKi8KK3N0YXRpYyB2b2lkCitwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYoc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfcGFja2V0ICpjbWQgPSAmcmVxLT5tc2cuY21kOworCWNoYXIgZW52X2NtZFs0MF0sIGVudl9pZFs0MF0sIGVudl9zdGF0ZVs0MF0sIGVudl9idXNbNDBdLCBlbnZfZGV2WzQwXSwKKwkgICAgZW52X2Z1bmNbNDBdOworCWNoYXIgKmVudnBbXSA9IHsKKwkJZW52X2NtZCwgZW52X2lkLCBlbnZfc3RhdGUsIGVudl9idXMsIGVudl9kZXYsIGVudl9mdW5jLCBOVUxMCisJfTsKKworCXNwcmludGYoZW52X2NtZCwgIlNQQVJfUEFSQUhPVFBMVUc9MSIpOworCXNwcmludGYoZW52X2lkLCAiU1BBUl9QQVJBSE9UUExVR19JRD0lZCIsIHJlcS0+aWQpOworCXNwcmludGYoZW52X3N0YXRlLCAiU1BBUl9QQVJBSE9UUExVR19TVEFURT0lZCIsCisJCWNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZS5hY3RpdmUpOworCXNwcmludGYoZW52X2J1cywgIlNQQVJfUEFSQUhPVFBMVUdfQlVTPSVkIiwKKwkJY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubyk7CisJc3ByaW50ZihlbnZfZGV2LCAiU1BBUl9QQVJBSE9UUExVR19ERVZJQ0U9JWQiLAorCQljbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID4+IDMpOworCXNwcmludGYoZW52X2Z1bmMsICJTUEFSX1BBUkFIT1RQTFVHX0ZVTkNUSU9OPSVkIiwKKwkJY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyAmIDB4Nyk7CisKKwlrb2JqZWN0X3VldmVudF9lbnYoJnZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmtvYmosIEtPQkpfQ0hBTkdFLAorCQkJICAgZW52cCk7Cit9CisKKy8qKgorICogcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKCkgLSBlbmFibGVzIG9yIGRpc2FibGVzIGEgUENJIGRldmljZSBieSBraWNraW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiBhIHVkZXYgc2NyaXB0CisgKiBAaW5tc2c6IHRoZSBtZXNzYWdlIGluZGljYXRpbmcgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZQorICovCitzdGF0aWMgdm9pZAorcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2cpCit7CisJc3RydWN0IHBhcmFob3RwbHVnX3JlcXVlc3QgKnJlcTsKKworCXJlcSA9IHBhcmFob3RwbHVnX3JlcXVlc3RfY3JlYXRlKGlubXNnKTsKKworCWlmICghcmVxKQorCQlyZXR1cm47CisKKwlpZiAoaW5tc2ctPmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlLmFjdGl2ZSkgeworCQkvKgorCQkgKiBGb3IgZW5hYmxlIG1lc3NhZ2VzLCBqdXN0IHJlc3BvbmQgd2l0aCBzdWNjZXNzCisJCSAqIHJpZ2h0IGF3YXkuIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLCBidXQgdGhlcmUgYXJlCisJCSAqIGlzc3VlcyB3aXRoIHRoZSBlYXJseSBlbmFibGUgbWVzc2FnZXMgd2UgZ2V0ICh3aXRoCisJCSAqIGVpdGhlciB0aGUgdWRldiBzY3JpcHQgbm90IGRldGVjdGluZyB0aGF0IHRoZSBkZXZpY2UKKwkJICogaXMgdXAsIG9yIG5vdCBnZXR0aW5nIGNhbGxlZCBhdCBhbGwpLiBGb3J0dW5hdGVseQorCQkgKiB0aGUgbWVzc2FnZXMgdGhhdCBnZXQgbG9zdCBkb24ndCBtYXR0ZXIgYW55d2F5LCBhcworCQkgKgorCQkgKiBkZXZpY2VzIGFyZSBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgYXQKKwkJICogaW5pdGlhbGl6YXRpb24uCisJCSovCisJCXBhcmFob3RwbHVnX3JlcXVlc3Rfa2lja29mZihyZXEpOworCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlCisJCQkoJmlubXNnLT5oZHIsCisJCQkgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUywKKwkJCSBpbm1zZy0+Y21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOworCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3IgZGlzYWJsZSBtZXNzYWdlcywgYWRkIHRoZSByZXF1ZXN0IHRvIHRoZQorCQkgKiByZXF1ZXN0IGxpc3QgYmVmb3JlIGtpY2tpbmcgb2ZmIHRoZSB1ZGV2IHNjcmlwdC4gSXQKKwkJICogd29uJ3QgZ2V0IHJlc3BvbmRlZCB0byB1bnRpbCB0aGUgc2NyaXB0IGhhcworCQkgKiBpbmRpY2F0ZWQgaXQncyBkb25lLgorCQkgKi8KKwkJc3Bpbl9sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisKKwkJcGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmKHJlcSk7CisJfQorfQorCisvKioKKyAqIHZpc29yY2hpcHNldF9jaGlwc2V0X3JlYWR5KCkgLSBzZW5kcyBjaGlwc2V0X3JlYWR5IGFjdGlvbgorICoKKyAqIFNlbmQgQUNUSU9OPW9ubGluZSBmb3IgREVWUEFUSD0vc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0LgorICoKKyAqIFJldHVybjogQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUwogICovCiBzdGF0aWMgaW50CiB2aXNvcmNoaXBzZXRfY2hpcHNldF9yZWFkeSh2b2lkKQpAQCAtMTM5Myw4ICsxNDU3LDEyIEBACiAJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CiB9CiAKLS8qICBTZW5kIEFDVElPTj1vZmZsaW5lIGZvciBERVZQQVRIPS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS92aXNvcmNoaXBzZXQuCi0gKiAgUmV0dXJucyBDT05UUk9MVk1fUkVTUF94eHggY29kZS4KKy8qKgorICogdmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkoKSAtIHNlbmRzIGNoaXBzZXRfbm90cmVhZHkgYWN0aW9uCisgKgorICogU2VuZCBBQ1RJT049b2ZmbGluZSBmb3IgREVWUEFUSD0vc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0LgorICoKKyAqIFJldHVybjogQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUwogICovCiBzdGF0aWMgaW50CiB2aXNvcmNoaXBzZXRfY2hpcHNldF9ub3RyZWFkeSh2b2lkKQpAQCAtMTQzNiwzMzggKzE1MDQsNiBAQAogCQljb250cm9sdm1fcmVzcG9uZChtc2dfaGRyLCByYyk7CiB9CiAKLS8qIFRoaXMgaXMgeW91ciAib25lLXN0b3AiIHNob3AgZm9yIGdyYWJiaW5nIHRoZSBuZXh0IG1lc3NhZ2UgZnJvbSB0aGUKLSAqIENPTlRST0xWTV9RVUVVRV9FVkVOVCBxdWV1ZSBpbiB0aGUgY29udHJvbHZtIGNoYW5uZWwuCi0gKi8KLXN0YXRpYyBib29sCi1yZWFkX2NvbnRyb2x2bV9ldmVudChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKm1zZykKLXsKLQlpZiAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShjb250cm9sdm1fY2hhbm5lbCwKLQkJCQkgICAgICBDT05UUk9MVk1fUVVFVUVfRVZFTlQsIG1zZykpIHsKLQkJLyogZ290IGEgbWVzc2FnZSAqLwotCQlpZiAobXNnLT5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qCi0gKiBUaGUgZ2VuZXJhbCBwYXJhaG90cGx1ZyBmbG93IHdvcmtzIGFzIGZvbGxvd3MuICBUaGUgdmlzb3JjaGlwc2V0Ci0gKiBkcml2ZXIgcmVjZWl2ZXMgYSBERVZJQ0VfQ0hBTkdFU1RBVEUgbWVzc2FnZSBmcm9tIENvbW1hbmQKLSAqIHNwZWNpZnlpbmcgYSBwaHlzaWNhbCBkZXZpY2UgdG8gZW5hYmxlIG9yIGRpc2FibGUuICBUaGUgQ09OVFJPTFZNCi0gKiBtZXNzYWdlIGhhbmRsZXIgY2FsbHMgcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlLCB3aGljaCB0aGVuIGFkZHMKLSAqIHRoZSBtZXNzYWdlIHRvIGEgZ2xvYmFsIGxpc3QgYW5kIGtpY2tzIG9mZiBhIHVkZXYgZXZlbnQgd2hpY2gKLSAqIGNhdXNlcyBhIHVzZXIgbGV2ZWwgc2NyaXB0IHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBzcGVjaWZpZWQKLSAqIGRldmljZS4gIFRoZSB1ZGV2IHNjcmlwdCB0aGVuIHdyaXRlcyB0bwotICogL3Byb2Mvdmlzb3JjaGlwc2V0L3BhcmFob3RwbHVnLCB3aGljaCBjYXVzZXMgcGFyYWhvdHBsdWdfcHJvY193cml0ZQotICogdG8gZ2V0IGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIGFwcHJvcHJpYXRlIENPTlRST0xWTSBtZXNzYWdlIGlzCi0gKiByZXRyaWV2ZWQgZnJvbSB0aGUgbGlzdCBhbmQgcmVzcG9uZGVkIHRvLgotICovCi0KLSNkZWZpbmUgUEFSQUhPVFBMVUdfVElNRU9VVF9NUyAyMDAwCi0KLS8qCi0gKiBHZW5lcmF0ZSB1bmlxdWUgaW50IHRvIG1hdGNoIGFuIG91dHN0YW5kaW5nIENPTlRST0xWTSBtZXNzYWdlIHdpdGggYQotICogdWRldiBzY3JpcHQgL3Byb2MgcmVzcG9uc2UKLSAqLwotc3RhdGljIGludAotcGFyYWhvdHBsdWdfbmV4dF9pZCh2b2lkKQotewotCXN0YXRpYyBhdG9taWNfdCBpZCA9IEFUT01JQ19JTklUKDApOwotCi0JcmV0dXJuIGF0b21pY19pbmNfcmV0dXJuKCZpZCk7Ci19Ci0KLS8qCi0gKiBSZXR1cm5zIHRoZSB0aW1lIChpbiBqaWZmaWVzKSB3aGVuIGEgQ09OVFJPTFZNIG1lc3NhZ2Ugb24gdGhlIGxpc3QKLSAqIHNob3VsZCBleHBpcmUgLS0gUEFSQUhPVFBMVUdfVElNRU9VVF9NUyBpbiB0aGUgZnV0dXJlCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi1wYXJhaG90cGx1Z19uZXh0X2V4cGlyYXRpb24odm9pZCkKLXsKLQlyZXR1cm4gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUEFSQUhPVFBMVUdfVElNRU9VVF9NUyk7Ci19Ci0KLS8qCi0gKiBDcmVhdGUgYSBwYXJhaG90cGx1Z19yZXF1ZXN0LCB3aGljaCBpcyBiYXNpY2FsbHkgYSB3cmFwcGVyIGZvciBhCi0gKiBDT05UUk9MVk1fTUVTU0FHRSB0aGF0IHdlIGNhbiBzdGljayBvbiBhIGxpc3QKLSAqLwotc3RhdGljIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICoKLXBhcmFob3RwbHVnX3JlcXVlc3RfY3JlYXRlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXE7Ci0KLQlyZXEgPSBrbWFsbG9jKHNpemVvZigqcmVxKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmICghcmVxKQotCQlyZXR1cm4gTlVMTDsKLQotCXJlcS0+aWQgPSBwYXJhaG90cGx1Z19uZXh0X2lkKCk7Ci0JcmVxLT5leHBpcmF0aW9uID0gcGFyYWhvdHBsdWdfbmV4dF9leHBpcmF0aW9uKCk7Ci0JcmVxLT5tc2cgPSAqbXNnOwotCi0JcmV0dXJuIHJlcTsKLX0KLQotLyoKLSAqIEZyZWUgYSBwYXJhaG90cGx1Z19yZXF1ZXN0LgotICovCi1zdGF0aWMgdm9pZAotcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEpCi17Ci0Ja2ZyZWUocmVxKTsKLX0KLQotLyoKLSAqIENhdXNlIHVldmVudCB0byBydW4gdGhlIHVzZXIgbGV2ZWwgc2NyaXB0IHRvIGRvIHRoZSBkaXNhYmxlL2VuYWJsZQotICogc3BlY2lmaWVkIGluICh0aGUgQ09OVFJPTFZNIG1lc3NhZ2UgaW4pIHRoZSBzcGVjaWZpZWQKLSAqIHBhcmFob3RwbHVnX3JlcXVlc3QKLSAqLwotc3RhdGljIHZvaWQKLXBhcmFob3RwbHVnX3JlcXVlc3Rfa2lja29mZihzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgKmNtZCA9ICZyZXEtPm1zZy5jbWQ7Ci0JY2hhciBlbnZfY21kWzQwXSwgZW52X2lkWzQwXSwgZW52X3N0YXRlWzQwXSwgZW52X2J1c1s0MF0sIGVudl9kZXZbNDBdLAotCSAgICBlbnZfZnVuY1s0MF07Ci0JY2hhciAqZW52cFtdID0gewotCQllbnZfY21kLCBlbnZfaWQsIGVudl9zdGF0ZSwgZW52X2J1cywgZW52X2RldiwgZW52X2Z1bmMsIE5VTEwKLQl9OwotCi0Jc3ByaW50ZihlbnZfY21kLCAiU1BBUl9QQVJBSE9UUExVRz0xIik7Ci0Jc3ByaW50ZihlbnZfaWQsICJTUEFSX1BBUkFIT1RQTFVHX0lEPSVkIiwgcmVxLT5pZCk7Ci0Jc3ByaW50ZihlbnZfc3RhdGUsICJTUEFSX1BBUkFIT1RQTFVHX1NUQVRFPSVkIiwKLQkJY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlLmFjdGl2ZSk7Ci0Jc3ByaW50ZihlbnZfYnVzLCAiU1BBUl9QQVJBSE9UUExVR19CVVM9JWQiLAotCQljbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuYnVzX25vKTsKLQlzcHJpbnRmKGVudl9kZXYsICJTUEFSX1BBUkFIT1RQTFVHX0RFVklDRT0lZCIsCi0JCWNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5kZXZfbm8gPj4gMyk7Ci0Jc3ByaW50ZihlbnZfZnVuYywgIlNQQVJfUEFSQUhPVFBMVUdfRlVOQ1RJT049JWQiLAotCQljbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vICYgMHg3KTsKLQotCWtvYmplY3RfdWV2ZW50X2Vudigmdmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9DSEFOR0UsCi0JCQkgICBlbnZwKTsKLX0KLQotLyoKLSAqIFJlbW92ZSBhbnkgcmVxdWVzdCBmcm9tIHRoZSBsaXN0IHRoYXQncyBiZWVuIG9uIHRoZXJlIHRvbyBsb25nIGFuZAotICogcmVzcG9uZCB3aXRoIGFuIGVycm9yLgotICovCi1zdGF0aWMgdm9pZAotcGFyYWhvdHBsdWdfcHJvY2Vzc19saXN0KHZvaWQpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKLQotCXNwaW5fbG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KSB7Ci0JCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQotCQkgICAgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0LCBsaXN0KTsKLQotCQlpZiAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcmVxLT5leHBpcmF0aW9uKSkKLQkJCWNvbnRpbnVlOwotCi0JCWxpc3RfZGVsKHBvcyk7Ci0JCWlmIChyZXEtPm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKAotCQkJCSZyZXEtPm1zZy5oZHIsCi0JCQkJQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCwKLQkJCQlyZXEtPm1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSk7Ci0JCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOwotCX0KLQotCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgZnJvbSB0aGUgL3Byb2MgaGFuZGxlciwgd2hpY2ggbWVhbnMgdGhlIHVzZXIgc2NyaXB0IGhhcwotICogZmluaXNoZWQgdGhlIGVuYWJsZS9kaXNhYmxlLiAgRmluZCB0aGUgbWF0Y2hpbmcgaWRlbnRpZmllciwgYW5kCi0gKiByZXNwb25kIHRvIHRoZSBDT05UUk9MVk0gbWVzc2FnZSB3aXRoIHN1Y2Nlc3MuCi0gKi8KLXN0YXRpYyBpbnQKLXBhcmFob3RwbHVnX3JlcXVlc3RfY29tcGxldGUoaW50IGlkLCB1MTYgYWN0aXZlKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7Ci0KLQlzcGluX2xvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKLQotCS8qIExvb2sgZm9yIGEgcmVxdWVzdCBtYXRjaGluZyAiaWQiLiAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCkgewotCQlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxID0KLQkJICAgIGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCwgbGlzdCk7Ci0JCWlmIChyZXEtPmlkID09IGlkKSB7Ci0JCQkvKiBGb3VuZCBhIG1hdGNoLiAgUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QgYW5kCi0JCQkgKiByZXNwb25kLgotCQkJICovCi0JCQlsaXN0X2RlbChwb3MpOwotCQkJc3Bpbl91bmxvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKLQkJCXJlcS0+bXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlLmFjdGl2ZSA9IGFjdGl2ZTsKLQkJCWlmIChyZXEtPm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCQkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKLQkJCQkJJnJlcS0+bXNnLmhkciwgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUywKLQkJCQkJcmVxLT5tc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOwotCQkJcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHJlcSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qCi0gKiBFbmFibGVzIG9yIGRpc2FibGVzIGEgUENJIGRldmljZSBieSBraWNraW5nIG9mZiBhIHVkZXYgc2NyaXB0Ci0gKi8KLXN0YXRpYyB2b2lkCi1wYXJhaG90cGx1Z19wcm9jZXNzX21lc3NhZ2Uoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlICppbm1zZykKLXsKLQlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxOwotCi0JcmVxID0gcGFyYWhvdHBsdWdfcmVxdWVzdF9jcmVhdGUoaW5tc2cpOwotCi0JaWYgKCFyZXEpCi0JCXJldHVybjsKLQotCWlmIChpbm1zZy0+Y21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUuYWN0aXZlKSB7Ci0JCS8qIEZvciBlbmFibGUgbWVzc2FnZXMsIGp1c3QgcmVzcG9uZCB3aXRoIHN1Y2Nlc3MKLQkJKiByaWdodCBhd2F5LiAgVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2ssIGJ1dCB0aGVyZSBhcmUKLQkJKiBpc3N1ZXMgd2l0aCB0aGUgZWFybHkgZW5hYmxlIG1lc3NhZ2VzIHdlIGdldCAod2l0aAotCQkqIGVpdGhlciB0aGUgdWRldiBzY3JpcHQgbm90IGRldGVjdGluZyB0aGF0IHRoZSBkZXZpY2UKLQkJKiBpcyB1cCwgb3Igbm90IGdldHRpbmcgY2FsbGVkIGF0IGFsbCkuICBGb3J0dW5hdGVseQotCQkqIHRoZSBtZXNzYWdlcyB0aGF0IGdldCBsb3N0IGRvbid0IG1hdHRlciBhbnl3YXksIGFzCi0JCSogZGV2aWNlcyBhcmUgYXV0b21hdGljYWxseSBlbmFibGVkIGF0Ci0JCSogaW5pdGlhbGl6YXRpb24uCi0JCSovCi0JCXBhcmFob3RwbHVnX3JlcXVlc3Rfa2lja29mZihyZXEpOwotCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlCi0JCQkoJmlubXNnLT5oZHIsCi0JCQkgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUywKLQkJCSBpbm1zZy0+Y21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOwotCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2Rlc3Ryb3kocmVxKTsKLQl9IGVsc2UgewotCQkvKiBGb3IgZGlzYWJsZSBtZXNzYWdlcywgYWRkIHRoZSByZXF1ZXN0IHRvIHRoZQotCQkqIHJlcXVlc3QgbGlzdCBiZWZvcmUga2lja2luZyBvZmYgdGhlIHVkZXYgc2NyaXB0LiAgSXQKLQkJKiB3b24ndCBnZXQgcmVzcG9uZGVkIHRvIHVudGlsIHRoZSBzY3JpcHQgaGFzCi0JCSogaW5kaWNhdGVkIGl0J3MgZG9uZS4KLQkJKi8KLQkJc3Bpbl9sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Ci0JCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Ci0KLQkJcGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmKHJlcSk7Ci0JfQotfQotCi0vKiBQcm9jZXNzIGEgY29udHJvbHZtIG1lc3NhZ2UuCi0gKiBSZXR1cm4gcmVzdWx0OgotICogICAgZmFsc2UgLSB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIG9ubHkgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlCi0gKiAgICAgICAgICAgIGNvbnRyb2x2bSBtZXNzYWdlIHdhcyBOT1QgcHJvY2Vzc2VkLCBidXQgcHJvY2Vzc2luZyBtdXN0IGJlCi0gKiAgICAgICAgICAgIHJldHJpZWQgYmVmb3JlIHJlYWRpbmcgdGhlIG5leHQgY29udHJvbHZtIG1lc3NhZ2U7IGEKLSAqICAgICAgICAgICAgc2NlbmFyaW8gd2hlcmUgdGhpcyBjYW4gb2NjdXIgaXMgd2hlbiB3ZSBuZWVkIHRvIHRocm90dGxlCi0gKiAgICAgICAgICAgIHRoZSBhbGxvY2F0aW9uIG9mIG1lbW9yeSBpbiB3aGljaCB0byBjb3B5IG91dCBjb250cm9sdm0KLSAqICAgICAgICAgICAgcGF5bG9hZCBkYXRhCi0gKiAgICB0cnVlICAtIHByb2Nlc3Npbmcgb2YgdGhlIGNvbnRyb2x2bSBtZXNzYWdlIGNvbXBsZXRlZCwKLSAqICAgICAgICAgICAgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLgotICovCi1zdGF0aWMgYm9vbAotaGFuZGxlX2NvbW1hbmQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGlubXNnLCB1NjQgY2hhbm5lbF9hZGRyKQotewotCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgKmNtZCA9ICZpbm1zZy5jbWQ7Ci0JdTY0IHBhcm1fYWRkcjsKLQl1MzIgcGFybV9ieXRlczsKLQlzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKnBhcnNlcl9jdHggPSBOVUxMOwotCWJvb2wgbG9jYWxfYWRkcjsKLQlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgYWNrbXNnOwotCi0JLyogY3JlYXRlIHBhcnNpbmcgY29udGV4dCBpZiBuZWNlc3NhcnkgKi8KLQlsb2NhbF9hZGRyID0gKGlubXNnLmhkci5mbGFncy50ZXN0X21lc3NhZ2UgPT0gMSk7Ci0JaWYgKGNoYW5uZWxfYWRkciA9PSAwKQotCQlyZXR1cm4gdHJ1ZTsKLQlwYXJtX2FkZHIgPSBjaGFubmVsX2FkZHIgKyBpbm1zZy5oZHIucGF5bG9hZF92bV9vZmZzZXQ7Ci0JcGFybV9ieXRlcyA9IGlubXNnLmhkci5wYXlsb2FkX2J5dGVzOwotCi0JLyogUGFyYW1ldGVyIGFuZCBjaGFubmVsIGFkZHJlc3NlcyB3aXRoaW4gdGVzdCBtZXNzYWdlcyBhY3R1YWxseSBsaWUKLQkgKiB3aXRoaW4gb3VyIE9TLWNvbnRyb2xsZWQgbWVtb3J5LiAgV2UgbmVlZCB0byBrbm93IHRoYXQsIGJlY2F1c2UgaXQKLQkgKiBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gaG93IHdlIGNvbXB1dGUgdGhlIHZpcnR1YWwgYWRkcmVzcy4KLQkgKi8KLQlpZiAocGFybV9hZGRyICYmIHBhcm1fYnl0ZXMpIHsKLQkJYm9vbCByZXRyeSA9IGZhbHNlOwotCi0JCXBhcnNlcl9jdHggPQotCQkgICAgcGFyc2VyX2luaXRfYnl0ZV9zdHJlYW0ocGFybV9hZGRyLCBwYXJtX2J5dGVzLAotCQkJCQkgICAgbG9jYWxfYWRkciwgJnJldHJ5KTsKLQkJaWYgKCFwYXJzZXJfY3R4ICYmIHJldHJ5KQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWlmICghbG9jYWxfYWRkcikgewotCQljb250cm9sdm1faW5pdF9yZXNwb25zZSgmYWNrbXNnLCAmaW5tc2cuaGRyLAotCQkJCQlDT05UUk9MVk1fUkVTUF9TVUNDRVNTKTsKLQkJaWYgKGNvbnRyb2x2bV9jaGFubmVsKQotCQkJdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKLQkJCQkJCSAgQ09OVFJPTFZNX1FVRVVFX0FDSywKLQkJCQkJCSAgJmFja21zZyk7Ci0JfQotCXN3aXRjaCAoaW5tc2cuaGRyLmlkKSB7Ci0JY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9JTklUOgotCQljaGlwc2V0X2luaXQoJmlubXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBDT05UUk9MVk1fQlVTX0NSRUFURToKLQkJYnVzX2NyZWF0ZSgmaW5tc2cpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9CVVNfREVTVFJPWToKLQkJYnVzX2Rlc3Ryb3koJmlubXNnKTsKLQkJYnJlYWs7Ci0JY2FzZSBDT05UUk9MVk1fQlVTX0NPTkZJR1VSRToKLQkJYnVzX2NvbmZpZ3VyZSgmaW5tc2csIHBhcnNlcl9jdHgpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFOgotCQlteV9kZXZpY2VfY3JlYXRlKCZpbm1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURToKLQkJaWYgKGNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5mbGFncy5waHlzX2RldmljZSkgewotCQkJcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKCZpbm1zZyk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBzYXZlIHRoZSBoZHIgYW5kIGNtZCBzdHJ1Y3R1cmVzIGZvciBsYXRlciB1c2UgKi8KLQkJCS8qIHdoZW4gc2VuZGluZyBiYWNrIHRoZSByZXNwb25zZSB0byBDb21tYW5kICovCi0JCQlteV9kZXZpY2VfY2hhbmdlc3RhdGUoJmlubXNnKTsKLQkJCWdfZGV2aWNlY2hhbmdlc3RhdGVfcGFja2V0ID0gaW5tc2cuY21kOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBDT05UUk9MVk1fREVWSUNFX0RFU1RST1k6Ci0JCW15X2RldmljZV9kZXN0cm95KCZpbm1zZyk7Ci0JCWJyZWFrOwotCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DT05GSUdVUkU6Ci0JCS8qIG5vIG9wIGZvciBub3csIGp1c3Qgc2VuZCBhIHJlc3BvbmQgdGhhdCB3ZSBwYXNzZWQgKi8KLQkJaWYgKGlubXNnLmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKLQkJCWNvbnRyb2x2bV9yZXNwb25kKCZpbm1zZy5oZHIsIENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9DSElQU0VUX1JFQURZOgotCQljaGlwc2V0X3JlYWR5KCZpbm1zZy5oZHIpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9DSElQU0VUX1NFTEZURVNUOgotCQljaGlwc2V0X3NlbGZ0ZXN0KCZpbm1zZy5oZHIpOwotCQlicmVhazsKLQljYXNlIENPTlRST0xWTV9DSElQU0VUX1NUT1A6Ci0JCWNoaXBzZXRfbm90cmVhZHkoJmlubXNnLmhkcik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWlmIChpbm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCQljb250cm9sdm1fcmVzcG9uZAotCQkJCSgmaW5tc2cuaGRyLAotCQkJCSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9VTktOT1dOKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHBhcnNlcl9jdHgpIHsKLQkJcGFyc2VyX2RvbmUocGFyc2VyX2N0eCk7Ci0JCXBhcnNlcl9jdHggPSBOVUxMOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKIGlzc3VlX3ZtY2FsbF9pb19jb250cm9sdm1fYWRkcih1NjQgKmNvbnRyb2xfYWRkciwgdTMyICpjb250cm9sX2J5dGVzKQogewpAQCAtMTc5Niw3NiArMTUzMiw2IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1jb250cm9sdm1fcGVyaW9kaWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGlubXNnOwotCWJvb2wgZ290X2NvbW1hbmQgPSBmYWxzZTsKLQlib29sIGhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IGZhbHNlOwotCi0JLyogbWFrZSBzdXJlIHZpc29yYnVzIHNlcnZlciBpcyByZWdpc3RlcmVkIGZvciBjb250cm9sdm0gY2FsbGJhY2tzICovCi0JaWYgKHZpc29yY2hpcHNldF92aXNvcmJ1c3JlZ3dhaXQgJiYgIXZpc29yYnVzcmVnaXN0ZXJlZCkKLQkJZ290byBjbGVhbnVwOwotCi0Jd2hpbGUgKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoY29udHJvbHZtX2NoYW5uZWwsCi0JCQkJCSBDT05UUk9MVk1fUVVFVUVfUkVTUE9OU0UsCi0JCQkJCSAmaW5tc2cpKQotCQk7Ci0JaWYgKCFnb3RfY29tbWFuZCkgewotCQlpZiAoY29udHJvbHZtX3BlbmRpbmdfbXNnX3ZhbGlkKSB7Ci0JCQkvKiB3ZSB0aHJvdHRsZWQgcHJvY2Vzc2luZyBvZiBhIHByaW9yCi0JCQkqIG1zZywgc28gdHJ5IHRvIHByb2Nlc3MgaXQgYWdhaW4KLQkJCSogcmF0aGVyIHRoYW4gcmVhZGluZyBhIG5ldyBvbmUKLQkJCSovCi0JCQlpbm1zZyA9IGNvbnRyb2x2bV9wZW5kaW5nX21zZzsKLQkJCWNvbnRyb2x2bV9wZW5kaW5nX21zZ192YWxpZCA9IGZhbHNlOwotCQkJZ290X2NvbW1hbmQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJZ290X2NvbW1hbmQgPSByZWFkX2NvbnRyb2x2bV9ldmVudCgmaW5tc2cpOwotCQl9Ci0JfQotCi0JaGFuZGxlX2NvbW1hbmRfZmFpbGVkID0gZmFsc2U7Ci0Jd2hpbGUgKGdvdF9jb21tYW5kICYmICghaGFuZGxlX2NvbW1hbmRfZmFpbGVkKSkgewotCQltb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXMgPSBqaWZmaWVzOwotCQlpZiAoaGFuZGxlX2NvbW1hbmQoaW5tc2csCi0JCQkJICAgdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcgotCQkJCSAgIChjb250cm9sdm1fY2hhbm5lbCkpKQotCQkJZ290X2NvbW1hbmQgPSByZWFkX2NvbnRyb2x2bV9ldmVudCgmaW5tc2cpOwotCQllbHNlIHsKLQkJCS8qIHRoaXMgaXMgYSBzY2VuYXJpbyB3aGVyZSB0aHJvdHRsaW5nCi0JCQkqIGlzIHJlcXVpcmVkLCBidXQgcHJvYmFibHkgTk9UIGFuCi0JCQkqIGVycm9yLi4uOyB3ZSBzdGFzaCB0aGUgY3VycmVudAotCQkJKiBjb250cm9sdm0gbXNnIHNvIHdlIHdpbGwgYXR0ZW1wdCB0bwotCQkJKiByZXByb2Nlc3MgaXQgb24gb3VyIG5leHQgbG9vcAotCQkJKi8KLQkJCWhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IHRydWU7Ci0JCQljb250cm9sdm1fcGVuZGluZ19tc2cgPSBpbm1zZzsKLQkJCWNvbnRyb2x2bV9wZW5kaW5nX21zZ192YWxpZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKiBwYXJhaG90cGx1Z193b3JrZXIgKi8KLQlwYXJhaG90cGx1Z19wcm9jZXNzX2xpc3QoKTsKLQotY2xlYW51cDoKLQotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCi0JCSAgICAgICBtb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXMgKyAoSFogKiBNSU5fSURMRV9TRUNPTkRTKSkpIHsKLQkJLyogaXQncyBiZWVuIGxvbmdlciB0aGFuIE1JTl9JRExFX1NFQ09ORFMgc2luY2Ugd2UKLQkJKiBwcm9jZXNzZWQgb3VyIGxhc3QgY29udHJvbHZtIG1lc3NhZ2U7IHNsb3cgZG93biB0aGUKLQkJKiBwb2xsaW5nCi0JCSovCi0JCWlmIChwb2xsX2ppZmZpZXMgIT0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XKQotCQkJcG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9TTE9XOwotCX0gZWxzZSB7Ci0JCWlmIChwb2xsX2ppZmZpZXMgIT0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUKQotCQkJcG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUOwotCX0KLQotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGVyaW9kaWNfY29udHJvbHZtX3dvcmssIHBvbGxfamlmZmllcyk7Ci19Ci0KLXN0YXRpYyB2b2lkCiBzZXR1cF9jcmFzaF9kZXZpY2VzX3dvcmtfcXVldWUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBsb2NhbF9jcmFzaF9idXNfbXNnOwpAQCAtMTg3NCwxMyArMTU0MCw2IEBACiAJdTMyIGxvY2FsX2NyYXNoX21zZ19vZmZzZXQ7CiAJdTE2IGxvY2FsX2NyYXNoX21zZ19jb3VudDsKIAotCS8qIG1ha2Ugc3VyZSB2aXNvcmJ1cyBpcyByZWdpc3RlcmVkIGZvciBjb250cm9sdm0gY2FsbGJhY2tzICovCi0JaWYgKHZpc29yY2hpcHNldF92aXNvcmJ1c3JlZ3dhaXQgJiYgIXZpc29yYnVzcmVnaXN0ZXJlZCkgewotCQlwb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1c7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcGVyaW9kaWNfY29udHJvbHZtX3dvcmssIHBvbGxfamlmZmllcyk7Ci0JCXJldHVybjsKLQl9Ci0KIAlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKIAkvKiBzZW5kIGluaXQgY2hpcHNldCBtc2cgKi8KQEAgLTE5NTgsNyArMTYxNyw3IEBACiAJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBidXNfY3JlYXRlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmJ1c19pbmZvLCBpbnQgcmVzcG9uc2UpCiB7CiAJaWYgKHJlc3BvbnNlID49IDApCkBAIC0xOTcxLDcgKzE2MzAsNyBAQAogCWJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHIgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZAordm9pZAogYnVzX2Rlc3Ryb3lfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqYnVzX2luZm8sIGludCByZXNwb25zZSkKIHsKIAlidXNfcmVzcG9uZGVyKENPTlRST0xWTV9CVVNfREVTVFJPWSwgYnVzX2luZm8tPnBlbmRpbmdfbXNnX2hkciwKQEAgLTE5ODEsNyArMTY0MCw3IEBACiAJYnVzX2luZm8tPnBlbmRpbmdfbXNnX2hkciA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvLCBpbnQgcmVzcG9uc2UpCiB7CiAJaWYgKHJlc3BvbnNlID49IDApCkBAIC0xOTk0LDcgKzE2NTMsNyBAQAogCWRldl9pbmZvLT5wZW5kaW5nX21zZ19oZHIgPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZAordm9pZAogZGV2aWNlX2Rlc3Ryb3lfcmVzcG9uc2Uoc3RydWN0IHZpc29yX2RldmljZSAqZGV2X2luZm8sIGludCByZXNwb25zZSkKIHsKIAlkZXZpY2VfcmVzcG9uZGVyKENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSwgZGV2X2luZm8tPnBlbmRpbmdfbXNnX2hkciwKQEAgLTIwMDQsOSArMTY2Myw5IEBACiAJZGV2X2luZm8tPnBlbmRpbmdfbXNnX2hkciA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkCi12aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvLAotCQkJCSAgIGludCByZXNwb25zZSkKK3ZvaWQKK2RldmljZV9wYXVzZV9yZXNwb25zZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXZfaW5mbywKKwkJICAgICAgaW50IHJlc3BvbnNlKQogewogCWRldmljZV9jaGFuZ2VzdGF0ZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwKIAkJCQkgICAgIGRldl9pbmZvLCByZXNwb25zZSwKQEAgLTIwMTYsNyArMTY3NSw3IEBACiAJZGV2X2luZm8tPnBlbmRpbmdfbXNnX2hkciA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkCit2b2lkCiBkZXZpY2VfcmVzdW1lX3Jlc3BvbnNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldl9pbmZvLCBpbnQgcmVzcG9uc2UpCiB7CiAJZGV2aWNlX2NoYW5nZXN0YXRlX3Jlc3BvbmRlcihDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFLApAQCAtMjAyNyw0MCArMTY4Niw2IEBACiAJZGV2X2luZm8tPnBlbmRpbmdfbXNnX2hkciA9IE5VTEw7CiB9CiAKLS8qIFRoZSBwYXJhaG90cGx1Zy9kZXZpY2VkaXNhYmxlZCBpbnRlcmZhY2UgZ2V0cyBjYWxsZWQgYnkgb3VyIHN1cHBvcnQgc2NyaXB0Ci0gKiB3aGVuIGFuIFNSLUlPViBkZXZpY2UgaGFzIGJlZW4gc2h1dCBkb3duLiBUaGUgSUQgaXMgcGFzc2VkIHRvIHRoZSBzY3JpcHQKLSAqIGFuZCB0aGVuIHBhc3NlZCBiYWNrIHdoZW4gdGhlIGRldmljZSBoYXMgYmVlbiByZW1vdmVkLgotICovCi1zdGF0aWMgc3NpemVfdCBkZXZpY2VkaXNhYmxlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0KLQlpZiAoa3N0cnRvdWludChidWYsIDEwLCAmaWQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcmFob3RwbHVnX3JlcXVlc3RfY29tcGxldGUoaWQsIDApOwotCXJldHVybiBjb3VudDsKLX0KLQotLyogVGhlIHBhcmFob3RwbHVnL2RldmljZWVuYWJsZWQgaW50ZXJmYWNlIGdldHMgY2FsbGVkIGJ5IG91ciBzdXBwb3J0IHNjcmlwdAotICogd2hlbiBhbiBTUi1JT1YgZGV2aWNlIGhhcyBiZWVuIHJlY292ZXJlZC4gVGhlIElEIGlzIHBhc3NlZCB0byB0aGUgc2NyaXB0Ci0gKiBhbmQgdGhlbiBwYXNzZWQgYmFjayB3aGVuIHRoZSBkZXZpY2UgaGFzIGJlZW4gYnJvdWdodCBiYWNrIHVwLgotICovCi1zdGF0aWMgc3NpemVfdCBkZXZpY2VlbmFibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0KLQlpZiAoa3N0cnRvdWludChidWYsIDEwLCAmaWQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXBhcmFob3RwbHVnX3JlcXVlc3RfY29tcGxldGUoaWQsIDEpOwotCXJldHVybiBjb3VudDsKLX0KLQogc3RhdGljIGludAogdmlzb3JjaGlwc2V0X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewpAQCAtMjE5MSw2ICsxODE2LDI5OCBAQAogCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtYWpvcl9kZXYsIDEpOwogfQogCitzdGF0aWMgc3RydWN0IHBhcnNlcl9jb250ZXh0ICoKK3BhcnNlcl9pbml0X2J5dGVfc3RyZWFtKHU2NCBhZGRyLCB1MzIgYnl0ZXMsIGJvb2wgbG9jYWwsIGJvb2wgKnJldHJ5KQoreworCWludCBhbGxvY2J5dGVzID0gc2l6ZW9mKHN0cnVjdCBwYXJzZXJfY29udGV4dCkgKyBieXRlczsKKwlzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eDsKKworCWlmIChyZXRyeSkKKwkJKnJldHJ5ID0gZmFsc2U7CisKKwkvKgorCSAqIGFsbG9jIGFuIDAgZXh0cmEgYnl0ZSB0byBlbnN1cmUgcGF5bG9hZCBpcworCSAqICdcMCctdGVybWluYXRlZAorCSAqLworCWFsbG9jYnl0ZXMrKzsKKwlpZiAoKGNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkICsgYnl0ZXMpCisJICAgID4gTUFYX0NPTlRST0xWTV9QQVlMT0FEX0JZVEVTKSB7CisJCWlmIChyZXRyeSkKKwkJCSpyZXRyeSA9IHRydWU7CisJCXJldHVybiBOVUxMOworCX0KKwljdHggPSBremFsbG9jKGFsbG9jYnl0ZXMsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAoIWN0eCkgeworCQlpZiAocmV0cnkpCisJCQkqcmV0cnkgPSB0cnVlOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljdHgtPmFsbG9jYnl0ZXMgPSBhbGxvY2J5dGVzOworCWN0eC0+cGFyYW1fYnl0ZXMgPSBieXRlczsKKwljdHgtPmN1cnIgPSBOVUxMOworCWN0eC0+Ynl0ZXNfcmVtYWluaW5nID0gMDsKKwljdHgtPmJ5dGVfc3RyZWFtID0gZmFsc2U7CisJaWYgKGxvY2FsKSB7CisJCXZvaWQgKnA7CisKKwkJaWYgKGFkZHIgPiB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkgLSAxKSkKKwkJCWdvdG8gZXJyX2ZpbmlzaF9jdHg7CisJCXAgPSBfX3ZhKCh1bnNpZ25lZCBsb25nKShhZGRyKSk7CisJCW1lbWNweShjdHgtPmRhdGEsIHAsIGJ5dGVzKTsKKwl9IGVsc2UgeworCQl2b2lkICptYXBwaW5nID0gbWVtcmVtYXAoYWRkciwgYnl0ZXMsIE1FTVJFTUFQX1dCKTsKKworCQlpZiAoIW1hcHBpbmcpCisJCQlnb3RvIGVycl9maW5pc2hfY3R4OworCQltZW1jcHkoY3R4LT5kYXRhLCBtYXBwaW5nLCBieXRlcyk7CisJCW1lbXVubWFwKG1hcHBpbmcpOworCX0KKworCWN0eC0+Ynl0ZV9zdHJlYW0gPSB0cnVlOworCWNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkICs9IGN0eC0+cGFyYW1fYnl0ZXM7CisKKwlyZXR1cm4gY3R4OworCitlcnJfZmluaXNoX2N0eDoKKwlwYXJzZXJfZG9uZShjdHgpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGhhbmRsZV9jb21tYW5kKCkgLSBwcm9jZXNzIGEgY29udHJvbHZtIG1lc3NhZ2UKKyAqIEBpbm1zZzogICAgICAgIHRoZSBtZXNzYWdlIHRvIHByb2Nlc3MKKyAqIEBjaGFubmVsX2FkZHI6IGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2x2bSBjaGFubmVsCisgKgorICogUmV0dXJuOgorICogICAgZmFsc2UgLSB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIG9ubHkgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlCisgKiAgICAgICAgICAgIGNvbnRyb2x2bSBtZXNzYWdlIHdhcyBOT1QgcHJvY2Vzc2VkLCBidXQgcHJvY2Vzc2luZyBtdXN0IGJlCisgKiAgICAgICAgICAgIHJldHJpZWQgYmVmb3JlIHJlYWRpbmcgdGhlIG5leHQgY29udHJvbHZtIG1lc3NhZ2U7IGEKKyAqICAgICAgICAgICAgc2NlbmFyaW8gd2hlcmUgdGhpcyBjYW4gb2NjdXIgaXMgd2hlbiB3ZSBuZWVkIHRvIHRocm90dGxlCisgKiAgICAgICAgICAgIHRoZSBhbGxvY2F0aW9uIG9mIG1lbW9yeSBpbiB3aGljaCB0byBjb3B5IG91dCBjb250cm9sdm0KKyAqICAgICAgICAgICAgcGF5bG9hZCBkYXRhCisgKiAgICB0cnVlICAtIHByb2Nlc3Npbmcgb2YgdGhlIGNvbnRyb2x2bSBtZXNzYWdlIGNvbXBsZXRlZCwKKyAqICAgICAgICAgICAgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yCisgKi8KK3N0YXRpYyBib29sCitoYW5kbGVfY29tbWFuZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgaW5tc2csIHU2NCBjaGFubmVsX2FkZHIpCit7CisJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCAqY21kID0gJmlubXNnLmNtZDsKKwl1NjQgcGFybV9hZGRyOworCXUzMiBwYXJtX2J5dGVzOworCXN0cnVjdCBwYXJzZXJfY29udGV4dCAqcGFyc2VyX2N0eCA9IE5VTEw7CisJYm9vbCBsb2NhbF9hZGRyOworCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBhY2ttc2c7CisKKwkvKiBjcmVhdGUgcGFyc2luZyBjb250ZXh0IGlmIG5lY2Vzc2FyeSAqLworCWxvY2FsX2FkZHIgPSAoaW5tc2cuaGRyLmZsYWdzLnRlc3RfbWVzc2FnZSA9PSAxKTsKKwlpZiAoY2hhbm5lbF9hZGRyID09IDApCisJCXJldHVybiB0cnVlOworCXBhcm1fYWRkciA9IGNoYW5uZWxfYWRkciArIGlubXNnLmhkci5wYXlsb2FkX3ZtX29mZnNldDsKKwlwYXJtX2J5dGVzID0gaW5tc2cuaGRyLnBheWxvYWRfYnl0ZXM7CisKKwkvKgorCSAqIFBhcmFtZXRlciBhbmQgY2hhbm5lbCBhZGRyZXNzZXMgd2l0aGluIHRlc3QgbWVzc2FnZXMgYWN0dWFsbHkgbGllCisJICogd2l0aGluIG91ciBPUy1jb250cm9sbGVkIG1lbW9yeS4gV2UgbmVlZCB0byBrbm93IHRoYXQsIGJlY2F1c2UgaXQKKwkgKiBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gaG93IHdlIGNvbXB1dGUgdGhlIHZpcnR1YWwgYWRkcmVzcy4KKwkgKi8KKwlpZiAocGFybV9hZGRyICYmIHBhcm1fYnl0ZXMpIHsKKwkJYm9vbCByZXRyeSA9IGZhbHNlOworCisJCXBhcnNlcl9jdHggPQorCQkgICAgcGFyc2VyX2luaXRfYnl0ZV9zdHJlYW0ocGFybV9hZGRyLCBwYXJtX2J5dGVzLAorCQkJCQkgICAgbG9jYWxfYWRkciwgJnJldHJ5KTsKKwkJaWYgKCFwYXJzZXJfY3R4ICYmIHJldHJ5KQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICghbG9jYWxfYWRkcikgeworCQljb250cm9sdm1faW5pdF9yZXNwb25zZSgmYWNrbXNnLCAmaW5tc2cuaGRyLAorCQkJCQlDT05UUk9MVk1fUkVTUF9TVUNDRVNTKTsKKwkJaWYgKGNvbnRyb2x2bV9jaGFubmVsKQorCQkJdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkJCSAgQ09OVFJPTFZNX1FVRVVFX0FDSywKKwkJCQkJCSAgJmFja21zZyk7CisJfQorCXN3aXRjaCAoaW5tc2cuaGRyLmlkKSB7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9JTklUOgorCQljaGlwc2V0X2luaXQoJmlubXNnKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQlVTX0NSRUFURToKKwkJYnVzX2NyZWF0ZSgmaW5tc2cpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9CVVNfREVTVFJPWToKKwkJYnVzX2Rlc3Ryb3koJmlubXNnKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQlVTX0NPTkZJR1VSRToKKwkJYnVzX2NvbmZpZ3VyZSgmaW5tc2csIHBhcnNlcl9jdHgpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFOgorCQlteV9kZXZpY2VfY3JlYXRlKCZpbm1zZyk7CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURToKKwkJaWYgKGNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5mbGFncy5waHlzX2RldmljZSkgeworCQkJcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKCZpbm1zZyk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogc2F2ZSB0aGUgaGRyIGFuZCBjbWQgc3RydWN0dXJlcyBmb3IgbGF0ZXIgdXNlCisJCQkgKiB3aGVuIHNlbmRpbmcgYmFjayB0aGUgcmVzcG9uc2UgdG8gQ29tbWFuZAorCQkJICovCisJCQlteV9kZXZpY2VfY2hhbmdlc3RhdGUoJmlubXNnKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZOgorCQlteV9kZXZpY2VfZGVzdHJveSgmaW5tc2cpOworCQlicmVhazsKKwljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ09ORklHVVJFOgorCQkvKiBubyBvcCBmb3Igbm93LCBqdXN0IHNlbmQgYSByZXNwb25kIHRoYXQgd2UgcGFzc2VkICovCisJCWlmIChpbm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCisJCQljb250cm9sdm1fcmVzcG9uZCgmaW5tc2cuaGRyLCBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9SRUFEWToKKwkJY2hpcHNldF9yZWFkeSgmaW5tc2cuaGRyKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9TRUxGVEVTVDoKKwkJY2hpcHNldF9zZWxmdGVzdCgmaW5tc2cuaGRyKTsKKwkJYnJlYWs7CisJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9TVE9QOgorCQljaGlwc2V0X25vdHJlYWR5KCZpbm1zZy5oZHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoaW5tc2cuaGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQorCQkJY29udHJvbHZtX3Jlc3BvbmQKKwkJCQkoJmlubXNnLmhkciwKKwkJCQkgLUNPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTik7CisJCWJyZWFrOworCX0KKworCWlmIChwYXJzZXJfY3R4KSB7CisJCXBhcnNlcl9kb25lKHBhcnNlcl9jdHgpOworCQlwYXJzZXJfY3R4ID0gTlVMTDsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogcmVhZF9jb250cm9sdm1fZXZlbnQoKSAtIHJldHJlaXZlcyB0aGUgbmV4dCBtZXNzYWdlIGZyb20gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVFJPTFZNX1FVRVVFX0VWRU5UIHF1ZXVlIGluIHRoZSBjb250cm9sdm0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsCisgKiBAbXNnOiBwb2ludGVyIHRvIHRoZSByZXRyaWV2ZWQgbWVzc2FnZQorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBhIHZhbGlkIG1lc3NhZ2Ugd2FzIHJldHJpZXZlZCBvciBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGJvb2wKK3JlYWRfY29udHJvbHZtX2V2ZW50KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnKQoreworCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX0VWRU5ULCBtc2cpKSB7CisJCS8qIGdvdCBhIG1lc3NhZ2UgKi8KKwkJaWYgKG1zZy0+aGRyLmZsYWdzLnRlc3RfbWVzc2FnZSA9PSAxKQorCQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIHBhcmFob3RwbHVnX3Byb2Nlc3NfbGlzdCgpIC0gcmVtb3ZlIGFueSByZXF1ZXN0IGZyb20gdGhlIGxpc3QgdGhhdCdzIGJlZW4gb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgdG9vIGxvbmcgYW5kIHJlc3BvbmQgd2l0aCBhbiBlcnJvcgorICovCitzdGF0aWMgdm9pZAorcGFyYWhvdHBsdWdfcHJvY2Vzc19saXN0KHZvaWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKworCXNwaW5fbG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KSB7CisJCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQorCQkgICAgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0LCBsaXN0KTsKKworCQlpZiAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcmVxLT5leHBpcmF0aW9uKSkKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZGVsKHBvcyk7CisJCWlmIChyZXEtPm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCisJCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKAorCQkJCSZyZXEtPm1zZy5oZHIsCisJCQkJQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCwKKwkJCQlyZXEtPm1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSk7CisJCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOworCX0KKworCXNwaW5fdW5sb2NrKCZwYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkCitjb250cm9sdm1fcGVyaW9kaWNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGlubXNnOworCWJvb2wgZ290X2NvbW1hbmQgPSBmYWxzZTsKKwlib29sIGhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IGZhbHNlOworCisJd2hpbGUgKCF2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGNvbnRyb2x2bV9jaGFubmVsLAorCQkJCQkgIENPTlRST0xWTV9RVUVVRV9SRVNQT05TRSwKKwkJCQkJICAmaW5tc2cpKQorCQk7CisJaWYgKCFnb3RfY29tbWFuZCkgeworCQlpZiAoY29udHJvbHZtX3BlbmRpbmdfbXNnX3ZhbGlkKSB7CisJCQkvKgorCQkJICogd2UgdGhyb3R0bGVkIHByb2Nlc3Npbmcgb2YgYSBwcmlvcgorCQkJICogbXNnLCBzbyB0cnkgdG8gcHJvY2VzcyBpdCBhZ2FpbgorCQkJICogcmF0aGVyIHRoYW4gcmVhZGluZyBhIG5ldyBvbmUKKwkJCSAqLworCQkJaW5tc2cgPSBjb250cm9sdm1fcGVuZGluZ19tc2c7CisJCQljb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQgPSBmYWxzZTsKKwkJCWdvdF9jb21tYW5kID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWdvdF9jb21tYW5kID0gcmVhZF9jb250cm9sdm1fZXZlbnQoJmlubXNnKTsKKwkJfQorCX0KKworCWhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IGZhbHNlOworCXdoaWxlIChnb3RfY29tbWFuZCAmJiAoIWhhbmRsZV9jb21tYW5kX2ZhaWxlZCkpIHsKKwkJbW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzID0gamlmZmllczsKKwkJaWYgKGhhbmRsZV9jb21tYW5kKGlubXNnLAorCQkJCSAgIHZpc29yY2hhbm5lbF9nZXRfcGh5c2FkZHIKKwkJCQkgICAoY29udHJvbHZtX2NoYW5uZWwpKSkKKwkJCWdvdF9jb21tYW5kID0gcmVhZF9jb250cm9sdm1fZXZlbnQoJmlubXNnKTsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogdGhpcyBpcyBhIHNjZW5hcmlvIHdoZXJlIHRocm90dGxpbmcKKwkJCSAqIGlzIHJlcXVpcmVkLCBidXQgcHJvYmFibHkgTk9UIGFuCisJCQkgKiBlcnJvci4uLjsgd2Ugc3Rhc2ggdGhlIGN1cnJlbnQKKwkJCSAqIGNvbnRyb2x2bSBtc2cgc28gd2Ugd2lsbCBhdHRlbXB0IHRvCisJCQkgKiByZXByb2Nlc3MgaXQgb24gb3VyIG5leHQgbG9vcAorCQkJICovCisJCQloYW5kbGVfY29tbWFuZF9mYWlsZWQgPSB0cnVlOworCQkJY29udHJvbHZtX3BlbmRpbmdfbXNnID0gaW5tc2c7CisJCQljb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQgPSB0cnVlOworCQl9CisJfQorCisJLyogcGFyYWhvdHBsdWdfd29ya2VyICovCisJcGFyYWhvdHBsdWdfcHJvY2Vzc19saXN0KCk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLAorCQkgICAgICAgbW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzICsgKEhaICogTUlOX0lETEVfU0VDT05EUykpKSB7CisJCS8qCisJCSAqIGl0J3MgYmVlbiBsb25nZXIgdGhhbiBNSU5fSURMRV9TRUNPTkRTIHNpbmNlIHdlCisJCSAqIHByb2Nlc3NlZCBvdXIgbGFzdCBjb250cm9sdm0gbWVzc2FnZTsgc2xvdyBkb3duIHRoZQorCQkgKiBwb2xsaW5nCisJCSAqLworCQlpZiAocG9sbF9qaWZmaWVzICE9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVykKKwkJCXBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVzsKKwl9IGVsc2UgeworCQlpZiAocG9sbF9qaWZmaWVzICE9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVCkKKwkJCXBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKKwl9CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBwb2xsX2ppZmZpZXMpOworfQorCiBzdGF0aWMgaW50CiB2aXNvcmNoaXBzZXRfaW5pdChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2aWNlKQogewpAQCAtMjIwMiw3ICsyMTE5LDYgQEAKIAlpZiAoIWFkZHIpCiAJCWdvdG8gZXJyb3I7CiAKLQltZW1zZXQoJmJ1c2Rldl9ub3RpZmllcnMsIDAsIHNpemVvZihidXNkZXZfbm90aWZpZXJzKSk7CiAJbWVtc2V0KCZjb250cm9sdm1fcGF5bG9hZF9pbmZvLCAwLCBzaXplb2YoY29udHJvbHZtX3BheWxvYWRfaW5mbykpOwogCiAJY29udHJvbHZtX2NoYW5uZWwgPSB2aXNvcmNoYW5uZWxfY3JlYXRlX3dpdGhfbG9jayhhZGRyLCAwLApAQCAtMjM0MSwxNSArMjI1NywxMCBAQAogbW9kdWxlX3BhcmFtX25hbWVkKG1ham9yLCB2aXNvcmNoaXBzZXRfbWFqb3IsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHZpc29yY2hpcHNldF9tYWpvciwKIAkJICJtYWpvciBkZXZpY2UgbnVtYmVyIHRvIHVzZSBmb3IgdGhlIGRldmljZSBub2RlIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQodmlzb3JidXNyZWd3YWl0LCB2aXNvcmNoaXBzZXRfdmlzb3JidXNyZWd3YWl0LCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyh2aXNvcmNoaXBzZXRfdmlzb3JidXNyZWd3YWl0LAotCQkgIjEgdG8gaGF2ZSB0aGUgbW9kdWxlIHdhaXQgZm9yIHRoZSB2aXNvciBidXMgdG8gcmVnaXN0ZXIiKTsKIAogbW9kdWxlX2luaXQoaW5pdF91bmlzeXMpOwogbW9kdWxlX2V4aXQoZXhpdF91bmlzeXMpOwogCiBNT0RVTEVfQVVUSE9SKCJVbmlzeXMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU3VwZXJ2aXNvciBjaGlwc2V0IGRyaXZlciBmb3Igc2VydmljZSBwYXJ0aXRpb246IHZlciAiCi0JCSAgIFZFUlNJT04pOwotTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CitNT0RVTEVfREVTQ1JJUFRJT04oInMtUGFyIHZpc29yYnVzIGRyaXZlciBmb3IgdmlydHVhbCBkZXZpY2UgYnVzZXMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdm1jYWxsaW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yYnVzL3ZtY2FsbGludGVyZmFjZS5oCmluZGV4IGMwNDNmYTQuLjg2ZTY5NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JidXMvdm1jYWxsaW50ZXJmYWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmJ1cy92bWNhbGxpbnRlcmZhY2UuaApAQCAtMjAsMTEgKzIwLDM5IEBACiAqIFZpcnR1YWxpemF0aW9uLiAgVGhlIFZNQ0FMTHMgYXJlIHByb3ZpZGVkIGJ5IE1vbml0b3IgYW5kIHVzZWQgYnkgSU8gY29kZQogKiBydW5uaW5nIG9uIElPIFBhcnRpdGlvbnMuCiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitfX3VuaXN5c192bWNhbGxfZ251Yyh1bnNpZ25lZCBsb25nIHR1cGxlLCB1bnNpZ25lZCBsb25nIHJlZ19lYngsCisJCSAgICAgdW5zaWduZWQgbG9uZyByZWdfZWN4KQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgY3B1aWRfZWF4LCBjcHVpZF9lYngsIGNwdWlkX2VjeCwgY3B1aWRfZWR4OwogCi0jaWZkZWYgX19HTlVDX18KLSNpbmNsdWRlICJpb3ZtY2FsbF9nbnVjLmgiCi0jZW5kaWYJLyogICovCi0jaW5jbHVkZSAiZGlhZ2NoYW5uZWwuaCIKKwljcHVpZCgweDAwMDAwMDAxLCAmY3B1aWRfZWF4LCAmY3B1aWRfZWJ4LCAmY3B1aWRfZWN4LCAmY3B1aWRfZWR4KTsKKwlpZiAoIShjcHVpZF9lY3ggJiAweDgwMDAwMDAwKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fKCIuYnl0ZSAweDAwZiwgMHgwMDEsIDB4MGMxIiA6ICI9YSIocmVzdWx0KSA6CisJCSJhIih0dXBsZSksICJiIihyZWdfZWJ4KSwgImMiKHJlZ19lY3gpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK19fdW5pc3lzX2V4dGVuZGVkX3ZtY2FsbF9nbnVjKHVuc2lnbmVkIGxvbmcgbG9uZyB0dXBsZSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyByZWdfZWJ4LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHJlZ19lY3gsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmVnX2VkeCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisJdW5zaWduZWQgaW50IGNwdWlkX2VheCwgY3B1aWRfZWJ4LCBjcHVpZF9lY3gsIGNwdWlkX2VkeDsKKworCWNwdWlkKDB4MDAwMDAwMDEsICZjcHVpZF9lYXgsICZjcHVpZF9lYngsICZjcHVpZF9lY3gsICZjcHVpZF9lZHgpOworCWlmICghKGNwdWlkX2VjeCAmIDB4ODAwMDAwMDApKQorCQlyZXR1cm4gLUVQRVJNOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oIi5ieXRlIDB4MDBmLCAweDAwMSwgMHgwYzEiIDogIj1hIihyZXN1bHQpIDoKKwkJImEiKHR1cGxlKSwgImIiKHJlZ19lYngpLCAiYyIocmVnX2VjeCksICJkIihyZWdfZWR4KSk7CisJcmV0dXJuIHJlc3VsdDsKK30KIAogI2lmZGVmIFZNQ0FMTF9JT19DT05UUk9MVk1fQUREUgogI3VuZGVmIFZNQ0FMTF9JT19DT05UUk9MVk1fQUREUgpAQCAtNTcsNyArODUsNiBAQAogI2RlZmluZSBWTUNBTExfU1VDQ0VTUyAwCiAjZGVmaW5lIFZNQ0FMTF9TVUNDRVNTRlVMKHJlc3VsdCkJKHJlc3VsdCA9PSAwKQogCi0jaWZkZWYgX19HTlVDX18KICNkZWZpbmUgdW5pc3lzX3ZtY2FsbCh0dXBsZSwgcmVnX2VieCwgcmVnX2VjeCkgXAogCV9fdW5pc3lzX3ZtY2FsbF9nbnVjKHR1cGxlLCByZWdfZWJ4LCByZWdfZWN4KQogI2RlZmluZSB1bmlzeXNfZXh0ZW5kZWRfdm1jYWxsKHR1cGxlLCByZWdfZWJ4LCByZWdfZWN4LCByZWdfZWR4KSBcCkBAIC03NCw3ICsxMDEsNiBAQAogI2RlZmluZSBJU1NVRV9JT19WTUNBTExfUE9TVENPREVfU0VWRVJJVFkocG9zdGNvZGUsIHNldmVyaXR5KQkJXAogCUlTU1VFX0lPX0VYVEVOREVEX1ZNQ0FMTChWTUNBTExfUE9TVF9DT0RFX0xPR0VWRU5ULCBzZXZlcml0eSwJXAogCQkJCSBNRFNfQVBQT1MsIHBvc3Rjb2RlKQotI2VuZGlmCiAKIC8qIFN0cnVjdHVyZXMgZm9yIElPIFZNQ0FMTHMgKi8KIApAQCAtODksNCArMTE1LDE1NiBAQAogCXU4IHVudXNlZFs0XTsJCS8qIFVudXNlZCBCeXRlcyBpbiB0aGUgNjQtQml0IEFsaWduZWQgU3RydWN0ICovCiB9IF9fcGFja2VkOwogCisvKioqKioqKiBJTkZPIE9OIElTU1VFX1BPU1RDT0RFX0xJTlVYKCkgQkVMT1cgKioqKioqKi8KK2VudW0gZHJpdmVyX3BjIHsJCS8qIFBPU1RDT0RFIGRyaXZlciBpZGVudGlmaWVyIHR1cGxlcyAqLworCS8qIHZpc29yY2hpcHNldCBkcml2ZXIgZmlsZXMgKi8KKwlWSVNPUl9DSElQU0VUX1BDID0gMHhBMCwKKwlWSVNPUl9DSElQU0VUX1BDX2NvbnRyb2x2bV9jID0gMHhBMSwKKwlWSVNPUl9DSElQU0VUX1BDX2NvbnRyb2x2bV9jbTIgPSAweEEyLAorCVZJU09SX0NISVBTRVRfUENfY29udHJvbHZtX2RpcmVjdF9jID0gMHhBMywKKwlWSVNPUl9DSElQU0VUX1BDX2ZpbGVfYyA9IDB4QTQsCisJVklTT1JfQ0hJUFNFVF9QQ19wYXJzZXJfYyA9IDB4QTUsCisJVklTT1JfQ0hJUFNFVF9QQ190ZXN0aW5nX2MgPSAweEE2LAorCVZJU09SX0NISVBTRVRfUENfdmlzb3JjaGlwc2V0X21haW5fYyA9IDB4QTcsCisJVklTT1JfQ0hJUFNFVF9QQ192aXNvcnN3aXRjaGJ1c19jID0gMHhBOCwKKwkvKiB2aXNvcmJ1cyBkcml2ZXIgZmlsZXMgKi8KKwlWSVNPUl9CVVNfUEMgPSAweEIwLAorCVZJU09SX0JVU19QQ19idXNpbnN0X2F0dHJfYyA9IDB4QjEsCisJVklTT1JfQlVTX1BDX2NoYW5uZWxfYXR0cl9jID0gMHhCMiwKKwlWSVNPUl9CVVNfUENfZGV2bWFqb3JtaW5vcl9hdHRyX2MgPSAweEIzLAorCVZJU09SX0JVU19QQ192aXNvcmJ1c19tYWluX2MgPSAweEI0LAorCS8qIHZpc29yY2xpZW50YnVzIGRyaXZlciBmaWxlcyAqLworCVZJU09SX0NMSUVOVF9CVVNfUEMgPSAweEMwLAorCVZJU09SX0NMSUVOVF9CVVNfUENfdmlzb3JjbGllbnRidXNfbWFpbl9jID0gMHhDMSwKKwkvKiB2aXJ0IGhiYSBkcml2ZXIgZmlsZXMgKi8KKwlWSVJUX0hCQV9QQyA9IDB4QzIsCisJVklSVF9IQkFfUENfdmlydGhiYV9jID0gMHhDMywKKwkvKiB2aXJ0cGNpIGRyaXZlciBmaWxlcyAqLworCVZJUlRfUENJX1BDID0gMHhDNCwKKwlWSVJUX1BDSV9QQ192aXJ0cGNpX2MgPSAweEM1LAorCS8qIHZpcnRuaWMgZHJpdmVyIGZpbGVzICovCisJVklSVF9OSUNfUEMgPSAweEM2LAorCVZJUlRfTklDX1BfdmlydG5pY19jID0gMHhDNywKKwkvKiB1aXNsaWIgZHJpdmVyIGZpbGVzICovCisJVUlTTElCX1BDID0gMHhEMCwKKwlVSVNMSUJfUENfdWlzbGliX2MgPSAweEQxLAorCVVJU0xJQl9QQ191aXNxdWV1ZV9jID0gMHhEMiwKKwkvKiAweEQzIFJFU0VSVkVEICovCisJVUlTTElCX1BDX3Vpc3V0aWxzX2MgPSAweEQ0LAorfTsKKworZW51bSBldmVudF9wYyB7CQkJLyogUE9TVENPREUgZXZlbnQgaWRlbnRpZmllciB0dXBsZXMgKi8KKwlBVFRBQ0hfUE9SVF9FTlRSWV9QQyA9IDB4MDAxLAorCUFUVEFDSF9QT1JUX0ZBSUxVUkVfUEMgPSAweDAwMiwKKwlBVFRBQ0hfUE9SVF9TVUNDRVNTX1BDID0gMHgwMDMsCisJQlVTX0ZBSUxVUkVfUEMgPSAweDAwNCwKKwlCVVNfQ1JFQVRFX0VOVFJZX1BDID0gMHgwMDUsCisJQlVTX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwMDYsCisJQlVTX0NSRUFURV9FWElUX1BDID0gMHgwMDcsCisJQlVTX0NPTkZJR1VSRV9FTlRSWV9QQyA9IDB4MDA4LAorCUJVU19DT05GSUdVUkVfRkFJTFVSRV9QQyA9IDB4MDA5LAorCUJVU19DT05GSUdVUkVfRVhJVF9QQyA9IDB4MDBBLAorCUNISVBTRVRfSU5JVF9FTlRSWV9QQyA9IDB4MDBCLAorCUNISVBTRVRfSU5JVF9TVUNDRVNTX1BDID0gMHgwMEMsCisJQ0hJUFNFVF9JTklUX0ZBSUxVUkVfUEMgPSAweDAwRCwKKwlDSElQU0VUX0lOSVRfRVhJVF9QQyA9IDB4MDBFLAorCUNSRUFURV9XT1JLUVVFVUVfUEMgPSAweDAwRiwKKwlDUkVBVEVfV09SS1FVRVVFX0ZBSUxFRF9QQyA9IDB4MEEwLAorCUNPTlRST0xWTV9JTklUX0ZBSUxVUkVfUEMgPSAweDBBMSwKKwlERVZJQ0VfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQTIsCisJREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQTMsCisJREVWSUNFX0NSRUFURV9TVUNDRVNTX1BDID0gMHgwQTQsCisJREVWSUNFX0NSRUFURV9FWElUX1BDID0gMHgwQTUsCisJREVWSUNFX0FERF9QQyA9IDB4MEE2LAorCURFVklDRV9SRUdJU1RFUl9GQUlMVVJFX1BDID0gMHgwQTcsCisJREVWSUNFX0NIQU5HRVNUQVRFX0VOVFJZX1BDID0gMHgwQTgsCisJREVWSUNFX0NIQU5HRVNUQVRFX0ZBSUxVUkVfUEMgPSAweDBBOSwKKwlERVZJQ0VfQ0hBTkdFU1RBVEVfRVhJVF9QQyA9IDB4MEFBLAorCURSSVZFUl9FTlRSWV9QQyA9IDB4MEFCLAorCURSSVZFUl9FWElUX1BDID0gMHgwQUMsCisJTUFMTE9DX0ZBSUxVUkVfUEMgPSAweDBBRCwKKwlRVUVVRV9ERUxBWUVEX1dPUktfUEMgPSAweDBBRSwKKwkvKiAweDBCNyBSRVNFUlZFRCAqLworCVZCVVNfQ0hBTk5FTF9FTlRSWV9QQyA9IDB4MEI4LAorCVZCVVNfQ0hBTk5FTF9GQUlMVVJFX1BDID0gMHgwQjksCisJVkJVU19DSEFOTkVMX0VYSVRfUEMgPSAweDBCQSwKKwlWSEJBX0NSRUFURV9FTlRSWV9QQyA9IDB4MEJCLAorCVZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMgPSAweDBCQywKKwlWSEJBX0NSRUFURV9FWElUX1BDID0gMHgwQkQsCisJVkhCQV9DUkVBVEVfU1VDQ0VTU19QQyA9IDB4MEJFLAorCVZIQkFfQ09NTUFORF9IQU5ETEVSX1BDID0gMHgwQkYsCisJVkhCQV9QUk9CRV9FTlRSWV9QQyA9IDB4MEMwLAorCVZIQkFfUFJPQkVfRkFJTFVSRV9QQyA9IDB4MEMxLAorCVZIQkFfUFJPQkVfRVhJVF9QQyA9IDB4MEMyLAorCVZOSUNfQ1JFQVRFX0VOVFJZX1BDID0gMHgwQzMsCisJVk5JQ19DUkVBVEVfRkFJTFVSRV9QQyA9IDB4MEM0LAorCVZOSUNfQ1JFQVRFX1NVQ0NFU1NfUEMgPSAweDBDNSwKKwlWTklDX1BST0JFX0VOVFJZX1BDID0gMHgwQzYsCisJVk5JQ19QUk9CRV9GQUlMVVJFX1BDID0gMHgwQzcsCisJVk5JQ19QUk9CRV9FWElUX1BDID0gMHgwQzgsCisJVlBDSV9DUkVBVEVfRU5UUllfUEMgPSAweDBDOSwKKwlWUENJX0NSRUFURV9GQUlMVVJFX1BDID0gMHgwQ0EsCisJVlBDSV9DUkVBVEVfRVhJVF9QQyA9IDB4MENCLAorCVZQQ0lfUFJPQkVfRU5UUllfUEMgPSAweDBDQywKKwlWUENJX1BST0JFX0ZBSUxVUkVfUEMgPSAweDBDRCwKKwlWUENJX1BST0JFX0VYSVRfUEMgPSAweDBDRSwKKwlDUkFTSF9ERVZfRU5UUllfUEMgPSAweDBDRiwKKwlDUkFTSF9ERVZfRVhJVF9QQyA9IDB4MEQwLAorCUNSQVNIX0RFVl9IQUREUl9OVUxMID0gMHgwRDEsCisJQ1JBU0hfREVWX0NPTlRST0xWTV9OVUxMID0gMHgwRDIsCisJQ1JBU0hfREVWX1JEX0JVU19GQUlVTFJFX1BDID0gMHgwRDMsCisJQ1JBU0hfREVWX1JEX0RFVl9GQUlVTFJFX1BDID0gMHgwRDQsCisJQ1JBU0hfREVWX0JVU19OVUxMX0ZBSUxVUkVfUEMgPSAweDBENSwKKwlDUkFTSF9ERVZfREVWX05VTExfRkFJTFVSRV9QQyA9IDB4MEQ2LAorCUNSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMgPSAweDBENywKKwlDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQyA9IDB4MEQ4LAorCVNBVkVfTVNHX0JVU19GQUlMVVJFX1BDID0gMHgwRDksCisJU0FWRV9NU0dfREVWX0ZBSUxVUkVfUEMgPSAweDBEQSwKKwlDQUxMSE9NRV9JTklUX0ZBSUxVUkVfUEMgPSAweDBEQgorfTsKKworI2RlZmluZSBQT1NUQ09ERV9TRVZFUklUWV9FUlIgRElBR19TRVZFUklUWV9FUlIKKyNkZWZpbmUgUE9TVENPREVfU0VWRVJJVFlfV0FSTklORyBESUFHX1NFVkVSSVRZX1dBUk5JTkcKKy8qIFRPRE8tPiBJbmZvIGN1cnJlbnRseSBkb2Vzbid0IHNob3csIHNvIHdlIHNldCBpbmZvPXdhcm5pbmcgKi8KKyNkZWZpbmUgUE9TVENPREVfU0VWRVJJVFlfSU5GTyBESUFHX1NFVkVSSVRZX1BSSU5UCisKKy8qIGV4YW1wbGUgY2FsbCBvZiBQT1NUQ09ERV9MSU5VWF8yKFZJU09SX0NISVBTRVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CisgKiBQbGVhc2UgYWxzbyBub3RlIHRoYXQgdGhlIHJlc3VsdGluZyBwb3N0Y29kZSBpcyBpbiBoZXgsIHNvIGlmIHlvdSBhcmUKKyAqIHNlYXJjaGluZyBmb3IgdGhlIF9fTElORV9fIG51bWJlciwgY29udmVydCBpdCBmaXJzdCB0byBkZWNpbWFsLiAgVGhlIGxpbmUKKyAqIG51bWJlciBjb21iaW5lZCB3aXRoIGRyaXZlciBhbmQgdHlwZSBvZiBjYWxsLCB3aWxsIGFsbG93IHlvdSB0byB0cmFjayBkb3duCisgKiBleGFjdGx5IHdoYXQgbGluZSBhbiBlcnJvciBvY2N1cnJlZCBvbiwgb3Igd2hlcmUgdGhlIGxhc3QgZHJpdmVyCisgKiBlbnRlcmVkL2V4aXRlZCBmcm9tLgorICovCisKKy8qIEJBU0UgRlVOQ1RJT05TICovCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYX0EoRFJJVkVSX1BDLCBFVkVOVF9QQywgcGMzMmJpdCwgc2V2ZXJpdHkpCVwKK2RvIHsJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBsb25nIHBvc3RfY29kZV90ZW1wOwkJCQlcCisJcG9zdF9jb2RlX3RlbXAgPSAoKCh1NjQpRFJJVkVSX1BDKSA8PCA1NikgfCAoKCh1NjQpRVZFTlRfUEMpIDw8IDQ0KSB8IFwKKwkJKCgoKHU2NClfX0xJTkVfXykgJiAweEZGRikgPDwgMzIpIHwJCQlcCisJCSgoKHU2NClwYzMyYml0KSAmIDB4RkZGRkZGRkYpOwkJCQlcCisJSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZKHBvc3RfY29kZV90ZW1wLCBzZXZlcml0eSk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUE9TVENPREVfTElOVVhfQihEUklWRVJfUEMsIEVWRU5UX1BDLCBwYzE2Yml0MSwgcGMxNmJpdDIsIHNldmVyaXR5KSBcCitkbyB7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgbG9uZyBwb3N0X2NvZGVfdGVtcDsJCQkJXAorCXBvc3RfY29kZV90ZW1wID0gKCgodTY0KURSSVZFUl9QQykgPDwgNTYpIHwgKCgodTY0KUVWRU5UX1BDKSA8PCA0NCkgfCBcCisJCSgoKCh1NjQpX19MSU5FX18pICYgMHhGRkYpIDw8IDMyKSB8CQkJXAorCQkoKCgodTY0KXBjMTZiaXQxKSAmIDB4RkZGRikgPDwgMTYpIHwJCQlcCisJCSgoKHU2NClwYzE2Yml0MikgJiAweEZGRkYpOwkJCQlcCisJSVNTVUVfSU9fVk1DQUxMX1BPU1RDT0RFX1NFVkVSSVRZKHBvc3RfY29kZV90ZW1wLCBzZXZlcml0eSk7CVwKK30gd2hpbGUgKDApCisKKy8qIE1PU1QgQ09NTU9OICovCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYXzIoRVZFTlRfUEMsIHNldmVyaXR5KQkJCQlcCisJUE9TVENPREVfTElOVVhfQShDVVJSRU5UX0ZJTEVfUEMsIEVWRU5UX1BDLCAweDAwMDAsIHNldmVyaXR5KQorCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYXzMoRVZFTlRfUEMsIHBjMzJiaXQsIHNldmVyaXR5KQkJCVwKKwlQT1NUQ09ERV9MSU5VWF9BKENVUlJFTlRfRklMRV9QQywgRVZFTlRfUEMsIHBjMzJiaXQsIHNldmVyaXR5KQorCisjZGVmaW5lIFBPU1RDT0RFX0xJTlVYXzQoRVZFTlRfUEMsIHBjMTZiaXQxLCBwYzE2Yml0Miwgc2V2ZXJpdHkpCVwKKwlQT1NUQ09ERV9MSU5VWF9CKENVUlJFTlRfRklMRV9QQywgRVZFTlRfUEMsIHBjMTZiaXQxLAkJXAorCQkJIHBjMTZiaXQyLCBzZXZlcml0eSkKKwogI2VuZGlmIC8qIF9fSU9NT05JTlRGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmhiYS92aXNvcmhiYV9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yaGJhL3Zpc29yaGJhX21haW4uYwppbmRleCAxMjBiYTIwLi41YTdhODdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yaGJhL3Zpc29yaGJhX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yaGJhL3Zpc29yaGJhX21haW4uYwpAQCAtMzYsMjEgKzM2LDYgQEAKICNkZWZpbmUgTUFYX1BFTkRJTkdfUkVRVUVTVFMJKE1JTl9OVU1TSUdOQUxTICogMikKICNkZWZpbmUgVklTT1JIQkFfRVJST1JfQ09VTlQJMzAKIAotc3RhdGljIGludCB2aXNvcmhiYV9xdWV1ZV9jb21tYW5kX2xjayhzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kLAotCQkJCSAgICAgIHZvaWQgKCp2aXNvcmhiYV9jbW5kX2RvbmUpCi0JCQkJCSAgICAoc3RydWN0IHNjc2lfY21uZCAqKSk7Ci0jaWZkZWYgREVGX1NDU0lfUUNNRAotc3RhdGljIERFRl9TQ1NJX1FDTUQodmlzb3JoYmFfcXVldWVfY29tbWFuZCkKLSNlbHNlCi0jZGVmaW5lIHZpc29yaGJhX3F1ZXVlX2NvbW1hbmQgdmlzb3JoYmFfcXVldWVfY29tbWFuZF9sY2sKLSNlbmRpZgotc3RhdGljIGludCB2aXNvcmhiYV9wcm9iZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgdmlzb3JoYmFfcmVtb3ZlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IHZpc29yaGJhX3BhdXNlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwKLQkJCSAgdmlzb3JidXNfc3RhdGVfY29tcGxldGVfZnVuYyBjb21wbGV0ZV9mdW5jKTsKLXN0YXRpYyBpbnQgdmlzb3JoYmFfcmVzdW1lKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldiwKLQkJCSAgIHZpc29yYnVzX3N0YXRlX2NvbXBsZXRlX2Z1bmMgY29tcGxldGVfZnVuYyk7Ci0KIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp2aXNvcmhiYV9kZWJ1Z2ZzX2RpcjsKIAogLyogR1VJRFMgZm9yIEhCQSBjaGFubmVsIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyICovCkBAIC02MiwyMCArNDcsNiBAQAogCXsgTlVMTF9VVUlEX0xFLCBOVUxMIH0KIH07CiAKLS8qIFRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSB2aXNvciBidXMgZHJpdmVyIHdoaWNoIHR5cGVzIG9mIHZpc29yIGRldmljZXMKLSAqIHdlIHN1cHBvcnQsIGFuZCB3aGF0IGZ1bmN0aW9ucyB0byBjYWxsIHdoZW4gYSB2aXNvciBkZXZpY2UgdGhhdCB3ZSBzdXBwb3J0Ci0gKiBpcyBhdHRhY2hlZCBvciByZW1vdmVkLgotICovCi1zdGF0aWMgc3RydWN0IHZpc29yX2RyaXZlciB2aXNvcmhiYV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAidmlzb3JoYmEiLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5jaGFubmVsX3R5cGVzID0gdmlzb3JoYmFfY2hhbm5lbF90eXBlcywKLQkucHJvYmUgPSB2aXNvcmhiYV9wcm9iZSwKLQkucmVtb3ZlID0gdmlzb3JoYmFfcmVtb3ZlLAotCS5wYXVzZSA9IHZpc29yaGJhX3BhdXNlLAotCS5yZXN1bWUgPSB2aXNvcmhiYV9yZXN1bWUsCi0JLmNoYW5uZWxfaW50ZXJydXB0ID0gTlVMTCwKLX07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHZpc29yYnVzLCB2aXNvcmhiYV9jaGFubmVsX3R5cGVzKTsKIE1PRFVMRV9BTElBUygidmlzb3JidXM6IiBTUEFSX1ZIQkFfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEX1NUUik7CiAKQEAgLTM2NCw5ICszMzUsOSBAQAogCiAJZGV2X2RiZygmc2NzaWRldi0+c2Rldl9nZW5kZXYsCiAJCSJ2aXNvcmhiYTogaW5pdGlhdGluZyB0eXBlPSVkIHRhc2ttZ210IGNvbW1hbmRcbiIsIHRhc2t0eXBlKTsKLQlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCi0JCQkJICAgICAgIElPQ0hBTl9UT19JT1BBUlQsCi0JCQkJICAgICAgIGNtZHJzcCkpCisJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCisJCQkJICAgICAgSU9DSEFOX1RPX0lPUEFSVCwKKwkJCQkgICAgICBjbWRyc3ApKQogCQlnb3RvIGVycl9kZWxfc2NzaXBlbmRpbmdfZW50OwogCiAJLyogSXQgY2FuIHRha2UgdGhlIFNlcnZpY2UgUGFydGl0aW9uIHVwIHRvIDM1IHNlY29uZHMgdG8gY29tcGxldGUKQEAgLTU2Nyw5ICs1MzgsOSBAQAogCX0KIAljbWRyc3AtPnNjc2kuZ3Vlc3RfcGh5c19lbnRyaWVzID0gc2NzaV9zZ19jb3VudChzY3NpY21kKTsKIAotCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKLQkJCQkgICAgICAgSU9DSEFOX1RPX0lPUEFSVCwKLQkJCQkgICAgICAgY21kcnNwKSkKKwlpZiAodmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKKwkJCQkgICAgICBJT0NIQU5fVE9fSU9QQVJULAorCQkJCSAgICAgIGNtZHJzcCkpCiAJCS8qIHF1ZXVlIG11c3QgYmUgZnVsbCBhbmQgd2UgYXJlbid0IGdvaW5nIHRvIHdhaXQgKi8KIAkJZ290byBlcnJfZGVsX3Njc2lwZW5kaW5nX2VudDsKIApAQCAtNTgwLDYgKzU1MSwxMiBAQAogCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CiB9CiAKKyNpZmRlZiBERUZfU0NTSV9RQ01ECitzdGF0aWMgREVGX1NDU0lfUUNNRCh2aXNvcmhiYV9xdWV1ZV9jb21tYW5kKQorI2Vsc2UKKyNkZWZpbmUgdmlzb3JoYmFfcXVldWVfY29tbWFuZCB2aXNvcmhiYV9xdWV1ZV9jb21tYW5kX2xjaworI2VuZGlmCisKIC8qKgogICoJdmlzb3JoYmFfc2xhdmVfYWxsb2MgLSBjYWxsZWQgd2hlbiBuZXcgZGlzayBpcyBkaXNjb3ZlcmVkCiAgKglAc2NzaWRldjogTmV3IGRpc2sKQEAgLTk1MCw5ICs5MjcsOSBAQAogCXN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQ7CiAKIAl3aGlsZSAoMSkgewotCQlpZiAoIXZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCi0JCQkJCSAgICAgICBJT0NIQU5fRlJPTV9JT1BBUlQsCi0JCQkJCSAgICAgICBjbWRyc3ApKQorCQlpZiAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKKwkJCQkJICAgICAgSU9DSEFOX0ZST01fSU9QQVJULAorCQkJCQkgICAgICBjbWRyc3ApKQogCQkJYnJlYWs7IC8qIHF1ZXVlIGVtcHR5ICovCiAKIAkJaWYgKGNtZHJzcC0+Y21kdHlwZSA9PSBDTURfU0NTSV9UWVBFKSB7CkBAIC0xMTg2LDYgKzExNjMsMjEgQEAKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGV2ZGF0YS0+ZGVidWdmc19kaXIpOwogfQogCisvKiBUaGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgdmlzb3IgYnVzIGRyaXZlciB3aGljaCB0eXBlcyBvZiB2aXNvciBkZXZpY2VzCisgKiB3ZSBzdXBwb3J0LCBhbmQgd2hhdCBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGEgdmlzb3IgZGV2aWNlIHRoYXQgd2Ugc3VwcG9ydAorICogaXMgYXR0YWNoZWQgb3IgcmVtb3ZlZC4KKyAqLworc3RhdGljIHN0cnVjdCB2aXNvcl9kcml2ZXIgdmlzb3JoYmFfZHJpdmVyID0geworCS5uYW1lID0gInZpc29yaGJhIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuY2hhbm5lbF90eXBlcyA9IHZpc29yaGJhX2NoYW5uZWxfdHlwZXMsCisJLnByb2JlID0gdmlzb3JoYmFfcHJvYmUsCisJLnJlbW92ZSA9IHZpc29yaGJhX3JlbW92ZSwKKwkucGF1c2UgPSB2aXNvcmhiYV9wYXVzZSwKKwkucmVzdW1lID0gdmlzb3JoYmFfcmVzdW1lLAorCS5jaGFubmVsX2ludGVycnVwdCA9IE5VTEwsCit9OworCiAvKioKICAqCXZpc29yaGJhX2luaXQJCS0gZHJpdmVyIGluaXQgcm91dGluZQogICoKQEAgLTEyMjgsNCArMTIyMCw0IEBACiAKIE1PRFVMRV9BVVRIT1IoIlVuaXN5cyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJzLVBhciBoYmEgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oInMtUGFyIEhCQSBkcml2ZXIgZm9yIHZpcnR1YWwgU0NTSSBob3N0IGJ1c3NlcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmlucHV0L3VsdHJhaW5wdXRyZXBvcnQuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JpbnB1dC91bHRyYWlucHV0cmVwb3J0LmgKaW5kZXggMWJjM2QyMC4uNTNkZGU3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmlucHV0L3VsdHJhaW5wdXRyZXBvcnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yaW5wdXQvdWx0cmFpbnB1dHJlcG9ydC5oCkBAIC0xNyw4ICsxNyw2IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0jaW5jbHVkZSAidWx0cmFpbnB1dHJlcG9ydC5oIgotCiAvKiBJZGVudGlmaWVzIG1vdXNlIGFuZCBrZXlib2FyZCBhY3Rpdml0eSB3aGljaCBpcyBzcGVjaWZpZWQgYnkgdGhlIGZpcm13YXJlIHRvCiAgKiAgdGhlIGhvc3QgdXNpbmcgdGhlIGNtc2ltcGxlaW5wdXQgcHJvdG9jb2wuICBAaW5ncm91cCBjb3JldHlwZXMKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmlucHV0L3Zpc29yaW5wdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JpbnB1dC92aXNvcmlucHV0LmMKaW5kZXggZDY3Y2Q3NjMuLjZmOTRiNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JpbnB1dC92aXNvcmlucHV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmlucHV0L3Zpc29yaW5wdXQuYwpAQCAtMjksOSArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KIAotI2luY2x1ZGUgInZlcnNpb24uaCIKICNpbmNsdWRlICJ2aXNvcmJ1cy5oIgotI2luY2x1ZGUgImNoYW5uZWwuaCIKICNpbmNsdWRlICJ1bHRyYWlucHV0cmVwb3J0LmgiCiAKIC8qIEtleWJvYXJkIGNoYW5uZWwge2M3MzQxNmQwLWIwYjgtNDRhZi1iMzA0LTlkMmFlOTlmMWIzZH0gKi8KQEAgLTYzLDkgKzYxLDEwIEBACiAgKi8KIHN0cnVjdCB2aXNvcmlucHV0X2RldmRhdGEgewogCXN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgcndfc2VtYXBob3JlIGxvY2tfdmlzb3JfZGV2OyAvKiBsb2NrIGZvciBkZXYgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9ja192aXNvcl9kZXY7IC8qIGxvY2sgZm9yIGRldiAqLwogCXN0cnVjdCBpbnB1dF9kZXYgKnZpc29yaW5wdXRfZGV2OwogCWJvb2wgcGF1c2VkOworCWJvb2wgaW50ZXJydXB0c19lbmFibGVkOwogCXVuc2lnbmVkIGludCBrZXljb2RlX3RhYmxlX2J5dGVzOyAvKiBzaXplIG9mIGZvbGxvd2luZyBhcnJheSAqLwogCS8qIGZvciBrZXlib2FyZCBkZXZpY2VzOiB2aXNvcmtiZF9rZXljb2RlW10gKyB2aXNvcmtiZF9leHRfa2V5Y29kZVtdICovCiAJdW5zaWduZWQgY2hhciBrZXljb2RlX3RhYmxlWzBdOwpAQCAtMjI4LDcgKzIyNywyMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJZGV2X2RiZygmdmlzb3JpbnB1dF9kZXYtPmRldiwgIiVzIG9wZW5lZFxuIiwgX19mdW5jX18pOworCisJLyoKKwkgKiBJZiB3ZSdyZSBub3QgcGF1c2VkLCByZWFsbHkgZW5hYmxlIGludGVycnVwdHMuCisJICogUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIGFyZSBwYXVzZWQsIHNldCBhIGZsYWcgaW5kaWNhdGluZworCSAqIGludGVycnVwdHMgc2hvdWxkIGJlIGVuYWJsZWQgc28gd2hlbiB3ZSByZXN1bWUsIGludGVycnVwdHMKKwkgKiB3aWxsIHJlYWxseSBiZSBlbmFibGVkLgorCSAqLworCW11dGV4X2xvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKKwlkZXZkYXRhLT5pbnRlcnJ1cHRzX2VuYWJsZWQgPSB0cnVlOworCWlmIChkZXZkYXRhLT5wYXVzZWQpCisJCWdvdG8gb3V0X3VubG9jazsKIAl2aXNvcmJ1c19lbmFibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKGRldmRhdGEtPmRldik7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0MywyMCArMjU2LDM1IEBACiAJCXJldHVybjsKIAl9CiAJZGV2X2RiZygmdmlzb3JpbnB1dF9kZXYtPmRldiwgIiVzIGNsb3NlZFxuIiwgX19mdW5jX18pOworCisJLyoKKwkgKiBJZiB3ZSdyZSBub3QgcGF1c2VkLCByZWFsbHkgZGlzYWJsZSBpbnRlcnJ1cHRzLgorCSAqIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBhcmUgcGF1c2VkLCBzZXQgYSBmbGFnIGluZGljYXRpbmcKKwkgKiBpbnRlcnJ1cHRzIHNob3VsZCBiZSBkaXNhYmxlZCBzbyB3aGVuIHdlIHJlc3VtZSB3ZSB3aWxsCisJICogbm90IHJlLWVuYWJsZSB0aGVtLgorCSAqLworCisJbXV0ZXhfbG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOworCWRldmRhdGEtPmludGVycnVwdHNfZW5hYmxlZCA9IGZhbHNlOworCWlmIChkZXZkYXRhLT5wYXVzZWQpCisJCWdvdG8gb3V0X3VubG9jazsKIAl2aXNvcmJ1c19kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhkZXZkYXRhLT5kZXYpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwogfQogCiAvKgotICogcmVnaXN0ZXJfY2xpZW50X2tleWJvYXJkKCkgaW5pdGlhbGl6ZXMgYW5kIHJldHVybnMgYSBMaW51eCBpbnB1dCBub2RlIHRoYXQKKyAqIHNldHVwX2NsaWVudF9rZXlib2FyZCgpIGluaXRpYWxpemVzIGFuZCByZXR1cm5zIGEgTGludXggaW5wdXQgbm9kZSB0aGF0CiAgKiB3ZSBjYW4gdXNlIHRvIGRlbGl2ZXIga2V5Ym9hcmQgaW5wdXRzIHRvIExpbnV4LiAgV2Ugb2YgY291cnNlIGRvIHRoaXMgd2hlbgogICogd2Ugc2VlIGtleWJvYXJkIGlucHV0cyBjb21pbmcgaW4gb24gYSBrZXlib2FyZCBjaGFubmVsLgogICovCiBzdGF0aWMgc3RydWN0IGlucHV0X2RldiAqCi1yZWdpc3Rlcl9jbGllbnRfa2V5Ym9hcmQodm9pZCAqZGV2ZGF0YSwgIC8qIG9wYXF1ZSBvbiBwdXJwb3NlICovCi0JCQkgdW5zaWduZWQgY2hhciAqa2V5Y29kZV90YWJsZSkKK3NldHVwX2NsaWVudF9rZXlib2FyZCh2b2lkICpkZXZkYXRhLCAgLyogb3BhcXVlIG9uIHB1cnBvc2UgKi8KKwkJICAgICAgdW5zaWduZWQgY2hhciAqa2V5Y29kZV90YWJsZSkKIAogewotCWludCBpLCBlcnJvcjsKKwlpbnQgaTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICp2aXNvcmlucHV0X2RldjsKIAogCXZpc29yaW5wdXRfZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CkBAIC0yOTAsMTggKzMxOCwxMiBAQAogCXZpc29yaW5wdXRfZGV2LT5jbG9zZSA9IHZpc29yaW5wdXRfY2xvc2U7CiAJaW5wdXRfc2V0X2RydmRhdGEodmlzb3JpbnB1dF9kZXYsIGRldmRhdGEpOyAvKiBwcmUgaW5wdXRfcmVnaXN0ZXIhICovCiAKLQllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZSh2aXNvcmlucHV0X2Rldik7Ci0JaWYgKGVycm9yKSB7Ci0JCWlucHV0X2ZyZWVfZGV2aWNlKHZpc29yaW5wdXRfZGV2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQogCXJldHVybiB2aXNvcmlucHV0X2RldjsKIH0KIAogc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgKgotcmVnaXN0ZXJfY2xpZW50X21vdXNlKHZvaWQgKmRldmRhdGEgLyogb3BhcXVlIG9uIHB1cnBvc2UgKi8pCitzZXR1cF9jbGllbnRfbW91c2Uodm9pZCAqZGV2ZGF0YSAvKiBvcGFxdWUgb24gcHVycG9zZSAqLykKIHsKLQlpbnQgZXJyb3I7CiAJc3RydWN0IGlucHV0X2RldiAqdmlzb3JpbnB1dF9kZXYgPSBOVUxMOwogCWludCB4cmVzLCB5cmVzOwogCXN0cnVjdCBmYl9pbmZvICpmYjA7CkBAIC0zMzYsMTMgKzM1OCw2IEBACiAJdmlzb3JpbnB1dF9kZXYtPm9wZW4gPSB2aXNvcmlucHV0X29wZW47CiAJdmlzb3JpbnB1dF9kZXYtPmNsb3NlID0gdmlzb3JpbnB1dF9jbG9zZTsKIAlpbnB1dF9zZXRfZHJ2ZGF0YSh2aXNvcmlucHV0X2RldiwgZGV2ZGF0YSk7IC8qIHByZSBpbnB1dF9yZWdpc3RlciEgKi8KLQotCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHZpc29yaW5wdXRfZGV2KTsKLQlpZiAoZXJyb3IpIHsKLQkJaW5wdXRfZnJlZV9kZXZpY2Uodmlzb3JpbnB1dF9kZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KIAlpbnB1dF9zZXRfY2FwYWJpbGl0eSh2aXNvcmlucHV0X2RldiwgRVZfUkVMLCBSRUxfV0hFRUwpOwogCiAJcmV0dXJuIHZpc29yaW5wdXRfZGV2OwpAQCAtMzYwLDkgKzM3NSwxOSBAQAogCWRldmRhdGEgPSBremFsbG9jKHNpemVvZigqZGV2ZGF0YSkgKyBleHRyYV9ieXRlcywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXZkYXRhKQogCQlyZXR1cm4gTlVMTDsKKwltdXRleF9pbml0KCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJbXV0ZXhfbG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwogCWRldmRhdGEtPmRldiA9IGRldjsKIAogCS8qCisJICogdmlzb3JpbnB1dF9vcGVuKCkgY2FuIGJlIGNhbGxlZCBhcyBzb29uIGFzIGlucHV0X3JlZ2lzdGVyX2RldmljZSgpCisJICogaGFwcGVucywgYW5kIHRoYXQgd2lsbCBlbmFibGUgY2hhbm5lbCBpbnRlcnJ1cHRzLiAgU2V0dGluZyBwYXVzZWQKKwkgKiBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcgaW50byB2aXNvcmlucHV0X2NoYW5uZWxfaW50ZXJydXB0KCkgcHJpb3IKKwkgKiB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZSBiZWluZyB0b3RhbGx5IGluaXRpYWxpemVkLgorCSAqLworCWRldmRhdGEtPnBhdXNlZCA9IHRydWU7CisKKwkvKgogCSAqIFRoaXMgaXMgYW4gaW5wdXQgZGV2aWNlIGluIGEgY2xpZW50IGd1ZXN0IHBhcnRpdGlvbiwKIAkgKiBzbyB3ZSBuZWVkIHRvIGNyZWF0ZSB3aGF0ZXZlciBpbnB1dCBub2RlcyBhcmUgbmVjZXNzYXJ5IHRvCiAJICogZGVsaXZlciBvdXIgaW5wdXRzIHRvIHRoZSBndWVzdCBPUy4KQEAgLTM3NCwyMyArMzk5LDQ5IEBACiAJCSAgICAgICBLRVlDT0RFX1RBQkxFX0JZVEVTKTsKIAkJbWVtY3B5KGRldmRhdGEtPmtleWNvZGVfdGFibGUgKyBLRVlDT0RFX1RBQkxFX0JZVEVTLAogCQkgICAgICAgdmlzb3JrYmRfZXh0X2tleWNvZGUsIEtFWUNPREVfVEFCTEVfQllURVMpOwotCQlkZXZkYXRhLT52aXNvcmlucHV0X2RldiA9IHJlZ2lzdGVyX2NsaWVudF9rZXlib2FyZAorCQlkZXZkYXRhLT52aXNvcmlucHV0X2RldiA9IHNldHVwX2NsaWVudF9rZXlib2FyZAogCQkJKGRldmRhdGEsIGRldmRhdGEtPmtleWNvZGVfdGFibGUpOwogCQlpZiAoIWRldmRhdGEtPnZpc29yaW5wdXRfZGV2KQogCQkJZ290byBjbGVhbnVwc19yZWdpc3RlcjsKIAkJYnJlYWs7CiAJY2FzZSB2aXNvcmlucHV0X21vdXNlOgotCQlkZXZkYXRhLT52aXNvcmlucHV0X2RldiA9IHJlZ2lzdGVyX2NsaWVudF9tb3VzZShkZXZkYXRhKTsKKwkJZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXYgPSBzZXR1cF9jbGllbnRfbW91c2UoZGV2ZGF0YSk7CiAJCWlmICghZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXYpCiAJCQlnb3RvIGNsZWFudXBzX3JlZ2lzdGVyOwogCQlicmVhazsKIAl9CiAKLQlpbml0X3J3c2VtKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldmljZSwgZGV2ZGF0YSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisKKwkvKgorCSAqIERldmljZSBzdHJ1Y3QgaXMgY29tcGxldGVseSBzZXQgdXAgbm93LCB3aXRoIHRoZSBleGNlcHRpb24gb2YKKwkgKiB2aXNvcmlucHV0X2RldiBiZWluZyByZWdpc3RlcmVkLgorCSAqIFdlIG5lZWQgdG8gdW5sb2NrIGJlZm9yZSB3ZSByZWdpc3RlciB0aGUgZGV2aWNlLCBiZWNhdXNlIHRoaXMKKwkgKiBjYW4gY2F1c2UgYW4gb24tc3RhY2sgY2FsbCBvZiB2aXNvcmlucHV0X29wZW4oKSwgd2hpY2ggd291bGQKKwkgKiBkZWFkbG9jayBpZiB3ZSBoYWQgdGhlIGxvY2suCisJICovCisJaWYgKGlucHV0X3JlZ2lzdGVyX2RldmljZShkZXZkYXRhLT52aXNvcmlucHV0X2RldikpIHsKKwkJaW5wdXRfZnJlZV9kZXZpY2UoZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXYpOworCQlnb3RvIGVycl9rZnJlZV9kZXZkYXRhOworCX0KKworCW11dGV4X2xvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKKwkvKgorCSAqIEVzdGFibGlzaCBjYWxscyB0byB2aXNvcmlucHV0X2NoYW5uZWxfaW50ZXJydXB0KCkgaWYgdGhhdCBpcworCSAqIHRoZSBkZXNpcmVkIHN0YXRlIHRoYXQgd2UndmUga2VwdCB0cmFjayBvZiBpbiBpbnRlcnJ1cHRzX2VuYWJsZWQKKwkgKiB3aGlsZSB0aGUgZGV2aWNlIHdhcyBiZWluZyBjcmVhdGVkLgorCSAqLworCWRldmRhdGEtPnBhdXNlZCA9IGZhbHNlOworCWlmIChkZXZkYXRhLT5pbnRlcnJ1cHRzX2VuYWJsZWQpCisJCXZpc29yYnVzX2VuYWJsZV9jaGFubmVsX2ludGVycnVwdHMoZGV2KTsKKwltdXRleF91bmxvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKIAogCXJldHVybiBkZXZkYXRhOwogCiBjbGVhbnVwc19yZWdpc3RlcjoKKwltdXRleF91bmxvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKK2Vycl9rZnJlZV9kZXZkYXRhOgogCWtmcmVlKGRldmRhdGEpOwogCXJldHVybiBOVUxMOwogfQpAQCAtMzk4LDcgKzQ0OSw2IEBACiBzdGF0aWMgaW50CiB2aXNvcmlucHV0X3Byb2JlKHN0cnVjdCB2aXNvcl9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgdmlzb3JpbnB1dF9kZXZkYXRhICpkZXZkYXRhID0gTlVMTDsKIAl1dWlkX2xlIGd1aWQ7CiAJZW51bSB2aXNvcmlucHV0X2RldmljZV90eXBlIGRldnR5cGU7CiAKQEAgLTQwOSwxMCArNDU5LDkgQEAKIAkJZGV2dHlwZSA9IHZpc29yaW5wdXRfa2V5Ym9hcmQ7CiAJZWxzZQogCQlyZXR1cm4gLUVOT0RFVjsKLQlkZXZkYXRhID0gZGV2ZGF0YV9jcmVhdGUoZGV2LCBkZXZ0eXBlKTsKLQlpZiAoIWRldmRhdGEpCisJdmlzb3JidXNfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoZGV2KTsKKwlpZiAoIWRldmRhdGFfY3JlYXRlKGRldiwgZGV2dHlwZSkpCiAJCXJldHVybiAtRU5PTUVNOwotCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXZpY2UsIGRldmRhdGEpOwogCXJldHVybiAwOwogfQogCkBAIC00MzEsNiArNDgwLDcgQEAKIAlpZiAoIWRldmRhdGEpCiAJCXJldHVybjsKIAorCW11dGV4X2xvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKIAl2aXNvcmJ1c19kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhkZXYpOwogCiAJLyoKQEAgLTQzOCwxMCArNDg4LDEwIEBACiAJICogaW4gdmlzb3JpbnB1dF9jaGFubmVsX2ludGVycnVwdCgpCiAJICovCiAKLQlkb3duX3dyaXRlKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiAJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldmljZSwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisKIAl1bnJlZ2lzdGVyX2NsaWVudF9pbnB1dChkZXZkYXRhLT52aXNvcmlucHV0X2Rldik7Ci0JdXBfd3JpdGUoJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKIAlrZnJlZShkZXZkYXRhKTsKIH0KIApAQCAtNTI5LDE1ICs1NzksOSBAQAogCWlmICghZGV2ZGF0YSkKIAkJcmV0dXJuOwogCi0JZG93bl93cml0ZSgmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwotCWlmIChkZXZkYXRhLT5wYXVzZWQpIC8qIGRvbid0IHRvdWNoIGRldmljZS9jaGFubmVsIHdoZW4gcGF1c2VkICovCi0JCWdvdG8gb3V0X2xvY2tlZDsKLQogCXZpc29yaW5wdXRfZGV2ID0gZGV2ZGF0YS0+dmlzb3JpbnB1dF9kZXY7Ci0JaWYgKCF2aXNvcmlucHV0X2RldikKLQkJZ290byBvdXRfbG9ja2VkOwogCi0Jd2hpbGUgKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoZGV2LT52aXNvcmNoYW5uZWwsIDAsICZyKSkgeworCXdoaWxlICghdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShkZXYtPnZpc29yY2hhbm5lbCwgMCwgJnIpKSB7CiAJCXNjYW5jb2RlID0gci5hY3Rpdml0eS5hcmcxOwogCQlrZXljb2RlID0gc2NhbmNvZGVfdG9fa2V5Y29kZShzY2FuY29kZSk7CiAJCXN3aXRjaCAoci5hY3Rpdml0eS5hY3Rpb24pIHsKQEAgLTYxMSw4ICs2NTUsNiBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci1vdXRfbG9ja2VkOgotCXVwX3dyaXRlKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTYyNywxNiArNjY5LDI0IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWRvd25fd3JpdGUoJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKKwltdXRleF9sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiAJaWYgKGRldmRhdGEtPnBhdXNlZCkgewogCQlyYyA9IC1FQlVTWTsKIAkJZ290byBvdXRfbG9ja2VkOwogCX0KKwlpZiAoZGV2ZGF0YS0+aW50ZXJydXB0c19lbmFibGVkKQorCQl2aXNvcmJ1c19kaXNhYmxlX2NoYW5uZWxfaW50ZXJydXB0cyhkZXYpOworCisJLyoKKwkgKiBkdWUgdG8gYWJvdmUsIGF0IHRoaXMgdGltZSBubyB0aHJlYWQgb2YgZXhlY3V0aW9uIHdpbGwgYmUKKwkgKiBpbiB2aXNvcmlucHV0X2NoYW5uZWxfaW50ZXJydXB0KCkKKwkgKi8KKwogCWRldmRhdGEtPnBhdXNlZCA9IHRydWU7CiAJY29tcGxldGVfZnVuYyhkZXYsIDApOwogCXJjID0gMDsKIG91dF9sb2NrZWQ6Ci0JdXBfd3JpdGUoJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKKwltdXRleF91bmxvY2soJmRldmRhdGEtPmxvY2tfdmlzb3JfZGV2KTsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CkBAIC02NTIsMTYgKzcwMiwyNSBAQAogCQlyYyA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KLQlkb3duX3dyaXRlKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJbXV0ZXhfbG9jaygmZGV2ZGF0YS0+bG9ja192aXNvcl9kZXYpOwogCWlmICghZGV2ZGF0YS0+cGF1c2VkKSB7CiAJCXJjID0gLUVCVVNZOwogCQlnb3RvIG91dF9sb2NrZWQ7CiAJfQogCWRldmRhdGEtPnBhdXNlZCA9IGZhbHNlOwogCWNvbXBsZXRlX2Z1bmMoZGV2LCAwKTsKKworCS8qCisJICogUmUtZXN0YWJsaXNoIGNhbGxzIHRvIHZpc29yaW5wdXRfY2hhbm5lbF9pbnRlcnJ1cHQoKSBpZiB0aGF0IGlzCisJICogdGhlIGRlc2lyZWQgc3RhdGUgdGhhdCB3ZSd2ZSBrZXB0IHRyYWNrIG9mIGluIGludGVycnVwdHNfZW5hYmxlZAorCSAqIHdoaWxlIHRoZSBkZXZpY2Ugd2FzIHBhdXNlZC4KKwkgKi8KKwlpZiAoZGV2ZGF0YS0+aW50ZXJydXB0c19lbmFibGVkKQorCQl2aXNvcmJ1c19lbmFibGVfY2hhbm5lbF9pbnRlcnJ1cHRzKGRldik7CisKIAlyYyA9IDA7CiBvdXRfbG9ja2VkOgotCXVwX3dyaXRlKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CisJbXV0ZXhfdW5sb2NrKCZkZXZkYXRhLT5sb2NrX3Zpc29yX2Rldik7CiBvdXQ6CiAJcmV0dXJuIHJjOwogfQpAQCAtNjc1LDcgKzczNCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgdmlzb3JfZHJpdmVyIHZpc29yaW5wdXRfZHJpdmVyID0gewogCS5uYW1lID0gInZpc29yaW5wdXQiLAotCS52ZXJ0YWcgPSBOVUxMLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5jaGFubmVsX3R5cGVzID0gdmlzb3JpbnB1dF9jaGFubmVsX3R5cGVzLAogCS5wcm9iZSA9IHZpc29yaW5wdXRfcHJvYmUsCkBAIC03MDQsOCArNzYyLDcgQEAKIAogTU9EVUxFX0FVVEhPUigiVW5pc3lzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oInMtUGFyIGh1bWFuIGlucHV0IGRyaXZlciBmb3IgZ3Vlc3QgTGludXgiKTsKLU1PRFVMRV9WRVJTSU9OKFZFUlNJT04pOworTU9EVUxFX0RFU0NSSVBUSU9OKCJzLVBhciBodW1hbiBpbnB1dCBkcml2ZXIgZm9yIHZpcnR1YWwga2V5Ym9hcmQvbW91c2UiKTsKIAogTU9EVUxFX0FMSUFTKCJ2aXNvcmJ1czoiIFNQQVJfTU9VU0VfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEX1NUUik7CiBNT0RVTEVfQUxJQVMoInZpc29yYnVzOiIgU1BBUl9LRVlCT0FSRF9DSEFOTkVMX1BST1RPQ09MX1VVSURfU1RSKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JuaWMvdmlzb3JuaWNfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcm5pYy92aXNvcm5pY19tYWluLmMKaW5kZXggYTI4Mzg4ZC4uMTM2NzAwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcm5pYy92aXNvcm5pY19tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcm5pYy92aXNvcm5pY19tYWluLmMKQEAgLTI5LDggKzI5LDYgQEAKICNpbmNsdWRlICJpb2NoYW5uZWwuaCIKIAogI2RlZmluZSBWSVNPUk5JQ19JTkZJTklURV9SU1BfV0FJVCAwCi0jZGVmaW5lIFZJU09STklDU09QRU5NQVggMzIKLSNkZWZpbmUgTUFYREVWSUNFUyAgICAgMTYzODQKIAogLyogTUFYX0JVRiA9IDY0IGxpbmVzIHggMzIgTUFYVk5JQyB4IDgwIGNoYXJhY3RlcnMKICAqICAgICAgICAgPSAxNjM4NDAgYnl0ZXMKQEAgLTM4LDI3ICszNiw2IEBACiAjZGVmaW5lIE1BWF9CVUYgMTYzODQwCiAjZGVmaW5lIE5BUElfV0VJR0hUIDY0CiAKLXN0YXRpYyBpbnQgdmlzb3JuaWNfcHJvYmUoc3RydWN0IHZpc29yX2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIHZpc29ybmljX3JlbW92ZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCB2aXNvcm5pY19wYXVzZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsCi0JCQkgIHZpc29yYnVzX3N0YXRlX2NvbXBsZXRlX2Z1bmMgY29tcGxldGVfZnVuYyk7Ci1zdGF0aWMgaW50IHZpc29ybmljX3Jlc3VtZShzdHJ1Y3Qgdmlzb3JfZGV2aWNlICpkZXYsCi0JCQkgICB2aXNvcmJ1c19zdGF0ZV9jb21wbGV0ZV9mdW5jIGNvbXBsZXRlX2Z1bmMpOwotCi0vKiBERUJVR0ZTIGRlY2xhcmF0aW9ucyAqLwotc3RhdGljIHNzaXplX3QgaW5mb19kZWJ1Z2ZzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCi0JCQkJIHNpemVfdCBsZW4sIGxvZmZfdCAqb2Zmc2V0KTsKLXN0YXRpYyBzc2l6ZV90IGVuYWJsZV9pbnRzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAotCQkJCSBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpOwotc3RhdGljIHN0cnVjdCBkZW50cnkgKnZpc29ybmljX2RlYnVnZnNfZGlyOwotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdmc19pbmZvX2ZvcHMgPSB7Ci0JLnJlYWQgPSBpbmZvX2RlYnVnZnNfcmVhZCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfZW5hYmxlX2ludHNfZm9wcyA9IHsKLQkud3JpdGUgPSBlbmFibGVfaW50c193cml0ZSwKLX07Ci0KIC8qIEdVSURTIGZvciBkaXJlY3RvciBjaGFubmVsIHR5cGUgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgdmlzb3JfY2hhbm5lbHR5cGVfZGVzY3JpcHRvciB2aXNvcm5pY19jaGFubmVsX3R5cGVzW10gPSB7CiAJLyogTm90ZSB0aGF0IHRoZSBvbmx5IGNoYW5uZWwgdHlwZSB3ZSBleHBlY3QgdG8gYmUgcmVwb3J0ZWQgYnkgdGhlCkBAIC03NywyMyArNTQsNiBAQAogICovCiBNT0RVTEVfQUxJQVMoInZpc29yYnVzOiIgU1BBUl9WTklDX0NIQU5ORUxfUFJPVE9DT0xfVVVJRF9TVFIpOwogCi0vKiBUaGlzIGlzIHVzZWQgdG8gdGVsbCB0aGUgdmlzb3IgYnVzIGRyaXZlciB3aGljaCB0eXBlcyBvZiB2aXNvciBkZXZpY2VzCi0gKiB3ZSBzdXBwb3J0LCBhbmQgd2hhdCBmdW5jdGlvbnMgdG8gY2FsbCB3aGVuIGEgdmlzb3IgZGV2aWNlIHRoYXQgd2Ugc3VwcG9ydAotICogaXMgYXR0YWNoZWQgb3IgcmVtb3ZlZC4KLSAqLwotc3RhdGljIHN0cnVjdCB2aXNvcl9kcml2ZXIgdmlzb3JuaWNfZHJpdmVyID0gewotCS5uYW1lID0gInZpc29ybmljIiwKLQkudmVyc2lvbiA9ICIxLjAuMC4wIiwKLQkudmVydGFnID0gTlVMTCwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkuY2hhbm5lbF90eXBlcyA9IHZpc29ybmljX2NoYW5uZWxfdHlwZXMsCi0JLnByb2JlID0gdmlzb3JuaWNfcHJvYmUsCi0JLnJlbW92ZSA9IHZpc29ybmljX3JlbW92ZSwKLQkucGF1c2UgPSB2aXNvcm5pY19wYXVzZSwKLQkucmVzdW1lID0gdmlzb3JuaWNfcmVzdW1lLAotCS5jaGFubmVsX2ludGVycnVwdCA9IE5VTEwsCi19OwotCiBzdHJ1Y3QgY2hhbnN0YXQgewogCXVuc2lnbmVkIGxvbmcgZ290X3JjdjsKIAl1bnNpZ25lZCBsb25nIGdvdF9lbmJkaXNhY2s7CkBAIC0xODEsOSArMTQxLDYgQEAKIAlzdHJ1Y3QgdWlzY21kcnNwIGNtZHJzcFtTSVpFT0ZfQ01EUlNQXTsKIH07CiAKLXN0YXRpYyBpbnQgdmlzb3JuaWNfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpOwotc3RhdGljIHZvaWQgcG9sbF9mb3JfaXJxKHVuc2lnbmVkIGxvbmcgdik7Ci0KIC8qKgogICoJdmlzb3JfY29weV9mcmFnc2luZm9fZnJvbV9za2IoCiAgKglAc2tiX2luOiBza2J1ZmYgdGhhdCB3ZSBhcmUgcHVsbGluZyB0aGUgZnJhZ3MgZnJvbQpAQCAtMjg5LDYgKzI0NiwxMCBAQAogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdmc19lbmFibGVfaW50c19mb3BzID0geworCS53cml0ZSA9IGVuYWJsZV9pbnRzX3dyaXRlLAorfTsKKwogLyoqCiAgKgl2aXNvcm5pY19zZXJ2ZXJkb3duX2NvbXBsZXRlIC0gSU9QQVJUIHdlbnQgZG93biwgcGF1c2UgZGV2aWNlCiAgKglAd29yazogV29yayBxdWV1ZSBpdCB3YXMgc2NoZWR1bGVkIG9uCkBAIC00MjUsOSArMzg2LDkgQEAKIAlpZiAoKGNtZHJzcC0+bmV0LnJjdnBvc3QuZnJhZy5waV9vZmYgKyBza2ItPmxlbikgPD0gUElfUEFHRV9TSVpFKSB7CiAJCWNtZHJzcC0+bmV0LnR5cGUgPSBORVRfUkNWX1BPU1Q7CiAJCWNtZHJzcC0+Y21kdHlwZSA9IENNRF9ORVRfVFlQRTsKLQkJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCi0JCQkJCSAgICAgIElPQ0hBTl9UT19JT1BBUlQsCi0JCQkJCSAgICAgIGNtZHJzcCkpIHsKKwkJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAorCQkJCQkgICAgICAgSU9DSEFOX1RPX0lPUEFSVCwKKwkJCQkJICAgICAgIGNtZHJzcCkpIHsKIAkJCWF0b21pY19pbmMoJmRldmRhdGEtPm51bV9yY3ZidWZfaW5faW92bSk7CiAJCQlkZXZkYXRhLT5jaHN0YXQuc2VudF9wb3N0Kys7CiAJCX0gZWxzZSB7CkBAIC00NTQsOSArNDE1LDkgQEAKIAlkZXZkYXRhLT5jbWRyc3BfcmN2LT5uZXQuZW5iZGlzLmNvbnRleHQgPSBuZXRkZXY7CiAJZGV2ZGF0YS0+Y21kcnNwX3Jjdi0+bmV0LnR5cGUgPSBORVRfUkNWX0VOQkRJUzsKIAlkZXZkYXRhLT5jbWRyc3BfcmN2LT5jbWR0eXBlID0gQ01EX05FVF9UWVBFOwotCWlmICh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAotCQkJCSAgICAgIElPQ0hBTl9UT19JT1BBUlQsCi0JCQkJICAgICAgZGV2ZGF0YS0+Y21kcnNwX3JjdikpCisJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAorCQkJCSAgICAgICBJT0NIQU5fVE9fSU9QQVJULAorCQkJCSAgICAgICBkZXZkYXRhLT5jbWRyc3BfcmN2KSkKIAkJZGV2ZGF0YS0+Y2hzdGF0LnNlbnRfZW5iZGlzKys7CiB9CiAKQEAgLTkyMCw4ICs4ODEsOCBAQAogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIAotCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChkZXZkYXRhLT5kZXYtPnZpc29yY2hhbm5lbCwKLQkJCQkgICAgICAgSU9DSEFOX1RPX0lPUEFSVCwgY21kcnNwKSkgeworCWlmICh2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAorCQkJCSAgICAgIElPQ0hBTl9UT19JT1BBUlQsIGNtZHJzcCkpIHsKIAkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZkYXRhLT5wcml2X2xvY2ssIGZsYWdzKTsKIAkJZGV2ZGF0YS0+YnVzeV9jbnQrKzsKQEAgLTE1MjIsNiArMTQ4MywxMSBAQAogCXJldHVybiBieXRlc19yZWFkOwogfQogCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdmlzb3JuaWNfZGVidWdmc19kaXI7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX2luZm9fZm9wcyA9IHsKKwkucmVhZCA9IGluZm9fZGVidWdmc19yZWFkLAorfTsKKwogLyoqCiAgKglzZW5kX3Jjdl9wb3N0c19pZl9uZWVkZWQKICAqCUBkZXZkYXRhOiB2aXNvcm5pYyBkZXZpY2UKQEAgLTE1NzMsOSArMTUzOSw5IEBACiBzdGF0aWMgdm9pZAogZHJhaW5fcmVzcF9xdWV1ZShzdHJ1Y3QgdWlzY21kcnNwICpjbWRyc3AsIHN0cnVjdCB2aXNvcm5pY19kZXZkYXRhICpkZXZkYXRhKQogewotCXdoaWxlICh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAotCQkJCQkgSU9DSEFOX0ZST01fSU9QQVJULAotCQkJCQkgY21kcnNwKSkKKwl3aGlsZSAoIXZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCisJCQkJCSAgSU9DSEFOX0ZST01fSU9QQVJULAorCQkJCQkgIGNtZHJzcCkpCiAJCTsKIH0KIApAQCAtMTU4Niw3ICsxNTUyLDcgQEAKICAqCiAgKglEcmFpbiB0aGUgcmVzcG9uZXMgcXVldWUgb2YgYW55IHJlc3BvbnNlcyBmcm9tIHRoZSBJTyBwYXJ0aXRpb24uCiAgKglQcm9jZXNzIHRoZSByZXNwb25zZXMgYXMgd2UgZ2V0IHRoZW0uCi0gKglSZXR1cm5zIHdoZW4gcmVzcG9uc2UgcXVldWUgaXMgZW1wdHkgb3Igd2hlbiB0aGUgdGhyZWFkZCBzdG9wcy4KKyAqCVJldHVybnMgd2hlbiByZXNwb25zZSBxdWV1ZSBpcyBlbXB0eSBvciB3aGVuIHRoZSB0aHJlYWQgc3RvcHMuCiAgKi8KIHN0YXRpYyB2b2lkCiBzZXJ2aWNlX3Jlc3BfcXVldWUoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwLCBzdHJ1Y3Qgdmlzb3JuaWNfZGV2ZGF0YSAqZGV2ZGF0YSwKQEAgLTE1OTksOSArMTU2NSw5IEBACiAJLyogVE9ETzogQ0xJRU5UIEFDUVVJUkUgLS0gRG9uJ3QgcmVhbGx5IG5lZWQgdGhpcyBhdCB0aGUKIAkgKiBtb21lbnQKIAkgKi8KLQkJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGRldmRhdGEtPmRldi0+dmlzb3JjaGFubmVsLAotCQkJCQkgICAgICAgSU9DSEFOX0ZST01fSU9QQVJULAotCQkJCQkgICAgICAgY21kcnNwKSkKKwkJaWYgKHZpc29yY2hhbm5lbF9zaWduYWxyZW1vdmUoZGV2ZGF0YS0+ZGV2LT52aXNvcmNoYW5uZWwsCisJCQkJCSAgICAgIElPQ0hBTl9GUk9NX0lPUEFSVCwKKwkJCQkJICAgICAgY21kcnNwKSkKIAkJCWJyZWFrOyAvKiBxdWV1ZSBlbXB0eSAqLwogCiAJCXN3aXRjaCAoY21kcnNwLT5uZXQudHlwZSkgewpAQCAtMjA2MSw2ICsyMDI3LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFRoaXMgaXMgdXNlZCB0byB0ZWxsIHRoZSB2aXNvciBidXMgZHJpdmVyIHdoaWNoIHR5cGVzIG9mIHZpc29yIGRldmljZXMKKyAqIHdlIHN1cHBvcnQsIGFuZCB3aGF0IGZ1bmN0aW9ucyB0byBjYWxsIHdoZW4gYSB2aXNvciBkZXZpY2UgdGhhdCB3ZSBzdXBwb3J0CisgKiBpcyBhdHRhY2hlZCBvciByZW1vdmVkLgorICovCitzdGF0aWMgc3RydWN0IHZpc29yX2RyaXZlciB2aXNvcm5pY19kcml2ZXIgPSB7CisJLm5hbWUgPSAidmlzb3JuaWMiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5jaGFubmVsX3R5cGVzID0gdmlzb3JuaWNfY2hhbm5lbF90eXBlcywKKwkucHJvYmUgPSB2aXNvcm5pY19wcm9iZSwKKwkucmVtb3ZlID0gdmlzb3JuaWNfcmVtb3ZlLAorCS5wYXVzZSA9IHZpc29ybmljX3BhdXNlLAorCS5yZXN1bWUgPSB2aXNvcm5pY19yZXN1bWUsCisJLmNoYW5uZWxfaW50ZXJydXB0ID0gTlVMTCwKK307CisKIC8qKgogICoJdmlzb3JuaWNfaW5pdAktIEluaXQgZnVuY3Rpb24KICAqCkBAIC0yMTE1LDUgKzIwOTYsNCBAQAogCiBNT0RVTEVfQVVUSE9SKCJVbmlzeXMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigic1BBUiBuaWMgZHJpdmVyIGZvciBzcGFybGludXg6IHZlciAxLjAuMC4wIik7Ci1NT0RVTEVfVkVSU0lPTigiMS4wLjAuMCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJzLVBhciBOSUMgZHJpdmVyIGZvciB2aXJ0dWFsIG5ldHdvcmsgZGV2aWNlcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3NmZiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL0tjb25maWcKQEAgLTAsMCArMSw5IEBACitjb25maWcgQkNNMjcwOF9WQ0hJUQorCXRyaXN0YXRlICJWaWRlb2NvcmUgVkNISVEiCisJZGVwZW5kcyBvbiBSQVNQQkVSUllQSV9GSVJNV0FSRSAmJiBCUk9LRU4KKwlkZWZhdWx0IHkKKwloZWxwCisJCUtlcm5lbCB0byBWaWRlb0NvcmUgY29tbXVuaWNhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZQorCQlCQ00yNzA4IGZhbWlseSBvZiBwcm9kdWN0cy4KKwkJRGVmYXVsdHMgdG8gWSB3aGVuIHRoZSBCcm9hZGNvbSBWaWRlb2NvcmUgc2VydmljZXMKKwkJYXJlIGluY2x1ZGVkIGluIHRoZSBidWlsZCwgTiBvdGhlcndpc2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYWI0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9NYWtlZmlsZQpAQCAtMCwwICsxLDE0IEBACitvYmotJChDT05GSUdfQkNNMjcwOF9WQ0hJUSkJKz0gdmNoaXEubworCit2Y2hpcS1vYmpzIDo9IFwKKyAgIGludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29yZS5vICBcCisgICBpbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2FybS5vIFwKKyAgIGludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfa2Vybl9saWIubyBcCisgICBpbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxXzI4MzVfYXJtLm8gXAorICAgaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9kZWJ1Z2ZzLm8gXAorICAgaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9zaGltLm8gXAorICAgaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV91dGlsLm8gXAorICAgaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQubyBcCisKK2NjZmxhZ3MteSArPSAtRFZDT1NfVkVSSUZZX0JLUFRTPTEgLUlkcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcyAtRFVTRV9WQ0hJUV9BUk0gLURfX1ZDQ09SRVZFUl9fPTB4MDQwMDAwMDAKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvY29ubmVjdGlvbnMvY29ubmVjdGlvbi5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvY29ubmVjdGlvbnMvY29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZjZhYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS9jb25uZWN0aW9ucy9jb25uZWN0aW9uLmgKQEAgLTAsMCArMSwzMjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ09OTkVDVElPTl9IXworI2RlZmluZSBDT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmdfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UvdmNoaS92Y2hpX2NvbW1vbi5oIgorI2luY2x1ZGUgImludGVyZmFjZS92Y2hpL21lc3NhZ2VfZHJpdmVycy9tZXNzYWdlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBHbG9iYWwgZGVmcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBPcGFxdWUgaGFuZGxlIGZvciBhIGNvbm5lY3Rpb24gLyBzZXJ2aWNlIHBhaXIKK3R5cGVkZWYgc3RydWN0IG9wYXF1ZV92Y2hpX2Nvbm5lY3Rpb25fY29ubmVjdGVkX3NlcnZpY2VfaGFuZGxlX3QgKlZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UOworCisvLyBvcGFxdWUgaGFuZGxlIHRvIHRoZSBjb25uZWN0aW9uIHN0YXRlIGluZm9ybWF0aW9uCit0eXBlZGVmIHN0cnVjdCBvcGFxdWVfdmNoaV9jb25uZWN0aW9uX2luZm9fdCBWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaV9jb25uZWN0aW9uX3QgVkNISV9DT05ORUNUSU9OX1Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFQSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBSb3V0aW5lIHRvIGluaXQgYSBjb25uZWN0aW9uIHdpdGggYSBwYXJ0aWN1bGFyIGxvdyBsZXZlbCBkcml2ZXIKK3R5cGVkZWYgVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKiAoKlZDSElfQ09OTkVDVElPTl9JTklUX1QpKCBzdHJ1Y3QgdmNoaV9jb25uZWN0aW9uX3QgKiBjb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZDSElfTUVTU0FHRV9EUklWRVJfVCAqIGRyaXZlciApOworCisvLyBSb3V0aW5lIHRvIGNvbnRyb2wgQ1JDIGVuYWJsaW5nIGF0IGEgY29ubmVjdGlvbiBsZXZlbAordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX0NSQ19DT05UUk9MX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVCAqc3RhdGVfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0NSQ19DT05UUk9MX1QgY29udHJvbCApOworCisvLyBSb3V0aW5lIHRvIGNyZWF0ZSBhIHNlcnZpY2UKK3R5cGVkZWYgaW50MzJfdCAoKlZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0NPTk5FQ1RfVCkoIFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNlcnZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByeF9maWZvX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0eF9maWZvX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9DQUxMQkFDS19UIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2FsbGJhY2tfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdhbnRfY3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3YW50X3VuYWxpZ25lZF9idWxrX3J4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3YW50X3VuYWxpZ25lZF9idWxrX3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1QgKnNlcnZpY2VfaGFuZGxlICk7CisKKy8vIFJvdXRpbmUgdG8gY2xvc2UgYSBzZXJ2aWNlCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9ESVNDT05ORUNUX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIHF1ZXVlIGEgbWVzc2FnZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfUVVFVUVfTUVTU0FHRV9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnX2hhbmRsZSApOworCisvLyBzY2F0dGVyLWdhdGhlciAodmVjdG9yKSBtZXNzYWdlIHF1ZXVlaW5nCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9RVUVVRV9NRVNTQUdFVl9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9NU0dfVkVDVE9SX1QgKnZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIGRlcXVldWUgYSBtZXNzYWdlCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9ERVFVRVVFX01FU1NBR0VfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhfZGF0YV9zaXplX3RvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICphY3R1YWxfbXNnX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncyApOworCisvLyBSb3V0aW5lIHRvIHBlZWsgYXQgYSBtZXNzYWdlCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9QRUVLX01FU1NBR0VfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1zZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MgKTsKKworLy8gUm91dGluZSB0byBob2xkIGEgbWVzc2FnZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSE9MRF9NRVNTQUdFX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICptc2dfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqbWVzc2FnZV9oYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBpbml0aWFsaXNlIGEgcmVjZWl2ZWQgbWVzc2FnZSBpdGVyYXRvcgordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfTE9PS0FIRUFEX01FU1NBR0VfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfTVNHX0lURVJfVCAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MgKTsKKworLy8gUm91dGluZSB0byByZWxlYXNlIGEgaGVsZCBtZXNzYWdlCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fSEVMRF9NU0dfUkVMRUFTRV9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbWVzc2FnZV9oYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBnZXQgaW5mbyBvbiBhIGhlbGQgbWVzc2FnZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX0hFTERfTVNHX0lORk9fVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1lc3NhZ2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKm1zZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp0eF90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJ4X3RpbWVzdGFtcCApOworCisvLyBSb3V0aW5lIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGl0ZXJhdG9yIGhhcyBhIG5leHQgbWVzc2FnZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX01TR19JVEVSX0hBU19ORVhUX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZDSElfTVNHX0lURVJfVCAqaXRlciApOworCisvLyBSb3V0aW5lIHRvIGFkdmFuY2UgdGhlIGl0ZXJhdG9yCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fTVNHX0lURVJfTkVYVF9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX01TR19JVEVSX1QgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1zZ19zaXplICk7CisKKy8vIFJvdXRpbmUgdG8gcmVtb3ZlIHRoZSBsYXN0IG1lc3NhZ2UgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fTVNHX0lURVJfUkVNT1ZFX1QpKCBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9NU0dfSVRFUl9UICppdGVyICk7CisKKy8vIFJvdXRpbmUgdG8gaG9sZCB0aGUgbGFzdCBtZXNzYWdlIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX01TR19JVEVSX0hPTERfVCkoIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9NU0dfSVRFUl9UICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiptc2dfaGFuZGxlICk7CisKKy8vIFJvdXRpbmUgdG8gdHJhbnNtaXQgYnVsayBkYXRhCit0eXBlZGVmIGludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fQlVMS19RVUVVRV9UUkFOU01JVF9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YV9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWxrX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIHJlY2VpdmUgZGF0YQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX0JVTEtfUVVFVUVfUkVDRUlWRV9UKSggVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1bGtfaGFuZGxlICk7CisKKy8vIFJvdXRpbmUgdG8gcmVwb3J0IGlmIGEgc2VydmVyIGlzIGF2YWlsYWJsZQordHlwZWRlZiBpbnQzMl90ICgqVkNISV9DT05ORUNUSU9OX1NFUlZFUl9QUkVTRU5UKSggVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCBpbnQzMl90IHNlcnZpY2VfaWQsIGludDMyX3QgcGVlcl9mbGFncyApOworCisvLyBSb3V0aW5lIHRvIHJlcG9ydCB0aGUgbnVtYmVyIG9mIFJYIHNsb3RzIGF2YWlsYWJsZQordHlwZWRlZiBpbnQgKCpWQ0hJX0NPTk5FQ1RJT05fUlhfU0xPVFNfQVZBSUxBQkxFKSggY29uc3QgVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlICk7CisKKy8vIFJvdXRpbmUgdG8gcmVwb3J0IHRoZSBSWCBzbG90IHNpemUKK3R5cGVkZWYgdWludDMyX3QgKCpWQ0hJX0NPTk5FQ1RJT05fUlhfU0xPVF9TSVpFKSggY29uc3QgVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlICk7CisKKy8vIENhbGxiYWNrIHRvIGluZGljYXRlIHRoYXQgdGhlIG90aGVyIHNpZGUgaGFzIGFkZGVkIGEgYnVmZmVyIHRvIHRoZSByeCBidWxrIERNQSBGSUZPCit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fUlhfQlVMS19CVUZGRVJfQURERUQpKFZDSElfQ09OTkVDVElPTl9TVEFURV9UICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU1NBR0VfVFhfQ0hBTk5FTF9UIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9vZmZzZXQpOworCisvLyBDYWxsYmFjayB0byBpbmZvcm0gYSBzZXJ2aWNlIHRoYXQgYSBYb24gb3IgWG9mZiBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkCit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fRkxPV19DT05UUk9MKShWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVCAqc3RhdGUsIGludDMyX3Qgc2VydmljZV9pZCwgaW50MzJfdCB4b2ZmKTsKKworLy8gQ2FsbGJhY2sgdG8gaW5mb3JtIGEgc2VydmljZSB0aGF0IGEgc2VydmVyIGF2YWlsYWJsZSByZXBseSBtZXNzYWdlIGhhcyBiZWVuIHJlY2VpdmVkCit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fU0VSVkVSX0FWQUlMQUJMRV9SRVBMWSkoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCBpbnQzMl90IHNlcnZpY2VfaWQsIHVpbnQzMl90IGZsYWdzKTsKKworLy8gQ2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCBidWxrIGF1eGlsaWFyeSBtZXNzYWdlcyBoYXZlIGFycml2ZWQKK3R5cGVkZWYgdm9pZCAoKlZDSElfQ09OTkVDVElPTl9CVUxLX0FVWF9SRUNFSVZFRCkoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlKTsKKworLy8gQ2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCBidWxrIGF1eGlsaWFyeSBtZXNzYWdlcyBoYXZlIGFycml2ZWQKK3R5cGVkZWYgdm9pZCAoKlZDSElfQ09OTkVDVElPTl9CVUxLX0FVWF9UUkFOU01JVFRFRCkoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCB2b2lkICpoYW5kbGUpOworCisvLyBDYWxsYmFjayB3aXRoIGFsbCB0aGUgY29ubmVjdGlvbiBpbmZvIHlvdSByZXF1aXJlCit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fSU5GTykoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCB1aW50MzJfdCBwcm90b2NvbF92ZXJzaW9uLCB1aW50MzJfdCBzbG90X3NpemUsIHVpbnQzMl90IG51bV9zbG90cywgdWludDMyX3QgbWluX2J1bGtfc2l6ZSk7CisKKy8vIENhbGxiYWNrIHRvIGluZm9ybSBvZiBhIGRpc2Nvbm5lY3QKK3R5cGVkZWYgdm9pZCAoKlZDSElfQ09OTkVDVElPTl9ESVNDT05ORUNUKShWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVCAqc3RhdGUsIHVpbnQzMl90IGZsYWdzKTsKKworLy8gQ2FsbGJhY2sgdG8gaW5mb3JtIG9mIGEgcG93ZXIgY29udHJvbCByZXF1ZXN0Cit0eXBlZGVmIHZvaWQgKCpWQ0hJX0NPTk5FQ1RJT05fUE9XRVJfQ09OVFJPTCkoVkNISV9DT05ORUNUSU9OX1NUQVRFX1QgKnN0YXRlLCBNRVNTQUdFX1RYX0NIQU5ORUxfVCBjaGFubmVsLCBpbnQzMl90IGVuYWJsZSk7CisKKy8vIGFsbG9jYXRlIG1lbW9yeSBzdWl0YWJseSBhbGlnbmVkIGZvciB0aGlzIGNvbm5lY3Rpb24KK3R5cGVkZWYgdm9pZCAqICgqVkNISV9CVUZGRVJfQUxMT0NBVEUpKFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfaGFuZGxlLCB1aW50MzJfdCAqIGxlbmd0aCk7CisKKy8vIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBidWZmZXJfYWxsb2NhdGUKK3R5cGVkZWYgdm9pZCAgICgqVkNISV9CVUZGRVJfRlJFRSkoVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZV9oYW5kbGUsIHZvaWQgKiBhZGRyZXNzKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgU3lzdGVtIGRyaXZlciBzdHJ1Y3QKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IG9wYXF1ZV92Y2hpX2Nvbm5lY3Rpb25fYXBpX3QKK3sKKyAgIC8vIFJvdXRpbmUgdG8gaW5pdCB0aGUgY29ubmVjdGlvbgorICAgVkNISV9DT05ORUNUSU9OX0lOSVRfVCAgICAgICAgICAgICAgICAgICAgICBpbml0OworCisgICAvLyBDb25uZWN0aW9uLWxldmVsIENSQyBjb250cm9sCisgICBWQ0hJX0NPTk5FQ1RJT05fQ1JDX0NPTlRST0xfVCAgICAgICAgICAgICAgIGNyY19jb250cm9sOworCisgICAvLyBSb3V0aW5lIHRvIGNvbm5lY3QgdG8gb3IgY3JlYXRlIHNlcnZpY2UKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0NPTk5FQ1RfVCAgICAgICAgICAgc2VydmljZV9jb25uZWN0OworCisgICAvLyBSb3V0aW5lIHRvIGRpc2Nvbm5lY3QgZnJvbSBhIHNlcnZpY2UKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0RJU0NPTk5FQ1RfVCAgICAgICAgc2VydmljZV9kaXNjb25uZWN0OworCisgICAvLyBSb3V0aW5lIHRvIHF1ZXVlIGEgbWVzc2FnZQorICAgVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfUVVFVUVfTUVTU0FHRV9UICAgICBzZXJ2aWNlX3F1ZXVlX21zZzsKKworICAgLy8gc2NhdHRlci1nYXRoZXIgKHZlY3RvcikgbWVzc2FnZSBxdWV1ZQorICAgVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfUVVFVUVfTUVTU0FHRVZfVCAgICBzZXJ2aWNlX3F1ZXVlX21zZ3Y7CisKKyAgIC8vIFJvdXRpbmUgdG8gZGVxdWV1ZSBhIG1lc3NhZ2UKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0RFUVVFVUVfTUVTU0FHRV9UICAgc2VydmljZV9kZXF1ZXVlX21zZzsKKworICAgLy8gUm91dGluZSB0byBwZWVrIGF0IGEgbWVzc2FnZQorICAgVkNISV9DT05ORUNUSU9OX1NFUlZJQ0VfUEVFS19NRVNTQUdFX1QgICAgICBzZXJ2aWNlX3BlZWtfbXNnOworCisgICAvLyBSb3V0aW5lIHRvIGhvbGQgYSBtZXNzYWdlCisgICBWQ0hJX0NPTk5FQ1RJT05fU0VSVklDRV9IT0xEX01FU1NBR0VfVCAgICAgIHNlcnZpY2VfaG9sZF9tc2c7CisKKyAgIC8vIFJvdXRpbmUgdG8gaW5pdGlhbGlzZSBhIHJlY2VpdmVkIG1lc3NhZ2UgaXRlcmF0b3IKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWSUNFX0xPT0tBSEVBRF9NRVNTQUdFX1Qgc2VydmljZV9sb29rX2FoZWFkX21zZzsKKworICAgLy8gUm91dGluZSB0byByZWxlYXNlIGEgbWVzc2FnZQorICAgVkNISV9DT05ORUNUSU9OX0hFTERfTVNHX1JFTEVBU0VfVCAgICAgICAgICBoZWxkX21zZ19yZWxlYXNlOworCisgICAvLyBSb3V0aW5lIHRvIGdldCBpbmZvcm1hdGlvbiBvbiBhIGhlbGQgbWVzc2FnZQorICAgVkNISV9DT05ORUNUSU9OX0hFTERfTVNHX0lORk9fVCAgICAgICAgICAgICBoZWxkX21zZ19pbmZvOworCisgICAvLyBSb3V0aW5lIHRvIGNoZWNrIGZvciBuZXh0IG1lc3NhZ2Ugb24gaXRlcmF0b3IKKyAgIFZDSElfQ09OTkVDVElPTl9NU0dfSVRFUl9IQVNfTkVYVF9UICAgICAgICAgbXNnX2l0ZXJfaGFzX25leHQ7CisKKyAgIC8vIFJvdXRpbmUgdG8gZ2V0IG5leHQgbWVzc2FnZSBvbiBpdGVyYXRvcgorICAgVkNISV9DT05ORUNUSU9OX01TR19JVEVSX05FWFRfVCAgICAgICAgICAgICBtc2dfaXRlcl9uZXh0OworCisgICAvLyBSb3V0aW5lIHRvIHJlbW92ZSB0aGUgbGFzdCBtZXNzYWdlIHJldHVybmVkIGJ5IGl0ZXJhdG9yCisgICBWQ0hJX0NPTk5FQ1RJT05fTVNHX0lURVJfUkVNT1ZFX1QgICAgICAgICAgIG1zZ19pdGVyX3JlbW92ZTsKKworICAgLy8gUm91dGluZSB0byBob2xkIHRoZSBsYXN0IG1lc3NhZ2UgcmV0dXJuZWQgYnkgaXRlcmF0b3IKKyAgIFZDSElfQ09OTkVDVElPTl9NU0dfSVRFUl9IT0xEX1QgICAgICAgICAgICAgbXNnX2l0ZXJfaG9sZDsKKworICAgLy8gUm91dGluZSB0byB0cmFuc21pdCBidWxrIGRhdGEKKyAgIFZDSElfQ09OTkVDVElPTl9CVUxLX1FVRVVFX1RSQU5TTUlUX1QgICAgICAgYnVsa19xdWV1ZV90cmFuc21pdDsKKworICAgLy8gUm91dGluZSB0byByZWNlaXZlIGRhdGEKKyAgIFZDSElfQ09OTkVDVElPTl9CVUxLX1FVRVVFX1JFQ0VJVkVfVCAgICAgICAgYnVsa19xdWV1ZV9yZWNlaXZlOworCisgICAvLyBSb3V0aW5lIHRvIHJlcG9ydCB0aGUgYXZhaWxhYmxlIHNlcnZlcnMKKyAgIFZDSElfQ09OTkVDVElPTl9TRVJWRVJfUFJFU0VOVCAgICAgICAgICAgICAgc2VydmVyX3ByZXNlbnQ7CisKKyAgIC8vIFJvdXRpbmUgdG8gcmVwb3J0IHRoZSBudW1iZXIgb2YgUlggc2xvdHMgYXZhaWxhYmxlCisgICBWQ0hJX0NPTk5FQ1RJT05fUlhfU0xPVFNfQVZBSUxBQkxFICAgICAgICAgIGNvbm5lY3Rpb25fcnhfc2xvdHNfYXZhaWxhYmxlOworCisgICAvLyBSb3V0aW5lIHRvIHJlcG9ydCB0aGUgUlggc2xvdCBzaXplCisgICBWQ0hJX0NPTk5FQ1RJT05fUlhfU0xPVF9TSVpFICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25fcnhfc2xvdF9zaXplOworCisgICAvLyBDYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IHRoZSBvdGhlciBzaWRlIGhhcyBhZGRlZCBhIGJ1ZmZlciB0byB0aGUgcnggYnVsayBETUEgRklGTworICAgVkNISV9DT05ORUNUSU9OX1JYX0JVTEtfQlVGRkVSX0FEREVEICAgICAgICByeF9idWxrX2J1ZmZlcl9hZGRlZDsKKworICAgLy8gQ2FsbGJhY2sgdG8gaW5mb3JtIGEgc2VydmljZSB0aGF0IGEgWG9uIG9yIFhvZmYgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZAorICAgVkNISV9DT05ORUNUSU9OX0ZMT1dfQ09OVFJPTCAgICAgICAgICAgICAgICBmbG93X2NvbnRyb2w7CisKKyAgIC8vIENhbGxiYWNrIHRvIGluZm9ybSBhIHNlcnZpY2UgdGhhdCBhIHNlcnZlciBhdmFpbGFibGUgcmVwbHkgbWVzc2FnZSBoYXMgYmVlbiByZWNlaXZlZAorICAgVkNISV9DT05ORUNUSU9OX1NFUlZFUl9BVkFJTEFCTEVfUkVQTFkgICAgICBzZXJ2ZXJfYXZhaWxhYmxlX3JlcGx5OworCisgICAvLyBDYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IGJ1bGsgYXV4aWxpYXJ5IG1lc3NhZ2VzIGhhdmUgYXJyaXZlZAorICAgVkNISV9DT05ORUNUSU9OX0JVTEtfQVVYX1JFQ0VJVkVEICAgICAgICAgICBidWxrX2F1eF9yZWNlaXZlZDsKKworICAgLy8gQ2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCBhIGJ1bGsgYXV4aWxpYXJ5IG1lc3NhZ2UgaGFzIGJlZW4gdHJhbnNtaXR0ZWQKKyAgIFZDSElfQ09OTkVDVElPTl9CVUxLX0FVWF9UUkFOU01JVFRFRCAgICAgICAgYnVsa19hdXhfdHJhbnNtaXR0ZWQ7CisKKyAgIC8vIENhbGxiYWNrIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbm5lY3Rpb24KKyAgIFZDSElfQ09OTkVDVElPTl9JTkZPICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbl9pbmZvOworCisgICAvLyBDYWxsYmFjayB0byBub3RpZnkgdGhhdCBwZWVyIGhhcyByZXF1ZXN0ZWQgZGlzY29ubmVjdAorICAgVkNISV9DT05ORUNUSU9OX0RJU0NPTk5FQ1QgICAgICAgICAgICAgICAgICBkaXNjb25uZWN0OworCisgICAvLyBDYWxsYmFjayB0byBub3RpZnkgdGhhdCBwZWVyIGhhcyByZXF1ZXN0ZWQgcG93ZXIgY2hhbmdlCisgICBWQ0hJX0NPTk5FQ1RJT05fUE9XRVJfQ09OVFJPTCAgICAgICAgICAgICAgIHBvd2VyX2NvbnRyb2w7CisKKyAgIC8vIGFsbG9jYXRlIG1lbW9yeSBzdWl0YWJseSBhbGlnbmVkIGZvciB0aGlzIGNvbm5lY3Rpb24KKyAgIFZDSElfQlVGRkVSX0FMTE9DQVRFICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2FsbG9jYXRlOworCisgICAvLyBmcmVlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYnVmZmVyX2FsbG9jYXRlCisgICBWQ0hJX0JVRkZFUl9GUkVFICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9mcmVlOworCit9OworCitzdHJ1Y3QgdmNoaV9jb25uZWN0aW9uX3QgeworICAgY29uc3QgVkNISV9DT05ORUNUSU9OX0FQSV9UICphcGk7CisgICBWQ0hJX0NPTk5FQ1RJT05fU1RBVEVfVCAgICAgKnN0YXRlOworI2lmZGVmIFZDSElfQ09BUlNFX0xPQ0tJTkcKKyAgIHN0cnVjdCBzZW1hcGhvcmUgICAgICAgICAgICAgc2VtOworI2VuZGlmCit9OworCisKKyNlbmRpZiAvKiBDT05ORUNUSU9OX0hfICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRW5kIG9mIGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL21lc3NhZ2VfZHJpdmVycy9tZXNzYWdlLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS9tZXNzYWdlX2RyaXZlcnMvbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiM2Y3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS9tZXNzYWdlX2RyaXZlcnMvbWVzc2FnZS5oCkBAIC0wLDAgKzEsMjA0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9WQ0hJX01FU1NBR0VfSF8KKyNkZWZpbmUgX1ZDSElfTUVTU0FHRV9IXworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS92Y2hpL3ZjaGlfY2ZnX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW50ZXJmYWNlL3ZjaGkvdmNoaV9jb21tb24uaCIKKworCit0eXBlZGVmIGVudW0gbWVzc2FnZV9ldmVudF90eXBlIHsKKyAgIE1FU1NBR0VfRVZFTlRfTk9ORSwKKyAgIE1FU1NBR0VfRVZFTlRfTk9QLAorICAgTUVTU0FHRV9FVkVOVF9NRVNTQUdFLAorICAgTUVTU0FHRV9FVkVOVF9TTE9UX0NPTVBMRVRFLAorICAgTUVTU0FHRV9FVkVOVF9SWF9CVUxLX1BBVVNFRCwKKyAgIE1FU1NBR0VfRVZFTlRfUlhfQlVMS19DT01QTEVURSwKKyAgIE1FU1NBR0VfRVZFTlRfVFhfQ09NUExFVEUsCisgICBNRVNTQUdFX0VWRU5UX01TR19ESVNDQVJERUQKK30gTUVTU0FHRV9FVkVOVF9UWVBFX1Q7CisKK3R5cGVkZWYgZW51bSB2Y2hpX21zZ19mbGFncworeworICAgVkNISV9NU0dfRkxBR1NfTk9ORSAgICAgICAgICAgICAgICAgID0gMHgwLAorICAgVkNISV9NU0dfRkxBR1NfVEVSTUlOQVRFX0RNQSAgICAgICAgID0gMHgxCit9IFZDSElfTVNHX0ZMQUdTX1Q7CisKK3R5cGVkZWYgZW51bSBtZXNzYWdlX3R4X2NoYW5uZWwKK3sKKyAgIE1FU1NBR0VfVFhfQ0hBTk5FTF9NRVNTQUdFICAgICAgICAgICA9IDAsCisgICBNRVNTQUdFX1RYX0NIQU5ORUxfQlVMSyAgICAgICAgICAgICAgPSAxIC8vIGRyaXZlcnMgbWF5IHByb3ZpZGUgbXVsdGlwbGUgYnVsayBjaGFubmVscywgZnJvbSAxIHVwd2FyZHMKK30gTUVTU0FHRV9UWF9DSEFOTkVMX1Q7CisKKy8vIE1hY3JvcyB1c2VkIGZvciBjeWNsaW5nIHRocm91Z2ggYnVsayBjaGFubmVscworI2RlZmluZSBNRVNTQUdFX1RYX0NIQU5ORUxfQlVMS19QUkVWKGMpIChNRVNTQUdFX1RYX0NIQU5ORUxfQlVMSysoKGMpLU1FU1NBR0VfVFhfQ0hBTk5FTF9CVUxLK1ZDSElfTUFYX0JVTEtfVFhfQ0hBTk5FTFNfUEVSX0NPTk5FQ1RJT04tMSklVkNISV9NQVhfQlVMS19UWF9DSEFOTkVMU19QRVJfQ09OTkVDVElPTikKKyNkZWZpbmUgTUVTU0FHRV9UWF9DSEFOTkVMX0JVTEtfTkVYVChjKSAoTUVTU0FHRV9UWF9DSEFOTkVMX0JVTEsrKChjKS1NRVNTQUdFX1RYX0NIQU5ORUxfQlVMSysxKSVWQ0hJX01BWF9CVUxLX1RYX0NIQU5ORUxTX1BFUl9DT05ORUNUSU9OKQorCit0eXBlZGVmIGVudW0gbWVzc2FnZV9yeF9jaGFubmVsCit7CisgICBNRVNTQUdFX1JYX0NIQU5ORUxfTUVTU0FHRSAgICAgICAgICAgPSAwLAorICAgTUVTU0FHRV9SWF9DSEFOTkVMX0JVTEsgICAgICAgICAgICAgID0gMSAvLyBkcml2ZXJzIG1heSBwcm92aWRlIG11bHRpcGxlIGJ1bGsgY2hhbm5lbHMsIGZyb20gMSB1cHdhcmRzCit9IE1FU1NBR0VfUlhfQ0hBTk5FTF9UOworCisvLyBNZXNzYWdlIHJlY2VpdmUgc2xvdCBpbmZvcm1hdGlvbgordHlwZWRlZiBzdHJ1Y3QgcnhfbXNnX3Nsb3RfaW5mbyB7CisKKyAgIHN0cnVjdCByeF9tc2dfc2xvdF9pbmZvICpuZXh0OworICAgLy9zdHJ1Y3Qgc2xvdF9pbmZvICpwcmV2OworI2lmICFkZWZpbmVkIFZDSElfQ09BUlNFX0xPQ0tJTkcKKyAgIHN0cnVjdCBzZW1hcGhvcmUgICBzZW07CisjZW5kaWYKKworICAgdWludDhfdCAgICAgICAgICAgKmFkZHI7ICAgICAgICAgICAgICAgLy8gYmFzZSBhZGRyZXNzIG9mIHNsb3QKKyAgIHVpbnQzMl90ICAgICAgICAgICBsZW47ICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBvZiBzbG90IGluIGJ5dGVzCisKKyAgIHVpbnQzMl90ICAgICAgICAgICB3cml0ZV9wdHI7ICAgICAgICAgIC8vIGhhcmR3YXJlIGNhdXNlcyB0aGlzIHRvIGFkdmFuY2UKKyAgIHVpbnQzMl90ICAgICAgICAgICByZWFkX3B0cjsgICAgICAgICAgIC8vIHRoaXMgbW9kdWxlIGRvZXMgdGhlIHJlYWRpbmcKKyAgIGludCAgICAgICAgICAgICAgICBhY3RpdmU7ICAgICAgICAgICAgIC8vIGlzIHRoaXMgc2xvdCBpbiB0aGUgaGFyZHdhcmUgZG1hIGZpZm8/CisgICB1aW50MzJfdCAgICAgICAgICAgbXNnc19wYXJzZWQ7ICAgICAgICAvLyBjb3VudCBob3cgbWFueSBtZXNzYWdlcyBhcmUgaW4gdGhpcyBzbG90CisgICB1aW50MzJfdCAgICAgICAgICAgbXNnc19yZWxlYXNlZDsgICAgICAvLyBob3cgbWFueSBtZXNzYWdlcyBoYXZlIGJlZW4gcmVsZWFzZWQKKyAgIHZvaWQgICAgICAgICAgICAgICpzdGF0ZTsgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gc3RhdGUgaW5mb3JtYXRpb24KKyAgIHVpbnQ4X3QgICAgICAgICAgICByZWZfY291bnRbVkNISV9NQVhfU0VSVklDRVNfUEVSX0NPTk5FQ1RJT05dOyAgICAgICAgICAvLyByZWZlcmVuY2UgY291bnQgZm9yIHNsb3RzIGhlbGQgYnkgc2VydmljZXMKK30gUlhfTVNHX1NMT1RJTkZPX1Q7CisKKy8vIFRoZSBtZXNzYWdlIGRyaXZlciBubyBsb25nZXIgbmVlZHMgdG8ga25vdyBhYm91dCB0aGUgZmllbGRzIG9mIFJYX0JVTEtfU0xPVElORk9fVCAtIHNvcnQgdGhpcyBvdXQuCisvLyBJbiBwYXJ0aWN1bGFyLCBpdCBtdXN0bid0IHVzZSBhZGRyIGFuZCBsZW4gLSB0aGV5J3JlIHRoZSBjbGllbnQgYnVmZmVyLCBidXQgdGhlIG1lc3NhZ2UKKy8vIGRyaXZlciB3aWxsIGJlIHRhc2tlZCB3aXRoIHNlbmRpbmcgdGhlIGFsaWduZWQgY29yZSBzZWN0aW9uLgordHlwZWRlZiBzdHJ1Y3QgcnhfYnVsa19zbG90aW5mb190IHsKKyAgIHN0cnVjdCByeF9idWxrX3Nsb3RpbmZvX3QgKm5leHQ7CisKKyAgIHN0cnVjdCBzZW1hcGhvcmUgKmJsb2NraW5nOworCisgICAvLyBuZWVkZWQgYnkgRE1BCisgICB2b2lkICAgICAgICAqYWRkcjsKKyAgIHVpbnQzMl90ICAgICBsZW47CisKKyAgIC8vIG5lZWRlZCBmb3IgdGhlIGNhbGxiYWNrCisgICB2b2lkICAgICAgICAqc2VydmljZTsKKyAgIHZvaWQgICAgICAgICpoYW5kbGU7CisgICBWQ0hJX0ZMQUdTX1QgZmxhZ3M7Cit9IFJYX0JVTEtfU0xPVElORk9fVDsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBlYWNoIGNvbm5lY3Rpb24gZHJpdmVyIHdpbGwgaGF2ZSBhIHBvb2wgb2YgdGhlIGZvbGxvd2luZyBzdHJ1Y3QuCisgKgorICogdGhlIHBvb2wgd2lsbCBiZSBtYW5hZ2VkIGJ5IHZjaGlfcW1hbl8qCisgKiB0aGlzIG1lYW5zIHRoZXJlIHdpbGwgYmUgbXVsdGlwbGUgcXVldWVzIChzaW5nbGUgbGlua2VkIGxpc3RzKQorICogYSBnaXZlbiBzdHJ1Y3QgbWVzc2FnZV9pbmZvIHdpbGwgYmUgb24gZXhhY3RseSBvbmUgb2YgdGhlc2UgcXVldWVzCisgKiBhdCBhbnkgb25lIHRpbWUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit0eXBlZGVmIHN0cnVjdCByeF9tZXNzYWdlX2luZm8geworCisgICBzdHJ1Y3QgbWVzc2FnZV9pbmZvICpuZXh0OworICAgLy9zdHJ1Y3QgbWVzc2FnZV9pbmZvICpwcmV2OworCisgICB1aW50OF90ICAgICphZGRyOworICAgdWludDMyX3QgICBsZW47CisgICBSWF9NU0dfU0xPVElORk9fVCAqc2xvdDsgLy8gcG9pbnRzIHRvIHdoaWNoZXZlciBzbG90IGNvbnRhaW5zIHRoaXMgbWVzc2FnZQorICAgdWludDMyX3QgICB0eF90aW1lc3RhbXA7CisgICB1aW50MzJfdCAgIHJ4X3RpbWVzdGFtcDsKKworfSBSWF9NRVNTQUdFX0lORk9fVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgTUVTU0FHRV9FVkVOVF9UWVBFX1QgdHlwZTsKKworICAgc3RydWN0IHsKKyAgICAgIC8vIGZvciBtZXNzYWdlcworICAgICAgdm9pZCAgICAqYWRkcjsgICAgICAgICAgIC8vIGFkZHJlc3Mgb2YgbWVzc2FnZQorICAgICAgdWludDE2X3Qgc2xvdF9kZWx0YTsgICAgIC8vIHdoZXRoZXIgdGhpcyBtZXNzYWdlIGluZGljYXRlZCBzbG90IGRlbHRhCisgICAgICB1aW50MzJfdCBsZW47ICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIG1lc3NhZ2UKKyAgICAgIFJYX01TR19TTE9USU5GT19UICpzbG90OyAvLyBzbG90IHRoaXMgbWVzc2FnZSBpcyBpbgorICAgICAgaW50MzJfdCAgc2VydmljZTsgICAvLyBzZXJ2aWNlIGlkIHRoaXMgbWVzc2FnZSBpcyBkZXN0aW5lZCBmb3IKKyAgICAgIHVpbnQzMl90IHR4X3RpbWVzdGFtcDsgICAvLyB0aW1lc3RhbXAgZnJvbSB0aGUgaGVhZGVyCisgICAgICB1aW50MzJfdCByeF90aW1lc3RhbXA7ICAgLy8gdGltZXN0YW1wIHdoZW4gd2UgcGFyc2VkIGl0CisgICB9IG1lc3NhZ2U7CisKKyAgIC8vIEZJWE1FOiBjbGVhbnVwIHNsb3QgcmVwb3J0aW5nLi4uCisgICBSWF9NU0dfU0xPVElORk9fVCAqcnhfbXNnOworICAgUlhfQlVMS19TTE9USU5GT19UICpyeF9idWxrOworICAgdm9pZCAqdHhfaGFuZGxlOworICAgTUVTU0FHRV9UWF9DSEFOTkVMX1QgdHhfY2hhbm5lbDsKKworfSBNRVNTQUdFX0VWRU5UX1Q7CisKKworLy8gY2FsbGJhY2tzCit0eXBlZGVmIHZvaWQgVkNISV9NRVNTQUdFX0RSSVZFUl9FVkVOVF9DQUxMQkFDS19UKCB2b2lkICpzdGF0ZSApOworCit0eXBlZGVmIHN0cnVjdCB7CisgICBWQ0hJX01FU1NBR0VfRFJJVkVSX0VWRU5UX0NBTExCQUNLX1QgKmV2ZW50X2NhbGxiYWNrOworfSBWQ0hJX01FU1NBR0VfRFJJVkVSX09QRU5fVDsKKworCisvLyBoYW5kbGUgdG8gdGhpcyBpbnN0YW5jZSBvZiBtZXNzYWdlIGRyaXZlciAoYXMgcmV0dXJuZWQgYnkgLT5vcGVuKQordHlwZWRlZiBzdHJ1Y3Qgb3BhcXVlX21oYW5kbGVfdCAqVkNISV9NRFJJVkVSX0hBTkRMRV9UOworCitzdHJ1Y3Qgb3BhcXVlX3ZjaGlfbWVzc2FnZV9kcml2ZXJfdCB7CisgICBWQ0hJX01EUklWRVJfSEFORExFX1QgKigqb3BlbikoIFZDSElfTUVTU0FHRV9EUklWRVJfT1BFTl9UICpwYXJhbXMsIHZvaWQgKnN0YXRlICk7CisgICBpbnQzMl90ICgqc3VzcGVuZGluZykoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlICk7CisgICBpbnQzMl90ICgqcmVzdW1lZCkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlICk7CisgICBpbnQzMl90ICgqcG93ZXJfY29udHJvbCkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBNRVNTQUdFX1RYX0NIQU5ORUxfVCwgaW50MzJfdCBlbmFibGUgKTsKKyAgIGludDMyX3QgKCphZGRfbXNnX3J4X3Nsb3QpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgUlhfTVNHX1NMT1RJTkZPX1QgKnNsb3QgKTsgICAgICAvLyByeCBtZXNzYWdlCisgICBpbnQzMl90ICgqYWRkX2J1bGtfcngpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgdm9pZCAqZGF0YSwgdWludDMyX3QgbGVuLCBSWF9CVUxLX1NMT1RJTkZPX1QgKnNsb3QgKTsgIC8vIHJ4IGRhdGEgKGJ1bGspCisgICBpbnQzMl90ICgqc2VuZCkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBNRVNTQUdFX1RYX0NIQU5ORUxfVCBjaGFubmVsLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4sIFZDSElfTVNHX0ZMQUdTX1QgZmxhZ3MsIHZvaWQgKnNlbmRfaGFuZGxlICk7ICAgICAgLy8gdHggKG1lc3NhZ2UgJiBidWxrKQorICAgdm9pZCAgICAoKm5leHRfZXZlbnQpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgTUVTU0FHRV9FVkVOVF9UICpldmVudCApOyAgICAgLy8gZ2V0IHRoZSBuZXh0IGV2ZW50IGZyb20gbWVzc2FnZV9kcml2ZXIKKyAgIGludDMyX3QgKCplbmFibGUpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSApOworICAgaW50MzJfdCAoKmZvcm1fbWVzc2FnZSkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBpbnQzMl90IHNlcnZpY2VfaWQsIFZDSElfTVNHX1ZFQ1RPUl9UICp2ZWN0b3IsIHVpbnQzMl90IGNvdW50LCB2b2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFkZHJlc3MsIHVpbnQzMl90IGxlbmd0aF9hdmFpbCwgdWludDMyX3QgbWF4X3RvdGFsX2xlbmd0aCwgaW50MzJfdCBwYWRfdG9fZmlsbCwgaW50MzJfdCBhbGxvd19wYXJ0aWFsICk7CisKKyAgIGludDMyX3QgKCp1cGRhdGVfbWVzc2FnZSkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCB2b2lkICpkZXN0LCBpbnQxNl90ICpzbG90X2NvdW50ICk7CisgICBpbnQzMl90ICgqYnVmZmVyX2FsaWduZWQpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgaW50IHR4LCBpbnQgdW5jYWNoZWQsIGNvbnN0IHZvaWQgKmFkZHJlc3MsIGNvbnN0IHVpbnQzMl90IGxlbmd0aCApOworICAgdm9pZCAqICAoKmFsbG9jYXRlX2J1ZmZlcikoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCB1aW50MzJfdCAqbGVuZ3RoICk7CisgICB2b2lkICAgICgqZnJlZV9idWZmZXIpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgdm9pZCAqYWRkcmVzcyApOworICAgaW50ICAgICAoKnJ4X3Nsb3Rfc2l6ZSkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBpbnQgbXNnX3NpemUgKTsKKyAgIGludCAgICAgKCp0eF9zbG90X3NpemUpKCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgaW50IG1zZ19zaXplICk7CisKKyAgIGludDMyX3QgICgqdHhfc3VwcG9ydHNfdGVybWluYXRlKSggY29uc3QgVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUsIE1FU1NBR0VfVFhfQ0hBTk5FTF9UIGNoYW5uZWwgKTsKKyAgIHVpbnQzMl90ICgqdHhfYnVsa19jaHVua19zaXplKSggY29uc3QgVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUsIE1FU1NBR0VfVFhfQ0hBTk5FTF9UIGNoYW5uZWwgKTsKKyAgIGludCAgICAgKCp0eF9hbGlnbm1lbnQpKCBjb25zdCBWQ0hJX01EUklWRVJfSEFORExFX1QgKmhhbmRsZSwgTUVTU0FHRV9UWF9DSEFOTkVMX1QgY2hhbm5lbCApOworICAgaW50ICAgICAoKnJ4X2FsaWdubWVudCkoIGNvbnN0IFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBNRVNTQUdFX1JYX0NIQU5ORUxfVCBjaGFubmVsICk7CisgICB2b2lkICAgICgqZm9ybV9idWxrX2F1eCkoIFZDSElfTURSSVZFUl9IQU5ETEVfVCAqaGFuZGxlLCBNRVNTQUdFX1RYX0NIQU5ORUxfVCBjaGFubmVsLCBjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBsZW4sIHVpbnQzMl90IGNodW5rX3NpemUsIGNvbnN0IHZvaWQgKiphdXhfZGF0YSwgaW50MzJfdCAqYXV4X2xlbiApOworICAgdm9pZCAgICAoKmRlYnVnKSggVkNISV9NRFJJVkVSX0hBTkRMRV9UICpoYW5kbGUgKTsKK307CisKKworI2VuZGlmIC8vIF9WQ0hJX01FU1NBR0VfSF8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGkuaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjE3ZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaS5oCkBAIC0wLDAgKzEsMzc4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElfSF8KKyNkZWZpbmUgVkNISV9IXworCisjaW5jbHVkZSAiaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmcuaCIKKyNpbmNsdWRlICJpbnRlcmZhY2UvdmNoaS92Y2hpX2NvbW1vbi5oIgorI2luY2x1ZGUgImludGVyZmFjZS92Y2hpL2Nvbm5lY3Rpb25zL2Nvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJ2Y2hpX21oLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEdsb2JhbCBkZWZzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVkNISV9CVUxLX1JPVU5EX1VQKHgpICAgICAoKCgodW5zaWduZWQgbG9uZykoeCkpK1ZDSElfQlVMS19BTElHTi0xKSAmIH4oVkNISV9CVUxLX0FMSUdOLTEpKQorI2RlZmluZSBWQ0hJX0JVTEtfUk9VTkRfRE9XTih4KSAgICgoKHVuc2lnbmVkIGxvbmcpKHgpKSAmIH4oVkNISV9CVUxLX0FMSUdOLTEpKQorI2RlZmluZSBWQ0hJX0JVTEtfQUxJR05fTkJZVEVTKHgpIChWQ0hJX0JVTEtfQUxJR05FRCh4KSA/IDAgOiAoVkNISV9CVUxLX0FMSUdOIC0gKCh1bnNpZ25lZCBsb25nKSh4KSAmIChWQ0hJX0JVTEtfQUxJR04tMSkpKSkKKworI2lmZGVmIFVTRV9WQ0hJUV9BUk0KKyNkZWZpbmUgVkNISV9CVUxLX0FMSUdORUQoeCkgICAgICAxCisjZWxzZQorI2RlZmluZSBWQ0hJX0JVTEtfQUxJR05FRCh4KSAgICAgICgoKHVuc2lnbmVkIGxvbmcpKHgpICYgKFZDSElfQlVMS19BTElHTi0xKSkgPT0gMCkKKyNlbmRpZgorCitzdHJ1Y3QgdmNoaV92ZXJzaW9uIHsKKwl1aW50MzJfdCB2ZXJzaW9uOworCXVpbnQzMl90IHZlcnNpb25fbWluOworfTsKKyNkZWZpbmUgVkNISV9WRVJTSU9OKHZfKSB7IHZfLCB2XyB9CisjZGVmaW5lIFZDSElfVkVSU0lPTl9FWCh2XywgbV8pIHsgdl8sIG1fIH0KKwordHlwZWRlZiBlbnVtCit7CisgICBWQ0hJX1ZFQ19QT0lOVEVSLAorICAgVkNISV9WRUNfSEFORExFLAorICAgVkNISV9WRUNfTElTVAorfSBWQ0hJX01TR19WRUNUT1JfVFlQRV9UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpX21zZ192ZWN0b3JfZXggeworCisgICBWQ0hJX01TR19WRUNUT1JfVFlQRV9UIHR5cGU7CisgICB1bmlvbgorICAgeworICAgICAgLy8gYSBtZW1vcnkgaGFuZGxlCisgICAgICBzdHJ1Y3QKKyAgICAgIHsKKyAgICAgICAgIFZDSElfTUVNX0hBTkRMRV9UIGhhbmRsZTsKKyAgICAgICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICAgICAgIGludDMyX3QgdmVjX2xlbjsKKyAgICAgIH0gaGFuZGxlOworCisgICAgICAvLyBhbiBvcmRpbmFyeSBkYXRhIHBvaW50ZXIKKyAgICAgIHN0cnVjdAorICAgICAgeworICAgICAgICAgY29uc3Qgdm9pZCAqdmVjX2Jhc2U7CisgICAgICAgICBpbnQzMl90IHZlY19sZW47CisgICAgICB9IHB0cjsKKworICAgICAgLy8gYSBuZXN0ZWQgdmVjdG9yIGxpc3QKKyAgICAgIHN0cnVjdAorICAgICAgeworICAgICAgICAgc3RydWN0IHZjaGlfbXNnX3ZlY3Rvcl9leCAqdmVjOworICAgICAgICAgdWludDMyX3QgdmVjX2xlbjsKKyAgICAgIH0gbGlzdDsKKyAgIH0gdTsKK30gVkNISV9NU0dfVkVDVE9SX0VYX1Q7CisKKworLy8gQ29uc3RydWN0IGFuIGVudHJ5IGluIGEgbXNnIHZlY3RvciBmb3IgYSBwb2ludGVyIChwKSBvZiBsZW5ndGggKGwpCisjZGVmaW5lIFZDSElfVkVDX1BPSU5URVIocCxsKSAgVkNISV9WRUNfUE9JTlRFUiwgeyB7IChWQ0hJX01FTV9IQU5ETEVfVCkocCksIChsKSB9IH0KKworLy8gQ29uc3RydWN0IGFuIGVudHJ5IGluIGEgbXNnIHZlY3RvciBmb3IgYSBtZXNzYWdlIGhhbmRsZSAoaCksIHN0YXJ0aW5nIGF0IG9mZnNldCAobykgb2YgbGVuZ3RoIChsKQorI2RlZmluZSBWQ0hJX1ZFQ19IQU5ETEUoaCxvLGwpIFZDSElfVkVDX0hBTkRMRSwgIHsgeyAoaCksIChvKSwgKGwpIH0gfQorCisvLyBNYWNyb3MgdG8gbWFuaXB1bGF0ZSAnRk9VUkNDJyB2YWx1ZXMKKyNkZWZpbmUgTUFLRV9GT1VSQ0MoeCkgKChpbnQzMl90KSggKHhbMF0gPDwgMjQpIHwgKHhbMV0gPDwgMTYpIHwgKHhbMl0gPDwgOCkgfCB4WzNdICkpCisjZGVmaW5lIEZPVVJDQ19UT19DSEFSKHgpICh4ID4+IDI0KSAmIDB4RkYsKHggPj4gMTYpICYgMHhGRiwoeCA+PiA4KSAmIDB4RkYsIHggJiAweEZGCisKKworLy8gT3BhcXVlIHNlcnZpY2UgaW5mb3JtYXRpb24KK3N0cnVjdCBvcGFxdWVfdmNoaV9zZXJ2aWNlX3Q7CisKKy8vIERlc2NyaXB0b3IgZm9yIGEgaGVsZCBtZXNzYWdlLiBBbGxvY2F0ZWQgYnkgY2xpZW50LCBpbml0aWFsaXNlZCBieSB2Y2hpX21zZ19ob2xkLAorLy8gdmNoaV9tc2dfaXRlcl9ob2xkIG9yIHZjaGlfbXNnX2l0ZXJfaG9sZF9uZXh0LiBGaWVsZHMgYXJlIGZvciBpbnRlcm5hbCBWQ0hJIHVzZSBvbmx5LgordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgIHN0cnVjdCBvcGFxdWVfdmNoaV9zZXJ2aWNlX3QgKnNlcnZpY2U7CisgICB2b2lkICptZXNzYWdlOworfSBWQ0hJX0hFTERfTVNHX1Q7CisKKworCisvLyBzdHJ1Y3R1cmUgdXNlZCB0byBwcm92aWRlIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gb3BlbiBhIHNlcnZlciBvciBhIGNsaWVudAordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCB2Y2hpX3ZlcnNpb24gdmVyc2lvbjsKKwlpbnQzMl90IHNlcnZpY2VfaWQ7CisJVkNISV9DT05ORUNUSU9OX1QgKmNvbm5lY3Rpb247CisJdWludDMyX3QgcnhfZmlmb19zaXplOworCXVpbnQzMl90IHR4X2ZpZm9fc2l6ZTsKKwlWQ0hJX0NBTExCQUNLX1QgY2FsbGJhY2s7CisJdm9pZCAqY2FsbGJhY2tfcGFyYW07CisJLyogY2xpZW50IGludGVuZHMgdG8gcmVjZWl2ZSBidWxrIHRyYW5zZmVycyBvZgorCQlvZGQgbGVuZ3RocyBvciBpbnRvIHVuYWxpZ25lZCBidWZmZXJzICovCisJaW50MzJfdCB3YW50X3VuYWxpZ25lZF9idWxrX3J4OworCS8qIGNsaWVudCBpbnRlbmRzIHRvIHRyYW5zbWl0IGJ1bGsgdHJhbnNmZXJzIG9mCisJCW9kZCBsZW5ndGhzIG9yIG91dCBvZiB1bmFsaWduZWQgYnVmZmVycyAqLworCWludDMyX3Qgd2FudF91bmFsaWduZWRfYnVsa190eDsKKwkvKiBjbGllbnQgd2FudHMgdG8gY2hlY2sgQ1JDcyBvbiAoYnVsaykgeGZlcnMuCisJCU9ubHkgbmVlZHMgdG8gYmUgc2V0IGF0IDEgZW5kIC0gd2lsbCBkbyBib3RoIGRpcmVjdGlvbnMuICovCisJaW50MzJfdCB3YW50X2NyYzsKK30gU0VSVklDRV9DUkVBVElPTl9UOworCisvLyBPcGFxdWUgaGFuZGxlIGZvciBhIFZDSEkgaW5zdGFuY2UKK3R5cGVkZWYgc3RydWN0IG9wYXF1ZV92Y2hpX2luc3RhbmNlX2hhbmRsZV90ICpWQ0hJX0lOU1RBTkNFX1Q7CisKKy8vIE9wYXF1ZSBoYW5kbGUgZm9yIGEgc2VydmVyIG9yIGNsaWVudAordHlwZWRlZiBzdHJ1Y3Qgb3BhcXVlX3ZjaGlfc2VydmljZV9oYW5kbGVfdCAqVkNISV9TRVJWSUNFX0hBTkRMRV9UOworCisvLyBTZXJ2aWNlIHJlZ2lzdHJhdGlvbiAmIHN0YXJ0dXAKK3R5cGVkZWYgdm9pZCAoKlZDSElfU0VSVklDRV9JTklUKShWQ0hJX0lOU1RBTkNFX1QgaW5pdGlhbGlzZV9pbnN0YW5jZSwgVkNISV9DT05ORUNUSU9OX1QgKipjb25uZWN0aW9ucywgdWludDMyX3QgbnVtX2Nvbm5lY3Rpb25zKTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2VydmljZV9pbmZvX3RhZyB7CisgICBjb25zdCBjaGFyICogY29uc3QgdmxsX2ZpbGVuYW1lOyAvKiBWTEwgdG8gbG9hZCB0byBzdGFydCB0aGlzIHNlcnZpY2UuIFRoaXMgaXMgYW4gZW1wdHkgc3RyaW5nIGlmIFZMTCBpcyAic3RhdGljIiAqLworICAgVkNISV9TRVJWSUNFX0lOSVQgaW5pdDsgICAgICAgICAgLyogU2VydmljZSBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiAqLworICAgdm9pZCAqdmxsX2hhbmRsZTsgICAgICAgICAgICAgICAgLyogVkxMIGhhbmRsZTsgTlVMTCB3aGVuIHVubG9hZGVkIG9yIGEgInN0YXRpYyBWTEwiIGluIGJ1aWxkICovCit9IFNFUlZJQ0VfSU5GT19UOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgR2xvYmFsIGZ1bmNzIC0gaW1wbGVtZW50YXRpb24gaXMgc3BlY2lmaWMgdG8gd2hpY2ggc2lkZSB5b3UgYXJlIG9uIChsb2NhbCAvIHJlbW90ZSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitleHRlcm4gLypAb2JzZXJ2ZXJAKi8gVkNISV9DT05ORUNUSU9OX1QgKiB2Y2hpX2NyZWF0ZV9jb25uZWN0aW9uKCBjb25zdCBWQ0hJX0NPTk5FQ1RJT05fQVBJX1QgKiBmdW5jdGlvbl90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZDSElfTUVTU0FHRV9EUklWRVJfVCAqIGxvd19sZXZlbCk7CisKKworLy8gUm91dGluZSB1c2VkIHRvIGluaXRpYWxpc2UgdGhlIHZjaGkgb24gYm90aCBsb2NhbCArIHJlbW90ZSBjb25uZWN0aW9ucworZXh0ZXJuIGludDMyX3QgdmNoaV9pbml0aWFsaXNlKCBWQ0hJX0lOU1RBTkNFX1QgKmluc3RhbmNlX2hhbmRsZSApOworCitleHRlcm4gaW50MzJfdCB2Y2hpX2V4aXQoIHZvaWQgKTsKKworZXh0ZXJuIGludDMyX3QgdmNoaV9jb25uZWN0KCBWQ0hJX0NPTk5FQ1RJT05fVCAqKmNvbm5lY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBudW1fY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUgKTsKKworLy9XaGVuIHRoaXMgaXMgY2FsbGVkLCBlbnN1cmUgdGhhdCBhbGwgc2VydmljZXMgaGF2ZSBubyBkYXRhIHBlbmRpbmcuCisvL0J1bGsgdHJhbnNmZXJzIGNhbiByZW1haW4gJ3F1ZXVlZCcKK2V4dGVybiBpbnQzMl90IHZjaGlfZGlzY29ubmVjdCggVkNISV9JTlNUQU5DRV9UIGluc3RhbmNlX2hhbmRsZSApOworCisvLyBHbG9iYWwgY29udHJvbCBvdmVyIGJ1bGsgQ1JDIGNoZWNraW5nCitleHRlcm4gaW50MzJfdCB2Y2hpX2NyY19jb250cm9sKCBWQ0hJX0NPTk5FQ1RJT05fVCAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfQ1JDX0NPTlRST0xfVCBjb250cm9sICk7CisKKy8vIGhlbHBlciBmdW5jdGlvbnMKK2V4dGVybiB2b2lkICogdmNoaV9hbGxvY2F0ZV9idWZmZXIoVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgdWludDMyX3QgKmxlbmd0aCk7CitleHRlcm4gdm9pZCB2Y2hpX2ZyZWVfYnVmZmVyKFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIHZvaWQgKmFkZHJlc3MpOworZXh0ZXJuIHVpbnQzMl90IHZjaGlfY3VycmVudF90aW1lKFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBHbG9iYWwgc2VydmljZSBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFJvdXRpbmUgdG8gY3JlYXRlIGEgbmFtZWQgc2VydmljZQorZXh0ZXJuIGludDMyX3QgdmNoaV9zZXJ2aWNlX2NyZWF0ZSggVkNISV9JTlNUQU5DRV9UIGluc3RhbmNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFUlZJQ0VfQ1JFQVRJT05fVCAqc2V0dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgKmhhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIGRlc3RvcnkgYSBzZXJ2aWNlCitleHRlcm4gaW50MzJfdCB2Y2hpX3NlcnZpY2VfZGVzdHJveSggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIG9wZW4gYSBuYW1lZCBzZXJ2aWNlCitleHRlcm4gaW50MzJfdCB2Y2hpX3NlcnZpY2Vfb3BlbiggVkNISV9JTlNUQU5DRV9UIGluc3RhbmNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVJWSUNFX0NSRUFUSU9OX1QgKnNldHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfU0VSVklDRV9IQU5ETEVfVCAqaGFuZGxlKTsKKworZXh0ZXJuIGludDMyX3QgdmNoaV9nZXRfcGVlcl92ZXJzaW9uKCBjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAqcGVlcl92ZXJzaW9uICk7CisKKy8vIFJvdXRpbmUgdG8gY2xvc2UgYSBuYW1lZCBzZXJ2aWNlCitleHRlcm4gaW50MzJfdCB2Y2hpX3NlcnZpY2VfY2xvc2UoIGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUgKTsKKworLy8gUm91dGluZSB0byBpbmNyZW1lbnQgcmVmIGNvdW50IG9uIGEgbmFtZWQgc2VydmljZQorZXh0ZXJuIGludDMyX3QgdmNoaV9zZXJ2aWNlX3VzZSggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIGRlY3JlbWVudCByZWYgY291bnQgb24gYSBuYW1lZCBzZXJ2aWNlCitleHRlcm4gaW50MzJfdCB2Y2hpX3NlcnZpY2VfcmVsZWFzZSggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIHNldCBhIGNvbnRyb2wgb3B0aW9uIGZvciBhIG5hbWVkIHNlcnZpY2UKK2V4dGVybiBpbnQzMl90IHZjaGlfc2VydmljZV9zZXRfb3B0aW9uKCBjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCQkJCQlWQ0hJX1NFUlZJQ0VfT1BUSU9OX1Qgb3B0aW9uLAorCQkJCQlpbnQgdmFsdWUpOworCisvLyBSb3V0aW5lIHRvIHNlbmQgYSBtZXNzYWdlIGFjcm9zcyBhIHNlcnZpY2UKK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX3F1ZXVlKCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2dfaGFuZGxlICk7CisKKy8vIHNjYXR0ZXItZ2F0aGVyICh2ZWN0b3IpIGFuZCBzZW5kIG1lc3NhZ2UKK2ludDMyX3QgdmNoaV9tc2dfcXVldWV2X2V4KCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfTVNHX1ZFQ1RPUl9FWF9UICp2ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZ19oYW5kbGUgKTsKKworLy8gbGVnYWN5IHNjYXR0ZXItZ2F0aGVyICh2ZWN0b3IpIGFuZCBzZW5kIG1lc3NhZ2UsIG9ubHkgaGFuZGxlcyBwb2ludGVycworaW50MzJfdCB2Y2hpX21zZ19xdWV1ZXYoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9NU0dfVkVDVE9SX1QgKnZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnX2hhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIHJlY2VpdmUgYSBtc2cgZnJvbSBhIHNlcnZpY2UKKy8vIERlcXVldWUgaXMgZXF1aXZhbGVudCB0byBob2xkLCBjb3B5IGludG8gY2xpZW50IGJ1ZmZlciwgcmVsZWFzZQorZXh0ZXJuIGludDMyX3QgdmNoaV9tc2dfZGVxdWV1ZSggVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXhfZGF0YV9zaXplX3RvX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqYWN0dWFsX21zZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzICk7CisKKy8vIFJvdXRpbmUgdG8gbG9vayBhdCBhIG1lc3NhZ2UgaW4gcGxhY2UuCisvLyBUaGUgbWVzc2FnZSBpcyBub3QgZGVxdWV1ZWQsIHNvIGEgc3Vic2VxdWVudCBjYWxsIHRvIHBlZWsgb3IgZGVxdWV1ZQorLy8gd2lsbCByZXR1cm4gdGhlIHNhbWUgbWVzc2FnZS4KK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX3BlZWsoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICptc2dfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncyApOworCisvLyBSb3V0aW5lIHRvIHJlbW92ZSBhIG1lc3NhZ2UgYWZ0ZXIgaXQgaGFzIGJlZW4gcmVhZCBpbiBwbGFjZSB3aXRoIHBlZWsKKy8vIFRoZSBmaXJzdCBtZXNzYWdlIG9uIHRoZSBxdWV1ZSBpcyBkZXF1ZXVlZC4KK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX3JlbW92ZSggVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSApOworCisvLyBSb3V0aW5lIHRvIGxvb2sgYXQgYSBtZXNzYWdlIGluIHBsYWNlLgorLy8gVGhlIG1lc3NhZ2UgaXMgZGVxdWV1ZWQsIHNvIHRoZSBjYWxsZXIgaXMgbGVmdCBob2xkaW5nIGl0OyB0aGUgZGVzY3JpcHRvciBpcworLy8gZmlsbGVkIGluIGFuZCBtdXN0IGJlIHJlbGVhc2VkIHdoZW4gdGhlIHVzZXIgaGFzIGZpbmlzaGVkIHdpdGggdGhlIG1lc3NhZ2UuCitleHRlcm4gaW50MzJfdCB2Y2hpX21zZ19ob2xkKCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmRhdGEsICAgICAgICAvLyB9IG1heSBiZSBOVUxMLCBhcyBpbmZvIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1zZ19zaXplLCAvLyB9IG9idGFpbmVkIGZyb20gSEVMRF9NU0dfVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9IRUxEX01TR19UICptZXNzYWdlX2Rlc2NyaXB0b3IgKTsKKworLy8gSW5pdGlhbGlzZSBhbiBpdGVyYXRvciB0byBsb29rIHRocm91Z2ggbWVzc2FnZXMgaW4gcGxhY2UKK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX2xvb2tfYWhlYWQoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX01TR19JVEVSX1QgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEdsb2JhbCBzZXJ2aWNlIHN1cHBvcnQgQVBJIC0gb3BlcmF0aW9ucyBvbiBoZWxkIG1lc3NhZ2VzIGFuZCBtZXNzYWdlIGl0ZXJhdG9ycworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBSb3V0aW5lIHRvIGdldCB0aGUgYWRkcmVzcyBvZiBhIGhlbGQgbWVzc2FnZQorZXh0ZXJuIHZvaWQgKnZjaGlfaGVsZF9tc2dfcHRyKCBjb25zdCBWQ0hJX0hFTERfTVNHX1QgKm1lc3NhZ2UgKTsKKworLy8gUm91dGluZSB0byBnZXQgdGhlIHNpemUgb2YgYSBoZWxkIG1lc3NhZ2UKK2V4dGVybiBpbnQzMl90IHZjaGlfaGVsZF9tc2dfc2l6ZSggY29uc3QgVkNISV9IRUxEX01TR19UICptZXNzYWdlICk7CisKKy8vIFJvdXRpbmUgdG8gZ2V0IHRoZSB0cmFuc21pdCB0aW1lc3RhbXAgYXMgd3JpdHRlbiBpbnRvIHRoZSBoZWFkZXIgYnkgdGhlIHBlZXIKK2V4dGVybiB1aW50MzJfdCB2Y2hpX2hlbGRfbXNnX3R4X3RpbWVzdGFtcCggY29uc3QgVkNISV9IRUxEX01TR19UICptZXNzYWdlICk7CisKKy8vIFJvdXRpbmUgdG8gZ2V0IHRoZSByZWNlcHRpb24gdGltZXN0YW1wLCB3cml0dGVuIGFzIHdlIHBhcnNlZCB0aGUgaGVhZGVyCitleHRlcm4gdWludDMyX3QgdmNoaV9oZWxkX21zZ19yeF90aW1lc3RhbXAoIGNvbnN0IFZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZSApOworCisvLyBSb3V0aW5lIHRvIHJlbGVhc2UgYSBoZWxkIG1lc3NhZ2UgYWZ0ZXIgaXQgaGFzIGJlZW4gcHJvY2Vzc2VkCitleHRlcm4gaW50MzJfdCB2Y2hpX2hlbGRfbXNnX3JlbGVhc2UoIFZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZSApOworCisvLyBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaXRlcmF0b3IgaGFzIGEgbmV4dCBtZXNzYWdlLgorZXh0ZXJuIGludDMyX3QgdmNoaV9tc2dfaXRlcl9oYXNfbmV4dCggY29uc3QgVkNISV9NU0dfSVRFUl9UICppdGVyICk7CisKKy8vIFJldHVybiB0aGUgcG9pbnRlciBhbmQgbGVuZ3RoIGZvciB0aGUgbmV4dCBtZXNzYWdlIGFuZCBhZHZhbmNlIHRoZSBpdGVyYXRvci4KK2V4dGVybiBpbnQzMl90IHZjaGlfbXNnX2l0ZXJfbmV4dCggVkNISV9NU0dfSVRFUl9UICppdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1zZ19zaXplICk7CisKKy8vIFJlbW92ZSB0aGUgbGFzdCBtZXNzYWdlIHJldHVybmVkIGJ5IHZjaGlfbXNnX2l0ZXJfbmV4dC4KKy8vIENhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIGFmdGVyIGVhY2ggY2FsbCB0byB2Y2hpX21zZ19pdGVyX25leHQuCitleHRlcm4gaW50MzJfdCB2Y2hpX21zZ19pdGVyX3JlbW92ZSggVkNISV9NU0dfSVRFUl9UICppdGVyICk7CisKKy8vIEhvbGQgdGhlIGxhc3QgbWVzc2FnZSByZXR1cm5lZCBieSB2Y2hpX21zZ19pdGVyX25leHQuCisvLyBDYW4gb25seSBiZSBjYWxsZWQgb25jZSBhZnRlciBlYWNoIGNhbGwgdG8gdmNoaV9tc2dfaXRlcl9uZXh0LgorZXh0ZXJuIGludDMyX3QgdmNoaV9tc2dfaXRlcl9ob2xkKCBWQ0hJX01TR19JVEVSX1QgKml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfSEVMRF9NU0dfVCAqbWVzc2FnZSApOworCisvLyBSZXR1cm4gaW5mb3JtYXRpb24gZm9yIHRoZSBuZXh0IG1lc3NhZ2UsIGFuZCBob2xkIGl0LCBhZHZhbmNpbmcgdGhlIGl0ZXJhdG9yLgorZXh0ZXJuIGludDMyX3QgdmNoaV9tc2dfaXRlcl9ob2xkX25leHQoIFZDSElfTVNHX0lURVJfVCAqaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YSwgICAgICAgIC8vIH0gbWF5IGJlIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbXNnX3NpemUsIC8vIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX0hFTERfTVNHX1QgKm1lc3NhZ2UgKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgR2xvYmFsIGJ1bGsgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIFJvdXRpbmUgdG8gcHJlcGFyZSBpbnRlcmZhY2UgZm9yIGEgdHJhbnNmZXIgZnJvbSB0aGUgb3RoZXIgc2lkZQorZXh0ZXJuIGludDMyX3QgdmNoaV9idWxrX3F1ZXVlX3JlY2VpdmUoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YV9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp0cmFuc2Zlcl9oYW5kbGUgKTsKKworCisvLyBQcmVwYXJlIGludGVyZmFjZSBmb3IgYSB0cmFuc2ZlciBmcm9tIHRoZSBvdGhlciBzaWRlIGludG8gcmVsb2NhdGFibGUgbWVtb3J5LgoraW50MzJfdCB2Y2hpX2J1bGtfcXVldWVfcmVjZWl2ZV9yZWxvYyggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfTUVNX0hBTkRMRV9UIGhfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVkNISV9GTEFHU19UIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGNvbnN0IGJ1bGtfaGFuZGxlICk7CisKKy8vIFJvdXRpbmUgdG8gcXVldWUgdXAgZGF0YSByZWFkeSBmb3IgdHJhbnNmZXIgdG8gdGhlIG90aGVyIChvbmNlIHRoZXkgaGF2ZSBzaWduYWxsZWQgdGhleSBhcmUgcmVhZHkpCitleHRlcm4gaW50MzJfdCB2Y2hpX2J1bGtfcXVldWVfdHJhbnNtaXQoIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGFfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdHJhbnNmZXJfaGFuZGxlICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIENvbmZpZ3VyYXRpb24gcGx1bWJpbmcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIGRpZmZlcmVudCBtaWQgbGF5ZXJzICh0aGUgc3RhdGUgaW5mbyBnaXZlcyB0aGUgZGlmZmVyZW50IHBoeXNpY2FsIGNvbm5lY3Rpb25zKQorZXh0ZXJuIGNvbnN0IFZDSElfQ09OTkVDVElPTl9BUElfVCAqc2luZ2xlX2dldF9mdW5jX3RhYmxlKCB2b2lkICk7CisvL2V4dGVybiBjb25zdCBWQ0hJX0NPTk5FQ1RJT05fQVBJX1QgKmxvY2FsX3NlcnZlcl9nZXRfZnVuY190YWJsZSggdm9pZCApOworLy9leHRlcm4gY29uc3QgVkNISV9DT05ORUNUSU9OX0FQSV9UICpsb2NhbF9jbGllbnRfZ2V0X2Z1bmNfdGFibGUoIHZvaWQgKTsKKworLy8gZGVjbGFyZSBhbGwgbWVzc2FnZSBkcml2ZXJzIGhlcmUKK2NvbnN0IFZDSElfTUVTU0FHRV9EUklWRVJfVCAqdmNoaV9tcGhpX21lc3NhZ2VfZHJpdmVyX2Z1bmNfdGFibGUoIHZvaWQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworZXh0ZXJuIGludDMyX3QgdmNoaV9idWxrX3F1ZXVlX3RyYW5zbWl0X3JlbG9jKCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQ0hJX01FTV9IQU5ETEVfVCBoX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDSElfRkxBR1NfVCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdHJhbnNmZXJfaGFuZGxlICk7CisjZW5kaWYgLyogVkNISV9IXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS92Y2hpX2NmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmJjMmQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmcuaApAQCAtMCwwICsxLDIyNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJX0NGR19IXworI2RlZmluZSBWQ0hJX0NGR19IXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lcyBpbiB0aGlzIGZpcnN0IHNlY3Rpb24gYXJlIHBhcnQgb2YgdGhlIFZDSEkgQVBJIGFuZCBtYXkgYmUgZXhhbWluZWQgYnkgVkNISQorICogc2VydmljZXMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBSZXF1aXJlZCBhbGlnbm1lbnQgb2YgYmFzZSBhZGRyZXNzZXMgZm9yIGJ1bGsgdHJhbnNmZXIsIGlmIHVuYWxpZ25lZCB0cmFuc2ZlcnMgYXJlIG5vdCBlbmFibGVkICovCisvKiBSZWFsbHkgZGV0ZXJtaW5lZCBieSB0aGUgbWVzc2FnZSBkcml2ZXIsIGFuZCBzaG91bGQgYmUgYXZhaWxhYmxlIGZyb20gYSBydW4tdGltZSBjYWxsLiAqLworI2lmbmRlZiBWQ0hJX0JVTEtfQUxJR04KKyMgICBpZiBfX1ZDQ09SRVZFUl9fID49IDB4MDQwMDAwMDAKKyMgICAgICAgZGVmaW5lIFZDSElfQlVMS19BTElHTiAzMiAvLyBBbGxvd3MgZm9yIHRoZSBuZWVkIHRvIGRvIGNhY2hlIGNsZWFucworIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIFZDSElfQlVMS19BTElHTiAxNgorIyAgIGVuZGlmCisjZW5kaWYKKworLyogUmVxdWlyZWQgbGVuZ3RoIG11bHRpcGxlIGZvciBidWxrIHRyYW5zZmVycywgaWYgdW5hbGlnbmVkIHRyYW5zZmVycyBhcmUgbm90IGVuYWJsZWQgKi8KKy8qIE1heSBiZSBsZXNzIHRoYW4gb3IgZ3JlYXRlciB0aGFuIFZDSElfQlVMS19BTElHTiAqLworLyogUmVhbGx5IGRldGVybWluZWQgYnkgdGhlIG1lc3NhZ2UgZHJpdmVyLCBhbmQgc2hvdWxkIGJlIGF2YWlsYWJsZSBmcm9tIGEgcnVuLXRpbWUgY2FsbC4gKi8KKyNpZm5kZWYgVkNISV9CVUxLX0dSQU5VTEFSSVRZCisjICAgaWYgX19WQ0NPUkVWRVJfXyA+PSAweDA0MDAwMDAwCisjICAgICAgIGRlZmluZSBWQ0hJX0JVTEtfR1JBTlVMQVJJVFkgMzIgLy8gQWxsb3dzIGZvciB0aGUgbmVlZCB0byBkbyBjYWNoZSBjbGVhbnMKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBWQ0hJX0JVTEtfR1JBTlVMQVJJVFkgMTYKKyMgICBlbmRpZgorI2VuZGlmCisKKy8qIFRoZSBsYXJnZXN0IHBvc3NpYmxlIG1lc3NhZ2UgdG8gYmUgcXVldWVkIHdpdGggdmNoaV9tc2dfcXVldWUuICovCisjaWZuZGVmIFZDSElfTUFYX01TR19TSVpFCisjICAgaWYgZGVmaW5lZCBWQ0hJX0xPQ0FMX0hPU1RfUE9SVAorIyAgICAgICBkZWZpbmUgVkNISV9NQVhfTVNHX1NJWkUgICAgIDE2Mzg0ICAgICAgICAgLy8gbWFrZXMgZmlsZSB0cmFuc2ZlcnMgZmFzdCwgYnV0IHNob3VsZCB0aGV5IGJlIHVzaW5nIGJ1bGs/CisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgVkNISV9NQVhfTVNHX1NJWkUgICAgICA0MDk2IC8vIE5PVEU6IFRISVMgTVVTVCBCRSBMQVJHRVIgVEhBTiBPUiBFUVVBTCBUTyBUSEUgU0laRSBPRiBUSEUgS0hST05PUyBNRVJHRSBCVUZGRVIhIQorIyAgIGVuZGlmCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5lcyBiZWxvdyBhcmUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucywgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBWQ0hJIHNlcnZpY2VzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIb3cgbWFueSBjb25uZWN0aW9ucyBjYW4gd2Ugc3VwcG9ydD8gQSBsb2NhbGhvc3QgaW1wbGVtZW50YXRpb24gdXNlcyAyIGNvbm5lY3Rpb25zLAorICogMSBmb3IgaG9zdC1hcHAsIDEgZm9yIFZNQ1MsIGFuZCB0aGVzZSBhcmUgaG9va2VkIHRvZ2V0aGVyIGJ5IGEgbG9vcGJhY2sgTVBISSBWQ0ZXCisgKiBkcml2ZXIuICovCisjaWZuZGVmIFZDSElfTUFYX05VTV9DT05ORUNUSU9OUworIyAgIGRlZmluZSBWQ0hJX01BWF9OVU1fQ09OTkVDVElPTlMgMworI2VuZGlmCisKKy8qIEhvdyBtYW55IHNlcnZpY2VzIGNhbiB3ZSBvcGVuIHBlciBjb25uZWN0aW9uPyBFeHRlbmRpbmcgdGhpcyBkb2Vzbid0IGNvc3QgcHJvY2Vzc2luZyB0aW1lLCBqdXN0IGEgc21hbGwKKyAqIGFtb3VudCBvZiBzdGF0aWMgbWVtb3J5LiAqLworI2lmbmRlZiBWQ0hJX01BWF9TRVJWSUNFU19QRVJfQ09OTkVDVElPTgorIyAgZGVmaW5lIFZDSElfTUFYX1NFUlZJQ0VTX1BFUl9DT05ORUNUSU9OIDM2CisjZW5kaWYKKworLyogQWRqdXN0IGlmIHVzaW5nIGEgbWVzc2FnZSBkcml2ZXIgdGhhdCBzdXBwb3J0cyBtb3JlIGxvZ2ljYWwgVFggY2hhbm5lbHMgKi8KKyNpZm5kZWYgVkNISV9NQVhfQlVMS19UWF9DSEFOTkVMU19QRVJfQ09OTkVDVElPTgorIyAgIGRlZmluZSBWQ0hJX01BWF9CVUxLX1RYX0NIQU5ORUxTX1BFUl9DT05ORUNUSU9OIDkgLy8gMSBNUEhJICsgOCBDQ1AyIGxvZ2ljYWwgY2hhbm5lbHMKKyNlbmRpZgorCisvKiBBZGp1c3QgaWYgdXNpbmcgYSBtZXNzYWdlIGRyaXZlciB0aGF0IHN1cHBvcnRzIG1vcmUgbG9naWNhbCBSWCBjaGFubmVscyAqLworI2lmbmRlZiBWQ0hJX01BWF9CVUxLX1JYX0NIQU5ORUxTX1BFUl9DT05ORUNUSU9OCisjICAgZGVmaW5lIFZDSElfTUFYX0JVTEtfUlhfQ0hBTk5FTFNfUEVSX0NPTk5FQ1RJT04gMSAvLyAxIE1QSEkKKyNlbmRpZgorCisvKiBIb3cgbWFueSByZWNlaXZlIHNsb3RzIGRvIHdlIHVzZS4gVGhpcyB0aW1lcyBWQ0hJX01BWF9NU0dfU0laRSBnaXZlcyB0aGUgZWZmZWN0aXZlCisgKiByZWNlaXZlIHF1ZXVlIHNwYWNlLCBsZXNzIG1lc3NhZ2UgaGVhZGVycy4gKi8KKyNpZm5kZWYgVkNISV9OVU1fUkVBRF9TTE9UUworIyAgaWYgZGVmaW5lZChWQ0hJX0xPQ0FMX0hPU1RfUE9SVCkKKyMgICAgIGRlZmluZSBWQ0hJX05VTV9SRUFEX1NMT1RTIDQKKyMgIGVsc2UKKyMgICAgIGRlZmluZSBWQ0hJX05VTV9SRUFEX1NMT1RTIDQ4CisjICBlbmRpZgorI2VuZGlmCisKKy8qIERvIHdlIHV0aWxpc2Ugb3ZlcnJ1biBmYWNpbGl0eSBmb3IgcmVjZWl2ZSBtZXNzYWdlIHNsb3RzPyBDYW4gYWlkIHBlZXIgdHJhbnNtaXQKKyAqIHBlcmZvcm1hbmNlLiBPbmx5IGRlZmluZSBvbiBWaWRlb0NvcmUgZW5kLCB0YWxraW5nIHRvIGhvc3QuCisgKi8KKy8vI2RlZmluZSBWQ0hJX01TR19SWF9PVkVSUlVOCisKKy8qIEhvdyBtYW55IHRyYW5zbWl0IHNsb3RzIGRvIHdlIHVzZS4gR2VuZXJhbGx5IGRvbid0IG5lZWQgbWFueSwgYXMgdGhlIGhhcmR3YXJlIGRyaXZlcgorICogdW5kZXJuZWF0aCBWQ0hJIHdpbGwgdXN1YWxseSBoYXZlIGl0cyBvd24gYnVmZmVyaW5nLiAqLworI2lmbmRlZiBWQ0hJX05VTV9XUklURV9TTE9UUworIyAgZGVmaW5lIFZDSElfTlVNX1dSSVRFX1NMT1RTIDQKKyNlbmRpZgorCisvKiBJZiBhIHNlcnZpY2UgaGFzIGhlbGQgb3IgcXVldWVkIHJlY2VpdmVkIG1lc3NhZ2VzIGluIFZDSElfWE9GRl9USFJFU0hPTEQgb3IgbW9yZSBzbG90cywKKyAqIHRoZW4gaXQncyB0YWtpbmcgdXAgdG9vIG11Y2ggYnVmZmVyIHNwYWNlLCBhbmQgdGhlIHBlZXIgc2VydmljZSB3aWxsIGJlIHRvbGQgdG8gc3RvcAorICogdHJhbnNtaXR0aW5nIHdpdGggYW4gWE9GRiBtZXNzYWdlLiBGb3IgdGhpcyB0byBiZSBlZmZlY3RpdmUsIHRoZSBWQ0hJX05VTV9SRUFEX1NMT1RTCisgKiBuZWVkcyB0byBiZSBjb25zaWRlcmFibHkgYmlnZ2VyIHRoYW4gVkNISV9OVU1fV1JJVEVfU0xPVFMsIG9yIHRoZSB0cmFuc21pdCBsYXRlbmN5CisgKiBpcyB0b28gaGlnaC4gKi8KKyNpZm5kZWYgVkNISV9YT0ZGX1RIUkVTSE9MRAorIyAgZGVmaW5lIFZDSElfWE9GRl9USFJFU0hPTEQgKFZDSElfTlVNX1JFQURfU0xPVFMgLyAyKQorI2VuZGlmCisKKy8qIEFmdGVyIHdlJ3ZlIHNlbnQgYW4gWE9GRiwgdGhlIHBlZXIgd2lsbCBiZSB0b2xkIHRvIHJlc3VtZSB0cmFuc21pc3Npb24gb25jZSB0aGUgbG9jYWwKKyAqIHNlcnZpY2UgaGFzIGRlcXVldWVkL3JlbGVhc2VkIGVub3VnaCBtZXNzYWdlcyB0aGF0IGl0J3Mgbm93IG9jY3VweWluZworICogVkNISV9YT05fVEhSRVNIT0xEIHNsb3RzIG9yIGZld2VyLiAqLworI2lmbmRlZiBWQ0hJX1hPTl9USFJFU0hPTEQKKyMgIGRlZmluZSBWQ0hJX1hPTl9USFJFU0hPTEQgKFZDSElfTlVNX1JFQURfU0xPVFMgLyA0KQorI2VuZGlmCisKKy8qIEEgc2l6ZSBiZWxvdyB3aGljaCBhIGJ1bGsgdHJhbnNmZXIgb21pdHMgdGhlIGhhbmRzaGFrZSBjb21wbGV0ZWx5IGFuZCBhbHdheXMgZ29lcworICogdmlhIHRoZSBtZXNzYWdlIGNoYW5uZWwsIGlmIGJ1bGsgYXV4aWxpYXJ5IGlzIGJlaW5nIHNlbnQgb24gdGhhdCBzZXJ2aWNlLiAoVGhlIHVzZXIKKyAqIGNhbiBndWFyYW50ZWUgdGhpcyBieSBlbmFibGluZyB1bmFsaWduZWQgdHJhbnNtaXRzKS4KKyAqIE5vdCBBUEkuICovCisjaWZuZGVmIFZDSElfTUlOX0JVTEtfU0laRQorIyAgZGVmaW5lIFZDSElfTUlOX0JVTEtfU0laRSAgICAoIFZDSElfTUFYX01TR19TSVpFIC8gMiA8IDQwOTYgPyBWQ0hJX01BWF9NU0dfU0laRSAvIDIgOiA0MDk2ICkKKyNlbmRpZgorCisvKiBNYXhpbXVtIHNpemUgb2YgYnVsayB0cmFuc21pc3Npb24gY2h1bmtzLCBmb3IgZWFjaCBpbnRlcmZhY2UgdHlwZS4gQSB0cmFkZS1vZmYgYmV0d2VlbgorICogc3BlZWQgYW5kIGxhdGVuY3k7IHRoZSBzbWFsbGVyIHRoZSBjaHVuayBzaXplIHRoZSBiZXR0ZXIgY2hhbmdlIG9mIG1lc3NhZ2VzIGFuZCBvdGhlcgorICogYnVsayB0cmFuc21pc3Npb25zIGdldHRpbmcgaW4gd2hlbiBiaWcgYnVsayB0cmFuc2ZlcnMgYXJlIGhhcHBlbmluZy4gU2V0IHRvIDAgdG8gbm90CisgKiBicmVhayB0cmFuc21pc3Npb25zIGludG8gY2h1bmtzLgorICovCisjaWZuZGVmIFZDSElfTUFYX0JVTEtfQ0hVTktfU0laRV9NUEhJCisjICBkZWZpbmUgVkNISV9NQVhfQlVMS19DSFVOS19TSVpFX01QSEkgKDE2ICogMTAyNCkKKyNlbmRpZgorCisvKiBOQiBDaHVua2VkIENDUDIgdHJhbnNtaXNzaW9ucyB2aW9sYXRlIHRoZSBsZXR0ZXIgb2YgdGhlIENDUDIgc3BlYyBieSB1c2luZyAiSlBFRzgiIG1vZGUKKyAqIHdpdGggbXVsdGlwbGUtbGluZSBmcmFtZXMuIE9ubHkgdXNlIGlmIHRoZSByZWNlaXZlciBjYW4gY29wZS4gKi8KKyNpZm5kZWYgVkNISV9NQVhfQlVMS19DSFVOS19TSVpFX0NDUDIKKyMgIGRlZmluZSBWQ0hJX01BWF9CVUxLX0NIVU5LX1NJWkVfQ0NQMiAwCisjZW5kaWYKKworLyogSG93IG1hbnkgVFggbWVzc2FnZXMgY2FuIHdlIGhhdmUgcGVuZGluZyBpbiBvdXIgdHJhbnNtaXQgc2xvdHMuIE9uY2UgZXhoYXVzdGVkLAorICogdmNoaV9tc2dfcXVldWUgd2lsbCBiZSBibG9ja2VkLiAqLworI2lmbmRlZiBWQ0hJX1RYX01TR19RVUVVRV9TSVpFCisjICBkZWZpbmUgVkNISV9UWF9NU0dfUVVFVUVfU0laRSAgICAgICAgICAgMjU2CisjZW5kaWYKKworLyogSG93IG1hbnkgUlggbWVzc2FnZXMgY2FuIHdlIGhhdmUgcGFyc2VkIGluIHRoZSByZWNlaXZlIHNsb3RzLiBPbmNlIGV4aGF1c3RlZCwgcGFyc2luZworICogd2lsbCBiZSBzdXNwZW5kZWQgdW50aWwgb2xkZXIgbWVzc2FnZXMgYXJlIGRlcXVldWVkL3JlbGVhc2VkLiAqLworI2lmbmRlZiBWQ0hJX1JYX01TR19RVUVVRV9TSVpFCisjICBkZWZpbmUgVkNISV9SWF9NU0dfUVVFVUVfU0laRSAgICAgICAgICAgMjU2CisjZW5kaWYKKworLyogUmVhbGx5IHNob3VsZCBiZSBhYmxlIHRvIGNvcGUgaWYgd2UgcnVuIG91dCBvZiByZWNlaXZlZCBtZXNzYWdlIGRlc2NyaXB0b3JzLCBieQorICogc3VzcGVuZGluZyBwYXJzaW5nIGFzIHRoZSBjb21tZW50IGFib3ZlIHNheXMsIGJ1dCB3ZSBkb24ndC4gVGhpcyBzd2VlcHMgdGhlIGlzc3VlCisgKiB1bmRlciB0aGUgY2FycGV0LiAqLworI2lmIFZDSElfUlhfTVNHX1FVRVVFX1NJWkUgPCAoVkNISV9NQVhfTVNHX1NJWkUvMTYgKyAxKSAqIFZDSElfTlVNX1JFQURfU0xPVFMKKyMgIHVuZGVmIFZDSElfUlhfTVNHX1FVRVVFX1NJWkUKKyMgIGRlZmluZSBWQ0hJX1JYX01TR19RVUVVRV9TSVpFIChWQ0hJX01BWF9NU0dfU0laRS8xNiArIDEpICogVkNISV9OVU1fUkVBRF9TTE9UUworI2VuZGlmCisKKy8qIEhvdyBtYW55IGJ1bGsgdHJhbnNtaXRzIGNhbiB3ZSBoYXZlIHBlbmRpbmcuIE9uY2UgZXhoYXVzdGVkLCB2Y2hpX2J1bGtfcXVldWVfdHJhbnNtaXQKKyAqIHdpbGwgYmUgYmxvY2tlZC4gKi8KKyNpZm5kZWYgVkNISV9UWF9CVUxLX1FVRVVFX1NJWkUKKyMgIGRlZmluZSBWQ0hJX1RYX0JVTEtfUVVFVUVfU0laRSAgICAgICAgICAgNjQKKyNlbmRpZgorCisvKiBIb3cgbWFueSBidWxrIHJlY2VpdmVzIGNhbiB3ZSBoYXZlIHBlbmRpbmcuIE9uY2UgZXhoYXVzdGVkLCB2Y2hpX2J1bGtfcXVldWVfcmVjZWl2ZQorICogd2lsbCBiZSBibG9ja2VkLiAqLworI2lmbmRlZiBWQ0hJX1JYX0JVTEtfUVVFVUVfU0laRQorIyAgZGVmaW5lIFZDSElfUlhfQlVMS19RVUVVRV9TSVpFICAgICAgICAgICA2NAorI2VuZGlmCisKKy8qIEEgbGltaXQgb24gaG93IG1hbnkgb3V0c3RhbmRpbmcgYnVsayByZXF1ZXN0cyB3ZSBleHBlY3QgdGhlIHBlZXIgdG8gZ2l2ZSB1cy4gSWYKKyAqIHRoZSBwZWVyIGFza3MgZm9yIG1vcmUgdGhhbiB0aGlzLCBWQ0hJIHdpbGwgZmFpbCBhbmQgYXNzZXJ0LiBUaGUgbnVtYmVyIGlzIGRldGVybWluZWQKKyAqIGJ5IHRoZSBwZWVyJ3MgaGFyZHdhcmUgLSBpdCdzIHRoZSBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgcmVxdWVzdHMgdGhhdCBjYW4gYmUgcXVldWVkCisgKiBvbiBhbGwgYnVsayBjaGFubmVscy4gVkMzJ3MgTVBISSBwZXJpcGhlcmFsIGFsbG93cyAxNi4gKi8KKyNpZm5kZWYgVkNISV9NQVhfUEVFUl9CVUxLX1JFUVVFU1RTCisjICBkZWZpbmUgVkNISV9NQVhfUEVFUl9CVUxLX1JFUVVFU1RTICAgICAgIDMyCisjZW5kaWYKKworLyogRGVmaW5lIFZDSElfQ0NQMlRYX01BTlVBTF9QT1dFUiBpZiB0aGUgaG9zdCB0ZWxscyB1cyB3aGVuIHRvIHR1cm4gdGhlIENDUDIKKyAqIHRyYW5zbWl0dGVyIG9uIGFuZCBvZmYuCisgKi8KKy8qI2RlZmluZSBWQ0hJX0NDUDJUWF9NQU5VQUxfUE9XRVIqLworCisjaWZuZGVmIFZDSElfQ0NQMlRYX01BTlVBTF9QT1dFUgorCisvKiBUaW1lb3V0IChpbiBtaWxsaXNlY29uZHMpIGZvciBwdXR0aW5nIHRoZSBDQ1AyVFggaW50ZXJmYWNlIGludG8gSURMRSBzdGF0ZS4gU2V0CisgKiBuZWdhdGl2ZSBmb3Igbm8gSURMRS4KKyAqLworIyAgaWZuZGVmIFZDSElfQ0NQMlRYX0lETEVfVElNRU9VVAorIyAgICBkZWZpbmUgVkNISV9DQ1AyVFhfSURMRV9USU1FT1VUICAgICAgICA1CisjICBlbmRpZgorCisvKiBUaW1lb3V0IChpbiBtaWxsaXNlY29uZHMpIGZvciBwdXR0aW5nIHRoZSBDQ1AyVFggaW50ZXJmYWNlIGludG8gT0ZGIHN0YXRlLiBTZXQKKyAqIG5lZ2F0aXZlIGZvciBubyBPRkYuCisgKi8KKyMgIGlmbmRlZiBWQ0hJX0NDUDJUWF9PRkZfVElNRU9VVAorIyAgICBkZWZpbmUgVkNISV9DQ1AyVFhfT0ZGX1RJTUVPVVQgICAgICAgICAxMDAwCisjICBlbmRpZgorCisjZW5kaWYgLyogVkNISV9DQ1AyVFhfTUFOVUFMX1BPV0VSICovCisKKyNlbmRpZiAvKiBWQ0hJX0NGR19IXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBmaWxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaS92Y2hpX2NmZ19pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmdfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWRjYmE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jZmdfaW50ZXJuYWwuaApAQCAtMCwwICsxLDcxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElfQ0ZHX0lOVEVSTkFMX0hfCisjZGVmaW5lIFZDSElfQ0ZHX0lOVEVSTkFMX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb250cm9sIG9wdGltaXNhdGlvbiBhdHRlbXB0cy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIERvbid0IHVzZSBsb3RzIG9mIHNob3J0LXRlcm0gbG9ja3MgLSB1c2UgZ3JlYXQgbG9uZyBvbmVzLCByZWR1Y2luZyB0aGUgb3ZlcmFsbCBsb2Nrcy1wZXItc2Vjb25kCisjZGVmaW5lIFZDSElfQ09BUlNFX0xPQ0tJTkcKKworLy8gQXZvaWQgbG9jayB0aGVuIHVubG9jayBvbiBleGl0IGZyb20gYmxvY2tpbmcgcXVldWUgb3BlcmF0aW9ucyAobXNnIHR4LCBidWxrIHJ4L3R4KQorLy8gKG9ubHkgcmVsZXZhbnQgaWYgVkNISV9DT0FSU0VfTE9DS0lORykKKyNkZWZpbmUgVkNISV9FTElERV9CTE9DS19FWElUX0xPQ0sKKworLy8gQXZvaWQgbG9jayBvbiBub24tYmxvY2tpbmcgcGVlaworLy8gKG9ubHkgcmVsZXZhbnQgaWYgVkNISV9DT0FSU0VfTE9DS0lORykKKyNkZWZpbmUgVkNISV9BVk9JRF9QRUVLX0xPQ0sKKworLy8gVXNlIG9uZSBzbG90LWhhbmRsZXIgdGhyZWFkIHBlciBjb25uZWN0aW9uLCByYXRoZXIgdGhhbiAxIHRocmVhZCBkZWFsaW5nIHdpdGggYWxsIGNvbm5lY3Rpb25zIGluIHJvdGF0aW9uLgorI2RlZmluZSBWQ0hJX01VTFRJUExFX0hBTkRMRVJfVEhSRUFEUworCisvLyBQdXQgZnJlZSBkZXNjcmlwdG9ycyBvbnRvIHRoZSBoZWFkIG9mIHRoZSBmcmVlIHF1ZXVlLCByYXRoZXIgdGhhbiB0aGUgdGFpbCwgc28gdGhhdCB3ZSBkb24ndCB0aHJhc2gKKy8vIG91ciB3YXkgdGhyb3VnaCB0aGUgcG9vbCBvZiBkZXNjcmlwdG9ycy4KKyNkZWZpbmUgVkNISV9QVVNIX0ZSRUVfREVTQ1JJUFRPUlNfT05UT19IRUFECisKKy8vIERvbid0IGlzc3VlIGEgTVNHX0FWQUlMQUJMRSBjYWxsYmFjayBmb3IgZXZlcnkgc2luZ2xlIG1lc3NhZ2UuIFBvc3NpYmx5IG9ubHkgc2FmZSBpZiBWQ0hJX0NPQVJTRV9MT0NLSU5HLgorI2RlZmluZSBWQ0hJX0ZFV0VSX01TR19BVkFJTEFCTEVfQ0FMTEJBQ0tTCisKKy8vIERvbid0IHVzZSBtZXNzYWdlIGRlc2NyaXB0b3JzIGZvciBUWCBtZXNzYWdlcyB0aGF0IGRvbid0IG5lZWQgdGhlbQorI2RlZmluZSBWQ0hJX01JTklNSVNFX1RYX01TR19ERVNDUklQVE9SUworCisvLyBOYW5vLWxvY2tzIGZvciBtdWx0aXF1ZXVlCisvLyNkZWZpbmUgVkNISV9NUVVFVUVfTkFOT0xPQ0tTCisKKy8vIExvY2stZnJlZShlcikgZGVxdWV1aW5nCisvLyNkZWZpbmUgVkNISV9SWF9OQU5PTE9DS1MKKworI2VuZGlmIC8qVkNISV9DRkdfSU5URVJOQUxfSF8qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9jb21tb24uaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNWE3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfY29tbW9uLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISV9DT01NT05fSF8KKyNkZWZpbmUgVkNISV9DT01NT05fSF8KKworCisvL2ZsYWdzIHVzZWQgd2hlbiBzZW5kaW5nIG1lc3NhZ2VzIChtdXN0IGJlIGJpdG1hcHBlZCkKK3R5cGVkZWYgZW51bQoreworICAgVkNISV9GTEFHU19OT05FICAgICAgICAgICAgICAgICAgICAgID0gMHgwLAorICAgVkNISV9GTEFHU19CTE9DS19VTlRJTF9PUF9DT01QTEVURSAgID0gMHgxLCAgIC8vIHdhaXRzIGZvciBtZXNzYWdlIHRvIGJlIHJlY2VpdmVkLCBvciBzZW50IChOQi4gbm90IHRoZSBzYW1lIGFzIGJlaW5nIHNlZW4gb24gb3RoZXIgc2lkZSkKKyAgIFZDSElfRkxBR1NfQ0FMTEJBQ0tfV0hFTl9PUF9DT01QTEVURSA9IDB4MiwgICAvLyBydW4gYSBjYWxsYmFjayB3aGVuIG1lc3NhZ2Ugc2VudAorICAgVkNISV9GTEFHU19CTE9DS19VTlRJTF9RVUVVRUQgICAgICAgID0gMHg0LCAgIC8vIHJldHVybiBvbmNlIHRoZSB0cmFuc2ZlciBpcyBpbiBhIHF1ZXVlIHJlYWR5IHRvIGdvCisgICBWQ0hJX0ZMQUdTX0FMTE9XX1BBUlRJQUwgICAgICAgICAgICAgPSAweDgsCisgICBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX0RBVEFfUkVBRCAgICAgPSAweDEwLAorICAgVkNISV9GTEFHU19DQUxMQkFDS19XSEVOX0RBVEFfUkVBRCAgID0gMHgyMCwKKworICAgVkNISV9GTEFHU19BTElHTl9TTE9UICAgICAgICAgICAgPSAweDAwMDA4MCwgIC8vIGludGVybmFsIHVzZSBvbmx5CisgICBWQ0hJX0ZMQUdTX0JVTEtfQVVYX1FVRVVFRCAgICAgICA9IDB4MDEwMDAwLCAgLy8gaW50ZXJuYWwgdXNlIG9ubHkKKyAgIFZDSElfRkxBR1NfQlVMS19BVVhfQ09NUExFVEUgICAgID0gMHgwMjAwMDAsICAvLyBpbnRlcm5hbCB1c2Ugb25seQorICAgVkNISV9GTEFHU19CVUxLX0RBVEFfUVVFVUVEICAgICAgPSAweDA0MDAwMCwgIC8vIGludGVybmFsIHVzZSBvbmx5CisgICBWQ0hJX0ZMQUdTX0JVTEtfREFUQV9DT01QTEVURSAgICA9IDB4MDgwMDAwLCAgLy8gaW50ZXJuYWwgdXNlIG9ubHkKKyAgIFZDSElfRkxBR1NfSU5URVJOQUwgICAgICAgICAgICAgID0gMHhGRjAwMDAKK30gVkNISV9GTEFHU19UOworCisvLyBjb25zdGFudHMgZm9yIHZjaGlfY3JjX2NvbnRyb2woKQordHlwZWRlZiBlbnVtIHsKKyAgIFZDSElfQ1JDX05PVEhJTkcgPSAtMSwKKyAgIFZDSElfQ1JDX1BFUl9TRVJWSUNFID0gMCwKKyAgIFZDSElfQ1JDX0VWRVJZVEhJTkcgPSAxLAorfSBWQ0hJX0NSQ19DT05UUk9MX1Q7CisKKy8vY2FsbGJhY2sgcmVhc29ucyB3aGVuIGFuIGV2ZW50IG9jY3VycyBvbiBhIHNlcnZpY2UKK3R5cGVkZWYgZW51bQoreworICAgVkNISV9DQUxMQkFDS19SRUFTT05fTUlOLAorCisgICAvL1RoaXMgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgZGF0YSBhdmFpbGFibGUKKyAgIC8vaGFuZGxlIGlzIHRoZSBtc2cgaWQgdGhhdCB3YXMgdHJhbnNtaXR0ZWQgd2l0aCB0aGUgZGF0YQorICAgLy8gICAgV2hlbiBhIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgYW5kIHRoZXJlIHdhcyBubyBGVUxMIG1lc3NhZ2UgYXZhaWxhYmxlIHByZXZpb3VzbHksIHNlbmQgY2FsbGJhY2sKKyAgIC8vICAgIFRhc2tzIGdldCBraWNrZWQgYnkgdGhlIGNhbGxiYWNrLCByZXNldCB0aGVpciBldmVudCBhbmQgdHJ5IGFuZCByZWFkIGZyb20gdGhlIGZpZm8gdW50aWwgaXQgZmFpbHMKKyAgIFZDSElfQ0FMTEJBQ0tfTVNHX0FWQUlMQUJMRSwKKyAgIFZDSElfQ0FMTEJBQ0tfTVNHX1NFTlQsCisgICBWQ0hJX0NBTExCQUNLX01TR19TUEFDRV9BVkFJTEFCTEUsIC8vIFhYWCBub3QgeWV0IGltcGxlbWVudGVkCisKKyAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSB0cmFuc2ZlciBmcm9tIHRoZSBvdGhlciBzaWRlIGhhcyBjb21wbGV0ZWQKKyAgIFZDSElfQ0FMTEJBQ0tfQlVMS19SRUNFSVZFRCwKKyAgIC8vVGhpcyBpbmRpY2F0ZXMgdGhhdCBkYXRhIHF1ZXVlZCB1cCB0byBiZSBzZW50IGhhcyBub3cgZ29uZQorICAgLy9oYW5kbGUgaXMgdGhlIG1zZyBpZCB0aGF0IHdhcyB1c2VkIHdoZW4gc2VuZGluZyB0aGUgZGF0YQorICAgVkNISV9DQUxMQkFDS19CVUxLX1NFTlQsCisgICBWQ0hJX0NBTExCQUNLX0JVTEtfUlhfU1BBQ0VfQVZBSUxBQkxFLCAvLyBYWFggbm90IHlldCBpbXBsZW1lbnRlZAorICAgVkNISV9DQUxMQkFDS19CVUxLX1RYX1NQQUNFX0FWQUlMQUJMRSwgLy8gWFhYIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKworICAgVkNISV9DQUxMQkFDS19TRVJWSUNFX0NMT1NFRCwKKworICAgLy8gdGhpcyBzaWRlIGhhcyBzZW50IFhPRkYgdG8gcGVlciBkdWUgdG8gbGFjayBvZiBkYXRhIGNvbnN1bXB0aW9uIGJ5IHNlcnZpY2UKKyAgIC8vIChzdWdnZXN0cyB0aGUgc2VydmljZSBtYXkgbmVlZCB0byB0YWtlIHNvbWUgcmVjb3ZlcnkgYWN0aW9uIGlmIGl0IGhhcworICAgLy8gYmVlbiBkZWxpYmVyYXRlbHkgaG9sZGluZyBvZmYgY29uc3VtaW5nIGRhdGEpCisgICBWQ0hJX0NBTExCQUNLX1NFTlRfWE9GRiwKKyAgIFZDSElfQ0FMTEJBQ0tfU0VOVF9YT04sCisKKyAgIC8vIGluZGljYXRlcyB0aGF0IGEgYnVsayB0cmFuc2ZlciBoYXMgZmluaXNoZWQgcmVhZGluZyB0aGUgc291cmNlIGJ1ZmZlcgorICAgVkNISV9DQUxMQkFDS19CVUxLX0RBVEFfUkVBRCwKKworICAgLy8gcG93ZXIgbm90aWZpY2F0aW9uIGV2ZW50cyAoY3VycmVudGx5IGhvc3Qgc2lkZSBvbmx5KQorICAgVkNISV9DQUxMQkFDS19QRUVSX09GRiwKKyAgIFZDSElfQ0FMTEJBQ0tfUEVFUl9TVVNQRU5ERUQsCisgICBWQ0hJX0NBTExCQUNLX1BFRVJfT04sCisgICBWQ0hJX0NBTExCQUNLX1BFRVJfUkVTVU1FRCwKKyAgIFZDSElfQ0FMTEJBQ0tfRk9SQ0VEX1BPV0VSX09GRiwKKworI2lmZGVmIFVTRV9WQ0hJUV9BUk0KKyAgIC8vIHNvbWUgZXh0cmEgbm90aWZpY2F0aW9ucyBwcm92aWRlZCBieSB2Y2hpcV9hcm0KKyAgIFZDSElfQ0FMTEJBQ0tfU0VSVklDRV9PUEVORUQsCisgICBWQ0hJX0NBTExCQUNLX0JVTEtfUkVDRUlWRV9BQk9SVEVELAorICAgVkNISV9DQUxMQkFDS19CVUxLX1RSQU5TTUlUX0FCT1JURUQsCisjZW5kaWYKKworICAgVkNISV9DQUxMQkFDS19SRUFTT05fTUFYCit9IFZDSElfQ0FMTEJBQ0tfUkVBU09OX1Q7CisKKy8vIHNlcnZpY2UgY29udHJvbCBvcHRpb25zCit0eXBlZGVmIGVudW0KK3sKKyAgIFZDSElfU0VSVklDRV9PUFRJT05fTUlOLAorCisgICBWQ0hJX1NFUlZJQ0VfT1BUSU9OX1RSQUNFLAorICAgVkNISV9TRVJWSUNFX09QVElPTl9TWU5DSFJPTk9VUywKKworICAgVkNISV9TRVJWSUNFX09QVElPTl9NQVgKK30gVkNISV9TRVJWSUNFX09QVElPTl9UOworCisKKy8vQ2FsbGJhY2sgdXNlZCBieSBhbGwgc2VydmljZXMgLyBidWxrIHRyYW5zZmVycwordHlwZWRlZiB2b2lkICgqVkNISV9DQUxMQkFDS19UKSggdm9pZCAqY2FsbGJhY2tfcGFyYW0sIC8vbXkgc2VydmljZSBsb2NhbCBwYXJhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkNISV9DQUxMQkFDS19SRUFTT05fVCByZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpoYW5kbGUgKTsgLy9mb3IgdHJhbnNtaXR0aW5nIG1zZydzIG9ubHkKKworCisKKy8qCisgKiBEZWZpbmUgdmVjdG9yIHN0cnVjdCBmb3Igc2NhdHRlci1nYXRoZXIgKHZlY3Rvcikgb3BlcmF0aW9ucworICogVmVjdG9ycyBjYW4gYmUgbmVzdGVkIC0gaWYgYSB2ZWN0b3IgZWxlbWVudCBoYXMgbmVnYXRpdmUgbGVuZ3RoLCB0aGVuCisgKiB0aGUgZGF0YSBwb2ludGVyIGlzIHRyZWF0ZWQgYXMgcG9pbnRpbmcgdG8gYW5vdGhlciB2ZWN0b3IgYXJyYXksIHdpdGgKKyAqICctdmVjX2xlbicgZWxlbWVudHMuIFRodXMgdG8gYXBwZW5kIGEgaGVhZGVyIG9udG8gYW4gZXhpc3RpbmcgdmVjdG9yLAorICogeW91IGNhbiBkbyB0aGlzOgorICoKKyAqIHZvaWQgZm9vKGNvbnN0IFZDSElfTVNHX1ZFQ1RPUl9UICp2LCBpbnQgbikKKyAqIHsKKyAqICAgIFZDSElfTVNHX1ZFQ1RPUl9UIG52WzJdOworICogICAgbnZbMF0udmVjX2Jhc2UgPSBteV9oZWFkZXI7CisgKiAgICBudlswXS52ZWNfbGVuID0gc2l6ZW9mIG15X2hlYWRlcjsKKyAqICAgIG52WzFdLnZlY19iYXNlID0gdjsKKyAqICAgIG52WzFdLnZlY19sZW4gPSAtbjsKKyAqICAgIC4uLgorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgdmNoaV9tc2dfdmVjdG9yIHsKKyAgIGNvbnN0IHZvaWQgKnZlY19iYXNlOworICAgaW50MzJfdCB2ZWNfbGVuOworfSBWQ0hJX01TR19WRUNUT1JfVDsKKworLy8gT3BhcXVlIHR5cGUgZm9yIGEgY29ubmVjdGlvbiBBUEkKK3R5cGVkZWYgc3RydWN0IG9wYXF1ZV92Y2hpX2Nvbm5lY3Rpb25fYXBpX3QgVkNISV9DT05ORUNUSU9OX0FQSV9UOworCisvLyBPcGFxdWUgdHlwZSBmb3IgYSBtZXNzYWdlIGRyaXZlcgordHlwZWRlZiBzdHJ1Y3Qgb3BhcXVlX3ZjaGlfbWVzc2FnZV9kcml2ZXJfdCBWQ0hJX01FU1NBR0VfRFJJVkVSX1Q7CisKKworLy8gSXRlcmF0b3Igc3RydWN0dXJlIGZvciByZWFkaW5nIGFoZWFkIHRocm91Z2ggcmVjZWl2ZWQgbWVzc2FnZSBxdWV1ZS4gQWxsb2NhdGVkIGJ5IGNsaWVudCwKKy8vIGluaXRpYWxpc2VkIGJ5IHZjaGlfbXNnX2xvb2tfYWhlYWQuIEZpZWxkcyBhcmUgZm9yIGludGVybmFsIFZDSEkgdXNlIG9ubHkuCisvLyBJdGVyYXRlcyBvdmVyIG1lc3NhZ2VzIGluIHF1ZXVlIGF0IHRoZSBpbnN0YW50IG9mIHRoZSBjYWxsIHRvIHZjaGlfbXNnX2xvb2thaGVhZCAtCisvLyB3aWxsIG5vdCBwcm9jZWVkIHRvIG1lc3NhZ2VzIHJlY2VpdmVkIHNpbmNlLiBCZWhhdmlvdXIgaXMgdW5kZWZpbmVkIGlmIGFuIGl0ZXJhdG9yCisvLyBpcyB1c2VkIGFnYWluIGFmdGVyIG1lc3NhZ2VzIGZvciB0aGF0IHNlcnZpY2UgYXJlIHJlbW92ZWQvZGVxdWV1ZWQgYnkgYW55CisvLyBtZWFucyBvdGhlciB0aGFuIHZjaGlfbXNnX2l0ZXJfLi4uIGNhbGxzIG9uIHRoZSBpdGVyYXRvciBpdHNlbGYuCit0eXBlZGVmIHN0cnVjdCB7CisgICBzdHJ1Y3Qgb3BhcXVlX3ZjaGlfc2VydmljZV90ICpzZXJ2aWNlOworICAgdm9pZCAqbGFzdDsKKyAgIHZvaWQgKm5leHQ7CisgICB2b2lkICpyZW1vdmU7Cit9IFZDSElfTVNHX0lURVJfVDsKKworCisjZW5kaWYgLy8gVkNISV9DT01NT05fSF8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfbWguaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpL3ZjaGlfbWguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThiZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGkvdmNoaV9taC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISV9NSF9IXworI2RlZmluZSBWQ0hJX01IX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit0eXBlZGVmIGludDMyX3QgVkNISV9NRU1fSEFORExFX1Q7CisjZGVmaW5lIFZDSElfTUVNX0hBTkRMRV9JTlZBTElEIDAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzOThiYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXEuaApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX1ZDSElRX0gKKyNkZWZpbmUgVkNISVFfVkNISVFfSAorCisjaW5jbHVkZSAidmNoaXFfaWYuaCIKKyNpbmNsdWRlICJ2Y2hpcV91dGlsLmgiCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV8yODM1LmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxXzI4MzUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWE1YzY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV8yODM1LmgKQEAgLTAsMCArMSw0MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV8yODM1X0gKKyNkZWZpbmUgVkNISVFfMjgzNV9ICisKKyNpbmNsdWRlICJ2Y2hpcV9wYWdlbGlzdC5oIgorCisjZGVmaW5lIFZDSElRX1BMQVRGT1JNX0ZSQUdNRU5UU19PRkZTRVRfSURYIDAKKyNkZWZpbmUgVkNISVFfUExBVEZPUk1fRlJBR01FTlRTX0NPVU5UX0lEWCAgMQorCisjZW5kaWYgLyogVkNISVFfMjgzNV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxXzI4MzVfYXJtLmMgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxXzI4MzVfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5MDQwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfMjgzNV9hcm0uYwpAQCAtMCwwICsxLDU4NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPHNvYy9iY20yODM1L3Jhc3BiZXJyeXBpLWZpcm13YXJlLmg+CisKKyNkZWZpbmUgZG1hY19tYXBfYXJlYQkJCV9fZ2x1ZShfQ0FDSEUsX2RtYV9tYXBfYXJlYSkKKyNkZWZpbmUgZG1hY191bm1hcF9hcmVhIAkJX19nbHVlKF9DQUNIRSxfZG1hX3VubWFwX2FyZWEpCisKK2V4dGVybiB2b2lkIGRtYWNfbWFwX2FyZWEoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CitleHRlcm4gdm9pZCBkbWFjX3VubWFwX2FyZWEoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CisKKyNkZWZpbmUgVE9UQUxfU0xPVFMgKFZDSElRX1NMT1RfWkVST19TTE9UUyArIDIgKiAzMikKKworI2RlZmluZSBWQ0hJUV9BUk1fQUREUkVTUyh4KSAoKHZvaWQgKikoKGNoYXIgKil4ICsgZ192aXJ0X3RvX2J1c19vZmZzZXQpKQorCisjaW5jbHVkZSAidmNoaXFfYXJtLmgiCisjaW5jbHVkZSAidmNoaXFfMjgzNS5oIgorI2luY2x1ZGUgInZjaGlxX2Nvbm5lY3RlZC5oIgorI2luY2x1ZGUgInZjaGlxX2tpbGxhYmxlLmgiCisKKyNkZWZpbmUgTUFYX0ZSQUdNRU5UUyAoVkNISVFfTlVNX0NVUlJFTlRfQlVMS1MgKiAyKQorCisjZGVmaW5lIEJFTEwwCTB4MDAKKyNkZWZpbmUgQkVMTDIJMHgwOAorCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV8yODM1X3N0YXRlX3N0cnVjdCB7CisgICBpbnQgaW5pdGVkOworICAgVkNISVFfQVJNX1NUQVRFX1QgYXJtX3N0YXRlOworfSBWQ0hJUV8yODM1X0FSTV9TVEFURV9UOworCitzdGF0aWMgdm9pZCBfX2lvbWVtICpnX3JlZ3M7CitzdGF0aWMgdW5zaWduZWQgaW50IGdfY2FjaGVfbGluZV9zaXplID0gc2l6ZW9mKENBQ0hFX0xJTkVfU0laRSk7CitzdGF0aWMgdW5zaWduZWQgaW50IGdfZnJhZ21lbnRzX3NpemU7CitzdGF0aWMgY2hhciAqZ19mcmFnbWVudHNfYmFzZTsKK3N0YXRpYyBjaGFyICpnX2ZyZWVfZnJhZ21lbnRzOworc3RhdGljIHN0cnVjdCBzZW1hcGhvcmUgZ19mcmVlX2ZyYWdtZW50c19zZW1hOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ192aXJ0X3RvX2J1c19vZmZzZXQ7CisKK2V4dGVybiBpbnQgdmNoaXFfYXJtX2xvZ19sZXZlbDsKKworc3RhdGljIERFRklORV9TRU1BUEhPUkUoZ19mcmVlX2ZyYWdtZW50c19tdXRleCk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdAordmNoaXFfZG9vcmJlbGxfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CisKK3N0YXRpYyBpbnQKK2NyZWF0ZV9wYWdlbGlzdChjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIHVuc2lnbmVkIHNob3J0IHR5cGUsCisgICAgICAgICAgICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBQQUdFTElTVF9UICoqIHBwYWdlbGlzdCk7CisKK3N0YXRpYyB2b2lkCitmcmVlX3BhZ2VsaXN0KFBBR0VMSVNUX1QgKnBhZ2VsaXN0LCBpbnQgYWN0dWFsKTsKKworaW50IHZjaGlxX3BsYXRmb3JtX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgcnBpX2Zpcm13YXJlICpmdyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCVZDSElRX1NMT1RfWkVST19UICp2Y2hpcV9zbG90X3plcm87CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdm9pZCAqc2xvdF9tZW07CisJZG1hX2FkZHJfdCBzbG90X3BoeXM7CisJdTMyIGNoYW5uZWxiYXNlOworCWludCBzbG90X21lbV9zaXplLCBmcmFnX21lbV9zaXplOworCWludCBlcnIsIGlycSwgaTsKKworCWdfdmlydF90b19idXNfb2Zmc2V0ID0gdmlydF90b19kbWEoZGV2LCAodm9pZCAqKTApOworCisJKHZvaWQpb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAiY2FjaGUtbGluZS1zaXplIiwKKwkJCQkgICAmZ19jYWNoZV9saW5lX3NpemUpOworCWdfZnJhZ21lbnRzX3NpemUgPSAyICogZ19jYWNoZV9saW5lX3NpemU7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGNoYW5uZWxzIGluIGNvaGVyZW50IG1lbW9yeSAqLworCXNsb3RfbWVtX3NpemUgPSBQQUdFX0FMSUdOKFRPVEFMX1NMT1RTICogVkNISVFfU0xPVF9TSVpFKTsKKwlmcmFnX21lbV9zaXplID0gUEFHRV9BTElHTihnX2ZyYWdtZW50c19zaXplICogTUFYX0ZSQUdNRU5UUyk7CisKKwlzbG90X21lbSA9IGRtYW1fYWxsb2NfY29oZXJlbnQoZGV2LCBzbG90X21lbV9zaXplICsgZnJhZ19tZW1fc2l6ZSwKKwkJCQkgICAgICAgJnNsb3RfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFzbG90X21lbSkgeworCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBETUEgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJV0FSTl9PTigoKGludClzbG90X21lbSAmIChQQUdFX1NJWkUgLSAxKSkgIT0gMCk7CisKKwl2Y2hpcV9zbG90X3plcm8gPSB2Y2hpcV9pbml0X3Nsb3RzKHNsb3RfbWVtLCBzbG90X21lbV9zaXplKTsKKwlpZiAoIXZjaGlxX3Nsb3RfemVybykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2Y2hpcV9zbG90X3plcm8tPnBsYXRmb3JtX2RhdGFbVkNISVFfUExBVEZPUk1fRlJBR01FTlRTX09GRlNFVF9JRFhdID0KKwkJKGludClzbG90X3BoeXMgKyBzbG90X21lbV9zaXplOworCXZjaGlxX3Nsb3RfemVyby0+cGxhdGZvcm1fZGF0YVtWQ0hJUV9QTEFURk9STV9GUkFHTUVOVFNfQ09VTlRfSURYXSA9CisJCU1BWF9GUkFHTUVOVFM7CisKKwlnX2ZyYWdtZW50c19iYXNlID0gKGNoYXIgKilzbG90X21lbSArIHNsb3RfbWVtX3NpemU7CisJc2xvdF9tZW1fc2l6ZSArPSBmcmFnX21lbV9zaXplOworCisJZ19mcmVlX2ZyYWdtZW50cyA9IGdfZnJhZ21lbnRzX2Jhc2U7CisJZm9yIChpID0gMDsgaSA8IChNQVhfRlJBR01FTlRTIC0gMSk7IGkrKykgeworCQkqKGNoYXIgKiopJmdfZnJhZ21lbnRzX2Jhc2VbaSpnX2ZyYWdtZW50c19zaXplXSA9CisJCQkmZ19mcmFnbWVudHNfYmFzZVsoaSArIDEpKmdfZnJhZ21lbnRzX3NpemVdOworCX0KKwkqKGNoYXIgKiopJmdfZnJhZ21lbnRzX2Jhc2VbaSAqIGdfZnJhZ21lbnRzX3NpemVdID0gTlVMTDsKKwlzZW1hX2luaXQoJmdfZnJlZV9mcmFnbWVudHNfc2VtYSwgTUFYX0ZSQUdNRU5UUyk7CisKKwlpZiAodmNoaXFfaW5pdF9zdGF0ZShzdGF0ZSwgdmNoaXFfc2xvdF96ZXJvLCAwKSAhPSBWQ0hJUV9TVUNDRVNTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJZ19yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihnX3JlZ3MpKQorCQlyZXR1cm4gUFRSX0VSUihnX3JlZ3MpOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDw9IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IElSUVxuIik7CisJCXJldHVybiBpcnE7CisJfQorCisJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGlycSwgdmNoaXFfZG9vcmJlbGxfaXJxLCBJUlFGX0lSUVBPTEwsCisJCQkgICAgICAgIlZDSElRIGRvb3JiZWxsIiwgc3RhdGUpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgaXJxPSVkXG4iLCBpcnEpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNlbmQgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgc2xvdHMgdG8gVmlkZW9Db3JlICovCisJY2hhbm5lbGJhc2UgPSBzbG90X3BoeXM7CisJZXJyID0gcnBpX2Zpcm13YXJlX3Byb3BlcnR5KGZ3LCBSUElfRklSTVdBUkVfVkNISVFfSU5JVCwKKwkJCQkgICAgJmNoYW5uZWxiYXNlLCBzaXplb2YoY2hhbm5lbGJhc2UpKTsKKwlpZiAoZXJyIHx8IGNoYW5uZWxiYXNlKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHNldCBjaGFubmVsYmFzZVxuIik7CisJCXJldHVybiBlcnIgPyA6IC1FTlhJTzsKKwl9CisKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkidmNoaXFfaW5pdCAtIGRvbmUgKHNsb3RzICV4LCBwaHlzICVwYWQpIiwKKwkJKHVuc2lnbmVkIGludCl2Y2hpcV9zbG90X3plcm8sICZzbG90X3BoeXMpOworCisJdmNoaXFfY2FsbF9jb25uZWN0ZWRfY2FsbGJhY2tzKCk7CisKKyAgIHJldHVybiAwOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcGxhdGZvcm1faW5pdF9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKyAgIFZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisgICBzdGF0ZS0+cGxhdGZvcm1fc3RhdGUgPSBremFsbG9jKHNpemVvZihWQ0hJUV8yODM1X0FSTV9TVEFURV9UKSwgR0ZQX0tFUk5FTCk7CisgICAoKFZDSElRXzI4MzVfQVJNX1NUQVRFX1QqKXN0YXRlLT5wbGF0Zm9ybV9zdGF0ZSktPmluaXRlZCA9IDE7CisgICBzdGF0dXMgPSB2Y2hpcV9hcm1faW5pdF9zdGF0ZShzdGF0ZSwgJigoVkNISVFfMjgzNV9BUk1fU1RBVEVfVCopc3RhdGUtPnBsYXRmb3JtX3N0YXRlKS0+YXJtX3N0YXRlKTsKKyAgIGlmKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKQorICAgeworICAgICAgKChWQ0hJUV8yODM1X0FSTV9TVEFURV9UKilzdGF0ZS0+cGxhdGZvcm1fc3RhdGUpLT5pbml0ZWQgPSAwOworICAgfQorICAgcmV0dXJuIHN0YXR1czsKK30KKworVkNISVFfQVJNX1NUQVRFX1QqCit2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworICAgaWYoISgoVkNISVFfMjgzNV9BUk1fU1RBVEVfVCopc3RhdGUtPnBsYXRmb3JtX3N0YXRlKS0+aW5pdGVkKQorICAgeworICAgICAgQlVHKCk7CisgICB9CisgICByZXR1cm4gJigoVkNISVFfMjgzNV9BUk1fU1RBVEVfVCopc3RhdGUtPnBsYXRmb3JtX3N0YXRlKS0+YXJtX3N0YXRlOworfQorCit2b2lkCityZW1vdGVfZXZlbnRfc2lnbmFsKFJFTU9URV9FVkVOVF9UICpldmVudCkKK3sKKwl3bWIoKTsKKworCWV2ZW50LT5maXJlZCA9IDE7CisKKwlkc2IoKTsgICAgICAgICAvKiBkYXRhIGJhcnJpZXIgb3BlcmF0aW9uICovCisKKwlpZiAoZXZlbnQtPmFybWVkKQorCQl3cml0ZWwoMCwgZ19yZWdzICsgQkVMTDIpOyAvKiB0cmlnZ2VyIHZjIGludGVycnVwdCAqLworfQorCitpbnQKK3ZjaGlxX2NvcHlfZnJvbV91c2VyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgc2l6ZSkKK3sKKwlpZiAoKHVpbnQzMl90KXNyYyA8IFRBU0tfU0laRSkgeworCQlyZXR1cm4gY29weV9mcm9tX3VzZXIoZHN0LCBzcmMsIHNpemUpOworCX0gZWxzZSB7CisJCW1lbWNweShkc3QsIHNyYywgc2l6ZSk7CisJCXJldHVybiAwOworCX0KK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3ByZXBhcmVfYnVsa19kYXRhKFZDSElRX0JVTEtfVCAqYnVsaywgVkNISV9NRU1fSEFORExFX1QgbWVtaGFuZGxlLAorCXZvaWQgKm9mZnNldCwgaW50IHNpemUsIGludCBkaXIpCit7CisJUEFHRUxJU1RfVCAqcGFnZWxpc3Q7CisJaW50IHJldDsKKworCVdBUk5fT04obWVtaGFuZGxlICE9IFZDSElfTUVNX0hBTkRMRV9JTlZBTElEKTsKKworCXJldCA9IGNyZWF0ZV9wYWdlbGlzdCgoY2hhciBfX3VzZXIgKilvZmZzZXQsIHNpemUsCisJCQkoZGlyID09IFZDSElRX0JVTEtfUkVDRUlWRSkKKwkJCT8gUEFHRUxJU1RfUkVBRAorCQkJOiBQQUdFTElTVF9XUklURSwKKwkJCWN1cnJlbnQsCisJCQkmcGFnZWxpc3QpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCisJYnVsay0+aGFuZGxlID0gbWVtaGFuZGxlOworCWJ1bGstPmRhdGEgPSBWQ0hJUV9BUk1fQUREUkVTUyhwYWdlbGlzdCk7CisKKwkvKiBTdG9yZSB0aGUgcGFnZWxpc3QgYWRkcmVzcyBpbiByZW1vdGVfZGF0YSwgd2hpY2ggaXNuJ3QgdXNlZCBieSB0aGUKKwkgICBzbGF2ZS4gKi8KKwlidWxrLT5yZW1vdGVfZGF0YSA9IHBhZ2VsaXN0OworCisJcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKK3ZvaWQKK3ZjaGlxX2NvbXBsZXRlX2J1bGsoVkNISVFfQlVMS19UICpidWxrKQoreworCWlmIChidWxrICYmIGJ1bGstPnJlbW90ZV9kYXRhICYmIGJ1bGstPmFjdHVhbCkKKwkJZnJlZV9wYWdlbGlzdCgoUEFHRUxJU1RfVCAqKWJ1bGstPnJlbW90ZV9kYXRhLCBidWxrLT5hY3R1YWwpOworfQorCit2b2lkCit2Y2hpcV90cmFuc2Zlcl9idWxrKFZDSElRX0JVTEtfVCAqYnVsaykKK3sKKwkvKgorCSAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIHRoZSBtYXN0ZXIgKFZpZGVvQ29yZSkgc2lkZSwgYnV0CisJICogcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0byBhdm9pZCB0aGUgbmVlZCBmb3IgaWZkZWZlcnkuCisJICovCisJQlVHKCk7Cit9CisKK3ZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1fc3RhdGUodm9pZCAqZHVtcF9jb250ZXh0KQoreworCWNoYXIgYnVmWzgwXTsKKwlpbnQgbGVuOworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCSIgIFBsYXRmb3JtOiAyODM1IChWQyBtYXN0ZXIpIik7CisJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9wbGF0Zm9ybV9zdXNwZW5kKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworICAgcmV0dXJuIFZDSElRX0VSUk9SOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcGxhdGZvcm1fcmVzdW1lKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworICAgcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKK3ZvaWQKK3ZjaGlxX3BsYXRmb3JtX3BhdXNlZChWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKK30KKwordm9pZAordmNoaXFfcGxhdGZvcm1fcmVzdW1lZChWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKK30KKworaW50Cit2Y2hpcV9wbGF0Zm9ybV92aWRlb2NvcmVfd2FudGVkKFZDSElRX1NUQVRFX1QqIHN0YXRlKQoreworICAgcmV0dXJuIDE7IC8vIGF1dG9zdXNwZW5kIG5vdCBzdXBwb3J0ZWQgLSB2aWRlb2NvcmUgYWx3YXlzIHdhbnRlZAorfQorCitpbnQKK3ZjaGlxX3BsYXRmb3JtX3VzZV9zdXNwZW5kX3RpbWVyKHZvaWQpCit7CisgICByZXR1cm4gMDsKK30KK3ZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1fdXNlX3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsICJTdXNwZW5kIHRpbWVyIG5vdCBpbiB1c2UiKTsKK30KK3ZvaWQKK3ZjaGlxX3BsYXRmb3JtX2hhbmRsZV90aW1lb3V0KFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCSh2b2lkKXN0YXRlOworfQorLyoKKyAqIExvY2FsIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAordmNoaXFfZG9vcmJlbGxfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IGRldl9pZDsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJLyogUmVhZCAoYW5kIGNsZWFyKSB0aGUgZG9vcmJlbGwgKi8KKwlzdGF0dXMgPSByZWFkbChnX3JlZ3MgKyBCRUxMMCk7CisKKwlpZiAoc3RhdHVzICYgMHg0KSB7ICAvKiBXYXMgdGhlIGRvb3JiZWxsIHJ1bmc/ICovCisJCXJlbW90ZV9ldmVudF9wb2xsYWxsKHN0YXRlKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogVGhlcmUgaXMgYSBwb3RlbnRpYWwgcHJvYmxlbSB3aXRoIHBhcnRpYWwgY2FjaGUgbGluZXMgKHBhZ2VzPykKKyoqIGF0IHRoZSBlbmRzIG9mIHRoZSBibG9jayB3aGVuIHJlYWRpbmcuIElmIHRoZSBDUFUgYWNjZXNzZWQgYW55dGhpbmcgaW4KKyoqIHRoZSBzYW1lIGxpbmUgKHBhZ2U/KSB0aGVuIGl0IG1heSBoYXZlIHB1bGxlZCBvbGQgZGF0YSBpbnRvIHRoZSBjYWNoZSwKKyoqIG9ic2N1cmluZyB0aGUgbmV3IGRhdGEgdW5kZXJuZWF0aC4gV2UgY2FuIHNvbHZlIHRoaXMgYnkgdHJhbnNmZXJyaW5nIHRoZQorKiogcGFydGlhbCBjYWNoZSBsaW5lcyBzZXBhcmF0ZWx5LCBhbmQgYWxsb3dpbmcgdGhlIEFSTSB0byBjb3B5IGludG8gdGhlCisqKiBjYWNoZWQgYXJlYS4KKworKiogTi5CLiBUaGlzIGltcGxlbWVudGF0aW9uIHBsYXlzIHNsaWdodGx5IGZhc3QgYW5kIGxvb3NlIHdpdGggdGhlIExpbnV4CisqKiBkcml2ZXIgcHJvZ3JhbW1pbmcgcnVsZXMsIGUuZy4gaXRzIHVzZSBvZiBkbWFjX21hcF9hcmVhIGluc3RlYWQgb2YKKyoqIGRtYV9tYXBfc2luZ2xlLCBidXQgaXQgaXNuJ3QgYSBtdWx0aS1wbGF0Zm9ybSBkcml2ZXIgYW5kIGl0IGJlbmVmaXRzCisqKiBmcm9tIGluY3JlYXNlZCBzcGVlZCBhcyBhIHJlc3VsdC4KKyovCisKK3N0YXRpYyBpbnQKK2NyZWF0ZV9wYWdlbGlzdChjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIHVuc2lnbmVkIHNob3J0IHR5cGUsCisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBQQUdFTElTVF9UICoqIHBwYWdlbGlzdCkKK3sKKwlQQUdFTElTVF9UICpwYWdlbGlzdDsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCXVuc2lnbmVkIGxvbmcgKmFkZHJzOworCXVuc2lnbmVkIGludCBudW1fcGFnZXMsIG9mZnNldCwgaTsKKwljaGFyICphZGRyLCAqYmFzZV9hZGRyLCAqbmV4dF9hZGRyOworCWludCBydW4sIGFkZHJpZHgsIGFjdHVhbF9wYWdlczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyAqbmVlZF9yZWxlYXNlOworCisJb2Zmc2V0ID0gKHVuc2lnbmVkIGludClidWYgJiAoUEFHRV9TSVpFIC0gMSk7CisJbnVtX3BhZ2VzID0gKGNvdW50ICsgb2Zmc2V0ICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisKKwkqcHBhZ2VsaXN0ID0gTlVMTDsKKworCS8qIEFsbG9jYXRlIGVub3VnaCBzdG9yYWdlIHRvIGhvbGQgdGhlIHBhZ2UgcG9pbnRlcnMgYW5kIHRoZSBwYWdlCisJKiogbGlzdAorCSovCisJcGFnZWxpc3QgPSBrbWFsbG9jKHNpemVvZihQQUdFTElTVF9UKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVtX3BhZ2VzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodW5zaWduZWQgbG9uZykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bV9wYWdlcyAqIHNpemVvZihwYWdlc1swXSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJImNyZWF0ZV9wYWdlbGlzdCAtICV4IiwgKHVuc2lnbmVkIGludClwYWdlbGlzdCk7CisJaWYgKCFwYWdlbGlzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhZGRycyA9IHBhZ2VsaXN0LT5hZGRyczsKKyAgICAgICAgbmVlZF9yZWxlYXNlID0gKHVuc2lnbmVkIGxvbmcgKikoYWRkcnMgKyBudW1fcGFnZXMpOworCXBhZ2VzID0gKHN0cnVjdCBwYWdlICoqKShhZGRycyArIG51bV9wYWdlcyArIDEpOworCisJaWYgKGlzX3ZtYWxsb2NfYWRkcihidWYpKSB7CisJCWludCBkaXIgPSAodHlwZSA9PSBQQUdFTElTVF9XUklURSkgPworCQkJRE1BX1RPX0RFVklDRSA6IERNQV9GUk9NX0RFVklDRTsKKwkJdW5zaWduZWQgbG9uZyBsZW5ndGggPSBjb3VudDsKKwkJdW5zaWduZWQgaW50IG9mZiA9IG9mZnNldDsKKworCQlmb3IgKGFjdHVhbF9wYWdlcyA9IDA7IGFjdHVhbF9wYWdlcyA8IG51bV9wYWdlczsKKwkJICAgICBhY3R1YWxfcGFnZXMrKykgeworCQkJc3RydWN0IHBhZ2UgKnBnID0gdm1hbGxvY190b19wYWdlKGJ1ZiArIChhY3R1YWxfcGFnZXMgKgorCQkJCQkJCQkgUEFHRV9TSVpFKSk7CisJCQlzaXplX3QgYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmY7CisKKwkJCWlmIChieXRlcyA+IGxlbmd0aCkKKwkJCQlieXRlcyA9IGxlbmd0aDsKKwkJCXBhZ2VzW2FjdHVhbF9wYWdlc10gPSBwZzsKKwkJCWRtYWNfbWFwX2FyZWEocGFnZV9hZGRyZXNzKHBnKSArIG9mZiwgYnl0ZXMsIGRpcik7CisJCQlsZW5ndGggLT0gYnl0ZXM7CisJCQlvZmYgPSAwOworCQl9CisJCSpuZWVkX3JlbGVhc2UgPSAwOyAvKiBkbyBub3QgdHJ5IGFuZCByZWxlYXNlIHZtYWxsb2MgcGFnZXMgKi8KKwl9IGVsc2UgeworCQlkb3duX3JlYWQoJnRhc2stPm1tLT5tbWFwX3NlbSk7CisJCWFjdHVhbF9wYWdlcyA9IGdldF91c2VyX3BhZ2VzKHRhc2ssIHRhc2stPm1tLAorCQkJCSAgICAgICAgICAodW5zaWduZWQgbG9uZylidWYgJiB+KFBBR0VfU0laRSAtIDEpLAorCQkJCQkgIG51bV9wYWdlcywKKwkJCQkJICAodHlwZSA9PSBQQUdFTElTVF9SRUFEKSAvKldyaXRlICovICwKKwkJCQkJICAwIC8qRm9yY2UgKi8gLAorCQkJCQkgIHBhZ2VzLAorCQkJCQkgIE5VTEwgLyp2bWFzICovKTsKKwkJdXBfcmVhZCgmdGFzay0+bW0tPm1tYXBfc2VtKTsKKworCQlpZiAoYWN0dWFsX3BhZ2VzICE9IG51bV9wYWdlcykgeworCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkgICAgICAgImNyZWF0ZV9wYWdlbGlzdCAtIG9ubHkgJWQvJWQgcGFnZXMgbG9ja2VkIiwKKwkJCQkgICAgICAgYWN0dWFsX3BhZ2VzLAorCQkJCSAgICAgICBudW1fcGFnZXMpOworCisJCQkvKiBUaGlzIGlzIHByb2JhYmx5IGR1ZSB0byB0aGUgcHJvY2VzcyBiZWluZyBraWxsZWQgKi8KKwkJCXdoaWxlIChhY3R1YWxfcGFnZXMgPiAwKQorCQkJeworCQkJCWFjdHVhbF9wYWdlcy0tOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlc1thY3R1YWxfcGFnZXNdKTsKKwkJCX0KKwkJCWtmcmVlKHBhZ2VsaXN0KTsKKwkJCWlmIChhY3R1YWxfcGFnZXMgPT0gMCkKKwkJCQlhY3R1YWxfcGFnZXMgPSAtRU5PTUVNOworCQkJcmV0dXJuIGFjdHVhbF9wYWdlczsKKwkJfQorCQkqbmVlZF9yZWxlYXNlID0gMTsgLyogcmVsZWFzZSB1c2VyIHBhZ2VzICovCisJfQorCisJcGFnZWxpc3QtPmxlbmd0aCA9IGNvdW50OworCXBhZ2VsaXN0LT50eXBlID0gdHlwZTsKKwlwYWdlbGlzdC0+b2Zmc2V0ID0gb2Zmc2V0OworCisJLyogR3JvdXAgdGhlIHBhZ2VzIGludG8gcnVucyBvZiBjb250aWd1b3VzIHBhZ2VzICovCisKKwliYXNlX2FkZHIgPSBWQ0hJUV9BUk1fQUREUkVTUyhwYWdlX2FkZHJlc3MocGFnZXNbMF0pKTsKKwluZXh0X2FkZHIgPSBiYXNlX2FkZHIgKyBQQUdFX1NJWkU7CisJYWRkcmlkeCA9IDA7CisJcnVuID0gMDsKKworCWZvciAoaSA9IDE7IGkgPCBudW1fcGFnZXM7IGkrKykgeworCQlhZGRyID0gVkNISVFfQVJNX0FERFJFU1MocGFnZV9hZGRyZXNzKHBhZ2VzW2ldKSk7CisJCWlmICgoYWRkciA9PSBuZXh0X2FkZHIpICYmIChydW4gPCAoUEFHRV9TSVpFIC0gMSkpKSB7CisJCQluZXh0X2FkZHIgKz0gUEFHRV9TSVpFOworCQkJcnVuKys7CisJCX0gZWxzZSB7CisJCQlhZGRyc1thZGRyaWR4XSA9ICh1bnNpZ25lZCBsb25nKWJhc2VfYWRkciArIHJ1bjsKKwkJCWFkZHJpZHgrKzsKKwkJCWJhc2VfYWRkciA9IGFkZHI7CisJCQluZXh0X2FkZHIgPSBhZGRyICsgUEFHRV9TSVpFOworCQkJcnVuID0gMDsKKwkJfQorCX0KKworCWFkZHJzW2FkZHJpZHhdID0gKHVuc2lnbmVkIGxvbmcpYmFzZV9hZGRyICsgcnVuOworCWFkZHJpZHgrKzsKKworCS8qIFBhcnRpYWwgY2FjaGUgbGluZXMgKGZyYWdtZW50cykgcmVxdWlyZSBzcGVjaWFsIG1lYXN1cmVzICovCisJaWYgKCh0eXBlID09IFBBR0VMSVNUX1JFQUQpICYmCisJCSgocGFnZWxpc3QtPm9mZnNldCAmIChnX2NhY2hlX2xpbmVfc2l6ZSAtIDEpKSB8fAorCQkoKHBhZ2VsaXN0LT5vZmZzZXQgKyBwYWdlbGlzdC0+bGVuZ3RoKSAmCisJCShnX2NhY2hlX2xpbmVfc2l6ZSAtIDEpKSkpIHsKKwkJY2hhciAqZnJhZ21lbnRzOworCisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJmdfZnJlZV9mcmFnbWVudHNfc2VtYSkgIT0gMCkgeworCQkJa2ZyZWUocGFnZWxpc3QpOworCQkJcmV0dXJuIC1FSU5UUjsKKwkJfQorCisJCVdBUk5fT04oZ19mcmVlX2ZyYWdtZW50cyA9PSBOVUxMKTsKKworCQlkb3duKCZnX2ZyZWVfZnJhZ21lbnRzX211dGV4KTsKKwkJZnJhZ21lbnRzID0gZ19mcmVlX2ZyYWdtZW50czsKKwkJV0FSTl9PTihmcmFnbWVudHMgPT0gTlVMTCk7CisJCWdfZnJlZV9mcmFnbWVudHMgPSAqKGNoYXIgKiopIGdfZnJlZV9mcmFnbWVudHM7CisJCXVwKCZnX2ZyZWVfZnJhZ21lbnRzX211dGV4KTsKKwkJcGFnZWxpc3QtPnR5cGUgPSBQQUdFTElTVF9SRUFEX1dJVEhfRlJBR01FTlRTICsKKwkJCShmcmFnbWVudHMgLSBnX2ZyYWdtZW50c19iYXNlKSAvIGdfZnJhZ21lbnRzX3NpemU7CisJfQorCisJZG1hY19mbHVzaF9yYW5nZShwYWdlbGlzdCwgYWRkcnMgKyBudW1fcGFnZXMpOworCisJKnBwYWdlbGlzdCA9IHBhZ2VsaXN0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX3BhZ2VsaXN0KFBBR0VMSVNUX1QgKnBhZ2VsaXN0LCBpbnQgYWN0dWFsKQoreworICAgICAgICB1bnNpZ25lZCBsb25nICpuZWVkX3JlbGVhc2U7CisJc3RydWN0IHBhZ2UgKipwYWdlczsKKwl1bnNpZ25lZCBpbnQgbnVtX3BhZ2VzLCBpOworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCSJmcmVlX3BhZ2VsaXN0IC0gJXgsICVkIiwgKHVuc2lnbmVkIGludClwYWdlbGlzdCwgYWN0dWFsKTsKKworCW51bV9wYWdlcyA9CisJCShwYWdlbGlzdC0+bGVuZ3RoICsgcGFnZWxpc3QtPm9mZnNldCArIFBBR0VfU0laRSAtIDEpIC8KKwkJUEFHRV9TSVpFOworCisgICAgICAgIG5lZWRfcmVsZWFzZSA9ICh1bnNpZ25lZCBsb25nICopKHBhZ2VsaXN0LT5hZGRycyArIG51bV9wYWdlcyk7CisJcGFnZXMgPSAoc3RydWN0IHBhZ2UgKiopKHBhZ2VsaXN0LT5hZGRycyArIG51bV9wYWdlcyArIDEpOworCisJLyogRGVhbCB3aXRoIGFueSBwYXJ0aWFsIGNhY2hlIGxpbmVzIChmcmFnbWVudHMpICovCisJaWYgKHBhZ2VsaXN0LT50eXBlID49IFBBR0VMSVNUX1JFQURfV0lUSF9GUkFHTUVOVFMpIHsKKwkJY2hhciAqZnJhZ21lbnRzID0gZ19mcmFnbWVudHNfYmFzZSArCisJCQkocGFnZWxpc3QtPnR5cGUgLSBQQUdFTElTVF9SRUFEX1dJVEhfRlJBR01FTlRTKSAqCisJCQlnX2ZyYWdtZW50c19zaXplOworCQlpbnQgaGVhZF9ieXRlcywgdGFpbF9ieXRlczsKKwkJaGVhZF9ieXRlcyA9IChnX2NhY2hlX2xpbmVfc2l6ZSAtIHBhZ2VsaXN0LT5vZmZzZXQpICYKKwkJCShnX2NhY2hlX2xpbmVfc2l6ZSAtIDEpOworCQl0YWlsX2J5dGVzID0gKHBhZ2VsaXN0LT5vZmZzZXQgKyBhY3R1YWwpICYKKwkJCShnX2NhY2hlX2xpbmVfc2l6ZSAtIDEpOworCisJCWlmICgoYWN0dWFsID49IDApICYmIChoZWFkX2J5dGVzICE9IDApKSB7CisJCQlpZiAoaGVhZF9ieXRlcyA+IGFjdHVhbCkKKwkJCQloZWFkX2J5dGVzID0gYWN0dWFsOworCisJCQltZW1jcHkoKGNoYXIgKilwYWdlX2FkZHJlc3MocGFnZXNbMF0pICsKKwkJCQlwYWdlbGlzdC0+b2Zmc2V0LAorCQkJCWZyYWdtZW50cywKKwkJCQloZWFkX2J5dGVzKTsKKwkJfQorCQlpZiAoKGFjdHVhbCA+PSAwKSAmJiAoaGVhZF9ieXRlcyA8IGFjdHVhbCkgJiYKKwkJCSh0YWlsX2J5dGVzICE9IDApKSB7CisJCQltZW1jcHkoKGNoYXIgKilwYWdlX2FkZHJlc3MocGFnZXNbbnVtX3BhZ2VzIC0gMV0pICsKKwkJCQkoKHBhZ2VsaXN0LT5vZmZzZXQgKyBhY3R1YWwpICYKKwkJCQkoUEFHRV9TSVpFIC0gMSkgJiB+KGdfY2FjaGVfbGluZV9zaXplIC0gMSkpLAorCQkJCWZyYWdtZW50cyArIGdfY2FjaGVfbGluZV9zaXplLAorCQkJCXRhaWxfYnl0ZXMpOworCQl9CisKKwkJZG93bigmZ19mcmVlX2ZyYWdtZW50c19tdXRleCk7CisJCSooY2hhciAqKilmcmFnbWVudHMgPSBnX2ZyZWVfZnJhZ21lbnRzOworCQlnX2ZyZWVfZnJhZ21lbnRzID0gZnJhZ21lbnRzOworCQl1cCgmZ19mcmVlX2ZyYWdtZW50c19tdXRleCk7CisJCXVwKCZnX2ZyZWVfZnJhZ21lbnRzX3NlbWEpOworCX0KKworCWlmICgqbmVlZF9yZWxlYXNlKSB7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSBwYWdlbGlzdC0+bGVuZ3RoOworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gcGFnZWxpc3QtPm9mZnNldDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BhZ2VzOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwZyA9IHBhZ2VzW2ldOworCisJCQlpZiAocGFnZWxpc3QtPnR5cGUgIT0gUEFHRUxJU1RfV1JJVEUpIHsKKwkJCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CisKKwkJCQlpZiAoYnl0ZXMgPiBsZW5ndGgpCisJCQkJCWJ5dGVzID0gbGVuZ3RoOworCQkJCWRtYWNfdW5tYXBfYXJlYShwYWdlX2FkZHJlc3MocGcpICsgb2Zmc2V0LAorCQkJCQkJYnl0ZXMsIERNQV9GUk9NX0RFVklDRSk7CisJCQkJbGVuZ3RoIC09IGJ5dGVzOworCQkJCW9mZnNldCA9IDA7CisJCQkJc2V0X3BhZ2VfZGlydHkocGcpOworCQkJfQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBnKTsKKwkJfQorCX0KKworCWtmcmVlKHBhZ2VsaXN0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYXJtLmMgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMWMwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2FybS5jCkBAIC0wLDAgKzEsMjkwMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUmFzcGJlcnJ5IFBpIChUcmFkaW5nKSBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c29jL2JjbTI4MzUvcmFzcGJlcnJ5cGktZmlybXdhcmUuaD4KKworI2luY2x1ZGUgInZjaGlxX2NvcmUuaCIKKyNpbmNsdWRlICJ2Y2hpcV9pb2N0bC5oIgorI2luY2x1ZGUgInZjaGlxX2FybS5oIgorI2luY2x1ZGUgInZjaGlxX2RlYnVnZnMuaCIKKyNpbmNsdWRlICJ2Y2hpcV9raWxsYWJsZS5oIgorCisjZGVmaW5lIERFVklDRV9OQU1FICJ2Y2hpcSIKKworLyogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgcHJlZml4LCB3aGljaCB3b3VsZCBiZSB2Y2hpcV9hcm0gKGZyb20gdGhlIGZpbGVuYW1lKSAqLworI3VuZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKKyNkZWZpbmUgTU9EVUxFX1BBUkFNX1BSRUZJWCBERVZJQ0VfTkFNRSAiLiIKKworI2RlZmluZSBWQ0hJUV9NSU5PUiAwCisKKy8qIFNvbWUgcGVyLWluc3RhbmNlIGNvbnN0YW50cyAqLworI2RlZmluZSBNQVhfQ09NUExFVElPTlMgMTYKKyNkZWZpbmUgTUFYX1NFUlZJQ0VTIDY0CisjZGVmaW5lIE1BWF9FTEVNRU5UUyA4CisjZGVmaW5lIE1TR19RVUVVRV9TSVpFIDY0CisKKyNkZWZpbmUgS0VFUEFMSVZFX1ZFUiAxCisjZGVmaW5lIEtFRVBBTElWRV9WRVJfTUlOIEtFRVBBTElWRV9WRVIKKworLyogUnVuIHRpbWUgY29udHJvbCBvZiBsb2cgbGV2ZWwsIGJhc2VkIG9uIEtFUk5fWFhYIGxldmVsLiAqLworaW50IHZjaGlxX2FybV9sb2dfbGV2ZWwgPSBWQ0hJUV9MT0dfREVGQVVMVDsKK2ludCB2Y2hpcV9zdXNwX2xvZ19sZXZlbCA9IFZDSElRX0xPR19FUlJPUjsKKworI2RlZmluZSBTVVNQRU5EX1RJTUVSX1RJTUVPVVRfTVMgMTAwCisjZGVmaW5lIFNVU1BFTkRfUkVUUllfVElNRVJfVElNRU9VVF9NUyAxMDAwCisKKyNkZWZpbmUgVkNfU1VTUEVORF9OVU1fT0ZGU0VUIDMgLyogbnVtYmVyIG9mIHZhbHVlcyBiZWZvcmUgaWRsZSB3aGljaCBhcmUgLXZlICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3VzcGVuZF9zdGF0ZV9uYW1lc1tdID0geworCSJWQ19TVVNQRU5EX0ZPUkNFX0NBTkNFTEVEIiwKKwkiVkNfU1VTUEVORF9SRUpFQ1RFRCIsCisJIlZDX1NVU1BFTkRfRkFJTEVEIiwKKwkiVkNfU1VTUEVORF9JRExFIiwKKwkiVkNfU1VTUEVORF9SRVFVRVNURUQiLAorCSJWQ19TVVNQRU5EX0lOX1BST0dSRVNTIiwKKwkiVkNfU1VTUEVORF9TVVNQRU5ERUQiCit9OworI2RlZmluZSBWQ19SRVNVTUVfTlVNX09GRlNFVCAxIC8qIG51bWJlciBvZiB2YWx1ZXMgYmVmb3JlIGlkbGUgd2hpY2ggYXJlIC12ZSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJlc3VtZV9zdGF0ZV9uYW1lc1tdID0geworCSJWQ19SRVNVTUVfRkFJTEVEIiwKKwkiVkNfUkVTVU1FX0lETEUiLAorCSJWQ19SRVNVTUVfUkVRVUVTVEVEIiwKKwkiVkNfUkVTVU1FX0lOX1BST0dSRVNTIiwKKwkiVkNfUkVTVU1FX1JFU1VNRUQiCit9OworLyogVGhlIG51bWJlciBvZiB0aW1lcyB3ZSBhbGxvdyBmb3JjZSBzdXNwZW5kIHRvIHRpbWVvdXQgYmVmb3JlIGFjdHVhbGx5CisqKiBfZm9yY2luZ18gc3VzcGVuZC4gIFRoaXMgaXMgdG8gY2F0ZXIgZm9yIFNXIHdoaWNoIGZhaWxzIHRvIHJlbGVhc2UgdmNoaXEKKyoqIGNvcnJlY3RseSAtIHdlIGRvbid0IHdhbnQgdG8gcHJldmVudCBBUk0gc3VzcGVuZCBpbmRlZmluaXRlbHkgaW4gdGhpcyBjYXNlLgorKi8KKyNkZWZpbmUgRk9SQ0VfU1VTUEVORF9GQUlMX01BWCA4CisKKy8qIFRoZSB0aW1lIGluIG1zIGFsbG93ZWQgZm9yIHZpZGVvY29yZSB0byBnbyBpZGxlIHdoZW4gZm9yY2Ugc3VzcGVuZCBoYXMgYmVlbgorICogcmVxdWVzdGVkICovCisjZGVmaW5lIEZPUkNFX1NVU1BFTkRfVElNRU9VVF9NUyAyMDAKKworCitzdGF0aWMgdm9pZCBzdXNwZW5kX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgY29udGV4dCk7CisKKwordHlwZWRlZiBzdHJ1Y3QgdXNlcl9zZXJ2aWNlX3N0cnVjdCB7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCXZvaWQgKnVzZXJkYXRhOworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2U7CisJY2hhciBpc192Y2hpOworCWNoYXIgZGVxdWV1ZV9wZW5kaW5nOworCWNoYXIgY2xvc2VfcGVuZGluZzsKKwlpbnQgbWVzc2FnZV9hdmFpbGFibGVfcG9zOworCWludCBtc2dfaW5zZXJ0OworCWludCBtc2dfcmVtb3ZlOworCXN0cnVjdCBzZW1hcGhvcmUgaW5zZXJ0X2V2ZW50OworCXN0cnVjdCBzZW1hcGhvcmUgcmVtb3ZlX2V2ZW50OworCXN0cnVjdCBzZW1hcGhvcmUgY2xvc2VfZXZlbnQ7CisJVkNISVFfSEVBREVSX1QgKiBtc2dfcXVldWVbTVNHX1FVRVVFX1NJWkVdOworfSBVU0VSX1NFUlZJQ0VfVDsKKworc3RydWN0IGJ1bGtfd2FpdGVyX25vZGUgeworCXN0cnVjdCBidWxrX3dhaXRlciBidWxrX3dhaXRlcjsKKwlpbnQgcGlkOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCB2Y2hpcV9pbnN0YW5jZV9zdHJ1Y3QgeworCVZDSElRX1NUQVRFX1QgKnN0YXRlOworCVZDSElRX0NPTVBMRVRJT05fREFUQV9UIGNvbXBsZXRpb25zW01BWF9DT01QTEVUSU9OU107CisJaW50IGNvbXBsZXRpb25faW5zZXJ0OworCWludCBjb21wbGV0aW9uX3JlbW92ZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGluc2VydF9ldmVudDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHJlbW92ZV9ldmVudDsKKwlzdHJ1Y3QgbXV0ZXggY29tcGxldGlvbl9tdXRleDsKKworCWludCBjb25uZWN0ZWQ7CisJaW50IGNsb3Npbmc7CisJaW50IHBpZDsKKwlpbnQgbWFyazsKKwlpbnQgdXNlX2Nsb3NlX2RlbGl2ZXJlZDsKKwlpbnQgdHJhY2U7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1bGtfd2FpdGVyX2xpc3Q7CisJc3RydWN0IG11dGV4IGJ1bGtfd2FpdGVyX2xpc3RfbXV0ZXg7CisKKwlWQ0hJUV9ERUJVR0ZTX05PREVfVCBkZWJ1Z2ZzX25vZGU7Cit9OworCit0eXBlZGVmIHN0cnVjdCBkdW1wX2NvbnRleHRfc3RydWN0IHsKKwljaGFyIF9fdXNlciAqYnVmOworCXNpemVfdCBhY3R1YWw7CisJc2l6ZV90IHNwYWNlOworCWxvZmZfdCBvZmZzZXQ7Cit9IERVTVBfQ09OVEVYVF9UOworCitzdGF0aWMgc3RydWN0IGNkZXYgICAgdmNoaXFfY2RldjsKK3N0YXRpYyBkZXZfdCAgICAgICAgICB2Y2hpcV9kZXZpZDsKK3N0YXRpYyBWQ0hJUV9TVEFURV9UIGdfc3RhdGU7CitzdGF0aWMgc3RydWN0IGNsYXNzICAqdmNoaXFfY2xhc3M7CitzdGF0aWMgc3RydWN0IGRldmljZSAqdmNoaXFfZGV2Oworc3RhdGljIERFRklORV9TUElOTE9DSyhtc2dfcXVldWVfc3BpbmxvY2spOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaW9jdGxfbmFtZXNbXSA9IHsKKwkiQ09OTkVDVCIsCisJIlNIVVRET1dOIiwKKwkiQ1JFQVRFX1NFUlZJQ0UiLAorCSJSRU1PVkVfU0VSVklDRSIsCisJIlFVRVVFX01FU1NBR0UiLAorCSJRVUVVRV9CVUxLX1RSQU5TTUlUIiwKKwkiUVVFVUVfQlVMS19SRUNFSVZFIiwKKwkiQVdBSVRfQ09NUExFVElPTiIsCisJIkRFUVVFVUVfTUVTU0FHRSIsCisJIkdFVF9DTElFTlRfSUQiLAorCSJHRVRfQ09ORklHIiwKKwkiQ0xPU0VfU0VSVklDRSIsCisJIlVTRV9TRVJWSUNFIiwKKwkiUkVMRUFTRV9TRVJWSUNFIiwKKwkiU0VUX1NFUlZJQ0VfT1BUSU9OIiwKKwkiRFVNUF9QSFlTX01FTSIsCisJIkxJQl9WRVJTSU9OIiwKKwkiQ0xPU0VfREVMSVZFUkVEIgorfTsKKwordmNoaXFfc3RhdGljX2Fzc2VydCgoc2l6ZW9mKGlvY3RsX25hbWVzKS9zaXplb2YoaW9jdGxfbmFtZXNbMF0pKSA9PQorCShWQ0hJUV9JT0NfTUFYICsgMSkpOworCitzdGF0aWMgdm9pZAorZHVtcF9waHlzX21lbSh2b2lkICp2aXJ0X2FkZHIsIHVpbnQzMl90IG51bV9ieXRlcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgYWRkX2NvbXBsZXRpb24KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFZDSElRX1NUQVRVU19UCithZGRfY29tcGxldGlvbihWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLCBWQ0hJUV9SRUFTT05fVCByZWFzb24sCisJVkNISVFfSEVBREVSX1QgKmhlYWRlciwgVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSwKKwl2b2lkICpidWxrX3VzZXJkYXRhKQoreworCVZDSElRX0NPTVBMRVRJT05fREFUQV9UICpjb21wbGV0aW9uOworCURFQlVHX0lOSVRJQUxJU0UoZ19zdGF0ZS5sb2NhbCkKKworCXdoaWxlIChpbnN0YW5jZS0+Y29tcGxldGlvbl9pbnNlcnQgPT0KKwkJKGluc3RhbmNlLT5jb21wbGV0aW9uX3JlbW92ZSArIE1BWF9DT01QTEVUSU9OUykpIHsKKwkJLyogT3V0IG9mIHNwYWNlIC0gd2FpdCBmb3IgdGhlIGNsaWVudCAqLworCQlERUJVR19UUkFDRShTRVJWSUNFX0NBTExCQUNLX0xJTkUpOworCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSJhZGRfY29tcGxldGlvbiAtIGNvbXBsZXRpb24gcXVldWUgZnVsbCIpOworCQlERUJVR19DT1VOVChDT01QTEVUSU9OX1FVRVVFX0ZVTExfQ09VTlQpOworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZpbnN0YW5jZS0+cmVtb3ZlX2V2ZW50KSAhPSAwKSB7CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCSJzZXJ2aWNlX2NhbGxiYWNrIGludGVycnVwdGVkIik7CisJCQlyZXR1cm4gVkNISVFfUkVUUlk7CisJCX0gZWxzZSBpZiAoaW5zdGFuY2UtPmNsb3NpbmcpIHsKKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJInNlcnZpY2VfY2FsbGJhY2sgY2xvc2luZyIpOworCQkJcmV0dXJuIFZDSElRX0VSUk9SOworCQl9CisJCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisJfQorCisJY29tcGxldGlvbiA9CisJCSAmaW5zdGFuY2UtPmNvbXBsZXRpb25zW2luc3RhbmNlLT5jb21wbGV0aW9uX2luc2VydCAmCisJCSAoTUFYX0NPTVBMRVRJT05TIC0gMSldOworCisJY29tcGxldGlvbi0+aGVhZGVyID0gaGVhZGVyOworCWNvbXBsZXRpb24tPnJlYXNvbiA9IHJlYXNvbjsKKwkvKiBOLkIuIHNlcnZpY2VfdXNlcmRhdGEgaXMgdXBkYXRlZCB3aGlsZSBwcm9jZXNzaW5nIEFXQUlUX0NPTVBMRVRJT04gKi8KKwljb21wbGV0aW9uLT5zZXJ2aWNlX3VzZXJkYXRhID0gdXNlcl9zZXJ2aWNlLT5zZXJ2aWNlOworCWNvbXBsZXRpb24tPmJ1bGtfdXNlcmRhdGEgPSBidWxrX3VzZXJkYXRhOworCisJaWYgKHJlYXNvbiA9PSBWQ0hJUV9TRVJWSUNFX0NMT1NFRCkgeworCQkvKiBUYWtlIGFuIGV4dHJhIHJlZmVyZW5jZSwgdG8gYmUgaGVsZCB1bnRpbAorCQkgICB0aGlzIENMT1NFRCBub3RpZmljYXRpb24gaXMgZGVsaXZlcmVkLiAqLworCQlsb2NrX3NlcnZpY2UodXNlcl9zZXJ2aWNlLT5zZXJ2aWNlKTsKKwkJaWYgKGluc3RhbmNlLT51c2VfY2xvc2VfZGVsaXZlcmVkKQorCQkJdXNlcl9zZXJ2aWNlLT5jbG9zZV9wZW5kaW5nID0gMTsKKwl9CisKKwkvKiBBIHdyaXRlIGJhcnJpZXIgaXMgbmVlZGVkIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIGVudGlyZSBjb21wbGV0aW9uCisJCXJlY29yZCBpcyB3cml0dGVuIG91dCBiZWZvcmUgdGhlIGluc2VydCBwb2ludC4gKi8KKwl3bWIoKTsKKworCWlmIChyZWFzb24gPT0gVkNISVFfTUVTU0FHRV9BVkFJTEFCTEUpCisJCXVzZXJfc2VydmljZS0+bWVzc2FnZV9hdmFpbGFibGVfcG9zID0KKwkJCWluc3RhbmNlLT5jb21wbGV0aW9uX2luc2VydDsKKwlpbnN0YW5jZS0+Y29tcGxldGlvbl9pbnNlcnQrKzsKKworCXVwKCZpbnN0YW5jZS0+aW5zZXJ0X2V2ZW50KTsKKworCXJldHVybiBWQ0hJUV9TVUNDRVNTOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHNlcnZpY2VfY2FsbGJhY2sKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFZDSElRX1NUQVRVU19UCitzZXJ2aWNlX2NhbGxiYWNrKFZDSElRX1JFQVNPTl9UIHJlYXNvbiwgVkNISVFfSEVBREVSX1QgKmhlYWRlciwKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgdm9pZCAqYnVsa191c2VyZGF0YSkKK3sKKwkvKiBIb3cgZG8gd2UgZW5zdXJlIHRoZSBjYWxsYmFjayBnb2VzIHRvIHRoZSByaWdodCBjbGllbnQ/CisJKiogVGhlIHNlcnZpY2VfdXNlciBkYXRhIHBvaW50cyB0byBhIFVTRVJfU0VSVklDRV9UIHJlY29yZCBjb250YWluaW5nCisJKiogdGhlIG9yaWdpbmFsIGNhbGxiYWNrIGFuZCB0aGUgdXNlciBzdGF0ZSBzdHJ1Y3R1cmUsIHdoaWNoIGNvbnRhaW5zIGEKKwkqKiBjaXJjdWxhciBidWZmZXIgZm9yIGNvbXBsZXRpb24gcmVjb3Jkcy4KKwkqLworCVVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2U7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2U7CisJREVCVUdfSU5JVElBTElTRShnX3N0YXRlLmxvY2FsKQorCisJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKworCXNlcnZpY2UgPSBoYW5kbGVfdG9fc2VydmljZShoYW5kbGUpOworCUJVR19PTighc2VydmljZSk7CisJdXNlcl9zZXJ2aWNlID0gKFVTRVJfU0VSVklDRV9UICopc2VydmljZS0+YmFzZS51c2VyZGF0YTsKKwlpbnN0YW5jZSA9IHVzZXJfc2VydmljZS0+aW5zdGFuY2U7CisKKwlpZiAoIWluc3RhbmNlIHx8IGluc3RhbmNlLT5jbG9zaW5nKQorCQlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkic2VydmljZV9jYWxsYmFjayAtIHNlcnZpY2UgJWx4KCVkLCVwKSwgcmVhc29uICVkLCBoZWFkZXIgJWx4LCAiCisJCSJpbnN0YW5jZSAlbHgsIGJ1bGtfdXNlcmRhdGEgJWx4IiwKKwkJKHVuc2lnbmVkIGxvbmcpdXNlcl9zZXJ2aWNlLAorCQlzZXJ2aWNlLT5sb2NhbHBvcnQsIHVzZXJfc2VydmljZS0+dXNlcmRhdGEsCisJCXJlYXNvbiwgKHVuc2lnbmVkIGxvbmcpaGVhZGVyLAorCQkodW5zaWduZWQgbG9uZylpbnN0YW5jZSwgKHVuc2lnbmVkIGxvbmcpYnVsa191c2VyZGF0YSk7CisKKwlpZiAoaGVhZGVyICYmIHVzZXJfc2VydmljZS0+aXNfdmNoaSkgeworCQlzcGluX2xvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisJCXdoaWxlICh1c2VyX3NlcnZpY2UtPm1zZ19pbnNlcnQgPT0KKwkJCSh1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUgKyBNU0dfUVVFVUVfU0laRSkpIHsKKwkJCXNwaW5fdW5sb2NrKCZtc2dfcXVldWVfc3BpbmxvY2spOworCQkJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKwkJCURFQlVHX0NPVU5UKE1TR19RVUVVRV9GVUxMX0NPVU5UKTsKKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCSJzZXJ2aWNlX2NhbGxiYWNrIC0gbXNnIHF1ZXVlIGZ1bGwiKTsKKwkJCS8qIElmIHRoZXJlIGlzIG5vIE1FU1NBR0VfQVZBSUxBQkxFIGluIHRoZSBjb21wbGV0aW9uCisJCQkqKiBxdWV1ZSwgYWRkIG9uZQorCQkJKi8KKwkJCWlmICgodXNlcl9zZXJ2aWNlLT5tZXNzYWdlX2F2YWlsYWJsZV9wb3MgLQorCQkJCWluc3RhbmNlLT5jb21wbGV0aW9uX3JlbW92ZSkgPCAwKSB7CisJCQkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCSJJbnNlcnRpbmcgZXh0cmEgTUVTU0FHRV9BVkFJTEFCTEUiKTsKKwkJCQlERUJVR19UUkFDRShTRVJWSUNFX0NBTExCQUNLX0xJTkUpOworCQkJCXN0YXR1cyA9IGFkZF9jb21wbGV0aW9uKGluc3RhbmNlLCByZWFzb24sCisJCQkJCU5VTEwsIHVzZXJfc2VydmljZSwgYnVsa191c2VyZGF0YSk7CisJCQkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKSB7CisJCQkJCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisJCQkJCXJldHVybiBzdGF0dXM7CisJCQkJfQorCQkJfQorCisJCQlERUJVR19UUkFDRShTRVJWSUNFX0NBTExCQUNLX0xJTkUpOworCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmdXNlcl9zZXJ2aWNlLT5yZW1vdmVfZXZlbnQpCisJCQkJIT0gMCkgeworCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCSJzZXJ2aWNlX2NhbGxiYWNrIGludGVycnVwdGVkIik7CisJCQkJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKwkJCQlyZXR1cm4gVkNISVFfUkVUUlk7CisJCQl9IGVsc2UgaWYgKGluc3RhbmNlLT5jbG9zaW5nKSB7CisJCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkJInNlcnZpY2VfY2FsbGJhY2sgY2xvc2luZyIpOworCQkJCURFQlVHX1RSQUNFKFNFUlZJQ0VfQ0FMTEJBQ0tfTElORSk7CisJCQkJcmV0dXJuIFZDSElRX0VSUk9SOworCQkJfQorCQkJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKwkJCXNwaW5fbG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKwkJfQorCisJCXVzZXJfc2VydmljZS0+bXNnX3F1ZXVlW3VzZXJfc2VydmljZS0+bXNnX2luc2VydCAmCisJCQkoTVNHX1FVRVVFX1NJWkUgLSAxKV0gPSBoZWFkZXI7CisJCXVzZXJfc2VydmljZS0+bXNnX2luc2VydCsrOworCQlzcGluX3VubG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKworCQl1cCgmdXNlcl9zZXJ2aWNlLT5pbnNlcnRfZXZlbnQpOworCisJCS8qIElmIHRoZXJlIGlzIGEgdGhyZWFkIHdhaXRpbmcgaW4gREVRVUVVRV9NRVNTQUdFLCBvciBpZgorCQkqKiB0aGVyZSBpcyBhIE1FU1NBR0VfQVZBSUxBQkxFIGluIHRoZSBjb21wbGV0aW9uIHF1ZXVlIHRoZW4KKwkJKiogYnlwYXNzIHRoZSBjb21wbGV0aW9uIHF1ZXVlLgorCQkqLworCQlpZiAoKCh1c2VyX3NlcnZpY2UtPm1lc3NhZ2VfYXZhaWxhYmxlX3BvcyAtCisJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUpID49IDApIHx8CisJCQl1c2VyX3NlcnZpY2UtPmRlcXVldWVfcGVuZGluZykgeworCQkJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKwkJCXVzZXJfc2VydmljZS0+ZGVxdWV1ZV9wZW5kaW5nID0gMDsKKwkJCXJldHVybiBWQ0hJUV9TVUNDRVNTOworCQl9CisKKwkJaGVhZGVyID0gTlVMTDsKKwl9CisJREVCVUdfVFJBQ0UoU0VSVklDRV9DQUxMQkFDS19MSU5FKTsKKworCXJldHVybiBhZGRfY29tcGxldGlvbihpbnN0YW5jZSwgcmVhc29uLCBoZWFkZXIsIHVzZXJfc2VydmljZSwKKwkJYnVsa191c2VyZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgdXNlcl9zZXJ2aWNlX2ZyZWUKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCit1c2VyX3NlcnZpY2VfZnJlZSh2b2lkICp1c2VyZGF0YSkKK3sKKwlrZnJlZSh1c2VyZGF0YSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgY2xvc2VfZGVsaXZlcmVkCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjbG9zZV9kZWxpdmVyZWQoVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSkKK3sKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkiY2xvc2VfZGVsaXZlcmVkKGhhbmRsZT0leCkiLAorCQl1c2VyX3NlcnZpY2UtPnNlcnZpY2UtPmhhbmRsZSk7CisKKwlpZiAodXNlcl9zZXJ2aWNlLT5jbG9zZV9wZW5kaW5nKSB7CisJCS8qIEFsbG93IHRoZSB1bmRlcmx5aW5nIHNlcnZpY2UgdG8gYmUgY3VsbGVkICovCisJCXVubG9ja19zZXJ2aWNlKHVzZXJfc2VydmljZS0+c2VydmljZSk7CisKKwkJLyogV2FrZSB0aGUgdXNlci10aHJlYWQgYmxvY2tlZCBpbiBjbG9zZV8gb3IgcmVtb3ZlX3NlcnZpY2UgKi8KKwkJdXAoJnVzZXJfc2VydmljZS0+Y2xvc2VfZXZlbnQpOworCisJCXVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZyA9IDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX2lvY3RsCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgbG9uZwordmNoaXFfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBOVUxMOworCWxvbmcgcmV0ID0gMDsKKwlpbnQgaSwgcmM7CisJREVCVUdfSU5JVElBTElTRShnX3N0YXRlLmxvY2FsKQorCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCSAidmNoaXFfaW9jdGwgLSBpbnN0YW5jZSAleCwgY21kICVzLCBhcmcgJWx4IiwKKwkJKHVuc2lnbmVkIGludClpbnN0YW5jZSwKKwkJKChfSU9DX1RZUEUoY21kKSA9PSBWQ0hJUV9JT0NfTUFHSUMpICYmCisJCShfSU9DX05SKGNtZCkgPD0gVkNISVFfSU9DX01BWCkpID8KKwkJaW9jdGxfbmFtZXNbX0lPQ19OUihjbWQpXSA6ICI8aW52YWxpZD4iLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZDSElRX0lPQ19TSFVURE9XTjoKKwkJaWYgKCFpbnN0YW5jZS0+Y29ubmVjdGVkKQorCQkJYnJlYWs7CisKKwkJLyogUmVtb3ZlIGFsbCBzZXJ2aWNlcyAqLworCQlpID0gMDsKKwkJd2hpbGUgKChzZXJ2aWNlID0gbmV4dF9zZXJ2aWNlX2J5X2luc3RhbmNlKGluc3RhbmNlLT5zdGF0ZSwKKwkJCWluc3RhbmNlLCAmaSkpICE9IE5VTEwpIHsKKwkJCXN0YXR1cyA9IHZjaGlxX3JlbW92ZV9zZXJ2aWNlKHNlcnZpY2UtPmhhbmRsZSk7CisJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykKKwkJCQlicmVhazsKKwkJfQorCQlzZXJ2aWNlID0gTlVMTDsKKworCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpIHsKKwkJCS8qIFdha2UgdGhlIGNvbXBsZXRpb24gdGhyZWFkIGFuZCBhc2sgaXQgdG8gZXhpdCAqLworCQkJaW5zdGFuY2UtPmNsb3NpbmcgPSAxOworCQkJdXAoJmluc3RhbmNlLT5pbnNlcnRfZXZlbnQpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX0lPQ19DT05ORUNUOgorCQlpZiAoaW5zdGFuY2UtPmNvbm5lY3RlZCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZpbnN0YW5jZS0+c3RhdGUtPm11dGV4KTsKKwkJaWYgKHJjICE9IDApIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCSJ2Y2hpcTogY29ubmVjdDogY291bGQgbm90IGxvY2sgbXV0ZXggZm9yICIKKwkJCQkic3RhdGUgJWQ6ICVkIiwKKwkJCQlpbnN0YW5jZS0+c3RhdGUtPmlkLCByYyk7CisJCQlyZXQgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCQlzdGF0dXMgPSB2Y2hpcV9jb25uZWN0X2ludGVybmFsKGluc3RhbmNlLT5zdGF0ZSwgaW5zdGFuY2UpOworCQltdXRleF91bmxvY2soJmluc3RhbmNlLT5zdGF0ZS0+bXV0ZXgpOworCisJCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykKKwkJCWluc3RhbmNlLT5jb25uZWN0ZWQgPSAxOworCQllbHNlCisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkidmNoaXE6IGNvdWxkIG5vdCBjb25uZWN0OiAlZCIsIHN0YXR1cyk7CisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfQ1JFQVRFX1NFUlZJQ0U6IHsKKwkJVkNISVFfQ1JFQVRFX1NFUlZJQ0VfVCBhcmdzOworCQlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlID0gTlVMTDsKKwkJdm9pZCAqdXNlcmRhdGE7CisJCWludCBzcnZzdGF0ZTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAoJmFyZ3MsIChjb25zdCB2b2lkIF9fdXNlciAqKWFyZywKKwkJCSAgc2l6ZW9mKGFyZ3MpKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQl1c2VyX3NlcnZpY2UgPSBrbWFsbG9jKHNpemVvZihVU0VSX1NFUlZJQ0VfVCksIEdGUF9LRVJORUwpOworCQlpZiAoIXVzZXJfc2VydmljZSkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFyZ3MuaXNfb3BlbikgeworCQkJaWYgKCFpbnN0YW5jZS0+Y29ubmVjdGVkKSB7CisJCQkJcmV0ID0gLUVOT1RDT05OOworCQkJCWtmcmVlKHVzZXJfc2VydmljZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzcnZzdGF0ZSA9IFZDSElRX1NSVlNUQVRFX09QRU5JTkc7CisJCX0gZWxzZSB7CisJCQlzcnZzdGF0ZSA9CisJCQkJIGluc3RhbmNlLT5jb25uZWN0ZWQgPworCQkJCSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcgOgorCQkJCSBWQ0hJUV9TUlZTVEFURV9ISURERU47CisJCX0KKworCQl1c2VyZGF0YSA9IGFyZ3MucGFyYW1zLnVzZXJkYXRhOworCQlhcmdzLnBhcmFtcy5jYWxsYmFjayA9IHNlcnZpY2VfY2FsbGJhY2s7CisJCWFyZ3MucGFyYW1zLnVzZXJkYXRhID0gdXNlcl9zZXJ2aWNlOworCQlzZXJ2aWNlID0gdmNoaXFfYWRkX3NlcnZpY2VfaW50ZXJuYWwoCisJCQkJaW5zdGFuY2UtPnN0YXRlLAorCQkJCSZhcmdzLnBhcmFtcywgc3J2c3RhdGUsCisJCQkJaW5zdGFuY2UsIHVzZXJfc2VydmljZV9mcmVlKTsKKworCQlpZiAoc2VydmljZSAhPSBOVUxMKSB7CisJCQl1c2VyX3NlcnZpY2UtPnNlcnZpY2UgPSBzZXJ2aWNlOworCQkJdXNlcl9zZXJ2aWNlLT51c2VyZGF0YSA9IHVzZXJkYXRhOworCQkJdXNlcl9zZXJ2aWNlLT5pbnN0YW5jZSA9IGluc3RhbmNlOworCQkJdXNlcl9zZXJ2aWNlLT5pc192Y2hpID0gKGFyZ3MuaXNfdmNoaSAhPSAwKTsKKwkJCXVzZXJfc2VydmljZS0+ZGVxdWV1ZV9wZW5kaW5nID0gMDsKKwkJCXVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZyA9IDA7CisJCQl1c2VyX3NlcnZpY2UtPm1lc3NhZ2VfYXZhaWxhYmxlX3BvcyA9CisJCQkJaW5zdGFuY2UtPmNvbXBsZXRpb25fcmVtb3ZlIC0gMTsKKwkJCXVzZXJfc2VydmljZS0+bXNnX2luc2VydCA9IDA7CisJCQl1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUgPSAwOworCQkJc2VtYV9pbml0KCZ1c2VyX3NlcnZpY2UtPmluc2VydF9ldmVudCwgMCk7CisJCQlzZW1hX2luaXQoJnVzZXJfc2VydmljZS0+cmVtb3ZlX2V2ZW50LCAwKTsKKwkJCXNlbWFfaW5pdCgmdXNlcl9zZXJ2aWNlLT5jbG9zZV9ldmVudCwgMCk7CisKKwkJCWlmIChhcmdzLmlzX29wZW4pIHsKKwkJCQlzdGF0dXMgPSB2Y2hpcV9vcGVuX3NlcnZpY2VfaW50ZXJuYWwKKwkJCQkJKHNlcnZpY2UsIGluc3RhbmNlLT5waWQpOworCQkJCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykgeworCQkJCQl2Y2hpcV9yZW1vdmVfc2VydmljZShzZXJ2aWNlLT5oYW5kbGUpOworCQkJCQlzZXJ2aWNlID0gTlVMTDsKKwkJCQkJcmV0ID0gKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSkgPworCQkJCQkJLUVJTlRSIDogLUVJTzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKQorCQkJCSYoKChWQ0hJUV9DUkVBVEVfU0VSVklDRV9UIF9fdXNlciAqKQorCQkJCQlhcmcpLT5oYW5kbGUpLAorCQkJCShjb25zdCB2b2lkICopJnNlcnZpY2UtPmhhbmRsZSwKKwkJCQlzaXplb2Yoc2VydmljZS0+aGFuZGxlKSkgIT0gMCkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJdmNoaXFfcmVtb3ZlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKTsKKwkJCX0KKworCQkJc2VydmljZSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAtRUVYSVNUOworCQkJa2ZyZWUodXNlcl9zZXJ2aWNlKTsKKwkJfQorCX0gYnJlYWs7CisKKwljYXNlIFZDSElRX0lPQ19DTE9TRV9TRVJWSUNFOiB7CisJCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlID0gKFZDSElRX1NFUlZJQ0VfSEFORExFX1QpYXJnOworCisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfZm9yX2luc3RhbmNlKGluc3RhbmNlLCBoYW5kbGUpOworCQlpZiAoc2VydmljZSAhPSBOVUxMKSB7CisJCQlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlID0KKwkJCQkoVVNFUl9TRVJWSUNFX1QgKilzZXJ2aWNlLT5iYXNlLnVzZXJkYXRhOworCQkJLyogY2xvc2VfcGVuZGluZyBpcyBmYWxzZSBvbiBmaXJzdCBlbnRyeSwgYW5kIHdoZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0IGluIHZjaGlxX2Nsb3NlX3NlcnZpY2UgaGFzIGJlZW4gaW50ZXJydXB0ZWQuICovCisJCQlpZiAoIXVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZykgeworCQkJCXN0YXR1cyA9IHZjaGlxX2Nsb3NlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBjbG9zZV9wZW5kaW5nIGlzIHRydWUgb25jZSB0aGUgdW5kZXJseWluZyBzZXJ2aWNlCisJCQkgICBoYXMgYmVlbiBjbG9zZWQgdW50aWwgdGhlIGNsaWVudCBsaWJyYXJ5IGNhbGxzIHRoZQorCQkJICAgQ0xPU0VfREVMSVZFUkVEIGlvY3RsLCBzaWduYWxsaW5nIGNsb3NlX2V2ZW50LiAqLworCQkJaWYgKHVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZyAmJgorCQkJCWRvd25faW50ZXJydXB0aWJsZSgmdXNlcl9zZXJ2aWNlLT5jbG9zZV9ldmVudCkpCisJCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCX0KKwkJZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfUkVNT1ZFX1NFUlZJQ0U6IHsKKwkJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUgPSAoVkNISVFfU0VSVklDRV9IQU5ETEVfVClhcmc7CisKKwkJc2VydmljZSA9IGZpbmRfc2VydmljZV9mb3JfaW5zdGFuY2UoaW5zdGFuY2UsIGhhbmRsZSk7CisJCWlmIChzZXJ2aWNlICE9IE5VTEwpIHsKKwkJCVVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2UgPQorCQkJCShVU0VSX1NFUlZJQ0VfVCAqKXNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisJCQkvKiBjbG9zZV9wZW5kaW5nIGlzIGZhbHNlIG9uIGZpcnN0IGVudHJ5LCBhbmQgd2hlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXQgaW4gdmNoaXFfY2xvc2Vfc2VydmljZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZC4gKi8KKwkJCWlmICghdXNlcl9zZXJ2aWNlLT5jbG9zZV9wZW5kaW5nKSB7CisJCQkJc3RhdHVzID0gdmNoaXFfcmVtb3ZlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKTsKKwkJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBjbG9zZV9wZW5kaW5nIGlzIHRydWUgb25jZSB0aGUgdW5kZXJseWluZyBzZXJ2aWNlCisJCQkgICBoYXMgYmVlbiBjbG9zZWQgdW50aWwgdGhlIGNsaWVudCBsaWJyYXJ5IGNhbGxzIHRoZQorCQkJICAgQ0xPU0VfREVMSVZFUkVEIGlvY3RsLCBzaWduYWxsaW5nIGNsb3NlX2V2ZW50LiAqLworCQkJaWYgKHVzZXJfc2VydmljZS0+Y2xvc2VfcGVuZGluZyAmJgorCQkJCWRvd25faW50ZXJydXB0aWJsZSgmdXNlcl9zZXJ2aWNlLT5jbG9zZV9ldmVudCkpCisJCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCX0KKwkJZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfVVNFX1NFUlZJQ0U6CisJY2FzZSBWQ0hJUV9JT0NfUkVMRUFTRV9TRVJWSUNFOgl7CisJCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlID0gKFZDSElRX1NFUlZJQ0VfSEFORExFX1QpYXJnOworCisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfZm9yX2luc3RhbmNlKGluc3RhbmNlLCBoYW5kbGUpOworCQlpZiAoc2VydmljZSAhPSBOVUxMKSB7CisJCQlzdGF0dXMgPSAoY21kID09IFZDSElRX0lPQ19VU0VfU0VSVklDRSkJPworCQkJCXZjaGlxX3VzZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UpIDoKKwkJCQl2Y2hpcV9yZWxlYXNlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSk7CisJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJCSIlczogY21kICVzIHJldHVybmVkIGVycm9yICVkIGZvciAiCisJCQkJCSJzZXJ2aWNlICVjJWMlYyVjOiUwM2QiLAorCQkJCQlfX2Z1bmNfXywKKwkJCQkJKGNtZCA9PSBWQ0hJUV9JT0NfVVNFX1NFUlZJQ0UpID8KKwkJCQkJCSJWQ0hJUV9JT0NfVVNFX1NFUlZJQ0UiIDoKKwkJCQkJCSJWQ0hJUV9JT0NfUkVMRUFTRV9TRVJWSUNFIiwKKwkJCQkJc3RhdHVzLAorCQkJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKAorCQkJCQkJc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJCQlzZXJ2aWNlLT5jbGllbnRfaWQpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfUVVFVUVfTUVTU0FHRTogeworCQlWQ0hJUV9RVUVVRV9NRVNTQUdFX1QgYXJnczsKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkgKCZhcmdzLCAoY29uc3Qgdm9pZCBfX3VzZXIgKilhcmcsCisJCQkgIHNpemVvZihhcmdzKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJc2VydmljZSA9IGZpbmRfc2VydmljZV9mb3JfaW5zdGFuY2UoaW5zdGFuY2UsIGFyZ3MuaGFuZGxlKTsKKworCQlpZiAoKHNlcnZpY2UgIT0gTlVMTCkgJiYgKGFyZ3MuY291bnQgPD0gTUFYX0VMRU1FTlRTKSkgeworCQkJLyogQ29weSBlbGVtZW50cyBpbnRvIGtlcm5lbCBzcGFjZSAqLworCQkJVkNISVFfRUxFTUVOVF9UIGVsZW1lbnRzW01BWF9FTEVNRU5UU107CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZWxlbWVudHMsIGFyZ3MuZWxlbWVudHMsCisJCQkJYXJncy5jb3VudCAqIHNpemVvZihWQ0hJUV9FTEVNRU5UX1QpKSA9PSAwKQorCQkJCXN0YXR1cyA9IHZjaGlxX3F1ZXVlX21lc3NhZ2UKKwkJCQkJKGFyZ3MuaGFuZGxlLAorCQkJCQllbGVtZW50cywgYXJncy5jb3VudCk7CisJCQllbHNlCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfUVVFVUVfQlVMS19UUkFOU01JVDoKKwljYXNlIFZDSElRX0lPQ19RVUVVRV9CVUxLX1JFQ0VJVkU6IHsKKwkJVkNISVFfUVVFVUVfQlVMS19UUkFOU0ZFUl9UIGFyZ3M7CisJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlICp3YWl0ZXIgPSBOVUxMOworCQlWQ0hJUV9CVUxLX0RJUl9UIGRpciA9CisJCQkoY21kID09IFZDSElRX0lPQ19RVUVVRV9CVUxLX1RSQU5TTUlUKSA/CisJCQlWQ0hJUV9CVUxLX1RSQU5TTUlUIDogVkNISVFfQlVMS19SRUNFSVZFOworCisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJKCZhcmdzLCAoY29uc3Qgdm9pZCBfX3VzZXIgKilhcmcsCisJCQlzaXplb2YoYXJncykpICE9IDApIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfZm9yX2luc3RhbmNlKGluc3RhbmNlLCBhcmdzLmhhbmRsZSk7CisJCWlmICghc2VydmljZSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGFyZ3MubW9kZSA9PSBWQ0hJUV9CVUxLX01PREVfQkxPQ0tJTkcpIHsKKwkJCXdhaXRlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidWxrX3dhaXRlcl9ub2RlKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghd2FpdGVyKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWFyZ3MudXNlcmRhdGEgPSAmd2FpdGVyLT5idWxrX3dhaXRlcjsKKwkJfSBlbHNlIGlmIChhcmdzLm1vZGUgPT0gVkNISVFfQlVMS19NT0RFX1dBSVRJTkcpIHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwkJCW11dGV4X2xvY2soJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwkJCWxpc3RfZm9yX2VhY2gocG9zLCAmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3QpIHsKKwkJCQlpZiAobGlzdF9lbnRyeShwb3MsIHN0cnVjdCBidWxrX3dhaXRlcl9ub2RlLAorCQkJCQlsaXN0KS0+cGlkID09IGN1cnJlbnQtPnBpZCkgeworCQkJCQl3YWl0ZXIgPSBsaXN0X2VudHJ5KHBvcywKKwkJCQkJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlLAorCQkJCQkJbGlzdCk7CisJCQkJCWxpc3RfZGVsKHBvcyk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJfQorCQkJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdF9tdXRleCk7CisJCQlpZiAoIXdhaXRlcikgeworCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCQkibm8gYnVsa193YWl0ZXIgZm91bmQgZm9yIHBpZCAlZCIsCisJCQkJCWN1cnJlbnQtPnBpZCk7CisJCQkJcmV0ID0gLUVTUkNIOworCQkJCWJyZWFrOworCQkJfQorCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkiZm91bmQgYnVsa193YWl0ZXIgJXggZm9yIHBpZCAlZCIsCisJCQkJKHVuc2lnbmVkIGludCl3YWl0ZXIsIGN1cnJlbnQtPnBpZCk7CisJCQlhcmdzLnVzZXJkYXRhID0gJndhaXRlci0+YnVsa193YWl0ZXI7CisJCX0KKwkJc3RhdHVzID0gdmNoaXFfYnVsa190cmFuc2ZlcgorCQkJKGFyZ3MuaGFuZGxlLAorCQkJIFZDSElfTUVNX0hBTkRMRV9JTlZBTElELAorCQkJIGFyZ3MuZGF0YSwgYXJncy5zaXplLAorCQkJIGFyZ3MudXNlcmRhdGEsIGFyZ3MubW9kZSwKKwkJCSBkaXIpOworCQlpZiAoIXdhaXRlcikKKwkJCWJyZWFrOworCQlpZiAoKHN0YXR1cyAhPSBWQ0hJUV9SRVRSWSkgfHwgZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwKKwkJCSF3YWl0ZXItPmJ1bGtfd2FpdGVyLmJ1bGspIHsKKwkJCWlmICh3YWl0ZXItPmJ1bGtfd2FpdGVyLmJ1bGspIHsKKwkJCQkvKiBDYW5jZWwgdGhlIHNpZ25hbCB3aGVuIHRoZSB0cmFuc2ZlcgorCQkJCSoqIGNvbXBsZXRlcy4gKi8KKwkJCQlzcGluX2xvY2soJmJ1bGtfd2FpdGVyX3NwaW5sb2NrKTsKKwkJCQl3YWl0ZXItPmJ1bGtfd2FpdGVyLmJ1bGstPnVzZXJkYXRhID0gTlVMTDsKKwkJCQlzcGluX3VubG9jaygmYnVsa193YWl0ZXJfc3BpbmxvY2spOworCQkJfQorCQkJa2ZyZWUod2FpdGVyKTsKKwkJfSBlbHNlIHsKKwkJCWNvbnN0IFZDSElRX0JVTEtfTU9ERV9UIG1vZGVfd2FpdGluZyA9CisJCQkJVkNISVFfQlVMS19NT0RFX1dBSVRJTkc7CisJCQl3YWl0ZXItPnBpZCA9IGN1cnJlbnQtPnBpZDsKKwkJCW11dGV4X2xvY2soJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwkJCWxpc3RfYWRkKCZ3YWl0ZXItPmxpc3QsICZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdCk7CisJCQltdXRleF91bmxvY2soJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJInNhdmVkIGJ1bGtfd2FpdGVyICV4IGZvciBwaWQgJWQiLAorCQkJCSh1bnNpZ25lZCBpbnQpd2FpdGVyLCBjdXJyZW50LT5waWQpOworCisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKQorCQkJCSYoKChWQ0hJUV9RVUVVRV9CVUxLX1RSQU5TRkVSX1QgX191c2VyICopCisJCQkJCWFyZyktPm1vZGUpLAorCQkJCShjb25zdCB2b2lkICopJm1vZGVfd2FpdGluZywKKwkJCQlzaXplb2YobW9kZV93YWl0aW5nKSkgIT0gMCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQl9CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0FXQUlUX0NPTVBMRVRJT046IHsKKwkJVkNISVFfQVdBSVRfQ09NUExFVElPTl9UIGFyZ3M7CisKKwkJREVCVUdfVFJBQ0UoQVdBSVRfQ09NUExFVElPTl9MSU5FKTsKKwkJaWYgKCFpbnN0YW5jZS0+Y29ubmVjdGVkKSB7CisJCQlyZXQgPSAtRU5PVENPTk47CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcigmYXJncywgKGNvbnN0IHZvaWQgX191c2VyICopYXJnLAorCQkJc2l6ZW9mKGFyZ3MpKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQltdXRleF9sb2NrKCZpbnN0YW5jZS0+Y29tcGxldGlvbl9tdXRleCk7CisKKwkJREVCVUdfVFJBQ0UoQVdBSVRfQ09NUExFVElPTl9MSU5FKTsKKwkJd2hpbGUgKChpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUgPT0KKwkJCWluc3RhbmNlLT5jb21wbGV0aW9uX2luc2VydCkKKwkJCSYmICFpbnN0YW5jZS0+Y2xvc2luZykgeworCQkJaW50IHJjOworCQkJREVCVUdfVFJBQ0UoQVdBSVRfQ09NUExFVElPTl9MSU5FKTsKKwkJCW11dGV4X3VubG9jaygmaW5zdGFuY2UtPmNvbXBsZXRpb25fbXV0ZXgpOworCQkJcmMgPSBkb3duX2ludGVycnVwdGlibGUoJmluc3RhbmNlLT5pbnNlcnRfZXZlbnQpOworCQkJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPmNvbXBsZXRpb25fbXV0ZXgpOworCQkJaWYgKHJjICE9IDApIHsKKwkJCQlERUJVR19UUkFDRShBV0FJVF9DT01QTEVUSU9OX0xJTkUpOworCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCSJBV0FJVF9DT01QTEVUSU9OIGludGVycnVwdGVkIik7CisJCQkJcmV0ID0gLUVJTlRSOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCURFQlVHX1RSQUNFKEFXQUlUX0NPTVBMRVRJT05fTElORSk7CisKKwkJLyogQSByZWFkIG1lbW9yeSBiYXJyaWVyIGlzIG5lZWRlZCB0byBzdG9wIHByZWZldGNoIG9mIGEgc3RhbGUKKwkJKiogY29tcGxldGlvbiByZWNvcmQKKwkJKi8KKwkJcm1iKCk7CisKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlpbnQgbXNnYnVmY291bnQgPSBhcmdzLm1zZ2J1ZmNvdW50OworCQkJZm9yIChyZXQgPSAwOyByZXQgPCBhcmdzLmNvdW50OyByZXQrKykgeworCQkJCVZDSElRX0NPTVBMRVRJT05fREFUQV9UICpjb21wbGV0aW9uOworCQkJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwkJCQlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlOworCQkJCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisJCQkJaWYgKGluc3RhbmNlLT5jb21wbGV0aW9uX3JlbW92ZSA9PQorCQkJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9pbnNlcnQpCisJCQkJCWJyZWFrOworCQkJCWNvbXBsZXRpb24gPSAmaW5zdGFuY2UtPmNvbXBsZXRpb25zWworCQkJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUgJgorCQkJCQkoTUFYX0NPTVBMRVRJT05TIC0gMSldOworCisJCQkJc2VydmljZSA9IGNvbXBsZXRpb24tPnNlcnZpY2VfdXNlcmRhdGE7CisJCQkJdXNlcl9zZXJ2aWNlID0gc2VydmljZS0+YmFzZS51c2VyZGF0YTsKKwkJCQljb21wbGV0aW9uLT5zZXJ2aWNlX3VzZXJkYXRhID0KKwkJCQkJdXNlcl9zZXJ2aWNlLT51c2VyZGF0YTsKKworCQkJCWhlYWRlciA9IGNvbXBsZXRpb24tPmhlYWRlcjsKKwkJCQlpZiAoaGVhZGVyKSB7CisJCQkJCXZvaWQgX191c2VyICptc2didWY7CisJCQkJCWludCBtc2dsZW47CisKKwkJCQkJbXNnbGVuID0gaGVhZGVyLT5zaXplICsKKwkJCQkJCXNpemVvZihWQ0hJUV9IRUFERVJfVCk7CisJCQkJCS8qIFRoaXMgbXVzdCBiZSBhIFZDSElRLXN0eWxlIHNlcnZpY2UgKi8KKwkJCQkJaWYgKGFyZ3MubXNnYnVmc2l6ZSA8IG1zZ2xlbikgeworCQkJCQkJdmNoaXFfbG9nX2Vycm9yKAorCQkJCQkJCXZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCQkJImhlYWRlciAleDogbXNnYnVmc2l6ZSIKKwkJCQkJCQkiICV4IDwgbXNnbGVuICV4IiwKKwkJCQkJCQkodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQkJCQlhcmdzLm1zZ2J1ZnNpemUsCisJCQkJCQkJbXNnbGVuKTsKKwkJCQkJCVdBUk4oMSwgImludmFsaWQgbWVzc2FnZSAiCisJCQkJCQkJInNpemVcbiIpOworCQkJCQkJaWYgKHJldCA9PSAwKQorCQkJCQkJCXJldCA9IC1FTVNHU0laRTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChtc2didWZjb3VudCA8PSAwKQorCQkJCQkJLyogU3RhbGwgaGVyZSBmb3IgbGFjayBvZiBhCisJCQkJCQkqKiBidWZmZXIgZm9yIHRoZSBtZXNzYWdlLiAqLworCQkJCQkJYnJlYWs7CisJCQkJCS8qIEdldCB0aGUgcG9pbnRlciBmcm9tIHVzZXIgc3BhY2UgKi8KKwkJCQkJbXNnYnVmY291bnQtLTsKKwkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtc2didWYsCisJCQkJCQkoY29uc3Qgdm9pZCBfX3VzZXIgKikKKwkJCQkJCSZhcmdzLm1zZ2J1ZnNbbXNnYnVmY291bnRdLAorCQkJCQkJc2l6ZW9mKG1zZ2J1ZikpICE9IDApIHsKKwkJCQkJCWlmIChyZXQgPT0gMCkKKwkJCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQkvKiBDb3B5IHRoZSBtZXNzYWdlIHRvIHVzZXIgc3BhY2UgKi8KKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihtc2didWYsIGhlYWRlciwKKwkJCQkJCW1zZ2xlbikgIT0gMCkgeworCQkJCQkJaWYgKHJldCA9PSAwKQorCQkJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCS8qIE5vdyBpdCBoYXMgYmVlbiBjb3BpZWQsIHRoZSBtZXNzYWdlCisJCQkJCSoqIGNhbiBiZSByZWxlYXNlZC4gKi8KKwkJCQkJdmNoaXFfcmVsZWFzZV9tZXNzYWdlKHNlcnZpY2UtPmhhbmRsZSwKKwkJCQkJCWhlYWRlcik7CisKKwkJCQkJLyogVGhlIGNvbXBsZXRpb24gbXVzdCBwb2ludCB0byB0aGUKKwkJCQkJKiogbXNnYnVmLiAqLworCQkJCQljb21wbGV0aW9uLT5oZWFkZXIgPSBtc2didWY7CisJCQkJfQorCisJCQkJaWYgKChjb21wbGV0aW9uLT5yZWFzb24gPT0KKwkJCQkJVkNISVFfU0VSVklDRV9DTE9TRUQpICYmCisJCQkJCSFpbnN0YW5jZS0+dXNlX2Nsb3NlX2RlbGl2ZXJlZCkKKwkJCQkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwkJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSgKKwkJCQkJKHNpemVfdClhcmdzLmJ1ZiArCisJCQkJCXJldCAqIHNpemVvZihWQ0hJUV9DT01QTEVUSU9OX0RBVEFfVCkpLAorCQkJCQljb21wbGV0aW9uLAorCQkJCQlzaXplb2YoVkNISVFfQ09NUExFVElPTl9EQVRBX1QpKSAhPSAwKSB7CisJCQkJCQlpZiAocmV0ID09IDApCisJCQkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaW5zdGFuY2UtPmNvbXBsZXRpb25fcmVtb3ZlKys7CisJCQl9CisKKwkJCWlmIChtc2didWZjb3VudCAhPSBhcmdzLm1zZ2J1ZmNvdW50KSB7CisJCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikKKwkJCQkJJigoVkNISVFfQVdBSVRfQ09NUExFVElPTl9UICopYXJnKS0+CisJCQkJCQltc2didWZjb3VudCwKKwkJCQkJJm1zZ2J1ZmNvdW50LAorCQkJCQlzaXplb2YobXNnYnVmY291bnQpKSAhPSAwKSB7CisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHJldCAhPSAwKQorCQkJdXAoJmluc3RhbmNlLT5yZW1vdmVfZXZlbnQpOworCQltdXRleF91bmxvY2soJmluc3RhbmNlLT5jb21wbGV0aW9uX211dGV4KTsKKwkJREVCVUdfVFJBQ0UoQVdBSVRfQ09NUExFVElPTl9MSU5FKTsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfREVRVUVVRV9NRVNTQUdFOiB7CisJCVZDSElRX0RFUVVFVUVfTUVTU0FHRV9UIGFyZ3M7CisJCVVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2U7CisJCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisKKwkJREVCVUdfVFJBQ0UoREVRVUVVRV9NRVNTQUdFX0xJTkUpOworCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAoJmFyZ3MsIChjb25zdCB2b2lkIF9fdXNlciAqKWFyZywKKwkJCSAgc2l6ZW9mKGFyZ3MpKSAhPSAwKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJc2VydmljZSA9IGZpbmRfc2VydmljZV9mb3JfaW5zdGFuY2UoaW5zdGFuY2UsIGFyZ3MuaGFuZGxlKTsKKwkJaWYgKCFzZXJ2aWNlKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJdXNlcl9zZXJ2aWNlID0gKFVTRVJfU0VSVklDRV9UICopc2VydmljZS0+YmFzZS51c2VyZGF0YTsKKwkJaWYgKHVzZXJfc2VydmljZS0+aXNfdmNoaSA9PSAwKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlzcGluX2xvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisJCWlmICh1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUgPT0gdXNlcl9zZXJ2aWNlLT5tc2dfaW5zZXJ0KSB7CisJCQlpZiAoIWFyZ3MuYmxvY2tpbmcpIHsKKwkJCQlzcGluX3VubG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKwkJCQlERUJVR19UUkFDRShERVFVRVVFX01FU1NBR0VfTElORSk7CisJCQkJcmV0ID0gLUVXT1VMREJMT0NLOworCQkJCWJyZWFrOworCQkJfQorCQkJdXNlcl9zZXJ2aWNlLT5kZXF1ZXVlX3BlbmRpbmcgPSAxOworCQkJZG8geworCQkJCXNwaW5fdW5sb2NrKCZtc2dfcXVldWVfc3BpbmxvY2spOworCQkJCURFQlVHX1RSQUNFKERFUVVFVUVfTUVTU0FHRV9MSU5FKTsKKwkJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKAorCQkJCQkmdXNlcl9zZXJ2aWNlLT5pbnNlcnRfZXZlbnQpICE9IDApIHsKKwkJCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkJCSJERVFVRVVFX01FU1NBR0UgaW50ZXJydXB0ZWQiKTsKKwkJCQkJcmV0ID0gLUVJTlRSOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc3Bpbl9sb2NrKCZtc2dfcXVldWVfc3BpbmxvY2spOworCQkJfSB3aGlsZSAodXNlcl9zZXJ2aWNlLT5tc2dfcmVtb3ZlID09CisJCQkJdXNlcl9zZXJ2aWNlLT5tc2dfaW5zZXJ0KTsKKworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJfQorCisJCUJVR19PTigoaW50KSh1c2VyX3NlcnZpY2UtPm1zZ19pbnNlcnQgLQorCQkJdXNlcl9zZXJ2aWNlLT5tc2dfcmVtb3ZlKSA8IDApOworCisJCWhlYWRlciA9IHVzZXJfc2VydmljZS0+bXNnX3F1ZXVlW3VzZXJfc2VydmljZS0+bXNnX3JlbW92ZSAmCisJCQkoTVNHX1FVRVVFX1NJWkUgLSAxKV07CisJCXVzZXJfc2VydmljZS0+bXNnX3JlbW92ZSsrOworCQlzcGluX3VubG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKworCQl1cCgmdXNlcl9zZXJ2aWNlLT5yZW1vdmVfZXZlbnQpOworCQlpZiAoaGVhZGVyID09IE5VTEwpCisJCQlyZXQgPSAtRU5PVENPTk47CisJCWVsc2UgaWYgKGhlYWRlci0+c2l6ZSA8PSBhcmdzLmJ1ZnNpemUpIHsKKwkJCS8qIENvcHkgdG8gdXNlciBzcGFjZSBpZiBtc2didWYgaXMgbm90IE5VTEwgKi8KKwkJCWlmICgoYXJncy5idWYgPT0gTlVMTCkgfHwKKwkJCQkoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZ3MuYnVmLAorCQkJCWhlYWRlci0+ZGF0YSwKKwkJCQloZWFkZXItPnNpemUpID09IDApKSB7CisJCQkJcmV0ID0gaGVhZGVyLT5zaXplOworCQkJCXZjaGlxX3JlbGVhc2VfbWVzc2FnZSgKKwkJCQkJc2VydmljZS0+aGFuZGxlLAorCQkJCQloZWFkZXIpOworCQkJfSBlbHNlCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCSJoZWFkZXIgJXg6IGJ1ZnNpemUgJXggPCBzaXplICV4IiwKKwkJCQkodW5zaWduZWQgaW50KWhlYWRlciwgYXJncy5idWZzaXplLAorCQkJCWhlYWRlci0+c2l6ZSk7CisJCQlXQVJOKDEsICJpbnZhbGlkIHNpemVcbiIpOworCQkJcmV0ID0gLUVNU0dTSVpFOworCQl9CisJCURFQlVHX1RSQUNFKERFUVVFVUVfTUVTU0FHRV9MSU5FKTsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfR0VUX0NMSUVOVF9JRDogeworCQlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSA9IChWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UKWFyZzsKKworCQlyZXQgPSB2Y2hpcV9nZXRfY2xpZW50X2lkKGhhbmRsZSk7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0dFVF9DT05GSUc6IHsKKwkJVkNISVFfR0VUX0NPTkZJR19UIGFyZ3M7CisJCVZDSElRX0NPTkZJR19UIGNvbmZpZzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFyZ3MsIChjb25zdCB2b2lkIF9fdXNlciAqKWFyZywKKwkJCXNpemVvZihhcmdzKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChhcmdzLmNvbmZpZ19zaXplID4gc2l6ZW9mKGNvbmZpZykpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlzdGF0dXMgPSB2Y2hpcV9nZXRfY29uZmlnKGluc3RhbmNlLCBhcmdzLmNvbmZpZ19zaXplLCAmY29uZmlnKTsKKwkJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSB7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZ3MucGNvbmZpZywKKwkJCQkgICAgJmNvbmZpZywgYXJncy5jb25maWdfc2l6ZSkgIT0gMCkgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfU0VUX1NFUlZJQ0VfT1BUSU9OOiB7CisJCVZDSElRX1NFVF9TRVJWSUNFX09QVElPTl9UIGFyZ3M7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKAorCQkJJmFyZ3MsIChjb25zdCB2b2lkIF9fdXNlciAqKWFyZywKKwkJCXNpemVvZihhcmdzKSkgIT0gMCkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJc2VydmljZSA9IGZpbmRfc2VydmljZV9mb3JfaW5zdGFuY2UoaW5zdGFuY2UsIGFyZ3MuaGFuZGxlKTsKKwkJaWYgKCFzZXJ2aWNlKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlzdGF0dXMgPSB2Y2hpcV9zZXRfc2VydmljZV9vcHRpb24oCisJCQkJYXJncy5oYW5kbGUsIGFyZ3Mub3B0aW9uLCBhcmdzLnZhbHVlKTsKKwl9IGJyZWFrOworCisJY2FzZSBWQ0hJUV9JT0NfRFVNUF9QSFlTX01FTTogeworCQlWQ0hJUV9EVU1QX01FTV9UICBhcmdzOworCisJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICgmYXJncywgKGNvbnN0IHZvaWQgX191c2VyICopYXJnLAorCQkJICBzaXplb2YoYXJncykpICE9IDApIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlkdW1wX3BoeXNfbWVtKGFyZ3MudmlydF9hZGRyLCBhcmdzLm51bV9ieXRlcyk7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0xJQl9WRVJTSU9OOiB7CisJCXVuc2lnbmVkIGludCBsaWJfdmVyc2lvbiA9ICh1bnNpZ25lZCBpbnQpYXJnOworCisJCWlmIChsaWJfdmVyc2lvbiA8IFZDSElRX1ZFUlNJT05fTUlOKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJZWxzZSBpZiAobGliX3ZlcnNpb24gPj0gVkNISVFfVkVSU0lPTl9DTE9TRV9ERUxJVkVSRUQpCisJCQlpbnN0YW5jZS0+dXNlX2Nsb3NlX2RlbGl2ZXJlZCA9IDE7CisJfSBicmVhazsKKworCWNhc2UgVkNISVFfSU9DX0NMT1NFX0RFTElWRVJFRDogeworCQlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSA9IChWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UKWFyZzsKKworCQlzZXJ2aWNlID0gZmluZF9jbG9zZWRfc2VydmljZV9mb3JfaW5zdGFuY2UoaW5zdGFuY2UsIGhhbmRsZSk7CisJCWlmIChzZXJ2aWNlICE9IE5VTEwpIHsKKwkJCVVTRVJfU0VSVklDRV9UICp1c2VyX3NlcnZpY2UgPQorCQkJCShVU0VSX1NFUlZJQ0VfVCAqKXNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisJCQljbG9zZV9kZWxpdmVyZWQodXNlcl9zZXJ2aWNlKTsKKwkJfQorCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCX0gYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PVFRZOworCQlicmVhazsKKwl9CisKKwlpZiAoc2VydmljZSkKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJaWYgKHN0YXR1cyA9PSBWQ0hJUV9FUlJPUikKKwkJCXJldCA9IC1FSU87CisJCWVsc2UgaWYgKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSkKKwkJCXJldCA9IC1FSU5UUjsKKwl9CisKKwlpZiAoKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSAmJiAocmV0IDwgMCkgJiYgKHJldCAhPSAtRUlOVFIpICYmCisJCShyZXQgIT0gLUVXT1VMREJMT0NLKSkKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSIgIGlvY3RsIGluc3RhbmNlICVseCwgY21kICVzIC0+IHN0YXR1cyAlZCwgJWxkIiwKKwkJCSh1bnNpZ25lZCBsb25nKWluc3RhbmNlLAorCQkJKF9JT0NfTlIoY21kKSA8PSBWQ0hJUV9JT0NfTUFYKSA/CisJCQkJaW9jdGxfbmFtZXNbX0lPQ19OUihjbWQpXSA6CisJCQkJIjxpbnZhbGlkPiIsCisJCQlzdGF0dXMsIHJldCk7CisJZWxzZQorCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSIgIGlvY3RsIGluc3RhbmNlICVseCwgY21kICVzIC0+IHN0YXR1cyAlZCwgJWxkIiwKKwkJCSh1bnNpZ25lZCBsb25nKWluc3RhbmNlLAorCQkJKF9JT0NfTlIoY21kKSA8PSBWQ0hJUV9JT0NfTUFYKSA/CisJCQkJaW9jdGxfbmFtZXNbX0lPQ19OUihjbWQpXSA6CisJCQkJIjxpbnZhbGlkPiIsCisJCQlzdGF0dXMsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX29wZW4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAordmNoaXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7CisJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwgInZjaGlxX29wZW4iKTsKKwlzd2l0Y2ggKGRldikgeworCWNhc2UgVkNISVFfTUlOT1I6IHsKKwkJaW50IHJldDsKKwkJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSB2Y2hpcV9nZXRfc3RhdGUoKTsKKwkJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZTsKKworCQlpZiAoIXN0YXRlKSB7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCQkidmNoaXEgaGFzIG5vIGNvbm5lY3Rpb24gdG8gVmlkZW9Db3JlIik7CisJCQlyZXR1cm4gLUVOT1RDT05OOworCQl9CisKKwkJaW5zdGFuY2UgPSBremFsbG9jKHNpemVvZigqaW5zdGFuY2UpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbnN0YW5jZSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWluc3RhbmNlLT5zdGF0ZSA9IHN0YXRlOworCQlpbnN0YW5jZS0+cGlkID0gY3VycmVudC0+dGdpZDsKKworCQlyZXQgPSB2Y2hpcV9kZWJ1Z2ZzX2FkZF9pbnN0YW5jZShpbnN0YW5jZSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJa2ZyZWUoaW5zdGFuY2UpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXNlbWFfaW5pdCgmaW5zdGFuY2UtPmluc2VydF9ldmVudCwgMCk7CisJCXNlbWFfaW5pdCgmaW5zdGFuY2UtPnJlbW92ZV9ldmVudCwgMCk7CisJCW11dGV4X2luaXQoJmluc3RhbmNlLT5jb21wbGV0aW9uX211dGV4KTsKKwkJbXV0ZXhfaW5pdCgmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3RfbXV0ZXgpOworCQlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3QpOworCisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGluc3RhbmNlOworCX0gYnJlYWs7CisKKwlkZWZhdWx0OgorCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSJVbmtub3duIG1pbm9yIGRldmljZTogJWQiLCBkZXYpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX3JlbGVhc2UKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAordmNoaXFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKSAmIDB4MGY7CisJaW50IHJldCA9IDA7CisJc3dpdGNoIChkZXYpIHsKKwljYXNlIFZDSElRX01JTk9SOiB7CisJCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gdmNoaXFfZ2V0X3N0YXRlKCk7CisJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwkJaW50IGk7CisKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSJ2Y2hpcV9yZWxlYXNlOiBpbnN0YW5jZT0lbHgiLAorCQkJKHVuc2lnbmVkIGxvbmcpaW5zdGFuY2UpOworCisJCWlmICghc3RhdGUpIHsKKwkJCXJldCA9IC1FUEVSTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogRW5zdXJlIHZpZGVvY29yZSBpcyBhd2FrZSB0byBhbGxvdyB0ZXJtaW5hdGlvbi4gKi8KKwkJdmNoaXFfdXNlX2ludGVybmFsKGluc3RhbmNlLT5zdGF0ZSwgTlVMTCwKKwkJCQlVU0VfVFlQRV9WQ0hJUSk7CisKKwkJbXV0ZXhfbG9jaygmaW5zdGFuY2UtPmNvbXBsZXRpb25fbXV0ZXgpOworCisJCS8qIFdha2UgdGhlIGNvbXBsZXRpb24gdGhyZWFkIGFuZCBhc2sgaXQgdG8gZXhpdCAqLworCQlpbnN0YW5jZS0+Y2xvc2luZyA9IDE7CisJCXVwKCZpbnN0YW5jZS0+aW5zZXJ0X2V2ZW50KTsKKworCQltdXRleF91bmxvY2soJmluc3RhbmNlLT5jb21wbGV0aW9uX211dGV4KTsKKworCQkvKiBXYWtlIHRoZSBzbG90IGhhbmRsZXIgaWYgdGhlIGNvbXBsZXRpb24gcXVldWUgaXMgZnVsbC4gKi8KKwkJdXAoJmluc3RhbmNlLT5yZW1vdmVfZXZlbnQpOworCisJCS8qIE1hcmsgYWxsIHNlcnZpY2VzIGZvciB0ZXJtaW5hdGlvbi4uLiAqLworCQlpID0gMDsKKwkJd2hpbGUgKChzZXJ2aWNlID0gbmV4dF9zZXJ2aWNlX2J5X2luc3RhbmNlKHN0YXRlLCBpbnN0YW5jZSwKKwkJCSZpKSkgIT0JTlVMTCkgeworCQkJVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSA9IHNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisKKwkJCS8qIFdha2UgdGhlIHNsb3QgaGFuZGxlciBpZiB0aGUgbXNnIHF1ZXVlIGlzIGZ1bGwuICovCisJCQl1cCgmdXNlcl9zZXJ2aWNlLT5yZW1vdmVfZXZlbnQpOworCisJCQl2Y2hpcV90ZXJtaW5hdGVfc2VydmljZV9pbnRlcm5hbChzZXJ2aWNlKTsKKwkJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQl9CisKKwkJLyogLi4uYW5kIHdhaXQgZm9yIHRoZW0gdG8gZGllICovCisJCWkgPSAwOworCQl3aGlsZSAoKHNlcnZpY2UgPSBuZXh0X3NlcnZpY2VfYnlfaW5zdGFuY2Uoc3RhdGUsIGluc3RhbmNlLCAmaSkpCisJCQkhPSBOVUxMKSB7CisJCQlVU0VSX1NFUlZJQ0VfVCAqdXNlcl9zZXJ2aWNlID0gc2VydmljZS0+YmFzZS51c2VyZGF0YTsKKworCQkJZG93bigmc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKworCQkJQlVHX09OKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpOworCisJCQlzcGluX2xvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisKKwkJCXdoaWxlICh1c2VyX3NlcnZpY2UtPm1zZ19yZW1vdmUgIT0KKwkJCQl1c2VyX3NlcnZpY2UtPm1zZ19pbnNlcnQpIHsKKwkJCQlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyID0gdXNlcl9zZXJ2aWNlLT4KKwkJCQkJbXNnX3F1ZXVlW3VzZXJfc2VydmljZS0+bXNnX3JlbW92ZSAmCisJCQkJCQkoTVNHX1FVRVVFX1NJWkUgLSAxKV07CisJCQkJdXNlcl9zZXJ2aWNlLT5tc2dfcmVtb3ZlKys7CisJCQkJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisKKwkJCQlpZiAoaGVhZGVyKQorCQkJCQl2Y2hpcV9yZWxlYXNlX21lc3NhZ2UoCisJCQkJCQlzZXJ2aWNlLT5oYW5kbGUsCisJCQkJCQloZWFkZXIpOworCQkJCXNwaW5fbG9jaygmbXNnX3F1ZXVlX3NwaW5sb2NrKTsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2soJm1zZ19xdWV1ZV9zcGlubG9jayk7CisKKwkJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQl9CisKKwkJLyogUmVsZWFzZSBhbnkgY2xvc2VkIHNlcnZpY2VzICovCisJCXdoaWxlIChpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUgIT0KKwkJCWluc3RhbmNlLT5jb21wbGV0aW9uX2luc2VydCkgeworCQkJVkNISVFfQ09NUExFVElPTl9EQVRBX1QgKmNvbXBsZXRpb247CisJCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJCQljb21wbGV0aW9uID0gJmluc3RhbmNlLT5jb21wbGV0aW9uc1sKKwkJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUgJgorCQkJCShNQVhfQ09NUExFVElPTlMgLSAxKV07CisJCQlzZXJ2aWNlID0gY29tcGxldGlvbi0+c2VydmljZV91c2VyZGF0YTsKKwkJCWlmIChjb21wbGV0aW9uLT5yZWFzb24gPT0gVkNISVFfU0VSVklDRV9DTE9TRUQpCisJCQl7CisJCQkJVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSA9CisJCQkJCXNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisKKwkJCQkvKiBXYWtlIGFueSBibG9ja2VkIHVzZXItdGhyZWFkICovCisJCQkJaWYgKGluc3RhbmNlLT51c2VfY2xvc2VfZGVsaXZlcmVkKQorCQkJCQl1cCgmdXNlcl9zZXJ2aWNlLT5jbG9zZV9ldmVudCk7CisJCQkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJCQl9CisJCQlpbnN0YW5jZS0+Y29tcGxldGlvbl9yZW1vdmUrKzsKKwkJfQorCisJCS8qIFJlbGVhc2UgdGhlIFBFRVIgc2VydmljZSBjb3VudC4gKi8KKwkJdmNoaXFfcmVsZWFzZV9pbnRlcm5hbChpbnN0YW5jZS0+c3RhdGUsIE5VTEwpOworCisJCXsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm5leHQ7CisJCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LAorCQkJCSZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdCkgeworCQkJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlICp3YWl0ZXI7CisJCQkJd2FpdGVyID0gbGlzdF9lbnRyeShwb3MsCisJCQkJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlLAorCQkJCQlsaXN0KTsKKwkJCQlsaXN0X2RlbChwb3MpOworCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJCSJidWxrX3dhaXRlciAtIGNsZWFuZWQgdXAgJXggIgorCQkJCQkiZm9yIHBpZCAlZCIsCisJCQkJCSh1bnNpZ25lZCBpbnQpd2FpdGVyLCB3YWl0ZXItPnBpZCk7CisJCQkJa2ZyZWUod2FpdGVyKTsKKwkJCX0KKwkJfQorCisJCXZjaGlxX2RlYnVnZnNfcmVtb3ZlX2luc3RhbmNlKGluc3RhbmNlKTsKKworCQlrZnJlZShpbnN0YW5jZSk7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJfSBicmVhazsKKworCWRlZmF1bHQ6CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJIlVua25vd24gbWlub3IgZGV2aWNlOiAlZCIsIGRldik7CisJCXJldCA9IC1FTlhJTzsKKwl9CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX2R1bXAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAordmNoaXFfZHVtcCh2b2lkICpkdW1wX2NvbnRleHQsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikKK3sKKwlEVU1QX0NPTlRFWFRfVCAqY29udGV4dCA9IChEVU1QX0NPTlRFWFRfVCAqKWR1bXBfY29udGV4dDsKKworCWlmIChjb250ZXh0LT5hY3R1YWwgPCBjb250ZXh0LT5zcGFjZSkgeworCQlpbnQgY29weV9ieXRlczsKKwkJaWYgKGNvbnRleHQtPm9mZnNldCA+IDApIHsKKwkJCWludCBza2lwX2J5dGVzID0gbWluKGxlbiwgKGludCljb250ZXh0LT5vZmZzZXQpOworCQkJc3RyICs9IHNraXBfYnl0ZXM7CisJCQlsZW4gLT0gc2tpcF9ieXRlczsKKwkJCWNvbnRleHQtPm9mZnNldCAtPSBza2lwX2J5dGVzOworCQkJaWYgKGNvbnRleHQtPm9mZnNldCA+IDApCisJCQkJcmV0dXJuOworCQl9CisJCWNvcHlfYnl0ZXMgPSBtaW4obGVuLCAoaW50KShjb250ZXh0LT5zcGFjZSAtIGNvbnRleHQtPmFjdHVhbCkpOworCQlpZiAoY29weV9ieXRlcyA9PSAwKQorCQkJcmV0dXJuOworCQlpZiAoY29weV90b191c2VyKGNvbnRleHQtPmJ1ZiArIGNvbnRleHQtPmFjdHVhbCwgc3RyLAorCQkJY29weV9ieXRlcykpCisJCQljb250ZXh0LT5hY3R1YWwgPSAtRUZBVUxUOworCQljb250ZXh0LT5hY3R1YWwgKz0gY29weV9ieXRlczsKKwkJbGVuIC09IGNvcHlfYnl0ZXM7CisKKwkJLyogSWYgdG5lIHRlcm1pbmF0aW5nIE5VTCBpcyBpbmNsdWRlZCBpbiB0aGUgbGVuZ3RoLCB0aGVuIGl0CisJCSoqIG1hcmtzIHRoZSBlbmQgb2YgYSBsaW5lIGFuZCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aCBhCisJCSoqIGNhcnJpYWdlIHJldHVybi4gKi8KKwkJaWYgKChsZW4gPT0gMCkgJiYgKHN0cltjb3B5X2J5dGVzIC0gMV0gPT0gJ1wwJykpIHsKKwkJCWNoYXIgY3IgPSAnXG4nOworCQkJaWYgKGNvcHlfdG9fdXNlcihjb250ZXh0LT5idWYgKyBjb250ZXh0LT5hY3R1YWwgLSAxLAorCQkJCSZjciwgMSkpCisJCQkJY29udGV4dC0+YWN0dWFsID0gLUVGQVVMVDsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9kdW1wX3BsYXRmb3JtX2luc3RhbmNlX3N0YXRlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1faW5zdGFuY2VzKHZvaWQgKmR1bXBfY29udGV4dCkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHZjaGlxX2dldF9zdGF0ZSgpOworCWNoYXIgYnVmWzgwXTsKKwlpbnQgbGVuOworCWludCBpOworCisJLyogVGhlcmUgaXMgbm8gbGlzdCBvZiBpbnN0YW5jZXMsIHNvIGluc3RlYWQgc2NhbiBhbGwgc2VydmljZXMsCisJCW1hcmtpbmcgdGhvc2UgdGhhdCBoYXZlIGJlZW4gZHVtcGVkLiAqLworCisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT51bnVzZWRfc2VydmljZTsgaSsrKSB7CisJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IHN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZTsKKworCQlpZiAoc2VydmljZSAmJiAoc2VydmljZS0+YmFzZS5jYWxsYmFjayA9PSBzZXJ2aWNlX2NhbGxiYWNrKSkgeworCQkJaW5zdGFuY2UgPSBzZXJ2aWNlLT5pbnN0YW5jZTsKKwkJCWlmIChpbnN0YW5jZSkKKwkJCQlpbnN0YW5jZS0+bWFyayA9IDA7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPnVudXNlZF9zZXJ2aWNlOyBpKyspIHsKKwkJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gc3RhdGUtPnNlcnZpY2VzW2ldOworCQlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlOworCisJCWlmIChzZXJ2aWNlICYmIChzZXJ2aWNlLT5iYXNlLmNhbGxiYWNrID09IHNlcnZpY2VfY2FsbGJhY2spKSB7CisJCQlpbnN0YW5jZSA9IHNlcnZpY2UtPmluc3RhbmNlOworCQkJaWYgKGluc3RhbmNlICYmICFpbnN0YW5jZS0+bWFyaykgeworCQkJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJCSJJbnN0YW5jZSAleDogcGlkICVkLCVzIGNvbXBsZXRpb25zICIKKwkJCQkJCSIlZC8lZCIsCisJCQkJCSh1bnNpZ25lZCBpbnQpaW5zdGFuY2UsIGluc3RhbmNlLT5waWQsCisJCQkJCWluc3RhbmNlLT5jb25uZWN0ZWQgPyAiIGNvbm5lY3RlZCwgIiA6CisJCQkJCQkiIiwKKwkJCQkJaW5zdGFuY2UtPmNvbXBsZXRpb25faW5zZXJ0IC0KKwkJCQkJCWluc3RhbmNlLT5jb21wbGV0aW9uX3JlbW92ZSwKKwkJCQkJTUFYX0NPTVBMRVRJT05TKTsKKworCQkJCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJCQkJaW5zdGFuY2UtPm1hcmsgPSAxOworCQkJfQorCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX2R1bXBfcGxhdGZvcm1fc2VydmljZV9zdGF0ZQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkCit2Y2hpcV9kdW1wX3BsYXRmb3JtX3NlcnZpY2Vfc3RhdGUodm9pZCAqZHVtcF9jb250ZXh0LCBWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJVVNFUl9TRVJWSUNFX1QgKnVzZXJfc2VydmljZSA9IChVU0VSX1NFUlZJQ0VfVCAqKXNlcnZpY2UtPmJhc2UudXNlcmRhdGE7CisJY2hhciBidWZbODBdOworCWludCBsZW47CisKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiICBpbnN0YW5jZSAleCIsCisJCSh1bnNpZ25lZCBpbnQpc2VydmljZS0+aW5zdGFuY2UpOworCisJaWYgKChzZXJ2aWNlLT5iYXNlLmNhbGxiYWNrID09IHNlcnZpY2VfY2FsbGJhY2spICYmCisJCXVzZXJfc2VydmljZS0+aXNfdmNoaSkgeworCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKKwkJCSIsICVkLyVkIG1lc3NhZ2VzIiwKKwkJCXVzZXJfc2VydmljZS0+bXNnX2luc2VydCAtIHVzZXJfc2VydmljZS0+bXNnX3JlbW92ZSwKKwkJCU1TR19RVUVVRV9TSVpFKTsKKworCQlpZiAodXNlcl9zZXJ2aWNlLT5kZXF1ZXVlX3BlbmRpbmcpCisJCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplb2YoYnVmKSAtIGxlbiwKKwkJCQkiIChkZXF1ZXVlIHBlbmRpbmcpIik7CisJfQorCisJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgZHVtcF91c2VyX21lbQorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAorZHVtcF9waHlzX21lbSh2b2lkICp2aXJ0X2FkZHIsIHVpbnQzMl90IG51bV9ieXRlcykKK3sKKwlpbnQgICAgICAgICAgICByYzsKKwl1aW50OF90ICAgICAgICplbmRfdmlydF9hZGRyID0gdmlydF9hZGRyICsgbnVtX2J5dGVzOworCWludCAgICAgICAgICAgIG51bV9wYWdlczsKKwlpbnQgICAgICAgICAgICBvZmZzZXQ7CisJaW50ICAgICAgICAgICAgZW5kX29mZnNldDsKKwlpbnQgICAgICAgICAgICBwYWdlX2lkeDsKKwlpbnQgICAgICAgICAgICBwcmV2X2lkeDsKKwlzdHJ1Y3QgcGFnZSAgICpwYWdlOworCXN0cnVjdCBwYWdlICAqKnBhZ2VzOworCXVpbnQ4X3QgICAgICAgKmttYXBwZWRfdmlydF9wdHI7CisKKwkvKiBBbGlnbiB2aXJ0QWRkciBhbmQgZW5kVmlydEFkZHIgdG8gMTYgYnl0ZSBib3VuZGFyaWVzLiAqLworCisJdmlydF9hZGRyID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdmlydF9hZGRyICYgfjB4MGZ1TCk7CisJZW5kX3ZpcnRfYWRkciA9ICh2b2lkICopKCgodW5zaWduZWQgbG9uZyllbmRfdmlydF9hZGRyICsgMTV1TCkgJgorCQl+MHgwZnVMKTsKKworCW9mZnNldCA9IChpbnQpKGxvbmcpdmlydF9hZGRyICYgKFBBR0VfU0laRSAtIDEpOworCWVuZF9vZmZzZXQgPSAoaW50KShsb25nKWVuZF92aXJ0X2FkZHIgJiAoUEFHRV9TSVpFIC0gMSk7CisKKwludW1fcGFnZXMgPSAob2Zmc2V0ICsgbnVtX2J5dGVzICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisKKwlwYWdlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogbnVtX3BhZ2VzLCBHRlBfS0VSTkVMKTsKKwlpZiAocGFnZXMgPT0gTlVMTCkgeworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJCSJVbmFibGUgdG8gYWxsb2NhdGlvbiBtZW1vcnkgZm9yICVkIHBhZ2VzXG4iLAorCQkJbnVtX3BhZ2VzKTsKKwkJcmV0dXJuOworCX0KKworCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyYyA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsICAgICAgLyogdGFzayAqLworCQljdXJyZW50LT5tbSwgICAgICAgICAgICAgIC8qIG1tICovCisJCSh1bnNpZ25lZCBsb25nKXZpcnRfYWRkciwgLyogc3RhcnQgKi8KKwkJbnVtX3BhZ2VzLCAgICAgICAgICAgICAgICAvKiBsZW4gKi8KKwkJMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSAqLworCQkwLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmNlICovCisJCXBhZ2VzLCAgICAgICAgICAgICAgICAgICAgLyogcGFnZXMgKGFycmF5IG9mIHBhZ2UgcG9pbnRlcnMpICovCisJCU5VTEwpOyAgICAgICAgICAgICAgICAgICAgLyogdm1hcyAqLworCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwlwcmV2X2lkeCA9IC0xOworCXBhZ2UgPSBOVUxMOworCisJd2hpbGUgKG9mZnNldCA8IGVuZF9vZmZzZXQpIHsKKworCQlpbnQgcGFnZV9vZmZzZXQgPSBvZmZzZXQgJSBQQUdFX1NJWkU7CisJCXBhZ2VfaWR4ID0gb2Zmc2V0IC8gUEFHRV9TSVpFOworCisJCWlmIChwYWdlX2lkeCAhPSBwcmV2X2lkeCkgeworCisJCQlpZiAocGFnZSAhPSBOVUxMKQorCQkJCWt1bm1hcChwYWdlKTsKKwkJCXBhZ2UgPSBwYWdlc1twYWdlX2lkeF07CisJCQlrbWFwcGVkX3ZpcnRfcHRyID0ga21hcChwYWdlKTsKKworCQkJcHJldl9pZHggPSBwYWdlX2lkeDsKKwkJfQorCisJCWlmICh2Y2hpcV9hcm1fbG9nX2xldmVsID49IFZDSElRX0xPR19UUkFDRSkKKwkJCXZjaGlxX2xvZ19kdW1wX21lbSgicGgiLAorCQkJCSh1aW50MzJfdCkodW5zaWduZWQgbG9uZykma21hcHBlZF92aXJ0X3B0clsKKwkJCQkJcGFnZV9vZmZzZXRdLAorCQkJCSZrbWFwcGVkX3ZpcnRfcHRyW3BhZ2Vfb2Zmc2V0XSwgMTYpOworCisJCW9mZnNldCArPSAxNjsKKwl9CisJaWYgKHBhZ2UgIT0gTlVMTCkKKwkJa3VubWFwKHBhZ2UpOworCisJZm9yIChwYWdlX2lkeCA9IDA7IHBhZ2VfaWR4IDwgbnVtX3BhZ2VzOyBwYWdlX2lkeCsrKQorCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbcGFnZV9pZHhdKTsKKworCWtmcmVlKHBhZ2VzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9yZWFkCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzc2l6ZV90Cit2Y2hpcV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCURVTVBfQ09OVEVYVF9UIGNvbnRleHQ7CisJY29udGV4dC5idWYgPSBidWY7CisJY29udGV4dC5hY3R1YWwgPSAwOworCWNvbnRleHQuc3BhY2UgPSBjb3VudDsKKwljb250ZXh0Lm9mZnNldCA9ICpwcG9zOworCisJdmNoaXFfZHVtcF9zdGF0ZSgmY29udGV4dCwgJmdfc3RhdGUpOworCisJKnBwb3MgKz0gY29udGV4dC5hY3R1YWw7CisKKwlyZXR1cm4gY29udGV4dC5hY3R1YWw7Cit9CisKK1ZDSElRX1NUQVRFX1QgKgordmNoaXFfZ2V0X3N0YXRlKHZvaWQpCit7CisKKwlpZiAoZ19zdGF0ZS5yZW1vdGUgPT0gTlVMTCkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZ19zdGF0ZS5yZW1vdGUgPT0gTlVMTFxuIiwgX19mdW5jX18pOworCWVsc2UgaWYgKGdfc3RhdGUucmVtb3RlLT5pbml0aWFsaXNlZCAhPSAxKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiBnX3N0YXRlLnJlbW90ZS0+aW5pdGlhbGlzZWQgIT0gMSAoJWQpXG4iLAorCQkJX19mdW5jX18sIGdfc3RhdGUucmVtb3RlLT5pbml0aWFsaXNlZCk7CisKKwlyZXR1cm4gKChnX3N0YXRlLnJlbW90ZSAhPSBOVUxMKSAmJgorCQkoZ19zdGF0ZS5yZW1vdGUtPmluaXRpYWxpc2VkID09IDEpKSA/ICZnX3N0YXRlIDogTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMKK3ZjaGlxX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnVubG9ja2VkX2lvY3RsID0gdmNoaXFfaW9jdGwsCisJLm9wZW4gPSB2Y2hpcV9vcGVuLAorCS5yZWxlYXNlID0gdmNoaXFfcmVsZWFzZSwKKwkucmVhZCA9IHZjaGlxX3JlYWQKK307CisKKy8qCisgKiBBdXRvc3VzcGVuZCByZWxhdGVkIGZ1bmN0aW9uYWxpdHkKKyAqLworCitpbnQKK3ZjaGlxX3ZpZGVvY29yZV93YW50ZWQoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCWlmICghYXJtX3N0YXRlKQorCQkvKiBhdXRvc3VzcGVuZCBub3Qgc3VwcG9ydGVkIC0gYWx3YXlzIHJldHVybiB3YW50ZWQgKi8KKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoYXJtX3N0YXRlLT5ibG9ja2VkX2NvdW50KQorCQlyZXR1cm4gMTsKKwllbHNlIGlmICghYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50KQorCQkvKiB1c2FnZSBjb3VudCB6ZXJvIC0gY2hlY2sgZm9yIG92ZXJyaWRlIHVubGVzcyB3ZSdyZSBmb3JjaW5nICovCisJCWlmIChhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VkKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiB2Y2hpcV9wbGF0Zm9ybV92aWRlb2NvcmVfd2FudGVkKHN0YXRlKTsKKwllbHNlCisJCS8qIG5vbi16ZXJvIHVzYWdlIGNvdW50IC0gdmlkZW9jb3JlIHN0aWxsIHJlcXVpcmVkICovCisJCXJldHVybiAxOworfQorCitzdGF0aWMgVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2tlZXBhbGl2ZV92Y2hpcV9jYWxsYmFjayhWQ0hJUV9SRUFTT05fVCByZWFzb24sCisJVkNISVFfSEVBREVSX1QgKmhlYWRlciwKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2VfdXNlciwKKwl2b2lkICpidWxrX3VzZXIpCit7CisJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkiJXMgY2FsbGJhY2sgcmVhc29uICVkIiwgX19mdW5jX18sIHJlYXNvbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3ZjaGlxX2tlZXBhbGl2ZV90aHJlYWRfZnVuYyh2b2lkICp2KQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gKFZDSElRX1NUQVRFX1QgKikgdjsKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZTsKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGthX2hhbmRsZTsKKworCVZDSElRX1NFUlZJQ0VfUEFSQU1TX1QgcGFyYW1zID0geworCQkuZm91cmNjICAgICAgPSBWQ0hJUV9NQUtFX0ZPVVJDQygnSycsICdFJywgJ0UnLCAnUCcpLAorCQkuY2FsbGJhY2sgICAgPSB2Y2hpcV9rZWVwYWxpdmVfdmNoaXFfY2FsbGJhY2ssCisJCS52ZXJzaW9uICAgICA9IEtFRVBBTElWRV9WRVIsCisJCS52ZXJzaW9uX21pbiA9IEtFRVBBTElWRV9WRVJfTUlOCisJfTsKKworCXN0YXR1cyA9IHZjaGlxX2luaXRpYWxpc2UoJmluc3RhbmNlKTsKKwlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzIHZjaGlxX2luaXRpYWxpc2UgZmFpbGVkICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlzdGF0dXMgPSB2Y2hpcV9jb25uZWN0KGluc3RhbmNlKTsKKwlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzIHZjaGlxX2Nvbm5lY3QgZmFpbGVkICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJCWdvdG8gc2h1dGRvd247CisJfQorCisJc3RhdHVzID0gdmNoaXFfYWRkX3NlcnZpY2UoaW5zdGFuY2UsICZwYXJhbXMsICZrYV9oYW5kbGUpOworCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykgeworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXMgdmNoaXFfb3Blbl9zZXJ2aWNlIGZhaWxlZCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworCQlnb3RvIHNodXRkb3duOworCX0KKworCXdoaWxlICgxKSB7CisJCWxvbmcgcmMgPSAwLCB1YyA9IDA7CisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmFybV9zdGF0ZS0+a2FfZXZ0KQorCQkJCSE9IDApIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkiJXMgaW50ZXJydXB0ZWQiLCBfX2Z1bmNfXyk7CisJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiByZWFkIGFuZCBjbGVhciBjb3VudGVycy4gIERvIHJlbGVhc2VfY291bnQgdGhlbiB1c2VfY291bnQgdG8KKwkJICogcHJldmVudCBnZXR0aW5nIG1vcmUgcmVsZWFzZXMgdGhhbiB1c2VzICovCisJCXJjID0gYXRvbWljX3hjaGcoJmFybV9zdGF0ZS0+a2FfcmVsZWFzZV9jb3VudCwgMCk7CisJCXVjID0gYXRvbWljX3hjaGcoJmFybV9zdGF0ZS0+a2FfdXNlX2NvdW50LCAwKTsKKworCQkvKiBDYWxsIHVzZS9yZWxlYXNlIHNlcnZpY2UgdGhlIHJlcXVpc2l0ZSBudW1iZXIgb2YgdGltZXMuCisJCSAqIFByb2Nlc3MgdXNlIGJlZm9yZSByZWxlYXNlIHNvIHVzZSBjb3VudHMgZG9uJ3QgZ28gbmVnYXRpdmUgKi8KKwkJd2hpbGUgKHVjLS0pIHsKKwkJCWF0b21pY19pbmMoJmFybV9zdGF0ZS0+a2FfdXNlX2Fja19jb3VudCk7CisJCQlzdGF0dXMgPSB2Y2hpcV91c2Vfc2VydmljZShrYV9oYW5kbGUpOworCQkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKSB7CisJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJCQkiJXMgdmNoaXFfdXNlX3NlcnZpY2UgZXJyb3IgJWQiLAorCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCX0KKwkJfQorCQl3aGlsZSAocmMtLSkgeworCQkJc3RhdHVzID0gdmNoaXFfcmVsZWFzZV9zZXJ2aWNlKGthX2hhbmRsZSk7CisJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJCSIlcyB2Y2hpcV9yZWxlYXNlX3NlcnZpY2UgZXJyb3IgJWQiLAorCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwkJCX0KKwkJfQorCX0KKworc2h1dGRvd246CisJdmNoaXFfc2h1dGRvd24oaW5zdGFuY2UpOworZXhpdDoKKwlyZXR1cm4gMDsKK30KKworCisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9hcm1faW5pdF9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCisJaWYgKGFybV9zdGF0ZSkgeworCQlyd2xvY2tfaW5pdCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworCQlpbml0X2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+a2FfZXZ0KTsKKwkJYXRvbWljX3NldCgmYXJtX3N0YXRlLT5rYV91c2VfY291bnQsIDApOworCQlhdG9taWNfc2V0KCZhcm1fc3RhdGUtPmthX3VzZV9hY2tfY291bnQsIDApOworCQlhdG9taWNfc2V0KCZhcm1fc3RhdGUtPmthX3JlbGVhc2VfY291bnQsIDApOworCisJCWluaXRfY29tcGxldGlvbigmYXJtX3N0YXRlLT52Y19zdXNwZW5kX2NvbXBsZXRlKTsKKworCQlpbml0X2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlKTsKKwkJLyogSW5pdGlhbGlzZSB0byAnZG9uZScgc3RhdGUuICBXZSBvbmx5IHdhbnQgdG8gYmxvY2sgb24gcmVzdW1lCisJCSAqIGNvbXBsZXRpb24gd2hpbGUgdmlkZW9jb3JlIGlzIHN1c3BlbmRlZC4gKi8KKwkJc2V0X3Jlc3VtZV9zdGF0ZShhcm1fc3RhdGUsIFZDX1JFU1VNRV9SRVNVTUVEKTsKKworCQlpbml0X2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+cmVzdW1lX2Jsb2NrZXIpOworCQkvKiBJbml0aWFsaXNlIHRvICdkb25lJyBzdGF0ZS4gIFdlIG9ubHkgd2FudCB0byBibG9jayBvbiB0aGlzCisJCSAqIGNvbXBsZXRpb24gd2hpbGUgcmVzdW1lIGlzIGJsb2NrZWQgKi8KKwkJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VyKTsKKworCQlpbml0X2NvbXBsZXRpb24oJmFybV9zdGF0ZS0+YmxvY2tlZF9ibG9ja2VyKTsKKwkJLyogSW5pdGlhbGlzZSB0byAnZG9uZScgc3RhdGUuICBXZSBvbmx5IHdhbnQgdG8gYmxvY2sgb24gdGhpcworCQkgKiBjb21wbGV0aW9uIHdoaWxlIHRoaW5ncyBhcmUgd2FpdGluZyBvbiB0aGUgcmVzdW1lIGJsb2NrZXIgKi8KKwkJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPmJsb2NrZWRfYmxvY2tlcik7CisKKwkJYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyX3RpbWVvdXQgPSBTVVNQRU5EX1RJTUVSX1RJTUVPVVRfTVM7CisJCWFybV9zdGF0ZS0+c3VzcGVuZF90aW1lcl9ydW5uaW5nID0gMDsKKwkJaW5pdF90aW1lcigmYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyKTsKKwkJYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykoc3RhdGUpOworCQlhcm1fc3RhdGUtPnN1c3BlbmRfdGltZXIuZnVuY3Rpb24gPSBzdXNwZW5kX3RpbWVyX2NhbGxiYWNrOworCisJCWFybV9zdGF0ZS0+Zmlyc3RfY29ubmVjdCA9IDA7CisKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyoqIEZ1bmN0aW9ucyB0byBtb2RpZnkgdGhlIHN0YXRlIHZhcmlhYmxlczsKKyoqCXNldF9zdXNwZW5kX3N0YXRlCisqKglzZXRfcmVzdW1lX3N0YXRlCisqKgorKiogVGhlcmUgYXJlIG1vcmUgc3RhdGUgdmFyaWFibGVzIHRoYW4gd2UgbWlnaHQgbGlrZSwgc28gZW5zdXJlIHRoZXkgcmVtYWluIGluCisqKiBzdGVwLiAgU3VzcGVuZCBhbmQgcmVzdW1lIHN0YXRlIGFyZSBtYWludGFpbmVkIHNlcGFyYXRlbHksIHNpbmNlIG1vc3Qgb2YKKyoqIHRoZXNlIHN0YXRlIG1hY2hpbmVzIGNhbiBvcGVyYXRlIGluZGVwZW5kZW50bHkuICBIb3dldmVyLCB0aGVyZSBhcmUgYSBmZXcKKyoqIHN0YXRlcyB3aGVyZSBzdGF0ZSB0cmFuc2l0aW9ucyBpbiBvbmUgc3RhdGUgbWFjaGluZSBjYXVzZSBhIHJlc2V0IHRvIHRoZQorKiogb3RoZXIgc3RhdGUgbWFjaGluZS4gIEluIGFkZGl0aW9uLCB0aGVyZSBhcmUgc29tZSBjb21wbGV0aW9uIGV2ZW50cyB3aGljaAorKiogbmVlZCB0byBvY2N1ciBvbiBzdGF0ZSBtYWNoaW5lIHJlc2V0IGFuZCBlbmQtc3RhdGUocyksIHNvIHRoZXNlIGFyZSBhbHNvCisqKiBkZWFsdCB3aXRoIGluIHRoZXNlIGZ1bmN0aW9ucy4KKyoqCisqKiBJbiBhbGwgc3RhdGVzIHdlIHNldCB0aGUgc3RhdGUgdmFyaWFibGUgYWNjb3JkaW5nIHRvIHRoZSBpbnB1dCwgYnV0IGluIHNvbWUKKyoqIGNhc2VzIHdlIHBlcmZvcm0gYWRkaXRpb25hbCBzdGVwcyBvdXRsaW5lZCBiZWxvdzsKKyoqCisqKiBWQ19TVVNQRU5EX0lETEUgLSBJbml0aWFsaXNlIHRoZSBzdXNwZW5kIGNvbXBsZXRpb24gYXQgdGhlIHNhbWUgdGltZS4KKyoqCQkJVGhlIHN1c3BlbmQgY29tcGxldGlvbiBpcyBjb21wbGV0ZWQgYWZ0ZXIgYW55IHN1c3BlbmQKKyoqCQkJYXR0ZW1wdC4gIFdoZW4gd2UgcmVzZXQgdGhlIHN0YXRlIG1hY2hpbmUgd2UgYWxzbyByZXNldAorKioJCQl0aGUgY29tcGxldGlvbi4gIFRoaXMgcmVzZXQgb2NjdXJzIHdoZW4gdmlkZW9jb3JlIGlzCisqKgkJCXJlc3VtZWQsIGFuZCBhbHNvIGlmIHdlIGluaXRpYXRlIHN1c3BlbmQgYWZ0ZXIgYSBzdXNwZW5kCisqKgkJCWZhaWx1cmUuCisqKgorKiogVkNfU1VTUEVORF9JTl9QUk9HUkVTUyAtIFRoaXMgc3RhdGUgaXMgY29uc2lkZXJlZCB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuIGZvcgorKioJCQlzdXNwZW5kIC0gaWUgZnJvbSB0aGlzIHBvaW50IG9uIHdlIG11c3QgdHJ5IHRvIHN1c3BlbmQKKyoqCQkJYmVmb3JlIHJlc3VtaW5nIGNhbiBvY2N1ci4gIFdlIHRoZXJlZm9yZSBhbHNvIHJlc2V0IHRoZQorKioJCQlyZXN1bWUgc3RhdGUgbWFjaGluZSB0byBWQ19SRVNVTUVfSURMRSBpbiB0aGlzIHN0YXRlLgorKioKKyoqIFZDX1NVU1BFTkRfU1VTUEVOREVEIC0gU3VzcGVuZCBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gQWxzbyBjYWxsCisqKgkJCWNvbXBsZXRlX2FsbCBvbiB0aGUgc3VzcGVuZCBjb21wbGV0aW9uIHRvIG5vdGlmeQorKioJCQlhbnl0aGluZyB3YWl0aW5nIGZvciBzdXNwZW5kIHRvIGhhcHBlbi4KKyoqCisqKiBWQ19TVVNQRU5EX1JFSkVDVEVEIC0gVmlkZW9jb3JlIHJlamVjdGVkIHN1c3BlbmQuIFZpZGVvY29yZSB3aWxsIGFsc28KKyoqCQkJaW5pdGlhdGUgcmVzdW1lLCBzbyBubyBuZWVkIHRvIGFsdGVyIHJlc3VtZSBzdGF0ZS4KKyoqCQkJV2UgY2FsbCBjb21wbGV0ZV9hbGwgb24gdGhlIHN1c3BlbmQgY29tcGxldGlvbiB0byBub3RpZnkKKyoqCQkJb2Ygc3VzcGVuZCByZWplY3Rpb24uCisqKgorKiogVkNfU1VTUEVORF9GQUlMRUQgLSBXZSBmYWlsZWQgdG8gaW5pdGlhdGUgdmlkZW9jb3JlIHN1c3BlbmQuICBXZSBub3RpZnkgdGhlCisqKgkJCXN1c3BlbmQgY29tcGxldGlvbiBhbmQgcmVzZXQgdGhlIHJlc3VtZSBzdGF0ZSBtYWNoaW5lLgorKioKKyoqIFZDX1JFU1VNRV9JRExFIC0gSW5pdGlhbGlzZSB0aGUgcmVzdW1lIGNvbXBsZXRpb24gYXQgdGhlIHNhbWUgdGltZS4gIFRoZQorKioJCQlyZXN1bWUgY29tcGxldGlvbiBpcyBpbiBpdCdzICdkb25lJyBzdGF0ZSB3aGVuZXZlcgorKioJCQl2aWRlY29yZSBpcyBydW5uaW5nLiAgVGhlcmZvcmUsIHRoZSBWQ19SRVNVTUVfSURMRSBzdGF0ZQorKioJCQlpbXBsaWVzIHRoYXQgdmlkZW9jb3JlIGlzIHN1c3BlbmRlZC4KKyoqCQkJSGVuY2UsIGFueSB0aHJlYWQgd2hpY2ggbmVlZHMgdG8gd2FpdCB1bnRpbCB2aWRlb2NvcmUgaXMKKyoqCQkJcnVubmluZyBjYW4gd2FpdCBvbiB0aGlzIGNvbXBsZXRpb24gLSBpdCB3aWxsIG9ubHkgYmxvY2sKKyoqCQkJaWYgdmlkZW9jb3JlIGlzIHN1c3BlbmRlZC4KKyoqCisqKiBWQ19SRVNVTUVfUkVTVU1FRCAtIFJlc3VtZSBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gIFZpZGVvY29yZSBpcyBydW5uaW5nLgorKioJCQlDYWxsIGNvbXBsZXRlX2FsbCBvbiB0aGUgcmVzdW1lIGNvbXBsZXRpb24gdG8gdW5ibG9jaworKioJCQlhbnkgdGhyZWFkcyB3YWl0aW5nIGZvciByZXN1bWUuCSBBbHNvIHJlc2V0IHRoZSBzdXNwZW5kCisqKgkJCXN0YXRlIG1hY2hpbmUgdG8gaXQncyBpZGxlIHN0YXRlLgorKioKKyoqIFZDX1JFU1VNRV9GQUlMRUQgLSBDdXJyZW50bHkgdW51c2VkIC0gbm8gbWVjaGFuaXNtIHRvIGZhaWwgcmVzdW1lIGV4aXN0cy4KKyovCisKK3ZvaWQKK3NldF9zdXNwZW5kX3N0YXRlKFZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUsCisJZW51bSB2Y19zdXNwZW5kX3N0YXR1cyBuZXdfc3RhdGUpCit7CisJLyogc2V0IHRoZSBzdGF0ZSBpbiBhbGwgY2FzZXMgKi8KKwlhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPSBuZXdfc3RhdGU7CisKKwkvKiBzdGF0ZSBzcGVjaWZpYyBhZGRpdGlvbmFsIGFjdGlvbnMgKi8KKwlzd2l0Y2ggKG5ld19zdGF0ZSkgeworCWNhc2UgVkNfU1VTUEVORF9GT1JDRV9DQU5DRUxFRDoKKwkJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPnZjX3N1c3BlbmRfY29tcGxldGUpOworCQlicmVhazsKKwljYXNlIFZDX1NVU1BFTkRfUkVKRUNURUQ6CisJCWNvbXBsZXRlX2FsbCgmYXJtX3N0YXRlLT52Y19zdXNwZW5kX2NvbXBsZXRlKTsKKwkJYnJlYWs7CisJY2FzZSBWQ19TVVNQRU5EX0ZBSUxFRDoKKwkJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPnZjX3N1c3BlbmRfY29tcGxldGUpOworCQlhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSA9IFZDX1JFU1VNRV9SRVNVTUVEOworCQljb21wbGV0ZV9hbGwoJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlKTsKKwkJYnJlYWs7CisJY2FzZSBWQ19TVVNQRU5EX0lETEU6CisJCXJlaW5pdF9jb21wbGV0aW9uKCZhcm1fc3RhdGUtPnZjX3N1c3BlbmRfY29tcGxldGUpOworCQlicmVhazsKKwljYXNlIFZDX1NVU1BFTkRfUkVRVUVTVEVEOgorCQlicmVhazsKKwljYXNlIFZDX1NVU1BFTkRfSU5fUFJPR1JFU1M6CisJCXNldF9yZXN1bWVfc3RhdGUoYXJtX3N0YXRlLCBWQ19SRVNVTUVfSURMRSk7CisJCWJyZWFrOworCWNhc2UgVkNfU1VTUEVORF9TVVNQRU5ERUQ6CisJCWNvbXBsZXRlX2FsbCgmYXJtX3N0YXRlLT52Y19zdXNwZW5kX2NvbXBsZXRlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KK30KKwordm9pZAorc2V0X3Jlc3VtZV9zdGF0ZShWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlLAorCWVudW0gdmNfcmVzdW1lX3N0YXR1cyBuZXdfc3RhdGUpCit7CisJLyogc2V0IHRoZSBzdGF0ZSBpbiBhbGwgY2FzZXMgKi8KKwlhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSA9IG5ld19zdGF0ZTsKKworCS8qIHN0YXRlIHNwZWNpZmljIGFkZGl0aW9uYWwgYWN0aW9ucyAqLworCXN3aXRjaCAobmV3X3N0YXRlKSB7CisJY2FzZSBWQ19SRVNVTUVfRkFJTEVEOgorCQlicmVhazsKKwljYXNlIFZDX1JFU1VNRV9JRExFOgorCQlyZWluaXRfY29tcGxldGlvbigmYXJtX3N0YXRlLT52Y19yZXN1bWVfY29tcGxldGUpOworCQlicmVhazsKKwljYXNlIFZDX1JFU1VNRV9SRVFVRVNURUQ6CisJCWJyZWFrOworCWNhc2UgVkNfUkVTVU1FX0lOX1BST0dSRVNTOgorCQlicmVhazsKKwljYXNlIFZDX1JFU1VNRV9SRVNVTUVEOgorCQljb21wbGV0ZV9hbGwoJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlKTsKKwkJc2V0X3N1c3BlbmRfc3RhdGUoYXJtX3N0YXRlLCBWQ19TVVNQRU5EX0lETEUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorfQorCisKKy8qIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgd3JpdGUgbG9jayBoZWxkICovCitpbmxpbmUgdm9pZAorc3RhcnRfc3VzcGVuZF90aW1lcihWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlKQoreworCWRlbF90aW1lcigmYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyKTsKKwlhcm1fc3RhdGUtPnN1c3BlbmRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQltc2Vjc190b19qaWZmaWVzKGFybV9zdGF0ZS0+CisJCQlzdXNwZW5kX3RpbWVyX3RpbWVvdXQpOworCWFkZF90aW1lcigmYXJtX3N0YXRlLT5zdXNwZW5kX3RpbWVyKTsKKwlhcm1fc3RhdGUtPnN1c3BlbmRfdGltZXJfcnVubmluZyA9IDE7Cit9CisKKy8qIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgd3JpdGUgbG9jayBoZWxkICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3N0b3Bfc3VzcGVuZF90aW1lcihWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlKQoreworCWlmIChhcm1fc3RhdGUtPnN1c3BlbmRfdGltZXJfcnVubmluZykgeworCQlkZWxfdGltZXIoJmFybV9zdGF0ZS0+c3VzcGVuZF90aW1lcik7CisJCWFybV9zdGF0ZS0+c3VzcGVuZF90aW1lcl9ydW5uaW5nID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZWVkX3Jlc3VtZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJcmV0dXJuIChhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPiBWQ19TVVNQRU5EX0lETEUpICYmCisJCQkoYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgPCBWQ19SRVNVTUVfUkVRVUVTVEVEKSAmJgorCQkJdmNoaXFfdmlkZW9jb3JlX3dhbnRlZChzdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2Jsb2NrX3Jlc3VtZShWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlKQoreworCWludCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgdGltZW91dF92YWwgPQorCQkJCW1zZWNzX3RvX2ppZmZpZXMoRk9SQ0VfU1VTUEVORF9USU1FT1VUX01TKTsKKwlpbnQgcmVzdW1lX2NvdW50ID0gMDsKKworCS8qIEFsbG93IGFueSB0aHJlYWRzIHdoaWNoIHdlcmUgYmxvY2tlZCBieSB0aGUgbGFzdCBmb3JjZSBzdXNwZW5kIHRvCisJICogY29tcGxldGUgaWYgdGhleSBoYXZlbid0IGFscmVhZHkuICBPbmx5IGdpdmUgdGhpcyBvbmUgc2hvdDsgaWYKKwkgKiBibG9ja2VkX2NvdW50IGlzIGluY3JlbWVudGVkIGFmdGVyIGJsb2NrZWRfYmxvY2tlciBpcyBjb21wbGV0ZWQKKwkgKiAod2hpY2ggb25seSBoYXBwZW5zIHdoZW4gYmxvY2tlZF9jb3VudCBoaXRzIDApIHRoZW4gdGhvc2UgdGhyZWFkcworCSAqIHdpbGwgaGF2ZSB0byB3YWl0IHVudGlsIG5leHQgdGltZSBhcm91bmQgKi8KKwlpZiAoYXJtX3N0YXRlLT5ibG9ja2VkX2NvdW50KSB7CisJCXJlaW5pdF9jb21wbGV0aW9uKCZhcm1fc3RhdGUtPmJsb2NrZWRfYmxvY2tlcik7CisJCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyB3YWl0IGZvciBwcmV2aW91c2x5ICIKKwkJCSJibG9ja2VkIGNsaWVudHMiLCBfX2Z1bmNfXyk7CisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCQkmYXJtX3N0YXRlLT5ibG9ja2VkX2Jsb2NrZXIsIHRpbWVvdXRfdmFsKQorCQkJCQk8PSAwKSB7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyB3YWl0IGZvciAiCisJCQkJInByZXZpb3VzbHkgYmxvY2tlZCBjbGllbnRzIGZhaWxlZCIgLCBfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwkJCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIHByZXZpb3VzbHkgYmxvY2tlZCAiCisJCQkiY2xpZW50cyByZXN1bWVkIiwgX19mdW5jX18pOworCQl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCX0KKworCS8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgcmVzdW1lIHRvIGNvbXBsZXRlIGlmIGl0J3MgaW4gcHJvY2VzcyAqLworCXdoaWxlIChhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSAhPSBWQ19SRVNVTUVfUkVTVU1FRCAmJgorCQkJYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgPiBWQ19SRVNVTUVfSURMRSkgeworCQlpZiAocmVzdW1lX2NvdW50ID4gMSkgeworCQkJc3RhdHVzID0gVkNISVFfRVJST1I7CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyB3YWl0ZWQgdG9vICIKKwkJCQkibWFueSB0aW1lcyBmb3IgcmVzdW1lIiAsIF9fZnVuY19fKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyB3YWl0IGZvciByZXN1bWUiLAorCQkJX19mdW5jX18pOworCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCQkJJmFybV9zdGF0ZS0+dmNfcmVzdW1lX2NvbXBsZXRlLCB0aW1lb3V0X3ZhbCkKKwkJCQkJPD0gMCkgeworCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgd2FpdCBmb3IgIgorCQkJCSJyZXN1bWUgZmFpbGVkICglcykiLCBfX2Z1bmNfXywKKwkJCQlyZXN1bWVfc3RhdGVfbmFtZXNbYXJtX3N0YXRlLT52Y19yZXN1bWVfc3RhdGUgKworCQkJCQkJCVZDX1JFU1VNRV9OVU1fT0ZGU0VUXSk7CisJCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwkJCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIHJlc3VtZWQiLCBfX2Z1bmNfXyk7CisJCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCXJlc3VtZV9jb3VudCsrOworCX0KKwlyZWluaXRfY29tcGxldGlvbigmYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlcik7CisJYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlZCA9IDE7CisKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3VuYmxvY2tfcmVzdW1lKFZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUpCit7CisJY29tcGxldGVfYWxsKCZhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VyKTsKKwlhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VkID0gMDsKK30KKworLyogSW5pdGlhdGUgc3VzcGVuZCB2aWEgc2xvdCBoYW5kbGVyLiBTaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHdyaXRlIGxvY2sKKyAqIGhlbGQgKi8KK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9hcm1fdmNzdXNwZW5kKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX0VSUk9SOworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKworCWlmICghYXJtX3N0YXRlKQorCQlnb3RvIG91dDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKKworCXN3aXRjaCAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlKSB7CisJY2FzZSBWQ19TVVNQRU5EX1JFUVVFU1RFRDoKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlczogc3VzcGVuZCBhbHJlYWR5ICIKKwkJCSJyZXF1ZXN0ZWQiLCBfX2Z1bmNfXyk7CisJCWJyZWFrOworCWNhc2UgVkNfU1VTUEVORF9JTl9QUk9HUkVTUzoKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlczogc3VzcGVuZCBhbHJlYWR5IGluICIKKwkJCSJwcm9ncmVzcyIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBXZSBkb24ndCBleHBlY3QgdG8gYmUgaW4gb3RoZXIgc3RhdGVzLCBzbyBsb2cgYnV0IGNvbnRpbnVlCisJCSAqIGFueXdheSAqLworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXMgdW5leHBlY3RlZCBzdXNwZW5kIHN0YXRlICVzIiwgX19mdW5jX18sCisJCQlzdXNwZW5kX3N0YXRlX25hbWVzW2FybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSArCisJCQkJCQlWQ19TVVNQRU5EX05VTV9PRkZTRVRdKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBWQ19TVVNQRU5EX1JFSkVDVEVEOgorCWNhc2UgVkNfU1VTUEVORF9GQUlMRUQ6CisJCS8qIEVuc3VyZSBhbnkgaWRsZSBzdGF0ZSBhY3Rpb25zIGhhdmUgYmVlbiBydW4gKi8KKwkJc2V0X3N1c3BlbmRfc3RhdGUoYXJtX3N0YXRlLCBWQ19TVVNQRU5EX0lETEUpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFZDX1NVU1BFTkRfSURMRToKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXM6IHN1c3BlbmRpbmciLCBfX2Z1bmNfXyk7CisJCXNldF9zdXNwZW5kX3N0YXRlKGFybV9zdGF0ZSwgVkNfU1VTUEVORF9SRVFVRVNURUQpOworCQkvKiBraWNrIHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkIHRvIGluaXRpYXRlIHN1c3BlbmQgKi8KKwkJcmVxdWVzdF9wb2xsKHN0YXRlLCBOVUxMLCAwKTsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgZXhpdCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQKK3ZjaGlxX3BsYXRmb3JtX2NoZWNrX3N1c3BlbmQoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCWludCBzdXNwID0gMDsKKworCWlmICghYXJtX3N0YXRlKQorCQlnb3RvIG91dDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCisJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwlpZiAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlID09IFZDX1NVU1BFTkRfUkVRVUVTVEVEICYmCisJCQlhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSA9PSBWQ19SRVNVTUVfUkVTVU1FRCkgeworCQlzZXRfc3VzcGVuZF9zdGF0ZShhcm1fc3RhdGUsIFZDX1NVU1BFTkRfSU5fUFJPR1JFU1MpOworCQlzdXNwID0gMTsKKwl9CisJd3JpdGVfdW5sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCisJaWYgKHN1c3ApCisJCXZjaGlxX3BsYXRmb3JtX3N1c3BlbmQoc3RhdGUpOworCitvdXQ6CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgZXhpdCIsIF9fZnVuY19fKTsKKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK291dHB1dF90aW1lb3V0X2Vycm9yKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwljaGFyIHNlcnZpY2VfZXJyWzUwXSA9ICIiOworCWludCB2Y191c2VfY291bnQgPSBhcm1fc3RhdGUtPnZpZGVvY29yZV91c2VfY291bnQ7CisJaW50IGFjdGl2ZV9zZXJ2aWNlcyA9IHN0YXRlLT51bnVzZWRfc2VydmljZTsKKwlpbnQgaTsKKworCWlmICghYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50KSB7CisJCXNucHJpbnRmKHNlcnZpY2VfZXJyLCA1MCwgIiBWaWRlb2NvcmUgdXNlY291bnQgaXMgMCIpOworCQlnb3RvIG91dHB1dF9tc2c7CisJfQorCWZvciAoaSA9IDA7IGkgPCBhY3RpdmVfc2VydmljZXM7IGkrKykgeworCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2VfcHRyID0gc3RhdGUtPnNlcnZpY2VzW2ldOworCQlpZiAoc2VydmljZV9wdHIgJiYgc2VydmljZV9wdHItPnNlcnZpY2VfdXNlX2NvdW50ICYmCisJCQkoc2VydmljZV9wdHItPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpKSB7CisJCQlzbnByaW50ZihzZXJ2aWNlX2VyciwgNTAsICIgJWMlYyVjJWMoJWQpIHNlcnZpY2UgaGFzICIKKwkJCQkidXNlIGNvdW50ICVkJXMiLCBWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKAorCQkJCQlzZXJ2aWNlX3B0ci0+YmFzZS5mb3VyY2MpLAorCQkJCSBzZXJ2aWNlX3B0ci0+Y2xpZW50X2lkLAorCQkJCSBzZXJ2aWNlX3B0ci0+c2VydmljZV91c2VfY291bnQsCisJCQkJIHNlcnZpY2VfcHRyLT5zZXJ2aWNlX3VzZV9jb3VudCA9PQorCQkJCQkgdmNfdXNlX2NvdW50ID8gIiIgOiAiICgrIG1vcmUpIik7CisJCQlicmVhazsKKwkJfQorCX0KKworb3V0cHV0X21zZzoKKwl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCSJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgdmMgc3VzcGVuZCAoJWQpLiVzIiwKKwkJIGFybV9zdGF0ZS0+YXV0b3N1c3BlbmRfb3ZlcnJpZGUsIHNlcnZpY2VfZXJyKTsKKworfQorCisvKiBUcnkgdG8gZ2V0IHZpZGVvY29yZSBpbnRvIHN1c3BlbmRlZCBzdGF0ZSwgcmVnYXJkbGVzcyBvZiBhdXRvc3VzcGVuZCBzdGF0ZS4KKyoqIFdlIGRvbid0IGFjdHVhbGx5IGZvcmNlIHN1c3BlbmQsIHNpbmNlIHZpZGVvY29yZSBtYXkgZ2V0IGludG8gYSBiYWQgc3RhdGUKKyoqIGlmIHdlIGZvcmNlIHN1c3BlbmQgYXQgYSBiYWQgdGltZS4gIEluc3RlYWQsIHdlIHdhaXQgZm9yIGF1dG9zdXNwZW5kIHRvCisqKiBkZXRlcm1pbmUgYSBnb29kIHBvaW50IHRvIHN1c3BlbmQuICBJZiB0aGlzIGRvZXNuJ3QgaGFwcGVuIHdpdGhpbiAxMDBtcyB3ZQorKiogcmVwb3J0IGZhaWx1cmUuCisqKgorKiogUmV0dXJucyBWQ0hJUV9TVUNDRVNTIGlmIHZpZGVvY29yZSBzdXNwZW5kZWQgc3VjY2Vzc2Z1bGx5LCBWQ0hJUV9SRVRSWSBpZgorKiogdmlkZW9jb3JlIGZhaWxlZCB0byBzdXNwZW5kIGluIHRpbWUgb3IgVkNISVFfRVJST1IgaWYgaW50ZXJydXB0ZWQuCisqLworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2FybV9mb3JjZV9zdXNwZW5kKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwlsb25nIHJjID0gMDsKKwlpbnQgcmVwZWF0ID0gLTE7CisKKwlpZiAoIWFybV9zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKworCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKKwlzdGF0dXMgPSBibG9ja19yZXN1bWUoYXJtX3N0YXRlKTsKKwlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpCisJCWdvdG8gdW5sb2NrOworCWlmIChhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPT0gVkNfU1VTUEVORF9TVVNQRU5ERUQpIHsKKwkJLyogQWxyZWFkeSBzdXNwZW5kZWQgLSBqdXN0IGJsb2NrIHJlc3VtZSBhbmQgZXhpdCAqLworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGFscmVhZHkgc3VzcGVuZGVkIiwKKwkJCV9fZnVuY19fKTsKKwkJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwkJZ290byB1bmxvY2s7CisJfSBlbHNlIGlmIChhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPD0gVkNfU1VTUEVORF9JRExFKSB7CisJCS8qIGluaXRpYXRlIHN1c3BlbmQgaW1tZWRpYXRlbHkgaW4gdGhlIGNhc2UgdGhhdCB3ZSdyZSB3YWl0aW5nCisJCSAqIGZvciB0aGUgdGltZW91dCAqLworCQlzdG9wX3N1c3BlbmRfdGltZXIoYXJtX3N0YXRlKTsKKwkJaWYgKCF2Y2hpcV92aWRlb2NvcmVfd2FudGVkKHN0YXRlKSkgeworCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyB2aWRlb2NvcmUgIgorCQkJCSJpZGxlLCBpbml0aWF0aW5nIHN1c3BlbmQiLCBfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSB2Y2hpcV9hcm1fdmNzdXNwZW5kKHN0YXRlKTsKKwkJfSBlbHNlIGlmIChhcm1fc3RhdGUtPmF1dG9zdXNwZW5kX292ZXJyaWRlIDwKKwkJCQkJCUZPUkNFX1NVU1BFTkRfRkFJTF9NQVgpIHsKKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgbGV0dGluZyAiCisJCQkJInZpZGVvY29yZSBnbyBpZGxlIiwgX19mdW5jX18pOworCQkJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgZmFpbGVkIHRvbyAiCisJCQkJIm1hbnkgdGltZXMgLSBhdHRlbXB0aW5nIHN1c3BlbmQiLCBfX2Z1bmNfXyk7CisJCQlzdGF0dXMgPSB2Y2hpcV9hcm1fdmNzdXNwZW5kKHN0YXRlKTsKKwkJfQorCX0gZWxzZSB7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgdmlkZW9jb3JlIHN1c3BlbmQgIgorCQkJImluIHByb2dyZXNzIC0gd2FpdCBmb3IgY29tcGxldGlvbiIsIF9fZnVuY19fKTsKKwkJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwl9CisKKwkvKiBXYWl0IGZvciBzdXNwZW5kIHRvIGhhcHBlbiBkdWUgdG8gc3lzdGVtIGlkbGUgKG5vdCBmb3JjZWQuLikgKi8KKwlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpCisJCWdvdG8gdW5ibG9ja19yZXN1bWU7CisKKwlkbyB7CisJCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworCQlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJCSZhcm1fc3RhdGUtPnZjX3N1c3BlbmRfY29tcGxldGUsCisJCQkJbXNlY3NfdG9famlmZmllcyhGT1JDRV9TVVNQRU5EX1RJTUVPVVRfTVMpKTsKKworCQl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCQlpZiAocmMgPCAwKSB7CisJCQl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzICIKKwkJCQkiaW50ZXJydXB0ZWQgd2FpdGluZyBmb3Igc3VzcGVuZCIsIF9fZnVuY19fKTsKKwkJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCQkJZ290byB1bmJsb2NrX3Jlc3VtZTsKKwkJfSBlbHNlIGlmIChyYyA9PSAwKSB7CisJCQlpZiAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlID4gVkNfU1VTUEVORF9JRExFKSB7CisJCQkJLyogUmVwZWF0IHRpbWVvdXQgb25jZSBpZiBpbiBwcm9ncmVzcyAqLworCQkJCWlmIChyZXBlYXQgPCAwKSB7CisJCQkJCXJlcGVhdCA9IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCWFybV9zdGF0ZS0+YXV0b3N1c3BlbmRfb3ZlcnJpZGUrKzsKKwkJCW91dHB1dF90aW1lb3V0X2Vycm9yKHN0YXRlKTsKKworCQkJc3RhdHVzID0gVkNISVFfUkVUUlk7CisJCQlnb3RvIHVuYmxvY2tfcmVzdW1lOworCQl9CisJfSB3aGlsZSAoMCA8IChyZXBlYXQtLSkpOworCisJLyogQ2hlY2sgYW5kIHJlcG9ydCBzdGF0ZSBpbiBjYXNlIHdlIG5lZWQgdG8gYWJvcnQgQVJNIHN1c3BlbmQgKi8KKwlpZiAoYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlICE9IFZDX1NVU1BFTkRfU1VTUEVOREVEKSB7CisJCXN0YXR1cyA9IFZDSElRX1JFVFJZOworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXMgdmlkZW9jb3JlIHN1c3BlbmQgZmFpbGVkIChzdGF0ZSAlcykiLCBfX2Z1bmNfXywKKwkJCXN1c3BlbmRfc3RhdGVfbmFtZXNbYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlICsKKwkJCQkJCVZDX1NVU1BFTkRfTlVNX09GRlNFVF0pOworCQkvKiBSZXNldCB0aGUgc3RhdGUgb25seSBpZiBpdCdzIHN0aWxsIGluIGFuIGVycm9yIHN0YXRlLgorCQkgKiBTb21ldGhpbmcgY291bGQgaGF2ZSBhbHJlYWR5IGluaXRpYXRlZCBhbm90aGVyIHN1c3BlbmQuICovCisJCWlmIChhcm1fc3RhdGUtPnZjX3N1c3BlbmRfc3RhdGUgPCBWQ19TVVNQRU5EX0lETEUpCisJCQlzZXRfc3VzcGVuZF9zdGF0ZShhcm1fc3RhdGUsIFZDX1NVU1BFTkRfSURMRSk7CisKKwkJZ290byB1bmJsb2NrX3Jlc3VtZTsKKwl9CisKKwkvKiBzdWNjZXNzZnVsbHkgc3VzcGVuZGVkIC0gdW5sb2NrIGFuZCBleGl0ICovCisJZ290byB1bmxvY2s7CisKK3VuYmxvY2tfcmVzdW1lOgorCS8qIGFsbCBlcnJvciBzdGF0ZXMgbmVlZCB0byB1bmJsb2NrIHJlc3VtZSBiZWZvcmUgZXhpdCAqLworCXVuYmxvY2tfcmVzdW1lKGFybV9zdGF0ZSk7CisKK3VubG9jazoKKwl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKK291dDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBleGl0ICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZAordmNoaXFfY2hlY2tfc3VzcGVuZChWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisKKwlpZiAoIWFybV9zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKworCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJaWYgKGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSAhPSBWQ19TVVNQRU5EX1NVU1BFTkRFRCAmJgorCQkJYXJtX3N0YXRlLT5maXJzdF9jb25uZWN0ICYmCisJCQkhdmNoaXFfdmlkZW9jb3JlX3dhbnRlZChzdGF0ZSkpIHsKKwkJdmNoaXFfYXJtX3Zjc3VzcGVuZChzdGF0ZSk7CisJfQorCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworb3V0OgorCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGV4aXQiLCBfX2Z1bmNfXyk7CisJcmV0dXJuOworfQorCisKK2ludAordmNoaXFfYXJtX2FsbG93X3Jlc3VtZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJaW50IHJlc3VtZSA9IDA7CisJaW50IHJldCA9IC0xOworCisJaWYgKCFhcm1fc3RhdGUpCisJCWdvdG8gb3V0OworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisKKwl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCXVuYmxvY2tfcmVzdW1lKGFybV9zdGF0ZSk7CisJcmVzdW1lID0gdmNoaXFfY2hlY2tfcmVzdW1lKHN0YXRlKTsKKwl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKKwlpZiAocmVzdW1lKSB7CisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoCisJCQkmYXJtX3N0YXRlLT52Y19yZXN1bWVfY29tcGxldGUpIDwgMCkgeworCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJCSIlcyBpbnRlcnJ1cHRlZCIsIF9fZnVuY19fKTsKKwkJCS8qIGZhaWxlZCwgY2Fubm90IGFjY3VyYXRlbHkgZGVyaXZlIHN1c3BlbmQKKwkJCSAqIHN0YXRlLCBzbyBleGl0IGVhcmx5LiAqLworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlyZWFkX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJaWYgKGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSA9PSBWQ19TVVNQRU5EX1NVU1BFTkRFRCkgeworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkiJXM6IFZpZGVvY29yZSByZW1haW5zIHN1c3BlbmRlZCIsIF9fZnVuY19fKTsKKwl9IGVsc2UgeworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkiJXM6IFZpZGVvY29yZSByZXN1bWVkIiwgX19mdW5jX18pOworCQlyZXQgPSAwOworCX0KKwlyZWFkX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKK291dDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBleGl0ICVkIiwgX19mdW5jX18sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHdyaXRlIGxvY2sgaGVsZCAqLworaW50Cit2Y2hpcV9jaGVja19yZXN1bWUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCWludCByZXN1bWUgPSAwOworCisJaWYgKCFhcm1fc3RhdGUpCisJCWdvdG8gb3V0OworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlpZiAobmVlZF9yZXN1bWUoc3RhdGUpKSB7CisJCXNldF9yZXN1bWVfc3RhdGUoYXJtX3N0YXRlLCBWQ19SRVNVTUVfUkVRVUVTVEVEKTsKKwkJcmVxdWVzdF9wb2xsKHN0YXRlLCBOVUxMLCAwKTsKKwkJcmVzdW1lID0gMTsKKwl9CisKK291dDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBleGl0IiwgX19mdW5jX18pOworCXJldHVybiByZXN1bWU7Cit9CisKK3ZvaWQKK3ZjaGlxX3BsYXRmb3JtX2NoZWNrX3Jlc3VtZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJaW50IHJlcyA9IDA7CisKKwlpZiAoIWFybV9zdGF0ZSkKKwkJZ290byBvdXQ7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKworCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJaWYgKGFybV9zdGF0ZS0+d2FrZV9hZGRyZXNzID09IDApIHsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJCSIlczogYWxyZWFkeSBhd2FrZSIsIF9fZnVuY19fKTsKKwkJZ290byB1bmxvY2s7CisJfQorCWlmIChhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSA9PSBWQ19SRVNVTUVfSU5fUFJPR1JFU1MpIHsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkJCSIlczogYWxyZWFkeSByZXN1bWluZyIsIF9fZnVuY19fKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKGFybV9zdGF0ZS0+dmNfcmVzdW1lX3N0YXRlID09IFZDX1JFU1VNRV9SRVFVRVNURUQpIHsKKwkJc2V0X3Jlc3VtZV9zdGF0ZShhcm1fc3RhdGUsIFZDX1JFU1VNRV9JTl9QUk9HUkVTUyk7CisJCXJlcyA9IDE7CisJfSBlbHNlCisJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkiJXM6IG5vdCByZXN1bWluZyAocmVzdW1lIHN0YXRlICVzKSIsIF9fZnVuY19fLAorCQkJCXJlc3VtZV9zdGF0ZV9uYW1lc1thcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZSArCisJCQkJCQkJVkNfUkVTVU1FX05VTV9PRkZTRVRdKTsKKwordW5sb2NrOgorCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworCWlmIChyZXMpCisJCXZjaGlxX3BsYXRmb3JtX3Jlc3VtZShzdGF0ZSk7CisKK291dDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBleGl0IiwgX19mdW5jX18pOworCXJldHVybjsKKworfQorCisKKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3VzZV9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLAorCQllbnVtIFVTRV9UWVBFX0UgdXNlX3R5cGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCVZDSElRX1NUQVRVU19UIHJldCA9IFZDSElRX1NVQ0NFU1M7CisJY2hhciBlbnRpdHlbMTZdOworCWludCAqZW50aXR5X3VjOworCWludCBsb2NhbF91YywgbG9jYWxfZW50aXR5X3VjOworCisJaWYgKCFhcm1fc3RhdGUpCisJCWdvdG8gb3V0OworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlpZiAodXNlX3R5cGUgPT0gVVNFX1RZUEVfVkNISVEpIHsKKwkJc3ByaW50ZihlbnRpdHksICJWQ0hJUTogICAiKTsKKwkJZW50aXR5X3VjID0gJmFybV9zdGF0ZS0+cGVlcl91c2VfY291bnQ7CisJfSBlbHNlIGlmIChzZXJ2aWNlKSB7CisJCXNwcmludGYoZW50aXR5LCAiJWMlYyVjJWM6JTAzZCIsCisJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKHNlcnZpY2UtPmJhc2UuZm91cmNjKSwKKwkJCXNlcnZpY2UtPmNsaWVudF9pZCk7CisJCWVudGl0eV91YyA9ICZzZXJ2aWNlLT5zZXJ2aWNlX3VzZV9jb3VudDsKKwl9IGVsc2UgeworCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyBudWxsIHNlcnZpY2UgIgorCQkJCSJwdHIiLCBfX2Z1bmNfXyk7CisJCXJldCA9IFZDSElRX0VSUk9SOworCQlnb3RvIG91dDsKKwl9CisKKwl3cml0ZV9sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCXdoaWxlIChhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VkKSB7CisJCS8qIElmIHdlIGNhbGwgJ3VzZScgd2hpbGUgZm9yY2Ugc3VzcGVuZCBpcyB3YWl0aW5nIGZvciBzdXNwZW5kLAorCQkgKiB0aGVuIHdlJ3JlIGFib3V0IHRvIGJsb2NrIHRoZSB0aHJlYWQgd2hpY2ggdGhlIGZvcmNlIGlzCisJCSAqIHdhaXRpbmcgdG8gY29tcGxldGUsIHNvIHdlJ3JlIGJvdW5kIHRvIGp1c3QgdGltZSBvdXQuIEluIHRoaXMKKwkJICogY2FzZSwgc2V0IHRoZSBzdXNwZW5kIHN0YXRlIHN1Y2ggdGhhdCB0aGUgd2FpdCB3aWxsIGJlCisJCSAqIGNhbmNlbGVkLCBzbyB3ZSBjYW4gY29tcGxldGUgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gKi8KKwkJaWYgKGFybV9zdGF0ZS0+cmVzdW1lX2Jsb2NrZWQgJiYgYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlID09CisJCQkJVkNfU1VTUEVORF9JRExFKSB7CisJCQlzZXRfc3VzcGVuZF9zdGF0ZShhcm1fc3RhdGUsIFZDX1NVU1BFTkRfRk9SQ0VfQ0FOQ0VMRUQpOworCQkJYnJlYWs7CisJCX0KKwkJLyogSWYgc3VzcGVuZCBpcyBhbHJlYWR5IGluIHByb2dyZXNzIHRoZW4gd2UgbmVlZCB0byBibG9jayAqLworCQlpZiAoIXRyeV93YWl0X2Zvcl9jb21wbGV0aW9uKCZhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VyKSkgeworCQkJLyogSW5kaWNhdGUgdGhhdCB0aGVyZSBhcmUgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZSByZXN1bWUKKwkJCSAqIGJsb2NrZXIuICBUaGVzZSBuZWVkIHRvIGJlIGFsbG93ZWQgdG8gY29tcGxldGUgYmVmb3JlCisJCQkgKiBhIF9zZWNvbmRfIGNhbGwgdG8gZm9yY2Ugc3VzcGVuZCBjYW4gY29tcGxldGUsCisJCQkgKiBvdGhlcndpc2UgbG93IHByaW9yaXR5IHRocmVhZHMgbWlnaHQgbmV2ZXIgYWN0dWFsbHkKKwkJCSAqIGNvbnRpbnVlICovCisJCQlhcm1fc3RhdGUtPmJsb2NrZWRfY291bnQrKzsKKwkJCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgJXMgcmVzdW1lICIKKwkJCQkiYmxvY2tlZCAtIHdhaXRpbmcuLi4iLCBfX2Z1bmNfXywgZW50aXR5KTsKKwkJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2tpbGxhYmxlKAorCQkJCQkmYXJtX3N0YXRlLT5yZXN1bWVfYmxvY2tlcikgIT0gMCkgeworCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzICVzICIKKwkJCQkJIndhaXQgZm9yIHJlc3VtZSBibG9ja2VyIGludGVycnVwdGVkIiwKKwkJCQkJX19mdW5jX18sIGVudGl0eSk7CisJCQkJcmV0ID0gVkNISVFfRVJST1I7CisJCQkJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJCQlhcm1fc3RhdGUtPmJsb2NrZWRfY291bnQtLTsKKwkJCQl3cml0ZV91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzICVzIHJlc3VtZSAiCisJCQkJInVuYmxvY2tlZCIsIF9fZnVuY19fLCBlbnRpdHkpOworCQkJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJCWlmICgtLWFybV9zdGF0ZS0+YmxvY2tlZF9jb3VudCA9PSAwKQorCQkJCWNvbXBsZXRlX2FsbCgmYXJtX3N0YXRlLT5ibG9ja2VkX2Jsb2NrZXIpOworCQl9CisJfQorCisJc3RvcF9zdXNwZW5kX3RpbWVyKGFybV9zdGF0ZSk7CisKKwlsb2NhbF91YyA9ICsrYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50OworCWxvY2FsX2VudGl0eV91YyA9ICsrKCplbnRpdHlfdWMpOworCisJLyogSWYgdGhlcmUncyBhIHBlbmRpbmcgcmVxdWVzdCB3aGljaCBoYXNuJ3QgeWV0IGJlZW4gc2VydmljZWQgdGhlbgorCSAqIGp1c3QgY2xlYXIgaXQuICBJZiB3ZSdyZSBwYXN0IFZDX1NVU1BFTkRfUkVRVUVTVEVEIHN0YXRlIHRoZW4KKwkgKiB2Y19yZXN1bWVfY29tcGxldGUgd2lsbCBibG9jayB1bnRpbCB3ZSBlaXRoZXIgcmVzdW1lIG9yIGZhaWwgdG8KKwkgKiBzdXNwZW5kICovCisJaWYgKGFybV9zdGF0ZS0+dmNfc3VzcGVuZF9zdGF0ZSA8PSBWQ19TVVNQRU5EX1JFUVVFU1RFRCkKKwkJc2V0X3N1c3BlbmRfc3RhdGUoYXJtX3N0YXRlLCBWQ19TVVNQRU5EX0lETEUpOworCisJaWYgKCh1c2VfdHlwZSAhPSBVU0VfVFlQRV9TRVJWSUNFX05PX1JFU1VNRSkgJiYgbmVlZF9yZXN1bWUoc3RhdGUpKSB7CisJCXNldF9yZXN1bWVfc3RhdGUoYXJtX3N0YXRlLCBWQ19SRVNVTUVfUkVRVUVTVEVEKTsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXMgJXMgY291bnQgJWQsIHN0YXRlIGNvdW50ICVkIiwKKwkJCV9fZnVuY19fLCBlbnRpdHksIGxvY2FsX2VudGl0eV91YywgbG9jYWxfdWMpOworCQlyZXF1ZXN0X3BvbGwoc3RhdGUsIE5VTEwsIDApOworCX0gZWxzZQorCQl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCQkiJXMgJXMgY291bnQgJWQsIHN0YXRlIGNvdW50ICVkIiwKKwkJCV9fZnVuY19fLCBlbnRpdHksICplbnRpdHlfdWMsIGxvY2FsX3VjKTsKKworCisJd3JpdGVfdW5sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCisJLyogQ29tcGxldGlvbiBpcyBpbiBhIGRvbmUgc3RhdGUgd2hlbiB3ZSdyZSBub3Qgc3VzcGVuZGVkLCBzbyB0aGlzIHdvbid0CisJICogYmxvY2sgZm9yIHRoZSBub24tc3VzcGVuZGVkIGNhc2UuICovCisJaWYgKCF0cnlfd2FpdF9mb3JfY29tcGxldGlvbigmYXJtX3N0YXRlLT52Y19yZXN1bWVfY29tcGxldGUpKSB7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgJXMgd2FpdCBmb3IgcmVzdW1lIiwKKwkJCV9fZnVuY19fLCBlbnRpdHkpOworCQlpZiAod2FpdF9mb3JfY29tcGxldGlvbl9raWxsYWJsZSgKKwkJCQkmYXJtX3N0YXRlLT52Y19yZXN1bWVfY29tcGxldGUpICE9IDApIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzICVzIHdhaXQgZm9yICIKKwkJCQkicmVzdW1lIGludGVycnVwdGVkIiwgX19mdW5jX18sIGVudGl0eSk7CisJCQlyZXQgPSBWQ0hJUV9FUlJPUjsKKwkJCWdvdG8gb3V0OworCQl9CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMgJXMgcmVzdW1lZCIsIF9fZnVuY19fLAorCQkJZW50aXR5KTsKKwl9CisKKwlpZiAocmV0ID09IFZDSElRX1NVQ0NFU1MpIHsKKwkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwkJbG9uZyBhY2tfY250ID0gYXRvbWljX3hjaGcoJmFybV9zdGF0ZS0+a2FfdXNlX2Fja19jb3VudCwgMCk7CisJCXdoaWxlIChhY2tfY250ICYmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykpIHsKKwkJCS8qIFNlbmQgdGhlIHVzZSBub3RpZnkgdG8gdmlkZW9jb3JlICovCisJCQlzdGF0dXMgPSB2Y2hpcV9zZW5kX3JlbW90ZV91c2VfYWN0aXZlKHN0YXRlKTsKKwkJCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykKKwkJCQlhY2tfY250LS07CisJCQllbHNlCisJCQkJYXRvbWljX2FkZChhY2tfY250LAorCQkJCQkmYXJtX3N0YXRlLT5rYV91c2VfYWNrX2NvdW50KTsKKwkJfQorCX0KKworb3V0OgorCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGV4aXQgJWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcmVsZWFzZV9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwlWQ0hJUV9TVEFUVVNfVCByZXQgPSBWQ0hJUV9TVUNDRVNTOworCWNoYXIgZW50aXR5WzE2XTsKKwlpbnQgKmVudGl0eV91YzsKKwlpbnQgbG9jYWxfdWMsIGxvY2FsX2VudGl0eV91YzsKKworCWlmICghYXJtX3N0YXRlKQorCQlnb3RvIG91dDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCisJaWYgKHNlcnZpY2UpIHsKKwkJc3ByaW50ZihlbnRpdHksICIlYyVjJWMlYzolMDNkIiwKKwkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJc2VydmljZS0+Y2xpZW50X2lkKTsKKwkJZW50aXR5X3VjID0gJnNlcnZpY2UtPnNlcnZpY2VfdXNlX2NvdW50OworCX0gZWxzZSB7CisJCXNwcmludGYoZW50aXR5LCAiUEVFUjogICAiKTsKKwkJZW50aXR5X3VjID0gJmFybV9zdGF0ZS0+cGVlcl91c2VfY291bnQ7CisJfQorCisJd3JpdGVfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwlpZiAoIWFybV9zdGF0ZS0+dmlkZW9jb3JlX3VzZV9jb3VudCB8fCAhKCplbnRpdHlfdWMpKSB7CisJCS8qIERvbid0IHVzZSBCVUdfT04gLSBkb24ndCBhbGxvdyB1c2VyIHRocmVhZCB0byBjcmFzaCBrZXJuZWwgKi8KKwkJV0FSTl9PTighYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50KTsKKwkJV0FSTl9PTighKCplbnRpdHlfdWMpKTsKKwkJcmV0ID0gVkNISVFfRVJST1I7CisJCWdvdG8gdW5sb2NrOworCX0KKwlsb2NhbF91YyA9IC0tYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50OworCWxvY2FsX2VudGl0eV91YyA9IC0tKCplbnRpdHlfdWMpOworCisJaWYgKCF2Y2hpcV92aWRlb2NvcmVfd2FudGVkKHN0YXRlKSkgeworCQlpZiAodmNoaXFfcGxhdGZvcm1fdXNlX3N1c3BlbmRfdGltZXIoKSAmJgorCQkJCSFhcm1fc3RhdGUtPnJlc3VtZV9ibG9ja2VkKSB7CisJCQkvKiBPbmx5IHVzZSB0aGUgdGltZXIgaWYgd2UncmUgbm90IHRyeWluZyB0byBmb3JjZQorCQkJICogc3VzcGVuZCAoPT4gcmVzdW1lX2Jsb2NrZWQpICovCisJCQlzdGFydF9zdXNwZW5kX3RpbWVyKGFybV9zdGF0ZSk7CisJCX0gZWxzZSB7CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCQkiJXMgJXMgY291bnQgJWQsIHN0YXRlIGNvdW50ICVkIC0gc3VzcGVuZGluZyIsCisJCQkJX19mdW5jX18sIGVudGl0eSwgKmVudGl0eV91YywKKwkJCQlhcm1fc3RhdGUtPnZpZGVvY29yZV91c2VfY291bnQpOworCQkJdmNoaXFfYXJtX3Zjc3VzcGVuZChzdGF0ZSk7CisJCX0KKwl9IGVsc2UKKwkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIiVzICVzIGNvdW50ICVkLCBzdGF0ZSBjb3VudCAlZCIsCisJCQlfX2Z1bmNfXywgZW50aXR5LCAqZW50aXR5X3VjLAorCQkJYXJtX3N0YXRlLT52aWRlb2NvcmVfdXNlX2NvdW50KTsKKwordW5sb2NrOgorCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworb3V0OgorCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIGV4aXQgJWQiLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCit2Y2hpcV9vbl9yZW1vdGVfdXNlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlcyIsIF9fZnVuY19fKTsKKwlhdG9taWNfaW5jKCZhcm1fc3RhdGUtPmthX3VzZV9jb3VudCk7CisJY29tcGxldGUoJmFybV9zdGF0ZS0+a2FfZXZ0KTsKK30KKwordm9pZAordmNoaXFfb25fcmVtb3RlX3JlbGVhc2UoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwgIiVzIiwgX19mdW5jX18pOworCWF0b21pY19pbmMoJmFybV9zdGF0ZS0+a2FfcmVsZWFzZV9jb3VudCk7CisJY29tcGxldGUoJmFybV9zdGF0ZS0+a2FfZXZ0KTsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3VzZV9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwlyZXR1cm4gdmNoaXFfdXNlX2ludGVybmFsKHNlcnZpY2UtPnN0YXRlLCBzZXJ2aWNlLCBVU0VfVFlQRV9TRVJWSUNFKTsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3JlbGVhc2Vfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJcmV0dXJuIHZjaGlxX3JlbGVhc2VfaW50ZXJuYWwoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UpOworfQorCitWQ0hJUV9ERUJVR0ZTX05PREVfVCAqCit2Y2hpcV9pbnN0YW5jZV9nZXRfZGVidWdmc19ub2RlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpCit7CisJcmV0dXJuICZpbnN0YW5jZS0+ZGVidWdmc19ub2RlOworfQorCitpbnQKK3ZjaGlxX2luc3RhbmNlX2dldF91c2VfY291bnQoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJaW50IHVzZV9jb3VudCA9IDAsIGk7CisJaSA9IDA7CisJd2hpbGUgKChzZXJ2aWNlID0gbmV4dF9zZXJ2aWNlX2J5X2luc3RhbmNlKGluc3RhbmNlLT5zdGF0ZSwKKwkJaW5zdGFuY2UsICZpKSkgIT0gTlVMTCkgeworCQl1c2VfY291bnQgKz0gc2VydmljZS0+c2VydmljZV91c2VfY291bnQ7CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCX0KKwlyZXR1cm4gdXNlX2NvdW50OworfQorCitpbnQKK3ZjaGlxX2luc3RhbmNlX2dldF9waWQoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlyZXR1cm4gaW5zdGFuY2UtPnBpZDsKK30KKworaW50Cit2Y2hpcV9pbnN0YW5jZV9nZXRfdHJhY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlyZXR1cm4gaW5zdGFuY2UtPnRyYWNlOworfQorCit2b2lkCit2Y2hpcV9pbnN0YW5jZV9zZXRfdHJhY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwgaW50IHRyYWNlKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwlpbnQgaTsKKwlpID0gMDsKKwl3aGlsZSAoKHNlcnZpY2UgPSBuZXh0X3NlcnZpY2VfYnlfaW5zdGFuY2UoaW5zdGFuY2UtPnN0YXRlLAorCQlpbnN0YW5jZSwgJmkpKSAhPSBOVUxMKSB7CisJCXNlcnZpY2UtPnRyYWNlID0gdHJhY2U7CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCX0KKwlpbnN0YW5jZS0+dHJhY2UgPSAodHJhY2UgIT0gMCk7Cit9CisKK3N0YXRpYyB2b2lkIHN1c3BlbmRfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBjb250ZXh0KQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gKFZDSElRX1NUQVRFX1QgKiljb250ZXh0OworCVZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHN0YXRlKTsKKwlpZiAoIWFybV9zdGF0ZSkKKwkJZ290byBvdXQ7CisJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCSIlcyAtIHN1c3BlbmQgdGltZXIgZXhwaXJlZCAtIGNoZWNrIHN1c3BlbmQiLCBfX2Z1bmNfXyk7CisJdmNoaXFfY2hlY2tfc3VzcGVuZChzdGF0ZSk7CitvdXQ6CisJcmV0dXJuOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfdXNlX3NlcnZpY2Vfbm9fcmVzdW1lKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVZDSElRX1NUQVRVU19UIHJldCA9IFZDSElRX0VSUk9SOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlpZiAoc2VydmljZSkgeworCQlyZXQgPSB2Y2hpcV91c2VfaW50ZXJuYWwoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UsCisJCQkJVVNFX1RZUEVfU0VSVklDRV9OT19SRVNVTUUpOworCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3VzZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVZDSElRX1NUQVRVU19UIHJldCA9IFZDSElRX0VSUk9SOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlpZiAoc2VydmljZSkgeworCQlyZXQgPSB2Y2hpcV91c2VfaW50ZXJuYWwoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UsCisJCQkJVVNFX1RZUEVfU0VSVklDRSk7CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcmVsZWFzZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVZDSElRX1NUQVRVU19UIHJldCA9IFZDSElRX0VSUk9SOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlpZiAoc2VydmljZSkgeworCQlyZXQgPSB2Y2hpcV9yZWxlYXNlX2ludGVybmFsKHNlcnZpY2UtPnN0YXRlLCBzZXJ2aWNlKTsKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK3ZjaGlxX2R1bXBfc2VydmljZV91c2Vfc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZSA9IHZjaGlxX3BsYXRmb3JtX2dldF9hcm1fc3RhdGUoc3RhdGUpOworCWludCBpLCBqID0gMDsKKwkvKiBPbmx5IGR1bXAgNjQgc2VydmljZXMgKi8KKwlzdGF0aWMgY29uc3QgaW50IGxvY2FsX21heF9zZXJ2aWNlcyA9IDY0OworCS8qIElmIHRoZXJlJ3MgbW9yZSB0aGFuIDY0IHNlcnZpY2VzLCBvbmx5IGR1bXAgb25lcyB3aXRoCisJICogbm9uLXplcm8gY291bnRzICovCisJaW50IG9ubHlfbm9uemVybyA9IDA7CisJc3RhdGljIGNvbnN0IGNoYXIgKm56ID0gIjwtLSBwcmV2ZW50aW5nIHN1c3BlbmQiOworCisJZW51bSB2Y19zdXNwZW5kX3N0YXR1cyB2Y19zdXNwZW5kX3N0YXRlOworCWVudW0gdmNfcmVzdW1lX3N0YXR1cyAgdmNfcmVzdW1lX3N0YXRlOworCWludCBwZWVyX2NvdW50OworCWludCB2Y191c2VfY291bnQ7CisJaW50IGFjdGl2ZV9zZXJ2aWNlczsKKwlzdHJ1Y3Qgc2VydmljZV9kYXRhX3N0cnVjdCB7CisJCWludCBmb3VyY2M7CisJCWludCBjbGllbnRpZDsKKwkJaW50IHVzZV9jb3VudDsKKwl9IHNlcnZpY2VfZGF0YVtsb2NhbF9tYXhfc2VydmljZXNdOworCisJaWYgKCFhcm1fc3RhdGUpCisJCXJldHVybjsKKworCXJlYWRfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwl2Y19zdXNwZW5kX3N0YXRlID0gYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlOworCXZjX3Jlc3VtZV9zdGF0ZSAgPSBhcm1fc3RhdGUtPnZjX3Jlc3VtZV9zdGF0ZTsKKwlwZWVyX2NvdW50ID0gYXJtX3N0YXRlLT5wZWVyX3VzZV9jb3VudDsKKwl2Y191c2VfY291bnQgPSBhcm1fc3RhdGUtPnZpZGVvY29yZV91c2VfY291bnQ7CisJYWN0aXZlX3NlcnZpY2VzID0gc3RhdGUtPnVudXNlZF9zZXJ2aWNlOworCWlmIChhY3RpdmVfc2VydmljZXMgPiBsb2NhbF9tYXhfc2VydmljZXMpCisJCW9ubHlfbm9uemVybyA9IDE7CisKKwlmb3IgKGkgPSAwOyAoaSA8IGFjdGl2ZV9zZXJ2aWNlcykgJiYgKGogPCBsb2NhbF9tYXhfc2VydmljZXMpOyBpKyspIHsKKwkJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlX3B0ciA9IHN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJaWYgKCFzZXJ2aWNlX3B0cikKKwkJCWNvbnRpbnVlOworCisJCWlmIChvbmx5X25vbnplcm8gJiYgIXNlcnZpY2VfcHRyLT5zZXJ2aWNlX3VzZV9jb3VudCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzZXJ2aWNlX3B0ci0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkgeworCQkJc2VydmljZV9kYXRhW2pdLmZvdXJjYyA9IHNlcnZpY2VfcHRyLT5iYXNlLmZvdXJjYzsKKwkJCXNlcnZpY2VfZGF0YVtqXS5jbGllbnRpZCA9IHNlcnZpY2VfcHRyLT5jbGllbnRfaWQ7CisJCQlzZXJ2aWNlX2RhdGFbaisrXS51c2VfY291bnQgPSBzZXJ2aWNlX3B0ci0+CisJCQkJCQkJc2VydmljZV91c2VfY291bnQ7CisJCX0KKwl9CisKKwlyZWFkX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKworCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkiLS0gVmlkZWNvcmUgc3VzcGVuZCBzdGF0ZTogJXMgLS0iLAorCQlzdXNwZW5kX3N0YXRlX25hbWVzW3ZjX3N1c3BlbmRfc3RhdGUgKyBWQ19TVVNQRU5EX05VTV9PRkZTRVRdKTsKKwl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJIi0tIFZpZGVjb3JlIHJlc3VtZSBzdGF0ZTogJXMgLS0iLAorCQlyZXN1bWVfc3RhdGVfbmFtZXNbdmNfcmVzdW1lX3N0YXRlICsgVkNfUkVTVU1FX05VTV9PRkZTRVRdKTsKKworCWlmIChvbmx5X25vbnplcm8pCisJCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiVG9vIG1hbnkgYWN0aXZlICIKKwkJCSJzZXJ2aWNlcyAoJWQpLiAgT25seSBkdW1waW5nIHVwIHRvIGZpcnN0ICVkIHNlcnZpY2VzICIKKwkJCSJ3aXRoIG5vbi16ZXJvIHVzZS1jb3VudCIsIGFjdGl2ZV9zZXJ2aWNlcywKKwkJCWxvY2FsX21heF9zZXJ2aWNlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJIi0tLS0tICVjJWMlYyVjOiVkIHNlcnZpY2UgY291bnQgJWQgJXMiLAorCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhzZXJ2aWNlX2RhdGFbaV0uZm91cmNjKSwKKwkJCXNlcnZpY2VfZGF0YVtpXS5jbGllbnRpZCwKKwkJCXNlcnZpY2VfZGF0YVtpXS51c2VfY291bnQsCisJCQlzZXJ2aWNlX2RhdGFbaV0udXNlX2NvdW50ID8gbnogOiAiIik7CisJfQorCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkiLS0tLS0gVkNISVEgdXNlIGNvdW50IGNvdW50ICVkIiwgcGVlcl9jb3VudCk7CisJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfc3VzcF9sb2dfbGV2ZWwsCisJCSItLS0gT3ZlcmFsbCB2Y2hpcSBpbnN0YW5jZSB1c2UgY291bnQgJWQiLCB2Y191c2VfY291bnQpOworCisJdmNoaXFfZHVtcF9wbGF0Zm9ybV91c2Vfc3RhdGUoc3RhdGUpOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfY2hlY2tfc2VydmljZShWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJVkNISVFfQVJNX1NUQVRFX1QgKmFybV9zdGF0ZTsKKwlWQ0hJUV9TVEFUVVNfVCByZXQgPSBWQ0hJUV9FUlJPUjsKKworCWlmICghc2VydmljZSB8fCAhc2VydmljZS0+c3RhdGUpCisJCWdvdG8gb3V0OworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N1c3BfbG9nX2xldmVsLCAiJXMiLCBfX2Z1bmNfXyk7CisKKwlhcm1fc3RhdGUgPSB2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKHNlcnZpY2UtPnN0YXRlKTsKKworCXJlYWRfbG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwlpZiAoc2VydmljZS0+c2VydmljZV91c2VfY291bnQpCisJCXJldCA9IFZDSElRX1NVQ0NFU1M7CisJcmVhZF91bmxvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisKKwlpZiAocmV0ID09IFZDSElRX0VSUk9SKSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zdXNwX2xvZ19sZXZlbCwKKwkJCSIlcyBFUlJPUiAtICVjJWMlYyVjOiVkIHNlcnZpY2UgY291bnQgJWQsICIKKwkJCSJzdGF0ZSBjb3VudCAlZCwgdmlkZW9jb3JlIHN1c3BlbmQgc3RhdGUgJXMiLCBfX2Z1bmNfXywKKwkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJc2VydmljZS0+Y2xpZW50X2lkLCBzZXJ2aWNlLT5zZXJ2aWNlX3VzZV9jb3VudCwKKwkJCWFybV9zdGF0ZS0+dmlkZW9jb3JlX3VzZV9jb3VudCwKKwkJCXN1c3BlbmRfc3RhdGVfbmFtZXNbYXJtX3N0YXRlLT52Y19zdXNwZW5kX3N0YXRlICsKKwkJCQkJCVZDX1NVU1BFTkRfTlVNX09GRlNFVF0pOworCQl2Y2hpcV9kdW1wX3NlcnZpY2VfdXNlX3N0YXRlKHNlcnZpY2UtPnN0YXRlKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogc3R1YiBmdW5jdGlvbnMgKi8KK3ZvaWQgdmNoaXFfb25fcmVtb3RlX3VzZV9hY3RpdmUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJKHZvaWQpc3RhdGU7Cit9CisKK3ZvaWQgdmNoaXFfcGxhdGZvcm1fY29ubl9zdGF0ZV9jaGFuZ2VkKFZDSElRX1NUQVRFX1QgKnN0YXRlLAorCVZDSElRX0NPTk5TVEFURV9UIG9sZHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfVCBuZXdzdGF0ZSkKK3sKKwlWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlID0gdmNoaXFfcGxhdGZvcm1fZ2V0X2FybV9zdGF0ZShzdGF0ZSk7CisJdmNoaXFfbG9nX2luZm8odmNoaXFfc3VzcF9sb2dfbGV2ZWwsICIlZDogJXMtPiVzIiwgc3RhdGUtPmlkLAorCQlnZXRfY29ubl9zdGF0ZV9uYW1lKG9sZHN0YXRlKSwgZ2V0X2Nvbm5fc3RhdGVfbmFtZShuZXdzdGF0ZSkpOworCWlmIChzdGF0ZS0+Y29ubl9zdGF0ZSA9PSBWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVEVEKSB7CisJCXdyaXRlX2xvY2tfYmgoJmFybV9zdGF0ZS0+c3VzcF9yZXNfbG9jayk7CisJCWlmICghYXJtX3N0YXRlLT5maXJzdF9jb25uZWN0KSB7CisJCQljaGFyIHRocmVhZG5hbWVbMTBdOworCQkJYXJtX3N0YXRlLT5maXJzdF9jb25uZWN0ID0gMTsKKwkJCXdyaXRlX3VubG9ja19iaCgmYXJtX3N0YXRlLT5zdXNwX3Jlc19sb2NrKTsKKwkJCXNucHJpbnRmKHRocmVhZG5hbWUsIHNpemVvZih0aHJlYWRuYW1lKSwgIlZDSElRa2EtJWQiLAorCQkJCXN0YXRlLT5pZCk7CisJCQlhcm1fc3RhdGUtPmthX3RocmVhZCA9IGt0aHJlYWRfY3JlYXRlKAorCQkJCSZ2Y2hpcV9rZWVwYWxpdmVfdGhyZWFkX2Z1bmMsCisJCQkJKHZvaWQgKilzdGF0ZSwKKwkJCQl0aHJlYWRuYW1lKTsKKwkJCWlmIChhcm1fc3RhdGUtPmthX3RocmVhZCA9PSBOVUxMKSB7CisJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX3N1c3BfbG9nX2xldmVsLAorCQkJCQkidmNoaXE6IEZBVEFMOiBjb3VsZG4ndCBjcmVhdGUgdGhyZWFkICVzIiwKKwkJCQkJdGhyZWFkbmFtZSk7CisJCQl9IGVsc2UgeworCQkJCXdha2VfdXBfcHJvY2Vzcyhhcm1fc3RhdGUtPmthX3RocmVhZCk7CisJCQl9CisJCX0gZWxzZQorCQkJd3JpdGVfdW5sb2NrX2JoKCZhcm1fc3RhdGUtPnN1c3BfcmVzX2xvY2spOworCX0KK30KKworc3RhdGljIGludCB2Y2hpcV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZndfbm9kZTsKKwlzdHJ1Y3QgcnBpX2Zpcm13YXJlICpmdzsKKwlpbnQgZXJyOworCXZvaWQgKnB0cl9lcnI7CisKKwlmd19ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwgImZpcm13YXJlIiwgMCk7CisvKiBSZW1vdmUgY29tbWVudCB3aGVuIGJvb3Rpbmcgd2l0aG91dCBEZXZpY2UgVHJlZSBpcyBubyBsb25nZXIgc3VwcG9ydGVkCisJaWYgKCFmd19ub2RlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pc3NpbmcgZmlybXdhcmUgbm9kZVxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKyovCisJZncgPSBycGlfZmlybXdhcmVfZ2V0KGZ3X25vZGUpOworCWlmICghZncpCisJCXJldHVybiAtRVBST0JFX0RFRkVSOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZncpOworCisJLyogY3JlYXRlIGRlYnVnZnMgZW50cmllcyAqLworCWVyciA9IHZjaGlxX2RlYnVnZnNfaW5pdCgpOworCWlmIChlcnIgIT0gMCkKKwkJZ290byBmYWlsZWRfZGVidWdmc19pbml0OworCisJZXJyID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmdmNoaXFfZGV2aWQsIFZDSElRX01JTk9SLCAxLCBERVZJQ0VfTkFNRSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBkZXZpY2UgbnVtYmVyIik7CisJCWdvdG8gZmFpbGVkX2FsbG9jX2NocmRldjsKKwl9CisJY2Rldl9pbml0KCZ2Y2hpcV9jZGV2LCAmdmNoaXFfZm9wcyk7CisJdmNoaXFfY2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCWVyciA9IGNkZXZfYWRkKCZ2Y2hpcV9jZGV2LCB2Y2hpcV9kZXZpZCwgMSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJIlVuYWJsZSB0byByZWdpc3RlciBkZXZpY2UiKTsKKwkJZ290byBmYWlsZWRfY2Rldl9hZGQ7CisJfQorCisJLyogY3JlYXRlIHN5c2ZzIGVudHJpZXMgKi8KKwl2Y2hpcV9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgREVWSUNFX05BTUUpOworCXB0cl9lcnIgPSB2Y2hpcV9jbGFzczsKKwlpZiAoSVNfRVJSKHB0cl9lcnIpKQorCQlnb3RvIGZhaWxlZF9jbGFzc19jcmVhdGU7CisKKwl2Y2hpcV9kZXYgPSBkZXZpY2VfY3JlYXRlKHZjaGlxX2NsYXNzLCBOVUxMLAorCQl2Y2hpcV9kZXZpZCwgTlVMTCwgInZjaGlxIik7CisJcHRyX2VyciA9IHZjaGlxX2RldjsKKwlpZiAoSVNfRVJSKHB0cl9lcnIpKQorCQlnb3RvIGZhaWxlZF9kZXZpY2VfY3JlYXRlOworCisJZXJyID0gdmNoaXFfcGxhdGZvcm1faW5pdChwZGV2LCAmZ19zdGF0ZSk7CisJaWYgKGVyciAhPSAwKQorCQlnb3RvIGZhaWxlZF9wbGF0Zm9ybV9pbml0OworCisJdmNoaXFfbG9nX2luZm8odmNoaXFfYXJtX2xvZ19sZXZlbCwKKwkJInZjaGlxOiBpbml0aWFsaXNlZCAtIHZlcnNpb24gJWQgKG1pbiAlZCksIGRldmljZSAlZC4lZCIsCisJCVZDSElRX1ZFUlNJT04sIFZDSElRX1ZFUlNJT05fTUlOLAorCQlNQUpPUih2Y2hpcV9kZXZpZCksIE1JTk9SKHZjaGlxX2RldmlkKSk7CisKKwlyZXR1cm4gMDsKKworZmFpbGVkX3BsYXRmb3JtX2luaXQ6CisJZGV2aWNlX2Rlc3Ryb3kodmNoaXFfY2xhc3MsIHZjaGlxX2RldmlkKTsKK2ZhaWxlZF9kZXZpY2VfY3JlYXRlOgorCWNsYXNzX2Rlc3Ryb3kodmNoaXFfY2xhc3MpOworZmFpbGVkX2NsYXNzX2NyZWF0ZToKKwljZGV2X2RlbCgmdmNoaXFfY2Rldik7CisJZXJyID0gUFRSX0VSUihwdHJfZXJyKTsKK2ZhaWxlZF9jZGV2X2FkZDoKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24odmNoaXFfZGV2aWQsIDEpOworZmFpbGVkX2FsbG9jX2NocmRldjoKKwl2Y2hpcV9kZWJ1Z2ZzX2RlaW5pdCgpOworZmFpbGVkX2RlYnVnZnNfaW5pdDoKKwl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9hcm1fbG9nX2xldmVsLCAiY291bGQgbm90IGxvYWQgdmNoaXEiKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZjaGlxX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWRldmljZV9kZXN0cm95KHZjaGlxX2NsYXNzLCB2Y2hpcV9kZXZpZCk7CisJY2xhc3NfZGVzdHJveSh2Y2hpcV9jbGFzcyk7CisJY2Rldl9kZWwoJnZjaGlxX2NkZXYpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbih2Y2hpcV9kZXZpZCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdmNoaXFfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtMjgzNS12Y2hpcSIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdmNoaXFfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2Y2hpcV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYmNtMjgzNV92Y2hpcSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB2Y2hpcV9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHZjaGlxX3Byb2JlLAorCS5yZW1vdmUgPSB2Y2hpcV9yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih2Y2hpcV9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSBDb3Jwb3JhdGlvbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9hcm0uaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYXJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0MGUxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYXJtLmgKQEAgLTAsMCArMSwyMjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFJhc3BiZXJyeSBQaSAoVHJhZGluZykgTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfQVJNX0gKKyNkZWZpbmUgVkNISVFfQVJNX0gKKworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSAidmNoaXFfY29yZS5oIgorI2luY2x1ZGUgInZjaGlxX2RlYnVnZnMuaCIKKworCitlbnVtIHZjX3N1c3BlbmRfc3RhdHVzIHsKKwlWQ19TVVNQRU5EX0ZPUkNFX0NBTkNFTEVEID0gLTMsIC8qIEZvcmNlIHN1c3BlbmQgY2FuY2VsZWQsIHRvbyBidXN5ICovCisJVkNfU1VTUEVORF9SRUpFQ1RFRCA9IC0yLCAgLyogVmlkZW9jb3JlIHJlamVjdGVkIHN1c3BlbmQgcmVxdWVzdCAqLworCVZDX1NVU1BFTkRfRkFJTEVEID0gLTEsICAgIC8qIFZpZGVvY29yZSBzdXNwZW5kIGZhaWxlZCAqLworCVZDX1NVU1BFTkRfSURMRSA9IDAsICAgICAgIC8qIFZDIGFjdGl2ZSwgbm8gc3VzcGVuZCBhY3Rpb25zICovCisJVkNfU1VTUEVORF9SRVFVRVNURUQsICAgICAgLyogVXNlciBoYXMgcmVxdWVzdGVkIHN1c3BlbmQgKi8KKwlWQ19TVVNQRU5EX0lOX1BST0dSRVNTLCAgICAvKiBTbG90IGhhbmRsZXIgaGFzIHJlY3ZkIHN1c3BlbmQgcmVxdWVzdCAqLworCVZDX1NVU1BFTkRfU1VTUEVOREVEICAgICAgIC8qIFZpZGVvY29yZSBzdXNwZW5kIHN1Y2NlZWRlZCAqLworfTsKKworZW51bSB2Y19yZXN1bWVfc3RhdHVzIHsKKwlWQ19SRVNVTUVfRkFJTEVEID0gLTEsIC8qIFZpZGVvY29yZSByZXN1bWUgZmFpbGVkICovCisJVkNfUkVTVU1FX0lETEUgPSAwLCAgICAvKiBWQyBzdXNwZW5kZWQsIG5vIHJlc3VtZSBhY3Rpb25zICovCisJVkNfUkVTVU1FX1JFUVVFU1RFRCwgICAvKiBVc2VyIGhhcyByZXF1ZXN0ZWQgcmVzdW1lICovCisJVkNfUkVTVU1FX0lOX1BST0dSRVNTLCAvKiBTbG90IGhhbmRsZXIgaGFzIHJlY2VpdmVkIHJlc3VtZSByZXF1ZXN0ICovCisJVkNfUkVTVU1FX1JFU1VNRUQgICAgICAvKiBWaWRlb2NvcmUgcmVzdW1lZCBzdWNjZXNzZnVsbHkgKGFjdGl2ZSkgKi8KK307CisKKworZW51bSBVU0VfVFlQRV9FIHsKKwlVU0VfVFlQRV9TRVJWSUNFLAorCVVTRV9UWVBFX1NFUlZJQ0VfTk9fUkVTVU1FLAorCVVTRV9UWVBFX1ZDSElRCit9OworCisKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfYXJtX3N0YXRlX3N0cnVjdCB7CisJLyogS2VlcGFsaXZlLXJlbGF0ZWQgZGF0YSAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqa2FfdGhyZWFkOworCXN0cnVjdCBjb21wbGV0aW9uIGthX2V2dDsKKwlhdG9taWNfdCBrYV91c2VfY291bnQ7CisJYXRvbWljX3Qga2FfdXNlX2Fja19jb3VudDsKKwlhdG9taWNfdCBrYV9yZWxlYXNlX2NvdW50OworCisJc3RydWN0IGNvbXBsZXRpb24gdmNfc3VzcGVuZF9jb21wbGV0ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiB2Y19yZXN1bWVfY29tcGxldGU7CisKKwlyd2xvY2tfdCBzdXNwX3Jlc19sb2NrOworCWVudW0gdmNfc3VzcGVuZF9zdGF0dXMgdmNfc3VzcGVuZF9zdGF0ZTsKKwllbnVtIHZjX3Jlc3VtZV9zdGF0dXMgdmNfcmVzdW1lX3N0YXRlOworCisJdW5zaWduZWQgaW50IHdha2VfYWRkcmVzczsKKworCXN0cnVjdCB0aW1lcl9saXN0IHN1c3BlbmRfdGltZXI7CisJaW50IHN1c3BlbmRfdGltZXJfdGltZW91dDsKKwlpbnQgc3VzcGVuZF90aW1lcl9ydW5uaW5nOworCisJLyogR2xvYmFsIHVzZSBjb3VudCBmb3IgdmlkZW9jb3JlLgorCSoqIFRoaXMgaXMgZXF1YWwgdG8gdGhlIHN1bSBvZiB0aGUgdXNlIGNvdW50cyBmb3IgYWxsIHNlcnZpY2VzLiAgV2hlbgorCSoqIHRoaXMgaGl0cyB6ZXJvIHRoZSB2aWRlb2NvcmUgc3VzcGVuZCBwcm9jZWR1cmUgd2lsbCBiZSBpbml0aWF0ZWQuCisJKi8KKwlpbnQgdmlkZW9jb3JlX3VzZV9jb3VudDsKKworCS8qIFVzZSBjb3VudCB0byB0cmFjayByZXF1ZXN0cyBmcm9tIHZpZGVvY29yZSBwZWVyLgorCSoqIFRoaXMgdXNlIGNvdW50IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBzZXJ2aWNlLCBzbyBuZWVkcyB0byBiZQorCSoqIHRyYWNrZWQgc2VwYXJhdGVseSB3aXRoIHRoZSBzdGF0ZS4KKwkqLworCWludCBwZWVyX3VzZV9jb3VudDsKKworCS8qIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciByZXN1bWUgaXMgYmxvY2tlZC4gIFRoaXMgaGFwcGVucyB3aGVuIHRoZQorCSoqIEFSTSBpcyBzdXNwZW5kaW5nCisJKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiByZXN1bWVfYmxvY2tlcjsKKwlpbnQgcmVzdW1lX2Jsb2NrZWQ7CisJc3RydWN0IGNvbXBsZXRpb24gYmxvY2tlZF9ibG9ja2VyOworCWludCBibG9ja2VkX2NvdW50OworCisJaW50IGF1dG9zdXNwZW5kX292ZXJyaWRlOworCisJLyogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmaXJzdCB2Y2hpcSBjb25uZWN0IGhhcyBtYWRlIGl0IHRocm91Z2guCisJKiogVGhpcyBtZWFucyB0aGF0IGJvdGggc2lkZXMgc2hvdWxkIGJlIGZ1bGx5IHJlYWR5LCBhbmQgd2Ugc2hvdWxkCisJKiogYmUgYWJsZSB0byBzdXNwZW5kIGFmdGVyIHRoaXMgcG9pbnQuCisJKi8KKwlpbnQgZmlyc3RfY29ubmVjdDsKKworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdXNwZW5kX3N0YXJ0X3RpbWU7CisJdW5zaWduZWQgbG9uZyBsb25nIHNsZWVwX3N0YXJ0X3RpbWU7CisJdW5zaWduZWQgbG9uZyBsb25nIHJlc3VtZV9zdGFydF90aW1lOworCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0X3dha2VfdGltZTsKKworfSBWQ0hJUV9BUk1fU1RBVEVfVDsKKworZXh0ZXJuIGludCB2Y2hpcV9hcm1fbG9nX2xldmVsOworZXh0ZXJuIGludCB2Y2hpcV9zdXNwX2xvZ19sZXZlbDsKKworaW50IHZjaGlxX3BsYXRmb3JtX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVEVfVCAqCit2Y2hpcV9nZXRfc3RhdGUodm9pZCk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfYXJtX3Zjc3VzcGVuZChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfYXJtX2ZvcmNlX3N1c3BlbmQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gaW50Cit2Y2hpcV9hcm1fYWxsb3dfcmVzdW1lKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9hcm1fdmNyZXN1bWUoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2FybV9pbml0X3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlKTsKKworZXh0ZXJuIGludAordmNoaXFfY2hlY2tfcmVzdW1lKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2NoZWNrX3N1c3BlbmQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworIFZDSElRX1NUQVRVU19UCit2Y2hpcV91c2Vfc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfcmVsZWFzZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9jaGVja19zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfcGxhdGZvcm1fc3VzcGVuZChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiBpbnQKK3ZjaGlxX3BsYXRmb3JtX3ZpZGVvY29yZV93YW50ZWQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gaW50Cit2Y2hpcV9wbGF0Zm9ybV91c2Vfc3VzcGVuZF90aW1lcih2b2lkKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1fdXNlX3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2R1bXBfc2VydmljZV91c2Vfc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfQVJNX1NUQVRFX1QqCit2Y2hpcV9wbGF0Zm9ybV9nZXRfYXJtX3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIGludAordmNoaXFfdmlkZW9jb3JlX3dhbnRlZChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfdXNlX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsCisJCWVudW0gVVNFX1RZUEVfRSB1c2VfdHlwZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3JlbGVhc2VfaW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiBWQ0hJUV9ERUJVR0ZTX05PREVfVCAqCit2Y2hpcV9pbnN0YW5jZV9nZXRfZGVidWdmc19ub2RlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworCitleHRlcm4gaW50Cit2Y2hpcV9pbnN0YW5jZV9nZXRfdXNlX2NvdW50KFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworCitleHRlcm4gaW50Cit2Y2hpcV9pbnN0YW5jZV9nZXRfcGlkKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworCitleHRlcm4gaW50Cit2Y2hpcV9pbnN0YW5jZV9nZXRfdHJhY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9pbnN0YW5jZV9zZXRfdHJhY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwgaW50IHRyYWNlKTsKKworZXh0ZXJuIHZvaWQKK3NldF9zdXNwZW5kX3N0YXRlKFZDSElRX0FSTV9TVEFURV9UICphcm1fc3RhdGUsCisJZW51bSB2Y19zdXNwZW5kX3N0YXR1cyBuZXdfc3RhdGUpOworCitleHRlcm4gdm9pZAorc2V0X3Jlc3VtZV9zdGF0ZShWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlLAorCWVudW0gdmNfcmVzdW1lX3N0YXR1cyBuZXdfc3RhdGUpOworCitleHRlcm4gdm9pZAorc3RhcnRfc3VzcGVuZF90aW1lcihWQ0hJUV9BUk1fU1RBVEVfVCAqYXJtX3N0YXRlKTsKKworCisjZW5kaWYgLyogVkNISVFfQVJNX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYnVpbGRfaW5mby5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9idWlsZF9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2NDU4MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfYnVpbGRfaW5mby5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF9ob3N0bmFtZSh2b2lkKTsKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF92ZXJzaW9uKHZvaWQpOworY29uc3QgY2hhciAqdmNoaXFfZ2V0X2J1aWxkX3RpbWUodm9pZCk7Citjb25zdCBjaGFyICp2Y2hpcV9nZXRfYnVpbGRfZGF0ZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY2ZnLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NmZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzk3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NmZy5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTQgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfQ0ZHX0gKKyNkZWZpbmUgVkNISVFfQ0ZHX0gKKworI2RlZmluZSBWQ0hJUV9NQUdJQyAgICAgICAgICAgICAgVkNISVFfTUFLRV9GT1VSQ0MoJ1YnLCAnQycsICdIJywgJ0knKQorLyogVGhlIHZlcnNpb24gb2YgVkNISVEgLSBjaGFuZ2Ugd2l0aCBhbnkgbm9uLXRyaXZpYWwgY2hhbmdlICovCisjZGVmaW5lIFZDSElRX1ZFUlNJT04gICAgICAgICAgICA4CisvKiBUaGUgbWluaW11bSBjb21wYXRpYmxlIHZlcnNpb24gLSB1cGRhdGUgdG8gbWF0Y2ggVkNISVFfVkVSU0lPTiB3aXRoIGFueQorKiogaW5jb21wYXRpYmxlIGNoYW5nZSAqLworI2RlZmluZSBWQ0hJUV9WRVJTSU9OX01JTiAgICAgICAgMworCisvKiBUaGUgdmVyc2lvbiB0aGF0IGludHJvZHVjZWQgdGhlIFZDSElRX0lPQ19MSUJfVkVSU0lPTiBpb2N0bCAqLworI2RlZmluZSBWQ0hJUV9WRVJTSU9OX0xJQl9WRVJTSU9OIDcKKworLyogVGhlIHZlcnNpb24gdGhhdCBpbnRyb2R1Y2VkIHRoZSBWQ0hJUV9JT0NfQ0xPU0VfREVMSVZFUkVEIGlvY3RsICovCisjZGVmaW5lIFZDSElRX1ZFUlNJT05fQ0xPU0VfREVMSVZFUkVEIDcKKworLyogVGhlIHZlcnNpb24gdGhhdCBtYWRlIGl0IHNhZmUgdG8gdXNlIFNZTkNIUk9OT1VTIG1vZGUgKi8KKyNkZWZpbmUgVkNISVFfVkVSU0lPTl9TWU5DSFJPTk9VU19NT0RFIDgKKworI2RlZmluZSBWQ0hJUV9NQVhfU1RBVEVTICAgICAgICAgMQorI2RlZmluZSBWQ0hJUV9NQVhfU0VSVklDRVMgICAgICAgNDA5NgorI2RlZmluZSBWQ0hJUV9NQVhfU0xPVFMgICAgICAgICAgMTI4CisjZGVmaW5lIFZDSElRX01BWF9TTE9UU19QRVJfU0lERSA2NAorCisjZGVmaW5lIFZDSElRX05VTV9DVVJSRU5UX0JVTEtTICAgICAgICAzMgorI2RlZmluZSBWQ0hJUV9OVU1fU0VSVklDRV9CVUxLUyAgICAgICAgNAorCisjaWZuZGVmIFZDSElRX0VOQUJMRV9ERUJVRworI2RlZmluZSBWQ0hJUV9FTkFCTEVfREVCVUcgICAgICAgICAgICAgMQorI2VuZGlmCisKKyNpZm5kZWYgVkNISVFfRU5BQkxFX1NUQVRTCisjZGVmaW5lIFZDSElRX0VOQUJMRV9TVEFUUyAgICAgICAgICAgICAxCisjZW5kaWYKKworI2VuZGlmIC8qIFZDSElRX0NGR19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2Nvbm5lY3RlZC5jIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZjNjJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgInZjaGlxX2Nvbm5lY3RlZC5oIgorI2luY2x1ZGUgInZjaGlxX2NvcmUuaCIKKyNpbmNsdWRlICJ2Y2hpcV9raWxsYWJsZS5oIgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKyNkZWZpbmUgIE1BWF9DQUxMQkFDS1MgIDEwCisKK3N0YXRpYyAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdfY29ubmVjdGVkOworc3RhdGljICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgZ19udW1fZGVmZXJyZWRfY2FsbGJhY2tzOworc3RhdGljICAgVkNISVFfQ09OTkVDVEVEX0NBTExCQUNLX1QgZ19kZWZlcnJlZF9jYWxsYmFja1tNQVhfQ0FMTEJBQ0tTXTsKK3N0YXRpYyAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGdfb25jZV9pbml0Oworc3RhdGljICAgc3RydWN0IG11dGV4ICAgICAgICAgICAgICAgZ19jb25uZWN0ZWRfbXV0ZXg7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIEZ1bmN0aW9uIHRvIGluaXRpYWxpemUgb3VyIGxvY2suCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGNvbm5lY3RlZF9pbml0KHZvaWQpCit7CisJaWYgKCFnX29uY2VfaW5pdCkgeworCQltdXRleF9pbml0KCZnX2Nvbm5lY3RlZF9tdXRleCk7CisJCWdfb25jZV9pbml0ID0gMTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBkZWZlciBpbml0aWFsaXphdGlvbiB1bnRpbCB0aGUgdmNoaXEgc3RhY2sgaXMKKyogaW5pdGlhbGl6ZWQuIElmIHRoZSBzdGFjayBpcyBhbHJlYWR5IGluaXRpYWxpemVkLCB0aGVuIHRoZSBjYWxsYmFjayB3aWxsCisqIGJlIG1hZGUgaW1tZWRpYXRlbHksIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRlZmVycmVkIHVudGlsCisqIHZjaGlxX2NhbGxfY29ubmVjdGVkX2NhbGxiYWNrcyBpcyBjYWxsZWQuCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgdmNoaXFfYWRkX2Nvbm5lY3RlZF9jYWxsYmFjayhWQ0hJUV9DT05ORUNURURfQ0FMTEJBQ0tfVCBjYWxsYmFjaykKK3sKKwljb25uZWN0ZWRfaW5pdCgpOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZ19jb25uZWN0ZWRfbXV0ZXgpICE9IDApCisJCXJldHVybjsKKworCWlmIChnX2Nvbm5lY3RlZCkKKwkJLyogV2UncmUgYWxyZWFkeSBjb25uZWN0ZWQuIENhbGwgdGhlIGNhbGxiYWNrIGltbWVkaWF0ZWx5LiAqLworCisJCWNhbGxiYWNrKCk7CisJZWxzZSB7CisJCWlmIChnX251bV9kZWZlcnJlZF9jYWxsYmFja3MgPj0gTUFYX0NBTExCQUNLUykKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiVGhlcmUgYWxyZWFkeSAlZCBjYWxsYmFjayByZWdpc3RlcmVkIC0gIgorCQkJCSJwbGVhc2UgaW5jcmVhc2UgTUFYX0NBTExCQUNLUyIsCisJCQkJZ19udW1fZGVmZXJyZWRfY2FsbGJhY2tzKTsKKwkJZWxzZSB7CisJCQlnX2RlZmVycmVkX2NhbGxiYWNrW2dfbnVtX2RlZmVycmVkX2NhbGxiYWNrc10gPQorCQkJCWNhbGxiYWNrOworCQkJZ19udW1fZGVmZXJyZWRfY2FsbGJhY2tzKys7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZnX2Nvbm5lY3RlZF9tdXRleCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB2Y2hpcSBzdGFjayBvbmNlIGl0IGhhcyBiZWVuIGNvbm5lY3RlZCB0bworKiB0aGUgdmlkZW9jb3JlIGFuZCBjbGllbnRzIGNhbiBzdGFydCB0byB1c2UgdGhlIHN0YWNrLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHZjaGlxX2NhbGxfY29ubmVjdGVkX2NhbGxiYWNrcyh2b2lkKQoreworCWludCBpOworCisJY29ubmVjdGVkX2luaXQoKTsKKworCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmdfY29ubmVjdGVkX211dGV4KSAhPSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgIGdfbnVtX2RlZmVycmVkX2NhbGxiYWNrczsgaSsrKQorCQlnX2RlZmVycmVkX2NhbGxiYWNrW2ldKCk7CisKKwlnX251bV9kZWZlcnJlZF9jYWxsYmFja3MgPSAwOworCWdfY29ubmVjdGVkID0gMTsKKwltdXRleF91bmxvY2soJmdfY29ubmVjdGVkX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfYWRkX2Nvbm5lY3RlZF9jYWxsYmFjayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2Nvbm5lY3RlZC5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjNiM2UzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb25uZWN0ZWQuaApAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX0NPTk5FQ1RFRF9ICisjZGVmaW5lIFZDSElRX0NPTk5FQ1RFRF9ICisKKy8qIC0tLS0gSW5jbHVkZSBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tIENvbnN0YW50cyBhbmQgVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIHZvaWQgKCpWQ0hJUV9DT05ORUNURURfQ0FMTEJBQ0tfVCkodm9pZCk7CisKKy8qIC0tLS0gVmFyaWFibGUgRXh0ZXJucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgdmNoaXFfYWRkX2Nvbm5lY3RlZF9jYWxsYmFjayhWQ0hJUV9DT05ORUNURURfQ0FMTEJBQ0tfVCBjYWxsYmFjayk7Cit2b2lkIHZjaGlxX2NhbGxfY29ubmVjdGVkX2NhbGxiYWNrcyh2b2lkKTsKKworI2VuZGlmIC8qIFZDSElRX0NPTk5FQ1RFRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOThkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2NvcmUuYwpAQCAtMCwwICsxLDM5MzQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJ2Y2hpcV9jb3JlLmgiCisjaW5jbHVkZSAidmNoaXFfa2lsbGFibGUuaCIKKworI2RlZmluZSBWQ0hJUV9TTE9UX0hBTkRMRVJfU1RBQ0sgODE5MgorCisjZGVmaW5lIEhBTkRMRV9TVEFURV9TSElGVCAxMgorCisjZGVmaW5lIFNMT1RfSU5GT19GUk9NX0lOREVYKHN0YXRlLCBpbmRleCkgKHN0YXRlLT5zbG90X2luZm8gKyAoaW5kZXgpKQorI2RlZmluZSBTTE9UX0RBVEFfRlJPTV9JTkRFWChzdGF0ZSwgaW5kZXgpIChzdGF0ZS0+c2xvdF9kYXRhICsgKGluZGV4KSkKKyNkZWZpbmUgU0xPVF9JTkRFWF9GUk9NX0RBVEEoc3RhdGUsIGRhdGEpIFwKKwkoKCh1bnNpZ25lZCBpbnQpKChjaGFyICopZGF0YSAtIChjaGFyICopc3RhdGUtPnNsb3RfZGF0YSkpIC8gXAorCVZDSElRX1NMT1RfU0laRSkKKyNkZWZpbmUgU0xPVF9JTkRFWF9GUk9NX0lORk8oc3RhdGUsIGluZm8pIFwKKwkoKHVuc2lnbmVkIGludCkoaW5mbyAtIHN0YXRlLT5zbG90X2luZm8pKQorI2RlZmluZSBTTE9UX1FVRVVFX0lOREVYX0ZST01fUE9TKHBvcykgXAorCSgoaW50KSgodW5zaWduZWQgaW50KShwb3MpIC8gVkNISVFfU0xPVF9TSVpFKSkKKworI2RlZmluZSBCVUxLX0lOREVYKHgpICh4ICYgKFZDSElRX05VTV9TRVJWSUNFX0JVTEtTIC0gMSkpCisKKyNkZWZpbmUgU1JWVFJBQ0VfTEVWRUwoc3J2KSBcCisJKCgoc3J2KSAmJiAoc3J2KS0+dHJhY2UpID8gVkNISVFfTE9HX1RSQUNFIDogdmNoaXFfY29yZV9tc2dfbG9nX2xldmVsKQorI2RlZmluZSBTUlZUUkFDRV9FTkFCTEVEKHNydiwgbGV2KSBcCisJKCgoc3J2KSAmJiAoc3J2KS0+dHJhY2UpIHx8ICh2Y2hpcV9jb3JlX21zZ19sb2dfbGV2ZWwgPj0gKGxldikpKQorCitzdHJ1Y3QgdmNoaXFfb3Blbl9wYXlsb2FkIHsKKwlpbnQgZm91cmNjOworCWludCBjbGllbnRfaWQ7CisJc2hvcnQgdmVyc2lvbjsKKwlzaG9ydCB2ZXJzaW9uX21pbjsKK307CisKK3N0cnVjdCB2Y2hpcV9vcGVuYWNrX3BheWxvYWQgeworCXNob3J0IHZlcnNpb247Cit9OworCitlbnVtCit7CisJUU1GTEFHU19JU19CTE9DS0lORyAgICAgPSAoMSA8PCAwKSwKKwlRTUZMQUdTX05PX01VVEVYX0xPQ0sgICA9ICgxIDw8IDEpLAorCVFNRkxBR1NfTk9fTVVURVhfVU5MT0NLID0gKDEgPDwgMikKK307CisKKy8qIHdlIHJlcXVpcmUgdGhpcyBmb3IgY29uc2lzdGVuY3kgYmV0d2VlbiBlbmRwb2ludHMgKi8KK3ZjaGlxX3N0YXRpY19hc3NlcnQoc2l6ZW9mKFZDSElRX0hFQURFUl9UKSA9PSA4KTsKK3ZjaGlxX3N0YXRpY19hc3NlcnQoSVNfUE9XMihzaXplb2YoVkNISVFfSEVBREVSX1QpKSk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KElTX1BPVzIoVkNISVFfTlVNX0NVUlJFTlRfQlVMS1MpKTsKK3ZjaGlxX3N0YXRpY19hc3NlcnQoSVNfUE9XMihWQ0hJUV9OVU1fU0VSVklDRV9CVUxLUykpOwordmNoaXFfc3RhdGljX2Fzc2VydChJU19QT1cyKFZDSElRX01BWF9TRVJWSUNFUykpOwordmNoaXFfc3RhdGljX2Fzc2VydChWQ0hJUV9WRVJTSU9OID49IFZDSElRX1ZFUlNJT05fTUlOKTsKKworLyogUnVuIHRpbWUgY29udHJvbCBvZiBsb2cgbGV2ZWwsIGJhc2VkIG9uIEtFUk5fWFhYIGxldmVsLiAqLworaW50IHZjaGlxX2NvcmVfbG9nX2xldmVsID0gVkNISVFfTE9HX0RFRkFVTFQ7CitpbnQgdmNoaXFfY29yZV9tc2dfbG9nX2xldmVsID0gVkNISVFfTE9HX0RFRkFVTFQ7CitpbnQgdmNoaXFfc3luY19sb2dfbGV2ZWwgPSBWQ0hJUV9MT0dfREVGQVVMVDsKKworc3RhdGljIGF0b21pY190IHBhdXNlX2J1bGtzX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2VydmljZV9zcGlubG9jayk7CitERUZJTkVfU1BJTkxPQ0soYnVsa193YWl0ZXJfc3BpbmxvY2spOworREVGSU5FX1NQSU5MT0NLKHF1b3RhX3NwaW5sb2NrKTsKKworVkNISVFfU1RBVEVfVCAqdmNoaXFfc3RhdGVzW1ZDSElRX01BWF9TVEFURVNdOworc3RhdGljIHVuc2lnbmVkIGludCBoYW5kbGVfc2VxOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3J2c3RhdGVfbmFtZXNbXSA9IHsKKwkiRlJFRSIsCisJIkhJRERFTiIsCisJIkxJU1RFTklORyIsCisJIk9QRU5JTkciLAorCSJPUEVOIiwKKwkiT1BFTlNZTkMiLAorCSJDTE9TRVNFTlQiLAorCSJDTE9TRVJFQ1ZEIiwKKwkiQ0xPU0VXQUlUIiwKKwkiQ0xPU0VEIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJlYXNvbl9uYW1lc1tdID0geworCSJTRVJWSUNFX09QRU5FRCIsCisJIlNFUlZJQ0VfQ0xPU0VEIiwKKwkiTUVTU0FHRV9BVkFJTEFCTEUiLAorCSJCVUxLX1RSQU5TTUlUX0RPTkUiLAorCSJCVUxLX1JFQ0VJVkVfRE9ORSIsCisJIkJVTEtfVFJBTlNNSVRfQUJPUlRFRCIsCisJIkJVTEtfUkVDRUlWRV9BQk9SVEVEIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbm5fc3RhdGVfbmFtZXNbXSA9IHsKKwkiRElTQ09OTkVDVEVEIiwKKwkiQ09OTkVDVElORyIsCisJIkNPTk5FQ1RFRCIsCisJIlBBVVNJTkciLAorCSJQQVVTRV9TRU5UIiwKKwkiUEFVU0VEIiwKKwkiUkVTVU1JTkciLAorCSJQQVVTRV9USU1FT1VUIiwKKwkiUkVTVU1FX1RJTUVPVVQiCit9OworCisKK3N0YXRpYyB2b2lkCityZWxlYXNlX21lc3NhZ2Vfc3luYyhWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfSEVBREVSX1QgKmhlYWRlcik7CisKK3N0YXRpYyBjb25zdCBjaGFyICptc2dfdHlwZV9zdHIodW5zaWduZWQgaW50IG1zZ190eXBlKQoreworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIFZDSElRX01TR19QQURESU5HOiAgICAgICByZXR1cm4gIlBBRERJTkciOworCWNhc2UgVkNISVFfTVNHX0NPTk5FQ1Q6ICAgICAgIHJldHVybiAiQ09OTkVDVCI7CisJY2FzZSBWQ0hJUV9NU0dfT1BFTjogICAgICAgICAgcmV0dXJuICJPUEVOIjsKKwljYXNlIFZDSElRX01TR19PUEVOQUNLOiAgICAgICByZXR1cm4gIk9QRU5BQ0siOworCWNhc2UgVkNISVFfTVNHX0NMT1NFOiAgICAgICAgIHJldHVybiAiQ0xPU0UiOworCWNhc2UgVkNISVFfTVNHX0RBVEE6ICAgICAgICAgIHJldHVybiAiREFUQSI7CisJY2FzZSBWQ0hJUV9NU0dfQlVMS19SWDogICAgICAgcmV0dXJuICJCVUxLX1JYIjsKKwljYXNlIFZDSElRX01TR19CVUxLX1RYOiAgICAgICByZXR1cm4gIkJVTEtfVFgiOworCWNhc2UgVkNISVFfTVNHX0JVTEtfUlhfRE9ORTogIHJldHVybiAiQlVMS19SWF9ET05FIjsKKwljYXNlIFZDSElRX01TR19CVUxLX1RYX0RPTkU6ICByZXR1cm4gIkJVTEtfVFhfRE9ORSI7CisJY2FzZSBWQ0hJUV9NU0dfUEFVU0U6ICAgICAgICAgcmV0dXJuICJQQVVTRSI7CisJY2FzZSBWQ0hJUV9NU0dfUkVTVU1FOiAgICAgICAgcmV0dXJuICJSRVNVTUUiOworCWNhc2UgVkNISVFfTVNHX1JFTU9URV9VU0U6ICAgIHJldHVybiAiUkVNT1RFX1VTRSI7CisJY2FzZSBWQ0hJUV9NU0dfUkVNT1RFX1JFTEVBU0U6ICAgICAgcmV0dXJuICJSRU1PVEVfUkVMRUFTRSI7CisJY2FzZSBWQ0hJUV9NU0dfUkVNT1RFX1VTRV9BQ1RJVkU6ICAgcmV0dXJuICJSRU1PVEVfVVNFX0FDVElWRSI7CisJfQorCXJldHVybiAiPz8/IjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCit2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBuZXdzdGF0ZSkKK3sKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwgIiVkOiBzcnY6JWQgJXMtPiVzIiwKKwkJc2VydmljZS0+c3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCXNydnN0YXRlX25hbWVzW3NlcnZpY2UtPnNydnN0YXRlXSwKKwkJc3J2c3RhdGVfbmFtZXNbbmV3c3RhdGVdKTsKKwlzZXJ2aWNlLT5zcnZzdGF0ZSA9IG5ld3N0YXRlOworfQorCitWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisKKwlzcGluX2xvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCXNlcnZpY2UgPSBoYW5kbGVfdG9fc2VydmljZShoYW5kbGUpOworCWlmIChzZXJ2aWNlICYmIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9GUkVFKSAmJgorCQkoc2VydmljZS0+aGFuZGxlID09IGhhbmRsZSkpIHsKKwkJQlVHX09OKHNlcnZpY2UtPnJlZl9jb3VudCA9PSAwKTsKKwkJc2VydmljZS0+cmVmX2NvdW50Kys7CisJfSBlbHNlCisJCXNlcnZpY2UgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKworCWlmICghc2VydmljZSkKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiSW52YWxpZCBzZXJ2aWNlIGhhbmRsZSAweCV4IiwgaGFuZGxlKTsKKworCXJldHVybiBzZXJ2aWNlOworfQorCitWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9zZXJ2aWNlX2J5X3BvcnQoVkNISVFfU1RBVEVfVCAqc3RhdGUsIGludCBsb2NhbHBvcnQpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gTlVMTDsKKwlpZiAoKHVuc2lnbmVkIGludClsb2NhbHBvcnQgPD0gVkNISVFfUE9SVF9NQVgpIHsKKwkJc3Bpbl9sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKwkJc2VydmljZSA9IHN0YXRlLT5zZXJ2aWNlc1tsb2NhbHBvcnRdOworCQlpZiAoc2VydmljZSAmJiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkpIHsKKwkJCUJVR19PTihzZXJ2aWNlLT5yZWZfY291bnQgPT0gMCk7CisJCQlzZXJ2aWNlLT5yZWZfY291bnQrKzsKKwkJfSBlbHNlCisJCQlzZXJ2aWNlID0gTlVMTDsKKwkJc3Bpbl91bmxvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCX0KKworCWlmICghc2VydmljZSkKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiSW52YWxpZCBwb3J0ICVkIiwgbG9jYWxwb3J0KTsKKworCXJldHVybiBzZXJ2aWNlOworfQorCitWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9zZXJ2aWNlX2Zvcl9pbnN0YW5jZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLAorCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKSB7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCisJc3Bpbl9sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKwlzZXJ2aWNlID0gaGFuZGxlX3RvX3NlcnZpY2UoaGFuZGxlKTsKKwlpZiAoc2VydmljZSAmJiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkgJiYKKwkJKHNlcnZpY2UtPmhhbmRsZSA9PSBoYW5kbGUpICYmCisJCShzZXJ2aWNlLT5pbnN0YW5jZSA9PSBpbnN0YW5jZSkpIHsKKwkJQlVHX09OKHNlcnZpY2UtPnJlZl9jb3VudCA9PSAwKTsKKwkJc2VydmljZS0+cmVmX2NvdW50Kys7CisJfSBlbHNlCisJCXNlcnZpY2UgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZzZXJ2aWNlX3NwaW5sb2NrKTsKKworCWlmICghc2VydmljZSkKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiSW52YWxpZCBzZXJ2aWNlIGhhbmRsZSAweCV4IiwgaGFuZGxlKTsKKworCXJldHVybiBzZXJ2aWNlOworfQorCitWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9jbG9zZWRfc2VydmljZV9mb3JfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkgeworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKworCXNwaW5fbG9jaygmc2VydmljZV9zcGlubG9jayk7CisJc2VydmljZSA9IGhhbmRsZV90b19zZXJ2aWNlKGhhbmRsZSk7CisJaWYgKHNlcnZpY2UgJiYKKwkJKChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9GUkVFKSB8fAorCQkgKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0NMT1NFRCkpICYmCisJCShzZXJ2aWNlLT5oYW5kbGUgPT0gaGFuZGxlKSAmJgorCQkoc2VydmljZS0+aW5zdGFuY2UgPT0gaW5zdGFuY2UpKSB7CisJCUJVR19PTihzZXJ2aWNlLT5yZWZfY291bnQgPT0gMCk7CisJCXNlcnZpY2UtPnJlZl9jb3VudCsrOworCX0gZWxzZQorCQlzZXJ2aWNlID0gTlVMTDsKKwlzcGluX3VubG9jaygmc2VydmljZV9zcGlubG9jayk7CisKKwlpZiAoIXNlcnZpY2UpCisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIkludmFsaWQgc2VydmljZSBoYW5kbGUgMHgleCIsIGhhbmRsZSk7CisKKwlyZXR1cm4gc2VydmljZTsKK30KKworVkNISVFfU0VSVklDRV9UICoKK25leHRfc2VydmljZV9ieV9pbnN0YW5jZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlpbnQgKnBpZHgpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gTlVMTDsKKwlpbnQgaWR4ID0gKnBpZHg7CisKKwlzcGluX2xvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCXdoaWxlIChpZHggPCBzdGF0ZS0+dW51c2VkX3NlcnZpY2UpIHsKKwkJVkNISVFfU0VSVklDRV9UICpzcnYgPSBzdGF0ZS0+c2VydmljZXNbaWR4KytdOworCQlpZiAoc3J2ICYmIChzcnYtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0ZSRUUpICYmCisJCQkoc3J2LT5pbnN0YW5jZSA9PSBpbnN0YW5jZSkpIHsKKwkJCXNlcnZpY2UgPSBzcnY7CisJCQlCVUdfT04oc2VydmljZS0+cmVmX2NvdW50ID09IDApOworCQkJc2VydmljZS0+cmVmX2NvdW50Kys7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmc2VydmljZV9zcGlubG9jayk7CisKKwkqcGlkeCA9IGlkeDsKKworCXJldHVybiBzZXJ2aWNlOworfQorCit2b2lkCitsb2NrX3NlcnZpY2UoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCXNwaW5fbG9jaygmc2VydmljZV9zcGlubG9jayk7CisJQlVHX09OKCFzZXJ2aWNlIHx8IChzZXJ2aWNlLT5yZWZfY291bnQgPT0gMCkpOworCWlmIChzZXJ2aWNlKQorCQlzZXJ2aWNlLT5yZWZfY291bnQrKzsKKwlzcGluX3VubG9jaygmc2VydmljZV9zcGlubG9jayk7Cit9CisKK3ZvaWQKK3VubG9ja19zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCXNwaW5fbG9jaygmc2VydmljZV9zcGlubG9jayk7CisJQlVHX09OKCFzZXJ2aWNlIHx8IChzZXJ2aWNlLT5yZWZfY291bnQgPT0gMCkpOworCWlmIChzZXJ2aWNlICYmIHNlcnZpY2UtPnJlZl9jb3VudCkgeworCQlzZXJ2aWNlLT5yZWZfY291bnQtLTsKKwkJaWYgKCFzZXJ2aWNlLT5yZWZfY291bnQpIHsKKwkJCUJVR19PTihzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9GUkVFKTsKKwkJCXN0YXRlLT5zZXJ2aWNlc1tzZXJ2aWNlLT5sb2NhbHBvcnRdID0gTlVMTDsKKwkJfSBlbHNlCisJCQlzZXJ2aWNlID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJnNlcnZpY2Vfc3BpbmxvY2spOworCisJaWYgKHNlcnZpY2UgJiYgc2VydmljZS0+dXNlcmRhdGFfdGVybSkKKwkJc2VydmljZS0+dXNlcmRhdGFfdGVybShzZXJ2aWNlLT5iYXNlLnVzZXJkYXRhKTsKKworCWtmcmVlKHNlcnZpY2UpOworfQorCitpbnQKK3ZjaGlxX2dldF9jbGllbnRfaWQoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShoYW5kbGUpOworCWludCBpZDsKKworCWlkID0gc2VydmljZSA/IHNlcnZpY2UtPmNsaWVudF9pZCA6IDA7CisJaWYgKHNlcnZpY2UpCisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCisJcmV0dXJuIGlkOworfQorCit2b2lkICoKK3ZjaGlxX2dldF9zZXJ2aWNlX3VzZXJkYXRhKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGhhbmRsZV90b19zZXJ2aWNlKGhhbmRsZSk7CisKKwlyZXR1cm4gc2VydmljZSA/IHNlcnZpY2UtPmJhc2UudXNlcmRhdGEgOiBOVUxMOworfQorCitpbnQKK3ZjaGlxX2dldF9zZXJ2aWNlX2ZvdXJjYyhWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBoYW5kbGVfdG9fc2VydmljZShoYW5kbGUpOworCisJcmV0dXJuIHNlcnZpY2UgPyBzZXJ2aWNlLT5iYXNlLmZvdXJjYyA6IDA7Cit9CisKK3N0YXRpYyB2b2lkCittYXJrX3NlcnZpY2VfY2xvc2luZ19pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBzaF90aHJlYWQpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSBzZXJ2aWNlLT5zdGF0ZTsKKwlWQ0hJUV9TRVJWSUNFX1FVT1RBX1QgKnNlcnZpY2VfcXVvdGE7CisKKwlzZXJ2aWNlLT5jbG9zaW5nID0gMTsKKworCS8qIFN5bmNocm9uaXNlIHdpdGggb3RoZXIgdGhyZWFkcy4gKi8KKwltdXRleF9sb2NrKCZzdGF0ZS0+cmVjeWNsZV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+cmVjeWNsZV9tdXRleCk7CisJaWYgKCFzaF90aHJlYWQgfHwgKHN0YXRlLT5jb25uX3N0YXRlICE9IFZDSElRX0NPTk5TVEFURV9QQVVTRV9TRU5UKSkgeworCQkvKiBJZiB3ZSdyZSBwYXVzaW5nIHRoZW4gdGhlIHNsb3RfbXV0ZXggaXMgaGVsZCB1bnRpbCByZXN1bWUKKwkJICogYnkgdGhlIHNsb3QgaGFuZGxlci4gIFRoZXJlZm9yZSBkb24ndCB0cnkgdG8gYWNxdWlyZSB0aGlzCisJCSAqIG11dGV4IGlmIHdlJ3JlIHRoZSBzbG90IGhhbmRsZXIgYW5kIGluIHRoZSBwYXVzZSBzZW50IHN0YXRlLgorCQkgKiBXZSBkb24ndCBuZWVkIHRvIGluIHRoaXMgY2FzZSBhbnl3YXkuICovCisJCW11dGV4X2xvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CisJfQorCisJLyogVW5ibG9jayBhbnkgc2VuZGluZyB0aHJlYWQuICovCisJc2VydmljZV9xdW90YSA9ICZzdGF0ZS0+c2VydmljZV9xdW90YXNbc2VydmljZS0+bG9jYWxwb3J0XTsKKwl1cCgmc2VydmljZV9xdW90YS0+cXVvdGFfZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAorbWFya19zZXJ2aWNlX2Nsb3NpbmcoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCW1hcmtfc2VydmljZV9jbG9zaW5nX2ludGVybmFsKHNlcnZpY2UsIDApOworfQorCitzdGF0aWMgaW5saW5lIFZDSElRX1NUQVRVU19UCittYWtlX3NlcnZpY2VfY2FsbGJhY2soVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLCBWQ0hJUV9SRUFTT05fVCByZWFzb24sCisJVkNISVFfSEVBREVSX1QgKmhlYWRlciwgdm9pZCAqYnVsa191c2VyZGF0YSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiJWQ6IGNhbGxiYWNrOiVkICglcywgJXgsICV4KSIsCisJCXNlcnZpY2UtPnN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LCByZWFzb25fbmFtZXNbcmVhc29uXSwKKwkJKHVuc2lnbmVkIGludCloZWFkZXIsICh1bnNpZ25lZCBpbnQpYnVsa191c2VyZGF0YSk7CisJc3RhdHVzID0gc2VydmljZS0+YmFzZS5jYWxsYmFjayhyZWFzb24sIGhlYWRlciwgc2VydmljZS0+aGFuZGxlLAorCQlidWxrX3VzZXJkYXRhKTsKKwlpZiAoc3RhdHVzID09IFZDSElRX0VSUk9SKSB7CisJCXZjaGlxX2xvZ193YXJuaW5nKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIiVkOiBpZ25vcmluZyBFUlJPUiBmcm9tIGNhbGxiYWNrIHRvIHNlcnZpY2UgJXgiLAorCQkJc2VydmljZS0+c3RhdGUtPmlkLCBzZXJ2aWNlLT5oYW5kbGUpOworCQlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitpbmxpbmUgdm9pZAordmNoaXFfc2V0X2Nvbm5fc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX0NPTk5TVEFURV9UIG5ld3N0YXRlKQoreworCVZDSElRX0NPTk5TVEFURV9UIG9sZHN0YXRlID0gc3RhdGUtPmNvbm5fc3RhdGU7CisJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsICIlZDogJXMtPiVzIiwgc3RhdGUtPmlkLAorCQljb25uX3N0YXRlX25hbWVzW29sZHN0YXRlXSwKKwkJY29ubl9zdGF0ZV9uYW1lc1tuZXdzdGF0ZV0pOworCXN0YXRlLT5jb25uX3N0YXRlID0gbmV3c3RhdGU7CisJdmNoaXFfcGxhdGZvcm1fY29ubl9zdGF0ZV9jaGFuZ2VkKHN0YXRlLCBvbGRzdGF0ZSwgbmV3c3RhdGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3JlbW90ZV9ldmVudF9jcmVhdGUoUkVNT1RFX0VWRU5UX1QgKmV2ZW50KQoreworCWV2ZW50LT5hcm1lZCA9IDA7CisJLyogRG9uJ3QgY2xlYXIgdGhlICdmaXJlZCcgZmxhZyBiZWNhdXNlIGl0IG1heSBhbHJlYWR5IGhhdmUgYmVlbiBzZXQKKwkqKiBieSB0aGUgb3RoZXIgc2lkZS4gKi8KKwlzZW1hX2luaXQoZXZlbnQtPmV2ZW50LCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdGVfZXZlbnRfZGVzdHJveShSRU1PVEVfRVZFTlRfVCAqZXZlbnQpCit7CisJKHZvaWQpZXZlbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CityZW1vdGVfZXZlbnRfd2FpdChSRU1PVEVfRVZFTlRfVCAqZXZlbnQpCit7CisJaWYgKCFldmVudC0+ZmlyZWQpIHsKKwkJZXZlbnQtPmFybWVkID0gMTsKKwkJZHNiKCk7CisJCWlmICghZXZlbnQtPmZpcmVkKSB7CisJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKGV2ZW50LT5ldmVudCkgIT0gMCkgeworCQkJCWV2ZW50LT5hcm1lZCA9IDA7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJZXZlbnQtPmFybWVkID0gMDsKKwkJd21iKCk7CisJfQorCisJZXZlbnQtPmZpcmVkID0gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdGVfZXZlbnRfc2lnbmFsX2xvY2FsKFJFTU9URV9FVkVOVF9UICpldmVudCkKK3sKKwlldmVudC0+YXJtZWQgPSAwOworCXVwKGV2ZW50LT5ldmVudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcmVtb3RlX2V2ZW50X3BvbGwoUkVNT1RFX0VWRU5UX1QgKmV2ZW50KQoreworCWlmIChldmVudC0+ZmlyZWQgJiYgZXZlbnQtPmFybWVkKQorCQlyZW1vdGVfZXZlbnRfc2lnbmFsX2xvY2FsKGV2ZW50KTsKK30KKwordm9pZAorcmVtb3RlX2V2ZW50X3BvbGxhbGwoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJcmVtb3RlX2V2ZW50X3BvbGwoJnN0YXRlLT5sb2NhbC0+c3luY190cmlnZ2VyKTsKKwlyZW1vdGVfZXZlbnRfcG9sbCgmc3RhdGUtPmxvY2FsLT5zeW5jX3JlbGVhc2UpOworCXJlbW90ZV9ldmVudF9wb2xsKCZzdGF0ZS0+bG9jYWwtPnRyaWdnZXIpOworCXJlbW90ZV9ldmVudF9wb2xsKCZzdGF0ZS0+bG9jYWwtPnJlY3ljbGUpOworfQorCisvKiBSb3VuZCB1cCBtZXNzYWdlIHNpemVzIHNvIHRoYXQgYW55IHNwYWNlIGF0IHRoZSBlbmQgb2YgYSBzbG90IGlzIGFsd2F5cyBiaWcKKyoqIGVub3VnaCBmb3IgYSBoZWFkZXIuIFRoaXMgcmVsaWVzIG9uIGhlYWRlciBzaXplIGJlaW5nIGEgcG93ZXIgb2YgdHdvLCB3aGljaAorKiogaGFzIGJlZW4gdmVyaWZpZWQgZWFybGllciBieSBhIHN0YXRpYyBhc3NlcnRpb24uICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitjYWxjX3N0cmlkZSh1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwkvKiBBbGxvdyByb29tIGZvciB0aGUgaGVhZGVyICovCisJc2l6ZSArPSBzaXplb2YoVkNISVFfSEVBREVSX1QpOworCisJLyogUm91bmQgdXAgKi8KKwlyZXR1cm4gKHNpemUgKyBzaXplb2YoVkNISVFfSEVBREVSX1QpIC0gMSkgJiB+KHNpemVvZihWQ0hJUV9IRUFERVJfVCkKKwkJLSAxKTsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkICovCitzdGF0aWMgVkNISVFfU0VSVklDRV9UICoKK2dldF9saXN0ZW5pbmdfc2VydmljZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgaW50IGZvdXJjYykKK3sKKwlpbnQgaTsKKworCVdBUk5fT04oZm91cmNjID09IFZDSElRX0ZPVVJDQ19JTlZBTElEKTsKKworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+dW51c2VkX3NlcnZpY2U7IGkrKykgeworCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBzdGF0ZS0+c2VydmljZXNbaV07CisJCWlmIChzZXJ2aWNlICYmCisJCQkoc2VydmljZS0+cHVibGljX2ZvdXJjYyA9PSBmb3VyY2MpICYmCisJCQkoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0xJU1RFTklORykgfHwKKwkJCSgoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfT1BFTikgJiYKKwkJCShzZXJ2aWNlLT5yZW1vdGVwb3J0ID09IFZDSElRX1BPUlRfRlJFRSkpKSkgeworCQkJbG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQkJcmV0dXJuIHNlcnZpY2U7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkICovCitzdGF0aWMgVkNISVFfU0VSVklDRV9UICoKK2dldF9jb25uZWN0ZWRfc2VydmljZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgdW5zaWduZWQgaW50IHBvcnQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT51bnVzZWRfc2VydmljZTsgaSsrKSB7CisJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IHN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJaWYgKHNlcnZpY2UgJiYgKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU4pCisJCQkmJiAoc2VydmljZS0+cmVtb3RlcG9ydCA9PSBwb3J0KSkgeworCQkJbG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQkJcmV0dXJuIHNlcnZpY2U7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2lubGluZSB2b2lkCityZXF1ZXN0X3BvbGwoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwgaW50IHBvbGxfdHlwZSkKK3sKKwl1aW50MzJfdCB2YWx1ZTsKKworCWlmIChzZXJ2aWNlKSB7CisJCWRvIHsKKwkJCXZhbHVlID0gYXRvbWljX3JlYWQoJnNlcnZpY2UtPnBvbGxfZmxhZ3MpOworCQl9IHdoaWxlIChhdG9taWNfY21weGNoZygmc2VydmljZS0+cG9sbF9mbGFncywgdmFsdWUsCisJCQl2YWx1ZSB8ICgxIDw8IHBvbGxfdHlwZSkpICE9IHZhbHVlKTsKKworCQlkbyB7CisJCQl2YWx1ZSA9IGF0b21pY19yZWFkKCZzdGF0ZS0+cG9sbF9zZXJ2aWNlc1sKKwkJCQlzZXJ2aWNlLT5sb2NhbHBvcnQ+PjVdKTsKKwkJfSB3aGlsZSAoYXRvbWljX2NtcHhjaGcoCisJCQkmc3RhdGUtPnBvbGxfc2VydmljZXNbc2VydmljZS0+bG9jYWxwb3J0Pj41XSwKKwkJCXZhbHVlLCB2YWx1ZSB8ICgxIDw8IChzZXJ2aWNlLT5sb2NhbHBvcnQgJiAweDFmKSkpCisJCQkhPSB2YWx1ZSk7CisJfQorCisJc3RhdGUtPnBvbGxfbmVlZGVkID0gMTsKKwl3bWIoKTsKKworCS8qIC4uLiBhbmQgZW5zdXJlIHRoZSBzbG90IGhhbmRsZXIgcnVucy4gKi8KKwlyZW1vdGVfZXZlbnRfc2lnbmFsX2xvY2FsKCZzdGF0ZS0+bG9jYWwtPnRyaWdnZXIpOworfQorCisvKiBDYWxsZWQgZnJvbSBxdWV1ZV9tZXNzYWdlLCBieSB0aGUgc2xvdCBoYW5kbGVyIGFuZCBhcHBsaWNhdGlvbiB0aHJlYWRzLAorKiogd2l0aCBzbG90X211dGV4IGhlbGQgKi8KK3N0YXRpYyBWQ0hJUV9IRUFERVJfVCAqCityZXNlcnZlX3NwYWNlKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBpbnQgc3BhY2UsIGludCBpc19ibG9ja2luZykKK3sKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqbG9jYWwgPSBzdGF0ZS0+bG9jYWw7CisJaW50IHR4X3BvcyA9IHN0YXRlLT5sb2NhbF90eF9wb3M7CisJaW50IHNsb3Rfc3BhY2UgPSBWQ0hJUV9TTE9UX1NJWkUgLSAodHhfcG9zICYgVkNISVFfU0xPVF9NQVNLKTsKKworCWlmIChzcGFjZSA+IHNsb3Rfc3BhY2UpIHsKKwkJVkNISVFfSEVBREVSX1QgKmhlYWRlcjsKKwkJLyogRmlsbCB0aGUgcmVtYWluaW5nIHNwYWNlIHdpdGggcGFkZGluZyAqLworCQlXQVJOX09OKHN0YXRlLT50eF9kYXRhID09IE5VTEwpOworCQloZWFkZXIgPSAoVkNISVFfSEVBREVSX1QgKikKKwkJCShzdGF0ZS0+dHhfZGF0YSArICh0eF9wb3MgJiBWQ0hJUV9TTE9UX01BU0spKTsKKwkJaGVhZGVyLT5tc2dpZCA9IFZDSElRX01TR0lEX1BBRERJTkc7CisJCWhlYWRlci0+c2l6ZSA9IHNsb3Rfc3BhY2UgLSBzaXplb2YoVkNISVFfSEVBREVSX1QpOworCisJCXR4X3BvcyArPSBzbG90X3NwYWNlOworCX0KKworCS8qIElmIG5lY2Vzc2FyeSwgZ2V0IHRoZSBuZXh0IHNsb3QuICovCisJaWYgKCh0eF9wb3MgJiBWQ0hJUV9TTE9UX01BU0spID09IDApIHsKKwkJaW50IHNsb3RfaW5kZXg7CisKKwkJLyogSWYgdGhlcmUgaXMgbm8gZnJlZSBzbG90Li4uICovCisKKwkJaWYgKGRvd25fdHJ5bG9jaygmc3RhdGUtPnNsb3RfYXZhaWxhYmxlX2V2ZW50KSAhPSAwKSB7CisJCQkvKiAuLi53YWl0IGZvciBvbmUuICovCisKKwkJCVZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgc2xvdF9zdGFsbHMpOworCisJCQkvKiBCdXQgZmlyc3QsIGZsdXNoIHRocm91Z2ggdGhlIGxhc3Qgc2xvdC4gKi8KKwkJCXN0YXRlLT5sb2NhbF90eF9wb3MgPSB0eF9wb3M7CisJCQlsb2NhbC0+dHhfcG9zID0gdHhfcG9zOworCQkJcmVtb3RlX2V2ZW50X3NpZ25hbCgmc3RhdGUtPnJlbW90ZS0+dHJpZ2dlcik7CisKKwkJCWlmICghaXNfYmxvY2tpbmcgfHwKKwkJCQkoZG93bl9pbnRlcnJ1cHRpYmxlKAorCQkJCSZzdGF0ZS0+c2xvdF9hdmFpbGFibGVfZXZlbnQpICE9IDApKQorCQkJCXJldHVybiBOVUxMOyAvKiBObyBzcGFjZSBhdmFpbGFibGUgKi8KKwkJfQorCisJCUJVR19PTih0eF9wb3MgPT0KKwkJCShzdGF0ZS0+c2xvdF9xdWV1ZV9hdmFpbGFibGUgKiBWQ0hJUV9TTE9UX1NJWkUpKTsKKworCQlzbG90X2luZGV4ID0gbG9jYWwtPnNsb3RfcXVldWVbCisJCQlTTE9UX1FVRVVFX0lOREVYX0ZST01fUE9TKHR4X3BvcykgJgorCQkJVkNISVFfU0xPVF9RVUVVRV9NQVNLXTsKKwkJc3RhdGUtPnR4X2RhdGEgPQorCQkJKGNoYXIgKilTTE9UX0RBVEFfRlJPTV9JTkRFWChzdGF0ZSwgc2xvdF9pbmRleCk7CisJfQorCisJc3RhdGUtPmxvY2FsX3R4X3BvcyA9IHR4X3BvcyArIHNwYWNlOworCisJcmV0dXJuIChWQ0hJUV9IRUFERVJfVCAqKShzdGF0ZS0+dHhfZGF0YSArICh0eF9wb3MgJiBWQ0hJUV9TTE9UX01BU0spKTsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSByZWN5Y2xlIHRocmVhZC4gKi8KK3N0YXRpYyB2b2lkCitwcm9jZXNzX2ZyZWVfcXVldWUoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKmxvY2FsID0gc3RhdGUtPmxvY2FsOworCUJJVFNFVF9UIHNlcnZpY2VfZm91bmRbQklUU0VUX1NJWkUoVkNISVFfTUFYX1NFUlZJQ0VTKV07CisJaW50IHNsb3RfcXVldWVfYXZhaWxhYmxlOworCisJLyogVXNlIGEgcmVhZCBtZW1vcnkgYmFycmllciB0byBlbnN1cmUgdGhhdCBhbnkgc3RhdGUgdGhhdCBtYXkgaGF2ZQorCSoqIGJlZW4gbW9kaWZpZWQgYnkgYW5vdGhlciB0aHJlYWQgaXMgbm90IG1hc2tlZCBieSBzdGFsZSBwcmVmZXRjaGVkCisJKiogdmFsdWVzLiAqLworCXJtYigpOworCisJLyogRmluZCBzbG90cyB3aGljaCBoYXZlIGJlZW4gZnJlZWQgYnkgdGhlIG90aGVyIHNpZGUsIGFuZCByZXR1cm4gdGhlbQorCSoqIHRvIHRoZSBhdmFpbGFibGUgcXVldWUuICovCisJc2xvdF9xdWV1ZV9hdmFpbGFibGUgPSBzdGF0ZS0+c2xvdF9xdWV1ZV9hdmFpbGFibGU7CisKKwl3aGlsZSAoc2xvdF9xdWV1ZV9hdmFpbGFibGUgIT0gbG9jYWwtPnNsb3RfcXVldWVfcmVjeWNsZSkgeworCQl1bnNpZ25lZCBpbnQgcG9zOworCQlpbnQgc2xvdF9pbmRleCA9IGxvY2FsLT5zbG90X3F1ZXVlW3Nsb3RfcXVldWVfYXZhaWxhYmxlKysgJgorCQkJVkNISVFfU0xPVF9RVUVVRV9NQVNLXTsKKwkJY2hhciAqZGF0YSA9IChjaGFyICopU0xPVF9EQVRBX0ZST01fSU5ERVgoc3RhdGUsIHNsb3RfaW5kZXgpOworCQlpbnQgZGF0YV9mb3VuZCA9IDA7CisKKwkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiJWQ6IHBmcSAlZD0leCAleCAleCIsCisJCQlzdGF0ZS0+aWQsIHNsb3RfaW5kZXgsICh1bnNpZ25lZCBpbnQpZGF0YSwKKwkJCWxvY2FsLT5zbG90X3F1ZXVlX3JlY3ljbGUsIHNsb3RfcXVldWVfYXZhaWxhYmxlKTsKKworCQkvKiBJbml0aWFsaXNlIHRoZSBiaXRtYXNrIGZvciBzZXJ2aWNlcyB3aGljaCBoYXZlIHVzZWQgdGhpcworCQkqKiBzbG90ICovCisJCUJJVFNFVF9aRVJPKHNlcnZpY2VfZm91bmQpOworCisJCXBvcyA9IDA7CisKKwkJd2hpbGUgKHBvcyA8IFZDSElRX1NMT1RfU0laRSkgeworCQkJVkNISVFfSEVBREVSX1QgKmhlYWRlciA9CisJCQkJKFZDSElRX0hFQURFUl9UICopKGRhdGEgKyBwb3MpOworCQkJaW50IG1zZ2lkID0gaGVhZGVyLT5tc2dpZDsKKwkJCWlmIChWQ0hJUV9NU0dfVFlQRShtc2dpZCkgPT0gVkNISVFfTVNHX0RBVEEpIHsKKwkJCQlpbnQgcG9ydCA9IFZDSElRX01TR19TUkNQT1JUKG1zZ2lkKTsKKwkJCQlWQ0hJUV9TRVJWSUNFX1FVT1RBX1QgKnNlcnZpY2VfcXVvdGEgPQorCQkJCQkmc3RhdGUtPnNlcnZpY2VfcXVvdGFzW3BvcnRdOworCQkJCWludCBjb3VudDsKKwkJCQlzcGluX2xvY2soJnF1b3RhX3NwaW5sb2NrKTsKKwkJCQljb3VudCA9IHNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50OworCQkJCWlmIChjb3VudCA+IDApCisJCQkJCXNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50ID0KKwkJCQkJCWNvdW50IC0gMTsKKwkJCQlzcGluX3VubG9jaygmcXVvdGFfc3BpbmxvY2spOworCisJCQkJaWYgKGNvdW50ID09IHNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfcXVvdGEpCisJCQkJCS8qIFNpZ25hbCB0aGUgc2VydmljZSB0aGF0IGl0CisJCQkJCSoqIGhhcyBkcm9wcGVkIGJlbG93IGl0cyBxdW90YQorCQkJCQkqLworCQkJCQl1cCgmc2VydmljZV9xdW90YS0+cXVvdGFfZXZlbnQpOworCQkJCWVsc2UgaWYgKGNvdW50ID09IDApIHsKKwkJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJInNlcnZpY2UgJWQgIgorCQkJCQkJIm1lc3NhZ2VfdXNlX2NvdW50PSVkICIKKwkJCQkJCSIoaGVhZGVyICV4LCBtc2dpZCAleCwgIgorCQkJCQkJImhlYWRlci0+bXNnaWQgJXgsICIKKwkJCQkJCSJoZWFkZXItPnNpemUgJXgpIiwKKwkJCQkJCXBvcnQsCisJCQkJCQlzZXJ2aWNlX3F1b3RhLT4KKwkJCQkJCQltZXNzYWdlX3VzZV9jb3VudCwKKwkJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLCBtc2dpZCwKKwkJCQkJCWhlYWRlci0+bXNnaWQsCisJCQkJCQloZWFkZXItPnNpemUpOworCQkJCQlXQVJOKDEsICJpbnZhbGlkIG1lc3NhZ2UgdXNlIGNvdW50XG4iKTsKKwkJCQl9CisJCQkJaWYgKCFCSVRTRVRfSVNfU0VUKHNlcnZpY2VfZm91bmQsIHBvcnQpKSB7CisJCQkJCS8qIFNldCB0aGUgZm91bmQgYml0IGZvciB0aGlzIHNlcnZpY2UgKi8KKwkJCQkJQklUU0VUX1NFVChzZXJ2aWNlX2ZvdW5kLCBwb3J0KTsKKworCQkJCQlzcGluX2xvY2soJnF1b3RhX3NwaW5sb2NrKTsKKwkJCQkJY291bnQgPSBzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudDsKKwkJCQkJaWYgKGNvdW50ID4gMCkKKwkJCQkJCXNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50ID0KKwkJCQkJCQljb3VudCAtIDE7CisJCQkJCXNwaW5fdW5sb2NrKCZxdW90YV9zcGlubG9jayk7CisKKwkJCQkJaWYgKGNvdW50ID4gMCkgeworCQkJCQkJLyogU2lnbmFsIHRoZSBzZXJ2aWNlIGluIGNhc2UKKwkJCQkJCSoqIGl0IGhhcyBkcm9wcGVkIGJlbG93IGl0cworCQkJCQkJKiogcXVvdGEgKi8KKwkJCQkJCXVwKCZzZXJ2aWNlX3F1b3RhLT5xdW90YV9ldmVudCk7CisJCQkJCQl2Y2hpcV9sb2dfdHJhY2UoCisJCQkJCQkJdmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCQkJIiVkOiBwZnE6JWQgJXhAJXggLSAiCisJCQkJCQkJInNsb3RfdXNlLT4lZCIsCisJCQkJCQkJc3RhdGUtPmlkLCBwb3J0LAorCQkJCQkJCWhlYWRlci0+c2l6ZSwKKwkJCQkJCQkodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQkJCQljb3VudCAtIDEpOworCQkJCQl9IGVsc2UgeworCQkJCQkJdmNoaXFfbG9nX2Vycm9yKAorCQkJCQkJCXZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJCQkic2VydmljZSAlZCAiCisJCQkJCQkJCSJzbG90X3VzZV9jb3VudCIKKwkJCQkJCQkJIj0lZCAoaGVhZGVyICV4IgorCQkJCQkJCQkiLCBtc2dpZCAleCwgIgorCQkJCQkJCQkiaGVhZGVyLT5tc2dpZCIKKwkJCQkJCQkJIiAleCwgaGVhZGVyLT4iCisJCQkJCQkJCSJzaXplICV4KSIsCisJCQkJCQkJcG9ydCwgY291bnQsCisJCQkJCQkJKHVuc2lnbmVkIGludCloZWFkZXIsCisJCQkJCQkJbXNnaWQsCisJCQkJCQkJaGVhZGVyLT5tc2dpZCwKKwkJCQkJCQloZWFkZXItPnNpemUpOworCQkJCQkJV0FSTigxLCAiYmFkIHNsb3QgdXNlIGNvdW50XG4iKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCWRhdGFfZm91bmQgPSAxOworCQkJfQorCisJCQlwb3MgKz0gY2FsY19zdHJpZGUoaGVhZGVyLT5zaXplKTsKKwkJCWlmIChwb3MgPiBWQ0hJUV9TTE9UX1NJWkUpIHsKKwkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCSJwZnEgLSBwb3MgJXg6IGhlYWRlciAleCwgbXNnaWQgJXgsICIKKwkJCQkJImhlYWRlci0+bXNnaWQgJXgsIGhlYWRlci0+c2l6ZSAleCIsCisJCQkJCXBvcywgKHVuc2lnbmVkIGludCloZWFkZXIsIG1zZ2lkLAorCQkJCQloZWFkZXItPm1zZ2lkLCBoZWFkZXItPnNpemUpOworCQkJCVdBUk4oMSwgImludmFsaWQgc2xvdCBwb3NpdGlvblxuIik7CisJCQl9CisJCX0KKworCQlpZiAoZGF0YV9mb3VuZCkgeworCQkJaW50IGNvdW50OworCQkJc3Bpbl9sb2NrKCZxdW90YV9zcGlubG9jayk7CisJCQljb3VudCA9IHN0YXRlLT5kYXRhX3VzZV9jb3VudDsKKwkJCWlmIChjb3VudCA+IDApCisJCQkJc3RhdGUtPmRhdGFfdXNlX2NvdW50ID0KKwkJCQkJY291bnQgLSAxOworCQkJc3Bpbl91bmxvY2soJnF1b3RhX3NwaW5sb2NrKTsKKwkJCWlmIChjb3VudCA9PSBzdGF0ZS0+ZGF0YV9xdW90YSkKKwkJCQl1cCgmc3RhdGUtPmRhdGFfcXVvdGFfZXZlbnQpOworCQl9CisKKwkJc3RhdGUtPnNsb3RfcXVldWVfYXZhaWxhYmxlID0gc2xvdF9xdWV1ZV9hdmFpbGFibGU7CisJCXVwKCZzdGF0ZS0+c2xvdF9hdmFpbGFibGVfZXZlbnQpOworCX0KK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgYW5kIGFwcGxpY2F0aW9uIHRocmVhZHMgKi8KK3N0YXRpYyBWQ0hJUV9TVEFUVVNfVAorcXVldWVfbWVzc2FnZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLAorCWludCBtc2dpZCwgY29uc3QgVkNISVFfRUxFTUVOVF9UICplbGVtZW50cywKKwlpbnQgY291bnQsIGludCBzaXplLCBpbnQgZmxhZ3MpCit7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKmxvY2FsOworCVZDSElRX1NFUlZJQ0VfUVVPVEFfVCAqc2VydmljZV9xdW90YSA9IE5VTEw7CisJVkNISVFfSEVBREVSX1QgKmhlYWRlcjsKKwlpbnQgdHlwZSA9IFZDSElRX01TR19UWVBFKG1zZ2lkKTsKKworCXVuc2lnbmVkIGludCBzdHJpZGU7CisKKwlsb2NhbCA9IHN0YXRlLT5sb2NhbDsKKworCXN0cmlkZSA9IGNhbGNfc3RyaWRlKHNpemUpOworCisJV0FSTl9PTighKHN0cmlkZSA8PSBWQ0hJUV9TTE9UX1NJWkUpKTsKKworCWlmICghKGZsYWdzICYgUU1GTEFHU19OT19NVVRFWF9MT0NLKSAmJgorCQkobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+c2xvdF9tdXRleCkgIT0gMCkpCisJCXJldHVybiBWQ0hJUV9SRVRSWTsKKworCWlmICh0eXBlID09IFZDSElRX01TR19EQVRBKSB7CisJCWludCB0eF9lbmRfaW5kZXg7CisKKwkJQlVHX09OKCFzZXJ2aWNlKTsKKwkJQlVHX09OKChmbGFncyAmIChRTUZMQUdTX05PX01VVEVYX0xPQ0sgfAorCQkJCSBRTUZMQUdTX05PX01VVEVYX1VOTE9DSykpICE9IDApOworCisJCWlmIChzZXJ2aWNlLT5jbG9zaW5nKSB7CisJCQkvKiBUaGUgc2VydmljZSBoYXMgYmVlbiBjbG9zZWQgKi8KKwkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQkJcmV0dXJuIFZDSElRX0VSUk9SOworCQl9CisKKwkJc2VydmljZV9xdW90YSA9ICZzdGF0ZS0+c2VydmljZV9xdW90YXNbc2VydmljZS0+bG9jYWxwb3J0XTsKKworCQlzcGluX2xvY2soJnF1b3RhX3NwaW5sb2NrKTsKKworCQkvKiBFbnN1cmUgdGhpcyBzZXJ2aWNlIGRvZXNuJ3QgdXNlIG1vcmUgdGhhbiBpdHMgcXVvdGEgb2YKKwkJKiogbWVzc2FnZXMgb3Igc2xvdHMgKi8KKwkJdHhfZW5kX2luZGV4ID0gU0xPVF9RVUVVRV9JTkRFWF9GUk9NX1BPUygKKwkJCXN0YXRlLT5sb2NhbF90eF9wb3MgKyBzdHJpZGUgLSAxKTsKKworCQkvKiBFbnN1cmUgZGF0YSBtZXNzYWdlcyBkb24ndCB1c2UgbW9yZSB0aGFuIHRoZWlyIHF1b3RhIG9mCisJCSoqIHNsb3RzICovCisJCXdoaWxlICgodHhfZW5kX2luZGV4ICE9IHN0YXRlLT5wcmV2aW91c19kYXRhX2luZGV4KSAmJgorCQkJKHN0YXRlLT5kYXRhX3VzZV9jb3VudCA9PSBzdGF0ZS0+ZGF0YV9xdW90YSkpIHsKKwkJCVZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgZGF0YV9zdGFsbHMpOworCQkJc3Bpbl91bmxvY2soJnF1b3RhX3NwaW5sb2NrKTsKKwkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCisJCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+ZGF0YV9xdW90YV9ldmVudCkKKwkJCQkhPSAwKQorCQkJCXJldHVybiBWQ0hJUV9SRVRSWTsKKworCQkJbXV0ZXhfbG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQkJc3Bpbl9sb2NrKCZxdW90YV9zcGlubG9jayk7CisJCQl0eF9lbmRfaW5kZXggPSBTTE9UX1FVRVVFX0lOREVYX0ZST01fUE9TKAorCQkJCXN0YXRlLT5sb2NhbF90eF9wb3MgKyBzdHJpZGUgLSAxKTsKKwkJCWlmICgodHhfZW5kX2luZGV4ID09IHN0YXRlLT5wcmV2aW91c19kYXRhX2luZGV4KSB8fAorCQkJCShzdGF0ZS0+ZGF0YV91c2VfY291bnQgPCBzdGF0ZS0+ZGF0YV9xdW90YSkpIHsKKwkJCQkvKiBQYXNzIHRoZSBzaWduYWwgb24gdG8gb3RoZXIgd2FpdGVycyAqLworCQkJCXVwKCZzdGF0ZS0+ZGF0YV9xdW90YV9ldmVudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQl3aGlsZSAoKHNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50ID09CisJCQkJc2VydmljZV9xdW90YS0+bWVzc2FnZV9xdW90YSkgfHwKKwkJCSgodHhfZW5kX2luZGV4ICE9IHNlcnZpY2VfcXVvdGEtPnByZXZpb3VzX3R4X2luZGV4KSAmJgorCQkJKHNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50ID09CisJCQkJc2VydmljZV9xdW90YS0+c2xvdF9xdW90YSkpKSB7CisJCQlzcGluX3VubG9jaygmcXVvdGFfc3BpbmxvY2spOworCQkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSIlZDogcW06JWQgJXMsJXggLSBxdW90YSBzdGFsbCAiCisJCQkJIihtc2cgJWQsIHNsb3QgJWQpIiwKKwkJCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQltc2dfdHlwZV9zdHIodHlwZSksIHNpemUsCisJCQkJc2VydmljZV9xdW90YS0+bWVzc2FnZV91c2VfY291bnQsCisJCQkJc2VydmljZV9xdW90YS0+c2xvdF91c2VfY291bnQpOworCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgcXVvdGFfc3RhbGxzKTsKKwkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2VydmljZV9xdW90YS0+cXVvdGFfZXZlbnQpCisJCQkJIT0gMCkKKwkJCQlyZXR1cm4gVkNISVFfUkVUUlk7CisJCQlpZiAoc2VydmljZS0+Y2xvc2luZykKKwkJCQlyZXR1cm4gVkNISVFfRVJST1I7CisJCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+c2xvdF9tdXRleCkgIT0gMCkKKwkJCQlyZXR1cm4gVkNISVFfUkVUUlk7CisJCQlpZiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfT1BFTikgeworCQkJCS8qIFRoZSBzZXJ2aWNlIGhhcyBiZWVuIGNsb3NlZCAqLworCQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQkJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwkJCX0KKwkJCXNwaW5fbG9jaygmcXVvdGFfc3BpbmxvY2spOworCQkJdHhfZW5kX2luZGV4ID0gU0xPVF9RVUVVRV9JTkRFWF9GUk9NX1BPUygKKwkJCQlzdGF0ZS0+bG9jYWxfdHhfcG9zICsgc3RyaWRlIC0gMSk7CisJCX0KKworCQlzcGluX3VubG9jaygmcXVvdGFfc3BpbmxvY2spOworCX0KKworCWhlYWRlciA9IHJlc2VydmVfc3BhY2Uoc3RhdGUsIHN0cmlkZSwgZmxhZ3MgJiBRTUZMQUdTX0lTX0JMT0NLSU5HKTsKKworCWlmICghaGVhZGVyKSB7CisJCWlmIChzZXJ2aWNlKQorCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgc2xvdF9zdGFsbHMpOworCQkvKiBJbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlLCByZXR1cm4gdGhlIG11dGV4IHRvIHRoZQorCQkgICBzdGF0ZSBpdCB3YXMgaW4gKi8KKwkJaWYgKCEoZmxhZ3MgJiBRTUZMQUdTX05PX01VVEVYX0xPQ0spKQorCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CisJCXJldHVybiBWQ0hJUV9SRVRSWTsKKwl9CisKKwlpZiAodHlwZSA9PSBWQ0hJUV9NU0dfREFUQSkgeworCQlpbnQgaSwgcG9zOworCQlpbnQgdHhfZW5kX2luZGV4OworCQlpbnQgc2xvdF91c2VfY291bnQ7CisKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJWQ6IHFtICVzQCV4LCV4ICglZC0+JWQpIiwKKwkJCXN0YXRlLT5pZCwKKwkJCW1zZ190eXBlX3N0cihWQ0hJUV9NU0dfVFlQRShtc2dpZCkpLAorCQkJKHVuc2lnbmVkIGludCloZWFkZXIsIHNpemUsCisJCQlWQ0hJUV9NU0dfU1JDUE9SVChtc2dpZCksCisJCQlWQ0hJUV9NU0dfRFNUUE9SVChtc2dpZCkpOworCisJCUJVR19PTighc2VydmljZSk7CisJCUJVR19PTigoZmxhZ3MgJiAoUU1GTEFHU19OT19NVVRFWF9MT0NLIHwKKwkJCQkgUU1GTEFHU19OT19NVVRFWF9VTkxPQ0spKSAhPSAwKTsKKworCQlmb3IgKGkgPSAwLCBwb3MgPSAwOyBpIDwgKHVuc2lnbmVkIGludCljb3VudDsKKwkJCXBvcyArPSBlbGVtZW50c1tpKytdLnNpemUpCisJCQlpZiAoZWxlbWVudHNbaV0uc2l6ZSkgeworCQkJCWlmICh2Y2hpcV9jb3B5X2Zyb21fdXNlcgorCQkJCQkoaGVhZGVyLT5kYXRhICsgcG9zLCBlbGVtZW50c1tpXS5kYXRhLAorCQkJCQkoc2l6ZV90KSBlbGVtZW50c1tpXS5zaXplKSAhPQorCQkJCQlWQ0hJUV9TVUNDRVNTKSB7CisJCQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLAorCQkJCQkJZXJyb3JfY291bnQpOworCQkJCQlyZXR1cm4gVkNISVFfRVJST1I7CisJCQkJfQorCQkJCWlmIChpID09IDApIHsKKwkJCQkJaWYgKFNSVlRSQUNFX0VOQUJMRUQoc2VydmljZSwKKwkJCQkJCQlWQ0hJUV9MT0dfSU5GTykpCisJCQkJCQl2Y2hpcV9sb2dfZHVtcF9tZW0oIlNlbnQiLCAwLAorCQkJCQkJCWhlYWRlci0+ZGF0YSArIHBvcywKKwkJCQkJCQltaW4oNjR1LAorCQkJCQkJCWVsZW1lbnRzWzBdLnNpemUpKTsKKwkJCQl9CisJCQl9CisKKwkJc3Bpbl9sb2NrKCZxdW90YV9zcGlubG9jayk7CisJCXNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50Kys7CisKKwkJdHhfZW5kX2luZGV4ID0KKwkJCVNMT1RfUVVFVUVfSU5ERVhfRlJPTV9QT1Moc3RhdGUtPmxvY2FsX3R4X3BvcyAtIDEpOworCisJCS8qIElmIHRoaXMgdHJhbnNtaXNzaW9uIGNhbid0IGZpdCBpbiB0aGUgbGFzdCBzbG90IHVzZWQgYnkgYW55CisJCSoqIHNlcnZpY2UsIHRoZSBkYXRhX3VzZV9jb3VudCBtdXN0IGJlIGluY3JlYXNlZC4gKi8KKwkJaWYgKHR4X2VuZF9pbmRleCAhPSBzdGF0ZS0+cHJldmlvdXNfZGF0YV9pbmRleCkgeworCQkJc3RhdGUtPnByZXZpb3VzX2RhdGFfaW5kZXggPSB0eF9lbmRfaW5kZXg7CisJCQlzdGF0ZS0+ZGF0YV91c2VfY291bnQrKzsKKwkJfQorCisJCS8qIElmIHRoaXMgaXNuJ3QgdGhlIHNhbWUgc2xvdCBsYXN0IHVzZWQgYnkgdGhpcyBzZXJ2aWNlLAorCQkqKiB0aGUgc2VydmljZSdzIHNsb3RfdXNlX2NvdW50IG11c3QgYmUgaW5jcmVhc2VkLiAqLworCQlpZiAodHhfZW5kX2luZGV4ICE9IHNlcnZpY2VfcXVvdGEtPnByZXZpb3VzX3R4X2luZGV4KSB7CisJCQlzZXJ2aWNlX3F1b3RhLT5wcmV2aW91c190eF9pbmRleCA9IHR4X2VuZF9pbmRleDsKKwkJCXNsb3RfdXNlX2NvdW50ID0gKytzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudDsKKwkJfSBlbHNlIHsKKwkJCXNsb3RfdXNlX2NvdW50ID0gMDsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZxdW90YV9zcGlubG9jayk7CisKKwkJaWYgKHNsb3RfdXNlX2NvdW50KQorCQkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSIlZDogcW06JWQgJXMsJXggLSBzbG90X3VzZS0+JWQgKGhkciAlcCkiLAorCQkJCXN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LAorCQkJCW1zZ190eXBlX3N0cihWQ0hJUV9NU0dfVFlQRShtc2dpZCkpLCBzaXplLAorCQkJCXNsb3RfdXNlX2NvdW50LCBoZWFkZXIpOworCisJCVZDSElRX1NFUlZJQ0VfU1RBVFNfSU5DKHNlcnZpY2UsIGN0cmxfdHhfY291bnQpOworCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0FERChzZXJ2aWNlLCBjdHJsX3R4X2J5dGVzLCBzaXplKTsKKwl9IGVsc2UgeworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogcW0gJXNAJXgsJXggKCVkLT4lZCkiLCBzdGF0ZS0+aWQsCisJCQltc2dfdHlwZV9zdHIoVkNISVFfTVNHX1RZUEUobXNnaWQpKSwKKwkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplLAorCQkJVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpLAorCQkJVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpKTsKKwkJaWYgKHNpemUgIT0gMCkgeworCQkJV0FSTl9PTighKChjb3VudCA9PSAxKSAmJiAoc2l6ZSA9PSBlbGVtZW50c1swXS5zaXplKSkpOworCQkJbWVtY3B5KGhlYWRlci0+ZGF0YSwgZWxlbWVudHNbMF0uZGF0YSwKKwkJCQllbGVtZW50c1swXS5zaXplKTsKKwkJfQorCQlWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIGN0cmxfdHhfY291bnQpOworCX0KKworCWhlYWRlci0+bXNnaWQgPSBtc2dpZDsKKwloZWFkZXItPnNpemUgPSBzaXplOworCisJeworCQlpbnQgc3ZjX2ZvdXJjYzsKKworCQlzdmNfZm91cmNjID0gc2VydmljZQorCQkJPyBzZXJ2aWNlLT5iYXNlLmZvdXJjYworCQkJOiBWQ0hJUV9NQUtFX0ZPVVJDQygnPycsICc/JywgJz8nLCAnPycpOworCisJCXZjaGlxX2xvZ19pbmZvKFNSVlRSQUNFX0xFVkVMKHNlcnZpY2UpLAorCQkJIlNlbnQgTXNnICVzKCV1KSB0byAlYyVjJWMlYyBzOiV1IGQ6JWQgbGVuOiVkIiwKKwkJCW1zZ190eXBlX3N0cihWQ0hJUV9NU0dfVFlQRShtc2dpZCkpLAorCQkJVkNISVFfTVNHX1RZUEUobXNnaWQpLAorCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhzdmNfZm91cmNjKSwKKwkJCVZDSElRX01TR19TUkNQT1JUKG1zZ2lkKSwKKwkJCVZDSElRX01TR19EU1RQT1JUKG1zZ2lkKSwKKwkJCXNpemUpOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgbmV3IGhlYWRlciBpcyB2aXNpYmxlIHRvIHRoZSBwZWVyLiAqLworCXdtYigpOworCisJLyogTWFrZSB0aGUgbmV3IHR4X3BvcyB2aXNpYmxlIHRvIHRoZSBwZWVyLiAqLworCWxvY2FsLT50eF9wb3MgPSBzdGF0ZS0+bG9jYWxfdHhfcG9zOworCXdtYigpOworCisJaWYgKHNlcnZpY2UgJiYgKHR5cGUgPT0gVkNISVFfTVNHX0NMT1NFKSkKKwkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwgVkNISVFfU1JWU1RBVEVfQ0xPU0VTRU5UKTsKKworCWlmICghKGZsYWdzICYgUU1GTEFHU19OT19NVVRFWF9VTkxPQ0spKQorCQltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKworCXJlbW90ZV9ldmVudF9zaWduYWwoJnN0YXRlLT5yZW1vdGUtPnRyaWdnZXIpOworCisJcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIGFuZCBhcHBsaWNhdGlvbiB0aHJlYWRzICovCitzdGF0aWMgVkNISVFfU1RBVFVTX1QKK3F1ZXVlX21lc3NhZ2Vfc3luYyhWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLAorCWludCBtc2dpZCwgY29uc3QgVkNISVFfRUxFTUVOVF9UICplbGVtZW50cywKKwlpbnQgY291bnQsIGludCBzaXplLCBpbnQgaXNfYmxvY2tpbmcpCit7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKmxvY2FsOworCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisKKwlsb2NhbCA9IHN0YXRlLT5sb2NhbDsKKworCWlmICgoVkNISVFfTVNHX1RZUEUobXNnaWQpICE9IFZDSElRX01TR19SRVNVTUUpICYmCisJCShtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnN0YXRlLT5zeW5jX211dGV4KSAhPSAwKSkKKwkJcmV0dXJuIFZDSElRX1JFVFJZOworCisJcmVtb3RlX2V2ZW50X3dhaXQoJmxvY2FsLT5zeW5jX3JlbGVhc2UpOworCisJcm1iKCk7CisKKwloZWFkZXIgPSAoVkNISVFfSEVBREVSX1QgKilTTE9UX0RBVEFfRlJPTV9JTkRFWChzdGF0ZSwKKwkJbG9jYWwtPnNsb3Rfc3luYyk7CisKKwl7CisJCWludCBvbGRtc2dpZCA9IGhlYWRlci0+bXNnaWQ7CisJCWlmIChvbGRtc2dpZCAhPSBWQ0hJUV9NU0dJRF9QQURESU5HKQorCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSIlZDogcW1zIC0gbXNnaWQgJXgsIG5vdCBQQURESU5HIiwKKwkJCQlzdGF0ZS0+aWQsIG9sZG1zZ2lkKTsKKwl9CisKKwlpZiAoc2VydmljZSkgeworCQlpbnQgaSwgcG9zOworCisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N5bmNfbG9nX2xldmVsLAorCQkJIiVkOiBxbXMgJXNAJXgsJXggKCVkLT4lZCkiLCBzdGF0ZS0+aWQsCisJCQltc2dfdHlwZV9zdHIoVkNISVFfTVNHX1RZUEUobXNnaWQpKSwKKwkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplLAorCQkJVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpLAorCQkJVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpKTsKKworCQlmb3IgKGkgPSAwLCBwb3MgPSAwOyBpIDwgKHVuc2lnbmVkIGludCljb3VudDsKKwkJCXBvcyArPSBlbGVtZW50c1tpKytdLnNpemUpCisJCQlpZiAoZWxlbWVudHNbaV0uc2l6ZSkgeworCQkJCWlmICh2Y2hpcV9jb3B5X2Zyb21fdXNlcgorCQkJCQkoaGVhZGVyLT5kYXRhICsgcG9zLCBlbGVtZW50c1tpXS5kYXRhLAorCQkJCQkoc2l6ZV90KSBlbGVtZW50c1tpXS5zaXplKSAhPQorCQkJCQlWQ0hJUV9TVUNDRVNTKSB7CisJCQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnN5bmNfbXV0ZXgpOworCQkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLAorCQkJCQkJZXJyb3JfY291bnQpOworCQkJCQlyZXR1cm4gVkNISVFfRVJST1I7CisJCQkJfQorCQkJCWlmIChpID09IDApIHsKKwkJCQkJaWYgKHZjaGlxX3N5bmNfbG9nX2xldmVsID49CisJCQkJCQlWQ0hJUV9MT0dfVFJBQ0UpCisJCQkJCQl2Y2hpcV9sb2dfZHVtcF9tZW0oIlNlbnQgU3luYyIsCisJCQkJCQkJMCwgaGVhZGVyLT5kYXRhICsgcG9zLAorCQkJCQkJCW1pbig2NHUsCisJCQkJCQkJZWxlbWVudHNbMF0uc2l6ZSkpOworCQkJCX0KKwkJCX0KKworCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLCBjdHJsX3R4X2NvdW50KTsKKwkJVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwgY3RybF90eF9ieXRlcywgc2l6ZSk7CisJfSBlbHNlIHsKKwkJdmNoaXFfbG9nX2luZm8odmNoaXFfc3luY19sb2dfbGV2ZWwsCisJCQkiJWQ6IHFtcyAlc0AleCwleCAoJWQtPiVkKSIsIHN0YXRlLT5pZCwKKwkJCW1zZ190eXBlX3N0cihWQ0hJUV9NU0dfVFlQRShtc2dpZCkpLAorCQkJKHVuc2lnbmVkIGludCloZWFkZXIsIHNpemUsCisJCQlWQ0hJUV9NU0dfU1JDUE9SVChtc2dpZCksCisJCQlWQ0hJUV9NU0dfRFNUUE9SVChtc2dpZCkpOworCQlpZiAoc2l6ZSAhPSAwKSB7CisJCQlXQVJOX09OKCEoKGNvdW50ID09IDEpICYmIChzaXplID09IGVsZW1lbnRzWzBdLnNpemUpKSk7CisJCQltZW1jcHkoaGVhZGVyLT5kYXRhLCBlbGVtZW50c1swXS5kYXRhLAorCQkJCWVsZW1lbnRzWzBdLnNpemUpOworCQl9CisJCVZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgY3RybF90eF9jb3VudCk7CisJfQorCisJaGVhZGVyLT5zaXplID0gc2l6ZTsKKwloZWFkZXItPm1zZ2lkID0gbXNnaWQ7CisKKwlpZiAodmNoaXFfc3luY19sb2dfbGV2ZWwgPj0gVkNISVFfTE9HX1RSQUNFKSB7CisJCWludCBzdmNfZm91cmNjOworCisJCXN2Y19mb3VyY2MgPSBzZXJ2aWNlCisJCQk/IHNlcnZpY2UtPmJhc2UuZm91cmNjCisJCQk6IFZDSElRX01BS0VfRk9VUkNDKCc/JywgJz8nLCAnPycsICc/Jyk7CisKKwkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N5bmNfbG9nX2xldmVsLAorCQkJIlNlbnQgU3luYyBNc2cgJXMoJXUpIHRvICVjJWMlYyVjIHM6JXUgZDolZCBsZW46JWQiLAorCQkJbXNnX3R5cGVfc3RyKFZDSElRX01TR19UWVBFKG1zZ2lkKSksCisJCQlWQ0hJUV9NU0dfVFlQRShtc2dpZCksCisJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKHN2Y19mb3VyY2MpLAorCQkJVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpLAorCQkJVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpLAorCQkJc2l6ZSk7CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBuZXcgaGVhZGVyIGlzIHZpc2libGUgdG8gdGhlIHBlZXIuICovCisJd21iKCk7CisKKwlyZW1vdGVfZXZlbnRfc2lnbmFsKCZzdGF0ZS0+cmVtb3RlLT5zeW5jX3RyaWdnZXIpOworCisJaWYgKFZDSElRX01TR19UWVBFKG1zZ2lkKSAhPSBWQ0hJUV9NU0dfUEFVU0UpCisJCW11dGV4X3VubG9jaygmc3RhdGUtPnN5bmNfbXV0ZXgpOworCisJcmV0dXJuIFZDSElRX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2xhaW1fc2xvdChWQ0hJUV9TTE9UX0lORk9fVCAqc2xvdCkKK3sKKwlzbG90LT51c2VfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQKK3JlbGVhc2Vfc2xvdChWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0xPVF9JTkZPX1QgKnNsb3RfaW5mbywKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyLCBWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJaW50IHJlbGVhc2VfY291bnQ7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+cmVjeWNsZV9tdXRleCk7CisKKwlpZiAoaGVhZGVyKSB7CisJCWludCBtc2dpZCA9IGhlYWRlci0+bXNnaWQ7CisJCWlmICgoKG1zZ2lkICYgVkNISVFfTVNHSURfQ0xBSU1FRCkgPT0gMCkgfHwKKwkJCShzZXJ2aWNlICYmIHNlcnZpY2UtPmNsb3NpbmcpKSB7CisJCQltdXRleF91bmxvY2soJnN0YXRlLT5yZWN5Y2xlX211dGV4KTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIFJld3JpdGUgdGhlIG1lc3NhZ2UgaGVhZGVyIHRvIHByZXZlbnQgYSBkb3VibGUKKwkJKiogcmVsZWFzZSAqLworCQloZWFkZXItPm1zZ2lkID0gbXNnaWQgJiB+VkNISVFfTVNHSURfQ0xBSU1FRDsKKwl9CisKKwlyZWxlYXNlX2NvdW50ID0gc2xvdF9pbmZvLT5yZWxlYXNlX2NvdW50OworCXNsb3RfaW5mby0+cmVsZWFzZV9jb3VudCA9ICsrcmVsZWFzZV9jb3VudDsKKworCWlmIChyZWxlYXNlX2NvdW50ID09IHNsb3RfaW5mby0+dXNlX2NvdW50KSB7CisJCWludCBzbG90X3F1ZXVlX3JlY3ljbGU7CisJCS8qIEFkZCB0byB0aGUgZnJlZWQgcXVldWUgKi8KKworCQkvKiBBIHJlYWQgYmFycmllciBpcyBuZWNlc3NhcnkgaGVyZSB0byBwcmV2ZW50IHNwZWN1bGF0aXZlCisJCSoqIGZldGNoZXMgb2YgcmVtb3RlLT5zbG90X3F1ZXVlX3JlY3ljbGUgZnJvbSBvdmVydGFraW5nIHRoZQorCQkqKiBtdXRleC4gKi8KKwkJcm1iKCk7CisKKwkJc2xvdF9xdWV1ZV9yZWN5Y2xlID0gc3RhdGUtPnJlbW90ZS0+c2xvdF9xdWV1ZV9yZWN5Y2xlOworCQlzdGF0ZS0+cmVtb3RlLT5zbG90X3F1ZXVlW3Nsb3RfcXVldWVfcmVjeWNsZSAmCisJCQlWQ0hJUV9TTE9UX1FVRVVFX01BU0tdID0KKwkJCVNMT1RfSU5ERVhfRlJPTV9JTkZPKHN0YXRlLCBzbG90X2luZm8pOworCQlzdGF0ZS0+cmVtb3RlLT5zbG90X3F1ZXVlX3JlY3ljbGUgPSBzbG90X3F1ZXVlX3JlY3ljbGUgKyAxOworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogcmVsZWFzZV9zbG90ICVkIC0gcmVjeWNsZS0+JXgiLAorCQkJc3RhdGUtPmlkLCBTTE9UX0lOREVYX0ZST01fSU5GTyhzdGF0ZSwgc2xvdF9pbmZvKSwKKwkJCXN0YXRlLT5yZW1vdGUtPnNsb3RfcXVldWVfcmVjeWNsZSk7CisKKwkJLyogQSB3cml0ZSBiYXJyaWVyIGlzIG5lY2Vzc2FyeSwgYnV0IHJlbW90ZV9ldmVudF9zaWduYWwKKwkJKiogY29udGFpbnMgb25lLiAqLworCQlyZW1vdGVfZXZlbnRfc2lnbmFsKCZzdGF0ZS0+cmVtb3RlLT5yZWN5Y2xlKTsKKwl9CisKKwltdXRleF91bmxvY2soJnN0YXRlLT5yZWN5Y2xlX211dGV4KTsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgLSBkb24ndCBob2xkIHRoZSBidWxrIG11dGV4ICovCitzdGF0aWMgVkNISVFfU1RBVFVTX1QKK25vdGlmeV9idWxrcyhWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIFZDSElRX0JVTEtfUVVFVUVfVCAqcXVldWUsCisJaW50IHJldHJ5X3BvbGwpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVkOiBuYjolZCAlY3ggLSBwPSV4IHJuPSV4IHI9JXgiLAorCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJKHF1ZXVlID09ICZzZXJ2aWNlLT5idWxrX3R4KSA/ICd0JyA6ICdyJywKKwkJcXVldWUtPnByb2Nlc3MsIHF1ZXVlLT5yZW1vdGVfbm90aWZ5LCBxdWV1ZS0+cmVtb3ZlKTsKKworCWlmIChzZXJ2aWNlLT5zdGF0ZS0+aXNfbWFzdGVyKSB7CisJCXdoaWxlIChxdWV1ZS0+cmVtb3RlX25vdGlmeSAhPSBxdWV1ZS0+cHJvY2VzcykgeworCQkJVkNISVFfQlVMS19UICpidWxrID0KKwkJCQkmcXVldWUtPmJ1bGtzW0JVTEtfSU5ERVgocXVldWUtPnJlbW90ZV9ub3RpZnkpXTsKKwkJCWludCBtc2d0eXBlID0gKGJ1bGstPmRpciA9PSBWQ0hJUV9CVUxLX1RSQU5TTUlUKSA/CisJCQkJVkNISVFfTVNHX0JVTEtfUlhfRE9ORSA6IFZDSElRX01TR19CVUxLX1RYX0RPTkU7CisJCQlpbnQgbXNnaWQgPSBWQ0hJUV9NQUtFX01TRyhtc2d0eXBlLCBzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJc2VydmljZS0+cmVtb3RlcG9ydCk7CisJCQlWQ0hJUV9FTEVNRU5UX1QgZWxlbWVudCA9IHsgJmJ1bGstPmFjdHVhbCwgNCB9OworCQkJLyogT25seSByZXBseSB0byBub24tZHVtbXkgYnVsayByZXF1ZXN0cyAqLworCQkJaWYgKGJ1bGstPnJlbW90ZV9kYXRhKSB7CisJCQkJc3RhdHVzID0gcXVldWVfbWVzc2FnZShzZXJ2aWNlLT5zdGF0ZSwgTlVMTCwKKwkJCQkJbXNnaWQsICZlbGVtZW50LCAxLCA0LCAwKTsKKwkJCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpCisJCQkJCWJyZWFrOworCQkJfQorCQkJcXVldWUtPnJlbW90ZV9ub3RpZnkrKzsKKwkJfQorCX0gZWxzZSB7CisJCXF1ZXVlLT5yZW1vdGVfbm90aWZ5ID0gcXVldWUtPnByb2Nlc3M7CisJfQorCisJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSB7CisJCXdoaWxlIChxdWV1ZS0+cmVtb3ZlICE9IHF1ZXVlLT5yZW1vdGVfbm90aWZ5KSB7CisJCQlWQ0hJUV9CVUxLX1QgKmJ1bGsgPQorCQkJCSZxdWV1ZS0+YnVsa3NbQlVMS19JTkRFWChxdWV1ZS0+cmVtb3ZlKV07CisKKwkJCS8qIE9ubHkgZ2VuZXJhdGUgY2FsbGJhY2tzIGZvciBub24tZHVtbXkgYnVsaworCQkJKiogcmVxdWVzdHMsIGFuZCBub24tdGVybWluYXRlZCBzZXJ2aWNlcyAqLworCQkJaWYgKGJ1bGstPmRhdGEgJiYgc2VydmljZS0+aW5zdGFuY2UpIHsKKwkJCQlpZiAoYnVsay0+YWN0dWFsICE9IFZDSElRX0JVTEtfQUNUVUFMX0FCT1JURUQpIHsKKwkJCQkJaWYgKGJ1bGstPmRpciA9PSBWQ0hJUV9CVUxLX1RSQU5TTUlUKSB7CisJCQkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLAorCQkJCQkJCWJ1bGtfdHhfY291bnQpOworCQkJCQkJVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwKKwkJCQkJCQlidWxrX3R4X2J5dGVzLAorCQkJCQkJCWJ1bGstPmFjdHVhbCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLAorCQkJCQkJCWJ1bGtfcnhfY291bnQpOworCQkJCQkJVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwKKwkJCQkJCQlidWxrX3J4X2J5dGVzLAorCQkJCQkJCWJ1bGstPmFjdHVhbCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLAorCQkJCQkJYnVsa19hYm9ydGVkX2NvdW50KTsKKwkJCQl9CisJCQkJaWYgKGJ1bGstPm1vZGUgPT0gVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HKSB7CisJCQkJCXN0cnVjdCBidWxrX3dhaXRlciAqd2FpdGVyOworCQkJCQlzcGluX2xvY2soJmJ1bGtfd2FpdGVyX3NwaW5sb2NrKTsKKwkJCQkJd2FpdGVyID0gYnVsay0+dXNlcmRhdGE7CisJCQkJCWlmICh3YWl0ZXIpIHsKKwkJCQkJCXdhaXRlci0+YWN0dWFsID0gYnVsay0+YWN0dWFsOworCQkJCQkJdXAoJndhaXRlci0+ZXZlbnQpOworCQkJCQl9CisJCQkJCXNwaW5fdW5sb2NrKCZidWxrX3dhaXRlcl9zcGlubG9jayk7CisJCQkJfSBlbHNlIGlmIChidWxrLT5tb2RlID09CisJCQkJCVZDSElRX0JVTEtfTU9ERV9DQUxMQkFDSykgeworCQkJCQlWQ0hJUV9SRUFTT05fVCByZWFzb24gPSAoYnVsay0+ZGlyID09CisJCQkJCQlWQ0hJUV9CVUxLX1RSQU5TTUlUKSA/CisJCQkJCQkoKGJ1bGstPmFjdHVhbCA9PQorCQkJCQkJVkNISVFfQlVMS19BQ1RVQUxfQUJPUlRFRCkgPworCQkJCQkJVkNISVFfQlVMS19UUkFOU01JVF9BQk9SVEVEIDoKKwkJCQkJCVZDSElRX0JVTEtfVFJBTlNNSVRfRE9ORSkgOgorCQkJCQkJKChidWxrLT5hY3R1YWwgPT0KKwkJCQkJCVZDSElRX0JVTEtfQUNUVUFMX0FCT1JURUQpID8KKwkJCQkJCVZDSElRX0JVTEtfUkVDRUlWRV9BQk9SVEVEIDoKKwkJCQkJCVZDSElRX0JVTEtfUkVDRUlWRV9ET05FKTsKKwkJCQkJc3RhdHVzID0gbWFrZV9zZXJ2aWNlX2NhbGxiYWNrKHNlcnZpY2UsCisJCQkJCQlyZWFzb24sCU5VTEwsIGJ1bGstPnVzZXJkYXRhKTsKKwkJCQkJaWYgKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJcXVldWUtPnJlbW92ZSsrOworCQkJdXAoJnNlcnZpY2UtPmJ1bGtfcmVtb3ZlX2V2ZW50KTsKKwkJfQorCQlpZiAoIXJldHJ5X3BvbGwpCisJCQlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCX0KKworCWlmIChzdGF0dXMgPT0gVkNISVFfUkVUUlkpCisJCXJlcXVlc3RfcG9sbChzZXJ2aWNlLT5zdGF0ZSwgc2VydmljZSwKKwkJCShxdWV1ZSA9PSAmc2VydmljZS0+YnVsa190eCkgPworCQkJVkNISVFfUE9MTF9UWE5PVElGWSA6IFZDSElRX1BPTExfUlhOT1RJRlkpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkICovCitzdGF0aWMgdm9pZAorcG9sbF9zZXJ2aWNlcyhWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlpbnQgZ3JvdXAsIGk7CisKKwlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBCSVRTRVRfU0laRShzdGF0ZS0+dW51c2VkX3NlcnZpY2UpOyBncm91cCsrKSB7CisJCXVpbnQzMl90IGZsYWdzOworCQlmbGFncyA9IGF0b21pY194Y2hnKCZzdGF0ZS0+cG9sbF9zZXJ2aWNlc1tncm91cF0sIDApOworCQlmb3IgKGkgPSAwOyBmbGFnczsgaSsrKSB7CisJCQlpZiAoZmxhZ3MgJiAoMSA8PCBpKSkgeworCQkJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9CisJCQkJCWZpbmRfc2VydmljZV9ieV9wb3J0KHN0YXRlLAorCQkJCQkJKGdyb3VwPDw1KSArIGkpOworCQkJCXVpbnQzMl90IHNlcnZpY2VfZmxhZ3M7CisJCQkJZmxhZ3MgJj0gfigxIDw8IGkpOworCQkJCWlmICghc2VydmljZSkKKwkJCQkJY29udGludWU7CisJCQkJc2VydmljZV9mbGFncyA9CisJCQkJCWF0b21pY194Y2hnKCZzZXJ2aWNlLT5wb2xsX2ZsYWdzLCAwKTsKKwkJCQlpZiAoc2VydmljZV9mbGFncyAmCisJCQkJCSgxIDw8IFZDSElRX1BPTExfUkVNT1ZFKSkgeworCQkJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCSIlZDogcHMgLSByZW1vdmUgJWQ8LT4lZCIsCisJCQkJCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQpOworCisJCQkJCS8qIE1ha2UgaXQgbG9vayBsaWtlIGEgY2xpZW50LCBiZWNhdXNlCisJCQkJCSAgIGl0IG11c3QgYmUgcmVtb3ZlZCBhbmQgbm90IGxlZnQgaW4KKwkJCQkJICAgdGhlIExJU1RFTklORyBzdGF0ZS4gKi8KKwkJCQkJc2VydmljZS0+cHVibGljX2ZvdXJjYyA9CisJCQkJCQlWQ0hJUV9GT1VSQ0NfSU5WQUxJRDsKKworCQkJCQlpZiAodmNoaXFfY2xvc2Vfc2VydmljZV9pbnRlcm5hbCgKKwkJCQkJCXNlcnZpY2UsIDAvKiFjbG9zZV9yZWN2ZCovKSAhPQorCQkJCQkJVkNISVFfU1VDQ0VTUykKKwkJCQkJCXJlcXVlc3RfcG9sbChzdGF0ZSwgc2VydmljZSwKKwkJCQkJCQlWQ0hJUV9QT0xMX1JFTU9WRSk7CisJCQkJfSBlbHNlIGlmIChzZXJ2aWNlX2ZsYWdzICYKKwkJCQkJKDEgPDwgVkNISVFfUE9MTF9URVJNSU5BVEUpKSB7CisJCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJIiVkOiBwcyAtIHRlcm1pbmF0ZSAlZDwtPiVkIiwKKwkJCQkJCXN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LAorCQkJCQkJc2VydmljZS0+cmVtb3RlcG9ydCk7CisJCQkJCWlmICh2Y2hpcV9jbG9zZV9zZXJ2aWNlX2ludGVybmFsKAorCQkJCQkJc2VydmljZSwgMC8qIWNsb3NlX3JlY3ZkKi8pICE9CisJCQkJCQlWQ0hJUV9TVUNDRVNTKQorCQkJCQkJcmVxdWVzdF9wb2xsKHN0YXRlLCBzZXJ2aWNlLAorCQkJCQkJCVZDSElRX1BPTExfVEVSTUlOQVRFKTsKKwkJCQl9CisJCQkJaWYgKHNlcnZpY2VfZmxhZ3MgJiAoMSA8PCBWQ0hJUV9QT0xMX1RYTk9USUZZKSkKKwkJCQkJbm90aWZ5X2J1bGtzKHNlcnZpY2UsCisJCQkJCQkmc2VydmljZS0+YnVsa190eCwKKwkJCQkJCTEvKnJldHJ5X3BvbGwqLyk7CisJCQkJaWYgKHNlcnZpY2VfZmxhZ3MgJiAoMSA8PCBWQ0hJUV9QT0xMX1JYTk9USUZZKSkKKwkJCQkJbm90aWZ5X2J1bGtzKHNlcnZpY2UsCisJCQkJCQkmc2VydmljZS0+YnVsa19yeCwKKwkJCQkJCTEvKnJldHJ5X3BvbGwqLyk7CisJCQkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIG9yIGFwcGxpY2F0aW9uIHRocmVhZHMsIGhvbGRpbmcgdGhlIGJ1bGsgbXV0ZXguICovCitzdGF0aWMgaW50CityZXNvbHZlX2J1bGtzKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwgVkNISVFfQlVMS19RVUVVRV9UICpxdWV1ZSkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCWludCByZXNvbHZlZCA9IDA7CisJaW50IHJjOworCisJd2hpbGUgKChxdWV1ZS0+cHJvY2VzcyAhPSBxdWV1ZS0+bG9jYWxfaW5zZXJ0KSAmJgorCQkocXVldWUtPnByb2Nlc3MgIT0gcXVldWUtPnJlbW90ZV9pbnNlcnQpKSB7CisJCVZDSElRX0JVTEtfVCAqYnVsayA9ICZxdWV1ZS0+YnVsa3NbQlVMS19JTkRFWChxdWV1ZS0+cHJvY2VzcyldOworCisJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogcmI6JWQgJWN4IC0gbGk9JXggcmk9JXggcD0leCIsCisJCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCShxdWV1ZSA9PSAmc2VydmljZS0+YnVsa190eCkgPyAndCcgOiAncicsCisJCQlxdWV1ZS0+bG9jYWxfaW5zZXJ0LCBxdWV1ZS0+cmVtb3RlX2luc2VydCwKKwkJCXF1ZXVlLT5wcm9jZXNzKTsKKworCQlXQVJOX09OKCEoKGludCkocXVldWUtPmxvY2FsX2luc2VydCAtIHF1ZXVlLT5wcm9jZXNzKSA+IDApKTsKKwkJV0FSTl9PTighKChpbnQpKHF1ZXVlLT5yZW1vdGVfaW5zZXJ0IC0gcXVldWUtPnByb2Nlc3MpID4gMCkpOworCisJCXJjID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+YnVsa190cmFuc2Zlcl9tdXRleCk7CisJCWlmIChyYyAhPSAwKQorCQkJYnJlYWs7CisKKwkJdmNoaXFfdHJhbnNmZXJfYnVsayhidWxrKTsKKwkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+YnVsa190cmFuc2Zlcl9tdXRleCk7CisKKwkJaWYgKFNSVlRSQUNFX0VOQUJMRUQoc2VydmljZSwgVkNISVFfTE9HX0lORk8pKSB7CisJCQljb25zdCBjaGFyICpoZWFkZXIgPSAocXVldWUgPT0gJnNlcnZpY2UtPmJ1bGtfdHgpID8KKwkJCQkiU2VuZCBCdWxrIHRvIiA6ICJSZWN2IEJ1bGsgZnJvbSI7CisJCQlpZiAoYnVsay0+YWN0dWFsICE9IFZDSElRX0JVTEtfQUNUVUFMX0FCT1JURUQpCisJCQkJdmNoaXFfbG9nX2luZm8oU1JWVFJBQ0VfTEVWRUwoc2VydmljZSksCisJCQkJCSIlcyAlYyVjJWMlYyBkOiVkIGxlbjolZCAleDwtPiV4IiwKKwkJCQkJaGVhZGVyLAorCQkJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKAorCQkJCQkJc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0LAorCQkJCQlidWxrLT5zaXplLAorCQkJCQkodW5zaWduZWQgaW50KWJ1bGstPmRhdGEsCisJCQkJCSh1bnNpZ25lZCBpbnQpYnVsay0+cmVtb3RlX2RhdGEpOworCQkJZWxzZQorCQkJCXZjaGlxX2xvZ19pbmZvKFNSVlRSQUNFX0xFVkVMKHNlcnZpY2UpLAorCQkJCQkiJXMgJWMlYyVjJWMgZDolZCBBQk9SVEVEIC0gdHggbGVuOiVkLCIKKwkJCQkJIiByeCBsZW46JWQgJXg8LT4leCIsCisJCQkJCWhlYWRlciwKKwkJCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUygKKwkJCQkJCXNlcnZpY2UtPmJhc2UuZm91cmNjKSwKKwkJCQkJc2VydmljZS0+cmVtb3RlcG9ydCwKKwkJCQkJYnVsay0+c2l6ZSwKKwkJCQkJYnVsay0+cmVtb3RlX3NpemUsCisJCQkJCSh1bnNpZ25lZCBpbnQpYnVsay0+ZGF0YSwKKwkJCQkJKHVuc2lnbmVkIGludClidWxrLT5yZW1vdGVfZGF0YSk7CisJCX0KKworCQl2Y2hpcV9jb21wbGV0ZV9idWxrKGJ1bGspOworCQlxdWV1ZS0+cHJvY2VzcysrOworCQlyZXNvbHZlZCsrOworCX0KKwlyZXR1cm4gcmVzb2x2ZWQ7Cit9CisKKy8qIENhbGxlZCB3aXRoIHRoZSBidWxrX211dGV4IGhlbGQgKi8KK3N0YXRpYyB2b2lkCithYm9ydF9vdXRzdGFuZGluZ19idWxrcyhWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIFZDSElRX0JVTEtfUVVFVUVfVCAqcXVldWUpCit7CisJaW50IGlzX3R4ID0gKHF1ZXVlID09ICZzZXJ2aWNlLT5idWxrX3R4KTsKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlZDogYW9iOiVkICVjeCAtIGxpPSV4IHJpPSV4IHA9JXgiLAorCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwgaXNfdHggPyAndCcgOiAncicsCisJCXF1ZXVlLT5sb2NhbF9pbnNlcnQsIHF1ZXVlLT5yZW1vdGVfaW5zZXJ0LCBxdWV1ZS0+cHJvY2Vzcyk7CisKKwlXQVJOX09OKCEoKGludCkocXVldWUtPmxvY2FsX2luc2VydCAtIHF1ZXVlLT5wcm9jZXNzKSA+PSAwKSk7CisJV0FSTl9PTighKChpbnQpKHF1ZXVlLT5yZW1vdGVfaW5zZXJ0IC0gcXVldWUtPnByb2Nlc3MpID49IDApKTsKKworCXdoaWxlICgocXVldWUtPnByb2Nlc3MgIT0gcXVldWUtPmxvY2FsX2luc2VydCkgfHwKKwkJKHF1ZXVlLT5wcm9jZXNzICE9IHF1ZXVlLT5yZW1vdGVfaW5zZXJ0KSkgeworCQlWQ0hJUV9CVUxLX1QgKmJ1bGsgPSAmcXVldWUtPmJ1bGtzW0JVTEtfSU5ERVgocXVldWUtPnByb2Nlc3MpXTsKKworCQlpZiAocXVldWUtPnByb2Nlc3MgPT0gcXVldWUtPnJlbW90ZV9pbnNlcnQpIHsKKwkJCS8qIGZhYnJpY2F0ZSBhIG1hdGNoaW5nIGR1bW15IGJ1bGsgKi8KKwkJCWJ1bGstPnJlbW90ZV9kYXRhID0gTlVMTDsKKwkJCWJ1bGstPnJlbW90ZV9zaXplID0gMDsKKwkJCXF1ZXVlLT5yZW1vdGVfaW5zZXJ0Kys7CisJCX0KKworCQlpZiAocXVldWUtPnByb2Nlc3MgIT0gcXVldWUtPmxvY2FsX2luc2VydCkgeworCQkJdmNoaXFfY29tcGxldGVfYnVsayhidWxrKTsKKworCQkJdmNoaXFfbG9nX2luZm8oU1JWVFJBQ0VfTEVWRUwoc2VydmljZSksCisJCQkJIiVzICVjJWMlYyVjIGQ6JWQgQUJPUlRFRCAtIHR4IGxlbjolZCwgIgorCQkJCSJyeCBsZW46JWQiLAorCQkJCWlzX3R4ID8gIlNlbmQgQnVsayB0byIgOiAiUmVjdiBCdWxrIGZyb20iLAorCQkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQsCisJCQkJYnVsay0+c2l6ZSwKKwkJCQlidWxrLT5yZW1vdGVfc2l6ZSk7CisJCX0gZWxzZSB7CisJCQkvKiBmYWJyaWNhdGUgYSBtYXRjaGluZyBkdW1teSBidWxrICovCisJCQlidWxrLT5kYXRhID0gTlVMTDsKKwkJCWJ1bGstPnNpemUgPSAwOworCQkJYnVsay0+YWN0dWFsID0gVkNISVFfQlVMS19BQ1RVQUxfQUJPUlRFRDsKKwkJCWJ1bGstPmRpciA9IGlzX3R4ID8gVkNISVFfQlVMS19UUkFOU01JVCA6CisJCQkJVkNISVFfQlVMS19SRUNFSVZFOworCQkJcXVldWUtPmxvY2FsX2luc2VydCsrOworCQl9CisKKwkJcXVldWUtPnByb2Nlc3MrKzsKKwl9Cit9CisKKy8qIENhbGxlZCBmcm9tIHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkICovCitzdGF0aWMgdm9pZAorcGF1c2VfYnVsa3MoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJaWYgKHVubGlrZWx5KGF0b21pY19pbmNfcmV0dXJuKCZwYXVzZV9idWxrc19jb3VudCkgIT0gMSkpIHsKKwkJV0FSTl9PTl9PTkNFKDEpOworCQlhdG9taWNfc2V0KCZwYXVzZV9idWxrc19jb3VudCwgMSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBCbG9jayBidWxrIHRyYW5zZmVycyBmcm9tIGFsbCBzZXJ2aWNlcyAqLworCW11dGV4X2xvY2soJnN0YXRlLT5idWxrX3RyYW5zZmVyX211dGV4KTsKK30KKworLyogQ2FsbGVkIGZyb20gdGhlIHNsb3QgaGFuZGxlciB0aHJlYWQgKi8KK3N0YXRpYyB2b2lkCityZXN1bWVfYnVsa3MoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJaW50IGk7CisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfcmV0dXJuKCZwYXVzZV9idWxrc19jb3VudCkgIT0gMCkpIHsKKwkJV0FSTl9PTl9PTkNFKDEpOworCQlhdG9taWNfc2V0KCZwYXVzZV9idWxrc19jb3VudCwgMCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBBbGxvdyBidWxrIHRyYW5zZmVycyBmcm9tIGFsbCBzZXJ2aWNlcyAqLworCW11dGV4X3VubG9jaygmc3RhdGUtPmJ1bGtfdHJhbnNmZXJfbXV0ZXgpOworCisJaWYgKHN0YXRlLT5kZWZlcnJlZF9idWxrcyA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBEZWFsIHdpdGggYW55IGJ1bGtzIHdoaWNoIGhhZCB0byBiZSBkZWZlcnJlZCBkdWUgdG8gYmVpbmcgaW4KKwkgKiBwYXVzZWQgc3RhdGUuICBEb24ndCB0cnkgdG8gbWF0Y2ggdXAgdG8gbnVtYmVyIG9mIGRlZmVycmVkIGJ1bGtzCisJICogaW4gY2FzZSB3ZSd2ZSBoYWQgc29tZXRoaW5nIGNvbWUgYW5kIGNsb3NlIHRoZSBzZXJ2aWNlIGluIHRoZQorCSAqIGludGVyaW0gLSBqdXN0IHByb2Nlc3MgYWxsIGJ1bGsgcXVldWVzIGZvciBhbGwgc2VydmljZXMgKi8KKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwgIiVzOiBwcm9jZXNzaW5nICVkIGRlZmVycmVkIGJ1bGtzIiwKKwkJX19mdW5jX18sIHN0YXRlLT5kZWZlcnJlZF9idWxrcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPnVudXNlZF9zZXJ2aWNlOyBpKyspIHsKKwkJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gc3RhdGUtPnNlcnZpY2VzW2ldOworCQlpbnQgcmVzb2x2ZWRfcnggPSAwOworCQlpbnQgcmVzb2x2ZWRfdHggPSAwOworCQlpZiAoIXNlcnZpY2UgfHwgKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX09QRU4pKQorCQkJY29udGludWU7CisKKwkJbXV0ZXhfbG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisJCXJlc29sdmVkX3J4ID0gcmVzb2x2ZV9idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa19yeCk7CisJCXJlc29sdmVkX3R4ID0gcmVzb2x2ZV9idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa190eCk7CisJCW11dGV4X3VubG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisJCWlmIChyZXNvbHZlZF9yeCkKKwkJCW5vdGlmeV9idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa19yeCwgMSk7CisJCWlmIChyZXNvbHZlZF90eCkKKwkJCW5vdGlmeV9idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa190eCwgMSk7CisJfQorCXN0YXRlLT5kZWZlcnJlZF9idWxrcyA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3BhcnNlX29wZW4oVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX0hFQURFUl9UICpoZWFkZXIpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gTlVMTDsKKwlpbnQgbXNnaWQsIHNpemU7CisJaW50IHR5cGU7CisJdW5zaWduZWQgaW50IGxvY2FscG9ydCwgcmVtb3RlcG9ydDsKKworCW1zZ2lkID0gaGVhZGVyLT5tc2dpZDsKKwlzaXplID0gaGVhZGVyLT5zaXplOworCXR5cGUgPSBWQ0hJUV9NU0dfVFlQRShtc2dpZCk7CisJbG9jYWxwb3J0ID0gVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpOworCXJlbW90ZXBvcnQgPSBWQ0hJUV9NU0dfU1JDUE9SVChtc2dpZCk7CisJaWYgKHNpemUgPj0gc2l6ZW9mKHN0cnVjdCB2Y2hpcV9vcGVuX3BheWxvYWQpKSB7CisJCWNvbnN0IHN0cnVjdCB2Y2hpcV9vcGVuX3BheWxvYWQgKnBheWxvYWQgPQorCQkJKHN0cnVjdCB2Y2hpcV9vcGVuX3BheWxvYWQgKiloZWFkZXItPmRhdGE7CisJCXVuc2lnbmVkIGludCBmb3VyY2M7CisKKwkJZm91cmNjID0gcGF5bG9hZC0+Zm91cmNjOworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogcHJzIE9QRU5AJXggKCVkLT4nJWMlYyVjJWMnKSIsCisJCQlzdGF0ZS0+aWQsICh1bnNpZ25lZCBpbnQpaGVhZGVyLAorCQkJbG9jYWxwb3J0LAorCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhmb3VyY2MpKTsKKworCQlzZXJ2aWNlID0gZ2V0X2xpc3RlbmluZ19zZXJ2aWNlKHN0YXRlLCBmb3VyY2MpOworCisJCWlmIChzZXJ2aWNlKSB7CisJCQkvKiBBIG1hdGNoaW5nIHNlcnZpY2UgZXhpc3RzICovCisJCQlzaG9ydCB2ZXJzaW9uID0gcGF5bG9hZC0+dmVyc2lvbjsKKwkJCXNob3J0IHZlcnNpb25fbWluID0gcGF5bG9hZC0+dmVyc2lvbl9taW47CisJCQlpZiAoKHNlcnZpY2UtPnZlcnNpb24gPCB2ZXJzaW9uX21pbikgfHwKKwkJCQkodmVyc2lvbiA8IHNlcnZpY2UtPnZlcnNpb25fbWluKSkgeworCQkJCS8qIFZlcnNpb24gbWlzbWF0Y2ggKi8KKwkJCQl2Y2hpcV9sb3VkX2Vycm9yX2hlYWRlcigpOworCQkJCXZjaGlxX2xvdWRfZXJyb3IoIiVkOiBzZXJ2aWNlICVkICglYyVjJWMlYykgIgorCQkJCQkidmVyc2lvbiBtaXNtYXRjaCAtIGxvY2FsICglZCwgbWluICVkKSIKKwkJCQkJIiB2cy4gcmVtb3RlICglZCwgbWluICVkKSIsCisJCQkJCXN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LAorCQkJCQlWQ0hJUV9GT1VSQ0NfQVNfNENIQVJTKGZvdXJjYyksCisJCQkJCXNlcnZpY2UtPnZlcnNpb24sIHNlcnZpY2UtPnZlcnNpb25fbWluLAorCQkJCQl2ZXJzaW9uLCB2ZXJzaW9uX21pbik7CisJCQkJdmNoaXFfbG91ZF9lcnJvcl9mb290ZXIoKTsKKwkJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJCQlzZXJ2aWNlID0gTlVMTDsKKwkJCQlnb3RvIGZhaWxfb3BlbjsKKwkJCX0KKwkJCXNlcnZpY2UtPnBlZXJfdmVyc2lvbiA9IHZlcnNpb247CisKKwkJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpIHsKKwkJCQlzdHJ1Y3QgdmNoaXFfb3BlbmFja19wYXlsb2FkIGFja19wYXlsb2FkID0geworCQkJCQlzZXJ2aWNlLT52ZXJzaW9uCisJCQkJfTsKKwkJCQlWQ0hJUV9FTEVNRU5UX1QgYm9keSA9IHsKKwkJCQkJJmFja19wYXlsb2FkLAorCQkJCQlzaXplb2YoYWNrX3BheWxvYWQpCisJCQkJfTsKKworCQkJCWlmIChzdGF0ZS0+dmVyc2lvbl9jb21tb24gPAorCQkJCSAgICBWQ0hJUV9WRVJTSU9OX1NZTkNIUk9OT1VTX01PREUpCisJCQkJCXNlcnZpY2UtPnN5bmMgPSAwOworCisJCQkJLyogQWNrbm93bGVkZ2UgdGhlIE9QRU4gKi8KKwkJCQlpZiAoc2VydmljZS0+c3luYyAmJgorCQkJCSAgICAoc3RhdGUtPnZlcnNpb25fY29tbW9uID49CisJCQkJICAgICBWQ0hJUV9WRVJTSU9OX1NZTkNIUk9OT1VTX01PREUpKSB7CisJCQkJCWlmIChxdWV1ZV9tZXNzYWdlX3N5bmMoc3RhdGUsIE5VTEwsCisJCQkJCQlWQ0hJUV9NQUtFX01TRygKKwkJCQkJCQlWQ0hJUV9NU0dfT1BFTkFDSywKKwkJCQkJCQlzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJCQkJcmVtb3RlcG9ydCksCisJCQkJCQkmYm9keSwgMSwgc2l6ZW9mKGFja19wYXlsb2FkKSwKKwkJCQkJCTApID09IFZDSElRX1JFVFJZKQorCQkJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocXVldWVfbWVzc2FnZShzdGF0ZSwgTlVMTCwKKwkJCQkJCVZDSElRX01BS0VfTVNHKAorCQkJCQkJCVZDSElRX01TR19PUEVOQUNLLAorCQkJCQkJCXNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQkJCQlyZW1vdGVwb3J0KSwKKwkJCQkJCSZib2R5LCAxLCBzaXplb2YoYWNrX3BheWxvYWQpLAorCQkJCQkJMCkgPT0gVkNISVFfUkVUUlkpCisJCQkJCQlnb3RvIGJhaWxfbm90X3JlYWR5OworCQkJCX0KKworCQkJCS8qIFRoZSBzZXJ2aWNlIGlzIG5vdyBvcGVuICovCisJCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQkJc2VydmljZS0+c3luYyA/IFZDSElRX1NSVlNUQVRFX09QRU5TWU5DCisJCQkJCTogVkNISVFfU1JWU1RBVEVfT1BFTik7CisJCQl9CisKKwkJCXNlcnZpY2UtPnJlbW90ZXBvcnQgPSByZW1vdGVwb3J0OworCQkJc2VydmljZS0+Y2xpZW50X2lkID0gKChpbnQgKiloZWFkZXItPmRhdGEpWzFdOworCQkJaWYgKG1ha2Vfc2VydmljZV9jYWxsYmFjayhzZXJ2aWNlLCBWQ0hJUV9TRVJWSUNFX09QRU5FRCwKKwkJCQlOVUxMLCBOVUxMKSA9PSBWQ0hJUV9SRVRSWSkgeworCQkJCS8qIEJhaWwgb3V0IGlmIG5vdCByZWFkeSAqLworCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQgPSBWQ0hJUV9QT1JUX0ZSRUU7CisJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCX0KKworCQkJLyogU3VjY2VzcyAtIHRoZSBtZXNzYWdlIGhhcyBiZWVuIGRlYWx0IHdpdGggKi8KKwkJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKK2ZhaWxfb3BlbjoKKwkvKiBObyBhdmFpbGFibGUgc2VydmljZSwgb3IgYW4gaW52YWxpZCByZXF1ZXN0IC0gc2VuZCBhIENMT1NFICovCisJaWYgKHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19DTE9TRSwgMCwgVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpKSwKKwkJTlVMTCwgMCwgMCwgMCkgPT0gVkNISVFfUkVUUlkpCisJCWdvdG8gYmFpbF9ub3RfcmVhZHk7CisKKwlyZXR1cm4gMTsKKworYmFpbF9ub3RfcmVhZHk6CisJaWYgKHNlcnZpY2UpCisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyIHRocmVhZCAqLworc3RhdGljIHZvaWQKK3BhcnNlX3J4X3Nsb3RzKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NIQVJFRF9TVEFURV9UICpyZW1vdGUgPSBzdGF0ZS0+cmVtb3RlOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IE5VTEw7CisJaW50IHR4X3BvczsKKwlERUJVR19JTklUSUFMSVNFKHN0YXRlLT5sb2NhbCkKKworCXR4X3BvcyA9IHJlbW90ZS0+dHhfcG9zOworCisJd2hpbGUgKHN0YXRlLT5yeF9wb3MgIT0gdHhfcG9zKSB7CisJCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisJCWludCBtc2dpZCwgc2l6ZTsKKwkJaW50IHR5cGU7CisJCXVuc2lnbmVkIGludCBsb2NhbHBvcnQsIHJlbW90ZXBvcnQ7CisKKwkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCWlmICghc3RhdGUtPnJ4X2RhdGEpIHsKKwkJCWludCByeF9pbmRleDsKKwkJCVdBUk5fT04oISgoc3RhdGUtPnJ4X3BvcyAmIFZDSElRX1NMT1RfTUFTSykgPT0gMCkpOworCQkJcnhfaW5kZXggPSByZW1vdGUtPnNsb3RfcXVldWVbCisJCQkJU0xPVF9RVUVVRV9JTkRFWF9GUk9NX1BPUyhzdGF0ZS0+cnhfcG9zKSAmCisJCQkJVkNISVFfU0xPVF9RVUVVRV9NQVNLXTsKKwkJCXN0YXRlLT5yeF9kYXRhID0gKGNoYXIgKilTTE9UX0RBVEFfRlJPTV9JTkRFWChzdGF0ZSwKKwkJCQlyeF9pbmRleCk7CisJCQlzdGF0ZS0+cnhfaW5mbyA9IFNMT1RfSU5GT19GUk9NX0lOREVYKHN0YXRlLCByeF9pbmRleCk7CisKKwkJCS8qIEluaXRpYWxpc2UgdXNlX2NvdW50IHRvIG9uZSwgYW5kIGluY3JlbWVudAorCQkJKiogcmVsZWFzZV9jb3VudCBhdCB0aGUgZW5kIG9mIHRoZSBzbG90IHRvIGF2b2lkCisJCQkqKiByZWxlYXNpbmcgdGhlIHNsb3QgcHJlbWF0dXJlbHkuICovCisJCQlzdGF0ZS0+cnhfaW5mby0+dXNlX2NvdW50ID0gMTsKKwkJCXN0YXRlLT5yeF9pbmZvLT5yZWxlYXNlX2NvdW50ID0gMDsKKwkJfQorCisJCWhlYWRlciA9IChWQ0hJUV9IRUFERVJfVCAqKShzdGF0ZS0+cnhfZGF0YSArCisJCQkoc3RhdGUtPnJ4X3BvcyAmIFZDSElRX1NMT1RfTUFTSykpOworCQlERUJVR19WQUxVRShQQVJTRV9IRUFERVIsIChpbnQpaGVhZGVyKTsKKwkJbXNnaWQgPSBoZWFkZXItPm1zZ2lkOworCQlERUJVR19WQUxVRShQQVJTRV9NU0dJRCwgbXNnaWQpOworCQlzaXplID0gaGVhZGVyLT5zaXplOworCQl0eXBlID0gVkNISVFfTVNHX1RZUEUobXNnaWQpOworCQlsb2NhbHBvcnQgPSBWQ0hJUV9NU0dfRFNUUE9SVChtc2dpZCk7CisJCXJlbW90ZXBvcnQgPSBWQ0hJUV9NU0dfU1JDUE9SVChtc2dpZCk7CisKKwkJaWYgKHR5cGUgIT0gVkNISVFfTVNHX0RBVEEpCisJCQlWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIGN0cmxfcnhfY291bnQpOworCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFZDSElRX01TR19PUEVOQUNLOgorCQljYXNlIFZDSElRX01TR19DTE9TRToKKwkJY2FzZSBWQ0hJUV9NU0dfREFUQToKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19SWDoKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19UWDoKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19SWF9ET05FOgorCQljYXNlIFZDSElRX01TR19CVUxLX1RYX0RPTkU6CisJCQlzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X3BvcnQoc3RhdGUsIGxvY2FscG9ydCk7CisJCQlpZiAoKCFzZXJ2aWNlIHx8CisJCQkgICAgICgoc2VydmljZS0+cmVtb3RlcG9ydCAhPSByZW1vdGVwb3J0KSAmJgorCQkJICAgICAgKHNlcnZpY2UtPnJlbW90ZXBvcnQgIT0gVkNISVFfUE9SVF9GUkVFKSkpICYmCisJCQkgICAgKGxvY2FscG9ydCA9PSAwKSAmJgorCQkJICAgICh0eXBlID09IFZDSElRX01TR19DTE9TRSkpIHsKKwkJCQkvKiBUaGlzIGNvdWxkIGJlIGEgQ0xPU0UgZnJvbSBhIGNsaWVudCB3aGljaAorCQkJCSAgIGhhZG4ndCB5ZXQgcmVjZWl2ZWQgdGhlIE9QRU5BQ0sgLSBsb29rIGZvcgorCQkJCSAgIHRoZSBjb25uZWN0ZWQgc2VydmljZSAqLworCQkJCWlmIChzZXJ2aWNlKQorCQkJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJCQlzZXJ2aWNlID0gZ2V0X2Nvbm5lY3RlZF9zZXJ2aWNlKHN0YXRlLAorCQkJCQlyZW1vdGVwb3J0KTsKKwkJCQlpZiAoc2VydmljZSkKKwkJCQkJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCQkiJWQ6IHBycyAlc0AleCAoJWQtPiVkKSAtICIKKwkJCQkJCSJmb3VuZCBjb25uZWN0ZWQgc2VydmljZSAlZCIsCisJCQkJCQlzdGF0ZS0+aWQsIG1zZ190eXBlX3N0cih0eXBlKSwKKwkJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLAorCQkJCQkJcmVtb3RlcG9ydCwgbG9jYWxwb3J0LAorCQkJCQkJc2VydmljZS0+bG9jYWxwb3J0KTsKKwkJCX0KKworCQkJaWYgKCFzZXJ2aWNlKSB7CisJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkiJWQ6IHBycyAlc0AleCAoJWQtPiVkKSAtICIKKwkJCQkJImludmFsaWQvY2xvc2VkIHNlcnZpY2UgJWQiLAorCQkJCQlzdGF0ZS0+aWQsIG1zZ190eXBlX3N0cih0eXBlKSwKKwkJCQkJKHVuc2lnbmVkIGludCloZWFkZXIsCisJCQkJCXJlbW90ZXBvcnQsIGxvY2FscG9ydCwgbG9jYWxwb3J0KTsKKwkJCQlnb3RvIHNraXBfbWVzc2FnZTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoU1JWVFJBQ0VfRU5BQkxFRChzZXJ2aWNlLCBWQ0hJUV9MT0dfSU5GTykpIHsKKwkJCWludCBzdmNfZm91cmNjOworCisJCQlzdmNfZm91cmNjID0gc2VydmljZQorCQkJCT8gc2VydmljZS0+YmFzZS5mb3VyY2MKKwkJCQk6IFZDSElRX01BS0VfRk9VUkNDKCc/JywgJz8nLCAnPycsICc/Jyk7CisJCQl2Y2hpcV9sb2dfaW5mbyhTUlZUUkFDRV9MRVZFTChzZXJ2aWNlKSwKKwkJCQkiUmN2ZCBNc2cgJXMoJXUpIGZyb20gJWMlYyVjJWMgczolZCBkOiVkICIKKwkJCQkibGVuOiVkIiwKKwkJCQltc2dfdHlwZV9zdHIodHlwZSksIHR5cGUsCisJCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhzdmNfZm91cmNjKSwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsIHNpemUpOworCQkJaWYgKHNpemUgPiAwKQorCQkJCXZjaGlxX2xvZ19kdW1wX21lbSgiUmN2ZCIsIDAsIGhlYWRlci0+ZGF0YSwKKwkJCQkJbWluKDY0LCBzaXplKSk7CisJCX0KKworCQlpZiAoKCh1bnNpZ25lZCBpbnQpaGVhZGVyICYgVkNISVFfU0xPVF9NQVNLKSArIGNhbGNfc3RyaWRlKHNpemUpCisJCQk+IFZDSElRX1NMT1RfU0laRSkgeworCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSJoZWFkZXIgJXggKG1zZ2lkICV4KSAtIHNpemUgJXggdG9vIGJpZyBmb3IgIgorCQkJCSJzbG90IiwKKwkJCQkodW5zaWduZWQgaW50KWhlYWRlciwgKHVuc2lnbmVkIGludCltc2dpZCwKKwkJCQkodW5zaWduZWQgaW50KXNpemUpOworCQkJV0FSTigxLCAib3ZlcnNpemVkIGZvciBzbG90XG4iKTsKKwkJfQorCisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFZDSElRX01TR19PUEVOOgorCQkJV0FSTl9PTighKFZDSElRX01TR19EU1RQT1JUKG1zZ2lkKSA9PSAwKSk7CisJCQlpZiAoIXBhcnNlX29wZW4oc3RhdGUsIGhlYWRlcikpCisJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19PUEVOQUNLOgorCQkJaWYgKHNpemUgPj0gc2l6ZW9mKHN0cnVjdCB2Y2hpcV9vcGVuYWNrX3BheWxvYWQpKSB7CisJCQkJY29uc3Qgc3RydWN0IHZjaGlxX29wZW5hY2tfcGF5bG9hZCAqcGF5bG9hZCA9CisJCQkJCShzdHJ1Y3QgdmNoaXFfb3BlbmFja19wYXlsb2FkICopCisJCQkJCWhlYWRlci0+ZGF0YTsKKwkJCQlzZXJ2aWNlLT5wZWVyX3ZlcnNpb24gPSBwYXlsb2FkLT52ZXJzaW9uOworCQkJfQorCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIiVkOiBwcnMgT1BFTkFDS0AleCwleCAoJWQtPiVkKSB2OiVkIiwKKwkJCQlzdGF0ZS0+aWQsICh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplLAorCQkJCXJlbW90ZXBvcnQsIGxvY2FscG9ydCwgc2VydmljZS0+cGVlcl92ZXJzaW9uKTsKKwkJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PQorCQkJCVZDSElRX1NSVlNUQVRFX09QRU5JTkcpIHsKKwkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0ID0gcmVtb3RlcG9ydDsKKwkJCQl2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShzZXJ2aWNlLAorCQkJCQlWQ0hJUV9TUlZTVEFURV9PUEVOKTsKKwkJCQl1cCgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKwkJCX0gZWxzZQorCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJIk9QRU5BQ0sgcmVjZWl2ZWQgaW4gc3RhdGUgJXMiLAorCQkJCQlzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0pOworCQkJYnJlYWs7CisJCWNhc2UgVkNISVFfTVNHX0NMT1NFOgorCQkJV0FSTl9PTihzaXplICE9IDApOyAvKiBUaGVyZSBzaG91bGQgYmUgbm8gZGF0YSAqLworCisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHBycyBDTE9TRUAleCAoJWQtPiVkKSIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQpOworCisJCQltYXJrX3NlcnZpY2VfY2xvc2luZ19pbnRlcm5hbChzZXJ2aWNlLCAxKTsKKworCQkJaWYgKHZjaGlxX2Nsb3NlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSwKKwkJCQkxLypjbG9zZV9yZWN2ZCovKSA9PSBWQ0hJUV9SRVRSWSkKKwkJCQlnb3RvIGJhaWxfbm90X3JlYWR5OworCisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiQ2xvc2UgU2VydmljZSAlYyVjJWMlYyBzOiV1IGQ6JWQiLAorCQkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMoc2VydmljZS0+YmFzZS5mb3VyY2MpLAorCQkJCXNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0KTsKKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19EQVRBOgorCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIiVkOiBwcnMgREFUQUAleCwleCAoJWQtPiVkKSIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQpOworCisJCQlpZiAoKHNlcnZpY2UtPnJlbW90ZXBvcnQgPT0gcmVtb3RlcG9ydCkKKwkJCQkmJiAoc2VydmljZS0+c3J2c3RhdGUgPT0KKwkJCQlWQ0hJUV9TUlZTVEFURV9PUEVOKSkgeworCQkJCWhlYWRlci0+bXNnaWQgPSBtc2dpZCB8IFZDSElRX01TR0lEX0NMQUlNRUQ7CisJCQkJY2xhaW1fc2xvdChzdGF0ZS0+cnhfaW5mbyk7CisJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQkJaWYgKG1ha2Vfc2VydmljZV9jYWxsYmFjayhzZXJ2aWNlLAorCQkJCQlWQ0hJUV9NRVNTQUdFX0FWQUlMQUJMRSwgaGVhZGVyLAorCQkJCQlOVUxMKSA9PSBWQ0hJUV9SRVRSWSkgeworCQkJCQlERUJVR19UUkFDRShQQVJTRV9MSU5FKTsKKwkJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCQl9CisJCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgY3RybF9yeF9jb3VudCk7CisJCQkJVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwgY3RybF9yeF9ieXRlcywKKwkJCQkJc2l6ZSk7CisJCQl9IGVsc2UgeworCQkJCVZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgZXJyb3JfY291bnQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVkNISVFfTVNHX0NPTk5FQ1Q6CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHBycyBDT05ORUNUQCV4IiwKKwkJCQlzdGF0ZS0+aWQsICh1bnNpZ25lZCBpbnQpaGVhZGVyKTsKKwkJCXN0YXRlLT52ZXJzaW9uX2NvbW1vbiA9ICgoVkNISVFfU0xPVF9aRVJPX1QgKikKKwkJCQkJCSBzdGF0ZS0+c2xvdF9kYXRhKS0+dmVyc2lvbjsKKwkJCXVwKCZzdGF0ZS0+Y29ubmVjdCk7CisJCQlicmVhazsKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19SWDoKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19UWDogeworCQkJVkNISVFfQlVMS19RVUVVRV9UICpxdWV1ZTsKKwkJCVdBUk5fT04oIXN0YXRlLT5pc19tYXN0ZXIpOworCQkJcXVldWUgPSAodHlwZSA9PSBWQ0hJUV9NU0dfQlVMS19SWCkgPworCQkJCSZzZXJ2aWNlLT5idWxrX3R4IDogJnNlcnZpY2UtPmJ1bGtfcng7CisJCQlpZiAoKHNlcnZpY2UtPnJlbW90ZXBvcnQgPT0gcmVtb3RlcG9ydCkKKwkJCQkmJiAoc2VydmljZS0+c3J2c3RhdGUgPT0KKwkJCQlWQ0hJUV9TUlZTVEFURV9PUEVOKSkgeworCQkJCVZDSElRX0JVTEtfVCAqYnVsazsKKwkJCQlpbnQgcmVzb2x2ZWQgPSAwOworCisJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgKKwkJCQkJJnNlcnZpY2UtPmJ1bGtfbXV0ZXgpICE9IDApIHsKKwkJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQkJCWdvdG8gYmFpbF9ub3RfcmVhZHk7CisJCQkJfQorCisJCQkJV0FSTl9PTighKHF1ZXVlLT5yZW1vdGVfaW5zZXJ0IDwgcXVldWUtPnJlbW92ZSArCisJCQkJCVZDSElRX05VTV9TRVJWSUNFX0JVTEtTKSk7CisJCQkJYnVsayA9ICZxdWV1ZS0+YnVsa3NbCisJCQkJCUJVTEtfSU5ERVgocXVldWUtPnJlbW90ZV9pbnNlcnQpXTsKKwkJCQlidWxrLT5yZW1vdGVfZGF0YSA9CisJCQkJCSh2b2lkICopKChpbnQgKiloZWFkZXItPmRhdGEpWzBdOworCQkJCWJ1bGstPnJlbW90ZV9zaXplID0gKChpbnQgKiloZWFkZXItPmRhdGEpWzFdOworCQkJCXdtYigpOworCisJCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCSIlZDogcHJzICVzQCV4ICglZC0+JWQpICV4QCV4IiwKKwkJCQkJc3RhdGUtPmlkLCBtc2dfdHlwZV9zdHIodHlwZSksCisJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLAorCQkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsCisJCQkJCWJ1bGstPnJlbW90ZV9zaXplLAorCQkJCQkodW5zaWduZWQgaW50KWJ1bGstPnJlbW90ZV9kYXRhKTsKKworCQkJCXF1ZXVlLT5yZW1vdGVfaW5zZXJ0Kys7CisKKwkJCQlpZiAoYXRvbWljX3JlYWQoJnBhdXNlX2J1bGtzX2NvdW50KSkgeworCQkJCQlzdGF0ZS0+ZGVmZXJyZWRfYnVsa3MrKzsKKwkJCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCQkiJXM6IGRlZmVycmluZyBidWxrICglZCkiLAorCQkJCQkJX19mdW5jX18sCisJCQkJCQlzdGF0ZS0+ZGVmZXJyZWRfYnVsa3MpOworCQkJCQlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgIT0KKwkJCQkJCVZDSElRX0NPTk5TVEFURV9QQVVTRV9TRU5UKQorCQkJCQkJdmNoaXFfbG9nX2Vycm9yKAorCQkJCQkJCXZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJCSIlczogYnVsa3MgcGF1c2VkIGluICIKKwkJCQkJCQkidW5leHBlY3RlZCBzdGF0ZSAlcyIsCisJCQkJCQkJX19mdW5jX18sCisJCQkJCQkJY29ubl9zdGF0ZV9uYW1lc1sKKwkJCQkJCQlzdGF0ZS0+Y29ubl9zdGF0ZV0pOworCQkJCX0gZWxzZSBpZiAoc3RhdGUtPmNvbm5fc3RhdGUgPT0KKwkJCQkJVkNISVFfQ09OTlNUQVRFX0NPTk5FQ1RFRCkgeworCQkJCQlERUJVR19UUkFDRShQQVJTRV9MSU5FKTsKKwkJCQkJcmVzb2x2ZWQgPSByZXNvbHZlX2J1bGtzKHNlcnZpY2UsCisJCQkJCQlxdWV1ZSk7CisJCQkJfQorCisJCQkJbXV0ZXhfdW5sb2NrKCZzZXJ2aWNlLT5idWxrX211dGV4KTsKKwkJCQlpZiAocmVzb2x2ZWQpCisJCQkJCW5vdGlmeV9idWxrcyhzZXJ2aWNlLCBxdWV1ZSwKKwkJCQkJCTEvKnJldHJ5X3BvbGwqLyk7CisJCQl9CisJCX0gYnJlYWs7CisJCWNhc2UgVkNISVFfTVNHX0JVTEtfUlhfRE9ORToKKwkJY2FzZSBWQ0hJUV9NU0dfQlVMS19UWF9ET05FOgorCQkJV0FSTl9PTihzdGF0ZS0+aXNfbWFzdGVyKTsKKwkJCWlmICgoc2VydmljZS0+cmVtb3RlcG9ydCA9PSByZW1vdGVwb3J0KQorCQkJCSYmIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPQorCQkJCVZDSElRX1NSVlNUQVRFX0ZSRUUpKSB7CisJCQkJVkNISVFfQlVMS19RVUVVRV9UICpxdWV1ZTsKKwkJCQlWQ0hJUV9CVUxLX1QgKmJ1bGs7CisKKwkJCQlxdWV1ZSA9ICh0eXBlID09IFZDSElRX01TR19CVUxLX1JYX0RPTkUpID8KKwkJCQkJJnNlcnZpY2UtPmJ1bGtfcnggOiAmc2VydmljZS0+YnVsa190eDsKKworCQkJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQkJCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoCisJCQkJCSZzZXJ2aWNlLT5idWxrX211dGV4KSAhPSAwKSB7CisJCQkJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQkJCQlnb3RvIGJhaWxfbm90X3JlYWR5OworCQkJCX0KKwkJCQlpZiAoKGludCkocXVldWUtPnJlbW90ZV9pbnNlcnQgLQorCQkJCQlxdWV1ZS0+bG9jYWxfaW5zZXJ0KSA+PSAwKSB7CisJCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCSIlZDogcHJzICVzQCV4ICglZC0+JWQpICIKKwkJCQkJCSJ1bmV4cGVjdGVkIChyaT0lZCxsaT0lZCkiLAorCQkJCQkJc3RhdGUtPmlkLCBtc2dfdHlwZV9zdHIodHlwZSksCisJCQkJCQkodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQkJCXJlbW90ZXBvcnQsIGxvY2FscG9ydCwKKwkJCQkJCXF1ZXVlLT5yZW1vdGVfaW5zZXJ0LAorCQkJCQkJcXVldWUtPmxvY2FsX2luc2VydCk7CisJCQkJCW11dGV4X3VubG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCUJVR19PTihxdWV1ZS0+cHJvY2VzcyA9PSBxdWV1ZS0+bG9jYWxfaW5zZXJ0KTsKKwkJCQlCVUdfT04ocXVldWUtPnByb2Nlc3MgIT0gcXVldWUtPnJlbW90ZV9pbnNlcnQpOworCisJCQkJYnVsayA9ICZxdWV1ZS0+YnVsa3NbCisJCQkJCUJVTEtfSU5ERVgocXVldWUtPnJlbW90ZV9pbnNlcnQpXTsKKwkJCQlidWxrLT5hY3R1YWwgPSAqKGludCAqKWhlYWRlci0+ZGF0YTsKKwkJCQlxdWV1ZS0+cmVtb3RlX2luc2VydCsrOworCisJCQkJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJCSIlZDogcHJzICVzQCV4ICglZC0+JWQpICV4QCV4IiwKKwkJCQkJc3RhdGUtPmlkLCBtc2dfdHlwZV9zdHIodHlwZSksCisJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyLAorCQkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsCisJCQkJCWJ1bGstPmFjdHVhbCwgKHVuc2lnbmVkIGludClidWxrLT5kYXRhKTsKKworCQkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJIiVkOiBwcnM6JWQgJWN4IGxpPSV4IHJpPSV4IHA9JXgiLAorCQkJCQlzdGF0ZS0+aWQsIGxvY2FscG9ydCwKKwkJCQkJKHR5cGUgPT0gVkNISVFfTVNHX0JVTEtfUlhfRE9ORSkgPworCQkJCQkJJ3InIDogJ3QnLAorCQkJCQlxdWV1ZS0+bG9jYWxfaW5zZXJ0LAorCQkJCQlxdWV1ZS0+cmVtb3RlX2luc2VydCwgcXVldWUtPnByb2Nlc3MpOworCisJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQkJV0FSTl9PTihxdWV1ZS0+cHJvY2VzcyA9PSBxdWV1ZS0+bG9jYWxfaW5zZXJ0KTsKKwkJCQl2Y2hpcV9jb21wbGV0ZV9idWxrKGJ1bGspOworCQkJCXF1ZXVlLT5wcm9jZXNzKys7CisJCQkJbXV0ZXhfdW5sb2NrKCZzZXJ2aWNlLT5idWxrX211dGV4KTsKKwkJCQlERUJVR19UUkFDRShQQVJTRV9MSU5FKTsKKwkJCQlub3RpZnlfYnVsa3Moc2VydmljZSwgcXVldWUsIDEvKnJldHJ5X3BvbGwqLyk7CisJCQkJREVCVUdfVFJBQ0UoUEFSU0VfTElORSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWQ0hJUV9NU0dfUEFERElORzoKKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHBycyBQQURESU5HQCV4LCV4IiwKKwkJCQlzdGF0ZS0+aWQsICh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19QQVVTRToKKwkJCS8qIElmIGluaXRpYXRlZCwgc2lnbmFsIHRoZSBhcHBsaWNhdGlvbiB0aHJlYWQgKi8KKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHBycyBQQVVTRUAleCwleCIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSk7CisJCQlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgPT0gVkNISVFfQ09OTlNUQVRFX1BBVVNFRCkgeworCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJIiVkOiBQQVVTRSByZWNlaXZlZCBpbiBzdGF0ZSBQQVVTRUQiLAorCQkJCQlzdGF0ZS0+aWQpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN0YXRlLT5jb25uX3N0YXRlICE9IFZDSElRX0NPTk5TVEFURV9QQVVTRV9TRU5UKSB7CisJCQkJLyogU2VuZCBhIFBBVVNFIGluIHJlc3BvbnNlICovCisJCQkJaWYgKHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCQkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19QQVVTRSwgMCwgMCksCisJCQkJCU5VTEwsIDAsIDAsIFFNRkxBR1NfTk9fTVVURVhfVU5MT0NLKQorCQkJCSAgICA9PSBWQ0hJUV9SRVRSWSkKKwkJCQkJZ290byBiYWlsX25vdF9yZWFkeTsKKwkJCQlpZiAoc3RhdGUtPmlzX21hc3RlcikKKwkJCQkJcGF1c2VfYnVsa3Moc3RhdGUpOworCQkJfQorCQkJLyogQXQgdGhpcyBwb2ludCBzbG90X211dGV4IGlzIGhlbGQgKi8KKwkJCXZjaGlxX3NldF9jb25uX3N0YXRlKHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfUEFVU0VEKTsKKwkJCXZjaGlxX3BsYXRmb3JtX3BhdXNlZChzdGF0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBWQ0hJUV9NU0dfUkVTVU1FOgorCQkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCSIlZDogcHJzIFJFU1VNRUAleCwleCIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSk7CisJCQkvKiBSZWxlYXNlIHRoZSBzbG90IG11dGV4ICovCisJCQltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKKwkJCWlmIChzdGF0ZS0+aXNfbWFzdGVyKQorCQkJCXJlc3VtZV9idWxrcyhzdGF0ZSk7CisJCQl2Y2hpcV9zZXRfY29ubl9zdGF0ZShzdGF0ZSwgVkNISVFfQ09OTlNUQVRFX0NPTk5FQ1RFRCk7CisJCQl2Y2hpcV9wbGF0Zm9ybV9yZXN1bWVkKHN0YXRlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVkNISVFfTVNHX1JFTU9URV9VU0U6CisJCQl2Y2hpcV9vbl9yZW1vdGVfdXNlKHN0YXRlKTsKKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19SRU1PVEVfUkVMRUFTRToKKwkJCXZjaGlxX29uX3JlbW90ZV9yZWxlYXNlKHN0YXRlKTsKKwkJCWJyZWFrOworCQljYXNlIFZDSElRX01TR19SRU1PVEVfVVNFX0FDVElWRToKKwkJCXZjaGlxX29uX3JlbW90ZV91c2VfYWN0aXZlKHN0YXRlKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJIiVkOiBwcnMgaW52YWxpZCBtc2dpZCAleEAleCwleCIsCisJCQkJc3RhdGUtPmlkLCBtc2dpZCwgKHVuc2lnbmVkIGludCloZWFkZXIsIHNpemUpOworCQkJV0FSTigxLCAiaW52YWxpZCBtZXNzYWdlXG4iKTsKKwkJCWJyZWFrOworCQl9CisKK3NraXBfbWVzc2FnZToKKwkJaWYgKHNlcnZpY2UpIHsKKwkJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQkJc2VydmljZSA9IE5VTEw7CisJCX0KKworCQlzdGF0ZS0+cnhfcG9zICs9IGNhbGNfc3RyaWRlKHNpemUpOworCisJCURFQlVHX1RSQUNFKFBBUlNFX0xJTkUpOworCQkvKiBQZXJmb3JtIHNvbWUgaG91c2VrZWVwaW5nIHdoZW4gdGhlIGVuZCBvZiB0aGUgc2xvdCBpcworCQkqKiByZWFjaGVkLiAqLworCQlpZiAoKHN0YXRlLT5yeF9wb3MgJiBWQ0hJUV9TTE9UX01BU0spID09IDApIHsKKwkJCS8qIFJlbW92ZSB0aGUgZXh0cmEgcmVmZXJlbmNlIGNvdW50LiAqLworCQkJcmVsZWFzZV9zbG90KHN0YXRlLCBzdGF0ZS0+cnhfaW5mbywgTlVMTCwgTlVMTCk7CisJCQlzdGF0ZS0+cnhfZGF0YSA9IE5VTEw7CisJCX0KKwl9CisKK2JhaWxfbm90X3JlYWR5OgorCWlmIChzZXJ2aWNlKQorCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKK30KKworLyogQ2FsbGVkIGJ5IHRoZSBzbG90IGhhbmRsZXIgdGhyZWFkICovCitzdGF0aWMgaW50CitzbG90X2hhbmRsZXJfZnVuYyh2b2lkICp2KQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gKFZDSElRX1NUQVRFX1QgKikgdjsKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqbG9jYWwgPSBzdGF0ZS0+bG9jYWw7CisJREVCVUdfSU5JVElBTElTRShsb2NhbCkKKworCXdoaWxlICgxKSB7CisJCURFQlVHX0NPVU5UKFNMT1RfSEFORExFUl9DT1VOVCk7CisJCURFQlVHX1RSQUNFKFNMT1RfSEFORExFUl9MSU5FKTsKKwkJcmVtb3RlX2V2ZW50X3dhaXQoJmxvY2FsLT50cmlnZ2VyKTsKKworCQlybWIoKTsKKworCQlERUJVR19UUkFDRShTTE9UX0hBTkRMRVJfTElORSk7CisJCWlmIChzdGF0ZS0+cG9sbF9uZWVkZWQpIHsKKwkJCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gc3VzcGVuZCAtIG1heSBjaGFuZ2Ugb3VyCisJCQkgKiBjb25uX3N0YXRlICovCisJCQl2Y2hpcV9wbGF0Zm9ybV9jaGVja19zdXNwZW5kKHN0YXRlKTsKKworCQkJc3RhdGUtPnBvbGxfbmVlZGVkID0gMDsKKworCQkJLyogSGFuZGxlIHNlcnZpY2UgcG9sbGluZyBhbmQgb3RoZXIgcmFyZSBjb25kaXRpb25zIGhlcmUKKwkJCSoqIG91dCBvZiB0aGUgbWFpbmxpbmUgY29kZSAqLworCQkJc3dpdGNoIChzdGF0ZS0+Y29ubl9zdGF0ZSkgeworCQkJY2FzZSBWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVEVEOgorCQkJCS8qIFBvbGwgdGhlIHNlcnZpY2VzIGFzIHJlcXVlc3RlZCAqLworCQkJCXBvbGxfc2VydmljZXMoc3RhdGUpOworCQkJCWJyZWFrOworCisJCQljYXNlIFZDSElRX0NPTk5TVEFURV9QQVVTSU5HOgorCQkJCWlmIChzdGF0ZS0+aXNfbWFzdGVyKQorCQkJCQlwYXVzZV9idWxrcyhzdGF0ZSk7CisJCQkJaWYgKHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCQkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19QQVVTRSwgMCwgMCksCisJCQkJCU5VTEwsIDAsIDAsCisJCQkJCVFNRkxBR1NfTk9fTVVURVhfVU5MT0NLKQorCQkJCSAgICAhPSBWQ0hJUV9SRVRSWSkgeworCQkJCQl2Y2hpcV9zZXRfY29ubl9zdGF0ZShzdGF0ZSwKKwkJCQkJCVZDSElRX0NPTk5TVEFURV9QQVVTRV9TRU5UKTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoc3RhdGUtPmlzX21hc3RlcikKKwkJCQkJCXJlc3VtZV9idWxrcyhzdGF0ZSk7CisJCQkJCS8qIFJldHJ5IGxhdGVyICovCisJCQkJCXN0YXRlLT5wb2xsX25lZWRlZCA9IDE7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFZDSElRX0NPTk5TVEFURV9QQVVTRUQ6CisJCQkJdmNoaXFfcGxhdGZvcm1fcmVzdW1lKHN0YXRlKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBWQ0hJUV9DT05OU1RBVEVfUkVTVU1JTkc6CisJCQkJaWYgKHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIE5VTEwsCisJCQkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19SRVNVTUUsIDAsIDApLAorCQkJCQlOVUxMLCAwLCAwLCBRTUZMQUdTX05PX01VVEVYX0xPQ0spCisJCQkJCSE9IFZDSElRX1JFVFJZKSB7CisJCQkJCWlmIChzdGF0ZS0+aXNfbWFzdGVyKQorCQkJCQkJcmVzdW1lX2J1bGtzKHN0YXRlKTsKKwkJCQkJdmNoaXFfc2V0X2Nvbm5fc3RhdGUoc3RhdGUsCisJCQkJCQlWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVEVEKTsKKwkJCQkJdmNoaXFfcGxhdGZvcm1fcmVzdW1lZChzdGF0ZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogVGhpcyBzaG91bGQgcmVhbGx5IGJlIGltcG9zc2libGUsCisJCQkJCSoqIHNpbmNlIHRoZSBQQVVTRSBzaG91bGQgaGF2ZSBmbHVzaGVkCisJCQkJCSoqIHRocm91Z2ggb3V0c3RhbmRpbmcgbWVzc2FnZXMuICovCisJCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCSJGYWlsZWQgdG8gc2VuZCBSRVNVTUUgIgorCQkJCQkJIm1lc3NhZ2UiKTsKKwkJCQkJQlVHKCk7CisJCQkJfQorCQkJCWJyZWFrOworCisJCQljYXNlIFZDSElRX0NPTk5TVEFURV9QQVVTRV9USU1FT1VUOgorCQkJY2FzZSBWQ0hJUV9DT05OU1RBVEVfUkVTVU1FX1RJTUVPVVQ6CisJCQkJdmNoaXFfcGxhdGZvcm1faGFuZGxlX3RpbWVvdXQoc3RhdGUpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKworCisJCX0KKworCQlERUJVR19UUkFDRShTTE9UX0hBTkRMRVJfTElORSk7CisJCXBhcnNlX3J4X3Nsb3RzKHN0YXRlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogQ2FsbGVkIGJ5IHRoZSByZWN5Y2xlIHRocmVhZCAqLworc3RhdGljIGludAorcmVjeWNsZV9mdW5jKHZvaWQgKnYpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSAoVkNISVFfU1RBVEVfVCAqKSB2OworCVZDSElRX1NIQVJFRF9TVEFURV9UICpsb2NhbCA9IHN0YXRlLT5sb2NhbDsKKworCXdoaWxlICgxKSB7CisJCXJlbW90ZV9ldmVudF93YWl0KCZsb2NhbC0+cmVjeWNsZSk7CisKKwkJcHJvY2Vzc19mcmVlX3F1ZXVlKHN0YXRlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogQ2FsbGVkIGJ5IHRoZSBzeW5jIHRocmVhZCAqLworc3RhdGljIGludAorc3luY19mdW5jKHZvaWQgKnYpCit7CisJVkNISVFfU1RBVEVfVCAqc3RhdGUgPSAoVkNISVFfU1RBVEVfVCAqKSB2OworCVZDSElRX1NIQVJFRF9TVEFURV9UICpsb2NhbCA9IHN0YXRlLT5sb2NhbDsKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyID0gKFZDSElRX0hFQURFUl9UICopU0xPVF9EQVRBX0ZST01fSU5ERVgoc3RhdGUsCisJCXN0YXRlLT5yZW1vdGUtPnNsb3Rfc3luYyk7CisKKwl3aGlsZSAoMSkgeworCQlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2U7CisJCWludCBtc2dpZCwgc2l6ZTsKKwkJaW50IHR5cGU7CisJCXVuc2lnbmVkIGludCBsb2NhbHBvcnQsIHJlbW90ZXBvcnQ7CisKKwkJcmVtb3RlX2V2ZW50X3dhaXQoJmxvY2FsLT5zeW5jX3RyaWdnZXIpOworCisJCXJtYigpOworCisJCW1zZ2lkID0gaGVhZGVyLT5tc2dpZDsKKwkJc2l6ZSA9IGhlYWRlci0+c2l6ZTsKKwkJdHlwZSA9IFZDSElRX01TR19UWVBFKG1zZ2lkKTsKKwkJbG9jYWxwb3J0ID0gVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpOworCQlyZW1vdGVwb3J0ID0gVkNISVFfTVNHX1NSQ1BPUlQobXNnaWQpOworCisJCXNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfcG9ydChzdGF0ZSwgbG9jYWxwb3J0KTsKKworCQlpZiAoIXNlcnZpY2UpIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9zeW5jX2xvZ19sZXZlbCwKKwkJCQkiJWQ6IHNmICVzQCV4ICglZC0+JWQpIC0gIgorCQkJCSJpbnZhbGlkL2Nsb3NlZCBzZXJ2aWNlICVkIiwKKwkJCQlzdGF0ZS0+aWQsIG1zZ190eXBlX3N0cih0eXBlKSwKKwkJCQkodW5zaWduZWQgaW50KWhlYWRlciwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsIGxvY2FscG9ydCk7CisJCQlyZWxlYXNlX21lc3NhZ2Vfc3luYyhzdGF0ZSwgaGVhZGVyKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZjaGlxX3N5bmNfbG9nX2xldmVsID49IFZDSElRX0xPR19UUkFDRSkgeworCQkJaW50IHN2Y19mb3VyY2M7CisKKwkJCXN2Y19mb3VyY2MgPSBzZXJ2aWNlCisJCQkJPyBzZXJ2aWNlLT5iYXNlLmZvdXJjYworCQkJCTogVkNISVFfTUFLRV9GT1VSQ0MoJz8nLCAnPycsICc/JywgJz8nKTsKKwkJCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9zeW5jX2xvZ19sZXZlbCwKKwkJCQkiUmN2ZCBNc2cgJXMgZnJvbSAlYyVjJWMlYyBzOiVkIGQ6JWQgbGVuOiVkIiwKKwkJCQltc2dfdHlwZV9zdHIodHlwZSksCisJCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhzdmNfZm91cmNjKSwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQsIHNpemUpOworCQkJaWYgKHNpemUgPiAwKQorCQkJCXZjaGlxX2xvZ19kdW1wX21lbSgiUmN2ZCIsIDAsIGhlYWRlci0+ZGF0YSwKKwkJCQkJbWluKDY0LCBzaXplKSk7CisJCX0KKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBWQ0hJUV9NU0dfT1BFTkFDSzoKKwkJCWlmIChzaXplID49IHNpemVvZihzdHJ1Y3QgdmNoaXFfb3BlbmFja19wYXlsb2FkKSkgeworCQkJCWNvbnN0IHN0cnVjdCB2Y2hpcV9vcGVuYWNrX3BheWxvYWQgKnBheWxvYWQgPQorCQkJCQkoc3RydWN0IHZjaGlxX29wZW5hY2tfcGF5bG9hZCAqKQorCQkJCQloZWFkZXItPmRhdGE7CisJCQkJc2VydmljZS0+cGVlcl92ZXJzaW9uID0gcGF5bG9hZC0+dmVyc2lvbjsKKwkJCX0KKwkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX3N5bmNfbG9nX2xldmVsLAorCQkJCSIlZDogc2YgT1BFTkFDS0AleCwleCAoJWQtPiVkKSB2OiVkIiwKKwkJCQlzdGF0ZS0+aWQsICh1bnNpZ25lZCBpbnQpaGVhZGVyLCBzaXplLAorCQkJCXJlbW90ZXBvcnQsIGxvY2FscG9ydCwgc2VydmljZS0+cGVlcl92ZXJzaW9uKTsKKwkJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9PUEVOSU5HKSB7CisJCQkJc2VydmljZS0+cmVtb3RlcG9ydCA9IHJlbW90ZXBvcnQ7CisJCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQkJVkNISVFfU1JWU1RBVEVfT1BFTlNZTkMpOworCQkJCXNlcnZpY2UtPnN5bmMgPSAxOworCQkJCXVwKCZzZXJ2aWNlLT5yZW1vdmVfZXZlbnQpOworCQkJfQorCQkJcmVsZWFzZV9tZXNzYWdlX3N5bmMoc3RhdGUsIGhlYWRlcik7CisJCQlicmVhazsKKworCQljYXNlIFZDSElRX01TR19EQVRBOgorCQkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX3N5bmNfbG9nX2xldmVsLAorCQkJCSIlZDogc2YgREFUQUAleCwleCAoJWQtPiVkKSIsCisJCQkJc3RhdGUtPmlkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSwKKwkJCQlyZW1vdGVwb3J0LCBsb2NhbHBvcnQpOworCisJCQlpZiAoKHNlcnZpY2UtPnJlbW90ZXBvcnQgPT0gcmVtb3RlcG9ydCkgJiYKKwkJCQkoc2VydmljZS0+c3J2c3RhdGUgPT0KKwkJCQlWQ0hJUV9TUlZTVEFURV9PUEVOU1lOQykpIHsKKwkJCQlpZiAobWFrZV9zZXJ2aWNlX2NhbGxiYWNrKHNlcnZpY2UsCisJCQkJCVZDSElRX01FU1NBR0VfQVZBSUxBQkxFLCBoZWFkZXIsCisJCQkJCU5VTEwpID09IFZDSElRX1JFVFJZKQorCQkJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3luY19sb2dfbGV2ZWwsCisJCQkJCQkic3luY2hyb25vdXMgY2FsbGJhY2sgdG8gIgorCQkJCQkJInNlcnZpY2UgJWQgcmV0dXJucyAiCisJCQkJCQkiVkNISVFfUkVUUlkiLAorCQkJCQkJbG9jYWxwb3J0KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfc3luY19sb2dfbGV2ZWwsCisJCQkJIiVkOiBzZiB1bmV4cGVjdGVkIG1zZ2lkICV4QCV4LCV4IiwKKwkJCQlzdGF0ZS0+aWQsIG1zZ2lkLCAodW5zaWduZWQgaW50KWhlYWRlciwgc2l6ZSk7CisJCQlyZWxlYXNlX21lc3NhZ2Vfc3luYyhzdGF0ZSwgaGVhZGVyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK2luaXRfYnVsa19xdWV1ZShWQ0hJUV9CVUxLX1FVRVVFX1QgKnF1ZXVlKQoreworCXF1ZXVlLT5sb2NhbF9pbnNlcnQgPSAwOworCXF1ZXVlLT5yZW1vdGVfaW5zZXJ0ID0gMDsKKwlxdWV1ZS0+cHJvY2VzcyA9IDA7CisJcXVldWUtPnJlbW90ZV9ub3RpZnkgPSAwOworCXF1ZXVlLT5yZW1vdmUgPSAwOworfQorCisKK2lubGluZSBjb25zdCBjaGFyICoKK2dldF9jb25uX3N0YXRlX25hbWUoVkNISVFfQ09OTlNUQVRFX1QgY29ubl9zdGF0ZSkKK3sKKwlyZXR1cm4gY29ubl9zdGF0ZV9uYW1lc1tjb25uX3N0YXRlXTsKK30KKworCitWQ0hJUV9TTE9UX1pFUk9fVCAqCit2Y2hpcV9pbml0X3Nsb3RzKHZvaWQgKm1lbV9iYXNlLCBpbnQgbWVtX3NpemUpCit7CisJaW50IG1lbV9hbGlnbiA9IChWQ0hJUV9TTE9UX1NJWkUgLSAoaW50KW1lbV9iYXNlKSAmIFZDSElRX1NMT1RfTUFTSzsKKwlWQ0hJUV9TTE9UX1pFUk9fVCAqc2xvdF96ZXJvID0KKwkJKFZDSElRX1NMT1RfWkVST19UICopKChjaGFyICopbWVtX2Jhc2UgKyBtZW1fYWxpZ24pOworCWludCBudW1fc2xvdHMgPSAobWVtX3NpemUgLSBtZW1fYWxpZ24pL1ZDSElRX1NMT1RfU0laRTsKKwlpbnQgZmlyc3RfZGF0YV9zbG90ID0gVkNISVFfU0xPVF9aRVJPX1NMT1RTOworCisJLyogRW5zdXJlIHRoZXJlIGlzIGVub3VnaCBtZW1vcnkgdG8gcnVuIGFuIGFic29sdXRlbHkgbWluaW11bSBzeXN0ZW0gKi8KKwludW1fc2xvdHMgLT0gZmlyc3RfZGF0YV9zbG90OworCisJaWYgKG51bV9zbG90cyA8IDQpIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJInZjaGlxX2luaXRfc2xvdHMgLSBpbnN1ZmZpY2llbnQgbWVtb3J5ICV4IGJ5dGVzIiwKKwkJCW1lbV9zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbWVtc2V0KHNsb3RfemVybywgMCwgc2l6ZW9mKFZDSElRX1NMT1RfWkVST19UKSk7CisKKwlzbG90X3plcm8tPm1hZ2ljID0gVkNISVFfTUFHSUM7CisJc2xvdF96ZXJvLT52ZXJzaW9uID0gVkNISVFfVkVSU0lPTjsKKwlzbG90X3plcm8tPnZlcnNpb25fbWluID0gVkNISVFfVkVSU0lPTl9NSU47CisJc2xvdF96ZXJvLT5zbG90X3plcm9fc2l6ZSA9IHNpemVvZihWQ0hJUV9TTE9UX1pFUk9fVCk7CisJc2xvdF96ZXJvLT5zbG90X3NpemUgPSBWQ0hJUV9TTE9UX1NJWkU7CisJc2xvdF96ZXJvLT5tYXhfc2xvdHMgPSBWQ0hJUV9NQVhfU0xPVFM7CisJc2xvdF96ZXJvLT5tYXhfc2xvdHNfcGVyX3NpZGUgPSBWQ0hJUV9NQVhfU0xPVFNfUEVSX1NJREU7CisKKwlzbG90X3plcm8tPm1hc3Rlci5zbG90X3N5bmMgPSBmaXJzdF9kYXRhX3Nsb3Q7CisJc2xvdF96ZXJvLT5tYXN0ZXIuc2xvdF9maXJzdCA9IGZpcnN0X2RhdGFfc2xvdCArIDE7CisJc2xvdF96ZXJvLT5tYXN0ZXIuc2xvdF9sYXN0ID0gZmlyc3RfZGF0YV9zbG90ICsgKG51bV9zbG90cy8yKSAtIDE7CisJc2xvdF96ZXJvLT5zbGF2ZS5zbG90X3N5bmMgPSBmaXJzdF9kYXRhX3Nsb3QgKyAobnVtX3Nsb3RzLzIpOworCXNsb3RfemVyby0+c2xhdmUuc2xvdF9maXJzdCA9IGZpcnN0X2RhdGFfc2xvdCArIChudW1fc2xvdHMvMikgKyAxOworCXNsb3RfemVyby0+c2xhdmUuc2xvdF9sYXN0ID0gZmlyc3RfZGF0YV9zbG90ICsgbnVtX3Nsb3RzIC0gMTsKKworCXJldHVybiBzbG90X3plcm87Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9pbml0X3N0YXRlKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9TTE9UX1pFUk9fVCAqc2xvdF96ZXJvLAorCQkgaW50IGlzX21hc3RlcikKK3sKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqbG9jYWw7CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgKnJlbW90ZTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisJY2hhciB0aHJlYWRuYW1lWzEwXTsKKwlzdGF0aWMgaW50IGlkOworCWludCBpOworCisJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlczogc2xvdF96ZXJvID0gMHglMDhseCwgaXNfbWFzdGVyID0gJWQiLAorCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcpc2xvdF96ZXJvLCBpc19tYXN0ZXIpOworCisJLyogQ2hlY2sgdGhlIGlucHV0IGNvbmZpZ3VyYXRpb24gKi8KKworCWlmIChzbG90X3plcm8tPm1hZ2ljICE9IFZDSElRX01BR0lDKSB7CisJCXZjaGlxX2xvdWRfZXJyb3JfaGVhZGVyKCk7CisJCXZjaGlxX2xvdWRfZXJyb3IoIkludmFsaWQgVkNISVEgbWFnaWMgdmFsdWUgZm91bmQuIik7CisJCXZjaGlxX2xvdWRfZXJyb3IoInNsb3RfemVybz0leDogbWFnaWM9JXggKGV4cGVjdGVkICV4KSIsCisJCQkodW5zaWduZWQgaW50KXNsb3RfemVybywgc2xvdF96ZXJvLT5tYWdpYywgVkNISVFfTUFHSUMpOworCQl2Y2hpcV9sb3VkX2Vycm9yX2Zvb3RlcigpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCisJaWYgKHNsb3RfemVyby0+dmVyc2lvbiA8IFZDSElRX1ZFUlNJT05fTUlOKSB7CisJCXZjaGlxX2xvdWRfZXJyb3JfaGVhZGVyKCk7CisJCXZjaGlxX2xvdWRfZXJyb3IoIkluY29tcGF0aWJsZSBWQ0hJUSB2ZXJzaW9ucyBmb3VuZC4iKTsKKwkJdmNoaXFfbG91ZF9lcnJvcigic2xvdF96ZXJvPSV4OiBWaWRlb0NvcmUgdmVyc2lvbj0lZCAiCisJCQkiKG1pbmltdW0gJWQpIiwKKwkJCSh1bnNpZ25lZCBpbnQpc2xvdF96ZXJvLCBzbG90X3plcm8tPnZlcnNpb24sCisJCQlWQ0hJUV9WRVJTSU9OX01JTik7CisJCXZjaGlxX2xvdWRfZXJyb3IoIlJlc3RhcnQgd2l0aCBhIG5ld2VyIFZpZGVvQ29yZSBpbWFnZS4iKTsKKwkJdmNoaXFfbG91ZF9lcnJvcl9mb290ZXIoKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCWlmIChWQ0hJUV9WRVJTSU9OIDwgc2xvdF96ZXJvLT52ZXJzaW9uX21pbikgeworCQl2Y2hpcV9sb3VkX2Vycm9yX2hlYWRlcigpOworCQl2Y2hpcV9sb3VkX2Vycm9yKCJJbmNvbXBhdGlibGUgVkNISVEgdmVyc2lvbnMgZm91bmQuIik7CisJCXZjaGlxX2xvdWRfZXJyb3IoInNsb3RfemVybz0leDogdmVyc2lvbj0lZCAoVmlkZW9Db3JlICIKKwkJCSJtaW5pbXVtICVkKSIsCisJCQkodW5zaWduZWQgaW50KXNsb3RfemVybywgVkNISVFfVkVSU0lPTiwKKwkJCXNsb3RfemVyby0+dmVyc2lvbl9taW4pOworCQl2Y2hpcV9sb3VkX2Vycm9yKCJSZXN0YXJ0IHdpdGggYSBuZXdlciBrZXJuZWwuIik7CisJCXZjaGlxX2xvdWRfZXJyb3JfZm9vdGVyKCk7CisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwl9CisKKwlpZiAoKHNsb3RfemVyby0+c2xvdF96ZXJvX3NpemUgIT0gc2l6ZW9mKFZDSElRX1NMT1RfWkVST19UKSkgfHwKKwkJIChzbG90X3plcm8tPnNsb3Rfc2l6ZSAhPSBWQ0hJUV9TTE9UX1NJWkUpIHx8CisJCSAoc2xvdF96ZXJvLT5tYXhfc2xvdHMgIT0gVkNISVFfTUFYX1NMT1RTKSB8fAorCQkgKHNsb3RfemVyby0+bWF4X3Nsb3RzX3Blcl9zaWRlICE9IFZDSElRX01BWF9TTE9UU19QRVJfU0lERSkpIHsKKwkJdmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIoKTsKKwkJaWYgKHNsb3RfemVyby0+c2xvdF96ZXJvX3NpemUgIT0gc2l6ZW9mKFZDSElRX1NMT1RfWkVST19UKSkKKwkJCXZjaGlxX2xvdWRfZXJyb3IoInNsb3RfemVybz0leDogc2xvdF96ZXJvX3NpemU9JXggIgorCQkJCSIoZXhwZWN0ZWQgJXgpIiwKKwkJCQkodW5zaWduZWQgaW50KXNsb3RfemVybywKKwkJCQlzbG90X3plcm8tPnNsb3RfemVyb19zaXplLAorCQkJCXNpemVvZihWQ0hJUV9TTE9UX1pFUk9fVCkpOworCQlpZiAoc2xvdF96ZXJvLT5zbG90X3NpemUgIT0gVkNISVFfU0xPVF9TSVpFKQorCQkJdmNoaXFfbG91ZF9lcnJvcigic2xvdF96ZXJvPSV4OiBzbG90X3NpemU9JWQgIgorCQkJCSIoZXhwZWN0ZWQgJWQiLAorCQkJCSh1bnNpZ25lZCBpbnQpc2xvdF96ZXJvLCBzbG90X3plcm8tPnNsb3Rfc2l6ZSwKKwkJCQlWQ0hJUV9TTE9UX1NJWkUpOworCQlpZiAoc2xvdF96ZXJvLT5tYXhfc2xvdHMgIT0gVkNISVFfTUFYX1NMT1RTKQorCQkJdmNoaXFfbG91ZF9lcnJvcigic2xvdF96ZXJvPSV4OiBtYXhfc2xvdHM9JWQgIgorCQkJCSIoZXhwZWN0ZWQgJWQpIiwKKwkJCQkodW5zaWduZWQgaW50KXNsb3RfemVybywgc2xvdF96ZXJvLT5tYXhfc2xvdHMsCisJCQkJVkNISVFfTUFYX1NMT1RTKTsKKwkJaWYgKHNsb3RfemVyby0+bWF4X3Nsb3RzX3Blcl9zaWRlICE9IFZDSElRX01BWF9TTE9UU19QRVJfU0lERSkKKwkJCXZjaGlxX2xvdWRfZXJyb3IoInNsb3RfemVybz0leDogbWF4X3Nsb3RzX3Blcl9zaWRlPSVkICIKKwkJCQkiKGV4cGVjdGVkICVkKSIsCisJCQkJKHVuc2lnbmVkIGludClzbG90X3plcm8sCisJCQkJc2xvdF96ZXJvLT5tYXhfc2xvdHNfcGVyX3NpZGUsCisJCQkJVkNISVFfTUFYX1NMT1RTX1BFUl9TSURFKTsKKwkJdmNoaXFfbG91ZF9lcnJvcl9mb290ZXIoKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCWlmIChWQ0hJUV9WRVJTSU9OIDwgc2xvdF96ZXJvLT52ZXJzaW9uKQorCQlzbG90X3plcm8tPnZlcnNpb24gPSBWQ0hJUV9WRVJTSU9OOworCisJaWYgKGlzX21hc3RlcikgeworCQlsb2NhbCA9ICZzbG90X3plcm8tPm1hc3RlcjsKKwkJcmVtb3RlID0gJnNsb3RfemVyby0+c2xhdmU7CisJfSBlbHNlIHsKKwkJbG9jYWwgPSAmc2xvdF96ZXJvLT5zbGF2ZTsKKwkJcmVtb3RlID0gJnNsb3RfemVyby0+bWFzdGVyOworCX0KKworCWlmIChsb2NhbC0+aW5pdGlhbGlzZWQpIHsKKwkJdmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIoKTsKKwkJaWYgKHJlbW90ZS0+aW5pdGlhbGlzZWQpCisJCQl2Y2hpcV9sb3VkX2Vycm9yKCJsb2NhbCBzdGF0ZSBoYXMgYWxyZWFkeSBiZWVuICIKKwkJCQkiaW5pdGlhbGlzZWQiKTsKKwkJZWxzZQorCQkJdmNoaXFfbG91ZF9lcnJvcigibWFzdGVyL3NsYXZlIG1pc21hdGNoIC0gdHdvICVzcyIsCisJCQkJaXNfbWFzdGVyID8gIm1hc3RlciIgOiAic2xhdmUiKTsKKwkJdmNoaXFfbG91ZF9lcnJvcl9mb290ZXIoKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKFZDSElRX1NUQVRFX1QpKTsKKworCXN0YXRlLT5pZCA9IGlkKys7CisJc3RhdGUtPmlzX21hc3RlciA9IGlzX21hc3RlcjsKKworCS8qCisJCWluaXRpYWxpemUgc2hhcmVkIHN0YXRlIHBvaW50ZXJzCisJICovCisKKwlzdGF0ZS0+bG9jYWwgPSBsb2NhbDsKKwlzdGF0ZS0+cmVtb3RlID0gcmVtb3RlOworCXN0YXRlLT5zbG90X2RhdGEgPSAoVkNISVFfU0xPVF9UICopc2xvdF96ZXJvOworCisJLyoKKwkJaW5pdGlhbGl6ZSBldmVudHMgYW5kIG11dGV4ZXMKKwkgKi8KKworCXNlbWFfaW5pdCgmc3RhdGUtPmNvbm5lY3QsIDApOworCW11dGV4X2luaXQoJnN0YXRlLT5tdXRleCk7CisJc2VtYV9pbml0KCZzdGF0ZS0+dHJpZ2dlcl9ldmVudCwgMCk7CisJc2VtYV9pbml0KCZzdGF0ZS0+cmVjeWNsZV9ldmVudCwgMCk7CisJc2VtYV9pbml0KCZzdGF0ZS0+c3luY190cmlnZ2VyX2V2ZW50LCAwKTsKKwlzZW1hX2luaXQoJnN0YXRlLT5zeW5jX3JlbGVhc2VfZXZlbnQsIDApOworCisJbXV0ZXhfaW5pdCgmc3RhdGUtPnNsb3RfbXV0ZXgpOworCW11dGV4X2luaXQoJnN0YXRlLT5yZWN5Y2xlX211dGV4KTsKKwltdXRleF9pbml0KCZzdGF0ZS0+c3luY19tdXRleCk7CisJbXV0ZXhfaW5pdCgmc3RhdGUtPmJ1bGtfdHJhbnNmZXJfbXV0ZXgpOworCisJc2VtYV9pbml0KCZzdGF0ZS0+c2xvdF9hdmFpbGFibGVfZXZlbnQsIDApOworCXNlbWFfaW5pdCgmc3RhdGUtPnNsb3RfcmVtb3ZlX2V2ZW50LCAwKTsKKwlzZW1hX2luaXQoJnN0YXRlLT5kYXRhX3F1b3RhX2V2ZW50LCAwKTsKKworCXN0YXRlLT5zbG90X3F1ZXVlX2F2YWlsYWJsZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkNISVFfTUFYX1NFUlZJQ0VTOyBpKyspIHsKKwkJVkNISVFfU0VSVklDRV9RVU9UQV9UICpzZXJ2aWNlX3F1b3RhID0KKwkJCSZzdGF0ZS0+c2VydmljZV9xdW90YXNbaV07CisJCXNlbWFfaW5pdCgmc2VydmljZV9xdW90YS0+cXVvdGFfZXZlbnQsIDApOworCX0KKworCWZvciAoaSA9IGxvY2FsLT5zbG90X2ZpcnN0OyBpIDw9IGxvY2FsLT5zbG90X2xhc3Q7IGkrKykgeworCQlsb2NhbC0+c2xvdF9xdWV1ZVtzdGF0ZS0+c2xvdF9xdWV1ZV9hdmFpbGFibGUrK10gPSBpOworCQl1cCgmc3RhdGUtPnNsb3RfYXZhaWxhYmxlX2V2ZW50KTsKKwl9CisKKwlzdGF0ZS0+ZGVmYXVsdF9zbG90X3F1b3RhID0gc3RhdGUtPnNsb3RfcXVldWVfYXZhaWxhYmxlLzI7CisJc3RhdGUtPmRlZmF1bHRfbWVzc2FnZV9xdW90YSA9CisJCW1pbigodW5zaWduZWQgc2hvcnQpKHN0YXRlLT5kZWZhdWx0X3Nsb3RfcXVvdGEgKiAyNTYpLAorCQkodW5zaWduZWQgc2hvcnQpfjApOworCisJc3RhdGUtPnByZXZpb3VzX2RhdGFfaW5kZXggPSAtMTsKKwlzdGF0ZS0+ZGF0YV91c2VfY291bnQgPSAwOworCXN0YXRlLT5kYXRhX3F1b3RhID0gc3RhdGUtPnNsb3RfcXVldWVfYXZhaWxhYmxlIC0gMTsKKworCWxvY2FsLT50cmlnZ2VyLmV2ZW50ID0gJnN0YXRlLT50cmlnZ2VyX2V2ZW50OworCXJlbW90ZV9ldmVudF9jcmVhdGUoJmxvY2FsLT50cmlnZ2VyKTsKKwlsb2NhbC0+dHhfcG9zID0gMDsKKworCWxvY2FsLT5yZWN5Y2xlLmV2ZW50ID0gJnN0YXRlLT5yZWN5Y2xlX2V2ZW50OworCXJlbW90ZV9ldmVudF9jcmVhdGUoJmxvY2FsLT5yZWN5Y2xlKTsKKwlsb2NhbC0+c2xvdF9xdWV1ZV9yZWN5Y2xlID0gc3RhdGUtPnNsb3RfcXVldWVfYXZhaWxhYmxlOworCisJbG9jYWwtPnN5bmNfdHJpZ2dlci5ldmVudCA9ICZzdGF0ZS0+c3luY190cmlnZ2VyX2V2ZW50OworCXJlbW90ZV9ldmVudF9jcmVhdGUoJmxvY2FsLT5zeW5jX3RyaWdnZXIpOworCisJbG9jYWwtPnN5bmNfcmVsZWFzZS5ldmVudCA9ICZzdGF0ZS0+c3luY19yZWxlYXNlX2V2ZW50OworCXJlbW90ZV9ldmVudF9jcmVhdGUoJmxvY2FsLT5zeW5jX3JlbGVhc2UpOworCisJLyogQXQgc3RhcnQtb2YtZGF5LCB0aGUgc2xvdCBpcyBlbXB0eSBhbmQgYXZhaWxhYmxlICovCisJKChWQ0hJUV9IRUFERVJfVCAqKVNMT1RfREFUQV9GUk9NX0lOREVYKHN0YXRlLCBsb2NhbC0+c2xvdF9zeW5jKSktPm1zZ2lkCisJCT0gVkNISVFfTVNHSURfUEFERElORzsKKwlyZW1vdGVfZXZlbnRfc2lnbmFsX2xvY2FsKCZsb2NhbC0+c3luY19yZWxlYXNlKTsKKworCWxvY2FsLT5kZWJ1Z1tERUJVR19FTlRSSUVTXSA9IERFQlVHX01BWDsKKworCXN0YXR1cyA9IHZjaGlxX3BsYXRmb3JtX2luaXRfc3RhdGUoc3RhdGUpOworCisJLyoKKwkJYnJpbmcgdXAgc2xvdCBoYW5kbGVyIHRocmVhZAorCSAqLworCXNucHJpbnRmKHRocmVhZG5hbWUsIHNpemVvZih0aHJlYWRuYW1lKSwgIlZDSElRLSVkIiwgc3RhdGUtPmlkKTsKKwlzdGF0ZS0+c2xvdF9oYW5kbGVyX3RocmVhZCA9IGt0aHJlYWRfY3JlYXRlKCZzbG90X2hhbmRsZXJfZnVuYywKKwkJKHZvaWQgKilzdGF0ZSwKKwkJdGhyZWFkbmFtZSk7CisKKwlpZiAoc3RhdGUtPnNsb3RfaGFuZGxlcl90aHJlYWQgPT0gTlVMTCkgeworCQl2Y2hpcV9sb3VkX2Vycm9yX2hlYWRlcigpOworCQl2Y2hpcV9sb3VkX2Vycm9yKCJjb3VsZG4ndCBjcmVhdGUgdGhyZWFkICVzIiwgdGhyZWFkbmFtZSk7CisJCXZjaGlxX2xvdWRfZXJyb3JfZm9vdGVyKCk7CisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKwl9CisJc2V0X3VzZXJfbmljZShzdGF0ZS0+c2xvdF9oYW5kbGVyX3RocmVhZCwgLTE5KTsKKwl3YWtlX3VwX3Byb2Nlc3Moc3RhdGUtPnNsb3RfaGFuZGxlcl90aHJlYWQpOworCisJc25wcmludGYodGhyZWFkbmFtZSwgc2l6ZW9mKHRocmVhZG5hbWUpLCAiVkNISVFyLSVkIiwgc3RhdGUtPmlkKTsKKwlzdGF0ZS0+cmVjeWNsZV90aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZSgmcmVjeWNsZV9mdW5jLAorCQkodm9pZCAqKXN0YXRlLAorCQl0aHJlYWRuYW1lKTsKKwlpZiAoc3RhdGUtPnJlY3ljbGVfdGhyZWFkID09IE5VTEwpIHsKKwkJdmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIoKTsKKwkJdmNoaXFfbG91ZF9lcnJvcigiY291bGRuJ3QgY3JlYXRlIHRocmVhZCAlcyIsIHRocmVhZG5hbWUpOworCQl2Y2hpcV9sb3VkX2Vycm9yX2Zvb3RlcigpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCXNldF91c2VyX25pY2Uoc3RhdGUtPnJlY3ljbGVfdGhyZWFkLCAtMTkpOworCXdha2VfdXBfcHJvY2VzcyhzdGF0ZS0+cmVjeWNsZV90aHJlYWQpOworCisJc25wcmludGYodGhyZWFkbmFtZSwgc2l6ZW9mKHRocmVhZG5hbWUpLCAiVkNISVFzLSVkIiwgc3RhdGUtPmlkKTsKKwlzdGF0ZS0+c3luY190aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZSgmc3luY19mdW5jLAorCQkodm9pZCAqKXN0YXRlLAorCQl0aHJlYWRuYW1lKTsKKwlpZiAoc3RhdGUtPnN5bmNfdGhyZWFkID09IE5VTEwpIHsKKwkJdmNoaXFfbG91ZF9lcnJvcl9oZWFkZXIoKTsKKwkJdmNoaXFfbG91ZF9lcnJvcigiY291bGRuJ3QgY3JlYXRlIHRocmVhZCAlcyIsIHRocmVhZG5hbWUpOworCQl2Y2hpcV9sb3VkX2Vycm9yX2Zvb3RlcigpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCXNldF91c2VyX25pY2Uoc3RhdGUtPnN5bmNfdGhyZWFkLCAtMjApOworCXdha2VfdXBfcHJvY2VzcyhzdGF0ZS0+c3luY190aHJlYWQpOworCisJQlVHX09OKHN0YXRlLT5pZCA+PSBWQ0hJUV9NQVhfU1RBVEVTKTsKKwl2Y2hpcV9zdGF0ZXNbc3RhdGUtPmlkXSA9IHN0YXRlOworCisJLyogSW5kaWNhdGUgcmVhZGluZXNzIHRvIHRoZSBvdGhlciBzaWRlICovCisJbG9jYWwtPmluaXRpYWxpc2VkID0gMTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIENhbGxlZCBmcm9tIGFwcGxpY2F0aW9uIHRocmVhZCB3aGVuIGEgY2xpZW50IG9yIHNlcnZlciBzZXJ2aWNlIGlzIGNyZWF0ZWQuICovCitWQ0hJUV9TRVJWSUNFX1QgKgordmNoaXFfYWRkX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUsCisJY29uc3QgVkNISVFfU0VSVklDRV9QQVJBTVNfVCAqcGFyYW1zLCBpbnQgc3J2c3RhdGUsCisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwgVkNISVFfVVNFUkRBVEFfVEVSTV9UIHVzZXJkYXRhX3Rlcm0pCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlOworCisJc2VydmljZSA9IGttYWxsb2Moc2l6ZW9mKFZDSElRX1NFUlZJQ0VfVCksIEdGUF9LRVJORUwpOworCWlmIChzZXJ2aWNlKSB7CisJCXNlcnZpY2UtPmJhc2UuZm91cmNjICAgPSBwYXJhbXMtPmZvdXJjYzsKKwkJc2VydmljZS0+YmFzZS5jYWxsYmFjayA9IHBhcmFtcy0+Y2FsbGJhY2s7CisJCXNlcnZpY2UtPmJhc2UudXNlcmRhdGEgPSBwYXJhbXMtPnVzZXJkYXRhOworCQlzZXJ2aWNlLT5oYW5kbGUgICAgICAgID0gVkNISVFfU0VSVklDRV9IQU5ETEVfSU5WQUxJRDsKKwkJc2VydmljZS0+cmVmX2NvdW50ICAgICA9IDE7CisJCXNlcnZpY2UtPnNydnN0YXRlICAgICAgPSBWQ0hJUV9TUlZTVEFURV9GUkVFOworCQlzZXJ2aWNlLT51c2VyZGF0YV90ZXJtID0gdXNlcmRhdGFfdGVybTsKKwkJc2VydmljZS0+bG9jYWxwb3J0ICAgICA9IFZDSElRX1BPUlRfRlJFRTsKKwkJc2VydmljZS0+cmVtb3RlcG9ydCAgICA9IFZDSElRX1BPUlRfRlJFRTsKKworCQlzZXJ2aWNlLT5wdWJsaWNfZm91cmNjID0gKHNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU5JTkcpID8KKwkJCVZDSElRX0ZPVVJDQ19JTlZBTElEIDogcGFyYW1zLT5mb3VyY2M7CisJCXNlcnZpY2UtPmNsaWVudF9pZCAgICAgPSAwOworCQlzZXJ2aWNlLT5hdXRvX2Nsb3NlICAgID0gMTsKKwkJc2VydmljZS0+c3luYyAgICAgICAgICA9IDA7CisJCXNlcnZpY2UtPmNsb3NpbmcgICAgICAgPSAwOworCQlzZXJ2aWNlLT50cmFjZSAgICAgICAgID0gMDsKKwkJYXRvbWljX3NldCgmc2VydmljZS0+cG9sbF9mbGFncywgMCk7CisJCXNlcnZpY2UtPnZlcnNpb24gICAgICAgPSBwYXJhbXMtPnZlcnNpb247CisJCXNlcnZpY2UtPnZlcnNpb25fbWluICAgPSBwYXJhbXMtPnZlcnNpb25fbWluOworCQlzZXJ2aWNlLT5zdGF0ZSAgICAgICAgID0gc3RhdGU7CisJCXNlcnZpY2UtPmluc3RhbmNlICAgICAgPSBpbnN0YW5jZTsKKwkJc2VydmljZS0+c2VydmljZV91c2VfY291bnQgPSAwOworCQlpbml0X2J1bGtfcXVldWUoJnNlcnZpY2UtPmJ1bGtfdHgpOworCQlpbml0X2J1bGtfcXVldWUoJnNlcnZpY2UtPmJ1bGtfcngpOworCQlzZW1hX2luaXQoJnNlcnZpY2UtPnJlbW92ZV9ldmVudCwgMCk7CisJCXNlbWFfaW5pdCgmc2VydmljZS0+YnVsa19yZW1vdmVfZXZlbnQsIDApOworCQltdXRleF9pbml0KCZzZXJ2aWNlLT5idWxrX211dGV4KTsKKwkJbWVtc2V0KCZzZXJ2aWNlLT5zdGF0cywgMCwgc2l6ZW9mKHNlcnZpY2UtPnN0YXRzKSk7CisJfSBlbHNlIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIk91dCBvZiBtZW1vcnkiKTsKKwl9CisKKwlpZiAoc2VydmljZSkgeworCQlWQ0hJUV9TRVJWSUNFX1QgKipwc2VydmljZSA9IE5VTEw7CisJCWludCBpOworCisJCS8qIEFsdGhvdWdoIGl0IGlzIHBlcmZlY3RseSBwb3NzaWJsZSB0byB1c2Ugc2VydmljZV9zcGlubG9jaworCQkqKiB0byBwcm90ZWN0IHRoZSBjcmVhdGlvbiBvZiBzZXJ2aWNlcywgaXQgaXMgb3ZlcmtpbGwgYXMgaXQKKwkJKiogZGlzYWJsZXMgaW50ZXJydXB0cyB3aGlsZSB0aGUgYXJyYXkgaXMgc2VhcmNoZWQuCisJCSoqIFRoZSBvbmx5IGRhbmdlciBpcyBvZiBhbm90aGVyIHRocmVhZCB0cnlpbmcgdG8gY3JlYXRlIGEKKwkJKiogc2VydmljZSAtIHNlcnZpY2UgZGVsZXRpb24gaXMgc2FmZS4KKwkJKiogVGhlcmVmb3JlIGl0IGlzIHByZWZlcmFibGUgdG8gdXNlIHN0YXRlLT5tdXRleCB3aGljaCwKKwkJKiogYWx0aG91Z2ggc2xvd2VyIHRvIGNsYWltLCBkb2Vzbid0IGJsb2NrIGludGVycnVwdHMgd2hpbGUKKwkJKiogaXQgaXMgaGVsZC4KKwkJKi8KKworCQltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCisJCS8qIFByZXBhcmUgdG8gdXNlIGEgcHJldmlvdXNseSB1bnVzZWQgc2VydmljZSAqLworCQlpZiAoc3RhdGUtPnVudXNlZF9zZXJ2aWNlIDwgVkNISVFfTUFYX1NFUlZJQ0VTKQorCQkJcHNlcnZpY2UgPSAmc3RhdGUtPnNlcnZpY2VzW3N0YXRlLT51bnVzZWRfc2VydmljZV07CisKKwkJaWYgKHNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU5JTkcpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+dW51c2VkX3NlcnZpY2U7IGkrKykgeworCQkJCVZDSElRX1NFUlZJQ0VfVCAqc3J2ID0gc3RhdGUtPnNlcnZpY2VzW2ldOworCQkJCWlmICghc3J2KSB7CisJCQkJCXBzZXJ2aWNlID0gJnN0YXRlLT5zZXJ2aWNlc1tpXTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJZm9yIChpID0gKHN0YXRlLT51bnVzZWRfc2VydmljZSAtIDEpOyBpID49IDA7IGktLSkgeworCQkJCVZDSElRX1NFUlZJQ0VfVCAqc3J2ID0gc3RhdGUtPnNlcnZpY2VzW2ldOworCQkJCWlmICghc3J2KQorCQkJCQlwc2VydmljZSA9ICZzdGF0ZS0+c2VydmljZXNbaV07CisJCQkJZWxzZSBpZiAoKHNydi0+cHVibGljX2ZvdXJjYyA9PSBwYXJhbXMtPmZvdXJjYykKKwkJCQkJJiYgKChzcnYtPmluc3RhbmNlICE9IGluc3RhbmNlKSB8fAorCQkJCQkoc3J2LT5iYXNlLmNhbGxiYWNrICE9CisJCQkJCXBhcmFtcy0+Y2FsbGJhY2spKSkgeworCQkJCQkvKiBUaGVyZSBpcyBhbm90aGVyIHNlcnZlciB1c2luZyB0aGlzCisJCQkJCSoqIGZvdXJjYyB3aGljaCBkb2Vzbid0IG1hdGNoLiAqLworCQkJCQlwc2VydmljZSA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChwc2VydmljZSkgeworCQkJc2VydmljZS0+bG9jYWxwb3J0ID0gKHBzZXJ2aWNlIC0gc3RhdGUtPnNlcnZpY2VzKTsKKwkJCWlmICghaGFuZGxlX3NlcSkKKwkJCQloYW5kbGVfc2VxID0gVkNISVFfTUFYX1NUQVRFUyAqCisJCQkJCSBWQ0hJUV9NQVhfU0VSVklDRVM7CisJCQlzZXJ2aWNlLT5oYW5kbGUgPSBoYW5kbGVfc2VxIHwKKwkJCQkoc3RhdGUtPmlkICogVkNISVFfTUFYX1NFUlZJQ0VTKSB8CisJCQkJc2VydmljZS0+bG9jYWxwb3J0OworCQkJaGFuZGxlX3NlcSArPSBWQ0hJUV9NQVhfU1RBVEVTICogVkNISVFfTUFYX1NFUlZJQ0VTOworCQkJKnBzZXJ2aWNlID0gc2VydmljZTsKKwkJCWlmIChwc2VydmljZSA9PSAmc3RhdGUtPnNlcnZpY2VzW3N0YXRlLT51bnVzZWRfc2VydmljZV0pCisJCQkJc3RhdGUtPnVudXNlZF9zZXJ2aWNlKys7CisJCX0KKworCQltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisKKwkJaWYgKCFwc2VydmljZSkgeworCQkJa2ZyZWUoc2VydmljZSk7CisJCQlzZXJ2aWNlID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChzZXJ2aWNlKSB7CisJCVZDSElRX1NFUlZJQ0VfUVVPVEFfVCAqc2VydmljZV9xdW90YSA9CisJCQkmc3RhdGUtPnNlcnZpY2VfcXVvdGFzW3NlcnZpY2UtPmxvY2FscG9ydF07CisJCXNlcnZpY2VfcXVvdGEtPnNsb3RfcXVvdGEgPSBzdGF0ZS0+ZGVmYXVsdF9zbG90X3F1b3RhOworCQlzZXJ2aWNlX3F1b3RhLT5tZXNzYWdlX3F1b3RhID0gc3RhdGUtPmRlZmF1bHRfbWVzc2FnZV9xdW90YTsKKwkJaWYgKHNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50ID09IDApCisJCQlzZXJ2aWNlX3F1b3RhLT5wcmV2aW91c190eF9pbmRleCA9CisJCQkJU0xPVF9RVUVVRV9JTkRFWF9GUk9NX1BPUyhzdGF0ZS0+bG9jYWxfdHhfcG9zKQorCQkJCS0gMTsKKworCQkvKiBCcmluZyB0aGlzIHNlcnZpY2Ugb25saW5lICovCisJCXZjaGlxX3NldF9zZXJ2aWNlX3N0YXRlKHNlcnZpY2UsIHNydnN0YXRlKTsKKworCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX21zZ19sb2dfbGV2ZWwsCisJCQkiJXMgU2VydmljZSAlYyVjJWMlYyBTcmNQb3J0OiVkIiwKKwkJCShzcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9PUEVOSU5HKQorCQkJPyAiT3BlbiIgOiAiQWRkIiwKKwkJCVZDSElRX0ZPVVJDQ19BU180Q0hBUlMocGFyYW1zLT5mb3VyY2MpLAorCQkJc2VydmljZS0+bG9jYWxwb3J0KTsKKwl9CisKKwkvKiBEb24ndCB1bmxvY2sgdGhlIHNlcnZpY2UgLSBsZWF2ZSBpdCB3aXRoIGEgcmVmX2NvdW50IG9mIDEuICovCisKKwlyZXR1cm4gc2VydmljZTsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX29wZW5fc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBjbGllbnRfaWQpCit7CisJc3RydWN0IHZjaGlxX29wZW5fcGF5bG9hZCBwYXlsb2FkID0geworCQlzZXJ2aWNlLT5iYXNlLmZvdXJjYywKKwkJY2xpZW50X2lkLAorCQlzZXJ2aWNlLT52ZXJzaW9uLAorCQlzZXJ2aWNlLT52ZXJzaW9uX21pbgorCX07CisJVkNISVFfRUxFTUVOVF9UIGJvZHkgPSB7ICZwYXlsb2FkLCBzaXplb2YocGF5bG9hZCkgfTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCisJc2VydmljZS0+Y2xpZW50X2lkID0gY2xpZW50X2lkOworCXZjaGlxX3VzZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UpOworCXN0YXR1cyA9IHF1ZXVlX21lc3NhZ2Uoc2VydmljZS0+c3RhdGUsIE5VTEwsCisJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19PUEVOLCBzZXJ2aWNlLT5sb2NhbHBvcnQsIDApLAorCQkmYm9keSwgMSwgc2l6ZW9mKHBheWxvYWQpLCBRTUZMQUdTX0lTX0JMT0NLSU5HKTsKKwlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpIHsKKwkJLyogV2FpdCBmb3IgdGhlIEFDSy9OQUsgKi8KKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KSAhPSAwKSB7CisJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJCXZjaGlxX3JlbGVhc2Vfc2VydmljZV9pbnRlcm5hbChzZXJ2aWNlKTsKKwkJfSBlbHNlIGlmICgoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfT1BFTikgJiYKKwkJCShzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9PUEVOU1lOQykpIHsKKwkJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9DTE9TRVdBSVQpCisJCQkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkiJWQ6IG9zaSAtIHNydnN0YXRlID0gJXMgKHJlZiAlZCkiLAorCQkJCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsCisJCQkJCXNydnN0YXRlX25hbWVzW3NlcnZpY2UtPnNydnN0YXRlXSwKKwkJCQkJc2VydmljZS0+cmVmX2NvdW50KTsKKwkJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCQkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgZXJyb3JfY291bnQpOworCQkJdmNoaXFfcmVsZWFzZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UpOworCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkCityZWxlYXNlX3NlcnZpY2VfbWVzc2FnZXMoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gc2VydmljZS0+c3RhdGU7CisJaW50IHNsb3RfbGFzdCA9IHN0YXRlLT5yZW1vdGUtPnNsb3RfbGFzdDsKKwlpbnQgaTsKKworCS8qIFJlbGVhc2UgYW55IGNsYWltZWQgbWVzc2FnZXMgYWltZWQgYXQgdGhpcyBzZXJ2aWNlICovCisKKwlpZiAoc2VydmljZS0+c3luYykgeworCQlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyID0KKwkJCShWQ0hJUV9IRUFERVJfVCAqKVNMT1RfREFUQV9GUk9NX0lOREVYKHN0YXRlLAorCQkJCQkJc3RhdGUtPnJlbW90ZS0+c2xvdF9zeW5jKTsKKwkJaWYgKFZDSElRX01TR19EU1RQT1JUKGhlYWRlci0+bXNnaWQpID09IHNlcnZpY2UtPmxvY2FscG9ydCkKKwkJCXJlbGVhc2VfbWVzc2FnZV9zeW5jKHN0YXRlLCBoZWFkZXIpOworCisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSBzdGF0ZS0+cmVtb3RlLT5zbG90X2ZpcnN0OyBpIDw9IHNsb3RfbGFzdDsgaSsrKSB7CisJCVZDSElRX1NMT1RfSU5GT19UICpzbG90X2luZm8gPQorCQkJU0xPVF9JTkZPX0ZST01fSU5ERVgoc3RhdGUsIGkpOworCQlpZiAoc2xvdF9pbmZvLT5yZWxlYXNlX2NvdW50ICE9IHNsb3RfaW5mby0+dXNlX2NvdW50KSB7CisJCQljaGFyICpkYXRhID0KKwkJCQkoY2hhciAqKVNMT1RfREFUQV9GUk9NX0lOREVYKHN0YXRlLCBpKTsKKwkJCXVuc2lnbmVkIGludCBwb3MsIGVuZDsKKworCQkJZW5kID0gVkNISVFfU0xPVF9TSVpFOworCQkJaWYgKGRhdGEgPT0gc3RhdGUtPnJ4X2RhdGEpCisJCQkJLyogVGhpcyBidWZmZXIgaXMgc3RpbGwgYmVpbmcgcmVhZCBmcm9tIC0gc3RvcAorCQkJCSoqIGF0IHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24gKi8KKwkJCQllbmQgPSBzdGF0ZS0+cnhfcG9zICYgVkNISVFfU0xPVF9NQVNLOworCisJCQlwb3MgPSAwOworCisJCQl3aGlsZSAocG9zIDwgZW5kKSB7CisJCQkJVkNISVFfSEVBREVSX1QgKmhlYWRlciA9CisJCQkJCShWQ0hJUV9IRUFERVJfVCAqKShkYXRhICsgcG9zKTsKKwkJCQlpbnQgbXNnaWQgPSBoZWFkZXItPm1zZ2lkOworCQkJCWludCBwb3J0ID0gVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpOworCQkJCWlmICgocG9ydCA9PSBzZXJ2aWNlLT5sb2NhbHBvcnQpICYmCisJCQkJCShtc2dpZCAmIFZDSElRX01TR0lEX0NMQUlNRUQpKSB7CisJCQkJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJCQkJIiAgZnNpIC0gaGRyICV4IiwKKwkJCQkJCSh1bnNpZ25lZCBpbnQpaGVhZGVyKTsKKwkJCQkJcmVsZWFzZV9zbG90KHN0YXRlLCBzbG90X2luZm8sIGhlYWRlciwKKwkJCQkJCU5VTEwpOworCQkJCX0KKwkJCQlwb3MgKz0gY2FsY19zdHJpZGUoaGVhZGVyLT5zaXplKTsKKwkJCQlpZiAocG9zID4gVkNISVFfU0xPVF9TSVpFKSB7CisJCQkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkJCSJmc2kgLSBwb3MgJXg6IGhlYWRlciAleCwgIgorCQkJCQkJIm1zZ2lkICV4LCBoZWFkZXItPm1zZ2lkICV4LCAiCisJCQkJCQkiaGVhZGVyLT5zaXplICV4IiwKKwkJCQkJCXBvcywgKHVuc2lnbmVkIGludCloZWFkZXIsCisJCQkJCQltc2dpZCwgaGVhZGVyLT5tc2dpZCwKKwkJCQkJCWhlYWRlci0+c2l6ZSk7CisJCQkJCVdBUk4oMSwgImludmFsaWQgc2xvdCBwb3NpdGlvblxuIik7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50Citkb19hYm9ydF9idWxrcyhWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCisJLyogQWJvcnQgYW55IG91dHN0YW5kaW5nIGJ1bGsgdHJhbnNmZXJzICovCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc2VydmljZS0+YnVsa19tdXRleCkgIT0gMCkKKwkJcmV0dXJuIDA7CisJYWJvcnRfb3V0c3RhbmRpbmdfYnVsa3Moc2VydmljZSwgJnNlcnZpY2UtPmJ1bGtfdHgpOworCWFib3J0X291dHN0YW5kaW5nX2J1bGtzKHNlcnZpY2UsICZzZXJ2aWNlLT5idWxrX3J4KTsKKwltdXRleF91bmxvY2soJnNlcnZpY2UtPmJ1bGtfbXV0ZXgpOworCisJc3RhdHVzID0gbm90aWZ5X2J1bGtzKHNlcnZpY2UsICZzZXJ2aWNlLT5idWxrX3R4LCAwLyohcmV0cnlfcG9sbCovKTsKKwlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpCisJCXN0YXR1cyA9IG5vdGlmeV9idWxrcyhzZXJ2aWNlLCAmc2VydmljZS0+YnVsa19yeCwKKwkJCTAvKiFyZXRyeV9wb2xsKi8pOworCXJldHVybiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpOworfQorCitzdGF0aWMgVkNISVFfU1RBVFVTX1QKK2Nsb3NlX3NlcnZpY2VfY29tcGxldGUoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlLCBpbnQgZmFpbHN0YXRlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKwlpbnQgaXNfc2VydmVyID0gKHNlcnZpY2UtPnB1YmxpY19mb3VyY2MgIT0gVkNISVFfRk9VUkNDX0lOVkFMSUQpOworCWludCBuZXdzdGF0ZTsKKworCXN3aXRjaCAoc2VydmljZS0+c3J2c3RhdGUpIHsKKwljYXNlIFZDSElRX1NSVlNUQVRFX09QRU46CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9DTE9TRVNFTlQ6CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9DTE9TRVJFQ1ZEOgorCQlpZiAoaXNfc2VydmVyKSB7CisJCQlpZiAoc2VydmljZS0+YXV0b19jbG9zZSkgeworCQkJCXNlcnZpY2UtPmNsaWVudF9pZCA9IDA7CisJCQkJc2VydmljZS0+cmVtb3RlcG9ydCA9IFZDSElRX1BPUlRfRlJFRTsKKwkJCQluZXdzdGF0ZSA9IFZDSElRX1NSVlNUQVRFX0xJU1RFTklORzsKKwkJCX0gZWxzZQorCQkJCW5ld3N0YXRlID0gVkNISVFfU1JWU1RBVEVfQ0xPU0VXQUlUOworCQl9IGVsc2UKKwkJCW5ld3N0YXRlID0gVkNISVFfU1JWU1RBVEVfQ0xPU0VEOworCQl2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShzZXJ2aWNlLCBuZXdzdGF0ZSk7CisJCWJyZWFrOworCWNhc2UgVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiY2xvc2Vfc2VydmljZV9jb21wbGV0ZSgleCkgY2FsbGVkIGluIHN0YXRlICVzIiwKKwkJCXNlcnZpY2UtPmhhbmRsZSwgc3J2c3RhdGVfbmFtZXNbc2VydmljZS0+c3J2c3RhdGVdKTsKKwkJV0FSTigxLCAiY2xvc2Vfc2VydmljZV9jb21wbGV0ZSBpbiB1bmV4cGVjdGVkIHN0YXRlXG4iKTsKKwkJcmV0dXJuIFZDSElRX0VSUk9SOworCX0KKworCXN0YXR1cyA9IG1ha2Vfc2VydmljZV9jYWxsYmFjayhzZXJ2aWNlLAorCQlWQ0hJUV9TRVJWSUNFX0NMT1NFRCwgTlVMTCwgTlVMTCk7CisKKwlpZiAoc3RhdHVzICE9IFZDSElRX1JFVFJZKSB7CisJCWludCB1YyA9IHNlcnZpY2UtPnNlcnZpY2VfdXNlX2NvdW50OworCQlpbnQgaTsKKwkJLyogQ29tcGxldGUgdGhlIGNsb3NlIHByb2Nlc3MgKi8KKwkJZm9yIChpID0gMDsgaSA8IHVjOyBpKyspCisJCQkvKiBjYXRlciBmb3IgY2FzZXMgd2hlcmUgY2xvc2UgaXMgZm9yY2VkIGFuZCB0aGUKKwkJCSoqIGNsaWVudCBtYXkgbm90IGNsb3NlIGFsbCBpdCdzIGhhbmRsZXMgKi8KKwkJCXZjaGlxX3JlbGVhc2Vfc2VydmljZV9pbnRlcm5hbChzZXJ2aWNlKTsKKworCQlzZXJ2aWNlLT5jbGllbnRfaWQgPSAwOworCQlzZXJ2aWNlLT5yZW1vdGVwb3J0ID0gVkNISVFfUE9SVF9GUkVFOworCisJCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9DTE9TRUQpCisJCQl2Y2hpcV9mcmVlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSk7CisJCWVsc2UgaWYgKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0NMT1NFV0FJVCkgeworCQkJaWYgKGlzX3NlcnZlcikKKwkJCQlzZXJ2aWNlLT5jbG9zaW5nID0gMDsKKworCQkJdXAoJnNlcnZpY2UtPnJlbW92ZV9ldmVudCk7CisJCX0KKwl9IGVsc2UKKwkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwgZmFpbHN0YXRlKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIENhbGxlZCBieSB0aGUgc2xvdCBoYW5kbGVyICovCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfY2xvc2Vfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBjbG9zZV9yZWN2ZCkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJaW50IGlzX3NlcnZlciA9IChzZXJ2aWNlLT5wdWJsaWNfZm91cmNjICE9IFZDSElRX0ZPVVJDQ19JTlZBTElEKTsKKworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiJWQ6IGNzaTolZCwlZCAoJXMpIiwKKwkJc2VydmljZS0+c3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsIGNsb3NlX3JlY3ZkLAorCQlzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0pOworCisJc3dpdGNoIChzZXJ2aWNlLT5zcnZzdGF0ZSkgeworCWNhc2UgVkNISVFfU1JWU1RBVEVfQ0xPU0VEOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfSElEREVOOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HOgorCWNhc2UgVkNISVFfU1JWU1RBVEVfQ0xPU0VXQUlUOgorCQlpZiAoY2xvc2VfcmVjdmQpCisJCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkJInZjaGlxX2Nsb3NlX3NlcnZpY2VfaW50ZXJuYWwoMSkgY2FsbGVkICIKKwkJCQkiaW4gc3RhdGUgJXMiLAorCQkJCXNydnN0YXRlX25hbWVzW3NlcnZpY2UtPnNydnN0YXRlXSk7CisJCWVsc2UgaWYgKGlzX3NlcnZlcikgeworCQkJaWYgKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0xJU1RFTklORykgeworCQkJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCQkJfSBlbHNlIHsKKwkJCQlzZXJ2aWNlLT5jbGllbnRfaWQgPSAwOworCQkJCXNlcnZpY2UtPnJlbW90ZXBvcnQgPSBWQ0hJUV9QT1JUX0ZSRUU7CisJCQkJaWYgKHNlcnZpY2UtPnNydnN0YXRlID09CisJCQkJCVZDSElRX1NSVlNUQVRFX0NMT1NFV0FJVCkKKwkJCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQkJCVZDSElRX1NSVlNUQVRFX0xJU1RFTklORyk7CisJCQl9CisJCQl1cCgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKwkJfSBlbHNlCisJCQl2Y2hpcV9mcmVlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSk7CisJCWJyZWFrOworCWNhc2UgVkNISVFfU1JWU1RBVEVfT1BFTklORzoKKwkJaWYgKGNsb3NlX3JlY3ZkKSB7CisJCQkvKiBUaGUgb3BlbiB3YXMgcmVqZWN0ZWQgLSB0ZWxsIHRoZSB1c2VyICovCisJCQl2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShzZXJ2aWNlLAorCQkJCVZDSElRX1NSVlNUQVRFX0NMT1NFV0FJVCk7CisJCQl1cCgmc2VydmljZS0+cmVtb3ZlX2V2ZW50KTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNodXRkb3duIG1pZC1vcGVuIC0gbGV0IHRoZSBvdGhlciBzaWRlIGtub3cgKi8KKwkJCXN0YXR1cyA9IHF1ZXVlX21lc3NhZ2Uoc3RhdGUsIHNlcnZpY2UsCisJCQkJVkNISVFfTUFLRV9NU0cKKwkJCQkoVkNISVFfTVNHX0NMT1NFLAorCQkJCXNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQlWQ0hJUV9NU0dfRFNUUE9SVChzZXJ2aWNlLT5yZW1vdGVwb3J0KSksCisJCQkJTlVMTCwgMCwgMCwgMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX1NSVlNUQVRFX09QRU5TWU5DOgorCQltdXRleF9sb2NrKCZzdGF0ZS0+c3luY19tdXRleCk7CisJCS8qIERyb3AgdGhyb3VnaCAqLworCisJY2FzZSBWQ0hJUV9TUlZTVEFURV9PUEVOOgorCQlpZiAoc3RhdGUtPmlzX21hc3RlciB8fCBjbG9zZV9yZWN2ZCkgeworCQkJaWYgKCFkb19hYm9ydF9idWxrcyhzZXJ2aWNlKSkKKwkJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJfQorCisJCXJlbGVhc2Vfc2VydmljZV9tZXNzYWdlcyhzZXJ2aWNlKTsKKworCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpCisJCQlzdGF0dXMgPSBxdWV1ZV9tZXNzYWdlKHN0YXRlLCBzZXJ2aWNlLAorCQkJCVZDSElRX01BS0VfTVNHCisJCQkJKFZDSElRX01TR19DTE9TRSwKKwkJCQlzZXJ2aWNlLT5sb2NhbHBvcnQsCisJCQkJVkNISVFfTVNHX0RTVFBPUlQoc2VydmljZS0+cmVtb3RlcG9ydCkpLAorCQkJCU5VTEwsIDAsIDAsIFFNRkxBR1NfTk9fTVVURVhfVU5MT0NLKTsKKworCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpIHsKKwkJCWlmICghY2xvc2VfcmVjdmQpIHsKKwkJCQkvKiBDaGFuZ2UgdGhlIHN0YXRlIHdoaWxlIHRoZSBtdXRleCBpcworCQkJCSAgIHN0aWxsIGhlbGQgKi8KKwkJCQl2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShzZXJ2aWNlLAorCQkJCQkJCVZDSElRX1NSVlNUQVRFX0NMT1NFU0VOVCk7CisJCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CisJCQkJaWYgKHNlcnZpY2UtPnN5bmMpCisJCQkJCW11dGV4X3VubG9jaygmc3RhdGUtPnN5bmNfbXV0ZXgpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU5TWU5DKSB7CisJCQltdXRleF91bmxvY2soJnN0YXRlLT5zeW5jX211dGV4KTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCWJyZWFrOworCisJCS8qIENoYW5nZSB0aGUgc3RhdGUgd2hpbGUgdGhlIG11dGV4IGlzIHN0aWxsIGhlbGQgKi8KKwkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwgVkNISVFfU1JWU1RBVEVfQ0xPU0VSRUNWRCk7CisJCW11dGV4X3VubG9jaygmc3RhdGUtPnNsb3RfbXV0ZXgpOworCQlpZiAoc2VydmljZS0+c3luYykKKwkJCW11dGV4X3VubG9jaygmc3RhdGUtPnN5bmNfbXV0ZXgpOworCisJCXN0YXR1cyA9IGNsb3NlX3NlcnZpY2VfY29tcGxldGUoc2VydmljZSwKKwkJCQlWQ0hJUV9TUlZTVEFURV9DTE9TRVJFQ1ZEKTsKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX1NSVlNUQVRFX0NMT1NFU0VOVDoKKwkJaWYgKCFjbG9zZV9yZWN2ZCkKKwkJCS8qIFRoaXMgaGFwcGVucyB3aGVuIGEgcHJvY2VzcyBpcyBraWxsZWQgbWlkLWNsb3NlICovCisJCQlicmVhazsKKworCQlpZiAoIXN0YXRlLT5pc19tYXN0ZXIpIHsKKwkJCWlmICghZG9fYWJvcnRfYnVsa3Moc2VydmljZSkpIHsKKwkJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykKKwkJCXN0YXR1cyA9IGNsb3NlX3NlcnZpY2VfY29tcGxldGUoc2VydmljZSwKKwkJCQlWQ0hJUV9TUlZTVEFURV9DTE9TRVJFQ1ZEKTsKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX1NSVlNUQVRFX0NMT1NFUkVDVkQ6CisJCWlmICghY2xvc2VfcmVjdmQgJiYgaXNfc2VydmVyKQorCQkJLyogRm9yY2UgaW50byBMSVNURU5JTkcgbW9kZSAqLworCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQlWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpOworCQlzdGF0dXMgPSBjbG9zZV9zZXJ2aWNlX2NvbXBsZXRlKHNlcnZpY2UsCisJCQlWQ0hJUV9TUlZTVEFURV9DTE9TRVJFQ1ZEKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkidmNoaXFfY2xvc2Vfc2VydmljZV9pbnRlcm5hbCglZCkgY2FsbGVkIGluIHN0YXRlICVzIiwKKwkJCWNsb3NlX3JlY3ZkLCBzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBDYWxsZWQgZnJvbSB0aGUgYXBwbGljYXRpb24gcHJvY2VzcyB1cG9uIHByb2Nlc3MgZGVhdGggKi8KK3ZvaWQKK3ZjaGlxX3Rlcm1pbmF0ZV9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCisJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsICIlZDogdHNpIC0gKCVkPC0+JWQpIiwKKwkJc3RhdGUtPmlkLCBzZXJ2aWNlLT5sb2NhbHBvcnQsIHNlcnZpY2UtPnJlbW90ZXBvcnQpOworCisJbWFya19zZXJ2aWNlX2Nsb3Npbmcoc2VydmljZSk7CisKKwkvKiBNYXJrIHRoZSBzZXJ2aWNlIGZvciByZW1vdmFsIGJ5IHRoZSBzbG90IGhhbmRsZXIgKi8KKwlyZXF1ZXN0X3BvbGwoc3RhdGUsIHNlcnZpY2UsIFZDSElRX1BPTExfUkVNT1ZFKTsKK30KKworLyogQ2FsbGVkIGZyb20gdGhlIHNsb3QgaGFuZGxlciAqLwordm9pZAordmNoaXFfZnJlZV9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSkKK3sKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IHNlcnZpY2UtPnN0YXRlOworCisJdmNoaXFfbG9nX2luZm8odmNoaXFfY29yZV9sb2dfbGV2ZWwsICIlZDogZnNpIC0gKCVkKSIsCisJCXN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0KTsKKworCXN3aXRjaCAoc2VydmljZS0+c3J2c3RhdGUpIHsKKwljYXNlIFZDSElRX1NSVlNUQVRFX09QRU5JTkc6CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9DTE9TRUQ6CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9ISURERU46CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkc6CisJY2FzZSBWQ0hJUV9TUlZTVEFURV9DTE9TRVdBSVQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogZnNpIC0gKCVkKSBpbiBzdGF0ZSAlcyIsCisJCQlzdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCXNydnN0YXRlX25hbWVzW3NlcnZpY2UtPnNydnN0YXRlXSk7CisJCXJldHVybjsKKwl9CisKKwl2Y2hpcV9zZXRfc2VydmljZV9zdGF0ZShzZXJ2aWNlLCBWQ0hJUV9TUlZTVEFURV9GUkVFKTsKKworCXVwKCZzZXJ2aWNlLT5yZW1vdmVfZXZlbnQpOworCisJLyogUmVsZWFzZSB0aGUgaW5pdGlhbCBsb2NrICovCisJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9jb25uZWN0X2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwlpbnQgaTsKKworCS8qIEZpbmQgYWxsIHNlcnZpY2VzIHJlZ2lzdGVyZWQgdG8gdGhpcyBjbGllbnQgYW5kIGVuYWJsZSB0aGVtLiAqLworCWkgPSAwOworCXdoaWxlICgoc2VydmljZSA9IG5leHRfc2VydmljZV9ieV9pbnN0YW5jZShzdGF0ZSwgaW5zdGFuY2UsCisJCSZpKSkgIT0JTlVMTCkgeworCQlpZiAoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfSElEREVOKQorCQkJdmNoaXFfc2V0X3NlcnZpY2Vfc3RhdGUoc2VydmljZSwKKwkJCQlWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpOworCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwl9CisKKwlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgPT0gVkNISVFfQ09OTlNUQVRFX0RJU0NPTk5FQ1RFRCkgeworCQlpZiAocXVldWVfbWVzc2FnZShzdGF0ZSwgTlVMTCwKKwkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19DT05ORUNULCAwLCAwKSwgTlVMTCwgMCwKKwkJCTAsIFFNRkxBR1NfSVNfQkxPQ0tJTkcpID09IFZDSElRX1JFVFJZKQorCQkJcmV0dXJuIFZDSElRX1JFVFJZOworCisJCXZjaGlxX3NldF9jb25uX3N0YXRlKHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVElORyk7CisJfQorCisJaWYgKHN0YXRlLT5jb25uX3N0YXRlID09IFZDSElRX0NPTk5TVEFURV9DT05ORUNUSU5HKSB7CisJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnN0YXRlLT5jb25uZWN0KSAhPSAwKQorCQkJcmV0dXJuIFZDSElRX1JFVFJZOworCisJCXZjaGlxX3NldF9jb25uX3N0YXRlKHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVEVEKTsKKwkJdXAoJnN0YXRlLT5jb25uZWN0KTsKKwl9CisKKwlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3NodXRkb3duX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwlpbnQgaTsKKworCS8qIEZpbmQgYWxsIHNlcnZpY2VzIHJlZ2lzdGVyZWQgdG8gdGhpcyBjbGllbnQgYW5kIGVuYWJsZSB0aGVtLiAqLworCWkgPSAwOworCXdoaWxlICgoc2VydmljZSA9IG5leHRfc2VydmljZV9ieV9pbnN0YW5jZShzdGF0ZSwgaW5zdGFuY2UsCisJCSZpKSkgIT0JTlVMTCkgeworCQkodm9pZCl2Y2hpcV9yZW1vdmVfc2VydmljZShzZXJ2aWNlLT5oYW5kbGUpOworCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwl9CisKKwlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3BhdXNlX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKHN0YXRlLT5jb25uX3N0YXRlKSB7CisJY2FzZSBWQ0hJUV9DT05OU1RBVEVfQ09OTkVDVEVEOgorCQkvKiBSZXF1ZXN0IGEgcGF1c2UgKi8KKwkJdmNoaXFfc2V0X2Nvbm5fc3RhdGUoc3RhdGUsIFZDSElRX0NPTk5TVEFURV9QQVVTSU5HKTsKKwkJcmVxdWVzdF9wb2xsKHN0YXRlLCBOVUxMLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJInZjaGlxX3BhdXNlX2ludGVybmFsIGluIHN0YXRlICVzXG4iLAorCQkJY29ubl9zdGF0ZV9uYW1lc1tzdGF0ZS0+Y29ubl9zdGF0ZV0pOworCQlzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwkJVkNISVFfU1RBVFNfSU5DKHN0YXRlLCBlcnJvcl9jb3VudCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9yZXN1bWVfaW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKworCWlmIChzdGF0ZS0+Y29ubl9zdGF0ZSA9PSBWQ0hJUV9DT05OU1RBVEVfUEFVU0VEKSB7CisJCXZjaGlxX3NldF9jb25uX3N0YXRlKHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfUkVTVU1JTkcpOworCQlyZXF1ZXN0X3BvbGwoc3RhdGUsIE5VTEwsIDApOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCQlWQ0hJUV9TVEFUU19JTkMoc3RhdGUsIGVycm9yX2NvdW50KTsKKwl9CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfY2xvc2Vfc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwkvKiBVbnJlZ2lzdGVyIHRoZSBzZXJ2aWNlICovCisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShoYW5kbGUpOworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKKwlpZiAoIXNlcnZpY2UpCisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKworCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiJWQ6IGNsb3NlX3NlcnZpY2U6JWQiLAorCQlzZXJ2aWNlLT5zdGF0ZS0+aWQsIHNlcnZpY2UtPmxvY2FscG9ydCk7CisKKwlpZiAoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0ZSRUUpIHx8CisJCShzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpIHx8CisJCShzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9ISURERU4pKSB7CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCisJbWFya19zZXJ2aWNlX2Nsb3Npbmcoc2VydmljZSk7CisKKwlpZiAoY3VycmVudCA9PSBzZXJ2aWNlLT5zdGF0ZS0+c2xvdF9oYW5kbGVyX3RocmVhZCkgeworCQlzdGF0dXMgPSB2Y2hpcV9jbG9zZV9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UsCisJCQkwLyohY2xvc2VfcmVjdmQqLyk7CisJCUJVR19PTihzdGF0dXMgPT0gVkNISVFfUkVUUlkpOworCX0gZWxzZSB7CisJLyogTWFyayB0aGUgc2VydmljZSBmb3IgdGVybWluYXRpb24gYnkgdGhlIHNsb3QgaGFuZGxlciAqLworCQlyZXF1ZXN0X3BvbGwoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UsIFZDSElRX1BPTExfVEVSTUlOQVRFKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzZXJ2aWNlLT5yZW1vdmVfZXZlbnQpICE9IDApIHsKKwkJCXN0YXR1cyA9IFZDSElRX1JFVFJZOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0ZSRUUpIHx8CisJCQkoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HKSB8fAorCQkJKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX09QRU4pKQorCQkJYnJlYWs7CisKKwkJdmNoaXFfbG9nX3dhcm5pbmcodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCQkiJWQ6IGNsb3NlX3NlcnZpY2U6JWQgLSB3YWl0aW5nIGluIHN0YXRlICVzIiwKKwkJCXNlcnZpY2UtPnN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LAorCQkJc3J2c3RhdGVfbmFtZXNbc2VydmljZS0+c3J2c3RhdGVdKTsKKwl9CisKKwlpZiAoKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSAmJgorCQkoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkgJiYKKwkJKHNlcnZpY2UtPnNydnN0YXRlICE9IFZDSElRX1NSVlNUQVRFX0xJU1RFTklORykpCisJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCisJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcmVtb3ZlX3NlcnZpY2UoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJLyogVW5yZWdpc3RlciB0aGUgc2VydmljZSAqLworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCisJaWYgKCFzZXJ2aWNlKQorCQlyZXR1cm4gVkNISVFfRVJST1I7CisKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVkOiByZW1vdmVfc2VydmljZTolZCIsCisJCXNlcnZpY2UtPnN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0KTsKKworCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSA9PSBWQ0hJUV9TUlZTVEFURV9GUkVFKSB7CisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCisJbWFya19zZXJ2aWNlX2Nsb3Npbmcoc2VydmljZSk7CisKKwlpZiAoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0hJRERFTikgfHwKKwkJKGN1cnJlbnQgPT0gc2VydmljZS0+c3RhdGUtPnNsb3RfaGFuZGxlcl90aHJlYWQpKSB7CisJCS8qIE1ha2UgaXQgbG9vayBsaWtlIGEgY2xpZW50LCBiZWNhdXNlIGl0IG11c3QgYmUgcmVtb3ZlZCBhbmQKKwkJICAgbm90IGxlZnQgaW4gdGhlIExJU1RFTklORyBzdGF0ZS4gKi8KKwkJc2VydmljZS0+cHVibGljX2ZvdXJjYyA9IFZDSElRX0ZPVVJDQ19JTlZBTElEOworCisJCXN0YXR1cyA9IHZjaGlxX2Nsb3NlX3NlcnZpY2VfaW50ZXJuYWwoc2VydmljZSwKKwkJCTAvKiFjbG9zZV9yZWN2ZCovKTsKKwkJQlVHX09OKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSk7CisJfSBlbHNlIHsKKwkJLyogTWFyayB0aGUgc2VydmljZSBmb3IgcmVtb3ZhbCBieSB0aGUgc2xvdCBoYW5kbGVyICovCisJCXJlcXVlc3RfcG9sbChzZXJ2aWNlLT5zdGF0ZSwgc2VydmljZSwgVkNISVFfUE9MTF9SRU1PVkUpOworCX0KKwl3aGlsZSAoMSkgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzZXJ2aWNlLT5yZW1vdmVfZXZlbnQpICE9IDApIHsKKwkJCXN0YXR1cyA9IFZDSElRX1JFVFJZOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0ZSRUUpIHx8CisJCQkoc2VydmljZS0+c3J2c3RhdGUgPT0gVkNISVFfU1JWU1RBVEVfT1BFTikpCisJCQlicmVhazsKKworCQl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlZDogcmVtb3ZlX3NlcnZpY2U6JWQgLSB3YWl0aW5nIGluIHN0YXRlICVzIiwKKwkJCXNlcnZpY2UtPnN0YXRlLT5pZCwgc2VydmljZS0+bG9jYWxwb3J0LAorCQkJc3J2c3RhdGVfbmFtZXNbc2VydmljZS0+c3J2c3RhdGVdKTsKKwl9CisKKwlpZiAoKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSAmJgorCQkoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkpCisJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCisJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBieSBrZXJuZWwgdGhyZWFkcyBvciB1c2VyIHRocmVhZHMuCisgKiBVc2VyIHRocmVhZHMgbWF5IHJlY2VpdmUgVkNISVFfUkVUUlkgdG8gaW5kaWNhdGUgdGhhdCBhIHNpZ25hbCBoYXMgYmVlbgorICogcmVjZWl2ZWQgYW5kIHRoZSBjYWxsIHNob3VsZCBiZSByZXRyaWVkIGFmdGVyIGJlaW5nIHJldHVybmVkIHRvIHVzZXIKKyAqIGNvbnRleHQuCisgKiBXaGVuIGNhbGxlZCBpbiBibG9ja2luZyBtb2RlLCB0aGUgdXNlcmRhdGEgZmllbGQgcG9pbnRzIHRvIGEgYnVsa193YWl0ZXIKKyAqIHN0cnVjdHVyZS4KKyAqLworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2J1bGtfdHJhbnNmZXIoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJVkNISV9NRU1fSEFORExFX1QgbWVtaGFuZGxlLCB2b2lkICpvZmZzZXQsIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSwKKwlWQ0hJUV9CVUxLX01PREVfVCBtb2RlLCBWQ0hJUV9CVUxLX0RJUl9UIGRpcikKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfaGFuZGxlKGhhbmRsZSk7CisJVkNISVFfQlVMS19RVUVVRV9UICpxdWV1ZTsKKwlWQ0hJUV9CVUxLX1QgKmJ1bGs7CisJVkNISVFfU1RBVEVfVCAqc3RhdGU7CisJc3RydWN0IGJ1bGtfd2FpdGVyICpidWxrX3dhaXRlciA9IE5VTEw7CisJY29uc3QgY2hhciBkaXJfY2hhciA9IChkaXIgPT0gVkNISVFfQlVMS19UUkFOU01JVCkgPyAndCcgOiAncic7CisJY29uc3QgaW50IGRpcl9tc2d0eXBlID0gKGRpciA9PSBWQ0hJUV9CVUxLX1RSQU5TTUlUKSA/CisJCVZDSElRX01TR19CVUxLX1RYIDogVkNISVFfTVNHX0JVTEtfUlg7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfRVJST1I7CisKKwlpZiAoIXNlcnZpY2UgfHwKKwkJIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9PUEVOKSB8fAorCQkgKChtZW1oYW5kbGUgPT0gVkNISV9NRU1fSEFORExFX0lOVkFMSUQpICYmIChvZmZzZXQgPT0gTlVMTCkpIHx8CisJCSAodmNoaXFfY2hlY2tfc2VydmljZShzZXJ2aWNlKSAhPSBWQ0hJUV9TVUNDRVNTKSkKKwkJZ290byBlcnJvcl9leGl0OworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfTk9DQUxMQkFDSzoKKwljYXNlIFZDSElRX0JVTEtfTU9ERV9DQUxMQkFDSzoKKwkJYnJlYWs7CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfQkxPQ0tJTkc6CisJCWJ1bGtfd2FpdGVyID0gKHN0cnVjdCBidWxrX3dhaXRlciAqKXVzZXJkYXRhOworCQlzZW1hX2luaXQoJmJ1bGtfd2FpdGVyLT5ldmVudCwgMCk7CisJCWJ1bGtfd2FpdGVyLT5hY3R1YWwgPSAwOworCQlidWxrX3dhaXRlci0+YnVsayA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgVkNISVFfQlVMS19NT0RFX1dBSVRJTkc6CisJCWJ1bGtfd2FpdGVyID0gKHN0cnVjdCBidWxrX3dhaXRlciAqKXVzZXJkYXRhOworCQlidWxrID0gYnVsa193YWl0ZXItPmJ1bGs7CisJCWdvdG8gd2FpdGluZzsKKwlkZWZhdWx0OgorCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJc3RhdGUgPSBzZXJ2aWNlLT5zdGF0ZTsKKworCXF1ZXVlID0gKGRpciA9PSBWQ0hJUV9CVUxLX1RSQU5TTUlUKSA/CisJCSZzZXJ2aWNlLT5idWxrX3R4IDogJnNlcnZpY2UtPmJ1bGtfcng7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzZXJ2aWNlLT5idWxrX211dGV4KSAhPSAwKSB7CisJCXN0YXR1cyA9IFZDSElRX1JFVFJZOworCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJaWYgKHF1ZXVlLT5sb2NhbF9pbnNlcnQgPT0gcXVldWUtPnJlbW92ZSArIFZDSElRX05VTV9TRVJWSUNFX0JVTEtTKSB7CisJCVZDSElRX1NFUlZJQ0VfU1RBVFNfSU5DKHNlcnZpY2UsIGJ1bGtfc3RhbGxzKTsKKwkJZG8geworCQkJbXV0ZXhfdW5sb2NrKCZzZXJ2aWNlLT5idWxrX211dGV4KTsKKwkJCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNlcnZpY2UtPmJ1bGtfcmVtb3ZlX2V2ZW50KQorCQkJCSE9IDApIHsKKwkJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJCQlnb3RvIGVycm9yX2V4aXQ7CisJCQl9CisJCQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzZXJ2aWNlLT5idWxrX211dGV4KQorCQkJCSE9IDApIHsKKwkJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJCQlnb3RvIGVycm9yX2V4aXQ7CisJCQl9CisJCX0gd2hpbGUgKHF1ZXVlLT5sb2NhbF9pbnNlcnQgPT0gcXVldWUtPnJlbW92ZSArCisJCQkJVkNISVFfTlVNX1NFUlZJQ0VfQlVMS1MpOworCX0KKworCWJ1bGsgPSAmcXVldWUtPmJ1bGtzW0JVTEtfSU5ERVgocXVldWUtPmxvY2FsX2luc2VydCldOworCisJYnVsay0+bW9kZSA9IG1vZGU7CisJYnVsay0+ZGlyID0gZGlyOworCWJ1bGstPnVzZXJkYXRhID0gdXNlcmRhdGE7CisJYnVsay0+c2l6ZSA9IHNpemU7CisJYnVsay0+YWN0dWFsID0gVkNISVFfQlVMS19BQ1RVQUxfQUJPUlRFRDsKKworCWlmICh2Y2hpcV9wcmVwYXJlX2J1bGtfZGF0YShidWxrLCBtZW1oYW5kbGUsIG9mZnNldCwgc2l6ZSwgZGlyKSAhPQorCQlWQ0hJUV9TVUNDRVNTKQorCQlnb3RvIHVubG9ja19lcnJvcl9leGl0OworCisJd21iKCk7CisKKwl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVkOiBidCAoJWQtPiVkKSAlY3ggJXhAJXggJXgiLAorCQlzdGF0ZS0+aWQsCisJCXNlcnZpY2UtPmxvY2FscG9ydCwgc2VydmljZS0+cmVtb3RlcG9ydCwgZGlyX2NoYXIsCisJCXNpemUsICh1bnNpZ25lZCBpbnQpYnVsay0+ZGF0YSwgKHVuc2lnbmVkIGludCl1c2VyZGF0YSk7CisKKwkvKiBUaGUgc2xvdCBtdXRleCBtdXN0IGJlIGhlbGQgd2hlbiB0aGUgc2VydmljZSBpcyBiZWluZyBjbG9zZWQsIHNvCisJICAgY2xhaW0gaXQgaGVyZSB0byBlbnN1cmUgdGhhdCBpc24ndCBoYXBwZW5pbmcgKi8KKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+c2xvdF9tdXRleCkgIT0gMCkgeworCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJZ290byBjYW5jZWxfYnVsa19lcnJvcl9leGl0OworCX0KKworCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9PUEVOKQorCQlnb3RvIHVubG9ja19ib3RoX2Vycm9yX2V4aXQ7CisKKwlpZiAoc3RhdGUtPmlzX21hc3RlcikgeworCQlxdWV1ZS0+bG9jYWxfaW5zZXJ0Kys7CisJCWlmIChyZXNvbHZlX2J1bGtzKHNlcnZpY2UsIHF1ZXVlKSkKKwkJCXJlcXVlc3RfcG9sbChzdGF0ZSwgc2VydmljZSwKKwkJCQkoZGlyID09IFZDSElRX0JVTEtfVFJBTlNNSVQpID8KKwkJCQlWQ0hJUV9QT0xMX1RYTk9USUZZIDogVkNISVFfUE9MTF9SWE5PVElGWSk7CisJfSBlbHNlIHsKKwkJaW50IHBheWxvYWRbMl0gPSB7IChpbnQpYnVsay0+ZGF0YSwgYnVsay0+c2l6ZSB9OworCQlWQ0hJUV9FTEVNRU5UX1QgZWxlbWVudCA9IHsgcGF5bG9hZCwgc2l6ZW9mKHBheWxvYWQpIH07CisKKwkJc3RhdHVzID0gcXVldWVfbWVzc2FnZShzdGF0ZSwgTlVMTCwKKwkJCVZDSElRX01BS0VfTVNHKGRpcl9tc2d0eXBlLAorCQkJCXNlcnZpY2UtPmxvY2FscG9ydCwgc2VydmljZS0+cmVtb3RlcG9ydCksCisJCQkmZWxlbWVudCwgMSwgc2l6ZW9mKHBheWxvYWQpLAorCQkJUU1GTEFHU19JU19CTE9DS0lORyB8CisJCQlRTUZMQUdTX05PX01VVEVYX0xPQ0sgfAorCQkJUU1GTEFHU19OT19NVVRFWF9VTkxPQ0spOworCQlpZiAoc3RhdHVzICE9IFZDSElRX1NVQ0NFU1MpIHsKKwkJCWdvdG8gdW5sb2NrX2JvdGhfZXJyb3JfZXhpdDsKKwkJfQorCQlxdWV1ZS0+bG9jYWxfaW5zZXJ0Kys7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2xvdF9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZzZXJ2aWNlLT5idWxrX211dGV4KTsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVkOiBidDolZCAlY3ggbGk9JXggcmk9JXggcD0leCIsCisJCXN0YXRlLT5pZCwKKwkJc2VydmljZS0+bG9jYWxwb3J0LCBkaXJfY2hhciwKKwkJcXVldWUtPmxvY2FsX2luc2VydCwgcXVldWUtPnJlbW90ZV9pbnNlcnQsIHF1ZXVlLT5wcm9jZXNzKTsKKword2FpdGluZzoKKwl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKworCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKKwlpZiAoYnVsa193YWl0ZXIpIHsKKwkJYnVsa193YWl0ZXItPmJ1bGsgPSBidWxrOworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZidWxrX3dhaXRlci0+ZXZlbnQpICE9IDApCisJCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJZWxzZSBpZiAoYnVsa193YWl0ZXItPmFjdHVhbCA9PSBWQ0hJUV9CVUxLX0FDVFVBTF9BQk9SVEVEKQorCQkJc3RhdHVzID0gVkNISVFfRVJST1I7CisJfQorCisJcmV0dXJuIHN0YXR1czsKKwordW5sb2NrX2JvdGhfZXJyb3JfZXhpdDoKKwltdXRleF91bmxvY2soJnN0YXRlLT5zbG90X211dGV4KTsKK2NhbmNlbF9idWxrX2Vycm9yX2V4aXQ6CisJdmNoaXFfY29tcGxldGVfYnVsayhidWxrKTsKK3VubG9ja19lcnJvcl9leGl0OgorCW11dGV4X3VubG9jaygmc2VydmljZS0+YnVsa19tdXRleCk7CisKK2Vycm9yX2V4aXQ6CisJaWYgKHNlcnZpY2UpCisJCXVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworCXJldHVybiBzdGF0dXM7Cit9CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9xdWV1ZV9tZXNzYWdlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCWNvbnN0IFZDSElRX0VMRU1FTlRfVCAqZWxlbWVudHMsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBmaW5kX3NlcnZpY2VfYnlfaGFuZGxlKGhhbmRsZSk7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gVkNISVFfRVJST1I7CisKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIXNlcnZpY2UgfHwKKwkJKHZjaGlxX2NoZWNrX3NlcnZpY2Uoc2VydmljZSkgIT0gVkNISVFfU1VDQ0VTUykpCisJCWdvdG8gZXJyb3JfZXhpdDsKKworCWZvciAoaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KWNvdW50OyBpKyspIHsKKwkJaWYgKGVsZW1lbnRzW2ldLnNpemUpIHsKKwkJCWlmIChlbGVtZW50c1tpXS5kYXRhID09IE5VTEwpIHsKKwkJCQlWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLCBlcnJvcl9jb3VudCk7CisJCQkJZ290byBlcnJvcl9leGl0OworCQkJfQorCQkJc2l6ZSArPSBlbGVtZW50c1tpXS5zaXplOworCQl9CisJfQorCisJaWYgKHNpemUgPiBWQ0hJUV9NQVhfTVNHX1NJWkUpIHsKKwkJVkNISVFfU0VSVklDRV9TVEFUU19JTkMoc2VydmljZSwgZXJyb3JfY291bnQpOworCQlnb3RvIGVycm9yX2V4aXQ7CisJfQorCisJc3dpdGNoIChzZXJ2aWNlLT5zcnZzdGF0ZSkgeworCWNhc2UgVkNISVFfU1JWU1RBVEVfT1BFTjoKKwkJc3RhdHVzID0gcXVldWVfbWVzc2FnZShzZXJ2aWNlLT5zdGF0ZSwgc2VydmljZSwKKwkJCQlWQ0hJUV9NQUtFX01TRyhWQ0hJUV9NU0dfREFUQSwKKwkJCQkJc2VydmljZS0+bG9jYWxwb3J0LAorCQkJCQlzZXJ2aWNlLT5yZW1vdGVwb3J0KSwKKwkJCQllbGVtZW50cywgY291bnQsIHNpemUsIDEpOworCQlicmVhazsKKwljYXNlIFZDSElRX1NSVlNUQVRFX09QRU5TWU5DOgorCQlzdGF0dXMgPSBxdWV1ZV9tZXNzYWdlX3N5bmMoc2VydmljZS0+c3RhdGUsIHNlcnZpY2UsCisJCQkJVkNISVFfTUFLRV9NU0coVkNISVFfTVNHX0RBVEEsCisJCQkJCXNlcnZpY2UtPmxvY2FscG9ydCwKKwkJCQkJc2VydmljZS0+cmVtb3RlcG9ydCksCisJCQkJZWxlbWVudHMsIGNvdW50LCBzaXplLCAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gVkNISVFfRVJST1I7CisJCWJyZWFrOworCX0KKworZXJyb3JfZXhpdDoKKwlpZiAoc2VydmljZSkKKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkCit2Y2hpcV9yZWxlYXNlX21lc3NhZ2UoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIFZDSElRX0hFQURFUl9UICpoZWFkZXIpCit7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShoYW5kbGUpOworCVZDSElRX1NIQVJFRF9TVEFURV9UICpyZW1vdGU7CisJVkNISVFfU1RBVEVfVCAqc3RhdGU7CisJaW50IHNsb3RfaW5kZXg7CisKKwlpZiAoIXNlcnZpY2UpCisJCXJldHVybjsKKworCXN0YXRlID0gc2VydmljZS0+c3RhdGU7CisJcmVtb3RlID0gc3RhdGUtPnJlbW90ZTsKKworCXNsb3RfaW5kZXggPSBTTE9UX0lOREVYX0ZST01fREFUQShzdGF0ZSwgKHZvaWQgKiloZWFkZXIpOworCisJaWYgKChzbG90X2luZGV4ID49IHJlbW90ZS0+c2xvdF9maXJzdCkgJiYKKwkJKHNsb3RfaW5kZXggPD0gcmVtb3RlLT5zbG90X2xhc3QpKSB7CisJCWludCBtc2dpZCA9IGhlYWRlci0+bXNnaWQ7CisJCWlmIChtc2dpZCAmIFZDSElRX01TR0lEX0NMQUlNRUQpIHsKKwkJCVZDSElRX1NMT1RfSU5GT19UICpzbG90X2luZm8gPQorCQkJCVNMT1RfSU5GT19GUk9NX0lOREVYKHN0YXRlLCBzbG90X2luZGV4KTsKKworCQkJcmVsZWFzZV9zbG90KHN0YXRlLCBzbG90X2luZm8sIGhlYWRlciwgc2VydmljZSk7CisJCX0KKwl9IGVsc2UgaWYgKHNsb3RfaW5kZXggPT0gcmVtb3RlLT5zbG90X3N5bmMpCisJCXJlbGVhc2VfbWVzc2FnZV9zeW5jKHN0YXRlLCBoZWFkZXIpOworCisJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7Cit9CisKK3N0YXRpYyB2b2lkCityZWxlYXNlX21lc3NhZ2Vfc3luYyhWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfSEVBREVSX1QgKmhlYWRlcikKK3sKKwloZWFkZXItPm1zZ2lkID0gVkNISVFfTVNHSURfUEFERElORzsKKwl3bWIoKTsKKwlyZW1vdGVfZXZlbnRfc2lnbmFsKCZzdGF0ZS0+cmVtb3RlLT5zeW5jX3JlbGVhc2UpOworfQorCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfZ2V0X3BlZXJfdmVyc2lvbihWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgc2hvcnQgKnBlZXJfdmVyc2lvbikKK3sKKyAgIFZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX0VSUk9SOworICAgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShoYW5kbGUpOworCisgICBpZiAoIXNlcnZpY2UgfHwKKyAgICAgICh2Y2hpcV9jaGVja19zZXJ2aWNlKHNlcnZpY2UpICE9IFZDSElRX1NVQ0NFU1MpIHx8CisgICAgICAhcGVlcl92ZXJzaW9uKQorICAgICAgZ290byBleGl0OworICAgKnBlZXJfdmVyc2lvbiA9IHNlcnZpY2UtPnBlZXJfdmVyc2lvbjsKKyAgIHN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisKK2V4aXQ6CisgICBpZiAoc2VydmljZSkKKyAgICAgIHVubG9ja19zZXJ2aWNlKHNlcnZpY2UpOworICAgcmV0dXJuIHN0YXR1czsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2dldF9jb25maWcoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlpbnQgY29uZmlnX3NpemUsIFZDSElRX0NPTkZJR19UICpwY29uZmlnKQoreworCVZDSElRX0NPTkZJR19UIGNvbmZpZzsKKworCSh2b2lkKWluc3RhbmNlOworCisJY29uZmlnLm1heF9tc2dfc2l6ZSAgICAgICAgICAgPSBWQ0hJUV9NQVhfTVNHX1NJWkU7CisJY29uZmlnLmJ1bGtfdGhyZXNob2xkICAgICAgICAgPSBWQ0hJUV9NQVhfTVNHX1NJWkU7CisJY29uZmlnLm1heF9vdXRzdGFuZGluZ19idWxrcyAgPSBWQ0hJUV9OVU1fU0VSVklDRV9CVUxLUzsKKwljb25maWcubWF4X3NlcnZpY2VzICAgICAgICAgICA9IFZDSElRX01BWF9TRVJWSUNFUzsKKwljb25maWcudmVyc2lvbiAgICAgICAgICAgICAgICA9IFZDSElRX1ZFUlNJT047CisJY29uZmlnLnZlcnNpb25fbWluICAgICAgICAgICAgPSBWQ0hJUV9WRVJTSU9OX01JTjsKKworCWlmIChjb25maWdfc2l6ZSA+IHNpemVvZihWQ0hJUV9DT05GSUdfVCkpCisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKworCW1lbWNweShwY29uZmlnLCAmY29uZmlnLAorCQltaW4oY29uZmlnX3NpemUsIChpbnQpKHNpemVvZihWQ0hJUV9DT05GSUdfVCkpKSk7CisKKwlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKK30KKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3NldF9zZXJ2aWNlX29wdGlvbihWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwlWQ0hJUV9TRVJWSUNFX09QVElPTl9UIG9wdGlvbiwgaW50IHZhbHVlKQoreworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKworCWlmIChzZXJ2aWNlKSB7CisJCXN3aXRjaCAob3B0aW9uKSB7CisJCWNhc2UgVkNISVFfU0VSVklDRV9PUFRJT05fQVVUT0NMT1NFOgorCQkJc2VydmljZS0+YXV0b19jbG9zZSA9IHZhbHVlOworCQkJc3RhdHVzID0gVkNISVFfU1VDQ0VTUzsKKwkJCWJyZWFrOworCisJCWNhc2UgVkNISVFfU0VSVklDRV9PUFRJT05fU0xPVF9RVU9UQTogeworCQkJVkNISVFfU0VSVklDRV9RVU9UQV9UICpzZXJ2aWNlX3F1b3RhID0KKwkJCQkmc2VydmljZS0+c3RhdGUtPnNlcnZpY2VfcXVvdGFzWworCQkJCQlzZXJ2aWNlLT5sb2NhbHBvcnRdOworCQkJaWYgKHZhbHVlID09IDApCisJCQkJdmFsdWUgPSBzZXJ2aWNlLT5zdGF0ZS0+ZGVmYXVsdF9zbG90X3F1b3RhOworCQkJaWYgKCh2YWx1ZSA+PSBzZXJ2aWNlX3F1b3RhLT5zbG90X3VzZV9jb3VudCkgJiYKKwkJCQkgKHZhbHVlIDwgKHVuc2lnbmVkIHNob3J0KX4wKSkgeworCQkJCXNlcnZpY2VfcXVvdGEtPnNsb3RfcXVvdGEgPSB2YWx1ZTsKKwkJCQlpZiAoKHZhbHVlID49IHNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50KSAmJgorCQkJCQkoc2VydmljZV9xdW90YS0+bWVzc2FnZV9xdW90YSA+PQorCQkJCQkgc2VydmljZV9xdW90YS0+bWVzc2FnZV91c2VfY291bnQpKSB7CisJCQkJCS8qIFNpZ25hbCB0aGUgc2VydmljZSB0aGF0IGl0IG1heSBoYXZlCisJCQkJCSoqIGRyb3BwZWQgYmVsb3cgaXRzIHF1b3RhICovCisJCQkJCXVwKCZzZXJ2aWNlX3F1b3RhLT5xdW90YV9ldmVudCk7CisJCQkJfQorCQkJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJCQl9CisJCX0gYnJlYWs7CisKKwkJY2FzZSBWQ0hJUV9TRVJWSUNFX09QVElPTl9NRVNTQUdFX1FVT1RBOiB7CisJCQlWQ0hJUV9TRVJWSUNFX1FVT1RBX1QgKnNlcnZpY2VfcXVvdGEgPQorCQkJCSZzZXJ2aWNlLT5zdGF0ZS0+c2VydmljZV9xdW90YXNbCisJCQkJCXNlcnZpY2UtPmxvY2FscG9ydF07CisJCQlpZiAodmFsdWUgPT0gMCkKKwkJCQl2YWx1ZSA9IHNlcnZpY2UtPnN0YXRlLT5kZWZhdWx0X21lc3NhZ2VfcXVvdGE7CisJCQlpZiAoKHZhbHVlID49IHNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50KSAmJgorCQkJCSAodmFsdWUgPCAodW5zaWduZWQgc2hvcnQpfjApKSB7CisJCQkJc2VydmljZV9xdW90YS0+bWVzc2FnZV9xdW90YSA9IHZhbHVlOworCQkJCWlmICgodmFsdWUgPj0KKwkJCQkJc2VydmljZV9xdW90YS0+bWVzc2FnZV91c2VfY291bnQpICYmCisJCQkJCShzZXJ2aWNlX3F1b3RhLT5zbG90X3F1b3RhID49CisJCQkJCXNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50KSkKKwkJCQkJLyogU2lnbmFsIHRoZSBzZXJ2aWNlIHRoYXQgaXQgbWF5IGhhdmUKKwkJCQkJKiogZHJvcHBlZCBiZWxvdyBpdHMgcXVvdGEgKi8KKwkJCQkJdXAoJnNlcnZpY2VfcXVvdGEtPnF1b3RhX2V2ZW50KTsKKwkJCQlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCQkJfQorCQl9IGJyZWFrOworCisJCWNhc2UgVkNISVFfU0VSVklDRV9PUFRJT05fU1lOQ0hST05PVVM6CisJCQlpZiAoKHNlcnZpY2UtPnNydnN0YXRlID09IFZDSElRX1NSVlNUQVRFX0hJRERFTikgfHwKKwkJCQkoc2VydmljZS0+c3J2c3RhdGUgPT0KKwkJCQlWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcpKSB7CisJCQkJc2VydmljZS0+c3luYyA9IHZhbHVlOworCQkJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFZDSElRX1NFUlZJQ0VfT1BUSU9OX1RSQUNFOgorCQkJc2VydmljZS0+dHJhY2UgPSB2YWx1ZTsKKwkJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJdW5sb2NrX3NlcnZpY2Uoc2VydmljZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKwordm9pZAordmNoaXFfZHVtcF9zaGFyZWRfc3RhdGUodm9pZCAqZHVtcF9jb250ZXh0LCBWQ0hJUV9TVEFURV9UICpzdGF0ZSwKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqc2hhcmVkLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZGVidWdfbmFtZXNbXSA9IHsKKwkJIjxlbnRyaWVzPiIsCisJCSJTTE9UX0hBTkRMRVJfQ09VTlQiLAorCQkiU0xPVF9IQU5ETEVSX0xJTkUiLAorCQkiUEFSU0VfTElORSIsCisJCSJQQVJTRV9IRUFERVIiLAorCQkiUEFSU0VfTVNHSUQiLAorCQkiQVdBSVRfQ09NUExFVElPTl9MSU5FIiwKKwkJIkRFUVVFVUVfTUVTU0FHRV9MSU5FIiwKKwkJIlNFUlZJQ0VfQ0FMTEJBQ0tfTElORSIsCisJCSJNU0dfUVVFVUVfRlVMTF9DT1VOVCIsCisJCSJDT01QTEVUSU9OX1FVRVVFX0ZVTExfQ09VTlQiCisJfTsKKwlpbnQgaTsKKworCWNoYXIgYnVmWzgwXTsKKwlpbnQgbGVuOworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCSIgICVzOiBzbG90cyAlZC0lZCB0eF9wb3M9JXggcmVjeWNsZT0leCIsCisJCWxhYmVsLCBzaGFyZWQtPnNsb3RfZmlyc3QsIHNoYXJlZC0+c2xvdF9sYXN0LAorCQlzaGFyZWQtPnR4X3Bvcywgc2hhcmVkLT5zbG90X3F1ZXVlX3JlY3ljbGUpOworCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJIiAgICBTbG90cyBjbGFpbWVkOiIpOworCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJZm9yIChpID0gc2hhcmVkLT5zbG90X2ZpcnN0OyBpIDw9IHNoYXJlZC0+c2xvdF9sYXN0OyBpKyspIHsKKwkJVkNISVFfU0xPVF9JTkZPX1Qgc2xvdF9pbmZvID0gKlNMT1RfSU5GT19GUk9NX0lOREVYKHN0YXRlLCBpKTsKKwkJaWYgKHNsb3RfaW5mby51c2VfY291bnQgIT0gc2xvdF9pbmZvLnJlbGVhc2VfY291bnQpIHsKKwkJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJIiAgICAgICVkOiAlZC8lZCIsIGksIHNsb3RfaW5mby51c2VfY291bnQsCisJCQkJc2xvdF9pbmZvLnJlbGVhc2VfY291bnQpOworCQkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAxOyBpIDwgc2hhcmVkLT5kZWJ1Z1tERUJVR19FTlRSSUVTXTsgaSsrKSB7CisJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICAgREVCVUc6ICVzID0gJWQoJXgpIiwKKwkJCWRlYnVnX25hbWVzW2ldLCBzaGFyZWQtPmRlYnVnW2ldLCBzaGFyZWQtPmRlYnVnW2ldKTsKKwkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisJfQorfQorCit2b2lkCit2Y2hpcV9kdW1wX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCwgVkNISVFfU1RBVEVfVCAqc3RhdGUpCit7CisJY2hhciBidWZbODBdOworCWludCBsZW47CisJaW50IGk7CisKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiU3RhdGUgJWQ6ICVzIiwgc3RhdGUtPmlkLAorCQljb25uX3N0YXRlX25hbWVzW3N0YXRlLT5jb25uX3N0YXRlXSk7CisJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkiICB0eF9wb3M9JXgoQCV4KSwgcnhfcG9zPSV4KEAleCkiLAorCQlzdGF0ZS0+bG9jYWwtPnR4X3BvcywKKwkJKHVpbnQzMl90KXN0YXRlLT50eF9kYXRhICsKKwkJCShzdGF0ZS0+bG9jYWxfdHhfcG9zICYgVkNISVFfU0xPVF9NQVNLKSwKKwkJc3RhdGUtPnJ4X3BvcywKKwkJKHVpbnQzMl90KXN0YXRlLT5yeF9kYXRhICsKKwkJCShzdGF0ZS0+cnhfcG9zICYgVkNISVFfU0xPVF9NQVNLKSk7CisJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCQkiICBWZXJzaW9uOiAlZCAobWluICVkKSIsCisJCVZDSElRX1ZFUlNJT04sIFZDSElRX1ZFUlNJT05fTUlOKTsKKwl2Y2hpcV9kdW1wKGR1bXBfY29udGV4dCwgYnVmLCBsZW4gKyAxKTsKKworCWlmIChWQ0hJUV9FTkFCTEVfU1RBVFMpIHsKKwkJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJCSIgIFN0YXRzOiBjdHJsX3R4X2NvdW50PSVkLCBjdHJsX3J4X2NvdW50PSVkLCAiCisJCQkiZXJyb3JfY291bnQ9JWQiLAorCQkJc3RhdGUtPnN0YXRzLmN0cmxfdHhfY291bnQsIHN0YXRlLT5zdGF0cy5jdHJsX3J4X2NvdW50LAorCQkJc3RhdGUtPnN0YXRzLmVycm9yX2NvdW50KTsKKwkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisJfQorCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJIiAgU2xvdHM6ICVkIGF2YWlsYWJsZSAoJWQgZGF0YSksICVkIHJlY3ljbGFibGUsICVkIHN0YWxscyAiCisJCSIoJWQgZGF0YSkiLAorCQkoKHN0YXRlLT5zbG90X3F1ZXVlX2F2YWlsYWJsZSAqIFZDSElRX1NMT1RfU0laRSkgLQorCQkJc3RhdGUtPmxvY2FsX3R4X3BvcykgLyBWQ0hJUV9TTE9UX1NJWkUsCisJCXN0YXRlLT5kYXRhX3F1b3RhIC0gc3RhdGUtPmRhdGFfdXNlX2NvdW50LAorCQlzdGF0ZS0+bG9jYWwtPnNsb3RfcXVldWVfcmVjeWNsZSAtIHN0YXRlLT5zbG90X3F1ZXVlX2F2YWlsYWJsZSwKKwkJc3RhdGUtPnN0YXRzLnNsb3Rfc3RhbGxzLCBzdGF0ZS0+c3RhdHMuZGF0YV9zdGFsbHMpOworCXZjaGlxX2R1bXAoZHVtcF9jb250ZXh0LCBidWYsIGxlbiArIDEpOworCisJdmNoaXFfZHVtcF9wbGF0Zm9ybV9zdGF0ZShkdW1wX2NvbnRleHQpOworCisJdmNoaXFfZHVtcF9zaGFyZWRfc3RhdGUoZHVtcF9jb250ZXh0LCBzdGF0ZSwgc3RhdGUtPmxvY2FsLCAiTG9jYWwiKTsKKwl2Y2hpcV9kdW1wX3NoYXJlZF9zdGF0ZShkdW1wX2NvbnRleHQsIHN0YXRlLCBzdGF0ZS0+cmVtb3RlLCAiUmVtb3RlIik7CisKKwl2Y2hpcV9kdW1wX3BsYXRmb3JtX2luc3RhbmNlcyhkdW1wX2NvbnRleHQpOworCisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT51bnVzZWRfc2VydmljZTsgaSsrKSB7CisJCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9wb3J0KHN0YXRlLCBpKTsKKworCQlpZiAoc2VydmljZSkgeworCQkJdmNoaXFfZHVtcF9zZXJ2aWNlX3N0YXRlKGR1bXBfY29udGV4dCwgc2VydmljZSk7CisJCQl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKwkJfQorCX0KK30KKwordm9pZAordmNoaXFfZHVtcF9zZXJ2aWNlX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKQoreworCWNoYXIgYnVmWzgwXTsKKwlpbnQgbGVuOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIlNlcnZpY2UgJWQ6ICVzIChyZWYgJXUpIiwKKwkJc2VydmljZS0+bG9jYWxwb3J0LCBzcnZzdGF0ZV9uYW1lc1tzZXJ2aWNlLT5zcnZzdGF0ZV0sCisJCXNlcnZpY2UtPnJlZl9jb3VudCAtIDEpOyAvKkRvbid0IGluY2x1ZGUgdGhlIGxvY2sganVzdCB0YWtlbiovCisKKwlpZiAoc2VydmljZS0+c3J2c3RhdGUgIT0gVkNISVFfU1JWU1RBVEVfRlJFRSkgeworCQljaGFyIHJlbW90ZXBvcnRbMzBdOworCQlWQ0hJUV9TRVJWSUNFX1FVT1RBX1QgKnNlcnZpY2VfcXVvdGEgPQorCQkJJnNlcnZpY2UtPnN0YXRlLT5zZXJ2aWNlX3F1b3Rhc1tzZXJ2aWNlLT5sb2NhbHBvcnRdOworCQlpbnQgZm91cmNjID0gc2VydmljZS0+YmFzZS5mb3VyY2M7CisJCWludCB0eF9wZW5kaW5nLCByeF9wZW5kaW5nOworCQlpZiAoc2VydmljZS0+cmVtb3RlcG9ydCAhPSBWQ0hJUV9QT1JUX0ZSRUUpIHsKKwkJCWludCBsZW4yID0gc25wcmludGYocmVtb3RlcG9ydCwgc2l6ZW9mKHJlbW90ZXBvcnQpLAorCQkJCSIlZCIsIHNlcnZpY2UtPnJlbW90ZXBvcnQpOworCQkJaWYgKHNlcnZpY2UtPnB1YmxpY19mb3VyY2MgIT0gVkNISVFfRk9VUkNDX0lOVkFMSUQpCisJCQkJc25wcmludGYocmVtb3RlcG9ydCArIGxlbjIsCisJCQkJCXNpemVvZihyZW1vdGVwb3J0KSAtIGxlbjIsCisJCQkJCSIgKGNsaWVudCAleCkiLCBzZXJ2aWNlLT5jbGllbnRfaWQpOworCQl9IGVsc2UKKwkJCXN0cmNweShyZW1vdGVwb3J0LCAibi9hIik7CisKKwkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4sCisJCQkiICclYyVjJWMlYycgcmVtb3RlICVzIChtc2cgdXNlICVkLyVkLCBzbG90IHVzZSAlZC8lZCkiLAorCQkJVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhmb3VyY2MpLAorCQkJcmVtb3RlcG9ydCwKKwkJCXNlcnZpY2VfcXVvdGEtPm1lc3NhZ2VfdXNlX2NvdW50LAorCQkJc2VydmljZV9xdW90YS0+bWVzc2FnZV9xdW90YSwKKwkJCXNlcnZpY2VfcXVvdGEtPnNsb3RfdXNlX2NvdW50LAorCQkJc2VydmljZV9xdW90YS0+c2xvdF9xdW90YSk7CisKKwkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwkJdHhfcGVuZGluZyA9IHNlcnZpY2UtPmJ1bGtfdHgubG9jYWxfaW5zZXJ0IC0KKwkJCXNlcnZpY2UtPmJ1bGtfdHgucmVtb3RlX2luc2VydDsKKworCQlyeF9wZW5kaW5nID0gc2VydmljZS0+YnVsa19yeC5sb2NhbF9pbnNlcnQgLQorCQkJc2VydmljZS0+YnVsa19yeC5yZW1vdGVfaW5zZXJ0OworCisJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkiICBCdWxrOiB0eF9wZW5kaW5nPSVkIChzaXplICVkKSwiCisJCQkiIHJ4X3BlbmRpbmc9JWQgKHNpemUgJWQpIiwKKwkJCXR4X3BlbmRpbmcsCisJCQl0eF9wZW5kaW5nID8gc2VydmljZS0+YnVsa190eC5idWxrc1sKKwkJCUJVTEtfSU5ERVgoc2VydmljZS0+YnVsa190eC5yZW1vdmUpXS5zaXplIDogMCwKKwkJCXJ4X3BlbmRpbmcsCisJCQlyeF9wZW5kaW5nID8gc2VydmljZS0+YnVsa19yeC5idWxrc1sKKwkJCUJVTEtfSU5ERVgoc2VydmljZS0+YnVsa19yeC5yZW1vdmUpXS5zaXplIDogMCk7CisKKwkJaWYgKFZDSElRX0VOQUJMRV9TVEFUUykgeworCQkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwkJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJIiAgQ3RybDogdHhfY291bnQ9JWQsIHR4X2J5dGVzPSVsbHUsICIKKwkJCQkicnhfY291bnQ9JWQsIHJ4X2J5dGVzPSVsbHUiLAorCQkJCXNlcnZpY2UtPnN0YXRzLmN0cmxfdHhfY291bnQsCisJCQkJc2VydmljZS0+c3RhdHMuY3RybF90eF9ieXRlcywKKwkJCQlzZXJ2aWNlLT5zdGF0cy5jdHJsX3J4X2NvdW50LAorCQkJCXNlcnZpY2UtPnN0YXRzLmN0cmxfcnhfYnl0ZXMpOworCQkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwkJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJIiAgQnVsazogdHhfY291bnQ9JWQsIHR4X2J5dGVzPSVsbHUsICIKKwkJCQkicnhfY291bnQ9JWQsIHJ4X2J5dGVzPSVsbHUiLAorCQkJCXNlcnZpY2UtPnN0YXRzLmJ1bGtfdHhfY291bnQsCisJCQkJc2VydmljZS0+c3RhdHMuYnVsa190eF9ieXRlcywKKwkJCQlzZXJ2aWNlLT5zdGF0cy5idWxrX3J4X2NvdW50LAorCQkJCXNlcnZpY2UtPnN0YXRzLmJ1bGtfcnhfYnl0ZXMpOworCQkJdmNoaXFfZHVtcChkdW1wX2NvbnRleHQsIGJ1ZiwgbGVuICsgMSk7CisKKwkJCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCisJCQkJIiAgJWQgcXVvdGEgc3RhbGxzLCAlZCBzbG90IHN0YWxscywgIgorCQkJCSIlZCBidWxrIHN0YWxscywgJWQgYWJvcnRlZCwgJWQgZXJyb3JzIiwKKwkJCQlzZXJ2aWNlLT5zdGF0cy5xdW90YV9zdGFsbHMsCisJCQkJc2VydmljZS0+c3RhdHMuc2xvdF9zdGFsbHMsCisJCQkJc2VydmljZS0+c3RhdHMuYnVsa19zdGFsbHMsCisJCQkJc2VydmljZS0+c3RhdHMuYnVsa19hYm9ydGVkX2NvdW50LAorCQkJCXNlcnZpY2UtPnN0YXRzLmVycm9yX2NvdW50KTsKKwkJIH0KKwl9CisKKwl2Y2hpcV9kdW1wKGR1bXBfY29udGV4dCwgYnVmLCBsZW4gKyAxKTsKKworCWlmIChzZXJ2aWNlLT5zcnZzdGF0ZSAhPSBWQ0hJUV9TUlZTVEFURV9GUkVFKQorCQl2Y2hpcV9kdW1wX3BsYXRmb3JtX3NlcnZpY2Vfc3RhdGUoZHVtcF9jb250ZXh0LCBzZXJ2aWNlKTsKK30KKworCit2b2lkCit2Y2hpcV9sb3VkX2Vycm9yX2hlYWRlcih2b2lkKQoreworCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKwkJIj09PT09PT09PT09PT09PT0iKTsKKwl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisJCSI9PT09PT09PT09PT09PT09Iik7CisJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLCAiPT09PT0iKTsKK30KKwordm9pZAordmNoaXFfbG91ZF9lcnJvcl9mb290ZXIodm9pZCkKK3sKKwl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsICI9PT09PSIpOworCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKwkJIj09PT09PT09PT09PT09PT0iKTsKKwl2Y2hpcV9sb2dfZXJyb3IodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisJCSI9PT09PT09PT09PT09PT09Iik7Cit9CisKKworVkNISVFfU1RBVFVTX1QgdmNoaXFfc2VuZF9yZW1vdGVfdXNlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1JFVFJZOworCWlmIChzdGF0ZS0+Y29ubl9zdGF0ZSAhPSBWQ0hJUV9DT05OU1RBVEVfRElTQ09OTkVDVEVEKQorCQlzdGF0dXMgPSBxdWV1ZV9tZXNzYWdlKHN0YXRlLCBOVUxMLAorCQkJVkNISVFfTUFLRV9NU0coVkNISVFfTVNHX1JFTU9URV9VU0UsIDAsIDApLAorCQkJTlVMTCwgMCwgMCwgMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworVkNISVFfU1RBVFVTX1QgdmNoaXFfc2VuZF9yZW1vdGVfcmVsZWFzZShWQ0hJUV9TVEFURV9UICpzdGF0ZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwlpZiAoc3RhdGUtPmNvbm5fc3RhdGUgIT0gVkNISVFfQ09OTlNUQVRFX0RJU0NPTk5FQ1RFRCkKKwkJc3RhdHVzID0gcXVldWVfbWVzc2FnZShzdGF0ZSwgTlVMTCwKKwkJCVZDSElRX01BS0VfTVNHKFZDSElRX01TR19SRU1PVEVfUkVMRUFTRSwgMCwgMCksCisJCQlOVUxMLCAwLCAwLCAwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9zZW5kX3JlbW90ZV91c2VfYWN0aXZlKFZDSElRX1NUQVRFX1QgKnN0YXRlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1cyA9IFZDSElRX1JFVFJZOworCWlmIChzdGF0ZS0+Y29ubl9zdGF0ZSAhPSBWQ0hJUV9DT05OU1RBVEVfRElTQ09OTkVDVEVEKQorCQlzdGF0dXMgPSBxdWV1ZV9tZXNzYWdlKHN0YXRlLCBOVUxMLAorCQkJVkNISVFfTUFLRV9NU0coVkNISVFfTVNHX1JFTU9URV9VU0VfQUNUSVZFLCAwLCAwKSwKKwkJCU5VTEwsIDAsIDAsIDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3ZvaWQgdmNoaXFfbG9nX2R1bXBfbWVtKGNvbnN0IGNoYXIgKmxhYmVsLCB1aW50MzJfdCBhZGRyLCBjb25zdCB2b2lkICp2b2lkTWVtLAorCXNpemVfdCBudW1CeXRlcykKK3sKKwljb25zdCB1aW50OF90ICAqbWVtID0gKGNvbnN0IHVpbnQ4X3QgKil2b2lkTWVtOworCXNpemVfdCAgICAgICAgICBvZmZzZXQ7CisJY2hhciAgICAgICAgICAgIGxpbmVCdWZbMTAwXTsKKwljaGFyICAgICAgICAgICAqczsKKworCXdoaWxlIChudW1CeXRlcyA+IDApIHsKKwkJcyA9IGxpbmVCdWY7CisKKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAxNjsgb2Zmc2V0KyspIHsKKwkJCWlmIChvZmZzZXQgPCBudW1CeXRlcykKKwkJCQlzICs9IHNucHJpbnRmKHMsIDQsICIlMDJ4ICIsIG1lbVtvZmZzZXRdKTsKKwkJCWVsc2UKKwkJCQlzICs9IHNucHJpbnRmKHMsIDQsICIgICAiKTsKKwkJfQorCisJCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgMTY7IG9mZnNldCsrKSB7CisJCQlpZiAob2Zmc2V0IDwgbnVtQnl0ZXMpIHsKKwkJCQl1aW50OF90IGNoID0gbWVtW29mZnNldF07CisKKwkJCQlpZiAoKGNoIDwgJyAnKSB8fCAoY2ggPiAnficpKQorCQkJCQljaCA9ICcuJzsKKwkJCQkqcysrID0gKGNoYXIpY2g7CisJCQl9CisJCX0KKwkJKnMrKyA9ICdcMCc7CisKKwkJaWYgKChsYWJlbCAhPSBOVUxMKSAmJiAoKmxhYmVsICE9ICdcMCcpKQorCQkJdmNoaXFfbG9nX3RyYWNlKFZDSElRX0xPR19UUkFDRSwKKwkJCQkiJXM6ICUwOHg6ICVzIiwgbGFiZWwsIGFkZHIsIGxpbmVCdWYpOworCQllbHNlCisJCQl2Y2hpcV9sb2dfdHJhY2UoVkNISVFfTE9HX1RSQUNFLAorCQkJCSIlMDh4OiAlcyIsIGFkZHIsIGxpbmVCdWYpOworCisJCWFkZHIgKz0gMTY7CisJCW1lbSArPSAxNjsKKwkJaWYgKG51bUJ5dGVzID4gMTYpCisJCQludW1CeXRlcyAtPSAxNjsKKwkJZWxzZQorCQkJbnVtQnl0ZXMgPSAwOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlNDg0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfY29yZS5oCkBAIC0wLDAgKzEsNzEyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX0NPUkVfSAorI2RlZmluZSBWQ0hJUV9DT1JFX0gKKworI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorCisjaW5jbHVkZSAidmNoaXFfY2ZnLmgiCisKKyNpbmNsdWRlICJ2Y2hpcS5oIgorCisvKiBSdW4gdGltZSBjb250cm9sIG9mIGxvZyBsZXZlbCwgYmFzZWQgb24gS0VSTl9YWFggbGV2ZWwuICovCisjZGVmaW5lIFZDSElRX0xPR19ERUZBVUxUICA0CisjZGVmaW5lIFZDSElRX0xPR19FUlJPUiAgICAzCisjZGVmaW5lIFZDSElRX0xPR19XQVJOSU5HICA0CisjZGVmaW5lIFZDSElRX0xPR19JTkZPICAgICA2CisjZGVmaW5lIFZDSElRX0xPR19UUkFDRSAgICA3CisKKyNkZWZpbmUgVkNISVFfTE9HX1BSRUZJWCAgIEtFUk5fSU5GTyAidmNoaXE6ICIKKworI2lmbmRlZiB2Y2hpcV9sb2dfZXJyb3IKKyNkZWZpbmUgdmNoaXFfbG9nX2Vycm9yKGNhdCwgZm10LCAuLi4pIFwKKwlkbyB7IGlmIChjYXQgPj0gVkNISVFfTE9HX0VSUk9SKSBcCisJCXByaW50ayhWQ0hJUV9MT0dfUFJFRklYIGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmbmRlZiB2Y2hpcV9sb2dfd2FybmluZworI2RlZmluZSB2Y2hpcV9sb2dfd2FybmluZyhjYXQsIGZtdCwgLi4uKSBcCisJZG8geyBpZiAoY2F0ID49IFZDSElRX0xPR19XQVJOSU5HKSBcCisJCSBwcmludGsoVkNISVFfTE9HX1BSRUZJWCBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgdmNoaXFfbG9nX2luZm8KKyNkZWZpbmUgdmNoaXFfbG9nX2luZm8oY2F0LCBmbXQsIC4uLikgXAorCWRvIHsgaWYgKGNhdCA+PSBWQ0hJUV9MT0dfSU5GTykgXAorCQlwcmludGsoVkNISVFfTE9HX1BSRUZJWCBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgdmNoaXFfbG9nX3RyYWNlCisjZGVmaW5lIHZjaGlxX2xvZ190cmFjZShjYXQsIGZtdCwgLi4uKSBcCisJZG8geyBpZiAoY2F0ID49IFZDSElRX0xPR19UUkFDRSkgXAorCQlwcmludGsoVkNISVFfTE9HX1BSRUZJWCBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSB2Y2hpcV9sb3VkX2Vycm9yKC4uLikgXAorCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwgIj09PT09ICIgX19WQV9BUkdTX18pCisKKyNpZm5kZWYgdmNoaXFfc3RhdGljX2Fzc2VydAorI2RlZmluZSB2Y2hpcV9zdGF0aWNfYXNzZXJ0KGNvbmQpIF9fYXR0cmlidXRlX18oKHVudXNlZCkpIFwKKwlleHRlcm4gaW50IHZjaGlxX3N0YXRpY19hc3NlcnRbKGNvbmQpID8gMSA6IC0xXQorI2VuZGlmCisKKyNkZWZpbmUgSVNfUE9XMih4KSAoeCAmJiAoKHggJiAoeCAtIDEpKSA9PSAwKSkKKworLyogRW5zdXJlIHRoYXQgdGhlIHNsb3Qgc2l6ZSBhbmQgbWF4aW11bSBudW1iZXIgb2Ygc2xvdHMgYXJlIHBvd2VycyBvZiAyICovCit2Y2hpcV9zdGF0aWNfYXNzZXJ0KElTX1BPVzIoVkNISVFfU0xPVF9TSVpFKSk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KElTX1BPVzIoVkNISVFfTUFYX1NMT1RTKSk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KElTX1BPVzIoVkNISVFfTUFYX1NMT1RTX1BFUl9TSURFKSk7CisKKyNkZWZpbmUgVkNISVFfU0xPVF9NQVNLICAgICAgICAoVkNISVFfU0xPVF9TSVpFIC0gMSkKKyNkZWZpbmUgVkNISVFfU0xPVF9RVUVVRV9NQVNLICAoVkNISVFfTUFYX1NMT1RTX1BFUl9TSURFIC0gMSkKKyNkZWZpbmUgVkNISVFfU0xPVF9aRVJPX1NMT1RTICAoKHNpemVvZihWQ0hJUV9TTE9UX1pFUk9fVCkgKyBcCisJVkNISVFfU0xPVF9TSVpFIC0gMSkgLyBWQ0hJUV9TTE9UX1NJWkUpCisKKyNkZWZpbmUgVkNISVFfTVNHX1BBRERJTkcgICAgICAgICAgICAwICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0NPTk5FQ1QgICAgICAgICAgICAxICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX09QRU4gICAgICAgICAgICAgICAyICAvKiArIChzcmNwb3J0LCAtKSwgZm91cmNjLCBjbGllbnRfaWQgKi8KKyNkZWZpbmUgVkNISVFfTVNHX09QRU5BQ0sgICAgICAgICAgICAzICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0NMT1NFICAgICAgICAgICAgICA0ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0RBVEEgICAgICAgICAgICAgICA1ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0JVTEtfUlggICAgICAgICAgICA2ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSwgZGF0YSwgc2l6ZSAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0JVTEtfVFggICAgICAgICAgICA3ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSwgZGF0YSwgc2l6ZSAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0JVTEtfUlhfRE9ORSAgICAgICA4ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSwgYWN0dWFsICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX0JVTEtfVFhfRE9ORSAgICAgICA5ICAvKiArIChzcmNwb3J0LCBkc3Rwb3J0KSwgYWN0dWFsICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX1BBVVNFICAgICAgICAgICAgIDEwICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX1JFU1VNRSAgICAgICAgICAgIDExICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX1JFTU9URV9VU0UgICAgICAgIDEyICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX1JFTU9URV9SRUxFQVNFICAgIDEzICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgVkNISVFfTVNHX1JFTU9URV9VU0VfQUNUSVZFIDE0ICAvKiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBWQ0hJUV9QT1JUX01BWCAgICAgICAgICAgICAgICAgKFZDSElRX01BWF9TRVJWSUNFUyAtIDEpCisjZGVmaW5lIFZDSElRX1BPUlRfRlJFRSAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgVkNISVFfUE9SVF9JU19WQUxJRChwb3J0KSAgICAgIChwb3J0IDwgVkNISVFfUE9SVF9GUkVFKQorI2RlZmluZSBWQ0hJUV9NQUtFX01TRyh0eXBlLCBzcmNwb3J0LCBkc3Rwb3J0KSBcCisJKCh0eXBlPDwyNCkgfCAoc3JjcG9ydDw8MTIpIHwgKGRzdHBvcnQ8PDApKQorI2RlZmluZSBWQ0hJUV9NU0dfVFlQRShtc2dpZCkgICAgICAgICAgKCh1bnNpZ25lZCBpbnQpbXNnaWQgPj4gMjQpCisjZGVmaW5lIFZDSElRX01TR19TUkNQT1JUKG1zZ2lkKSBcCisJKHVuc2lnbmVkIHNob3J0KSgoKHVuc2lnbmVkIGludCltc2dpZCA+PiAxMikgJiAweGZmZikKKyNkZWZpbmUgVkNISVFfTVNHX0RTVFBPUlQobXNnaWQpIFwKKwkoKHVuc2lnbmVkIHNob3J0KW1zZ2lkICYgMHhmZmYpCisKKyNkZWZpbmUgVkNISVFfRk9VUkNDX0FTXzRDSEFSUyhmb3VyY2MpCVwKKwkoKGZvdXJjYykgPj4gMjQpICYgMHhmZiwgXAorCSgoZm91cmNjKSA+PiAxNikgJiAweGZmLCBcCisJKChmb3VyY2MpID4+ICA4KSAmIDB4ZmYsIFwKKwkoZm91cmNjKSAmIDB4ZmYKKworLyogRW5zdXJlIHRoZSBmaWVsZHMgYXJlIHdpZGUgZW5vdWdoICovCit2Y2hpcV9zdGF0aWNfYXNzZXJ0KFZDSElRX01TR19TUkNQT1JUKFZDSElRX01BS0VfTVNHKDAsIDAsIFZDSElRX1BPUlRfTUFYKSkKKwk9PSAwKTsKK3ZjaGlxX3N0YXRpY19hc3NlcnQoVkNISVFfTVNHX1RZUEUoVkNISVFfTUFLRV9NU0coMCwgVkNISVFfUE9SVF9NQVgsIDApKSA9PSAwKTsKK3ZjaGlxX3N0YXRpY19hc3NlcnQoKHVuc2lnbmVkIGludClWQ0hJUV9QT1JUX01BWCA8CisJKHVuc2lnbmVkIGludClWQ0hJUV9QT1JUX0ZSRUUpOworCisjZGVmaW5lIFZDSElRX01TR0lEX1BBRERJTkcgICAgICAgICAgICBWQ0hJUV9NQUtFX01TRyhWQ0hJUV9NU0dfUEFERElORywgMCwgMCkKKyNkZWZpbmUgVkNISVFfTVNHSURfQ0xBSU1FRCAgICAgICAgICAgIDB4NDAwMDAwMDAKKworI2RlZmluZSBWQ0hJUV9GT1VSQ0NfSU5WQUxJRCAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBWQ0hJUV9GT1VSQ0NfSVNfTEVHQUwoZm91cmNjKSAgKGZvdXJjYyAhPSBWQ0hJUV9GT1VSQ0NfSU5WQUxJRCkKKworI2RlZmluZSBWQ0hJUV9CVUxLX0FDVFVBTF9BQk9SVEVEIC0xCisKK3R5cGVkZWYgdWludDMyX3QgQklUU0VUX1Q7CisKK3ZjaGlxX3N0YXRpY19hc3NlcnQoKHNpemVvZihCSVRTRVRfVCkgKiA4KSA9PSAzMik7CisKKyNkZWZpbmUgQklUU0VUX1NJWkUoYikgICAgICAgICgoYiArIDMxKSA+PiA1KQorI2RlZmluZSBCSVRTRVRfV09SRChiKSAgICAgICAgKGIgPj4gNSkKKyNkZWZpbmUgQklUU0VUX0JJVChiKSAgICAgICAgICgxIDw8IChiICYgMzEpKQorI2RlZmluZSBCSVRTRVRfWkVSTyhicykgICAgICAgbWVtc2V0KGJzLCAwLCBzaXplb2YoYnMpKQorI2RlZmluZSBCSVRTRVRfSVNfU0VUKGJzLCBiKSAgKGJzW0JJVFNFVF9XT1JEKGIpXSAmIEJJVFNFVF9CSVQoYikpCisjZGVmaW5lIEJJVFNFVF9TRVQoYnMsIGIpICAgICAoYnNbQklUU0VUX1dPUkQoYildIHw9IEJJVFNFVF9CSVQoYikpCisjZGVmaW5lIEJJVFNFVF9DTFIoYnMsIGIpICAgICAoYnNbQklUU0VUX1dPUkQoYildICY9IH5CSVRTRVRfQklUKGIpKQorCisjaWYgVkNISVFfRU5BQkxFX1NUQVRTCisjZGVmaW5lIFZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgc3RhdCkgKHN0YXRlLT5zdGF0cy4gc3RhdCsrKQorI2RlZmluZSBWQ0hJUV9TRVJWSUNFX1NUQVRTX0lOQyhzZXJ2aWNlLCBzdGF0KSAoc2VydmljZS0+c3RhdHMuIHN0YXQrKykKKyNkZWZpbmUgVkNISVFfU0VSVklDRV9TVEFUU19BREQoc2VydmljZSwgc3RhdCwgYWRkZW5kKSBcCisJKHNlcnZpY2UtPnN0YXRzLiBzdGF0ICs9IGFkZGVuZCkKKyNlbHNlCisjZGVmaW5lIFZDSElRX1NUQVRTX0lOQyhzdGF0ZSwgc3RhdCkgKCh2b2lkKTApCisjZGVmaW5lIFZDSElRX1NFUlZJQ0VfU1RBVFNfSU5DKHNlcnZpY2UsIHN0YXQpICgodm9pZCkwKQorI2RlZmluZSBWQ0hJUV9TRVJWSUNFX1NUQVRTX0FERChzZXJ2aWNlLCBzdGF0LCBhZGRlbmQpICgodm9pZCkwKQorI2VuZGlmCisKK2VudW0geworCURFQlVHX0VOVFJJRVMsCisjaWYgVkNISVFfRU5BQkxFX0RFQlVHCisJREVCVUdfU0xPVF9IQU5ETEVSX0NPVU5ULAorCURFQlVHX1NMT1RfSEFORExFUl9MSU5FLAorCURFQlVHX1BBUlNFX0xJTkUsCisJREVCVUdfUEFSU0VfSEVBREVSLAorCURFQlVHX1BBUlNFX01TR0lELAorCURFQlVHX0FXQUlUX0NPTVBMRVRJT05fTElORSwKKwlERUJVR19ERVFVRVVFX01FU1NBR0VfTElORSwKKwlERUJVR19TRVJWSUNFX0NBTExCQUNLX0xJTkUsCisJREVCVUdfTVNHX1FVRVVFX0ZVTExfQ09VTlQsCisJREVCVUdfQ09NUExFVElPTl9RVUVVRV9GVUxMX0NPVU5ULAorI2VuZGlmCisJREVCVUdfTUFYCit9OworCisjaWYgVkNISVFfRU5BQkxFX0RFQlVHCisKKyNkZWZpbmUgREVCVUdfSU5JVElBTElTRShsb2NhbCkgaW50ICpkZWJ1Z19wdHIgPSAobG9jYWwpLT5kZWJ1ZzsKKyNkZWZpbmUgREVCVUdfVFJBQ0UoZCkgXAorCWRvIHsgZGVidWdfcHRyW0RFQlVHXyAjIyBkXSA9IF9fTElORV9fOyBkc2IoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgREVCVUdfVkFMVUUoZCwgdikgXAorCWRvIHsgZGVidWdfcHRyW0RFQlVHXyAjIyBkXSA9ICh2KTsgZHNiKCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIERFQlVHX0NPVU5UKGQpIFwKKwlkbyB7IGRlYnVnX3B0cltERUJVR18gIyMgZF0rKzsgZHNiKCk7IH0gd2hpbGUgKDApCisKKyNlbHNlIC8qIFZDSElRX0VOQUJMRV9ERUJVRyAqLworCisjZGVmaW5lIERFQlVHX0lOSVRJQUxJU0UobG9jYWwpCisjZGVmaW5lIERFQlVHX1RSQUNFKGQpCisjZGVmaW5lIERFQlVHX1ZBTFVFKGQsIHYpCisjZGVmaW5lIERFQlVHX0NPVU5UKGQpCisKKyNlbmRpZiAvKiBWQ0hJUV9FTkFCTEVfREVCVUcgKi8KKwordHlwZWRlZiBlbnVtIHsKKwlWQ0hJUV9DT05OU1RBVEVfRElTQ09OTkVDVEVELAorCVZDSElRX0NPTk5TVEFURV9DT05ORUNUSU5HLAorCVZDSElRX0NPTk5TVEFURV9DT05ORUNURUQsCisJVkNISVFfQ09OTlNUQVRFX1BBVVNJTkcsCisJVkNISVFfQ09OTlNUQVRFX1BBVVNFX1NFTlQsCisJVkNISVFfQ09OTlNUQVRFX1BBVVNFRCwKKwlWQ0hJUV9DT05OU1RBVEVfUkVTVU1JTkcsCisJVkNISVFfQ09OTlNUQVRFX1BBVVNFX1RJTUVPVVQsCisJVkNISVFfQ09OTlNUQVRFX1JFU1VNRV9USU1FT1VUCit9IFZDSElRX0NPTk5TVEFURV9UOworCitlbnVtIHsKKwlWQ0hJUV9TUlZTVEFURV9GUkVFLAorCVZDSElRX1NSVlNUQVRFX0hJRERFTiwKKwlWQ0hJUV9TUlZTVEFURV9MSVNURU5JTkcsCisJVkNISVFfU1JWU1RBVEVfT1BFTklORywKKwlWQ0hJUV9TUlZTVEFURV9PUEVOLAorCVZDSElRX1NSVlNUQVRFX09QRU5TWU5DLAorCVZDSElRX1NSVlNUQVRFX0NMT1NFU0VOVCwKKwlWQ0hJUV9TUlZTVEFURV9DTE9TRVJFQ1ZELAorCVZDSElRX1NSVlNUQVRFX0NMT1NFV0FJVCwKKwlWQ0hJUV9TUlZTVEFURV9DTE9TRUQKK307CisKK2VudW0geworCVZDSElRX1BPTExfVEVSTUlOQVRFLAorCVZDSElRX1BPTExfUkVNT1ZFLAorCVZDSElRX1BPTExfVFhOT1RJRlksCisJVkNISVFfUE9MTF9SWE5PVElGWSwKKwlWQ0hJUV9QT0xMX0NPVU5UCit9OworCit0eXBlZGVmIGVudW0geworCVZDSElRX0JVTEtfVFJBTlNNSVQsCisJVkNISVFfQlVMS19SRUNFSVZFCit9IFZDSElRX0JVTEtfRElSX1Q7CisKK3R5cGVkZWYgdm9pZCAoKlZDSElRX1VTRVJEQVRBX1RFUk1fVCkodm9pZCAqdXNlcmRhdGEpOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9idWxrX3N0cnVjdCB7CisJc2hvcnQgbW9kZTsKKwlzaG9ydCBkaXI7CisJdm9pZCAqdXNlcmRhdGE7CisJVkNISV9NRU1fSEFORExFX1QgaGFuZGxlOworCXZvaWQgKmRhdGE7CisJaW50IHNpemU7CisJdm9pZCAqcmVtb3RlX2RhdGE7CisJaW50IHJlbW90ZV9zaXplOworCWludCBhY3R1YWw7Cit9IFZDSElRX0JVTEtfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfYnVsa19xdWV1ZV9zdHJ1Y3QgeworCWludCBsb2NhbF9pbnNlcnQ7ICAvKiBXaGVyZSB0byBpbnNlcnQgdGhlIG5leHQgbG9jYWwgYnVsayAqLworCWludCByZW1vdGVfaW5zZXJ0OyAvKiBXaGVyZSB0byBpbnNlcnQgdGhlIG5leHQgcmVtb3RlIGJ1bGsgKG1hc3RlcikgKi8KKwlpbnQgcHJvY2VzczsgICAgICAgLyogQnVsayB0byB0cmFuc2ZlciBuZXh0ICovCisJaW50IHJlbW90ZV9ub3RpZnk7IC8qIEJ1bGsgdG8gbm90aWZ5IHRoZSByZW1vdGUgY2xpZW50IG9mIG5leHQgKG1zdHIpICovCisJaW50IHJlbW92ZTsgICAgICAgIC8qIEJ1bGsgdG8gbm90aWZ5IHRoZSBsb2NhbCBjbGllbnQgb2YsIGFuZCByZW1vdmUsCisJCQkgICAqKiBuZXh0ICovCisJVkNISVFfQlVMS19UIGJ1bGtzW1ZDSElRX05VTV9TRVJWSUNFX0JVTEtTXTsKK30gVkNISVFfQlVMS19RVUVVRV9UOworCit0eXBlZGVmIHN0cnVjdCByZW1vdGVfZXZlbnRfc3RydWN0IHsKKwlpbnQgYXJtZWQ7CisJaW50IGZpcmVkOworCXN0cnVjdCBzZW1hcGhvcmUgKmV2ZW50OworfSBSRU1PVEVfRVZFTlRfVDsKKwordHlwZWRlZiBzdHJ1Y3Qgb3BhcXVlX3BsYXRmb3JtX3N0YXRlX3QgKlZDSElRX1BMQVRGT1JNX1NUQVRFX1Q7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX3N0YXRlX3N0cnVjdCBWQ0hJUV9TVEFURV9UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9zbG90X3N0cnVjdCB7CisJY2hhciBkYXRhW1ZDSElRX1NMT1RfU0laRV07Cit9IFZDSElRX1NMT1RfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfc2xvdF9pbmZvX3N0cnVjdCB7CisJLyogVXNlIHR3byBjb3VudGVycyByYXRoZXIgdGhhbiBvbmUgdG8gYXZvaWQgdGhlIG5lZWQgZm9yIGEgbXV0ZXguICovCisJc2hvcnQgdXNlX2NvdW50OworCXNob3J0IHJlbGVhc2VfY291bnQ7Cit9IFZDSElRX1NMT1RfSU5GT19UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9zZXJ2aWNlX3N0cnVjdCB7CisJVkNISVFfU0VSVklDRV9CQVNFX1QgYmFzZTsKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgcmVmX2NvdW50OworCWludCBzcnZzdGF0ZTsKKwlWQ0hJUV9VU0VSREFUQV9URVJNX1QgdXNlcmRhdGFfdGVybTsKKwl1bnNpZ25lZCBpbnQgbG9jYWxwb3J0OworCXVuc2lnbmVkIGludCByZW1vdGVwb3J0OworCWludCBwdWJsaWNfZm91cmNjOworCWludCBjbGllbnRfaWQ7CisJY2hhciBhdXRvX2Nsb3NlOworCWNoYXIgc3luYzsKKwljaGFyIGNsb3Npbmc7CisJY2hhciB0cmFjZTsKKwlhdG9taWNfdCBwb2xsX2ZsYWdzOworCXNob3J0IHZlcnNpb247CisJc2hvcnQgdmVyc2lvbl9taW47CisJc2hvcnQgcGVlcl92ZXJzaW9uOworCisJVkNISVFfU1RBVEVfVCAqc3RhdGU7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZTsKKworCWludCBzZXJ2aWNlX3VzZV9jb3VudDsKKworCVZDSElRX0JVTEtfUVVFVUVfVCBidWxrX3R4OworCVZDSElRX0JVTEtfUVVFVUVfVCBidWxrX3J4OworCisJc3RydWN0IHNlbWFwaG9yZSByZW1vdmVfZXZlbnQ7CisJc3RydWN0IHNlbWFwaG9yZSBidWxrX3JlbW92ZV9ldmVudDsKKwlzdHJ1Y3QgbXV0ZXggYnVsa19tdXRleDsKKworCXN0cnVjdCBzZXJ2aWNlX3N0YXRzX3N0cnVjdCB7CisJCWludCBxdW90YV9zdGFsbHM7CisJCWludCBzbG90X3N0YWxsczsKKwkJaW50IGJ1bGtfc3RhbGxzOworCQlpbnQgZXJyb3JfY291bnQ7CisJCWludCBjdHJsX3R4X2NvdW50OworCQlpbnQgY3RybF9yeF9jb3VudDsKKwkJaW50IGJ1bGtfdHhfY291bnQ7CisJCWludCBidWxrX3J4X2NvdW50OworCQlpbnQgYnVsa19hYm9ydGVkX2NvdW50OworCQl1aW50NjRfdCBjdHJsX3R4X2J5dGVzOworCQl1aW50NjRfdCBjdHJsX3J4X2J5dGVzOworCQl1aW50NjRfdCBidWxrX3R4X2J5dGVzOworCQl1aW50NjRfdCBidWxrX3J4X2J5dGVzOworCX0gc3RhdHM7Cit9IFZDSElRX1NFUlZJQ0VfVDsKKworLyogVGhlIHF1b3RhIGluZm9ybWF0aW9uIGlzIG91dHNpZGUgVkNISVFfU0VSVklDRV9UIHNvIHRoYXQgaXQgY2FuIGJlCisJc3RhdGljYWxseSBhbGxvY2F0ZWQsIHNpbmNlIGZvciBhY2NvdW50aW5nIHJlYXNvbnMgYSBzZXJ2aWNlJ3Mgc2xvdAorCXVzYWdlIGlzIGNhcnJpZWQgb3ZlciBiZXR3ZWVuIHVzZXJzIG9mIHRoZSBzYW1lIHBvcnQgbnVtYmVyLgorICovCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9zZXJ2aWNlX3F1b3RhX3N0cnVjdCB7CisJdW5zaWduZWQgc2hvcnQgc2xvdF9xdW90YTsKKwl1bnNpZ25lZCBzaG9ydCBzbG90X3VzZV9jb3VudDsKKwl1bnNpZ25lZCBzaG9ydCBtZXNzYWdlX3F1b3RhOworCXVuc2lnbmVkIHNob3J0IG1lc3NhZ2VfdXNlX2NvdW50OworCXN0cnVjdCBzZW1hcGhvcmUgcXVvdGFfZXZlbnQ7CisJaW50IHByZXZpb3VzX3R4X2luZGV4OworfSBWQ0hJUV9TRVJWSUNFX1FVT1RBX1Q7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX3NoYXJlZF9zdGF0ZV9zdHJ1Y3QgeworCisJLyogQSBub24temVybyB2YWx1ZSBoZXJlIGluZGljYXRlcyB0aGF0IHRoZSBjb250ZW50IGlzIHZhbGlkLiAqLworCWludCBpbml0aWFsaXNlZDsKKworCS8qIFRoZSBmaXJzdCBhbmQgbGFzdCAoaW5jbHVzaXZlKSBzbG90cyBhbGxvY2F0ZWQgdG8gdGhlIG93bmVyLiAqLworCWludCBzbG90X2ZpcnN0OworCWludCBzbG90X2xhc3Q7CisKKwkvKiBUaGUgc2xvdCBhbGxvY2F0ZWQgdG8gc3luY2hyb25vdXMgbWVzc2FnZXMgZnJvbSB0aGUgb3duZXIuICovCisJaW50IHNsb3Rfc3luYzsKKworCS8qIFNpZ25hbGxpbmcgdGhpcyBldmVudCBpbmRpY2F0ZXMgdGhhdCBvd25lcidzIHNsb3QgaGFuZGxlciB0aHJlYWQKKwkqKiBzaG91bGQgcnVuLiAqLworCVJFTU9URV9FVkVOVF9UIHRyaWdnZXI7CisKKwkvKiBJbmRpY2F0ZXMgdGhlIGJ5dGUgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJlYW0gd2hlcmUgdGhlIG5leHQgbWVzc2FnZQorCSoqIHdpbGwgYmUgd3JpdHRlbi4gVGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIGFuIGluZGV4IGludG8gdGhlCisJKiogc2xvdC4gVGhlIG5leHQgYml0cyBhcmUgdGhlIGluZGV4IG9mIHRoZSBzbG90IGluIHNsb3RfcXVldWUuICovCisJaW50IHR4X3BvczsKKworCS8qIFRoaXMgZXZlbnQgc2hvdWxkIGJlIHNpZ25hbGxlZCB3aGVuIGEgc2xvdCBpcyByZWN5Y2xlZC4gKi8KKwlSRU1PVEVfRVZFTlRfVCByZWN5Y2xlOworCisJLyogVGhlIHNsb3RfcXVldWUgaW5kZXggd2hlcmUgdGhlIG5leHQgcmVjeWNsZWQgc2xvdCB3aWxsIGJlIHdyaXR0ZW4uICovCisJaW50IHNsb3RfcXVldWVfcmVjeWNsZTsKKworCS8qIFRoaXMgZXZlbnQgc2hvdWxkIGJlIHNpZ25hbGxlZCB3aGVuIGEgc3luY2hyb25vdXMgbWVzc2FnZSBpcyBzZW50LiAqLworCVJFTU9URV9FVkVOVF9UIHN5bmNfdHJpZ2dlcjsKKworCS8qIFRoaXMgZXZlbnQgc2hvdWxkIGJlIHNpZ25hbGxlZCB3aGVuIGEgc3luY2hyb25vdXMgbWVzc2FnZSBoYXMgYmVlbgorCSoqIHJlbGVhc2VkLiAqLworCVJFTU9URV9FVkVOVF9UIHN5bmNfcmVsZWFzZTsKKworCS8qIEEgY2lyY3VsYXIgYnVmZmVyIG9mIHNsb3QgaW5kZXhlcy4gKi8KKwlpbnQgc2xvdF9xdWV1ZVtWQ0hJUV9NQVhfU0xPVFNfUEVSX1NJREVdOworCisJLyogRGVidWdnaW5nIHN0YXRlICovCisJaW50IGRlYnVnW0RFQlVHX01BWF07Cit9IFZDSElRX1NIQVJFRF9TVEFURV9UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9zbG90X3plcm9fc3RydWN0IHsKKwlpbnQgbWFnaWM7CisJc2hvcnQgdmVyc2lvbjsKKwlzaG9ydCB2ZXJzaW9uX21pbjsKKwlpbnQgc2xvdF96ZXJvX3NpemU7CisJaW50IHNsb3Rfc2l6ZTsKKwlpbnQgbWF4X3Nsb3RzOworCWludCBtYXhfc2xvdHNfcGVyX3NpZGU7CisJaW50IHBsYXRmb3JtX2RhdGFbMl07CisJVkNISVFfU0hBUkVEX1NUQVRFX1QgbWFzdGVyOworCVZDSElRX1NIQVJFRF9TVEFURV9UIHNsYXZlOworCVZDSElRX1NMT1RfSU5GT19UIHNsb3RzW1ZDSElRX01BWF9TTE9UU107Cit9IFZDSElRX1NMT1RfWkVST19UOworCitzdHJ1Y3QgdmNoaXFfc3RhdGVfc3RydWN0IHsKKwlpbnQgaWQ7CisJaW50IGluaXRpYWxpc2VkOworCVZDSElRX0NPTk5TVEFURV9UIGNvbm5fc3RhdGU7CisJaW50IGlzX21hc3RlcjsKKwlzaG9ydCB2ZXJzaW9uX2NvbW1vbjsKKworCVZDSElRX1NIQVJFRF9TVEFURV9UICpsb2NhbDsKKwlWQ0hJUV9TSEFSRURfU1RBVEVfVCAqcmVtb3RlOworCVZDSElRX1NMT1RfVCAqc2xvdF9kYXRhOworCisJdW5zaWduZWQgc2hvcnQgZGVmYXVsdF9zbG90X3F1b3RhOworCXVuc2lnbmVkIHNob3J0IGRlZmF1bHRfbWVzc2FnZV9xdW90YTsKKworCS8qIEV2ZW50IGluZGljYXRpbmcgY29ubmVjdCBtZXNzYWdlIHJlY2VpdmVkICovCisJc3RydWN0IHNlbWFwaG9yZSBjb25uZWN0OworCisJLyogTXV0ZXggcHJvdGVjdGluZyBzZXJ2aWNlcyAqLworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlWQ0hJUV9JTlNUQU5DRV9UICppbnN0YW5jZTsKKworCS8qIFByb2Nlc3NlcyBpbmNvbWluZyBtZXNzYWdlcyAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqc2xvdF9oYW5kbGVyX3RocmVhZDsKKworCS8qIFByb2Nlc3NlcyByZWN5Y2xlZCBzbG90cyAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcmVjeWNsZV90aHJlYWQ7CisKKwkvKiBQcm9jZXNzZXMgc3luY2hyb25vdXMgbWVzc2FnZXMgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnN5bmNfdGhyZWFkOworCisJLyogTG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRyaWdnZXIgcmVtb3RlIGV2ZW50ICovCisJc3RydWN0IHNlbWFwaG9yZSB0cmlnZ2VyX2V2ZW50OworCisJLyogTG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlY3ljbGUgcmVtb3RlIGV2ZW50ICovCisJc3RydWN0IHNlbWFwaG9yZSByZWN5Y2xlX2V2ZW50OworCisJLyogTG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5bmMgdHJpZ2dlciByZW1vdGUgZXZlbnQgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIHN5bmNfdHJpZ2dlcl9ldmVudDsKKworCS8qIExvY2FsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzeW5jIHJlbGVhc2UgcmVtb3RlIGV2ZW50ICovCisJc3RydWN0IHNlbWFwaG9yZSBzeW5jX3JlbGVhc2VfZXZlbnQ7CisKKwljaGFyICp0eF9kYXRhOworCWNoYXIgKnJ4X2RhdGE7CisJVkNISVFfU0xPVF9JTkZPX1QgKnJ4X2luZm87CisKKwlzdHJ1Y3QgbXV0ZXggc2xvdF9tdXRleDsKKworCXN0cnVjdCBtdXRleCByZWN5Y2xlX211dGV4OworCisJc3RydWN0IG11dGV4IHN5bmNfbXV0ZXg7CisKKwlzdHJ1Y3QgbXV0ZXggYnVsa190cmFuc2Zlcl9tdXRleDsKKworCS8qIEluZGljYXRlcyB0aGUgYnl0ZSBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSBmcm9tIHdoZXJlIHRoZSBuZXh0CisJKiogbWVzc2FnZSB3aWxsIGJlIHJlYWQuIFRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIGFyZSBhbiBpbmRleCBpbnRvCisJKiogdGhlIHNsb3QuVGhlIG5leHQgYml0cyBhcmUgdGhlIGluZGV4IG9mIHRoZSBzbG90IGluCisJKiogcmVtb3RlLT5zbG90X3F1ZXVlLiAqLworCWludCByeF9wb3M7CisKKwkvKiBBIGNhY2hlZCBjb3B5IG9mIGxvY2FsLT50eF9wb3MuIE9ubHkgd3JpdGUgdG8gbG9jYWwtPnR4X3BvcywgYW5kIHJlYWQKKwkJZnJvbSByZW1vdGUtPnR4X3Bvcy4gKi8KKwlpbnQgbG9jYWxfdHhfcG9zOworCisJLyogVGhlIHNsb3RfcXVldWUgaW5kZXggb2YgdGhlIHNsb3QgdG8gYmVjb21lIGF2YWlsYWJsZSBuZXh0LiAqLworCWludCBzbG90X3F1ZXVlX2F2YWlsYWJsZTsKKworCS8qIEEgZmxhZyB0byBpbmRpY2F0ZSBpZiBhbnkgcG9sbCBoYXMgYmVlbiByZXF1ZXN0ZWQgKi8KKwlpbnQgcG9sbF9uZWVkZWQ7CisKKwkvKiBUaHMgaW5kZXggb2YgdGhlIHByZXZpb3VzIHNsb3QgdXNlZCBmb3IgZGF0YSBtZXNzYWdlcy4gKi8KKwlpbnQgcHJldmlvdXNfZGF0YV9pbmRleDsKKworCS8qIFRoZSBudW1iZXIgb2Ygc2xvdHMgb2NjdXBpZWQgYnkgZGF0YSBtZXNzYWdlcy4gKi8KKwl1bnNpZ25lZCBzaG9ydCBkYXRhX3VzZV9jb3VudDsKKworCS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzbG90cyB0byBiZSBvY2N1cGllZCBieSBkYXRhIG1lc3NhZ2VzLiAqLworCXVuc2lnbmVkIHNob3J0IGRhdGFfcXVvdGE7CisKKwkvKiBBbiBhcnJheSBvZiBiaXQgc2V0cyBpbmRpY2F0aW5nIHdoaWNoIHNlcnZpY2VzIG11c3QgYmUgcG9sbGVkLiAqLworCWF0b21pY190IHBvbGxfc2VydmljZXNbQklUU0VUX1NJWkUoVkNISVFfTUFYX1NFUlZJQ0VTKV07CisKKwkvKiBUaGUgbnVtYmVyIG9mIHRoZSBmaXJzdCB1bnVzZWQgc2VydmljZSAqLworCWludCB1bnVzZWRfc2VydmljZTsKKworCS8qIFNpZ25hbGxlZCB3aGVuIGEgZnJlZSBzbG90IGJlY29tZXMgYXZhaWxhYmxlLiAqLworCXN0cnVjdCBzZW1hcGhvcmUgc2xvdF9hdmFpbGFibGVfZXZlbnQ7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNsb3RfcmVtb3ZlX2V2ZW50OworCisJLyogU2lnbmFsbGVkIHdoZW4gYSBmcmVlIGRhdGEgc2xvdCBiZWNvbWVzIGF2YWlsYWJsZS4gKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGRhdGFfcXVvdGFfZXZlbnQ7CisKKwkvKiBJbmNyZW1lbnRlZCB3aGVuIHRoZXJlIGFyZSBidWxrIHRyYW5zZmVycyB3aGljaCBjYW5ub3QgYmUgcHJvY2Vzc2VkCisJICogd2hpbHN0IHBhdXNlZCBhbmQgbXVzdCBiZSBwcm9jZXNzZWQgb24gcmVzdW1lICovCisJaW50IGRlZmVycmVkX2J1bGtzOworCisJc3RydWN0IHN0YXRlX3N0YXRzX3N0cnVjdCB7CisJCWludCBzbG90X3N0YWxsczsKKwkJaW50IGRhdGFfc3RhbGxzOworCQlpbnQgY3RybF90eF9jb3VudDsKKwkJaW50IGN0cmxfcnhfY291bnQ7CisJCWludCBlcnJvcl9jb3VudDsKKwl9IHN0YXRzOworCisJVkNISVFfU0VSVklDRV9UICogc2VydmljZXNbVkNISVFfTUFYX1NFUlZJQ0VTXTsKKwlWQ0hJUV9TRVJWSUNFX1FVT1RBX1Qgc2VydmljZV9xdW90YXNbVkNISVFfTUFYX1NFUlZJQ0VTXTsKKwlWQ0hJUV9TTE9UX0lORk9fVCBzbG90X2luZm9bVkNISVFfTUFYX1NMT1RTXTsKKworCVZDSElRX1BMQVRGT1JNX1NUQVRFX1QgcGxhdGZvcm1fc3RhdGU7Cit9OworCitzdHJ1Y3QgYnVsa193YWl0ZXIgeworCVZDSElRX0JVTEtfVCAqYnVsazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGV2ZW50OworCWludCBhY3R1YWw7Cit9OworCitleHRlcm4gc3BpbmxvY2tfdCBidWxrX3dhaXRlcl9zcGlubG9jazsKKworZXh0ZXJuIGludCB2Y2hpcV9jb3JlX2xvZ19sZXZlbDsKK2V4dGVybiBpbnQgdmNoaXFfY29yZV9tc2dfbG9nX2xldmVsOworZXh0ZXJuIGludCB2Y2hpcV9zeW5jX2xvZ19sZXZlbDsKKworZXh0ZXJuIFZDSElRX1NUQVRFX1QgKnZjaGlxX3N0YXRlc1tWQ0hJUV9NQVhfU1RBVEVTXTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKgorZ2V0X2Nvbm5fc3RhdGVfbmFtZShWQ0hJUV9DT05OU1RBVEVfVCBjb25uX3N0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NMT1RfWkVST19UICoKK3ZjaGlxX2luaXRfc2xvdHModm9pZCAqbWVtX2Jhc2UsIGludCBtZW1fc2l6ZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfaW5pdF9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfU0xPVF9aRVJPX1QgKnNsb3RfemVybywKKwlpbnQgaXNfbWFzdGVyKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9jb25uZWN0X2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKTsKKworZXh0ZXJuIFZDSElRX1NFUlZJQ0VfVCAqCit2Y2hpcV9hZGRfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TVEFURV9UICpzdGF0ZSwKKwljb25zdCBWQ0hJUV9TRVJWSUNFX1BBUkFNU19UICpwYXJhbXMsIGludCBzcnZzdGF0ZSwKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLCBWQ0hJUV9VU0VSREFUQV9URVJNX1QgdXNlcmRhdGFfdGVybSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfb3Blbl9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwgaW50IGNsaWVudF9pZCk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfY2xvc2Vfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UsIGludCBjbG9zZV9yZWN2ZCk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV90ZXJtaW5hdGVfc2VydmljZV9pbnRlcm5hbChWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UpOworCitleHRlcm4gdm9pZAordmNoaXFfZnJlZV9zZXJ2aWNlX2ludGVybmFsKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfc2h1dGRvd25faW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3BhdXNlX2ludGVybmFsKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9yZXN1bWVfaW50ZXJuYWwoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAorcmVtb3RlX2V2ZW50X3BvbGxhbGwoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2J1bGtfdHJhbnNmZXIoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJVkNISV9NRU1fSEFORExFX1QgbWVtaGFuZGxlLCB2b2lkICpvZmZzZXQsIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSwKKwlWQ0hJUV9CVUxLX01PREVfVCBtb2RlLCBWQ0hJUV9CVUxLX0RJUl9UIGRpcik7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9kdW1wX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCwgVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfZHVtcF9zZXJ2aWNlX3N0YXRlKHZvaWQgKmR1bXBfY29udGV4dCwgVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2xvdWRfZXJyb3JfaGVhZGVyKHZvaWQpOworCitleHRlcm4gdm9pZAordmNoaXFfbG91ZF9lcnJvcl9mb290ZXIodm9pZCk7CisKK2V4dGVybiB2b2lkCityZXF1ZXN0X3BvbGwoVkNISVFfU1RBVEVfVCAqc3RhdGUsIFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSwgaW50IHBvbGxfdHlwZSk7CisKK3N0YXRpYyBpbmxpbmUgVkNISVFfU0VSVklDRV9UICoKK2hhbmRsZV90b19zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlKQoreworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gdmNoaXFfc3RhdGVzWyhoYW5kbGUgLyBWQ0hJUV9NQVhfU0VSVklDRVMpICYKKwkJKFZDSElRX01BWF9TVEFURVMgLSAxKV07CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gc3RhdGUtPnNlcnZpY2VzW2hhbmRsZSAmIChWQ0hJUV9NQVhfU0VSVklDRVMgLSAxKV07Cit9CisKK2V4dGVybiBWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9zZXJ2aWNlX2J5X2hhbmRsZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSk7CisKK2V4dGVybiBWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9zZXJ2aWNlX2J5X3BvcnQoVkNISVFfU1RBVEVfVCAqc3RhdGUsIGludCBsb2NhbHBvcnQpOworCitleHRlcm4gVkNISVFfU0VSVklDRV9UICoKK2ZpbmRfc2VydmljZV9mb3JfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSk7CisKK2V4dGVybiBWQ0hJUV9TRVJWSUNFX1QgKgorZmluZF9jbG9zZWRfc2VydmljZV9mb3JfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSk7CisKK2V4dGVybiBWQ0hJUV9TRVJWSUNFX1QgKgorbmV4dF9zZXJ2aWNlX2J5X2luc3RhbmNlKFZDSElRX1NUQVRFX1QgKnN0YXRlLCBWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLAorCWludCAqcGlkeCk7CisKK2V4dGVybiB2b2lkCitsb2NrX3NlcnZpY2UoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKTsKKworZXh0ZXJuIHZvaWQKK3VubG9ja19zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZnJvbSB2Y2hpcV9jb3JlLCBhbmQgZXh0ZXJuYWwKKyoqIGltcGxlbWVudGF0aW9ucyBtdXN0IGJlIHByb3ZpZGVkLiAqLworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3ByZXBhcmVfYnVsa19kYXRhKFZDSElRX0JVTEtfVCAqYnVsaywKKwlWQ0hJX01FTV9IQU5ETEVfVCBtZW1oYW5kbGUsIHZvaWQgKm9mZnNldCwgaW50IHNpemUsIGludCBkaXIpOworCitleHRlcm4gdm9pZAordmNoaXFfdHJhbnNmZXJfYnVsayhWQ0hJUV9CVUxLX1QgKmJ1bGspOworCitleHRlcm4gdm9pZAordmNoaXFfY29tcGxldGVfYnVsayhWQ0hJUV9CVUxLX1QgKmJ1bGspOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2NvcHlfZnJvbV91c2VyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgc2l6ZSk7CisKK2V4dGVybiB2b2lkCityZW1vdGVfZXZlbnRfc2lnbmFsKFJFTU9URV9FVkVOVF9UICpldmVudCk7CisKK3ZvaWQKK3ZjaGlxX3BsYXRmb3JtX2NoZWNrX3N1c3BlbmQoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfcGxhdGZvcm1fcGF1c2VkKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9wbGF0Zm9ybV9yZXN1bWUoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfcGxhdGZvcm1fcmVzdW1lZChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9kdW1wKHZvaWQgKmR1bXBfY29udGV4dCwgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1fc3RhdGUodm9pZCAqZHVtcF9jb250ZXh0KTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX2R1bXBfcGxhdGZvcm1faW5zdGFuY2VzKHZvaWQgKmR1bXBfY29udGV4dCk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9kdW1wX3BsYXRmb3JtX3NlcnZpY2Vfc3RhdGUodm9pZCAqZHVtcF9jb250ZXh0LAorCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVAordmNoaXFfdXNlX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9yZWxlYXNlX3NlcnZpY2VfaW50ZXJuYWwoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX29uX3JlbW90ZV91c2UoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfb25fcmVtb3RlX3JlbGVhc2UoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3BsYXRmb3JtX2luaXRfc3RhdGUoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2NoZWNrX3NlcnZpY2UoVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlKTsKKworZXh0ZXJuIHZvaWQKK3ZjaGlxX29uX3JlbW90ZV91c2VfYWN0aXZlKFZDSElRX1NUQVRFX1QgKnN0YXRlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UCit2Y2hpcV9zZW5kX3JlbW90ZV91c2UoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3NlbmRfcmVtb3RlX3JlbGVhc2UoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3NlbmRfcmVtb3RlX3VzZV9hY3RpdmUoVkNISVFfU1RBVEVfVCAqc3RhdGUpOworCitleHRlcm4gdm9pZAordmNoaXFfcGxhdGZvcm1fY29ubl9zdGF0ZV9jaGFuZ2VkKFZDSElRX1NUQVRFX1QgKnN0YXRlLAorCVZDSElRX0NPTk5TVEFURV9UIG9sZHN0YXRlLCBWQ0hJUV9DT05OU1RBVEVfVCBuZXdzdGF0ZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9wbGF0Zm9ybV9oYW5kbGVfdGltZW91dChWQ0hJUV9TVEFURV9UICpzdGF0ZSk7CisKK2V4dGVybiB2b2lkCit2Y2hpcV9zZXRfY29ubl9zdGF0ZShWQ0hJUV9TVEFURV9UICpzdGF0ZSwgVkNISVFfQ09OTlNUQVRFX1QgbmV3c3RhdGUpOworCisKK2V4dGVybiB2b2lkCit2Y2hpcV9sb2dfZHVtcF9tZW0oY29uc3QgY2hhciAqbGFiZWwsIHVpbnQzMl90IGFkZHIsIGNvbnN0IHZvaWQgKnZvaWRNZW0sCisJc2l6ZV90IG51bUJ5dGVzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2RlYnVnZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfZGVidWdmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDMyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2RlYnVnZnMuYwpAQCAtMCwwICsxLDM4MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUmFzcGJlcnJ5IFBpIChUcmFkaW5nKSBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgInZjaGlxX2NvcmUuaCIKKyNpbmNsdWRlICJ2Y2hpcV9hcm0uaCIKKyNpbmNsdWRlICJ2Y2hpcV9kZWJ1Z2ZzLmgiCisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICBsb2cgY2F0ZWdvcnkgZW50cmllcworKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBERUJVR0ZTX1dSSVRFX0JVRl9TSVpFIDI1NgorCisjZGVmaW5lIFZDSElRX0xPR19FUlJPUl9TVFIgICAiZXJyb3IiCisjZGVmaW5lIFZDSElRX0xPR19XQVJOSU5HX1NUUiAid2FybmluZyIKKyNkZWZpbmUgVkNISVFfTE9HX0lORk9fU1RSICAgICJpbmZvIgorI2RlZmluZSBWQ0hJUV9MT0dfVFJBQ0VfU1RSICAgInRyYWNlIgorCisKKy8qIFRvcC1sZXZlbCBkZWJ1ZyBpbmZvICovCitzdHJ1Y3QgdmNoaXFfZGVidWdmc19pbmZvIHsKKwkvKiBHbG9iYWwgJ3ZjaGlxJyBkZWJ1Z2ZzIGVudHJ5IHVzZWQgYnkgYWxsIGluc3RhbmNlcyAqLworCXN0cnVjdCBkZW50cnkgKnZjaGlxX2NmZ19kaXI7CisKKwkvKiBvbmUgZW50cnkgcGVyIGNsaWVudCBwcm9jZXNzICovCisJc3RydWN0IGRlbnRyeSAqY2xpZW50czsKKworCS8qIGxvZyBjYXRlZ29yaWVzICovCisJc3RydWN0IGRlbnRyeSAqbG9nX2NhdGVnb3JpZXM7Cit9OworCitzdGF0aWMgc3RydWN0IHZjaGlxX2RlYnVnZnNfaW5mbyBkZWJ1Z2ZzX2luZm87CisKKy8qIExvZyBjYXRlZ29yeSBkZWJ1Z2ZzIGVudHJpZXMgKi8KK3N0cnVjdCB2Y2hpcV9kZWJ1Z2ZzX2xvZ19lbnRyeSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKnBsZXZlbDsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXI7Cit9OworCitzdGF0aWMgc3RydWN0IHZjaGlxX2RlYnVnZnNfbG9nX2VudHJ5IHZjaGlxX2RlYnVnZnNfbG9nX2VudHJpZXNbXSA9IHsKKwl7ICJjb3JlIiwgJnZjaGlxX2NvcmVfbG9nX2xldmVsIH0sCisJeyAibXNnIiwgICZ2Y2hpcV9jb3JlX21zZ19sb2dfbGV2ZWwgfSwKKwl7ICJzeW5jIiwgJnZjaGlxX3N5bmNfbG9nX2xldmVsIH0sCisJeyAic3VzcCIsICZ2Y2hpcV9zdXNwX2xvZ19sZXZlbCB9LAorCXsgImFybSIsICAmdmNoaXFfYXJtX2xvZ19sZXZlbCB9LAorfTsKK3N0YXRpYyBpbnQgbl9sb2dfZW50cmllcyA9CisJc2l6ZW9mKHZjaGlxX2RlYnVnZnNfbG9nX2VudHJpZXMpL3NpemVvZih2Y2hpcV9kZWJ1Z2ZzX2xvZ19lbnRyaWVzWzBdKTsKKworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdmNoaXFfY2xpZW50c190b3Aodm9pZCk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdmNoaXFfZGVidWdmc190b3Aodm9pZCk7CisKK3N0YXRpYyBpbnQgZGVidWdmc19sb2dfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKm9mZnNldCkKK3sKKwlpbnQgKmxldnAgPSBmLT5wcml2YXRlOworCWNoYXIgKmxvZ192YWx1ZSA9IE5VTEw7CisKKwlzd2l0Y2ggKCpsZXZwKSB7CisJY2FzZSBWQ0hJUV9MT0dfRVJST1I6CisJCWxvZ192YWx1ZSA9IFZDSElRX0xPR19FUlJPUl9TVFI7CisJCWJyZWFrOworCWNhc2UgVkNISVFfTE9HX1dBUk5JTkc6CisJCWxvZ192YWx1ZSA9IFZDSElRX0xPR19XQVJOSU5HX1NUUjsKKwkJYnJlYWs7CisJY2FzZSBWQ0hJUV9MT0dfSU5GTzoKKwkJbG9nX3ZhbHVlID0gVkNISVFfTE9HX0lORk9fU1RSOworCQlicmVhazsKKwljYXNlIFZDSElRX0xPR19UUkFDRToKKwkJbG9nX3ZhbHVlID0gVkNISVFfTE9HX1RSQUNFX1NUUjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJc2VxX3ByaW50ZihmLCAiJXNcbiIsIGxvZ192YWx1ZSA/IGxvZ192YWx1ZSA6ICIobnVsbCkiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfbG9nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGRlYnVnZnNfbG9nX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfbG9nX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHNlcV9maWxlICpmID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgKmxldnAgPSBmLT5wcml2YXRlOworCWNoYXIga2J1ZltERUJVR0ZTX1dSSVRFX0JVRl9TSVpFICsgMV07CisKKwltZW1zZXQoa2J1ZiwgMCwgREVCVUdGU19XUklURV9CVUZfU0laRSArIDEpOworCWlmIChjb3VudCA+PSBERUJVR0ZTX1dSSVRFX0JVRl9TSVpFKQorCQljb3VudCA9IERFQlVHRlNfV1JJVEVfQlVGX1NJWkU7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmZmVyLCBjb3VudCkgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJa2J1Zltjb3VudCAtIDFdID0gMDsKKworCWlmIChzdHJuY21wKCJlcnJvciIsIGtidWYsIHN0cmxlbigiZXJyb3IiKSkgPT0gMCkKKwkJKmxldnAgPSBWQ0hJUV9MT0dfRVJST1I7CisJZWxzZSBpZiAoc3RybmNtcCgid2FybmluZyIsIGtidWYsIHN0cmxlbigid2FybmluZyIpKSA9PSAwKQorCQkqbGV2cCA9IFZDSElRX0xPR19XQVJOSU5HOworCWVsc2UgaWYgKHN0cm5jbXAoImluZm8iLCBrYnVmLCBzdHJsZW4oImluZm8iKSkgPT0gMCkKKwkJKmxldnAgPSBWQ0hJUV9MT0dfSU5GTzsKKwllbHNlIGlmIChzdHJuY21wKCJ0cmFjZSIsIGtidWYsIHN0cmxlbigidHJhY2UiKSkgPT0gMCkKKwkJKmxldnAgPSBWQ0hJUV9MT0dfVFJBQ0U7CisJZWxzZQorCQkqbGV2cCA9IFZDSElRX0xPR19ERUZBVUxUOworCisJKnBwb3MgKz0gY291bnQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfbG9nX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGRlYnVnZnNfbG9nX29wZW4sCisJLndyaXRlCQk9IGRlYnVnZnNfbG9nX3dyaXRlLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCisvKiBjcmVhdGUgYW4gZW50cnkgdW5kZXIgPGRlYnVnZnM+L3ZjaGlxL2xvZyBmb3IgZWFjaCBsb2cgY2F0ZWdvcnkgKi8KK3N0YXRpYyBpbnQgdmNoaXFfZGVidWdmc19jcmVhdGVfbG9nX2VudHJpZXMoc3RydWN0IGRlbnRyeSAqdG9wKQoreworCXN0cnVjdCBkZW50cnkgKmRpcjsKKwlzaXplX3QgaTsKKwlpbnQgcmV0ID0gMDsKKwlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImxvZyIsIHZjaGlxX2RlYnVnZnNfdG9wKCkpOworCWlmICghZGlyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkZWJ1Z2ZzX2luZm8ubG9nX2NhdGVnb3JpZXMgPSBkaXI7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9sb2dfZW50cmllczsgaSsrKSB7CisJCXZvaWQgKmxldnAgPSAodm9pZCAqKXZjaGlxX2RlYnVnZnNfbG9nX2VudHJpZXNbaV0ucGxldmVsOworCQlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKHZjaGlxX2RlYnVnZnNfbG9nX2VudHJpZXNbaV0ubmFtZSwKKwkJCQkJICAwNjQ0LAorCQkJCQkgIGRlYnVnZnNfaW5mby5sb2dfY2F0ZWdvcmllcywKKwkJCQkJICBsZXZwLAorCQkJCQkgICZkZWJ1Z2ZzX2xvZ19mb3BzKTsKKwkJaWYgKCFkaXIpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCisJCXZjaGlxX2RlYnVnZnNfbG9nX2VudHJpZXNbaV0uZGlyID0gZGlyOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfdXNlY291bnRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKm9mZnNldCkKK3sKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlID0gZi0+cHJpdmF0ZTsKKwlpbnQgdXNlX2NvdW50OworCisJdXNlX2NvdW50ID0gdmNoaXFfaW5zdGFuY2VfZ2V0X3VzZV9jb3VudChpbnN0YW5jZSk7CisJc2VxX3ByaW50ZihmLCAiJWRcbiIsIHVzZV9jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWJ1Z2ZzX3VzZWNvdW50X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGRlYnVnZnNfdXNlY291bnRfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfdXNlY291bnRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gZGVidWdmc191c2Vjb3VudF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IGRlYnVnZnNfdHJhY2Vfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKm9mZnNldCkKK3sKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlID0gZi0+cHJpdmF0ZTsKKwlpbnQgdHJhY2U7CisKKwl0cmFjZSA9IHZjaGlxX2luc3RhbmNlX2dldF90cmFjZShpbnN0YW5jZSk7CisJc2VxX3ByaW50ZihmLCAiJXNcbiIsIHRyYWNlID8gIlkiIDogIk4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfdHJhY2Vfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGVidWdmc190cmFjZV9zaG93LCBpbm9kZS0+aV9wcml2YXRlKTsKK30KKworc3RhdGljIGludCBkZWJ1Z2ZzX3RyYWNlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCWNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHNlcV9maWxlICpmID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlID0gZi0+cHJpdmF0ZTsKKwljaGFyIGZpcnN0Y2hhcjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZmlyc3RjaGFyLCBidWZmZXIsIDEpICE9IDApCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChmaXJzdGNoYXIpIHsKKwljYXNlICdZJzoKKwljYXNlICd5JzoKKwljYXNlICcxJzoKKwkJdmNoaXFfaW5zdGFuY2Vfc2V0X3RyYWNlKGluc3RhbmNlLCAxKTsKKwkJYnJlYWs7CisJY2FzZSAnTic6CisJY2FzZSAnbic6CisJY2FzZSAnMCc6CisJCXZjaGlxX2luc3RhbmNlX3NldF90cmFjZShpbnN0YW5jZSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCSpwcG9zICs9IGNvdW50OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX3RyYWNlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGRlYnVnZnNfdHJhY2Vfb3BlbiwKKwkud3JpdGUJCT0gZGVidWdmc190cmFjZV93cml0ZSwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworLyogYWRkIGFuIGluc3RhbmNlIChwcm9jZXNzKSB0byB0aGUgZGVidWdmcyBlbnRyaWVzICovCitpbnQgdmNoaXFfZGVidWdmc19hZGRfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwljaGFyIHBpZHN0clsxNl07CisJc3RydWN0IGRlbnRyeSAqdG9wLCAqdXNlX2NvdW50LCAqdHJhY2U7CisJc3RydWN0IGRlbnRyeSAqY2xpZW50cyA9IHZjaGlxX2NsaWVudHNfdG9wKCk7CisKKwlzbnByaW50ZihwaWRzdHIsIHNpemVvZihwaWRzdHIpLCAiJWQiLAorCQkgdmNoaXFfaW5zdGFuY2VfZ2V0X3BpZChpbnN0YW5jZSkpOworCisJdG9wID0gZGVidWdmc19jcmVhdGVfZGlyKHBpZHN0ciwgY2xpZW50cyk7CisJaWYgKCF0b3ApCisJCWdvdG8gZmFpbF90b3A7CisKKwl1c2VfY291bnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ1c2VfY291bnQiLAorCQkJCQkwNDQ0LCB0b3AsCisJCQkJCWluc3RhbmNlLAorCQkJCQkmZGVidWdmc191c2Vjb3VudF9mb3BzKTsKKwlpZiAoIXVzZV9jb3VudCkKKwkJZ290byBmYWlsX3VzZV9jb3VudDsKKworCXRyYWNlID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHJhY2UiLAorCQkJCSAgICAwNjQ0LCB0b3AsCisJCQkJICAgIGluc3RhbmNlLAorCQkJCSAgICAmZGVidWdmc190cmFjZV9mb3BzKTsKKwlpZiAoIXRyYWNlKQorCQlnb3RvIGZhaWxfdHJhY2U7CisKKwl2Y2hpcV9pbnN0YW5jZV9nZXRfZGVidWdmc19ub2RlKGluc3RhbmNlKS0+ZGVudHJ5ID0gdG9wOworCisJcmV0dXJuIDA7CisKK2ZhaWxfdHJhY2U6CisJZGVidWdmc19yZW1vdmUodXNlX2NvdW50KTsKK2ZhaWxfdXNlX2NvdW50OgorCWRlYnVnZnNfcmVtb3ZlKHRvcCk7CitmYWlsX3RvcDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKwordm9pZCB2Y2hpcV9kZWJ1Z2ZzX3JlbW92ZV9pbnN0YW5jZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworCVZDSElRX0RFQlVHRlNfTk9ERV9UICpub2RlID0gdmNoaXFfaW5zdGFuY2VfZ2V0X2RlYnVnZnNfbm9kZShpbnN0YW5jZSk7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKG5vZGUtPmRlbnRyeSk7Cit9CisKKworaW50IHZjaGlxX2RlYnVnZnNfaW5pdCh2b2lkKQoreworCUJVR19PTihkZWJ1Z2ZzX2luZm8udmNoaXFfY2ZnX2RpciAhPSBOVUxMKTsKKworCWRlYnVnZnNfaW5mby52Y2hpcV9jZmdfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ2Y2hpcSIsIE5VTEwpOworCWlmIChkZWJ1Z2ZzX2luZm8udmNoaXFfY2ZnX2RpciA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlkZWJ1Z2ZzX2luZm8uY2xpZW50cyA9IGRlYnVnZnNfY3JlYXRlX2RpcigiY2xpZW50cyIsCisJCQkJdmNoaXFfZGVidWdmc190b3AoKSk7CisJaWYgKCFkZWJ1Z2ZzX2luZm8uY2xpZW50cykKKwkJZ290byBmYWlsOworCisJaWYgKHZjaGlxX2RlYnVnZnNfY3JlYXRlX2xvZ19lbnRyaWVzKHZjaGlxX2RlYnVnZnNfdG9wKCkpICE9IDApCisJCWdvdG8gZmFpbDsKKworCXJldHVybiAwOworCitmYWlsOgorCXZjaGlxX2RlYnVnZnNfZGVpbml0KCk7CisJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCSIlczogZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeSIsCisJCV9fZnVuY19fKTsKKworCXJldHVybiAtRU5PTUVNOworfQorCisvKiByZW1vdmUgYWxsIHRoZSBkZWJ1Z2ZzIGVudHJpZXMgKi8KK3ZvaWQgdmNoaXFfZGVidWdmc19kZWluaXQodm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUodmNoaXFfZGVidWdmc190b3AoKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp2Y2hpcV9jbGllbnRzX3RvcCh2b2lkKQoreworCXJldHVybiBkZWJ1Z2ZzX2luZm8uY2xpZW50czsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnZjaGlxX2RlYnVnZnNfdG9wKHZvaWQpCit7CisJQlVHX09OKGRlYnVnZnNfaW5mby52Y2hpcV9jZmdfZGlyID09IE5VTEwpOworCXJldHVybiBkZWJ1Z2ZzX2luZm8udmNoaXFfY2ZnX2RpcjsKK30KKworI2Vsc2UgLyogQ09ORklHX0RFQlVHX0ZTICovCisKK2ludCB2Y2hpcV9kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2Y2hpcV9kZWJ1Z2ZzX2RlaW5pdCh2b2lkKQoreworfQorCitpbnQgdmNoaXFfZGVidWdmc19hZGRfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCB2Y2hpcV9kZWJ1Z2ZzX3JlbW92ZV9pbnN0YW5jZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworfQorCisjZW5kaWYgLyogQ09ORklHX0RFQlVHX0ZTICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2RlYnVnZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfZGVidWdmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNmEzNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2RlYnVnZnMuaApAQCAtMCwwICsxLDUyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNCBSYXNwYmVycnkgUGkgKFRyYWRpbmcpIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV9ERUJVR0ZTX0gKKyNkZWZpbmUgVkNISVFfREVCVUdGU19ICisKKyNpbmNsdWRlICJ2Y2hpcV9jb3JlLmgiCisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX2RlYnVnZnNfbm9kZV9zdHJ1Y3QKK3sKKyAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7Cit9IFZDSElRX0RFQlVHRlNfTk9ERV9UOworCitpbnQgdmNoaXFfZGVidWdmc19pbml0KHZvaWQpOworCit2b2lkIHZjaGlxX2RlYnVnZnNfZGVpbml0KHZvaWQpOworCitpbnQgdmNoaXFfZGVidWdmc19hZGRfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSk7CisKK3ZvaWQgdmNoaXFfZGVidWdmc19yZW1vdmVfaW5zdGFuY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSk7CisKKyNlbmRpZiAvKiBWQ0hJUV9ERUJVR0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfZ2VudmVyc2lvbiBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfZ2VudmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjViNjM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9nZW52ZXJzaW9uCkBAIC0wLDAgKzEsODcgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCit1c2Ugc3RyaWN0OworCisjCisjIEdlbmVyYXRlIGEgdmVyc2lvbiBmcm9tIGF2YWlsYWJsZSBpbmZvcm1hdGlvbgorIworCitteSAkcHJlZml4ID0gc2hpZnQgQEFSR1Y7CitteSAkcm9vdCA9IHNoaWZ0IEBBUkdWOworCisKK2lmICggbm90IGRlZmluZWQgJHJvb3QgKSB7CisJZGllICJ1c2FnZTogJDAgcHJlZml4IHJvb3QtZGlyXG4iOworfQorCitpZiAoICEgLWQgJHJvb3QgKSB7CisJZGllICJyb290IGRpcmVjdG9yeSAkcm9vdCBub3QgZm91bmRcbiI7Cit9CisKK215ICR2ZXJzaW9uID0gInVua25vd24iOworbXkgJHRhaW50ZWQgPSAiIjsKKworaWYgKCAtZCAiJHJvb3QvLmdpdCIgKSB7CisJIyBhdHRlbXB0IHRvIHdvcmsgb3V0IGdpdCB2ZXJzaW9uLiBvbmx5IGRvIHNvCisJIyBvbiBhIGxpbnV4IGJ1aWxkIGhvc3QsIGFzIGN5Z3dpbiBidWlsZHMgYXJlCisJIyBhbHJlYWR5IHNsb3cgZW5vdWdoCisKKwlpZiAoIC1mICIvdXNyL2Jpbi9naXQiIHx8IC1mICIvdXNyL2xvY2FsL2Jpbi9naXQiICkgeworCQlpZiAobm90IG9wZW4oRiwgImdpdCAtLWdpdC1kaXIgJHJvb3QvLmdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRHwiKSkgeworCQkJJHZlcnNpb24gPSAibm8gZ2l0IHZlcnNpb24iOworCQl9CisJCWVsc2UgeworCQkJJHZlcnNpb24gPSA8Rj47CisJCQkkdmVyc2lvbiA9fiBzL1sgXHJcbl0qJC8vOyAgICAgIyBjaG9tcCBtYXkgbm90IGJlIGVub3VnaCAoY3lnd2luKS4KKwkJCSR2ZXJzaW9uID1+IHMvXlsgXHJcbl0qLy87ICAgICAjIGNob21wIG1heSBub3QgYmUgZW5vdWdoIChjeWd3aW4pLgorCQl9CisKKwkJaWYgKG9wZW4oRywgImdpdCAtLWdpdC1kaXIgJHJvb3QvLmdpdCBzdGF0dXMgLS1wb3JjZWxhaW58IikpIHsKKwkJCSR0YWludGVkID0gPEc+OworCQkJJHRhaW50ZWQgPX4gcy9bIFxyXG5dKiQvLzsgICAgICMgY2hvbXAgbWF5IG5vdCBiZSBlbm91Z2ggKGN5Z3dpbikuCisJCQkkdGFpbnRlZCA9fiBzL15bIFxyXG5dKi8vOyAgICAgIyBjaG9tcCBtYXkgbm90IGJlIGVub3VnaCAoY3lnd2luKS4KKwkJCWlmIChsZW5ndGggJHRhaW50ZWQpIHsKKwkJCSR2ZXJzaW9uID0gam9pbiAnICcsICR2ZXJzaW9uLCAiKHRhaW50ZWQpIjsKKwkJfQorCQllbHNlIHsKKwkJCSR2ZXJzaW9uID0gam9pbiAnICcsICR2ZXJzaW9uLCAiKGNsZWFuKSI7CisgICAgICAgICB9CisJCX0KKwl9Cit9CisKK215ICRob3N0bmFtZSA9IGBob3N0bmFtZWA7CiskaG9zdG5hbWUgPX4gcy9bIFxyXG5dKiQvLzsgICAgICMgY2hvbXAgbWF5IG5vdCBiZSBlbm91Z2ggKGN5Z3dpbikuCiskaG9zdG5hbWUgPX4gcy9eWyBcclxuXSovLzsgICAgICMgY2hvbXAgbWF5IG5vdCBiZSBlbm91Z2ggKGN5Z3dpbikuCisKKworcHJpbnQgU1RERVJSICJWZXJzaW9uICR2ZXJzaW9uXG4iOworcHJpbnQgPDxFT0Y7CisjaW5jbHVkZSAiJHtwcmVmaXh9X2J1aWxkX2luZm8uaCIKKyNpbmNsdWRlIDxsaW51eC9icm9hZGNvbS92Y19kZWJ1Z19zeW0uaD4KKworVkNfREVCVUdfREVDTEFSRV9TVFJJTkdfVkFSKCAke3ByZWZpeH1fYnVpbGRfaG9zdG5hbWUsICIkaG9zdG5hbWUiICk7CitWQ19ERUJVR19ERUNMQVJFX1NUUklOR19WQVIoICR7cHJlZml4fV9idWlsZF92ZXJzaW9uLCAiJHZlcnNpb24iICk7CitWQ19ERUJVR19ERUNMQVJFX1NUUklOR19WQVIoICR7cHJlZml4fV9idWlsZF90aW1lLCAgICBfX1RJTUVfXyApOworVkNfREVCVUdfREVDTEFSRV9TVFJJTkdfVkFSKCAke3ByZWZpeH1fYnVpbGRfZGF0ZSwgICAgX19EQVRFX18gKTsKKworY29uc3QgY2hhciAqdmNoaXFfZ2V0X2J1aWxkX2hvc3RuYW1lKCB2b2lkICkKK3sKKyAgIHJldHVybiB2Y2hpcV9idWlsZF9ob3N0bmFtZTsKK30KKworY29uc3QgY2hhciAqdmNoaXFfZ2V0X2J1aWxkX3ZlcnNpb24oIHZvaWQgKQoreworICAgcmV0dXJuIHZjaGlxX2J1aWxkX3ZlcnNpb247Cit9CisKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF9kYXRlKCB2b2lkICkKK3sKKyAgIHJldHVybiB2Y2hpcV9idWlsZF9kYXRlOworfQorCitjb25zdCBjaGFyICp2Y2hpcV9nZXRfYnVpbGRfdGltZSggdm9pZCApCit7CisgICByZXR1cm4gdmNoaXFfYnVpbGRfdGltZTsKK30KK0VPRgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9pZi5oIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjdiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2lmLmgKQEAgLTAsMCArMSwxODkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfSUZfSAorI2RlZmluZSBWQ0hJUV9JRl9ICisKKyNpbmNsdWRlICJpbnRlcmZhY2UvdmNoaS92Y2hpX21oLmgiCisKKyNkZWZpbmUgVkNISVFfU0VSVklDRV9IQU5ETEVfSU5WQUxJRCAwCisKKyNkZWZpbmUgVkNISVFfU0xPVF9TSVpFICAgICA0MDk2CisjZGVmaW5lIFZDSElRX01BWF9NU0dfU0laRSAgKFZDSElRX1NMT1RfU0laRSAtIHNpemVvZihWQ0hJUV9IRUFERVJfVCkpCisjZGVmaW5lIFZDSElRX0NIQU5ORUxfU0laRSAgVkNISVFfTUFYX01TR19TSVpFIC8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworCisjZGVmaW5lIFZDSElRX01BS0VfRk9VUkNDKHgwLCB4MSwgeDIsIHgzKSBcCisJCQkoKCh4MCkgPDwgMjQpIHwgKCh4MSkgPDwgMTYpIHwgKCh4MikgPDwgOCkgfCAoeDMpKQorI2RlZmluZSBWQ0hJUV9HRVRfU0VSVklDRV9VU0VSREFUQShzZXJ2aWNlKSB2Y2hpcV9nZXRfc2VydmljZV91c2VyZGF0YShzZXJ2aWNlKQorI2RlZmluZSBWQ0hJUV9HRVRfU0VSVklDRV9GT1VSQ0Moc2VydmljZSkgICB2Y2hpcV9nZXRfc2VydmljZV9mb3VyY2Moc2VydmljZSkKKwordHlwZWRlZiBlbnVtIHsKKwlWQ0hJUV9TRVJWSUNFX09QRU5FRCwgICAgICAgICAvKiBzZXJ2aWNlLCAtLCAtICAgICAgICAgICAgICovCisJVkNISVFfU0VSVklDRV9DTE9TRUQsICAgICAgICAgLyogc2VydmljZSwgLSwgLSAgICAgICAgICAgICAqLworCVZDSElRX01FU1NBR0VfQVZBSUxBQkxFLCAgICAgIC8qIHNlcnZpY2UsIGhlYWRlciwgLSAgICAgICAgKi8KKwlWQ0hJUV9CVUxLX1RSQU5TTUlUX0RPTkUsICAgICAvKiBzZXJ2aWNlLCAtLCBidWxrX3VzZXJkYXRhICovCisJVkNISVFfQlVMS19SRUNFSVZFX0RPTkUsICAgICAgLyogc2VydmljZSwgLSwgYnVsa191c2VyZGF0YSAqLworCVZDSElRX0JVTEtfVFJBTlNNSVRfQUJPUlRFRCwgIC8qIHNlcnZpY2UsIC0sIGJ1bGtfdXNlcmRhdGEgKi8KKwlWQ0hJUV9CVUxLX1JFQ0VJVkVfQUJPUlRFRCAgICAvKiBzZXJ2aWNlLCAtLCBidWxrX3VzZXJkYXRhICovCit9IFZDSElRX1JFQVNPTl9UOworCit0eXBlZGVmIGVudW0geworCVZDSElRX0VSUk9SICAgPSAtMSwKKwlWQ0hJUV9TVUNDRVNTID0gMCwKKwlWQ0hJUV9SRVRSWSAgID0gMQorfSBWQ0hJUV9TVEFUVVNfVDsKKwordHlwZWRlZiBlbnVtIHsKKwlWQ0hJUV9CVUxLX01PREVfQ0FMTEJBQ0ssCisJVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HLAorCVZDSElRX0JVTEtfTU9ERV9OT0NBTExCQUNLLAorCVZDSElRX0JVTEtfTU9ERV9XQUlUSU5HCQkvKiBSZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlICovCit9IFZDSElRX0JVTEtfTU9ERV9UOworCit0eXBlZGVmIGVudW0geworCVZDSElRX1NFUlZJQ0VfT1BUSU9OX0FVVE9DTE9TRSwKKwlWQ0hJUV9TRVJWSUNFX09QVElPTl9TTE9UX1FVT1RBLAorCVZDSElRX1NFUlZJQ0VfT1BUSU9OX01FU1NBR0VfUVVPVEEsCisJVkNISVFfU0VSVklDRV9PUFRJT05fU1lOQ0hST05PVVMsCisJVkNISVFfU0VSVklDRV9PUFRJT05fVFJBQ0UKK30gVkNISVFfU0VSVklDRV9PUFRJT05fVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfaGVhZGVyX3N0cnVjdCB7CisJLyogVGhlIG1lc3NhZ2UgaWRlbnRpZmllciAtIG9wYXF1ZSB0byBhcHBsaWNhdGlvbnMuICovCisJaW50IG1zZ2lkOworCisJLyogU2l6ZSBvZiBtZXNzYWdlIGRhdGEuICovCisJdW5zaWduZWQgaW50IHNpemU7CisKKwljaGFyIGRhdGFbMF07ICAgICAgICAgICAvKiBtZXNzYWdlICovCit9IFZDSElRX0hFQURFUl9UOworCit0eXBlZGVmIHN0cnVjdCB7CisJY29uc3Qgdm9pZCAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKK30gVkNISVFfRUxFTUVOVF9UOworCit0eXBlZGVmIHVuc2lnbmVkIGludCBWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UOworCit0eXBlZGVmIFZDSElRX1NUQVRVU19UICgqVkNISVFfQ0FMTEJBQ0tfVCkoVkNISVFfUkVBU09OX1QsIFZDSElRX0hFQURFUl9UICosCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCwgdm9pZCAqKTsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfc2VydmljZV9iYXNlX3N0cnVjdCB7CisJaW50IGZvdXJjYzsKKwlWQ0hJUV9DQUxMQkFDS19UIGNhbGxiYWNrOworCXZvaWQgKnVzZXJkYXRhOworfSBWQ0hJUV9TRVJWSUNFX0JBU0VfVDsKKwordHlwZWRlZiBzdHJ1Y3QgdmNoaXFfc2VydmljZV9wYXJhbXNfc3RydWN0IHsKKwlpbnQgZm91cmNjOworCVZDSElRX0NBTExCQUNLX1QgY2FsbGJhY2s7CisJdm9pZCAqdXNlcmRhdGE7CisJc2hvcnQgdmVyc2lvbjsgICAgICAgLyogSW5jcmVtZW50IGZvciBub24tdHJpdmlhbCBjaGFuZ2VzICovCisJc2hvcnQgdmVyc2lvbl9taW47ICAgLyogVXBkYXRlIGZvciBpbmNvbXBhdGlibGUgY2hhbmdlcyAqLworfSBWQ0hJUV9TRVJWSUNFX1BBUkFNU19UOworCit0eXBlZGVmIHN0cnVjdCB2Y2hpcV9jb25maWdfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgbWF4X21zZ19zaXplOworCXVuc2lnbmVkIGludCBidWxrX3RocmVzaG9sZDsgLyogVGhlIG1lc3NhZ2Ugc2l6ZSBhYm92ZSB3aGljaCBpdAorCQkJCQlpcyBiZXR0ZXIgdG8gdXNlIGEgYnVsayB0cmFuc2ZlcgorCQkJCQkoPD0gbWF4X21zZ19zaXplKSAqLworCXVuc2lnbmVkIGludCBtYXhfb3V0c3RhbmRpbmdfYnVsa3M7CisJdW5zaWduZWQgaW50IG1heF9zZXJ2aWNlczsKKwlzaG9ydCB2ZXJzaW9uOyAgICAgIC8qIFRoZSB2ZXJzaW9uIG9mIFZDSElRICovCisJc2hvcnQgdmVyc2lvbl9taW47ICAvKiBUaGUgbWluaW11bSBjb21wYXRpYmxlIHZlcnNpb24gb2YgVkNISVEgKi8KK30gVkNISVFfQ09ORklHX1Q7CisKK3R5cGVkZWYgc3RydWN0IHZjaGlxX2luc3RhbmNlX3N0cnVjdCAqVkNISVFfSU5TVEFOQ0VfVDsKK3R5cGVkZWYgdm9pZCAoKlZDSElRX1JFTU9URV9VU0VfQ0FMTEJBQ0tfVCkodm9pZCAqY2JfYXJnKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2luaXRpYWxpc2UoVkNISVFfSU5TVEFOQ0VfVCAqcGluc3RhbmNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9zaHV0ZG93bihWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9jb25uZWN0KFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2FkZF9zZXJ2aWNlKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsCisJY29uc3QgVkNISVFfU0VSVklDRV9QQVJBTVNfVCAqcGFyYW1zLAorCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgKnBzZXJ2aWNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9vcGVuX3NlcnZpY2UoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwljb25zdCBWQ0hJUV9TRVJWSUNFX1BBUkFNU19UICpwYXJhbXMsCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCAqcHNlcnZpY2UpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2Nsb3NlX3NlcnZpY2UoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9yZW1vdmVfc2VydmljZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX3VzZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfdXNlX3NlcnZpY2Vfbm9fcmVzdW1lKAorCVZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcmVsZWFzZV9zZXJ2aWNlKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9xdWV1ZV9tZXNzYWdlKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKwljb25zdCBWQ0hJUV9FTEVNRU5UX1QgKmVsZW1lbnRzLCB1bnNpZ25lZCBpbnQgY291bnQpOworZXh0ZXJuIHZvaWQgICAgICAgICAgIHZjaGlxX3JlbGVhc2VfbWVzc2FnZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UsCisJVkNISVFfSEVBREVSX1QgKmhlYWRlcik7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcXVldWVfYnVsa190cmFuc21pdChWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UsCisJY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKnVzZXJkYXRhKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9xdWV1ZV9idWxrX3JlY2VpdmUoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCXZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSk7CitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcXVldWVfYnVsa190cmFuc21pdF9oYW5kbGUoCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLCBWQ0hJX01FTV9IQU5ETEVfVCBoYW5kbGUsCisJY29uc3Qgdm9pZCAqb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX3F1ZXVlX2J1bGtfcmVjZWl2ZV9oYW5kbGUoCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLCBWQ0hJX01FTV9IQU5ETEVfVCBoYW5kbGUsCisJdm9pZCAqb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2J1bGtfdHJhbnNtaXQoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCWNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSwKKwlWQ0hJUV9CVUxLX01PREVfVCBtb2RlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9idWxrX3JlY2VpdmUoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCXZvaWQgKmRhdGEsIHVuc2lnbmVkIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSwKKwlWQ0hJUV9CVUxLX01PREVfVCBtb2RlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9idWxrX3RyYW5zbWl0X2hhbmRsZShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UsCisJVkNISV9NRU1fSEFORExFX1QgaGFuZGxlLCBjb25zdCB2b2lkICpvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplLAorCXZvaWQgKnVzZXJkYXRhLAlWQ0hJUV9CVUxLX01PREVfVCBtb2RlKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9idWxrX3JlY2VpdmVfaGFuZGxlKFZDSElRX1NFUlZJQ0VfSEFORExFX1Qgc2VydmljZSwKKwlWQ0hJX01FTV9IQU5ETEVfVCBoYW5kbGUsIHZvaWQgKm9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsCisJdm9pZCAqdXNlcmRhdGEsIFZDSElRX0JVTEtfTU9ERV9UIG1vZGUpOworZXh0ZXJuIGludCAgIHZjaGlxX2dldF9jbGllbnRfaWQoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlKTsKK2V4dGVybiB2b2lkICp2Y2hpcV9nZXRfc2VydmljZV91c2VyZGF0YShWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UpOworZXh0ZXJuIGludCAgIHZjaGlxX2dldF9zZXJ2aWNlX2ZvdXJjYyhWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIHNlcnZpY2UpOworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2dldF9jb25maWcoVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSwKKwlpbnQgY29uZmlnX3NpemUsIFZDSElRX0NPTkZJR19UICpwY29uZmlnKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9zZXRfc2VydmljZV9vcHRpb24oVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCVZDSElRX1NFUlZJQ0VfT1BUSU9OX1Qgb3B0aW9uLCBpbnQgdmFsdWUpOworCitleHRlcm4gVkNISVFfU1RBVFVTX1QgdmNoaXFfcmVtb3RlX3VzZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlLAorCVZDSElRX1JFTU9URV9VU0VfQ0FMTEJBQ0tfVCBjYWxsYmFjaywgdm9pZCAqY2JfYXJnKTsKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9yZW1vdGVfcmVsZWFzZShWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKTsKKworZXh0ZXJuIFZDSElRX1NUQVRVU19UIHZjaGlxX2R1bXBfcGh5c19tZW0oVkNISVFfU0VSVklDRV9IQU5ETEVfVCBzZXJ2aWNlLAorCXZvaWQgKnB0ciwgc2l6ZV90IG51bV9ieXRlcyk7CisKK2V4dGVybiBWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9nZXRfcGVlcl92ZXJzaW9uKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICAgICAgc2hvcnQgKnBlZXJfdmVyc2lvbik7CisKKyNlbmRpZiAvKiBWQ0hJUV9JRl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2lvY3RsLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzN2FlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfaW9jdGwuaApAQCAtMCwwICsxLDEzMSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV9JT0NUTFNfSAorI2RlZmluZSBWQ0hJUV9JT0NUTFNfSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlICJ2Y2hpcV9pZi5oIgorCisjZGVmaW5lIFZDSElRX0lPQ19NQUdJQyAweGM0CisjZGVmaW5lIFZDSElRX0lOVkFMSURfSEFORExFICh+MCkKKwordHlwZWRlZiBzdHJ1Y3QgeworCVZDSElRX1NFUlZJQ0VfUEFSQU1TX1QgcGFyYW1zOworCWludCBpc19vcGVuOworCWludCBpc192Y2hpOworCXVuc2lnbmVkIGludCBoYW5kbGU7ICAgICAgIC8qIE9VVCAqLworfSBWQ0hJUV9DUkVBVEVfU0VSVklDRV9UOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGhhbmRsZTsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJY29uc3QgVkNISVFfRUxFTUVOVF9UICplbGVtZW50czsKK30gVkNISVFfUVVFVUVfTUVTU0FHRV9UOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGhhbmRsZTsKKwl2b2lkICpkYXRhOworCXVuc2lnbmVkIGludCBzaXplOworCXZvaWQgKnVzZXJkYXRhOworCVZDSElRX0JVTEtfTU9ERV9UIG1vZGU7Cit9IFZDSElRX1FVRVVFX0JVTEtfVFJBTlNGRVJfVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVZDSElRX1JFQVNPTl9UIHJlYXNvbjsKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyOworCXZvaWQgKnNlcnZpY2VfdXNlcmRhdGE7CisJdm9pZCAqYnVsa191c2VyZGF0YTsKK30gVkNISVFfQ09NUExFVElPTl9EQVRBX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJVkNISVFfQ09NUExFVElPTl9EQVRBX1QgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgbXNnYnVmc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbXNnYnVmY291bnQ7IC8qIElOL09VVCAqLworCXZvaWQgKiptc2didWZzOworfSBWQ0hJUV9BV0FJVF9DT01QTEVUSU9OX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlOworCWludCBibG9ja2luZzsKKwl1bnNpZ25lZCBpbnQgYnVmc2l6ZTsKKwl2b2lkICpidWY7Cit9IFZDSElRX0RFUVVFVUVfTUVTU0FHRV9UOworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50IGNvbmZpZ19zaXplOworCVZDSElRX0NPTkZJR19UICpwY29uZmlnOworfSBWQ0hJUV9HRVRfQ09ORklHX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgaGFuZGxlOworCVZDSElRX1NFUlZJQ0VfT1BUSU9OX1Qgb3B0aW9uOworCWludCB2YWx1ZTsKK30gVkNISVFfU0VUX1NFUlZJQ0VfT1BUSU9OX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl2b2lkICAgICAqdmlydF9hZGRyOworCXNpemVfdCAgICBudW1fYnl0ZXM7Cit9IFZDSElRX0RVTVBfTUVNX1Q7CisKKyNkZWZpbmUgVkNISVFfSU9DX0NPTk5FQ1QgICAgICAgICAgICAgIF9JTyhWQ0hJUV9JT0NfTUFHSUMsICAgMCkKKyNkZWZpbmUgVkNISVFfSU9DX1NIVVRET1dOICAgICAgICAgICAgIF9JTyhWQ0hJUV9JT0NfTUFHSUMsICAgMSkKKyNkZWZpbmUgVkNISVFfSU9DX0NSRUFURV9TRVJWSUNFIFwKKwlfSU9XUihWQ0hJUV9JT0NfTUFHSUMsIDIsIFZDSElRX0NSRUFURV9TRVJWSUNFX1QpCisjZGVmaW5lIFZDSElRX0lPQ19SRU1PVkVfU0VSVklDRSAgICAgICBfSU8oVkNISVFfSU9DX01BR0lDLCAgIDMpCisjZGVmaW5lIFZDSElRX0lPQ19RVUVVRV9NRVNTQUdFIFwKKwlfSU9XKFZDSElRX0lPQ19NQUdJQywgIDQsIFZDSElRX1FVRVVFX01FU1NBR0VfVCkKKyNkZWZpbmUgVkNISVFfSU9DX1FVRVVFX0JVTEtfVFJBTlNNSVQgXAorCV9JT1dSKFZDSElRX0lPQ19NQUdJQywgNSwgVkNISVFfUVVFVUVfQlVMS19UUkFOU0ZFUl9UKQorI2RlZmluZSBWQ0hJUV9JT0NfUVVFVUVfQlVMS19SRUNFSVZFIFwKKwlfSU9XUihWQ0hJUV9JT0NfTUFHSUMsIDYsIFZDSElRX1FVRVVFX0JVTEtfVFJBTlNGRVJfVCkKKyNkZWZpbmUgVkNISVFfSU9DX0FXQUlUX0NPTVBMRVRJT04gXAorCV9JT1dSKFZDSElRX0lPQ19NQUdJQywgNywgVkNISVFfQVdBSVRfQ09NUExFVElPTl9UKQorI2RlZmluZSBWQ0hJUV9JT0NfREVRVUVVRV9NRVNTQUdFIFwKKwlfSU9XUihWQ0hJUV9JT0NfTUFHSUMsIDgsIFZDSElRX0RFUVVFVUVfTUVTU0FHRV9UKQorI2RlZmluZSBWQ0hJUV9JT0NfR0VUX0NMSUVOVF9JRCAgICAgICAgX0lPKFZDSElRX0lPQ19NQUdJQywgICA5KQorI2RlZmluZSBWQ0hJUV9JT0NfR0VUX0NPTkZJRyBcCisJX0lPV1IoVkNISVFfSU9DX01BR0lDLCAxMCwgVkNISVFfR0VUX0NPTkZJR19UKQorI2RlZmluZSBWQ0hJUV9JT0NfQ0xPU0VfU0VSVklDRSAgICAgICAgX0lPKFZDSElRX0lPQ19NQUdJQywgICAxMSkKKyNkZWZpbmUgVkNISVFfSU9DX1VTRV9TRVJWSUNFICAgICAgICAgIF9JTyhWQ0hJUV9JT0NfTUFHSUMsICAgMTIpCisjZGVmaW5lIFZDSElRX0lPQ19SRUxFQVNFX1NFUlZJQ0UgICAgICBfSU8oVkNISVFfSU9DX01BR0lDLCAgIDEzKQorI2RlZmluZSBWQ0hJUV9JT0NfU0VUX1NFUlZJQ0VfT1BUSU9OIFwKKwlfSU9XKFZDSElRX0lPQ19NQUdJQywgIDE0LCBWQ0hJUV9TRVRfU0VSVklDRV9PUFRJT05fVCkKKyNkZWZpbmUgVkNISVFfSU9DX0RVTVBfUEhZU19NRU0gXAorCV9JT1coVkNISVFfSU9DX01BR0lDLCAgMTUsIFZDSElRX0RVTVBfTUVNX1QpCisjZGVmaW5lIFZDSElRX0lPQ19MSUJfVkVSU0lPTiAgICAgICAgICBfSU8oVkNISVFfSU9DX01BR0lDLCAgIDE2KQorI2RlZmluZSBWQ0hJUV9JT0NfQ0xPU0VfREVMSVZFUkVEICAgICAgX0lPKFZDSElRX0lPQ19NQUdJQywgICAxNykKKyNkZWZpbmUgVkNISVFfSU9DX01BWCAgICAgICAgICAgICAgICAgIDE3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9rZXJuX2xpYi5jIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9rZXJuX2xpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZTcwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2tlcm5fbGliLmMKQEAgLTAsMCArMSw0NTggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qIC0tLS0gSW5jbHVkZSBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCisjaW5jbHVkZSAidmNoaXFfY29yZS5oIgorI2luY2x1ZGUgInZjaGlxX2FybS5oIgorI2luY2x1ZGUgInZjaGlxX2tpbGxhYmxlLmgiCisKKy8qIC0tLS0gUHVibGljIFZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0gUHJpdmF0ZSBDb25zdGFudHMgYW5kIFR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBidWxrX3dhaXRlcl9ub2RlIHsKKwlzdHJ1Y3QgYnVsa193YWl0ZXIgYnVsa193YWl0ZXI7CisJaW50IHBpZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgdmNoaXFfaW5zdGFuY2Vfc3RydWN0IHsKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZTsKKworCWludCBjb25uZWN0ZWQ7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1bGtfd2FpdGVyX2xpc3Q7CisJc3RydWN0IG11dGV4IGJ1bGtfd2FpdGVyX2xpc3RfbXV0ZXg7Cit9OworCitzdGF0aWMgVkNISVFfU1RBVFVTX1QKK3ZjaGlxX2Jsb2NraW5nX2J1bGtfdHJhbnNmZXIoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIHZvaWQgKmRhdGEsCisJdW5zaWduZWQgaW50IHNpemUsIFZDSElRX0JVTEtfRElSX1QgZGlyKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9pbml0aWFsaXNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFZDSElRX0lOSVRfUkVUUklFUyAxMAorVkNISVFfU1RBVFVTX1QgdmNoaXFfaW5pdGlhbGlzZShWQ0hJUV9JTlNUQU5DRV9UICppbnN0YW5jZU91dCkKK3sKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSBWQ0hJUV9FUlJPUjsKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZTsKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlID0gTlVMTDsKKyAgICAgICAgaW50IGk7CisKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsICIlcyBjYWxsZWQiLCBfX2Z1bmNfXyk7CisKKyAgICAgICAgLyogVmlkZW9Db3JlIG1heSBub3QgYmUgcmVhZHkgZHVlIHRvIGJvb3QgdXAgdGltaW5nLgorICAgICAgICAgICBJdCBtYXkgbmV2ZXIgYmUgcmVhZHkgaWYga2VybmVsIGFuZCBmaXJtd2FyZSBhcmUgbWlzbWF0Y2hlZCwgc28gZG9uJ3QgYmxvY2sgZm9yZXZlci4gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8VkNISVFfSU5JVF9SRVRSSUVTOyBpKyspIHsKKwkJc3RhdGUgPSB2Y2hpcV9nZXRfc3RhdGUoKTsKKwkJaWYgKHN0YXRlKQorCQkJYnJlYWs7CisJCXVkZWxheSg1MDApOworCX0KKwlpZiAoaT09VkNISVFfSU5JVF9SRVRSSUVTKSB7CisJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlczogdmlkZW9jb3JlIG5vdCBpbml0aWFsaXplZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGZhaWxlZDsKKwl9IGVsc2UgaWYgKGk+MCkgeworCQl2Y2hpcV9sb2dfd2FybmluZyh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCSIlczogdmlkZW9jb3JlIGluaXRpYWxpemVkIGFmdGVyICVkIHJldHJpZXNcbiIsIF9fZnVuY19fLCBpKTsKKwl9CisKKwlpbnN0YW5jZSA9IGt6YWxsb2Moc2l6ZW9mKCppbnN0YW5jZSksIEdGUF9LRVJORUwpOworCWlmICghaW5zdGFuY2UpIHsKKwkJdmNoaXFfbG9nX2Vycm9yKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIiVzOiBlcnJvciBhbGxvY2F0aW5nIHZjaGlxIGluc3RhbmNlXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWluc3RhbmNlLT5jb25uZWN0ZWQgPSAwOworCWluc3RhbmNlLT5zdGF0ZSA9IHN0YXRlOworCW11dGV4X2luaXQoJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3QpOworCisJKmluc3RhbmNlT3V0ID0gaW5zdGFuY2U7CisKKwlzdGF0dXMgPSBWQ0hJUV9TVUNDRVNTOworCitmYWlsZWQ6CisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiJXMoJXApOiByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpcV9pbml0aWFsaXNlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICB2Y2hpcV9zaHV0ZG93bgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9zaHV0ZG93bihWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IGluc3RhbmNlLT5zdGF0ZTsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKSBjYWxsZWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UpOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3RhdGUtPm11dGV4KSAhPSAwKQorCQlyZXR1cm4gVkNISVFfUkVUUlk7CisKKwkvKiBSZW1vdmUgYWxsIHNlcnZpY2VzICovCisJc3RhdHVzID0gdmNoaXFfc2h1dGRvd25faW50ZXJuYWwoc3RhdGUsIGluc3RhbmNlKTsKKworCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKTogcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIGluc3RhbmNlLCBzdGF0dXMpOworCisJaWYgKHN0YXR1cyA9PSBWQ0hJUV9TVUNDRVNTKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKm5leHQ7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG5leHQsCisJCQkJJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0KSB7CisJCQlzdHJ1Y3QgYnVsa193YWl0ZXJfbm9kZSAqd2FpdGVyOworCQkJd2FpdGVyID0gbGlzdF9lbnRyeShwb3MsCisJCQkJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlLAorCQkJCQlsaXN0KTsKKwkJCWxpc3RfZGVsKHBvcyk7CisJCQl2Y2hpcV9sb2dfaW5mbyh2Y2hpcV9hcm1fbG9nX2xldmVsLAorCQkJCQkiYnVsa193YWl0ZXIgLSBjbGVhbmVkIHVwICV4ICIKKwkJCQkJImZvciBwaWQgJWQiLAorCQkJCQkodW5zaWduZWQgaW50KXdhaXRlciwgd2FpdGVyLT5waWQpOworCQkJa2ZyZWUod2FpdGVyKTsKKwkJfQorCQlrZnJlZShpbnN0YW5jZSk7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfc2h1dGRvd24pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX2lzX2Nvbm5lY3RlZAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgdmNoaXFfaXNfY29ubmVjdGVkKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpCit7CisJcmV0dXJuIGluc3RhbmNlLT5jb25uZWN0ZWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgdmNoaXFfY29ubmVjdAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV9jb25uZWN0KFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCVZDSElRX1NUQVRFX1QgKnN0YXRlID0gaW5zdGFuY2UtPnN0YXRlOworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiJXMoJXApIGNhbGxlZCIsIF9fZnVuY19fLCBpbnN0YW5jZSk7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzdGF0ZS0+bXV0ZXgpICE9IDApIHsKKwkJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkJIiVzOiBjYWxsIHRvIG11dGV4X2xvY2sgZmFpbGVkIiwgX19mdW5jX18pOworCQlzdGF0dXMgPSBWQ0hJUV9SRVRSWTsKKwkJZ290byBmYWlsZWQ7CisJfQorCXN0YXR1cyA9IHZjaGlxX2Nvbm5lY3RfaW50ZXJuYWwoc3RhdGUsIGluc3RhbmNlKTsKKworCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykKKwkJaW5zdGFuY2UtPmNvbm5lY3RlZCA9IDE7CisKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisKK2ZhaWxlZDoKKwl2Y2hpcV9sb2dfdHJhY2UodmNoaXFfY29yZV9sb2dfbGV2ZWwsCisJCSIlcyglcCk6IHJldHVybmluZyAlZCIsIF9fZnVuY19fLCBpbnN0YW5jZSwgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlxX2Nvbm5lY3QpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgIHZjaGlxX2FkZF9zZXJ2aWNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1ZDSElRX1NUQVRVU19UIHZjaGlxX2FkZF9zZXJ2aWNlKAorCVZDSElRX0lOU1RBTkNFX1QgICAgICAgICAgICAgIGluc3RhbmNlLAorCWNvbnN0IFZDSElRX1NFUlZJQ0VfUEFSQU1TX1QgKnBhcmFtcywKKwlWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UICAgICAgICpwaGFuZGxlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKwlWQ0hJUV9TVEFURV9UICpzdGF0ZSA9IGluc3RhbmNlLT5zdGF0ZTsKKwlWQ0hJUV9TRVJWSUNFX1QgKnNlcnZpY2UgPSBOVUxMOworCWludCBzcnZzdGF0ZTsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKSBjYWxsZWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UpOworCisJKnBoYW5kbGUgPSBWQ0hJUV9TRVJWSUNFX0hBTkRMRV9JTlZBTElEOworCisJc3J2c3RhdGUgPSB2Y2hpcV9pc19jb25uZWN0ZWQoaW5zdGFuY2UpCisJCT8gVkNISVFfU1JWU1RBVEVfTElTVEVOSU5HCisJCTogVkNISVFfU1JWU1RBVEVfSElEREVOOworCisJc2VydmljZSA9IHZjaGlxX2FkZF9zZXJ2aWNlX2ludGVybmFsKAorCQlzdGF0ZSwKKwkJcGFyYW1zLAorCQlzcnZzdGF0ZSwKKwkJaW5zdGFuY2UsCisJCU5VTEwpOworCisJaWYgKHNlcnZpY2UpIHsKKwkJKnBoYW5kbGUgPSBzZXJ2aWNlLT5oYW5kbGU7CisJCXN0YXR1cyA9IFZDSElRX1NVQ0NFU1M7CisJfSBlbHNlCisJCXN0YXR1cyA9IFZDSElRX0VSUk9SOworCisJdmNoaXFfbG9nX3RyYWNlKHZjaGlxX2NvcmVfbG9nX2xldmVsLAorCQkiJXMoJXApOiByZXR1cm5pbmcgJWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UsIHN0YXR1cyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpcV9hZGRfc2VydmljZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICAgdmNoaXFfb3Blbl9zZXJ2aWNlCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK1ZDSElRX1NUQVRVU19UIHZjaGlxX29wZW5fc2VydmljZSgKKwlWQ0hJUV9JTlNUQU5DRV9UICAgICAgICAgICAgICBpbnN0YW5jZSwKKwljb25zdCBWQ0hJUV9TRVJWSUNFX1BBUkFNU19UICpwYXJhbXMsCisJVkNISVFfU0VSVklDRV9IQU5ETEVfVCAgICAgICAqcGhhbmRsZSkKK3sKKwlWQ0hJUV9TVEFUVVNfVCAgIHN0YXR1cyA9IFZDSElRX0VSUk9SOworCVZDSElRX1NUQVRFX1QgICAqc3RhdGUgPSBpbnN0YW5jZS0+c3RhdGU7CisJVkNISVFfU0VSVklDRV9UICpzZXJ2aWNlID0gTlVMTDsKKworCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKSBjYWxsZWQiLCBfX2Z1bmNfXywgaW5zdGFuY2UpOworCisJKnBoYW5kbGUgPSBWQ0hJUV9TRVJWSUNFX0hBTkRMRV9JTlZBTElEOworCisJaWYgKCF2Y2hpcV9pc19jb25uZWN0ZWQoaW5zdGFuY2UpKQorCQlnb3RvIGZhaWxlZDsKKworCXNlcnZpY2UgPSB2Y2hpcV9hZGRfc2VydmljZV9pbnRlcm5hbChzdGF0ZSwKKwkJcGFyYW1zLAorCQlWQ0hJUV9TUlZTVEFURV9PUEVOSU5HLAorCQlpbnN0YW5jZSwKKwkJTlVMTCk7CisKKwlpZiAoc2VydmljZSkgeworCQkqcGhhbmRsZSA9IHNlcnZpY2UtPmhhbmRsZTsKKwkJc3RhdHVzID0gdmNoaXFfb3Blbl9zZXJ2aWNlX2ludGVybmFsKHNlcnZpY2UsIGN1cnJlbnQtPnBpZCk7CisJCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykgeworCQkJdmNoaXFfcmVtb3ZlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKTsKKwkJCSpwaGFuZGxlID0gVkNISVFfU0VSVklDRV9IQU5ETEVfSU5WQUxJRDsKKwkJfQorCX0KKworZmFpbGVkOgorCXZjaGlxX2xvZ190cmFjZSh2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJIiVzKCVwKTogcmV0dXJuaW5nICVkIiwgX19mdW5jX18sIGluc3RhbmNlLCBzdGF0dXMpOworCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfb3Blbl9zZXJ2aWNlKTsKKworVkNISVFfU1RBVFVTX1QKK3ZjaGlxX3F1ZXVlX2J1bGtfdHJhbnNtaXQoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKnVzZXJkYXRhKQoreworCXJldHVybiB2Y2hpcV9idWxrX3RyYW5zZmVyKGhhbmRsZSwKKwkJVkNISV9NRU1fSEFORExFX0lOVkFMSUQsICh2b2lkICopZGF0YSwgc2l6ZSwgdXNlcmRhdGEsCisJCVZDSElRX0JVTEtfTU9ERV9DQUxMQkFDSywgVkNISVFfQlVMS19UUkFOU01JVCk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlxX3F1ZXVlX2J1bGtfdHJhbnNtaXQpOworCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfcXVldWVfYnVsa19yZWNlaXZlKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLCB2b2lkICpkYXRhLAorCXVuc2lnbmVkIGludCBzaXplLCB2b2lkICp1c2VyZGF0YSkKK3sKKwlyZXR1cm4gdmNoaXFfYnVsa190cmFuc2ZlcihoYW5kbGUsCisJCVZDSElfTUVNX0hBTkRMRV9JTlZBTElELCBkYXRhLCBzaXplLCB1c2VyZGF0YSwKKwkJVkNISVFfQlVMS19NT0RFX0NBTExCQUNLLCBWQ0hJUV9CVUxLX1JFQ0VJVkUpOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpcV9xdWV1ZV9idWxrX3JlY2VpdmUpOworCitWQ0hJUV9TVEFUVVNfVAordmNoaXFfYnVsa190cmFuc21pdChWQ0hJUV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgY29uc3Qgdm9pZCAqZGF0YSwKKwl1bnNpZ25lZCBpbnQgc2l6ZSwgdm9pZCAqdXNlcmRhdGEsIFZDSElRX0JVTEtfTU9ERV9UIG1vZGUpCit7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfTk9DQUxMQkFDSzoKKwljYXNlIFZDSElRX0JVTEtfTU9ERV9DQUxMQkFDSzoKKwkJc3RhdHVzID0gdmNoaXFfYnVsa190cmFuc2ZlcihoYW5kbGUsCisJCQlWQ0hJX01FTV9IQU5ETEVfSU5WQUxJRCwgKHZvaWQgKilkYXRhLCBzaXplLCB1c2VyZGF0YSwKKwkJCW1vZGUsIFZDSElRX0JVTEtfVFJBTlNNSVQpOworCQlicmVhazsKKwljYXNlIFZDSElRX0JVTEtfTU9ERV9CTE9DS0lORzoKKwkJc3RhdHVzID0gdmNoaXFfYmxvY2tpbmdfYnVsa190cmFuc2ZlcihoYW5kbGUsCisJCQkodm9pZCAqKWRhdGEsIHNpemUsIFZDSElRX0JVTEtfVFJBTlNNSVQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfYnVsa190cmFuc21pdCk7CisKK1ZDSElRX1NUQVRVU19UCit2Y2hpcV9idWxrX3JlY2VpdmUoVkNISVFfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsIHZvaWQgKmRhdGEsCisJdW5zaWduZWQgaW50IHNpemUsIHZvaWQgKnVzZXJkYXRhLCBWQ0hJUV9CVUxLX01PREVfVCBtb2RlKQoreworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgVkNISVFfQlVMS19NT0RFX05PQ0FMTEJBQ0s6CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfQ0FMTEJBQ0s6CisJCXN0YXR1cyA9IHZjaGlxX2J1bGtfdHJhbnNmZXIoaGFuZGxlLAorCQkJVkNISV9NRU1fSEFORExFX0lOVkFMSUQsIGRhdGEsIHNpemUsIHVzZXJkYXRhLAorCQkJbW9kZSwgVkNISVFfQlVMS19SRUNFSVZFKTsKKwkJYnJlYWs7CisJY2FzZSBWQ0hJUV9CVUxLX01PREVfQkxPQ0tJTkc6CisJCXN0YXR1cyA9IHZjaGlxX2Jsb2NraW5nX2J1bGtfdHJhbnNmZXIoaGFuZGxlLAorCQkJKHZvaWQgKilkYXRhLCBzaXplLCBWQ0hJUV9CVUxLX1JFQ0VJVkUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gVkNISVFfRVJST1I7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0wodmNoaXFfYnVsa19yZWNlaXZlKTsKKworc3RhdGljIFZDSElRX1NUQVRVU19UCit2Y2hpcV9ibG9ja2luZ19idWxrX3RyYW5zZmVyKFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLCB2b2lkICpkYXRhLAorCXVuc2lnbmVkIGludCBzaXplLCBWQ0hJUV9CVUxLX0RJUl9UIGRpcikKK3sKKwlWQ0hJUV9JTlNUQU5DRV9UIGluc3RhbmNlOworCVZDSElRX1NFUlZJQ0VfVCAqc2VydmljZTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisJc3RydWN0IGJ1bGtfd2FpdGVyX25vZGUgKndhaXRlciA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCisJc2VydmljZSA9IGZpbmRfc2VydmljZV9ieV9oYW5kbGUoaGFuZGxlKTsKKwlpZiAoIXNlcnZpY2UpCisJCXJldHVybiBWQ0hJUV9FUlJPUjsKKworCWluc3RhbmNlID0gc2VydmljZS0+aW5zdGFuY2U7CisKKwl1bmxvY2tfc2VydmljZShzZXJ2aWNlKTsKKworCW11dGV4X2xvY2soJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoKHBvcywgJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0KSB7CisJCWlmIChsaXN0X2VudHJ5KHBvcywgc3RydWN0IGJ1bGtfd2FpdGVyX25vZGUsCisJCQkJbGlzdCktPnBpZCA9PSBjdXJyZW50LT5waWQpIHsKKwkJCXdhaXRlciA9IGxpc3RfZW50cnkocG9zLAorCQkJCXN0cnVjdCBidWxrX3dhaXRlcl9ub2RlLAorCQkJCWxpc3QpOworCQkJbGlzdF9kZWwocG9zKTsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmaW5zdGFuY2UtPmJ1bGtfd2FpdGVyX2xpc3RfbXV0ZXgpOworCisJaWYgKHdhaXRlcikgeworCQlWQ0hJUV9CVUxLX1QgKmJ1bGsgPSB3YWl0ZXItPmJ1bGtfd2FpdGVyLmJ1bGs7CisJCWlmIChidWxrKSB7CisJCQkvKiBUaGlzIHRocmVhZCBoYXMgYW4gb3V0c3RhbmRpbmcgYnVsayB0cmFuc2Zlci4gKi8KKwkJCWlmICgoYnVsay0+ZGF0YSAhPSBkYXRhKSB8fAorCQkJCShidWxrLT5zaXplICE9IHNpemUpKSB7CisJCQkJLyogVGhpcyBpcyBub3QgYSByZXRyeSBvZiB0aGUgcHJldmlvdXMgb25lLgorCQkJCSoqIENhbmNlbCB0aGUgc2lnbmFsIHdoZW4gdGhlIHRyYW5zZmVyCisJCQkJKiogY29tcGxldGVzLiAqLworCQkJCXNwaW5fbG9jaygmYnVsa193YWl0ZXJfc3BpbmxvY2spOworCQkJCWJ1bGstPnVzZXJkYXRhID0gTlVMTDsKKwkJCQlzcGluX3VubG9jaygmYnVsa193YWl0ZXJfc3BpbmxvY2spOworCQkJfQorCQl9CisJfQorCisJaWYgKCF3YWl0ZXIpIHsKKwkJd2FpdGVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJ1bGtfd2FpdGVyX25vZGUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF3YWl0ZXIpIHsKKwkJCXZjaGlxX2xvZ19lcnJvcih2Y2hpcV9jb3JlX2xvZ19sZXZlbCwKKwkJCQkiJXMgLSBvdXQgb2YgbWVtb3J5IiwgX19mdW5jX18pOworCQkJcmV0dXJuIFZDSElRX0VSUk9SOworCQl9CisJfQorCisJc3RhdHVzID0gdmNoaXFfYnVsa190cmFuc2ZlcihoYW5kbGUsIFZDSElfTUVNX0hBTkRMRV9JTlZBTElELAorCQlkYXRhLCBzaXplLCAmd2FpdGVyLT5idWxrX3dhaXRlciwgVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HLAorCQlkaXIpOworCWlmICgoc3RhdHVzICE9IFZDSElRX1JFVFJZKSB8fCBmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSB8fAorCQkhd2FpdGVyLT5idWxrX3dhaXRlci5idWxrKSB7CisJCVZDSElRX0JVTEtfVCAqYnVsayA9IHdhaXRlci0+YnVsa193YWl0ZXIuYnVsazsKKwkJaWYgKGJ1bGspIHsKKwkJCS8qIENhbmNlbCB0aGUgc2lnbmFsIHdoZW4gdGhlIHRyYW5zZmVyCisJCQkgKiogY29tcGxldGVzLiAqLworCQkJc3Bpbl9sb2NrKCZidWxrX3dhaXRlcl9zcGlubG9jayk7CisJCQlidWxrLT51c2VyZGF0YSA9IE5VTEw7CisJCQlzcGluX3VubG9jaygmYnVsa193YWl0ZXJfc3BpbmxvY2spOworCQl9CisJCWtmcmVlKHdhaXRlcik7CisJfSBlbHNlIHsKKwkJd2FpdGVyLT5waWQgPSBjdXJyZW50LT5waWQ7CisJCW11dGV4X2xvY2soJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0X211dGV4KTsKKwkJbGlzdF9hZGQoJndhaXRlci0+bGlzdCwgJmluc3RhbmNlLT5idWxrX3dhaXRlcl9saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZpbnN0YW5jZS0+YnVsa193YWl0ZXJfbGlzdF9tdXRleCk7CisJCXZjaGlxX2xvZ19pbmZvKHZjaGlxX2FybV9sb2dfbGV2ZWwsCisJCQkJInNhdmVkIGJ1bGtfd2FpdGVyICV4IGZvciBwaWQgJWQiLAorCQkJCSh1bnNpZ25lZCBpbnQpd2FpdGVyLCBjdXJyZW50LT5waWQpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2tpbGxhYmxlLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX2tpbGxhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1NDQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfa2lsbGFibGUuaApAQCAtMCwwICsxLDY5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX0tJTExBQkxFX0gKKyNkZWZpbmUgVkNISVFfS0lMTEFCTEVfSAorCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKworI2RlZmluZSBTSFVURE9XTl9TSUdTICAgKHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR0lOVCkgfCBzaWdtYXNrKFNJR1FVSVQpIHwgc2lnbWFzayhTSUdUUkFQKSB8IHNpZ21hc2soU0lHU1RPUCkgfCBzaWdtYXNrKFNJR0NPTlQpKQorCitzdGF0aWMgaW5saW5lIGludCBfX211c3RfY2hlY2sgZG93bl9pbnRlcnJ1cHRpYmxlX2tpbGxhYmxlKHN0cnVjdCBzZW1hcGhvcmUgKnNlbSkKK3sKKwkvKiBBbGxvdyBpbnRlcmNlcHRpb24gb2Yga2lsbGFibGUgc2lnbmFscyBvbmx5LiBXZSBkb24ndCB3YW50IHRvIGJlIGludGVycnVwdGVkIGJ5IGhhcm1sZXNzIHNpZ25hbHMgbGlrZSBTSUdBTFJNICovCisJaW50IHJldDsKKwlzaWdzZXRfdCBibG9ja2VkLCBvbGRzZXQ7CisJc2lnaW5pdHNldGludigmYmxvY2tlZCwgU0hVVERPV05fU0lHUyk7CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZibG9ja2VkLCAmb2xkc2V0KTsKKwlyZXQgPSBkb3duX2ludGVycnVwdGlibGUoc2VtKTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgTlVMTCk7CisJcmV0dXJuIHJldDsKK30KKyNkZWZpbmUgZG93bl9pbnRlcnJ1cHRpYmxlIGRvd25faW50ZXJydXB0aWJsZV9raWxsYWJsZQorCisKK3N0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBtdXRleF9sb2NrX2ludGVycnVwdGlibGVfa2lsbGFibGUoc3RydWN0IG11dGV4ICpsb2NrKQoreworCS8qIEFsbG93IGludGVyY2VwdGlvbiBvZiBraWxsYWJsZSBzaWduYWxzIG9ubHkuIFdlIGRvbid0IHdhbnQgdG8gYmUgaW50ZXJydXB0ZWQgYnkgaGFybWxlc3Mgc2lnbmFscyBsaWtlIFNJR0FMUk0gKi8KKwlpbnQgcmV0OworCXNpZ3NldF90IGJsb2NrZWQsIG9sZHNldDsKKwlzaWdpbml0c2V0aW52KCZibG9ja2VkLCBTSFVURE9XTl9TSUdTKTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJmJsb2NrZWQsICZvbGRzZXQpOworCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZShsb2NrKTsKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgTlVMTCk7CisJcmV0dXJuIHJldDsKK30KKyNkZWZpbmUgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlIG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZV9raWxsYWJsZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfbWVtZHJ2LmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX21lbWRydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMmU3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX21lbWRydi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVkNISVFfTUVNRFJWX0gKKyNkZWZpbmUgVkNISVFfTUVNRFJWX0gKKworLyogLS0tLSBJbmNsdWRlIEZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlICJ2Y2hpcV9pZi5oIgorCisvKiAtLS0tIENvbnN0YW50cyBhbmQgVHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJIHZvaWQgICAgICAgICAgICAgICAgICAgKmFybVNoYXJlZE1lbVZpcnQ7CisJIGRtYV9hZGRyX3QgICAgICAgICAgICAgIGFybVNoYXJlZE1lbVBoeXM7CisJIHNpemVfdCAgICAgICAgICAgICAgICAgIGFybVNoYXJlZE1lbVNpemU7CisKKwkgdm9pZCAgICAgICAgICAgICAgICAgICAqdmNTaGFyZWRNZW1WaXJ0OworCSBkbWFfYWRkcl90ICAgICAgICAgICAgICB2Y1NoYXJlZE1lbVBoeXM7CisJIHNpemVfdCAgICAgICAgICAgICAgICAgIHZjU2hhcmVkTWVtU2l6ZTsKK30gVkNISVFfU0hBUkVEX01FTV9JTkZPX1Q7CisKKy8qIC0tLS0gVmFyaWFibGUgRXh0ZXJucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0gRnVuY3Rpb24gUHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgdmNoaXFfZ2V0X3NoYXJlZF9tZW1faW5mbyhWQ0hJUV9TSEFSRURfTUVNX0lORk9fVCAqaW5mbyk7CisKK1ZDSElRX1NUQVRVU19UIHZjaGlxX21lbWRydl9pbml0aWFsaXNlKHZvaWQpOworCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV91c2VyZHJ2X2NyZWF0ZV9pbnN0YW5jZSgKKwljb25zdCBWQ0hJUV9QTEFURk9STV9EQVRBX1QgKiBwbGF0Zm9ybV9kYXRhKTsKKworVkNISVFfU1RBVFVTX1QgdmNoaXFfdXNlcmRydl9zdXNwZW5kKAorCWNvbnN0IFZDSElRX1BMQVRGT1JNX0RBVEFfVCAqIHBsYXRmb3JtX2RhdGEpOworCitWQ0hJUV9TVEFUVVNfVCB2Y2hpcV91c2VyZHJ2X3Jlc3VtZSgKKwljb25zdCBWQ0hJUV9QTEFURk9STV9EQVRBX1QgKiBwbGF0Zm9ybV9kYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3BhZ2VsaXN0LmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3BhZ2VsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhM2VjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfcGFnZWxpc3QuaApAQCAtMCwwICsxLDU4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEyIEJyb2FkY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWVzIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbWF5IG5vdCBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMKKyAqIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFZDSElRX1BBR0VMSVNUX0gKKyNkZWZpbmUgVkNISVFfUEFHRUxJU1RfSAorCisjaWZuZGVmIFBBR0VfU0laRQorI2RlZmluZSBQQUdFX1NJWkUgNDA5NgorI2VuZGlmCisjZGVmaW5lIENBQ0hFX0xJTkVfU0laRSAzMgorI2RlZmluZSBQQUdFTElTVF9XUklURSAwCisjZGVmaW5lIFBBR0VMSVNUX1JFQUQgMQorI2RlZmluZSBQQUdFTElTVF9SRUFEX1dJVEhfRlJBR01FTlRTIDIKKwordHlwZWRlZiBzdHJ1Y3QgcGFnZWxpc3Rfc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGxlbmd0aDsKKwl1bnNpZ25lZCBzaG9ydCB0eXBlOworCXVuc2lnbmVkIHNob3J0IG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGFkZHJzWzFdOwkvKiBOLkIuIDEyIExTQnMgaG9sZCB0aGUgbnVtYmVyIG9mIGZvbGxvd2luZworCQkJCSAgIHBhZ2VzIGF0IGNvbnNlY3V0aXZlIGFkZHJlc3Nlcy4gKi8KK30gUEFHRUxJU1RfVDsKKwordHlwZWRlZiBzdHJ1Y3QgZnJhZ21lbnRzX3N0cnVjdCB7CisJY2hhciBoZWFkYnVmW0NBQ0hFX0xJTkVfU0laRV07CisJY2hhciB0YWlsYnVmW0NBQ0hFX0xJTkVfU0laRV07Cit9IEZSQUdNRU5UU19UOworCisjZW5kaWYgLyogVkNISVFfUEFHRUxJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9zaGltLmMgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3NoaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDcyZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV9zaGltLmMKQEAgLTAsMCArMSw4NjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTIgQnJvYWRjb20uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBtYXkgbm90IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworICogSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImludGVyZmFjZS92Y2hpL3ZjaGkuaCIKKyNpbmNsdWRlICJ2Y2hpcS5oIgorI2luY2x1ZGUgInZjaGlxX2NvcmUuaCIKKworI2luY2x1ZGUgInZjaGlxX3V0aWwuaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjZGVmaW5lIHZjaGlxX3N0YXR1c190b192Y2hpKHN0YXR1cykgKChpbnQzMl90KXN0YXR1cykKKwordHlwZWRlZiBzdHJ1Y3QgeworCVZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlOworCisJVkNISVVfUVVFVUVfVCBxdWV1ZTsKKworCVZDSElfQ0FMTEJBQ0tfVCBjYWxsYmFjazsKKwl2b2lkICpjYWxsYmFja19wYXJhbTsKK30gU0hJTV9TRVJWSUNFX1Q7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJldHVybiBwb2ludGVyIHRvIHRoZSBtcGhpIG1lc3NhZ2UgZHJpdmVyIGZ1bmN0aW9uIHRhYmxlCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworY29uc3QgVkNISV9NRVNTQUdFX0RSSVZFUl9UICoKK3ZjaGlfbXBoaV9tZXNzYWdlX2RyaXZlcl9mdW5jX3RhYmxlKHZvaWQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlICdzaW5nbGUnIGNvbm5lY3Rpb24gZHJpdmVyIGZvcHMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitjb25zdCBWQ0hJX0NPTk5FQ1RJT05fQVBJX1QgKgorc2luZ2xlX2dldF9mdW5jX3RhYmxlKHZvaWQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK1ZDSElfQ09OTkVDVElPTl9UICp2Y2hpX2NyZWF0ZV9jb25uZWN0aW9uKAorCWNvbnN0IFZDSElfQ09OTkVDVElPTl9BUElfVCAqZnVuY3Rpb25fdGFibGUsCisJY29uc3QgVkNISV9NRVNTQUdFX0RSSVZFUl9UICpsb3dfbGV2ZWwpCit7CisJKHZvaWQpZnVuY3Rpb25fdGFibGU7CisJKHZvaWQpbG93X2xldmVsOworCXJldHVybiBOVUxMOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfbXNnX3BlZWsKKyAqCisgKiBBcmd1bWVudHM6ICBjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICogICAgICAgICAgICAgdm9pZCAqKmRhdGEsCisgKiAgICAgICAgICAgICB1aW50MzJfdCAqbXNnX3NpemUsCisKKworICogICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzCisgKgorICogRGVzY3JpcHRpb246IFJvdXRpbmUgdG8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBtZXNzYWdlICh0byBhbGxvdyBpbgorICogICAgICAgICAgICAgIHBsYWNlIHByb2Nlc3NpbmcpLiBUaGUgbWVzc2FnZSBjYW4gYmUgcmVtb3ZlZCB1c2luZworICogICAgICAgICAgICAgIHZjaGlfbXNnX3JlbW92ZSB3aGVuIHlvdSdyZSBmaW5pc2hlZAorICoKKyAqIFJldHVybnM6IGludDMyX3QgLSBzdWNjZXNzID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfbXNnX3BlZWsoVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwl2b2lkICoqZGF0YSwKKwl1aW50MzJfdCAqbXNnX3NpemUsCisJVkNISV9GTEFHU19UIGZsYWdzKQoreworCVNISU1fU0VSVklDRV9UICpzZXJ2aWNlID0gKFNISU1fU0VSVklDRV9UICopaGFuZGxlOworCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisKKwlXQVJOX09OKChmbGFncyAhPSBWQ0hJX0ZMQUdTX05PTkUpICYmCisJCShmbGFncyAhPSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX09QX0NPTVBMRVRFKSk7CisKKwlpZiAoZmxhZ3MgPT0gVkNISV9GTEFHU19OT05FKQorCQlpZiAodmNoaXVfcXVldWVfaXNfZW1wdHkoJnNlcnZpY2UtPnF1ZXVlKSkKKwkJCXJldHVybiAtMTsKKworCWhlYWRlciA9IHZjaGl1X3F1ZXVlX3BlZWsoJnNlcnZpY2UtPnF1ZXVlKTsKKworCSpkYXRhID0gaGVhZGVyLT5kYXRhOworCSptc2dfc2l6ZSA9IGhlYWRlci0+c2l6ZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX21zZ19wZWVrKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX21zZ19yZW1vdmUKKyAqCisgKiBBcmd1bWVudHM6ICBjb25zdCBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIHJlbW92ZSBhIG1lc3NhZ2UgKGFmdGVyIGl0IGhhcyBiZWVuIHJlYWQgd2l0aAorICogICAgICAgICAgICAgIHZjaGlfbXNnX3BlZWspCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9tc2dfcmVtb3ZlKFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisJVkNISVFfSEVBREVSX1QgKmhlYWRlcjsKKworCWhlYWRlciA9IHZjaGl1X3F1ZXVlX3BvcCgmc2VydmljZS0+cXVldWUpOworCisJdmNoaXFfcmVsZWFzZV9tZXNzYWdlKHNlcnZpY2UtPmhhbmRsZSwgaGVhZGVyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX21zZ19yZW1vdmUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfbXNnX3F1ZXVlCisgKgorICogQXJndW1lbnRzOiAgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKyAqICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgKiAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgKiAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgKiAgICAgICAgICAgICB2b2lkICptc2dfaGFuZGxlLAorICoKKyAqIERlc2NyaXB0aW9uOiBUaGluIHdyYXBwZXIgdG8gcXVldWUgYSBtZXNzYWdlIG9udG8gYSBjb25uZWN0aW9uCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9tc2dfcXVldWUoVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwKKwljb25zdCB2b2lkICpkYXRhLAorCXVpbnQzMl90IGRhdGFfc2l6ZSwKKwlWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisJdm9pZCAqbXNnX2hhbmRsZSkKK3sKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlWQ0hJUV9FTEVNRU5UX1QgZWxlbWVudCA9IHtkYXRhLCBkYXRhX3NpemV9OworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKworCSh2b2lkKW1zZ19oYW5kbGU7CisKKwlXQVJOX09OKGZsYWdzICE9IFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfUVVFVUVEKTsKKworCXN0YXR1cyA9IHZjaGlxX3F1ZXVlX21lc3NhZ2Uoc2VydmljZS0+aGFuZGxlLCAmZWxlbWVudCwgMSk7CisKKwkvKiB2Y2hpcV9xdWV1ZV9tZXNzYWdlKCkgbWF5IHJldHVybiBWQ0hJUV9SRVRSWSwgc28gd2UgbmVlZCB0bworCSoqIGltcGxlbWVudCBhIHJldHJ5IG1lY2hhbmlzbSBzaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkCisJKiogdG8gYmxvY2sgdW50aWwgcXVldWVkCisJKi8KKwl3aGlsZSAoc3RhdHVzID09IFZDSElRX1JFVFJZKSB7CisJCW1zbGVlcCgxKTsKKwkJc3RhdHVzID0gdmNoaXFfcXVldWVfbWVzc2FnZShzZXJ2aWNlLT5oYW5kbGUsICZlbGVtZW50LCAxKTsKKwl9CisKKwlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoc3RhdHVzKTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9tc2dfcXVldWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfYnVsa19xdWV1ZV9yZWNlaXZlCisgKgorICogQXJndW1lbnRzOiAgVkNISV9CVUxLX0hBTkRMRV9UIGhhbmRsZSwKKyAqICAgICAgICAgICAgIHZvaWQgKmRhdGFfZHN0LAorICogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZGF0YV9zaXplLAorICogICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzCisgKiAgICAgICAgICAgICB2b2lkICpidWxrX2hhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIHNldHVwIGEgcmN2IGJ1ZmZlcgorICoKKyAqIFJldHVybnM6IGludDMyX3QgLSBzdWNjZXNzID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfYnVsa19xdWV1ZV9yZWNlaXZlKFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJdm9pZCAqZGF0YV9kc3QsCisJdWludDMyX3QgZGF0YV9zaXplLAorCVZDSElfRkxBR1NfVCBmbGFncywKKwl2b2lkICpidWxrX2hhbmRsZSkKK3sKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlWQ0hJUV9CVUxLX01PREVfVCBtb2RlOworCVZDSElRX1NUQVRVU19UIHN0YXR1czsKKworCXN3aXRjaCAoKGludClmbGFncykgeworCWNhc2UgVkNISV9GTEFHU19DQUxMQkFDS19XSEVOX09QX0NPTVBMRVRFCisJCXwgVkNISV9GTEFHU19CTE9DS19VTlRJTF9RVUVVRUQ6CisJCVdBUk5fT04oIXNlcnZpY2UtPmNhbGxiYWNrKTsKKwkJbW9kZSA9IFZDSElRX0JVTEtfTU9ERV9DQUxMQkFDSzsKKwkJYnJlYWs7CisJY2FzZSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX09QX0NPTVBMRVRFOgorCQltb2RlID0gVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HOworCQlicmVhazsKKwljYXNlIFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfUVVFVUVEOgorCWNhc2UgVkNISV9GTEFHU19OT05FOgorCQltb2RlID0gVkNISVFfQlVMS19NT0RFX05PQ0FMTEJBQ0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk4oMSwgInVuc3VwcG9ydGVkIG1lc3NhZ2VcbiIpOworCQlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoVkNISVFfRVJST1IpOworCX0KKworCXN0YXR1cyA9IHZjaGlxX2J1bGtfcmVjZWl2ZShzZXJ2aWNlLT5oYW5kbGUsIGRhdGFfZHN0LCBkYXRhX3NpemUsCisJCWJ1bGtfaGFuZGxlLCBtb2RlKTsKKworCS8qIHZjaGlxX2J1bGtfcmVjZWl2ZSgpIG1heSByZXR1cm4gVkNISVFfUkVUUlksIHNvIHdlIG5lZWQgdG8KKwkqKiBpbXBsZW1lbnQgYSByZXRyeSBtZWNoYW5pc20gc2luY2UgdGhpcyBmdW5jdGlvbiBpcyBzdXBwb3NlZAorCSoqIHRvIGJsb2NrIHVudGlsIHF1ZXVlZAorCSovCisJd2hpbGUgKHN0YXR1cyA9PSBWQ0hJUV9SRVRSWSkgeworCQltc2xlZXAoMSk7CisJCXN0YXR1cyA9IHZjaGlxX2J1bGtfcmVjZWl2ZShzZXJ2aWNlLT5oYW5kbGUsIGRhdGFfZHN0LAorCQkJZGF0YV9zaXplLCBidWxrX2hhbmRsZSwgbW9kZSk7CisJfQorCisJcmV0dXJuIHZjaGlxX3N0YXR1c190b192Y2hpKHN0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfYnVsa19xdWV1ZV9yZWNlaXZlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX2J1bGtfcXVldWVfdHJhbnNtaXQKKyAqCisgKiBBcmd1bWVudHM6ICBWQ0hJX0JVTEtfSEFORExFX1QgaGFuZGxlLAorICogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YV9zcmMsCisgKiAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUsCisgKiAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgKiAgICAgICAgICAgICB2b2lkICpidWxrX2hhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIHRyYW5zbWl0IHNvbWUgZGF0YQorICoKKyAqIFJldHVybnM6IGludDMyX3QgLSBzdWNjZXNzID09IDAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQzMl90IHZjaGlfYnVsa19xdWV1ZV90cmFuc21pdChWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCWNvbnN0IHZvaWQgKmRhdGFfc3JjLAorCXVpbnQzMl90IGRhdGFfc2l6ZSwKKwlWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisJdm9pZCAqYnVsa19oYW5kbGUpCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisJVkNISVFfQlVMS19NT0RFX1QgbW9kZTsKKwlWQ0hJUV9TVEFUVVNfVCBzdGF0dXM7CisKKwlzd2l0Y2ggKChpbnQpZmxhZ3MpIHsKKwljYXNlIFZDSElfRkxBR1NfQ0FMTEJBQ0tfV0hFTl9PUF9DT01QTEVURQorCQl8IFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfUVVFVUVEOgorCQlXQVJOX09OKCFzZXJ2aWNlLT5jYWxsYmFjayk7CisJCW1vZGUgPSBWQ0hJUV9CVUxLX01PREVfQ0FMTEJBQ0s7CisJCWJyZWFrOworCWNhc2UgVkNISV9GTEFHU19CTE9DS19VTlRJTF9EQVRBX1JFQUQ6CisJY2FzZSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX09QX0NPTVBMRVRFOgorCQltb2RlID0gVkNISVFfQlVMS19NT0RFX0JMT0NLSU5HOworCQlicmVhazsKKwljYXNlIFZDSElfRkxBR1NfQkxPQ0tfVU5USUxfUVVFVUVEOgorCWNhc2UgVkNISV9GTEFHU19OT05FOgorCQltb2RlID0gVkNISVFfQlVMS19NT0RFX05PQ0FMTEJBQ0s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk4oMSwgInVuc3VwcG9ydGVkIG1lc3NhZ2VcbiIpOworCQlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoVkNISVFfRVJST1IpOworCX0KKworCXN0YXR1cyA9IHZjaGlxX2J1bGtfdHJhbnNtaXQoc2VydmljZS0+aGFuZGxlLCBkYXRhX3NyYywgZGF0YV9zaXplLAorCQlidWxrX2hhbmRsZSwgbW9kZSk7CisKKwkvKiB2Y2hpcV9idWxrX3RyYW5zbWl0KCkgbWF5IHJldHVybiBWQ0hJUV9SRVRSWSwgc28gd2UgbmVlZCB0bworCSoqIGltcGxlbWVudCBhIHJldHJ5IG1lY2hhbmlzbSBzaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBvc2VkCisJKiogdG8gYmxvY2sgdW50aWwgcXVldWVkCisJKi8KKwl3aGlsZSAoc3RhdHVzID09IFZDSElRX1JFVFJZKSB7CisJCW1zbGVlcCgxKTsKKwkJc3RhdHVzID0gdmNoaXFfYnVsa190cmFuc21pdChzZXJ2aWNlLT5oYW5kbGUsIGRhdGFfc3JjLAorCQkJZGF0YV9zaXplLCBidWxrX2hhbmRsZSwgbW9kZSk7CisJfQorCisJcmV0dXJuIHZjaGlxX3N0YXR1c190b192Y2hpKHN0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfYnVsa19xdWV1ZV90cmFuc21pdCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9tc2dfZGVxdWV1ZQorICoKKyAqIEFyZ3VtZW50czogIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgKiAgICAgICAgICAgICB2b2lkICpkYXRhLAorICogICAgICAgICAgICAgdWludDMyX3QgbWF4X2RhdGFfc2l6ZV90b19yZWFkLAorICogICAgICAgICAgICAgdWludDMyX3QgKmFjdHVhbF9tc2dfc2l6ZQorICogICAgICAgICAgICAgVkNISV9GTEFHU19UIGZsYWdzCisgKgorICogRGVzY3JpcHRpb246IFJvdXRpbmUgdG8gZGVxdWV1ZSBhIG1lc3NhZ2UgaW50byB0aGUgc3VwcGxpZWQgYnVmZmVyCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9tc2dfZGVxdWV1ZShWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCXZvaWQgKmRhdGEsCisJdWludDMyX3QgbWF4X2RhdGFfc2l6ZV90b19yZWFkLAorCXVpbnQzMl90ICphY3R1YWxfbXNnX3NpemUsCisJVkNISV9GTEFHU19UIGZsYWdzKQoreworCVNISU1fU0VSVklDRV9UICpzZXJ2aWNlID0gKFNISU1fU0VSVklDRV9UICopaGFuZGxlOworCVZDSElRX0hFQURFUl9UICpoZWFkZXI7CisKKwlXQVJOX09OKChmbGFncyAhPSBWQ0hJX0ZMQUdTX05PTkUpICYmCisJCShmbGFncyAhPSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX09QX0NPTVBMRVRFKSk7CisKKwlpZiAoZmxhZ3MgPT0gVkNISV9GTEFHU19OT05FKQorCQlpZiAodmNoaXVfcXVldWVfaXNfZW1wdHkoJnNlcnZpY2UtPnF1ZXVlKSkKKwkJCXJldHVybiAtMTsKKworCWhlYWRlciA9IHZjaGl1X3F1ZXVlX3BvcCgmc2VydmljZS0+cXVldWUpOworCisJbWVtY3B5KGRhdGEsIGhlYWRlci0+ZGF0YSwgaGVhZGVyLT5zaXplIDwgbWF4X2RhdGFfc2l6ZV90b19yZWFkID8KKwkJaGVhZGVyLT5zaXplIDogbWF4X2RhdGFfc2l6ZV90b19yZWFkKTsKKworCSphY3R1YWxfbXNnX3NpemUgPSBoZWFkZXItPnNpemU7CisKKwl2Y2hpcV9yZWxlYXNlX21lc3NhZ2Uoc2VydmljZS0+aGFuZGxlLCBoZWFkZXIpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfbXNnX2RlcXVldWUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfbXNnX3F1ZXVldgorICoKKyAqIEFyZ3VtZW50czogIFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisgKiAgICAgICAgICAgICBWQ0hJX01TR19WRUNUT1JfVCAqdmVjdG9yLAorICogICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgKiAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgKiAgICAgICAgICAgICB2b2lkICptc2dfaGFuZGxlCisgKgorICogRGVzY3JpcHRpb246IFRoaW4gd3JhcHBlciB0byBxdWV1ZSBhIG1lc3NhZ2Ugb250byBhIGNvbm5lY3Rpb24KKyAqCisgKiBSZXR1cm5zOiBpbnQzMl90IC0gc3VjY2VzcyA9PSAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2Y2hpcV9zdGF0aWNfYXNzZXJ0KHNpemVvZihWQ0hJX01TR19WRUNUT1JfVCkgPT0gc2l6ZW9mKFZDSElRX0VMRU1FTlRfVCkpOwordmNoaXFfc3RhdGljX2Fzc2VydChvZmZzZXRvZihWQ0hJX01TR19WRUNUT1JfVCwgdmVjX2Jhc2UpID09CisJb2Zmc2V0b2YoVkNISVFfRUxFTUVOVF9ULCBkYXRhKSk7Cit2Y2hpcV9zdGF0aWNfYXNzZXJ0KG9mZnNldG9mKFZDSElfTVNHX1ZFQ1RPUl9ULCB2ZWNfbGVuKSA9PQorCW9mZnNldG9mKFZDSElRX0VMRU1FTlRfVCwgc2l6ZSkpOworCitpbnQzMl90IHZjaGlfbXNnX3F1ZXVldihWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCVZDSElfTVNHX1ZFQ1RPUl9UICp2ZWN0b3IsCisJdWludDMyX3QgY291bnQsCisJVkNISV9GTEFHU19UIGZsYWdzLAorCXZvaWQgKm1zZ19oYW5kbGUpCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisKKwkodm9pZCltc2dfaGFuZGxlOworCisJV0FSTl9PTihmbGFncyAhPSBWQ0hJX0ZMQUdTX0JMT0NLX1VOVElMX1FVRVVFRCk7CisKKwlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkodmNoaXFfcXVldWVfbWVzc2FnZShzZXJ2aWNlLT5oYW5kbGUsCisJCShjb25zdCBWQ0hJUV9FTEVNRU5UX1QgKil2ZWN0b3IsIGNvdW50KSk7Cit9CitFWFBPUlRfU1lNQk9MKHZjaGlfbXNnX3F1ZXVldik7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9oZWxkX21zZ19yZWxlYXNlCisgKgorICogQXJndW1lbnRzOiAgVkNISV9IRUxEX01TR19UICptZXNzYWdlCisgKgorICogRGVzY3JpcHRpb246IFJvdXRpbmUgdG8gcmVsZWFzZSBhIGhlbGQgbWVzc2FnZSAoYWZ0ZXIgaXQgaGFzIGJlZW4gcmVhZCB3aXRoCisgKiAgICAgICAgICAgICAgdmNoaV9tc2dfaG9sZCkKKyAqCisgKiBSZXR1cm5zOiBpbnQzMl90IC0gc3VjY2VzcyA9PSAwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCB2Y2hpX2hlbGRfbXNnX3JlbGVhc2UoVkNISV9IRUxEX01TR19UICptZXNzYWdlKQoreworCXZjaGlxX3JlbGVhc2VfbWVzc2FnZSgoVkNISVFfU0VSVklDRV9IQU5ETEVfVCltZXNzYWdlLT5zZXJ2aWNlLAorCQkoVkNISVFfSEVBREVSX1QgKiltZXNzYWdlLT5tZXNzYWdlKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX2hlbGRfbXNnX3JlbGVhc2UpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfbXNnX2hvbGQKKyAqCisgKiBBcmd1bWVudHM6ICBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorICogICAgICAgICAgICAgdm9pZCAqKmRhdGEsCisgKiAgICAgICAgICAgICB1aW50MzJfdCAqbXNnX3NpemUsCisgKiAgICAgICAgICAgICBWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisgKiAgICAgICAgICAgICBWQ0hJX0hFTERfTVNHX1QgKm1lc3NhZ2VfaGFuZGxlCisgKgorICogRGVzY3JpcHRpb246IFJvdXRpbmUgdG8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBtZXNzYWdlICh0byBhbGxvdworICogICAgICAgICAgICAgIGluIHBsYWNlIHByb2Nlc3NpbmcpLiBUaGUgbWVzc2FnZSBpcyBkZXF1ZXVlZCAtIGRvbid0IGZvcmdldAorICogICAgICAgICAgICAgIHRvIHJlbGVhc2UgdGhlIG1lc3NhZ2UgdXNpbmcgdmNoaV9oZWxkX21zZ19yZWxlYXNlIHdoZW4geW91J3JlCisgKiAgICAgICAgICAgICAgZmluaXNoZWQuCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9tc2dfaG9sZChWQ0hJX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLAorCXZvaWQgKipkYXRhLAorCXVpbnQzMl90ICptc2dfc2l6ZSwKKwlWQ0hJX0ZMQUdTX1QgZmxhZ3MsCisJVkNISV9IRUxEX01TR19UICptZXNzYWdlX2hhbmRsZSkKK3sKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlWQ0hJUV9IRUFERVJfVCAqaGVhZGVyOworCisJV0FSTl9PTigoZmxhZ3MgIT0gVkNISV9GTEFHU19OT05FKSAmJgorCQkoZmxhZ3MgIT0gVkNISV9GTEFHU19CTE9DS19VTlRJTF9PUF9DT01QTEVURSkpOworCisJaWYgKGZsYWdzID09IFZDSElfRkxBR1NfTk9ORSkKKwkJaWYgKHZjaGl1X3F1ZXVlX2lzX2VtcHR5KCZzZXJ2aWNlLT5xdWV1ZSkpCisJCQlyZXR1cm4gLTE7CisKKwloZWFkZXIgPSB2Y2hpdV9xdWV1ZV9wb3AoJnNlcnZpY2UtPnF1ZXVlKTsKKworCSpkYXRhID0gaGVhZGVyLT5kYXRhOworCSptc2dfc2l6ZSA9IGhlYWRlci0+c2l6ZTsKKworCW1lc3NhZ2VfaGFuZGxlLT5zZXJ2aWNlID0KKwkJKHN0cnVjdCBvcGFxdWVfdmNoaV9zZXJ2aWNlX3QgKilzZXJ2aWNlLT5oYW5kbGU7CisJbWVzc2FnZV9oYW5kbGUtPm1lc3NhZ2UgPSBoZWFkZXI7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9tc2dfaG9sZCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9pbml0aWFsaXNlCisgKgorICogQXJndW1lbnRzOiBWQ0hJX0lOU1RBTkNFX1QgKmluc3RhbmNlX2hhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBJbml0aWFsaXNlcyB0aGUgaGFyZHdhcmUgYnV0IGRvZXMgbm90IHRyYW5zbWl0IGFueXRoaW5nCisgKiAgICAgICAgICAgICAgV2hlbiBydW4gYXMgYSBIb3N0IEFwcCB0aGlzIHdpbGwgYmUgY2FsbGVkIHR3aWNlIGhlbmNlIHRoZSBuZWVkCisgKiAgICAgICAgICAgICAgdG8gbWFsbG9jIHRoZSBzdGF0ZSBpbmZvcm1hdGlvbgorICoKKyAqIFJldHVybnM6IDAgaWYgc3VjY2Vzc2Z1bCwgZmFpbHVyZSBvdGhlcndpc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludDMyX3QgdmNoaV9pbml0aWFsaXNlKFZDSElfSU5TVEFOQ0VfVCAqaW5zdGFuY2VfaGFuZGxlKQoreworCVZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2U7CisJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCisJc3RhdHVzID0gdmNoaXFfaW5pdGlhbGlzZSgmaW5zdGFuY2UpOworCisJKmluc3RhbmNlX2hhbmRsZSA9IChWQ0hJX0lOU1RBTkNFX1QpaW5zdGFuY2U7CisKKwlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoc3RhdHVzKTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9pbml0aWFsaXNlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBOYW1lOiB2Y2hpX2Nvbm5lY3QKKyAqCisgKiBBcmd1bWVudHM6IFZDSElfQ09OTkVDVElPTl9UICoqY29ubmVjdGlvbnMKKyAqICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbnVtX2Nvbm5lY3Rpb25zCisgKiAgICAgICAgICAgIFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUpCisgKgorICogRGVzY3JpcHRpb246IFN0YXJ0cyB0aGUgY29tbWFuZCBzZXJ2aWNlIG9uIGVhY2ggY29ubmVjdGlvbiwKKyAqICAgICAgICAgICAgICBjYXVzaW5nIElOSVQgbWVzc2FnZXMgdG8gYmUgcGluZ2VkIGJhY2sgYW5kIGZvcnRoCisgKgorICogUmV0dXJuczogMCBpZiBzdWNjZXNzZnVsLCBmYWlsdXJlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9jb25uZWN0KFZDSElfQ09OTkVDVElPTl9UICoqY29ubmVjdGlvbnMsCisJY29uc3QgdWludDMyX3QgbnVtX2Nvbm5lY3Rpb25zLAorCVZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUpCit7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IChWQ0hJUV9JTlNUQU5DRV9UKWluc3RhbmNlX2hhbmRsZTsKKworCSh2b2lkKWNvbm5lY3Rpb25zOworCSh2b2lkKW51bV9jb25uZWN0aW9uczsKKworCXJldHVybiB2Y2hpcV9jb25uZWN0KGluc3RhbmNlKTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9jb25uZWN0KTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfZGlzY29ubmVjdAorICoKKyAqIEFyZ3VtZW50czogVkNISV9JTlNUQU5DRV9UIGluc3RhbmNlX2hhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBTdG9wcyB0aGUgY29tbWFuZCBzZXJ2aWNlIG9uIGVhY2ggY29ubmVjdGlvbiwKKyAqICAgICAgICAgICAgICBjYXVzaW5nIERFLUlOSVQgbWVzc2FnZXMgdG8gYmUgcGluZ2VkIGJhY2sgYW5kIGZvcnRoCisgKgorICogUmV0dXJuczogMCBpZiBzdWNjZXNzZnVsLCBmYWlsdXJlIG90aGVyd2lzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9kaXNjb25uZWN0KFZDSElfSU5TVEFOQ0VfVCBpbnN0YW5jZV9oYW5kbGUpCit7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IChWQ0hJUV9JTlNUQU5DRV9UKWluc3RhbmNlX2hhbmRsZTsKKwlyZXR1cm4gdmNoaXFfc3RhdHVzX3RvX3ZjaGkodmNoaXFfc2h1dGRvd24oaW5zdGFuY2UpKTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9kaXNjb25uZWN0KTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5hbWU6IHZjaGlfc2VydmljZV9vcGVuCisgKiBOYW1lOiB2Y2hpX3NlcnZpY2VfY3JlYXRlCisgKgorICogQXJndW1lbnRzOiBWQ0hJX0lOU1RBTkNFX1QgKmluc3RhbmNlX2hhbmRsZQorICogICAgICAgICAgICBTRVJWSUNFX0NSRUFUSU9OX1QgKnNldHVwLAorICogICAgICAgICAgICBWQ0hJX1NFUlZJQ0VfSEFORExFX1QgKmhhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIG9wZW4gYSBzZXJ2aWNlCisgKgorICogUmV0dXJuczogaW50MzJfdCAtIHN1Y2Nlc3MgPT0gMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIFZDSElRX1NUQVRVU19UIHNoaW1fY2FsbGJhY2soVkNISVFfUkVBU09OX1QgcmVhc29uLAorCVZDSElRX0hFQURFUl9UICpoZWFkZXIsIFZDSElRX1NFUlZJQ0VfSEFORExFX1QgaGFuZGxlLCB2b2lkICpidWxrX3VzZXIpCit7CisJU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPQorCQkoU0hJTV9TRVJWSUNFX1QgKilWQ0hJUV9HRVRfU0VSVklDRV9VU0VSREFUQShoYW5kbGUpOworCisgICAgICAgIGlmICghc2VydmljZS0+Y2FsbGJhY2spCisJCWdvdG8gcmVsZWFzZTsKKworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBWQ0hJUV9NRVNTQUdFX0FWQUlMQUJMRToKKwkJdmNoaXVfcXVldWVfcHVzaCgmc2VydmljZS0+cXVldWUsIGhlYWRlcik7CisKKwkJc2VydmljZS0+Y2FsbGJhY2soc2VydmljZS0+Y2FsbGJhY2tfcGFyYW0sCisJCQkJICBWQ0hJX0NBTExCQUNLX01TR19BVkFJTEFCTEUsIE5VTEwpOworCisJCWdvdG8gZG9uZTsKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX0JVTEtfVFJBTlNNSVRfRE9ORToKKwkJc2VydmljZS0+Y2FsbGJhY2soc2VydmljZS0+Y2FsbGJhY2tfcGFyYW0sCisJCQkJICBWQ0hJX0NBTExCQUNLX0JVTEtfU0VOVCwgYnVsa191c2VyKTsKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX0JVTEtfUkVDRUlWRV9ET05FOgorCQlzZXJ2aWNlLT5jYWxsYmFjayhzZXJ2aWNlLT5jYWxsYmFja19wYXJhbSwKKwkJCQkgIFZDSElfQ0FMTEJBQ0tfQlVMS19SRUNFSVZFRCwgYnVsa191c2VyKTsKKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX1NFUlZJQ0VfQ0xPU0VEOgorCQlzZXJ2aWNlLT5jYWxsYmFjayhzZXJ2aWNlLT5jYWxsYmFja19wYXJhbSwKKwkJCQkgIFZDSElfQ0FMTEJBQ0tfU0VSVklDRV9DTE9TRUQsIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgVkNISVFfU0VSVklDRV9PUEVORUQ6CisJCS8qIE5vIGVxdWl2YWxlbnQgVkNISSByZWFzb24gKi8KKwkJYnJlYWs7CisKKwljYXNlIFZDSElRX0JVTEtfVFJBTlNNSVRfQUJPUlRFRDoKKwkJc2VydmljZS0+Y2FsbGJhY2soc2VydmljZS0+Y2FsbGJhY2tfcGFyYW0sCisJCQkJICBWQ0hJX0NBTExCQUNLX0JVTEtfVFJBTlNNSVRfQUJPUlRFRCwKKwkJCQkgIGJ1bGtfdXNlcik7CisJCWJyZWFrOworCisJY2FzZSBWQ0hJUV9CVUxLX1JFQ0VJVkVfQUJPUlRFRDoKKwkJc2VydmljZS0+Y2FsbGJhY2soc2VydmljZS0+Y2FsbGJhY2tfcGFyYW0sCisJCQkJICBWQ0hJX0NBTExCQUNLX0JVTEtfUkVDRUlWRV9BQk9SVEVELAorCQkJCSAgYnVsa191c2VyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJub3Qgc3VwcG9ydGVkXG4iKTsKKwkJYnJlYWs7CisJfQorCityZWxlYXNlOgorICAgICAgICB2Y2hpcV9yZWxlYXNlX21lc3NhZ2Uoc2VydmljZS0+aGFuZGxlLCBoZWFkZXIpOworZG9uZToKKwlyZXR1cm4gVkNISVFfU1VDQ0VTUzsKK30KKworc3RhdGljIFNISU1fU0VSVklDRV9UICpzZXJ2aWNlX2FsbG9jKFZDSElRX0lOU1RBTkNFX1QgaW5zdGFuY2UsCisJU0VSVklDRV9DUkVBVElPTl9UICpzZXR1cCkKK3sKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IGt6YWxsb2Moc2l6ZW9mKFNISU1fU0VSVklDRV9UKSwgR0ZQX0tFUk5FTCk7CisKKwkodm9pZClpbnN0YW5jZTsKKworCWlmIChzZXJ2aWNlKSB7CisJCWlmICh2Y2hpdV9xdWV1ZV9pbml0KCZzZXJ2aWNlLT5xdWV1ZSwgNjQpKSB7CisJCQlzZXJ2aWNlLT5jYWxsYmFjayA9IHNldHVwLT5jYWxsYmFjazsKKwkJCXNlcnZpY2UtPmNhbGxiYWNrX3BhcmFtID0gc2V0dXAtPmNhbGxiYWNrX3BhcmFtOworCQl9IGVsc2UgeworCQkJa2ZyZWUoc2VydmljZSk7CisJCQlzZXJ2aWNlID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBzZXJ2aWNlOworfQorCitzdGF0aWMgdm9pZCBzZXJ2aWNlX2ZyZWUoU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UpCit7CisJaWYgKHNlcnZpY2UpIHsKKwkJdmNoaXVfcXVldWVfZGVsZXRlKCZzZXJ2aWNlLT5xdWV1ZSk7CisJCWtmcmVlKHNlcnZpY2UpOworCX0KK30KKworaW50MzJfdCB2Y2hpX3NlcnZpY2Vfb3BlbihWQ0hJX0lOU1RBTkNFX1QgaW5zdGFuY2VfaGFuZGxlLAorCVNFUlZJQ0VfQ1JFQVRJT05fVCAqc2V0dXAsCisJVkNISV9TRVJWSUNFX0hBTkRMRV9UICpoYW5kbGUpCit7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IChWQ0hJUV9JTlNUQU5DRV9UKWluc3RhbmNlX2hhbmRsZTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IHNlcnZpY2VfYWxsb2MoaW5zdGFuY2UsIHNldHVwKTsKKworCSpoYW5kbGUgPSAoVkNISV9TRVJWSUNFX0hBTkRMRV9UKXNlcnZpY2U7CisKKwlpZiAoc2VydmljZSkgeworCQlWQ0hJUV9TRVJWSUNFX1BBUkFNU19UIHBhcmFtczsKKwkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCisJCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisJCXBhcmFtcy5mb3VyY2MgPSBzZXR1cC0+c2VydmljZV9pZDsKKwkJcGFyYW1zLmNhbGxiYWNrID0gc2hpbV9jYWxsYmFjazsKKwkJcGFyYW1zLnVzZXJkYXRhID0gc2VydmljZTsKKwkJcGFyYW1zLnZlcnNpb24gPSBzZXR1cC0+dmVyc2lvbi52ZXJzaW9uOworCQlwYXJhbXMudmVyc2lvbl9taW4gPSBzZXR1cC0+dmVyc2lvbi52ZXJzaW9uX21pbjsKKworCQlzdGF0dXMgPSB2Y2hpcV9vcGVuX3NlcnZpY2UoaW5zdGFuY2UsICZwYXJhbXMsCisJCQkmc2VydmljZS0+aGFuZGxlKTsKKwkJaWYgKHN0YXR1cyAhPSBWQ0hJUV9TVUNDRVNTKSB7CisJCQlzZXJ2aWNlX2ZyZWUoc2VydmljZSk7CisJCQlzZXJ2aWNlID0gTlVMTDsKKwkJCSpoYW5kbGUgPSBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIChzZXJ2aWNlICE9IE5VTEwpID8gMCA6IC0xOworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX3NlcnZpY2Vfb3Blbik7CisKK2ludDMyX3QgdmNoaV9zZXJ2aWNlX2NyZWF0ZShWQ0hJX0lOU1RBTkNFX1QgaW5zdGFuY2VfaGFuZGxlLAorCVNFUlZJQ0VfQ1JFQVRJT05fVCAqc2V0dXAsCisJVkNISV9TRVJWSUNFX0hBTkRMRV9UICpoYW5kbGUpCit7CisJVkNISVFfSU5TVEFOQ0VfVCBpbnN0YW5jZSA9IChWQ0hJUV9JTlNUQU5DRV9UKWluc3RhbmNlX2hhbmRsZTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IHNlcnZpY2VfYWxsb2MoaW5zdGFuY2UsIHNldHVwKTsKKworCSpoYW5kbGUgPSAoVkNISV9TRVJWSUNFX0hBTkRMRV9UKXNlcnZpY2U7CisKKwlpZiAoc2VydmljZSkgeworCQlWQ0hJUV9TRVJWSUNFX1BBUkFNU19UIHBhcmFtczsKKwkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzOworCisJCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisJCXBhcmFtcy5mb3VyY2MgPSBzZXR1cC0+c2VydmljZV9pZDsKKwkJcGFyYW1zLmNhbGxiYWNrID0gc2hpbV9jYWxsYmFjazsKKwkJcGFyYW1zLnVzZXJkYXRhID0gc2VydmljZTsKKwkJcGFyYW1zLnZlcnNpb24gPSBzZXR1cC0+dmVyc2lvbi52ZXJzaW9uOworCQlwYXJhbXMudmVyc2lvbl9taW4gPSBzZXR1cC0+dmVyc2lvbi52ZXJzaW9uX21pbjsKKwkJc3RhdHVzID0gdmNoaXFfYWRkX3NlcnZpY2UoaW5zdGFuY2UsICZwYXJhbXMsICZzZXJ2aWNlLT5oYW5kbGUpOworCisJCWlmIChzdGF0dXMgIT0gVkNISVFfU1VDQ0VTUykgeworCQkJc2VydmljZV9mcmVlKHNlcnZpY2UpOworCQkJc2VydmljZSA9IE5VTEw7CisJCQkqaGFuZGxlID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiAoc2VydmljZSAhPSBOVUxMKSA/IDAgOiAtMTsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9zZXJ2aWNlX2NyZWF0ZSk7CisKK2ludDMyX3QgdmNoaV9zZXJ2aWNlX2Nsb3NlKGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJaW50MzJfdCByZXQgPSAtMTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlpZiAoc2VydmljZSkgeworCQlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSB2Y2hpcV9jbG9zZV9zZXJ2aWNlKHNlcnZpY2UtPmhhbmRsZSk7CisJCWlmIChzdGF0dXMgPT0gVkNISVFfU1VDQ0VTUykgeworCQkJc2VydmljZV9mcmVlKHNlcnZpY2UpOworCQkJc2VydmljZSA9IE5VTEw7CisJCX0KKworCQlyZXQgPSB2Y2hpcV9zdGF0dXNfdG9fdmNoaShzdGF0dXMpOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX3NlcnZpY2VfY2xvc2UpOworCitpbnQzMl90IHZjaGlfc2VydmljZV9kZXN0cm95KGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJaW50MzJfdCByZXQgPSAtMTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlpZiAoc2VydmljZSkgeworCQlWQ0hJUV9TVEFUVVNfVCBzdGF0dXMgPSB2Y2hpcV9yZW1vdmVfc2VydmljZShzZXJ2aWNlLT5oYW5kbGUpOworCQlpZiAoc3RhdHVzID09IFZDSElRX1NVQ0NFU1MpIHsKKwkJCXNlcnZpY2VfZnJlZShzZXJ2aWNlKTsKKwkJCXNlcnZpY2UgPSBOVUxMOworCQl9CisKKwkJcmV0ID0gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoc3RhdHVzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9zZXJ2aWNlX2Rlc3Ryb3kpOworCitpbnQzMl90IHZjaGlfc2VydmljZV9zZXRfb3B0aW9uKGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUsCisJCQkJVkNISV9TRVJWSUNFX09QVElPTl9UIG9wdGlvbiwKKwkJCQlpbnQgdmFsdWUpCit7CisJaW50MzJfdCByZXQgPSAtMTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlWQ0hJUV9TRVJWSUNFX09QVElPTl9UIHZjaGlxX29wdGlvbjsKKwlzd2l0Y2ggKG9wdGlvbikgeworCWNhc2UgVkNISV9TRVJWSUNFX09QVElPTl9UUkFDRToKKwkJdmNoaXFfb3B0aW9uID0gVkNISVFfU0VSVklDRV9PUFRJT05fVFJBQ0U7CisJCWJyZWFrOworCWNhc2UgVkNISV9TRVJWSUNFX09QVElPTl9TWU5DSFJPTk9VUzoKKwkJdmNoaXFfb3B0aW9uID0gVkNISVFfU0VSVklDRV9PUFRJT05fU1lOQ0hST05PVVM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlcnZpY2UgPSBOVUxMOworCQlicmVhazsKKwl9CisJaWYgKHNlcnZpY2UpIHsKKwkJVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0KKwkJCXZjaGlxX3NldF9zZXJ2aWNlX29wdGlvbihzZXJ2aWNlLT5oYW5kbGUsCisJCQkJCQl2Y2hpcV9vcHRpb24sCisJCQkJCQl2YWx1ZSk7CisKKwkJcmV0ID0gdmNoaXFfc3RhdHVzX3RvX3ZjaGkoc3RhdHVzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9zZXJ2aWNlX3NldF9vcHRpb24pOworCitpbnQzMl90IHZjaGlfZ2V0X3BlZXJfdmVyc2lvbiggY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSwgc2hvcnQgKnBlZXJfdmVyc2lvbiApCit7CisgICBpbnQzMl90IHJldCA9IC0xOworICAgU0hJTV9TRVJWSUNFX1QgKnNlcnZpY2UgPSAoU0hJTV9TRVJWSUNFX1QgKiloYW5kbGU7CisgICBpZihzZXJ2aWNlKQorICAgeworICAgICAgVkNISVFfU1RBVFVTX1Qgc3RhdHVzID0gdmNoaXFfZ2V0X3BlZXJfdmVyc2lvbihzZXJ2aWNlLT5oYW5kbGUsIHBlZXJfdmVyc2lvbik7CisgICAgICByZXQgPSB2Y2hpcV9zdGF0dXNfdG9fdmNoaSggc3RhdHVzICk7CisgICB9CisgICByZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX2dldF9wZWVyX3ZlcnNpb24pOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiByZWFkIGEgdWludDMyX3QgZnJvbSBidWZmZXIuCisgKiBuZXR3b3JrIGZvcm1hdCBpcyBkZWZpbmVkIHRvIGJlIGxpdHRsZSBlbmRpYW4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCit1aW50MzJfdAordmNoaV9yZWFkYnVmX3VpbnQzMihjb25zdCB2b2lkICpfcHRyKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0ciA9IF9wdHI7CisJcmV0dXJuIHB0clswXSB8IChwdHJbMV0gPDwgOCkgfCAocHRyWzJdIDw8IDE2KSB8IChwdHJbM10gPDwgMjQpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB3cml0ZSBhIHVpbnQzMl90IHRvIGJ1ZmZlci4KKyAqIG5ldHdvcmsgZm9ybWF0IGlzIGRlZmluZWQgdG8gYmUgbGl0dGxlIGVuZGlhbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQKK3ZjaGlfd3JpdGVidWZfdWludDMyKHZvaWQgKl9wdHIsIHVpbnQzMl90IHZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IF9wdHI7CisJcHRyWzBdID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiAwKSAgJiAweEZGKTsKKwlwdHJbMV0gPSAodW5zaWduZWQgY2hhcikoKHZhbHVlID4+IDgpICAmIDB4RkYpOworCXB0clsyXSA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgPj4gMTYpICYgMHhGRik7CisJcHRyWzNdID0gKHVuc2lnbmVkIGNoYXIpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcmVhZCBhIHVpbnQxNl90IGZyb20gYnVmZmVyLgorICogbmV0d29yayBmb3JtYXQgaXMgZGVmaW5lZCB0byBiZSBsaXR0bGUgZW5kaWFuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwordWludDE2X3QKK3ZjaGlfcmVhZGJ1Zl91aW50MTYoY29uc3Qgdm9pZCAqX3B0cikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwdHIgPSBfcHRyOworCXJldHVybiBwdHJbMF0gfCAocHRyWzFdIDw8IDgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB3cml0ZSBhIHVpbnQxNl90IGludG8gdGhlIGJ1ZmZlci4KKyAqIG5ldHdvcmsgZm9ybWF0IGlzIGRlZmluZWQgdG8gYmUgbGl0dGxlIGVuZGlhbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3ZvaWQKK3ZjaGlfd3JpdGVidWZfdWludDE2KHZvaWQgKl9wdHIsIHVpbnQxNl90IHZhbHVlKQoreworCXVuc2lnbmVkIGNoYXIgKnB0ciA9IF9wdHI7CisJcHRyWzBdID0gKHZhbHVlID4+IDApICAmIDB4RkY7CisJcHRyWzFdID0gKHZhbHVlID4+IDgpICAmIDB4RkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9zZXJ2aWNlX3VzZQorICoKKyAqIEFyZ3VtZW50czogY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZQorICoKKyAqIERlc2NyaXB0aW9uOiBSb3V0aW5lIHRvIGluY3JlbWVudCByZWZjb3VudCBvbiBhIHNlcnZpY2UKKyAqCisgKiBSZXR1cm5zOiB2b2lkCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCB2Y2hpX3NlcnZpY2VfdXNlKGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUpCit7CisJaW50MzJfdCByZXQgPSAtMTsKKwlTSElNX1NFUlZJQ0VfVCAqc2VydmljZSA9IChTSElNX1NFUlZJQ0VfVCAqKWhhbmRsZTsKKwlpZiAoc2VydmljZSkKKwkJcmV0ID0gdmNoaXFfc3RhdHVzX3RvX3ZjaGkodmNoaXFfdXNlX3NlcnZpY2Uoc2VydmljZS0+aGFuZGxlKSk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodmNoaV9zZXJ2aWNlX3VzZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTmFtZTogdmNoaV9zZXJ2aWNlX3JlbGVhc2UKKyAqCisgKiBBcmd1bWVudHM6IGNvbnN0IFZDSElfU0VSVklDRV9IQU5ETEVfVCBoYW5kbGUKKyAqCisgKiBEZXNjcmlwdGlvbjogUm91dGluZSB0byBkZWNyZW1lbnQgcmVmY291bnQgb24gYSBzZXJ2aWNlCisgKgorICogUmV0dXJuczogdm9pZAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgdmNoaV9zZXJ2aWNlX3JlbGVhc2UoY29uc3QgVkNISV9TRVJWSUNFX0hBTkRMRV9UIGhhbmRsZSkKK3sKKwlpbnQzMl90IHJldCA9IC0xOworCVNISU1fU0VSVklDRV9UICpzZXJ2aWNlID0gKFNISU1fU0VSVklDRV9UICopaGFuZGxlOworCWlmIChzZXJ2aWNlKQorCQlyZXQgPSB2Y2hpcV9zdGF0dXNfdG9fdmNoaSgKKwkJCXZjaGlxX3JlbGVhc2Vfc2VydmljZShzZXJ2aWNlLT5oYW5kbGUpKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh2Y2hpX3NlcnZpY2VfcmVsZWFzZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3V0aWwuYyBiL2RyaXZlcnMvc3RhZ2luZy92YzA0X3NlcnZpY2VzL2ludGVyZmFjZS92Y2hpcV9hcm0vdmNoaXFfdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NGFjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3V0aWwuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgInZjaGlxX3V0aWwuaCIKKyNpbmNsdWRlICJ2Y2hpcV9raWxsYWJsZS5oIgorCitzdGF0aWMgaW5saW5lIGludCBpc19wb3cyKGludCBpKQoreworCXJldHVybiBpICYmICEoaSAmIChpIC0gMSkpOworfQorCitpbnQgdmNoaXVfcXVldWVfaW5pdChWQ0hJVV9RVUVVRV9UICpxdWV1ZSwgaW50IHNpemUpCit7CisJV0FSTl9PTighaXNfcG93MihzaXplKSk7CisKKwlxdWV1ZS0+c2l6ZSA9IHNpemU7CisJcXVldWUtPnJlYWQgPSAwOworCXF1ZXVlLT53cml0ZSA9IDA7CisJcXVldWUtPmluaXRpYWxpemVkID0gMTsKKworCXNlbWFfaW5pdCgmcXVldWUtPnBvcCwgMCk7CisJc2VtYV9pbml0KCZxdWV1ZS0+cHVzaCwgMCk7CisKKwlxdWV1ZS0+c3RvcmFnZSA9IGt6YWxsb2Moc2l6ZSAqIHNpemVvZihWQ0hJUV9IRUFERVJfVCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHF1ZXVlLT5zdG9yYWdlID09IE5VTEwpIHsKKwkJdmNoaXVfcXVldWVfZGVsZXRlKHF1ZXVlKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCit2b2lkIHZjaGl1X3F1ZXVlX2RlbGV0ZShWQ0hJVV9RVUVVRV9UICpxdWV1ZSkKK3sKKwlpZiAocXVldWUtPnN0b3JhZ2UgIT0gTlVMTCkKKwkJa2ZyZWUocXVldWUtPnN0b3JhZ2UpOworfQorCitpbnQgdmNoaXVfcXVldWVfaXNfZW1wdHkoVkNISVVfUVVFVUVfVCAqcXVldWUpCit7CisJcmV0dXJuIHF1ZXVlLT5yZWFkID09IHF1ZXVlLT53cml0ZTsKK30KKworaW50IHZjaGl1X3F1ZXVlX2lzX2Z1bGwoVkNISVVfUVVFVUVfVCAqcXVldWUpCit7CisJcmV0dXJuIHF1ZXVlLT53cml0ZSA9PSBxdWV1ZS0+cmVhZCArIHF1ZXVlLT5zaXplOworfQorCit2b2lkIHZjaGl1X3F1ZXVlX3B1c2goVkNISVVfUVVFVUVfVCAqcXVldWUsIFZDSElRX0hFQURFUl9UICpoZWFkZXIpCit7CisJaWYgKCFxdWV1ZS0+aW5pdGlhbGl6ZWQpCisJCXJldHVybjsKKworCXdoaWxlIChxdWV1ZS0+d3JpdGUgPT0gcXVldWUtPnJlYWQgKyBxdWV1ZS0+c2l6ZSkgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZxdWV1ZS0+cG9wKSAhPSAwKSB7CisJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCQl9CisJfQorCisJLyoKKwkgKiBXcml0ZSB0byBxdWV1ZS0+c3RvcmFnZSBtdXN0IGJlIHZpc2libGUgYWZ0ZXIgcmVhZCBmcm9tCisJICogcXVldWUtPnJlYWQKKwkgKi8KKwlzbXBfbWIoKTsKKworCXF1ZXVlLT5zdG9yYWdlW3F1ZXVlLT53cml0ZSAmIChxdWV1ZS0+c2l6ZSAtIDEpXSA9IGhlYWRlcjsKKworCS8qCisJICogV3JpdGUgdG8gcXVldWUtPnN0b3JhZ2UgbXVzdCBiZSB2aXNpYmxlIGJlZm9yZSB3cml0ZSB0bworCSAqIHF1ZXVlLT53cml0ZQorCSAqLworCXNtcF93bWIoKTsKKworCXF1ZXVlLT53cml0ZSsrOworCisJdXAoJnF1ZXVlLT5wdXNoKTsKK30KKworVkNISVFfSEVBREVSX1QgKnZjaGl1X3F1ZXVlX3BlZWsoVkNISVVfUVVFVUVfVCAqcXVldWUpCit7CisJd2hpbGUgKHF1ZXVlLT53cml0ZSA9PSBxdWV1ZS0+cmVhZCkgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZxdWV1ZS0+cHVzaCkgIT0gMCkgeworCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwkJfQorCX0KKworCXVwKCZxdWV1ZS0+cHVzaCk7IC8vIFdlIGhhdmVuJ3QgcmVtb3ZlZCBhbnl0aGluZyBmcm9tIHRoZSBxdWV1ZS4KKworCS8qCisJICogUmVhZCBmcm9tIHF1ZXVlLT5zdG9yYWdlIG11c3QgYmUgdmlzaWJsZSBhZnRlciByZWFkIGZyb20KKwkgKiBxdWV1ZS0+d3JpdGUKKwkgKi8KKwlzbXBfcm1iKCk7CisKKwlyZXR1cm4gcXVldWUtPnN0b3JhZ2VbcXVldWUtPnJlYWQgJiAocXVldWUtPnNpemUgLSAxKV07Cit9CisKK1ZDSElRX0hFQURFUl9UICp2Y2hpdV9xdWV1ZV9wb3AoVkNISVVfUVVFVUVfVCAqcXVldWUpCit7CisJVkNISVFfSEVBREVSX1QgKmhlYWRlcjsKKworCXdoaWxlIChxdWV1ZS0+d3JpdGUgPT0gcXVldWUtPnJlYWQpIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmcXVldWUtPnB1c2gpICE9IDApIHsKKwkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFJlYWQgZnJvbSBxdWV1ZS0+c3RvcmFnZSBtdXN0IGJlIHZpc2libGUgYWZ0ZXIgcmVhZCBmcm9tCisJICogcXVldWUtPndyaXRlCisJICovCisJc21wX3JtYigpOworCisJaGVhZGVyID0gcXVldWUtPnN0b3JhZ2VbcXVldWUtPnJlYWQgJiAocXVldWUtPnNpemUgLSAxKV07CisKKwkvKgorCSAqIFJlYWQgZnJvbSBxdWV1ZS0+c3RvcmFnZSBtdXN0IGJlIHZpc2libGUgYmVmb3JlIHdyaXRlIHRvCisJICogcXVldWUtPnJlYWQKKwkgKi8KKwlzbXBfbWIoKTsKKworCXF1ZXVlLT5yZWFkKys7CisKKwl1cCgmcXVldWUtPnBvcCk7CisKKwlyZXR1cm4gaGVhZGVyOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV91dGlsLmggYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDU1ZDRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV91dGlsLmgKQEAgLTAsMCArMSw4MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWQ0hJUV9VVElMX0gKKyNkZWZpbmUgVkNISVFfVVRJTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4gIC8qIGZvciB0aW1lX3QgKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSAidmNoaXFfaWYuaCIKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBzaXplOworCWludCByZWFkOworCWludCB3cml0ZTsKKwlpbnQgaW5pdGlhbGl6ZWQ7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHBvcDsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHB1c2g7CisKKwlWQ0hJUV9IRUFERVJfVCAqKnN0b3JhZ2U7Cit9IFZDSElVX1FVRVVFX1Q7CisKK2V4dGVybiBpbnQgIHZjaGl1X3F1ZXVlX2luaXQoVkNISVVfUVVFVUVfVCAqcXVldWUsIGludCBzaXplKTsKK2V4dGVybiB2b2lkIHZjaGl1X3F1ZXVlX2RlbGV0ZShWQ0hJVV9RVUVVRV9UICpxdWV1ZSk7CisKK2V4dGVybiBpbnQgdmNoaXVfcXVldWVfaXNfZW1wdHkoVkNISVVfUVVFVUVfVCAqcXVldWUpOworZXh0ZXJuIGludCB2Y2hpdV9xdWV1ZV9pc19mdWxsKFZDSElVX1FVRVVFX1QgKnF1ZXVlKTsKKworZXh0ZXJuIHZvaWQgdmNoaXVfcXVldWVfcHVzaChWQ0hJVV9RVUVVRV9UICpxdWV1ZSwgVkNISVFfSEVBREVSX1QgKmhlYWRlcik7CisKK2V4dGVybiBWQ0hJUV9IRUFERVJfVCAqdmNoaXVfcXVldWVfcGVlayhWQ0hJVV9RVUVVRV9UICpxdWV1ZSk7CitleHRlcm4gVkNISVFfSEVBREVSX1QgKnZjaGl1X3F1ZXVlX3BvcChWQ0hJVV9RVUVVRV9UICpxdWV1ZSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV92ZXJzaW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvdmMwNF9zZXJ2aWNlcy9pbnRlcmZhY2UvdmNoaXFfYXJtL3ZjaGlxX3ZlcnNpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmJmYTIxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZjMDRfc2VydmljZXMvaW50ZXJmYWNlL3ZjaGlxX2FybS92Y2hpcV92ZXJzaW9uLmMKQEAgLTAsMCArMSw1OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMiBCcm9hZGNvbS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG1heSBub3QgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCisgKiBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlICJ2Y2hpcV9idWlsZF9pbmZvLmgiCisjaW5jbHVkZSA8bGludXgvYnJvYWRjb20vdmNfZGVidWdfc3ltLmg+CisKK1ZDX0RFQlVHX0RFQ0xBUkVfU1RSSU5HX1ZBUiggdmNoaXFfYnVpbGRfaG9zdG5hbWUsICJkYzQtYXJtLTAxIiApOworVkNfREVCVUdfREVDTEFSRV9TVFJJTkdfVkFSKCB2Y2hpcV9idWlsZF92ZXJzaW9uLCAiOTI0NWI0YzM1Yjk5YjM4NzBlMWY3ZGM1OThjNTY5MmIzYzY2YTZmMCAodGFpbnRlZCkiICk7CitWQ19ERUJVR19ERUNMQVJFX1NUUklOR19WQVIoIHZjaGlxX2J1aWxkX3RpbWUsICAgIF9fVElNRV9fICk7CitWQ19ERUJVR19ERUNMQVJFX1NUUklOR19WQVIoIHZjaGlxX2J1aWxkX2RhdGUsICAgIF9fREFURV9fICk7CisKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF9ob3N0bmFtZSggdm9pZCApCit7CisgICByZXR1cm4gdmNoaXFfYnVpbGRfaG9zdG5hbWU7Cit9CisKK2NvbnN0IGNoYXIgKnZjaGlxX2dldF9idWlsZF92ZXJzaW9uKCB2b2lkICkKK3sKKyAgIHJldHVybiB2Y2hpcV9idWlsZF92ZXJzaW9uOworfQorCitjb25zdCBjaGFyICp2Y2hpcV9nZXRfYnVpbGRfZGF0ZSggdm9pZCApCit7CisgICByZXR1cm4gdmNoaXFfYnVpbGRfZGF0ZTsKK30KKworY29uc3QgY2hhciAqdmNoaXFfZ2V0X2J1aWxkX3RpbWUoIHZvaWQgKQoreworICAgcmV0dXJuIHZjaGlxX2J1aWxkX3RpbWU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3BpbzJfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV9waW8yX2NvcmUuYwppbmRleCAyOGE0NTY4Li44ZTY2YTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3BpbzJfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfcGlvMl9jb3JlLmMKQEAgLTQ2NiwyMyArNDY2LDIzIEBACiAKIC8qIFRoZXNlIGFyZSByZXF1aXJlZCBmb3IgZWFjaCBib2FyZCAqLwogTU9EVUxFX1BBUk1fREVTQyhidXMsICJFbnVtZXJhdGlvbiBvZiBWTUVidXMgdG8gd2hpY2ggdGhlIGJvYXJkIGlzIGNvbm5lY3RlZCIpOwotbW9kdWxlX3BhcmFtX2FycmF5KGJ1cywgaW50LCAmYnVzX251bSwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW1fYXJyYXkoYnVzLCBpbnQsICZidXNfbnVtLCAwNDQ0KTsKIAogTU9EVUxFX1BBUk1fREVTQyhiYXNlLCAiQmFzZSBWTUUgYWRkcmVzcyBmb3IgUElPMiBSZWdpc3RlcnMiKTsKLW1vZHVsZV9wYXJhbV9hcnJheShiYXNlLCBsb25nLCAmYmFzZV9udW0sIFNfSVJVR08pOworbW9kdWxlX3BhcmFtX2FycmF5KGJhc2UsIGxvbmcsICZiYXNlX251bSwgMDQ0NCk7CiAKIE1PRFVMRV9QQVJNX0RFU0ModmVjdG9yLCAiVk1FIElSUSBWZWN0b3IgKExvd2VyIDQgYml0cyBtYXNrZWQpIik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkodmVjdG9yLCBpbnQsICZ2ZWN0b3JfbnVtLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbV9hcnJheSh2ZWN0b3IsIGludCwgJnZlY3Rvcl9udW0sIDA0NDQpOwogCiBNT0RVTEVfUEFSTV9ERVNDKGxldmVsLCAiVk1FIElSUSBMZXZlbCIpOwotbW9kdWxlX3BhcmFtX2FycmF5KGxldmVsLCBpbnQsICZsZXZlbF9udW0sIFNfSVJVR08pOworbW9kdWxlX3BhcmFtX2FycmF5KGxldmVsLCBpbnQsICZsZXZlbF9udW0sIDA0NDQpOwogCiBNT0RVTEVfUEFSTV9ERVNDKHZhcmlhbnQsICJMYXN0IDQgY2hhcmFjdGVycyBvZiBQSU8yIGJvYXJkIHZhcmlhbnQiKTsKLW1vZHVsZV9wYXJhbV9hcnJheSh2YXJpYW50LCBjaGFycCwgJnZhcmlhbnRfbnVtLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbV9hcnJheSh2YXJpYW50LCBjaGFycCwgJnZhcmlhbnRfbnVtLCAwNDQ0KTsKIAogLyogVGhpcyBpcyBmb3IgZGVidWdnaW5nICovCiBNT0RVTEVfUEFSTV9ERVNDKGxvb3BiYWNrLCAiRW5hYmxlIGxvb3BiYWNrIG1vZGUgb24gYWxsIGNhcmRzIik7Ci1tb2R1bGVfcGFyYW0obG9vcGJhY2ssIGJvb2wsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtKGxvb3BiYWNrLCBib29sLCAwNDQ0KTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJHRSBQSU8yIDZVIFZNRSBJL08gRHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJ0eW4gV2VsY2ggPG1hcnR5bi53ZWxjaEBnZS5jb20iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKaW5kZXggYjk1ODgzYi4uNWRkNDMwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMKQEAgLTc3Myw3ICs3NzMsNyBAQAogfQogCiBNT0RVTEVfUEFSTV9ERVNDKGJ1cywgIkVudW1lcmF0aW9uIG9mIFZNRWJ1cyB0byB3aGljaCB0aGUgZHJpdmVyIGlzIGNvbm5lY3RlZCIpOwotbW9kdWxlX3BhcmFtX2FycmF5KGJ1cywgaW50LCAmYnVzX251bSwgMCk7Cittb2R1bGVfcGFyYW1fYXJyYXkoYnVzLCBpbnQsICZidXNfbnVtLCAwMDAwKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJWTUUgVXNlciBTcGFjZSBBY2Nlc3MgRHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJ0eW4gV2VsY2ggPG1hcnR5bi53ZWxjaEBnZS5jb20iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYmFzZWJhbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYmFzZWJhbmQuYwppbmRleCA2NTRkMDcyLi5kZTUwM2EzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jhc2ViYW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9iYXNlYmFuZC5jCkBAIC0xNzI5LDcgKzE3MjksNyBAQAogCXVuc2lnbmVkIGludCB1RnJhbWVUaW1lOwogCXVuc2lnbmVkIGludCB1UHJlYW1ibGU7CiAJdW5zaWduZWQgaW50IHVUbXA7Ci0JdW5zaWduZWQgaW50IHVSYXRlSWR4ID0gKHVuc2lnbmVkIGludCkgd1JhdGU7CisJdW5zaWduZWQgaW50IHVSYXRlSWR4ID0gKHVuc2lnbmVkIGludCl3UmF0ZTsKIAl1bnNpZ25lZCBpbnQgdVJhdGUgPSAwOwogCiAJaWYgKHVSYXRlSWR4ID4gUkFURV81NE0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NhcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5jCmluZGV4IGFmYjFlOGIuLmRiY2VhNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2FyZC5jCkBAIC02MTksNyArNjE5LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBDQVJEd0dldENDS0NvbnRyb2xSYXRlKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJICAgICB1bnNpZ25lZCBzaG9ydCB3UmF0ZUlkeCkKIHsKLQl1bnNpZ25lZCBpbnQgdWkgPSAodW5zaWduZWQgaW50KSB3UmF0ZUlkeDsKKwl1bnNpZ25lZCBpbnQgdWkgPSAodW5zaWduZWQgaW50KXdSYXRlSWR4OwogCiAJd2hpbGUgKHVpID4gUkFURV8xTSkgewogCQlpZiAocHJpdi0+YmFzaWNfcmF0ZXMgJiAoKHUzMikweDEgPDwgdWkpKQpAQCAtNjQ1LDcgKzY0NSw3IEBACiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgQ0FSRHdHZXRPRkRNQ29udHJvbFJhdGUoc3RydWN0IHZudF9wcml2YXRlICpwcml2LAogCQkJCQkgICAgICB1bnNpZ25lZCBzaG9ydCB3UmF0ZUlkeCkKIHsKLQl1bnNpZ25lZCBpbnQgdWkgPSAodW5zaWduZWQgaW50KSB3UmF0ZUlkeDsKKwl1bnNpZ25lZCBpbnQgdWkgPSAodW5zaWduZWQgaW50KXdSYXRlSWR4OwogCiAJcHJfZGVidWcoIkJBU0lDIFJBVEU6ICVYXG4iLCBwcml2LT5iYXNpY19yYXRlcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jaGFubmVsLmMKaW5kZXggYjdkNDNhNS4uMDI5YThkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jaGFubmVsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9jaGFubmVsLmMKQEAgLTE5Myw3ICsxOTMsOCBAQAogCU1BQ3ZSZWdCaXRzT24ocHJpdi0+UG9ydE9mZnNldCwgTUFDX1JFR19NQUNDUiwgTUFDQ1JfQ0xSTkFWKTsKIAogCS8qIFRYX1BFIHdpbGwgcmVzZXJ2ZSAzIHVzIGZvciBNQVgyODI5IEEgbW9kZSBvbmx5LAotCSAgIGl0IGlzIGZvciBiZXR0ZXIgVFggdGhyb3VnaHB1dCAqLworCSAqIGl0IGlzIGZvciBiZXR0ZXIgVFggdGhyb3VnaHB1dAorCSAqLwogCiAJaWYgKHByaXYtPmJ5UkZUeXBlID09IFJGX0FJUk9IQTcyMzApCiAJCVJGYkFMNzIzMFNlbGVjdENoYW5uZWxQb3N0UHJvY2Vzcyhwcml2LCBwcml2LT5ieUN1cnJlbnRDaCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYwppbmRleCA0OTQxNjQwLi5mMTA5ZWVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2VfbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYwpAQCAtMTEzLDEwICsxMTMsMTAgQEAKIERFVklDRV9QQVJBTShMb25nUmV0cnlMaW1pdCwgImxvbmcgZnJhbWUgcmV0cnkgbGltaXRzIik7CiAKIC8qIEJhc2ViYW5kVHlwZVtdIGJhc2ViYW5kIHR5cGUgc2VsZWN0ZWQKLSAgIDA6IGluZGljYXRlIDgwMi4xMWEgdHlwZQotICAgMTogaW5kaWNhdGUgODAyLjExYiB0eXBlCi0gICAyOiBpbmRpY2F0ZSA4MDIuMTFnIHR5cGUKLSovCisgKiAwOiBpbmRpY2F0ZSA4MDIuMTFhIHR5cGUKKyAqIDE6IGluZGljYXRlIDgwMi4xMWIgdHlwZQorICogMjogaW5kaWNhdGUgODAyLjExZyB0eXBlCisgKi8KICNkZWZpbmUgQkJQX1RZUEVfTUlOICAgICAwCiAjZGVmaW5lIEJCUF9UWVBFX01BWCAgICAgMgogI2RlZmluZSBCQlBfVFlQRV9ERUYgICAgIDIKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCQkJCQkgICAgIENCX01BWF9CVUZfU0laRSwKIAkJCQkJICAgICAmcHJpdi0+dHhfYnVmc19kbWEwLAogCQkJCQkgICAgIEdGUF9BVE9NSUMpOwotCWlmIChwcml2LT50eDBfYnVmcyA9PSBOVUxMKSB7CisJaWYgKCFwcml2LT50eDBfYnVmcykgewogCQlkZXZfZXJyKCZwcml2LT5wY2lkLT5kZXYsICJhbGxvY2F0ZSBidWYgZG1hIG1lbW9yeSBmYWlsZWRcbiIpOwogCiAJCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lkLT5kZXYsCkBAIC03MzUsNyArNzM1LDcgQEAKIAlzdHJ1Y3Qgdm50X3JkX2luZm8gKnJkX2luZm8gPSByZC0+cmRfaW5mbzsKIAogCXJkX2luZm8tPnNrYiA9IGRldl9hbGxvY19za2IoKGludClwcml2LT5yeF9idWZfc3opOwotCWlmIChyZF9pbmZvLT5za2IgPT0gTlVMTCkKKwlpZiAoIXJkX2luZm8tPnNrYikKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmRfaW5mby0+c2tiX2RtYSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuYwppbmRleCBmZmNhZjI1Li5lMTYxZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmMKQEAgLTMxLDE2ICszMSw2IEBACiAjaW5jbHVkZSAia2V5LmgiCiAjaW5jbHVkZSAibWFjLmgiCiAKLWludCB2bnRfa2V5X2luaXRfdGFibGUoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQotewotCXUzMiBpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9LRVlfVEFCTEU7IGkrKykKLQkJTUFDdkRpc2FibGVLZXlFbnRyeShwcml2LCBpKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHZudF9zZXRfa2V5bW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKm1hY19hZGRyLAogCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwgdTMyIGtleV90eXBlLCB1MzIgbW9kZSwKIAlib29sIG9uZmx5X2xhdGNoKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmgKaW5kZXggMjYxZjgxOC4uZDcyNzE5NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuaApAQCAtNjEsOCArNjEsNiBAQAogCiBzdHJ1Y3Qgdm50X3ByaXZhdGU7CiAKLWludCB2bnRfa2V5X2luaXRfdGFibGUoc3RydWN0IHZudF9wcml2YXRlICopOwotCiBpbnQgdm50X3NldF9rZXlzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAogCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9wb3dlci5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9wb3dlci5jCmluZGV4IGJjOGNhOTguLjdkNmU3NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcG93ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3Bvd2VyLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyorCisvKgogICoKICAqIFJvdXRpbmUgRGVzY3JpcHRpb246CiAgKiBFbmFibGUgaHcgcG93ZXIgc2F2aW5nIGZ1bmN0aW9ucwpAQCAtNjAsNyArNjAsNyBAQAogICogUmV0dXJuIFZhbHVlOgogICogICAgTm9uZS4KICAqCi0gLSovCisgKi8KIAogdm9pZAogUFN2RW5hYmxlUG93ZXJTYXZpbmcoCkBAIC0xMDQsNyArMTA0LDcgQEAKIAlwcl9kZWJ1ZygiUFM6UG93ZXIgU2F2aW5nIE1vZGUgRW5hYmxlLi4uXG4iKTsKIH0KIAotLyorCisvKgogICoKICAqIFJvdXRpbmUgRGVzY3JpcHRpb246CiAgKiBEaXNhYmxlIGh3IHBvd2VyIHNhdmluZyBmdW5jdGlvbnMKQEAgLTExMiw3ICsxMTIsNyBAQAogICogUmV0dXJuIFZhbHVlOgogICogICAgTm9uZS4KICAqCi0gLSovCisgKi8KIAogdm9pZAogUFN2RGlzYWJsZVBvd2VyU2F2aW5nKApAQCAtMTM0LDcgKzEzNCw3IEBACiB9CiAKIAotLyorCisvKgogICoKICAqIFJvdXRpbmUgRGVzY3JpcHRpb246CiAgKiBDaGVjayBpZiBOZXh0IFRCVFQgbXVzdCB3YWtlIHVwCkBAIC0xNDIsNyArMTQyLDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgIE5vbmUuCiAgKgotIC0qLworICovCiAKIGJvb2wKIFBTYklzTmV4dFRCVFRXYWtlVXAoCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JmLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JmLmMKaW5kZXggYWUxMGRhMi4uNDQ3ODgyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcmYuYwpAQCAtMTY5LDcgKzE2OSw4IEBACiB9OwogCiAvKiA0ME1IeiByZWZlcmVuY2UgZnJlcXVlbmN5Ci0gKiBOZWVkIHRvIFB1bGwgUExMT04oUEUzKSBsb3cgd2hlbiB3cml0aW5nIGNoYW5uZWwgcmVnaXN0ZXJzIHRocm91Z2ggMy13aXJlLiovCisgKiBOZWVkIHRvIFB1bGwgUExMT04oUEUzKSBsb3cgd2hlbiB3cml0aW5nIGNoYW5uZWwgcmVnaXN0ZXJzIHRocm91Z2ggMy13aXJlLgorICovCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBkd0FMNzIzMEluaXRUYWJsZVtDQl9BTDcyMzBfSU5JVF9TRVFdID0gewogCTB4MDAzNzkwMDArKEJZX0FMNzIzMF9SRUdfTEVOPDwzKStJRlJFR0NUTF9SRUdXLCAvKiBDaGFubmVsMSAvLyBOZWVkIG1vZGlmeSBmb3IgMTFhICovCiAJMHgxMzMzMzEwMCsoQllfQUw3MjMwX1JFR19MRU48PDMpK0lGUkVHQ1RMX1JFR1csIC8qIENoYW5uZWwxIC8vIE5lZWQgbW9kaWZ5IGZvciAxMWEgKi8KQEAgLTQ2Myw3ICs0NjQsOCBAQAogfQogCiAvKiBOZWVkIHRvIFB1bGwgUExMT04gbG93IHdoZW4gd3JpdGluZyBjaGFubmVsIHJlZ2lzdGVycyB0aHJvdWdoCi0gKiAzLXdpcmUgaW50ZXJmYWNlICovCisgKiAzLXdpcmUgaW50ZXJmYWNlCisgKi8KIHN0YXRpYyBib29sIHNfYkFMNzIzMFNlbGVjdENoYW5uZWwoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1bnNpZ25lZCBjaGFyIGJ5Q2hhbm5lbCkKIHsKIAl2b2lkIF9faW9tZW0gKmR3SW9CYXNlID0gcHJpdi0+UG9ydE9mZnNldDsKQEAgLTg3Myw3ICs4NzUsOCBAQAogCiAJY2FzZSBSRl9BSVJPSEE3MjMwOgogCQkvKiAweDA4MEYxQjAwIGZvciAzIHdpcmUgY29udHJvbCBUeEdhaW4oRDEwKQotCQkgKiBhbmQgMHgzMSBhcyBUWCBHYWluIHZhbHVlICovCisJCSAqIGFuZCAweDMxIGFzIFRYIEdhaW4gdmFsdWUKKwkJICovCiAJCWR3TWF4NzIzMFB3ciA9IDB4MDgwQzBCMDAgfCAoKGJ5UHdyKSA8PCAxMikgfAogCQkJKEJZX0FMNzIzMF9SRUdfTEVOIDw8IDMpICB8IElGUkVHQ1RMX1JFR1c7CiAKQEAgLTg4Niw3ICs4ODksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qKworLyoKICAqCiAgKiBSb3V0aW5lIERlc2NyaXB0aW9uOgogICogICAgIFRyYW5zbGF0ZSBSU1NJIHRvIGRCbQpAQCAtOTAwLDcgKzkwMyw3IEBACiAgKgogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgotIC0qLworICovCiB2b2lkCiBSRnZSU1NJVG9kQm0oCiAJc3RydWN0IHZudF9wcml2YXRlICpwcml2LApAQCAtOTI3LDcgKzkzMCw4IEBACiB9CiAKIC8qIFBvc3QgcHJvY2Vzc2luZyBmb3IgdGhlIDExYi9nIGFuZCAxMWEuCi0gKiBmb3Igc2F2ZSB0aW1lIG9uIGNoYW5naW5nIFJlZzIsMyw1LDcsMTAsMTIsMTUgKi8KKyAqIGZvciBzYXZlIHRpbWUgb24gY2hhbmdpbmcgUmVnMiwzLDUsNywxMCwxMiwxNQorICovCiBib29sIFJGYkFMNzIzMFNlbGVjdENoYW5uZWxQb3N0UHJvY2VzcyhzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsCiAJCQkJICAgICAgIHUxNiBieU9sZENoYW5uZWwsCiAJCQkJICAgICAgIHUxNiBieU5ld0NoYW5uZWwpCkBAIC05MzgsNyArOTQyLDggQEAKIAogCS8qIGlmIGNoYW5nZSBiZXR3ZWVuIDExIGIvZyBhbmQgMTFhIG5lZWQgdG8gdXBkYXRlIHRoZSBmb2xsb3dpbmcKIAkgKiByZWdpc3RlcgotCSAqIENoYW5uZWwgSW5kZXggMX4xNCAqLworCSAqIENoYW5uZWwgSW5kZXggMX4xNAorCSAqLwogCWlmICgoYnlPbGRDaGFubmVsIDw9IENCX01BWF9DSEFOTkVMXzI0RykgJiYgKGJ5TmV3Q2hhbm5lbCA+IENCX01BWF9DSEFOTkVMXzI0RykpIHsKIAkJLyogQ2hhbmdlIGZyb20gMi40RyB0byA1RyBbUmVnXSAqLwogCQlyZXQgJj0gSUZSRmJXcml0ZUVtYmVkZGVkKHByaXYsIGR3QUw3MjMwSW5pdFRhYmxlQU1vZGVbMl0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yeHR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYwppbmRleCBlNGMzMTY1Li43ZTY5YmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYwpAQCAtNjQsOCArNjQsMTAgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIENSSVRJQ0FMX1BBQ0tFVF9MRU4gICAgICAyNTYgICAgLyogaWYgcGFja2V0IHNpemUgPCAyNTYgLT4gaW4tZGlyZWN0IHNlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0IHNpemUgPj0gMjU2IC0+IGRpcmVjdCBzZW5kICovCisvKiBpZiBwYWNrZXQgc2l6ZSA8IDI1NiAtPiBpbi1kaXJlY3Qgc2VuZAorICogdnBhY2tldCBzaXplID49IDI1NiAtPiBkaXJlY3Qgc2VuZAorICovCisjZGVmaW5lIENSSVRJQ0FMX1BBQ0tFVF9MRU4gICAgICAyNTYKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdUaW1lU3RhbXBPZmZbMl1bTUFYX1JBVEVdID0gewogCXszODQsIDI4OCwgMjI2LCAyMDksIDU0LCA0MywgMzcsIDMxLCAyOCwgMjUsIDI0LCAyM30sIC8qIExvbmcgUHJlYW1ibGUgKi8KQEAgLTE1OCwxMSArMTYwLDExIEBACiAJCQkJCQkJW3JhdGUgJSBNQVhfUkFURV0pOwogfQogCi0vKmJ5UGt0VHlwZSA6IFBLX1RZUEVfMTFBICAgICAwCi0gIFBLX1RZUEVfMTFCICAgICAxCi0gIFBLX1RZUEVfMTFHQiAgICAyCi0gIFBLX1RZUEVfMTFHQSAgICAzCi0qLworLyogYnlQa3RUeXBlIDogUEtfVFlQRV8xMUEgICAgIDAKKyAqIFBLX1RZUEVfMTFCICAgICAxCisgKiBQS19UWVBFXzExR0IgICAgMgorICogUEtfVFlQRV8xMUdBICAgIDMKKyAqLwogc3RhdGljCiB1bnNpZ25lZCBpbnQKIHNfdUdldFR4UnN2VGltZSgKQEAgLTUwMiw3ICs1MDQsNyBAQAogKQogewogCi0JaWYgKHBUeERhdGFIZWFkID09IE5VTEwpCisJaWYgKCFwVHhEYXRhSGVhZCkKIAkJcmV0dXJuIDA7CiAKIApAQCAtNjQ2LDE3ICs2NDgsMjAgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdVJUU0ZyYW1lTGVuID0gMjA7CiAKLQlpZiAocHZSVFMgPT0gTlVMTCkKKwlpZiAoIXB2UlRTKQogCQlyZXR1cm47CiAKIAlpZiAoYkRpc0NSQykgewotCQkvKiBXaGVuIENSQ0RJUyBiaXQgaXMgb24sIEgvVyBmb3Jnb3QgdG8gZ2VuZXJhdGUgRkNTIGZvciBSVFMgZnJhbWUsCi0JCSBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZWNyZWFzZSBpdHMgbGVuZ3RoIGJ5IDQuICovCisJCS8qIFdoZW4gQ1JDRElTIGJpdCBpcyBvbiwgSC9XIGZvcmdvdCB0byBnZW5lcmF0ZSBGQ1MgZm9yCisJCSAqIFJUUyBmcmFtZSwgaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjcmVhc2UgaXRzIGxlbmd0aCBieSA0LgorCQkgKi8KIAkJdVJUU0ZyYW1lTGVuIC09IDQ7CiAJfQogCi0JLyogTm90ZTogU28gZmFyIFJUU0hlYWQgZG9lc24ndCBhcHBlYXIgaW4gQVRJTSAmIEJlYWNvbSBETUEsIHNvIHdlIGRvbid0IG5lZWQgdG8gdGFrZSB0aGVtIGludG8gYWNjb3VudC4KLQkgICAgICAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIG1vZGlmeSBjb2RlcyBmb3IgdGhlbS4gKi8KKwkvKiBOb3RlOiBTbyBmYXIgUlRTSGVhZCBkb2Vzbid0IGFwcGVhciBpbiBBVElNICYgQmVhY29tIERNQSwKKwkgKiBzbyB3ZSBkb24ndCBuZWVkIHRvIHRha2UgdGhlbSBpbnRvIGFjY291bnQuCisJICogT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIG1vZGlmeSBjb2RlcyBmb3IgdGhlbS4KKwkgKi8KIAlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7CiAJCWlmIChieUZCT3B0aW9uID09IEFVVE9fRkJfTk9ORSkgewogCQkJc3RydWN0IHZudF9ydHNfZyAqYnVmID0gcHZSVFM7CkBAIC04MzgsMTIgKzg0MywxMyBAQAogewogCXVuc2lnbmVkIGludCB1Q1RTRnJhbWVMZW4gPSAxNDsKIAotCWlmIChwdkNUUyA9PSBOVUxMKQorCWlmICghcHZDVFMpCiAJCXJldHVybjsKIAogCWlmIChiRGlzQ1JDKSB7Ci0JCS8qIFdoZW4gQ1JDRElTIGJpdCBpcyBvbiwgSC9XIGZvcmdvdCB0byBnZW5lcmF0ZSBGQ1MgZm9yIENUUyBmcmFtZSwKLQkJIGluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIGl0cyBsZW5ndGggYnkgNC4gKi8KKwkJLyogV2hlbiBDUkNESVMgYml0IGlzIG9uLCBIL1cgZm9yZ290IHRvIGdlbmVyYXRlIEZDUyBmb3IKKwkJICogQ1RTIGZyYW1lLCBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZWNyZWFzZSBpdHMgbGVuZ3RoIGJ5IDQuCisJCSAqLwogCQl1Q1RTRnJhbWVMZW4gLT0gNDsKIAl9CiAKQEAgLTkxNSw3ICs5MjEsNyBAQAogCX0KIH0KIAotLyorCisvKgogICoKICAqIERlc2NyaXB0aW9uOgogICogICAgICBHZW5lcmF0ZSBGSUZPIGNvbnRyb2wgZm9yIE1BQyAmIEJhc2ViYW5kIGNvbnRyb2xsZXIKQEAgLTkzNyw3ICs5NDMsOCBAQAogICogUmV0dXJuIFZhbHVlOiBub25lCiAgKgogIC0KLSAqIHVuc2lnbmVkIGludCBjYkZyYW1lU2l6ZSwgSGRyK1BheWxvYWQrRkNTICovCisgKiB1bnNpZ25lZCBpbnQgY2JGcmFtZVNpemUsIEhkcitQYXlsb2FkK0ZDUworICovCiBzdGF0aWMKIHZvaWQKIHNfdkdlbmVyYXRlVHhQYXJhbWV0ZXIoCkBAIC05NzIsOCArOTc5LDggQEAKIAkJcmV0dXJuOwogCiAJaWYgKGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExR0IgfHwgYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQSkgewotCQlpZiAocHZSVFMgIT0gTlVMTCkgeyAvKiBSVFNfbmVlZAotCQkJIEZpbGwgUnN2VGltZSAqLworCQlpZiAocHZSVFMgIT0gTlVMTCkgeyAvKiBSVFNfbmVlZCAqLworCQkJLyogRmlsbCBSc3ZUaW1lICovCiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX3J0cyAqYnVmID0gcHZScnZUaW1lOwogCiAJCQlidWYtPnJ0c19ycnZfdGltZV9hYSA9IHNfdUdldFJUU0NUU1JzdlRpbWUocERldmljZSwgMiwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlKTsKQEAgLTEwMDIsNyArMTAwOSw3IEBACiAKIAkJCS8qIEZpbGwgUlRTICovCiAJCQlzX3ZGaWxsUlRTSGVhZChwRGV2aWNlLCBieVBrdFR5cGUsIHB2UlRTLCBjYkZyYW1lU2l6ZSwgYk5lZWRBQ0ssIGJEaXNDUkMsIHBzRXRoSGVhZGVyLCB3Q3VycmVudFJhdGUsIGJ5RkJPcHRpb24pOwotCQl9IGVsc2UgaWYgKHB2UlRTID09IE5VTEwpIHsvKiBSVFNfbmVlZGxlc3MsIG5vbiBQQ0YgbW9kZSAqLworCQl9IGVsc2UgaWYgKCFwdlJUUykgey8qIFJUU19uZWVkbGVzcywgbm9uIFBDRiBtb2RlICovCiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiICpidWYgPSBwdlJydlRpbWU7CiAKIAkJCWJ1Zi0+cnJ2X3RpbWUgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwgUEtfVFlQRV8xMUEsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUsIGJOZWVkQUNLKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuaCBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvYmFzZWJhbmQuaAppbmRleCA4MDdhNTgwLi43Y2MxMzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Jhc2ViYW5kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9iYXNlYmFuZC5oCkBAIC04NCwxMCArODQsMTAgQEAKIH0gX19wYWNrZWQ7CiAKIHVuc2lnbmVkIGludCB2bnRfZ2V0X2ZyYW1lX3RpbWUodTggcHJlYW1ibGVfdHlwZSwgdTggcGt0X3R5cGUsCi0JdW5zaWduZWQgaW50IGZyYW1lX2xlbmd0aCwgdTE2IHR4X3JhdGUpOworCQkJCXVuc2lnbmVkIGludCBmcmFtZV9sZW5ndGgsIHUxNiB0eF9yYXRlKTsKIAogdm9pZCB2bnRfZ2V0X3BoeV9maWVsZChzdHJ1Y3Qgdm50X3ByaXZhdGUgKiwgdTMyIGZyYW1lX2xlbmd0aCwKLQl1MTYgdHhfcmF0ZSwgdTggcGt0X3R5cGUsIHN0cnVjdCB2bnRfcGh5X2ZpZWxkICopOworCQkgICAgICAgdTE2IHR4X3JhdGUsIHU4IHBrdF90eXBlLCBzdHJ1Y3Qgdm50X3BoeV9maWVsZCAqKTsKIAogdm9pZCB2bnRfc2V0X3Nob3J0X3Nsb3RfdGltZShzdHJ1Y3Qgdm50X3ByaXZhdGUgKik7CiB2b2lkIHZudF9zZXRfdmdhX2dhaW5fb2Zmc2V0KHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCB1OCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2NhcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCmluZGV4IGEzODJmYzYuLjUzYjQ2OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvY2FyZC5jCkBAIC00NiwxMCArNDYsMTEgQEAKICNpbmNsdWRlICJrZXkuaCIKICNpbmNsdWRlICJ1c2JwaXBlLmgiCiAKLS8qIGNvbnN0IHUxNiBjd1JYQkNOVFNGT2ZmW01BWF9SQVRFXSA9Ci0gICB7MTcsIDM0LCA5NiwgMTkyLCAzNCwgMjMsIDE3LCAxMSwgOCwgNSwgNCwgM307ICovCisvKiBjb25zdCB1MTYgY3dfcnhiY250c2Zfb2ZmW01BWF9SQVRFXSA9CisgKiAgIHsxNywgMzQsIDk2LCAxOTIsIDM0LCAyMywgMTcsIDExLCA4LCA1LCA0LCAzfTsKKyAqLwogCi1zdGF0aWMgY29uc3QgdTE2IGN3UlhCQ05UU0ZPZmZbTUFYX1JBVEVdID0geworc3RhdGljIGNvbnN0IHUxNiBjd19yeGJjbnRzZl9vZmZbTUFYX1JBVEVdID0gewogCTE5MiwgOTYsIDM0LCAxNywgMzQsIDIzLCAxNywgMTEsIDgsIDUsIDQsIDMKIH07CiAKQEAgLTY1LDcgKzY2LDYgQEAKICAqLwogdm9pZCB2bnRfc2V0X2NoYW5uZWwoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCB1MzIgY29ubmVjdGlvbl9jaGFubmVsKQogewotCiAJaWYgKGNvbm5lY3Rpb25fY2hhbm5lbCA+IENCX01BWF9DSEFOTkVMIHx8ICFjb25uZWN0aW9uX2NoYW5uZWwpCiAJCXJldHVybjsKIApAQCAtNzYsMTAgKzc2LDEwIEBACiAJdm50X21hY19yZWdfYml0c19vZmYocHJpdiwgTUFDX1JFR19DSEFOTkVMLCAweGIwKTsKIAogCXZudF9jb250cm9sX291dChwcml2LCBNRVNTQUdFX1RZUEVfU0VMRUNUX0NIQU5ORUwsCi0JCQkJCWNvbm5lY3Rpb25fY2hhbm5lbCwgMCwgMCwgTlVMTCk7CisJCQljb25uZWN0aW9uX2NoYW5uZWwsIDAsIDAsIE5VTEwpOwogCiAJdm50X2NvbnRyb2xfb3V0X3U4KHByaXYsIE1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsIE1BQ19SRUdfQ0hBTk5FTCwKLQkJKHU4KShjb25uZWN0aW9uX2NoYW5uZWwgfCAweDgwKSk7CisJCQkgICAodTgpKGNvbm5lY3Rpb25fY2hhbm5lbCB8IDB4ODApKTsKIH0KIAogLyoKQEAgLTEyNiwxMSArMTI2LDExIEBACiAJdTE2IHVpID0gcmF0ZV9pZHg7CiAKIAlkZXZfZGJnKCZwcml2LT51c2ItPmRldiwgIiVzIGJhc2ljIHJhdGU6ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgIHByaXYtPmJhc2ljX3JhdGVzKTsKKwkJX19mdW5jX18sICBwcml2LT5iYXNpY19yYXRlcyk7CiAKIAlpZiAoIXZudF9vZmRtX21pbl9yYXRlKHByaXYpKSB7CiAJCWRldl9kYmcoJnByaXYtPnVzYi0+ZGV2LCAiJXMgKE5PIE9GRE0pICVkXG4iLAotCQkJCQkJX19mdW5jX18sIHJhdGVfaWR4KTsKKwkJCV9fZnVuY19fLCByYXRlX2lkeCk7CiAJCWlmIChyYXRlX2lkeCA+IFJBVEVfMjRNKQogCQkJcmF0ZV9pZHggPSBSQVRFXzI0TTsKIAkJcmV0dXJuIHJhdGVfaWR4OwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJd2hpbGUgKHVpID4gUkFURV8xMU0pIHsKIAkJaWYgKHByaXYtPmJhc2ljX3JhdGVzICYgKDEgPDwgdWkpKSB7CiAJCQlkZXZfZGJnKCZwcml2LT51c2ItPmRldiwgIiVzIHJhdGU6ICVkXG4iLAotCQkJCQkJCV9fZnVuY19fLCB1aSk7CisJCQkJX19mdW5jX18sIHVpKTsKIAkJCXJldHVybiB1aTsKIAkJfQogCQl1aS0tOwpAQCAtMTY1LDkgKzE2NSw4IEBACiAgKgogICovCiBzdGF0aWMgdm9pZCB2bnRfY2FsY3VsYXRlX29mZG1fcmF0ZSh1MTYgcmF0ZSwgdTggYmJfdHlwZSwKLQkJCQkJdTggKnR4X3JhdGUsIHU4ICpyc3ZfdGltZSkKKwkJCQkgICAgdTggKnR4X3JhdGUsIHU4ICpyc3ZfdGltZSkKIHsKLQogCXN3aXRjaCAocmF0ZSkgewogCWNhc2UgUkFURV82TToKIAkJaWYgKGJiX3R5cGUgPT0gQkJfVFlQRV8xMUEpIHsKQEAgLTI2NywyMCArMjY2LDIwIEBACiAJaW50IGk7CiAKIAkvKlJTUElORl9iXzEqLwotCXZudF9nZXRfcGh5X2ZpZWxkKHByaXYsIDE0LAotCQl2bnRfZ2V0X2Nja19yYXRlKHByaXYsIFJBVEVfMU0pLCBQS19UWVBFXzExQiwgJnBoeVswXSk7CisJdm50X2dldF9waHlfZmllbGQocHJpdiwgMTQsIHZudF9nZXRfY2NrX3JhdGUocHJpdiwgUkFURV8xTSksCisJCQkgIFBLX1RZUEVfMTFCLCAmcGh5WzBdKTsKIAogCS8qUlNQSU5GX2JfMiovCi0Jdm50X2dldF9waHlfZmllbGQocHJpdiwgMTQsCi0JCXZudF9nZXRfY2NrX3JhdGUocHJpdiwgUkFURV8yTSksIFBLX1RZUEVfMTFCLCAmcGh5WzFdKTsKKwl2bnRfZ2V0X3BoeV9maWVsZChwcml2LCAxNCwgdm50X2dldF9jY2tfcmF0ZShwcml2LCBSQVRFXzJNKSwKKwkJCSAgUEtfVFlQRV8xMUIsICZwaHlbMV0pOwogCiAJLypSU1BJTkZfYl81Ki8KLQl2bnRfZ2V0X3BoeV9maWVsZChwcml2LCAxNCwKLQkJdm50X2dldF9jY2tfcmF0ZShwcml2LCBSQVRFXzVNKSwgUEtfVFlQRV8xMUIsICZwaHlbMl0pOworCXZudF9nZXRfcGh5X2ZpZWxkKHByaXYsIDE0LCB2bnRfZ2V0X2Nja19yYXRlKHByaXYsIFJBVEVfNU0pLAorCQkJICBQS19UWVBFXzExQiwgJnBoeVsyXSk7CiAKIAkvKlJTUElORl9iXzExKi8KLQl2bnRfZ2V0X3BoeV9maWVsZChwcml2LCAxNCwKLQkJdm50X2dldF9jY2tfcmF0ZShwcml2LCBSQVRFXzExTSksIFBLX1RZUEVfMTFCLCAmcGh5WzNdKTsKKwl2bnRfZ2V0X3BoeV9maWVsZChwcml2LCAxNCwgdm50X2dldF9jY2tfcmF0ZShwcml2LCBSQVRFXzExTSksCisJCQkgIFBLX1RZUEVfMTFCLCAmcGh5WzNdKTsKIAogCS8qUlNQSU5GX2FfNiovCiAJdm50X2NhbGN1bGF0ZV9vZmRtX3JhdGUoUkFURV82TSwgYmJfdHlwZSwgJnR4X3JhdGVbMF0sICZyc3ZfdGltZVswXSk7CkBAIC0yOTksMTkgKzI5OCwxOSBAQAogCiAJLypSU1BJTkZfYV8zNiovCiAJdm50X2NhbGN1bGF0ZV9vZmRtX3JhdGUodm50X2dldF9vZmRtX3JhdGUocHJpdiwgUkFURV8zNk0pLAotCQkJCQliYl90eXBlLCAmdHhfcmF0ZVs1XSwgJnJzdl90aW1lWzVdKTsKKwkJCQliYl90eXBlLCAmdHhfcmF0ZVs1XSwgJnJzdl90aW1lWzVdKTsKIAogCS8qUlNQSU5GX2FfNDgqLwogCXZudF9jYWxjdWxhdGVfb2ZkbV9yYXRlKHZudF9nZXRfb2ZkbV9yYXRlKHByaXYsIFJBVEVfNDhNKSwKLQkJCQkJYmJfdHlwZSwgJnR4X3JhdGVbNl0sICZyc3ZfdGltZVs2XSk7CisJCQkJYmJfdHlwZSwgJnR4X3JhdGVbNl0sICZyc3ZfdGltZVs2XSk7CiAKIAkvKlJTUElORl9hXzU0Ki8KIAl2bnRfY2FsY3VsYXRlX29mZG1fcmF0ZSh2bnRfZ2V0X29mZG1fcmF0ZShwcml2LCBSQVRFXzU0TSksCi0JCQkJCWJiX3R5cGUsICZ0eF9yYXRlWzddLCAmcnN2X3RpbWVbN10pOworCQkJCWJiX3R5cGUsICZ0eF9yYXRlWzddLCAmcnN2X3RpbWVbN10pOwogCiAJLypSU1BJTkZfYV83MiovCiAJdm50X2NhbGN1bGF0ZV9vZmRtX3JhdGUodm50X2dldF9vZmRtX3JhdGUocHJpdiwgUkFURV81NE0pLAotCQkJCQliYl90eXBlLCAmdHhfcmF0ZVs4XSwgJnJzdl90aW1lWzhdKTsKKwkJCQliYl90eXBlLCAmdHhfcmF0ZVs4XSwgJnJzdl90aW1lWzhdKTsKIAogCXB1dF91bmFsaWduZWQocGh5WzBdLmxlbiwgKHUxNiAqKSZkYXRhWzBdKTsKIAlkYXRhWzJdID0gcGh5WzBdLnNpZ25hbDsKQEAgLTMzNCw4ICszMzMsOCBAQAogCQlkYXRhWzE2ICsgaSAqIDIgKyAxXSA9IHJzdl90aW1lW2ldOwogCX0KIAotCXZudF9jb250cm9sX291dChwcml2LCBNRVNTQUdFX1RZUEVfV1JJVEUsCi0JCU1BQ19SRUdfUlNQSU5GX0JfMSwgTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgMzQsICZkYXRhWzBdKTsKKwl2bnRfY29udHJvbF9vdXQocHJpdiwgTUVTU0FHRV9UWVBFX1dSSVRFLCBNQUNfUkVHX1JTUElORl9CXzEsCisJCQlNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCAzNCwgJmRhdGFbMF0pOwogfQogCiAvKgpAQCAtNDI5LDEyICs0MjgsMTIgQEAKIAlkYXRhWzNdID0gKHU4KXByaXYtPnNsb3Q7CiAKIAl2bnRfY29udHJvbF9vdXQocHJpdiwgTUVTU0FHRV9UWVBFX1dSSVRFLCBNQUNfUkVHX1NJRlMsCi0JCU1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsIDQsICZkYXRhWzBdKTsKKwkJCU1FU1NBR0VfUkVRVUVTVF9NQUNSRUcsIDQsICZkYXRhWzBdKTsKIAogCW1heF9taW4gfD0gMHhhMDsKIAogCXZudF9jb250cm9sX291dChwcml2LCBNRVNTQUdFX1RZUEVfV1JJVEUsIE1BQ19SRUdfQ1dNQVhNSU4wLAotCQlNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCAxLCAmbWF4X21pbik7CisJCQlNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLCAxLCAmbWF4X21pbik7CiB9CiAKIHZvaWQgdm50X3VwZGF0ZV90b3BfcmF0ZXMoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQpAQCAtNDc4LDcgKzQ3Nyw2IEBACiAKIHU4IHZudF9nZXRfcGt0X3R5cGUoc3RydWN0IHZudF9wcml2YXRlICpwcml2KQogewotCiAJaWYgKHByaXYtPmJiX3R5cGUgPT0gQkJfVFlQRV8xMUEgfHwgcHJpdi0+YmJfdHlwZSA9PSBCQl9UWVBFXzExQikKIAkJcmV0dXJuICh1OClwcml2LT5iYl90eXBlOwogCWVsc2UgaWYgKHZudF9vZmRtX21pbl9yYXRlKHByaXYpKQpAQCAtNTA2LDcgKzUwNCw3IEBACiAJdTY0IHRzZl9vZmZzZXQgPSAwOwogCXUxNiByeF9iY25fb2Zmc2V0OwogCi0JcnhfYmNuX29mZnNldCA9IGN3UlhCQ05UU0ZPZmZbcnhfcmF0ZSAlIE1BWF9SQVRFXTsKKwlyeF9iY25fb2Zmc2V0ID0gY3dfcnhiY250c2Zfb2ZmW3J4X3JhdGUgJSBNQVhfUkFURV07CiAKIAl0c2YyICs9ICh1NjQpcnhfYmNuX29mZnNldDsKIApAQCAtNTMxLDcgKzUyOSw3IEBACiAgKgogICovCiB2b2lkIHZudF9hZGp1c3RfdHNmKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdiwgdTggcnhfcmF0ZSwKLQkJdTY0IHRpbWVfc3RhbXAsIHU2NCBsb2NhbF90c2YpCisJCSAgICB1NjQgdGltZV9zdGFtcCwgdTY0IGxvY2FsX3RzZikKIHsKIAl1NjQgdHNmX29mZnNldCA9IDA7CiAJdTggZGF0YVs4XTsKQEAgLTU0OCw4ICs1NDYsOSBAQAogCWRhdGFbN10gPSAodTgpKHRzZl9vZmZzZXQgPj4gNTYpOwogCiAJdm50X2NvbnRyb2xfb3V0KHByaXYsIE1FU1NBR0VfVFlQRV9TRVRfVFNGVEJUVCwKLQkJTUVTU0FHRV9SRVFVRVNUX1RTRiwgMCwgOCwgZGF0YSk7CisJCQlNRVNTQUdFX1JFUVVFU1RfVFNGLCAwLCA4LCBkYXRhKTsKIH0KKwogLyoKICAqIERlc2NyaXB0aW9uOiBSZWFkIE5JQyBUU0YgY291bnRlcgogICogICAgICAgICAgICAgIEdldCBsb2NhbCBUU0YgY291bnRlcgpAQCAtNTY1LDcgKzU2NCw2IEBACiAgKi8KIGJvb2wgdm50X2dldF9jdXJyZW50X3RzZihzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHU2NCAqY3VycmVudF90c2YpCiB7Ci0KIAkqY3VycmVudF90c2YgPSBwcml2LT5jdXJyZW50X3RzZjsKIAogCXJldHVybiB0cnVlOwpAQCAtNTg0LDcgKzU4Miw2IEBACiAgKi8KIGJvb2wgdm50X2NsZWFyX2N1cnJlbnRfdHNmKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcHJpdikKIHsKLQogCXZudF9tYWNfcmVnX2JpdHNfb24ocHJpdiwgTUFDX1JFR19URlRDVEwsIFRGVENUTF9UU0ZDTlRSU1QpOwogCiAJcHJpdi0+Y3VycmVudF90c2YgPSAwOwpAQCAtNjU3LDcgKzY1NCw3IEBACiAJZGF0YVs3XSA9ICh1OCkobmV4dF90YnR0ID4+IDU2KTsKIAogCXZudF9jb250cm9sX291dChwcml2LCBNRVNTQUdFX1RZUEVfU0VUX1RTRlRCVFQsCi0JCU1FU1NBR0VfUkVRVUVTVF9UQlRULCAwLCA4LCBkYXRhKTsKKwkJCU1FU1NBR0VfUkVRVUVTVF9UQlRULCAwLCA4LCBkYXRhKTsKIH0KIAogLyoKQEAgLTY3Niw3ICs2NzMsNyBAQAogICoKICAqLwogdm9pZCB2bnRfdXBkYXRlX25leHRfdGJ0dChzdHJ1Y3Qgdm50X3ByaXZhdGUgKnByaXYsIHU2NCB0c2YsCi0JCQl1MTYgYmVhY29uX2ludGVydmFsKQorCQkJICB1MTYgYmVhY29uX2ludGVydmFsKQogewogCXU4IGRhdGFbOF07CiAKQEAgLTcyMSw3ICs3MTgsNyBAQAogCWNhc2UgUkZfVlQzMjI2RDA6CiAJY2FzZSBSRl9WVDMzNDJBMDoKIAkJdm50X21hY19yZWdfYml0c19vZmYocHJpdiwgTUFDX1JFR19TT0ZUUFdSQ1RMLAotCQkJCShTT0ZUUFdSQ1RMX1NXUEUyIHwgU09GVFBXUkNUTF9TV1BFMykpOworCQkJCSAgICAgKFNPRlRQV1JDVExfU1dQRTIgfCBTT0ZUUFdSQ1RMX1NXUEUzKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtNzYyLDcgKzc1OSw3IEBACiAJY2FzZSBSRl9WVDMyMjZEMDoKIAljYXNlIFJGX1ZUMzM0MkEwOgogCQl2bnRfbWFjX3JlZ19iaXRzX29uKHByaXYsIE1BQ19SRUdfU09GVFBXUkNUTCwKLQkJCShTT0ZUUFdSQ1RMX1NXUEUyIHwgU09GVFBXUkNUTF9TV1BFMykpOworCQkJCSAgICAoU09GVFBXUkNUTF9TV1BFMiB8IFNPRlRQV1JDVExfU1dQRTMpKTsKIAkJYnJlYWs7CiAJfQogCkBAIC03OTUsNyArNzkyLDcgQEAKIAkJCXByaXYtPmJiX3ZnYVswXSA9IDB4MjA7CiAKIAkJCXZudF9jb250cm9sX291dF91OChwcml2LCBNRVNTQUdFX1JFUVVFU1RfQkJSRUcsCi0JCQkJCQkweGU3LCBwcml2LT5iYl92Z2FbMF0pOworCQkJCQkgICAweGU3LCBwcml2LT5iYl92Z2FbMF0pOwogCQl9CiAKIAkJcHJpdi0+YmJfdmdhWzJdID0gMHgxMDsKQEAgLTgwNSw3ICs4MDIsNyBAQAogCQkJcHJpdi0+YmJfdmdhWzBdID0gMHgxYzsKIAogCQkJdm50X2NvbnRyb2xfb3V0X3U4KHByaXYsIE1FU1NBR0VfUkVRVUVTVF9CQlJFRywKLQkJCQkJCTB4ZTcsIHByaXYtPmJiX3ZnYVswXSk7CisJCQkJCSAgIDB4ZTcsIHByaXYtPmJiX3ZnYVswXSk7CiAJCX0KIAogCQlwcml2LT5iYl92Z2FbMl0gPSAweDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYwppbmRleCA2MDE5YWFjLi42NTVmMDAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlICJyZi5oIgogCiBpbnQgdm50X3J4X2RhdGEoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCBzdHJ1Y3Qgdm50X3JjYiAqcHRyX3JjYiwKLQl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlY2VpdmVkKQorCQl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlY2VpdmVkKQogewogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CkBAIC00Niw3ICs0Niw3IEBACiAJX19sZTY0ICp0c2ZfdGltZTsKIAl1MzIgZnJhbWVfc2l6ZTsKIAlpbnQgaWksIHI7Ci0JdTggKnJ4X3N0cywgKnJ4X3JhdGUsICpzcSwgKnNxXzM7CisJdTggKnJ4X3JhdGUsICpzcSwgKnNxXzM7CiAJdTMyIHdia19zdGF0dXM7CiAJdTggKnNrYl9kYXRhOwogCXUxNiAqcGF5X2xvYWRfbGVuOwpAQCAtNzUsMjIgKzc1LDIxIEBACiAKIAlza2JfZGF0YSA9ICh1OCAqKXNrYi0+ZGF0YTsKIAotCXJ4X3N0cyA9IHNrYl9kYXRhKzQ7Ci0JcnhfcmF0ZSA9IHNrYl9kYXRhKzU7CisJcnhfcmF0ZSA9IHNrYl9kYXRhICsgNTsKIAogCS8qIHJlYWwgRnJhbWUgU2l6ZSA9IFVTQmZyYW1lX3NpemUgLTRXYmtTdGF0dXMgLSA0UnhTdGF0dXMgKi8KIAkvKiAtOFRTRiAtIDRSU1IgLSA0U1EzIC0gP1BhZGRpbmcgKi8KIAogCS8qIGlmIFNRMyB0aGUgcmFuZ2UgaXMgMjR+MjcsIGlmIG5vIFNRMyB0aGUgcmFuZ2UgaXMgMjB+MjMgKi8KIAotCXBheV9sb2FkX2xlbiA9ICh1MTYgKikgKHNrYl9kYXRhICsgNik7CisJcGF5X2xvYWRfbGVuID0gKHUxNiAqKShza2JfZGF0YSArIDYpOwogCiAJLypGaXggaGFyZHdhcmUgYnVnID0+IFBMQ1BfTGVuZ3RoIGVycm9yICovCiAJaWYgKCgoYnl0ZXNfcmVjZWl2ZWQgLSAoKnBheV9sb2FkX2xlbikpID4gMjcpIHx8Ci0JCSgoYnl0ZXNfcmVjZWl2ZWQgLSAoKnBheV9sb2FkX2xlbikpIDwgMjQpIHx8Ci0JCQkoYnl0ZXNfcmVjZWl2ZWQgPCAoKnBheV9sb2FkX2xlbikpKSB7CisJICAgICgoYnl0ZXNfcmVjZWl2ZWQgLSAoKnBheV9sb2FkX2xlbikpIDwgMjQpIHx8CisJICAgIChieXRlc19yZWNlaXZlZCA8ICgqcGF5X2xvYWRfbGVuKSkpIHsKIAkJZGV2X2RiZygmcHJpdi0+dXNiLT5kZXYsICJXcm9uZyBQTENQIExlbmd0aCAleFxuIiwKLQkJCQkJCQkqcGF5X2xvYWRfbGVuKTsKKwkJCSpwYXlfbG9hZF9sZW4pOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuaAppbmRleCA1YTkyYmQ4Li5mZjE4NTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmgKQEAgLTI5LDYgKzI5LDYgQEAKICNpbmNsdWRlICJkZXZpY2UuaCIKIAogaW50IHZudF9yeF9kYXRhKHN0cnVjdCB2bnRfcHJpdmF0ZSAqLCBzdHJ1Y3Qgdm50X3JjYiAqLAotCXVuc2lnbmVkIGxvbmcgYnl0ZXNfcmVjZWl2ZWQpOworCQl1bnNpZ25lZCBsb25nIGJ5dGVzX3JlY2VpdmVkKTsKIAogI2VuZGlmIC8qIF9fUlhUWF9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwppbmRleCBhYzRmZWNiLi4wNTk0ODI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCkBAIC00NDAsMTAgKzQ0MCw4IEBACiAKIAkJLyogYWxsb2NhdGUgVVJCcyAqLwogCQl0eF9jb250ZXh0LT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZiAoIXR4X2NvbnRleHQtPnVyYikgewotCQkJZGV2X2VycigmcHJpdi0+dXNiLT5kZXYsICJhbGxvYyB0eCB1cmIgZmFpbGVkXG4iKTsKKwkJaWYgKCF0eF9jb250ZXh0LT51cmIpCiAJCQlnb3RvIGZyZWVfdHg7Ci0JCX0KIAogCQl0eF9jb250ZXh0LT5pbl91c2UgPSBmYWxzZTsKIAl9CkBAIC00NjIsMTAgKzQ2MCw4IEBACiAKIAkJLyogYWxsb2NhdGUgVVJCcyAqLwogCQlyY2ItPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcmNiLT51cmIpIHsKLQkJCWRldl9lcnIoJnByaXYtPnVzYi0+ZGV2LCAiRmFpbGVkIHRvIGFsbG9jIHJ4IHVyYlxuIik7CisJCWlmICghcmNiLT51cmIpCiAJCQlnb3RvIGZyZWVfcnhfdHg7Ci0JCX0KIAogCQlyY2ItPnNrYiA9IGRldl9hbGxvY19za2IocHJpdi0+cnhfYnVmX3N6KTsKIAkJaWYgKCFyY2ItPnNrYikKQEAgLTQ3OSwxMCArNDc1LDggQEAKIAl9CiAKIAlwcml2LT5pbnRlcnJ1cHRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPmludGVycnVwdF91cmIpIHsKLQkJZGV2X2VycigmcHJpdi0+dXNiLT5kZXYsICJGYWlsZWQgdG8gYWxsb2MgaW50IHVyYlxuIik7CisJaWYgKCFwcml2LT5pbnRlcnJ1cHRfdXJiKQogCQlnb3RvIGZyZWVfcnhfdHg7Ci0JfQogCiAJcHJpdi0+aW50X2J1Zi5kYXRhX2J1ZiA9IGttYWxsb2MoTUFYX0lOVEVSUlVQVF9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYtPmludF9idWYuZGF0YV9idWYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvdXNicGlwZS5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmMKaW5kZXggZjU0NjU1My4uZTliNmIyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni91c2JwaXBlLmMKQEAgLTI4LDggKzI4LDkgQEAKICAqCXZudF9jb250cm9sX2luX3U4IC0gUmVhZCBvbmUgYnl0ZSBmcm9tIE1FTS9CQi9NQUMvRUVQUk9NCiAgKgogICogUmV2aXNpb24gSGlzdG9yeToKLSAqICAgICAgMDQtMDUtMjAwNCBKZXJyeSBDaGVuOiAgSW5pdGlhbCByZWxlYXNlCi0gKiAgICAgIDExLTI0LTIwMDQgV2FycmVuIEhzdTogQWRkIENvbnRyb2x2V3JpdGVCeXRlLENvbnRyb2x2UmVhZEJ5dGUsQ29udHJvbHZNYXNrQnl0ZQorICogICAgICAwNC0wNS0yMDA0IEplcnJ5IENoZW46IEluaXRpYWwgcmVsZWFzZQorICogICAgICAxMS0yNC0yMDA0IFdhcnJlbiBIc3U6IEFkZCBDb250cm9sdldyaXRlQnl0ZSxDb250cm9sdlJlYWRCeXRlLAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2x2TWFza0J5dGUKICAqCiAgKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvVE9ETwppbmRleCBlYzkzYjJlLi5hZTYxYjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvVE9ETwpAQCAtMyw3ICszLDYgQEAKIC0gcmVtb3ZlIE9TIHdyYXBwZXIgZnVuY3Rpb25zCiAtIHJlbW92ZSBjdXN0b20gZGVidWcgYW5kIHRyYWNpbmcgZnVuY3Rpb25zCiAtIHJld29yayBjb21tZW50cyBhbmQgZnVuY3Rpb24gaGVhZGVycyhhbHNvIGNvZGluZyBzdHlsZSkKLS0gcmVwbGFjZSBhbGwgc2VtYXBob3JlcyB3aXRoIG11dGV4ZXMgb3IgY29tcGxldGlvbnMKIC0gTW92ZSBoYW5kbGluZyBmb3IgZWFjaCBpbmRpdmlkdWFsIG1lbWJlcnMgb2YgJ3VuaW9uIG1lc3NhZ2VfYm9keScgb3V0CiAgIGludG8gYSBzZXBhcmF0ZSAnc3RydWN0IHdvcmtfc3RydWN0JyBhbmQgY29tcGxldGVseSByZW1vdmUgdGhlIG11bHRpcGxleGVyCiAgIHRoYXQgaXMgY3VycmVudGx5IHBhcnQgb2YgaG9zdF9pZl93b3JrKCksIGFsbG93aW5nIG1vdmVtZW50IG9mIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2NvcmVjb25maWd1cmF0b3IuaCBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC9jb3JlY29uZmlndXJhdG9yLmgKaW5kZXggMDc2ZTA2YS4uY2ZmMTY5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2NvcmVjb25maWd1cmF0b3IuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvY29yZWNvbmZpZ3VyYXRvci5oCkBAIC03MCwxMSArNzAsMTEgQEAKIAlDT05ORUNUX1NUU19GT1JDRV8xNl9CSVQgPSAweEZGRkYKIH07CiAKLXR5cGVkZWYgc3RydWN0IHsKK3N0cnVjdCB0c3RyUlNTSSB7CiAJdTggdThGdWxsOwogCXU4IHU4SW5kZXg7CiAJczggYXM4UlNTSVtOVU1fUlNTSV07Ci19IHRzdHJSU1NJOworfTsKIAogc3RydWN0IG5ldHdvcmtfaW5mbyB7CiAJczggcnNzaTsKQEAgLTkzLDcgKzkzLDcgQEAKIAl1OCAqaWVzOwogCXUxNiBpZXNfbGVuOwogCXZvaWQgKmpvaW5fcGFyYW1zOwotCXRzdHJSU1NJIHN0cl9yc3NpOworCXN0cnVjdCB0c3RyUlNTSSBzdHJfcnNzaTsKIAl1NjQgdHNmX2hpOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2hvc3RfaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvaG9zdF9pbnRlcmZhY2UuYwppbmRleCAwYjE3NjBjLi43OGY1NjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvaG9zdF9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvaG9zdF9pbnRlcmZhY2UuYwpAQCAtMzI3OSw3ICszMjc5LDYgQEAKIGludCB3aWxjX2hpZl9zZXRfY2ZnKHN0cnVjdCB3aWxjX3ZpZiAqdmlmLAogCQkgICAgIHN0cnVjdCBjZmdfcGFyYW1fYXR0ciAqY2ZnX3BhcmFtKQogewotCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBob3N0X2lmX21zZyBtc2c7CiAJc3RydWN0IGhvc3RfaWZfZHJ2ICpoaWZfZHJ2ID0gdmlmLT5oaWZfZHJ2OwogCkBAIC0zMjkzLDkgKzMyOTIsNyBAQAogCW1zZy5ib2R5LmNmZ19pbmZvID0gKmNmZ19wYXJhbTsKIAltc2cudmlmID0gdmlmOwogCi0JcmVzdWx0ID0gd2lsY19lbnF1ZXVlX2NtZCgmbXNnKTsKLQotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIHdpbGNfZW5xdWV1ZV9jbWQoJm1zZyk7CiB9CiAKIHN0YXRpYyB2b2lkIEdldFBlcmlvZGljUlNTSSh1bnNpZ25lZCBsb25nIGFyZykKQEAgLTMzMjksNyArMzMyNiw3IEBACiAKIAlpbml0X2NvbXBsZXRpb24oJmhpZl93YWl0X3Jlc3BvbnNlKTsKIAotCWhpZl9kcnYgID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhvc3RfaWZfZHJ2KSwgR0ZQX0tFUk5FTCk7CisJaGlmX2RydiAgPSBremFsbG9jKHNpemVvZigqaGlmX2RydiksIEdGUF9LRVJORUwpOwogCWlmICghaGlmX2RydikgewogCQlyZXN1bHQgPSAtRU5PTUVNOwogCQlnb3RvIF9mYWlsXzsKQEAgLTMzNjMsNyArMzM2MCw3IEBACiAJCWlmICghaGlmX3dvcmtxdWV1ZSkgewogCQkJbmV0ZGV2X2Vycih2aWYtPm5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZVxuIik7CiAJCQlyZXN1bHQgPSAtRU5PTUVNOwotCQkJZ290byBfZmFpbF9tcV87CisJCQlnb3RvIF9mYWlsXzsKIAkJfQogCiAJCXNldHVwX3RpbWVyKCZwZXJpb2RpY19yc3NpLCBHZXRQZXJpb2RpY1JTU0ksCkBAIC0zMzkxLDcgKzMzODgsNiBAQAogCiAJY2xpZW50c19jb3VudCsrOwogCi1fZmFpbF9tcV86CiAJZGVzdHJveV93b3JrcXVldWUoaGlmX3dvcmtxdWV1ZSk7CiBfZmFpbF86CiAJcmV0dXJuIHJlc3VsdDsKQEAgLTM4NzksNyArMzg3NSw3IEBACiAJcHU4SUVzID0gcHRzdHJOZXR3b3JrSW5mby0+aWVzOwogCXUxNklFc0xlbiA9IHB0c3RyTmV0d29ya0luZm8tPmllc19sZW47CiAKLQlwTmV3Sm9pbkJzc1BhcmFtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGpvaW5fYnNzX3BhcmFtKSwgR0ZQX0tFUk5FTCk7CisJcE5ld0pvaW5Cc3NQYXJhbSA9IGt6YWxsb2Moc2l6ZW9mKCpwTmV3Sm9pbkJzc1BhcmFtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBOZXdKb2luQnNzUGFyYW0pIHsKIAkJcE5ld0pvaW5Cc3NQYXJhbS0+ZHRpbV9wZXJpb2QgPSBwdHN0ck5ldHdvcmtJbmZvLT5kdGltX3BlcmlvZDsKIAkJcE5ld0pvaW5Cc3NQYXJhbS0+YmVhY29uX3BlcmlvZCA9IHB0c3RyTmV0d29ya0luZm8tPmJlYWNvbl9wZXJpb2Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvbGludXhfd2xhbi5jIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL2xpbnV4X3dsYW4uYwppbmRleCAzYTY2MjU1Li42MzcwYTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvbGludXhfd2xhbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC9saW51eF93bGFuLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KIAogc3RhdGljIGludCBkZXZfc3RhdGVfZXZfaGFuZGxlcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCkBAIC02NDgsNyArNjQ3LDcgQEAKIAkJCW11dGV4X3VubG9jaygmd2wtPmhpZl9jcyk7CiAJCX0KIAkJaWYgKCZ3bC0+dHhxX2V2ZW50KQotCQkJd2FpdF9mb3JfY29tcGxldGlvbigmd2wtPnR4cV9ldmVudCk7CisJCQljb21wbGV0ZSgmd2wtPnR4cV9ldmVudCk7CiAKIAkJd2xhbl9kZWluaXRpYWxpemVfdGhyZWFkcyhkZXYpOwogCQlkZWluaXRfaXJxKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY19kZWJ1Z2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY19kZWJ1Z2ZzLmMKaW5kZXggZmNiYzk1ZC4uODAyYmIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX2RlYnVnZnMuYwpAQCAtMjksNyArMjksNyBAQAogI2RlZmluZSBFUlIgICAgICAgICAgICAgQklUKDMpCiAKICNkZWZpbmUgREJHX0xFVkVMX0FMTAkoREVCVUcgfCBJTkZPIHwgV1JOIHwgRVJSKQotYXRvbWljX3QgV0lMQ19ERUJVR19MRVZFTCA9IEFUT01JQ19JTklUKEVSUik7CitzdGF0aWMgYXRvbWljX3QgV0lMQ19ERUJVR19MRVZFTCA9IEFUT01JQ19JTklUKEVSUik7CiBFWFBPUlRfU1lNQk9MX0dQTChXSUxDX0RFQlVHX0xFVkVMKTsKIAogLyoKQEAgLTEwMiwzNSArMTAyLDE2IEBACiBzdGF0aWMgaW50IF9faW5pdCB3aWxjX2RlYnVnZnNfaW5pdCh2b2lkKQogewogCWludCBpOwotCi0Jc3RydWN0IGRlbnRyeSAqZGVidWdmc19maWxlczsKIAlzdHJ1Y3Qgd2lsY19kZWJ1Z2ZzX2luZm9fdCAqaW5mbzsKIAogCXdpbGNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ3aWxjX3dpZmkiLCBOVUxMKTsKLQlpZiAod2lsY19kaXIgPT0gIEVSUl9QVFIoLUVOT0RFVikpIHsKLQkJLyogaXQncyBub3QgZXJyb3IuIHRoZSBkZWJ1Z2ZzIGlzIGp1c3Qgbm90IGJlaW5nIGVuYWJsZWQuICovCi0JCXByaW50aygiRVJSLCBrZXJuZWwgaGFzIGJ1aWx0IHdpdGhvdXQgZGVidWdmcyBzdXBwb3J0XG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCF3aWxjX2RpcikgewotCQlwcmludGsoIkVSUiwgZGVidWdmcyBjcmVhdGUgZGlyXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRlYnVnZnNfaW5mbyk7IGkrKykgewogCQlpbmZvID0gJmRlYnVnZnNfaW5mb1tpXTsKLQkJZGVidWdmc19maWxlcyA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoaW5mby0+bmFtZSwKLQkJCQkJCSAgICBpbmZvLT5wZXJtLAotCQkJCQkJICAgIHdpbGNfZGlyLAotCQkJCQkJICAgICZpbmZvLT5kYXRhLAotCQkJCQkJICAgICZpbmZvLT5mb3BzKTsKLQotCQlpZiAoIWRlYnVnZnNfZmlsZXMpIHsKLQkJCXByaW50aygiRVJSIGZhaWwgdG8gY3JlYXRlIHRoZSBkZWJ1Z2ZzIGZpbGUsICVzXG4iLCBpbmZvLT5uYW1lKTsKLQkJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh3aWxjX2Rpcik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKwkJZGVidWdmc19jcmVhdGVfZmlsZShpbmZvLT5uYW1lLAorCQkJCSAgICBpbmZvLT5wZXJtLAorCQkJCSAgICB3aWxjX2RpciwKKwkJCQkgICAgJmluZm8tPmRhdGEsCisJCQkJICAgICZpbmZvLT5mb3BzKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY19zcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3NwaS5jCmluZGV4IDIyY2Y0YjcuLmYwOGNmNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3NwaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3NwaS5jCkBAIC00MTAsOCArNDEwLDcgQEAKIAlpZiAobGVuMiA+IEFSUkFZX1NJWkUod2IpKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAic3BpIGJ1ZmZlciBzaXplIHRvbyBzbWFsbCAoJWQpICglenUpXG4iLAogCQkJIGxlbjIsIEFSUkFZX1NJWkUod2IpKTsKLQkJcmVzdWx0ID0gTl9GQUlMOwotCQlyZXR1cm4gcmVzdWx0OworCQlyZXR1cm4gTl9GQUlMOwogCX0KIAkvKiB6ZXJvIHNwaSB3cml0ZSBidWZmZXJzLiAqLwogCWZvciAod2l4ID0gbGVuOyB3aXggPCBsZW4yOyB3aXgrKykKQEAgLTQyMCw4ICs0MTksNyBAQAogCiAJaWYgKHdpbGNfc3BpX3R4X3J4KHdpbGMsIHdiLCByYiwgbGVuMikpIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgY21kIHdyaXRlLCBidXMgZXJyb3IuLi5cbiIpOwotCQlyZXN1bHQgPSBOX0ZBSUw7Ci0JCXJldHVybiByZXN1bHQ7CisJCXJldHVybiBOX0ZBSUw7CiAJfQogCiAJLyoqCkBAIC00NDIsOCArNDQwLDcgQEAKIAkJZGV2X2Vycigmc3BpLT5kZXYsCiAJCQkiRmFpbGVkIGNtZCByZXNwb25zZSwgY21kICglMDJ4KSwgcmVzcCAoJTAyeClcbiIsCiAJCQljbWQsIHJzcCk7Ci0JCXJlc3VsdCA9IE5fRkFJTDsKLQkJcmV0dXJuIHJlc3VsdDsKKwkJcmV0dXJuIE5fRkFJTDsKIAl9CiAKIAkvKioKQEAgLTQ1Myw4ICs0NTAsNyBAQAogCWlmIChyc3AgIT0gMHgwMCkgewogCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCBjbWQgc3RhdGUgcmVzcG9uc2Ugc3RhdGUgKCUwMngpXG4iLAogCQkJcnNwKTsKLQkJcmVzdWx0ID0gTl9GQUlMOwotCQlyZXR1cm4gcmVzdWx0OworCQlyZXR1cm4gTl9GQUlMOwogCX0KIAogCWlmICgoY21kID09IENNRF9JTlRFUk5BTF9SRUFEKSB8fCAoY21kID09IENNRF9TSU5HTEVfUkVBRCkKQEAgLTQ4MSw4ICs0NzcsNyBAQAogCQlpZiAocmV0cnkgPD0gMCkgewogCQkJZGV2X2Vycigmc3BpLT5kZXYsCiAJCQkJIkVycm9yLCBkYXRhIHJlYWQgcmVzcG9uc2UgKCUwMngpXG4iLCByc3ApOwotCQkJcmVzdWx0ID0gTl9SRVNFVDsKLQkJCXJldHVybiByZXN1bHQ7CisJCQlyZXR1cm4gTl9SRVNFVDsKIAkJfQogCiAJCWlmICgoY21kID09IENNRF9JTlRFUk5BTF9SRUFEKSB8fCAoY21kID09IENNRF9TSU5HTEVfUkVBRCkpIHsKQEAgLTQ5Nyw4ICs0OTIsNyBAQAogCQkJfSBlbHNlIHsKIAkJCQlkZXZfZXJyKCZzcGktPmRldiwKIAkJCQkJImJ1ZmZlciBvdmVycnVuIHdoZW4gcmVhZGluZyBkYXRhLlxuIik7Ci0JCQkJcmVzdWx0ID0gTl9GQUlMOwotCQkJCXJldHVybiByZXN1bHQ7CisJCQkJcmV0dXJuIE5fRkFJTDsKIAkJCX0KIAogCQkJaWYgKCFnX3NwaS5jcmNfb2ZmKSB7CkBAIC01MTAsOCArNTA0LDcgQEAKIAkJCQkJY3JjWzFdID0gcmJbcml4KytdOwogCQkJCX0gZWxzZSB7CiAJCQkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiYnVmZmVyIG92ZXJydW4gd2hlbiByZWFkaW5nIGNyYy5cbiIpOwotCQkJCQlyZXN1bHQgPSBOX0ZBSUw7Ci0JCQkJCXJldHVybiByZXN1bHQ7CisJCQkJCXJldHVybiBOX0ZBSUw7CiAJCQkJfQogCQkJfQogCQl9IGVsc2UgaWYgKChjbWQgPT0gQ01EX0RNQV9SRUFEKSB8fCAoY21kID09IENNRF9ETUFfRVhUX1JFQUQpKSB7CkBAIC01NTEsNyArNTQ0LDYgQEAKIAkJCQkJfQogCQkJCX0KIAotCiAJCQkJaXggKz0gbmJ5dGVzOwogCQkJCXN6IC09IG5ieXRlczsKIAkJCX0KQEAgLTU4Nyw3ICs1NzksNiBAQAogCQkJCWlmIChyZXN1bHQgPT0gTl9GQUlMKQogCQkJCQlicmVhazsKIAotCiAJCQkJLyoqCiAJCQkJICogUmVhZCBieXRlcwogCQkJCSAqKi8KQEAgLTY4Nyw3ICs2NzgsNiBAQAogCQlzeiAtPSBuYnl0ZXM7CiAJfSB3aGlsZSAoc3opOwogCi0KIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC04NTAsNyArODQwLDYgQEAKIAlzdGF0aWMgaW50IGlzaW5pdDsKIAogCWlmIChpc2luaXQpIHsKLQogCQlpZiAoIXdpbGNfc3BpX3JlYWRfcmVnKHdpbGMsIDB4MTAwMCwgJmNoaXBpZCkpIHsKIAkJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbCBjbWQgcmVhZCBjaGlwIGlkLi4uXG4iKTsKIAkJCXJldHVybiAwOwpAQCAtODcxLDcgKzg2MCw3IEBACiAJCS8qIFJlYWQgZmFpbGVkLiBUcnkgd2l0aCBDUkMgb2ZmLiBUaGlzIG1pZ2h0IGhhcHBlbiB3aGVuIG1vZHVsZQogCQkgKiBpcyByZW1vdmVkIGJ1dCBjaGlwIGlzbid0IHJlc2V0Ki8KIAkJZ19zcGkuY3JjX29mZiA9IDE7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbGVkIGludGVybmFsIHJlYWQgcHJvdG9jb2wgd2l0aCBDUkMgb24sIHJldHlyaW5nIHdpdGggQ1JDIG9mZi4uLlxuIik7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbGVkIGludGVybmFsIHJlYWQgcHJvdG9jb2wgd2l0aCBDUkMgb24sIHJldHJ5aW5nIHdpdGggQ1JDIG9mZi4uLlxuIik7CiAJCWlmICghc3BpX2ludGVybmFsX3JlYWQod2lsYywgV0lMQ19TUElfUFJPVE9DT0xfT0ZGU0VULCAmcmVnKSkgewogCQkJLyogUmVhYWQgZmFpbGVkIHdpdGggYm90aCBDUkMgb24gYW5kIG9mZiwgc29tZXRoaW5nIHdlbnQgYmFkICovCiAJCQlkZXZfZXJyKCZzcGktPmRldiwKQEAgLTg5MCw3ICs4NzksNiBAQAogCQlnX3NwaS5jcmNfb2ZmID0gMTsKIAl9CiAKLQogCS8qKgogCSAqICAgICAgbWFrZSBzdXJlIGNhbiByZWFkIGJhY2sgY2hpcCBpZCBjb3JyZWN0bHkKIAkgKiovCkBAIC05MzEsMTQgKzkxOSwxMCBAQAogCQkqc2l6ZSA9IHRtcDsKIAl9CiAKLQotCiBfZmFpbF86CiAJcmV0dXJuIHJldDsKIH0KIAotCi0KIHN0YXRpYyBpbnQgd2lsY19zcGlfcmVhZF9pbnQoc3RydWN0IHdpbGMgKndpbGMsIHUzMiAqaW50X3N0YXR1cykKIHsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZSh3aWxjLT5kZXYpOwpAQCAtOTkzLDcgKzk3Nyw2IEBACiAJCX0KIAogCQkqaW50X3N0YXR1cyA9IHRtcDsKLQogCX0KIAogX2ZhaWxfOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2ZpX2NmZ29wZXJhdGlvbnMuYyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dmaV9jZmdvcGVyYXRpb25zLmMKaW5kZXggOTA5MjYwMC4uNjBkOGIwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2ZpX2NmZ29wZXJhdGlvbnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193ZmlfY2Znb3BlcmF0aW9ucy5jCkBAIC0xMTkxLDcgKzExOTEsNyBAQAogCXN0cnVjdCB3aWxjX3ByaXYgKnByaXY7CiAJc3RydWN0IHdpbGNfdmlmICp2aWY7CiAJdTMyIGkgPSAwOwotCXUzMiBhc3NvY2lhdGVkc3RhID0gMDsKKwl1MzIgYXNzb2NpYXRlZHN0YSA9IH4wOwogCXUzMiBpbmFjdGl2ZV90aW1lID0gMDsKIAlwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7CiAJdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTEyMDQsNyArMTIwNCw3IEBACiAJCQl9CiAJCX0KIAotCQlpZiAoYXNzb2NpYXRlZHN0YSA9PSAtMSkgeworCQlpZiAoYXNzb2NpYXRlZHN0YSA9PSB+MCkgewogCQkJbmV0ZGV2X2VycihkZXYsICJzdGEgcmVxdWlyZWQgaXMgbm90IGFzc29jaWF0ZWRcbiIpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KQEAgLTIyMDAsNyArMjIwMCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9vcHMgd2lsY19jZmc4MDIxMV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNmZzgwMjExX29wcyB3aWxjX2NmZzgwMjExX29wcyA9IHsKIAkuc2V0X21vbml0b3JfY2hhbm5lbCA9IHNldF9jaGFubmVsLAogCS5zY2FuID0gc2NhbiwKIAkuY29ubmVjdCA9IGNvbm5lY3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193ZmlfbmV0ZGV2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193ZmlfbmV0ZGV2aWNlLmgKaW5kZXggNWNjNmE4Mi4uZWM2YjE2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2ZpX25ldGRldmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dmaV9uZXRkZXZpY2UuaApAQCAtMTMxLDcgKzEzMSw3IEBACiAJc3RydWN0IHdpbGNfd2ZpX2tleSAqd2lsY19ndGtbTUFYX05VTV9TVEFdOwogCXN0cnVjdCB3aWxjX3dmaV9rZXkgKndpbGNfcHRrW01BWF9OVU1fU1RBXTsKIAl1OCB3aWxjX2dyb3Vwa2V5OwotCS8qIHNlbWFwaG9yZXMgKi8KKwkvKiBtdXRleGVzICovCiAJc3RydWN0IG11dGV4IHNjYW5fcmVxX2xvY2s7CiAJLyogICovCiAJYm9vbCBnYkF1dG9SYXRlQWRqdXN0ZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuLmMKaW5kZXggMTlhNTgwOS4uYmM1YWQyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dsYW4uYwpAQCAtNjIxLDkgKzYyMSw5IEBACiAJCQlpZiAoIXJldCkKIAkJCQlicmVhazsKIAotCQkJaWYgKChyZWcgJiAweDEpID09IDApIHsKKwkJCWlmICgocmVnICYgMHgxKSA9PSAwKQogCQkJCWJyZWFrOwotCQkJfQorCiAJCQljb3VudGVyKys7CiAJCQlpZiAoY291bnRlciA+IDIwMCkgewogCQkJCWNvdW50ZXIgPSAwOwpAQCAtMTAwMSw4ICsxMDAxLDcgQEAKIAlyZXQgPSB3aWxjLT5oaWZfZnVuYy0+aGlmX3dyaXRlX3JlZyh3aWxjLCBXSUxDX1ZNTV9DT1JFX0NGRywgcmVnKTsKIAlpZiAoIXJldCkgewogCQlyZWxlYXNlX2J1cyh3aWxjLCBSRUxFQVNFX09OTFkpOwotCQlyZXQgPSAtRUlPOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gLUVJTzsKIAl9CiAJcmVnID0gMDsKIAlpZiAod2lsYy0+aW9fdHlwZSA9PSBISUZfU0RJTyAmJiB3aWxjLT5kZXZfaXJxX251bSkKQEAgLTEwMzQsOCArMTAzMyw3IEBACiAJcmV0ID0gd2lsYy0+aGlmX2Z1bmMtPmhpZl93cml0ZV9yZWcod2lsYywgV0lMQ19HUF9SRUdfMSwgcmVnKTsKIAlpZiAoIXJldCkgewogCQlyZWxlYXNlX2J1cyh3aWxjLCBSRUxFQVNFX09OTFkpOwotCQlyZXQgPSAtRUlPOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gLUVJTzsKIAl9CiAKIAl3aWxjLT5oaWZfZnVuYy0+aGlmX3N5bmNfZXh0KHdpbGMsIE5VTV9JTlRfRVhUKTsKQEAgLTEwNDMsOCArMTA0MSw3IEBACiAJcmV0ID0gd2lsYy0+aGlmX2Z1bmMtPmhpZl9yZWFkX3JlZyh3aWxjLCAweDEwMDAsICZjaGlwaWQpOwogCWlmICghcmV0KSB7CiAJCXJlbGVhc2VfYnVzKHdpbGMsIFJFTEVBU0VfT05MWSk7Ci0JCXJldCA9IC1FSU87Ci0JCXJldHVybiByZXQ7CisJCXJldHVybiAtRUlPOwogCX0KIAogCXdpbGMtPmhpZl9mdW5jLT5oaWZfcmVhZF9yZWcod2lsYywgV0lMQ19HTEJfUkVTRVRfMCwgJnJlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuLmggYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuLmgKaW5kZXggMzBlNTMxMi4uZGU2YzRkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dsYW4uaApAQCAtMTkyLDcgKzE5Miw3IEBACiAKICNkZWZpbmUgRU5BQkxFX1JYX1ZNTQkJKFNFTF9WTU1fVEJMMSB8IEVOX1ZNTSkKICNkZWZpbmUgRU5BQkxFX1RYX1ZNTQkJKFNFTF9WTU1fVEJMMCB8IEVOX1ZNTSkKLS8qdGltZSBmb3IgZXhwaXJpbmcgdGhlIHNlbWFwaG9yZXMgb2YgY2ZnIHBhY2tldHMqLworLyp0aW1lIGZvciBleHBpcmluZyB0aGUgY29tcGxldGlvbiBvZiBjZmcgcGFja2V0cyovCiAjZGVmaW5lIENGR19QS1RTX1RJTUVPVVQJMjAwMAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbl9pZi5oIGIvZHJpdmVycy9zdGFnaW5nL3dpbGMxMDAwL3dpbGNfd2xhbl9pZi5oCmluZGV4IDQxMGJmYzAuLjQzOWFjNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93aWxjMTAwMC93aWxjX3dsYW5faWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2lsYzEwMDAvd2lsY193bGFuX2lmLmgKQEAgLTEwLDcgKzEwLDYgQEAKICNpZm5kZWYgV0lMQ19XTEFOX0lGX0gKICNkZWZpbmUgV0lMQ19XTEFOX0lGX0gKIAotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9jZmc4MDIxMS5jCmluZGV4IGY0NmRmZTYuLjE4MmIyZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvY2ZnODAyMTEuYwpAQCAtMzUsNyArMzUsNyBAQAogCiAvKiBwcmlzbTIgZGV2aWNlIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXY7CiAKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIGJhbmQ7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGNoYW5uZWxzW0FSUkFZX1NJWkUocHJpc20yX2NoYW5uZWxzKV07CkBAIC02OSwxMSArNjksMTEgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHByaXNtMl9kb21pYnNldF91aW50MzIod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgZGlkLCB1MzIgZGF0YSkKK3N0YXRpYyBpbnQgcHJpc20yX2RvbWlic2V0X3VpbnQzMihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyIGRpZCwgdTMyIGRhdGEpCiB7CiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgbXNnOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgKm1pYml0ZW0gPQotCQkJKHA4MDIxMWl0ZW1fdWludDMyX3QgKikmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiAqbWliaXRlbSA9CisJCQkoc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyICopJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKIAogCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKIAltaWJpdGVtLT5kaWQgPSBkaWQ7CkBAIC04MiwxMiArODIsMTIgQEAKIAlyZXR1cm4gcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2LCAodTggKikmbXNnKTsKIH0KIAotc3RhdGljIGludCBwcmlzbTJfZG9taWJzZXRfcHN0cjMyKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKK3N0YXRpYyBpbnQgcHJpc20yX2RvbWlic2V0X3BzdHIzMihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKIAkJCQkgIHUzMiBkaWQsIHU4IGxlbiwgY29uc3QgdTggKmRhdGEpCiB7CiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgbXNnOwotCXA4MDIxMWl0ZW1fcHN0cjMyX3QgKm1pYml0ZW0gPQotCQkJKHA4MDIxMWl0ZW1fcHN0cjMyX3QgKikmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhOworCXN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiAqbWliaXRlbSA9CisJCQkoc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjMyICopJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKIAogCW1zZy5tc2djb2RlID0gRElEbXNnX2RvdDExcmVxX21pYnNldDsKIAltaWJpdGVtLT5kaWQgPSBkaWQ7CkBAIC0xMDMsNyArMTAzLDcgQEAKIAkJCQkgICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsIHUzMiAqZmxhZ3MsCiAJCQkJICAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAJdTMyIGRhdGE7CiAJaW50IHJlc3VsdDsKIAlpbnQgZXJyID0gMDsKQEAgLTE0NCwxMiArMTQ0LDE1IEBACiAJCQkgIHU4IGtleV9pbmRleCwgYm9vbCBwYWlyd2lzZSwgY29uc3QgdTggKm1hY19hZGRyLAogCQkJICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKIAl1MzIgZGlkOwogCiAJaW50IGVyciA9IDA7CiAJaW50IHJlc3VsdCA9IDA7CiAKKwlpZiAoa2V5X2luZGV4ID49IE5VTV9XRVBLRVlTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXN3aXRjaCAocGFyYW1zLT5jaXBoZXIpIHsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgpAQCAtMTYwLDI3ICsxNjMsNyBAQAogCQkJZ290byBleGl0OwogCiAJCS8qIHNlbmQga2V5IHRvIGRyaXZlciAqLwotCQlzd2l0Y2ggKGtleV9pbmRleCkgewotCQljYXNlIDA6Ci0JCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTA7Ci0JCQlicmVhazsKLQotCQljYXNlIDE6Ci0JCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTE7Ci0JCQlicmVhazsKLQotCQljYXNlIDI6Ci0JCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTI7Ci0JCQlicmVhazsKLQotCQljYXNlIDM6Ci0JCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTM7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZXhpdDsKLQkJfQorCQlkaWQgPSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleShrZXlfaW5kZXggKyAxKTsKIAogCQlyZXN1bHQgPSBwcmlzbTJfZG9taWJzZXRfcHN0cjMyKHdsYW5kZXYsIGRpZCwKIAkJCQkJCXBhcmFtcy0+a2V5X2xlbiwgcGFyYW1zLT5rZXkpOwpAQCAtMjA1LDcgKzE4OCw3IEBACiAJCQkgIGNvbnN0IHU4ICptYWNfYWRkciwgdm9pZCAqY29va2llLAogCQkJICB2b2lkICgqY2FsbGJhY2spKHZvaWQgKmNvb2tpZSwgc3RydWN0IGtleV9wYXJhbXMqKSkKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAJc3RydWN0IGtleV9wYXJhbXMgcGFyYW1zOwogCWludCBsZW47CiAKQEAgLTIzMyw3ICsyMTYsNyBAQAogc3RhdGljIGludCBwcmlzbTJfZGVsX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICB1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkcikKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAJdTMyIGRpZDsKIAlpbnQgZXJyID0gMDsKIAlpbnQgcmVzdWx0ID0gMDsKQEAgLTI0MiwzNiArMjI1LDEzIEBACiAJICogYSBrZXksIHNvIHdlIHdpbGwgY2hlYXQgYnkgc2V0dGluZyB0aGUga2V5IHRvIGEgYm9ndXMgdmFsdWUKIAkgKi8KIAorCWlmIChrZXlfaW5kZXggPj0gTlVNX1dFUEtFWVMpCisJCXJldHVybiAtRUlOVkFMOworCiAJLyogc2VuZCBrZXkgdG8gZHJpdmVyICovCi0Jc3dpdGNoIChrZXlfaW5kZXgpIHsKLQljYXNlIDA6Ci0JCWRpZCA9Ci0JCSAgICBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTA7Ci0JCWJyZWFrOwotCi0JY2FzZSAxOgotCQlkaWQgPQotCQkgICAgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkxOwotCQlicmVhazsKLQotCWNhc2UgMjoKLQkJZGlkID0KLQkJICAgIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MjsKLQkJYnJlYWs7Ci0KLQljYXNlIDM6Ci0JCWRpZCA9Ci0JCSAgICBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTM7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBleGl0OwotCX0KLQorCWRpZCA9IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KGtleV9pbmRleCArIDEpOwogCXJlc3VsdCA9IHByaXNtMl9kb21pYnNldF9wc3RyMzIod2xhbmRldiwgZGlkLCAxMywgIjAwMDAwMDAwMDAwMDAiKTsKIAotZXhpdDoKIAlpZiAocmVzdWx0KQogCQllcnIgPSAtRUZBVUxUOwogCkBAIC0yODEsNyArMjQxLDcgQEAKIHN0YXRpYyBpbnQgcHJpc20yX3NldF9kZWZhdWx0X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgdTgga2V5X2luZGV4LCBib29sIHVuaWNhc3QsIGJvb2wgbXVsdGljYXN0KQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKIAogCWludCBlcnIgPSAwOwogCWludCByZXN1bHQgPSAwOwpAQCAtMjk5LDEzICsyNTksMTMgQEAKIHN0YXRpYyBpbnQgcHJpc20yX2dldF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICBjb25zdCB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfY29tbXNxdWFsaXR5IHF1YWxpdHk7CiAJaW50IHJlc3VsdDsKIAogCW1lbXNldChzaW5mbywgMCwgc2l6ZW9mKCpzaW5mbykpOwogCi0JaWYgKCh3bGFuZGV2ID09IE5VTEwpIHx8ICh3bGFuZGV2LT5tc2RzdGF0ZSAhPSBXTEFOX01TRF9SVU5OSU5HKSkKKwlpZiAoIXdsYW5kZXYgfHwgKHdsYW5kZXYtPm1zZHN0YXRlICE9IFdMQU5fTVNEX1JVTk5JTkcpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBidWlsZCByZXF1ZXN0IG1lc3NhZ2UgKi8KQEAgLTMxNCw3ICsyNzQsNyBAQAogCXF1YWxpdHkuZGJtLnN0YXR1cyA9IFA4MDIxMUVOVU1fbXNnaXRlbV9zdGF0dXNfZGF0YV9vazsKIAogCS8qIHNlbmQgbWVzc2FnZSB0byBuc2QgKi8KLQlpZiAod2xhbmRldi0+bWxtZXJlcXVlc3QgPT0gTlVMTCkKKwlpZiAoIXdsYW5kZXYtPm1sbWVyZXF1ZXN0KQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlyZXN1bHQgPSB3bGFuZGV2LT5tbG1lcmVxdWVzdCh3bGFuZGV2LCAoc3RydWN0IHA4MDIxMW1zZyAqKSZxdWFsaXR5KTsKQEAgLTMzNCw3ICsyOTQsNyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlICpwcml2ID0gd2lwaHlfcHJpdih3aXBoeSk7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2OwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2NhbiBtc2cxOwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc2Nhbl9yZXN1bHRzIG1zZzI7CiAJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwpAQCAtMzc0LDcgKzMzNCw3IEBACiAJCW1zZzEuc2NhbnR5cGUuZGF0YSA9IFA4MDIxMUVOVU1fc2NhbnR5cGVfYWN0aXZlOwogCQltc2cxLnNzaWQuZGF0YS5sZW4gPSByZXF1ZXN0LT5zc2lkcy0+c3NpZF9sZW47CiAJCW1lbWNweShtc2cxLnNzaWQuZGF0YS5kYXRhLAotCQkJcmVxdWVzdC0+c3NpZHMtPnNzaWQsIHJlcXVlc3QtPnNzaWRzLT5zc2lkX2xlbik7CisJCSAgICAgICByZXF1ZXN0LT5zc2lkcy0+c3NpZCwgcmVxdWVzdC0+c3NpZHMtPnNzaWRfbGVuKTsKIAl9IGVsc2UgewogCQltc2cxLnNjYW50eXBlLmRhdGEgPSAwOwogCX0KQEAgLTQ1MSw3ICs0MTEsNyBAQAogc3RhdGljIGludCBwcmlzbTJfc2V0X3dpcGh5X3BhcmFtcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCB1MzIgY2hhbmdlZCkKIHsKIAlzdHJ1Y3QgcHJpc20yX3dpcGh5X3ByaXZhdGUgKnByaXYgPSB3aXBoeV9wcml2KHdpcGh5KTsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBwcml2LT53bGFuZGV2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gcHJpdi0+d2xhbmRldjsKIAl1MzIgZGF0YTsKIAlpbnQgcmVzdWx0OwogCWludCBlcnIgPSAwOwpAQCAtNDkzLDcgKzQ1Myw3IEBACiBzdGF0aWMgaW50IHByaXNtMl9jb25uZWN0KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgIHN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyAqc21lKQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGRldi0+bWxfcHJpdjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBzbWUtPmNoYW5uZWw7CiAJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfYXV0b2pvaW4gbXNnX2pvaW47CiAJdTMyIGRpZDsKQEAgLTUxNiwxMSArNDc2LDExIEBACiAKIAkvKiBTZXQgdGhlIGF1dGhvcml6YXRpb24gKi8KIAlpZiAoKHNtZS0+YXV0aF90eXBlID09IE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU0pIHx8Ci0JCSgoc21lLT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUMpICYmICFpc193ZXApKQotCQkJbXNnX2pvaW4uYXV0aHR5cGUuZGF0YSA9IFA4MDIxMUVOVU1fYXV0aGFsZ19vcGVuc3lzdGVtOworCSAgICAoKHNtZS0+YXV0aF90eXBlID09IE5MODAyMTFfQVVUSFRZUEVfQVVUT01BVElDKSAmJiAhaXNfd2VwKSkKKwkJbXNnX2pvaW4uYXV0aHR5cGUuZGF0YSA9IFA4MDIxMUVOVU1fYXV0aGFsZ19vcGVuc3lzdGVtOwogCWVsc2UgaWYgKChzbWUtPmF1dGhfdHlwZSA9PSBOTDgwMjExX0FVVEhUWVBFX1NIQVJFRF9LRVkpIHx8Ci0JCSgoc21lLT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUMpICYmIGlzX3dlcCkpCi0JCQltc2dfam9pbi5hdXRodHlwZS5kYXRhID0gUDgwMjExRU5VTV9hdXRoYWxnX3NoYXJlZGtleTsKKwkJICgoc21lLT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUMpICYmIGlzX3dlcCkpCisJCW1zZ19qb2luLmF1dGh0eXBlLmRhdGEgPSBQODAyMTFFTlVNX2F1dGhhbGdfc2hhcmVka2V5OwogCWVsc2UKIAkJbmV0ZGV2X3dhcm4oZGV2LAogCQkJIlVuaGFuZGxlZCBhdXRob3Jpc2F0aW9uIHR5cGUgZm9yIGNvbm5lY3QgKCVkKVxuIiwKQEAgLTUyOSw2ICs0ODksMTEgQEAKIAkvKiBTZXQgdGhlIGVuY3J5cHRpb24gLSB3ZSBvbmx5IHN1cHBvcnQgd2VwICovCiAJaWYgKGlzX3dlcCkgewogCQlpZiAoc21lLT5rZXkpIHsKKwkJCWlmIChzbWUtPmtleV9pZHggPj0gTlVNX1dFUEtFWVMpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwogCQkJcmVzdWx0ID0gcHJpc20yX2RvbWlic2V0X3VpbnQzMih3bGFuZGV2LAogCQkJCURJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXlJRCwKIAkJCQlzbWUtPmtleV9pZHgpOwpAQCAtNTM2LDI4ICs1MDEsOCBAQAogCQkJCWdvdG8gZXhpdDsKIAogCQkJLyogc2VuZCBrZXkgdG8gZHJpdmVyICovCi0JCQlzd2l0Y2ggKHNtZS0+a2V5X2lkeCkgewotCQkJY2FzZSAwOgotCQkJCWRpZCA9IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAxOgotCQkJCWRpZCA9IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAyOgotCQkJCWRpZCA9IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MjsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAzOgotCQkJCWRpZCA9IERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MzsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWdvdG8gZXhpdDsKLQkJCX0KLQorCQkJZGlkID0gRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoCisJCQkJCXNtZS0+a2V5X2lkeCArIDEpOwogCQkJcmVzdWx0ID0gcHJpc20yX2RvbWlic2V0X3BzdHIzMih3bGFuZGV2LAogCQkJCQkJCWRpZCwgc21lLT5rZXlfbGVuLAogCQkJCQkJCSh1OCAqKXNtZS0+a2V5KTsKQEAgLTYxOCw3ICs1NjMsNyBAQAogc3RhdGljIGludCBwcmlzbTJfZGlzY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICB1MTYgcmVhc29uX2NvZGUpCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwogCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luIG1zZ19qb2luOwogCWludCByZXN1bHQ7CiAJaW50IGVyciA9IDA7CkBAIC02NTIsNyArNTk3LDcgQEAKIAkJCSAgICAgICBlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLCBpbnQgbWJtKQogewogCXN0cnVjdCBwcmlzbTJfd2lwaHlfcHJpdmF0ZSAqcHJpdiA9IHdpcGh5X3ByaXYod2lwaHkpOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IHByaXYtPndsYW5kZXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBwcml2LT53bGFuZGV2OwogCXUzMiBkYXRhOwogCWludCByZXN1bHQ7CiAJaW50IGVyciA9IDA7CkBAIC02NzksMTMgKzYyNCwxMyBAQAogCQkJICAgICAgIGludCAqZGJtKQogewogCXN0cnVjdCBwcmlzbTJfd2lwaHlfcHJpdmF0ZSAqcHJpdiA9IHdpcGh5X3ByaXYod2lwaHkpOwotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IHByaXYtPndsYW5kZXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBwcml2LT53bGFuZGV2OwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0IG1zZzsKLQlwODAyMTFpdGVtX3VpbnQzMl90ICptaWJpdGVtOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiAqbWliaXRlbTsKIAlpbnQgcmVzdWx0OwogCWludCBlcnIgPSAwOwogCi0JbWliaXRlbSA9IChwODAyMTFpdGVtX3VpbnQzMl90ICopJm1zZy5taWJhdHRyaWJ1dGUuZGF0YTsKKwltaWJpdGVtID0gKHN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiAqKSZtc2cubWliYXR0cmlidXRlLmRhdGE7CiAJbXNnLm1zZ2NvZGUgPSBESURtc2dfZG90MTFyZXFfbWliZ2V0OwogCW1pYml0ZW0tPmRpZCA9CiAJICAgIERJRG1pYl9kb3QxMXBoeV9kb3QxMVBoeVR4UG93ZXJUYWJsZV9kb3QxMUN1cnJlbnRUeFBvd2VyTGV2ZWw7CkBAIC03MDQsNyArNjQ5LDcgQEAKIH0KIAogLyogSW50ZXJmYWNlIGNhbGxiYWNrIGZ1bmN0aW9ucywgcGFzc2luZyBkYXRhIGJhY2sgdXAgdG8gdGhlIGNmZzgwMjExIGxheWVyICovCi12b2lkIHByaXNtMl9jb25uZWN0X3Jlc3VsdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4IGZhaWxlZCkKK3ZvaWQgcHJpc20yX2Nvbm5lY3RfcmVzdWx0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1OCBmYWlsZWQpCiB7CiAJdTE2IHN0YXR1cyA9IGZhaWxlZCA/CiAJCSAgICAgV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSA6IFdMQU5fU1RBVFVTX1NVQ0NFU1M7CkBAIC03MTMsMTMgKzY1OCwxMyBAQAogCQkJCU5VTEwsIDAsIE5VTEwsIDAsIHN0YXR1cywgR0ZQX0tFUk5FTCk7CiB9CiAKLXZvaWQgcHJpc20yX2Rpc2Nvbm5lY3RlZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCit2b2lkIHByaXNtMl9kaXNjb25uZWN0ZWQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJY2ZnODAyMTFfZGlzY29ubmVjdGVkKHdsYW5kZXYtPm5ldGRldiwgMCwgTlVMTCwKLQkJMCwgZmFsc2UsIEdGUF9LRVJORUwpOworCQkJICAgICAgMCwgZmFsc2UsIEdGUF9LRVJORUwpOwogfQogCi12b2lkIHByaXNtMl9yb2FtZWQod2xhbmRldmljZV90ICp3bGFuZGV2KQordm9pZCBwcmlzbTJfcm9hbWVkKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCWNmZzgwMjExX3JvYW1lZCh3bGFuZGV2LT5uZXRkZXYsIE5VTEwsIHdsYW5kZXYtPmJzc2lkLAogCQlOVUxMLCAwLCBOVUxMLCAwLCBHRlBfS0VSTkVMKTsKQEAgLTc0NCw3ICs2ODksNyBAQAogfTsKIAogLyogRnVuY3Rpb25zIHRvIGNyZWF0ZS9mcmVlIHdpcGh5IGludGVyZmFjZSAqLwotc3RhdGljIHN0cnVjdCB3aXBoeSAqd2xhbl9jcmVhdGVfd2lwaHkoc3RydWN0IGRldmljZSAqZGV2LCB3bGFuZGV2aWNlX3QgKndsYW5kZXYpCitzdGF0aWMgc3RydWN0IHdpcGh5ICp3bGFuX2NyZWF0ZV93aXBoeShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCXN0cnVjdCB3aXBoeSAqd2lwaHk7CiAJc3RydWN0IHByaXNtMl93aXBoeV9wcml2YXRlICpwcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCmluZGV4IGNlYzZkMGIuLjQzYzI5OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKQEAgLTEsNTcgKzEsNTcgQEAKIC8qIGhmYTM4NHguaAotKgotKiBEZWZpbmVzIHRoZSBjb25zdGFudHMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGhmYTM4NHgKLSoKLSogQ29weXJpZ2h0IChDKSAxOTk5IEFic29sdXRlVmFsdWUgU3lzdGVtcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogbGludXgtd2xhbgotKgotKiAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCi0qICAgTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUKLSogICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKLSogICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KLSoKLSogICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKLSogICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0qICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCi0qICAgcmlnaHRzIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSoKLSogICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQotKiAgIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyICh0aGUgIkdQTCIpLCBpbiB3aGljaAotKiAgIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQotKiAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCi0qICAgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdQTCBhbmQgbm90IHRvIGFsbG93IG90aGVycyB0byB1c2UKLSogICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24KLSogICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQotKiAgIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBHUEwuICBJZiB5b3UgZG8gbm90IGRlbGV0ZQotKiAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzCi0qICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBJbnF1aXJpZXMgcmVnYXJkaW5nIHRoZSBsaW51eC13bGFuIE9wZW4gU291cmNlIHByb2plY3QgY2FuIGJlCi0qIG1hZGUgZGlyZWN0bHkgdG86Ci0qCi0qIEFic29sdXRlVmFsdWUgU3lzdGVtcyBJbmMuCi0qIGluZm9AbGludXgtd2xhbi5jb20KLSogaHR0cDovL3d3dy5saW51eC13bGFuLmNvbQotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBQb3J0aW9ucyBvZiB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIGZ1bmRlZCBieQotKiBJbnRlcnNpbCBDb3Jwb3JhdGlvbiBhcyBwYXJ0IG9mIFBSSVNNKFIpIGNoaXBzZXQgcHJvZHVjdCBkZXZlbG9wbWVudC4KLSoKLSogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSoKLSogICBbSW1wbGVtZW50YXRpb24gYW5kIHVzYWdlIG5vdGVzXQotKgotKiAgIFtSZWZlcmVuY2VzXQotKglDVzEwIFByb2dyYW1tZXIncyBNYW51YWwgdjEuNQotKglJRUVFIDgwMi4xMSBEMTAuMAotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KKyAqCisgKiBEZWZpbmVzIHRoZSBjb25zdGFudHMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGhmYTM4NHgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBsaW51eC13bGFuCisgKgorICogICBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBNb3ppbGxhIFB1YmxpYworICogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQorICogICBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YKKyAqICAgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvCisgKgorICogICBTb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMKKyAqICAgSVMiIGJhc2lzLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgorICogICAgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nCisgKiAgIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogICBBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZQorICogICB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiAodGhlICJHUEwiKSwgaW4gd2hpY2gKKyAqICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCisgKiAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgKiAgIG9ubHkgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlCisgKiAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgorICogICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQorICogICBhbmQgb3RoZXIgcHJvdmlzaW9ucyByZXF1aXJlZCBieSB0aGUgR1BMLiAgSWYgeW91IGRvIG5vdCBkZWxldGUKKyAqICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKKyAqICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgR1BMLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSW5xdWlyaWVzIHJlZ2FyZGluZyB0aGUgbGludXgtd2xhbiBPcGVuIFNvdXJjZSBwcm9qZWN0IGNhbiBiZQorICogbWFkZSBkaXJlY3RseSB0bzoKKyAqCisgKiBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMgSW5jLgorICogaW5mb0BsaW51eC13bGFuLmNvbQorICogaHR0cDovL3d3dy5saW51eC13bGFuLmNvbQorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogUG9ydGlvbnMgb2YgdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgc29mdHdhcmUgd2VyZSBmdW5kZWQgYnkKKyAqIEludGVyc2lsIENvcnBvcmF0aW9uIGFzIHBhcnQgb2YgUFJJU00oUikgY2hpcHNldCBwcm9kdWN0IGRldmVsb3BtZW50LgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBbSW1wbGVtZW50YXRpb24gYW5kIHVzYWdlIG5vdGVzXQorICoKKyAqICAgW1JlZmVyZW5jZXNdCisgKglDVzEwIFByb2dyYW1tZXIncyBNYW51YWwgdjEuNQorICoJSUVFRSA4MDIuMTEgRDEwLjAKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKICNpZm5kZWYgX0hGQTM4NHhfSAogI2RlZmluZSBfSEZBMzg0eF9ICkBAIC02Myw3ICs2Myw3IEBACiAKIC8qLS0tIE1pbnMgJiBNYXhzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUJSEZBMzg0eF9QT1JUSURfTUFYCQkoKHUxNik3KQotI2RlZmluZQlIRkEzODR4X05VTVBPUlRTX01BWAkJKCh1MTYpKEhGQTM4NHhfUE9SVElEX01BWCsxKSkKKyNkZWZpbmUJSEZBMzg0eF9OVU1QT1JUU19NQVgJCSgodTE2KShIRkEzODR4X1BPUlRJRF9NQVggKyAxKSkKICNkZWZpbmUJSEZBMzg0eF9QRFJfTEVOX01BWAkJKCh1MTYpNTEyKSAvKiBpbiBieXRlcywgZnJvbSBFSyAqLwogI2RlZmluZQlIRkEzODR4X1BEQV9SRUNTX01BWAkJKCh1MTYpMjAwKSAvKiBhIGd1ZXNzICovCiAjZGVmaW5lCUhGQTM4NHhfUERBX0xFTl9NQVgJCSgodTE2KTEwMjQpIC8qIGluIGJ5dGVzLCBmcm9tIEVLKi8KQEAgLTExMCwyMCArMTEwLDIxIEBACiAjZGVmaW5lCQlIRkEzODR4X0FERFJfRkxBVF9DTURfT0ZGX01BU0sJKDB4MDAwMGZmZmYpCiAKIC8qIE1hc2sgYml0cyBmb3IgZGlzY2FyZGluZyB1bndhbnRlZCBwaWVjZXMgaW4gQVVYIGZvcm1hdAotICAgMTYtYml0IGFkZHJlc3MgcGFydHMgKi8KKyAqIDE2LWJpdCBhZGRyZXNzIHBhcnRzCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfQUREUl9BVVhfUEFHRV9NQVNLCSgweGZmZmYpCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQVVYX09GRl9NQVNLCSgweDAwN2YpCiAKIC8qIE1ha2UgYSAzMi1iaXQgZmxhdCBhZGRyZXNzIGZyb20gQVVYIGZvcm1hdCAxNi1iaXQgcGFnZSBhbmQgb2Zmc2V0ICovCiAjZGVmaW5lCQlIRkEzODR4X0FERFJfQVVYX01LRkxBVChwLCBvKQlcCi0JCSgoKCh1MzIpKCgodTE2KShwKSkmSEZBMzg0eF9BRERSX0FVWF9QQUdFX01BU0spKSA8PCA3KSB8IFwKLQkJKCh1MzIpKCgodTE2KShvKSkmSEZBMzg0eF9BRERSX0FVWF9PRkZfTUFTSykpKQorCQkoKCgodTMyKSgoKHUxNikocCkpICYgSEZBMzg0eF9BRERSX0FVWF9QQUdFX01BU0spKSA8PCA3KSB8IFwKKwkJKCh1MzIpKCgodTE2KShvKSkgJiBIRkEzODR4X0FERFJfQVVYX09GRl9NQVNLKSkpCiAKIC8qIE1ha2UgQ01EIGZvcm1hdCBvZmZzZXQgYW5kIHBhZ2UgZnJvbSBhIDMyLWJpdCBmbGF0IGFkZHJlc3MgKi8KICNkZWZpbmUJCUhGQTM4NHhfQUREUl9DTURfTUtQQUdFKGYpIFwKLQkJKCh1MTYpKCgoKHUzMikoZikpJkhGQTM4NHhfQUREUl9GTEFUX0NNRF9QQUdFX01BU0spPj4xNikpCisJCSgodTE2KSgoKCh1MzIpKGYpKSAmIEhGQTM4NHhfQUREUl9GTEFUX0NNRF9QQUdFX01BU0spID4+IDE2KSkKICNkZWZpbmUJCUhGQTM4NHhfQUREUl9DTURfTUtPRkYoZikgXAotCQkoKHUxNikoKCh1MzIpKGYpKSZIRkEzODR4X0FERFJfRkxBVF9DTURfT0ZGX01BU0spKQorCQkoKHUxNikoKCh1MzIpKGYpKSAmIEhGQTM4NHhfQUREUl9GTEFUX0NNRF9PRkZfTUFTSykpCiAKIC8qLS0tIENvbnRyb2xsZXIgTWVtb3J5IGFkZHJlc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KICNkZWZpbmUJCUhGQTM4NDJfUERBX0JBU0UJKDB4MDA3ZjAwMDBVTCkKQEAgLTE3MywxMSArMTc0LDEyIEBACiAjZGVmaW5lCQlIRkEzODR4X0NNRF9FUlIJCQkoKHUxNikoMHg3RikpCiAKIC8qLS0tIFByb2dyYW1taW5nIE1vZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JTU9ERSAwOiBEaXNhYmxlIHByb2dyYW1taW5nCi0JTU9ERSAxOiBFbmFibGUgdm9sYXRpbGUgbWVtb3J5IHByb2dyYW1taW5nCi0JTU9ERSAyOiBFbmFibGUgbm9uLXZvbGF0aWxlIG1lbW9yeSBwcm9ncmFtbWluZwotCU1PREUgMzogUHJvZ3JhbSBub24tdm9sYXRpbGUgbWVtb3J5IHNlY3Rpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqCU1PREUgMDogRGlzYWJsZSBwcm9ncmFtbWluZworICoJTU9ERSAxOiBFbmFibGUgdm9sYXRpbGUgbWVtb3J5IHByb2dyYW1taW5nCisgKglNT0RFIDI6IEVuYWJsZSBub24tdm9sYXRpbGUgbWVtb3J5IHByb2dyYW1taW5nCisgKglNT0RFIDM6IFByb2dyYW0gbm9uLXZvbGF0aWxlIG1lbW9yeSBzZWN0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9QUk9HTU9ERV9ESVNBQkxFCSgodTE2KTB4MDApCiAjZGVmaW5lCQlIRkEzODR4X1BST0dNT0RFX1JBTQkJKCh1MTYpMHgwMSkKICNkZWZpbmUJCUhGQTM4NHhfUFJPR01PREVfTlYJCSgodTE2KTB4MDIpCkBAIC0xODUsOCArMTg3LDkgQEAKIAogLyotLS0gUmVjb3JkIElEIENvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db25maWd1cmF0aW9uIFJJRHM6IE5ldHdvcmsgUGFyYW1ldGVycywgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIENvbmZpZ3VyYXRpb24gUklEczogTmV0d29yayBQYXJhbWV0ZXJzLCBTdGF0aWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZQT1JUVFlQRQkJKCh1MTYpMHhGQzAwKQogI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUgkoKHUxNikweEZDMDEpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZERVNJUkVEU1NJRAkoKHUxNikweEZDMDIpCkBAIC0xOTUsMTcgKzE5OCwxOSBAQAogI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTgkoKHUxNikweEZDMDcpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvbmZpZ3VyYXRpb24gUklEIGxlbmd0aHM6IE5ldHdvcmsgUGFyYW1zLCBTdGF0aWMgQ29uZmlnIEVudGl0aWVzCi0gIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKLSAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQ29uZmlndXJhdGlvbiBSSUQgbGVuZ3RoczogTmV0d29yayBQYXJhbXMsIFN0YXRpYyBDb25maWcgRW50aXRpZXMKKyAqIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKKyAqIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9SSURfQ05GT1dOTUFDQUREUl9MRU4JKCh1MTYpNikKICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORkRFU0lSRURTU0lEX0xFTgkoKHUxNikzNCkKICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORk9XTlNTSURfTEVOCSgodTE2KTM0KQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db25maWd1cmF0aW9uIFJJRHM6IE5ldHdvcmsgUGFyYW1ldGVycywgRHluYW1pYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBDb25maWd1cmF0aW9uIFJJRHM6IE5ldHdvcmsgUGFyYW1ldGVycywgRHluYW1pYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUklEX0NSRUFURUlCU1MJCSgodTE2KTB4RkM4MSkKICNkZWZpbmUJCUhGQTM4NHhfUklEX0ZSQUdUSFJFU0gJCSgodTE2KTB4RkM4MikKICNkZWZpbmUJCUhGQTM4NHhfUklEX1JUU1RIUkVTSAkJKCh1MTYpMHhGQzgzKQpAQCAtMjEzLDggKzIxOCw5IEBACiAjZGVmaW5lCQlIRkEzODR4X1JJRF9QUk9NSVNDTU9ERQkJKCh1MTYpMHhGQzg1KQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUluZm9ybWF0aW9uIFJJRHM6IE5JQyBJbmZvcm1hdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogSW5mb3JtYXRpb24gUklEczogTklDIEluZm9ybWF0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9SSURfTUFYTE9BRFRJTUUJCSgodTE2KTB4RkQwMCkKICNkZWZpbmUJCUhGQTM4NHhfUklEX0RPV05MT0FEQlVGRkVSCSgodTE2KTB4RkQwMSkKICNkZWZpbmUJCUhGQTM4NHhfUklEX1BSSUlERU5USVRZCQkoKHUxNikweEZEMDIpCkBAIC0yMzAsMTUgKzIzNiwxNyBAQAogI2RlZmluZQkJSEZBMzg0eF9SSURfU1RBX0NGSUFDVFJBTkdFUwkoKHUxNikweEZEMjMpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSW5mb3JtYXRpb24gUklEIExlbmd0aHM6IE5JQyBJbmZvcm1hdGlvbgotICBUaGlzIGlzIHRoZSBsZW5ndGggb2YgSlVTVCB0aGUgREFUQSBwYXJ0IG9mIHRoZSBSSUQgKGRvZXMgbm90Ci0gIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEluZm9ybWF0aW9uIFJJRCBMZW5ndGhzOiBOSUMgSW5mb3JtYXRpb24KKyAqIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKKyAqIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUklEX05JQ1NFUklBTE5VTUJFUl9MRU4JCSgodTE2KTEyKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbmZvcm1hdGlvbiBSSURzOiAgTUFDIEluZm9ybWF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBJbmZvcm1hdGlvbiBSSURzOiAgTUFDIEluZm9ybWF0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUklEX1BPUlRTVEFUVVMJCSgodTE2KTB4RkQ0MCkKICNkZWZpbmUJCUhGQTM4NHhfUklEX0NVUlJFTlRTU0lECQkoKHUxNikweEZENDEpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQlNTSUQJKCh1MTYpMHhGRDQyKQpAQCAtMjUwLDIzICsyNTgsMjYgQEAKICNkZWZpbmUJCUhGQTM4NHhfUklEX0RCTUNPTU1TUVVBTElUWQkoKHUxNikweEZENTEpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUluZm9ybWF0aW9uIFJJRCBMZW5ndGhzOiAgTUFDIEluZm9ybWF0aW9uCi0gIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKLSAgaW5jbHVkZSB0aGUgbGVuIG9yIGNvZGUgZmllbGRzKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogSW5mb3JtYXRpb24gUklEIExlbmd0aHM6ICBNQUMgSW5mb3JtYXRpb24KKyAqIFRoaXMgaXMgdGhlIGxlbmd0aCBvZiBKVVNUIHRoZSBEQVRBIHBhcnQgb2YgdGhlIFJJRCAoZG9lcyBub3QKKyAqIGluY2x1ZGUgdGhlIGxlbiBvciBjb2RlIGZpZWxkcykKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9SSURfREJNQ09NTVNRVUFMSVRZX0xFTgkgXAotCSgodTE2KSBzaXplb2YoaGZhMzg0eF9kYm1jb21tc3F1YWxpdHlfdCkpCisJKCh1MTYpc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2RibWNvbW1zcXVhbGl0eSkpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9KT0lOUkVRVUVTVF9MRU4gXAotCSgodTE2KXNpemVvZihoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdCkpCisJKCh1MTYpc2l6ZW9mKHN0cnVjdCBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGEpKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbmZvcm1hdGlvbiBSSURzOiAgTW9kZW0gSW5mb3JtYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEluZm9ybWF0aW9uIFJJRHM6ICBNb2RlbSBJbmZvcm1hdGlvbgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DVVJSRU5UQ0hBTk5FTAkoKHUxNikweEZEQzEpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUFQSSBFTkhBTkNFTUVOVFMgKE5PVCBBTFJFQURZIElNUExFTUVOVEVEKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQVBJIEVOSEFOQ0VNRU5UUyAoTk9UIEFMUkVBRFkgSU1QTEVNRU5URUQpCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVlJRAkoKHUxNikweEZDMjMpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMAkoKHUxNikweEZDMjQpCiAjZGVmaW5lCQlIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMQkoKHUxNikweEZDMjUpCkBAIC0yOTAsOCArMzAxLDkgQEAKICNkZWZpbmUJCUhGQTM4NHhfUklEX0NORldFUDEyOERFRkFVTFRLRVlfTEVOCSgodTE2KTE0KQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1QRCBSZWNvcmQgY29kZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIFBEIFJlY29yZCBjb2RlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lIEhGQTM4NHhfUERSX1BDQl9QQVJUTlVNCQkoKHUxNikweDAwMDEpCiAjZGVmaW5lIEhGQTM4NHhfUERSX1BEQVZFUgkJKCh1MTYpMHgwMDAyKQogI2RlZmluZSBIRkEzODR4X1BEUl9OSUNfU0VSSUFMCQkoKHUxNikweDAwMDMpCkBAIC0zNTUsMzEgKzM2NywzMiBAQAogCXU4IGRhdGFbMF07CiB9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMiB7CitzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyMzIgewogCXUxNiBsZW47CiAJdTggZGF0YVszMl07Ci19IF9fcGFja2VkIGhmYTM4NHhfYnl0ZXN0cjMyX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db25maWd1cmF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOgotCU5ldHdvcmsgUGFyYW1ldGVycywgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIENvbmZpZ3VyYXRpb24gUmVjb3JkIFN0cnVjdHVyZXM6CisgKglOZXR3b3JrIFBhcmFtZXRlcnMsIFN0YXRpYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAogLyotLSBIYXJkd2FyZS9GaXJtd2FyZSBDb21wb25lbnQgSW5mb3JtYXRpb24gLS0tLS0tLS0tLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCB7CitzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQgewogCXUxNiBpZDsKIAl1MTYgdmFyaWFudDsKIAl1MTYgbWFqb3I7CiAJdTE2IG1pbm9yOwotfSBfX3BhY2tlZCBoZmEzODR4X2NvbXBpZGVudF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCB7CitzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCB7CiAJdTE2IHJvbGU7CiAJdTE2IGlkOwogCXUxNiB2YXJpYW50OwogCXUxNiBib3R0b207CiAJdTE2IHRvcDsKLX0gX19wYWNrZWQgaGZhMzg0eF9jYXBsZXZlbF90OworfSBfX3BhY2tlZDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogY25mQXV0aGVudGljYXRpb24gLS0qLwogI2RlZmluZSBIRkEzODR4X0NORkFVVEhFTlRJQ0FUSU9OX09QRU5TWVNURU0JMHgwMDAxCkBAIC0zODcsNzcgKzQwMCw4MSBAQAogI2RlZmluZSBIRkEzODR4X0NORkFVVEhFTlRJQ0FUSU9OX0xFQVAJCTB4MDAwNAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db25maWd1cmF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOgotCU5ldHdvcmsgUGFyYW1ldGVycywgRHluYW1pYyBDb25maWd1cmF0aW9uIEVudGl0aWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBDb25maWd1cmF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOgorICoJTmV0d29yayBQYXJhbWV0ZXJzLCBEeW5hbWljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAjZGVmaW5lIEhGQTM4NHhfQ1JFQVRFSUJTU19KT0lOQ1JFQVRFSUJTUyAgICAgICAgICAwCiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IEhvc3RTY2FuUmVxdWVzdCAoZGF0YSBwb3J0aW9uIG9ubHkpIC0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGEgeworc3RydWN0IGhmYTM4NHhfSG9zdFNjYW5SZXF1ZXN0X2RhdGEgewogCXUxNiBjaGFubmVsTGlzdDsKIAl1MTYgdHhSYXRlOwotCWhmYTM4NHhfYnl0ZXN0cjMyX3Qgc3NpZDsKLX0gX19wYWNrZWQgaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YV90OworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMiBzc2lkOworfSBfX3BhY2tlZDsKIAogLyotLSBDb25maWd1cmF0aW9uIFJlY29yZDogSm9pblJlcXVlc3QgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGEgeworc3RydWN0IGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YSB7CiAJdTggYnNzaWRbV0xBTl9CU1NJRF9MRU5dOwogCXUxNiBjaGFubmVsOwotfSBfX3BhY2tlZCBoZmEzODR4X0pvaW5SZXF1ZXN0X2RhdGFfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IGF1dGhlbnRpY2F0ZVN0YXRpb24gKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X2F1dGhlbnRpY2F0ZVN0YXRpb25fZGF0YSB7CitzdHJ1Y3QgaGZhMzg0eF9hdXRoZW50aWNhdGVTdGF0aW9uX2RhdGEgewogCXU4IGFkZHJlc3NbRVRIX0FMRU5dOwogCXUxNiBzdGF0dXM7CiAJdTE2IGFsZ29yaXRobTsKLX0gX19wYWNrZWQgaGZhMzg0eF9hdXRoZW50aWNhdGVTdGF0aW9uX2RhdGFfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0gQ29uZmlndXJhdGlvbiBSZWNvcmQ6IFdQQURhdGEgICAgICAgKGRhdGEgcG9ydGlvbiBvbmx5KSAtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X1dQQURhdGEgeworc3RydWN0IGhmYTM4NHhfV1BBRGF0YSB7CiAJdTE2IGRhdGFsZW47CiAJdTggZGF0YVswXTsJCS8qIG1heCA4MCAqLwotfSBfX3BhY2tlZCBoZmEzODR4X1dQQURhdGFfdDsKK30gX19wYWNrZWQ7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUluZm9ybWF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOiBOSUMgSW5mb3JtYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEluZm9ybWF0aW9uIFJlY29yZCBTdHJ1Y3R1cmVzOiBOSUMgSW5mb3JtYXRpb24KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogRG93bkxvYWRCdWZmZXIgLS0qLwogLyogTk9URTogVGhlIHBhZ2UgYW5kIG9mZnNldCBhcmUgaW4gQVVYIGZvcm1hdCAqLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9kb3dubG9hZGJ1ZmZlciB7CitzdHJ1Y3QgaGZhMzg0eF9kb3dubG9hZGJ1ZmZlciB7CiAJdTE2IHBhZ2U7CiAJdTE2IG9mZnNldDsKIAl1MTYgbGVuOwotfSBfX3BhY2tlZCBoZmEzODR4X2Rvd25sb2FkYnVmZmVyX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbmZvcm1hdGlvbiBSZWNvcmQgU3RydWN0dXJlczogTklDIEluZm9ybWF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBJbmZvcm1hdGlvbiBSZWNvcmQgU3RydWN0dXJlczogTklDIEluZm9ybWF0aW9uCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIAogI2RlZmluZSBIRkEzODR4X1BTVEFUVVNfQ09OTl9JQlNTCSgodTE2KTMpCiAKIC8qLS0gSW5mb3JtYXRpb24gUmVjb3JkOiBjb21tc3F1YWxpdHkgLS0qLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9jb21tc3F1YWxpdHkgeworc3RydWN0IGhmYTM4NHhfY29tbXNxdWFsaXR5IHsKIAl1MTYgQ1FfY3VyckJTUzsKIAl1MTYgQVNMX2N1cnJCU1M7CiAJdTE2IEFOTF9jdXJyRkM7Ci19IF9fcGFja2VkIGhmYTM4NHhfY29tbXNxdWFsaXR5X3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tIEluZm9ybWF0aW9uIFJlY29yZDogZG1iY29tbXNxdWFsaXR5IC0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfZGJtY29tbXNxdWFsaXR5IHsKK3N0cnVjdCBoZmEzODR4X2RibWNvbW1zcXVhbGl0eSB7CiAJdTE2IENRZGJtX2N1cnJCU1M7CiAJdTE2IEFTTGRibV9jdXJyQlNTOwogCXUxNiBBTkxkYm1fY3VyckZDOwotfSBfX3BhY2tlZCBoZmEzODR4X2RibWNvbW1zcXVhbGl0eV90OworfSBfX3BhY2tlZDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotRlJBTUUgU1RSVUNUVVJFUzogQ29tbXVuaWNhdGlvbiBGcmFtZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvbW11bmljYXRpb24gRnJhbWVzOiBUcmFuc21pdCBGcmFtZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEZSQU1FIFNUUlVDVFVSRVM6IENvbW11bmljYXRpb24gRnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb21tdW5pY2F0aW9uIEZyYW1lczogVHJhbnNtaXQgRnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIC8qLS0gQ29tbXVuaWNhdGlvbiBGcmFtZTogVHJhbnNtaXQgRnJhbWUgU3RydWN0dXJlIC0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdHhfZnJhbWUgeworc3RydWN0IGhmYTM4NHhfdHhfZnJhbWUgewogCXUxNiBzdGF0dXM7CiAJdTE2IHJlc2VydmVkMTsKIAl1MTYgcmVzZXJ2ZWQyOwpAQCAtNDgyLDEwICs0OTksMTEgQEAKIAl1OCBkZXN0X2FkZHJbNl07CiAJdTggc3JjX2FkZHJbNl07CiAJdTE2IGRhdGFfbGVuZ3RoOwkvKiBiaWcgZW5kaWFuIGZvcm1hdCAqLwotfSBfX3BhY2tlZCBoZmEzODR4X3R4X2ZyYW1lX3Q7Cit9IF9fcGFja2VkOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29tbXVuaWNhdGlvbiBGcmFtZXM6IEZpZWxkIE1hc2tzIGZvciBUcmFuc21pdCBGcmFtZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIENvbW11bmljYXRpb24gRnJhbWVzOiBGaWVsZCBNYXNrcyBmb3IgVHJhbnNtaXQgRnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIC8qLS0gU3RhdHVzIEZpZWxkIC0tKi8KICNkZWZpbmUJCUhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSCQkJKCh1MTYpQklUKDUpKQogI2RlZmluZQkJSEZBMzg0eF9UWFNUQVRVU19GT1JNRVJSCQkoKHUxNilCSVQoMykpCkBAIC00OTksMTYgKzUxNywxNyBAQAogI2RlZmluZQkJSEZBMzg0eF9UWF9UWEVYCQkJCSgodTE2KUJJVCgyKSkKICNkZWZpbmUJCUhGQTM4NHhfVFhfVFhPSwkJCQkoKHUxNilCSVQoMSkpCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1Db21tdW5pY2F0aW9uIEZyYW1lczogVGVzdC9HZXQvU2V0IEZpZWxkIFZhbHVlcyBmb3IgVHJhbnNtaXQgRnJhbWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBDb21tdW5pY2F0aW9uIEZyYW1lczogVGVzdC9HZXQvU2V0IEZpZWxkIFZhbHVlcyBmb3IgVHJhbnNtaXQgRnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIC8qLS0gU3RhdHVzIEZpZWxkIC0tKi8KICNkZWZpbmUgSEZBMzg0eF9UWFNUQVRVU19JU0VSUk9SKHYpCVwKLQkoKCh1MTYpKHYpKSZcCi0JKEhGQTM4NHhfVFhTVEFUVVNfQUNLRVJSfEhGQTM4NHhfVFhTVEFUVVNfRk9STUVSUnxcCi0JSEZBMzg0eF9UWFNUQVRVU19ESVNDT058SEZBMzg0eF9UWFNUQVRVU19BR0VERVJSfFwKKwkoKCh1MTYpKHYpKSAmIFwKKwkoSEZBMzg0eF9UWFNUQVRVU19BQ0tFUlIgfCBIRkEzODR4X1RYU1RBVFVTX0ZPUk1FUlIgfCBcCisJSEZBMzg0eF9UWFNUQVRVU19ESVNDT04gfCBIRkEzODR4X1RYU1RBVFVTX0FHRURFUlIgfCBcCiAJSEZBMzg0eF9UWFNUQVRVU19SRVRSWUVSUikpCiAKLSNkZWZpbmUJSEZBMzg0eF9UWF9TRVQodiwgbSwgcykJCSgoKCh1MTYpKHYpKTw8KCh1MTYpKHMpKSkmKCh1MTYpKG0pKSkKKyNkZWZpbmUJSEZBMzg0eF9UWF9TRVQodiwgbSwgcykJCSgoKCh1MTYpKHYpKSA8PCAoKHUxNikocykpKSAmICgodTE2KShtKSkpCiAKICNkZWZpbmUJSEZBMzg0eF9UWF9NQUNQT1JUX1NFVCh2KQlIRkEzODR4X1RYX1NFVCh2LCBIRkEzODR4X1RYX01BQ1BPUlQsIDgpCiAjZGVmaW5lCUhGQTM4NHhfVFhfU1RSVUNUWVBFX1NFVCh2KQlIRkEzODR4X1RYX1NFVCh2LCBcCkBAIC01MTYsMTAgKzUzNSwxMSBAQAogI2RlZmluZQlIRkEzODR4X1RYX1RYRVhfU0VUKHYpCQlIRkEzODR4X1RYX1NFVCh2LCBIRkEzODR4X1RYX1RYRVgsIDIpCiAjZGVmaW5lCUhGQTM4NHhfVFhfVFhPS19TRVQodikJCUhGQTM4NHhfVFhfU0VUKHYsIEhGQTM4NHhfVFhfVFhPSywgMSkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNvbW11bmljYXRpb24gRnJhbWVzOiBSZWNlaXZlIEZyYW1lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFJlY2VpdmUgRnJhbWVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIC8qLS0gQ29tbXVuaWNhdGlvbiBGcmFtZTogUmVjZWl2ZSBGcmFtZSBTdHJ1Y3R1cmUgLS0qLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9yeF9mcmFtZSB7CitzdHJ1Y3QgaGZhMzg0eF9yeF9mcmFtZSB7CiAJLyotLSBNQUMgcnggZGVzY3JpcHRvciAoaGZhMzg0eCBieXRlIG9yZGVyKSAtLSovCiAJdTE2IHN0YXR1czsKIAl1MzIgdGltZTsKQEAgLTU0NCwxMCArNTY0LDExIEBACiAJdTggZGVzdF9hZGRyWzZdOwogCXU4IHNyY19hZGRyWzZdOwogCXUxNiBkYXRhX2xlbmd0aDsJLyogSUVFRT8gKGJpZyBlbmRpYW4pIGZvcm1hdCAqLwotfSBfX3BhY2tlZCBoZmEzODR4X3J4X2ZyYW1lX3Q7Cit9IF9fcGFja2VkOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29tbXVuaWNhdGlvbiBGcmFtZXM6IEZpZWxkIE1hc2tzIGZvciBSZWNlaXZlIEZyYW1lcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogQ29tbXVuaWNhdGlvbiBGcmFtZXM6IEZpZWxkIE1hc2tzIGZvciBSZWNlaXZlIEZyYW1lcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAKIC8qLS0gU3RhdHVzIEZpZWxkcyAtLSovCiAjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX01BQ1BPUlQJCSgodTE2KShCSVQoMTApIHwgXApAQCAtNTU1LDE3ICs1NzYsMTkgQEAKIAkJCQkJCQkJQklUKDgpKSkKICNkZWZpbmUJCUhGQTM4NHhfUlhTVEFUVVNfRkNTRVJSCQkJKCh1MTYpQklUKDApKQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQ29tbXVuaWNhdGlvbiBGcmFtZXM6IFRlc3QvR2V0L1NldCBGaWVsZCBWYWx1ZXMgZm9yIFJlY2VpdmUgRnJhbWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBDb21tdW5pY2F0aW9uIEZyYW1lczogVGVzdC9HZXQvU2V0IEZpZWxkIFZhbHVlcyBmb3IgUmVjZWl2ZSBGcmFtZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogI2RlZmluZQkJSEZBMzg0eF9SWFNUQVRVU19NQUNQT1JUX0dFVCh2YWx1ZSkJKCh1MTYpKCgoKHUxNikodmFsdWUpKSBcCiAJCQkJCSAgICAmIEhGQTM4NHhfUlhTVEFUVVNfTUFDUE9SVCkgPj4gOCkpCiAjZGVmaW5lCQlIRkEzODR4X1JYU1RBVFVTX0lTRkNTRVJSKHZhbHVlKQkoKHUxNikoKCh1MTYpKHZhbHVlKSkgXAogCQkJCQkJICAmIEhGQTM4NHhfUlhTVEFUVVNfRkNTRVJSKSkKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGUkFNRSBTVFJVQ1RVUkVTOiBJbmZvcm1hdGlvbiBUeXBlcyBhbmQgSW5mb3JtYXRpb24gRnJhbWUgU3RydWN0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSW5mb3JtYXRpb24gVHlwZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAqIEZSQU1FIFNUUlVDVFVSRVM6IEluZm9ybWF0aW9uIFR5cGVzIGFuZCBJbmZvcm1hdGlvbiBGcmFtZSBTdHJ1Y3R1cmVzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJbmZvcm1hdGlvbiBUeXBlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiAjZGVmaW5lCQlIRkEzODR4X0lUX0hBTkRPVkVSQUREUgkJCSgodTE2KTB4RjAwMFVMKQogI2RlZmluZQkJSEZBMzg0eF9JVF9DT01NVEFMTElFUwkJCSgodTE2KTB4RjEwMFVMKQogI2RlZmluZQkJSEZBMzg0eF9JVF9TQ0FOUkVTVUxUUwkJCSgodTE2KTB4RjEwMVVMKQpAQCAtNTgwLDEzICs2MDMsMTQgQEAKICNkZWZpbmUJCUhGQTM4NHhfSVRfTUlDRkFJTFVSRQkJCSgodTE2KTB4RjIwNlVMKQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JbmZvcm1hdGlvbiBGcmFtZXMgU3RydWN0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSW5mb3JtYXRpb24gRnJhbWVzOiBOb3RpZmljYXRpb24gRnJhbWUgU3RydWN0dXJlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICogSW5mb3JtYXRpb24gRnJhbWVzIFN0cnVjdHVyZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEluZm9ybWF0aW9uIEZyYW1lczogTm90aWZpY2F0aW9uIEZyYW1lIFN0cnVjdHVyZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogQ29tbXVuaWNhdGlvbiBUYWxsaWVzIC0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ29tbVRhbGxpZXMxNiB7CitzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczE2IHsKIAl1MTYgdHh1bmljYXN0ZnJhbWVzOwogCXUxNiB0eG11bHRpY2FzdGZyYW1lczsKIAl1MTYgdHhmcmFnbWVudHM7CkBAIC02MDgsOSArNjMyLDkgQEAKIAl1MTYgcnhkaXNjYXJkc3dlcHVuZGVjcjsKIAl1MTYgcnhtc2dpbm1zZ2ZyYWc7CiAJdTE2IHJ4bXNnaW5iYWRtc2dmcmFnOwotfSBfX3BhY2tlZCBoZmEzODR4X0NvbW1UYWxsaWVzMTZfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ29tbVRhbGxpZXMzMiB7CitzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczMyIHsKIAl1MzIgdHh1bmljYXN0ZnJhbWVzOwogCXUzMiB0eG11bHRpY2FzdGZyYW1lczsKIAl1MzIgdHhmcmFnbWVudHM7CkBAIC02MzIsNjIgKzY1Niw2MiBAQAogCXUzMiByeGRpc2NhcmRzd2VwdW5kZWNyOwogCXUzMiByeG1zZ2lubXNnZnJhZzsKIAl1MzIgcnhtc2dpbmJhZG1zZ2ZyYWc7Ci19IF9fcGFja2VkIGhmYTM4NHhfQ29tbVRhbGxpZXMzMl90OworfSBfX3BhY2tlZDsKIAogLyotLSAgSW5xdWlyeSBGcmFtZSwgRGlhZ25vc2U6IFNjYW4gUmVzdWx0cyAmIFN1YmZpZWxkcy0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdFN1YiB7CitzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0U3ViIHsKIAl1MTYgY2hpZDsKIAl1MTYgYW5sOwogCXUxNiBzbDsKIAl1OCBic3NpZFtXTEFOX0JTU0lEX0xFTl07CiAJdTE2IGJjbmludDsKIAl1MTYgY2FwaW5mbzsKLQloZmEzODR4X2J5dGVzdHIzMl90IHNzaWQ7CisJc3RydWN0IGhmYTM4NHhfYnl0ZXN0cjMyIHNzaWQ7CiAJdTggc3VwcHJhdGVzWzEwXTsJLyogODAyLjExIGluZm8gZWxlbWVudCAqLwogCXUxNiBwcm9iZXJlc3BfcmF0ZTsKLX0gX19wYWNrZWQgaGZhMzg0eF9TY2FuUmVzdWx0U3ViX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X1NjYW5SZXN1bHQgeworc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdCB7CiAJdTE2IHJzdmQ7CiAJdTE2IHNjYW5yZWFzb247Ci0JaGZhMzg0eF9TY2FuUmVzdWx0U3ViX3QgcmVzdWx0W0hGQTM4NHhfU0NBTlJFU1VMVF9NQVhdOwotfSBfX3BhY2tlZCBoZmEzODR4X1NjYW5SZXN1bHRfdDsKKwlzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0U3ViIHJlc3VsdFtIRkEzODR4X1NDQU5SRVNVTFRfTUFYXTsKK30gX19wYWNrZWQ7CiAKIC8qLS0gIElucXVpcnkgRnJhbWUsIERpYWdub3NlOiBDaEluZm8gUmVzdWx0cyAmIFN1YmZpZWxkcy0tKi8KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViIHsKK3N0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1YiB7CiAJdTE2IGNoaWQ7CiAJdTE2IGFubDsKIAl1MTYgcG5sOwogCXUxNiBhY3RpdmU7Ci19IF9fcGFja2VkIGhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViX3Q7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhGQTM4NHhfQ0hJTkZPUkVTVUxUX0JTU0FDVElWRQlCSVQoMCkKICNkZWZpbmUgSEZBMzg0eF9DSElORk9SRVNVTFRfUENGQUNUSVZFCUJJVCgxKQogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdCB7CitzdHJ1Y3QgaGZhMzg0eF9DaEluZm9SZXN1bHQgewogCXUxNiBzY2FuY2hhbm5lbHM7Ci0JaGZhMzg0eF9DaEluZm9SZXN1bHRTdWJfdCByZXN1bHRbSEZBMzg0eF9DSElORk9SRVNVTFRfTUFYXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9DaEluZm9SZXN1bHRfdDsKKwlzdHJ1Y3QgaGZhMzg0eF9DaEluZm9SZXN1bHRTdWIgcmVzdWx0W0hGQTM4NHhfQ0hJTkZPUkVTVUxUX01BWF07Cit9IF9fcGFja2VkOwogCiAvKi0tICBJbnF1aXJ5IEZyYW1lLCBEaWFnbm9zZTogSG9zdCBTY2FuIFJlc3VsdHMgJiBTdWJmaWVsZHMtLSovCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0hTY2FuUmVzdWx0U3ViIHsKK3N0cnVjdCBoZmEzODR4X0hTY2FuUmVzdWx0U3ViIHsKIAl1MTYgY2hpZDsKIAl1MTYgYW5sOwogCXUxNiBzbDsKIAl1OCBic3NpZFtXTEFOX0JTU0lEX0xFTl07CiAJdTE2IGJjbmludDsKIAl1MTYgY2FwaW5mbzsKLQloZmEzODR4X2J5dGVzdHIzMl90IHNzaWQ7CisJc3RydWN0IGhmYTM4NHhfYnl0ZXN0cjMyIHNzaWQ7CiAJdTggc3VwcHJhdGVzWzEwXTsJLyogODAyLjExIGluZm8gZWxlbWVudCAqLwogCXUxNiBwcm9iZXJlc3BfcmF0ZTsKIAl1MTYgYXRpbTsKLX0gX19wYWNrZWQgaGZhMzg0eF9IU2NhblJlc3VsdFN1Yl90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdCB7CitzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdCB7CiAJdTE2IG5yZXN1bHQ7CiAJdTE2IHJzdmQ7Ci0JaGZhMzg0eF9IU2NhblJlc3VsdFN1Yl90IHJlc3VsdFtIRkEzODR4X0hTQ0FOUkVTVUxUX01BWF07Ci19IF9fcGFja2VkIGhmYTM4NHhfSFNjYW5SZXN1bHRfdDsKKwlzdHJ1Y3QgaGZhMzg0eF9IU2NhblJlc3VsdFN1YiByZXN1bHRbSEZBMzg0eF9IU0NBTlJFU1VMVF9NQVhdOworfSBfX3BhY2tlZDsKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBMaW5rU3RhdHVzIC0tKi8KIApAQCAtNjk5LDkgKzcyMyw5IEBACiAjZGVmaW5lIEhGQTM4NHhfTElOS19BUF9JTlJBTkdFCQkoKHUxNik1KQogI2RlZmluZSBIRkEzODR4X0xJTktfQVNTT0NGQUlMCQkoKHUxNik2KQogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0xpbmtTdGF0dXMgeworc3RydWN0IGhmYTM4NHhfTGlua1N0YXR1cyB7CiAJdTE2IGxpbmtzdGF0dXM7Ci19IF9fcGFja2VkIGhmYTM4NHhfTGlua1N0YXR1c190OworfSBfX3BhY2tlZDsKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBBc3NvY2lhdGlvblN0YXR1cyAoLS0qLwogCkBAIC03MDksNTYgKzczMyw1NyBAQAogI2RlZmluZSBIRkEzODR4X0FTU09DU1RBVFVTX1JFQVNTT0MJKCh1MTYpMikKICNkZWZpbmUgSEZBMzg0eF9BU1NPQ1NUQVRVU19BVVRIRkFJTAkoKHUxNik1KQogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0Fzc29jU3RhdHVzIHsKK3N0cnVjdCBoZmEzODR4X0Fzc29jU3RhdHVzIHsKIAl1MTYgYXNzb2NzdGF0dXM7CiAJdTggc3RhX2FkZHJbRVRIX0FMRU5dOwogCS8qIG9sZF9hcF9hZGRyIGlzIG9ubHkgdmFsaWQgaWYgYXNzb2NzdGF0dXMgPT0gMiAqLwogCXU4IG9sZF9hcF9hZGRyW0VUSF9BTEVOXTsKIAl1MTYgcmVhc29uOwogCXUxNiByZXNlcnZlZDsKLX0gX19wYWNrZWQgaGZhMzg0eF9Bc3NvY1N0YXR1c190OworfSBfX3BhY2tlZDsKIAogLyotLSAgVW5zb2xpY2l0ZWQgRnJhbWUsIE1BQyBNZ210OiBBdXRoUmVxdWVzdCAoQVAgT25seSkgLS0qLwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0F1dGhSZXF1ZXN0IHsKK3N0cnVjdCBoZmEzODR4X0F1dGhSZXF1ZXN0IHsKIAl1OCBzdGFfYWRkcltFVEhfQUxFTl07CiAJdTE2IGFsZ29yaXRobTsKLX0gX19wYWNrZWQgaGZhMzg0eF9BdXRoUmVxX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tICBVbnNvbGljaXRlZCBGcmFtZSwgTUFDIE1nbXQ6IFBTVXNlckNvdW50IChBUCBPbmx5KSAtLSovCiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfUFNVc2VyQ291bnQgeworc3RydWN0IGhmYTM4NHhfUFNVc2VyQ291bnQgewogCXUxNiB1c2VyY250OwotfSBfX3BhY2tlZCBoZmEzODR4X1BTVXNlckNvdW50X3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0tleUlEQ2hhbmdlZCB7CitzdHJ1Y3QgaGZhMzg0eF9LZXlJRENoYW5nZWQgewogCXU4IHN0YV9hZGRyW0VUSF9BTEVOXTsKIAl1MTYga2V5aWQ7Ci19IF9fcGFja2VkIGhmYTM4NHhfS2V5SURDaGFuZ2VkX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tICBDb2xsZWN0aW9uIG9mIGFsbCBJbmYgZnJhbWVzIC0tLS0tLS0tLS0tLS0tLSovCi10eXBlZGVmIHVuaW9uIGhmYTM4NHhfaW5mb2RhdGEgewotCWhmYTM4NHhfQ29tbVRhbGxpZXMxNl90IGNvbW10YWxsaWVzMTY7Ci0JaGZhMzg0eF9Db21tVGFsbGllczMyX3QgY29tbXRhbGxpZXMzMjsKLQloZmEzODR4X1NjYW5SZXN1bHRfdCBzY2FucmVzdWx0OwotCWhmYTM4NHhfQ2hJbmZvUmVzdWx0X3QgY2hpbmZvcmVzdWx0OwotCWhmYTM4NHhfSFNjYW5SZXN1bHRfdCBoc2NhbnJlc3VsdDsKLQloZmEzODR4X0xpbmtTdGF0dXNfdCBsaW5rc3RhdHVzOwotCWhmYTM4NHhfQXNzb2NTdGF0dXNfdCBhc3NvY3N0YXR1czsKLQloZmEzODR4X0F1dGhSZXFfdCBhdXRocmVxOwotCWhmYTM4NHhfUFNVc2VyQ291bnRfdCBwc3VzZXJjbnQ7Ci0JaGZhMzg0eF9LZXlJRENoYW5nZWRfdCBrZXlpZGNoYW5nZWQ7Ci19IF9fcGFja2VkIGhmYTM4NHhfaW5mb2RhdGFfdDsKK3VuaW9uIGhmYTM4NHhfaW5mb2RhdGEgeworCXN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMTYgY29tbXRhbGxpZXMxNjsKKwlzdHJ1Y3QgaGZhMzg0eF9Db21tVGFsbGllczMyIGNvbW10YWxsaWVzMzI7CisJc3RydWN0IGhmYTM4NHhfU2NhblJlc3VsdCBzY2FucmVzdWx0OworCXN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdCBjaGluZm9yZXN1bHQ7CisJc3RydWN0IGhmYTM4NHhfSFNjYW5SZXN1bHQgaHNjYW5yZXN1bHQ7CisJc3RydWN0IGhmYTM4NHhfTGlua1N0YXR1cyBsaW5rc3RhdHVzOworCXN0cnVjdCBoZmEzODR4X0Fzc29jU3RhdHVzIGFzc29jc3RhdHVzOworCXN0cnVjdCBoZmEzODR4X0F1dGhSZXF1ZXN0IGF1dGhyZXE7CisJc3RydWN0IGhmYTM4NHhfUFNVc2VyQ291bnQgcHN1c2VyY250OworCXN0cnVjdCBoZmEzODR4X0tleUlEQ2hhbmdlZCBrZXlpZGNoYW5nZWQ7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lIHsKK3N0cnVjdCBoZmEzODR4X0luZkZyYW1lIHsKIAl1MTYgZnJhbWVsZW47CiAJdTE2IGluZm90eXBlOwotCWhmYTM4NHhfaW5mb2RhdGFfdCBpbmZvOwotfSBfX3BhY2tlZCBoZmEzODR4X0luZkZyYW1lX3Q7CisJdW5pb24gaGZhMzg0eF9pbmZvZGF0YSBpbmZvOworfSBfX3BhY2tlZDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVVNCIFBhY2tldCBzdHJ1Y3R1cmVzIGFuZCBjb25zdGFudHMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBVU0IgUGFja2V0IHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAvKiBTaG91bGQgYmUgc2VudCB0byB0aGUgYnVsa291dCBlbmRwb2ludCAqLwogI2RlZmluZSBIRkEzODR4X1VTQl9UWEZSTQkwCkBAIC03ODMsMTQzICs4MDgsMTQwIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBSZXF1ZXN0IChidWxrIE9VVCkgcGFja2V0IGNvbnRlbnRzICovCiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3R4ZnJtIHsKLQloZmEzODR4X3R4X2ZyYW1lX3QgZGVzYzsKK3N0cnVjdCBoZmEzODR4X3VzYl90eGZybSB7CisJc3RydWN0IGhmYTM4NHhfdHhfZnJhbWUgZGVzYzsKIAl1OCBkYXRhW1dMQU5fREFUQV9NQVhMRU5dOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl90eGZybV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfY21kcmVxIHsKK3N0cnVjdCBoZmEzODR4X3VzYl9jbWRyZXEgewogCXUxNiB0eXBlOwogCXUxNiBjbWQ7CiAJdTE2IHBhcm0wOwogCXUxNiBwYXJtMTsKIAl1MTYgcGFybTI7CiAJdTggcGFkWzU0XTsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2JfY21kcmVxX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl93cmlkcmVxIHsKK3N0cnVjdCBoZmEzODR4X3VzYl93cmlkcmVxIHsKIAl1MTYgdHlwZTsKIAl1MTYgZnJtbGVuOwogCXUxNiByaWQ7CiAJdTggZGF0YVtIRkEzODR4X1JJRERBVEFfTUFYTEVOXTsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2Jfd3JpZHJlcV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlcSB7CitzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlcSB7CiAJdTE2IHR5cGU7CiAJdTE2IGZybWxlbjsKIAl1MTYgcmlkOwogCXU4IHBhZFs1OF07Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX3JyaWRyZXFfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3dtZW1yZXEgeworc3RydWN0IGhmYTM4NHhfdXNiX3dtZW1yZXEgewogCXUxNiB0eXBlOwogCXUxNiBmcm1sZW47CiAJdTE2IG9mZnNldDsKIAl1MTYgcGFnZTsKIAl1OCBkYXRhW0hGQTM4NHhfVVNCX1JXTUVNX01BWExFTl07Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX3dtZW1yZXFfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXEgeworc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXEgewogCXUxNiB0eXBlOwogCXUxNiBmcm1sZW47CiAJdTE2IG9mZnNldDsKIAl1MTYgcGFnZTsKIAl1OCBwYWRbNTZdOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl9ybWVtcmVxX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBSZXNwb25zZSAoYnVsayBJTikgcGFja2V0IGNvbnRlbnRzICovCiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3J4ZnJtIHsKLQloZmEzODR4X3J4X2ZyYW1lX3QgZGVzYzsKK3N0cnVjdCBoZmEzODR4X3VzYl9yeGZybSB7CisJc3RydWN0IGhmYTM4NHhfcnhfZnJhbWUgZGVzYzsKIAl1OCBkYXRhW1dMQU5fREFUQV9NQVhMRU5dOwotfSBfX3BhY2tlZCBoZmEzODR4X3VzYl9yeGZybV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfaW5mb2ZybSB7CitzdHJ1Y3QgaGZhMzg0eF91c2JfaW5mb2ZybSB7CiAJdTE2IHR5cGU7Ci0JaGZhMzg0eF9JbmZGcmFtZV90IGluZm87Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX2luZm9mcm1fdDsKKwlzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSBpbmZvOworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCB7CitzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCB7CiAJdTE2IHR5cGU7CiAJdTE2IHN0YXR1czsKIAl1MTYgcmVzcDA7CiAJdTE2IHJlc3AxOwogCXUxNiByZXNwMjsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2JfY21kcmVzcF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBoZmEzODR4X3VzYl9jbWRyZXNwX3QgaGZhMzg0eF91c2Jfd3JpZHJlc3BfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JfcnJpZHJlc3Ageworc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwIHsKIAl1MTYgdHlwZTsKIAl1MTYgZnJtbGVuOwogCXUxNiByaWQ7CiAJdTggZGF0YVtIRkEzODR4X1JJRERBVEFfTUFYTEVOXTsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2JfcnJpZHJlc3BfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgaGZhMzg0eF91c2JfY21kcmVzcF90IGhmYTM4NHhfdXNiX3dtZW1yZXNwX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXNwIHsKK3N0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVzcCB7CiAJdTE2IHR5cGU7CiAJdTE2IGZybWxlbjsKIAl1OCBkYXRhW0hGQTM4NHhfVVNCX1JXTUVNX01BWExFTl07Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX3JtZW1yZXNwX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9idWZhdmFpbCB7CitzdHJ1Y3QgaGZhMzg0eF91c2JfYnVmYXZhaWwgewogCXUxNiB0eXBlOwogCXUxNiBmcm1sZW47Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX2J1ZmF2YWlsX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3VzYl9lcnJvciB7CitzdHJ1Y3QgaGZhMzg0eF91c2JfZXJyb3IgewogCXUxNiB0eXBlOwogCXUxNiBlcnJvcnR5cGU7Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNiX2Vycm9yX3Q7Cit9IF9fcGFja2VkOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogVW5pb25zIGZvciBwYWNrYWdpbmcgYWxsIHRoZSBrbm93biBwYWNrZXQgdHlwZXMgdG9nZXRoZXIgKi8KIAotdHlwZWRlZiB1bmlvbiBoZmEzODR4X3VzYm91dCB7Cit1bmlvbiBoZmEzODR4X3VzYm91dCB7CiAJX19sZTE2IHR5cGU7Ci0JaGZhMzg0eF91c2JfdHhmcm1fdCB0eGZybTsKLQloZmEzODR4X3VzYl9jbWRyZXFfdCBjbWRyZXE7Ci0JaGZhMzg0eF91c2Jfd3JpZHJlcV90IHdyaWRyZXE7Ci0JaGZhMzg0eF91c2JfcnJpZHJlcV90IHJyaWRyZXE7Ci0JaGZhMzg0eF91c2Jfd21lbXJlcV90IHdtZW1yZXE7Ci0JaGZhMzg0eF91c2Jfcm1lbXJlcV90IHJtZW1yZXE7Ci19IF9fcGFja2VkIGhmYTM4NHhfdXNib3V0X3Q7CisJc3RydWN0IGhmYTM4NHhfdXNiX3R4ZnJtIHR4ZnJtOworCXN0cnVjdCBoZmEzODR4X3VzYl9jbWRyZXEgY21kcmVxOworCXN0cnVjdCBoZmEzODR4X3VzYl93cmlkcmVxIHdyaWRyZXE7CisJc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXEgcnJpZHJlcTsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfd21lbXJlcSB3bWVtcmVxOworCXN0cnVjdCBoZmEzODR4X3VzYl9ybWVtcmVxIHJtZW1yZXE7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHVuaW9uIGhmYTM4NHhfdXNiaW4gewordW5pb24gaGZhMzg0eF91c2JpbiB7CiAJX19sZTE2IHR5cGU7Ci0JaGZhMzg0eF91c2Jfcnhmcm1fdCByeGZybTsKLQloZmEzODR4X3VzYl90eGZybV90IHR4ZnJtOwotCWhmYTM4NHhfdXNiX2luZm9mcm1fdCBpbmZvZnJtOwotCWhmYTM4NHhfdXNiX2NtZHJlc3BfdCBjbWRyZXNwOwotCWhmYTM4NHhfdXNiX3dyaWRyZXNwX3Qgd3JpZHJlc3A7Ci0JaGZhMzg0eF91c2JfcnJpZHJlc3BfdCBycmlkcmVzcDsKLQloZmEzODR4X3VzYl93bWVtcmVzcF90IHdtZW1yZXNwOwotCWhmYTM4NHhfdXNiX3JtZW1yZXNwX3Qgcm1lbXJlc3A7Ci0JaGZhMzg0eF91c2JfYnVmYXZhaWxfdCBidWZhdmFpbDsKLQloZmEzODR4X3VzYl9lcnJvcl90IHVzYmVycm9yOworCXN0cnVjdCBoZmEzODR4X3VzYl9yeGZybSByeGZybTsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JfdHhmcm0gdHhmcm07CisJc3RydWN0IGhmYTM4NHhfdXNiX2luZm9mcm0gaW5mb2ZybTsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCBjbWRyZXNwOworCXN0cnVjdCBoZmEzODR4X3VzYl9zdGF0dXNyZXNwIHdyaWRyZXNwOworCXN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVzcCBycmlkcmVzcDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcCB3bWVtcmVzcDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2Jfcm1lbXJlc3Agcm1lbXJlc3A7CisJc3RydWN0IGhmYTM4NHhfdXNiX2J1ZmF2YWlsIGJ1ZmF2YWlsOworCXN0cnVjdCBoZmEzODR4X3VzYl9lcnJvciB1c2JlcnJvcjsKIAl1OCBib2d1c3BhZFszMDAwXTsKLX0gX19wYWNrZWQgaGZhMzg0eF91c2Jpbl90OworfSBfX3BhY2tlZDsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotUEQgcmVjb3JkIHN0cnVjdHVyZXMuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgKiBQRCByZWNvcmQgc3RydWN0dXJlcy4KKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9wY2JfcGFydG51bSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfcGNiX3BhcnRudW0gewogCXU4IG51bVs4XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfcGNiX3BhcnRudW1fdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3BjYl90cmFjZW51bSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfcGNiX3RyYWNlbnVtIHsKIAl1OCBudW1bOF07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX3BjYl90cmFjZW51bV90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljX3NlcmlhbCB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljX3NlcmlhbCB7CiAJdTggbnVtWzEyXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfbmljX3NlcmlhbF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbWtrX21lYXN1cmVtZW50cyB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbWtrX21lYXN1cmVtZW50cyB7CiAJZG91YmxlIGNhcnJpZXJfZnJlcTsKIAlkb3VibGUgb2NjdXBpZWRfYmFuZDsKIAlkb3VibGUgcG93ZXJfZGVuc2l0eTsKQEAgLTkzNSwxOTIgKzk1NywxOTMgQEAKIAlkb3VibGUgcnhfc3B1cl9mMjsKIAlkb3VibGUgcnhfc3B1cl9sMTsKIAlkb3VibGUgcnhfc3B1cl9sMjsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfbWtrX21lYXN1cmVtZW50c190OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljX3JhbXNpemUgeworc3RydWN0IGhmYTM4NHhfcGRyX25pY19yYW1zaXplIHsKIAl1OCBzaXplWzEyXTsJCS8qIHVuaXRzIG9mIEtCICovCi19IF9fcGFja2VkIGhmYTM4NHhfcGRyX25pY19yYW1zaXplX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9tZmlzdXByYW5nZSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbWZpc3VwcmFuZ2UgewogCXUxNiBpZDsKIAl1MTYgdmFyaWFudDsKIAl1MTYgYm90dG9tOwogCXUxNiB0b3A7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX21maXN1cHJhbmdlX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9jZmlzdXByYW5nZSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfY2Zpc3VwcmFuZ2UgewogCXUxNiBpZDsKIAl1MTYgdmFyaWFudDsKIAl1MTYgYm90dG9tOwogCXUxNiB0b3A7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2NmaXN1cHJhbmdlX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9uaWNpZCB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbmljaWQgewogCXUxNiBpZDsKIAl1MTYgdmFyaWFudDsKIAl1MTYgbWFqb3I7CiAJdTE2IG1pbm9yOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9uaWNpZF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX21lYXN1cmVtZW50cyB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX21lYXN1cmVtZW50cyB7CiAJdTE2IHZhbHVlWzBdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9yZWZkYWNfbWVhc3VyZW1lbnRzX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl92Z2RhY19tZWFzdXJlbWVudHMgeworc3RydWN0IGhmYTM4NHhfcGRyX3ZnZGFjX21lYXN1cmVtZW50cyB7CiAJdTE2IHZhbHVlWzBdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl92Z2RhY19tZWFzdXJlbWVudHNfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfbWVhc3VyZW1lbnRzIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX21lYXN1cmVtZW50cyB7CiAJdTE2IHZhbHVlWzBdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wY19tZWFzdXJlbWVudHNfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21hY19hZGRyZXNzIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9tYWNfYWRkcmVzcyB7CiAJdTggYWRkcls2XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfbWFjX2FkZHJlc3NfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX21ra19jYWxsbmFtZSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfbWtrX2NhbGxuYW1lIHsKIAl1OCBjYWxsbmFtZVs4XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfbWtrX2NhbGxuYW1lX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9yZWdkb21haW4geworc3RydWN0IGhmYTM4NHhfcGRyX3JlZ2RvbWFpbiB7CiAJdTE2IG51bWRvbWFpbnM7CiAJdTE2IGRvbWFpbls1XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfcmVnZG9tYWluX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9hbGxvd2VkX2NoYW5uZWwgeworc3RydWN0IGhmYTM4NHhfcGRyX2FsbG93ZWRfY2hhbm5lbCB7CiAJdTE2IGNoX2JpdG1hcDsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfYWxsb3dlZF9jaGFubmVsX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9kZWZhdWx0X2NoYW5uZWwgeworc3RydWN0IGhmYTM4NHhfcGRyX2RlZmF1bHRfY2hhbm5lbCB7CiAJdTE2IGNoYW5uZWw7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2RlZmF1bHRfY2hhbm5lbF90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcHJpdmFjeV9vcHRpb24geworc3RydWN0IGhmYTM4NHhfcGRyX3ByaXZhY3lfb3B0aW9uIHsKIAl1MTYgYXZhaWxhYmxlOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9wcml2YWN5X29wdGlvbl90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfdGVtcHR5cGUgeworc3RydWN0IGhmYTM4NHhfcGRyX3RlbXB0eXBlIHsKIAl1MTYgdHlwZTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfdGVtcHR5cGVfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3JlZmRhY19zZXR1cCB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX3NldHVwIHsKIAl1MTYgY2hfdmFsdWVbMTRdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9yZWZkYWNfc2V0dXBfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3ZnZGFjX3NldHVwIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl92Z2RhY19zZXR1cCB7CiAJdTE2IGNoX3ZhbHVlWzE0XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfdmdkYWNfc2V0dXBfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfc2V0dXAgeworc3RydWN0IGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfc2V0dXAgewogCXUxNiBjaF92YWx1ZVsxNF07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfc2V0dXBfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXAgeworc3RydWN0IGhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXAgewogCXUxNiB0cmltaWRhYzsKIAl1MTYgdHJpbXFkYWM7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX3RyaW1kYWNfc2V0dXBfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2lmcl9zZXR0aW5nIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9pZnJfc2V0dGluZyB7CiAJdTE2IHZhbHVlWzNdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9pZnJfc2V0dGluZ190OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9wZHJfcmZyX3NldHRpbmcgeworc3RydWN0IGhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nIHsKIAl1MTYgdmFsdWVbM107Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2Jhc2VsaW5lIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2Jhc2VsaW5lIHsKIAl1MTYgdmFsdWVbNTBdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9oZmEzODYxX2Jhc2VsaW5lX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX3NoYWRvdyB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9zaGFkb3cgewogCXUzMiB2YWx1ZVszMl07Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2hmYTM4NjFfc2hhZG93X3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2lmcmYgeworc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfaWZyZiB7CiAJdTMyIHZhbHVlWzIwXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfaGZhMzg2MV9pZnJmX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2Fsc3Ageworc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxzcCB7CiAJdTE2IHZhbHVlWzE0XTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbHNwX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2NoY2FsaSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbGkgewogCXUxNiB2YWx1ZVsxN107Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxpX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX25pY19jb25maWcgeworc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfbmljX2NvbmZpZyB7CiAJdTE2IGNvbmZpZ19iaXRtYXA7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX25pY19jb25maWdfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyX2hmb19kZWxheSB7CitzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZvX2RlbGF5IHsKIAl1OCBoZm9fZGVsYXk7Ci19IF9fcGFja2VkIGhmYTM4NHhfaGZvX2RlbGF5X3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdHNwIHsKK3N0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdHNwIHsKIAl1MTYgdmFsdWVbMzBdOwotfSBfX3BhY2tlZCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdHNwX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdGkgeworc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfbWFuZl90ZXN0aSB7CiAJdTE2IHZhbHVlWzMwXTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RpX3Q7Cit9IF9fcGFja2VkOwogCi10eXBlZGVmIHN0cnVjdCBoZmEzODR4X2VuZF9vZl9wZGEgeworc3RydWN0IGhmYTM4NHhfcGRyX2VuZF9vZl9wZGEgewogCXUxNiBjcmM7Ci19IF9fcGFja2VkIGhmYTM4NHhfcGRyX2VuZF9vZl9wZGFfdDsKK30gX19wYWNrZWQ7CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfcGRyZWMgeworc3RydWN0IGhmYTM4NHhfcGRyZWMgewogCXUxNiBsZW47CQkvKiBpbiB3b3JkcyAqLwogCXUxNiBjb2RlOwogCXVuaW9uIHBkciB7Ci0JCWhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtX3QgcGNiX3BhcnRudW07Ci0JCWhmYTM4NHhfcGRyX3BjYl90cmFjZW51bV90IHBjYl90cmFjZW51bTsKLQkJaGZhMzg0eF9wZHJfbmljX3NlcmlhbF90IG5pY19zZXJpYWw7Ci0JCWhmYTM4NHhfcGRyX21ra19tZWFzdXJlbWVudHNfdCBta2tfbWVhc3VyZW1lbnRzOwotCQloZmEzODR4X3Bkcl9uaWNfcmFtc2l6ZV90IG5pY19yYW1zaXplOwotCQloZmEzODR4X3Bkcl9tZmlzdXByYW5nZV90IG1maXN1cHJhbmdlOwotCQloZmEzODR4X3Bkcl9jZmlzdXByYW5nZV90IGNmaXN1cHJhbmdlOwotCQloZmEzODR4X3Bkcl9uaWNpZF90IG5pY2lkOwotCQloZmEzODR4X3Bkcl9yZWZkYWNfbWVhc3VyZW1lbnRzX3QgcmVmZGFjX21lYXN1cmVtZW50czsKLQkJaGZhMzg0eF9wZHJfdmdkYWNfbWVhc3VyZW1lbnRzX3QgdmdkYWNfbWVhc3VyZW1lbnRzOwotCQloZmEzODR4X3Bkcl9sZXZlbF9jb21wY19tZWFzdXJlbWVudHNfdCBsZXZlbF9jb21wY19tZWFzdXJlbWVudHM7Ci0JCWhmYTM4NHhfcGRyX21hY19hZGRyZXNzX3QgbWFjX2FkZHJlc3M7Ci0JCWhmYTM4NHhfcGRyX21ra19jYWxsbmFtZV90IG1ra19jYWxsbmFtZTsKLQkJaGZhMzg0eF9wZHJfcmVnZG9tYWluX3QgcmVnZG9tYWluOwotCQloZmEzODR4X3Bkcl9hbGxvd2VkX2NoYW5uZWxfdCBhbGxvd2VkX2NoYW5uZWw7Ci0JCWhmYTM4NHhfcGRyX2RlZmF1bHRfY2hhbm5lbF90IGRlZmF1bHRfY2hhbm5lbDsKLQkJaGZhMzg0eF9wZHJfcHJpdmFjeV9vcHRpb25fdCBwcml2YWN5X29wdGlvbjsKLQkJaGZhMzg0eF9wZHJfdGVtcHR5cGVfdCB0ZW1wdHlwZTsKLQkJaGZhMzg0eF9wZHJfcmVmZGFjX3NldHVwX3QgcmVmZGFjX3NldHVwOwotCQloZmEzODR4X3Bkcl92Z2RhY19zZXR1cF90IHZnZGFjX3NldHVwOwotCQloZmEzODR4X3Bkcl9sZXZlbF9jb21wX3NldHVwX3QgbGV2ZWxfY29tcF9zZXR1cDsKLQkJaGZhMzg0eF9wZHJfdHJpbWRhY19zZXR1cF90IHRyaW1kYWNfc2V0dXA7Ci0JCWhmYTM4NHhfcGRyX2lmcl9zZXR0aW5nX3QgaWZyX3NldHRpbmc7Ci0JCWhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nX3QgcmZyX3NldHRpbmc7Ci0JCWhmYTM4NHhfcGRyX2hmYTM4NjFfYmFzZWxpbmVfdCBoZmEzODYxX2Jhc2VsaW5lOwotCQloZmEzODR4X3Bkcl9oZmEzODYxX3NoYWRvd190IGhmYTM4NjFfc2hhZG93OwotCQloZmEzODR4X3Bkcl9oZmEzODYxX2lmcmZfdCBoZmEzODYxX2lmcmY7Ci0JCWhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxzcF90IGhmYTM4NjFfY2hjYWxzcDsKLQkJaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbGlfdCBoZmEzODYxX2NoY2FsaTsKLQkJaGZhMzg0eF9wZHJfbmljX2NvbmZpZ190IG5pY19jb25maWc7Ci0JCWhmYTM4NHhfaGZvX2RlbGF5X3QgaGZvX2RlbGF5OwotCQloZmEzODR4X3Bkcl9oZmEzODYxX21hbmZfdGVzdHNwX3QgaGZhMzg2MV9tYW5mX3Rlc3RzcDsKLQkJaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RpX3QgaGZhMzg2MV9tYW5mX3Rlc3RpOwotCQloZmEzODR4X3Bkcl9lbmRfb2ZfcGRhX3QgZW5kX29mX3BkYTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3BjYl9wYXJ0bnVtIHBjYl9wYXJ0bnVtOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfcGNiX3RyYWNlbnVtIHBjYl90cmFjZW51bTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX25pY19zZXJpYWwgbmljX3NlcmlhbDsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX21ra19tZWFzdXJlbWVudHMgbWtrX21lYXN1cmVtZW50czsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX25pY19yYW1zaXplIG5pY19yYW1zaXplOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfbWZpc3VwcmFuZ2UgbWZpc3VwcmFuZ2U7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9jZmlzdXByYW5nZSBjZmlzdXByYW5nZTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX25pY2lkIG5pY2lkOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfcmVmZGFjX21lYXN1cmVtZW50cyByZWZkYWNfbWVhc3VyZW1lbnRzOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfdmdkYWNfbWVhc3VyZW1lbnRzIHZnZGFjX21lYXN1cmVtZW50czsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2xldmVsX2NvbXBfbWVhc3VyZW1lbnRzIGxldmVsX2NvbXBjX21lYXN1cmVtZW50czsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX21hY19hZGRyZXNzIG1hY19hZGRyZXNzOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfbWtrX2NhbGxuYW1lIG1ra19jYWxsbmFtZTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3JlZ2RvbWFpbiByZWdkb21haW47CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9hbGxvd2VkX2NoYW5uZWwgYWxsb3dlZF9jaGFubmVsOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfZGVmYXVsdF9jaGFubmVsIGRlZmF1bHRfY2hhbm5lbDsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3ByaXZhY3lfb3B0aW9uIHByaXZhY3lfb3B0aW9uOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfdGVtcHR5cGUgdGVtcHR5cGU7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9yZWZkYWNfc2V0dXAgcmVmZGFjX3NldHVwOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfdmdkYWNfc2V0dXAgdmdkYWNfc2V0dXA7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9sZXZlbF9jb21wX3NldHVwIGxldmVsX2NvbXBfc2V0dXA7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl90cmltZGFjX3NldHVwIHRyaW1kYWNfc2V0dXA7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9pZnJfc2V0dGluZyBpZnJfc2V0dGluZzsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX3Jmcl9zZXR0aW5nIHJmcl9zZXR0aW5nOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9iYXNlbGluZSBoZmEzODYxX2Jhc2VsaW5lOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9zaGFkb3cgaGZhMzg2MV9zaGFkb3c7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9oZmEzODYxX2lmcmYgaGZhMzg2MV9pZnJmOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9jaGNhbHNwIGhmYTM4NjFfY2hjYWxzcDsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2hmYTM4NjFfY2hjYWxpIGhmYTM4NjFfY2hjYWxpOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9uaWNfY29uZmlnIG5pY19jb25maWc7CisJCXN0cnVjdCBoZmEzODR4X3Bkcl9oZm9fZGVsYXkgaGZvX2RlbGF5OworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RzcCBoZmEzODYxX21hbmZfdGVzdHNwOworCQlzdHJ1Y3QgaGZhMzg0eF9wZHJfaGZhMzg2MV9tYW5mX3Rlc3RpIGhmYTM4NjFfbWFuZl90ZXN0aTsKKwkJc3RydWN0IGhmYTM4NHhfcGRyX2VuZF9vZl9wZGEgZW5kX29mX3BkYTsKIAogCX0gZGF0YTsKLX0gX19wYWNrZWQgaGZhMzg0eF9wZHJlY190OworfSBfX3BhY2tlZDsKIAogI2lmZGVmIF9fS0VSTkVMX18KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0tLSAgTUFDIHN0YXRlIHN0cnVjdHVyZSwgYXJndW1lbnQgdG8gYWxsIGZ1bmN0aW9ucyAtLQotLS0tICBBbHNvLCBhIGNvbGxlY3Rpb24gb2Ygc3VwcG9ydCB0eXBlcyAtLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9zdGF0dXNyZXN1bHQgeworICogLS0tICBNQUMgc3RhdGUgc3RydWN0dXJlLCBhcmd1bWVudCB0byBhbGwgZnVuY3Rpb25zIC0tCisgKiAtLS0gIEFsc28sIGEgY29sbGVjdGlvbiBvZiBzdXBwb3J0IHR5cGVzIC0tCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KK3N0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCB7CiAJdTE2IHN0YXR1czsKIAl1MTYgcmVzcDA7CiAJdTE2IHJlc3AxOwogCXUxNiByZXNwMjsKLX0gaGZhMzg0eF9jbWRyZXN1bHRfdDsKK307CiAKIC8qIFVTQiBDb250cm9sIEV4Y2hhbmdlIChDVExYKToKICAqICBBIHF1ZXVlIG9mIHRoZSBzdHJ1Y3R1cmUgYmVsb3cgaXMgbWFpbnRhaW5lZCBmb3IgYWxsIG9mIHRoZQpAQCAtMTEyOSwxMSArMTE1MiwxMSBAQAogLyogVGhlIGZvbGxvd2luZyBoZmEzODR4Xyogc3RydWN0dXJlcyBhcmUgYXJndW1lbnRzIHRvCiAgKiB0aGUgdXNlcmNiKCkgZm9yIHRoZSBkaWZmZXJlbnQgQ1RMWCB0eXBlcy4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF9ycmlkcmVzdWx0IHsKK3N0cnVjdCBoZmEzODR4X3JyaWRyZXN1bHQgewogCXUxNiByaWQ7CiAJY29uc3Qgdm9pZCAqcmlkZGF0YTsKIAl1bnNpZ25lZCBpbnQgcmlkZGF0YV9sZW47Ci19IGhmYTM4NHhfcnJpZHJlc3VsdF90OworfTsKIAogZW51bSBjdGx4X3N0YXRlIHsKIAlDVExYX1NUQVJUID0gMCwJCS8qIFN0YXJ0IHN0YXRlLCBub3QgcXVldWVkICovCkBAIC0xMTU2LDEyICsxMTc5LDEyIEBACiB0eXBlZGVmIHZvaWQgKCpjdGx4X3VzZXJjYl90KSAoc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICAgICAgIHZvaWQgKmN0bHhyZXN1bHQsIHZvaWQgKnVzZXJjYl9kYXRhKTsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4IHsKK3N0cnVjdCBoZmEzODR4X3VzYmN0bHggewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAogCXNpemVfdCBvdXRidWZzaXplOwotCWhmYTM4NHhfdXNib3V0X3Qgb3V0YnVmOwkvKiBwa3QgYnVmIGZvciBPVVQgKi8KLQloZmEzODR4X3VzYmluX3QgaW5idWY7CS8qIHBrdCBidWYgZm9yIElOKGEgY29weSkgKi8KKwl1bmlvbiBoZmEzODR4X3VzYm91dCBvdXRidWY7CS8qIHBrdCBidWYgZm9yIE9VVCAqLworCXVuaW9uIGhmYTM4NHhfdXNiaW4gaW5idWY7CS8qIHBrdCBidWYgZm9yIElOKGEgY29weSkgKi8KIAogCUNUTFhfU1RBVEUgc3RhdGU7CS8qIFRyYWNrcyBydW5uaW5nIHN0YXRlICovCiAKQEAgLTExNzMsMjUgKzExOTYsMjUgQEAKIAl2b2lkICp1c2VyY2JfZGF0YTsJLyogIGF0IENUTFggY29tcGxldGlvbiAgKi8KIAogCWludCB2YXJpYW50OwkJLyogSWRlbnRpZmllcyBjbWQgdmFyaWFudCAqLwotfSBoZmEzODR4X3VzYmN0bHhfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGhmYTM4NHhfdXNiY3RseHEgeworc3RydWN0IGhmYTM4NHhfdXNiY3RseHEgewogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmc7CiAJc3RydWN0IGxpc3RfaGVhZCBhY3RpdmU7CiAJc3RydWN0IGxpc3RfaGVhZCBjb21wbGV0aW5nOwogCXN0cnVjdCBsaXN0X2hlYWQgcmVhcGFibGU7Ci19IGhmYTM4NHhfdXNiY3RseHFfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IGhmYTQ4NHhfbWV0YWNtZCB7CitzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kIHsKIAl1MTYgY21kOwogCiAJdTE2IHBhcm0wOwogCXUxNiBwYXJtMTsKIAl1MTYgcGFybTI7CiAKLQloZmEzODR4X2NtZHJlc3VsdF90IHJlc3VsdDsKLX0gaGZhMzg0eF9tZXRhY21kX3Q7CisJc3RydWN0IGhmYTM4NHhfY21kcmVzdWx0IHJlc3VsdDsKK307CiAKICNkZWZpbmUJTUFYX0dSUF9BRERSCQkzMgogI2RlZmluZSBXTEFOX0NPTU1FTlRfTUFYCTgwICAvKiBNYXguIGxlbmd0aCBvZiB1c2VyIGNvbW1lbnQgc3RyaW5nLiAqLwpAQCAtMTIxOCwxNSArMTI0MSwxNSBAQAogCXU4IGFkZHIxW1dMQU5fQUNDRVNTX01BWF1bRVRIX0FMRU5dOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgaGZhMzg0eCB7CitzdHJ1Y3QgaGZhMzg0eCB7CiAJLyogVVNCIHN1cHBvcnQgZGF0YSAqLwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2I7CiAJc3RydWN0IHVyYiByeF91cmI7CiAJc3RydWN0IHNrX2J1ZmYgKnJ4X3VyYl9za2I7CiAJc3RydWN0IHVyYiB0eF91cmI7CiAJc3RydWN0IHVyYiBjdGx4X3VyYjsKLQloZmEzODR4X3VzYm91dF90IHR4YnVmZjsKLQloZmEzODR4X3VzYmN0bHhxX3QgY3RseHE7CisJdW5pb24gaGZhMzg0eF91c2JvdXQgdHhidWZmOworCXN0cnVjdCBoZmEzODR4X3VzYmN0bHhxIGN0bHhxOwogCXN0cnVjdCB0aW1lcl9saXN0IHJlcXRpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IHJlc3B0aW1lcjsKIApAQCAtMTI2NSwyMCArMTI4OCwyMCBAQAogCiAJLyogRG93bmxvYWQgc3VwcG9ydCAqLwogCXVuc2lnbmVkIGludCBkbHN0YXRlOwotCWhmYTM4NHhfZG93bmxvYWRidWZmZXJfdCBidWZpbmZvOworCXN0cnVjdCBoZmEzODR4X2Rvd25sb2FkYnVmZmVyIGJ1ZmluZm87CiAJdTE2IGRsdGltZW91dDsKIAogCWludCBzY2FuZmxhZzsJCS8qIHRvIHNpZ25hbCBzY2FuIGNvbXBsZXRlICovCiAJaW50IGpvaW5fYXA7CQkvKiBhcmUgd2Ugam9pbmVkIHRvIGEgc3BlY2lmaWMgYXAgKi8KIAlpbnQgam9pbl9yZXRyaWVzOwkvKiBudW1iZXIgb2Ygam9pbiByZXRyaWVzIHRpbGwgd2UgZmFpbCAqLwotCWhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90IGpvaW5yZXE7CS8qIGpvaW4gcmVxdWVzdCBzYXZlZCBkYXRhICovCisJc3RydWN0IGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YSBqb2lucmVxOwkvKiBqb2luIHJlcXVlc3Qgc2F2ZWQgZGF0YSAqLwogCi0Jd2xhbmRldmljZV90ICp3bGFuZGV2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2OwogCS8qIFRpbWVyIHRvIGFsbG93IGZvciB0aGUgZGVmZXJyZWQgcHJvY2Vzc2luZyBvZiBsaW5rc3RhdHVzIG1lc3NhZ2VzICovCiAJc3RydWN0IHdvcmtfc3RydWN0IGxpbmtfYmg7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY29tbXNxdWFsX2JoOwotCWhmYTM4NHhfY29tbXNxdWFsaXR5X3QgcXVhbDsKKwlzdHJ1Y3QgaGZhMzg0eF9jb21tc3F1YWxpdHkgcXVhbDsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBjb21tc3F1YWxfdGltZXI7CiAKIAl1MTYgbGlua19zdGF0dXM7CkBAIC0xMjk3LDkyICsxMzIwLDkzIEBACiAJaW50IGRibWFkanVzdDsKIAogCS8qIEdyb3VwIEFkZHJlc3NlcyAtIHJpZ2h0IG5vdywgdGhlcmUgYXJlIHVwIHRvIGEgdG90YWwKLQkgICBvZiBNQVhfR1JQX0FERFIgZ3JvdXAgYWRkcmVzc2VzICovCisJICogb2YgTUFYX0dSUF9BRERSIGdyb3VwIGFkZHJlc3NlcworCSAqLwogCXU4IGRvdDExX2dycF9hZGRyW01BWF9HUlBfQUREUl1bRVRIX0FMRU5dOwogCXVuc2lnbmVkIGludCBkb3QxMV9ncnBjbnQ7CiAKIAkvKiBDb21wb25lbnQgSWRlbnRpdGllcyAqLwotCWhmYTM4NHhfY29tcGlkZW50X3QgaWRlbnRfbmljOwotCWhmYTM4NHhfY29tcGlkZW50X3QgaWRlbnRfcHJpX2Z3OwotCWhmYTM4NHhfY29tcGlkZW50X3QgaWRlbnRfc3RhX2Z3OwotCWhmYTM4NHhfY29tcGlkZW50X3QgaWRlbnRfYXBfZnc7CisJc3RydWN0IGhmYTM4NHhfY29tcGlkZW50IGlkZW50X25pYzsKKwlzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQgaWRlbnRfcHJpX2Z3OworCXN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCBpZGVudF9zdGFfZnc7CisJc3RydWN0IGhmYTM4NHhfY29tcGlkZW50IGlkZW50X2FwX2Z3OwogCXUxNiBtbV9tb2RzOwogCiAJLyogU3VwcGxpZXIgY29tcGF0aWJpbGl0eSByYW5nZXMgKi8KLQloZmEzODR4X2NhcGxldmVsX3QgY2FwX3N1cF9tZmk7Ci0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9zdXBfY2ZpOwotCWhmYTM4NHhfY2FwbGV2ZWxfdCBjYXBfc3VwX3ByaTsKLQloZmEzODR4X2NhcGxldmVsX3QgY2FwX3N1cF9zdGE7Ci0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9zdXBfYXA7CisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX3N1cF9tZmk7CisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX3N1cF9jZmk7CisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX3N1cF9wcmk7CisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX3N1cF9zdGE7CisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX3N1cF9hcDsKIAogCS8qIEFjdG9yIGNvbXBhdGliaWxpdHkgcmFuZ2VzICovCi0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9hY3RfcHJpX2NmaTsJLyoKLQkJCQkJCSAqIHByaSBmL3cgdG8gY29udHJvbGxlcgotCQkJCQkJICogaW50ZXJmYWNlCi0JCQkJCQkgKi8KKwlzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCBjYXBfYWN0X3ByaV9jZmk7IC8qCisJCQkJCQkgICogcHJpIGYvdyB0byBjb250cm9sbGVyCisJCQkJCQkgICogaW50ZXJmYWNlCisJCQkJCQkgICovCiAKLQloZmEzODR4X2NhcGxldmVsX3QgY2FwX2FjdF9zdGFfY2ZpOwkvKgotCQkJCQkJICogc3RhIGYvdyB0byBjb250cm9sbGVyCi0JCQkJCQkgKiBpbnRlcmZhY2UKLQkJCQkJCSAqLworCXN0cnVjdCBoZmEzODR4X2NhcGxldmVsIGNhcF9hY3Rfc3RhX2NmaTsgLyoKKwkJCQkJCSAgKiBzdGEgZi93IHRvIGNvbnRyb2xsZXIKKwkJCQkJCSAgKiBpbnRlcmZhY2UKKwkJCQkJCSAgKi8KIAotCWhmYTM4NHhfY2FwbGV2ZWxfdCBjYXBfYWN0X3N0YV9tZmk7CS8qIHN0YSBmL3cgdG8gbW9kZW0gaW50ZXJmYWNlICovCisJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY2FwX2FjdF9zdGFfbWZpOyAvKiBzdGEgZi93IHRvIG1vZGVtIGludGVyZmFjZSAqLwogCi0JaGZhMzg0eF9jYXBsZXZlbF90IGNhcF9hY3RfYXBfY2ZpOwkvKgorCXN0cnVjdCBoZmEzODR4X2NhcGxldmVsIGNhcF9hY3RfYXBfY2ZpOwkvKgogCQkJCQkJICogYXAgZi93IHRvIGNvbnRyb2xsZXIKIAkJCQkJCSAqIGludGVyZmFjZQogCQkJCQkJICovCiAKLQloZmEzODR4X2NhcGxldmVsX3QgY2FwX2FjdF9hcF9tZmk7CS8qIGFwIGYvdyB0byBtb2RlbSBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCBjYXBfYWN0X2FwX21maTsJLyogYXAgZi93IHRvIG1vZGVtIGludGVyZmFjZSAqLwogCiAJdTMyIHBzdXNlcmNvdW50OwkvKiBQb3dlciBzYXZlIHVzZXIgY291bnQuICovCi0JaGZhMzg0eF9Db21tVGFsbGllczMyX3QgdGFsbGllczsJLyogQ29tbXVuaWNhdGlvbiB0YWxsaWVzLiAqLworCXN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMzIgdGFsbGllczsJLyogQ29tbXVuaWNhdGlvbiB0YWxsaWVzLiAqLwogCXU4IGNvbW1lbnRbV0xBTl9DT01NRU5UX01BWCArIDFdOwkvKiBVc2VyIGNvbW1lbnQgKi8KIAogCS8qIENoYW5uZWwgSW5mbyByZXF1ZXN0IHJlc3VsdHMgKEFQIG9ubHkpICovCiAJc3RydWN0IHsKIAkJYXRvbWljX3QgZG9uZTsKIAkJdTggY291bnQ7Ci0JCWhmYTM4NHhfQ2hJbmZvUmVzdWx0X3QgcmVzdWx0czsKKwkJc3RydWN0IGhmYTM4NHhfQ2hJbmZvUmVzdWx0IHJlc3VsdHM7CiAJfSBjaGFubmVsX2luZm87CiAKLQloZmEzODR4X0luZkZyYW1lX3QgKnNjYW5yZXN1bHRzOworCXN0cnVjdCBoZmEzODR4X0luZkZyYW1lICpzY2FucmVzdWx0czsKIAogCXN0cnVjdCBwcmlzbTJzdGFfYXV0aGxpc3QgYXV0aGxpc3Q7CS8qIEF1dGhlbnRpY2F0ZWQgc3RhdGlvbiBsaXN0LiAqLwogCXVuc2lnbmVkIGludCBhY2Nlc3Ntb2RlOwkJLyogQWNjZXNzIG1vZGUuICovCiAJc3RydWN0IHByaXNtMnN0YV9hY2Nlc3NsaXN0IGFsbG93OwkvKiBBbGxvd2VkIHN0YXRpb24gbGlzdC4gKi8KIAlzdHJ1Y3QgcHJpc20yc3RhX2FjY2Vzc2xpc3QgZGVueTsJLyogRGVuaWVkIHN0YXRpb24gbGlzdC4gKi8KIAotfSBoZmEzODR4X3Q7Cit9OwogCi12b2lkIGhmYTM4NHhfY3JlYXRlKGhmYTM4NHhfdCAqaHcsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IpOwotdm9pZCBoZmEzODR4X2Rlc3Ryb3koaGZhMzg0eF90ICpodyk7Cit2b2lkIGhmYTM4NHhfY3JlYXRlKHN0cnVjdCBoZmEzODR4ICpodywgc3RydWN0IHVzYl9kZXZpY2UgKnVzYik7Cit2b2lkIGhmYTM4NHhfZGVzdHJveShzdHJ1Y3QgaGZhMzg0eCAqaHcpOwogCiBpbnQKLWhmYTM4NHhfY29yZXJlc2V0KGhmYTM4NHhfdCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKTsKLWludCBoZmEzODR4X2RydnJfZGlzYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCk7Ci1pbnQgaGZhMzg0eF9kcnZyX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCk7Ci1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcpOwotaW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2Rpc2FibGUoaGZhMzg0eF90ICpodyk7Ci1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkICpidWYsIHUzMiBsZW4pOwotaW50IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKTsKLWludCBoZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcsIHUzMiBleGVhZGRyKTsKLWludCBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZShoZmEzODR4X3QgKmh3KTsKLWludCBoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkICpidWYsIHUzMiBsZW4pOwotaW50IGhmYTM4NHhfZHJ2cl9yZWFkcGRhKGhmYTM4NHhfdCAqaHcsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbik7Ci1pbnQgaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pOworaGZhMzg0eF9jb3JlcmVzZXQoc3RydWN0IGhmYTM4NHggKmh3LCBpbnQgaG9sZHRpbWUsIGludCBzZXR0bGV0aW1lLCBpbnQgZ2VuZXNpcyk7CitpbnQgaGZhMzg0eF9kcnZyX2Rpc2FibGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgbWFjcG9ydCk7CitpbnQgaGZhMzg0eF9kcnZyX2VuYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBtYWNwb3J0KTsKK2ludCBoZmEzODR4X2RydnJfZmxhc2hkbF9lbmFibGUoc3RydWN0IGhmYTM4NHggKmh3KTsKK2ludCBoZmEzODR4X2RydnJfZmxhc2hkbF9kaXNhYmxlKHN0cnVjdCBoZmEzODR4ICpodyk7CitpbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MzIgZGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbik7CitpbnQgaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbik7CitpbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUzMiBleGVhZGRyKTsKK2ludCBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcpOworaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUzMiBkYWRkciwgdm9pZCAqYnVmLCB1MzIgbGVuKTsKK2ludCBoZmEzODR4X2RydnJfcmVhZHBkYShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbik7CitpbnQgaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbik7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihoZmEzODR4X3QgKmh3LCB1MTYgcmlkLCB2b2lkICp2YWwpCitzdGF0aWMgaW5saW5lIGludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgcmlkLCB2b2lkICp2YWwpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCByaWQsIHZhbCwgc2l6ZW9mKHUxNikpOwogCWlmIChyZXN1bHQgPT0gMCkKLQkJKigodTE2ICopIHZhbCkgPSBsZTE2X3RvX2NwdSgqKCh1MTYgKikgdmFsKSk7CisJCSooKHUxNiAqKXZhbCkgPSBsZTE2X3RvX2NwdSgqKCh1MTYgKil2YWwpKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBoZmEzODR4X2RydnJfc2V0Y29uZmlnMTYoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdTE2IHZhbCkKK3N0YXRpYyBpbmxpbmUgaW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiByaWQsIHUxNiB2YWwpCiB7CiAJdTE2IHZhbHVlID0gY3B1X3RvX2xlMTYodmFsKTsKIApAQCAtMTM5MCwxMyArMTQxNCwxMyBAQAogfQogCiBpbnQKLWhmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICAgICB1MTYgcmlkLAogCQkJICAgICB2b2lkICpidWYsCiAJCQkgICAgIHUxNiBsZW4sIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RydnJfc2V0Y29uZmlnMTZfYXN5bmMoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdTE2IHZhbCkKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWcxNl9hc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiByaWQsIHUxNiB2YWwpCiB7CiAJdTE2IHZhbHVlID0gY3B1X3RvX2xlMTYodmFsKTsKIApAQCAtMTQwNCwyMSArMTQyOCwyMSBAQAogCQkJCQkgICAgTlVMTCwgTlVMTCk7CiB9CiAKLWludCBoZmEzODR4X2RydnJfc3RhcnQoaGZhMzg0eF90ICpodyk7Ci1pbnQgaGZhMzg0eF9kcnZyX3N0b3AoaGZhMzg0eF90ICpodyk7CitpbnQgaGZhMzg0eF9kcnZyX3N0YXJ0KHN0cnVjdCBoZmEzODR4ICpodyk7CitpbnQgaGZhMzg0eF9kcnZyX3N0b3Aoc3RydWN0IGhmYTM4NHggKmh3KTsKIGludAotaGZhMzg0eF9kcnZyX3R4ZnJhbWUoaGZhMzg0eF90ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2hmYTM4NHhfZHJ2cl90eGZyYW1lKHN0cnVjdCBoZmEzODR4ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICB1bmlvbiBwODAyMTFfaGRyICpwODAyMTFfaGRyLAogCQkgICAgIHN0cnVjdCBwODAyMTFfbWV0YXdlcCAqcDgwMjExX3dlcCk7Ci12b2lkIGhmYTM4NHhfdHhfdGltZW91dCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwordm9pZCBoZmEzODR4X3R4X3RpbWVvdXQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwogCi1pbnQgaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShoZmEzODR4X3QgKmh3KTsKLWludCBoZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpOwotaW50IGhmYTM4NHhfY21kX2Rpc2FibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpOwotaW50IGhmYTM4NHhfY21kX2FsbG9jYXRlKGhmYTM4NHhfdCAqaHcsIHUxNiBsZW4pOwotaW50IGhmYTM4NHhfY21kX21vbml0b3IoaGZhMzg0eF90ICpodywgdTE2IGVuYWJsZSk7CitpbnQgaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShzdHJ1Y3QgaGZhMzg0eCAqaHcpOworaW50IGhmYTM4NHhfY21kX2VuYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBtYWNwb3J0KTsKK2ludCBoZmEzODR4X2NtZF9kaXNhYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1hY3BvcnQpOworaW50IGhmYTM4NHhfY21kX2FsbG9jYXRlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IGxlbik7CitpbnQgaGZhMzg0eF9jbWRfbW9uaXRvcihzdHJ1Y3QgaGZhMzg0eCAqaHcsIHUxNiBlbmFibGUpOwogaW50Ci1oZmEzODR4X2NtZF9kb3dubG9hZChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9jbWRfZG93bmxvYWQoc3RydWN0IGhmYTM4NHggKmh3LAogCQkgICAgIHUxNiBtb2RlLCB1MTYgbG93YWRkciwgdTE2IGhpZ2hhZGRyLCB1MTYgY29kZWxlbik7CiAKICNlbmRpZiAvKl9fS0VSTkVMX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jCmluZGV4IDMzNzgxMDcuLjZhMTA3ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYwpAQCAtMTU0LDEzICsxNTQsMTMgQEAKICNlbmRpZgogCiBzdGF0aWMgdm9pZAotaGZhMzg0eF9pbnRfcnhtb25pdG9yKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF91c2Jfcnhmcm1fdCAqcnhmcm0pOworaGZhMzg0eF9pbnRfcnhtb25pdG9yKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3QgaGZhMzg0eF91c2Jfcnhmcm0gKnJ4ZnJtKTsKIAogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JfZGVmZXIoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKTsKIAotc3RhdGljIGludCBzdWJtaXRfcnhfdXJiKGhmYTM4NHhfdCAqaHcsIGdmcF90IGZsYWdzKTsKK3N0YXRpYyBpbnQgc3VibWl0X3J4X3VyYihzdHJ1Y3QgaGZhMzg0eCAqaHcsIGdmcF90IGZsYWdzKTsKIAotc3RhdGljIGludCBzdWJtaXRfdHhfdXJiKGhmYTM4NHhfdCAqaHcsIHN0cnVjdCB1cmIgKnR4X3VyYiwgZ2ZwX3QgZmxhZ3MpOworc3RhdGljIGludCBzdWJtaXRfdHhfdXJiKHN0cnVjdCBoZmEzODR4ICpodywgc3RydWN0IHVyYiAqdHhfdXJiLCBnZnBfdCBmbGFncyk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIENhbGxiYWNrcyAqLwpAQCAtMTY5LDE5ICsxNjksMTkgQEAKIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKIAogc3RhdGljIHZvaWQKLWhmYTM4NHhfdXNiaW5fdHhjb21wbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfdXNiaW5fdCAqdXNiaW4pOworaGZhMzg0eF91c2Jpbl90eGNvbXBsKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1bmlvbiBoZmEzODR4X3VzYmluICp1c2Jpbik7CiAKLXN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fcngod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fcngoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2luZm8od2xhbmRldmljZV90ICp3bGFuZGV2LCBoZmEzODR4X3VzYmluX3QgKnVzYmluKTsKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5faW5mbyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdW5pb24gaGZhMzg0eF91c2JpbiAqdXNiaW4pOwogCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2N0bHgoaGZhMzg0eF90ICpodywgaGZhMzg0eF91c2Jpbl90ICp1c2JpbiwKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fY3RseChzdHJ1Y3QgaGZhMzg0eCAqaHcsIHVuaW9uIGhmYTM4NHhfdXNiaW4gKnVzYmluLAogCQkJICAgICAgIGludCB1cmJfc3RhdHVzKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogRnVuY3Rpb25zIHRvIHN1cHBvcnQgdGhlIHByaXNtMiB1c2IgY29tbWFuZCBxdWV1ZSAqLwogCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmN0bHhxX3J1bihoZmEzODR4X3QgKmh3KTsKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseHFfcnVuKHN0cnVjdCBoZmEzODR4ICpodyk7CiAKIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseF9yZXF0aW1lcmZuKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKQEAgLTE5Myw0MiArMTkzLDQyIEBACiAKIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseF9yZWFwZXJfdGFzayh1bnNpZ25lZCBsb25nIGRhdGEpOwogCi1zdGF0aWMgaW50IGhmYTM4NHhfdXNiY3RseF9zdWJtaXQoaGZhMzg0eF90ICpodywgaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgpOworc3RhdGljIGludCBoZmEzODR4X3VzYmN0bHhfc3VibWl0KHN0cnVjdCBoZmEzODR4ICpodywgc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCk7CiAKLXN0YXRpYyB2b2lkIHVubG9ja2VkX3VzYmN0bHhfY29tcGxldGUoaGZhMzg0eF90ICpodywgaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgpOworc3RhdGljIHZvaWQgdW5sb2NrZWRfdXNiY3RseF9jb21wbGV0ZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpOwogCiBzdHJ1Y3QgdXNiY3RseF9jb21wbGV0b3IgewogCWludCAoKmNvbXBsZXRlKShzdHJ1Y3QgdXNiY3RseF9jb21wbGV0b3IgKik7CiB9OwogCiBzdGF0aWMgaW50Ci1oZmEzODR4X3VzYmN0bHhfY29tcGxldGVfc3luYyhoZmEzODR4X3QgKmh3LAotCQkJICAgICAgaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgsCitoZmEzODR4X3VzYmN0bHhfY29tcGxldGVfc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsCisJCQkgICAgICBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4LAogCQkJICAgICAgc3RydWN0IHVzYmN0bHhfY29tcGxldG9yICpjb21wbGV0b3IpOwogCiBzdGF0aWMgaW50Ci11bmxvY2tlZF91c2JjdGx4X2NhbmNlbF9hc3luYyhoZmEzODR4X3QgKmh3LCBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCk7Cit1bmxvY2tlZF91c2JjdGx4X2NhbmNlbF9hc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpOwogCi1zdGF0aWMgdm9pZCBoZmEzODR4X2NiX3N0YXR1cyhoZmEzODR4X3QgKmh3LCBjb25zdCBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCk7CitzdGF0aWMgdm9pZCBoZmEzODR4X2NiX3N0YXR1cyhzdHJ1Y3QgaGZhMzg0eCAqaHcsIGNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpOwogCiBzdGF0aWMgaW50Ci11c2JjdGx4X2dldF9zdGF0dXMoY29uc3QgaGZhMzg0eF91c2JfY21kcmVzcF90ICpjbWRyZXNwLAotCQkgICBoZmEzODR4X2NtZHJlc3VsdF90ICpyZXN1bHQpOwordXNiY3RseF9nZXRfc3RhdHVzKGNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYl9zdGF0dXNyZXNwICpjbWRyZXNwLAorCQkgICBzdHJ1Y3QgaGZhMzg0eF9jbWRyZXN1bHQgKnJlc3VsdCk7CiAKIHN0YXRpYyB2b2lkCi11c2JjdGx4X2dldF9ycmlkcmVzdWx0KGNvbnN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwX3QgKnJyaWRyZXNwLAotCQkgICAgICAgaGZhMzg0eF9ycmlkcmVzdWx0X3QgKnJlc3VsdCk7Cit1c2JjdGx4X2dldF9ycmlkcmVzdWx0KGNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVzcCAqcnJpZHJlc3AsCisJCSAgICAgICBzdHJ1Y3QgaGZhMzg0eF9ycmlkcmVzdWx0ICpyZXN1bHQpOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBMb3cgbGV2ZWwgcmVxL3Jlc3AgQ1RMWCBmb3JtYXR0ZXJzIGFuZCBzdWJtaXR0ZXJzICovCiBzdGF0aWMgaW50Ci1oZmEzODR4X2RvY21kKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2RvY21kKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCi0JICAgICAgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCwKKwkgICAgICBzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kICpjbWQsCiAJICAgICAgY3RseF9jbWRjYl90IGNtZGNiLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpOwogCiBzdGF0aWMgaW50Ci1oZmEzODR4X2RvcnJpZChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3JyaWQoc3RydWN0IGhmYTM4NHggKmh3LAogCSAgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCiAJICAgICAgIHUxNiByaWQsCiAJICAgICAgIHZvaWQgKnJpZGRhdGEsCkBAIC0yMzYsNyArMjM2LDcgQEAKIAkgICAgICAgY3RseF9jbWRjYl90IGNtZGNiLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpOwogCiBzdGF0aWMgaW50Ci1oZmEzODR4X2Rvd3JpZChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3dyaWQoc3RydWN0IGhmYTM4NHggKmh3LAogCSAgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCiAJICAgICAgIHUxNiByaWQsCiAJICAgICAgIHZvaWQgKnJpZGRhdGEsCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAkgICAgICAgY3RseF9jbWRjYl90IGNtZGNiLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpOwogCiBzdGF0aWMgaW50Ci1oZmEzODR4X2Rvcm1lbShoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3JtZW0oc3RydWN0IGhmYTM4NHggKmh3LAogCSAgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCiAJICAgICAgIHUxNiBwYWdlLAogCSAgICAgICB1MTYgb2Zmc2V0LApAQCAtMjUzLDcgKzI1Myw3IEBACiAJICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKTsKIAogc3RhdGljIGludAotaGZhMzg0eF9kb3dtZW0oaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG93bWVtKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAogCSAgICAgICB1MTYgcGFnZSwKIAkgICAgICAgdTE2IG9mZnNldCwKQEAgLTI3OCw5ICsyNzgsOSBAQAogCXJldHVybiBjdGx4X3N0cltzXTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaGZhMzg0eF91c2JjdGx4X3QgKmdldF9hY3RpdmVfY3RseChoZmEzODR4X3QgKmh3KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpnZXRfYWN0aXZlX2N0bHgoc3RydWN0IGhmYTM4NHggKmh3KQogewotCXJldHVybiBsaXN0X2VudHJ5KGh3LT5jdGx4cS5hY3RpdmUubmV4dCwgaGZhMzg0eF91c2JjdGx4X3QsIGxpc3QpOworCXJldHVybiBsaXN0X2VudHJ5KGh3LT5jdGx4cS5hY3RpdmUubmV4dCwgc3RydWN0IGhmYTM4NHhfdXNiY3RseCwgbGlzdCk7CiB9CiAKICNpZmRlZiBERUJVR19VU0IKQEAgLTMyMiwxMiArMzIyLDEyIEBACiAqIENhbGwgY29udGV4dDoKICoJQW55CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgc3VibWl0X3J4X3VyYihoZmEzODR4X3QgKmh3LCBnZnBfdCBtZW1mbGFncykKK3N0YXRpYyBpbnQgc3VibWl0X3J4X3VyYihzdHJ1Y3QgaGZhMzg0eCAqaHcsIGdmcF90IG1lbWZsYWdzKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IHJlc3VsdDsKIAotCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKGhmYTM4NHhfdXNiaW5fdCkpOworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHVuaW9uIGhmYTM4NHhfdXNiaW4pKTsKIAlpZiAoIXNrYikgewogCQlyZXN1bHQgPSAtRU5PTUVNOwogCQlnb3RvIGRvbmU7CkBAIC0zMzYsNyArMzM2LDcgQEAKIAkvKiBQb3N0IHRoZSBJTiB1cmIgKi8KIAl1c2JfZmlsbF9idWxrX3VyYigmaHctPnJ4X3VyYiwgaHctPnVzYiwKIAkJCSAgaHctPmVuZHBfaW4sCi0JCQkgIHNrYi0+ZGF0YSwgc2l6ZW9mKGhmYTM4NHhfdXNiaW5fdCksCisJCQkgIHNrYi0+ZGF0YSwgc2l6ZW9mKHVuaW9uIGhmYTM4NHhfdXNiaW4pLAogCQkJICBoZmEzODR4X3VzYmluX2NhbGxiYWNrLCBody0+d2xhbmRldik7CiAKIAlody0+cnhfdXJiX3NrYiA9IHNrYjsKQEAgLTM4NCw3ICszODQsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCUFueQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHN1Ym1pdF90eF91cmIoaGZhMzg0eF90ICpodywgc3RydWN0IHVyYiAqdHhfdXJiLCBnZnBfdCBtZW1mbGFncykKK3N0YXRpYyBpbnQgc3VibWl0X3R4X3VyYihzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCB1cmIgKnR4X3VyYiwgZ2ZwX3QgbWVtZmxhZ3MpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGh3LT53bGFuZGV2LT5uZXRkZXY7CiAJaW50IHJlc3VsdDsKQEAgLTQyOSw3ICs0MjksNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYl9kZWZlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCiB7Ci0JaGZhMzg0eF90ICpodyA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaGZhMzg0eCwgdXNiX3dvcmspOworCXN0cnVjdCBoZmEzODR4ICpodyA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaGZhMzg0eCwgdXNiX3dvcmspOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBody0+d2xhbmRldi0+bmV0ZGV2OwogCiAJLyogRG9uJ3QgYm90aGVyIHRyeWluZyB0byByZXNldCBhbnl0aGluZyBpZiB0aGUgcGx1ZwpAQCAtNTAzLDcgKzUwMyw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogaGZhMzg0eF9jcmVhdGUKICoKLSogU2V0cyB1cCB0aGUgaGZhMzg0eF90IGRhdGEgc3RydWN0dXJlIGZvciB1c2UuICBOb3RlIHRoaXMKKyogU2V0cyB1cCB0aGUgc3RydWN0IGhmYTM4NHggZGF0YSBzdHJ1Y3R1cmUgZm9yIHVzZS4gIE5vdGUgdGhpcwogKiBkb2VzIF9ub3RfIGluaXRpYWxpemUgdGhlIGFjdHVhbCBoYXJkd2FyZSwganVzdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzCiAqIHdlIHVzZSB0byBrZWVwIHRyYWNrIG9mIGl0cyBzdGF0ZS4KICoKQEAgLTUyMSw5ICs1MjEsOSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoZmEzODR4X2NyZWF0ZShoZmEzODR4X3QgKmh3LCBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiKQordm9pZCBoZmEzODR4X2NyZWF0ZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IpCiB7Ci0JbWVtc2V0KGh3LCAwLCBzaXplb2YoaGZhMzg0eF90KSk7CisJbWVtc2V0KGh3LCAwLCBzaXplb2Yoc3RydWN0IGhmYTM4NHgpKTsKIAlody0+dXNiID0gdXNiOwogCiAJLyogc2V0IHVwIHRoZSBlbmRwb2ludHMgKi8KQEAgLTU5Miw3ICs1OTIsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBoZmEzODR4X2Rlc3Ryb3koaGZhMzg0eF90ICpodykKK3ZvaWQgaGZhMzg0eF9kZXN0cm95KHN0cnVjdCBoZmEzODR4ICpodykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC02MDgsOSArNjA4LDkgQEAKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogfQogCi1zdGF0aWMgaGZhMzg0eF91c2JjdGx4X3QgKnVzYmN0bHhfYWxsb2Modm9pZCkKK3N0YXRpYyBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICp1c2JjdGx4X2FsbG9jKHZvaWQpCiB7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseDsKIAogCWN0bHggPSBremFsbG9jKHNpemVvZigqY3RseCksCiAJCSAgICAgICBpbl9pbnRlcnJ1cHQoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMKTsKQEAgLTYyMSw4ICs2MjEsOCBAQAogfQogCiBzdGF0aWMgaW50Ci11c2JjdGx4X2dldF9zdGF0dXMoY29uc3QgaGZhMzg0eF91c2JfY21kcmVzcF90ICpjbWRyZXNwLAotCQkgICBoZmEzODR4X2NtZHJlc3VsdF90ICpyZXN1bHQpCit1c2JjdGx4X2dldF9zdGF0dXMoY29uc3Qgc3RydWN0IGhmYTM4NHhfdXNiX3N0YXR1c3Jlc3AgKmNtZHJlc3AsCisJCSAgIHN0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCAqcmVzdWx0KQogewogCXJlc3VsdC0+c3RhdHVzID0gbGUxNl90b19jcHUoY21kcmVzcC0+c3RhdHVzKTsKIAlyZXN1bHQtPnJlc3AwID0gbGUxNl90b19jcHUoY21kcmVzcC0+cmVzcDApOwpAQCAtNjM2LDggKzYzNiw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi11c2JjdGx4X2dldF9ycmlkcmVzdWx0KGNvbnN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwX3QgKnJyaWRyZXNwLAotCQkgICAgICAgaGZhMzg0eF9ycmlkcmVzdWx0X3QgKnJlc3VsdCkKK3VzYmN0bHhfZ2V0X3JyaWRyZXN1bHQoY29uc3Qgc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwICpycmlkcmVzcCwKKwkJICAgICAgIHN0cnVjdCBoZmEzODR4X3JyaWRyZXN1bHQgKnJlc3VsdCkKIHsKIAlyZXN1bHQtPnJpZCA9IGxlMTZfdG9fY3B1KHJyaWRyZXNwLT5yaWQpOwogCXJlc3VsdC0+cmlkZGF0YSA9IHJyaWRyZXNwLT5kYXRhOwpAQCAtNjQ3LDEzICs2NDcsMTMgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBDb21wbGV0b3Igb2JqZWN0OgogKiBUaGlzIGNvbXBsZXRvciBtdXN0IGJlIHBhc3NlZCB0byBoZmEzODR4X3VzYmN0bHhfY29tcGxldGVfc3luYygpCi0qIHdoZW4gcHJvY2Vzc2luZyBhIENUTFggdGhhdCByZXR1cm5zIGEgaGZhMzg0eF9jbWRyZXN1bHRfdCBzdHJ1Y3R1cmUuCisqIHdoZW4gcHJvY2Vzc2luZyBhIENUTFggdGhhdCByZXR1cm5zIGEgc3RydWN0IGhmYTM4NHhfY21kcmVzdWx0IHN0cnVjdHVyZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RydWN0IHVzYmN0bHhfY21kX2NvbXBsZXRvciB7CiAJc3RydWN0IHVzYmN0bHhfY29tcGxldG9yIGhlYWQ7CiAKLQljb25zdCBoZmEzODR4X3VzYl9jbWRyZXNwX3QgKmNtZHJlc3A7Ci0JaGZhMzg0eF9jbWRyZXN1bHRfdCAqcmVzdWx0OworCWNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYl9zdGF0dXNyZXNwICpjbWRyZXNwOworCXN0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCAqcmVzdWx0OwogfTsKIAogc3RhdGljIGlubGluZSBpbnQgdXNiY3RseF9jbWRfY29tcGxldG9yX2ZuKHN0cnVjdCB1c2JjdGx4X2NvbXBsZXRvciAqaGVhZCkKQEAgLTY2Nyw5ICs2NjcsOSBAQAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiY3RseF9jb21wbGV0b3IgKmluaXRfY21kX2NvbXBsZXRvcigKIAkJCQkJCXN0cnVjdCB1c2JjdGx4X2NtZF9jb21wbGV0b3IKIAkJCQkJCQkqY29tcGxldG9yLAotCQkJCQkJY29uc3QgaGZhMzg0eF91c2JfY21kcmVzcF90CisJCQkJCQljb25zdCBzdHJ1Y3QgaGZhMzg0eF91c2Jfc3RhdHVzcmVzcAogCQkJCQkJCSpjbWRyZXNwLAotCQkJCQkJaGZhMzg0eF9jbWRyZXN1bHRfdCAqcmVzdWx0KQorCQkJCQkJc3RydWN0IGhmYTM4NHhfY21kcmVzdWx0ICpyZXN1bHQpCiB7CiAJY29tcGxldG9yLT5oZWFkLmNvbXBsZXRlID0gdXNiY3RseF9jbWRfY29tcGxldG9yX2ZuOwogCWNvbXBsZXRvci0+Y21kcmVzcCA9IGNtZHJlc3A7CkBAIC02ODUsNyArNjg1LDcgQEAKIHN0cnVjdCB1c2JjdGx4X3JyaWRfY29tcGxldG9yIHsKIAlzdHJ1Y3QgdXNiY3RseF9jb21wbGV0b3IgaGVhZDsKIAotCWNvbnN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwX3QgKnJyaWRyZXNwOworCWNvbnN0IHN0cnVjdCBoZmEzODR4X3VzYl9ycmlkcmVzcCAqcnJpZHJlc3A7CiAJdm9pZCAqcmlkZGF0YTsKIAl1bnNpZ25lZCBpbnQgcmlkZGF0YWxlbjsKIH07CkBAIC02OTMsNyArNjkzLDcgQEAKIHN0YXRpYyBpbnQgdXNiY3RseF9ycmlkX2NvbXBsZXRvcl9mbihzdHJ1Y3QgdXNiY3RseF9jb21wbGV0b3IgKmhlYWQpCiB7CiAJc3RydWN0IHVzYmN0bHhfcnJpZF9jb21wbGV0b3IgKmNvbXBsZXRlOwotCWhmYTM4NHhfcnJpZHJlc3VsdF90IHJyaWRyZXN1bHQ7CisJc3RydWN0IGhmYTM4NHhfcnJpZHJlc3VsdCBycmlkcmVzdWx0OwogCiAJY29tcGxldGUgPSAoc3RydWN0IHVzYmN0bHhfcnJpZF9jb21wbGV0b3IgKiloZWFkOwogCXVzYmN0bHhfZ2V0X3JyaWRyZXN1bHQoY29tcGxldGUtPnJyaWRyZXNwLCAmcnJpZHJlc3VsdCk7CkBAIC03MTMsNyArNzEzLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYmN0bHhfY29tcGxldG9yICppbml0X3JyaWRfY29tcGxldG9yKAogCQkJCQkJc3RydWN0IHVzYmN0bHhfcnJpZF9jb21wbGV0b3IKIAkJCQkJCQkqY29tcGxldG9yLAotCQkJCQkJY29uc3QgaGZhMzg0eF91c2JfcnJpZHJlc3BfdAorCQkJCQkJY29uc3Qgc3RydWN0IGhmYTM4NHhfdXNiX3JyaWRyZXNwCiAJCQkJCQkJKnJyaWRyZXNwLAogCQkJCQkJdm9pZCAqcmlkZGF0YSwKIAkJCQkJCXVuc2lnbmVkIGludCByaWRkYXRhbGVuKQpAQCAtNzQ0LDcgKzc0NCw3IEBACiBzdHJ1Y3QgdXNiY3RseF9ybWVtX2NvbXBsZXRvciB7CiAJc3RydWN0IHVzYmN0bHhfY29tcGxldG9yIGhlYWQ7CiAKLQljb25zdCBoZmEzODR4X3VzYl9ybWVtcmVzcF90ICpybWVtcmVzcDsKKwljb25zdCBzdHJ1Y3QgaGZhMzg0eF91c2Jfcm1lbXJlc3AgKnJtZW1yZXNwOwogCXZvaWQgKmRhdGE7CiAJdW5zaWduZWQgaW50IGxlbjsKIH07CkBAIC03NjIsNyArNzYyLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYmN0bHhfY29tcGxldG9yICppbml0X3JtZW1fY29tcGxldG9yKAogCQkJCQkJc3RydWN0IHVzYmN0bHhfcm1lbV9jb21wbGV0b3IKIAkJCQkJCQkqY29tcGxldG9yLAotCQkJCQkJaGZhMzg0eF91c2Jfcm1lbXJlc3BfdAorCQkJCQkJc3RydWN0IGhmYTM4NHhfdXNiX3JtZW1yZXNwCiAJCQkJCQkJKnJtZW1yZXNwLAogCQkJCQkJdm9pZCAqZGF0YSwKIAkJCQkJCXVuc2lnbmVkIGludCBsZW4pCkBAIC03OTUsMTAgKzc5NSwxMCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X2NiX3N0YXR1cyhoZmEzODR4X3QgKmh3LCBjb25zdCBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCkKK3N0YXRpYyB2b2lkIGhmYTM4NHhfY2Jfc3RhdHVzKHN0cnVjdCBoZmEzODR4ICpodywgY29uc3Qgc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCkKIHsKIAlpZiAoY3RseC0+dXNlcmNiKSB7Ci0JCWhmYTM4NHhfY21kcmVzdWx0X3QgY21kcmVzdWx0OworCQlzdHJ1Y3QgaGZhMzg0eF9jbWRyZXN1bHQgY21kcmVzdWx0OwogCiAJCWlmIChjdGx4LT5zdGF0ZSAhPSBDVExYX0NPTVBMRVRFKSB7CiAJCQltZW1zZXQoJmNtZHJlc3VsdCwgMCwgc2l6ZW9mKGNtZHJlc3VsdCkpOwpAQCAtODEyLDIxICs4MTIsMjEgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGhmYTM4NHhfZG9jbWRfd2FpdChoZmEzODR4X3QgKmh3LCBoZmEzODR4X21ldGFjbWRfdCAqY21kKQorc3RhdGljIGlubGluZSBpbnQgaGZhMzg0eF9kb2NtZF93YWl0KHN0cnVjdCBoZmEzODR4ICpodywgc3RydWN0IGhmYTM4NHhfbWV0YWNtZCAqY21kKQogewogCXJldHVybiBoZmEzODR4X2RvY21kKGh3LCBET1dBSVQsIGNtZCwgTlVMTCwgTlVMTCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RvY21kX2FzeW5jKGhmYTM4NHhfdCAqaHcsCi0JCSAgICBoZmEzODR4X21ldGFjbWRfdCAqY21kLAoraGZhMzg0eF9kb2NtZF9hc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsCisJCSAgICBzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kICpjbWQsCiAJCSAgICBjdGx4X2NtZGNiX3QgY21kY2IsIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb2NtZChodywgRE9BU1lOQywgY21kLCBjbWRjYiwgdXNlcmNiLCB1c2VyY2JfZGF0YSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RvcnJpZF93YWl0KGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsCitoZmEzODR4X2RvcnJpZF93YWl0KHN0cnVjdCBoZmEzODR4ICpodywgdTE2IHJpZCwgdm9pZCAqcmlkZGF0YSwKIAkJICAgIHVuc2lnbmVkIGludCByaWRkYXRhbGVuKQogewogCXJldHVybiBoZmEzODR4X2RvcnJpZChodywgRE9XQUlULApAQCAtODM0LDcgKzgzNCw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2RvcnJpZF9hc3luYyhoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3JyaWRfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAogCQkgICAgIHUxNiByaWQsIHZvaWQgKnJpZGRhdGEsIHVuc2lnbmVkIGludCByaWRkYXRhbGVuLAogCQkgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwKIAkJICAgICBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpCkBAIC04NDUsNyArODQ1LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZG93cmlkX3dhaXQoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqcmlkZGF0YSwKK2hmYTM4NHhfZG93cmlkX3dhaXQoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgcmlkLCB2b2lkICpyaWRkYXRhLAogCQkgICAgdW5zaWduZWQgaW50IHJpZGRhdGFsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG93cmlkKGh3LCBET1dBSVQsCkBAIC04NTMsNyArODUzLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWhmYTM4NHhfZG93cmlkX2FzeW5jKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2Rvd3JpZF9hc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCSAgICAgdTE2IHJpZCwgdm9pZCAqcmlkZGF0YSwgdW5zaWduZWQgaW50IHJpZGRhdGFsZW4sCiAJCSAgICAgY3RseF9jbWRjYl90IGNtZGNiLAogCQkgICAgIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKQEAgLTg2NCw3ICs4NjQsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb3JtZW1fd2FpdChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3JtZW1fd2FpdChzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCSAgICB1MTYgcGFnZSwgdTE2IG9mZnNldCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlyZXR1cm4gaGZhMzg0eF9kb3JtZW0oaHcsIERPV0FJVCwKQEAgLTg3Miw3ICs4NzIsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludAotaGZhMzg0eF9kb3JtZW1fYXN5bmMoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG9ybWVtX2FzeW5jKHN0cnVjdCBoZmEzODR4ICpodywKIAkJICAgICB1MTYgcGFnZSwgdTE2IG9mZnNldCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgaW50IGxlbiwKIAkJICAgICBjdGx4X2NtZGNiX3QgY21kY2IsCiAJCSAgICAgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKQpAQCAtODgzLDcgKzg4Myw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2Rvd21lbV93YWl0KGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2Rvd21lbV93YWl0KHN0cnVjdCBoZmEzODR4ICpodywKIAkJICAgIHUxNiBwYWdlLCB1MTYgb2Zmc2V0LCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCXJldHVybiBoZmEzODR4X2Rvd21lbShodywgRE9XQUlULApAQCAtODkxLDcgKzg5MSw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1oZmEzODR4X2Rvd21lbV9hc3luYyhoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3dtZW1fYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAogCQkgICAgIHUxNiBwYWdlLAogCQkgICAgIHUxNiBvZmZzZXQsCiAJCSAgICAgdm9pZCAqZGF0YSwKQEAgLTkyMywxMSArOTIzLDExIEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfaW5pdGlhbGl6ZShoZmEzODR4X3QgKmh3KQoraW50IGhmYTM4NHhfY21kX2luaXRpYWxpemUoc3RydWN0IGhmYTM4NHggKmh3KQogewogCWludCByZXN1bHQgPSAwOwogCWludCBpOwotCWhmYTM4NHhfbWV0YWNtZF90IGNtZDsKKwlzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kIGNtZDsKIAogCWNtZC5jbWQgPSBIRkEzODR4X0NNRENPREVfSU5JVDsKIAljbWQucGFybTAgPSAwOwpAQCAtOTY5LDkgKzk2OSw5IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZGlzYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCkKK2ludCBoZmEzODR4X2NtZF9kaXNhYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1hY3BvcnQpCiB7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOworCXN0cnVjdCBoZmEzODR4X21ldGFjbWQgY21kOwogCiAJY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9ESVNBQkxFKSB8CiAJICAgIEhGQTM4NHhfQ01EX01BQ1BPUlRfU0VUKG1hY3BvcnQpOwpAQCAtMTAwMiw5ICsxMDAyLDkgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2NtZF9lbmFibGUoaGZhMzg0eF90ICpodywgdTE2IG1hY3BvcnQpCitpbnQgaGZhMzg0eF9jbWRfZW5hYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1hY3BvcnQpCiB7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOworCXN0cnVjdCBoZmEzODR4X21ldGFjbWQgY21kOwogCiAJY21kLmNtZCA9IEhGQTM4NHhfQ01EX0NNRENPREVfU0VUKEhGQTM4NHhfQ01EQ09ERV9FTkFCTEUpIHwKIAkgICAgSEZBMzg0eF9DTURfTUFDUE9SVF9TRVQobWFjcG9ydCk7CkBAIC0xMDQ0LDkgKzEwNDQsOSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY21kX21vbml0b3IoaGZhMzg0eF90ICpodywgdTE2IGVuYWJsZSkKK2ludCBoZmEzODR4X2NtZF9tb25pdG9yKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IGVuYWJsZSkKIHsKLQloZmEzODR4X21ldGFjbWRfdCBjbWQ7CisJc3RydWN0IGhmYTM4NHhfbWV0YWNtZCBjbWQ7CiAKIAljbWQuY21kID0gSEZBMzg0eF9DTURfQ01EQ09ERV9TRVQoSEZBMzg0eF9DTURDT0RFX01PTklUT1IpIHwKIAkgICAgSEZBMzg0eF9DTURfQUlORk9fU0VUKGVuYWJsZSk7CkBAIC0xMDk1LDEwICsxMDk1LDEwIEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9jbWRfZG93bmxvYWQoaGZhMzg0eF90ICpodywgdTE2IG1vZGUsIHUxNiBsb3dhZGRyLAoraW50IGhmYTM4NHhfY21kX2Rvd25sb2FkKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1vZGUsIHUxNiBsb3dhZGRyLAogCQkJIHUxNiBoaWdoYWRkciwgdTE2IGNvZGVsZW4pCiB7Ci0JaGZhMzg0eF9tZXRhY21kX3QgY21kOworCXN0cnVjdCBoZmEzODR4X21ldGFjbWQgY21kOwogCiAJcHJfZGVidWcoIm1vZGU9JWQsIGxvd2FkZHI9MHglMDR4LCBoaWdoYWRkcj0weCUwNHgsIGNvZGVsZW49JWRcbiIsCiAJCSBtb2RlLCBsb3dhZGRyLCBoaWdoYWRkciwgY29kZWxlbik7CkBAIC0xMTM2LDcgKzExMzYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfY29yZXJlc2V0KGhmYTM4NHhfdCAqaHcsIGludCBob2xkdGltZSwgaW50IHNldHRsZXRpbWUsIGludCBnZW5lc2lzKQoraW50IGhmYTM4NHhfY29yZXJlc2V0KHN0cnVjdCBoZmEzODR4ICpodywgaW50IGhvbGR0aW1lLCBpbnQgc2V0dGxldGltZSwgaW50IGdlbmVzaXMpCiB7CiAJaW50IHJlc3VsdDsKIApAQCAtMTE3Myw4ICsxMTczLDggQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgaGZhMzg0eF91c2JjdGx4X2NvbXBsZXRlX3N5bmMoaGZhMzg0eF90ICpodywKLQkJCQkJIGhmYTM4NHhfdXNiY3RseF90ICpjdGx4LAorc3RhdGljIGludCBoZmEzODR4X3VzYmN0bHhfY29tcGxldGVfc3luYyhzdHJ1Y3QgaGZhMzg0eCAqaHcsCisJCQkJCSBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4LAogCQkJCQkgc3RydWN0IHVzYmN0bHhfY29tcGxldG9yICpjb21wbGV0b3IpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTEyODksMTMgKzEyODksMTMgQEAKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50Ci1oZmEzODR4X2RvY21kKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2RvY21kKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCi0JICAgICAgaGZhMzg0eF9tZXRhY21kX3QgKmNtZCwKKwkgICAgICBzdHJ1Y3QgaGZhMzg0eF9tZXRhY21kICpjbWQsCiAJICAgICAgY3RseF9jbWRjYl90IGNtZGNiLCBjdGx4X3VzZXJjYl90IHVzZXJjYiwgdm9pZCAqdXNlcmNiX2RhdGEpCiB7CiAJaW50IHJlc3VsdDsKLQloZmEzODR4X3VzYmN0bHhfdCAqY3RseDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4OwogCiAJY3RseCA9IHVzYmN0bHhfYWxsb2MoKTsKIAlpZiAoIWN0bHgpIHsKQEAgLTEzNzcsNyArMTM3Nyw3IEBACiAqCXByb2Nlc3MgKERPV0FJVCBvciBET0FTWU5DKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50Ci1oZmEzODR4X2RvcnJpZChoZmEzODR4X3QgKmh3LAoraGZhMzg0eF9kb3JyaWQoc3RydWN0IGhmYTM4NHggKmh3LAogCSAgICAgICBlbnVtIGNtZF9tb2RlIG1vZGUsCiAJICAgICAgIHUxNiByaWQsCiAJICAgICAgIHZvaWQgKnJpZGRhdGEsCkBAIC0xMzg1LDcgKzEzODUsNyBAQAogCSAgICAgICBjdGx4X2NtZGNiX3QgY21kY2IsIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKIHsKIAlpbnQgcmVzdWx0OwotCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4OworCXN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHg7CiAKIAljdGx4ID0gdXNiY3RseF9hbGxvYygpOwogCWlmICghY3RseCkgewpAQCAtMTQ1OCw3ICsxNDU4LDcgQEAKICoJcHJvY2VzcyAoRE9XQUlUIG9yIERPQVNZTkMpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQKLWhmYTM4NHhfZG93cmlkKGhmYTM4NHhfdCAqaHcsCitoZmEzODR4X2Rvd3JpZChzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJICAgICAgIGVudW0gY21kX21vZGUgbW9kZSwKIAkgICAgICAgdTE2IHJpZCwKIAkgICAgICAgdm9pZCAqcmlkZGF0YSwKQEAgLTE0NjYsNyArMTQ2Niw3IEBACiAJICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKQogewogCWludCByZXN1bHQ7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseDsKIAogCWN0bHggPSB1c2JjdGx4X2FsbG9jKCk7CiAJaWYgKCFjdGx4KSB7CkBAIC0xNDk3LDcgKzE0OTcsNyBAQAogCQlrZnJlZShjdGx4KTsKIAl9IGVsc2UgaWYgKG1vZGUgPT0gRE9XQUlUKSB7CiAJCXN0cnVjdCB1c2JjdGx4X2NtZF9jb21wbGV0b3IgY29tcGxldG9yOwotCQloZmEzODR4X2NtZHJlc3VsdF90IHdyaWRyZXN1bHQ7CisJCXN0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCB3cmlkcmVzdWx0OwogCiAJCXJlc3VsdCA9IGhmYTM4NHhfdXNiY3RseF9jb21wbGV0ZV9zeW5jKGh3LAogCQkJCQkJICAgICAgIGN0bHgsCkBAIC0xNTQ1LDcgKzE1NDUsNyBAQAogKglwcm9jZXNzIChET1dBSVQgb3IgRE9BU1lOQykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludAotaGZhMzg0eF9kb3JtZW0oaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG9ybWVtKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAogCSAgICAgICB1MTYgcGFnZSwKIAkgICAgICAgdTE2IG9mZnNldCwKQEAgLTE1NTQsNyArMTU1NCw3IEBACiAJICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKQogewogCWludCByZXN1bHQ7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseDsKIAogCWN0bHggPSB1c2JjdGx4X2FsbG9jKCk7CiAJaWYgKCFjdGx4KSB7CkBAIC0xNjM2LDcgKzE2MzYsNyBAQAogKglwcm9jZXNzIChET1dBSVQgb3IgRE9BU1lOQykKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIGludAotaGZhMzg0eF9kb3dtZW0oaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZG93bWVtKHN0cnVjdCBoZmEzODR4ICpodywKIAkgICAgICAgZW51bSBjbWRfbW9kZSBtb2RlLAogCSAgICAgICB1MTYgcGFnZSwKIAkgICAgICAgdTE2IG9mZnNldCwKQEAgLTE2NDUsNyArMTY0NSw3IEBACiAJICAgICAgIGN0bHhfY21kY2JfdCBjbWRjYiwgY3RseF91c2VyY2JfdCB1c2VyY2IsIHZvaWQgKnVzZXJjYl9kYXRhKQogewogCWludCByZXN1bHQ7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseDsKIAogCXByX2RlYnVnKCJwYWdlPTB4JTA0eCBvZmZzZXQ9MHglMDR4IGxlbj0lZFxuIiwgcGFnZSwgb2Zmc2V0LCBsZW4pOwogCkBAIC0xNjc5LDcgKzE2NzksNyBAQAogCQlrZnJlZShjdGx4KTsKIAl9IGVsc2UgaWYgKG1vZGUgPT0gRE9XQUlUKSB7CiAJCXN0cnVjdCB1c2JjdGx4X2NtZF9jb21wbGV0b3IgY29tcGxldG9yOwotCQloZmEzODR4X2NtZHJlc3VsdF90IHdtZW1yZXN1bHQ7CisJCXN0cnVjdCBoZmEzODR4X2NtZHJlc3VsdCB3bWVtcmVzdWx0OwogCiAJCXJlc3VsdCA9IGhmYTM4NHhfdXNiY3RseF9jb21wbGV0ZV9zeW5jKGh3LAogCQkJCQkJICAgICAgIGN0bHgsCkBAIC0xNzE1LDcgKzE3MTUsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKGhmYTM4NHhfdCAqaHcsIHUxNiBtYWNwb3J0KQoraW50IGhmYTM4NHhfZHJ2cl9kaXNhYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1hY3BvcnQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKQEAgLTE3NTMsNyArMTc1Myw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MTYgbWFjcG9ydCkKK2ludCBoZmEzODR4X2RydnJfZW5hYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IG1hY3BvcnQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAKQEAgLTE3OTAsNyArMTc5MCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKGhmYTM4NHhfdCAqaHcpCitpbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZW5hYmxlKHN0cnVjdCBoZmEzODR4ICpodykKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgaTsKQEAgLTE4NDksNyArMTg0OSw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfZGlzYWJsZShoZmEzODR4X3QgKmh3KQoraW50IGhmYTM4NHhfZHJ2cl9mbGFzaGRsX2Rpc2FibGUoc3RydWN0IGhmYTM4NHggKmh3KQogewogCS8qIENoZWNrIHRoYXQgd2UncmUgYWxyZWFkeSBpbiB0aGUgZG93bmxvYWQgc3RhdGUgKi8KIAlpZiAoaHctPmRsc3RhdGUgIT0gSEZBMzg0eF9ETFNUQVRFX0ZMQVNIRU5BQkxFRCkKQEAgLTE4OTQsNyArMTg5NCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoaGZhMzg0eF90ICpodywgdTMyIGRhZGRyLCB2b2lkICpidWYsIHUzMiBsZW4pCitpbnQgaGZhMzg0eF9kcnZyX2ZsYXNoZGxfd3JpdGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MzIgZGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAl1MzIgZGxidWZhZGRyOwpAQCAtMjAzMiw3ICsyMDMyLDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGhmYTM4NHhfdCAqaHcsIHUxNiByaWQsIHZvaWQgKmJ1ZiwgdTE2IGxlbikKK2ludCBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKHN0cnVjdCBoZmEzODR4ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKQogewogCXJldHVybiBoZmEzODR4X2RvcnJpZF93YWl0KGh3LCByaWQsIGJ1ZiwgbGVuKTsKIH0KQEAgLTIwNjEsNyArMjA2MSw3IEBACiAgKiAgICAgICBwcm9jZXNzCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBpbnQKLWhmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoaGZhMzg0eF90ICpodywKK2hmYTM4NHhfZHJ2cl9zZXRjb25maWdfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICAgICB1MTYgcmlkLAogCQkJICAgICB2b2lkICpidWYsCiAJCQkgICAgIHUxNiBsZW4sIGN0bHhfdXNlcmNiX3QgdXNlcmNiLCB2b2lkICp1c2VyY2JfZGF0YSkKQEAgLTIwODgsNyArMjA4OCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2Rpc2FibGUoaGZhMzg0eF90ICpodykKK2ludCBoZmEzODR4X2RydnJfcmFtZGxfZGlzYWJsZShzdHJ1Y3QgaGZhMzg0eCAqaHcpCiB7CiAJLyogQ2hlY2sgdGhhdCB3ZSdyZSBhbHJlYWR5IGluIHRoZSBkb3dubG9hZCBzdGF0ZSAqLwogCWlmIChody0+ZGxzdGF0ZSAhPSBIRkEzODR4X0RMU1RBVEVfUkFNRU5BQkxFRCkKQEAgLTIxMjgsNyArMjEyOCw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3JhbWRsX2VuYWJsZShoZmEzODR4X3QgKmh3LCB1MzIgZXhlYWRkcikKK2ludCBoZmEzODR4X2RydnJfcmFtZGxfZW5hYmxlKHN0cnVjdCBoZmEzODR4ICpodywgdTMyIGV4ZWFkZHIpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTE2IGxvd2FkZHI7CkBAIC0yMTk2LDcgKzIxOTYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9yYW1kbF93cml0ZShoZmEzODR4X3QgKmh3LCB1MzIgZGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKK2ludCBoZmEzODR4X2RydnJfcmFtZGxfd3JpdGUoc3RydWN0IGhmYTM4NHggKmh3LCB1MzIgZGFkZHIsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgbndyaXRlczsKQEAgLTIyNzYsNyArMjI3Niw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcyBvciBub24tY2FyZCBpbnRlcnJ1cHQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBoZmEzODR4X2RydnJfcmVhZHBkYShoZmEzODR4X3QgKmh3LCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCitpbnQgaGZhMzg0eF9kcnZyX3JlYWRwZGEoc3RydWN0IGhmYTM4NHggKmh3LCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTE2ICpwZGEgPSBidWY7CkBAIC0yMzg2LDcgKzIzODYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaGZhMzg0eF90ICpodywgdTE2IHJpZCwgdm9pZCAqYnVmLCB1MTYgbGVuKQoraW50IGhmYTM4NHhfZHJ2cl9zZXRjb25maWcoc3RydWN0IGhmYTM4NHggKmh3LCB1MTYgcmlkLCB2b2lkICpidWYsIHUxNiBsZW4pCiB7CiAJcmV0dXJuIGhmYTM4NHhfZG93cmlkX3dhaXQoaHcsIHJpZCwgYnVmLCBsZW4pOwogfQpAQCAtMjQxMSw3ICsyNDExLDcgQEAKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLWludCBoZmEzODR4X2RydnJfc3RhcnQoaGZhMzg0eF90ICpodykKK2ludCBoZmEzODR4X2RydnJfc3RhcnQoc3RydWN0IGhmYTM4NHggKmh3KQogewogCWludCByZXN1bHQsIHJlc3VsdDEsIHJlc3VsdDI7CiAJdTE2IHN0YXR1czsKQEAgLTI1MTIsNyArMjUxMiw3IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgaGZhMzg0eF9kcnZyX3N0b3AoaGZhMzg0eF90ICpodykKK2ludCBoZmEzODR4X2RydnJfc3RvcChzdHJ1Y3QgaGZhMzg0eCAqaHcpCiB7CiAJaW50IGk7CiAKQEAgLTI1NjIsMTEgKzI1NjIsMTEgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IGhmYTM4NHhfZHJ2cl90eGZyYW1lKGhmYTM4NHhfdCAqaHcsIHN0cnVjdCBza19idWZmICpza2IsCitpbnQgaGZhMzg0eF9kcnZyX3R4ZnJhbWUoc3RydWN0IGhmYTM4NHggKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJIHVuaW9uIHA4MDIxMV9oZHIgKnA4MDIxMV9oZHIsCiAJCQkgc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKQogewotCWludCB1c2Jwa3RsZW4gPSBzaXplb2YoaGZhMzg0eF90eF9mcmFtZV90KTsKKwlpbnQgdXNicGt0bGVuID0gc2l6ZW9mKHN0cnVjdCBoZmEzODR4X3R4X2ZyYW1lKTsKIAlpbnQgcmVzdWx0OwogCWludCByZXQ7CiAJY2hhciAqcHRyOwpAQCAtMjY1Niw5ICsyNjU2LDkgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi12b2lkIGhmYTM4NHhfdHhfdGltZW91dCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCit2b2lkIGhmYTM4NHhfdHhfdGltZW91dChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHctPmN0bHhxLmxvY2ssIGZsYWdzKTsKQEAgLTI2ODEsNyArMjY4MSw3IEBACiAqIFRhc2tsZXQgdG8gZGVsZXRlIGRlYWQgQ1RMWCBvYmplY3RzCiAqCiAqIEFyZ3VtZW50czoKLSoJZGF0YQlwdHIgdG8gYSBoZmEzODR4X3QKKyoJZGF0YQlwdHIgdG8gYSBzdHJ1Y3QgaGZhMzg0eAogKgogKiBSZXR1cm5zOgogKgpAQCAtMjY5MCw4ICsyNjkwLDggQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JjdGx4X3JlYXBlcl90YXNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKWRhdGE7Ci0JaGZhMzg0eF91c2JjdGx4X3QgKmN0bHgsICp0ZW1wOworCXN0cnVjdCBoZmEzODR4ICpodyA9IChzdHJ1Y3QgaGZhMzg0eCAqKWRhdGE7CisJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCwgKnRlbXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOwpAQCAtMjcxMyw3ICsyNzEzLDcgQEAKICogVGFza2xldCB0byBjYWxsIGNvbXBsZXRpb24gaGFuZGxlcnMgZm9yIHJldHVybmVkIENUTFhzCiAqCiAqIEFyZ3VtZW50czoKLSoJZGF0YQlwdHIgdG8gaGZhMzg0eF90CisqCWRhdGEJcHRyIHRvIHN0cnVjdCBoZmEzODR4CiAqCiAqIFJldHVybnM6CiAqCU5vdGhpbmcKQEAgLTI3MjMsOCArMjcyMyw4IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseF9jb21wbGV0aW9uX3Rhc2sodW5zaWduZWQgbG9uZyBkYXRhKQogewotCWhmYTM4NHhfdCAqaHcgPSAoaGZhMzg0eF90ICopZGF0YTsKLQloZmEzODR4X3VzYmN0bHhfdCAqY3RseCwgKnRlbXA7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gKHN0cnVjdCBoZmEzODR4ICopZGF0YTsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4LCAqdGVtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaW50IHJlYXAgPSAwOwpAQCAtMjc4Nyw3ICsyNzg3LDcgQEAKICogbmV4dCBjb21tYW5kIG9uIHRoZSBxdWV1ZSBpcyBydW4gYWZ0ZXJ3YXJkcy4KICoKICogQXJndW1lbnRzOgotKglodwlwdHIgdG8gdGhlIGhmYTM4NHhfdCBzdHJ1Y3R1cmUKKyoJaHcJcHRyIHRvIHRoZSBzdHJ1Y3QgaGZhMzg0eCBzdHJ1Y3R1cmUKICoJY3RseAlwdHIgdG8gYSBDVExYIHN0cnVjdHVyZQogKgogKiBSZXR1cm5zOgpAQCAtMjc5Nyw4ICsyNzk3LDggQEAKICogQ2FsbCBjb250ZXh0OgogKglFaXRoZXIgcHJvY2VzcyBvciBpbnRlcnJ1cHQsIGJ1dCBwcmVzdW1hYmx5IGludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHVubG9ja2VkX3VzYmN0bHhfY2FuY2VsX2FzeW5jKGhmYTM4NHhfdCAqaHcsCi0JCQkJCSBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCkKK3N0YXRpYyBpbnQgdW5sb2NrZWRfdXNiY3RseF9jYW5jZWxfYXN5bmMoc3RydWN0IGhmYTM4NHggKmh3LAorCQkJCQkgc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCkKIHsKIAlpbnQgcmV0OwogCkBAIC0yODM2LDcgKzI4MzYsNyBAQAogKiB0YXNrbGV0IGlzIHNjaGVkdWxlZC4KICoKICogQXJndW1lbnRzOgotKglodwkJcHRyIHRvIGEgaGZhMzg0eF90IHN0cnVjdHVyZQorKglodwkJcHRyIHRvIGEgc3RydWN0IGhmYTM4NHggc3RydWN0dXJlCiAqCWN0bHgJCXB0ciB0byBhIGN0bHggc3RydWN0dXJlCiAqCiAqIFJldHVybnM6CkBAIC0yODQ3LDcgKzI4NDcsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCUVpdGhlciwgYXNzdW1lIGludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCB1bmxvY2tlZF91c2JjdGx4X2NvbXBsZXRlKGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfdXNiY3RseF90ICpjdGx4KQorc3RhdGljIHZvaWQgdW5sb2NrZWRfdXNiY3RseF9jb21wbGV0ZShzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpCiB7CiAJLyogVGltZXJzIGhhdmUgYmVlbiBzdG9wcGVkLCBhbmQgY3RseCBzaG91bGQgYmUgaW4KIAkgKiBhIHRlcm1pbmFsIHN0YXRlLiBSZXRpcmUgaXQgZnJvbSB0aGUgImFjdGl2ZSIKQEAgLTI4NzYsNyArMjg3Niw3IEBACiAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGhlYWQgaXRlbSBpcyBydW5uaW5nLiAgSWYgbm90LCBzdGFydHMgaXQuCiAqCiAqIEFyZ3VtZW50czoKLSoJaHcJcHRyIHRvIGhmYTM4NHhfdAorKglodwlwdHIgdG8gc3RydWN0IGhmYTM4NHgKICoKICogUmV0dXJuczoKICoJbm90aGluZwpAQCAtMjg4Niw3ICsyODg2LDcgQEAKICogQ2FsbCBjb250ZXh0OgogKglhbnkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF91c2JjdGx4cV9ydW4oaGZhMzg0eF90ICpodykKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiY3RseHFfcnVuKHN0cnVjdCBoZmEzODR4ICpodykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0yOTA1LDEyICsyOTA1LDEyIEBACiAJCWdvdG8gdW5sb2NrOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZody0+Y3RseHEucGVuZGluZykpIHsKLQkJaGZhMzg0eF91c2JjdGx4X3QgKmhlYWQ7CisJCXN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmhlYWQ7CiAJCWludCByZXN1bHQ7CiAKIAkJLyogVGhpcyBpcyB0aGUgZmlyc3QgcGVuZGluZyBjb21tYW5kICovCiAJCWhlYWQgPSBsaXN0X2VudHJ5KGh3LT5jdGx4cS5wZW5kaW5nLm5leHQsCi0JCQkJICBoZmEzODR4X3VzYmN0bHhfdCwgbGlzdCk7CisJCQkJICBzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4LCBsaXN0KTsKIAogCQkvKiBXZSBuZWVkIHRvIHNwbGl0IHRoaXMgb2ZmIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24gKi8KIAkJbGlzdF9tb3ZlX3RhaWwoJmhlYWQtPmxpc3QsICZody0+Y3RseHEuYWN0aXZlKTsKQEAgLTI5ODgsOSArMjk4OCw5IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IHVyYi0+Y29udGV4dDsKLQloZmEzODR4X3QgKmh3OwotCWhmYTM4NHhfdXNiaW5fdCAqdXNiaW4gPSAoaGZhMzg0eF91c2Jpbl90ICopdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGhmYTM4NHggKmh3OworCXVuaW9uIGhmYTM4NHhfdXNiaW4gKnVzYmluID0gKHVuaW9uIGhmYTM4NHhfdXNiaW4gKil1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlpbnQgcmVzdWx0OwogCWludCB1cmJfc3RhdHVzOwpAQCAtMzE1NCw3ICszMTU0LDcgQEAKICogcXVldWUgYW5kIG91ciBzdGF0ZSB1cGRhdGVkIGFjY29yZGluZ2x5LgogKgogKiBBcmd1bWVudHM6Ci0qCWh3CQlwdHIgdG8gaGZhMzg0eF90CisqCWh3CQlwdHIgdG8gc3RydWN0IGhmYTM4NHgKICoJdXNiaW4JCXB0ciB0byBVU0IgSU4gcGFja2V0CiAqCXVyYl9zdGF0dXMJc3RhdHVzIG9mIHRoaXMgQnVsay1JbiBVUkIKICoKQEAgLTMxNjYsMTAgKzMxNjYsMTAgQEAKICogQ2FsbCBjb250ZXh0OgogKglpbnRlcnJ1cHQKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl9jdGx4KGhmYTM4NHhfdCAqaHcsIGhmYTM4NHhfdXNiaW5fdCAqdXNiaW4sCitzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2N0bHgoc3RydWN0IGhmYTM4NHggKmh3LCB1bmlvbiBoZmEzODR4X3VzYmluICp1c2JpbiwKIAkJCSAgICAgICBpbnQgdXJiX3N0YXR1cykKIHsKLQloZmEzODR4X3VzYmN0bHhfdCAqY3RseDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4OwogCWludCBydW5fcXVldWUgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTMyODUsOCArMzI4NSw4IEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fdHhjb21wbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICBoZmEzODR4X3VzYmluX3QgKnVzYmluKQorc3RhdGljIHZvaWQgaGZhMzg0eF91c2Jpbl90eGNvbXBsKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgdW5pb24gaGZhMzg0eF91c2JpbiAqdXNiaW4pCiB7CiAJdTE2IHN0YXR1czsKIApAQCAtMzMxNiwxMCArMzMxNiwxMCBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX3J4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5fcngoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaGZhMzg0eF91c2Jpbl90ICp1c2JpbiA9IChoZmEzODR4X3VzYmluX3QgKilza2ItPmRhdGE7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJdW5pb24gaGZhMzg0eF91c2JpbiAqdXNiaW4gPSAodW5pb24gaGZhMzg0eF91c2JpbiAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCWludCBoZHJsZW47CiAJc3RydWN0IHA4MDIxMV9yeG1ldGEgKnJ4bWV0YTsKIAl1MTYgZGF0YV9sZW47CkBAIC0zMzQ2LDcgKzMzNDYsNyBAQAogCQloZHJsZW4gPSBwODAyMTFfaGVhZGVybGVuKGZjKTsKIAogCQkvKiBQdWxsIG9mZiB0aGUgZGVzY3JpcHRvciAqLwotCQlza2JfcHVsbChza2IsIHNpemVvZihoZmEzODR4X3J4X2ZyYW1lX3QpKTsKKwkJc2tiX3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGhmYTM4NHhfcnhfZnJhbWUpKTsKIAogCQkvKiBOb3cgc2h1bnQgdGhlIGhlYWRlciBibG9jayB1cCBhZ2FpbnN0IHRoZSBkYXRhIGJsb2NrCiAJCSAqIHdpdGggYW4gIm92ZXJsYXBwaW5nIiBjb3B5CkBAIC0zNDE2LDE3ICszNDE2LDE3IEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3J4bW9uaXRvcih3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICBoZmEzODR4X3VzYl9yeGZybV90ICpyeGZybSkKK3N0YXRpYyB2b2lkIGhmYTM4NHhfaW50X3J4bW9uaXRvcihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgIHN0cnVjdCBoZmEzODR4X3VzYl9yeGZybSAqcnhmcm0pCiB7Ci0JaGZhMzg0eF9yeF9mcmFtZV90ICpyeGRlc2MgPSAmKHJ4ZnJtLT5kZXNjKTsKKwlzdHJ1Y3QgaGZhMzg0eF9yeF9mcmFtZSAqcnhkZXNjID0gJihyeGZybS0+ZGVzYyk7CiAJdW5zaWduZWQgaW50IGhkcmxlbiA9IDA7CiAJdW5zaWduZWQgaW50IGRhdGFsZW4gPSAwOwogCXVuc2lnbmVkIGludCBza2JsZW4gPSAwOwogCXU4ICpkYXRhcDsKIAl1MTYgZmM7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCiAJLyogUmVtZW1iZXIgdGhlIHN0YXR1cywgdGltZSwgYW5kIGRhdGFfbGVuIGZpZWxkcyBhcmUgaW4gaG9zdCBvcmRlciAqLwogCS8qIEZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgZnJhbWUgaXMgKi8KQEAgLTM1MTcsNyArMzUxNyw4IEBACiAqIENhbGwgY29udGV4dDoKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkIGhmYTM4NHhfdXNiaW5faW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIGhmYTM4NHhfdXNiaW5fdCAqdXNiaW4pCitzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmluX2luZm8oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkgICAgICAgdW5pb24gaGZhMzg0eF91c2JpbiAqdXNiaW4pCiB7CiAJdXNiaW4tPmluZm9mcm0uaW5mby5mcmFtZWxlbiA9CiAJICAgIGxlMTZfdG9fY3B1KHVzYmluLT5pbmZvZnJtLmluZm8uZnJhbWVsZW4pOwpAQCAtMzU0Miw3ICszNTQzLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JvdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IHVyYi0+Y29udGV4dDsKIAogI2lmZGVmIERFQlVHX1VTQgogCWRicHJpbnRfdXJiKHVyYik7CkBAIC0zNTU2LDcgKzM1NTcsNyBAQAogCiAJCWNhc2UgLUVQSVBFOgogCQkJewotCQkJCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCQkJCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAkJCQluZXRkZXZfd2Fybihody0+d2xhbmRldi0+bmV0ZGV2LAogCQkJCQkgICAgIiVzIHR4IHBpcGUgc3RhbGxlZDogcmVxdWVzdGluZyByZXNldFxuIiwKQEAgLTM1NzIsNyArMzU3Myw3IEBACiAJCWNhc2UgLUVUSU1FRE9VVDoKIAkJY2FzZSAtRUlMU0VROgogCQkJewotCQkJCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCQkJCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAkJCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQKIAkJCQkgICAgKFRIUk9UVExFX1RYLCAmaHctPnVzYl9mbGFncykgJiYKQEAgLTM2MTcsMTEgKzM2MTgsMTEgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF9jdGx4b3V0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKIHsKLQloZmEzODR4X3QgKmh3ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHVyYi0+Y29udGV4dDsKIAlpbnQgZGVsZXRlX3Jlc3B0aW1lciA9IDA7CiAJaW50IHRpbWVyX29rID0gMTsKIAlpbnQgcnVuX3F1ZXVlID0gMDsKLQloZmEzODR4X3VzYmN0bHhfdCAqY3RseDsKKwlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwcl9kZWJ1ZygidXJiLT5zdGF0dXM9JWRcbiIsIHVyYi0+c3RhdHVzKTsKQEAgLTM3MzYsNyArMzczNyw3IEBACiAqIFVSQiBjb250YWluaW5nIGEgUHJpc20yLnggWFhYX1JlcXVlc3Qgd2FzIG5ldmVyIGNhbGxlZC4KICoKICogQXJndW1lbnRzOgotKglkYXRhCQlhIHB0ciB0byB0aGUgaGZhMzg0eF90CisqCWRhdGEJCWEgcHRyIHRvIHRoZSBzdHJ1Y3QgaGZhMzg0eAogKgogKiBSZXR1cm5zOgogKglub3RoaW5nCkBAIC0zNzQ4LDcgKzM3NDksNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYmN0bHhfcmVxdGltZXJmbih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0JaGZhMzg0eF90ICpodyA9IChoZmEzODR4X3QgKilkYXRhOworCXN0cnVjdCBoZmEzODR4ICpodyA9IChzdHJ1Y3QgaGZhMzg0eCAqKWRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZody0+Y3RseHEubG9jaywgZmxhZ3MpOwpAQCAtMzc2NSw3ICszNzY2LDcgQEAKIAkJICovCiAJCWh3LT5jdGx4X3VyYi50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOwogCQlpZiAodXNiX3VubGlua191cmIoJmh3LT5jdGx4X3VyYikgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCQloZmEzODR4X3VzYmN0bHhfdCAqY3RseCA9IGdldF9hY3RpdmVfY3RseChodyk7CisJCQlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4ID0gZ2V0X2FjdGl2ZV9jdGx4KGh3KTsKIAogCQkJY3RseC0+c3RhdGUgPSBDVExYX1JFUV9GQUlMRUQ7CiAKQEAgLTM3OTQsNyArMzc5NSw3IEBACiAqIFVSQiBjb250YWluaW5nIGEgUHJpc20yLnggWFhYX1Jlc3BvbnNlIHdhcyBuZXZlciBjYWxsZWQuCiAqCiAqIEFyZ3VtZW50czoKLSoJZGF0YQkJYSBwdHIgdG8gdGhlIGhmYTM4NHhfdAorKglkYXRhCQlhIHB0ciB0byB0aGUgc3RydWN0IGhmYTM4NHgKICoKICogUmV0dXJuczoKICoJbm90aGluZwpAQCAtMzgwNiw3ICszODA3LDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RhdGljIHZvaWQgaGZhMzg0eF91c2JjdGx4X3Jlc3B0aW1lcmZuKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKWRhdGE7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gKHN0cnVjdCBoZmEzODR4ICopZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5jdGx4cS5sb2NrLCBmbGFncyk7CkBAIC0zODE3LDcgKzM4MTgsNyBAQAogCSAqIGFkYXB0ZXIgaGFzIGJlZW4gdW5wbHVnZ2VkIC4uLgogCSAqLwogCWlmICghbGlzdF9lbXB0eSgmaHctPmN0bHhxLmFjdGl2ZSkpIHsKLQkJaGZhMzg0eF91c2JjdGx4X3QgKmN0bHggPSBnZXRfYWN0aXZlX2N0bHgoaHcpOworCQlzdHJ1Y3QgaGZhMzg0eF91c2JjdGx4ICpjdGx4ID0gZ2V0X2FjdGl2ZV9jdGx4KGh3KTsKIAogCQlpZiAodW5sb2NrZWRfdXNiY3RseF9jYW5jZWxfYXN5bmMoaHcsIGN0bHgpID09IDApIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmh3LT5jdGx4cS5sb2NrLCBmbGFncyk7CkBAIC0zODQ1LDcgKzM4NDYsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBoZmEzODR4X3VzYl90aHJvdHRsZWZuKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKWRhdGE7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gKHN0cnVjdCBoZmEzODR4ICopZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmh3LT5jdGx4cS5sb2NrLCBmbGFncyk7CkBAIC0zODg1LDcgKzM4ODYsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3Mgb3IgaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgaGZhMzg0eF91c2JjdGx4X3N1Ym1pdChoZmEzODR4X3QgKmh3LCBoZmEzODR4X3VzYmN0bHhfdCAqY3RseCkKK3N0YXRpYyBpbnQgaGZhMzg0eF91c2JjdGx4X3N1Ym1pdChzdHJ1Y3QgaGZhMzg0eCAqaHcsIHN0cnVjdCBoZmEzODR4X3VzYmN0bHggKmN0bHgpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExY29udi5jCmluZGV4IDYzNTQwMzYuLjAyNDdjYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMWNvbnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFjb252LmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogKglNYXkgYmUgY2FsbGVkIGluIGludGVycnVwdCBvciBub24taW50ZXJydXB0IGNvbnRleHQKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwotaW50IHNrYl9ldGhlcl90b19wODAyMTEod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgZXRoY29udiwKK2ludCBza2JfZXRoZXJfdG9fcDgwMjExKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1MzIgZXRoY29udiwKIAkJCXN0cnVjdCBza19idWZmICpza2IsIHVuaW9uIHA4MDIxMV9oZHIgKnA4MDIxMV9oZHIsCiAJCQlzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgKnA4MDIxMV93ZXApCiB7CkBAIC0yMzIsNyArMjMyLDcgQEAKIH0KIAogLyogamtyaWVnbDogZnJvbSBvcmlub2NvLCBtb2RpZmllZCAqLwotc3RhdGljIHZvaWQgb3Jpbm9jb19zcHlfZ2F0aGVyKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgY2hhciAqbWFjLAorc3RhdGljIHZvaWQgb3Jpbm9jb19zcHlfZ2F0aGVyKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBjaGFyICptYWMsCiAJCQkgICAgICAgc3RydWN0IHA4MDIxMV9yeG1ldGEgKnJ4bWV0YSkKIHsKIAlpbnQgaTsKQEAgLTI3NCwxMCArMjc0LDEwIEBACiAqCU1heSBiZSBjYWxsZWQgaW4gaW50ZXJydXB0IG9yIG5vbi1pbnRlcnJ1cHQgY29udGV4dAogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCi1pbnQgc2tiX3A4MDIxMV90b19ldGhlcih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBldGhjb252LAoraW50IHNrYl9wODAyMTFfdG9fZXRoZXIoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHUzMiBldGhjb252LAogCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQluZXRkZXZpY2VfdCAqbmV0ZGV2ID0gd2xhbmRldi0+bmV0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSB3bGFuZGV2LT5uZXRkZXY7CiAJdTE2IGZjOwogCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbmd0aDsKIAl1bnNpZ25lZCBpbnQgcGF5bG9hZF9vZmZzZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhZGVmLmgKaW5kZXggMGNjZmJhMS4uYjBkMzU2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YWRlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFkZWYuaApAQCAtMTU1LDIyICsxNTUsOSBAQAogI2RlZmluZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNCkpCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MCBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgxKSB8IDB4MGMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MSBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgyKSB8IDB4MGMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MiBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSgzKSB8IDB4MGMwMDAwMDApCi0jZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MyBcCi0JCQkoUDgwMjExRElEX01LU0VDVElPTigxKSB8IFwKLQkJCVA4MDIxMURJRF9NS0dST1VQKDQpIHwgXAotCQkJUDgwMjExRElEX01LSVRFTSg0KSB8IDB4MGMwMDAwMDApCisjZGVmaW5lIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KF9pKSBcCisJCQkoRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZSB8IFwKKwkJCVA4MDIxMURJRF9NS0lURU0oX2kpIHwgMHgwYzAwMDAwMCkKICNkZWZpbmUgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlIFwKIAkJCShQODAyMTFESURfTUtTRUNUSU9OKDEpIHwgXAogCQkJUDgwMjExRElEX01LR1JPVVAoNikpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhc3RydWN0LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFtZXRhc3RydWN0LmgKaW5kZXggYzUwMTE2Mi4uODUwZDg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbWV0YXN0cnVjdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW1ldGFzdHJ1Y3QuaApAQCAtNTEsMjIxICs1MSwyMjEgQEAKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV91bmszOTJfdCBtaWJhdHRyaWJ1dGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VuazM5MiBtaWJhdHRyaWJ1dGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdW5rMzkyX3QgbWliYXR0cmlidXRlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91bmszOTIgbWliYXR0cmlidXRlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuIHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV91aW50MzJfdCBic3N0eXBlOwotCXA4MDIxMWl0ZW1fcHN0cjZfdCBic3NpZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYnNzdHlwZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiBic3NpZDsKIAl1OCBwYWRfMENbMV07Ci0JcDgwMjExaXRlbV9wc3RyMzJfdCBzc2lkOworCXN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiBzc2lkOwogCXU4IHBhZF8xRFszXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHNjYW50eXBlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcHJvYmVkZWxheTsKLQlwODAyMTFpdGVtX3BzdHIxNF90IGNoYW5uZWxsaXN0OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBzY2FudHlwZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcHJvYmVkZWxheTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMTQgY2hhbm5lbGxpc3Q7CiAJdTggcGFkXzJDWzFdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgbWluY2hhbm5lbHRpbWU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBtYXhjaGFubmVsdGltZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBudW1ic3M7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBhcHBlbmQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIG1pbmNoYW5uZWx0aW1lOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBtYXhjaGFubmVsdGltZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgbnVtYnNzOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBhcHBlbmQ7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3NjYW5fcmVzdWx0cyB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYnNzaW5kZXg7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgc2lnbmFsOwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgbm9pc2U7Ci0JcDgwMjExaXRlbV9wc3RyNl90IGJzc2lkOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBic3NpbmRleDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc2lnbmFsOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBub2lzZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiBic3NpZDsKIAl1OCBwYWRfM0NbMV07Ci0JcDgwMjExaXRlbV9wc3RyMzJfdCBzc2lkOworCXN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiBzc2lkOwogCXU4IHBhZF80RFszXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJzc3R5cGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiZWFjb25wZXJpb2Q7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBkdGltcGVyaW9kOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgdGltZXN0YW1wOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgbG9jYWx0aW1lOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZmhkd2VsbHRpbWU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBmaGhvcHNldDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGZoaG9wcGF0dGVybjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGZoaG9waW5kZXg7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBkc2NoYW5uZWw7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjZnBjb3VudDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcHBlcmlvZDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcG1heGR1cmF0aW9uOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgY2ZwZHVycmVtYWluaW5nOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgaWJzc2F0aW13aW5kb3c7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjZnBvbGxhYmxlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgY2Zwb2xscmVxOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcHJpdmFjeTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNhcGluZm87Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGUxOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlMjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTM7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGU0OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlNTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTY7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGU3OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlODsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlMTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlMjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlMzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlNDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlNTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlNjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlNzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHN1cHByYXRlODsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYnNzdHlwZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmVhY29ucGVyaW9kOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBkdGltcGVyaW9kOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiB0aW1lc3RhbXA7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGxvY2FsdGltZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZmhkd2VsbHRpbWU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGZoaG9wc2V0OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBmaGhvcHBhdHRlcm47CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGZoaG9waW5kZXg7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGRzY2hhbm5lbDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2ZwY291bnQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcHBlcmlvZDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2ZwbWF4ZHVyYXRpb247CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcGR1cnJlbWFpbmluZzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgaWJzc2F0aW13aW5kb3c7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcG9sbGFibGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcG9sbHJlcTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcHJpdmFjeTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2FwaW5mbzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlMTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlMjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlMzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlNzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmFzaWNyYXRlODsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc3VwcHJhdGUxOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBzdXBwcmF0ZTI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHN1cHByYXRlMzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc3VwcHJhdGU0OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBzdXBwcmF0ZTU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHN1cHByYXRlNjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc3VwcHJhdGU3OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBzdXBwcmF0ZTg7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3N0YXJ0IHsKIAl1MzIgbXNnY29kZTsKIAl1MzIgbXNnbGVuOwogCXU4IGRldm5hbWVbV0xBTl9ERVZOQU1FTEVOX01BWF07Ci0JcDgwMjExaXRlbV9wc3RyMzJfdCBzc2lkOworCXN0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiBzc2lkOwogCXU4IHBhZF8xMkRbM107Ci0JcDgwMjExaXRlbV91aW50MzJfdCBic3N0eXBlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmVhY29ucGVyaW9kOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZHRpbXBlcmlvZDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcHBlcmlvZDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcG1heGR1cmF0aW9uOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZmhkd2VsbHRpbWU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBmaGhvcHNldDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGZoaG9wcGF0dGVybjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGRzY2hhbm5lbDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGlic3NhdGltd2luZG93OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcHJvYmVkZWxheTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNmcG9sbGFibGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBjZnBvbGxyZXE7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGUxOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlMjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTM7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGU0OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlNTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGJhc2ljcmF0ZTY7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBiYXNpY3JhdGU3OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYmFzaWNyYXRlODsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG9wZXJhdGlvbmFscmF0ZTE7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBvcGVyYXRpb25hbHJhdGUyOwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgb3BlcmF0aW9uYWxyYXRlMzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG9wZXJhdGlvbmFscmF0ZTQ7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBvcGVyYXRpb25hbHJhdGU1OwotCXA4MDIxMWl0ZW1fdWludDMyX3Qgb3BlcmF0aW9uYWxyYXRlNjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG9wZXJhdGlvbmFscmF0ZTc7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBvcGVyYXRpb25hbHJhdGU4OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYnNzdHlwZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYmVhY29ucGVyaW9kOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBkdGltcGVyaW9kOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBjZnBwZXJpb2Q7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGNmcG1heGR1cmF0aW9uOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBmaGR3ZWxsdGltZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZmhob3BzZXQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGZoaG9wcGF0dGVybjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZHNjaGFubmVsOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBpYnNzYXRpbXdpbmRvdzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcHJvYmVkZWxheTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2Zwb2xsYWJsZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2Zwb2xscmVxOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGUxOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGUyOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGUzOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGU0OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGU1OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGU2OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGU3OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBiYXNpY3JhdGU4OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGUxOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGUyOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGUzOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGU0OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGU1OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGU2OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGU3OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBvcGVyYXRpb25hbHJhdGU4OworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZSB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgaWZzdGF0ZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGlmc3RhdGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV93bGFuc25pZmYgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGVuYWJsZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGNoYW5uZWw7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBwcmlzbWhlYWRlcjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHdsYW5oZWFkZXI7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBrZWVwd2VwZmxhZ3M7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBzdHJpcGZjczsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHBhY2tldF90cnVuYzsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGVuYWJsZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgY2hhbm5lbDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcHJpc21oZWFkZXI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHdsYW5oZWFkZXI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGtlZXB3ZXBmbGFnczsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgc3RyaXBmY3M7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHBhY2tldF90cnVuYzsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2hvc3R3ZXAgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBkZWNyeXB0OwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZW5jcnlwdDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZGVjcnlwdDsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZW5jcnlwdDsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2NvbW1zcXVhbGl0eSB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGRibTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGxpbms7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBsZXZlbDsKLQlwODAyMTFpdGVtX3VpbnQzMl90IG5vaXNlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgdHhyYXRlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBkYm07CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGxpbms7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGxldmVsOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiBub2lzZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgdHhyYXRlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfYXV0b2pvaW4gewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3BzdHIzMl90IHNzaWQ7CisJc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjMyIHNzaWQ7CiAJdTggcGFkXzE5RFszXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGF1dGh0eXBlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYXV0aHR5cGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JlYWRwZGEgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VuazEwMjRfdCBwZGE7Ci0JcDgwMjExaXRlbV91aW50MzJfdCByZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VuazEwMjQgcGRhOworCXN0cnVjdCBwODAyMTFpdGVtX3VpbnQzMiByZXN1bHRjb2RlOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yYW1kbF9zdGF0ZSB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZW5hYmxlOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgZXhlYWRkcjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGVuYWJsZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgZXhlYWRkcjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfd3JpdGUgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGFkZHI7Ci0JcDgwMjExaXRlbV91aW50MzJfdCBsZW47Ci0JcDgwMjExaXRlbV91bms0MDk2X3QgZGF0YTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGFkZHI7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGxlbjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91bms0MDk2IGRhdGE7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHJlc3VsdGNvZGU7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX2ZsYXNoZGxfc3RhdGUgewogCXUzMiBtc2djb2RlOwogCXUzMiBtc2dsZW47CiAJdTggZGV2bmFtZVtXTEFOX0RFVk5BTUVMRU5fTUFYXTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGVuYWJsZTsKLQlwODAyMTFpdGVtX3VpbnQzMl90IHJlc3VsdGNvZGU7CisJc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIGVuYWJsZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF93cml0ZSB7CiAJdTMyIG1zZ2NvZGU7CiAJdTMyIG1zZ2xlbjsKIAl1OCBkZXZuYW1lW1dMQU5fREVWTkFNRUxFTl9NQVhdOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgYWRkcjsKLQlwODAyMTFpdGVtX3VpbnQzMl90IGxlbjsKLQlwODAyMTFpdGVtX3VuazQwOTZfdCBkYXRhOwotCXA4MDIxMWl0ZW1fdWludDMyX3QgcmVzdWx0Y29kZTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgYWRkcjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgbGVuOworCXN0cnVjdCBwODAyMTFpdGVtX3VuazQwOTYgZGF0YTsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgcmVzdWx0Y29kZTsKIH0gX19wYWNrZWQ7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYwppbmRleCA5MGNjOGNkLi44MjVhNjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuYwpAQCAtOTEsMTcgKzkxLDE3IEBACiAjaW5jbHVkZSAiY2ZnODAyMTEuYyIKIAogLyogbmV0ZGV2aWNlIG1ldGhvZCBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9pbml0KG5ldGRldmljZV90ICpuZXRkZXYpOwotc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X29wZW4obmV0ZGV2aWNlX3QgKm5ldGRldik7Ci1zdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfc3RvcChuZXRkZXZpY2VfdCAqbmV0ZGV2KTsKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJIG5ldGRldmljZV90ICpuZXRkZXYpOwotc3RhdGljIHZvaWQgcDgwMjExa25ldGRldl9zZXRfbXVsdGljYXN0X2xpc3QobmV0ZGV2aWNlX3QgKmRldik7Ci1zdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfZG9faW9jdGwobmV0ZGV2aWNlX3QgKmRldiwgc3RydWN0IGlmcmVxICppZnIsCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X2RvX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAogCQkJCSAgaW50IGNtZCk7Ci1zdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfc2V0X21hY19hZGRyZXNzKG5ldGRldmljZV90ICpkZXYsIHZvaWQgKmFkZHIpOwotc3RhdGljIHZvaWQgcDgwMjExa25ldGRldl90eF90aW1lb3V0KG5ldGRldmljZV90ICpuZXRkZXYpOwotc3RhdGljIGludCBwODAyMTFfcnhfdHlwZWRyb3Aod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgZmMpOworc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKTsKK3N0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKK3N0YXRpYyBpbnQgcDgwMjExX3J4X3R5cGVkcm9wKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1MTYgZmMpOwogCiBpbnQgd2xhbl93YXRjaGRvZyA9IDUwMDA7CiBtb2R1bGVfcGFyYW0od2xhbl93YXRjaGRvZywgaW50LCAwNjQ0KTsKQEAgLTEyMyw3ICsxMjMsNyBAQAogKiBSZXR1cm5zOgogKglub3RoaW5nCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9pbml0KG5ldGRldmljZV90ICpuZXRkZXYpCitzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCS8qIENhbGxlZCBpbiByZXNwb25zZSB0byByZWdpc3Rlcl9uZXRkZXYgKi8KIAkvKiBUaGlzIGlzIHVzdWFsbHkgdGhlIHByb2JlIGZ1bmN0aW9uLCBidXQgdGhlIHByb2JlIGhhcyAqLwpAQCAtMTQ2LDEwICsxNDYsMTAgQEAKICogUmV0dXJuczoKICoJemVybyBvbiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X29wZW4obmV0ZGV2aWNlX3QgKm5ldGRldikKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7CQkvKiBzdWNjZXNzICovCi0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OwogCiAJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBNU0QgaXMgcnVubmluZyAqLwogCWlmICh3bGFuZGV2LT5tc2RzdGF0ZSAhPSBXTEFOX01TRF9SVU5OSU5HKQpAQCAtMTgxLDEwICsxODEsMTAgQEAKICogUmV0dXJuczoKICoJemVybyBvbiBzdWNjZXNzLCBub24temVybyBvdGhlcndpc2UKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBwODAyMTFrbmV0ZGV2X3N0b3AobmV0ZGV2aWNlX3QgKm5ldGRldikKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gbmV0ZGV2LT5tbF9wcml2OwogCiAJaWYgKHdsYW5kZXYtPmNsb3NlKQogCQlyZXN1bHQgPSB3bGFuZGV2LT5jbG9zZSh3bGFuZGV2KTsKQEAgLTIwOCw3ICsyMDgsNyBAQAogKiBTaWRlIGVmZmVjdHM6CiAqCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcDgwMjExbmV0ZGV2X3J4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3ZvaWQgcDgwMjExbmV0ZGV2X3J4KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCS8qIEVucXVldWUgZm9yIHBvc3QtaXJxIHByb2Nlc3NpbmcgKi8KIAlza2JfcXVldWVfdGFpbCgmd2xhbmRldi0+bnNkX3J4cSwgc2tiKTsKQEAgLTIyNywxMSArMjI3LDExIEBACiAgKgkgICAgQ09OVl9UT19FVEhFUl9GQUlMRUQgaWYgY29udmVyc2lvbiBmYWlsZWQKICAqCSAgICBDT05WX1RPX0VUSEVSX1NLSVBQRUQgaWYgZnJhbWUgaXMgaWdub3JlZAogICovCi1zdGF0aWMgaW50IHA4MDIxMV9jb252ZXJ0X3RvX2V0aGVyKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgcDgwMjExX2NvbnZlcnRfdG9fZXRoZXIoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHA4MDIxMV9oZHJfYTMgKmhkcjsKIAotCWhkciA9IChzdHJ1Y3QgcDgwMjExX2hkcl9hMyAqKSBza2ItPmRhdGE7CisJaGRyID0gKHN0cnVjdCBwODAyMTFfaGRyX2EzICopc2tiLT5kYXRhOwogCWlmIChwODAyMTFfcnhfdHlwZWRyb3Aod2xhbmRldiwgaGRyLT5mYykpCiAJCXJldHVybiBDT05WX1RPX0VUSEVSX1NLSVBQRUQ7CiAKQEAgLTI2NSw5ICsyNjUsOSBAQAogICovCiBzdGF0aWMgdm9pZCBwODAyMTFuZXRkZXZfcnhfYmgodW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKSBhcmc7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSAoc3RydWN0IHdsYW5kZXZpY2UgKilhcmc7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7Ci0JbmV0ZGV2aWNlX3QgKmRldiA9IHdsYW5kZXYtPm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gd2xhbmRldi0+bmV0ZGV2OwogCiAJLyogTGV0J3MgZW1wdHkgb3VyIG91ciBxdWV1ZSAqLwogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJndsYW5kZXYtPm5zZF9yeHEpKSkgewpAQCAtMzE4LDExICszMTgsMTEgQEAKICoJemVybyBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgaW50IHA4MDIxMWtuZXRkZXZfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSBuZXRkZXZpY2VfdCAqbmV0ZGV2KQorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlpbnQgdHhyZXN1bHQgPSAtMTsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBuZXRkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBuZXRkZXYtPm1sX3ByaXY7CiAJdW5pb24gcDgwMjExX2hkciBwODAyMTFfaGRyOwogCXN0cnVjdCBwODAyMTFfbWV0YXdlcCBwODAyMTFfd2VwOwogCkBAIC00NDYsOSArNDQ2LDkgQEAKICogUmV0dXJuczoKICoJbm90aGluZwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBwODAyMTFrbmV0ZGV2X3NldF9tdWx0aWNhc3RfbGlzdChuZXRkZXZpY2VfdCAqZGV2KQorc3RhdGljIHZvaWQgcDgwMjExa25ldGRldl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBkZXYtPm1sX3ByaXY7CiAKIAkvKiBUT0RPOiAgcmVhbCBtdWx0aWNhc3Qgc3VwcG9ydCBhcyB3ZWxsICovCiAKQEAgLTQ1OSw3ICs0NTksNyBAQAogCiAjaWZkZWYgU0lPQ0VUSFRPT0wKIAotc3RhdGljIGludCBwODAyMTFuZXRkZXZfZXRodG9vbCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKK3N0YXRpYyBpbnQgcDgwMjExbmV0ZGV2X2V0aHRvb2woc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgX191c2VyICp1c2VyYWRkcikKIHsKIAl1MzIgZXRoY21kOwogCXN0cnVjdCBldGh0b29sX2RydmluZm8gaW5mbzsKQEAgLTUzMSwxMSArNTMxLDExIEBACiAqCVByb2Nlc3MgdGhyZWFkIChpb2N0bCBjYWxsZXIpLiAgVE9ETzogU01QIHN1cHBvcnQgbWF5IHJlcXVpcmUKICoJbG9ja3MuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9kb19pb2N0bChuZXRkZXZpY2VfdCAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9kb19pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgcDgwMjExaW9jdGxfcmVxICpyZXEgPSAoc3RydWN0IHA4MDIxMWlvY3RsX3JlcSAqKSBpZnI7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OworCXN0cnVjdCBwODAyMTFpb2N0bF9yZXEgKnJlcSA9IChzdHJ1Y3QgcDgwMjExaW9jdGxfcmVxICopaWZyOworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gZGV2LT5tbF9wcml2OwogCXU4ICptc2didWY7CiAKIAluZXRkZXZfZGJnKGRldiwgInJ4J2QgaW9jdGwsIGNtZD0lZCwgbGVuPSVkXG4iLCBjbWQsIHJlcS0+bGVuKTsKQEAgLTYxMCwxMyArNjEwLDEzIEBACiAqCiAqIGJ5OiBDb2xsaW4gUi4gTXVsbGluZXIgPGNvbGxpbkBtdWxsaW5lci5vcmc+CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcDgwMjExa25ldGRldl9zZXRfbWFjX2FkZHJlc3MobmV0ZGV2aWNlX3QgKmRldiwgdm9pZCAqYWRkcikKK3N0YXRpYyBpbnQgcDgwMjExa25ldGRldl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKIHsKIAlzdHJ1Y3Qgc29ja2FkZHIgKm5ld19hZGRyID0gYWRkcjsKIAlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCBkb3QxMXJlcTsKLQlwODAyMTFpdGVtX3VuazM5Ml90ICptaWJhdHRyOwotCXA4MDIxMWl0ZW1fcHN0cjZfdCAqbWFjYWRkcjsKLQlwODAyMTFpdGVtX3VpbnQzMl90ICpyZXN1bHRjb2RlOworCXN0cnVjdCBwODAyMTFpdGVtX3VuazM5MiAqbWliYXR0cjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiAqbWFjYWRkcjsKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgKnJlc3VsdGNvZGU7CiAJaW50IHJlc3VsdDsKIAogCS8qIElmIHdlJ3JlIHJ1bm5pbmcsIHdlIGRvbid0IGFsbG93IE1BQyBhZGRyZXNzIGNoYW5nZXMgKi8KQEAgLTYyNSw3ICs2MjUsNyBAQAogCiAJLyogU2V0IHVwIHNvbWUgY29udmVuaWVuY2UgcG9pbnRlcnMuICovCiAJbWliYXR0ciA9ICZkb3QxMXJlcS5taWJhdHRyaWJ1dGU7Ci0JbWFjYWRkciA9IChwODAyMTFpdGVtX3BzdHI2X3QgKikgJm1pYmF0dHItPmRhdGE7CisJbWFjYWRkciA9IChzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiAqKSZtaWJhdHRyLT5kYXRhOwogCXJlc3VsdGNvZGUgPSAmZG90MTFyZXEucmVzdWx0Y29kZTsKIAogCS8qIFNldCB1cCBhIGRvdDExcmVxX21pYnNldCAqLwpAQCAtNjMzLDcgKzYzMyw3IEBACiAJZG90MTFyZXEubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJzZXQ7CiAJZG90MTFyZXEubXNnbGVuID0gc2l6ZW9mKHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0KTsKIAltZW1jcHkoZG90MTFyZXEuZGV2bmFtZSwKLQkgICAgICAgKCh3bGFuZGV2aWNlX3QgKikgZGV2LT5tbF9wcml2KS0+bmFtZSwgV0xBTl9ERVZOQU1FTEVOX01BWCAtIDEpOworCSAgICAgICAoKHN0cnVjdCB3bGFuZGV2aWNlICopZGV2LT5tbF9wcml2KS0+bmFtZSwgV0xBTl9ERVZOQU1FTEVOX01BWCAtIDEpOwogCiAJLyogU2V0IHVwIHRoZSBtaWJhdHRyaWJ1dGUgYXJndW1lbnQgKi8KIAltaWJhdHRyLT5kaWQgPSBESURtc2dfZG90MTFyZXFfbWlic2V0X21pYmF0dHJpYnV0ZTsKQEAgLTY1Myw3ICs2NTMsNyBAQAogCXJlc3VsdGNvZGUtPmRhdGEgPSAwOwogCiAJLyogbm93IGZpcmUgdGhlIHJlcXVlc3QgKi8KLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KGRldi0+bWxfcHJpdiwgKHU4ICopICZkb3QxMXJlcSk7CisJcmVzdWx0ID0gcDgwMjExcmVxX2RvcmVxdWVzdChkZXYtPm1sX3ByaXYsICh1OCAqKSZkb3QxMXJlcSk7CiAKIAkvKiBJZiB0aGUgcmVxdWVzdCB3YXNuJ3Qgc3VjY2Vzc2Z1bCwgcmVwb3J0IGFuIGVycm9yIGFuZCBkb24ndAogCSAqIGNoYW5nZSB0aGUgbmV0ZGV2IGFkZHJlc3MKQEAgLTY2OSw3ICs2NjksNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgd2xhbl9jaGFuZ2VfbXR1KG5ldGRldmljZV90ICpkZXYsIGludCBuZXdfbXR1KQorc3RhdGljIGludCB3bGFuX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpCiB7CiAJLyogMjMxMiBpcyBtYXggODAyLjExIHBheWxvYWQsIDIwIGlzIG92ZXJoZWFkLCAoZXRoZXIgKyBsbGMgK3NuYXApCiAJICAgYW5kIGFub3RoZXIgOCBmb3Igd2VwLiAqLwpAQCAtNzE3LDEwICs3MTcsMTAgQEAKICoJY29tcGlsZWQgZHJpdmVycywgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBpbiB0aGUKICoJY29udGV4dCBvZiB0aGUga2VybmVsIHN0YXJ0dXAgY29kZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHdsYW5fc2V0dXAod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3QgZGV2aWNlICpwaHlzZGV2KQoraW50IHdsYW5fc2V0dXAoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBkZXZpY2UgKnBoeXNkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JbmV0ZGV2aWNlX3QgKm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCB3aXBoeSAqd2lwaHk7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKIApAQCAtNzgzLDcgKzc4Myw3IEBACiAqCWNvbXBpbGVkIGRyaXZlcnMsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgaW4gdGhlCiAqCWNvbnRleHQgb2YgdGhlIGtlcm5lbCBzdGFydHVwIGNvZGUuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgd2xhbl91bnNldHVwKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3ZvaWQgd2xhbl91bnNldHVwKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CiAKQEAgLTgxNyw3ICs4MTcsNyBAQAogKiBDYWxsIENvbnRleHQ6CiAqCUNhbiBiZSBlaXRoZXIgaW50ZXJydXB0IG9yIG5vdC4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHJlZ2lzdGVyX3dsYW5kZXYod2xhbmRldmljZV90ICp3bGFuZGV2KQoraW50IHJlZ2lzdGVyX3dsYW5kZXYoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJcmV0dXJuIHJlZ2lzdGVyX25ldGRldih3bGFuZGV2LT5uZXRkZXYpOwogfQpAQCAtODM5LDcgKzgzOSw3IEBACiAqIENhbGwgQ29udGV4dDoKICoJQ2FuIGJlIGVpdGhlciBpbnRlcnJ1cHQgb3Igbm90LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgdW5yZWdpc3Rlcl93bGFuZGV2KHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK2ludCB1bnJlZ2lzdGVyX3dsYW5kZXYoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIApAQCAtODgyLDcgKzg4Miw3IEBACiAqIENhbGwgY29udGV4dDoKICoJVXN1YWxseSBpbnRlcnJ1cHQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCit2b2lkIHA4MDIxMW5ldGRldl9od3JlbW92ZWQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJd2xhbmRldi0+aHdyZW1vdmVkID0gMTsKIAlpZiAod2xhbmRldi0+c3RhdGUgPT0gV0xBTl9ERVZJQ0VfT1BFTikKQEAgLTkxMiw3ICs5MTIsNyBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHA4MDIxMV9yeF90eXBlZHJvcCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBmYykKK3N0YXRpYyBpbnQgcDgwMjExX3J4X3R5cGVkcm9wKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1MTYgZmMpCiB7CiAJdTE2IGZ0eXBlOwogCXUxNiBmc3R5cGU7CkBAIC0xMDcxLDkgKzEwNzEsOSBAQAogCXJldHVybiBkcm9wOwogfQogCi1zdGF0aWMgdm9pZCBwODAyMTFrbmV0ZGV2X3R4X3RpbWVvdXQobmV0ZGV2aWNlX3QgKm5ldGRldikKK3N0YXRpYyB2b2lkIHA4MDIxMWtuZXRkZXZfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IG5ldGRldi0+bWxfcHJpdjsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IG5ldGRldi0+bWxfcHJpdjsKIAogCWlmICh3bGFuZGV2LT50eF90aW1lb3V0KSB7CiAJCXdsYW5kZXYtPnR4X3RpbWVvdXQod2xhbmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFuZXRkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCmluZGV4IDgyMGEwZTIuLjFlNmE3NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMW5ldGRldi5oCkBAIC01Nyw5ICs1Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KIAotI3VuZGVmIG5ldGRldmljZV90Ci10eXBlZGVmIHN0cnVjdCBuZXRfZGV2aWNlIG5ldGRldmljZV90OwotCiAjZGVmaW5lIFdMQU5fUkVMRUFTRQkiMC4zLjAtc3RhZ2luZyIKIAogI2RlZmluZSBXTEFOX0RFVklDRV9DTE9TRUQJMApAQCAtMTAxLDcgKzk4LDcgQEAKICNkZWZpbmUgUDgwMjExX05TRENBUF9OT1NDQU4gICAgICAgICAgICAgICAgMHgyMDAgLyogbnNkIGNhbiBzY2FuICovCiAKIC8qIFJlY2VpdmVkIGZyYW1lIHN0YXRpc3RpY3MgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMV9mcm1yeF90IHsKK3N0cnVjdCBwODAyMTFfZnJtcnggewogCXUzMiBtZ210OwogCXUzMiBhc3NvY3JlcTsKIAl1MzIgYXNzb2NyZXNwOwpAQCAtMTM1LDEwICsxMzIsMTAgQEAKIAl1MzIgZGF0YV91bmtub3duOwogCXUzMiBkZWNyeXB0OwogCXUzMiBkZWNyeXB0X2VycjsKLX0gcDgwMjExX2ZybXJ4X3Q7Cit9OwogCiAvKiBjYWxsZWQgYnkgL3Byb2MvbmV0L3dpcmVsZXNzICovCi1zdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcDgwMjExd2V4dF9nZXRfd2lyZWxlc3Nfc3RhdHMobmV0ZGV2aWNlX3QgKmRldik7CitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcDgwMjExd2V4dF9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAvKiB3aXJlbGVzcyBleHRlbnNpb25zJyBpb2N0bHMgKi8KIGV4dGVybiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcDgwMjExd2V4dF9oYW5kbGVyX2RlZjsKIApAQCAtMTU3LDcgKzE1NCw3IEBACiBleHRlcm4gaW50IHdsYW5fd2V4dF93cml0ZTsKIAogLyogV0xBTiBkZXZpY2UgdHlwZSAqLwotdHlwZWRlZiBzdHJ1Y3Qgd2xhbmRldmljZSB7CitzdHJ1Y3Qgd2xhbmRldmljZSB7CiAJdm9pZCAqcHJpdjsJCS8qIHByaXZhdGUgZGF0YSBmb3IgTVNEICovCiAKIAkvKiBTdWJzeXN0ZW0gU3RhdGUgKi8KQEAgLTE4NiwxMiArMTgzLDEyIEBACiAJCQlzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgKnA4MDIxMV93ZXApOwogCWludCAoKm1sbWVyZXF1ZXN0KShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKTsKIAlpbnQgKCpzZXRfbXVsdGljYXN0X2xpc3QpKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAotCQkJCSAgIG5ldGRldmljZV90ICpkZXYpOworCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCXZvaWQgKCp0eF90aW1lb3V0KShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CiAKIAkvKiA4MDIuMTEgU3RhdGUgKi8KIAl1OCBic3NpZFtXTEFOX0JTU0lEX0xFTl07Ci0JcDgwMjExcHN0cjMyX3Qgc3NpZDsKKwlzdHJ1Y3QgcDgwMjExcHN0cjMyIHNzaWQ7CiAJdTMyIG1hY21vZGU7CiAJaW50IGxpbmtzdGF0dXM7CiAKQEAgLTIwNiw3ICsyMDMsNyBAQAogCS8qIG5ldGxpbmsgc29ja2V0ICovCiAJLyogcXVldWUgZm9yIGluZGljYXRpb25zIHdhaXRpbmcgZm9yIGNtZCBjb21wbGV0aW9uICovCiAJLyogTGludXggbmV0ZGV2aWNlIGFuZCBzdXBwb3J0ICovCi0JbmV0ZGV2aWNlX3QgKm5ldGRldjsJLyogcHRyIHRvIGxpbnV4IG5ldGRldmljZSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CS8qIHB0ciB0byBsaW51eCBuZXRkZXZpY2UgKi8KIAogCS8qIFJ4IGJvdHRvbSBoYWxmICovCiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IHJ4X2JoOwpAQCAtMjE0LDcgKzIxMSw3IEBACiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBuc2RfcnhxOwogCiAJLyogODAyLjExIGRldmljZSBzdGF0aXN0aWNzICovCi0Jc3RydWN0IHA4MDIxMV9mcm1yeF90IHJ4OworCXN0cnVjdCBwODAyMTFfZnJtcnggcng7CiAKIAlzdHJ1Y3QgaXdfc3RhdGlzdGljcyB3c3RhdHM7CiAKQEAgLTIyMiwxOSArMjE5LDE5IEBACiAJdTggc3B5X251bWJlcjsKIAljaGFyIHNweV9hZGRyZXNzW0lXX01BWF9TUFldW0VUSF9BTEVOXTsKIAlzdHJ1Y3QgaXdfcXVhbGl0eSBzcHlfc3RhdFtJV19NQVhfU1BZXTsKLX0gd2xhbmRldmljZV90OworfTsKIAogLyogV0VQIHN0dWZmICovCi1pbnQgd2VwX2NoYW5nZV9rZXkod2xhbmRldmljZV90ICp3bGFuZGV2LCBpbnQga2V5bnVtLCB1OCAqa2V5LCBpbnQga2V5bGVuKTsKLWludCB3ZXBfZGVjcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICpidWYsIHUzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsCitpbnQgd2VwX2NoYW5nZV9rZXkoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIGludCBrZXludW0sIHU4ICprZXksIGludCBrZXlsZW4pOworaW50IHdlcF9kZWNyeXB0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1OCAqYnVmLCB1MzIgbGVuLCBpbnQga2V5X292ZXJyaWRlLAogCQl1OCAqaXYsIHU4ICppY3YpOwotaW50IHdlcF9lbmNyeXB0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKmJ1ZiwgdTggKmRzdCwgdTMyIGxlbiwgaW50IGtleW51bSwKLQkJdTggKml2LCB1OCAqaWN2KTsKK2ludCB3ZXBfZW5jcnlwdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTggKmJ1ZiwgdTggKmRzdCwgdTMyIGxlbiwKKwkJaW50IGtleW51bSwgdTggKml2LCB1OCAqaWN2KTsKIAotaW50IHdsYW5fc2V0dXAod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3QgZGV2aWNlICpwaHlzZGV2KTsKLXZvaWQgd2xhbl91bnNldHVwKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci1pbnQgcmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotaW50IHVucmVnaXN0ZXJfd2xhbmRldih3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotdm9pZCBwODAyMTFuZXRkZXZfcngod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXZvaWQgcDgwMjExbmV0ZGV2X2h3cmVtb3ZlZCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOworaW50IHdsYW5fc2V0dXAoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBkZXZpY2UgKnBoeXNkZXYpOwordm9pZCB3bGFuX3Vuc2V0dXAoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOworaW50IHJlZ2lzdGVyX3dsYW5kZXYoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOworaW50IHVucmVnaXN0ZXJfd2xhbmRldihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7Cit2b2lkIHA4MDIxMW5ldGRldl9yeChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit2b2lkIHA4MDIxMW5ldGRldl9od3JlbW92ZWQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXJlcS5jCmluZGV4IDRiODRiNTYuLmQ0M2U4NWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuYwpAQCAtNzIsMTEgKzcyLDI2IEBACiAjaW5jbHVkZSAicDgwMjExbWV0YXN0cnVjdC5oIgogI2luY2x1ZGUgInA4MDIxMXJlcS5oIgogCi1zdGF0aWMgdm9pZCBwODAyMTFyZXFfaGFuZGxlbXNnKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKTsKLXN0YXRpYyB2b2lkIHA4MDIxMXJlcV9taWJzZXRfbWliZ2V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKK3N0YXRpYyB2b2lkIHA4MDIxMXJlcV9oYW5kbGVtc2coc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZyk7CitzdGF0aWMgdm9pZCBwODAyMTFyZXFfbWlic2V0X21pYmdldChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKIAkJCQkgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldCAqbWliX21zZywKIAkJCQkgICBpbnQgaXNnZXQpOwogCitzdGF0aWMgdm9pZCBwODAyMTFyZXFfaGFuZGxlX2FjdGlvbihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyICpkYXRhLAorCQkJCSAgICBpbnQgaXNnZXQsIHUzMiBmbGFnKQoreworCWlmIChpc2dldCkgeworCQlpZiAod2xhbmRldi0+aG9zdHdlcCAmIGZsYWcpCisJCQkqZGF0YSA9IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZTsKKwkJZWxzZQorCQkJKmRhdGEgPSBQODAyMTFFTlVNX3RydXRoX2ZhbHNlOworCX0gZWxzZSB7CisJCXdsYW5kZXYtPmhvc3R3ZXAgJj0gfmZsYWc7CisJCWlmICgqZGF0YSA9PSBQODAyMTFFTlVNX3RydXRoX3RydWUpCisJCQl3bGFuZGV2LT5ob3N0d2VwIHw9IGZsYWc7CisJfQorfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogcDgwMjExcmVxX2RvcmVxdWVzdAogKgpAQCAtOTMsOSArMTA4LDkgQEAKICoJUG90ZW50aWFsbHkgYmxvY2tzIHRoZSBjYWxsZXIsIHNvIGl0J3MgYSBnb29kIGlkZWEgdG8KICoJbm90IGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGFuIGludGVycnVwdCBjb250ZXh0LgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcDgwMjExcmVxX2RvcmVxdWVzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICptc2didWYpCitpbnQgcDgwMjExcmVxX2RvcmVxdWVzdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTggKm1zZ2J1ZikKIHsKLQlzdHJ1Y3QgcDgwMjExbXNnICptc2cgPSAoc3RydWN0IHA4MDIxMW1zZyAqKSBtc2didWY7CisJc3RydWN0IHA4MDIxMW1zZyAqbXNnID0gKHN0cnVjdCBwODAyMTFtc2cgKiltc2didWY7CiAKIAkvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIE1TRCBpcyBydW5uaW5nICovCiAJaWYgKCEoKHdsYW5kZXYtPm1zZHN0YXRlID09IFdMQU5fTVNEX0hXUFJFU0VOVCAmJgpAQCAtMTQ5LDEzICsxNjQsMTMgQEAKICogQ2FsbCBjb250ZXh0OgogKglQcm9jZXNzIHRocmVhZAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBwODAyMTFyZXFfaGFuZGxlbXNnKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKQorc3RhdGljIHZvaWQgcDgwMjExcmVxX2hhbmRsZW1zZyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKQogewogCXN3aXRjaCAobXNnLT5tc2djb2RlKSB7CiAKIAljYXNlIERJRG1zZ19sbnhyZXFfaG9zdHdlcDp7CiAJCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2hvc3R3ZXAgKnJlcSA9Ci0JCQkoc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaG9zdHdlcCAqKSBtc2c7CisJCQkoc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaG9zdHdlcCAqKW1zZzsKIAkJd2xhbmRldi0+aG9zdHdlcCAmPQogCQkJCX4oSE9TVFdFUF9ERUNSWVBUIHwgSE9TVFdFUF9FTkNSWVBUKTsKIAkJaWYgKHJlcS0+ZGVjcnlwdC5kYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkKQEAgLTE2OSw0NCArMTg0LDM0IEBACiAJY2FzZSBESURtc2dfZG90MTFyZXFfbWlic2V0OnsKIAkJaW50IGlzZ2V0ID0gKG1zZy0+bXNnY29kZSA9PSBESURtc2dfZG90MTFyZXFfbWliZ2V0KTsKIAkJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQgKm1pYl9tc2cgPQotCQkJKHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0ICopIG1zZzsKKwkJCShzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldCAqKW1zZzsKIAkJcDgwMjExcmVxX21pYnNldF9taWJnZXQod2xhbmRldiwgbWliX21zZywgaXNnZXQpOwogCWJyZWFrOwogCX0KIAl9CQkJLyogc3dpdGNoIG1zZy0+bXNnY29kZSAqLwogfQogCi1zdGF0aWMgdm9pZCBwODAyMTFyZXFfbWlic2V0X21pYmdldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCitzdGF0aWMgdm9pZCBwODAyMTFyZXFfbWlic2V0X21pYmdldChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKIAkJCQkgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYmdldCAqbWliX21zZywKIAkJCQkgICBpbnQgaXNnZXQpCiB7Ci0JcDgwMjExaXRlbWRfdCAqbWliaXRlbSA9IChwODAyMTFpdGVtZF90ICopIG1pYl9tc2ctPm1pYmF0dHJpYnV0ZS5kYXRhOwotCXA4MDIxMXBzdHJkX3QgKnBzdHIgPSAocDgwMjExcHN0cmRfdCAqKSBtaWJpdGVtLT5kYXRhOwotCXU4ICprZXkgPSBtaWJpdGVtLT5kYXRhICsgc2l6ZW9mKHA4MDIxMXBzdHJkX3QpOworCXN0cnVjdCBwODAyMTFpdGVtZCAqbWliaXRlbSA9IChzdHJ1Y3QgcDgwMjExaXRlbWQgKiltaWJfbXNnLT5taWJhdHRyaWJ1dGUuZGF0YTsKKwlzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIgPSAoc3RydWN0IHA4MDIxMXBzdHJkICopbWliaXRlbS0+ZGF0YTsKKwl1OCAqa2V5ID0gbWliaXRlbS0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcDgwMjExcHN0cmQpOwogCiAJc3dpdGNoIChtaWJpdGVtLT5kaWQpIHsKLQljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MDp7CisJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleSgxKToKKwljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KDIpOgorCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoMyk6CisJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleSg0KToKIAkJaWYgKCFpc2dldCkKLQkJCXdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXYsIDAsIGtleSwgcHN0ci0+bGVuKTsKLQlicmVhazsKLQl9Ci0JY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTE6ewotCQlpZiAoIWlzZ2V0KQotCQkJd2VwX2NoYW5nZV9rZXkod2xhbmRldiwgMSwga2V5LCBwc3RyLT5sZW4pOwotCWJyZWFrOwotCX0KLQljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5Mjp7Ci0JCWlmICghaXNnZXQpCi0JCQl3ZXBfY2hhbmdlX2tleSh3bGFuZGV2LCAyLCBrZXksIHBzdHItPmxlbik7Ci0JYnJlYWs7Ci0JfQotCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkzOnsKLQkJaWYgKCFpc2dldCkKLQkJCXdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXYsIDMsIGtleSwgcHN0ci0+bGVuKTsKLQlicmVhazsKLQl9CisJCQl3ZXBfY2hhbmdlX2tleSh3bGFuZGV2LAorCQkJCSAgICAgICBQODAyMTFESURfSVRFTShtaWJpdGVtLT5kaWQpIC0gMSwKKwkJCQkgICAgICAga2V5LCBwc3RyLT5sZW4pOworCQlicmVhazsKKwogCWNhc2UgRElEbWliX2RvdDExc210X2RvdDExUHJpdmFjeVRhYmxlX2RvdDExV0VQRGVmYXVsdEtleUlEOnsKLQkJdTMyICpkYXRhID0gKHUzMiAqKSBtaWJpdGVtLT5kYXRhOworCQl1MzIgKmRhdGEgPSAodTMyICopbWliaXRlbS0+ZGF0YTsKIAogCQlpZiAoaXNnZXQpIHsKIAkJCSpkYXRhID0gd2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfREVGQVVMVEtFWV9NQVNLOwpAQCAtMjE3LDMzICsyMjIsMTcgQEAKIAlicmVhazsKIAl9CiAJY2FzZSBESURtaWJfZG90MTFzbXRfZG90MTFQcml2YWN5VGFibGVfZG90MTFQcml2YWN5SW52b2tlZDp7Ci0JCXUzMiAqZGF0YSA9ICh1MzIgKikgbWliaXRlbS0+ZGF0YTsKKwkJdTMyICpkYXRhID0gKHUzMiAqKW1pYml0ZW0tPmRhdGE7CiAKLQkJaWYgKGlzZ2V0KSB7Ci0JCQlpZiAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQpCi0JCQkJKmRhdGEgPSBQODAyMTFFTlVNX3RydXRoX3RydWU7Ci0JCQllbHNlCi0JCQkJKmRhdGEgPSBQODAyMTFFTlVNX3RydXRoX2ZhbHNlOwotCQl9IGVsc2UgewotCQkJd2xhbmRldi0+aG9zdHdlcCAmPSB+KEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQpOwotCQkJaWYgKCpkYXRhID09IFA4MDIxMUVOVU1fdHJ1dGhfdHJ1ZSkKLQkJCQl3bGFuZGV2LT5ob3N0d2VwIHw9IEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQ7Ci0JCX0KKwkJcDgwMjExcmVxX2hhbmRsZV9hY3Rpb24od2xhbmRldiwgZGF0YSwgaXNnZXQsCisJCQkJCUhPU1RXRVBfUFJJVkFDWUlOVk9LRUQpOwogCWJyZWFrOwogCX0KIAljYXNlIERJRG1pYl9kb3QxMXNtdF9kb3QxMVByaXZhY3lUYWJsZV9kb3QxMUV4Y2x1ZGVVbmVuY3J5cHRlZDp7Ci0JCXUzMiAqZGF0YSA9ICh1MzIgKikgbWliaXRlbS0+ZGF0YTsKKwkJdTMyICpkYXRhID0gKHUzMiAqKW1pYml0ZW0tPmRhdGE7CiAKLQkJaWYgKGlzZ2V0KSB7Ci0JCQlpZiAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfRVhDTFVERVVORU5DUllQVEVEKQotCQkJCSpkYXRhID0gUDgwMjExRU5VTV90cnV0aF90cnVlOwotCQkJZWxzZQotCQkJCSpkYXRhID0gUDgwMjExRU5VTV90cnV0aF9mYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXdsYW5kZXYtPmhvc3R3ZXAgJj0gfihIT1NUV0VQX0VYQ0xVREVVTkVOQ1JZUFRFRCk7Ci0JCQlpZiAoKmRhdGEgPT0gUDgwMjExRU5VTV90cnV0aF90cnVlKQotCQkJCXdsYW5kZXYtPmhvc3R3ZXAgfD0gSE9TVFdFUF9FWENMVURFVU5FTkNSWVBURUQ7Ci0JCX0KKwkJcDgwMjExcmVxX2hhbmRsZV9hY3Rpb24od2xhbmRldiwgZGF0YSwgaXNnZXQsCisJCQkJCUhPU1RXRVBfRVhDTFVERVVORU5DUllQVEVEKTsKIAlicmVhazsKIAl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExcmVxLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuaAppbmRleCBhOTVhNDVhLi44ZDMwNTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTFyZXEuaApAQCAtNDgsNiArNDgsNiBAQAogI2lmbmRlZiBfTElOVVhfUDgwMjExUkVRX0gKICNkZWZpbmUgX0xJTlVYX1A4MDIxMVJFUV9ICiAKLWludCBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTggKm1zZ2J1Zik7CitpbnQgcDgwMjExcmVxX2RvcmVxdWVzdChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTggKm1zZ2J1Zik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3A4MDIxMXR5cGVzLmgKaW5kZXggOGNiNGZjNi4uMjYzZWYyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExdHlwZXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF0eXBlcy5oCkBAIC0xLDU4ICsxLDU5IEBACi0vKiBwODAyMTF0eXBlcy5oCi0qCi0qIE1hY3JvcywgY29uc3RhbnRzLCB0eXBlcywgYW5kIGZ1bmNzIGZvciBwODAyMTEgZGF0YSB0eXBlcwotKgotKiBDb3B5cmlnaHQgKEMpIDE5OTkgQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBsaW51eC13bGFuCi0qCi0qICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMKLSogICBMaWNlbnNlIFZlcnNpb24gMS4xICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZQotKiAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgotKiAgIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBMLwotKgotKiAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUwotKiAgIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSogICBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcKLSogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKiAgIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgbWF5IGJlIHVzZWQgdW5kZXIgdGhlCi0qICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCi0qICAgY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0aGUgR1BMIGFyZSBhcHBsaWNhYmxlIGluc3RlYWQgb2YgdGhlCi0qICAgYWJvdmUuICBJZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGUgdXNlIG9mIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUKLSogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQotKiAgIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbgotKiAgIGJ5IGRlbGV0aW5nIHRoZSBwcm92aXNpb25zIGFib3ZlIGFuZCByZXBsYWNlIHRoZW0gd2l0aCB0aGUgbm90aWNlCi0qICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCi0qICAgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMKLSogICBmaWxlIHVuZGVyIGVpdGhlciB0aGUgTVBMIG9yIHRoZSBHUEwuCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIElucXVpcmllcyByZWdhcmRpbmcgdGhlIGxpbnV4LXdsYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjYW4gYmUKLSogbWFkZSBkaXJlY3RseSB0bzoKLSoKLSogQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zIEluYy4KLSogaW5mb0BsaW51eC13bGFuLmNvbQotKiBodHRwOi8vd3d3LmxpbnV4LXdsYW4uY29tCi0qCi0qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qCi0qIFBvcnRpb25zIG9mIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZnVuZGVkIGJ5Ci0qIEludGVyc2lsIENvcnBvcmF0aW9uIGFzIHBhcnQgb2YgUFJJU00oUikgY2hpcHNldCBwcm9kdWN0IGRldmVsb3BtZW50LgotKgotKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKgotKiBUaGlzIGZpbGUgZGVjbGFyZXMgc29tZSBvZiB0aGUgY29uc3RhbnRzIGFuZCB0eXBlcyB1c2VkIGluIHZhcmlvdXMKLSogcGFydHMgb2YgdGhlIGxpbnV4LXdsYW4gc3lzdGVtLgotKgotKiBOb3RlczoKLSogICAtIENvbnN0YW50IHZhbHVlcyBhcmUgYWx3YXlzIGluIEhPU1QgYnl0ZSBvcmRlci4KLSoKLSogQWxsIGZ1bmN0aW9ucyBhbmQgc3RhdGljcyBkZWNsYXJlZCBoZXJlIGFyZSBpbXBsZW1lbnRlZCBpbiBwODAyMTF0eXBlcy5jCi0qICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCisvKgorICogcDgwMjExdHlwZXMuaAorICoKKyAqIE1hY3JvcywgY29uc3RhbnRzLCB0eXBlcywgYW5kIGZ1bmNzIGZvciBwODAyMTEgZGF0YSB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBBYnNvbHV0ZVZhbHVlIFN5c3RlbXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGxpbnV4LXdsYW4KKyAqCisgKiAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE1vemlsbGEgUHVibGljCisgKiAgIExpY2Vuc2UgVmVyc2lvbiAxLjEgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlCisgKiAgIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogICB0aGUgTGljZW5zZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8KKyAqCisgKiAgIFNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUworICogICBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgKiAgIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZworICogICByaWdodHMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAqICAgdGVybXMgb2YgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIiksIGluIHdoaWNoCisgKiAgIGNhc2UgdGhlIHByb3Zpc2lvbnMgb2YgdGhlIEdQTCBhcmUgYXBwbGljYWJsZSBpbnN0ZWFkIG9mIHRoZQorICogICBhYm92ZS4gIElmIHlvdSB3aXNoIHRvIGFsbG93IHRoZSB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZQorICogICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQorICogICB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVuZGVyIHRoZSBNUEwsIGluZGljYXRlIHlvdXIgZGVjaXNpb24KKyAqICAgYnkgZGVsZXRpbmcgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHRoZSBub3RpY2UKKyAqICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCisgKiAgIHRoZSBwcm92aXNpb25zIGFib3ZlLCBhIHJlY2lwaWVudCBtYXkgdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzCisgKiAgIGZpbGUgdW5kZXIgZWl0aGVyIHRoZSBNUEwgb3IgdGhlIEdQTC4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIElucXVpcmllcyByZWdhcmRpbmcgdGhlIGxpbnV4LXdsYW4gT3BlbiBTb3VyY2UgcHJvamVjdCBjYW4gYmUKKyAqIG1hZGUgZGlyZWN0bHkgdG86CisgKgorICogQWJzb2x1dGVWYWx1ZSBTeXN0ZW1zIEluYy4KKyAqIGluZm9AbGludXgtd2xhbi5jb20KKyAqIGh0dHA6Ly93d3cubGludXgtd2xhbi5jb20KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFBvcnRpb25zIG9mIHRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgZnVuZGVkIGJ5CisgKiBJbnRlcnNpbCBDb3Jwb3JhdGlvbiBhcyBwYXJ0IG9mIFBSSVNNKFIpIGNoaXBzZXQgcHJvZHVjdCBkZXZlbG9wbWVudC4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgZmlsZSBkZWNsYXJlcyBzb21lIG9mIHRoZSBjb25zdGFudHMgYW5kIHR5cGVzIHVzZWQgaW4gdmFyaW91cworICogcGFydHMgb2YgdGhlIGxpbnV4LXdsYW4gc3lzdGVtLgorICoKKyAqIE5vdGVzOgorICogICAtIENvbnN0YW50IHZhbHVlcyBhcmUgYWx3YXlzIGluIEhPU1QgYnl0ZSBvcmRlci4KKyAqCisgKiBBbGwgZnVuY3Rpb25zIGFuZCBzdGF0aWNzIGRlY2xhcmVkIGhlcmUgYXJlIGltcGxlbWVudGVkIGluIHA4MDIxMXR5cGVzLmMKKyAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogCiAjaWZuZGVmIF9QODAyMTFUWVBFU19ICiAjZGVmaW5lIF9QODAyMTFUWVBFU19ICkBAIC0xMjMsMTggKzEyNCwxOCBAQAogI2RlZmluZSBNS0VOVU1OQU1FKG5hbWUpIHA4MDIxMWVudW1fICMjIG5hbWUKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIFRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFuZCBtYWNyb3MgYXJlIHVzZWQgdG8gY29uc3RydWN0IGFuZAotKiBkZWNvbnN0cnVjdCB0aGUgRGF0YSBJRCBjb2Rlcy4gIFRoZSBjb2RpbmcgaXMgYXMgZm9sbG93czoKLSoKLSogICAgIC4uLnJ3dG5ubm5ubm5uaWlpaWlpZ2dnZ2dnc3Nzc3NzICAgICAgcyAtIFNlY3Rpb24KLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyAtIEdyb3VwCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgLSBJdGVtCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gLSBJbmRleAotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0IC0gVGFibGUgZmxhZwotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3IC0gV3JpdGUgZmxhZwotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIC0gUmVhZCBmbGFnCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gLSBVbnVzZWQKLSovCisgKiBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhbmQgbWFjcm9zIGFyZSB1c2VkIHRvIGNvbnN0cnVjdCBhbmQKKyAqIGRlY29uc3RydWN0IHRoZSBEYXRhIElEIGNvZGVzLiAgVGhlIGNvZGluZyBpcyBhcyBmb2xsb3dzOgorICoKKyAqICAgICAuLi5yd3Rubm5ubm5ubmlpaWlpaWdnZ2dnZ3Nzc3NzcyAgICAgIHMgLSBTZWN0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnIC0gR3JvdXAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgLSBJdGVtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIC0gSW5kZXgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgLSBUYWJsZSBmbGFnCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3IC0gV3JpdGUgZmxhZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAtIFJlYWQgZmxhZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAtIFVudXNlZAorICovCiAKICNkZWZpbmUgUDgwMjExRElEX0xTQl9TRUNUSU9OCQkoMCkKICNkZWZpbmUgUDgwMjExRElEX0xTQl9HUk9VUAkJKDYpCkBAIC0yMDAsMTM4ICsyMDEsMTM4IEBACiAvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSB0eXBlcyBhcmUgdXNlZCBmb3IgdGhlIHJlcHJlc2VudGF0aW9uICovCiAvKiAgb2YgRU5VTWludCB0eXBlIG1ldGFkYXRhLiAqLwogCi10eXBlZGVmIHN0cnVjdCBwODAyMTFlbnVtcGFpciB7CitzdHJ1Y3QgcDgwMjExZW51bXBhaXIgewogCXUzMiB2YWw7CiAJY2hhciAqbmFtZTsKLX0gcDgwMjExZW51bXBhaXJfdDsKK307CiAKLXR5cGVkZWYgc3RydWN0IHA4MDIxMWVudW0geworc3RydWN0IHA4MDIxMWVudW0gewogCWludCBuaXRlbXM7Ci0JcDgwMjExZW51bXBhaXJfdCAqbGlzdDsKLX0gcDgwMjExZW51bV90OworCXN0cnVjdCBwODAyMTFlbnVtcGFpciAqbGlzdDsKK307CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSB0eXBlcyBhcmUgdXNlZCB0byBzdG9yZSBkYXRhIGl0ZW1zIGluICovCiAvKiAgbWVzc2FnZXMuICovCiAKIC8qIFRlbXBsYXRlIHBhc2NhbCBzdHJpbmcgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMXBzdHIgeworc3RydWN0IHA4MDIxMXBzdHIgewogCXU4IGxlbjsKLX0gX19wYWNrZWQgcDgwMjExcHN0cl90OworfSBfX3BhY2tlZDsKIAotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cmQgeworc3RydWN0IHA4MDIxMXBzdHJkIHsKIAl1OCBsZW47CiAJdTggZGF0YVswXTsKLX0gX19wYWNrZWQgcDgwMjExcHN0cmRfdDsKK30gX19wYWNrZWQ7CiAKIC8qIE1heGltdW0gcGFzY2FsIHN0cmluZyAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cjI1NSB7CitzdHJ1Y3QgcDgwMjExcHN0cjI1NSB7CiAJdTggbGVuOwogCXU4IGRhdGFbTUFYTEVOX1BTVFIyNTVdOwotfSBfX3BhY2tlZCBwODAyMTFwc3RyMjU1X3Q7Cit9IF9fcGFja2VkOwogCiAvKiBwYXNjYWwgc3RyaW5nIGZvciBtYWNhZGRyZXNzIGFuZCBic3NpZCAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cjYgeworc3RydWN0IHA4MDIxMXBzdHI2IHsKIAl1OCBsZW47CiAJdTggZGF0YVtNQVhMRU5fUFNUUjZdOwotfSBfX3BhY2tlZCBwODAyMTFwc3RyNl90OworfSBfX3BhY2tlZDsKIAogLyogcGFzY2FsIHN0cmluZyBmb3IgY2hhbm5lbCBsaXN0ICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFwc3RyMTQgeworc3RydWN0IHA4MDIxMXBzdHIxNCB7CiAJdTggbGVuOwogCXU4IGRhdGFbTUFYTEVOX1BTVFIxNF07Ci19IF9fcGFja2VkIHA4MDIxMXBzdHIxNF90OworfSBfX3BhY2tlZDsKIAogLyogcGFzY2FsIHN0cmluZyBmb3Igc3NpZCAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExcHN0cjMyIHsKK3N0cnVjdCBwODAyMTFwc3RyMzIgewogCXU4IGxlbjsKIAl1OCBkYXRhW01BWExFTl9QU1RSMzJdOwotfSBfX3BhY2tlZCBwODAyMTFwc3RyMzJfdDsKK30gX19wYWNrZWQ7CiAKIC8qIE1BQyBhZGRyZXNzIGFycmF5ICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFtYWNhcnJheSB7CitzdHJ1Y3QgcDgwMjExbWFjYXJyYXkgewogCXUzMiBjbnQ7CiAJdTggZGF0YVsxXVtNQVhMRU5fUFNUUjZdOwotfSBfX3BhY2tlZCBwODAyMTFtYWNhcnJheV90OworfSBfX3BhY2tlZDsKIAogLyogcHJvdG90eXBlIHRlbXBsYXRlICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtIHsKK3N0cnVjdCBwODAyMTFpdGVtIHsKIAl1MzIgZGlkOwogCXUxNiBzdGF0dXM7CiAJdTE2IGxlbjsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV90OworfSBfX3BhY2tlZDsKIAogLyogcHJvdG90eXBlIHRlbXBsYXRlIHcvIGRhdGEgaXRlbSAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbWQgeworc3RydWN0IHA4MDIxMWl0ZW1kIHsKIAl1MzIgZGlkOwogCXUxNiBzdGF0dXM7CiAJdTE2IGxlbjsKIAl1OCBkYXRhWzBdOwotfSBfX3BhY2tlZCBwODAyMTFpdGVtZF90OworfSBfX3BhY2tlZDsKIAogLyogbWVzc2FnZSBkYXRhIGl0ZW0gZm9yIGludCwgQk9VTkRFRElOVCwgRU5VTUlOVCAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgeworc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyIHsKIAl1MzIgZGlkOwogCXUxNiBzdGF0dXM7CiAJdTE2IGxlbjsKIAl1MzIgZGF0YTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV91aW50MzJfdDsKK30gX19wYWNrZWQ7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBPQ1RFVFNUUiwgRElTUExBWVNUUiAqLwotdHlwZWRlZiBzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiB7CitzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyNiB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47Ci0JcDgwMjExcHN0cjZfdCBkYXRhOwotfSBfX3BhY2tlZCBwODAyMTFpdGVtX3BzdHI2X3Q7CisJc3RydWN0IHA4MDIxMXBzdHI2IGRhdGE7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjE0IHsKK3N0cnVjdCBwODAyMTFpdGVtX3BzdHIxNCB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47Ci0JcDgwMjExcHN0cjE0X3QgZGF0YTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV9wc3RyMTRfdDsKKwlzdHJ1Y3QgcDgwMjExcHN0cjE0IGRhdGE7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjMyIHsKK3N0cnVjdCBwODAyMTFpdGVtX3BzdHIzMiB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47Ci0JcDgwMjExcHN0cjMyX3QgZGF0YTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV9wc3RyMzJfdDsKKwlzdHJ1Y3QgcDgwMjExcHN0cjMyIGRhdGE7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgT0NURVRTVFIsIERJU1BMQVlTVFIgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fcHN0cjI1NSB7CitzdHJ1Y3QgcDgwMjExaXRlbV9wc3RyMjU1IHsKIAl1MzIgZGlkOwogCXUxNiBzdGF0dXM7CiAJdTE2IGxlbjsKLQlwODAyMTFwc3RyMjU1X3QgZGF0YTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV9wc3RyMjU1X3Q7CisJc3RydWN0IHA4MDIxMXBzdHIyNTUgZGF0YTsKK30gX19wYWNrZWQ7CiAKIC8qIG1lc3NhZ2UgZGF0YSBpdGVtIGZvciBVTksgMzkyLCBuYW1lbHkgbWliIGl0ZW1zICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3VuazM5MiB7CitzdHJ1Y3QgcDgwMjExaXRlbV91bmszOTIgewogCXUzMiBkaWQ7CiAJdTE2IHN0YXR1czsKIAl1MTYgbGVuOwogCXU4IGRhdGFbTUFYTEVOX01JQkFUVFJJQlVURV07Ci19IF9fcGFja2VkIHA4MDIxMWl0ZW1fdW5rMzkyX3Q7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgVU5LIDEwMjUsIG5hbWVseSBwMiBwZGFzICovCi10eXBlZGVmIHN0cnVjdCBwODAyMTFpdGVtX3VuazEwMjQgeworc3RydWN0IHA4MDIxMWl0ZW1fdW5rMTAyNCB7CiAJdTMyIGRpZDsKIAl1MTYgc3RhdHVzOwogCXUxNiBsZW47CiAJdTggZGF0YVsxMDI0XTsKLX0gX19wYWNrZWQgcDgwMjExaXRlbV91bmsxMDI0X3Q7Cit9IF9fcGFja2VkOwogCiAvKiBtZXNzYWdlIGRhdGEgaXRlbSBmb3IgVU5LIDQwOTYsIG5hbWVseSBwMiBkb3dubG9hZCBjaHVua3MgKi8KLXR5cGVkZWYgc3RydWN0IHA4MDIxMWl0ZW1fdW5rNDA5NiB7CitzdHJ1Y3QgcDgwMjExaXRlbV91bms0MDk2IHsKIAl1MzIgZGlkOwogCXUxNiBzdGF0dXM7CiAJdTE2IGxlbjsKIAl1OCBkYXRhWzQwOTZdOwotfSBfX3BhY2tlZCBwODAyMTFpdGVtX3VuazQwOTZfdDsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBjYXRsaXN0aXRlbTsKIApAQCAtMzUxLDI1ICszNTIsMjUgQEAKIC8qICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgZXh0ZXJuYWwgZGVjbGFyYXRpb25zICovCiAvKiAgZm9yIGFsbCBlbnVtZXJhdGlvbnMgICovCiAKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRSh0cnV0aCk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUoaWZzdGF0ZSk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUocG93ZXJtZ210KTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShic3N0eXBlKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShhdXRoYWxnKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShwaHl0eXBlKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRSh0ZW1wdHlwZSk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUocmVnZG9tYWluKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShjY2Ftb2RlKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShkaXZlcnNpdHkpOwotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKHNjYW50eXBlKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShyZXN1bHRjb2RlKTsKLWV4dGVybiBwODAyMTFlbnVtX3QgTUtFTlVNTkFNRShyZWFzb24pOwotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKHN0YXR1cyk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUobXNnY29kZSk7Ci1leHRlcm4gcDgwMjExZW51bV90IE1LRU5VTU5BTUUobXNnaXRlbV9zdGF0dXMpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUodHJ1dGgpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUoaWZzdGF0ZSk7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShwb3dlcm1nbXQpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUoYnNzdHlwZSk7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShhdXRoYWxnKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHBoeXR5cGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUodGVtcHR5cGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUocmVnZG9tYWluKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKGNjYW1vZGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUoZGl2ZXJzaXR5KTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHNjYW50eXBlKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHJlc3VsdGNvZGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUocmVhc29uKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKHN0YXR1cyk7CitleHRlcm4gc3RydWN0IHA4MDIxMWVudW0gTUtFTlVNTkFNRShtc2djb2RlKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKG1zZ2l0ZW1fc3RhdHVzKTsKIAotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKGxueHJvYW1fcmVhc29uKTsKK2V4dGVybiBzdHJ1Y3QgcDgwMjExZW51bSBNS0VOVU1OQU1FKGxueHJvYW1fcmVhc29uKTsKIAotZXh0ZXJuIHA4MDIxMWVudW1fdCBNS0VOVU1OQU1FKHAycHJlYW1ibGUpOworZXh0ZXJuIHN0cnVjdCBwODAyMTFlbnVtIE1LRU5VTU5BTUUocDJwcmVhbWJsZSk7CiAKICNlbmRpZiAvKiBfUDgwMjExVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcDgwMjExd2VwLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXAuYwppbmRleCAyMmM3OTcwLi4yM2IxODM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wODAyMTF3ZXAuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAKIC8qIGtleWxlbiBpbiBieXRlcyEgKi8KIAotaW50IHdlcF9jaGFuZ2Vfa2V5KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaW50IGtleW51bSwgdTggKmtleSwgaW50IGtleWxlbikKK2ludCB3ZXBfY2hhbmdlX2tleShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgaW50IGtleW51bSwgdTggKmtleSwgaW50IGtleWxlbikKIHsKIAlpZiAoa2V5bGVuIDwgMCkKIAkJcmV0dXJuIC0xOwpAQCAtMTQzLDcgKzE0Myw3IEBACiAgKiA0LWJ5dGUgSVYgYXQgc3RhcnQgb2YgYnVmZmVyLCA0LWJ5dGUgSUNWIGF0IGVuZCBvZiBidWZmZXIuCiAgKiBpZiBzdWNjZXNzZnVsLCBidWYgc3RhcnQgaXMgcGF5bG9hZCBiZWdpbiwgbGVuZ3RoIC09IDg7CiAgKi8KLWludCB3ZXBfZGVjcnlwdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHU4ICpidWYsIHUzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsCitpbnQgd2VwX2RlY3J5cHQoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHU4ICpidWYsIHUzMiBsZW4sIGludCBrZXlfb3ZlcnJpZGUsCiAJCXU4ICppdiwgdTggKmljdikKIHsKIAl1MzIgaSwgaiwgaywgY3JjLCBrZXlsZW47CkBAIC0yMTcsNyArMjE3LDcgQEAKIH0KIAogLyogZW5jcnlwdHMgaW4tcGxhY2UuICovCi1pbnQgd2VwX2VuY3J5cHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCAqYnVmLCB1OCAqZHN0LCB1MzIgbGVuLCBpbnQga2V5bnVtLAoraW50IHdlcF9lbmNyeXB0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1OCAqYnVmLCB1OCAqZHN0LCB1MzIgbGVuLCBpbnQga2V5bnVtLAogCQl1OCAqaXYsIHU4ICppY3YpCiB7CiAJdTMyIGksIGosIGssIGNyYywga2V5bGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMmZ3LmMKaW5kZXggNTZiZmZkOS4uOTZhYTIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yZncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJmdy5jCkBAIC05NiwxNiArOTYsMTYgQEAKIAl1MTYgbGVuOwogCXUxNiB0eXBlOwogCXVuaW9uIHsKLQkJaGZhMzg0eF9jb21waWRlbnRfdCB2ZXJzaW9uOwotCQloZmEzODR4X2NhcGxldmVsX3QgY29tcGF0OworCQlzdHJ1Y3QgaGZhMzg0eF9jb21waWRlbnQgdmVyc2lvbjsKKwkJc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgY29tcGF0OwogCQl1MTYgYnVpbGRzZXE7Ci0JCWhmYTM4NHhfY29tcGlkZW50X3QgcGxhdGZvcm07CisJCXN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCBwbGF0Zm9ybTsKIAl9IGluZm87CiB9OwogCiBzdHJ1Y3QgcGRhIHsKIAl1OCBidWZbSEZBMzg0eF9QREFfTEVOX01BWF07Ci0JaGZhMzg0eF9wZHJlY190ICpyZWNbSEZBMzg0eF9QREFfUkVDU19NQVhdOworCXN0cnVjdCBoZmEzODR4X3BkcmVjICpyZWNbSEZBMzg0eF9QREFfUkVDU19NQVhdOwogCXVuc2lnbmVkIGludCBucmVjOwogfTsKIApAQCAtMTUyLDIyICsxNTIsMjIgQEAKIC8qIFBEQSwgYnVpbHQgZnJvbSBbY2FyZHxuZXdmaWxlXStbYWRkZmlsZTErYWRkZmlsZTIuLi5dICovCiAKIHN0YXRpYyBzdHJ1Y3QgcGRhIHBkYTsKLXN0YXRpYyBoZmEzODR4X2NvbXBpZGVudF90IG5pY2lkOwotc3RhdGljIGhmYTM4NHhfY2FwbGV2ZWxfdCByZmlkOwotc3RhdGljIGhmYTM4NHhfY2FwbGV2ZWxfdCBtYWNpZDsKLXN0YXRpYyBoZmEzODR4X2NhcGxldmVsX3QgcHJpaWQ7CitzdGF0aWMgc3RydWN0IGhmYTM4NHhfY29tcGlkZW50IG5pY2lkOworc3RhdGljIHN0cnVjdCBoZmEzODR4X2NhcGxldmVsIHJmaWQ7CitzdGF0aWMgc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgbWFjaWQ7CitzdGF0aWMgc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwgcHJpaWQ7CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBMb2NhbCBGdW5jdGlvbiBEZWNsYXJhdGlvbnMgKi8KIAogc3RhdGljIGludCBwcmlzbTJfZndhcHBseShjb25zdCBzdHJ1Y3QgaWhleF9iaW5yZWMgKnJmcHRyLAotd2xhbmRldmljZV90ICp3bGFuZGV2KTsKK3N0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKIAogc3RhdGljIGludCByZWFkX2Z3ZmlsZShjb25zdCBzdHJ1Y3QgaWhleF9iaW5yZWMgKnJmcHRyKTsKIAogc3RhdGljIGludCBta2ltYWdlKHN0cnVjdCBpbWdjaHVuayAqY2xpc3QsIHVuc2lnbmVkIGludCAqY2NudCk7CiAKLXN0YXRpYyBpbnQgcmVhZF9jYXJkcGRhKHN0cnVjdCBwZGEgKnBkYSwgd2xhbmRldmljZV90ICp3bGFuZGV2KTsKK3N0YXRpYyBpbnQgcmVhZF9jYXJkcGRhKHN0cnVjdCBwZGEgKnBkYSwgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOwogCiBzdGF0aWMgaW50IG1rcGRybGlzdChzdHJ1Y3QgcGRhICpwZGEpOwogCkBAIC0xNzcsNyArMTc3LDcgQEAKIHN0YXRpYyBpbnQgY3JjaW1hZ2Uoc3RydWN0IGltZ2NodW5rICpmY2h1bmssIHVuc2lnbmVkIGludCBuZmNodW5rcywKIAkgICAgIHN0cnVjdCBzM2NyY3JlYyAqczNjcmMsIHVuc2lnbmVkIGludCBuczNjcmMpOwogCi1zdGF0aWMgaW50IHdyaXRlaW1hZ2Uod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3QgaW1nY2h1bmsgKmZjaHVuaywKK3N0YXRpYyBpbnQgd3JpdGVpbWFnZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IGltZ2NodW5rICpmY2h1bmssCiAJICAgICAgIHVuc2lnbmVkIGludCBuZmNodW5rcyk7CiBzdGF0aWMgdm9pZCBmcmVlX2NodW5rcyhzdHJ1Y3QgaW1nY2h1bmsgKmZjaHVuaywgdW5zaWduZWQgaW50ICpuZmNodW5rcyk7CiAKQEAgLTIwMSw3ICsyMDEsNyBAQAogKgkwCS0gc3VjY2VzcwogKgl+MAktIGZhaWx1cmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBwcmlzbTJfZnd0cnkoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyBpbnQgcHJpc20yX2Z3dHJ5KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5ID0gTlVMTDsKIApAQCAtMjM5LDExICsyMzksMTEgQEAKICoJfjAJLSBmYWlsdXJlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQgcHJpc20yX2Z3YXBwbHkoY29uc3Qgc3RydWN0IGloZXhfYmlucmVjICpyZnB0ciwKLQkJCSAgd2xhbmRldmljZV90ICp3bGFuZGV2KQorCQkJICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIAlzaWduZWQgaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJnZXQgZ2V0bXNnOwotCXA4MDIxMWl0ZW1kX3QgKml0ZW07CisJc3RydWN0IHA4MDIxMWl0ZW1kICppdGVtOwogCXUzMiAqZGF0YTsKIAogCS8qIEluaXRpYWxpemUgdGhlIGRhdGEgc3RydWN0dXJlcyAqLwpAQCAtMjY2LDcgKzI2Niw3IEBACiAKIAkvKiBjbGVhciB0aGUgcGRhIGFuZCBhZGQgYW4gaW5pdGlhbCBFTkQgcmVjb3JkICovCiAJbWVtc2V0KCZwZGEsIDAsIHNpemVvZihwZGEpKTsKLQlwZGEucmVjWzBdID0gKGhmYTM4NHhfcGRyZWNfdCAqKSBwZGEuYnVmOworCXBkYS5yZWNbMF0gPSAoc3RydWN0IGhmYTM4NHhfcGRyZWMgKilwZGEuYnVmOwogCXBkYS5yZWNbMF0tPmxlbiA9IGNwdV90b19sZTE2KDIpOwkvKiBsZW4gaW4gd29yZHMgKi8KIAlwZGEucmVjWzBdLT5jb2RlID0gY3B1X3RvX2xlMTYoSEZBMzg0eF9QRFJfRU5EX09GX1BEQSk7CiAJcGRhLm5yZWMgPSAxOwpAQCAtMjkzLDExICsyOTMsMTEgQEAKIAlnZXRtc2cucmVzdWx0Y29kZS5kaWQgPSBESURtc2dfZG90MTFyZXFfbWliZ2V0X3Jlc3VsdGNvZGU7CiAJZ2V0bXNnLnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKIAotCWl0ZW0gPSAocDgwMjExaXRlbWRfdCAqKSBnZXRtc2cubWliYXR0cmlidXRlLmRhdGE7CisJaXRlbSA9IChzdHJ1Y3QgcDgwMjExaXRlbWQgKilnZXRtc2cubWliYXR0cmlidXRlLmRhdGE7CiAJaXRlbS0+ZGlkID0gRElEbWliX3AyX3AyTklDX3AyUFJJU3VwUmFuZ2U7CiAJaXRlbS0+c3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19ub192YWx1ZTsKIAotCWRhdGEgPSAodTMyICopIGl0ZW0tPmRhdGE7CisJZGF0YSA9ICh1MzIgKilpdGVtLT5kYXRhOwogCiAJLyogRElEbXNnX2RvdDExcmVxX21pYmdldCAqLwogCXByaXNtMm1nbXRfbWlic2V0X21pYmdldCh3bGFuZGV2LCAmZ2V0bXNnKTsKQEAgLTU5MiwxNCArNTkyLDE0IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIHN0YXRpYyBpbnQgbWtwZHJsaXN0KHN0cnVjdCBwZGEgKnBkYSkKIHsKLQl1MTYgKnBkYTE2ID0gKHUxNiAqKSBwZGEtPmJ1ZjsKKwl1MTYgKnBkYTE2ID0gKHUxNiAqKXBkYS0+YnVmOwogCWludCBjdXJyb2ZmOwkJLyogaW4gJ3dvcmRzJyAqLwogCiAJcGRhLT5ucmVjID0gMDsKIAljdXJyb2ZmID0gMDsKIAl3aGlsZSAoY3Vycm9mZiA8IChIRkEzODR4X1BEQV9MRU5fTUFYIC8gMiAtIDEpICYmCiAJICAgICAgIGxlMTZfdG9fY3B1KHBkYTE2W2N1cnJvZmYgKyAxXSkgIT0gSEZBMzg0eF9QRFJfRU5EX09GX1BEQSkgewotCQlwZGEtPnJlY1twZGEtPm5yZWNdID0gKGhmYTM4NHhfcGRyZWNfdCAqKSAmKHBkYTE2W2N1cnJvZmZdKTsKKwkJcGRhLT5yZWNbcGRhLT5ucmVjXSA9IChzdHJ1Y3QgaGZhMzg0eF9wZHJlYyAqKSYocGRhMTZbY3Vycm9mZl0pOwogCiAJCWlmIChsZTE2X3RvX2NwdShwZGEtPnJlY1twZGEtPm5yZWNdLT5jb2RlKSA9PQogCQkgICAgSEZBMzg0eF9QRFJfTklDSUQpIHsKQEAgLTYzOCw3ICs2MzgsNyBAQAogCQkgICAgICAgY3Vycm9mZiwgcGRhLT5ucmVjKTsKIAkJcmV0dXJuIDE7CiAJfQotCXBkYS0+cmVjW3BkYS0+bnJlY10gPSAoaGZhMzg0eF9wZHJlY190ICopICYocGRhMTZbY3Vycm9mZl0pOworCXBkYS0+cmVjW3BkYS0+bnJlY10gPSAoc3RydWN0IGhmYTM4NHhfcGRyZWMgKikmKHBkYTE2W2N1cnJvZmZdKTsKIAkocGRhLT5ucmVjKSsrOwogCXJldHVybiAwOwogfQpAQCAtNzY2LDcgKzc2Niw3IEBACiAqCTAJLSBzdWNjZXNzCiAqCX4wCS0gZmFpbHVyZSAocHJvYmFibHkgYW4gZXJybm8pCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgcmVhZF9jYXJkcGRhKHN0cnVjdCBwZGEgKnBkYSwgd2xhbmRldmljZV90ICp3bGFuZGV2KQorc3RhdGljIGludCByZWFkX2NhcmRwZGEoc3RydWN0IHBkYSAqcGRhLCBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JlYWRwZGEgKm1zZzsKQEAgLTg3OSw4ICs4NzksOCBAQAogCQlhZGRyID0gYmUzMl90b19jcHUocmVjb3JkLT5hZGRyKTsKIAogCQkvKiBQb2ludCBpbnRvIGRhdGEgZm9yIGRpZmZlcmVudCB3b3JkIGxlbmd0aHMgKi8KLQkJcHRyMzIgPSAodTMyICopIHJlY29yZC0+ZGF0YTsKLQkJcHRyMTYgPSAodTE2ICopIHJlY29yZC0+ZGF0YTsKKwkJcHRyMzIgPSAodTMyICopcmVjb3JkLT5kYXRhOworCQlwdHIxNiA9ICh1MTYgKilyZWNvcmQtPmRhdGE7CiAKIAkJLyogcGFyc2Ugd2hhdCB3YXMgYW4gUzMgc3JlYyBhbmQgcHV0IGl0IGluIHRoZSByaWdodCBhcnJheSAqLwogCQlzd2l0Y2ggKGFkZHIpIHsKQEAgLTk1NCw3ICs5NTQsNyBAQAogCQlkZWZhdWx0OgkvKiBEYXRhIHJlY29yZCAqLwogCQkJczNkYXRhW25zM2RhdGFdLmFkZHIgPSBhZGRyOwogCQkJczNkYXRhW25zM2RhdGFdLmxlbiA9IGxlbjsKLQkJCXMzZGF0YVtuczNkYXRhXS5kYXRhID0gKHVpbnQ4X3QgKikgcmVjb3JkLT5kYXRhOworCQkJczNkYXRhW25zM2RhdGFdLmRhdGEgPSAodWludDhfdCAqKXJlY29yZC0+ZGF0YTsKIAkJCW5zM2RhdGErKzsKIAkJCWlmIChuczNkYXRhID09IFMzREFUQV9NQVgpIHsKIAkJCQlwcl9lcnIoIlMzIGRhdGFyZWMgbGltaXQgcmVhY2hlZCAtIGFib3J0aW5nXG4iKTsKQEAgLTk4Miw3ICs5ODIsNyBAQAogKgkwCXN1Y2Nlc3MKICoJfjAJZmFpbHVyZQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50IHdyaXRlaW1hZ2Uod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3QgaW1nY2h1bmsgKmZjaHVuaywKK3N0YXRpYyBpbnQgd3JpdGVpbWFnZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IGltZ2NodW5rICpmY2h1bmssCiAJICAgICAgIHVuc2lnbmVkIGludCBuZmNodW5rcykKIHsKIAlpbnQgcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuYwppbmRleCBkOGVkOWEwLi4xNzBkZTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5jCkBAIC0xMTMsMTYgKzExMywxNiBAQAogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9zY2FuKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKK2ludCBwcmlzbTJtZ210X3NjYW4oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX3NjYW4gKm1zZyA9IG1zZ3A7CiAJdTE2IHJvYW1pbmdtb2RlLCB3b3JkOwogCWludCBpLCB0aW1lb3V0OwogCWludCBpc3RtcGVuYWJsZSA9IDA7CiAKLQloZmEzODR4X0hvc3RTY2FuUmVxdWVzdF9kYXRhX3Qgc2NhbnJlcTsKKwlzdHJ1Y3QgaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YSBzY2FucmVxOwogCiAJLyogZ2F0ZWtlZXBlciBjaGVjayAqLwogCWlmIChIRkEzODR4X0ZJUk1XQVJFX1ZFUlNJT04oaHctPmlkZW50X3N0YV9mdy5tYWpvciwKQEAgLTI5Miw3ICsyOTIsNyBAQAogCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywKIAkJCQkJSEZBMzg0eF9SSURfSE9TVFNDQU4sICZzY2FucmVxLAotCQkJCQlzaXplb2YoaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YV90KSk7CisJCQkJCXNpemVvZihzdHJ1Y3QgaGZhMzg0eF9Ib3N0U2NhblJlcXVlc3RfZGF0YSkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsCiAJCQkgICAic2V0Y29uZmlnKFNDQU5SRVFVRVNUKSBmYWlsZWQuIHJlc3VsdD0lZFxuIiwKQEAgLTM2NiwxMiArMzY2LDEyIEBACiAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3NjYW5fcmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9zY2FuX3Jlc3VsdHMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9zY2FuX3Jlc3VsdHMgKnJlcTsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKLQloZmEzODR4X0hTY2FuUmVzdWx0U3ViX3QgKml0ZW0gPSBOVUxMOworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHhfSFNjYW5SZXN1bHRTdWIgKml0ZW0gPSBOVUxMOwogCiAJaW50IGNvdW50OwogCkBAIC01MjUsMTUgKzUyNSwxNSBAQAogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAqCWludGVycnVwdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9zdGFydCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9zdGFydChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfc3RhcnQgKm1zZyA9IG1zZ3A7CiAKLQlwODAyMTFwc3RyZF90ICpwc3RyOworCXN0cnVjdCBwODAyMTFwc3RyZCAqcHN0cjsKIAl1OCBieXRlYnVmWzgwXTsKLQlzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICpwMmJ5dGVzdHIgPSAoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqKSBieXRlYnVmOworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKnAyYnl0ZXN0ciA9IChzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopYnl0ZWJ1ZjsKIAl1MTYgd29yZDsKIAogCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfTk9ORTsKQEAgLTU1OCw3ICs1NTgsNyBAQAogCS8qKiogU1RBVElPTiAqKiovCiAJLyogU2V0IHRoZSBSRVFVSVJFRCBjb25maWcgaXRlbXMgKi8KIAkvKiBTU0lEICovCi0JcHN0ciA9IChwODAyMTFwc3RyZF90ICopICYobXNnLT5zc2lkLmRhdGEpOworCXBzdHIgPSAoc3RydWN0IHA4MDIxMXBzdHJkICopJihtc2ctPnNzaWQuZGF0YSk7CiAJcHJpc20ybWdtdF9wc3RyMmJ5dGVzdHIocDJieXRlc3RyLCBwc3RyKTsKIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfc2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9DTkZPV05TU0lELAogCQkJCQlieXRlYnVmLCBIRkEzODR4X1JJRF9DTkZPV05TU0lEX0xFTik7CkBAIC02ODUsOSArNjg1LDcgQEAKIAltc2ctPnJlc3VsdGNvZGUuZGF0YSA9IFA4MDIxMUVOVU1fcmVzdWx0Y29kZV9pbnZhbGlkX3BhcmFtZXRlcnM7CiAKIGRvbmU6Ci0JcmVzdWx0ID0gMDsKLQotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzA4LDkgKzcwNiw5IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9yZWFkcGRhKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKK2ludCBwcmlzbTJtZ210X3JlYWRwZGEoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlzdHJ1Y3QgcDgwMjExbXNnX3AycmVxX3JlYWRwZGEgKm1zZyA9IG1zZ3A7CiAJaW50IHJlc3VsdDsKIApAQCAtNzc0LDkgKzc3Miw5IEBACiAqIENhbGwgY29udGV4dDoKICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1pbnQgcHJpc20ybWdtdF9yYW1kbF9zdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9yYW1kbF9zdGF0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXN0cnVjdCBwODAyMTFtc2dfcDJyZXFfcmFtZGxfc3RhdGUgKm1zZyA9IG1zZ3A7CiAKIAlpZiAod2xhbmRldi0+bXNkc3RhdGUgIT0gV0xBTl9NU0RfRldMT0FEKSB7CkBAIC04MjksOSArODI3LDkgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3JhbWRsX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKK2ludCBwcmlzbTJtZ210X3JhbWRsX3dyaXRlKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9yYW1kbF93cml0ZSAqbXNnID0gbXNncDsKIAl1MzIgYWRkcjsKIAl1MzIgbGVuOwpAQCAtODkwLDEwICs4ODgsMTAgQEAKICogQ2FsbCBjb250ZXh0OgogKglwcm9jZXNzIHRocmVhZCAgKHVzdWFsbHkpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2ZsYXNoZGxfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKQoraW50IHByaXNtMm1nbXRfZmxhc2hkbF9zdGF0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXN0cnVjdCBwODAyMTFtc2dfcDJyZXFfZmxhc2hkbF9zdGF0ZSAqbXNnID0gbXNncDsKIAogCWlmICh3bGFuZGV2LT5tc2RzdGF0ZSAhPSBXTEFOX01TRF9GV0xPQUQpIHsKQEAgLTk2MSw5ICs5NTksOSBAQAogKiBDYWxsIGNvbnRleHQ6CiAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotaW50IHByaXNtMm1nbXRfZmxhc2hkbF93cml0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9mbGFzaGRsX3dyaXRlKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJc3RydWN0IHA4MDIxMW1zZ19wMnJlcV9mbGFzaGRsX3dyaXRlICptc2cgPSBtc2dwOwogCXUzMiBhZGRyOwogCXUzMiBsZW47CkBAIC0xMDIxLDE2ICsxMDE5LDE2IEBACiAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X2F1dG9qb2luKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCkKK2ludCBwcmlzbTJtZ210X2F1dG9qb2luKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJaW50IHJlc3VsdCA9IDA7CiAJdTE2IHJlZzsKIAl1MTYgcG9ydF90eXBlOwogCXN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2F1dG9qb2luICptc2cgPSBtc2dwOwotCXA4MDIxMXBzdHJkX3QgKnBzdHI7CisJc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyOwogCXU4IGJ5dGVidWZbMjU2XTsKLQlzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICpwMmJ5dGVzdHIgPSAoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqKSBieXRlYnVmOworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKnAyYnl0ZXN0ciA9IChzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopYnl0ZWJ1ZjsKIAogCXdsYW5kZXYtPm1hY21vZGUgPSBXTEFOX01BQ01PREVfTk9ORTsKIApAQCAtMTA1NCw3ICsxMDUyLDcgQEAKIAogCS8qIFNldCB0aGUgc3NpZCAqLwogCW1lbXNldChieXRlYnVmLCAwLCAyNTYpOwotCXBzdHIgPSAocDgwMjExcHN0cmRfdCAqKSAmKG1zZy0+c3NpZC5kYXRhKTsKKwlwc3RyID0gKHN0cnVjdCBwODAyMTFwc3RyZCAqKSYobXNnLT5zc2lkLmRhdGEpOwogCXByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHAyYnl0ZXN0ciwgcHN0cik7CiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX3NldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ05GREVTSVJFRFNTSUQsCiAJCQkJCWJ5dGVidWYsCkBAIC0xMDkyLDEyICsxMDkwLDEyIEBACiAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKICoJaW50ZXJydXB0CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBwcmlzbTJtZ210X3dsYW5zbmlmZih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF93bGFuc25pZmYoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfd2xhbnNuaWZmICptc2cgPSBtc2dwOwogCi0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAl1MTYgd29yZDsKIAogCW1zZy0+cmVzdWx0Y29kZS5zdGF0dXMgPSBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtZ210LmgKaW5kZXggZTY0NzIwMy4uY2MxYWM3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWdtdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1nbXQuaApAQCAtNjMsNDMgKzYzLDQ0IEBACiBleHRlcm4gaW50IHByaXNtMl9yZXNldF9ob2xkdGltZTsKIGV4dGVybiBpbnQgcHJpc20yX3Jlc2V0X3NldHRsZXRpbWU7CiAKLXUzMiBwcmlzbTJzdGFfaWZzdGF0ZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUzMiBpZnN0YXRlKTsKK3UzMiBwcmlzbTJzdGFfaWZzdGF0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyIGlmc3RhdGUpOwogCi12b2lkIHByaXNtMnN0YV9ldl9pbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwotdm9pZCBwcmlzbTJzdGFfZXZfdHhleGMod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MTYgc3RhdHVzKTsKLXZvaWQgcHJpc20yc3RhX2V2X3R4KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdTE2IHN0YXR1cyk7Ci12b2lkIHByaXNtMnN0YV9ldl9hbGxvYyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwordm9pZCBwcmlzbTJzdGFfZXZfaW5mbyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7Cit2b2lkIHByaXNtMnN0YV9ldl90eGV4YyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTE2IHN0YXR1cyk7Cit2b2lkIHByaXNtMnN0YV9ldl90eChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTE2IHN0YXR1cyk7Cit2b2lkIHByaXNtMnN0YV9ldl9hbGxvYyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CiAKLWludCBwcmlzbTJtZ210X21pYnNldF9taWJnZXQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3NjYW4od2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3NjYW5fcmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfc3RhcnQod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3dsYW5zbmlmZih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfcmVhZHBkYSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwotaW50IHByaXNtMm1nbXRfcmFtZGxfc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB2b2lkICptc2dwKTsKLWludCBwcmlzbTJtZ210X3JhbWRsX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9mbGFzaGRsX3N0YXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9mbGFzaGRsX3dyaXRlKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgdm9pZCAqbXNncCk7Ci1pbnQgcHJpc20ybWdtdF9hdXRvam9pbih3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfbWlic2V0X21pYmdldChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9zY2FuKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKTsKK2ludCBwcmlzbTJtZ210X3NjYW5fcmVzdWx0cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9zdGFydChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF93bGFuc25pZmYoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfcmVhZHBkYShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9yYW1kbF9zdGF0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9yYW1kbF93cml0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdm9pZCAqbXNncCk7CitpbnQgcHJpc20ybWdtdF9mbGFzaGRsX3N0YXRlKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKTsKK2ludCBwcmlzbTJtZ210X2ZsYXNoZGxfd3JpdGUoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOworaW50IHByaXNtMm1nbXRfYXV0b2pvaW4oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHZvaWQgKm1zZ3ApOwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBjb252ZXJzaW9uIGZ1bmN0aW9ucyBnb2luZyBiZXR3ZWVuIHdsYW4gbWVzc2FnZSBkYXRhIHR5cGVzIGFuZAogKiBQcmlzbTIgZGF0YSB0eXBlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIGJ5dGUgYXJlYSBjb252ZXJzaW9uIGZ1bmN0aW9ucyovCi12b2lkIHByaXNtMm1nbXRfYnl0ZWFyZWEycHN0cih1OCAqYnl0ZWFyZWEsIHA4MDIxMXBzdHJkX3QgKnBzdHIsIGludCBsZW4pOwordm9pZCBwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIodTggKmJ5dGVhcmVhLCBzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIsIGludCBsZW4pOwogCiAvKiBieXRlIHN0cmluZyBjb252ZXJzaW9uIGZ1bmN0aW9ucyovCiB2b2lkIHByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKmJ5dGVzdHIsCi0JCQkgICAgIHA4MDIxMXBzdHJkX3QgKnBzdHIpOworCQkJICAgICBzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIpOwogdm9pZCBwcmlzbTJtZ210X2J5dGVzdHIycHN0cihzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICpieXRlc3RyLAotCQkJICAgICBwODAyMTFwc3RyZF90ICpwc3RyKTsKKwkJCSAgICAgc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyKTsKIAogLyogZnVuY3Rpb25zIHRvIGNvbnZlcnQgR3JvdXAgQWRkcmVzc2VzICovCi12b2lkIHByaXNtMm1nbXRfZ2V0X2dycGFkZHIodTMyIGRpZCwgcDgwMjExcHN0cmRfdCAqcHN0ciwgaGZhMzg0eF90ICpwcml2KTsKK3ZvaWQgcHJpc20ybWdtdF9nZXRfZ3JwYWRkcih1MzIgZGlkLCBzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIsCisJCQkgICAgc3RydWN0IGhmYTM4NHggKnByaXYpOwogaW50IHByaXNtMm1nbXRfc2V0X2dycGFkZHIodTMyIGRpZCwKLQkJCSAgIHU4ICpwcmlzbTJidWYsIHA4MDIxMXBzdHJkX3QgKnBzdHIsCi0JCQkgICBoZmEzODR4X3QgKnByaXYpOworCQkJICAgdTggKnByaXNtMmJ1Ziwgc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyLAorCQkJICAgc3RydWN0IGhmYTM4NHggKnByaXYpOwogaW50IHByaXNtMm1nbXRfZ2V0X2dycGFkZHJfaW5kZXgodTMyIGRpZCk7CiAKIHZvaWQgcHJpc20yc3RhX3Byb2Nlc3NpbmdfZGVmZXIoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKTsKQEAgLTEwOCw4ICsxMDksOCBAQAogdm9pZCBwcmlzbTJzdGFfY29tbXNxdWFsX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIC8qIEludGVyZmFjZSBjYWxsYmFjayBmdW5jdGlvbnMsIHBhc3NpbmcgZGF0YSBiYWNrIHVwIHRvIHRoZSBjZmc4MDIxMSBsYXllciAqLwotdm9pZCBwcmlzbTJfY29ubmVjdF9yZXN1bHQod2xhbmRldmljZV90ICp3bGFuZGV2LCB1OCBmYWlsZWQpOwotdm9pZCBwcmlzbTJfZGlzY29ubmVjdGVkKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci12b2lkIHByaXNtMl9yb2FtZWQod2xhbmRldmljZV90ICp3bGFuZGV2KTsKK3ZvaWQgcHJpc20yX2Nvbm5lY3RfcmVzdWx0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB1OCBmYWlsZWQpOwordm9pZCBwcmlzbTJfZGlzY29ubmVjdGVkKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKK3ZvaWQgcHJpc20yX3JvYW1lZChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJtaWIuYwppbmRleCBmZTkxNGIxLi42M2FiNmJjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKQEAgLTg3LDgwICs4Nyw4MCBAQAogCXUxNiBwYXJtMzsKIAlpbnQgKCpmdW5jKShzdHJ1Y3QgbWlicmVjICptaWIsCiAJCSAgICAgaW50IGlzZ2V0LAotCQkgICAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJICAgICBoZmEzODR4X3QgKmh3LAorCQkgICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkgICAgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJICAgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLCB2b2lkICpkYXRhKTsKIH07CiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX2J5dGVhcmVhMnBzdHIoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCSAgIGludCBpc2dldCwKLQkJCQkgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgaGZhMzg0eF90ICpodywKKwkJCQkgICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkgICB2b2lkICpkYXRhKTsKIAogc3RhdGljIGludCBwcmlzbTJtaWJfdWludDMyKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCSAgICBpbnQgaXNnZXQsCi0JCQkgICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJICAgIGhmYTM4NHhfdCAqaHcsCisJCQkgICAgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkgICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl9mbGFnKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCSAgaW50IGlzZ2V0LAotCQkJICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkgIGhmYTM4NHhfdCAqaHcsCisJCQkgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5KHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkgICBpbnQgaXNnZXQsCi0JCQkJICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgIGhmYTM4NHhfdCAqaHcsCisJCQkJICAgc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJCSAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJICAgdm9pZCAqZGF0YSk7CiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX3ByaXZhY3lpbnZva2VkKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkgICAgaW50IGlzZ2V0LAotCQkJCSAgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgIGhmYTM4NHhfdCAqaHcsCisJCQkJICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJICAgIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl9leGNsdWRldW5lbmNyeXB0ZWQoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCQlpbnQgaXNnZXQsCi0JCQkJCXdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkJaGZhMzg0eF90ICpodywKKwkJCQkJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJCXN0cnVjdCBoZmEzODR4ICpodywKIAkJCQkJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkJdm9pZCAqZGF0YSk7CiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCQkgICAgaW50IGlzZ2V0LAotCQkJCQkgICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCQkgICAgaGZhMzg0eF90ICpodywKKwkJCQkJICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQkgICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJCQkgICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkJICAgIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgaW50IHByaXNtMm1pYl9wcml2KHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCSAgaW50IGlzZ2V0LAotCQkJICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkgIGhmYTM4NHhfdCAqaHcsCisJCQkgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csIHZvaWQgKmRhdGEpOwogCiBzdGF0aWMgc3RydWN0IG1pYnJlYyBtaWJ0YWJbXSA9IHsKIAogCS8qIGRvdDExc210IE1JQidzICovCi0Je0RJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MCwKKwl7RElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoMSksCiAJIEZfU1RBIHwgRl9XUklURSwKIAkgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTAsIDAsIDAsCiAJIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5fSwKLQl7RElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9kb3QxMVdFUERlZmF1bHRLZXkxLAorCXtESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2tleSgyKSwKIAkgRl9TVEEgfCBGX1dSSVRFLAogCSBIRkEzODR4X1JJRF9DTkZXRVBERUZBVUxUS0VZMSwgMCwgMCwKIAkgcHJpc20ybWliX3dlcGRlZmF1bHRrZXl9LAotCXtESURtaWJfZG90MTFzbXRfZG90MTFXRVBEZWZhdWx0S2V5c1RhYmxlX2RvdDExV0VQRGVmYXVsdEtleTIsCisJe0RJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfa2V5KDMpLAogCSBGX1NUQSB8IEZfV1JJVEUsCiAJIEhGQTM4NHhfUklEX0NORldFUERFRkFVTFRLRVkyLCAwLCAwLAogCSBwcmlzbTJtaWJfd2VwZGVmYXVsdGtleX0sCi0Je0RJRG1pYl9kb3QxMXNtdF9kb3QxMVdFUERlZmF1bHRLZXlzVGFibGVfZG90MTFXRVBEZWZhdWx0S2V5MywKKwl7RElEbWliX2RvdDExc210X2RvdDExV0VQRGVmYXVsdEtleXNUYWJsZV9rZXkoNCksCiAJIEZfU1RBIHwgRl9XUklURSwKIAkgSEZBMzg0eF9SSURfQ05GV0VQREVGQVVMVEtFWTMsIDAsIDAsCiAJIHByaXNtMm1pYl93ZXBkZWZhdWx0a2V5fSwKQEAgLTIzNywzNiArMjM3LDM2IEBACiAJezAsIDAsIDAsIDAsIDAsIE5VTEx9CiB9OwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWdtdF9taWJzZXRfbWliZ2V0Ci0qCi0qIFNldCB0aGUgdmFsdWUgb2YgYSBtaWIgaXRlbS4KLSoKLSogQXJndW1lbnRzOgotKgl3bGFuZGV2CQl3bGFuIGRldmljZSBzdHJ1Y3R1cmUKLSoJbXNncAkJcHRyIHRvIG1zZyBidWZmZXIKLSoKLSogUmV0dXJuczoKLSoJMAlzdWNjZXNzIGFuZCBkb25lCi0qCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgotKgk+MAlhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBoYW5kbGluZyB0aGUgbWVzc2FnZS4KLSogU2lkZSBlZmZlY3RzOgotKgotKiBDYWxsIGNvbnRleHQ6Ci0qCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKLSoJaW50ZXJydXB0Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBwcmlzbTJtZ210X21pYnNldF9taWJnZXQKKyAqCisgKiBTZXQgdGhlIHZhbHVlIG9mIGEgbWliIGl0ZW0uCisgKgorICogQXJndW1lbnRzOgorICoJd2xhbmRldgkJd2xhbiBkZXZpY2Ugc3RydWN0dXJlCisgKgltc2dwCQlwdHIgdG8gbXNnIGJ1ZmZlcgorICoKKyAqIFJldHVybnM6CisgKgkwCXN1Y2Nlc3MgYW5kIGRvbmUKKyAqCTwwCXN1Y2Nlc3MsIGJ1dCB3ZSdyZSB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gZmluaXNoLgorICoJPjAJYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgaGFuZGxpbmcgdGhlIG1lc3NhZ2UuCisgKiBTaWRlIGVmZmVjdHM6CisgKgorICogQ2FsbCBjb250ZXh0OgorICoJcHJvY2VzcyB0aHJlYWQgICh1c3VhbGx5KQorICoJaW50ZXJydXB0CisgKi8KIAotaW50IHByaXNtMm1nbXRfbWlic2V0X21pYmdldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHZvaWQgKm1zZ3ApCitpbnQgcHJpc20ybWdtdF9taWJzZXRfbWliZ2V0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCB2b2lkICptc2dwKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJaW50IHJlc3VsdCwgaXNnZXQ7CiAJc3RydWN0IG1pYnJlYyAqbWliOwogCiAJdTE2IHdoaWNoOwogCiAJc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZyA9IG1zZ3A7Ci0JcDgwMjExaXRlbWRfdCAqbWliaXRlbTsKKwlzdHJ1Y3QgcDgwMjExaXRlbWQgKm1pYml0ZW07CiAKIAltc2ctPnJlc3VsdGNvZGUuc3RhdHVzID0gUDgwMjExRU5VTV9tc2dpdGVtX3N0YXR1c19kYXRhX29rOwogCW1zZy0+cmVzdWx0Y29kZS5kYXRhID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX3N1Y2Nlc3M7CkBAIC0yODQsNyArMjg0LDcgQEAKIAkgKiogTUlCIHRhYmxlLgogCSAqLwogCi0JbWliaXRlbSA9IChwODAyMTFpdGVtZF90ICopIG1zZy0+bWliYXR0cmlidXRlLmRhdGE7CisJbWliaXRlbSA9IChzdHJ1Y3QgcDgwMjExaXRlbWQgKiltc2ctPm1pYmF0dHJpYnV0ZS5kYXRhOwogCiAJZm9yIChtaWIgPSBtaWJ0YWI7IG1pYi0+ZGlkICE9IDA7IG1pYisrKQogCQlpZiAobWliLT5kaWQgPT0gbWliaXRlbS0+ZGlkICYmIChtaWItPmZsYWcgJiB3aGljaCkpCkBAIC0zNDYsNDAgKzM0Niw0MCBAQAogCXJldHVybiAwOwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2J5dGVhcmVhMnBzdHIKLSoKLSogR2V0L3NldCBwc3RyIGRhdGEgdG8vZnJvbSBhIGJ5dGUgYXJlYS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBOdW1iZXIgb2YgYnl0ZXMgb2YgUklEIGRhdGEuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl9ieXRlYXJlYTJwc3RyCisgKgorICogR2V0L3NldCBwc3RyIGRhdGEgdG8vZnJvbSBhIGJ5dGUgYXJlYS4KKyAqCisgKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6CisgKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgorICogICAgICAgcGFybTIgICAgTnVtYmVyIG9mIGJ5dGVzIG9mIFJJRCBkYXRhLgorICogICAgICAgcGFybTMgICAgTm90IHVzZWQuCisgKgorICogQXJndW1lbnRzOgorICogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KKyAqICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KKyAqICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KKyAqICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KKyAqICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgorICogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgIDAgICAtIFN1Y2Nlc3MuCisgKiAgICAgICB+MCAgLSBFcnJvci4KKyAqCisgKi8KIAogc3RhdGljIGludCBwcmlzbTJtaWJfYnl0ZWFyZWEycHN0cihzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkJICAgaW50IGlzZ2V0LAotCQkJCSAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICBoZmEzODR4X3QgKmh3LAorCQkJCSAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJCQkgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLAogCQkJCSAgIHZvaWQgKmRhdGEpCiB7CiAJaW50IHJlc3VsdDsKLQlwODAyMTFwc3RyZF90ICpwc3RyID0gZGF0YTsKKwlzdHJ1Y3QgcDgwMjExcHN0cmQgKnBzdHIgPSBkYXRhOwogCXU4IGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwogCiAJaWYgKGlzZ2V0KSB7CkBAIC0zOTYsNDEgKzM5Niw0MSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfdWludDMyCi0qCi0qIEdldC9zZXQgdWludDMyIGRhdGEuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl91aW50MzIKKyAqCisgKiBHZXQvc2V0IHVpbnQzMiBkYXRhLgorICoKKyAqIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKKyAqICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCisgKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX3VpbnQzMihzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkgICAgaW50IGlzZ2V0LAotCQkJICAgIHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCSAgICBoZmEzODR4X3QgKmh3LAorCQkJICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJICAgIHN0cnVjdCBoZmEzODR4ICpodywKIAkJCSAgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLCB2b2lkICpkYXRhKQogewogCWludCByZXN1bHQ7CiAJdTMyICp1aW50MzIgPSBkYXRhOwogCXU4IGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCXUxNiAqd29yZGJ1ZiA9ICh1MTYgKikgYnl0ZWJ1ZjsKKwl1MTYgKndvcmRidWYgPSAodTE2ICopYnl0ZWJ1ZjsKIAogCWlmIChpc2dldCkgewogCQlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYpOwpAQCAtNDQzLDQxICs0NDMsNDEgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX2ZsYWcKLSoKLSogR2V0L3NldCBhIGZsYWcuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgQml0IHRvIGdldC9zZXQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl9mbGFnCisgKgorICogR2V0L3NldCBhIGZsYWcuCisgKgorICogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgorICogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KKyAqICAgICAgIHBhcm0yICAgIEJpdCB0byBnZXQvc2V0LgorICogICAgICAgcGFybTMgICAgTm90IHVzZWQuCisgKgorICogQXJndW1lbnRzOgorICogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KKyAqICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KKyAqICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KKyAqICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KKyAqICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgorICogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgIDAgICAtIFN1Y2Nlc3MuCisgKiAgICAgICB+MCAgLSBFcnJvci4KKyAqCisgKi8KIAogc3RhdGljIGludCBwcmlzbTJtaWJfZmxhZyhzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkgIGludCBpc2dldCwKLQkJCSAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJICBoZmEzODR4X3QgKmh3LAorCQkJICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCSAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLCB2b2lkICpkYXRhKQogewogCWludCByZXN1bHQ7CiAJdTMyICp1aW50MzIgPSBkYXRhOwogCXU4IGJ5dGVidWZbTUlCX1RNUF9NQVhMRU5dOwotCXUxNiAqd29yZGJ1ZiA9ICh1MTYgKikgYnl0ZWJ1ZjsKKwl1MTYgKndvcmRidWYgPSAodTE2ICopYnl0ZWJ1ZjsKIAl1MzIgZmxhZ3M7CiAKIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnMTYoaHcsIG1pYi0+cGFybTEsIHdvcmRidWYpOwpAQCAtNTAwLDQwICs1MDAsNDAgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3dlcGRlZmF1bHRrZXkKLSoKLSogR2V0L3NldCBXRVAgZGVmYXVsdCBrZXlzLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE51bWJlciBvZiBieXRlcyBvZiBSSUQgZGF0YS4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogcHJpc20ybWliX3dlcGRlZmF1bHRrZXkKKyAqCisgKiBHZXQvc2V0IFdFUCBkZWZhdWx0IGtleXMuCisgKgorICogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgorICogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KKyAqICAgICAgIHBhcm0yICAgIE51bWJlciBvZiBieXRlcyBvZiBSSUQgZGF0YS4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX3dlcGRlZmF1bHRrZXkoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCSAgIGludCBpc2dldCwKLQkJCQkgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgaGZhMzg0eF90ICpodywKKwkJCQkgICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkgICB2b2lkICpkYXRhKQogewogCWludCByZXN1bHQ7Ci0JcDgwMjExcHN0cmRfdCAqcHN0ciA9IGRhdGE7CisJc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyID0gZGF0YTsKIAl1OCBieXRlYnVmW01JQl9UTVBfTUFYTEVOXTsKIAl1MTYgbGVuOwogCkBAIC01NTAsMzUgKzU1MCwzNSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtaWJfcHJpdmFjeWludm9rZWQKLSoKLSogR2V0L3NldCB0aGUgZG90MTFQcml2YWN5SW52b2tlZCB2YWx1ZS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBQcmlzbTIgUklEIHZhbHVlLgotKiAgICAgICBwYXJtMiAgICBCaXQgdmFsdWUgZm9yIFByaXZhY3lJbnZva2VkIGZsYWcuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl9wcml2YWN5aW52b2tlZAorICoKKyAqIEdldC9zZXQgdGhlIGRvdDExUHJpdmFjeUludm9rZWQgdmFsdWUuCisgKgorICogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgorICogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KKyAqICAgICAgIHBhcm0yICAgIEJpdCB2YWx1ZSBmb3IgUHJpdmFjeUludm9rZWQgZmxhZy4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX3ByaXZhY3lpbnZva2VkKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkgICAgaW50IGlzZ2V0LAotCQkJCSAgICB3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgIGhmYTM4NHhfdCAqaHcsCisJCQkJICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgICBzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJICAgIHN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJICAgIHZvaWQgKmRhdGEpCiB7CkBAIC01OTIsMzUgKzU5MiwzNSBAQAogCXJldHVybiBwcmlzbTJtaWJfZmxhZyhtaWIsIGlzZ2V0LCB3bGFuZGV2LCBodywgbXNnLCBkYXRhKTsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9leGNsdWRldW5lbmNyeXB0ZWQKLSoKLSogR2V0L3NldCB0aGUgZG90MTFFeGNsdWRlVW5lbmNyeXB0ZWQgdmFsdWUuCi0qCi0qIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKLSogICAgICAgcGFybTEgICAgUHJpc20yIFJJRCB2YWx1ZS4KLSogICAgICAgcGFybTIgICAgQml0IHZhbHVlIGZvciBFeGNsdWRlVW5lbmNyeXB0ZWQgZmxhZy4KLSogICAgICAgcGFybTMgICAgTm90IHVzZWQuCi0qCi0qIEFyZ3VtZW50czoKLSogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KLSogICAgICAgaXNnZXQgICAgTUlCR0VUL01JQlNFVCBmbGFnLgotKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCi0qICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCi0qICAgICAgIGh3ICAgICAgICJodyIgc3RydWN0dXJlLgotKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KLSogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCi0qCi0qIFJldHVybnM6Ci0qICAgICAgIDAgICAtIFN1Y2Nlc3MuCi0qICAgICAgIH4wICAtIEVycm9yLgotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogcHJpc20ybWliX2V4Y2x1ZGV1bmVuY3J5cHRlZAorICoKKyAqIEdldC9zZXQgdGhlIGRvdDExRXhjbHVkZVVuZW5jcnlwdGVkIHZhbHVlLgorICoKKyAqIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKKyAqICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCisgKiAgICAgICBwYXJtMiAgICBCaXQgdmFsdWUgZm9yIEV4Y2x1ZGVVbmVuY3J5cHRlZCBmbGFnLgorICogICAgICAgcGFybTMgICAgTm90IHVzZWQuCisgKgorICogQXJndW1lbnRzOgorICogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KKyAqICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KKyAqICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KKyAqICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KKyAqICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgorICogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgIDAgICAtIFN1Y2Nlc3MuCisgKiAgICAgICB+MCAgLSBFcnJvci4KKyAqCisgKi8KIAogc3RhdGljIGludCBwcmlzbTJtaWJfZXhjbHVkZXVuZW5jcnlwdGVkKHN0cnVjdCBtaWJyZWMgKm1pYiwKIAkJCQkJaW50IGlzZ2V0LAotCQkJCQl3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJCWhmYTM4NHhfdCAqaHcsCisJCQkJCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQlzdHJ1Y3QgaGZhMzg0eCAqaHcsCiAJCQkJCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJCXZvaWQgKmRhdGEpCiB7CkBAIC02MjgsMzUgKzYyOCwzNSBAQAogCXJldHVybiBwcmlzbTJtaWJfZmxhZyhtaWIsIGlzZ2V0LCB3bGFuZGV2LCBodywgbXNnLCBkYXRhKTsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1pYl9mcmFnbWVudGF0aW9udGhyZXNob2xkCi0qCi0qIEdldC9zZXQgdGhlIGZyYWdtZW50YXRpb24gdGhyZXNob2xkLgotKgotKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6Ci0qICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCi0qICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgotKiAgICAgICBwYXJtMyAgICBOb3QgdXNlZC4KLSoKLSogQXJndW1lbnRzOgotKiAgICAgICBtaWIgICAgICBNSUIgcmVjb3JkLgotKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCi0qICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KLSogICAgICAgcHJpdiAgICAgInByaXYiIHN0cnVjdHVyZS4KLSogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCi0qICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgotKiAgICAgICBkYXRhICAgICBEYXRhIGJ1ZmZlci4KLSoKLSogUmV0dXJuczoKLSogICAgICAgMCAgIC0gU3VjY2Vzcy4KLSogICAgICAgfjAgIC0gRXJyb3IuCi0qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBwcmlzbTJtaWJfZnJhZ21lbnRhdGlvbnRocmVzaG9sZAorICoKKyAqIEdldC9zZXQgdGhlIGZyYWdtZW50YXRpb24gdGhyZXNob2xkLgorICoKKyAqIE1JQiByZWNvcmQgcGFyYW1ldGVyczoKKyAqICAgICAgIHBhcm0xICAgIFByaXNtMiBSSUQgdmFsdWUuCisgKiAgICAgICBwYXJtMiAgICBOb3QgdXNlZC4KKyAqICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgorICoKKyAqIEFyZ3VtZW50czoKKyAqICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCisgKiAgICAgICBpc2dldCAgICBNSUJHRVQvTUlCU0VUIGZsYWcuCisgKiAgICAgICB3bGFuZGV2ICB3bGFuIGRldmljZSBzdHJ1Y3R1cmUuCisgKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgorICogICAgICAgaHcgICAgICAgImh3IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBtc2cgICAgICBNZXNzYWdlIHN0cnVjdHVyZS4KKyAqICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiAgICAgICAwICAgLSBTdWNjZXNzLgorICogICAgICAgfjAgIC0gRXJyb3IuCisgKgorICovCiAKIHN0YXRpYyBpbnQgcHJpc20ybWliX2ZyYWdtZW50YXRpb250aHJlc2hvbGQoc3RydWN0IG1pYnJlYyAqbWliLAogCQkJCQkgICAgaW50IGlzZ2V0LAotCQkJCQkgICAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCQkgICAgaGZhMzg0eF90ICpodywKKwkJCQkJICAgIHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQkgICAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJCQkgICAgc3RydWN0IHA4MDIxMW1zZ19kb3QxMXJlcV9taWJzZXQgKm1zZywKIAkJCQkJICAgIHZvaWQgKmRhdGEpCiB7CkBAIC02NzQsNDcgKzY3NCw0NyBAQAogCXJldHVybiBwcmlzbTJtaWJfdWludDMyKG1pYiwgaXNnZXQsIHdsYW5kZXYsIGh3LCBtc2csIGRhdGEpOwogfQogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSogcHJpc20ybWliX3ByaXYKLSoKLSogR2V0L3NldCB2YWx1ZXMgaW4gdGhlICJwcml2IiBkYXRhIHN0cnVjdHVyZS4KLSoKLSogTUlCIHJlY29yZCBwYXJhbWV0ZXJzOgotKiAgICAgICBwYXJtMSAgICBOb3QgdXNlZC4KLSogICAgICAgcGFybTIgICAgTm90IHVzZWQuCi0qICAgICAgIHBhcm0zICAgIE5vdCB1c2VkLgotKgotKiBBcmd1bWVudHM6Ci0qICAgICAgIG1pYiAgICAgIE1JQiByZWNvcmQuCi0qICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KLSogICAgICAgd2xhbmRldiAgd2xhbiBkZXZpY2Ugc3RydWN0dXJlLgotKiAgICAgICBwcml2ICAgICAicHJpdiIgc3RydWN0dXJlLgotKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KLSogICAgICAgbXNnICAgICAgTWVzc2FnZSBzdHJ1Y3R1cmUuCi0qICAgICAgIGRhdGEgICAgIERhdGEgYnVmZmVyLgotKgotKiBSZXR1cm5zOgotKiAgICAgICAwICAgLSBTdWNjZXNzLgotKiAgICAgICB+MCAgLSBFcnJvci4KLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1pYl9wcml2CisgKgorICogR2V0L3NldCB2YWx1ZXMgaW4gdGhlICJwcml2IiBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBNSUIgcmVjb3JkIHBhcmFtZXRlcnM6CisgKiAgICAgICBwYXJtMSAgICBOb3QgdXNlZC4KKyAqICAgICAgIHBhcm0yICAgIE5vdCB1c2VkLgorICogICAgICAgcGFybTMgICAgTm90IHVzZWQuCisgKgorICogQXJndW1lbnRzOgorICogICAgICAgbWliICAgICAgTUlCIHJlY29yZC4KKyAqICAgICAgIGlzZ2V0ICAgIE1JQkdFVC9NSUJTRVQgZmxhZy4KKyAqICAgICAgIHdsYW5kZXYgIHdsYW4gZGV2aWNlIHN0cnVjdHVyZS4KKyAqICAgICAgIHByaXYgICAgICJwcml2IiBzdHJ1Y3R1cmUuCisgKiAgICAgICBodyAgICAgICAiaHciIHN0cnVjdHVyZS4KKyAqICAgICAgIG1zZyAgICAgIE1lc3NhZ2Ugc3RydWN0dXJlLgorICogICAgICAgZGF0YSAgICAgRGF0YSBidWZmZXIuCisgKgorICogUmV0dXJuczoKKyAqICAgICAgIDAgICAtIFN1Y2Nlc3MuCisgKiAgICAgICB+MCAgLSBFcnJvci4KKyAqCisgKi8KIAogc3RhdGljIGludCBwcmlzbTJtaWJfcHJpdihzdHJ1Y3QgbWlicmVjICptaWIsCiAJCQkgIGludCBpc2dldCwKLQkJCSAgd2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJICBoZmEzODR4X3QgKmh3LAorCQkJICBzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCSAgc3RydWN0IGhmYTM4NHggKmh3LAogCQkJICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLCB2b2lkICpkYXRhKQogewotCXA4MDIxMXBzdHJkX3QgKnBzdHIgPSBkYXRhOworCXN0cnVjdCBwODAyMTFwc3RyZCAqcHN0ciA9IGRhdGE7CiAKIAlzd2l0Y2ggKG1pYi0+ZGlkKSB7CiAJY2FzZSBESURtaWJfbG54X2xueENvbmZpZ1RhYmxlX2xueFJTTkFJRTp7Ci0JCQloZmEzODR4X1dQQURhdGFfdCB3cGE7CisJCQlzdHJ1Y3QgaGZhMzg0eF9XUEFEYXRhIHdwYTsKIAogCQkJaWYgKGlzZ2V0KSB7CiAJCQkJaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywKIAkJCQkJCSAgICAgICBIRkEzODR4X1JJRF9DTkZXUEFEQVRBLAotCQkJCQkJICAgICAgICh1OCAqKSAmd3BhLAorCQkJCQkJICAgICAgICh1OCAqKSZ3cGEsCiAJCQkJCQkgICAgICAgc2l6ZW9mKHdwYSkpOwogCQkJCXBzdHItPmxlbiA9IGxlMTZfdG9fY3B1KHdwYS5kYXRhbGVuKTsKIAkJCQltZW1jcHkocHN0ci0+ZGF0YSwgd3BhLmRhdGEsIHBzdHItPmxlbik7CkBAIC03MjQsNyArNzI0LDcgQEAKIAogCQkJCWhmYTM4NHhfZHJ2cl9zZXRjb25maWcoaHcsCiAJCQkJCQkgICAgICAgSEZBMzg0eF9SSURfQ05GV1BBREFUQSwKLQkJCQkJCSAgICAgICAodTggKikgJndwYSwKKwkJCQkJCSAgICAgICAodTggKikmd3BhLAogCQkJCQkJICAgICAgIHNpemVvZih3cGEpKTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtNzM2LDY3ICs3MzYsNjcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qIHByaXNtMm1nbXRfcHN0cjJieXRlc3RyCi0qCi0qIENvbnZlcnQgdGhlIHBzdHIgZGF0YSBpbiB0aGUgV0xBTiBtZXNzYWdlIHN0cnVjdHVyZSBpbnRvIGFuIGhmYTM4NHgKLSogYnl0ZSBzdHJpbmcgZm9ybWF0LgotKgotKiBBcmd1bWVudHM6Ci0qCWJ5dGVzdHIJCWhmYTM4NHggYnl0ZSBzdHJpbmcgZGF0YSB0eXBlCi0qCXBzdHIJCXdsYW4gbWVzc2FnZSBkYXRhCi0qCi0qIFJldHVybnM6Ci0qCU5vdGhpbmcKLSoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIHByaXNtMm1nbXRfcHN0cjJieXRlc3RyCisgKgorICogQ29udmVydCB0aGUgcHN0ciBkYXRhIGluIHRoZSBXTEFOIG1lc3NhZ2Ugc3RydWN0dXJlIGludG8gYW4gaGZhMzg0eAorICogYnl0ZSBzdHJpbmcgZm9ybWF0LgorICoKKyAqIEFyZ3VtZW50czoKKyAqCWJ5dGVzdHIJCWhmYTM4NHggYnl0ZSBzdHJpbmcgZGF0YSB0eXBlCisgKglwc3RyCQl3bGFuIG1lc3NhZ2UgZGF0YQorICoKKyAqIFJldHVybnM6CisgKiAJTm90aGluZworICoKKyAqLwogCiB2b2lkIHByaXNtMm1nbXRfcHN0cjJieXRlc3RyKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKmJ5dGVzdHIsCi0JCQkgICAgIHA4MDIxMXBzdHJkX3QgKnBzdHIpCisJCQkgICAgIHN0cnVjdCBwODAyMTFwc3RyZCAqcHN0cikKIHsKLQlieXRlc3RyLT5sZW4gPSBjcHVfdG9fbGUxNigodTE2KSAocHN0ci0+bGVuKSk7CisJYnl0ZXN0ci0+bGVuID0gY3B1X3RvX2xlMTYoKHUxNikocHN0ci0+bGVuKSk7CiAJbWVtY3B5KGJ5dGVzdHItPmRhdGEsIHBzdHItPmRhdGEsIHBzdHItPmxlbik7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2J5dGVzdHIycHN0cgotKgotKiBDb252ZXJ0IHRoZSBkYXRhIGluIGFuIGhmYTM4NHggYnl0ZSBzdHJpbmcgZm9ybWF0IGludG8gYQotKiBwc3RyIGluIHRoZSBXTEFOIG1lc3NhZ2UuCi0qCi0qIEFyZ3VtZW50czoKLSoJYnl0ZXN0cgkJaGZhMzg0eCBieXRlIHN0cmluZyBkYXRhIHR5cGUKLSoJbXNnCQl3bGFuIG1lc3NhZ2UKLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogcHJpc20ybWdtdF9ieXRlc3RyMnBzdHIKKyAqCisgKiBDb252ZXJ0IHRoZSBkYXRhIGluIGFuIGhmYTM4NHggYnl0ZSBzdHJpbmcgZm9ybWF0IGludG8gYQorICogcHN0ciBpbiB0aGUgV0xBTiBtZXNzYWdlLgorICoKKyAqIEFyZ3VtZW50czoKKyAqCWJ5dGVzdHIJCWhmYTM4NHggYnl0ZSBzdHJpbmcgZGF0YSB0eXBlCisgKgltc2cJCXdsYW4gbWVzc2FnZQorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKgorICovCiAKIHZvaWQgcHJpc20ybWdtdF9ieXRlc3RyMnBzdHIoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqYnl0ZXN0ciwKLQkJCSAgICAgcDgwMjExcHN0cmRfdCAqcHN0cikKKwkJCSAgICAgc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyKQogewotCXBzdHItPmxlbiA9ICh1OCkgKGxlMTZfdG9fY3B1KCh1MTYpIChieXRlc3RyLT5sZW4pKSk7CisJcHN0ci0+bGVuID0gKHU4KShsZTE2X3RvX2NwdSgodTE2KShieXRlc3RyLT5sZW4pKSk7CiAJbWVtY3B5KHBzdHItPmRhdGEsIGJ5dGVzdHItPmRhdGEsIHBzdHItPmxlbik7CiB9CiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKiBwcmlzbTJtZ210X2J5dGVhcmVhMnBzdHIKLSoKLSogQ29udmVydCB0aGUgZGF0YSBpbiBhbiBoZmEzODR4IGJ5dGUgYXJlYSBmb3JtYXQgaW50byBhIHBzdHIKLSogaW4gdGhlIFdMQU4gbWVzc2FnZS4KLSoKLSogQXJndW1lbnRzOgotKglieXRlYXJlYQloZmEzODR4IGJ5dGUgYXJlYSBkYXRhIHR5cGUKLSoJbXNnCQl3bGFuIG1lc3NhZ2UKLSoKLSogUmV0dXJuczoKLSoJTm90aGluZwotKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKgorICogcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyCisgKgorICogQ29udmVydCB0aGUgZGF0YSBpbiBhbiBoZmEzODR4IGJ5dGUgYXJlYSBmb3JtYXQgaW50byBhIHBzdHIKKyAqIGluIHRoZSBXTEFOIG1lc3NhZ2UuCisgKgorICogQXJndW1lbnRzOgorICoJYnl0ZWFyZWEJaGZhMzg0eCBieXRlIGFyZWEgZGF0YSB0eXBlCisgKgltc2cJCXdsYW4gbWVzc2FnZQorICoKKyAqIFJldHVybnM6CisgKglOb3RoaW5nCisgKgorICovCiAKLXZvaWQgcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyKHU4ICpieXRlYXJlYSwgcDgwMjExcHN0cmRfdCAqcHN0ciwgaW50IGxlbikKK3ZvaWQgcHJpc20ybWdtdF9ieXRlYXJlYTJwc3RyKHU4ICpieXRlYXJlYSwgc3RydWN0IHA4MDIxMXBzdHJkICpwc3RyLCBpbnQgbGVuKQogewotCXBzdHItPmxlbiA9ICh1OCkgbGVuOworCXBzdHItPmxlbiA9ICh1OClsZW47CiAJbWVtY3B5KHBzdHItPmRhdGEsIGJ5dGVhcmVhLCBsZW4pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYwppbmRleCA2NGY5MDcyLi5lMWI0YTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYwpAQCAtODEsNyArODEsNyBAQAogI2luY2x1ZGUgInByaXNtMm1nbXQuaCIKIAogc3RhdGljIGNoYXIgKmRldl9pbmZvID0gInByaXNtMl91c2IiOwotc3RhdGljIHdsYW5kZXZpY2VfdCAqY3JlYXRlX3dsYW4odm9pZCk7CitzdGF0aWMgc3RydWN0IHdsYW5kZXZpY2UgKmNyZWF0ZV93bGFuKHZvaWQpOwogCiBpbnQgcHJpc20yX3Jlc2V0X2hvbGR0aW1lID0gMzA7CS8qIFJlc2V0IGhvbGQgdGltZSBpbiBtcyAqLwogaW50IHByaXNtMl9yZXNldF9zZXR0bGV0aW1lID0gMTAwOwkvKiBSZXNldCBzZXR0bGUgdGltZSBpbiBtcyAqLwpAQCAtOTgsMzcgKzk4LDM4IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIE1QTC9HUEwiKTsKIAotc3RhdGljIGludCBwcmlzbTJzdGFfb3Blbih3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotc3RhdGljIGludCBwcmlzbTJzdGFfY2xvc2Uod2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9yZXNldCh3bGFuZGV2aWNlX3QgKndsYW5kZXYpOwotc3RhdGljIGludCBwcmlzbTJzdGFfdHhmcmFtZSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHN0cnVjdCBza19idWZmICpza2IsCitzdGF0aWMgaW50IHByaXNtMnN0YV9vcGVuKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKK3N0YXRpYyBpbnQgcHJpc20yc3RhX2Nsb3NlKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2KTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9yZXNldChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldik7CitzdGF0aWMgaW50IHByaXNtMnN0YV90eGZyYW1lKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICB1bmlvbiBwODAyMTFfaGRyICpwODAyMTFfaGRyLAogCQkJICAgICBzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgKnA4MDIxMV93ZXApOwotc3RhdGljIGludCBwcmlzbTJzdGFfbWxtZXJlcXVlc3Qod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3QgcDgwMjExbXNnICptc2cpOwotc3RhdGljIGludCBwcmlzbTJzdGFfZ2V0Y2FyZGluZm8od2xhbmRldmljZV90ICp3bGFuZGV2KTsKLXN0YXRpYyBpbnQgcHJpc20yc3RhX2dsb2JhbHNldHVwKHdsYW5kZXZpY2VfdCAqd2xhbmRldik7Ci1zdGF0aWMgaW50IHByaXNtMnN0YV9zZXRtdWx0aWNhc3Qod2xhbmRldmljZV90ICp3bGFuZGV2LCBuZXRkZXZpY2VfdCAqZGV2KTsKK3N0YXRpYyBpbnQgcHJpc20yc3RhX21sbWVyZXF1ZXN0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3QgcDgwMjExbXNnICptc2cpOworc3RhdGljIGludCBwcmlzbTJzdGFfZ2V0Y2FyZGluZm8oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOworc3RhdGljIGludCBwcmlzbTJzdGFfZ2xvYmFsc2V0dXAoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpOworc3RhdGljIGludCBwcmlzbTJzdGFfc2V0bXVsdGljYXN0KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaGFuZG92ZXIod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfdGFsbGllcyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICBoZmEzODR4X0luZkZyYW1lX3QgKmluZik7Ci1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2hvc3RzY2FucmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJCSAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9zY2FucmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgICAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9jaGluZm9yZXN1bHRzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkJaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpOwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9saW5rc3RhdHVzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXNzb2NzdGF0dXMod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXV0aHJlcSh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICBoZmEzODR4X0luZkZyYW1lX3QgKmluZik7Ci1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2F1dGhyZXFfZGVmZXIod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCQloZmEzODR4X0luZkZyYW1lX3QgKmluZik7Ci1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX3BzdXNlcmNudCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaGFuZG92ZXIoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX3RhbGxpZXMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaG9zdHNjYW5yZXN1bHRzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQkgIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpOworc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9zY2FucmVzdWx0cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfY2hpbmZvcmVzdWx0cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkJc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2xpbmtzdGF0dXMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXNzb2NzdGF0dXMoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2F1dGhyZXEoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKTsKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXV0aHJlcV9kZWZlcihzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkJc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX3BzdXNlcmNudChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZik7CiAKIC8qCiAgKiBwcmlzbTJzdGFfb3BlbgpAQCAtMTUxLDcgKzE1Miw3IEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglwcm9jZXNzIHRocmVhZAogICovCi1zdGF0aWMgaW50IHByaXNtMnN0YV9vcGVuKHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyBpbnQgcHJpc20yc3RhX29wZW4oc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJLyogV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgdG8gZG8gYW55dGhpbmcgZWxzZS4KIAkgKiBUaGUgc2V0dXAgb2YgdGhlIE1BQyBzaG91bGQgYmUgc3Vic2VxdWVudGx5IGNvbXBsZXRlZCB2aWEKQEAgLTE4NSw3ICsxODYsNyBAQAogICogQ2FsbCBjb250ZXh0OgogICoJcHJvY2VzcyB0aHJlYWQKICAqLwotc3RhdGljIGludCBwcmlzbTJzdGFfY2xvc2Uod2xhbmRldmljZV90ICp3bGFuZGV2KQorc3RhdGljIGludCBwcmlzbTJzdGFfY2xvc2Uoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJLyogV2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgdG8gZG8gYW55dGhpbmcgZWxzZS4KIAkgKiBIaWdoZXIgbGF5ZXJzIGtub3cgd2UncmUgbm90IHJlYWR5IGZyb20gZGV2LT5zdGFydD09MCBhbmQKQEAgLTIxMyw3ICsyMTQsNyBAQAogICogQ2FsbCBjb250ZXh0OgogICoJcHJvY2VzcyB0aHJlYWQKICAqLwotc3RhdGljIHZvaWQgcHJpc20yc3RhX3Jlc2V0KHdsYW5kZXZpY2VfdCAqd2xhbmRldikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9yZXNldChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIH0KIApAQCAtMjM4LDExICsyMzksMTEgQEAKICAqIENhbGwgY29udGV4dDoKICAqCXByb2Nlc3MgdGhyZWFkCiAgKi8KLXN0YXRpYyBpbnQgcHJpc20yc3RhX3R4ZnJhbWUod2xhbmRldmljZV90ICp3bGFuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGludCBwcmlzbTJzdGFfdHhmcmFtZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgdW5pb24gcDgwMjExX2hkciAqcDgwMjExX2hkciwKIAkJCSAgICAgc3RydWN0IHA4MDIxMV9tZXRhd2VwICpwODAyMTFfd2VwKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAkvKiBJZiBuZWNlc3NhcnksIHNldCB0aGUgODAyLjExIFdFUCBiaXQgKi8KIAlpZiAoKHdsYW5kZXYtPmhvc3R3ZXAgJiAoSE9TVFdFUF9QUklWQUNZSU5WT0tFRCB8IEhPU1RXRVBfRU5DUllQVCkpID09CkBAIC0yNzcsOSArMjc4LDkgQEAKICAqIENhbGwgY29udGV4dDoKICAqCXByb2Nlc3MgdGhyZWFkCiAgKi8KLXN0YXRpYyBpbnQgcHJpc20yc3RhX21sbWVyZXF1ZXN0KHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgc3RydWN0IHA4MDIxMW1zZyAqbXNnKQorc3RhdGljIGludCBwcmlzbTJzdGFfbWxtZXJlcXVlc3Qoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsIHN0cnVjdCBwODAyMTFtc2cgKm1zZykKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCiAJaW50IHJlc3VsdCA9IDA7CiAKQEAgLTMzNyw3ICszMzgsNyBAQAogCQkJc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZSAqaWZzdGF0ZW1zZzsKIAogCQkJcHJfZGVidWcoIlJlY2VpdmVkIG1sbWUgaWZzdGF0ZSByZXF1ZXN0XG4iKTsKLQkJCWlmc3RhdGVtc2cgPSAoc3RydWN0IHA4MDIxMW1zZ19sbnhyZXFfaWZzdGF0ZSAqKSBtc2c7CisJCQlpZnN0YXRlbXNnID0gKHN0cnVjdCBwODAyMTFtc2dfbG54cmVxX2lmc3RhdGUgKiltc2c7CiAJCQlyZXN1bHQgPQogCQkJICAgIHByaXNtMnN0YV9pZnN0YXRlKHdsYW5kZXYsCiAJCQkJCSAgICAgIGlmc3RhdGVtc2ctPmlmc3RhdGUuZGF0YSk7CkBAIC0zNjAsNyArMzYxLDcgQEAKIAogCQkJcHJfZGVidWcoIlJlY2VpdmVkIGNvbW1zcXVhbGl0eSByZXF1ZXN0XG4iKTsKIAotCQkJcXVhbG1zZyA9IChzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHkgKikgbXNnOworCQkJcXVhbG1zZyA9IChzdHJ1Y3QgcDgwMjExbXNnX2xueHJlcV9jb21tc3F1YWxpdHkgKiltc2c7CiAKIAkJCXF1YWxtc2ctPmxpbmsuc3RhdHVzID0KIAkJCSAgICBQODAyMTFFTlVNX21zZ2l0ZW1fc3RhdHVzX2RhdGFfb2s7CkBAIC00MDcsOSArNDA4LDkgQEAKICAqCXByb2Nlc3MgdGhyZWFkICAodXN1YWxseSkKICAqCWludGVycnVwdAogICovCi11MzIgcHJpc20yc3RhX2lmc3RhdGUod2xhbmRldmljZV90ICp3bGFuZGV2LCB1MzIgaWZzdGF0ZSkKK3UzMiBwcmlzbTJzdGFfaWZzdGF0ZShzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTMyIGlmc3RhdGUpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAl1MzIgcmVzdWx0OwogCiAJcmVzdWx0ID0gUDgwMjExRU5VTV9yZXN1bHRjb2RlX2ltcGxlbWVudGF0aW9uX2ZhaWx1cmU7CkBAIC01ODAsMTAgKzU4MSwxMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJRWl0aGVyLgogICovCi1zdGF0aWMgaW50IHByaXNtMnN0YV9nZXRjYXJkaW5mbyh3bGFuZGV2aWNlX3QgKndsYW5kZXYpCitzdGF0aWMgaW50IHByaXNtMnN0YV9nZXRjYXJkaW5mbyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldikKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXUxNiB0ZW1wOwogCXU4IHNudW1bSEZBMzg0eF9SSURfTklDU0VSSUFMTlVNQkVSX0xFTl07CiAKQEAgLTU5Miw3ICs1OTMsNyBAQAogCS8qIE5JQyBpZGVudGl0eSAqLwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX05JQ0lERU5USVRZLAogCQkJCQkmaHctPmlkZW50X25pYywKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY29tcGlkZW50X3QpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NvbXBpZGVudCkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgTklDSURFTlRJVFlcbiIpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTYxMSw3ICs2MTIsNyBAQAogCS8qIFByaW1hcnkgZi93IGlkZW50aXR5ICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfUFJJSURFTlRJVFksCiAJCQkJCSZody0+aWRlbnRfcHJpX2Z3LAotCQkJCQlzaXplb2YoaGZhMzg0eF9jb21waWRlbnRfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY29tcGlkZW50KSk7CiAJaWYgKHJlc3VsdCkgewogCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBQUklJREVOVElUWVxuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNjMwLDcgKzYzMSw3IEBACiAJLyogU3RhdGlvbiAoU2Vjb25kYXJ5PykgZi93IGlkZW50aXR5ICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfU1RBSURFTlRJVFksCiAJCQkJCSZody0+aWRlbnRfc3RhX2Z3LAotCQkJCQlzaXplb2YoaGZhMzg0eF9jb21waWRlbnRfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY29tcGlkZW50KSk7CiAJaWYgKHJlc3VsdCkgewogCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFJREVOVElUWVxuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNjUxLDcgKzY1Miw3IEBACiAKIAkvKiBzdHJpcCBvdXQgdGhlICdzcGVjaWFsJyB2YXJpYW50IGJpdHMgKi8KIAlody0+bW1fbW9kcyA9IGh3LT5pZGVudF9zdGFfZncudmFyaWFudCAmIChCSVQoMTQpIHwgQklUKDE1KSk7Ci0JaHctPmlkZW50X3N0YV9mdy52YXJpYW50ICY9IH4oKHUxNikgKEJJVCgxNCkgfCBCSVQoMTUpKSk7CisJaHctPmlkZW50X3N0YV9mdy52YXJpYW50ICY9IH4oKHUxNikoQklUKDE0KSB8IEJJVCgxNSkpKTsKIAogCWlmIChody0+aWRlbnRfc3RhX2Z3LmlkID09IDB4MWYpIHsKIAkJbmV0ZGV2X2luZm8od2xhbmRldi0+bmV0ZGV2LApAQCAtNjcwLDcgKzY3MSw3IEBACiAJLyogQ29tcGF0aWJpbGl0eSByYW5nZSwgTW9kZW0gc3VwcGxpZXIgKi8KIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9NRklTVVBSQU5HRSwKIAkJCQkJJmh3LT5jYXBfc3VwX21maSwKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwpKTsKIAlpZiAocmVzdWx0KSB7CiAJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIE1GSVNVUFJBTkdFXG4iKTsKIAkJZ290byBmYWlsZWQ7CkBAIC02OTQsNyArNjk1LDcgQEAKIAkvKiBDb21wYXRpYmlsaXR5IHJhbmdlLCBDb250cm9sbGVyIHN1cHBsaWVyICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfQ0ZJU1VQUkFOR0UsCiAJCQkJCSZody0+Y2FwX3N1cF9jZmksCi0JCQkJCXNpemVvZihoZmEzODR4X2NhcGxldmVsX3QpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NhcGxldmVsKSk7CiAJaWYgKHJlc3VsdCkgewogCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBDRklTVVBSQU5HRVxuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtNzE4LDcgKzcxOSw3IEBACiAJLyogQ29tcGF0aWJpbGl0eSByYW5nZSwgUHJpbWFyeSBmL3cgc3VwcGxpZXIgKi8KIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9QUklTVVBSQU5HRSwKIAkJCQkJJmh3LT5jYXBfc3VwX3ByaSwKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwpKTsKIAlpZiAocmVzdWx0KSB7CiAJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFBSSVNVUFJBTkdFXG4iKTsKIAkJZ290byBmYWlsZWQ7CkBAIC03NDIsNyArNzQzLDcgQEAKIAkvKiBDb21wYXRpYmlsaXR5IHJhbmdlLCBTdGF0aW9uIGYvdyBzdXBwbGllciAqLwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX1NUQVNVUFJBTkdFLAogCQkJCQkmaHctPmNhcF9zdXBfc3RhLAotCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CisJCQkJCXNpemVvZihzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBU1VQUkFOR0VcbiIpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTc3NCw3ICs3NzUsNyBAQAogCS8qIENvbXBhdGliaWxpdHkgcmFuZ2UsIHByaW1hcnkgZi93IGFjdG9yLCBDRkkgc3VwcGxpZXIgKi8KIAlyZXN1bHQgPSBoZmEzODR4X2RydnJfZ2V0Y29uZmlnKGh3LCBIRkEzODR4X1JJRF9QUklfQ0ZJQUNUUkFOR0VTLAogCQkJCQkmaHctPmNhcF9hY3RfcHJpX2NmaSwKLQkJCQkJc2l6ZW9mKGhmYTM4NHhfY2FwbGV2ZWxfdCkpOworCQkJCQlzaXplb2Yoc3RydWN0IGhmYTM4NHhfY2FwbGV2ZWwpKTsKIAlpZiAocmVzdWx0KSB7CiAJCW5ldGRldl9lcnIod2xhbmRldi0+bmV0ZGV2LCAiRmFpbGVkIHRvIHJldHJpZXZlIFBSSV9DRklBQ1RSQU5HRVNcbiIpOwogCQlnb3RvIGZhaWxlZDsKQEAgLTc5OCw3ICs3OTksNyBAQAogCS8qIENvbXBhdGliaWxpdHkgcmFuZ2UsIHN0YSBmL3cgYWN0b3IsIENGSSBzdXBwbGllciAqLwogCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcoaHcsIEhGQTM4NHhfUklEX1NUQV9DRklBQ1RSQU5HRVMsCiAJCQkJCSZody0+Y2FwX2FjdF9zdGFfY2ZpLAotCQkJCQlzaXplb2YoaGZhMzg0eF9jYXBsZXZlbF90KSk7CisJCQkJCXNpemVvZihzdHJ1Y3QgaGZhMzg0eF9jYXBsZXZlbCkpOwogCWlmIChyZXN1bHQpIHsKIAkJbmV0ZGV2X2Vycih3bGFuZGV2LT5uZXRkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgU1RBX0NGSUFDVFJBTkdFU1xuIik7CiAJCWdvdG8gZmFpbGVkOwpAQCAtODIyLDcgKzgyMyw3IEBACiAJLyogQ29tcGF0aWJpbGl0eSByYW5nZSwgc3RhIGYvdyBhY3RvciwgTUZJIHN1cHBsaWVyICovCiAJcmVzdWx0ID0gaGZhMzg0eF9kcnZyX2dldGNvbmZpZyhodywgSEZBMzg0eF9SSURfU1RBX01GSUFDVFJBTkdFUywKIAkJCQkJJmh3LT5jYXBfYWN0X3N0YV9tZmksCi0JCQkJCXNpemVvZihoZmEzODR4X2NhcGxldmVsX3QpKTsKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZmEzODR4X2NhcGxldmVsKSk7CiAJaWYgKHJlc3VsdCkgewogCQluZXRkZXZfZXJyKHdsYW5kZXYtPm5ldGRldiwgIkZhaWxlZCB0byByZXRyaWV2ZSBTVEFfTUZJQUNUUkFOR0VTXG4iKTsKIAkJZ290byBmYWlsZWQ7CkBAIC05MDksMTkgKzkxMCwyMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJcHJvY2VzcyB0aHJlYWQKICAqLwotc3RhdGljIGludCBwcmlzbTJzdGFfZ2xvYmFsc2V0dXAod2xhbmRldmljZV90ICp3bGFuZGV2KQorc3RhdGljIGludCBwcmlzbTJzdGFfZ2xvYmFsc2V0dXAoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAogCS8qIFNldCB0aGUgbWF4aW11bSBmcmFtZSBzaXplICovCiAJcmV0dXJuIGhmYTM4NHhfZHJ2cl9zZXRjb25maWcxNihodywgSEZBMzg0eF9SSURfQ05GTUFYREFUQUxFTiwKIAkJCQkJV0xBTl9EQVRBX01BWExFTik7CiB9CiAKLXN0YXRpYyBpbnQgcHJpc20yc3RhX3NldG11bHRpY2FzdCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIG5ldGRldmljZV90ICpkZXYpCitzdGF0aWMgaW50IHByaXNtMnN0YV9zZXRtdWx0aWNhc3Qoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAogCXUxNiBwcm9taXNjOwogCkBAIC05NTksOCArOTYxLDggQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2hhbmRvdmVyKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaGFuZG92ZXIoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZikKIHsKIAlwcl9kZWJ1ZygicmVjZWl2ZWQgaW5mb2ZyYW1lOkhBTkRPVkVSICh1bmhhbmRsZWQpXG4iKTsKIH0KQEAgLTk4MiwxMCArOTg0LDEwIEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglpbnRlcnJ1cHQKICAqLwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl90YWxsaWVzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQorc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl90YWxsaWVzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgc3RydWN0IGhmYTM4NHhfSW5mRnJhbWUgKmluZikKIHsKLQloZmEzODR4X3QgKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSB3bGFuZGV2LT5wcml2OwogCXUxNiAqc3JjMTY7CiAJdTMyICpkc3Q7CiAJdTMyICpzcmMzMjsKQEAgLTk5NywxNSArOTk5LDE1IEBACiAJICogcmVjb3JkIGxlbmd0aCBvZiB0aGUgaW5mbyByZWNvcmQuCiAJICovCiAKLQljbnQgPSBzaXplb2YoaGZhMzg0eF9Db21tVGFsbGllczMyX3QpIC8gc2l6ZW9mKHUzMik7CisJY250ID0gc2l6ZW9mKHN0cnVjdCBoZmEzODR4X0NvbW1UYWxsaWVzMzIpIC8gc2l6ZW9mKHUzMik7CiAJaWYgKGluZi0+ZnJhbWVsZW4gPiAyMikgewotCQlkc3QgPSAodTMyICopICZody0+dGFsbGllczsKLQkJc3JjMzIgPSAodTMyICopICZpbmYtPmluZm8uY29tbXRhbGxpZXMzMjsKKwkJZHN0ID0gKHUzMiAqKSZody0+dGFsbGllczsKKwkJc3JjMzIgPSAodTMyICopJmluZi0+aW5mby5jb21tdGFsbGllczMyOwogCQlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyssIGRzdCsrLCBzcmMzMisrKQogCQkJKmRzdCArPSBsZTMyX3RvX2NwdSgqc3JjMzIpOwogCX0gZWxzZSB7Ci0JCWRzdCA9ICh1MzIgKikgJmh3LT50YWxsaWVzOwotCQlzcmMxNiA9ICh1MTYgKikgJmluZi0+aW5mby5jb21tdGFsbGllczE2OworCQlkc3QgPSAodTMyICopJmh3LT50YWxsaWVzOworCQlzcmMxNiA9ICh1MTYgKikmaW5mLT5pbmZvLmNvbW10YWxsaWVzMTY7CiAJCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKywgZHN0KyssIHNyYzE2KyspCiAJCQkqZHN0ICs9IGxlMTZfdG9fY3B1KCpzcmMxNik7CiAJfQpAQCAtMTAyOCwyMSArMTAzMCwyMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfc2NhbnJlc3VsdHMod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQorc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9zY2FucmVzdWx0cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCi0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlpbnQgbmJzczsKLQloZmEzODR4X1NjYW5SZXN1bHRfdCAqc3IgPSAmKGluZi0+aW5mby5zY2FucmVzdWx0KTsKKwlzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0ICpzciA9ICYoaW5mLT5pbmZvLnNjYW5yZXN1bHQpOwogCWludCBpOwotCWhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90IGpvaW5yZXE7CisJc3RydWN0IGhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YSBqb2lucmVxOwogCWludCByZXN1bHQ7CiAKIAkvKiBHZXQgdGhlIG51bWJlciBvZiByZXN1bHRzLCBmaXJzdCBpbiBieXRlcywgdGhlbiBpbiByZXN1bHRzICovCiAJbmJzcyA9IChpbmYtPmZyYW1lbGVuICogc2l6ZW9mKHUxNikpIC0KIAkgICAgc2l6ZW9mKGluZi0+aW5mb3R5cGUpIC0gc2l6ZW9mKGluZi0+aW5mby5zY2FucmVzdWx0LnNjYW5yZWFzb24pOwotCW5ic3MgLz0gc2l6ZW9mKGhmYTM4NHhfU2NhblJlc3VsdFN1Yl90KTsKKwluYnNzIC89IHNpemVvZihzdHJ1Y3QgaGZhMzg0eF9TY2FuUmVzdWx0U3ViKTsKIAogCS8qIFByaW50IGVtICovCiAJcHJfZGVidWcoInJ4IHNjYW5yZXN1bHRzLCByZWFzb249JWQsIG5ic3M9JWQ6XG4iLApAQCAtMTA4NCwxMCArMTA4NSwxMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaG9zdHNjYW5yZXN1bHRzKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwKLQkJCQkJICBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfaG9zdHNjYW5yZXN1bHRzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQkgIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAlpbnQgbmJzczsKIAogCW5ic3MgPSAoaW5mLT5mcmFtZWxlbiAtIDMpIC8gMzI7CkBAIC0xMDk4LDcgKzEwOTksNyBAQAogCiAJa2ZyZWUoaHctPnNjYW5yZXN1bHRzKTsKIAotCWh3LT5zY2FucmVzdWx0cyA9IGttZW1kdXAoaW5mLCBzaXplb2YoaGZhMzg0eF9JbmZGcmFtZV90KSwgR0ZQX0FUT01JQyk7CisJaHctPnNjYW5yZXN1bHRzID0ga21lbWR1cChpbmYsIHNpemVvZihzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSksIEdGUF9BVE9NSUMpOwogCiAJaWYgKG5ic3MgPT0gMCkKIAkJbmJzcyA9IC0xOwpAQCAtMTEyNSwxOCArMTEyNiwxOCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfY2hpbmZvcmVzdWx0cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJCWhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQorc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9jaGluZm9yZXN1bHRzKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQlzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJdW5zaWduZWQgaW50IGksIG47CiAKIAlody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMuc2NhbmNoYW5uZWxzID0KIAkgICAgbGUxNl90b19jcHUoaW5mLT5pbmZvLmNoaW5mb3Jlc3VsdC5zY2FuY2hhbm5lbHMpOwogCiAJZm9yIChpID0gMCwgbiA9IDA7IGkgPCBIRkEzODR4X0NISU5GT1JFU1VMVF9NQVg7IGkrKykgewotCQloZmEzODR4X0NoSW5mb1Jlc3VsdFN1Yl90ICpyZXN1bHQ7Ci0JCWhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViX3QgKmNoaW5mb3Jlc3VsdDsKKwkJc3RydWN0IGhmYTM4NHhfQ2hJbmZvUmVzdWx0U3ViICpyZXN1bHQ7CisJCXN0cnVjdCBoZmEzODR4X0NoSW5mb1Jlc3VsdFN1YiAqY2hpbmZvcmVzdWx0OwogCQlpbnQgY2hhbjsKIAogCQlpZiAoIShody0+Y2hhbm5lbF9pbmZvLnJlc3VsdHMuc2NhbmNoYW5uZWxzICYgKDEgPDwgaSkpKQpAQCAtMTE3MCwxOCArMTE3MSwxOCBAQAogCiB2b2lkIHByaXNtMnN0YV9wcm9jZXNzaW5nX2RlZmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBoZmEzODR4LCBsaW5rX2JoKTsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBody0+d2xhbmRldjsKLQloZmEzODR4X2J5dGVzdHIzMl90IHNzaWQ7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBoZmEzODR4LCBsaW5rX2JoKTsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGh3LT53bGFuZGV2OworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMiBzc2lkOwogCWludCByZXN1bHQ7CiAKIAkvKiBGaXJzdCBsZXQncyBwcm9jZXNzIHRoZSBhdXRoIGZyYW1lcyAqLwogCXsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJaGZhMzg0eF9JbmZGcmFtZV90ICppbmY7CisJCXN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmY7CiAKIAkJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmaHctPmF1dGhxKSkpIHsKLQkJCWluZiA9IChoZmEzODR4X0luZkZyYW1lX3QgKikgc2tiLT5kYXRhOworCQkJaW5mID0gKHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICopc2tiLT5kYXRhOwogCQkJcHJpc20yc3RhX2luZl9hdXRocmVxX2RlZmVyKHdsYW5kZXYsIGluZik7CiAJCX0KIApAQCAtMTI1Niw4ICsxMjU3LDggQEAKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQlwcmlzbTJtZ210X2J5dGVzdHIycHN0cigKLQkJCQkJKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKikgJnNzaWQsCi0JCQkJCShwODAyMTFwc3RyZF90ICopICZ3bGFuZGV2LT5zc2lkKTsKKwkJCQkJKHN0cnVjdCBoZmEzODR4X2J5dGVzdHIgKikmc3NpZCwKKwkJCQkJKHN0cnVjdCBwODAyMTFwc3RyZCAqKSZ3bGFuZGV2LT5zc2lkKTsKIAogCQkJLyogQ29sbGVjdCB0aGUgcG9ydCBzdGF0dXMgKi8KIAkJCXJlc3VsdCA9IGhmYTM4NHhfZHJ2cl9nZXRjb25maWcxNihodywKQEAgLTEzMzcsOCArMTMzOCw4IEBACiAJCQkJIEhGQTM4NHhfUklEX0NVUlJFTlRTU0lELCByZXN1bHQpOwogCQkJcmV0dXJuOwogCQl9Ci0JCXByaXNtMm1nbXRfYnl0ZXN0cjJwc3RyKChzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopICZzc2lkLAotCQkJCQkocDgwMjExcHN0cmRfdCAqKSAmd2xhbmRldi0+c3NpZCk7CisJCXByaXNtMm1nbXRfYnl0ZXN0cjJwc3RyKChzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopJnNzaWQsCisJCQkJCShzdHJ1Y3QgcDgwMjExcHN0cmQgKikmd2xhbmRldi0+c3NpZCk7CiAKIAkJaHctPmxpbmtfc3RhdHVzID0gSEZBMzg0eF9MSU5LX0NPTk5FQ1RFRDsKIAkJbmV0aWZfY2Fycmllcl9vbih3bGFuZGV2LT5uZXRkZXYpOwpAQCAtMTM5MCw3ICsxMzkxLDcgQEAKIAkJICogRGlzYWJsZSBUcmFuc21pdHMsIElnbm9yZSByZWNlaXZlcyBvZiBkYXRhIGZyYW1lcwogCQkgKi8KIAkJaWYgKGh3LT5qb2luX2FwICYmIC0taHctPmpvaW5fcmV0cmllcyA+IDApIHsKLQkJCWhmYTM4NHhfSm9pblJlcXVlc3RfZGF0YV90IGpvaW5yZXE7CisJCQlzdHJ1Y3QgaGZhMzg0eF9Kb2luUmVxdWVzdF9kYXRhIGpvaW5yZXE7CiAKIAkJCWpvaW5yZXEgPSBody0+am9pbnJlcTsKIAkJCS8qIFNlbmQgdGhlIGpvaW4gcmVxdWVzdCAqLwpAQCAtMTQzOCwxMCArMTQzOSwxMCBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfbGlua3N0YXR1cyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJICAgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfbGlua3N0YXR1cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgIHN0cnVjdCBoZmEzODR4X0luZkZyYW1lICppbmYpCiB7Ci0JaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKIAogCWh3LT5saW5rX3N0YXR1c19uZXcgPSBsZTE2X3RvX2NwdShpbmYtPmluZm8ubGlua3N0YXR1cy5saW5rc3RhdHVzKTsKIApAQCAtMTQ2NiwxMSArMTQ2NywxMSBAQAogICogQ2FsbCBjb250ZXh0OgogICoJaW50ZXJydXB0CiAgKi8KLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXNzb2NzdGF0dXMod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICAgIGhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQorc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9hc3NvY3N0YXR1cyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OwotCWhmYTM4NHhfQXNzb2NTdGF0dXNfdCByZWM7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gd2xhbmRldi0+cHJpdjsKKwlzdHJ1Y3QgaGZhMzg0eF9Bc3NvY1N0YXR1cyByZWM7CiAJaW50IGk7CiAKIAltZW1jcHkoJnJlYywgJmluZi0+aW5mby5hc3NvY3N0YXR1cywgc2l6ZW9mKHJlYykpOwpAQCAtMTUyNywxMCArMTUyOCwxMCBAQAogICoJaW50ZXJydXB0CiAgKgogICovCi1zdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2F1dGhyZXEod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpCitzdGF0aWMgdm9pZCBwcmlzbTJzdGFfaW5mX2F1dGhyZXEoc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYsCisJCQkJICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKCppbmYpKTsKQEAgLTE1NDIsMTEgKzE1NDMsMTEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfYXV0aHJlcV9kZWZlcih3bGFuZGV2aWNlX3QgKndsYW5kZXYsCi0JCQkJCWhmYTM4NHhfSW5mRnJhbWVfdCAqaW5mKQorc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9hdXRocmVxX2RlZmVyKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCQlzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OwotCWhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhX3QgcmVjOworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CisJc3RydWN0IGhmYTM4NHhfYXV0aGVudGljYXRlU3RhdGlvbl9kYXRhIHJlYzsKIAogCWludCBpLCBhZGRlZCwgcmVzdWx0LCBjbnQ7CiAJdTggKmFkZHI7CkBAIC0xNzE2LDEwICsxNzE3LDEwIEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglpbnRlcnJ1cHQKICAqLwotc3RhdGljIHZvaWQgcHJpc20yc3RhX2luZl9wc3VzZXJjbnQod2xhbmRldmljZV90ICp3bGFuZGV2LAotCQkJCSAgICBoZmEzODR4X0luZkZyYW1lX3QgKmluZikKK3N0YXRpYyB2b2lkIHByaXNtMnN0YV9pbmZfcHN1c2VyY250KHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LAorCQkJCSAgICBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewotCWhmYTM4NHhfdCAqaHcgPSB3bGFuZGV2LT5wcml2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAlody0+cHN1c2VyY291bnQgPSBsZTE2X3RvX2NwdShpbmYtPmluZm8ucHN1c2VyY250LnVzZXJjbnQpOwogfQpAQCAtMTc0MSw3ICsxNzQyLDcgQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi12b2lkIHByaXNtMnN0YV9ldl9pbmZvKHdsYW5kZXZpY2VfdCAqd2xhbmRldiwgaGZhMzg0eF9JbmZGcmFtZV90ICppbmYpCit2b2lkIHByaXNtMnN0YV9ldl9pbmZvKHN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2LCBzdHJ1Y3QgaGZhMzg0eF9JbmZGcmFtZSAqaW5mKQogewogCWluZi0+aW5mb3R5cGUgPSBsZTE2X3RvX2NwdShpbmYtPmluZm90eXBlKTsKIAkvKiBEaXNwYXRjaCAqLwpAQCAtMTgwOCw3ICsxODA5LDcgQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi12b2lkIHByaXNtMnN0YV9ldl90eGV4Yyh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBzdGF0dXMpCit2b2lkIHByaXNtMnN0YV9ldl90eGV4YyhzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTE2IHN0YXR1cykKIHsKIAlwcl9kZWJ1ZygiVHhFeGMgc3RhdHVzPTB4JXguXG4iLCBzdGF0dXMpOwogfQpAQCAtMTgyOSw3ICsxODMwLDcgQEAKICAqIENhbGwgY29udGV4dDoKICAqCWludGVycnVwdAogICovCi12b2lkIHByaXNtMnN0YV9ldl90eCh3bGFuZGV2aWNlX3QgKndsYW5kZXYsIHUxNiBzdGF0dXMpCit2b2lkIHByaXNtMnN0YV9ldl90eChzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiwgdTE2IHN0YXR1cykKIHsKIAlwcl9kZWJ1ZygiVHggQ29tcGxldGUsIHN0YXR1cz0weCUwNHhcbiIsIHN0YXR1cyk7CiAJLyogdXBkYXRlIGxpbnV4IG5ldHdvcmsgc3RhdHMgKi8KQEAgLTE4NTIsNyArMTg1Myw3IEBACiAgKiBDYWxsIGNvbnRleHQ6CiAgKglpbnRlcnJ1cHQKICAqLwotdm9pZCBwcmlzbTJzdGFfZXZfYWxsb2Mod2xhbmRldmljZV90ICp3bGFuZGV2KQordm9pZCBwcmlzbTJzdGFfZXZfYWxsb2Moc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYpCiB7CiAJbmV0aWZfd2FrZV9xdWV1ZSh3bGFuZGV2LT5uZXRkZXYpOwogfQpAQCAtMTg2MCwxNCArMTg2MSwxNCBAQAogLyoKICogY3JlYXRlX3dsYW4KICoKLSogQ2FsbGVkIGF0IG1vZHVsZSBpbml0IHRpbWUuICBUaGlzIGNyZWF0ZXMgdGhlIHdsYW5kZXZpY2VfdCBzdHJ1Y3R1cmUKKyogQ2FsbGVkIGF0IG1vZHVsZSBpbml0IHRpbWUuICBUaGlzIGNyZWF0ZXMgdGhlIHN0cnVjdCB3bGFuZGV2aWNlIHN0cnVjdHVyZQogKiBhbmQgaW5pdGlhbGl6ZXMgaXQgd2l0aCByZWxldmFudCBiaXRzLgogKgogKiBBcmd1bWVudHM6CiAqCW5vbmUKICoKICogUmV0dXJuczoKLSoJdGhlIGNyZWF0ZWQgd2xhbmRldmljZV90IHN0cnVjdHVyZS4KKyoJdGhlIGNyZWF0ZWQgc3RydWN0IHdsYW5kZXZpY2Ugc3RydWN0dXJlLgogKgogKiBTaWRlIGVmZmVjdHM6CiAqCWFsc28gYWxsb2NhdGVzIHRoZSBwcml2L2h3IHN0cnVjdHVyZXMuCkBAIC0xODc2LDE0ICsxODc3LDE0IEBACiAqCXByb2Nlc3MgdGhyZWFkCiAqCiAqLwotc3RhdGljIHdsYW5kZXZpY2VfdCAqY3JlYXRlX3dsYW4odm9pZCkKK3N0YXRpYyBzdHJ1Y3Qgd2xhbmRldmljZSAqY3JlYXRlX3dsYW4odm9pZCkKIHsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXYgPSBOVUxMOwotCWhmYTM4NHhfdCAqaHcgPSBOVUxMOworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgaGZhMzg0eCAqaHcgPSBOVUxMOwogCiAJLyogQWxsb2Mgb3VyIHN0cnVjdHVyZXMgKi8KLQl3bGFuZGV2ID0ga3phbGxvYyhzaXplb2Yod2xhbmRldmljZV90KSwgR0ZQX0tFUk5FTCk7Ci0JaHcgPSBremFsbG9jKHNpemVvZihoZmEzODR4X3QpLCBHRlBfS0VSTkVMKTsKKwl3bGFuZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdsYW5kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlodyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoZmEzODR4KSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXdsYW5kZXYgfHwgIWh3KSB7CiAJCWtmcmVlKHdsYW5kZXYpOwpAQCAtMTkxMywxMSArMTkxNCwxMSBAQAogCiB2b2lkIHByaXNtMnN0YV9jb21tc3F1YWxfZGVmZXIoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQogewotCWhmYTM4NHhfdCAqaHcgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGhmYTM4NHgsIGNvbW1zcXVhbF9iaCk7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2ID0gaHctPndsYW5kZXY7Ci0JaGZhMzg0eF9ieXRlc3RyMzJfdCBzc2lkOworCXN0cnVjdCBoZmEzODR4ICpodyA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaGZhMzg0eCwgY29tbXNxdWFsX2JoKTsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldiA9IGh3LT53bGFuZGV2OworCXN0cnVjdCBoZmEzODR4X2J5dGVzdHIzMiBzc2lkOwogCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWliZ2V0IG1zZzsKLQlwODAyMTFpdGVtX3VpbnQzMl90ICptaWJpdGVtID0gKHA4MDIxMWl0ZW1fdWludDMyX3QgKikKKwlzdHJ1Y3QgcDgwMjExaXRlbV91aW50MzIgKm1pYml0ZW0gPSAoc3RydWN0IHA4MDIxMWl0ZW1fdWludDMyICopCiAJCQkJCQkmbXNnLm1pYmF0dHJpYnV0ZS5kYXRhOwogCWludCByZXN1bHQgPSAwOwogCkBAIC0xOTUwLDcgKzE5NTEsNyBAQAogCS8qIEdldCB0aGUgc2lnbmFsIHJhdGUgKi8KIAltc2cubXNnY29kZSA9IERJRG1zZ19kb3QxMXJlcV9taWJnZXQ7CiAJbWliaXRlbS0+ZGlkID0gRElEbWliX3AyX3AyTUFDX3AyQ3VycmVudFR4UmF0ZTsKLQlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCAqKSAmbXNnKTsKKwlyZXN1bHQgPSBwODAyMTFyZXFfZG9yZXF1ZXN0KHdsYW5kZXYsICh1OCAqKSZtc2cpOwogCiAJaWYgKHJlc3VsdCkgewogCQlwcl9kZWJ1ZygiZ2V0IHNpZ25hbCByYXRlIGZhaWxlZCwgcmVzdWx0ID0gJWRcbiIsCkBAIC0xOTkzLDggKzE5OTQsOCBAQAogCQkJIEhGQTM4NHhfUklEX0NVUlJFTlRTU0lELCByZXN1bHQpOwogCQlyZXR1cm47CiAJfQotCXByaXNtMm1nbXRfYnl0ZXN0cjJwc3RyKChzdHJ1Y3QgaGZhMzg0eF9ieXRlc3RyICopICZzc2lkLAotCQkJCShwODAyMTFwc3RyZF90ICopICZ3bGFuZGV2LT5zc2lkKTsKKwlwcmlzbTJtZ210X2J5dGVzdHIycHN0cigoc3RydWN0IGhmYTM4NHhfYnl0ZXN0ciAqKSZzc2lkLAorCQkJCShzdHJ1Y3QgcDgwMjExcHN0cmQgKikmd2xhbmRldi0+c3NpZCk7CiAKIAkvKiBSZXNjaGVkdWxlIHRpbWVyICovCiAJbW9kX3RpbWVyKCZody0+Y29tbXNxdWFsX3RpbWVyLCBqaWZmaWVzICsgSFopOwpAQCAtMjAwMiw3ICsyMDAzLDcgQEAKIAogdm9pZCBwcmlzbTJzdGFfY29tbXNxdWFsX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQloZmEzODR4X3QgKmh3ID0gKGhmYTM4NHhfdCAqKSBkYXRhOworCXN0cnVjdCBoZmEzODR4ICpodyA9IChzdHJ1Y3QgaGZhMzg0eCAqKWRhdGE7CiAKIAlzY2hlZHVsZV93b3JrKCZody0+Y29tbXNxdWFsX2JoKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMnVzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ydXNiLmMKaW5kZXggYjI2ZDA5Zi4uYmZiNmIwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ydXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ydXNiLmMKQEAgLTQ3LDExICs0NywxMSBAQAogCVBSSVNNX0RFVigweDBiYjIsIDB4MDMwMiwgIkFtYml0IE1pY3Jvc3lzdGVtcyBDb3JwLiIpLAogCVBSSVNNX0RFVigweDkwMTYsIDB4MTgyZCwgIlNpdGVjb20gV0wtMDIyIDgwMi4xMWIgVVNCIEFkYXB0ZXIiKSwKIAlQUklTTV9ERVYoMHgwNTQzLCAweDBmMDEsCi0JCSJWaWV3U29uaWMgQWlyc3luYyBVU0IgQWRhcHRlciAxMU1icHMgKFByaXNtMi41KSIpLAorCQkgICJWaWV3U29uaWMgQWlyc3luYyBVU0IgQWRhcHRlciAxMU1icHMgKFByaXNtMi41KSIpLAogCVBSSVNNX0RFVigweDA2N2MsIDB4MTAyMiwKLQkJIlNpZW1lbnMgU3BlZWRTdHJlYW0gMTAyMiAxMU1icHMgV0xBTiBVU0IgQWRhcHRlciIpLAorCQkgICJTaWVtZW5zIFNwZWVkU3RyZWFtIDEwMjIgMTFNYnBzIFdMQU4gVVNCIEFkYXB0ZXIiKSwKIAlQUklTTV9ERVYoMHgwNDlmLCAweDAwMzMsCi0JCSJDb21wYXEvSW50ZWwgVzEwMCBQUk8vV2lyZWxlc3MgMTFNYnBzIG11bHRpcG9ydCBXTEFOIEFkYXB0ZXIiKSwKKwkJICAiQ29tcGFxL0ludGVsIFcxMDAgUFJPL1dpcmVsZXNzIDExTWJwcyBtdWx0aXBvcnQgV0xBTiBBZGFwdGVyIiksCiAJeyB9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdXNiX3ByaXNtX3RibCk7CkBAIC02MSw4ICs2MSw4IEBACiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldjsKIAotCXdsYW5kZXZpY2VfdCAqd2xhbmRldiA9IE5VTEw7Ci0JaGZhMzg0eF90ICpodyA9IE5VTEw7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXYgPSBOVUxMOworCXN0cnVjdCBoZmEzODR4ICpodyA9IE5VTEw7CiAJaW50IHJlc3VsdCA9IDA7CiAKIAlkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CkBAIC03NCw3ICs3NCw3IEBACiAJfQogCWh3ID0gd2xhbmRldi0+cHJpdjsKIAotCWlmICh3bGFuX3NldHVwKHdsYW5kZXYsICYoaW50ZXJmYWNlLT5kZXYpKSAhPSAwKSB7CisJaWYgKHdsYW5fc2V0dXAod2xhbmRldiwgJmludGVyZmFjZS0+ZGV2KSAhPSAwKSB7CiAJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAid2xhbl9zZXR1cCgpIGZhaWxlZC5cbiIpOwogCQlyZXN1bHQgPSAtRUlPOwogCQlnb3RvIGZhaWxlZDsKQEAgLTg3LDcgKzg3LDcgQEAKIAkvKiBSZWdpc3RlciB0aGUgd2xhbmRldiwgdGhpcyBnZXRzIHVzIGEgbmFtZSBhbmQgcmVnaXN0ZXJzIHRoZQogCSAqIGxpbnV4IG5ldGRldmljZS4KIAkgKi8KLQlTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICYoaW50ZXJmYWNlLT5kZXYpKTsKKwlTRVRfTkVUREVWX0RFVih3bGFuZGV2LT5uZXRkZXYsICZpbnRlcmZhY2UtPmRldik7CiAKIAkvKiBEbyBhIGNoaXAtbGV2ZWwgcmVzZXQgb24gdGhlIE1BQyAqLwogCWlmIChwcmlzbTJfZG9yZXNldCkgewpAQCAtMTM0LDE1ICsxMzQsMTUgQEAKIAogc3RhdGljIHZvaWQgcHJpc20yc3RhX2Rpc2Nvbm5lY3RfdXNiKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCiB7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2OworCXN0cnVjdCB3bGFuZGV2aWNlICp3bGFuZGV2OwogCi0Jd2xhbmRldiA9ICh3bGFuZGV2aWNlX3QgKil1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7Ci0JaWYgKHdsYW5kZXYgIT0gTlVMTCkgeworCXdsYW5kZXYgPSAoc3RydWN0IHdsYW5kZXZpY2UgKil1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJaWYgKHdsYW5kZXYpIHsKIAkJTElTVF9IRUFEKGNsZWFubGlzdCk7Ci0JCWhmYTM4NHhfdXNiY3RseF90ICpjdGx4LCAqdGVtcDsKKwkJc3RydWN0IGhmYTM4NHhfdXNiY3RseCAqY3RseCwgKnRlbXA7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQkJaGZhMzg0eF90ICpodyA9IHdsYW5kZXYtPnByaXY7CisJCXN0cnVjdCBoZmEzODR4ICpodyA9IHdsYW5kZXYtPnByaXY7CiAKIAkJaWYgKCFodykKIAkJCWdvdG8gZXhpdDsKQEAgLTIxNiwxMiArMjE2LDEyIEBACiAKICNpZmRlZiBDT05GSUdfUE0KIHN0YXRpYyBpbnQgcHJpc20yc3RhX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKLQkJCQlwbV9tZXNzYWdlX3QgbWVzc2FnZSkKKwkJCSAgICAgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCiB7Ci0JaGZhMzg0eF90ICpodyA9IE5VTEw7Ci0Jd2xhbmRldmljZV90ICp3bGFuZGV2OworCXN0cnVjdCBoZmEzODR4ICpodyA9IE5VTEw7CisJc3RydWN0IHdsYW5kZXZpY2UgKndsYW5kZXY7CiAKLQl3bGFuZGV2ID0gKHdsYW5kZXZpY2VfdCAqKXVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwl3bGFuZGV2ID0gKHN0cnVjdCB3bGFuZGV2aWNlICopdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwogCWlmICghd2xhbmRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTI0MSwxMCArMjQxLDEwIEBACiBzdGF0aWMgaW50IHByaXNtMnN0YV9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKIAlpbnQgcmVzdWx0ID0gMDsKLQloZmEzODR4X3QgKmh3ID0gTlVMTDsKLQl3bGFuZGV2aWNlX3QgKndsYW5kZXY7CisJc3RydWN0IGhmYTM4NHggKmh3ID0gTlVMTDsKKwlzdHJ1Y3Qgd2xhbmRldmljZSAqd2xhbmRldjsKIAotCXdsYW5kZXYgPSAod2xhbmRldmljZV90ICopdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCXdsYW5kZXYgPSAoc3RydWN0IHdsYW5kZXZpY2UgKil1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CiAJaWYgKCF3bGFuZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwppbmRleCBkNTZlZjE0Li4wYzc4NDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwpAQCAtNjIsNyArNjIsNiBAQAogCXVuc2lnbmVkIHNob3J0IE1vZGVObyA9IG1vZGVubzsKIAl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCA9IDAsIENsb2NrSW5kZXggPSAwOwogCXVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCA9IDA7Ci0JaW50IENsb2NrOwogCiAJSW5pdFRvMzMwUG9pbnRlcihId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlLCBYR0lfUHIpOwogCkBAIC03Myw5ICs3Miw3IEBACiAKIAlDbG9ja0luZGV4ID0gWEdJMzMwX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0NSVFZDTEs7CiAKLQlDbG9jayA9IFhHSV9WQ0xLRGF0YVtDbG9ja0luZGV4XS5DTE9DSyAqIDEwMDA7Ci0KLQlyZXR1cm4gQ2xvY2s7CisJcmV0dXJuIFhHSV9WQ0xLRGF0YVtDbG9ja0luZGV4XS5DTE9DSyAqIDEwMDA7CiB9CiAKIHN0YXRpYyBpbnQgWEdJZmJfbW9kZV9yYXRlX3RvX2RkYXRhKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqWEdJX1ByLApAQCAtMTIyNyw3ICsxMjI0LDcgQEAKIAl1bnNpZ25lZCBpbnQgdnRvdGFsID0gMDsKIAl1bnNpZ25lZCBpbnQgZHJhdGUgPSAwLCBocmF0ZSA9IDA7CiAJaW50IGZvdW5kX21vZGUgPSAwOwotCWludCByZWZyZXNoX3JhdGUsIHNlYXJjaF9pZHg7CisJaW50IHNlYXJjaF9pZHg7CiAKIAlpZiAoKHZhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEKSB7CiAJCXZ0b3RhbCA9IHZhci0+dXBwZXJfbWFyZ2luICsgdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4KQEAgLTEyNjMsMTAgKzEyNjAsNiBAQAogCQl4Z2lmYl9pbmZvLT5yZWZyZXNoX3JhdGUgPSA2MDsKIAl9CiAKLQkvKiBDYWxjdWxhdGlvbiB3cm9uZyBmb3IgMTAyNHg2MDAgLSBmb3JjZSBpdCB0byA2MEh6ICovCi0JaWYgKCh2YXItPnhyZXMgPT0gMTAyNCkgJiYgKHZhci0+eXJlcyA9PSA2MDApKQotCQlyZWZyZXNoX3JhdGUgPSA2MDsKLQogCXNlYXJjaF9pZHggPSAwOwogCXdoaWxlICgoWEdJYmlvc19tb2RlW3NlYXJjaF9pZHhdLm1vZGVfbm8gIT0gMCkgJiYKIAkJKFhHSWJpb3NfbW9kZVtzZWFyY2hfaWR4XS54cmVzIDw9IHZhci0+eHJlcykpIHsKQEAgLTIwODUsNyArMjA3OCw3IEBACiB7CiAJY2hhciAqb3B0aW9uID0gTlVMTDsKIAotCWlmIChmb3JjZWNydDJ0eXBlICE9IE5VTEwpCisJaWYgKGZvcmNlY3J0MnR5cGUpCiAJCVhHSWZiX3NlYXJjaF9jcnQydHlwZShmb3JjZWNydDJ0eXBlKTsKIAlpZiAoZmJfZ2V0X29wdGlvbnMoInhnaWZiIiwgJm9wdGlvbikpCiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuYyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zZXRtb2RlLmMKaW5kZXggNTBjOGVhNC4uZDgwMTBjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc2V0bW9kZS5jCkBAIC0yMTQsNyArMjE0LDcgQEAKIAkJaWYgKCEocFZCSW5mby0+VkJJbmZvICYgVFZTZXRQQUwpICYmCiAJCSAgICAobW9kZWZsYWcgJiBOb1N1cHBvcnRTaW11VFYpICYmCiAJCSAgICAocFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpICYmCi0JCSAgICAoIShwVkJJbmZvLT5WQkluZm8gJiBTZXROb3RTaW11TW9kZSkpKQorCQkgICAgIShwVkJJbmZvLT5WQkluZm8gJiBTZXROb3RTaW11TW9kZSkpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE2NDcsNyArMTY0Nyw2IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBYR0lfR2V0VkNMS1B0cih1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCiAJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0KIAl1bnNpZ25lZCBzaG9ydCBpbmRleCwgbW9kZWZsYWc7CiAJdW5zaWduZWQgY2hhciB0ZW1wYWw7CiAKQEAgLTE2NTUsNyArMTY1NCw3IEBACiAJbW9kZWZsYWcgPSBYR0kzMzBfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7CiAKIAlpZiAoKHBWQkluZm8tPlNldEZsYWcgJiBQcm9ncmFtbWluZ0NSVDIpICYmCi0JICAgICghKHBWQkluZm8tPkxDREluZm8gJiBFbmFibGVTY2FsaW5nTENEKSkpIHsgLyoge0xDREEvTENEQn0gKi8KKwkgICAgIShwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlU2NhbGluZ0xDRCkpIHsgLyoge0xDREEvTENEQn0gKi8KIAkJaW5kZXggPSBYR0lfR2V0TENEQ2FwUHRyKHBWQkluZm8pOwogCQl0ZW1wYWwgPSBwVkJJbmZvLT5MQ0RDYXBMaXN0W2luZGV4XS5MQ0RfVkNMSzsKIApAQCAtMTY3OCw3ICsxNjc3LDYgQEAKIAkJCQkJaWYgKCEobW9kZWZsYWcgJiBDaGFyeDhEb3QpKQogCQkJCQkJdGVtcGFsID0gVFZDTEtCQVNFXzMxNSArCiAJCQkJCQkJCUhpVFZUZXh0VkNMSzsKLQogCQkJCX0KIAkJCQlyZXR1cm4gdGVtcGFsOwogCQkJfQpAQCAtMTcxNiw3ICsxNzE0LDcgQEAKIHsKIAlpZiAocFZCSW5mby0+VkJUeXBlICYgKFZCX1NJUzMwMSB8IFZCX1NJUzMwMUIgfCBWQl9TSVMzMDJCCiAJCQl8IFZCX1NJUzMwMUxWIHwgVkJfU0lTMzAyTFYgfCBWQl9YR0kzMDFDKSkgewotCQlpZiAoKCEocFZCSW5mby0+VkJJbmZvICYgWEdJX1NldENSVDJUb0xDREEpKSAmJgorCQlpZiAoIShwVkJJbmZvLT5WQkluZm8gJiBYR0lfU2V0Q1JUMlRvTENEQSkgJiYKIAkJICAgIChwVkJJbmZvLT5TZXRGbGFnICYgUHJvZ3JhbW1pbmdDUlQyKSkgewogCQkJKmRpXzAgPSBYR0lfVkJWQ0xLRGF0YVt0ZW1wYWxdLlBhcnQ0X0E7CiAJCQkqZGlfMSA9IFhHSV9WQlZDTEtEYXRhW3RlbXBhbF0uUGFydDRfQjsKQEAgLTE3NDEsOCArMTczOSw4IEBACiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4MzEsIH4weDMwLAogCQkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTAgKiBpKSk7Ci0JCWlmICgoIShwVkJJbmZvLT5WQkluZm8gJiBYR0lfU2V0Q1JUMlRvTENEQSkpCi0JCQkJJiYgKCEocFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSkgeworCQlpZiAoIShwVkJJbmZvLT5WQkluZm8gJiBYR0lfU2V0Q1JUMlRvTENEQSkgJiYKKwkJICAgICEocFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB7CiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MmUsIGRpXzApOwogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDJmLCBkaV8xKTsKIAkJfSBlbHNlIHsKQEAgLTE5MTUsNyArMTkxMyw3IEBACiAJCX0KIAl9CiAKLQlpZiAocFZCSW5mby0+VkJUeXBlICYgKFZCX1NJUzMwMUxWfFZCX1NJUzMwMkxWfFZCX1hHSTMwMUMpKSB7CisJaWYgKHBWQkluZm8tPlZCVHlwZSAmIChWQl9TSVMzMDFMViB8IFZCX1NJUzMwMkxWIHwgVkJfWEdJMzAxQykpIHsKIAkJaWYgKHRlbXAgJiBTZXRZUGJQcikgewogCQkJLyogc2hhbXBvbyBhZGQgZm9yIG5ldyBzY3JhdGNoICovCiAJCQl0ZW1wID0geGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2Q0LCAweDM1KTsKQEAgLTE5ODYsNyArMTk4NCw3IEBACiAJfQogCiAJaWYgKCEodGVtcGJ4ICYgRGlzYWJsZUNSVDJEaXNwbGF5KSkgewotCQlpZiAoKCEodGVtcGJ4ICYgRHJpdmVyTW9kZSkpIHx8ICghKG1vZGVmbGFnICYgQ1JUMk1vZGUpKSkgeworCQlpZiAoISh0ZW1wYnggJiBEcml2ZXJNb2RlKSB8fCAhKG1vZGVmbGFnICYgQ1JUMk1vZGUpKSB7CiAJCQlpZiAoISh0ZW1wYnggJiBYR0lfU2V0Q1JUMlRvTENEQSkpCiAJCQkJdGVtcGJ4IHw9IChTZXRJblNsYXZlTW9kZSB8IFNldFNpbXVTY2FuTW9kZSk7CiAJCX0KQEAgLTIxMzIsNyArMjEzMCw3IEBACiAKIAlpZiAoKHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWxfMTQwMHgxMDUwKSAmJgogCSAgICAocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvTENEKSAmJiAocmVzaW5mbyA9PSA5KSAmJgotCSAgICAoISh0ZW1wYnggJiBFbmFibGVTY2FsaW5nTENEKSkpCisJICAgICEodGVtcGJ4ICYgRW5hYmxlU2NhbGluZ0xDRCkpCiAJCS8qCiAJCSAqIHNldCB0byBjZW50ZXIgaW4gMTI4MHgxMDI0IExDREIKIAkJICogZm9yIFBhbmVsXzE0MDB4MTA1MApAQCAtMjI0NSw3ICsyMjQzLDYgQEAKIAogCQkvKiBDUiBCNFsxXSAqLwogCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4QjQsIH4weDAyLCB0ZW1wKTsKLQogCX0KIAogCXRlbXAgPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzZDQsIDB4NDgpOwpAQCAtMjI3NCw3ICsyMjcxLDYgQEAKIAogCQkvKiBDUiBCNFsxXSAqLwogCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4QjQsIH4weDAyLCB0ZW1wKTsKLQogCX0KIAl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4QjQsIH50ZW1wYmgwLCB0ZW1wYmwwKTsKIApAQCAtMjI5MSw3ICsyMjg3LDYgQEAKIAkJc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqcFhHSUhXREUsCiAJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLQogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNjNCwgMHgwMSwgMHhERiwgMHgwMCk7CiAJaWYgKHBYR0lIV0RFLT5qQ2hpcFR5cGUgPT0gWEcyMSkgewogCQlpZiAocFZCSW5mby0+SUZfREVGX0xWRFMgPT0gMSkgewpAQCAtMjMxMCw3ICsyMzA1LDYgQEAKIAkJCS8qIERWTy9EVkkgc2lnbmFsIG9uICovCiAJCQlYR0lfWEcyMUJMU2lnbmFsVkREKDB4MjAsIDB4MjAsIHBWQkluZm8pOwogCQl9Ci0KIAl9CiAKIAlpZiAocFhHSUhXREUtPmpDaGlwVHlwZSA9PSBYRzI3KSB7CkBAIC0yMzMwLDcgKzIzMjQsNiBAQAogCQkJLyogRFZPL0RWSSBzaWduYWwgb24gKi8KIAkJCVhHSV9YRzI3QkxTaWduYWxWREQoMHgyMCwgMHgyMCwgcFZCSW5mbyk7CiAJCX0KLQogCX0KIH0KIApAQCAtMjMzOCw3ICsyMzMxLDYgQEAKIAkJc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqcFhHSUhXREUsCiAJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLQogCWlmIChwWEdJSFdERS0+akNoaXBUeXBlID09IFhHMjEpIHsKIAkJaWYgKHBWQkluZm8tPklGX0RFRl9MVkRTID09IDEpIHsKIAkJCS8qIExWRFMgYmFja2xpZ2h0IG9mZiAqLwpAQCAtMjQ1NSw3ICsyNDQ3LDYgQEAKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJX0lzTENERHVhbExpbmsoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotCiAJaWYgKChwVkJJbmZvLT5WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgWEdJX1NldENSVDJUb0xDREEpKSAmJgogCQkJKHBWQkluZm8tPkxDREluZm8gJiBTZXRMQ0REdWFsTGluaykpIC8qIHNoYW1wb28wMTI5ICovCiAJCXJldHVybiAxOwpAQCAtMzkyMiw3ICszOTEzLDcgQEAKIAkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIGksIFRhcDRUaW1pbmdQdHItPlJlZ1tqXSk7CiAKIAlpZiAoKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb1RWKSAmJgotCSAgICAoIShwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikpKSB7CisJICAgICEocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pKSB7CiAJCS8qIFNldCBWZXJ0aWNhbCBTY2FsaW5nICovCiAJCVRhcDRUaW1pbmdQdHIgPSBYR0lfR2V0VGFwNFB0cigxLCBwVkJJbmZvKTsKIAkJZm9yIChpID0gMHhDMCwgaiA9IDA7IGkgPCAweEZGOyBpKyssIGorKykKQEAgLTM5MzIsNyArMzkyMyw3IEBACiAJfQogCiAJaWYgKChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UVikgJiYKLQkgICAgKCEocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvSGlWaXNpb24pKSkKKwkgICAgIShwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvbikpCiAJCS8qIEVuYWJsZSBWLlNjYWxpbmcgKi8KIAkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4NEUsIH4weDE0LCAweDA0KTsKIAllbHNlCkBAIC00MTMyLDcgKzQxMjMsNiBAQAogCQlpZiAocFZCSW5mby0+VkJJbmZvICYgKFNldENSVDJUb1RWIHwgU2V0Q1JUMlRvSGlWaXNpb24pKSB7CiAJCQlpZiAocFZCSW5mby0+VkdBSERFID4gODAwKQogCQkJCXhnaWZiX3JlZ19vcihwVkJJbmZvLT5QYXJ0NFBvcnQsIDB4MUUsIDB4MDgpOwotCiAJCX0KIAkJdGVtcCA9IDB4MDAzNjsKIApAQCAtNDE0MSw5ICs0MTMxLDkgQEAKIAkJCQkJfCBUVlNldFlQYlByNTI1cCB8IFRWU2V0WVBiUHI3NTBwCiAJCQkJCXwgVFZTZXRIaVZpc2lvbikpKSB7CiAJCQkJdGVtcCB8PSAweDAwMDE7Ci0JCQkJaWYgKChwVkJJbmZvLT5WQkluZm8gJiBTZXRJblNsYXZlTW9kZSkKLQkJCQkJCSYmICghKHBWQkluZm8tPlRWSW5mbwotCQkJCQkJCQkmIFRWU2ltdU1vZGUpKSkKKwkJCQlpZiAoKHBWQkluZm8tPlZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSAmJgorCQkJCQkJIShwVkJJbmZvLT5UVkluZm8KKwkJCQkJCQkJJiBUVlNpbXVNb2RlKSkKIAkJCQkJdGVtcCAmPSAofjB4MDAwMSk7CiAJCQl9CiAJCX0KQEAgLTQzODksNyArNDM3OSw2IEBACiAJCQkJCSh2YWx1ZSA8PCAyKSAmIDB4N0MpOwogCiAJZm9yICh0ZW1wID0gMCwgdmFsdWUgPSAwOyB0ZW1wIDwgMzsgdGVtcCsrKSB7Ci0KIAkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDMxLCB+MHgzMCwgdmFsdWUpOwogCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsCiAJCQkgICAgICAweDJCLCB4Z2lmYl9pbmZvLT5sdmRzX2RhdGEuVkNMS0RhdGExKTsKQEAgLTQ0MDksNyArNDM5OCw2IEBACiAKIAkJaW5iKHBWQkluZm8tPlAzZGEpOyAvKiByZXNldCAzZGEgKi8KIAl9Ci0KIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00NDc2LDcgKzQ0NjQsNyBAQAogCiAJCWlmICgocFZCSW5mby0+VkJJbmZvICYKIAkJCShEaXNhYmxlQ1JUMkRpc3BsYXkgfCBTZXRTaW11U2Nhbk1vZGUpKSB8fAotCQkgICAgKCghKHBWQkluZm8tPlZCSW5mbyAmIFhHSV9TZXRDUlQyVG9MQ0RBKSkgJiYKKwkJICAgICghKHBWQkluZm8tPlZCSW5mbyAmIFhHSV9TZXRDUlQyVG9MQ0RBKSAmJgogCQkgICAgKHBWQkluZm8tPlZCSW5mbyAmCiAJCQkoU2V0Q1JUMlRvUkFNREFDIHwgU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvVFYpKSkpCiAJCQl4Z2lmYl9yZWdfb3IocFZCSW5mby0+UGFydDFQb3J0LCAweDAwLCAweDgwKTsKQEAgLTQ1ODcsNyArNDU3NSw3IEBACiAKIAlpZiAocFZCSW5mby0+VkJUeXBlICYgKFZCX1NJUzMwMUIgfCBWQl9TSVMzMDJCIHwgVkJfU0lTMzAxTFYKIAkJCXwgVkJfU0lTMzAyTFYgfCBWQl9YR0kzMDFDKSkgewotCQlpZiAoKCEocFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSB8fCAocFZCSW5mby0+VFZJbmZvCisJCWlmICghKHBWQkluZm8tPlZCSW5mbyAmIFNldEluU2xhdmVNb2RlKSB8fCAocFZCSW5mby0+VFZJbmZvCiAJCQkJJiBUVlNpbXVNb2RlKSkgewogCQkJKnRlbXBieCArPSA4OwogCQkJKnRlbXBjbCArPSAxOwpAQCAtNDk4OCw4ICs0OTc2LDggQEAKIAlpZiAocFZCSW5mby0+VkJJbmZvICYgKFNldENSVDJUb1JBTURBQyB8IFNldENSVDJUb1RWIHwgU2V0Q1JUMlRvTENECiAJCQl8IFhHSV9TZXRDUlQyVG9MQ0RBKSkgewogCQl0ZW1wYWggJj0gKH4weDA4KTsKLQkJaWYgKChwVkJJbmZvLT5Nb2RlVHlwZSA9PSBNb2RlVkdBKSAmJiAoIShwVkJJbmZvLT5WQkluZm8KLQkJCQkmIFNldEluU2xhdmVNb2RlKSkpIHsKKwkJaWYgKChwVkJJbmZvLT5Nb2RlVHlwZSA9PSBNb2RlVkdBKSAmJiAhKHBWQkluZm8tPlZCSW5mbworCQkJCSYgU2V0SW5TbGF2ZU1vZGUpKSB7CiAJCQl0ZW1wYWggfD0gMHgwMTA7CiAJCX0KIAkJdGVtcGFoIHw9IDB4MDgwOwpAQCAtNTQxNiw3ICs1NDA0LDYgQEAKIAlpZiAoSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSA+PSBYRzIxKSB7CiAJCXRlbXAgPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzZDQsIDB4MzgpOwogCQlpZiAodGVtcCAmIDB4QTApIHsKLQogCQkJaWYgKEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPT0gWEcyNykKIAkJCQlYR0lfU2V0WEcyN0NSVEMoUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvKTsKIAkJCWVsc2UKQEAgLTU0ODYsNyArNTQ3Myw3IEBACiAJCVhHSV9EaXNhYmxlQnJpZGdlKHhnaWZiX2luZm8sIEh3RGV2aWNlRXh0ZW5zaW9uLCBwVkJJbmZvKTsKIAogCQlpZiAocFZCSW5mby0+VkJJbmZvICYgKFNldFNpbXVTY2FuTW9kZSB8IFhHSV9TZXRDUlQyVG9MQ0RBKSB8fAotCQkJKCEocFZCSW5mby0+VkJJbmZvICYgU3dpdGNoQ1JUMikpKSB7CisJCQkhKHBWQkluZm8tPlZCSW5mbyAmIFN3aXRjaENSVDIpKSB7CiAJCQlYR0lfU2V0Q1JUMUdyb3VwKHhnaWZiX2luZm8sIEh3RGV2aWNlRXh0ZW5zaW9uLCBNb2RlTm8sCiAJCQkJCU1vZGVJZEluZGV4LCBwVkJJbmZvKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvY3hnYml0L2N4Z2JpdF9jbS5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvY3hnYml0L2N4Z2JpdF9jbS5jCmluZGV4IDBhZTBiMTMuLjJmYjFiZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2N4Z2JpdC9jeGdiaXRfY20uYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9jeGdiaXQvY3hnYml0X2NtLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CiAKKyNpbmNsdWRlIDxsaWJjeGdiX2NtLmg+CiAjaW5jbHVkZSAiY3hnYml0LmgiCiAjaW5jbHVkZSAiY2xpcF90YmwuaCIKIApAQCAtNzIsMTUgKzczLDYgQEAKIAlyZXR1cm4gd3Jfd2FpdHAtPnJldDsKIH0KIAotLyogUmV0dXJucyB3aGV0aGVyIGEgQ1BMIHN0YXR1cyBjb252ZXlzIG5lZ2F0aXZlIGFkdmljZS4KLSAqLwotc3RhdGljIGludCBjeGdiaXRfaXNfbmVnX2Fkdih1bnNpZ25lZCBpbnQgc3RhdHVzKQotewotCXJldHVybiBzdGF0dXMgPT0gQ1BMX0VSUl9SVFhfTkVHX0FEVklDRSB8fAotCQlzdGF0dXMgPT0gQ1BMX0VSUl9QRVJTSVNUX05FR19BRFZJQ0UgfHwKLQkJc3RhdHVzID09IENQTF9FUlJfS0VFUEFMVl9ORUdfQURWSUNFOwotfQotCiBzdGF0aWMgaW50IGN4Z2JpdF9ucF9oYXNoZm4oY29uc3Qgc3RydWN0IGN4Z2JpdF9ucCAqY25wKQogewogCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpY25wID4+IDEwKSAmIChOUF9JTkZPX0hBU0hfU0laRSAtIDEpOwpAQCAtNjIzLDIxICs2MTUsMTQgQEAKIHN0YXRpYyB2b2lkIGN4Z2JpdF9zZW5kX2hhbGZjbG9zZShzdHJ1Y3QgY3hnYml0X3NvY2sgKmNzaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSAqcmVxOwotCXVuc2lnbmVkIGludCBsZW4gPSByb3VuZHVwKHNpemVvZihzdHJ1Y3QgY3BsX2Nsb3NlX2Nvbl9yZXEpLCAxNik7CisJdTMyIGxlbiA9IHJvdW5kdXAoc2l6ZW9mKHN0cnVjdCBjcGxfY2xvc2VfY29uX3JlcSksIDE2KTsKIAogCXNrYiA9IGFsbG9jX3NrYihsZW4sIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKQogCQlyZXR1cm47CiAKLQlyZXEgPSAoc3RydWN0IGNwbF9jbG9zZV9jb25fcmVxICopX19za2JfcHV0KHNrYiwgbGVuKTsKLQltZW1zZXQocmVxLCAwLCBsZW4pOwotCi0Jc2V0X3dyX3R4cShza2IsIENQTF9QUklPUklUWV9EQVRBLCBjc2stPnR4cV9pZHgpOwotCUlOSVRfVFBfV1IocmVxLCBjc2stPnRpZCk7Ci0JT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfQ0xPU0VfQ09OX1JFUSwKLQkJCQkJCSAgICBjc2stPnRpZCkpOwotCXJlcS0+cnN2ZCA9IDA7CisJY3hnYl9ta19jbG9zZV9jb25fcmVxKHNrYiwgbGVuLCBjc2stPnRpZCwgY3NrLT50eHFfaWR4LAorCQkJICAgICAgTlVMTCwgTlVMTCk7CiAKIAljeGdiaXRfc2tjYl9mbGFncyhza2IpIHw9IFNLQ0JGX1RYX0ZMQUdfQ09NUEw7CiAJX19za2JfcXVldWVfdGFpbCgmY3NrLT50eHEsIHNrYik7CkBAIC02NjIsOSArNjQ3LDggQEAKIAogc3RhdGljIGludCBjeGdiaXRfc2VuZF9hYm9ydF9yZXEoc3RydWN0IGN4Z2JpdF9zb2NrICpjc2spCiB7Ci0Jc3RydWN0IGNwbF9hYm9ydF9yZXEgKnJlcTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gcm91bmR1cChzaXplb2YoKnJlcSksIDE2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBsZW4gPSByb3VuZHVwKHNpemVvZihzdHJ1Y3QgY3BsX2Fib3J0X3JlcSksIDE2KTsKIAogCXByX2RlYnVnKCIlczogY3NrICVwIHRpZCAldTsgc3RhdGUgJWRcbiIsCiAJCSBfX2Z1bmNfXywgY3NrLCBjc2stPnRpZCwgY3NrLT5jb20uc3RhdGUpOwpAQCAtNjc1LDE1ICs2NTksOSBAQAogCQljeGdiaXRfc2VuZF90eF9mbG93Y193cihjc2spOwogCiAJc2tiID0gX19za2JfZGVxdWV1ZSgmY3NrLT5za2JxKTsKLQlyZXEgPSAoc3RydWN0IGNwbF9hYm9ydF9yZXEgKilfX3NrYl9wdXQoc2tiLCBsZW4pOwotCW1lbXNldChyZXEsIDAsIGxlbik7CisJY3hnYl9ta19hYm9ydF9yZXEoc2tiLCBsZW4sIGNzay0+dGlkLCBjc2stPnR4cV9pZHgsCisJCQkgIGNzay0+Y29tLmNkZXYsIGN4Z2JpdF9hYm9ydF9hcnBfZmFpbHVyZSk7CiAKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGNzay0+dHhxX2lkeCk7Ci0JdDRfc2V0X2FycF9lcnJfaGFuZGxlcihza2IsIGNzay0+Y29tLmNkZXYsIGN4Z2JpdF9hYm9ydF9hcnBfZmFpbHVyZSk7Ci0JSU5JVF9UUF9XUihyZXEsIGNzay0+dGlkKTsKLQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9BQk9SVF9SRVEsCi0JCQkJCQkgICAgY3NrLT50aWQpKTsKLQlyZXEtPmNtZCA9IENQTF9BQk9SVF9TRU5EX1JTVDsKIAlyZXR1cm4gY3hnYml0X2wydF9zZW5kKGNzay0+Y29tLmNkZXYsIHNrYiwgY3NrLT5sMnQpOwogfQogCkBAIC03ODksMTA5ICs3NjcsNiBAQAogCWtmcmVlKGNzayk7CiB9CiAKLXN0YXRpYyB2b2lkCi1jeGdiaXRfZ2V0X3R1cGxlX2luZm8oc3RydWN0IGNwbF9wYXNzX2FjY2VwdF9yZXEgKnJlcSwgaW50ICppcHR5cGUsCi0JCSAgICAgIF9fdTggKmxvY2FsX2lwLCBfX3U4ICpwZWVyX2lwLCBfX2JlMTYgKmxvY2FsX3BvcnQsCi0JCSAgICAgIF9fYmUxNiAqcGVlcl9wb3J0KQotewotCXUzMiBldGhfbGVuID0gRVRIX0hEUl9MRU5fRyhiZTMyX3RvX2NwdShyZXEtPmhkcl9sZW4pKTsKLQl1MzIgaXBfbGVuID0gSVBfSERSX0xFTl9HKGJlMzJfdG9fY3B1KHJlcS0+aGRyX2xlbikpOwotCXN0cnVjdCBpcGhkciAqaXAgPSAoc3RydWN0IGlwaGRyICopKCh1OCAqKShyZXEgKyAxKSArIGV0aF9sZW4pOwotCXN0cnVjdCBpcHY2aGRyICppcDYgPSAoc3RydWN0IGlwdjZoZHIgKikoKHU4ICopKHJlcSArIDEpICsgZXRoX2xlbik7Ci0Jc3RydWN0IHRjcGhkciAqdGNwID0gKHN0cnVjdCB0Y3BoZHIgKikKLQkJCSAgICAgICgodTggKikocmVxICsgMSkgKyBldGhfbGVuICsgaXBfbGVuKTsKLQotCWlmIChpcC0+dmVyc2lvbiA9PSA0KSB7Ci0JCXByX2RlYnVnKCIlcyBzYWRkciAweCV4IGRhZGRyIDB4JXggc3BvcnQgJXUgZHBvcnQgJXVcbiIsCi0JCQkgX19mdW5jX18sCi0JCQkgbnRvaGwoaXAtPnNhZGRyKSwgbnRvaGwoaXAtPmRhZGRyKSwKLQkJCSBudG9ocyh0Y3AtPnNvdXJjZSksCi0JCQkgbnRvaHModGNwLT5kZXN0KSk7Ci0JCSppcHR5cGUgPSA0OwotCQltZW1jcHkocGVlcl9pcCwgJmlwLT5zYWRkciwgNCk7Ci0JCW1lbWNweShsb2NhbF9pcCwgJmlwLT5kYWRkciwgNCk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzIHNhZGRyICVwSTYgZGFkZHIgJXBJNiBzcG9ydCAldSBkcG9ydCAldVxuIiwKLQkJCSBfX2Z1bmNfXywKLQkJCSBpcDYtPnNhZGRyLnM2X2FkZHIsIGlwNi0+ZGFkZHIuczZfYWRkciwKLQkJCSBudG9ocyh0Y3AtPnNvdXJjZSksCi0JCQkgbnRvaHModGNwLT5kZXN0KSk7Ci0JCSppcHR5cGUgPSA2OwotCQltZW1jcHkocGVlcl9pcCwgaXA2LT5zYWRkci5zNl9hZGRyLCAxNik7Ci0JCW1lbWNweShsb2NhbF9pcCwgaXA2LT5kYWRkci5zNl9hZGRyLCAxNik7Ci0JfQotCi0JKnBlZXJfcG9ydCA9IHRjcC0+c291cmNlOwotCSpsb2NhbF9wb3J0ID0gdGNwLT5kZXN0OwotfQotCi1zdGF0aWMgaW50Ci1jeGdiaXRfb3VyX2ludGVyZmFjZShzdHJ1Y3QgY3hnYml0X2RldmljZSAqY2Rldiwgc3RydWN0IG5ldF9kZXZpY2UgKmVncmVzc19kZXYpCi17Ci0JdTggaTsKLQotCWVncmVzc19kZXYgPSBjeGdiaXRfZ2V0X3JlYWxfZGV2KGVncmVzc19kZXYpOwotCWZvciAoaSA9IDA7IGkgPCBjZGV2LT5sbGRpLm5wb3J0czsgaSsrKQotCQlpZiAoY2Rldi0+bGxkaS5wb3J0c1tpXSA9PSBlZ3Jlc3NfZGV2KQotCQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICoKLWN4Z2JpdF9maW5kX3JvdXRlNihzdHJ1Y3QgY3hnYml0X2RldmljZSAqY2RldiwgX191OCAqbG9jYWxfaXAsIF9fdTggKnBlZXJfaXAsCi0JCSAgIF9fYmUxNiBsb2NhbF9wb3J0LCBfX2JlMTYgcGVlcl9wb3J0LCB1OCB0b3MsCi0JCSAgIF9fdTMyIHNpbjZfc2NvcGVfaWQpCi17Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKLQotCWlmIChJU19FTkFCTEVEKENPTkZJR19JUFY2KSkgewotCQlzdHJ1Y3QgZmxvd2k2IGZsNjsKLQotCQltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwotCQltZW1jcHkoJmZsNi5kYWRkciwgcGVlcl9pcCwgMTYpOwotCQltZW1jcHkoJmZsNi5zYWRkciwgbG9jYWxfaXAsIDE2KTsKLQkJaWYgKGlwdjZfYWRkcl90eXBlKCZmbDYuZGFkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKLQkJCWZsNi5mbG93aTZfb2lmID0gc2luNl9zY29wZV9pZDsKLQkJZHN0ID0gaXA2X3JvdXRlX291dHB1dCgmaW5pdF9uZXQsIE5VTEwsICZmbDYpOwotCQlpZiAoIWRzdCkKLQkJCWdvdG8gb3V0OwotCQlpZiAoIWN4Z2JpdF9vdXJfaW50ZXJmYWNlKGNkZXYsIGlwNl9kc3RfaWRldihkc3QpLT5kZXYpICYmCi0JCSAgICAhKGlwNl9kc3RfaWRldihkc3QpLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSkgewotCQkJZHN0X3JlbGVhc2UoZHN0KTsKLQkJCWRzdCA9IE5VTEw7Ci0JCX0KLQl9Ci1vdXQ6Ci0JcmV0dXJuIGRzdDsKLX0KLQotc3RhdGljIHN0cnVjdCBkc3RfZW50cnkgKgotY3hnYml0X2ZpbmRfcm91dGUoc3RydWN0IGN4Z2JpdF9kZXZpY2UgKmNkZXYsIF9fYmUzMiBsb2NhbF9pcCwgX19iZTMyIHBlZXJfaXAsCi0JCSAgX19iZTE2IGxvY2FsX3BvcnQsIF9fYmUxNiBwZWVyX3BvcnQsIHU4IHRvcykKLXsKLQlzdHJ1Y3QgcnRhYmxlICpydDsKLQlzdHJ1Y3QgZmxvd2k0IGZsNDsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuOwotCi0JcnQgPSBpcF9yb3V0ZV9vdXRwdXRfcG9ydHMoJmluaXRfbmV0LCAmZmw0LCBOVUxMLCBwZWVyX2lwLAotCQkJCSAgIGxvY2FsX2lwLAotCQkJCSAgIHBlZXJfcG9ydCwgbG9jYWxfcG9ydCwgSVBQUk9UT19UQ1AsCi0JCQkJICAgdG9zLCAwKTsKLQlpZiAoSVNfRVJSKHJ0KSkKLQkJcmV0dXJuIE5VTEw7Ci0JbiA9IGRzdF9uZWlnaF9sb29rdXAoJnJ0LT5kc3QsICZwZWVyX2lwKTsKLQlpZiAoIW4pCi0JCXJldHVybiBOVUxMOwotCWlmICghY3hnYml0X291cl9pbnRlcmZhY2UoY2Rldiwgbi0+ZGV2KSAmJgotCSAgICAhKG4tPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7Ci0JCW5laWdoX3JlbGVhc2Uobik7Ci0JCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5laWdoX3JlbGVhc2Uobik7Ci0JcmV0dXJuICZydC0+ZHN0OwotfQotCiBzdGF0aWMgdm9pZCBjeGdiaXRfc2V0X3RjcF93aW5kb3coc3RydWN0IGN4Z2JpdF9zb2NrICpjc2ssIHN0cnVjdCBwb3J0X2luZm8gKnBpKQogewogCXVuc2lnbmVkIGludCBsaW5rc3BlZWQ7CkBAIC0xMDcyLDIxICs5NDcsMTQgQEAKIAogc3RhdGljIHZvaWQgY3hnYml0X3JlbGVhc2VfdGlkKHN0cnVjdCBjeGdiaXRfZGV2aWNlICpjZGV2LCB1MzIgdGlkKQogewotCXN0cnVjdCBjcGxfdGlkX3JlbGVhc2UgKnJlcTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gcm91bmR1cChzaXplb2YoKnJlcSksIDE2KTsKKwl1MzIgbGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF90aWRfcmVsZWFzZSksIDE2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJc2tiID0gYWxsb2Nfc2tiKGxlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFza2IpCiAJCXJldHVybjsKIAotCXJlcSA9IChzdHJ1Y3QgY3BsX3RpZF9yZWxlYXNlICopX19za2JfcHV0KHNrYiwgbGVuKTsKLQltZW1zZXQocmVxLCAwLCBsZW4pOwotCi0JSU5JVF9UUF9XUihyZXEsIHRpZCk7Ci0JT1BDT0RFX1RJRChyZXEpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRCgKLQkJICAgQ1BMX1RJRF9SRUxFQVNFLCB0aWQpKTsKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX1NFVFVQLCAwKTsKKwljeGdiX21rX3RpZF9yZWxlYXNlKHNrYiwgbGVuLCB0aWQsIDApOwogCWN4Z2JpdF9vZmxkX3NlbmQoY2Rldiwgc2tiKTsKIH0KIApAQCAtMTEwOCwyMCArOTc2LDYgQEAKIAlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1jeGdiaXRfYmVzdF9tdHUoY29uc3QgdW5zaWduZWQgc2hvcnQgKm10dXMsIHVuc2lnbmVkIHNob3J0IG10dSwKLQkJdW5zaWduZWQgaW50ICppZHgsIGludCB1c2VfdHMsIGludCBpcHY2KQotewotCXVuc2lnbmVkIHNob3J0IGhkcl9zaXplID0gKGlwdjYgPyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpIDoKLQkJCQkgICBzaXplb2Yoc3RydWN0IGlwaGRyKSkgKwotCQkJCSAgIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSArCi0JCQkJICAgKHVzZV90cyA/IHJvdW5kX3VwKFRDUE9MRU5fVElNRVNUQU1QLAotCQkJCSAgICA0KSA6IDApOwotCXVuc2lnbmVkIHNob3J0IGRhdGFfc2l6ZSA9IG10dSAtIGhkcl9zaXplOwotCi0JY3hnYjRfYmVzdF9hbGlnbmVkX210dShtdHVzLCBoZHJfc2l6ZSwgZGF0YV9zaXplLCA4LCBpZHgpOwotfQotCiBzdGF0aWMgdm9pZCBjeGdiaXRfc2VuZF9yeF9jcmVkaXRzKHN0cnVjdCBjeGdiaXRfc29jayAqY3NrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmIChjc2stPmNvbS5zdGF0ZSAhPSBDU0tfU1RBVEVfRVNUQUJMSVNIRUQpIHsKQEAgLTExNDAsMjIgKzk5NCwxOCBAQAogaW50IGN4Z2JpdF9yeF9kYXRhX2FjayhzdHJ1Y3QgY3hnYml0X3NvY2sgKmNzaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBjcGxfcnhfZGF0YV9hY2sgKnJlcTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gcm91bmR1cChzaXplb2YoKnJlcSksIDE2KTsKKwl1MzIgbGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF9yeF9kYXRhX2FjayksIDE2KTsKKwl1MzIgY3JlZGl0X2RhY2s7CiAKIAlza2IgPSBhbGxvY19za2IobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC0xOwogCi0JcmVxID0gKHN0cnVjdCBjcGxfcnhfZGF0YV9hY2sgKilfX3NrYl9wdXQoc2tiLCBsZW4pOwotCW1lbXNldChyZXEsIDAsIGxlbik7CisJY3JlZGl0X2RhY2sgPSBSWF9EQUNLX0NIQU5HRV9GIHwgUlhfREFDS19NT0RFX1YoMSkgfAorCQkgICAgICBSWF9DUkVESVRTX1YoY3NrLT5yeF9jcmVkaXRzKTsKIAotCXNldF93cl90eHEoc2tiLCBDUExfUFJJT1JJVFlfQUNLLCBjc2stPmN0cmxxX2lkeCk7Ci0JSU5JVF9UUF9XUihyZXEsIGNzay0+dGlkKTsKLQlPUENPREVfVElEKHJlcSkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9SWF9EQVRBX0FDSywKLQkJCQkJCSAgICBjc2stPnRpZCkpOwotCXJlcS0+Y3JlZGl0X2RhY2sgPSBjcHVfdG9fYmUzMihSWF9EQUNLX0NIQU5HRV9GIHwgUlhfREFDS19NT0RFX1YoMSkgfAotCQkJCSAgICAgICBSWF9DUkVESVRTX1YoY3NrLT5yeF9jcmVkaXRzKSk7CisJY3hnYl9ta19yeF9kYXRhX2Fjayhza2IsIGxlbiwgY3NrLT50aWQsIGNzay0+Y3RybHFfaWR4LAorCQkJICAgIGNyZWRpdF9kYWNrKTsKIAogCWNzay0+cnhfY3JlZGl0cyA9IDA7CiAKQEAgLTEyMTAsMTUgKzEwNjAsNiBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgdTMyIGN4Z2JpdF9jb21wdXRlX3dzY2FsZSh1MzIgd2luKQotewotCXUzMiB3c2NhbGUgPSAwOwotCi0Jd2hpbGUgKHdzY2FsZSA8IDE0ICYmICg2NTUzNSA8PCB3c2NhbGUpIDwgd2luKQotCQl3c2NhbGUrKzsKLQlyZXR1cm4gd3NjYWxlOwotfQotCiBzdGF0aWMgdm9pZAogY3hnYml0X3Bhc3NfYWNjZXB0X3JwbChzdHJ1Y3QgY3hnYml0X3NvY2sgKmNzaywgc3RydWN0IGNwbF9wYXNzX2FjY2VwdF9yZXEgKnJlcSkKIHsKQEAgLTEyNDYsMTAgKzEwODcsMTAgQEAKIAlJTklUX1RQX1dSKHJwbDUsIGNzay0+dGlkKTsKIAlPUENPREVfVElEKHJwbDUpID0gY3B1X3RvX2JlMzIoTUtfT1BDT0RFX1RJRChDUExfUEFTU19BQ0NFUFRfUlBMLAogCQkJCQkJICAgICBjc2stPnRpZCkpOwotCWN4Z2JpdF9iZXN0X210dShjc2stPmNvbS5jZGV2LT5sbGRpLm10dXMsIGNzay0+bXR1LCAmbXR1X2lkeCwKLQkJCXJlcS0+dGNwb3B0LnRzdGFtcCwKLQkJCShjc2stPmNvbS5yZW1vdGVfYWRkci5zc19mYW1pbHkgPT0gQUZfSU5FVCkgPyAwIDogMSk7Ci0Jd3NjYWxlID0gY3hnYml0X2NvbXB1dGVfd3NjYWxlKGNzay0+cmN2X3dpbik7CisJY3hnYl9iZXN0X210dShjc2stPmNvbS5jZGV2LT5sbGRpLm10dXMsIGNzay0+bXR1LCAmbXR1X2lkeCwKKwkJICAgICAgcmVxLT50Y3BvcHQudHN0YW1wLAorCQkgICAgICAoY3NrLT5jb20ucmVtb3RlX2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpID8gMCA6IDEpOworCXdzY2FsZSA9IGN4Z2JfY29tcHV0ZV93c2NhbGUoY3NrLT5yY3Zfd2luKTsKIAkvKgogCSAqIFNwZWNpZnkgdGhlIGxhcmdlc3Qgd2luZG93IHRoYXQgd2lsbCBmaXQgaW4gb3B0MC4gVGhlCiAJICogcmVtYWluZGVyIHdpbGwgYmUgc3BlY2lmaWVkIGluIHRoZSByeF9kYXRhX2Fjay4KQEAgLTEzNDAsOCArMTE4MSw4IEBACiAJCWdvdG8gcmVsX3NrYjsKIAl9CiAKLQljeGdiaXRfZ2V0X3R1cGxlX2luZm8ocmVxLCAmaXB0eXBlLCBsb2NhbF9pcCwgcGVlcl9pcCwKLQkJCSAgICAgICZsb2NhbF9wb3J0LCAmcGVlcl9wb3J0KTsKKwljeGdiX2dldF80dHVwbGUocmVxLCBjZGV2LT5sbGRpLmFkYXB0ZXJfdHlwZSwgJmlwdHlwZSwgbG9jYWxfaXAsCisJCQlwZWVyX2lwLCAmbG9jYWxfcG9ydCwgJnBlZXJfcG9ydCk7CiAKIAkvKiBGaW5kIG91dHB1dCByb3V0ZSAqLwogCWlmIChpcHR5cGUgPT0gNCkgIHsKQEAgLTEzNTAsMjEgKzExOTEsMjMgQEAKIAkJCSAsIF9fZnVuY19fLCBjbnAsIHRpZCwKIAkJCSBsb2NhbF9pcCwgcGVlcl9pcCwgbnRvaHMobG9jYWxfcG9ydCksCiAJCQkgbnRvaHMocGVlcl9wb3J0KSwgcGVlcl9tc3MpOwotCQlkc3QgPSBjeGdiaXRfZmluZF9yb3V0ZShjZGV2LCAqKF9fYmUzMiAqKWxvY2FsX2lwLAotCQkJCQkqKF9fYmUzMiAqKXBlZXJfaXAsCi0JCQkJCWxvY2FsX3BvcnQsIHBlZXJfcG9ydCwKLQkJCQkJUEFTU19PUEVOX1RPU19HKG50b2hsKHJlcS0+dG9zX3N0aWQpKSk7CisJCWRzdCA9IGN4Z2JfZmluZF9yb3V0ZSgmY2Rldi0+bGxkaSwgY3hnYml0X2dldF9yZWFsX2RldiwKKwkJCQkgICAgICAqKF9fYmUzMiAqKWxvY2FsX2lwLAorCQkJCSAgICAgICooX19iZTMyICopcGVlcl9pcCwKKwkJCQkgICAgICBsb2NhbF9wb3J0LCBwZWVyX3BvcnQsCisJCQkJICAgICAgUEFTU19PUEVOX1RPU19HKG50b2hsKHJlcS0+dG9zX3N0aWQpKSk7CiAJfSBlbHNlIHsKIAkJcHJfZGVidWcoIiVzIHBhcmVudCBzb2NrICVwIHRpZCAldSBsYWRkciAlcEk2IHJhZGRyICVwSTYgIgogCQkJICJscG9ydCAlZCBycG9ydCAlZCBwZWVyX21zcyAlZFxuIgogCQkJICwgX19mdW5jX18sIGNucCwgdGlkLAogCQkJIGxvY2FsX2lwLCBwZWVyX2lwLCBudG9ocyhsb2NhbF9wb3J0KSwKIAkJCSBudG9ocyhwZWVyX3BvcnQpLCBwZWVyX21zcyk7Ci0JCWRzdCA9IGN4Z2JpdF9maW5kX3JvdXRlNihjZGV2LCBsb2NhbF9pcCwgcGVlcl9pcCwKLQkJCQkJIGxvY2FsX3BvcnQsIHBlZXJfcG9ydCwKLQkJCQkJIFBBU1NfT1BFTl9UT1NfRyhudG9obChyZXEtPnRvc19zdGlkKSksCi0JCQkJCSAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikKLQkJCQkJICZjbnAtPmNvbS5sb2NhbF9hZGRyKS0+c2luNl9zY29wZV9pZCk7CisJCWRzdCA9IGN4Z2JfZmluZF9yb3V0ZTYoJmNkZXYtPmxsZGksIGN4Z2JpdF9nZXRfcmVhbF9kZXYsCisJCQkJICAgICAgIGxvY2FsX2lwLCBwZWVyX2lwLAorCQkJCSAgICAgICBsb2NhbF9wb3J0LCBwZWVyX3BvcnQsCisJCQkJICAgICAgIFBBU1NfT1BFTl9UT1NfRyhudG9obChyZXEtPnRvc19zdGlkKSksCisJCQkJICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luNiAqKQorCQkJCQkmY25wLT5jb20ubG9jYWxfYWRkciktPnNpbjZfc2NvcGVfaWQpOwogCX0KIAlpZiAoIWRzdCkgewogCQlwcl9lcnIoIiVzIC0gZmFpbGVkIHRvIGZpbmQgZHN0IGVudHJ5IVxuIiwKQEAgLTE3OTUsMTYgKzE2MzgsMTUgQEAKIHsKIAlzdHJ1Y3QgY3BsX2Fib3J0X3JlcV9yc3MgKmhkciA9IGNwbGhkcihza2IpOwogCXVuc2lnbmVkIGludCB0aWQgPSBHRVRfVElEKGhkcik7Ci0Jc3RydWN0IGNwbF9hYm9ydF9ycGwgKnJwbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcnBsX3NrYjsKIAlib29sIHJlbGVhc2UgPSBmYWxzZTsKIAlib29sIHdha2V1cF90aHJlYWQgPSBmYWxzZTsKLQl1bnNpZ25lZCBpbnQgbGVuID0gcm91bmR1cChzaXplb2YoKnJwbCksIDE2KTsKKwl1MzIgbGVuID0gcm91bmR1cChzaXplb2Yoc3RydWN0IGNwbF9hYm9ydF9ycGwpLCAxNik7CiAKIAlwcl9kZWJ1ZygiJXM6IGNzayAlcDsgdGlkICV1OyBzdGF0ZSAlZFxuIiwKIAkJIF9fZnVuY19fLCBjc2ssIHRpZCwgY3NrLT5jb20uc3RhdGUpOwogCi0JaWYgKGN4Z2JpdF9pc19uZWdfYWR2KGhkci0+c3RhdHVzKSkgeworCWlmIChjeGdiX2lzX25lZ19hZHYoaGRyLT5zdGF0dXMpKSB7CiAJCXByX2VycigiJXM6IGdvdCBuZWcgYWR2aXNlICVkIG9uIHRpZCAldVxuIiwKIAkJICAgICAgIF9fZnVuY19fLCBoZHItPnN0YXR1cywgdGlkKTsKIAkJZ290byByZWxfc2tiOwpAQCAtMTgzOSwxNCArMTY4MSw4IEBACiAJCWN4Z2JpdF9zZW5kX3R4X2Zsb3djX3dyKGNzayk7CiAKIAlycGxfc2tiID0gX19za2JfZGVxdWV1ZSgmY3NrLT5za2JxKTsKLQlzZXRfd3JfdHhxKHNrYiwgQ1BMX1BSSU9SSVRZX0RBVEEsIGNzay0+dHhxX2lkeCk7CiAKLQlycGwgPSAoc3RydWN0IGNwbF9hYm9ydF9ycGwgKilfX3NrYl9wdXQocnBsX3NrYiwgbGVuKTsKLQltZW1zZXQocnBsLCAwLCBsZW4pOwotCi0JSU5JVF9UUF9XUihycGwsIGNzay0+dGlkKTsKLQlPUENPREVfVElEKHJwbCkgPSBjcHVfdG9fYmUzMihNS19PUENPREVfVElEKENQTF9BQk9SVF9SUEwsIHRpZCkpOwotCXJwbC0+Y21kID0gQ1BMX0FCT1JUX05PX1JTVDsKKwljeGdiX21rX2Fib3J0X3JwbChycGxfc2tiLCBsZW4sIGNzay0+dGlkLCBjc2stPnR4cV9pZHgpOwogCWN4Z2JpdF9vZmxkX3NlbmQoY3NrLT5jb20uY2RldiwgcnBsX3NrYik7CiAKIAlpZiAod2FrZXVwX3RocmVhZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvY3hnYml0L2N4Z2JpdF9tYWluLmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9jeGdiaXQvY3hnYml0X21haW4uYwppbmRleCAyN2RkMTFhLi5hZDI2YjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9jeGdiaXQvY3hnYml0X21haW4uYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9jeGdiaXQvY3hnYml0X21haW4uYwpAQCAtNjUyLDYgKzY1Miw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY3hnYjRfdWxkX2luZm8gY3hnYml0X3VsZF9pbmZvID0gewogCS5uYW1lCQk9IERSVl9OQU1FLAorCS5ucnhxCQk9IE1BWF9VTERfUVNFVFMsCisJLnJ4cV9zaXplCT0gMTAyNCwKKwkubHJvCQk9IHRydWUsCiAJLmFkZAkJPSBjeGdiaXRfdWxkX2FkZCwKIAkuc3RhdGVfY2hhbmdlCT0gY3hnYml0X3VsZF9zdGF0ZV9jaGFuZ2UsCiAJLmxyb19yeF9oYW5kbGVyID0gY3hnYml0X3VsZF9scm9fcnhfaGFuZGxlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9yY2FyX3RoZXJtYWwuYyBiL2RyaXZlcnMvdGhlcm1hbC9yY2FyX3RoZXJtYWwuYwppbmRleCA3MWEzMzkyLi41ZjgxNzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RoZXJtYWwvcmNhcl90aGVybWFsLmMKKysrIGIvZHJpdmVycy90aGVybWFsL3JjYXJfdGhlcm1hbC5jCkBAIC01MDQsNiArNTA0LDcgQEAKIAkJaWYgKElTX0VSUihwcml2LT56b25lKSkgewogCQkJZGV2X2VycihkZXYsICJjYW4ndCByZWdpc3RlciB0aGVybWFsIHpvbmVcbiIpOwogCQkJcmV0ID0gUFRSX0VSUihwcml2LT56b25lKTsKKwkJCXByaXYtPnpvbmUgPSBOVUxMOwogCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGh1bmRlcmJvbHQvbmhpLmMgYi9kcml2ZXJzL3RodW5kZXJib2x0L25oaS5jCmluZGV4IDljMTUzNDQuLmE4YzIwNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGh1bmRlcmJvbHQvbmhpLmMKKysrIGIvZHJpdmVycy90aHVuZGVyYm9sdC9uaGkuYwpAQCAtNjUxLDYgKzY1MSwxMiBAQAogCXsKIAkJLmNsYXNzID0gUENJX0NMQVNTX1NZU1RFTV9PVEhFUiA8PCA4LCAuY2xhc3NfbWFzayA9IH4wLAogCQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKKwkJLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfSU5URUxfRkFMQ09OX1JJREdFXzJDX05ISSwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsIC5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCX0sCisJeworCQkuY2xhc3MgPSBQQ0lfQ0xBU1NfU1lTVEVNX09USEVSIDw8IDgsIC5jbGFzc19tYXNrID0gfjAsCisJCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAogCQkuZGV2aWNlID0gUENJX0RFVklDRV9JRF9JTlRFTF9GQUxDT05fUklER0VfNENfTkhJLAogCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwgLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGh1bmRlcmJvbHQvc3dpdGNoLmMgYi9kcml2ZXJzL3RodW5kZXJib2x0L3N3aXRjaC5jCmluZGV4IDFlMTE2ZjUuLjk4NDBmZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGh1bmRlcmJvbHQvc3dpdGNoLmMKKysrIGIvZHJpdmVycy90aHVuZGVyYm9sdC9zd2l0Y2guYwpAQCAtMzcyLDcgKzM3Miw5IEBACiAKIAlpZiAoc3ctPmNvbmZpZy5kZXZpY2VfaWQgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9MSUdIVF9SSURHRSAmJgogCSAgICBzdy0+Y29uZmlnLmRldmljZV9pZCAhPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0NBQ1RVU19SSURHRV80QyAmJgotCSAgICBzdy0+Y29uZmlnLmRldmljZV9pZCAhPSBQQ0lfREVWSUNFX0lEX0lOVEVMX1BPUlRfUklER0UpCisJICAgIHN3LT5jb25maWcuZGV2aWNlX2lkICE9IFBDSV9ERVZJQ0VfSURfSU5URUxfUE9SVF9SSURHRSAmJgorCSAgICBzdy0+Y29uZmlnLmRldmljZV9pZCAhPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0ZBTENPTl9SSURHRV8yQ19CUklER0UgJiYKKwkgICAgc3ctPmNvbmZpZy5kZXZpY2VfaWQgIT0gUENJX0RFVklDRV9JRF9JTlRFTF9GQUxDT05fUklER0VfNENfQlJJREdFKQogCQl0Yl9zd193YXJuKHN3LCAidW5zdXBwb3J0ZWQgc3dpdGNoIGRldmljZSBpZCAlI3hcbiIsCiAJCQkgICBzdy0+Y29uZmlnLmRldmljZV9pZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3B0eS5jIGIvZHJpdmVycy90dHkvcHR5LmMKaW5kZXggNTFlMGQzMi4uYTIzZmE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvcHR5LmMKKysrIGIvZHJpdmVycy90dHkvcHR5LmMKQEAgLTgwMCw3ICs4MDAsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHB0bXhfZm9wczsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHB0bXhfZm9wcyBfX3JvX2FmdGVyX2luaXQ7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB1bml4OThfcHR5X2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTAuaCBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTAuaAppbmRleCAxMjJlMGU0Li5hNjk3YTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwLmgKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MC5oCkBAIC0xNSw4ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3JlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogCi0jaW5jbHVkZSAiLi4vc2VyaWFsX21jdHJsX2dwaW8uaCIKLQogc3RydWN0IHVhcnRfODI1MF9kbWEgewogCWludCAoKnR4X2RtYSkoc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwKTsKIAlpbnQgKCpyeF9kbWEpKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqcCk7CkBAIC0zMyw2ICszMSwxMSBAQAogCXN0cnVjdCBkbWFfY2hhbgkJKnJ4Y2hhbjsKIAlzdHJ1Y3QgZG1hX2NoYW4JCSp0eGNoYW47CiAKKwkvKiBEZXZpY2UgYWRkcmVzcyBiYXNlIGZvciBETUEgb3BlcmF0aW9ucyAqLworCXBoeXNfYWRkcl90CQlyeF9kbWFfYWRkcjsKKwlwaHlzX2FkZHJfdAkJdHhfZG1hX2FkZHI7CisKKwkvKiBETUEgYWRkcmVzcyBvZiB0aGUgYnVmZmVyIGluIG1lbW9yeSAqLwogCWRtYV9hZGRyX3QJCXJ4X2FkZHI7CiAJZG1hX2FkZHJfdAkJdHhfYWRkcjsKIApAQCAtMTMzLDQzICsxMzYsMTIgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHNlcmlhbDgyNTBfb3V0X01DUihzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnVwLCBpbnQgdmFsdWUpCiB7Ci0JaW50IG1jdHJsX2dwaW8gPSAwOwotCiAJc2VyaWFsX291dCh1cCwgVUFSVF9NQ1IsIHZhbHVlKTsKLQotCWlmICh2YWx1ZSAmIFVBUlRfTUNSX1JUUykKLQkJbWN0cmxfZ3BpbyB8PSBUSU9DTV9SVFM7Ci0JaWYgKHZhbHVlICYgVUFSVF9NQ1JfRFRSKQotCQltY3RybF9ncGlvIHw9IFRJT0NNX0RUUjsKLQotCW1jdHJsX2dwaW9fc2V0KHVwLT5ncGlvcywgbWN0cmxfZ3Bpbyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlcmlhbDgyNTBfaW5fTUNSKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXApCiB7Ci0JaW50IG1jdHJsLCBtY3RybF9ncGlvID0gMDsKLQotCW1jdHJsID0gc2VyaWFsX2luKHVwLCBVQVJUX01DUik7Ci0KLQkvKiBzYXZlIGN1cnJlbnQgTUNSIHZhbHVlcyAqLwotCWlmIChtY3RybCAmIFVBUlRfTUNSX1JUUykKLQkJbWN0cmxfZ3BpbyB8PSBUSU9DTV9SVFM7Ci0JaWYgKG1jdHJsICYgVUFSVF9NQ1JfRFRSKQotCQltY3RybF9ncGlvIHw9IFRJT0NNX0RUUjsKLQotCW1jdHJsX2dwaW8gPSBtY3RybF9ncGlvX2dldF9vdXRwdXRzKHVwLT5ncGlvcywgJm1jdHJsX2dwaW8pOwotCi0JaWYgKG1jdHJsX2dwaW8gJiBUSU9DTV9SVFMpCi0JCW1jdHJsIHw9IFVBUlRfTUNSX1JUUzsKLQllbHNlCi0JCW1jdHJsICY9IH5VQVJUX01DUl9SVFM7Ci0KLQlpZiAobWN0cmxfZ3BpbyAmIFRJT0NNX0RUUikKLQkJbWN0cmwgfD0gVUFSVF9NQ1JfRFRSOwotCWVsc2UKLQkJbWN0cmwgJj0gflVBUlRfTUNSX0RUUjsKLQotCXJldHVybiBtY3RybDsKKwlyZXR1cm4gc2VyaWFsX2luKHVwLCBVQVJUX01DUik7CiB9CiAKICNpZiBkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoQ09ORklHX1BDSSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfY29yZS5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMKaW5kZXggMTNhZDVjMy4uMjQwYTM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9jb3JlLmMKQEAgLTYzOSw3ICs2MzksNyBAQAogewogCWNoYXIgbWF0Y2hbXSA9ICJ1YXJ0IjsJLyogODI1MC1zcGVjaWZpYyBlYXJseWNvbiBuYW1lICovCiAJdW5zaWduZWQgY2hhciBpb3R5cGU7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOworCXJlc291cmNlX3NpemVfdCBhZGRyOwogCWludCBpOwogCiAJaWYgKHN0cm5jbXAobmFtZSwgbWF0Y2gsIDQpICE9IDApCkBAIC05NzQsOCArOTc0LDYgQEAKIAogCXVhcnQgPSBzZXJpYWw4MjUwX2ZpbmRfbWF0Y2hfb3JfdW51c2VkKCZ1cC0+cG9ydCk7CiAJaWYgKHVhcnQgJiYgdWFydC0+cG9ydC50eXBlICE9IFBPUlRfODI1MF9DSVIpIHsKLQkJc3RydWN0IG1jdHJsX2dwaW9zICpncGlvczsKLQogCQlpZiAodWFydC0+cG9ydC5kZXYpCiAJCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmc2VyaWFsODI1MF9yZWcsICZ1YXJ0LT5wb3J0KTsKIApAQCAtMTAxMywxMyArMTAxMSw2IEBACiAJCWlmICh1cC0+cG9ydC5mbGFncyAmIFVQRl9GSVhFRF9UWVBFKQogCQkJdWFydC0+cG9ydC50eXBlID0gdXAtPnBvcnQudHlwZTsKIAotCQlncGlvcyA9IG1jdHJsX2dwaW9faW5pdCgmdWFydC0+cG9ydCwgMCk7Ci0JCWlmIChJU19FUlIoZ3Bpb3MpKSB7Ci0JCQlpZiAoUFRSX0VSUihncGlvcykgIT0gLUVOT1NZUykKLQkJCQlyZXR1cm4gUFRSX0VSUihncGlvcyk7Ci0JCX0gZWxzZQotCQkJdWFydC0+Z3Bpb3MgPSBncGlvczsKLQogCQlzZXJpYWw4MjUwX3NldF9kZWZhdWx0cyh1YXJ0KTsKIAogCQkvKiBQb3NzaWJseSBvdmVycmlkZSBkZWZhdWx0IEkvTyBmdW5jdGlvbnMuICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9kbWEuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZG1hLmMKaW5kZXggMzU5MGQwMS4uZmRiZGRiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9kbWEuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2RtYS5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIAlpZiAoZG1hLT5yeF9ydW5uaW5nKSB7CiAJCWRtYWVuZ2luZV9wYXVzZShkbWEtPnJ4Y2hhbik7CiAJCV9fZG1hX3J4X2NvbXBsZXRlKHApOwotCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChkbWEtPnJ4Y2hhbik7CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYXN5bmMoZG1hLT5yeGNoYW4pOwogCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNlcmlhbDgyNTBfcnhfZG1hX2ZsdXNoKTsKQEAgLTE1MCw2ICsxNTAsMTAgQEAKIGludCBzZXJpYWw4MjUwX3JlcXVlc3RfZG1hKHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqcCkKIHsKIAlzdHJ1Y3QgdWFydF84MjUwX2RtYQkqZG1hID0gcC0+ZG1hOworCXBoeXNfYWRkcl90IHJ4X2RtYV9hZGRyID0gZG1hLT5yeF9kbWFfYWRkciA/CisJCQkJICBkbWEtPnJ4X2RtYV9hZGRyIDogcC0+cG9ydC5tYXBiYXNlOworCXBoeXNfYWRkcl90IHR4X2RtYV9hZGRyID0gZG1hLT50eF9kbWFfYWRkciA/CisJCQkJICBkbWEtPnR4X2RtYV9hZGRyIDogcC0+cG9ydC5tYXBiYXNlOwogCWRtYV9jYXBfbWFza190CQltYXNrOwogCXN0cnVjdCBkbWFfc2xhdmVfY2FwcwljYXBzOwogCWludAkJCXJldDsKQEAgLTE1NywxMSArMTYxLDExIEBACiAJLyogRGVmYXVsdCBzbGF2ZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KIAlkbWEtPnJ4Y29uZi5kaXJlY3Rpb24JCT0gRE1BX0RFVl9UT19NRU07CiAJZG1hLT5yeGNvbmYuc3JjX2FkZHJfd2lkdGgJPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOwotCWRtYS0+cnhjb25mLnNyY19hZGRyCQk9IHAtPnBvcnQubWFwYmFzZSArIFVBUlRfUlg7CisJZG1hLT5yeGNvbmYuc3JjX2FkZHIJCT0gcnhfZG1hX2FkZHIgKyBVQVJUX1JYOwogCiAJZG1hLT50eGNvbmYuZGlyZWN0aW9uCQk9IERNQV9NRU1fVE9fREVWOwogCWRtYS0+dHhjb25mLmRzdF9hZGRyX3dpZHRoCT0gRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURTsKLQlkbWEtPnR4Y29uZi5kc3RfYWRkcgkJPSBwLT5wb3J0Lm1hcGJhc2UgKyBVQVJUX1RYOworCWRtYS0+dHhjb25mLmRzdF9hZGRyCQk9IHR4X2RtYV9hZGRyICsgVUFSVF9UWDsKIAogCWRtYV9jYXBfemVybyhtYXNrKTsKIAlkbWFfY2FwX3NldChETUFfU0xBVkUsIG1hc2spOwpAQCAtMjQ3LDE0ICsyNTEsMTQgQEAKIAkJcmV0dXJuOwogCiAJLyogUmVsZWFzZSBSWCByZXNvdXJjZXMgKi8KLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChkbWEtPnJ4Y2hhbik7CisJZG1hZW5naW5lX3Rlcm1pbmF0ZV9zeW5jKGRtYS0+cnhjaGFuKTsKIAlkbWFfZnJlZV9jb2hlcmVudChkbWEtPnJ4Y2hhbi0+ZGV2aWNlLT5kZXYsIGRtYS0+cnhfc2l6ZSwgZG1hLT5yeF9idWYsCiAJCQkgIGRtYS0+cnhfYWRkcik7CiAJZG1hX3JlbGVhc2VfY2hhbm5lbChkbWEtPnJ4Y2hhbik7CiAJZG1hLT5yeGNoYW4gPSBOVUxMOwogCiAJLyogUmVsZWFzZSBUWCByZXNvdXJjZXMgKi8KLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChkbWEtPnR4Y2hhbik7CisJZG1hZW5naW5lX3Rlcm1pbmF0ZV9zeW5jKGRtYS0+dHhjaGFuKTsKIAlkbWFfdW5tYXBfc2luZ2xlKGRtYS0+dHhjaGFuLT5kZXZpY2UtPmRldiwgZG1hLT50eF9hZGRyLAogCQkJIFVBUlRfWE1JVF9TSVpFLCBETUFfVE9fREVWSUNFKTsKIAlkbWFfcmVsZWFzZV9jaGFubmVsKGRtYS0+dHhjaGFuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZHcuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZHcuYwppbmRleCBlMTk5Njk2Li40NTlkNzI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2R3LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9kdy5jCkBAIC0yOTgsMTIgKzI5OCwxNyBAQAogCQkJcC0+c2VyaWFsX291dCA9IGR3ODI1MF9zZXJpYWxfb3V0MzJiZTsKIAkJfQogCX0gZWxzZSBpZiAoaGFzX2FjcGlfY29tcGFuaW9uKHAtPmRldikpIHsKLQkJcC0+aW90eXBlID0gVVBJT19NRU0zMjsKLQkJcC0+cmVnc2hpZnQgPSAyOwotCQlwLT5zZXJpYWxfaW4gPSBkdzgyNTBfc2VyaWFsX2luMzI7CisJCWNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaWQ7CisKKwkJaWQgPSBhY3BpX21hdGNoX2RldmljZShwLT5kZXYtPmRyaXZlci0+YWNwaV9tYXRjaF90YWJsZSwKKwkJCQkgICAgICAgcC0+ZGV2KTsKKwkJaWYgKGlkICYmICFzdHJjbXAoaWQtPmlkLCAiQVBNQzBEMDgiKSkgeworCQkJcC0+aW90eXBlID0gVVBJT19NRU0zMjsKKwkJCXAtPnJlZ3NoaWZ0ID0gMjsKKwkJCXAtPnNlcmlhbF9pbiA9IGR3ODI1MF9zZXJpYWxfaW4zMjsKKwkJCWRhdGEtPnVhcnRfMTY1NTBfY29tcGF0aWJsZSA9IHRydWU7CisJCX0KIAkJcC0+c2V0X3Rlcm1pb3MgPSBkdzgyNTBfc2V0X3Rlcm1pb3M7Ci0JCS8qIFNvIGZhciBub25lIG9mIHRoZXJlIGltcGxlbWVudCB0aGUgQnVzeSBGdW5jdGlvbmFsaXR5ICovCi0JCWRhdGEtPnVhcnRfMTY1NTBfY29tcGF0aWJsZSA9IHRydWU7CiAJfQogCiAJLyogUGxhdGZvcm1zIHdpdGggaURNQSAqLwpAQCAtMzYwLDE4ICszNjUsMTkgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWludCBpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCXN0cnVjdCB1YXJ0X3BvcnQgKnAgPSAmdWFydC5wb3J0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IGR3ODI1MF9kYXRhICpkYXRhOwogCWludCBlcnI7CiAJdTMyIHZhbDsKIAogCWlmICghcmVncykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyByZWdpc3RlcnMgZGVmaW5lZFxuIik7CisJCWRldl9lcnIoZGV2LCAibm8gcmVnaXN0ZXJzIGRlZmluZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoaXJxIDwgMCkgewogCQlpZiAoaXJxICE9IC1FUFJPQkVfREVGRVIpCi0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgZ2V0IGlycVxuIik7CisJCQlkZXZfZXJyKGRldiwgImNhbm5vdCBnZXQgaXJxXG4iKTsKIAkJcmV0dXJuIGlycTsKIAl9CiAKQEAgLTM4MiwxNiArMzg4LDE2IEBACiAJcC0+cG0JCT0gZHc4MjUwX2RvX3BtOwogCXAtPnR5cGUJCT0gUE9SVF84MjUwOwogCXAtPmZsYWdzCT0gVVBGX1NIQVJFX0lSUSB8IFVQRl9GSVhFRF9QT1JUOwotCXAtPmRldgkJPSAmcGRldi0+ZGV2OworCXAtPmRldgkJPSBkZXY7CiAJcC0+aW90eXBlCT0gVVBJT19NRU07CiAJcC0+c2VyaWFsX2luCT0gZHc4MjUwX3NlcmlhbF9pbjsKIAlwLT5zZXJpYWxfb3V0CT0gZHc4MjUwX3NlcmlhbF9vdXQ7CiAKLQlwLT5tZW1iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKKwlwLT5tZW1iYXNlID0gZGV2bV9pb3JlbWFwKGRldiwgcmVncy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVncykpOwogCWlmICghcC0+bWVtYmFzZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zOTksNTcgKzQwNSw1NyBAQAogCWRhdGEtPnVzcl9yZWcgPSBEV19VQVJUX1VTUjsKIAlwLT5wcml2YXRlX2RhdGEgPSBkYXRhOwogCi0JZGF0YS0+dWFydF8xNjU1MF9jb21wYXRpYmxlID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChwLT5kZXYsCisJZGF0YS0+dWFydF8xNjU1MF9jb21wYXRpYmxlID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsCiAJCQkJCQkic25wcyx1YXJ0LTE2NTUwLWNvbXBhdGlibGUiKTsKIAotCWVyciA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihwLT5kZXYsICJyZWctc2hpZnQiLCAmdmFsKTsKKwllcnIgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAicmVnLXNoaWZ0IiwgJnZhbCk7CiAJaWYgKCFlcnIpCiAJCXAtPnJlZ3NoaWZ0ID0gdmFsOwogCi0JZXJyID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKHAtPmRldiwgInJlZy1pby13aWR0aCIsICZ2YWwpOworCWVyciA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJyZWctaW8td2lkdGgiLCAmdmFsKTsKIAlpZiAoIWVyciAmJiB2YWwgPT0gNCkgewogCQlwLT5pb3R5cGUgPSBVUElPX01FTTMyOwogCQlwLT5zZXJpYWxfaW4gPSBkdzgyNTBfc2VyaWFsX2luMzI7CiAJCXAtPnNlcmlhbF9vdXQgPSBkdzgyNTBfc2VyaWFsX291dDMyOwogCX0KIAotCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKHAtPmRldiwgImRjZC1vdmVycmlkZSIpKSB7CisJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAiZGNkLW92ZXJyaWRlIikpIHsKIAkJLyogQWx3YXlzIHJlcG9ydCBEQ0QgYXMgYWN0aXZlICovCiAJCWRhdGEtPm1zcl9tYXNrX29uIHw9IFVBUlRfTVNSX0RDRDsKIAkJZGF0YS0+bXNyX21hc2tfb2ZmIHw9IFVBUlRfTVNSX0REQ0Q7CiAJfQogCi0JaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2wocC0+ZGV2LCAiZHNyLW92ZXJyaWRlIikpIHsKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJkc3Itb3ZlcnJpZGUiKSkgewogCQkvKiBBbHdheXMgcmVwb3J0IERTUiBhcyBhY3RpdmUgKi8KIAkJZGF0YS0+bXNyX21hc2tfb24gfD0gVUFSVF9NU1JfRFNSOwogCQlkYXRhLT5tc3JfbWFza19vZmYgfD0gVUFSVF9NU1JfRERTUjsKIAl9CiAKLQlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChwLT5kZXYsICJjdHMtb3ZlcnJpZGUiKSkgeworCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgImN0cy1vdmVycmlkZSIpKSB7CiAJCS8qIEFsd2F5cyByZXBvcnQgQ1RTIGFzIGFjdGl2ZSAqLwogCQlkYXRhLT5tc3JfbWFza19vbiB8PSBVQVJUX01TUl9DVFM7CiAJCWRhdGEtPm1zcl9tYXNrX29mZiB8PSBVQVJUX01TUl9EQ1RTOwogCX0KIAotCWlmIChkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKHAtPmRldiwgInJpLW92ZXJyaWRlIikpIHsKKwlpZiAoZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJyaS1vdmVycmlkZSIpKSB7CiAJCS8qIEFsd2F5cyByZXBvcnQgUmluZyBpbmRpY2F0b3IgYXMgaW5hY3RpdmUgKi8KIAkJZGF0YS0+bXNyX21hc2tfb2ZmIHw9IFVBUlRfTVNSX1JJOwogCQlkYXRhLT5tc3JfbWFza19vZmYgfD0gVUFSVF9NU1JfVEVSSTsKIAl9CiAKIAkvKiBBbHdheXMgYXNrIGZvciBmaXhlZCBjbG9jayByYXRlIGZyb20gYSBwcm9wZXJ0eS4gKi8KLQlkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIocC0+ZGV2LCAiY2xvY2stZnJlcXVlbmN5IiwgJnAtPnVhcnRjbGspOworCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJjbG9jay1mcmVxdWVuY3kiLCAmcC0+dWFydGNsayk7CiAKIAkvKiBJZiB0aGVyZSBpcyBzZXBhcmF0ZSBiYXVkY2xrLCBnZXQgdGhlIHJhdGUgZnJvbSBpdC4gKi8KLQlkYXRhLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImJhdWRjbGsiKTsKKwlkYXRhLT5jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiYmF1ZGNsayIpOwogCWlmIChJU19FUlIoZGF0YS0+Y2xrKSAmJiBQVFJfRVJSKGRhdGEtPmNsaykgIT0gLUVQUk9CRV9ERUZFUikKLQkJZGF0YS0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCQlkYXRhLT5jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGRhdGEtPmNsaykgJiYgUFRSX0VSUihkYXRhLT5jbGspID09IC1FUFJPQkVfREVGRVIpCiAJCXJldHVybiAtRVBST0JFX0RFRkVSOwogCWlmICghSVNfRVJSX09SX05VTEwoZGF0YS0+Y2xrKSkgewogCQllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGF0YS0+Y2xrKTsKIAkJaWYgKGVycikKLQkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZW5hYmxlIG9wdGlvbmFsIGJhdWRjbGs6ICVkXG4iLAorCQkJZGV2X3dhcm4oZGV2LCAiY291bGQgbm90IGVuYWJsZSBvcHRpb25hbCBiYXVkY2xrOiAlZFxuIiwKIAkJCQkgZXJyKTsKIAkJZWxzZQogCQkJcC0+dWFydGNsayA9IGNsa19nZXRfcmF0ZShkYXRhLT5jbGspOwpAQCAtNDU3LDI0ICs0NjMsMjQgQEAKIAogCS8qIElmIG5vIGNsb2NrIHJhdGUgaXMgZGVmaW5lZCwgZmFpbC4gKi8KIAlpZiAoIXAtPnVhcnRjbGspIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2xvY2sgcmF0ZSBub3QgZGVmaW5lZFxuIik7CisJCWRldl9lcnIoZGV2LCAiY2xvY2sgcmF0ZSBub3QgZGVmaW5lZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRhdGEtPnBjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImFwYl9wY2xrIik7Ci0JaWYgKElTX0VSUihkYXRhLT5jbGspICYmIFBUUl9FUlIoZGF0YS0+Y2xrKSA9PSAtRVBST0JFX0RFRkVSKSB7CisJZGF0YS0+cGNsayA9IGRldm1fY2xrX2dldChkZXYsICJhcGJfcGNsayIpOworCWlmIChJU19FUlIoZGF0YS0+cGNsaykgJiYgUFRSX0VSUihkYXRhLT5wY2xrKSA9PSAtRVBST0JFX0RFRkVSKSB7CiAJCWVyciA9IC1FUFJPQkVfREVGRVI7CiAJCWdvdG8gZXJyX2NsazsKIAl9CiAJaWYgKCFJU19FUlIoZGF0YS0+cGNsaykpIHsKIAkJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhdGEtPnBjbGspOwogCQlpZiAoZXJyKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgZW5hYmxlIGFwYl9wY2xrXG4iKTsKKwkJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGVuYWJsZSBhcGJfcGNsa1xuIik7CiAJCQlnb3RvIGVycl9jbGs7CiAJCX0KIAl9CiAKLQlkYXRhLT5yc3QgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0X29wdGlvbmFsKCZwZGV2LT5kZXYsIE5VTEwpOworCWRhdGEtPnJzdCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXRfb3B0aW9uYWwoZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKGRhdGEtPnJzdCkgJiYgUFRSX0VSUihkYXRhLT5yc3QpID09IC1FUFJPQkVfREVGRVIpIHsKIAkJZXJyID0gLUVQUk9CRV9ERUZFUjsKIAkJZ290byBlcnJfcGNsazsKQEAgLTUwNiw4ICs1MTIsOCBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CiAKLQlwbV9ydW50aW1lX3NldF9hY3RpdmUoJnBkZXYtPmRldik7Ci0JcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9zZXRfYWN0aXZlKGRldik7CisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKIAogCXJldHVybiAwOwogCkBAIC02MTksNiArNjI1LDcgQEAKIAl7ICJBUE1DMEQwOCIsIDB9LAogCXsgIkFNRDAwMjAiLCAwIH0sCiAJeyAiQU1ESTAwMjAiLCAwIH0sCisJeyAiSElTSTAwMzEiLCAwIH0sCiAJeyB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgZHc4MjUwX2FjcGlfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9maW50ZWsuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZmludGVrLmMKaW5kZXggNzM3YjRiMy4uMGZhY2M3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9maW50ZWsuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2ZpbnRlay5jCkBAIC0zMSw3ICszMSw3IEBACiAjZGVmaW5lIElPX0FERFIyIDB4NjAKICNkZWZpbmUgTEROIDB4NwogCi0jZGVmaW5lIElSUV9NT0RFCTB4NzAKKyNkZWZpbmUgRklOVEVLX0lSUV9NT0RFCTB4NzAKICNkZWZpbmUgSVJRX1NIQVJFCUJJVCg0KQogI2RlZmluZSBJUlFfTU9ERV9NQVNLCShCSVQoNikgfCBCSVQoNSkpCiAjZGVmaW5lIElSUV9MRVZFTF9MT1cJMApAQCAtMTk1LDcgKzE5NSw3IEBACiAJb3V0YihMRE4sIHBkYXRhLT5iYXNlX3BvcnQgKyBBRERSX1BPUlQpOwogCW91dGIocGRhdGEtPmluZGV4LCBwZGF0YS0+YmFzZV9wb3J0ICsgREFUQV9QT1JUKTsKIAotCW91dGIoSVJRX01PREUsIHBkYXRhLT5iYXNlX3BvcnQgKyBBRERSX1BPUlQpOworCW91dGIoRklOVEVLX0lSUV9NT0RFLCBwZGF0YS0+YmFzZV9wb3J0ICsgQUREUl9QT1JUKTsKIAl0bXAgPSBpbmIocGRhdGEtPmJhc2VfcG9ydCArIERBVEFfUE9SVCk7CiAKIAl0bXAgJj0gfklSUV9NT0RFX01BU0s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2xwc3MuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfbHBzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmZjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2xwc3MuYwpAQCAtMCwwICsxLDM3OCBAQAorLyoKKyAqIDgyNTBfbHBzcy5jIC0gRHJpdmVyIGZvciBVQVJUIG9uIEludGVsIEJyYXN3ZWxsIGFuZCB2YXJpb3VzIG90aGVyIEludGVsIFNvQ3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSW50ZWwgQ29ycG9yYXRpb24KKyAqIEF1dGhvcjogQW5keSBTaGV2Y2hlbmtvIDxhbmRyaXkuc2hldmNoZW5rb0BsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcmF0aW9uYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS9kdy5oPgorCisjaW5jbHVkZSAiODI1MC5oIgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfUVJLX1VBUlR4CTB4MDkzNgorCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQxCTB4MGYwYQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMgkweDBmMGMKKworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMQkweDIyOGEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDIJMHgyMjhjCisKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDEJMHg5Y2UzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQyCTB4OWNlNAorCisvKiBJbnRlbCBMUFNTIHNwZWNpZmljIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIEJZVF9QUlZfQ0xLCQkJMHg4MDAKKyNkZWZpbmUgQllUX1BSVl9DTEtfRU4JCQlCSVQoMCkKKyNkZWZpbmUgQllUX1BSVl9DTEtfTV9WQUxfU0hJRlQJCTEKKyNkZWZpbmUgQllUX1BSVl9DTEtfTl9WQUxfU0hJRlQJCTE2CisjZGVmaW5lIEJZVF9QUlZfQ0xLX1VQREFURQkJQklUKDMxKQorCisjZGVmaW5lIEJZVF9UWF9PVkZfSU5UCQkJMHg4MjAKKyNkZWZpbmUgQllUX1RYX09WRl9JTlRfTUFTSwkJQklUKDEpCisKK3N0cnVjdCBscHNzODI1MDsKKworc3RydWN0IGxwc3M4MjUwX2JvYXJkIHsKKwl1bnNpZ25lZCBsb25nIGZyZXE7CisJdW5zaWduZWQgaW50IGJhc2VfYmF1ZDsKKwlpbnQgKCpzZXR1cCkoc3RydWN0IGxwc3M4MjUwICosIHN0cnVjdCB1YXJ0X3BvcnQgKnApOworCXZvaWQgKCpleGl0KShzdHJ1Y3QgbHBzczgyNTAgKik7Cit9OworCitzdHJ1Y3QgbHBzczgyNTAgeworCWludCBsaW5lOworCXN0cnVjdCBscHNzODI1MF9ib2FyZCAqYm9hcmQ7CisKKwkvKiBETUEgcGFyYW1ldGVycyAqLworCXN0cnVjdCB1YXJ0XzgyNTBfZG1hIGRtYTsKKwlzdHJ1Y3QgZHdfZG1hX2NoaXAgZG1hX2NoaXA7CisJc3RydWN0IGR3X2RtYV9zbGF2ZSBkbWFfcGFyYW07CisJdTggZG1hX21heGJ1cnN0OworfTsKKworc3RhdGljIHZvaWQgYnl0X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnAsIHN0cnVjdCBrdGVybWlvcyAqdGVybWlvcywKKwkJCSAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKK3sKKwl1bnNpZ25lZCBpbnQgYmF1ZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSh0ZXJtaW9zKTsKKwlzdHJ1Y3QgbHBzczgyNTAgKmxwc3MgPSBwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmcmVmID0gbHBzcy0+Ym9hcmQtPmZyZXEsIGZ1YXJ0ID0gYmF1ZCAqIDE2OworCXVuc2lnbmVkIGxvbmcgdyA9IEJJVCgxNSkgLSAxOworCXVuc2lnbmVkIGxvbmcgbSwgbjsKKwl1MzIgcmVnOworCisJLyogR3JhY2VmdWxseSBoYW5kbGUgdGhlIEIwIGNhc2U6IGZhbGwgYmFjayB0byBCOTYwMCAqLworCWZ1YXJ0ID0gZnVhcnQgPyBmdWFydCA6IDk2MDAgKiAxNjsKKworCS8qIEdldCBGdWFydCBjbG9zZXIgdG8gRnJlZiAqLworCWZ1YXJ0ICo9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKGZyZWYgLyBmdWFydCk7CisKKwkvKgorCSAqIEZvciBiYXVkIHJhdGVzIDAuNU0sIDFNLCAxLjVNLCAyTSwgMi41TSwgM00sIDMuNU0gYW5kIDRNIHRoZQorCSAqIGRpdmlkZXJzIG11c3QgYmUgYWRqdXN0ZWQuCisJICoKKwkgKiB1YXJ0Y2xrID0gKG0gLyBuKSAqIDEwMCBNSHosIHdoZXJlIG0gPD0gbgorCSAqLworCXJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbihmdWFydCwgZnJlZiwgdywgdywgJm0sICZuKTsKKwlwLT51YXJ0Y2xrID0gZnVhcnQ7CisKKwkvKiBSZXNldCB0aGUgY2xvY2sgKi8KKwlyZWcgPSAobSA8PCBCWVRfUFJWX0NMS19NX1ZBTF9TSElGVCkgfCAobiA8PCBCWVRfUFJWX0NMS19OX1ZBTF9TSElGVCk7CisJd3JpdGVsKHJlZywgcC0+bWVtYmFzZSArIEJZVF9QUlZfQ0xLKTsKKwlyZWcgfD0gQllUX1BSVl9DTEtfRU4gfCBCWVRfUFJWX0NMS19VUERBVEU7CisJd3JpdGVsKHJlZywgcC0+bWVtYmFzZSArIEJZVF9QUlZfQ0xLKTsKKworCXAtPnN0YXR1cyAmPSB+VVBTVEFUX0FVVE9DVFM7CisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKQorCQlwLT5zdGF0dXMgfD0gVVBTVEFUX0FVVE9DVFM7CisKKwlzZXJpYWw4MjUwX2RvX3NldF90ZXJtaW9zKHAsIHRlcm1pb3MsIG9sZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnl0X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGludCByZXQgPSBzZXJpYWw4MjUwX2RvX2dldF9tY3RybChwb3J0KTsKKworCS8qIEZvcmNlIERDRCBhbmQgRFNSIHNpZ25hbHMgdG8gcGVybWFuZW50bHkgYmUgcmVwb3J0ZWQgYXMgYWN0aXZlICovCisJcmV0IHw9IFRJT0NNX0NBUiB8IFRJT0NNX0RTUjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnl0X3NlcmlhbF9zZXR1cChzdHJ1Y3QgbHBzczgyNTAgKmxwc3MsIHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGR3X2RtYV9zbGF2ZSAqcGFyYW0gPSAmbHBzcy0+ZG1hX3BhcmFtOworCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSB1cF90b191ODI1MHAocG9ydCk7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KHBvcnQtPmRldik7CisJdW5zaWduZWQgaW50IGRtYV9kZXZmbiA9IFBDSV9ERVZGTihQQ0lfU0xPVChwZGV2LT5kZXZmbiksIDApOworCXN0cnVjdCBwY2lfZGV2ICpkbWFfZGV2ID0gcGNpX2dldF9zbG90KHBkZXYtPmJ1cywgZG1hX2RldmZuKTsKKworCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMToKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQxOgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDE6CisJCXBhcmFtLT5zcmNfaWQgPSAzOworCQlwYXJhbS0+ZHN0X2lkID0gMjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQyOgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDI6CisJCXBhcmFtLT5zcmNfaWQgPSA1OworCQlwYXJhbS0+ZHN0X2lkID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFyYW0tPmRtYV9kZXYgPSAmZG1hX2Rldi0+ZGV2OworCXBhcmFtLT5tX21hc3RlciA9IDA7CisJcGFyYW0tPnBfbWFzdGVyID0gMTsKKworCS8qIFRPRE86IERldGVjdCBGSUZPIHNpemUgYXV0b21hdGljYWx5IGZvciBEZXNpZ25XYXJlIDgyNTAgKi8KKwlwb3J0LT5maWZvc2l6ZSA9IDY0OworCXVwLT50eF9sb2Fkc3ogPSA2NDsKKworCWxwc3MtPmRtYV9tYXhidXJzdCA9IDE2OworCisJcG9ydC0+c2V0X3Rlcm1pb3MgPSBieXRfc2V0X3Rlcm1pb3M7CisJcG9ydC0+Z2V0X21jdHJsID0gYnl0X2dldF9tY3RybDsKKworCS8qIERpc2FibGUgVFggY291bnRlciBpbnRlcnJ1cHRzICovCisJd3JpdGVsKEJZVF9UWF9PVkZfSU5UX01BU0ssIHBvcnQtPm1lbWJhc2UgKyBCWVRfVFhfT1ZGX0lOVCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9ETUEKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHdfZG1hX3BsYXRmb3JtX2RhdGEgcXJrX3NlcmlhbF9kbWFfcGRhdGEgPSB7CisJLm5yX2NoYW5uZWxzID0gMiwKKwkuaXNfcHJpdmF0ZSA9IHRydWUsCisJLmlzX25vbGxwID0gdHJ1ZSwKKwkuY2hhbl9hbGxvY2F0aW9uX29yZGVyID0gQ0hBTl9BTExPQ0FUSU9OX0FTQ0VORElORywKKwkuY2hhbl9wcmlvcml0eSA9IENIQU5fUFJJT1JJVFlfQVNDRU5ESU5HLAorCS5ibG9ja19zaXplID0gNDA5NSwKKwkubnJfbWFzdGVycyA9IDEsCisJLmRhdGFfd2lkdGggPSB7NH0sCit9OworCitzdGF0aWMgdm9pZCBxcmtfc2VyaWFsX3NldHVwX2RtYShzdHJ1Y3QgbHBzczgyNTAgKmxwc3MsIHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHVhcnRfODI1MF9kbWEgKmRtYSA9ICZscHNzLT5kbWE7CisJc3RydWN0IGR3X2RtYV9jaGlwICpjaGlwID0gJmxwc3MtPmRtYV9jaGlwOworCXN0cnVjdCBkd19kbWFfc2xhdmUgKnBhcmFtID0gJmxwc3MtPmRtYV9wYXJhbTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYocG9ydC0+ZGV2KTsKKwlpbnQgcmV0OworCisJY2hpcC0+ZGV2ID0gJnBkZXYtPmRldjsKKwljaGlwLT5pcnEgPSBwZGV2LT5pcnE7CisJY2hpcC0+cmVncyA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAxKTsKKwljaGlwLT5wZGF0YSA9ICZxcmtfc2VyaWFsX2RtYV9wZGF0YTsKKworCS8qIEZhbGxpbmcgYmFjayB0byBQSU8gbW9kZSBpZiBETUEgcHJvYmluZyBmYWlscyAqLworCXJldCA9IGR3X2RtYV9wcm9iZShjaGlwKTsKKwlpZiAocmV0KQorCQlyZXR1cm47CisKKwkvKiBTcGVjaWFsIERNQSBhZGRyZXNzIGZvciBVQVJUICovCisJZG1hLT5yeF9kbWFfYWRkciA9IDB4ZmZmZmYwMDA7CisJZG1hLT50eF9kbWFfYWRkciA9IDB4ZmZmZmYwMDA7CisKKwlwYXJhbS0+ZG1hX2RldiA9ICZwZGV2LT5kZXY7CisJcGFyYW0tPnNyY19pZCA9IDA7CisJcGFyYW0tPmRzdF9pZCA9IDE7CisJcGFyYW0tPmhzX3BvbGFyaXR5ID0gdHJ1ZTsKKworCWxwc3MtPmRtYV9tYXhidXJzdCA9IDg7Cit9CisKK3N0YXRpYyB2b2lkIHFya19zZXJpYWxfZXhpdF9kbWEoc3RydWN0IGxwc3M4MjUwICpscHNzKQoreworCXN0cnVjdCBkd19kbWFfc2xhdmUgKnBhcmFtID0gJmxwc3MtPmRtYV9wYXJhbTsKKworCWlmICghcGFyYW0tPmRtYV9kZXYpCisJCXJldHVybjsKKwlkd19kbWFfcmVtb3ZlKCZscHNzLT5kbWFfY2hpcCk7Cit9CisjZWxzZQkvKiBDT05GSUdfU0VSSUFMXzgyNTBfRE1BICovCitzdGF0aWMgdm9pZCBxcmtfc2VyaWFsX3NldHVwX2RtYShzdHJ1Y3QgbHBzczgyNTAgKmxwc3MsIHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpIHt9CitzdGF0aWMgdm9pZCBxcmtfc2VyaWFsX2V4aXRfZG1hKHN0cnVjdCBscHNzODI1MCAqbHBzcykge30KKyNlbmRpZgkvKiAhQ09ORklHX1NFUklBTF84MjUwX0RNQSAqLworCitzdGF0aWMgaW50IHFya19zZXJpYWxfc2V0dXAoc3RydWN0IGxwc3M4MjUwICpscHNzLCBzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwb3J0LT5kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBwY2lfYWxsb2NfaXJxX3ZlY3RvcnMocGRldiwgMSwgMSwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlwb3J0LT5pcnEgPSBwY2lfaXJxX3ZlY3RvcihwZGV2LCAwKTsKKworCXFya19zZXJpYWxfc2V0dXBfZG1hKGxwc3MsIHBvcnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxcmtfc2VyaWFsX2V4aXQoc3RydWN0IGxwc3M4MjUwICpscHNzKQoreworCXFya19zZXJpYWxfZXhpdF9kbWEobHBzcyk7Cit9CisKK3N0YXRpYyBib29sIGxwc3M4MjUwX2RtYV9maWx0ZXIoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlICpkd3MgPSBwYXJhbTsKKworCWlmIChkd3MtPmRtYV9kZXYgIT0gY2hhbi0+ZGV2aWNlLT5kZXYpCisJCXJldHVybiBmYWxzZTsKKworCWNoYW4tPnByaXZhdGUgPSBkd3M7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgbHBzczgyNTBfZG1hX3NldHVwKHN0cnVjdCBscHNzODI1MCAqbHBzcywgc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB1YXJ0XzgyNTBfZG1hICpkbWEgPSAmbHBzcy0+ZG1hOworCXN0cnVjdCBkd19kbWFfc2xhdmUgKnJ4X3BhcmFtLCAqdHhfcGFyYW07CisJc3RydWN0IGRldmljZSAqZGV2ID0gcG9ydC0+cG9ydC5kZXY7CisKKwlpZiAoIWxwc3MtPmRtYV9wYXJhbS5kbWFfZGV2KQorCQlyZXR1cm4gMDsKKworCXJ4X3BhcmFtID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpyeF9wYXJhbSksIEdGUF9LRVJORUwpOworCWlmICghcnhfcGFyYW0pCisJCXJldHVybiAtRU5PTUVNOworCisJdHhfcGFyYW0gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnR4X3BhcmFtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eF9wYXJhbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkqcnhfcGFyYW0gPSBscHNzLT5kbWFfcGFyYW07CisJZG1hLT5yeGNvbmYuc3JjX21heGJ1cnN0ID0gbHBzcy0+ZG1hX21heGJ1cnN0OworCisJKnR4X3BhcmFtID0gbHBzcy0+ZG1hX3BhcmFtOworCWRtYS0+dHhjb25mLmRzdF9tYXhidXJzdCA9IGxwc3MtPmRtYV9tYXhidXJzdDsKKworCWRtYS0+Zm4gPSBscHNzODI1MF9kbWFfZmlsdGVyOworCWRtYS0+cnhfcGFyYW0gPSByeF9wYXJhbTsKKwlkbWEtPnR4X3BhcmFtID0gdHhfcGFyYW07CisKKwlwb3J0LT5kbWEgPSBkbWE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBzczgyNTBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgdWFydDsKKwlzdHJ1Y3QgbHBzczgyNTAgKmxwc3M7CisJaW50IHJldDsKKworCXJldCA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlscHNzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbHBzcyksIEdGUF9LRVJORUwpOworCWlmICghbHBzcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlscHNzLT5ib2FyZCA9IChzdHJ1Y3QgbHBzczgyNTBfYm9hcmQgKilpZC0+ZHJpdmVyX2RhdGE7CisKKwltZW1zZXQoJnVhcnQsIDAsIHNpemVvZihzdHJ1Y3QgdWFydF84MjUwX3BvcnQpKTsKKworCXVhcnQucG9ydC5kZXYgPSAmcGRldi0+ZGV2OworCXVhcnQucG9ydC5pcnEgPSBwZGV2LT5pcnE7CisJdWFydC5wb3J0LnByaXZhdGVfZGF0YSA9IGxwc3M7CisJdWFydC5wb3J0LnR5cGUgPSBQT1JUXzE2NTUwQTsKKwl1YXJ0LnBvcnQuaW90eXBlID0gVVBJT19NRU07CisJdWFydC5wb3J0LnJlZ3NoaWZ0ID0gMjsKKwl1YXJ0LnBvcnQudWFydGNsayA9IGxwc3MtPmJvYXJkLT5iYXNlX2JhdWQgKiAxNjsKKwl1YXJ0LnBvcnQuZmxhZ3MgPSBVUEZfU0hBUkVfSVJRIHwgVVBGX0ZJWEVEX1BPUlQgfCBVUEZfRklYRURfVFlQRTsKKwl1YXJ0LmNhcGFiaWxpdGllcyA9IFVBUlRfQ0FQX0ZJRk8gfCBVQVJUX0NBUF9BRkU7CisJdWFydC5wb3J0Lm1hcGJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisJdWFydC5wb3J0Lm1lbWJhc2UgPSBwY2ltX2lvbWFwKHBkZXYsIDAsIDApOworCWlmICghdWFydC5wb3J0Lm1lbWJhc2UpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gbHBzcy0+Ym9hcmQtPnNldHVwKGxwc3MsICZ1YXJ0LnBvcnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBscHNzODI1MF9kbWFfc2V0dXAobHBzcywgJnVhcnQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2V4aXQ7CisKKwlyZXQgPSBzZXJpYWw4MjUwX3JlZ2lzdGVyXzgyNTBfcG9ydCgmdWFydCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2V4aXQ7CisKKwlscHNzLT5saW5lID0gcmV0OworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGxwc3MpOworCXJldHVybiAwOworCitlcnJfZXhpdDoKKwlpZiAobHBzcy0+Ym9hcmQtPmV4aXQpCisJCWxwc3MtPmJvYXJkLT5leGl0KGxwc3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGxwc3M4MjUwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbHBzczgyNTAgKmxwc3MgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAobHBzcy0+Ym9hcmQtPmV4aXQpCisJCWxwc3MtPmJvYXJkLT5leGl0KGxwc3MpOworCisJc2VyaWFsODI1MF91bnJlZ2lzdGVyX3BvcnQobHBzcy0+bGluZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbHBzczgyNTBfYm9hcmQgYnl0X2JvYXJkID0geworCS5mcmVxID0gMTAwMDAwMDAwLAorCS5iYXNlX2JhdWQgPSAyNzY0ODAwLAorCS5zZXR1cCA9IGJ5dF9zZXJpYWxfc2V0dXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGxwc3M4MjUwX2JvYXJkIHFya19ib2FyZCA9IHsKKwkuZnJlcSA9IDQ0MjM2ODAwLAorCS5iYXNlX2JhdWQgPSAyNzY0ODAwLAorCS5zZXR1cCA9IHFya19zZXJpYWxfc2V0dXAsCisJLmV4aXQgPSBxcmtfc2VyaWFsX2V4aXQsCit9OworCisjZGVmaW5lIExQU1NfREVWSUNFKGlkLCBib2FyZCkgeyBQQ0lfVkRFVklDRShJTlRFTCwgaWQpLCAoa2VybmVsX3Vsb25nX3QpJmJvYXJkIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBjaV9pZHNbXSA9IHsKKwlMUFNTX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX1FSS19VQVJUeCwgcXJrX2JvYXJkKSwKKwlMUFNTX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMSwgYnl0X2JvYXJkKSwKKwlMUFNTX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMiwgYnl0X2JvYXJkKSwKKwlMUFNTX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMSwgYnl0X2JvYXJkKSwKKwlMUFNTX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMiwgYnl0X2JvYXJkKSwKKwlMUFNTX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMSwgYnl0X2JvYXJkKSwKKwlMUFNTX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMiwgYnl0X2JvYXJkKSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHBjaV9pZHMpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbHBzczgyNTBfcGNpX2RyaXZlciA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiODI1MF9scHNzIiwKKwkuaWRfdGFibGUgICAgICAgPSBwY2lfaWRzLAorCS5wcm9iZSAgICAgICAgICA9IGxwc3M4MjUwX3Byb2JlLAorCS5yZW1vdmUgICAgICAgICA9IGxwc3M4MjUwX3JlbW92ZSwKK307CisKK21vZHVsZV9wY2lfZHJpdmVyKGxwc3M4MjUwX3BjaV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJJbnRlbCBDb3Jwb3JhdGlvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBMUFNTIFVBUlQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX21pZC5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9taWQuYwppbmRleCAzMzlkZTljLi4zOWMyMzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX21pZC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfbWlkLmMKQEAgLTk5LDI3ICs5OSwyNyBAQAogCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSB1cF90b191ODI1MHAocCk7CiAJdW5zaWduZWQgaW50IGZpc3IgPSBzZXJpYWxfcG9ydF9pbihwLCBJTlRFTF9NSURfVUFSVF9ETlZfRklTUik7CiAJdTMyIHN0YXR1czsKLQlpbnQgcmV0ID0gSVJRX05PTkU7CisJaW50IHJldCA9IDA7CiAJaW50IGVycjsKIAogCWlmIChmaXNyICYgQklUKDIpKSB7CiAJCWVyciA9IGhzdV9kbWFfZ2V0X3N0YXR1cygmbWlkLT5kbWFfY2hpcCwgMSwgJnN0YXR1cyk7CiAJCWlmIChlcnIgPiAwKSB7CiAJCQlzZXJpYWw4MjUwX3J4X2RtYV9mbHVzaCh1cCk7Ci0JCQlyZXQgfD0gSVJRX0hBTkRMRUQ7CisJCQlyZXQgfD0gMTsKIAkJfSBlbHNlIGlmIChlcnIgPT0gMCkKIAkJCXJldCB8PSBoc3VfZG1hX2RvX2lycSgmbWlkLT5kbWFfY2hpcCwgMSwgc3RhdHVzKTsKIAl9CiAJaWYgKGZpc3IgJiBCSVQoMSkpIHsKIAkJZXJyID0gaHN1X2RtYV9nZXRfc3RhdHVzKCZtaWQtPmRtYV9jaGlwLCAwLCAmc3RhdHVzKTsKIAkJaWYgKGVyciA+IDApCi0JCQlyZXQgfD0gSVJRX0hBTkRMRUQ7CisJCQlyZXQgfD0gMTsKIAkJZWxzZSBpZiAoZXJyID09IDApCiAJCQlyZXQgfD0gaHN1X2RtYV9kb19pcnEoJm1pZC0+ZG1hX2NoaXAsIDAsIHN0YXR1cyk7CiAJfQogCWlmIChmaXNyICYgQklUKDApKQogCQlyZXQgfD0gc2VyaWFsODI1MF9oYW5kbGVfaXJxKHAsIHNlcmlhbF9wb3J0X2luKHAsIFVBUlRfSUlSKSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gSVJRX1JFVFZBTChyZXQpOwogfQogCiAjZGVmaW5lIEROVl9ETUFfQ0hBTl9PRkZTRVQgMHg4MApAQCAtMTY4LDYgKzE2OCw5IEBACiAJdW5zaWduZWQgbG9uZyB3ID0gQklUKDI0KSAtIDE7CiAJdW5zaWduZWQgbG9uZyBtdWwsIGRpdjsKIAorCS8qIEdyYWNlZnVsbHkgaGFuZGxlIHRoZSBCMCBjYXNlOiBmYWxsIGJhY2sgdG8gQjk2MDAgKi8KKwlmdWFydCA9IGZ1YXJ0ID8gZnVhcnQgOiA5NjAwICogMTY7CisKIAlpZiAobWlkLT5ib2FyZC0+ZnJlcSA8IGZ1YXJ0KSB7CiAJCS8qIEZpbmQgcHJlc2NhbGVyIHZhbHVlIHRoYXQgc2F0aXNmaWVzIEZ1YXJ0IDwgRnJlZiAqLwogCQlpZiAobWlkLT5ib2FyZC0+ZnJlcSA+IGJhdWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX210ay5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9tdGsuYwppbmRleCAzNjExZWM5Li5jZTBjYzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX210ay5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfbXRrLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAkgKi8KIAliYXVkID0gdWFydF9nZXRfYmF1ZF9yYXRlKHBvcnQsIHRlcm1pb3MsIG9sZCwKIAkJCQkgIHBvcnQtPnVhcnRjbGsgLyAxNiAvIDB4ZmZmZiwKLQkJCQkgIHBvcnQtPnVhcnRjbGsgLyAxNik7CisJCQkJICBwb3J0LT51YXJ0Y2xrKTsKIAogCWlmIChiYXVkIDw9IDExNTIwMCkgewogCQlzZXJpYWxfcG9ydF9vdXQocG9ydCwgVUFSVF9NVEtfSElHSFMsIDB4MCk7CkBAIC03NiwxMCArNzYsNiBAQAogCQlxdW90ID0gRElWX1JPVU5EX1VQKHBvcnQtPnVhcnRjbGssIDQgKiBiYXVkKTsKIAl9IGVsc2UgewogCQlzZXJpYWxfcG9ydF9vdXQocG9ydCwgVUFSVF9NVEtfSElHSFMsIDB4Myk7Ci0KLQkJLyogU2V0IHRvIGhpZ2hlc3QgYmF1ZHJhdGUgc3VwcG9ydGVkICovCi0JCWlmIChiYXVkID49IDExNTIwMDApCi0JCQliYXVkID0gOTIxNjAwOwogCQlxdW90ID0gRElWX1JPVU5EX1VQKHBvcnQtPnVhcnRjbGssIDI1NiAqIGJhdWQpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9vZi5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9vZi5jCmluZGV4IDM4OTYzZDcuLjdhOGI1ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfb2YuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX29mLmMKQEAgLTE5NSw2ICsxOTUsNyBAQAogCXN3aXRjaCAocG9ydF90eXBlKSB7CiAJY2FzZSBQT1JUXzgyNTAgLi4uIFBPUlRfTUFYXzgyNTA6CiAJeworCQl1MzIgdHhfdGhyZXNob2xkOwogCQlzdHJ1Y3QgdWFydF84MjUwX3BvcnQgcG9ydDgyNTA7CiAJCW1lbXNldCgmcG9ydDgyNTAsIDAsIHNpemVvZihwb3J0ODI1MCkpOwogCQlwb3J0ODI1MC5wb3J0ID0gcG9ydDsKQEAgLTIwMiw2ICsyMDMsMTIgQEAKIAkJaWYgKHBvcnQuZmlmb3NpemUpCiAJCQlwb3J0ODI1MC5jYXBhYmlsaXRpZXMgPSBVQVJUX0NBUF9GSUZPOwogCisJCS8qIENoZWNrIGZvciBUWCBGSUZPIHRocmVzaG9sZCAmIHNldCB0eF9sb2Fkc3ogKi8KKwkJaWYgKChvZl9wcm9wZXJ0eV9yZWFkX3UzMihvZmRldi0+ZGV2Lm9mX25vZGUsICJ0eC10aHJlc2hvbGQiLAorCQkJCQkgICZ0eF90aHJlc2hvbGQpID09IDApICYmCisJCSAgICAodHhfdGhyZXNob2xkIDwgcG9ydC5maWZvc2l6ZSkpCisJCQlwb3J0ODI1MC50eF9sb2Fkc3ogPSBwb3J0LmZpZm9zaXplIC0gdHhfdGhyZXNob2xkOworCiAJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wob2ZkZXYtPmRldi5vZl9ub2RlLAogCQkJCQkgICJhdXRvLWZsb3ctY29udHJvbCIpKQogCQkJcG9ydDgyNTAuY2FwYWJpbGl0aWVzIHw9IFVBUlRfQ0FQX0FGRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfb21hcC5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9vbWFwLmMKaW5kZXggZTE0OTgyZi4uNjFhZDZjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9vbWFwLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9vbWFwLmMKQEAgLTEzNCwyMSArMTM0LDE4IEBACiAKIAlzZXJpYWw4MjUwX2RvX3NldF9tY3RybChwb3J0LCBtY3RybCk7CiAKLQlpZiAoSVNfRVJSX09SX05VTEwobWN0cmxfZ3Bpb190b19ncGlvZCh1cC0+Z3Bpb3MsCi0JCQkJCQlVQVJUX0dQSU9fUlRTKSkpIHsKLQkJLyoKLQkJICogVHVybiBvZmYgYXV0b1JUUyBpZiBSVFMgaXMgbG93ZXJlZCBhbmQgcmVzdG9yZSBhdXRvUlRTCi0JCSAqIHNldHRpbmcgaWYgUlRTIGlzIHJhaXNlZAotCQkgKi8KLQkJbGNyID0gc2VyaWFsX2luKHVwLCBVQVJUX0xDUik7Ci0JCXNlcmlhbF9vdXQodXAsIFVBUlRfTENSLCBVQVJUX0xDUl9DT05GX01PREVfQik7Ci0JCWlmICgobWN0cmwgJiBUSU9DTV9SVFMpICYmIChwb3J0LT5zdGF0dXMgJiBVUFNUQVRfQVVUT1JUUykpCi0JCQlwcml2LT5lZnIgfD0gVUFSVF9FRlJfUlRTOwotCQllbHNlCi0JCQlwcml2LT5lZnIgJj0gflVBUlRfRUZSX1JUUzsKLQkJc2VyaWFsX291dCh1cCwgVUFSVF9FRlIsIHByaXYtPmVmcik7Ci0JCXNlcmlhbF9vdXQodXAsIFVBUlRfTENSLCBsY3IpOwotCX0KKwkvKgorCSAqIFR1cm4gb2ZmIGF1dG9SVFMgaWYgUlRTIGlzIGxvd2VyZWQgYW5kIHJlc3RvcmUgYXV0b1JUUyBzZXR0aW5nCisJICogaWYgUlRTIGlzIHJhaXNlZAorCSAqLworCWxjciA9IHNlcmlhbF9pbih1cCwgVUFSVF9MQ1IpOworCXNlcmlhbF9vdXQodXAsIFVBUlRfTENSLCBVQVJUX0xDUl9DT05GX01PREVfQik7CisJaWYgKChtY3RybCAmIFRJT0NNX1JUUykgJiYgKHBvcnQtPnN0YXR1cyAmIFVQU1RBVF9BVVRPUlRTKSkKKwkJcHJpdi0+ZWZyIHw9IFVBUlRfRUZSX1JUUzsKKwllbHNlCisJCXByaXYtPmVmciAmPSB+VUFSVF9FRlJfUlRTOworCXNlcmlhbF9vdXQodXAsIFVBUlRfRUZSLCBwcml2LT5lZnIpOworCXNlcmlhbF9vdXQodXAsIFVBUlRfTENSLCBsY3IpOwogfQogCiAvKgpAQCAtNDQ5LDkgKzQ0Niw3IEBACiAJcHJpdi0+ZWZyID0gMDsKIAl1cC0+cG9ydC5zdGF0dXMgJj0gfihVUFNUQVRfQVVUT0NUUyB8IFVQU1RBVF9BVVRPUlRTIHwgVVBTVEFUX0FVVE9YT0ZGKTsKIAotCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUyAmJiB1cC0+cG9ydC5mbGFncyAmIFVQRl9IQVJEX0ZMT1cKLQkJJiYgSVNfRVJSX09SX05VTEwobWN0cmxfZ3Bpb190b19ncGlvZCh1cC0+Z3Bpb3MsCi0JCQkJCQkJVUFSVF9HUElPX1JUUykpKSB7CisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTICYmIHVwLT5wb3J0LmZsYWdzICYgVVBGX0hBUkRfRkxPVykgewogCQkvKiBFbmFibGUgQVVUT0NUUyAoYXV0b1JUUyBpcyBlbmFibGVkIHdoZW4gUlRTIGlzIHJhaXNlZCkgKi8KIAkJdXAtPnBvcnQuc3RhdHVzIHw9IFVQU1RBVF9BVVRPQ1RTIHwgVVBTVEFUX0FVVE9SVFM7CiAJCXByaXYtPmVmciB8PSBVQVJUX0VGUl9DVFM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BjaS5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9wY2kuYwppbmRleCAyMGViYWVhLi5iOThjMTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX3BjaS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcGNpLmMKQEAgLTIxLDE0ICsyMSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvODI1MF9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9yYXRpb25hbC5oPgogCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9kbWEtZHcuaD4KLQogI2luY2x1ZGUgIjgyNTAuaCIKIAogLyoKQEAgLTEzNDksMTYwICsxMzQ1LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQxCTB4MGYwYQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMgkweDBmMGMKLQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMQkweDIyOGEKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDIJMHgyMjhjCi0KLSNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDEJMHg5Y2UzCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQyCTB4OWNlNAotCi0jZGVmaW5lIEJZVF9QUlZfQ0xLCQkJMHg4MDAKLSNkZWZpbmUgQllUX1BSVl9DTEtfRU4JCQkoMSA8PCAwKQotI2RlZmluZSBCWVRfUFJWX0NMS19NX1ZBTF9TSElGVAkJMQotI2RlZmluZSBCWVRfUFJWX0NMS19OX1ZBTF9TSElGVAkJMTYKLSNkZWZpbmUgQllUX1BSVl9DTEtfVVBEQVRFCQkoMSA8PCAzMSkKLQotI2RlZmluZSBCWVRfVFhfT1ZGX0lOVAkJCTB4ODIwCi0jZGVmaW5lIEJZVF9UWF9PVkZfSU5UX01BU0sJCSgxIDw8IDEpCi0KLXN0YXRpYyB2b2lkCi1ieXRfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAotCQlzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKLXsKLQl1bnNpZ25lZCBpbnQgYmF1ZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZSh0ZXJtaW9zKTsKLQl1bnNpZ25lZCBsb25nIGZyZWYgPSAxMDAwMDAwMDAsIGZ1YXJ0ID0gYmF1ZCAqIDE2OwotCXVuc2lnbmVkIGxvbmcgdyA9IEJJVCgxNSkgLSAxOwotCXVuc2lnbmVkIGxvbmcgbSwgbjsKLQl1MzIgcmVnOwotCi0JLyogR3JhY2VmdWxseSBoYW5kbGUgdGhlIEIwIGNhc2U6IGZhbGwgYmFjayB0byBCOTYwMCAqLwotCWZ1YXJ0ID0gZnVhcnQgPyBmdWFydCA6IDk2MDAgKiAxNjsKLQotCS8qIEdldCBGdWFydCBjbG9zZXIgdG8gRnJlZiAqLwotCWZ1YXJ0ICo9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKGZyZWYgLyBmdWFydCk7Ci0KLQkvKgotCSAqIEZvciBiYXVkIHJhdGVzIDAuNU0sIDFNLCAxLjVNLCAyTSwgMi41TSwgM00sIDMuNU0gYW5kIDRNIHRoZQotCSAqIGRpdmlkZXJzIG11c3QgYmUgYWRqdXN0ZWQuCi0JICoKLQkgKiB1YXJ0Y2xrID0gKG0gLyBuKSAqIDEwMCBNSHosIHdoZXJlIG0gPD0gbgotCSAqLwotCXJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbihmdWFydCwgZnJlZiwgdywgdywgJm0sICZuKTsKLQlwLT51YXJ0Y2xrID0gZnVhcnQ7Ci0KLQkvKiBSZXNldCB0aGUgY2xvY2sgKi8KLQlyZWcgPSAobSA8PCBCWVRfUFJWX0NMS19NX1ZBTF9TSElGVCkgfCAobiA8PCBCWVRfUFJWX0NMS19OX1ZBTF9TSElGVCk7Ci0Jd3JpdGVsKHJlZywgcC0+bWVtYmFzZSArIEJZVF9QUlZfQ0xLKTsKLQlyZWcgfD0gQllUX1BSVl9DTEtfRU4gfCBCWVRfUFJWX0NMS19VUERBVEU7Ci0Jd3JpdGVsKHJlZywgcC0+bWVtYmFzZSArIEJZVF9QUlZfQ0xLKTsKLQotCXAtPnN0YXR1cyAmPSB+VVBTVEFUX0FVVE9DVFM7Ci0JaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKQotCQlwLT5zdGF0dXMgfD0gVVBTVEFUX0FVVE9DVFM7Ci0KLQlzZXJpYWw4MjUwX2RvX3NldF90ZXJtaW9zKHAsIHRlcm1pb3MsIG9sZCk7Ci19Ci0KLXN0YXRpYyBib29sIGJ5dF9kbWFfZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCi17Ci0Jc3RydWN0IGR3X2RtYV9zbGF2ZSAqZHdzID0gcGFyYW07Ci0KLQlpZiAoZHdzLT5kbWFfZGV2ICE9IGNoYW4tPmRldmljZS0+ZGV2KQotCQlyZXR1cm4gZmFsc2U7Ci0KLQljaGFuLT5wcml2YXRlID0gZHdzOwotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1ieXRfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JdW5zaWduZWQgaW50IHJldCA9IHNlcmlhbDgyNTBfZG9fZ2V0X21jdHJsKHBvcnQpOwotCi0JLyogRm9yY2UgRENEIGFuZCBEU1Igc2lnbmFscyB0byBwZXJtYW5lbnRseSBiZSByZXBvcnRlZCBhcyBhY3RpdmUuICovCi0JcmV0IHw9IFRJT0NNX0NBUiB8IFRJT0NNX0RTUjsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWJ5dF9zZXJpYWxfc2V0dXAoc3RydWN0IHNlcmlhbF9wcml2YXRlICpwcml2LAotCQkgY29uc3Qgc3RydWN0IHBjaXNlcmlhbF9ib2FyZCAqYm9hcmQsCi0JCSBzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnBvcnQsIGludCBpZHgpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwcml2LT5kZXY7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcG9ydC0+cG9ydC5kZXY7Ci0Jc3RydWN0IHVhcnRfODI1MF9kbWEgKmRtYTsKLQlzdHJ1Y3QgZHdfZG1hX3NsYXZlICp0eF9wYXJhbSwgKnJ4X3BhcmFtOwotCXN0cnVjdCBwY2lfZGV2ICpkbWFfZGV2OwotCWludCByZXQ7Ci0KLQlkbWEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRtYSksIEdGUF9LRVJORUwpOwotCWlmICghZG1hKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXR4X3BhcmFtID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCp0eF9wYXJhbSksIEdGUF9LRVJORUwpOwotCWlmICghdHhfcGFyYW0pCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcnhfcGFyYW0gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnJ4X3BhcmFtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyeF9wYXJhbSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzd2l0Y2ggKHBkZXYtPmRldmljZSkgewotCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDE6Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMToKLQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQxOgotCQlyeF9wYXJhbS0+c3JjX2lkID0gMzsKLQkJdHhfcGFyYW0tPmRzdF9pZCA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDI6Ci0JY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMjoKLQljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQyOgotCQlyeF9wYXJhbS0+c3JjX2lkID0gNTsKLQkJdHhfcGFyYW0tPmRzdF9pZCA9IDQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJ4X3BhcmFtLT5tX21hc3RlciA9IDA7Ci0JcnhfcGFyYW0tPnBfbWFzdGVyID0gMTsKLQotCWRtYS0+cnhjb25mLnNyY19tYXhidXJzdCA9IDE2OwotCi0JdHhfcGFyYW0tPm1fbWFzdGVyID0gMDsKLQl0eF9wYXJhbS0+cF9tYXN0ZXIgPSAxOwotCi0JZG1hLT50eGNvbmYuZHN0X21heGJ1cnN0ID0gMTY7Ci0KLQlkbWFfZGV2ID0gcGNpX2dldF9zbG90KHBkZXYtPmJ1cywgUENJX0RFVkZOKFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgMCkpOwotCXJ4X3BhcmFtLT5kbWFfZGV2ID0gJmRtYV9kZXYtPmRldjsKLQl0eF9wYXJhbS0+ZG1hX2RldiA9ICZkbWFfZGV2LT5kZXY7Ci0KLQlkbWEtPmZuID0gYnl0X2RtYV9maWx0ZXI7Ci0JZG1hLT5yeF9wYXJhbSA9IHJ4X3BhcmFtOwotCWRtYS0+dHhfcGFyYW0gPSB0eF9wYXJhbTsKLQotCXJldCA9IHBjaV9kZWZhdWx0X3NldHVwKHByaXYsIGJvYXJkLCBwb3J0LCBpZHgpOwotCXBvcnQtPnBvcnQuaW90eXBlID0gVVBJT19NRU07Ci0JcG9ydC0+cG9ydC50eXBlID0gUE9SVF8xNjU1MEE7Ci0JcG9ydC0+cG9ydC5mbGFncyA9IChwb3J0LT5wb3J0LmZsYWdzIHwgVVBGX0ZJWEVEX1BPUlQgfCBVUEZfRklYRURfVFlQRSk7Ci0JcG9ydC0+cG9ydC5zZXRfdGVybWlvcyA9IGJ5dF9zZXRfdGVybWlvczsKLQlwb3J0LT5wb3J0LmdldF9tY3RybCA9IGJ5dF9nZXRfbWN0cmw7Ci0JcG9ydC0+cG9ydC5maWZvc2l6ZSA9IDY0OwotCXBvcnQtPnR4X2xvYWRzeiA9IDY0OwotCXBvcnQtPmRtYSA9IGRtYTsKLQlwb3J0LT5jYXBhYmlsaXRpZXMgPSBVQVJUX0NBUF9GSUZPIHwgVUFSVF9DQVBfQUZFOwotCi0JLyogRGlzYWJsZSBUeCBjb3VudGVyIGludGVycnVwdHMgKi8KLQl3cml0ZWwoQllUX1RYX09WRl9JTlRfTUFTSywgcG9ydC0+cG9ydC5tZW1iYXNlICsgQllUX1RYX09WRl9JTlQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIGludAogcGNpX29tZWdhcGNpX3NldHVwKHN0cnVjdCBzZXJpYWxfcHJpdmF0ZSAqcHJpdiwKIAkJICAgICAgY29uc3Qgc3RydWN0IHBjaXNlcmlhbF9ib2FyZCAqYm9hcmQsCkBAIC0xNzQxLDYgKzE1ODMsMTkgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9FWEFSX1hSMTdWNDM1OAkweDQzNTgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9FWEFSX1hSMTdWODM1OAkweDgzNTgKIAorI2RlZmluZSBVQVJUX0VYQVJfTVBJT0lOVF83XzAJMHg4ZgkvKiBNUElPSU5UWzc6MF0gKi8KKyNkZWZpbmUgVUFSVF9FWEFSX01QSU9MVkxfN18wCTB4OTAJLyogTVBJT0xWTFs3OjBdICovCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPM1RfN18wCTB4OTEJLyogTVBJTzNUWzc6MF0gKi8KKyNkZWZpbmUgVUFSVF9FWEFSX01QSU9JTlZfN18wCTB4OTIJLyogTVBJT0lOVls3OjBdICovCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPU0VMXzdfMAkweDkzCS8qIE1QSU9TRUxbNzowXSAqLworI2RlZmluZSBVQVJUX0VYQVJfTVBJT09EXzdfMAkweDk0CS8qIE1QSU9PRFs3OjBdICovCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPSU5UXzE1XzgJMHg5NQkvKiBNUElPSU5UWzE1OjhdICovCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPTFZMXzE1XzgJMHg5NgkvKiBNUElPTFZMWzE1OjhdICovCisjZGVmaW5lIFVBUlRfRVhBUl9NUElPM1RfMTVfOAkweDk3CS8qIE1QSU8zVFsxNTo4XSAqLworI2RlZmluZSBVQVJUX0VYQVJfTVBJT0lOVl8xNV84CTB4OTgJLyogTVBJT0lOVlsxNTo4XSAqLworI2RlZmluZSBVQVJUX0VYQVJfTVBJT1NFTF8xNV84CTB4OTkJLyogTVBJT1NFTFsxNTo4XSAqLworI2RlZmluZSBVQVJUX0VYQVJfTVBJT09EXzE1XzgJMHg5YQkvKiBNUElPT0RbMTU6OF0gKi8KKwogc3RhdGljIGludAogcGNpX3hyMTdjMTU0X3NldHVwKHN0cnVjdCBzZXJpYWxfcHJpdmF0ZSAqcHJpdiwKIAkJICBjb25zdCBzdHJ1Y3QgcGNpc2VyaWFsX2JvYXJkICpib2FyZCwKQEAgLTE3ODMsMTggKzE2MzgsMTggQEAKIAkgKiBTZXR1cCBNdWx0aXB1cnBvc2UgSW5wdXQvT3V0cHV0IHBpbnMuCiAJICovCiAJaWYgKGlkeCA9PSAwKSB7Ci0JCXdyaXRlYigweDAwLCBwICsgMHg4Zik7IC8qTVBJT0lOVFs3OjBdKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDkwKTsgLypNUElPTFZMWzc6MF0qLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTEpOyAvKk1QSU8zVFs3OjBdKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDkyKTsgLypNUElPSU5WWzc6MF0qLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTMpOyAvKk1QSU9TRUxbNzowXSovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5NCk7IC8qTVBJT09EWzc6MF0qLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTUpOyAvKk1QSU9JTlRbMTU6OF0qLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTYpOyAvKk1QSU9MVkxbMTU6OF0qLwotCQl3cml0ZWIoMHgwMCwgcCArIDB4OTcpOyAvKk1QSU8zVFsxNTo4XSovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5OCk7IC8qTVBJT0lOVlsxNTo4XSovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5OSk7IC8qTVBJT1NFTFsxNTo4XSovCi0JCXdyaXRlYigweDAwLCBwICsgMHg5YSk7IC8qTVBJT09EWzE1OjhdKi8KKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT0lOVF83XzApOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPTFZMXzdfMCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU8zVF83XzApOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPSU5WXzdfMCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9TRUxfN18wKTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT09EXzdfMCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9JTlRfMTVfOCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9MVkxfMTVfOCk7CisJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU8zVF8xNV84KTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT0lOVl8xNV84KTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT1NFTF8xNV84KTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT09EXzE1XzgpOwogCX0KIAl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl84WE1PREUpOwogCXdyaXRlYihVQVJUX0ZDVFJfRVhBUl9UUkdELCBwICsgVUFSVF9FWEFSX0ZDVFIpOwpAQCAtMTgzMCwyMCArMTY4NSwyMCBAQAogCQlzd2l0Y2ggKHByaXYtPmRldi0+ZGV2aWNlKSB7CiAJCWNhc2UgUENJX0RFVklDRV9JRF9DT01NVEVDSF80MjIyUENJMzM1OgogCQljYXNlIFBDSV9ERVZJQ0VfSURfQ09NTVRFQ0hfNDIyNFBDSTMzNToKLQkJCXdyaXRlYigweDc4LCBwICsgMHg5MCk7IC8qIE1QSU9MVkxbNzowXSAqLwotCQkJd3JpdGViKDB4MDAsIHAgKyAweDkyKTsgLyogTVBJT0lOVls3OjBdICovCi0JCQl3cml0ZWIoMHgwMCwgcCArIDB4OTMpOyAvKiBNUElPU0VMWzc6MF0gKi8KKwkJCXdyaXRlYigweDc4LCBwICsgVUFSVF9FWEFSX01QSU9MVkxfN18wKTsKKwkJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9JTlZfN18wKTsKKwkJCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSX01QSU9TRUxfN18wKTsKIAkJCWJyZWFrOwogCQljYXNlIFBDSV9ERVZJQ0VfSURfQ09NTVRFQ0hfMjMyNFBDSTMzNToKIAkJY2FzZSBQQ0lfREVWSUNFX0lEX0NPTU1URUNIXzIzMjhQQ0kzMzU6Ci0JCQl3cml0ZWIoMHgwMCwgcCArIDB4OTApOyAvKiBNUElPTFZMWzc6MF0gKi8KLQkJCXdyaXRlYigweGMwLCBwICsgMHg5Mik7IC8qIE1QSU9JTlZbNzowXSAqLwotCQkJd3JpdGViKDB4YzAsIHAgKyAweDkzKTsgLyogTVBJT1NFTFs3OjBdICovCisJCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPTFZMXzdfMCk7CisJCQl3cml0ZWIoMHhjMCwgcCArIFVBUlRfRVhBUl9NUElPSU5WXzdfMCk7CisJCQl3cml0ZWIoMHhjMCwgcCArIFVBUlRfRVhBUl9NUElPU0VMXzdfMCk7CiAJCQlicmVhazsKIAkJfQotCQl3cml0ZWIoMHgwMCwgcCArIDB4OGYpOyAvKiBNUElPSU5UWzc6MF0gKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDkxKTsgLyogTVBJTzNUWzc6MF0gKi8KLQkJd3JpdGViKDB4MDAsIHAgKyAweDk0KTsgLyogTVBJT09EWzc6MF0gKi8KKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT0lOVF83XzApOworCQl3cml0ZWIoMHgwMCwgcCArIFVBUlRfRVhBUl9NUElPM1RfN18wKTsKKwkJd3JpdGViKDB4MDAsIHAgKyBVQVJUX0VYQVJfTVBJT09EXzdfMCk7CiAJfQogCXdyaXRlYigweDAwLCBwICsgVUFSVF9FWEFSXzhYTU9ERSk7CiAJd3JpdGViKFVBUlRfRkNUUl9FWEFSX1RSR0QsIHAgKyBVQVJUX0VYQVJfRkNUUik7CkBAIC0xOTM0LDcgKzE3ODksNiBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NPTU1URUNIXzQyMjJQQ0lFCTB4MDAyMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0JST0FEQ09NX1RSVU1BTkFHRSAweDE2MGEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTUNDX0FERElEQVRBX0FQQ0k3ODAwIDB4ODE4ZQotI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX1FSS19VQVJUCTB4MDkzNgogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfU1VOSVgJCTB4MWZkNAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NVTklYXzE5OTkJMHgxOTk5CkBAIC0xOTUwLDYgKzE4MDQsNDMgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9QRVJJQ09NX1BJN0M5WDc5NTQJMHg3OTU0CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUEVSSUNPTV9QSTdDOVg3OTU4CTB4Nzk1OAogCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQUNDRVNJTwkJCTB4NDk0ZgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fMlNEQgkweDEwNTEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTV8yUwkweDEwNTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzRTREIJMHgxMDVDCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT01fNFMJMHgxMDVFCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTIzMl8yREIJMHgxMDkxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT00yMzJfMgkweDEwOTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NMjMyXzREQgkweDEwOTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTTIzMl80CTB4MTA5QgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fMlNNREIJMHgxMEQxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT01fMlNNCTB4MTBEMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fNFNNREIJMHgxMERBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT01fNFNNCTB4MTBEQworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNNDg1XzEJMHgxMTA4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ000MjJfMgkweDExMTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTQ4NV8yCTB4MTExMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNNDIyXzQJMHgxMTE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ000ODVfNAkweDExMTkKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNXzJTCTB4MTE1MgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ01fNFMJMHgxMTVBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTTIzMl8yCTB4MTE5MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNMjMyXzIJMHgxMTkxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTTIzMl80CTB4MTE5OAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNMjMyXzQJMHgxMTk5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTV8yU00JMHgxMUQwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTQyMl80CTB4MTA1QQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT000ODVfNAkweDEwNUIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NNDIyXzgJMHgxMDZBCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTTQ4NV84CTB4MTA2QgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT00yMzJfNAkweDEwOTgKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NMjMyXzgJMHgxMEE5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV80U00JMHgxMEQ5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV84U00JMHgxMEU5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTV80U00JMHgxMUQ4CisKKworCiAvKiBVbmtub3duIHZlbmRvcnMvY2FyZHMgLSB0aGlzIHNob3VsZCBub3QgYmUgaW4gbGludXgvcGNpX2lkcy5oICovCiAjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfVU5LTk9XTl8weDE1ODQJMHgxNTg0CiAjZGVmaW5lIFBDSV9TVUJERVZJQ0VfSURfVU5LTk9XTl8weDE1ODgJMHgxNTg4CkBAIC0yMDQxLDQ4ICsxOTMyLDYgQEAKIAkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCiAJCS5zZXR1cAkJPSBrdF9zZXJpYWxfc2V0dXAsCiAJfSwKLQl7Ci0JCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMSwKLQkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCi0JCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAotCQkuc2V0dXAJCT0gYnl0X3NlcmlhbF9zZXR1cCwKLQl9LAotCXsKLQkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfSU5URUxfQllUX1VBUlQyLAotCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKLQkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCi0JCS5zZXR1cAkJPSBieXRfc2VyaWFsX3NldHVwLAotCX0sCi0JewotCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9JTlRFTF9CU1dfVUFSVDEsCi0JCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAotCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKLQkJLnNldHVwCQk9IGJ5dF9zZXJpYWxfc2V0dXAsCi0JfSwKLQl7Ci0JCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9JTlRFTCwKLQkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMiwKLQkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCi0JCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAotCQkuc2V0dXAJCT0gYnl0X3NlcmlhbF9zZXR1cCwKLQl9LAotCXsKLQkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0lOVEVMLAotCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfSU5URUxfQkRXX1VBUlQxLAotCQkuc3VidmVuZG9yCT0gUENJX0FOWV9JRCwKLQkJLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCi0JCS5zZXR1cAkJPSBieXRfc2VyaWFsX3NldHVwLAotCX0sCi0JewotCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfSU5URUwsCi0JCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDIsCi0JCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAotCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKLQkJLnNldHVwCQk9IGJ5dF9zZXJpYWxfc2V0dXAsCi0JfSwKIAkvKgogCSAqIElURQogCSAqLwpAQCAtMjk1NSw4ICsyODA0LDYgQEAKIAlwYm5fQURESURBVEFfUENJZV80XzM5MDYyNTAsCiAJcGJuX0FERElEQVRBX1BDSWVfOF8zOTA2MjUwLAogCXBibl9jZTQxMDBfMV8xMTUyMDAsCi0JcGJuX2J5dCwKLQlwYm5fcXJrLAogCXBibl9vbWVnYXBjaSwKIAlwYm5fTkVUTU9TOTkwMF8yc18xMTUyMDAsCiAJcGJuX2JyY21fdHJ1bWFuYWdlLApAQCAtMzczMiwxOCArMzU3OSw2IEBACiAJCS5iYXNlX2JhdWQJPSA5MjE2MDAsCiAJCS5yZWdfc2hpZnQgICAgICA9IDIsCiAJfSwKLQlbcGJuX2J5dF0gPSB7Ci0JCS5mbGFncwkJPSBGTF9CQVNFMCwKLQkJLm51bV9wb3J0cwk9IDEsCi0JCS5iYXNlX2JhdWQJPSAyNzY0ODAwLAotCQkucmVnX3NoaWZ0ICAgICAgPSAyLAotCX0sCi0JW3Bibl9xcmtdID0gewotCQkuZmxhZ3MJCT0gRkxfQkFTRTAsCi0JCS5udW1fcG9ydHMJPSAxLAotCQkuYmFzZV9iYXVkCT0gMjc2NDgwMCwKLQkJLnJlZ19zaGlmdAk9IDIsCi0JfSwKIAlbcGJuX29tZWdhcGNpXSA9IHsKIAkJLmZsYWdzCQk9IEZMX0JBU0UwLAogCQkubnVtX3BvcnRzCT0gOCwKQEAgLTM4NTUsNiArMzY5MCwxNSBAQAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MDgxZCksIH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxMTkxKSwgfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDE5ZDgpLCB9LAorCisJLyogSW50ZWwgcGxhdGZvcm1zIHdpdGggRGVzaWduV2FyZSBVQVJUICovCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwOTM2KSwgfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDBmMGEpLCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MGYwYyksIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyMjhhKSwgfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDIyOGMpLCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OWNlMyksIH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg5Y2U0KSwgfSwKIH07CiAKIC8qCkBAIC01MTEzLDYgKzQ5NTcsMTA4IEBACiAJCTAsCiAJCTAsIHBibl9wZXJpY29tX1BJN0M5WDc5NTggfSwKIAkvKgorCSAqIEFDQ0VTIEkvTyBQcm9kdWN0cyBxdWFkCisJICovCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0NPTV8yU0RCLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT01fMlMsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzRTREIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTV80UywKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT00yMzJfMkRCLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT00yMzJfMiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT00yMzJfNERCLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT00yMzJfNCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fMlNNREIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0NPTV8yU00sCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzRTTURCLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9DT01fNFNNLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ000ODVfMSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNNDIyXzIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTQ4NV8yLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19NUENJRV9JQ000MjJfNCwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNNDg1XzQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNXzJTLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTV80UywKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9JQ00yMzJfMiwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1NCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fTVBDSUVfSUNNMjMyXzIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfSUNNMjMyXzQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX01QQ0lFX0lDTTIzMl80LAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU0IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTV8yU00sCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTQgfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NNDIyXzQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTggfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NNDg1XzQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTggfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NNDIyXzgsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTggfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NNDg1XzgsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTggfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NMjMyXzQsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTggfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NMjMyXzgsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTggfSwKKwl7CVBDSV9WRU5ET1JfSURfQUNDRVNJTywgUENJX0RFVklDRV9JRF9BQ0NFU0lPX1BDSUVfQ09NXzRTTSwKKwkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkJcGJuX3Blcmljb21fUEk3QzlYNzk1OCB9LAorCXsJUENJX1ZFTkRPUl9JRF9BQ0NFU0lPLCBQQ0lfREVWSUNFX0lEX0FDQ0VTSU9fUENJRV9DT01fOFNNLAorCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCQlwYm5fcGVyaWNvbV9QSTdDOVg3OTU4IH0sCisJewlQQ0lfVkVORE9SX0lEX0FDQ0VTSU8sIFBDSV9ERVZJQ0VfSURfQUNDRVNJT19QQ0lFX0lDTV80U00sCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJCXBibl9wZXJpY29tX1BJN0M5WDc5NTggfSwKKwkvKgogCSAqIFRvcGljIFRQNTYwIERhdGEvRmF4L1ZvaWNlIDU2ayBtb2RlbSAocmVwb3J0ZWQgYnkgRXZhbiBDbGFya2UpCiAJICovCiAJewlQQ0lfVkVORE9SX0lEX1RPUElDLCBQQ0lfREVWSUNFX0lEX1RPUElDX1RQNTYwLApAQCAtNTUyMCw0MCArNTQ2Niw3IEBACiAJewlQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0NFNDEwMF9VQVJULAogCQlQQ0lfQU5ZX0lELCAgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2NlNDEwMF8xXzExNTIwMCB9LAotCS8qIEludGVsIEJheVRyYWlsICovCi0JewlQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVF9VQVJUMSwKLQkJUENJX0FOWV9JRCwgIFBDSV9BTllfSUQsCi0JCVBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX1NFUklBTCA8PCA4LCAweGZmMDAwMCwKLQkJcGJuX2J5dCB9LAotCXsJUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9CWVRfVUFSVDIsCi0JCVBDSV9BTllfSUQsICBQQ0lfQU5ZX0lELAotCQlQQ0lfQ0xBU1NfQ09NTVVOSUNBVElPTl9TRVJJQUwgPDwgOCwgMHhmZjAwMDAsCi0JCXBibl9ieXQgfSwKLQl7CVBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfQlNXX1VBUlQxLAotCQlQQ0lfQU5ZX0lELCAgUENJX0FOWV9JRCwKLQkJUENJX0NMQVNTX0NPTU1VTklDQVRJT05fU0VSSUFMIDw8IDgsIDB4ZmYwMDAwLAotCQlwYm5fYnl0IH0sCi0JewlQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0JTV19VQVJUMiwKLQkJUENJX0FOWV9JRCwgIFBDSV9BTllfSUQsCi0JCVBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX1NFUklBTCA8PCA4LCAweGZmMDAwMCwKLQkJcGJuX2J5dCB9LAogCi0JLyogSW50ZWwgQnJvYWR3ZWxsICovCi0JewlQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0JEV19VQVJUMSwKLQkJUENJX0FOWV9JRCwgIFBDSV9BTllfSUQsCi0JCVBDSV9DTEFTU19DT01NVU5JQ0FUSU9OX1NFUklBTCA8PCA4LCAweGZmMDAwMCwKLQkJcGJuX2J5dCB9LAotCXsJUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9CRFdfVUFSVDIsCi0JCVBDSV9BTllfSUQsICBQQ0lfQU5ZX0lELAotCQlQQ0lfQ0xBU1NfQ09NTVVOSUNBVElPTl9TRVJJQUwgPDwgOCwgMHhmZjAwMDAsCi0JCXBibl9ieXQgfSwKLQotCS8qCi0JICogSW50ZWwgUXVhcmsgeDEwMDAKLQkgKi8KLQl7CVBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfUVJLX1VBUlQsCi0JCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCi0JCXBibl9xcmsgfSwKIAkvKgogCSAqIENyb255eCBPbWVnYSBQQ0kKIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfcG9ydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9wb3J0LmMKaW5kZXggNzQ4MWI5NS4uMWJmYjZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9wb3J0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9wb3J0LmMKQEAgLTE3OCw3ICsxNzgsNyBAQAogCQkuZmlmb19zaXplCT0gMTYsCiAJCS50eF9sb2Fkc3oJPSAxNiwKIAkJLmZjcgkJPSBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX1JfVFJJR18wMCwKLQkJLmZsYWdzCQk9IFVBUlRfQ0FQX0ZJRk8gfCBVQVJUX0NBUF9BRkUsCisJCS5mbGFncwkJPSBVQVJUX0NBUF9GSUZPIC8qIHwgVUFSVF9DQVBfQUZFICovLAogCX0sCiAJW1BPUlRfVTZfMTY1NTBBXSA9IHsKIAkJLm5hbWUJCT0gIlU2XzE2NTUwQSIsCkBAIC01ODUsMTEgKzU4NSwxMSBAQAogICovCiBpbnQgc2VyaWFsODI1MF9lbTQ4NV9pbml0KHN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqcCkKIHsKLQlpZiAocC0+ZW00ODUgIT0gTlVMTCkKKwlpZiAocC0+ZW00ODUpCiAJCXJldHVybiAwOwogCiAJcC0+ZW00ODUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWFydF84MjUwX2VtNDg1KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHAtPmVtNDg1ID09IE5VTEwpCisJaWYgKCFwLT5lbTQ4NSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzZXR1cF90aW1lcigmcC0+ZW00ODUtPnN0b3BfdHhfdGltZXIsCkBAIC02MTksNyArNjE5LDcgQEAKICAqLwogdm9pZCBzZXJpYWw4MjUwX2VtNDg1X2Rlc3Ryb3koc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwKQogewotCWlmIChwLT5lbTQ4NSA9PSBOVUxMKQorCWlmICghcC0+ZW00ODUpCiAJCXJldHVybjsKIAogCWRlbF90aW1lcigmcC0+ZW00ODUtPnN0YXJ0X3R4X3RpbWVyKTsKQEAgLTE0MDIsMTAgKzE0MDIsOCBAQAogCiBzdGF0aWMgdm9pZCBfX2RvX3N0b3BfdHhfcnM0ODUoc3RydWN0IHVhcnRfODI1MF9wb3J0ICpwKQogewotCWlmICghcC0+ZW00ODUpCi0JCXJldHVybjsKLQogCXNlcmlhbDgyNTBfZW00ODVfcnRzX2FmdGVyX3NlbmQocCk7CisKIAkvKgogCSAqIEVtcHR5IHRoZSBSWCBGSUZPLCB3ZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gYW55dGhpbmcKIAkgKiByZWNlaXZlZCBkdXJpbmcgdGhlIGhhbGYtZHVwbGV4IHRyYW5zbWlzc2lvbi4KQEAgLTE0MTQsMTIgKzE0MTIsOCBAQAogCWlmICghKHAtPnBvcnQucnM0ODUuZmxhZ3MgJiBTRVJfUlM0ODVfUlhfRFVSSU5HX1RYKSkgewogCQlzZXJpYWw4MjUwX2NsZWFyX2ZpZm9zKHApOwogCi0JCXNlcmlhbDgyNTBfcnBtX2dldChwKTsKLQogCQlwLT5pZXIgfD0gVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsKIAkJc2VyaWFsX3BvcnRfb3V0KCZwLT5wb3J0LCBVQVJUX0lFUiwgcC0+aWVyKTsKLQotCQlzZXJpYWw4MjUwX3JwbV9wdXQocCk7CiAJfQogfQogCkBAIC0xNDI5LDYgKzE0MjMsNyBAQAogCXN0cnVjdCB1YXJ0XzgyNTBfZW00ODUgKmVtNDg1ID0gcC0+ZW00ODU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXNlcmlhbDgyNTBfcnBtX2dldChwKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+cG9ydC5sb2NrLCBmbGFncyk7CiAJaWYgKGVtNDg1ICYmCiAJICAgIGVtNDg1LT5hY3RpdmVfdGltZXIgPT0gJmVtNDg1LT5zdG9wX3R4X3RpbWVyKSB7CkBAIC0xNDM2LDE1ICsxNDMxLDEzIEBACiAJCWVtNDg1LT5hY3RpdmVfdGltZXIgPSBOVUxMOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5wb3J0LmxvY2ssIGZsYWdzKTsKKwlzZXJpYWw4MjUwX3JwbV9wdXQocCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fc3RvcF90eF9yczQ4NShzdHJ1Y3QgdWFydF84MjUwX3BvcnQgKnApCiB7CiAJc3RydWN0IHVhcnRfODI1MF9lbTQ4NSAqZW00ODUgPSBwLT5lbTQ4NTsKIAotCWlmICghZW00ODUpCi0JCXJldHVybjsKLQogCS8qCiAJICogX19kb19zdG9wX3R4X3JzNDg1IGlzIGdvaW5nIHRvIHNldCBSVFMgYWNjb3JkaW5nIHRvIGNvbmZpZwogCSAqIEFORCBmbHVzaCBSWCBGSUZPIGlmIHJlcXVpcmVkLgpAQCAtMTQ3NSw3ICsxNDY4LDcgQEAKIAkJdW5zaWduZWQgY2hhciBsc3IgPSBzZXJpYWxfaW4ocCwgVUFSVF9MU1IpOwogCQkvKgogCQkgKiBUbyBwcm92aWRlIHJlcXVpcmVkIHRpbWVpbmcgYW5kIGFsbG93IEZJRk8gdHJhbnNmZXIsCi0JCSAqIF9fc3RvcF90eF9yczQ4NSBtdXN0IGJlIGNhbGxlZCBvbmx5IHdoZW4gYm90aCBGSUZPIGFuZAorCQkgKiBfX3N0b3BfdHhfcnM0ODUoKSBtdXN0IGJlIGNhbGxlZCBvbmx5IHdoZW4gYm90aCBGSUZPIGFuZAogCQkgKiBzaGlmdCByZWdpc3RlciBhcmUgZW1wdHkuIEl0IGlzIGZvciBkZXZpY2UgZHJpdmVyIHRvIGVuYWJsZQogCQkgKiBpbnRlcnJ1cHQgb24gVEVNVC4KIAkJICovCkBAIC0xNDg0LDkgKzE0NzcsMTAgQEAKIAogCQlkZWxfdGltZXIoJmVtNDg1LT5zdGFydF90eF90aW1lcik7CiAJCWVtNDg1LT5hY3RpdmVfdGltZXIgPSBOVUxMOworCisJCV9fc3RvcF90eF9yczQ4NShwKTsKIAl9CiAJX19kb19zdG9wX3R4KHApOwotCV9fc3RvcF90eF9yczQ4NShwKTsKIH0KIAogc3RhdGljIHZvaWQgc2VyaWFsODI1MF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC0xNjE4LDggKzE2MTIsNiBAQAogCWlmICh1cC0+YnVncyAmIFVBUlRfQlVHX05PTVNSKQogCQlyZXR1cm47CiAKLQltY3RybF9ncGlvX2Rpc2FibGVfbXModXAtPmdwaW9zKTsKLQogCXVwLT5pZXIgJj0gflVBUlRfSUVSX01TSTsKIAlzZXJpYWxfcG9ydF9vdXQocG9ydCwgVUFSVF9JRVIsIHVwLT5pZXIpOwogfQpAQCAtMTYzMiw4ICsxNjI0LDYgQEAKIAlpZiAodXAtPmJ1Z3MgJiBVQVJUX0JVR19OT01TUikKIAkJcmV0dXJuOwogCi0JbWN0cmxfZ3Bpb19lbmFibGVfbXModXAtPmdwaW9zKTsKLQogCXVwLT5pZXIgfD0gVUFSVF9JRVJfTVNJOwogCiAJc2VyaWFsODI1MF9ycG1fZ2V0KHVwKTsKQEAgLTE4ODAsNiArMTg3MCwzMCBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBOZXdlciAxNjU1MCBjb21wYXRpYmxlIHBhcnRzIHN1Y2ggYXMgdGhlIFNDMTZDNjUwICYgQWx0ZXJhIDE2NTUwIFNvZnQgSVAKKyAqIGhhdmUgYSBwcm9ncmFtbWFibGUgVFggdGhyZXNob2xkIHRoYXQgdHJpZ2dlcnMgdGhlIFRIUkUgaW50ZXJydXB0IGluCisgKiB0aGUgSUlSIHJlZ2lzdGVyLiBJbiB0aGlzIGNhc2UsIHRoZSBUSFJFIGludGVycnVwdCBpbmRpY2F0ZXMgdGhlIEZJRk8KKyAqIGhhcyBzcGFjZSBhdmFpbGFibGUuIExvYWQgaXQgdXAgd2l0aCB0eF9sb2Fkc3ogYnl0ZXMuCisgKi8KK3N0YXRpYyBpbnQgc2VyaWFsODI1MF90eF90aHJlc2hvbGRfaGFuZGxlX2lycShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGlpciA9IHNlcmlhbF9wb3J0X2luKHBvcnQsIFVBUlRfSUlSKTsKKworCS8qIFRYIFRocmVzaG9sZCBJUlEgdHJpZ2dlcmVkIHNvIGxvYWQgdXAgRklGTyAqLworCWlmICgoaWlyICYgVUFSVF9JSVJfSUQpID09IFVBUlRfSUlSX1RIUkkpIHsKKwkJc3RydWN0IHVhcnRfODI1MF9wb3J0ICp1cCA9IHVwX3RvX3U4MjUwcChwb3J0KTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCQlzZXJpYWw4MjUwX3R4X2NoYXJzKHVwKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCX0KKworCWlpciA9IHNlcmlhbF9wb3J0X2luKHBvcnQsIFVBUlRfSUlSKTsKKwlyZXR1cm4gc2VyaWFsODI1MF9oYW5kbGVfaXJxKHBvcnQsIGlpcik7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VyaWFsODI1MF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1YXJ0XzgyNTBfcG9ydCAqdXAgPSB1cF90b191ODI1MHAocG9ydCk7CkBAIC0xOTE3LDggKzE5MzEsNyBAQAogCQlyZXQgfD0gVElPQ01fRFNSOwogCWlmIChzdGF0dXMgJiBVQVJUX01TUl9DVFMpCiAJCXJldCB8PSBUSU9DTV9DVFM7Ci0KLQlyZXR1cm4gbWN0cmxfZ3Bpb19nZXQodXAtPmdwaW9zLCAmcmV0KTsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2VyaWFsODI1MF9kb19nZXRfbWN0cmwpOwogCkBAIC0xOTkzLDYgKzIwMDYsNyBAQAogCQlpZiAoLS10bW91dCA9PSAwKQogCQkJYnJlYWs7CiAJCXVkZWxheSgxKTsKKwkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJfQogCiAJLyogV2FpdCB1cCB0byAxcyBmb3IgZmxvdyBjb250cm9sIGlmIG5lY2Vzc2FyeSAqLwpAQCAtMjE2OSw2ICsyMTgzLDI1IEBACiAJCXNlcmlhbF9wb3J0X291dChwb3J0LCBVQVJUX0xDUiwgMCk7CiAJfQogCisJLyoKKwkgKiBGb3IgdGhlIEFsdGVyYSAxNjU1MCB2YXJpYW50cywgc2V0IFRYIHRocmVzaG9sZCB0cmlnZ2VyIGxldmVsLgorCSAqLworCWlmICgoKHBvcnQtPnR5cGUgPT0gUE9SVF9BTFRSXzE2NTUwX0YzMikgfHwKKwkgICAgIChwb3J0LT50eXBlID09IFBPUlRfQUxUUl8xNjU1MF9GNjQpIHx8CisJICAgICAocG9ydC0+dHlwZSA9PSBQT1JUX0FMVFJfMTY1NTBfRjEyOCkpICYmIChwb3J0LT5maWZvc2l6ZSA+IDEpKSB7CisJCS8qIEJvdW5kcyBjaGVja2luZyBvZiBUWCB0aHJlc2hvbGQgKHZhbGlkIDAgdG8gZmlmb3NpemUtMikgKi8KKwkJaWYgKCh1cC0+dHhfbG9hZHN6IDwgMikgfHwgKHVwLT50eF9sb2Fkc3ogPiBwb3J0LT5maWZvc2l6ZSkpIHsKKwkJCXByX2VycigidHR5UyVkIFRYIEZJRk8gVGhyZXNob2xkIGVycm9ycywgc2tpcHBpbmdcbiIsCisJCQkgICAgICAgc2VyaWFsX2luZGV4KHBvcnQpKTsKKwkJfSBlbHNlIHsKKwkJCXNlcmlhbF9wb3J0X291dChwb3J0LCBVQVJUX0FMVFJfQUZSLAorCQkJCQlVQVJUX0FMVFJfRU5fVFhGSUZPX0xXKTsKKwkJCXNlcmlhbF9wb3J0X291dChwb3J0LCBVQVJUX0FMVFJfVFhfTE9XLAorCQkJCQlwb3J0LT5maWZvc2l6ZSAtIHVwLT50eF9sb2Fkc3opOworCQkJcG9ydC0+aGFuZGxlX2lycSA9IHNlcmlhbDgyNTBfdHhfdGhyZXNob2xkX2hhbmRsZV9pcnE7CisJCX0KKwl9CisKIAlpZiAocG9ydC0+aXJxKSB7CiAJCXVuc2lnbmVkIGNoYXIgaWlyMTsKIAkJLyoKQEAgLTI1MDQsOCArMjUzNyw2IEBACiAJCQkJCSAgICAgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAogCQkJCQkgICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewotCXVuc2lnbmVkIGludCB0b2xlcmFuY2UgPSBwb3J0LT51YXJ0Y2xrIC8gMTAwOwotCiAJLyoKIAkgKiBBc2sgdGhlIGNvcmUgdG8gY2FsY3VsYXRlIHRoZSBkaXZpc29yIGZvciB1cy4KIAkgKiBBbGxvdyAxJSB0b2xlcmFuY2UgYXQgdGhlIHVwcGVyIGxpbWl0IHNvIHVhcnQgY2xrcyBtYXJnaW5hbGx5CkBAIC0yNTE0LDcgKzI1NDUsNyBAQAogCSAqLwogCXJldHVybiB1YXJ0X2dldF9iYXVkX3JhdGUocG9ydCwgdGVybWlvcywgb2xkLAogCQkJCSAgcG9ydC0+dWFydGNsayAvIDE2IC8gMHhmZmZmLAotCQkJCSAgKHBvcnQtPnVhcnRjbGsgKyB0b2xlcmFuY2UpIC8gMTYpOworCQkJCSAgcG9ydC0+dWFydGNsayk7CiB9CiAKIHZvaWQKQEAgLTI1NTEsMTIgKzI1ODIsOSBAQAogCS8qCiAJICogTUNSLWJhc2VkIGF1dG8gZmxvdyBjb250cm9sLiAgV2hlbiBBRkUgaXMgZW5hYmxlZCwgUlRTIHdpbGwgYmUKIAkgKiBkZWFzc2VydGVkIHdoZW4gdGhlIHJlY2VpdmUgRklGTyBjb250YWlucyBtb3JlIGNoYXJhY3RlcnMgdGhhbgotCSAqIHRoZSB0cmlnZ2VyLCBvciB0aGUgTUNSIFJUUyBiaXQgaXMgY2xlYXJlZC4gIEluIHRoZSBjYXNlIHdoZXJlCi0JICogdGhlIHJlbW90ZSBVQVJUIGlzIG5vdCB1c2luZyBDVFMgYXV0byBmbG93IGNvbnRyb2wsIHdlIG11c3QKLQkgKiBoYXZlIHN1ZmZpY2llbnQgRklGTyBlbnRyaWVzIGZvciB0aGUgbGF0ZW5jeSBvZiB0aGUgcmVtb3RlCi0JICogVUFSVCB0byByZXNwb25kLiAgSU9XLCBhdCBsZWFzdCAzMiBieXRlcyBvZiBGSUZPLgorCSAqIHRoZSB0cmlnZ2VyLCBvciB0aGUgTUNSIFJUUyBiaXQgaXMgY2xlYXJlZC4KIAkgKi8KLQlpZiAodXAtPmNhcGFiaWxpdGllcyAmIFVBUlRfQ0FQX0FGRSAmJiBwb3J0LT5maWZvc2l6ZSA+PSAzMikgeworCWlmICh1cC0+Y2FwYWJpbGl0aWVzICYgVUFSVF9DQVBfQUZFKSB7CiAJCXVwLT5tY3IgJj0gflVBUlRfTUNSX0FGRTsKIAkJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKQogCQkJdXAtPm1jciB8PSBVQVJUX01DUl9BRkU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC9LY29uZmlnIGIvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvS2NvbmZpZwppbmRleCBjOWVjODM5Li44OTk4MzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwL0tjb25maWcKQEAgLTYsNyArNiw2IEBACiBjb25maWcgU0VSSUFMXzgyNTAKIAl0cmlzdGF0ZSAiODI1MC8xNjU1MCBhbmQgY29tcGF0aWJsZSBzZXJpYWwgc3VwcG9ydCIKIAlzZWxlY3QgU0VSSUFMX0NPUkUKLQlzZWxlY3QgU0VSSUFMX01DVFJMX0dQSU8gaWYgR1BJT0xJQgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgc2VsZWN0cyB3aGV0aGVyIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIGRyaXZlciBmb3IgdGhlIHN0YW5kYXJkCiAJICBzZXJpYWwgcG9ydHMuICBUaGUgc3RhbmRhcmQgYW5zd2VyIGlzIFkuICBQZW9wbGUgd2hvIG1pZ2h0IHNheSBOCkBAIC0xMjEsNyArMTIwLDYgQEAKIAl0cmlzdGF0ZSAiODI1MC8xNjU1MCBQQ0kgZGV2aWNlIHN1cHBvcnQiIGlmIEVYUEVSVAogCWRlcGVuZHMgb24gU0VSSUFMXzgyNTAgJiYgUENJCiAJZGVmYXVsdCBTRVJJQUxfODI1MAotCXNlbGVjdCBSQVRJT05BTAogCWhlbHAKIAkgIFRoaXMgYnVpbGRzIHN0YW5kYXJkIFBDSSBzZXJpYWwgc3VwcG9ydC4gWW91IG1heSBiZSBhYmxlIHRvCiAJICBkaXNhYmxlIHRoaXMgZmVhdHVyZSBpZiB5b3Ugb25seSBuZWVkIGxlZ2FjeSBzZXJpYWwgc3VwcG9ydC4KQEAgLTQwMyw2ICs0MDEsMjEgQEAKIAkgIElmIHlvdSBoYXZlIGEgc3lzdGVtIHVzaW5nIGFuIEluZ2VuaWMgU29DIGFuZCB3aXNoIHRvIG1ha2UgdXNlIG9mCiAJICBpdHMgVUFSVHMsIHNheSBZIHRvIHRoaXMgb3B0aW9uLiBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgU0VSSUFMXzgyNTBfTFBTUworCXRyaXN0YXRlICJTdXBwb3J0IGZvciBzZXJpYWwgcG9ydHMgb24gSW50ZWwgTFBTUyBwbGF0Zm9ybXMiIGlmIEVYUEVSVAorCWRlZmF1bHQgU0VSSUFMXzgyNTAKKwlkZXBlbmRzIG9uIFNFUklBTF84MjUwICYmIFBDSQorCWRlcGVuZHMgb24gWDg2IHx8IENPTVBJTEVfVEVTVAorCXNlbGVjdCBEV19ETUFDX0NPUkUgaWYgU0VSSUFMXzgyNTBfRE1BCisJc2VsZWN0IERXX0RNQUNfUENJIGlmIChTRVJJQUxfODI1MF9ETUEgJiYgWDg2X0lOVEVMX0xQU1MpCisJc2VsZWN0IFJBVElPTkFMCisJaGVscAorCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIGhhbmRsaW5nIG9mIHRoZSBleHRyYSBmZWF0dXJlcworCSAgcHJlc2VudCBvbiB0aGUgVUFSVCBmb3VuZCBvbiB2YXJpb3VzIEludGVsIHBsYXRmb3JtcyBzdWNoIGFzOgorCSAgICAtIEludGVsIEJheXRyYWlsIFNvQworCSAgICAtIEludGVsIEJyYXN3ZWxsIFNvQworCSAgICAtIEludGVsIFF1YXJrIFgxMDAwIFNvQworCiBjb25maWcgU0VSSUFMXzgyNTBfTUlECiAJdHJpc3RhdGUgIlN1cHBvcnQgZm9yIHNlcmlhbCBwb3J0cyBvbiBJbnRlbCBNSUQgcGxhdGZvcm1zIiBpZiBFWFBFUlQKIAlkZWZhdWx0IFNFUklBTF84MjUwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC9NYWtlZmlsZSBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwL01ha2VmaWxlCmluZGV4IDM2N2Q0MDMuLjI3NmM2ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwL01ha2VmaWxlCkBAIC0yOCw2ICsyOCw3IEBACiBvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfTVQ2NTc3KQkrPSA4MjUwX210ay5vCiBvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfVU5JUEhJRVIpCSs9IDgyNTBfdW5pcGhpZXIubwogb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX0lOR0VOSUMpCSs9IDgyNTBfaW5nZW5pYy5vCitvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfTFBTUykJCSs9IDgyNTBfbHBzcy5vCiBvYmotJChDT05GSUdfU0VSSUFMXzgyNTBfTUlEKQkJKz0gODI1MF9taWQubwogb2JqLSQoQ09ORklHX1NFUklBTF84MjUwX01PWEEpCQkrPSA4MjUwX21veGEubwogb2JqLSQoQ09ORklHX1NFUklBTF9PRl9QTEFURk9STSkJKz0gODI1MF9vZi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCmluZGV4IDUxOGRiMjRhLi5jNzgzMTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZwpAQCAtMTM4MCw3ICsxMzgwLDcgQEAKIAogY29uZmlnIFNFUklBTF9QQ0hfVUFSVAogCXRyaXN0YXRlICJJbnRlbCBFRzIwVCBQQ0gvTEFQSVMgU2VtaWNvbiBJT0goTUw3MjEzL01MNzIyMy9NTDc4MzEpIFVBUlQiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgKFg4Nl8zMiB8fCBDT01QSUxFX1RFU1QpCisJZGVwZW5kcyBvbiBQQ0kgJiYgKFg4Nl8zMiB8fCBNSVBTIHx8ICBDT01QSUxFX1RFU1QpCiAJc2VsZWN0IFNFUklBTF9DT1JFCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgaXMgZm9yIFBDSChQbGF0Zm9ybSBjb250cm9sbGVyIEh1YikgVUFSVCBvZiBJbnRlbCBFRzIwVApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV9qdGFndWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV9qdGFndWFydC5jCmluZGV4IDMyZGYyYTAuLmU0MDlkN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hbHRlcmFfanRhZ3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX2p0YWd1YXJ0LmMKQEAgLTI4MCw3ICsyODAsNyBAQAogLyoKICAqCURlZmluZSB0aGUgYmFzaWMgc2VyaWFsIGZ1bmN0aW9ucyB3ZSBzdXBwb3J0LgogICovCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIGFsdGVyYV9qdGFndWFydF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIGFsdGVyYV9qdGFndWFydF9vcHMgPSB7CiAJLnR4X2VtcHR5CT0gYWx0ZXJhX2p0YWd1YXJ0X3R4X2VtcHR5LAogCS5nZXRfbWN0cmwJPSBhbHRlcmFfanRhZ3VhcnRfZ2V0X21jdHJsLAogCS5zZXRfbWN0cmwJPSBhbHRlcmFfanRhZ3VhcnRfc2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2FsdGVyYV91YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX3VhcnQuYwppbmRleCA2MWI2MDdmLi44MjBhNzQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYWx0ZXJhX3VhcnQuYwpAQCAtNDA0LDcgKzQwNCw3IEBACiAvKgogICoJRGVmaW5lIHRoZSBiYXNpYyBzZXJpYWwgZnVuY3Rpb25zIHdlIHN1cHBvcnQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgYWx0ZXJhX3VhcnRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBhbHRlcmFfdWFydF9vcHMgPSB7CiAJLnR4X2VtcHR5CT0gYWx0ZXJhX3VhcnRfdHhfZW1wdHksCiAJLmdldF9tY3RybAk9IGFsdGVyYV91YXJ0X2dldF9tY3RybCwKIAkuc2V0X21jdHJsCT0gYWx0ZXJhX3VhcnRfc2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9hbWJhLXBsMDExLmMKaW5kZXggOGE5ZTIxMy4uZTJjMzNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2FtYmEtcGwwMTEuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYW1iYS1wbDAxMS5jCkBAIC05Myw2ICs5MywxMCBAQAogc3RydWN0IHZlbmRvcl9kYXRhIHsKIAljb25zdCB1MTYJCSpyZWdfb2Zmc2V0OwogCXVuc2lnbmVkIGludAkJaWZsczsKKwl1bnNpZ25lZCBpbnQJCWZyX2J1c3k7CisJdW5zaWduZWQgaW50CQlmcl9kc3I7CisJdW5zaWduZWQgaW50CQlmcl9jdHM7CisJdW5zaWduZWQgaW50CQlmcl9yaTsKIAlib29sCQkJYWNjZXNzXzMyYjsKIAlib29sCQkJb3ZlcnNhbXBsaW5nOwogCWJvb2wJCQlkbWFfdGhyZXNob2xkOwpAQCAtMTExLDYgKzExNSwxMCBAQAogc3RhdGljIHN0cnVjdCB2ZW5kb3JfZGF0YSB2ZW5kb3JfYXJtID0gewogCS5yZWdfb2Zmc2V0CQk9IHBsMDExX3N0ZF9vZmZzZXRzLAogCS5pZmxzCQkJPSBVQVJUMDExX0lGTFNfUlg0Xzh8VUFSVDAxMV9JRkxTX1RYNF84LAorCS5mcl9idXN5CQk9IFVBUlQwMXhfRlJfQlVTWSwKKwkuZnJfZHNyCQkJPSBVQVJUMDF4X0ZSX0RTUiwKKwkuZnJfY3RzCQkJPSBVQVJUMDF4X0ZSX0NUUywKKwkuZnJfcmkJCQk9IFVBUlQwMTFfRlJfUkksCiAJLm92ZXJzYW1wbGluZwkJPSBmYWxzZSwKIAkuZG1hX3RocmVzaG9sZAkJPSBmYWxzZSwKIAkuY3RzX2V2ZW50X3dvcmthcm91bmQJPSBmYWxzZSwKQEAgLTEyMSw2ICsxMjksMTAgQEAKIAogc3RhdGljIHN0cnVjdCB2ZW5kb3JfZGF0YSB2ZW5kb3Jfc2JzYSA9IHsKIAkucmVnX29mZnNldAkJPSBwbDAxMV9zdGRfb2Zmc2V0cywKKwkuZnJfYnVzeQkJPSBVQVJUMDF4X0ZSX0JVU1ksCisJLmZyX2RzcgkJCT0gVUFSVDAxeF9GUl9EU1IsCisJLmZyX2N0cwkJCT0gVUFSVDAxeF9GUl9DVFMsCisJLmZyX3JpCQkJPSBVQVJUMDExX0ZSX1JJLAogCS5hY2Nlc3NfMzJiCQk9IHRydWUsCiAJLm92ZXJzYW1wbGluZwkJPSBmYWxzZSwKIAkuZG1hX3RocmVzaG9sZAkJPSBmYWxzZSwKQEAgLTE2NCw2ICsxNzYsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgdmVuZG9yX2RhdGEgdmVuZG9yX3N0ID0gewogCS5yZWdfb2Zmc2V0CQk9IHBsMDExX3N0X29mZnNldHMsCiAJLmlmbHMJCQk9IFVBUlQwMTFfSUZMU19SWF9IQUxGfFVBUlQwMTFfSUZMU19UWF9IQUxGLAorCS5mcl9idXN5CQk9IFVBUlQwMXhfRlJfQlVTWSwKKwkuZnJfZHNyCQkJPSBVQVJUMDF4X0ZSX0RTUiwKKwkuZnJfY3RzCQkJPSBVQVJUMDF4X0ZSX0NUUywKKwkuZnJfcmkJCQk9IFVBUlQwMTFfRlJfUkksCiAJLm92ZXJzYW1wbGluZwkJPSB0cnVlLAogCS5kbWFfdGhyZXNob2xkCQk9IHRydWUsCiAJLmN0c19ldmVudF93b3JrYXJvdW5kCT0gdHJ1ZSwKQEAgLTE4OCwxMSArMjA0LDIwIEBACiAJW1JFR19ETUFDUl0gPSBaWF9VQVJUMDExX0RNQUNSLAogfTsKIAotc3RhdGljIHN0cnVjdCB2ZW5kb3JfZGF0YSB2ZW5kb3JfenRlIF9fbWF5YmVfdW51c2VkID0geworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfZmlmb3NpemVfenRlKHN0cnVjdCBhbWJhX2RldmljZSAqZGV2KQoreworCXJldHVybiAxNjsKK30KKworc3RhdGljIHN0cnVjdCB2ZW5kb3JfZGF0YSB2ZW5kb3JfenRlID0gewogCS5yZWdfb2Zmc2V0CQk9IHBsMDExX3p0ZV9vZmZzZXRzLAogCS5hY2Nlc3NfMzJiCQk9IHRydWUsCiAJLmlmbHMJCQk9IFVBUlQwMTFfSUZMU19SWDRfOHxVQVJUMDExX0lGTFNfVFg0XzgsCi0JLmdldF9maWZvc2l6ZQkJPSBnZXRfZmlmb3NpemVfYXJtLAorCS5mcl9idXN5CQk9IFpYX1VBUlQwMXhfRlJfQlVTWSwKKwkuZnJfZHNyCQkJPSBaWF9VQVJUMDF4X0ZSX0RTUiwKKwkuZnJfY3RzCQkJPSBaWF9VQVJUMDF4X0ZSX0NUUywKKwkuZnJfcmkJCQk9IFpYX1VBUlQwMTFfRlJfUkksCisJLmdldF9maWZvc2l6ZQkJPSBnZXRfZmlmb3NpemVfenRlLAogfTsKIAogLyogRGVhbHMgd2l0aCBETUEgdHJhbnNhY3Rpb25zICovCkBAIC0xMTY3LDcgKzExOTIsNyBAQAogCQlyZXR1cm47CiAKIAkvKiBEaXNhYmxlIFJYIGFuZCBUWCBETUEgKi8KLQl3aGlsZSAocGwwMTFfcmVhZCh1YXAsIFJFR19GUikgJiBVQVJUMDF4X0ZSX0JVU1kpCisJd2hpbGUgKHBsMDExX3JlYWQodWFwLCBSRUdfRlIpICYgdWFwLT52ZW5kb3ItPmZyX2J1c3kpCiAJCWNwdV9yZWxheCgpOwogCiAJc3Bpbl9sb2NrX2lycSgmdWFwLT5wb3J0LmxvY2spOwpAQCAtMTQxNiwxMSArMTQ0MSwxMiBAQAogCWlmIChkZWx0YSAmIFVBUlQwMXhfRlJfRENEKQogCQl1YXJ0X2hhbmRsZV9kY2RfY2hhbmdlKCZ1YXAtPnBvcnQsIHN0YXR1cyAmIFVBUlQwMXhfRlJfRENEKTsKIAotCWlmIChkZWx0YSAmIFVBUlQwMXhfRlJfRFNSKQorCWlmIChkZWx0YSAmIHVhcC0+dmVuZG9yLT5mcl9kc3IpCiAJCXVhcC0+cG9ydC5pY291bnQuZHNyKys7CiAKLQlpZiAoZGVsdGEgJiBVQVJUMDF4X0ZSX0NUUykKLQkJdWFydF9oYW5kbGVfY3RzX2NoYW5nZSgmdWFwLT5wb3J0LCBzdGF0dXMgJiBVQVJUMDF4X0ZSX0NUUyk7CisJaWYgKGRlbHRhICYgdWFwLT52ZW5kb3ItPmZyX2N0cykKKwkJdWFydF9oYW5kbGVfY3RzX2NoYW5nZSgmdWFwLT5wb3J0LAorCQkJCSAgICAgICBzdGF0dXMgJiB1YXAtPnZlbmRvci0+ZnJfY3RzKTsKIAogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdWFwLT5wb3J0LnN0YXRlLT5wb3J0LmRlbHRhX21zcl93YWl0KTsKIH0KQEAgLTE0OTMsNyArMTUxOSw4IEBACiAJc3RydWN0IHVhcnRfYW1iYV9wb3J0ICp1YXAgPQogCSAgICBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IHVhcnRfYW1iYV9wb3J0LCBwb3J0KTsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzID0gcGwwMTFfcmVhZCh1YXAsIFJFR19GUik7Ci0JcmV0dXJuIHN0YXR1cyAmIChVQVJUMDF4X0ZSX0JVU1l8VUFSVDAxeF9GUl9UWEZGKSA/IDAgOiBUSU9DU0VSX1RFTVQ7CisJcmV0dXJuIHN0YXR1cyAmICh1YXAtPnZlbmRvci0+ZnJfYnVzeSB8IFVBUlQwMXhfRlJfVFhGRikgPworCQkJCQkJCTAgOiBUSU9DU0VSX1RFTVQ7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcGwwMTFfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC0xNTA4LDkgKzE1MzUsOSBAQAogCQlyZXN1bHQgfD0gdGlvY21iaXQKIAogCVRJT0NNQklUKFVBUlQwMXhfRlJfRENELCBUSU9DTV9DQVIpOwotCVRJT0NNQklUKFVBUlQwMXhfRlJfRFNSLCBUSU9DTV9EU1IpOwotCVRJT0NNQklUKFVBUlQwMXhfRlJfQ1RTLCBUSU9DTV9DVFMpOwotCVRJT0NNQklUKFVBUlQwMTFfRlJfUkksIFRJT0NNX1JORyk7CisJVElPQ01CSVQodWFwLT52ZW5kb3ItPmZyX2RzciwgVElPQ01fRFNSKTsKKwlUSU9DTUJJVCh1YXAtPnZlbmRvci0+ZnJfY3RzLCBUSU9DTV9DVFMpOworCVRJT0NNQklUKHVhcC0+dmVuZG9yLT5mcl9yaSwgVElPQ01fUk5HKTsKICN1bmRlZiBUSU9DTUJJVAogCXJldHVybiByZXN1bHQ7CiB9CkBAIC0yMTkxLDcgKzIyMTgsNyBAQAogCSAqCUZpbmFsbHksIHdhaXQgZm9yIHRyYW5zbWl0dGVyIHRvIGJlY29tZSBlbXB0eQogCSAqCWFuZCByZXN0b3JlIHRoZSBUQ1IKIAkgKi8KLQl3aGlsZSAocGwwMTFfcmVhZCh1YXAsIFJFR19GUikgJiBVQVJUMDF4X0ZSX0JVU1kpCisJd2hpbGUgKHBsMDExX3JlYWQodWFwLCBSRUdfRlIpICYgdWFwLT52ZW5kb3ItPmZyX2J1c3kpCiAJCWNwdV9yZWxheCgpOwogCWlmICghdWFwLT52ZW5kb3ItPmFsd2F5c19lbmFibGVkKQogCQlwbDAxMV93cml0ZShvbGRfY3IsIHVhcCwgUkVHX0NSKTsKQEAgLTI1NTUsNyArMjU4Miw4IEBACiAKIAlyZXQgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBvYnRhaW4gaXJxXG4iKTsKKwkJaWYgKHJldCAhPSAtRVBST0JFX0RFRkVSKQorCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG9idGFpbiBpcnFcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAl1YXAtPnBvcnQuaXJxCT0gcmV0OwpAQCAtMjYyMiw2ICsyNjUwLDExIEBACiAJCS5tYXNrCT0gMHgwMGZmZmZmZiwKIAkJLmRhdGEJPSAmdmVuZG9yX3N0LAogCX0sCisJeworCQkuaWQJPSBBTUJBX0xJTlVYX0lEKDB4MDAsIDB4MSwgMHhmZmUpLAorCQkubWFzawk9IDB4MDBmZmZmZmYsCisJCS5kYXRhCT0gJnZlbmRvcl96dGUsCisJfSwKIAl7IDAsIDAgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hcmNfdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2FyY191YXJ0LmMKaW5kZXggM2ExZGU1Yy4uNWFjMDZmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2FyY191YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2FyY191YXJ0LmMKQEAgLTQ2NCw3ICs0NjQsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgYXJjX3NlcmlhbF9wb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBhcmNfc2VyaWFsX3BvcHMgPSB7CiAJLnR4X2VtcHR5CT0gYXJjX3NlcmlhbF90eF9lbXB0eSwKIAkuc2V0X21jdHJsCT0gYXJjX3NlcmlhbF9zZXRfbWN0cmwsCiAJLmdldF9tY3RybAk9IGFyY19zZXJpYWxfZ2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCmluZGV4IDJlYWExOGQuLmZkOGFhMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9hdG1lbF9zZXJpYWwuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYXRtZWxfc2VyaWFsLmMKQEAgLTE2Niw2ICsxNjYsNyBAQAogCXUzMgkJCXJ0c19sb3c7CiAJYm9vbAkJCW1zX2lycV9lbmFibGVkOwogCXUzMgkJCXJ0b3I7CS8qIGFkZHJlc3Mgb2YgcmVjZWl2ZXIgdGltZW91dCByZWdpc3RlciBpZiBpdCBleGlzdHMgKi8KKwlib29sCQkJaGFzX2ZyYWNfYmF1ZHJhdGU7CiAJYm9vbAkJCWhhc19od190aW1lcjsKIAlzdHJ1Y3QgdGltZXJfbGlzdAl1YXJ0X3RpbWVyOwogCkBAIC0xNjM0LDggKzE2MzUsOCBAQAogCiAJaWYgKG5wKSB7CiAJCS8qIERNQS9QREMgdXNhZ2Ugc3BlY2lmaWNhdGlvbiAqLwotCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYXRtZWwsdXNlLWRtYS1yeCIsIE5VTEwpKSB7Ci0JCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZG1hcyIsIE5VTEwpKSB7CisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJhdG1lbCx1c2UtZG1hLXJ4IikpIHsKKwkJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJkbWFzIikpIHsKIAkJCQlhdG1lbF9wb3J0LT51c2VfZG1hX3J4ICA9IHRydWU7CiAJCQkJYXRtZWxfcG9ydC0+dXNlX3BkY19yeCAgPSBmYWxzZTsKIAkJCX0gZWxzZSB7CkBAIC0xNjQ3LDggKzE2NDgsOCBAQAogCQkJYXRtZWxfcG9ydC0+dXNlX3BkY19yeCAgPSBmYWxzZTsKIAkJfQogCi0JCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJhdG1lbCx1c2UtZG1hLXR4IiwgTlVMTCkpIHsKLQkJCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJkbWFzIiwgTlVMTCkpIHsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImF0bWVsLHVzZS1kbWEtdHgiKSkgeworCQkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImRtYXMiKSkgewogCQkJCWF0bWVsX3BvcnQtPnVzZV9kbWFfdHggID0gdHJ1ZTsKIAkJCQlhdG1lbF9wb3J0LT51c2VfcGRjX3R4ICA9IGZhbHNlOwogCQkJfSBlbHNlIHsKQEAgLTE3NDUsNiArMTc0NiwxMSBAQAogCWRiZ3VfdWFydCA9IDB4NDQ0MjQ3NTU7CS8qIERCR1UgKi8KIAluZXdfdWFydCA9IDB4NTU0MTUyNTQ7CS8qIFVBUlQgKi8KIAorCS8qCisJICogT25seSBVU0FSVCBkZXZpY2VzIGZyb20gYXQ5MXNhbTkyNjAgU09DIGltcGxlbWVudCBmcmFjdGlvbmFsCisJICogYmF1ZHJhdGUuCisJICovCisJYXRtZWxfcG9ydC0+aGFzX2ZyYWNfYmF1ZHJhdGUgPSBmYWxzZTsKIAlhdG1lbF9wb3J0LT5oYXNfaHdfdGltZXIgPSBmYWxzZTsKIAogCWlmIChuYW1lID09IG5ld191YXJ0KSB7CkBAIC0xNzUzLDYgKzE3NTksNyBAQAogCQlhdG1lbF9wb3J0LT5ydG9yID0gQVRNRUxfVUFfUlRPUjsKIAl9IGVsc2UgaWYgKG5hbWUgPT0gdXNhcnQpIHsKIAkJZGV2X2RiZyhwb3J0LT5kZXYsICJVc2FydFxuIik7CisJCWF0bWVsX3BvcnQtPmhhc19mcmFjX2JhdWRyYXRlID0gdHJ1ZTsKIAkJYXRtZWxfcG9ydC0+aGFzX2h3X3RpbWVyID0gdHJ1ZTsKIAkJYXRtZWxfcG9ydC0+cnRvciA9IEFUTUVMX1VTX1JUT1I7CiAJfSBlbHNlIGlmIChuYW1lID09IGRiZ3VfdWFydCkgewpAQCAtMTc2NCw2ICsxNzcxLDcgQEAKIAkJY2FzZSAweDMwMjoKIAkJY2FzZSAweDEwMjEzOgogCQkJZGV2X2RiZyhwb3J0LT5kZXYsICJUaGlzIHZlcnNpb24gaXMgdXNhcnRcbiIpOworCQkJYXRtZWxfcG9ydC0+aGFzX2ZyYWNfYmF1ZHJhdGUgPSB0cnVlOwogCQkJYXRtZWxfcG9ydC0+aGFzX2h3X3RpbWVyID0gdHJ1ZTsKIAkJCWF0bWVsX3BvcnQtPnJ0b3IgPSBBVE1FTF9VU19SVE9SOwogCQkJYnJlYWs7CkBAIC0xOTI5LDYgKzE5MzcsOSBAQAogewogCXN0cnVjdCBhdG1lbF91YXJ0X3BvcnQgKmF0bWVsX3BvcnQgPSB0b19hdG1lbF91YXJ0X3BvcnQocG9ydCk7CiAKKwkvKiBEaXNhYmxlIG1vZGVtIGNvbnRyb2wgbGluZXMgaW50ZXJydXB0cyAqLworCWF0bWVsX2Rpc2FibGVfbXMocG9ydCk7CisKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgYXQgZGV2aWNlIGxldmVsICovCiAJYXRtZWxfdWFydF93cml0ZWwocG9ydCwgQVRNRUxfVVNfSURSLCAtMSk7CiAKQEAgLTE5NzksOCArMTk5MCw2IEBACiAJICovCiAJZnJlZV9pcnEocG9ydC0+aXJxLCBwb3J0KTsKIAotCWF0bWVsX3BvcnQtPm1zX2lycV9lbmFibGVkID0gZmFsc2U7Ci0KIAlhdG1lbF9mbHVzaF9idWZmZXIocG9ydCk7CiB9CiAKQEAgLTIwMjUsOCArMjAzNCw5IEBACiBzdGF0aWMgdm9pZCBhdG1lbF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MsCiAJCQkgICAgICBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKKwlzdHJ1Y3QgYXRtZWxfdWFydF9wb3J0ICphdG1lbF9wb3J0ID0gdG9fYXRtZWxfdWFydF9wb3J0KHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IG9sZF9tb2RlLCBtb2RlLCBpbXIsIHF1b3QsIGJhdWQ7CisJdW5zaWduZWQgaW50IG9sZF9tb2RlLCBtb2RlLCBpbXIsIHF1b3QsIGJhdWQsIGRpdiwgY2QsIGZwID0gMDsKIAogCS8qIHNhdmUgdGhlIGN1cnJlbnQgbW9kZSByZWdpc3RlciAqLwogCW1vZGUgPSBvbGRfbW9kZSA9IGF0bWVsX3VhcnRfcmVhZGwocG9ydCwgQVRNRUxfVVNfTVIpOwpAQCAtMjAzNiwxMiArMjA0Niw2IEBACiAJCSAgQVRNRUxfVVNfUEFSIHwgQVRNRUxfVVNfVVNNT0RFKTsKIAogCWJhdWQgPSB1YXJ0X2dldF9iYXVkX3JhdGUocG9ydCwgdGVybWlvcywgb2xkLCAwLCBwb3J0LT51YXJ0Y2xrIC8gMTYpOwotCXF1b3QgPSB1YXJ0X2dldF9kaXZpc29yKHBvcnQsIGJhdWQpOwotCi0JaWYgKHF1b3QgPiA2NTUzNSkgewkvKiBCUkdSIGlzIDE2LWJpdCwgc28gc3dpdGNoIHRvIHNsb3dlciBjbG9jayAqLwotCQlxdW90IC89IDg7Ci0JCW1vZGUgfD0gQVRNRUxfVVNfVVNDTEtTX01DS19ESVY4OwotCX0KIAogCS8qIGJ5dGUgc2l6ZSAqLwogCXN3aXRjaCAodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSB7CkBAIC0yMTYwLDcgKzIxNjQsMzEgQEAKIAkJYXRtZWxfdWFydF93cml0ZWwocG9ydCwgQVRNRUxfVVNfQ1IsIHJ0c19zdGF0ZSk7CiAJfQogCi0JLyogc2V0IHRoZSBiYXVkIHJhdGUgKi8KKwkvKgorCSAqIFNldCB0aGUgYmF1ZCByYXRlOgorCSAqIEZyYWN0aW9uYWwgYmF1ZHJhdGUgYWxsb3dzIHRvIHNldHVwIG91dHB1dCBmcmVxdWVuY3kgbW9yZQorCSAqIGFjY3VyYXRlbHkuIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIG9ubHkgd2hlbiB1c2luZyBub3JtYWwgbW9kZS4KKwkgKiBiYXVkcmF0ZSA9IHNlbGVjdGVkIGNsb2NrIC8gKDggKiAoMiAtIE9WRVIpICogKENEICsgRlAgLyA4KSkKKwkgKiBDdXJyZW50bHksIE9WRVIgaXMgYWx3YXlzIHNldCB0byAwIHNvIHdlIGdldAorCSAqIGJhdWRyYXRlID0gc2VsZWN0ZWQgY2xvY2sgLyAoMTYgKiAoQ0QgKyBGUCAvIDgpKQorCSAqIHRoZW4KKwkgKiA4IENEICsgRlAgPSBzZWxlY3RlZCBjbG9jayAvICgyICogYmF1ZHJhdGUpCisJICovCisJaWYgKGF0bWVsX3BvcnQtPmhhc19mcmFjX2JhdWRyYXRlICYmCisJICAgIChtb2RlICYgQVRNRUxfVVNfVVNNT0RFKSA9PSBBVE1FTF9VU19VU01PREVfTk9STUFMKSB7CisJCWRpdiA9IERJVl9ST1VORF9DTE9TRVNUKHBvcnQtPnVhcnRjbGssIGJhdWQgKiAyKTsKKwkJY2QgPSBkaXYgPj4gMzsKKwkJZnAgPSBkaXYgJiBBVE1FTF9VU19GUF9NQVNLOworCX0gZWxzZSB7CisJCWNkID0gdWFydF9nZXRfZGl2aXNvcihwb3J0LCBiYXVkKTsKKwl9CisKKwlpZiAoY2QgPiA2NTUzNSkgewkvKiBCUkdSIGlzIDE2LWJpdCwgc28gc3dpdGNoIHRvIHNsb3dlciBjbG9jayAqLworCQljZCAvPSA4OworCQltb2RlIHw9IEFUTUVMX1VTX1VTQ0xLU19NQ0tfRElWODsKKwl9CisJcXVvdCA9IGNkIHwgZnAgPDwgQVRNRUxfVVNfRlBfT0ZGU0VUOworCiAJYXRtZWxfdWFydF93cml0ZWwocG9ydCwgQVRNRUxfVVNfQlJHUiwgcXVvdCk7CiAJYXRtZWxfdWFydF93cml0ZWwocG9ydCwgQVRNRUxfVVNfQ1IsIEFUTUVMX1VTX1JTVFNUQSB8IEFUTUVMX1VTX1JTVFJYKTsKIAlhdG1lbF91YXJ0X3dyaXRlbChwb3J0LCBBVE1FTF9VU19DUiwgQVRNRUxfVVNfVFhFTiB8IEFUTUVMX1VTX1JYRU4pOwpAQCAtMjI5Miw3ICsyMzIwLDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIGF0bWVsX3BvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIGF0bWVsX3BvcHMgPSB7CiAJLnR4X2VtcHR5CT0gYXRtZWxfdHhfZW1wdHksCiAJLnNldF9tY3RybAk9IGF0bWVsX3NldF9tY3RybCwKIAkuZ2V0X21jdHJsCT0gYXRtZWxfZ2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2JjbTYzeHhfdWFydC5jCmluZGV4IDUxMDhmYWIuLjU4M2M5YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9iY202M3h4X3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvYmNtNjN4eF91YXJ0LmMKQEAgLTYzMSw3ICs2MzEsNyBAQAogfQogCiAvKiBzZXJpYWwgY29yZSBjYWxsYmFja3MgKi8KLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgYmNtX3VhcnRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBiY21fdWFydF9vcHMgPSB7CiAJLnR4X2VtcHR5CT0gYmNtX3VhcnRfdHhfZW1wdHksCiAJLmdldF9tY3RybAk9IGJjbV91YXJ0X2dldF9tY3RybCwKIAkuc2V0X21jdHJsCT0gYmNtX3VhcnRfc2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2Vhcmx5Y29uLWFybS1zZW1paG9zdC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2Vhcmx5Y29uLWFybS1zZW1paG9zdC5jCmluZGV4IDM4M2RiMTAuLjZiYmViNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9lYXJseWNvbi1hcm0tc2VtaWhvc3QuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvZWFybHljb24tYXJtLXNlbWlob3N0LmMKQEAgLTUzLDcgKzUzLDggQEAKIAl1YXJ0X2NvbnNvbGVfd3JpdGUoJmRldi0+cG9ydCwgcywgbiwgc21oX3B1dGMpOwogfQogCi1pbnQgX19pbml0IGVhcmx5X3NtaF9zZXR1cChzdHJ1Y3QgZWFybHljb25fZGV2aWNlICpkZXZpY2UsIGNvbnN0IGNoYXIgKm9wdCkKK3N0YXRpYyBpbnQKK19faW5pdCBlYXJseV9zbWhfc2V0dXAoc3RydWN0IGVhcmx5Y29uX2RldmljZSAqZGV2aWNlLCBjb25zdCBjaGFyICpvcHQpCiB7CiAJZGV2aWNlLT5jb24tPndyaXRlID0gc21oX3dyaXRlOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2Vhcmx5Y29uLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvZWFybHljb24uYwppbmRleCAwNjc3ODNmLi5jMzY1MTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvZWFybHljb24uYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvZWFybHljb24uYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NpemVzLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAKICNpZmRlZiBDT05GSUdfRklYX0VBUkxZQ09OX01FTQogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KQEAgLTM4LDcgKzM5LDcgQEAKIAkuY29uID0gJmVhcmx5X2NvbiwKIH07CiAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKiBfX2luaXQgZWFybHljb25fbWFwKHVuc2lnbmVkIGxvbmcgcGFkZHIsIHNpemVfdCBzaXplKQorc3RhdGljIHZvaWQgX19pb21lbSAqIF9faW5pdCBlYXJseWNvbl9tYXAocmVzb3VyY2Vfc2l6ZV90IHBhZGRyLCBzaXplX3Qgc2l6ZSkKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAjaWZkZWYgQ09ORklHX0ZJWF9FQVJMWUNPTl9NRU0KQEAgLTQ5LDggKzUwLDcgQEAKIAliYXNlID0gaW9yZW1hcChwYWRkciwgc2l6ZSk7CiAjZW5kaWYKIAlpZiAoIWJhc2UpCi0JCXByX2VycigiJXM6IENvdWxkbid0IG1hcCAweCVsbHhcbiIsIF9fZnVuY19fLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwYWRkcik7CisJCXByX2VycigiJXM6IENvdWxkbid0IG1hcCAlcGFcbiIsIF9fZnVuY19fLCAmcGFkZHIpOwogCiAJcmV0dXJuIGJhc2U7CiB9CkBAIC05Miw3ICs5Miw3IEBACiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZkZXZpY2UtPnBvcnQ7CiAJaW50IGxlbmd0aDsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CisJcmVzb3VyY2Vfc2l6ZV90IGFkZHI7CiAKIAlpZiAodWFydF9wYXJzZV9lYXJseWNvbihvcHRpb25zLCAmcG9ydC0+aW90eXBlLCAmYWRkciwgJm9wdGlvbnMpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE5OSw2ICsxOTksMTQgQEAKIAlyZXR1cm4gLUVOT0VOVDsKIH0KIAorLyoKKyAqIFdoZW4gQ09ORklHX0FDUElfU1BDUl9UQUJMRSBpcyBkZWZpbmVkLCAiZWFybHljb24iIHdpdGhvdXQgcGFyYW1ldGVycyBpbgorICogY29tbWFuZCBsaW5lIGRvZXMgbm90IHN0YXJ0IERUIGVhcmx5Y29uIGltbWVkaWF0ZWx5LCBpbnN0ZWFkIGl0IGRlZmVycworICogc3RhcnRpbmcgaXQgdW50aWwgRFQvQUNQSSBkZWNpc2lvbiBpcyBtYWRlLiAgQXQgdGhhdCB0aW1lIGlmIEFDUEkgaXMgZW5hYmxlZAorICogY2FsbCBwYXJzZV9zcGNyKCksIGVsc2UgY2FsbCBlYXJseV9pbml0X2R0X3NjYW5fY2hvc2VuX3N0ZG91dCgpCisgKi8KK2Jvb2wgZWFybHljb25faW5pdF9pc19kZWZlcnJlZCBfX2luaXRkYXRhOworCiAvKiBlYXJseV9wYXJhbSB3cmFwcGVyIGZvciBzZXR1cF9lYXJseWNvbigpICovCiBzdGF0aWMgaW50IF9faW5pdCBwYXJhbV9zZXR1cF9lYXJseWNvbihjaGFyICpidWYpCiB7CkBAIC0yMDgsOCArMjE2LDE0IEBACiAJICogSnVzdCAnZWFybHljb24nIGlzIGEgdmFsaWQgcGFyYW0gZm9yIGRldmljZXRyZWUgZWFybHljb25zOwogCSAqIGRvbid0IGdlbmVyYXRlIGEgd2FybmluZyBmcm9tIHBhcnNlX2Vhcmx5X3BhcmFtcygpIGluIHRoYXQgY2FzZQogCSAqLwotCWlmICghYnVmIHx8ICFidWZbMF0pCi0JCXJldHVybiAwOworCWlmICghYnVmIHx8ICFidWZbMF0pIHsKKwkJaWYgKElTX0VOQUJMRUQoQ09ORklHX0FDUElfU1BDUl9UQUJMRSkpIHsKKwkJCWVhcmx5Y29uX2luaXRfaXNfZGVmZXJyZWQgPSB0cnVlOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZWFybHlfaW5pdF9kdF9zY2FuX2Nob3Nlbl9zdGRvdXQoKTsKKwkJfQorCX0KIAogCWVyciA9IHNldHVwX2Vhcmx5Y29uKGJ1Zik7CiAJaWYgKGVyciA9PSAtRU5PRU5UIHx8IGVyciA9PSAtRUFMUkVBRFkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvZnNsX2xwdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2ZzbF9scHVhcnQuYwppbmRleCA3Zjk1Zjc4Li5kZTlkNTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvZnNsX2xwdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9mc2xfbHB1YXJ0LmMKQEAgLTIyNCw3ICsyMjQsOCBAQAogI2RlZmluZSBVQVJUV0FURVJfVFhXQVRFUl9PRkYJMAogI2RlZmluZSBVQVJUV0FURVJfUlhXQVRFUl9PRkYJMTYKIAotI2RlZmluZSBGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUJNjQKKy8qIFJ4IERNQSB0aW1lb3V0IGluIG1zLCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBSeCByaW5nIGJ1ZmZlciBzaXplICovCisjZGVmaW5lIERNQV9SWF9USU1FT1VUCQkoMTApCiAKICNkZWZpbmUgRFJJVkVSX05BTUUJImZzbC1scHVhcnQiCiAjZGVmaW5lIERFVl9OQU1FCSJ0dHlMUCIKQEAgLTI0MywxOCArMjQ0LDE4IEBACiAJc3RydWN0IGRtYV9jaGFuCQkqZG1hX3J4X2NoYW47CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICAqZG1hX3R4X2Rlc2M7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICAqZG1hX3J4X2Rlc2M7Ci0JZG1hX2FkZHJfdAkJZG1hX3R4X2J1Zl9idXM7Ci0JZG1hX2FkZHJfdAkJZG1hX3J4X2J1Zl9idXM7CiAJZG1hX2Nvb2tpZV90CQlkbWFfdHhfY29va2llOwogCWRtYV9jb29raWVfdAkJZG1hX3J4X2Nvb2tpZTsKLQl1bnNpZ25lZCBjaGFyCQkqZG1hX3R4X2J1Zl92aXJ0OwotCXVuc2lnbmVkIGNoYXIJCSpkbWFfcnhfYnVmX3ZpcnQ7CiAJdW5zaWduZWQgaW50CQlkbWFfdHhfYnl0ZXM7CiAJdW5zaWduZWQgaW50CQlkbWFfcnhfYnl0ZXM7Ci0JaW50CQkJZG1hX3R4X2luX3Byb2dyZXNzOwotCWludAkJCWRtYV9yeF9pbl9wcm9ncmVzczsKKwlib29sCQkJZG1hX3R4X2luX3Byb2dyZXNzOwogCXVuc2lnbmVkIGludAkJZG1hX3J4X3RpbWVvdXQ7CiAJc3RydWN0IHRpbWVyX2xpc3QJbHB1YXJ0X3RpbWVyOworCXN0cnVjdCBzY2F0dGVybGlzdAlyeF9zZ2wsIHR4X3NnbFsyXTsKKwlzdHJ1Y3QgY2lyY19idWYJCXJ4X3Jpbmc7CisJaW50CQkJcnhfZG1hX3JuZ19idWZfbGVuOworCXVuc2lnbmVkIGludAkJZG1hX3R4X25lbnRzOworCXdhaXRfcXVldWVfaGVhZF90CWRtYV93YWl0OwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbHB1YXJ0X2R0X2lkc1tdID0gewpAQCAtMjcwLDcgKzI3MSw2IEBACiAKIC8qIEZvcndhcmQgZGVjbGFyZSB0aGlzIGZvciB0aGUgZG1hIGNhbGxiYWNrcyovCiBzdGF0aWMgdm9pZCBscHVhcnRfZG1hX3R4X2NvbXBsZXRlKHZvaWQgKmFyZyk7Ci1zdGF0aWMgdm9pZCBscHVhcnRfZG1hX3J4X2NvbXBsZXRlKHZvaWQgKmFyZyk7CiAKIHN0YXRpYyB1MzIgbHB1YXJ0MzJfcmVhZCh2b2lkIF9faW9tZW0gKmFkZHIpCiB7CkBAIC0zMTYsMjE3ICszMTYsMTIxIEBACiAJbHB1YXJ0MzJfd3JpdGUodGVtcCAmIH5VQVJUQ1RSTF9SRSwgcG9ydC0+bWVtYmFzZSArIFVBUlRDVFJMKTsKIH0KIAotc3RhdGljIHZvaWQgbHB1YXJ0X2NvcHlfcnhfdG9fdHR5KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQsCi0JCXN0cnVjdCB0dHlfcG9ydCAqdHR5LCBpbnQgY291bnQpCitzdGF0aWMgdm9pZCBscHVhcnRfZG1hX3R4KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCiB7Ci0JaW50IGNvcGllZDsKKwlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wgPSBzcG9ydC0+dHhfc2dsOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNwb3J0LT5wb3J0LmRldjsKKwlpbnQgcmV0OwogCi0Jc3BvcnQtPnBvcnQuaWNvdW50LnJ4ICs9IGNvdW50OworCWlmIChzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzKQorCQlyZXR1cm47CiAKLQlpZiAoIXR0eSkgewotCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIk5vIHR0eSBwb3J0XG4iKTsKKwlzcG9ydC0+ZG1hX3R4X2J5dGVzID0gdWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCk7CisKKwlpZiAoeG1pdC0+dGFpbCA8IHhtaXQtPmhlYWQpIHsKKwkJc3BvcnQtPmRtYV90eF9uZW50cyA9IDE7CisJCXNnX2luaXRfb25lKHNnbCwgeG1pdC0+YnVmICsgeG1pdC0+dGFpbCwgc3BvcnQtPmRtYV90eF9ieXRlcyk7CisJfSBlbHNlIHsKKwkJc3BvcnQtPmRtYV90eF9uZW50cyA9IDI7CisJCXNnX2luaXRfdGFibGUoc2dsLCAyKTsKKwkJc2dfc2V0X2J1ZihzZ2wsIHhtaXQtPmJ1ZiArIHhtaXQtPnRhaWwsCisJCQkJVUFSVF9YTUlUX1NJWkUgLSB4bWl0LT50YWlsKTsKKwkJc2dfc2V0X2J1ZihzZ2wgKyAxLCB4bWl0LT5idWYsIHhtaXQtPmhlYWQpOworCX0KKworCXJldCA9IGRtYV9tYXBfc2coZGV2LCBzZ2wsIHNwb3J0LT5kbWFfdHhfbmVudHMsIERNQV9UT19ERVZJQ0UpOworCWlmICghcmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRE1BIG1hcHBpbmcgZXJyb3IgZm9yIFRYLlxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfcnhfYnVmX2J1cywKLQkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKLQljb3BpZWQgPSB0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwKLQkJCSgodW5zaWduZWQgY2hhciAqKShzcG9ydC0+ZG1hX3J4X2J1Zl92aXJ0KSksIGNvdW50KTsKLQotCWlmIChjb3BpZWQgIT0gY291bnQpIHsKLQkJV0FSTl9PTigxKTsKLQkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJSeERhdGEgY29weSB0byB0dHkgbGF5ZXIgZmFpbGVkXG4iKTsKLQl9Ci0KLQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfcnhfYnVmX2J1cywKLQkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgRE1BX1RPX0RFVklDRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwdWFydF9waW9fdHgoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKLXsKLQlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0KLQl3aGlsZSAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSAmJgotCQlyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFRDRklGTykgPCBzcG9ydC0+dHhmaWZvX3NpemUpIHsKLQkJd3JpdGViKHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlREUik7Ci0JCXhtaXQtPnRhaWwgPSAoeG1pdC0+dGFpbCArIDEpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7Ci0JCXNwb3J0LT5wb3J0Lmljb3VudC50eCsrOwotCX0KLQotCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKLQkJdWFydF93cml0ZV93YWtldXAoJnNwb3J0LT5wb3J0KTsKLQotCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCi0JCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgfCBVQVJUQ1I1X1RETUFTLAotCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IGxwdWFydF9kbWFfdHgoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCwgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLQlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7Ci0JZG1hX2FkZHJfdCB0eF9idXNfYWRkcjsKLQotCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV90eF9idWZfYnVzLAotCQkJCVVBUlRfWE1JVF9TSVpFLCBETUFfVE9fREVWSUNFKTsKLQlzcG9ydC0+ZG1hX3R4X2J5dGVzID0gY291bnQgJiB+KHNwb3J0LT50eGZpZm9fc2l6ZSAtIDEpOwotCXR4X2J1c19hZGRyID0gc3BvcnQtPmRtYV90eF9idWZfYnVzICsgeG1pdC0+dGFpbDsKLQlzcG9ydC0+ZG1hX3R4X2Rlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zaW5nbGUoc3BvcnQtPmRtYV90eF9jaGFuLAotCQkJCQl0eF9idXNfYWRkciwgc3BvcnQtPmRtYV90eF9ieXRlcywKKwlzcG9ydC0+ZG1hX3R4X2Rlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zZyhzcG9ydC0+ZG1hX3R4X2NoYW4sIHNnbCwKKwkJCQkJc3BvcnQtPmRtYV90eF9uZW50cywKIAkJCQkJRE1BX01FTV9UT19ERVYsIERNQV9QUkVQX0lOVEVSUlVQVCk7Ci0KIAlpZiAoIXNwb3J0LT5kbWFfdHhfZGVzYykgewotCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgIk5vdCBhYmxlIHRvIGdldCBkZXNjIGZvciB0eFxuIik7Ci0JCXJldHVybiAtRUlPOworCQlkbWFfdW5tYXBfc2coZGV2LCBzZ2wsIHNwb3J0LT5kbWFfdHhfbmVudHMsIERNQV9UT19ERVZJQ0UpOworCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBwcmVwYXJlIFRYIHNsYXZlIERNQSFcbiIpOworCQlyZXR1cm47CiAJfQogCiAJc3BvcnQtPmRtYV90eF9kZXNjLT5jYWxsYmFjayA9IGxwdWFydF9kbWFfdHhfY29tcGxldGU7CiAJc3BvcnQtPmRtYV90eF9kZXNjLT5jYWxsYmFja19wYXJhbSA9IHNwb3J0OwotCXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MgPSAxOworCXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MgPSB0cnVlOwogCXNwb3J0LT5kbWFfdHhfY29va2llID0gZG1hZW5naW5lX3N1Ym1pdChzcG9ydC0+ZG1hX3R4X2Rlc2MpOwogCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKHNwb3J0LT5kbWFfdHhfY2hhbik7CiAKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbHB1YXJ0X3ByZXBhcmVfdHgoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKLXsKLQlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7Ci0JdW5zaWduZWQgbG9uZyBjb3VudCA9ICBDSVJDX0NOVF9UT19FTkQoeG1pdC0+aGVhZCwKLQkJCQkJeG1pdC0+dGFpbCwgVUFSVF9YTUlUX1NJWkUpOwotCi0JaWYgKCFjb3VudCkKLQkJcmV0dXJuOwotCi0JaWYgKGNvdW50IDwgc3BvcnQtPnR4Zmlmb19zaXplKQotCQl3cml0ZWIocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpICYgflVBUlRDUjVfVERNQVMsCi0JCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOwotCWVsc2UgewotCQl3cml0ZWIocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpIHwgVUFSVENSNV9URE1BUywKLQkJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7Ci0JCWxwdWFydF9kbWFfdHgoc3BvcnQsIGNvdW50KTsKLQl9CiB9CiAKIHN0YXRpYyB2b2lkIGxwdWFydF9kbWFfdHhfY29tcGxldGUodm9pZCAqYXJnKQogewogCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBhcmc7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wgPSAmc3BvcnQtPnR4X3NnbFswXTsKIAlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWFzeW5jX3R4X2FjayhzcG9ydC0+ZG1hX3R4X2Rlc2MpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKIAorCWRtYV91bm1hcF9zZyhzcG9ydC0+cG9ydC5kZXYsIHNnbCwgc3BvcnQtPmRtYV90eF9uZW50cywgRE1BX1RPX0RFVklDRSk7CisKIAl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyBzcG9ydC0+ZG1hX3R4X2J5dGVzKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOwotCXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MgPSAwOworCisJc3BvcnQtPnBvcnQuaWNvdW50LnR4ICs9IHNwb3J0LT5kbWFfdHhfYnl0ZXM7CisJc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKIAogCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKIAkJdWFydF93cml0ZV93YWtldXAoJnNwb3J0LT5wb3J0KTsKIAotCWxwdWFydF9wcmVwYXJlX3R4KHNwb3J0KTsKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmc3BvcnQtPmRtYV93YWl0KSkgeworCQl3YWtlX3VwKCZzcG9ydC0+ZG1hX3dhaXQpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKworCWlmICghdWFydF9jaXJjX2VtcHR5KHhtaXQpICYmICF1YXJ0X3R4X3N0b3BwZWQoJnNwb3J0LT5wb3J0KSkKKwkJbHB1YXJ0X2RtYV90eChzcG9ydCk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgbHB1YXJ0X2RtYV9yeChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQorc3RhdGljIGludCBscHVhcnRfZG1hX3R4X3JlcXVlc3Qoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzcG9ydC0+cG9ydC5kZXYsIHNwb3J0LT5kbWFfcnhfYnVmX2J1cywKLQkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgRE1BX1RPX0RFVklDRSk7Ci0Jc3BvcnQtPmRtYV9yeF9kZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2luZ2xlKHNwb3J0LT5kbWFfcnhfY2hhbiwKLQkJCXNwb3J0LT5kbWFfcnhfYnVmX2J1cywgRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLAotCQkJRE1BX0RFVl9UT19NRU0sIERNQV9QUkVQX0lOVEVSUlVQVCk7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAorCQkJCQlzdHJ1Y3QgbHB1YXJ0X3BvcnQsIHBvcnQpOworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGRtYV90eF9zY29uZmlnID0ge307CisJaW50IHJldDsKIAotCWlmICghc3BvcnQtPmRtYV9yeF9kZXNjKSB7Ci0JCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiTm90IGFibGUgdG8gZ2V0IGRlc2MgZm9yIHJ4XG4iKTsKLQkJcmV0dXJuIC1FSU87CisJZG1hX3R4X3Njb25maWcuZHN0X2FkZHIgPSBzcG9ydC0+cG9ydC5tYXBiYXNlICsgVUFSVERSOworCWRtYV90eF9zY29uZmlnLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURTsKKwlkbWFfdHhfc2NvbmZpZy5kc3RfbWF4YnVyc3QgPSAxOworCWRtYV90eF9zY29uZmlnLmRpcmVjdGlvbiA9IERNQV9NRU1fVE9fREVWOworCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc3BvcnQtPmRtYV90eF9jaGFuLCAmZG1hX3R4X3Njb25maWcpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwKKwkJCQkiRE1BIHNsYXZlIGNvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAotCXNwb3J0LT5kbWFfcnhfZGVzYy0+Y2FsbGJhY2sgPSBscHVhcnRfZG1hX3J4X2NvbXBsZXRlOwotCXNwb3J0LT5kbWFfcnhfZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBzcG9ydDsKLQlzcG9ydC0+ZG1hX3J4X2luX3Byb2dyZXNzID0gMTsKLQlzcG9ydC0+ZG1hX3J4X2Nvb2tpZSA9IGRtYWVuZ2luZV9zdWJtaXQoc3BvcnQtPmRtYV9yeF9kZXNjKTsKLQlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhzcG9ydC0+ZG1hX3J4X2NoYW4pOwotCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGxwdWFydF9mbHVzaF9idWZmZXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7CisKIAlpZiAoc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlKSB7CisJCWlmIChzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzKSB7CisJCQlkbWFfdW5tYXBfc2coc3BvcnQtPnBvcnQuZGV2LCAmc3BvcnQtPnR4X3NnbFswXSwKKwkJCQlzcG9ydC0+ZG1hX3R4X25lbnRzLCBETUFfVE9fREVWSUNFKTsKKwkJCXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJfQogCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzcG9ydC0+ZG1hX3R4X2NoYW4pOwotCQlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gMDsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGxwdWFydF9kbWFfcnhfY29tcGxldGUodm9pZCAqYXJnKQotewotCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBhcmc7Ci0Jc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT5wb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlhc3luY190eF9hY2soc3BvcnQtPmRtYV9yeF9kZXNjKTsKLQltb2RfdGltZXIoJnNwb3J0LT5scHVhcnRfdGltZXIsIGppZmZpZXMgKyBzcG9ydC0+ZG1hX3J4X3RpbWVvdXQpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCXNwb3J0LT5kbWFfcnhfaW5fcHJvZ3Jlc3MgPSAwOwotCWxwdWFydF9jb3B5X3J4X3RvX3R0eShzcG9ydCwgcG9ydCwgRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFKTsKLQl0dHlfZmxpcF9idWZmZXJfcHVzaChwb3J0KTsKLQlscHVhcnRfZG1hX3J4KHNwb3J0KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbHB1YXJ0X3RpbWVyX2Z1bmModW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSAoc3RydWN0IGxwdWFydF9wb3J0ICopZGF0YTsKLQlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnBvcnQ7Ci0Jc3RydWN0IGRtYV90eF9zdGF0ZSBzdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgdGVtcDsKLQlpbnQgY291bnQ7Ci0KLQlkZWxfdGltZXIoJnNwb3J0LT5scHVhcnRfdGltZXIpOwotCWRtYWVuZ2luZV9wYXVzZShzcG9ydC0+ZG1hX3J4X2NoYW4pOwotCWRtYWVuZ2luZV90eF9zdGF0dXMoc3BvcnQtPmRtYV9yeF9jaGFuLCBzcG9ydC0+ZG1hX3J4X2Nvb2tpZSwgJnN0YXRlKTsKLQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzcG9ydC0+ZG1hX3J4X2NoYW4pOwotCWNvdW50ID0gRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFIC0gc3RhdGUucmVzaWR1ZTsKLQlhc3luY190eF9hY2soc3BvcnQtPmRtYV9yeF9kZXNjKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZzcG9ydC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0KLQlzcG9ydC0+ZG1hX3J4X2luX3Byb2dyZXNzID0gMDsKLQlscHVhcnRfY29weV9yeF90b190dHkoc3BvcnQsIHBvcnQsIGNvdW50KTsKLQl0dHlfZmxpcF9idWZmZXJfcHVzaChwb3J0KTsKLQl0ZW1wID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOwotCXdyaXRlYih0ZW1wICYgflVBUlRDUjVfUkRNQVMsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxwdWFydF9wcmVwYXJlX3J4KHN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBjaGFyIHRlbXA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0Jc3BvcnQtPmxwdWFydF90aW1lci5leHBpcmVzID0gamlmZmllcyArIHNwb3J0LT5kbWFfcnhfdGltZW91dDsKLQlhZGRfdGltZXIoJnNwb3J0LT5scHVhcnRfdGltZXIpOwotCi0JbHB1YXJ0X2RtYV9yeChzcG9ydCk7Ci0JdGVtcCA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKLQl3cml0ZWIodGVtcCB8IFVBUlRDUjVfUkRNQVMsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGxwdWFydF90cmFuc21pdF9idWZmZXIoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKIHsKIAlzdHJ1Y3QgY2lyY19idWYgKnhtaXQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQ7CkBAIC01ODAsOCArNDg0LDggQEAKIAl3cml0ZWIodGVtcCB8IFVBUlRDUjJfVElFLCBwb3J0LT5tZW1iYXNlICsgVUFSVENSMik7CiAKIAlpZiAoc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlKSB7Ci0JCWlmICghdWFydF9jaXJjX2VtcHR5KHhtaXQpICYmICFzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzKQotCQkJbHB1YXJ0X3ByZXBhcmVfdHgoc3BvcnQpOworCQlpZiAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSAmJiAhdWFydF90eF9zdG9wcGVkKHBvcnQpKQorCQkJbHB1YXJ0X2RtYV90eChzcG9ydCk7CiAJfSBlbHNlIHsKIAkJaWYgKHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUU1IxKSAmIFVBUlRTUjFfVERSRSkKIAkJCWxwdWFydF90cmFuc21pdF9idWZmZXIoc3BvcnQpOwpAQCAtNjAwLDYgKzUwNCwyOSBAQAogCQlscHVhcnQzMl90cmFuc21pdF9idWZmZXIoc3BvcnQpOwogfQogCisvKiByZXR1cm4gVElPQ1NFUl9URU1UIHdoZW4gdHJhbnNtaXR0ZXIgaXMgbm90IGJ1c3kgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgbHB1YXJ0X3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAorCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKwl1bnNpZ25lZCBjaGFyIHNyMSA9IHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUU1IxKTsKKwl1bnNpZ25lZCBjaGFyIHNmaWZvID0gcmVhZGIocG9ydC0+bWVtYmFzZSArIFVBUlRTRklGTyk7CisKKwlpZiAoc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcykKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3IxICYgVUFSVFNSMV9UQyAmJiBzZmlmbyAmIFVBUlRTRklGT19UWEVNUFQpCisJCXJldHVybiBUSU9DU0VSX1RFTVQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBscHVhcnQzMl90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiAobHB1YXJ0MzJfcmVhZChwb3J0LT5tZW1iYXNlICsgVUFSVFNUQVQpICYgVUFSVFNUQVRfVEMpID8KKwkJVElPQ1NFUl9URU1UIDogMDsKK30KKwogc3RhdGljIGlycXJldHVybl90IGxwdWFydF90eGludChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGRldl9pZDsKQEAgLTc2NiwyMyArNjkzLDE1IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgbHB1YXJ0X2ludChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGRldl9pZDsKLQl1bnNpZ25lZCBjaGFyIHN0cywgY3JkbWE7CisJdW5zaWduZWQgY2hhciBzdHM7CiAKIAlzdHMgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFNSMSk7Ci0JY3JkbWEgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSk7CiAKLQlpZiAoc3RzICYgVUFSVFNSMV9SRFJGICYmICEoY3JkbWEgJiBVQVJUQ1I1X1JETUFTKSkgewotCQlpZiAoc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlKQotCQkJbHB1YXJ0X3ByZXBhcmVfcngoc3BvcnQpOwotCQllbHNlCi0JCQlscHVhcnRfcnhpbnQoaXJxLCBkZXZfaWQpOwotCX0KLQlpZiAoc3RzICYgVUFSVFNSMV9URFJFICYmICEoY3JkbWEgJiBVQVJUQ1I1X1RETUFTKSkgewotCQlpZiAoc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlKQotCQkJbHB1YXJ0X3Bpb190eChzcG9ydCk7Ci0JCWVsc2UKLQkJCWxwdWFydF90eGludChpcnEsIGRldl9pZCk7Ci0JfQorCWlmIChzdHMgJiBVQVJUU1IxX1JEUkYpCisJCWxwdWFydF9yeGludChpcnEsIGRldl9pZCk7CisKKwlpZiAoc3RzICYgVUFSVFNSMV9URFJFKQorCQlscHVhcnRfdHhpbnQoaXJxLCBkZXZfaWQpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtODA3LDE3ICs3MjYsMjQxIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi0vKiByZXR1cm4gVElPQ1NFUl9URU1UIHdoZW4gdHJhbnNtaXR0ZXIgaXMgbm90IGJ1c3kgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbHB1YXJ0X3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCBscHVhcnRfY29weV9yeF90b190dHkoc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCkKIHsKLQlyZXR1cm4gKHJlYWRiKHBvcnQtPm1lbWJhc2UgKyBVQVJUU1IxKSAmIFVBUlRTUjFfVEMpID8KLQkJVElPQ1NFUl9URU1UIDogMDsKKwlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnBvcnQ7CisJc3RydWN0IGRtYV90eF9zdGF0ZSBzdGF0ZTsKKwllbnVtIGRtYV9zdGF0dXMgZG1hc3RhdDsKKwlzdHJ1Y3QgY2lyY19idWYgKnJpbmcgPSAmc3BvcnQtPnJ4X3Jpbmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQgPSAwOworCXVuc2lnbmVkIGNoYXIgc3I7CisKKwlzciA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUU1IxKTsKKworCWlmIChzciAmIChVQVJUU1IxX1BFIHwgVUFSVFNSMV9GRSkpIHsKKwkJLyogUmVhZCBEUiB0byBjbGVhciB0aGUgZXJyb3IgZmxhZ3MgKi8KKwkJcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlREUik7CisKKwkJaWYgKHNyICYgVUFSVFNSMV9QRSkKKwkJICAgIHNwb3J0LT5wb3J0Lmljb3VudC5wYXJpdHkrKzsKKwkJZWxzZSBpZiAoc3IgJiBVQVJUU1IxX0ZFKQorCQkgICAgc3BvcnQtPnBvcnQuaWNvdW50LmZyYW1lKys7CisJfQorCisJYXN5bmNfdHhfYWNrKHNwb3J0LT5kbWFfcnhfZGVzYyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCisJZG1hc3RhdCA9IGRtYWVuZ2luZV90eF9zdGF0dXMoc3BvcnQtPmRtYV9yeF9jaGFuLAorCQkJCXNwb3J0LT5kbWFfcnhfY29va2llLAorCQkJCSZzdGF0ZSk7CisKKwlpZiAoZG1hc3RhdCA9PSBETUFfRVJST1IpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJSeCBETUEgdHJhbnNmZXIgZmFpbGVkIVxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENQVSBjbGFpbXMgb3duZXJzaGlwIG9mIFJYIERNQSBidWZmZXIgKi8KKwlkbWFfc3luY19zZ19mb3JfY3B1KHNwb3J0LT5wb3J0LmRldiwgJnNwb3J0LT5yeF9zZ2wsIDEsIERNQV9GUk9NX0RFVklDRSk7CisKKwkvKgorCSAqIHJpbmctPmhlYWQgcG9pbnRzIHRvIHRoZSBlbmQgb2YgZGF0YSBhbHJlYWR5IHdyaXR0ZW4gYnkgdGhlIERNQS4KKwkgKiByaW5nLT50YWlsIHBvaW50cyB0byB0aGUgYmVnaW5uaW5nIG9mIGRhdGEgdG8gYmUgcmVhZCBieSB0aGUKKwkgKiBmcmFtZXdvcmsuCisJICogVGhlIGN1cnJlbnQgdHJhbnNmZXIgc2l6ZSBzaG91bGQgbm90IGJlIGxhcmdlciB0aGFuIHRoZSBkbWEgYnVmZmVyCisJICogbGVuZ3RoLgorCSAqLworCXJpbmctPmhlYWQgPSBzcG9ydC0+cnhfc2dsLmxlbmd0aCAtIHN0YXRlLnJlc2lkdWU7CisJQlVHX09OKHJpbmctPmhlYWQgPiBzcG9ydC0+cnhfc2dsLmxlbmd0aCk7CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHJpbmctPmhlYWQgbWF5IHBvaW50IHRvIHRoZSBmaXJzdCBieXRlIHJpZ2h0IGFmdGVyIHRoZQorCSAqIGxhc3QgYnl0ZSBvZiB0aGUgZG1hIGJ1ZmZlcjoKKwkgKiAwIDw9IHJpbmctPmhlYWQgPD0gc3BvcnQtPnJ4X3NnbC5sZW5ndGgKKwkgKgorCSAqIEhvd2V2ZXIgcmluZy0+dGFpbCBtdXN0IGFsd2F5cyBwb2ludHMgaW5zaWRlIHRoZSBkbWEgYnVmZmVyOgorCSAqIDAgPD0gcmluZy0+dGFpbCA8PSBzcG9ydC0+cnhfc2dsLmxlbmd0aCAtIDEKKwkgKgorCSAqIFNpbmNlIHdlIHVzZSBhIHJpbmcgYnVmZmVyLCB3ZSBoYXZlIHRvIGhhbmRsZSB0aGUgY2FzZQorCSAqIHdoZXJlIGhlYWQgaXMgbG93ZXIgdGhhbiB0YWlsLiBJbiBzdWNoIGEgY2FzZSwgd2UgZmlyc3QgcmVhZCBmcm9tCisJICogdGFpbCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgdGhlbiByZXNldCB0YWlsLgorCSAqLworCWlmIChyaW5nLT5oZWFkIDwgcmluZy0+dGFpbCkgeworCQljb3VudCA9IHNwb3J0LT5yeF9zZ2wubGVuZ3RoIC0gcmluZy0+dGFpbDsKKworCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHBvcnQsIHJpbmctPmJ1ZiArIHJpbmctPnRhaWwsIGNvdW50KTsKKwkJcmluZy0+dGFpbCA9IDA7CisJCXNwb3J0LT5wb3J0Lmljb3VudC5yeCArPSBjb3VudDsKKwl9CisKKwkvKiBGaW5hbGx5IHdlIHJlYWQgZGF0YSBmcm9tIHRhaWwgdG8gaGVhZCAqLworCWlmIChyaW5nLT50YWlsIDwgcmluZy0+aGVhZCkgeworCQljb3VudCA9IHJpbmctPmhlYWQgLSByaW5nLT50YWlsOworCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHBvcnQsIHJpbmctPmJ1ZiArIHJpbmctPnRhaWwsIGNvdW50KTsKKwkJLyogV3JhcCByaW5nLT5oZWFkIGlmIG5lZWRlZCAqLworCQlpZiAocmluZy0+aGVhZCA+PSBzcG9ydC0+cnhfc2dsLmxlbmd0aCkKKwkJCXJpbmctPmhlYWQgPSAwOworCQlyaW5nLT50YWlsID0gcmluZy0+aGVhZDsKKwkJc3BvcnQtPnBvcnQuaWNvdW50LnJ4ICs9IGNvdW50OworCX0KKworCWRtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3BvcnQtPnBvcnQuZGV2LCAmc3BvcnQtPnJ4X3NnbCwgMSwKKwkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCisJdHR5X2ZsaXBfYnVmZmVyX3B1c2gocG9ydCk7CisJbW9kX3RpbWVyKCZzcG9ydC0+bHB1YXJ0X3RpbWVyLCBqaWZmaWVzICsgc3BvcnQtPmRtYV9yeF90aW1lb3V0KTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBscHVhcnQzMl90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgbHB1YXJ0X2RtYV9yeF9jb21wbGV0ZSh2b2lkICphcmcpCiB7Ci0JcmV0dXJuIChscHVhcnQzMl9yZWFkKHBvcnQtPm1lbWJhc2UgKyBVQVJUU1RBVCkgJiBVQVJUU1RBVF9UQykgPwotCQlUSU9DU0VSX1RFTVQgOiAwOworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBhcmc7CisKKwlscHVhcnRfY29weV9yeF90b190dHkoc3BvcnQpOworfQorCitzdGF0aWMgdm9pZCBscHVhcnRfdGltZXJfZnVuYyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKilkYXRhOworCisJbHB1YXJ0X2NvcHlfcnhfdG9fdHR5KHNwb3J0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbHB1YXJ0X3N0YXJ0X3J4X2RtYShzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQoreworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGRtYV9yeF9zY29uZmlnID0ge307CisJc3RydWN0IGNpcmNfYnVmICpyaW5nID0gJnNwb3J0LT5yeF9yaW5nOworCWludCByZXQsIG5lbnQ7CisJaW50IGJpdHMsIGJhdWQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnNwb3J0LT5wb3J0LnN0YXRlLT5wb3J0KTsKKwlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MgPSAmdHR5LT50ZXJtaW9zOworCisJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSk7CisKKwliaXRzID0gKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgPT0gQ1M3ID8gOSA6IDEwOworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CKQorCQliaXRzKys7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBsZW5ndGggb2Ygb25lIERNQSBidWZmZXIgc2l6ZSB0byBrZWVwIGxhdGVuY3kgYmVsb3cKKwkgKiAxMG1zIGF0IGFueSBiYXVkIHJhdGUuCisJICovCisJc3BvcnQtPnJ4X2RtYV9ybmdfYnVmX2xlbiA9IChETUFfUlhfVElNRU9VVCAqIGJhdWQgLyAgYml0cyAvIDEwMDApICogMjsKKwlzcG9ydC0+cnhfZG1hX3JuZ19idWZfbGVuID0gKDEgPDwgKGZscyhzcG9ydC0+cnhfZG1hX3JuZ19idWZfbGVuKSAtIDEpKTsKKwlpZiAoc3BvcnQtPnJ4X2RtYV9ybmdfYnVmX2xlbiA8IDE2KQorCQlzcG9ydC0+cnhfZG1hX3JuZ19idWZfbGVuID0gMTY7CisKKwlyaW5nLT5idWYgPSBrbWFsbG9jKHNwb3J0LT5yeF9kbWFfcm5nX2J1Zl9sZW4sIEdGUF9BVE9NSUMpOworCWlmICghcmluZy0+YnVmKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiUmluZyBidWYgYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc2dfaW5pdF9vbmUoJnNwb3J0LT5yeF9zZ2wsIHJpbmctPmJ1Ziwgc3BvcnQtPnJ4X2RtYV9ybmdfYnVmX2xlbik7CisJc2dfc2V0X2J1Zigmc3BvcnQtPnJ4X3NnbCwgcmluZy0+YnVmLCBzcG9ydC0+cnhfZG1hX3JuZ19idWZfbGVuKTsKKwluZW50ID0gZG1hX21hcF9zZyhzcG9ydC0+cG9ydC5kZXYsICZzcG9ydC0+cnhfc2dsLCAxLCBETUFfRlJPTV9ERVZJQ0UpOworCisJaWYgKCFuZW50KSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiRE1BIFJ4IG1hcHBpbmcgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkbWFfcnhfc2NvbmZpZy5zcmNfYWRkciA9IHNwb3J0LT5wb3J0Lm1hcGJhc2UgKyBVQVJURFI7CisJZG1hX3J4X3Njb25maWcuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOworCWRtYV9yeF9zY29uZmlnLnNyY19tYXhidXJzdCA9IDE7CisJZG1hX3J4X3Njb25maWcuZGlyZWN0aW9uID0gRE1BX0RFVl9UT19NRU07CisJcmV0ID0gZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzcG9ydC0+ZG1hX3J4X2NoYW4sICZkbWFfcnhfc2NvbmZpZyk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwKKwkJCQkiRE1BIFJ4IHNsYXZlIGNvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNwb3J0LT5kbWFfcnhfZGVzYyA9IGRtYWVuZ2luZV9wcmVwX2RtYV9jeWNsaWMoc3BvcnQtPmRtYV9yeF9jaGFuLAorCQkJCSBzZ19kbWFfYWRkcmVzcygmc3BvcnQtPnJ4X3NnbCksCisJCQkJIHNwb3J0LT5yeF9zZ2wubGVuZ3RoLAorCQkJCSBzcG9ydC0+cnhfc2dsLmxlbmd0aCAvIDIsCisJCQkJIERNQV9ERVZfVE9fTUVNLAorCQkJCSBETUFfUFJFUF9JTlRFUlJVUFQpOworCWlmICghc3BvcnQtPmRtYV9yeF9kZXNjKSB7CisJCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiQ2Fubm90IHByZXBhcmUgY3ljbGljIERNQVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNwb3J0LT5kbWFfcnhfZGVzYy0+Y2FsbGJhY2sgPSBscHVhcnRfZG1hX3J4X2NvbXBsZXRlOworCXNwb3J0LT5kbWFfcnhfZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBzcG9ydDsKKwlzcG9ydC0+ZG1hX3J4X2Nvb2tpZSA9IGRtYWVuZ2luZV9zdWJtaXQoc3BvcnQtPmRtYV9yeF9kZXNjKTsKKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhzcG9ydC0+ZG1hX3J4X2NoYW4pOworCisJd3JpdGViKHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KSB8IFVBUlRDUjVfUkRNQVMsCisJCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxwdWFydF9kbWFfcnhfZnJlZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKKworCWlmIChzcG9ydC0+ZG1hX3J4X2NoYW4pCisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNwb3J0LT5kbWFfcnhfY2hhbik7CisKKwlkbWFfdW5tYXBfc2coc3BvcnQtPnBvcnQuZGV2LCAmc3BvcnQtPnJ4X3NnbCwgMSwgRE1BX0ZST01fREVWSUNFKTsKKwlrZnJlZShzcG9ydC0+cnhfcmluZy5idWYpOworCXNwb3J0LT5yeF9yaW5nLnRhaWwgPSAwOworCXNwb3J0LT5yeF9yaW5nLmhlYWQgPSAwOworCXNwb3J0LT5kbWFfcnhfZGVzYyA9IE5VTEw7CisJc3BvcnQtPmRtYV9yeF9jb29raWUgPSAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGxwdWFydF9jb25maWdfcnM0ODUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKKwkJCXN0cnVjdCBzZXJpYWxfcnM0ODUgKnJzNDg1KQoreworCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKKwkJCXN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7CisKKwl1OCBtb2RlbSA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUTU9ERU0pICYKKwkJfihVQVJUTU9ERU1fVFhSVFNQT0wgfCBVQVJUTU9ERU1fVFhSVFNFKTsKKwl3cml0ZWIobW9kZW0sIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUTU9ERU0pOworCisJaWYgKHJzNDg1LT5mbGFncyAmIFNFUl9SUzQ4NV9FTkFCTEVEKSB7CisJCS8qIEVuYWJsZSBhdXRvIFJTLTQ4NSBSVFMgbW9kZSAqLworCQltb2RlbSB8PSBVQVJUTU9ERU1fVFhSVFNFOworCisJCS8qCisJCSAqIFJUUyBuZWVkcyB0byBiZSBsb2dpYyBISUdIIGVpdGhlciBkdXJpbmcgdHJhbnNlciBfb3JfIGFmdGVyCisJCSAqIHRyYW5zZmVyLCBvdGhlciB2YXJpYW50cyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUuCisJCSAqLworCisJCWlmICghKHJzNDg1LT5mbGFncyAmIChTRVJfUlM0ODVfUlRTX09OX1NFTkQgfAorCQkJCVNFUl9SUzQ4NV9SVFNfQUZURVJfU0VORCkpKQorCQkJcnM0ODUtPmZsYWdzIHw9IFNFUl9SUzQ4NV9SVFNfT05fU0VORDsKKworCQlpZiAocnM0ODUtPmZsYWdzICYgU0VSX1JTNDg1X1JUU19PTl9TRU5EICYmCisJCQkJcnM0ODUtPmZsYWdzICYgU0VSX1JTNDg1X1JUU19BRlRFUl9TRU5EKQorCQkJcnM0ODUtPmZsYWdzICY9IH5TRVJfUlM0ODVfUlRTX0FGVEVSX1NFTkQ7CisKKwkJLyoKKwkJICogVGhlIGhhcmR3YXJlIGRlZmF1bHRzIHRvIFJUUyBsb2dpYyBISUdIIHdoaWxlIHRyYW5zZmVyLgorCQkgKiBTd2l0Y2ggcG9sYXJpdHkgaW4gY2FzZSBSVFMgc2hhbGwgYmUgbG9naWMgSElHSAorCQkgKiBhZnRlciB0cmFuc2Zlci4KKwkJICogTm90ZTogVUFSVCBpcyBhc3N1bWVkIHRvIGJlIGFjdGl2ZSBoaWdoLgorCQkgKi8KKwkJaWYgKHJzNDg1LT5mbGFncyAmIFNFUl9SUzQ4NV9SVFNfT05fU0VORCkKKwkJCW1vZGVtICY9IH5VQVJUTU9ERU1fVFhSVFNQT0w7CisJCWVsc2UgaWYgKHJzNDg1LT5mbGFncyAmIFNFUl9SUzQ4NV9SVFNfQUZURVJfU0VORCkKKwkJCW1vZGVtIHw9IFVBUlRNT0RFTV9UWFJUU1BPTDsKKwl9CisKKwkvKiBTdG9yZSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKi8KKwlzcG9ydC0+cG9ydC5yczQ4NSA9ICpyczQ4NTsKKworCXdyaXRlYihtb2RlbSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRNT0RFTSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbHB1YXJ0X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtODUzLDE3ICs5OTYsMjIgQEAKIHN0YXRpYyB2b2lkIGxwdWFydF9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQogewogCXVuc2lnbmVkIGNoYXIgdGVtcDsKKwlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsCisJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKIAotCXRlbXAgPSByZWFkYihwb3J0LT5tZW1iYXNlICsgVUFSVE1PREVNKSAmCisJLyogTWFrZSBzdXJlIFJYUlRTRSBiaXQgaXMgbm90IHNldCB3aGVuIFJTNDg1IGlzIGVuYWJsZWQgKi8KKwlpZiAoIShzcG9ydC0+cG9ydC5yczQ4NS5mbGFncyAmIFNFUl9SUzQ4NV9FTkFCTEVEKSkgeworCQl0ZW1wID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRNT0RFTSkgJgogCQkJfihVQVJUTU9ERU1fUlhSVFNFIHwgVUFSVE1PREVNX1RYQ1RTRSk7CiAKLQlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCi0JCXRlbXAgfD0gVUFSVE1PREVNX1JYUlRTRTsKKwkJaWYgKG1jdHJsICYgVElPQ01fUlRTKQorCQkJdGVtcCB8PSBVQVJUTU9ERU1fUlhSVFNFOwogCi0JaWYgKG1jdHJsICYgVElPQ01fQ1RTKQotCQl0ZW1wIHw9IFVBUlRNT0RFTV9UWENUU0U7CisJCWlmIChtY3RybCAmIFRJT0NNX0NUUykKKwkJCXRlbXAgfD0gVUFSVE1PREVNX1RYQ1RTRTsKIAotCXdyaXRlYih0ZW1wLCBwb3J0LT5tZW1iYXNlICsgVUFSVE1PREVNKTsKKwkJd3JpdGViKHRlbXAsIHBvcnQtPm1lbWJhc2UgKyBVQVJUTU9ERU0pOworCX0KIH0KIAogc3RhdGljIHZvaWQgbHB1YXJ0MzJfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKQEAgLTkyMSwxMyArMTA2OSwxNiBAQAogCXdyaXRlYih2YWwgfCBVQVJUUEZJRk9fVFhGRSB8IFVBUlRQRklGT19SWEZFLAogCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRQRklGTyk7CiAKLQkvKiBleHBsaWNpdGx5IGNsZWFyIFJEUkYgKi8KLQlyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFNSMSk7Ci0KIAkvKiBmbHVzaCBUeCBhbmQgUnggRklGTyAqLwogCXdyaXRlYihVQVJUQ0ZJRk9fVFhGTFVTSCB8IFVBUlRDRklGT19SWEZMVVNILAogCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDRklGTyk7CiAKKwkvKiBleHBsaWNpdGx5IGNsZWFyIFJEUkYgKi8KKwlpZiAocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRTUjEpICYgVUFSVFNSMV9SRFJGKSB7CisJCXJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJURFIpOworCQl3cml0ZWIoVUFSVFNGSUZPX1JYVUYsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUU0ZJRk8pOworCX0KKwogCXdyaXRlYigwLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFRXRklGTyk7CiAJd3JpdGViKDEsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUUldGSUZPKTsKIApAQCAtOTYwLDExMCArMTExMSwxMiBAQAogCWxwdWFydDMyX3dyaXRlKGN0cmxfc2F2ZWQsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1RSTCk7CiB9CiAKLXN0YXRpYyBpbnQgbHB1YXJ0X2RtYV90eF9yZXF1ZXN0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCByeF9kbWFfdGltZXJfaW5pdChzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0KQogewotCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKLQkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKLQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBkbWFfdHhfc2NvbmZpZzsKLQlkbWFfYWRkcl90IGRtYV9idXM7Ci0JdW5zaWduZWQgY2hhciAqZG1hX2J1ZjsKLQlpbnQgcmV0OwotCi0JZG1hX2J1cyA9IGRtYV9tYXBfc2luZ2xlKHNwb3J0LT5kbWFfdHhfY2hhbi0+ZGV2aWNlLT5kZXYsCi0JCQkJc3BvcnQtPnBvcnQuc3RhdGUtPnhtaXQuYnVmLAotCQkJCVVBUlRfWE1JVF9TSVpFLCBETUFfVE9fREVWSUNFKTsKLQotCWlmIChkbWFfbWFwcGluZ19lcnJvcihzcG9ydC0+ZG1hX3R4X2NoYW4tPmRldmljZS0+ZGV2LCBkbWFfYnVzKSkgewotCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwgImRtYV9tYXBfc2luZ2xlIHR4IGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWRtYV9idWYgPSBzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdC5idWY7Ci0JZG1hX3R4X3Njb25maWcuZHN0X2FkZHIgPSBzcG9ydC0+cG9ydC5tYXBiYXNlICsgVUFSVERSOwotCWRtYV90eF9zY29uZmlnLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURTsKLQlkbWFfdHhfc2NvbmZpZy5kc3RfbWF4YnVyc3QgPSBzcG9ydC0+dHhmaWZvX3NpemU7Ci0JZG1hX3R4X3Njb25maWcuZGlyZWN0aW9uID0gRE1BX01FTV9UT19ERVY7Ci0JcmV0ID0gZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzcG9ydC0+ZG1hX3R4X2NoYW4sICZkbWFfdHhfc2NvbmZpZyk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHNwb3J0LT5wb3J0LmRldiwKLQkJCQkiRG1hIHNsYXZlIGNvbmZpZyBmYWlsZWQsIGVyciA9ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXNwb3J0LT5kbWFfdHhfYnVmX3ZpcnQgPSBkbWFfYnVmOwotCXNwb3J0LT5kbWFfdHhfYnVmX2J1cyA9IGRtYV9idXM7Ci0Jc3BvcnQtPmRtYV90eF9pbl9wcm9ncmVzcyA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBscHVhcnRfZG1hX3J4X3JlcXVlc3Qoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsCi0JCQkJCXN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7Ci0Jc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgZG1hX3J4X3Njb25maWc7Ci0JZG1hX2FkZHJfdCBkbWFfYnVzOwotCXVuc2lnbmVkIGNoYXIgKmRtYV9idWY7Ci0JaW50IHJldDsKLQotCWRtYV9idWYgPSBkZXZtX2t6YWxsb2Moc3BvcnQtPnBvcnQuZGV2LAotCQkJCUZTTF9VQVJUX1JYX0RNQV9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWRtYV9idWYpIHsKLQkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJEbWEgcnggYWxsb2MgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZG1hX2J1cyA9IGRtYV9tYXBfc2luZ2xlKHNwb3J0LT5kbWFfcnhfY2hhbi0+ZGV2aWNlLT5kZXYsIGRtYV9idWYsCi0JCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwotCi0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHNwb3J0LT5kbWFfcnhfY2hhbi0+ZGV2aWNlLT5kZXYsIGRtYV9idXMpKSB7Ci0JCWRldl9lcnIoc3BvcnQtPnBvcnQuZGV2LCAiZG1hX21hcF9zaW5nbGUgcnggZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZG1hX3J4X3Njb25maWcuc3JjX2FkZHIgPSBzcG9ydC0+cG9ydC5tYXBiYXNlICsgVUFSVERSOwotCWRtYV9yeF9zY29uZmlnLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURTsKLQlkbWFfcnhfc2NvbmZpZy5zcmNfbWF4YnVyc3QgPSAxOwotCWRtYV9yeF9zY29uZmlnLmRpcmVjdGlvbiA9IERNQV9ERVZfVE9fTUVNOwotCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc3BvcnQtPmRtYV9yeF9jaGFuLCAmZG1hX3J4X3Njb25maWcpOwotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsCi0JCQkJIkRtYSBzbGF2ZSBjb25maWcgZmFpbGVkLCBlcnIgPSAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzcG9ydC0+ZG1hX3J4X2J1Zl92aXJ0ID0gZG1hX2J1ZjsKLQlzcG9ydC0+ZG1hX3J4X2J1Zl9idXMgPSBkbWFfYnVzOwotCXNwb3J0LT5kbWFfcnhfaW5fcHJvZ3Jlc3MgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGxwdWFydF9kbWFfdHhfZnJlZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwKLQkJCQkJc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKLQotCWRtYV91bm1hcF9zaW5nbGUoc3BvcnQtPnBvcnQuZGV2LCBzcG9ydC0+ZG1hX3R4X2J1Zl9idXMsCi0JCQlVQVJUX1hNSVRfU0laRSwgRE1BX1RPX0RFVklDRSk7Ci0KLQlzcG9ydC0+ZG1hX3R4X2J1Zl9idXMgPSAwOwotCXNwb3J0LT5kbWFfdHhfYnVmX3ZpcnQgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBscHVhcnRfZG1hX3J4X2ZyZWUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3QgbHB1YXJ0X3BvcnQgKnNwb3J0ID0gY29udGFpbmVyX29mKHBvcnQsCi0JCQkJCXN0cnVjdCBscHVhcnRfcG9ydCwgcG9ydCk7Ci0KLQlkbWFfdW5tYXBfc2luZ2xlKHNwb3J0LT5wb3J0LmRldiwgc3BvcnQtPmRtYV9yeF9idWZfYnVzLAotCQkJRlNMX1VBUlRfUlhfRE1BX0JVRkZFUl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwotCi0Jc3BvcnQtPmRtYV9yeF9idWZfYnVzID0gMDsKLQlzcG9ydC0+ZG1hX3J4X2J1Zl92aXJ0ID0gTlVMTDsKKwkJc2V0dXBfdGltZXIoJnNwb3J0LT5scHVhcnRfdGltZXIsIGxwdWFydF90aW1lcl9mdW5jLAorCQkJCSh1bnNpZ25lZCBsb25nKXNwb3J0KTsKKwkJc3BvcnQtPmxwdWFydF90aW1lci5leHBpcmVzID0gamlmZmllcyArIHNwb3J0LT5kbWFfcnhfdGltZW91dDsKKwkJYWRkX3RpbWVyKCZzcG9ydC0+bHB1YXJ0X3RpbWVyKTsKIH0KIAogc3RhdGljIGludCBscHVhcnRfc3RhcnR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtMTA4NCwyMiArMTEzNyw2IEBACiAJc3BvcnQtPnJ4Zmlmb19zaXplID0gMHgxIDw8ICgoKHRlbXAgPj4gVUFSVFBGSUZPX1JYU0laRV9PRkYpICYKIAkJVUFSVFBGSUZPX0ZJRk9TSVpFX01BU0spICsgMSk7CiAKLQlpZiAoc3BvcnQtPmRtYV9yeF9jaGFuICYmICFscHVhcnRfZG1hX3J4X3JlcXVlc3QocG9ydCkpIHsKLQkJc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlID0gdHJ1ZTsKLQkJc2V0dXBfdGltZXIoJnNwb3J0LT5scHVhcnRfdGltZXIsIGxwdWFydF90aW1lcl9mdW5jLAotCQkJICAgICh1bnNpZ25lZCBsb25nKXNwb3J0KTsKLQl9IGVsc2UKLQkJc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlID0gZmFsc2U7Ci0KLQotCWlmIChzcG9ydC0+ZG1hX3R4X2NoYW4gJiYgIWxwdWFydF9kbWFfdHhfcmVxdWVzdChwb3J0KSkgewotCQlzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UgPSB0cnVlOwotCQl0ZW1wID0gcmVhZGIocG9ydC0+bWVtYmFzZSArIFVBUlRDUjUpOwotCQl0ZW1wICY9IH5VQVJUQ1I1X1JETUFTOwotCQl3cml0ZWIodGVtcCB8IFVBUlRDUjVfVERNQVMsIHBvcnQtPm1lbWJhc2UgKyBVQVJUQ1I1KTsKLQl9IGVsc2UKLQkJc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlID0gZmFsc2U7Ci0KIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKHBvcnQtPmRldiwgcG9ydC0+aXJxLCBscHVhcnRfaW50LCAwLAogCQkJCURSSVZFUl9OQU1FLCBzcG9ydCk7CiAJaWYgKHJldCkKQEAgLTExMTMsNyArMTE1MCwyOSBAQAogCXRlbXAgfD0gKFVBUlRDUjJfUklFIHwgVUFSVENSMl9USUUgfCBVQVJUQ1IyX1JFIHwgVUFSVENSMl9URSk7CiAJd3JpdGViKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1IyKTsKIAorCWlmIChzcG9ydC0+ZG1hX3J4X2NoYW4gJiYgIWxwdWFydF9zdGFydF9yeF9kbWEoc3BvcnQpKSB7CisJCS8qIHNldCBSeCBETUEgdGltZW91dCAqLworCQlzcG9ydC0+ZG1hX3J4X3RpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKERNQV9SWF9USU1FT1VUKTsKKwkJaWYgKCFzcG9ydC0+ZG1hX3J4X3RpbWVvdXQpCisJCSAgICAgc3BvcnQtPmRtYV9yeF90aW1lb3V0ID0gMTsKKworCQlzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UgPSB0cnVlOworCQlyeF9kbWFfdGltZXJfaW5pdChzcG9ydCk7CisJfSBlbHNlIHsKKwkJc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlID0gZmFsc2U7CisJfQorCisJaWYgKHNwb3J0LT5kbWFfdHhfY2hhbiAmJiAhbHB1YXJ0X2RtYV90eF9yZXF1ZXN0KHBvcnQpKSB7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNwb3J0LT5kbWFfd2FpdCk7CisJCXNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSA9IHRydWU7CisJCXRlbXAgPSByZWFkYihwb3J0LT5tZW1iYXNlICsgVUFSVENSNSk7CisJCXdyaXRlYih0ZW1wIHwgVUFSVENSNV9URE1BUywgcG9ydC0+bWVtYmFzZSArIFVBUlRDUjUpOworCX0gZWxzZSB7CisJCXNwb3J0LT5scHVhcnRfZG1hX3R4X3VzZSA9IGZhbHNlOworCX0KKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMTcwLDEyICsxMjI5LDE5IEBACiAJZGV2bV9mcmVlX2lycShwb3J0LT5kZXYsIHBvcnQtPmlycSwgc3BvcnQpOwogCiAJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSkgewotCQlscHVhcnRfZG1hX3J4X2ZyZWUoJnNwb3J0LT5wb3J0KTsKIAkJZGVsX3RpbWVyX3N5bmMoJnNwb3J0LT5scHVhcnRfdGltZXIpOworCQlscHVhcnRfZG1hX3J4X2ZyZWUoJnNwb3J0LT5wb3J0KTsKIAl9CiAKLQlpZiAoc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlKQotCQlscHVhcnRfZG1hX3R4X2ZyZWUoJnNwb3J0LT5wb3J0KTsKKwlpZiAoc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlKSB7CisJCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc3BvcnQtPmRtYV93YWl0LAorCQkJIXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MpICE9IGZhbHNlKSB7CisJCQlzcG9ydC0+ZG1hX3R4X2luX3Byb2dyZXNzID0gZmFsc2U7CisJCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzcG9ydC0+ZG1hX3R4X2NoYW4pOworCQl9CisKKwkJbHB1YXJ0X3N0b3BfdHgocG9ydCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBscHVhcnQzMl9zaHV0ZG93bihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtMTIwMywxMyArMTI2OSwxNCBAQAogewogCXN0cnVjdCBscHVhcnRfcG9ydCAqc3BvcnQgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IGxwdWFydF9wb3J0LCBwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGNoYXIgY3IxLCBvbGRfY3IxLCBvbGRfY3IyLCBjcjQsIGJkaCwgbW9kZW07CisJdW5zaWduZWQgY2hhciBjcjEsIG9sZF9jcjEsIG9sZF9jcjIsIGNyMywgY3I0LCBiZGgsIG1vZGVtOwogCXVuc2lnbmVkIGludCAgYmF1ZDsKIAl1bnNpZ25lZCBpbnQgb2xkX2NzaXplID0gb2xkID8gb2xkLT5jX2NmbGFnICYgQ1NJWkUgOiBDUzg7CiAJdW5zaWduZWQgaW50IHNiciwgYnJmYTsKIAogCWNyMSA9IG9sZF9jcjEgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSMSk7CiAJb2xkX2NyMiA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1IyKTsKKwljcjMgPSByZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSMyk7CiAJY3I0ID0gcmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjQpOwogCWJkaCA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQkRIKTsKIAltb2RlbSA9IHJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUTU9ERU0pOwpAQCAtMTI0MCw2ICsxMzA3LDEzIEBACiAJCWNyMSB8PSBVQVJUQ1IxX007CiAJfQogCisJLyoKKwkgKiBXaGVuIGF1dG8gUlMtNDg1IFJUUyBtb2RlIGlzIGVuYWJsZWQsCisJICogaGFyZHdhcmUgZmxvdyBjb250cm9sIG5lZWQgdG8gYmUgZGlzYWJsZWQuCisJICovCisJaWYgKHNwb3J0LT5wb3J0LnJzNDg1LmZsYWdzICYgU0VSX1JTNDg1X0VOQUJMRUQpCisJCXRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNSVFNDVFM7CisKIAlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKIAkJbW9kZW0gfD0gKFVBUlRNT0RFTV9SWFJUU0UgfCBVQVJUTU9ERU1fVFhDVFNFKTsKIAl9IGVsc2UgewpAQCAtMTI1Nyw3ICsxMzMxLDEwIEBACiAJaWYgKCh0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CKSkgewogCQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENNU1BBUikgewogCQkJY3IxICY9IH5VQVJUQ1IxX1BFOwotCQkJY3IxIHw9IFVBUlRDUjFfTTsKKwkJCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REKQorCQkJCWNyMyB8PSBVQVJUQ1IzX1Q4OworCQkJZWxzZQorCQkJCWNyMyAmPSB+VUFSVENSM19UODsKIAkJfSBlbHNlIHsKIAkJCWNyMSB8PSBVQVJUQ1IxX1BFOwogCQkJaWYgKCh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUpID09IENTOCkKQEAgLTEyOTcsMTcgKzEzNzQsNiBAQAogCS8qIHVwZGF0ZSB0aGUgcGVyLXBvcnQgdGltZW91dCAqLwogCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgdGVybWlvcy0+Y19jZmxhZywgYmF1ZCk7CiAKLQlpZiAoc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlKSB7Ci0JCS8qIENhbGN1bGF0ZSBkZWxheSBmb3IgMS41IERNQSBidWZmZXJzICovCi0JCXNwb3J0LT5kbWFfcnhfdGltZW91dCA9IChzcG9ydC0+cG9ydC50aW1lb3V0IC0gSFogLyA1MCkgKgotCQkJCQlGU0xfVUFSVF9SWF9ETUFfQlVGRkVSX1NJWkUgKiAzIC8KLQkJCQkJc3BvcnQtPnJ4Zmlmb19zaXplIC8gMjsKLQkJZGV2X2RiZyhwb3J0LT5kZXYsICJETUEgUnggdC1vdXQgJXVtcywgdHR5IHQtb3V0ICV1IGppZmZpZXNcbiIsCi0JCQlzcG9ydC0+ZG1hX3J4X3RpbWVvdXQgKiAxMDAwIC8gSFosIHNwb3J0LT5wb3J0LnRpbWVvdXQpOwotCQlpZiAoc3BvcnQtPmRtYV9yeF90aW1lb3V0IDwgbXNlY3NfdG9famlmZmllcygyMCkpCi0JCQlzcG9ydC0+ZG1hX3J4X3RpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDIwKTsKLQl9Ci0KIAkvKiB3YWl0IHRyYW5zbWl0IGVuZ2luIGNvbXBsZXRlICovCiAJd2hpbGUgKCEocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRTUjEpICYgVUFSVFNSMV9UQykpCiAJCWJhcnJpZXIoKTsKQEAgLTEzMjUsMTIgKzEzOTEsMzEgQEAKIAl3cml0ZWIoY3I0IHwgYnJmYSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjQpOwogCXdyaXRlYihiZGgsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQkRIKTsKIAl3cml0ZWIoc2JyICYgMHhGRiwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRCREwpOworCXdyaXRlYihjcjMsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1IzKTsKIAl3cml0ZWIoY3IxLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSMSk7CiAJd3JpdGViKG1vZGVtLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVE1PREVNKTsKIAogCS8qIHJlc3RvcmUgY29udHJvbCByZWdpc3RlciAqLwogCXdyaXRlYihvbGRfY3IyLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSMik7CiAKKwkvKgorCSAqIElmIG5ldyBiYXVkIHJhdGUgaXMgc2V0LCB3ZSB3aWxsIGFsc28gbmVlZCB0byB1cGRhdGUgdGhlIFJpbmcgYnVmZmVyCisJICogbGVuZ3RoIGFjY29yZGluZyB0byB0aGUgc2VsZWN0ZWQgYmF1ZCByYXRlIGFuZCByZXN0YXJ0IFJ4IERNQSBwYXRoLgorCSAqLworCWlmIChvbGQpIHsKKwkJaWYgKHNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSkgeworCQkJZGVsX3RpbWVyX3N5bmMoJnNwb3J0LT5scHVhcnRfdGltZXIpOworCQkJbHB1YXJ0X2RtYV9yeF9mcmVlKCZzcG9ydC0+cG9ydCk7CisJCX0KKworCQlpZiAoc3BvcnQtPmRtYV9yeF9jaGFuICYmICFscHVhcnRfc3RhcnRfcnhfZG1hKHNwb3J0KSkgeworCQkJc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlID0gdHJ1ZTsKKwkJCXJ4X2RtYV90aW1lcl9pbml0KHNwb3J0KTsKKwkJfSBlbHNlIHsKKwkJCXNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSA9IGZhbHNlOworCQl9CisJfQorCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwogfQogCkBAIC0xNDk0LDcgKzE1NzksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgbHB1YXJ0X3BvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIGxwdWFydF9wb3BzID0gewogCS50eF9lbXB0eQk9IGxwdWFydF90eF9lbXB0eSwKIAkuc2V0X21jdHJsCT0gbHB1YXJ0X3NldF9tY3RybCwKIAkuZ2V0X21jdHJsCT0gbHB1YXJ0X2dldF9tY3RybCwKQEAgLTE1MTMsNyArMTU5OCw3IEBACiAJLmZsdXNoX2J1ZmZlcgk9IGxwdWFydF9mbHVzaF9idWZmZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIGxwdWFydDMyX3BvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIGxwdWFydDMyX3BvcHMgPSB7CiAJLnR4X2VtcHR5CT0gbHB1YXJ0MzJfdHhfZW1wdHksCiAJLnNldF9tY3RybAk9IGxwdWFydDMyX3NldF9tY3RybCwKIAkuZ2V0X21jdHJsCT0gbHB1YXJ0MzJfZ2V0X21jdHJsLApAQCAtMTg0Myw2ICsxOTI4LDggQEAKIAkJc3BvcnQtPnBvcnQub3BzID0gJmxwdWFydF9wb3BzOwogCXNwb3J0LT5wb3J0LmZsYWdzID0gVVBGX0JPT1RfQVVUT0NPTkY7CiAKKwlzcG9ydC0+cG9ydC5yczQ4NV9jb25maWcgPSBscHVhcnRfY29uZmlnX3JzNDg1OworCiAJc3BvcnQtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiaXBnIik7CiAJaWYgKElTX0VSUihzcG9ydC0+Y2xrKSkgewogCQlyZXQgPSBQVFJfRVJSKHNwb3J0LT5jbGspOwpAQCAtMTg4Myw2ICsxOTcwLDEyIEBACiAJCWRldl9pbmZvKHNwb3J0LT5wb3J0LmRldiwgIkRNQSByeCBjaGFubmVsIHJlcXVlc3QgZmFpbGVkLCAiCiAJCQkJIm9wZXJhdGluZyB3aXRob3V0IHJ4IERNQVxuIik7CiAKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAibGludXgscnM0ODUtZW5hYmxlZC1hdC1ib290LXRpbWUiKSkgeworCQlzcG9ydC0+cG9ydC5yczQ4NS5mbGFncyB8PSBTRVJfUlM0ODVfRU5BQkxFRDsKKwkJc3BvcnQtPnBvcnQucnM0ODUuZmxhZ3MgfD0gU0VSX1JTNDg1X1JUU19PTl9TRU5EOworCQl3cml0ZWIoVUFSVE1PREVNX1RYUlRTRSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRNT0RFTSk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5MjMsNiArMjAxNiwzMiBAQAogCiAJdWFydF9zdXNwZW5kX3BvcnQoJmxwdWFydF9yZWcsICZzcG9ydC0+cG9ydCk7CiAKKwlpZiAoc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlKSB7CisJCS8qCisJCSAqIEVETUEgZHJpdmVyIGR1cmluZyBzdXNwZW5kIHdpbGwgZm9yY2VmdWxseSByZWxlYXNlIGFueQorCQkgKiBub24taWRsZSBETUEgY2hhbm5lbHMuIElmIHBvcnQgd2FrZXVwIGlzIGVuYWJsZWQgb3IgaWYgcG9ydAorCQkgKiBpcyBjb25zb2xlIHBvcnQgb3IgJ25vX2NvbnNvbGVfc3VzcGVuZCcgaXMgc2V0IHRoZSBSeCBETUEKKwkJICogY2Fubm90IHJlc3VtZSBhcyBhcyBleHBlY3RlZCwgaGVuY2UgZ3JhY2VmdWxseSByZWxlYXNlIHRoZQorCQkgKiBSeCBETUEgcGF0aCBiZWZvcmUgc3VzcGVuZCBhbmQgc3RhcnQgUnggRE1BIHBhdGggb24gcmVzdW1lLgorCQkgKi8KKwkJaWYgKHNwb3J0LT5wb3J0LmlycV93YWtlKSB7CisJCQlkZWxfdGltZXJfc3luYygmc3BvcnQtPmxwdWFydF90aW1lcik7CisJCQlscHVhcnRfZG1hX3J4X2ZyZWUoJnNwb3J0LT5wb3J0KTsKKwkJfQorCisJCS8qIERpc2FibGUgUnggRE1BIHRvIHVzZSBVQVJUIHBvcnQgYXMgd2FrZXVwIHNvdXJjZSAqLworCQl3cml0ZWIocmVhZGIoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVBUlRDUjUpICYgflVBUlRDUjVfUkRNQVMsCisJCQkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKKwl9CisKKwlpZiAoc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlKSB7CisJCXNwb3J0LT5kbWFfdHhfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc3BvcnQtPmRtYV90eF9jaGFuKTsKKwl9CisKKwlpZiAoc3BvcnQtPnBvcnQuc3VzcGVuZGVkICYmICFzcG9ydC0+cG9ydC5pcnFfd2FrZSkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNwb3J0LT5jbGspOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5MzEsNiArMjA1MCw5IEBACiAJc3RydWN0IGxwdWFydF9wb3J0ICpzcG9ydCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAorCWlmIChzcG9ydC0+cG9ydC5zdXNwZW5kZWQgJiYgIXNwb3J0LT5wb3J0LmlycV93YWtlKQorCQljbGtfcHJlcGFyZV9lbmFibGUoc3BvcnQtPmNsayk7CisKIAlpZiAoc3BvcnQtPmxwdWFydDMyKSB7CiAJCWxwdWFydDMyX3NldHVwX3dhdGVybWFyayhzcG9ydCk7CiAJCXRlbXAgPSBscHVhcnQzMl9yZWFkKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1RSTCk7CkBAIC0xOTQ0LDYgKzIwNjYsMjYgQEAKIAkJd3JpdGViKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1IyKTsKIAl9CiAKKwlpZiAoc3BvcnQtPmxwdWFydF9kbWFfcnhfdXNlKSB7CisJCWlmIChzcG9ydC0+cG9ydC5pcnFfd2FrZSkgeworCQkJaWYgKCFscHVhcnRfc3RhcnRfcnhfZG1hKHNwb3J0KSkgeworCQkJCXNwb3J0LT5scHVhcnRfZG1hX3J4X3VzZSA9IHRydWU7CisJCQkJcnhfZG1hX3RpbWVyX2luaXQoc3BvcnQpOworCQkJfSBlbHNlIHsKKwkJCQlzcG9ydC0+bHB1YXJ0X2RtYV9yeF91c2UgPSBmYWxzZTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChzcG9ydC0+ZG1hX3R4X2NoYW4gJiYgIWxwdWFydF9kbWFfdHhfcmVxdWVzdCgmc3BvcnQtPnBvcnQpKSB7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzcG9ydC0+ZG1hX3dhaXQpOworCQkJc3BvcnQtPmxwdWFydF9kbWFfdHhfdXNlID0gdHJ1ZTsKKwkJCXdyaXRlYihyZWFkYihzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENSNSkgfAorCQkJCVVBUlRDUjVfVERNQVMsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUQ1I1KTsKKwl9IGVsc2UgeworCQlzcG9ydC0+bHB1YXJ0X2RtYV90eF91c2UgPSBmYWxzZTsKKwl9CisKIAl1YXJ0X3Jlc3VtZV9wb3J0KCZscHVhcnRfcmVnLCAmc3BvcnQtPnBvcnQpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMKaW5kZXggMGRmMmIxYy4uYTcwMzU2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYwpAQCAtMTkwLDYgKzE5MCw3IEBACiBlbnVtIGlteF91YXJ0X3R5cGUgewogCUlNWDFfVUFSVCwKIAlJTVgyMV9VQVJULAorCUlNWDUzX1VBUlQsCiAJSU1YNlFfVUFSVCwKIH07CiAKQEAgLTIyMiw2ICsyMjMsOSBAQAogCXN0cnVjdCBkbWFfY2hhbgkJKmRtYV9jaGFuX3J4LCAqZG1hX2NoYW5fdHg7CiAJc3RydWN0IHNjYXR0ZXJsaXN0CXJ4X3NnbCwgdHhfc2dsWzJdOwogCXZvaWQJCQkqcnhfYnVmOworCXN0cnVjdCBjaXJjX2J1ZgkJcnhfcmluZzsKKwl1bnNpZ25lZCBpbnQJCXJ4X3BlcmlvZHM7CisJZG1hX2Nvb2tpZV90CQlyeF9jb29raWU7CiAJdW5zaWduZWQgaW50CQl0eF9ieXRlczsKIAl1bnNpZ25lZCBpbnQJCWRtYV90eF9uZW50czsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlkbWFfd2FpdDsKQEAgLTI0NCw2ICsyNDgsMTAgQEAKIAkJLnV0c19yZWcgPSBJTVgyMV9VVFMsCiAJCS5kZXZ0eXBlID0gSU1YMjFfVUFSVCwKIAl9LAorCVtJTVg1M19VQVJUXSA9IHsKKwkJLnV0c19yZWcgPSBJTVgyMV9VVFMsCisJCS5kZXZ0eXBlID0gSU1YNTNfVUFSVCwKKwl9LAogCVtJTVg2UV9VQVJUXSA9IHsKIAkJLnV0c19yZWcgPSBJTVgyMV9VVFMsCiAJCS5kZXZ0eXBlID0gSU1YNlFfVUFSVCwKQEAgLTI1OCw2ICsyNjYsOSBAQAogCQkubmFtZSA9ICJpbXgyMS11YXJ0IiwKIAkJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KSAmaW14X3VhcnRfZGV2ZGF0YVtJTVgyMV9VQVJUXSwKIAl9LCB7CisJCS5uYW1lID0gImlteDUzLXVhcnQiLAorCQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpICZpbXhfdWFydF9kZXZkYXRhW0lNWDUzX1VBUlRdLAorCX0sIHsKIAkJLm5hbWUgPSAiaW14NnEtdWFydCIsCiAJCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkgJmlteF91YXJ0X2RldmRhdGFbSU1YNlFfVUFSVF0sCiAJfSwgewpAQCAtMjY4LDYgKzI3OSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteF91YXJ0X2R0X2lkc1tdID0gewogCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDZxLXVhcnQiLCAuZGF0YSA9ICZpbXhfdWFydF9kZXZkYXRhW0lNWDZRX1VBUlRdLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDUzLXVhcnQiLCAuZGF0YSA9ICZpbXhfdWFydF9kZXZkYXRhW0lNWDUzX1VBUlRdLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDEtdWFydCIsIC5kYXRhID0gJmlteF91YXJ0X2RldmRhdGFbSU1YMV9VQVJUXSwgfSwKIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyMS11YXJ0IiwgLmRhdGEgPSAmaW14X3VhcnRfZGV2ZGF0YVtJTVgyMV9VQVJUXSwgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KQEAgLTI4OSw2ICszMDEsMTEgQEAKIAlyZXR1cm4gc3BvcnQtPmRldmRhdGEtPmRldnR5cGUgPT0gSU1YMjFfVUFSVDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXNfaW14NTNfdWFydChzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0KQoreworCXJldHVybiBzcG9ydC0+ZGV2ZGF0YS0+ZGV2dHlwZSA9PSBJTVg1M19VQVJUOworfQorCiBzdGF0aWMgaW5saW5lIGludCBpc19pbXg2cV91YXJ0KHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQpCiB7CiAJcmV0dXJuIHNwb3J0LT5kZXZkYXRhLT5kZXZ0eXBlID09IElNWDZRX1VBUlQ7CkBAIC03MDEsNiArNzE4LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyB2b2lkIGNsZWFyX3J4X2Vycm9ycyhzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0KTsKIHN0YXRpYyBpbnQgc3RhcnRfcnhfZG1hKHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQpOwogLyoKICAqIElmIHRoZSBSWEZJRk8gaXMgZmlsbGVkIHdpdGggc29tZSBkYXRhLCBhbmQgdGhlbiB3ZQpAQCAtNzI2LDYgKzc0NCwxMSBAQAogCQl0ZW1wICY9IH4oVUNSMl9BVEVOKTsKIAkJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IyKTsKIAorCQkvKiBkaXNhYmxlIHRoZSByeCBlcnJvcnMgaW50ZXJydXB0cyAqLworCQl0ZW1wID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjQpOworCQl0ZW1wICY9IH5VQ1I0X09SRU47CisJCXdyaXRlbCh0ZW1wLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSNCk7CisKIAkJLyogdGVsbCB0aGUgRE1BIHRvIHJlY2VpdmUgdGhlIGRhdGEuICovCiAJCXN0YXJ0X3J4X2RtYShzcG9ydCk7CiAJfQpAQCAtNzQwLDEyICs3NjMsMTMgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdG1wID0gVElPQ01fRFNSOwogCXVuc2lnbmVkIHVzcjEgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVNSMSk7CisJdW5zaWduZWQgdXNyMiA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVU1IyKTsKIAogCWlmICh1c3IxICYgVVNSMV9SVFNTKQogCQl0bXAgfD0gVElPQ01fQ1RTOwogCiAJLyogaW4gRENFIG1vZGUgRENESU4gaXMgYWx3YXlzIDAgKi8KLQlpZiAoISh1c3IxICYgVVNSMl9EQ0RJTikpCisJaWYgKCEodXNyMiAmIFVTUjJfRENESU4pKQogCQl0bXAgfD0gVElPQ01fQ0FSOwogCiAJaWYgKHNwb3J0LT5kdGVfbW9kZSkKQEAgLTkzMiwzMCArOTU2LDYgQEAKIH0KIAogI2RlZmluZSBSWF9CVUZfU0laRQkoUEFHRV9TSVpFKQotc3RhdGljIHZvaWQgaW14X3J4X2RtYV9kb25lKHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQpCi17Ci0JdW5zaWduZWQgbG9uZyB0ZW1wOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0JLyogcmUtZW5hYmxlIGludGVycnVwdHMgdG8gZ2V0IG5vdGlmaWVkIHdoZW4gbmV3IHN5bWJvbHMgYXJlIGluY29taW5nICovCi0JdGVtcCA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKLQl0ZW1wIHw9IFVDUjFfUlJEWUVOOwotCXdyaXRlbCh0ZW1wLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMSk7Ci0KLQl0ZW1wID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjIpOwotCXRlbXAgfD0gVUNSMl9BVEVOOwotCXdyaXRlbCh0ZW1wLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMik7Ci0KLQlzcG9ydC0+ZG1hX2lzX3J4aW5nID0gMDsKLQotCS8qIElzIHRoZSBzaHV0ZG93biB3YWl0aW5nIGZvciB1cz8gKi8KLQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmc3BvcnQtPmRtYV93YWl0KSkKLQkJd2FrZV91cCgmc3BvcnQtPmRtYV93YWl0KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKLX0KIAogLyoKICAqIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgUlggRE1BIGludGVycnVwdHMoc3VjaCBhcyBpbiB0aGUgTVg2USk6CkBAIC05NzIsNDMgKzk3Miw3NiBAQAogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsID0gJnNwb3J0LT5yeF9zZ2w7CiAJc3RydWN0IHR0eV9wb3J0ICpwb3J0ID0gJnNwb3J0LT5wb3J0LnN0YXRlLT5wb3J0OwogCXN0cnVjdCBkbWFfdHhfc3RhdGUgc3RhdGU7CisJc3RydWN0IGNpcmNfYnVmICpyeF9yaW5nID0gJnNwb3J0LT5yeF9yaW5nOwogCWVudW0gZG1hX3N0YXR1cyBzdGF0dXM7Ci0JdW5zaWduZWQgaW50IGNvdW50OwotCi0JLyogdW5tYXAgaXQgZmlyc3QgKi8KLQlkbWFfdW5tYXBfc2coc3BvcnQtPnBvcnQuZGV2LCBzZ2wsIDEsIERNQV9GUk9NX0RFVklDRSk7CisJdW5zaWduZWQgaW50IHdfYnl0ZXMgPSAwOworCXVuc2lnbmVkIGludCByX2J5dGVzOworCXVuc2lnbmVkIGludCBiZF9zaXplOwogCiAJc3RhdHVzID0gZG1hZW5naW5lX3R4X3N0YXR1cyhjaGFuLCAoZG1hX2Nvb2tpZV90KTAsICZzdGF0ZSk7Ci0JY291bnQgPSBSWF9CVUZfU0laRSAtIHN0YXRlLnJlc2lkdWU7CiAKLQlkZXZfZGJnKHNwb3J0LT5wb3J0LmRldiwgIldlIGdldCAlZCBieXRlcy5cbiIsIGNvdW50KTsKLQotCWlmIChjb3VudCkgewotCQlpZiAoIShzcG9ydC0+cG9ydC5pZ25vcmVfc3RhdHVzX21hc2sgJiBVUlhEX0RVTU1ZX1JFQUQpKSB7Ci0JCQlpbnQgYnl0ZXMgPSB0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHBvcnQsIHNwb3J0LT5yeF9idWYsCi0JCQkJCWNvdW50KTsKLQotCQkJaWYgKGJ5dGVzICE9IGNvdW50KQotCQkJCXNwb3J0LT5wb3J0Lmljb3VudC5idWZfb3ZlcnJ1bisrOwotCQl9Ci0JCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHBvcnQpOwotCQlzcG9ydC0+cG9ydC5pY291bnQucnggKz0gY291bnQ7CisJaWYgKHN0YXR1cyA9PSBETUFfRVJST1IpIHsKKwkJZGV2X2VycihzcG9ydC0+cG9ydC5kZXYsICJETUEgdHJhbnNhY3Rpb24gZXJyb3IuXG4iKTsKKwkJY2xlYXJfcnhfZXJyb3JzKHNwb3J0KTsKKwkJcmV0dXJuOwogCX0KIAotCS8qCi0JICogUmVzdGFydCBSWCBETUEgZGlyZWN0bHkgaWYgbW9yZSBkYXRhIGlzIGF2YWlsYWJsZSBpbiBvcmRlciB0byBza2lwCi0JICogdGhlIHJvdW5kdHJpcCB0aHJvdWdoIHRoZSBJUlEgaGFuZGxlci4gSWYgdGhlcmUgaXMgc29tZSBkYXRhIGFscmVhZHkKLQkgKiBpbiB0aGUgRklGTywgRE1BIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBzb29uIGFueXdheXMuCi0JICoKLQkgKiBPdGhlcndpc2Ugc3RvcCB0aGUgRE1BIGFuZCByZWFjdGl2YXRlIEZJRk8gSVJRcyB0byByZXN0YXJ0IERNQSBvbmNlCi0JICogZGF0YSBzdGFydHMgdG8gYXJyaXZlIGFnYWluLgotCSAqLwotCWlmIChyZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVNSMikgJiBVU1IyX1JEUikKLQkJc3RhcnRfcnhfZG1hKHNwb3J0KTsKLQllbHNlCi0JCWlteF9yeF9kbWFfZG9uZShzcG9ydCk7CisJaWYgKCEoc3BvcnQtPnBvcnQuaWdub3JlX3N0YXR1c19tYXNrICYgVVJYRF9EVU1NWV9SRUFEKSkgeworCisJCS8qCisJCSAqIFRoZSBzdGF0ZS1yZXNpZHVlIHZhcmlhYmxlIHJlcHJlc2VudHMgdGhlIGVtcHR5IHNwYWNlCisJCSAqIHJlbGF0aXZlIHRvIHRoZSBlbnRpcmUgYnVmZmVyLiBUYWtpbmcgdGhpcyBpbiBjb25zaWRlcmF0aW9uCisJCSAqIHRoZSBoZWFkIGlzIGFsd2F5cyBjYWxjdWxhdGVkIGJhc2Ugb24gdGhlIGJ1ZmZlciB0b3RhbAorCQkgKiBsZW5ndGggLSBETUEgdHJhbnNhY3Rpb24gcmVzaWR1ZS4gVGhlIFVBUlQgc2NyaXB0IGZyb20gdGhlCisJCSAqIFNETUEgZmlybXdhcmUgd2lsbCBqdW1wIHRvIHRoZSBuZXh0IGJ1ZmZlciBkZXNjcmlwdG9yLAorCQkgKiBvbmNlIGEgRE1BIHRyYW5zYWN0aW9uIGlmIGZpbmFsaXplZCAoSU1YNTMgUk0gLSBBLjQuMS4yLjQpLgorCQkgKiBUYWtpbmcgdGhpcyBpbiBjb25zaWRlcmF0aW9uIHRoZSB0YWlsIGlzIGFsd2F5cyBhdCB0aGUKKwkJICogYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgZGVzY3JpcHRvciB0aGF0IGNvbnRhaW5zIHRoZSBoZWFkLgorCQkgKi8KKworCQkvKiBDYWxjdWxhdGUgdGhlIGhlYWQgKi8KKwkJcnhfcmluZy0+aGVhZCA9IHNnX2RtYV9sZW4oc2dsKSAtIHN0YXRlLnJlc2lkdWU7CisKKwkJLyogQ2FsY3VsYXRlIHRoZSB0YWlsLiAqLworCQliZF9zaXplID0gc2dfZG1hX2xlbihzZ2wpIC8gc3BvcnQtPnJ4X3BlcmlvZHM7CisJCXJ4X3JpbmctPnRhaWwgPSAoKHJ4X3JpbmctPmhlYWQtMSkgLyBiZF9zaXplKSAqIGJkX3NpemU7CisKKwkJaWYgKHJ4X3JpbmctPmhlYWQgPD0gc2dfZG1hX2xlbihzZ2wpICYmCisJCSAgICByeF9yaW5nLT5oZWFkID4gcnhfcmluZy0+dGFpbCkgeworCisJCQkvKiBNb3ZlIGRhdGEgZnJvbSB0YWlsIHRvIGhlYWQgKi8KKwkJCXJfYnl0ZXMgPSByeF9yaW5nLT5oZWFkIC0gcnhfcmluZy0+dGFpbDsKKworCQkJLyogQ1BVIGNsYWltcyBvd25lcnNoaXAgb2YgUlggRE1BIGJ1ZmZlciAqLworCQkJZG1hX3N5bmNfc2dfZm9yX2NwdShzcG9ydC0+cG9ydC5kZXYsIHNnbCwgMSwKKwkJCQlETUFfRlJPTV9ERVZJQ0UpOworCisJCQl3X2J5dGVzID0gdHR5X2luc2VydF9mbGlwX3N0cmluZyhwb3J0LAorCQkJCXNwb3J0LT5yeF9idWYgKyByeF9yaW5nLT50YWlsLCByX2J5dGVzKTsKKworCQkJLyogVUFSVCByZXRyaWV2ZXMgb3duZXJzaGlwIG9mIFJYIERNQSBidWZmZXIgKi8KKwkJCWRtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3BvcnQtPnBvcnQuZGV2LCBzZ2wsIDEsCisJCQkJRE1BX0ZST01fREVWSUNFKTsKKworCQkJaWYgKHdfYnl0ZXMgIT0gcl9ieXRlcykKKwkJCQlzcG9ydC0+cG9ydC5pY291bnQuYnVmX292ZXJydW4rKzsKKworCQkJc3BvcnQtPnBvcnQuaWNvdW50LnJ4ICs9IHdfYnl0ZXM7CisJCX0gZWxzZQl7CisJCQlXQVJOX09OKHJ4X3JpbmctPmhlYWQgPiBzZ19kbWFfbGVuKHNnbCkpOworCQkJV0FSTl9PTihyeF9yaW5nLT5oZWFkIDw9IHJ4X3JpbmctPnRhaWwpOworCQl9CisJfQorCisJaWYgKHdfYnl0ZXMpIHsKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2gocG9ydCk7CisJCWRldl9kYmcoc3BvcnQtPnBvcnQuZGV2LCAiV2UgZ2V0ICVkIGJ5dGVzLlxuIiwgd19ieXRlcyk7CisJfQogfQogCisvKiBSWCBETUEgYnVmZmVyIHBlcmlvZHMgKi8KKyNkZWZpbmUgUlhfRE1BX1BFUklPRFMgNAorCiBzdGF0aWMgaW50IHN0YXJ0X3J4X2RtYShzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0KQogewogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsID0gJnNwb3J0LT5yeF9zZ2w7CkBAIC0xMDE3LDE0ICsxMDUwLDIxIEBACiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOwogCWludCByZXQ7CiAKKwlzcG9ydC0+cnhfcmluZy5oZWFkID0gMDsKKwlzcG9ydC0+cnhfcmluZy50YWlsID0gMDsKKwlzcG9ydC0+cnhfcGVyaW9kcyA9IFJYX0RNQV9QRVJJT0RTOworCiAJc2dfaW5pdF9vbmUoc2dsLCBzcG9ydC0+cnhfYnVmLCBSWF9CVUZfU0laRSk7CiAJcmV0ID0gZG1hX21hcF9zZyhkZXYsIHNnbCwgMSwgRE1BX0ZST01fREVWSUNFKTsKIAlpZiAocmV0ID09IDApIHsKIAkJZGV2X2VycihkZXYsICJETUEgbWFwcGluZyBlcnJvciBmb3IgUlguXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWRlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zZyhjaGFuLCBzZ2wsIDEsIERNQV9ERVZfVE9fTUVNLAotCQkJCQlETUFfUFJFUF9JTlRFUlJVUFQpOworCisJZGVzYyA9IGRtYWVuZ2luZV9wcmVwX2RtYV9jeWNsaWMoY2hhbiwgc2dfZG1hX2FkZHJlc3Moc2dsKSwKKwkJc2dfZG1hX2xlbihzZ2wpLCBzZ19kbWFfbGVuKHNnbCkgLyBzcG9ydC0+cnhfcGVyaW9kcywKKwkJRE1BX0RFVl9UT19NRU0sIERNQV9QUkVQX0lOVEVSUlVQVCk7CisKIAlpZiAoIWRlc2MpIHsKIAkJZG1hX3VubWFwX3NnKGRldiwgc2dsLCAxLCBETUFfRlJPTV9ERVZJQ0UpOwogCQlkZXZfZXJyKGRldiwgIldlIGNhbm5vdCBwcmVwYXJlIGZvciB0aGUgUlggc2xhdmUgZG1hIVxuIik7CkBAIC0xMDM0LDExICsxMDc0LDM2IEBACiAJZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBzcG9ydDsKIAogCWRldl9kYmcoZGV2LCAiUlg6IHByZXBhcmUgZm9yIHRoZSBETUEuXG4iKTsKLQlkbWFlbmdpbmVfc3VibWl0KGRlc2MpOworCXNwb3J0LT5yeF9jb29raWUgPSBkbWFlbmdpbmVfc3VibWl0KGRlc2MpOwogCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKGNoYW4pOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBjbGVhcl9yeF9lcnJvcnMoc3RydWN0IGlteF9wb3J0ICpzcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgc3RhdHVzX3VzcjEsIHN0YXR1c191c3IyOworCisJc3RhdHVzX3VzcjEgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVNSMSk7CisJc3RhdHVzX3VzcjIgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVNSMik7CisKKwlpZiAoc3RhdHVzX3VzcjIgJiBVU1IyX0JSQ0QpIHsKKwkJc3BvcnQtPnBvcnQuaWNvdW50LmJyaysrOworCQl3cml0ZWwoVVNSMl9CUkNELCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVNSMik7CisJfSBlbHNlIGlmIChzdGF0dXNfdXNyMSAmIFVTUjFfRlJBTUVSUikgeworCQlzcG9ydC0+cG9ydC5pY291bnQuZnJhbWUrKzsKKwkJd3JpdGVsKFVTUjFfRlJBTUVSUiwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjEpOworCX0gZWxzZSBpZiAoc3RhdHVzX3VzcjEgJiBVU1IxX1BBUklUWUVSUikgeworCQlzcG9ydC0+cG9ydC5pY291bnQucGFyaXR5Kys7CisJCXdyaXRlbChVU1IxX1BBUklUWUVSUiwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjEpOworCX0KKworCWlmIChzdGF0dXNfdXNyMiAmIFVTUjJfT1JFKSB7CisJCXNwb3J0LT5wb3J0Lmljb3VudC5vdmVycnVuKys7CisJCXdyaXRlbChVU1IyX09SRSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjIpOworCX0KKworfQorCiAjZGVmaW5lIFRYVExfREVGQVVMVCAyIC8qIHJlc2V0IGRlZmF1bHQgKi8KICNkZWZpbmUgUlhUTF9ERUZBVUxUIDEgLyogcmVzZXQgZGVmYXVsdCAqLwogI2RlZmluZSBUWFRMX0RNQSA4IC8qIERNQSBidXJzdCBzZXR0aW5nICovCkBAIC0xMDU4LDE0ICsxMTIzLDE2IEBACiBzdGF0aWMgdm9pZCBpbXhfdWFydF9kbWFfZXhpdChzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0KQogewogCWlmIChzcG9ydC0+ZG1hX2NoYW5fcngpIHsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9zeW5jKHNwb3J0LT5kbWFfY2hhbl9yeCk7CiAJCWRtYV9yZWxlYXNlX2NoYW5uZWwoc3BvcnQtPmRtYV9jaGFuX3J4KTsKIAkJc3BvcnQtPmRtYV9jaGFuX3J4ID0gTlVMTDsKLQorCQlzcG9ydC0+cnhfY29va2llID0gLUVJTlZBTDsKIAkJa2ZyZWUoc3BvcnQtPnJ4X2J1Zik7CiAJCXNwb3J0LT5yeF9idWYgPSBOVUxMOwogCX0KIAogCWlmIChzcG9ydC0+ZG1hX2NoYW5fdHgpIHsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9zeW5jKHNwb3J0LT5kbWFfY2hhbl90eCk7CiAJCWRtYV9yZWxlYXNlX2NoYW5uZWwoc3BvcnQtPmRtYV9jaGFuX3R4KTsKIAkJc3BvcnQtPmRtYV9jaGFuX3R4ID0gTlVMTDsKIAl9CkBAIC0xMTAzLDYgKzExNzAsNyBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycjsKIAl9CisJc3BvcnQtPnJ4X3JpbmcuYnVmID0gc3BvcnQtPnJ4X2J1ZjsKIAogCS8qIFByZXBhcmUgZm9yIFRYIDogKi8KIAlzcG9ydC0+ZG1hX2NoYW5fdHggPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKGRldiwgInR4Iik7CkBAIC0xMjAxLDggKzEyNjksNyBAQAogCXdyaXRlbCh0ZW1wICYgflVDUjRfRFJFTiwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjQpOwogCiAJLyogQ2FuIHdlIGVuYWJsZSB0aGUgRE1BIHN1cHBvcnQ/ICovCi0JaWYgKGlzX2lteDZxX3VhcnQoc3BvcnQpICYmICF1YXJ0X2NvbnNvbGUocG9ydCkgJiYKLQkgICAgIXNwb3J0LT5kbWFfaXNfaW5pdGVkKQorCWlmICghdWFydF9jb25zb2xlKHBvcnQpICYmICFzcG9ydC0+ZG1hX2lzX2luaXRlZCkKIAkJaW14X3VhcnRfZG1hX2luaXQoc3BvcnQpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNwb3J0LT5wb3J0LmxvY2ssIGZsYWdzKTsKQEAgLTEyODMsMTcgKzEzNTAsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHNwb3J0LT5kbWFfaXNfZW5hYmxlZCkgewotCQlpbnQgcmV0OworCQlzcG9ydC0+ZG1hX2lzX3J4aW5nID0gMDsKKwkJc3BvcnQtPmRtYV9pc190eGluZyA9IDA7CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfc3luYyhzcG9ydC0+ZG1hX2NoYW5fdHgpOworCQlkbWFlbmdpbmVfdGVybWluYXRlX3N5bmMoc3BvcnQtPmRtYV9jaGFuX3J4KTsKIAotCQkvKiBXZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBETUEgdG8gZmluaXNoLiAqLwotCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc3BvcnQtPmRtYV93YWl0LAotCQkJIXNwb3J0LT5kbWFfaXNfcnhpbmcgJiYgIXNwb3J0LT5kbWFfaXNfdHhpbmcpOwotCQlpZiAocmV0ICE9IDApIHsKLQkJCXNwb3J0LT5kbWFfaXNfcnhpbmcgPSAwOwotCQkJc3BvcnQtPmRtYV9pc190eGluZyA9IDA7Ci0JCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChzcG9ydC0+ZG1hX2NoYW5fdHgpOwotCQkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc3BvcnQtPmRtYV9jaGFuX3J4KTsKLQkJfQogCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BvcnQtPnBvcnQubG9jaywgZmxhZ3MpOwogCQlpbXhfc3RvcF90eChwb3J0KTsKIAkJaW14X3N0b3BfcngocG9ydCk7CkBAIC0xNjkwLDcgKzE3NTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIGlteF9wb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBpbXhfcG9wcyA9IHsKIAkudHhfZW1wdHkJPSBpbXhfdHhfZW1wdHksCiAJLnNldF9tY3RybAk9IGlteF9zZXRfbWN0cmwsCiAJLmdldF9tY3RybAk9IGlteF9nZXRfbWN0cmwsCkBAIC0yMDc3LDggKzIxMzgsMTAgQEAKIAogCS8qIEZvciByZWdpc3RlciBhY2Nlc3MsIHdlIG9ubHkgbmVlZCB0byBlbmFibGUgdGhlIGlwZyBjbG9jay4gKi8KIAlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc3BvcnQtPmNsa19pcGcpOwotCWlmIChyZXQpCisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIHBlciBjbGs6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OworCX0KIAogCS8qIERpc2FibGUgaW50ZXJydXB0cyBiZWZvcmUgcmVxdWVzdGluZyB0aGVtICovCiAJcmVnID0gcmVhZGxfcmVsYXhlZChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMSk7CkBAIC0yMDk1LDE4ICsyMTU4LDI2IEBACiAJaWYgKHR4aXJxID4gMCkgewogCQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHJ4aXJxLCBpbXhfcnhpbnQsIDAsCiAJCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBzcG9ydCk7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IHJ4IGlycTogJWRcbiIsCisJCQkJcmV0KTsKIAkJCXJldHVybiByZXQ7CisJCX0KIAogCQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHR4aXJxLCBpbXhfdHhpbnQsIDAsCiAJCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBzcG9ydCk7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IHR4IGlycTogJWRcbiIsCisJCQkJcmV0KTsKIAkJCXJldHVybiByZXQ7CisJCX0KIAl9IGVsc2UgewogCQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHJ4aXJxLCBpbXhfaW50LCAwLAogCQkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgc3BvcnQpOwotCQlpZiAocmV0KQorCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBpcnE6ICVkXG4iLCByZXQpOwogCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAogCWlteF9wb3J0c1tzcG9ydC0+cG9ydC5saW5lXSA9IHNwb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2pzbS9qc21fdHR5LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV90dHkuYwppbmRleCBjNWRkZmU1Li5lYzdkODM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV90dHkuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvanNtL2pzbV90dHkuYwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJcG9ydC0+dHlwZSA9IFBPUlRfSlNNOwogfQogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIGpzbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIGpzbV9vcHMgPSB7CiAJLnR4X2VtcHR5CT0ganNtX3R0eV90eF9lbXB0eSwKIAkuc2V0X21jdHJsCT0ganNtX3R0eV9zZXRfbWN0cmwsCiAJLmdldF9tY3RybAk9IGpzbV90dHlfZ2V0X21jdHJsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMDAuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTAwLmMKaW5kZXggNWM0YzI4MC4uYWNlODI2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMDAuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEwMC5jCkBAIC03MTIsNyArNzEyLDcgQEAKIAlkZXZfZGJnKCZzLT5zcGktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgbWF4MzEwMF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIG1heDMxMDBfb3BzID0gewogCS50eF9lbXB0eQk9IG1heDMxMDBfdHhfZW1wdHksCiAJLnNldF9tY3RybAk9IG1heDMxMDBfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwJPSBtYXgzMTAwX2dldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTB4LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvbWF4MzEweC5jCmluZGV4IDkzNjA4MDEuLjhhM2U5MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9tYXgzMTB4LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL21heDMxMHguYwpAQCAtMTMyOSw5ICsxMzI5LDkgQEAKIAkJY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgKmlkX2VudHJ5ID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKTsKIAogCQlkZXZ0eXBlID0gKHN0cnVjdCBtYXgzMTB4X2RldnR5cGUgKilpZF9lbnRyeS0+ZHJpdmVyX2RhdGE7Ci0JCWZsYWdzID0gSVJRRl9UUklHR0VSX0ZBTExJTkc7CiAJfQogCisJZmxhZ3MgPSBJUlFGX1RSSUdHRVJfRkFMTElORzsKIAlyZWdjZmcubWF4X3JlZ2lzdGVyID0gZGV2dHlwZS0+bnIgKiAweDIwIC0gMTsKIAlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZyZWdjZmcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWVuX3oxMzVfdWFydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL21lbl96MTM1X3VhcnQuYwppbmRleCBhNDQyOTBlLi5lNzJlYTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvbWVuX3oxMzVfdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9tZW5fejEzNV91YXJ0LmMKQEAgLTc3NSw3ICs3NzUsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIG1lbl96MTM1X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgbWVuX3oxMzVfb3BzID0gewogCS50eF9lbXB0eSA9IG1lbl96MTM1X3R4X2VtcHR5LAogCS5zZXRfbWN0cmwgPSBtZW5fejEzNV9zZXRfbWN0cmwsCiAJLmdldF9tY3RybCA9IG1lbl96MTM1X2dldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9teHMtYXVhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9teHMtYXVhcnQuYwppbmRleCBlYjU0ZTVjLi43NzA0NTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvbXhzLWF1YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL214cy1hdWFydC5jCkBAIC0xMzE3LDcgKzEzMTcsNyBAQAogCQlteHNfY2xyKEFVQVJUX0xJTkVDVFJMX0JSSywgcywgUkVHX0xJTkVDVFJMKTsKIH0KIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBteHNfYXVhcnRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBteHNfYXVhcnRfb3BzID0gewogCS50eF9lbXB0eSAgICAgICA9IG14c19hdWFydF90eF9lbXB0eSwKIAkuc3RhcnRfdHggICAgICAgPSBteHNfYXVhcnRfc3RhcnRfdHgsCiAJLnN0b3BfdHgJPSBteHNfYXVhcnRfc3RvcF90eCwKQEAgLTE1MTAsMTAgKzE1MTAsNyBAQAogCiAJaWYgKCFpc19hc205MjYwX2F1YXJ0KHMpKSB7CiAJCXMtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKLQkJaWYgKElTX0VSUihzLT5jbGspKQotCQkJcmV0dXJuIFBUUl9FUlIocy0+Y2xrKTsKLQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhzLT5jbGspOwogCX0KIAogCXMtPmNsayA9IGRldm1fY2xrX2dldChzLT5kZXYsICJtb2QiKTsKQEAgLTE1MzcsMTYgKzE1MzQsMjAgQEAKIAllcnIgPSBjbGtfc2V0X3JhdGUocy0+Y2xrLCBjbGtfZ2V0X3JhdGUocy0+Y2xrX2FoYikpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycihzLT5kZXYsICJGYWlsZWQgdG8gc2V0IHJhdGUhXG4iKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBkaXNhYmxlX2Nsa19haGI7CiAJfQogCiAJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKHMtPmNsayk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKHMtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgY2xrIVxuIik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZGlzYWJsZV9jbGtfYWhiOwogCX0KIAogCXJldHVybiAwOworCitkaXNhYmxlX2Nsa19haGI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHMtPmNsa19haGIpOworCXJldHVybiBlcnI7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvcGNoX3VhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCmluZGV4IGVhNGZmYzIuLmQzOTE2NTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9wY2hfdWFydC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvbm1pLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgpAQCAtMTYwMyw3ICsxNjA0LDcgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfQ09OU09MRV9QT0xMICovCiAKLXN0YXRpYyBzdHJ1Y3QgdWFydF9vcHMgcGNoX3VhcnRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBwY2hfdWFydF9vcHMgPSB7CiAJLnR4X2VtcHR5ID0gcGNoX3VhcnRfdHhfZW1wdHksCiAJLnNldF9tY3RybCA9IHBjaF91YXJ0X3NldF9tY3RybCwKIAkuZ2V0X21jdHJsID0gcGNoX3VhcnRfZ2V0X21jdHJsLApAQCAtMTgyNiw2ICsxODI3LDEwIEBACiAJcHJpdi0+dHJpZ2dlcl9sZXZlbCA9IDE7CiAJcHJpdi0+ZmNyID0gMDsKIAorCWlmIChwZGV2LT5kZXYub2Zfbm9kZSkKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsICJjbG9jay1mcmVxdWVuY3kiCisJCQkJCSAsICZ1c2VyX3VhcnRjbGspOworCiAjaWZkZWYgQ09ORklHX1NFUklBTF9QQ0hfVUFSVF9DT05TT0xFCiAJcGNoX3VhcnRfcG9ydHNbYm9hcmQtPmxpbmVfbm9dID0gcHJpdjsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmMKaW5kZXggYWUyMDk1YS4uZjQ0NjE1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jCkBAIC0xNTc3LDcgKzE1NzcsNyBAQAogfQogCiAKLSNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKKyNpZmRlZiBDT05GSUdfQVJNX1MzQzI0WFhfQ1BVRlJFUQogCiBzdGF0aWMgaW50IHMzYzI0eHhfc2VyaWFsX2NwdWZyZXFfdHJhbnNpdGlvbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAogCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuaCBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmgKaW5kZXggMmFlNGZjZS4uYTA0YWNlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuaAorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5oCkBAIC0xMDIsNyArMTAyLDcgQEAKIAogCXN0cnVjdCBzM2MyNHh4X3VhcnRfZG1hCQkqZG1hOwogCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRCisjaWZkZWYgQ09ORklHX0FSTV9TM0MyNFhYX0NQVUZSRVEKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJCWZyZXFfdHJhbnNpdGlvbjsKICNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zYzE2aXM3eHguYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYzE2aXM3eHguYwppbmRleCBmMzZlNmRmLi5hOWQ5NGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2MxNmlzN3h4LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3NjMTZpczd4eC5jCkBAIC0xMjA1LDYgKzEyMDUsMTAgQEAKIAl9CiAjZW5kaWYKIAorCS8qIHJlc2V0IGRldmljZSwgcHVyZ2luZyBhbnkgcGVuZGluZyBpcnEgLyBkYXRhICovCisJcmVnbWFwX3dyaXRlKHMtPnJlZ21hcCwgU0MxNklTN1hYX0lPQ09OVFJPTF9SRUcgPDwgU0MxNklTN1hYX1JFR19TSElGVCwKKwkJCVNDMTZJUzdYWF9JT0NPTlRST0xfU1JFU0VUX0JJVCk7CisKIAlmb3IgKGkgPSAwOyBpIDwgZGV2dHlwZS0+bnJfdWFydDsgKytpKSB7CiAJCXMtPnBbaV0ubGluZQkJPSBpOwogCQkvKiBJbml0aWFsaXplIHBvcnQgZGF0YSAqLwpAQCAtMTIzNCw2ICsxMjM4LDIyIEBACiAJCWluaXRfa3RocmVhZF93b3JrKCZzLT5wW2ldLnJlZ193b3JrLCBzYzE2aXM3eHhfcmVnX3Byb2MpOwogCQkvKiBSZWdpc3RlciBwb3J0ICovCiAJCXVhcnRfYWRkX29uZV9wb3J0KCZzYzE2aXM3eHhfdWFydCwgJnMtPnBbaV0ucG9ydCk7CisKKwkJLyogRW5hYmxlIEVGUiAqLworCQlzYzE2aXM3eHhfcG9ydF93cml0ZSgmcy0+cFtpXS5wb3J0LCBTQzE2SVM3WFhfTENSX1JFRywKKwkJCQkgICAgIFNDMTZJUzdYWF9MQ1JfQ09ORl9NT0RFX0IpOworCisJCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhzLT5yZWdtYXAsIHRydWUpOworCisJCS8qIEVuYWJsZSB3cml0ZSBhY2Nlc3MgdG8gZW5oYW5jZWQgZmVhdHVyZXMgKi8KKwkJc2MxNmlzN3h4X3BvcnRfd3JpdGUoJnMtPnBbaV0ucG9ydCwgU0MxNklTN1hYX0VGUl9SRUcsCisJCQkJICAgICBTQzE2SVM3WFhfRUZSX0VOQUJMRV9CSVQpOworCisJCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhzLT5yZWdtYXAsIGZhbHNlKTsKKworCQkvKiBSZXN0b3JlIGFjY2VzcyB0byBnZW5lcmFsIHJlZ2lzdGVycyAqLworCQlzYzE2aXM3eHhfcG9ydF93cml0ZSgmcy0+cFtpXS5wb3J0LCBTQzE2SVM3WFhfTENSX1JFRywgMHgwMCk7CisKIAkJLyogR28gdG8gc3VzcGVuZCBtb2RlICovCiAJCXNjMTZpczd4eF9wb3dlcigmcy0+cFtpXS5wb3J0LCAwKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2VyaWFsX2NvcmUuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zZXJpYWxfY29yZS5jCmluZGV4IDlmYzE1MzMuLjZlNGY2MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zZXJpYWxfY29yZS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zZXJpYWxfY29yZS5jCkBAIC0yMzUsMTggKzIzNSw5IEBACiAJaWYgKHR0eV9wb3J0X2luaXRpYWxpemVkKHBvcnQpKQogCQlyZXR1cm4gMDsKIAotCS8qCi0JICogU2V0IHRoZSBUVFkgSU8gZXJyb3IgbWFya2VyIC0gd2Ugd2lsbCBvbmx5IGNsZWFyIHRoaXMKLQkgKiBvbmNlIHdlIGhhdmUgc3VjY2Vzc2Z1bGx5IG9wZW5lZCB0aGUgcG9ydC4KLQkgKi8KLQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJnR0eS0+ZmxhZ3MpOwotCiAJcmV0dmFsID0gdWFydF9wb3J0X3N0YXJ0dXAodHR5LCBzdGF0ZSwgaW5pdF9odyk7Ci0JaWYgKCFyZXR2YWwpIHsKLQkJdHR5X3BvcnRfc2V0X2luaXRpYWxpemVkKHBvcnQsIDEpOwotCQljbGVhcl9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7Ci0JfSBlbHNlIGlmIChyZXR2YWwgPiAwKQotCQlyZXR2YWwgPSAwOworCWlmIChyZXR2YWwpCisJCXNldF9iaXQoVFRZX0lPX0VSUk9SLCAmdHR5LT5mbGFncyk7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtOTcyLDggKzk2MywxMSBAQAogCQkJfQogCQkJdWFydF9jaGFuZ2Vfc3BlZWQodHR5LCBzdGF0ZSwgTlVMTCk7CiAJCX0KLQl9IGVsc2UKKwl9IGVsc2UgewogCQlyZXR2YWwgPSB1YXJ0X3N0YXJ0dXAodHR5LCBzdGF0ZSwgMSk7CisJCWlmIChyZXR2YWwgPiAwKQorCQkJcmV0dmFsID0gMDsKKwl9CiAgZXhpdDoKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTEzOSw2ICsxMTMzLDggQEAKIAkJdXBvcnQtPm9wcy0+Y29uZmlnX3BvcnQodXBvcnQsIGZsYWdzKTsKIAogCQlyZXQgPSB1YXJ0X3N0YXJ0dXAodHR5LCBzdGF0ZSwgMSk7CisJCWlmIChyZXQgPiAwKQorCQkJcmV0ID0gMDsKIAl9CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7CkBAIC0xNDY1LDcgKzE0NjEsNiBAQAogewogCXN0cnVjdCB1YXJ0X3N0YXRlICpzdGF0ZSA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IHR0eV9wb3J0ICpwb3J0OwotCXN0cnVjdCB1YXJ0X3BvcnQgKnVwb3J0OwogCiAJaWYgKCFzdGF0ZSkgewogCQlzdHJ1Y3QgdWFydF9kcml2ZXIgKmRydiA9IHR0eS0+ZHJpdmVyLT5kcml2ZXJfc3RhdGU7CkBAIC0xNDgxLDU2ICsxNDc2LDM2IEBACiAJcG9ydCA9ICZzdGF0ZS0+cG9ydDsKIAlwcl9kZWJ1ZygidWFydF9jbG9zZSglZCkgY2FsbGVkXG4iLCB0dHktPmluZGV4KTsKIAotCWlmICh0dHlfcG9ydF9jbG9zZV9zdGFydChwb3J0LCB0dHksIGZpbHApID09IDApCi0JCXJldHVybjsKKwl0dHlfcG9ydF9jbG9zZSh0dHktPnBvcnQsIHR0eSwgZmlscCk7Cit9CiAKLQltdXRleF9sb2NrKCZwb3J0LT5tdXRleCk7Ci0JdXBvcnQgPSB1YXJ0X3BvcnRfY2hlY2soc3RhdGUpOworc3RhdGljIHZvaWQgdWFydF90dHlfcG9ydF9zaHV0ZG93bihzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCB1YXJ0X3N0YXRlLCBwb3J0KTsKKwlzdHJ1Y3QgdWFydF9wb3J0ICp1cG9ydCA9IHVhcnRfcG9ydF9jaGVjayhzdGF0ZSk7CiAKIAkvKgogCSAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0b3AgYWNjZXB0aW5nIGlucHV0LiAgVG8gZG8gdGhpcywgd2UKIAkgKiBkaXNhYmxlIHRoZSByZWNlaXZlIGxpbmUgc3RhdHVzIGludGVycnVwdHMuCiAJICovCi0JaWYgKHR0eV9wb3J0X2luaXRpYWxpemVkKHBvcnQpICYmCi0JICAgICFXQVJOKCF1cG9ydCwgImRldGFjaGVkIHBvcnQgc3RpbGwgaW5pdGlhbGl6ZWQhXG4iKSkgewotCQlzcGluX2xvY2tfaXJxKCZ1cG9ydC0+bG9jayk7Ci0JCXVwb3J0LT5vcHMtPnN0b3BfcngodXBvcnQpOwotCQlzcGluX3VubG9ja19pcnEoJnVwb3J0LT5sb2NrKTsKLQkJLyoKLQkJICogQmVmb3JlIHdlIGRyb3AgRFRSLCBtYWtlIHN1cmUgdGhlIFVBUlQgdHJhbnNtaXR0ZXIKLQkJICogaGFzIGNvbXBsZXRlbHkgZHJhaW5lZDsgdGhpcyBpcyBlc3BlY2lhbGx5Ci0JCSAqIGltcG9ydGFudCBpZiB0aGVyZSBpcyBhIHRyYW5zbWl0IEZJRk8hCi0JCSAqLwotCQl1YXJ0X3dhaXRfdW50aWxfc2VudCh0dHksIHVwb3J0LT50aW1lb3V0KTsKLQl9CisJaWYgKFdBUk4oIXVwb3J0LCAiZGV0YWNoZWQgcG9ydCBzdGlsbCBpbml0aWFsaXplZCFcbiIpKQorCQlyZXR1cm47CiAKLQl1YXJ0X3NodXRkb3duKHR0eSwgc3RhdGUpOwotCXR0eV9wb3J0X3R0eV9zZXQocG9ydCwgTlVMTCk7CisJc3Bpbl9sb2NrX2lycSgmdXBvcnQtPmxvY2spOworCXVwb3J0LT5vcHMtPnN0b3BfcngodXBvcnQpOworCXNwaW5fdW5sb2NrX2lycSgmdXBvcnQtPmxvY2spOwogCi0Jc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0KLQlpZiAocG9ydC0+YmxvY2tlZF9vcGVuKSB7Ci0JCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JCWlmIChwb3J0LT5jbG9zZV9kZWxheSkKLQkJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKGppZmZpZXNfdG9fbXNlY3MocG9ydC0+Y2xvc2VfZGVsYXkpKTsKLQkJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JfSBlbHNlIGlmICh1cG9ydCAmJiAhdWFydF9jb25zb2xlKHVwb3J0KSkgewotCQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwotCQl1YXJ0X2NoYW5nZV9wbShzdGF0ZSwgVUFSVF9QTV9TVEFURV9PRkYpOwotCQlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwb3J0LT5sb2NrKTsKLQl0dHlfcG9ydF9zZXRfYWN0aXZlKHBvcnQsIDApOworCXVhcnRfcG9ydF9zaHV0ZG93bihwb3J0KTsKIAogCS8qCi0JICogV2FrZSB1cCBhbnlvbmUgdHJ5aW5nIHRvIG9wZW4gdGhpcyBwb3J0LgorCSAqIEl0J3MgcG9zc2libGUgZm9yIHNodXRkb3duIHRvIGJlIGNhbGxlZCBhZnRlciBzdXNwZW5kIGlmIHdlIGdldAorCSAqIGEgRENEIGRyb3AgKGhhbmd1cCkgYXQganVzdCB0aGUgcmlnaHQgdGltZS4gIENsZWFyIHN1c3BlbmRlZCBiaXQgc28KKwkgKiB3ZSBkb24ndCB0cnkgdG8gcmVzdW1lIGEgcG9ydCB0aGF0IGhhcyBiZWVuIHNodXRkb3duLgogCSAqLwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+b3Blbl93YWl0KTsKKwl0dHlfcG9ydF9zZXRfc3VzcGVuZGVkKHBvcnQsIDApOwogCi0JbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7CisJdWFydF9jaGFuZ2VfcG0oc3RhdGUsIFVBUlRfUE1fU1RBVEVfT0ZGKTsKIAotCXR0eV9sZGlzY19mbHVzaCh0dHkpOwotCXR0eS0+Y2xvc2luZyA9IDA7CiB9CiAKIHN0YXRpYyB2b2lkIHVhcnRfd2FpdF91bnRpbF9zZW50KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCB0aW1lb3V0KQpAQCAtMTcxMSw1MiArMTY4NiwzMSBAQAogCXN0cnVjdCB1YXJ0X2RyaXZlciAqZHJ2ID0gdHR5LT5kcml2ZXItPmRyaXZlcl9zdGF0ZTsKIAlpbnQgcmV0dmFsLCBsaW5lID0gdHR5LT5pbmRleDsKIAlzdHJ1Y3QgdWFydF9zdGF0ZSAqc3RhdGUgPSBkcnYtPnN0YXRlICsgbGluZTsKLQlzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQgPSAmc3RhdGUtPnBvcnQ7Ci0Jc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQ7Ci0KLQlwcl9kZWJ1ZygidWFydF9vcGVuKCVkKSBjYWxsZWRcbiIsIGxpbmUpOwotCi0Jc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7Ci0JKytwb3J0LT5jb3VudDsKLQlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOwotCi0JLyoKLQkgKiBXZSB0YWtlIHRoZSBzZW1hcGhvcmUgaGVyZSB0byBndWFyYW50ZWUgdGhhdCB3ZSB3b24ndCBiZSByZS1lbnRlcmVkCi0JICogd2hpbGUgYWxsb2NhdGluZyB0aGUgc3RhdGUgc3RydWN0dXJlLCBvciB3aGlsZSB3ZSByZXF1ZXN0IGFueSBJUlFzCi0JICogdGhhdCB0aGUgZHJpdmVyIG1heSBuZWVkLiAgVGhpcyBhbHNvIGhhcyB0aGUgbmljZSBzaWRlLWVmZmVjdCB0aGF0Ci0JICogaXQgZGVsYXlzIHRoZSBhY3Rpb24gb2YgdWFydF9oYW5ndXAsIHNvIHdlIGNhbiBndWFyYW50ZWUgdGhhdAotCSAqIHN0YXRlLT5wb3J0LnR0eSB3aWxsIGFsd2F5cyBjb250YWluIHNvbWV0aGluZyByZWFzb25hYmxlLgotCSAqLwotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnBvcnQtPm11dGV4KSkgewotCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7Ci0JCWdvdG8gZW5kOwotCX0KLQotCXVwb3J0ID0gdWFydF9wb3J0X2NoZWNrKHN0YXRlKTsKLQlpZiAoIXVwb3J0IHx8IHVwb3J0LT5mbGFncyAmIFVQRl9ERUFEKSB7Ci0JCXJldHZhbCA9IC1FTlhJTzsKLQkJZ290byBlcnJfdW5sb2NrOwotCX0KIAogCXR0eS0+ZHJpdmVyX2RhdGEgPSBzdGF0ZTsKLQl1cG9ydC0+c3RhdGUgPSBzdGF0ZTsKKworCXJldHZhbCA9IHR0eV9wb3J0X29wZW4oJnN0YXRlLT5wb3J0LCB0dHksIGZpbHApOworCWlmIChyZXR2YWwgPiAwKQorCQlyZXR2YWwgPSAwOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB1YXJ0X3BvcnRfYWN0aXZhdGUoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB1YXJ0X3N0YXRlICpzdGF0ZSA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgdWFydF9zdGF0ZSwgcG9ydCk7CisJc3RydWN0IHVhcnRfcG9ydCAqdXBvcnQ7CisKKwl1cG9ydCA9IHVhcnRfcG9ydF9jaGVjayhzdGF0ZSk7CisJaWYgKCF1cG9ydCB8fCB1cG9ydC0+ZmxhZ3MgJiBVUEZfREVBRCkKKwkJcmV0dXJuIC1FTlhJTzsKKwogCXBvcnQtPmxvd19sYXRlbmN5ID0gKHVwb3J0LT5mbGFncyAmIFVQRl9MT1dfTEFURU5DWSkgPyAxIDogMDsKLQl0dHlfcG9ydF90dHlfc2V0KHBvcnQsIHR0eSk7CiAKIAkvKgogCSAqIFN0YXJ0IHVwIHRoZSBzZXJpYWwgcG9ydC4KIAkgKi8KLQlyZXR2YWwgPSB1YXJ0X3N0YXJ0dXAodHR5LCBzdGF0ZSwgMCk7Ci0KLQkvKgotCSAqIElmIHdlIHN1Y2NlZWRlZCwgd2FpdCB1bnRpbCB0aGUgcG9ydCBpcyByZWFkeS4KLQkgKi8KLWVycl91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7Ci0JaWYgKHJldHZhbCA9PSAwKQotCQlyZXR2YWwgPSB0dHlfcG9ydF9ibG9ja190aWxfcmVhZHkocG9ydCwgdHR5LCBmaWxwKTsKLWVuZDoKLQlyZXR1cm4gcmV0dmFsOworCXJldHVybiB1YXJ0X3N0YXJ0dXAodHR5LCBzdGF0ZSwgMCk7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICp1YXJ0X3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKQEAgLTE5NDAsNyArMTg5NCw3IEBACiAgKgogICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBmYWlsdXJlCiAgKi8KLWludCB1YXJ0X3BhcnNlX2Vhcmx5Y29uKGNoYXIgKnAsIHVuc2lnbmVkIGNoYXIgKmlvdHlwZSwgdW5zaWduZWQgbG9uZyAqYWRkciwKK2ludCB1YXJ0X3BhcnNlX2Vhcmx5Y29uKGNoYXIgKnAsIHVuc2lnbmVkIGNoYXIgKmlvdHlwZSwgcmVzb3VyY2Vfc2l6ZV90ICphZGRyLAogCQkJY2hhciAqKm9wdGlvbnMpCiB7CiAJaWYgKHN0cm5jbXAocCwgIm1taW8sIiwgNSkgPT0gMCkgewpAQCAtMTk2OCw3ICsxOTIyLDExIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCSphZGRyID0gc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMCk7CisJLyoKKwkgKiBCZWZvcmUgeW91IHJlcGxhY2UgaXQgd2l0aCBrc3RydG91bGwoKSwgdGhpbmsgYWJvdXQgb3B0aW9ucyBzZXBhcmF0b3IKKwkgKiAoJywnKSBpdCB3aWxsIG5vdCB0b2xlcmF0ZQorCSAqLworCSphZGRyID0gc2ltcGxlX3N0cnRvdWxsKHAsIE5VTEwsIDApOwogCXAgPSBzdHJjaHIocCwgJywnKTsKIAlpZiAocCkKIAkJcCsrOwpAQCAtMjQ3MCw2ICsyNDI4LDggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyB1YXJ0X3BvcnRfb3BzID0gewogCS5jYXJyaWVyX3JhaXNlZCA9IHVhcnRfY2Fycmllcl9yYWlzZWQsCiAJLmR0cl9ydHMJPSB1YXJ0X2R0cl9ydHMsCisJLmFjdGl2YXRlCT0gdWFydF9wb3J0X2FjdGl2YXRlLAorCS5zaHV0ZG93bgk9IHVhcnRfdHR5X3BvcnRfc2h1dGRvd24sCiB9OwogCiAvKioKQEAgLTI3ODYsNiArMjc0Niw4IEBACiAJdXBvcnQtPmNvbnMgPSBkcnYtPmNvbnM7CiAJdXBvcnQtPm1pbm9yID0gZHJ2LT50dHlfZHJpdmVyLT5taW5vcl9zdGFydCArIHVwb3J0LT5saW5lOwogCisJcG9ydC0+Y29uc29sZSA9IHVhcnRfY29uc29sZSh1cG9ydCk7CisKIAkvKgogCSAqIElmIHRoaXMgcG9ydCBpcyBhIGNvbnNvbGUsIHRoZW4gdGhlIHNwaW5sb2NrIGlzIGFscmVhZHkKIAkgKiBpbml0aWFsaXNlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYwppbmRleCBkODZlZWUzLi40YjI2MjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jCkBAIC0yNTMzLDcgKzI1MzMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIHNjaV91YXJ0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgc2NpX3VhcnRfb3BzID0gewogCS50eF9lbXB0eQk9IHNjaV90eF9lbXB0eSwKIAkuc2V0X21jdHJsCT0gc2NpX3NldF9tY3RybCwKIAkuZ2V0X21jdHJsCT0gc2NpX2dldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zdC1hc2MuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zdC1hc2MuYwppbmRleCAyZDc4Y2IzLi4zNzllNWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc3QtYXNjLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3N0LWFzYy5jCkBAIC02MzksNyArNjM5LDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIGFzY191YXJ0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgYXNjX3VhcnRfb3BzID0gewogCS50eF9lbXB0eQk9IGFzY190eF9lbXB0eSwKIAkuc2V0X21jdHJsCT0gYXNjX3NldF9tY3RybCwKIAkuZ2V0X21jdHJsCT0gYXNjX2dldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zdG0zMi11c2FydC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3N0bTMyLXVzYXJ0LmMKaW5kZXggZjg5ZDFmNy4uMDMzODU2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3N0bTMyLXVzYXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3N0bTMyLXVzYXJ0LmMKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSBNYXhpbWUgQ29xdWVsaW4gMjAxNQotICogQXV0aG9yOiAgTWF4aW1lIENvcXVlbGluIDxtY29xdWVsaW4uc3RtMzJAZ21haWwuY29tPgorICogQXV0aG9yczogIE1heGltZSBDb3F1ZWxpbiA8bWNvcXVlbGluLnN0bTMyQGdtYWlsLmNvbT4KKyAqCSAgICAgR2VyYWxkIEJhZXphIDxnZXJhbGQuYmFlemFAc3QuY29tPgogICogTGljZW5zZSB0ZXJtczogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpLCB2ZXJzaW9uIDIKICAqCiAgKiBJbnNwaXJlZCBieSBzdC1hc2MuYyBmcm9tIFNUTWljcm9lbGVjdHJvbmljcyAoYykKQEAgLTEwLDEyMCArMTEsMzEgQEAKICNkZWZpbmUgU1VQUE9SVF9TWVNSUQogI2VuZGlmCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgotI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtZGlyZWN0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KIAotI2RlZmluZSBEUklWRVJfTkFNRSAic3RtMzItdXNhcnQiCi0KLS8qIFJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgVVNBUlRfU1IJCTB4MDAKLSNkZWZpbmUgVVNBUlRfRFIJCTB4MDQKLSNkZWZpbmUgVVNBUlRfQlJSCQkweDA4Ci0jZGVmaW5lIFVTQVJUX0NSMQkJMHgwYwotI2RlZmluZSBVU0FSVF9DUjIJCTB4MTAKLSNkZWZpbmUgVVNBUlRfQ1IzCQkweDE0Ci0jZGVmaW5lIFVTQVJUX0dUUFIJCTB4MTgKLQotLyogVVNBUlRfU1IgKi8KLSNkZWZpbmUgVVNBUlRfU1JfUEUJCUJJVCgwKQotI2RlZmluZSBVU0FSVF9TUl9GRQkJQklUKDEpCi0jZGVmaW5lIFVTQVJUX1NSX05GCQlCSVQoMikKLSNkZWZpbmUgVVNBUlRfU1JfT1JFCQlCSVQoMykKLSNkZWZpbmUgVVNBUlRfU1JfSURMRQkJQklUKDQpCi0jZGVmaW5lIFVTQVJUX1NSX1JYTkUJCUJJVCg1KQotI2RlZmluZSBVU0FSVF9TUl9UQwkJQklUKDYpCi0jZGVmaW5lIFVTQVJUX1NSX1RYRQkJQklUKDcpCi0jZGVmaW5lIFVTQVJUX1NSX0xCRAkJQklUKDgpCi0jZGVmaW5lIFVTQVJUX1NSX0NUUwkJQklUKDkpCi0jZGVmaW5lIFVTQVJUX1NSX0VSUl9NQVNLCShVU0FSVF9TUl9MQkQgfCBVU0FSVF9TUl9PUkUgfCBcCi0JCQkJIFVTQVJUX1NSX0ZFIHwgVVNBUlRfU1JfUEUpCi0vKiBEdW1teSBiaXRzICovCi0jZGVmaW5lIFVTQVJUX1NSX0RVTU1ZX1JYCUJJVCgxNikKLQotLyogVVNBUlRfRFIgKi8KLSNkZWZpbmUgVVNBUlRfRFJfTUFTSwkJR0VOTUFTSyg4LCAwKQotCi0vKiBVU0FSVF9CUlIgKi8KLSNkZWZpbmUgVVNBUlRfQlJSX0RJVl9GX01BU0sJR0VOTUFTSygzLCAwKQotI2RlZmluZSBVU0FSVF9CUlJfRElWX01fTUFTSwlHRU5NQVNLKDE1LCA0KQotI2RlZmluZSBVU0FSVF9CUlJfRElWX01fU0hJRlQJNAotCi0vKiBVU0FSVF9DUjEgKi8KLSNkZWZpbmUgVVNBUlRfQ1IxX1NCSwkJQklUKDApCi0jZGVmaW5lIFVTQVJUX0NSMV9SV1UJCUJJVCgxKQotI2RlZmluZSBVU0FSVF9DUjFfUkUJCUJJVCgyKQotI2RlZmluZSBVU0FSVF9DUjFfVEUJCUJJVCgzKQotI2RlZmluZSBVU0FSVF9DUjFfSURMRUlFCUJJVCg0KQotI2RlZmluZSBVU0FSVF9DUjFfUlhORUlFCUJJVCg1KQotI2RlZmluZSBVU0FSVF9DUjFfVENJRQkJQklUKDYpCi0jZGVmaW5lIFVTQVJUX0NSMV9UWEVJRQkJQklUKDcpCi0jZGVmaW5lIFVTQVJUX0NSMV9QRUlFCQlCSVQoOCkKLSNkZWZpbmUgVVNBUlRfQ1IxX1BTCQlCSVQoOSkKLSNkZWZpbmUgVVNBUlRfQ1IxX1BDRQkJQklUKDEwKQotI2RlZmluZSBVU0FSVF9DUjFfV0FLRQkJQklUKDExKQotI2RlZmluZSBVU0FSVF9DUjFfTQkJQklUKDEyKQotI2RlZmluZSBVU0FSVF9DUjFfVUUJCUJJVCgxMykKLSNkZWZpbmUgVVNBUlRfQ1IxX09WRVI4CQlCSVQoMTUpCi0jZGVmaW5lIFVTQVJUX0NSMV9JRV9NQVNLCUdFTk1BU0soOCwgNCkKLQotLyogVVNBUlRfQ1IyICovCi0jZGVmaW5lIFVTQVJUX0NSMl9BRERfTUFTSwlHRU5NQVNLKDMsIDApCi0jZGVmaW5lIFVTQVJUX0NSMl9MQkRMCQlCSVQoNSkKLSNkZWZpbmUgVVNBUlRfQ1IyX0xCRElFCQlCSVQoNikKLSNkZWZpbmUgVVNBUlRfQ1IyX0xCQ0wJCUJJVCg4KQotI2RlZmluZSBVU0FSVF9DUjJfQ1BIQQkJQklUKDkpCi0jZGVmaW5lIFVTQVJUX0NSMl9DUE9MCQlCSVQoMTApCi0jZGVmaW5lIFVTQVJUX0NSMl9DTEtFTgkJQklUKDExKQotI2RlZmluZSBVU0FSVF9DUjJfU1RPUF8yQglCSVQoMTMpCi0jZGVmaW5lIFVTQVJUX0NSMl9TVE9QX01BU0sJR0VOTUFTSygxMywgMTIpCi0jZGVmaW5lIFVTQVJUX0NSMl9MSU5FTgkJQklUKDE0KQotCi0vKiBVU0FSVF9DUjMgKi8KLSNkZWZpbmUgVVNBUlRfQ1IzX0VJRQkJQklUKDApCi0jZGVmaW5lIFVTQVJUX0NSM19JUkVOCQlCSVQoMSkKLSNkZWZpbmUgVVNBUlRfQ1IzX0lSTFAJCUJJVCgyKQotI2RlZmluZSBVU0FSVF9DUjNfSERTRUwJCUJJVCgzKQotI2RlZmluZSBVU0FSVF9DUjNfTkFDSwkJQklUKDQpCi0jZGVmaW5lIFVTQVJUX0NSM19TQ0VOCQlCSVQoNSkKLSNkZWZpbmUgVVNBUlRfQ1IzX0RNQVIJCUJJVCg2KQotI2RlZmluZSBVU0FSVF9DUjNfRE1BVAkJQklUKDcpCi0jZGVmaW5lIFVTQVJUX0NSM19SVFNFCQlCSVQoOCkKLSNkZWZpbmUgVVNBUlRfQ1IzX0NUU0UJCUJJVCg5KQotI2RlZmluZSBVU0FSVF9DUjNfQ1RTSUUJCUJJVCgxMCkKLSNkZWZpbmUgVVNBUlRfQ1IzX09ORUJJVAlCSVQoMTEpCi0KLS8qIFVTQVJUX0dUUFIgKi8KLSNkZWZpbmUgVVNBUlRfR1RQUl9QU0NfTUFTSwlHRU5NQVNLKDcsIDApCi0jZGVmaW5lIFVTQVJUX0dUUFJfR1RfTUFTSwlHRU5NQVNLKDE1LCA4KQotCi0jZGVmaW5lIERSSVZFUl9OQU1FICJzdG0zMi11c2FydCIKLSNkZWZpbmUgU1RNMzJfU0VSSUFMX05BTUUgInR0eVMiCi0jZGVmaW5lIFNUTTMyX01BWF9QT1JUUyA2Ci0KLXN0cnVjdCBzdG0zMl9wb3J0IHsKLQlzdHJ1Y3QgdWFydF9wb3J0IHBvcnQ7Ci0Jc3RydWN0IGNsayAqY2xrOwotCWJvb2wgaHdfZmxvd19jb250cm9sOwotfTsKLQotc3RhdGljIHN0cnVjdCBzdG0zMl9wb3J0IHN0bTMyX3BvcnRzW1NUTTMyX01BWF9QT1JUU107Ci1zdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIHN0bTMyX3VzYXJ0X2RyaXZlcjsKKyNpbmNsdWRlICJzdG0zMi11c2FydC5oIgogCiBzdGF0aWMgdm9pZCBzdG0zMl9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgc3RtMzJfdHJhbnNtaXRfY2hhcnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN0bTMyX3BvcnQgKnRvX3N0bTMyX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKQEAgLTE0OCwxOSArNjAsNjQgQEAKIAl3cml0ZWxfcmVsYXhlZCh2YWwsIHBvcnQtPm1lbWJhc2UgKyByZWcpOwogfQogCi1zdGF0aWMgdm9pZCBzdG0zMl9yZWNlaXZlX2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IHN0bTMyX3BlbmRpbmdfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdTMyICpzciwgaW50ICpsYXN0X3JlcywKKwkJCSAgICBib29sIHRocmVhZGVkKQoreworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKwllbnVtIGRtYV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBkbWFfdHhfc3RhdGUgc3RhdGU7CisKKwkqc3IgPSByZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBvZnMtPmlzcik7CisKKwlpZiAodGhyZWFkZWQgJiYgc3RtMzJfcG9ydC0+cnhfY2gpIHsKKwkJc3RhdHVzID0gZG1hZW5naW5lX3R4X3N0YXR1cyhzdG0zMl9wb3J0LT5yeF9jaCwKKwkJCQkJICAgICBzdG0zMl9wb3J0LT5yeF9jaC0+Y29va2llLAorCQkJCQkgICAgICZzdGF0ZSk7CisJCWlmICgoc3RhdHVzID09IERNQV9JTl9QUk9HUkVTUykgJiYKKwkJICAgICgqbGFzdF9yZXMgIT0gc3RhdGUucmVzaWR1ZSkpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICgqc3IgJiBVU0FSVF9TUl9SWE5FKSB7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK3N0bTMyX2dldF9jaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHUzMiAqc3IsIGludCAqbGFzdF9yZXMpCit7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCXVuc2lnbmVkIGxvbmcgYzsKKworCWlmIChzdG0zMl9wb3J0LT5yeF9jaCkgeworCQljID0gc3RtMzJfcG9ydC0+cnhfYnVmW1JYX0JVRl9MIC0gKCpsYXN0X3JlcyktLV07CisJCWlmICgoKmxhc3RfcmVzKSA9PSAwKQorCQkJKmxhc3RfcmVzID0gUlhfQlVGX0w7CisJCXJldHVybiBjOworCX0gZWxzZSB7CisJCXJldHVybiByZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBvZnMtPnJkcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdG0zMl9yZWNlaXZlX2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGJvb2wgdGhyZWFkZWQpCiB7CiAJc3RydWN0IHR0eV9wb3J0ICp0cG9ydCA9ICZwb3J0LT5zdGF0ZS0+cG9ydDsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CiAJdW5zaWduZWQgbG9uZyBjOwogCXUzMiBzcjsKIAljaGFyIGZsYWc7CisJc3RhdGljIGludCBsYXN0X3JlcyA9IFJYX0JVRl9MOwogCiAJaWYgKHBvcnQtPmlycV93YWtlKQogCQlwbV93YWtldXBfZXZlbnQodHBvcnQtPnR0eS0+ZGV2LCAwKTsKIAotCXdoaWxlICgoc3IgPSByZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9TUikpICYgVVNBUlRfU1JfUlhORSkgeworCXdoaWxlIChzdG0zMl9wZW5kaW5nX3J4KHBvcnQsICZzciwgJmxhc3RfcmVzLCB0aHJlYWRlZCkpIHsKIAkJc3IgfD0gVVNBUlRfU1JfRFVNTVlfUlg7Ci0JCWMgPSByZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9EUik7CisJCWMgPSBzdG0zMl9nZXRfY2hhcihwb3J0LCAmc3IsICZsYXN0X3Jlcyk7CiAJCWZsYWcgPSBUVFlfTk9STUFMOwogCQlwb3J0LT5pY291bnQucngrKzsKIApAQCAtMTcwLDYgKzEyNywxMCBAQAogCQkJCWlmICh1YXJ0X2hhbmRsZV9icmVhayhwb3J0KSkKIAkJCQkJY29udGludWU7CiAJCQl9IGVsc2UgaWYgKHNyICYgVVNBUlRfU1JfT1JFKSB7CisJCQkJaWYgKG9mcy0+aWNyICE9IFVOREVGX1JFRykKKwkJCQkJd3JpdGVsX3JlbGF4ZWQoVVNBUlRfSUNSX09SRUNGLAorCQkJCQkJICAgICAgIHBvcnQtPm1lbWJhc2UgKworCQkJCQkJICAgICAgIG9mcy0+aWNyKTsKIAkJCQlwb3J0LT5pY291bnQub3ZlcnJ1bisrOwogCQkJfSBlbHNlIGlmIChzciAmIFVTQVJUX1NSX1BFKSB7CiAJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOwpAQCAtMTk3LDE0ICsxNTgsMTM4IEBACiAJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKIH0KIAorc3RhdGljIHZvaWQgc3RtMzJfdHhfZG1hX2NvbXBsZXRlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gYXJnOworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMnBvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJwb3J0LT5pbmZvLT5vZnM7CisJdW5zaWduZWQgaW50IGlzcjsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVhZGxfcmVsYXhlZF9wb2xsX3RpbWVvdXRfYXRvbWljKHBvcnQtPm1lbWJhc2UgKyBvZnMtPmlzciwKKwkJCQkJCWlzciwKKwkJCQkJCShpc3IgJiBVU0FSVF9TUl9UQyksCisJCQkJCQkxMCwgMTAwMDAwKTsKKworCWlmIChyZXQpCisJCWRldl9lcnIocG9ydC0+ZGV2LCAidGVybWluYWwgY291bnQgbm90IHNldFxuIik7CisKKwlpZiAob2ZzLT5pY3IgPT0gVU5ERUZfUkVHKQorCQlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmlzciwgVVNBUlRfU1JfVEMpOworCWVsc2UKKwkJc3RtMzJfc2V0X2JpdHMocG9ydCwgb2ZzLT5pY3IsIFVTQVJUX0NSX1RDKTsKKworCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IzLCBVU0FSVF9DUjNfRE1BVCk7CisJc3RtMzJwb3J0LT50eF9kbWFfYnVzeSA9IGZhbHNlOworCisJLyogTGV0J3Mgc2VlIGlmIHdlIGhhdmUgcGVuZGluZyBkYXRhIHRvIHNlbmQgKi8KKwlzdG0zMl90cmFuc21pdF9jaGFycyhwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc3RtMzJfdHJhbnNtaXRfY2hhcnNfcGlvKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5zdGF0ZS0+eG1pdDsKKwl1bnNpZ25lZCBpbnQgaXNyOworCWludCByZXQ7CisKKwlpZiAoc3RtMzJfcG9ydC0+dHhfZG1hX2J1c3kpIHsKKwkJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjMsIFVTQVJUX0NSM19ETUFUKTsKKwkJc3RtMzJfcG9ydC0+dHhfZG1hX2J1c3kgPSBmYWxzZTsKKwl9CisKKwlyZXQgPSByZWFkbF9yZWxheGVkX3BvbGxfdGltZW91dF9hdG9taWMocG9ydC0+bWVtYmFzZSArIG9mcy0+aXNyLAorCQkJCQkJaXNyLAorCQkJCQkJKGlzciAmIFVTQVJUX1NSX1RYRSksCisJCQkJCQkxMCwgMTAwKTsKKworCWlmIChyZXQpCisJCWRldl9lcnIocG9ydC0+ZGV2LCAidHggZW1wdHkgbm90IHNldFxuIik7CisKKwlzdG0zMl9zZXRfYml0cyhwb3J0LCBvZnMtPmNyMSwgVVNBUlRfQ1IxX1RYRUlFKTsKKworCXdyaXRlbF9yZWxheGVkKHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSwgcG9ydC0+bWVtYmFzZSArIG9mcy0+dGRyKTsKKwl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOworCXBvcnQtPmljb3VudC50eCsrOworfQorCitzdGF0aWMgdm9pZCBzdG0zMl90cmFuc21pdF9jaGFyc19kbWEoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJwb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMycG9ydC0+aW5mby0+b2ZzOworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5zdGF0ZS0+eG1pdDsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2MgPSBOVUxMOworCWRtYV9jb29raWVfdCBjb29raWU7CisJdW5zaWduZWQgaW50IGNvdW50LCBpOworCisJaWYgKHN0bTMycG9ydC0+dHhfZG1hX2J1c3kpCisJCXJldHVybjsKKworCXN0bTMycG9ydC0+dHhfZG1hX2J1c3kgPSB0cnVlOworCisJY291bnQgPSB1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KTsKKworCWlmIChjb3VudCA+IFRYX0JVRl9MKQorCQljb3VudCA9IFRYX0JVRl9MOworCisJaWYgKHhtaXQtPnRhaWwgPCB4bWl0LT5oZWFkKSB7CisJCW1lbWNweSgmc3RtMzJwb3J0LT50eF9idWZbMF0sICZ4bWl0LT5idWZbeG1pdC0+dGFpbF0sIGNvdW50KTsKKwl9IGVsc2UgeworCQlzaXplX3Qgb25lID0gVUFSVF9YTUlUX1NJWkUgLSB4bWl0LT50YWlsOworCQlzaXplX3QgdHdvOworCisJCWlmIChvbmUgPiBjb3VudCkKKwkJCW9uZSA9IGNvdW50OworCQl0d28gPSBjb3VudCAtIG9uZTsKKworCQltZW1jcHkoJnN0bTMycG9ydC0+dHhfYnVmWzBdLCAmeG1pdC0+YnVmW3htaXQtPnRhaWxdLCBvbmUpOworCQlpZiAodHdvKQorCQkJbWVtY3B5KCZzdG0zMnBvcnQtPnR4X2J1ZltvbmVdLCAmeG1pdC0+YnVmWzBdLCB0d28pOworCX0KKworCWRlc2MgPSBkbWFlbmdpbmVfcHJlcF9zbGF2ZV9zaW5nbGUoc3RtMzJwb3J0LT50eF9jaCwKKwkJCQkJICAgc3RtMzJwb3J0LT50eF9kbWFfYnVmLAorCQkJCQkgICBjb3VudCwKKwkJCQkJICAgRE1BX01FTV9UT19ERVYsCisJCQkJCSAgIERNQV9QUkVQX0lOVEVSUlVQVCk7CisKKwlpZiAoIWRlc2MpIHsKKwkJZm9yIChpID0gY291bnQ7IGkgPiAwOyBpLS0pCisJCQlzdG0zMl90cmFuc21pdF9jaGFyc19waW8ocG9ydCk7CisJCXJldHVybjsKKwl9CisKKwlkZXNjLT5jYWxsYmFjayA9IHN0bTMyX3R4X2RtYV9jb21wbGV0ZTsKKwlkZXNjLT5jYWxsYmFja19wYXJhbSA9IHBvcnQ7CisKKwkvKiBQdXNoIGN1cnJlbnQgRE1BIFRYIHRyYW5zYWN0aW9uIGluIHRoZSBwZW5kaW5nIHF1ZXVlICovCisJY29va2llID0gZG1hZW5naW5lX3N1Ym1pdChkZXNjKTsKKworCS8qIElzc3VlIHBlbmRpbmcgRE1BIFRYIHJlcXVlc3RzICovCisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoc3RtMzJwb3J0LT50eF9jaCk7CisKKwlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmlzciwgVVNBUlRfU1JfVEMpOworCXN0bTMyX3NldF9iaXRzKHBvcnQsIG9mcy0+Y3IzLCBVU0FSVF9DUjNfRE1BVCk7CisKKwl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyBjb3VudCkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKwlwb3J0LT5pY291bnQudHggKz0gY291bnQ7Cit9CisKIHN0YXRpYyB2b2lkIHN0bTMyX3RyYW5zbWl0X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOwogCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5zdGF0ZS0+eG1pdDsKIAogCWlmIChwb3J0LT54X2NoYXIpIHsKLQkJd3JpdGVsX3JlbGF4ZWQocG9ydC0+eF9jaGFyLCBwb3J0LT5tZW1iYXNlICsgVVNBUlRfRFIpOworCQlpZiAoc3RtMzJfcG9ydC0+dHhfZG1hX2J1c3kpCisJCQlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMywgVVNBUlRfQ1IzX0RNQVQpOworCQl3cml0ZWxfcmVsYXhlZChwb3J0LT54X2NoYXIsIHBvcnQtPm1lbWJhc2UgKyBvZnMtPnRkcik7CiAJCXBvcnQtPnhfY2hhciA9IDA7CiAJCXBvcnQtPmljb3VudC50eCsrOworCQlpZiAoc3RtMzJfcG9ydC0+dHhfZG1hX2J1c3kpCisJCQlzdG0zMl9zZXRfYml0cyhwb3J0LCBvZnMtPmNyMywgVVNBUlRfQ1IzX0RNQVQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMTgsOSArMzAzLDEwIEBACiAJCXJldHVybjsKIAl9CiAKLQl3cml0ZWxfcmVsYXhlZCh4bWl0LT5idWZbeG1pdC0+dGFpbF0sIHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9EUik7Ci0JeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKLQlwb3J0LT5pY291bnQudHgrKzsKKwlpZiAoc3RtMzJfcG9ydC0+dHhfY2gpCisJCXN0bTMyX3RyYW5zbWl0X2NoYXJzX2RtYShwb3J0KTsKKwllbHNlCisJCXN0bTMyX3RyYW5zbWl0X2NoYXJzX3Bpbyhwb3J0KTsKIAogCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKIAkJdWFydF93cml0ZV93YWtldXAocG9ydCk7CkBAIC0yMzIsMzQgKzMxOCw2MCBAQAogc3RhdGljIGlycXJldHVybl90IHN0bTMyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpwdHIpCiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IHB0cjsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CiAJdTMyIHNyOwogCiAJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKIAotCXNyID0gcmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgVVNBUlRfU1IpOworCXNyID0gcmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgb2ZzLT5pc3IpOwogCi0JaWYgKHNyICYgVVNBUlRfU1JfUlhORSkKLQkJc3RtMzJfcmVjZWl2ZV9jaGFycyhwb3J0KTsKKwlpZiAoKHNyICYgVVNBUlRfU1JfUlhORSkgJiYgIShzdG0zMl9wb3J0LT5yeF9jaCkpCisJCXN0bTMyX3JlY2VpdmVfY2hhcnMocG9ydCwgZmFsc2UpOwogCi0JaWYgKHNyICYgVVNBUlRfU1JfVFhFKQorCWlmICgoc3IgJiBVU0FSVF9TUl9UWEUpICYmICEoc3RtMzJfcG9ydC0+dHhfY2gpKQogCQlzdG0zMl90cmFuc21pdF9jaGFycyhwb3J0KTsKIAogCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKIAorCWlmIChzdG0zMl9wb3J0LT5yeF9jaCkKKwkJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKKwllbHNlCisJCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHN0bTMyX3RocmVhZGVkX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpwdHIpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IHB0cjsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisKKwlzcGluX2xvY2soJnBvcnQtPmxvY2spOworCisJaWYgKHN0bTMyX3BvcnQtPnJ4X2NoKQorCQlzdG0zMl9yZWNlaXZlX2NoYXJzKHBvcnQsIHRydWUpOworCisJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOworCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHN0bTMyX3R4X2VtcHR5KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0JcmV0dXJuIHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIFVTQVJUX1NSKSAmIFVTQVJUX1NSX1RYRTsKKwlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJfcG9ydCA9IHRvX3N0bTMyX3BvcnQocG9ydCk7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5vZnM7CisKKwlyZXR1cm4gcmVhZGxfcmVsYXhlZChwb3J0LT5tZW1iYXNlICsgb2ZzLT5pc3IpICYgVVNBUlRfU1JfVFhFOwogfQogCiBzdGF0aWMgdm9pZCBzdG0zMl9zZXRfbWN0cmwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IG1jdHJsKQogeworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKwogCWlmICgobWN0cmwgJiBUSU9DTV9SVFMpICYmIChwb3J0LT5zdGF0dXMgJiBVUFNUQVRfQVVUT1JUUykpCi0JCXN0bTMyX3NldF9iaXRzKHBvcnQsIFVTQVJUX0NSMywgVVNBUlRfQ1IzX1JUU0UpOworCQlzdG0zMl9zZXRfYml0cyhwb3J0LCBvZnMtPmNyMywgVVNBUlRfQ1IzX1JUU0UpOwogCWVsc2UKLQkJc3RtMzJfY2xyX2JpdHMocG9ydCwgVVNBUlRfQ1IzLCBVU0FSVF9DUjNfUlRTRSk7CisJCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IzLCBVU0FSVF9DUjNfUlRTRSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RtMzJfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC0yNzEsNyArMzgzLDEwIEBACiAvKiBUcmFuc21pdCBzdG9wICovCiBzdGF0aWMgdm9pZCBzdG0zMl9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RtMzJfY2xyX2JpdHMocG9ydCwgVVNBUlRfQ1IxLCBVU0FSVF9DUjFfVFhFSUUpOworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKworCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IxLCBVU0FSVF9DUjFfVFhFSUUpOwogfQogCiAvKiBUaGVyZSBhcmUgcHJvYmFibHkgY2hhcmFjdGVycyB3YWl0aW5nIHRvIGJlIHRyYW5zbWl0dGVkLiAqLwpAQCAtMjgyLDMzICszOTcsNDAgQEAKIAlpZiAodWFydF9jaXJjX2VtcHR5KHhtaXQpKQogCQlyZXR1cm47CiAKLQlzdG0zMl9zZXRfYml0cyhwb3J0LCBVU0FSVF9DUjEsIFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9URSk7CisJc3RtMzJfdHJhbnNtaXRfY2hhcnMocG9ydCk7CiB9CiAKIC8qIFRocm90dGxlIHRoZSByZW1vdGUgd2hlbiBpbnB1dCBidWZmZXIgaXMgYWJvdXQgdG8gb3ZlcmZsb3cuICovCiBzdGF0aWMgdm9pZCBzdG0zMl90aHJvdHRsZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlzdG0zMl9jbHJfYml0cyhwb3J0LCBVU0FSVF9DUjEsIFVTQVJUX0NSMV9SWE5FSUUpOworCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IxLCBVU0FSVF9DUjFfUlhORUlFKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CiAKIC8qIFVudGhyb3R0bGUgdGhlIHJlbW90ZSwgdGhlIGlucHV0IGJ1ZmZlciBjYW4gbm93IGFjY2VwdCBkYXRhLiAqLwogc3RhdGljIHZvaWQgc3RtMzJfdW50aHJvdHRsZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQlzdG0zMl9zZXRfYml0cyhwb3J0LCBVU0FSVF9DUjEsIFVTQVJUX0NSMV9SWE5FSUUpOworCXN0bTMyX3NldF9iaXRzKHBvcnQsIG9mcy0+Y3IxLCBVU0FSVF9DUjFfUlhORUlFKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CiAKIC8qIFJlY2VpdmUgc3RvcCAqLwogc3RhdGljIHZvaWQgc3RtMzJfc3RvcF9yeChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXN0bTMyX2Nscl9iaXRzKHBvcnQsIFVTQVJUX0NSMSwgVVNBUlRfQ1IxX1JYTkVJRSk7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCisJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjEsIFVTQVJUX0NSMV9SWE5FSUUpOwogfQogCiAvKiBIYW5kbGUgYnJlYWtzIC0gaWdub3JlZCBieSB1cyAqLwpAQCAtMzE4LDI2ICs0NDAsMzQgQEAKIAogc3RhdGljIGludCBzdG0zMl9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOwogCWNvbnN0IGNoYXIgKm5hbWUgPSB0b19wbGF0Zm9ybV9kZXZpY2UocG9ydC0+ZGV2KS0+bmFtZTsKIAl1MzIgdmFsOwogCWludCByZXQ7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShwb3J0LT5pcnEsIHN0bTMyX2ludGVycnVwdCwgMCwgbmFtZSwgcG9ydCk7CisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocG9ydC0+aXJxLCBzdG0zMl9pbnRlcnJ1cHQsCisJCQkJICAgc3RtMzJfdGhyZWFkZWRfaW50ZXJydXB0LAorCQkJCSAgIElSUUZfTk9fU1VTUEVORCwgbmFtZSwgcG9ydCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCXZhbCA9IFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkU7Ci0Jc3RtMzJfc2V0X2JpdHMocG9ydCwgVVNBUlRfQ1IxLCB2YWwpOworCXN0bTMyX3NldF9iaXRzKHBvcnQsIG9mcy0+Y3IxLCB2YWwpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHN0bTMyX3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCXN0cnVjdCBzdG0zMl91c2FydF9jb25maWcgKmNmZyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5jZmc7CiAJdTMyIHZhbDsKIAogCXZhbCA9IFVTQVJUX0NSMV9UWEVJRSB8IFVTQVJUX0NSMV9SWE5FSUUgfCBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkU7Ci0Jc3RtMzJfc2V0X2JpdHMocG9ydCwgVVNBUlRfQ1IxLCB2YWwpOworCXZhbCB8PSBCSVQoY2ZnLT51YXJ0X2VuYWJsZV9iaXQpOworCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IxLCB2YWwpOwogCiAJZnJlZV9pcnEocG9ydC0+aXJxLCBwb3J0KTsKIH0KQEAgLTM0Niw2ICs0NzYsOCBAQAogCQkJICAgIHN0cnVjdCBrdGVybWlvcyAqb2xkKQogewogCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfY29uZmlnICpjZmcgPSAmc3RtMzJfcG9ydC0+aW5mby0+Y2ZnOwogCXVuc2lnbmVkIGludCBiYXVkOwogCXUzMiB1c2FydGRpdiwgbWFudGlzc2EsIGZyYWN0aW9uLCBvdmVyc2FtcGxpbmc7CiAJdGNmbGFnX3QgY2ZsYWcgPSB0ZXJtaW9zLT5jX2NmbGFnOwpAQCAtMzYwLDkgKzQ5MiwxMCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAKIAkvKiBTdG9wIHNlcmlhbCBwb3J0IGFuZCByZXNldCB2YWx1ZSAqLwotCXdyaXRlbF9yZWxheGVkKDAsIHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9DUjEpOworCXdyaXRlbF9yZWxheGVkKDAsIHBvcnQtPm1lbWJhc2UgKyBvZnMtPmNyMSk7CiAKLQljcjEgPSBVU0FSVF9DUjFfVEUgfCBVU0FSVF9DUjFfUkUgfCBVU0FSVF9DUjFfVUUgfCBVU0FSVF9DUjFfUlhORUlFOworCWNyMSA9IFVTQVJUX0NSMV9URSB8IFVTQVJUX0NSMV9SRSB8IFVTQVJUX0NSMV9SWE5FSUU7CisJY3IxIHw9IEJJVChjZmctPnVhcnRfZW5hYmxlX2JpdCk7CiAJY3IyID0gMDsKIAljcjMgPSAwOwogCkBAIC0zNzEsOCArNTA0LDEyIEBACiAKIAlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKIAkJY3IxIHw9IFVTQVJUX0NSMV9QQ0U7Ci0JCWlmICgoY2ZsYWcgJiBDU0laRSkgPT0gQ1M4KQotCQkJY3IxIHw9IFVTQVJUX0NSMV9NOworCQlpZiAoKGNmbGFnICYgQ1NJWkUpID09IENTOCkgeworCQkJaWYgKGNmZy0+aGFzXzdiaXRzX2RhdGEpCisJCQkJY3IxIHw9IFVTQVJUX0NSMV9NMDsKKwkJCWVsc2UKKwkJCQljcjEgfD0gVVNBUlRfQ1IxX007CisJCX0KIAl9CiAKIAlpZiAoY2ZsYWcgJiBQQVJPREQpCkBAIC0zOTQsMTUgKzUzMSwxNSBAQAogCSAqLwogCWlmICh1c2FydGRpdiA8IDE2KSB7CiAJCW92ZXJzYW1wbGluZyA9IDg7Ci0JCXN0bTMyX3NldF9iaXRzKHBvcnQsIFVTQVJUX0NSMSwgVVNBUlRfQ1IxX09WRVI4KTsKKwkJc3RtMzJfc2V0X2JpdHMocG9ydCwgb2ZzLT5jcjEsIFVTQVJUX0NSMV9PVkVSOCk7CiAJfSBlbHNlIHsKIAkJb3ZlcnNhbXBsaW5nID0gMTY7Ci0JCXN0bTMyX2Nscl9iaXRzKHBvcnQsIFVTQVJUX0NSMSwgVVNBUlRfQ1IxX09WRVI4KTsKKwkJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjEsIFVTQVJUX0NSMV9PVkVSOCk7CiAJfQogCiAJbWFudGlzc2EgPSAodXNhcnRkaXYgLyBvdmVyc2FtcGxpbmcpIDw8IFVTQVJUX0JSUl9ESVZfTV9TSElGVDsKIAlmcmFjdGlvbiA9IHVzYXJ0ZGl2ICUgb3ZlcnNhbXBsaW5nOwotCXdyaXRlbF9yZWxheGVkKG1hbnRpc3NhIHwgZnJhY3Rpb24sIHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9CUlIpOworCXdyaXRlbF9yZWxheGVkKG1hbnRpc3NhIHwgZnJhY3Rpb24sIHBvcnQtPm1lbWJhc2UgKyBvZnMtPmJycik7CiAKIAl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIGNmbGFnLCBiYXVkKTsKIApAQCAtNDMwLDkgKzU2NywxMiBAQAogCWlmICgodGVybWlvcy0+Y19jZmxhZyAmIENSRUFEKSA9PSAwKQogCQlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gVVNBUlRfU1JfRFVNTVlfUlg7CiAKLQl3cml0ZWxfcmVsYXhlZChjcjMsIHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9DUjMpOwotCXdyaXRlbF9yZWxheGVkKGNyMiwgcG9ydC0+bWVtYmFzZSArIFVTQVJUX0NSMik7Ci0Jd3JpdGVsX3JlbGF4ZWQoY3IxLCBwb3J0LT5tZW1iYXNlICsgVVNBUlRfQ1IxKTsKKwlpZiAoc3RtMzJfcG9ydC0+cnhfY2gpCisJCWNyMyB8PSBVU0FSVF9DUjNfRE1BUjsKKworCXdyaXRlbF9yZWxheGVkKGNyMywgcG9ydC0+bWVtYmFzZSArIG9mcy0+Y3IzKTsKKwl3cml0ZWxfcmVsYXhlZChjcjIsIHBvcnQtPm1lbWJhc2UgKyBvZnMtPmNyMik7CisJd3JpdGVsX3JlbGF4ZWQoY3IxLCBwb3J0LT5tZW1iYXNlICsgb2ZzLT5jcjEpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogfQpAQCAtNDY5LDYgKzYwOSw4IEBACiB7CiAJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMycG9ydCA9IGNvbnRhaW5lcl9vZihwb3J0LAogCQkJc3RydWN0IHN0bTMyX3BvcnQsIHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJwb3J0LT5pbmZvLT5vZnM7CisJc3RydWN0IHN0bTMyX3VzYXJ0X2NvbmZpZyAqY2ZnID0gJnN0bTMycG9ydC0+aW5mby0+Y2ZnOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCiAJc3dpdGNoIChzdGF0ZSkgewpAQCAtNDc3LDcgKzYxOSw3IEBACiAJCWJyZWFrOwogCWNhc2UgVUFSVF9QTV9TVEFURV9PRkY6CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JCXN0bTMyX2Nscl9iaXRzKHBvcnQsIFVTQVJUX0NSMSwgVVNBUlRfQ1IxX1VFKTsKKwkJc3RtMzJfY2xyX2JpdHMocG9ydCwgb2ZzLT5jcjEsIEJJVChjZmctPnVhcnRfZW5hYmxlX2JpdCkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzdG0zMnBvcnQtPmNsayk7CiAJCWJyZWFrOwpAQCAtNTM5LDggKzY4MSw2IEBACiAJaWYgKCFzdG0zMnBvcnQtPnBvcnQudWFydGNsaykKIAkJcmV0ID0gLUVJTlZBTDsKIAotCWNsa19kaXNhYmxlX3VucHJlcGFyZShzdG0zMnBvcnQtPmNsayk7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC01NjAsMzAgKzcwMCwxNjIgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlzdG0zMl9wb3J0c1tpZF0uaHdfZmxvd19jb250cm9sID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLAotCQkJCQkJCSJhdXRvLWZsb3ctY29udHJvbCIpOworCQkJCQkJCSJzdCxody1mbG93LWN0cmwiKTsKIAlzdG0zMl9wb3J0c1tpZF0ucG9ydC5saW5lID0gaWQ7CiAJcmV0dXJuICZzdG0zMl9wb3J0c1tpZF07CiB9CiAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0bTMyX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdG0zMi11c2FydCIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdG0zMi11YXJ0IiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0bTMyLXVzYXJ0IiwgLmRhdGEgPSAmc3RtMzJmNF9pbmZvfSwKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0bTMyLXVhcnQiLCAuZGF0YSA9ICZzdG0zMmY0X2luZm99LAorCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RtMzJmNy11c2FydCIsIC5kYXRhID0gJnN0bTMyZjdfaW5mb30sCisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdG0zMmY3LXVhcnQiLCAuZGF0YSA9ICZzdG0zMmY3X2luZm99LAogCXt9LAogfTsKIAogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3RtMzJfbWF0Y2gpOwogI2VuZGlmCiAKK3N0YXRpYyBpbnQgc3RtMzJfb2ZfZG1hX3J4X3Byb2JlKHN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMnBvcnQsCisJCQkJIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgKm9mcyA9ICZzdG0zMnBvcnQtPmluZm8tPm9mczsKKwlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJnN0bTMycG9ydC0+cG9ydDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGNvbmZpZzsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2MgPSBOVUxMOworCWRtYV9jb29raWVfdCBjb29raWU7CisJaW50IHJldDsKKworCS8qIFJlcXVlc3QgRE1BIFJYIGNoYW5uZWwgKi8KKwlzdG0zMnBvcnQtPnJ4X2NoID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbChkZXYsICJyeCIpOworCWlmICghc3RtMzJwb3J0LT5yeF9jaCkgeworCQlkZXZfaW5mbyhkZXYsICJyeCBkbWEgYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXN0bTMycG9ydC0+cnhfYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsIFJYX0JVRl9MLAorCQkJCQkJICZzdG0zMnBvcnQtPnJ4X2RtYV9idWYsCisJCQkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdG0zMnBvcnQtPnJ4X2J1ZikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGFsbG9jX2VycjsKKwl9CisKKwkvKiBDb25maWd1cmUgRE1BIGNoYW5uZWwgKi8KKwltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOworCWNvbmZpZy5zcmNfYWRkciA9IHBvcnQtPm1hcGJhc2UgKyBvZnMtPnJkcjsKKwljb25maWcuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOworCisJcmV0ID0gZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzdG0zMnBvcnQtPnJ4X2NoLCAmY29uZmlnKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgInJ4IGRtYSBjaGFubmVsIGNvbmZpZyBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGNvbmZpZ19lcnI7CisJfQorCisJLyogUHJlcGFyZSBhIERNQSBjeWNsaWMgdHJhbnNhY3Rpb24gKi8KKwlkZXNjID0gZG1hZW5naW5lX3ByZXBfZG1hX2N5Y2xpYyhzdG0zMnBvcnQtPnJ4X2NoLAorCQkJCQkgc3RtMzJwb3J0LT5yeF9kbWFfYnVmLAorCQkJCQkgUlhfQlVGX0wsIFJYX0JVRl9QLCBETUFfREVWX1RPX01FTSwKKwkJCQkJIERNQV9QUkVQX0lOVEVSUlVQVCk7CisJaWYgKCFkZXNjKSB7CisJCWRldl9lcnIoZGV2LCAicnggZG1hIHByZXAgY3ljbGljIGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gY29uZmlnX2VycjsKKwl9CisKKwkvKiBObyBjYWxsYmFjayBhcyBkbWEgYnVmZmVyIGlzIGRyYWluZWQgb24gdXNhcnQgaW50ZXJydXB0ICovCisJZGVzYy0+Y2FsbGJhY2sgPSBOVUxMOworCWRlc2MtPmNhbGxiYWNrX3BhcmFtID0gTlVMTDsKKworCS8qIFB1c2ggY3VycmVudCBETUEgdHJhbnNhY3Rpb24gaW4gdGhlIHBlbmRpbmcgcXVldWUgKi8KKwljb29raWUgPSBkbWFlbmdpbmVfc3VibWl0KGRlc2MpOworCisJLyogSXNzdWUgcGVuZGluZyBETUEgcmVxdWVzdHMgKi8KKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhzdG0zMnBvcnQtPnJ4X2NoKTsKKworCXJldHVybiAwOworCitjb25maWdfZXJyOgorCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQkgIFJYX0JVRl9MLCBzdG0zMnBvcnQtPnJ4X2J1ZiwKKwkJCSAgc3RtMzJwb3J0LT5yeF9kbWFfYnVmKTsKKworYWxsb2NfZXJyOgorCWRtYV9yZWxlYXNlX2NoYW5uZWwoc3RtMzJwb3J0LT5yeF9jaCk7CisJc3RtMzJwb3J0LT5yeF9jaCA9IE5VTEw7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN0bTMyX29mX2RtYV90eF9wcm9iZShzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJwb3J0LAorCQkJCSBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJwb3J0LT5pbmZvLT5vZnM7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZzdG0zMnBvcnQtPnBvcnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBjb25maWc7CisJaW50IHJldDsKKworCXN0bTMycG9ydC0+dHhfZG1hX2J1c3kgPSBmYWxzZTsKKworCS8qIFJlcXVlc3QgRE1BIFRYIGNoYW5uZWwgKi8KKwlzdG0zMnBvcnQtPnR4X2NoID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbChkZXYsICJ0eCIpOworCWlmICghc3RtMzJwb3J0LT50eF9jaCkgeworCQlkZXZfaW5mbyhkZXYsICJ0eCBkbWEgYWxsb2MgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXN0bTMycG9ydC0+dHhfYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsIFRYX0JVRl9MLAorCQkJCQkJICZzdG0zMnBvcnQtPnR4X2RtYV9idWYsCisJCQkJCQkgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdG0zMnBvcnQtPnR4X2J1ZikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGFsbG9jX2VycjsKKwl9CisKKwkvKiBDb25maWd1cmUgRE1BIGNoYW5uZWwgKi8KKwltZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOworCWNvbmZpZy5kc3RfYWRkciA9IHBvcnQtPm1hcGJhc2UgKyBvZnMtPnRkcjsKKwljb25maWcuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOworCisJcmV0ID0gZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhzdG0zMnBvcnQtPnR4X2NoLCAmY29uZmlnKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgInR4IGRtYSBjaGFubmVsIGNvbmZpZyBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGNvbmZpZ19lcnI7CisJfQorCisJcmV0dXJuIDA7CisKK2NvbmZpZ19lcnI6CisJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCSAgVFhfQlVGX0wsIHN0bTMycG9ydC0+dHhfYnVmLAorCQkJICBzdG0zMnBvcnQtPnR4X2RtYV9idWYpOworCithbGxvY19lcnI6CisJZG1hX3JlbGVhc2VfY2hhbm5lbChzdG0zMnBvcnQtPnR4X2NoKTsKKwlzdG0zMnBvcnQtPnR4X2NoID0gTlVMTDsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgc3RtMzJfc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IHJldDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKIAlzdHJ1Y3Qgc3RtMzJfcG9ydCAqc3RtMzJwb3J0OworCWludCByZXQ7CiAKIAlzdG0zMnBvcnQgPSBzdG0zMl9vZl9nZXRfc3RtMzJfcG9ydChwZGV2KTsKIAlpZiAoIXN0bTMycG9ydCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZShzdG0zMl9tYXRjaCwgJnBkZXYtPmRldik7CisJaWYgKG1hdGNoICYmIG1hdGNoLT5kYXRhKQorCQlzdG0zMnBvcnQtPmluZm8gPSAoc3RydWN0IHN0bTMyX3VzYXJ0X2luZm8gKiltYXRjaC0+ZGF0YTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCiAJcmV0ID0gc3RtMzJfaW5pdF9wb3J0KHN0bTMycG9ydCwgcGRldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTU5Miw2ICs4NjQsMTQgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJcmV0ID0gc3RtMzJfb2ZfZG1hX3J4X3Byb2JlKHN0bTMycG9ydCwgcGRldik7CisJaWYgKHJldCkKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgImludGVycnVwdCBtb2RlIHVzZWQgZm9yIHJ4IChubyBkbWEpXG4iKTsKKworCXJldCA9IHN0bTMyX29mX2RtYV90eF9wcm9iZShzdG0zMnBvcnQsIHBkZXYpOworCWlmIChyZXQpCisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJpbnRlcnJ1cHQgbW9kZSB1c2VkIGZvciB0eCAobm8gZG1hKVxuIik7CisKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmc3RtMzJwb3J0LT5wb3J0KTsKIAogCXJldHVybiAwOwpAQCAtNjAwLDYgKzg4MCwzMCBAQAogc3RhdGljIGludCBzdG0zMl9zZXJpYWxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKworCXN0bTMyX2Nscl9iaXRzKHBvcnQsIG9mcy0+Y3IzLCBVU0FSVF9DUjNfRE1BUik7CisKKwlpZiAoc3RtMzJfcG9ydC0+cnhfY2gpCisJCWRtYV9yZWxlYXNlX2NoYW5uZWwoc3RtMzJfcG9ydC0+cnhfY2gpOworCisJaWYgKHN0bTMyX3BvcnQtPnJ4X2RtYV9idWYpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQkJICBSWF9CVUZfTCwgc3RtMzJfcG9ydC0+cnhfYnVmLAorCQkJCSAgc3RtMzJfcG9ydC0+cnhfZG1hX2J1Zik7CisKKwlzdG0zMl9jbHJfYml0cyhwb3J0LCBvZnMtPmNyMywgVVNBUlRfQ1IzX0RNQVQpOworCisJaWYgKHN0bTMyX3BvcnQtPnR4X2NoKQorCQlkbWFfcmVsZWFzZV9jaGFubmVsKHN0bTMyX3BvcnQtPnR4X2NoKTsKKworCWlmIChzdG0zMl9wb3J0LT50eF9kbWFfYnVmKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJCSAgVFhfQlVGX0wsIHN0bTMyX3BvcnQtPnR4X2J1ZiwKKwkJCQkgIHN0bTMyX3BvcnQtPnR4X2RtYV9idWYpOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHN0bTMyX3BvcnQtPmNsayk7CiAKIAlyZXR1cm4gdWFydF9yZW1vdmVfb25lX3BvcnQoJnN0bTMyX3VzYXJ0X2RyaXZlciwgcG9ydCk7CiB9CkBAIC02MDgsMTUgKzkxMiwyMSBAQAogI2lmZGVmIENPTkZJR19TRVJJQUxfU1RNMzJfQ09OU09MRQogc3RhdGljIHZvaWQgc3RtMzJfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjaCkKIHsKLQl3aGlsZSAoIShyZWFkbF9yZWxheGVkKHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9TUikgJiBVU0FSVF9TUl9UWEUpKQorCXN0cnVjdCBzdG0zMl9wb3J0ICpzdG0zMl9wb3J0ID0gdG9fc3RtMzJfcG9ydChwb3J0KTsKKwlzdHJ1Y3Qgc3RtMzJfdXNhcnRfb2Zmc2V0cyAqb2ZzID0gJnN0bTMyX3BvcnQtPmluZm8tPm9mczsKKworCXdoaWxlICghKHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIG9mcy0+aXNyKSAmIFVTQVJUX1NSX1RYRSkpCiAJCWNwdV9yZWxheCgpOwogCi0Jd3JpdGVsX3JlbGF4ZWQoY2gsIHBvcnQtPm1lbWJhc2UgKyBVU0FSVF9EUik7CisJd3JpdGVsX3JlbGF4ZWQoY2gsIHBvcnQtPm1lbWJhc2UgKyBvZnMtPnRkcik7CiB9CiAKIHN0YXRpYyB2b2lkIHN0bTMyX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBjbnQpCiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZzdG0zMl9wb3J0c1tjby0+aW5kZXhdLnBvcnQ7CisJc3RydWN0IHN0bTMyX3BvcnQgKnN0bTMyX3BvcnQgPSB0b19zdG0zMl9wb3J0KHBvcnQpOworCXN0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzICpvZnMgPSAmc3RtMzJfcG9ydC0+aW5mby0+b2ZzOworCXN0cnVjdCBzdG0zMl91c2FydF9jb25maWcgKmNmZyA9ICZzdG0zMl9wb3J0LT5pbmZvLT5jZmc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgb2xkX2NyMSwgbmV3X2NyMTsKIAlpbnQgbG9ja2VkID0gMTsKQEAgLTYyOSwxNSArOTM5LDE2IEBACiAJZWxzZQogCQlzcGluX2xvY2soJnBvcnQtPmxvY2spOwogCi0JLyogU2F2ZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0Jb2xkX2NyMSA9IHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIFVTQVJUX0NSMSk7CisJLyogU2F2ZSBhbmQgZGlzYWJsZSBpbnRlcnJ1cHRzLCBlbmFibGUgdGhlIHRyYW5zbWl0dGVyICovCisJb2xkX2NyMSA9IHJlYWRsX3JlbGF4ZWQocG9ydC0+bWVtYmFzZSArIG9mcy0+Y3IxKTsKIAluZXdfY3IxID0gb2xkX2NyMSAmIH5VU0FSVF9DUjFfSUVfTUFTSzsKLQl3cml0ZWxfcmVsYXhlZChuZXdfY3IxLCBwb3J0LT5tZW1iYXNlICsgVVNBUlRfQ1IxKTsKKwluZXdfY3IxIHw9ICBVU0FSVF9DUjFfVEUgfCBCSVQoY2ZnLT51YXJ0X2VuYWJsZV9iaXQpOworCXdyaXRlbF9yZWxheGVkKG5ld19jcjEsIHBvcnQtPm1lbWJhc2UgKyBvZnMtPmNyMSk7CiAKIAl1YXJ0X2NvbnNvbGVfd3JpdGUocG9ydCwgcywgY250LCBzdG0zMl9jb25zb2xlX3B1dGNoYXIpOwogCiAJLyogUmVzdG9yZSBpbnRlcnJ1cHQgc3RhdGUgKi8KLQl3cml0ZWxfcmVsYXhlZChvbGRfY3IxLCBwb3J0LT5tZW1iYXNlICsgVVNBUlRfQ1IxKTsKKwl3cml0ZWxfcmVsYXhlZChvbGRfY3IxLCBwb3J0LT5tZW1iYXNlICsgb2ZzLT5jcjEpOwogCiAJaWYgKGxvY2tlZCkKIAkJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3N0bTMyLXVzYXJ0LmggYi9kcml2ZXJzL3R0eS9zZXJpYWwvc3RtMzItdXNhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWQ5NzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3N0bTMyLXVzYXJ0LmgKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIE1heGltZSBDb3F1ZWxpbiAyMDE1CisgKiBBdXRob3JzOiAgTWF4aW1lIENvcXVlbGluIDxtY29xdWVsaW4uc3RtMzJAZ21haWwuY29tPgorICoJICAgICBHZXJhbGQgQmFlemEgPGdlcmFsZF9iYWV6YUB5YWhvby5mcj4KKyAqIExpY2Vuc2UgdGVybXM6ICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgdmVyc2lvbiAyCisgKi8KKworI2RlZmluZSBEUklWRVJfTkFNRSAic3RtMzItdXNhcnQiCisKK3N0cnVjdCBzdG0zMl91c2FydF9vZmZzZXRzIHsKKwl1OCBjcjE7CisJdTggY3IyOworCXU4IGNyMzsKKwl1OCBicnI7CisJdTggZ3RwcjsKKwl1OCBydG9yOworCXU4IHJxcjsKKwl1OCBpc3I7CisJdTggaWNyOworCXU4IHJkcjsKKwl1OCB0ZHI7Cit9OworCitzdHJ1Y3Qgc3RtMzJfdXNhcnRfY29uZmlnIHsKKwl1OCB1YXJ0X2VuYWJsZV9iaXQ7IC8qIFVTQVJUX0NSMV9VRSAqLworCWJvb2wgaGFzXzdiaXRzX2RhdGE7Cit9OworCitzdHJ1Y3Qgc3RtMzJfdXNhcnRfaW5mbyB7CisJc3RydWN0IHN0bTMyX3VzYXJ0X29mZnNldHMgb2ZzOworCXN0cnVjdCBzdG0zMl91c2FydF9jb25maWcgY2ZnOworfTsKKworI2RlZmluZSBVTkRFRl9SRUcgfjAKKworLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLworc3RydWN0IHN0bTMyX3VzYXJ0X2luZm8gc3RtMzJmNF9pbmZvID0geworCS5vZnMgPSB7CisJCS5pc3IJPSAweDAwLAorCQkucmRyCT0gMHgwNCwKKwkJLnRkcgk9IDB4MDQsCisJCS5icnIJPSAweDA4LAorCQkuY3IxCT0gMHgwYywKKwkJLmNyMgk9IDB4MTAsCisJCS5jcjMJPSAweDE0LAorCQkuZ3Rwcgk9IDB4MTgsCisJCS5ydG9yCT0gVU5ERUZfUkVHLAorCQkucnFyCT0gVU5ERUZfUkVHLAorCQkuaWNyCT0gVU5ERUZfUkVHLAorCX0sCisJLmNmZyA9IHsKKwkJLnVhcnRfZW5hYmxlX2JpdCA9IDEzLAorCQkuaGFzXzdiaXRzX2RhdGEgPSBmYWxzZSwKKwl9Cit9OworCitzdHJ1Y3Qgc3RtMzJfdXNhcnRfaW5mbyBzdG0zMmY3X2luZm8gPSB7CisJLm9mcyA9IHsKKwkJLmNyMQk9IDB4MDAsCisJCS5jcjIJPSAweDA0LAorCQkuY3IzCT0gMHgwOCwKKwkJLmJycgk9IDB4MGMsCisJCS5ndHByCT0gMHgxMCwKKwkJLnJ0b3IJPSAweDE0LAorCQkucnFyCT0gMHgxOCwKKwkJLmlzcgk9IDB4MWMsCisJCS5pY3IJPSAweDIwLAorCQkucmRyCT0gMHgyNCwKKwkJLnRkcgk9IDB4MjgsCisJfSwKKwkuY2ZnID0geworCQkudWFydF9lbmFibGVfYml0ID0gMCwKKwkJLmhhc183Yml0c19kYXRhID0gdHJ1ZSwKKwl9Cit9OworCisvKiBVU0FSVF9TUiAoRjQpIC8gVVNBUlRfSVNSIChGNykgKi8KKyNkZWZpbmUgVVNBUlRfU1JfUEUJCUJJVCgwKQorI2RlZmluZSBVU0FSVF9TUl9GRQkJQklUKDEpCisjZGVmaW5lIFVTQVJUX1NSX05GCQlCSVQoMikKKyNkZWZpbmUgVVNBUlRfU1JfT1JFCQlCSVQoMykKKyNkZWZpbmUgVVNBUlRfU1JfSURMRQkJQklUKDQpCisjZGVmaW5lIFVTQVJUX1NSX1JYTkUJCUJJVCg1KQorI2RlZmluZSBVU0FSVF9TUl9UQwkJQklUKDYpCisjZGVmaW5lIFVTQVJUX1NSX1RYRQkJQklUKDcpCisjZGVmaW5lIFVTQVJUX1NSX0xCRAkJQklUKDgpCisjZGVmaW5lIFVTQVJUX1NSX0NUU0lGCQlCSVQoOSkKKyNkZWZpbmUgVVNBUlRfU1JfQ1RTCQlCSVQoMTApCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9TUl9SVE9GCQlCSVQoMTEpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9TUl9FT0JGCQlCSVQoMTIpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9TUl9BQlJFCQlCSVQoMTQpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9TUl9BQlJGCQlCSVQoMTUpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9TUl9CVVNZCQlCSVQoMTYpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9TUl9DTUYJCUJJVCgxNykJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1NSX1NCS0YJCUJJVCgxOCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1NSX1RFQUNLCQlCSVQoMjEpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9TUl9FUlJfTUFTSwkoVVNBUlRfU1JfTEJEIHwgVVNBUlRfU1JfT1JFIHwgXAorCQkJCSBVU0FSVF9TUl9GRSB8IFVTQVJUX1NSX1BFKQorLyogRHVtbXkgYml0cyAqLworI2RlZmluZSBVU0FSVF9TUl9EVU1NWV9SWAlCSVQoMTYpCisKKy8qIFVTQVJUX0lDUiAoRjcpICovCisjZGVmaW5lIFVTQVJUX0NSX1RDCQlCSVQoNikKKworLyogVVNBUlRfRFIgKi8KKyNkZWZpbmUgVVNBUlRfRFJfTUFTSwkJR0VOTUFTSyg4LCAwKQorCisvKiBVU0FSVF9CUlIgKi8KKyNkZWZpbmUgVVNBUlRfQlJSX0RJVl9GX01BU0sJR0VOTUFTSygzLCAwKQorI2RlZmluZSBVU0FSVF9CUlJfRElWX01fTUFTSwlHRU5NQVNLKDE1LCA0KQorI2RlZmluZSBVU0FSVF9CUlJfRElWX01fU0hJRlQJNAorCisvKiBVU0FSVF9DUjEgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX1NCSwkJQklUKDApCisjZGVmaW5lIFVTQVJUX0NSMV9SV1UJCUJJVCgxKQkJLyogRjQgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX1JFCQlCSVQoMikKKyNkZWZpbmUgVVNBUlRfQ1IxX1RFCQlCSVQoMykKKyNkZWZpbmUgVVNBUlRfQ1IxX0lETEVJRQlCSVQoNCkKKyNkZWZpbmUgVVNBUlRfQ1IxX1JYTkVJRQlCSVQoNSkKKyNkZWZpbmUgVVNBUlRfQ1IxX1RDSUUJCUJJVCg2KQorI2RlZmluZSBVU0FSVF9DUjFfVFhFSUUJCUJJVCg3KQorI2RlZmluZSBVU0FSVF9DUjFfUEVJRQkJQklUKDgpCisjZGVmaW5lIFVTQVJUX0NSMV9QUwkJQklUKDkpCisjZGVmaW5lIFVTQVJUX0NSMV9QQ0UJCUJJVCgxMCkKKyNkZWZpbmUgVVNBUlRfQ1IxX1dBS0UJCUJJVCgxMSkKKyNkZWZpbmUgVVNBUlRfQ1IxX00JCUJJVCgxMikKKyNkZWZpbmUgVVNBUlRfQ1IxX00wCQlCSVQoMTIpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjFfTU1FCQlCSVQoMTMpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjFfQ01JRQkJQklUKDE0KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX09WRVI4CQlCSVQoMTUpCisjZGVmaW5lIFVTQVJUX0NSMV9ERURUX01BU0sJR0VOTUFTSygyMCwgMTYpCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMV9ERUFUX01BU0sJR0VOTUFTSygyNSwgMjEpCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMV9SVE9JRQkJQklUKDI2KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IxX0VPQklFCQlCSVQoMjcpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjFfTTEJCUJJVCgyOCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMV9JRV9NQVNLCShHRU5NQVNLKDgsIDQpIHwgQklUKDE0KSB8IEJJVCgyNikgfCBCSVQoMjcpKQorCisvKiBVU0FSVF9DUjIgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX0FERF9NQVNLCUdFTk1BU0soMywgMCkJLyogRjQgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX0FERE03CQlCSVQoNCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMl9MQkRMCQlCSVQoNSkKKyNkZWZpbmUgVVNBUlRfQ1IyX0xCRElFCQlCSVQoNikKKyNkZWZpbmUgVVNBUlRfQ1IyX0xCQ0wJCUJJVCg4KQorI2RlZmluZSBVU0FSVF9DUjJfQ1BIQQkJQklUKDkpCisjZGVmaW5lIFVTQVJUX0NSMl9DUE9MCQlCSVQoMTApCisjZGVmaW5lIFVTQVJUX0NSMl9DTEtFTgkJQklUKDExKQorI2RlZmluZSBVU0FSVF9DUjJfU1RPUF8yQglCSVQoMTMpCisjZGVmaW5lIFVTQVJUX0NSMl9TVE9QX01BU0sJR0VOTUFTSygxMywgMTIpCisjZGVmaW5lIFVTQVJUX0NSMl9MSU5FTgkJQklUKDE0KQorI2RlZmluZSBVU0FSVF9DUjJfU1dBUAkJQklUKDE1KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX1JYSU5WCQlCSVQoMTYpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjJfVFhJTlYJCUJJVCgxNykJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMl9EQVRBSU5WCUJJVCgxOCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMl9NU0JGSVJTVAlCSVQoMTkpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjJfQUJSRU4JCUJJVCgyMCkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0NSMl9BQlJNT0RfTUFTSwlHRU5NQVNLKDIyLCAyMSkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IyX1JUT0VOCQlCSVQoMjMpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjJfQUREX0Y3X01BU0sJR0VOTUFTSygzMSwgMjQpCS8qIEY3ICovCisKKy8qIFVTQVJUX0NSMyAqLworI2RlZmluZSBVU0FSVF9DUjNfRUlFCQlCSVQoMCkKKyNkZWZpbmUgVVNBUlRfQ1IzX0lSRU4JCUJJVCgxKQorI2RlZmluZSBVU0FSVF9DUjNfSVJMUAkJQklUKDIpCisjZGVmaW5lIFVTQVJUX0NSM19IRFNFTAkJQklUKDMpCisjZGVmaW5lIFVTQVJUX0NSM19OQUNLCQlCSVQoNCkKKyNkZWZpbmUgVVNBUlRfQ1IzX1NDRU4JCUJJVCg1KQorI2RlZmluZSBVU0FSVF9DUjNfRE1BUgkJQklUKDYpCisjZGVmaW5lIFVTQVJUX0NSM19ETUFUCQlCSVQoNykKKyNkZWZpbmUgVVNBUlRfQ1IzX1JUU0UJCUJJVCg4KQorI2RlZmluZSBVU0FSVF9DUjNfQ1RTRQkJQklUKDkpCisjZGVmaW5lIFVTQVJUX0NSM19DVFNJRQkJQklUKDEwKQorI2RlZmluZSBVU0FSVF9DUjNfT05FQklUCUJJVCgxMSkKKyNkZWZpbmUgVVNBUlRfQ1IzX09WUkRJUwlCSVQoMTIpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9DUjNfRERSRQkJQklUKDEzKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IzX0RFTQkJQklUKDE0KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IzX0RFUAkJQklUKDE1KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfQ1IzX1NDQVJDTlRfTUFTSwlHRU5NQVNLKDE5LCAxNykJLyogRjcgKi8KKworLyogVVNBUlRfR1RQUiAqLworI2RlZmluZSBVU0FSVF9HVFBSX1BTQ19NQVNLCUdFTk1BU0soNywgMCkKKyNkZWZpbmUgVVNBUlRfR1RQUl9HVF9NQVNLCUdFTk1BU0soMTUsIDgpCisKKy8qIFVTQVJUX1JUT1IgKi8KKyNkZWZpbmUgVVNBUlRfUlRPUl9SVE9fTUFTSwlHRU5NQVNLKDIzLCAwKQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9SVE9SX0JMRU5fTUFTSwlHRU5NQVNLKDMxLCAyNCkJLyogRjcgKi8KKworLyogVVNBUlRfUlFSICovCisjZGVmaW5lIFVTQVJUX1JRUl9BQlJSUQkJQklUKDApCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9SUVJfU0JLUlEJCUJJVCgxKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfUlFSX01NUlEJCUJJVCgyKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfUlFSX1JYRlJRCQlCSVQoMykJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX1JRUl9UWEZSUQkJQklUKDQpCQkvKiBGNyAqLworCisvKiBVU0FSVF9JQ1IgKi8KKyNkZWZpbmUgVVNBUlRfSUNSX1BFQ0YJCUJJVCgwKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfSUNSX0ZGRUNGCQlCSVQoMSkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0lDUl9OQ0YJCUJJVCgyKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfSUNSX09SRUNGCQlCSVQoMykJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0lDUl9JRExFQ0YJQklUKDQpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9JQ1JfVENDRgkJQklUKDYpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9JQ1JfTEJEQ0YJCUJJVCg4KQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfSUNSX0NUU0NGCQlCSVQoOSkJCS8qIEY3ICovCisjZGVmaW5lIFVTQVJUX0lDUl9SVE9DRgkJQklUKDExKQkJLyogRjcgKi8KKyNkZWZpbmUgVVNBUlRfSUNSX0VPQkNGCQlCSVQoMTIpCQkvKiBGNyAqLworI2RlZmluZSBVU0FSVF9JQ1JfQ01DRgkJQklUKDE3KQkJLyogRjcgKi8KKworI2RlZmluZSBTVE0zMl9TRVJJQUxfTkFNRSAidHR5UyIKKyNkZWZpbmUgU1RNMzJfTUFYX1BPUlRTIDYKKworI2RlZmluZSBSWF9CVUZfTCAyMDAJCSAvKiBkbWEgcnggYnVmZmVyIGxlbmd0aCAgICAgKi8KKyNkZWZpbmUgUlhfQlVGX1AgUlhfQlVGX0wJIC8qIGRtYSByeCBidWZmZXIgcGVyaW9kICAgICAqLworI2RlZmluZSBUWF9CVUZfTCAyMDAJCSAvKiBkbWEgdHggYnVmZmVyIGxlbmd0aCAgICAgKi8KKworc3RydWN0IHN0bTMyX3BvcnQgeworCXN0cnVjdCB1YXJ0X3BvcnQgcG9ydDsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IHN0bTMyX3VzYXJ0X2luZm8gKmluZm87CisJc3RydWN0IGRtYV9jaGFuICpyeF9jaDsgIC8qIGRtYSByeCBjaGFubmVsICAgICAgICAgICAgKi8KKwlkbWFfYWRkcl90IHJ4X2RtYV9idWY7ICAgLyogZG1hIHJ4IGJ1ZmZlciBidXMgYWRkcmVzcyAqLworCXVuc2lnbmVkIGNoYXIgKnJ4X2J1ZjsgICAvKiBkbWEgcnggYnVmZmVyIGNwdSBhZGRyZXNzICovCisJc3RydWN0IGRtYV9jaGFuICp0eF9jaDsgIC8qIGRtYSB0eCBjaGFubmVsICAgICAgICAgICAgKi8KKwlkbWFfYWRkcl90IHR4X2RtYV9idWY7ICAgLyogZG1hIHR4IGJ1ZmZlciBidXMgYWRkcmVzcyAqLworCXVuc2lnbmVkIGNoYXIgKnR4X2J1ZjsgICAvKiBkbWEgdHggYnVmZmVyIGNwdSBhZGRyZXNzICovCisJYm9vbCB0eF9kbWFfYnVzeTsJIC8qIGRtYSB0eCBidXN5ICAgICAgICAgICAgICAgKi8KKwlib29sIGh3X2Zsb3dfY29udHJvbDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3RtMzJfcG9ydCBzdG0zMl9wb3J0c1tTVE0zMl9NQVhfUE9SVFNdOworc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBzdG0zMl91c2FydF9kcml2ZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvdGltYnVhcnQuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC90aW1idWFydC5jCmluZGV4IDUxMmMxNjIuLjVkYTdmZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC90aW1idWFydC5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC90aW1idWFydC5jCkBAIC0zOTQsNyArMzk0LDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyB0aW1idWFydF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVhcnRfb3BzIHRpbWJ1YXJ0X29wcyA9IHsKIAkudHhfZW1wdHkgPSB0aW1idWFydF90eF9lbXB0eSwKIAkuc2V0X21jdHJsID0gdGltYnVhcnRfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwgPSB0aW1idWFydF9nZXRfbWN0cmwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvdWFydGxpdGUuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC91YXJ0bGl0ZS5jCmluZGV4IDA1MDg5YjYuLjgxN2JiMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC91YXJ0bGl0ZS5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC91YXJ0bGl0ZS5jCkBAIC0zODcsNyArMzg3LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHVhcnRfb3BzIHVsaXRlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdWFydF9vcHMgdWxpdGVfb3BzID0gewogCS50eF9lbXB0eQk9IHVsaXRlX3R4X2VtcHR5LAogCS5zZXRfbWN0cmwJPSB1bGl0ZV9zZXRfbWN0cmwsCiAJLmdldF9tY3RybAk9IHVsaXRlX2dldF9tY3RybCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC92dDg1MDBfc2VyaWFsLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdnQ4NTAwX3NlcmlhbC5jCmluZGV4IDIzY2ZjNWUuLjZiODVhZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC92dDg1MDBfc2VyaWFsLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3Z0ODUwMF9zZXJpYWwuYwpAQCAtMTE4LDcgKzExOCw3IEBACiAgKiBoYXZlIGJlZW4gYWxsb2NhdGVkIGFzIHdlIGNhbid0IHVzZSBwZGV2LT5pZCBpbgogICogZGV2aWNldHJlZQogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB2dDg1MDBfcG9ydHNfaW5fdXNlOworc3RhdGljIERFQ0xBUkVfQklUTUFQKHZ0ODUwMF9wb3J0c19pbl91c2UsIFZUODUwMF9NQVhfUE9SVFMpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgdnQ4NTAwX3dyaXRlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB2YWwsCiAJCQkgICAgIHVuc2lnbmVkIGludCBvZmYpCkBAIC02NjMsMTUgKzY2MywxNSBAQAogCiAJaWYgKHBvcnQgPCAwKSB7CiAJCS8qIGNhbGN1bGF0ZSB0aGUgcG9ydCBpZCAqLwotCQlwb3J0ID0gZmluZF9maXJzdF96ZXJvX2JpdCgmdnQ4NTAwX3BvcnRzX2luX3VzZSwKLQkJCQkJc2l6ZW9mKHZ0ODUwMF9wb3J0c19pbl91c2UpKTsKKwkJcG9ydCA9IGZpbmRfZmlyc3RfemVyb19iaXQodnQ4NTAwX3BvcnRzX2luX3VzZSwKKwkJCQkJICAgVlQ4NTAwX01BWF9QT1JUUyk7CiAJfQogCiAJaWYgKHBvcnQgPj0gVlQ4NTAwX01BWF9QT1JUUykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiByZXNlcnZlIHRoZSBwb3J0IGlkICovCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQocG9ydCwgJnZ0ODUwMF9wb3J0c19pbl91c2UpKSB7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQocG9ydCwgdnQ4NTAwX3BvcnRzX2luX3VzZSkpIHsKIAkJLyogcG9ydCBhbHJlYWR5IGluIHVzZSAtIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuICovCiAJCXJldHVybiAtRUJVU1k7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3hpbGlueF91YXJ0cHMuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC94aWxpbnhfdWFydHBzLmMKaW5kZXggOWNhMWE0ZC4uZjM3ZWRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3hpbGlueF91YXJ0cHMuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwveGlsaW54X3VhcnRwcy5jCkBAIC01Nyw3ICs1Nyw3IEBACiAjZGVmaW5lIENETlNfVUFSVF9JTVIJCTB4MTAgIC8qIEludGVycnVwdCBNYXNrICovCiAjZGVmaW5lIENETlNfVUFSVF9JU1IJCTB4MTQgIC8qIEludGVycnVwdCBTdGF0dXMgKi8KICNkZWZpbmUgQ0ROU19VQVJUX0JBVURHRU4JMHgxOCAgLyogQmF1ZCBSYXRlIEdlbmVyYXRvciAqLwotI2RlZmluZSBDRE5TX1VBUlRfUlhUT1VUCQkweDFDICAvKiBSWCBUaW1lb3V0ICovCisjZGVmaW5lIENETlNfVUFSVF9SWFRPVVQJMHgxQyAgLyogUlggVGltZW91dCAqLwogI2RlZmluZSBDRE5TX1VBUlRfUlhXTQkJMHgyMCAgLyogUlggRklGTyBUcmlnZ2VyIExldmVsICovCiAjZGVmaW5lIENETlNfVUFSVF9NT0RFTUNSCTB4MjQgIC8qIE1vZGVtIENvbnRyb2wgKi8KICNkZWZpbmUgQ0ROU19VQVJUX01PREVNU1IJMHgyOCAgLyogTW9kZW0gU3RhdHVzICovCkBAIC02OCw2ICs2OCw3IEBACiAjZGVmaW5lIENETlNfVUFSVF9JUlJYX1BXSURUSAkweDNDICAvKiBJUiBNaW4gUmVjZWl2ZWQgUHVsc2UgV2lkdGggKi8KICNkZWZpbmUgQ0ROU19VQVJUX0lSVFhfUFdJRFRICTB4NDAgIC8qIElSIFRyYW5zbWl0dGVkIHB1bHNlIFdpZHRoICovCiAjZGVmaW5lIENETlNfVUFSVF9UWFdNCQkweDQ0ICAvKiBUWCBGSUZPIFRyaWdnZXIgTGV2ZWwgKi8KKyNkZWZpbmUgQ0ROU19VQVJUX1JYQlMJCTB4NDggIC8qIFJYIEZJRk8gYnl0ZSBzdGF0dXMgcmVnaXN0ZXIgKi8KIAogLyogQ29udHJvbCBSZWdpc3RlciBCaXQgRGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgQ0ROU19VQVJUX0NSX1NUT1BCUksJMHgwMDAwMDEwMCAgLyogU3RvcCBUWCBicmVhayAqLwpAQCAtNzksNiArODAsOSBAQAogI2RlZmluZSBDRE5TX1VBUlRfQ1JfVFhSU1QJMHgwMDAwMDAwMiAgLyogVFggbG9naWMgcmVzZXQgKi8KICNkZWZpbmUgQ0ROU19VQVJUX0NSX1JYUlNUCTB4MDAwMDAwMDEgIC8qIFJYIGxvZ2ljIHJlc2V0ICovCiAjZGVmaW5lIENETlNfVUFSVF9DUl9SU1RfVE8JMHgwMDAwMDA0MCAgLyogUmVzdGFydCBUaW1lb3V0IENvdW50ZXIgKi8KKyNkZWZpbmUgQ0ROU19VQVJUX1JYQlNfUEFSSVRZICAgIDB4MDAwMDAwMDEgLyogUGFyaXR5IGVycm9yIHN0YXR1cyAqLworI2RlZmluZSBDRE5TX1VBUlRfUlhCU19GUkFNSU5HICAgMHgwMDAwMDAwMiAvKiBGcmFtaW5nIGVycm9yIHN0YXR1cyAqLworI2RlZmluZSBDRE5TX1VBUlRfUlhCU19CUksgICAgICAgMHgwMDAwMDAwNCAvKiBPdmVycnVuIGVycm9yIHN0YXR1cyAqLwogCiAvKgogICogTW9kZSBSZWdpc3RlcjoKQEAgLTEyNiwxMyArMTMwLDI3IEBACiAjZGVmaW5lIENETlNfVUFSVF9JWFJfUlhFTVBUWQkweDAwMDAwMDAyIC8qIFJYIEZJRk8gZW1wdHkgaW50ZXJydXB0LiAqLwogI2RlZmluZSBDRE5TX1VBUlRfSVhSX01BU0sJMHgwMDAwMUZGRiAvKiBWYWxpZCBiaXQgbWFzayAqLwogCi0jZGVmaW5lIENETlNfVUFSVF9SWF9JUlFTCShDRE5TX1VBUlRfSVhSX1BBUklUWSB8IENETlNfVUFSVF9JWFJfRlJBTUlORyB8IFwKLQkJCQkgQ0ROU19VQVJUX0lYUl9PVkVSUlVOIHwgQ0ROU19VQVJUX0lYUl9SWFRSSUcgfCBcCisJLyoKKwkgKiBEbyBub3QgZW5hYmxlIHBhcml0eSBlcnJvciBpbnRlcnJ1cHQgZm9yIHRoZSBmb2xsb3dpbmcKKwkgKiByZWFzb246IFdoZW4gcGFyaXR5IGVycm9yIGludGVycnVwdCBpcyBlbmFibGVkLCBlYWNoIFJ4CisJICogcGFyaXR5IGVycm9yIGFsd2F5cyByZXN1bHRzIGluIDIgZXZlbnRzLiBUaGUgZmlyc3Qgb25lCisJICogYmVpbmcgcGFyaXR5IGVycm9yIGludGVycnVwdCBhbmQgdGhlIHNlY29uZCBvbmUgd2l0aCBhCisJICogcHJvcGVyIFJ4IGludGVycnVwdCB3aXRoIHRoZSBpbmNvbWluZyBkYXRhLiAgRGlzYWJsaW5nCisJICogcGFyaXR5IGVycm9yIGludGVycnVwdCBlbnN1cmVzIGJldHRlciBoYW5kbGluZyBvZiBwYXJpdHkKKwkgKiBlcnJvciBldmVudHMuIFdpdGggdGhpcyBjaGFuZ2UsIGZvciBhIHBhcml0eSBlcnJvciBjYXNlLCB3ZQorCSAqIGdldCBhIFJ4IGludGVycnVwdCB3aXRoIHBhcml0eSBlcnJvciBzZXQgaW4gSVNSIHJlZ2lzdGVyCisJICogYW5kIHdlIHN0aWxsIGhhbmRsZSBwYXJpdHkgZXJyb3JzIGluIHRoZSBkZXNpcmVkIHdheS4KKwkgKi8KKworI2RlZmluZSBDRE5TX1VBUlRfUlhfSVJRUwkoQ0ROU19VQVJUX0lYUl9GUkFNSU5HIHwgXAorCQkJCSBDRE5TX1VBUlRfSVhSX09WRVJSVU4gfCBcCisJCQkJIENETlNfVUFSVF9JWFJfUlhUUklHIHwJIFwKIAkJCQkgQ0ROU19VQVJUX0lYUl9UT1VUKQogCiAvKiBHb2VzIGluIHJlYWRfc3RhdHVzX21hc2sgZm9yIGJyZWFrIGRldGVjdGlvbiBhcyB0aGUgSFcgZG9lc24ndCBkbyBpdCovCi0jZGVmaW5lIENETlNfVUFSVF9JWFJfQlJLCTB4ODAwMDAwMDAKKyNkZWZpbmUgQ0ROU19VQVJUX0lYUl9CUksJMHgwMDAwMjAwMAogCisjZGVmaW5lIENETlNfVUFSVF9SWEJTX1NVUFBPUlQgQklUKDEpCiAvKgogICogTW9kZW0gQ29udHJvbCByZWdpc3RlcjoKICAqIFRoZSByZWFkL3dyaXRlIE1vZGVtIENvbnRyb2wgcmVnaXN0ZXIgY29udHJvbHMgdGhlIGludGVyZmFjZSB3aXRoIHRoZSBtb2RlbQpAQCAtMTcyLDQ2ICsxOTAsNjYgQEAKIAlzdHJ1Y3QgY2xrCQkqcGNsazsKIAl1bnNpZ25lZCBpbnQJCWJhdWQ7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCWNsa19yYXRlX2NoYW5nZV9uYjsKKwl1MzIJCQlxdWlya3M7Cit9Oworc3RydWN0IGNkbnNfcGxhdGZvcm1fZGF0YSB7CisJdTMyIHF1aXJrczsKIH07CiAjZGVmaW5lIHRvX2NkbnNfdWFydChfbmIpIGNvbnRhaW5lcl9vZihfbmIsIHN0cnVjdCBjZG5zX3VhcnQsIFwKIAkJY2xrX3JhdGVfY2hhbmdlX25iKTsKIAotc3RhdGljIHZvaWQgY2Ruc191YXJ0X2hhbmRsZV9yeChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgaXNyc3RhdHVzKQorLyoqCisgKiBjZG5zX3VhcnRfaGFuZGxlX3J4IC0gSGFuZGxlIHRoZSByZWNlaXZlZCBieXRlcyBhbG9uZyB3aXRoIFJ4IGVycm9ycy4KKyAqIEBkZXZfaWQ6IElkIG9mIHRoZSBVQVJUIHBvcnQKKyAqIEBpc3JzdGF0dXM6IFRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHZhbHVlIGFzIHJlYWQKKyAqIFJldHVybjogTm9uZQorICovCitzdGF0aWMgdm9pZCBjZG5zX3VhcnRfaGFuZGxlX3J4KHZvaWQgKmRldl9pZCwgdW5zaWduZWQgaW50IGlzcnN0YXR1cykKIHsKLQkvKgotCSAqIFRoZXJlIGlzIG5vIGhhcmR3YXJlIGJyZWFrIGRldGVjdGlvbiwgc28gd2UgaW50ZXJwcmV0IGZyYW1pbmcKLQkgKiBlcnJvciB3aXRoIGFsbC16ZXJvcyBkYXRhIGFzIGEgYnJlYWsgc2VxdWVuY2UuIE1vc3Qgb2YgdGhlIHRpbWUsCi0JICogdGhlcmUncyBhbm90aGVyIG5vbi16ZXJvIGJ5dGUgYXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UuCi0JICovCi0JaWYgKGlzcnN0YXR1cyAmIENETlNfVUFSVF9JWFJfRlJBTUlORykgewotCQl3aGlsZSAoIShyZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX1NSKSAmCi0JCQkJCUNETlNfVUFSVF9TUl9SWEVNUFRZKSkgewotCQkJaWYgKCFyZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0ZJRk8pKSB7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdWFydF9wb3J0ICopZGV2X2lkOworCXN0cnVjdCBjZG5zX3VhcnQgKmNkbnNfdWFydCA9IHBvcnQtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKwl1bnNpZ25lZCBpbnQgcnhic19zdGF0dXMgPSAwOworCXVuc2lnbmVkIGludCBzdGF0dXNfbWFzazsKKwl1bnNpZ25lZCBpbnQgZnJhbWVycnByb2Nlc3NlZCA9IDA7CisJY2hhciBzdGF0dXMgPSBUVFlfTk9STUFMOworCWJvb2wgaXNfcnhic19zdXBwb3J0OworCisJaXNfcnhic19zdXBwb3J0ID0gY2Ruc191YXJ0LT5xdWlya3MgJiBDRE5TX1VBUlRfUlhCU19TVVBQT1JUOworCisJd2hpbGUgKChyZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX1NSKSAmCisJCUNETlNfVUFSVF9TUl9SWEVNUFRZKSAhPSBDRE5TX1VBUlRfU1JfUlhFTVBUWSkgeworCQlpZiAoaXNfcnhic19zdXBwb3J0KQorCQkJcnhic19zdGF0dXMgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX1JYQlMpOworCQlkYXRhID0gcmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9GSUZPKTsKKwkJcG9ydC0+aWNvdW50LnJ4Kys7CisJCS8qCisJCSAqIFRoZXJlIGlzIG5vIGhhcmR3YXJlIGJyZWFrIGRldGVjdGlvbiBpbiBaeW5xLCBzbyB3ZSBpbnRlcnByZXQKKwkJICogZnJhbWluZyBlcnJvciB3aXRoIGFsbC16ZXJvcyBkYXRhIGFzIGEgYnJlYWsgc2VxdWVuY2UuCisJCSAqIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZXJlJ3MgYW5vdGhlciBub24temVybyBieXRlIGF0IHRoZQorCQkgKiBlbmQgb2YgdGhlIHNlcXVlbmNlLgorCQkgKi8KKwkJaWYgKCFpc19yeGJzX3N1cHBvcnQgJiYgKGlzcnN0YXR1cyAmIENETlNfVUFSVF9JWFJfRlJBTUlORykpIHsKKwkJCWlmICghZGF0YSkgewogCQkJCXBvcnQtPnJlYWRfc3RhdHVzX21hc2sgfD0gQ0ROU19VQVJUX0lYUl9CUks7Ci0JCQkJaXNyc3RhdHVzICY9IH5DRE5TX1VBUlRfSVhSX0ZSQU1JTkc7CisJCQkJZnJhbWVycnByb2Nlc3NlZCA9IDE7CisJCQkJY29udGludWU7CiAJCQl9CiAJCX0KLQkJd3JpdGVsKENETlNfVUFSVF9JWFJfRlJBTUlORywgcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9JU1IpOwotCX0KKwkJaWYgKGlzX3J4YnNfc3VwcG9ydCAmJiAocnhic19zdGF0dXMgJiBDRE5TX1VBUlRfUlhCU19CUkspKSB7CisJCQlwb3J0LT5pY291bnQuYnJrKys7CisJCQlzdGF0dXMgPSBUVFlfQlJFQUs7CisJCQlpZiAodWFydF9oYW5kbGVfYnJlYWsocG9ydCkpCisJCQkJY29udGludWU7CisJCX0KIAotCS8qIGRyb3AgYnl0ZSB3aXRoIHBhcml0eSBlcnJvciBpZiBJR05QQVIgc3BlY2lmaWVkICovCi0JaWYgKGlzcnN0YXR1cyAmIHBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayAmIENETlNfVUFSVF9JWFJfUEFSSVRZKQotCQlpc3JzdGF0dXMgJj0gfihDRE5TX1VBUlRfSVhSX1JYVFJJRyB8IENETlNfVUFSVF9JWFJfVE9VVCk7CisJCWlzcnN0YXR1cyAmPSBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCQlpc3JzdGF0dXMgJj0gfnBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzazsKKwkJc3RhdHVzX21hc2sgPSBwb3J0LT5yZWFkX3N0YXR1c19tYXNrOworCQlzdGF0dXNfbWFzayAmPSB+cG9ydC0+aWdub3JlX3N0YXR1c19tYXNrOwogCi0JaXNyc3RhdHVzICY9IHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7Ci0JaXNyc3RhdHVzICY9IH5wb3J0LT5pZ25vcmVfc3RhdHVzX21hc2s7Ci0KLQlpZiAoIShpc3JzdGF0dXMgJiAoQ0ROU19VQVJUX0lYUl9UT1VUIHwgQ0ROU19VQVJUX0lYUl9SWFRSSUcpKSkKLQkJcmV0dXJuOwotCi0Jd2hpbGUgKCEocmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9TUikgJiBDRE5TX1VBUlRfU1JfUlhFTVBUWSkpIHsKLQkJdTMyIGRhdGE7Ci0JCWNoYXIgc3RhdHVzID0gVFRZX05PUk1BTDsKLQotCQlkYXRhID0gcmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9GSUZPKTsKLQotCQkvKiBOb24tTlVMTCBieXRlIGFmdGVyIEJSRUFLIGlzIGdhcmJhZ2UgKDk5JSkgKi8KLQkJaWYgKGRhdGEgJiYgKHBvcnQtPnJlYWRfc3RhdHVzX21hc2sgJiBDRE5TX1VBUlRfSVhSX0JSSykpIHsKKwkJaWYgKGRhdGEgJiYKKwkJICAgIChwb3J0LT5yZWFkX3N0YXR1c19tYXNrICYgQ0ROU19VQVJUX0lYUl9CUkspKSB7CiAJCQlwb3J0LT5yZWFkX3N0YXR1c19tYXNrICY9IH5DRE5TX1VBUlRfSVhSX0JSSzsKIAkJCXBvcnQtPmljb3VudC5icmsrKzsKIAkJCWlmICh1YXJ0X2hhbmRsZV9icmVhayhwb3J0KSkKQEAgLTIyMSw1NyArMjU5LDgzIEBACiAJCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKHBvcnQsIGRhdGEpKQogCQkJY29udGludWU7CiAKLQkJcG9ydC0+aWNvdW50LnJ4Kys7Ci0KLQkJaWYgKGlzcnN0YXR1cyAmIENETlNfVUFSVF9JWFJfUEFSSVRZKSB7Ci0JCQlwb3J0LT5pY291bnQucGFyaXR5Kys7Ci0JCQlzdGF0dXMgPSBUVFlfUEFSSVRZOwotCQl9IGVsc2UgaWYgKGlzcnN0YXR1cyAmIENETlNfVUFSVF9JWFJfRlJBTUlORykgewotCQkJcG9ydC0+aWNvdW50LmZyYW1lKys7Ci0JCQlzdGF0dXMgPSBUVFlfRlJBTUU7Ci0JCX0gZWxzZSBpZiAoaXNyc3RhdHVzICYgQ0ROU19VQVJUX0lYUl9PVkVSUlVOKSB7Ci0JCQlwb3J0LT5pY291bnQub3ZlcnJ1bisrOworCQlpZiAoaXNfcnhic19zdXBwb3J0KSB7CisJCQlpZiAoKHJ4YnNfc3RhdHVzICYgQ0ROU19VQVJUX1JYQlNfUEFSSVRZKQorCQkJICAgICYmIChzdGF0dXNfbWFzayAmIENETlNfVUFSVF9JWFJfUEFSSVRZKSkgeworCQkJCXBvcnQtPmljb3VudC5wYXJpdHkrKzsKKwkJCQlzdGF0dXMgPSBUVFlfUEFSSVRZOworCQkJfQorCQkJaWYgKChyeGJzX3N0YXR1cyAmIENETlNfVUFSVF9SWEJTX0ZSQU1JTkcpCisJCQkgICAgJiYgKHN0YXR1c19tYXNrICYgQ0ROU19VQVJUX0lYUl9QQVJJVFkpKSB7CisJCQkJcG9ydC0+aWNvdW50LmZyYW1lKys7CisJCQkJc3RhdHVzID0gVFRZX0ZSQU1FOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGlzcnN0YXR1cyAmIENETlNfVUFSVF9JWFJfUEFSSVRZKSB7CisJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOworCQkJCXN0YXR1cyA9IFRUWV9QQVJJVFk7CisJCQl9CisJCQlpZiAoKGlzcnN0YXR1cyAmIENETlNfVUFSVF9JWFJfRlJBTUlORykgJiYKKwkJCSAgICAhZnJhbWVycnByb2Nlc3NlZCkgeworCQkJCXBvcnQtPmljb3VudC5mcmFtZSsrOworCQkJCXN0YXR1cyA9IFRUWV9GUkFNRTsKKwkJCX0KIAkJfQotCi0JCXVhcnRfaW5zZXJ0X2NoYXIocG9ydCwgaXNyc3RhdHVzLCBDRE5TX1VBUlRfSVhSX09WRVJSVU4sCi0JCQkJIGRhdGEsIHN0YXR1cyk7CisJCWlmIChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfSVhSX09WRVJSVU4pIHsKKwkJCXBvcnQtPmljb3VudC5vdmVycnVuKys7CisJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcigmcG9ydC0+c3RhdGUtPnBvcnQsIDAsCisJCQkJCSAgICAgVFRZX09WRVJSVU4pOworCQl9CisJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKCZwb3J0LT5zdGF0ZS0+cG9ydCwgZGF0YSwgc3RhdHVzKTsKKwkJaXNyc3RhdHVzID0gMDsKIAl9CisJc3Bpbl91bmxvY2soJnBvcnQtPmxvY2spOwogCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKCZwb3J0LT5zdGF0ZS0+cG9ydCk7CisJc3Bpbl9sb2NrKCZwb3J0LT5sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgY2Ruc191YXJ0X2hhbmRsZV90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQorLyoqCisgKiBjZG5zX3VhcnRfaGFuZGxlX3R4IC0gSGFuZGxlIHRoZSBieXRlcyB0byBiZSBUeGVkLgorICogQGRldl9pZDogSWQgb2YgdGhlIFVBUlQgcG9ydAorICogUmV0dXJuOiBOb25lCisgKi8KK3N0YXRpYyB2b2lkIGNkbnNfdWFydF9oYW5kbGVfdHgodm9pZCAqZGV2X2lkKQogeworCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAoc3RydWN0IHVhcnRfcG9ydCAqKWRldl9pZDsKIAl1bnNpZ25lZCBpbnQgbnVtYnl0ZXM7CiAKIAlpZiAodWFydF9jaXJjX2VtcHR5KCZwb3J0LT5zdGF0ZS0+eG1pdCkpIHsKIAkJd3JpdGVsKENETlNfVUFSVF9JWFJfVFhFTVBUWSwgcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9JRFIpOwotCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJbnVtYnl0ZXMgPSBwb3J0LT5maWZvc2l6ZTsKKwkJd2hpbGUgKG51bWJ5dGVzICYmICF1YXJ0X2NpcmNfZW1wdHkoJnBvcnQtPnN0YXRlLT54bWl0KSAmJgorCQkgICAgICAgIShyZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX1NSKSAmIENETlNfVUFSVF9TUl9UWEZVTEwpKSB7CisJCQkvKgorCQkJICogR2V0IHRoZSBkYXRhIGZyb20gdGhlIFVBUlQgY2lyY3VsYXIgYnVmZmVyCisJCQkgKiBhbmQgd3JpdGUgaXQgdG8gdGhlIGNkbnNfdWFydCdzIFRYX0ZJRk8KKwkJCSAqIHJlZ2lzdGVyLgorCQkJICovCisJCQl3cml0ZWwoCisJCQkJcG9ydC0+c3RhdGUtPnhtaXQuYnVmW3BvcnQtPnN0YXRlLT54bWl0LgorCQkJCXRhaWxdLCBwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0ZJRk8pOworCisJCQlwb3J0LT5pY291bnQudHgrKzsKKworCQkJLyoKKwkJCSAqIEFkanVzdCB0aGUgdGFpbCBvZiB0aGUgVUFSVCBidWZmZXIgYW5kIHdyYXAKKwkJCSAqIHRoZSBidWZmZXIgaWYgaXQgcmVhY2hlcyBsaW1pdC4KKwkJCSAqLworCQkJcG9ydC0+c3RhdGUtPnhtaXQudGFpbCA9CisJCQkJKHBvcnQtPnN0YXRlLT54bWl0LnRhaWwgKyAxKSAmCisJCQkJCShVQVJUX1hNSVRfU0laRSAtIDEpOworCisJCQludW1ieXRlcy0tOworCQl9CisKKwkJaWYgKHVhcnRfY2lyY19jaGFyc19wZW5kaW5nKAorCQkJCSZwb3J0LT5zdGF0ZS0+eG1pdCkgPCBXQUtFVVBfQ0hBUlMpCisJCQl1YXJ0X3dyaXRlX3dha2V1cChwb3J0KTsKIAl9Ci0KLQludW1ieXRlcyA9IHBvcnQtPmZpZm9zaXplOwotCXdoaWxlIChudW1ieXRlcyAmJiAhdWFydF9jaXJjX2VtcHR5KCZwb3J0LT5zdGF0ZS0+eG1pdCkgJiYKLQkgICAgICAgIShyZWFkbChwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX1NSKSAmIENETlNfVUFSVF9TUl9UWEZVTEwpKSB7Ci0JCS8qCi0JCSAqIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBVQVJUIGNpcmN1bGFyIGJ1ZmZlcgotCQkgKiBhbmQgd3JpdGUgaXQgdG8gdGhlIGNkbnNfdWFydCdzIFRYX0ZJRk8KLQkJICogcmVnaXN0ZXIuCi0JCSAqLwotCQl3cml0ZWwocG9ydC0+c3RhdGUtPnhtaXQuYnVmW3BvcnQtPnN0YXRlLT54bWl0LnRhaWxdLAotCQkJcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9GSUZPKTsKLQkJcG9ydC0+aWNvdW50LnR4Kys7Ci0KLQkJLyoKLQkJICogQWRqdXN0IHRoZSB0YWlsIG9mIHRoZSBVQVJUIGJ1ZmZlciBhbmQgd3JhcAotCQkgKiB0aGUgYnVmZmVyIGlmIGl0IHJlYWNoZXMgbGltaXQuCi0JCSAqLwotCQlwb3J0LT5zdGF0ZS0+eG1pdC50YWlsID0KLQkJCShwb3J0LT5zdGF0ZS0+eG1pdC50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKLQotCQludW1ieXRlcy0tOwotCX0KLQotCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZygmcG9ydC0+c3RhdGUtPnhtaXQpIDwgV0FLRVVQX0NIQVJTKQotCQl1YXJ0X3dyaXRlX3dha2V1cChwb3J0KTsKIH0KIAogLyoqCkBAIC0yODQsMjcgKzM0OCwyNCBAQAogc3RhdGljIGlycXJldHVybl90IGNkbnNfdWFydF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQgPSAoc3RydWN0IHVhcnRfcG9ydCAqKWRldl9pZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBpc3JzdGF0dXM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CiAKIAkvKiBSZWFkIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHRvIGRldGVybWluZSB3aGljaAotCSAqIGludGVycnVwdChzKSBpcy9hcmUgYWN0aXZlLgorCSAqIGludGVycnVwdChzKSBpcy9hcmUgYWN0aXZlIGFuZCBjbGVhciB0aGVtLgogCSAqLwogCWlzcnN0YXR1cyA9IHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfSVNSKTsKLQotCWlmIChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfUlhfSVJRUykKLQkJY2Ruc191YXJ0X2hhbmRsZV9yeChwb3J0LCBpc3JzdGF0dXMpOwotCi0JaWYgKChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfSVhSX1RYRU1QVFkpID09IENETlNfVUFSVF9JWFJfVFhFTVBUWSkKLQkJY2Ruc191YXJ0X2hhbmRsZV90eChwb3J0KTsKLQogCXdyaXRlbChpc3JzdGF0dXMsIHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfSVNSKTsKIAotCS8qIGJlIHN1cmUgdG8gcmVsZWFzZSB0aGUgbG9jayBhbmQgdHR5IGJlZm9yZSBsZWF2aW5nICovCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCWlmIChpc3JzdGF0dXMgJiBDRE5TX1VBUlRfSVhSX1RYRU1QVFkpIHsKKwkJY2Ruc191YXJ0X2hhbmRsZV90eChkZXZfaWQpOworCQlpc3JzdGF0dXMgJj0gfkNETlNfVUFSVF9JWFJfVFhFTVBUWTsKKwl9CisJaWYgKGlzcnN0YXR1cyAmIENETlNfVUFSVF9JWFJfTUFTSykKKwkJY2Ruc191YXJ0X2hhbmRsZV9yeChkZXZfaWQsIGlzcnN0YXR1cyk7CiAKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC02NTMsNiArNzE0LDEwIEBACiAJY3RybF9yZWcgfD0gQ0ROU19VQVJUX0NSX1RYUlNUIHwgQ0ROU19VQVJUX0NSX1JYUlNUOwogCXdyaXRlbChjdHJsX3JlZywgcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9DUik7CiAKKwl3aGlsZSAocmVhZGwocG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9DUikgJgorCQkoQ0ROU19VQVJUX0NSX1RYUlNUIHwgQ0ROU19VQVJUX0NSX1JYUlNUKSkKKwkJY3B1X3JlbGF4KCk7CisKIAkvKgogCSAqIENsZWFyIHRoZSBSWCBkaXNhYmxlIGFuZCBUWCBkaXNhYmxlIGJpdHMgYW5kIHRoZW4gc2V0IHRoZSBUWCBlbmFibGUKIAkgKiBiaXQgYW5kIFJYIGVuYWJsZSBiaXQgdG8gZW5hYmxlIHRoZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIuCkBAIC03MzYsMTAgKzgwMSwxNCBAQAogICovCiBzdGF0aWMgaW50IGNkbnNfdWFydF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IGNkbnNfdWFydCAqY2Ruc191YXJ0ID0gcG9ydC0+cHJpdmF0ZV9kYXRhOworCWJvb2wgaXNfYnJrX3N1cHBvcnQ7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBzdGF0dXMgPSAwOwogCisJaXNfYnJrX3N1cHBvcnQgPSBjZG5zX3VhcnQtPnF1aXJrcyAmIENETlNfVUFSVF9SWEJTX1NVUFBPUlQ7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCiAJLyogRGlzYWJsZSB0aGUgVFggYW5kIFJYICovCkBAIC03NTIsNiArODIxLDEwIEBACiAJd3JpdGVsKENETlNfVUFSVF9DUl9UWFJTVCB8IENETlNfVUFSVF9DUl9SWFJTVCwKIAkJCXBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfQ1IpOwogCisJd2hpbGUgKHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfQ1IpICYKKwkJKENETlNfVUFSVF9DUl9UWFJTVCB8IENETlNfVUFSVF9DUl9SWFJTVCkpCisJCWNwdV9yZWxheCgpOworCiAJLyoKIAkgKiBDbGVhciB0aGUgUlggZGlzYWJsZSBiaXQgYW5kIHRoZW4gc2V0IHRoZSBSWCBlbmFibGUgYml0IHRvIGVuYWJsZQogCSAqIHRoZSByZWNlaXZlci4KQEAgLTc5NCw3ICs4NjcsMTEgQEAKIAl9CiAKIAkvKiBTZXQgdGhlIEludGVycnVwdCBSZWdpc3RlcnMgd2l0aCBkZXNpcmVkIGludGVycnVwdHMgKi8KLQl3cml0ZWwoQ0ROU19VQVJUX1JYX0lSUVMsIHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfSUVSKTsKKwlpZiAoaXNfYnJrX3N1cHBvcnQpCisJCXdyaXRlbChDRE5TX1VBUlRfUlhfSVJRUyB8IENETlNfVUFSVF9JWFJfQlJLLAorCQkJCQlwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0lFUik7CisJZWxzZQorCQl3cml0ZWwoQ0ROU19VQVJUX1JYX0lSUVMsIHBvcnQtPm1lbWJhc2UgKyBDRE5TX1VBUlRfSUVSKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTkzLDcgKzEwNzAsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBjZG5zX3VhcnRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB1YXJ0X29wcyBjZG5zX3VhcnRfb3BzID0gewogCS5zZXRfbWN0cmwJPSBjZG5zX3VhcnRfc2V0X21jdHJsLAogCS5nZXRfbWN0cmwJPSBjZG5zX3VhcnRfZ2V0X21jdHJsLAogCS5zdGFydF90eAk9IGNkbnNfdWFydF9zdGFydF90eCwKQEAgLTEwODgsOSArMTE2NSwzNCBAQAogc3RhdGljIGludCBfX2luaXQgY2Ruc19lYXJseV9jb25zb2xlX3NldHVwKHN0cnVjdCBlYXJseWNvbl9kZXZpY2UgKmRldmljZSwKIAkJCQkJICAgY29uc3QgY2hhciAqb3B0KQogewotCWlmICghZGV2aWNlLT5wb3J0Lm1lbWJhc2UpCisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZkZXZpY2UtPnBvcnQ7CisKKwlpZiAoIXBvcnQtPm1lbWJhc2UpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyogaW5pdGlhbGlzZSBjb250cm9sIHJlZ2lzdGVyICovCisJd3JpdGVsKENETlNfVUFSVF9DUl9UWF9FTnxDRE5TX1VBUlRfQ1JfVFhSU1R8Q0ROU19VQVJUX0NSX1JYUlNULAorCSAgICAgICBwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0NSKTsKKworCS8qIG9ubHkgc2V0IGJhdWQgaWYgc3BlY2lmaWVkIG9uIGNvbW1hbmQgbGluZSAtIG90aGVyd2lzZQorCSAqIGFzc3VtZSBpdCBoYXMgYmVlbiBpbml0aWFsaXplZCBieSBhIGJvb3QgbG9hZGVyLgorCSAqLworCWlmIChkZXZpY2UtPmJhdWQpIHsKKwkJdTMyIGNkID0gMCwgYmRpdiA9IDA7CisJCXUzMiBtcjsKKwkJaW50IGRpdjg7CisKKwkJY2Ruc191YXJ0X2NhbGNfYmF1ZF9kaXZzKHBvcnQtPnVhcnRjbGssIGRldmljZS0+YmF1ZCwKKwkJCQkJICZiZGl2LCAmY2QsICZkaXY4KTsKKwkJbXIgPSBDRE5TX1VBUlRfTVJfUEFSSVRZX05PTkU7CisJCWlmIChkaXY4KQorCQkJbXIgfD0gQ0ROU19VQVJUX01SX0NMS1NFTDsKKworCQl3cml0ZWwobXIsICAgcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9NUik7CisJCXdyaXRlbChjZCwgICBwb3J0LT5tZW1iYXNlICsgQ0ROU19VQVJUX0JBVURHRU4pOworCQl3cml0ZWwoYmRpdiwgcG9ydC0+bWVtYmFzZSArIENETlNfVUFSVF9CQVVERElWKTsKKwl9CisKIAlkZXZpY2UtPmNvbi0+d3JpdGUgPSBjZG5zX2Vhcmx5X3dyaXRlOwogCiAJcmV0dXJuIDA7CkBAIC0xMzI4LDYgKzE0MzAsMTggQEAKIHN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhjZG5zX3VhcnRfZGV2X3BtX29wcywgY2Ruc191YXJ0X3N1c3BlbmQsCiAJCWNkbnNfdWFydF9yZXN1bWUpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGNkbnNfcGxhdGZvcm1fZGF0YSB6eW5xbXBfdWFydF9kZWYgPSB7CisJCQkJLnF1aXJrcyA9IENETlNfVUFSVF9SWEJTX1NVUFBPUlQsIH07CisKKy8qIE1hdGNoIHRhYmxlIGZvciBvZl9wbGF0Zm9ybSBiaW5kaW5nICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjZG5zX3VhcnRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInhsbngseHVhcnRwcyIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJjZG5zLHVhcnQtcjFwOCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJjZG5zLHVhcnQtcjFwMTIiLCAuZGF0YSA9ICZ6eW5xbXBfdWFydF9kZWYgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGNkbnNfdWFydF9vZl9tYXRjaCk7CisKIC8qKgogICogY2Ruc191YXJ0X3Byb2JlIC0gUGxhdGZvcm0gZHJpdmVyIHByb2JlCiAgKiBAcGRldjogUG9pbnRlciB0byB0aGUgcGxhdGZvcm0gZGV2aWNlIHN0cnVjdHVyZQpAQCAtMTM0MCwxMiArMTQ1NCwyMCBAQAogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJc3RydWN0IGNkbnNfdWFydCAqY2Ruc191YXJ0X2RhdGE7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CiAKIAljZG5zX3VhcnRfZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNkbnNfdWFydF9kYXRhKSwKIAkJCUdGUF9LRVJORUwpOwogCWlmICghY2Ruc191YXJ0X2RhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKGNkbnNfdWFydF9vZl9tYXRjaCwgcGRldi0+ZGV2Lm9mX25vZGUpOworCWlmIChtYXRjaCAmJiBtYXRjaC0+ZGF0YSkgeworCQljb25zdCBzdHJ1Y3QgY2Ruc19wbGF0Zm9ybV9kYXRhICpkYXRhID0gbWF0Y2gtPmRhdGE7CisKKwkJY2Ruc191YXJ0X2RhdGEtPnF1aXJrcyA9IGRhdGEtPnF1aXJrczsKKwl9CisKIAljZG5zX3VhcnRfZGF0YS0+cGNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAicGNsayIpOwogCWlmIChJU19FUlIoY2Ruc191YXJ0X2RhdGEtPnBjbGspKSB7CiAJCWNkbnNfdWFydF9kYXRhLT5wY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJhcGVyX2NsayIpOwpAQCAtMTQ3MSwxNCArMTU5Myw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0vKiBNYXRjaCB0YWJsZSBmb3Igb2ZfcGxhdGZvcm0gYmluZGluZyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2Ruc191YXJ0X29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJ4bG54LHh1YXJ0cHMiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiY2Rucyx1YXJ0LXIxcDgiLCB9LAotCXt9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgY2Ruc191YXJ0X29mX21hdGNoKTsKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2Ruc191YXJ0X3BsYXRmb3JtX2RyaXZlciA9IHsKIAkucHJvYmUgICA9IGNkbnNfdWFydF9wcm9iZSwKIAkucmVtb3ZlICA9IGNkbnNfdWFydF9yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS92dC92dC5jIGIvZHJpdmVycy90dHkvdnQvdnQuYwppbmRleCAyNzA1Y2E5Li5lODQxYTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS92dC92dC5jCisrKyBiL2RyaXZlcnMvdHR5L3Z0L3Z0LmMKQEAgLTEzMTIsMTIgKzEzMTIsMTIgQEAKIAlpZiAoaSA+IHZjLT52Y19ucGFyKQogCQlyZXR1cm4gaTsKIAotCWlmICh2Yy0+dmNfcGFyW2ldID09IDUgJiYgaSA8IHZjLT52Y19ucGFyKSB7Ci0JCS8qIDI1NiBjb2xvdXJzIC0tIHViaXF1aXRvdXMgKi8KKwlpZiAodmMtPnZjX3BhcltpXSA9PSA1ICYmIGkgKyAxIDw9IHZjLT52Y19ucGFyKSB7CisJCS8qIDI1NiBjb2xvdXJzICovCiAJCWkrKzsKIAkJcmdiX2Zyb21fMjU2KHZjLT52Y19wYXJbaV0sICZjKTsKLQl9IGVsc2UgaWYgKHZjLT52Y19wYXJbaV0gPT0gMiAmJiBpIDw9IHZjLT52Y19ucGFyICsgMykgewotCQkvKiAyNCBiaXQgLS0gZXh0cmVtZWx5IHJhcmUgKi8KKwl9IGVsc2UgaWYgKHZjLT52Y19wYXJbaV0gPT0gMiAmJiBpICsgMyA8PSB2Yy0+dmNfbnBhcikgeworCQkvKiAyNCBiaXQgKi8KIAkJYy5yID0gdmMtPnZjX3BhcltpICsgMV07CiAJCWMuZyA9IHZjLT52Y19wYXJbaSArIDJdOwogCQljLmIgPSB2Yy0+dmNfcGFyW2kgKyAzXTsKQEAgLTE0MTUsNiArMTQxNSwxMSBAQAogCQkJCSh2Yy0+dmNfY29sb3IgJiAweDBmKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgorCQkJaWYgKHZjLT52Y19wYXJbaV0gPj0gOTAgJiYgdmMtPnZjX3BhcltpXSA8PSAxMDcpIHsKKwkJCQlpZiAodmMtPnZjX3BhcltpXSA8IDEwMCkKKwkJCQkJdmMtPnZjX2ludGVuc2l0eSA9IDI7CisJCQkJdmMtPnZjX3BhcltpXSAtPSA2MDsKKwkJCX0KIAkJCWlmICh2Yy0+dmNfcGFyW2ldID49IDMwICYmIHZjLT52Y19wYXJbaV0gPD0gMzcpCiAJCQkJdmMtPnZjX2NvbG9yID0gY29sb3JfdGFibGVbdmMtPnZjX3BhcltpXSAtIDMwXQogCQkJCQl8ICh2Yy0+dmNfY29sb3IgJiAweGYwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdWlvL3Vpb19kbWVtX2dlbmlycS5jIGIvZHJpdmVycy91aW8vdWlvX2RtZW1fZ2VuaXJxLmMKaW5kZXggOTE1ZmFjYi4uZTExMzRhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91aW8vdWlvX2RtZW1fZ2VuaXJxLmMKKysrIGIvZHJpdmVycy91aW8vdWlvX2RtZW1fZ2VuaXJxLmMKQEAgLTIyOSw3ICsyMjksNyBAQAogCQkrK3Vpb21lbTsKIAl9CiAKLQlwcml2LT5kbWVtX3JlZ2lvbl9zdGFydCA9IGk7CisJcHJpdi0+ZG1lbV9yZWdpb25fc3RhcnQgPSB1aW9tZW0gLSAmdWlvaW5mby0+bWVtWzBdOwogCXByaXYtPm51bV9kbWVtX3JlZ2lvbnMgPSBwZGF0YS0+bnVtX2R5bmFtaWNfcmVnaW9uczsKIAogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX2R5bmFtaWNfcmVnaW9uczsgKytpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvS2NvbmZpZwppbmRleCA4Njg5ZGNiLi42NDRlOTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL0tjb25maWcKQEAgLTE1Miw3ICsxNTIsOCBAQAogCiBjb25maWcgVVNCX0xFRF9UUklHCiAJYm9vbCAiVVNCIExFRCBUcmlnZ2VycyIKLQlkZXBlbmRzIG9uIExFRFNfQ0xBU1MgJiYgVVNCX0NPTU1PTiAmJiBMRURTX1RSSUdHRVJTCisJZGVwZW5kcyBvbiBMRURTX0NMQVNTICYmIExFRFNfVFJJR0dFUlMKKwlzZWxlY3QgVVNCX0NPTU1PTgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgTEVEIHRyaWdnZXJzIGZvciBVU0IgaG9zdCBhbmQvb3IgZ2FkZ2V0IGFjdGl2aXR5LgogCkBAIC0xNjAsNCArMTYxLDI1IEBACiAJICBMRURzIGFuZCB5b3Ugd2FudCB0byB1c2UgdGhlbSBhcyBhY3Rpdml0eSBpbmRpY2F0b3JzIGZvciBVU0IgaG9zdCBvcgogCSAgZ2FkZ2V0LgogCitjb25maWcgVVNCX1VMUElfQlVTCisJdHJpc3RhdGUgIlVTQiBVTFBJIFBIWSBpbnRlcmZhY2Ugc3VwcG9ydCIKKwlzZWxlY3QgVVNCX0NPTU1PTgorCWhlbHAKKwkgIFVUTUkrIExvdyBQaW4gSW50ZXJmYWNlIChVTFBJKSBpcyBzcGVjaWZpY2F0aW9uIGZvciBhIGNvbW1vbmx5IHVzZWQKKwkgIFVTQiAyLjAgUEhZIGludGVyZmFjZS4gVGhlIFVMUEkgc3BlY2lmaWNhdGlvbiBkZWZpbmVzIGEgc3RhbmRhcmQgc2V0CisJICBvZiByZWdpc3RlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlY3QgdGhlIHZlbmRvciBhbmQgcHJvZHVjdCB3aGljaAorCSAgYWxsb3dzIFVMUEkgdG8gYmUgaGFuZGxlZCBhcyBhIGJ1cy4gVGhpcyBtb2R1bGUgaXMgdGhlIGRyaXZlciBmb3IgdGhhdAorCSAgYnVzLgorCisJICBUaGUgVUxQSSBpbnRlcmZhY2VzICh0aGUgYnVzZXMpIGFyZSByZWdpc3RlcmVkIGJ5IHRoZSBkcml2ZXJzIGZvciBVU0IKKwkgIGNvbnRyb2xsZXJzIHdoaWNoIHN1cHBvcnQgVUxQSSByZWdpc3RlciBhY2Nlc3MgYW5kIGhhdmUgVUxQSSBQSFkKKwkgIGF0dGFjaGVkIHRvIHRoZW0uIFRoZSBVTFBJIFBIWSBkcml2ZXJzIHRoZW1zZWx2ZXMgYXJlIG5vcm1hbCBQSFkKKwkgIGRyaXZlcnMuCisKKwkgIFVMUEkgUEhZcyBwcm92aWRlIG9mdGVuIGZ1bmN0aW9ucyBzdWNoIGFzIEFEUCBzZW5zaW5nL3Byb2JpbmcgKE9URworCSAgcHJvdG9jb2wpIGFuZCBVU0IgY2hhcmdlciBkZXRlY3Rpb24uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIHVscGkuCisKIGVuZGlmICMgVVNCX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYyBiL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYwppbmRleCAwYTg2NmU5Li5mOWZlODZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvYXRtL2N4YWNydS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS9jeGFjcnUuYwpAQCAtMTEzOSwxMCArMTEzOSw4IEBACiAKIAkvKiBpbnN0YW5jZSBpbml0ICovCiAJaW5zdGFuY2UgPSBremFsbG9jKHNpemVvZigqaW5zdGFuY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWluc3RhbmNlKSB7Ci0JCXVzYl9kYmcodXNiYXRtX2luc3RhbmNlLCAiY3hhY3J1X2JpbmQ6IG5vIG1lbW9yeSBmb3IgaW5zdGFuY2UgZGF0YVxuIik7CisJaWYgKCFpbnN0YW5jZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJaW5zdGFuY2UtPnVzYmF0bSA9IHVzYmF0bV9pbnN0YW5jZTsKIAlpbnN0YW5jZS0+bW9kZW1fdHlwZSA9IChzdHJ1Y3QgY3hhY3J1X21vZGVtX3R5cGUgKikgaWQtPmRyaXZlcl9pbmZvOwpAQCAtMTE2OCwxMyArMTE2NiwxMSBAQAogCX0KIAlpbnN0YW5jZS0+cmN2X3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbnN0YW5jZS0+cmN2X3VyYikgewotCQl1c2JfZGJnKHVzYmF0bV9pbnN0YW5jZSwgImN4YWNydV9iaW5kOiBubyBtZW1vcnkgZm9yIHJjdl91cmJcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWw7CiAJfQogCWluc3RhbmNlLT5zbmRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluc3RhbmNlLT5zbmRfdXJiKSB7Ci0JCXVzYl9kYmcodXNiYXRtX2luc3RhbmNlLCAiY3hhY3J1X2JpbmQ6IG5vIG1lbW9yeSBmb3Igc25kX3VyYlxuIik7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vc3BlZWR0Y2guYyBiL2RyaXZlcnMvdXNiL2F0bS9zcGVlZHRjaC5jCmluZGV4IDAyNzBkMTMuLjUwODNlYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS9zcGVlZHRjaC5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS9zcGVlZHRjaC5jCkBAIC04MTcsNyArODE3LDYgQEAKIAlpbnN0YW5jZSA9IGt6YWxsb2Moc2l6ZW9mKCppbnN0YW5jZSksIEdGUF9LRVJORUwpOwogCiAJaWYgKCFpbnN0YW5jZSkgewotCQl1c2JfZXJyKHVzYmF0bSwgIiVzOiBubyBtZW1vcnkgZm9yIGluc3RhbmNlIGRhdGEhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbF9yZWxlYXNlOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMgYi9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCmluZGV4IDQzMzNkYzUuLmRmNjc4MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKKysrIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwpAQCAtMjE5NiwxNyArMjE5NiwxMiBAQAogCQlsb2FkX1hJTElOWF9maXJtd2FyZShzYyk7CiAKIAlpbnRyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWludHIpIHsKLQkJdWVhX2VycihJTlNfVE9fVVNCREVWKHNjKSwKLQkJICAgICAgICJjYW5ub3QgYWxsb2NhdGUgaW50ZXJydXB0IHBhY2thZ2VcbiIpOworCWlmICghaW50cikKIAkJZ290byBlcnIwOwotCX0KIAogCXNjLT51cmJfaW50ID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNjLT51cmJfaW50KSB7Ci0JCXVlYV9lcnIoSU5TX1RPX1VTQkRFVihzYyksICJjYW5ub3QgYWxsb2NhdGUgaW50ZXJydXB0IFVSQlxuIik7CisJaWYgKCFzYy0+dXJiX2ludCkKIAkJZ290byBlcnIxOwotCX0KIAogCXVzYl9maWxsX2ludF91cmIoc2MtPnVyYl9pbnQsIHNjLT51c2JfZGV2LAogCQkJIHVzYl9yY3ZpbnRwaXBlKHNjLT51c2JfZGV2LCBVRUFfSU5UUl9QSVBFKSwKQEAgLTI1NjEsMTAgKzI1NTYsOCBAQAogCX0KIAogCXNjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVlYV9zb2Z0YyksIEdGUF9LRVJORUwpOwotCWlmICghc2MpIHsKLQkJdWVhX2Vycih1c2IsICJ1ZWFfaW5pdDogbm90IGVub3VnaCBtZW1vcnkgIVxuIik7CisJaWYgKCFzYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJc2MtPnVzYl9kZXYgPSB1c2I7CiAJdXNiYXRtLT5kcml2ZXJfZGF0YSA9IHNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jIGIvZHJpdmVycy91c2IvYXRtL3VzYmF0bS5jCmluZGV4IGRiMzIyZDkuLjRkZWM5ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2F0bS91c2JhdG0uYworKysgYi9kcml2ZXJzL3VzYi9hdG0vdXNiYXRtLmMKQEAgLTgxOSw3ICs4MTksNiBAQAogCiAJbmV3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYmF0bV92Y2NfZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghbmV3KSB7Ci0JCWF0bV9lcnIoaW5zdGFuY2UsICIlczogbm8gbWVtb3J5IGZvciB2Y2NfZGF0YSFcbiIsIF9fZnVuY19fKTsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmYWlsOwogCX0KQEAgLTEwMzIsMTAgKzEwMzEsOCBAQAogCiAJLyogaW5zdGFuY2UgaW5pdCAqLwogCWluc3RhbmNlID0ga3phbGxvYyhzaXplb2YoKmluc3RhbmNlKSArIHNpemVvZihzdHJ1Y3QgdXJiICopICogKG51bV9yY3ZfdXJicyArIG51bV9zbmRfdXJicyksIEdGUF9LRVJORUwpOwotCWlmICghaW5zdGFuY2UpIHsKLQkJZGV2X2VycihkZXYsICIlczogbm8gbWVtb3J5IGZvciBpbnN0YW5jZSBkYXRhIVxuIiwgX19mdW5jX18pOworCWlmICghaW5zdGFuY2UpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCS8qIHB1YmxpYyBmaWVsZHMgKi8KIApAQCAtMTE0MSw3ICsxMTM4LDYgQEAKIAogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKGlzb19wYWNrZXRzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKLQkJCWRldl9lcnIoZGV2LCAiJXM6IG5vIG1lbW9yeSBmb3IgdXJiICVkIVxuIiwgX19mdW5jX18sIGkpOwogCQkJZXJyb3IgPSAtRU5PTUVNOwogCQkJZ290byBmYWlsX3VuYmluZDsKIAkJfQpAQCAtMTE1MSw3ICsxMTQ3LDYgQEAKIAkJLyogemVybyB0aGUgdHggcGFkZGluZyB0byBhdm9pZCBsZWFraW5nIGluZm9ybWF0aW9uICovCiAJCWJ1ZmZlciA9IGt6YWxsb2MoY2hhbm5lbC0+YnVmX3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWJ1ZmZlcikgewotCQkJZGV2X2VycihkZXYsICIlczogbm8gbWVtb3J5IGZvciBidWZmZXIgJWQhXG4iLCBfX2Z1bmNfXywgaSk7CiAJCQllcnJvciA9IC1FTk9NRU07CiAJCQlnb3RvIGZhaWxfdW5iaW5kOwogCQl9CkBAIC0xMTgyLDcgKzExNzcsNiBAQAogCWluc3RhbmNlLT5jZWxsX2J1ZiA9IGttYWxsb2MoaW5zdGFuY2UtPnJ4X2NoYW5uZWwuc3RyaWRlLCBHRlBfS0VSTkVMKTsKIAogCWlmICghaW5zdGFuY2UtPmNlbGxfYnVmKSB7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IG5vIG1lbW9yeSBmb3IgY2VsbCBidWZmZXIhXG4iLCBfX2Z1bmNfXyk7CiAJCWVycm9yID0gLUVOT01FTTsKIAkJZ290byBmYWlsX3VuYmluZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5jIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguYwppbmRleCBkZWRjMzNlLi4wOTkxNzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmMKQEAgLTE0MCw2ICsxNDAsOSBAQAogCWlmIChvZl9maW5kX3Byb3BlcnR5KG5wLCAiZGlzYWJsZS1vdmVyLWN1cnJlbnQiLCBOVUxMKSkKIAkJZGF0YS0+ZGlzYWJsZV9vYyA9IDE7CiAKKwlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgIm92ZXItY3VycmVudC1hY3RpdmUtaGlnaCIsIE5VTEwpKQorCQlkYXRhLT5vY19wb2xhcml0eSA9IDE7CisKIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgImV4dGVybmFsLXZidXMtZGl2aWRlciIsIE5VTEwpKQogCQlkYXRhLT5ldmRvID0gMTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguaCBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmgKaW5kZXggNjM1NzE3ZS4uNDA5YWE1Y2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5oCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmgKQEAgLTE3LDYgKzE3LDcgQEAKIAlpbnQgaW5kZXg7CiAKIAl1bnNpZ25lZCBpbnQgZGlzYWJsZV9vYzoxOyAvKiBvdmVyIGN1cnJlbnQgZGV0ZWN0IGRpc2FibGVkICovCisJdW5zaWduZWQgaW50IG9jX3BvbGFyaXR5OjE7IC8qIG92ZXIgY3VycmVudCBwb2xhcml0eSBpZiBvYyBlbmFibGVkICovCiAJdW5zaWduZWQgaW50IGV2ZG86MTsgLyogc2V0IGV4dGVybmFsIHZidXMgZGl2aWRlciBvcHRpb24gKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2hvc3QuYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2hvc3QuYwppbmRleCAwNTNiYWM5Li45NmFlNjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvaG9zdC5jCkBAIC04MSwxMiArODEsMTUgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoY2QtPnNlbGYuY29udHJvbGxlcjsKIAlzdHJ1Y3QgY2lfaGRyYyAqY2kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgZWhjaV9oY2QgKmVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOwogCWludCByZXQ7CiAKIAlyZXQgPSBlaGNpX3NldHVwKGhjZCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCWVoY2ktPm5lZWRfaW9fd2F0Y2hkb2cgPSAwOworCiAJY2lfcGxhdGZvcm1fY29uZmlndXJlKGNpKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS91ZGMuYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VkYy5jCmluZGV4IDA2NWY1ZDkuLjY2MWY0M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VkYy5jCkBAIC01OSw3ICs1OSw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGh3X2VwX2JpdChpbnQgbnVtLCBpbnQgZGlyKQogewotCXJldHVybiBudW0gKyAoZGlyID8gMTYgOiAwKTsKKwlyZXR1cm4gbnVtICsgKChkaXIgPT0gVFgpID8gMTYgOiAwKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZXBfdG9fYml0KHN0cnVjdCBjaV9oZHJjICpjaSwgaW50IG4pCkBAIC0xMjEsOSArMTIxLDggQEAKICAqLwogc3RhdGljIGludCBod19lcF9kaXNhYmxlKHN0cnVjdCBjaV9oZHJjICpjaSwgaW50IG51bSwgaW50IGRpcikKIHsKLQlod19lcF9mbHVzaChjaSwgbnVtLCBkaXIpOwogCWh3X3dyaXRlKGNpLCBPUF9FTkRQVENUUkwgKyBudW0sCi0JCSBkaXIgPyBFTkRQVENUUkxfVFhFIDogRU5EUFRDVFJMX1JYRSwgMCk7CisJCSAoZGlyID09IFRYKSA/IEVORFBUQ1RSTF9UWEUgOiBFTkRQVENUUkxfUlhFLCAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM5LDcgKzEzOCw3IEBACiB7CiAJdTMyIG1hc2ssIGRhdGE7CiAKLQlpZiAoZGlyKSB7CisJaWYgKGRpciA9PSBUWCkgewogCQltYXNrICA9IEVORFBUQ1RSTF9UWFQ7ICAvKiB0eXBlICAgICovCiAJCWRhdGEgID0gdHlwZSA8PCBfX2ZmcyhtYXNrKTsKIApAQCAtMTcxLDcgKzE3MCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgaHdfZXBfZ2V0X2hhbHQoc3RydWN0IGNpX2hkcmMgKmNpLCBpbnQgbnVtLCBpbnQgZGlyKQogewotCXUzMiBtYXNrID0gZGlyID8gRU5EUFRDVFJMX1RYUyA6IEVORFBUQ1RSTF9SWFM7CisJdTMyIG1hc2sgPSAoZGlyID09IFRYKSA/IEVORFBUQ1RSTF9UWFMgOiBFTkRQVENUUkxfUlhTOwogCiAJcmV0dXJuIGh3X3JlYWQoY2ksIE9QX0VORFBUQ1RSTCArIG51bSwgbWFzaykgPyAxIDogMDsKIH0KQEAgLTE4OCw2ICsxODcsOSBAQAogewogCWludCBuID0gaHdfZXBfYml0KG51bSwgZGlyKTsKIAorCS8qIFN5bmNocm9uaXplIGJlZm9yZSBlcCBwcmltZSAqLworCXdtYigpOworCiAJaWYgKGlzX2N0cmwgJiYgZGlyID09IFJYICYmIGh3X3JlYWQoY2ksIE9QX0VORFBUU0VUVVBTVEFULCBCSVQobnVtKSkpCiAJCXJldHVybiAtRUFHQUlOOwogCkBAIC0yMTgsOCArMjIwLDggQEAKIAogCWRvIHsKIAkJZW51bSBjaV9od19yZWdzIHJlZyA9IE9QX0VORFBUQ1RSTCArIG51bTsKLQkJdTMyIG1hc2tfeHMgPSBkaXIgPyBFTkRQVENUUkxfVFhTIDogRU5EUFRDVFJMX1JYUzsKLQkJdTMyIG1hc2tfeHIgPSBkaXIgPyBFTkRQVENUUkxfVFhSIDogRU5EUFRDVFJMX1JYUjsKKwkJdTMyIG1hc2tfeHMgPSAoZGlyID09IFRYKSA/IEVORFBUQ1RSTF9UWFMgOiBFTkRQVENUUkxfUlhTOworCQl1MzIgbWFza194ciA9IChkaXIgPT0gVFgpID8gRU5EUFRDVFJMX1RYUiA6IEVORFBUQ1RSTF9SWFI7CiAKIAkJLyogZGF0YSB0b2dnbGUgLSByZXNlcnZlZCBmb3IgRVAwIGJ1dCBpdCdzIGluIEVTUyAqLwogCQlod193cml0ZShjaSwgcmVnLCBtYXNrX3hzfG1hc2tfeHIsCkBAIC0zNDgsOCArMzUwLDcgQEAKIAlpZiAobm9kZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW5vZGUtPnB0ciA9IGRtYV9wb29sX3phbGxvYyhod2VwLT50ZF9wb29sLCBHRlBfQVRPTUlDLAotCQkJCSAgICZub2RlLT5kbWEpOworCW5vZGUtPnB0ciA9IGRtYV9wb29sX3phbGxvYyhod2VwLT50ZF9wb29sLCBHRlBfQVRPTUlDLCAmbm9kZS0+ZG1hKTsKIAlpZiAobm9kZS0+cHRyID09IE5VTEwpIHsKIAkJa2ZyZWUobm9kZSk7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTA2LDggKzUwNyw2IEBACiAJCWh3ZXAtPnFoLnB0ci0+Y2FwIHw9IG11bCA8PCBfX2ZmcyhRSF9NVUxUKTsKIAl9CiAKLQl3bWIoKTsgICAvKiBzeW5jaHJvbml6ZSBiZWZvcmUgZXAgcHJpbWUgKi8KLQogCXJldCA9IGh3X2VwX3ByaW1lKGNpLCBod2VwLT5udW0sIGh3ZXAtPmRpciwKIAkJCSAgIGh3ZXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCk7CiBkb25lOgpAQCAtNTM0LDkgKzUzMyw2IEBACiAJaHdlcC0+cWgucHRyLT50ZC50b2tlbiAmPQogCQljcHVfdG9fbGUzMih+KFREX1NUQVRVU19IQUxURUQgfCBURF9TVEFUVVNfQUNUSVZFKSk7CiAKLQkvKiBTeW5jaHJvbml6ZSBiZWZvcmUgZXAgcHJpbWUgKi8KLQl3bWIoKTsKLQogCXJldHVybiBod19lcF9wcmltZShjaSwgaHdlcC0+bnVtLCBod2VwLT5kaXIsCiAJCQkJaHdlcC0+dHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKTsKIH0KQEAgLTU5MCw3ICs1ODYsNyBAQAogCQl9CiAKIAkJaWYgKHJlbWFpbmluZ19sZW5ndGgpIHsKLQkJCWlmIChod2VwLT5kaXIpIHsKKwkJCWlmIChod2VwLT5kaXIgPT0gVFgpIHsKIAkJCQlod3JlcS0+cmVxLnN0YXR1cyA9IC1FUFJPVE87CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC05NDksNiArOTQ1LDE1IEBACiAJaW50IHJldHZhbDsKIAlzdHJ1Y3QgY2lfaHdfZXAgKmh3ZXA7CiAKKwkvKgorCSAqIFVuZXhwZWN0ZWQgVVNCIGNvbnRyb2xsZXIgYmVoYXZpb3IsIGNhdXNlZCBieSBiYWQgc2lnbmFsIGludGVncml0eQorCSAqIG9yIGdyb3VuZCByZWZlcmVuY2UgcHJvYmxlbXMsIGNhbiBsZWFkIHRvIGlzcl9zZXR1cF9zdGF0dXNfcGhhc2UKKwkgKiBiZWluZyBjYWxsZWQgd2l0aCBjaS0+c3RhdHVzIGVxdWFsIHRvIE5VTEwuCisJICogSWYgdGhpcyBzaXR1YXRpb24gb2NjdXJzLCB5b3Ugc2hvdWxkIHJldmlldyB5b3VyIFVTQiBoYXJkd2FyZSBkZXNpZ24uCisJICovCisJaWYgKFdBUk5fT05fT05DRSghY2ktPnN0YXR1cykpCisJCXJldHVybiAtRVBJUEU7CisKIAlod2VwID0gKGNpLT5lcDBfZGlyID09IFRYKSA/IGNpLT5lcDBvdXQgOiBjaS0+ZXAwaW47CiAJY2ktPnN0YXR1cy0+Y29udGV4dCA9IGNpOwogCWNpLT5zdGF0dXMtPmNvbXBsZXRlID0gaXNyX3NldHVwX3N0YXR1c19jb21wbGV0ZTsKQEAgLTEwNDIsOSArMTA0Nyw5IEBACiAJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKIAkJCQlicmVhazsKIAkJCW51bSAgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KTsKLQkJCWRpciA9IG51bSAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSzsKKwkJCWRpciA9IChudW0gJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID8gVFggOiBSWDsKIAkJCW51bSAmPSBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7Ci0JCQlpZiAoZGlyKSAvKiBUWCAqLworCQkJaWYgKGRpciA9PSBUWCkKIAkJCQludW0gKz0gY2ktPmh3X2VwX21heCAvIDI7CiAJCQlpZiAoIWNpLT5jaV9od19lcFtudW1dLndlZGdlKSB7CiAJCQkJc3Bpbl91bmxvY2soJmNpLT5sb2NrKTsKQEAgLTEwOTQsOSArMTA5OSw5IEBACiAJCQlpZiAocmVxLndMZW5ndGggIT0gMCkKIAkJCQlicmVhazsKIAkJCW51bSAgPSBsZTE2X3RvX2NwdShyZXEud0luZGV4KTsKLQkJCWRpciA9IG51bSAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSzsKKwkJCWRpciA9IChudW0gJiBVU0JfRU5EUE9JTlRfRElSX01BU0spID8gVFggOiBSWDsKIAkJCW51bSAmPSBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7Ci0JCQlpZiAoZGlyKSAvKiBUWCAqLworCQkJaWYgKGRpciA9PSBUWCkKIAkJCQludW0gKz0gY2ktPmh3X2VwX21heCAvIDI7CiAKIAkJCXNwaW5fdW5sb2NrKCZjaS0+bG9jayk7CkBAIC0xNTk2LDggKzE2MDEsMTEgQEAKIHsKIAlzdHJ1Y3QgY2lfaGRyYyAqY2kgPSBjb250YWluZXJfb2YoX2dhZGdldCwgc3RydWN0IGNpX2hkcmMsIGdhZGdldCk7CiAKLQkvKiBEYXRhKyBwdWxsdXAgY29udHJvbGxlZCBieSBPVEcgc3RhdGUgbWFjaGluZSBpbiBPVEcgZnNtIG1vZGUgKi8KLQlpZiAoY2lfb3RnX2lzX2ZzbV9tb2RlKGNpKSkKKwkvKgorCSAqIERhdGErIHB1bGx1cCBjb250cm9sbGVkIGJ5IE9URyBzdGF0ZSBtYWNoaW5lIGluIE9URyBmc20gbW9kZTsKKwkgKiBhbmQgZG9uJ3QgdG91Y2ggRGF0YSsgaW4gaG9zdCBtb2RlIGZvciBkdWFsIHJvbGUgY29uZmlnLgorCSAqLworCWlmIChjaV9vdGdfaXNfZnNtX21vZGUoY2kpIHx8IGNpLT5yb2xlID09IENJX1JPTEVfSE9TVCkKIAkJcmV0dXJuIDA7CiAKIAlwbV9ydW50aW1lX2dldF9zeW5jKCZjaS0+Z2FkZ2V0LmRldik7CkBAIC0xNjY4LDEyICsxNjc2LDEwIEBACiAJCQl1c2JfZXBfc2V0X21heHBhY2tldF9saW1pdCgmaHdlcC0+ZXAsICh1bnNpZ25lZCBzaG9ydCl+MCk7CiAKIAkJCUlOSVRfTElTVF9IRUFEKCZod2VwLT5xaC5xdWV1ZSk7Ci0JCQlod2VwLT5xaC5wdHIgPSBkbWFfcG9vbF9hbGxvYyhjaS0+cWhfcG9vbCwgR0ZQX0tFUk5FTCwKLQkJCQkJCSAgICAgJmh3ZXAtPnFoLmRtYSk7CisJCQlod2VwLT5xaC5wdHIgPSBkbWFfcG9vbF96YWxsb2MoY2ktPnFoX3Bvb2wsIEdGUF9LRVJORUwsCisJCQkJCQkgICAgICAgJmh3ZXAtPnFoLmRtYSk7CiAJCQlpZiAoaHdlcC0+cWgucHRyID09IE5VTEwpCiAJCQkJcmV0dmFsID0gLUVOT01FTTsKLQkJCWVsc2UKLQkJCQltZW1zZXQoaHdlcC0+cWgucHRyLCAwLCBzaXplb2YoKmh3ZXAtPnFoLnB0cikpOwogCiAJCQkvKgogCQkJICogc2V0IHVwIHNob3J0aGFuZHMgZm9yIGVwMCBvdXQgYW5kIGluIGVuZHBvaW50cywKQEAgLTE5ODcsNyArMTk5Myw3IEBACiAJaWYgKCFod19yZWFkKGNpLCBDQVBfRENDUEFSQU1TLCBEQ0NQQVJBTVNfREMpKQogCQlyZXR1cm4gLUVOWElPOwogCi0JcmRydiA9IGRldm1fa3phbGxvYyhjaS0+ZGV2LCBzaXplb2Yoc3RydWN0IGNpX3JvbGVfZHJpdmVyKSwgR0ZQX0tFUk5FTCk7CisJcmRydiA9IGRldm1fa3phbGxvYyhjaS0+ZGV2LCBzaXplb2YoKnJkcnYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJkcnYpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS91c2JtaXNjX2lteC5jIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvdXNibWlzY19pbXguYwppbmRleCBhYjhiMDI3Li4yMGQwMmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS91c2JtaXNjX2lteC5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VzYm1pc2NfaW14LmMKQEAgLTU2LDYgKzU2LDcgQEAKIAogI2RlZmluZSBNWDZfQk1fTk9OX0JVUlNUX1NFVFRJTkcJQklUKDEpCiAjZGVmaW5lIE1YNl9CTV9PVkVSX0NVUl9ESVMJCUJJVCg3KQorI2RlZmluZSBNWDZfQk1fT1ZFUl9DVVJfUE9MQVJJVFkJQklUKDgpCiAjZGVmaW5lIE1YNl9CTV9XQUtFVVBfRU5BQkxFCQlCSVQoMTApCiAjZGVmaW5lIE1YNl9CTV9JRF9XQUtFVVAJCUJJVCgxNikKICNkZWZpbmUgTVg2X0JNX1ZCVVNfV0FLRVVQCQlCSVQoMTcpCkBAIC0yNjYsMTEgKzI2NywxNCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnVzYm1pc2MtPmxvY2ssIGZsYWdzKTsKIAorCXJlZyA9IHJlYWRsKHVzYm1pc2MtPmJhc2UgKyBkYXRhLT5pbmRleCAqIDQpOwogCWlmIChkYXRhLT5kaXNhYmxlX29jKSB7Ci0JCXJlZyA9IHJlYWRsKHVzYm1pc2MtPmJhc2UgKyBkYXRhLT5pbmRleCAqIDQpOwotCQl3cml0ZWwocmVnIHwgTVg2X0JNX09WRVJfQ1VSX0RJUywKLQkJCXVzYm1pc2MtPmJhc2UgKyBkYXRhLT5pbmRleCAqIDQpOworCQlyZWcgfD0gTVg2X0JNX09WRVJfQ1VSX0RJUzsKKwl9IGVsc2UgaWYgKGRhdGEtPm9jX3BvbGFyaXR5ID09IDEpIHsKKwkJLyogSGlnaCBhY3RpdmUgKi8KKwkJcmVnICY9IH4oTVg2X0JNX09WRVJfQ1VSX0RJUyB8IE1YNl9CTV9PVkVSX0NVUl9QT0xBUklUWSk7CiAJfQorCXdyaXRlbChyZWcsIHVzYm1pc2MtPmJhc2UgKyBkYXRhLT5pbmRleCAqIDQpOwogCiAJLyogU29DIG5vbi1idXJzdCBzZXR0aW5nICovCiAJcmVnID0gcmVhZGwodXNibWlzYy0+YmFzZSArIGRhdGEtPmluZGV4ICogNCk7CkBAIC0zNjUsMTAgKzM2OSwxNCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JtaXNjLT5sb2NrLCBmbGFncyk7CisJcmVnID0gcmVhZGwodXNibWlzYy0+YmFzZSk7CiAJaWYgKGRhdGEtPmRpc2FibGVfb2MpIHsKLQkJcmVnID0gcmVhZGwodXNibWlzYy0+YmFzZSk7Ci0JCXdyaXRlbChyZWcgfCBNWDZfQk1fT1ZFUl9DVVJfRElTLCB1c2JtaXNjLT5iYXNlKTsKKwkJcmVnIHw9IE1YNl9CTV9PVkVSX0NVUl9ESVM7CisJfSBlbHNlIGlmIChkYXRhLT5vY19wb2xhcml0eSA9PSAxKSB7CisJCS8qIEhpZ2ggYWN0aXZlICovCisJCXJlZyAmPSB+KE1YNl9CTV9PVkVSX0NVUl9ESVMgfCBNWDZfQk1fT1ZFUl9DVVJfUE9MQVJJVFkpOwogCX0KKwl3cml0ZWwocmVnLCB1c2JtaXNjLT5iYXNlKTsKIAogCXJlZyA9IHJlYWRsKHVzYm1pc2MtPmJhc2UgKyBNWDdEX1VTQk5DX1VTQl9DVFJMMik7CiAJcmVnICY9IH5NWDdEX1VTQl9WQlVTX1dBS0VVUF9TT1VSQ0VfTUFTSzsKQEAgLTQ5Miw2ICs1MDAsMTAgQEAKIAkJLmNvbXBhdGlibGUgPSAiZnNsLGlteDZ1bC11c2JtaXNjIiwKIAkJLmRhdGEgPSAmaW14NnN4X3VzYm1pc2Nfb3BzLAogCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJmc2wsaW14N2QtdXNibWlzYyIsCisJCS5kYXRhID0gJmlteDdkX3VzYm1pc2Nfb3BzLAorCX0sCiAJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdXNibWlzY19pbXhfZHRfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCAwZjNmNjJlLi43OGYwZjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC0zNjgsMTcgKzM2OCwxNyBAQAogCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KGluZGV4LCAmYWNtLT5yZWFkX3VyYnNfZnJlZSkpCiAJCXJldHVybiAwOwogCi0JZGV2X3ZkYmcoJmFjbS0+ZGF0YS0+ZGV2LCAiJXMgLSB1cmIgJWRcbiIsIF9fZnVuY19fLCBpbmRleCk7Ci0KIAlyZXMgPSB1c2Jfc3VibWl0X3VyYihhY20tPnJlYWRfdXJic1tpbmRleF0sIG1lbV9mbGFncyk7CiAJaWYgKHJlcykgewogCQlpZiAocmVzICE9IC1FUEVSTSkgewogCQkJZGV2X2VycigmYWNtLT5kYXRhLT5kZXYsCi0JCQkJCSIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZDogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXMpOworCQkJCQkidXJiICVkIGZhaWxlZCBzdWJtaXNzaW9uIHdpdGggJWRcbiIsCisJCQkJCWluZGV4LCByZXMpOwogCQl9CiAJCXNldF9iaXQoaW5kZXgsICZhY20tPnJlYWRfdXJic19mcmVlKTsKIAkJcmV0dXJuIHJlczsKKwl9IGVsc2UgeworCQlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICJzdWJtaXR0ZWQgdXJiICVkXG4iLCBpbmRleCk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00MTUsOCArNDE1LDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgIiVzIC0gdXJiICVkLCBsZW4gJWRcbiIsIF9fZnVuY19fLAotCQkJCQlyYi0+aW5kZXgsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJZGV2X3ZkYmcoJmFjbS0+ZGF0YS0+ZGV2LCAiZ290IHVyYiAlZCwgbGVuICVkLCBzdGF0dXMgJWRcbiIsCisJCQkJCXJiLT5pbmRleCwgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCQkJCQlzdGF0dXMpOwogCiAJaWYgKCFhY20tPmRldikgewogCQlzZXRfYml0KHJiLT5pbmRleCwgJmFjbS0+cmVhZF91cmJzX2ZyZWUpOwpAQCAtNDI2LDggKzQyNyw2IEBACiAKIAlpZiAoc3RhdHVzKSB7CiAJCXNldF9iaXQocmItPmluZGV4LCAmYWNtLT5yZWFkX3VyYnNfZnJlZSk7Ci0JCWRldl9kYmcoJmFjbS0+ZGF0YS0+ZGV2LCAiJXMgLSBub24temVybyB1cmIgc3RhdHVzOiAlZFxuIiwKLQkJCQkJCQlfX2Z1bmNfXywgc3RhdHVzKTsKIAkJaWYgKChzdGF0dXMgIT0gLUVOT0VOVCkgfHwgKHVyYi0+YWN0dWFsX2xlbmd0aCA9PSAwKSkKIAkJCXJldHVybjsKIAl9CkBAIC00NjIsOCArNDYxLDcgQEAKIAlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKIAlpZiAoc3RhdHVzIHx8ICh1cmItPmFjdHVhbF9sZW5ndGggIT0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKSkKLQkJZGV2X3ZkYmcoJmFjbS0+ZGF0YS0+ZGV2LCAiJXMgLSBsZW4gJWQvJWQsIHN0YXR1cyAlZFxuIiwKLQkJCV9fZnVuY19fLAorCQlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICJ3cm90ZSBsZW4gJWQvJWQsIHN0YXR1cyAlZFxuIiwKIAkJCXVyYi0+YWN0dWFsX2xlbmd0aCwKIAkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKIAkJCXN0YXR1cyk7CkBAIC00NzgsOCArNDc2LDYgQEAKIHsKIAlzdHJ1Y3QgYWNtICphY20gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFjbSwgd29yayk7CiAKLQlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCiAJdHR5X3BvcnRfdHR5X3dha2V1cCgmYWNtLT5wb3J0KTsKIH0KIApAQCAtNDkyLDggKzQ4OCw2IEBACiAJc3RydWN0IGFjbSAqYWNtOwogCWludCByZXR2YWw7CiAKLQlkZXZfZGJnKHR0eS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQogCWFjbSA9IGFjbV9nZXRfYnlfbWlub3IodHR5LT5pbmRleCk7CiAJaWYgKCFhY20pCiAJCXJldHVybiAtRU5PREVWOwpAQCAtNTE1LDggKzUwOSw2IEBACiB7CiAJc3RydWN0IGFjbSAqYWNtID0gdHR5LT5kcml2ZXJfZGF0YTsKIAotCWRldl9kYmcodHR5LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCiAJcmV0dXJuIHR0eV9wb3J0X29wZW4oJmFjbS0+cG9ydCwgdHR5LCBmaWxwKTsKIH0KIApAQCAtNTQ1LDggKzUzNyw2IEBACiAJaW50IHJldHZhbCA9IC1FTk9ERVY7CiAJaW50IGk7CiAKLQlkZXZfZGJnKCZhY20tPmNvbnRyb2wtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KIAltdXRleF9sb2NrKCZhY20tPm11dGV4KTsKIAlpZiAoYWNtLT5kaXNjb25uZWN0ZWQpCiAJCWdvdG8gZGlzY29ubmVjdGVkOwpAQCAtNjA3LDggKzU5Nyw2IEBACiB7CiAJc3RydWN0IGFjbSAqYWNtID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBhY20sIHBvcnQpOwogCi0JZGV2X2RiZygmYWNtLT5jb250cm9sLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCiAJYWNtX3JlbGVhc2VfbWlub3IoYWNtKTsKIAl1c2JfcHV0X2ludGYoYWNtLT5jb250cm9sKTsKIAlrZnJlZShhY20tPmNvdW50cnlfY29kZXMpOwpAQCAtNjIyLDggKzYxMCw2IEBACiAJc3RydWN0IGFjbV93YiAqd2I7CiAJaW50IGk7CiAKLQlkZXZfZGJnKCZhY20tPmNvbnRyb2wtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KIAkvKgogCSAqIE5lZWQgdG8gZ3JhYiB3cml0ZV9sb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIHJlc3VtZSwgYnV0IG5vIG5lZWQgdG8KIAkgKiBob2xkIGl0IGR1ZSB0byB0aGUgdHR5LXBvcnQgaW5pdGlhbGlzZWQgZmxhZy4KQEAgLTY1NCwyMSArNjQwLDIxIEBACiBzdGF0aWMgdm9pZCBhY21fdHR5X2NsZWFudXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3QgYWNtICphY20gPSB0dHktPmRyaXZlcl9kYXRhOwotCWRldl9kYmcoJmFjbS0+Y29udHJvbC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwogCXR0eV9wb3J0X3B1dCgmYWNtLT5wb3J0KTsKIH0KIAogc3RhdGljIHZvaWQgYWNtX3R0eV9oYW5ndXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlzdHJ1Y3QgYWNtICphY20gPSB0dHktPmRyaXZlcl9kYXRhOwotCWRldl9kYmcoJmFjbS0+Y29udHJvbC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwogCXR0eV9wb3J0X2hhbmd1cCgmYWNtLT5wb3J0KTsKIH0KIAogc3RhdGljIHZvaWQgYWNtX3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgYWNtICphY20gPSB0dHktPmRyaXZlcl9kYXRhOwotCWRldl9kYmcoJmFjbS0+Y29udHJvbC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwogCXR0eV9wb3J0X2Nsb3NlKCZhY20tPnBvcnQsIHR0eSwgZmlscCk7CiB9CiAKQEAgLTY4NCw3ICs2NzAsNyBAQAogCWlmICghY291bnQpCiAJCXJldHVybiAwOwogCi0JZGV2X3ZkYmcoJmFjbS0+ZGF0YS0+ZGV2LCAiJXMgLSBjb3VudCAlZFxuIiwgX19mdW5jX18sIGNvdW50KTsKKwlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICIlZCBieXRlcyBmcm9tIHR0eSBsYXllclxuIiwgY291bnQpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOwogCXdibiA9IGFjbV93Yl9hbGxvYyhhY20pOwpAQCAtNzAxLDcgKzY4Nyw3IEBACiAJfQogCiAJY291bnQgPSAoY291bnQgPiBhY20tPndyaXRlc2l6ZSkgPyBhY20tPndyaXRlc2l6ZSA6IGNvdW50OwotCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgIiVzIC0gd3JpdGUgJWRcbiIsIF9fZnVuY19fLCBjb3VudCk7CisJZGV2X3ZkYmcoJmFjbS0+ZGF0YS0+ZGV2LCAid3JpdGluZyAlZCBieXRlc1xuIiwgY291bnQpOwogCW1lbWNweSh3Yi0+YnVmLCBidWYsIGNvdW50KTsKIAl3Yi0+bGVuID0gY291bnQ7CiAKQEAgLTExOTMsNiArMTE3OSw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmICghaW50Zi0+Y3VyX2FsdHNldHRpbmcpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKCFidWZsZW4pIHsKIAkJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludCAmJgogCQkJCWludGYtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludC0+ZXh0cmFsZW4gJiYKQEAgLTEyNDYsNiArMTIzNSw4IEBACiAJCWRldl9kYmcoJmludGYtPmRldiwgIm5vIGludGVyZmFjZXNcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CisJaWYgKCFkYXRhX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmcgfHwgIWNvbnRyb2xfaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZykKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZiAoZGF0YV9pbnRmX251bSAhPSBjYWxsX2ludGZfbnVtKQogCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJTZXBhcmF0ZSBjYWxsIGNvbnRyb2wgaW50ZXJmYWNlLiBUaGF0IGlzIG5vdCBmdWxseSBzdXBwb3J0ZWQuXG4iKTsKQEAgLTE1MzMsOCArMTUyNCw2IEBACiB7CiAJaW50IGk7CiAKLQlkZXZfZGJnKCZhY20tPmNvbnRyb2wtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KIAl1c2Jfa2lsbF91cmIoYWNtLT5jdHJsdXJiKTsKIAlmb3IgKGkgPSAwOyBpIDwgQUNNX05XOyBpKyspCiAJCXVzYl9raWxsX3VyYihhY20tPndiW2ldLnVyYik7CkBAIC0xNTUxLDggKzE1NDAsNiBAQAogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJaW50IGk7CiAKLQlkZXZfZGJnKCZpbnRmLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwotCiAJLyogc2libGluZyBpbnRlcmZhY2UgaXMgYWxyZWFkeSBjbGVhbmluZyB1cCAqLwogCWlmICghYWNtKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtd2RtLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtd2RtLmMKaW5kZXggMzM3OTQ4Yy4uMGE2MzY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLXdkbS5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy13ZG0uYwpAQCAtNTgsNiArNTgsNyBAQAogI2RlZmluZSBXRE1fU1VTUEVORElORwkJOAogI2RlZmluZSBXRE1fUkVTRVRUSU5HCQk5CiAjZGVmaW5lIFdETV9PVkVSRkxPVwkJMTAKKyNkZWZpbmUgV0RNX0RSQUlOX09OX09QRU4JMTEKIAogI2RlZmluZSBXRE1fTUFYCQkJMTYKIApAQCAtMTU0LDYgKzE1NSw5IEBACiAJd2FrZV91cCgmZGVzYy0+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+ZGV2LnBhcmVudCA9IGRldjsKIAl1bHBpLT5kZXYuYnVzID0gJnVscGlfYnVzOwogCXVscGktPmRldi50eXBlID0gJnVscGlfZGV2X3R5cGU7CiAJZGV2X3NldF9uYW1lKCZ1bHBpLT5kZXYsICIlcy51bHBpIiwgZGV2X25hbWUoZGV2KSk7CkBAIC0yMDEsNyArMjAzLDggQEAKICAqIEFsbG9jYXRlcyBhbmQgcmVnaXN0ZXJzIGEgVUxQSSBkZXZpY2UgYW5kIGFuIGludGVyZmFjZSBmb3IgaXQuIENhbGxlZCBmcm9tCiAgKiB0aGUgVVNCIGNvbnRyb2xsZXIgdGhhdCBwcm92aWRlcyB0aGUgVUxQSSBpbnRlcmZhY2UuCiAgKi8KLXN0cnVjdCB1bHBpICp1bHBpX3JlZ2lzdGVyX2ludGVyZmFjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCB1bHBpX29wcyAqb3BzKQorc3RydWN0IHVscGkgKnVscGlfcmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCB1bHBpX29wcyAqb3BzKQogewogCXN0cnVjdCB1bHBpICp1bHBpOwogCWludCByZXQ7CkBAIC0yMTEsNyArMjE0LDYgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAl1bHBpLT5vcHMgPSBvcHM7Ci0Jb3BzLT5kZXYgPSBkZXY7CiAKIAlyZXQgPSB1bHBpX3JlZ2lzdGVyKGRldiwgdWxwaSk7CiAJaWYgKHJldCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9LY29uZmlnIGIvZHJpdmVycy91c2IvY29yZS9LY29uZmlnCmluZGV4IGRkMjgwMTAuLjBlNWE4ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9jb3JlL0tjb25maWcKQEAgLTgzLDIzICs4MywxMCBAQAogCSAgSW1wbGVtZW50cyBPVEcgRmluaXRlIFN0YXRlIE1hY2hpbmUgYXMgc3BlY2lmaWVkIGluIE9uLVRoZS1HbwogCSAgYW5kIEVtYmVkZGVkIEhvc3QgU3VwcGxlbWVudCB0byB0aGUgVVNCIFJldmlzaW9uIDIuMCBTcGVjaWZpY2F0aW9uLgogCi1jb25maWcgVVNCX1VMUElfQlVTCi0JdHJpc3RhdGUgIlVTQiBVTFBJIFBIWSBpbnRlcmZhY2Ugc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFVTQl9TVVBQT1JUCitjb25maWcgVVNCX0xFRFNfVFJJR0dFUl9VU0JQT1JUCisJdHJpc3RhdGUgIlVTQiBwb3J0IExFRCB0cmlnZ2VyIgorCWRlcGVuZHMgb24gVVNCICYmIExFRFNfVFJJR0dFUlMKIAloZWxwCi0JICBVVE1JKyBMb3cgUGluIEludGVyZmFjZSAoVUxQSSkgaXMgc3BlY2lmaWNhdGlvbiBmb3IgYSBjb21tb25seSB1c2VkCi0JICBVU0IgMi4wIFBIWSBpbnRlcmZhY2UuIFRoZSBVTFBJIHNwZWNpZmljYXRpb24gZGVmaW5lcyBhIHN0YW5kYXJkIHNldAotCSAgb2YgcmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IHRoZSB2ZW5kb3IgYW5kIHByb2R1Y3Qgd2hpY2gKLQkgIGFsbG93cyBVTFBJIHRvIGJlIGhhbmRsZWQgYXMgYSBidXMuIFRoaXMgbW9kdWxlIGlzIHRoZSBkcml2ZXIgZm9yIHRoYXQKLQkgIGJ1cy4KLQotCSAgVGhlIFVMUEkgaW50ZXJmYWNlcyAodGhlIGJ1c2VzKSBhcmUgcmVnaXN0ZXJlZCBieSB0aGUgZHJpdmVycyBmb3IgVVNCCi0JICBjb250cm9sbGVycyB3aGljaCBzdXBwb3J0IFVMUEkgcmVnaXN0ZXIgYWNjZXNzIGFuZCBoYXZlIFVMUEkgUEhZCi0JICBhdHRhY2hlZCB0byB0aGVtLiBUaGUgVUxQSSBQSFkgZHJpdmVycyB0aGVtc2VsdmVzIGFyZSBub3JtYWwgUEhZCi0JICBkcml2ZXJzLgotCi0JICBVTFBJIFBIWXMgcHJvdmlkZSBvZnRlbiBmdW5jdGlvbnMgc3VjaCBhcyBBRFAgc2Vuc2luZy9wcm9iaW5nIChPVEcKLQkgIHByb3RvY29sKSBhbmQgVVNCIGNoYXJnZXIgZGV0ZWN0aW9uLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKLQkgIGJlIGNhbGxlZCB1bHBpLgorCSAgVGhpcyBkcml2ZXIgYWxsb3dzIExFRHMgdG8gYmUgY29udHJvbGxlZCBieSBVU0IgZXZlbnRzLiBFbmFibGluZyB0aGlzCisJICB0cmlnZ2VyIGFsbG93cyBzcGVjaWZ5aW5nIGxpc3Qgb2YgVVNCIHBvcnRzIHRoYXQgc2hvdWxkIHR1cm4gb24gTEVECisJICB3aGVuIHNvbWUgVVNCIGRldmljZSBnZXRzIGNvbm5lY3RlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9jb3JlL01ha2VmaWxlCmluZGV4IDk3ODA4NzcuLmI5OWI4NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvY29yZS9NYWtlZmlsZQpAQCAtNSw5ICs1LDEyIEBACiB1c2Jjb3JlLXkgOj0gdXNiLm8gaHViLm8gaGNkLm8gdXJiLm8gbWVzc2FnZS5vIGRyaXZlci5vCiB1c2Jjb3JlLXkgKz0gY29uZmlnLm8gZmlsZS5vIGJ1ZmZlci5vIHN5c2ZzLm8gZW5kcG9pbnQubwogdXNiY29yZS15ICs9IGRldmlvLm8gbm90aWZ5Lm8gZ2VuZXJpYy5vIHF1aXJrcy5vIGRldmljZXMubwotdXNiY29yZS15ICs9IHBvcnQubyBvZi5vCit1c2Jjb3JlLXkgKz0gcG9ydC5vCiAKK3VzYmNvcmUtJChDT05GSUdfT0YpCQkrPSBvZi5vCiB1c2Jjb3JlLSQoQ09ORklHX1BDSSkJCSs9IGhjZC1wY2kubwogdXNiY29yZS0kKENPTkZJR19BQ1BJKQkJKz0gdXNiLWFjcGkubwogCiBvYmotJChDT05GSUdfVVNCKQkJKz0gdXNiY29yZS5vCisKK29iai0kKENPTkZJR19VU0JfTEVEU19UUklHR0VSX1VTQlBPUlQpCSs9IGxlZHRyaWctdXNicG9ydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jIGIvZHJpdmVycy91c2IvY29yZS9jb25maWcuYwppbmRleCAwNTExNjMxLi5hMmQ5MGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvY29uZmlnLmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCVtVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MXSA9IDY0LAogCVtVU0JfRU5EUE9JTlRfWEZFUl9JU09DXSA9IDEwMjQsCiAJW1VTQl9FTkRQT0lOVF9YRkVSX0JVTEtdID0gNTEyLAotCVtVU0JfRU5EUE9JTlRfWEZFUl9JTlRdID0gMTAyMywKKwlbVVNCX0VORFBPSU5UX1hGRVJfSU5UXSA9IDEwMjQsCiB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHN1cGVyX3NwZWVkX21heHBhY2tldF9tYXhlc1s0XSA9IHsKIAlbVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTF0gPSA1MTIsCkBAIC0yNDAsOCArMjQwLDEwIEBACiAJbWVtY3B5KCZlbmRwb2ludC0+ZGVzYywgZCwgbik7CiAJSU5JVF9MSVNUX0hFQUQoJmVuZHBvaW50LT51cmJfbGlzdCk7CiAKLQkvKiBGaXggdXAgYkludGVydmFsIHZhbHVlcyBvdXRzaWRlIHRoZSBsZWdhbCByYW5nZS4gVXNlIDMyIG1zIGlmIG5vCi0JICogcHJvcGVyIHZhbHVlIGNhbiBiZSBndWVzc2VkLiAqLworCS8qCisJICogRml4IHVwIGJJbnRlcnZhbCB2YWx1ZXMgb3V0c2lkZSB0aGUgbGVnYWwgcmFuZ2UuCisJICogVXNlIDEwIG9yIDggbXMgaWYgbm8gcHJvcGVyIHZhbHVlIGNhbiBiZSBndWVzc2VkLgorCSAqLwogCWkgPSAwOwkJLyogaSA9IG1pbiwgaiA9IG1heCwgbiA9IGRlZmF1bHQgKi8KIAlqID0gMjU1OwogCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZCkpIHsKQEAgLTI1MCwxMyArMjUyLDE1IEBACiAJCWNhc2UgVVNCX1NQRUVEX1NVUEVSX1BMVVM6CiAJCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgogCQljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQkJLyogTWFueSBkZXZpY2UgbWFudWZhY3R1cmVycyBhcmUgdXNpbmcgZnVsbC1zcGVlZAorCQkJLyoKKwkJCSAqIE1hbnkgZGV2aWNlIG1hbnVmYWN0dXJlcnMgYXJlIHVzaW5nIGZ1bGwtc3BlZWQKIAkJCSAqIGJJbnRlcnZhbCB2YWx1ZXMgaW4gaGlnaC1zcGVlZCBpbnRlcnJ1cHQgZW5kcG9pbnQKLQkJCSAqIGRlc2NyaXB0b3JzLiBUcnkgdG8gZml4IHRob3NlIGFuZCBmYWxsIGJhY2sgdG8gYQotCQkJICogMzIgbXMgZGVmYXVsdCB2YWx1ZSBvdGhlcndpc2UuICovCisJCQkgKiBkZXNjcmlwdG9ycy4gVHJ5IHRvIGZpeCB0aG9zZSBhbmQgZmFsbCBiYWNrIHRvIGFuCisJCQkgKiA4LW1zIGRlZmF1bHQgdmFsdWUgb3RoZXJ3aXNlLgorCQkJICovCiAJCQluID0gZmxzKGQtPmJJbnRlcnZhbCo4KTsKIAkJCWlmIChuID09IDApCi0JCQkJbiA9IDk7CS8qIDMyIG1zID0gMl4oOS0xKSB1ZnJhbWVzICovCisJCQkJbiA9IDc7CS8qIDggbXMgPSAyXig3LTEpIHVmcmFtZXMgKi8KIAkJCWogPSAxNjsKIAogCQkJLyoKQEAgLTI3MSwxMCArMjc1LDEyIEBACiAJCQl9CiAJCQlicmVhazsKIAkJZGVmYXVsdDoJCS8qIFVTQl9TUEVFRF9GVUxMIG9yIF9MT1cgKi8KLQkJCS8qIEZvciBsb3ctc3BlZWQsIDEwIG1zIGlzIHRoZSBvZmZpY2lhbCBtaW5pbXVtLgorCQkJLyoKKwkJCSAqIEZvciBsb3ctc3BlZWQsIDEwIG1zIGlzIHRoZSBvZmZpY2lhbCBtaW5pbXVtLgogCQkJICogQnV0IHNvbWUgIm92ZXJjbG9ja2VkIiBkZXZpY2VzIG1pZ2h0IHdhbnQgZmFzdGVyCi0JCQkgKiBwb2xsaW5nIHNvIHdlJ2xsIGFsbG93IGl0LiAqLwotCQkJbiA9IDMyOworCQkJICogcG9sbGluZyBzbyB3ZSdsbCBhbGxvdyBpdC4KKwkJCSAqLworCQkJbiA9IDEwOwogCQkJYnJlYWs7CiAJCX0KIAl9IGVsc2UgaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZCkpIHsKQEAgLTI4MiwxMCArMjg4LDEwIEBACiAJCWogPSAxNjsKIAkJc3dpdGNoICh0b191c2JfZGV2aWNlKGRkZXYpLT5zcGVlZCkgewogCQljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQkJbiA9IDk7CQkvKiAzMiBtcyA9IDJeKDktMSkgdWZyYW1lcyAqLworCQkJbiA9IDc7CQkvKiA4IG1zID0gMl4oNy0xKSB1ZnJhbWVzICovCiAJCQlicmVhazsKIAkJZGVmYXVsdDoJCS8qIFVTQl9TUEVFRF9GVUxMICovCi0JCQluID0gNjsJCS8qIDMyIG1zID0gMl4oNi0xKSBmcmFtZXMgKi8KKwkJCW4gPSA0OwkJLyogOCBtcyA9IDJeKDQtMSkgZnJhbWVzICovCiAJCQlicmVhazsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwppbmRleCBlNmE2ZDY3Li4wOWM4ZDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCkBAIC0xNzA5LDExICsxNzA5LDE3IEBACiAJYXMtPnVyYi0+c3RhcnRfZnJhbWUgPSB1dXJiLT5zdGFydF9mcmFtZTsKIAlhcy0+dXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IG51bWJlcl9vZl9wYWNrZXRzOwogCWFzLT51cmItPnN0cmVhbV9pZCA9IHN0cmVhbV9pZDsKLQlpZiAodXVyYi0+dHlwZSA9PSBVU0JERVZGU19VUkJfVFlQRV9JU08gfHwKLQkJCXBzLT5kZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQotCQlhcy0+dXJiLT5pbnRlcnZhbCA9IDEgPDwgbWluKDE1LCBlcC0+ZGVzYy5iSW50ZXJ2YWwgLSAxKTsKLQllbHNlCi0JCWFzLT51cmItPmludGVydmFsID0gZXAtPmRlc2MuYkludGVydmFsOworCisJaWYgKGVwLT5kZXNjLmJJbnRlcnZhbCkgeworCQlpZiAodXVyYi0+dHlwZSA9PSBVU0JERVZGU19VUkJfVFlQRV9JU08gfHwKKwkJCQlwcy0+ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCB8fAorCQkJCXBzLT5kZXYtPnNwZWVkID49IFVTQl9TUEVFRF9TVVBFUikKKwkJCWFzLT51cmItPmludGVydmFsID0gMSA8PAorCQkJCQltaW4oMTUsIGVwLT5kZXNjLmJJbnRlcnZhbCAtIDEpOworCQllbHNlCisJCQlhcy0+dXJiLT5pbnRlcnZhbCA9IGVwLT5kZXNjLmJJbnRlcnZhbDsKKwl9CisKIAlhcy0+dXJiLT5jb250ZXh0ID0gYXM7CiAJYXMtPnVyYi0+Y29tcGxldGUgPSBhc3luY19jb21wbGV0ZWQ7CiAJZm9yICh0b3RsZW4gPSB1ID0gMDsgdSA8IG51bWJlcl9vZl9wYWNrZXRzOyB1KyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCmluZGV4IGQyZTNmNjUuLjQ3OWUyMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvcGh5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgogCiAjaW5jbHVkZSAidXNiLmgiCiAKQEAgLTI1MTcsMTAgKzI1MTgsOCBAQAogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAKIAloY2QgPSBremFsbG9jKHNpemVvZigqaGNkKSArIGRyaXZlci0+aGNkX3ByaXZfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoY2QpIHsKLQkJZGV2X2RiZyAoZGV2LCAiaGNkIGFsbG9jIGZhaWxlZFxuIik7CisJaWYgKCFoY2QpCiAJCXJldHVybiBOVUxMOwotCX0KIAlpZiAocHJpbWFyeV9oY2QgPT0gTlVMTCkgewogCQloY2QtPmFkZHJlc3MwX211dGV4ID0ga21hbGxvYyhzaXplb2YoKmhjZC0+YWRkcmVzczBfbXV0ZXgpLAogCQkJCUdGUF9LRVJORUwpOwpAQCAtMzAzMyw3ICszMDMyLDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9NT04pIHx8IGRlZmluZWQoQ09ORklHX1VTQl9NT05fTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9NT04pCiAKIGNvbnN0IHN0cnVjdCB1c2JfbW9uX29wZXJhdGlvbnMgKm1vbl9vcHM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IDFkNWZjMzIuLmNiYjE0NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMTgyMywxMCArMTgyMyw4IEBACiAJZGV2X2luZm8oJmludGYtPmRldiwgIlVTQiBodWIgZm91bmRcbiIpOwogCiAJaHViID0ga3phbGxvYyhzaXplb2YoKmh1YiksIEdGUF9LRVJORUwpOwotCWlmICghaHViKSB7Ci0JCWRldl9kYmcoJmludGYtPmRldiwgImNvdWxkbid0IGttYWxsb2MgaHViIHN0cnVjdFxuIik7CisJaWYgKCFodWIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWtyZWZfaW5pdCgmaHViLT5rcmVmKTsKIAlodWItPmludGZkZXYgPSAmaW50Zi0+ZGV2OwpAQCAtMzEwNiw3ICszMTA0LDcgQEAKIAkJCQlVU0JfQ1RSTF9TRVRfVElNRU9VVCk7CiAJZWxzZQogCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHVzYl9zbmRjdHJscGlwZSh1ZGV2LCAwKSwKLQkJCQlVU0JfUkVRX0NMRUFSX0ZFQVRVUkUsIFVTQl9SRUNJUF9JTlRFUkZBQ0UsCisJCQkJVVNCX1JFUV9TRVRfRkVBVFVSRSwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKIAkJCQlVU0JfSU5UUkZfRlVOQ19TVVNQRU5ELAkwLCBOVUxMLCAwLAogCQkJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIH0KQEAgLTUzMzcsMTEgKzUzMzUsMTAgQEAKIAl9CiAKIAlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX05PSU8pOwotCWlmIChidWYgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJubyBtZW0gdG8gcmUtcmVhZCBjb25maWdzIGFmdGVyIHJlc2V0XG4iKTsKKwlpZiAoIWJ1ZikKIAkJLyogYXNzdW1lIHRoZSB3b3JzdCAqLwogCQlyZXR1cm4gMTsKLQl9CisKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB1ZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9uczsgaW5kZXgrKykgewogCQlvbGRfbGVuZ3RoID0gbGUxNl90b19jcHUodWRldi0+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/ICJpbiIgOiAiaW4iKTsKKwkJCShlcG51bSAmIDEpID8gImluIiA6ICJvdXQiKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuICJVTktOT1dOIjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9mLXNpbXBsZS5jIGIvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9mLXNpbXBsZS5jCmluZGV4IGU1NmQ1OWIuLmZlNDE0ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1vZi1zaW1wbGUuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb2Ytc2ltcGxlLmMKQEAgLTM2LDM2ICszNiwyNSBAQAogCWludAkJCW51bV9jbG9ja3M7CiB9OwogCi1zdGF0aWMgaW50IGR3YzNfb2Zfc2ltcGxlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGR3YzNfb2Zfc2ltcGxlX2Nsa19pbml0KHN0cnVjdCBkd2MzX29mX3NpbXBsZSAqc2ltcGxlLCBpbnQgY291bnQpCiB7Ci0Jc3RydWN0IGR3YzNfb2Zfc2ltcGxlCSpzaW1wbGU7Ci0Jc3RydWN0IGRldmljZQkJKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRldmljZQkJKmRldiA9IHNpbXBsZS0+ZGV2OwogCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbnAgPSBkZXYtPm9mX25vZGU7Ci0KLQl1bnNpZ25lZCBpbnQJCWNvdW50OwotCWludAkJCXJldDsKIAlpbnQJCQlpOwogCi0Jc2ltcGxlID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzaW1wbGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNpbXBsZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljb3VudCA9IG9mX2Nsa19nZXRfcGFyZW50X2NvdW50KG5wKTsKLQlpZiAoIWNvdW50KQotCQlyZXR1cm4gLUVOT0VOVDsKLQogCXNpbXBsZS0+bnVtX2Nsb2NrcyA9IGNvdW50OwogCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisKIAlzaW1wbGUtPmNsa3MgPSBkZXZtX2tjYWxsb2MoZGV2LCBzaW1wbGUtPm51bV9jbG9ja3MsCiAJCQlzaXplb2Yoc3RydWN0IGNsayAqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzaW1wbGUtPmNsa3MpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc2ltcGxlKTsKLQlzaW1wbGUtPmRldiA9IGRldjsKLQogCWZvciAoaSA9IDA7IGkgPCBzaW1wbGUtPm51bV9jbG9ja3M7IGkrKykgewogCQlzdHJ1Y3QgY2xrCSpjbGs7CisJCWludAkJcmV0OwogCiAJCWNsayA9IG9mX2Nsa19nZXQobnAsIGkpOwogCQlpZiAoSVNfRVJSKGNsaykpIHsKQEAgLTg4LDYgKzc3LDI5IEBACiAJCXNpbXBsZS0+Y2xrc1tpXSA9IGNsazsKIAl9CiAKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkd2MzX29mX3NpbXBsZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkd2MzX29mX3NpbXBsZQkqc2ltcGxlOworCXN0cnVjdCBkZXZpY2UJCSpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbnAgPSBkZXYtPm9mX25vZGU7CisKKwlpbnQJCQlyZXQ7CisJaW50CQkJaTsKKworCXNpbXBsZSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqc2ltcGxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzaW1wbGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc2ltcGxlKTsKKwlzaW1wbGUtPmRldiA9IGRldjsKKworCXJldCA9IGR3YzNfb2Zfc2ltcGxlX2Nsa19pbml0KHNpbXBsZSwgb2ZfY2xrX2dldF9wYXJlbnRfY291bnQobnApKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJcmV0ID0gb2ZfcGxhdGZvcm1fcG9wdWxhdGUobnAsIE5VTEwsIE5VTEwsIGRldik7CiAJaWYgKHJldCkgewogCQlmb3IgKGkgPSAwOyBpIDwgc2ltcGxlLT5udW1fY2xvY2tzOyBpKyspIHsKQEAgLTExMiw3ICsxMjQsNyBAQAogCWludAkJCWk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2ltcGxlLT5udW1fY2xvY2tzOyBpKyspIHsKLQkJY2xrX3VucHJlcGFyZShzaW1wbGUtPmNsa3NbaV0pOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoc2ltcGxlLT5jbGtzW2ldKTsKIAkJY2xrX3B1dChzaW1wbGUtPmNsa3NbaV0pOwogCX0KIApAQCAtMTYyLDcgKzE3NCw5IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2R3YzNfc2ltcGxlX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLGR3YzMiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazMzOTktZHdjMyIgfSwKIAl7IC5jb21wYXRpYmxlID0gInhsbngsenlucW1wLWR3YzMiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJjYXZpdW0sb2N0ZW9uLTcxMzAtdXNiLXVjdGwiIH0sCiAJeyAvKiBTZW50aW5lbCAqLyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2ZfZHdjM19zaW1wbGVfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9kd2MzLXBjaS5jIGIvZHJpdmVycy91c2IvZHdjMy9kd2MzLXBjaS5jCmluZGV4IDJlYjg0ZDYuLjZkZjBmNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtcGNpLmMKQEAgLTI0Myw2ICsyNDMsMTUgQEAKIAlyZXR1cm4gLUVCVVNZOwogfQogCitzdGF0aWMgaW50IGR3YzNfcGNpX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkd2MzID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gcG1fcnVudGltZV9nZXQoJmR3YzMtPmRldik7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKIHN0YXRpYyBpbnQgZHdjM19wY2lfcG1fZHVtbXkoc3RydWN0IGRldmljZSAqZGV2KQogewogCS8qCkBAIC0yNTUsMTEgKzI2NCwxMSBAQAogCSAqLwogCXJldHVybiAwOwogfQotI2VuZGlmIC8qIENPTkZJR19QTSAqLworI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogCiBzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgZHdjM19wY2lfZGV2X3BtX29wcyA9IHsKIAlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhkd2MzX3BjaV9wbV9kdW1teSwgZHdjM19wY2lfcG1fZHVtbXkpCi0JU0VUX1JVTlRJTUVfUE1fT1BTKGR3YzNfcGNpX3J1bnRpbWVfc3VzcGVuZCwgZHdjM19wY2lfcG1fZHVtbXksCisJU0VUX1JVTlRJTUVfUE1fT1BTKGR3YzNfcGNpX3J1bnRpbWVfc3VzcGVuZCwgZHdjM19wY2lfcnVudGltZV9yZXN1bWUsCiAJCU5VTEwpCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jIGIvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuYwppbmRleCAxZjU1OTdlLi4wN2NjODkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmMKQEAgLTE3NCwxNSArMTc0LDggQEAKIAkJaW50IHN0YXR1cykKIHsKIAlzdHJ1Y3QgZHdjMwkJCSpkd2MgPSBkZXAtPmR3YzsKLQlpbnQJCQkJaTsKIAotCWlmIChyZXEtPnN0YXJ0ZWQpIHsKLQkJaSA9IDA7Ci0JCWRvIHsKLQkJCWR3YzNfZXBfaW5jX2RlcShkZXApOwotCQl9IHdoaWxlKCsraSA8IHJlcS0+cmVxdWVzdC5udW1fbWFwcGVkX3Nncyk7Ci0JCXJlcS0+c3RhcnRlZCA9IGZhbHNlOwotCX0KKwlyZXEtPnN0YXJ0ZWQgPSBmYWxzZTsKIAlsaXN0X2RlbCgmcmVxLT5saXN0KTsKIAlyZXEtPnRyYiA9IE5VTEw7CiAKQEAgLTM0OCw3ICszNDEsOCBAQAogCSAqIElOIHRyYW5zZmVycyBkdWUgdG8gYSBtaXNoYW5kbGVkIGVycm9yIGNvbmRpdGlvbi4gU3lub3BzeXMKIAkgKiBTVEFSIDkwMDA2MTQyNTIuCiAJICovCi0JaWYgKGRlcC0+ZGlyZWN0aW9uICYmIChkd2MtPnJldmlzaW9uID49IERXQzNfUkVWSVNJT05fMjYwQSkpCisJaWYgKGRlcC0+ZGlyZWN0aW9uICYmIChkd2MtPnJldmlzaW9uID49IERXQzNfUkVWSVNJT05fMjYwQSkgJiYKKwkgICAgKGR3Yy0+Z2FkZ2V0LnNwZWVkID49IFVTQl9TUEVFRF9TVVBFUikpCiAJCWNtZCB8PSBEV0MzX0RFUENNRF9DTEVBUlBFTkRJTjsKIAogCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CkBAIC00OTAsNyArNDg0LDggQEAKIAkJcGFyYW1zLnBhcmFtMCB8PSBEV0MzX0RFUENGR19BQ1RJT05fSU5JVDsKIAl9CiAKLQlwYXJhbXMucGFyYW0xID0gRFdDM19ERVBDRkdfWEZFUl9DT01QTEVURV9FTjsKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChkZXNjKSkKKwkJcGFyYW1zLnBhcmFtMSA9IERXQzNfREVQQ0ZHX1hGRVJfQ09NUExFVEVfRU47CiAKIAlpZiAoZGVwLT5udW1iZXIgPD0gMSB8fCB1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlc2MpKQogCQlwYXJhbXMucGFyYW0xIHw9IERXQzNfREVQQ0ZHX1hGRVJfTk9UX1JFQURZX0VOOwpAQCAtNzY0LDYgKzc1OSw4IEBACiAJa2ZyZWUocmVxKTsKIH0KIAorc3RhdGljIHUzMiBkd2MzX2NhbGNfdHJic19sZWZ0KHN0cnVjdCBkd2MzX2VwICpkZXApOworCiAvKioKICAqIGR3YzNfcHJlcGFyZV9vbmVfdHJiIC0gc2V0dXAgb25lIFRSQiBmcm9tIG9uZSByZXF1ZXN0CiAgKiBAZGVwOiBlbmRwb2ludCBmb3Igd2hpY2ggdGhpcyByZXF1ZXN0IGlzIHByZXBhcmVkCkBAIC03NzEsMTUgKzc2OCwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBkd2MzX3ByZXBhcmVfb25lX3RyYihzdHJ1Y3QgZHdjM19lcCAqZGVwLAogCQlzdHJ1Y3QgZHdjM19yZXF1ZXN0ICpyZXEsIGRtYV9hZGRyX3QgZG1hLAotCQl1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIGxhc3QsIHVuc2lnbmVkIGNoYWluLCB1bnNpZ25lZCBub2RlKQorCQl1bnNpZ25lZCBsZW5ndGgsIHVuc2lnbmVkIGNoYWluLCB1bnNpZ25lZCBub2RlKQogewogCXN0cnVjdCBkd2MzX3RyYgkJKnRyYjsKIAotCWR3YzNfdHJhY2UodHJhY2VfZHdjM19nYWRnZXQsICIlczogcmVxICVwIGRtYSAlMDhsbHggbGVuZ3RoICVkJXMlcyIsCisJZHdjM190cmFjZSh0cmFjZV9kd2MzX2dhZGdldCwgIiVzOiByZXEgJXAgZG1hICUwOGxseCBsZW5ndGggJWQlcyIsCiAJCQlkZXAtPm5hbWUsIHJlcSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgZG1hLAotCQkJbGVuZ3RoLCBsYXN0ID8gIiBsYXN0IiA6ICIiLAotCQkJY2hhaW4gPyAiIGNoYWluIiA6ICIiKTsKLQorCQkJbGVuZ3RoLCBjaGFpbiA/ICIgY2hhaW4iIDogIiIpOwogCiAJdHJiID0gJmRlcC0+dHJiX3Bvb2xbZGVwLT50cmJfZW5xdWV1ZV07CiAKQEAgLTgyNiwxMiArODIxLDEwIEBACiAJLyogYWx3YXlzIGVuYWJsZSBDb250aW51ZSBvbiBTaG9ydCBQYWNrZXQgKi8KIAl0cmItPmN0cmwgfD0gRFdDM19UUkJfQ1RSTF9DU1A7CiAKLQlpZiAoIXJlcS0+cmVxdWVzdC5ub19pbnRlcnJ1cHQgJiYgIWNoYWluKQorCWlmICgoIXJlcS0+cmVxdWVzdC5ub19pbnRlcnJ1cHQgJiYgIWNoYWluKSB8fAorCQkJKGR3YzNfY2FsY190cmJzX2xlZnQoZGVwKSA9PSAwKSkKIAkJdHJiLT5jdHJsIHw9IERXQzNfVFJCX0NUUkxfSU9DIHwgRFdDM19UUkJfQ1RSTF9JU1BfSU1JOwogCi0JaWYgKGxhc3QgJiYgIXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVwLT5lbmRwb2ludC5kZXNjKSkKLQkJdHJiLT5jdHJsIHw9IERXQzNfVFJCX0NUUkxfTFNUOwotCiAJaWYgKGNoYWluKQogCQl0cmItPmN0cmwgfD0gRFdDM19UUkJfQ1RSTF9DSE47CiAKQEAgLTg1NiwxMiArODQ5LDEyIEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZHdjM190cmIgKmR3YzNfZXBfcHJldl90cmIoc3RydWN0IGR3YzNfZXAgKmRlcCwgdTggaW5kZXgpCiB7Ci0JaWYgKCFpbmRleCkKLQkJaW5kZXggPSBEV0MzX1RSQl9OVU0gLSAyOwotCWVsc2UKLQkJaW5kZXggPSBkZXAtPnRyYl9lbnF1ZXVlIC0gMTsKKwl1OCB0bXAgPSBpbmRleDsKIAotCXJldHVybiAmZGVwLT50cmJfcG9vbFtpbmRleF07CisJaWYgKCF0bXApCisJCXRtcCA9IERXQzNfVFJCX05VTSAtIDE7CisKKwlyZXR1cm4gJmRlcC0+dHJiX3Bvb2xbdG1wIC0gMV07CiB9CiAKIHN0YXRpYyB1MzIgZHdjM19jYWxjX3RyYnNfbGVmdChzdHJ1Y3QgZHdjM19lcCAqZGVwKQpAQCAtODk0LDY1ICs4ODcsNDIgQEAKIH0KIAogc3RhdGljIHZvaWQgZHdjM19wcmVwYXJlX29uZV90cmJfc2coc3RydWN0IGR3YzNfZXAgKmRlcCwKLQkJc3RydWN0IGR3YzNfcmVxdWVzdCAqcmVxLCB1bnNpZ25lZCBpbnQgdHJic19sZWZ0LAotCQl1bnNpZ25lZCBpbnQgbW9yZV9jb21pbmcpCisJCXN0cnVjdCBkd2MzX3JlcXVlc3QgKnJlcSkKIHsKLQlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcXVlc3QgPSAmcmVxLT5yZXF1ZXN0OwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSByZXF1ZXN0LT5zZzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gcmVxLT5zZzsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnM7Ci0JdW5zaWduZWQgaW50CWxhc3QgPSBmYWxzZTsKIAl1bnNpZ25lZCBpbnQJbGVuZ3RoOwogCWRtYV9hZGRyX3QJZG1hOwogCWludAkJaTsKIAotCWZvcl9lYWNoX3NnKHNnLCBzLCByZXF1ZXN0LT5udW1fbWFwcGVkX3NncywgaSkgeworCWZvcl9lYWNoX3NnKHNnLCBzLCByZXEtPm51bV9wZW5kaW5nX3NncywgaSkgewogCQl1bnNpZ25lZCBjaGFpbiA9IHRydWU7CiAKIAkJbGVuZ3RoID0gc2dfZG1hX2xlbihzKTsKIAkJZG1hID0gc2dfZG1hX2FkZHJlc3Mocyk7CiAKLQkJaWYgKHNnX2lzX2xhc3QocykpIHsKLQkJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZGVwLT5lbmRwb2ludC5kZXNjKSB8fAotCQkJCSFtb3JlX2NvbWluZykKLQkJCQlsYXN0ID0gdHJ1ZTsKLQotCQkJY2hhaW4gPSBmYWxzZTsKLQkJfQotCi0JCWlmICghdHJic19sZWZ0LS0pCi0JCQlsYXN0ID0gdHJ1ZTsKLQotCQlpZiAobGFzdCkKKwkJaWYgKHNnX2lzX2xhc3QocykpCiAJCQljaGFpbiA9IGZhbHNlOwogCiAJCWR3YzNfcHJlcGFyZV9vbmVfdHJiKGRlcCwgcmVxLCBkbWEsIGxlbmd0aCwKLQkJCQlsYXN0LCBjaGFpbiwgaSk7CisJCQkJY2hhaW4sIGkpOwogCi0JCWlmIChsYXN0KQorCQlpZiAoIWR3YzNfY2FsY190cmJzX2xlZnQoZGVwKSkKIAkJCWJyZWFrOwogCX0KIH0KIAogc3RhdGljIHZvaWQgZHdjM19wcmVwYXJlX29uZV90cmJfbGluZWFyKHN0cnVjdCBkd2MzX2VwICpkZXAsCi0JCXN0cnVjdCBkd2MzX3JlcXVlc3QgKnJlcSwgdW5zaWduZWQgaW50IHRyYnNfbGVmdCwKLQkJdW5zaWduZWQgaW50IG1vcmVfY29taW5nKQorCQlzdHJ1Y3QgZHdjM19yZXF1ZXN0ICpyZXEpCiB7Ci0JdW5zaWduZWQgaW50CWxhc3QgPSBmYWxzZTsKIAl1bnNpZ25lZCBpbnQJbGVuZ3RoOwogCWRtYV9hZGRyX3QJZG1hOwogCiAJZG1hID0gcmVxLT5yZXF1ZXN0LmRtYTsKIAlsZW5ndGggPSByZXEtPnJlcXVlc3QubGVuZ3RoOwogCi0JaWYgKCF0cmJzX2xlZnQpCi0JCWxhc3QgPSB0cnVlOwotCi0JLyogSXMgdGhpcyB0aGUgbGFzdCByZXF1ZXN0PyAqLwotCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZGVwLT5lbmRwb2ludC5kZXNjKSB8fCAhbW9yZV9jb21pbmcpCi0JCWxhc3QgPSB0cnVlOwotCiAJZHdjM19wcmVwYXJlX29uZV90cmIoZGVwLCByZXEsIGRtYSwgbGVuZ3RoLAotCQkJbGFzdCwgZmFsc2UsIDApOworCQkJZmFsc2UsIDApOwogfQogCiAvKgpAQCAtOTY2LDI2ICs5MzYsMTkgQEAKIHN0YXRpYyB2b2lkIGR3YzNfcHJlcGFyZV90cmJzKHN0cnVjdCBkd2MzX2VwICpkZXApCiB7CiAJc3RydWN0IGR3YzNfcmVxdWVzdAkqcmVxLCAqbjsKLQl1bnNpZ25lZCBpbnQJCW1vcmVfY29taW5nOwotCXUzMgkJCXRyYnNfbGVmdDsKIAogCUJVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMihEV0MzX1RSQl9OVU0pOwogCi0JdHJic19sZWZ0ID0gZHdjM19jYWxjX3RyYnNfbGVmdChkZXApOwotCWlmICghdHJic19sZWZ0KQorCWlmICghZHdjM19jYWxjX3RyYnNfbGVmdChkZXApKQogCQlyZXR1cm47CiAKLQltb3JlX2NvbWluZyA9IGRlcC0+YWxsb2NhdGVkX3JlcXVlc3RzIC0gZGVwLT5xdWV1ZWRfcmVxdWVzdHM7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCBuLCAmZGVwLT5wZW5kaW5nX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHJlcS0+cmVxdWVzdC5udW1fbWFwcGVkX3NncyA+IDApCi0JCQlkd2MzX3ByZXBhcmVfb25lX3RyYl9zZyhkZXAsIHJlcSwgdHJic19sZWZ0LS0sCi0JCQkJCW1vcmVfY29taW5nKTsKKwkJaWYgKHJlcS0+bnVtX3BlbmRpbmdfc2dzID4gMCkKKwkJCWR3YzNfcHJlcGFyZV9vbmVfdHJiX3NnKGRlcCwgcmVxKTsKIAkJZWxzZQotCQkJZHdjM19wcmVwYXJlX29uZV90cmJfbGluZWFyKGRlcCwgcmVxLCB0cmJzX2xlZnQtLSwKLQkJCQkJbW9yZV9jb21pbmcpOworCQkJZHdjM19wcmVwYXJlX29uZV90cmJfbGluZWFyKGRlcCwgcmVxKTsKIAotCQlpZiAoIXRyYnNfbGVmdCkKKwkJaWYgKCFkd2MzX2NhbGNfdHJic19sZWZ0KGRlcCkpCiAJCQlyZXR1cm47CiAJfQogfQpAQCAtMTEwMSw5MyArMTA2NCwyOSBAQAogCiAJdHJhY2VfZHdjM19lcF9xdWV1ZShyZXEpOwogCi0JLyoKLQkgKiBXZSBvbmx5IGFkZCB0byBvdXIgbGlzdCBvZiByZXF1ZXN0cyBub3cgYW5kCi0JICogc3RhcnQgY29uc3VtaW5nIHRoZSBsaXN0IG9uY2Ugd2UgZ2V0IFhmZXJOb3RSZWFkeQotCSAqIElSUS4KLQkgKgotCSAqIFRoYXQgd2F5LCB3ZSBhdm9pZCBkb2luZyBhbnl0aGluZyB0aGF0IHdlIGRvbid0IG5lZWQKLQkgKiB0byBkbyBub3cgYW5kIGRlZmVyIGl0IHVudGlsIHRoZSBwb2ludCB3ZSByZWNlaXZlIGEKLQkgKiBwYXJ0aWN1bGFyIHRva2VuIGZyb20gdGhlIEhvc3Qgc2lkZS4KLQkgKgotCSAqIFRoaXMgd2lsbCBhbHNvIGF2b2lkIEhvc3QgY2FuY2VsbGluZyBVUkJzIGR1ZSB0byB0b28KLQkgKiBtYW55IE5BS3MuCi0JICovCiAJcmV0ID0gdXNiX2dhZGdldF9tYXBfcmVxdWVzdCgmZHdjLT5nYWRnZXQsICZyZXEtPnJlcXVlc3QsCiAJCQlkZXAtPmRpcmVjdGlvbik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXJlcS0+c2cJCQk9IHJlcS0+cmVxdWVzdC5zZzsKKwlyZXEtPm51bV9wZW5kaW5nX3Nncwk9IHJlcS0+cmVxdWVzdC5udW1fbWFwcGVkX3NnczsKKwogCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJmRlcC0+cGVuZGluZ19saXN0KTsKIAotCS8qCi0JICogSWYgdGhlcmUgYXJlIG5vIHBlbmRpbmcgcmVxdWVzdHMgYW5kIHRoZSBlbmRwb2ludCBpc24ndCBhbHJlYWR5Ci0JICogYnVzeSwgd2Ugd2lsbCBqdXN0IHN0YXJ0IHRoZSByZXF1ZXN0IHN0cmFpZ2h0IGF3YXkuCi0JICoKLQkgKiBUaGlzIHdpbGwgc2F2ZSBvbmUgSVJRIChYRkVSX05PVF9SRUFEWSkgYW5kIHBvc3NpYmx5IG1ha2UgaXQgYQotCSAqIGxpdHRsZSBiaXQgZmFzdGVyLgotCSAqLwotCWlmICghdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXAtPmVuZHBvaW50LmRlc2MpICYmCi0JCQkhdXNiX2VuZHBvaW50X3hmZXJfaW50KGRlcC0+ZW5kcG9pbnQuZGVzYykpIHsKLQkJcmV0ID0gX19kd2MzX2dhZGdldF9raWNrX3RyYW5zZmVyKGRlcCwgMCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogVGhlcmUgYXJlIGEgZmV3IHNwZWNpYWwgY2FzZXM6Ci0JICoKLQkgKiAxLiBYZmVyTm90UmVhZHkgd2l0aCBlbXB0eSBsaXN0IG9mIHJlcXVlc3RzLiBXZSBuZWVkIHRvIGtpY2sgdGhlCi0JICogICAgdHJhbnNmZXIgaGVyZSBpbiB0aGF0IHNpdHVhdGlvbiwgb3RoZXJ3aXNlIHdlIHdpbGwgYmUgTkFLaW5nCi0JICogICAgZm9yZXZlci4gSWYgd2UgZ2V0IFhmZXJOb3RSZWFkeSBiZWZvcmUgZ2FkZ2V0IGRyaXZlciBoYXMgYQotCSAqICAgIGNoYW5jZSB0byBxdWV1ZSBhIHJlcXVlc3QsIHdlIHdpbGwgQUNLIHRoZSBJUlEgYnV0IHdvbid0IGJlCi0JICogICAgYWJsZSB0byByZWNlaXZlIHRoZSBkYXRhIHVudGlsIHRoZSBuZXh0IHJlcXVlc3QgaXMgcXVldWVkLgotCSAqICAgIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBoYW5kbGluZyBleGFjdGx5IHRoYXQuCi0JICoKLQkgKi8KLQlpZiAoZGVwLT5mbGFncyAmIERXQzNfRVBfUEVORElOR19SRVFVRVNUKSB7Ci0JCS8qCi0JCSAqIElmIHhmZXJub3RyZWFkeSBpcyBhbHJlYWR5IGVsYXBzZWQgYW5kIGl0IGlzIGEgY2FzZQotCQkgKiBvZiBpc29jIHRyYW5zZmVyLCB0aGVuIGlzc3VlIEVORCBUUkFOU0ZFUiwgc28gdGhhdAotCQkgKiB5b3UgY2FuIHJlY2VpdmUgeGZlcm5vdHJlYWR5IGFnYWluIGFuZCBjYW4gaGF2ZQotCQkgKiBub3Rpb24gb2YgY3VycmVudCBtaWNyb2ZyYW1lLgotCQkgKi8KLQkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVwLT5lbmRwb2ludC5kZXNjKSkgewotCQkJaWYgKGxpc3RfZW1wdHkoJmRlcC0+c3RhcnRlZF9saXN0KSkgewotCQkJCWR3YzNfc3RvcF9hY3RpdmVfdHJhbnNmZXIoZHdjLCBkZXAtPm51bWJlciwgdHJ1ZSk7Ci0JCQkJZGVwLT5mbGFncyA9IERXQzNfRVBfRU5BQkxFRDsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJcmV0ID0gX19kd2MzX2dhZGdldF9raWNrX3RyYW5zZmVyKGRlcCwgMCk7Ci0JCWlmICghcmV0KQotCQkJZGVwLT5mbGFncyAmPSB+RFdDM19FUF9QRU5ESU5HX1JFUVVFU1Q7Ci0KLQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiAyLiBYZmVySW5Qcm9ncmVzcyBvbiBJc29jIEVQIHdpdGggYW4gYWN0aXZlIHRyYW5zZmVyLiBXZSBuZWVkIHRvCi0JICogICAga2ljayB0aGUgdHJhbnNmZXIgaGVyZSBhZnRlciBxdWV1aW5nIGEgcmVxdWVzdCwgb3RoZXJ3aXNlIHRoZQotCSAqICAgIGNvcmUgbWF5IG5vdCBzZWUgdGhlIG1vZGlmaWVkIFRSQihzKS4KLQkgKi8KIAlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXAtPmVuZHBvaW50LmRlc2MpICYmCi0JCQkoZGVwLT5mbGFncyAmIERXQzNfRVBfQlVTWSkgJiYKLQkJCSEoZGVwLT5mbGFncyAmIERXQzNfRVBfTUlTU0VEX0lTT0MpKSB7Ci0JCVdBUk5fT05fT05DRSghZGVwLT5yZXNvdXJjZV9pbmRleCk7Ci0JCXJldCA9IF9fZHdjM19nYWRnZXRfa2lja190cmFuc2ZlcihkZXAsIGRlcC0+cmVzb3VyY2VfaW5kZXgpOwotCQlnb3RvIG91dDsKKwkJCWRlcC0+ZmxhZ3MgJiBEV0MzX0VQX1BFTkRJTkdfUkVRVUVTVCkgeworCQlpZiAobGlzdF9lbXB0eSgmZGVwLT5zdGFydGVkX2xpc3QpKSB7CisJCQlkd2MzX3N0b3BfYWN0aXZlX3RyYW5zZmVyKGR3YywgZGVwLT5udW1iZXIsIHRydWUpOworCQkJZGVwLT5mbGFncyA9IERXQzNfRVBfRU5BQkxFRDsKKwkJfQorCQlyZXR1cm4gMDsKIAl9CiAKLQkvKgotCSAqIDQuIFN0cmVhbSBDYXBhYmxlIEJ1bGsgRW5kcG9pbnRzLiBXZSBuZWVkIHRvIHN0YXJ0IHRoZSB0cmFuc2ZlcgotCSAqIHJpZ2h0IGF3YXksIG90aGVyd2lzZSBob3N0IHdpbGwgbm90IGtub3cgd2UgaGF2ZSBzdHJlYW1zIHRvIGJlCi0JICogaGFuZGxlZC4KLQkgKi8KLQlpZiAoZGVwLT5zdHJlYW1fY2FwYWJsZSkKLQkJcmV0ID0gX19kd2MzX2dhZGdldF9raWNrX3RyYW5zZmVyKGRlcCwgMCk7CisJaWYgKCFkd2MzX2NhbGNfdHJic19sZWZ0KGRlcCkpCisJCXJldHVybiAwOwogCi1vdXQ6CisJcmV0ID0gX19kd2MzX2dhZGdldF9raWNrX3RyYW5zZmVyKGRlcCwgMCk7CiAJaWYgKHJldCAmJiByZXQgIT0gLUVCVVNZKQogCQlkd2MzX3RyYWNlKHRyYWNlX2R3YzNfZ2FkZ2V0LAogCQkJCSIlczogZmFpbGVkIHRvIGtpY2sgdHJhbnNmZXJzIiwKQEAgLTE0MzMsNyArMTMzMiw3IEBACiAKIHN0YXRpYyBpbnQgX19kd2MzX2dhZGdldF93YWtldXAoc3RydWN0IGR3YzMgKmR3YykKIHsKLQl1bnNpZ25lZCBsb25nCQl0aW1lb3V0OworCWludAkJCXJldHJpZXM7CiAKIAlpbnQJCQlyZXQ7CiAJdTMyCQkJcmVnOwpAQCAtMTQ4NCw5ICsxMzgzLDkgQEAKIAl9CiAKIAkvKiBwb2xsIHVudGlsIExpbmsgU3RhdGUgY2hhbmdlcyB0byBPTiAqLwotCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOworCXJldHJpZXMgPSAyMDAwMDsKIAotCXdoaWxlICghdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCXdoaWxlIChyZXRyaWVzLS0pIHsKIAkJcmVnID0gZHdjM19yZWFkbChkd2MtPnJlZ3MsIERXQzNfRFNUUyk7CiAKIAkJLyogaW4gSFMsIG1lYW5zIE9OICovCkBAIC0xOTYzLDYgKzE4NjIsNyBAQAogCXVuc2lnbmVkIGludAkJdHJiX3N0YXR1czsKIAogCWRlcC0+cXVldWVkX3JlcXVlc3RzLS07CisJZHdjM19lcF9pbmNfZGVxKGRlcCk7CiAJdHJhY2VfZHdjM19jb21wbGV0ZV90cmIoZGVwLCB0cmIpOwogCiAJLyoKQEAgLTE5ODIsNiArMTg4Miw3IEBACiAJCXJldHVybiAxOwogCiAJY291bnQgPSB0cmItPnNpemUgJiBEV0MzX1RSQl9TSVpFX01BU0s7CisJcmVxLT5yZXF1ZXN0LmFjdHVhbCArPSBjb3VudDsKIAogCWlmIChkZXAtPmRpcmVjdGlvbikgewogCQlpZiAoY291bnQpIHsKQEAgLTIwMjEsNDggKzE5MjIsNTEgQEAKIAogCWlmIChzX3BrdCAmJiAhY2hhaW4pCiAJCXJldHVybiAxOwotCWlmICgoZXZlbnQtPnN0YXR1cyAmIERFUEVWVF9TVEFUVVNfTFNUKSAmJgotCQkJKHRyYi0+Y3RybCAmIChEV0MzX1RSQl9DVFJMX0xTVCB8Ci0JCQkJRFdDM19UUkJfQ1RSTF9IV08pKSkKLQkJcmV0dXJuIDE7CisKIAlpZiAoKGV2ZW50LT5zdGF0dXMgJiBERVBFVlRfU1RBVFVTX0lPQykgJiYKIAkJCSh0cmItPmN0cmwgJiBEV0MzX1RSQl9DVFJMX0lPQykpCiAJCXJldHVybiAxOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZHdjM19jbGVhbnVwX2RvbmVfcmVxcyhzdHJ1Y3QgZHdjMyAqZHdjLCBzdHJ1Y3QgZHdjM19lcCAqZGVwLAogCQljb25zdCBzdHJ1Y3QgZHdjM19ldmVudF9kZXBldnQgKmV2ZW50LCBpbnQgc3RhdHVzKQogewotCXN0cnVjdCBkd2MzX3JlcXVlc3QJKnJlcTsKKwlzdHJ1Y3QgZHdjM19yZXF1ZXN0CSpyZXEsICpuOwogCXN0cnVjdCBkd2MzX3RyYgkJKnRyYjsKLQl1bnNpZ25lZCBpbnQJCXNsb3Q7Ci0JdW5zaWduZWQgaW50CQlpOwotCWludAkJCWNvdW50ID0gMDsKKwlib29sCQkJaW9jID0gZmFsc2U7CiAJaW50CQkJcmV0OwogCi0JZG8geworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXEsIG4sICZkZXAtPnN0YXJ0ZWRfbGlzdCwgbGlzdCkgeworCQl1bnNpZ25lZCBsZW5ndGg7CisJCXVuc2lnbmVkIGFjdHVhbDsKIAkJaW50IGNoYWluOwogCi0JCXJlcSA9IG5leHRfcmVxdWVzdCgmZGVwLT5zdGFydGVkX2xpc3QpOwotCQlpZiAoV0FSTl9PTl9PTkNFKCFyZXEpKQotCQkJcmV0dXJuIDE7CisJCWxlbmd0aCA9IHJlcS0+cmVxdWVzdC5sZW5ndGg7CisJCWNoYWluID0gcmVxLT5udW1fcGVuZGluZ19zZ3MgPiAwOworCQlpZiAoY2hhaW4pIHsKKwkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSByZXEtPnNnOworCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCQkJdW5zaWduZWQgaW50IHBlbmRpbmcgPSByZXEtPm51bV9wZW5kaW5nX3NnczsKKwkJCXVuc2lnbmVkIGludCBpOwogCi0JCWNoYWluID0gcmVxLT5yZXF1ZXN0Lm51bV9tYXBwZWRfc2dzID4gMDsKLQkJaSA9IDA7Ci0JCWRvIHsKLQkJCXNsb3QgPSByZXEtPmZpcnN0X3RyYl9pbmRleCArIGk7Ci0JCQlpZiAoc2xvdCA9PSBEV0MzX1RSQl9OVU0gLSAxKQotCQkJCXNsb3QrKzsKLQkJCXNsb3QgJT0gRFdDM19UUkJfTlVNOwotCQkJdHJiID0gJmRlcC0+dHJiX3Bvb2xbc2xvdF07Ci0JCQljb3VudCArPSB0cmItPnNpemUgJiBEV0MzX1RSQl9TSVpFX01BU0s7CisJCQlmb3JfZWFjaF9zZyhzZywgcywgcGVuZGluZywgaSkgeworCQkJCXRyYiA9ICZkZXAtPnRyYl9wb29sW2RlcC0+dHJiX2RlcXVldWVdOwogCisJCQkJcmVxLT5zZyA9IHNnX25leHQocyk7CisJCQkJcmVxLT5udW1fcGVuZGluZ19zZ3MtLTsKKworCQkJCXJldCA9IF9fZHdjM19jbGVhbnVwX2RvbmVfdHJicyhkd2MsIGRlcCwgcmVxLCB0cmIsCisJCQkJCQlldmVudCwgc3RhdHVzLCBjaGFpbik7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0cmIgPSAmZGVwLT50cmJfcG9vbFtkZXAtPnRyYl9kZXF1ZXVlXTsKIAkJCXJldCA9IF9fZHdjM19jbGVhbnVwX2RvbmVfdHJicyhkd2MsIGRlcCwgcmVxLCB0cmIsCiAJCQkJCWV2ZW50LCBzdGF0dXMsIGNoYWluKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCX0gd2hpbGUgKCsraSA8IHJlcS0+cmVxdWVzdC5udW1fbWFwcGVkX3Nncyk7CisJCX0KIAogCQkvKgogCQkgKiBXZSBhc3N1bWUgaGVyZSB3ZSB3aWxsIGFsd2F5cyByZWNlaXZlIHRoZSBlbnRpcmUgZGF0YSBibG9jawpAQCAtMjA3MSwxMiArMTk3NSwyMSBAQAogCQkgKiBzaG91bGQgcmVjZWl2ZSBhbmQgd2Ugc2ltcGx5IGJvdW5jZSB0aGUgcmVxdWVzdCBiYWNrIHRvIHRoZQogCQkgKiBnYWRnZXQgZHJpdmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcuCiAJCSAqLwotCQlyZXEtPnJlcXVlc3QuYWN0dWFsICs9IHJlcS0+cmVxdWVzdC5sZW5ndGggLSBjb3VudDsKKwkJYWN0dWFsID0gbGVuZ3RoIC0gcmVxLT5yZXF1ZXN0LmFjdHVhbDsKKwkJcmVxLT5yZXF1ZXN0LmFjdHVhbCA9IGFjdHVhbDsKKworCQlpZiAocmV0ICYmIGNoYWluICYmIChhY3R1YWwgPCBsZW5ndGgpICYmIHJlcS0+bnVtX3BlbmRpbmdfc2dzKQorCQkJcmV0dXJuIF9fZHdjM19nYWRnZXRfa2lja190cmFuc2ZlcihkZXAsIDApOworCiAJCWR3YzNfZ2FkZ2V0X2dpdmViYWNrKGRlcCwgcmVxLCBzdGF0dXMpOwogCi0JCWlmIChyZXQpCisJCWlmIChyZXQpIHsKKwkJCWlmICgoZXZlbnQtPnN0YXR1cyAmIERFUEVWVF9TVEFUVVNfSU9DKSAmJgorCQkJICAgICh0cmItPmN0cmwgJiBEV0MzX1RSQl9DVFJMX0lPQykpCisJCQkJaW9jID0gdHJ1ZTsKIAkJCWJyZWFrOwotCX0gd2hpbGUgKDEpOworCQl9CisJfQogCiAJLyoKIAkgKiBPdXIgZW5kcG9pbnQgbWlnaHQgZ2V0IGRpc2FibGVkIGJ5IGFub3RoZXIgdGhyZWFkIGR1cmluZwpAQCAtMjEwMywxMCArMjAxNiw5IEBACiAJCXJldHVybiAxOwogCX0KIAotCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlcC0+ZW5kcG9pbnQuZGVzYykpCi0JCWlmICgoZXZlbnQtPnN0YXR1cyAmIERFUEVWVF9TVEFUVVNfSU9DKSAmJgotCQkJCSh0cmItPmN0cmwgJiBEV0MzX1RSQl9DVFJMX0lPQykpCi0JCQlyZXR1cm4gMDsKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXAtPmVuZHBvaW50LmRlc2MpICYmIGlvYykKKwkJcmV0dXJuIDA7CisKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjMyMiw2ICsyMjM0LDE4IEBACiAJICoKIAkgKiAtIElzc3VlIEVuZFRyYW5zZmVyIFdJVEggQ01ESU9DIGJpdCBzZXQKIAkgKiAtIFdhaXQgMTAwdXMKKwkgKgorCSAqIEFzIG9mIElQIHZlcnNpb24gMy4xMGEgb2YgdGhlIERXQ191c2IzIElQLCB0aGUgY29udHJvbGxlcgorCSAqIHN1cHBvcnRzIGEgbW9kZSB0byB3b3JrIGFyb3VuZCB0aGUgYWJvdmUgbGltaXRhdGlvbi4gVGhlCisJICogc29mdHdhcmUgY2FuIHBvbGwgdGhlIENNREFDVCBiaXQgaW4gdGhlIERFUENNRCByZWdpc3RlcgorCSAqIGFmdGVyIGlzc3VpbmcgYSBFbmRUcmFuc2ZlciBjb21tYW5kLiBUaGlzIG1vZGUgaXMgZW5hYmxlZAorCSAqIGJ5IHdyaXRpbmcgR1VDVEwyWzE0XS4gVGhpcyBwb2xsaW5nIGlzIGFscmVhZHkgZG9uZSBpbiB0aGUKKwkgKiBkd2MzX3NlbmRfZ2FkZ2V0X2VwX2NtZCgpIGZ1bmN0aW9uIHNvIGlmIHRoZSBtb2RlIGlzCisJICogZW5hYmxlZCwgdGhlIEVuZFRyYW5zZmVyIGNvbW1hbmQgd2lsbCBoYXZlIGNvbXBsZXRlZCB1cG9uCisJICogcmV0dXJuaW5nIGZyb20gdGhpcyBmdW5jdGlvbiBhbmQgd2UgZG9uJ3QgbmVlZCB0byBkZWxheSBmb3IKKwkgKiAxMDB1cy4KKwkgKgorCSAqIFRoaXMgbW9kZSBpcyBOT1QgYXZhaWxhYmxlIG9uIHRoZSBEV0NfdXNiMzEgSVAuCiAJICovCiAKIAljbWQgPSBEV0MzX0RFUENNRF9FTkRUUkFOU0ZFUjsKQEAgLTIzMzMsNyArMjI1Nyw5IEBACiAJV0FSTl9PTl9PTkNFKHJldCk7CiAJZGVwLT5yZXNvdXJjZV9pbmRleCA9IDA7CiAJZGVwLT5mbGFncyAmPSB+RFdDM19FUF9CVVNZOwotCXVkZWxheSgxMDApOworCisJaWYgKGR3YzNfaXNfdXNiMzEoZHdjKSB8fCBkd2MtPnJldmlzaW9uIDwgRFdDM19SRVZJU0lPTl8zMTBBKQorCQl1ZGVsYXkoMTAwKTsKIH0KIAogc3RhdGljIHZvaWQgZHdjM19zdG9wX2FjdGl2ZV90cmFuc2ZlcnMoc3RydWN0IGR3YzMgKmR3YykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvdWxwaS5jIGIvZHJpdmVycy91c2IvZHdjMy91bHBpLmMKaW5kZXggZWMwMDRjNi4uYmQ4NmY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy91bHBpLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMy91bHBpLmMKQEAgLTM1LDkgKzM1LDkgQEAKIAlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAotc3RhdGljIGludCBkd2MzX3VscGlfcmVhZChzdHJ1Y3QgdWxwaV9vcHMgKm9wcywgdTggYWRkcikKK3N0YXRpYyBpbnQgZHdjM191bHBpX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LCB1OCBhZGRyKQogewotCXN0cnVjdCBkd2MzICpkd2MgPSBkZXZfZ2V0X2RydmRhdGEob3BzLT5kZXYpOworCXN0cnVjdCBkd2MzICpkd2MgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1MzIgcmVnOwogCWludCByZXQ7CiAKQEAgLTUzLDkgKzUzLDkgQEAKIAlyZXR1cm4gRFdDM19HVVNCMlBIWUFDQ19EQVRBKHJlZyk7CiB9CiAKLXN0YXRpYyBpbnQgZHdjM191bHBpX3dyaXRlKHN0cnVjdCB1bHBpX29wcyAqb3BzLCB1OCBhZGRyLCB1OCB2YWwpCitzdGF0aWMgaW50IGR3YzNfdWxwaV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IGFkZHIsIHU4IHZhbCkKIHsKLQlzdHJ1Y3QgZHdjMyAqZHdjID0gZGV2X2dldF9kcnZkYXRhKG9wcy0+ZGV2KTsKKwlzdHJ1Y3QgZHdjMyAqZHdjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJdTMyIHJlZzsKIAogCXJlZyA9IERXQzNfR1VTQjJQSFlBQ0NfTkVXUkVHUkVRIHwgRFdDM19VTFBJX0FERFIoYWRkcik7CkBAIC02NSw3ICs2NSw3IEBACiAJcmV0dXJuIGR3YzNfdWxwaV9idXN5bG9vcChkd2MpOwogfQogCi1zdGF0aWMgc3RydWN0IHVscGlfb3BzIGR3YzNfdWxwaV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHVscGlfb3BzIGR3YzNfdWxwaV9vcHMgPSB7CiAJLnJlYWQgPSBkd2MzX3VscGlfcmVhZCwKIAkud3JpdGUgPSBkd2MzX3VscGlfd3JpdGUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwppbmRleCAzYzNmMzFjLi44YWQyMDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvS2NvbmZpZwpAQCAtMjA5LDI1ICsyMDksNiBAQAogY29uZmlnIFVTQl9GX1RDTQogCXRyaXN0YXRlCiAKLWNob2ljZQotCXRyaXN0YXRlICJVU0IgR2FkZ2V0IERyaXZlcnMiCi0JZGVmYXVsdCBVU0JfRVRICi0JaGVscAotCSAgQSBMaW51eCAiR2FkZ2V0IERyaXZlciIgdGFsa3MgdG8gdGhlIFVTQiBQZXJpcGhlcmFsIENvbnRyb2xsZXIKLQkgIGRyaXZlciB0aHJvdWdoIHRoZSBhYnN0cmFjdCAiZ2FkZ2V0IiBBUEkuICBTb21lIG90aGVyIG9wZXJhdGluZwotCSAgc3lzdGVtcyBjYWxsIHRoZXNlICJjbGllbnQiIGRyaXZlcnMsIG9mIHdoaWNoICJjbGFzcyBkcml2ZXJzIgotCSAgYXJlIGEgc3Vic2V0IChpbXBsZW1lbnRpbmcgYSBVU0IgZGV2aWNlIGNsYXNzIHNwZWNpZmljYXRpb24pLgotCSAgQSBnYWRnZXQgZHJpdmVyIGltcGxlbWVudHMgb25lIG9yIG1vcmUgVVNCIGZ1bmN0aW9ucyB1c2luZwotCSAgdGhlIHBlcmlwaGVyYWwgaGFyZHdhcmUuCi0KLQkgIEdhZGdldCBkcml2ZXJzIGFyZSBoYXJkd2FyZS1uZXV0cmFsLCBvciAicGxhdGZvcm0gaW5kZXBlbmRlbnQiLAotCSAgZXhjZXB0IHRoYXQgdGhleSBzb21ldGltZXMgbXVzdCB1bmRlcnN0YW5kIHF1aXJrcyBvciBsaW1pdGF0aW9ucwotCSAgb2YgdGhlIHBhcnRpY3VsYXIgY29udHJvbGxlcnMgdGhleSB3b3JrIHdpdGguICBGb3IgZXhhbXBsZSwgd2hlbgotCSAgYSBjb250cm9sbGVyIGRvZXNuJ3Qgc3VwcG9ydCBhbHRlcm5hdGUgY29uZmlndXJhdGlvbnMgb3IgcHJvdmlkZQotCSAgZW5vdWdoIG9mIHRoZSByaWdodCB0eXBlcyBvZiBlbmRwb2ludHMsIHRoZSBnYWRnZXQgZHJpdmVyIG1pZ2h0Ci0JICBub3QgYmUgYWJsZSB3b3JrIHdpdGggdGhhdCBjb250cm9sbGVyLCBvciBtaWdodCBuZWVkIHRvIGltcGxlbWVudAotCSAgYSBsZXNzIGNvbW1vbiB2YXJpYW50IG9mIGEgZGV2aWNlIGNsYXNzIHByb3RvY29sLgotCiAjIHRoaXMgZmlyc3Qgc2V0IG9mIGRyaXZlcnMgYWxsIGRlcGVuZCBvbiBidWxrLWNhcGFibGUgaGFyZHdhcmUuCiAKIGNvbmZpZyBVU0JfQ09ORklHRlMKQEAgLTQzOSw2ICs0MjAsNyBAQAogY29uZmlnIFVTQl9DT05GSUdGU19GX1VWQwogCWJvb2wgIlVTQiBXZWJjYW0gZnVuY3Rpb24iCiAJZGVwZW5kcyBvbiBVU0JfQ09ORklHRlMKKwlkZXBlbmRzIG9uIFZJREVPX1Y0TDIKIAlkZXBlbmRzIG9uIFZJREVPX0RFVgogCXNlbGVjdCBWSURFT0JVRjJfVk1BTExPQwogCXNlbGVjdCBVU0JfRl9VVkMKQEAgLTQ3NSw2ICs0NTcsMjUgQEAKIAkgIEJvdGggcHJvdG9jb2xzIGNhbiB3b3JrIG9uIFVTQjIuMCBhbmQgVVNCMy4wLgogCSAgVUFTIHV0aWxpemVzIHRoZSBVU0IgMy4wIGZlYXR1cmUgY2FsbGVkIHN0cmVhbXMgc3VwcG9ydC4KIAorY2hvaWNlCisJdHJpc3RhdGUgIlVTQiBHYWRnZXQgRHJpdmVycyIKKwlkZWZhdWx0IFVTQl9FVEgKKwloZWxwCisJICBBIExpbnV4ICJHYWRnZXQgRHJpdmVyIiB0YWxrcyB0byB0aGUgVVNCIFBlcmlwaGVyYWwgQ29udHJvbGxlcgorCSAgZHJpdmVyIHRocm91Z2ggdGhlIGFic3RyYWN0ICJnYWRnZXQiIEFQSS4gIFNvbWUgb3RoZXIgb3BlcmF0aW5nCisJICBzeXN0ZW1zIGNhbGwgdGhlc2UgImNsaWVudCIgZHJpdmVycywgb2Ygd2hpY2ggImNsYXNzIGRyaXZlcnMiCisJICBhcmUgYSBzdWJzZXQgKGltcGxlbWVudGluZyBhIFVTQiBkZXZpY2UgY2xhc3Mgc3BlY2lmaWNhdGlvbikuCisJICBBIGdhZGdldCBkcml2ZXIgaW1wbGVtZW50cyBvbmUgb3IgbW9yZSBVU0IgZnVuY3Rpb25zIHVzaW5nCisJICB0aGUgcGVyaXBoZXJhbCBoYXJkd2FyZS4KKworCSAgR2FkZ2V0IGRyaXZlcnMgYXJlIGhhcmR3YXJlLW5ldXRyYWwsIG9yICJwbGF0Zm9ybSBpbmRlcGVuZGVudCIsCisJICBleGNlcHQgdGhhdCB0aGV5IHNvbWV0aW1lcyBtdXN0IHVuZGVyc3RhbmQgcXVpcmtzIG9yIGxpbWl0YXRpb25zCisJICBvZiB0aGUgcGFydGljdWxhciBjb250cm9sbGVycyB0aGV5IHdvcmsgd2l0aC4gIEZvciBleGFtcGxlLCB3aGVuCisJICBhIGNvbnRyb2xsZXIgZG9lc24ndCBzdXBwb3J0IGFsdGVybmF0ZSBjb25maWd1cmF0aW9ucyBvciBwcm92aWRlCisJICBlbm91Z2ggb2YgdGhlIHJpZ2h0IHR5cGVzIG9mIGVuZHBvaW50cywgdGhlIGdhZGdldCBkcml2ZXIgbWlnaHQKKwkgIG5vdCBiZSBhYmxlIHdvcmsgd2l0aCB0aGF0IGNvbnRyb2xsZXIsIG9yIG1pZ2h0IG5lZWQgdG8gaW1wbGVtZW50CisJICBhIGxlc3MgY29tbW9uIHZhcmlhbnQgb2YgYSBkZXZpY2UgY2xhc3MgcHJvdG9jb2wuCisKIHNvdXJjZSAiZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9LY29uZmlnIgogCiBlbmRjaG9pY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYwppbmRleCA1ZWJlNmFmNy4uMzIxNzZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYwpAQCAtMTg5MywxNyArMTg5MywyMSBAQAogCQkvKiBmdW5jdGlvbnMgYWx3YXlzIGhhbmRsZSB0aGVpciBpbnRlcmZhY2VzIGFuZCBlbmRwb2ludHMuLi4KIAkJICogcHVudCBvdGhlciByZWNpcGllbnRzIChvdGhlciwgV1VTQiwgLi4uKSB0byB0aGUgY3VycmVudAogCQkgKiBjb25maWd1cmF0aW9uIGNvZGUuCi0JCSAqCi0JCSAqIFJFVklTSVQgaXQgY291bGQgbWFrZSBzZW5zZSB0byBsZXQgdGhlIGNvbXBvc2l0ZSBkZXZpY2UKLQkJICogdGFrZSBzdWNoIHJlcXVlc3RzIHRvbywgaWYgdGhhdCdzIGV2ZXIgbmVlZGVkOiAgdG8gd29yawotCQkgKiBpbiBjb25maWcgMCwgZXRjLgogCQkgKi8KIAkJaWYgKGNkZXYtPmNvbmZpZykgewogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmY2Rldi0+Y29uZmlnLT5mdW5jdGlvbnMsIGxpc3QpCi0JCQkJaWYgKGYtPnJlcV9tYXRjaCAmJiBmLT5yZXFfbWF0Y2goZiwgY3RybCkpCisJCQkJaWYgKGYtPnJlcV9tYXRjaCAmJgorCQkJCSAgICBmLT5yZXFfbWF0Y2goZiwgY3RybCwgZmFsc2UpKQogCQkJCQlnb3RvIHRyeV9mdW5fc2V0dXA7Ci0JCQlmID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYzsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNkZXYtPmNvbmZpZ3MsIGxpc3QpCisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmYy0+ZnVuY3Rpb25zLCBsaXN0KQorCQkJCQlpZiAoZi0+cmVxX21hdGNoICYmCisJCQkJCSAgICBmLT5yZXFfbWF0Y2goZiwgY3RybCwgdHJ1ZSkpCisJCQkJCQlnb3RvIHRyeV9mdW5fc2V0dXA7CiAJCX0KKwkJZiA9IE5VTEw7CiAKIAkJc3dpdGNoIChjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykgewogCQljYXNlIFVTQl9SRUNJUF9JTlRFUkZBQ0U6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29uZmlnZnMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb25maWdmcy5jCmluZGV4IGY5MjM3ZmUuLjM5ODQ3ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9jb25maWdmcy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb25maWdmcy5jCkBAIC0xMjExLDggKzEyMTEsOSBAQAogCiAJCQlsaXN0X21vdmVfdGFpbCgmZi0+bGlzdCwgJmNmZy0+ZnVuY19saXN0KTsKIAkJCWlmIChmLT51bmJpbmQpIHsKLQkJCQlkZXZfZXJyKCZnaS0+Y2Rldi5nYWRnZXQtPmRldiwgInVuYmluZCBmdW5jdGlvbiIKLQkJCQkJCSIgJyVzJy8lcFxuIiwgZi0+bmFtZSwgZik7CisJCQkJZGV2X2RiZygmZ2ktPmNkZXYuZ2FkZ2V0LT5kZXYsCisJCQkJICAgICAgICAgInVuYmluZCBmdW5jdGlvbiAnJXMnLyVwXG4iLAorCQkJCSAgICAgICAgIGYtPm5hbWUsIGYpOwogCQkJCWYtPnVuYmluZChjLCBmKTsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZWVtLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9lZW0uYwppbmRleCBkNThiZmMzLi4wMDdlYzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9lZW0uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9lZW0uYwpAQCAtMzQxLDExICszNDEsMTUgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZgkqc2tiMiA9IE5VTEw7CiAJc3RydWN0IHVzYl9lcAkqaW4gPSBwb3J0LT5pbl9lcDsKLQlpbnQJCXBhZGxlbiA9IDA7Ci0JdTE2CQlsZW4gPSBza2ItPmxlbjsKKwlpbnQJCWhlYWRyb29tLCB0YWlscm9vbSwgcGFkbGVuID0gMDsKKwl1MTYJCWxlbjsKIAotCWludCBoZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOwotCWludCB0YWlscm9vbSA9IHNrYl90YWlscm9vbShza2IpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHNrYi0+bGVuOworCWhlYWRyb29tID0gc2tiX2hlYWRyb29tKHNrYik7CisJdGFpbHJvb20gPSBza2JfdGFpbHJvb20oc2tiKTsKIAogCS8qIFdoZW4gKGxlbiArIEVFTV9ITEVOICsgRVRIX0ZDU19MRU4pICUgaW4tPm1heHBhY2tldCkgaXMgMCwKIAkgKiBzdGljayB0d28gYnl0ZXMgb2YgemVyby1sZW5ndGggRUVNIHBhY2tldCBvbiB0aGUgZW5kLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZnMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2ZzLmMKaW5kZXggNWM4NDI5Zi4uMGFlZWQ4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZnMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9mcy5jCkBAIC05OCw2ICs5OCw5IEBACiBzdGF0aWMgdm9pZCBmZnNfZnVuY19kaXNhYmxlKHN0cnVjdCB1c2JfZnVuY3Rpb24gKik7CiBzdGF0aWMgaW50IGZmc19mdW5jX3NldHVwKHN0cnVjdCB1c2JfZnVuY3Rpb24gKiwKIAkJCSAgY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKTsKK3N0YXRpYyBib29sIGZmc19mdW5jX3JlcV9tYXRjaChzdHJ1Y3QgdXNiX2Z1bmN0aW9uICosCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqLAorCQkJICAgICAgIGJvb2wgY29uZmlnMCk7CiBzdGF0aWMgdm9pZCBmZnNfZnVuY19zdXNwZW5kKHN0cnVjdCB1c2JfZnVuY3Rpb24gKik7CiBzdGF0aWMgdm9pZCBmZnNfZnVuY19yZXN1bWUoc3RydWN0IHVzYl9mdW5jdGlvbiAqKTsKIApAQCAtMjI0Myw3ICsyMjQ2LDkgQEAKIAkJCSAgICAgIEZVTkNUSU9ORlNfSEFTX1NTX0RFU0MgfAogCQkJICAgICAgRlVOQ1RJT05GU19IQVNfTVNfT1NfREVTQyB8CiAJCQkgICAgICBGVU5DVElPTkZTX1ZJUlRVQUxfQUREUiB8Ci0JCQkgICAgICBGVU5DVElPTkZTX0VWRU5URkQpKSB7CisJCQkgICAgICBGVU5DVElPTkZTX0VWRU5URkQgfAorCQkJICAgICAgRlVOQ1RJT05GU19BTExfQ1RSTF9SRUNJUCB8CisJCQkgICAgICBGVU5DVElPTkZTX0NPTkZJRzBfU0VUVVApKSB7CiAJCQlyZXQgPSAtRU5PU1lTOwogCQkJZ290byBlcnJvcjsKIAkJfQpAQCAtMzA5NCw4ICszMDk5LDkgQEAKIAkgKiBoYW5kbGUgdGhlbS4gIEFsbCBvdGhlciBlaXRoZXIgaGFuZGxlZCBieSBjb21wb3NpdGUgb3IKIAkgKiBwYXNzZWQgdG8gdXNiX2NvbmZpZ3VyYXRpb24tPnNldHVwKCkgKGlmIG9uZSBpcyBzZXQpLiAgTm8KIAkgKiBtYXR0ZXIsIHdlIHdpbGwgaGFuZGxlIHJlcXVlc3RzIGRpcmVjdGVkIHRvIGVuZHBvaW50IGhlcmUKLQkgKiBhcyB3ZWxsIChhcyBpdCdzIHN0cmFpZ2h0Zm9yd2FyZCkgYnV0IHdoYXQgdG8gZG8gd2l0aCBhbnkKLQkgKiBvdGhlciByZXF1ZXN0PworCSAqIGFzIHdlbGwgKGFzIGl0J3Mgc3RyYWlnaHRmb3J3YXJkKS4gIE90aGVyIHJlcXVlc3QgcmVjaXBpZW50CisJICogdHlwZXMgYXJlIG9ubHkgaGFuZGxlZCB3aGVuIHRoZSB1c2VyIGZsYWcgRlVOQ1RJT05GU19BTExfQ1RSTF9SRUNJUAorCSAqIGlzIGJlaW5nIHVzZWQuCiAJICovCiAJaWYgKGZmcy0+c3RhdGUgIT0gRkZTX0FDVElWRSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0zMTE2LDcgKzMxMjIsMTAgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWlmIChmdW5jLT5mZnMtPnVzZXJfZmxhZ3MgJiBGVU5DVElPTkZTX0FMTF9DVFJMX1JFQ0lQKQorCQkJcmV0ID0gbGUxNl90b19jcHUoY3JlcS0+d0luZGV4KTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZmZnMtPmV2LndhaXRxLmxvY2ssIGZsYWdzKTsKQEAgLTMxMjgsNiArMzEzNywyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgYm9vbCBmZnNfZnVuY19yZXFfbWF0Y2goc3RydWN0IHVzYl9mdW5jdGlvbiAqZiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjcmVxLAorCQkJICAgICAgIGJvb2wgY29uZmlnMCkKK3sKKwlzdHJ1Y3QgZmZzX2Z1bmN0aW9uICpmdW5jID0gZmZzX2Z1bmNfZnJvbV91c2IoZik7CisKKwlpZiAoY29uZmlnMCAmJiAhKGZ1bmMtPmZmcy0+dXNlcl9mbGFncyAmIEZVTkNUSU9ORlNfQ09ORklHMF9TRVRVUCkpCisJCXJldHVybiBmYWxzZTsKKworCXN3aXRjaCAoY3JlcS0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spIHsKKwljYXNlIFVTQl9SRUNJUF9JTlRFUkZBQ0U6CisJCXJldHVybiBmZnNfZnVuY19yZXZtYXBfaW50ZihmdW5jLAorCQkJCQkgICAgbGUxNl90b19jcHUoY3JlcS0+d0luZGV4KSA+PSAwKTsKKwljYXNlIFVTQl9SRUNJUF9FTkRQT0lOVDoKKwkJcmV0dXJuIGZmc19mdW5jX3Jldm1hcF9lcChmdW5jLAorCQkJCQkgIGxlMTZfdG9fY3B1KGNyZXEtPndJbmRleCkgPj0gMCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIChib29sKSAoZnVuYy0+ZmZzLT51c2VyX2ZsYWdzICYKKwkJCSAgICAgICBGVU5DVElPTkZTX0FMTF9DVFJMX1JFQ0lQKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGZmc19mdW5jX3N1c3BlbmQoc3RydWN0IHVzYl9mdW5jdGlvbiAqZikKIHsKIAlFTlRFUigpOwpAQCAtMzM3OCw2ICszNDA5LDcgQEAKIAlmdW5jLT5mdW5jdGlvbi5zZXRfYWx0ID0gZmZzX2Z1bmNfc2V0X2FsdDsKIAlmdW5jLT5mdW5jdGlvbi5kaXNhYmxlID0gZmZzX2Z1bmNfZGlzYWJsZTsKIAlmdW5jLT5mdW5jdGlvbi5zZXR1cCAgID0gZmZzX2Z1bmNfc2V0dXA7CisJZnVuYy0+ZnVuY3Rpb24ucmVxX21hdGNoID0gZmZzX2Z1bmNfcmVxX21hdGNoOwogCWZ1bmMtPmZ1bmN0aW9uLnN1c3BlbmQgPSBmZnNfZnVuY19zdXNwZW5kOwogCWZ1bmMtPmZ1bmN0aW9uLnJlc3VtZSAgPSBmZnNfZnVuY19yZXN1bWU7CiAJZnVuYy0+ZnVuY3Rpb24uZnJlZV9mdW5jID0gZmZzX2ZyZWU7CkBAIC0zNDcwLDYgKzM1MDIsMTEgQEAKIAlsaXN0X2RlbCgmZGV2LT5lbnRyeSk7CiAJaWYgKGRldi0+bmFtZV9hbGxvY2F0ZWQpCiAJCWtmcmVlKGRldi0+bmFtZSk7CisKKwkvKiBDbGVhciB0aGUgcHJpdmF0ZV9kYXRhIHBvaW50ZXIgdG8gc3RvcCBpbmNvcnJlY3QgZGV2IGFjY2VzcyAqLworCWlmIChkZXYtPmZmc19kYXRhKQorCQlkZXYtPmZmc19kYXRhLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCiAJa2ZyZWUoZGV2KTsKIAlpZiAobGlzdF9lbXB0eSgmZmZzX2RldmljZXMpKQogCQlmdW5jdGlvbmZzX2NsZWFudXAoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2hpZC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfaGlkLmMKaW5kZXggNTE5ODBjNS4uZTI5NjZmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfaGlkLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfaGlkLmMKQEAgLTM2NSw3ICszNjUsNyBAQAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX3JlcXVlc3QgKmhpZGdfYWxsb2NfZXBfcmVxKHN0cnVjdCB1c2JfZXAgKmVwLAogCQkJCQkJICAgIHVuc2lnbmVkIGxlbmd0aCkKIHsKLQlyZXR1cm4gYWxsb2NfZXBfcmVxKGVwLCBsZW5ndGgsIGxlbmd0aCk7CisJcmV0dXJuIGFsbG9jX2VwX3JlcShlcCwgbGVuZ3RoKTsKIH0KIAogc3RhdGljIHZvaWQgaGlkZ19zZXRfcmVwb3J0X2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKQEAgLTYxNywxNCArNjE3LDEwIEBACiAKIAkvKiBwcmVhbGxvY2F0ZSByZXF1ZXN0IGFuZCBidWZmZXIgKi8KIAlzdGF0dXMgPSAtRU5PTUVNOwotCWhpZGctPnJlcSA9IHVzYl9lcF9hbGxvY19yZXF1ZXN0KGhpZGctPmluX2VwLCBHRlBfS0VSTkVMKTsKKwloaWRnLT5yZXEgPSBhbGxvY19lcF9yZXEoaGlkZy0+aW5fZXAsIGhpZGctPnJlcG9ydF9sZW5ndGgpOwogCWlmICghaGlkZy0+cmVxKQogCQlnb3RvIGZhaWw7CiAKLQloaWRnLT5yZXEtPmJ1ZiA9IGttYWxsb2MoaGlkZy0+cmVwb3J0X2xlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoaWRnLT5yZXEtPmJ1ZikKLQkJZ290byBmYWlsOwotCiAJLyogc2V0IGRlc2NyaXB0b3IgZHluYW1pYyB2YWx1ZXMgKi8KIAloaWRnX2ludGVyZmFjZV9kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyA9IGhpZGctPmJJbnRlcmZhY2VTdWJDbGFzczsKIAloaWRnX2ludGVyZmFjZV9kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCA9IGhpZGctPmJJbnRlcmZhY2VQcm90b2NvbDsKQEAgLTY3NywxMSArNjczLDggQEAKIAl1c2JfZnJlZV9hbGxfZGVzY3JpcHRvcnMoZik7CiBmYWlsOgogCUVSUk9SKGYtPmNvbmZpZy0+Y2RldiwgImhpZGdfYmluZCBGQUlMRURcbiIpOwotCWlmIChoaWRnLT5yZXEgIT0gTlVMTCkgewotCQlrZnJlZShoaWRnLT5yZXEtPmJ1Zik7Ci0JCWlmIChoaWRnLT5pbl9lcCAhPSBOVUxMKQotCQkJdXNiX2VwX2ZyZWVfcmVxdWVzdChoaWRnLT5pbl9lcCwgaGlkZy0+cmVxKTsKLQl9CisJaWYgKGhpZGctPnJlcSAhPSBOVUxMKQorCQlmcmVlX2VwX3JlcShoaWRnLT5pbl9lcCwgaGlkZy0+cmVxKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC04MDksMTEgKzgwMiwyMSBAQAogCiBDT05GSUdGU19BVFRSKGZfaGlkX29wdHNfLCByZXBvcnRfZGVzYyk7CiAKK3N0YXRpYyBzc2l6ZV90IGZfaGlkX29wdHNfZGV2X3Nob3coc3RydWN0IGNvbmZpZ19pdGVtICppdGVtLCBjaGFyICpwYWdlKQoreworCXN0cnVjdCBmX2hpZF9vcHRzICpvcHRzID0gdG9fZl9oaWRfb3B0cyhpdGVtKTsKKworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZDolZFxuIiwgbWFqb3IsIG9wdHMtPm1pbm9yKTsKK30KKworQ09ORklHRlNfQVRUUl9STyhmX2hpZF9vcHRzXywgZGV2KTsKKwogc3RhdGljIHN0cnVjdCBjb25maWdmc19hdHRyaWJ1dGUgKmhpZF9hdHRyc1tdID0gewogCSZmX2hpZF9vcHRzX2F0dHJfc3ViY2xhc3MsCiAJJmZfaGlkX29wdHNfYXR0cl9wcm90b2NvbCwKIAkmZl9oaWRfb3B0c19hdHRyX3JlcG9ydF9sZW5ndGgsCiAJJmZfaGlkX29wdHNfYXR0cl9yZXBvcnRfZGVzYywKKwkmZl9oaWRfb3B0c19hdHRyX2RldiwKIAlOVUxMLAogfTsKIApAQCAtOTEwLDggKzkxMyw3IEBACiAKIAkvKiBkaXNhYmxlL2ZyZWUgcmVxdWVzdCBhbmQgZW5kIHBvaW50ICovCiAJdXNiX2VwX2Rpc2FibGUoaGlkZy0+aW5fZXApOwotCWtmcmVlKGhpZGctPnJlcS0+YnVmKTsKLQl1c2JfZXBfZnJlZV9yZXF1ZXN0KGhpZGctPmluX2VwLCBoaWRnLT5yZXEpOworCWZyZWVfZXBfcmVxKGhpZGctPmluX2VwLCBoaWRnLT5yZXEpOwogCiAJdXNiX2ZyZWVfYWxsX2Rlc2NyaXB0b3JzKGYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbG9vcGJhY2suYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2xvb3BiYWNrLmMKaW5kZXggM2E5ZjhmOS4uZTcwMDkzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbG9vcGJhY2suYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9sb29wYmFjay5jCkBAIC0zMDgsOSArMzA4LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX3JlcXVlc3QgKmxiX2FsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgaW50IGxlbikKIHsKLQlzdHJ1Y3QgZl9sb29wYmFjawkqbG9vcCA9IGVwLT5kcml2ZXJfZGF0YTsKLQotCXJldHVybiBhbGxvY19lcF9yZXEoZXAsIGxlbiwgbG9vcC0+YnVmbGVuKTsKKwlyZXR1cm4gYWxsb2NfZXBfcmVxKGVwLCBsZW4pOwogfQogCiBzdGF0aWMgaW50IGFsbG9jX3JlcXVlc3RzKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiwKQEAgLTMzMyw3ICszMzEsNyBAQAogCQlpZiAoIWluX3JlcSkKIAkJCWdvdG8gZmFpbDsKIAotCQlvdXRfcmVxID0gbGJfYWxsb2NfZXBfcmVxKGxvb3AtPm91dF9lcCwgMCk7CisJCW91dF9yZXEgPSBsYl9hbGxvY19lcF9yZXEobG9vcC0+b3V0X2VwLCBsb29wLT5idWZsZW4pOwogCQlpZiAoIW91dF9yZXEpCiAJCQlnb3RvIGZhaWxfaW47CiAKQEAgLTU5MywxMyArNTkxLDkgQEAKIAogaW50IF9faW5pdCBsYl9tb2Rpbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKLQotCXJldCA9IHVzYl9mdW5jdGlvbl9yZWdpc3RlcigmTG9vcGJhY2t1c2JfZnVuYyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gcmV0OworCXJldHVybiB1c2JfZnVuY3Rpb25fcmVnaXN0ZXIoJkxvb3BiYWNrdXNiX2Z1bmMpOwogfQorCiB2b2lkIF9fZXhpdCBsYl9tb2RleGl0KHZvaWQpCiB7CiAJdXNiX2Z1bmN0aW9uX3VucmVnaXN0ZXIoJkxvb3BiYWNrdXNiX2Z1bmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWFzc19zdG9yYWdlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuYwppbmRleCAyNTA1MTE3Li44ZjM2NTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuYwpAQCAtMzExLDExICszMTEsNyBAQAogCS8qIEdhZGdldCdzIHByaXZhdGUgZGF0YS4gKi8KIAl2b2lkCQkJKnByaXZhdGVfZGF0YTsKIAotCS8qCi0JICogVmVuZG9yICg4IGNoYXJzKSwgcHJvZHVjdCAoMTYgY2hhcnMpLCByZWxlYXNlICg0Ci0JICogaGV4YWRlY2ltYWwgZGlnaXRzKSBhbmQgTlVMIGJ5dGUKLQkgKi8KLQljaGFyIGlucXVpcnlfc3RyaW5nWzggKyAxNiArIDQgKyAxXTsKKwljaGFyIGlucXVpcnlfc3RyaW5nW0lOUVVJUllfU1RSSU5HX0xFTl07CiAKIAlzdHJ1Y3Qga3JlZgkJcmVmOwogfTsKQEAgLTExMDcsNyArMTEwMywxMiBAQAogCWJ1Zls1XSA9IDA7CQkvKiBObyBzcGVjaWFsIG9wdGlvbnMgKi8KIAlidWZbNl0gPSAwOwogCWJ1Zls3XSA9IDA7Ci0JbWVtY3B5KGJ1ZiArIDgsIGNvbW1vbi0+aW5xdWlyeV9zdHJpbmcsIHNpemVvZiBjb21tb24tPmlucXVpcnlfc3RyaW5nKTsKKwlpZiAoY3VybHVuLT5pbnF1aXJ5X3N0cmluZ1swXSkKKwkJbWVtY3B5KGJ1ZiArIDgsIGN1cmx1bi0+aW5xdWlyeV9zdHJpbmcsCisJCSAgICAgICBzaXplb2YoY3VybHVuLT5pbnF1aXJ5X3N0cmluZykpOworCWVsc2UKKwkJbWVtY3B5KGJ1ZiArIDgsIGNvbW1vbi0+aW5xdWlyeV9zdHJpbmcsCisJCSAgICAgICBzaXplb2YoY29tbW9uLT5pbnF1aXJ5X3N0cmluZykpOwogCXJldHVybiAzNjsKIH0KIApAQCAtMzIwOSwxMiArMzIxMCwyNyBAQAogCiBDT05GSUdGU19BVFRSKGZzZ19sdW5fb3B0c18sIG5vZnVhKTsKIAorc3RhdGljIHNzaXplX3QgZnNnX2x1bl9vcHRzX2lucXVpcnlfc3RyaW5nX3Nob3coc3RydWN0IGNvbmZpZ19pdGVtICppdGVtLAorCQkJCQkJY2hhciAqcGFnZSkKK3sKKwlyZXR1cm4gZnNnX3Nob3dfaW5xdWlyeV9zdHJpbmcodG9fZnNnX2x1bl9vcHRzKGl0ZW0pLT5sdW4sIHBhZ2UpOworfQorCitzdGF0aWMgc3NpemVfdCBmc2dfbHVuX29wdHNfaW5xdWlyeV9zdHJpbmdfc3RvcmUoc3RydWN0IGNvbmZpZ19pdGVtICppdGVtLAorCQkJCQkJIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIGZzZ19zdG9yZV9pbnF1aXJ5X3N0cmluZyh0b19mc2dfbHVuX29wdHMoaXRlbSktPmx1biwgcGFnZSwgbGVuKTsKK30KKworQ09ORklHRlNfQVRUUihmc2dfbHVuX29wdHNfLCBpbnF1aXJ5X3N0cmluZyk7CisKIHN0YXRpYyBzdHJ1Y3QgY29uZmlnZnNfYXR0cmlidXRlICpmc2dfbHVuX2F0dHJzW10gPSB7CiAJJmZzZ19sdW5fb3B0c19hdHRyX2ZpbGUsCiAJJmZzZ19sdW5fb3B0c19hdHRyX3JvLAogCSZmc2dfbHVuX29wdHNfYXR0cl9yZW1vdmFibGUsCiAJJmZzZ19sdW5fb3B0c19hdHRyX2Nkcm9tLAogCSZmc2dfbHVuX29wdHNfYXR0cl9ub2Z1YSwKKwkmZnNnX2x1bl9vcHRzX2F0dHJfaW5xdWlyeV9zdHJpbmcsCiAJTlVMTCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX21hc3Nfc3RvcmFnZS5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWFzc19zdG9yYWdlLmgKaW5kZXggYjZhOTkxOGVhLi5kMzkwMjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuaApAQCAtMTAwLDYgKzEwMCw3IEBACiAJY2hhciByZW1vdmFibGU7CiAJY2hhciBjZHJvbTsKIAljaGFyIG5vZnVhOworCWNoYXIgaW5xdWlyeV9zdHJpbmdbSU5RVUlSWV9TVFJJTkdfTEVOXTsKIH07CiAKIHN0cnVjdCBmc2dfY29uZmlnIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX21pZGkuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX21pZGkuYwppbmRleCA1OGZjMTk5Li5hNTcxOWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9taWRpLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWlkaS5jCkBAIC01MSw2ICs1MSwxOSBAQAogICovCiAjZGVmaW5lIE1BWF9QT1JUUyAxNgogCisvKiBNSURJIG1lc3NhZ2Ugc3RhdGVzICovCitlbnVtIHsKKwlTVEFURV9JTklUSUFMID0gMCwJLyogcHNldWRvIHN0YXRlICovCisJU1RBVEVfMVBBUkFNLAorCVNUQVRFXzJQQVJBTV8xLAorCVNUQVRFXzJQQVJBTV8yLAorCVNUQVRFX1NZU0VYXzAsCisJU1RBVEVfU1lTRVhfMSwKKwlTVEFURV9TWVNFWF8yLAorCVNUQVRFX1JFQUxfVElNRSwKKwlTVEFURV9GSU5JU0hFRCwJCS8qIHBzZXVkbyBzdGF0ZSAqLworfTsKKwogLyoKICAqIFRoaXMgaXMgYSBnYWRnZXQsIGFuZCB0aGUgSU4vT1VUIG5hbWluZyBpcyBmcm9tIHRoZSBob3N0J3MgcGVyc3BlY3RpdmUuCiAgKiBVU0IgLT4gT1VUIGVuZHBvaW50IC0+IHJhd21pZGkKQEAgLTYxLDEzICs3NCw2IEBACiAJaW50IGFjdGl2ZTsKIAl1aW50OF90IGNhYmxlOwogCXVpbnQ4X3Qgc3RhdGU7Ci0jZGVmaW5lIFNUQVRFX1VOS05PV04JMAotI2RlZmluZSBTVEFURV8xUEFSQU0JMQotI2RlZmluZSBTVEFURV8yUEFSQU1fMQkyCi0jZGVmaW5lIFNUQVRFXzJQQVJBTV8yCTMKLSNkZWZpbmUgU1RBVEVfU1lTRVhfMAk0Ci0jZGVmaW5lIFNUQVRFX1NZU0VYXzEJNQotI2RlZmluZSBTVEFURV9TWVNFWF8yCTYKIAl1aW50OF90IGRhdGFbMl07CiB9OwogCkBAIC0yMDUsNyArMjExLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9yZXF1ZXN0ICptaWRpX2FsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwKIAkJCQkJCSAgICB1bnNpZ25lZCBsZW5ndGgpCiB7Ci0JcmV0dXJuIGFsbG9jX2VwX3JlcShlcCwgbGVuZ3RoLCBsZW5ndGgpOworCXJldHVybiBhbGxvY19lcF9yZXEoZXAsIGxlbmd0aCk7CiB9CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGZfbWlkaV9jaW5fbGVuZ3RoW10gPSB7CkBAIC0yOTksNiArMzA1LDE5IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBmX21pZGlfZHJvcF9vdXRfc3Vic3RyZWFtcyhzdHJ1Y3QgZl9taWRpICptaWRpKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1pZGktPmluX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGdtaWRpX2luX3BvcnQgKnBvcnQgPSBtaWRpLT5pbl9wb3J0c19hcnJheSArIGk7CisJCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHBvcnQtPnN1YnN0cmVhbTsKKworCQlpZiAocG9ydC0+YWN0aXZlICYmIHN1YnN0cmVhbSkKKwkJCXNuZF9yYXdtaWRpX2Ryb3Bfb3V0cHV0KHN1YnN0cmVhbSk7CisJfQorfQorCiBzdGF0aWMgaW50IGZfbWlkaV9zdGFydF9lcChzdHJ1Y3QgZl9taWRpICptaWRpLAogCQkJICAgc3RydWN0IHVzYl9mdW5jdGlvbiAqZiwKIAkJCSAgIHN0cnVjdCB1c2JfZXAgKmVwKQpAQCAtMzYwLDkgKzM3OSw4IEBACiAJLyogYWxsb2NhdGUgYSBidW5jaCBvZiByZWFkIGJ1ZmZlcnMgYW5kIHF1ZXVlIHRoZW0gYWxsIGF0IG9uY2UuICovCiAJZm9yIChpID0gMDsgaSA8IG1pZGktPnFsZW4gJiYgZXJyID09IDA7IGkrKykgewogCQlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9Ci0JCQltaWRpX2FsbG9jX2VwX3JlcShtaWRpLT5vdXRfZXAsCi0JCQkJbWF4X3QodW5zaWduZWQsIG1pZGktPmJ1ZmxlbiwKLQkJCQkJYnVsa19vdXRfZGVzYy53TWF4UGFja2V0U2l6ZSkpOworCQkJbWlkaV9hbGxvY19lcF9yZXEobWlkaS0+b3V0X2VwLCBtaWRpLT5idWZsZW4pOworCiAJCWlmIChyZXEgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zOTcsNiArNDE1LDggQEAKIAkvKiByZWxlYXNlIElOIHJlcXVlc3RzICovCiAJd2hpbGUgKGtmaWZvX2dldCgmbWlkaS0+aW5fcmVxX2ZpZm8sICZyZXEpKQogCQlmcmVlX2VwX3JlcShtaWRpLT5pbl9lcCwgcmVxKTsKKworCWZfbWlkaV9kcm9wX291dF9zdWJzdHJlYW1zKG1pZGkpOwogfQogCiBzdGF0aWMgaW50IGZfbWlkaV9zbmRfZnJlZShzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQpAQCAtNDA0LDEzMCArNDI0LDE2NiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBmX21pZGlfdHJhbnNtaXRfcGFja2V0KHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLCB1aW50OF90IHAwLAotCQkJCQl1aW50OF90IHAxLCB1aW50OF90IHAyLCB1aW50OF90IHAzKQotewotCXVuc2lnbmVkIGxlbmd0aCA9IHJlcS0+bGVuZ3RoOwotCXU4ICpidWYgPSAodTggKilyZXEtPmJ1ZiArIGxlbmd0aDsKLQotCWJ1ZlswXSA9IHAwOwotCWJ1ZlsxXSA9IHAxOwotCWJ1ZlsyXSA9IHAyOwotCWJ1ZlszXSA9IHAzOwotCXJlcS0+bGVuZ3RoID0gbGVuZ3RoICsgNDsKLX0KLQogLyoKICAqIENvbnZlcnRzIE1JREkgY29tbWFuZHMgdG8gVVNCIE1JREkgcGFja2V0cy4KICAqLwogc3RhdGljIHZvaWQgZl9taWRpX3RyYW5zbWl0X2J5dGUoc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEsCiAJCQkJIHN0cnVjdCBnbWlkaV9pbl9wb3J0ICpwb3J0LCB1aW50OF90IGIpCiB7Ci0JdWludDhfdCBwMCA9IHBvcnQtPmNhYmxlIDw8IDQ7CisJdWludDhfdCBwWzRdID0geyBwb3J0LT5jYWJsZSA8PCA0LCAwLCAwLCAwIH07CisJdWludDhfdCBuZXh0X3N0YXRlID0gU1RBVEVfSU5JVElBTDsKIAotCWlmIChiID49IDB4ZjgpIHsKLQkJZl9taWRpX3RyYW5zbWl0X3BhY2tldChyZXEsIHAwIHwgMHgwZiwgYiwgMCwgMCk7Ci0JfSBlbHNlIGlmIChiID49IDB4ZjApIHsKKwlzd2l0Y2ggKGIpIHsKKwljYXNlIDB4ZjggLi4uIDB4ZmY6CisJCS8qIFN5c3RlbSBSZWFsLVRpbWUgTWVzc2FnZXMgKi8KKwkJcFswXSB8PSAweDBmOworCQlwWzFdID0gYjsKKwkJbmV4dF9zdGF0ZSA9IHBvcnQtPnN0YXRlOworCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1JFQUxfVElNRTsKKwkJYnJlYWs7CisKKwljYXNlIDB4Zjc6CisJCS8qIEVuZCBvZiBTeXNFeCAqLworCQlzd2l0Y2ggKHBvcnQtPnN0YXRlKSB7CisJCWNhc2UgU1RBVEVfU1lTRVhfMDoKKwkJCXBbMF0gfD0gMHgwNTsKKwkJCXBbMV0gPSAweGY3OworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFX0ZJTklTSEVEOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfU1lTRVhfMToKKwkJCXBbMF0gfD0gMHgwNjsKKwkJCXBbMV0gPSBwb3J0LT5kYXRhWzBdOworCQkJcFsyXSA9IDB4Zjc7CisJCQluZXh0X3N0YXRlID0gU1RBVEVfRklOSVNIRUQ7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9TWVNFWF8yOgorCQkJcFswXSB8PSAweDA3OworCQkJcFsxXSA9IHBvcnQtPmRhdGFbMF07CisJCQlwWzJdID0gcG9ydC0+ZGF0YVsxXTsKKwkJCXBbM10gPSAweGY3OworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFX0ZJTklTSEVEOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBJZ25vcmUgYnl0ZSAqLworCQkJbmV4dF9zdGF0ZSA9IHBvcnQtPnN0YXRlOworCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9JTklUSUFMOworCQl9CisJCWJyZWFrOworCisJY2FzZSAweGYwIC4uLiAweGY2OgorCQkvKiBTeXN0ZW0gQ29tbW9uIE1lc3NhZ2VzICovCisJCXBvcnQtPmRhdGFbMF0gPSBwb3J0LT5kYXRhWzFdID0gMDsKKwkJcG9ydC0+c3RhdGUgPSBTVEFURV9JTklUSUFMOwogCQlzd2l0Y2ggKGIpIHsKIAkJY2FzZSAweGYwOgogCQkJcG9ydC0+ZGF0YVswXSA9IGI7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1NZU0VYXzE7CisJCQlwb3J0LT5kYXRhWzFdID0gMDsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV9TWVNFWF8xOwogCQkJYnJlYWs7CiAJCWNhc2UgMHhmMToKIAkJY2FzZSAweGYzOgogCQkJcG9ydC0+ZGF0YVswXSA9IGI7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFXzFQQVJBTTsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV8xUEFSQU07CiAJCQlicmVhazsKIAkJY2FzZSAweGYyOgogCQkJcG9ydC0+ZGF0YVswXSA9IGI7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFXzJQQVJBTV8xOworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFXzJQQVJBTV8xOwogCQkJYnJlYWs7CiAJCWNhc2UgMHhmNDoKIAkJY2FzZSAweGY1OgotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9VTktOT1dOOworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFX0lOSVRJQUw7CiAJCQlicmVhazsKIAkJY2FzZSAweGY2OgotCQkJZl9taWRpX3RyYW5zbWl0X3BhY2tldChyZXEsIHAwIHwgMHgwNSwgMHhmNiwgMCwgMCk7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1VOS05PV047Ci0JCQlicmVhazsKLQkJY2FzZSAweGY3OgotCQkJc3dpdGNoIChwb3J0LT5zdGF0ZSkgewotCQkJY2FzZSBTVEFURV9TWVNFWF8wOgotCQkJCWZfbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLAotCQkJCQlwMCB8IDB4MDUsIDB4ZjcsIDAsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9TWVNFWF8xOgotCQkJCWZfbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLAotCQkJCQlwMCB8IDB4MDYsIHBvcnQtPmRhdGFbMF0sIDB4ZjcsIDApOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9TWVNFWF8yOgotCQkJCWZfbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLAotCQkJCQlwMCB8IDB4MDcsIHBvcnQtPmRhdGFbMF0sCi0JCQkJCXBvcnQtPmRhdGFbMV0sIDB4ZjcpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9VTktOT1dOOworCQkJcFswXSB8PSAweDA1OworCQkJcFsxXSA9IDB4ZjY7CisJCQluZXh0X3N0YXRlID0gU1RBVEVfRklOSVNIRUQ7CiAJCQlicmVhazsKIAkJfQotCX0gZWxzZSBpZiAoYiA+PSAweDgwKSB7CisJCWJyZWFrOworCisJY2FzZSAweDgwIC4uLiAweGVmOgorCQkvKgorCQkgKiBDaGFubmVsIFZvaWNlIE1lc3NhZ2VzLCBDaGFubmVsIE1vZGUgTWVzc2FnZXMKKwkJICogYW5kIENvbnRyb2wgQ2hhbmdlIE1lc3NhZ2VzLgorCQkgKi8KIAkJcG9ydC0+ZGF0YVswXSA9IGI7CisJCXBvcnQtPmRhdGFbMV0gPSAwOworCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX0lOSVRJQUw7CiAJCWlmIChiID49IDB4YzAgJiYgYiA8PSAweGRmKQotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV8xUEFSQU07CisJCQluZXh0X3N0YXRlID0gU1RBVEVfMVBBUkFNOwogCQllbHNlCi0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFXzJQQVJBTV8xOwotCX0gZWxzZSB7IC8qIGIgPCAweDgwICovCisJCQluZXh0X3N0YXRlID0gU1RBVEVfMlBBUkFNXzE7CisJCWJyZWFrOworCisJY2FzZSAweDAwIC4uLiAweDdmOgorCQkvKiBNZXNzYWdlIHBhcmFtZXRlcnMgKi8KIAkJc3dpdGNoIChwb3J0LT5zdGF0ZSkgewogCQljYXNlIFNUQVRFXzFQQVJBTToKLQkJCWlmIChwb3J0LT5kYXRhWzBdIDwgMHhmMCkgewotCQkJCXAwIHw9IHBvcnQtPmRhdGFbMF0gPj4gNDsKLQkJCX0gZWxzZSB7Ci0JCQkJcDAgfD0gMHgwMjsKLQkJCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1VOS05PV047Ci0JCQl9Ci0JCQlmX21pZGlfdHJhbnNtaXRfcGFja2V0KHJlcSwgcDAsIHBvcnQtPmRhdGFbMF0sIGIsIDApOworCQkJaWYgKHBvcnQtPmRhdGFbMF0gPCAweGYwKQorCQkJCXBbMF0gfD0gcG9ydC0+ZGF0YVswXSA+PiA0OworCQkJZWxzZQorCQkJCXBbMF0gfD0gMHgwMjsKKworCQkJcFsxXSA9IHBvcnQtPmRhdGFbMF07CisJCQlwWzJdID0gYjsKKwkJCS8qIFRoaXMgaXMgdG8gYWxsb3cgUnVubmluZyBTdGF0ZSBNZXNzYWdlcyAqLworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFXzFQQVJBTTsKIAkJCWJyZWFrOwogCQljYXNlIFNUQVRFXzJQQVJBTV8xOgogCQkJcG9ydC0+ZGF0YVsxXSA9IGI7Ci0JCQlwb3J0LT5zdGF0ZSA9IFNUQVRFXzJQQVJBTV8yOworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFXzJQQVJBTV8yOwogCQkJYnJlYWs7CiAJCWNhc2UgU1RBVEVfMlBBUkFNXzI6Ci0JCQlpZiAocG9ydC0+ZGF0YVswXSA8IDB4ZjApIHsKLQkJCQlwMCB8PSBwb3J0LT5kYXRhWzBdID4+IDQ7Ci0JCQkJcG9ydC0+c3RhdGUgPSBTVEFURV8yUEFSQU1fMTsKLQkJCX0gZWxzZSB7Ci0JCQkJcDAgfD0gMHgwMzsKLQkJCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1VOS05PV047Ci0JCQl9Ci0JCQlmX21pZGlfdHJhbnNtaXRfcGFja2V0KHJlcSwKLQkJCQlwMCwgcG9ydC0+ZGF0YVswXSwgcG9ydC0+ZGF0YVsxXSwgYik7CisJCQlpZiAocG9ydC0+ZGF0YVswXSA8IDB4ZjApCisJCQkJcFswXSB8PSBwb3J0LT5kYXRhWzBdID4+IDQ7CisJCQllbHNlCisJCQkJcFswXSB8PSAweDAzOworCisJCQlwWzFdID0gcG9ydC0+ZGF0YVswXTsKKwkJCXBbMl0gPSBwb3J0LT5kYXRhWzFdOworCQkJcFszXSA9IGI7CisJCQkvKiBUaGlzIGlzIHRvIGFsbG93IFJ1bm5pbmcgU3RhdGUgTWVzc2FnZXMgKi8KKwkJCW5leHRfc3RhdGUgPSBTVEFURV8yUEFSQU1fMTsKIAkJCWJyZWFrOwogCQljYXNlIFNUQVRFX1NZU0VYXzA6CiAJCQlwb3J0LT5kYXRhWzBdID0gYjsKLQkJCXBvcnQtPnN0YXRlID0gU1RBVEVfU1lTRVhfMTsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV9TWVNFWF8xOwogCQkJYnJlYWs7CiAJCWNhc2UgU1RBVEVfU1lTRVhfMToKIAkJCXBvcnQtPmRhdGFbMV0gPSBiOwotCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9TWVNFWF8yOworCQkJbmV4dF9zdGF0ZSA9IFNUQVRFX1NZU0VYXzI7CiAJCQlicmVhazsKIAkJY2FzZSBTVEFURV9TWVNFWF8yOgotCQkJZl9taWRpX3RyYW5zbWl0X3BhY2tldChyZXEsCi0JCQkJcDAgfCAweDA0LCBwb3J0LT5kYXRhWzBdLCBwb3J0LT5kYXRhWzFdLCBiKTsKLQkJCXBvcnQtPnN0YXRlID0gU1RBVEVfU1lTRVhfMDsKKwkJCXBbMF0gfD0gMHgwNDsKKwkJCXBbMV0gPSBwb3J0LT5kYXRhWzBdOworCQkJcFsyXSA9IHBvcnQtPmRhdGFbMV07CisJCQlwWzNdID0gYjsKKwkJCW5leHRfc3RhdGUgPSBTVEFURV9TWVNFWF8wOwogCQkJYnJlYWs7CiAJCX0KKwkJYnJlYWs7CiAJfQotfQogCi1zdGF0aWMgdm9pZCBmX21pZGlfZHJvcF9vdXRfc3Vic3RyZWFtcyhzdHJ1Y3QgZl9taWRpICptaWRpKQotewotCXVuc2lnbmVkIGludCBpOworCS8qIFN0YXRlcyB3aGVyZSB3ZSBoYXZlIHRvIHdyaXRlIGludG8gdGhlIFVTQiByZXF1ZXN0ICovCisJaWYgKG5leHRfc3RhdGUgPT0gU1RBVEVfRklOSVNIRUQgfHwKKwkgICAgcG9ydC0+c3RhdGUgPT0gU1RBVEVfU1lTRVhfMiB8fAorCSAgICBwb3J0LT5zdGF0ZSA9PSBTVEFURV8xUEFSQU0gfHwKKwkgICAgcG9ydC0+c3RhdGUgPT0gU1RBVEVfMlBBUkFNXzIgfHwKKwkgICAgcG9ydC0+c3RhdGUgPT0gU1RBVEVfUkVBTF9USU1FKSB7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbWlkaS0+aW5fcG9ydHM7IGkrKykgewotCQlzdHJ1Y3QgZ21pZGlfaW5fcG9ydCAqcG9ydCA9IG1pZGktPmluX3BvcnRzX2FycmF5ICsgaTsKLQkJc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gcG9ydC0+c3Vic3RyZWFtOwotCQlpZiAocG9ydC0+YWN0aXZlICYmIHN1YnN0cmVhbSkKLQkJCXNuZF9yYXdtaWRpX2Ryb3Bfb3V0cHV0KHN1YnN0cmVhbSk7CisJCXVuc2lnbmVkIGludCBsZW5ndGggPSByZXEtPmxlbmd0aDsKKwkJdTggKmJ1ZiA9ICh1OCAqKXJlcS0+YnVmICsgbGVuZ3RoOworCisJCW1lbWNweShidWYsIHAsIHNpemVvZihwKSk7CisJCXJlcS0+bGVuZ3RoID0gbGVuZ3RoICsgc2l6ZW9mKHApOworCisJCWlmIChuZXh0X3N0YXRlID09IFNUQVRFX0ZJTklTSEVEKSB7CisJCQluZXh0X3N0YXRlID0gU1RBVEVfSU5JVElBTDsKKwkJCXBvcnQtPmRhdGFbMF0gPSBwb3J0LT5kYXRhWzFdID0gMDsKKwkJfQogCX0KKworCXBvcnQtPnN0YXRlID0gbmV4dF9zdGF0ZTsKIH0KIAogc3RhdGljIGludCBmX21pZGlfZG9fdHJhbnNtaXQoc3RydWN0IGZfbWlkaSAqbWlkaSwgc3RydWN0IHVzYl9lcCAqZXApCkBAIC02NDIsNyArNjk4LDcgQEAKIAlWREJHKG1pZGksICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAJcG9ydCA9IG1pZGktPmluX3BvcnRzX2FycmF5ICsgc3Vic3RyZWFtLT5udW1iZXI7CiAJcG9ydC0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCXBvcnQtPnN0YXRlID0gU1RBVEVfVU5LTk9XTjsKKwlwb3J0LT5zdGF0ZSA9IFNUQVRFX0lOSVRJQUw7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMjMsNyArMTE3OSw3IEBACiAJb3B0cy0+ZnVuY19pbnN0LmZyZWVfZnVuY19pbnN0ID0gZl9taWRpX2ZyZWVfaW5zdDsKIAlvcHRzLT5pbmRleCA9IFNORFJWX0RFRkFVTFRfSURYMTsKIAlvcHRzLT5pZCA9IFNORFJWX0RFRkFVTFRfU1RSMTsKLQlvcHRzLT5idWZsZW4gPSAyNTY7CisJb3B0cy0+YnVmbGVuID0gNTEyOwogCW9wdHMtPnFsZW4gPSAzMjsKIAlvcHRzLT5pbl9wb3J0cyA9IDE7CiAJb3B0cy0+b3V0X3BvcnRzID0gMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX25jbS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbmNtLmMKaW5kZXggOTdmMGE5Yi4uNjM5NjAzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbmNtLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbmNtLmMKQEAgLTkwLDcgKzkwLDkgQEAKIC8qIHBlYWsgKHRoZW9yZXRpY2FsKSBidWxrIHRyYW5zZmVyIHJhdGUgaW4gYml0cy1wZXItc2Vjb25kICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIG5jbV9iaXRyYXRlKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnKQogewotCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGcpICYmIGctPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCWlmIChnYWRnZXRfaXNfc3VwZXJzcGVlZChnKSAmJiBnLT5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpCisJCXJldHVybiAxMyAqIDEwMjQgKiA4ICogMTAwMCAqIDg7CisJZWxzZSBpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnKSAmJiBnLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKIAkJcmV0dXJuIDEzICogNTEyICogOCAqIDEwMDAgKiA4OwogCWVsc2UKIAkJcmV0dXJuIDE5ICogIDY0ICogMSAqIDEwMDAgKiA4OwpAQCAtMzMzLDYgKzMzNSw3NiBAQAogCU5VTEwsCiB9OwogCisKKy8qIHN1cGVyIHNwZWVkIHN1cHBvcnQ6ICovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3NfbmNtX25vdGlmeV9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoTkNNX1NUQVRVU19CWVRFQ09VTlQpLAorCS5iSW50ZXJ2YWwgPQkJVVNCX01TX1RPX0hTX0lOVEVSVkFMKE5DTV9TVEFUVVNfSU5URVJWQUxfTVMpCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3NfbmNtX25vdGlmeV9jb21wX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJc2l6ZW9mKHNzX25jbV9ub3RpZnlfY29tcF9kZXNjKSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCisKKwkvKiB0aGUgZm9sbG93aW5nIDMgdmFsdWVzIGNhbiBiZSB0d2Vha2VkIGlmIG5lY2Vzc2FyeSAqLworCS8qIC5iTWF4QnVyc3QgPQkJMCwgKi8KKwkvKiAuYm1BdHRyaWJ1dGVzID0JMCwgKi8KKwkud0J5dGVzUGVySW50ZXJ2YWwgPQljcHVfdG9fbGUxNihOQ01fU1RBVFVTX0JZVEVDT1VOVCksCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIHNzX25jbV9pbl9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDEwMjQpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBzc19uY21fb3V0X2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKworCS5iRW5kcG9pbnRBZGRyZXNzID0JVVNCX0RJUl9PVVQsCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDEwMjQpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX25jbV9idWxrX2NvbXBfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlzaXplb2Yoc3NfbmNtX2J1bGtfY29tcF9kZXNjKSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCisKKwkvKiB0aGUgZm9sbG93aW5nIDIgdmFsdWVzIGNhbiBiZSB0d2Vha2VkIGlmIG5lY2Vzc2FyeSAqLworCS8qIC5iTWF4QnVyc3QgPQkJMCwgKi8KKwkvKiAuYm1BdHRyaWJ1dGVzID0JMCwgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpuY21fc3NfZnVuY3Rpb25bXSA9IHsKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmbmNtX2lhZF9kZXNjLAorCS8qIENEQyBOQ00gY29udHJvbCBkZXNjcmlwdG9ycyAqLworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZuY21fY29udHJvbF9pbnRmLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZuY21faGVhZGVyX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJm5jbV91bmlvbl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZlY21fZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmbmNtX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX25jbV9ub3RpZnlfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfbmNtX25vdGlmeV9jb21wX2Rlc2MsCisJLyogZGF0YSBpbnRlcmZhY2UsIGFsdHNldHRpbmdzIDAgYW5kIDEgKi8KKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmbmNtX2RhdGFfbm9wX2ludGYsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJm5jbV9kYXRhX2ludGYsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX25jbV9pbl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19uY21fYnVsa19jb21wX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX25jbV9vdXRfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfbmNtX2J1bGtfY29tcF9kZXNjLAorCU5VTEwsCit9OworCiAvKiBzdHJpbmcgZGVzY3JpcHRvcnM6ICovCiAKICNkZWZpbmUgU1RSSU5HX0NUUkxfSURYCTAKQEAgLTg1Miw2ICs5MjQsOCBAQAogCQkJICovCiAJCQluY20tPnBvcnQuaXNfemxwX29rID0KIAkJCQlnYWRnZXRfaXNfemxwX3N1cHBvcnRlZChjZGV2LT5nYWRnZXQpOworCQkJbmNtLT5wb3J0Lm5vX3NrYl9yZXNlcnZlID0KKwkJCQlnYWRnZXRfYXZvaWRzX3NrYl9yZXNlcnZlKGNkZXYtPmdhZGdldCk7CiAJCQluY20tPnBvcnQuY2RjX2ZpbHRlciA9IERFRkFVTFRfRklMVEVSOwogCQkJREJHKGNkZXYsICJhY3RpdmF0ZSBuY21cbiIpOwogCQkJbmV0ID0gZ2V0aGVyX2Nvbm5lY3QoJm5jbS0+cG9ydCk7CkBAIC0xNDMxLDggKzE1MDUsMTMgQEAKIAloc19uY21fbm90aWZ5X2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CiAJCWZzX25jbV9ub3RpZnlfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogCisJc3NfbmNtX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9IGZzX25jbV9pbl9kZXNjLmJFbmRwb2ludEFkZHJlc3M7CisJc3NfbmNtX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPSBmc19uY21fb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwlzc19uY21fbm90aWZ5X2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9CisJCWZzX25jbV9ub3RpZnlfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCiAJc3RhdHVzID0gdXNiX2Fzc2lnbl9kZXNjcmlwdG9ycyhmLCBuY21fZnNfZnVuY3Rpb24sIG5jbV9oc19mdW5jdGlvbiwKLQkJCU5VTEwsIE5VTEwpOworCQkJbmNtX3NzX2Z1bmN0aW9uLCBOVUxMKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGZhaWw7CiAKQEAgLTE0NTAsNiArMTUyOSw3IEBACiAJbmNtLT50YXNrX3RpbWVyLmZ1bmN0aW9uID0gbmNtX3R4X3RpbWVvdXQ7CiAKIAlEQkcoY2RldiwgIkNEQyBOZXR3b3JrOiAlcyBzcGVlZCBJTi8lcyBPVVQvJXMgTk9USUZZLyVzXG4iLAorCQkJZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSA/ICJzdXBlciIgOgogCQkJZ2FkZ2V0X2lzX2R1YWxzcGVlZChjLT5jZGV2LT5nYWRnZXQpID8gImR1YWwiIDogImZ1bGwiLAogCQkJbmNtLT5wb3J0LmluX2VwLT5uYW1lLCBuY20tPnBvcnQub3V0X2VwLT5uYW1lLAogCQkJbmNtLT5ub3RpZnktPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfcHJpbnRlci5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfcHJpbnRlci5jCmluZGV4IDY0NzA2YTcuLjBkZTM2Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3ByaW50ZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9wcmludGVyLmMKQEAgLTg4OSwxMyArODg5LDE3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiBzdGF0aWMgYm9vbCBncHJpbnRlcl9yZXFfbWF0Y2goc3RydWN0IHVzYl9mdW5jdGlvbiAqZiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQorCQkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwsCisJCQkgICAgICAgYm9vbCBjb25maWcwKQogewogCXN0cnVjdCBwcmludGVyX2RldgkqZGV2ID0gZnVuY190b19wcmludGVyKGYpOwogCXUxNgkJCXdfaW5kZXggPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOwogCXUxNgkJCXdfdmFsdWUgPSBsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpOwogCXUxNgkJCXdfbGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CiAKKwlpZiAoY29uZmlnMCkKKwkJcmV0dXJuIGZhbHNlOworCiAJaWYgKChjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykgIT0gVVNCX1JFQ0lQX0lOVEVSRkFDRSB8fAogCSAgICAoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1RZUEVfTUFTSykgIT0gVVNCX1RZUEVfQ0xBU1MpCiAJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3JuZGlzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9ybmRpcy5jCmluZGV4IGM4MDA1ODIuLjE2NTYyZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3JuZGlzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2Zfcm5kaXMuYwpAQCAtMzc0LDYgKzM3NCw5IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CiAKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKIAlza2IyID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBzaXplb2Yoc3RydWN0IHJuZGlzX3BhY2tldF9tc2dfdHlwZSkpOwogCXJuZGlzX2FkZF9oZHIoc2tiMik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3NvdXJjZXNpbmsuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3NvdXJjZXNpbmsuYwppbmRleCBkZjAxODlkLi44Nzg0ZmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9zb3VyY2VzaW5rLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2Zfc291cmNlc2luay5jCkBAIC0yOTMsOSArMjkzLDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnNzX2FsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgaW50IGxlbikKIHsKLQlzdHJ1Y3QgZl9zb3VyY2VzaW5rCQkqc3MgPSBlcC0+ZHJpdmVyX2RhdGE7Ci0KLQlyZXR1cm4gYWxsb2NfZXBfcmVxKGVwLCBsZW4sIHNzLT5idWZsZW4pOworCXJldHVybiBhbGxvY19lcF9yZXEoZXAsIGxlbik7CiB9CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfZXAoc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2LCBzdHJ1Y3QgdXNiX2VwICplcCkKQEAgLTYwNiw3ICs2MDQsNyBAQAogCX0gZWxzZSB7CiAJCWVwID0gaXNfaW4gPyBzcy0+aW5fZXAgOiBzcy0+b3V0X2VwOwogCQlxbGVuID0gc3MtPmJ1bGtfcWxlbjsKLQkJc2l6ZSA9IDA7CisJCXNpemUgPSBzcy0+YnVmbGVuOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBxbGVuOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3V2Yy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfdXZjLmMKaW5kZXggMjliNDFiNS4uMjdlZDUxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfdXZjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfdXZjLmMKQEAgLTI1OCw2ICsyNTgsMTMgQEAKIAltZW1jcHkoJnV2Y19ldmVudC0+cmVxLCBjdHJsLCBzaXplb2YodXZjX2V2ZW50LT5yZXEpKTsKIAl2NGwyX2V2ZW50X3F1ZXVlKCZ1dmMtPnZkZXYsICZ2NGwyX2V2ZW50KTsKIAorCS8qIFBhc3MgYWRkaXRpb25hbCBzZXR1cCBkYXRhIHRvIHVzZXJzcGFjZSAqLworCWlmICh1dmMtPmV2ZW50X3NldHVwX291dCAmJiB1dmMtPmV2ZW50X2xlbmd0aCkgeworCQl1dmMtPmNvbnRyb2xfcmVxLT5sZW5ndGggPSB1dmMtPmV2ZW50X2xlbmd0aDsKKwkJcmV0dXJuIHVzYl9lcF9xdWV1ZSh1dmMtPmZ1bmMuY29uZmlnLT5jZGV2LT5nYWRnZXQtPmVwMCwKKwkJCXV2Yy0+Y29udHJvbF9yZXEsIEdGUF9BVE9NSUMpOworCX0KKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vc3RvcmFnZV9jb21tb24uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9zdG9yYWdlX2NvbW1vbi5jCmluZGV4IDk5MGRmMjIuLjhmYmY2ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9zdG9yYWdlX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9zdG9yYWdlX2NvbW1vbi5jCkBAIC0zNjksNiArMzY5LDEyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChmc2dfc2hvd19yZW1vdmFibGUpOwogCitzc2l6ZV90IGZzZ19zaG93X2lucXVpcnlfc3RyaW5nKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY3VybHVuLT5pbnF1aXJ5X3N0cmluZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2dfc2hvd19pbnF1aXJ5X3N0cmluZyk7CisKIC8qCiAgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBmc2ctPmZpbGVzZW0gZm9yIHJlYWRpbmcgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAgKi8KQEAgLTQ5OSw0ICs1MDUsMjIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGZzZ19zdG9yZV9yZW1vdmFibGUpOwogCitzc2l6ZV90IGZzZ19zdG9yZV9pbnF1aXJ5X3N0cmluZyhzdHJ1Y3QgZnNnX2x1biAqY3VybHVuLCBjb25zdCBjaGFyICpidWYsCisJCQkJIHNpemVfdCBjb3VudCkKK3sKKwljb25zdCBzaXplX3QgbGVuID0gbWluKGNvdW50LCBzaXplb2YoY3VybHVuLT5pbnF1aXJ5X3N0cmluZykpOworCisJaWYgKGxlbiA9PSAwIHx8IGJ1ZlswXSA9PSAnXG4nKSB7CisJCWN1cmx1bi0+aW5xdWlyeV9zdHJpbmdbMF0gPSAwOworCX0gZWxzZSB7CisJCXNucHJpbnRmKGN1cmx1bi0+aW5xdWlyeV9zdHJpbmcsCisJCQkgc2l6ZW9mKGN1cmx1bi0+aW5xdWlyeV9zdHJpbmcpLCAiJS0yOHMiLCBidWYpOworCQlpZiAoY3VybHVuLT5pbnF1aXJ5X3N0cmluZ1tsZW4tMV0gPT0gJ1xuJykKKwkJCWN1cmx1bi0+aW5xdWlyeV9zdHJpbmdbbGVuLTFdID0gJyAnOworCX0KKworCXJldHVybiBjb3VudDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzZ19zdG9yZV9pbnF1aXJ5X3N0cmluZyk7CisKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9zdG9yYWdlX2NvbW1vbi5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3N0b3JhZ2VfY29tbW9uLmgKaW5kZXggYzM1NDRlNi4uZTY5ODQ4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3N0b3JhZ2VfY29tbW9uLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3N0b3JhZ2VfY29tbW9uLmgKQEAgLTg4LDYgKzg4LDEyIEBACiAjZGVmaW5lIEFTQyh4KQkJKCh1OCkgKCh4KSA+PiA4KSkKICNkZWZpbmUgQVNDUSh4KQkJKCh1OCkgKHgpKQogCisvKgorICogVmVuZG9yICg4IGNoYXJzKSwgcHJvZHVjdCAoMTYgY2hhcnMpLCByZWxlYXNlICg0IGhleGFkZWNpbWFsIGRpZ2l0cykgYW5kIE5VTAorICogYnl0ZQorICovCisjZGVmaW5lIElOUVVJUllfU1RSSU5HX0xFTiAoKHNpemVfdCkgKDggKyAxNiArIDQgKyAxKSkKKwogc3RydWN0IGZzZ19sdW4gewogCXN0cnVjdCBmaWxlCSpmaWxwOwogCWxvZmZfdAkJZmlsZV9sZW5ndGg7CkBAIC0xMTIsNiArMTE4LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlCWRldjsKIAljb25zdCBjaGFyCSpuYW1lOwkJLyogImx1bi5uYW1lIiAqLwogCWNvbnN0IGNoYXIJKipuYW1lX3BmeDsJLyogImZ1bmN0aW9uLm5hbWUiICovCisJY2hhcgkJaW5xdWlyeV9zdHJpbmdbSU5RVUlSWV9TVFJJTkdfTEVOXTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBmc2dfbHVuX2lzX29wZW4oc3RydWN0IGZzZ19sdW4gKmN1cmx1bikKQEAgLTIxMCw2ICsyMTcsNyBAQAogc3NpemVfdCBmc2dfc2hvd19ub2Z1YShzdHJ1Y3QgZnNnX2x1biAqY3VybHVuLCBjaGFyICpidWYpOwogc3NpemVfdCBmc2dfc2hvd19maWxlKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIHN0cnVjdCByd19zZW1hcGhvcmUgKmZpbGVzZW0sCiAJCSAgICAgIGNoYXIgKmJ1Zik7Citzc2l6ZV90IGZzZ19zaG93X2lucXVpcnlfc3RyaW5nKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIGNoYXIgKmJ1Zik7CiBzc2l6ZV90IGZzZ19zaG93X2Nkcm9tKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIGNoYXIgKmJ1Zik7CiBzc2l6ZV90IGZzZ19zaG93X3JlbW92YWJsZShzdHJ1Y3QgZnNnX2x1biAqY3VybHVuLCBjaGFyICpidWYpOwogc3NpemVfdCBmc2dfc3RvcmVfcm8oc3RydWN0IGZzZ19sdW4gKmN1cmx1biwgc3RydWN0IHJ3X3NlbWFwaG9yZSAqZmlsZXNlbSwKQEAgLTIyMSw1ICsyMjksNyBAQAogCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogc3NpemVfdCBmc2dfc3RvcmVfcmVtb3ZhYmxlKHN0cnVjdCBmc2dfbHVuICpjdXJsdW4sIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJCSAgICBzaXplX3QgY291bnQpOworc3NpemVfdCBmc2dfc3RvcmVfaW5xdWlyeV9zdHJpbmcoc3RydWN0IGZzZ19sdW4gKmN1cmx1biwgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQpOwogCiAjZW5kaWYgLyogVVNCX1NUT1JBR0VfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X2V0aGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9ldGhlci5jCmluZGV4IDVmNTYyYzEuLjljOGM5ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X2V0aGVyLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3VfZXRoZXIuYwpAQCAtODIsNiArODIsNyBAQAogI2RlZmluZQlXT1JLX1JYX01FTU9SWQkJMAogCiAJYm9vbAkJCXpscDsKKwlib29sCQkJbm9fc2tiX3Jlc2VydmU7CiAJdTgJCQlob3N0X21hY1tFVEhfQUxFTl07CiAJdTgJCQlkZXZfbWFjW0VUSF9BTEVOXTsKIH07CkBAIC0yMzMsNyArMjM0LDggQEAKIAkgKiBidXQgb24gYXQgbGVhc3Qgb25lLCBjaGVja3N1bW1pbmcgZmFpbHMgb3RoZXJ3aXNlLiAgTm90ZToKIAkgKiBSTkRJUyBoZWFkZXJzIGludm9sdmUgdmFyaWFibGUgbnVtYmVycyBvZiBMRTMyIHZhbHVlcy4KIAkgKi8KLQlza2JfcmVzZXJ2ZShza2IsIE5FVF9JUF9BTElHTik7CisJaWYgKGxpa2VseSghZGV2LT5ub19za2JfcmVzZXJ2ZSkpCisJCXNrYl9yZXNlcnZlKHNrYiwgTkVUX0lQX0FMSUdOKTsKIAogCXJlcS0+YnVmID0gc2tiLT5kYXRhOwogCXJlcS0+bGVuZ3RoID0gc2l6ZTsKQEAgLTU2OSw3ICs1NzEsOCBAQAogCXJlcS0+Y29tcGxldGUgPSB0eF9jb21wbGV0ZTsKIAogCS8qIE5DTSByZXF1aXJlcyBubyB6bHAgaWYgdHJhbnNmZXIgaXMgZHdOdGJJbk1heFNpemUgKi8KLQlpZiAoZGV2LT5wb3J0X3VzYi0+aXNfZml4ZWQgJiYKKwlpZiAoZGV2LT5wb3J0X3VzYiAmJgorCSAgICBkZXYtPnBvcnRfdXNiLT5pc19maXhlZCAmJgogCSAgICBsZW5ndGggPT0gZGV2LT5wb3J0X3VzYi0+Zml4ZWRfaW5fbGVuICYmCiAJICAgIChsZW5ndGggJSBpbi0+bWF4cGFja2V0KSA9PSAwKQogCQlyZXEtPnplcm8gPSAwOwpAQCAtMTA2Myw2ICsxMDY2LDcgQEAKIAogCWlmIChyZXN1bHQgPT0gMCkgewogCQlkZXYtPnpscCA9IGxpbmstPmlzX3pscF9vazsKKwkJZGV2LT5ub19za2JfcmVzZXJ2ZSA9IGxpbmstPm5vX3NrYl9yZXNlcnZlOwogCQlEQkcoZGV2LCAicWxlbiAlZFxuIiwgcWxlbihkZXYtPmdhZGdldCwgZGV2LT5xbXVsdCkpOwogCiAJCWRldi0+aGVhZGVyX2xlbiA9IGxpbmstPmhlYWRlcl9sZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9ldGhlci5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3VfZXRoZXIuaAppbmRleCBjNzcxNDViLi44MWQ5NGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9ldGhlci5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi91X2V0aGVyLmgKQEAgLTY0LDYgKzY0LDcgQEAKIAlzdHJ1Y3QgdXNiX2VwCQkJKm91dF9lcDsKIAogCWJvb2wJCQkJaXNfemxwX29rOworCWJvb2wJCQkJbm9fc2tiX3Jlc2VydmU7CiAKIAl1MTYJCQkJY2RjX2ZpbHRlcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3Vfc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9zZXJpYWwuYwppbmRleCA2ZGVkNjM0Li5lMGNkMWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9zZXJpYWwuYwpAQCAtMzc1LDEwICszNzUsMTUgQEAKICovCiB7CiAJc3RydWN0IGxpc3RfaGVhZAkqcG9vbCA9ICZwb3J0LT53cml0ZV9wb29sOwotCXN0cnVjdCB1c2JfZXAJCSppbiA9IHBvcnQtPnBvcnRfdXNiLT5pbjsKKwlzdHJ1Y3QgdXNiX2VwCQkqaW47CiAJaW50CQkJc3RhdHVzID0gMDsKIAlib29sCQkJZG9fdHR5X3dha2UgPSBmYWxzZTsKIAorCWlmICghcG9ydC0+cG9ydF91c2IpCisJCXJldHVybiBzdGF0dXM7CisKKwlpbiA9IHBvcnQtPnBvcnRfdXNiLT5pbjsKKwogCXdoaWxlICghcG9ydC0+d3JpdGVfYnVzeSAmJiAhbGlzdF9lbXB0eShwb29sKSkgewogCQlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcTsKIAkJaW50CQkJbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9nbWlkaS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9nbWlkaS5jCmluZGV4IGZjMmFjMTUuLjBiZjM5YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvZ21pZGkuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L2dtaWRpLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIG1vZHVsZV9wYXJhbShpZCwgY2hhcnAsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgdGhlIFVTQiBNSURJIEdhZGdldCBhZGFwdGVyLiIpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGJ1ZmxlbiA9IDI1NjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYnVmbGVuID0gNTEyOwogbW9kdWxlX3BhcmFtKGJ1ZmxlbiwgdWludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKGJ1ZmxlbiwgIk1JREkgYnVmZmVyIGxlbmd0aCIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdV9mLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9mLmMKaW5kZXggNGJjN2VlYS4uMTg4Mzk3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZi5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91X2YuYwpAQCAtMTIsMTQgKzEyLDE2IEBACiAgKi8KIAogI2luY2x1ZGUgInVfZi5oIgorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KIAotc3RydWN0IHVzYl9yZXF1ZXN0ICphbGxvY19lcF9yZXEoc3RydWN0IHVzYl9lcCAqZXAsIGludCBsZW4sIGludCBkZWZhdWx0X2xlbikKK3N0cnVjdCB1c2JfcmVxdWVzdCAqYWxsb2NfZXBfcmVxKHN0cnVjdCB1c2JfZXAgKmVwLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCB1c2JfcmVxdWVzdCAgICAgICpyZXE7CiAKIAlyZXEgPSB1c2JfZXBfYWxsb2NfcmVxdWVzdChlcCwgR0ZQX0FUT01JQyk7CiAJaWYgKHJlcSkgewotCQlyZXEtPmxlbmd0aCA9IGxlbiA/OiBkZWZhdWx0X2xlbjsKKwkJcmVxLT5sZW5ndGggPSB1c2JfZW5kcG9pbnRfZGlyX291dChlcC0+ZGVzYykgPworCQkJdXNiX2VwX2FsaWduKGVwLCBsZW4pIDogbGVuOwogCQlyZXEtPmJ1ZiA9IGttYWxsb2MocmVxLT5sZW5ndGgsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXJlcS0+YnVmKSB7CiAJCQl1c2JfZXBfZnJlZV9yZXF1ZXN0KGVwLCByZXEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZi5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VfZi5oCmluZGV4IDQyNDdjYzAuLjdkNTNhNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91X2YuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdV9mLmgKQEAgLTQ3LDggKzQ3LDIxIEBACiBzdHJ1Y3QgdXNiX2VwOwogc3RydWN0IHVzYl9yZXF1ZXN0OwogCi0vKiBSZXF1ZXN0cyBhbGxvY2F0ZWQgdmlhIGFsbG9jX2VwX3JlcSgpIG11c3QgYmUgZnJlZWQgYnkgZnJlZV9lcF9yZXEoKS4gKi8KLXN0cnVjdCB1c2JfcmVxdWVzdCAqYWxsb2NfZXBfcmVxKHN0cnVjdCB1c2JfZXAgKmVwLCBpbnQgbGVuLCBpbnQgZGVmYXVsdF9sZW4pOworLyoqCisgKiBhbGxvY19lcF9yZXEgLSByZXR1cm5zIGEgdXNiX3JlcXVlc3QgYWxsb2NhdGVkIGJ5IHRoZSBnYWRnZXQgZHJpdmVyIGFuZAorICogYWxsb2NhdGVzIHRoZSByZXF1ZXN0J3MgYnVmZmVyLgorICoKKyAqIEBlcDogdGhlIGVuZHBvaW50IHRvIGFsbG9jYXRlIGEgdXNiX3JlcXVlc3QKKyAqIEBsZW46IHVzYl9yZXF1ZXN0cydzIGJ1ZmZlciBzdWdnZXN0ZWQgc2l6ZQorICoKKyAqIEluIGNhc2UgQGVwIGRpcmVjdGlvbiBpcyBPVVQsIHRoZSBAbGVuIHdpbGwgYmUgYWxpZ25lZCB0byBlcCdzCisgKiB3TWF4UGFja2V0U2l6ZS4gSW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGxlYWtzIG9yIGRyb3BzLCAqYWx3YXlzKiB1c2UKKyAqIHVzYl9yZXF1ZXN0cydzIGxlbmd0aCAocmVxLT5sZW5ndGgpIHRvIHJlZmVyIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIHNpemUuCisgKiBSZXF1ZXN0cyBhbGxvY2F0ZWQgdmlhIGFsbG9jX2VwX3JlcSgpICptdXN0KiBiZSBmcmVlZCBieSBmcmVlX2VwX3JlcSgpLgorICovCitzdHJ1Y3QgdXNiX3JlcXVlc3QgKmFsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgc2l6ZV90IGxlbik7CisKKy8qIEZyZWVzIGEgdXNiX3JlcXVlc3QgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnkgYWxsb2NfZXBfcmVxKCkgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCiB7CiAJa2ZyZWUocmVxLT5idWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9jb3JlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2NvcmUuYwppbmRleCA5MzRmODM4Li45NDgzNDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2NvcmUuYwpAQCAtMTA3LDEwICsxMDcsOCBAQAogCQlnb3RvIG91dDsKIAogCXJldCA9IGVwLT5vcHMtPmVuYWJsZShlcCwgZXAtPmRlc2MpOwotCWlmIChyZXQpIHsKLQkJcmV0ID0gcmV0OworCWlmIChyZXQpCiAJCWdvdG8gb3V0OwotCX0KIAogCWVwLT5lbmFibGVkID0gdHJ1ZTsKIApAQCAtODI3LDcgKzgyNSw3IEBACiAJCXJldHVybjsKIAogCWlmIChyZXEtPm51bV9tYXBwZWRfc2dzKSB7Ci0JCWRtYV91bm1hcF9zZyhkZXYsIHJlcS0+c2csIHJlcS0+bnVtX21hcHBlZF9zZ3MsCisJCWRtYV91bm1hcF9zZyhkZXYsIHJlcS0+c2csIHJlcS0+bnVtX3NncywKIAkJCQlpc19pbiA/IERNQV9UT19ERVZJQ0UgOiBETUFfRlJPTV9ERVZJQ0UpOwogCiAJCXJlcS0+bnVtX21hcHBlZF9zZ3MgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9mc2xfcWVfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2ZzbF9xZV91ZGMuYwppbmRleCBjZjg4MTlhLi40ZmZmNTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2ZzbF9xZV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2ZzbF9xZV91ZGMuYwpAQCAtNDIxLDEwICs0MjEsOCBAQAogCWJkID0gZXAtPnJ4YmFzZTsKIAogCWVwLT5yeGZyYW1lID0ga21hbGxvYyhzaXplb2YoKmVwLT5yeGZyYW1lKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKGVwLT5yeGZyYW1lID09IE5VTEwpIHsKLQkJZGV2X2VycihlcC0+dWRjLT5kZXYsICJtYWxsb2MgcnhmcmFtZSBmYWlsZWRcbiIpOworCWlmICghZXAtPnJ4ZnJhbWUpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXFlX2ZyYW1lX2luaXQoZXAtPnJ4ZnJhbWUpOwogCkBAIC00MzUsOSArNDMzLDcgQEAKIAogCXNpemUgPSAoZXAtPmVwLm1heHBhY2tldCArIFVTQl9DUkNfU0laRSArIDIpICogKGJkcmluZ19sZW4gKyAxKTsKIAllcC0+cnhidWZmZXIgPSBremFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCWlmIChlcC0+cnhidWZmZXIgPT0gTlVMTCkgewotCQlkZXZfZXJyKGVwLT51ZGMtPmRldiwgIm1hbGxvYyByeGJ1ZmZlciBmYWlsZWQsc2l6ZT0lZFxuIiwKLQkJCQlzaXplKTsKKwlpZiAoIWVwLT5yeGJ1ZmZlcikgewogCQlrZnJlZShlcC0+cnhmcmFtZSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTY2OCwxMCArNjY0LDggQEAKIAogCWlmICgoZXAtPnRtID09IFVTQlBfVE1fQ1RMKSB8fCAoZXAtPmRpciA9PSBVU0JfRElSX0lOKSkgewogCQllcC0+dHhmcmFtZSA9IGttYWxsb2Moc2l6ZW9mKCplcC0+dHhmcmFtZSksIEdGUF9BVE9NSUMpOwotCQlpZiAoZXAtPnR4ZnJhbWUgPT0gTlVMTCkgewotCQkJZGV2X2Vycih1ZGMtPmRldiwgIm1hbGxvYyB0eGZyYW1lIGZhaWxlZFxuIik7CisJCWlmICghZXAtPnR4ZnJhbWUpCiAJCQlnb3RvIGVuX2RvbmUyOwotCQl9CiAJCXFlX2ZyYW1lX2luaXQoZXAtPnR4ZnJhbWUpOwogCX0KIApAQCAtMTg3OCwxMSArMTg3Miw4IEBACiAKIAl0bXAgPSBpbl9iZTE2KCZ1ZGMtPnVzYl9wYXJhbS0+ZnJhbWVfbik7CiAJaWYgKHRtcCAmIDB4ODAwMCkKLQkJdG1wID0gdG1wICYgMHgwN2ZmOwotCWVsc2UKLQkJdG1wID0gLUVJTlZBTDsKLQotCXJldHVybiAoaW50KXRtcDsKKwkJcmV0dXJuIHRtcCAmIDB4MDdmZjsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludCBmc2xfcWVfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwKQEAgLTIzNDcsMTAgKzIzMzgsOCBAQAogCXUzMiBvZmZzZXQ7CiAKIAl1ZGMgPSBremFsbG9jKHNpemVvZigqdWRjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVkYyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJm9mZGV2LT5kZXYsICJtYWxsb2MgdWRjIGZhaWxlZFxuIik7CisJaWYgKCF1ZGMpCiAJCWdvdG8gY2xlYW51cDsKLQl9CiAKIAl1ZGMtPmRldiA9ICZvZmRldi0+ZGV2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2dva3VfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2dva3VfdWRjLmMKaW5kZXggZDIyMDVkOS4uNTEwNzk4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9nb2t1X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvZ29rdV91ZGMuYwpAQCAtMTc2Nyw4ICsxNzY3LDcgQEAKIAogCS8qIGFsbG9jLCBhbmQgc3RhcnQgaW5pdCAqLwogCWRldiA9IGt6YWxsb2MgKHNpemVvZiAqZGV2LCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2ID09IE5VTEwpewotCQlwcl9kZWJ1ZygiZW5vbWVtICVzXG4iLCBwY2lfbmFtZShwZGV2KSk7CisJaWYgKCFkZXYpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBlcnI7CiAJfQpAQCAtMTgzOSw2ICsxODM4LDggQEAKIGVycjoKIAlpZiAoZGV2KQogCQlnb2t1X3JlbW92ZSAocGRldik7CisJLyogZ2FkZ2V0X3JlbGVhc2UgaXMgbm90IHJlZ2lzdGVyZWQgeWV0LCBrZnJlZSBleHBsaWNpdGx5ICovCisJa2ZyZWUoZGV2KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL25ldDIyODAuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvbmV0MjI4MC5jCmluZGV4IDYxNGFiOTUxLi42MWM5MzhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL25ldDIyODAuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL25ldDIyODAuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuZXQyMjgwX2VwLCBlcCk7CiAJaWYgKCFfZXAgfHwgIV9yZXEpIHsKLQkJZGV2X2VycigmZXAtPmRldi0+cGRldi0+ZGV2LCAiJXM6IEluYXZsaWQgZXA9JXAgb3IgcmVxPSVwXG4iLAorCQlkZXZfZXJyKCZlcC0+ZGV2LT5wZGV2LT5kZXYsICIlczogSW52YWxpZCBlcD0lcCBvciByZXE9JXBcbiIsCiAJCQkJCQkJX19mdW5jX18sIF9lcCwgX3JlcSk7CiAJCXJldHVybjsKIAl9CkBAIC0xMTM3LDggKzExMzcsMTAgQEAKIAlkb25lKGVwLCByZXEsIHN0YXR1cyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNjYW5fZG1hX2NvbXBsZXRpb25zKHN0cnVjdCBuZXQyMjgwX2VwICplcCkKK3N0YXRpYyBpbnQgc2Nhbl9kbWFfY29tcGxldGlvbnMoc3RydWN0IG5ldDIyODBfZXAgKmVwKQogeworCWludCBudW1fY29tcGxldGVkID0gMDsKKwogCS8qIG9ubHkgbG9vayBhdCBkZXNjcmlwdG9ycyB0aGF0IHdlcmUgIm5hdHVyYWxseSIgcmV0aXJlZCwKIAkgKiBzbyBmaWZvIGFuZCBsaXN0IGhlYWQgc3RhdGUgd29uJ3QgbWF0dGVyCiAJICovCkBAIC0xMTY2LDYgKzExNjgsNyBAQAogCQkJCWJyZWFrOwogCQkJLyogc2luZ2xlIHRyYW5zZmVyIG1vZGUgKi8KIAkJCWRtYV9kb25lKGVwLCByZXEsIHRtcCwgMCk7CisJCQludW1fY29tcGxldGVkKys7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmICghZXAtPmlzX2luICYmCiAJCQkgICAocmVxLT5yZXEubGVuZ3RoICUgZXAtPmVwLm1heHBhY2tldCkgJiYKQEAgLTExOTQsNyArMTE5NywxMCBAQAogCQkJfQogCQl9CiAJCWRtYV9kb25lKGVwLCByZXEsIHRtcCwgMCk7CisJCW51bV9jb21wbGV0ZWQrKzsKIAl9CisKKwlyZXR1cm4gbnVtX2NvbXBsZXRlZDsKIH0KIAogc3RhdGljIHZvaWQgcmVzdGFydF9kbWEoc3RydWN0IG5ldDIyODBfZXAgKmVwKQpAQCAtMTU2Nyw2ICsxNTczLDQ0IEBACiAJCQlyZXR1cm4gZXA7CiAJfQogCisJLyogVVNCMzM4MDogT25seSBmaXJzdCBmb3VyIGVuZHBvaW50cyBoYXZlIERNQSBjaGFubmVscy4gQWxsb2NhdGUKKwkgKiBzbG93ZXIgaW50ZXJydXB0IGVuZHBvaW50cyBmcm9tIFBJTyBodyBlbmRwb2ludHMsIHRvIGFsbG93IGJ1bGsvaXNvYworCSAqIGVuZHBvaW50cyB1c2UgRE1BIGh3IGVuZHBvaW50cy4KKwkgKi8KKwlpZiAodXNiX2VuZHBvaW50X3R5cGUoZGVzYykgPT0gVVNCX0VORFBPSU5UX1hGRVJfSU5UICYmCisJICAgIHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykpIHsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDJpbiIpOworCQlpZiAoZXAgJiYgdXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKF9nYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDRpbiIpOworCQlpZiAoZXAgJiYgdXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKF9nYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKwl9IGVsc2UgaWYgKHVzYl9lbmRwb2ludF90eXBlKGRlc2MpID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCAmJgorCQkgICAhdXNiX2VuZHBvaW50X2Rpcl9pbihkZXNjKSkgeworCQllcCA9IGdhZGdldF9maW5kX2VwX2J5X25hbWUoX2dhZGdldCwgImVwMW91dCIpOworCQlpZiAoZXAgJiYgdXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKF9nYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDNvdXQiKTsKKwkJaWYgKGVwICYmIHVzYl9nYWRnZXRfZXBfbWF0Y2hfZGVzYyhfZ2FkZ2V0LCBlcCwgZGVzYywgZXBfY29tcCkpCisJCQlyZXR1cm4gZXA7CisJfSBlbHNlIGlmICh1c2JfZW5kcG9pbnRfdHlwZShkZXNjKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLICYmCisJCSAgIHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykpIHsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDFpbiIpOworCQlpZiAoZXAgJiYgdXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKF9nYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDNpbiIpOworCQlpZiAoZXAgJiYgdXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKF9nYWRnZXQsIGVwLCBkZXNjLCBlcF9jb21wKSkKKwkJCXJldHVybiBlcDsKKwl9IGVsc2UgaWYgKHVzYl9lbmRwb2ludF90eXBlKGRlc2MpICE9IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsgJiYKKwkJICAgIXVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykpIHsKKwkJZXAgPSBnYWRnZXRfZmluZF9lcF9ieV9uYW1lKF9nYWRnZXQsICJlcDJvdXQiKTsKKwkJaWYgKGVwICYmIHVzYl9nYWRnZXRfZXBfbWF0Y2hfZGVzYyhfZ2FkZ2V0LCBlcCwgZGVzYywgZXBfY29tcCkpCisJCQlyZXR1cm4gZXA7CisJCWVwID0gZ2FkZ2V0X2ZpbmRfZXBfYnlfbmFtZShfZ2FkZ2V0LCAiZXA0b3V0Iik7CisJCWlmIChlcCAmJiB1c2JfZ2FkZ2V0X2VwX21hdGNoX2Rlc2MoX2dhZGdldCwgZXAsIGRlc2MsIGVwX2NvbXApKQorCQkJcmV0dXJuIGVwOworCX0KKwogCS8qIFVTQjMzODA6IHVzZSBzYW1lIGFkZHJlc3MgZm9yIHVzYiBhbmQgaGFyZHdhcmUgZW5kcG9pbnRzICovCiAJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZXAlZCVzIiwgdXNiX2VuZHBvaW50X251bShkZXNjKSwKIAkJCXVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYykgPyAiaW4iIDogIm91dCIpOwpAQCAtMjU0Nyw4ICsyNTkxLDExIEBACiAJLyogbWFudWFsIERNQSBxdWV1ZSBhZHZhbmNlIGFmdGVyIHNob3J0IE9VVCAqLwogCWlmIChsaWtlbHkoZXAtPmRtYSkpIHsKIAkJaWYgKHQgJiBCSVQoU0hPUlRfUEFDS0VUX1RSQU5TRkVSUkVEX0lOVEVSUlVQVCkpIHsKLQkJCXUzMgljb3VudDsKKwkJCXN0cnVjdCBuZXQyMjgwX3JlcXVlc3QgKnN0dWNrX3JlcSA9IE5VTEw7CiAJCQlpbnQJc3RvcHBlZCA9IGVwLT5zdG9wcGVkOworCQkJaW50CW51bV9jb21wbGV0ZWQ7CisJCQlpbnQJc3R1Y2sgPSAwOworCQkJdTMyCWNvdW50OwogCiAJCQkvKiBUUkFOU0ZFUlJFRCB3b3JrcyBhcm91bmQgT1VUX0RPTkUgZXJyYXR1bSAwMTEyLgogCQkJICogd2UgZXhwZWN0IChOIDw9IG1heHBhY2tldCkgYnl0ZXM7IGhvc3Qgd3JvdGUgTS4KQEAgLTI1NjAsNyArMjYwNyw3IEBACiAJCQkJLyogYW55IHByZWNlZGluZyBkbWEgdHJhbnNmZXJzIG11c3QgZmluaXNoLgogCQkJCSAqIGRtYSBoYW5kbGVzIChNID49IE4pLCBtYXkgZW1wdHkgdGhlIHF1ZXVlCiAJCQkJICovCi0JCQkJc2Nhbl9kbWFfY29tcGxldGlvbnMoZXApOworCQkJCW51bV9jb21wbGV0ZWQgPSBzY2FuX2RtYV9jb21wbGV0aW9ucyhlcCk7CiAJCQkJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkgfHwKIAkJCQkJCWVwLT5vdXRfb3ZlcmZsb3cpKSB7CiAJCQkJCXJlcSA9IE5VTEw7CkBAIC0yNTgwLDYgKzI2MjcsMzEgQEAKIAkJCQkJCXJlcSA9IE5VTEw7CiAJCQkJCWJyZWFrOwogCQkJCX0KKworCQkJCS8qIEVzY2FwZSBsb29wIGlmIG5vIGRtYSB0cmFuc2ZlcnMgY29tcGxldGVkCisJCQkJICogYWZ0ZXIgZmV3IHJldHJpZXMuCisJCQkJICovCisJCQkJaWYgKG51bV9jb21wbGV0ZWQgPT0gMCkgeworCQkJCQlpZiAoc3R1Y2tfcmVxID09IHJlcSAmJgorCQkJCQkgICAgcmVhZGwoJmVwLT5kbWEtPmRtYWRlc2MpICE9CisJCQkJCQkgIHJlcS0+dGRfZG1hICYmIHN0dWNrKysgPiA1KSB7CisJCQkJCQljb3VudCA9IHJlYWRsKAorCQkJCQkJCSZlcC0+ZG1hLT5kbWFjb3VudCk7CisJCQkJCQljb3VudCAmPSBETUFfQllURV9DT1VOVF9NQVNLOworCQkJCQkJcmVxID0gTlVMTDsKKwkJCQkJCWVwX2RiZyhlcC0+ZGV2LCAiJXMgZXNjYXBlIHN0dWNrICVkLCBjb3VudCAldVxuIiwKKwkJCQkJCQllcC0+ZXAubmFtZSwgc3R1Y2ssCisJCQkJCQkJY291bnQpOworCQkJCQkJYnJlYWs7CisJCQkJCX0gZWxzZSBpZiAoc3R1Y2tfcmVxICE9IHJlcSkgeworCQkJCQkJc3R1Y2tfcmVxID0gcmVxOworCQkJCQkJc3R1Y2sgPSAwOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJc3R1Y2tfcmVxID0gTlVMTDsKKwkJCQkJc3R1Y2sgPSAwOworCQkJCX0KKwogCQkJCXVkZWxheSgxKTsKIAkJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9vbWFwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9vbWFwX3VkYy5jCmluZGV4IDliN2QzOTQuLmE4NzA5ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvb21hcF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL29tYXBfdWRjLmMKQEAgLTI4NzUsNyArMjg3NSw3IEBACiAJeGNlaXYgPSBOVUxMOwogCS8qICJ1ZGMiIGlzIG5vdyB2YWxpZCAqLwogCXB1bGx1cF9kaXNhYmxlKHVkYyk7Ci0jaWYJZGVmaW5lZChDT05GSUdfVVNCX09IQ0lfSENEKSB8fCBkZWZpbmVkKENPTkZJR19VU0JfT0hDSV9IQ0RfTU9EVUxFKQorI2lmCUlTX0VOQUJMRUQoQ09ORklHX1VTQl9PSENJX0hDRCkKIAl1ZGMtPmdhZGdldC5pc19vdGcgPSAoY29uZmlnLT5vdGcgIT0gMCk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9weGEyN3hfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3B4YTI3eF91ZGMuYwppbmRleCBhZDE0MGFhLi43ZmE2MGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3B4YTI3eF91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3B4YTI3eF91ZGMuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3BoeS5oPgogCiAjaW5jbHVkZSAicHhhMjd4X3VkYy5oIgogCkBAIC0xNjU1LDYgKzE2NTYsMzcgQEAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKKy8qKgorICogcHhhX3VkY19waHlfZXZlbnQgLSBDYWxsZWQgYnkgcGh5IHVwb24gVkJ1cyBldmVudAorICogQG5iOiBub3RpZmllciBibG9jaworICogQGFjdGlvbjogcGh5IGFjdGlvbiwgaXMgdmJ1cyBjb25uZWN0IG9yIGRpc2Nvbm5lY3QKKyAqIEBkYXRhOiB0aGUgdXNiX2dhZGdldCBzdHJ1Y3R1cmUgaW4gcHhhX3VkYworICoKKyAqIENhbGxlZCBieSB0aGUgVVNCIFBoeSB3aGVuIGEgY2FibGUgY29ubmVjdCBvciBkaXNjb25uZWN0IGlzIHNlbnNlZC4KKyAqCisgKiBSZXR1cm5zIDAKKyAqLworc3RhdGljIGludCBweGFfdWRjX3BoeV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKKwkJCSAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0ID0gZGF0YTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBVU0JfRVZFTlRfVkJVUzoKKwkJdXNiX2dhZGdldF92YnVzX2Nvbm5lY3QoZ2FkZ2V0KTsKKwkJcmV0dXJuIE5PVElGWV9PSzsKKwljYXNlIFVTQl9FVkVOVF9OT05FOgorCQl1c2JfZ2FkZ2V0X3ZidXNfZGlzY29ubmVjdChnYWRnZXQpOworCQlyZXR1cm4gTk9USUZZX09LOworCWRlZmF1bHQ6CisJCXJldHVybiBOT1RJRllfRE9ORTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcHhhMjd4X3VkY19waHkgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBweGFfdWRjX3BoeV9ldmVudCwKK307CisKIHN0YXRpYyBpbnQgcHhhMjd4X3VkY19zdGFydChzdHJ1Y3QgdXNiX2dhZGdldCAqZywKIAkJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpOwogc3RhdGljIGludCBweGEyN3hfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXQgKmcpOwpAQCAtMjQzMiw3ICsyNDY0LDE0IEBACiAJCXJldHVybiB1ZGMtPmlycTsKIAogCXVkYy0+ZGV2ID0gJnBkZXYtPmRldjsKLQl1ZGMtPnRyYW5zY2VpdmVyID0gdXNiX2dldF9waHkoVVNCX1BIWV9UWVBFX1VTQjIpOworCWlmIChvZl9oYXZlX3BvcHVsYXRlZF9kdCgpKSB7CisJCXVkYy0+dHJhbnNjZWl2ZXIgPQorCQkJZGV2bV91c2JfZ2V0X3BoeV9ieV9waGFuZGxlKHVkYy0+ZGV2LCAicGh5cyIsIDApOworCQlpZiAoSVNfRVJSKHVkYy0+dHJhbnNjZWl2ZXIpKQorCQkJcmV0dXJuIFBUUl9FUlIodWRjLT50cmFuc2NlaXZlcik7CisJfSBlbHNlIHsKKwkJdWRjLT50cmFuc2NlaXZlciA9IHVzYl9nZXRfcGh5KFVTQl9QSFlfVFlQRV9VU0IyKTsKKwl9CiAKIAlpZiAoSVNfRVJSKHVkYy0+Z3Bpb2QpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IGZpbmQgb3IgcmVxdWVzdCBEKyBncGlvIDogJWxkXG4iLApAQCAtMjQ2NSwxNCArMjUwNCwyMCBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHVkYy0+dHJhbnNjZWl2ZXIpKQorCQl1c2JfcmVnaXN0ZXJfbm90aWZpZXIodWRjLT50cmFuc2NlaXZlciwgJnB4YTI3eF91ZGNfcGh5KTsKIAlyZXR2YWwgPSB1c2JfYWRkX2dhZGdldF91ZGMoJnBkZXYtPmRldiwgJnVkYy0+Z2FkZ2V0KTsKIAlpZiAocmV0dmFsKQotCQlnb3RvIGVycjsKKwkJZ290byBlcnJfYWRkX2dhZGdldDsKIAogCXB4YV9pbml0X2RlYnVnZnModWRjKTsKIAlpZiAoc2hvdWxkX2VuYWJsZV91ZGModWRjKSkKIAkJdWRjX2VuYWJsZSh1ZGMpOwogCXJldHVybiAwOworCitlcnJfYWRkX2dhZGdldDoKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHVkYy0+dHJhbnNjZWl2ZXIpKQorCQl1c2JfdW5yZWdpc3Rlcl9ub3RpZmllcih1ZGMtPnRyYW5zY2VpdmVyLCAmcHhhMjd4X3VkY19waHkpOwogZXJyOgogCWNsa191bnByZXBhcmUodWRjLT5jbGspOwogCXJldHVybiByZXR2YWw7CkBAIC0yNDg5LDYgKzI1MzQsOCBAQAogCXVzYl9kZWxfZ2FkZ2V0X3VkYygmdWRjLT5nYWRnZXQpOwogCXB4YV9jbGVhbnVwX2RlYnVnZnModWRjKTsKIAorCWlmICghSVNfRVJSX09SX05VTEwodWRjLT50cmFuc2NlaXZlcikpCisJCXVzYl91bnJlZ2lzdGVyX25vdGlmaWVyKHVkYy0+dHJhbnNjZWl2ZXIsICZweGEyN3hfdWRjX3BoeSk7CiAJdXNiX3B1dF9waHkodWRjLT50cmFuc2NlaXZlcik7CiAKIAl1ZGMtPnRyYW5zY2VpdmVyID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvcmVuZXNhc191c2IzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3JlbmVzYXNfdXNiMy5jCmluZGV4IDkzYTNiZWMuLmZiOGZjMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvcmVuZXNhc191c2IzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9yZW5lc2FzX3VzYjMuYwpAQCAtMTA2LDYgKzEwNiw3IEBACiAKIC8qIERSRF9DT04gKi8KICNkZWZpbmUgRFJEX0NPTl9QRVJJX0NPTglCSVQoMjQpCisjZGVmaW5lIERSRF9DT05fVkJPVVQJCUJJVCgwKQogCiAvKiBVU0JfSU5UX0VOQV8xIGFuZCBVU0JfSU5UX1NUQV8xICovCiAjZGVmaW5lIFVTQl9JTlRfMV9CM19QTExXS1VQCUJJVCgzMSkKQEAgLTM2Myw2ICszNjQsNyBAQAogewogCS8qIEZJWE1FOiBIb3cgdG8gY2hhbmdlIGhvc3QgLyBwZXJpcGhlcmFsIG1vZGUgYXMgd2VsbD8gKi8KIAl1c2IzX3NldF9iaXQodXNiMywgRFJEX0NPTl9QRVJJX0NPTiwgVVNCM19EUkRfQ09OKTsKKwl1c2IzX2NsZWFyX2JpdCh1c2IzLCBEUkRfQ09OX1ZCT1VULCBVU0IzX0RSRF9DT04pOwogCiAJdXNiM193cml0ZSh1c2IzLCB+MCwgVVNCM19VU0JfSU5UX1NUQV8xKTsKIAl1c2IzX2VuYWJsZV9pcnFfMSh1c2IzLCBVU0JfSU5UXzFfVkJVU19DTkcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy91ZGMteGlsaW54LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3VkYy14aWxpbnguYwppbmRleCBmOGJmMjkwLi41ODhlMjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3VkYy14aWxpbnguYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3VkYy14aWxpbnguYwpAQCAtOTczLDEwICs5NzMsOCBAQAogCiAJdWRjID0gZXAtPnVkYzsKIAlyZXEgPSBremFsbG9jKHNpemVvZigqcmVxKSwgZ2ZwX2ZsYWdzKTsKLQlpZiAoIXJlcSkgewotCQlkZXZfZXJyKHVkYy0+ZGV2LCAiJXM6bm90IGVub3VnaCBtZW1vcnkiLCBfX2Z1bmNfXyk7CisJaWYgKCFyZXEpCiAJCXJldHVybiBOVUxMOwotCX0KIAogCXJlcS0+ZXAgPSBlcDsKIAlJTklUX0xJU1RfSEVBRCgmcmVxLT5xdWV1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKaW5kZXggMmU3MTBhNC4uMGI4MGNlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCiBjb25maWcgVVNCX09IQ0lfSENEX09NQVAzCiAJdHJpc3RhdGUgIk9IQ0kgc3VwcG9ydCBmb3IgT01BUDMgYW5kIGxhdGVyIGNoaXBzIgotCWRlcGVuZHMgb24gKEFSQ0hfT01BUDMgfHwgQVJDSF9PTUFQNCkKKwlkZXBlbmRzIG9uIChBUkNIX09NQVAzIHx8IEFSQ0hfT01BUDQgfHwgU09DX09NQVA1KQogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIG9uLWNoaXAgT0hDSSBjb250cm9sbGVyIG9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2JjbWEtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2JjbWEtaGNkLmMKaW5kZXggMTcyZWYxNy4uNWY0MjVjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9iY21hLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvYmNtYS1oY2QuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9laGNpX3Bkcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivb2hjaV9wZHJpdmVyLmg+CiAKQEAgLTM0LDYgKzM1LDkgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiQ29tbW9uIFVTQiBkcml2ZXIgZm9yIEJDTUEgQnVzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKKy8qIFNlZSBCQ01BX0NMS0NUTFNUX0VYVFJFU1JFUSBhbmQgQkNNQV9DTEtDVExTVF9FWFRSRVNTVCAqLworI2RlZmluZSBVU0JfQkNNQV9DTEtDVExTVF9VU0JfQ0xLX1JFUQkJCTB4MDAwMDAxMDAKKwogc3RydWN0IGJjbWFfaGNkX2RldmljZSB7CiAJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmVoY2lfZGV2OwpAQCAtMTY1LDQ0ICsxNjksODAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJjbWFfaGNkX2luaXRfY2hpcF9hcm1fcGh5KHN0cnVjdCBiY21hX2RldmljZSAqZGV2KQorLyoqCisgKiBiY21hX2hjZF91c2IyMF9vbGRfYXJtX2luaXQgLSBJbml0aWFsaXplIG9sZCBVU0IgMi4wIGNvbnRyb2xsZXIgb24gQVJNCisgKgorICogT2xkIFVTQiAyLjAgY29yZSBpcyBpZGVudGlmaWVkIGFzIEJDTUFfQ09SRV9VU0IyMF9IT1NUIGFuZCB3YXMgaW50cm9kdWNlZAorICogbG9uZyBiZWZvcmUgTm9ydGhzdGFyIGRldmljZXMuIEl0IHNlZW1zIHNvbWUgY2hlYXBlciBjaGlwc2V0cyBsaWtlIEJDTTUzNTczCisgKiBzdGlsbCB1c2UgaXQuCisgKiBJbml0aWFsaXphdGlvbiBvZiB0aGlzIG9sZCBjb3JlIGRpZmZlcnMgYmV0d2VlbiBNSVBTIGFuZCBBUk0uCisgKi8KK3N0YXRpYyBpbnQgYmNtYV9oY2RfdXNiMjBfb2xkX2FybV9pbml0KHN0cnVjdCBiY21hX2hjZF9kZXZpY2UgKnVzYl9kZXYpCiB7Ci0Jc3RydWN0IGJjbWFfZGV2aWNlICphcm1fY29yZTsKLQl2b2lkIF9faW9tZW0gKmRtdTsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB1c2JfZGV2LT5jb3JlOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjb3JlLT5kZXY7CisJc3RydWN0IGJjbWFfZGV2aWNlICpwbXVfY29yZTsKIAotCWFybV9jb3JlID0gYmNtYV9maW5kX2NvcmUoZGV2LT5idXMsIEJDTUFfQ09SRV9BUk1DQTkpOwotCWlmICghYXJtX2NvcmUpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJjYW4gbm90IGZpbmQgQVJNIENvcnRleCBBOSBpaG9zdCBjb3JlXG4iKTsKLQkJcmV0dXJuOworCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOworCWlmIChjb3JlLT5pZC5yZXYgPCA1KQorCQlyZXR1cm4gMDsKKworCXBtdV9jb3JlID0gYmNtYV9maW5kX2NvcmUoY29yZS0+YnVzLCBCQ01BX0NPUkVfUE1VKTsKKwlpZiAoIXBtdV9jb3JlKSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGZpbmQgUE1VIGNvcmVcbiIpOworCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlkbXUgPSBpb3JlbWFwX25vY2FjaGUoYXJtX2NvcmUtPmFkZHJfc1swXSwgMHgxMDAwKTsKLQlpZiAoIWRtdSkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgImNhbiBub3QgbWFwIEFSTSBDb3J0ZXggQTkgaWhvc3QgY29yZVxuIik7Ci0JCXJldHVybjsKLQl9CisJLyogVGFrZSBVU0IgY29yZSBvdXQgb2YgcmVzZXQgKi8KKwliY21hX2F3cml0ZTMyKGNvcmUsIEJDTUFfSU9DVEwsIEJDTUFfSU9DVExfQ0xLIHwgQkNNQV9JT0NUTF9GR0MpOworCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisJYmNtYV9hd3JpdGUzMihjb3JlLCBCQ01BX1JFU0VUX0NUTCwgQkNNQV9SRVNFVF9DVExfUkVTRVQpOworCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisJYmNtYV9hd3JpdGUzMihjb3JlLCBCQ01BX1JFU0VUX0NUTCwgMCk7CisJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKKwliY21hX2F3cml0ZTMyKGNvcmUsIEJDTUFfSU9DVEwsIEJDTUFfSU9DVExfQ0xLKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOwogCi0JLyogVW5sb2NrIERNVSBQTEwgc2V0dGluZ3MgKi8KLQlpb3dyaXRlMzIoMHgwMDAwZWE2OCwgZG11ICsgMHgxODApOworCS8qIEVuYWJsZSBNaXNjIFBMTCAqLworCWJjbWFfd3JpdGUzMihjb3JlLCBCQ01BX0NMS0NUTFNULCBCQ01BX0NMS0NUTFNUX0ZPUkNFSFQgfAorCQkJCQkgIEJDTUFfQ0xLQ1RMU1RfSFFDTEtSRVEgfAorCQkJCQkgIFVTQl9CQ01BX0NMS0NUTFNUX1VTQl9DTEtfUkVRKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOwogCi0JLyogV3JpdGUgVVNCIDIuMCBQTEwgY29udHJvbCBzZXR0aW5nICovCi0JaW93cml0ZTMyKDB4MDBkZDEwYzMsIGRtdSArIDB4MTY0KTsKKwliY21hX3dyaXRlMzIoY29yZSwgMHg1MTAsIDB4YzdmODUwMDApOworCWJjbWFfd3JpdGUzMihjb3JlLCAweDUxMCwgMHhjN2Y4NTAwMyk7CisJdXNsZWVwX3JhbmdlKDMwMCwgNjAwKTsKIAotCS8qIExvY2sgRE1VIFBMTCBzZXR0aW5ncyAqLwotCWlvd3JpdGUzMigweDAwMDAwMDAwLCBkbXUgKyAweDE4MCk7CisJLyogUHJvZ3JhbSBVU0IgUEhZIFBMTCBwYXJhbWV0ZXJzICovCisJYmNtYV93cml0ZTMyKHBtdV9jb3JlLCBCQ01BX0NDX1BNVV9QTExDVExfQUREUiwgMHg2KTsKKwliY21hX3dyaXRlMzIocG11X2NvcmUsIEJDTUFfQ0NfUE1VX1BMTENUTF9EQVRBLCAweDAwNTM2MGMxKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCWJjbWFfd3JpdGUzMihwbXVfY29yZSwgQkNNQV9DQ19QTVVfUExMQ1RMX0FERFIsIDB4Nyk7CisJYmNtYV93cml0ZTMyKHBtdV9jb3JlLCBCQ01BX0NDX1BNVV9QTExDVExfREFUQSwgMHgwKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCWJjbWFfc2V0MzIocG11X2NvcmUsIEJDTUFfQ0NfUE1VX0NUTCwgQkNNQV9DQ19QTVVfQ1RMX1BMTF9VUEQpOworCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CiAKLQlpb3VubWFwKGRtdSk7CisJYmNtYV93cml0ZTMyKGNvcmUsIDB4NTEwLCAweDdmOGQwMDcpOworCXVkZWxheSgxMDAwKTsKKworCS8qIFRha2UgY29udHJvbGxlciBvdXQgb2YgcmVzZXQgKi8KKwliY21hX3dyaXRlMzIoY29yZSwgMHgyMDAsIDB4NGZmKTsKKwl1c2xlZXBfcmFuZ2UoMjUsIDUwKTsKKwliY21hX3dyaXRlMzIoY29yZSwgMHgyMDAsIDB4NmZmKTsKKwl1c2xlZXBfcmFuZ2UoMjUsIDUwKTsKKwliY21hX3dyaXRlMzIoY29yZSwgMHgyMDAsIDB4N2ZmKTsKKwl1c2xlZXBfcmFuZ2UoMjUsIDUwKTsKKworCW9mX3BsYXRmb3JtX2RlZmF1bHRfcG9wdWxhdGUoZGV2LT5vZl9ub2RlLCBOVUxMLCBkZXYpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGJjbWFfaGNkX2luaXRfY2hpcF9hcm1faGMoc3RydWN0IGJjbWFfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBiY21hX2hjZF91c2IyMF9uc19pbml0X2hjKHN0cnVjdCBiY21hX2RldmljZSAqZGV2KQogewogCXUzMiB2YWw7CiAKLQkvKgotCSAqIERlbGF5IGFmdGVyIFBIWSBpbml0aWFsaXplZCB0byBlbnN1cmUgSEMgaXMgcmVhZHkgdG8gYmUgY29uZmlndXJlZAotCSAqLwotCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKLQogCS8qIFNldCBwYWNrZXQgYnVmZmVyIE9VVCB0aHJlc2hvbGQgKi8KIAl2YWwgPSBiY21hX3JlYWQzMihkZXYsIDB4OTQpOwogCXZhbCAmPSAweGZmZmY7CkBAIC0yMTMsMjAgKzI1MywzMyBAQAogCXZhbCA9IGJjbWFfcmVhZDMyKGRldiwgMHg5Yyk7CiAJdmFsIHw9IDE7CiAJYmNtYV93cml0ZTMyKGRldiwgMHg5YywgdmFsKTsKKworCS8qCisJICogQnJvYWRjb20gaW5pdGlhbGl6ZXMgUEhZIGFuZCB0aGVuIHdhaXRzIHRvIGVuc3VyZSBIQyBpcyByZWFkeSB0byBiZQorCSAqIGNvbmZpZ3VyZWQuIEluIG91ciBjYXNlIHRoZSBvcmRlciBpcyByZXZlcnNlZC4gV2UganVzdCBpbml0aWFsaXplZAorCSAqIGNvbnRyb2xsZXIgYW5kIHdlIGxldCBIQ0QgaW5pdGlhbGl6ZSBQSFksIHNvIGxldCdzIHdhaXQgKHNsZWVwKSBub3cuCisJICovCisJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwogfQogCi1zdGF0aWMgdm9pZCBiY21hX2hjZF9pbml0X2NoaXBfYXJtKHN0cnVjdCBiY21hX2RldmljZSAqZGV2KQorLyoqCisgKiBiY21hX2hjZF91c2IyMF9uc19pbml0IC0gSW5pdGlhbGl6ZSBOb3J0aHN0YXIgVVNCIDIuMCBjb250cm9sbGVyCisgKi8KK3N0YXRpYyBpbnQgYmNtYV9oY2RfdXNiMjBfbnNfaW5pdChzdHJ1Y3QgYmNtYV9oY2RfZGV2aWNlICpiY21hX2hjZCkKIHsKLQliY21hX2NvcmVfZW5hYmxlKGRldiwgMCk7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gYmNtYV9oY2QtPmNvcmU7CisJc3RydWN0IGJjbWFfY2hpcGluZm8gKmNpID0gJmNvcmUtPmJ1cy0+Y2hpcGluZm87CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNvcmUtPmRldjsKIAotCWlmIChkZXYtPmJ1cy0+Y2hpcGluZm8uaWQgPT0gQkNNQV9DSElQX0lEX0JDTTQ3MDcgfHwKLQkgICAgZGV2LT5idXMtPmNoaXBpbmZvLmlkID09IEJDTUFfQ0hJUF9JRF9CQ001MzAxOCkgewotCQlpZiAoZGV2LT5idXMtPmNoaXBpbmZvLnBrZyA9PSBCQ01BX1BLR19JRF9CQ000NzA3IHx8Ci0JCSAgICBkZXYtPmJ1cy0+Y2hpcGluZm8ucGtnID09IEJDTUFfUEtHX0lEX0JDTTQ3MDgpCi0JCQliY21hX2hjZF9pbml0X2NoaXBfYXJtX3BoeShkZXYpOworCWJjbWFfY29yZV9lbmFibGUoY29yZSwgMCk7CiAKLQkJYmNtYV9oY2RfaW5pdF9jaGlwX2FybV9oYyhkZXYpOwotCX0KKwlpZiAoY2ktPmlkID09IEJDTUFfQ0hJUF9JRF9CQ000NzA3IHx8CisJICAgIGNpLT5pZCA9PSBCQ01BX0NISVBfSURfQkNNNTMwMTgpCisJCWJjbWFfaGNkX3VzYjIwX25zX2luaXRfaGMoY29yZSk7CisKKwlvZl9wbGF0Zm9ybV9kZWZhdWx0X3BvcHVsYXRlKGRldi0+b2Zfbm9kZSwgTlVMTCwgZGV2KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBiY21hX2hjaV9wbGF0Zm9ybV9wb3dlcl9ncGlvKHN0cnVjdCBiY21hX2RldmljZSAqZGV2LCBib29sIHZhbCkKQEAgLTI5OSwxNiArMzUyLDcgQEAKIAlpZiAoZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudChkZXYtPmRtYV9kZXYsIERNQV9CSVRfTUFTSygzMikpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlzd2l0Y2ggKGRldi0+aWQuaWQpIHsKLQljYXNlIEJDTUFfQ09SRV9OU19VU0IyMDoKLQkJYmNtYV9oY2RfaW5pdF9jaGlwX2FybShkZXYpOwotCQlicmVhazsKLQljYXNlIEJDTUFfQ09SRV9VU0IyMF9IT1NUOgotCQliY21hX2hjZF9pbml0X2NoaXBfbWlwcyhkZXYpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CisJYmNtYV9oY2RfaW5pdF9jaGlwX21pcHMoZGV2KTsKIAogCS8qIEluIEFJIGNoaXBzIEVIQ0kgaXMgYWRkcnNwYWNlIDAsIE9IQ0kgaXMgMSAqLwogCW9oY2lfYWRkciA9IGRldi0+YWRkcl9zWzBdOwpAQCAtMzM4LDYgKzM4MiwxOCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgYmNtYV9oY2RfdXNiMzBfaW5pdChzdHJ1Y3QgYmNtYV9oY2RfZGV2aWNlICpiY21hX2hjZCkKK3sKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSBiY21hX2hjZC0+Y29yZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY29yZS0+ZGV2OworCisJYmNtYV9jb3JlX2VuYWJsZShjb3JlLCAwKTsKKworCW9mX3BsYXRmb3JtX2RlZmF1bHRfcG9wdWxhdGUoZGV2LT5vZl9ub2RlLCBOVUxMLCBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYmNtYV9oY2RfcHJvYmUoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlKQogewogCWludCBlcnI7CkBAIC0zNTcsMTQgKzQxMywyNCBAQAogCiAJc3dpdGNoIChjb3JlLT5pZC5pZCkgewogCWNhc2UgQkNNQV9DT1JFX1VTQjIwX0hPU1Q6CisJCWlmIChJU19FTkFCTEVEKENPTkZJR19BUk0pKQorCQkJZXJyID0gYmNtYV9oY2RfdXNiMjBfb2xkX2FybV9pbml0KHVzYl9kZXYpOworCQllbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19NSVBTKSkKKwkJCWVyciA9IGJjbWFfaGNkX3VzYjIwX2luaXQodXNiX2Rldik7CisJCWVsc2UKKwkJCWVyciA9IC1FTk9UU1VQUDsKKwkJYnJlYWs7CiAJY2FzZSBCQ01BX0NPUkVfTlNfVVNCMjA6Ci0JCWVyciA9IGJjbWFfaGNkX3VzYjIwX2luaXQodXNiX2Rldik7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOworCQllcnIgPSBiY21hX2hjZF91c2IyMF9uc19pbml0KHVzYl9kZXYpOworCQlicmVhazsKKwljYXNlIEJDTUFfQ09SRV9OU19VU0IzMDoKKwkJZXJyID0gYmNtYV9oY2RfdXNiMzBfaW5pdCh1c2JfZGV2KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQorCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKIAliY21hX3NldF9kcnZkYXRhKGNvcmUsIHVzYl9kZXYpOwogCXJldHVybiAwOwpAQCAtNDE2LDYgKzQ4Miw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGJjbWFfZGV2aWNlX2lkIGJjbWFfaGNkX3RhYmxlW10gPSB7CiAJQkNNQV9DT1JFKEJDTUFfTUFOVUZfQkNNLCBCQ01BX0NPUkVfVVNCMjBfSE9TVCwgQkNNQV9BTllfUkVWLCBCQ01BX0FOWV9DTEFTUyksCiAJQkNNQV9DT1JFKEJDTUFfTUFOVUZfQkNNLCBCQ01BX0NPUkVfTlNfVVNCMjAsIEJDTUFfQU5ZX1JFViwgQkNNQV9BTllfQ0xBU1MpLAorCUJDTUFfQ09SRShCQ01BX01BTlVGX0JDTSwgQkNNQV9DT1JFX05TX1VTQjMwLCBCQ01BX0FOWV9SRVYsIEJDTUFfQU5ZX0NMQVNTKSwKIAl7fSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGJjbWEsIGJjbWFfaGNkX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wbGF0Zm9ybS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBsYXRmb3JtLmMKaW5kZXggNjgxNmI4Yy4uODc2ZGNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBsYXRmb3JtLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBsYXRmb3JtLmMKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlICJlaGNpLmgiCiAKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkVIQ0kgZ2VuZXJpYyBwbGF0Zm9ybSBkcml2ZXIiCi0jZGVmaW5lIEVIQ0lfTUFYX0NMS1MgMworI2RlZmluZSBFSENJX01BWF9DTEtTIDQKICNkZWZpbmUgRUhDSV9NQVhfUlNUUyAzCiAjZGVmaW5lIGhjZF90b19laGNpX3ByaXYoaCkgKChzdHJ1Y3QgZWhjaV9wbGF0Zm9ybV9wcml2ICopaGNkX3RvX2VoY2koaCktPnByaXYpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1oY2QuYwppbmRleCAwOTYwZjQxLi41NWEwYWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9maGNpLWhjZC5jCkBAIC0zMTAsMTAgKzMxMCw4IEBACiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIFNDQyBkYXRhIHN0cnVjdHVyZSAqLwogCXVzYiA9IGt6YWxsb2Moc2l6ZW9mKCp1c2IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXVzYikgewotCQlmaGNpX2VycihmaGNpLCAibm8gbWVtb3J5IGZvciBTQ0MgZGF0YSBzdHJ1Y3RcbiIpOworCWlmICghdXNiKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAKIAl1c2ItPmZoY2kgPSBmaGNpOwogCXVzYi0+aGNfbGlzdCA9IGZoY2ktPmhjX2xpc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2ZzbC1tcGgtZHItb2YuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZnNsLW1waC1kci1vZi5jCmluZGV4IDEwNDRiMGYuLmYwN2NjYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZnNsLW1waC1kci1vZi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZnNsLW1waC1kci1vZi5jCkBAIC0yMjIsMjMgKzIyMiwxNyBAQAogCXBkYXRhLT5jb250cm9sbGVyX3ZlciA9IHVzYl9nZXRfdmVyX2luZm8obnApOwogCiAJLyogQWN0aXZhdGUgRXJyYXR1bSBieSByZWFkaW5nIHByb3BlcnR5IGluIGRldmljZSB0cmVlICovCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImZzbCx1c2ItZXJyYXR1bS1hMDA3NzkyIiwgTlVMTCkpCi0JCXBkYXRhLT5oYXNfZnNsX2VycmF0dW1fYTAwNzc5MiA9IDE7Ci0JZWxzZQotCQlwZGF0YS0+aGFzX2ZzbF9lcnJhdHVtX2EwMDc3OTIgPSAwOwotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsdXNiLWVycmF0dW0tYTAwNTI3NSIsIE5VTEwpKQotCQlwZGF0YS0+aGFzX2ZzbF9lcnJhdHVtX2EwMDUyNzUgPSAxOwotCWVsc2UKLQkJcGRhdGEtPmhhc19mc2xfZXJyYXR1bV9hMDA1Mjc1ID0gMDsKKwlwZGF0YS0+aGFzX2ZzbF9lcnJhdHVtX2EwMDc3OTIgPQorCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJmc2wsdXNiLWVycmF0dW0tYTAwNzc5MiIpOworCXBkYXRhLT5oYXNfZnNsX2VycmF0dW1fYTAwNTI3NSA9CisJCW9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImZzbCx1c2ItZXJyYXR1bS1hMDA1Mjc1Iik7CiAKIAkvKgogCSAqIERldGVybWluZSB3aGV0aGVyIHBoeV9jbGtfdmFsaWQgbmVlZHMgdG8gYmUgY2hlY2tlZAogCSAqIGJ5IHJlYWRpbmcgcHJvcGVydHkgaW4gZGV2aWNlIHRyZWUKIAkgKi8KLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5LWNsay12YWxpZCIsIE5VTEwpKQotCQlwZGF0YS0+Y2hlY2tfcGh5X2Nsa192YWxpZCA9IDE7Ci0JZWxzZQotCQlwZGF0YS0+Y2hlY2tfcGh5X2Nsa192YWxpZCA9IDA7CisJcGRhdGEtPmNoZWNrX3BoeV9jbGtfdmFsaWQgPQorCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJwaHktY2xrLXZhbGlkIik7CiAKIAlpZiAocGRhdGEtPmhhdmVfc3lzaWZfcmVncykgewogCQlpZiAocGRhdGEtPmNvbnRyb2xsZXJfdmVyID09IEZTTF9VU0JfVkVSX05PTkUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvbWF4MzQyMS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvbWF4MzQyMS1oY2QuYwppbmRleCAyZjc2OTAwLi4zNjk4NjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L21heDM0MjEtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9tYXgzNDIxLWhjZC5jCkBAIC0xODU2LDE1ICsxODU2LDExIEBACiAJSU5JVF9MSVNUX0hFQUQoJm1heDM0MjFfaGNkLT5lcF9saXN0KTsKIAogCW1heDM0MjFfaGNkLT50eCA9IGttYWxsb2Moc2l6ZW9mKCptYXgzNDIxX2hjZC0+dHgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1heDM0MjFfaGNkLT50eCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgImZhaWxlZCB0byBrbWFsbG9jIHR4IGJ1ZmZlclxuIik7CisJaWYgKCFtYXgzNDIxX2hjZC0+dHgpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCW1heDM0MjFfaGNkLT5yeCA9IGttYWxsb2Moc2l6ZW9mKCptYXgzNDIxX2hjZC0+cngpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1heDM0MjFfaGNkLT5yeCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgImZhaWxlZCB0byBrbWFsbG9jIHJ4IGJ1ZmZlclxuIik7CisJaWYgKCFtYXgzNDIxX2hjZC0+cngpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJbWF4MzQyMV9oY2QtPnNwaV90aHJlYWQgPSBrdGhyZWFkX3J1bihtYXgzNDIxX3NwaV90aHJlYWQsIGhjZCwKIAkJCQkJICAgICAgIm1heDM0MjFfc3BpX3RocmVhZCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMKaW5kZXggZDE3NzM3Mi4uNWI1ODgwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jCkBAIC0yMSw4ICsyMSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KKyNpbmNsdWRlIDxzb2MvYXQ5MS9hdG1lbC1zZnIuaD4KIAogI2luY2x1ZGUgIm9oY2kuaCIKIApAQCAtNTEsNiArNTQsNyBAQAogCXN0cnVjdCBjbGsgKmhjbGs7CiAJYm9vbCBjbG9ja2VkOwogCWJvb2wgd2FrZXVwOwkJLyogU2F2ZWQgd2FrZS11cCBzdGF0ZSBmb3IgcmVzdW1lICovCisJc3RydWN0IHJlZ21hcCAqc2ZyX3JlZ21hcDsKIH07CiAvKiBpbnRlcmZhY2UgYW5kIGZ1bmN0aW9uIGNsb2Nrczsgc29tZXRpbWVzIGFsc28gYW4gQUhCIGNsb2NrICovCiAKQEAgLTEzNCw2ICsxMzgsMTcgQEAKIAogc3RhdGljIHZvaWQgdXNiX2hjZF9hdDkxX3JlbW92ZSAoc3RydWN0IHVzYl9oY2QgKiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKIAorc3RhdGljIHN0cnVjdCByZWdtYXAgKmF0OTFfZHRfc3lzY29uX3Nmcih2b2lkKQoreworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKworCXJlZ21hcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X2NvbXBhdGlibGUoImF0bWVsLHNhbWE1ZDItc2ZyIik7CisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZWdtYXAgPSBOVUxMOworCisJcmV0dXJuIHJlZ21hcDsKK30KKwogLyogY29uZmlndXJlIHNvIGFuIEhDIGRldmljZSBhbmQgaWQgYXJlIGFsd2F5cyBwcm92aWRlZCAqLwogLyogYWx3YXlzIGNhbGxlZCB3aXRoIHByb2Nlc3MgY29udGV4dDsgc2xlZXBpbmcgaXMgT0sgKi8KIApAQCAtMTk3LDYgKzIxMiwxMCBAQAogCQlnb3RvIGVycjsKIAl9CiAKKwlvaGNpX2F0OTEtPnNmcl9yZWdtYXAgPSBhdDkxX2R0X3N5c2Nvbl9zZnIoKTsKKwlpZiAoIW9oY2lfYXQ5MS0+c2ZyX3JlZ21hcCkKKwkJZGV2X3dhcm4oZGV2LCAiZmFpbGVkIHRvIGZpbmQgc2ZyIG5vZGVcbiIpOworCiAJYm9hcmQgPSBoY2QtPnNlbGYuY29udHJvbGxlci0+cGxhdGZvcm1fZGF0YTsKIAlvaGNpID0gaGNkX3RvX29oY2koaGNkKTsKIAlvaGNpLT5udW1fcG9ydHMgPSBib2FyZC0+cG9ydHM7CkBAIC0yODIsNiArMzAxLDI4IEBACiAJcmV0dXJuIGxlbmd0aDsKIH0KIAorc3RhdGljIGludCBvaGNpX2F0OTFfcG9ydF9zdXNwZW5kKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgdTggc2V0KQoreworCXUzMiByZWd2YWw7CisJaW50IHJldDsKKworCWlmICghcmVnbWFwKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgQVQ5MV9TRlJfT0hDSUlDUiwgJnJlZ3ZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzZXQpCisJCXJlZ3ZhbCB8PSBBVDkxX09IQ0lJQ1JfVVNCX1NVU1BFTkQ7CisJZWxzZQorCQlyZWd2YWwgJj0gfkFUOTFfT0hDSUlDUl9VU0JfU1VTUEVORDsKKworCXJlZ21hcF93cml0ZShyZWdtYXAsIEFUOTFfU0ZSX09IQ0lJQ1IsIHJlZ3ZhbCk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIExvb2sgYXQgdGhlIGNvbnRyb2wgcmVxdWVzdHMgdG8gdGhlIHJvb3QgaHViIGFuZCBzZWUgaWYgd2UgbmVlZCB0byBvdmVycmlkZS4KICAqLwpAQCAtMjg5LDYgKzMzMCw3IEBACiAJCQkJIHUxNiB3SW5kZXgsIGNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpCiB7CiAJc3RydWN0IGF0OTFfdXNiaF9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoaGNkLT5zZWxmLmNvbnRyb2xsZXIpOworCXN0cnVjdCBvaGNpX2F0OTFfcHJpdiAqb2hjaV9hdDkxID0gaGNkX3RvX29oY2lfYXQ5MV9wcml2KGhjZCk7CiAJc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzYzsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAl1MzIgKmRhdGEgPSAodTMyICopYnVmOwpAQCAtMzAxLDcgKzM0Myw4IEBACiAKIAlzd2l0Y2ggKHR5cGVSZXEpIHsKIAljYXNlIFNldFBvcnRGZWF0dXJlOgotCQlpZiAod1ZhbHVlID09IFVTQl9QT1JUX0ZFQVRfUE9XRVIpIHsKKwkJc3dpdGNoICh3VmFsdWUpIHsKKwkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgogCQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIlNldFBvcnRGZWF0OiBQT1dFUlxuIik7CiAJCQlpZiAodmFsaWRfcG9ydCh3SW5kZXgpKSB7CiAJCQkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIHdJbmRleCwgMSk7CkBAIC0zMDksNiArMzUyLDE1IEBACiAJCQl9CiAKIAkJCWdvdG8gb3V0OworCisJCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgIlNldFBvcnRGZWF0OiBTVVNQRU5EXG4iKTsKKwkJCWlmICh2YWxpZF9wb3J0KHdJbmRleCkpIHsKKwkJCQlvaGNpX2F0OTFfcG9ydF9zdXNwZW5kKG9oY2lfYXQ5MS0+c2ZyX3JlZ21hcCwKKwkJCQkJCSAgICAgICAxKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCkBAIC0zNDIsNiArMzk0LDE2IEBACiAJCQkJb2hjaV9hdDkxX3VzYl9zZXRfcG93ZXIocGRhdGEsIHdJbmRleCwgMCk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CisJCQlicmVhazsKKworCQljYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVORDoKKwkJCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJDbGVhclBvcnRGZWF0dXJlOiBTVVNQRU5EXG4iKTsKKwkJCWlmICh2YWxpZF9wb3J0KHdJbmRleCkpIHsKKwkJCQlvaGNpX2F0OTFfcG9ydF9zdXNwZW5kKG9oY2lfYXQ5MS0+c2ZyX3JlZ21hcCwKKwkJCQkJCSAgICAgICAwKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTU5OSw2ICs2NjEsOCBAQAogCWlmIChvaGNpX2F0OTEtPndha2V1cCkKIAkJZW5hYmxlX2lycV93YWtlKGhjZC0+aXJxKTsKIAorCW9oY2lfYXQ5MV9wb3J0X3N1c3BlbmQob2hjaV9hdDkxLT5zZnJfcmVnbWFwLCAxKTsKKwogCXJldCA9IG9oY2lfc3VzcGVuZChoY2QsIG9oY2lfYXQ5MS0+d2FrZXVwKTsKIAlpZiAocmV0KSB7CiAJCWlmIChvaGNpX2F0OTEtPndha2V1cCkKQEAgLTYzOCw2ICs3MDIsOSBAQAogCWF0OTFfc3RhcnRfY2xvY2sob2hjaV9hdDkxKTsKIAogCW9oY2lfcmVzdW1lKGhjZCwgZmFsc2UpOworCisJb2hjaV9hdDkxX3BvcnRfc3VzcGVuZChvaGNpX2F0OTEtPnNmcl9yZWdtYXAsIDApOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCmluZGV4IGRlN2M2ODYuLjQ5NWMxNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPG1hY2gvbXV4Lmg+CiAKICNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+Ci0jaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC91c2IuaD4KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc2ExMTExLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc2ExMTExLmMKaW5kZXggMmFjMjY2ZC4uM2E5ZWEzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zYTExMTEuYwpAQCAtMTMsOSArMTMsNyBAQAogICogVGhpcyBmaWxlIGlzIGxpY2VuY2VkIHVuZGVyIHRoZSBHUEwuCiAgKi8KIAotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgotI2luY2x1ZGUgPG1hY2gvYXNzYWJldC5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9zYTExMTEuaD4KIAogI2lmbmRlZiBDT05GSUdfU0ExMTExCkBAIC0xMjcsNyArMTI1LDcgQEAKIAlkZXZfZGJnKCZkZXYtPmRldiwgInN0YXJ0aW5nIFNBLTExMTEgT0hDSSBVU0IgQ29udHJvbGxlclxuIik7CiAKIAlpZiAobWFjaGluZV9pc194cDg2MCgpIHx8Ci0JICAgIG1hY2hpbmVfaGFzX25lcG9uc2V0KCkgfHwKKwkgICAgbWFjaGluZV9pc19hc3NhYmV0KCkgfHwKIAkgICAgbWFjaGluZV9pc19wZnMxNjgoKSB8fAogCSAgICBtYWNoaW5lX2lzX2JhZGdlNCgpKQogCQl1c2JfcnN0ID0gVVNCX1JFU0VUX1BXUlNFTlNFTE9XIHwgVVNCX1JFU0VUX1BXUkNUUkxMT1c7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKaW5kZXggYTdkZThlOC4uNWQzZDkxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYwpAQCAtNjAxLDExICs2MDEsOCBAQAogCiAJdWhjaS0+ZnJhbWVfY3B1ID0ga2NhbGxvYyhVSENJX05VTUZSQU1FUywgc2l6ZW9mKCp1aGNpLT5mcmFtZV9jcHUpLAogCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1aGNpLT5mcmFtZV9jcHUpIHsKLQkJZGV2X2Vycih1aGNpX2Rldih1aGNpKSwKLQkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmcmFtZSBwb2ludGVyc1xuIik7CisJaWYgKCF1aGNpLT5mcmFtZV9jcHUpCiAJCWdvdG8gZXJyX2FsbG9jX2ZyYW1lX2NwdTsKLQl9CiAKIAl1aGNpLT50ZF9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKCJ1aGNpX3RkIiwgdWhjaV9kZXYodWhjaSksCiAJCQlzaXplb2Yoc3RydWN0IHVoY2lfdGQpLCAxNiwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaW5pdC5jIGIvZHJpdmVycy91c2IvaG9zdC93aGNpL2luaXQuYwppbmRleCBlMzYzNzIzLi5hZDhlYjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaW5pdC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9pbml0LmMKQEAgLTY1LDcgKzY1LDcgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3aGMtPmNtZF93cSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmd2hjLT5hc3luY19saXN0X3dxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3aGMtPnBlcmlvZGljX2xpc3Rfd3EpOwotCXdoYy0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoZGV2X25hbWUoJndoYy0+dW1jLT5kZXYpKTsKKwl3aGMtPndvcmtxdWV1ZSA9IGFsbG9jX29yZGVyZWRfd29ya3F1ZXVlKGRldl9uYW1lKCZ3aGMtPnVtYy0+ZGV2KSwgMCk7CiAJaWYgKHdoYy0+d29ya3F1ZXVlID09IE5VTEwpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCmluZGV4IGZkOWZkMTIuLjc5NzEzN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwpAQCAtODUwLDYgKzg1MCwxMCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CiAKIAllcC0+c3RvcF9jbWRzX3BlbmRpbmctLTsKKwlpZiAoeGhjaS0+eGhjX3N0YXRlICYgWEhDSV9TVEFURV9SRU1PVklORykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CiAJaWYgKHhoY2ktPnhoY19zdGF0ZSAmIFhIQ0lfU1RBVEVfRFlJTkcpIHsKIAkJeGhjaV9kYmdfdHJhY2UoeGhjaSwgdHJhY2VfeGhjaV9kYmdfY2FuY2VsX3VyYiwKIAkJCQkiU3RvcCBFUCB0aW1lciByYW4sIGJ1dCBhbm90aGVyIHRpbWVyIG1hcmtlZCAiCkBAIC05MDMsNyArOTA3LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4aGNpLT5sb2NrLCBmbGFncyk7CiAJeGhjaV9kYmdfdHJhY2UoeGhjaSwgdHJhY2VfeGhjaV9kYmdfY2FuY2VsX3VyYiwKIAkJCSJDYWxsaW5nIHVzYl9oY19kaWVkKCkiKTsKLQl1c2JfaGNfZGllZCh4aGNpX3RvX2hjZCh4aGNpKS0+cHJpbWFyeV9oY2QpOworCXVzYl9oY19kaWVkKHhoY2lfdG9faGNkKHhoY2kpKTsKIAl4aGNpX2RiZ190cmFjZSh4aGNpLCB0cmFjZV94aGNpX2RiZ19jYW5jZWxfdXJiLAogCQkJInhIQ0kgaG9zdCBjb250cm9sbGVyIGlzIGRlYWQuIik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktdGVncmEuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS10ZWdyYS5jCmluZGV4IDBmNTNhZTAuLmE1OWZhZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS10ZWdyYS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS10ZWdyYS5jCkBAIC0xMDMzLDcgKzEwMzMsNiBAQAogCXRlZ3JhLT5waHlzID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIHRlZ3JhLT5udW1fcGh5cywKIAkJCQkgICBzaXplb2YoKnRlZ3JhLT5waHlzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0ZWdyYS0+cGh5cykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgUEhZIGFycmF5XG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBwdXRfcGFkY3RsOwogCX0KQEAgLTExMTcsNiArMTExNiw3IEBACiAJCQkJCQkgdGVncmEtPmhjZCk7CiAJaWYgKCF4aGNpLT5zaGFyZWRfaGNkKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgc2hhcmVkIEhDRFxuIik7CisJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gcmVtb3ZlX3VzYjI7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCmluZGV4IDAxZDk2YzkuLjFhNGNhMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCkBAIC0yOTUsMTAgKzI5NSw4IEBACiAJeGhjaS0+bXNpeF9lbnRyaWVzID0KIAkJa21hbGxvYygoc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSkqeGhjaS0+bXNpeF9jb3VudCwKIAkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXhoY2ktPm1zaXhfZW50cmllcykgewotCQl4aGNpX2Vycih4aGNpLCAiRmFpbGVkIHRvIGFsbG9jYXRlIE1TSS1YIGVudHJpZXNcbiIpOworCWlmICgheGhjaS0+bXNpeF9lbnRyaWVzKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgeGhjaS0+bXNpeF9jb3VudDsgaSsrKSB7CiAJCXhoY2ktPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKaW5kZXggZWI4ZjhkMy4uNDdiMzU3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwpAQCAtMjQwLDYgKzI0MCwxMiBAQAogICAgICAgIGhlbHAKICAgICAgICAgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgU01TQyBVU0IzNTAzIEhTSUMgdG8gVVNCIDIuMCBEcml2ZXIuCiAKK2NvbmZpZyBVU0JfSFNJQ19VU0I0NjA0CisgICAgICAgdHJpc3RhdGUgIlVTQjQ2MDQgSFNJQyB0byBVU0IyMCBEcml2ZXIiCisgICAgICAgZGVwZW5kcyBvbiBJMkMKKyAgICAgICBoZWxwCisgICAgICAgICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIFNNU0MgVVNCNDYwNCBIU0lDIHRvIFVTQiAyLjAgRHJpdmVyLgorCiBjb25maWcgVVNCX0xJTktfTEFZRVJfVEVTVAogCXRyaXN0YXRlICJVU0IgTGluayBMYXllciBUZXN0IGRyaXZlciIKIAloZWxwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlIGIvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZQppbmRleCAzZDc5ZmFhLi4zZDE5OTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUKQEAgLTI0LDYgKzI0LDcgQEAKIG9iai0kKENPTkZJR19VU0JfU0VWU0VHKQkJKz0gdXNic2V2c2VnLm8KIG9iai0kKENPTkZJR19VU0JfWVVSRVgpCQkJKz0geXVyZXgubwogb2JqLSQoQ09ORklHX1VTQl9IU0lDX1VTQjM1MDMpCQkrPSB1c2IzNTAzLm8KK29iai0kKENPTkZJR19VU0JfSFNJQ19VU0I0NjA0KQkJKz0gdXNiNDYwNC5vCiBvYmotJChDT05GSUdfVVNCX0NIQU9TS0VZKQkJKz0gY2hhb3NrZXkubwogb2JqLSQoQ09ORklHX1VDU0kpCQkJKz0gdWNzaS5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvYWR1dHV4LmMgYi9kcml2ZXJzL3VzYi9taXNjL2FkdXR1eC5jCmluZGV4IDMwNzFjMGUuLjU2NDI2OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvYWR1dHV4LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYwpAQCAtNjcyLDggKzY3Miw3IEBACiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KIAlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWR1X2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCWlmICghZGV2KSB7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC03MTAsNyArNzA5LDYgQEAKIAogCWRldi0+cmVhZF9idWZmZXJfcHJpbWFyeSA9IGttYWxsb2MoKDQgKiBpbl9lbmRfc2l6ZSksIEdGUF9LRVJORUwpOwogCWlmICghZGV2LT5yZWFkX2J1ZmZlcl9wcmltYXJ5KSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgcmVhZF9idWZmZXJfcHJpbWFyeVxuIik7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtNzIzLDcgKzcyMSw2IEBACiAKIAlkZXYtPnJlYWRfYnVmZmVyX3NlY29uZGFyeSA9IGttYWxsb2MoKDQgKiBpbl9lbmRfc2l6ZSksIEdGUF9LRVJORUwpOwogCWlmICghZGV2LT5yZWFkX2J1ZmZlcl9zZWNvbmRhcnkpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSByZWFkX2J1ZmZlcl9zZWNvbmRhcnlcbiIpOwogCQlyZXR2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yOwogCX0KQEAgLTczNSwyOSArNzMyLDIxIEBACiAJbWVtc2V0KGRldi0+cmVhZF9idWZmZXJfc2Vjb25kYXJ5ICsgKDMgKiBpbl9lbmRfc2l6ZSksICdoJywgaW5fZW5kX3NpemUpOwogCiAJZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyID0ga21hbGxvYyhpbl9lbmRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9pbl9idWZmZXIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fYnVmZmVyXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX2J1ZmZlcikKIAkJZ290byBlcnJvcjsKLQl9CiAKIAkvKiBkZWJ1ZyBjb2RlIHByaW1lIHRoZSBidWZmZXIgKi8KIAltZW1zZXQoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCAnaScsIGluX2VuZF9zaXplKTsKIAogCWRldi0+aW50ZXJydXB0X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fdXJiXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX3VyYikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciA9IGttYWxsb2Mob3V0X2VuZF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idWZmZXIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlclxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X291dF91cmIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X3VyYlxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAogCWlmICghdXNiX3N0cmluZyh1ZGV2LCB1ZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIsIGRldi0+c2VyaWFsX251bWJlciwKIAkJCXNpemVvZihkZXYtPnNlcmlhbF9udW1iZXIpKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYyBiL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMKaW5kZXggYTBhMzgyNy4uZGE1ZmY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jCkBAIC04NSw3ICs4NSw2IEBACiB9OwogCiBzdGF0aWMgYXRvbWljX3QgY291bnRfZGlzcGxheXMgPSBBVE9NSUNfSU5JVCgwKTsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CiAKIHN0YXRpYyB2b2lkIGFwcGxlZGlzcGxheV9jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCiB7CkBAIC0xMjIsNyArMTIxLDcgQEAKIAljYXNlIEFDRF9CVE5fQlJJR0hUX1VQOgogCWNhc2UgQUNEX0JUTl9CUklHSFRfRE9XTjoKIAkJcGRhdGEtPmJ1dHRvbl9wcmVzc2VkID0gMTsKLQkJcXVldWVfZGVsYXllZF93b3JrKHdxLCAmcGRhdGEtPndvcmssIDApOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBkYXRhLT53b3JrLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBBQ0RfQlROX05PTkU6CiAJZGVmYXVsdDoKQEAgLTIzOSw3ICsyMzgsNiBAQAogCXBkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFwcGxlZGlzcGxheSksIEdGUF9LRVJORUwpOwogCWlmICghcGRhdGEpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZGV2X2VycigmaWZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtMjUzLDggKzI1MSw2IEBACiAJcGRhdGEtPm1zZ2RhdGEgPSBrbWFsbG9jKEFDRF9NU0dfQlVGRkVSX0xFTiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwZGF0YS0+bXNnZGF0YSkgewogCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZpZmFjZS0+ZGV2LAotCQkJIkFsbG9jYXRpbmcgYnVmZmVyIGZvciBjb250cm9sIG1lc3NhZ2VzIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0yNjIsNyArMjU4LDYgQEAKIAlwZGF0YS0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBkYXRhLT51cmIpIHsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZGV2X2VycigmaWZhY2UtPmRldiwgIkFsbG9jYXRpbmcgVVJCIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCkBAIC0zNDQsNyArMzM5LDcgQEAKIAogCWlmIChwZGF0YSkgewogCQl1c2Jfa2lsbF91cmIocGRhdGEtPnVyYik7Ci0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJnBkYXRhLT53b3JrKTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwZGF0YS0+d29yayk7CiAJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+YmQpOwogCQl1c2JfZnJlZV9jb2hlcmVudChwZGF0YS0+dWRldiwgQUNEX1VSQl9CVUZGRVJfTEVOLAogCQkJcGRhdGEtPnVyYmRhdGEsIHBkYXRhLT51cmItPnRyYW5zZmVyX2RtYSk7CkBAIC0zNjUsMTkgKzM2MCwxMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhcHBsZWRpc3BsYXlfaW5pdCh2b2lkKQogewotCXdxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImFwcGxlZGlzcGxheSIpOwotCWlmICghd3EpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhcHBsZWRpc3BsYXk6IENvdWxkIG5vdCBjcmVhdGUgd29yayBxdWV1ZVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQogCXJldHVybiB1c2JfcmVnaXN0ZXIoJmFwcGxlZGlzcGxheV9kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYXBwbGVkaXNwbGF5X2V4aXQodm9pZCkKIHsKLQlmbHVzaF93b3JrcXVldWUod3EpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKHdxKTsKIAl1c2JfZGVyZWdpc3RlcigmYXBwbGVkaXNwbGF5X2RyaXZlcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvY3lwcmVzc19jeTdjNjMuYyBiL2RyaXZlcnMvdXNiL21pc2MvY3lwcmVzc19jeTdjNjMuYwppbmRleCA0MDJiOTRkLi41YzkzYTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2N5cHJlc3NfY3k3YzYzLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9jeXByZXNzX2N5N2M2My5jCkBAIC03OSw3ICs3OSw2IEBACiAJLyogYWxsb2NhdGUgc29tZSBtZW1vcnkgZm9yIHRoZSBpL28gYnVmZmVyKi8KIAlpb2J1ZiA9IGt6YWxsb2MoQ1lQUkVTU19NQVhfUkVRU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpb2J1ZikgewotCQlkZXZfZXJyKCZkZXYtPnVkZXYtPmRldiwgIk91dCBvZiBtZW1vcnkhXG4iKTsKIAkJcmV0dmFsID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0yMDgsMTAgKzIwNyw4IEBACiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KIAlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeSFcbiIpOworCWlmICghZGV2KQogCQlnb3RvIGVycm9yX21lbTsKLQl9CiAKIAlkZXYtPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2N5dGhlcm0uYyBiL2RyaXZlcnMvdXNiL21pc2MvY3l0aGVybS5jCmluZGV4IDliYWIxYTMuLjlkOGJiOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvY3l0aGVybS5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvY3l0aGVybS5jCkBAIC0xMDEsMTAgKzEwMSw4IEBACiAJaW50IHJldHZhbDsKICAgIAogCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycigmY3l0aGVybS0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybiAwOwotCX0KIAogCWN5dGhlcm0tPmJyaWdodG5lc3MgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKICAgIApAQCAtMTQ4LDEwICsxNDYsOCBAQAogCWludCB0ZW1wLCBzaWduOwogICAgCiAJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIDA7Ci0JfQogCiAJLyogcmVhZCB0ZW1wZXJhdHVyZSAqLwogCXJldHZhbCA9IHZlbmRvcl9jb21tYW5kKGN5dGhlcm0tPnVkZXYsIFJFQURfUkFNLCBURU1QLCAwLCBidWZmZXIsIDgpOwpAQCAtMTkyLDEwICsxODgsOCBAQAogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAogCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycigmY3l0aGVybS0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybiAwOwotCX0KIAogCS8qIGNoZWNrIGJ1dHRvbiAqLwogCXJldHZhbCA9IHZlbmRvcl9jb21tYW5kKGN5dGhlcm0tPnVkZXYsIFJFQURfUkFNLCBCVVRUT04sIDAsIGJ1ZmZlciwgOCk7CkBAIC0yMzAsMTAgKzIyNCw4IEBACiAJdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCiAJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcmV0dmFsID0gdmVuZG9yX2NvbW1hbmQoY3l0aGVybS0+dWRldiwgUkVBRF9QT1JULCAwLCAwLCBidWZmZXIsIDgpOwogCWlmIChyZXR2YWwpCkBAIC0yNTcsMTAgKzI0OSw4IEBACiAJaW50IHRtcDsKICAgIAogCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycigmY3l0aGVybS0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybiAwOwotCX0KIAogCXRtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogICAgCkBAIC0yOTAsMTAgKzI4MCw4IEBACiAJdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCiAJYnVmZmVyID0ga21hbGxvYyg4LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZjeXRoZXJtLT51ZGV2LT5kZXYsICJvdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWJ1ZmZlcikKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcmV0dmFsID0gdmVuZG9yX2NvbW1hbmQoY3l0aGVybS0+dWRldiwgUkVBRF9QT1JULCAxLCAwLCBidWZmZXIsIDgpOwogCWlmIChyZXR2YWwpCkBAIC0zMTcsMTAgKzMwNSw4IEBACiAJaW50IHRtcDsKICAgIAogCWJ1ZmZlciA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmZXIpIHsKLQkJZGV2X2VycigmY3l0aGVybS0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybiAwOwotCX0KIAogCXRtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogICAgCkBAIC0zNTEsMTAgKzMzNyw4IEBACiAJaW50IHJldHZhbCA9IC1FTk9NRU07CiAKIAlkZXYgPSBremFsbG9jIChzaXplb2Yoc3RydWN0IHVzYl9jeXRoZXJtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIgKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCWlmICghZGV2KQogCQlnb3RvIGVycm9yX21lbTsKLQl9CiAKIAlkZXYtPnVkZXYgPSB1c2JfZ2V0X2Rldih1ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9lenVzYi5jIGIvZHJpdmVycy91c2IvbWlzYy9lenVzYi5jCmluZGV4IDk0NzgxMWIuLjgzNzIwOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvZXp1c2IuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2V6dXNiLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBtYXhfaW50ZXJuYWxfYWRyZXNzOwogfTsKIAotc3RhdGljIHN0cnVjdCBlenVzYl9meF90eXBlIGV6dXNiX2Z4MSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXp1c2JfZnhfdHlwZSBlenVzYl9meDEgPSB7CiAJLmNwdWNzX3JlZyA9IDB4N0Y5MiwKIAkubWF4X2ludGVybmFsX2FkcmVzcyA9IDB4MUIzRiwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jIGIvZHJpdmVycy91c2IvbWlzYy9mdGRpLWVsYW4uYwppbmRleCA5YjViM2IyLi45YTgyZjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMKQEAgLTYxLDkgKzYxLDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZGlzdHJ1c3RfZmlybXdhcmUsCiAJCSAidHJ1ZSB0byBkaXN0cnVzdCBmaXJtd2FyZSBwb3dlci9vdmVyY3VycmVudCBzZXR1cCIpOwogZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdTEzMl9wbGF0Zm9ybV9kcml2ZXI7Ci1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnN0YXR1c19xdWV1ZTsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY29tbWFuZF9xdWV1ZTsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcmVzcG9uZF9xdWV1ZTsKIC8qCiAgKiBmdGRpX21vZHVsZV9sb2NrIGV4aXN0cyB0byBwcm90ZWN0IGFjY2VzcyB0byBnbG9iYWwgdmFyaWFibGVzCiAgKgpAQCAtMjI4LDU2ICsyMjUsNTYgQEAKIAogc3RhdGljIHZvaWQgZnRkaV9zdGF0dXNfcmVxdWV1ZV93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgdW5zaWduZWQgaW50IGRlbHRhKQogewotCWlmICghcXVldWVfZGVsYXllZF93b3JrKHN0YXR1c19xdWV1ZSwgJmZ0ZGktPnN0YXR1c193b3JrLCBkZWx0YSkpCisJaWYgKCFzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZ0ZGktPnN0YXR1c193b3JrLCBkZWx0YSkpCiAJCWtyZWZfcHV0KCZmdGRpLT5rcmVmLCBmdGRpX2VsYW5fZGVsZXRlKTsKIH0KIAogc3RhdGljIHZvaWQgZnRkaV9zdGF0dXNfcXVldWVfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHVuc2lnbmVkIGludCBkZWx0YSkKIHsKLQlpZiAocXVldWVfZGVsYXllZF93b3JrKHN0YXR1c19xdWV1ZSwgJmZ0ZGktPnN0YXR1c193b3JrLCBkZWx0YSkpCisJaWYgKHNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZnRkaS0+c3RhdHVzX3dvcmssIGRlbHRhKSkKIAkJa3JlZl9nZXQoJmZ0ZGktPmtyZWYpOwogfQogCiBzdGF0aWMgdm9pZCBmdGRpX3N0YXR1c19jYW5jZWxfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCiB7Ci0JaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJmZ0ZGktPnN0YXR1c193b3JrKSkKKwlpZiAoY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZmdGRpLT5zdGF0dXNfd29yaykpCiAJCWtyZWZfcHV0KCZmdGRpLT5rcmVmLCBmdGRpX2VsYW5fZGVsZXRlKTsKIH0KIAogc3RhdGljIHZvaWQgZnRkaV9jb21tYW5kX3JlcXVldWVfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHVuc2lnbmVkIGludCBkZWx0YSkKIHsKLQlpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayhjb21tYW5kX3F1ZXVlLCAmZnRkaS0+Y29tbWFuZF93b3JrLCBkZWx0YSkpCisJaWYgKCFzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZ0ZGktPmNvbW1hbmRfd29yaywgZGVsdGEpKQogCQlrcmVmX3B1dCgmZnRkaS0+a3JlZiwgZnRkaV9lbGFuX2RlbGV0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfY29tbWFuZF9xdWV1ZV93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgdW5zaWduZWQgaW50IGRlbHRhKQogewotCWlmIChxdWV1ZV9kZWxheWVkX3dvcmsoY29tbWFuZF9xdWV1ZSwgJmZ0ZGktPmNvbW1hbmRfd29yaywgZGVsdGEpKQorCWlmIChzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZ0ZGktPmNvbW1hbmRfd29yaywgZGVsdGEpKQogCQlrcmVmX2dldCgmZnRkaS0+a3JlZik7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfY29tbWFuZF9jYW5jZWxfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCiB7Ci0JaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJmZ0ZGktPmNvbW1hbmRfd29yaykpCisJaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZnRkaS0+Y29tbWFuZF93b3JrKSkKIAkJa3JlZl9wdXQoJmZ0ZGktPmtyZWYsIGZ0ZGlfZWxhbl9kZWxldGUpOwogfQogCiBzdGF0aWMgdm9pZCBmdGRpX3Jlc3BvbnNlX3JlcXVldWVfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksCiAJCQkJICAgICAgIHVuc2lnbmVkIGludCBkZWx0YSkKIHsKLQlpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayhyZXNwb25kX3F1ZXVlLCAmZnRkaS0+cmVzcG9uZF93b3JrLCBkZWx0YSkpCisJaWYgKCFzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZ0ZGktPnJlc3BvbmRfd29yaywgZGVsdGEpKQogCQlrcmVmX3B1dCgmZnRkaS0+a3JlZiwgZnRkaV9lbGFuX2RlbGV0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfcmVzcG9uZF9xdWV1ZV93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgdW5zaWduZWQgaW50IGRlbHRhKQogewotCWlmIChxdWV1ZV9kZWxheWVkX3dvcmsocmVzcG9uZF9xdWV1ZSwgJmZ0ZGktPnJlc3BvbmRfd29yaywgZGVsdGEpKQorCWlmIChzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmZ0ZGktPnJlc3BvbmRfd29yaywgZGVsdGEpKQogCQlrcmVmX2dldCgmZnRkaS0+a3JlZik7CiB9CiAKIHN0YXRpYyB2b2lkIGZ0ZGlfcmVzcG9uc2VfY2FuY2VsX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpKQogewotCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZmdGRpLT5yZXNwb25kX3dvcmspKQorCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmZ0ZGktPnJlc3BvbmRfd29yaykpCiAJCWtyZWZfcHV0KCZmdGRpLT5rcmVmLCBmdGRpX2VsYW5fZGVsZXRlKTsKIH0KIApAQCAtNzg1LDExICs3ODIsOCBAQAogCQlyZXR1cm4gMDsKIAl0b3RhbF9zaXplID0gZnRkaV9lbGFuX3RvdGFsX2NvbW1hbmRfc2l6ZShmdGRpLCBjb21tYW5kX3NpemUpOwogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1cmIpIHsKLQkJZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiY291bGQgbm90IGdldCBhIHVyYiB0byB3cml0ZSAlZCBjb21tYW5kcyB0b3RhbGluZyAlZCBieXRlcyB0byB0aGUgVXh4eFxuIiwKLQkJCWNvbW1hbmRfc2l6ZSwgdG90YWxfc2l6ZSk7CisJaWYgKCF1cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAlidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoZnRkaS0+dWRldiwgdG90YWxfc2l6ZSwgR0ZQX0tFUk5FTCwKIAkJCQkgJnVyYi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIWJ1ZikgewpAQCAtMTk0OCwxMCArMTk0Miw4IEBACiAJaW50IEkgPSAyNTc7CiAJaW50IGkgPSAwOwogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1cmIpIHsKLQkJZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiY291bGQgbm90IGFsbG9jIGEgdXJiIGZvciBmbHVzaCBzZXF1ZW5jZVxuIik7CisJaWYgKCF1cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAlidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoZnRkaS0+dWRldiwgSSwgR0ZQX0tFUk5FTCwgJnVyYi0+dHJhbnNmZXJfZG1hKTsKIAlpZiAoIWJ1ZikgewogCQlkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGEgYnVmZmVyIGZvciBmbHVzaCBzZXF1ZW5jZVxuIik7CkBAIC0xOTg4LDEwICsxOTgwLDggQEAKIAlpbnQgSSA9IDQ7CiAJaW50IGkgPSAwOwogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF1cmIpIHsKLQkJZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiY291bGQgbm90IGdldCBhIHVyYiBmb3IgdGhlIHJlc2V0IHNlcXVlbmNlXG4iKTsKKwlpZiAoIXVyYikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCWJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudChmdGRpLT51ZGV2LCBJLCBHRlBfS0VSTkVMLCAmdXJiLT50cmFuc2Zlcl9kbWEpOwogCWlmICghYnVmKSB7CiAJCWRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgYSBidWZmZXIgZm9yIHRoZSByZXNldCBzZXF1ZW5jZVxuIik7CkBAIC0yNzQwLDcgKzI3MzAsNiBAQAogCQkJZnRkaS0+YnVsa19pbl9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKIAkJCWZ0ZGktPmJ1bGtfaW5fYnVmZmVyID0ga21hbGxvYyhidWZmZXJfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIWZ0ZGktPmJ1bGtfaW5fYnVmZmVyKSB7Ci0JCQkJZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIGJ1bGtfaW5fYnVmZmVyXG4iKTsKIAkJCQlyZXR2YWwgPSAtRU5PTUVNOwogCQkJCWdvdG8gZXJyb3I7CiAJCQl9CkBAIC0yODIzLDkgKzI4MTIsNiBAQAogCQkJZnRkaS0+aW5pdGlhbGl6ZWQgPSAwOwogCQkJZnRkaS0+cmVnaXN0ZXJlZCA9IDA7CiAJCX0KLQkJZmx1c2hfd29ya3F1ZXVlKHN0YXR1c19xdWV1ZSk7Ci0JCWZsdXNoX3dvcmtxdWV1ZShjb21tYW5kX3F1ZXVlKTsKLQkJZmx1c2hfd29ya3F1ZXVlKHJlc3BvbmRfcXVldWUpOwogCQlmdGRpLT5kaXNjb25uZWN0ZWQgKz0gMTsKIAkJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOwogCQlkZXZfaW5mbygmZnRkaS0+dWRldi0+ZGV2LCAiVVNCIEZUREkgVTEzMiBob3N0IGNvbnRyb2xsZXIgaW50ZXJmYWNlIG5vdyBkaXNjb25uZWN0ZWRcbiIpOwpAQCAtMjg0NSwzMSArMjgzMSwxMiBAQAogCXByX2luZm8oImRyaXZlciAlc1xuIiwgZnRkaV9lbGFuX2RyaXZlci5uYW1lKTsKIAltdXRleF9pbml0KCZmdGRpX21vZHVsZV9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmZnRkaV9zdGF0aWNfbGlzdCk7Ci0Jc3RhdHVzX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImZ0ZGktc3RhdHVzLWNvbnRyb2wiKTsKLQlpZiAoIXN0YXR1c19xdWV1ZSkKLQkJZ290byBlcnJfc3RhdHVzX3F1ZXVlOwotCWNvbW1hbmRfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiZnRkaS1jb21tYW5kLWVuZ2luZSIpOwotCWlmICghY29tbWFuZF9xdWV1ZSkKLQkJZ290byBlcnJfY29tbWFuZF9xdWV1ZTsKLQlyZXNwb25kX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImZ0ZGktcmVzcG9uZC1lbmdpbmUiKTsKLQlpZiAoIXJlc3BvbmRfcXVldWUpCi0JCWdvdG8gZXJyX3Jlc3BvbmRfcXVldWU7CiAJcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZmdGRpX2VsYW5fZHJpdmVyKTsKIAlpZiAocmVzdWx0KSB7Ci0JCWRlc3Ryb3lfd29ya3F1ZXVlKHN0YXR1c19xdWV1ZSk7Ci0JCWRlc3Ryb3lfd29ya3F1ZXVlKGNvbW1hbmRfcXVldWUpOwotCQlkZXN0cm95X3dvcmtxdWV1ZShyZXNwb25kX3F1ZXVlKTsKIAkJcHJfZXJyKCJ1c2JfcmVnaXN0ZXIgZmFpbGVkLiBFcnJvciBudW1iZXIgJWRcbiIsIHJlc3VsdCk7CiAJfQogCXJldHVybiByZXN1bHQ7CiAKLWVycl9yZXNwb25kX3F1ZXVlOgotCWRlc3Ryb3lfd29ya3F1ZXVlKGNvbW1hbmRfcXVldWUpOwotZXJyX2NvbW1hbmRfcXVldWU6Ci0JZGVzdHJveV93b3JrcXVldWUoc3RhdHVzX3F1ZXVlKTsKLWVycl9zdGF0dXNfcXVldWU6Ci0JcHJfZXJyKCIlcyBjb3VsZG4ndCBjcmVhdGUgd29ya3F1ZXVlXG4iLCBmdGRpX2VsYW5fZHJpdmVyLm5hbWUpOwotCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZnRkaV9lbGFuX2V4aXQodm9pZCkKQEAgLTI4ODIsMTUgKzI4NDksNyBAQAogCQlmdGRpX3N0YXR1c19jYW5jZWxfd29yayhmdGRpKTsKIAkJZnRkaV9jb21tYW5kX2NhbmNlbF93b3JrKGZ0ZGkpOwogCQlmdGRpX3Jlc3BvbnNlX2NhbmNlbF93b3JrKGZ0ZGkpOwotCX0gZmx1c2hfd29ya3F1ZXVlKHN0YXR1c19xdWV1ZSk7Ci0JZGVzdHJveV93b3JrcXVldWUoc3RhdHVzX3F1ZXVlKTsKLQlzdGF0dXNfcXVldWUgPSBOVUxMOwotCWZsdXNoX3dvcmtxdWV1ZShjb21tYW5kX3F1ZXVlKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShjb21tYW5kX3F1ZXVlKTsKLQljb21tYW5kX3F1ZXVlID0gTlVMTDsKLQlmbHVzaF93b3JrcXVldWUocmVzcG9uZF9xdWV1ZSk7Ci0JZGVzdHJveV93b3JrcXVldWUocmVzcG9uZF9xdWV1ZSk7Ci0JcmVzcG9uZF9xdWV1ZSA9IE5VTEw7CisJfQogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvaWRtb3VzZS5jIGIvZHJpdmVycy91c2IvbWlzYy9pZG1vdXNlLmMKaW5kZXggNTEwNTM5Ny4uMjk3NWU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9pZG1vdXNlLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9pZG1vdXNlLmMKQEAgLTM2Niw3ICszNjYsNiBAQAogCQkJa21hbGxvYyhJTUdTSVpFICsgZGV2LT5idWxrX2luX3NpemUsIEdGUF9LRVJORUwpOwogCiAJCWlmICghZGV2LT5idWxrX2luX2J1ZmZlcikgewotCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgaW5wdXQgYnVmZmVyLlxuIik7CiAJCQlpZG1vdXNlX2RlbGV0ZShkZXYpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvaW93YXJyaW9yLmMgYi9kcml2ZXJzL3VzYi9taXNjL2lvd2Fycmlvci5jCmluZGV4IDE5NTBlODcuLjA5NTc3OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvaW93YXJyaW9yLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9pb3dhcnJpb3IuYwpAQCAtMjc4LDcgKzI3OCw3IEBACiAJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJLyogdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkICovCi0JaWYgKGRldiA9PSBOVUxMIHx8ICFkZXYtPnByZXNlbnQpCisJaWYgKCFkZXYgfHwgIWRldi0+cHJlc2VudCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlkZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAibWlub3IgJWQsIGNvdW50ID0gJXpkXG4iLApAQCAtNDEzLDggKzQxMyw2IEBACiAJCWludF9vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFpbnRfb3V0X3VyYikgewogCQkJcmV0dmFsID0gLUVOT01FTTsKLQkJCWRldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsCi0JCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSB1cmJcbiIpOwogCQkJZ290byBlcnJvcl9ub191cmI7CiAJCX0KIAkJYnVmID0gdXNiX2FsbG9jX2NvaGVyZW50KGRldi0+dWRldiwgZGV2LT5yZXBvcnRfc2l6ZSwKQEAgLTQ4Miw5ICs0ODAsOCBAQAogCWludCBpb19yZXM7CQkvKiBjaGVja3MgZm9yIGJ5dGVzIHJlYWQvd3JpdHRlbiBhbmQgY29weV90by9mcm9tX3VzZXIgcmVzdWx0cyAqLwogCiAJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWlmIChkZXYgPT0gTlVMTCkgeworCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKLQl9CiAKIAlidWZmZXIgPSBremFsbG9jKGRldi0+cmVwb3J0X3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghYnVmZmVyKQpAQCAtNjU0LDkgKzY1MSw4IEBACiAJaW50IHJldHZhbCA9IDA7CiAKIAlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaWYgKGRldiA9PSBOVUxMKSB7CisJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOwotCX0KIAogCWRldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJtaW5vciAlZFxuIiwgZGV2LT5taW5vcik7CiAKQEAgLTc2NiwxMCArNzYyLDggQEAKIAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpb3dhcnJpb3IpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWRldikKIAkJcmV0dXJuIHJldHZhbDsKLQl9CiAKIAltdXRleF9pbml0KCZkZXYtPm11dGV4KTsKIApAQCAtODEyLDE1ICs4MDYsMTEgQEAKIAogCS8qIGNyZWF0ZSB0aGUgdXJiIGFuZCBidWZmZXIgZm9yIHJlYWRpbmcgKi8KIAlkZXYtPmludF9pbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRfaW5fdXJiKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X2luX3VyYlxuIik7CisJaWYgKCFkZXYtPmludF9pbl91cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50X2luX2J1ZmZlciA9IGttYWxsb2MoZGV2LT5yZXBvcnRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludF9pbl9idWZmZXIpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRfaW5fYnVmZmVyXG4iKTsKKwlpZiAoIWRldi0+aW50X2luX2J1ZmZlcikKIAkJZ290byBlcnJvcjsKLQl9CiAJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludF9pbl91cmIsIGRldi0+dWRldiwKIAkJCSB1c2JfcmN2aW50cGlwZShkZXYtPnVkZXYsCiAJCQkJCWRldi0+aW50X2luX2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKQEAgLTgzMSwxMCArODIxLDggQEAKIAlkZXYtPnJlYWRfcXVldWUgPQogCSAgICBrbWFsbG9jKCgoZGV2LT5yZXBvcnRfc2l6ZSArIDEpICogTUFYX0lOVEVSUlVQVF9CVUZGRVIpLAogCQkgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPnJlYWRfcXVldWUpIHsKLQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSByZWFkX3F1ZXVlXG4iKTsKKwlpZiAoIWRldi0+cmVhZF9xdWV1ZSkKIAkJZ290byBlcnJvcjsKLQl9CiAJLyogR2V0IHRoZSBzZXJpYWwtbnVtYmVyIG9mIHRoZSBjaGlwICovCiAJbWVtc2V0KGRldi0+Y2hpcF9zZXJpYWwsIDB4MDAsIHNpemVvZihkZXYtPmNoaXBfc2VyaWFsKSk7CiAJdXNiX3N0cmluZyh1ZGV2LCB1ZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIsIGRldi0+Y2hpcF9zZXJpYWwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKaW5kZXggY2NlMjJmZi4uOWNhNTk1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYwpAQCAtNjU4LDEwICs2NTgsOCBAQAogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWRldikKIAkJZ290byBleGl0OwotCX0KIAltdXRleF9pbml0KCZkZXYtPm11dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5yYnNsKTsKIAlkZXYtPmludGYgPSBpbnRmOwpAQCAtNjc0LDEwICs2NzIsOCBAQAogCSAgICAgKGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBVU0JfREVWSUNFX0lEX0xEX0NPTTNMQUIpKSAmJgogCSAgICAobGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpIDw9IDB4MTAzKSkgewogCQlidWZmZXIgPSBrbWFsbG9jKDI1NiwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgc3RyaW5nIGJ1ZmZlclxuIik7CisJCWlmICghYnVmZmVyKQogCQkJZ290byBlcnJvcjsKLQkJfQogCQkvKiB1c2Jfc3RyaW5nIG1ha2VzIFNFVFVQK1NUQUxMIHRvIGxlYXZlIGFsd2F5cyBDb250cm9sUmVhZExvb3AgKi8KIAkJdXNiX3N0cmluZyh1ZGV2LCAyNTUsIGJ1ZmZlciwgMjU2KTsKIAkJa2ZyZWUoYnVmZmVyKTsKQEAgLTcwNCwzMiArNzAwLDIyIEBACiAKIAlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplID0gdXNiX2VuZHBvaW50X21heHAoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQpOwogCWRldi0+cmluZ19idWZmZXIgPSBrbWFsbG9jKHJpbmdfYnVmZmVyX3NpemUqKHNpemVvZihzaXplX3QpK2Rldi0+aW50ZXJydXB0X2luX2VuZHBvaW50X3NpemUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+cmluZ19idWZmZXIpIHsKLQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgcmluZ19idWZmZXJcbiIpOworCWlmICghZGV2LT5yaW5nX2J1ZmZlcikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyID0ga21hbGxvYyhkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludF9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X2luX2J1ZmZlcikgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fYnVmZmVyXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX2J1ZmZlcikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfaW5fdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X2luX3VyYikgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fdXJiXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X2luX3VyYikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50X3NpemUgPSBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPyB1c2JfZW5kcG9pbnRfbWF4cChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQpIDoKIAkJCQkJCQkJCSB1ZGV2LT5kZXNjcmlwdG9yLmJNYXhQYWNrZXRTaXplMDsKIAlkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyID0ga21hbGxvYyh3cml0ZV9idWZmZXJfc2l6ZSpkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnRfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfYnVmZmVyXG4iKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idWZmZXIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWRldi0+aW50ZXJydXB0X291dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYikgewotCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X3VyYlxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9pbl9pbnRlcnZhbCA9IG1pbl9pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsID8gbWluX2ludGVycnVwdF9pbl9pbnRlcnZhbCA6IGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWw7CiAJaWYgKGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludCkKIAkJZGV2LT5pbnRlcnJ1cHRfb3V0X2ludGVydmFsID0gbWluX2ludGVycnVwdF9vdXRfaW50ZXJ2YWwgPiBkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPmJJbnRlcnZhbCA/IG1pbl9pbnRlcnJ1cHRfb3V0X2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iSW50ZXJ2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2xlZ291c2J0b3dlci5jIGIvZHJpdmVycy91c2IvbWlzYy9sZWdvdXNidG93ZXIuYwppbmRleCA3NzcxYmUzLi5jOGZiZTdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2xlZ291c2J0b3dlci5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMKQEAgLTgxNywxMCArODE3LDggQEAKIAogCWRldiA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgbGVnb191c2JfdG93ZXIpLCBHRlBfS0VSTkVMKTsKIAotCWlmIChkZXYgPT0gTlVMTCkgewotCQlkZXZfZXJyKGlkZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIWRldikKIAkJZ290byBleGl0OwotCX0KIAogCW11dGV4X2luaXQoJmRldi0+bG9jayk7CiAKQEAgLTg3MSw1MSArODY5LDIzIEBACiAJfQogCiAJZGV2LT5yZWFkX2J1ZmZlciA9IGttYWxsb2MgKHJlYWRfYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5yZWFkX2J1ZmZlcikgewotCQlkZXZfZXJyKGlkZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSByZWFkX2J1ZmZlclxuIik7CisJaWYgKCFkZXYtPnJlYWRfYnVmZmVyKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9pbl9idWZmZXIgPSBrbWFsbG9jICh1c2JfZW5kcG9pbnRfbWF4cChkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCksIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKSB7Ci0JCWRldl9lcnIoaWRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl9idWZmZXJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9pbl91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKSB7Ci0JCWRldl9lcnIoaWRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9pbl91cmJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyID0ga21hbGxvYyAod3JpdGVfYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlcikgewotCQlkZXZfZXJyKGlkZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlclxuIik7CisJaWYgKCFkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKQogCQlnb3RvIGVycm9yOwotCX0KIAlkZXYtPmludGVycnVwdF9vdXRfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRldi0+aW50ZXJydXB0X291dF91cmIpIHsKLQkJZGV2X2VycihpZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgaW50ZXJydXB0X291dF91cmJcbiIpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYikKIAkJZ290byBlcnJvcjsKLQl9CiAJZGV2LT5pbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPSBpbnRlcnJ1cHRfaW5faW50ZXJ2YWwgPyBpbnRlcnJ1cHRfaW5faW50ZXJ2YWwgOiBkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsOwogCWRldi0+aW50ZXJydXB0X291dF9pbnRlcnZhbCA9IGludGVycnVwdF9vdXRfaW50ZXJ2YWwgPyBpbnRlcnJ1cHRfb3V0X2ludGVydmFsIDogZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT5iSW50ZXJ2YWw7CiAKLQkvKiB3ZSBjYW4gcmVnaXN0ZXIgdGhlIGRldmljZSBub3csIGFzIGl0IGlzIHJlYWR5ICovCi0JdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBkZXYpOwotCi0JcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldiAoaW50ZXJmYWNlLCAmdG93ZXJfY2xhc3MpOwotCi0JaWYgKHJldHZhbCkgewotCQkvKiBzb21ldGhpbmcgcHJldmVudGVkIHVzIGZyb20gcmVnaXN0ZXJpbmcgdGhpcyBkcml2ZXIgKi8KLQkJZGV2X2VycihpZGV2LCAiTm90IGFibGUgdG8gZ2V0IGEgbWlub3IgZm9yIHRoaXMgZGV2aWNlLlxuIik7Ci0JCXVzYl9zZXRfaW50ZmRhdGEgKGludGVyZmFjZSwgTlVMTCk7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWRldi0+bWlub3IgPSBpbnRlcmZhY2UtPm1pbm9yOwotCi0JLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLwotCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIkxFR08gVVNCIFRvd2VyICMlZCBub3cgYXR0YWNoZWQgdG8gbWFqb3IgIgotCQkgIiVkIG1pbm9yICVkXG4iLCAoZGV2LT5taW5vciAtIExFR09fVVNCX1RPV0VSX01JTk9SX0JBU0UpLAotCQkgVVNCX01BSk9SLCBkZXYtPm1pbm9yKTsKLQogCS8qIGdldCB0aGUgZmlybXdhcmUgdmVyc2lvbiBhbmQgbG9nIGl0ICovCiAJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnICh1ZGV2LAogCQkJCSAgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLApAQCAtOTM2LDYgKzkwNiwyMyBAQAogCQkgZ2V0X3ZlcnNpb25fcmVwbHkubWlub3IsCiAJCSBsZTE2X3RvX2NwdShnZXRfdmVyc2lvbl9yZXBseS5idWlsZF9ubykpOwogCisJLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLworCXVzYl9zZXRfaW50ZmRhdGEgKGludGVyZmFjZSwgZGV2KTsKKworCXJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYgKGludGVyZmFjZSwgJnRvd2VyX2NsYXNzKTsKKworCWlmIChyZXR2YWwpIHsKKwkJLyogc29tZXRoaW5nIHByZXZlbnRlZCB1cyBmcm9tIHJlZ2lzdGVyaW5nIHRoaXMgZHJpdmVyICovCisJCWRldl9lcnIoaWRldiwgIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciB0aGlzIGRldmljZS5cbiIpOworCQl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIE5VTEwpOworCQlnb3RvIGVycm9yOworCX0KKwlkZXYtPm1pbm9yID0gaW50ZXJmYWNlLT5taW5vcjsKKworCS8qIGxldCB0aGUgdXNlciBrbm93IHdoYXQgbm9kZSB0aGlzIGRldmljZSBpcyBub3cgYXR0YWNoZWQgdG8gKi8KKwlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJMRUdPIFVTQiBUb3dlciAjJWQgbm93IGF0dGFjaGVkIHRvIG1ham9yICIKKwkJICIlZCBtaW5vciAlZFxuIiwgKGRldi0+bWlub3IgLSBMRUdPX1VTQl9UT1dFUl9NSU5PUl9CQVNFKSwKKwkJIFVTQl9NQUpPUiwgZGV2LT5taW5vcik7CiAKIGV4aXQ6CiAJcmV0dXJuIHJldHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvbHZzdGVzdC5jIGIvZHJpdmVycy91c2IvbWlzYy9sdnN0ZXN0LmMKaW5kZXggODZiNGU0Yi4uNzcxNzY1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9sdnN0ZXN0LmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9sdnN0ZXN0LmMKQEAgLTM0LDggKzM0LDYgQEAKIAlzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yIGRlc2NyaXB0b3I7CiAJLyogdXJiIGZvciBwb2xsaW5nIGludGVycnVwdCBwaXBlICovCiAJc3RydWN0IHVyYiAqdXJiOwotCS8qIExWUyBSSCB3b3JrIHF1ZXVlICovCi0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnJoX3F1ZXVlOwogCS8qIExWSCBSSCB3b3JrICovCiAJc3RydWN0IHdvcmtfc3RydWN0CXJoX3dvcms7CiAJLyogUkggcG9ydCBzdGF0dXMgKi8KQEAgLTI0NywxMCArMjQ1LDggQEAKIAlpbnQgcmV0OwogCiAJZGVzY3JpcHRvciA9IGttYWxsb2Moc2l6ZW9mKCpkZXNjcmlwdG9yKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXNjcmlwdG9yKSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGRlc2NyaXB0b3IgbWVtb3J5XG4iKTsKKwlpZiAoIWRlc2NyaXB0b3IpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXVkZXYgPSBjcmVhdGVfbHZzX2RldmljZShpbnRmKTsKIAlpZiAoIXVkZXYpIHsKQEAgLTM1NSw3ICszNTEsNyBAQAogewogCXN0cnVjdCBsdnNfcmggKmx2cyA9IHVyYi0+Y29udGV4dDsKIAotCXF1ZXVlX3dvcmsobHZzLT5yaF9xdWV1ZSwgJmx2cy0+cmhfd29yayk7CisJc2NoZWR1bGVfd29yaygmbHZzLT5yaF93b3JrKTsKIH0KIAogc3RhdGljIGludCBsdnNfcmhfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCkBAIC0zOTcsMjQgKzM5MywxNSBAQAogCiAJLyogc3VibWl0IHVyYiB0byBwb2xsIGludGVycnVwdCBlbmRwb2ludCAqLwogCWx2cy0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWx2cy0+dXJiKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgImNvdWxkbid0IGFsbG9jYXRlIGx2cyB1cmJcbiIpOworCWlmICghbHZzLT51cmIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWx2cy0+cmhfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibHZzX3JoX3F1ZXVlIik7Ci0JaWYgKCFsdnMtPnJoX3F1ZXVlKSB7Ci0JCWRldl9lcnIoJmludGYtPmRldiwgImNvdWxkbid0IGNyZWF0ZSB3b3JrcXVldWVcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZyZWVfdXJiOwotCX0KIAogCUlOSVRfV09SSygmbHZzLT5yaF93b3JrLCBsdnNfcmhfd29yayk7CiAKIAlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmbHZzX2F0dHJfZ3JvdXApOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmludGYtPmRldiwgIkZhaWxlZCB0byBjcmVhdGUgc3lzZnMgbm9kZSAlZFxuIiwgcmV0KTsKLQkJZ290byBkZXN0cm95X3F1ZXVlOworCQlnb3RvIGZyZWVfdXJiOwogCX0KIAogCXBpcGUgPSB1c2JfcmN2aW50cGlwZShoZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CkBAIC00MzIsOCArNDE5LDYgQEAKIAogc3lzZnNfcmVtb3ZlOgogCXN5c2ZzX3JlbW92ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZsdnNfYXR0cl9ncm91cCk7Ci1kZXN0cm95X3F1ZXVlOgotCWRlc3Ryb3lfd29ya3F1ZXVlKGx2cy0+cmhfcXVldWUpOwogZnJlZV91cmI6CiAJdXNiX2ZyZWVfdXJiKGx2cy0+dXJiKTsKIAlyZXR1cm4gcmV0OwpAQCAtNDQ0LDcgKzQyOSw3IEBACiAJc3RydWN0IGx2c19yaCAqbHZzID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAogCXN5c2ZzX3JlbW92ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZsdnNfYXR0cl9ncm91cCk7Ci0JZGVzdHJveV93b3JrcXVldWUobHZzLT5yaF9xdWV1ZSk7CisJZmx1c2hfd29yaygmbHZzLT5yaF93b3JrKTsKIAl1c2JfZnJlZV91cmIobHZzLT51cmIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3Npc3VzYnZnYS9zaXN1c2IuYyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCmluZGV4IDAyYWJmY2QuLjA1YmQzOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jCkBAIC0zMDg0LDcgKzMwODQsNiBAQAogCS8qIEFsbG9jYXRlIFVSQnMgKi8KIAlzaXN1c2ItPnNpc3VyYmluID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNpc3VzYi0+c2lzdXJiaW4pIHsKLQkJZGV2X2Vycigmc2lzdXNiLT5zaXN1c2JfZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgVVJCc1xuIik7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfMzsKIAl9CkBAIC0zMDkzLDggKzMwOTIsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBzaXN1c2ItPm51bW9idWZzOyBpKyspIHsKIAkJc2lzdXNiLT5zaXN1cmJvdXRbaV0gPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwogCQlpZiAoIXNpc3VzYi0+c2lzdXJib3V0W2ldKSB7Ci0JCQlkZXZfZXJyKCZzaXN1c2ItPnNpc3VzYl9kZXYtPmRldiwKLQkJCQkJIkZhaWxlZCB0byBhbGxvY2F0ZSBVUkJzXG4iKTsKIAkJCXJldHZhbCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycm9yXzQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdHJhbmNldmlicmF0b3IuYyBiL2RyaXZlcnMvdXNiL21pc2MvdHJhbmNldmlicmF0b3IuYwppbmRleCA0MTQ1MzE0Li45Nzk1NDU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3RyYW5jZXZpYnJhdG9yLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy90cmFuY2V2aWJyYXRvci5jCkBAIC05NSw4ICs5NSw3IEBACiAJaW50IHJldHZhbDsKIAogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0cmFuY2V2aWJyYXRvciksIEdGUF9LRVJORUwpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCWlmICghZGV2KSB7CiAJCXJldHZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2I0NjA0LmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYjQ2MDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWYzN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2I0NjA0LmMKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBEcml2ZXIgZm9yIFNNU0MgVVNCNDYwNCBVU0IgSFNJQyA0LXBvcnQgMi4wIGh1YiBjb250cm9sbGVyIGRyaXZlcgorICogQmFzZWQgb24gdXNiMzUwMyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMyBEb25namluIEtpbSAodG9iZXR0ZXJAZ21haWwuY29tKQorICogQ29weXJpZ2h0IChjKSAyMDE2IExpbmFybyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CisKK2VudW0gdXNiNDYwNF9tb2RlIHsKKwlVU0I0NjA0X01PREVfVU5LTk9XTiwKKwlVU0I0NjA0X01PREVfSFVCLAorCVVTQjQ2MDRfTU9ERV9TVEFOREJZLAorfTsKKworc3RydWN0IHVzYjQ2MDQgeworCWVudW0gdXNiNDYwNF9tb2RlCW1vZGU7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3QgZ3Bpb19kZXNjCSpncGlvX3Jlc2V0OworfTsKKworc3RhdGljIHZvaWQgdXNiNDYwNF9yZXNldChzdHJ1Y3QgdXNiNDYwNCAqaHViLCBpbnQgc3RhdGUpCit7CisJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKGh1Yi0+Z3Bpb19yZXNldCwgc3RhdGUpOworCisJLyogV2FpdCBmb3IgaTJjIGxvZ2ljIHRvIGNvbWUgdXAgKi8KKwlpZiAoc3RhdGUpCisJCW1zbGVlcCgyNTApOworfQorCitzdGF0aWMgaW50IHVzYjQ2MDRfY29ubmVjdChzdHJ1Y3QgdXNiNDYwNCAqaHViKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGh1Yi0+ZGV2OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJaW50IGVycjsKKwl1OCBjb25uZWN0X2NtZFtdID0geyAweGFhLCAweDU1LCAweDAwIH07CisKKwl1c2I0NjA0X3Jlc2V0KGh1YiwgMSk7CisKKwllcnIgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBjb25uZWN0X2NtZCwgQVJSQVlfU0laRShjb25uZWN0X2NtZCkpOworCWlmIChlcnIgPCAwKSB7CisJCXVzYjQ2MDRfcmVzZXQoaHViLCAwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlodWItPm1vZGUgPSBVU0I0NjA0X01PREVfSFVCOworCWRldl9kYmcoZGV2LCAic3dpdGNoZWQgdG8gSFVCIG1vZGVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiNDYwNF9zd2l0Y2hfbW9kZShzdHJ1Y3QgdXNiNDYwNCAqaHViLCBlbnVtIHVzYjQ2MDRfbW9kZSBtb2RlKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGh1Yi0+ZGV2OworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBVU0I0NjA0X01PREVfSFVCOgorCQllcnIgPSB1c2I0NjA0X2Nvbm5lY3QoaHViKTsKKwkJYnJlYWs7CisKKwljYXNlIFVTQjQ2MDRfTU9ERV9TVEFOREJZOgorCQl1c2I0NjA0X3Jlc2V0KGh1YiwgMCk7CisJCWRldl9kYmcoZGV2LCAic3dpdGNoZWQgdG8gU1RBTkRCWSBtb2RlXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgInVua25vd24gbW9kZSBpcyByZXF1ZXN0ZWRcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVzYjQ2MDRfcHJvYmUoc3RydWN0IHVzYjQ2MDQgKmh1YikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBodWItPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW87CisJdTMyIG1vZGUgPSBVU0I0NjA0X01PREVfSFVCOworCisJZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X29wdGlvbmFsKGRldiwgInJlc2V0IiwgR1BJT0RfT1VUX0xPVyk7CisJaWYgKElTX0VSUihncGlvKSkKKwkJcmV0dXJuIFBUUl9FUlIoZ3Bpbyk7CisJaHViLT5ncGlvX3Jlc2V0ID0gZ3BpbzsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImluaXRpYWwtbW9kZSIsICZodWItPm1vZGUpKQorCQlodWItPm1vZGUgPSBtb2RlOworCisJcmV0dXJuIHVzYjQ2MDRfc3dpdGNoX21vZGUoaHViLCBodWItPm1vZGUpOworfQorCitzdGF0aWMgaW50IHVzYjQ2MDRfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiNDYwNCAqaHViOworCisJaHViID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKCpodWIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWh1YikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBodWIpOworCWh1Yi0+ZGV2ID0gJmkyYy0+ZGV2OworCisJcmV0dXJuIHVzYjQ2MDRfcHJvYmUoaHViKTsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCB1c2I0NjA0X2kyY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB1c2I0NjA0ICpodWIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXVzYjQ2MDRfc3dpdGNoX21vZGUoaHViLCBVU0I0NjA0X01PREVfU1RBTkRCWSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2I0NjA0X2kyY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHVzYjQ2MDQgKmh1YiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJdXNiNDYwNF9zd2l0Y2hfbW9kZShodWIsIGh1Yi0+bW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFModXNiNDYwNF9pMmNfcG1fb3BzLCB1c2I0NjA0X2kyY19zdXNwZW5kLAorCQl1c2I0NjA0X2kyY19yZXN1bWUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdXNiNDYwNF9pZFtdID0geworCXsgInVzYjQ2MDQiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHVzYjQ2MDRfaWQpOworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB1c2I0NjA0X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzbXNjLHVzYjQ2MDQiIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB1c2I0NjA0X29mX21hdGNoKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdXNiNDYwNF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInVzYjQ2MDQiLAorCQkucG0gPSAmdXNiNDYwNF9pMmNfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIodXNiNDYwNF9vZl9tYXRjaCksCisJfSwKKwkucHJvYmUJCT0gdXNiNDYwNF9pMmNfcHJvYmUsCisJLmlkX3RhYmxlCT0gdXNiNDYwNF9pZCwKK307Cittb2R1bGVfaTJjX2RyaXZlcih1c2I0NjA0X2kyY19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlVTQjQ2MDQgVVNCIEhVQiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYmxjZC5jCmluZGV4IDExODQzOTAuLjlmNDg0MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2JsY2QuYwpAQCAtMzIxLDEwICszMjEsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCWlmICghZGV2KQogCQlnb3RvIGVycm9yOwotCX0KIAlrcmVmX2luaXQoJmRldi0+a3JlZik7CiAJc2VtYV9pbml0KCZkZXYtPmxpbWl0X3NlbSwgVVNCX0xDRF9DT05DVVJSRU5UX1dSSVRFUyk7CiAJaW5pdF91c2JfYW5jaG9yKCZkZXYtPnN1Ym1pdHRlZCk7CkBAIC0zNTEsMTEgKzM0OSw4IEBACiAJCQlkZXYtPmJ1bGtfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOwogCQkJZGV2LT5idWxrX2luX2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCQkJZGV2LT5idWxrX2luX2J1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFkZXYtPmJ1bGtfaW5fYnVmZmVyKSB7Ci0JCQkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsCi0JCQkJCSJDb3VsZCBub3QgYWxsb2NhdGUgYnVsa19pbl9idWZmZXJcbiIpOworCQkJaWYgKCFkZXYtPmJ1bGtfaW5fYnVmZmVyKQogCQkJCWdvdG8gZXJyb3I7Ci0JCQl9CiAJCX0KIAogCQlpZiAoIWRldi0+YnVsa19vdXRfZW5kcG9pbnRBZGRyICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzYnNldnNlZy5jIGIvZHJpdmVycy91c2IvbWlzYy91c2JzZXZzZWcuYwppbmRleCAxZmU2YjczLi5hMGJhNTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzYnNldnNlZy5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNic2V2c2VnLmMKQEAgLTEyOCwxMCArMTI4LDggQEAKIAkJcmV0dXJuOwogCiAJYnVmZmVyID0ga3phbGxvYyhNQVhMRU4sIG1mKTsKLQlpZiAoIWJ1ZmZlcikgewotCQlkZXZfZXJyKCZteWRldi0+dWRldi0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybjsKLQl9CiAKIAkvKiBUaGUgZGV2aWNlIGlzIHJpZ2h0IHRvIGxlZnQsIHdoZXJlIGFzIHlvdSB3cml0ZSBsZWZ0IHRvIHJpZ2h0ICovCiAJZm9yIChpID0gMDsgaSA8IG15ZGV2LT50ZXh0bGVuZ3RoOyBpKyspCkBAIC0zNDYsMTAgKzM0NCw4IEBACiAJaW50IHJjID0gLUVOT01FTTsKIAogCW15ZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9zZXZzZWdkZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAobXlkZXYgPT0gTlVMTCkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIk91dCBvZiBtZW1vcnlcbiIpOworCWlmICghbXlkZXYpCiAJCWdvdG8gZXJyb3JfbWVtOwotCX0KIAogCW15ZGV2LT51ZGV2ID0gdXNiX2dldF9kZXYodWRldik7CiAJbXlkZXYtPmludGYgPSBpbnRlcmZhY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzczcyMC5jIGIvZHJpdmVycy91c2IvbWlzYy91c3M3MjAuYwppbmRleCBiYmQwMjljLi4zNTZkMzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzczcyMC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNzNzIwLmMKQEAgLTE1MCwxMCArMTUwLDggQEAKIAlpZiAoIXVzYmRldikKIAkJcmV0dXJuIE5VTEw7CiAJcnEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNzNzIwX2FzeW5jX3JlcXVlc3QpLCBtZW1fZmxhZ3MpOwotCWlmICghcnEpIHsKLQkJZGV2X2VycigmdXNiZGV2LT5kZXYsICJzdWJtaXRfYXN5bmNfcmVxdWVzdCBvdXQgb2YgbWVtb3J5XG4iKTsKKwlpZiAoIXJxKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAJa3JlZl9pbml0KCZycS0+cmVmX2NvdW50KTsKIAlJTklUX0xJU1RfSEVBRCgmcnEtPmFzeW5jbGlzdCk7CiAJaW5pdF9jb21wbGV0aW9uKCZycS0+Y29tcGwpOwpAQCAtMTYyLDcgKzE2MCw2IEBACiAJcnEtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgbWVtX2ZsYWdzKTsKIAlpZiAoIXJxLT51cmIpIHsKIAkJa3JlZl9wdXQoJnJxLT5yZWZfY291bnQsIGRlc3Ryb3lfYXN5bmMpOwotCQlkZXZfZXJyKCZ1c2JkZXYtPmRldiwgInN1Ym1pdF9hc3luY19yZXF1ZXN0IG91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJcnEtPmRyID0ga21hbGxvYyhzaXplb2YoKnJxLT5kciksIG1lbV9mbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3l1cmV4LmMgYi9kcml2ZXJzL3VzYi9taXNjL3l1cmV4LmMKaW5kZXggMzQzZmE2Zi4uNTRlNTNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy95dXJleC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MveXVyZXguYwpAQCAtMjAwLDEwICsyMDAsOCBAQAogCiAJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBvdXIgZGV2aWNlIHN0YXRlIGFuZCBpbml0aWFsaXplIGl0ICovCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmICghZGV2KSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7CisJaWYgKCFkZXYpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWtyZWZfaW5pdCgmZGV2LT5rcmVmKTsKIAltdXRleF9pbml0KCZkZXYtPmlvX211dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5sb2NrKTsKQEAgLTIzMSwxNyArMjI5LDEzIEBACiAKIAkvKiBhbGxvY2F0ZSBjb250cm9sIFVSQiAqLwogCWRldi0+Y250bF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCWlmICghZGV2LT5jbnRsX3VyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBjb250cm9sIFVSQlxuIik7CisJaWYgKCFkZXYtPmNudGxfdXJiKQogCQlnb3RvIGVycm9yOwotCX0KIAogCS8qIGFsbG9jYXRlIGJ1ZmZlciBmb3IgY29udHJvbCByZXEgKi8KIAlkZXYtPmNudGxfcmVxID0ga21hbGxvYyhZVVJFWF9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPmNudGxfcmVxKSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIGNudGxfcmVxXG4iKTsKKwlpZiAoIWRldi0+Y250bF9yZXEpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJLyogYWxsb2NhdGUgYnVmZmVyIGZvciBjb250cm9sIG1zZyAqLwogCWRldi0+Y250bF9idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LCBZVVJFWF9CVUZfU0laRSwKQEAgLTI2OSwxMCArMjYzLDggQEAKIAogCS8qIGFsbG9jYXRlIGludGVycnVwdCBVUkIgKi8KIAlkZXYtPnVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXYtPnVyYikgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBVUkJcbiIpOworCWlmICghZGV2LT51cmIpCiAJCWdvdG8gZXJyb3I7Ci0JfQogCiAJLyogYWxsb2NhdGUgYnVmZmVyIGZvciBpbnRlcnJ1cHQgaW4gKi8KIAlkZXYtPmludF9idWZmZXIgPSB1c2JfYWxsb2NfY29oZXJlbnQoZGV2LT51ZGV2LCBZVVJFWF9CVUZfU0laRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZwppbmRleCA4ODY1MjZiLi43MmEyYTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCkBAIC04MiwxMiArODIsMTIgQEAKIAl0cmlzdGF0ZSAiREE4eHgvT01BUC1MMXgiCiAJZGVwZW5kcyBvbiBBUkNIX0RBVklOQ0lfREE4WFgKIAlkZXBlbmRzIG9uIE5PUF9VU0JfWENFSVYKLQlkZXBlbmRzIG9uIEJST0tFTgorCXNlbGVjdCBQSFlfREE4WFhfVVNCCiAKIGNvbmZpZyBVU0JfTVVTQl9UVVNCNjAxMAogCXRyaXN0YXRlICJUVVNCNjAxMCIKIAlkZXBlbmRzIG9uIEhBU19JT01FTQotCWRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiAoQVJDSF9PTUFQMlBMVVMgfHwgQ09NUElMRV9URVNUKSAmJiAhQkxBQ0tGSU4KIAlkZXBlbmRzIG9uIE5PUF9VU0JfWENFSVYgPSBVU0JfTVVTQl9IRFJDICMgYm90aCBidWlsdC1pbiBvciBib3RoIG1vZHVsZXMKIAogY29uZmlnIFVTQl9NVVNCX09NQVAyUExVUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9hbTM1eC5jIGIvZHJpdmVycy91c2IvbXVzYi9hbTM1eC5jCmluZGV4IGM0MWZlNTguLjUwY2E4MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvYW0zNXguYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL2FtMzV4LmMKQEAgLTQ3NCwxMCArNDc0LDggQEAKIAlpbnQJCQkJcmV0ID0gLUVOT01FTTsKIAogCWdsdWUgPSBremFsbG9jKHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOwotCWlmICghZ2x1ZSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZ2x1ZSBjb250ZXh0XG4iKTsKKwlpZiAoIWdsdWUpCiAJCWdvdG8gZXJyMDsKLQl9CiAKIAlwaHlfY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiZmNrIik7CiAJaWYgKElTX0VSUihwaHlfY2xrKSkgewpAQCAtNTEyLDggKzUxMCwxMCBAQAogCXBkYXRhLT5wbGF0Zm9ybV9vcHMJCT0gJmFtMzV4X29wczsKIAogCWdsdWUtPnBoeSA9IHVzYl9waHlfZ2VuZXJpY19yZWdpc3RlcigpOwotCWlmIChJU19FUlIoZ2x1ZS0+cGh5KSkKKwlpZiAoSVNfRVJSKGdsdWUtPnBoeSkpIHsKKwkJcmV0ID0gUFRSX0VSUihnbHVlLT5waHkpOwogCQlnb3RvIGVycjc7CisJfQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGdsdWUpOwogCiAJcGluZm8gPSBhbTM1eF9kZXZfaW5mbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvZGE4eHguYyBiL2RyaXZlcnMvdXNiL211c2IvZGE4eHguYwppbmRleCBiMDNkM2I4Li4yMTBiN2U0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL2RhOHh4LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9kYTh4eC5jCkBAIC0zMCwxMyArMzAsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi91c2JfcGh5X2dlbmVyaWMuaD4KIAotI2luY2x1ZGUgPG1hY2gvZGE4eHguaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3VzYi1kYXZpbmNpLmg+Ci0KICNpbmNsdWRlICJtdXNiX2NvcmUuaCIKIAogLyoKQEAgLTgwLDYxICs3OCwxNSBAQAogCiAjZGVmaW5lIERBOFhYX01FTlRPUl9DT1JFX09GRlNFVCAweDQwMAogCi0jZGVmaW5lIENGR0NISVAyCUlPX0FERFJFU1MoREE4WFhfU1lTQ0ZHMF9CQVNFICsgREE4WFhfQ0ZHQ0hJUDJfUkVHKQotCiBzdHJ1Y3QgZGE4eHhfZ2x1ZSB7CiAJc3RydWN0IGRldmljZQkJKmRldjsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSptdXNiOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKnBoeTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSp1c2JfcGh5OwogCXN0cnVjdCBjbGsJCSpjbGs7CisJc3RydWN0IHBoeQkJKnBoeTsKIH07CiAKIC8qCi0gKiBSRVZJU0lUIChQTSk6IHdlIHNob3VsZCBiZSBhYmxlIHRvIGtlZXAgdGhlIFBIWSBpbiBsb3cgcG93ZXIgbW9kZSBtb3N0Ci0gKiBvZiB0aGUgdGltZSAoMjQgTUh6IG9zY2lsbGF0b3IgYW5kIFBMTCBvZmYsIGV0Yy4pIGJ5IHNldHRpbmcgUE9XRVIuRDAKLSAqIGFuZCwgd2hlbiBpbiBob3N0IG1vZGUsIGF1dG9zdXNwZW5kaW5nIGlkbGUgcm9vdCBwb3J0cy4uLiBQSFlfUExMT04KLSAqIChvdmVycmlkaW5nIFNVU1BFTkRNPykgdGhlbiBsaWtlbHkgbmVlZHMgdG8gc3RheSBvZmYuCi0gKi8KLQotc3RhdGljIGlubGluZSB2b2lkIHBoeV9vbih2b2lkKQotewotCXUzMiBjZmdjaGlwMiA9IF9fcmF3X3JlYWRsKENGR0NISVAyKTsKLQotCS8qCi0JICogU3RhcnQgdGhlIG9uLWNoaXAgUEhZIGFuZCBpdHMgUExMLgotCSAqLwotCWNmZ2NoaXAyICY9IH4oQ0ZHQ0hJUDJfUkVTRVQgfCBDRkdDSElQMl9QSFlQV1JETiB8IENGR0NISVAyX09UR1BXUkROKTsKLQljZmdjaGlwMiB8PSBDRkdDSElQMl9QSFlfUExMT047Ci0JX19yYXdfd3JpdGVsKGNmZ2NoaXAyLCBDRkdDSElQMik7Ci0KLQlwcl9pbmZvKCJXYWl0aW5nIGZvciBVU0IgUEhZIGNsb2NrIGdvb2QuLi5cbiIpOwotCXdoaWxlICghKF9fcmF3X3JlYWRsKENGR0NISVAyKSAmIENGR0NISVAyX1BIWUNMS0dEKSkKLQkJY3B1X3JlbGF4KCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwaHlfb2ZmKHZvaWQpCi17Ci0JdTMyIGNmZ2NoaXAyID0gX19yYXdfcmVhZGwoQ0ZHQ0hJUDIpOwotCi0JLyoKLQkgKiBFbnN1cmUgdGhhdCBVU0IgMS4xIHJlZmVyZW5jZSBjbG9jayBpcyBub3QgYmVpbmcgc291cmNlZCBmcm9tCi0JICogVVNCIDIuMCBQSFkuICBPdGhlcndpc2UgZG8gbm90IHBvd2VyIGRvd24gdGhlIFBIWS4KLQkgKi8KLQlpZiAoIShjZmdjaGlwMiAmIENGR0NISVAyX1VTQjFQSFlDTEtNVVgpICYmCi0JICAgICAoY2ZnY2hpcDIgJiBDRkdDSElQMl9VU0IxU1VTUEVORE0pKSB7Ci0JCXByX3dhcm5pbmcoIlVTQiAxLjEgY2xvY2tlZCBmcm9tIFVTQiAyLjAgUEhZIC0tICIKLQkJCSAgICJjYW4ndCBwb3dlciBpdCBkb3duXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogUG93ZXIgZG93biB0aGUgb24tY2hpcCBQSFkuCi0JICovCi0JY2ZnY2hpcDIgfD0gQ0ZHQ0hJUDJfUEhZUFdSRE4gfCBDRkdDSElQMl9PVEdQV1JETjsKLQlfX3Jhd193cml0ZWwoY2ZnY2hpcDIsIENGR0NISVAyKTsKLX0KLQotLyoKICAqIEJlY2F1c2Ugd2UgZG9uJ3Qgc2V0IENUUkwuVUlOVCwgaXQncyAiaW1wb3J0YW50IiB0bzoKICAqCS0gbm90IHJlYWQvd3JpdGUgSU5UUlVTQi9JTlRSVVNCRSAoZXhjZXB0IGR1cmluZwogICoJICBpbml0aWFsIHNldHVwLCBhcyBhIHdvcmthcm91bmQpOwpAQCAtMzg1LDI5ICszMzcsMjkgQEAKIAogc3RhdGljIGludCBkYTh4eF9tdXNiX3NldF9tb2RlKHN0cnVjdCBtdXNiICptdXNiLCB1OCBtdXNiX21vZGUpCiB7Ci0JdTMyIGNmZ2NoaXAyID0gX19yYXdfcmVhZGwoQ0ZHQ0hJUDIpOworCXN0cnVjdCBkYTh4eF9nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKG11c2ItPmNvbnRyb2xsZXItPnBhcmVudCk7CisJZW51bSBwaHlfbW9kZSBwaHlfbW9kZTsKIAotCWNmZ2NoaXAyICY9IH5DRkdDSElQMl9PVEdNT0RFOwogCXN3aXRjaCAobXVzYl9tb2RlKSB7CiAJY2FzZSBNVVNCX0hPU1Q6CQkvKiBGb3JjZSBWQlVTIHZhbGlkLCBJRCA9IDAgKi8KLQkJY2ZnY2hpcDIgfD0gQ0ZHQ0hJUDJfRk9SQ0VfSE9TVDsKKwkJcGh5X21vZGUgPSBQSFlfTU9ERV9VU0JfSE9TVDsKIAkJYnJlYWs7CiAJY2FzZSBNVVNCX1BFUklQSEVSQUw6CS8qIEZvcmNlIFZCVVMgdmFsaWQsIElEID0gMSAqLwotCQljZmdjaGlwMiB8PSBDRkdDSElQMl9GT1JDRV9ERVZJQ0U7CisJCXBoeV9tb2RlID0gUEhZX01PREVfVVNCX0RFVklDRTsKIAkJYnJlYWs7CiAJY2FzZSBNVVNCX09URzoJCS8qIERvbid0IG92ZXJyaWRlIHRoZSBWQlVTL0lEIGNvbXBhcmF0b3JzICovCi0JCWNmZ2NoaXAyIHw9IENGR0NISVAyX05PX09WRVJSSURFOworCQlwaHlfbW9kZSA9IFBIWV9NT0RFX1VTQl9PVEc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIlRyeWluZyB0byBzZXQgdW5zdXBwb3J0ZWQgbW9kZSAldVxuIiwgbXVzYl9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JX19yYXdfd3JpdGVsKGNmZ2NoaXAyLCBDRkdDSElQMik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHBoeV9zZXRfbW9kZShnbHVlLT5waHksIHBoeV9tb2RlKTsKIH0KIAogc3RhdGljIGludCBkYTh4eF9tdXNiX2luaXQoc3RydWN0IG11c2IgKm11c2IpCiB7CisJc3RydWN0IGRhOHh4X2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEobXVzYi0+Y29udHJvbGxlci0+cGFyZW50KTsKIAl2b2lkIF9faW9tZW0gKnJlZ19iYXNlID0gbXVzYi0+Y3RybF9iYXNlOwogCXUzMiByZXY7CiAJaW50IHJldCA9IC1FTk9ERVY7CkBAIC00MjUsMzIgKzM3Nyw1NiBAQAogCQlnb3RvIGZhaWw7CiAJfQogCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGdsdWUtPmNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdsdWUtPmRldiwgImZhaWxlZCB0byBlbmFibGUgY2xvY2tcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCiAJc2V0dXBfdGltZXIoJm90Z193b3JrYXJvdW5kLCBvdGdfdGltZXIsICh1bnNpZ25lZCBsb25nKW11c2IpOwogCiAJLyogUmVzZXQgdGhlIGNvbnRyb2xsZXIgKi8KIAltdXNiX3dyaXRlbChyZWdfYmFzZSwgREE4WFhfVVNCX0NUUkxfUkVHLCBEQThYWF9TT0ZUX1JFU0VUX01BU0spOwogCiAJLyogU3RhcnQgdGhlIG9uLWNoaXAgUEhZIGFuZCBpdHMgUExMLiAqLwotCXBoeV9vbigpOworCXJldCA9IHBoeV9pbml0KGdsdWUtPnBoeSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdsdWUtPmRldiwgIkZhaWxlZCB0byBpbml0IHBoeS5cbiIpOworCQlnb3RvIGVycl9waHlfaW5pdDsKKwl9CisKKwlyZXQgPSBwaHlfcG93ZXJfb24oZ2x1ZS0+cGh5KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiRmFpbGVkIHRvIHBvd2VyIG9uIHBoeS5cbiIpOworCQlnb3RvIGVycl9waHlfcG93ZXJfb247CisJfQogCiAJbXNsZWVwKDUpOwogCiAJLyogTk9URTogSVJRcyBhcmUgaW4gbWl4ZWQgbW9kZSwgbm90IGJ5cGFzcyB0byBwdXJlIE1VU0IgKi8KLQlwcl9kZWJ1ZygiREE4eHggT1RHIHJldmlzaW9uICUwOHgsIFBIWSAlMDN4LCBjb250cm9sICUwMnhcbiIsCi0JCSByZXYsIF9fcmF3X3JlYWRsKENGR0NISVAyKSwKKwlwcl9kZWJ1ZygiREE4eHggT1RHIHJldmlzaW9uICUwOHgsIGNvbnRyb2wgJTAyeFxuIiwgcmV2LAogCQkgbXVzYl9yZWFkYihyZWdfYmFzZSwgREE4WFhfVVNCX0NUUkxfUkVHKSk7CiAKIAltdXNiLT5pc3IgPSBkYTh4eF9tdXNiX2ludGVycnVwdDsKIAlyZXR1cm4gMDsKKworZXJyX3BoeV9wb3dlcl9vbjoKKwlwaHlfZXhpdChnbHVlLT5waHkpOworZXJyX3BoeV9pbml0OgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShnbHVlLT5jbGspOwogZmFpbDoKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGRhOHh4X211c2JfZXhpdChzdHJ1Y3QgbXVzYiAqbXVzYikKIHsKKwlzdHJ1Y3QgZGE4eHhfZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShtdXNiLT5jb250cm9sbGVyLT5wYXJlbnQpOworCiAJZGVsX3RpbWVyX3N5bmMoJm90Z193b3JrYXJvdW5kKTsKIAotCXBoeV9vZmYoKTsKKwlwaHlfcG93ZXJfb2ZmKGdsdWUtPnBoeSk7CisJcGh5X2V4aXQoZ2x1ZS0+cGh5KTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZ2x1ZS0+Y2xrKTsKIAogCXVzYl9wdXRfcGh5KG11c2ItPnhjZWl2KTsKIApAQCAtNDg2LDMwICs0NjIsMjUgQEAKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgbXVzYl9yZXNvdXJjZXNbMl07CiAJc3RydWN0IG11c2JfaGRyY19wbGF0Zm9ybV9kYXRhCSpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKm11c2I7CiAJc3RydWN0IGRhOHh4X2dsdWUJCSpnbHVlOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaW5mbwlwaW5mbzsKIAlzdHJ1Y3QgY2xrCQkJKmNsazsKKwlpbnQJCQkJcmV0OwogCi0JaW50CQkJCXJldCA9IC1FTk9NRU07CisJZ2x1ZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdsdWUpCisJCXJldHVybiAtRU5PTUVNOwogCi0JZ2x1ZSA9IGt6YWxsb2Moc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFnbHVlKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBnbHVlIGNvbnRleHRcbiIpOwotCQlnb3RvIGVycjA7Ci0JfQotCi0JY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAidXNiMjAiKTsKKwljbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInVzYjIwIik7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgY2xvY2tcbiIpOwotCQlyZXQgPSBQVFJfRVJSKGNsayk7Ci0JCWdvdG8gZXJyMzsKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAl9CiAKLQlyZXQgPSBjbGtfZW5hYmxlKGNsayk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGNsb2NrXG4iKTsKLQkJZ290byBlcnI0OworCWdsdWUtPnBoeSA9IGRldm1fcGh5X2dldCgmcGRldi0+ZGV2LCAidXNiLXBoeSIpOworCWlmIChJU19FUlIoZ2x1ZS0+cGh5KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHBoeVxuIik7CisJCXJldHVybiBQVFJfRVJSKGdsdWUtPnBoeSk7CiAJfQogCiAJZ2x1ZS0+ZGV2CQkJPSAmcGRldi0+ZGV2OwpAQCAtNTE3LDEwICs0ODgsMTEgQEAKIAogCXBkYXRhLT5wbGF0Zm9ybV9vcHMJCT0gJmRhOHh4X29wczsKIAotCWdsdWUtPnBoeSA9IHVzYl9waHlfZ2VuZXJpY19yZWdpc3RlcigpOwotCWlmIChJU19FUlIoZ2x1ZS0+cGh5KSkgewotCQlyZXQgPSBQVFJfRVJSKGdsdWUtPnBoeSk7Ci0JCWdvdG8gZXJyNTsKKwlnbHVlLT51c2JfcGh5ID0gdXNiX3BoeV9nZW5lcmljX3JlZ2lzdGVyKCk7CisJcmV0ID0gUFRSX0VSUl9PUl9aRVJPKGdsdWUtPnVzYl9waHkpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHVzYl9waHlcbiIpOworCQlyZXR1cm4gcmV0OwogCX0KIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBnbHVlKTsKIApAQCAtNTQ0LDI4ICs1MTYsMTMgQEAKIAlwaW5mby5kYXRhID0gcGRhdGE7CiAJcGluZm8uc2l6ZV9kYXRhID0gc2l6ZW9mKCpwZGF0YSk7CiAKLQlnbHVlLT5tdXNiID0gbXVzYiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9mdWxsKCZwaW5mbyk7Ci0JaWYgKElTX0VSUihtdXNiKSkgewotCQlyZXQgPSBQVFJfRVJSKG11c2IpOworCWdsdWUtPm11c2IgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZnVsbCgmcGluZm8pOworCXJldCA9IFBUUl9FUlJfT1JfWkVSTyhnbHVlLT5tdXNiKTsKKwlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBtdXNiIGRldmljZTogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyNjsKKwkJdXNiX3BoeV9nZW5lcmljX3VucmVnaXN0ZXIoZ2x1ZS0+dXNiX3BoeSk7CiAJfQogCi0JcmV0dXJuIDA7Ci0KLWVycjY6Ci0JdXNiX3BoeV9nZW5lcmljX3VucmVnaXN0ZXIoZ2x1ZS0+cGh5KTsKLQotZXJyNToKLQljbGtfZGlzYWJsZShjbGspOwotCi1lcnI0OgotCWNsa19wdXQoY2xrKTsKLQotZXJyMzoKLQlrZnJlZShnbHVlKTsKLQotZXJyMDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01NzQsMTAgKzUzMSw3IEBACiAJc3RydWN0IGRhOHh4X2dsdWUJCSpnbHVlID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihnbHVlLT5tdXNiKTsKLQl1c2JfcGh5X2dlbmVyaWNfdW5yZWdpc3RlcihnbHVlLT5waHkpOwotCWNsa19kaXNhYmxlKGdsdWUtPmNsayk7Ci0JY2xrX3B1dChnbHVlLT5jbGspOwotCWtmcmVlKGdsdWUpOworCXVzYl9waHlfZ2VuZXJpY191bnJlZ2lzdGVyKGdsdWUtPnVzYl9waHkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwppbmRleCA3NGZjMzA2Li4yN2RhZGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKQEAgLTE0NDgsNyArMTQ0OCw3IEBACiB7CiAJdTggcmVnOwogCWNoYXIgKnR5cGU7Ci0JY2hhciBhSW5mb1s5MF0sIGFSZXZpc2lvblszMl0sIGFEYXRlWzEyXTsKKwljaGFyIGFJbmZvWzkwXTsKIAl2b2lkIF9faW9tZW0JKm1iYXNlID0gbXVzYi0+bXJlZ3M7CiAJaW50CQlzdGF0dXMgPSAwOwogCWludAkJaTsKQEAgLTE0ODIsNyArMTQ4Miw2IEBACiAKIAlwcl9kZWJ1ZygiJXM6IENvbmZpZ0RhdGE9MHglMDJ4ICglcylcbiIsIG11c2JfZHJpdmVyX25hbWUsIHJlZywgYUluZm8pOwogCi0JYURhdGVbMF0gPSAwOwogCWlmIChNVVNCX0NPTlRST0xMRVJfTUhEUkMgPT0gbXVzYl90eXBlKSB7CiAJCW11c2ItPmlzX211bHRpcG9pbnQgPSAxOwogCQl0eXBlID0gIk0iOwpAQCAtMTQ5NywxMSArMTQ5NiwxMCBAQAogCiAJLyogbG9nIHJlbGVhc2UgaW5mbyAqLwogCW11c2ItPmh3dmVycyA9IG11c2JfcmVhZF9od3ZlcnMobWJhc2UpOwotCXNucHJpbnRmKGFSZXZpc2lvbiwgMzIsICIlZC4lZCVzIiwgTVVTQl9IV1ZFUlNfTUFKT1IobXVzYi0+aHd2ZXJzKSwKLQkJTVVTQl9IV1ZFUlNfTUlOT1IobXVzYi0+aHd2ZXJzKSwKLQkJKG11c2ItPmh3dmVycyAmIE1VU0JfSFdWRVJTX1JDKSA/ICJSQyIgOiAiIik7Ci0JcHJfZGVidWcoIiVzOiAlc0hEUkMgUlRMIHZlcnNpb24gJXMgJXNcbiIsCi0JCSBtdXNiX2RyaXZlcl9uYW1lLCB0eXBlLCBhUmV2aXNpb24sIGFEYXRlKTsKKwlwcl9kZWJ1ZygiJXM6ICVzSERSQyBSVEwgdmVyc2lvbiAlZC4lZCVzXG4iLAorCQkgbXVzYl9kcml2ZXJfbmFtZSwgdHlwZSwgTVVTQl9IV1ZFUlNfTUFKT1IobXVzYi0+aHd2ZXJzKSwKKwkJIE1VU0JfSFdWRVJTX01JTk9SKG11c2ItPmh3dmVycyksCisJCSAobXVzYi0+aHd2ZXJzICYgTVVTQl9IV1ZFUlNfUkMpID8gIlJDIiA6ICIiKTsKIAogCS8qIGNvbmZpZ3VyZSBlcDAgKi8KIAltdXNiX2NvbmZpZ3VyZV9lcDAobXVzYik7CkBAIC0xODMxLDExICsxODI5LDgwIEBACiAJLmF0dHJzID0gbXVzYl9hdHRyaWJ1dGVzLAogfTsKIAorI2RlZmluZSBNVVNCX1FVSVJLX0JfSU5WQUxJRF9WQlVTXzkxCShNVVNCX0RFVkNUTF9CREVWSUNFIHwgXAorCQkJCQkgKDIgPDwgTVVTQl9ERVZDVExfVkJVU19TSElGVCkgfCBcCisJCQkJCSBNVVNCX0RFVkNUTF9TRVNTSU9OKQorI2RlZmluZSBNVVNCX1FVSVJLX0FfRElTQ09OTkVDVF8xOQkoKDMgPDwgTVVTQl9ERVZDVExfVkJVU19TSElGVCkgfCBcCisJCQkJCSBNVVNCX0RFVkNUTF9TRVNTSU9OKQorCisvKgorICogQ2hlY2sgdGhlIG11c2IgZGV2Y3RsIHNlc3Npb24gYml0IHRvIGRldGVybWluZSBpZiB3ZSB3YW50IHRvCisgKiBhbGxvdyBQTSBydW50aW1lIGZvciB0aGUgZGV2aWNlLiBJbiBnZW5lcmFsLCB3ZSB3YW50IHRvIGtlZXAgdGhpbmdzCisgKiBhY3RpdmUgd2hlbiB0aGUgc2Vzc2lvbiBiaXQgaXMgc2V0IGV4Y2VwdCBhZnRlciBob3N0IGRpc2Nvbm5lY3QuCisgKgorICogT25seSBjYWxsZWQgZnJvbSBtdXNiX2lycV93b3JrLiBJZiB0aGlzIGV2ZXIgbmVlZHMgdG8gZ2V0IGNhbGxlZAorICogZWxzZXdoZXJlLCBwcm9wZXIgbG9ja2luZyBtdXN0IGJlIGltcGxlbWVudGVkIGZvciBtdXNiLT5zZXNzaW9uLgorICovCitzdGF0aWMgdm9pZCBtdXNiX3BtX3J1bnRpbWVfY2hlY2tfc2Vzc2lvbihzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKKwl1OCBkZXZjdGwsIHM7CisJaW50IGVycm9yOworCisJZGV2Y3RsID0gbXVzYl9yZWFkYihtdXNiLT5tcmVncywgTVVTQl9ERVZDVEwpOworCisJLyogSGFuZGxlIHNlc3Npb24gc3RhdHVzIHF1aXJrcyBmaXJzdCAqLworCXMgPSBNVVNCX0RFVkNUTF9GU0RFViB8IE1VU0JfREVWQ1RMX0xTREVWIHwKKwkJTVVTQl9ERVZDVExfSFI7CisJc3dpdGNoIChkZXZjdGwgJiB+cykgeworCWNhc2UgTVVTQl9RVUlSS19CX0lOVkFMSURfVkJVU185MToKKwkJaWYgKCFtdXNiLT5zZXNzaW9uICYmICFtdXNiLT5xdWlya19pbnZhbGlkX3ZidXMpIHsKKwkJCW11c2ItPnF1aXJrX2ludmFsaWRfdmJ1cyA9IHRydWU7CisJCQltdXNiX2RiZyhtdXNiLAorCQkJCSAiRmlyc3QgaW52YWxpZCB2YnVzLCBhc3N1bWUgbm8gc2Vzc2lvbiIpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgTVVTQl9RVUlSS19BX0RJU0NPTk5FQ1RfMTk6CisJCWlmICghbXVzYi0+c2Vzc2lvbikKKwkJCWJyZWFrOworCQltdXNiX2RiZyhtdXNiLCAiQWxsb3cgUE0gb24gcG9zc2libGUgaG9zdCBtb2RlIGRpc2Nvbm5lY3QiKTsKKwkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShtdXNiLT5jb250cm9sbGVyKTsKKwkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQobXVzYi0+Y29udHJvbGxlcik7CisJCW11c2ItPnNlc3Npb24gPSBmYWxzZTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcgaWYgc2Vzc2lvbiBoYXMgbm90IGNoYW5nZWQgKi8KKwlzID0gZGV2Y3RsICYgTVVTQl9ERVZDVExfU0VTU0lPTjsKKwlpZiAocyA9PSBtdXNiLT5zZXNzaW9uKQorCQlyZXR1cm47CisKKwkvKiBCbG9jayBQTSBvciBhbGxvdyBQTT8gKi8KKwlpZiAocykgeworCQltdXNiX2RiZyhtdXNiLCAiQmxvY2sgUE0gb24gYWN0aXZlIHNlc3Npb246ICUwMngiLCBkZXZjdGwpOworCQllcnJvciA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMobXVzYi0+Y29udHJvbGxlcik7CisJCWlmIChlcnJvciA8IDApCisJCQlkZXZfZXJyKG11c2ItPmNvbnRyb2xsZXIsICJDb3VsZCBub3QgZW5hYmxlOiAlaVxuIiwKKwkJCQllcnJvcik7CisJfSBlbHNlIHsKKwkJbXVzYl9kYmcobXVzYiwgIkFsbG93IFBNIHdpdGggbm8gc2Vzc2lvbjogJTAyeCIsIGRldmN0bCk7CisJCW11c2ItPnF1aXJrX2ludmFsaWRfdmJ1cyA9IGZhbHNlOworCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KG11c2ItPmNvbnRyb2xsZXIpOworCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChtdXNiLT5jb250cm9sbGVyKTsKKwl9CisKKwltdXNiLT5zZXNzaW9uID0gczsKK30KKwogLyogT25seSB1c2VkIHRvIHByb3ZpZGUgZHJpdmVyIG1vZGUgY2hhbmdlIGV2ZW50cyAqLwogc3RhdGljIHZvaWQgbXVzYl9pcnFfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCiB7CiAJc3RydWN0IG11c2IgKm11c2IgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IG11c2IsIGlycV93b3JrKTsKIAorCW11c2JfcG1fcnVudGltZV9jaGVja19zZXNzaW9uKG11c2IpOworCiAJaWYgKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlICE9IG11c2ItPnhjZWl2X29sZF9zdGF0ZSkgewogCQltdXNiLT54Y2Vpdl9vbGRfc3RhdGUgPSBtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZTsKIAkJc3lzZnNfbm90aWZ5KCZtdXNiLT5jb250cm9sbGVyLT5rb2JqLCBOVUxMLCAibW9kZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaCBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKaW5kZXggYjU1YTc3Ni4uMmNiODhhNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaApAQCAtMzc4LDYgKzM3OCw4IEBACiAJdTgJCQltaW5fcG93ZXI7CS8qIHZidXMgZm9yIHBlcmlwaCwgaW4gbUEvMiAqLwogCiAJaW50CQkJcG9ydF9tb2RlOwkvKiBNVVNCX1BPUlRfTU9ERV8qICovCisJYm9vbAkJCXNlc3Npb247CisJYm9vbAkJCXF1aXJrX2ludmFsaWRfdmJ1czsKIAlib29sCQkJaXNfaG9zdDsKIAogCWludAkJCWFfd2FpdF9iY29uOwkvKiBWQlVTIHRpbWVvdXQgaW4gbXNlY3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kc3BzLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZHNwcy5jCmluZGV4IDI1MzcxNzkuLjBmMTdkMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kc3BzLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RzcHMuYwpAQCAtMTQ1LDQzICsxNDUsNiBAQAogCXsgIm1vZGUiLAkJMHhlOCB9LAogfTsKIAotc3RhdGljIHZvaWQgZHNwc19tdXNiX3RyeV9pZGxlKHN0cnVjdCBtdXNiICptdXNiLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gbXVzYi0+Y29udHJvbGxlcjsKLQlzdHJ1Y3QgZHNwc19nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKLQotCWlmICh0aW1lb3V0ID09IDApCi0JCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygzKTsKLQotCS8qIE5ldmVyIGlkbGUgaWYgYWN0aXZlLCBvciB3aGVuIFZCVVMgdGltZW91dCBpcyBub3Qgc2V0IGFzIGhvc3QgKi8KLQlpZiAobXVzYi0+aXNfYWN0aXZlIHx8IChtdXNiLT5hX3dhaXRfYmNvbiA9PSAwICYmCi0JCQltdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSA9PSBPVEdfU1RBVEVfQV9XQUlUX0JDT04pKSB7Ci0JCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIiVzIGFjdGl2ZSwgZGVsZXRpbmcgdGltZXJcbiIsCi0JCQkJdXNiX290Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpKTsKLQkJZGVsX3RpbWVyKCZnbHVlLT50aW1lcik7Ci0JCWdsdWUtPmxhc3RfdGltZXIgPSBqaWZmaWVzOwotCQlyZXR1cm47Ci0JfQotCWlmIChtdXNiLT5wb3J0X21vZGUgIT0gTVVTQl9QT1JUX01PREVfRFVBTF9ST0xFKQotCQlyZXR1cm47Ci0KLQlpZiAoIW11c2ItPmcuZGV2LmRyaXZlcikKLQkJcmV0dXJuOwotCi0JaWYgKHRpbWVfYWZ0ZXIoZ2x1ZS0+bGFzdF90aW1lciwgdGltZW91dCkgJiYKLQkJCQl0aW1lcl9wZW5kaW5nKCZnbHVlLT50aW1lcikpIHsKLQkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLAotCQkJIkxvbmdlciBpZGxlIHRpbWVyIGFscmVhZHkgcGVuZGluZywgaWdub3JpbmcuLi5cbiIpOwotCQlyZXR1cm47Ci0JfQotCWdsdWUtPmxhc3RfdGltZXIgPSB0aW1lb3V0OwotCi0JZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiJXMgaW5hY3RpdmUsIHN0YXJ0aW5nIGlkbGUgdGltZXIgZm9yICV1IG1zXG4iLAotCQl1c2Jfb3RnX3N0YXRlX3N0cmluZyhtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSksCi0JCQlqaWZmaWVzX3RvX21zZWNzKHRpbWVvdXQgLSBqaWZmaWVzKSk7Ci0JbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgdGltZW91dCk7Ci19Ci0KIC8qKgogICogZHNwc19tdXNiX2VuYWJsZSAtIGVuYWJsZSBpbnRlcnJ1cHRzCiAgKi8KQEAgLTIwNiw3ICsxNjksNiBAQAogCQkJbXVzYi0+cG9ydF9tb2RlID09IE1VU0JfUE9SVF9NT0RFX0RVQUxfUk9MRSkKIAkJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgamlmZmllcyArCiAJCQkJbXNlY3NfdG9famlmZmllcyh3cnAtPnBvbGxfdGltZW91dCkpOwotCWRzcHNfbXVzYl90cnlfaWRsZShtdXNiLCAwKTsKIH0KIAogLyoqCkBAIC0yMzYsNiArMTk4LDExIEBACiAJdTggZGV2Y3RsOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHNraXBfc2Vzc2lvbiA9IDA7CisJaW50IGVycjsKKworCWVyciA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKwlpZiAoZXJyIDwgMCkKKwkJZGV2X2VycihkZXYsICJQb2xsIGNvdWxkIG5vdCBwbV9ydW50aW1lX2dldDogJWlcbiIsIGVycik7CiAKIAkvKgogCSAqIFdlIHBvbGwgYmVjYXVzZSBEU1BTIElQJ3Mgd29uJ3QgZXhwb3NlIHNldmVyYWwgT1RHLWNyaXRpY2FsCkBAIC0yNDcsNiArMjE0LDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwogCXN3aXRjaCAobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpIHsKKwljYXNlIE9UR19TVEFURV9BX1dBSVRfVlJJU0U6CisJCW1vZF90aW1lcigmZ2x1ZS0+dGltZXIsIGppZmZpZXMgKworCQkJCW1zZWNzX3RvX2ppZmZpZXMod3JwLT5wb2xsX3RpbWVvdXQpKTsKKwkJYnJlYWs7CiAJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX0JDT046CiAJCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCwgMCk7CiAJCXNraXBfc2Vzc2lvbiA9IDE7CkBAIC0yNzUsNiArMjQ2LDkgQEAKIAkJYnJlYWs7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChkZXYpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgZHNwc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqaGNpKQpAQCAtMzM4LDcgKzMxMiw4IEBACiAJCQlNVVNCX0hTVF9NT0RFKG11c2IpOwogCQkJbXVzYi0+eGNlaXYtPm90Zy0+ZGVmYXVsdF9hID0gMTsKIAkJCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0FfV0FJVF9WUklTRTsKLQkJCWRlbF90aW1lcigmZ2x1ZS0+dGltZXIpOworCQkJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKHdycC0+cG9sbF90aW1lb3V0KSk7CiAJCX0gZWxzZSB7CiAJCQltdXNiLT5pc19hY3RpdmUgPSAwOwogCQkJTVVTQl9ERVZfTU9ERShtdXNiKTsKQEAgLTM1OCwxMSArMzMzLDE3IEBACiAJaWYgKG11c2ItPmludF90eCB8fCBtdXNiLT5pbnRfcnggfHwgbXVzYi0+aW50X3VzYikKIAkJcmV0IHw9IG11c2JfaW50ZXJydXB0KG11c2IpOwogCi0JLyogUG9sbCBmb3IgSUQgY2hhbmdlIGluIE9URyBwb3J0IG1vZGUgKi8KLQlpZiAobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUgPT0gT1RHX1NUQVRFX0JfSURMRSAmJgotCQkJbXVzYi0+cG9ydF9tb2RlID09IE1VU0JfUE9SVF9NT0RFX0RVQUxfUk9MRSkKKwkvKiBQb2xsIGZvciBJRCBjaGFuZ2UgYW5kIGNvbm5lY3QgKi8KKwlzd2l0Y2ggKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlKSB7CisJY2FzZSBPVEdfU1RBVEVfQl9JRExFOgorCWNhc2UgT1RHX1NUQVRFX0FfV0FJVF9CQ09OOgogCQltb2RfdGltZXIoJmdsdWUtPnRpbWVyLCBqaWZmaWVzICsKIAkJCQltc2Vjc190b19qaWZmaWVzKHdycC0+cG9sbF90aW1lb3V0KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIApAQCAtNDYxLDYgKzQ0Miw5IEBACiAJCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0JBQkJMRV9DVEwsIHZhbCk7CiAJfQogCisJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgamlmZmllcyArCisJCSAgbXNlY3NfdG9famlmZmllcyhnbHVlLT53cnAtPnBvbGxfdGltZW91dCkpOworCiAJcmV0dXJuIGRzcHNfbXVzYl9kYmdfaW5pdChtdXNiLCBnbHVlKTsKIH0KIApAQCAtNjIwLDcgKzYwNCw2IEBACiAJLmVuYWJsZQkJPSBkc3BzX211c2JfZW5hYmxlLAogCS5kaXNhYmxlCT0gZHNwc19tdXNiX2Rpc2FibGUsCiAKLQkudHJ5X2lkbGUJPSBkc3BzX211c2JfdHJ5X2lkbGUsCiAJLnNldF9tb2RlCT0gZHNwc19tdXNiX3NldF9tb2RlLAogCS5yZWNvdmVyCT0gZHNwc19tdXNiX3JlY292ZXIsCiB9OwpAQCAtNzg0LDYgKzc2Nyw4IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBnbHVlKTsKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheSgmcGRldi0+ZGV2LCAyMDApOwogCiAJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNzk1LDExICs3ODAsMTUgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycjM7CiAKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKCZwZGV2LT5kZXYpOworCiAJcmV0dXJuIDA7CiAKIGVycjM6Ci0JcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIGVycjI6CisJcG1fcnVudGltZV9kb250X3VzZV9hdXRvc3VzcGVuZCgmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTgxMSw3ICs4MDAsOCBAQAogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGdsdWUtPm11c2IpOwogCiAJLyogZGlzYWJsZSB1c2JzcyBjbG9ja3MgKi8KLQlwbV9ydW50aW1lX3B1dCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2RvbnRfdXNlX2F1dG9zdXNwZW5kKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKaW5kZXggNmQxZTk3NS4uYmZmNDg2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYwpAQCAtMTk2NCw2ICsxOTY0LDkgQEAKIAkgKiB0aGF0IGN1cnJlbnRseSBtaXNiZWhhdmVzLgogCSAqLwogCisJLyogRm9yY2UgY2hlY2sgb2YgZGV2Y3RsIHJlZ2lzdGVyIGZvciBQTSBydW50aW1lICovCisJc2NoZWR1bGVfd29yaygmbXVzYi0+aXJxX3dvcmspOworCiAJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShtdXNiLT5jb250cm9sbGVyKTsKIAlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChtdXNiLT5jb250cm9sbGVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX3ZpcnRodWIuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl92aXJ0aHViLmMKaW5kZXggMTkyMjQ4Zi4uNjFiNWYxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX3ZpcnRodWIuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfdmlydGh1Yi5jCkBAIC0yNDUsNiArMjQ1LDcgQEAKIAkJCXVzYl9vdGdfc3RhdGVfc3RyaW5nKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlKSk7CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwobXVzYl9yb290X2Rpc2Nvbm5lY3QpOwogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTI5MCw2ICsyOTEsNyBAQAogCXUzMgkJdGVtcDsKIAlpbnQJCXJldHZhbCA9IDA7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlib29sCQlzdGFydF9tdXNiID0gZmFsc2U7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXVzYi0+bG9jaywgZmxhZ3MpOwogCkBAIC0zOTAsNyArMzkyLDcgQEAKIAkJCSAqIGxvZ2ljIHJlbGF0aW5nIHRvIFZCVVMgcG93ZXItdXAuCiAJCQkgKi8KIAkJCWlmICghaGNkLT5zZWxmLmlzX2JfaG9zdCAmJiBtdXNiX2hhc19nYWRnZXQobXVzYikpCi0JCQkJbXVzYl9zdGFydChtdXNiKTsKKwkJCQlzdGFydF9tdXNiID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CiAJCQltdXNiX3BvcnRfcmVzZXQobXVzYiwgdHJ1ZSk7CkBAIC00NTEsNSArNDUzLDkgQEAKIAkJcmV0dmFsID0gLUVQSVBFOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtdXNiLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc3RhcnRfbXVzYikKKwkJbXVzYl9zdGFydChtdXNiKTsKKwogCXJldHVybiByZXR2YWw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMgYi9kcml2ZXJzL3VzYi9tdXNiL29tYXAyNDMwLmMKaW5kZXggMGI0Y2VjOS4uMWFiNjk3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9vbWFwMjQzMC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2Ivb21hcDI0MzAuYwpAQCAtNDksOSArNDksNiBAQAogCWVudW0gbXVzYl92YnVzX2lkX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IHdvcmtfc3RydWN0CW9tYXBfbXVzYl9tYWlsYm94X3dvcms7CiAJc3RydWN0IGRldmljZQkJKmNvbnRyb2xfb3RnaHM7Ci0JYm9vbAkJCWNhYmxlX2Nvbm5lY3RlZDsKLQlib29sCQkJZW5hYmxlZDsKLQlib29sCQkJcG93ZXJlZDsKIH07CiAjZGVmaW5lIGdsdWVfdG9fbXVzYihnKQkJcGxhdGZvcm1fZ2V0X2RydmRhdGEoZy0+bXVzYikKIApAQCAtMTQxLDQ1ICsxMzgsNiBAQAogCW11c2Jfd3JpdGVsKG11c2ItPm1yZWdzLCBPVEdfRk9SQ0VTVERCWSwgbCk7CiB9CiAKLS8qCi0gKiBXZSBjYW4gZ2V0IG11bHRpcGxlIGNhYmxlIGV2ZW50cyBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sKLSAqIG9mIHRoZSBwb3dlciBzdGF0ZS4gT25seSBrZWVwIHBvd2VyIGVuYWJsZWQgaWYgVVNCIGNhYmxlIGlzCi0gKiBjb25uZWN0ZWQgYW5kIGEgZ2FkZ2V0IGlzIHN0YXJ0ZWQuCi0gKi8KLXN0YXRpYyB2b2lkIG9tYXAyNDMwX3NldF9wb3dlcihzdHJ1Y3QgbXVzYiAqbXVzYiwgYm9vbCBlbmFibGVkLCBib29sIGNhYmxlKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IG11c2ItPmNvbnRyb2xsZXI7Ci0Jc3RydWN0IG9tYXAyNDMwX2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2LT5wYXJlbnQpOwotCWJvb2wgcG93ZXJfdXA7Ci0JaW50IHJlczsKLQotCWlmIChnbHVlLT5lbmFibGVkICE9IGVuYWJsZWQpCi0JCWdsdWUtPmVuYWJsZWQgPSBlbmFibGVkOwotCi0JaWYgKGdsdWUtPmNhYmxlX2Nvbm5lY3RlZCAhPSBjYWJsZSkKLQkJZ2x1ZS0+Y2FibGVfY29ubmVjdGVkID0gY2FibGU7Ci0KLQlwb3dlcl91cCA9IGdsdWUtPmVuYWJsZWQgJiYgZ2x1ZS0+Y2FibGVfY29ubmVjdGVkOwotCWlmIChwb3dlcl91cCA9PSBnbHVlLT5wb3dlcmVkKSB7Ci0JCWRldl93YXJuKG11c2ItPmNvbnRyb2xsZXIsICJwb3dlciBzdGF0ZSBhbHJlYWR5ICVpXG4iLAotCQkJIHBvd2VyX3VwKTsKLQkJcmV0dXJuOwotCX0KLQotCWdsdWUtPnBvd2VyZWQgPSBwb3dlcl91cDsKLQotCWlmIChwb3dlcl91cCkgewotCQlyZXMgPSBwbV9ydW50aW1lX2dldF9zeW5jKG11c2ItPmNvbnRyb2xsZXIpOwotCQlpZiAocmVzIDwgMCkgewotCQkJZGV2X2VycihtdXNiLT5jb250cm9sbGVyLCAiY291bGQgbm90IGVuYWJsZTogJWkiLCByZXMpOwotCQkJZ2x1ZS0+cG93ZXJlZCA9IGZhbHNlOwotCQl9Ci0JfSBlbHNlIHsKLQkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShtdXNiLT5jb250cm9sbGVyKTsKLQkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQobXVzYi0+Y29udHJvbGxlcik7Ci0JfQotfQotCiBzdGF0aWMgaW50IG9tYXAyNDMwX211c2JfbWFpbGJveChlbnVtIG11c2JfdmJ1c19pZF9zdGF0dXMgc3RhdHVzKQogewogCXN0cnVjdCBvbWFwMjQzMF9nbHVlCSpnbHVlID0gX2dsdWU7CkBAIC0yMDMsMjEgKzE2MSwxNSBAQAogc3RhdGljIHZvaWQgb21hcF9tdXNiX3NldF9tYWlsYm94KHN0cnVjdCBvbWFwMjQzMF9nbHVlICpnbHVlKQogewogCXN0cnVjdCBtdXNiICptdXNiID0gZ2x1ZV90b19tdXNiKGdsdWUpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IG11c2ItPmNvbnRyb2xsZXI7Ci0Jc3RydWN0IG11c2JfaGRyY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKKwlzdHJ1Y3QgbXVzYl9oZHJjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0KKwkJZGV2X2dldF9wbGF0ZGF0YShtdXNiLT5jb250cm9sbGVyKTsKIAlzdHJ1Y3Qgb21hcF9tdXNiX2JvYXJkX2RhdGEgKmRhdGEgPSBwZGF0YS0+Ym9hcmRfZGF0YTsKIAlzdHJ1Y3QgdXNiX290ZyAqb3RnID0gbXVzYi0+eGNlaXYtPm90ZzsKLQlib29sIGNhYmxlX2Nvbm5lY3RlZDsKIAotCWNhYmxlX2Nvbm5lY3RlZCA9ICgoZ2x1ZS0+c3RhdHVzID09IE1VU0JfSURfR1JPVU5EKSB8fAotCQkJICAgKGdsdWUtPnN0YXR1cyA9PSBNVVNCX1ZCVVNfVkFMSUQpKTsKLQotCWlmIChjYWJsZV9jb25uZWN0ZWQpCi0JCW9tYXAyNDMwX3NldF9wb3dlcihtdXNiLCBnbHVlLT5lbmFibGVkLCBjYWJsZV9jb25uZWN0ZWQpOwotCisJcG1fcnVudGltZV9nZXRfc3luYyhtdXNiLT5jb250cm9sbGVyKTsKIAlzd2l0Y2ggKGdsdWUtPnN0YXR1cykgewogCWNhc2UgTVVTQl9JRF9HUk9VTkQ6Ci0JCWRldl9kYmcoZGV2LCAiSUQgR05EXG4iKTsKKwkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiSUQgR05EXG4iKTsKIAogCQlvdGctPmRlZmF1bHRfYSA9IHRydWU7CiAJCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0FfSURMRTsKQEAgLTIzMCw3ICsxODIsNyBAQAogCQlicmVhazsKIAogCWNhc2UgTVVTQl9WQlVTX1ZBTElEOgotCQlkZXZfZGJnKGRldiwgIlZCVVMgQ29ubmVjdFxuIik7CisJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIlZCVVMgQ29ubmVjdFxuIik7CiAKIAkJb3RnLT5kZWZhdWx0X2EgPSBmYWxzZTsKIAkJbXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQl9JRExFOwpAQCAtMjQwLDcgKzE5Miw3IEBACiAKIAljYXNlIE1VU0JfSURfRkxPQVQ6CiAJY2FzZSBNVVNCX1ZCVVNfT0ZGOgotCQlkZXZfZGJnKGRldiwgIlZCVVMgRGlzY29ubmVjdFxuIik7CisJCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIlZCVVMgRGlzY29ubmVjdFxuIik7CiAKIAkJbXVzYi0+eGNlaXYtPmxhc3RfZXZlbnQgPSBVU0JfRVZFTlRfTk9ORTsKIAkJaWYgKG11c2ItPmdhZGdldF9kcml2ZXIpCkBAIC0yNTMsMTIgKzIwNSwxMCBAQAogCQkJVVNCX01PREVfRElTQ09OTkVDVCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9kYmcoZGV2LCAiSUQgZmxvYXRcbiIpOworCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJJRCBmbG9hdFxuIik7CiAJfQotCi0JaWYgKCFjYWJsZV9jb25uZWN0ZWQpCi0JCW9tYXAyNDMwX3NldF9wb3dlcihtdXNiLCBnbHVlLT5lbmFibGVkLCBjYWJsZV9jb25uZWN0ZWQpOwotCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShtdXNiLT5jb250cm9sbGVyKTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChtdXNiLT5jb250cm9sbGVyKTsKIAlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmbXVzYi0+eGNlaXYtPm5vdGlmaWVyLAogCQkJbXVzYi0+eGNlaXYtPmxhc3RfZXZlbnQsIE5VTEwpOwogfQpAQCAtMzc2LDggKzMyNiw2IEBACiAJaWYgKCFXQVJOX09OKCFtdXNiLT5waHkpKQogCQlwaHlfcG93ZXJfb24obXVzYi0+cGh5KTsKIAotCW9tYXAyNDMwX3NldF9wb3dlcihtdXNiLCB0cnVlLCBnbHVlLT5jYWJsZV9jb25uZWN0ZWQpOwotCiAJc3dpdGNoIChnbHVlLT5zdGF0dXMpIHsKIAogCWNhc2UgTVVTQl9JRF9HUk9VTkQ6CkBAIC00MTksOCArMzY3LDYgQEAKIAlpZiAoZ2x1ZS0+c3RhdHVzICE9IE1VU0JfVU5LTk9XTikKIAkJb21hcF9jb250cm9sX3VzYl9zZXRfbW9kZShnbHVlLT5jb250cm9sX290Z2hzLAogCQkJVVNCX01PREVfRElTQ09OTkVDVCk7Ci0KLQlvbWFwMjQzMF9zZXRfcG93ZXIobXVzYiwgZmFsc2UsIGdsdWUtPmNhYmxlX2Nvbm5lY3RlZCk7CiB9CiAKIHN0YXRpYyBpbnQgb21hcDI0MzBfbXVzYl9leGl0KHN0cnVjdCBtdXNiICptdXNiKQpAQCAtNTcxLDcgKzUxNyw3IEBACiAKIAlwbV9ydW50aW1lX2VuYWJsZShnbHVlLT5kZXYpOwogCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGdsdWUtPmRldik7Ci0JcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZ2x1ZS0+ZGV2LCA1MDApOworCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KGdsdWUtPmRldiwgMTAwKTsKIAogCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQobXVzYik7CiAJaWYgKHJldCkgewpAQCAtNTkxLDExICs1MzcsOSBAQAogc3RhdGljIGludCBvbWFwMjQzMF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgb21hcDI0MzBfZ2x1ZSAqZ2x1ZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBtdXNiICptdXNiID0gZ2x1ZV90b19tdXNiKGdsdWUpOwogCiAJcG1fcnVudGltZV9nZXRfc3luYyhnbHVlLT5kZXYpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGdsdWUtPm11c2IpOwotCW9tYXAyNDMwX3NldF9wb3dlcihtdXNiLCBmYWxzZSwgZmFsc2UpOwogCXBtX3J1bnRpbWVfcHV0X3N5bmMoZ2x1ZS0+ZGV2KTsKIAlwbV9ydW50aW1lX2RvbnRfdXNlX2F1dG9zdXNwZW5kKGdsdWUtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKGdsdWUtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL3N1bnhpLmMgYi9kcml2ZXJzL3VzYi9tdXNiL3N1bnhpLmMKaW5kZXggYzZlZTE2Ni4uMTQwODI0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9zdW54aS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2Ivc3VueGkuYwpAQCAtNzQsNiArNzQsNyBAQAogI2RlZmluZSBTVU5YSV9NVVNCX0ZMX0hBU19TUkFNCQkJNQogI2RlZmluZSBTVU5YSV9NVVNCX0ZMX0hBU19SRVNFVAkJCTYKICNkZWZpbmUgU1VOWElfTVVTQl9GTF9OT19DT05GSUdEQVRBCQk3CisjZGVmaW5lIFNVTlhJX01VU0JfRkxfUEhZX01PREVfUEVORAkJOAogCiAvKiBPdXIgcmVhZC93cml0ZSBtZXRob2RzIG5lZWQgYWNjZXNzIGFuZCBkbyBub3QgZ2V0IHBhc3NlZCBpbiBhIG11c2IgcmVmIDp8ICovCiBzdGF0aWMgc3RydWN0IG11c2IgKnN1bnhpX211c2I7CkBAIC04Nyw2ICs4OCw3IEBACiAJc3RydWN0IHBoeQkJKnBoeTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSp1c2JfcGh5OwogCXN0cnVjdCB1c2JfcGh5CQkqeGNlaXY7CisJZW51bSBwaHlfbW9kZQkJcGh5X21vZGU7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CiAJc3RydWN0IGV4dGNvbl9kZXYJKmV4dGNvbjsKQEAgLTE0MCw2ICsxNDIsOSBAQAogCQkJY2xlYXJfYml0KFNVTlhJX01VU0JfRkxfUEhZX09OLCAmZ2x1ZS0+ZmxhZ3MpOwogCQl9CiAJfQorCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChTVU5YSV9NVVNCX0ZMX1BIWV9NT0RFX1BFTkQsICZnbHVlLT5mbGFncykpCisJCXBoeV9zZXRfbW9kZShnbHVlLT5waHksIGdsdWUtPnBoeV9tb2RlKTsKIH0KIAogc3RhdGljIHZvaWQgc3VueGlfbXVzYl9zZXRfdmJ1cyhzdHJ1Y3QgbXVzYiAqbXVzYiwgaW50IGlzX29uKQpAQCAtMzQxLDYgKzM0Niw1MCBAQAogewogfQogCitzdGF0aWMgaW50IHN1bnhpX211c2Jfc2V0X21vZGUoc3RydWN0IG11c2IgKm11c2IsIHU4IG1vZGUpCit7CisJc3RydWN0IHN1bnhpX2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEobXVzYi0+Y29udHJvbGxlci0+cGFyZW50KTsKKwllbnVtIHBoeV9tb2RlIG5ld19tb2RlOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBNVVNCX0hPU1Q6CisJCW5ld19tb2RlID0gUEhZX01PREVfVVNCX0hPU1Q7CisJCWJyZWFrOworCWNhc2UgTVVTQl9QRVJJUEhFUkFMOgorCQluZXdfbW9kZSA9IFBIWV9NT0RFX1VTQl9ERVZJQ0U7CisJCWJyZWFrOworCWNhc2UgTVVTQl9PVEc6CisJCW5ld19tb2RlID0gUEhZX01PREVfVVNCX09URzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihtdXNiLT5jb250cm9sbGVyLT5wYXJlbnQsCisJCQkiRXJyb3IgcmVxdWVzdGVkIG1vZGUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGtlcm5lbFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChnbHVlLT5waHlfbW9kZSA9PSBuZXdfbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobXVzYi0+cG9ydF9tb2RlICE9IE1VU0JfUE9SVF9NT0RFX0RVQUxfUk9MRSkgeworCQlkZXZfZXJyKG11c2ItPmNvbnRyb2xsZXItPnBhcmVudCwKKwkJCSJFcnJvciBjaGFuZ2luZyBtb2RlcyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBkdWFsIHJvbGUgbW9kZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtdXNiLT5wb3J0MV9zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0VOQUJMRSkKKwkJbXVzYl9yb290X2Rpc2Nvbm5lY3QobXVzYik7CisKKwkvKgorCSAqIHBoeV9zZXRfbW9kZSBtYXkgc2xlZXAsIGFuZCB3ZSdyZSBjYWxsZWQgd2l0aCBhIHNwaW5sb2NrIGhlbGQsCisJICogc28gbGV0IHN1bnhpX211c2Jfd29yayBkZWFsIHdpdGggaXQuCisJICovCisJZ2x1ZS0+cGh5X21vZGUgPSBuZXdfbW9kZTsKKwlzZXRfYml0KFNVTlhJX01VU0JfRkxfUEhZX01PREVfUEVORCwgJmdsdWUtPmZsYWdzKTsKKwlzY2hlZHVsZV93b3JrKCZnbHVlLT53b3JrKTsKKworCXJldHVybiAwOworfQorCiAvKgogICogc3VueGkgbXVzYiByZWdpc3RlciBsYXlvdXQKICAqIDB4MDAgLSAweDE3CWZpZm8gcmVncywgMSBsb25nIHBlciBmaWZvCkBAIC01NjgsNiArNjE3LDcgQEAKIAkud3JpdGV3CQk9IHN1bnhpX211c2Jfd3JpdGV3LAogCS5kbWFfaW5pdAk9IHN1bnhpX211c2JfZG1hX2NvbnRyb2xsZXJfY3JlYXRlLAogCS5kbWFfZXhpdAk9IHN1bnhpX211c2JfZG1hX2NvbnRyb2xsZXJfZGVzdHJveSwKKwkuc2V0X21vZGUJPSBzdW54aV9tdXNiX3NldF9tb2RlLAogCS5zZXRfdmJ1cwk9IHN1bnhpX211c2Jfc2V0X3ZidXMsCiAJLnByZV9yb290X3Jlc2V0X2VuZCA9IHN1bnhpX211c2JfcHJlX3Jvb3RfcmVzZXRfZW5kLAogCS5wb3N0X3Jvb3RfcmVzZXRfZW5kID0gc3VueGlfbXVzYl9wb3N0X3Jvb3RfcmVzZXRfZW5kLApAQCAtNjE0LDIxICs2NjQsMjggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJZ2x1ZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdsdWUpCisJCXJldHVybiAtRU5PTUVNOworCiAJbWVtc2V0KCZwZGF0YSwgMCwgc2l6ZW9mKHBkYXRhKSk7CiAJc3dpdGNoICh1c2JfZ2V0X2RyX21vZGUoJnBkZXYtPmRldikpIHsKICNpZiBkZWZpbmVkIENPTkZJR19VU0JfTVVTQl9EVUFMX1JPTEUgfHwgZGVmaW5lZCBDT05GSUdfVVNCX01VU0JfSE9TVAogCWNhc2UgVVNCX0RSX01PREVfSE9TVDoKIAkJcGRhdGEubW9kZSA9IE1VU0JfUE9SVF9NT0RFX0hPU1Q7CisJCWdsdWUtPnBoeV9tb2RlID0gUEhZX01PREVfVVNCX0hPU1Q7CiAJCWJyZWFrOwogI2VuZGlmCiAjaWYgZGVmaW5lZCBDT05GSUdfVVNCX01VU0JfRFVBTF9ST0xFIHx8IGRlZmluZWQgQ09ORklHX1VTQl9NVVNCX0dBREdFVAogCWNhc2UgVVNCX0RSX01PREVfUEVSSVBIRVJBTDoKIAkJcGRhdGEubW9kZSA9IE1VU0JfUE9SVF9NT0RFX0dBREdFVDsKKwkJZ2x1ZS0+cGh5X21vZGUgPSBQSFlfTU9ERV9VU0JfREVWSUNFOwogCQlicmVhazsKICNlbmRpZgogI2lmZGVmIENPTkZJR19VU0JfTVVTQl9EVUFMX1JPTEUKIAljYXNlIFVTQl9EUl9NT0RFX09URzoKIAkJcGRhdGEubW9kZSA9IE1VU0JfUE9SVF9NT0RFX0RVQUxfUk9MRTsKKwkJZ2x1ZS0+cGh5X21vZGUgPSBQSFlfTU9ERV9VU0JfT1RHOwogCQlicmVhazsKICNlbmRpZgogCWRlZmF1bHQ6CkBAIC02MzgsMTAgKzY5NSw2IEBACiAJcGRhdGEucGxhdGZvcm1fb3BzCT0gJnN1bnhpX211c2Jfb3BzOwogCXBkYXRhLmNvbmZpZwkJPSAmc3VueGlfbXVzYl9oZHJjX2NvbmZpZzsKIAotCWdsdWUgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpnbHVlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFnbHVlKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCWdsdWUtPmRldiA9ICZwZGV2LT5kZXY7CiAJSU5JVF9XT1JLKCZnbHVlLT53b3JrLCBzdW54aV9tdXNiX3dvcmspOwogCWdsdWUtPmhvc3RfbmIubm90aWZpZXJfY2FsbCA9IHN1bnhpX211c2JfaG9zdF9ub3RpZmllcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktYWI4NTAwLXVzYi5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1hYjg1MDAtdXNiLmMKaW5kZXggMGM5MTJkMy4uYTAzY2FmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L3BoeS1hYjg1MDAtdXNiLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS1hYjg1MDAtdXNiLmMKQEAgLTEyNDgsNyArMTI0OCw3IEBACiAJZXJyID0gYWJ4NTAwX3NldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGFiLT5kZXYsCiAJCQlBQjg1MDBfREVCVUcsIEFCODUwMF9VU0JfUEhZX1RVTkUzLCAweDc4KTsKIAlpZiAoZXJyIDwgMCkKLQkJZGV2X2VycihhYi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBQSFlfVFVORTMgcmVnZXN0ZXIgZXJyPSVkXG4iLAorCQlkZXZfZXJyKGFiLT5kZXYsICJGYWlsZWQgdG8gc2V0IFBIWV9UVU5FMyByZWdpc3RlciBlcnI9JWRcbiIsCiAJCQkJZXJyKTsKIAogCS8qIFN3aXRjaCB0byBub3JtYWwgbW9kZS9kaXNhYmxlIEJhbmsgMHgxMiBhY2Nlc3MgKi8KQEAgLTEyOTAsNyArMTI5MCw3IEBACiAJCQkweEZDLCAweDgwKTsKIAogCWlmIChlcnIgPCAwKQotCQlkZXZfZXJyKGFiLT5kZXYsICJGYWlsZWQgdG8gc2V0IFBIWV9UVU5FMyByZWdlc3RlciBlcnI9JWRcbiIsCisJCWRldl9lcnIoYWItPmRldiwgIkZhaWxlZCB0byBzZXQgUEhZX1RVTkUzIHJlZ2lzdGVyIGVycj0lZFxuIiwKIAkJCQllcnIpOwogCiAJLyogU3dpdGNoIHRvIG5vcm1hbCBtb2RlL2Rpc2FibGUgQmFuayAweDEyIGFjY2VzcyAqLwpAQCAtMTMyMSw3ICsxMzIxLDcgQEAKIAllcnIgPSBhYng1MDBfc2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoYWItPmRldiwKIAkJCUFCODU0MF9ERUJVRywgQUI4NTAwX1VTQl9QSFlfVFVORTMsIDB4OTApOwogCWlmIChlcnIgPCAwKQotCQlkZXZfZXJyKGFiLT5kZXYsICJGYWlsZWQgdG8gc2V0IFBIWV9UVU5FMyByZWdlc3RlciByZXQ9JWRcbiIsCisJCWRldl9lcnIoYWItPmRldiwgIkZhaWxlZCB0byBzZXQgUEhZX1RVTkUzIHJlZ2lzdGVyIHJldD0lZFxuIiwKIAkJCQllcnIpOwogfQogCkBAIC0xMzUxLDcgKzEzNTEsNyBAQAogCWVyciA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShhYi0+ZGV2LAogCQkJQUI4NTAwX0RFQlVHLCBBQjg1MDBfVVNCX1BIWV9UVU5FMywgMHg4MCk7CiAJaWYgKGVyciA8IDApCi0JCWRldl9lcnIoYWItPmRldiwgIkZhaWxlZCB0byBzZXQgUEhZX1RVTkUzIHJlZ2VzdGVyIGVycj0lZFxuIiwKKwkJZGV2X2VycihhYi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBQSFlfVFVORTMgcmVnaXN0ZXIgZXJyPSVkXG4iLAogCQkJCWVycik7CiAKIAkvKiBTd2l0Y2ggdG8gbm9ybWFsIG1vZGUvZGlzYWJsZSBCYW5rIDB4MTIgYWNjZXNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LWdlbmVyaWMuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktZ2VuZXJpYy5jCmluZGV4IDk4MGM5ZGUuLjgzMTFiYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvdXNiL3BoeS9waHktZ2VuZXJpYy5jCkBAIC0xMTgsOCArMTE4LDYgQEAKIAkJc3RhdHVzID0gVVNCX0VWRU5UX1ZCVVM7CiAJCW90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQl9QRVJJUEhFUkFMOwogCQlub3AtPnBoeS5sYXN0X2V2ZW50ID0gc3RhdHVzOwotCQlpZiAob3RnLT5nYWRnZXQpCi0JCQl1c2JfZ2FkZ2V0X3ZidXNfY29ubmVjdChvdGctPmdhZGdldCk7CiAKIAkJLyogZHJhd2luZyBhICJ1bml0IGxvYWQiIGlzICphbHdheXMqIE9LLCBleGNlcHQgZm9yIE9URyAqLwogCQlub3Bfc2V0X3ZidXNfZHJhdyhub3AsIDEwMCk7CkBAIC0xMjksOCArMTI3LDYgQEAKIAl9IGVsc2UgewogCQlub3Bfc2V0X3ZidXNfZHJhdyhub3AsIDApOwogCi0JCWlmIChvdGctPmdhZGdldCkKLQkJCXVzYl9nYWRnZXRfdmJ1c19kaXNjb25uZWN0KG90Zy0+Z2FkZ2V0KTsKIAkJc3RhdHVzID0gVVNCX0VWRU5UX05PTkU7CiAJCW90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQl9JRExFOwogCQlub3AtPnBoeS5sYXN0X2V2ZW50ID0gc3RhdHVzOwpAQCAtMTQ0LDE0ICsxNDAsMTggQEAKIGludCB1c2JfZ2VuX3BoeV9pbml0KHN0cnVjdCB1c2JfcGh5ICpwaHkpCiB7CiAJc3RydWN0IHVzYl9waHlfZ2VuZXJpYyAqbm9wID0gZGV2X2dldF9kcnZkYXRhKHBoeS0+ZGV2KTsKKwlpbnQgcmV0OwogCiAJaWYgKCFJU19FUlIobm9wLT52Y2MpKSB7CiAJCWlmIChyZWd1bGF0b3JfZW5hYmxlKG5vcC0+dmNjKSkKIAkJCWRldl9lcnIocGh5LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHBvd2VyXG4iKTsKIAl9CiAKLQlpZiAoIUlTX0VSUihub3AtPmNsaykpCi0JCWNsa19wcmVwYXJlX2VuYWJsZShub3AtPmNsayk7CisJaWYgKCFJU19FUlIobm9wLT5jbGspKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShub3AtPmNsayk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCW5vcF9yZXNldChub3ApOwogCkBAIC0xODcsNyArMTg3LDggQEAKIAogCW90Zy0+Z2FkZ2V0ID0gZ2FkZ2V0OwogCWlmIChvdGctPnN0YXRlID09IE9UR19TVEFURV9CX1BFUklQSEVSQUwpCi0JCXVzYl9nYWRnZXRfdmJ1c19jb25uZWN0KGdhZGdldCk7CisJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZvdGctPnVzYl9waHktPm5vdGlmaWVyLAorCQkJCQkgICBVU0JfRVZFTlRfVkJVUywgb3RnLT5nYWRnZXQpOwogCWVsc2UKIAkJb3RnLT5zdGF0ZSA9IE9UR19TVEFURV9CX0lETEU7CiAJcmV0dXJuIDA7CkBAIC0zMjIsNiArMzIzLDggQEAKIAkJCQlncGlvZF90b19pcnEobm9wLT5ncGlvZF92YnVzKSwgZXJyKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KKwkJbm9wLT5waHkub3RnLT5zdGF0ZSA9IGdwaW9kX2dldF92YWx1ZShub3AtPmdwaW9kX3ZidXMpID8KKwkJCU9UR19TVEFURV9CX1BFUklQSEVSQUwgOiBPVEdfU1RBVEVfQl9JRExFOwogCX0KIAogCW5vcC0+cGh5LmluaXQJCT0gdXNiX2dlbl9waHlfaW5pdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9waHktbXhzLXVzYi5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1teHMtdXNiLmMKaW5kZXggMDBiZmVhMC4uMGUyZjFhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L3BoeS1teHMtdXNiLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L3BoeS1teHMtdXNiLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNkZWZpbmUgRFJJVkVSX05BTUUgIm14c19waHkiCiAKICNkZWZpbmUgSFdfVVNCUEhZX1BXRAkJCQkweDAwCisjZGVmaW5lIEhXX1VTQlBIWV9UWAkJCQkweDEwCiAjZGVmaW5lIEhXX1VTQlBIWV9DVFJMCQkJCTB4MzAKICNkZWZpbmUgSFdfVVNCUEhZX0NUUkxfU0VUCQkJMHgzNAogI2RlZmluZSBIV19VU0JQSFlfQ1RSTF9DTFIJCQkweDM4CkBAIC0zOCw2ICszOSwxMCBAQAogI2RlZmluZSBIV19VU0JQSFlfSVBfU0VUCQkJMHg5NAogI2RlZmluZSBIV19VU0JQSFlfSVBfQ0xSCQkJMHg5OAogCisjZGVmaW5lIEdNX1VTQlBIWV9UWF9UWENBTDQ1RFAoeCkgICAgICAgICAgICAoKCh4KSAmIDB4ZikgPDwgMTYpCisjZGVmaW5lIEdNX1VTQlBIWV9UWF9UWENBTDQ1RE4oeCkgICAgICAgICAgICAoKCh4KSAmIDB4ZikgPDwgOCkKKyNkZWZpbmUgR01fVVNCUEhZX1RYX0RfQ0FMKHgpICAgICAgICAgICAgICAgICgoKHgpICYgMHhmKSA8PCAwKQorCiAjZGVmaW5lIEJNX1VTQlBIWV9DVFJMX1NGVFJTVAkJCUJJVCgzMSkKICNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfQ0xLR0FURQkJCUJJVCgzMCkKICNkZWZpbmUgQk1fVVNCUEhZX0NUUkxfT1RHX0lEX1ZBTFVFCQlCSVQoMjcpCkBAIC0xMTUsNiArMTIwLDEyIEBACiAgKi8KICNkZWZpbmUgTVhTX1BIWV9ORUVEX0lQX0ZJWAkJCUJJVCgzKQogCisvKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBmb3IgZGV2aWNlIHRyZWUgZW50cmllcyAqLworI2RlZmluZSBNWFNfUEhZX1RYX0NBTDQ1X01JTgkJCTMwCisjZGVmaW5lIE1YU19QSFlfVFhfQ0FMNDVfTUFYCQkJNTUKKyNkZWZpbmUgTVhTX1BIWV9UWF9EX0NBTF9NSU4JCQk3OQorI2RlZmluZSBNWFNfUEhZX1RYX0RfQ0FMX01BWAkJCTExOQorCiBzdHJ1Y3QgbXhzX3BoeV9kYXRhIHsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiB9OwpAQCAtMTY0LDYgKzE3NSw4IEBACiAJY29uc3Qgc3RydWN0IG14c19waHlfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfYW5hdG9wOwogCWludCBwb3J0X2lkOworCXUzMiB0eF9yZWdfc2V0OworCXUzMiB0eF9yZWdfbWFzazsKIH07CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19pbXg2cV9waHkoc3RydWN0IG14c19waHkgKm14c19waHkpCkBAIC0xODUsNiArMTk4LDIwIEBACiAJdXNsZWVwX3JhbmdlKDMwMCwgNDAwKTsKIH0KIAorc3RhdGljIHZvaWQgbXhzX3BoeV90eF9pbml0KHN0cnVjdCBteHNfcGh5ICpteHNfcGh5KQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9IG14c19waHktPnBoeS5pb19wcml2OworCXUzMiBwaHl0eDsKKworCS8qIFVwZGF0ZSBUWCByZWdpc3RlciBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byB3cml0ZSAqLworCWlmIChteHNfcGh5LT50eF9yZWdfbWFzaykgeworCQlwaHl0eCA9IHJlYWRsKGJhc2UgKyBIV19VU0JQSFlfVFgpOworCQlwaHl0eCAmPSB+bXhzX3BoeS0+dHhfcmVnX21hc2s7CisJCXBoeXR4IHw9IG14c19waHktPnR4X3JlZ19zZXQ7CisJCXdyaXRlbChwaHl0eCwgYmFzZSArIEhXX1VTQlBIWV9UWCk7CisJfQorfQorCiBzdGF0aWMgaW50IG14c19waHlfaHdfaW5pdChzdHJ1Y3QgbXhzX3BoeSAqbXhzX3BoeSkKIHsKIAlpbnQgcmV0OwpAQCAtMjE0LDYgKzI0MSw4IEBACiAJaWYgKG14c19waHktPmRhdGEtPmZsYWdzICYgTVhTX1BIWV9ORUVEX0lQX0ZJWCkKIAkJd3JpdGVsKEJNX1VTQlBIWV9JUF9GSVgsIGJhc2UgKyBIV19VU0JQSFlfSVBfU0VUKTsKIAorCW14c19waHlfdHhfaW5pdChteHNfcGh5KTsKKwogCXJldHVybiAwOwogfQogCkBAIC00NTksNiArNDg4LDcgQEAKIAlpbnQgcmV0OwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwl1MzIgdmFsOwogCiAJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2UobXhzX3BoeV9kdF9pZHMsICZwZGV2LT5kZXYpOwogCWlmICghb2ZfaWQpCkBAIC00OTEsNiArNTIxLDM3IEBACiAJCX0KIAl9CiAKKwkvKiBQcmVjb21wdXRlIHdoaWNoIGJpdHMgb2YgdGhlIFRYIHJlZ2lzdGVyIGFyZSB0byBiZSB1cGRhdGVkLCBpZiBhbnkgKi8KKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZnNsLHR4LWNhbC00NS1kbi1vaG1zIiwgJnZhbCkgJiYKKwkgICAgdmFsID49IE1YU19QSFlfVFhfQ0FMNDVfTUlOICYmIHZhbCA8PSBNWFNfUEhZX1RYX0NBTDQ1X01BWCkgeworCQkvKiBTY2FsZSB0byBhIDQtYml0IHZhbHVlICovCisJCXZhbCA9IChNWFNfUEhZX1RYX0NBTDQ1X01BWCAtIHZhbCkgKiAweEYKKwkJCS8gKE1YU19QSFlfVFhfQ0FMNDVfTUFYIC0gTVhTX1BIWV9UWF9DQUw0NV9NSU4pOworCQlteHNfcGh5LT50eF9yZWdfbWFzayB8PSBHTV9VU0JQSFlfVFhfVFhDQUw0NUROKH4wKTsKKwkJbXhzX3BoeS0+dHhfcmVnX3NldCAgfD0gR01fVVNCUEhZX1RYX1RYQ0FMNDVETih2YWwpOworCX0KKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmc2wsdHgtY2FsLTQ1LWRwLW9obXMiLCAmdmFsKSAmJgorCSAgICB2YWwgPj0gTVhTX1BIWV9UWF9DQUw0NV9NSU4gJiYgdmFsIDw9IE1YU19QSFlfVFhfQ0FMNDVfTUFYKSB7CisJCS8qIFNjYWxlIHRvIGEgNC1iaXQgdmFsdWUuICovCisJCXZhbCA9IChNWFNfUEhZX1RYX0NBTDQ1X01BWCAtIHZhbCkgKiAweEYKKwkJCS8gKE1YU19QSFlfVFhfQ0FMNDVfTUFYIC0gTVhTX1BIWV9UWF9DQUw0NV9NSU4pOworCQlteHNfcGh5LT50eF9yZWdfbWFzayB8PSBHTV9VU0JQSFlfVFhfVFhDQUw0NURQKH4wKTsKKwkJbXhzX3BoeS0+dHhfcmVnX3NldCAgfD0gR01fVVNCUEhZX1RYX1RYQ0FMNDVEUCh2YWwpOworCX0KKworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmc2wsdHgtZC1jYWwiLCAmdmFsKSAmJgorCSAgICB2YWwgPj0gTVhTX1BIWV9UWF9EX0NBTF9NSU4gJiYgdmFsIDw9IE1YU19QSFlfVFhfRF9DQUxfTUFYKSB7CisJCS8qIFNjYWxlIHRvIGEgNC1iaXQgdmFsdWUuICBSb3VuZCB1cCB0aGUgdmFsdWVzIGFuZCBoZWF2aWx5CisJCSAqIHdlaWdodCB0aGUgcm91bmRpbmcgYnkgYWRkaW5nIDIvMyBvZiB0aGUgZGVub21pbmF0b3IuCisJCSAqLworCQl2YWwgPSAoKE1YU19QSFlfVFhfRF9DQUxfTUFYIC0gdmFsKSAqIDB4RgorCQkJKyAoTVhTX1BIWV9UWF9EX0NBTF9NQVggLSBNWFNfUEhZX1RYX0RfQ0FMX01JTikgKiAyLzMpCisJCQkvIChNWFNfUEhZX1RYX0RfQ0FMX01BWCAtIE1YU19QSFlfVFhfRF9DQUxfTUlOKTsKKwkJbXhzX3BoeS0+dHhfcmVnX21hc2sgfD0gR01fVVNCUEhZX1RYX0RfQ0FMKH4wKTsKKwkJbXhzX3BoeS0+dHhfcmVnX3NldCAgfD0gR01fVVNCUEhZX1RYX0RfQ0FMKHZhbCk7CisJfQorCiAJcmV0ID0gb2ZfYWxpYXNfZ2V0X2lkKG5wLCAidXNicGh5Iik7CiAJaWYgKHJldCA8IDApCiAJCWRldl9kYmcoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgYWxpYXMgaWQsIGVycm5vICVkXG4iLCByZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9jb21tb24uYyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvY29tbW9uLmMKaW5kZXggYWM2N2JhYi4uMDEyYTM3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9jb21tb24uYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2NvbW1vbi5jCkBAIC00ODIsNiArNDgyLDEwIEBACiAJCS5kYXRhID0gKHZvaWQgKilVU0JIU19UWVBFX1JDQVJfR0VOMywKIAl9LAogCXsKKwkJLmNvbXBhdGlibGUgPSAicmVuZXNhcyx1c2Jocy1yOGE3Nzk2IiwKKwkJLmRhdGEgPSAodm9pZCAqKVVTQkhTX1RZUEVfUkNBUl9HRU4zLAorCX0sCisJewogCQkuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJjYXItZ2VuMi11c2JocyIsCiAJCS5kYXRhID0gKHZvaWQgKilVU0JIU19UWVBFX1JDQVJfR0VOMiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2QuYyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kLmMKaW5kZXggZDRiZTVkNS4uMjg5NjVlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2QuYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZC5jCkBAIC0yODIsOSArMjgyLDE2IEBACiAJaWYgKHVzYmhzX21vZF9pc19ob3N0KHByaXYpKQogCQl1c2Joc193cml0ZShwcml2LCBJTlRTVFMxLCB+aXJxX3N0YXRlLmludHN0czEgJiBJTlRTVFMxX01BR0lDKTsKIAotCXVzYmhzX3dyaXRlKHByaXYsIEJSRFlTVFMsIH5pcnFfc3RhdGUuYnJkeXN0cyk7CisJLyoKKwkgKiBUaGUgZHJpdmVyIHNob3VsZCBub3QgY2xlYXIgdGhlIHh4eFNUUyBhZnRlciB0aGUgbGluZSBvZgorCSAqICJjYWxsIGlycSBjYWxsYmFjayBmdW5jdGlvbnMiIGJlY2F1c2UgZWFjaCAiaWYiIHN0YXRlbWVudCBpcworCSAqIHBvc3NpYmxlIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBhdm9pZGluZyBhbnkgc2lkZSBlZmZlY3RzLgorCSAqLworCWlmIChpcnFfc3RhdGUuaW50c3RzMCAmIEJSRFkpCisJCXVzYmhzX3dyaXRlKHByaXYsIEJSRFlTVFMsIH5pcnFfc3RhdGUuYnJkeXN0cyk7CiAJdXNiaHNfd3JpdGUocHJpdiwgTlJEWVNUUywgfmlycV9zdGF0ZS5ucmR5c3RzKTsKLQl1c2Joc193cml0ZShwcml2LCBCRU1QU1RTLCB+aXJxX3N0YXRlLmJlbXBzdHMpOworCWlmIChpcnFfc3RhdGUuaW50c3RzMCAmIEJFTVApCisJCXVzYmhzX3dyaXRlKHByaXYsIEJFTVBTVFMsIH5pcnFfc3RhdGUuYmVtcHN0cyk7CiAKIAkvKgogCSAqIGNhbGwgaXJxIGNhbGxiYWNrIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYwppbmRleCA5MmJjODNiLi41YmM3YTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYwpAQCAtMzM1LDcgKzMzNSw2IEBACiAJYnVmID0ga21hbGxvYyhzaXplb2YoKmJ1ZiksIEdGUF9BVE9NSUMpOwogCWlmICghYnVmKSB7CiAJCXVzYl9lcF9mcmVlX3JlcXVlc3QoJmRjcC0+ZXAsIHJlcSk7Ci0JCWRldl9lcnIoZGV2LCAicmVjaXAgZGF0YSBhbGxvY2F0aW9uIGZhaWxcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDYyLDIxICsxMDYxLDE4IEBACiAJaW50IHJldDsKIAogCWdwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYmhzZ19ncHJpdiksIEdGUF9LRVJORUwpOwotCWlmICghZ3ByaXYpIHsKLQkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgZ2FkZ2V0IHByaXZcbiIpOworCWlmICghZ3ByaXYpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXVlcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Joc2dfdWVwKSAqIHBpcGVfc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1ZXApIHsKLQkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgZXBcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIHVzYmhzX21vZF9nYWRnZXRfcHJvYmVfZXJyX2dwcml2OwogCX0KIAogCWdwcml2LT50cmFuc2NlaXZlciA9IHVzYl9nZXRfcGh5KFVTQl9QSFlfVFlQRV9VTkRFRklORUQpOwogCWRldl9pbmZvKGRldiwgIiVzdHJhbnNjZWl2ZXIgZm91bmRcbiIsCi0JCSBncHJpdi0+dHJhbnNjZWl2ZXIgPyAiIiA6ICJubyAiKTsKKwkJICFJU19FUlIoZ3ByaXYtPnRyYW5zY2VpdmVyKSA/ICIiIDogIm5vICIpOwogCiAJLyoKIAkgKiBDQVVUSU9OCkBAIC0xMTA2LDYgKzExMDIsOCBAQAogCWdwcml2LT5nYWRnZXQubmFtZQkJPSAicmVuZXNhc191c2Joc191ZGMiOwogCWdwcml2LT5nYWRnZXQub3BzCQk9ICZ1c2Joc2dfZ2FkZ2V0X29wczsKIAlncHJpdi0+Z2FkZ2V0Lm1heF9zcGVlZAkJPSBVU0JfU1BFRURfSElHSDsKKwlncHJpdi0+Z2FkZ2V0LnF1aXJrX2F2b2lkc19za2JfcmVzZXJ2ZSA9IHVzYmhzX2dldF9kcGFyYW0ocHJpdiwKKwkJCQkJCQkJaGFzX3VzYl9kbWFjKTsKIAogCUlOSVRfTElTVF9IRUFEKCZncHJpdi0+Z2FkZ2V0LmVwX2xpc3QpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9ob3N0LmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9ob3N0LmMKaW5kZXggM2JmMGI3Mi4uMTY1ZTgxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfaG9zdC5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2hvc3QuYwpAQCAtMTY2LDE0ICsxNjYsMTAgQEAKIAkJCQkJICAgICAgIGdmcF90IG1lbV9mbGFncykKIHsKIAlzdHJ1Y3QgdXNiaHNoX3JlcXVlc3QgKnVyZXE7Ci0Jc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc2hfaHByaXZfdG9fcHJpdihocHJpdik7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gdXNiaHNfcHJpdl90b19kZXYocHJpdik7CiAKIAl1cmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzYmhzaF9yZXF1ZXN0KSwgbWVtX2ZsYWdzKTsKLQlpZiAoIXVyZXEpIHsKLQkJZGV2X2VycihkZXYsICJ1cmVxIGFsbG9jIGZhaWxcbiIpOworCWlmICghdXJlcSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJdXNiaHNfcGt0X2luaXQoJnVyZXEtPnBrdCk7CiAJdXJlcS0+dXJiID0gdXJiOwpAQCAtMzg4LDEwICszODQsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAl1ZXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiaHNoX2VwKSwgbWVtX2ZsYWdzKTsKLQlpZiAoIXVlcCkgewotCQlkZXZfZXJyKGRldiwgInVzYmhzaF9lcCBhbGxvYyBmYWlsXG4iKTsKKwlpZiAoIXVlcCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyoqKioqKioqKioqKioqKioqKioqICBzcGluIGxvY2sgKioqKioqKioqKioqKioqKioqKiovCiAJdXNiaHNfbG9jayhwcml2LCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3BpcGUuYyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvcGlwZS5jCmluZGV4IGMyMzg3NzIuLjkzOTZhOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvcGlwZS5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvcGlwZS5jCkBAIC04MDQsMTAgKzgwNCw4IEBACiAJfQogCiAJaW5mby0+cGlwZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2Joc19waXBlKSAqIHBpcGVfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbmZvLT5waXBlKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIHBpcGVcbiIpOworCWlmICghaW5mby0+cGlwZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJaW5mby0+c2l6ZSA9IHBpcGVfc2l6ZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEweC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEweC5jCmluZGV4IDRkNmE1YzYuLjU0YTRkZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMHguYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTB4LmMKQEAgLTExOCw2ICsxMTgsNyBAQAogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODQxMSkgfSwgLyogS3lvY2VyYSBHUFMgTW9kdWxlICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4NDE4KSB9LCAvKiBJUlogQXV0b21hdGlvbiBUZWxlcG9ydCBTRy0xMCBHU00vR1BSUyBNb2RlbSAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODQ2RSkgfSwgLyogQkVJIFVTQiBTZW5zb3IgSW50ZXJmYWNlIChWQ1ApICovCisJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4NDcwKSB9LCAvKiBKdW5pcGVyIE5ldHdvcmtzIEJYIFNlcmllcyBTeXN0ZW0gQ29uc29sZSAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODQ3NykgfSwgLyogQmFsbHVmZiBSRklEICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4NEI2KSB9LCAvKiBTdGFyaXpvbmEgSHlwZXJpb24gKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDg1RUEpIH0sIC8qIEFDLVNlcnZpY2VzIElCVVMtSUYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKaW5kZXggNGY3ZTA3Mi4uZTQ5YWQwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKQEAgLTMwLDEyICszMCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi9lenVzYi5oPgogCiAvKiBtYWtlIGEgc2ltcGxlIGRlZmluZSB0byBoYW5kbGUgaWYgd2UgYXJlIGNvbXBpbGluZyBrZXlzcGFuX3BkYSBvciB4aXJjb20gc3VwcG9ydCAqLwotI2lmIGRlZmluZWQoQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9QREEpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9QREFfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTl9QREEpCiAJI2RlZmluZSBLRVlTUEFOCiAjZWxzZQogCSN1bmRlZiBLRVlTUEFOCiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19VU0JfU0VSSUFMX1hJUkNPTSkgfHwgZGVmaW5lZChDT05GSUdfVVNCX1NFUklBTF9YSVJDT01fTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1VTQl9TRVJJQUxfWElSQ09NKQogCSNkZWZpbmUgWElSQ09NCiAjZWxzZQogCSN1bmRlZiBYSVJDT00KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCmluZGV4IDU2MDhhZjQuLmRlOTk5MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYwpAQCAtMTI1Miw3ICsxMjUyLDcgQEAKIAogCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7CiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUsCi0JCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJCQkJICAgICAgIEdGUF9BVE9NSUMpOwogCQlpZiAoIXVyYi0+dHJhbnNmZXJfYnVmZmVyKQogCQkJZ290byBleGl0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCmluZGV4IGVkMzc4ZmIuLjU3NDI2ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwpAQCAtMTM0MCw4ICsxMzQwLDggQEAKIAl9CiAKIAlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewotCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9Ci0JCSAgICBrbWFsbG9jKFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0ga21hbGxvYyhVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUsCisJCQkJCSAgICAgICBHRlBfQVRPTUlDKTsKIAkJaWYgKCF1cmItPnRyYW5zZmVyX2J1ZmZlcikKIAkJCWdvdG8gZXhpdDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKaW5kZXggYmM0NzI1OC4uOTg5NGUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtNTI1LDYgKzUyNSwxMiBAQAogI2RlZmluZSBWSUFURUxFQ09NX1ZFTkRPUl9JRAkJCTB4MTVlYgogI2RlZmluZSBWSUFURUxFQ09NX1BST0RVQ1RfQ0RTNwkJCTB4MDAwMQogCisvKiBXZVRlbGVjb20gcHJvZHVjdHMgKi8KKyNkZWZpbmUgV0VURUxFQ09NX1ZFTkRPUl9JRAkJCTB4MjJkZQorI2RlZmluZSBXRVRFTEVDT01fUFJPRFVDVF9XTUQyMDAJCTB4NjgwMQorI2RlZmluZSBXRVRFTEVDT01fUFJPRFVDVF82ODAyCQkJMHg2ODAyCisjZGVmaW5lIFdFVEVMRUNPTV9QUk9EVUNUX1dNRDMwMAkJMHg2ODAzCisKIHN0cnVjdCBvcHRpb25fYmxhY2tsaXN0X2luZm8gewogCS8qIGJpdG1hc2sgb2YgaW50ZXJmYWNlIG51bWJlcnMgYmxhY2tsaXN0ZWQgZm9yIHNlbmRfc2V0dXAgKi8KIAljb25zdCB1bnNpZ25lZCBsb25nIHNlbmRzZXR1cDsKQEAgLTE5OTEsNiArMTk5Nyw5IEBACiAJeyBVU0JfREVWSUNFX0lOVEVSRkFDRV9DTEFTUygweDIwMjAsIDB4NDAwMCwgMHhmZikgfSwgICAgICAgICAgICAgICAgLyogT0xJQ0FSRDMwMCAtIE1UNjIyNSAqLwogCXsgVVNCX0RFVklDRShJTk9WSUFfVkVORE9SX0lELCBJTk9WSUFfU0VXODU4KSB9LAogCXsgVVNCX0RFVklDRShWSUFURUxFQ09NX1ZFTkRPUl9JRCwgVklBVEVMRUNPTV9QUk9EVUNUX0NEUzcpIH0sCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhXRVRFTEVDT01fVkVORE9SX0lELCBXRVRFTEVDT01fUFJPRFVDVF9XTUQyMDAsIDB4ZmYsIDB4ZmYsIDB4ZmYpIH0sCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhXRVRFTEVDT01fVkVORE9SX0lELCBXRVRFTEVDT01fUFJPRFVDVF82ODAyLCAweGZmLCAweGZmLCAweGZmKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oV0VURUxFQ09NX1ZFTkRPUl9JRCwgV0VURUxFQ09NX1BST0RVQ1RfV01EMzAwLCAweGZmLCAweGZmLCAweGZmKSB9LAogCXsgfSAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBvcHRpb25faWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCmluZGV4IDA3YjRiZjAuLmE4YjliZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYwpAQCAtMTc5LDIzICsxNzksMjMgQEAKIAogLyogQ29uZmlnIHN0cnVjdCAqLwogc3RydWN0IHRpX3VhcnRfY29uZmlnIHsKLQlfX3UxNgl3QmF1ZFJhdGU7Ci0JX191MTYJd0ZsYWdzOwotCV9fdTgJYkRhdGFCaXRzOwotCV9fdTgJYlBhcml0eTsKLQlfX3U4CWJTdG9wQml0czsKKwlfX2JlMTYJd0JhdWRSYXRlOworCV9fYmUxNgl3RmxhZ3M7CisJdTgJYkRhdGFCaXRzOworCXU4CWJQYXJpdHk7CisJdTgJYlN0b3BCaXRzOwogCWNoYXIJY1hvbjsKIAljaGFyCWNYb2ZmOwotCV9fdTgJYlVhcnRNb2RlOworCXU4CWJVYXJ0TW9kZTsKIH0gX19wYWNrZWQ7CiAKIC8qIEdldCBwb3J0IHN0YXR1cyAqLwogc3RydWN0IHRpX3BvcnRfc3RhdHVzIHsKLQlfX3U4CWJDbWRDb2RlOwotCV9fdTgJYk1vZHVsZUlkOwotCV9fdTgJYkVycm9yQ29kZTsKLQlfX3U4CWJNU1I7Ci0JX191OAliTFNSOworCXU4IGJDbWRDb2RlOworCXU4IGJNb2R1bGVJZDsKKwl1OCBiRXJyb3JDb2RlOworCXU4IGJNU1I7CisJdTggYkxTUjsKIH0gX19wYWNrZWQ7CiAKIC8qIFB1cmdlIG1vZGVzICovCkBAIC0yMTgsMTIgKzIxOCwxMiBAQAogI2RlZmluZSBUSV9SV19EQVRBX0RPVUJMRV9XT1JECQkweDA0CiAKIHN0cnVjdCB0aV93cml0ZV9kYXRhX2J5dGVzIHsKLQlfX3U4CWJBZGRyVHlwZTsKLQlfX3U4CWJEYXRhVHlwZTsKLQlfX3U4CWJEYXRhQ291bnRlcjsKKwl1OAliQWRkclR5cGU7CisJdTgJYkRhdGFUeXBlOworCXU4CWJEYXRhQ291bnRlcjsKIAlfX2JlMTYJd0Jhc2VBZGRySGk7CiAJX19iZTE2CXdCYXNlQWRkckxvOwotCV9fdTgJYkRhdGFbMF07CisJdTgJYkRhdGFbMF07CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgdGlfcmVhZF9kYXRhX3JlcXVlc3QgewpAQCAtMjU4LDcgKzI1OCw3IEBACiAvKiBGaXJtd2FyZSBpbWFnZSBoZWFkZXIgKi8KIHN0cnVjdCB0aV9maXJtd2FyZV9oZWFkZXIgewogCV9fbGUxNgl3TGVuZ3RoOwotCV9fdTgJYkNoZWNrU3VtOworCXU4CWJDaGVja1N1bTsKIH0gX19wYWNrZWQ7CiAKIC8qIFVBUlQgYWRkcmVzc2VzICovCkBAIC0yNzYsOSArMjc2LDYgQEAKIAogI2RlZmluZSBUSV9ERUZBVUxUX0NMT1NJTkdfV0FJVAk0MDAwCQkvKiBpbiAuMDEgc2VjcyAqLwogCi0vKiBzdXBwb3J0ZWQgc2V0c2VyaWFsIGZsYWdzICovCi0jZGVmaW5lIFRJX1NFVF9TRVJJQUxfRkxBR1MJMAotCiAvKiByZWFkIHVyYiBzdGF0ZXMgKi8KICNkZWZpbmUgVElfUkVBRF9VUkJfUlVOTklORwkwCiAjZGVmaW5lIFRJX1JFQURfVVJCX1NUT1BQSU5HCTEKQEAgLTI4OCwxMSArMjg1LDEwIEBACiAKIHN0cnVjdCB0aV9wb3J0IHsKIAlpbnQJCQl0cF9pc19vcGVuOwotCV9fdTgJCQl0cF9tc3I7Ci0JX191OAkJCXRwX3NoYWRvd19tY3I7Ci0JX191OAkJCXRwX3VhcnRfbW9kZTsJLyogMjMyIG9yIDQ4NSBtb2RlcyAqLworCXU4CQkJdHBfbXNyOworCXU4CQkJdHBfc2hhZG93X21jcjsKKwl1OAkJCXRwX3VhcnRfbW9kZTsJLyogMjMyIG9yIDQ4NSBtb2RlcyAqLwogCXVuc2lnbmVkIGludAkJdHBfdWFydF9iYXNlX2FkZHI7Ci0JaW50CQkJdHBfZmxhZ3M7CiAJc3RydWN0IHRpX2RldmljZQkqdHBfdGRldjsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0CSp0cF9wb3J0OwogCXNwaW5sb2NrX3QJCXRwX2xvY2s7CkBAIC0zMDYsNyArMzAyLDYgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbAkqdGRfc2VyaWFsOwogCWludAkJCXRkX2lzXzM0MTA7CiAJYm9vbAkJCXRkX3JzNDg1X29ubHk7Ci0JaW50CQkJdGRfdXJiX2Vycm9yOwogfTsKIAogc3RhdGljIGludCB0aV9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwpAQCAtMzQzLDcgKzMzOCw3IEBACiAJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpyZXRfYXJnKTsKIHN0YXRpYyBpbnQgdGlfc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0aV9wb3J0ICp0cG9ydCwKIAlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKm5ld19hcmcpOwotc3RhdGljIHZvaWQgdGlfaGFuZGxlX25ld19tc3Ioc3RydWN0IHRpX3BvcnQgKnRwb3J0LCBfX3U4IG1zcik7CitzdGF0aWMgdm9pZCB0aV9oYW5kbGVfbmV3X21zcihzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQsIHU4IG1zcik7CiAKIHN0YXRpYyB2b2lkIHRpX3N0b3BfcmVhZChzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogc3RhdGljIGludCB0aV9yZXN0YXJ0X3JlYWQoc3RydWN0IHRpX3BvcnQgKnRwb3J0LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKQEAgLTM1NCw3ICszNDksNyBAQAogCV9fdTE2IG1vZHVsZWlkLCBfX3UxNiB2YWx1ZSwgX191OCAqZGF0YSwgaW50IHNpemUpOwogCiBzdGF0aWMgaW50IHRpX3dyaXRlX2J5dGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IHRpX2RldmljZSAqdGRldiwKLQkJCSB1bnNpZ25lZCBsb25nIGFkZHIsIF9fdTggbWFzaywgX191OCBieXRlKTsKKwkJCSB1bnNpZ25lZCBsb25nIGFkZHIsIHU4IG1hc2ssIHU4IGJ5dGUpOwogCiBzdGF0aWMgaW50IHRpX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCB0aV9kZXZpY2UgKnRkZXYpOwogCkBAIC02NDcsMTIgKzY0MiwxMSBAQAogCXN0cnVjdCB1cmIgKnVyYjsKIAlpbnQgcG9ydF9udW1iZXI7CiAJaW50IHN0YXR1czsKLQlfX3UxNiBvcGVuX3NldHRpbmdzID0gKF9fdTgpKFRJX1BJUEVfTU9ERV9DT05USU5VT1VTIHwKLQkJCSAgICAgVElfUElQRV9USU1FT1VUX0VOQUJMRSB8Ci0JCQkgICAgIChUSV9UUkFOU0ZFUl9USU1FT1VUIDw8IDIpKTsKKwl1MTYgb3Blbl9zZXR0aW5nczsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlvcGVuX3NldHRpbmdzID0gKFRJX1BJUEVfTU9ERV9DT05USU5VT1VTIHwKKwkJCSBUSV9QSVBFX1RJTUVPVVRfRU5BQkxFIHwKKwkJCSAoVElfVFJBTlNGRVJfVElNRU9VVCA8PCAyKSk7CiAKIAlkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAl0ZGV2ID0gdHBvcnQtPnRwX3RkZXY7CkBAIC02ODYsNyArNjgwLDYgQEAKIAlpZiAodHR5KQogCQl0aV9zZXRfdGVybWlvcyh0dHksIHBvcnQsICZ0dHktPnRlcm1pb3MpOwogCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzZW5kaW5nIFRJX09QRU5fUE9SVFxuIiwgX19mdW5jX18pOwogCXN0YXR1cyA9IHRpX2NvbW1hbmRfb3V0X3N5bmModGRldiwgVElfT1BFTl9QT1JULAogCQkoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgb3Blbl9zZXR0aW5ncywgTlVMTCwgMCk7CiAJaWYgKHN0YXR1cykgewpAQCAtNjk1LDcgKzY4OCw2IEBACiAJCWdvdG8gdW5saW5rX2ludF91cmI7CiAJfQogCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzZW5kaW5nIFRJX1NUQVJUX1BPUlRcbiIsIF9fZnVuY19fKTsKIAlzdGF0dXMgPSB0aV9jb21tYW5kX291dF9zeW5jKHRkZXYsIFRJX1NUQVJUX1BPUlQsCiAJCShfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCAwLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKSB7CkBAIC03MDQsNyArNjk2LDYgQEAKIAkJZ290byB1bmxpbmtfaW50X3VyYjsKIAl9CiAKLQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHNlbmRpbmcgVElfUFVSR0VfUE9SVFxuIiwgX19mdW5jX18pOwogCXN0YXR1cyA9IHRpX2NvbW1hbmRfb3V0X3N5bmModGRldiwgVElfUFVSR0VfUE9SVCwKIAkJKF9fdTgpKFRJX1VBUlQxX1BPUlQgKyBwb3J0X251bWJlciksIFRJX1BVUkdFX0lOUFVULCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKSB7CkBAIC03MjgsNyArNzE5LDYgQEAKIAlpZiAodHR5KQogCQl0aV9zZXRfdGVybWlvcyh0dHksIHBvcnQsICZ0dHktPnRlcm1pb3MpOwogCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzZW5kaW5nIFRJX09QRU5fUE9SVCAoMilcbiIsIF9fZnVuY19fKTsKIAlzdGF0dXMgPSB0aV9jb21tYW5kX291dF9zeW5jKHRkZXYsIFRJX09QRU5fUE9SVCwKIAkJKF9fdTgpKFRJX1VBUlQxX1BPUlQgKyBwb3J0X251bWJlciksIG9wZW5fc2V0dGluZ3MsIE5VTEwsIDApOwogCWlmIChzdGF0dXMpIHsKQEAgLTczNyw3ICs3MjcsNiBAQAogCQlnb3RvIHVubGlua19pbnRfdXJiOwogCX0KIAotCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gc2VuZGluZyBUSV9TVEFSVF9QT1JUICgyKVxuIiwgX19mdW5jX18pOwogCXN0YXR1cyA9IHRpX2NvbW1hbmRfb3V0X3N5bmModGRldiwgVElfU1RBUlRfUE9SVCwKIAkJKF9fdTgpKFRJX1VBUlQxX1BPUlQgKyBwb3J0X251bWJlciksIDAsIE5VTEwsIDApOwogCWlmIChzdGF0dXMpIHsKQEAgLTc0Nyw3ICs3MzYsNiBAQAogCX0KIAogCS8qIHN0YXJ0IHJlYWQgdXJiICovCi0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzdGFydCByZWFkIHVyYlxuIiwgX19mdW5jX18pOwogCXVyYiA9IHBvcnQtPnJlYWRfdXJiOwogCWlmICghdXJiKSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gbm8gcmVhZCB1cmJcbiIsIF9fZnVuY19fKTsKQEAgLTc3Myw3ICs3NjEsNiBAQAogCQl1c2Jfa2lsbF91cmIocG9ydC0+c2VyaWFsLT5wb3J0WzBdLT5pbnRlcnJ1cHRfaW5fdXJiKTsKIHJlbGVhc2VfbG9jazoKIAltdXRleF91bmxvY2soJnRkZXYtPnRkX29wZW5fY2xvc2VfbG9jayk7Ci0JZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBleGl0ICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC03ODksOCArNzc2LDYgQEAKIAogCXRkZXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHBvcnQtPnNlcmlhbCk7CiAJdHBvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JaWYgKHRkZXYgPT0gTlVMTCB8fCB0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm47CiAKIAl0cG9ydC0+dHBfaXNfb3BlbiA9IDA7CiAKQEAgLTgwMyw3ICs3ODgsNiBAQAogCiAJcG9ydF9udW1iZXIgPSBwb3J0LT5wb3J0X251bWJlcjsKIAotCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gc2VuZGluZyBUSV9DTE9TRV9QT1JUXG4iLCBfX2Z1bmNfXyk7CiAJc3RhdHVzID0gdGlfY29tbWFuZF9vdXRfc3luYyh0ZGV2LCBUSV9DTE9TRV9QT1JULAogCQkgICAgIChfX3U4KShUSV9VQVJUMV9QT1JUICsgcG9ydF9udW1iZXIpLCAwLCBOVUxMLCAwKTsKIAlpZiAoc3RhdHVzKQpAQCAtODMwLDExICs4MTQsMTAgQEAKIAlzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKIAlpZiAoY291bnQgPT0gMCkgewotCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlc1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAodHBvcnQgPT0gTlVMTCB8fCAhdHBvcnQtPnRwX2lzX29wZW4pCisJaWYgKCF0cG9ydC0+dHBfaXNfb3BlbikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAljb3VudCA9IGtmaWZvX2luX2xvY2tlZCgmcG9ydC0+d3JpdGVfZmlmbywgZGF0YSwgY291bnQsCkBAIC04NTIsOSArODM1LDYgQEAKIAlpbnQgcm9vbSA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCXJvb20gPSBrZmlmb19hdmFpbCgmcG9ydC0+d3JpdGVfZmlmbyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHBvcnQtPnRwX2xvY2ssIGZsYWdzKTsKQEAgLTg3MSw5ICs4NTEsNiBAQAogCWludCBjaGFycyA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCWNoYXJzID0ga2ZpZm9fbGVuKCZwb3J0LT53cml0ZV9maWZvKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwpAQCAtOTAwLDkgKzg3Nyw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IHRpX3BvcnQgKnRwb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCi0JaWYgKHRwb3J0ID09IE5VTEwpCi0JCXJldHVybjsKLQogCWlmIChJX0lYT0ZGKHR0eSkgfHwgQ19DUlRTQ1RTKHR0eSkpCiAJCXRpX3N0b3BfcmVhZCh0cG9ydCwgdHR5KTsKIApAQCAtOTE1LDkgKzg4OSw2IEBACiAJc3RydWN0IHRpX3BvcnQgKnRwb3J0ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCWludCBzdGF0dXM7CiAKLQlpZiAodHBvcnQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCiAJaWYgKElfSVhPRkYodHR5KSB8fCBDX0NSVFNDVFModHR5KSkgewogCQlzdGF0dXMgPSB0aV9yZXN0YXJ0X3JlYWQodHBvcnQsIHR0eSk7CiAJCWlmIChzdGF0dXMpCkBAIC05MzIsMTYgKzkwMywxMSBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOwogCXN0cnVjdCB0aV9wb3J0ICp0cG9ydCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBUSU9DR1NFUklBTDoKLQkJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBUSU9DR1NFUklBTFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gdGlfZ2V0X3NlcmlhbF9pbmZvKHRwb3J0LAogCQkJCShzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOwogCWNhc2UgVElPQ1NTRVJJQUw6Ci0JCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gVElPQ1NTRVJJQUxcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIHRpX3NldF9zZXJpYWxfaW5mbyh0dHksIHRwb3J0LAogCQkJCShzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKilhcmcpOwogCX0KQEAgLTk1OSw2ICs5MjUsOCBAQAogCWludCBzdGF0dXM7CiAJaW50IHBvcnRfbnVtYmVyID0gcG9ydC0+cG9ydF9udW1iZXI7CiAJdW5zaWduZWQgaW50IG1jcjsKKwl1MTYgd2JhdWRyYXRlOworCXUxNiB3ZmxhZ3MgPSAwOwogCiAJY2ZsYWcgPSB0dHktPnRlcm1pb3MuY19jZmxhZzsKIAlpZmxhZyA9IHR0eS0+dGVybWlvcy5jX2lmbGFnOwpAQCAtOTY3LDIxICs5MzUsMTYgQEAKIAlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyAtIG9sZCBjbGZhZyAlMDh4LCBvbGQgaWZsYWcgJTA4eFxuIiwgX19mdW5jX18sCiAJCW9sZF90ZXJtaW9zLT5jX2NmbGFnLCBvbGRfdGVybWlvcy0+Y19pZmxhZyk7CiAKLQlpZiAodHBvcnQgPT0gTlVMTCkKLQkJcmV0dXJuOwotCiAJY29uZmlnID0ga21hbGxvYyhzaXplb2YoKmNvbmZpZyksIEdGUF9LRVJORUwpOwogCWlmICghY29uZmlnKQogCQlyZXR1cm47CiAKLQljb25maWctPndGbGFncyA9IDA7Ci0KIAkvKiB0aGVzZSBmbGFncyBtdXN0IGJlIHNldCAqLwotCWNvbmZpZy0+d0ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX01TX0lOVFM7Ci0JY29uZmlnLT53RmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfQVVUT19TVEFSVF9ETUE7Ci0JY29uZmlnLT5iVWFydE1vZGUgPSAoX191OCkodHBvcnQtPnRwX3VhcnRfbW9kZSk7CisJd2ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX01TX0lOVFM7CisJd2ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX0FVVE9fU1RBUlRfRE1BOworCWNvbmZpZy0+YlVhcnRNb2RlID0gdHBvcnQtPnRwX3VhcnRfbW9kZTsKIAotCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgeworCXN3aXRjaCAoQ19DU0laRSh0dHkpKSB7CiAJY2FzZSBDUzU6CiAJCSAgICBjb25maWctPmJEYXRhQml0cyA9IFRJX1VBUlRfNV9EQVRBX0JJVFM7CiAJCSAgICBicmVhazsKQEAgLTEwMDAsMjkgKzk2MywyOSBAQAogCS8qIENNU1BBUiBpc24ndCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KIAl0dHktPnRlcm1pb3MuY19jZmxhZyAmPSB+Q01TUEFSOwogCi0JaWYgKGNmbGFnICYgUEFSRU5CKSB7Ci0JCWlmIChjZmxhZyAmIFBBUk9ERCkgewotCQkJY29uZmlnLT53RmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfUEFSSVRZX0NIRUNLSU5HOworCWlmIChDX1BBUkVOQih0dHkpKSB7CisJCWlmIChDX1BBUk9ERCh0dHkpKSB7CisJCQl3ZmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfUEFSSVRZX0NIRUNLSU5HOwogCQkJY29uZmlnLT5iUGFyaXR5ID0gVElfVUFSVF9PRERfUEFSSVRZOwogCQl9IGVsc2UgewotCQkJY29uZmlnLT53RmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfUEFSSVRZX0NIRUNLSU5HOworCQkJd2ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX1BBUklUWV9DSEVDS0lORzsKIAkJCWNvbmZpZy0+YlBhcml0eSA9IFRJX1VBUlRfRVZFTl9QQVJJVFk7CiAJCX0KIAl9IGVsc2UgewotCQljb25maWctPndGbGFncyAmPSB+VElfVUFSVF9FTkFCTEVfUEFSSVRZX0NIRUNLSU5HOworCQl3ZmxhZ3MgJj0gflRJX1VBUlRfRU5BQkxFX1BBUklUWV9DSEVDS0lORzsKIAkJY29uZmlnLT5iUGFyaXR5ID0gVElfVUFSVF9OT19QQVJJVFk7CiAJfQogCi0JaWYgKGNmbGFnICYgQ1NUT1BCKQorCWlmIChDX0NTVE9QQih0dHkpKQogCQljb25maWctPmJTdG9wQml0cyA9IFRJX1VBUlRfMl9TVE9QX0JJVFM7CiAJZWxzZQogCQljb25maWctPmJTdG9wQml0cyA9IFRJX1VBUlRfMV9TVE9QX0JJVFM7CiAKLQlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJaWYgKENfQ1JUU0NUUyh0dHkpKSB7CiAJCS8qIFJUUyBmbG93IGNvbnRyb2wgbXVzdCBiZSBvZmYgdG8gZHJvcCBSVFMgZm9yIGJhdWQgcmF0ZSBCMCAqLwotCQlpZiAoKGNmbGFnICYgQ0JBVUQpICE9IEIwKQotCQkJY29uZmlnLT53RmxhZ3MgfD0gVElfVUFSVF9FTkFCTEVfUlRTX0lOOwotCQljb25maWctPndGbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9DVFNfT1VUOworCQlpZiAoKENfQkFVRCh0dHkpKSAhPSBCMCkKKwkJCXdmbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9SVFNfSU47CisJCXdmbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9DVFNfT1VUOwogCX0gZWxzZSB7CiAJCXRpX3Jlc3RhcnRfcmVhZCh0cG9ydCwgdHR5KTsKIAl9CkBAIC0xMDMyLDM0ICs5OTUsMzQgQEAKIAkJY29uZmlnLT5jWG9mZiA9IFNUT1BfQ0hBUih0dHkpOwogCiAJCWlmIChJX0lYT0ZGKHR0eSkpCi0JCQljb25maWctPndGbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9YX0lOOworCQkJd2ZsYWdzIHw9IFRJX1VBUlRfRU5BQkxFX1hfSU47CiAJCWVsc2UKIAkJCXRpX3Jlc3RhcnRfcmVhZCh0cG9ydCwgdHR5KTsKIAogCQlpZiAoSV9JWE9OKHR0eSkpCi0JCQljb25maWctPndGbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9YX09VVDsKKwkJCXdmbGFncyB8PSBUSV9VQVJUX0VOQUJMRV9YX09VVDsKIAl9CiAKIAliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUodHR5KTsKIAlpZiAoIWJhdWQpCiAJCWJhdWQgPSA5NjAwOwogCWlmICh0cG9ydC0+dHBfdGRldi0+dGRfaXNfMzQxMCkKLQkJY29uZmlnLT53QmF1ZFJhdGUgPSAoX191MTYpKCg5MjMwNzcgKyBiYXVkLzIpIC8gYmF1ZCk7CisJCXdiYXVkcmF0ZSA9ICg5MjMwNzcgKyBiYXVkLzIpIC8gYmF1ZDsKIAllbHNlCi0JCWNvbmZpZy0+d0JhdWRSYXRlID0gKF9fdTE2KSgoNDYxNTM4ICsgYmF1ZC8yKSAvIGJhdWQpOworCQl3YmF1ZHJhdGUgPSAoNDYxNTM4ICsgYmF1ZC8yKSAvIGJhdWQ7CiAKIAkvKiBGSVhNRTogU2hvdWxkIGNhbGN1bGF0ZSByZXN1bHRpbmcgYmF1ZCBoZXJlIGFuZCByZXBvcnQgaXQgYmFjayAqLwotCWlmICgoY2ZsYWcgJiBDQkFVRCkgIT0gQjApCisJaWYgKChDX0JBVUQodHR5KSkgIT0gQjApCiAJCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZCwgYmF1ZCk7CiAKIAlkZXZfZGJnKCZwb3J0LT5kZXYsCiAJCSIlcyAtIEJhdWRSYXRlPSVkLCB3QmF1ZFJhdGU9JWQsIHdGbGFncz0weCUwNFgsIGJEYXRhQml0cz0lZCwgYlBhcml0eT0lZCwgYlN0b3BCaXRzPSVkLCBjWG9uPSVkLCBjWG9mZj0lZCwgYlVhcnRNb2RlPSVkXG4iLAotCQlfX2Z1bmNfXywgYmF1ZCwgY29uZmlnLT53QmF1ZFJhdGUsIGNvbmZpZy0+d0ZsYWdzLAorCQlfX2Z1bmNfXywgYmF1ZCwgd2JhdWRyYXRlLCB3ZmxhZ3MsCiAJCWNvbmZpZy0+YkRhdGFCaXRzLCBjb25maWctPmJQYXJpdHksIGNvbmZpZy0+YlN0b3BCaXRzLAogCQljb25maWctPmNYb24sIGNvbmZpZy0+Y1hvZmYsIGNvbmZpZy0+YlVhcnRNb2RlKTsKIAotCWNwdV90b19iZTE2cygmY29uZmlnLT53QmF1ZFJhdGUpOwotCWNwdV90b19iZTE2cygmY29uZmlnLT53RmxhZ3MpOworCWNvbmZpZy0+d0JhdWRSYXRlID0gY3B1X3RvX2JlMTYod2JhdWRyYXRlKTsKKwljb25maWctPndGbGFncyA9IGNwdV90b19iZTE2KHdmbGFncyk7CiAKIAlzdGF0dXMgPSB0aV9jb21tYW5kX291dF9zeW5jKHRwb3J0LT50cF90ZGV2LCBUSV9TRVRfQ09ORklHLAogCQkoX191OCkoVElfVUFSVDFfUE9SVCArIHBvcnRfbnVtYmVyKSwgMCwgKF9fdTggKiljb25maWcsCkBAIC0xMDcxLDcgKzEwMzQsNyBAQAogCS8qIFNFVF9DT05GSUcgYXNzZXJ0cyBSVFMgYW5kIERUUiwgcmVzZXQgdGhlbSBjb3JyZWN0bHkgKi8KIAltY3IgPSB0cG9ydC0+dHBfc2hhZG93X21jcjsKIAkvKiBpZiBiYXVkIHJhdGUgaXMgQjAsIGNsZWFyIFJUUyBhbmQgRFRSICovCi0JaWYgKChjZmxhZyAmIENCQVVEKSA9PSBCMCkKKwlpZiAoQ19CQVVEKHR0eSkgPT0gQjApCiAJCW1jciAmPSB+KFRJX01DUl9EVFIgfCBUSV9NQ1JfUlRTKTsKIAlzdGF0dXMgPSB0aV9zZXRfbWNyKHRwb3J0LCBtY3IpOwogCWlmIChzdGF0dXMpCkBAIC0xMDkyLDkgKzEwNTUsNiBAQAogCXVuc2lnbmVkIGludCBtY3I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCW1zciA9IHRwb3J0LT50cF9tc3I7CiAJbWNyID0gdHBvcnQtPnRwX3NoYWRvd19tY3I7CkBAIC0xMTIyLDkgKzEwODIsNiBAQAogCXVuc2lnbmVkIGludCBtY3I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh0cG9ydCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cG9ydC0+dHBfbG9jaywgZmxhZ3MpOwogCW1jciA9IHRwb3J0LT50cF9zaGFkb3dfbWNyOwogCkBAIC0xMTU1LDkgKzExMTIsNiBAQAogCiAJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgLSBzdGF0ZSA9ICVkXG4iLCBfX2Z1bmNfXywgYnJlYWtfc3RhdGUpOwogCi0JaWYgKHRwb3J0ID09IE5VTEwpCi0JCXJldHVybjsKLQogCXN0YXR1cyA9IHRpX3dyaXRlX2J5dGUocG9ydCwgdHBvcnQtPnRwX3RkZXYsCiAJCXRwb3J0LT50cF91YXJ0X2Jhc2VfYWRkciArIFRJX1VBUlRfT0ZGU0VUX0xDUiwKIAkJVElfTENSX0JSRUFLLCBicmVha19zdGF0ZSA9PSAtMSA/IFRJX0xDUl9CUkVBSyA6IDApOwpAQCAtMTE4OSw3ICsxMTQzLDcgQEAKIAlpbnQgZnVuY3Rpb247CiAJaW50IHN0YXR1cyA9IHVyYi0+c3RhdHVzOwogCWludCByZXR2YWw7Ci0JX191OCBtc3I7CisJdTggbXNyOwogCiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIDA6CkBAIC0xMTk4LDExICsxMTUyLDkgQEAKIAljYXNlIC1FTk9FTlQ6CiAJY2FzZSAtRVNIVVRET1dOOgogCQlkZXZfZGJnKGRldiwgIiVzIC0gdXJiIHNodXR0aW5nIGRvd24sICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoZGV2LCAiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMsICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTI3NSwxMiArMTIyNywxMCBAQAogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046CiAJCWRldl9kYmcoZGV2LCAiJXMgLSB1cmIgc2h1dHRpbmcgZG93biwgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOwotCQl0cG9ydC0+dHBfdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoZGV2LCAiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMsICVkXG4iLAogCQkJX19mdW5jX18sIHN0YXR1cyk7Ci0JCXRwb3J0LT50cF90ZGV2LT50ZF91cmJfZXJyb3IgPSAxOwogCX0KIAogCWlmIChzdGF0dXMgPT0gLUVQSVBFKQpAQCAtMTMzNSwxMiArMTI4NSwxMCBAQAogCWNhc2UgLUVOT0VOVDoKIAljYXNlIC1FU0hVVERPV046CiAJCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdXJiIHNodXR0aW5nIGRvd24sICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKLQkJdHBvcnQtPnRwX3RkZXYtPnRkX3VyYl9lcnJvciA9IDE7CiAJCXJldHVybjsKIAlkZWZhdWx0OgogCQlkZXZfZXJyX2NvbnNvbGUocG9ydCwgIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzLCAlZFxuIiwKIAkJCV9fZnVuY19fLCBzdGF0dXMpOwotCQl0cG9ydC0+dHBfdGRldi0+dGRfdXJiX2Vycm9yID0gMTsKIAl9CiAKIAkvKiBzZW5kIGFueSBidWZmZXJlZCBkYXRhICovCkBAIC0xNDkwLDcgKzE0MzgsNiBAQAogCXJldF9zZXJpYWwudHlwZSA9IFBPUlRfMTY1NTBBOwogCXJldF9zZXJpYWwubGluZSA9IHBvcnQtPm1pbm9yOwogCXJldF9zZXJpYWwucG9ydCA9IHBvcnQtPnBvcnRfbnVtYmVyOwotCXJldF9zZXJpYWwuZmxhZ3MgPSB0cG9ydC0+dHBfZmxhZ3M7CiAJcmV0X3NlcmlhbC54bWl0X2ZpZm9fc2l6ZSA9IGtmaWZvX3NpemUoJnBvcnQtPndyaXRlX2ZpZm8pOwogCXJldF9zZXJpYWwuYmF1ZF9iYXNlID0gdHBvcnQtPnRwX3RkZXYtPnRkX2lzXzM0MTAgPyA5MjE2MDAgOiA0NjA4MDA7CiAJcmV0X3NlcmlhbC5jbG9zaW5nX3dhaXQgPSBjd2FpdDsKQEAgLTE1MTUsMTQgKzE0NjIsMTMgQEAKIAlpZiAoY3dhaXQgIT0gQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUpCiAJCWN3YWl0ID0gbXNlY3NfdG9famlmZmllcygxMCAqIG5ld19zZXJpYWwuY2xvc2luZ193YWl0KTsKIAotCXRwb3J0LT50cF9mbGFncyA9IG5ld19zZXJpYWwuZmxhZ3MgJiBUSV9TRVRfU0VSSUFMX0ZMQUdTOwogCXRwb3J0LT50cF9wb3J0LT5wb3J0LmNsb3Npbmdfd2FpdCA9IGN3YWl0OwogCiAJcmV0dXJuIDA7CiB9CiAKIAotc3RhdGljIHZvaWQgdGlfaGFuZGxlX25ld19tc3Ioc3RydWN0IHRpX3BvcnQgKnRwb3J0LCBfX3U4IG1zcikKK3N0YXRpYyB2b2lkIHRpX2hhbmRsZV9uZXdfbXNyKHN0cnVjdCB0aV9wb3J0ICp0cG9ydCwgdTggbXNyKQogewogCXN0cnVjdCBhc3luY19pY291bnQgKmljb3VudDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwpAQCAtMTYzNCw4ICsxNTgwLDggQEAKIAogCiBzdGF0aWMgaW50IHRpX3dyaXRlX2J5dGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCXN0cnVjdCB0aV9kZXZpY2UgKnRkZXYsIHVuc2lnbmVkIGxvbmcgYWRkciwKLQkJCV9fdTggbWFzaywgX191OCBieXRlKQorCQkJIHN0cnVjdCB0aV9kZXZpY2UgKnRkZXYsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCSB1OCBtYXNrLCB1OCBieXRlKQogewogCWludCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IHNpemU7CkBAIC0xNjc5LDExICsxNjI1LDEwIEBACiAJaW50IGxlbjsKIAogCWZvciAocG9zID0gc2l6ZW9mKHN0cnVjdCB0aV9maXJtd2FyZV9oZWFkZXIpOyBwb3MgPCBzaXplOyBwb3MrKykKLQkJY3MgPSAoX191OCkoY3MgKyBidWZmZXJbcG9zXSk7CisJCWNzID0gKHU4KShjcyArIGJ1ZmZlcltwb3NdKTsKIAogCWhlYWRlciA9IChzdHJ1Y3QgdGlfZmlybXdhcmVfaGVhZGVyICopYnVmZmVyOwotCWhlYWRlci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KChfX3UxNikoc2l6ZQotCQkJCQktIHNpemVvZihzdHJ1Y3QgdGlfZmlybXdhcmVfaGVhZGVyKSkpOworCWhlYWRlci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUgLSBzaXplb2YoKmhlYWRlcikpOwogCWhlYWRlci0+YkNoZWNrU3VtID0gY3M7CiAKIAlkZXZfZGJnKCZkZXYtPmRldiwgIiVzIC0gZG93bmxvYWRpbmcgZmlybXdhcmVcbiIsIF9fZnVuY19fKTsKQEAgLTE3MDEsNyArMTY0Niw3IEBACiB7CiAJaW50IHN0YXR1czsKIAlpbnQgYnVmZmVyX3NpemU7Ci0JX191OCAqYnVmZmVyOworCXU4ICpidWZmZXI7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHRkZXYtPnRkX3NlcmlhbC0+ZGV2OwogCXVuc2lnbmVkIGludCBwaXBlID0gdXNiX3NuZGJ1bGtwaXBlKGRldiwKIAkJdGRldi0+dGRfc2VyaWFsLT5wb3J0WzBdLT5idWxrX291dF9lbmRwb2ludEFkZHJlc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwtc2ltcGxlLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC1zaW1wbGUuYwppbmRleCBhMjA0NzgyLi5lOThiNmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC1zaW1wbGUuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC1zaW1wbGUuYwpAQCAtNTQsNyArNTQsOCBAQAogLyogSW5maW5lb24gRmxhc2hsb2FkZXIgZHJpdmVyICovCiAjZGVmaW5lIEZMQVNITE9BREVSX0lEUygpCQlcCiAJeyBVU0JfREVWSUNFX0lOVEVSRkFDRV9DTEFTUygweDA1OGIsIDB4MDA0MSwgVVNCX0NMQVNTX0NEQ19EQVRBKSB9LCBcCi0JeyBVU0JfREVWSUNFKDB4ODA4NywgMHgwNzE2KSB9CisJeyBVU0JfREVWSUNFKDB4ODA4NywgMHgwNzE2KSB9LCBcCisJeyBVU0JfREVWSUNFKDB4ODA4NywgMHgwODAxKSB9CiBERVZJQ0UoZmxhc2hsb2FkZXIsIEZMQVNITE9BREVSX0lEUyk7CiAKIC8qIEdvb2dsZSBTZXJpYWwgVVNCIFN1YkNsYXNzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2FsYXVkYS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9hbGF1ZGEuYwppbmRleCAxZDhiMDNjLi44NzhiNGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2FsYXVkYS5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvYWxhdWRhLmMKQEAgLTkzOSwxMCArOTM5LDggQEAKIAogCWxlbiA9IG1pbihzZWN0b3JzLCBibG9ja3NpemUpICogKHBhZ2VzaXplICsgNjQpOwogCWJ1ZmZlciA9IGttYWxsb2MobGVuLCBHRlBfTk9JTyk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImFsYXVkYV9yZWFkX2RhdGE6IE91dCBvZiBtZW1vcnlcbiIpOworCWlmICghYnVmZmVyKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwotCX0KIAogCS8qIEZpZ3VyZSBvdXQgdGhlIGluaXRpYWwgTEJBIGFuZCBwYWdlICovCiAJbGJhID0gYWRkcmVzcyA+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+YkVuZHBvaW50QWRkcmVzcyksCiAJCQkgaHdhcmMtPnJkX2J1ZmZlciwgUEFHRV9TSVpFLApkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9jb25maWcuYyBiL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2lfY29uZmlnLmMKaW5kZXggNjg4NjkxZC4uNjVkNGEzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9jb25maWcuYworKysgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX2NvbmZpZy5jCkBAIC03MCw3ICs3MCw3IEBACiAKIC8qCiAgKiBMZW5ndGhzIG9mIFBDSWUvUENJLVggRXh0ZW5kZWQgQ29uZmlnIENhcGFiaWxpdGllcwotICogICAwOiBSZW1vdmVkIG9yIG1hc2tlZCBmcm9tIHRoZSB1c2VyIHZpc2libGUgY2FwYWJpbHR5IGxpc3QKKyAqICAgMDogUmVtb3ZlZCBvciBtYXNrZWQgZnJvbSB0aGUgdXNlciB2aXNpYmxlIGNhcGFiaWxpdHkgbGlzdAogICogICBGRjogVmFyaWFibGUgbGVuZ3RoCiAgKi8KIHN0YXRpYyBjb25zdCB1MTYgcGNpX2V4dF9jYXBfbGVuZ3RoW1BDSV9FWFRfQ0FQX0lEX01BWCArIDFdID0gewpAQCAtMzU1LDcgKzM1NSw3IEBACiAJICogaWdub3JlIHdoZXRoZXIgYSByZWFkL3dyaXRlIGV4Y2VlZHMgdGhlIGRlZmluZWQgY2FwYWJpbGl0eQogCSAqIHN0cnVjdHVyZS4gIFdlIGNhbiBkbyB0aGlzIGJlY2F1c2U6CiAJICogIC0gU3RhbmRhcmQgY29uZmlnIHNwYWNlIGlzIGFscmVhZHkgZHdvcmQgYWxpZ25lZAotCSAqICAtIENhcGFiaWxpdGllcyBhcmUgYWxsIGR3b3JkIGFsaW5nZWQgKGJpdHMgMDoxIG9mIG5leHQgcmVzZXJ2ZWQpCisJICogIC0gQ2FwYWJpbGl0aWVzIGFyZSBhbGwgZHdvcmQgYWxpZ25lZCAoYml0cyAwOjEgb2YgbmV4dCByZXNlcnZlZCkKIAkgKiAgLSBFeHByZXNzIGNhcGFiaWxpdGllcyBkZWZpbmVkIGFzIGR3b3JkIGFsaWduZWQKIAkgKi8KIAlzaXplID0gcm91bmRfdXAoc2l6ZSwgNCk7CkBAIC04MDQsNiArODA0LDQwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdmZpb19leHBfY29uZmlnX3dyaXRlKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYsIGludCBwb3MsCisJCQkJIGludCBjb3VudCwgc3RydWN0IHBlcm1fYml0cyAqcGVybSwKKwkJCQkgaW50IG9mZnNldCwgX19sZTMyIHZhbCkKK3sKKwlfX2xlMTYgKmN0cmwgPSAoX19sZTE2ICopKHZkZXYtPnZjb25maWcgKyBwb3MgLQorCQkJCSAgb2Zmc2V0ICsgUENJX0VYUF9ERVZDVEwpOworCisJY291bnQgPSB2ZmlvX2RlZmF1bHRfY29uZmlnX3dyaXRlKHZkZXYsIHBvcywgY291bnQsIHBlcm0sIG9mZnNldCwgdmFsKTsKKwlpZiAoY291bnQgPCAwKQorCQlyZXR1cm4gY291bnQ7CisKKwkvKgorCSAqIFRoZSBGTFIgYml0IGlzIHZpcnR1YWxpemVkLCBpZiBzZXQgYW5kIHRoZSBkZXZpY2Ugc3VwcG9ydHMgUENJZQorCSAqIEZMUiwgaXNzdWUgYSByZXNldF9mdW5jdGlvbi4gIFJlZ2FyZGxlc3MsIGNsZWFyIHRoZSBiaXQsIHRoZSBzcGVjCisJICogcmVxdWlyZXMgaXQgdG8gYmUgYWx3YXlzIHJlYWQgYXMgemVyby4gIE5CLCByZXNldF9mdW5jdGlvbiBtaWdodAorCSAqIG5vdCB1c2UgYSBQQ0llIEZMUiwgd2UgZG9uJ3QgaGF2ZSB0aGF0IGxldmVsIG9mIGdyYW51bGFyaXR5LgorCSAqLworCWlmICgqY3RybCAmIGNwdV90b19sZTE2KFBDSV9FWFBfREVWQ1RMX0JDUl9GTFIpKSB7CisJCXUzMiBjYXA7CisJCWludCByZXQ7CisKKwkJKmN0cmwgJj0gfmNwdV90b19sZTE2KFBDSV9FWFBfREVWQ1RMX0JDUl9GTFIpOworCisJCXJldCA9IHBjaV91c2VyX3JlYWRfY29uZmlnX2R3b3JkKHZkZXYtPnBkZXYsCisJCQkJCQkgcG9zIC0gb2Zmc2V0ICsgUENJX0VYUF9ERVZDQVAsCisJCQkJCQkgJmNhcCk7CisKKwkJaWYgKCFyZXQgJiYgKGNhcCAmIFBDSV9FWFBfREVWQ0FQX0ZMUikpCisJCQlwY2lfdHJ5X3Jlc2V0X2Z1bmN0aW9uKHZkZXYtPnBkZXYpOworCX0KKworCXJldHVybiBjb3VudDsKK30KKwogLyogUGVybWlzc2lvbnMgZm9yIFBDSSBFeHByZXNzIGNhcGFiaWxpdHkgKi8KIHN0YXRpYyBpbnQgX19pbml0IGluaXRfcGNpX2NhcF9leHBfcGVybShzdHJ1Y3QgcGVybV9iaXRzICpwZXJtKQogewpAQCAtODExLDI2ICs4NDUsNjQgQEAKIAlpZiAoYWxsb2NfcGVybV9iaXRzKHBlcm0sIFBDSV9DQVBfRVhQX0VORFBPSU5UX1NJWkVPRl9WMikpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcGVybS0+d3JpdGVmbiA9IHZmaW9fZXhwX2NvbmZpZ193cml0ZTsKKwogCXBfc2V0YihwZXJtLCBQQ0lfQ0FQX0xJU1RfTkVYVCwgKHU4KUFMTF9WSVJULCBOT19XUklURSk7CiAKIAkvKgotCSAqIEFsbG93IHdyaXRlcyB0byBkZXZpY2UgY29udHJvbCBmaWVsZHMgKGluY2x1ZGVzIEZMUiEpCi0JICogYnV0IG5vdCB0byBkZXZjdGxfcGhhbnRvbSB3aGljaCBjb3VsZCBjb25mdXNlIElPTU1VCi0JICogb3IgdG8gdGhlIEFSSSBiaXQgaW4gZGV2Y3RsMiB3aGljaCBpcyBzZXQgYXQgcHJvYmUgdGltZQorCSAqIEFsbG93IHdyaXRlcyB0byBkZXZpY2UgY29udHJvbCBmaWVsZHMsIGV4Y2VwdCBkZXZjdGxfcGhhbnRvbSwKKwkgKiB3aGljaCBjb3VsZCBjb25mdXNlIElPTU1VLCBhbmQgdGhlIEFSSSBiaXQgaW4gZGV2Y3RsMiwgd2hpY2gKKwkgKiBpcyBzZXQgYXQgcHJvYmUgdGltZS4gIEZMUiBnZXRzIHZpcnR1YWxpemVkIHZpYSBvdXIgd3JpdGVmbi4KIAkgKi8KLQlwX3NldHcocGVybSwgUENJX0VYUF9ERVZDVEwsIE5PX1ZJUlQsIH5QQ0lfRVhQX0RFVkNUTF9QSEFOVE9NKTsKKwlwX3NldHcocGVybSwgUENJX0VYUF9ERVZDVEwsCisJICAgICAgIFBDSV9FWFBfREVWQ1RMX0JDUl9GTFIsIH5QQ0lfRVhQX0RFVkNUTF9QSEFOVE9NKTsKIAlwX3NldHcocGVybSwgUENJX0VYUF9ERVZDVEwyLCBOT19WSVJULCB+UENJX0VYUF9ERVZDVEwyX0FSSSk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdmZpb19hZl9jb25maWdfd3JpdGUoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwgaW50IHBvcywKKwkJCQlpbnQgY291bnQsIHN0cnVjdCBwZXJtX2JpdHMgKnBlcm0sCisJCQkJaW50IG9mZnNldCwgX19sZTMyIHZhbCkKK3sKKwl1OCAqY3RybCA9IHZkZXYtPnZjb25maWcgKyBwb3MgLSBvZmZzZXQgKyBQQ0lfQUZfQ1RSTDsKKworCWNvdW50ID0gdmZpb19kZWZhdWx0X2NvbmZpZ193cml0ZSh2ZGV2LCBwb3MsIGNvdW50LCBwZXJtLCBvZmZzZXQsIHZhbCk7CisJaWYgKGNvdW50IDwgMCkKKwkJcmV0dXJuIGNvdW50OworCisJLyoKKwkgKiBUaGUgRkxSIGJpdCBpcyB2aXJ0dWFsaXplZCwgaWYgc2V0IGFuZCB0aGUgZGV2aWNlIHN1cHBvcnRzIEFGCisJICogRkxSLCBpc3N1ZSBhIHJlc2V0X2Z1bmN0aW9uLiAgUmVnYXJkbGVzcywgY2xlYXIgdGhlIGJpdCwgdGhlIHNwZWMKKwkgKiByZXF1aXJlcyBpdCB0byBiZSBhbHdheXMgcmVhZCBhcyB6ZXJvLiAgTkIsIHJlc2V0X2Z1bmN0aW9uIG1pZ2h0CisJICogbm90IHVzZSBhbiBBRiBGTFIsIHdlIGRvbid0IGhhdmUgdGhhdCBsZXZlbCBvZiBncmFudWxhcml0eS4KKwkgKi8KKwlpZiAoKmN0cmwgJiBQQ0lfQUZfQ1RSTF9GTFIpIHsKKwkJdTggY2FwOworCQlpbnQgcmV0OworCisJCSpjdHJsICY9IH5QQ0lfQUZfQ1RSTF9GTFI7CisKKwkJcmV0ID0gcGNpX3VzZXJfcmVhZF9jb25maWdfYnl0ZSh2ZGV2LT5wZGV2LAorCQkJCQkJcG9zIC0gb2Zmc2V0ICsgUENJX0FGX0NBUCwKKwkJCQkJCSZjYXApOworCisJCWlmICghcmV0ICYmIChjYXAgJiBQQ0lfQUZfQ0FQX0ZMUikgJiYgKGNhcCAmIFBDSV9BRl9DQVBfVFApKQorCQkJcGNpX3RyeV9yZXNldF9mdW5jdGlvbih2ZGV2LT5wZGV2KTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIC8qIFBlcm1pc3Npb25zIGZvciBBZHZhbmNlZCBGdW5jdGlvbiBjYXBhYmlsaXR5ICovCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3BjaV9jYXBfYWZfcGVybShzdHJ1Y3QgcGVybV9iaXRzICpwZXJtKQogewogCWlmIChhbGxvY19wZXJtX2JpdHMocGVybSwgcGNpX2NhcF9sZW5ndGhbUENJX0NBUF9JRF9BRl0pKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXBlcm0tPndyaXRlZm4gPSB2ZmlvX2FmX2NvbmZpZ193cml0ZTsKKwogCXBfc2V0YihwZXJtLCBQQ0lfQ0FQX0xJU1RfTkVYVCwgKHU4KUFMTF9WSVJULCBOT19XUklURSk7Ci0JcF9zZXRiKHBlcm0sIFBDSV9BRl9DVFJMLCBOT19WSVJULCBQQ0lfQUZfQ1RSTF9GTFIpOworCXBfc2V0YihwZXJtLCBQQ0lfQUZfQ1RSTCwgUENJX0FGX0NUUkxfRkxSLCBQQ0lfQUZfQ1RSTF9GTFIpOwogCXJldHVybiAwOwogfQogCkBAIC0xNTE2LDEwICsxNTg4LDEwIEBACiAgKiBzcGFjZSB3aGljaCB0cmFja3MgcmVhZHMgYW5kIHdyaXRlcyB0byBiaXRzIHRoYXQgd2UgZW11bGF0ZSBmb3IKICAqIHRoZSB1c2VyLiAgSW5pdGlhbCB2YWx1ZXMgZmlsbGVkIGZyb20gZGV2aWNlLgogICoKLSAqIFVzaW5nIHNoYXJlZCBzdHVjdCBwZXJtX2JpdHMgYmV0d2VlbiBhbGwgdmZpby1wY2kgZGV2aWNlcyBzYXZlcworICogVXNpbmcgc2hhcmVkIHN0cnVjdCBwZXJtX2JpdHMgYmV0d2VlbiBhbGwgdmZpby1wY2kgZGV2aWNlcyBzYXZlcwogICogdXMgZnJvbSBhbGxvY2F0aW5nIGNmZ19zaXplIGJ1ZmZlcnMgZm9yIHZpcnQgYW5kIHdyaXRlIGZvciBldmVyeQogICogZGV2aWNlLiAgV2UgY291bGQgcmVtb3ZlIHZjb25maWcgYW5kIGFsbG9jYXRlIGluZGl2aWR1YWwgYnVmZmVycwotICogZm9yIGVhY2ggYXJlYSByZXF1cmluZyBlbXVsYXRlZCBiaXRzLCBidXQgdGhlIGFycmF5IG9mIHBvaW50ZXJzCisgKiBmb3IgZWFjaCBhcmVhIHJlcXVpcmluZyBlbXVsYXRlZCBiaXRzLCBidXQgdGhlIGFycmF5IG9mIHBvaW50ZXJzCiAgKiB3b3VsZCBiZSBjb21wYXJhYmxlIGluIHNpemUgKGF0IGxlYXN0IGZvciBzdGFuZGFyZCBjb25maWcgc3BhY2UpLgogICovCiBpbnQgdmZpb19jb25maWdfaW5pdChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pbnRycy5jIGIvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pbnRycy5jCmluZGV4IDE1MmI0MzguLmMyZTYwODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2lfaW50cnMuYworKysgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX2ludHJzLmMKQEAgLTI1MCw2ICsyNTAsNyBAQAogc3RhdGljIGludCB2ZmlvX21zaV9lbmFibGUoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwgaW50IG52ZWMsIGJvb2wgbXNpeCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHZkZXYtPnBkZXY7CisJdW5zaWduZWQgaW50IGZsYWcgPSBtc2l4ID8gUENJX0lSUV9NU0lYIDogUENJX0lSUV9NU0k7CiAJaW50IHJldDsKIAogCWlmICghaXNfaXJxX25vbmUodmRldikpCkBAIC0yNTksMzUgKzI2MCwxMyBAQAogCWlmICghdmRldi0+Y3R4KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChtc2l4KSB7Ci0JCWludCBpOwotCi0JCXZkZXYtPm1zaXggPSBremFsbG9jKG52ZWMgKiBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLAotCQkJCSAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdmRldi0+bXNpeCkgewotCQkJa2ZyZWUodmRldi0+Y3R4KTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IG52ZWM7IGkrKykKLQkJCXZkZXYtPm1zaXhbaV0uZW50cnkgPSBpOwotCi0JCXJldCA9IHBjaV9lbmFibGVfbXNpeF9yYW5nZShwZGV2LCB2ZGV2LT5tc2l4LCAxLCBudmVjKTsKLQkJaWYgKHJldCA8IG52ZWMpIHsKLQkJCWlmIChyZXQgPiAwKQotCQkJCXBjaV9kaXNhYmxlX21zaXgocGRldik7Ci0JCQlrZnJlZSh2ZGV2LT5tc2l4KTsKLQkJCWtmcmVlKHZkZXYtPmN0eCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0ID0gcGNpX2VuYWJsZV9tc2lfcmFuZ2UocGRldiwgMSwgbnZlYyk7Ci0JCWlmIChyZXQgPCBudmVjKSB7Ci0JCQlpZiAocmV0ID4gMCkKLQkJCQlwY2lfZGlzYWJsZV9tc2kocGRldik7Ci0JCQlrZnJlZSh2ZGV2LT5jdHgpOwotCQkJcmV0dXJuIHJldDsKLQkJfQorCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHN1cHBvcnRlZCB2ZWN0b3JzIGlmIHdlIGNhbid0IGdldCBhbGw6ICovCisJcmV0ID0gcGNpX2FsbG9jX2lycV92ZWN0b3JzKHBkZXYsIDEsIG52ZWMsIGZsYWcpOworCWlmIChyZXQgPCBudmVjKSB7CisJCWlmIChyZXQgPiAwKQorCQkJcGNpX2ZyZWVfaXJxX3ZlY3RvcnMocGRldik7CisJCWtmcmVlKHZkZXYtPmN0eCk7CisJCXJldHVybiByZXQ7CiAJfQogCiAJdmRldi0+bnVtX2N0eCA9IG52ZWM7CkBAIC0zMTUsNyArMjk0LDcgQEAKIAlpZiAodmVjdG9yIDwgMCB8fCB2ZWN0b3IgPj0gdmRldi0+bnVtX2N0eCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpcnEgPSBtc2l4ID8gdmRldi0+bXNpeFt2ZWN0b3JdLnZlY3RvciA6IHBkZXYtPmlycSArIHZlY3RvcjsKKwlpcnEgPSBwY2lfaXJxX3ZlY3RvcihwZGV2LCB2ZWN0b3IpOwogCiAJaWYgKHZkZXYtPmN0eFt2ZWN0b3JdLnRyaWdnZXIpIHsKIAkJZnJlZV9pcnEoaXJxLCB2ZGV2LT5jdHhbdmVjdG9yXS50cmlnZ2VyKTsKQEAgLTQwOCwxMSArMzg3LDE0IEBACiAKIAl2ZmlvX21zaV9zZXRfYmxvY2sodmRldiwgMCwgdmRldi0+bnVtX2N0eCwgTlVMTCwgbXNpeCk7CiAKLQlpZiAobXNpeCkgewotCQlwY2lfZGlzYWJsZV9tc2l4KHZkZXYtPnBkZXYpOwotCQlrZnJlZSh2ZGV2LT5tc2l4KTsKLQl9IGVsc2UKLQkJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCXBjaV9mcmVlX2lycV92ZWN0b3JzKHBkZXYpOworCisJLyoKKwkgKiBCb3RoIGRpc2FibGUgcGF0aHMgYWJvdmUgdXNlIHBjaV9pbnR4X2Zvcl9tc2koKSB0byBjbGVhciBEaXNJTlR4CisJICogdmlhIHRoZWlyIHNodXRkb3duIHBhdGhzLiAgUmVzdG9yZSBmb3IgTm9JTlR4IGRldmljZXMuCisJICovCisJaWYgKHZkZXYtPm5vaW50eCkKKwkJcGNpX2ludHgocGRldiwgMCk7CiAKIAl2ZGV2LT5pcnFfdHlwZSA9IFZGSU9fUENJX05VTV9JUlFTOwogCXZkZXYtPm51bV9jdHggPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9wcml2YXRlLmggYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3ByaXZhdGUuaAppbmRleCAyMTI4ZGU4Li5mNTYxYWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3ByaXZhdGUuaAorKysgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX3ByaXZhdGUuaApAQCAtNzIsNyArNzIsNiBAQAogCXN0cnVjdCBwZXJtX2JpdHMJKm1zaV9wZXJtOwogCXNwaW5sb2NrX3QJCWlycWxvY2s7CiAJc3RydWN0IG11dGV4CQlpZ2F0ZTsKLQlzdHJ1Y3QgbXNpeF9lbnRyeQkqbXNpeDsKIAlzdHJ1Y3QgdmZpb19wY2lfaXJxX2N0eAkqY3R4OwogCWludAkJCW51bV9jdHg7CiAJaW50CQkJaXJxX3R5cGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vcmVzZXQvdmZpb19wbGF0Zm9ybV9hbWR4Z2JlLmMgYi9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vcmVzZXQvdmZpb19wbGF0Zm9ybV9hbWR4Z2JlLmMKaW5kZXggZDQwMzBkMC4uYmNkNDE5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL3BsYXRmb3JtL3Jlc2V0L3ZmaW9fcGxhdGZvcm1fYW1keGdiZS5jCisrKyBiL2RyaXZlcnMvdmZpby9wbGF0Zm9ybS9yZXNldC92ZmlvX3BsYXRmb3JtX2FtZHhnYmUuYwpAQCAtNTYsNyArNTYsNyBAQAogCWlvd3JpdGUzMih2YWx1ZSwgaW9hZGRyICsgKChtbWRfYWRkcmVzcyAmIDB4ZmYpIDw8IDIpKTsKIH0KIAotaW50IHZmaW9fcGxhdGZvcm1fYW1keGdiZV9yZXNldChzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYpCitzdGF0aWMgaW50IHZmaW9fcGxhdGZvcm1fYW1keGdiZV9yZXNldChzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYpCiB7CiAJc3RydWN0IHZmaW9fcGxhdGZvcm1fcmVnaW9uICp4Z21hY19yZWdzID0gJnZkZXYtPnJlZ2lvbnNbMF07CiAJc3RydWN0IHZmaW9fcGxhdGZvcm1fcmVnaW9uICp4cGNzX3JlZ3MgPSAmdmRldi0+cmVnaW9uc1sxXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmZpby9wbGF0Zm9ybS9yZXNldC92ZmlvX3BsYXRmb3JtX2NhbHhlZGF4Z21hYy5jIGIvZHJpdmVycy92ZmlvL3BsYXRmb3JtL3Jlc2V0L3ZmaW9fcGxhdGZvcm1fY2FseGVkYXhnbWFjLmMKaW5kZXggZTNkM2Q5NC4uNDllNWRmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL3BsYXRmb3JtL3Jlc2V0L3ZmaW9fcGxhdGZvcm1fY2FseGVkYXhnbWFjLmMKKysrIGIvZHJpdmVycy92ZmlvL3BsYXRmb3JtL3Jlc2V0L3ZmaW9fcGxhdGZvcm1fY2FseGVkYXhnbWFjLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAl3cml0ZWwodmFsdWUsIGlvYWRkciArIFhHTUFDX0NPTlRST0wpOwogfQogCi1pbnQgdmZpb19wbGF0Zm9ybV9jYWx4ZWRheGdtYWNfcmVzZXQoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2KQorc3RhdGljIGludCB2ZmlvX3BsYXRmb3JtX2NhbHhlZGF4Z21hY19yZXNldChzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYpCiB7CiAJc3RydWN0IHZmaW9fcGxhdGZvcm1fcmVnaW9uICpyZWcgPSAmdmRldi0+cmVnaW9uc1swXTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BsYXRmb3JtL3ZmaW9fcGxhdGZvcm1fY29tbW9uLmMgYi9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vdmZpb19wbGF0Zm9ybV9jb21tb24uYwppbmRleCAxY2YyZDQ2Li5kNzgxNDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vdmZpb19wbGF0Zm9ybV9jb21tb24uYworKysgYi9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vdmZpb19wbGF0Zm9ybV9jb21tb24uYwpAQCAtNzMsNyArNzMsNyBAQAogCXJldHVybiBXQVJOX09OKCF2ZGV2LT5hY3BpaGlkKSA/IC1FSU5WQUwgOiAwOwogfQogCi1pbnQgdmZpb19wbGF0Zm9ybV9hY3BpX2NhbGxfcmVzZXQoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2LAorc3RhdGljIGludCB2ZmlvX3BsYXRmb3JtX2FjcGlfY2FsbF9yZXNldChzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYsCiAJCQkJICBjb25zdCBjaGFyICoqZXh0cmFfZGJnKQogewogI2lmZGVmIENPTkZJR19BQ1BJCkBAIC05NSw3ICs5NSw3IEBACiAjZW5kaWYKIH0KIAotYm9vbCB2ZmlvX3BsYXRmb3JtX2FjcGlfaGFzX3Jlc2V0KHN0cnVjdCB2ZmlvX3BsYXRmb3JtX2RldmljZSAqdmRldikKK3N0YXRpYyBib29sIHZmaW9fcGxhdGZvcm1fYWNwaV9oYXNfcmVzZXQoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2KQogewogI2lmZGVmIENPTkZJR19BQ1BJCiAJc3RydWN0IGRldmljZSAqZGV2ID0gdmRldi0+ZGV2aWNlOwpAQCAtNjM3LDcgKzYzNyw3IEBACiAJLm1tYXAJCT0gdmZpb19wbGF0Zm9ybV9tbWFwLAogfTsKIAotaW50IHZmaW9fcGxhdGZvcm1fb2ZfcHJvYmUoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2LAorc3RhdGljIGludCB2ZmlvX3BsYXRmb3JtX29mX3Byb2JlKHN0cnVjdCB2ZmlvX3BsYXRmb3JtX2RldmljZSAqdmRldiwKIAkJCSAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpbnQgcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC90ZXN0LmMgYi9kcml2ZXJzL3Zob3N0L3Rlc3QuYwppbmRleCA5N2ZiMmY4Li4zY2M5OGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Rlc3QuYworKysgYi9kcml2ZXJzL3Zob3N0L3Rlc3QuYwpAQCAtMzIyLDE4ICszMjIsNyBAQAogCSJ2aG9zdC10ZXN0IiwKIAkmdmhvc3RfdGVzdF9mb3BzLAogfTsKLQotc3RhdGljIGludCB2aG9zdF90ZXN0X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbWlzY19yZWdpc3Rlcigmdmhvc3RfdGVzdF9taXNjKTsKLX0KLW1vZHVsZV9pbml0KHZob3N0X3Rlc3RfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIHZob3N0X3Rlc3RfZXhpdCh2b2lkKQotewotCW1pc2NfZGVyZWdpc3Rlcigmdmhvc3RfdGVzdF9taXNjKTsKLX0KLW1vZHVsZV9leGl0KHZob3N0X3Rlc3RfZXhpdCk7Cittb2R1bGVfbWlzY19kZXZpY2Uodmhvc3RfdGVzdF9taXNjKTsKIAogTU9EVUxFX1ZFUlNJT04oIjAuMC4xIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9wd21fYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3B3bV9ibC5jCmluZGV4IGIyYjM2NmIuLjEyNjE0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3B3bV9ibC5jCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3B3bV9ibC5jCkBAIC01NSw3ICs1NSw3IEBACiAJCWRldl9lcnIocGItPmRldiwgImZhaWxlZCB0byBlbmFibGUgcG93ZXIgc3VwcGx5XG4iKTsKIAogCWlmIChwYi0+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+ZG9tYWluID0gZG9tYWluOwotCXBjaV9kZXZfaWQtPmJ1cyA9IGJ1czsKLQlwY2lfZGV2X2lkLT5kZXZmbiA9IGRldmZuOwotCiAJcHJfZGVidWcoIndhbnRzIHRvIHNlaXplICUwNHg6JTAyeDolMDJ4LiVkXG4iLAogCQkgZG9tYWluLCBidXMsIHNsb3QsIGZ1bmMpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9pZHNfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJnBjaV9kZXZfaWQtPnNsb3RfbGlzdCwgJnBjaXN0dWJfZGV2aWNlX2lkcyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2lkc19sb2NrLCBmbGFncyk7CisJcGNpc3R1Yl9kZXZpY2VfaWRfYWRkX2xpc3QocGNpX2Rldl9pZCwgZG9tYWluLCBidXMsIGRldmZuKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggMmJjN2FkNy4uM2VmNjJiYSAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC03OSw2ICs3OSw3IEBACiBjb25maWcgRklMRV9MT0NLSU5HCiAJYm9vbCAiRW5hYmxlIFBPU0lYIGZpbGUgbG9ja2luZyBBUEkiIGlmIEVYUEVSVAogCWRlZmF1bHQgeQorCXNlbGVjdCBQRVJDUFVfUldTRU0KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN0YW5kYXJkIGZpbGUgbG9ja2luZyBzdXBwb3J0LCByZXF1aXJlZAogICAgICAgICAgIGZvciBmaWxlc3lzdGVtcyBsaWtlIE5GUyBhbmQgZm9yIHRoZSBmbG9jaygpIHN5c3RlbQpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZy5iaW5mbXQgYi9mcy9LY29uZmlnLmJpbmZtdAppbmRleCBjN2VmZGRmLi40YzA5ZDkzIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnLmJpbmZtdAorKysgYi9mcy9LY29uZmlnLmJpbmZtdApAQCAtODksNyArODksNyBAQAogCiBjb25maWcgQklORk1UX0ZMQVQKIAlib29sICJLZXJuZWwgc3VwcG9ydCBmb3IgZmxhdCBiaW5hcmllcyIKLQlkZXBlbmRzIG9uICFNTVUgfHwgTTY4SworCWRlcGVuZHMgb24gIU1NVSB8fCBBUk0gfHwgTTY4SwogCWRlcGVuZHMgb24gIUZSViB8fCBCUk9LRU4KIAloZWxwCiAJICBTdXBwb3J0IHVDbGludXggRkxBVCBmb3JtYXQgYmluYXJpZXMuCmRpZmYgLS1naXQgYS9mcy9hZnMvY2FsbGJhY2suYyBiL2ZzL2Fmcy9jYWxsYmFjay5jCmluZGV4IDdlZjYzN2QuLjFlOWQyZjggMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jYWxsYmFjay5jCisrKyBiL2ZzL2Fmcy9jYWxsYmFjay5jCkBAIC00NjEsOCArNDYxLDggQEAKICAqLwogaW50IF9faW5pdCBhZnNfY2FsbGJhY2tfdXBkYXRlX2luaXQodm9pZCkKIHsKLQlhZnNfY2FsbGJhY2tfdXBkYXRlX3dvcmtlciA9Ci0JCWNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrYWZzX2NhbGxiYWNrZCIpOworCWFmc19jYWxsYmFja191cGRhdGVfd29ya2VyID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoImthZnNfY2FsbGJhY2tkIiwKKwkJCQkJCQkgICAgIFdRX01FTV9SRUNMQUlNKTsKIAlyZXR1cm4gYWZzX2NhbGxiYWNrX3VwZGF0ZV93b3JrZXIgPyAwIDogLUVOT01FTTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvYWZzL2Ntc2VydmljZS5jIGIvZnMvYWZzL2Ntc2VydmljZS5jCmluZGV4IDg1NzM3ZTkuLjIwMzdlN2EgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9jbXNlcnZpY2UuYworKysgYi9mcy9hZnMvY21zZXJ2aWNlLmMKQEAgLTE3LDE5ICsxNywxMiBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYWZzX2NtLmgiCiAKLSNpZiAwCi1zdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqYWZzX2NtX3dvcmtxdWV1ZTsKLSNlbmRpZiAgLyogIDAgICovCi0KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUoc3RydWN0IGFmc19jYWxsICosCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUzKHN0cnVjdCBhZnNfY2FsbCAqLAotCQkJCQkJc3RydWN0IHNrX2J1ZmYgKiwgYm9vbCk7Ci1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX3Byb2JlKHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfY2FsbGJhY2soc3RydWN0IGFmc19jYWxsICosIHN0cnVjdCBza19idWZmICosIGJvb2wpOwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZV91dWlkKHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfdGVsbF9tZV9hYm91dF95b3Vyc2VsZihzdHJ1Y3QgYWZzX2NhbGwgKiwKLQkJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZTMoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZShzdHJ1Y3QgYWZzX2NhbGwgKik7CitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX2NhbGxiYWNrKHN0cnVjdCBhZnNfY2FsbCAqKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfcHJvYmVfdXVpZChzdHJ1Y3QgYWZzX2NhbGwgKik7CitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX3RlbGxfbWVfYWJvdXRfeW91cnNlbGYoc3RydWN0IGFmc19jYWxsICopOwogc3RhdGljIHZvaWQgYWZzX2NtX2Rlc3RydWN0b3Ioc3RydWN0IGFmc19jYWxsICopOwogCiAvKgpAQCAtMTM0LDcgKzEyNyw3IEBACiAJICogcmVjZWl2ZWQuICBUaGUgc3RlcCBudW1iZXIgaGVyZSBtdXN0IG1hdGNoIHRoZSBmaW5hbCBudW1iZXIgaW4KIAkgKiBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjaygpLgogCSAqLwotCWlmIChjYWxsLT51bm1hcnNoYWxsID09IDYpIHsKKwlpZiAoY2FsbC0+dW5tYXJzaGFsbCA9PSA1KSB7CiAJCUFTU0VSVChjYWxsLT5zZXJ2ZXIgJiYgY2FsbC0+Y291bnQgJiYgY2FsbC0+cmVxdWVzdCk7CiAJCWFmc19icmVha19jYWxsYmFja3MoY2FsbC0+c2VydmVyLCBjYWxsLT5jb3VudCwgY2FsbC0+cmVxdWVzdCk7CiAJfQpAQCAtMTY4LDI3ICsxNjEsMjcgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLkNhbGxCYWNrIGNhbGwKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9jYWxsYmFjayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeDsKIAlzdHJ1Y3QgYWZzX2NhbGxiYWNrICpjYjsKIAlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOwotCXN0cnVjdCBpbl9hZGRyIGFkZHI7CiAJX19iZTMyICpicDsKIAl1MzIgdG1wOwogCWludCByZXQsIGxvb3A7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoInsldX0iLCBjYWxsLT51bm1hcnNoYWxsKTsKIAogCXN3aXRjaCAoY2FsbC0+dW5tYXJzaGFsbCkgewogCWNhc2UgMDoKKwkJcnhycGNfa2VybmVsX2dldF9wZWVyKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwgJnNyeCk7CiAJCWNhbGwtPm9mZnNldCA9IDA7CiAJCWNhbGwtPnVubWFyc2hhbGwrKzsKIAogCQkvKiBleHRyYWN0IHRoZSBGSUQgYXJyYXkgYW5kIGl0cyBjb3VudCBpbiB0d28gc3RlcHMgKi8KIAljYXNlIDE6CiAJCV9kZWJ1ZygiZXh0cmFjdCBGSUQgY291bnQiKTsKLQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsICZjYWxsLT50bXAsIDQpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsICZjYWxsLT50bXAsIDQsIHRydWUpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTIwNSw4ICsxOTgsOCBAQAogCiAJY2FzZSAyOgogCQlfZGVidWcoImV4dHJhY3QgRklEIGFycmF5Iik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5idWZmZXIsCi0JCQkJICAgICAgIGNhbGwtPmNvdW50ICogMyAqIDQpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPmJ1ZmZlciwKKwkJCQkgICAgICAgY2FsbC0+Y291bnQgKiAzICogNCwgdHJ1ZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIApAQCAtMjMyLDcgKzIyNSw3IEBACiAJCS8qIGV4dHJhY3QgdGhlIGNhbGxiYWNrIGFycmF5IGFuZCBpdHMgY291bnQgaW4gdHdvIHN0ZXBzICovCiAJY2FzZSAzOgogCQlfZGVidWcoImV4dHJhY3QgQ0IgY291bnQiKTsKLQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsICZjYWxsLT50bXAsIDQpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsICZjYWxsLT50bXAsIDQsIHRydWUpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTI0MiwxMyArMjM1LDExIEBACiAJCQlyZXR1cm4gLUVCQURNU0c7CiAJCWNhbGwtPm9mZnNldCA9IDA7CiAJCWNhbGwtPnVubWFyc2hhbGwrKzsKLQkJaWYgKHRtcCA9PSAwKQotCQkJZ290byBlbXB0eV9jYl9hcnJheTsKIAogCWNhc2UgNDoKIAkJX2RlYnVnKCJleHRyYWN0IENCIGFycmF5Iik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5yZXF1ZXN0LAotCQkJCSAgICAgICBjYWxsLT5jb3VudCAqIDMgKiA0KTsKKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBjYWxsLT5idWZmZXIsCisJCQkJICAgICAgIGNhbGwtPmNvdW50ICogMyAqIDQsIGZhbHNlKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCkBAIC0yNjEsMTUgKzI1Miw5IEBACiAJCQljYi0+dHlwZQk9IG50b2hsKCpicCsrKTsKIAkJfQogCi0JZW1wdHlfY2JfYXJyYXk6CiAJCWNhbGwtPm9mZnNldCA9IDA7CiAJCWNhbGwtPnVubWFyc2hhbGwrKzsKIAotCWNhc2UgNToKLQkJcmV0ID0gYWZzX2RhdGFfY29tcGxldGUoY2FsbCwgc2tiLCBsYXN0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCiAJCS8qIFJlY29yZCB0aGF0IHRoZSBtZXNzYWdlIHdhcyB1bm1hcnNoYWxsZWQgc3VjY2Vzc2Z1bGx5IHNvCiAJCSAqIHRoYXQgdGhlIGNhbGwgZGVzdHJ1Y3RvciBjYW4ga25vdyBkbyB0aGUgY2FsbGJhY2sgYnJlYWtpbmcKIAkJICogd29yaywgZXZlbiBpZiB0aGUgZmluYWwgQUNLIGlzbid0IHJlY2VpdmVkLgpAQCAtMjc4LDE3ICsyNjMsMTUgQEAKIAkJICogdXBkYXRlZCBhbHNvLgogCQkgKi8KIAkJY2FsbC0+dW5tYXJzaGFsbCsrOwotCWNhc2UgNjoKKwljYXNlIDU6CiAJCWJyZWFrOwogCX0KIAotCiAJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKIAogCS8qIHdlJ2xsIG5lZWQgdGhlIGZpbGUgc2VydmVyIHJlY29yZCBhcyB0aGF0IHRlbGxzIHVzIHdoaWNoIHNldCBvZgogCSAqIHZub2RlcyB0byBvcGVyYXRlIHVwb24gKi8KLQltZW1jcHkoJmFkZHIsICZpcF9oZHIoc2tiKS0+c2FkZHIsIDQpOwotCXNlcnZlciA9IGFmc19maW5kX3NlcnZlcigmYWRkcik7CisJc2VydmVyID0gYWZzX2ZpbmRfc2VydmVyKCZzcngpOwogCWlmICghc2VydmVyKQogCQlyZXR1cm4gLUVOT1RDT05OOwogCWNhbGwtPnNlcnZlciA9IHNlcnZlcjsKQEAgLTMxNSwxNyArMjk4LDE3IEBACiAvKgogICogZGVsaXZlciByZXF1ZXN0IGRhdGEgdG8gYSBDQi5Jbml0Q2FsbEJhY2tTdGF0ZSBjYWxsCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgICAgIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfaW5pdF9jYWxsX2JhY2tfc3RhdGUoc3RydWN0IGFmc19jYWxsICpjYWxsKQogeworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyBzcng7CiAJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKLQlzdHJ1Y3QgaW5fYWRkciBhZGRyOwogCWludCByZXQ7CiAKLQlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigiIik7CiAKLQlyZXQgPSBhZnNfZGF0YV9jb21wbGV0ZShjYWxsLCBza2IsIGxhc3QpOworCXJ4cnBjX2tlcm5lbF9nZXRfcGVlcihhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsICZzcngpOworCisJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBOVUxMLCAwLCBmYWxzZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTMzNCw4ICszMTcsNyBAQAogCiAJLyogd2UnbGwgbmVlZCB0aGUgZmlsZSBzZXJ2ZXIgcmVjb3JkIGFzIHRoYXQgdGVsbHMgdXMgd2hpY2ggc2V0IG9mCiAJICogdm5vZGVzIHRvIG9wZXJhdGUgdXBvbiAqLwotCW1lbWNweSgmYWRkciwgJmlwX2hkcihza2IpLT5zYWRkciwgNCk7Ci0Jc2VydmVyID0gYWZzX2ZpbmRfc2VydmVyKCZhZGRyKTsKKwlzZXJ2ZXIgPSBhZnNfZmluZF9zZXJ2ZXIoJnNyeCk7CiAJaWYgKCFzZXJ2ZXIpCiAJCXJldHVybiAtRU5PVENPTk47CiAJY2FsbC0+c2VydmVyID0gc2VydmVyOwpAQCAtMzQ4LDExMCArMzMwLDIwIEBACiAvKgogICogZGVsaXZlciByZXF1ZXN0IGRhdGEgdG8gYSBDQi5Jbml0Q2FsbEJhY2tTdGF0ZTMgY2FsbAogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX2luaXRfY2FsbF9iYWNrX3N0YXRlMyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkJYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9pbml0X2NhbGxfYmFja19zdGF0ZTMoc3RydWN0IGFmc19jYWxsICpjYWxsKQogeworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyBzcng7CiAJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKLQlzdHJ1Y3QgaW5fYWRkciBhZGRyOwotCi0JX2VudGVyKCIseyV1fSwlZCIsIHNrYi0+bGVuLCBsYXN0KTsKLQotCS8qIFRoZXJlIGFyZSBzb21lIGFyZ3VtZW50cyB0aGF0IHdlIGlnbm9yZSAqLwotCWFmc19kYXRhX2NvbnN1bWVkKGNhbGwsIHNrYik7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCS8qIG5vIHVubWFyc2hhbGxpbmcgcmVxdWlyZWQgKi8KLQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOwotCi0JLyogd2UnbGwgbmVlZCB0aGUgZmlsZSBzZXJ2ZXIgcmVjb3JkIGFzIHRoYXQgdGVsbHMgdXMgd2hpY2ggc2V0IG9mCi0JICogdm5vZGVzIHRvIG9wZXJhdGUgdXBvbiAqLwotCW1lbWNweSgmYWRkciwgJmlwX2hkcihza2IpLT5zYWRkciwgNCk7Ci0Jc2VydmVyID0gYWZzX2ZpbmRfc2VydmVyKCZhZGRyKTsKLQlpZiAoIXNlcnZlcikKLQkJcmV0dXJuIC1FTk9UQ09OTjsKLQljYWxsLT5zZXJ2ZXIgPSBzZXJ2ZXI7Ci0KLQlJTklUX1dPUksoJmNhbGwtPndvcmssIFNSWEFGU0NCX0luaXRDYWxsQmFja1N0YXRlKTsKLQlxdWV1ZV93b3JrKGFmc193cSwgJmNhbGwtPndvcmspOwotCXJldHVybiAwOwotfQotCi0vKgotICogYWxsb3cgdGhlIGZpbGVzZXJ2ZXIgdG8gc2VlIGlmIHRoZSBjYWNoZSBtYW5hZ2VyIGlzIHN0aWxsIGFsaXZlCi0gKi8KLXN0YXRpYyB2b2lkIFNSWEFGU0NCX1Byb2JlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc19jYWxsLCB3b3JrKTsKLQotCV9lbnRlcigiIik7Ci0JYWZzX3NlbmRfZW1wdHlfcmVwbHkoY2FsbCk7Ci0JX2xlYXZlKCIiKTsKLX0KLQotLyoKLSAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuUHJvYmUgY2FsbAotICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX3Byb2JlKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQlib29sIGxhc3QpCi17Ci0JaW50IHJldDsKLQotCV9lbnRlcigiLHsldX0sJWQiLCBza2ItPmxlbiwgbGFzdCk7Ci0KLQlyZXQgPSBhZnNfZGF0YV9jb21wbGV0ZShjYWxsLCBza2IsIGxhc3QpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogbm8gdW5tYXJzaGFsbGluZyByZXF1aXJlZCAqLwotCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfUkVQTFlJTkc7Ci0KLQlJTklUX1dPUksoJmNhbGwtPndvcmssIFNSWEFGU0NCX1Byb2JlKTsKLQlxdWV1ZV93b3JrKGFmc193cSwgJmNhbGwtPndvcmspOwotCXJldHVybiAwOwotfQotCi0vKgotICogYWxsb3cgdGhlIGZpbGVzZXJ2ZXIgdG8gcXVpY2tseSBmaW5kIG91dCBpZiB0aGUgZmlsZXNlcnZlciBoYXMgYmVlbiByZWJvb3RlZAotICovCi1zdGF0aWMgdm9pZCBTUlhBRlNDQl9Qcm9iZVV1aWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIHdvcmspOwotCXN0cnVjdCBhZnNfdXVpZCAqciA9IGNhbGwtPnJlcXVlc3Q7Ci0KLQlzdHJ1Y3QgewotCQlfX2JlMzIJbWF0Y2g7Ci0JfSByZXBseTsKLQotCV9lbnRlcigiIik7Ci0KLQotCWlmIChtZW1jbXAociwgJmFmc191dWlkLCBzaXplb2YoYWZzX3V1aWQpKSA9PSAwKQotCQlyZXBseS5tYXRjaCA9IGh0b25sKDApOwotCWVsc2UKLQkJcmVwbHkubWF0Y2ggPSBodG9ubCgxKTsKLQotCWFmc19zZW5kX3NpbXBsZV9yZXBseShjYWxsLCAmcmVwbHksIHNpemVvZihyZXBseSkpOwotCV9sZWF2ZSgiIik7Ci19Ci0KLS8qCi0gKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLlByb2JlVXVpZCBjYWxsCi0gKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfcHJvYmVfdXVpZChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICBib29sIGxhc3QpCi17CiAJc3RydWN0IGFmc191dWlkICpyOwogCXVuc2lnbmVkIGxvb3A7CiAJX19iZTMyICpiOwogCWludCByZXQ7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoIiIpOwogCi0JcmV0ID0gYWZzX2RhdGFfY29tcGxldGUoY2FsbCwgc2tiLCBsYXN0KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlyeHJwY19rZXJuZWxfZ2V0X3BlZXIoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLCAmc3J4KTsKKworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOwogCiAJc3dpdGNoIChjYWxsLT51bm1hcnNoYWxsKSB7CiAJY2FzZSAwOgpAQCAtNDYzLDggKzM1NSw4IEBACiAKIAljYXNlIDE6CiAJCV9kZWJ1ZygiZXh0cmFjdCBVVUlEIik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5idWZmZXIsCi0JCQkJICAgICAgIDExICogc2l6ZW9mKF9fYmUzMikpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPmJ1ZmZlciwKKwkJCQkgICAgICAgMTEgKiBzaXplb2YoX19iZTMyKSwgZmFsc2UpOwogCQlzd2l0Y2ggKHJldCkgewogCQljYXNlIDA6CQlicmVhazsKIAkJY2FzZSAtRUFHQUlOOglyZXR1cm4gMDsKQEAgLTQ5MSwxNiArMzgzLDEzMyBAQAogCQljYWxsLT51bm1hcnNoYWxsKys7CiAKIAljYXNlIDI6Ci0JCV9kZWJ1ZygidHJhaWxlciIpOwotCQlpZiAoc2tiLT5sZW4gIT0gMCkKLQkJCXJldHVybiAtRUJBRE1TRzsKIAkJYnJlYWs7CiAJfQogCi0JcmV0ID0gYWZzX2RhdGFfY29tcGxldGUoY2FsbCwgc2tiLCBsYXN0KTsKKwkvKiBubyB1bm1hcnNoYWxsaW5nIHJlcXVpcmVkICovCisJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKKworCS8qIHdlJ2xsIG5lZWQgdGhlIGZpbGUgc2VydmVyIHJlY29yZCBhcyB0aGF0IHRlbGxzIHVzIHdoaWNoIHNldCBvZgorCSAqIHZub2RlcyB0byBvcGVyYXRlIHVwb24gKi8KKwlzZXJ2ZXIgPSBhZnNfZmluZF9zZXJ2ZXIoJnNyeCk7CisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybiAtRU5PVENPTk47CisJY2FsbC0+c2VydmVyID0gc2VydmVyOworCisJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9Jbml0Q2FsbEJhY2tTdGF0ZSk7CisJcXVldWVfd29yayhhZnNfd3EsICZjYWxsLT53b3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHNlZSBpZiB0aGUgY2FjaGUgbWFuYWdlciBpcyBzdGlsbCBhbGl2ZQorICovCitzdGF0aWMgdm9pZCBTUlhBRlNDQl9Qcm9iZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZnNfY2FsbCwgd29yayk7CisKKwlfZW50ZXIoIiIpOworCWFmc19zZW5kX2VtcHR5X3JlcGx5KGNhbGwpOworCV9sZWF2ZSgiIik7Cit9CisKKy8qCisgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLlByb2JlIGNhbGwKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCit7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIE5VTEwsIDAsIGZhbHNlKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAorCS8qIG5vIHVubWFyc2hhbGxpbmcgcmVxdWlyZWQgKi8KKwljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOworCisJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9Qcm9iZSk7CisJcXVldWVfd29yayhhZnNfd3EsICZjYWxsLT53b3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHF1aWNrbHkgZmluZCBvdXQgaWYgdGhlIGZpbGVzZXJ2ZXIgaGFzIGJlZW4gcmVib290ZWQKKyAqLworc3RhdGljIHZvaWQgU1JYQUZTQ0JfUHJvYmVVdWlkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc19jYWxsLCB3b3JrKTsKKwlzdHJ1Y3QgYWZzX3V1aWQgKnIgPSBjYWxsLT5yZXF1ZXN0OworCisJc3RydWN0IHsKKwkJX19iZTMyCW1hdGNoOworCX0gcmVwbHk7CisKKwlfZW50ZXIoIiIpOworCisJaWYgKG1lbWNtcChyLCAmYWZzX3V1aWQsIHNpemVvZihhZnNfdXVpZCkpID09IDApCisJCXJlcGx5Lm1hdGNoID0gaHRvbmwoMCk7CisJZWxzZQorCQlyZXBseS5tYXRjaCA9IGh0b25sKDEpOworCisJYWZzX3NlbmRfc2ltcGxlX3JlcGx5KGNhbGwsICZyZXBseSwgc2l6ZW9mKHJlcGx5KSk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIGRlbGl2ZXIgcmVxdWVzdCBkYXRhIHRvIGEgQ0IuUHJvYmVVdWlkIGNhbGwKKyAqLworc3RhdGljIGludCBhZnNfZGVsaXZlcl9jYl9wcm9iZV91dWlkKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgYWZzX3V1aWQgKnI7CisJdW5zaWduZWQgbG9vcDsKKwlfX2JlMzIgKmI7CisJaW50IHJldDsKKworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOworCisJc3dpdGNoIChjYWxsLT51bm1hcnNoYWxsKSB7CisJY2FzZSAwOgorCQljYWxsLT5vZmZzZXQgPSAwOworCQljYWxsLT5idWZmZXIgPSBrbWFsbG9jKDExICogc2l6ZW9mKF9fYmUzMiksIEdGUF9LRVJORUwpOworCQlpZiAoIWNhbGwtPmJ1ZmZlcikKKwkJCXJldHVybiAtRU5PTUVNOworCQljYWxsLT51bm1hcnNoYWxsKys7CisKKwljYXNlIDE6CisJCV9kZWJ1ZygiZXh0cmFjdCBVVUlEIik7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICAxMSAqIHNpemVvZihfX2JlMzIpLCBmYWxzZSk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoJCWJyZWFrOworCQljYXNlIC1FQUdBSU46CXJldHVybiAwOworCQlkZWZhdWx0OglyZXR1cm4gcmV0OworCQl9CisKKwkJX2RlYnVnKCJ1bm1hcnNoYWxsIFVVSUQiKTsKKwkJY2FsbC0+cmVxdWVzdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfdXVpZCksIEdGUF9LRVJORUwpOworCQlpZiAoIWNhbGwtPnJlcXVlc3QpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQliID0gY2FsbC0+YnVmZmVyOworCQlyID0gY2FsbC0+cmVxdWVzdDsKKwkJci0+dGltZV9sb3cJCQk9IG50b2hsKGJbMF0pOworCQlyLT50aW1lX21pZAkJCT0gbnRvaGwoYlsxXSk7CisJCXItPnRpbWVfaGlfYW5kX3ZlcnNpb24JCT0gbnRvaGwoYlsyXSk7CisJCXItPmNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWQgCT0gbnRvaGwoYlszXSk7CisJCXItPmNsb2NrX3NlcV9sb3cJCT0gbnRvaGwoYls0XSk7CisKKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IDY7IGxvb3ArKykKKwkJCXItPm5vZGVbbG9vcF0gPSBudG9obChiW2xvb3AgKyA1XSk7CisKKwkJY2FsbC0+b2Zmc2V0ID0gMDsKKwkJY2FsbC0+dW5tYXJzaGFsbCsrOworCisJY2FzZSAyOgorCQlicmVhazsKKwl9CisKIAljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX1JFUExZSU5HOwogCiAJSU5JVF9XT1JLKCZjYWxsLT53b3JrLCBTUlhBRlNDQl9Qcm9iZVV1aWQpOwpAQCAtNTc0LDE0ICs1ODMsMTMgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcXVlc3QgZGF0YSB0byBhIENCLlRlbGxNZUFib3V0WW91cnNlbGYgY2FsbAogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2NiX3RlbGxfbWVfYWJvdXRfeW91cnNlbGYoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCQkJIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY2JfdGVsbF9tZV9hYm91dF95b3Vyc2VsZihzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJaW50IHJldDsKIAotCV9lbnRlcigiLHsldX0sJWQiLCBza2ItPmxlbiwgbGFzdCk7CisJX2VudGVyKCIiKTsKIAotCXJldCA9IGFmc19kYXRhX2NvbXBsZXRlKGNhbGwsIHNrYiwgbGFzdCk7CisJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBOVUxMLCAwLCBmYWxzZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9mbG9jay5jIGIvZnMvYWZzL2Zsb2NrLmMKaW5kZXggZDkxYTljOS4uMzE5MWRmZiAxMDA2NDQKLS0tIGEvZnMvYWZzL2Zsb2NrLmMKKysrIGIvZnMvYWZzL2Zsb2NrLmMKQEAgLTM2LDggKzM2LDggQEAKIAlpZiAoIWFmc19sb2NrX21hbmFnZXIpIHsKIAkJbXV0ZXhfbG9jaygmYWZzX2xvY2tfbWFuYWdlcl9tdXRleCk7CiAJCWlmICghYWZzX2xvY2tfbWFuYWdlcikgewotCQkJYWZzX2xvY2tfbWFuYWdlciA9Ci0JCQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNfbG9ja2QiKTsKKwkJCWFmc19sb2NrX21hbmFnZXIgPSBhbGxvY193b3JrcXVldWUoImthZnNfbG9ja2QiLAorCQkJCQkJCSAgIFdRX01FTV9SRUNMQUlNLCAwKTsKIAkJCWlmICghYWZzX2xvY2tfbWFuYWdlcikKIAkJCQlyZXQgPSAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9mcy9hZnMvZnNjbGllbnQuYyBiL2ZzL2Fmcy9mc2NsaWVudC5jCmluZGV4IDkzMTJiOTIuLjk2ZjRkNzYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9mc2NsaWVudC5jCisrKyBiL2ZzL2Fmcy9mc2NsaWVudC5jCkBAIC0yMzUsMTYgKzIzNSwxNSBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5GZXRjaFN0YXR1cwogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2ZldGNoX3N0YXR1cyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZmV0Y2hfc3RhdHVzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OwogCWNvbnN0IF9fYmUzMiAqYnA7CiAJaW50IHJldDsKIAotCV9lbnRlcigiLCwldSIsIGxhc3QpOworCV9lbnRlcigiIik7CiAKLQlyZXQgPSBhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiLCBsYXN0KTsKKwlyZXQgPSBhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTMwNyw4ICszMDYsNyBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5GZXRjaERhdGEKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19mZXRjaF9kYXRhKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwKLQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZmV0Y2hfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBjYWxsLT5yZXBseTsKIAljb25zdCBfX2JlMzIgKmJwOwpAQCAtMzE2LDcgKzMxNCw3IEBACiAJdm9pZCAqYnVmZmVyOwogCWludCByZXQ7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoInsldX0iLCBjYWxsLT51bm1hcnNoYWxsKTsKIAogCXN3aXRjaCAoY2FsbC0+dW5tYXJzaGFsbCkgewogCWNhc2UgMDoKQEAgLTMzMiw3ICszMzAsNyBAQAogCQkgKiBjbGllbnQpICovCiAJY2FzZSAxOgogCQlfZGVidWcoImV4dHJhY3QgZGF0YSBsZW5ndGggKE1TVykiKTsKLQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsICZjYWxsLT50bXAsIDQpOworCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsICZjYWxsLT50bXAsIDQsIHRydWUpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTM0Nyw3ICszNDUsNyBAQAogCQkvKiBleHRyYWN0IHRoZSByZXR1cm5lZCBkYXRhIGxlbmd0aCAqLwogCWNhc2UgMjoKIAkJX2RlYnVnKCJleHRyYWN0IGRhdGEgbGVuZ3RoIik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCAmY2FsbC0+dG1wLCA0KTsKKwkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCAmY2FsbC0+dG1wLCA0LCB0cnVlKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCkBAIC0zNjMsMTAgKzM2MSwxMCBAQAogCQlfZGVidWcoImV4dHJhY3QgZGF0YSIpOwogCQlpZiAoY2FsbC0+Y291bnQgPiAwKSB7CiAJCQlwYWdlID0gY2FsbC0+cmVwbHkzOwotCQkJYnVmZmVyID0ga21hcF9hdG9taWMocGFnZSk7Ci0JCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgYnVmZmVyLAotCQkJCQkgICAgICAgY2FsbC0+Y291bnQpOwotCQkJa3VubWFwX2F0b21pYyhidWZmZXIpOworCQkJYnVmZmVyID0ga21hcChwYWdlKTsKKwkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgYnVmZmVyLAorCQkJCQkgICAgICAgY2FsbC0+Y291bnQsIHRydWUpOworCQkJa3VubWFwKGJ1ZmZlcik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0OwogCQl9CkBAIC0zNzYsOCArMzc0LDggQEAKIAogCQkvKiBleHRyYWN0IHRoZSBtZXRhZGF0YSAqLwogCWNhc2UgNDoKLQkJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBza2IsIGxhc3QsIGNhbGwtPmJ1ZmZlciwKLQkJCQkgICAgICAgKDIxICsgMyArIDYpICogNCk7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICAoMjEgKyAzICsgNikgKiA0LCBmYWxzZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIApAQCAtMzkxLDE4ICszODksMTUgQEAKIAkJY2FsbC0+dW5tYXJzaGFsbCsrOwogCiAJY2FzZSA1OgotCQlyZXQgPSBhZnNfZGF0YV9jb21wbGV0ZShjYWxsLCBza2IsIGxhc3QpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CiAJCWJyZWFrOwogCX0KIAogCWlmIChjYWxsLT5jb3VudCA8IFBBR0VfU0laRSkgewogCQlfZGVidWcoImNsZWFyIik7CiAJCXBhZ2UgPSBjYWxsLT5yZXBseTM7Ci0JCWJ1ZmZlciA9IGttYXBfYXRvbWljKHBhZ2UpOworCQlidWZmZXIgPSBrbWFwKHBhZ2UpOwogCQltZW1zZXQoYnVmZmVyICsgY2FsbC0+Y291bnQsIDAsIFBBR0VfU0laRSAtIGNhbGwtPmNvdW50KTsKLQkJa3VubWFwX2F0b21pYyhidWZmZXIpOworCQlrdW5tYXAoYnVmZmVyKTsKIAl9CiAKIAlfbGVhdmUoIiA9IDAgW2RvbmVdIik7CkBAIC01MTUsMTMgKzUxMCwxMiBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5HaXZlVXBDYWxsQmFja3MKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19naXZlX3VwX2NhbGxiYWNrcyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2dpdmVfdXBfY2FsbGJhY2tzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKLQlfZW50ZXIoIix7JXV9LCVkIiwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigiIik7CiAKIAkvKiBzaG91bGRuJ3QgYmUgYW55IHJlcGx5IGRhdGEgKi8KLQlyZXR1cm4gYWZzX2RhdGFfY29tcGxldGUoY2FsbCwgc2tiLCBsYXN0KTsKKwlyZXR1cm4gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBOVUxMLCAwLCBmYWxzZSk7CiB9CiAKIC8qCkBAIC01OTksMTYgKzU5MywxNSBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5DcmVhdGVGaWxlIG9yIGFuIEZTLk1ha2VEaXIKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19jcmVhdGVfdm5vZGUoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2NyZWF0ZV92bm9kZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBjYWxsLT5yZXBseTsKIAljb25zdCBfX2JlMzIgKmJwOwogCWludCByZXQ7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoInsldX0iLCBjYWxsLT51bm1hcnNoYWxsKTsKIAotCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsLCBza2IsIGxhc3QpOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNjk2LDE2ICs2ODksMTUgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuUmVtb3ZlRmlsZSBvciBGUy5SZW1vdmVEaXIKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19yZW1vdmUoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3JlbW92ZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBjYWxsLT5yZXBseTsKIAljb25zdCBfX2JlMzIgKmJwOwogCWludCByZXQ7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoInsldX0iLCBjYWxsLT51bm1hcnNoYWxsKTsKIAotCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsLCBza2IsIGxhc3QpOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNzc3LDE2ICs3NjksMTUgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuTGluawogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2xpbmsoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfbGluayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJc3RydWN0IGFmc192bm9kZSAqZHZub2RlID0gY2FsbC0+cmVwbHksICp2bm9kZSA9IGNhbGwtPnJlcGx5MjsKIAljb25zdCBfX2JlMzIgKmJwOwogCWludCByZXQ7CiAKLQlfZW50ZXIoInsldX0seyV1fSwlZCIsIGNhbGwtPnVubWFyc2hhbGwsIHNrYi0+bGVuLCBsYXN0KTsKKwlfZW50ZXIoInsldX0iLCBjYWxsLT51bm1hcnNoYWxsKTsKIAotCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsLCBza2IsIGxhc3QpOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtODYzLDE2ICs4NTQsMTUgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuU3ltbGluawogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3N5bWxpbmsoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19zeW1saW5rKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OwogCWNvbnN0IF9fYmUzMiAqYnA7CiAJaW50IHJldDsKIAotCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOwogCi0JcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYiwgbGFzdCk7CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC05NjgsMTYgKzk1OCwxNSBAQAogLyoKICAqIGRlbGl2ZXIgcmVwbHkgZGF0YSB0byBhbiBGUy5SZW5hbWUKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19yZW5hbWUoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19yZW5hbWUoc3RydWN0IGFmc19jYWxsICpjYWxsKQogewogCXN0cnVjdCBhZnNfdm5vZGUgKm9yaWdfZHZub2RlID0gY2FsbC0+cmVwbHksICpuZXdfZHZub2RlID0gY2FsbC0+cmVwbHkyOwogCWNvbnN0IF9fYmUzMiAqYnA7CiAJaW50IHJldDsKIAotCV9lbnRlcigieyV1fSx7JXV9LCVkIiwgY2FsbC0+dW5tYXJzaGFsbCwgc2tiLT5sZW4sIGxhc3QpOworCV9lbnRlcigieyV1fSIsIGNhbGwtPnVubWFyc2hhbGwpOwogCi0JcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYiwgbGFzdCk7CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMDcyLDE2ICsxMDYxLDE1IEBACiAvKgogICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLlN0b3JlRGF0YQogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3N0b3JlX2RhdGEoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19zdG9yZV9kYXRhKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCkKIHsKIAlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IGNhbGwtPnJlcGx5OwogCWNvbnN0IF9fYmUzMiAqYnA7CiAJaW50IHJldDsKIAotCV9lbnRlcigiLCwldSIsIGxhc3QpOworCV9lbnRlcigiIik7CiAKLQlyZXQgPSBhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiLCBsYXN0KTsKKwlyZXQgPSBhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTEyNTEsMTcgKzEyMzksMTYgQEAKIC8qCiAgKiBkZWxpdmVyIHJlcGx5IGRhdGEgdG8gYW4gRlMuU3RvcmVTdGF0dXMKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc19zdG9yZV9zdGF0dXMoc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3N0b3JlX3N0YXR1cyhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJYWZzX2RhdGF2ZXJzaW9uX3QgKnN0b3JlX3ZlcnNpb247CiAJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSBjYWxsLT5yZXBseTsKIAljb25zdCBfX2JlMzIgKmJwOwogCWludCByZXQ7CiAKLQlfZW50ZXIoIiwsJXUiLCBsYXN0KTsKKwlfZW50ZXIoIiIpOwogCi0JcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwsIHNrYiwgbGFzdCk7CisJcmV0ID0gYWZzX3RyYW5zZmVyX3JlcGx5KGNhbGwpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNDQzLDE0ICsxNDMwLDEzIEBACiAvKgogICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLkdldFZvbHVtZVN0YXR1cwogICovCi1zdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX2dldF92b2x1bWVfc3RhdHVzKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwKLQkJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfZnNfZ2V0X3ZvbHVtZV9zdGF0dXMoc3RydWN0IGFmc19jYWxsICpjYWxsKQogewogCWNvbnN0IF9fYmUzMiAqYnA7CiAJY2hhciAqcDsKIAlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisJX2VudGVyKCJ7JXV9IiwgY2FsbC0+dW5tYXJzaGFsbCk7CiAKIAlzd2l0Y2ggKGNhbGwtPnVubWFyc2hhbGwpIHsKIAljYXNlIDA6CkBAIC0xNDYwLDggKzE0NDYsOCBAQAogCQkvKiBleHRyYWN0IHRoZSByZXR1cm5lZCBzdGF0dXMgcmVjb3JkICovCiAJY2FzZSAxOgogCQlfZGVidWcoImV4dHJhY3Qgc3RhdHVzIik7Ci0JCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5idWZmZXIsCi0JCQkJICAgICAgIDEyICogNCk7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICAxMiAqIDQsIHRydWUpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTE0NzIsNyArMTQ1OCw3IEBACiAKIAkJLyogZXh0cmFjdCB0aGUgdm9sdW1lIG5hbWUgbGVuZ3RoICovCiAJY2FzZSAyOgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgJmNhbGwtPnRtcCwgNCk7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgJmNhbGwtPnRtcCwgNCwgdHJ1ZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIApAQCAtMTQ4Nyw4ICsxNDczLDggQEAKIAljYXNlIDM6CiAJCV9kZWJ1ZygiZXh0cmFjdCB2b2xuYW1lIik7CiAJCWlmIChjYWxsLT5jb3VudCA+IDApIHsKLQkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5yZXBseTMsCi0JCQkJCSAgICAgICBjYWxsLT5jb3VudCk7CisJCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPnJlcGx5MywKKwkJCQkJICAgICAgIGNhbGwtPmNvdW50LCB0cnVlKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAJCX0KQEAgLTE1MDgsOCArMTQ5NCw4IEBACiAJCWNhbGwtPmNvdW50ID0gNCAtIChjYWxsLT5jb3VudCAmIDMpOwogCiAJY2FzZSA0OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAotCQkJCSAgICAgICBjYWxsLT5jb3VudCk7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICBjYWxsLT5jb3VudCwgdHJ1ZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIApAQCAtMTUxOSw3ICsxNTA1LDcgQEAKIAogCQkvKiBleHRyYWN0IHRoZSBvZmZsaW5lIG1lc3NhZ2UgbGVuZ3RoICovCiAJY2FzZSA1OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgJmNhbGwtPnRtcCwgNCk7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgJmNhbGwtPnRtcCwgNCwgdHJ1ZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIApAQCAtMTUzNCw4ICsxNTIwLDggQEAKIAljYXNlIDY6CiAJCV9kZWJ1ZygiZXh0cmFjdCBvZmZsaW5lIik7CiAJCWlmIChjYWxsLT5jb3VudCA+IDApIHsKLQkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5yZXBseTMsCi0JCQkJCSAgICAgICBjYWxsLT5jb3VudCk7CisJCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPnJlcGx5MywKKwkJCQkJICAgICAgIGNhbGwtPmNvdW50LCB0cnVlKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAJCX0KQEAgLTE1NTUsOCArMTU0MSw4IEBACiAJCWNhbGwtPmNvdW50ID0gNCAtIChjYWxsLT5jb3VudCAmIDMpOwogCiAJY2FzZSA3OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAotCQkJCSAgICAgICBjYWxsLT5jb3VudCk7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICBjYWxsLT5jb3VudCwgdHJ1ZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIApAQCAtMTU2Niw3ICsxNTUyLDcgQEAKIAogCQkvKiBleHRyYWN0IHRoZSBtZXNzYWdlIG9mIHRoZSBkYXkgbGVuZ3RoICovCiAJY2FzZSA4OgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgJmNhbGwtPnRtcCwgNCk7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgJmNhbGwtPnRtcCwgNCwgdHJ1ZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIApAQCAtMTU4MSw4ICsxNTY3LDggQEAKIAljYXNlIDk6CiAJCV9kZWJ1ZygiZXh0cmFjdCBtb3RkIik7CiAJCWlmIChjYWxsLT5jb3VudCA+IDApIHsKLQkJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgc2tiLCBsYXN0LCBjYWxsLT5yZXBseTMsCi0JCQkJCSAgICAgICBjYWxsLT5jb3VudCk7CisJCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIGNhbGwtPnJlcGx5MywKKwkJCQkJICAgICAgIGNhbGwtPmNvdW50LCB0cnVlKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAJCX0KQEAgLTE1OTUsMjYgKzE1ODEsMTcgQEAKIAkJY2FsbC0+dW5tYXJzaGFsbCsrOwogCiAJCS8qIGV4dHJhY3QgdGhlIG1lc3NhZ2Ugb2YgdGhlIGRheSBwYWRkaW5nICovCi0JCWlmICgoY2FsbC0+Y291bnQgJiAzKSA9PSAwKSB7Ci0JCQljYWxsLT51bm1hcnNoYWxsKys7Ci0JCQlnb3RvIG5vX21vdGRfcGFkZGluZzsKLQkJfQotCQljYWxsLT5jb3VudCA9IDQgLSAoY2FsbC0+Y291bnQgJiAzKTsKKwkJY2FsbC0+Y291bnQgPSAoNCAtIChjYWxsLT5jb3VudCAmIDMpKSAmIDM7CiAKIAljYXNlIDEwOgotCQlyZXQgPSBhZnNfZXh0cmFjdF9kYXRhKGNhbGwsIHNrYiwgbGFzdCwgY2FsbC0+YnVmZmVyLAotCQkJCSAgICAgICBjYWxsLT5jb3VudCk7CisJCXJldCA9IGFmc19leHRyYWN0X2RhdGEoY2FsbCwgY2FsbC0+YnVmZmVyLAorCQkJCSAgICAgICBjYWxsLT5jb3VudCwgZmFsc2UpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKIAkJY2FsbC0+b2Zmc2V0ID0gMDsKIAkJY2FsbC0+dW5tYXJzaGFsbCsrOwotCW5vX21vdGRfcGFkZGluZzoKLQogCWNhc2UgMTE6Ci0JCXJldCA9IGFmc19kYXRhX2NvbXBsZXRlKGNhbGwsIHNrYiwgbGFzdCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKIAkJYnJlYWs7CiAJfQogCkBAIC0xNjg1LDE1ICsxNjYyLDE0IEBACiAvKgogICogZGVsaXZlciByZXBseSBkYXRhIHRvIGFuIEZTLlNldExvY2ssIEZTLkV4dGVuZExvY2sgb3IgRlMuUmVsZWFzZUxvY2sKICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9mc194eHh4X2xvY2soc3RydWN0IGFmc19jYWxsICpjYWxsLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIGxhc3QpCitzdGF0aWMgaW50IGFmc19kZWxpdmVyX2ZzX3h4eHhfbG9jayhzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJY29uc3QgX19iZTMyICpicDsKIAlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHsldX0sJWQiLCBjYWxsLT51bm1hcnNoYWxsLCBza2ItPmxlbiwgbGFzdCk7CisJX2VudGVyKCJ7JXV9IiwgY2FsbC0+dW5tYXJzaGFsbCk7CiAKLQlyZXQgPSBhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCwgc2tiLCBsYXN0KTsKKwlyZXQgPSBhZnNfdHJhbnNmZXJfcmVwbHkoY2FsbCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9pbnRlcm5hbC5oIGIvZnMvYWZzL2ludGVybmFsLmgKaW5kZXggZGY5NzZiMi4uNTQ5N2M4NCAxMDA2NDQKLS0tIGEvZnMvYWZzL2ludGVybmFsLmgKKysrIGIvZnMvYWZzL2ludGVybmFsLmgKQEAgLTEzLDEzICsxMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3J4cnBjLmg+CiAjaW5jbHVkZSA8bGludXgva2V5Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9mc2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KIAogI2luY2x1ZGUgImFmcy5oIgogI2luY2x1ZGUgImFmc192bC5oIgpAQCAtNTYsNyArNTYsNyBAQAogICovCiBzdHJ1Y3QgYWZzX3dhaXRfbW9kZSB7CiAJLyogUnhSUEMgcmVjZWl2ZWQgbWVzc2FnZSBub3RpZmljYXRpb24gKi8KLQl2b2lkICgqcnhfd2FrZXVwKShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpOworCXJ4cnBjX25vdGlmeV9yeF90IG5vdGlmeV9yeDsKIAogCS8qIHN5bmNocm9ub3VzIGNhbGwgd2FpdGVyIGFuZCBjYWxsIGRpc3BhdGNoZWQgbm90aWZpY2F0aW9uICovCiAJaW50ICgqd2FpdCkoc3RydWN0IGFmc19jYWxsICpjYWxsKTsKQEAgLTc1LDEwICs3NSw4IEBACiAJY29uc3Qgc3RydWN0IGFmc19jYWxsX3R5cGUgKnR5cGU7CS8qIHR5cGUgb2YgY2FsbCAqLwogCWNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICp3YWl0X21vZGU7CS8qIGNvbXBsZXRpb24gd2FpdCBtb2RlICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CQkvKiBwcm9jZXNzZXMgYXdhaXRpbmcgY29tcGxldGlvbiAqLwotCXZvaWQgKCphc3luY193b3JrZm4pKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCk7IC8qIGFzeW5jaHJvbm91cyB3b3JrIGZ1bmN0aW9uICovCiAJc3RydWN0IHdvcmtfc3RydWN0CWFzeW5jX3dvcms7CS8qIGFzeW5jaHJvbm91cyB3b3JrIHByb2Nlc3NvciAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwkJLyogYWN0dWFsIHdvcmsgcHJvY2Vzc29yICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlyeF9xdWV1ZTsJLyogcmVjZWl2ZWQgcGFja2V0cyAqLwogCXN0cnVjdCByeHJwY19jYWxsCSpyeGNhbGw7CS8qIFJ4UlBDIGNhbGwgaGFuZGxlICovCiAJc3RydWN0IGtleQkJKmtleTsJCS8qIHNlY3VyaXR5IGZvciB0aGlzIGNhbGwgKi8KIAlzdHJ1Y3QgYWZzX3NlcnZlcgkqc2VydmVyOwkvKiBzZXJ2ZXIgYWZmZWN0ZWQgYnkgaW5jb21pbmcgQ00gY2FsbCAqLwpAQCAtOTIsNiArOTAsNyBAQAogCXZvaWQJCQkqcmVwbHk0OwkvKiByZXBseSBidWZmZXIgKGZvdXJ0aCBwYXJ0KSAqLwogCXBnb2ZmX3QJCQlmaXJzdDsJCS8qIGZpcnN0IHBhZ2UgaW4gbWFwcGluZyB0byBkZWFsIHdpdGggKi8KIAlwZ29mZl90CQkJbGFzdDsJCS8qIGxhc3QgcGFnZSBpbiBtYXBwaW5nIHRvIGRlYWwgd2l0aCAqLworCXNpemVfdAkJCW9mZnNldDsJCS8qIG9mZnNldCBpbnRvIHJlY2VpdmVkIGRhdGEgc3RvcmUgKi8KIAllbnVtIHsJCQkJCS8qIGNhbGwgc3RhdGUgKi8KIAkJQUZTX0NBTExfUkVRVUVTVElORywJLyogcmVxdWVzdCBpcyBiZWluZyBzZW50IGZvciBvdXRnb2luZyBjYWxsICovCiAJCUFGU19DQUxMX0FXQUlUX1JFUExZLAkvKiBhd2FpdGluZyByZXBseSB0byBvdXRnb2luZyBjYWxsICovCkBAIC05OSwyMSArOTgsMTggQEAKIAkJQUZTX0NBTExfQVdBSVRfUkVRVUVTVCwJLyogYXdhaXRpbmcgcmVxdWVzdCBkYXRhIG9uIGluY29taW5nIGNhbGwgKi8KIAkJQUZTX0NBTExfUkVQTFlJTkcsCS8qIHJlcGx5aW5nIHRvIGluY29taW5nIGNhbGwgKi8KIAkJQUZTX0NBTExfQVdBSVRfQUNLLAkvKiBhd2FpdGluZyBmaW5hbCBBQ0sgb2YgaW5jb21pbmcgY2FsbCAqLwotCQlBRlNfQ0FMTF9DT01QTEVURSwJLyogc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCAqLwotCQlBRlNfQ0FMTF9CVVNZLAkJLyogc2VydmVyIHdhcyBidXN5ICovCi0JCUFGU19DQUxMX0FCT1JURUQsCS8qIGNhbGwgd2FzIGFib3J0ZWQgKi8KLQkJQUZTX0NBTExfRVJST1IsCQkvKiBjYWxsIGZhaWxlZCBkdWUgdG8gZXJyb3IgKi8KKwkJQUZTX0NBTExfQ09NUExFVEUsCS8qIENvbXBsZXRlZCBvciBmYWlsZWQgKi8KIAl9CQkJc3RhdGU7CiAJaW50CQkJZXJyb3I7CQkvKiBlcnJvciBjb2RlICovCisJdTMyCQkJYWJvcnRfY29kZTsJLyogUmVtb3RlIGFib3J0IElEIG9yIDAgKi8KIAl1bnNpZ25lZAkJcmVxdWVzdF9zaXplOwkvKiBzaXplIG9mIHJlcXVlc3QgZGF0YSAqLwogCXVuc2lnbmVkCQlyZXBseV9tYXg7CS8qIG1heGltdW0gc2l6ZSBvZiByZXBseSAqLwotCXVuc2lnbmVkCQlyZXBseV9zaXplOwkvKiBjdXJyZW50IHNpemUgb2YgcmVwbHkgKi8KIAl1bnNpZ25lZAkJZmlyc3Rfb2Zmc2V0OwkvKiBvZmZzZXQgaW50byBtYXBwaW5nW2ZpcnN0XSAqLwogCXVuc2lnbmVkCQlsYXN0X3RvOwkvKiBhbW91bnQgb2YgbWFwcGluZ1tsYXN0XSAqLwotCXVuc2lnbmVkCQlvZmZzZXQ7CQkvKiBvZmZzZXQgaW50byByZWNlaXZlZCBkYXRhIHN0b3JlICovCiAJdW5zaWduZWQgY2hhcgkJdW5tYXJzaGFsbDsJLyogdW5tYXJzaGFsbGluZyBwaGFzZSAqLwogCWJvb2wJCQlpbmNvbWluZzsJLyogVCBpZiBpbmNvbWluZyBjYWxsICovCiAJYm9vbAkJCXNlbmRfcGFnZXM7CS8qIFQgaWYgZGF0YSBmcm9tIG1hcHBpbmcgc2hvdWxkIGJlIHNlbnQgKi8KKwlib29sCQkJbmVlZF9hdHRlbnRpb247CS8qIFQgaWYgUnhSUEMgcG9rZWQgdXMgKi8KIAl1MTYJCQlzZXJ2aWNlX2lkOwkvKiBSeFJQQyBzZXJ2aWNlIElEIHRvIGNhbGwgKi8KIAlfX2JlMTYJCQlwb3J0OwkJLyogdGFyZ2V0IFVEUCBwb3J0ICovCiAJX19iZTMyCQkJb3BlcmF0aW9uX0lEOwkvKiBvcGVyYXRpb24gSUQgZm9yIGFuIGluY29taW5nIGNhbGwgKi8KQEAgLTEyOCw4ICsxMjQsNyBAQAogCS8qIGRlbGl2ZXIgcmVxdWVzdCBvciByZXBseSBkYXRhIHRvIGFuIGNhbGwKIAkgKiAtIHJldHVybmluZyBhbiBlcnJvciB3aWxsIGNhdXNlIHRoZSBjYWxsIHRvIGJlIGFib3J0ZWQKIAkgKi8KLQlpbnQgKCpkZWxpdmVyKShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgICBib29sIGxhc3QpOworCWludCAoKmRlbGl2ZXIpKHN0cnVjdCBhZnNfY2FsbCAqY2FsbCk7CiAKIAkvKiBtYXAgYW4gYWJvcnQgY29kZSB0byBhbiBlcnJvciBudW1iZXIgKi8KIAlpbnQgKCphYm9ydF90b19lcnJvcikodTMyIGFib3J0X2NvZGUpOwpAQCAtNjA3LDI5ICs2MDIsMjIgQEAKIC8qCiAgKiByeHJwYy5jCiAgKi8KK2V4dGVybiBzdHJ1Y3Qgc29ja2V0ICphZnNfc29ja2V0OworCiBleHRlcm4gaW50IGFmc19vcGVuX3NvY2tldCh2b2lkKTsKIGV4dGVybiB2b2lkIGFmc19jbG9zZV9zb2NrZXQodm9pZCk7Ci1leHRlcm4gdm9pZCBhZnNfZGF0YV9jb25zdW1lZChzdHJ1Y3QgYWZzX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiBleHRlcm4gaW50IGFmc19tYWtlX2NhbGwoc3RydWN0IGluX2FkZHIgKiwgc3RydWN0IGFmc19jYWxsICosIGdmcF90LAogCQkJIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlICopOwogZXh0ZXJuIHN0cnVjdCBhZnNfY2FsbCAqYWZzX2FsbG9jX2ZsYXRfY2FsbChjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSAqLAogCQkJCQkgICAgc2l6ZV90LCBzaXplX3QpOwogZXh0ZXJuIHZvaWQgYWZzX2ZsYXRfY2FsbF9kZXN0cnVjdG9yKHN0cnVjdCBhZnNfY2FsbCAqKTsKLWV4dGVybiBpbnQgYWZzX3RyYW5zZmVyX3JlcGx5KHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKIGV4dGVybiB2b2lkIGFmc19zZW5kX2VtcHR5X3JlcGx5KHN0cnVjdCBhZnNfY2FsbCAqKTsKIGV4dGVybiB2b2lkIGFmc19zZW5kX3NpbXBsZV9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwotZXh0ZXJuIGludCBhZnNfZXh0cmFjdF9kYXRhKHN0cnVjdCBhZnNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sLCB2b2lkICosCi0JCQkgICAgc2l6ZV90KTsKK2V4dGVybiBpbnQgYWZzX2V4dHJhY3RfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKiwgdm9pZCAqLCBzaXplX3QsIGJvb2wpOwogCi1zdGF0aWMgaW5saW5lIGludCBhZnNfZGF0YV9jb21wbGV0ZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIGJvb2wgbGFzdCkKK3N0YXRpYyBpbmxpbmUgaW50IGFmc190cmFuc2Zlcl9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7Ci0JaWYgKHNrYi0+bGVuID4gMCkKLQkJcmV0dXJuIC1FQkFETVNHOwotCWFmc19kYXRhX2NvbnN1bWVkKGNhbGwsIHNrYik7Ci0JaWYgKCFsYXN0KQotCQlyZXR1cm4gLUVBR0FJTjsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCBjYWxsLT5idWZmZXIsIGNhbGwtPnJlcGx5X21heCwgZmFsc2UpOwogfQogCiAvKgpAQCAtNjU0LDcgKzY0Miw3IEBACiAKIGV4dGVybiBzdHJ1Y3QgYWZzX3NlcnZlciAqYWZzX2xvb2t1cF9zZXJ2ZXIoc3RydWN0IGFmc19jZWxsICosCiAJCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqKTsKLWV4dGVybiBzdHJ1Y3QgYWZzX3NlcnZlciAqYWZzX2ZpbmRfc2VydmVyKGNvbnN0IHN0cnVjdCBpbl9hZGRyICopOworZXh0ZXJuIHN0cnVjdCBhZnNfc2VydmVyICphZnNfZmluZF9zZXJ2ZXIoY29uc3Qgc3RydWN0IHNvY2thZGRyX3J4cnBjICopOwogZXh0ZXJuIHZvaWQgYWZzX3B1dF9zZXJ2ZXIoc3RydWN0IGFmc19zZXJ2ZXIgKik7CiBleHRlcm4gdm9pZCBfX2V4aXQgYWZzX3B1cmdlX3NlcnZlcnModm9pZCk7CiAKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9tYWluLmMgYi9mcy9hZnMvbWFpbi5jCmluZGV4IDM1ZGUwYzAuLjBiMTg3ZWYgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9tYWluLmMKKysrIGIvZnMvYWZzL21haW4uYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkFGUyBDbGllbnQgRmlsZSBTeXN0ZW0iKTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9yeHJwYy5jIGIvZnMvYWZzL3J4cnBjLmMKaW5kZXggMTRkMDRjOC4uNTliZGFhNyAxMDA2NDQKLS0tIGEvZnMvYWZzL3J4cnBjLmMKKysrIGIvZnMvYWZzL3J4cnBjLmMKQEAgLTE2LDM0ICsxNiwzNiBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYWZzX2NtLmgiCiAKLXN0YXRpYyBzdHJ1Y3Qgc29ja2V0ICphZnNfc29ja2V0OyAvKiBteSBSeFJQQyBzb2NrZXQgKi8KK3N0cnVjdCBzb2NrZXQgKmFmc19zb2NrZXQ7IC8qIG15IFJ4UlBDIHNvY2tldCAqLwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphZnNfYXN5bmNfY2FsbHM7CitzdGF0aWMgc3RydWN0IGFmc19jYWxsICphZnNfc3BhcmVfaW5jb21pbmdfY2FsbDsKIHN0YXRpYyBhdG9taWNfdCBhZnNfb3V0c3RhbmRpbmdfY2FsbHM7Ci1zdGF0aWMgYXRvbWljX3QgYWZzX291dHN0YW5kaW5nX3NrYnM7CiAKLXN0YXRpYyB2b2lkIGFmc193YWtlX3VwX2NhbGxfd2FpdGVyKHN0cnVjdCBhZnNfY2FsbCAqKTsKK3N0YXRpYyB2b2lkIGFmc19mcmVlX2NhbGwoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfY2FsbF93YWl0ZXIoc3RydWN0IHNvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwgdW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgaW50IGFmc193YWl0X2Zvcl9jYWxsX3RvX2NvbXBsZXRlKHN0cnVjdCBhZnNfY2FsbCAqKTsKLXN0YXRpYyB2b2lkIGFmc193YWtlX3VwX2FzeW5jX2NhbGwoc3RydWN0IGFmc19jYWxsICopOworc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfYXN5bmNfY2FsbChzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1bnNpZ25lZCBsb25nKTsKIHN0YXRpYyBpbnQgYWZzX2RvbnRfd2FpdF9mb3JfY2FsbF90b19jb21wbGV0ZShzdHJ1Y3QgYWZzX2NhbGwgKik7Ci1zdGF0aWMgdm9pZCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKHN0cnVjdCBhZnNfY2FsbCAqKTsKLXN0YXRpYyB2b2lkIGFmc19yeF9pbnRlcmNlcHRvcihzdHJ1Y3Qgc29jayAqLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY21fb3BfaWQoc3RydWN0IGFmc19jYWxsICosIHN0cnVjdCBza19idWZmICosIGJvb2wpOworc3RhdGljIHZvaWQgYWZzX3Byb2Nlc3NfYXN5bmNfY2FsbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBhZnNfcnhfbmV3X2NhbGwoc3RydWN0IHNvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwgdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgdm9pZCBhZnNfcnhfZGlzY2FyZF9uZXdfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1bnNpZ25lZCBsb25nKTsKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfY21fb3BfaWQoc3RydWN0IGFmc19jYWxsICopOwogCiAvKiBzeW5jaHJvbm91cyBjYWxsIG1hbmFnZW1lbnQgKi8KIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlIGFmc19zeW5jX2NhbGwgPSB7Ci0JLnJ4X3dha2V1cAk9IGFmc193YWtlX3VwX2NhbGxfd2FpdGVyLAorCS5ub3RpZnlfcngJPSBhZnNfd2FrZV91cF9jYWxsX3dhaXRlciwKIAkud2FpdAkJPSBhZnNfd2FpdF9mb3JfY2FsbF90b19jb21wbGV0ZSwKIH07CiAKIC8qIGFzeW5jaHJvbm91cyBjYWxsIG1hbmFnZW1lbnQgKi8KIGNvbnN0IHN0cnVjdCBhZnNfd2FpdF9tb2RlIGFmc19hc3luY19jYWxsID0gewotCS5yeF93YWtldXAJPSBhZnNfd2FrZV91cF9hc3luY19jYWxsLAorCS5ub3RpZnlfcngJPSBhZnNfd2FrZV91cF9hc3luY19jYWxsLAogCS53YWl0CQk9IGFmc19kb250X3dhaXRfZm9yX2NhbGxfdG9fY29tcGxldGUsCiB9OwogCiAvKiBhc3luY2hyb25vdXMgaW5jb21pbmcgY2FsbCBtYW5hZ2VtZW50ICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFmc193YWl0X21vZGUgYWZzX2FzeW5jX2luY29taW5nX2NhbGwgPSB7Ci0JLnJ4X3dha2V1cAk9IGFmc193YWtlX3VwX2FzeW5jX2NhbGwsCisJLm5vdGlmeV9yeAk9IGFmc193YWtlX3VwX2FzeW5jX2NhbGwsCiB9OwogCiAvKiBhc3luY2hyb25vdXMgaW5jb21pbmcgY2FsbCBpbml0aWFsIHByb2Nlc3NpbmcgKi8KQEAgLTUzLDE3ICs1NSw5IEBACiAJLmFib3J0X3RvX2Vycm9yCT0gYWZzX2Fib3J0X3RvX2Vycm9yLAogfTsKIAotc3RhdGljIHZvaWQgYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBhZnNfY2hhcmdlX3ByZWFsbG9jYXRpb24oc3RydWN0IHdvcmtfc3RydWN0ICopOwogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmZfaGVhZCBhZnNfaW5jb21pbmdfY2FsbHM7Ci1zdGF0aWMgREVDTEFSRV9XT1JLKGFmc19jb2xsZWN0X2luY29taW5nX2NhbGxfd29yaywgYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbCk7Ci0KLXN0YXRpYyB2b2lkIGFmc19hc3luY193b3JrZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYWZzX2NhbGwsIGFzeW5jX3dvcmspOwotCi0JY2FsbC0+YXN5bmNfd29ya2ZuKGNhbGwpOwotfQorc3RhdGljIERFQ0xBUkVfV09SSyhhZnNfY2hhcmdlX3ByZWFsbG9jYXRpb25fd29yaywgYWZzX2NoYXJnZV9wcmVhbGxvY2F0aW9uKTsKIAogc3RhdGljIGludCBhZnNfd2FpdF9hdG9taWNfdChhdG9taWNfdCAqcCkKIHsKQEAgLTgzLDEwICs3Nyw4IEBACiAKIAlfZW50ZXIoIiIpOwogCi0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYWZzX2luY29taW5nX2NhbGxzKTsKLQogCXJldCA9IC1FTk9NRU07Ci0JYWZzX2FzeW5jX2NhbGxzID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImthZnNkIik7CisJYWZzX2FzeW5jX2NhbGxzID0gYWxsb2Nfd29ya3F1ZXVlKCJrYWZzZCIsIFdRX01FTV9SRUNMQUlNLCAwKTsKIAlpZiAoIWFmc19hc3luY19jYWxscykKIAkJZ290byBlcnJvcl8wOwogCkBAIC0xMTAsMTMgKzEwMiwxNSBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yXzI7CiAKKwlyeHJwY19rZXJuZWxfbmV3X2NhbGxfbm90aWZpY2F0aW9uKHNvY2tldCwgYWZzX3J4X25ld19jYWxsLAorCQkJCQkgICBhZnNfcnhfZGlzY2FyZF9uZXdfY2FsbCk7CisKIAlyZXQgPSBrZXJuZWxfbGlzdGVuKHNvY2tldCwgSU5UX01BWCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3JfMjsKIAotCXJ4cnBjX2tlcm5lbF9pbnRlcmNlcHRfcnhfbWVzc2FnZXMoc29ja2V0LCBhZnNfcnhfaW50ZXJjZXB0b3IpOwotCiAJYWZzX3NvY2tldCA9IHNvY2tldDsKKwlhZnNfY2hhcmdlX3ByZWFsbG9jYXRpb24oTlVMTCk7CiAJX2xlYXZlKCIgPSAwIik7CiAJcmV0dXJuIDA7CiAKQEAgLTEzNiw1MiArMTMwLDI4IEBACiB7CiAJX2VudGVyKCIiKTsKIAorCWlmIChhZnNfc3BhcmVfaW5jb21pbmdfY2FsbCkgeworCQlhdG9taWNfaW5jKCZhZnNfb3V0c3RhbmRpbmdfY2FsbHMpOworCQlhZnNfZnJlZV9jYWxsKGFmc19zcGFyZV9pbmNvbWluZ19jYWxsKTsKKwkJYWZzX3NwYXJlX2luY29taW5nX2NhbGwgPSBOVUxMOworCX0KKworCV9kZWJ1Zygib3V0c3RhbmRpbmcgJXUiLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX2NhbGxzKSk7CiAJd2FpdF9vbl9hdG9taWNfdCgmYWZzX291dHN0YW5kaW5nX2NhbGxzLCBhZnNfd2FpdF9hdG9taWNfdCwKIAkJCSBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJX2RlYnVnKCJubyBvdXRzdGFuZGluZyBjYWxscyIpOwogCisJZmx1c2hfd29ya3F1ZXVlKGFmc19hc3luY19jYWxscyk7CisJa2VybmVsX3NvY2tfc2h1dGRvd24oYWZzX3NvY2tldCwgU0hVVF9SRFdSKTsKKwlmbHVzaF93b3JrcXVldWUoYWZzX2FzeW5jX2NhbGxzKTsKIAlzb2NrX3JlbGVhc2UoYWZzX3NvY2tldCk7CiAKIAlfZGVidWcoImRld29yayIpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGFmc19hc3luY19jYWxscyk7Ci0KLQlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSwgPT0sIDApOwogCV9sZWF2ZSgiIik7CiB9CiAKIC8qCi0gKiBOb3RlIHRoYXQgdGhlIGRhdGEgaW4gYSBzb2NrZXQgYnVmZmVyIGlzIG5vdyBjb25zdW1lZC4KLSAqLwotdm9pZCBhZnNfZGF0YV9jb25zdW1lZChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYgKCFza2IpIHsKLQkJX2RlYnVnKCJETFZSIE5VTEwgWyVkXSIsIGF0b21pY19yZWFkKCZhZnNfb3V0c3RhbmRpbmdfc2ticykpOwotCQlkdW1wX3N0YWNrKCk7Ci0JfSBlbHNlIHsKLQkJX2RlYnVnKCJETFZSICVweyV1fSBbJWRdIiwKLQkJICAgICAgIHNrYiwgc2tiLT5tYXJrLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX3NrYnMpKTsKLQkJcnhycGNfa2VybmVsX2RhdGFfY29uc3VtZWQoY2FsbC0+cnhjYWxsLCBza2IpOwotCX0KLX0KLQotLyoKLSAqIGZyZWUgYSBzb2NrZXQgYnVmZmVyCi0gKi8KLXN0YXRpYyB2b2lkIGFmc19mcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWlmICghc2tiKSB7Ci0JCV9kZWJ1ZygiRlJFRSBOVUxMIFslZF0iLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX3NrYnMpKTsKLQkJZHVtcF9zdGFjaygpOwotCX0gZWxzZSB7Ci0JCV9kZWJ1ZygiRlJFRSAlcHsldX0gWyVkXSIsCi0JCSAgICAgICBza2IsIHNrYi0+bWFyaywgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19za2JzKSk7Ci0JCWlmIChhdG9taWNfZGVjX3JldHVybigmYWZzX291dHN0YW5kaW5nX3NrYnMpID09IC0xKQotCQkJQlVHKCk7Ci0JCXJ4cnBjX2tlcm5lbF9mcmVlX3NrYihza2IpOwotCX0KLX0KLQotLyoKICAqIGZyZWUgYSBjYWxsCiAgKi8KIHN0YXRpYyB2b2lkIGFmc19mcmVlX2NhbGwoc3RydWN0IGFmc19jYWxsICpjYWxsKQpAQCAtMTkxLDcgKzE2MSw2IEBACiAKIAlBU1NFUlRDTVAoY2FsbC0+cnhjYWxsLCA9PSwgTlVMTCk7CiAJQVNTRVJUKCF3b3JrX3BlbmRpbmcoJmNhbGwtPmFzeW5jX3dvcmspKTsKLQlBU1NFUlQoc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9xdWV1ZSkpOwogCUFTU0VSVChjYWxsLT50eXBlLT5uYW1lICE9IE5VTEwpOwogCiAJa2ZyZWUoY2FsbC0+cmVxdWVzdCk7CkBAIC0yMDcsNyArMTc2LDcgQEAKIHN0YXRpYyB2b2lkIGFmc19lbmRfY2FsbF9ub2ZyZWUoc3RydWN0IGFmc19jYWxsICpjYWxsKQogewogCWlmIChjYWxsLT5yeGNhbGwpIHsKLQkJcnhycGNfa2VybmVsX2VuZF9jYWxsKGNhbGwtPnJ4Y2FsbCk7CisJCXJ4cnBjX2tlcm5lbF9lbmRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwpOwogCQljYWxsLT5yeGNhbGwgPSBOVUxMOwogCX0KIAlpZiAoY2FsbC0+dHlwZS0+ZGVzdHJ1Y3RvcikKQEAgLTIyNyw3ICsxOTYsNyBAQAogICogYWxsb2NhdGUgYSBjYWxsIHdpdGggZmxhdCByZXF1ZXN0IGFuZCByZXBseSBidWZmZXJzCiAgKi8KIHN0cnVjdCBhZnNfY2FsbCAqYWZzX2FsbG9jX2ZsYXRfY2FsbChjb25zdCBzdHJ1Y3QgYWZzX2NhbGxfdHlwZSAqdHlwZSwKLQkJCQkgICAgIHNpemVfdCByZXF1ZXN0X3NpemUsIHNpemVfdCByZXBseV9zaXplKQorCQkJCSAgICAgc2l6ZV90IHJlcXVlc3Rfc2l6ZSwgc2l6ZV90IHJlcGx5X21heCkKIHsKIAlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGw7CiAKQEAgLTI0MSw3ICsyMTAsNyBAQAogCiAJY2FsbC0+dHlwZSA9IHR5cGU7CiAJY2FsbC0+cmVxdWVzdF9zaXplID0gcmVxdWVzdF9zaXplOwotCWNhbGwtPnJlcGx5X21heCA9IHJlcGx5X3NpemU7CisJY2FsbC0+cmVwbHlfbWF4ID0gcmVwbHlfbWF4OwogCiAJaWYgKHJlcXVlc3Rfc2l6ZSkgewogCQljYWxsLT5yZXF1ZXN0ID0ga21hbGxvYyhyZXF1ZXN0X3NpemUsIEdGUF9OT0ZTKTsKQEAgLTI0OSwxNCArMjE4LDEzIEBACiAJCQlnb3RvIG5vbWVtX2ZyZWU7CiAJfQogCi0JaWYgKHJlcGx5X3NpemUpIHsKLQkJY2FsbC0+YnVmZmVyID0ga21hbGxvYyhyZXBseV9zaXplLCBHRlBfTk9GUyk7CisJaWYgKHJlcGx5X21heCkgeworCQljYWxsLT5idWZmZXIgPSBrbWFsbG9jKHJlcGx5X21heCwgR0ZQX05PRlMpOwogCQlpZiAoIWNhbGwtPmJ1ZmZlcikKIAkJCWdvdG8gbm9tZW1fZnJlZTsKIAl9CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWxsLT53YWl0cSk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2FsbC0+cnhfcXVldWUpOwogCXJldHVybiBjYWxsOwogCiBub21lbV9mcmVlOgpAQCAtMzI1LDggKzI5Myw4IEBACiAJCQkgKiByZXR1cm5zIGZyb20gc2VuZGluZyB0aGUgcmVxdWVzdCAqLwogCQkJaWYgKGZpcnN0ICsgbG9vcCA+PSBsYXN0KQogCQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfUkVQTFk7Ci0JCQlyZXQgPSByeHJwY19rZXJuZWxfc2VuZF9kYXRhKGNhbGwtPnJ4Y2FsbCwgbXNnLAotCQkJCQkJICAgICB0byAtIG9mZnNldCk7CisJCQlyZXQgPSByeHJwY19rZXJuZWxfc2VuZF9kYXRhKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwKKwkJCQkJCSAgICAgbXNnLCB0byAtIG9mZnNldCk7CiAJCQlrdW5tYXAocGFnZXNbbG9vcF0pOwogCQkJaWYgKHJldCA8IDApCiAJCQkJYnJlYWs7CkBAIC0zNTQsNyArMzIyLDYgQEAKIAlzdHJ1Y3QgbXNnaGRyIG1zZzsKIAlzdHJ1Y3Qga3ZlYyBpb3ZbMV07CiAJaW50IHJldDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJX2VudGVyKCIleCx7JWR9LCIsIGFkZHItPnNfYWRkciwgbnRvaHMoY2FsbC0+cG9ydCkpOwogCkBAIC0zNjYsOCArMzMzLDcgQEAKIAkgICAgICAgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19jYWxscykpOwogCiAJY2FsbC0+d2FpdF9tb2RlID0gd2FpdF9tb2RlOwotCWNhbGwtPmFzeW5jX3dvcmtmbiA9IGFmc19wcm9jZXNzX2FzeW5jX2NhbGw7Ci0JSU5JVF9XT1JLKCZjYWxsLT5hc3luY193b3JrLCBhZnNfYXN5bmNfd29ya2ZuKTsKKwlJTklUX1dPUksoJmNhbGwtPmFzeW5jX3dvcmssIGFmc19wcm9jZXNzX2FzeW5jX2NhbGwpOwogCiAJbWVtc2V0KCZzcngsIDAsIHNpemVvZihzcngpKTsKIAlzcnguc3J4X2ZhbWlseSA9IEFGX1JYUlBDOwpAQCAtMzgwLDcgKzM0Niw4IEBACiAKIAkvKiBjcmVhdGUgYSBjYWxsICovCiAJcnhjYWxsID0gcnhycGNfa2VybmVsX2JlZ2luX2NhbGwoYWZzX3NvY2tldCwgJnNyeCwgY2FsbC0+a2V5LAotCQkJCQkgKHVuc2lnbmVkIGxvbmcpIGNhbGwsIGdmcCk7CisJCQkJCSAodW5zaWduZWQgbG9uZykgY2FsbCwgZ2ZwLAorCQkJCQkgd2FpdF9tb2RlLT5ub3RpZnlfcngpOwogCWNhbGwtPmtleSA9IE5VTEw7CiAJaWYgKElTX0VSUihyeGNhbGwpKSB7CiAJCXJldCA9IFBUUl9FUlIocnhjYWxsKTsKQEAgLTQwNiw3ICszNzMsOCBAQAogCSAqIHJlcXVlc3QgKi8KIAlpZiAoIWNhbGwtPnNlbmRfcGFnZXMpCiAJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfUkVQTFk7Ci0JcmV0ID0gcnhycGNfa2VybmVsX3NlbmRfZGF0YShyeGNhbGwsICZtc2csIGNhbGwtPnJlcXVlc3Rfc2l6ZSk7CisJcmV0ID0gcnhycGNfa2VybmVsX3NlbmRfZGF0YShhZnNfc29ja2V0LCByeGNhbGwsCisJCQkJICAgICAmbXNnLCBjYWxsLT5yZXF1ZXN0X3NpemUpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm9yX2RvX2Fib3J0OwogCkBAIC00MjEsOSArMzg5LDcgQEAKIAlyZXR1cm4gd2FpdF9tb2RlLT53YWl0KGNhbGwpOwogCiBlcnJvcl9kb19hYm9ydDoKLQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChyeGNhbGwsIFJYX1VTRVJfQUJPUlQpOwotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNhbGwtPnJ4X3F1ZXVlKSkpCi0JCWFmc19mcmVlX3NrYihza2IpOworCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGFmc19zb2NrZXQsIHJ4Y2FsbCwgUlhfVVNFUl9BQk9SVCwgLXJldCwgIktTRCIpOwogZXJyb3Jfa2lsbF9jYWxsOgogCWFmc19lbmRfY2FsbChjYWxsKTsKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKQEAgLTQzMSwxNDAgKzM5Nyw3NyBAQAogfQogCiAvKgotICogSGFuZGxlcyBpbnRlcmNlcHRlZCBtZXNzYWdlcyB0aGF0IHdlcmUgYXJyaXZpbmcgaW4gdGhlIHNvY2tldCdzIFJ4IHF1ZXVlLgotICoKLSAqIENhbGxlZCBmcm9tIHRoZSBBRl9SWFJQQyBjYWxsIHByb2Nlc3NvciBpbiB3YWl0cXVldWUgcHJvY2VzcyBjb250ZXh0LiAgRm9yCi0gKiBlYWNoIGNhbGwsIGl0IGlzIGd1YXJhbnRlZWQgdGhpcyB3aWxsIGJlIGNhbGxlZCBpbiBvcmRlciBvZiBwYWNrZXQgdG8gYmUKLSAqIGRlbGl2ZXJlZC4KLSAqLwotc3RhdGljIHZvaWQgYWZzX3J4X2ludGVyY2VwdG9yKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSAoc3RydWN0IGFmc19jYWxsICopIHVzZXJfY2FsbF9JRDsKLQotCV9lbnRlcigiJXAsLCV1IiwgY2FsbCwgc2tiLT5tYXJrKTsKLQotCV9kZWJ1ZygiSUNQVCAlcHsldX0gWyVkXSIsCi0JICAgICAgIHNrYiwgc2tiLT5tYXJrLCBhdG9taWNfcmVhZCgmYWZzX291dHN0YW5kaW5nX3NrYnMpKTsKLQotCUFTU0VSVENNUChzaywgPT0sIGFmc19zb2NrZXQtPnNrKTsKLQlhdG9taWNfaW5jKCZhZnNfb3V0c3RhbmRpbmdfc2ticyk7Ci0KLQlpZiAoIWNhbGwpIHsKLQkJLyogaXRzIGFuIGluY29taW5nIGNhbGwgZm9yIG91ciBjYWxsYmFjayBzZXJ2aWNlICovCi0JCXNrYl9xdWV1ZV90YWlsKCZhZnNfaW5jb21pbmdfY2FsbHMsIHNrYik7Ci0JCXF1ZXVlX3dvcmsoYWZzX3dxLCAmYWZzX2NvbGxlY3RfaW5jb21pbmdfY2FsbF93b3JrKTsKLQl9IGVsc2UgewotCQkvKiByb3V0ZSB0aGUgbWVzc2FnZXMgZGlyZWN0bHkgdG8gdGhlIGFwcHJvcHJpYXRlIGNhbGwgKi8KLQkJc2tiX3F1ZXVlX3RhaWwoJmNhbGwtPnJ4X3F1ZXVlLCBza2IpOwotCQljYWxsLT53YWl0X21vZGUtPnJ4X3dha2V1cChjYWxsKTsKLQl9Ci0KLQlfbGVhdmUoIiIpOwotfQotCi0vKgogICogZGVsaXZlciBtZXNzYWdlcyB0byBhIGNhbGwKICAqLwogc3RhdGljIHZvaWQgYWZzX2RlbGl2ZXJfdG9fY2FsbChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlib29sIGxhc3Q7CiAJdTMyIGFib3J0X2NvZGU7CiAJaW50IHJldDsKIAotCV9lbnRlcigiIik7CisJX2VudGVyKCIlcyIsIGNhbGwtPnR5cGUtPm5hbWUpOwogCi0Jd2hpbGUgKChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVBMWSB8fAotCQljYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9PUF9JRCB8fAotCQljYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVFVRVNUIHx8Ci0JCWNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX0FDSykgJiYKLQkgICAgICAgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9xdWV1ZSkpKSB7Ci0JCXN3aXRjaCAoc2tiLT5tYXJrKSB7Ci0JCWNhc2UgUlhSUENfU0tCX01BUktfREFUQToKLQkJCV9kZWJ1ZygiUmN2IERBVEEiKTsKLQkJCWxhc3QgPSByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHNrYik7Ci0JCQlyZXQgPSBjYWxsLT50eXBlLT5kZWxpdmVyKGNhbGwsIHNrYiwgbGFzdCk7Ci0JCQlzd2l0Y2ggKHJldCkgewotCQkJY2FzZSAtRUFHQUlOOgotCQkJCWlmIChsYXN0KSB7Ci0JCQkJCV9kZWJ1Zygic2hvcnQgZGF0YSIpOwotCQkJCQlnb3RvIHVubWFyc2hhbF9lcnJvcjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDA6Ci0JCQkJQVNTRVJUKGxhc3QpOwotCQkJCWlmIChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVBMWSkKLQkJCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9DT01QTEVURTsKLQkJCQlicmVhazsKLQkJCWNhc2UgLUVOT1RDT05OOgotCQkJCWFib3J0X2NvZGUgPSBSWF9DQUxMX0RFQUQ7Ci0JCQkJZ290byBkb19hYm9ydDsKLQkJCWNhc2UgLUVOT1RTVVBQOgotCQkJCWFib3J0X2NvZGUgPSBSWF9JTlZBTElEX09QRVJBVElPTjsKLQkJCQlnb3RvIGRvX2Fib3J0OwotCQkJZGVmYXVsdDoKLQkJCXVubWFyc2hhbF9lcnJvcjoKLQkJCQlhYm9ydF9jb2RlID0gUlhHRU5fQ0NfVU5NQVJTSEFMOwotCQkJCWlmIChjYWxsLT5zdGF0ZSAhPSBBRlNfQ0FMTF9BV0FJVF9SRVBMWSkKLQkJCQkJYWJvcnRfY29kZSA9IFJYR0VOX1NTX1VOTUFSU0hBTDsKLQkJCWRvX2Fib3J0OgotCQkJCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGNhbGwtPnJ4Y2FsbCwKLQkJCQkJCQlhYm9ydF9jb2RlKTsKLQkJCQljYWxsLT5lcnJvciA9IHJldDsKLQkJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0VSUk9SOwotCQkJCWJyZWFrOworCXdoaWxlIChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVBMWSB8fAorCSAgICAgICBjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9PUF9JRCB8fAorCSAgICAgICBjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9BV0FJVF9SRVFVRVNUIHx8CisJICAgICAgIGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX0FDSworCSAgICAgICApIHsKKwkJaWYgKGNhbGwtPnN0YXRlID09IEFGU19DQUxMX0FXQUlUX0FDSykgeworCQkJc2l6ZV90IG9mZnNldCA9IDA7CisJCQlyZXQgPSByeHJwY19rZXJuZWxfcmVjdl9kYXRhKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwKKwkJCQkJCSAgICAgTlVMTCwgMCwgJm9mZnNldCwgZmFsc2UsCisJCQkJCQkgICAgICZjYWxsLT5hYm9ydF9jb2RlKTsKKwkJCWlmIChyZXQgPT0gLUVJTlBST0dSRVNTIHx8IHJldCA9PSAtRUFHQUlOKQorCQkJCXJldHVybjsKKwkJCWlmIChyZXQgPT0gMSkgeworCQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQ09NUExFVEU7CisJCQkJZ290byBkb25lOwogCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUlhSUENfU0tCX01BUktfRklOQUxfQUNLOgotCQkJX2RlYnVnKCJSY3YgQUNLIik7Ci0JCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0NPTVBMRVRFOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlhSUENfU0tCX01BUktfQlVTWToKLQkJCV9kZWJ1ZygiUmN2IEJVU1kiKTsKLQkJCWNhbGwtPmVycm9yID0gLUVCVVNZOwotCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9CVVNZOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlhSUENfU0tCX01BUktfUkVNT1RFX0FCT1JUOgotCQkJYWJvcnRfY29kZSA9IHJ4cnBjX2tlcm5lbF9nZXRfYWJvcnRfY29kZShza2IpOwotCQkJY2FsbC0+ZXJyb3IgPSBjYWxsLT50eXBlLT5hYm9ydF90b19lcnJvcihhYm9ydF9jb2RlKTsKLQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQUJPUlRFRDsKLQkJCV9kZWJ1ZygiUmN2IEFCT1JUICV1IC0+ICVkIiwgYWJvcnRfY29kZSwgY2FsbC0+ZXJyb3IpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlhSUENfU0tCX01BUktfTE9DQUxfQUJPUlQ6Ci0JCQlhYm9ydF9jb2RlID0gcnhycGNfa2VybmVsX2dldF9hYm9ydF9jb2RlKHNrYik7Ci0JCQljYWxsLT5lcnJvciA9IGNhbGwtPnR5cGUtPmFib3J0X3RvX2Vycm9yKGFib3J0X2NvZGUpOwotCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BQk9SVEVEOwotCQkJX2RlYnVnKCJMb2MgQUJPUlQgJXUgLT4gJWQiLCBhYm9ydF9jb2RlLCBjYWxsLT5lcnJvcik7Ci0JCQlicmVhazsKLQkJY2FzZSBSWFJQQ19TS0JfTUFSS19ORVRfRVJST1I6Ci0JCQljYWxsLT5lcnJvciA9IC1yeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcihza2IpOwotCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9FUlJPUjsKLQkJCV9kZWJ1ZygiUmN2IE5FVCBFUlJPUiAlZCIsIGNhbGwtPmVycm9yKTsKLQkJCWJyZWFrOwotCQljYXNlIFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0VSUk9SOgotCQkJY2FsbC0+ZXJyb3IgPSAtcnhycGNfa2VybmVsX2dldF9lcnJvcl9udW1iZXIoc2tiKTsKLQkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfRVJST1I7Ci0JCQlfZGVidWcoIlJjdiBMT0NBTCBFUlJPUiAlZCIsIGNhbGwtPmVycm9yKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJQlVHKCk7Ci0JCQlicmVhazsKKwkJCXJldHVybjsKIAkJfQogCi0JCWFmc19mcmVlX3NrYihza2IpOworCQlyZXQgPSBjYWxsLT50eXBlLT5kZWxpdmVyKGNhbGwpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CisJCQlpZiAoY2FsbC0+c3RhdGUgPT0gQUZTX0NBTExfQVdBSVRfUkVQTFkpCisJCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9DT01QTEVURTsKKwkJCWdvdG8gZG9uZTsKKwkJY2FzZSAtRUlOUFJPR1JFU1M6CisJCWNhc2UgLUVBR0FJTjoKKwkJCWdvdG8gb3V0OworCQljYXNlIC1FTk9UQ09OTjoKKwkJCWFib3J0X2NvZGUgPSBSWF9DQUxMX0RFQUQ7CisJCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsCisJCQkJCQlhYm9ydF9jb2RlLCAtcmV0LCAiS05DIik7CisJCQlnb3RvIGRvX2Fib3J0OworCQljYXNlIC1FTk9UU1VQUDoKKwkJCWFib3J0X2NvZGUgPSBSWF9JTlZBTElEX09QRVJBVElPTjsKKwkJCXJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwKKwkJCQkJCWFib3J0X2NvZGUsIC1yZXQsICJLSVYiKTsKKwkJCWdvdG8gZG9fYWJvcnQ7CisJCWNhc2UgLUVOT0RBVEE6CisJCWNhc2UgLUVCQURNU0c6CisJCWNhc2UgLUVNU0dTSVpFOgorCQlkZWZhdWx0OgorCQkJYWJvcnRfY29kZSA9IFJYR0VOX0NDX1VOTUFSU0hBTDsKKwkJCWlmIChjYWxsLT5zdGF0ZSAhPSBBRlNfQ0FMTF9BV0FJVF9SRVBMWSkKKwkJCQlhYm9ydF9jb2RlID0gUlhHRU5fU1NfVU5NQVJTSEFMOworCQkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLAorCQkJCQkJYWJvcnRfY29kZSwgRUJBRE1TRywgIktVTSIpOworCQkJZ290byBkb19hYm9ydDsKKwkJfQogCX0KIAotCS8qIG1ha2Ugc3VyZSB0aGUgcXVldWUgaXMgZW1wdHkgaWYgdGhlIGNhbGwgaXMgZG9uZSB3aXRoICh3ZSBtaWdodCBoYXZlCi0JICogYWJvcnRlZCB0aGUgY2FsbCBlYXJseSBiZWNhdXNlIG9mIGFuIHVubWFyc2hhbGxpbmcgZXJyb3IpICovCi0JaWYgKGNhbGwtPnN0YXRlID49IEFGU19DQUxMX0NPTVBMRVRFKSB7Ci0JCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNhbGwtPnJ4X3F1ZXVlKSkpCi0JCQlhZnNfZnJlZV9za2Ioc2tiKTsKLQkJaWYgKGNhbGwtPmluY29taW5nKQotCQkJYWZzX2VuZF9jYWxsKGNhbGwpOwotCX0KLQorZG9uZToKKwlpZiAoY2FsbC0+c3RhdGUgPT0gQUZTX0NBTExfQ09NUExFVEUgJiYgY2FsbC0+aW5jb21pbmcpCisJCWFmc19lbmRfY2FsbChjYWxsKTsKK291dDoKIAlfbGVhdmUoIiIpOworCXJldHVybjsKKworZG9fYWJvcnQ6CisJY2FsbC0+ZXJyb3IgPSByZXQ7CisJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9DT01QTEVURTsKKwlnb3RvIGRvbmU7CiB9CiAKIC8qCkBAIC01NzIsNyArNDc1LDcgQEAKICAqLwogc3RhdGljIGludCBhZnNfd2FpdF9mb3JfY2FsbF90b19jb21wbGV0ZShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwljb25zdCBjaGFyICphYm9ydF93aHk7CiAJaW50IHJldDsKIAogCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CkBAIC01ODQsMTUgKzQ4NywxOCBAQAogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCiAJCS8qIGRlbGl2ZXIgYW55IG1lc3NhZ2VzIHRoYXQgYXJlIGluIHRoZSBxdWV1ZSAqLwotCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfcXVldWUpKSB7CisJCWlmIChjYWxsLT5zdGF0ZSA8IEFGU19DQUxMX0NPTVBMRVRFICYmIGNhbGwtPm5lZWRfYXR0ZW50aW9uKSB7CisJCQljYWxsLT5uZWVkX2F0dGVudGlvbiA9IGZhbHNlOwogCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQkJYWZzX2RlbGl2ZXJfdG9fY2FsbChjYWxsKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJYWJvcnRfd2h5ID0gIktXQyI7CiAJCXJldCA9IGNhbGwtPmVycm9yOwotCQlpZiAoY2FsbC0+c3RhdGUgPj0gQUZTX0NBTExfQ09NUExFVEUpCisJCWlmIChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9DT01QTEVURSkKIAkJCWJyZWFrOworCQlhYm9ydF93aHkgPSAiS1dJIjsKIAkJcmV0ID0gLUVJTlRSOwogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlicmVhazsKQEAgLTYwNSw5ICs1MTEsOCBAQAogCS8qIGtpbGwgdGhlIGNhbGwgKi8KIAlpZiAoY2FsbC0+c3RhdGUgPCBBRlNfQ0FMTF9DT01QTEVURSkgewogCQlfZGVidWcoImNhbGwgaW5jb21wbGV0ZSIpOwotCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChjYWxsLT5yeGNhbGwsIFJYX0NBTExfREVBRCk7Ci0JCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmNhbGwtPnJ4X3F1ZXVlKSkpCi0JCQlhZnNfZnJlZV9za2Ioc2tiKTsKKwkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLAorCQkJCQlSWF9DQUxMX0RFQUQsIC1yZXQsIGFib3J0X3doeSk7CiAJfQogCiAJX2RlYnVnKCJjYWxsIGNvbXBsZXRlIik7CkBAIC02MTksMTcgKzUyNCwyNCBAQAogLyoKICAqIHdha2UgdXAgYSB3YWl0aW5nIGNhbGwKICAqLwotc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfY2FsbF93YWl0ZXIoc3RydWN0IGFmc19jYWxsICpjYWxsKQorc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfY2FsbF93YWl0ZXIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGNhbGxfdXNlcl9JRCkKIHsKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSAoc3RydWN0IGFmc19jYWxsICopY2FsbF91c2VyX0lEOworCisJY2FsbC0+bmVlZF9hdHRlbnRpb24gPSB0cnVlOwogCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKIH0KIAogLyoKICAqIHdha2UgdXAgYW4gYXN5bmNocm9ub3VzIGNhbGwKICAqLwotc3RhdGljIHZvaWQgYWZzX3dha2VfdXBfYXN5bmNfY2FsbChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCitzdGF0aWMgdm9pZCBhZnNfd2FrZV91cF9hc3luY19jYWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJ4cnBjX2NhbGwgKnJ4Y2FsbCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGNhbGxfdXNlcl9JRCkKIHsKLQlfZW50ZXIoIiIpOworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgYWZzX2NhbGwgKiljYWxsX3VzZXJfSUQ7CisKKwljYWxsLT5uZWVkX2F0dGVudGlvbiA9IHRydWU7CiAJcXVldWVfd29yayhhZnNfYXN5bmNfY2FsbHMsICZjYWxsLT5hc3luY193b3JrKTsKIH0KIApAQCAtNjQ3LDggKzU1OSwxMCBAQAogLyoKICAqIGRlbGV0ZSBhbiBhc3luY2hyb25vdXMgY2FsbAogICovCi1zdGF0aWMgdm9pZCBhZnNfZGVsZXRlX2FzeW5jX2NhbGwoc3RydWN0IGFmc19jYWxsICpjYWxsKQorc3RhdGljIHZvaWQgYWZzX2RlbGV0ZV9hc3luY19jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc19jYWxsLCBhc3luY193b3JrKTsKKwogCV9lbnRlcigiIik7CiAKIAlhZnNfZnJlZV9jYWxsKGNhbGwpOwpAQCAtNjU4LDE3ICs1NzIsMTkgQEAKIAogLyoKICAqIHBlcmZvcm0gcHJvY2Vzc2luZyBvbiBhbiBhc3luY2hyb25vdXMgY2FsbAotICogLSBvbiBhIG11bHRpcGxlLXRocmVhZCB3b3JrcXVldWUgdGhpcyB3b3JrIGl0ZW0gbWF5IHRyeSB0byBydW4gb24gc2V2ZXJhbAotICogICBDUFVzIGF0IHRoZSBzYW1lIHRpbWUKICAqLwotc3RhdGljIHZvaWQgYWZzX3Byb2Nlc3NfYXN5bmNfY2FsbChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCitzdGF0aWMgdm9pZCBhZnNfcHJvY2Vzc19hc3luY19jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFmc19jYWxsLCBhc3luY193b3JrKTsKKwogCV9lbnRlcigiIik7CiAKLQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfcXVldWUpKQorCWlmIChjYWxsLT5zdGF0ZSA8IEFGU19DQUxMX0NPTVBMRVRFICYmIGNhbGwtPm5lZWRfYXR0ZW50aW9uKSB7CisJCWNhbGwtPm5lZWRfYXR0ZW50aW9uID0gZmFsc2U7CiAJCWFmc19kZWxpdmVyX3RvX2NhbGwoY2FsbCk7CisJfQogCi0JaWYgKGNhbGwtPnN0YXRlID49IEFGU19DQUxMX0NPTVBMRVRFICYmIGNhbGwtPndhaXRfbW9kZSkgeworCWlmIChjYWxsLT5zdGF0ZSA9PSBBRlNfQ0FMTF9DT01QTEVURSAmJiBjYWxsLT53YWl0X21vZGUpIHsKIAkJaWYgKGNhbGwtPndhaXRfbW9kZS0+YXN5bmNfY29tcGxldGUpCiAJCQljYWxsLT53YWl0X21vZGUtPmFzeW5jX2NvbXBsZXRlKGNhbGwtPnJlcGx5LAogCQkJCQkJCWNhbGwtPmVycm9yKTsKQEAgLTY3OSwxMjIgKzU5NSw5MyBAQAogCiAJCS8qIHdlIGNhbid0IGp1c3QgZGVsZXRlIHRoZSBjYWxsIGJlY2F1c2UgdGhlIHdvcmsgaXRlbSBtYXkgYmUKIAkJICogcXVldWVkICovCi0JCWNhbGwtPmFzeW5jX3dvcmtmbiA9IGFmc19kZWxldGVfYXN5bmNfY2FsbDsKKwkJY2FsbC0+YXN5bmNfd29yay5mdW5jID0gYWZzX2RlbGV0ZV9hc3luY19jYWxsOwogCQlxdWV1ZV93b3JrKGFmc19hc3luY19jYWxscywgJmNhbGwtPmFzeW5jX3dvcmspOwogCX0KIAogCV9sZWF2ZSgiIik7CiB9CiAKLS8qCi0gKiBFbXB0eSBhIHNvY2tldCBidWZmZXIgaW50byBhIGZsYXQgcmVwbHkgYnVmZmVyLgotICovCi1pbnQgYWZzX3RyYW5zZmVyX3JlcGx5KHN0cnVjdCBhZnNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBsYXN0KQorc3RhdGljIHZvaWQgYWZzX3J4X2F0dGFjaChzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsLCB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKIHsKLQlzaXplX3QgbGVuID0gc2tiLT5sZW47CisJc3RydWN0IGFmc19jYWxsICpjYWxsID0gKHN0cnVjdCBhZnNfY2FsbCAqKXVzZXJfY2FsbF9JRDsKIAotCWlmIChsZW4gPiBjYWxsLT5yZXBseV9tYXggLSBjYWxsLT5yZXBseV9zaXplKSB7Ci0JCV9sZWF2ZSgiID0gLUVCQURNU0cgWyV6dSA+ICV1XSIsCi0JCSAgICAgICBsZW4sIGNhbGwtPnJlcGx5X21heCAtIGNhbGwtPnJlcGx5X3NpemUpOwotCQlyZXR1cm4gLUVCQURNU0c7Ci0JfQotCi0JaWYgKGxlbiA+IDApIHsKLQkJaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCBjYWxsLT5idWZmZXIgKyBjYWxsLT5yZXBseV9zaXplLAotCQkJCSAgbGVuKSA8IDApCi0JCQlCVUcoKTsKLQkJY2FsbC0+cmVwbHlfc2l6ZSArPSBsZW47Ci0JfQotCi0JYWZzX2RhdGFfY29uc3VtZWQoY2FsbCwgc2tiKTsKLQlpZiAoIWxhc3QpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JaWYgKGNhbGwtPnJlcGx5X3NpemUgIT0gY2FsbC0+cmVwbHlfbWF4KSB7Ci0JCV9sZWF2ZSgiID0gLUVCQURNU0cgWyV1ICE9ICV1XSIsCi0JCSAgICAgICBjYWxsLT5yZXBseV9zaXplLCBjYWxsLT5yZXBseV9tYXgpOwotCQlyZXR1cm4gLUVCQURNU0c7Ci0JfQotCXJldHVybiAwOworCWNhbGwtPnJ4Y2FsbCA9IHJ4Y2FsbDsKIH0KIAogLyoKLSAqIGFjY2VwdCB0aGUgYmFja2xvZyBvZiBpbmNvbWluZyBjYWxscworICogQ2hhcmdlIHRoZSBpbmNvbWluZyBjYWxsIHByZWFsbG9jYXRpb24uCiAgKi8KLXN0YXRpYyB2b2lkIGFmc19jb2xsZWN0X2luY29taW5nX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgYWZzX2NoYXJnZV9wcmVhbGxvY2F0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsOwotCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IE5VTEw7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwgPSBhZnNfc3BhcmVfaW5jb21pbmdfY2FsbDsKIAotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmFmc19pbmNvbWluZ19jYWxscykpKSB7Ci0JCV9kZWJ1ZygibmV3IGNhbGwiKTsKLQotCQkvKiBkb24ndCBuZWVkIHRoZSBub3RpZmljYXRpb24gKi8KLQkJYWZzX2ZyZWVfc2tiKHNrYik7Ci0KKwlmb3IgKDs7KSB7CiAJCWlmICghY2FsbCkgewogCQkJY2FsbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfY2FsbCksIEdGUF9LRVJORUwpOwotCQkJaWYgKCFjYWxsKSB7Ci0JCQkJcnhycGNfa2VybmVsX3JlamVjdF9jYWxsKGFmc19zb2NrZXQpOwotCQkJCXJldHVybjsKLQkJCX0KKwkJCWlmICghY2FsbCkKKwkJCQlicmVhazsKIAotCQkJY2FsbC0+YXN5bmNfd29ya2ZuID0gYWZzX3Byb2Nlc3NfYXN5bmNfY2FsbDsKLQkJCUlOSVRfV09SSygmY2FsbC0+YXN5bmNfd29yaywgYWZzX2FzeW5jX3dvcmtmbik7CisJCQlJTklUX1dPUksoJmNhbGwtPmFzeW5jX3dvcmssIGFmc19wcm9jZXNzX2FzeW5jX2NhbGwpOwogCQkJY2FsbC0+d2FpdF9tb2RlID0gJmFmc19hc3luY19pbmNvbWluZ19jYWxsOwogCQkJY2FsbC0+dHlwZSA9ICZhZnNfUlhDTXh4eHg7CiAJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYWxsLT53YWl0cSk7Ci0JCQlza2JfcXVldWVfaGVhZF9pbml0KCZjYWxsLT5yeF9xdWV1ZSk7CiAJCQljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0FXQUlUX09QX0lEOwotCi0JCQlfZGVidWcoIkNBTEwgJXB7JXN9IFslZF0iLAotCQkJICAgICAgIGNhbGwsIGNhbGwtPnR5cGUtPm5hbWUsCi0JCQkgICAgICAgYXRvbWljX3JlYWQoJmFmc19vdXRzdGFuZGluZ19jYWxscykpOwotCQkJYXRvbWljX2luYygmYWZzX291dHN0YW5kaW5nX2NhbGxzKTsKIAkJfQogCi0JCXJ4Y2FsbCA9IHJ4cnBjX2tlcm5lbF9hY2NlcHRfY2FsbChhZnNfc29ja2V0LAotCQkJCQkJICAodW5zaWduZWQgbG9uZykgY2FsbCk7Ci0JCWlmICghSVNfRVJSKHJ4Y2FsbCkpIHsKLQkJCWNhbGwtPnJ4Y2FsbCA9IHJ4Y2FsbDsKLQkJCWNhbGwgPSBOVUxMOwotCQl9CisJCWlmIChyeHJwY19rZXJuZWxfY2hhcmdlX2FjY2VwdChhZnNfc29ja2V0LAorCQkJCQkgICAgICAgYWZzX3dha2VfdXBfYXN5bmNfY2FsbCwKKwkJCQkJICAgICAgIGFmc19yeF9hdHRhY2gsCisJCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyljYWxsLAorCQkJCQkgICAgICAgR0ZQX0tFUk5FTCkgPCAwKQorCQkJYnJlYWs7CisJCWNhbGwgPSBOVUxMOwogCX0KKwlhZnNfc3BhcmVfaW5jb21pbmdfY2FsbCA9IGNhbGw7Cit9CiAKLQlpZiAoY2FsbCkKLQkJYWZzX2ZyZWVfY2FsbChjYWxsKTsKKy8qCisgKiBEaXNjYXJkIGEgcHJlYWxsb2NhdGVkIGNhbGwgd2hlbiBhIHNvY2tldCBpcyBzaHV0IGRvd24uCisgKi8KK3N0YXRpYyB2b2lkIGFmc19yeF9kaXNjYXJkX25ld19jYWxsKHN0cnVjdCByeHJwY19jYWxsICpyeGNhbGwsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEKQoreworCXN0cnVjdCBhZnNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgYWZzX2NhbGwgKil1c2VyX2NhbGxfSUQ7CisKKwlhdG9taWNfaW5jKCZhZnNfb3V0c3RhbmRpbmdfY2FsbHMpOworCWNhbGwtPnJ4Y2FsbCA9IE5VTEw7CisJYWZzX2ZyZWVfY2FsbChjYWxsKTsKK30KKworLyoKKyAqIE5vdGlmaWNhdGlvbiBvZiBhbiBpbmNvbWluZyBjYWxsLgorICovCitzdGF0aWMgdm9pZCBhZnNfcnhfbmV3X2NhbGwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhjYWxsLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lEKQoreworCWF0b21pY19pbmMoJmFmc19vdXRzdGFuZGluZ19jYWxscyk7CisJcXVldWVfd29yayhhZnNfd3EsICZhZnNfY2hhcmdlX3ByZWFsbG9jYXRpb25fd29yayk7CiB9CiAKIC8qCiAgKiBHcmFiIHRoZSBvcGVyYXRpb24gSUQgZnJvbSBhbiBpbmNvbWluZyBjYWNoZSBtYW5hZ2VyIGNhbGwuICBUaGUgc29ja2V0CiAgKiBidWZmZXIgaXMgZGlzY2FyZGVkIG9uIGVycm9yIG9yIGlmIHdlIGRvbid0IHlldCBoYXZlIHN1ZmZpY2llbnQgZGF0YS4KICAqLwotc3RhdGljIGludCBhZnNfZGVsaXZlcl9jbV9vcF9pZChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJYm9vbCBsYXN0KQorc3RhdGljIGludCBhZnNfZGVsaXZlcl9jbV9vcF9pZChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7Ci0Jc2l6ZV90IGxlbiA9IHNrYi0+bGVuOwotCXZvaWQgKm9pYnVmID0gKHZvaWQgKikgJmNhbGwtPm9wZXJhdGlvbl9JRDsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHslenV9LCVkIiwgY2FsbC0+b2Zmc2V0LCBsZW4sIGxhc3QpOworCV9lbnRlcigieyV6dX0iLCBjYWxsLT5vZmZzZXQpOwogCiAJQVNTRVJUQ01QKGNhbGwtPm9mZnNldCwgPCwgNCk7CiAKIAkvKiB0aGUgb3BlcmF0aW9uIElEIGZvcm1zIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSByZXF1ZXN0IGRhdGEgKi8KLQlsZW4gPSBtaW5fdChzaXplX3QsIGxlbiwgNCAtIGNhbGwtPm9mZnNldCk7Ci0JaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCBvaWJ1ZiArIGNhbGwtPm9mZnNldCwgbGVuKSA8IDApCi0JCUJVRygpOwotCWlmICghcHNrYl9wdWxsKHNrYiwgbGVuKSkKLQkJQlVHKCk7Ci0JY2FsbC0+b2Zmc2V0ICs9IGxlbjsKLQotCWlmIChjYWxsLT5vZmZzZXQgPCA0KSB7Ci0JCWFmc19kYXRhX2NvbnN1bWVkKGNhbGwsIHNrYik7Ci0JCV9sZWF2ZSgiID0gLUVBR0FJTiIpOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9CisJcmV0ID0gYWZzX2V4dHJhY3RfZGF0YShjYWxsLCAmY2FsbC0+b3BlcmF0aW9uX0lELCA0LCB0cnVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAogCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQVdBSVRfUkVRVUVTVDsKKwljYWxsLT5vZmZzZXQgPSAwOwogCiAJLyogYXNrIHRoZSBjYWNoZSBtYW5hZ2VyIHRvIHJvdXRlIHRoZSBjYWxsIChpdCdsbCBjaGFuZ2UgdGhlIGNhbGwgdHlwZQogCSAqIGlmIHN1Y2Nlc3NmdWwpICovCkBAIC04MDMsNyArNjkwLDcgQEAKIAogCS8qIHBhc3MgcmVzcG9uc2liaWxpdHkgZm9yIHRoZSByZW1haW5lciBvZiB0aGlzIG1lc3NhZ2Ugb2ZmIHRvIHRoZQogCSAqIGNhY2hlIG1hbmFnZXIgb3AgKi8KLQlyZXR1cm4gY2FsbC0+dHlwZS0+ZGVsaXZlcihjYWxsLCBza2IsIGxhc3QpOworCXJldHVybiBjYWxsLT50eXBlLT5kZWxpdmVyKGNhbGwpOwogfQogCiAvKgpAQCAtODIzLDE0ICs3MTAsMTUgQEAKIAltc2cubXNnX2ZsYWdzCQk9IDA7CiAKIAljYWxsLT5zdGF0ZSA9IEFGU19DQUxMX0FXQUlUX0FDSzsKLQlzd2l0Y2ggKHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoY2FsbC0+cnhjYWxsLCAmbXNnLCAwKSkgeworCXN3aXRjaCAocnhycGNfa2VybmVsX3NlbmRfZGF0YShhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsICZtc2csIDApKSB7CiAJY2FzZSAwOgogCQlfbGVhdmUoIiBbcmVwbGllZF0iKTsKIAkJcmV0dXJuOwogCiAJY2FzZSAtRU5PTUVNOgogCQlfZGVidWcoIm9vbSIpOwotCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChjYWxsLT5yeGNhbGwsIFJYX1VTRVJfQUJPUlQpOworCQlyeHJwY19rZXJuZWxfYWJvcnRfY2FsbChhZnNfc29ja2V0LCBjYWxsLT5yeGNhbGwsCisJCQkJCVJYX1VTRVJfQUJPUlQsIEVOT01FTSwgIktPTyIpOwogCWRlZmF1bHQ6CiAJCWFmc19lbmRfY2FsbChjYWxsKTsKIAkJX2xlYXZlKCIgW2Vycm9yXSIpOwpAQCAtODU5LDcgKzc0Nyw3IEBACiAJbXNnLm1zZ19mbGFncwkJPSAwOwogCiAJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9BV0FJVF9BQ0s7Ci0JbiA9IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoY2FsbC0+cnhjYWxsLCAmbXNnLCBsZW4pOworCW4gPSByeHJwY19rZXJuZWxfc2VuZF9kYXRhKGFmc19zb2NrZXQsIGNhbGwtPnJ4Y2FsbCwgJm1zZywgbGVuKTsKIAlpZiAobiA+PSAwKSB7CiAJCS8qIFN1Y2Nlc3MgKi8KIAkJX2xlYXZlKCIgW3JlcGxpZWRdIik7CkBAIC04NjgsNyArNzU2LDggQEAKIAogCWlmIChuID09IC1FTk9NRU0pIHsKIAkJX2RlYnVnKCJvb20iKTsKLQkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoY2FsbC0+cnhjYWxsLCBSWF9VU0VSX0FCT1JUKTsKKwkJcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLAorCQkJCQlSWF9VU0VSX0FCT1JULCBFTk9NRU0sICJLT08iKTsKIAl9CiAJYWZzX2VuZF9jYWxsKGNhbGwpOwogCV9sZWF2ZSgiIFtlcnJvcl0iKTsKQEAgLTg3NywyNSArNzY2LDQwIEBACiAvKgogICogRXh0cmFjdCBhIHBpZWNlIG9mIGRhdGEgZnJvbSB0aGUgcmVjZWl2ZWQgZGF0YSBzb2NrZXQgYnVmZmVycy4KICAqLwotaW50IGFmc19leHRyYWN0X2RhdGEoc3RydWN0IGFmc19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIGJvb2wgbGFzdCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCitpbnQgYWZzX2V4dHJhY3RfZGF0YShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgIGJvb2wgd2FudF9tb3JlKQogewotCXNpemVfdCBsZW4gPSBza2ItPmxlbjsKKwlpbnQgcmV0OwogCi0JX2VudGVyKCJ7JXV9LHslenV9LCVkLCwlenUiLCBjYWxsLT5vZmZzZXQsIGxlbiwgbGFzdCwgY291bnQpOworCV9lbnRlcigieyVzLCV6dX0sLCV6dSwlZCIsCisJICAgICAgIGNhbGwtPnR5cGUtPm5hbWUsIGNhbGwtPm9mZnNldCwgY291bnQsIHdhbnRfbW9yZSk7CiAKLQlBU1NFUlRDTVAoY2FsbC0+b2Zmc2V0LCA8LCBjb3VudCk7CisJQVNTRVJUQ01QKGNhbGwtPm9mZnNldCwgPD0sIGNvdW50KTsKIAotCWxlbiA9IG1pbl90KHNpemVfdCwgbGVuLCBjb3VudCAtIGNhbGwtPm9mZnNldCk7Ci0JaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCBidWYgKyBjYWxsLT5vZmZzZXQsIGxlbikgPCAwIHx8Ci0JICAgICFwc2tiX3B1bGwoc2tiLCBsZW4pKQotCQlCVUcoKTsKLQljYWxsLT5vZmZzZXQgKz0gbGVuOworCXJldCA9IHJ4cnBjX2tlcm5lbF9yZWN2X2RhdGEoYWZzX3NvY2tldCwgY2FsbC0+cnhjYWxsLAorCQkJCSAgICAgYnVmLCBjb3VudCwgJmNhbGwtPm9mZnNldCwKKwkJCQkgICAgIHdhbnRfbW9yZSwgJmNhbGwtPmFib3J0X2NvZGUpOworCWlmIChyZXQgPT0gMCB8fCByZXQgPT0gLUVBR0FJTikKKwkJcmV0dXJuIHJldDsKIAotCWlmIChjYWxsLT5vZmZzZXQgPCBjb3VudCkgewotCQlhZnNfZGF0YV9jb25zdW1lZChjYWxsLCBza2IpOwotCQlfbGVhdmUoIiA9IC1FQUdBSU4iKTsKLQkJcmV0dXJuIC1FQUdBSU47CisJaWYgKHJldCA9PSAxKSB7CisJCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKKwkJY2FzZSBBRlNfQ0FMTF9BV0FJVF9SRVBMWToKKwkJCWNhbGwtPnN0YXRlID0gQUZTX0NBTExfQ09NUExFVEU7CisJCQlicmVhazsKKwkJY2FzZSBBRlNfQ0FMTF9BV0FJVF9SRVFVRVNUOgorCQkJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9SRVBMWUlORzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIDA7CiAJfQotCXJldHVybiAwOworCisJaWYgKHJldCA9PSAtRUNPTk5BQk9SVEVEKQorCQljYWxsLT5lcnJvciA9IGNhbGwtPnR5cGUtPmFib3J0X3RvX2Vycm9yKGNhbGwtPmFib3J0X2NvZGUpOworCWVsc2UKKwkJY2FsbC0+ZXJyb3IgPSByZXQ7CisJY2FsbC0+c3RhdGUgPSBBRlNfQ0FMTF9DT01QTEVURTsKKwlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvYWZzL3NlcnZlci5jIGIvZnMvYWZzL3NlcnZlci5jCmluZGV4IGYzNDJhY2YuLmQ0MDY2YWIgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9zZXJ2ZXIuYworKysgYi9mcy9hZnMvc2VydmVyLmMKQEAgLTE3OCwxMyArMTc4LDE4IEBACiAvKgogICogbG9vayB1cCBhIHNlcnZlciBieSBpdHMgSVAgYWRkcmVzcwogICovCi1zdHJ1Y3QgYWZzX3NlcnZlciAqYWZzX2ZpbmRfc2VydmVyKGNvbnN0IHN0cnVjdCBpbl9hZGRyICpfYWRkcikKK3N0cnVjdCBhZnNfc2VydmVyICphZnNfZmluZF9zZXJ2ZXIoY29uc3Qgc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngpCiB7CiAJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciA9IE5VTEw7CiAJc3RydWN0IHJiX25vZGUgKnA7Ci0Jc3RydWN0IGluX2FkZHIgYWRkciA9ICpfYWRkcjsKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyID0gc3J4LT50cmFuc3BvcnQuc2luLnNpbl9hZGRyOwogCi0JX2VudGVyKCIlcEk0IiwgJmFkZHIuc19hZGRyKTsKKwlfZW50ZXIoInslZCwlcEk0fSIsIHNyeC0+dHJhbnNwb3J0LmZhbWlseSwgJmFkZHIuc19hZGRyKTsKKworCWlmIChzcngtPnRyYW5zcG9ydC5mYW1pbHkgIT0gQUZfSU5FVCkgeworCQlXQVJOKHRydWUsICJBRlMgZG9lcyBub3QgeWVzIHN1cHBvcnQgbm9uLUlQdjQgYWRkcmVzc2VzXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJcmVhZF9sb2NrKCZhZnNfc2VydmVyc19sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZnMvYWZzL3ZsY2xpZW50LmMgYi9mcy9hZnMvdmxjbGllbnQuYwppbmRleCBmOTRkMWFiLi45NGJjZDk3IDEwMDY0NAotLS0gYS9mcy9hZnMvdmxjbGllbnQuYworKysgYi9mcy9hZnMvdmxjbGllbnQuYwpAQCAtNTgsMTcgKzU4LDE2IEBACiAvKgogICogZGVsaXZlciByZXBseSBkYXRhIHRvIGEgVkwuR2V0RW50cnlCeVhYWCBjYWxsCiAgKi8KLXN0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfdmxfZ2V0X2VudHJ5X2J5X3h4eChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwsCi0JCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgbGFzdCkKK3N0YXRpYyBpbnQgYWZzX2RlbGl2ZXJfdmxfZ2V0X2VudHJ5X2J5X3h4eChzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5OwogCV9fYmUzMiAqYnA7CiAJdTMyIHRtcDsKIAlpbnQgbG9vcCwgcmV0OwogCi0JX2VudGVyKCIsLCV1IiwgbGFzdCk7CisJX2VudGVyKCIiKTsKIAotCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsLCBza2IsIGxhc3QpOworCXJldCA9IGFmc190cmFuc2Zlcl9yZXBseShjYWxsKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZnMvYWZzL3Zsb2NhdGlvbi5jIGIvZnMvYWZzL3Zsb2NhdGlvbi5jCmluZGV4IDUyOTc2NzguLjQ1YTg2MzkgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy92bG9jYXRpb24uYworKysgYi9mcy9hZnMvdmxvY2F0aW9uLmMKQEAgLTU5NCw4ICs1OTQsOCBAQAogICovCiBpbnQgX19pbml0IGFmc192bG9jYXRpb25fdXBkYXRlX2luaXQodm9pZCkKIHsKLQlhZnNfdmxvY2F0aW9uX3VwZGF0ZV93b3JrZXIgPQotCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgia2Fmc192bHVwZGF0ZWQiKTsKKwlhZnNfdmxvY2F0aW9uX3VwZGF0ZV93b3JrZXIgPSBhbGxvY193b3JrcXVldWUoImthZnNfdmx1cGRhdGVkIiwKKwkJCQkJCSAgICAgIFdRX01FTV9SRUNMQUlNLCAwKTsKIAlyZXR1cm4gYWZzX3Zsb2NhdGlvbl91cGRhdGVfd29ya2VyID8gMCA6IC1FTk9NRU07CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2Fpby5jIGIvZnMvYWlvLmMKaW5kZXggZmI4ZTQ1Yi4uNGZlODFkMSAxMDA2NDQKLS0tIGEvZnMvYWlvLmMKKysrIGIvZnMvYWlvLmMKQEAgLTIzOSw3ICsyMzksMTIgQEAKIAlzdGF0aWMgY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIG9wcyA9IHsKIAkJLmRfZG5hbWUJPSBzaW1wbGVfZG5hbWUsCiAJfTsKLQlyZXR1cm4gbW91bnRfcHNldWRvKGZzX3R5cGUsICJhaW86IiwgTlVMTCwgJm9wcywgQUlPX1JJTkdfTUFHSUMpOworCXN0cnVjdCBkZW50cnkgKnJvb3QgPSBtb3VudF9wc2V1ZG8oZnNfdHlwZSwgImFpbzoiLCBOVUxMLCAmb3BzLAorCQkJCQkgICBBSU9fUklOR19NQUdJQyk7CisKKwlpZiAoIUlTX0VSUihyb290KSkKKwkJcm9vdC0+ZF9zYi0+c19pZmxhZ3MgfD0gU0JfSV9OT0VYRUM7CisJcmV0dXJuIHJvb3Q7CiB9CiAKIC8qIGFpb19zZXR1cApkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9leHBpcmUuYyBiL2ZzL2F1dG9mczQvZXhwaXJlLmMKaW5kZXggYjQ5MzkwOS4uZDhlNmQ0MiAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9leHBpcmUuYworKysgYi9mcy9hdXRvZnM0L2V4cGlyZS5jCkBAIC00MTcsNiArNDE3LDcgQEAKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CisKIC8qCiAgKiBGaW5kIGFuIGVsaWdpYmxlIHRyZWUgdG8gdGltZS1vdXQKICAqIEEgdHJlZSBpcyBlbGlnaWJsZSBpZiA6LQpAQCAtNDMyLDYgKzQzMyw3IEBACiAJc3RydWN0IGRlbnRyeSAqcm9vdCA9IHNiLT5zX3Jvb3Q7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCXN0cnVjdCBkZW50cnkgKmV4cGlyZWQ7CisJc3RydWN0IGRlbnRyeSAqZm91bmQ7CiAJc3RydWN0IGF1dG9mc19pbmZvICppbm87CiAKIAlpZiAoIXJvb3QpCkBAIC00NDIsMzEgKzQ0NCw0NiBAQAogCiAJZGVudHJ5ID0gTlVMTDsKIAl3aGlsZSAoKGRlbnRyeSA9IGdldF9uZXh0X3Bvc2l0aXZlX3N1YmRpcihkZW50cnksIHJvb3QpKSkgeworCQlpbnQgZmxhZ3MgPSBob3c7CisKIAkJc3Bpbl9sb2NrKCZzYmktPmZzX2xvY2spOwogCQlpbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGVudHJ5KTsKLQkJaWYgKGluby0+ZmxhZ3MgJiBBVVRPRlNfSU5GX1dBTlRfRVhQSVJFKQotCQkJZXhwaXJlZCA9IE5VTEw7Ci0JCWVsc2UKLQkJCWV4cGlyZWQgPSBzaG91bGRfZXhwaXJlKGRlbnRyeSwgbW50LCB0aW1lb3V0LCBob3cpOwotCQlpZiAoIWV4cGlyZWQpIHsKKwkJaWYgKGluby0+ZmxhZ3MgJiBBVVRPRlNfSU5GX1dBTlRfRVhQSVJFKSB7CiAJCQlzcGluX3VubG9jaygmc2JpLT5mc19sb2NrKTsKIAkJCWNvbnRpbnVlOwogCQl9CisJCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOworCisJCWV4cGlyZWQgPSBzaG91bGRfZXhwaXJlKGRlbnRyeSwgbW50LCB0aW1lb3V0LCBmbGFncyk7CisJCWlmICghZXhwaXJlZCkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9jaygmc2JpLT5mc19sb2NrKTsKIAkJaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKGV4cGlyZWQpOwogCQlpbm8tPmZsYWdzIHw9IEFVVE9GU19JTkZfV0FOVF9FWFBJUkU7CiAJCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOwogCQlzeW5jaHJvbml6ZV9yY3UoKTsKLQkJc3Bpbl9sb2NrKCZzYmktPmZzX2xvY2spOwotCQlpZiAoc2hvdWxkX2V4cGlyZShleHBpcmVkLCBtbnQsIHRpbWVvdXQsIGhvdykpIHsKLQkJCWlmIChleHBpcmVkICE9IGRlbnRyeSkKLQkJCQlkcHV0KGRlbnRyeSk7Ci0JCQlnb3RvIGZvdW5kOwotCQl9CiAKKwkJLyogTWFrZSBzdXJlIGEgcmVmZXJlbmNlIGlzIG5vdCB0YWtlbiBvbiBmb3VuZCBpZgorCQkgKiB0aGluZ3MgaGF2ZSBjaGFuZ2VkLgorCQkgKi8KKwkJZmxhZ3MgJj0gfkFVVE9GU19FWFBfTEVBVkVTOworCQlmb3VuZCA9IHNob3VsZF9leHBpcmUoZXhwaXJlZCwgbW50LCB0aW1lb3V0LCBob3cpOworCQlpZiAoIWZvdW5kIHx8IGZvdW5kICE9IGV4cGlyZWQpCisJCQkvKiBTb21ldGhpbmcgaGFzIGNoYW5nZWQsIGNvbnRpbnVlICovCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKGV4cGlyZWQgIT0gZGVudHJ5KQorCQkJZHB1dChkZW50cnkpOworCisJCXNwaW5fbG9jaygmc2JpLT5mc19sb2NrKTsKKwkJZ290byBmb3VuZDsKK25leHQ6CisJCXNwaW5fbG9jaygmc2JpLT5mc19sb2NrKTsKIAkJaW5vLT5mbGFncyAmPSB+QVVUT0ZTX0lORl9XQU5UX0VYUElSRTsKKwkJc3Bpbl91bmxvY2soJnNiaS0+ZnNfbG9jayk7CiAJCWlmIChleHBpcmVkICE9IGRlbnRyeSkKIAkJCWRwdXQoZXhwaXJlZCk7Ci0JCXNwaW5fdW5sb2NrKCZzYmktPmZzX2xvY2spOwogCX0KIAlyZXR1cm4gTlVMTDsKIApAQCAtNDgzLDYgKzUwMCw3IEBACiAJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShkZW50cnktPmRfc2IpOwogCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7CiAJaW50IHN0YXR1czsKKwlpbnQgc3RhdGU7CiAKIAkvKiBCbG9jayBvbiBhbnkgcGVuZGluZyBleHBpcmUgKi8KIAlpZiAoIShpbm8tPmZsYWdzICYgQVVUT0ZTX0lORl9XQU5UX0VYUElSRSkpCkBAIC00OTAsOCArNTA4LDE5IEBACiAJaWYgKHJjdV93YWxrKQogCQlyZXR1cm4gLUVDSElMRDsKIAorcmV0cnk6CiAJc3Bpbl9sb2NrKCZzYmktPmZzX2xvY2spOwotCWlmIChpbm8tPmZsYWdzICYgQVVUT0ZTX0lORl9FWFBJUklORykgeworCXN0YXRlID0gaW5vLT5mbGFncyAmIChBVVRPRlNfSU5GX1dBTlRfRVhQSVJFIHwgQVVUT0ZTX0lORl9FWFBJUklORyk7CisJaWYgKHN0YXRlID09IEFVVE9GU19JTkZfV0FOVF9FWFBJUkUpIHsKKwkJc3Bpbl91bmxvY2soJnNiaS0+ZnNfbG9jayk7CisJCS8qCisJCSAqIFBvc3NpYmx5IGJlaW5nIHNlbGVjdGVkIGZvciBleHBpcmUsIHdhaXQgdW50aWwKKwkJICogaXQncyBzZWxlY3RlZCBvciBub3QuCisJCSAqLworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWi8xMCk7CisJCWdvdG8gcmV0cnk7CisJfQorCWlmIChzdGF0ZSAmIEFVVE9GU19JTkZfRVhQSVJJTkcpIHsKIAkJc3Bpbl91bmxvY2soJnNiaS0+ZnNfbG9jayk7CiAKIAkJcHJfZGVidWcoIndhaXRpbmcgZm9yIGV4cGlyZSAlcCBuYW1lPSVwZFxuIiwgZGVudHJ5LCBkZW50cnkpOwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC93YWl0cS5jIGIvZnMvYXV0b2ZzNC93YWl0cS5jCmluZGV4IDQzMWZkN2UuLmU0NDI3MWQgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvd2FpdHEuYworKysgYi9mcy9hdXRvZnM0L3dhaXRxLmMKQEAgLTQzMSw4ICs0MzEsOCBAQAogCQltZW1jcHkoJndxLT5uYW1lLCAmcXN0ciwgc2l6ZW9mKHN0cnVjdCBxc3RyKSk7CiAJCXdxLT5kZXYgPSBhdXRvZnM0X2dldF9kZXYoc2JpKTsKIAkJd3EtPmlubyA9IGF1dG9mczRfZ2V0X2lubyhzYmkpOwotCQl3cS0+dWlkID0gY3VycmVudF91aWQoKTsKLQkJd3EtPmdpZCA9IGN1cnJlbnRfZ2lkKCk7CisJCXdxLT51aWQgPSBjdXJyZW50X3JlYWxfY3JlZCgpLT51aWQ7CisJCXdxLT5naWQgPSBjdXJyZW50X3JlYWxfY3JlZCgpLT5naWQ7CiAJCXdxLT5waWQgPSBwaWQ7CiAJCXdxLT50Z2lkID0gdGdpZDsKIAkJd3EtPnN0YXR1cyA9IC1FSU5UUjsgLyogU3RhdHVzIHJldHVybiBpZiBpbnRlcnJ1cHRlZCAqLwpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9saW51eHZmcy5jIGIvZnMvYmVmcy9saW51eHZmcy5jCmluZGV4IDdkYTA1YjEuLmJmZTlmOTkgMTAwNjQ0Ci0tLSBhL2ZzL2JlZnMvbGludXh2ZnMuYworKysgYi9mcy9iZWZzL2xpbnV4dmZzLmMKQEAgLTc4OSw3ICs3ODksNyBAQAogCSAqIFdpbGwgYmUgc2V0IHRvIHJlYWwgZnMgYmxvY2tzaXplIGxhdGVyLgogCSAqCiAJICogTGludXggMi40LjEwIGFuZCBsYXRlciByZWZ1c2UgdG8gcmVhZCBibG9ja3Mgc21hbGxlciB0aGFuCi0JICogdGhlIGhhcmRzZWN0IHNpemUgZm9yIHRoZSBkZXZpY2UuIEJ1dCB3ZSBhbHNvIG5lZWQgdG8gcmVhZCBhdCAKKwkgKiB0aGUgbG9naWNhbCBibG9jayBzaXplIGZvciB0aGUgZGV2aWNlLiBCdXQgd2UgYWxzbyBuZWVkIHRvIHJlYWQgYXQKIAkgKiBsZWFzdCAxayB0byBnZXQgdGhlIHNlY29uZCA1MTIgYnl0ZXMgb2YgdGhlIHZvbHVtZS4KIAkgKiAtV0QgMTAtMjYtMDEKIAkgKi8gCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmLmMgYi9mcy9iaW5mbXRfZWxmLmMKaW5kZXggN2Y2YWZmM2YuLjI0NzJhZjIgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9lbGYuYworKysgYi9mcy9iaW5mbXRfZWxmLmMKQEAgLTg1Myw2ICs4NTMsNyBAQAogCQljdXJyZW50LT5mbGFncyB8PSBQRl9SQU5ET01JWkU7CiAKIAlzZXR1cF9uZXdfZXhlYyhicHJtKTsKKwlpbnN0YWxsX2V4ZWNfY3JlZHMoYnBybSk7CiAKIAkvKiBEbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGxvYWQgdGhlIGludGVycHJldGVyLCBpZiBuZWVkIGJlLiAgV2Ugd2lsbAogCSAgIGNoYW5nZSBzb21lIG9mIHRoZXNlIGxhdGVyICovCkBAIC0xMDQ0LDcgKzEwNDUsNiBAQAogCQlnb3RvIG91dDsKICNlbmRpZiAvKiBBUkNIX0hBU19TRVRVUF9BRERJVElPTkFMX1BBR0VTICovCiAKLQlpbnN0YWxsX2V4ZWNfY3JlZHMoYnBybSk7CiAJcmV0dmFsID0gY3JlYXRlX2VsZl90YWJsZXMoYnBybSwgJmxvYy0+ZWxmX2V4LAogCQkJICBsb2FkX2FkZHIsIGludGVycF9sb2FkX2FkZHIpOwogCWlmIChyZXR2YWwgPCAwKQpAQCAtMTYyNCwyMCArMTYyNCwxMiBAQAogCQlyZWdzZXQtPndyaXRlYmFjayh0YXNrLCByZWdzZXQsIDEpOwogfQogCi0jaWZuZGVmIFBSX1JFR19TSVpFCi0jZGVmaW5lIFBSX1JFR19TSVpFKFMpIHNpemVvZihTKQotI2VuZGlmCi0KICNpZm5kZWYgUFJTVEFUVVNfU0laRQotI2RlZmluZSBQUlNUQVRVU19TSVpFKFMpIHNpemVvZihTKQotI2VuZGlmCi0KLSNpZm5kZWYgUFJfUkVHX1BUUgotI2RlZmluZSBQUl9SRUdfUFRSKFMpICgmKChTKS0+cHJfcmVnKSkKKyNkZWZpbmUgUFJTVEFUVVNfU0laRShTLCBSKSBzaXplb2YoUykKICNlbmRpZgogCiAjaWZuZGVmIFNFVF9QUl9GUFZBTElECi0jZGVmaW5lIFNFVF9QUl9GUFZBTElEKFMsIFYpICgoUyktPnByX2ZwdmFsaWQgPSAoVikpCisjZGVmaW5lIFNFVF9QUl9GUFZBTElEKFMsIFYsIFIpICgoUyktPnByX2ZwdmFsaWQgPSAoVikpCiAjZW5kaWYKIAogc3RhdGljIGludCBmaWxsX3RocmVhZF9jb3JlX2luZm8oc3RydWN0IGVsZl90aHJlYWRfY29yZV9pbmZvICp0LApAQCAtMTY0NSw2ICsxNjM3LDcgQEAKIAkJCQkgbG9uZyBzaWduciwgc2l6ZV90ICp0b3RhbCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgcmVnc2V0X3NpemUgPSB2aWV3LT5yZWdzZXRzWzBdLm4gKiB2aWV3LT5yZWdzZXRzWzBdLnNpemU7CiAKIAkvKgogCSAqIE5UX1BSU1RBVFVTIGlzIHRoZSBvbmUgc3BlY2lhbCBjYXNlLCBiZWNhdXNlIHRoZSByZWdzZXQgZGF0YQpAQCAtMTY1MywxMiArMTY0NiwxMSBAQAogCSAqIFdlIGFzc3VtZSB0aGF0IHJlZ3NldCAwIGlzIE5UX1BSU1RBVFVTLgogCSAqLwogCWZpbGxfcHJzdGF0dXMoJnQtPnByc3RhdHVzLCB0LT50YXNrLCBzaWducik7Ci0JKHZvaWQpIHZpZXctPnJlZ3NldHNbMF0uZ2V0KHQtPnRhc2ssICZ2aWV3LT5yZWdzZXRzWzBdLAotCQkJCSAgICAwLCBQUl9SRUdfU0laRSh0LT5wcnN0YXR1cy5wcl9yZWcpLAotCQkJCSAgICBQUl9SRUdfUFRSKCZ0LT5wcnN0YXR1cyksIE5VTEwpOworCSh2b2lkKSB2aWV3LT5yZWdzZXRzWzBdLmdldCh0LT50YXNrLCAmdmlldy0+cmVnc2V0c1swXSwgMCwgcmVnc2V0X3NpemUsCisJCQkJICAgICZ0LT5wcnN0YXR1cy5wcl9yZWcsIE5VTEwpOwogCiAJZmlsbF9ub3RlKCZ0LT5ub3Rlc1swXSwgIkNPUkUiLCBOVF9QUlNUQVRVUywKLQkJICBQUlNUQVRVU19TSVpFKHQtPnByc3RhdHVzKSwgJnQtPnByc3RhdHVzKTsKKwkJICBQUlNUQVRVU19TSVpFKHQtPnByc3RhdHVzLCByZWdzZXRfc2l6ZSksICZ0LT5wcnN0YXR1cyk7CiAJKnRvdGFsICs9IG5vdGVzaXplKCZ0LT5ub3Rlc1swXSk7CiAKIAlkb190aHJlYWRfcmVnc2V0X3dyaXRlYmFjayh0LT50YXNrLCAmdmlldy0+cmVnc2V0c1swXSk7CkBAIC0xNjg4LDcgKzE2ODAsOCBAQAogCQkJCQkJICByZWdzZXQtPmNvcmVfbm90ZV90eXBlLAogCQkJCQkJICBzaXplLCBkYXRhKTsKIAkJCQllbHNlIHsKLQkJCQkJU0VUX1BSX0ZQVkFMSUQoJnQtPnByc3RhdHVzLCAxKTsKKwkJCQkJU0VUX1BSX0ZQVkFMSUQoJnQtPnByc3RhdHVzLAorCQkJCQkJCTEsIHJlZ3NldF9zaXplKTsKIAkJCQkJZmlsbF9ub3RlKCZ0LT5ub3Rlc1tpXSwgIkNPUkUiLAogCQkJCQkJICBOVF9QUkZQUkVHLCBzaXplLCBkYXRhKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IDA4YWU5OTMuLjM3NmU0ZTQgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC0xODAsOSArMTgwLDYgQEAKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGJkZXZfZmlsZV9pbm9kZShmaWxlKTsKIAotCWlmIChJU19EQVgoaW5vZGUpKQotCQlyZXR1cm4gZGF4X2RvX2lvKGlvY2IsIGlub2RlLCBpdGVyLCBibGtkZXZfZ2V0X2Jsb2NrLAotCQkJCU5VTEwsIERJT19TS0lQX0RJT19DT1VOVCk7CiAJcmV0dXJuIF9fYmxvY2tkZXZfZGlyZWN0X0lPKGlvY2IsIGlub2RlLCBJX0JERVYoaW5vZGUpLCBpdGVyLAogCQkJCSAgICBibGtkZXZfZ2V0X2Jsb2NrLCBOVUxMLCBOVUxMLAogCQkJCSAgICBESU9fU0tJUF9ESU9fQ09VTlQpOwpAQCAtMzAyLDE0ICsyOTksMTEgQEAKIAkJZXJyb3IgPSBzYi0+c19vcC0+dGhhd19zdXBlcihzYik7CiAJZWxzZQogCQllcnJvciA9IHRoYXdfc3VwZXIoc2IpOwotCWlmIChlcnJvcikgeworCWlmIChlcnJvcikKIAkJYmRldi0+YmRfZnNmcmVlemVfY291bnQrKzsKLQkJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9mc2ZyZWV6ZV9tdXRleCk7Ci0JCXJldHVybiBlcnJvcjsKLQl9CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZiZGV2LT5iZF9mc2ZyZWV6ZV9tdXRleCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVycm9yOwogfQogRVhQT1JUX1NZTUJPTCh0aGF3X2JkZXYpOwogCkBAIC0xMjc1LDcgKzEyNjksNiBAQAogCQliZGV2LT5iZF9kaXNrID0gZGlzazsKIAkJYmRldi0+YmRfcXVldWUgPSBkaXNrLT5xdWV1ZTsKIAkJYmRldi0+YmRfY29udGFpbnMgPSBiZGV2OwotCQliZGV2LT5iZF9pbm9kZS0+aV9mbGFncyA9IDA7CiAKIAkJaWYgKCFwYXJ0bm8pIHsKIAkJCXJldCA9IC1FTlhJTzsKQEAgLTEzMDMsMTEgKzEyOTYsOCBAQAogCQkJCX0KIAkJCX0KIAotCQkJaWYgKCFyZXQpIHsKKwkJCWlmICghcmV0KQogCQkJCWJkX3NldF9zaXplKGJkZXYsKGxvZmZfdClnZXRfY2FwYWNpdHkoZGlzayk8PDkpOwotCQkJCWlmICghYmRldl9kYXhfY2FwYWJsZShiZGV2KSkKLQkJCQkJYmRldi0+YmRfaW5vZGUtPmlfZmxhZ3MgJj0gflNfREFYOwotCQkJfQogCiAJCQkvKgogCQkJICogSWYgdGhlIGRldmljZSBpcyBpbnZhbGlkYXRlZCwgcmVzY2FuIHBhcnRpdGlvbgpAQCAtMTM0Miw4ICsxMzMyLDYgQEAKIAkJCQlnb3RvIG91dF9jbGVhcjsKIAkJCX0KIAkJCWJkX3NldF9zaXplKGJkZXYsIChsb2ZmX3QpYmRldi0+YmRfcGFydC0+bnJfc2VjdHMgPDwgOSk7Ci0JCQlpZiAoIWJkZXZfZGF4X2NhcGFibGUoYmRldikpCi0JCQkJYmRldi0+YmRfaW5vZGUtPmlfZmxhZ3MgJj0gflNfREFYOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKGJkZXYtPmJkX2NvbnRhaW5zID09IGJkZXYpIHsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2N0cmVlLmggYi9mcy9idHJmcy9jdHJlZS5oCmluZGV4IGVmZjM5OTMuLjMzZmUwMzUgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2N0cmVlLmgKKysrIGIvZnMvYnRyZnMvY3RyZWUuaApAQCAtNDI3LDYgKzQyNyw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCByb19iZ3M7CiAJc3RydWN0IGxpc3RfaGVhZCBwcmlvcml0eV90aWNrZXRzOwogCXN0cnVjdCBsaXN0X2hlYWQgdGlja2V0czsKKwl1NjQgdGlja2V0c19pZDsKIAogCXN0cnVjdCByd19zZW1hcGhvcmUgZ3JvdXBzX3NlbTsKIAkvKiBmb3IgYmxvY2sgZ3JvdXBzIGluIG91ciBzYW1lIHR5cGUgKi8KZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQtdHJlZS5jCmluZGV4IDA0NTBkYzQuLjY2NWRhOGYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtNDI3MSwxMyArNDI3MSwxMCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JLyoKLQkgKiBVc2UgbmV3IGJ0cmZzX3Fncm91cF9yZXNlcnZlX2RhdGEgdG8gcmVzZXJ2ZSBwcmVjaW91cyBkYXRhIHNwYWNlCi0JICoKLQkgKiBUT0RPOiBGaW5kIGEgZ29vZCBtZXRob2QgdG8gYXZvaWQgcmVzZXJ2ZSBkYXRhIHNwYWNlIGZvciBOT0NPVwotCSAqIHJhbmdlLCBidXQgZG9uJ3QgaW1wYWN0IHBlcmZvcm1hbmNlIG9uIHF1b3RhIGRpc2FibGUgY2FzZS4KLQkgKi8KKwkvKiBVc2UgbmV3IGJ0cmZzX3Fncm91cF9yZXNlcnZlX2RhdGEgdG8gcmVzZXJ2ZSBwcmVjaW91cyBkYXRhIHNwYWNlLiAqLwogCXJldCA9IGJ0cmZzX3Fncm91cF9yZXNlcnZlX2RhdGEoaW5vZGUsIHN0YXJ0LCBsZW4pOworCWlmIChyZXQpCisJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZV9ub3F1b3RhKGlub2RlLCBzdGFydCwgbGVuKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00OTAxLDExICs0ODk4LDYgQEAKIAl1NjQgZXhwZWN0ZWQ7CiAJdTY0IHRvX3JlY2xhaW0gPSAwOwogCi0JdG9fcmVjbGFpbSA9IG1pbl90KHU2NCwgbnVtX29ubGluZV9jcHVzKCkgKiBTWl8xTSwgU1pfMTZNKTsKLQlpZiAoY2FuX292ZXJjb21taXQocm9vdCwgc3BhY2VfaW5mbywgdG9fcmVjbGFpbSwKLQkJCSAgIEJUUkZTX1JFU0VSVkVfRkxVU0hfQUxMKSkKLQkJcmV0dXJuIDA7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpY2tldCwgJnNwYWNlX2luZm8tPnRpY2tldHMsIGxpc3QpCiAJCXRvX3JlY2xhaW0gKz0gdGlja2V0LT5ieXRlczsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpY2tldCwgJnNwYWNlX2luZm8tPnByaW9yaXR5X3RpY2tldHMsIGxpc3QpCkBAIC00OTEzLDYgKzQ5MDUsMTEgQEAKIAlpZiAodG9fcmVjbGFpbSkKIAkJcmV0dXJuIHRvX3JlY2xhaW07CiAKKwl0b19yZWNsYWltID0gbWluX3QodTY0LCBudW1fb25saW5lX2NwdXMoKSAqIFNaXzFNLCBTWl8xNk0pOworCWlmIChjYW5fb3ZlcmNvbW1pdChyb290LCBzcGFjZV9pbmZvLCB0b19yZWNsYWltLAorCQkJICAgQlRSRlNfUkVTRVJWRV9GTFVTSF9BTEwpKQorCQlyZXR1cm4gMDsKKwogCXVzZWQgPSBzcGFjZV9pbmZvLT5ieXRlc191c2VkICsgc3BhY2VfaW5mby0+Ynl0ZXNfcmVzZXJ2ZWQgKwogCSAgICAgICBzcGFjZV9pbmZvLT5ieXRlc19waW5uZWQgKyBzcGFjZV9pbmZvLT5ieXRlc19yZWFkb25seSArCiAJICAgICAgIHNwYWNlX2luZm8tPmJ5dGVzX21heV91c2U7CkBAIC00OTY2LDEyICs0OTYzLDEyIEBACiAgKi8KIHN0YXRpYyB2b2lkIGJ0cmZzX2FzeW5jX3JlY2xhaW1fbWV0YWRhdGFfc3BhY2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCByZXNlcnZlX3RpY2tldCAqbGFzdF90aWNrZXQgPSBOVUxMOwogCXN0cnVjdCBidHJmc19mc19pbmZvICpmc19pbmZvOwogCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzcGFjZV9pbmZvOwogCXU2NCB0b19yZWNsYWltOwogCWludCBmbHVzaF9zdGF0ZTsKIAlpbnQgY29tbWl0X2N5Y2xlcyA9IDA7CisJdTY0IGxhc3RfdGlja2V0c19pZDsKIAogCWZzX2luZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJ0cmZzX2ZzX2luZm8sIGFzeW5jX3JlY2xhaW1fd29yayk7CiAJc3BhY2VfaW5mbyA9IF9fZmluZF9zcGFjZV9pbmZvKGZzX2luZm8sIEJUUkZTX0JMT0NLX0dST1VQX01FVEFEQVRBKTsKQEAgLTQ5ODQsOCArNDk4MSw3IEBACiAJCXNwaW5fdW5sb2NrKCZzcGFjZV9pbmZvLT5sb2NrKTsKIAkJcmV0dXJuOwogCX0KLQlsYXN0X3RpY2tldCA9IGxpc3RfZmlyc3RfZW50cnkoJnNwYWNlX2luZm8tPnRpY2tldHMsCi0JCQkJICAgICAgIHN0cnVjdCByZXNlcnZlX3RpY2tldCwgbGlzdCk7CisJbGFzdF90aWNrZXRzX2lkID0gc3BhY2VfaW5mby0+dGlja2V0c19pZDsKIAlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CiAKIAlmbHVzaF9zdGF0ZSA9IEZMVVNIX0RFTEFZRURfSVRFTVNfTlI7CkBAIC01MDA1LDEwICs1MDAxLDEwIEBACiAJCQkJCQkJICAgICAgc3BhY2VfaW5mbyk7CiAJCXRpY2tldCA9IGxpc3RfZmlyc3RfZW50cnkoJnNwYWNlX2luZm8tPnRpY2tldHMsCiAJCQkJCSAgc3RydWN0IHJlc2VydmVfdGlja2V0LCBsaXN0KTsKLQkJaWYgKGxhc3RfdGlja2V0ID09IHRpY2tldCkgeworCQlpZiAobGFzdF90aWNrZXRzX2lkID09IHNwYWNlX2luZm8tPnRpY2tldHNfaWQpIHsKIAkJCWZsdXNoX3N0YXRlKys7CiAJCX0gZWxzZSB7Ci0JCQlsYXN0X3RpY2tldCA9IHRpY2tldDsKKwkJCWxhc3RfdGlja2V0c19pZCA9IHNwYWNlX2luZm8tPnRpY2tldHNfaWQ7CiAJCQlmbHVzaF9zdGF0ZSA9IEZMVVNIX0RFTEFZRURfSVRFTVNfTlI7CiAJCQlpZiAoY29tbWl0X2N5Y2xlcykKIAkJCQljb21taXRfY3ljbGVzLS07CkBAIC01Mzg0LDYgKzUzODAsNyBAQAogCQkJbGlzdF9kZWxfaW5pdCgmdGlja2V0LT5saXN0KTsKIAkJCW51bV9ieXRlcyAtPSB0aWNrZXQtPmJ5dGVzOwogCQkJdGlja2V0LT5ieXRlcyA9IDA7CisJCQlzcGFjZV9pbmZvLT50aWNrZXRzX2lkKys7CiAJCQl3YWtlX3VwKCZ0aWNrZXQtPndhaXQpOwogCQl9IGVsc2UgewogCQkJdGlja2V0LT5ieXRlcyAtPSBudW1fYnl0ZXM7CkBAIC01NDI2LDYgKzU0MjMsNyBAQAogCQkJbnVtX2J5dGVzIC09IHRpY2tldC0+Ynl0ZXM7CiAJCQlzcGFjZV9pbmZvLT5ieXRlc19tYXlfdXNlICs9IHRpY2tldC0+Ynl0ZXM7CiAJCQl0aWNrZXQtPmJ5dGVzID0gMDsKKwkJCXNwYWNlX2luZm8tPnRpY2tldHNfaWQrKzsKIAkJCXdha2VfdXAoJnRpY2tldC0+d2FpdCk7CiAJCX0gZWxzZSB7CiAJCQl0cmFjZV9idHJmc19zcGFjZV9yZXNlcnZhdGlvbihmc19pbmZvLCAic3BhY2VfaW5mbyIsCkBAIC04MjE2LDYgKzgyMTQsNyBAQAogewogCWludCByZXQ7CiAJc3RydWN0IGJ0cmZzX2Jsb2NrX2dyb3VwX2NhY2hlICpibG9ja19ncm91cDsKKwlzdHJ1Y3QgYnRyZnNfc3BhY2VfaW5mbyAqc3BhY2VfaW5mbzsKIAogCS8qCiAJICogTWl4ZWQgYmxvY2sgZ3JvdXBzIHdpbGwgZXhjbHVkZSBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbG9nIHNvIHdlIG9ubHkKQEAgLTgyMzEsOSArODIzMCwxNCBAQAogCWlmICghYmxvY2tfZ3JvdXApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gYnRyZnNfYWRkX3Jlc2VydmVkX2J5dGVzKGJsb2NrX2dyb3VwLCBpbnMtPm9mZnNldCwKLQkJCQkgICAgICAgaW5zLT5vZmZzZXQsIDApOwotCUJVR19PTihyZXQpOyAvKiBsb2dpYyBlcnJvciAqLworCXNwYWNlX2luZm8gPSBibG9ja19ncm91cC0+c3BhY2VfaW5mbzsKKwlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOworCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCXNwYWNlX2luZm8tPmJ5dGVzX3Jlc2VydmVkICs9IGlucy0+b2Zmc2V0OworCWJsb2NrX2dyb3VwLT5yZXNlcnZlZCArPSBpbnMtPm9mZnNldDsKKwlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOworCXNwaW5fdW5sb2NrKCZzcGFjZV9pbmZvLT5sb2NrKTsKKwogCXJldCA9IGFsbG9jX3Jlc2VydmVkX2ZpbGVfZXh0ZW50KHRyYW5zLCByb290LCAwLCByb290X29iamVjdGlkLAogCQkJCQkgMCwgb3duZXIsIG9mZnNldCwgaW5zLCAxKTsKIAlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW5vZGUuYyBiL2ZzL2J0cmZzL2lub2RlLmMKaW5kZXggZTY4MTFjNDIuLmNhMDExMDYgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lub2RlLmMKKysrIGIvZnMvYnRyZnMvaW5vZGUuYwpAQCAtODQxMiw3ICs4NDEyLDcgQEAKIAlpZiAoIWJpbykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQliaW9fc2V0X29wX2F0dHJzKGJpbywgYmlvX29wKG9yaWdfYmlvKSwgb3JpZ19iaW8tPmJpX29wZik7CisJYmlvX3NldF9vcF9hdHRycyhiaW8sIGJpb19vcChvcmlnX2JpbyksIGJpb19mbGFncyhvcmlnX2JpbykpOwogCWJpby0+YmlfcHJpdmF0ZSA9IGRpcDsKIAliaW8tPmJpX2VuZF9pbyA9IGJ0cmZzX2VuZF9kaW9fYmlvOwogCWJ0cmZzX2lvX2JpbyhiaW8pLT5sb2dpY2FsID0gZmlsZV9vZmZzZXQ7CkBAIC04NDUwLDcgKzg0NTAsOCBAQAogCQkJCQkJICBzdGFydF9zZWN0b3IsIEdGUF9OT0ZTKTsKIAkJCWlmICghYmlvKQogCQkJCWdvdG8gb3V0X2VycjsKLQkJCWJpb19zZXRfb3BfYXR0cnMoYmlvLCBiaW9fb3Aob3JpZ19iaW8pLCBvcmlnX2Jpby0+Ymlfb3BmKTsKKwkJCWJpb19zZXRfb3BfYXR0cnMoYmlvLCBiaW9fb3Aob3JpZ19iaW8pLAorCQkJCQkgYmlvX2ZsYWdzKG9yaWdfYmlvKSk7CiAJCQliaW8tPmJpX3ByaXZhdGUgPSBkaXA7CiAJCQliaW8tPmJpX2VuZF9pbyA9IGJ0cmZzX2VuZF9kaW9fYmlvOwogCQkJYnRyZnNfaW9fYmlvKGJpbyktPmxvZ2ljYWwgPSBmaWxlX29mZnNldDsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lvY3RsLmMgYi9mcy9idHJmcy9pb2N0bC5jCmluZGV4IGIyYTJkYTUuLjdmZDkzOWIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lvY3RsLmMKKysrIGIvZnMvYnRyZnMvaW9jdGwuYwpAQCAtMTYzNCw2ICsxNjM0LDkgQEAKIAlpbnQgbmFtZWxlbjsKIAlpbnQgcmV0ID0gMDsKIAorCWlmICghU19JU0RJUihmaWxlX2lub2RlKGZpbGUpLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisKIAlyZXQgPSBtbnRfd2FudF93cml0ZV9maWxlKGZpbGUpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwpAQCAtMTY5MSw2ICsxNjk0LDkgQEAKIAlzdHJ1Y3QgYnRyZnNfaW9jdGxfdm9sX2FyZ3MgKnZvbF9hcmdzOwogCWludCByZXQ7CiAKKwlpZiAoIVNfSVNESVIoZmlsZV9pbm9kZShmaWxlKS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FTk9URElSOworCiAJdm9sX2FyZ3MgPSBtZW1kdXBfdXNlcihhcmcsIHNpemVvZigqdm9sX2FyZ3MpKTsKIAlpZiAoSVNfRVJSKHZvbF9hcmdzKSkKIAkJcmV0dXJuIFBUUl9FUlIodm9sX2FyZ3MpOwpAQCAtMTcxNCw2ICsxNzIwLDkgQEAKIAlib29sIHJlYWRvbmx5ID0gZmFsc2U7CiAJc3RydWN0IGJ0cmZzX3Fncm91cF9pbmhlcml0ICppbmhlcml0ID0gTlVMTDsKIAorCWlmICghU19JU0RJUihmaWxlX2lub2RlKGZpbGUpLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisKIAl2b2xfYXJncyA9IG1lbWR1cF91c2VyKGFyZywgc2l6ZW9mKCp2b2xfYXJncykpOwogCWlmIChJU19FUlIodm9sX2FyZ3MpKQogCQlyZXR1cm4gUFRSX0VSUih2b2xfYXJncyk7CkBAIC0yMzU3LDYgKzIzNjYsOSBAQAogCWludCByZXQ7CiAJaW50IGVyciA9IDA7CiAKKwlpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisKIAl2b2xfYXJncyA9IG1lbWR1cF91c2VyKGFyZywgc2l6ZW9mKCp2b2xfYXJncykpOwogCWlmIChJU19FUlIodm9sX2FyZ3MpKQogCQlyZXR1cm4gUFRSX0VSUih2b2xfYXJncyk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9yZWxvY2F0aW9uLmMgYi9mcy9idHJmcy9yZWxvY2F0aW9uLmMKaW5kZXggOGEyYzJhMC4uYzBjMTNkYyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvcmVsb2NhdGlvbi5jCisrKyBiL2ZzL2J0cmZzL3JlbG9jYXRpb24uYwpAQCAtNDIwMCw5ICs0MjAwLDExIEBACiAJCWVyciA9IFBUUl9FUlIodHJhbnMpOwogCQlnb3RvIG91dF9mcmVlOwogCX0KLQllcnIgPSBxZ3JvdXBfZml4X3JlbG9jYXRlZF9kYXRhX2V4dGVudHModHJhbnMsIHJjKTsKLQlpZiAoZXJyIDwgMCkgewotCQlidHJmc19hYm9ydF90cmFuc2FjdGlvbih0cmFucywgZXJyKTsKKwlyZXQgPSBxZ3JvdXBfZml4X3JlbG9jYXRlZF9kYXRhX2V4dGVudHModHJhbnMsIHJjKTsKKwlpZiAocmV0IDwgMCkgeworCQlidHJmc19hYm9ydF90cmFuc2FjdGlvbih0cmFucywgcmV0KTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSByZXQ7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCWJ0cmZzX2NvbW1pdF90cmFuc2FjdGlvbih0cmFucywgcmMtPmV4dGVudF9yb290KTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3NlbmQuYyBiL2ZzL2J0cmZzL3NlbmQuYwppbmRleCBlZmUxMjlmLi5hODc2NzVmIDEwMDY0NAotLS0gYS9mcy9idHJmcy9zZW5kLmMKKysrIGIvZnMvYnRyZnMvc2VuZC5jCkBAIC00MjY4LDEwICs0MjY4LDEyIEBACiAJfQogCWJ0cmZzX3JlbGVhc2VfcGF0aChwYXRoKTsKIAorCS8qCisJICogV2UgZG9uJ3QgYWN0dWFsbHkgY2FyZSBhYm91dCBwZW5kaW5nX21vdmUgYXMgd2UgYXJlIHNpbXBseQorCSAqIHJlLWNyZWF0aW5nIHRoaXMgaW5vZGUgYW5kIHdpbGwgYmUgcmVuYW1lJ2luZyBpdCBpbnRvIHBsYWNlIG9uY2Ugd2UKKwkgKiByZW5hbWUgdGhlIHBhcmVudCBkaXJlY3RvcnkuCisJICovCiAJcmV0ID0gcHJvY2Vzc19yZWNvcmRlZF9yZWZzKHNjdHgsICZwZW5kaW5nX21vdmUpOwotCS8qIE9ubHkgYXBwbGljYWJsZSB0byBhbiBpbmNyZW1lbnRhbCBzZW5kLiAqLwotCUFTU0VSVChwZW5kaW5nX21vdmUgPT0gMCk7Ci0KIG91dDoKIAlidHJmc19mcmVlX3BhdGgocGF0aCk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3RyZWUtbG9nLmMgYi9mcy9idHJmcy90cmVlLWxvZy5jCmluZGV4IGU5MzUwMzUuLmVmOWM1NWIgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3RyZWUtbG9nLmMKKysrIGIvZnMvYnRyZnMvdHJlZS1sb2cuYwpAQCAtMjg2Nyw2ICsyODY3LDcgQEAKIAogCWlmIChsb2dfcm9vdF90cmVlLT5sb2dfdHJhbnNpZF9jb21taXR0ZWQgPj0gcm9vdF9sb2dfY3R4LmxvZ190cmFuc2lkKSB7CiAJCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CisJCWxpc3RfZGVsX2luaXQoJnJvb3RfbG9nX2N0eC5saXN0KTsKIAkJbXV0ZXhfdW5sb2NrKCZsb2dfcm9vdF90cmVlLT5sb2dfbXV0ZXgpOwogCQlyZXQgPSByb290X2xvZ19jdHgubG9nX3JldDsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2Rpci5jIGIvZnMvY2VwaC9kaXIuYwppbmRleCBjNjRhMGI3Li5kZjRiM2U2IDEwMDY0NAotLS0gYS9mcy9jZXBoL2Rpci5jCisrKyBiL2ZzL2NlcGgvZGlyLmMKQEAgLTU5Nyw3ICs1OTcsNyBAQAogCWlmIChpc19oYXNoX29yZGVyKG5ld19wb3MpKSB7CiAJCS8qIG5vIG5lZWQgdG8gcmVzZXQgbGFzdF9uYW1lIGZvciBhIGZvcndhcmQgc2VlayB3aGVuCiAJCSAqIGRlbnRyaWVzIGFyZSBzb3RyZWQgaW4gaGFzaCBvcmRlciAqLwotCX0gZWxzZSBpZiAoZmktPmZyYWcgfD0gZnBvc19mcmFnKG5ld19wb3MpKSB7CisJfSBlbHNlIGlmIChmaS0+ZnJhZyAhPSBmcG9zX2ZyYWcobmV3X3BvcykpIHsKIAkJcmV0dXJuIHRydWU7CiAJfQogCXJpbmZvID0gZmktPmxhc3RfcmVhZGRpciA/ICZmaS0+bGFzdF9yZWFkZGlyLT5yX3JlcGx5X2luZm8gOiBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggNmJiZWM1ZS4uMTRhZTRiOCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC02MDksNiArNjA5LDkgQEAKIAljaGFyICpzLCAqcDsKIAljaGFyIHNlcDsKIAorCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfVVNFX1BSRUZJWF9QQVRIKQorCQlyZXR1cm4gZGdldChzYi0+c19yb290KTsKKwogCWZ1bGxfcGF0aCA9IGNpZnNfYnVpbGRfcGF0aF90b19yb290KHZvbCwgY2lmc19zYiwKIAkJCQkJICAgIGNpZnNfc2JfbWFzdGVyX3Rjb24oY2lmc19zYikpOwogCWlmIChmdWxsX3BhdGggPT0gTlVMTCkKQEAgLTY4NiwyNiArNjg5LDIyIEBACiAJY2lmc19zYi0+bW91bnRkYXRhID0ga3N0cm5kdXAoZGF0YSwgUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoY2lmc19zYi0+bW91bnRkYXRhID09IE5VTEwpIHsKIAkJcm9vdCA9IEVSUl9QVFIoLUVOT01FTSk7Ci0JCWdvdG8gb3V0X2NpZnNfc2I7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0JaWYgKHZvbHVtZV9pbmZvLT5wcmVwYXRoKSB7Ci0JCWNpZnNfc2ItPnByZXBhdGggPSBrc3RyZHVwKHZvbHVtZV9pbmZvLT5wcmVwYXRoLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGNpZnNfc2ItPnByZXBhdGggPT0gTlVMTCkgewotCQkJcm9vdCA9IEVSUl9QVFIoLUVOT01FTSk7Ci0JCQlnb3RvIG91dF9jaWZzX3NiOwotCQl9CisJcmMgPSBjaWZzX3NldHVwX2NpZnNfc2Iodm9sdW1lX2luZm8sIGNpZnNfc2IpOworCWlmIChyYykgeworCQlyb290ID0gRVJSX1BUUihyYyk7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0JY2lmc19zZXR1cF9jaWZzX3NiKHZvbHVtZV9pbmZvLCBjaWZzX3NiKTsKLQogCXJjID0gY2lmc19tb3VudChjaWZzX3NiLCB2b2x1bWVfaW5mbyk7CiAJaWYgKHJjKSB7CiAJCWlmICghKGZsYWdzICYgTVNfU0lMRU5UKSkKIAkJCWNpZnNfZGJnKFZGUywgImNpZnNfbW91bnQgZmFpbGVkIHcvcmV0dXJuIGNvZGUgPSAlZFxuIiwKIAkJCQkgcmMpOwogCQlyb290ID0gRVJSX1BUUihyYyk7Ci0JCWdvdG8gb3V0X21vdW50ZGF0YTsKKwkJZ290byBvdXRfZnJlZTsKIAl9CiAKIAltbnRfZGF0YS52b2wgPSB2b2x1bWVfaW5mbzsKQEAgLTczNSwxMSArNzM0LDcgQEAKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwogCX0KIAotCWlmIChjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfVVNFX1BSRUZJWF9QQVRIKQotCQlyb290ID0gZGdldChzYi0+c19yb290KTsKLQllbHNlCi0JCXJvb3QgPSBjaWZzX2dldF9yb290KHZvbHVtZV9pbmZvLCBzYik7Ci0KKwlyb290ID0gY2lmc19nZXRfcm9vdCh2b2x1bWVfaW5mbywgc2IpOwogCWlmIChJU19FUlIocm9vdCkpCiAJCWdvdG8gb3V0X3N1cGVyOwogCkBAIC03NTIsOSArNzQ3LDkgQEAKIAljaWZzX2NsZWFudXBfdm9sdW1lX2luZm8odm9sdW1lX2luZm8pOwogCXJldHVybiByb290OwogCi1vdXRfbW91bnRkYXRhOgorb3V0X2ZyZWU6CisJa2ZyZWUoY2lmc19zYi0+cHJlcGF0aCk7CiAJa2ZyZWUoY2lmc19zYi0+bW91bnRkYXRhKTsKLW91dF9jaWZzX3NiOgogCWtmcmVlKGNpZnNfc2IpOwogb3V0X25sczoKIAl1bmxvYWRfbmxzKHZvbHVtZV9pbmZvLT5sb2NhbF9ubHMpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzcHJvdG8uaCBiL2ZzL2NpZnMvY2lmc3Byb3RvLmgKaW5kZXggMTI0M2JkMy4uOTVkYWI0MyAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzcHJvdG8uaAorKysgYi9mcy9jaWZzL2NpZnNwcm90by5oCkBAIC0xODQsNyArMTg0LDcgQEAKIAkJCSAgICAgICAgIHVuc2lnbmVkIGludCB0b19yZWFkKTsKIGV4dGVybiBpbnQgY2lmc19yZWFkX3BhZ2VfZnJvbV9zb2NrZXQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLAogCQkJCSAgICAgIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgdG9fcmVhZCk7Ci1leHRlcm4gdm9pZCBjaWZzX3NldHVwX2NpZnNfc2Ioc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbywKK2V4dGVybiBpbnQgY2lmc19zZXR1cF9jaWZzX3NiKHN0cnVjdCBzbWJfdm9sICpwdm9sdW1lX2luZm8sCiAJCQkgICAgICAgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYik7CiBleHRlcm4gaW50IGNpZnNfbWF0Y2hfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKik7CiBleHRlcm4gdm9pZCBjaWZzX2NsZWFudXBfdm9sdW1lX2luZm8oc3RydWN0IHNtYl92b2wgKnB2b2x1bWVfaW5mbyk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IDdhZTAzMjguLjJlNGY0YmEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC0yNzgxLDYgKzI3ODEsMjQgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludAorbWF0Y2hfcHJlcGF0aChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgY2lmc19tbnRfZGF0YSAqbW50X2RhdGEpCit7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqb2xkID0gQ0lGU19TQihzYik7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqbmV3ID0gbW50X2RhdGEtPmNpZnNfc2I7CisKKwlpZiAob2xkLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfVVNFX1BSRUZJWF9QQVRIKSB7CisJCWlmICghKG5ldy0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1VTRV9QUkVGSVhfUEFUSCkpCisJCQlyZXR1cm4gMDsKKwkJLyogVGhlIHByZXBhdGggc2hvdWxkIGJlIG51bGwgdGVybWluYXRlZCBzdHJpbmdzICovCisJCWlmIChzdHJjbXAobmV3LT5wcmVwYXRoLCBvbGQtPnByZXBhdGgpKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCiBpbnQKIGNpZnNfbWF0Y2hfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKIHsKQEAgLTI4MDgsNyArMjgyNiw4IEBACiAKIAlpZiAoIW1hdGNoX3NlcnZlcih0Y3Bfc3J2LCB2b2x1bWVfaW5mbykgfHwKIAkgICAgIW1hdGNoX3Nlc3Npb24oc2VzLCB2b2x1bWVfaW5mbykgfHwKLQkgICAgIW1hdGNoX3Rjb24odGNvbiwgdm9sdW1lX2luZm8tPlVOQykpIHsKKwkgICAgIW1hdGNoX3Rjb24odGNvbiwgdm9sdW1lX2luZm8tPlVOQykgfHwKKwkgICAgIW1hdGNoX3ByZXBhdGgoc2IsIG1udF9kYXRhKSkgewogCQlyYyA9IDA7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTMyMjIsNyArMzI0MSw3IEBACiAJfQogfQogCi12b2lkIGNpZnNfc2V0dXBfY2lmc19zYihzdHJ1Y3Qgc21iX3ZvbCAqcHZvbHVtZV9pbmZvLAoraW50IGNpZnNfc2V0dXBfY2lmc19zYihzdHJ1Y3Qgc21iX3ZvbCAqcHZvbHVtZV9pbmZvLAogCQkJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYikKIHsKIAlJTklUX0RFTEFZRURfV09SSygmY2lmc19zYi0+cHJ1bmVfdGxpbmtzLCBjaWZzX3BydW5lX3RsaW5rcyk7CkBAIC0zMzE2LDYgKzMzMzUsMTQgQEAKIAogCWlmICgocHZvbHVtZV9pbmZvLT5jaWZzX2FjbCkgJiYgKHB2b2x1bWVfaW5mby0+ZHlucGVybSkpCiAJCWNpZnNfZGJnKFZGUywgIm1vdW50IG9wdGlvbiBkeW5wZXJtIGlnbm9yZWQgaWYgY2lmc2FjbCBtb3VudCBvcHRpb24gc3VwcG9ydGVkXG4iKTsKKworCWlmIChwdm9sdW1lX2luZm8tPnByZXBhdGgpIHsKKwkJY2lmc19zYi0+cHJlcGF0aCA9IGtzdHJkdXAocHZvbHVtZV9pbmZvLT5wcmVwYXRoLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGNpZnNfc2ItPnByZXBhdGggPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvZnMvY29kYS9maWxlLmMgYi9mcy9jb2RhL2ZpbGUuYwppbmRleCBmNDdjNzQ4Li44NDE1ZDRmIDEwMDY0NAotLS0gYS9mcy9jb2RhL2ZpbGUuYworKysgYi9mcy9jb2RhL2ZpbGUuYwpAQCAtMzgsMjcgKzM4LDYgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKLWNvZGFfZmlsZV9zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCBsb2ZmX3QgKnBwb3MsCi0JCSAgICAgIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHNpemVfdCBjb3VudCwKLQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQotewotCXNzaXplX3QgKCpzcGxpY2VfcmVhZCkoc3RydWN0IGZpbGUgKiwgbG9mZl90ICosCi0JCQkgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7Ci0Jc3RydWN0IGNvZGFfZmlsZV9pbmZvICpjZmk7Ci0Jc3RydWN0IGZpbGUgKmhvc3RfZmlsZTsKLQotCWNmaSA9IENPREFfRlRPQyhjb2RhX2ZpbGUpOwotCUJVR19PTighY2ZpIHx8IGNmaS0+Y2ZpX21hZ2ljICE9IENPREFfTUFHSUMpOwotCWhvc3RfZmlsZSA9IGNmaS0+Y2ZpX2NvbnRhaW5lcjsKLQotCXNwbGljZV9yZWFkID0gaG9zdF9maWxlLT5mX29wLT5zcGxpY2VfcmVhZDsKLQlpZiAoIXNwbGljZV9yZWFkKQotCQlzcGxpY2VfcmVhZCA9IGRlZmF1bHRfZmlsZV9zcGxpY2VfcmVhZDsKLQotCXJldHVybiBzcGxpY2VfcmVhZChob3N0X2ZpbGUsIHBwb3MsIHBpcGUsIGNvdW50LCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90CiBjb2RhX2ZpbGVfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqdG8pCiB7CiAJc3RydWN0IGZpbGUgKmNvZGFfZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CkBAIC0yMjUsNiArMjA0LDYgQEAKIAkub3BlbgkJPSBjb2RhX29wZW4sCiAJLnJlbGVhc2UJPSBjb2RhX3JlbGVhc2UsCiAJLmZzeW5jCQk9IGNvZGFfZnN5bmMsCi0JLnNwbGljZV9yZWFkCT0gY29kYV9maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2ZpbGUuYyBiL2ZzL2NvbmZpZ2ZzL2ZpbGUuYwppbmRleCBjMzBjZjQ5Li4yYzYzMTJkIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9maWxlLmMKKysrIGIvZnMvY29uZmlnZnMvZmlsZS5jCkBAIC0zMzMsNiArMzMzLDcgQEAKIAkJaWYgKGJpbl9hdHRyLT5jYl9tYXhfc2l6ZSAmJgogCQkJKnBwb3MgKyBjb3VudCA+IGJpbl9hdHRyLT5jYl9tYXhfc2l6ZSkgewogCQkJbGVuID0gLUVGQklHOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQl0YnVmID0gdm1hbGxvYygqcHBvcyArIGNvdW50KTsKZGlmZiAtLWdpdCBhL2ZzL2NyeXB0by9jcnlwdG8uYyBiL2ZzL2NyeXB0by9jcnlwdG8uYwppbmRleCBjNTAyYzExLi42MTA1N2I3ZCAxMDA2NDQKLS0tIGEvZnMvY3J5cHRvL2NyeXB0by5jCisrKyBiL2ZzL2NyeXB0by9jcnlwdG8uYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvZnNjcnlwdG8uaD4KLSNpbmNsdWRlIDxsaW51eC9lY3J5cHRmcy5oPgogCiBzdGF0aWMgdW5zaWduZWQgaW50IG51bV9wcmVhbGxvY19jcnlwdG9fcGFnZXMgPSAzMjsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX3ByZWFsbG9jX2NyeXB0b19jdHhzID0gMTI4OwpAQCAtMTI4LDExICsxMjcsMTEgQEAKIEVYUE9SVF9TWU1CT0woZnNjcnlwdF9nZXRfY3R4KTsKIAogLyoqCi0gKiBmc2NyeXB0X2NvbXBsZXRlKCkgLSBUaGUgY29tcGxldGlvbiBjYWxsYmFjayBmb3IgcGFnZSBlbmNyeXB0aW9uCi0gKiBAcmVxOiBUaGUgYXN5bmNocm9ub3VzIGVuY3J5cHRpb24gcmVxdWVzdCBjb250ZXh0Ci0gKiBAcmVzOiBUaGUgcmVzdWx0IG9mIHRoZSBlbmNyeXB0aW9uIG9wZXJhdGlvbgorICogcGFnZV9jcnlwdF9jb21wbGV0ZSgpIC0gY29tcGxldGlvbiBjYWxsYmFjayBmb3IgcGFnZSBjcnlwdG8KKyAqIEByZXE6IFRoZSBhc3luY2hyb25vdXMgY2lwaGVyIHJlcXVlc3QgY29udGV4dAorICogQHJlczogVGhlIHJlc3VsdCBvZiB0aGUgY2lwaGVyIG9wZXJhdGlvbgogICovCi1zdGF0aWMgdm9pZCBmc2NyeXB0X2NvbXBsZXRlKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxLCBpbnQgcmVzKQorc3RhdGljIHZvaWQgcGFnZV9jcnlwdF9jb21wbGV0ZShzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKnJlcSwgaW50IHJlcykKIHsKIAlzdHJ1Y3QgZnNjcnlwdF9jb21wbGV0aW9uX3Jlc3VsdCAqZWNyID0gcmVxLT5kYXRhOwogCkBAIC0xNzAsNyArMTY5LDcgQEAKIAogCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKAogCQlyZXEsIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HIHwgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLAotCQlmc2NyeXB0X2NvbXBsZXRlLCAmZWNyKTsKKwkJcGFnZV9jcnlwdF9jb21wbGV0ZSwgJmVjcik7CiAKIAlCVUlMRF9CVUdfT04oRlNfWFRTX1RXRUFLX1NJWkUgPCBzaXplb2YoaW5kZXgpKTsKIAltZW1jcHkoeHRzX3R3ZWFrLCAmaW5kZXgsIHNpemVvZihpbmRleCkpOwpkaWZmIC0tZ2l0IGEvZnMvY3J5cHRvL2ZuYW1lLmMgYi9mcy9jcnlwdG8vZm5hbWUuYwppbmRleCA1ZDZkNDkxLi45YTI4MTMzIDEwMDY0NAotLS0gYS9mcy9jcnlwdG8vZm5hbWUuYworKysgYi9mcy9jcnlwdG8vZm5hbWUuYwpAQCAtMTAsMjEgKzEwLDE2IEBACiAgKiBUaGlzIGhhcyBub3QgeWV0IHVuZGVyZ29uZSBhIHJpZ29yb3VzIHNlY3VyaXR5IGF1ZGl0LgogICovCiAKLSNpbmNsdWRlIDxrZXlzL2VuY3J5cHRlZC10eXBlLmg+Ci0jaW5jbHVkZSA8a2V5cy91c2VyLXR5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzY3J5cHRvLmg+CiAKLXN0YXRpYyB1MzIgc2l6ZV9yb3VuZF91cChzaXplX3Qgc2l6ZSwgc2l6ZV90IGJsa3NpemUpCi17Ci0JcmV0dXJuICgoc2l6ZSArIGJsa3NpemUgLSAxKSAvIGJsa3NpemUpICogYmxrc2l6ZTsKLX0KLQogLyoqCi0gKiBkaXJfY3J5cHRfY29tcGxldGUoKSAtCisgKiBmbmFtZV9jcnlwdF9jb21wbGV0ZSgpIC0gY29tcGxldGlvbiBjYWxsYmFjayBmb3IgZmlsZW5hbWUgY3J5cHRvCisgKiBAcmVxOiBUaGUgYXN5bmNocm9ub3VzIGNpcGhlciByZXF1ZXN0IGNvbnRleHQKKyAqIEByZXM6IFRoZSByZXN1bHQgb2YgdGhlIGNpcGhlciBvcGVyYXRpb24KICAqLwotc3RhdGljIHZvaWQgZGlyX2NyeXB0X2NvbXBsZXRlKHN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqcmVxLCBpbnQgcmVzKQorc3RhdGljIHZvaWQgZm5hbWVfY3J5cHRfY29tcGxldGUoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXEsIGludCByZXMpCiB7CiAJc3RydWN0IGZzY3J5cHRfY29tcGxldGlvbl9yZXN1bHQgKmVjciA9IHJlcS0+ZGF0YTsKIApAQCAtMzUsMTEgKzMwLDExIEBACiB9CiAKIC8qKgotICogZm5hbWVfZW5jcnlwdCgpIC0KKyAqIGZuYW1lX2VuY3J5cHQoKSAtIGVuY3J5cHQgYSBmaWxlbmFtZQogICoKLSAqIFRoaXMgZnVuY3Rpb24gZW5jcnlwdHMgdGhlIGlucHV0IGZpbGVuYW1lLCBhbmQgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZQotICogY2lwaGVydGV4dC4gRXJyb3JzIGFyZSByZXR1cm5lZCBhcyBuZWdhdGl2ZSBudW1iZXJzLiAgV2UgdHJ1c3QgdGhlIGNhbGxlciB0bwotICogYWxsb2NhdGUgc3VmZmljaWVudCBtZW1vcnkgdG8gb25hbWUgc3RyaW5nLgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgYWxsb2NhdGVkIHN1ZmZpY2llbnQgbWVtb3J5IGZvciB0aGUgQG9uYW1lIHN0cmluZy4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUKICAqLwogc3RhdGljIGludCBmbmFtZV9lbmNyeXB0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQljb25zdCBzdHJ1Y3QgcXN0ciAqaW5hbWUsIHN0cnVjdCBmc2NyeXB0X3N0ciAqb25hbWUpCkBAIC02MCwxMCArNTUsOSBAQAogCWlmIChpbmFtZS0+bGVuIDw9IDAgfHwgaW5hbWUtPmxlbiA+IGxpbSkKIAkJcmV0dXJuIC1FSU87CiAKLQljaXBoZXJ0ZXh0X2xlbiA9IChpbmFtZS0+bGVuIDwgRlNfQ1JZUFRPX0JMT0NLX1NJWkUpID8KLQkJCQkJRlNfQ1JZUFRPX0JMT0NLX1NJWkUgOiBpbmFtZS0+bGVuOwotCWNpcGhlcnRleHRfbGVuID0gc2l6ZV9yb3VuZF91cChjaXBoZXJ0ZXh0X2xlbiwgcGFkZGluZyk7Ci0JY2lwaGVydGV4dF9sZW4gPSAoY2lwaGVydGV4dF9sZW4gPiBsaW0pID8gbGltIDogY2lwaGVydGV4dF9sZW47CisJY2lwaGVydGV4dF9sZW4gPSBtYXgoaW5hbWUtPmxlbiwgKHUzMilGU19DUllQVE9fQkxPQ0tfU0laRSk7CisJY2lwaGVydGV4dF9sZW4gPSByb3VuZF91cChjaXBoZXJ0ZXh0X2xlbiwgcGFkZGluZyk7CisJY2lwaGVydGV4dF9sZW4gPSBtaW4oY2lwaGVydGV4dF9sZW4sIGxpbSk7CiAKIAlpZiAoY2lwaGVydGV4dF9sZW4gPD0gc2l6ZW9mKGJ1ZikpIHsKIAkJd29ya2J1ZiA9IGJ1ZjsKQEAgLTg0LDcgKzc4LDcgQEAKIAl9CiAJc2tjaXBoZXJfcmVxdWVzdF9zZXRfY2FsbGJhY2socmVxLAogCQkJQ1JZUFRPX1RGTV9SRVFfTUFZX0JBQ0tMT0cgfCBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVAsCi0JCQlkaXJfY3J5cHRfY29tcGxldGUsICZlY3IpOworCQkJZm5hbWVfY3J5cHRfY29tcGxldGUsICZlY3IpOwogCiAJLyogQ29weSB0aGUgaW5wdXQgKi8KIAltZW1jcHkod29ya2J1ZiwgaW5hbWUtPm5hbWUsIGluYW1lLT5sZW4pOwpAQCAtMTA1LDIwICs5OSwyMiBAQAogCX0KIAlrZnJlZShhbGxvY19idWYpOwogCXNrY2lwaGVyX3JlcXVlc3RfZnJlZShyZXEpOwotCWlmIChyZXMgPCAwKQorCWlmIChyZXMgPCAwKSB7CiAJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUgogCQkJCSIlczogRXJyb3IgKGVycm9yIGNvZGUgJWQpXG4iLCBfX2Z1bmNfXywgcmVzKTsKKwkJcmV0dXJuIHJlczsKKwl9CiAKIAlvbmFtZS0+bGVuID0gY2lwaGVydGV4dF9sZW47Ci0JcmV0dXJuIHJlczsKKwlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIGZuYW1lX2RlY3J5cHQoKQotICoJVGhpcyBmdW5jdGlvbiBkZWNyeXB0cyB0aGUgaW5wdXQgZmlsZW5hbWUsIGFuZCByZXR1cm5zCi0gKgl0aGUgbGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQuCi0gKglFcnJvcnMgYXJlIHJldHVybmVkIGFzIG5lZ2F0aXZlIG51bWJlcnMuCi0gKglXZSB0cnVzdCB0aGUgY2FsbGVyIHRvIGFsbG9jYXRlIHN1ZmZpY2llbnQgbWVtb3J5IHRvIG9uYW1lIHN0cmluZy4KKy8qKgorICogZm5hbWVfZGVjcnlwdCgpIC0gZGVjcnlwdCBhIGZpbGVuYW1lCisgKgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgYWxsb2NhdGVkIHN1ZmZpY2llbnQgbWVtb3J5IGZvciB0aGUgQG9uYW1lIHN0cmluZy4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUKICAqLwogc3RhdGljIGludCBmbmFtZV9kZWNyeXB0KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJY29uc3Qgc3RydWN0IGZzY3J5cHRfc3RyICppbmFtZSwKQEAgLTE0Niw3ICsxNDIsNyBAQAogCX0KIAlza2NpcGhlcl9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsCiAJCUNSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HIHwgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQLAotCQlkaXJfY3J5cHRfY29tcGxldGUsICZlY3IpOworCQlmbmFtZV9jcnlwdF9jb21wbGV0ZSwgJmVjcik7CiAKIAkvKiBJbml0aWFsaXplIElWICovCiAJbWVtc2V0KGl2LCAwLCBGU19DUllQVE9fQkxPQ0tfU0laRSk7CkBAIC0xNjgsNyArMTY0LDcgQEAKIAl9CiAKIAlvbmFtZS0+bGVuID0gc3RybmxlbihvbmFtZS0+bmFtZSwgaW5hbWUtPmxlbik7Ci0JcmV0dXJuIG9uYW1lLT5sZW47CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICpsb29rdXBfdGFibGUgPQpAQCAtMjMxLDkgKzIyNyw4IEBACiAKIAlpZiAoY2kpCiAJCXBhZGRpbmcgPSA0IDw8IChjaS0+Y2lfZmxhZ3MgJiBGU19QT0xJQ1lfRkxBR1NfUEFEX01BU0spOwotCWlmIChpbGVuIDwgRlNfQ1JZUFRPX0JMT0NLX1NJWkUpCi0JCWlsZW4gPSBGU19DUllQVE9fQkxPQ0tfU0laRTsKLQlyZXR1cm4gc2l6ZV9yb3VuZF91cChpbGVuLCBwYWRkaW5nKTsKKwlpbGVuID0gbWF4KGlsZW4sICh1MzIpRlNfQ1JZUFRPX0JMT0NLX1NJWkUpOworCXJldHVybiByb3VuZF91cChpbGVuLCBwYWRkaW5nKTsKIH0KIEVYUE9SVF9TWU1CT0woZnNjcnlwdF9mbmFtZV9lbmNyeXB0ZWRfc2l6ZSk7CiAKQEAgLTI3OSw2ICsyNzQsMTAgQEAKIC8qKgogICogZnNjcnlwdF9mbmFtZV9kaXNrX3RvX3VzcigpIC0gY29udmVydHMgYSBmaWxlbmFtZSBmcm9tIGRpc2sgc3BhY2UgdG8gdXNlcgogICogc3BhY2UKKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBhbGxvY2F0ZWQgc3VmZmljaWVudCBtZW1vcnkgZm9yIHRoZSBAb25hbWUgc3RyaW5nLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZQogICovCiBpbnQgZnNjcnlwdF9mbmFtZV9kaXNrX3RvX3VzcihzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJdTMyIGhhc2gsIHUzMiBtaW5vcl9oYXNoLApAQCAtMjg3LDEzICsyODYsMTIgQEAKIHsKIAljb25zdCBzdHJ1Y3QgcXN0ciBxbmFtZSA9IEZTVFJfVE9fUVNUUihpbmFtZSk7CiAJY2hhciBidWZbMjRdOwotCWludCByZXQ7CiAKIAlpZiAoZnNjcnlwdF9pc19kb3RfZG90ZG90KCZxbmFtZSkpIHsKIAkJb25hbWUtPm5hbWVbMF0gPSAnLic7CiAJCW9uYW1lLT5uYW1lW2luYW1lLT5sZW4gLSAxXSA9ICcuJzsKIAkJb25hbWUtPmxlbiA9IGluYW1lLT5sZW47Ci0JCXJldHVybiBvbmFtZS0+bGVuOworCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoaW5hbWUtPmxlbiA8IEZTX0NSWVBUT19CTE9DS19TSVpFKQpAQCAtMzAzLDkgKzMwMSw5IEBACiAJCXJldHVybiBmbmFtZV9kZWNyeXB0KGlub2RlLCBpbmFtZSwgb25hbWUpOwogCiAJaWYgKGluYW1lLT5sZW4gPD0gRlNfRk5BTUVfQ1JZUFRPX0RJR0VTVF9TSVpFKSB7Ci0JCXJldCA9IGRpZ2VzdF9lbmNvZGUoaW5hbWUtPm5hbWUsIGluYW1lLT5sZW4sIG9uYW1lLT5uYW1lKTsKLQkJb25hbWUtPmxlbiA9IHJldDsKLQkJcmV0dXJuIHJldDsKKwkJb25hbWUtPmxlbiA9IGRpZ2VzdF9lbmNvZGUoaW5hbWUtPm5hbWUsIGluYW1lLT5sZW4sCisJCQkJCSAgIG9uYW1lLT5uYW1lKTsKKwkJcmV0dXJuIDA7CiAJfQogCWlmIChoYXNoKSB7CiAJCW1lbWNweShidWYsICZoYXNoLCA0KTsKQEAgLTMxNSwxNSArMzEzLDE4IEBACiAJfQogCW1lbWNweShidWYgKyA4LCBpbmFtZS0+bmFtZSArIGluYW1lLT5sZW4gLSAxNiwgMTYpOwogCW9uYW1lLT5uYW1lWzBdID0gJ18nOwotCXJldCA9IGRpZ2VzdF9lbmNvZGUoYnVmLCAyNCwgb25hbWUtPm5hbWUgKyAxKTsKLQlvbmFtZS0+bGVuID0gcmV0ICsgMTsKLQlyZXR1cm4gcmV0ICsgMTsKKwlvbmFtZS0+bGVuID0gMSArIGRpZ2VzdF9lbmNvZGUoYnVmLCAyNCwgb25hbWUtPm5hbWUgKyAxKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZnNjcnlwdF9mbmFtZV9kaXNrX3RvX3Vzcik7CiAKIC8qKgogICogZnNjcnlwdF9mbmFtZV91c3JfdG9fZGlzaygpIC0gY29udmVydHMgYSBmaWxlbmFtZSBmcm9tIHVzZXIgc3BhY2UgdG8gZGlzawogICogc3BhY2UKKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBhbGxvY2F0ZWQgc3VmZmljaWVudCBtZW1vcnkgZm9yIHRoZSBAb25hbWUgc3RyaW5nLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZQogICovCiBpbnQgZnNjcnlwdF9mbmFtZV91c3JfdG9fZGlzayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJY29uc3Qgc3RydWN0IHFzdHIgKmluYW1lLApAQCAtMzMzLDcgKzMzNCw3IEBACiAJCW9uYW1lLT5uYW1lWzBdID0gJy4nOwogCQlvbmFtZS0+bmFtZVtpbmFtZS0+bGVuIC0gMV0gPSAnLic7CiAJCW9uYW1lLT5sZW4gPSBpbmFtZS0+bGVuOwotCQlyZXR1cm4gb25hbWUtPmxlbjsKKwkJcmV0dXJuIDA7CiAJfQogCWlmIChpbm9kZS0+aV9jcnlwdF9pbmZvKQogCQlyZXR1cm4gZm5hbWVfZW5jcnlwdChpbm9kZSwgaW5hbWUsIG9uYW1lKTsKQEAgLTM2NywxMCArMzY4LDEwIEBACiAJaWYgKGRpci0+aV9jcnlwdF9pbmZvKSB7CiAJCXJldCA9IGZzY3J5cHRfZm5hbWVfYWxsb2NfYnVmZmVyKGRpciwgaW5hbWUtPmxlbiwKIAkJCQkJCQkmZm5hbWUtPmNyeXB0b19idWYpOwotCQlpZiAocmV0IDwgMCkKKwkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJCXJldCA9IGZuYW1lX2VuY3J5cHQoZGlyLCBpbmFtZSwgJmZuYW1lLT5jcnlwdG9fYnVmKTsKLQkJaWYgKHJldCA8IDApCisJCWlmIChyZXQpCiAJCQlnb3RvIGVycm91dDsKIAkJZm5hbWUtPmRpc2tfbmFtZS5uYW1lID0gZm5hbWUtPmNyeXB0b19idWYubmFtZTsKIAkJZm5hbWUtPmRpc2tfbmFtZS5sZW4gPSBmbmFtZS0+Y3J5cHRvX2J1Zi5sZW47CmRpZmYgLS1naXQgYS9mcy9jcnlwdG8va2V5aW5mby5jIGIvZnMvY3J5cHRvL2tleWluZm8uYwppbmRleCAxYWMyNjNlLi44MmYwMjg1IDEwMDY0NAotLS0gYS9mcy9jcnlwdG8va2V5aW5mby5jCisrKyBiL2ZzL2NyeXB0by9rZXlpbmZvLmMKQEAgLTgsMTEgKzgsOCBAQAogICogV3JpdHRlbiBieSBNaWNoYWVsIEhhbGNyb3csIElsZGFyIE11c2x1a2hvdiwgYW5kIFVkYXkgU2F2YWdhb25rYXIsIDIwMTUuCiAgKi8KIAotI2luY2x1ZGUgPGtleXMvZW5jcnlwdGVkLXR5cGUuaD4KICNpbmNsdWRlIDxrZXlzL3VzZXItdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSA8dWFwaS9saW51eC9rZXljdGwuaD4KICNpbmNsdWRlIDxsaW51eC9mc2NyeXB0by5oPgogCiBzdGF0aWMgdm9pZCBkZXJpdmVfY3J5cHRfY29tcGxldGUoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXEsIGludCByYykKQEAgLTEzOSw2ICsxMzYsMzggQEAKIAlyZXR1cm4gcmVzOwogfQogCitzdGF0aWMgaW50IGRldGVybWluZV9jaXBoZXJfdHlwZShzdHJ1Y3QgZnNjcnlwdF9pbmZvICpjaSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgY29uc3QgY2hhciAqKmNpcGhlcl9zdHJfcmV0LCBpbnQgKmtleXNpemVfcmV0KQoreworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlmIChjaS0+Y2lfZGF0YV9tb2RlID09IEZTX0VOQ1JZUFRJT05fTU9ERV9BRVNfMjU2X1hUUykgeworCQkJKmNpcGhlcl9zdHJfcmV0ID0gInh0cyhhZXMpIjsKKwkJCSprZXlzaXplX3JldCA9IEZTX0FFU18yNTZfWFRTX0tFWV9TSVpFOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcHJfd2Fybl9vbmNlKCJmc2NyeXB0bzogdW5zdXBwb3J0ZWQgY29udGVudHMgZW5jcnlwdGlvbiBtb2RlICIKKwkJCSAgICAgIiVkIGZvciBpbm9kZSAlbHVcbiIsCisJCQkgICAgIGNpLT5jaV9kYXRhX21vZGUsIGlub2RlLT5pX2lubyk7CisJCXJldHVybiAtRU5PS0VZOworCX0KKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKGNpLT5jaV9maWxlbmFtZV9tb2RlID09IEZTX0VOQ1JZUFRJT05fTU9ERV9BRVNfMjU2X0NUUykgeworCQkJKmNpcGhlcl9zdHJfcmV0ID0gImN0cyhjYmMoYWVzKSkiOworCQkJKmtleXNpemVfcmV0ID0gRlNfQUVTXzI1Nl9DVFNfS0VZX1NJWkU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcl93YXJuX29uY2UoImZzY3J5cHRvOiB1bnN1cHBvcnRlZCBmaWxlbmFtZXMgZW5jcnlwdGlvbiBtb2RlICIKKwkJCSAgICAgIiVkIGZvciBpbm9kZSAlbHVcbiIsCisJCQkgICAgIGNpLT5jaV9maWxlbmFtZV9tb2RlLCBpbm9kZS0+aV9pbm8pOworCQlyZXR1cm4gLUVOT0tFWTsKKwl9CisKKwlwcl93YXJuX29uY2UoImZzY3J5cHRvOiB1bnN1cHBvcnRlZCBmaWxlIHR5cGUgJWQgZm9yIGlub2RlICVsdVxuIiwKKwkJICAgICAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCksIGlub2RlLT5pX2lubyk7CisJcmV0dXJuIC1FTk9LRVk7Cit9CisKIHN0YXRpYyB2b2lkIHB1dF9jcnlwdF9pbmZvKHN0cnVjdCBmc2NyeXB0X2luZm8gKmNpKQogewogCWlmICghY2kpCkBAIC0xNTUsOCArMTg0LDggQEAKIAlzdHJ1Y3QgZnNjcnlwdF9jb250ZXh0IGN0eDsKIAlzdHJ1Y3QgY3J5cHRvX3NrY2lwaGVyICpjdGZtOwogCWNvbnN0IGNoYXIgKmNpcGhlcl9zdHI7CisJaW50IGtleXNpemU7CiAJdTggcmF3X2tleVtGU19NQVhfS0VZX1NJWkVdOwotCXU4IG1vZGU7CiAJaW50IHJlczsKIAogCXJlcyA9IGZzY3J5cHRfaW5pdGlhbGl6ZSgpOwpAQCAtMTc5LDEzICsyMDgsMTkgQEAKIAlpZiAocmVzIDwgMCkgewogCQlpZiAoIWZzY3J5cHRfZHVtbXlfY29udGV4dF9lbmFibGVkKGlub2RlKSkKIAkJCXJldHVybiByZXM7CisJCWN0eC5mb3JtYXQgPSBGU19FTkNSWVBUSU9OX0NPTlRFWFRfRk9STUFUX1YxOwogCQljdHguY29udGVudHNfZW5jcnlwdGlvbl9tb2RlID0gRlNfRU5DUllQVElPTl9NT0RFX0FFU18yNTZfWFRTOwogCQljdHguZmlsZW5hbWVzX2VuY3J5cHRpb25fbW9kZSA9IEZTX0VOQ1JZUFRJT05fTU9ERV9BRVNfMjU2X0NUUzsKIAkJY3R4LmZsYWdzID0gMDsKIAl9IGVsc2UgaWYgKHJlcyAhPSBzaXplb2YoY3R4KSkgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JcmVzID0gMDsKKworCWlmIChjdHguZm9ybWF0ICE9IEZTX0VOQ1JZUFRJT05fQ09OVEVYVF9GT1JNQVRfVjEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGN0eC5mbGFncyAmIH5GU19QT0xJQ1lfRkxBR1NfVkFMSUQpCisJCXJldHVybiAtRUlOVkFMOwogCiAJY3J5cHRfaW5mbyA9IGttZW1fY2FjaGVfYWxsb2MoZnNjcnlwdF9pbmZvX2NhY2hlcCwgR0ZQX05PRlMpOwogCWlmICghY3J5cHRfaW5mbykKQEAgLTE5OCwyNyArMjMzLDExIEBACiAJY3J5cHRfaW5mby0+Y2lfa2V5cmluZ19rZXkgPSBOVUxMOwogCW1lbWNweShjcnlwdF9pbmZvLT5jaV9tYXN0ZXJfa2V5LCBjdHgubWFzdGVyX2tleV9kZXNjcmlwdG9yLAogCQkJCXNpemVvZihjcnlwdF9pbmZvLT5jaV9tYXN0ZXJfa2V5KSk7Ci0JaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCi0JCW1vZGUgPSBjcnlwdF9pbmZvLT5jaV9kYXRhX21vZGU7Ci0JZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKQotCQltb2RlID0gY3J5cHRfaW5mby0+Y2lfZmlsZW5hbWVfbW9kZTsKLQllbHNlCi0JCUJVRygpOwogCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBGU19FTkNSWVBUSU9OX01PREVfQUVTXzI1Nl9YVFM6Ci0JCWNpcGhlcl9zdHIgPSAieHRzKGFlcykiOwotCQlicmVhazsKLQljYXNlIEZTX0VOQ1JZUFRJT05fTU9ERV9BRVNfMjU2X0NUUzoKLQkJY2lwaGVyX3N0ciA9ICJjdHMoY2JjKGFlcykpIjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrX29uY2UoS0VSTl9XQVJOSU5HCi0JCQkgICAgIiVzOiB1bnN1cHBvcnRlZCBrZXkgbW9kZSAlZCAoaW5vICV1KVxuIiwKLQkJCSAgICBfX2Z1bmNfXywgbW9kZSwgKHVuc2lnbmVkKSBpbm9kZS0+aV9pbm8pOwotCQlyZXMgPSAtRU5PS0VZOworCXJlcyA9IGRldGVybWluZV9jaXBoZXJfdHlwZShjcnlwdF9pbmZvLCBpbm9kZSwgJmNpcGhlcl9zdHIsICZrZXlzaXplKTsKKwlpZiAocmVzKQogCQlnb3RvIG91dDsKLQl9CisKIAlpZiAoZnNjcnlwdF9kdW1teV9jb250ZXh0X2VuYWJsZWQoaW5vZGUpKSB7CiAJCW1lbXNldChyYXdfa2V5LCAweDQyLCBGU19BRVNfMjU2X1hUU19LRVlfU0laRSk7CiAJCWdvdG8gZ290X2tleTsKQEAgLTI1Myw3ICsyNzIsNyBAQAogCWNyeXB0X2luZm8tPmNpX2N0Zm0gPSBjdGZtOwogCWNyeXB0b19za2NpcGhlcl9jbGVhcl9mbGFncyhjdGZtLCB+MCk7CiAJY3J5cHRvX3NrY2lwaGVyX3NldF9mbGFncyhjdGZtLCBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWSk7Ci0JcmVzID0gY3J5cHRvX3NrY2lwaGVyX3NldGtleShjdGZtLCByYXdfa2V5LCBmc2NyeXB0X2tleV9zaXplKG1vZGUpKTsKKwlyZXMgPSBjcnlwdG9fc2tjaXBoZXJfc2V0a2V5KGN0Zm0sIHJhd19rZXksIGtleXNpemUpOwogCWlmIChyZXMpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9mcy9jcnlwdG8vcG9saWN5LmMgYi9mcy9jcnlwdG8vcG9saWN5LmMKaW5kZXggMGY5OTYxZS4uZWQxMTVhYyAxMDA2NDQKLS0tIGEvZnMvY3J5cHRvL3BvbGljeS5jCisrKyBiL2ZzL2NyeXB0by9wb2xpY3kuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KIAogc3RhdGljIGludCBpbm9kZV9oYXNfZW5jcnlwdGlvbl9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CkBAIC05MiwyNiArOTMsNDIgQEAKIAlyZXR1cm4gaW5vZGUtPmlfc2ItPnNfY29wLT5zZXRfY29udGV4dChpbm9kZSwgJmN0eCwgc2l6ZW9mKGN0eCksIE5VTEwpOwogfQogCi1pbnQgZnNjcnlwdF9wcm9jZXNzX3BvbGljeShzdHJ1Y3QgaW5vZGUgKmlub2RlLAoraW50IGZzY3J5cHRfcHJvY2Vzc19wb2xpY3koc3RydWN0IGZpbGUgKmZpbHAsCiAJCQkJY29uc3Qgc3RydWN0IGZzY3J5cHRfcG9saWN5ICpwb2xpY3kpCiB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlscCk7CisJaW50IHJldDsKKworCWlmICghaW5vZGVfb3duZXJfb3JfY2FwYWJsZShpbm9kZSkpCisJCXJldHVybiAtRUFDQ0VTOworCiAJaWYgKHBvbGljeS0+dmVyc2lvbiAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCXJldCA9IG1udF93YW50X3dyaXRlX2ZpbGUoZmlscCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWlmICghaW5vZGVfaGFzX2VuY3J5cHRpb25fY29udGV4dChpbm9kZSkpIHsKLQkJaWYgKCFpbm9kZS0+aV9zYi0+c19jb3AtPmVtcHR5X2RpcikKLQkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQkJaWYgKCFpbm9kZS0+aV9zYi0+c19jb3AtPmVtcHR5X2Rpcihpbm9kZSkpCi0JCQlyZXR1cm4gLUVOT1RFTVBUWTsKLQkJcmV0dXJuIGNyZWF0ZV9lbmNyeXB0aW9uX2NvbnRleHRfZnJvbV9wb2xpY3koaW5vZGUsIHBvbGljeSk7CisJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWVsc2UgaWYgKCFpbm9kZS0+aV9zYi0+c19jb3AtPmVtcHR5X2RpcikKKwkJCXJldCA9IC1FT1BOT1RTVVBQOworCQllbHNlIGlmICghaW5vZGUtPmlfc2ItPnNfY29wLT5lbXB0eV9kaXIoaW5vZGUpKQorCQkJcmV0ID0gLUVOT1RFTVBUWTsKKwkJZWxzZQorCQkJcmV0ID0gY3JlYXRlX2VuY3J5cHRpb25fY29udGV4dF9mcm9tX3BvbGljeShpbm9kZSwKKwkJCQkJCQkJICAgIHBvbGljeSk7CisJfSBlbHNlIGlmICghaXNfZW5jcnlwdGlvbl9jb250ZXh0X2NvbnNpc3RlbnRfd2l0aF9wb2xpY3koaW5vZGUsCisJCQkJCQkJCSBwb2xpY3kpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICIlczogUG9saWN5IGluY29uc2lzdGVudCB3aXRoIGVuY3J5cHRpb24gY29udGV4dFxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0ID0gLUVJTlZBTDsKIAl9CiAKLQlpZiAoaXNfZW5jcnlwdGlvbl9jb250ZXh0X2NvbnNpc3RlbnRfd2l0aF9wb2xpY3koaW5vZGUsIHBvbGljeSkpCi0JCXJldHVybiAwOwotCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFBvbGljeSBpbmNvbnNpc3RlbnQgd2l0aCBlbmNyeXB0aW9uIGNvbnRleHRcbiIsCi0JICAgICAgIF9fZnVuY19fKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwltbnRfZHJvcF93cml0ZV9maWxlKGZpbHApOworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGZzY3J5cHRfcHJvY2Vzc19wb2xpY3kpOwogCmRpZmYgLS1naXQgYS9mcy9kYXguYyBiL2ZzL2RheC5jCmluZGV4IDk5M2RjNmYuLmNjMDI1ZjggMTAwNjQ0Ci0tLSBhL2ZzL2RheC5jCisrKyBiL2ZzL2RheC5jCkBAIC0zMSw2ICszMSw4IEBACiAjaW5jbHVkZSA8bGludXgvdm1zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGZuX3QuaD4KICNpbmNsdWRlIDxsaW51eC9zaXplcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvbWFwLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogLyoKICAqIFdlIHVzZSBsb3dlc3QgYXZhaWxhYmxlIGJpdCBpbiBleGNlcHRpb25hbCBlbnRyeSBmb3IgbG9ja2luZywgb3RoZXIgdHdvCkBAIC01ODAsMTQgKzU4MiwxMyBAQAogCXJldHVybiBWTV9GQVVMVF9MT0NLRUQ7CiB9CiAKLXN0YXRpYyBpbnQgY29weV91c2VyX2JoKHN0cnVjdCBwYWdlICp0bywgc3RydWN0IGlub2RlICppbm9kZSwKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdW5zaWduZWQgbG9uZyB2YWRkcikKK3N0YXRpYyBpbnQgY29weV91c2VyX2RheChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IsIHNpemVfdCBzaXplLAorCQlzdHJ1Y3QgcGFnZSAqdG8sIHVuc2lnbmVkIGxvbmcgdmFkZHIpCiB7CiAJc3RydWN0IGJsa19kYXhfY3RsIGRheCA9IHsKLQkJLnNlY3RvciA9IHRvX3NlY3RvcihiaCwgaW5vZGUpLAotCQkuc2l6ZSA9IGJoLT5iX3NpemUsCisJCS5zZWN0b3IgPSBzZWN0b3IsCisJCS5zaXplID0gc2l6ZSwKIAl9OwotCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBiaC0+Yl9iZGV2OwogCXZvaWQgKnZ0bzsKIAogCWlmIChkYXhfbWFwX2F0b21pYyhiZGV2LCAmZGF4KSA8IDApCkBAIC03OTAsMTQgKzc5MSwxMyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZGF4X3dyaXRlYmFja19tYXBwaW5nX3JhbmdlKTsKIAogc3RhdGljIGludCBkYXhfaW5zZXJ0X21hcHBpbmcoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB2b2lkICoqZW50cnlwLAotCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQorCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IsIHNpemVfdCBzaXplLAorCQl2b2lkICoqZW50cnlwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWRkciA9ICh1bnNpZ25lZCBsb25nKXZtZi0+dmlydHVhbF9hZGRyZXNzOwotCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBiaC0+Yl9iZGV2OwogCXN0cnVjdCBibGtfZGF4X2N0bCBkYXggPSB7Ci0JCS5zZWN0b3IgPSB0b19zZWN0b3IoYmgsIG1hcHBpbmctPmhvc3QpLAotCQkuc2l6ZSA9IGJoLT5iX3NpemUsCisJCS5zZWN0b3IgPSBzZWN0b3IsCisJCS5zaXplID0gc2l6ZSwKIAl9OwogCXZvaWQgKnJldDsKIAl2b2lkICplbnRyeSA9ICplbnRyeXA7CkBAIC04NjgsNyArODY4LDggQEAKIAlpZiAodm1mLT5jb3dfcGFnZSkgewogCQlzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2UgPSB2bWYtPmNvd19wYWdlOwogCQlpZiAoYnVmZmVyX3dyaXR0ZW4oJmJoKSkKLQkJCWVycm9yID0gY29weV91c2VyX2JoKG5ld19wYWdlLCBpbm9kZSwgJmJoLCB2YWRkcik7CisJCQllcnJvciA9IGNvcHlfdXNlcl9kYXgoYmguYl9iZGV2LCB0b19zZWN0b3IoJmJoLCBpbm9kZSksCisJCQkJCWJoLmJfc2l6ZSwgbmV3X3BhZ2UsIHZhZGRyKTsKIAkJZWxzZQogCQkJY2xlYXJfdXNlcl9oaWdocGFnZShuZXdfcGFnZSwgdmFkZHIpOwogCQlpZiAoZXJyb3IpCkBAIC04OTgsNyArODk5LDggQEAKIAogCS8qIEZpbGVzeXN0ZW0gc2hvdWxkIG5vdCByZXR1cm4gdW53cml0dGVuIGJ1ZmZlcnMgdG8gdXMhICovCiAJV0FSTl9PTl9PTkNFKGJ1ZmZlcl91bndyaXR0ZW4oJmJoKSB8fCBidWZmZXJfbmV3KCZiaCkpOwotCWVycm9yID0gZGF4X2luc2VydF9tYXBwaW5nKG1hcHBpbmcsICZiaCwgJmVudHJ5LCB2bWEsIHZtZik7CisJZXJyb3IgPSBkYXhfaW5zZXJ0X21hcHBpbmcobWFwcGluZywgYmguYl9iZGV2LCB0b19zZWN0b3IoJmJoLCBpbm9kZSksCisJCQliaC5iX3NpemUsICZlbnRyeSwgdm1hLCB2bWYpOwogIHVubG9ja19lbnRyeToKIAlwdXRfbG9ja2VkX21hcHBpbmdfZW50cnkobWFwcGluZywgdm1mLT5wZ29mZiwgZW50cnkpOwogIG91dDoKQEAgLTEyNDEsMyArMTI0MywyMjkgQEAKIAlyZXR1cm4gZGF4X3plcm9fcGFnZV9yYW5nZShpbm9kZSwgZnJvbSwgbGVuZ3RoLCBnZXRfYmxvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGF4X3RydW5jYXRlX3BhZ2UpOworCisjaWZkZWYgQ09ORklHX0ZTX0lPTUFQCitzdGF0aWMgbG9mZl90Citpb21hcF9kYXhfYWN0b3Ioc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgbG9mZl90IGxlbmd0aCwgdm9pZCAqZGF0YSwKKwkJc3RydWN0IGlvbWFwICppb21hcCkKK3sKKwlzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIgPSBkYXRhOworCWxvZmZfdCBlbmQgPSBwb3MgKyBsZW5ndGgsIGRvbmUgPSAwOworCXNzaXplX3QgcmV0ID0gMDsKKworCWlmIChpb3ZfaXRlcl9ydyhpdGVyKSA9PSBSRUFEKSB7CisJCWVuZCA9IG1pbihlbmQsIGlfc2l6ZV9yZWFkKGlub2RlKSk7CisJCWlmIChwb3MgPj0gZW5kKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGlvbWFwLT50eXBlID09IElPTUFQX0hPTEUgfHwgaW9tYXAtPnR5cGUgPT0gSU9NQVBfVU5XUklUVEVOKQorCQkJcmV0dXJuIGlvdl9pdGVyX3plcm8obWluKGxlbmd0aCwgZW5kIC0gcG9zKSwgaXRlcik7CisJfQorCisJaWYgKFdBUk5fT05fT05DRShpb21hcC0+dHlwZSAhPSBJT01BUF9NQVBQRUQpKQorCQlyZXR1cm4gLUVJTzsKKworCXdoaWxlIChwb3MgPCBlbmQpIHsKKwkJdW5zaWduZWQgb2Zmc2V0ID0gcG9zICYgKFBBR0VfU0laRSAtIDEpOworCQlzdHJ1Y3QgYmxrX2RheF9jdGwgZGF4ID0geyAwIH07CisJCXNzaXplX3QgbWFwX2xlbjsKKworCQlkYXguc2VjdG9yID0gaW9tYXAtPmJsa25vICsKKwkJCSgoKHBvcyAmIFBBR0VfTUFTSykgLSBpb21hcC0+b2Zmc2V0KSA+PiA5KTsKKwkJZGF4LnNpemUgPSAobGVuZ3RoICsgb2Zmc2V0ICsgUEFHRV9TSVpFIC0gMSkgJiBQQUdFX01BU0s7CisJCW1hcF9sZW4gPSBkYXhfbWFwX2F0b21pYyhpb21hcC0+YmRldiwgJmRheCk7CisJCWlmIChtYXBfbGVuIDwgMCkgeworCQkJcmV0ID0gbWFwX2xlbjsKKwkJCWJyZWFrOworCQl9CisKKwkJZGF4LmFkZHIgKz0gb2Zmc2V0OworCQltYXBfbGVuIC09IG9mZnNldDsKKwkJaWYgKG1hcF9sZW4gPiBlbmQgLSBwb3MpCisJCQltYXBfbGVuID0gZW5kIC0gcG9zOworCisJCWlmIChpb3ZfaXRlcl9ydyhpdGVyKSA9PSBXUklURSkKKwkJCW1hcF9sZW4gPSBjb3B5X2Zyb21faXRlcl9wbWVtKGRheC5hZGRyLCBtYXBfbGVuLCBpdGVyKTsKKwkJZWxzZQorCQkJbWFwX2xlbiA9IGNvcHlfdG9faXRlcihkYXguYWRkciwgbWFwX2xlbiwgaXRlcik7CisJCWRheF91bm1hcF9hdG9taWMoaW9tYXAtPmJkZXYsICZkYXgpOworCQlpZiAobWFwX2xlbiA8PSAwKSB7CisJCQlyZXQgPSBtYXBfbGVuID8gbWFwX2xlbiA6IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXBvcyArPSBtYXBfbGVuOworCQlsZW5ndGggLT0gbWFwX2xlbjsKKwkJZG9uZSArPSBtYXBfbGVuOworCX0KKworCXJldHVybiBkb25lID8gZG9uZSA6IHJldDsKK30KKworLyoqCisgKiBpb21hcF9kYXhfcncgLSBQZXJmb3JtIEkvTyB0byBhIERBWCBmaWxlCisgKiBAaW9jYjoJVGhlIGNvbnRyb2wgYmxvY2sgZm9yIHRoaXMgSS9PCisgKiBAaXRlcjoJVGhlIGFkZHJlc3NlcyB0byBkbyBJL08gZnJvbSBvciB0bworICogQG9wczoJaW9tYXAgb3BzIHBhc3NlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucyB0byBkaXJlY3RseSBtYXBwZWQKKyAqIHBlcnNpc3RlbnQgbWVtb3J5LiAgVGhlIGNhbGxlcnMgbmVlZHMgdG8gdGFrZSBjYXJlIG9mIHJlYWQvd3JpdGUgZXhjbHVzaW9uCisgKiBhbmQgZXZpY3RpbmcgYW55IHBhZ2UgY2FjaGUgcGFnZXMgaW4gdGhlIHJlZ2lvbiB1bmRlciBJL08uCisgKi8KK3NzaXplX3QKK2lvbWFwX2RheF9ydyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKKwkJc3RydWN0IGlvbWFwX29wcyAqb3BzKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW9jYi0+a2lfZmlscC0+Zl9tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCWxvZmZfdCBwb3MgPSBpb2NiLT5raV9wb3MsIHJldCA9IDAsIGRvbmUgPSAwOworCXVuc2lnbmVkIGZsYWdzID0gMDsKKworCWlmIChpb3ZfaXRlcl9ydyhpdGVyKSA9PSBXUklURSkKKwkJZmxhZ3MgfD0gSU9NQVBfV1JJVEU7CisKKwkvKgorCSAqIFllcywgZXZlbiBEQVggZmlsZXMgY2FuIGhhdmUgcGFnZSBjYWNoZSBhdHRhY2hlZCB0byB0aGVtOiAgQSB6ZXJvZWQKKwkgKiBwYWdlIGlzIGluc2VydGVkIGludG8gdGhlIHBhZ2VjYWNoZSB3aGVuIHdlIGhhdmUgdG8gc2VydmUgYSB3cml0ZQorCSAqIGZhdWx0IG9uIGEgaG9sZS4gIEl0IHNob3VsZCBuZXZlciBiZSBkaXJ0aWVkIGFuZCBjYW4gc2ltcGx5IGJlCisJICogZHJvcHBlZCBmcm9tIHRoZSBwYWdlY2FjaGUgb25jZSB3ZSBnZXQgcmVhbCBkYXRhIGZvciB0aGUgcGFnZS4KKwkgKgorCSAqIFhYWDogVGhpcyBpcyByYWN5IGFnYWluc3QgbW1hcCwgYW5kIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQKKwkgKiBpdC4gV2UnbGwgZXZlbnR1YWxseSBuZWVkIHRvIHNoaWZ0IHRoaXMgZG93biBldmVuIGZ1cnRoZXIgc28gdGhhdAorCSAqIHdlIGNhbiBjaGVjayBpZiB3ZSBhbGxvY2F0ZWQgYmxvY2tzIG92ZXIgYSBob2xlIGZpcnN0LgorCSAqLworCWlmIChtYXBwaW5nLT5ucnBhZ2VzKSB7CisJCXJldCA9IGludmFsaWRhdGVfaW5vZGVfcGFnZXMyX3JhbmdlKG1hcHBpbmcsCisJCQkJcG9zID4+IFBBR0VfU0hJRlQsCisJCQkJKHBvcyArIGlvdl9pdGVyX2NvdW50KGl0ZXIpIC0gMSkgPj4gUEFHRV9TSElGVCk7CisJCVdBUk5fT05fT05DRShyZXQpOworCX0KKworCXdoaWxlIChpb3ZfaXRlcl9jb3VudChpdGVyKSkgeworCQlyZXQgPSBpb21hcF9hcHBseShpbm9kZSwgcG9zLCBpb3ZfaXRlcl9jb3VudChpdGVyKSwgZmxhZ3MsIG9wcywKKwkJCQlpdGVyLCBpb21hcF9kYXhfYWN0b3IpOworCQlpZiAocmV0IDw9IDApCisJCQlicmVhazsKKwkJcG9zICs9IHJldDsKKwkJZG9uZSArPSByZXQ7CisJfQorCisJaW9jYi0+a2lfcG9zICs9IGRvbmU7CisJcmV0dXJuIGRvbmUgPyBkb25lIDogcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW9tYXBfZGF4X3J3KTsKKworLyoqCisgKiBpb21hcF9kYXhfZmF1bHQgLSBoYW5kbGUgYSBwYWdlIGZhdWx0IG9uIGEgREFYIGZpbGUKKyAqIEB2bWE6IFRoZSB2aXJ0dWFsIG1lbW9yeSBhcmVhIHdoZXJlIHRoZSBmYXVsdCBvY2N1cnJlZAorICogQHZtZjogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmYXVsdAorICogQG9wczogaW9tYXAgb3BzIHBhc3NlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbQorICoKKyAqIFdoZW4gYSBwYWdlIGZhdWx0IG9jY3VycywgZmlsZXN5c3RlbXMgbWF5IGNhbGwgdGhpcyBoZWxwZXIgaW4gdGhlaXIgZmF1bHQKKyAqIG9yIG1rd3JpdGUgaGFuZGxlciBmb3IgREFYIGZpbGVzLiBBc3N1bWVzIHRoZSBjYWxsZXIgaGFzIGRvbmUgYWxsIHRoZQorICogbmVjZXNzYXJ5IGxvY2tpbmcgZm9yIHRoZSBwYWdlIGZhdWx0IHRvIHByb2NlZWQgc3VjY2Vzc2Z1bGx5LgorICovCitpbnQgaW9tYXBfZGF4X2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwKKwkJCXN0cnVjdCBpb21hcF9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHZtYS0+dm1fZmlsZS0+Zl9tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSAodW5zaWduZWQgbG9uZyl2bWYtPnZpcnR1YWxfYWRkcmVzczsKKwlsb2ZmX3QgcG9zID0gKGxvZmZfdCl2bWYtPnBnb2ZmIDw8IFBBR0VfU0hJRlQ7CisJc2VjdG9yX3Qgc2VjdG9yOworCXN0cnVjdCBpb21hcCBpb21hcCA9IHsgMCB9OworCXVuc2lnbmVkIGZsYWdzID0gMDsKKwlpbnQgZXJyb3IsIG1ham9yID0gMDsKKwl2b2lkICplbnRyeTsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciBvZmZzZXQgaXNuJ3QgYmV5b25kIGVuZCBvZiBmaWxlIG5vdy4gQ2FsbGVyIGlzIHN1cHBvc2VkCisJICogdG8gaG9sZCBsb2NrcyBzZXJpYWxpemluZyB1cyB3aXRoIHRydW5jYXRlIC8gcHVuY2ggaG9sZSBzbyB0aGlzIGlzCisJICogYSByZWxpYWJsZSB0ZXN0LgorCSAqLworCWlmIChwb3MgPj0gaV9zaXplX3JlYWQoaW5vZGUpKQorCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOworCisJZW50cnkgPSBncmFiX21hcHBpbmdfZW50cnkobWFwcGluZywgdm1mLT5wZ29mZik7CisJaWYgKElTX0VSUihlbnRyeSkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKGVudHJ5KTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCh2bWYtPmZsYWdzICYgRkFVTFRfRkxBR19XUklURSkgJiYgIXZtZi0+Y293X3BhZ2UpCisJCWZsYWdzIHw9IElPTUFQX1dSSVRFOworCisJLyoKKwkgKiBOb3RlIHRoYXQgd2UgZG9uJ3QgYm90aGVyIHRvIHVzZSBpb21hcF9hcHBseSBoZXJlOiBEQVggcmVxdWlyZWQKKwkgKiB0aGUgZmlsZSBzeXN0ZW0gYmxvY2sgc2l6ZSB0byBiZSBlcXVhbCB0aGUgcGFnZSBzaXplLCB3aGljaCBtZWFucworCSAqIHRoYXQgd2UgbmV2ZXIgaGF2ZSB0byBkZWFsIHdpdGggbW9yZSB0aGFuIGEgc2luZ2xlIGV4dGVudCBoZXJlLgorCSAqLworCWVycm9yID0gb3BzLT5pb21hcF9iZWdpbihpbm9kZSwgcG9zLCBQQUdFX1NJWkUsIGZsYWdzLCAmaW9tYXApOworCWlmIChlcnJvcikKKwkJZ290byB1bmxvY2tfZW50cnk7CisJaWYgKFdBUk5fT05fT05DRShpb21hcC5vZmZzZXQgKyBpb21hcC5sZW5ndGggPCBwb3MgKyBQQUdFX1NJWkUpKSB7CisJCWVycm9yID0gLUVJTzsJCS8qIGZzIGNvcnJ1cHRpb24/ICovCisJCWdvdG8gdW5sb2NrX2VudHJ5OworCX0KKworCXNlY3RvciA9IGlvbWFwLmJsa25vICsgKCgocG9zICYgUEFHRV9NQVNLKSAtIGlvbWFwLm9mZnNldCkgPj4gOSk7CisKKwlpZiAodm1mLT5jb3dfcGFnZSkgeworCQlzd2l0Y2ggKGlvbWFwLnR5cGUpIHsKKwkJY2FzZSBJT01BUF9IT0xFOgorCQljYXNlIElPTUFQX1VOV1JJVFRFTjoKKwkJCWNsZWFyX3VzZXJfaGlnaHBhZ2Uodm1mLT5jb3dfcGFnZSwgdmFkZHIpOworCQkJYnJlYWs7CisJCWNhc2UgSU9NQVBfTUFQUEVEOgorCQkJZXJyb3IgPSBjb3B5X3VzZXJfZGF4KGlvbWFwLmJkZXYsIHNlY3RvciwgUEFHRV9TSVpFLAorCQkJCQl2bWYtPmNvd19wYWdlLCB2YWRkcik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVdBUk5fT05fT05DRSgxKTsKKwkJCWVycm9yID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGVycm9yKQorCQkJZ290byB1bmxvY2tfZW50cnk7CisJCWlmICghcmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShlbnRyeSkpIHsKKwkJCXZtZi0+cGFnZSA9IGVudHJ5OworCQkJcmV0dXJuIFZNX0ZBVUxUX0xPQ0tFRDsKKwkJfQorCQl2bWYtPmVudHJ5ID0gZW50cnk7CisJCXJldHVybiBWTV9GQVVMVF9EQVhfTE9DS0VEOworCX0KKworCXN3aXRjaCAoaW9tYXAudHlwZSkgeworCWNhc2UgSU9NQVBfTUFQUEVEOgorCQlpZiAoaW9tYXAuZmxhZ3MgJiBJT01BUF9GX05FVykgeworCQkJY291bnRfdm1fZXZlbnQoUEdNQUpGQVVMVCk7CisJCQltZW1fY2dyb3VwX2NvdW50X3ZtX2V2ZW50KHZtYS0+dm1fbW0sIFBHTUFKRkFVTFQpOworCQkJbWFqb3IgPSBWTV9GQVVMVF9NQUpPUjsKKwkJfQorCQllcnJvciA9IGRheF9pbnNlcnRfbWFwcGluZyhtYXBwaW5nLCBpb21hcC5iZGV2LCBzZWN0b3IsCisJCQkJUEFHRV9TSVpFLCAmZW50cnksIHZtYSwgdm1mKTsKKwkJYnJlYWs7CisJY2FzZSBJT01BUF9VTldSSVRURU46CisJY2FzZSBJT01BUF9IT0xFOgorCQlpZiAoISh2bWYtPmZsYWdzICYgRkFVTFRfRkxBR19XUklURSkpCisJCQlyZXR1cm4gZGF4X2xvYWRfaG9sZShtYXBwaW5nLCBlbnRyeSwgdm1mKTsKKwkJLypGQUxMVEhSVSovCisJZGVmYXVsdDoKKwkJV0FSTl9PTl9PTkNFKDEpOworCQllcnJvciA9IC1FSU87CisJCWJyZWFrOworCX0KKworIHVubG9ja19lbnRyeToKKwlwdXRfbG9ja2VkX21hcHBpbmdfZW50cnkobWFwcGluZywgdm1mLT5wZ29mZiwgZW50cnkpOworIG91dDoKKwlpZiAoZXJyb3IgPT0gLUVOT01FTSkKKwkJcmV0dXJuIFZNX0ZBVUxUX09PTSB8IG1ham9yOworCS8qIC1FQlVTWSBpcyBmaW5lLCBzb21lYm9keSBlbHNlIGZhdWx0ZWQgb24gdGhlIHNhbWUgUFRFICovCisJaWYgKGVycm9yIDwgMCAmJiBlcnJvciAhPSAtRUJVU1kpCisJCXJldHVybiBWTV9GQVVMVF9TSUdCVVMgfCBtYWpvcjsKKwlyZXR1cm4gVk1fRkFVTFRfTk9QQUdFIHwgbWFqb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpb21hcF9kYXhfZmF1bHQpOworI2VuZGlmIC8qIENPTkZJR19GU19JT01BUCAqLwpkaWZmIC0tZ2l0IGEvZnMvZGVidWdmcy9maWxlLmMgYi9mcy9kZWJ1Z2ZzL2ZpbGUuYwppbmRleCA1OTIwNTlmLi4zNTRlMmFiIDEwMDY0NAotLS0gYS9mcy9kZWJ1Z2ZzL2ZpbGUuYworKysgYi9mcy9kZWJ1Z2ZzL2ZpbGUuYwpAQCAtOTcsOSArOTcsNiBAQAogCiAjZGVmaW5lIEZfREVOVFJZKGZpbHApICgoZmlscCktPmZfcGF0aC5kZW50cnkpCiAKLSNkZWZpbmUgUkVBTF9GT1BTX0RFUkVGKGRlbnRyeSkJCQkJCVwKLQkoKGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKikoZGVudHJ5KS0+ZF9mc2RhdGEpCi0KIHN0YXRpYyBpbnQgb3Blbl9wcm94eV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IEZfREVOVFJZKGZpbHApOwpAQCAtMTEyLDcgKzEwOSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJlYWxfZm9wcyA9IFJFQUxfRk9QU19ERVJFRihkZW50cnkpOworCXJlYWxfZm9wcyA9IGRlYnVnZnNfcmVhbF9mb3BzKGZpbHApOwogCXJlYWxfZm9wcyA9IGZvcHNfZ2V0KHJlYWxfZm9wcyk7CiAJaWYgKCFyZWFsX2ZvcHMpIHsKIAkJLyogSHVoPyBNb2R1bGUgZGlkIG5vdCBjbGVhbiB1cCBhZnRlciBpdHNlbGYgYXQgZXhpdD8gKi8KQEAgLTE0Myw3ICsxNDAsNyBAQAogewkJCQkJCQkJCVwKIAljb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBGX0RFTlRSWShmaWxwKTsJCQlcCiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcmVhbF9mb3BzID0JCQlcCi0JCVJFQUxfRk9QU19ERVJFRihkZW50cnkpOwkJCQlcCisJCWRlYnVnZnNfcmVhbF9mb3BzKGZpbHApOwkJCQlcCiAJaW50IHNyY3VfaWR4OwkJCQkJCQlcCiAJcmV0X3R5cGUgcjsJCQkJCQkJXAogCQkJCQkJCQkJXApAQCAtMTc2LDcgKzE3Myw3IEBACiAJCQkJc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQogewogCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IEZfREVOVFJZKGZpbHApOwotCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnJlYWxfZm9wcyA9IFJFQUxfRk9QU19ERVJFRihkZW50cnkpOworCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnJlYWxfZm9wcyA9IGRlYnVnZnNfcmVhbF9mb3BzKGZpbHApOwogCWludCBzcmN1X2lkeDsKIAl1bnNpZ25lZCBpbnQgciA9IDA7CiAKQEAgLTE5Myw3ICsxOTAsNyBAQAogc3RhdGljIGludCBmdWxsX3Byb3h5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gRl9ERU5UUlkoZmlscCk7Ci0JY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcmVhbF9mb3BzID0gUkVBTF9GT1BTX0RFUkVGKGRlbnRyeSk7CisJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcmVhbF9mb3BzID0gZGVidWdmc19yZWFsX2ZvcHMoZmlscCk7CiAJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqcHJveHlfZm9wcyA9IGZpbHAtPmZfb3A7CiAJaW50IHIgPSAwOwogCkBAIC0yMDksNyArMjA2LDcgQEAKIAlyZXBsYWNlX2ZvcHMoZmlscCwgZF9pbm9kZShkZW50cnkpLT5pX2ZvcCk7CiAJa2ZyZWUoKHZvaWQgKilwcm94eV9mb3BzKTsKIAlmb3BzX3B1dChyZWFsX2ZvcHMpOwotCXJldHVybiAwOworCXJldHVybiByOwogfQogCiBzdGF0aWMgdm9pZCBfX2Z1bGxfcHJveHlfZm9wc19pbml0KHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKnByb3h5X2ZvcHMsCkBAIC0yNDEsNyArMjM4LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcmVhbF9mb3BzID0gUkVBTF9GT1BTX0RFUkVGKGRlbnRyeSk7CisJcmVhbF9mb3BzID0gZGVidWdmc19yZWFsX2ZvcHMoZmlscCk7CiAJcmVhbF9mb3BzID0gZm9wc19nZXQocmVhbF9mb3BzKTsKIAlpZiAoIXJlYWxfZm9wcykgewogCQkvKiBIdWg/IE1vZHVsZSBkaWQgbm90IGNsZWFudXAgYWZ0ZXIgaXRzZWxmIGF0IGV4aXQ/ICovCmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL2ludGVybmFsLmggYi9mcy9kZWJ1Z2ZzL2ludGVybmFsLmgKaW5kZXggYmJhNTI2My4uYjNlODQ0MyAxMDA2NDQKLS0tIGEvZnMvZGVidWdmcy9pbnRlcm5hbC5oCisrKyBiL2ZzL2RlYnVnZnMvaW50ZXJuYWwuaApAQCAtMTksOCArMTksNCBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdmc19vcGVuX3Byb3h5X2ZpbGVfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfZnVsbF9wcm94eV9maWxlX29wZXJhdGlvbnM7CiAKLXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX2ZpbGVfdW5zYWZlKGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwKLQkJCQkJc3RydWN0IGRlbnRyeSAqcGFyZW50LCB2b2lkICpkYXRhLAotCQkJCQljb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKTsKLQogI2VuZGlmIC8qIF9ERUJVR0ZTX0lOVEVSTkFMX0hfICovCmRpZmYgLS1naXQgYS9mcy9kZXZwdHMvaW5vZGUuYyBiL2ZzL2RldnB0cy9pbm9kZS5jCmluZGV4IGQxMTY0NTMuLjQ0MmQxYTcgMTAwNjQ0Ci0tLSBhL2ZzL2RldnB0cy9pbm9kZS5jCisrKyBiL2ZzL2RldnB0cy9pbm9kZS5jCkBAIC0yNzIsMTMgKzI3Miw4IEBACiAJc3RydWN0IGRlbnRyeSAqcm9vdCA9IHNiLT5zX3Jvb3Q7CiAJc3RydWN0IHB0c19mc19pbmZvICpmc2kgPSBERVZQVFNfU0Ioc2IpOwogCXN0cnVjdCBwdHNfbW91bnRfb3B0cyAqb3B0cyA9ICZmc2ktPm1vdW50X29wdHM7Ci0Ja3VpZF90IHJvb3RfdWlkOwotCWtnaWRfdCByb290X2dpZDsKLQotCXJvb3RfdWlkID0gbWFrZV9rdWlkKGN1cnJlbnRfdXNlcl9ucygpLCAwKTsKLQlyb290X2dpZCA9IG1ha2Vfa2dpZChjdXJyZW50X3VzZXJfbnMoKSwgMCk7Ci0JaWYgKCF1aWRfdmFsaWQocm9vdF91aWQpIHx8ICFnaWRfdmFsaWQocm9vdF9naWQpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlrdWlkX3QgcHRteF91aWQgPSBjdXJyZW50X2ZzdWlkKCk7CisJa2dpZF90IHB0bXhfZ2lkID0gY3VycmVudF9mc2dpZCgpOwogCiAJaW5vZGVfbG9jayhkX2lub2RlKHJvb3QpKTsKIApAQCAtMzA5LDggKzMwNCw4IEBACiAKIAltb2RlID0gU19JRkNIUnxvcHRzLT5wdG14bW9kZTsKIAlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIG1vZGUsIE1LREVWKFRUWUFVWF9NQUpPUiwgMikpOwotCWlub2RlLT5pX3VpZCA9IHJvb3RfdWlkOwotCWlub2RlLT5pX2dpZCA9IHJvb3RfZ2lkOworCWlub2RlLT5pX3VpZCA9IHB0bXhfdWlkOworCWlub2RlLT5pX2dpZCA9IHB0bXhfZ2lkOwogCiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAKQEAgLTMzNiw3ICszMzEsNiBAQAogCXN0cnVjdCBwdHNfZnNfaW5mbyAqZnNpID0gREVWUFRTX1NCKHNiKTsKIAlzdHJ1Y3QgcHRzX21vdW50X29wdHMgKm9wdHMgPSAmZnNpLT5tb3VudF9vcHRzOwogCi0Jc3luY19maWxlc3lzdGVtKHNiKTsKIAllcnIgPSBwYXJzZV9tb3VudF9vcHRpb25zKGRhdGEsIFBBUlNFX1JFTU9VTlQsIG9wdHMpOwogCiAJLyoKQEAgLTM5NSw2ICszODksNyBAQAogZGV2cHRzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycm9yOwogCiAJcy0+c19pZmxhZ3MgJj0gflNCX0lfTk9ERVY7CiAJcy0+c19ibG9ja3NpemUgPSAxMDI0OwpAQCAtNDAzLDEwICszOTgsMTYgQEAKIAlzLT5zX29wID0gJmRldnB0c19zb3BzOwogCXMtPnNfdGltZV9ncmFuID0gMTsKIAorCWVycm9yID0gLUVOT01FTTsKIAlzLT5zX2ZzX2luZm8gPSBuZXdfcHRzX2ZzX2luZm8ocyk7CiAJaWYgKCFzLT5zX2ZzX2luZm8pCiAJCWdvdG8gZmFpbDsKIAorCWVycm9yID0gcGFyc2VfbW91bnRfb3B0aW9ucyhkYXRhLCBQQVJTRV9NT1VOVCwgJkRFVlBUU19TQihzKS0+bW91bnRfb3B0cyk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CisKKwllcnJvciA9IC1FTk9NRU07CiAJaW5vZGUgPSBuZXdfaW5vZGUocyk7CiAJaWYgKCFpbm9kZSkKIAkJZ290byBmYWlsOwpAQCAtNDE4LDEzICs0MTksMjEgQEAKIAlzZXRfbmxpbmsoaW5vZGUsIDIpOwogCiAJcy0+c19yb290ID0gZF9tYWtlX3Jvb3QoaW5vZGUpOwotCWlmIChzLT5zX3Jvb3QpCi0JCXJldHVybiAwOworCWlmICghcy0+c19yb290KSB7CisJCXByX2VycigiZ2V0IHJvb3QgZGVudHJ5IGZhaWxlZFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CiAKLQlwcl9lcnIoImdldCByb290IGRlbnRyeSBmYWlsZWRcbiIpOworCWVycm9yID0gbWtub2RfcHRteChzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF9kcHV0OwogCisJcmV0dXJuIDA7CitmYWlsX2RwdXQ6CisJZHB1dChzLT5zX3Jvb3QpOworCXMtPnNfcm9vdCA9IE5VTEw7CiBmYWlsOgotCXJldHVybiAtRU5PTUVNOworCXJldHVybiBlcnJvcjsKIH0KIAogLyoKQEAgLTQzNiw0MyArNDQ1LDE1IEBACiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGV2cHRzX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCiB7Ci0JaW50IGVycm9yOwotCXN0cnVjdCBwdHNfbW91bnRfb3B0cyBvcHRzOwotCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKLQotCWVycm9yID0gcGFyc2VfbW91bnRfb3B0aW9ucyhkYXRhLCBQQVJTRV9NT1VOVCwgJm9wdHMpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwotCi0JcyA9IHNnZXQoZnNfdHlwZSwgTlVMTCwgc2V0X2Fub25fc3VwZXIsIGZsYWdzLCBOVUxMKTsKLQlpZiAoSVNfRVJSKHMpKQotCQlyZXR1cm4gRVJSX0NBU1Qocyk7Ci0KLQlpZiAoIXMtPnNfcm9vdCkgewotCQllcnJvciA9IGRldnB0c19maWxsX3N1cGVyKHMsIGRhdGEsIGZsYWdzICYgTVNfU0lMRU5UID8gMSA6IDApOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dF91bmRvX3NnZXQ7Ci0JCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwotCX0KLQotCW1lbWNweSgmKERFVlBUU19TQihzKSktPm1vdW50X29wdHMsICZvcHRzLCBzaXplb2Yob3B0cykpOwotCi0JZXJyb3IgPSBta25vZF9wdG14KHMpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfdW5kb19zZ2V0OwotCi0JcmV0dXJuIGRnZXQocy0+c19yb290KTsKLQotb3V0X3VuZG9fc2dldDoKLQlkZWFjdGl2YXRlX2xvY2tlZF9zdXBlcihzKTsKLQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJcmV0dXJuIG1vdW50X25vZGV2KGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBkZXZwdHNfZmlsbF9zdXBlcik7CiB9CiAKIHN0YXRpYyB2b2lkIGRldnB0c19raWxsX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IHB0c19mc19pbmZvICpmc2kgPSBERVZQVFNfU0Ioc2IpOwogCi0JaWRhX2Rlc3Ryb3koJmZzaS0+YWxsb2NhdGVkX3B0eXMpOworCWlmIChmc2kpCisJCWlkYV9kZXN0cm95KCZmc2ktPmFsbG9jYXRlZF9wdHlzKTsKIAlrZnJlZShmc2kpOwogCWtpbGxfbGl0dGVyX3N1cGVyKHNiKTsKIH0KQEAgLTU4NSw3ICs1NjYsOCBAQAogICovCiB2b2lkICpkZXZwdHNfZ2V0X3ByaXYoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewotCVdBUk5fT05fT05DRShkZW50cnktPmRfc2ItPnNfbWFnaWMgIT0gREVWUFRTX1NVUEVSX01BR0lDKTsKKwlpZiAoZGVudHJ5LT5kX3NiLT5zX21hZ2ljICE9IERFVlBUU19TVVBFUl9NQUdJQykKKwkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuIGRlbnRyeS0+ZF9mc2RhdGE7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2RpcmVjdC1pby5jIGIvZnMvZGlyZWN0LWlvLmMKaW5kZXggN2MzY2U3My4uZmI5YWExNiAxMDA2NDQKLS0tIGEvZnMvZGlyZWN0LWlvLmMKKysrIGIvZnMvZGlyZWN0LWlvLmMKQEAgLTI0Niw2ICsyNDYsOSBAQAogCQlpZiAoKGRpby0+b3AgPT0gUkVRX09QX1JFQUQpICYmCiAJCSAgICAoKG9mZnNldCArIHRyYW5zZmVycmVkKSA+IGRpby0+aV9zaXplKSkKIAkJCXRyYW5zZmVycmVkID0gZGlvLT5pX3NpemUgLSBvZmZzZXQ7CisJCS8qIGlnbm9yZSBFRkFVTFQgaWYgc29tZSBJTyBoYXMgYmVlbiBkb25lICovCisJCWlmICh1bmxpa2VseShyZXQgPT0gLUVGQVVMVCkgJiYgdHJhbnNmZXJyZWQpCisJCQlyZXQgPSAwOwogCX0KIAogCWlmIChyZXQgPT0gMCkKZGlmZiAtLWdpdCBhL2ZzL2VmaXZhcmZzL2lub2RlLmMgYi9mcy9lZml2YXJmcy9pbm9kZS5jCmluZGV4IDFkNzNmYzYuLmNiYjUwY2EgMTAwNjQ0Ci0tLSBhL2ZzL2VmaXZhcmZzL2lub2RlLmMKKysrIGIvZnMvZWZpdmFyZnMvaW5vZGUuYwpAQCAtMTA1LDcgKzEwNSwxMCBAQAogCiAJaW5vZGUtPmlfcHJpdmF0ZSA9IHZhcjsKIAotCWVmaXZhcl9lbnRyeV9hZGQodmFyLCAmZWZpdmFyZnNfbGlzdCk7CisJZXJyID0gZWZpdmFyX2VudHJ5X2FkZCh2YXIsICZlZml2YXJmc19saXN0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJZGdldChkZW50cnkpOwogb3V0OgpkaWZmIC0tZ2l0IGEvZnMvZWZpdmFyZnMvc3VwZXIuYyBiL2ZzL2VmaXZhcmZzL3N1cGVyLmMKaW5kZXggNjg4Y2NjMS4uZDdhN2M1MyAxMDA2NDQKLS0tIGEvZnMvZWZpdmFyZnMvc3VwZXIuYworKysgYi9mcy9lZml2YXJmcy9zdXBlci5jCkBAIC0xNTcsMTIgKzE1NywxNCBAQAogCQlnb3RvIGZhaWxfaW5vZGU7CiAJfQogCisJZWZpdmFyX2VudHJ5X3NpemUoZW50cnksICZzaXplKTsKKwllcnIgPSBlZml2YXJfZW50cnlfYWRkKGVudHJ5LCAmZWZpdmFyZnNfbGlzdCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX2lub2RlOworCiAJLyogY29waWVkIGJ5IHRoZSBhYm92ZSB0byBsb2NhbCBzdG9yYWdlIGluIHRoZSBkZW50cnkuICovCiAJa2ZyZWUobmFtZSk7CiAKLQllZml2YXJfZW50cnlfc2l6ZShlbnRyeSwgJnNpemUpOwotCWVmaXZhcl9lbnRyeV9hZGQoZW50cnksICZlZml2YXJmc19saXN0KTsKLQogCWlub2RlX2xvY2soaW5vZGUpOwogCWlub2RlLT5pX3ByaXZhdGUgPSBlbnRyeTsKIAlpX3NpemVfd3JpdGUoaW5vZGUsIHNpemUgKyBzaXplb2YoZW50cnktPnZhci5BdHRyaWJ1dGVzKSk7CkBAIC0xODIsNyArMTg0LDEwIEBACiAKIHN0YXRpYyBpbnQgZWZpdmFyZnNfZGVzdHJveShzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgdm9pZCAqZGF0YSkKIHsKLQllZml2YXJfZW50cnlfcmVtb3ZlKGVudHJ5KTsKKwlpbnQgZXJyID0gZWZpdmFyX2VudHJ5X3JlbW92ZShlbnRyeSk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCWtmcmVlKGVudHJ5KTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvS2NvbmZpZyBiL2ZzL2V4dDIvS2NvbmZpZwppbmRleCBjNjM0ODc0ZS4uMzZiZWE1YSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9LY29uZmlnCisrKyBiL2ZzL2V4dDIvS2NvbmZpZwpAQCAtMSw1ICsxLDYgQEAKIGNvbmZpZyBFWFQyX0ZTCiAJdHJpc3RhdGUgIlNlY29uZCBleHRlbmRlZCBmcyBzdXBwb3J0IgorCXNlbGVjdCBGU19JT01BUCBpZiBGU19EQVgKIAloZWxwCiAJICBFeHQyIGlzIGEgc3RhbmRhcmQgTGludXggZmlsZSBzeXN0ZW0gZm9yIGhhcmQgZGlza3MuCiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZXh0Mi5oIGIvZnMvZXh0Mi9leHQyLmgKaW5kZXggMDZhZjJmOS4uMzdlMmJlNyAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9leHQyLmgKKysrIGIvZnMvZXh0Mi9leHQyLmgKQEAgLTgxNCw2ICs4MTQsNyBAQAogLyogaW5vZGUuYyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9hb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9ub2JoX2FvcHM7CitleHRlcm4gc3RydWN0IGlvbWFwX29wcyBleHQyX2lvbWFwX29wczsKIAogLyogbmFtZWkuYyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfZGlyX2lub2RlX29wZXJhdGlvbnM7CmRpZmYgLS1naXQgYS9mcy9leHQyL2ZpbGUuYyBiL2ZzL2V4dDIvZmlsZS5jCmluZGV4IDVlZmVlZmUuLjQyM2NjMDEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZmlsZS5jCisrKyBiL2ZzL2V4dDIvZmlsZS5jCkBAIC0yMiwxMSArMjIsNTkgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+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+a2lfcG9zOwogCXNzaXplX3QgcmV0OwogCi0JaWYgKElTX0RBWChpbm9kZSkpCi0JCXJldCA9IGRheF9kb19pbyhpb2NiLCBpbm9kZSwgaXRlciwgZXh0Ml9nZXRfYmxvY2ssIE5VTEwsCi0JCQkJRElPX0xPQ0tJTkcpOwotCWVsc2UKLQkJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKGlvY2IsIGlub2RlLCBpdGVyLCBleHQyX2dldF9ibG9jayk7CisJaWYgKFdBUk5fT05fT05DRShJU19EQVgoaW5vZGUpKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8oaW9jYiwgaW5vZGUsIGl0ZXIsIGV4dDJfZ2V0X2Jsb2NrKTsKIAlpZiAocmV0IDwgMCAmJiBpb3ZfaXRlcl9ydyhpdGVyKSA9PSBXUklURSkKIAkJZXh0Ml93cml0ZV9mYWlsZWQobWFwcGluZywgb2Zmc2V0ICsgY291bnQpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2Rpci5jIGIvZnMvZXh0NC9kaXIuYwppbmRleCA2NzQxNWUwLi5lOGIzNjUwIDEwMDY0NAotLS0gYS9mcy9leHQ0L2Rpci5jCisrKyBiL2ZzL2V4dDQvZGlyLmMKQEAgLTI2MCwxMSArMjYwLDEyIEBACiAJCQkJCS8qIERpcmVjdG9yeSBpcyBlbmNyeXB0ZWQgKi8KIAkJCQkJZXJyID0gZnNjcnlwdF9mbmFtZV9kaXNrX3RvX3Vzcihpbm9kZSwKIAkJCQkJCTAsIDAsICZkZV9uYW1lLCAmZnN0cik7CisJCQkJCWRlX25hbWUgPSBmc3RyOwogCQkJCQlmc3RyLmxlbiA9IHNhdmVfbGVuOwotCQkJCQlpZiAoZXJyIDwgMCkKKwkJCQkJaWYgKGVycikKIAkJCQkJCWdvdG8gZXJyb3V0OwogCQkJCQlpZiAoIWRpcl9lbWl0KGN0eCwKLQkJCQkJICAgIGZzdHIubmFtZSwgZXJyLAorCQkJCQkgICAgZGVfbmFtZS5uYW1lLCBkZV9uYW1lLmxlbiwKIAkJCQkJICAgIGxlMzJfdG9fY3B1KGRlLT5pbm9kZSksCiAJCQkJCSAgICBnZXRfZHR5cGUoc2IsIGRlLT5maWxlX3R5cGUpKSkKIAkJCQkJCWdvdG8gZG9uZTsKQEAgLTYyNyw3ICs2MjgsNyBAQAogCQkgICAgICBpbnQgYnVmX3NpemUpCiB7CiAJc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKmRlOwotCWludCBubGVuLCBybGVuOworCWludCBybGVuOwogCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwogCWNoYXIgKnRvcDsKIApAQCAtNjM3LDcgKzYzOCw2IEBACiAJCWlmIChleHQ0X2NoZWNrX2Rpcl9lbnRyeShkaXIsIE5VTEwsIGRlLCBiaCwKIAkJCQkJIGJ1ZiwgYnVmX3NpemUsIG9mZnNldCkpCiAJCQlyZXR1cm4gLUVGU0NPUlJVUFRFRDsKLQkJbmxlbiA9IEVYVDRfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKIAkJcmxlbiA9IGV4dDRfcmVjX2xlbl9mcm9tX2Rpc2soZGUtPnJlY19sZW4sIGJ1Zl9zaXplKTsKIAkJZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikoKGNoYXIgKilkZSArIHJsZW4pOwogCQlvZmZzZXQgKz0gcmxlbjsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NC5oIGIvZnMvZXh0NC9leHQ0LmgKaW5kZXggZWEzMTkzMS4uMjgyYTUxYiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0LmgKKysrIGIvZnMvZXh0NC9leHQ0LmgKQEAgLTI2Miw2ICsyNjIsOSBAQAogCQkJCSAocyktPnNfZmlyc3RfaW5vKQogI2VuZGlmCiAjZGVmaW5lIEVYVDRfQkxPQ0tfQUxJR04oc2l6ZSwgYmxrYml0cykJCUFMSUdOKChzaXplKSwgKDEgPDwgKGJsa2JpdHMpKSkKKyNkZWZpbmUgRVhUNF9NQVhfQkxPQ0tTKHNpemUsIG9mZnNldCwgYmxrYml0cykgXAorCSgoRVhUNF9CTE9DS19BTElHTihzaXplICsgb2Zmc2V0LCBibGtiaXRzKSA+PiBibGtiaXRzKSAtIChvZmZzZXQgPj4gXAorCQkJCQkJCQkgIGJsa2JpdHMpKQogCiAvKiBUcmFuc2xhdGUgYSBibG9jayBudW1iZXIgdG8gYSBjbHVzdGVyIG51bWJlciAqLwogI2RlZmluZSBFWFQ0X0IyQyhzYmksIGJsaykJKChibGspID4+IChzYmkpLT5zX2NsdXN0ZXJfYml0cykKQEAgLTExMTcsOSArMTEyMCwxNSBAQAogI2RlZmluZSBFWFQ0X01PVU5UX1BPU0lYX0FDTAkJMHgwODAwMAkvKiBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAqLwogI2RlZmluZSBFWFQ0X01PVU5UX05PX0FVVE9fREFfQUxMT0MJMHgxMDAwMAkvKiBObyBhdXRvIGRlbGFsbG9jIG1hcHBpbmcgKi8KICNkZWZpbmUgRVhUNF9NT1VOVF9CQVJSSUVSCQkweDIwMDAwIC8qIFVzZSBibG9jayBiYXJyaWVycyAqLwotI2RlZmluZSBFWFQ0X01PVU5UX1FVT1RBCQkweDgwMDAwIC8qIFNvbWUgcXVvdGEgb3B0aW9uIHNldCAqLwotI2RlZmluZSBFWFQ0X01PVU5UX1VTUlFVT1RBCQkweDEwMDAwMCAvKiAib2xkIiB1c2VyIHF1b3RhICovCi0jZGVmaW5lIEVYVDRfTU9VTlRfR1JQUVVPVEEJCTB4MjAwMDAwIC8qICJvbGQiIGdyb3VwIHF1b3RhICovCisjZGVmaW5lIEVYVDRfTU9VTlRfUVVPVEEJCTB4NDAwMDAgLyogU29tZSBxdW90YSBvcHRpb24gc2V0ICovCisjZGVmaW5lIEVYVDRfTU9VTlRfVVNSUVVPVEEJCTB4ODAwMDAgLyogIm9sZCIgdXNlciBxdW90YSwKKwkJCQkJCSAqIGVuYWJsZSBlbmZvcmNlbWVudCBmb3IgaGlkZGVuCisJCQkJCQkgKiBxdW90YSBmaWxlcyAqLworI2RlZmluZSBFWFQ0X01PVU5UX0dSUFFVT1RBCQkweDEwMDAwMCAvKiAib2xkIiBncm91cCBxdW90YSwgZW5hYmxlCisJCQkJCQkgICogZW5mb3JjZW1lbnQgZm9yIGhpZGRlbiBxdW90YQorCQkJCQkJICAqIGZpbGVzICovCisjZGVmaW5lIEVYVDRfTU9VTlRfUFJKUVVPVEEJCTB4MjAwMDAwIC8qIEVuYWJsZSBwcm9qZWN0IHF1b3RhCisJCQkJCQkgICogZW5mb3JjZW1lbnQgKi8KICNkZWZpbmUgRVhUNF9NT1VOVF9ESU9SRUFEX05PTE9DSwkweDQwMDAwMCAvKiBFbmFibGUgc3VwcG9ydCBmb3IgZGlvIHJlYWQgbm9sb2NraW5nICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfSk9VUk5BTF9DSEVDS1NVTQkweDgwMDAwMCAvKiBKb3VybmFsIGNoZWNrc3VtcyAqLwogI2RlZmluZSBFWFQ0X01PVU5UX0pPVVJOQUxfQVNZTkNfQ09NTUlUCTB4MTAwMDAwMCAvKiBKb3VybmFsIEFzeW5jIENvbW1pdCAqLwpAQCAtMTYzNiwyNiArMTY0NSw2IEBACiAgKiBGZWF0dXJlIHNldCBkZWZpbml0aW9ucwogICovCiAKLS8qIFVzZSB0aGUgZXh0NF97aGFzLHNldCxjbGVhcn1fZmVhdHVyZV8qIGhlbHBlcnM7IHRoZXNlIHdpbGwgYmUgcmVtb3ZlZCAqLwotI2RlZmluZSBFWFQ0X0hBU19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKLQkoKEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0ICYgY3B1X3RvX2xlMzIobWFzaykpICE9IDApCi0jZGVmaW5lIEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLG1hc2spCQkJXAotCSgoRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSkgIT0gMCkKLSNkZWZpbmUgRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKLQkoKEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBjcHVfdG9fbGUzMihtYXNrKSkgIT0gMCkKLSNkZWZpbmUgRVhUNF9TRVRfQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCi0JRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgfD0gY3B1X3RvX2xlMzIobWFzaykKLSNkZWZpbmUgRVhUNF9TRVRfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCi0JRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgfD0gY3B1X3RvX2xlMzIobWFzaykKLSNkZWZpbmUgRVhUNF9TRVRfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKLQlFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0IHw9IGNwdV90b19sZTMyKG1hc2spCi0jZGVmaW5lIEVYVDRfQ0xFQVJfQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCi0JRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgJj0gfmNwdV90b19sZTMyKG1hc2spCi0jZGVmaW5lIEVYVDRfQ0xFQVJfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCi0JRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgJj0gfmNwdV90b19sZTMyKG1hc2spCi0jZGVmaW5lIEVYVDRfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKLQlFWFQ0X1NCKHNiKS0+c19lcy0+c19mZWF0dXJlX2luY29tcGF0ICY9IH5jcHVfdG9fbGUzMihtYXNrKQotCiAjZGVmaW5lIEVYVDRfRkVBVFVSRV9DT01QQVRfRElSX1BSRUFMTE9DCTB4MDAwMQogI2RlZmluZSBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0lNQUdJQ19JTk9ERVMJMHgwMDAyCiAjZGVmaW5lIEVYVDRfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwJCTB4MDAwNApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzLmMgYi9mcy9leHQ0L2V4dGVudHMuYwppbmRleCBkN2NjYjdmLi5jOTMwYTAxIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dGVudHMuYworKysgYi9mcy9leHQ0L2V4dGVudHMuYwpAQCAtNDY3OSw2ICs0Njc5LDcgQEAKIAl1bnNpZ25lZCBpbnQgY3JlZGl0czsKIAlsb2ZmX3QgZXBvczsKIAorCUJVR19PTighZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykpOwogCW1hcC5tX2xibGsgPSBvZmZzZXQ7CiAJbWFwLm1fbGVuID0gbGVuOwogCS8qCkBAIC00NjkzLDEzICs0Njk0LDcgQEAKIAkgKiBjcmVkaXRzIHRvIGluc2VydCAxIGV4dGVudCBpbnRvIGV4dGVudCB0cmVlCiAJICovCiAJY3JlZGl0cyA9IGV4dDRfY2h1bmtfdHJhbnNfYmxvY2tzKGlub2RlLCBsZW4pOwotCS8qCi0JICogV2UgY2FuIG9ubHkgY2FsbCBleHRfZGVwdGgoKSBvbiBleHRlbnQgYmFzZWQgaW5vZGVzCi0JICovCi0JaWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKQotCQlkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7Ci0JZWxzZQotCQlkZXB0aCA9IC0xOworCWRlcHRoID0gZXh0X2RlcHRoKGlub2RlKTsKIAogcmV0cnk6CiAJd2hpbGUgKHJldCA+PSAwICYmIGxlbikgewpAQCAtNDk2NiwxMyArNDk2MSw4IEBACiAKIAl0cmFjZV9leHQ0X2ZhbGxvY2F0ZV9lbnRlcihpbm9kZSwgb2Zmc2V0LCBsZW4sIG1vZGUpOwogCWxibGsgPSBvZmZzZXQgPj4gYmxrYml0czsKLQkvKgotCSAqIFdlIGNhbid0IGp1c3QgY29udmVydCBsZW4gdG8gbWF4X2Jsb2NrcyBiZWNhdXNlCi0JICogSWYgYmxvY2tzaXplID0gNDA5NiBvZmZzZXQgPSAzMDcyIGFuZCBsZW4gPSAyMDQ4Ci0JICovCi0JbWF4X2Jsb2NrcyA9IChFWFQ0X0JMT0NLX0FMSUdOKGxlbiArIG9mZnNldCwgYmxrYml0cykgPj4gYmxrYml0cykKLQkJLSBsYmxrOwogCisJbWF4X2Jsb2NrcyA9IEVYVDRfTUFYX0JMT0NLUyhsZW4sIG9mZnNldCwgYmxrYml0cyk7CiAJZmxhZ3MgPSBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFX1VOV1JJVF9FWFQ7CiAJaWYgKG1vZGUgJiBGQUxMT0NfRkxfS0VFUF9TSVpFKQogCQlmbGFncyB8PSBFWFQ0X0dFVF9CTE9DS1NfS0VFUF9TSVpFOwpAQCAtNTAzNSwxMiArNTAyNSw4IEBACiAJdW5zaWduZWQgaW50IGNyZWRpdHMsIGJsa2JpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOwogCiAJbWFwLm1fbGJsayA9IG9mZnNldCA+PiBibGtiaXRzOwotCS8qCi0JICogV2UgY2FuJ3QganVzdCBjb252ZXJ0IGxlbiB0byBtYXhfYmxvY2tzIGJlY2F1c2UKLQkgKiBJZiBibG9ja3NpemUgPSA0MDk2IG9mZnNldCA9IDMwNzIgYW5kIGxlbiA9IDIwNDgKLQkgKi8KLQltYXhfYmxvY2tzID0gKChFWFQ0X0JMT0NLX0FMSUdOKGxlbiArIG9mZnNldCwgYmxrYml0cykgPj4gYmxrYml0cykgLQotCQkgICAgICBtYXAubV9sYmxrKTsKKwltYXhfYmxvY2tzID0gRVhUNF9NQVhfQkxPQ0tTKGxlbiwgb2Zmc2V0LCBibGtiaXRzKTsKKwogCS8qCiAJICogVGhpcyBpcyBzb21ld2hhdCB1Z2x5IGJ1dCB0aGUgaWRlYSBpcyBjbGVhcjogV2hlbiB0cmFuc2FjdGlvbiBpcwogCSAqIHJlc2VydmVkLCBldmVyeXRoaW5nIGdvZXMgaW50byBpdC4gT3RoZXJ3aXNlIHdlIHJhdGhlciBzdGFydCBzZXZlcmFsCkBAIC01NzM0LDYgKzU3MjAsOSBAQAogCQkJdXBfd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pOwogCQkJZ290byBvdXRfc3RvcDsKIAkJfQorCX0gZWxzZSB7CisJCWV4dDRfZXh0X2Ryb3BfcmVmcyhwYXRoKTsKKwkJa2ZyZWUocGF0aCk7CiAJfQogCiAJcmV0ID0gZXh0NF9lc19yZW1vdmVfZXh0ZW50KGlub2RlLCBvZmZzZXRfbGJsaywKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZmlsZS5jIGIvZnMvZXh0NC9maWxlLmMKaW5kZXggMjYxYWMzNy4uMjVmNzYzZiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9maWxlLmMKKysrIGIvZnMvZXh0NC9maWxlLmMKQEAgLTkxLDkgKzkxLDcgQEAKIHN0YXRpYyBzc2l6ZV90CiBleHQ0X2ZpbGVfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKLQlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoaW9jYi0+a2lfZmlscCk7Ci0Jc3RydWN0IGJsa19wbHVnIHBsdWc7CiAJaW50IG9fZGlyZWN0ID0gaW9jYi0+a2lfZmxhZ3MgJiBJT0NCX0RJUkVDVDsKIAlpbnQgdW5hbGlnbmVkX2FpbyA9IDA7CiAJaW50IG92ZXJ3cml0ZSA9IDA7CkBAIC0xMzQsMTggKzEzMiwxNiBAQAogCWlmIChvX2RpcmVjdCkgewogCQlzaXplX3QgbGVuZ3RoID0gaW92X2l0ZXJfY291bnQoZnJvbSk7CiAJCWxvZmZfdCBwb3MgPSBpb2NiLT5raV9wb3M7Ci0JCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKIAogCQkvKiBjaGVjayB3aGV0aGVyIHdlIGRvIGEgRElPIG92ZXJ3cml0ZSBvciBub3QgKi8KIAkJaWYgKGV4dDRfc2hvdWxkX2Rpb3JlYWRfbm9sb2NrKGlub2RlKSAmJiAhdW5hbGlnbmVkX2FpbyAmJgotCQkgICAgIWZpbGUtPmZfbWFwcGluZy0+bnJwYWdlcyAmJiBwb3MgKyBsZW5ndGggPD0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJCSAgICBwb3MgKyBsZW5ndGggPD0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CiAJCQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzIG1hcDsKIAkJCXVuc2lnbmVkIGludCBibGtiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKIAkJCWludCBlcnIsIGxlbjsKIAogCQkJbWFwLm1fbGJsayA9IHBvcyA+PiBibGtiaXRzOwotCQkJbWFwLm1fbGVuID0gKEVYVDRfQkxPQ0tfQUxJR04ocG9zICsgbGVuZ3RoLCBibGtiaXRzKSA+PiBibGtiaXRzKQotCQkJCS0gbWFwLm1fbGJsazsKKwkJCW1hcC5tX2xlbiA9IEVYVDRfTUFYX0JMT0NLUyhsZW5ndGgsIHBvcywgYmxrYml0cyk7CiAJCQlsZW4gPSBtYXAubV9sZW47CiAKIAkJCWVyciA9IGV4dDRfbWFwX2Jsb2NrcyhOVUxMLCBpbm9kZSwgJm1hcCwgMCk7CkBAIC0xNzEsOCArMTY3LDYgQEAKIAogCWlmIChyZXQgPiAwKQogCQlyZXQgPSBnZW5lcmljX3dyaXRlX3N5bmMoaW9jYiwgcmV0KTsKLQlpZiAob19kaXJlY3QpCi0JCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAKIAlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L2ZzeW5jLmMgYi9mcy9leHQ0L2ZzeW5jLmMKaW5kZXggNWM0MzcyNS4uODhlZmZiMSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9mc3luYy5jCisrKyBiL2ZzL2V4dDQvZnN5bmMuYwpAQCAtNjEsNiArNjEsMTMgQEAKIAkJCWJyZWFrOwogCQlpcHV0KGlub2RlKTsKIAkJaW5vZGUgPSBuZXh0OworCQkvKgorCQkgKiBUaGUgZGlyZWN0b3J5IGlub2RlIG1heSBoYXZlIGdvbmUgdGhyb3VnaCBybWRpciBieSBub3cuIEJ1dAorCQkgKiB0aGUgaW5vZGUgaXRzZWxmIGFuZCBpdHMgYmxvY2tzIGFyZSBzdGlsbCBhbGxvY2F0ZWQgKHdlIGhvbGQKKwkJICogYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlIHNvIGl0IGRpZG4ndCBnbyB0aHJvdWdoCisJCSAqIGV4dDRfZXZpY3RfaW5vZGUoKSkgYW5kIHNvIHdlIGFyZSBzYWZlIHRvIGZsdXNoIG1ldGFkYXRhCisJCSAqIGJsb2NrcyBhbmQgdGhlIGlub2RlLgorCQkgKi8KIAkJcmV0ID0gc3luY19tYXBwaW5nX2J1ZmZlcnMoaW5vZGUtPmlfbWFwcGluZyk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKQEAgLTEwNyw3ICsxMTQsNyBAQAogCiAJaWYgKCFqb3VybmFsKSB7CiAJCXJldCA9IF9fZ2VuZXJpY19maWxlX2ZzeW5jKGZpbGUsIHN0YXJ0LCBlbmQsIGRhdGFzeW5jKTsKLQkJaWYgKCFyZXQgJiYgIWhsaXN0X2VtcHR5KCZpbm9kZS0+aV9kZW50cnkpKQorCQlpZiAoIXJldCkKIAkJCXJldCA9IGV4dDRfc3luY19wYXJlbnQoaW5vZGUpOwogCQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIEJBUlJJRVIpKQogCQkJZ290byBpc3N1ZV9mbHVzaDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaWFsbG9jLmMgYi9mcy9leHQ0L2lhbGxvYy5jCmluZGV4IDllNjZjZDEuLjE3MDQyMWUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaWFsbG9jLmMKKysrIGIvZnMvZXh0NC9pYWxsb2MuYwpAQCAtODAyLDcgKzgwMiw3IEBACiAJfSBlbHNlCiAJCWlub2RlX2luaXRfb3duZXIoaW5vZGUsIGRpciwgbW9kZSk7CiAKLQlpZiAoRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfUFJPSkVDVCkgJiYKKwlpZiAoZXh0NF9oYXNfZmVhdHVyZV9wcm9qZWN0KHNiKSAmJgogCSAgICBleHQ0X3Rlc3RfaW5vZGVfZmxhZyhkaXIsIEVYVDRfSU5PREVfUFJPSklOSEVSSVQpKQogCQllaS0+aV9wcm9qaWQgPSBFWFQ0X0koZGlyKS0+aV9wcm9qaWQ7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IDMxMzE3NDcuLmNkOTE4ODIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTY0NywxMSArNjQ3LDE5IEBACiAJCS8qCiAJCSAqIFdlIGhhdmUgdG8gemVyb291dCBibG9ja3MgYmVmb3JlIGluc2VydGluZyB0aGVtIGludG8gZXh0ZW50CiAJCSAqIHN0YXR1cyB0cmVlLiBPdGhlcndpc2Ugc29tZW9uZSBjb3VsZCBsb29rIHRoZW0gdXAgdGhlcmUgYW5kCi0JCSAqIHVzZSB0aGVtIGJlZm9yZSB0aGV5IGFyZSByZWFsbHkgemVyb2VkLgorCQkgKiB1c2UgdGhlbSBiZWZvcmUgdGhleSBhcmUgcmVhbGx5IHplcm9lZC4gV2UgYWxzbyBoYXZlIHRvCisJCSAqIHVubWFwIG1ldGFkYXRhIGJlZm9yZSB6ZXJvaW5nIGFzIG90aGVyd2lzZSB3cml0ZWJhY2sgY2FuCisJCSAqIG92ZXJ3cml0ZSB6ZXJvcyB3aXRoIHN0YWxlIGRhdGEgZnJvbSBibG9jayBkZXZpY2UuCiAJCSAqLwogCQlpZiAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfWkVSTyAmJgogCQkgICAgbWFwLT5tX2ZsYWdzICYgRVhUNF9NQVBfTUFQUEVEICYmCiAJCSAgICBtYXAtPm1fZmxhZ3MgJiBFWFQ0X01BUF9ORVcpIHsKKwkJCWV4dDRfbGJsa190IGk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBtYXAtPm1fbGVuOyBpKyspIHsKKwkJCQl1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGlub2RlLT5pX3NiLT5zX2JkZXYsCisJCQkJCQkJICBtYXAtPm1fcGJsayArIGkpOworCQkJfQogCQkJcmV0ID0gZXh0NF9pc3N1ZV96ZXJvb3V0KGlub2RlLCBtYXAtPm1fbGJsaywKIAkJCQkJCSBtYXAtPm1fcGJsaywgbWFwLT5tX2xlbik7CiAJCQlpZiAocmV0KSB7CkBAIC0xNjQ5LDYgKzE2NTcsOCBAQAogCQkJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKIAkJCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKIAkJCWlmIChpbnZhbGlkYXRlKSB7CisJCQkJaWYgKHBhZ2VfbWFwcGVkKHBhZ2UpKQorCQkJCQljbGVhcl9wYWdlX2RpcnR5X2Zvcl9pbyhwYWdlKTsKIAkJCQlibG9ja19pbnZhbGlkYXRlcGFnZShwYWdlLCAwLCBQQUdFX1NJWkUpOwogCQkJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwogCQkJfQpAQCAtMzUyNiwzNSArMzUzNiwzMSBAQAogCiBzdGF0aWMgc3NpemVfdCBleHQ0X2RpcmVjdF9JT19yZWFkKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICppdGVyKQogewotCWludCB1bmxvY2tlZCA9IDA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKIAlzc2l6ZV90IHJldDsKIAotCWlmIChleHQ0X3Nob3VsZF9kaW9yZWFkX25vbG9jayhpbm9kZSkpIHsKLQkJLyoKLQkJICogTm9sb2NrIGRpb3JlYWQgb3B0aW1pemF0aW9uIG1heSBiZSBkeW5hbWljYWxseSBkaXNhYmxlZAotCQkgKiB2aWEgZXh0NF9pbm9kZV9ibG9ja191bmxvY2tlZF9kaW8oKS4gQ2hlY2sgaW5vZGUncyBzdGF0ZQotCQkgKiB3aGlsZSBob2xkaW5nIGV4dHJhIGlfZGlvX2NvdW50IHJlZi4KLQkJICovCi0JCWlub2RlX2Rpb19iZWdpbihpbm9kZSk7Ci0JCXNtcF9tYigpOwotCQlpZiAodW5saWtlbHkoZXh0NF90ZXN0X2lub2RlX3N0YXRlKGlub2RlLAotCQkJCQkJICAgIEVYVDRfU1RBVEVfRElPUkVBRF9MT0NLKSkpCi0JCQlpbm9kZV9kaW9fZW5kKGlub2RlKTsKLQkJZWxzZQotCQkJdW5sb2NrZWQgPSAxOwotCX0KKwkvKgorCSAqIFNoYXJlZCBpbm9kZV9sb2NrIGlzIGVub3VnaCBmb3IgdXMgLSBpdCBwcm90ZWN0cyBhZ2FpbnN0IGNvbmN1cnJlbnQKKwkgKiB3cml0ZXMgJiB0cnVuY2F0ZXMgYW5kIHNpbmNlIHdlIHRha2UgY2FyZSBvZiB3cml0aW5nIGJhY2sgcGFnZSBjYWNoZSwKKwkgKiB3ZSBhcmUgcHJvdGVjdGVkIGFnYWluc3QgcGFnZSB3cml0ZWJhY2sgYXMgd2VsbC4KKwkgKi8KKwlpbm9kZV9sb2NrX3NoYXJlZChpbm9kZSk7CiAJaWYgKElTX0RBWChpbm9kZSkpIHsKLQkJcmV0ID0gZGF4X2RvX2lvKGlvY2IsIGlub2RlLCBpdGVyLCBleHQ0X2Rpb19nZXRfYmxvY2ssCi0JCQkJTlVMTCwgdW5sb2NrZWQgPyAwIDogRElPX0xPQ0tJTkcpOworCQlyZXQgPSBkYXhfZG9faW8oaW9jYiwgaW5vZGUsIGl0ZXIsIGV4dDRfZGlvX2dldF9ibG9jaywgTlVMTCwgMCk7CiAJfSBlbHNlIHsKKwkJc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQoaXRlcik7CisKKwkJcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShtYXBwaW5nLCBpb2NiLT5raV9wb3MsCisJCQkJCQkgICBpb2NiLT5raV9wb3MgKyBjb3VudCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF91bmxvY2s7CiAJCXJldCA9IF9fYmxvY2tkZXZfZGlyZWN0X0lPKGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LAogCQkJCQkgICBpdGVyLCBleHQ0X2Rpb19nZXRfYmxvY2ssCi0JCQkJCSAgIE5VTEwsIE5VTEwsCi0JCQkJCSAgIHVubG9ja2VkID8gMCA6IERJT19MT0NLSU5HKTsKKwkJCQkJICAgTlVMTCwgTlVMTCwgMCk7CiAJfQotCWlmICh1bmxvY2tlZCkKLQkJaW5vZGVfZGlvX2VuZChpbm9kZSk7CitvdXRfdW5sb2NrOgorCWlub2RlX3VubG9ja19zaGFyZWQoaW5vZGUpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM4OTAsNyArMzg5Niw3IEBACiB9CiAKIC8qCi0gKiBleHQ0X3B1bmNoX2hvbGU6IHB1bmNoZXMgYSBob2xlIGluIGEgZmlsZSBieSByZWxlYXNlaW5nIHRoZSBibG9ja3MKKyAqIGV4dDRfcHVuY2hfaG9sZTogcHVuY2hlcyBhIGhvbGUgaW4gYSBmaWxlIGJ5IHJlbGVhc2luZyB0aGUgYmxvY2tzCiAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9mZnNldCBhbmQgbGVuZ3RoCiAgKgogICogQGlub2RlOiAgRmlsZSBpbm9kZQpAQCAtMzkxOSw3ICszOTI1LDcgQEAKIAkgKiBXcml0ZSBvdXQgYWxsIGRpcnR5IHBhZ2VzIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucwogCSAqIFRoZW4gcmVsZWFzZSB0aGVtLgogCSAqLwotCWlmIChtYXBwaW5nLT5ucnBhZ2VzICYmIG1hcHBpbmdfdGFnZ2VkKG1hcHBpbmcsIFBBR0VDQUNIRV9UQUdfRElSVFkpKSB7CisJaWYgKG1hcHBpbmdfdGFnZ2VkKG1hcHBpbmcsIFBBR0VDQUNIRV9UQUdfRElSVFkpKSB7CiAJCXJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UobWFwcGluZywgb2Zmc2V0LAogCQkJCQkJICAgb2Zmc2V0ICsgbGVuZ3RoIC0gMSk7CiAJCWlmIChyZXQpCkBAIC00NDE0LDcgKzQ0MjAsNyBAQAogCiBpbnQgZXh0NF9nZXRfcHJvamlkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGtwcm9qaWRfdCAqcHJvamlkKQogewotCWlmICghRVhUNF9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoaW5vZGUtPmlfc2IsIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfUFJPSkVDVCkpCisJaWYgKCFleHQ0X2hhc19mZWF0dXJlX3Byb2plY3QoaW5vZGUtPmlfc2IpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJKnByb2ppZCA9IEVYVDRfSShpbm9kZSktPmlfcHJvamlkOwogCXJldHVybiAwOwpAQCAtNDQ4MSw3ICs0NDg3LDcgQEAKIAlpbm9kZS0+aV9tb2RlID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX21vZGUpOwogCWlfdWlkID0gKHVpZF90KWxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV91aWRfbG93KTsKIAlpX2dpZCA9IChnaWRfdClsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfZ2lkX2xvdyk7Ci0JaWYgKEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX1BST0pFQ1QpICYmCisJaWYgKGV4dDRfaGFzX2ZlYXR1cmVfcHJvamVjdChzYikgJiYKIAkgICAgRVhUNF9JTk9ERV9TSVpFKHNiKSA+IEVYVDRfR09PRF9PTERfSU5PREVfU0laRSAmJgogCSAgICBFWFQ0X0ZJVFNfSU5fSU5PREUocmF3X2lub2RlLCBlaSwgaV9wcm9qaWQpKQogCQlpX3Byb2ppZCA9IChwcm9qaWRfdClsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfcHJvamlkKTsKQEAgLTQ4MTQsMTQgKzQ4MjAsMTQgQEAKICAqIEZpeCB1cCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb2xkIGtlcm5lbHMuIE90aGVyd2lzZSwgb2xkIGlub2RlcyBnZXQKICAqIHJlLXVzZWQgd2l0aCB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgdWlkL2dpZCBpbnRhY3QKICAqLwotCQlpZiAoIWVpLT5pX2R0aW1lKSB7CisJCWlmIChlaS0+aV9kdGltZSAmJiBsaXN0X2VtcHR5KCZlaS0+aV9vcnBoYW4pKSB7CisJCQlyYXdfaW5vZGUtPmlfdWlkX2hpZ2ggPSAwOworCQkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0gMDsKKwkJfSBlbHNlIHsKIAkJCXJhd19pbm9kZS0+aV91aWRfaGlnaCA9CiAJCQkJY3B1X3RvX2xlMTYoaGlnaF8xNl9iaXRzKGlfdWlkKSk7CiAJCQlyYXdfaW5vZGUtPmlfZ2lkX2hpZ2ggPQogCQkJCWNwdV90b19sZTE2KGhpZ2hfMTZfYml0cyhpX2dpZCkpOwotCQl9IGVsc2UgewotCQkJcmF3X2lub2RlLT5pX3VpZF9oaWdoID0gMDsKLQkJCXJhd19pbm9kZS0+aV9naWRfaGlnaCA9IDA7CiAJCX0KIAl9IGVsc2UgewogCQlyYXdfaW5vZGUtPmlfdWlkX2xvdyA9IGNwdV90b19sZTE2KGZzX2hpZ2gybG93dWlkKGlfdWlkKSk7CkBAIC00ODg1LDggKzQ4OTEsNyBAQAogCQl9CiAJfQogCi0JQlVHX09OKCFFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShpbm9kZS0+aV9zYiwKLQkJCUVYVDRfRkVBVFVSRV9ST19DT01QQVRfUFJPSkVDVCkgJiYKKwlCVUdfT04oIWV4dDRfaGFzX2ZlYXR1cmVfcHJvamVjdChpbm9kZS0+aV9zYikgJiYKIAkgICAgICAgaV9wcm9qaWQgIT0gRVhUNF9ERUZfUFJPSklEKTsKIAogCWlmIChFWFQ0X0lOT0RFX1NJWkUoaW5vZGUtPmlfc2IpID4gRVhUNF9HT09EX09MRF9JTk9ERV9TSVpFICYmCkBAIC01NDY2LDggKzU0NzEsNiBAQAogCQkJCQkJICAgICAgc2JpLT5zX3dhbnRfZXh0cmFfaXNpemUsCiAJCQkJCQkgICAgICBpbG9jLCBoYW5kbGUpOwogCQkJaWYgKHJldCkgewotCQkJCWV4dDRfc2V0X2lub2RlX3N0YXRlKGlub2RlLAotCQkJCQkJICAgICBFWFQ0X1NUQVRFX05PX0VYUEFORCk7CiAJCQkJaWYgKG1udF9jb3VudCAhPQogCQkJCQlsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfbW50X2NvdW50KSkgewogCQkJCQlleHQ0X3dhcm5pbmcoaW5vZGUtPmlfc2IsCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lvY3RsLmMgYi9mcy9leHQ0L2lvY3RsLmMKaW5kZXggMTA2ODZmZC4uYmY1YWU4ZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pb2N0bC5jCisrKyBiL2ZzL2V4dDQvaW9jdGwuYwpAQCAtMTksOCArMTksNiBAQAogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogI2luY2x1ZGUgImV4dDQuaCIKIAotI2RlZmluZSBNQVhfMzJfTlVNICgoKCh1bnNpZ25lZCBsb25nIGxvbmcpIDEpIDw8IDMyKSAtIDEpCi0KIC8qKgogICogU3dhcCBtZW1vcnkgYmV0d2VlbiBAYSBhbmQgQGIgZm9yIEBsZW4gYnl0ZXMuCiAgKgpAQCAtMzEwLDggKzMwOCw3IEBACiAJc3RydWN0IGV4dDRfaW5vZGUgKnJhd19pbm9kZTsKIAlzdHJ1Y3QgZHF1b3QgKnRyYW5zZmVyX3RvW01BWFFVT1RBU10gPSB7IH07CiAKLQlpZiAoIUVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAotCQkJRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9QUk9KRUNUKSkgeworCWlmICghZXh0NF9oYXNfZmVhdHVyZV9wcm9qZWN0KHNiKSkgewogCQlpZiAocHJvamlkICE9IEVYVDRfREVGX1BST0pJRCkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAkJZWxzZQpAQCAtNzcyLDExICs3NjksMTQgQEAKICNpZmRlZiBDT05GSUdfRVhUNF9GU19FTkNSWVBUSU9OCiAJCXN0cnVjdCBmc2NyeXB0X3BvbGljeSBwb2xpY3k7CiAKKwkJaWYgKCFleHQ0X2hhc19mZWF0dXJlX2VuY3J5cHQoc2IpKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCiAJCWlmIChjb3B5X2Zyb21fdXNlcigmcG9saWN5LAogCQkJCSAgIChzdHJ1Y3QgZnNjcnlwdF9wb2xpY3kgX191c2VyICopYXJnLAogCQkJCSAgIHNpemVvZihwb2xpY3kpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gZnNjcnlwdF9wcm9jZXNzX3BvbGljeShpbm9kZSwgJnBvbGljeSk7CisJCXJldHVybiBmc2NyeXB0X3Byb2Nlc3NfcG9saWN5KGZpbHAsICZwb2xpY3kpOwogI2Vsc2UKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogI2VuZGlmCkBAIC04NDIsOCArODQyLDcgQEAKIAkJZXh0NF9nZXRfaW5vZGVfZmxhZ3MoZWkpOwogCQlmYS5mc3hfeGZsYWdzID0gZXh0NF9pZmxhZ3NfdG9feGZsYWdzKGVpLT5pX2ZsYWdzICYgRVhUNF9GTF9VU0VSX1ZJU0lCTEUpOwogCi0JCWlmIChFWFQ0X0hBU19ST19DT01QQVRfRkVBVFVSRShpbm9kZS0+aV9zYiwKLQkJCQlFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX1BST0pFQ1QpKSB7CisJCWlmIChleHQ0X2hhc19mZWF0dXJlX3Byb2plY3QoaW5vZGUtPmlfc2IpKSB7CiAJCQlmYS5mc3hfcHJvamlkID0gKF9fdTMyKWZyb21fa3Byb2ppZCgmaW5pdF91c2VyX25zLAogCQkJCUVYVDRfSShpbm9kZSktPmlfcHJvamlkKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tb3ZlX2V4dGVudC5jIGIvZnMvZXh0NC9tb3ZlX2V4dGVudC5jCmluZGV4IGE5MjBjNWQuLjZmYzE0ZGUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbW92ZV9leHRlbnQuYworKysgYi9mcy9leHQ0L21vdmVfZXh0ZW50LmMKQEAgLTU5OCw2ICs1OTgsMTMgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAorCWlmIChleHQ0X2VuY3J5cHRlZF9pbm9kZShvcmlnX2lub2RlKSB8fAorCSAgICBleHQ0X2VuY3J5cHRlZF9pbm9kZShkb25vcl9pbm9kZSkpIHsKKwkJZXh0NF9tc2cob3JpZ19pbm9kZS0+aV9zYiwgS0VSTl9FUlIsCisJCQkgIk9ubGluZSBkZWZyYWcgbm90IHN1cHBvcnRlZCBmb3IgZW5jcnlwdGVkIGZpbGVzIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKIAkvKiBQcm90ZWN0IG9yaWcgYW5kIGRvbm9yIGlub2RlcyBhZ2FpbnN0IGEgdHJ1bmNhdGUgKi8KIAlsb2NrX3R3b19ub25kaXJlY3RvcmllcyhvcmlnX2lub2RlLCBkb25vcl9pbm9kZSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbmFtZWkuYyBiL2ZzL2V4dDQvbmFtZWkuYwppbmRleCAzNGMwMTQyLi5jMzQ0YjgxIDEwMDY0NAotLS0gYS9mcy9leHQ0L25hbWVpLmMKKysrIGIvZnMvZXh0NC9uYW1laS5jCkBAIC02MzksNyArNjM5LDcgQEAKIAkJCQkJcmVzID0gZnNjcnlwdF9mbmFtZV9hbGxvY19idWZmZXIoCiAJCQkJCQlkaXIsIGxlbiwKIAkJCQkJCSZmbmFtZV9jcnlwdG9fc3RyKTsKLQkJCQkJaWYgKHJlcyA8IDApCisJCQkJCWlmIChyZXMpCiAJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciAiCiAJCQkJCQkJImFsbG9jYXRpbmcgY3J5cHRvICIKIAkJCQkJCQkiYnVmZmVyLS1za2lwcGluZyAiCkBAIC02NDcsNyArNjQ3LDcgQEAKIAkJCQkJcmVzID0gZnNjcnlwdF9mbmFtZV9kaXNrX3RvX3VzcihkaXIsCiAJCQkJCQkwLCAwLCAmZGVfbmFtZSwKIAkJCQkJCSZmbmFtZV9jcnlwdG9fc3RyKTsKLQkJCQkJaWYgKHJlcyA8IDApIHsKKwkJCQkJaWYgKHJlcykgewogCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJyb3IgIgogCQkJCQkJCSJjb252ZXJ0aW5nIGZpbGVuYW1lICIKIAkJCQkJCQkiZnJvbSBkaXNrIHRvIHVzciIKQEAgLTEwMTEsNyArMTAxMSw3IEBACiAJCQllcnIgPSBmc2NyeXB0X2ZuYW1lX2Rpc2tfdG9fdXNyKGRpciwgaGluZm8tPmhhc2gsCiAJCQkJCWhpbmZvLT5taW5vcl9oYXNoLCAmZGVfbmFtZSwKIAkJCQkJJmZuYW1lX2NyeXB0b19zdHIpOwotCQkJaWYgKGVyciA8IDApIHsKKwkJCWlmIChlcnIpIHsKIAkJCQljb3VudCA9IGVycjsKIAkJCQlnb3RvIGVycm91dDsKIAkJCX0KQEAgLTIwNDQsMzMgKzIwNDQsMzEgQEAKIAlmcmFtZS0+ZW50cmllcyA9IGVudHJpZXM7CiAJZnJhbWUtPmF0ID0gZW50cmllczsKIAlmcmFtZS0+YmggPSBiaDsKLQliaCA9IGJoMjsKIAogCXJldHZhbCA9IGV4dDRfaGFuZGxlX2RpcnR5X2R4X25vZGUoaGFuZGxlLCBkaXIsIGZyYW1lLT5iaCk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBvdXRfZnJhbWVzOwkKLQlyZXR2YWwgPSBleHQ0X2hhbmRsZV9kaXJ0eV9kaXJlbnRfbm9kZShoYW5kbGUsIGRpciwgYmgpOworCXJldHZhbCA9IGV4dDRfaGFuZGxlX2RpcnR5X2RpcmVudF9ub2RlKGhhbmRsZSwgZGlyLCBiaDIpOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gb3V0X2ZyYW1lczsJCiAKLQlkZSA9IGRvX3NwbGl0KGhhbmRsZSxkaXIsICZiaCwgZnJhbWUsICZmbmFtZS0+aGluZm8pOworCWRlID0gZG9fc3BsaXQoaGFuZGxlLGRpciwgJmJoMiwgZnJhbWUsICZmbmFtZS0+aGluZm8pOwogCWlmIChJU19FUlIoZGUpKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIoZGUpOwogCQlnb3RvIG91dF9mcmFtZXM7CiAJfQotCWR4X3JlbGVhc2UoZnJhbWVzKTsKIAotCXJldHZhbCA9IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZSwgZm5hbWUsIGRpciwgaW5vZGUsIGRlLCBiaCk7Ci0JYnJlbHNlKGJoKTsKLQlyZXR1cm4gcmV0dmFsOworCXJldHZhbCA9IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZSwgZm5hbWUsIGRpciwgaW5vZGUsIGRlLCBiaDIpOwogb3V0X2ZyYW1lczoKIAkvKgogCSAqIEV2ZW4gaWYgdGhlIGJsb2NrIHNwbGl0IGZhaWxlZCwgd2UgaGF2ZSB0byBwcm9wZXJseSB3cml0ZQogCSAqIG91dCBhbGwgdGhlIGNoYW5nZXMgd2UgZGlkIHNvIGZhci4gT3RoZXJ3aXNlIHdlIGNhbiBlbmQgdXAKIAkgKiB3aXRoIGNvcnJ1cHRlZCBmaWxlc3lzdGVtLgogCSAqLwotCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGRpcik7CisJaWYgKHJldHZhbCkKKwkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKIAlkeF9yZWxlYXNlKGZyYW1lcyk7CisJYnJlbHNlKGJoMik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMzE0NCw3ICszMTQyLDcgQEAKIAkJaXN0ci5uYW1lID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3ltbmFtZTsKIAkJaXN0ci5sZW4gPSBsZW47CiAJCWVyciA9IGZzY3J5cHRfZm5hbWVfdXNyX3RvX2Rpc2soaW5vZGUsICZpc3RyLCAmb3N0cik7Ci0JCWlmIChlcnIgPCAwKQorCQlpZiAoZXJyKQogCQkJZ290byBlcnJfZHJvcF9pbm9kZTsKIAkJc2QtPmxlbiA9IGNwdV90b19sZTE2KG9zdHIubGVuKTsKIAkJZGlza19saW5rLm5hbWUgPSAoY2hhciAqKSBzZDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcGFnZS1pby5jIGIvZnMvZXh0NC9wYWdlLWlvLmMKaW5kZXggYTYxMzJhNy4uYjRjYmVlOSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9wYWdlLWlvLmMKKysrIGIvZnMvZXh0NC9wYWdlLWlvLmMKQEAgLTQwNSwxNCArNDA1LDEyIEBACiB7CiAJc3RydWN0IHBhZ2UgKmRhdGFfcGFnZSA9IE5VTEw7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0JdW5zaWduZWQgYmxvY2tfc3RhcnQsIGJsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBibG9ja19zdGFydDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgbnJfc3VibWl0dGVkID0gMDsKIAlpbnQgbnJfdG9fc3VibWl0ID0gMDsKIAotCWJsb2Nrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKLQogCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CiAJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOwogCmRpZmYgLS1naXQgYS9mcy9leHQ0L3N1cGVyLmMgYi9mcy9leHQ0L3N1cGVyLmMKaW5kZXggMWM1OTNhYS4uNmRiODFmYiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9zdXBlci5jCisrKyBiL2ZzL2V4dDQvc3VwZXIuYwpAQCAtNzgsNiArNzgsOCBAQAogc3RhdGljIHZvaWQgZXh0NF9kZXN0cm95X2xhenlpbml0X3RocmVhZCh2b2lkKTsKIHN0YXRpYyB2b2lkIGV4dDRfdW5yZWdpc3Rlcl9saV9yZXF1ZXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwogc3RhdGljIHZvaWQgZXh0NF9jbGVhcl9yZXF1ZXN0X2xpc3Qodm9pZCk7CitzdGF0aWMgc3RydWN0IGlub2RlICpleHQ0X2dldF9qb3VybmFsX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgam91cm5hbF9pbnVtKTsKIAogLyoKICAqIExvY2sgb3JkZXJpbmcKQEAgLTEyNjcsNyArMTI2OSw3IEBACiAJT3B0X3VzcmpxdW90YSwgT3B0X2dycGpxdW90YSwgT3B0X29mZnVzcmpxdW90YSwgT3B0X29mZmdycGpxdW90YSwKIAlPcHRfanFmbXRfdmZzb2xkLCBPcHRfanFmbXRfdmZzdjAsIE9wdF9qcWZtdF92ZnN2MSwgT3B0X3F1b3RhLAogCU9wdF9ub3F1b3RhLCBPcHRfYmFycmllciwgT3B0X25vYmFycmllciwgT3B0X2VyciwKLQlPcHRfdXNycXVvdGEsIE9wdF9ncnBxdW90YSwgT3B0X2lfdmVyc2lvbiwgT3B0X2RheCwKKwlPcHRfdXNycXVvdGEsIE9wdF9ncnBxdW90YSwgT3B0X3ByanF1b3RhLCBPcHRfaV92ZXJzaW9uLCBPcHRfZGF4LAogCU9wdF9zdHJpcGUsIE9wdF9kZWxhbGxvYywgT3B0X25vZGVsYWxsb2MsIE9wdF9tYmxrX2lvX3N1Ym1pdCwKIAlPcHRfbGF6eXRpbWUsIE9wdF9ub2xhenl0aW1lLAogCU9wdF9ub21ibGtfaW9fc3VibWl0LCBPcHRfYmxvY2tfdmFsaWRpdHksIE9wdF9ub2Jsb2NrX3ZhbGlkaXR5LApAQCAtMTMyNyw2ICsxMzI5LDcgQEAKIAl7T3B0X25vcXVvdGEsICJub3F1b3RhIn0sCiAJe09wdF9xdW90YSwgInF1b3RhIn0sCiAJe09wdF91c3JxdW90YSwgInVzcnF1b3RhIn0sCisJe09wdF9wcmpxdW90YSwgInByanF1b3RhIn0sCiAJe09wdF9iYXJyaWVyLCAiYmFycmllcj0ldSJ9LAogCXtPcHRfYmFycmllciwgImJhcnJpZXIifSwKIAl7T3B0X25vYmFycmllciwgIm5vYmFycmllciJ9LApAQCAtMTU0Niw4ICsxNTQ5LDExIEBACiAJCQkJCQkJTU9QVF9TRVQgfCBNT1BUX1F9LAogCXtPcHRfZ3JwcXVvdGEsIEVYVDRfTU9VTlRfUVVPVEEgfCBFWFQ0X01PVU5UX0dSUFFVT1RBLAogCQkJCQkJCU1PUFRfU0VUIHwgTU9QVF9RfSwKKwl7T3B0X3ByanF1b3RhLCBFWFQ0X01PVU5UX1FVT1RBIHwgRVhUNF9NT1VOVF9QUkpRVU9UQSwKKwkJCQkJCQlNT1BUX1NFVCB8IE1PUFRfUX0sCiAJe09wdF9ub3F1b3RhLCAoRVhUNF9NT1VOVF9RVU9UQSB8IEVYVDRfTU9VTlRfVVNSUVVPVEEgfAotCQkgICAgICAgRVhUNF9NT1VOVF9HUlBRVU9UQSksIE1PUFRfQ0xFQVIgfCBNT1BUX1F9LAorCQkgICAgICAgRVhUNF9NT1VOVF9HUlBRVU9UQSB8IEVYVDRfTU9VTlRfUFJKUVVPVEEpLAorCQkJCQkJCU1PUFRfQ0xFQVIgfCBNT1BUX1F9LAogCXtPcHRfdXNyanF1b3RhLCAwLCBNT1BUX1F9LAogCXtPcHRfZ3JwanF1b3RhLCAwLCBNT1BUX1F9LAogCXtPcHRfb2ZmdXNyanF1b3RhLCAwLCBNT1BUX1F9LApAQCAtMTgzNiwxMyArMTg0MiwxNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogI2lmZGVmIENPTkZJR19RVU9UQQotCWlmIChleHQ0X2hhc19mZWF0dXJlX3F1b3RhKHNiKSAmJgotCSAgICAodGVzdF9vcHQoc2IsIFVTUlFVT1RBKSB8fCB0ZXN0X29wdChzYiwgR1JQUVVPVEEpKSkgewotCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLCAiUXVvdGEgZmVhdHVyZSBlbmFibGVkLCB1c3JxdW90YSBhbmQgZ3JwcXVvdGEgIgotCQkJICJtb3VudCBvcHRpb25zIGlnbm9yZWQuIik7Ci0JCWNsZWFyX29wdChzYiwgVVNSUVVPVEEpOwotCQljbGVhcl9vcHQoc2IsIEdSUFFVT1RBKTsKLQl9IGVsc2UgaWYgKHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gfHwgc2JpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkgeworCS8qCisJICogV2UgZG8gdGhlIHRlc3QgYmVsb3cgb25seSBmb3IgcHJvamVjdCBxdW90YXMuICd1c3JxdW90YScgYW5kCisJICogJ2dycHF1b3RhJyBtb3VudCBvcHRpb25zIGFyZSBhbGxvd2VkIGV2ZW4gd2l0aG91dCBxdW90YSBmZWF0dXJlCisJICogdG8gc3VwcG9ydCBsZWdhY3kgcXVvdGFzIGluIHF1b3RhIGZpbGVzLgorCSAqLworCWlmICh0ZXN0X29wdChzYiwgUFJKUVVPVEEpICYmICFleHQ0X2hhc19mZWF0dXJlX3Byb2plY3Qoc2IpKSB7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIlByb2plY3QgcXVvdGEgZmVhdHVyZSBub3QgZW5hYmxlZC4gIgorCQkJICJDYW5ub3QgZW5hYmxlIHByb2plY3QgcXVvdGEgZW5mb3JjZW1lbnQuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSB8fCBzYmktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSB7CiAJCWlmICh0ZXN0X29wdChzYiwgVVNSUVVPVEEpICYmIHNiaS0+c19xZl9uYW1lc1tVU1JRVU9UQV0pCiAJCQljbGVhcl9vcHQoc2IsIFVTUlFVT1RBKTsKIApAQCAtMjIxMSw2ICsyMjIxLDcgQEAKIAogLyogQ2FsbGVkIGF0IG1vdW50LXRpbWUsIHN1cGVyLWJsb2NrIGlzIGxvY2tlZCAqLwogc3RhdGljIGludCBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICBleHQ0X2ZzYmxrX3Qgc2JfYmxvY2ssCiAJCQkJICBleHQ0X2dyb3VwX3QgKmZpcnN0X25vdF96ZXJvZWQpCiB7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CkBAIC0yMjQxLDYgKzIyNTIsMTEgQEAKIAkJCWdycCA9IGk7CiAKIAkJYmxvY2tfYml0bWFwID0gZXh0NF9ibG9ja19iaXRtYXAoc2IsIGdkcCk7CisJCWlmIChibG9ja19iaXRtYXAgPT0gc2JfYmxvY2spIHsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKKwkJCQkgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJXUgb3ZlcmxhcHMgIgorCQkJCSAic3VwZXJibG9jayIsIGkpOworCQl9CiAJCWlmIChibG9ja19iaXRtYXAgPCBmaXJzdF9ibG9jayB8fCBibG9ja19iaXRtYXAgPiBsYXN0X2Jsb2NrKSB7CiAJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCiAJCQkgICAgICAgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJXUgbm90IGluIGdyb3VwICIKQEAgLTIyNDgsNiArMjI2NCwxMSBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaW5vZGVfYml0bWFwID0gZXh0NF9pbm9kZV9iaXRtYXAoc2IsIGdkcCk7CisJCWlmIChpbm9kZV9iaXRtYXAgPT0gc2JfYmxvY2spIHsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKKwkJCQkgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJXUgb3ZlcmxhcHMgIgorCQkJCSAic3VwZXJibG9jayIsIGkpOworCQl9CiAJCWlmIChpbm9kZV9iaXRtYXAgPCBmaXJzdF9ibG9jayB8fCBpbm9kZV9iaXRtYXAgPiBsYXN0X2Jsb2NrKSB7CiAJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCiAJCQkgICAgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJXUgbm90IGluIGdyb3VwICIKQEAgLTIyNTUsNiArMjI3NiwxMSBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaW5vZGVfdGFibGUgPSBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApOworCQlpZiAoaW5vZGVfdGFibGUgPT0gc2JfYmxvY2spIHsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKKwkJCQkgIklub2RlIHRhYmxlIGZvciBncm91cCAldSBvdmVybGFwcyAiCisJCQkJICJzdXBlcmJsb2NrIiwgaSk7CisJCX0KIAkJaWYgKGlub2RlX3RhYmxlIDwgZmlyc3RfYmxvY2sgfHwKIAkJICAgIGlub2RlX3RhYmxlICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgLSAxID4gbGFzdF9ibG9jaykgewogCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZXh0NF9jaGVja19kZXNjcmlwdG9yczogIgpAQCAtMjcyNSw3ICsyNzUxLDYgQEAKIAlzYiA9IGVsci0+bHJfc3VwZXI7CiAJbmdyb3VwcyA9IEVYVDRfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKIAotCXNiX3N0YXJ0X3dyaXRlKHNiKTsKIAlmb3IgKGdyb3VwID0gZWxyLT5scl9uZXh0X2dyb3VwOyBncm91cCA8IG5ncm91cHM7IGdyb3VwKyspIHsKIAkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXAsIE5VTEwpOwogCQlpZiAoIWdkcCkgewpAQCAtMjc1Miw4ICsyNzc3LDYgQEAKIAkJZWxyLT5scl9uZXh0X3NjaGVkID0gamlmZmllcyArIGVsci0+bHJfdGltZW91dDsKIAkJZWxyLT5scl9uZXh0X2dyb3VwID0gZ3JvdXAgKyAxOwogCX0KLQlzYl9lbmRfd3JpdGUoc2IpOwotCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjgxOCwxOSArMjg0MSw0MyBAQAogCQkJbXV0ZXhfdW5sb2NrKCZlbGktPmxpX2xpc3RfbXR4KTsKIAkJCWdvdG8gZXhpdF90aHJlYWQ7CiAJCX0KLQogCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCAmZWxpLT5saV9yZXF1ZXN0X2xpc3QpIHsKKwkJCWludCBlcnIgPSAwOworCQkJaW50IHByb2dyZXNzID0gMDsKIAkJCWVsciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgZXh0NF9saV9yZXF1ZXN0LAogCQkJCQkgbHJfcmVxdWVzdCk7CiAKLQkJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGVsci0+bHJfbmV4dF9zY2hlZCkpIHsKLQkJCQlpZiAoZXh0NF9ydW5fbGlfcmVxdWVzdChlbHIpICE9IDApIHsKLQkJCQkJLyogZXJyb3IsIHJlbW92ZSB0aGUgbGF6eV9pbml0IGpvYiAqLwotCQkJCQlleHQ0X3JlbW92ZV9saV9yZXF1ZXN0KGVscik7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KKwkJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbHItPmxyX25leHRfc2NoZWQpKSB7CisJCQkJaWYgKHRpbWVfYmVmb3JlKGVsci0+bHJfbmV4dF9zY2hlZCwgbmV4dF93YWtldXApKQorCQkJCQluZXh0X3dha2V1cCA9IGVsci0+bHJfbmV4dF9zY2hlZDsKKwkJCQljb250aW51ZTsKIAkJCX0KLQorCQkJaWYgKGRvd25fcmVhZF90cnlsb2NrKCZlbHItPmxyX3N1cGVyLT5zX3Vtb3VudCkpIHsKKwkJCQlpZiAoc2Jfc3RhcnRfd3JpdGVfdHJ5bG9jayhlbHItPmxyX3N1cGVyKSkgeworCQkJCQlwcm9ncmVzcyA9IDE7CisJCQkJCS8qCisJCQkJCSAqIFdlIGhvbGQgc2ItPnNfdW1vdW50LCBzYiBjYW4gbm90CisJCQkJCSAqIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCwgaXQgaXMKKwkJCQkJICogbm93IHNhZmUgdG8gZHJvcCBsaV9saXN0X210eAorCQkJCQkgKi8KKwkJCQkJbXV0ZXhfdW5sb2NrKCZlbGktPmxpX2xpc3RfbXR4KTsKKwkJCQkJZXJyID0gZXh0NF9ydW5fbGlfcmVxdWVzdChlbHIpOworCQkJCQlzYl9lbmRfd3JpdGUoZWxyLT5scl9zdXBlcik7CisJCQkJCW11dGV4X2xvY2soJmVsaS0+bGlfbGlzdF9tdHgpOworCQkJCQluID0gcG9zLT5uZXh0OworCQkJCX0KKwkJCQl1cF9yZWFkKCgmZWxyLT5scl9zdXBlci0+c191bW91bnQpKTsKKwkJCX0KKwkJCS8qIGVycm9yLCByZW1vdmUgdGhlIGxhenlfaW5pdCBqb2IgKi8KKwkJCWlmIChlcnIpIHsKKwkJCQlleHQ0X3JlbW92ZV9saV9yZXF1ZXN0KGVscik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXByb2dyZXNzKSB7CisJCQkJZWxyLT5scl9uZXh0X3NjaGVkID0gamlmZmllcyArCisJCQkJCShwcmFuZG9tX3UzMigpCisJCQkJCSAlIChFWFQ0X0RFRl9MSV9NQVhfU1RBUlRfREVMQVkgKiBIWikpOworCQkJfQogCQkJaWYgKHRpbWVfYmVmb3JlKGVsci0+bHJfbmV4dF9zY2hlZCwgbmV4dF93YWtldXApKQogCQkJCW5leHRfd2FrZXVwID0gZWxyLT5scl9uZXh0X3NjaGVkOwogCQl9CkBAIC0zMTYzLDYgKzMyMTAsOCBAQAogewogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKKwlzdHJ1Y3QgaW5vZGUgKmpfaW5vZGU7CisJdW5zaWduZWQgaW50IGpfYmxvY2tzLCBqX2ludW0gPSBsZTMyX3RvX2NwdShlcy0+c19qb3VybmFsX2ludW0pOwogCWV4dDRfZ3JvdXBfdCBpLCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKIAlleHQ0X2ZzYmxrX3Qgb3ZlcmhlYWQgPSAwOwogCWNoYXIgKmJ1ZiA9IChjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfTk9GUyk7CkBAIC0zMTkzLDEwICszMjQyLDIzIEBACiAJCQltZW1zZXQoYnVmLCAwLCBQQUdFX1NJWkUpOwogCQljb25kX3Jlc2NoZWQoKTsKIAl9Ci0JLyogQWRkIHRoZSBpbnRlcm5hbCBqb3VybmFsIGJsb2NrcyBhcyB3ZWxsICovCisKKwkvKgorCSAqIEFkZCB0aGUgaW50ZXJuYWwgam91cm5hbCBibG9ja3Mgd2hldGhlciB0aGUgam91cm5hbCBoYXMgYmVlbgorCSAqIGxvYWRlZCBvciBub3QKKwkgKi8KIAlpZiAoc2JpLT5zX2pvdXJuYWwgJiYgIXNiaS0+am91cm5hbF9iZGV2KQogCQlvdmVyaGVhZCArPSBFWFQ0X05VTV9CMkMoc2JpLCBzYmktPnNfam91cm5hbC0+al9tYXhsZW4pOwotCisJZWxzZSBpZiAoZXh0NF9oYXNfZmVhdHVyZV9qb3VybmFsKHNiKSAmJiAhc2JpLT5zX2pvdXJuYWwpIHsKKwkJal9pbm9kZSA9IGV4dDRfZ2V0X2pvdXJuYWxfaW5vZGUoc2IsIGpfaW51bSk7CisJCWlmIChqX2lub2RlKSB7CisJCQlqX2Jsb2NrcyA9IGpfaW5vZGUtPmlfc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwkJCW92ZXJoZWFkICs9IEVYVDRfTlVNX0IyQyhzYmksIGpfYmxvY2tzKTsKKwkJCWlwdXQoal9pbm9kZSk7CisJCX0gZWxzZSB7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJjYW4ndCBnZXQgam91cm5hbCBzaXplIik7CisJCX0KKwl9CiAJc2JpLT5zX292ZXJoZWFkID0gb3ZlcmhlYWQ7CiAJc21wX3dtYigpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgYnVmKTsKQEAgLTM3NTcsNyArMzgxOSw3IEBACiAJCQlnb3RvIGZhaWxlZF9tb3VudDI7CiAJCX0KIAl9Ci0JaWYgKCFleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzKHNiLCAmZmlyc3Rfbm90X3plcm9lZCkpIHsKKwlpZiAoIWV4dDRfY2hlY2tfZGVzY3JpcHRvcnMoc2IsIGxvZ2ljYWxfc2JfYmxvY2ssICZmaXJzdF9ub3RfemVyb2VkKSkgewogCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJncm91cCBkZXNjcmlwdG9ycyBjb3JydXB0ZWQhIik7CiAJCXJldCA9IC1FRlNDT1JSVVBURUQ7CiAJCWdvdG8gZmFpbGVkX21vdW50MjsKQEAgLTQxOTIsMTggKzQyNTQsMTYgQEAKIAl3cml0ZV91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiB9CiAKLXN0YXRpYyBqb3VybmFsX3QgKmV4dDRfZ2V0X2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQkgICB1bnNpZ25lZCBpbnQgam91cm5hbF9pbnVtKQorc3RhdGljIHN0cnVjdCBpbm9kZSAqZXh0NF9nZXRfam91cm5hbF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBqb3VybmFsX2ludW0pCiB7CiAJc3RydWN0IGlub2RlICpqb3VybmFsX2lub2RlOwotCWpvdXJuYWxfdCAqam91cm5hbDsKIAotCUJVR19PTighZXh0NF9oYXNfZmVhdHVyZV9qb3VybmFsKHNiKSk7Ci0KLQkvKiBGaXJzdCwgdGVzdCBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIHZhbGlkIGlub2RlIG9uIGRpc2suICBCYWQKLQkgKiB0aGluZ3MgaGFwcGVuIGlmIHdlIGlnZXQoKSBhbiB1bnVzZWQgaW5vZGUsIGFzIHRoZSBzdWJzZXF1ZW50Ci0JICogaXB1dCgpIHdpbGwgdHJ5IHRvIGRlbGV0ZSBpdC4gKi8KLQorCS8qCisJICogVGVzdCBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIHZhbGlkIGlub2RlIG9uIGRpc2suICBCYWQgdGhpbmdzCisJICogaGFwcGVuIGlmIHdlIGlnZXQoKSBhbiB1bnVzZWQgaW5vZGUsIGFzIHRoZSBzdWJzZXF1ZW50IGlwdXQoKQorCSAqIHdpbGwgdHJ5IHRvIGRlbGV0ZSBpdC4KKwkgKi8KIAlqb3VybmFsX2lub2RlID0gZXh0NF9pZ2V0KHNiLCBqb3VybmFsX2ludW0pOwogCWlmIChJU19FUlIoam91cm5hbF9pbm9kZSkpIHsKIAkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAibm8gam91cm5hbCBmb3VuZCIpOwpAQCAtNDIyMyw2ICs0MjgzLDIwIEBACiAJCWlwdXQoam91cm5hbF9pbm9kZSk7CiAJCXJldHVybiBOVUxMOwogCX0KKwlyZXR1cm4gam91cm5hbF9pbm9kZTsKK30KKworc3RhdGljIGpvdXJuYWxfdCAqZXh0NF9nZXRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgIHVuc2lnbmVkIGludCBqb3VybmFsX2ludW0pCit7CisJc3RydWN0IGlub2RlICpqb3VybmFsX2lub2RlOworCWpvdXJuYWxfdCAqam91cm5hbDsKKworCUJVR19PTighZXh0NF9oYXNfZmVhdHVyZV9qb3VybmFsKHNiKSk7CisKKwlqb3VybmFsX2lub2RlID0gZXh0NF9nZXRfam91cm5hbF9pbm9kZShzYiwgam91cm5hbF9pbnVtKTsKKwlpZiAoIWpvdXJuYWxfaW5vZGUpCisJCXJldHVybiBOVUxMOwogCiAJam91cm5hbCA9IGpiZDJfam91cm5hbF9pbml0X2lub2RlKGpvdXJuYWxfaW5vZGUpOwogCWlmICgham91cm5hbCkgewpAQCAtNTIzNCwxMiArNTMwOCwxOCBAQAogCQlsZTMyX3RvX2NwdShFWFQ0X1NCKHNiKS0+c19lcy0+c19ncnBfcXVvdGFfaW51bSksCiAJCWxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX3Byal9xdW90YV9pbnVtKQogCX07CisJYm9vbCBxdW90YV9tb3B0W0VYVDRfTUFYUVVPVEFTXSA9IHsKKwkJdGVzdF9vcHQoc2IsIFVTUlFVT1RBKSwKKwkJdGVzdF9vcHQoc2IsIEdSUFFVT1RBKSwKKwkJdGVzdF9vcHQoc2IsIFBSSlFVT1RBKSwKKwl9OwogCiAJc2JfZHFvcHQoc2IpLT5mbGFncyB8PSBEUVVPVF9RVU9UQV9TWVNfRklMRTsKIAlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgRVhUNF9NQVhRVU9UQVM7IHR5cGUrKykgewogCQlpZiAocWZfaW51bXNbdHlwZV0pIHsKIAkJCWVyciA9IGV4dDRfcXVvdGFfZW5hYmxlKHNiLCB0eXBlLCBRRk1UX1ZGU19WMSwKLQkJCQkJCURRVU9UX1VTQUdFX0VOQUJMRUQpOworCQkJCURRVU9UX1VTQUdFX0VOQUJMRUQgfAorCQkJCShxdW90YV9tb3B0W3R5cGVdID8gRFFVT1RfTElNSVRTX0VOQUJMRUQgOiAwKSk7CiAJCQlpZiAoZXJyKSB7CiAJCQkJZXh0NF93YXJuaW5nKHNiLAogCQkJCQkiRmFpbGVkIHRvIGVuYWJsZSBxdW90YSB0cmFja2luZyAiCmRpZmYgLS1naXQgYS9mcy9leHQ0L3N5bWxpbmsuYyBiL2ZzL2V4dDQvc3ltbGluay5jCmluZGV4IDRkODNkOWUuLmZkZjFjNjEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvc3ltbGluay5jCisrKyBiL2ZzL2V4dDQvc3ltbGluay5jCkBAIC0zMCw3ICszMCw2IEBACiAJY2hhciAqY2FkZHIsICpwYWRkciA9IE5VTEw7CiAJc3RydWN0IGZzY3J5cHRfc3RyIGNzdHIsIHBzdHI7CiAJc3RydWN0IGZzY3J5cHRfc3ltbGlua19kYXRhICpzZDsKLQlsb2ZmX3Qgc2l6ZSA9IG1pbl90KGxvZmZfdCwgaV9zaXplX3JlYWQoaW5vZGUpLCBQQUdFX1NJWkUgLSAxKTsKIAlpbnQgcmVzOwogCXUzMiBtYXhfc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIApAQCAtNDksNyArNDgsNiBAQAogCQlpZiAoSVNfRVJSKGNwYWdlKSkKIAkJCXJldHVybiBFUlJfQ0FTVChjcGFnZSk7CiAJCWNhZGRyID0gcGFnZV9hZGRyZXNzKGNwYWdlKTsKLQkJY2FkZHJbc2l6ZV0gPSAwOwogCX0KIAogCS8qIFN5bWxpbmsgaXMgZW5jcnlwdGVkICovCkBAIC02NSwxNiArNjMsMTQgQEAKIAlyZXMgPSBmc2NyeXB0X2ZuYW1lX2FsbG9jX2J1ZmZlcihpbm9kZSwgY3N0ci5sZW4sICZwc3RyKTsKIAlpZiAocmVzKQogCQlnb3RvIGVycm91dDsKLQotCXJlcyA9IGZzY3J5cHRfZm5hbWVfZGlza190b191c3IoaW5vZGUsIDAsIDAsICZjc3RyLCAmcHN0cik7Ci0JaWYgKHJlcyA8IDApCi0JCWdvdG8gZXJyb3V0OwotCiAJcGFkZHIgPSBwc3RyLm5hbWU7CiAKKwlyZXMgPSBmc2NyeXB0X2ZuYW1lX2Rpc2tfdG9fdXNyKGlub2RlLCAwLCAwLCAmY3N0ciwgJnBzdHIpOworCWlmIChyZXMpCisJCWdvdG8gZXJyb3V0OworCiAJLyogTnVsbC10ZXJtaW5hdGUgdGhlIG5hbWUgKi8KLQlpZiAocmVzIDw9IHBzdHIubGVuKQotCQlwYWRkcltyZXNdID0gJ1wwJzsKKwlwYWRkcltwc3RyLmxlbl0gPSAnXDAnOwogCWlmIChjcGFnZSkKIAkJcHV0X3BhZ2UoY3BhZ2UpOwogCXNldF9kZWxheWVkX2NhbGwoZG9uZSwga2ZyZWVfbGluaywgcGFkZHIpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC94YXR0ci5jIGIvZnMvZXh0NC94YXR0ci5jCmluZGV4IDM5ZTljZmIuLmMxNWQ2MzMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQveGF0dHIuYworKysgYi9mcy9leHQ0L3hhdHRyLmMKQEAgLTE5OSw2ICsxOTksOCBAQAogCX0KIAogCXdoaWxlICghSVNfTEFTVF9FTlRSWShlbnRyeSkpIHsKKwkJaWYgKGVudHJ5LT5lX3ZhbHVlX2Jsb2NrICE9IDApCisJCQlyZXR1cm4gLUVGU0NPUlJVUFRFRDsKIAkJaWYgKGVudHJ5LT5lX3ZhbHVlX3NpemUgIT0gMCAmJgogCQkgICAgKHZhbHVlX3N0YXJ0ICsgbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcykgPAogCQkgICAgICh2b2lkICopZSArIHNpemVvZihfX3UzMikgfHwKQEAgLTY0MSw3ICs2NDMsNyBAQAogCQkJCSAgICBzaXplX3QgKm1pbl9vZmZzLCB2b2lkICpiYXNlLCBpbnQgKnRvdGFsKQogewogCWZvciAoOyAhSVNfTEFTVF9FTlRSWShsYXN0KTsgbGFzdCA9IEVYVDRfWEFUVFJfTkVYVChsYXN0KSkgewotCQlpZiAoIWxhc3QtPmVfdmFsdWVfYmxvY2sgJiYgbGFzdC0+ZV92YWx1ZV9zaXplKSB7CisJCWlmIChsYXN0LT5lX3ZhbHVlX3NpemUpIHsKIAkJCXNpemVfdCBvZmZzID0gbGUxNl90b19jcHUobGFzdC0+ZV92YWx1ZV9vZmZzKTsKIAkJCWlmIChvZmZzIDwgKm1pbl9vZmZzKQogCQkJCSptaW5fb2ZmcyA9IG9mZnM7CkBAIC02NjEsNyArNjYzLDcgQEAKIAkvKiBDb21wdXRlIG1pbl9vZmZzIGFuZCBsYXN0LiAqLwogCWxhc3QgPSBzLT5maXJzdDsKIAlmb3IgKDsgIUlTX0xBU1RfRU5UUlkobGFzdCk7IGxhc3QgPSBFWFQ0X1hBVFRSX05FWFQobGFzdCkpIHsKLQkJaWYgKCFsYXN0LT5lX3ZhbHVlX2Jsb2NrICYmIGxhc3QtPmVfdmFsdWVfc2l6ZSkgeworCQlpZiAobGFzdC0+ZV92YWx1ZV9zaXplKSB7CiAJCQlzaXplX3Qgb2ZmcyA9IGxlMTZfdG9fY3B1KGxhc3QtPmVfdmFsdWVfb2Zmcyk7CiAJCQlpZiAob2ZmcyA8IG1pbl9vZmZzKQogCQkJCW1pbl9vZmZzID0gb2ZmczsKQEAgLTY2OSw3ICs2NzEsNyBAQAogCX0KIAlmcmVlID0gbWluX29mZnMgLSAoKHZvaWQgKilsYXN0IC0gcy0+YmFzZSkgLSBzaXplb2YoX191MzIpOwogCWlmICghcy0+bm90X2ZvdW5kKSB7Ci0JCWlmICghcy0+aGVyZS0+ZV92YWx1ZV9ibG9jayAmJiBzLT5oZXJlLT5lX3ZhbHVlX3NpemUpIHsKKwkJaWYgKHMtPmhlcmUtPmVfdmFsdWVfc2l6ZSkgewogCQkJc2l6ZV90IHNpemUgPSBsZTMyX3RvX2NwdShzLT5oZXJlLT5lX3ZhbHVlX3NpemUpOwogCQkJZnJlZSArPSBFWFQ0X1hBVFRSX1NJWkUoc2l6ZSk7CiAJCX0KQEAgLTY5MSw3ICs2OTMsNyBAQAogCQlzLT5oZXJlLT5lX25hbWVfbGVuID0gbmFtZV9sZW47CiAJCW1lbWNweShzLT5oZXJlLT5lX25hbWUsIGktPm5hbWUsIG5hbWVfbGVuKTsKIAl9IGVsc2UgewotCQlpZiAoIXMtPmhlcmUtPmVfdmFsdWVfYmxvY2sgJiYgcy0+aGVyZS0+ZV92YWx1ZV9zaXplKSB7CisJCWlmIChzLT5oZXJlLT5lX3ZhbHVlX3NpemUpIHsKIAkJCXZvaWQgKmZpcnN0X3ZhbCA9IHMtPmJhc2UgKyBtaW5fb2ZmczsKIAkJCXNpemVfdCBvZmZzID0gbGUxNl90b19jcHUocy0+aGVyZS0+ZV92YWx1ZV9vZmZzKTsKIAkJCXZvaWQgKnZhbCA9IHMtPmJhc2UgKyBvZmZzOwpAQCAtNzI1LDggKzcyNyw3IEBACiAJCQlsYXN0ID0gcy0+Zmlyc3Q7CiAJCQl3aGlsZSAoIUlTX0xBU1RfRU5UUlkobGFzdCkpIHsKIAkJCQlzaXplX3QgbyA9IGxlMTZfdG9fY3B1KGxhc3QtPmVfdmFsdWVfb2Zmcyk7Ci0JCQkJaWYgKCFsYXN0LT5lX3ZhbHVlX2Jsb2NrICYmCi0JCQkJICAgIGxhc3QtPmVfdmFsdWVfc2l6ZSAmJiBvIDwgb2ZmcykKKwkJCQlpZiAobGFzdC0+ZV92YWx1ZV9zaXplICYmIG8gPCBvZmZzKQogCQkJCQlsYXN0LT5lX3ZhbHVlX29mZnMgPQogCQkJCQkJY3B1X3RvX2xlMTYobyArIHNpemUpOwogCQkJCWxhc3QgPSBFWFQ0X1hBVFRSX05FWFQobGFzdCk7CkBAIC0xMzE4LDE4ICsxMzE5LDE5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGV4dDRfeGF0dHJfc2hpZnRfZW50cmllcyhzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqZW50cnksCiAJCQkJICAgICBpbnQgdmFsdWVfb2Zmc19zaGlmdCwgdm9pZCAqdG8sCi0JCQkJICAgICB2b2lkICpmcm9tLCBzaXplX3QgbiwgaW50IGJsb2Nrc2l6ZSkKKwkJCQkgICAgIHZvaWQgKmZyb20sIHNpemVfdCBuKQogewogCXN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICpsYXN0ID0gZW50cnk7CiAJaW50IG5ld19vZmZzOwogCisJLyogV2UgYWx3YXlzIHNoaWZ0IHhhdHRyIGhlYWRlcnMgZnVydGhlciB0aHVzIG9mZnNldHMgZ2V0IGxvd2VyICovCisJQlVHX09OKHZhbHVlX29mZnNfc2hpZnQgPiAwKTsKKwogCS8qIEFkanVzdCB0aGUgdmFsdWUgb2Zmc2V0cyBvZiB0aGUgZW50cmllcyAqLwogCWZvciAoOyAhSVNfTEFTVF9FTlRSWShsYXN0KTsgbGFzdCA9IEVYVDRfWEFUVFJfTkVYVChsYXN0KSkgewotCQlpZiAoIWxhc3QtPmVfdmFsdWVfYmxvY2sgJiYgbGFzdC0+ZV92YWx1ZV9zaXplKSB7CisJCWlmIChsYXN0LT5lX3ZhbHVlX3NpemUpIHsKIAkJCW5ld19vZmZzID0gbGUxNl90b19jcHUobGFzdC0+ZV92YWx1ZV9vZmZzKSArCiAJCQkJCQkJdmFsdWVfb2Zmc19zaGlmdDsKLQkJCUJVR19PTihuZXdfb2ZmcyArIGxlMzJfdG9fY3B1KGxhc3QtPmVfdmFsdWVfc2l6ZSkKLQkJCQkgPiBibG9ja3NpemUpOwogCQkJbGFzdC0+ZV92YWx1ZV9vZmZzID0gY3B1X3RvX2xlMTYobmV3X29mZnMpOwogCQl9CiAJfQpAQCAtMTMzOCw2ICsxMzQwLDE0MSBAQAogfQogCiAvKgorICogTW92ZSB4YXR0ciBwb2ludGVkIHRvIGJ5ICdlbnRyeScgZnJvbSBpbm9kZSBpbnRvIGV4dGVybmFsIHhhdHRyIGJsb2NrCisgKi8KK3N0YXRpYyBpbnQgZXh0NF94YXR0cl9tb3ZlX3RvX2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgIHN0cnVjdCBleHQ0X2lub2RlICpyYXdfaW5vZGUsCisJCQkJICAgIHN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kICppcyA9IE5VTEw7CisJc3RydWN0IGV4dDRfeGF0dHJfYmxvY2tfZmluZCAqYnMgPSBOVUxMOworCWNoYXIgKmJ1ZmZlciA9IE5VTEwsICpiX2VudHJ5X25hbWUgPSBOVUxMOworCXNpemVfdCB2YWx1ZV9vZmZzLCB2YWx1ZV9zaXplOworCXN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaSA9IHsKKwkJLnZhbHVlID0gTlVMTCwKKwkJLnZhbHVlX2xlbiA9IDAsCisJCS5uYW1lX2luZGV4ID0gZW50cnktPmVfbmFtZV9pbmRleCwKKwl9OworCXN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2hlYWRlciAqaGVhZGVyID0gSUhEUihpbm9kZSwgcmF3X2lub2RlKTsKKwlpbnQgZXJyb3I7CisKKwl2YWx1ZV9vZmZzID0gbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2Zmcyk7CisJdmFsdWVfc2l6ZSA9IGxlMzJfdG9fY3B1KGVudHJ5LT5lX3ZhbHVlX3NpemUpOworCisJaXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kKSwgR0ZQX05PRlMpOworCWJzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGV4dDRfeGF0dHJfYmxvY2tfZmluZCksIEdGUF9OT0ZTKTsKKwlidWZmZXIgPSBrbWFsbG9jKHZhbHVlX3NpemUsIEdGUF9OT0ZTKTsKKwliX2VudHJ5X25hbWUgPSBrbWFsbG9jKGVudHJ5LT5lX25hbWVfbGVuICsgMSwgR0ZQX05PRlMpOworCWlmICghaXMgfHwgIWJzIHx8ICFidWZmZXIgfHwgIWJfZW50cnlfbmFtZSkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCWlzLT5zLm5vdF9mb3VuZCA9IC1FTk9EQVRBOworCWJzLT5zLm5vdF9mb3VuZCA9IC1FTk9EQVRBOworCWlzLT5pbG9jLmJoID0gTlVMTDsKKwlicy0+YmggPSBOVUxMOworCisJLyogU2F2ZSB0aGUgZW50cnkgbmFtZSBhbmQgdGhlIGVudHJ5IHZhbHVlICovCisJbWVtY3B5KGJ1ZmZlciwgKHZvaWQgKilJRklSU1QoaGVhZGVyKSArIHZhbHVlX29mZnMsIHZhbHVlX3NpemUpOworCW1lbWNweShiX2VudHJ5X25hbWUsIGVudHJ5LT5lX25hbWUsIGVudHJ5LT5lX25hbWVfbGVuKTsKKwliX2VudHJ5X25hbWVbZW50cnktPmVfbmFtZV9sZW5dID0gJ1wwJzsKKwlpLm5hbWUgPSBiX2VudHJ5X25hbWU7CisKKwllcnJvciA9IGV4dDRfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlzLT5pbG9jKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsICZpLCBpcyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCS8qIFJlbW92ZSB0aGUgY2hvc2VuIGVudHJ5IGZyb20gdGhlIGlub2RlICovCisJZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X3NldChoYW5kbGUsIGlub2RlLCAmaSwgaXMpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlpLm5hbWUgPSBiX2VudHJ5X25hbWU7CisJaS52YWx1ZSA9IGJ1ZmZlcjsKKwlpLnZhbHVlX2xlbiA9IHZhbHVlX3NpemU7CisJZXJyb3IgPSBleHQ0X3hhdHRyX2Jsb2NrX2ZpbmQoaW5vZGUsICZpLCBicyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCS8qIEFkZCBlbnRyeSB3aGljaCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBpbm9kZSBpbnRvIHRoZSBibG9jayAqLworCWVycm9yID0gZXh0NF94YXR0cl9ibG9ja19zZXQoaGFuZGxlLCBpbm9kZSwgJmksIGJzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWVycm9yID0gMDsKK291dDoKKwlrZnJlZShiX2VudHJ5X25hbWUpOworCWtmcmVlKGJ1ZmZlcik7CisJaWYgKGlzKQorCQlicmVsc2UoaXMtPmlsb2MuYmgpOworCWtmcmVlKGlzKTsKKwlrZnJlZShicyk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgZXh0NF94YXR0cl9tYWtlX2lub2RlX3NwYWNlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHN0cnVjdCBleHQ0X2lub2RlICpyYXdfaW5vZGUsCisJCQkJICAgICAgIGludCBpc2l6ZV9kaWZmLCBzaXplX3QgaWZyZWUsCisJCQkJICAgICAgIHNpemVfdCBiZnJlZSwgaW50ICp0b3RhbF9pbm8pCit7CisJc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXIgPSBJSERSKGlub2RlLCByYXdfaW5vZGUpOworCXN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICpzbWFsbF9lbnRyeTsKKwlzdHJ1Y3QgZXh0NF94YXR0cl9lbnRyeSAqZW50cnk7CisJc3RydWN0IGV4dDRfeGF0dHJfZW50cnkgKmxhc3Q7CisJdW5zaWduZWQgaW50IGVudHJ5X3NpemU7CS8qIEVBIGVudHJ5IHNpemUgKi8KKwl1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZTsJLyogRUEgZW50cnkgc2l6ZSArIHZhbHVlIHNpemUgKi8KKwl1bnNpZ25lZCBpbnQgbWluX3RvdGFsX3NpemU7CisJaW50IGVycm9yOworCisJd2hpbGUgKGlzaXplX2RpZmYgPiBpZnJlZSkgeworCQllbnRyeSA9IE5VTEw7CisJCXNtYWxsX2VudHJ5ID0gTlVMTDsKKwkJbWluX3RvdGFsX3NpemUgPSB+MFU7CisJCWxhc3QgPSBJRklSU1QoaGVhZGVyKTsKKwkJLyogRmluZCB0aGUgZW50cnkgYmVzdCBzdWl0ZWQgdG8gYmUgcHVzaGVkIGludG8gRUEgYmxvY2sgKi8KKwkJZm9yICg7ICFJU19MQVNUX0VOVFJZKGxhc3QpOyBsYXN0ID0gRVhUNF9YQVRUUl9ORVhUKGxhc3QpKSB7CisJCQl0b3RhbF9zaXplID0KKwkJCUVYVDRfWEFUVFJfU0laRShsZTMyX3RvX2NwdShsYXN0LT5lX3ZhbHVlX3NpemUpKSArCisJCQkJCUVYVDRfWEFUVFJfTEVOKGxhc3QtPmVfbmFtZV9sZW4pOworCQkJaWYgKHRvdGFsX3NpemUgPD0gYmZyZWUgJiYKKwkJCSAgICB0b3RhbF9zaXplIDwgbWluX3RvdGFsX3NpemUpIHsKKwkJCQlpZiAodG90YWxfc2l6ZSArIGlmcmVlIDwgaXNpemVfZGlmZikgeworCQkJCQlzbWFsbF9lbnRyeSA9IGxhc3Q7CisJCQkJfSBlbHNlIHsKKwkJCQkJZW50cnkgPSBsYXN0OworCQkJCQltaW5fdG90YWxfc2l6ZSA9IHRvdGFsX3NpemU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJCWlmIChzbWFsbF9lbnRyeSA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PU1BDOworCQkJZW50cnkgPSBzbWFsbF9lbnRyeTsKKwkJfQorCisJCWVudHJ5X3NpemUgPSBFWFQ0X1hBVFRSX0xFTihlbnRyeS0+ZV9uYW1lX2xlbik7CisJCXRvdGFsX3NpemUgPSBlbnRyeV9zaXplICsKKwkJCUVYVDRfWEFUVFJfU0laRShsZTMyX3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9zaXplKSk7CisJCWVycm9yID0gZXh0NF94YXR0cl9tb3ZlX3RvX2Jsb2NrKGhhbmRsZSwgaW5vZGUsIHJhd19pbm9kZSwKKwkJCQkJCSBlbnRyeSk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKworCQkqdG90YWxfaW5vIC09IGVudHJ5X3NpemU7CisJCWlmcmVlICs9IHRvdGFsX3NpemU7CisJCWJmcmVlIC09IHRvdGFsX3NpemU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBFeHBhbmQgYW4gaW5vZGUgYnkgbmV3X2V4dHJhX2lzaXplIGJ5dGVzIHdoZW4gRUFzIGFyZSBwcmVzZW50LgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUuCiAgKi8KQEAgLTEzNDUsNTQgKzE0ODIsNDQgQEAKIAkJCSAgICAgICBzdHJ1Y3QgZXh0NF9pbm9kZSAqcmF3X2lub2RlLCBoYW5kbGVfdCAqaGFuZGxlKQogewogCXN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2hlYWRlciAqaGVhZGVyOwotCXN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICplbnRyeSwgKmxhc3QsICpmaXJzdDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF94YXR0cl9pYm9keV9maW5kICppcyA9IE5VTEw7Ci0Jc3RydWN0IGV4dDRfeGF0dHJfYmxvY2tfZmluZCAqYnMgPSBOVUxMOwotCWNoYXIgKmJ1ZmZlciA9IE5VTEwsICpiX2VudHJ5X25hbWUgPSBOVUxMOwotCXNpemVfdCBtaW5fb2ZmcywgZnJlZTsKKwlzaXplX3QgbWluX29mZnM7CisJc2l6ZV90IGlmcmVlLCBiZnJlZTsKIAlpbnQgdG90YWxfaW5vOwotCXZvaWQgKmJhc2UsICpzdGFydCwgKmVuZDsKLQlpbnQgZXh0cmFfaXNpemUgPSAwLCBlcnJvciA9IDAsIHRyaWVkX21pbl9leHRyYV9pc2l6ZSA9IDA7CisJdm9pZCAqYmFzZSwgKmVuZDsKKwlpbnQgZXJyb3IgPSAwLCB0cmllZF9taW5fZXh0cmFfaXNpemUgPSAwOwogCWludCBzX21pbl9leHRyYV9pc2l6ZSA9IGxlMTZfdG9fY3B1KEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2VzLT5zX21pbl9leHRyYV9pc2l6ZSk7CisJaW50IGlzaXplX2RpZmY7CS8qIEhvdyBtdWNoIGRvIHdlIG5lZWQgdG8gZ3JvdyBpX2V4dHJhX2lzaXplICovCiAKIAlkb3duX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT54YXR0cl9zZW0pOworCS8qCisJICogU2V0IEVYVDRfU1RBVEVfTk9fRVhQQU5EIHRvIGF2b2lkIHJlY3Vyc2lvbiB3aGVuIG1hcmtpbmcgaW5vZGUgZGlydHkKKwkgKi8KKwlleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9OT19FWFBBTkQpOwogcmV0cnk6Ci0JaWYgKEVYVDRfSShpbm9kZSktPmlfZXh0cmFfaXNpemUgPj0gbmV3X2V4dHJhX2lzaXplKSB7Ci0JCXVwX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT54YXR0cl9zZW0pOwotCQlyZXR1cm4gMDsKLQl9CisJaXNpemVfZGlmZiA9IG5ld19leHRyYV9pc2l6ZSAtIEVYVDRfSShpbm9kZSktPmlfZXh0cmFfaXNpemU7CisJaWYgKEVYVDRfSShpbm9kZSktPmlfZXh0cmFfaXNpemUgPj0gbmV3X2V4dHJhX2lzaXplKQorCQlnb3RvIG91dDsKIAogCWhlYWRlciA9IElIRFIoaW5vZGUsIHJhd19pbm9kZSk7Ci0JZW50cnkgPSBJRklSU1QoaGVhZGVyKTsKIAogCS8qCiAJICogQ2hlY2sgaWYgZW5vdWdoIGZyZWUgc3BhY2UgaXMgYXZhaWxhYmxlIGluIHRoZSBpbm9kZSB0byBzaGlmdCB0aGUKIAkgKiBlbnRyaWVzIGFoZWFkIGJ5IG5ld19leHRyYV9pc2l6ZS4KIAkgKi8KIAotCWJhc2UgPSBzdGFydCA9IGVudHJ5OworCWJhc2UgPSBJRklSU1QoaGVhZGVyKTsKIAllbmQgPSAodm9pZCAqKXJhd19pbm9kZSArIEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2lub2RlX3NpemU7CiAJbWluX29mZnMgPSBlbmQgLSBiYXNlOwotCWxhc3QgPSBlbnRyeTsKIAl0b3RhbF9pbm8gPSBzaXplb2Yoc3RydWN0IGV4dDRfeGF0dHJfaWJvZHlfaGVhZGVyKTsKIAogCWVycm9yID0geGF0dHJfY2hlY2tfaW5vZGUoaW5vZGUsIGhlYWRlciwgZW5kKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gY2xlYW51cDsKIAotCWZyZWUgPSBleHQ0X3hhdHRyX2ZyZWVfc3BhY2UobGFzdCwgJm1pbl9vZmZzLCBiYXNlLCAmdG90YWxfaW5vKTsKLQlpZiAoZnJlZSA+PSBuZXdfZXh0cmFfaXNpemUpIHsKLQkJZW50cnkgPSBJRklSU1QoaGVhZGVyKTsKLQkJZXh0NF94YXR0cl9zaGlmdF9lbnRyaWVzKGVudHJ5LAlFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplCi0JCQkJLSBuZXdfZXh0cmFfaXNpemUsICh2b2lkICopcmF3X2lub2RlICsKLQkJCQlFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkUgKyBuZXdfZXh0cmFfaXNpemUsCi0JCQkJKHZvaWQgKiloZWFkZXIsIHRvdGFsX2lubywKLQkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwotCQlFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplID0gbmV3X2V4dHJhX2lzaXplOwotCQllcnJvciA9IDA7Ci0JCWdvdG8gY2xlYW51cDsKLQl9CisJaWZyZWUgPSBleHQ0X3hhdHRyX2ZyZWVfc3BhY2UoYmFzZSwgJm1pbl9vZmZzLCBiYXNlLCAmdG90YWxfaW5vKTsKKwlpZiAoaWZyZWUgPj0gaXNpemVfZGlmZikKKwkJZ290byBzaGlmdDsKIAogCS8qCiAJICogRW5vdWdoIGZyZWUgc3BhY2UgaXNuJ3QgYXZhaWxhYmxlIGluIHRoZSBpbm9kZSwgY2hlY2sgaWYKQEAgLTE0MTAsMTU4ICsxNTM3LDU2IEBACiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAkJYmFzZSA9IEJIRFIoYmgpOwotCQlmaXJzdCA9IEJGSVJTVChiaCk7CiAJCWVuZCA9IGJoLT5iX2RhdGEgKyBiaC0+Yl9zaXplOwogCQltaW5fb2ZmcyA9IGVuZCAtIGJhc2U7Ci0JCWZyZWUgPSBleHQ0X3hhdHRyX2ZyZWVfc3BhY2UoZmlyc3QsICZtaW5fb2ZmcywgYmFzZSwgTlVMTCk7Ci0JCWlmIChmcmVlIDwgbmV3X2V4dHJhX2lzaXplKSB7CisJCWJmcmVlID0gZXh0NF94YXR0cl9mcmVlX3NwYWNlKEJGSVJTVChiaCksICZtaW5fb2ZmcywgYmFzZSwKKwkJCQkJICAgICAgTlVMTCk7CisJCWlmIChiZnJlZSArIGlmcmVlIDwgaXNpemVfZGlmZikgewogCQkJaWYgKCF0cmllZF9taW5fZXh0cmFfaXNpemUgJiYgc19taW5fZXh0cmFfaXNpemUpIHsKIAkJCQl0cmllZF9taW5fZXh0cmFfaXNpemUrKzsKIAkJCQluZXdfZXh0cmFfaXNpemUgPSBzX21pbl9leHRyYV9pc2l6ZTsKIAkJCQlicmVsc2UoYmgpOwogCQkJCWdvdG8gcmV0cnk7CiAJCQl9Ci0JCQllcnJvciA9IC0xOworCQkJZXJyb3IgPSAtRU5PU1BDOwogCQkJZ290byBjbGVhbnVwOwogCQl9CiAJfSBlbHNlIHsKLQkJZnJlZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJYmZyZWUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAJfQogCi0Jd2hpbGUgKG5ld19leHRyYV9pc2l6ZSA+IDApIHsKLQkJc2l6ZV90IG9mZnMsIHNpemUsIGVudHJ5X3NpemU7Ci0JCXN0cnVjdCBleHQ0X3hhdHRyX2VudHJ5ICpzbWFsbF9lbnRyeSA9IE5VTEw7Ci0JCXN0cnVjdCBleHQ0X3hhdHRyX2luZm8gaSA9IHsKLQkJCS52YWx1ZSA9IE5VTEwsCi0JCQkudmFsdWVfbGVuID0gMCwKLQkJfTsKLQkJdW5zaWduZWQgaW50IHRvdGFsX3NpemU7ICAvKiBFQSBlbnRyeSBzaXplICsgdmFsdWUgc2l6ZSAqLwotCQl1bnNpZ25lZCBpbnQgc2hpZnRfYnl0ZXM7IC8qIE5vLiBvZiBieXRlcyB0byBzaGlmdCBFQXMgYnk/ICovCi0JCXVuc2lnbmVkIGludCBtaW5fdG90YWxfc2l6ZSA9IH4wVTsKLQotCQlpcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBleHQ0X3hhdHRyX2lib2R5X2ZpbmQpLCBHRlBfTk9GUyk7Ci0JCWJzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGV4dDRfeGF0dHJfYmxvY2tfZmluZCksIEdGUF9OT0ZTKTsKLQkJaWYgKCFpcyB8fCAhYnMpIHsKLQkJCWVycm9yID0gLUVOT01FTTsKLQkJCWdvdG8gY2xlYW51cDsKKwllcnJvciA9IGV4dDRfeGF0dHJfbWFrZV9pbm9kZV9zcGFjZShoYW5kbGUsIGlub2RlLCByYXdfaW5vZGUsCisJCQkJCSAgICBpc2l6ZV9kaWZmLCBpZnJlZSwgYmZyZWUsCisJCQkJCSAgICAmdG90YWxfaW5vKTsKKwlpZiAoZXJyb3IpIHsKKwkJaWYgKGVycm9yID09IC1FTk9TUEMgJiYgIXRyaWVkX21pbl9leHRyYV9pc2l6ZSAmJgorCQkgICAgc19taW5fZXh0cmFfaXNpemUpIHsKKwkJCXRyaWVkX21pbl9leHRyYV9pc2l6ZSsrOworCQkJbmV3X2V4dHJhX2lzaXplID0gc19taW5fZXh0cmFfaXNpemU7CisJCQlicmVsc2UoYmgpOworCQkJZ290byByZXRyeTsKIAkJfQotCi0JCWlzLT5zLm5vdF9mb3VuZCA9IC1FTk9EQVRBOwotCQlicy0+cy5ub3RfZm91bmQgPSAtRU5PREFUQTsKLQkJaXMtPmlsb2MuYmggPSBOVUxMOwotCQlicy0+YmggPSBOVUxMOwotCi0JCWxhc3QgPSBJRklSU1QoaGVhZGVyKTsKLQkJLyogRmluZCB0aGUgZW50cnkgYmVzdCBzdWl0ZWQgdG8gYmUgcHVzaGVkIGludG8gRUEgYmxvY2sgKi8KLQkJZW50cnkgPSBOVUxMOwotCQlmb3IgKDsgIUlTX0xBU1RfRU5UUlkobGFzdCk7IGxhc3QgPSBFWFQ0X1hBVFRSX05FWFQobGFzdCkpIHsKLQkJCXRvdGFsX3NpemUgPQotCQkJRVhUNF9YQVRUUl9TSVpFKGxlMzJfdG9fY3B1KGxhc3QtPmVfdmFsdWVfc2l6ZSkpICsKLQkJCQkJRVhUNF9YQVRUUl9MRU4obGFzdC0+ZV9uYW1lX2xlbik7Ci0JCQlpZiAodG90YWxfc2l6ZSA8PSBmcmVlICYmIHRvdGFsX3NpemUgPCBtaW5fdG90YWxfc2l6ZSkgewotCQkJCWlmICh0b3RhbF9zaXplIDwgbmV3X2V4dHJhX2lzaXplKSB7Ci0JCQkJCXNtYWxsX2VudHJ5ID0gbGFzdDsKLQkJCQl9IGVsc2UgewotCQkJCQllbnRyeSA9IGxhc3Q7Ci0JCQkJCW1pbl90b3RhbF9zaXplID0gdG90YWxfc2l6ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZW50cnkgPT0gTlVMTCkgewotCQkJaWYgKHNtYWxsX2VudHJ5KSB7Ci0JCQkJZW50cnkgPSBzbWFsbF9lbnRyeTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCF0cmllZF9taW5fZXh0cmFfaXNpemUgJiYKLQkJCQkgICAgc19taW5fZXh0cmFfaXNpemUpIHsKLQkJCQkJdHJpZWRfbWluX2V4dHJhX2lzaXplKys7Ci0JCQkJCW5ld19leHRyYV9pc2l6ZSA9IHNfbWluX2V4dHJhX2lzaXplOwotCQkJCQlrZnJlZShpcyk7IGlzID0gTlVMTDsKLQkJCQkJa2ZyZWUoYnMpOyBicyA9IE5VTEw7Ci0JCQkJCWJyZWxzZShiaCk7Ci0JCQkJCWdvdG8gcmV0cnk7Ci0JCQkJfQotCQkJCWVycm9yID0gLTE7Ci0JCQkJZ290byBjbGVhbnVwOwotCQkJfQotCQl9Ci0JCW9mZnMgPSBsZTE2X3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9vZmZzKTsKLQkJc2l6ZSA9IGxlMzJfdG9fY3B1KGVudHJ5LT5lX3ZhbHVlX3NpemUpOwotCQllbnRyeV9zaXplID0gRVhUNF9YQVRUUl9MRU4oZW50cnktPmVfbmFtZV9sZW4pOwotCQlpLm5hbWVfaW5kZXggPSBlbnRyeS0+ZV9uYW1lX2luZGV4LAotCQlidWZmZXIgPSBrbWFsbG9jKEVYVDRfWEFUVFJfU0laRShzaXplKSwgR0ZQX05PRlMpOwotCQliX2VudHJ5X25hbWUgPSBrbWFsbG9jKGVudHJ5LT5lX25hbWVfbGVuICsgMSwgR0ZQX05PRlMpOwotCQlpZiAoIWJ1ZmZlciB8fCAhYl9lbnRyeV9uYW1lKSB7Ci0JCQllcnJvciA9IC1FTk9NRU07Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJLyogU2F2ZSB0aGUgZW50cnkgbmFtZSBhbmQgdGhlIGVudHJ5IHZhbHVlICovCi0JCW1lbWNweShidWZmZXIsICh2b2lkICopSUZJUlNUKGhlYWRlcikgKyBvZmZzLAotCQkgICAgICAgRVhUNF9YQVRUUl9TSVpFKHNpemUpKTsKLQkJbWVtY3B5KGJfZW50cnlfbmFtZSwgZW50cnktPmVfbmFtZSwgZW50cnktPmVfbmFtZV9sZW4pOwotCQliX2VudHJ5X25hbWVbZW50cnktPmVfbmFtZV9sZW5dID0gJ1wwJzsKLQkJaS5uYW1lID0gYl9lbnRyeV9uYW1lOwotCi0JCWVycm9yID0gZXh0NF9nZXRfaW5vZGVfbG9jKGlub2RlLCAmaXMtPmlsb2MpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIGNsZWFudXA7Ci0KLQkJZXJyb3IgPSBleHQ0X3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsICZpLCBpcyk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gY2xlYW51cDsKLQotCQkvKiBSZW1vdmUgdGhlIGNob3NlbiBlbnRyeSBmcm9tIHRoZSBpbm9kZSAqLwotCQllcnJvciA9IGV4dDRfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsICZpLCBpcyk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gY2xlYW51cDsKLQotCQllbnRyeSA9IElGSVJTVChoZWFkZXIpOwotCQlpZiAoZW50cnlfc2l6ZSArIEVYVDRfWEFUVFJfU0laRShzaXplKSA+PSBuZXdfZXh0cmFfaXNpemUpCi0JCQlzaGlmdF9ieXRlcyA9IG5ld19leHRyYV9pc2l6ZTsKLQkJZWxzZQotCQkJc2hpZnRfYnl0ZXMgPSBlbnRyeV9zaXplICsgc2l6ZTsKLQkJLyogQWRqdXN0IHRoZSBvZmZzZXRzIGFuZCBzaGlmdCB0aGUgcmVtYWluaW5nIGVudHJpZXMgYWhlYWQgKi8KLQkJZXh0NF94YXR0cl9zaGlmdF9lbnRyaWVzKGVudHJ5LCBFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplIC0KLQkJCXNoaWZ0X2J5dGVzLCAodm9pZCAqKXJhd19pbm9kZSArCi0JCQlFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkUgKyBleHRyYV9pc2l6ZSArIHNoaWZ0X2J5dGVzLAotCQkJKHZvaWQgKiloZWFkZXIsIHRvdGFsX2lubyAtIGVudHJ5X3NpemUsCi0JCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOwotCi0JCWV4dHJhX2lzaXplICs9IHNoaWZ0X2J5dGVzOwotCQluZXdfZXh0cmFfaXNpemUgLT0gc2hpZnRfYnl0ZXM7Ci0JCUVYVDRfSShpbm9kZSktPmlfZXh0cmFfaXNpemUgPSBleHRyYV9pc2l6ZTsKLQotCQlpLm5hbWUgPSBiX2VudHJ5X25hbWU7Ci0JCWkudmFsdWUgPSBidWZmZXI7Ci0JCWkudmFsdWVfbGVuID0gc2l6ZTsKLQkJZXJyb3IgPSBleHQ0X3hhdHRyX2Jsb2NrX2ZpbmQoaW5vZGUsICZpLCBicyk7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gY2xlYW51cDsKLQotCQkvKiBBZGQgZW50cnkgd2hpY2ggd2FzIHJlbW92ZWQgZnJvbSB0aGUgaW5vZGUgaW50byB0aGUgYmxvY2sgKi8KLQkJZXJyb3IgPSBleHQ0X3hhdHRyX2Jsb2NrX3NldChoYW5kbGUsIGlub2RlLCAmaSwgYnMpOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIGNsZWFudXA7Ci0JCWtmcmVlKGJfZW50cnlfbmFtZSk7Ci0JCWtmcmVlKGJ1ZmZlcik7Ci0JCWJfZW50cnlfbmFtZSA9IE5VTEw7Ci0JCWJ1ZmZlciA9IE5VTEw7Ci0JCWJyZWxzZShpcy0+aWxvYy5iaCk7Ci0JCWtmcmVlKGlzKTsKLQkJa2ZyZWUoYnMpOworCQlnb3RvIGNsZWFudXA7CiAJfQorc2hpZnQ6CisJLyogQWRqdXN0IHRoZSBvZmZzZXRzIGFuZCBzaGlmdCB0aGUgcmVtYWluaW5nIGVudHJpZXMgYWhlYWQgKi8KKwlleHQ0X3hhdHRyX3NoaWZ0X2VudHJpZXMoSUZJUlNUKGhlYWRlciksIEVYVDRfSShpbm9kZSktPmlfZXh0cmFfaXNpemUKKwkJCS0gbmV3X2V4dHJhX2lzaXplLCAodm9pZCAqKXJhd19pbm9kZSArCisJCQlFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkUgKyBuZXdfZXh0cmFfaXNpemUsCisJCQkodm9pZCAqKWhlYWRlciwgdG90YWxfaW5vKTsKKwlFWFQ0X0koaW5vZGUpLT5pX2V4dHJhX2lzaXplID0gbmV3X2V4dHJhX2lzaXplOwogCWJyZWxzZShiaCk7CitvdXQ6CisJZXh0NF9jbGVhcl9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9OT19FWFBBTkQpOwogCXVwX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT54YXR0cl9zZW0pOwogCXJldHVybiAwOwogCiBjbGVhbnVwOgotCWtmcmVlKGJfZW50cnlfbmFtZSk7Ci0Ja2ZyZWUoYnVmZmVyKTsKLQlpZiAoaXMpCi0JCWJyZWxzZShpcy0+aWxvYy5iaCk7Ci0Ja2ZyZWUoaXMpOwotCWtmcmVlKGJzKTsKIAlicmVsc2UoYmgpOworCS8qCisJICogV2UgZGVsaWJlcmF0ZWx5IGxlYXZlIEVYVDRfU1RBVEVfTk9fRVhQQU5EIHNldCBoZXJlIHNpbmNlIGlub2RlCisJICogc2l6ZSBleHBhbnNpb24gZmFpbGVkLgorCSAqLwogCXVwX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT54YXR0cl9zZW0pOwogCXJldHVybiBlcnJvcjsKIH0KQEAgLTE3MjUsNyArMTc1MCw3IEBACiAJCSAgICAgICAqbmFtZSsrOwogCX0KIAotCWlmIChlbnRyeS0+ZV92YWx1ZV9ibG9jayA9PSAwICYmIGVudHJ5LT5lX3ZhbHVlX3NpemUgIT0gMCkgeworCWlmIChlbnRyeS0+ZV92YWx1ZV9zaXplICE9IDApIHsKIAkJX19sZTMyICp2YWx1ZSA9IChfX2xlMzIgKikoKGNoYXIgKiloZWFkZXIgKwogCQkJbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcykpOwogCQlmb3IgKG4gPSAobGUzMl90b19jcHUoZW50cnktPmVfdmFsdWVfc2l6ZSkgKwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC94YXR0ci5oIGIvZnMvZXh0NC94YXR0ci5oCmluZGV4IDY5ZGQzZTYuLmE5MmU3ODMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQveGF0dHIuaAorKysgYi9mcy9leHQ0L3hhdHRyLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNkZWZpbmUgRVhUNF9YQVRUUl9JTkRFWF9TWVNURU0JCQk3CiAjZGVmaW5lIEVYVDRfWEFUVFJfSU5ERVhfUklDSEFDTAkJOAogI2RlZmluZSBFWFQ0X1hBVFRSX0lOREVYX0VOQ1JZUFRJT04JCTkKKyNkZWZpbmUgRVhUNF9YQVRUUl9JTkRFWF9IVVJECQkJMTAgLyogUmVzZXJ2ZWQgZm9yIEh1cmQgKi8KIAogc3RydWN0IGV4dDRfeGF0dHJfaGVhZGVyIHsKIAlfX2xlMzIJaF9tYWdpYzsJLyogbWFnaWMgbnVtYmVyIGZvciBpZGVudGlmaWNhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9hY2wuYyBiL2ZzL2YyZnMvYWNsLmMKaW5kZXggNGRjYzllMi4uMWUyOTYzMCAxMDA2NDQKLS0tIGEvZnMvZjJmcy9hY2wuYworKysgYi9mcy9mMmZzL2FjbC5jCkBAIC0xMDksMTQgKzEwOSwxNiBAQAogCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogfQogCi1zdGF0aWMgdm9pZCAqZjJmc19hY2xfdG9fZGlzayhjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIHNpemVfdCAqc2l6ZSkKK3N0YXRpYyB2b2lkICpmMmZzX2FjbF90b19kaXNrKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKKwkJCQljb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIHNpemVfdCAqc2l6ZSkKIHsKIAlzdHJ1Y3QgZjJmc19hY2xfaGVhZGVyICpmMmZzX2FjbDsKIAlzdHJ1Y3QgZjJmc19hY2xfZW50cnkgKmVudHJ5OwogCWludCBpOwogCi0JZjJmc19hY2wgPSBmMmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmMmZzX2FjbF9oZWFkZXIpICsgYWNsLT5hX2NvdW50ICoKLQkJCXNpemVvZihzdHJ1Y3QgZjJmc19hY2xfZW50cnkpLCBHRlBfTk9GUyk7CisJZjJmc19hY2wgPSBmMmZzX2ttYWxsb2Moc2JpLCBzaXplb2Yoc3RydWN0IGYyZnNfYWNsX2hlYWRlcikgKworCQkJYWNsLT5hX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBmMmZzX2FjbF9lbnRyeSksCisJCQlHRlBfTk9GUyk7CiAJaWYgKCFmMmZzX2FjbCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKQEAgLTE3NSw3ICsxNzcsNyBAQAogCiAJcmV0dmFsID0gZjJmc19nZXR4YXR0cihpbm9kZSwgbmFtZV9pbmRleCwgIiIsIE5VTEwsIDAsIGRwYWdlKTsKIAlpZiAocmV0dmFsID4gMCkgewotCQl2YWx1ZSA9IGYyZnNfa21hbGxvYyhyZXR2YWwsIEdGUF9GMkZTX1pFUk8pOworCQl2YWx1ZSA9IGYyZnNfa21hbGxvYyhGMkZTX0lfU0IoaW5vZGUpLCByZXR2YWwsIEdGUF9GMkZTX1pFUk8pOwogCQlpZiAoIXZhbHVlKQogCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJCXJldHZhbCA9IGYyZnNfZ2V0eGF0dHIoaW5vZGUsIG5hbWVfaW5kZXgsICIiLCB2YWx1ZSwKQEAgLTIzMCw3ICsyMzIsNyBAQAogCX0KIAogCWlmIChhY2wpIHsKLQkJdmFsdWUgPSBmMmZzX2FjbF90b19kaXNrKGFjbCwgJnNpemUpOworCQl2YWx1ZSA9IGYyZnNfYWNsX3RvX2Rpc2soRjJGU19JX1NCKGlub2RlKSwgYWNsLCAmc2l6ZSk7CiAJCWlmIChJU19FUlIodmFsdWUpKSB7CiAJCQljbGVhcl9pbm9kZV9mbGFnKGlub2RlLCBGSV9BQ0xfTU9ERSk7CiAJCQlyZXR1cm4gKGludClQVFJfRVJSKHZhbHVlKTsKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvYWNsLmggYi9mcy9mMmZzL2FjbC5oCmluZGV4IGIyMzM0ZDEuLjJjNjg1MTggMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvYWNsLmgKKysrIGIvZnMvZjJmcy9hY2wuaApAQCAtNDEsNyArNDEsNiBAQAogZXh0ZXJuIGludCBmMmZzX2luaXRfYWNsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHBhZ2UgKiwKIAkJCQkJCQlzdHJ1Y3QgcGFnZSAqKTsKICNlbHNlCi0jZGVmaW5lIGYyZnNfY2hlY2tfYWNsCU5VTEwKICNkZWZpbmUgZjJmc19nZXRfYWNsCU5VTEwKICNkZWZpbmUgZjJmc19zZXRfYWNsCU5VTEwKIApkaWZmIC0tZ2l0IGEvZnMvZjJmcy9jaGVja3BvaW50LmMgYi9mcy9mMmZzL2NoZWNrcG9pbnQuYwppbmRleCBmOTRkMDFlLi43ZTliNTA0IDEwMDY0NAotLS0gYS9mcy9mMmZzL2NoZWNrcG9pbnQuYworKysgYi9mcy9mMmZzL2NoZWNrcG9pbnQuYwpAQCAtMjgsNyArMjgsNyBAQAogCiB2b2lkIGYyZnNfc3RvcF9jaGVja3BvaW50KHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgYm9vbCBlbmRfaW8pCiB7Ci0Jc2V0X2NrcHRfZmxhZ3Moc2JpLT5ja3B0LCBDUF9FUlJPUl9GTEFHKTsKKwlzZXRfY2twdF9mbGFncyhzYmksIENQX0VSUk9SX0ZMQUcpOwogCXNiaS0+c2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCWlmICghZW5kX2lvKQogCQlmMmZzX2ZsdXNoX21lcmdlZF9iaW9zKHNiaSk7CkBAIC0yNjcsNyArMjY3LDYgQEAKIAkJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKIHsKIAlzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkgPSBGMkZTX01fU0IobWFwcGluZyk7Ci0Jc3RydWN0IGJsa19wbHVnIHBsdWc7CiAJbG9uZyBkaWZmLCB3cml0dGVuOwogCiAJLyogY29sbGVjdCBhIG51bWJlciBvZiBkaXJ0eSBtZXRhIHBhZ2VzIGFuZCB3cml0ZSB0b2dldGhlciAqLwpAQCAtMjgwLDkgKzI3OSw3IEBACiAJLyogaWYgbW91bnRpbmcgaXMgZmFpbGVkLCBza2lwIHdyaXRpbmcgbm9kZSBwYWdlcyAqLwogCW11dGV4X2xvY2soJnNiaS0+Y3BfbXV0ZXgpOwogCWRpZmYgPSBucl9wYWdlc190b193cml0ZShzYmksIE1FVEEsIHdiYyk7Ci0JYmxrX3N0YXJ0X3BsdWcoJnBsdWcpOwogCXdyaXR0ZW4gPSBzeW5jX21ldGFfcGFnZXMoc2JpLCBNRVRBLCB3YmMtPm5yX3RvX3dyaXRlKTsKLQlibGtfZmluaXNoX3BsdWcoJnBsdWcpOwogCW11dGV4X3VubG9jaygmc2JpLT5jcF9tdXRleCk7CiAJd2JjLT5ucl90b193cml0ZSA9IG1heCgobG9uZykwLCB3YmMtPm5yX3RvX3dyaXRlIC0gd3JpdHRlbiAtIGRpZmYpOwogCXJldHVybiAwOwpAQCAtMzg4LDYgKzM4NSw5IEBACiAJLnNldF9wYWdlX2RpcnR5CT0gZjJmc19zZXRfbWV0YV9wYWdlX2RpcnR5LAogCS5pbnZhbGlkYXRlcGFnZSA9IGYyZnNfaW52YWxpZGF0ZV9wYWdlLAogCS5yZWxlYXNlcGFnZQk9IGYyZnNfcmVsZWFzZV9wYWdlLAorI2lmZGVmIENPTkZJR19NSUdSQVRJT04KKwkubWlncmF0ZXBhZ2UgICAgPSBmMmZzX21pZ3JhdGVfcGFnZSwKKyNlbmRpZgogfTsKIAogc3RhdGljIHZvaWQgX19hZGRfaW5vX2VudHJ5KHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgbmlkX3QgaW5vLCBpbnQgdHlwZSkKQEAgLTQ5MSw3ICs0OTEsNyBAQAogCXNwaW5fbG9jaygmaW0tPmlub19sb2NrKTsKIAogI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgotCWlmICh0aW1lX3RvX2luamVjdChGQVVMVF9PUlBIQU4pKSB7CisJaWYgKHRpbWVfdG9faW5qZWN0KHNiaSwgRkFVTFRfT1JQSEFOKSkgewogCQlzcGluX3VubG9jaygmaW0tPmlub19sb2NrKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQpAQCAtNTMxLDggKzUzMSwyMCBAQAogc3RhdGljIGludCByZWNvdmVyX29ycGhhbl9pbm9kZShzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIG5pZF90IGlubykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBub2RlX2luZm8gbmk7CisJaW50IGVyciA9IGFjcXVpcmVfb3JwaGFuX2lub2RlKHNiaSk7CiAKLQlpbm9kZSA9IGYyZnNfaWdldChzYmktPnNiLCBpbm8pOworCWlmIChlcnIpIHsKKwkJc2V0X3NiaV9mbGFnKHNiaSwgU0JJX05FRURfRlNDSyk7CisJCWYyZnNfbXNnKHNiaS0+c2IsIEtFUk5fV0FSTklORywKKwkJCQkiJXM6IG9ycGhhbiBmYWlsZWQgKGlubz0leCksIHJ1biBmc2NrIHRvIGZpeC4iLAorCQkJCV9fZnVuY19fLCBpbm8pOworCQlyZXR1cm4gZXJyOworCX0KKworCV9fYWRkX2lub19lbnRyeShzYmksIGlubywgT1JQSEFOX0lOTyk7CisKKwlpbm9kZSA9IGYyZnNfaWdldF9yZXRyeShzYmktPnNiLCBpbm8pOwogCWlmIChJU19FUlIoaW5vZGUpKSB7CiAJCS8qCiAJCSAqIHRoZXJlIHNob3VsZCBiZSBhIGJ1ZyB0aGF0IHdlIGNhbid0IGZpbmQgdGhlIGVudHJ5CkBAIC01NDYsNiArNTU4LDE4IEBACiAKIAkvKiB0cnVuY2F0ZSBhbGwgdGhlIGRhdGEgZHVyaW5nIGlwdXQgKi8KIAlpcHV0KGlub2RlKTsKKworCWdldF9ub2RlX2luZm8oc2JpLCBpbm8sICZuaSk7CisKKwkvKiBFTk9NRU0gd2FzIGZ1bGx5IHJldHJpZWQgaW4gZjJmc19ldmljdF9pbm9kZS4gKi8KKwlpZiAobmkuYmxrX2FkZHIgIT0gTlVMTF9BRERSKSB7CisJCXNldF9zYmlfZmxhZyhzYmksIFNCSV9ORUVEX0ZTQ0spOworCQlmMmZzX21zZyhzYmktPnNiLCBLRVJOX1dBUk5JTkcsCisJCQkiJXM6IG9ycGhhbiBmYWlsZWQgKGlubz0leCksIHJ1biBmc2NrIHRvIGZpeC4iLAorCQkJCV9fZnVuY19fLCBpbm8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJX19yZW1vdmVfaW5vX2VudHJ5KHNiaSwgaW5vLCBPUlBIQU5fSU5PKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTU0LDcgKzU3OCw3IEBACiAJYmxvY2tfdCBzdGFydF9ibGssIG9ycGhhbl9ibG9ja3MsIGksIGo7CiAJaW50IGVycjsKIAotCWlmICghaXNfc2V0X2NrcHRfZmxhZ3MoRjJGU19DS1BUKHNiaSksIENQX09SUEhBTl9QUkVTRU5UX0ZMQUcpKQorCWlmICghaXNfc2V0X2NrcHRfZmxhZ3Moc2JpLCBDUF9PUlBIQU5fUFJFU0VOVF9GTEFHKSkKIAkJcmV0dXJuIDA7CiAKIAlzdGFydF9ibGsgPSBfX3N0YXJ0X2NwX2FkZHIoc2JpKSArIDEgKyBfX2NwX3BheWxvYWQoc2JpKTsKQEAgLTU3OCw3ICs2MDIsNyBAQAogCQlmMmZzX3B1dF9wYWdlKHBhZ2UsIDEpOwogCX0KIAkvKiBjbGVhciBPcnBoYW4gRmxhZyAqLwotCWNsZWFyX2NrcHRfZmxhZ3MoRjJGU19DS1BUKHNiaSksIENQX09SUEhBTl9QUkVTRU5UX0ZMQUcpOworCWNsZWFyX2NrcHRfZmxhZ3Moc2JpLCBDUF9PUlBIQU5fUFJFU0VOVF9GTEFHKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjM5LDQ1ICs2NjMsNTUgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgZ2V0X2NoZWNrcG9pbnRfdmVyc2lvbihzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIGJsb2NrX3QgY3BfYWRkciwKKwkJc3RydWN0IGYyZnNfY2hlY2twb2ludCAqKmNwX2Jsb2NrLCBzdHJ1Y3QgcGFnZSAqKmNwX3BhZ2UsCisJCXVuc2lnbmVkIGxvbmcgbG9uZyAqdmVyc2lvbikKK3sKKwl1bnNpZ25lZCBsb25nIGJsa19zaXplID0gc2JpLT5ibG9ja3NpemU7CisJc2l6ZV90IGNyY19vZmZzZXQgPSAwOworCV9fdTMyIGNyYyA9IDA7CisKKwkqY3BfcGFnZSA9IGdldF9tZXRhX3BhZ2Uoc2JpLCBjcF9hZGRyKTsKKwkqY3BfYmxvY2sgPSAoc3RydWN0IGYyZnNfY2hlY2twb2ludCAqKXBhZ2VfYWRkcmVzcygqY3BfcGFnZSk7CisKKwljcmNfb2Zmc2V0ID0gbGUzMl90b19jcHUoKCpjcF9ibG9jayktPmNoZWNrc3VtX29mZnNldCk7CisJaWYgKGNyY19vZmZzZXQgPj0gYmxrX3NpemUpIHsKKwkJZjJmc19tc2coc2JpLT5zYiwgS0VSTl9XQVJOSU5HLAorCQkJImludmFsaWQgY3JjX29mZnNldDogJXp1IiwgY3JjX29mZnNldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNyYyA9IGxlMzJfdG9fY3B1KCooKF9fbGUzMiAqKSgodW5zaWduZWQgY2hhciAqKSpjcF9ibG9jaworCQkJCQkJCSsgY3JjX29mZnNldCkpKTsKKwlpZiAoIWYyZnNfY3JjX3ZhbGlkKHNiaSwgY3JjLCAqY3BfYmxvY2ssIGNyY19vZmZzZXQpKSB7CisJCWYyZnNfbXNnKHNiaS0+c2IsIEtFUk5fV0FSTklORywgImludmFsaWQgY3JjIHZhbHVlIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSp2ZXJzaW9uID0gY3VyX2NwX3ZlcnNpb24oKmNwX2Jsb2NrKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBwYWdlICp2YWxpZGF0ZV9jaGVja3BvaW50KHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKIAkJCQlibG9ja190IGNwX2FkZHIsIHVuc2lnbmVkIGxvbmcgbG9uZyAqdmVyc2lvbikKIHsKLQlzdHJ1Y3QgcGFnZSAqY3BfcGFnZV8xLCAqY3BfcGFnZV8yID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGJsa19zaXplID0gc2JpLT5ibG9ja3NpemU7Ci0Jc3RydWN0IGYyZnNfY2hlY2twb2ludCAqY3BfYmxvY2s7CisJc3RydWN0IHBhZ2UgKmNwX3BhZ2VfMSA9IE5VTEwsICpjcF9wYWdlXzIgPSBOVUxMOworCXN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKmNwX2Jsb2NrID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGxvbmcgY3VyX3ZlcnNpb24gPSAwLCBwcmVfdmVyc2lvbiA9IDA7Ci0Jc2l6ZV90IGNyY19vZmZzZXQ7Ci0JX191MzIgY3JjID0gMDsKKwlpbnQgZXJyOwogCi0JLyogUmVhZCB0aGUgMXN0IGNwIGJsb2NrIGluIHRoaXMgQ1AgcGFjayAqLwotCWNwX3BhZ2VfMSA9IGdldF9tZXRhX3BhZ2Uoc2JpLCBjcF9hZGRyKTsKLQotCS8qIGdldCB0aGUgdmVyc2lvbiBudW1iZXIgKi8KLQljcF9ibG9jayA9IChzdHJ1Y3QgZjJmc19jaGVja3BvaW50ICopcGFnZV9hZGRyZXNzKGNwX3BhZ2VfMSk7Ci0JY3JjX29mZnNldCA9IGxlMzJfdG9fY3B1KGNwX2Jsb2NrLT5jaGVja3N1bV9vZmZzZXQpOwotCWlmIChjcmNfb2Zmc2V0ID49IGJsa19zaXplKQorCWVyciA9IGdldF9jaGVja3BvaW50X3ZlcnNpb24oc2JpLCBjcF9hZGRyLCAmY3BfYmxvY2ssCisJCQkJCSZjcF9wYWdlXzEsIHZlcnNpb24pOworCWlmIChlcnIpCiAJCWdvdG8gaW52YWxpZF9jcDE7CisJcHJlX3ZlcnNpb24gPSAqdmVyc2lvbjsKIAotCWNyYyA9IGxlMzJfdG9fY3B1KCooKF9fbGUzMiAqKSgodW5zaWduZWQgY2hhciAqKWNwX2Jsb2NrICsgY3JjX29mZnNldCkpKTsKLQlpZiAoIWYyZnNfY3JjX3ZhbGlkKHNiaSwgY3JjLCBjcF9ibG9jaywgY3JjX29mZnNldCkpCi0JCWdvdG8gaW52YWxpZF9jcDE7Ci0KLQlwcmVfdmVyc2lvbiA9IGN1cl9jcF92ZXJzaW9uKGNwX2Jsb2NrKTsKLQotCS8qIFJlYWQgdGhlIDJuZCBjcCBibG9jayBpbiB0aGlzIENQIHBhY2sgKi8KIAljcF9hZGRyICs9IGxlMzJfdG9fY3B1KGNwX2Jsb2NrLT5jcF9wYWNrX3RvdGFsX2Jsb2NrX2NvdW50KSAtIDE7Ci0JY3BfcGFnZV8yID0gZ2V0X21ldGFfcGFnZShzYmksIGNwX2FkZHIpOwotCi0JY3BfYmxvY2sgPSAoc3RydWN0IGYyZnNfY2hlY2twb2ludCAqKXBhZ2VfYWRkcmVzcyhjcF9wYWdlXzIpOwotCWNyY19vZmZzZXQgPSBsZTMyX3RvX2NwdShjcF9ibG9jay0+Y2hlY2tzdW1fb2Zmc2V0KTsKLQlpZiAoY3JjX29mZnNldCA+PSBibGtfc2l6ZSkKKwllcnIgPSBnZXRfY2hlY2twb2ludF92ZXJzaW9uKHNiaSwgY3BfYWRkciwgJmNwX2Jsb2NrLAorCQkJCQkmY3BfcGFnZV8yLCB2ZXJzaW9uKTsKKwlpZiAoZXJyKQogCQlnb3RvIGludmFsaWRfY3AyOwotCi0JY3JjID0gbGUzMl90b19jcHUoKigoX19sZTMyICopKCh1bnNpZ25lZCBjaGFyICopY3BfYmxvY2sgKyBjcmNfb2Zmc2V0KSkpOwotCWlmICghZjJmc19jcmNfdmFsaWQoc2JpLCBjcmMsIGNwX2Jsb2NrLCBjcmNfb2Zmc2V0KSkKLQkJZ290byBpbnZhbGlkX2NwMjsKLQotCWN1cl92ZXJzaW9uID0gY3VyX2NwX3ZlcnNpb24oY3BfYmxvY2spOworCWN1cl92ZXJzaW9uID0gKnZlcnNpb247CiAKIAlpZiAoY3VyX3ZlcnNpb24gPT0gcHJlX3ZlcnNpb24pIHsKIAkJKnZlcnNpb24gPSBjdXJfdmVyc2lvbjsKQEAgLTk3MiwxMCArMTAwNiw0MCBAQAogCWZpbmlzaF93YWl0KCZzYmktPmNwX3dhaXQsICZ3YWl0KTsKIH0KIAorc3RhdGljIHZvaWQgdXBkYXRlX2NrcHRfZmxhZ3Moc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgY3BfY29udHJvbCAqY3BjKQoreworCXVuc2lnbmVkIGxvbmcgb3JwaGFuX251bSA9IHNiaS0+aW1bT1JQSEFOX0lOT10uaW5vX251bTsKKwlzdHJ1Y3QgZjJmc19jaGVja3BvaW50ICpja3B0ID0gRjJGU19DS1BUKHNiaSk7CisKKwlzcGluX2xvY2soJnNiaS0+Y3BfbG9jayk7CisKKwlpZiAoY3BjLT5yZWFzb24gPT0gQ1BfVU1PVU5UKQorCQlfX3NldF9ja3B0X2ZsYWdzKGNrcHQsIENQX1VNT1VOVF9GTEFHKTsKKwllbHNlCisJCV9fY2xlYXJfY2twdF9mbGFncyhja3B0LCBDUF9VTU9VTlRfRkxBRyk7CisKKwlpZiAoY3BjLT5yZWFzb24gPT0gQ1BfRkFTVEJPT1QpCisJCV9fc2V0X2NrcHRfZmxhZ3MoY2twdCwgQ1BfRkFTVEJPT1RfRkxBRyk7CisJZWxzZQorCQlfX2NsZWFyX2NrcHRfZmxhZ3MoY2twdCwgQ1BfRkFTVEJPT1RfRkxBRyk7CisKKwlpZiAob3JwaGFuX251bSkKKwkJX19zZXRfY2twdF9mbGFncyhja3B0LCBDUF9PUlBIQU5fUFJFU0VOVF9GTEFHKTsKKwllbHNlCisJCV9fY2xlYXJfY2twdF9mbGFncyhja3B0LCBDUF9PUlBIQU5fUFJFU0VOVF9GTEFHKTsKKworCWlmIChpc19zYmlfZmxhZ19zZXQoc2JpLCBTQklfTkVFRF9GU0NLKSkKKwkJX19zZXRfY2twdF9mbGFncyhja3B0LCBDUF9GU0NLX0ZMQUcpOworCisJLyogc2V0IHRoaXMgZmxhZyB0byBhY3RpdmF0ZSBjcmN8Y3BfdmVyIGZvciByZWNvdmVyeSAqLworCV9fc2V0X2NrcHRfZmxhZ3MoY2twdCwgQ1BfQ1JDX1JFQ09WRVJZX0ZMQUcpOworCisJc3Bpbl91bmxvY2soJnNiaS0+Y3BfbG9jayk7Cit9CisKIHN0YXRpYyBpbnQgZG9fY2hlY2twb2ludChzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIHN0cnVjdCBjcF9jb250cm9sICpjcGMpCiB7CiAJc3RydWN0IGYyZnNfY2hlY2twb2ludCAqY2twdCA9IEYyRlNfQ0tQVChzYmkpOwotCXN0cnVjdCBjdXJzZWdfaW5mbyAqY3Vyc2VnID0gQ1VSU0VHX0koc2JpLCBDVVJTRUdfV0FSTV9OT0RFKTsKIAlzdHJ1Y3QgZjJmc19ubV9pbmZvICpubV9pID0gTk1fSShzYmkpOwogCXVuc2lnbmVkIGxvbmcgb3JwaGFuX251bSA9IHNiaS0+aW1bT1JQSEFOX0lOT10uaW5vX251bTsKIAluaWRfdCBsYXN0X25pZCA9IG5tX2ktPm5leHRfc2Nhbl9uaWQ7CkBAIC05ODQsMTkgKzEwNDgsMTAgQEAKIAlfX3UzMiBjcmMzMiA9IDA7CiAJaW50IGk7CiAJaW50IGNwX3BheWxvYWRfYmxrcyA9IF9fY3BfcGF5bG9hZChzYmkpOwotCWJsb2NrX3QgZGlzY2FyZF9ibGsgPSBORVhUX0ZSRUVfQkxLQUREUihzYmksIGN1cnNlZyk7Ci0JYm9vbCBpbnZhbGlkYXRlID0gZmFsc2U7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHNiaS0+c2I7CiAJc3RydWN0IGN1cnNlZ19pbmZvICpzZWdfaSA9IENVUlNFR19JKHNiaSwgQ1VSU0VHX0hPVF9OT0RFKTsKIAl1NjQga2J5dGVzX3dyaXR0ZW47CiAKLQkvKgotCSAqIFRoaXMgYXZvaWRzIHRvIGNvbmR1Y3Qgd3Jvbmcgcm9sbC1mb3J3YXJkIG9wZXJhdGlvbnMgYW5kIHVzZXMKLQkgKiBtZXRhcGFnZXMsIHNvIHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8gc3luY19tZXRhX3BhZ2VzIGJlbG93LgotCSAqLwotCWlmICghdGVzdF9vcHQoc2JpLCBMRlMpICYmIGRpc2NhcmRfbmV4dF9kbm9kZShzYmksIGRpc2NhcmRfYmxrKSkKLQkJaW52YWxpZGF0ZSA9IHRydWU7Ci0KIAkvKiBGbHVzaCBhbGwgdGhlIE5BVC9TSVQgcGFnZXMgKi8KIAl3aGlsZSAoZ2V0X3BhZ2VzKHNiaSwgRjJGU19ESVJUWV9NRVRBKSkgewogCQlzeW5jX21ldGFfcGFnZXMoc2JpLCBNRVRBLCBMT05HX01BWCk7CkBAIC0xMDM2LDEwICsxMDkxLDEyIEBACiAKIAkvKiAyIGNwICArIG4gZGF0YSBzZWcgc3VtbWFyeSArIG9ycGhhbiBpbm9kZSBibG9ja3MgKi8KIAlkYXRhX3N1bV9ibG9ja3MgPSBucGFnZXNfZm9yX3N1bW1hcnlfZmx1c2goc2JpLCBmYWxzZSk7CisJc3Bpbl9sb2NrKCZzYmktPmNwX2xvY2spOwogCWlmIChkYXRhX3N1bV9ibG9ja3MgPCBOUl9DVVJTRUdfREFUQV9UWVBFKQotCQlzZXRfY2twdF9mbGFncyhja3B0LCBDUF9DT01QQUNUX1NVTV9GTEFHKTsKKwkJX19zZXRfY2twdF9mbGFncyhja3B0LCBDUF9DT01QQUNUX1NVTV9GTEFHKTsKIAllbHNlCi0JCWNsZWFyX2NrcHRfZmxhZ3MoY2twdCwgQ1BfQ09NUEFDVF9TVU1fRkxBRyk7CisJCV9fY2xlYXJfY2twdF9mbGFncyhja3B0LCBDUF9DT01QQUNUX1NVTV9GTEFHKTsKKwlzcGluX3VubG9jaygmc2JpLT5jcF9sb2NrKTsKIAogCW9ycGhhbl9ibG9ja3MgPSBHRVRfT1JQSEFOX0JMT0NLUyhvcnBoYW5fbnVtKTsKIAlja3B0LT5jcF9wYWNrX3N0YXJ0X3N1bSA9IGNwdV90b19sZTMyKDEgKyBjcF9wYXlsb2FkX2Jsa3MgKwpAQCAtMTA1NCwyMyArMTExMSw4IEBACiAJCQkJY3BfcGF5bG9hZF9ibGtzICsgZGF0YV9zdW1fYmxvY2tzICsKIAkJCQlvcnBoYW5fYmxvY2tzKTsKIAotCWlmIChjcGMtPnJlYXNvbiA9PSBDUF9VTU9VTlQpCi0JCXNldF9ja3B0X2ZsYWdzKGNrcHQsIENQX1VNT1VOVF9GTEFHKTsKLQllbHNlCi0JCWNsZWFyX2NrcHRfZmxhZ3MoY2twdCwgQ1BfVU1PVU5UX0ZMQUcpOwotCi0JaWYgKGNwYy0+cmVhc29uID09IENQX0ZBU1RCT09UKQotCQlzZXRfY2twdF9mbGFncyhja3B0LCBDUF9GQVNUQk9PVF9GTEFHKTsKLQllbHNlCi0JCWNsZWFyX2NrcHRfZmxhZ3MoY2twdCwgQ1BfRkFTVEJPT1RfRkxBRyk7Ci0KLQlpZiAob3JwaGFuX251bSkKLQkJc2V0X2NrcHRfZmxhZ3MoY2twdCwgQ1BfT1JQSEFOX1BSRVNFTlRfRkxBRyk7Ci0JZWxzZQotCQljbGVhcl9ja3B0X2ZsYWdzKGNrcHQsIENQX09SUEhBTl9QUkVTRU5UX0ZMQUcpOwotCi0JaWYgKGlzX3NiaV9mbGFnX3NldChzYmksIFNCSV9ORUVEX0ZTQ0spKQotCQlzZXRfY2twdF9mbGFncyhja3B0LCBDUF9GU0NLX0ZMQUcpOworCS8qIHVwZGF0ZSBja3B0IGZsYWcgZm9yIGNoZWNrcG9pbnQgKi8KKwl1cGRhdGVfY2twdF9mbGFncyhzYmksIGNwYyk7CiAKIAkvKiB1cGRhdGUgU0lUL05BVCBiaXRtYXAgKi8KIAlnZXRfc2l0X2JpdG1hcChzYmksIF9fYml0bWFwX3B0cihzYmksIFNJVF9CSVRNQVApKTsKQEAgLTExMzcsMTQgKzExNzksNiBAQAogCS8qIHdhaXQgZm9yIHByZXZpb3VzIHN1Ym1pdHRlZCBtZXRhIHBhZ2VzIHdyaXRlYmFjayAqLwogCXdhaXRfb25fYWxsX3BhZ2VzX3dyaXRlYmFjayhzYmkpOwogCi0JLyoKLQkgKiBpbnZhbGlkYXRlIG1ldGEgcGFnZSB3aGljaCBpcyB1c2VkIHRlbXBvcmFyaWx5IGZvciB6ZXJvaW5nIG91dAotCSAqIGJsb2NrIGF0IHRoZSBlbmQgb2Ygd2FybSBub2RlIGNoYWluLgotCSAqLwotCWlmIChpbnZhbGlkYXRlKQotCQlpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoTUVUQV9NQVBQSU5HKHNiaSksIGRpc2NhcmRfYmxrLAotCQkJCQkJCQlkaXNjYXJkX2Jsayk7Ci0KIAlyZWxlYXNlX2lub19lbnRyeShzYmksIGZhbHNlKTsKIAogCWlmICh1bmxpa2VseShmMmZzX2NwX2Vycm9yKHNiaSkpKQpAQCAtMTE1Miw2ICsxMTg2LDE3IEBACiAKIAljbGVhcl9wcmVmcmVlX3NlZ21lbnRzKHNiaSwgY3BjKTsKIAljbGVhcl9zYmlfZmxhZyhzYmksIFNCSV9JU19ESVJUWSk7CisJY2xlYXJfc2JpX2ZsYWcoc2JpLCBTQklfTkVFRF9DUCk7CisKKwkvKgorCSAqIHJlZGlydHkgc3VwZXJibG9jayBpZiBtZXRhZGF0YSBsaWtlIG5vZGUgcGFnZSBvciBpbm9kZSBjYWNoZSBpcworCSAqIHVwZGF0ZWQgZHVyaW5nIHdyaXRpbmcgY2hlY2twb2ludC4KKwkgKi8KKwlpZiAoZ2V0X3BhZ2VzKHNiaSwgRjJGU19ESVJUWV9OT0RFUykgfHwKKwkJCWdldF9wYWdlcyhzYmksIEYyRlNfRElSVFlfSU1FVEEpKQorCQlzZXRfc2JpX2ZsYWcoc2JpLCBTQklfSVNfRElSVFkpOworCisJZjJmc19idWdfb24oc2JpLCBnZXRfcGFnZXMoc2JpLCBGMkZTX0RJUlRZX0RFTlRTKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExOTAsNiArMTIzNSwxOCBAQAogCiAJZjJmc19mbHVzaF9tZXJnZWRfYmlvcyhzYmkpOwogCisJLyogdGhpcyBpcyB0aGUgY2FzZSBvZiBtdWx0aXBsZSBmc3RyaW1zIHdpdGhvdXQgYW55IGNoYW5nZXMgKi8KKwlpZiAoY3BjLT5yZWFzb24gPT0gQ1BfRElTQ0FSRCAmJiAhaXNfc2JpX2ZsYWdfc2V0KHNiaSwgU0JJX0lTX0RJUlRZKSkgeworCQlmMmZzX2J1Z19vbihzYmksIE5NX0koc2JpKS0+ZGlydHlfbmF0X2NudCk7CisJCWYyZnNfYnVnX29uKHNiaSwgU0lUX0koc2JpKS0+ZGlydHlfc2VudHJpZXMpOworCQlmMmZzX2J1Z19vbihzYmksIHByZWZyZWVfc2VnbWVudHMoc2JpKSk7CisJCWZsdXNoX3NpdF9lbnRyaWVzKHNiaSwgY3BjKTsKKwkJY2xlYXJfcHJlZnJlZV9zZWdtZW50cyhzYmksIGNwYyk7CisJCWYyZnNfd2FpdF9hbGxfZGlzY2FyZF9iaW8oc2JpKTsKKwkJdW5ibG9ja19vcGVyYXRpb25zKHNiaSk7CisJCWdvdG8gb3V0OworCX0KKwogCS8qCiAJICogdXBkYXRlIGNoZWNrcG9pbnQgcGFjayBpbmRleAogCSAqIEluY3JlYXNlIHRoZSB2ZXJzaW9uIG51bWJlciBzbyB0aGF0CkBAIC0xMjA1LDYgKzEyNjIsOCBAQAogCS8qIHVubG9jayBhbGwgdGhlIGZzX2xvY2tbXSBpbiBkb19jaGVja3BvaW50KCkgKi8KIAllcnIgPSBkb19jaGVja3BvaW50KHNiaSwgY3BjKTsKIAorCWYyZnNfd2FpdF9hbGxfZGlzY2FyZF9iaW8oc2JpKTsKKwogCXVuYmxvY2tfb3BlcmF0aW9ucyhzYmkpOwogCXN0YXRfaW5jX2NwX2NvdW50KHNiaS0+c3RhdF9pbmZvKTsKIApkaWZmIC0tZ2l0IGEvZnMvZjJmcy9kYXRhLmMgYi9mcy9mMmZzL2RhdGEuYwppbmRleCBjY2I0MDFlLi4wZDAxNzdjIDEwMDY0NAotLS0gYS9mcy9mMmZzL2RhdGEuYworKysgYi9mcy9mMmZzL2RhdGEuYwpAQCAtMzQsNiArMzQsMTEgQEAKIAlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKIAlpbnQgaTsKIAorI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgorCWlmICh0aW1lX3RvX2luamVjdChGMkZTX1BfU0IoYmlvLT5iaV9pb192ZWMtPmJ2X3BhZ2UpLCBGQVVMVF9JTykpCisJCWJpby0+YmlfZXJyb3IgPSAtRUlPOworI2VuZGlmCisKIAlpZiAoZjJmc19iaW9fZW5jcnlwdGVkKGJpbykpIHsKIAkJaWYgKGJpby0+YmlfZXJyb3IpIHsKIAkJCWZzY3J5cHRfcmVsZWFzZV9jdHgoYmlvLT5iaV9wcml2YXRlKTsKQEAgLTYyNiwxMSArNjMxLDEzIEBACiAJc3NpemVfdCByZXQgPSAwOwogCiAJbWFwLm1fbGJsayA9IEYyRlNfQkxLX0FMSUdOKGlvY2ItPmtpX3Bvcyk7Ci0JbWFwLm1fbGVuID0gRjJGU19CWVRFU19UT19CTEsoaW92X2l0ZXJfY291bnQoZnJvbSkpOwotCW1hcC5tX25leHRfcGdvZnMgPSBOVUxMOworCW1hcC5tX2xlbiA9IEYyRlNfQllURVNfVE9fQkxLKGlvY2ItPmtpX3BvcyArIGlvdl9pdGVyX2NvdW50KGZyb20pKTsKKwlpZiAobWFwLm1fbGVuID4gbWFwLm1fbGJsaykKKwkJbWFwLm1fbGVuIC09IG1hcC5tX2xibGs7CisJZWxzZQorCQltYXAubV9sZW4gPSAwOwogCi0JaWYgKGYyZnNfZW5jcnlwdGVkX2lub2RlKGlub2RlKSkKLQkJcmV0dXJuIDA7CisJbWFwLm1fbmV4dF9wZ29mcyA9IE5VTEw7CiAKIAlpZiAoaW9jYi0+a2lfZmxhZ3MgJiBJT0NCX0RJUkVDVCkgewogCQlyZXQgPSBmMmZzX2NvbnZlcnRfaW5saW5lX2lub2RlKGlub2RlKTsKQEAgLTY3Miw2ICs2NzksOSBAQAogCWJvb2wgYWxsb2NhdGVkID0gZmFsc2U7CiAJYmxvY2tfdCBibGthZGRyOwogCisJaWYgKCFtYXhibG9ja3MpCisJCXJldHVybiAwOworCiAJbWFwLT5tX2xlbiA9IDA7CiAJbWFwLT5tX2ZsYWdzID0gMDsKIApAQCAtNzgzLDYgKzc5Myw3IEBACiAJCWVyciA9IHJlc2VydmVfbmV3X2Jsb2NrcygmZG4sIHByZWFsbG9jKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gc3luY19vdXQ7CisJCWFsbG9jYXRlZCA9IGRuLm5vZGVfY2hhbmdlZDsKIAogCQltYXAtPm1fbGVuICs9IGRuLm9mc19pbl9ub2RlIC0gb2ZzX2luX25vZGU7CiAJCWlmIChwcmVhbGxvYyAmJiBkbi5vZnNfaW5fbm9kZSAhPSBsYXN0X29mc19pbl9ub2RlICsgMSkgewpAQCAtOTY2LDggKzk3Nyw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RydWN0IGJpbyAqZjJmc19ncmFiX2JpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBibG9ja190IGJsa2FkZHIsCi0JCQkJCQkJdW5zaWduZWQgbnJfcGFnZXMpCitzdGF0aWMgc3RydWN0IGJpbyAqZjJmc19ncmFiX2JpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBibG9ja190IGJsa2FkZHIsCisJCQkJIHVuc2lnbmVkIG5yX3BhZ2VzKQogewogCXN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSA9IEYyRlNfSV9TQihpbm9kZSk7CiAJc3RydWN0IGZzY3J5cHRfY3R4ICpjdHggPSBOVUxMOwpAQCAtMTI4NCw3ICsxMjk1LDcgQEAKIAogCWlmICghd2JjLT5mb3JfcmVjbGFpbSkKIAkJbmVlZF9iYWxhbmNlX2ZzID0gdHJ1ZTsKLQllbHNlIGlmIChoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwKSkKKwllbHNlIGlmIChoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwLCAwKSkKIAkJZ290byByZWRpcnR5X291dDsKIAogCWVyciA9IC1FQUdBSU47CkBAIC0xMzQ0LDYgKzEzNTUsNyBAQAogCWludCBjeWNsZWQ7CiAJaW50IHJhbmdlX3dob2xlID0gMDsKIAlpbnQgdGFnOworCWludCBud3JpdHRlbiA9IDA7CiAKIAlwYWdldmVjX2luaXQoJnB2ZWMsIDApOwogCkBAIC0xNDE4LDYgKzE0MzAsOCBAQAogCQkJCWRvbmVfaW5kZXggPSBwYWdlLT5pbmRleCArIDE7CiAJCQkJZG9uZSA9IDE7CiAJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCW53cml0dGVuKys7CiAJCQl9CiAKIAkJCWlmICgtLXdiYy0+bnJfdG9fd3JpdGUgPD0gMCAmJgpAQCAtMTQzOSw2ICsxNDUzLDEwIEBACiAJaWYgKHdiYy0+cmFuZ2VfY3ljbGljIHx8IChyYW5nZV93aG9sZSAmJiB3YmMtPm5yX3RvX3dyaXRlID4gMCkpCiAJCW1hcHBpbmctPndyaXRlYmFja19pbmRleCA9IGRvbmVfaW5kZXg7CiAKKwlpZiAobndyaXR0ZW4pCisJCWYyZnNfc3VibWl0X21lcmdlZF9iaW9fY29uZChGMkZTX01fU0IobWFwcGluZyksIG1hcHBpbmctPmhvc3QsCisJCQkJCQkJTlVMTCwgMCwgREFUQSwgV1JJVEUpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTQ4MCw3ICsxNDk4LDYgQEAKIAkgKiBpZiBzb21lIHBhZ2VzIHdlcmUgdHJ1bmNhdGVkLCB3ZSBjYW5ub3QgZ3VhcmFudGVlIGl0cyBtYXBwaW5nLT5ob3N0CiAJICogdG8gZGV0ZWN0IHBlbmRpbmcgYmlvcy4KIAkgKi8KLQlmMmZzX3N1Ym1pdF9tZXJnZWRfYmlvKHNiaSwgREFUQSwgV1JJVEUpOwogCiAJcmVtb3ZlX2RpcnR5X2lub2RlKGlub2RlKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTUxOCw4ICsxNTM1LDcgQEAKIAkgKiB3ZSBhbHJlYWR5IGFsbG9jYXRlZCBhbGwgdGhlIGJsb2Nrcywgc28gd2UgZG9uJ3QgbmVlZCB0byBnZXQKIAkgKiB0aGUgYmxvY2sgYWRkcmVzc2VzIHdoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byBmaWxsIHRoZSBwYWdlLgogCSAqLwotCWlmICghZjJmc19oYXNfaW5saW5lX2RhdGEoaW5vZGUpICYmICFmMmZzX2VuY3J5cHRlZF9pbm9kZShpbm9kZSkgJiYKLQkJCQkJbGVuID09IFBBR0VfU0laRSkKKwlpZiAoIWYyZnNfaGFzX2lubGluZV9kYXRhKGlub2RlKSAmJiBsZW4gPT0gUEFHRV9TSVpFKQogCQlyZXR1cm4gMDsKIAogCWlmIChmMmZzX2hhc19pbmxpbmVfZGF0YShpbm9kZSkgfHwKQEAgLTE2MTYsNyArMTYzMiw3IEBACiAJaWYgKGVycikKIAkJZ290byBmYWlsOwogCi0JaWYgKG5lZWRfYmFsYW5jZSAmJiBoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwKSkgeworCWlmIChuZWVkX2JhbGFuY2UgJiYgaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCwgMCkpIHsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCWYyZnNfYmFsYW5jZV9mcyhzYmksIHRydWUpOwogCQlsb2NrX3BhZ2UocGFnZSk7CkBAIC0xNjMzLDIyICsxNjQ5LDEyIEBACiAJaWYgKGYyZnNfZW5jcnlwdGVkX2lub2RlKGlub2RlKSAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpKQogCQlmMmZzX3dhaXRfb25fZW5jcnlwdGVkX3BhZ2Vfd3JpdGViYWNrKHNiaSwgYmxrYWRkcik7CiAKLQlpZiAobGVuID09IFBBR0VfU0laRSkKLQkJZ290byBvdXRfdXBkYXRlOwotCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpCi0JCWdvdG8gb3V0X2NsZWFyOwotCi0JaWYgKChwb3MgJiBQQUdFX01BU0spID49IGlfc2l6ZV9yZWFkKGlub2RlKSkgewotCQl1bnNpZ25lZCBzdGFydCA9IHBvcyAmIChQQUdFX1NJWkUgLSAxKTsKLQkJdW5zaWduZWQgZW5kID0gc3RhcnQgKyBsZW47Ci0KLQkJLyogUmVhZGluZyBiZXlvbmQgaV9zaXplIGlzIHNpbXBsZTogbWVtc2V0IHRvIHplcm8gKi8KLQkJemVyb191c2VyX3NlZ21lbnRzKHBhZ2UsIDAsIHN0YXJ0LCBlbmQsIFBBR0VfU0laRSk7Ci0JCWdvdG8gb3V0X3VwZGF0ZTsKLQl9CisJaWYgKGxlbiA9PSBQQUdFX1NJWkUgfHwgUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQlyZXR1cm4gMDsKIAogCWlmIChibGthZGRyID09IE5FV19BRERSKSB7CiAJCXplcm9fdXNlcl9zZWdtZW50KHBhZ2UsIDAsIFBBR0VfU0laRSk7CisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgYmlvICpiaW87CiAKQEAgLTE2NzYsMTEgKzE2ODIsNiBAQAogCQkJZ290byBmYWlsOwogCQl9CiAJfQotb3V0X3VwZGF0ZToKLQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKLQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwotb3V0X2NsZWFyOgotCWNsZWFyX2NvbGRfZGF0YShwYWdlKTsKIAlyZXR1cm4gMDsKIAogZmFpbDoKQEAgLTE2OTgsMTEgKzE2OTksMjYgQEAKIAogCXRyYWNlX2YyZnNfd3JpdGVfZW5kKGlub2RlLCBwb3MsIGxlbiwgY29waWVkKTsKIAorCS8qCisJICogVGhpcyBzaG91bGQgYmUgY29tZSBmcm9tIGxlbiA9PSBQQUdFX1NJWkUsIGFuZCB3ZSBleHBlY3QgY29waWVkCisJICogc2hvdWxkIGJlIFBBR0VfU0laRS4gT3RoZXJ3aXNlLCB3ZSB0cmVhdCBpdCB3aXRoIHplcm8gY29waWVkIGFuZAorCSAqIGxldCBnZW5lcmljX3BlcmZvcm1fd3JpdGUoKSB0cnkgdG8gY29weSBkYXRhIGFnYWluIHRocm91Z2ggY29waWVkPTAuCisJICovCisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJaWYgKHVubGlrZWx5KGNvcGllZCAhPSBQQUdFX1NJWkUpKQorCQkJY29waWVkID0gMDsKKwkJZWxzZQorCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCX0KKwlpZiAoIWNvcGllZCkKKwkJZ290byB1bmxvY2tfb3V0OworCiAJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJY2xlYXJfY29sZF9kYXRhKHBhZ2UpOwogCiAJaWYgKHBvcyArIGNvcGllZCA+IGlfc2l6ZV9yZWFkKGlub2RlKSkKIAkJZjJmc19pX3NpemVfd3JpdGUoaW5vZGUsIHBvcyArIGNvcGllZCk7Ci0KK3VubG9ja19vdXQ6CiAJZjJmc19wdXRfcGFnZShwYWdlLCAxKTsKIAlmMmZzX3VwZGF0ZV90aW1lKEYyRlNfSV9TQihpbm9kZSksIFJFUV9USU1FKTsKIAlyZXR1cm4gY29waWVkOwpAQCAtMTg3Myw2ICsxODg5LDU4IEBACiAJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLCBibG9jaywgZ2V0X2RhdGFfYmxvY2tfYm1hcCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCisjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgorCitpbnQgZjJmc19taWdyYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCXN0cnVjdCBwYWdlICpuZXdwYWdlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSBtaWdyYXRlX21vZGUgbW9kZSkKK3sKKwlpbnQgcmMsIGV4dHJhX2NvdW50OworCXN0cnVjdCBmMmZzX2lub2RlX2luZm8gKmZpID0gRjJGU19JKG1hcHBpbmctPmhvc3QpOworCWJvb2wgYXRvbWljX3dyaXR0ZW4gPSBJU19BVE9NSUNfV1JJVFRFTl9QQUdFKHBhZ2UpOworCisJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCisJLyogbWlncmF0aW5nIGFuIGF0b21pYyB3cml0dGVuIHBhZ2UgaXMgc2FmZSB3aXRoIHRoZSBpbm1lbV9sb2NrIGhvbGQgKi8KKwlpZiAoYXRvbWljX3dyaXR0ZW4gJiYgIW11dGV4X3RyeWxvY2soJmZpLT5pbm1lbV9sb2NrKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKgorCSAqIEEgcmVmZXJlbmNlIGlzIGV4cGVjdGVkIGlmIFBhZ2VQcml2YXRlIHNldCB3aGVuIG1vdmUgbWFwcGluZywKKwkgKiBob3dldmVyIEYyRlMgYnJlYWtzIHRoaXMgZm9yIG1haW50YWluaW5nIGRpcnR5IHBhZ2UgY291bnRzIHdoZW4KKwkgKiB0cnVuY2F0aW5nIHBhZ2VzLiBTbyBoZXJlIGFkanVzdGluZyB0aGUgJ2V4dHJhX2NvdW50JyBtYWtlIGl0IHdvcmsuCisJICovCisJZXh0cmFfY291bnQgPSAoYXRvbWljX3dyaXR0ZW4gPyAxIDogMCkgLSBwYWdlX2hhc19wcml2YXRlKHBhZ2UpOworCXJjID0gbWlncmF0ZV9wYWdlX21vdmVfbWFwcGluZyhtYXBwaW5nLCBuZXdwYWdlLAorCQkJCXBhZ2UsIE5VTEwsIG1vZGUsIGV4dHJhX2NvdW50KTsKKwlpZiAocmMgIT0gTUlHUkFURVBBR0VfU1VDQ0VTUykgeworCQlpZiAoYXRvbWljX3dyaXR0ZW4pCisJCQltdXRleF91bmxvY2soJmZpLT5pbm1lbV9sb2NrKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChhdG9taWNfd3JpdHRlbikgeworCQlzdHJ1Y3QgaW5tZW1fcGFnZXMgKmN1cjsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXIsICZmaS0+aW5tZW1fcGFnZXMsIGxpc3QpCisJCQlpZiAoY3VyLT5wYWdlID09IHBhZ2UpIHsKKwkJCQljdXItPnBhZ2UgPSBuZXdwYWdlOworCQkJCWJyZWFrOworCQkJfQorCQltdXRleF91bmxvY2soJmZpLT5pbm1lbV9sb2NrKTsKKwkJcHV0X3BhZ2UocGFnZSk7CisJCWdldF9wYWdlKG5ld3BhZ2UpOworCX0KKworCWlmIChQYWdlUHJpdmF0ZShwYWdlKSkKKwkJU2V0UGFnZVByaXZhdGUobmV3cGFnZSk7CisJc2V0X3BhZ2VfcHJpdmF0ZShuZXdwYWdlLCBwYWdlX3ByaXZhdGUocGFnZSkpOworCisJbWlncmF0ZV9wYWdlX2NvcHkobmV3cGFnZSwgcGFnZSk7CisKKwlyZXR1cm4gTUlHUkFURVBBR0VfU1VDQ0VTUzsKK30KKyNlbmRpZgorCiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGYyZnNfZGJsb2NrX2FvcHMgPSB7CiAJLnJlYWRwYWdlCT0gZjJmc19yZWFkX2RhdGFfcGFnZSwKIAkucmVhZHBhZ2VzCT0gZjJmc19yZWFkX2RhdGFfcGFnZXMsCkBAIC0xODg1LDQgKzE5NTMsNyBAQAogCS5yZWxlYXNlcGFnZQk9IGYyZnNfcmVsZWFzZV9wYWdlLAogCS5kaXJlY3RfSU8JPSBmMmZzX2RpcmVjdF9JTywKIAkuYm1hcAkJPSBmMmZzX2JtYXAsCisjaWZkZWYgQ09ORklHX01JR1JBVElPTgorCS5taWdyYXRlcGFnZSAgICA9IGYyZnNfbWlncmF0ZV9wYWdlLAorI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9kZWJ1Zy5jIGIvZnMvZjJmcy9kZWJ1Zy5jCmluZGV4IGJhZGQ0MDcuLmZiMjQ1YmQgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvZGVidWcuYworKysgYi9mcy9mMmZzL2RlYnVnLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKIAlzaS0+bmRpcnR5X2RlbnQgPSBnZXRfcGFnZXMoc2JpLCBGMkZTX0RJUlRZX0RFTlRTKTsKIAlzaS0+bmRpcnR5X21ldGEgPSBnZXRfcGFnZXMoc2JpLCBGMkZTX0RJUlRZX01FVEEpOwogCXNpLT5uZGlydHlfZGF0YSA9IGdldF9wYWdlcyhzYmksIEYyRlNfRElSVFlfREFUQSk7CisJc2ktPm5kaXJ0eV9pbWV0YSA9IGdldF9wYWdlcyhzYmksIEYyRlNfRElSVFlfSU1FVEEpOwogCXNpLT5uZGlydHlfZGlycyA9IHNiaS0+bmRpcnR5X2lub2RlW0RJUl9JTk9ERV07CiAJc2ktPm5kaXJ0eV9maWxlcyA9IHNiaS0+bmRpcnR5X2lub2RlW0ZJTEVfSU5PREVdOwogCXNpLT5uZGlydHlfYWxsID0gc2JpLT5uZGlydHlfaW5vZGVbRElSVFlfTUVUQV07CkBAIC01NCw2ICs1NSw3IEBACiAJc2ktPnJzdmRfc2VncyA9IHJlc2VydmVkX3NlZ21lbnRzKHNiaSk7CiAJc2ktPm92ZXJwX3NlZ3MgPSBvdmVycHJvdmlzaW9uX3NlZ21lbnRzKHNiaSk7CiAJc2ktPnZhbGlkX2NvdW50ID0gdmFsaWRfdXNlcl9ibG9ja3Moc2JpKTsKKwlzaS0+ZGlzY2FyZF9ibGtzID0gZGlzY2FyZF9ibG9ja3Moc2JpKTsKIAlzaS0+dmFsaWRfbm9kZV9jb3VudCA9IHZhbGlkX25vZGVfY291bnQoc2JpKTsKIAlzaS0+dmFsaWRfaW5vZGVfY291bnQgPSB2YWxpZF9pbm9kZV9jb3VudChzYmkpOwogCXNpLT5pbmxpbmVfeGF0dHIgPSBhdG9taWNfcmVhZCgmc2JpLT5pbmxpbmVfeGF0dHIpOwpAQCAtMTU0LDcgKzE1Niw5IEBACiAJc2ktPmJhc2VfbWVtICs9IHNpemVvZihzdHJ1Y3Qgc2l0X2luZm8pOwogCXNpLT5iYXNlX21lbSArPSBNQUlOX1NFR1Moc2JpKSAqIHNpemVvZihzdHJ1Y3Qgc2VnX2VudHJ5KTsKIAlzaS0+YmFzZV9tZW0gKz0gZjJmc19iaXRtYXBfc2l6ZShNQUlOX1NFR1Moc2JpKSk7Ci0Jc2ktPmJhc2VfbWVtICs9IDMgKiBTSVRfVkJMT0NLX01BUF9TSVpFICogTUFJTl9TRUdTKHNiaSk7CisJc2ktPmJhc2VfbWVtICs9IDIgKiBTSVRfVkJMT0NLX01BUF9TSVpFICogTUFJTl9TRUdTKHNiaSk7CisJaWYgKGYyZnNfZGlzY2FyZF9lbihzYmkpKQorCQlzaS0+YmFzZV9tZW0gKz0gU0lUX1ZCTE9DS19NQVBfU0laRSAqIE1BSU5fU0VHUyhzYmkpOwogCXNpLT5iYXNlX21lbSArPSBTSVRfVkJMT0NLX01BUF9TSVpFOwogCWlmIChzYmktPnNlZ3NfcGVyX3NlYyA+IDEpCiAJCXNpLT5iYXNlX21lbSArPSBNQUlOX1NFQ1Moc2JpKSAqIHNpemVvZihzdHJ1Y3Qgc2VjX2VudHJ5KTsKQEAgLTIyOCw4ICsyMzIsMTMgQEAKIAkJCSAgIHNpLT5zc2FfYXJlYV9zZWdzLCBzaS0+bWFpbl9hcmVhX3NlZ3MpOwogCQlzZXFfcHJpbnRmKHMsICIoT3ZlclByb3Y6JWQgUmVzdjolZCldXG5cbiIsCiAJCQkgICBzaS0+b3ZlcnBfc2Vncywgc2ktPnJzdmRfc2Vncyk7Ci0JCXNlcV9wcmludGYocywgIlV0aWxpemF0aW9uOiAlZCUlICglZCB2YWxpZCBibG9ja3MpXG4iLAotCQkJICAgc2ktPnV0aWxpemF0aW9uLCBzaS0+dmFsaWRfY291bnQpOworCQlpZiAodGVzdF9vcHQoc2ktPnNiaSwgRElTQ0FSRCkpCisJCQlzZXFfcHJpbnRmKHMsICJVdGlsaXphdGlvbjogJXUlJSAoJXUgdmFsaWQgYmxvY2tzLCAldSBkaXNjYXJkIGJsb2NrcylcbiIsCisJCQkJc2ktPnV0aWxpemF0aW9uLCBzaS0+dmFsaWRfY291bnQsIHNpLT5kaXNjYXJkX2Jsa3MpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHMsICJVdGlsaXphdGlvbjogJXUlJSAoJXUgdmFsaWQgYmxvY2tzKVxuIiwKKwkJCQlzaS0+dXRpbGl6YXRpb24sIHNpLT52YWxpZF9jb3VudCk7CisKIAkJc2VxX3ByaW50ZihzLCAiICAtIE5vZGU6ICV1IChJbm9kZTogJXUsICIsCiAJCQkgICBzaS0+dmFsaWRfbm9kZV9jb3VudCwgc2ktPnZhbGlkX2lub2RlX2NvdW50KTsKIAkJc2VxX3ByaW50ZihzLCAiT3RoZXI6ICV1KVxuICAtIERhdGE6ICV1XG4iLApAQCAtMzExLDYgKzMyMCw4IEBACiAJCQkgICBzaS0+bmRpcnR5X2RhdGEsIHNpLT5uZGlydHlfZmlsZXMpOwogCQlzZXFfcHJpbnRmKHMsICIgIC0gbWV0YTogJTRsbGQgaW4gJTRkXG4iLAogCQkJICAgc2ktPm5kaXJ0eV9tZXRhLCBzaS0+bWV0YV9wYWdlcyk7CisJCXNlcV9wcmludGYocywgIiAgLSBpbWV0YTogJTRsbGRcbiIsCisJCQkgICBzaS0+bmRpcnR5X2ltZXRhKTsKIAkJc2VxX3ByaW50ZihzLCAiICAtIE5BVHM6ICU5ZC8lOWRcbiAgLSBTSVRzOiAlOWQvJTlkXG4iLAogCQkJICAgc2ktPmRpcnR5X25hdHMsIHNpLT5uYXRzLCBzaS0+ZGlydHlfc2l0cywgc2ktPnNpdHMpOwogCQlzZXFfcHJpbnRmKHMsICIgIC0gZnJlZV9uaWRzOiAlOWRcbiIsCmRpZmYgLS1naXQgYS9mcy9mMmZzL2Rpci5jIGIvZnMvZjJmcy9kaXIuYwppbmRleCA5MDU0YWVhLi4xMmI1ODM2IDEwMDY0NAotLS0gYS9mcy9mMmZzL2Rpci5jCisrKyBiL2ZzL2YyZnMvZGlyLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAkJcmV0dXJuIDQ7CiB9CiAKLXVuc2lnbmVkIGNoYXIgZjJmc19maWxldHlwZV90YWJsZVtGMkZTX0ZUX01BWF0gPSB7CitzdGF0aWMgdW5zaWduZWQgY2hhciBmMmZzX2ZpbGV0eXBlX3RhYmxlW0YyRlNfRlRfTUFYXSA9IHsKIAlbRjJGU19GVF9VTktOT1dOXQk9IERUX1VOS05PV04sCiAJW0YyRlNfRlRfUkVHX0ZJTEVdCT0gRFRfUkVHLAogCVtGMkZTX0ZUX0RJUl0JCT0gRFRfRElSLApAQCAtMTcyLDcgKzE3MiwxMCBAQAogCWludCBtYXhfc2xvdHM7CiAJZjJmc19oYXNoX3QgbmFtZWhhc2g7CiAKLQluYW1laGFzaCA9IGYyZnNfZGVudHJ5X2hhc2goJm5hbWUpOworCWlmKGZuYW1lLT5oYXNoKQorCQluYW1laGFzaCA9IGNwdV90b19sZTMyKGZuYW1lLT5oYXNoKTsKKwllbHNlCisJCW5hbWVoYXNoID0gZjJmc19kZW50cnlfaGFzaCgmbmFtZSk7CiAKIAluYnVja2V0ID0gZGlyX2J1Y2tldHMobGV2ZWwsIEYyRlNfSShkaXIpLT5pX2Rpcl9sZXZlbCk7CiAJbmJsb2NrID0gYnVja2V0X2Jsb2NrcyhsZXZlbCk7CkBAIC0yMTIsMzEgKzIxNSwxNyBAQAogCXJldHVybiBkZTsKIH0KIAotLyoKLSAqIEZpbmQgYW4gZW50cnkgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rvcnkgd2l0aCB0aGUgd2FudGVkIG5hbWUuCi0gKiBJdCByZXR1cm5zIHRoZSBwYWdlIHdoZXJlIHRoZSBlbnRyeSB3YXMgZm91bmQgKGFzIGEgcGFyYW1ldGVyIC0gcmVzX3BhZ2UpLAotICogYW5kIHRoZSBlbnRyeSBpdHNlbGYuIFBhZ2UgaXMgcmV0dXJuZWQgbWFwcGVkIGFuZCB1bmxvY2tlZC4KLSAqIEVudHJ5IGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQuCi0gKi8KLXN0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqZjJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLAotCQkJY29uc3Qgc3RydWN0IHFzdHIgKmNoaWxkLCBzdHJ1Y3QgcGFnZSAqKnJlc19wYWdlKQorc3RydWN0IGYyZnNfZGlyX2VudHJ5ICpfX2YyZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCXN0cnVjdCBmc2NyeXB0X25hbWUgKmZuYW1lLCBzdHJ1Y3QgcGFnZSAqKnJlc19wYWdlKQogewogCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gZGlyX2Jsb2NrcyhkaXIpOwogCXN0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqZGUgPSBOVUxMOwogCXVuc2lnbmVkIGludCBtYXhfZGVwdGg7CiAJdW5zaWduZWQgaW50IGxldmVsOwotCXN0cnVjdCBmc2NyeXB0X25hbWUgZm5hbWU7Ci0JaW50IGVycjsKLQotCWVyciA9IGZzY3J5cHRfc2V0dXBfZmlsZW5hbWUoZGlyLCBjaGlsZCwgMSwgJmZuYW1lKTsKLQlpZiAoZXJyKSB7Ci0JCSpyZXNfcGFnZSA9IEVSUl9QVFIoZXJyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJaWYgKGYyZnNfaGFzX2lubGluZV9kZW50cnkoZGlyKSkgewogCQkqcmVzX3BhZ2UgPSBOVUxMOwotCQlkZSA9IGZpbmRfaW5faW5saW5lX2RpcihkaXIsICZmbmFtZSwgcmVzX3BhZ2UpOworCQlkZSA9IGZpbmRfaW5faW5saW5lX2RpcihkaXIsIGZuYW1lLCByZXNfcGFnZSk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjU2LDExICsyNDUsMzUgQEAKIAogCWZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IG1heF9kZXB0aDsgbGV2ZWwrKykgewogCQkqcmVzX3BhZ2UgPSBOVUxMOwotCQlkZSA9IGZpbmRfaW5fbGV2ZWwoZGlyLCBsZXZlbCwgJmZuYW1lLCByZXNfcGFnZSk7CisJCWRlID0gZmluZF9pbl9sZXZlbChkaXIsIGxldmVsLCBmbmFtZSwgcmVzX3BhZ2UpOwogCQlpZiAoZGUgfHwgSVNfRVJSKCpyZXNfcGFnZSkpCiAJCQlicmVhazsKIAl9CiBvdXQ6CisJcmV0dXJuIGRlOworfQorCisvKgorICogRmluZCBhbiBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB3aXRoIHRoZSB3YW50ZWQgbmFtZS4KKyAqIEl0IHJldHVybnMgdGhlIHBhZ2Ugd2hlcmUgdGhlIGVudHJ5IHdhcyBmb3VuZCAoYXMgYSBwYXJhbWV0ZXIgLSByZXNfcGFnZSksCisgKiBhbmQgdGhlIGVudHJ5IGl0c2VsZi4gUGFnZSBpcyByZXR1cm5lZCBtYXBwZWQgYW5kIHVubG9ja2VkLgorICogRW50cnkgaXMgZ3VhcmFudGVlZCB0byBiZSB2YWxpZC4KKyAqLworc3RydWN0IGYyZnNfZGlyX2VudHJ5ICpmMmZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsCisJCQljb25zdCBzdHJ1Y3QgcXN0ciAqY2hpbGQsIHN0cnVjdCBwYWdlICoqcmVzX3BhZ2UpCit7CisJc3RydWN0IGYyZnNfZGlyX2VudHJ5ICpkZSA9IE5VTEw7CisJc3RydWN0IGZzY3J5cHRfbmFtZSBmbmFtZTsKKwlpbnQgZXJyOworCisJZXJyID0gZnNjcnlwdF9zZXR1cF9maWxlbmFtZShkaXIsIGNoaWxkLCAxLCAmZm5hbWUpOworCWlmIChlcnIpIHsKKwkJKnJlc19wYWdlID0gRVJSX1BUUihlcnIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkZSA9IF9fZjJmc19maW5kX2VudHJ5KGRpciwgJmZuYW1lLCByZXNfcGFnZSk7CisKIAlmc2NyeXB0X2ZyZWVfZmlsZW5hbWUoJmZuYW1lKTsKIAlyZXR1cm4gZGU7CiB9CkBAIC0zNzUsNyArMzg4LDggQEAKIH0KIAogc3RydWN0IHBhZ2UgKmluaXRfaW5vZGVfbWV0YWRhdGEoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsCi0JCQljb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IHBhZ2UgKmRwYWdlKQorCQkJY29uc3Qgc3RydWN0IHFzdHIgKm5ld19uYW1lLCBjb25zdCBzdHJ1Y3QgcXN0ciAqb3JpZ19uYW1lLAorCQkJc3RydWN0IHBhZ2UgKmRwYWdlKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCBlcnI7CkBAIC00MDAsNyArNDE0LDcgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gcHV0X2Vycm9yOwogCi0JCWVyciA9IGYyZnNfaW5pdF9zZWN1cml0eShpbm9kZSwgZGlyLCBuYW1lLCBwYWdlKTsKKwkJZXJyID0gZjJmc19pbml0X3NlY3VyaXR5KGlub2RlLCBkaXIsIG9yaWdfbmFtZSwgcGFnZSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIHB1dF9lcnJvcjsKIApAQCAtNDE3LDggKzQzMSw4IEBACiAJCXNldF9jb2xkX25vZGUoaW5vZGUsIHBhZ2UpOwogCX0KIAotCWlmIChuYW1lKQotCQlpbml0X2RlbnRfaW5vZGUobmFtZSwgcGFnZSk7CisJaWYgKG5ld19uYW1lKQorCQlpbml0X2RlbnRfaW5vZGUobmV3X25hbWUsIHBhZ2UpOwogCiAJLyoKIAkgKiBUaGlzIGZpbGUgc2hvdWxkIGJlIGNoZWNrcG9pbnRlZCBkdXJpbmcgZnN5bmMuCkBAIC00OTYsNyArNTEwLDcgQEAKIAlkZS0+aW5vID0gY3B1X3RvX2xlMzIoaW5vKTsKIAlzZXRfZGVfdHlwZShkZSwgbW9kZSk7CiAJZm9yIChpID0gMDsgaSA8IHNsb3RzOyBpKyspIHsKLQkJdGVzdF9hbmRfc2V0X2JpdF9sZShiaXRfcG9zICsgaSwgKHZvaWQgKilkLT5iaXRtYXApOworCQlfX3NldF9iaXRfbGUoYml0X3BvcyArIGksICh2b2lkICopZC0+Yml0bWFwKTsKIAkJLyogYXZvaWQgd3JvbmcgZ2FyYmFnZSBkYXRhIGZvciByZWFkZGlyICovCiAJCWlmIChpKQogCQkJKGRlICsgaSktPm5hbWVfbGVuID0gMDsKQEAgLTUwNCw2ICs1MTgsNyBAQAogfQogCiBpbnQgZjJmc19hZGRfcmVndWxhcl9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3Qgc3RydWN0IHFzdHIgKm5ld19uYW1lLAorCQkJCWNvbnN0IHN0cnVjdCBxc3RyICpvcmlnX25hbWUsCiAJCQkJc3RydWN0IGlub2RlICppbm9kZSwgbmlkX3QgaW5vLCB1bW9kZV90IG1vZGUpCiB7CiAJdW5zaWduZWQgaW50IGJpdF9wb3M7CkBAIC01MzAsNyArNTQ1LDcgQEAKIAogc3RhcnQ6CiAjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCi0JaWYgKHRpbWVfdG9faW5qZWN0KEZBVUxUX0RJUl9ERVBUSCkpCisJaWYgKHRpbWVfdG9faW5qZWN0KEYyRlNfSV9TQihkaXIpLCBGQVVMVF9ESVJfREVQVEgpKQogCQlyZXR1cm4gLUVOT1NQQzsKICNlbmRpZgogCWlmICh1bmxpa2VseShjdXJyZW50X2RlcHRoID09IE1BWF9ESVJfSEFTSF9ERVBUSCkpCkBAIC01NjksNyArNTg0LDggQEAKIAogCWlmIChpbm9kZSkgewogCQlkb3duX3dyaXRlKCZGMkZTX0koaW5vZGUpLT5pX3NlbSk7Ci0JCXBhZ2UgPSBpbml0X2lub2RlX21ldGFkYXRhKGlub2RlLCBkaXIsIG5ld19uYW1lLCBOVUxMKTsKKwkJcGFnZSA9IGluaXRfaW5vZGVfbWV0YWRhdGEoaW5vZGUsIGRpciwgbmV3X25hbWUsCisJCQkJCQlvcmlnX25hbWUsIE5VTEwpOwogCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCQllcnIgPSBQVFJfRVJSKHBhZ2UpOwogCQkJZ290byBmYWlsOwpAQCAtNTk5LDYgKzYxNSwyNiBAQAogCXJldHVybiBlcnI7CiB9CiAKK2ludCBfX2YyZnNfZG9fYWRkX2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBmc2NyeXB0X25hbWUgKmZuYW1lLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIG5pZF90IGlubywgdW1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBxc3RyIG5ld19uYW1lOworCWludCBlcnIgPSAtRUFHQUlOOworCisJbmV3X25hbWUubmFtZSA9IGZuYW1lX25hbWUoZm5hbWUpOworCW5ld19uYW1lLmxlbiA9IGZuYW1lX2xlbihmbmFtZSk7CisKKwlpZiAoZjJmc19oYXNfaW5saW5lX2RlbnRyeShkaXIpKQorCQllcnIgPSBmMmZzX2FkZF9pbmxpbmVfZW50cnkoZGlyLCAmbmV3X25hbWUsIGZuYW1lLT51c3JfZm5hbWUsCisJCQkJCQkJaW5vZGUsIGlubywgbW9kZSk7CisJaWYgKGVyciA9PSAtRUFHQUlOKQorCQllcnIgPSBmMmZzX2FkZF9yZWd1bGFyX2VudHJ5KGRpciwgJm5ld19uYW1lLCBmbmFtZS0+dXNyX2ZuYW1lLAorCQkJCQkJCWlub2RlLCBpbm8sIG1vZGUpOworCisJZjJmc191cGRhdGVfdGltZShGMkZTX0lfU0IoZGlyKSwgUkVRX1RJTUUpOworCXJldHVybiBlcnI7Cit9CisKIC8qCiAgKiBDYWxsZXIgc2hvdWxkIGdyYWIgYW5kIHJlbGVhc2UgYSByd3NlbSBieSBjYWxsaW5nIGYyZnNfbG9ja19vcCgpIGFuZAogICogZjJmc191bmxvY2tfb3AoKS4KQEAgLTYwNywyNCArNjQzLDE1IEBACiAJCQkJc3RydWN0IGlub2RlICppbm9kZSwgbmlkX3QgaW5vLCB1bW9kZV90IG1vZGUpCiB7CiAJc3RydWN0IGZzY3J5cHRfbmFtZSBmbmFtZTsKLQlzdHJ1Y3QgcXN0ciBuZXdfbmFtZTsKIAlpbnQgZXJyOwogCiAJZXJyID0gZnNjcnlwdF9zZXR1cF9maWxlbmFtZShkaXIsIG5hbWUsIDAsICZmbmFtZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCW5ld19uYW1lLm5hbWUgPSBmbmFtZV9uYW1lKCZmbmFtZSk7Ci0JbmV3X25hbWUubGVuID0gZm5hbWVfbGVuKCZmbmFtZSk7Ci0KLQllcnIgPSAtRUFHQUlOOwotCWlmIChmMmZzX2hhc19pbmxpbmVfZGVudHJ5KGRpcikpCi0JCWVyciA9IGYyZnNfYWRkX2lubGluZV9lbnRyeShkaXIsICZuZXdfbmFtZSwgaW5vZGUsIGlubywgbW9kZSk7Ci0JaWYgKGVyciA9PSAtRUFHQUlOKQotCQllcnIgPSBmMmZzX2FkZF9yZWd1bGFyX2VudHJ5KGRpciwgJm5ld19uYW1lLCBpbm9kZSwgaW5vLCBtb2RlKTsKKwllcnIgPSBfX2YyZnNfZG9fYWRkX2xpbmsoZGlyLCAmZm5hbWUsIGlub2RlLCBpbm8sIG1vZGUpOwogCiAJZnNjcnlwdF9mcmVlX2ZpbGVuYW1lKCZmbmFtZSk7Ci0JZjJmc191cGRhdGVfdGltZShGMkZTX0lfU0IoZGlyKSwgUkVRX1RJTUUpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTYzNCw3ICs2NjEsNyBAQAogCWludCBlcnIgPSAwOwogCiAJZG93bl93cml0ZSgmRjJGU19JKGlub2RlKS0+aV9zZW0pOwotCXBhZ2UgPSBpbml0X2lub2RlX21ldGFkYXRhKGlub2RlLCBkaXIsIE5VTEwsIE5VTEwpOworCXBhZ2UgPSBpbml0X2lub2RlX21ldGFkYXRhKGlub2RlLCBkaXIsIE5VTEwsIE5VTEwsIE5VTEwpOwogCWlmIChJU19FUlIocGFnZSkpIHsKIAkJZXJyID0gUFRSX0VSUihwYWdlKTsKIAkJZ290byBmYWlsOwpAQCAtNzg2LDE5ICs4MTMsMTIgQEAKIAogCQlpZiAoZjJmc19lbmNyeXB0ZWRfaW5vZGUoZC0+aW5vZGUpKSB7CiAJCQlpbnQgc2F2ZV9sZW4gPSBmc3RyLT5sZW47Ci0JCQlpbnQgcmV0OworCQkJaW50IGVycjsKIAotCQkJZGVfbmFtZS5uYW1lID0gZjJmc19rbWFsbG9jKGRlX25hbWUubGVuLCBHRlBfTk9GUyk7Ci0JCQlpZiAoIWRlX25hbWUubmFtZSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCW1lbWNweShkZV9uYW1lLm5hbWUsIGQtPmZpbGVuYW1lW2JpdF9wb3NdLCBkZV9uYW1lLmxlbik7Ci0KLQkJCXJldCA9IGZzY3J5cHRfZm5hbWVfZGlza190b191c3IoZC0+aW5vZGUsCisJCQllcnIgPSBmc2NyeXB0X2ZuYW1lX2Rpc2tfdG9fdXNyKGQtPmlub2RlLAogCQkJCQkJKHUzMilkZS0+aGFzaF9jb2RlLCAwLAogCQkJCQkJJmRlX25hbWUsIGZzdHIpOwotCQkJa2ZyZWUoZGVfbmFtZS5uYW1lKTsKLQkJCWlmIChyZXQgPCAwKQorCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gdHJ1ZTsKIAogCQkJZGVfbmFtZSA9ICpmc3RyOwpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9mMmZzLmggYi9mcy9mMmZzL2YyZnMuaAppbmRleCAxNGY1ZmUyLi45ZThkZTE4IDEwMDY0NAotLS0gYS9mcy9mMmZzL2YyZnMuaAorKysgYi9mcy9mMmZzL2YyZnMuaApAQCAtNDYsNiArNDYsOCBAQAogCUZBVUxUX0JMT0NLLAogCUZBVUxUX0RJUl9ERVBUSCwKIAlGQVVMVF9FVklDVF9JTk9ERSwKKwlGQVVMVF9JTywKKwlGQVVMVF9DSEVDS1BPSU5ULAogCUZBVUxUX01BWCwKIH07CiAKQEAgLTU1LDQwICs1Nyw4IEBACiAJdW5zaWduZWQgaW50IGluamVjdF90eXBlOwogfTsKIAotZXh0ZXJuIHN0cnVjdCBmMmZzX2ZhdWx0X2luZm8gZjJmc19mYXVsdDsKIGV4dGVybiBjaGFyICpmYXVsdF9uYW1lW0ZBVUxUX01BWF07Ci0jZGVmaW5lIElTX0ZBVUxUX1NFVCh0eXBlKSAoZjJmc19mYXVsdC5pbmplY3RfdHlwZSAmICgxIDw8ICh0eXBlKSkpCi0KLXN0YXRpYyBpbmxpbmUgYm9vbCB0aW1lX3RvX2luamVjdChpbnQgdHlwZSkKLXsKLQlpZiAoIWYyZnNfZmF1bHQuaW5qZWN0X3JhdGUpCi0JCXJldHVybiBmYWxzZTsKLQlpZiAodHlwZSA9PSBGQVVMVF9LTUFMTE9DICYmICFJU19GQVVMVF9TRVQodHlwZSkpCi0JCXJldHVybiBmYWxzZTsKLQllbHNlIGlmICh0eXBlID09IEZBVUxUX1BBR0VfQUxMT0MgJiYgIUlTX0ZBVUxUX1NFVCh0eXBlKSkKLQkJcmV0dXJuIGZhbHNlOwotCWVsc2UgaWYgKHR5cGUgPT0gRkFVTFRfQUxMT0NfTklEICYmICFJU19GQVVMVF9TRVQodHlwZSkpCi0JCXJldHVybiBmYWxzZTsKLQllbHNlIGlmICh0eXBlID09IEZBVUxUX09SUEhBTiAmJiAhSVNfRkFVTFRfU0VUKHR5cGUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JZWxzZSBpZiAodHlwZSA9PSBGQVVMVF9CTE9DSyAmJiAhSVNfRkFVTFRfU0VUKHR5cGUpKQotCQlyZXR1cm4gZmFsc2U7Ci0JZWxzZSBpZiAodHlwZSA9PSBGQVVMVF9ESVJfREVQVEggJiYgIUlTX0ZBVUxUX1NFVCh0eXBlKSkKLQkJcmV0dXJuIGZhbHNlOwotCWVsc2UgaWYgKHR5cGUgPT0gRkFVTFRfRVZJQ1RfSU5PREUgJiYgIUlTX0ZBVUxUX1NFVCh0eXBlKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JYXRvbWljX2luYygmZjJmc19mYXVsdC5pbmplY3Rfb3BzKTsKLQlpZiAoYXRvbWljX3JlYWQoJmYyZnNfZmF1bHQuaW5qZWN0X29wcykgPj0gZjJmc19mYXVsdC5pbmplY3RfcmF0ZSkgewotCQlhdG9taWNfc2V0KCZmMmZzX2ZhdWx0LmluamVjdF9vcHMsIDApOwotCQlwcmludGsoIiVzRjJGUy1mcyA6IGluamVjdCAlcyBpbiAlcEZcbiIsCi0JCQkJS0VSTl9JTkZPLAotCQkJCWZhdWx0X25hbWVbdHlwZV0sCi0JCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KKyNkZWZpbmUgSVNfRkFVTFRfU0VUKGZpLCB0eXBlKSAoZmktPmluamVjdF90eXBlICYgKDEgPDwgKHR5cGUpKSkKICNlbmRpZgogCiAvKgpAQCAtMTU4LDcgKzEyOCw3IEBACiAJQ1BfRElTQ0FSRCwKIH07CiAKLSNkZWZpbmUgREVGX0JBVENIRURfVFJJTV9TRUNUSU9OUwkzMgorI2RlZmluZSBERUZfQkFUQ0hFRF9UUklNX1NFQ1RJT05TCTIKICNkZWZpbmUgQkFUQ0hFRF9UUklNX1NFR01FTlRTKHNiaSkJXAogCQkoU01fSShzYmkpLT50cmltX3NlY3Rpb25zICogKHNiaSktPnNlZ3NfcGVyX3NlYykKICNkZWZpbmUgQkFUQ0hFRF9UUklNX0JMT0NLUyhzYmkpCVwKQEAgLTIxMSw2ICsxODEsMTMgQEAKIAlpbnQgbGVuOwkJLyogIyBvZiBjb25zZWN1dGl2ZSBibG9ja3Mgb2YgdGhlIGRpc2NhcmQgKi8KIH07CiAKK3N0cnVjdCBiaW9fZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGNvbXBsZXRpb24gZXZlbnQ7CisJaW50IGVycm9yOworfTsKKwogLyogZm9yIHRoZSBsaXN0IG9mIGZzeW5jIGlub2RlcywgdXNlZCBvbmx5IGR1cmluZyByZWNvdmVyeSAqLwogc3RydWN0IGZzeW5jX2lub2RlX2VudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIGxpc3QgaGVhZCAqLwpAQCAtNjQ1LDYgKzYyMiw3IEBACiAKIAkvKiBmb3Igc21hbGwgZGlzY2FyZCBtYW5hZ2VtZW50ICovCiAJc3RydWN0IGxpc3RfaGVhZCBkaXNjYXJkX2xpc3Q7CQkvKiA0S0IgZGlzY2FyZCBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCB3YWl0X2xpc3Q7CQkvKiBsaW5rZWQgd2l0aCBpc3N1ZWQgZGlzY2FyZCBiaW8gKi8KIAlpbnQgbnJfZGlzY2FyZHM7CQkJLyogIyBvZiBkaXNjYXJkcyBpbiB0aGUgbGlzdCAqLwogCWludCBtYXhfZGlzY2FyZHM7CQkJLyogbWF4LiBkaXNjYXJkcyB0byBiZSBpc3N1ZWQgKi8KIApAQCAtNzQ4LDYgKzcyNiw3IEBACiAJU0JJX05FRURfRlNDSywJCQkJLyogbmVlZCBmc2NrLmYyZnMgdG8gZml4ICovCiAJU0JJX1BPUl9ET0lORywJCQkJLyogcmVjb3ZlcnkgaXMgZG9pbmcgb3Igbm90ICovCiAJU0JJX05FRURfU0JfV1JJVEUsCQkJLyogbmVlZCB0byByZWNvdmVyIHN1cGVyYmxvY2sgKi8KKwlTQklfTkVFRF9DUCwJCQkJLyogbmVlZCB0byBjaGVja3BvaW50ICovCiB9OwogCiBlbnVtIHsKQEAgLTc2NSw3ICs3NDQsNyBAQAogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqc19wcm9jOwkJLyogcHJvYyBlbnRyeSAqLwogCXN0cnVjdCBmMmZzX3N1cGVyX2Jsb2NrICpyYXdfc3VwZXI7CS8qIHJhdyBzdXBlciBibG9jayBwb2ludGVyICovCiAJaW50IHZhbGlkX3N1cGVyX2Jsb2NrOwkJCS8qIHZhbGlkIHN1cGVyIGJsb2NrIG5vICovCi0JaW50IHNfZmxhZzsJCQkJLyogZmxhZ3MgZm9yIHNiaSAqLworCXVuc2lnbmVkIGxvbmcgc19mbGFnOwkJCQkvKiBmbGFncyBmb3Igc2JpICovCiAKICNpZmRlZiBDT05GSUdfRjJGU19GU19FTkNSWVBUSU9OCiAJdTgga2V5X3ByZWZpeFtGMkZTX0tFWV9ERVNDX1BSRUZJWF9TSVpFXTsKQEAgLTc4NSw2ICs3NjQsNyBAQAogCiAJLyogZm9yIGNoZWNrcG9pbnQgKi8KIAlzdHJ1Y3QgZjJmc19jaGVja3BvaW50ICpja3B0OwkJLyogcmF3IGNoZWNrcG9pbnQgcG9pbnRlciAqLworCXNwaW5sb2NrX3QgY3BfbG9jazsJCQkvKiBmb3IgZmxhZyBpbiBja3B0ICovCiAJc3RydWN0IGlub2RlICptZXRhX2lub2RlOwkJLyogY2FjaGUgbWV0YSBibG9ja3MgKi8KIAlzdHJ1Y3QgbXV0ZXggY3BfbXV0ZXg7CQkJLyogY2hlY2twb2ludCBwcm9jZWR1cmUgbG9jayAqLwogCXN0cnVjdCByd19zZW1hcGhvcmUgY3BfcndzZW07CQkvKiBibG9ja2luZyBGUyBvcGVyYXRpb25zICovCkBAIC04OTIsOCArODcyLDM3IEBACiAKIAkvKiBSZWZlcmVuY2UgdG8gY2hlY2tzdW0gYWxnb3JpdGhtIGRyaXZlciB2aWEgY3J5cHRvYXBpICovCiAJc3RydWN0IGNyeXB0b19zaGFzaCAqc19jaGtzdW1fZHJpdmVyOworCisJLyogRm9yIGZhdWx0IGluamVjdGlvbiAqLworI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgorCXN0cnVjdCBmMmZzX2ZhdWx0X2luZm8gZmF1bHRfaW5mbzsKKyNlbmRpZgogfTsKIAorI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgorc3RhdGljIGlubGluZSBib29sIHRpbWVfdG9faW5qZWN0KHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgaW50IHR5cGUpCit7CisJc3RydWN0IGYyZnNfZmF1bHRfaW5mbyAqZmZpID0gJnNiaS0+ZmF1bHRfaW5mbzsKKworCWlmICghZmZpLT5pbmplY3RfcmF0ZSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCFJU19GQVVMVF9TRVQoZmZpLCB0eXBlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJYXRvbWljX2luYygmZmZpLT5pbmplY3Rfb3BzKTsKKwlpZiAoYXRvbWljX3JlYWQoJmZmaS0+aW5qZWN0X29wcykgPj0gZmZpLT5pbmplY3RfcmF0ZSkgeworCQlhdG9taWNfc2V0KCZmZmktPmluamVjdF9vcHMsIDApOworCQlwcmludGsoIiVzRjJGUy1mcyA6IGluamVjdCAlcyBpbiAlcEZcbiIsCisJCQkJS0VSTl9JTkZPLAorCQkJCWZhdWx0X25hbWVbdHlwZV0sCisJCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCiAvKiBGb3Igd3JpdGUgc3RhdGlzdGljcy4gU3VwcG9zZSBzZWN0b3Igc2l6ZSBpcyA1MTIgYnl0ZXMsCiAgKiBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyBpbiBrYnl0ZXMuIHMgaXMgb2Ygc3RydWN0IGYyZnNfc2JfaW5mby4KICAqLwpAQCAtMTAzNCwxNyArMTA0MywxNyBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNfc2JpX2ZsYWdfc2V0KHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgdW5zaWduZWQgaW50IHR5cGUpCiB7Ci0JcmV0dXJuIHNiaS0+c19mbGFnICYgKDB4MDEgPDwgdHlwZSk7CisJcmV0dXJuIHRlc3RfYml0KHR5cGUsICZzYmktPnNfZmxhZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2JpX2ZsYWcoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCB1bnNpZ25lZCBpbnQgdHlwZSkKIHsKLQlzYmktPnNfZmxhZyB8PSAoMHgwMSA8PCB0eXBlKTsKKwlzZXRfYml0KHR5cGUsICZzYmktPnNfZmxhZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9zYmlfZmxhZyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIHVuc2lnbmVkIGludCB0eXBlKQogewotCXNiaS0+c19mbGFnICY9IH4oMHgwMSA8PCB0eXBlKTsKKwljbGVhcl9iaXQodHlwZSwgJnNiaS0+c19mbGFnKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgY3VyX2NwX3ZlcnNpb24oc3RydWN0IGYyZnNfY2hlY2twb2ludCAqY3ApCkBAIC0xMDUyLDI2ICsxMDYxLDU3IEBACiAJcmV0dXJuIGxlNjRfdG9fY3B1KGNwLT5jaGVja3BvaW50X3Zlcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBpc19zZXRfY2twdF9mbGFncyhzdHJ1Y3QgZjJmc19jaGVja3BvaW50ICpjcCwgdW5zaWduZWQgaW50IGYpCitzdGF0aWMgaW5saW5lIGJvb2wgX19pc19zZXRfY2twdF9mbGFncyhzdHJ1Y3QgZjJmc19jaGVja3BvaW50ICpjcCwgdW5zaWduZWQgaW50IGYpCiB7CiAJdW5zaWduZWQgaW50IGNrcHRfZmxhZ3MgPSBsZTMyX3RvX2NwdShjcC0+Y2twdF9mbGFncyk7CisKIAlyZXR1cm4gY2twdF9mbGFncyAmIGY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY2twdF9mbGFncyhzdHJ1Y3QgZjJmc19jaGVja3BvaW50ICpjcCwgdW5zaWduZWQgaW50IGYpCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfc2V0X2NrcHRfZmxhZ3Moc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCB1bnNpZ25lZCBpbnQgZikKIHsKLQl1bnNpZ25lZCBpbnQgY2twdF9mbGFncyA9IGxlMzJfdG9fY3B1KGNwLT5ja3B0X2ZsYWdzKTsKKwlyZXR1cm4gX19pc19zZXRfY2twdF9mbGFncyhGMkZTX0NLUFQoc2JpKSwgZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NldF9ja3B0X2ZsYWdzKHN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKmNwLCB1bnNpZ25lZCBpbnQgZikKK3sKKwl1bnNpZ25lZCBpbnQgY2twdF9mbGFnczsKKworCWNrcHRfZmxhZ3MgPSBsZTMyX3RvX2NwdShjcC0+Y2twdF9mbGFncyk7CiAJY2twdF9mbGFncyB8PSBmOwogCWNwLT5ja3B0X2ZsYWdzID0gY3B1X3RvX2xlMzIoY2twdF9mbGFncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9ja3B0X2ZsYWdzKHN0cnVjdCBmMmZzX2NoZWNrcG9pbnQgKmNwLCB1bnNpZ25lZCBpbnQgZikKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY2twdF9mbGFncyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIHVuc2lnbmVkIGludCBmKQogewotCXVuc2lnbmVkIGludCBja3B0X2ZsYWdzID0gbGUzMl90b19jcHUoY3AtPmNrcHRfZmxhZ3MpOworCXNwaW5fbG9jaygmc2JpLT5jcF9sb2NrKTsKKwlfX3NldF9ja3B0X2ZsYWdzKEYyRlNfQ0tQVChzYmkpLCBmKTsKKwlzcGluX3VubG9jaygmc2JpLT5jcF9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fY2xlYXJfY2twdF9mbGFncyhzdHJ1Y3QgZjJmc19jaGVja3BvaW50ICpjcCwgdW5zaWduZWQgaW50IGYpCit7CisJdW5zaWduZWQgaW50IGNrcHRfZmxhZ3M7CisKKwlja3B0X2ZsYWdzID0gbGUzMl90b19jcHUoY3AtPmNrcHRfZmxhZ3MpOwogCWNrcHRfZmxhZ3MgJj0gKH5mKTsKIAljcC0+Y2twdF9mbGFncyA9IGNwdV90b19sZTMyKGNrcHRfZmxhZ3MpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfY2twdF9mbGFncyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIHVuc2lnbmVkIGludCBmKQoreworCXNwaW5fbG9jaygmc2JpLT5jcF9sb2NrKTsKKwlfX2NsZWFyX2NrcHRfZmxhZ3MoRjJGU19DS1BUKHNiaSksIGYpOworCXNwaW5fdW5sb2NrKCZzYmktPmNwX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZjJmc19kaXNjYXJkX2VuKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKHNiaS0+c2ItPnNfYmRldik7CisKKwlyZXR1cm4gYmxrX3F1ZXVlX2Rpc2NhcmQocSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBmMmZzX2xvY2tfb3Aoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKQogewogCWRvd25fcmVhZCgmc2JpLT5jcF9yd3NlbSk7CkBAIC0xMTEwLDggKzExNTAsOCBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgX19leGlzdF9ub2RlX3N1bW1hcmllcyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkpCiB7Ci0JcmV0dXJuIChpc19zZXRfY2twdF9mbGFncyhGMkZTX0NLUFQoc2JpKSwgQ1BfVU1PVU5UX0ZMQUcpIHx8Ci0JCQlpc19zZXRfY2twdF9mbGFncyhGMkZTX0NLUFQoc2JpKSwgQ1BfRkFTVEJPT1RfRkxBRykpOworCXJldHVybiAoaXNfc2V0X2NrcHRfZmxhZ3Moc2JpLCBDUF9VTU9VTlRfRkxBRykgfHwKKwkJCWlzX3NldF9ja3B0X2ZsYWdzKHNiaSwgQ1BfRkFTVEJPT1RfRkxBRykpOwogfQogCiAvKgpAQCAtMTE1MSw3ICsxMTkxLDcgQEAKIAlibGtjbnRfdCBkaWZmOwogCiAjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCi0JaWYgKHRpbWVfdG9faW5qZWN0KEZBVUxUX0JMT0NLKSkKKwlpZiAodGltZV90b19pbmplY3Qoc2JpLCBGQVVMVF9CTE9DSykpCiAJCXJldHVybiBmYWxzZTsKICNlbmRpZgogCS8qCkBAIC0xMTkzLDYgKzEyMzMsMTAgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbmNfcGFnZV9jb3VudChzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIGludCBjb3VudF90eXBlKQogewogCXBlcmNwdV9jb3VudGVyX2luYygmc2JpLT5ucl9wYWdlc1tjb3VudF90eXBlXSk7CisKKwlpZiAoY291bnRfdHlwZSA9PSBGMkZTX0RJUlRZX0RBVEEgfHwgY291bnRfdHlwZSA9PSBGMkZTX0lOTUVNX1BBR0VTKQorCQlyZXR1cm47CisKIAlzZXRfc2JpX2ZsYWcoc2JpLCBTQklfSVNfRElSVFkpOwogfQogCkBAIC0xMjQzLDYgKzEyODcsMTEgQEAKIAlyZXR1cm4gc2JpLT50b3RhbF92YWxpZF9ibG9ja19jb3VudDsKIH0KIAorc3RhdGljIGlubGluZSBibG9ja190IGRpc2NhcmRfYmxvY2tzKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSkKK3sKKwlyZXR1cm4gc2JpLT5kaXNjYXJkX2Jsa3M7Cit9CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2JpdG1hcF9zaXplKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgaW50IGZsYWcpCiB7CiAJc3RydWN0IGYyZnNfY2hlY2twb2ludCAqY2twdCA9IEYyRlNfQ0tQVChzYmkpOwpAQCAtMTM3Niw3ICsxNDI1LDcgQEAKIAlpZiAocGFnZSkKIAkJcmV0dXJuIHBhZ2U7CiAKLQlpZiAodGltZV90b19pbmplY3QoRkFVTFRfUEFHRV9BTExPQykpCisJaWYgKHRpbWVfdG9faW5qZWN0KEYyRlNfTV9TQihtYXBwaW5nKSwgRkFVTFRfUEFHRV9BTExPQykpCiAJCXJldHVybiBOVUxMOwogI2VuZGlmCiAJaWYgKCFmb3Jfd3JpdGUpCkBAIC0xODA0LDcgKzE4NTMsNyBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgZjJmc19jcF9lcnJvcihzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkpCiB7Ci0JcmV0dXJuIGlzX3NldF9ja3B0X2ZsYWdzKHNiaS0+Y2twdCwgQ1BfRVJST1JfRkxBRyk7CisJcmV0dXJuIGlzX3NldF9ja3B0X2ZsYWdzKHNiaSwgQ1BfRVJST1JfRkxBRyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19kb3RfZG90ZG90KGNvbnN0IHN0cnVjdCBxc3RyICpzdHIpCkBAIC0xODI3LDEwICsxODc2LDExIEBACiAJcmV0dXJuIFNfSVNSRUcoaW5vZGUtPmlfbW9kZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAqZjJmc19rbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3N0YXRpYyBpbmxpbmUgdm9pZCAqZjJmc19rbWFsbG9jKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKKwkJCQkJc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQogewogI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgotCWlmICh0aW1lX3RvX2luamVjdChGQVVMVF9LTUFMTE9DKSkKKwlpZiAodGltZV90b19pbmplY3Qoc2JpLCBGQVVMVF9LTUFMTE9DKSkKIAkJcmV0dXJuIE5VTEw7CiAjZW5kaWYKIAlyZXR1cm4ga21hbGxvYyhzaXplLCBmbGFncyk7CkBAIC0xODg1LDYgKzE5MzUsNyBAQAogICovCiB2b2lkIGYyZnNfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqKTsKIHN0cnVjdCBpbm9kZSAqZjJmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nKTsKK3N0cnVjdCBpbm9kZSAqZjJmc19pZ2V0X3JldHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nKTsKIGludCB0cnlfdG9fZnJlZV9uYXRzKHN0cnVjdCBmMmZzX3NiX2luZm8gKiwgaW50KTsKIGludCB1cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICosIHN0cnVjdCBwYWdlICopOwogaW50IHVwZGF0ZV9pbm9kZV9wYWdlKHN0cnVjdCBpbm9kZSAqKTsKQEAgLTE5MDAsNyArMTk1MSw2IEBACiAvKgogICogZGlyLmMKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgZjJmc19maWxldHlwZV90YWJsZVtGMkZTX0ZUX01BWF07CiB2b2lkIHNldF9kZV90eXBlKHN0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqLCB1bW9kZV90KTsKIHVuc2lnbmVkIGNoYXIgZ2V0X2RlX3R5cGUoc3RydWN0IGYyZnNfZGlyX2VudHJ5ICopOwogc3RydWN0IGYyZnNfZGlyX2VudHJ5ICpmaW5kX3RhcmdldF9kZW50cnkoc3RydWN0IGZzY3J5cHRfbmFtZSAqLApAQCAtMTkxMCwxMCArMTk2MCwxMiBAQAogdm9pZCBkb19tYWtlX2VtcHR5X2RpcihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICosCiAJCQlzdHJ1Y3QgZjJmc19kZW50cnlfcHRyICopOwogc3RydWN0IHBhZ2UgKmluaXRfaW5vZGVfbWV0YWRhdGEoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqLAotCQkJY29uc3Qgc3RydWN0IHFzdHIgKiwgc3RydWN0IHBhZ2UgKik7CisJCWNvbnN0IHN0cnVjdCBxc3RyICosIGNvbnN0IHN0cnVjdCBxc3RyICosIHN0cnVjdCBwYWdlICopOwogdm9pZCB1cGRhdGVfcGFyZW50X21ldGFkYXRhKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgaW50KTsKIGludCByb29tX2Zvcl9maWxlbmFtZShjb25zdCB2b2lkICosIGludCwgaW50KTsKIHZvaWQgZjJmc19kcm9wX25saW5rKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CitzdHJ1Y3QgZjJmc19kaXJfZW50cnkgKl9fZjJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZnNjcnlwdF9uYW1lICosCisJCQkJCQkJc3RydWN0IHBhZ2UgKiopOwogc3RydWN0IGYyZnNfZGlyX2VudHJ5ICpmMmZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICosIGNvbnN0IHN0cnVjdCBxc3RyICosCiAJCQkJCQkJc3RydWN0IHBhZ2UgKiopOwogc3RydWN0IGYyZnNfZGlyX2VudHJ5ICpmMmZzX3BhcmVudF9kaXIoc3RydWN0IGlub2RlICosIHN0cnVjdCBwYWdlICoqKTsKQEAgLTE5MjQsNyArMTk3Niw5IEBACiB2b2lkIGYyZnNfdXBkYXRlX2RlbnRyeShuaWRfdCBpbm8sIHVtb2RlX3QgbW9kZSwgc3RydWN0IGYyZnNfZGVudHJ5X3B0ciAqLAogCQkJY29uc3Qgc3RydWN0IHFzdHIgKiwgZjJmc19oYXNoX3QgLCB1bnNpZ25lZCBpbnQpOwogaW50IGYyZnNfYWRkX3JlZ3VsYXJfZW50cnkoc3RydWN0IGlub2RlICosIGNvbnN0IHN0cnVjdCBxc3RyICosCi0JCQkJCQlzdHJ1Y3QgaW5vZGUgKiwgbmlkX3QsIHVtb2RlX3QpOworCQkJY29uc3Qgc3RydWN0IHFzdHIgKiwgc3RydWN0IGlub2RlICosIG5pZF90LCB1bW9kZV90KTsKK2ludCBfX2YyZnNfZG9fYWRkX2xpbmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBmc2NyeXB0X25hbWUqLCBzdHJ1Y3QgaW5vZGUgKiwKKwkJCW5pZF90LCB1bW9kZV90KTsKIGludCBfX2YyZnNfYWRkX2xpbmsoc3RydWN0IGlub2RlICosIGNvbnN0IHN0cnVjdCBxc3RyICosIHN0cnVjdCBpbm9kZSAqLCBuaWRfdCwKIAkJCXVtb2RlX3QpOwogdm9pZCBmMmZzX2RlbGV0ZV9lbnRyeShzdHJ1Y3QgZjJmc19kaXJfZW50cnkgKiwgc3RydWN0IHBhZ2UgKiwgc3RydWN0IGlub2RlICosCkBAIC0yMDEwLDkgKzIwNjQsOSBAQAogdm9pZCBpbnZhbGlkYXRlX2Jsb2NrcyhzdHJ1Y3QgZjJmc19zYl9pbmZvICosIGJsb2NrX3QpOwogYm9vbCBpc19jaGVja3BvaW50ZWRfZGF0YShzdHJ1Y3QgZjJmc19zYl9pbmZvICosIGJsb2NrX3QpOwogdm9pZCByZWZyZXNoX3NpdF9lbnRyeShzdHJ1Y3QgZjJmc19zYl9pbmZvICosIGJsb2NrX3QsIGJsb2NrX3QpOwordm9pZCBmMmZzX3dhaXRfYWxsX2Rpc2NhcmRfYmlvKHN0cnVjdCBmMmZzX3NiX2luZm8gKik7CiB2b2lkIGNsZWFyX3ByZWZyZWVfc2VnbWVudHMoc3RydWN0IGYyZnNfc2JfaW5mbyAqLCBzdHJ1Y3QgY3BfY29udHJvbCAqKTsKIHZvaWQgcmVsZWFzZV9kaXNjYXJkX2FkZHJzKHN0cnVjdCBmMmZzX3NiX2luZm8gKik7Ci1ib29sIGRpc2NhcmRfbmV4dF9kbm9kZShzdHJ1Y3QgZjJmc19zYl9pbmZvICosIGJsb2NrX3QpOwogaW50IG5wYWdlc19mb3Jfc3VtbWFyeV9mbHVzaChzdHJ1Y3QgZjJmc19zYl9pbmZvICosIGJvb2wpOwogdm9pZCBhbGxvY2F0ZV9uZXdfc2VnbWVudHMoc3RydWN0IGYyZnNfc2JfaW5mbyAqKTsKIGludCBmMmZzX3RyaW1fZnMoc3RydWN0IGYyZnNfc2JfaW5mbyAqLCBzdHJ1Y3QgZnN0cmltX3JhbmdlICopOwpAQCAtMjA5NSw2ICsyMTQ5LDEwIEBACiB2b2lkIGYyZnNfc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKHN0cnVjdCBwYWdlICopOwogdm9pZCBmMmZzX2ludmFsaWRhdGVfcGFnZShzdHJ1Y3QgcGFnZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CiBpbnQgZjJmc19yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKiwgZ2ZwX3QpOworI2lmZGVmIENPTkZJR19NSUdSQVRJT04KK2ludCBmMmZzX21pZ3JhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgcGFnZSAqLAorCQkJCWVudW0gbWlncmF0ZV9tb2RlKTsKKyNlbmRpZgogCiAvKgogICogZ2MuYwpAQCAtMjEyMywxMyArMjE4MSwxNCBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZyBoaXRfbGFyZ2VzdCwgaGl0X2NhY2hlZCwgaGl0X3JidHJlZTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgaGl0X3RvdGFsLCB0b3RhbF9leHQ7CiAJaW50IGV4dF90cmVlLCB6b21iaWVfdHJlZSwgZXh0X25vZGU7Ci0JczY0IG5kaXJ0eV9ub2RlLCBuZGlydHlfZGVudCwgbmRpcnR5X21ldGEsIG5kaXJ0eV9kYXRhLCBpbm1lbV9wYWdlczsKKwlzNjQgbmRpcnR5X25vZGUsIG5kaXJ0eV9kZW50LCBuZGlydHlfbWV0YSwgbmRpcnR5X2RhdGEsIG5kaXJ0eV9pbWV0YTsKKwlzNjQgaW5tZW1fcGFnZXM7CiAJdW5zaWduZWQgaW50IG5kaXJ0eV9kaXJzLCBuZGlydHlfZmlsZXMsIG5kaXJ0eV9hbGw7CiAJaW50IG5hdHMsIGRpcnR5X25hdHMsIHNpdHMsIGRpcnR5X3NpdHMsIGZuaWRzOwogCWludCB0b3RhbF9jb3VudCwgdXRpbGl6YXRpb247CiAJaW50IGJnX2djLCB3Yl9iaW9zOwogCWludCBpbmxpbmVfeGF0dHIsIGlubGluZV9pbm9kZSwgaW5saW5lX2Rpciwgb3JwaGFuczsKLQl1bnNpZ25lZCBpbnQgdmFsaWRfY291bnQsIHZhbGlkX25vZGVfY291bnQsIHZhbGlkX2lub2RlX2NvdW50OworCXVuc2lnbmVkIGludCB2YWxpZF9jb3VudCwgdmFsaWRfbm9kZV9jb3VudCwgdmFsaWRfaW5vZGVfY291bnQsIGRpc2NhcmRfYmxrczsKIAl1bnNpZ25lZCBpbnQgYmltb2RhbCwgYXZnX3ZibG9ja3M7CiAJaW50IHV0aWxfZnJlZSwgdXRpbF92YWxpZCwgdXRpbF9pbnZhbGlkOwogCWludCByc3ZkX3NlZ3MsIG92ZXJwX3NlZ3M7CkBAIC0yMjk0LDggKzIzNTMsOCBAQAogc3RydWN0IGYyZnNfZGlyX2VudHJ5ICpmaW5kX2luX2lubGluZV9kaXIoc3RydWN0IGlub2RlICosCiAJCQkJc3RydWN0IGZzY3J5cHRfbmFtZSAqLCBzdHJ1Y3QgcGFnZSAqKik7CiBpbnQgbWFrZV9lbXB0eV9pbmxpbmVfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcGFnZSAqKTsKLWludCBmMmZzX2FkZF9pbmxpbmVfZW50cnkoc3RydWN0IGlub2RlICosIGNvbnN0IHN0cnVjdCBxc3RyICosIHN0cnVjdCBpbm9kZSAqLAotCQkJCQkJbmlkX3QsIHVtb2RlX3QpOworaW50IGYyZnNfYWRkX2lubGluZV9lbnRyeShzdHJ1Y3QgaW5vZGUgKiwgY29uc3Qgc3RydWN0IHFzdHIgKiwKKwkJY29uc3Qgc3RydWN0IHFzdHIgKiwgc3RydWN0IGlub2RlICosIG5pZF90LCB1bW9kZV90KTsKIHZvaWQgZjJmc19kZWxldGVfaW5saW5lX2VudHJ5KHN0cnVjdCBmMmZzX2Rpcl9lbnRyeSAqLCBzdHJ1Y3QgcGFnZSAqLAogCQkJCQkJc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKIGJvb2wgZjJmc19lbXB0eV9pbmxpbmVfZGlyKHN0cnVjdCBpbm9kZSAqKTsKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvZmlsZS5jIGIvZnMvZjJmcy9maWxlLmMKaW5kZXggNDdhYmI5Ni4uZjhiNGZlMCAxMDA2NDQKLS0tIGEvZnMvZjJmcy9maWxlLmMKKysrIGIvZnMvZjJmcy9maWxlLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCiAJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IGlub2RlLT5pX25saW5rICE9IDEpCiAJCW5lZWRfY3AgPSB0cnVlOwotCWVsc2UgaWYgKGZpbGVfZW5jX25hbWUoaW5vZGUpICYmIG5lZWRfZGVudHJ5X21hcmsoc2JpLCBpbm9kZS0+aV9pbm8pKQorCWVsc2UgaWYgKGlzX3NiaV9mbGFnX3NldChzYmksIFNCSV9ORUVEX0NQKSkKIAkJbmVlZF9jcCA9IHRydWU7CiAJZWxzZSBpZiAoZmlsZV93cm9uZ19waW5vKGlub2RlKSkKIAkJbmVlZF9jcCA9IHRydWU7CkBAIC01MjMsNyArNTIzLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoY2FjaGVfb25seSkgewotCQlwYWdlID0gZjJmc19ncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgsIGZhbHNlKTsKKwkJcGFnZSA9IGZpbmRfbG9ja19wYWdlKG1hcHBpbmcsIGluZGV4KTsKIAkJaWYgKHBhZ2UgJiYgUGFnZVVwdG9kYXRlKHBhZ2UpKQogCQkJZ290byB0cnVuY2F0ZV9vdXQ7CiAJCWYyZnNfcHV0X3BhZ2UocGFnZSwgMSk7CkBAIC0xNDU0LDcgKzE0NTQsNyBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbHApOwogCXN0cnVjdCBmMmZzX2lub2RlX2luZm8gKmZpID0gRjJGU19JKGlub2RlKTsKLQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBmaS0+aV9mbGFncyAmIEZTX0ZMX1VTRVJfVklTSUJMRTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJdW5zaWduZWQgaW50IG9sZGZsYWdzOwogCWludCByZXQ7CiAKQEAgLTE3NTcsMjEgKzE3NTcsMTQgQEAKIHsKIAlzdHJ1Y3QgZnNjcnlwdF9wb2xpY3kgcG9saWN5OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbHApOwotCWludCByZXQ7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnBvbGljeSwgKHN0cnVjdCBmc2NyeXB0X3BvbGljeSBfX3VzZXIgKilhcmcsCiAJCQkJCQkJc2l6ZW9mKHBvbGljeSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldCA9IG1udF93YW50X3dyaXRlX2ZpbGUoZmlscCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCWYyZnNfdXBkYXRlX3RpbWUoRjJGU19JX1NCKGlub2RlKSwgUkVRX1RJTUUpOwotCXJldCA9IGZzY3J5cHRfcHJvY2Vzc19wb2xpY3koaW5vZGUsICZwb2xpY3kpOwogCi0JbW50X2Ryb3Bfd3JpdGVfZmlsZShmaWxwKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBmc2NyeXB0X3Byb2Nlc3NfcG9saWN5KGZpbHAsICZwb2xpY3kpOwogfQogCiBzdGF0aWMgaW50IGYyZnNfaW9jX2dldF9lbmNyeXB0aW9uX3BvbGljeShzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpCkBAIC0xOTYxLDcgKzE5NTQsNyBAQAogCSAqIGF2b2lkIGRlZnJhZ21lbnQgcnVubmluZyBpbiBTU1IgbW9kZSB3aGVuIGZyZWUgc2VjdGlvbiBhcmUgYWxsb2NhdGVkCiAJICogaW50ZW5zaXZlbHkKIAkgKi8KLQlpZiAoaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgc2VjX251bSkpIHsKKwlpZiAoaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCwgc2VjX251bSkpIHsKIAkJZXJyID0gLUVBR0FJTjsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjA5Miw2ICsyMDg1LDEzIEBACiAJaWYgKGYyZnNfZW5jcnlwdGVkX2lub2RlKHNyYykgfHwgZjJmc19lbmNyeXB0ZWRfaW5vZGUoZHN0KSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCisJaWYgKHNyYyA9PSBkc3QpIHsKKwkJaWYgKHBvc19pbiA9PSBwb3Nfb3V0KQorCQkJcmV0dXJuIDA7CisJCWlmIChwb3Nfb3V0ID4gcG9zX2luICYmIHBvc19vdXQgPCBwb3NfaW4gKyBsZW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpbm9kZV9sb2NrKHNyYyk7CiAJaWYgKHNyYyAhPSBkc3QpIHsKIAkJaWYgKCFpbm9kZV90cnlsb2NrKGRzdCkpIHsKQEAgLTIxNDMsOCArMjE0Myw5IEBACiAKIAlmMmZzX2JhbGFuY2VfZnMoc2JpLCB0cnVlKTsKIAlmMmZzX2xvY2tfb3Aoc2JpKTsKLQlyZXQgPSBfX2V4Y2hhbmdlX2RhdGFfYmxvY2soc3JjLCBkc3QsIHBvc19pbiwKLQkJCQlwb3Nfb3V0LCBsZW4gPj4gRjJGU19CTEtTSVpFX0JJVFMsIGZhbHNlKTsKKwlyZXQgPSBfX2V4Y2hhbmdlX2RhdGFfYmxvY2soc3JjLCBkc3QsIHBvc19pbiA+PiBGMkZTX0JMS1NJWkVfQklUUywKKwkJCQlwb3Nfb3V0ID4+IEYyRlNfQkxLU0laRV9CSVRTLAorCQkJCWxlbiA+PiBGMkZTX0JMS1NJWkVfQklUUywgZmFsc2UpOwogCiAJaWYgKCFyZXQpIHsKIAkJaWYgKGRzdF9tYXhfaV9zaXplKQpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9nYy5jIGIvZnMvZjJmcy9nYy5jCmluZGV4IDhmN2ZhMzIuLjkzOTg1YzYgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvZ2MuYworKysgYi9mcy9mMmZzL2djLmMKQEAgLTQ3LDYgKzQ3LDExIEBACiAJCQljb250aW51ZTsKIAkJfQogCisjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCisJCWlmICh0aW1lX3RvX2luamVjdChzYmksIEZBVUxUX0NIRUNLUE9JTlQpKQorCQkJZjJmc19zdG9wX2NoZWNrcG9pbnQoc2JpLCBmYWxzZSk7CisjZW5kaWYKKwogCQkvKgogCQkgKiBbR0MgdHJpZ2dlcmluZyBjb25kaXRpb25dCiAJCSAqIDAuIEdDIGlzIG5vdCBjb25kdWN0ZWQgY3VycmVudGx5LgpAQCAtOTYsNyArMTAxLDcgQEAKIAlkZXZfdCBkZXYgPSBzYmktPnNiLT5zX2JkZXYtPmJkX2RldjsKIAlpbnQgZXJyID0gMDsKIAotCWdjX3RoID0gZjJmc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgZjJmc19nY19rdGhyZWFkKSwgR0ZQX0tFUk5FTCk7CisJZ2NfdGggPSBmMmZzX2ttYWxsb2Moc2JpLCBzaXplb2Yoc3RydWN0IGYyZnNfZ2Nfa3RocmVhZCksIEdGUF9LRVJORUwpOwogCWlmICghZ2NfdGgpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC0yNzAsNyArMjc1LDcgQEAKIHsKIAlzdHJ1Y3QgZGlydHlfc2VnbGlzdF9pbmZvICpkaXJ0eV9pID0gRElSVFlfSShzYmkpOwogCXN0cnVjdCB2aWN0aW1fc2VsX3BvbGljeSBwOwotCXVuc2lnbmVkIGludCBzZWNubywgbWF4X2Nvc3QsIGxhc3RfdmljdGltOworCXVuc2lnbmVkIGludCBzZWNubywgbGFzdF92aWN0aW07CiAJdW5zaWduZWQgaW50IGxhc3Rfc2VnbWVudCA9IE1BSU5fU0VHUyhzYmkpOwogCXVuc2lnbmVkIGludCBuc2VhcmNoZWQgPSAwOwogCkBAIC0yODAsNyArMjg1LDcgQEAKIAlzZWxlY3RfcG9saWN5KHNiaSwgZ2NfdHlwZSwgdHlwZSwgJnApOwogCiAJcC5taW5fc2Vnbm8gPSBOVUxMX1NFR05POwotCXAubWluX2Nvc3QgPSBtYXhfY29zdCA9IGdldF9tYXhfY29zdChzYmksICZwKTsKKwlwLm1pbl9jb3N0ID0gZ2V0X21heF9jb3N0KHNiaSwgJnApOwogCiAJaWYgKHAubWF4X3NlYXJjaCA9PSAwKQogCQlnb3RvIG91dDsKQEAgLTQyMywxMCArNDI4LDEwIEBACiBzdGF0aWMgdm9pZCBnY19ub2RlX3NlZ21lbnQoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLAogCQlzdHJ1Y3QgZjJmc19zdW1tYXJ5ICpzdW0sIHVuc2lnbmVkIGludCBzZWdubywgaW50IGdjX3R5cGUpCiB7Ci0JYm9vbCBpbml0aWFsID0gdHJ1ZTsKIAlzdHJ1Y3QgZjJmc19zdW1tYXJ5ICplbnRyeTsKIAlibG9ja190IHN0YXJ0X2FkZHI7CiAJaW50IG9mZjsKKwlpbnQgcGhhc2UgPSAwOwogCiAJc3RhcnRfYWRkciA9IFNUQVJUX0JMT0NLKHNiaSwgc2Vnbm8pOwogCkBAIC00MzksMTYgKzQ0NCwyNCBAQAogCQlzdHJ1Y3Qgbm9kZV9pbmZvIG5pOwogCiAJCS8qIHN0b3AgQkdfR0MgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBmcmVlIHNlY3Rpb25zLiAqLwotCQlpZiAoZ2NfdHlwZSA9PSBCR19HQyAmJiBoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwKSkKKwkJaWYgKGdjX3R5cGUgPT0gQkdfR0MgJiYgaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCwgMCkpCiAJCQlyZXR1cm47CiAKIAkJaWYgKGNoZWNrX3ZhbGlkX21hcChzYmksIHNlZ25vLCBvZmYpID09IDApCiAJCQljb250aW51ZTsKIAotCQlpZiAoaW5pdGlhbCkgeworCQlpZiAocGhhc2UgPT0gMCkgeworCQkJcmFfbWV0YV9wYWdlcyhzYmksIE5BVF9CTE9DS19PRkZTRVQobmlkKSwgMSwKKwkJCQkJCQlNRVRBX05BVCwgdHJ1ZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwaGFzZSA9PSAxKSB7CiAJCQlyYV9ub2RlX3BhZ2Uoc2JpLCBuaWQpOwogCQkJY29udGludWU7CiAJCX0KKworCQkvKiBwaGFzZSA9PSAyICovCiAJCW5vZGVfcGFnZSA9IGdldF9ub2RlX3BhZ2Uoc2JpLCBuaWQpOwogCQlpZiAoSVNfRVJSKG5vZGVfcGFnZSkpCiAJCQljb250aW51ZTsKQEAgLTQ2OSwxMCArNDgyLDggQEAKIAkJc3RhdF9pbmNfbm9kZV9ibGtfY291bnQoc2JpLCAxLCBnY190eXBlKTsKIAl9CiAKLQlpZiAoaW5pdGlhbCkgewotCQlpbml0aWFsID0gZmFsc2U7CisJaWYgKCsrcGhhc2UgPCAzKQogCQlnb3RvIG5leHRfc3RlcDsKLQl9CiB9CiAKIC8qCkBAIC03MDYsMTYgKzcxNywyMyBAQAogCQlzdHJ1Y3Qgbm9kZV9pbmZvIGRuaTsgLyogZG5vZGUgaW5mbyBmb3IgdGhlIGRhdGEgKi8KIAkJdW5zaWduZWQgaW50IG9mc19pbl9ub2RlLCBub2ZzOwogCQlibG9ja190IHN0YXJ0X2JpZHg7CisJCW5pZF90IG5pZCA9IGxlMzJfdG9fY3B1KGVudHJ5LT5uaWQpOwogCiAJCS8qIHN0b3AgQkdfR0MgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBmcmVlIHNlY3Rpb25zLiAqLwotCQlpZiAoZ2NfdHlwZSA9PSBCR19HQyAmJiBoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwKSkKKwkJaWYgKGdjX3R5cGUgPT0gQkdfR0MgJiYgaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCwgMCkpCiAJCQlyZXR1cm47CiAKIAkJaWYgKGNoZWNrX3ZhbGlkX21hcChzYmksIHNlZ25vLCBvZmYpID09IDApCiAJCQljb250aW51ZTsKIAogCQlpZiAocGhhc2UgPT0gMCkgewotCQkJcmFfbm9kZV9wYWdlKHNiaSwgbGUzMl90b19jcHUoZW50cnktPm5pZCkpOworCQkJcmFfbWV0YV9wYWdlcyhzYmksIE5BVF9CTE9DS19PRkZTRVQobmlkKSwgMSwKKwkJCQkJCQlNRVRBX05BVCwgdHJ1ZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwaGFzZSA9PSAxKSB7CisJCQlyYV9ub2RlX3BhZ2Uoc2JpLCBuaWQpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNzIzLDE0ICs3NDEsMTQgQEAKIAkJaWYgKCFpc19hbGl2ZShzYmksIGVudHJ5LCAmZG5pLCBzdGFydF9hZGRyICsgb2ZmLCAmbm9mcykpCiAJCQljb250aW51ZTsKIAotCQlpZiAocGhhc2UgPT0gMSkgeworCQlpZiAocGhhc2UgPT0gMikgewogCQkJcmFfbm9kZV9wYWdlKHNiaSwgZG5pLmlubyk7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCW9mc19pbl9ub2RlID0gbGUxNl90b19jcHUoZW50cnktPm9mc19pbl9ub2RlKTsKIAotCQlpZiAocGhhc2UgPT0gMikgeworCQlpZiAocGhhc2UgPT0gMykgewogCQkJaW5vZGUgPSBmMmZzX2lnZXQoc2IsIGRuaS5pbm8pOwogCQkJaWYgKElTX0VSUihpbm9kZSkgfHwgaXNfYmFkX2lub2RlKGlub2RlKSkKIAkJCQljb250aW51ZTsKQEAgLTc1Niw3ICs3NzQsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQkvKiBwaGFzZSAzICovCisJCS8qIHBoYXNlIDQgKi8KIAkJaW5vZGUgPSBmaW5kX2djX2lub2RlKGdjX2xpc3QsIGRuaS5pbm8pOwogCQlpZiAoaW5vZGUpIHsKIAkJCXN0cnVjdCBmMmZzX2lub2RlX2luZm8gKmZpID0gRjJGU19JKGlub2RlKTsKQEAgLTc4OSw3ICs4MDcsNyBAQAogCQl9CiAJfQogCi0JaWYgKCsrcGhhc2UgPCA0KQorCWlmICgrK3BoYXNlIDwgNSkKIAkJZ290byBuZXh0X3N0ZXA7CiB9CiAKQEAgLTgxNSw3ICs4MzMsNyBAQAogCXN0cnVjdCBibGtfcGx1ZyBwbHVnOwogCXVuc2lnbmVkIGludCBzZWdubyA9IHN0YXJ0X3NlZ25vOwogCXVuc2lnbmVkIGludCBlbmRfc2Vnbm8gPSBzdGFydF9zZWdubyArIHNiaS0+c2Vnc19wZXJfc2VjOwotCWludCBzZWdfZnJlZWQgPSAwOworCWludCBzZWNfZnJlZWQgPSAwOwogCXVuc2lnbmVkIGNoYXIgdHlwZSA9IElTX0RBVEFTRUcoZ2V0X3NlZ19lbnRyeShzYmksIHNlZ25vKS0+dHlwZSkgPwogCQkJCQkJU1VNX1RZUEVfREFUQSA6IFNVTV9UWVBFX05PREU7CiAKQEAgLTgzNCw4ICs4NTIsOSBAQAogCiAJZm9yIChzZWdubyA9IHN0YXJ0X3NlZ25vOyBzZWdubyA8IGVuZF9zZWdubzsgc2Vnbm8rKykgewogCi0JCWlmIChnZXRfdmFsaWRfYmxvY2tzKHNiaSwgc2Vnbm8sIDEpID09IDApCi0JCQljb250aW51ZTsKKwkJaWYgKGdldF92YWxpZF9ibG9ja3Moc2JpLCBzZWdubywgMSkgPT0gMCB8fAorCQkJCQl1bmxpa2VseShmMmZzX2NwX2Vycm9yKHNiaSkpKQorCQkJZ290byBuZXh0OwogCiAJCS8qIGZpbmQgc2VnbWVudCBzdW1tYXJ5IG9mIHZpY3RpbSAqLwogCQlzdW1fcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoTUVUQV9NQVBQSU5HKHNiaSksCkBAIC04NjEsNyArODgwLDcgQEAKIAkJCQkJCQkJZ2NfdHlwZSk7CiAKIAkJc3RhdF9pbmNfc2VnX2NvdW50KHNiaSwgdHlwZSwgZ2NfdHlwZSk7Ci0KK25leHQ6CiAJCWYyZnNfcHV0X3BhZ2Uoc3VtX3BhZ2UsIDApOwogCX0KIApAQCAtODcxLDIyICs4OTAsMjAgQEAKIAogCWJsa19maW5pc2hfcGx1ZygmcGx1Zyk7CiAKLQlpZiAoZ2NfdHlwZSA9PSBGR19HQykgewotCQl3aGlsZSAoc3RhcnRfc2Vnbm8gPCBlbmRfc2Vnbm8pCi0JCQlpZiAoZ2V0X3ZhbGlkX2Jsb2NrcyhzYmksIHN0YXJ0X3NlZ25vKyssIDEpID09IDApCi0JCQkJc2VnX2ZyZWVkKys7Ci0JfQorCWlmIChnY190eXBlID09IEZHX0dDICYmCisJCWdldF92YWxpZF9ibG9ja3Moc2JpLCBzdGFydF9zZWdubywgc2JpLT5zZWdzX3Blcl9zZWMpID09IDApCisJCXNlY19mcmVlZCA9IDE7CiAKIAlzdGF0X2luY19jYWxsX2NvdW50KHNiaS0+c3RhdF9pbmZvKTsKIAotCXJldHVybiBzZWdfZnJlZWQ7CisJcmV0dXJuIHNlY19mcmVlZDsKIH0KIAogaW50IGYyZnNfZ2Moc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBib29sIHN5bmMpCiB7CiAJdW5zaWduZWQgaW50IHNlZ25vOwogCWludCBnY190eXBlID0gc3luYyA/IEZHX0dDIDogQkdfR0M7Ci0JaW50IHNlY19mcmVlZCA9IDAsIHNlZ19mcmVlZDsKKwlpbnQgc2VjX2ZyZWVkID0gMDsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKIAlzdHJ1Y3QgY3BfY29udHJvbCBjcGM7CiAJc3RydWN0IGdjX2lub2RlX2xpc3QgZ2NfbGlzdCA9IHsKQEAgLTkwNSw3ICs5MjIsNyBAQAogCQlnb3RvIHN0b3A7CiAJfQogCi0JaWYgKGdjX3R5cGUgPT0gQkdfR0MgJiYgaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgc2VjX2ZyZWVkKSkgeworCWlmIChnY190eXBlID09IEJHX0dDICYmIGhhc19ub3RfZW5vdWdoX2ZyZWVfc2VjcyhzYmksIHNlY19mcmVlZCwgMCkpIHsKIAkJZ2NfdHlwZSA9IEZHX0dDOwogCQkvKgogCQkgKiBJZiB0aGVyZSBpcyBubyB2aWN0aW0gYW5kIG5vIHByZWZyZWUgc2VnbWVudCBidXQgc3RpbGwgbm90CkBAIC05MTQsMTAgKzkzMSwxNCBAQAogCQkgKi8KIAkJaWYgKF9fZ2V0X3ZpY3RpbShzYmksICZzZWdubywgZ2NfdHlwZSkgfHwKIAkJCQkJCXByZWZyZWVfc2VnbWVudHMoc2JpKSkgewotCQkJd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOworCQkJcmV0ID0gd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIHN0b3A7CiAJCQlzZWdubyA9IE5VTExfU0VHTk87Ci0JCX0gZWxzZSBpZiAoaGFzX25vdF9lbm91Z2hfZnJlZV9zZWNzKHNiaSwgMCkpIHsKLQkJCXdyaXRlX2NoZWNrcG9pbnQoc2JpLCAmY3BjKTsKKwkJfSBlbHNlIGlmIChoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwLCAwKSkgeworCQkJcmV0ID0gd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIHN0b3A7CiAJCX0KIAl9CiAKQEAgLTkyNSwyMCArOTQ2LDE5IEBACiAJCWdvdG8gc3RvcDsKIAlyZXQgPSAwOwogCi0Jc2VnX2ZyZWVkID0gZG9fZ2FyYmFnZV9jb2xsZWN0KHNiaSwgc2Vnbm8sICZnY19saXN0LCBnY190eXBlKTsKLQotCWlmIChnY190eXBlID09IEZHX0dDICYmIHNlZ19mcmVlZCA9PSBzYmktPnNlZ3NfcGVyX3NlYykKKwlpZiAoZG9fZ2FyYmFnZV9jb2xsZWN0KHNiaSwgc2Vnbm8sICZnY19saXN0LCBnY190eXBlKSAmJgorCQkJZ2NfdHlwZSA9PSBGR19HQykKIAkJc2VjX2ZyZWVkKys7CiAKIAlpZiAoZ2NfdHlwZSA9PSBGR19HQykKIAkJc2JpLT5jdXJfdmljdGltX3NlYyA9IE5VTExfU0VHTk87CiAKIAlpZiAoIXN5bmMpIHsKLQkJaWYgKGhhc19ub3RfZW5vdWdoX2ZyZWVfc2VjcyhzYmksIHNlY19mcmVlZCkpCisJCWlmIChoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCBzZWNfZnJlZWQsIDApKQogCQkJZ290byBnY19tb3JlOwogCiAJCWlmIChnY190eXBlID09IEZHX0dDKQotCQkJd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOworCQkJcmV0ID0gd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOwogCX0KIHN0b3A6CiAJbXV0ZXhfdW5sb2NrKCZzYmktPmdjX211dGV4KTsKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvaW5saW5lLmMgYi9mcy9mMmZzL2lubGluZS5jCmluZGV4IGNjZWE4NzMuLjM0MjM0ZDggMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvaW5saW5lLmMKKysrIGIvZnMvZjJmcy9pbmxpbmUuYwpAQCAtNDI0LDcgKzQyNCw3IEBACiAJCWlubyA9IGxlMzJfdG9fY3B1KGRlLT5pbm8pOwogCQlmYWtlX21vZGUgPSBnZXRfZGVfdHlwZShkZSkgPDwgU19TSElGVDsKIAotCQllcnIgPSBmMmZzX2FkZF9yZWd1bGFyX2VudHJ5KGRpciwgJm5ld19uYW1lLCBOVUxMLAorCQllcnIgPSBmMmZzX2FkZF9yZWd1bGFyX2VudHJ5KGRpciwgJm5ld19uYW1lLCBOVUxMLCBOVUxMLAogCQkJCQkJCWlubywgZmFrZV9tb2RlKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gcHVuY2hfZGVudHJ5X3BhZ2VzOwpAQCAtNDQ1LDggKzQ0NSw4IEBACiAJc3RydWN0IGYyZnNfaW5saW5lX2RlbnRyeSAqYmFja3VwX2RlbnRyeTsKIAlpbnQgZXJyOwogCi0JYmFja3VwX2RlbnRyeSA9IGYyZnNfa21hbGxvYyhzaXplb2Yoc3RydWN0IGYyZnNfaW5saW5lX2RlbnRyeSksCi0JCQkJCQkJR0ZQX0YyRlNfWkVSTyk7CisJYmFja3VwX2RlbnRyeSA9IGYyZnNfa21hbGxvYyhGMkZTX0lfU0IoZGlyKSwKKwkJCXNpemVvZihzdHJ1Y3QgZjJmc19pbmxpbmVfZGVudHJ5KSwgR0ZQX0YyRlNfWkVSTyk7CiAJaWYgKCFiYWNrdXBfZGVudHJ5KSB7CiAJCWYyZnNfcHV0X3BhZ2UoaXBhZ2UsIDEpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTQ4OCwxNyArNDg4LDE3IEBACiAJCXJldHVybiBmMmZzX21vdmVfcmVoYXNoZWRfZGlyZW50cyhkaXIsIGlwYWdlLCBpbmxpbmVfZGVudHJ5KTsKIH0KIAotaW50IGYyZnNfYWRkX2lubGluZV9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCi0JCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBuaWRfdCBpbm8sIHVtb2RlX3QgbW9kZSkKK2ludCBmMmZzX2FkZF9pbmxpbmVfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHN0cnVjdCBxc3RyICpuZXdfbmFtZSwKKwkJCQljb25zdCBzdHJ1Y3QgcXN0ciAqb3JpZ19uYW1lLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIG5pZF90IGlubywgdW1vZGVfdCBtb2RlKQogewogCXN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSA9IEYyRlNfSV9TQihkaXIpOwogCXN0cnVjdCBwYWdlICppcGFnZTsKIAl1bnNpZ25lZCBpbnQgYml0X3BvczsKIAlmMmZzX2hhc2hfdCBuYW1lX2hhc2g7Ci0Jc2l6ZV90IG5hbWVsZW4gPSBuYW1lLT5sZW47CiAJc3RydWN0IGYyZnNfaW5saW5lX2RlbnRyeSAqZGVudHJ5X2JsayA9IE5VTEw7CiAJc3RydWN0IGYyZnNfZGVudHJ5X3B0ciBkOwotCWludCBzbG90cyA9IEdFVF9ERU5UUllfU0xPVFMobmFtZWxlbik7CisJaW50IHNsb3RzID0gR0VUX0RFTlRSWV9TTE9UUyhuZXdfbmFtZS0+bGVuKTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJaW50IGVyciA9IDA7CiAKQEAgLTUxOSwxOCArNTE5LDIxIEBACiAKIAlpZiAoaW5vZGUpIHsKIAkJZG93bl93cml0ZSgmRjJGU19JKGlub2RlKS0+aV9zZW0pOwotCQlwYWdlID0gaW5pdF9pbm9kZV9tZXRhZGF0YShpbm9kZSwgZGlyLCBuYW1lLCBpcGFnZSk7CisJCXBhZ2UgPSBpbml0X2lub2RlX21ldGFkYXRhKGlub2RlLCBkaXIsIG5ld19uYW1lLAorCQkJCQkJb3JpZ19uYW1lLCBpcGFnZSk7CiAJCWlmIChJU19FUlIocGFnZSkpIHsKIAkJCWVyciA9IFBUUl9FUlIocGFnZSk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KKwkJaWYgKGYyZnNfZW5jcnlwdGVkX2lub2RlKGRpcikpCisJCQlmaWxlX3NldF9lbmNfbmFtZShpbm9kZSk7CiAJfQogCiAJZjJmc193YWl0X29uX3BhZ2Vfd3JpdGViYWNrKGlwYWdlLCBOT0RFLCB0cnVlKTsKIAotCW5hbWVfaGFzaCA9IGYyZnNfZGVudHJ5X2hhc2gobmFtZSk7CisJbmFtZV9oYXNoID0gZjJmc19kZW50cnlfaGFzaChuZXdfbmFtZSk7CiAJbWFrZV9kZW50cnlfcHRyKE5VTEwsICZkLCAodm9pZCAqKWRlbnRyeV9ibGssIDIpOwotCWYyZnNfdXBkYXRlX2RlbnRyeShpbm8sIG1vZGUsICZkLCBuYW1lLCBuYW1lX2hhc2gsIGJpdF9wb3MpOworCWYyZnNfdXBkYXRlX2RlbnRyeShpbm8sIG1vZGUsICZkLCBuZXdfbmFtZSwgbmFtZV9oYXNoLCBiaXRfcG9zKTsKIAogCXNldF9wYWdlX2RpcnR5KGlwYWdlKTsKIApAQCAtNTYzLDcgKzU2Niw3IEBACiAJaW5saW5lX2RlbnRyeSA9IGlubGluZV9kYXRhX2FkZHIocGFnZSk7CiAJYml0X3BvcyA9IGRlbnRyeSAtIGlubGluZV9kZW50cnktPmRlbnRyeTsKIAlmb3IgKGkgPSAwOyBpIDwgc2xvdHM7IGkrKykKLQkJdGVzdF9hbmRfY2xlYXJfYml0X2xlKGJpdF9wb3MgKyBpLAorCQlfX2NsZWFyX2JpdF9sZShiaXRfcG9zICsgaSwKIAkJCQkmaW5saW5lX2RlbnRyeS0+ZGVudHJ5X2JpdG1hcCk7CiAKIAlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvaW5vZGUuYyBiL2ZzL2YyZnMvaW5vZGUuYwppbmRleCA5YWM1ZWZjLi5kNzM2OTg5IDEwMDY0NAotLS0gYS9mcy9mMmZzL2lub2RlLmMKKysrIGIvZnMvZjJmcy9pbm9kZS5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9mMmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogCiAjaW5jbHVkZSAiZjJmcy5oIgpAQCAtMjM0LDYgKzIzNSwyMCBAQAogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKK3N0cnVjdCBpbm9kZSAqZjJmc19pZ2V0X3JldHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CityZXRyeToKKwlpbm9kZSA9IGYyZnNfaWdldChzYiwgaW5vKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQlpZiAoUFRSX0VSUihpbm9kZSkgPT0gLUVOT01FTSkgeworCQkJY29uZ2VzdGlvbl93YWl0KEJMS19SV19BU1lOQywgSFovNTApOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKIGludCB1cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKm5vZGVfcGFnZSkKIHsKIAlzdHJ1Y3QgZjJmc19pbm9kZSAqcmk7CkBAIC0zNTQsNyArMzY5LDcgQEAKIAkJZ290byBub19kZWxldGU7CiAKICNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KLQlpZiAodGltZV90b19pbmplY3QoRkFVTFRfRVZJQ1RfSU5PREUpKQorCWlmICh0aW1lX3RvX2luamVjdChzYmksIEZBVUxUX0VWSUNUX0lOT0RFKSkKIAkJZ290byBub19kZWxldGU7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZnMvZjJmcy9uYW1laS5jIGIvZnMvZjJmcy9uYW1laS5jCmluZGV4IDczZmEzNTYuLjU2MjViODcgMTAwNjQ0Ci0tLSBhL2ZzL2YyZnMvbmFtZWkuYworKysgYi9mcy9mMmZzL25hbWVpLmMKQEAgLTkxLDE4ICs5MSwyMyBAQAogewogCXNpemVfdCBzbGVuID0gc3RybGVuKHMpOwogCXNpemVfdCBzdWJsZW4gPSBzdHJsZW4oc3ViKTsKKwlpbnQgaTsKIAogCS8qCiAJICogZmlsZW5hbWUgZm9ybWF0IG9mIG11bHRpbWVkaWEgZmlsZSBzaG91bGQgYmUgZGVmaW5lZCBhczoKLQkgKiAiZmlsZW5hbWUgKyAnLicgKyBleHRlbnNpb24iLgorCSAqICJmaWxlbmFtZSArICcuJyArIGV4dGVuc2lvbiArIChvcHRpb25hbDogJy4nICsgdGVtcCBleHRlbnNpb24pIi4KIAkgKi8KIAlpZiAoc2xlbiA8IHN1YmxlbiArIDIpCiAJCXJldHVybiAwOwogCi0JaWYgKHNbc2xlbiAtIHN1YmxlbiAtIDFdICE9ICcuJykKLQkJcmV0dXJuIDA7CisJZm9yIChpID0gMTsgaSA8IHNsZW4gLSBzdWJsZW47IGkrKykgeworCQlpZiAoc1tpXSAhPSAnLicpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJuY2FzZWNtcChzICsgaSArIDEsIHN1Yiwgc3VibGVuKSkKKwkJCXJldHVybiAxOworCX0KIAotCXJldHVybiAhc3RybmNhc2VjbXAocyArIHNsZW4gLSBzdWJsZW4sIHN1Yiwgc3VibGVuKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQ0OSw3ICs0NTQsNyBAQAogCQlvc3RyLm5hbWUgPSBzZC0+ZW5jcnlwdGVkX3BhdGg7CiAJCW9zdHIubGVuID0gZGlza19saW5rLmxlbjsKIAkJZXJyID0gZnNjcnlwdF9mbmFtZV91c3JfdG9fZGlzayhpbm9kZSwgJmlzdHIsICZvc3RyKTsKLQkJaWYgKGVyciA8IDApCisJCWlmIChlcnIpCiAJCQlnb3RvIGVycl9vdXQ7CiAKIAkJc2QtPmxlbiA9IGNwdV90b19sZTE2KG9zdHIubGVuKTsKQEAgLTEwMTAsNyArMTAxNSw2IEBACiAJc3RydWN0IGZzY3J5cHRfc3RyIGNzdHIgPSBGU1RSX0lOSVQoTlVMTCwgMCk7CiAJc3RydWN0IGZzY3J5cHRfc3RyIHBzdHIgPSBGU1RSX0lOSVQoTlVMTCwgMCk7CiAJc3RydWN0IGZzY3J5cHRfc3ltbGlua19kYXRhICpzZDsKLQlsb2ZmX3Qgc2l6ZSA9IG1pbl90KGxvZmZfdCwgaV9zaXplX3JlYWQoaW5vZGUpLCBQQUdFX1NJWkUgLSAxKTsKIAl1MzIgbWF4X3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CiAJaW50IHJlczsKIApAQCAtMTAyNSw3ICsxMDI5LDYgQEAKIAlpZiAoSVNfRVJSKGNwYWdlKSkKIAkJcmV0dXJuIEVSUl9DQVNUKGNwYWdlKTsKIAljYWRkciA9IHBhZ2VfYWRkcmVzcyhjcGFnZSk7Ci0JY2FkZHJbc2l6ZV0gPSAwOwogCiAJLyogU3ltbGluayBpcyBlbmNyeXB0ZWQgKi8KIAlzZCA9IChzdHJ1Y3QgZnNjcnlwdF9zeW1saW5rX2RhdGEgKiljYWRkcjsKQEAgLTEwNDgsNyArMTA1MSw3IEBACiAJCWdvdG8gZXJyb3V0OwogCiAJcmVzID0gZnNjcnlwdF9mbmFtZV9kaXNrX3RvX3Vzcihpbm9kZSwgMCwgMCwgJmNzdHIsICZwc3RyKTsKLQlpZiAocmVzIDwgMCkKKwlpZiAocmVzKQogCQlnb3RvIGVycm91dDsKIAogCS8qIHRoaXMgaXMgYnJva2VuIHN5bWxpbmsgY2FzZSAqLwpAQCAtMTA2MCw3ICsxMDYzLDcgQEAKIAlwYWRkciA9IHBzdHIubmFtZTsKIAogCS8qIE51bGwtdGVybWluYXRlIHRoZSBuYW1lICovCi0JcGFkZHJbcmVzXSA9ICdcMCc7CisJcGFkZHJbcHN0ci5sZW5dID0gJ1wwJzsKIAogCXB1dF9wYWdlKGNwYWdlKTsKIAlzZXRfZGVsYXllZF9jYWxsKGRvbmUsIGtmcmVlX2xpbmssIHBhZGRyKTsKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvbm9kZS5jIGIvZnMvZjJmcy9ub2RlLmMKaW5kZXggZjc1ZDE5Ny4uODgzMTAzNSAxMDA2NDQKLS0tIGEvZnMvZjJmcy9ub2RlLmMKKysrIGIvZnMvZjJmcy9ub2RlLmMKQEAgLTU0LDggKzU0LDYgQEAKIAkJcmVzID0gbWVtX3NpemUgPCAoKGF2YWlsX3JhbSAqIG5tX2ktPnJhbV90aHJlc2ggLyAxMDApID4+IDIpOwogCQlpZiAoZXhjZXNzX2NhY2hlZF9uYXRzKHNiaSkpCiAJCQlyZXMgPSBmYWxzZTsKLQkJaWYgKG5tX2ktPm5hdF9jbnQgPiBERUZfTkFUX0NBQ0hFX1RIUkVTSE9MRCkKLQkJCXJlcyA9IGZhbHNlOwogCX0gZWxzZSBpZiAodHlwZSA9PSBESVJUWV9ERU5UUykgewogCQlpZiAoc2JpLT5zYi0+c19iZGktPndiLmRpcnR5X2V4Y2VlZGVkKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTMxNCw2ICsxMzEyLDcgQEAKIAlzdHJ1Y3QgcGFnZSAqbGFzdF9wYWdlID0gTlVMTDsKIAlib29sIG1hcmtlZCA9IGZhbHNlOwogCW5pZF90IGlubyA9IGlub2RlLT5pX2lubzsKKwlpbnQgbndyaXR0ZW4gPSAwOwogCiAJaWYgKGF0b21pYykgewogCQlsYXN0X3BhZ2UgPSBsYXN0X2ZzeW5jX2Rub2RlKHNiaSwgaW5vKTsKQEAgLTEzODcsNyArMTM4NiwxMCBAQAogCQkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQkJCWYyZnNfcHV0X3BhZ2UobGFzdF9wYWdlLCAwKTsKIAkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJbndyaXR0ZW4rKzsKIAkJCX0KKwogCQkJaWYgKHBhZ2UgPT0gbGFzdF9wYWdlKSB7CiAJCQkJZjJmc19wdXRfcGFnZShwYWdlLCAwKTsKIAkJCQltYXJrZWQgPSB0cnVlOwpAQCAtMTQwOSw2ICsxNDExLDkgQEAKIAkJdW5sb2NrX3BhZ2UobGFzdF9wYWdlKTsKIAkJZ290byByZXRyeTsKIAl9CisKKwlpZiAobndyaXR0ZW4pCisJCWYyZnNfc3VibWl0X21lcmdlZF9iaW9fY29uZChzYmksIE5VTEwsIE5VTEwsIGlubywgTk9ERSwgV1JJVEUpOwogCXJldHVybiByZXQgPyAtRUlPOiAwOwogfQogCkBAIC0xNDE4LDYgKzE0MjMsNyBAQAogCXN0cnVjdCBwYWdldmVjIHB2ZWM7CiAJaW50IHN0ZXAgPSAwOwogCWludCBud3JpdHRlbiA9IDA7CisJaW50IHJldCA9IDA7CiAKIAlwYWdldmVjX2luaXQoJnB2ZWMsIDApOwogCkBAIC0xNDM4LDcgKzE0NDQsOCBAQAogCiAJCQlpZiAodW5saWtlbHkoZjJmc19jcF9lcnJvcihzYmkpKSkgewogCQkJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7Ci0JCQkJcmV0dXJuIC1FSU87CisJCQkJcmV0ID0gLUVJTzsKKwkJCQlnb3RvIG91dDsKIAkJCX0KIAogCQkJLyoKQEAgLTE0ODksNiArMTQ5Niw4IEBACiAKIAkJCWlmIChOT0RFX01BUFBJTkcoc2JpKS0+YV9vcHMtPndyaXRlcGFnZShwYWdlLCB3YmMpKQogCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJZWxzZQorCQkJCW53cml0dGVuKys7CiAKIAkJCWlmICgtLXdiYy0+bnJfdG9fd3JpdGUgPT0gMCkKIAkJCQlicmVhazsKQEAgLTE1MDYsNyArMTUxNSwxMCBAQAogCQlzdGVwKys7CiAJCWdvdG8gbmV4dF9zdGVwOwogCX0KLQlyZXR1cm4gbndyaXR0ZW47CitvdXQ6CisJaWYgKG53cml0dGVuKQorCQlmMmZzX3N1Ym1pdF9tZXJnZWRfYmlvKHNiaSwgTk9ERSwgV1JJVEUpOworCXJldHVybiByZXQ7CiB9CiAKIGludCB3YWl0X29uX25vZGVfcGFnZXNfd3JpdGViYWNrKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgbmlkX3QgaW5vKQpAQCAtMTY3Miw2ICsxNjg0LDkgQEAKIAkuc2V0X3BhZ2VfZGlydHkJPSBmMmZzX3NldF9ub2RlX3BhZ2VfZGlydHksCiAJLmludmFsaWRhdGVwYWdlCT0gZjJmc19pbnZhbGlkYXRlX3BhZ2UsCiAJLnJlbGVhc2VwYWdlCT0gZjJmc19yZWxlYXNlX3BhZ2UsCisjaWZkZWYgQ09ORklHX01JR1JBVElPTgorCS5taWdyYXRlcGFnZSAgICA9IGYyZnNfbWlncmF0ZV9wYWdlLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGZyZWVfbmlkICpfX2xvb2t1cF9mcmVlX25pZF9saXN0KHN0cnVjdCBmMmZzX25tX2luZm8gKm5tX2ksCkBAIC0xODM4LDcgKzE4NTMsNyBAQAogCXN0cnVjdCBmcmVlX25pZCAqaSA9IE5VTEw7CiByZXRyeToKICNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KLQlpZiAodGltZV90b19pbmplY3QoRkFVTFRfQUxMT0NfTklEKSkKKwlpZiAodGltZV90b19pbmplY3Qoc2JpLCBGQVVMVF9BTExPQ19OSUQpKQogCQlyZXR1cm4gZmFsc2U7CiAjZW5kaWYKIAlpZiAodW5saWtlbHkoc2JpLT50b3RhbF92YWxpZF9ub2RlX2NvdW50ICsgMSA+IG5tX2ktPmF2YWlsYWJsZV9uaWRzKSkKQEAgLTIwMTUsMTAgKzIwMzAsMTIgQEAKIAogCWlmICh1bmxpa2VseShvbGRfbmkuYmxrX2FkZHIgIT0gTlVMTF9BRERSKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0KK3JldHJ5OgogCWlwYWdlID0gZjJmc19ncmFiX2NhY2hlX3BhZ2UoTk9ERV9NQVBQSU5HKHNiaSksIGlubywgZmFsc2UpOwotCWlmICghaXBhZ2UpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICghaXBhZ2UpIHsKKwkJY29uZ2VzdGlvbl93YWl0KEJMS19SV19BU1lOQywgSFovNTApOworCQlnb3RvIHJldHJ5OworCX0KIAogCS8qIFNob3VsZCBub3QgdXNlIHRoaXMgaW5vZGUgZnJvbSBmcmVlIG5pZCBsaXN0ICovCiAJcmVtb3ZlX2ZyZWVfbmlkKE5NX0koc2JpKSwgaW5vKTsKZGlmZiAtLWdpdCBhL2ZzL2YyZnMvbm9kZS5oIGIvZnMvZjJmcy9ub2RlLmgKaW5kZXggZmM3Njg0NS4uODY4YmVjNiAxMDA2NDQKLS0tIGEvZnMvZjJmcy9ub2RlLmgKKysrIGIvZnMvZjJmcy9ub2RlLmgKQEAgLTIyOSw2ICsyMjksMzcgQEAKIAlmMmZzX2NoYW5nZV9iaXQoYmxvY2tfb2ZmLCBubV9pLT5uYXRfYml0bWFwKTsKIH0KIAorc3RhdGljIGlubGluZSBuaWRfdCBpbm9fb2Zfbm9kZShzdHJ1Y3QgcGFnZSAqbm9kZV9wYWdlKQoreworCXN0cnVjdCBmMmZzX25vZGUgKnJuID0gRjJGU19OT0RFKG5vZGVfcGFnZSk7CisJcmV0dXJuIGxlMzJfdG9fY3B1KHJuLT5mb290ZXIuaW5vKTsKK30KKworc3RhdGljIGlubGluZSBuaWRfdCBuaWRfb2Zfbm9kZShzdHJ1Y3QgcGFnZSAqbm9kZV9wYWdlKQoreworCXN0cnVjdCBmMmZzX25vZGUgKnJuID0gRjJGU19OT0RFKG5vZGVfcGFnZSk7CisJcmV0dXJuIGxlMzJfdG9fY3B1KHJuLT5mb290ZXIubmlkKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgb2ZzX29mX25vZGUoc3RydWN0IHBhZ2UgKm5vZGVfcGFnZSkKK3sKKwlzdHJ1Y3QgZjJmc19ub2RlICpybiA9IEYyRlNfTk9ERShub2RlX3BhZ2UpOworCXVuc2lnbmVkIGZsYWcgPSBsZTMyX3RvX2NwdShybi0+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+PSBNQVhfQkxLQUREUihzYmkpKTsKKwlCVUdfT04oYmxrX2FkZHIgPCBTRUcwX0JMS0FERFIoc2JpKQorCQkJfHwgYmxrX2FkZHIgPj0gTUFYX0JMS0FERFIoc2JpKSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9mMmZzL3N1cGVyLmMgYi9mcy9mMmZzL3N1cGVyLmMKaW5kZXggN2Y4NjNhNi4uNjEzMmI0YyAxMDA2NDQKLS0tIGEvZnMvZjJmcy9zdXBlci5jCisrKyBiL2ZzL2YyZnMvc3VwZXIuYwpAQCAtNDAsNyArNDAsNiBAQAogc3RhdGljIHN0cnVjdCBrc2V0ICpmMmZzX2tzZXQ7CiAKICNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KLXN0cnVjdCBmMmZzX2ZhdWx0X2luZm8gZjJmc19mYXVsdDsKIAogY2hhciAqZmF1bHRfbmFtZVtGQVVMVF9NQVhdID0gewogCVtGQVVMVF9LTUFMTE9DXQkJPSAia21hbGxvYyIsCkBAIC01MCwxNiArNDksMjEgQEAKIAlbRkFVTFRfQkxPQ0tdCQk9ICJubyBtb3JlIGJsb2NrIiwKIAlbRkFVTFRfRElSX0RFUFRIXQk9ICJ0b28gYmlnIGRpciBkZXB0aCIsCiAJW0ZBVUxUX0VWSUNUX0lOT0RFXQk9ICJldmljdF9pbm9kZSBmYWlsIiwKKwlbRkFVTFRfSU9dCQk9ICJJTyBlcnJvciIsCisJW0ZBVUxUX0NIRUNLUE9JTlRdCT0gImNoZWNrcG9pbnQgZXJyb3IiLAogfTsKIAotc3RhdGljIHZvaWQgZjJmc19idWlsZF9mYXVsdF9hdHRyKHVuc2lnbmVkIGludCByYXRlKQorc3RhdGljIHZvaWQgZjJmc19idWlsZF9mYXVsdF9hdHRyKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKKwkJCQkJCXVuc2lnbmVkIGludCByYXRlKQogeworCXN0cnVjdCBmMmZzX2ZhdWx0X2luZm8gKmZmaSA9ICZzYmktPmZhdWx0X2luZm87CisKIAlpZiAocmF0ZSkgewotCQlhdG9taWNfc2V0KCZmMmZzX2ZhdWx0LmluamVjdF9vcHMsIDApOwotCQlmMmZzX2ZhdWx0LmluamVjdF9yYXRlID0gcmF0ZTsKLQkJZjJmc19mYXVsdC5pbmplY3RfdHlwZSA9ICgxIDw8IEZBVUxUX01BWCkgLSAxOworCQlhdG9taWNfc2V0KCZmZmktPmluamVjdF9vcHMsIDApOworCQlmZmktPmluamVjdF9yYXRlID0gcmF0ZTsKKwkJZmZpLT5pbmplY3RfdHlwZSA9ICgxIDw8IEZBVUxUX01BWCkgLSAxOwogCX0gZWxzZSB7Ci0JCW1lbXNldCgmZjJmc19mYXVsdCwgMCwgc2l6ZW9mKHN0cnVjdCBmMmZzX2ZhdWx0X2luZm8pKTsKKwkJbWVtc2V0KGZmaSwgMCwgc2l6ZW9mKHN0cnVjdCBmMmZzX2ZhdWx0X2luZm8pKTsKIAl9CiB9CiAjZW5kaWYKQEAgLTg3LDYgKzkxLDcgQEAKIAlPcHRfaW5saW5lX3hhdHRyLAogCU9wdF9pbmxpbmVfZGF0YSwKIAlPcHRfaW5saW5lX2RlbnRyeSwKKwlPcHRfbm9pbmxpbmVfZGVudHJ5LAogCU9wdF9mbHVzaF9tZXJnZSwKIAlPcHRfbm9mbHVzaF9tZXJnZSwKIAlPcHRfbm9iYXJyaWVyLApAQCAtMTE4LDYgKzEyMyw3IEBACiAJe09wdF9pbmxpbmVfeGF0dHIsICJpbmxpbmVfeGF0dHIifSwKIAl7T3B0X2lubGluZV9kYXRhLCAiaW5saW5lX2RhdGEifSwKIAl7T3B0X2lubGluZV9kZW50cnksICJpbmxpbmVfZGVudHJ5In0sCisJe09wdF9ub2lubGluZV9kZW50cnksICJub2lubGluZV9kZW50cnkifSwKIAl7T3B0X2ZsdXNoX21lcmdlLCAiZmx1c2hfbWVyZ2UifSwKIAl7T3B0X25vZmx1c2hfbWVyZ2UsICJub2ZsdXNoX21lcmdlIn0sCiAJe09wdF9ub2JhcnJpZXIsICJub2JhcnJpZXIifSwKQEAgLTE2Nyw3ICsxNzMsNyBAQAogI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgogCWVsc2UgaWYgKHN0cnVjdF90eXBlID09IEZBVUxUX0lORk9fUkFURSB8fAogCQkJCQlzdHJ1Y3RfdHlwZSA9PSBGQVVMVF9JTkZPX1RZUEUpCi0JCXJldHVybiAodW5zaWduZWQgY2hhciAqKSZmMmZzX2ZhdWx0OworCQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIgKikmc2JpLT5mYXVsdF9pbmZvOwogI2VuZGlmCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0zMTIsNiArMzE4LDEwIEBACiAJQVRUUl9MSVNUKGRpcnR5X25hdHNfcmF0aW8pLAogCUFUVFJfTElTVChjcF9pbnRlcnZhbCksCiAJQVRUUl9MSVNUKGlkbGVfaW50ZXJ2YWwpLAorI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgorCUFUVFJfTElTVChpbmplY3RfcmF0ZSksCisJQVRUUl9MSVNUKGluamVjdF90eXBlKSwKKyNlbmRpZgogCUFUVFJfTElTVChsaWZldGltZV93cml0ZV9rYnl0ZXMpLAogCU5VTEwsCiB9OwpAQCAtMzI3LDIyICszMzcsNiBAQAogCS5yZWxlYXNlCT0gZjJmc19zYl9yZWxlYXNlLAogfTsKIAotI2lmZGVmIENPTkZJR19GMkZTX0ZBVUxUX0lOSkVDVElPTgotLyogc3lzZnMgZm9yIGYyZnMgZmF1bHQgaW5qZWN0aW9uICovCi1zdGF0aWMgc3RydWN0IGtvYmplY3QgZjJmc19mYXVsdF9pbmplY3Q7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmMmZzX2ZhdWx0X2F0dHJzW10gPSB7Ci0JQVRUUl9MSVNUKGluamVjdF9yYXRlKSwKLQlBVFRSX0xJU1QoaW5qZWN0X3R5cGUpLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGYyZnNfZmF1bHRfa3R5cGUgPSB7Ci0JLmRlZmF1bHRfYXR0cnMJPSBmMmZzX2ZhdWx0X2F0dHJzLAotCS5zeXNmc19vcHMJPSAmZjJmc19hdHRyX29wcywKLX07Ci0jZW5kaWYKLQogdm9pZCBmMmZzX21zZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CkBAIC0zNzAsMTAgKzM2NCw2IEBACiAJY2hhciAqcCwgKm5hbWU7CiAJaW50IGFyZyA9IDA7CiAKLSNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KLQlmMmZzX2J1aWxkX2ZhdWx0X2F0dHIoMCk7Ci0jZW5kaWYKLQogCWlmICghb3B0aW9ucykKIAkJcmV0dXJuIDA7CiAKQEAgLTQ4OCw2ICs0NzgsOSBAQAogCQljYXNlIE9wdF9pbmxpbmVfZGVudHJ5OgogCQkJc2V0X29wdChzYmksIElOTElORV9ERU5UUlkpOwogCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vaW5saW5lX2RlbnRyeToKKwkJCWNsZWFyX29wdChzYmksIElOTElORV9ERU5UUlkpOworCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2ZsdXNoX21lcmdlOgogCQkJc2V0X29wdChzYmksIEZMVVNIX01FUkdFKTsKIAkJCWJyZWFrOwpAQCAtNTMzLDcgKzUyNiw3IEBACiAJCQlpZiAoYXJncy0+ZnJvbSAmJiBtYXRjaF9pbnQoYXJncywgJmFyZykpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCi0JCQlmMmZzX2J1aWxkX2ZhdWx0X2F0dHIoYXJnKTsKKwkJCWYyZnNfYnVpbGRfZmF1bHRfYXR0cihzYmksIGFyZyk7CiAjZWxzZQogCQkJZjJmc19tc2coc2IsIEtFUk5fSU5GTywKIAkJCQkiRkFVTFRfSU5KRUNUSU9OIHdhcyBub3Qgc2VsZWN0ZWQiKTsKQEAgLTczMCw3ICs3MjMsNyBAQAogCSAqIGNsZWFuIGNoZWNrcG9pbnQgYWdhaW4uCiAJICovCiAJaWYgKGlzX3NiaV9mbGFnX3NldChzYmksIFNCSV9JU19ESVJUWSkgfHwKLQkJCSFpc19zZXRfY2twdF9mbGFncyhGMkZTX0NLUFQoc2JpKSwgQ1BfVU1PVU5UX0ZMQUcpKSB7CisJCQkhaXNfc2V0X2NrcHRfZmxhZ3Moc2JpLCBDUF9VTU9VTlRfRkxBRykpIHsKIAkJc3RydWN0IGNwX2NvbnRyb2wgY3BjID0gewogCQkJLnJlYXNvbiA9IENQX1VNT1VOVCwKIAkJfTsKQEAgLTg3OCw2ICs4NzEsOCBAQAogCQlzZXFfcHV0cyhzZXEsICIsbm9pbmxpbmVfZGF0YSIpOwogCWlmICh0ZXN0X29wdChzYmksIElOTElORV9ERU5UUlkpKQogCQlzZXFfcHV0cyhzZXEsICIsaW5saW5lX2RlbnRyeSIpOworCWVsc2UKKwkJc2VxX3B1dHMoc2VxLCAiLG5vaW5saW5lX2RlbnRyeSIpOwogCWlmICghZjJmc19yZWFkb25seShzYmktPnNiKSAmJiB0ZXN0X29wdChzYmksIEZMVVNIX01FUkdFKSkKIAkJc2VxX3B1dHMoc2VxLCAiLGZsdXNoX21lcmdlIik7CiAJaWYgKHRlc3Rfb3B0KHNiaSwgTk9CQVJSSUVSKSkKQEAgLTk0Niw3ICs5NDEsNyBAQAogCQlzZXFfcHJpbnRmKHNlcSwgIiVkfCUtM3V8Iiwgc2UtPnR5cGUsCiAJCQkJCWdldF92YWxpZF9ibG9ja3Moc2JpLCBpLCAxKSk7CiAJCWZvciAoaiA9IDA7IGogPCBTSVRfVkJMT0NLX01BUF9TSVpFOyBqKyspCi0JCQlzZXFfcHJpbnRmKHNlcSwgIiV4ICIsIHNlLT5jdXJfdmFsaWRfbWFwW2pdKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICUuMngiLCBzZS0+Y3VyX3ZhbGlkX21hcFtqXSk7CiAJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CiAJfQogCXJldHVybiAwOwpAQCAtOTc1LDYgKzk3MCw3IEBACiAKIAlzZXRfb3B0KHNiaSwgQkdfR0MpOwogCXNldF9vcHQoc2JpLCBJTkxJTkVfREFUQSk7CisJc2V0X29wdChzYmksIElOTElORV9ERU5UUlkpOwogCXNldF9vcHQoc2JpLCBFWFRFTlRfQ0FDSEUpOwogCXNiaS0+c2ItPnNfZmxhZ3MgfD0gTVNfTEFaWVRJTUU7CiAJc2V0X29wdChzYmksIEZMVVNIX01FUkdFKTsKQEAgLTk5MSw2ICs5ODcsMTAgQEAKICNpZmRlZiBDT05GSUdfRjJGU19GU19QT1NJWF9BQ0wKIAlzZXRfb3B0KHNiaSwgUE9TSVhfQUNMKTsKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCisJZjJmc19idWlsZF9mYXVsdF9hdHRyKHNiaSwgMCk7CisjZW5kaWYKIH0KIAogc3RhdGljIGludCBmMmZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKQEAgLTEwMDEsNiArMTAwMSw5IEBACiAJYm9vbCBuZWVkX3Jlc3RhcnRfZ2MgPSBmYWxzZTsKIAlib29sIG5lZWRfc3RvcF9nYyA9IGZhbHNlOwogCWJvb2wgbm9fZXh0ZW50X2NhY2hlID0gIXRlc3Rfb3B0KHNiaSwgRVhURU5UX0NBQ0hFKTsKKyNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KKwlzdHJ1Y3QgZjJmc19mYXVsdF9pbmZvIGZmaSA9IHNiaS0+ZmF1bHRfaW5mbzsKKyNlbmRpZgogCiAJLyoKIAkgKiBTYXZlIHRoZSBvbGQgbW91bnQgb3B0aW9ucyBpbiBjYXNlIHdlCkBAIC0xMDk2LDYgKzEwOTksOSBAQAogcmVzdG9yZV9vcHRzOgogCXNiaS0+bW91bnRfb3B0ID0gb3JnX21vdW50X29wdDsKIAlzYmktPmFjdGl2ZV9sb2dzID0gYWN0aXZlX2xvZ3M7CisjaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCisJc2JpLT5mYXVsdF9pbmZvID0gZmZpOworI2VuZGlmCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTQ2OSw2ICsxNDc1LDcgQEAKIAltdXRleF9pbml0KCZzYmktPnVtb3VudF9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmc2JpLT53aW9fbXV0ZXhbTk9ERV0pOwogCW11dGV4X2luaXQoJnNiaS0+d2lvX211dGV4W0RBVEFdKTsKKwlzcGluX2xvY2tfaW5pdCgmc2JpLT5jcF9sb2NrKTsKIAogI2lmZGVmIENPTkZJR19GMkZTX0ZTX0VOQ1JZUFRJT04KIAltZW1jcHkoc2JpLT5rZXlfcHJlZml4LCBGMkZTX0tFWV9ERVNDX1BSRUZJWCwKQEAgLTE4MTAsNyArMTgxNyw3IEBACiAJCSAqIHByZXZpb3VzIGNoZWNrcG9pbnQgd2FzIG5vdCBkb25lIGJ5IGNsZWFuIHN5c3RlbSBzaHV0ZG93bi4KIAkJICovCiAJCWlmIChiZGV2X3JlYWRfb25seShzYi0+c19iZGV2KSAmJgotCQkJCSFpc19zZXRfY2twdF9mbGFncyhzYmktPmNrcHQsIENQX1VNT1VOVF9GTEFHKSkgeworCQkJCSFpc19zZXRfY2twdF9mbGFncyhzYmksIENQX1VNT1VOVF9GTEFHKSkgewogCQkJZXJyID0gLUVST0ZTOwogCQkJZ290byBmcmVlX2tvYmo7CiAJCX0KQEAgLTE4MTgsNiArMTgyNSw5IEBACiAJCWlmIChuZWVkX2ZzY2spCiAJCQlzZXRfc2JpX2ZsYWcoc2JpLCBTQklfTkVFRF9GU0NLKTsKIAorCQlpZiAoIXJldHJ5KQorCQkJZ290byBza2lwX3JlY292ZXJ5OworCiAJCWVyciA9IHJlY292ZXJfZnN5bmNfZGF0YShzYmksIGZhbHNlKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCW5lZWRfZnNjayA9IHRydWU7CkBAIC0xODM1LDcgKzE4NDUsNyBAQAogCQkJZ290byBmcmVlX2tvYmo7CiAJCX0KIAl9Ci0KK3NraXBfcmVjb3Zlcnk6CiAJLyogcmVjb3Zlcl9mc3luY19kYXRhKCkgY2xlYXJlZCB0aGlzIGFscmVhZHkgKi8KIAljbGVhcl9zYmlfZmxhZyhzYmksIFNCSV9QT1JfRE9JTkcpOwogCkBAIC0xODc5LDcgKzE4ODksOSBAQAogCWRwdXQoc2ItPnNfcm9vdCk7CiAJc2ItPnNfcm9vdCA9IE5VTEw7CiBmcmVlX25vZGVfaW5vZGU6CisJdHJ1bmNhdGVfaW5vZGVfcGFnZXNfZmluYWwoTk9ERV9NQVBQSU5HKHNiaSkpOwogCW11dGV4X2xvY2soJnNiaS0+dW1vdW50X211dGV4KTsKKwlyZWxlYXNlX2lub19lbnRyeShzYmksIHRydWUpOwogCWYyZnNfbGVhdmVfc2hyaW5rZXIoc2JpKTsKIAlpcHV0KHNiaS0+bm9kZV9pbm9kZSk7CiAJbXV0ZXhfdW5sb2NrKCZzYmktPnVtb3VudF9tdXRleCk7CkBAIC0xOTc4LDE2ICsxOTkwLDYgQEAKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmcmVlX2V4dGVudF9jYWNoZTsKIAl9Ci0jaWZkZWYgQ09ORklHX0YyRlNfRkFVTFRfSU5KRUNUSU9OCi0JZjJmc19mYXVsdF9pbmplY3Qua3NldCA9IGYyZnNfa3NldDsKLQlmMmZzX2J1aWxkX2ZhdWx0X2F0dHIoMCk7Ci0JZXJyID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmYyZnNfZmF1bHRfaW5qZWN0LCAmZjJmc19mYXVsdF9rdHlwZSwKLQkJCQlOVUxMLCAiZmF1bHRfaW5qZWN0aW9uIik7Ci0JaWYgKGVycikgewotCQlmMmZzX2ZhdWx0X2luamVjdC5rc2V0ID0gTlVMTDsKLQkJZ290byBmcmVlX2tzZXQ7Ci0JfQotI2VuZGlmCiAJZXJyID0gcmVnaXN0ZXJfc2hyaW5rZXIoJmYyZnNfc2hyaW5rZXJfaW5mbyk7CiAJaWYgKGVycikKIAkJZ290byBmcmVlX2tzZXQ7CkBAIC0yMDA2LDEwICsyMDA4LDYgQEAKIGZyZWVfc2hyaW5rZXI6CiAJdW5yZWdpc3Rlcl9zaHJpbmtlcigmZjJmc19zaHJpbmtlcl9pbmZvKTsKIGZyZWVfa3NldDoKLSNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KLQlpZiAoZjJmc19mYXVsdF9pbmplY3Qua3NldCkKLQkJa29iamVjdF9wdXQoJmYyZnNfZmF1bHRfaW5qZWN0KTsKLSNlbmRpZgogCWtzZXRfdW5yZWdpc3RlcihmMmZzX2tzZXQpOwogZnJlZV9leHRlbnRfY2FjaGU6CiAJZGVzdHJveV9leHRlbnRfY2FjaGUoKTsKQEAgLTIwMzEsOSArMjAyOSw2IEBACiAJZjJmc19kZXN0cm95X3Jvb3Rfc3RhdHMoKTsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmYyZnNfZnNfdHlwZSk7CiAJdW5yZWdpc3Rlcl9zaHJpbmtlcigmZjJmc19zaHJpbmtlcl9pbmZvKTsKLSNpZmRlZiBDT05GSUdfRjJGU19GQVVMVF9JTkpFQ1RJT04KLQlrb2JqZWN0X3B1dCgmZjJmc19mYXVsdF9pbmplY3QpOwotI2VuZGlmCiAJa3NldF91bnJlZ2lzdGVyKGYyZnNfa3NldCk7CiAJZGVzdHJveV9leHRlbnRfY2FjaGUoKTsKIAlkZXN0cm95X2NoZWNrcG9pbnRfY2FjaGVzKCk7CmRpZmYgLS1naXQgYS9mcy9mMmZzL3hhdHRyLmMgYi9mcy9mMmZzL3hhdHRyLmMKaW5kZXggYzg4OThiNS4uMWY3NDg3NiAxMDA2NDQKLS0tIGEvZnMvZjJmcy94YXR0ci5jCisrKyBiL2ZzL2YyZnMveGF0dHIuYwpAQCAtMjE3LDE4ICsyMTcsMjAgQEAKIAlyZXR1cm4gZW50cnk7CiB9CiAKLXN0YXRpYyB2b2lkICpyZWFkX2FsbF94YXR0cnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKmlwYWdlKQorc3RhdGljIGludCByZWFkX2FsbF94YXR0cnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKmlwYWdlLAorCQkJCQkJCXZvaWQgKipiYXNlX2FkZHIpCiB7CiAJc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpID0gRjJGU19JX1NCKGlub2RlKTsKIAlzdHJ1Y3QgZjJmc194YXR0cl9oZWFkZXIgKmhlYWRlcjsKIAlzaXplX3Qgc2l6ZSA9IFBBR0VfU0laRSwgaW5saW5lX3NpemUgPSAwOwogCXZvaWQgKnR4YXR0cl9hZGRyOworCWludCBlcnI7CiAKIAlpbmxpbmVfc2l6ZSA9IGlubGluZV94YXR0cl9zaXplKGlub2RlKTsKIAogCXR4YXR0cl9hZGRyID0ga3phbGxvYyhpbmxpbmVfc2l6ZSArIHNpemUsIEdGUF9GMkZTX1pFUk8pOwogCWlmICghdHhhdHRyX2FkZHIpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIHJlYWQgZnJvbSBpbmxpbmUgeGF0dHIgKi8KIAlpZiAoaW5saW5lX3NpemUpIHsKQEAgLTIzOSw4ICsyNDEsMTAgQEAKIAkJCWlubGluZV9hZGRyID0gaW5saW5lX3hhdHRyX2FkZHIoaXBhZ2UpOwogCQl9IGVsc2UgewogCQkJcGFnZSA9IGdldF9ub2RlX3BhZ2Uoc2JpLCBpbm9kZS0+aV9pbm8pOwotCQkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHBhZ2UpOwogCQkJCWdvdG8gZmFpbDsKKwkJCX0KIAkJCWlubGluZV9hZGRyID0gaW5saW5lX3hhdHRyX2FkZHIocGFnZSk7CiAJCX0KIAkJbWVtY3B5KHR4YXR0cl9hZGRyLCBpbmxpbmVfYWRkciwgaW5saW5lX3NpemUpOwpAQCAtMjU0LDggKzI1OCwxMCBAQAogCiAJCS8qIFRoZSBpbm9kZSBhbHJlYWR5IGhhcyBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2suICovCiAJCXhwYWdlID0gZ2V0X25vZGVfcGFnZShzYmksIEYyRlNfSShpbm9kZSktPmlfeGF0dHJfbmlkKTsKLQkJaWYgKElTX0VSUih4cGFnZSkpCisJCWlmIChJU19FUlIoeHBhZ2UpKSB7CisJCQllcnIgPSBQVFJfRVJSKHhwYWdlKTsKIAkJCWdvdG8gZmFpbDsKKwkJfQogCiAJCXhhdHRyX2FkZHIgPSBwYWdlX2FkZHJlc3MoeHBhZ2UpOwogCQltZW1jcHkodHhhdHRyX2FkZHIgKyBpbmxpbmVfc2l6ZSwgeGF0dHJfYWRkciwgUEFHRV9TSVpFKTsKQEAgLTI2OSwxMCArMjc1LDExIEBACiAJCWhlYWRlci0+aF9tYWdpYyA9IGNwdV90b19sZTMyKEYyRlNfWEFUVFJfTUFHSUMpOwogCQloZWFkZXItPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxKTsKIAl9Ci0JcmV0dXJuIHR4YXR0cl9hZGRyOworCSpiYXNlX2FkZHIgPSB0eGF0dHJfYWRkcjsKKwlyZXR1cm4gMDsKIGZhaWw6CiAJa3pmcmVlKHR4YXR0cl9hZGRyKTsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB3cml0ZV9hbGxfeGF0dHJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIF9fdTMyIGhzaXplLApAQCAtMzY2LDkgKzM3Myw5IEBACiAJaWYgKGxlbiA+IEYyRlNfTkFNRV9MRU4pCiAJCXJldHVybiAtRVJBTkdFOwogCi0JYmFzZV9hZGRyID0gcmVhZF9hbGxfeGF0dHJzKGlub2RlLCBpcGFnZSk7Ci0JaWYgKCFiYXNlX2FkZHIpCi0JCXJldHVybiAtRU5PTUVNOworCWVycm9yID0gcmVhZF9hbGxfeGF0dHJzKGlub2RlLCBpcGFnZSwgJmJhc2VfYWRkcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKIAllbnRyeSA9IF9fZmluZF94YXR0cihiYXNlX2FkZHIsIGluZGV4LCBsZW4sIG5hbWUpOwogCWlmIChJU19YQVRUUl9MQVNUX0VOVFJZKGVudHJ5KSkgewpAQCAtNDAyLDkgKzQwOSw5IEBACiAJaW50IGVycm9yID0gMDsKIAlzaXplX3QgcmVzdCA9IGJ1ZmZlcl9zaXplOwogCi0JYmFzZV9hZGRyID0gcmVhZF9hbGxfeGF0dHJzKGlub2RlLCBOVUxMKTsKLQlpZiAoIWJhc2VfYWRkcikKLQkJcmV0dXJuIC1FTk9NRU07CisJZXJyb3IgPSByZWFkX2FsbF94YXR0cnMoaW5vZGUsIE5VTEwsICZiYXNlX2FkZHIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCiAJbGlzdF9mb3JfZWFjaF94YXR0cihlbnRyeSwgYmFzZV9hZGRyKSB7CiAJCWNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyID0KQEAgLTQ2Myw5ICs0NzAsOSBAQAogCWlmIChzaXplID4gTUFYX1ZBTFVFX0xFTihpbm9kZSkpCiAJCXJldHVybiAtRTJCSUc7CiAKLQliYXNlX2FkZHIgPSByZWFkX2FsbF94YXR0cnMoaW5vZGUsIGlwYWdlKTsKLQlpZiAoIWJhc2VfYWRkcikKLQkJcmV0dXJuIC1FTk9NRU07CisJZXJyb3IgPSByZWFkX2FsbF94YXR0cnMoaW5vZGUsIGlwYWdlLCAmYmFzZV9hZGRyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAogCS8qIGZpbmQgZW50cnkgd2l0aCB3YW50ZWQgbmFtZS4gKi8KIAloZXJlID0gX19maW5kX3hhdHRyKGJhc2VfYWRkciwgaW5kZXgsIGxlbiwgbmFtZSk7CkBAIC01NDgsNiArNTU1LDggQEAKIAkJCSFzdHJjbXAobmFtZSwgRjJGU19YQVRUUl9OQU1FX0VOQ1JZUFRJT05fQ09OVEVYVCkpCiAJCWYyZnNfc2V0X2VuY3J5cHRlZF9pbm9kZShpbm9kZSk7CiAJZjJmc19tYXJrX2lub2RlX2RpcnR5X3N5bmMoaW5vZGUpOworCWlmICghZXJyb3IgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJc2V0X3NiaV9mbGFnKEYyRlNfSV9TQihpbm9kZSksIFNCSV9ORUVEX0NQKTsKIGV4aXQ6CiAJa3pmcmVlKGJhc2VfYWRkcik7CiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9LY29uZmlnIGIvZnMvZnVzZS9LY29uZmlnCmluZGV4IDFiMmY2YzIuLjc2ZjA5Y2UgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvS2NvbmZpZworKysgYi9mcy9mdXNlL0tjb25maWcKQEAgLTEsNSArMSw2IEBACiBjb25maWcgRlVTRV9GUwogCXRyaXN0YXRlICJGVVNFIChGaWxlc3lzdGVtIGluIFVzZXJzcGFjZSkgc3VwcG9ydCIKKwlzZWxlY3QgRlNfUE9TSVhfQUNMCiAJaGVscAogCSAgV2l0aCBGVVNFIGl0IGlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCBhIGZ1bGx5IGZ1bmN0aW9uYWwgZmlsZXN5c3RlbQogCSAgaW4gYSB1c2Vyc3BhY2UgcHJvZ3JhbS4KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvTWFrZWZpbGUgYi9mcy9mdXNlL01ha2VmaWxlCmluZGV4IGU5NWVlYjQuLjYwZGE4NGEgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvTWFrZWZpbGUKKysrIGIvZnMvZnVzZS9NYWtlZmlsZQpAQCAtNSw0ICs1LDQgQEAKIG9iai0kKENPTkZJR19GVVNFX0ZTKSArPSBmdXNlLm8KIG9iai0kKENPTkZJR19DVVNFKSArPSBjdXNlLm8KIAotZnVzZS1vYmpzIDo9IGRldi5vIGRpci5vIGZpbGUubyBpbm9kZS5vIGNvbnRyb2wubworZnVzZS1vYmpzIDo9IGRldi5vIGRpci5vIGZpbGUubyBpbm9kZS5vIGNvbnRyb2wubyB4YXR0ci5vIGFjbC5vCmRpZmYgLS1naXQgYS9mcy9mdXNlL2FjbC5jIGIvZnMvZnVzZS9hY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzg1NzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZnVzZS9hY2wuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKKyAqIENvcHlyaWdodCAoQykgMjAxNiBDYW5vbmljYWwgTHRkLiA8c2V0aC5mb3JzaGVlQGNhbm9uaWNhbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCisgKiBTZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqLworCisjaW5jbHVkZSAiZnVzZV9pLmgiCisKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KKworc3RydWN0IHBvc2l4X2FjbCAqZnVzZV9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJaW50IHNpemU7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkICp2YWx1ZSA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCisJaWYgKCFmYy0+cG9zaXhfYWNsIHx8IGZjLT5ub19nZXR4YXR0cikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodHlwZSA9PSBBQ0xfVFlQRV9BQ0NFU1MpCisJCW5hbWUgPSBYQVRUUl9OQU1FX1BPU0lYX0FDTF9BQ0NFU1M7CisJZWxzZSBpZiAodHlwZSA9PSBBQ0xfVFlQRV9ERUZBVUxUKQorCQluYW1lID0gWEFUVFJfTkFNRV9QT1NJWF9BQ0xfREVGQVVMVDsKKwllbHNlCisJCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKKworCXZhbHVlID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghdmFsdWUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXNpemUgPSBmdXNlX2dldHhhdHRyKGlub2RlLCBuYW1lLCB2YWx1ZSwgUEFHRV9TSVpFKTsKKwlpZiAoc2l6ZSA+IDApCisJCWFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKCZpbml0X3VzZXJfbnMsIHZhbHVlLCBzaXplKTsKKwllbHNlIGlmICgoc2l6ZSA9PSAwKSB8fCAoc2l6ZSA9PSAtRU5PREFUQSkgfHwKKwkJIChzaXplID09IC1FT1BOT1RTVVBQICYmIGZjLT5ub19nZXR4YXR0cikpCisJCWFjbCA9IE5VTEw7CisJZWxzZSBpZiAoc2l6ZSA9PSAtRVJBTkdFKQorCQlhY2wgPSBFUlJfUFRSKC1FMkJJRyk7CisJZWxzZQorCQlhY2wgPSBFUlJfUFRSKHNpemUpOworCisJa2ZyZWUodmFsdWUpOworCXJldHVybiBhY2w7Cit9CisKK2ludCBmdXNlX3NldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IHJldDsKKworCWlmICghZmMtPnBvc2l4X2FjbCB8fCBmYy0+bm9fc2V0eGF0dHIpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICh0eXBlID09IEFDTF9UWVBFX0FDQ0VTUykKKwkJbmFtZSA9IFhBVFRSX05BTUVfUE9TSVhfQUNMX0FDQ0VTUzsKKwllbHNlIGlmICh0eXBlID09IEFDTF9UWVBFX0RFRkFVTFQpCisJCW5hbWUgPSBYQVRUUl9OQU1FX1BPU0lYX0FDTF9ERUZBVUxUOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWNsKSB7CisJCS8qCisJCSAqIEZ1c2UgdXNlcnNwYWNlIGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyBhY2Nlc3MKKwkJICogcGVybWlzc2lvbnMgaW4gdGhlIGlub2RlLCBpZiBuZWVkZWQuIGZ1c2Vfc2V0eGF0dHIKKwkJICogaW52YWxpZGF0ZXMgdGhlIGlub2RlIGF0dHJpYnV0ZXMsIHdoaWNoIHdpbGwgZm9yY2UKKwkJICogdGhlbSB0byBiZSByZWZyZXNoZWQgdGhlIG5leHQgdGltZSB0aGV5IGFyZSB1c2VkLAorCQkgKiBhbmQgaXQgYWxzbyB1cGRhdGVzIGlfY3RpbWUuCisJCSAqLworCQlzaXplX3Qgc2l6ZSA9IHBvc2l4X2FjbF94YXR0cl9zaXplKGFjbC0+YV9jb3VudCk7CisJCXZvaWQgKnZhbHVlOworCisJCWlmIChzaXplID4gUEFHRV9TSVpFKQorCQkJcmV0dXJuIC1FMkJJRzsKKworCQl2YWx1ZSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlyZXQgPSBwb3NpeF9hY2xfdG9feGF0dHIoJmluaXRfdXNlcl9ucywgYWNsLCB2YWx1ZSwgc2l6ZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlrZnJlZSh2YWx1ZSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gZnVzZV9zZXR4YXR0cihpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUsIDApOworCQlrZnJlZSh2YWx1ZSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gZnVzZV9yZW1vdmV4YXR0cihpbm9kZSwgbmFtZSk7CisJfQorCWZvcmdldF9hbGxfY2FjaGVkX2FjbHMoaW5vZGUpOworCWZ1c2VfaW52YWxpZGF0ZV9hdHRyKGlub2RlKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rldi5jIGIvZnMvZnVzZS9kZXYuYwppbmRleCBhOTRkMmVkLi43MGVhNTdjIDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rldi5jCisrKyBiL2ZzL2Z1c2UvZGV2LmMKQEAgLTcyOCw3ICs3MjgsNyBAQAogCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiA9IGNzLT5waXBlYnVmczsKIAogCQlpZiAoIWNzLT53cml0ZSkgewotCQkJZXJyID0gYnVmLT5vcHMtPmNvbmZpcm0oY3MtPnBpcGUsIGJ1Zik7CisJCQllcnIgPSBwaXBlX2J1Zl9jb25maXJtKGNzLT5waXBlLCBidWYpOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm4gZXJyOwogCkBAIC03NjcsNyArNzY3LDYgQEAKIAkJY3MtPmxlbiA9IGVycjsKIAkJY3MtPm9mZnNldCA9IG9mZjsKIAkJY3MtPnBnID0gcGFnZTsKLQkJY3MtPm9mZnNldCA9IG9mZjsKIAkJaW92X2l0ZXJfYWR2YW5jZShjcy0+aXRlciwgZXJyKTsKIAl9CiAKQEAgLTgyOCw3ICs4MjcsNyBAQAogCiAJZnVzZV9jb3B5X2ZpbmlzaChjcyk7CiAKLQllcnIgPSBidWYtPm9wcy0+Y29uZmlybShjcy0+cGlwZSwgYnVmKTsKKwllcnIgPSBwaXBlX2J1Zl9jb25maXJtKGNzLT5waXBlLCBidWYpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTg0MSw3ICs4NDAsNyBAQAogCWlmIChjcy0+bGVuICE9IFBBR0VfU0laRSkKIAkJZ290byBvdXRfZmFsbGJhY2s7CiAKLQlpZiAoYnVmLT5vcHMtPnN0ZWFsKGNzLT5waXBlLCBidWYpICE9IDApCisJaWYgKHBpcGVfYnVmX3N0ZWFsKGNzLT5waXBlLCBidWYpICE9IDApCiAJCWdvdG8gb3V0X2ZhbGxiYWNrOwogCiAJbmV3cGFnZSA9IGJ1Zi0+cGFnZTsKQEAgLTEzNDIsOSArMTM0MSw4IEBACiAJCQkJICAgIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsCiAJCQkJICAgIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQlpbnQgcmV0OworCWludCB0b3RhbCwgcmV0OwogCWludCBwYWdlX25yID0gMDsKLQlpbnQgZG9fd2FrZXVwID0gMDsKIAlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZnM7CiAJc3RydWN0IGZ1c2VfY29weV9zdGF0ZSBjczsKIAlzdHJ1Y3QgZnVzZV9kZXYgKmZ1ZCA9IGZ1c2VfZ2V0X2Rldihpbik7CkBAIC0xMzYzLDUyICsxMzYxLDIzIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gMDsKLQlwaXBlX2xvY2socGlwZSk7Ci0KLQlpZiAoIXBpcGUtPnJlYWRlcnMpIHsKLQkJc2VuZF9zaWcoU0lHUElQRSwgY3VycmVudCwgMCk7Ci0JCWlmICghcmV0KQotCQkJcmV0ID0gLUVQSVBFOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCiAJaWYgKHBpcGUtPm5yYnVmcyArIGNzLm5yX3NlZ3MgPiBwaXBlLT5idWZmZXJzKSB7CiAJCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0X3VubG9jazsKKwkJZ290byBvdXQ7CiAJfQogCi0Jd2hpbGUgKHBhZ2VfbnIgPCBjcy5ucl9zZWdzKSB7Ci0JCWludCBuZXdidWYgPSAocGlwZS0+Y3VyYnVmICsgcGlwZS0+bnJidWZzKSAmIChwaXBlLT5idWZmZXJzIC0gMSk7Ci0JCXN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmID0gcGlwZS0+YnVmcyArIG5ld2J1ZjsKLQotCQlidWYtPnBhZ2UgPSBidWZzW3BhZ2VfbnJdLnBhZ2U7Ci0JCWJ1Zi0+b2Zmc2V0ID0gYnVmc1twYWdlX25yXS5vZmZzZXQ7Ci0JCWJ1Zi0+bGVuID0gYnVmc1twYWdlX25yXS5sZW47CisJZm9yIChyZXQgPSB0b3RhbCA9IDA7IHBhZ2VfbnIgPCBjcy5ucl9zZWdzOyB0b3RhbCArPSByZXQpIHsKIAkJLyoKIAkJICogTmVlZCB0byBiZSBjYXJlZnVsIGFib3V0IHRoaXMuICBIYXZpbmcgYnVmLT5vcHMgaW4gbW9kdWxlCiAJCSAqIGNvZGUgY2FuIE9vcHMgaWYgdGhlIGJ1ZmZlciBwZXJzaXN0cyBhZnRlciBtb2R1bGUgdW5sb2FkLgogCQkgKi8KLQkJYnVmLT5vcHMgPSAmbm9zdGVhbF9waXBlX2J1Zl9vcHM7Ci0KLQkJcGlwZS0+bnJidWZzKys7Ci0JCXBhZ2VfbnIrKzsKLQkJcmV0ICs9IGJ1Zi0+bGVuOwotCi0JCWlmIChwaXBlLT5maWxlcykKLQkJCWRvX3dha2V1cCA9IDE7CisJCWJ1ZnNbcGFnZV9ucl0ub3BzID0gJm5vc3RlYWxfcGlwZV9idWZfb3BzOworCQlyZXQgPSBhZGRfdG9fcGlwZShwaXBlLCAmYnVmc1twYWdlX25yKytdKTsKKwkJaWYgKHVubGlrZWx5KHJldCA8IDApKQorCQkJYnJlYWs7CiAJfQotCi1vdXRfdW5sb2NrOgotCXBpcGVfdW5sb2NrKHBpcGUpOwotCi0JaWYgKGRvX3dha2V1cCkgewotCQlzbXBfbWIoKTsKLQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnBpcGUtPndhaXQpKQotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwaXBlLT53YWl0KTsKLQkJa2lsbF9mYXN5bmMoJnBpcGUtPmZhc3luY19yZWFkZXJzLCBTSUdJTywgUE9MTF9JTik7Ci0JfQotCisJaWYgKHRvdGFsKQorCQlyZXQgPSB0b3RhbDsKIG91dDoKIAlmb3IgKDsgcGFnZV9uciA8IGNzLm5yX3NlZ3M7IHBhZ2VfbnIrKykKIAkJcHV0X3BhZ2UoYnVmc1twYWdlX25yXS5wYWdlKTsKQEAgLTE5OTMsNyArMTk2Miw3IEBACiAJCQlwaXBlLT5jdXJidWYgPSAocGlwZS0+Y3VyYnVmICsgMSkgJiAocGlwZS0+YnVmZmVycyAtIDEpOwogCQkJcGlwZS0+bnJidWZzLS07CiAJCX0gZWxzZSB7Ci0JCQlpYnVmLT5vcHMtPmdldChwaXBlLCBpYnVmKTsKKwkJCXBpcGVfYnVmX2dldChwaXBlLCBpYnVmKTsKIAkJCSpvYnVmID0gKmlidWY7CiAJCQlvYnVmLT5mbGFncyAmPSB+UElQRV9CVUZfRkxBR19HSUZUOwogCQkJb2J1Zi0+bGVuID0gcmVtOwpAQCAtMjAxNSwxMCArMTk4NCw5IEBACiAKIAlyZXQgPSBmdXNlX2Rldl9kb193cml0ZShmdWQsICZjcywgbGVuKTsKIAotCWZvciAoaWR4ID0gMDsgaWR4IDwgbmJ1ZjsgaWR4KyspIHsKLQkJc3RydWN0IHBpcGVfYnVmZmVyICpidWYgPSAmYnVmc1tpZHhdOwotCQlidWYtPm9wcy0+cmVsZWFzZShwaXBlLCBidWYpOwotCX0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IG5idWY7IGlkeCsrKQorCQlwaXBlX2J1Zl9yZWxlYXNlKHBpcGUsICZidWZzW2lkeF0pOworCiBvdXQ6CiAJa2ZyZWUoYnVmcyk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGlyLmMgYi9mcy9mdXNlL2Rpci5jCmluZGV4IGM0N2I3NzguLmY3Yzg0YWIgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGlyLmMKKysrIGIvZnMvZnVzZS9kaXIuYwpAQCAtMTMsNiArMTMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+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/IDEgOiAwKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZmlsZS5jIGIvZnMvZ2ZzMi9maWxlLmMKaW5kZXggMzIwZTY1ZS4uZTIzZmY3MCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9maWxlLmMKKysrIGIvZnMvZ2ZzMi9maWxlLmMKQEAgLTM5NSw5ICszOTUsNiBAQAogCiAJc2Jfc3RhcnRfcGFnZWZhdWx0KGlub2RlLT5pX3NiKTsKIAotCS8qIFVwZGF0ZSBmaWxlIHRpbWVzIGJlZm9yZSB0YWtpbmcgcGFnZSBsb2NrICovCi0JZmlsZV91cGRhdGVfdGltZSh2bWEtPnZtX2ZpbGUpOwotCiAJcmV0ID0gZ2ZzMl9yc3FhX2FsbG9jKGlwKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKQEAgLTQwOSw2ICs0MDYsOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3VuaW5pdDsKIAorCS8qIFVwZGF0ZSBmaWxlIHRpbWVzIGJlZm9yZSB0YWtpbmcgcGFnZSBsb2NrICovCisJZmlsZV91cGRhdGVfdGltZSh2bWEtPnZtX2ZpbGUpOworCiAJc2V0X2JpdChHTEZfRElSVFksICZpcC0+aV9nbC0+Z2xfZmxhZ3MpOwogCXNldF9iaXQoR0lGX1NXX1BBR0VELCAmaXAtPmlfZmxhZ3MpOwogCkBAIC05NTQsMzAgKzk1NCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3QgZ2ZzMl9maWxlX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICppbiwgbG9mZl90ICpwcG9zLAotCQkJCSAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwKLQkJCQkgICAgIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gaW4tPmZfbWFwcGluZy0+aG9zdDsKLQlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwotCXN0cnVjdCBnZnMyX2hvbGRlciBnaDsKLQlpbnQgcmV0OwotCi0JaW5vZGVfbG9jayhpbm9kZSk7Ci0KLQlyZXQgPSBnZnMyX2dsb2NrX25xX2luaXQoaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgMCwgJmdoKTsKLQlpZiAocmV0KSB7Ci0JCWlub2RlX3VubG9jayhpbm9kZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJmdoKTsKLQlpbm9kZV91bmxvY2soaW5vZGUpOwotCi0JcmV0dXJuIGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZChpbiwgcHBvcywgcGlwZSwgbGVuLCBmbGFncyk7Ci19Ci0KLQogc3RhdGljIHNzaXplX3QgZ2ZzMl9maWxlX3NwbGljZV93cml0ZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAogCQkJCSAgICAgIHN0cnVjdCBmaWxlICpvdXQsIGxvZmZfdCAqcHBvcywKIAkJCQkgICAgICBzaXplX3QgbGVuLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCkBAIC0xMTQwLDcgKzExMTYsNyBAQAogCS5mc3luYwkJPSBnZnMyX2ZzeW5jLAogCS5sb2NrCQk9IGdmczJfbG9jaywKIAkuZmxvY2sJCT0gZ2ZzMl9mbG9jaywKLQkuc3BsaWNlX3JlYWQJPSBnZnMyX2ZpbGVfc3BsaWNlX3JlYWQsCisJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAogCS5zcGxpY2Vfd3JpdGUJPSBnZnMyX2ZpbGVfc3BsaWNlX3dyaXRlLAogCS5zZXRsZWFzZQk9IHNpbXBsZV9ub3NldGxlYXNlLAogCS5mYWxsb2NhdGUJPSBnZnMyX2ZhbGxvY2F0ZSwKQEAgLTExNjgsNyArMTE0NCw3IEBACiAJLm9wZW4JCT0gZ2ZzMl9vcGVuLAogCS5yZWxlYXNlCT0gZ2ZzMl9yZWxlYXNlLAogCS5mc3luYwkJPSBnZnMyX2ZzeW5jLAotCS5zcGxpY2VfcmVhZAk9IGdmczJfZmlsZV9zcGxpY2VfcmVhZCwKKwkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiAJLnNwbGljZV93cml0ZQk9IGdmczJfZmlsZV9zcGxpY2Vfd3JpdGUsCiAJLnNldGxlYXNlCT0gZ2VuZXJpY19zZXRsZWFzZSwKIAkuZmFsbG9jYXRlCT0gZ2ZzMl9mYWxsb2NhdGUsCmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb2NrLmMgYi9mcy9nZnMyL2dsb2NrLmMKaW5kZXggM2E5MGIyYi4uMTRjYmY2MCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9jay5jCisrKyBiL2ZzL2dmczIvZ2xvY2suYwpAQCAtNjksNyArNjksNyBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhscnVfbG9jayk7CiAKICNkZWZpbmUgR0ZTMl9HTF9IQVNIX1NISUZUICAgICAgMTUKLSNkZWZpbmUgR0ZTMl9HTF9IQVNIX1NJWkUgICAgICAgKDEgPDwgR0ZTMl9HTF9IQVNIX1NISUZUKQorI2RlZmluZSBHRlMyX0dMX0hBU0hfU0laRSAgICAgICBCSVQoR0ZTMl9HTF9IQVNIX1NISUZUKQogCiBzdGF0aWMgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIGh0X3Bhcm1zID0gewogCS5uZWxlbV9oaW50ID0gR0ZTMl9HTF9IQVNIX1NJWkUgKiAzIC8gNCwKQEAgLTE3ODEsNyArMTc4MSwxMyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZWdpc3Rlcl9zaHJpbmtlcigmZ2xvY2tfc2hyaW5rZXIpOworCXJldCA9IHJlZ2lzdGVyX3Nocmlua2VyKCZnbG9ja19zaHJpbmtlcik7CisJaWYgKHJldCkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShnZnMyX2RlbGV0ZV93b3JrcXVldWUpOworCQlkZXN0cm95X3dvcmtxdWV1ZShnbG9ja193b3JrcXVldWUpOworCQlyaGFzaHRhYmxlX2Rlc3Ryb3koJmdsX2hhc2hfdGFibGUpOworCQlyZXR1cm4gcmV0OworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9pbm9kZS5jIGIvZnMvZ2ZzMi9pbm9kZS5jCmluZGV4IGU0ZGEwZWMuLmZiM2E4MTAgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5vZGUuYworKysgYi9mcy9nZnMyL2lub2RlLmMKQEAgLTE4Nyw2ICsxODcsMTAgQEAKIAkJfQogCiAJCWdmczJfc2V0X2lvcChpbm9kZSk7CisKKwkJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gMDsKKwkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisKIAkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL2lub2RlLmggYi9mcy9nZnMyL2lub2RlLmgKaW5kZXggNzcxMGRmZC4uYWFjZThjZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9pbm9kZS5oCisrKyBiL2ZzL2dmczIvaW5vZGUuaApAQCAtODUsNyArODUsNyBAQAogCXU2NCBzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogCWlmIChzaXplIDwgbWluc2l6ZSB8fCBzaXplID4gbWF4c2l6ZSkKIAkJZ290byBlcnI7Ci0JaWYgKHNpemUgJiAoKDEgPDwgaW5vZGUtPmlfYmxrYml0cykgLSAxKSkKKwlpZiAoc2l6ZSAmIChCSVQoaW5vZGUtPmlfYmxrYml0cykgLSAxKSkKIAkJZ290byBlcnI7CiAJcmV0dXJuIDA7CiBlcnI6CmRpZmYgLS1naXQgYS9mcy9nZnMyL21haW4uYyBiL2ZzL2dmczIvbWFpbi5jCmluZGV4IDc0ZmQwMTMuLjY3ZDFmYzQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbWFpbi5jCisrKyBiL2ZzL2dmczIvbWFpbi5jCkBAIC0xNDUsNyArMTQ1LDkgQEAKIAlpZiAoIWdmczJfcWFkYXRhX2NhY2hlcCkKIAkJZ290byBmYWlsOwogCi0JcmVnaXN0ZXJfc2hyaW5rZXIoJmdmczJfcWRfc2hyaW5rZXIpOworCWVycm9yID0gcmVnaXN0ZXJfc2hyaW5rZXIoJmdmczJfcWRfc2hyaW5rZXIpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsOwogCiAJZXJyb3IgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZnZnMyX2ZzX3R5cGUpOwogCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL2dmczIvbWV0YV9pby5jIGIvZnMvZ2ZzMi9tZXRhX2lvLmMKaW5kZXggOTUwYjhiZS4uMzczNjM5YTUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbWV0YV9pby5jCisrKyBiL2ZzL2dmczIvbWV0YV9pby5jCkBAIC0yMTYsMjMgKzIxNiwyNiBAQAogc3RhdGljIHZvaWQgZ2ZzMl9zdWJtaXRfYmhzKGludCBvcCwgaW50IG9wX2ZsYWdzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tdLAogCQkJICAgIGludCBudW0pCiB7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGJoc1swXTsKLQlzdHJ1Y3QgYmlvICpiaW87Ci0JaW50IGk7CisJd2hpbGUgKG51bSA+IDApIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9ICpiaHM7CisJCXN0cnVjdCBiaW8gKmJpbzsKIAotCWlmICghbnVtKQotCQlyZXR1cm47Ci0KLQliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG51bSk7Ci0JYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGJoLT5iX2Jsb2NrbnIgKiAoYmgtPmJfc2l6ZSA+PiA5KTsKLQliaW8tPmJpX2JkZXYgPSBiaC0+Yl9iZGV2OwotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQliaCA9IGJoc1tpXTsKLQkJYmlvX2FkZF9wYWdlKGJpbywgYmgtPmJfcGFnZSwgYmgtPmJfc2l6ZSwgYmhfb2Zmc2V0KGJoKSk7CisJCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbnVtKTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IGJoLT5iX2Jsb2NrbnIgKiAoYmgtPmJfc2l6ZSA+PiA5KTsKKwkJYmlvLT5iaV9iZGV2ID0gYmgtPmJfYmRldjsKKwkJd2hpbGUgKG51bSA+IDApIHsKKwkJCWJoID0gKmJoczsKKwkJCWlmICghYmlvX2FkZF9wYWdlKGJpbywgYmgtPmJfcGFnZSwgYmgtPmJfc2l6ZSwgYmhfb2Zmc2V0KGJoKSkpIHsKKwkJCQlCVUdfT04oYmlvLT5iaV9pdGVyLmJpX3NpemUgPT0gMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQliaHMrKzsKKwkJCW51bS0tOworCQl9CisJCWJpby0+YmlfZW5kX2lvID0gZ2ZzMl9tZXRhX3JlYWRfZW5kaW87CisJCWJpb19zZXRfb3BfYXR0cnMoYmlvLCBvcCwgb3BfZmxhZ3MpOworCQlzdWJtaXRfYmlvKGJpbyk7CiAJfQotCWJpby0+YmlfZW5kX2lvID0gZ2ZzMl9tZXRhX3JlYWRfZW5kaW87Ci0JYmlvX3NldF9vcF9hdHRycyhiaW8sIG9wLCBvcF9mbGFncyk7Ci0Jc3VibWl0X2JpbyhiaW8pOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggZWYxZTE4Mi4uZmY3MmFjNiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAlndC0+Z3RfcXVvdGFfc2NhbGVfbnVtID0gMTsKIAlndC0+Z3RfcXVvdGFfc2NhbGVfZGVuID0gMTsKIAlndC0+Z3RfbmV3X2ZpbGVzX2pkYXRhID0gMDsKLQlndC0+Z3RfbWF4X3JlYWRhaGVhZCA9IDEgPDwgMTg7CisJZ3QtPmd0X21heF9yZWFkYWhlYWQgPSBCSVQoMTgpOwogCWd0LT5ndF9jb21wbGFpbl9zZWNzID0gMTA7CiB9CiAKQEAgLTI4NCw3ICsyODQsNyBAQAogCiAJc2RwLT5zZF9mc2IyYmJfc2hpZnQgPSBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0IC0KIAkJCSAgICAgICBHRlMyX0JBU0lDX0JMT0NLX1NISUZUOwotCXNkcC0+c2RfZnNiMmJiID0gMSA8PCBzZHAtPnNkX2ZzYjJiYl9zaGlmdDsKKwlzZHAtPnNkX2ZzYjJiYiA9IEJJVChzZHAtPnNkX2ZzYjJiYl9zaGlmdCk7CiAJc2RwLT5zZF9kaXB0cnMgPSAoc2RwLT5zZF9zYi5zYl9ic2l6ZSAtCiAJCQkgIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpKSAvIHNpemVvZih1NjQpOwogCXNkcC0+c2RfaW5wdHJzID0gKHNkcC0+c2Rfc2Iuc2JfYnNpemUgLQpAQCAtMzAyLDcgKzMwMiw3IEBACiAKIAkvKiBDb21wdXRlIG1heGltdW0gcmVzZXJ2YXRpb24gcmVxdWlyZWQgdG8gYWRkIGEgZW50cnkgdG8gYSBkaXJlY3RvcnkgKi8KIAotCWhhc2hfYmxvY2tzID0gRElWX1JPVU5EX1VQKHNpemVvZih1NjQpICogKDEgPDwgR0ZTMl9ESVJfTUFYX0RFUFRIKSwKKwloYXNoX2Jsb2NrcyA9IERJVl9ST1VORF9VUChzaXplb2YodTY0KSAqIEJJVChHRlMyX0RJUl9NQVhfREVQVEgpLAogCQkJICAgICBzZHAtPnNkX2pic2l6ZSk7CiAKIAlpbmRfYmxvY2tzID0gMDsKQEAgLTEwODksNyArMTA4OSw3IEBACiAJc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdCA9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCXNkcC0+c2RfZnNiMmJiX3NoaWZ0ID0gc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdCAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZTMl9CQVNJQ19CTE9DS19TSElGVDsKLQlzZHAtPnNkX2ZzYjJiYiA9IDEgPDwgc2RwLT5zZF9mc2IyYmJfc2hpZnQ7CisJc2RwLT5zZF9mc2IyYmIgPSBCSVQoc2RwLT5zZF9mc2IyYmJfc2hpZnQpOwogCiAJc2RwLT5zZF90dW5lLmd0X2xvZ2Rfc2VjcyA9IHNkcC0+c2RfYXJncy5hcl9jb21taXQ7CiAJc2RwLT5zZF90dW5lLmd0X3F1b3RhX3F1YW50dW0gPSBzZHAtPnNkX2FyZ3MuYXJfcXVvdGFfcXVhbnR1bTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvcXVvdGEuYyBiL2ZzL2dmczIvcXVvdGEuYwppbmRleCA3NzkzMGNhLi44YWYyZGZhIDEwMDY0NAotLS0gYS9mcy9nZnMyL3F1b3RhLmMKKysrIGIvZnMvZ2ZzMi9xdW90YS5jCkBAIC03NSw3ICs3NSw3IEBACiAjaW5jbHVkZSAidXRpbC5oIgogCiAjZGVmaW5lIEdGUzJfUURfSEFTSF9TSElGVCAgICAgIDEyCi0jZGVmaW5lIEdGUzJfUURfSEFTSF9TSVpFICAgICAgICgxIDw8IEdGUzJfUURfSEFTSF9TSElGVCkKKyNkZWZpbmUgR0ZTMl9RRF9IQVNIX1NJWkUgICAgICAgQklUKEdGUzJfUURfSEFTSF9TSElGVCkKICNkZWZpbmUgR0ZTMl9RRF9IQVNIX01BU0sgICAgICAgKEdGUzJfUURfSEFTSF9TSVpFIC0gMSkKIAogLyogTG9jayBvcmRlcjogcWRfbG9jayAtPiBidWNrZXQgbG9jayAtPiBxZC0+bG9ja3JlZi5sb2NrIC0+IGxydSBsb2NrICovCkBAIC0zODQsNyArMzg0LDcgQEAKIAlibG9jayA9IHFkLT5xZF9zbG90IC8gc2RwLT5zZF9xY19wZXJfYmxvY2s7CiAJb2Zmc2V0ID0gcWQtPnFkX3Nsb3QgJSBzZHAtPnNkX3FjX3Blcl9ibG9jazsKIAotCWJoX21hcC5iX3NpemUgPSAxIDw8IGlwLT5pX2lub2RlLmlfYmxrYml0czsKKwliaF9tYXAuYl9zaXplID0gQklUKGlwLT5pX2lub2RlLmlfYmxrYml0cyk7CiAJZXJyb3IgPSBnZnMyX2Jsb2NrX21hcCgmaXAtPmlfaW5vZGUsIGJsb2NrLCAmYmhfbWFwLCAwKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvc3VwZXIuYyBiL2ZzL2dmczIvc3VwZXIuYwppbmRleCAzYTdlNjBiLi5lM2VlMzg3IDEwMDY0NAotLS0gYS9mcy9nZnMyL3N1cGVyLmMKKysrIGIvZnMvZ2ZzMi9zdXBlci5jCkBAIC0zNTksNyArMzU5LDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoamQtPmpkX2lub2RlKTsKIAl1NjQgc2l6ZSA9IGlfc2l6ZV9yZWFkKGpkLT5qZF9pbm9kZSk7CiAKLQlpZiAoZ2ZzMl9jaGVja19pbnRlcm5hbF9maWxlX3NpemUoamQtPmpkX2lub2RlLCA4IDw8IDIwLCAxIDw8IDMwKSkKKwlpZiAoZ2ZzMl9jaGVja19pbnRlcm5hbF9maWxlX3NpemUoamQtPmpkX2lub2RlLCA4IDw8IDIwLCBCSVQoMzApKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlqZC0+amRfYmxvY2tzID0gc2l6ZSA+PiBzZHAtPnNkX3NiLnNiX2JzaXplX3NoaWZ0OwpkaWZmIC0tZ2l0IGEvZnMvaW50ZXJuYWwuaCBiL2ZzL2ludGVybmFsLmgKaW5kZXggYmEwNzM3Ni4uODU5MTc4NiAxMDA2NDQKLS0tIGEvZnMvaW50ZXJuYWwuaAorKysgYi9mcy9pbnRlcm5hbC5oCkBAIC0xMiw2ICsxMiw3IEBACiBzdHJ1Y3Qgc3VwZXJfYmxvY2s7CiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZTsKIHN0cnVjdCBpb21hcDsKK3N0cnVjdCBpb21hcF9vcHM7CiBzdHJ1Y3QgbGludXhfYmlucHJtOwogc3RydWN0IHBhdGg7CiBzdHJ1Y3QgbW91bnQ7CkBAIC0xNjQsMyArMTY1LDEzIEBACiBleHRlcm4gaW50IGRvX3Zmc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLAogCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpOwogZXh0ZXJuIGxvbmcgdmZzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisKKy8qCisgKiBpb21hcCBzdXBwb3J0OgorICovCit0eXBlZGVmIGxvZmZfdCAoKmlvbWFwX2FjdG9yX3QpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIGxvZmZfdCBsZW4sCisJCXZvaWQgKmRhdGEsIHN0cnVjdCBpb21hcCAqaW9tYXApOworCitsb2ZmX3QgaW9tYXBfYXBwbHkoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgbG9mZl90IGxlbmd0aCwKKwkJdW5zaWduZWQgZmxhZ3MsIHN0cnVjdCBpb21hcF9vcHMgKm9wcywgdm9pZCAqZGF0YSwKKwkJaW9tYXBfYWN0b3JfdCBhY3Rvcik7CmRpZmYgLS1naXQgYS9mcy9pb2N0bC5jIGIvZnMvaW9jdGwuYwppbmRleCAwZjU2ZGViLi5jNDE1NjY4IDEwMDY0NAotLS0gYS9mcy9pb2N0bC5jCisrKyBiL2ZzL2lvY3RsLmMKQEAgLTU2OCw3ICs1NjgsNyBAQAogCXJldHVybiB0aGF3X3N1cGVyKHNiKTsKIH0KIAotc3RhdGljIGxvbmcgaW9jdGxfZmlsZV9kZWR1cGVfcmFuZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IGlvY3RsX2ZpbGVfZGVkdXBlX3JhbmdlKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCBmaWxlX2RlZHVwZV9yYW5nZSBfX3VzZXIgKmFyZ3AgPSBhcmc7CiAJc3RydWN0IGZpbGVfZGVkdXBlX3JhbmdlICpzYW1lID0gTlVMTDsKQEAgLTU4Miw2ICs1ODIsMTAgQEAKIAl9CiAKIAlzaXplID0gb2Zmc2V0b2Yoc3RydWN0IGZpbGVfZGVkdXBlX3JhbmdlIF9fdXNlciwgaW5mb1tjb3VudF0pOworCWlmIChzaXplID4gUEFHRV9TSVpFKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KIAogCXNhbWUgPSBtZW1kdXBfdXNlcihhcmdwLCBzaXplKTsKIAlpZiAoSVNfRVJSKHNhbWUpKSB7CmRpZmYgLS1naXQgYS9mcy9pb21hcC5jIGIvZnMvaW9tYXAuYwppbmRleCAwMzQyMjU0Li4wMTNkMWQzIDEwMDY0NAotLS0gYS9mcy9pb21hcC5jCisrKyBiL2ZzL2lvbWFwLmMKQEAgLTI3LDkgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kYXguaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi10eXBlZGVmIGxvZmZfdCAoKmlvbWFwX2FjdG9yX3QpKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIGxvZmZfdCBsZW4sCi0JCXZvaWQgKmRhdGEsIHN0cnVjdCBpb21hcCAqaW9tYXApOwotCiAvKgogICogRXhlY3V0ZSBhIGlvbWFwIHdyaXRlIG9uIGEgc2VnbWVudCBvZiB0aGUgbWFwcGluZyB0aGF0IHNwYW5zIGEKICAqIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgcGFnZXMgdGhhdCBoYXZlIGlkZW50aWNhbCBibG9jayBtYXBwaW5nIHN0YXRlLgpAQCAtNDEsNyArMzgsNyBAQAogICogcmVzb3VyY2VzIHRoZXkgcmVxdWlyZSBpbiB0aGUgaW9tYXBfYmVnaW4gY2FsbCwgYW5kIHJlbGVhc2UgdGhlbSBpbiB0aGUKICAqIGlvbWFwX2VuZCBjYWxsLgogICovCi1zdGF0aWMgbG9mZl90Citsb2ZmX3QKIGlvbWFwX2FwcGx5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBwb3MsIGxvZmZfdCBsZW5ndGgsIHVuc2lnbmVkIGZsYWdzLAogCQlzdHJ1Y3QgaW9tYXBfb3BzICpvcHMsIHZvaWQgKmRhdGEsIGlvbWFwX2FjdG9yX3QgYWN0b3IpCiB7CkBAIC0yNTIsNiArMjQ5LDg4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpb21hcF9maWxlX2J1ZmZlcmVkX3dyaXRlKTsKIAorc3RhdGljIHN0cnVjdCBwYWdlICoKK19faW9tYXBfcmVhZF9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIG9mZnNldCA+PiBQQUdFX1NISUZULCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKQorCQlyZXR1cm4gcGFnZTsKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQlwdXRfcGFnZShwYWdlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQorCXJldHVybiBwYWdlOworfQorCitzdGF0aWMgbG9mZl90Citpb21hcF9kaXJ0eV9hY3RvcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgcG9zLCBsb2ZmX3QgbGVuZ3RoLCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgaW9tYXAgKmlvbWFwKQoreworCWxvbmcgc3RhdHVzID0gMDsKKwlzc2l6ZV90IHdyaXR0ZW4gPSAwOworCisJZG8geworCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgKnJwYWdlOworCQl1bnNpZ25lZCBsb25nIG9mZnNldDsJLyogT2Zmc2V0IGludG8gcGFnZWNhY2hlIHBhZ2UgKi8KKwkJdW5zaWduZWQgbG9uZyBieXRlczsJLyogQnl0ZXMgdG8gd3JpdGUgdG8gcGFnZSAqLworCisJCW9mZnNldCA9IChwb3MgJiAoUEFHRV9TSVpFIC0gMSkpOworCQlieXRlcyA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIFBBR0VfU0laRSAtIG9mZnNldCwgbGVuZ3RoKTsKKworCQlycGFnZSA9IF9faW9tYXBfcmVhZF9wYWdlKGlub2RlLCBwb3MpOworCQlpZiAoSVNfRVJSKHJwYWdlKSkKKwkJCXJldHVybiBQVFJfRVJSKHJwYWdlKTsKKworCQlzdGF0dXMgPSBpb21hcF93cml0ZV9iZWdpbihpbm9kZSwgcG9zLCBieXRlcywKKwkJCQlBT1BfRkxBR19OT0ZTIHwgQU9QX0ZMQUdfVU5JTlRFUlJVUFRJQkxFLAorCQkJCSZwYWdlLCBpb21hcCk7CisJCXB1dF9wYWdlKHJwYWdlKTsKKwkJaWYgKHVubGlrZWx5KHN0YXR1cykpCisJCQlyZXR1cm4gc3RhdHVzOworCisJCVdBUk5fT05fT05DRSghUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKworCQlzdGF0dXMgPSBpb21hcF93cml0ZV9lbmQoaW5vZGUsIHBvcywgYnl0ZXMsIGJ5dGVzLCBwYWdlKTsKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyA8PSAwKSkgeworCQkJaWYgKFdBUk5fT05fT05DRShzdGF0dXMgPT0gMCkpCisJCQkJcmV0dXJuIC1FSU87CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJY29uZF9yZXNjaGVkKCk7CisKKwkJcG9zICs9IHN0YXR1czsKKwkJd3JpdHRlbiArPSBzdGF0dXM7CisJCWxlbmd0aCAtPSBzdGF0dXM7CisKKwkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZChpbm9kZS0+aV9tYXBwaW5nKTsKKwl9IHdoaWxlIChsZW5ndGgpOworCisJcmV0dXJuIHdyaXR0ZW47Cit9CisKK2ludAoraW9tYXBfZmlsZV9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgcG9zLCBsb2ZmX3QgbGVuLAorCQlzdHJ1Y3QgaW9tYXBfb3BzICpvcHMpCit7CisJbG9mZl90IHJldDsKKworCXdoaWxlIChsZW4pIHsKKwkJcmV0ID0gaW9tYXBfYXBwbHkoaW5vZGUsIHBvcywgbGVuLCBJT01BUF9XUklURSwgb3BzLCBOVUxMLAorCQkJCWlvbWFwX2RpcnR5X2FjdG9yKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJcmV0dXJuIHJldDsKKwkJcG9zICs9IHJldDsKKwkJbGVuIC09IHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlvbWFwX2ZpbGVfZGlydHkpOworCiBzdGF0aWMgaW50IGlvbWFwX3plcm8oc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgdW5zaWduZWQgb2Zmc2V0LAogCQl1bnNpZ25lZCBieXRlcywgc3RydWN0IGlvbWFwICppb21hcCkKIHsKQEAgLTQyOCw5ICs1MDcsMTQgQEAKIAkJYnJlYWs7CiAJfQogCisJaWYgKGlvbWFwLT5mbGFncyAmIElPTUFQX0ZfTUVSR0VEKQorCQlmbGFncyB8PSBGSUVNQVBfRVhURU5UX01FUkdFRDsKKwlpZiAoaW9tYXAtPmZsYWdzICYgSU9NQVBfRl9TSEFSRUQpCisJCWZsYWdzIHw9IEZJRU1BUF9FWFRFTlRfU0hBUkVEOworCiAJcmV0dXJuIGZpZW1hcF9maWxsX25leHRfZXh0ZW50KGZpLCBpb21hcC0+b2Zmc2V0LAogCQkJaW9tYXAtPmJsa25vICE9IElPTUFQX05VTExfQkxPQ0sgPyBpb21hcC0+Ymxrbm8gPDwgOTogMCwKLQkJCWlvbWFwLT5sZW5ndGgsIGZsYWdzIHwgRklFTUFQX0VYVEVOVF9NRVJHRUQpOworCQkJaW9tYXAtPmxlbmd0aCwgZmxhZ3MpOwogCiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2piZDIvam91cm5hbC5jIGIvZnMvamJkMi9qb3VybmFsLmMKaW5kZXggNDYyNjFhNi4uOTI3ZGE0OSAxMDA2NDQKLS0tIGEvZnMvamJkMi9qb3VybmFsLmMKKysrIGIvZnMvamJkMi9qb3VybmFsLmMKQEAgLTEwOTAsMTEgKzEwOTAsMTUgQEAKICAqIHZlcnkgZmV3IGZpZWxkcyB5ZXQ6IHRoYXQgaGFzIHRvIHdhaXQgdW50aWwgd2UgaGF2ZSBjcmVhdGVkIHRoZQogICogam91cm5hbCBzdHJ1Y3R1cmVzIGZyb20gZnJvbSBzY3JhdGNoLCBvciBsb2FkZWQgdGhlbSBmcm9tIGRpc2suICovCiAKLXN0YXRpYyBqb3VybmFsX3QgKiBqb3VybmFsX2luaXRfY29tbW9uICh2b2lkKQorc3RhdGljIGpvdXJuYWxfdCAqam91cm5hbF9pbml0X2NvbW1vbihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJc3RydWN0IGJsb2NrX2RldmljZSAqZnNfZGV2LAorCQkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LCBpbnQgbGVuLCBpbnQgYmxvY2tzaXplKQogewogCXN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgamJkMl90cmFuc19jb21taXRfa2V5OwogCWpvdXJuYWxfdCAqam91cm5hbDsKIAlpbnQgZXJyOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IG47CiAKIAlqb3VybmFsID0ga3phbGxvYyhzaXplb2YoKmpvdXJuYWwpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWpvdXJuYWwpCkBAIC0xMTMxLDYgKzExMzUsMzIgQEAKIAlsb2NrZGVwX2luaXRfbWFwKCZqb3VybmFsLT5qX3RyYW5zX2NvbW1pdF9tYXAsICJqYmQyX2hhbmRsZSIsCiAJCQkgJmpiZDJfdHJhbnNfY29tbWl0X2tleSwgMCk7CiAKKwkvKiBqb3VybmFsIGRlc2NyaXB0b3IgY2FuIHN0b3JlIHVwIHRvIG4gYmxvY2tzIC1ienp6ICovCisJam91cm5hbC0+al9ibG9ja3NpemUgPSBibG9ja3NpemU7CisJam91cm5hbC0+al9kZXYgPSBiZGV2OworCWpvdXJuYWwtPmpfZnNfZGV2ID0gZnNfZGV2OworCWpvdXJuYWwtPmpfYmxrX29mZnNldCA9IHN0YXJ0OworCWpvdXJuYWwtPmpfbWF4bGVuID0gbGVuOworCW4gPSBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSAvIHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KTsKKwlqb3VybmFsLT5qX3didWZzaXplID0gbjsKKwlqb3VybmFsLT5qX3didWYgPSBrbWFsbG9jX2FycmF5KG4sIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksCisJCQkJCUdGUF9LRVJORUwpOworCWlmICgham91cm5hbC0+al93YnVmKSB7CisJCWtmcmVlKGpvdXJuYWwpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwliaCA9IGdldGJsa191bm1vdmFibGUoam91cm5hbC0+al9kZXYsIHN0YXJ0LCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJaWYgKCFiaCkgeworCQlwcl9lcnIoIiVzOiBDYW5ub3QgZ2V0IGJ1ZmZlciBmb3Igam91cm5hbCBzdXBlcmJsb2NrXG4iLAorCQkJX19mdW5jX18pOworCQlrZnJlZShqb3VybmFsLT5qX3didWYpOworCQlrZnJlZShqb3VybmFsKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWpvdXJuYWwtPmpfc2JfYnVmZmVyID0gYmg7CisJam91cm5hbC0+al9zdXBlcmJsb2NrID0gKGpvdXJuYWxfc3VwZXJibG9ja190ICopYmgtPmJfZGF0YTsKKwogCXJldHVybiBqb3VybmFsOwogfQogCkBAIC0xMTU3LDUxICsxMTg3LDIxIEBACiAgKiAgcmFuZ2Ugb2YgYmxvY2tzIG9uIGFuIGFyYml0cmFyeSBibG9jayBkZXZpY2UuCiAgKgogICovCi1qb3VybmFsX3QgKiBqYmQyX2pvdXJuYWxfaW5pdF9kZXYoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKK2pvdXJuYWxfdCAqamJkMl9qb3VybmFsX2luaXRfZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpmc19kZXYsCiAJCQl1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsIGludCBsZW4sIGludCBibG9ja3NpemUpCiB7Ci0Jam91cm5hbF90ICpqb3VybmFsID0gam91cm5hbF9pbml0X2NvbW1vbigpOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Ci0JaW50IG47CisJam91cm5hbF90ICpqb3VybmFsOwogCisJam91cm5hbCA9IGpvdXJuYWxfaW5pdF9jb21tb24oYmRldiwgZnNfZGV2LCBzdGFydCwgbGVuLCBibG9ja3NpemUpOwogCWlmICgham91cm5hbCkKIAkJcmV0dXJuIE5VTEw7CiAKLQkvKiBqb3VybmFsIGRlc2NyaXB0b3IgY2FuIHN0b3JlIHVwIHRvIG4gYmxvY2tzIC1ienp6ICovCi0Jam91cm5hbC0+al9ibG9ja3NpemUgPSBibG9ja3NpemU7Ci0Jam91cm5hbC0+al9kZXYgPSBiZGV2OwotCWpvdXJuYWwtPmpfZnNfZGV2ID0gZnNfZGV2OwotCWpvdXJuYWwtPmpfYmxrX29mZnNldCA9IHN0YXJ0OwotCWpvdXJuYWwtPmpfbWF4bGVuID0gbGVuOwogCWJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2LCBqb3VybmFsLT5qX2Rldm5hbWUpOwogCXN0cnJlcGxhY2Uoam91cm5hbC0+al9kZXZuYW1lLCAnLycsICchJyk7CiAJamJkMl9zdGF0c19wcm9jX2luaXQoam91cm5hbCk7Ci0JbiA9IGpvdXJuYWwtPmpfYmxvY2tzaXplIC8gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpOwotCWpvdXJuYWwtPmpfd2J1ZnNpemUgPSBuOwotCWpvdXJuYWwtPmpfd2J1ZiA9IGttYWxsb2MobiAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQqKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFqb3VybmFsLT5qX3didWYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FuJ3QgYWxsb2NhdGUgYmhzIGZvciBjb21taXQgdGhyZWFkXG4iLAotCQkJX19mdW5jX18pOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCi0JYmggPSBfX2dldGJsayhqb3VybmFsLT5qX2Rldiwgc3RhcnQsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKLQlpZiAoIWJoKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIiVzOiBDYW5ub3QgZ2V0IGJ1ZmZlciBmb3Igam91cm5hbCBzdXBlcmJsb2NrXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCWpvdXJuYWwtPmpfc2JfYnVmZmVyID0gYmg7Ci0Jam91cm5hbC0+al9zdXBlcmJsb2NrID0gKGpvdXJuYWxfc3VwZXJibG9ja190ICopYmgtPmJfZGF0YTsKIAogCXJldHVybiBqb3VybmFsOwotb3V0X2VycjoKLQlrZnJlZShqb3VybmFsLT5qX3didWYpOwotCWpiZDJfc3RhdHNfcHJvY19leGl0KGpvdXJuYWwpOwotCWtmcmVlKGpvdXJuYWwpOwotCXJldHVybiBOVUxMOwogfQogCiAvKioKQEAgLTEyMTIsNjcgKzEyMTIsMzYgQEAKICAqIHRoZSBqb3VybmFsLiAgVGhlIGlub2RlIG11c3QgZXhpc3QgYWxyZWFkeSwgbXVzdCBzdXBwb3J0IGJtYXAoKSBhbmQKICAqIG11c3QgaGF2ZSBhbGwgZGF0YSBibG9ja3MgcHJlYWxsb2NhdGVkLgogICovCi1qb3VybmFsX3QgKiBqYmQyX2pvdXJuYWxfaW5pdF9pbm9kZSAoc3RydWN0IGlub2RlICppbm9kZSkKK2pvdXJuYWxfdCAqamJkMl9qb3VybmFsX2luaXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCWpvdXJuYWxfdCAqam91cm5hbCA9IGpvdXJuYWxfaW5pdF9jb21tb24oKTsKKwlqb3VybmFsX3QgKmpvdXJuYWw7CiAJY2hhciAqcDsKLQlpbnQgZXJyOwotCWludCBuOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBibG9ja25yOwogCisJYmxvY2tuciA9IGJtYXAoaW5vZGUsIDApOworCWlmICghYmxvY2tucikgeworCQlwcl9lcnIoIiVzOiBDYW5ub3QgbG9jYXRlIGpvdXJuYWwgc3VwZXJibG9ja1xuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJamJkX2RlYnVnKDEsICJKQkQyOiBpbm9kZSAlcy8lbGQsIHNpemUgJWxsZCwgYml0cyAlZCwgYmxrc2l6ZSAlbGRcbiIsCisJCSAgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgKGxvbmcgbG9uZykgaW5vZGUtPmlfc2l6ZSwKKwkJICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cywgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKworCWpvdXJuYWwgPSBqb3VybmFsX2luaXRfY29tbW9uKGlub2RlLT5pX3NiLT5zX2JkZXYsIGlub2RlLT5pX3NiLT5zX2JkZXYsCisJCQlibG9ja25yLCBpbm9kZS0+aV9zaXplID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzLAorCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKIAlpZiAoIWpvdXJuYWwpCiAJCXJldHVybiBOVUxMOwogCi0Jam91cm5hbC0+al9kZXYgPSBqb3VybmFsLT5qX2ZzX2RldiA9IGlub2RlLT5pX3NiLT5zX2JkZXY7CiAJam91cm5hbC0+al9pbm9kZSA9IGlub2RlOwogCWJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2LCBqb3VybmFsLT5qX2Rldm5hbWUpOwogCXAgPSBzdHJyZXBsYWNlKGpvdXJuYWwtPmpfZGV2bmFtZSwgJy8nLCAnIScpOwogCXNwcmludGYocCwgIi0lbHUiLCBqb3VybmFsLT5qX2lub2RlLT5pX2lubyk7Ci0JamJkX2RlYnVnKDEsCi0JCSAgImpvdXJuYWwgJXA6IGlub2RlICVzLyVsZCwgc2l6ZSAlTGQsIGJpdHMgJWQsIGJsa3NpemUgJWxkXG4iLAotCQkgIGpvdXJuYWwsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sCi0JCSAgKGxvbmcgbG9uZykgaW5vZGUtPmlfc2l6ZSwKLQkJICBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cywgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKLQotCWpvdXJuYWwtPmpfbWF4bGVuID0gaW5vZGUtPmlfc2l6ZSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKLQlqb3VybmFsLT5qX2Jsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAlqYmQyX3N0YXRzX3Byb2NfaW5pdChqb3VybmFsKTsKIAotCS8qIGpvdXJuYWwgZGVzY3JpcHRvciBjYW4gc3RvcmUgdXAgdG8gbiBibG9ja3MgLWJ6enogKi8KLQluID0gam91cm5hbC0+al9ibG9ja3NpemUgLyBzaXplb2Yoam91cm5hbF9ibG9ja190YWdfdCk7Ci0Jam91cm5hbC0+al93YnVmc2l6ZSA9IG47Ci0Jam91cm5hbC0+al93YnVmID0ga21hbGxvYyhuICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCopLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWpvdXJuYWwtPmpfd2J1ZikgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBhbGxvY2F0ZSBiaHMgZm9yIGNvbW1pdCB0aHJlYWRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0X2VycjsKLQl9Ci0KLQllcnIgPSBqYmQyX2pvdXJuYWxfYm1hcChqb3VybmFsLCAwLCAmYmxvY2tucik7Ci0JLyogSWYgdGhhdCBmYWlsZWQsIGdpdmUgdXAgKi8KLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbm5vdCBsb2NhdGUgam91cm5hbCBzdXBlcmJsb2NrXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCi0JYmggPSBnZXRibGtfdW5tb3ZhYmxlKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7Ci0JaWYgKCFiaCkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICIlczogQ2Fubm90IGdldCBidWZmZXIgZm9yIGpvdXJuYWwgc3VwZXJibG9ja1xuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJZ290byBvdXRfZXJyOwotCX0KLQlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IGJoOwotCWpvdXJuYWwtPmpfc3VwZXJibG9jayA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKWJoLT5iX2RhdGE7Ci0KIAlyZXR1cm4gam91cm5hbDsKLW91dF9lcnI6Ci0Ja2ZyZWUoam91cm5hbC0+al93YnVmKTsKLQlqYmQyX3N0YXRzX3Byb2NfZXhpdChqb3VybmFsKTsKLQlrZnJlZShqb3VybmFsKTsKLQlyZXR1cm4gTlVMTDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2piZDIvdHJhbnNhY3Rpb24uYyBiL2ZzL2piZDIvdHJhbnNhY3Rpb24uYwppbmRleCBiNWJjM2UyLi4zZDgyNDZhIDEwMDY0NAotLS0gYS9mcy9qYmQyL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvamJkMi90cmFuc2FjdGlvbi5jCkBAIC0xNTksNiArMTU5LDcgQEAKIAlyZWFkX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAlpZiAobmVlZF90b19zdGFydCkKIAkJamJkMl9sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIHRpZCk7CisJamJkMl9taWdodF93YWl0X2Zvcl9jb21taXQoam91cm5hbCk7CiAJc2NoZWR1bGUoKTsKIAlmaW5pc2hfd2FpdCgmam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCwgJndhaXQpOwogfQpAQCAtMTgyLDggKzE4Myw2IEBACiAJaW50IG5lZWRlZDsKIAlpbnQgdG90YWwgPSBibG9ja3MgKyByc3ZfYmxvY2tzOwogCi0JamJkMl9taWdodF93YWl0X2Zvcl9jb21taXQoam91cm5hbCk7Ci0KIAkvKgogCSAqIElmIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIGxvY2tlZCBkb3duIGZvciBjb21taXQsIHdhaXQKIAkgKiBmb3IgdGhlIGxvY2sgdG8gYmUgcmVsZWFzZWQuCkBAIC0yMTQsNiArMjEzLDcgQEAKIAkJaWYgKGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3Jlc2VydmVkX2NyZWRpdHMpICsgdG90YWwgPgogCQkgICAgam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycykgewogCQkJcmVhZF91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCQlqYmQyX21pZ2h0X3dhaXRfZm9yX2NvbW1pdChqb3VybmFsKTsKIAkJCXdhaXRfZXZlbnQoam91cm5hbC0+al93YWl0X3Jlc2VydmVkLAogCQkJCSAgIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3Jlc2VydmVkX2NyZWRpdHMpICsgdG90YWwgPD0KIAkJCQkgICBqb3VybmFsLT5qX21heF90cmFuc2FjdGlvbl9idWZmZXJzKTsKQEAgLTIzOCw2ICsyMzgsNyBAQAogCWlmIChqYmQyX2xvZ19zcGFjZV9sZWZ0KGpvdXJuYWwpIDwgamJkMl9zcGFjZV9uZWVkZWQoam91cm5hbCkpIHsKIAkJYXRvbWljX3N1Yih0b3RhbCwgJnQtPnRfb3V0c3RhbmRpbmdfY3JlZGl0cyk7CiAJCXJlYWRfdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlqYmQyX21pZ2h0X3dhaXRfZm9yX2NvbW1pdChqb3VybmFsKTsKIAkJd3JpdGVfbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKIAkJaWYgKGpiZDJfbG9nX3NwYWNlX2xlZnQoam91cm5hbCkgPCBqYmQyX3NwYWNlX25lZWRlZChqb3VybmFsKSkKIAkJCV9famJkMl9sb2dfd2FpdF9mb3Jfc3BhY2Uoam91cm5hbCk7CkBAIC0yNTUsNiArMjU2LDcgQEAKIAkJc3ViX3Jlc2VydmVkX2NyZWRpdHMoam91cm5hbCwgcnN2X2Jsb2Nrcyk7CiAJCWF0b21pY19zdWIodG90YWwsICZ0LT50X291dHN0YW5kaW5nX2NyZWRpdHMpOwogCQlyZWFkX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJamJkMl9taWdodF93YWl0X2Zvcl9jb21taXQoam91cm5hbCk7CiAJCXdhaXRfZXZlbnQoam91cm5hbC0+al93YWl0X3Jlc2VydmVkLAogCQkJIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX3Jlc2VydmVkX2NyZWRpdHMpICsgcnN2X2Jsb2NrcwogCQkJIDw9IGpvdXJuYWwtPmpfbWF4X3RyYW5zYWN0aW9uX2J1ZmZlcnMgLyAyKTsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfdHhubWdyLmMgYi9mcy9qZnMvamZzX3R4bm1nci5jCmluZGV4IDJlNTg5NzguLjRkOTczNTI0IDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX3R4bm1nci5jCisrKyBiL2ZzL2pmcy9qZnNfdHhubWdyLmMKQEAgLTI4OTMsOCArMjg5Myw3IEBACiAJICogb24gYW5vbl9saXN0Mi4gIExldCdzIGNoZWNrLgogCSAqLwogCWlmICghbGlzdF9lbXB0eSgmVHhBbmNob3IuYW5vbl9saXN0MikpIHsKLQkJbGlzdF9zcGxpY2UoJlR4QW5jaG9yLmFub25fbGlzdDIsICZUeEFuY2hvci5hbm9uX2xpc3QpOwotCQlJTklUX0xJU1RfSEVBRCgmVHhBbmNob3IuYW5vbl9saXN0Mik7CisJCWxpc3Rfc3BsaWNlX2luaXQoJlR4QW5jaG9yLmFub25fbGlzdDIsICZUeEFuY2hvci5hbm9uX2xpc3QpOwogCQlnb3RvIHJlc3RhcnQ7CiAJfQogCVRYTl9VTkxPQ0soKTsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9yZXNpemUuYyBiL2ZzL2pmcy9yZXNpemUuYwppbmRleCA5MGIzYmMyLi5iZDliNjQxIDEwMDY0NAotLS0gYS9mcy9qZnMvcmVzaXplLmMKKysrIGIvZnMvamZzL3Jlc2l6ZS5jCkBAIC0zNzksOCArMzc5LDE0IEBACiAJICogY2FjaGVkIGluIG1ldGEtZGF0YSBjYWNoZSwgYW5kIG5vdCB3cml0dGVuIG91dAogCSAqIGJ5IHR4Q29tbWl0KCk7CiAJICovCi0JZmlsZW1hcF9mZGF0YXdhaXQoaXBibWFwLT5pX21hcHBpbmcpOwotCWZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoaXBibWFwLT5pX21hcHBpbmcpOworCXJjID0gZmlsZW1hcF9mZGF0YXdhaXQoaXBibWFwLT5pX21hcHBpbmcpOworCWlmIChyYykKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlyYyA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoaXBibWFwLT5pX21hcHBpbmcpOworCWlmIChyYykKKwkJZ290byBlcnJvcl9vdXQ7CisKIAlkaVdyaXRlU3BlY2lhbChpcGJtYXAsIDApOwogCiAJbmV3UGFnZSA9IG5QYWdlczsJLyogZmlyc3QgbmV3IHBhZ2UgbnVtYmVyICovCmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvZmlsZS5jIGIvZnMva2VybmZzL2ZpbGUuYwppbmRleCBlMTU3NDAwLi4yYmNiODZlIDEwMDY0NAotLS0gYS9mcy9rZXJuZnMvZmlsZS5jCisrKyBiL2ZzL2tlcm5mcy9maWxlLmMKQEAgLTg0MCwyMSArODQwLDM1IEBACiAJbXV0ZXhfbG9jaygma2VybmZzX211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaW5mbywgJmtlcm5mc19yb290KGtuKS0+c3VwZXJzLCBub2RlKSB7CisJCXN0cnVjdCBrZXJuZnNfbm9kZSAqcGFyZW50OwogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAKKwkJLyoKKwkJICogV2Ugd2FudCBmc25vdGlmeV9tb2RpZnkoKSBvbiBAa24gYnV0IGFzIHRoZQorCQkgKiBtb2RpZmljYXRpb25zIGFyZW4ndCBvcmlnaW5hdGluZyBmcm9tIHVzZXJsYW5kIGRvbid0CisJCSAqIGhhdmUgdGhlIG1hdGNoaW5nIEBmaWxlIGF2YWlsYWJsZS4gIExvb2sgdXAgdGhlIGlub2RlcworCQkgKiBhbmQgZ2VuZXJhdGUgdGhlIGV2ZW50cyBtYW51YWxseS4KKwkJICovCiAJCWlub2RlID0gaWxvb2t1cChpbmZvLT5zYiwga24tPmlubyk7CiAJCWlmICghaW5vZGUpCiAJCQljb250aW51ZTsKIAotCQlkZW50cnkgPSBkX2ZpbmRfYW55X2FsaWFzKGlub2RlKTsKLQkJaWYgKGRlbnRyeSkgewotCQkJZnNub3RpZnlfcGFyZW50KE5VTEwsIGRlbnRyeSwgRlNfTU9ESUZZKTsKLQkJCWZzbm90aWZ5KGlub2RlLCBGU19NT0RJRlksIGlub2RlLCBGU05PVElGWV9FVkVOVF9JTk9ERSwKLQkJCQkgTlVMTCwgMCk7Ci0JCQlkcHV0KGRlbnRyeSk7CisJCXBhcmVudCA9IGtlcm5mc19nZXRfcGFyZW50KGtuKTsKKwkJaWYgKHBhcmVudCkgeworCQkJc3RydWN0IGlub2RlICpwX2lub2RlOworCisJCQlwX2lub2RlID0gaWxvb2t1cChpbmZvLT5zYiwgcGFyZW50LT5pbm8pOworCQkJaWYgKHBfaW5vZGUpIHsKKwkJCQlmc25vdGlmeShwX2lub2RlLCBGU19NT0RJRlkgfCBGU19FVkVOVF9PTl9DSElMRCwKKwkJCQkJIGlub2RlLCBGU05PVElGWV9FVkVOVF9JTk9ERSwga24tPm5hbWUsIDApOworCQkJCWlwdXQocF9pbm9kZSk7CisJCQl9CisKKwkJCWtlcm5mc19wdXQocGFyZW50KTsKIAkJfQogCisJCWZzbm90aWZ5KGlub2RlLCBGU19NT0RJRlksIGlub2RlLCBGU05PVElGWV9FVkVOVF9JTk9ERSwKKwkJCSBrbi0+bmFtZSwgMCk7CiAJCWlwdXQoaW5vZGUpOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvbG9ja3MuYyBiL2ZzL2xvY2tzLmMKaW5kZXggZWUxYjE1Zi4uOTBlYzY3MSAxMDA2NDQKLS0tIGEvZnMvbG9ja3MuYworKysgYi9mcy9sb2Nrcy5jCkBAIC0xMjcsNyArMTI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGdsb2NrLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9maWxlbG9jay5oPgpAQCAtMTU4LDEyICsxNTcsMTggQEAKIAogLyoKICAqIFRoZSBnbG9iYWwgZmlsZV9sb2NrX2xpc3QgaXMgb25seSB1c2VkIGZvciBkaXNwbGF5aW5nIC9wcm9jL2xvY2tzLCBzbyB3ZQotICoga2VlcCBhIGxpc3Qgb24gZWFjaCBDUFUsIHdpdGggZWFjaCBsaXN0IHByb3RlY3RlZCBieSBpdHMgb3duIHNwaW5sb2NrIHZpYQotICogdGhlIGZpbGVfbG9ja19sZ2xvY2suIE5vdGUgdGhhdCBhbHRlcmF0aW9ucyB0byB0aGUgbGlzdCBhbHNvIHJlcXVpcmUgdGhhdAotICogdGhlIHJlbGV2YW50IGZsY19sb2NrIGlzIGhlbGQuCisgKiBrZWVwIGEgbGlzdCBvbiBlYWNoIENQVSwgd2l0aCBlYWNoIGxpc3QgcHJvdGVjdGVkIGJ5IGl0cyBvd24gc3BpbmxvY2suCisgKiBHbG9iYWwgc2VyaWFsaXphdGlvbiBpcyBkb25lIHVzaW5nIGZpbGVfcndzZW0uCisgKgorICogTm90ZSB0aGF0IGFsdGVyYXRpb25zIHRvIHRoZSBsaXN0IGFsc28gcmVxdWlyZSB0aGF0IHRoZSByZWxldmFudCBmbGNfbG9jayBpcworICogaGVsZC4KICAqLwotREVGSU5FX1NUQVRJQ19MR0xPQ0soZmlsZV9sb2NrX2xnbG9jayk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGhsaXN0X2hlYWQsIGZpbGVfbG9ja19saXN0KTsKK3N0cnVjdCBmaWxlX2xvY2tfbGlzdF9zdHJ1Y3QgeworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IGhsaXN0X2hlYWQJaGxpc3Q7Cit9Oworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBmaWxlX2xvY2tfbGlzdF9zdHJ1Y3QsIGZpbGVfbG9ja19saXN0KTsKK0RFRklORV9TVEFUSUNfUEVSQ1BVX1JXU0VNKGZpbGVfcndzZW0pOwogCiAvKgogICogVGhlIGJsb2NrZWRfaGFzaCBpcyB1c2VkIHRvIGZpbmQgUE9TSVggbG9jayBsb29wcyBmb3IgZGVhZGxvY2sgZGV0ZWN0aW9uLgpAQCAtNTg3LDE1ICs1OTIsMjMgQEAKIC8qIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGZsY19sb2NrIGhlbGQhICovCiBzdGF0aWMgdm9pZCBsb2Nrc19pbnNlcnRfZ2xvYmFsX2xvY2tzKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQogewotCWxnX2xvY2FsX2xvY2soJmZpbGVfbG9ja19sZ2xvY2spOworCXN0cnVjdCBmaWxlX2xvY2tfbGlzdF9zdHJ1Y3QgKmZsbCA9IHRoaXNfY3B1X3B0cigmZmlsZV9sb2NrX2xpc3QpOworCisJcGVyY3B1X3J3c2VtX2Fzc2VydF9oZWxkKCZmaWxlX3J3c2VtKTsKKworCXNwaW5fbG9jaygmZmxsLT5sb2NrKTsKIAlmbC0+ZmxfbGlua19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JaGxpc3RfYWRkX2hlYWQoJmZsLT5mbF9saW5rLCB0aGlzX2NwdV9wdHIoJmZpbGVfbG9ja19saXN0KSk7Ci0JbGdfbG9jYWxfdW5sb2NrKCZmaWxlX2xvY2tfbGdsb2NrKTsKKwlobGlzdF9hZGRfaGVhZCgmZmwtPmZsX2xpbmssICZmbGwtPmhsaXN0KTsKKwlzcGluX3VubG9jaygmZmxsLT5sb2NrKTsKIH0KIAogLyogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgZmxjX2xvY2sgaGVsZCEgKi8KIHN0YXRpYyB2b2lkIGxvY2tzX2RlbGV0ZV9nbG9iYWxfbG9ja3Moc3RydWN0IGZpbGVfbG9jayAqZmwpCiB7CisJc3RydWN0IGZpbGVfbG9ja19saXN0X3N0cnVjdCAqZmxsOworCisJcGVyY3B1X3J3c2VtX2Fzc2VydF9oZWxkKCZmaWxlX3J3c2VtKTsKKwogCS8qCiAJICogQXZvaWQgdGFraW5nIGxvY2sgaWYgYWxyZWFkeSB1bmhhc2hlZC4gVGhpcyBpcyBzYWZlIHNpbmNlIHRoaXMgY2hlY2sKIAkgKiBpcyBkb25lIHdoaWxlIGhvbGRpbmcgdGhlIGZsY19sb2NrLCBhbmQgbmV3IGluc2VydGlvbnMgaW50byB0aGUgbGlzdApAQCAtNjAzLDkgKzYxNiwxMSBAQAogCSAqLwogCWlmIChobGlzdF91bmhhc2hlZCgmZmwtPmZsX2xpbmspKQogCQlyZXR1cm47Ci0JbGdfbG9jYWxfbG9ja19jcHUoJmZpbGVfbG9ja19sZ2xvY2ssIGZsLT5mbF9saW5rX2NwdSk7CisKKwlmbGwgPSBwZXJfY3B1X3B0cigmZmlsZV9sb2NrX2xpc3QsIGZsLT5mbF9saW5rX2NwdSk7CisJc3Bpbl9sb2NrKCZmbGwtPmxvY2spOwogCWhsaXN0X2RlbF9pbml0KCZmbC0+ZmxfbGluayk7Ci0JbGdfbG9jYWxfdW5sb2NrX2NwdSgmZmlsZV9sb2NrX2xnbG9jaywgZmwtPmZsX2xpbmtfY3B1KTsKKwlzcGluX3VubG9jaygmZmxsLT5sb2NrKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcKQEAgLTkxNSw2ICs5MzAsNyBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJcGVyY3B1X2Rvd25fcmVhZF9wcmVlbXB0X2Rpc2FibGUoJmZpbGVfcndzZW0pOwogCXNwaW5fbG9jaygmY3R4LT5mbGNfbG9jayk7CiAJaWYgKHJlcXVlc3QtPmZsX2ZsYWdzICYgRkxfQUNDRVNTKQogCQlnb3RvIGZpbmRfY29uZmxpY3Q7CkBAIC05NTUsNiArOTcxLDcgQEAKIAogb3V0OgogCXNwaW5fdW5sb2NrKCZjdHgtPmZsY19sb2NrKTsKKwlwZXJjcHVfdXBfcmVhZF9wcmVlbXB0X2VuYWJsZSgmZmlsZV9yd3NlbSk7CiAJaWYgKG5ld19mbCkKIAkJbG9ja3NfZnJlZV9sb2NrKG5ld19mbCk7CiAJbG9ja3NfZGlzcG9zZV9saXN0KCZkaXNwb3NlKTsKQEAgLTk5MSw2ICsxMDA4LDcgQEAKIAkJbmV3X2ZsMiA9IGxvY2tzX2FsbG9jX2xvY2soKTsKIAl9CiAKKwlwZXJjcHVfZG93bl9yZWFkX3ByZWVtcHRfZGlzYWJsZSgmZmlsZV9yd3NlbSk7CiAJc3Bpbl9sb2NrKCZjdHgtPmZsY19sb2NrKTsKIAkvKgogCSAqIE5ldyBsb2NrIHJlcXVlc3QuIFdhbGsgYWxsIFBPU0lYIGxvY2tzIGFuZCBsb29rIGZvciBjb25mbGljdHMuIElmCkBAIC0xMTYyLDYgKzExODAsNyBAQAogCX0KICBvdXQ6CiAJc3Bpbl91bmxvY2soJmN0eC0+ZmxjX2xvY2spOworCXBlcmNwdV91cF9yZWFkX3ByZWVtcHRfZW5hYmxlKCZmaWxlX3J3c2VtKTsKIAkvKgogCSAqIEZyZWUgYW55IHVudXNlZCBsb2Nrcy4KIAkgKi8KQEAgLTE0MzYsNiArMTQ1NSw3IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKKwlwZXJjcHVfZG93bl9yZWFkX3ByZWVtcHRfZGlzYWJsZSgmZmlsZV9yd3NlbSk7CiAJc3Bpbl9sb2NrKCZjdHgtPmZsY19sb2NrKTsKIAogCXRpbWVfb3V0X2xlYXNlcyhpbm9kZSwgJmRpc3Bvc2UpOwpAQCAtMTQ4Nyw5ICsxNTA3LDEzIEBACiAJbG9ja3NfaW5zZXJ0X2Jsb2NrKGZsLCBuZXdfZmwpOwogCXRyYWNlX2JyZWFrX2xlYXNlX2Jsb2NrKGlub2RlLCBuZXdfZmwpOwogCXNwaW5fdW5sb2NrKCZjdHgtPmZsY19sb2NrKTsKKwlwZXJjcHVfdXBfcmVhZF9wcmVlbXB0X2VuYWJsZSgmZmlsZV9yd3NlbSk7CisKIAlsb2Nrc19kaXNwb3NlX2xpc3QoJmRpc3Bvc2UpOwogCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQobmV3X2ZsLT5mbF93YWl0LAogCQkJCQkJIW5ld19mbC0+ZmxfbmV4dCwgYnJlYWtfdGltZSk7CisKKwlwZXJjcHVfZG93bl9yZWFkX3ByZWVtcHRfZGlzYWJsZSgmZmlsZV9yd3NlbSk7CiAJc3Bpbl9sb2NrKCZjdHgtPmZsY19sb2NrKTsKIAl0cmFjZV9icmVha19sZWFzZV91bmJsb2NrKGlub2RlLCBuZXdfZmwpOwogCWxvY2tzX2RlbGV0ZV9ibG9jayhuZXdfZmwpOwpAQCAtMTUwNiw2ICsxNTMwLDcgQEAKIAl9CiBvdXQ6CiAJc3Bpbl91bmxvY2soJmN0eC0+ZmxjX2xvY2spOworCXBlcmNwdV91cF9yZWFkX3ByZWVtcHRfZW5hYmxlKCZmaWxlX3J3c2VtKTsKIAlsb2Nrc19kaXNwb3NlX2xpc3QoJmRpc3Bvc2UpOwogCWxvY2tzX2ZyZWVfbG9jayhuZXdfZmwpOwogCXJldHVybiBlcnJvcjsKQEAgLTE2NjAsNiArMTY4NSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXBlcmNwdV9kb3duX3JlYWRfcHJlZW1wdF9kaXNhYmxlKCZmaWxlX3J3c2VtKTsKIAlzcGluX2xvY2soJmN0eC0+ZmxjX2xvY2spOwogCXRpbWVfb3V0X2xlYXNlcyhpbm9kZSwgJmRpc3Bvc2UpOwogCWVycm9yID0gY2hlY2tfY29uZmxpY3Rpbmdfb3BlbihkZW50cnksIGFyZywgbGVhc2UtPmZsX2ZsYWdzKTsKQEAgLTE3MzAsNiArMTc1Niw3IEBACiAJCWxlYXNlLT5mbF9sbW9wcy0+bG1fc2V0dXAobGVhc2UsIHByaXYpOwogb3V0OgogCXNwaW5fdW5sb2NrKCZjdHgtPmZsY19sb2NrKTsKKwlwZXJjcHVfdXBfcmVhZF9wcmVlbXB0X2VuYWJsZSgmZmlsZV9yd3NlbSk7CiAJbG9ja3NfZGlzcG9zZV9saXN0KCZkaXNwb3NlKTsKIAlpZiAoaXNfZGVsZWcpCiAJCWlub2RlX3VubG9jayhpbm9kZSk7CkBAIC0xNzUyLDYgKzE3NzksNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCisJcGVyY3B1X2Rvd25fcmVhZF9wcmVlbXB0X2Rpc2FibGUoJmZpbGVfcndzZW0pOwogCXNwaW5fbG9jaygmY3R4LT5mbGNfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmbCwgJmN0eC0+ZmxjX2xlYXNlLCBmbF9saXN0KSB7CiAJCWlmIChmbC0+ZmxfZmlsZSA9PSBmaWxwICYmCkBAIC0xNzY0LDYgKzE3OTIsNyBAQAogCWlmICh2aWN0aW0pCiAJCWVycm9yID0gZmwtPmZsX2xtb3BzLT5sbV9jaGFuZ2UodmljdGltLCBGX1VOTENLLCAmZGlzcG9zZSk7CiAJc3Bpbl91bmxvY2soJmN0eC0+ZmxjX2xvY2spOworCXBlcmNwdV91cF9yZWFkX3ByZWVtcHRfZW5hYmxlKCZmaWxlX3J3c2VtKTsKIAlsb2Nrc19kaXNwb3NlX2xpc3QoJmRpc3Bvc2UpOwogCXJldHVybiBlcnJvcjsKIH0KQEAgLTI1NzQsOSArMjYwMywyMCBAQAogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOwogCXVuc2lnbmVkIGludCBmbF9waWQ7CiAKLQlpZiAoZmwtPmZsX25zcGlkKQotCQlmbF9waWQgPSBwaWRfdm5yKGZsLT5mbF9uc3BpZCk7Ci0JZWxzZQorCWlmIChmbC0+ZmxfbnNwaWQpIHsKKwkJc3RydWN0IHBpZF9uYW1lc3BhY2UgKnByb2NfcGlkbnMgPSBmaWxlX2lub2RlKGYtPmZpbGUpLT5pX3NiLT5zX2ZzX2luZm87CisKKwkJLyogRG9uJ3QgbGV0IGZsX3BpZCBjaGFuZ2UgYmFzZWQgb24gd2hvIGlzIHJlYWRpbmcgdGhlIGZpbGUgKi8KKwkJZmxfcGlkID0gcGlkX25yX25zKGZsLT5mbF9uc3BpZCwgcHJvY19waWRucyk7CisKKwkJLyoKKwkJICogSWYgdGhlcmUgaXNuJ3QgYSBmbF9waWQgZG9uJ3QgZGlzcGxheSB3aG8gaXMgd2FpdGluZyBvbgorCQkgKiB0aGUgbG9jayBpZiB3ZSBhcmUgY2FsbGVkIGZyb20gbG9ja3Nfc2hvdywgb3IgaWYgd2UgYXJlCisJCSAqIGNhbGxlZCBmcm9tIF9fc2hvd19mZF9pbmZvIC0gc2tpcCBsb2NrIGVudGlyZWx5CisJCSAqLworCQlpZiAoZmxfcGlkID09IDApCisJCQlyZXR1cm47CisJfSBlbHNlCiAJCWZsX3BpZCA9IGZsLT5mbF9waWQ7CiAKIAlpZiAoZmwtPmZsX2ZpbGUgIT0gTlVMTCkKQEAgLTI2NDgsOSArMjY4OCwxMyBAQAogewogCXN0cnVjdCBsb2Nrc19pdGVyYXRvciAqaXRlciA9IGYtPnByaXZhdGU7CiAJc3RydWN0IGZpbGVfbG9jayAqZmwsICpiZmw7CisJc3RydWN0IHBpZF9uYW1lc3BhY2UgKnByb2NfcGlkbnMgPSBmaWxlX2lub2RlKGYtPmZpbGUpLT5pX3NiLT5zX2ZzX2luZm87CiAKIAlmbCA9IGhsaXN0X2VudHJ5KHYsIHN0cnVjdCBmaWxlX2xvY2ssIGZsX2xpbmspOwogCisJaWYgKGZsLT5mbF9uc3BpZCAmJiAhcGlkX25yX25zKGZsLT5mbF9uc3BpZCwgcHJvY19waWRucykpCisJCXJldHVybiAwOworCiAJbG9ja19nZXRfc3RhdHVzKGYsIGZsLCBpdGVyLT5saV9wb3MsICIiKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYmZsLCAmZmwtPmZsX2Jsb2NrLCBmbF9ibG9jaykKQEAgLTI3MDMsOSArMjc0Nyw5IEBACiAJc3RydWN0IGxvY2tzX2l0ZXJhdG9yICppdGVyID0gZi0+cHJpdmF0ZTsKIAogCWl0ZXItPmxpX3BvcyA9ICpwb3MgKyAxOwotCWxnX2dsb2JhbF9sb2NrKCZmaWxlX2xvY2tfbGdsb2NrKTsKKwlwZXJjcHVfZG93bl93cml0ZSgmZmlsZV9yd3NlbSk7CiAJc3Bpbl9sb2NrKCZibG9ja2VkX2xvY2tfbG9jayk7Ci0JcmV0dXJuIHNlcV9obGlzdF9zdGFydF9wZXJjcHUoJmZpbGVfbG9ja19saXN0LCAmaXRlci0+bGlfY3B1LCAqcG9zKTsKKwlyZXR1cm4gc2VxX2hsaXN0X3N0YXJ0X3BlcmNwdSgmZmlsZV9sb2NrX2xpc3QuaGxpc3QsICZpdGVyLT5saV9jcHUsICpwb3MpOwogfQogCiBzdGF0aWMgdm9pZCAqbG9ja3NfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQpAQCAtMjcxMywxNCArMjc1NywxNCBAQAogCXN0cnVjdCBsb2Nrc19pdGVyYXRvciAqaXRlciA9IGYtPnByaXZhdGU7CiAKIAkrK2l0ZXItPmxpX3BvczsKLQlyZXR1cm4gc2VxX2hsaXN0X25leHRfcGVyY3B1KHYsICZmaWxlX2xvY2tfbGlzdCwgJml0ZXItPmxpX2NwdSwgcG9zKTsKKwlyZXR1cm4gc2VxX2hsaXN0X25leHRfcGVyY3B1KHYsICZmaWxlX2xvY2tfbGlzdC5obGlzdCwgJml0ZXItPmxpX2NwdSwgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgbG9ja3Nfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpCiAJX19yZWxlYXNlcygmYmxvY2tlZF9sb2NrX2xvY2spCiB7CiAJc3Bpbl91bmxvY2soJmJsb2NrZWRfbG9ja19sb2NrKTsKLQlsZ19nbG9iYWxfdW5sb2NrKCZmaWxlX2xvY2tfbGdsb2NrKTsKKwlwZXJjcHVfdXBfd3JpdGUoJmZpbGVfcndzZW0pOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxvY2tzX3NlcV9vcGVyYXRpb25zID0gewpAQCAtMjc2MSwxMCArMjgwNSwxMyBAQAogCWZpbGVsb2NrX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImZpbGVfbG9ja19jYWNoZSIsCiAJCQlzaXplb2Yoc3RydWN0IGZpbGVfbG9jayksIDAsIFNMQUJfUEFOSUMsIE5VTEwpOwogCi0JbGdfbG9ja19pbml0KCZmaWxlX2xvY2tfbGdsb2NrLCAiZmlsZV9sb2NrX2xnbG9jayIpOwogCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCi0JCUlOSVRfSExJU1RfSEVBRChwZXJfY3B1X3B0cigmZmlsZV9sb2NrX2xpc3QsIGkpKTsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlzdHJ1Y3QgZmlsZV9sb2NrX2xpc3Rfc3RydWN0ICpmbGwgPSBwZXJfY3B1X3B0cigmZmlsZV9sb2NrX2xpc3QsIGkpOworCisJCXNwaW5fbG9ja19pbml0KCZmbGwtPmxvY2spOworCQlJTklUX0hMSVNUX0hFQUQoJmZsbC0+aGxpc3QpOworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZnMvbWJjYWNoZS5jIGIvZnMvbWJjYWNoZS5jCmluZGV4IGVjY2RhM2EuLmM1YmQxOWYgMTAwNjQ0Ci0tLSBhL2ZzL21iY2FjaGUuYworKysgYi9mcy9tYmNhY2hlLmMKQEAgLTM2Niw3ICszNjYsMTEgQEAKIAljYWNoZS0+Y19zaHJpbmsuY291bnRfb2JqZWN0cyA9IG1iX2NhY2hlX2NvdW50OwogCWNhY2hlLT5jX3Nocmluay5zY2FuX29iamVjdHMgPSBtYl9jYWNoZV9zY2FuOwogCWNhY2hlLT5jX3Nocmluay5zZWVrcyA9IERFRkFVTFRfU0VFS1M7Ci0JcmVnaXN0ZXJfc2hyaW5rZXIoJmNhY2hlLT5jX3Nocmluayk7CisJaWYgKHJlZ2lzdGVyX3Nocmlua2VyKCZjYWNoZS0+Y19zaHJpbmspKSB7CisJCWtmcmVlKGNhY2hlLT5jX2hhc2gpOworCQlrZnJlZShjYWNoZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CiAKIAlJTklUX1dPUksoJmNhY2hlLT5jX3Nocmlua193b3JrLCBtYl9jYWNoZV9zaHJpbmtfd29ya2VyKTsKIApkaWZmIC0tZ2l0IGEvZnMvbW91bnQuaCBiL2ZzL21vdW50LmgKaW5kZXggMTRkYjA1ZC4uZDJlMjVkNyAxMDA2NDQKLS0tIGEvZnMvbW91bnQuaAorKysgYi9mcy9tb3VudC5oCkBAIC0xMCw5ICsxMCwxMiBAQAogCXN0cnVjdCBtb3VudCAqCXJvb3Q7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCXN0cnVjdCB1c2VyX25hbWVzcGFjZQkqdXNlcl9uczsKKwlzdHJ1Y3QgdWNvdW50cwkJKnVjb3VudHM7CiAJdTY0CQkJc2VxOwkvKiBTZXF1ZW5jZSBudW1iZXIgdG8gcHJldmVudCBsb29wcyAqLwogCXdhaXRfcXVldWVfaGVhZF90IHBvbGw7CiAJdTY0IGV2ZW50OworCXVuc2lnbmVkIGludAkJbW91bnRzOyAvKiAjIG9mIG1vdW50cyBpbiB0aGUgbmFtZXNwYWNlICovCisJdW5zaWduZWQgaW50CQlwZW5kaW5nX21vdW50czsKIH07CiAKIHN0cnVjdCBtbnRfcGNwIHsKZGlmZiAtLWdpdCBhL2ZzL25hbWVzcGFjZS5jIGIvZnMvbmFtZXNwYWNlLmMKaW5kZXggN2JiMmNkYS4uZGIxYjVhMyAxMDA2NDQKLS0tIGEvZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmFtZXNwYWNlLmMKQEAgLTI3LDYgKzI3LDkgQEAKICNpbmNsdWRlICJwbm9kZS5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKKy8qIE1heGltdW0gbnVtYmVyIG9mIG1vdW50cyBpbiBhIG1vdW50IG5hbWVzcGFjZSAqLwordW5zaWduZWQgaW50IHN5c2N0bF9tb3VudF9tYXggX19yZWFkX21vc3RseSA9IDEwMDAwMDsKKwogc3RhdGljIHVuc2lnbmVkIGludCBtX2hhc2hfbWFzayBfX3JlYWRfbW9zdGx5Owogc3RhdGljIHVuc2lnbmVkIGludCBtX2hhc2hfc2hpZnQgX19yZWFkX21vc3RseTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbXBfaGFzaF9tYXNrIF9fcmVhZF9tb3N0bHk7CkBAIC04OTksNiArOTAyLDkgQEAKIAogCWxpc3Rfc3BsaWNlKCZoZWFkLCBuLT5saXN0LnByZXYpOwogCisJbi0+bW91bnRzICs9IG4tPnBlbmRpbmdfbW91bnRzOworCW4tPnBlbmRpbmdfbW91bnRzID0gMDsKKwogCWF0dGFjaF9zaGFkb3dlZChtbnQsIHBhcmVudCwgc2hhZG93cyk7CiAJdG91Y2hfbW50X25hbWVzcGFjZShuKTsKIH0KQEAgLTE0MTksMTEgKzE0MjUsMTYgQEAKIAkJcHJvcGFnYXRlX3Vtb3VudCgmdG1wX2xpc3QpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0bXBfbGlzdCkpIHsKKwkJc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zOwogCQlib29sIGRpc2Nvbm5lY3Q7CiAJCXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0bXBfbGlzdCwgc3RydWN0IG1vdW50LCBtbnRfbGlzdCk7CiAJCWxpc3RfZGVsX2luaXQoJnAtPm1udF9leHBpcmUpOwogCQlsaXN0X2RlbF9pbml0KCZwLT5tbnRfbGlzdCk7Ci0JCV9fdG91Y2hfbW50X25hbWVzcGFjZShwLT5tbnRfbnMpOworCQlucyA9IHAtPm1udF9uczsKKwkJaWYgKG5zKSB7CisJCQlucy0+bW91bnRzLS07CisJCQlfX3RvdWNoX21udF9uYW1lc3BhY2UobnMpOworCQl9CiAJCXAtPm1udF9ucyA9IE5VTEw7CiAJCWlmIChob3cgJiBVTU9VTlRfU1lOQykKIAkJCXAtPm1udC5tbnRfZmxhZ3MgfD0gTU5UX1NZTkNfVU1PVU5UOwpAQCAtMTg0MCw2ICsxODUxLDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBjb3VudF9tb3VudHMoc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgbW91bnQgKm1udCkKK3sKKwl1bnNpZ25lZCBpbnQgbWF4ID0gUkVBRF9PTkNFKHN5c2N0bF9tb3VudF9tYXgpOworCXVuc2lnbmVkIGludCBtb3VudHMgPSAwLCBvbGQsIHBlbmRpbmcsIHN1bTsKKwlzdHJ1Y3QgbW91bnQgKnA7CisKKwlmb3IgKHAgPSBtbnQ7IHA7IHAgPSBuZXh0X21udChwLCBtbnQpKQorCQltb3VudHMrKzsKKworCW9sZCA9IG5zLT5tb3VudHM7CisJcGVuZGluZyA9IG5zLT5wZW5kaW5nX21vdW50czsKKwlzdW0gPSBvbGQgKyBwZW5kaW5nOworCWlmICgob2xkID4gc3VtKSB8fAorCSAgICAocGVuZGluZyA+IHN1bSkgfHwKKwkgICAgKG1heCA8IHN1bSkgfHwKKwkgICAgKG1vdW50cyA+IChtYXggLSBzdW0pKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlucy0+cGVuZGluZ19tb3VudHMgPSBwZW5kaW5nICsgbW91bnRzOworCXJldHVybiAwOworfQorCiAvKgogICogIEBzb3VyY2VfbW50IDogbW91bnQgdHJlZSB0byBiZSBhdHRhY2hlZAogICogIEBuZCAgICAgICAgIDogcGxhY2UgdGhlIG1vdW50IHRyZWUgQHNvdXJjZV9tbnQgaXMgYXR0YWNoZWQKQEAgLTE5MDksMTAgKzE5NDIsMTggQEAKIAkJCXN0cnVjdCBwYXRoICpwYXJlbnRfcGF0aCkKIHsKIAlITElTVF9IRUFEKHRyZWVfbGlzdCk7CisJc3RydWN0IG1udF9uYW1lc3BhY2UgKm5zID0gZGVzdF9tbnQtPm1udF9uczsKIAlzdHJ1Y3QgbW91bnQgKmNoaWxkLCAqcDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKIAlpbnQgZXJyOwogCisJLyogSXMgdGhlcmUgc3BhY2UgdG8gYWRkIHRoZXNlIG1vdW50cyB0byB0aGUgbW91bnQgbmFtZXNwYWNlPyAqLworCWlmICghcGFyZW50X3BhdGgpIHsKKwkJZXJyID0gY291bnRfbW91bnRzKG5zLCBzb3VyY2VfbW50KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKwogCWlmIChJU19NTlRfU0hBUkVEKGRlc3RfbW50KSkgewogCQllcnIgPSBpbnZlbnRfZ3JvdXBfaWRzKHNvdXJjZV9tbnQsIHRydWUpOwogCQlpZiAoZXJyKQpAQCAtMTk0OSwxMSArMTk5MCwxMyBAQAogIG91dF9jbGVhbnVwX2lkczoKIAl3aGlsZSAoIWhsaXN0X2VtcHR5KCZ0cmVlX2xpc3QpKSB7CiAJCWNoaWxkID0gaGxpc3RfZW50cnkodHJlZV9saXN0LmZpcnN0LCBzdHJ1Y3QgbW91bnQsIG1udF9oYXNoKTsKKwkJY2hpbGQtPm1udF9wYXJlbnQtPm1udF9ucy0+cGVuZGluZ19tb3VudHMgPSAwOwogCQl1bW91bnRfdHJlZShjaGlsZCwgVU1PVU5UX1NZTkMpOwogCX0KIAl1bmxvY2tfbW91bnRfaGFzaCgpOwogCWNsZWFudXBfZ3JvdXBfaWRzKHNvdXJjZV9tbnQsIE5VTEwpOwogIG91dDoKKwlucy0+cGVuZGluZ19tb3VudHMgPSAwOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTI3MTksOSArMjc2MiwyMCBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgdWNvdW50cyAqaW5jX21udF9uYW1lc3BhY2VzKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7CisJcmV0dXJuIGluY191Y291bnQobnMsIGN1cnJlbnRfZXVpZCgpLCBVQ09VTlRfTU5UX05BTUVTUEFDRVMpOworfQorCitzdGF0aWMgdm9pZCBkZWNfbW50X25hbWVzcGFjZXMoc3RydWN0IHVjb3VudHMgKnVjb3VudHMpCit7CisJZGVjX3Vjb3VudCh1Y291bnRzLCBVQ09VTlRfTU5UX05BTUVTUEFDRVMpOworfQorCiBzdGF0aWMgdm9pZCBmcmVlX21udF9ucyhzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnMpCiB7CiAJbnNfZnJlZV9pbnVtKCZucy0+bnMpOworCWRlY19tbnRfbmFtZXNwYWNlcyhucy0+dWNvdW50cyk7CiAJcHV0X3VzZXJfbnMobnMtPnVzZXJfbnMpOwogCWtmcmVlKG5zKTsKIH0KQEAgLTI3MzgsMTQgKzI3OTIsMjIgQEAKIHN0YXRpYyBzdHJ1Y3QgbW50X25hbWVzcGFjZSAqYWxsb2NfbW50X25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucykKIHsKIAlzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbmV3X25zOworCXN0cnVjdCB1Y291bnRzICp1Y291bnRzOwogCWludCByZXQ7CiAKKwl1Y291bnRzID0gaW5jX21udF9uYW1lc3BhY2VzKHVzZXJfbnMpOworCWlmICghdWNvdW50cykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisKIAluZXdfbnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbW50X25hbWVzcGFjZSksIEdGUF9LRVJORUwpOwotCWlmICghbmV3X25zKQorCWlmICghbmV3X25zKSB7CisJCWRlY19tbnRfbmFtZXNwYWNlcyh1Y291bnRzKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQogCXJldCA9IG5zX2FsbG9jX2ludW0oJm5ld19ucy0+bnMpOwogCWlmIChyZXQpIHsKIAkJa2ZyZWUobmV3X25zKTsKKwkJZGVjX21udF9uYW1lc3BhY2VzKHVjb3VudHMpOwogCQlyZXR1cm4gRVJSX1BUUihyZXQpOwogCX0KIAluZXdfbnMtPm5zLm9wcyA9ICZtbnRuc19vcGVyYXRpb25zOwpAQCAtMjc1Niw2ICsyODE4LDkgQEAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZuZXdfbnMtPnBvbGwpOwogCW5ld19ucy0+ZXZlbnQgPSAwOwogCW5ld19ucy0+dXNlcl9ucyA9IGdldF91c2VyX25zKHVzZXJfbnMpOworCW5ld19ucy0+dWNvdW50cyA9IHVjb3VudHM7CisJbmV3X25zLT5tb3VudHMgPSAwOworCW5ld19ucy0+cGVuZGluZ19tb3VudHMgPSAwOwogCXJldHVybiBuZXdfbnM7CiB9CiAKQEAgLTI4MDUsNiArMjg3MCw3IEBACiAJcSA9IG5ldzsKIAl3aGlsZSAocCkgewogCQlxLT5tbnRfbnMgPSBuZXdfbnM7CisJCW5ld19ucy0+bW91bnRzKys7CiAJCWlmIChuZXdfZnMpIHsKIAkJCWlmICgmcC0+bW50ID09IG5ld19mcy0+cm9vdC5tbnQpIHsKIAkJCQluZXdfZnMtPnJvb3QubW50ID0gbW50Z2V0KCZxLT5tbnQpOwpAQCAtMjg0Myw2ICsyOTA5LDcgQEAKIAkJc3RydWN0IG1vdW50ICptbnQgPSByZWFsX21vdW50KG0pOwogCQltbnQtPm1udF9ucyA9IG5ld19uczsKIAkJbmV3X25zLT5yb290ID0gbW50OworCQluZXdfbnMtPm1vdW50cysrOwogCQlsaXN0X2FkZCgmbW50LT5tbnRfbGlzdCwgJm5ld19ucy0+bGlzdCk7CiAJfSBlbHNlIHsKIAkJbW50cHV0KG0pOwpAQCAtMzM0OCwxMCArMzQxNSwxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHVzZXJfbmFtZXNwYWNlICptbnRuc19vd25lcihzdHJ1Y3QgbnNfY29tbW9uICpucykKK3sKKwlyZXR1cm4gdG9fbW50X25zKG5zKS0+dXNlcl9uczsKK30KKwogY29uc3Qgc3RydWN0IHByb2NfbnNfb3BlcmF0aW9ucyBtbnRuc19vcGVyYXRpb25zID0gewogCS5uYW1lCQk9ICJtbnQiLAogCS50eXBlCQk9IENMT05FX05FV05TLAogCS5nZXQJCT0gbW50bnNfZ2V0LAogCS5wdXQJCT0gbW50bnNfcHV0LAogCS5pbnN0YWxsCT0gbW50bnNfaW5zdGFsbCwKKwkub3duZXIJCT0gbW50bnNfb3duZXIsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmMgYi9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuYwppbmRleCBmNTVhNGU3Li4yMTc4NDc2IDEwMDY0NAotLS0gYS9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuYworKysgYi9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuYwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJCQlQQUdFX1NJWkUgLSAxKSAmIChsb2ZmX3QpUEFHRV9NQVNLOwogCiAJCWV4dF90cmVlX21hcmtfd3JpdHRlbihibCwgc3RhcnQgPj4gU0VDVE9SX1NISUZULAotCQkJCQkoZW5kIC0gc3RhcnQpID4+IFNFQ1RPUl9TSElGVCk7CisJCQkJCShlbmQgLSBzdGFydCkgPj4gU0VDVE9SX1NISUZULCBlbmQpOwogCX0KIAogCXBuZnNfbGRfd3JpdGVfZG9uZShoZHIpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmggYi9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaAppbmRleCAxOGU2ZmQwLi5lZmMwMDdmIDEwMDY0NAotLS0gYS9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaAorKysgYi9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaApAQCAtMTQxLDYgKzE0MSw3IEBACiAJc3RydWN0IHJiX3Jvb3QJCWJsX2V4dF9ybzsKIAlzcGlubG9ja190CQlibF9leHRfbG9jazsgICAvKiBQcm90ZWN0cyBsaXN0IG1hbmlwdWxhdGlvbiAqLwogCWJvb2wJCQlibF9zY3NpX2xheW91dDsKKwl1NjQJCQlibF9sd2I7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqCkBAIC0xODIsNyArMTgzLDcgQEAKIGludCBleHRfdHJlZV9yZW1vdmUoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwgYm9vbCBydywgc2VjdG9yX3Qgc3RhcnQsCiAJCXNlY3Rvcl90IGVuZCk7CiBpbnQgZXh0X3RyZWVfbWFya193cml0dGVuKHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwsIHNlY3Rvcl90IHN0YXJ0LAotCQlzZWN0b3JfdCBsZW4pOworCQlzZWN0b3JfdCBsZW4sIHU2NCBsd2IpOwogYm9vbCBleHRfdHJlZV9sb29rdXAoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwgc2VjdG9yX3QgaXNlY3QsCiAJCXN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqcmV0LCBib29sIHJ3KTsKIGludCBleHRfdHJlZV9wcmVwYXJlX2NvbW1pdChzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfYXJncyAqYXJnKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9ibG9ja2xheW91dC9leHRlbnRfdHJlZS5jIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2V4dGVudF90cmVlLmMKaW5kZXggOTkyYmNiMS4uYzg1ZmJmZCAxMDA2NDQKLS0tIGEvZnMvbmZzL2Jsb2NrbGF5b3V0L2V4dGVudF90cmVlLmMKKysrIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2V4dGVudF90cmVlLmMKQEAgLTQwMiw3ICs0MDIsNyBAQAogCiBpbnQKIGV4dF90cmVlX21hcmtfd3JpdHRlbihzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLCBzZWN0b3JfdCBzdGFydCwKLQkJc2VjdG9yX3QgbGVuKQorCQlzZWN0b3JfdCBsZW4sIHU2NCBsd2IpCiB7CiAJc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmYmwtPmJsX2V4dF9ydzsKIAlzZWN0b3JfdCBlbmQgPSBzdGFydCArIGxlbjsKQEAgLTQ3MSw2ICs0NzEsOCBAQAogCQl9CiAJfQogb3V0OgorCWlmIChibC0+YmxfbHdiIDwgbHdiKQorCQlibC0+YmxfbHdiID0gbHdiOwogCXNwaW5fdW5sb2NrKCZibC0+YmxfZXh0X2xvY2spOwogCiAJX19leHRfcHV0X2RldmljZWlkcygmdG1wKTsKQEAgLTUxOCw3ICs1MjAsNyBAQAogfQogCiBzdGF0aWMgaW50IGV4dF90cmVlX2VuY29kZV9jb21taXQoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwgX19iZTMyICpwLAotCQlzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCAqY291bnQpCisJCXNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90ICpjb3VudCwgX191NjQgKmxhc3RieXRlKQogewogCXN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmU7CiAJaW50IHJldCA9IDA7CkBAIC01NDIsNiArNTQ0LDggQEAKIAkJCXAgPSBlbmNvZGVfYmxvY2tfZXh0ZW50KGJlLCBwKTsKIAkJYmUtPmJlX3RhZyA9IEVYVEVOVF9DT01NSVRUSU5HOwogCX0KKwkqbGFzdGJ5dGUgPSBibC0+YmxfbHdiIC0gMTsKKwlibC0+YmxfbHdiID0gMDsKIAlzcGluX3VubG9jaygmYmwtPmJsX2V4dF9sb2NrKTsKIAogCXJldHVybiByZXQ7CkBAIC01NjQsNyArNTY4LDcgQEAKIAlhcmctPmxheW91dHVwZGF0ZV9wYWdlcyA9ICZhcmctPmxheW91dHVwZGF0ZV9wYWdlOwogCiByZXRyeToKLQlyZXQgPSBleHRfdHJlZV9lbmNvZGVfY29tbWl0KGJsLCBzdGFydF9wICsgMSwgYnVmZmVyX3NpemUsICZjb3VudCk7CisJcmV0ID0gZXh0X3RyZWVfZW5jb2RlX2NvbW1pdChibCwgc3RhcnRfcCArIDEsIGJ1ZmZlcl9zaXplLCAmY291bnQsICZhcmctPmxhc3RieXRld3JpdHRlbik7CiAJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJZXh0X3RyZWVfZnJlZV9jb21taXRkYXRhKGFyZywgYnVmZmVyX3NpemUpOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvY2FsbGJhY2suYyBiL2ZzL25mcy9jYWxsYmFjay5jCmluZGV4IGE3ZjJlNmUuLjUyYTI4MzEgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jYWxsYmFjay5jCisrKyBiL2ZzL25mcy9jYWxsYmFjay5jCkBAIC0yNzUsNiArMjc1LDcgQEAKIGVycl9zb2NrczoKIAlzdmNfcnBjYl9jbGVhbnVwKHNlcnYsIG5ldCk7CiBlcnJfYmluZDoKKwlubi0+Y2JfdXNlcnNbbWlub3J2ZXJzaW9uXS0tOwogCWRwcmludGsoIk5GUzogQ291bGRuJ3QgY3JlYXRlIGNhbGxiYWNrIHNvY2tldDogZXJyID0gJWQ7ICIKIAkJCSJuZXQgPSAlcFxuIiwgcmV0LCBuZXQpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jIGIvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYwppbmRleCBjOTJhNzVlLi5mOTUzZWY2IDEwMDY0NAotLS0gYS9mcy9uZnMvY2FsbGJhY2tfcHJvYy5jCisrKyBiL2ZzL25mcy9jYWxsYmFja19wcm9jLmMKQEAgLTQ1NCwxMSArNDU0LDggQEAKIAkJCQkoKHUzMiAqKSZyY2xpc3QtPnJjbF9zZXNzaW9uaWQuZGF0YSlbM10sCiAJCQkJcmVmLT5yY19zZXF1ZW5jZWlkLCByZWYtPnJjX3Nsb3RpZCk7CiAKLQkJCXNwaW5fbG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKLQkJCXN0YXR1cyA9ICh0ZXN0X2JpdChyZWYtPnJjX3Nsb3RpZCwgdGJsLT51c2VkX3Nsb3RzKSAmJgotCQkJCSAgdGJsLT5zbG90c1tyZWYtPnJjX3Nsb3RpZF0uc2VxX25yID09Ci0JCQkJCXJlZi0+cmNfc2VxdWVuY2VpZCk7Ci0JCQlzcGluX3VubG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKKwkJCXN0YXR1cyA9IG5mczRfc2xvdF93YWl0X29uX3NlcWlkKHRibCwgcmVmLT5yY19zbG90aWQsCisJCQkJCXJlZi0+cmNfc2VxdWVuY2VpZCwgSFogPj4gMSkgPCAwOwogCQkJaWYgKHN0YXR1cykKIAkJCQlnb3RvIG91dDsKIAkJfQpAQCAtNDg3LDcgKzQ4NCw2IEBACiAJCWdvdG8gb3V0OwogCiAJdGJsID0gJmNscC0+Y2xfc2Vzc2lvbi0+YmNfc2xvdF90YWJsZTsKLQlzbG90ID0gdGJsLT5zbG90cyArIGFyZ3MtPmNzYV9zbG90aWQ7CiAKIAkvKiBTZXQgdXAgcmVzIGJlZm9yZSBncmFiYmluZyB0aGUgc3BpbmxvY2sgKi8KIAltZW1jcHkoJnJlcy0+Y3NyX3Nlc3Npb25pZCwgJmFyZ3MtPmNzYV9zZXNzaW9uaWQsCmRpZmYgLS1naXQgYS9mcy9uZnMvY2xpZW50LmMgYi9mcy9uZnMvY2xpZW50LmMKaW5kZXggMDAzZWJjZS4uMWUxMDY3OCAxMDA2NDQKLS0tIGEvZnMvbmZzL2NsaWVudC5jCisrKyBiL2ZzL25mcy9jbGllbnQuYwpAQCAtNDI2LDcgKzQyNiw3IEBACiAgKiBJbml0aWFsaXNlIHRoZSB0aW1lb3V0IHZhbHVlcyBmb3IgYSBjb25uZWN0aW9uCiAgKi8KIHZvaWQgbmZzX2luaXRfdGltZW91dF92YWx1ZXMoc3RydWN0IHJwY190aW1lb3V0ICp0bywgaW50IHByb3RvLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgdGltZW8sIHVuc2lnbmVkIGludCByZXRyYW5zKQorCQkJCSAgICBpbnQgdGltZW8sIGludCByZXRyYW5zKQogewogCXRvLT50b19pbml0dmFsID0gdGltZW8gKiBIWiAvIDEwOwogCXRvLT50b19yZXRyaWVzID0gcmV0cmFuczsKQEAgLTQzNCw5ICs0MzQsOSBAQAogCXN3aXRjaCAocHJvdG8pIHsKIAljYXNlIFhQUlRfVFJBTlNQT1JUX1RDUDoKIAljYXNlIFhQUlRfVFJBTlNQT1JUX1JETUE6Ci0JCWlmICh0by0+dG9fcmV0cmllcyA9PSAwKQorCQlpZiAocmV0cmFucyA9PSBORlNfVU5TUEVDX1JFVFJBTlMpCiAJCQl0by0+dG9fcmV0cmllcyA9IE5GU19ERUZfVENQX1JFVFJBTlM7Ci0JCWlmICh0by0+dG9faW5pdHZhbCA9PSAwKQorCQlpZiAodGltZW8gPT0gTkZTX1VOU1BFQ19USU1FTyB8fCB0by0+dG9fcmV0cmllcyA9PSAwKQogCQkJdG8tPnRvX2luaXR2YWwgPSBORlNfREVGX1RDUF9USU1FTyAqIEhaIC8gMTA7CiAJCWlmICh0by0+dG9faW5pdHZhbCA+IE5GU19NQVhfVENQX1RJTUVPVVQpCiAJCQl0by0+dG9faW5pdHZhbCA9IE5GU19NQVhfVENQX1RJTUVPVVQ7CkBAIC00NDksOSArNDQ5LDkgQEAKIAkJdG8tPnRvX2V4cG9uZW50aWFsID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBYUFJUX1RSQU5TUE9SVF9VRFA6Ci0JCWlmICh0by0+dG9fcmV0cmllcyA9PSAwKQorCQlpZiAocmV0cmFucyA9PSBORlNfVU5TUEVDX1JFVFJBTlMpCiAJCQl0by0+dG9fcmV0cmllcyA9IE5GU19ERUZfVURQX1JFVFJBTlM7Ci0JCWlmICghdG8tPnRvX2luaXR2YWwpCisJCWlmICh0aW1lbyA9PSBORlNfVU5TUEVDX1RJTUVPIHx8IHRvLT50b19pbml0dmFsID09IDApCiAJCQl0by0+dG9faW5pdHZhbCA9IE5GU19ERUZfVURQX1RJTUVPICogSFogLyAxMDsKIAkJaWYgKHRvLT50b19pbml0dmFsID4gTkZTX01BWF9VRFBfVElNRU9VVCkKIAkJCXRvLT50b19pbml0dmFsID0gTkZTX01BWF9VRFBfVElNRU9VVDsKZGlmZiAtLWdpdCBhL2ZzL25mcy9maWxlLmMgYi9mcy9uZnMvZmlsZS5jCmluZGV4IDdkNjIwOTcuLjJlZmJkZGUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9maWxlLmMKKysrIGIvZnMvbmZzL2ZpbGUuYwpAQCAtMTgyLDI5ICsxODIsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZzX2ZpbGVfcmVhZCk7CiAKLXNzaXplX3QKLW5mc19maWxlX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3QgKnBwb3MsCi0JCSAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGNvdW50LAotCQkgICAgIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxwKTsKLQlzc2l6ZV90IHJlczsKLQotCWRwcmludGsoIk5GUzogc3BsaWNlX3JlYWQoJXBEMiwgJWx1QCVMdSlcbiIsCi0JCWZpbHAsICh1bnNpZ25lZCBsb25nKSBjb3VudCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgKnBwb3MpOwotCi0JbmZzX3N0YXJ0X2lvX3JlYWQoaW5vZGUpOwotCXJlcyA9IG5mc19yZXZhbGlkYXRlX21hcHBpbmcoaW5vZGUsIGZpbHAtPmZfbWFwcGluZyk7Ci0JaWYgKCFyZXMpIHsKLQkJcmVzID0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkKGZpbHAsIHBwb3MsIHBpcGUsIGNvdW50LCBmbGFncyk7Ci0JCWlmIChyZXMgPiAwKQotCQkJbmZzX2FkZF9zdGF0cyhpbm9kZSwgTkZTSU9TX05PUk1BTFJFQURCWVRFUywgcmVzKTsKLQl9Ci0JbmZzX2VuZF9pb19yZWFkKGlub2RlKTsKLQlyZXR1cm4gcmVzOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZzX2ZpbGVfc3BsaWNlX3JlYWQpOwotCiBpbnQKIG5mc19maWxlX21tYXAoc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCiB7CkBAIC02NTcsNyArNjM0LDEwIEBACiAJaWYgKHJlc3VsdCA8PSAwKQogCQlnb3RvIG91dDsKIAotCXdyaXR0ZW4gPSBnZW5lcmljX3dyaXRlX3N5bmMoaW9jYiwgcmVzdWx0KTsKKwlyZXN1bHQgPSBnZW5lcmljX3dyaXRlX3N5bmMoaW9jYiwgcmVzdWx0KTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXQ7CisJd3JpdHRlbiA9IHJlc3VsdDsKIAlpb2NiLT5raV9wb3MgKz0gd3JpdHRlbjsKIAogCS8qIFJldHVybiBlcnJvciB2YWx1ZXMgKi8KQEAgLTg2OCw3ICs4NDgsNyBAQAogCS5mc3luYwkJPSBuZnNfZmlsZV9mc3luYywKIAkubG9jawkJPSBuZnNfbG9jaywKIAkuZmxvY2sJCT0gbmZzX2Zsb2NrLAotCS5zcGxpY2VfcmVhZAk9IG5mc19maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIAkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkuY2hlY2tfZmxhZ3MJPSBuZnNfY2hlY2tfZmxhZ3MsCiAJLnNldGxlYXNlCT0gc2ltcGxlX25vc2V0bGVhc2UsCmRpZmYgLS1naXQgYS9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXQuYyBiL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dC5jCmluZGV4IGU2MjA2ZWEuLjUxYjUxMzYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dC5jCisrKyBiL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dC5jCkBAIC0zNyw2ICszNyw3IEBACiAJaWYgKGZmbCkgewogCQlJTklUX0xJU1RfSEVBRCgmZmZsLT5lcnJvcl9saXN0KTsKIAkJSU5JVF9MSVNUX0hFQUQoJmZmbC0+bWlycm9ycyk7CisJCWZmbC0+bGFzdF9yZXBvcnRfdGltZSA9IGt0aW1lX2dldCgpOwogCQlyZXR1cm4gJmZmbC0+Z2VuZXJpY19oZHI7CiAJfSBlbHNlCiAJCXJldHVybiBOVUxMOwpAQCAtNjQwLDE5ICs2NDEsMTggQEAKIHsKIAlzdGF0aWMgY29uc3Qga3RpbWVfdCBub3RpbWUgPSB7MH07CiAJczY0IHJlcG9ydF9pbnRlcnZhbCA9IEZGX0xBWU9VVFNUQVRTX1JFUE9SVF9JTlRFUlZBTDsKKwlzdHJ1Y3QgbmZzNF9mbGV4ZmlsZV9sYXlvdXQgKmZmbCA9IEZGX0xBWU9VVF9GUk9NX0hEUihtaXJyb3ItPmxheW91dCk7CiAKIAluZnM0X2ZmX3N0YXJ0X2J1c3lfdGltZXIoJmxheW91dHN0YXQtPmJ1c3lfdGltZXIsIG5vdyk7CiAJaWYgKGt0aW1lX2VxdWFsKG1pcnJvci0+c3RhcnRfdGltZSwgbm90aW1lKSkKIAkJbWlycm9yLT5zdGFydF90aW1lID0gbm93OwotCWlmIChrdGltZV9lcXVhbChtaXJyb3ItPmxhc3RfcmVwb3J0X3RpbWUsIG5vdGltZSkpCi0JCW1pcnJvci0+bGFzdF9yZXBvcnRfdGltZSA9IG5vdzsKIAlpZiAobWlycm9yLT5yZXBvcnRfaW50ZXJ2YWwgIT0gMCkKIAkJcmVwb3J0X2ludGVydmFsID0gKHM2NCltaXJyb3ItPnJlcG9ydF9pbnRlcnZhbCAqIDEwMDBMTDsKIAllbHNlIGlmIChsYXlvdXRzdGF0c190aW1lciAhPSAwKQogCQlyZXBvcnRfaW50ZXJ2YWwgPSAoczY0KWxheW91dHN0YXRzX3RpbWVyICogMTAwMExMOwotCWlmIChrdGltZV90b19tcyhrdGltZV9zdWIobm93LCBtaXJyb3ItPmxhc3RfcmVwb3J0X3RpbWUpKSA+PQorCWlmIChrdGltZV90b19tcyhrdGltZV9zdWIobm93LCBmZmwtPmxhc3RfcmVwb3J0X3RpbWUpKSA+PQogCQkJcmVwb3J0X2ludGVydmFsKSB7Ci0JCW1pcnJvci0+bGFzdF9yZXBvcnRfdGltZSA9IG5vdzsKKwkJZmZsLT5sYXN0X3JlcG9ydF90aW1lID0gbm93OwogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTgwNiwxMSArODA2LDE0IEBACiB7CiAJc3RydWN0IG5mczRfZmZfbGF5b3V0X3NlZ21lbnQgKmZscyA9IEZGX0xBWU9VVF9MU0VHKGxzZWcpOwogCXN0cnVjdCBuZnM0X3BuZnNfZHMgKmRzOworCWJvb2wgZmFpbF9yZXR1cm4gPSBmYWxzZTsKIAlpbnQgaWR4OwogCiAJLyogbWlycm9ycyBhcmUgc29ydGVkIGJ5IGVmZmljaWVuY3kgKi8KIAlmb3IgKGlkeCA9IHN0YXJ0X2lkeDsgaWR4IDwgZmxzLT5taXJyb3JfYXJyYXlfY250OyBpZHgrKykgewotCQlkcyA9IG5mczRfZmZfbGF5b3V0X3ByZXBhcmVfZHMobHNlZywgaWR4LCBmYWxzZSk7CisJCWlmIChpZHgrMSA9PSBmbHMtPm1pcnJvcl9hcnJheV9jbnQpCisJCQlmYWlsX3JldHVybiA9IHRydWU7CisJCWRzID0gbmZzNF9mZl9sYXlvdXRfcHJlcGFyZV9kcyhsc2VnLCBpZHgsIGZhaWxfcmV0dXJuKTsKIAkJaWYgKGRzKSB7CiAJCQkqYmVzdF9pZHggPSBpZHg7CiAJCQlyZXR1cm4gZHM7CkBAIC04NTksNiArODYyLDcgQEAKIAlzdHJ1Y3QgbmZzNF9wbmZzX2RzICpkczsKIAlpbnQgZHNfaWR4OwogCityZXRyeToKIAkvKiBVc2UgZnVsbCBsYXlvdXQgZm9yIG5vdyAqLwogCWlmICghcGdpby0+cGdfbHNlZykKIAkJZmZfbGF5b3V0X3BnX2dldF9yZWFkKHBnaW8sIHJlcSwgZmFsc2UpOwpAQCAtODcxLDEwICs4NzUsMTMgQEAKIAogCWRzID0gZmZfbGF5b3V0X2Nob29zZV9iZXN0X2RzX2Zvcl9yZWFkKHBnaW8tPnBnX2xzZWcsIDAsICZkc19pZHgpOwogCWlmICghZHMpIHsKLQkJaWYgKGZmX2xheW91dF9ub19mYWxsYmFja190b19tZHMocGdpby0+cGdfbHNlZykpCi0JCQlnb3RvIG91dF9wbmZzOwotCQllbHNlCisJCWlmICghZmZfbGF5b3V0X25vX2ZhbGxiYWNrX3RvX21kcyhwZ2lvLT5wZ19sc2VnKSkKIAkJCWdvdG8gb3V0X21kczsKKwkJcG5mc19wdXRfbHNlZyhwZ2lvLT5wZ19sc2VnKTsKKwkJcGdpby0+cGdfbHNlZyA9IE5VTEw7CisJCS8qIFNsZWVwIGZvciAxIHNlY29uZCBiZWZvcmUgcmV0cnlpbmcgKi8KKwkJc3NsZWVwKDEpOworCQlnb3RvIHJldHJ5OwogCX0KIAogCW1pcnJvciA9IEZGX0xBWU9VVF9DT01QKHBnaW8tPnBnX2xzZWcsIGRzX2lkeCk7CkBAIC04OTAsMTIgKzg5Nyw2IEBACiAJcG5mc19wdXRfbHNlZyhwZ2lvLT5wZ19sc2VnKTsKIAlwZ2lvLT5wZ19sc2VnID0gTlVMTDsKIAluZnNfcGFnZWlvX3Jlc2V0X3JlYWRfbWRzKHBnaW8pOwotCXJldHVybjsKLQotb3V0X3BuZnM6Ci0JcG5mc19zZXRfbG9fZmFpbChwZ2lvLT5wZ19sc2VnKTsKLQlwbmZzX3B1dF9sc2VnKHBnaW8tPnBnX2xzZWcpOwotCXBnaW8tPnBnX2xzZWcgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZApAQCAtOTA5LDYgKzkxMCw3IEBACiAJaW50IGk7CiAJaW50IHN0YXR1czsKIAorcmV0cnk6CiAJaWYgKCFwZ2lvLT5wZ19sc2VnKSB7CiAJCXBnaW8tPnBnX2xzZWcgPSBwbmZzX3VwZGF0ZV9sYXlvdXQocGdpby0+cGdfaW5vZGUsCiAJCQkJCQkgICByZXEtPndiX2NvbnRleHQsCkBAIC05NDAsMTAgKzk0MiwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBwZ2lvLT5wZ19taXJyb3JfY291bnQ7IGkrKykgewogCQlkcyA9IG5mczRfZmZfbGF5b3V0X3ByZXBhcmVfZHMocGdpby0+cGdfbHNlZywgaSwgdHJ1ZSk7CiAJCWlmICghZHMpIHsKLQkJCWlmIChmZl9sYXlvdXRfbm9fZmFsbGJhY2tfdG9fbWRzKHBnaW8tPnBnX2xzZWcpKQotCQkJCWdvdG8gb3V0X3BuZnM7Ci0JCQllbHNlCisJCQlpZiAoIWZmX2xheW91dF9ub19mYWxsYmFja190b19tZHMocGdpby0+cGdfbHNlZykpCiAJCQkJZ290byBvdXRfbWRzOworCQkJcG5mc19wdXRfbHNlZyhwZ2lvLT5wZ19sc2VnKTsKKwkJCXBnaW8tPnBnX2xzZWcgPSBOVUxMOworCQkJLyogU2xlZXAgZm9yIDEgc2Vjb25kIGJlZm9yZSByZXRyeWluZyAqLworCQkJc3NsZWVwKDEpOworCQkJZ290byByZXRyeTsKIAkJfQogCQlwZ20gPSAmcGdpby0+cGdfbWlycm9yc1tpXTsKIAkJbWlycm9yID0gRkZfTEFZT1VUX0NPTVAocGdpby0+cGdfbHNlZywgaSk7CkBAIC05NTYsMTIgKzk2MSw2IEBACiAJcG5mc19wdXRfbHNlZyhwZ2lvLT5wZ19sc2VnKTsKIAlwZ2lvLT5wZ19sc2VnID0gTlVMTDsKIAluZnNfcGFnZWlvX3Jlc2V0X3dyaXRlX21kcyhwZ2lvKTsKLQlyZXR1cm47Ci0KLW91dF9wbmZzOgotCXBuZnNfc2V0X2xvX2ZhaWwocGdpby0+cGdfbHNlZyk7Ci0JcG5mc19wdXRfbHNlZyhwZ2lvLT5wZ19sc2VnKTsKLQlwZ2lvLT5wZ19sc2VnID0gTlVMTDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludApkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0LmggYi9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXQuaAppbmRleCAxYmNkYjE1Li4zZWUwYzlmIDEwMDY0NAotLS0gYS9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXQuaAorKysgYi9mcy9uZnMvZmxleGZpbGVsYXlvdXQvZmxleGZpbGVsYXlvdXQuaApAQCAtODQsNyArODQsNiBAQAogCXN0cnVjdCBuZnM0X2ZmX2xheW91dHN0YXQJcmVhZF9zdGF0OwogCXN0cnVjdCBuZnM0X2ZmX2xheW91dHN0YXQJd3JpdGVfc3RhdDsKIAlrdGltZV90CQkJCXN0YXJ0X3RpbWU7Ci0Ja3RpbWVfdAkJCQlsYXN0X3JlcG9ydF90aW1lOwogCXUzMgkJCQlyZXBvcnRfaW50ZXJ2YWw7CiB9OwogCkBAIC0xMDEsNiArMTAwLDcgQEAKIAlzdHJ1Y3QgcG5mc19kc19jb21taXRfaW5mbyBjb21taXRfaW5mbzsKIAlzdHJ1Y3QgbGlzdF9oZWFkCW1pcnJvcnM7CiAJc3RydWN0IGxpc3RfaGVhZAllcnJvcl9saXN0OyAvKiBuZnM0X2ZmX2xheW91dF9kc19lcnIgKi8KKwlrdGltZV90CQkJbGFzdF9yZXBvcnRfdGltZTsgLyogTGF5b3V0c3RhdCByZXBvcnQgdGltZXMgKi8KIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mczRfZmxleGZpbGVfbGF5b3V0ICoKZGlmZiAtLWdpdCBhL2ZzL25mcy9mbGV4ZmlsZWxheW91dC9mbGV4ZmlsZWxheW91dGRldi5jIGIvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0ZGV2LmMKaW5kZXggMGFhMzZiZS4uZjdhM2Y2YiAxMDA2NDQKLS0tIGEvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0ZGV2LmMKKysrIGIvZnMvbmZzL2ZsZXhmaWxlbGF5b3V0L2ZsZXhmaWxlbGF5b3V0ZGV2LmMKQEAgLTE3LDggKzE3LDggQEAKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19QTkZTX0xECiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGF0YXNlcnZlcl90aW1lbyA9IE5GUzRfREVGX0RTX1RJTUVPOwotc3RhdGljIHVuc2lnbmVkIGludCBkYXRhc2VydmVyX3JldHJhbnMgPSBORlM0X0RFRl9EU19SRVRSQU5TOworc3RhdGljIHVuc2lnbmVkIGludCBkYXRhc2VydmVyX3RpbWVvID0gTkZTX0RFRl9UQ1BfUkVUUkFOUzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGF0YXNlcnZlcl9yZXRyYW5zOwogCiB2b2lkIG5mczRfZmZfbGF5b3V0X3B1dF9kZXZpY2VpZChzdHJ1Y3QgbmZzNF9mZl9sYXlvdXRfZHMgKm1pcnJvcl9kcykKIHsKQEAgLTM3OSw3ICszNzksNyBAQAogCiAJZGV2aWQgPSAmbWlycm9yLT5taXJyb3JfZHMtPmlkX25vZGU7CiAJaWYgKGZmX2xheW91dF90ZXN0X2RldmlkX3VuYXZhaWxhYmxlKGRldmlkKSkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X2ZhaWw7CiAKIAlkcyA9IG1pcnJvci0+bWlycm9yX2RzLT5kczsKIAkvKiBtYXRjaGluZyBzbXBfd21iKCkgaW4gX25mczRfcG5mc192My80X2RzX2Nvbm5lY3QgKi8KQEAgLTQwNSwxNSArNDA1LDE2IEBACiAJCQltaXJyb3ItPm1pcnJvcl9kcy0+ZHNfdmVyc2lvbnNbMF0ucnNpemUgPSBtYXhfcGF5bG9hZDsKIAkJaWYgKG1pcnJvci0+bWlycm9yX2RzLT5kc192ZXJzaW9uc1swXS53c2l6ZSA+IG1heF9wYXlsb2FkKQogCQkJbWlycm9yLT5taXJyb3JfZHMtPmRzX3ZlcnNpb25zWzBdLndzaXplID0gbWF4X3BheWxvYWQ7Ci0JfSBlbHNlIHsKLQkJZmZfbGF5b3V0X3RyYWNrX2RzX2Vycm9yKEZGX0xBWU9VVF9GUk9NX0hEUihsc2VnLT5wbHNfbGF5b3V0KSwKLQkJCQkJIG1pcnJvciwgbHNlZy0+cGxzX3JhbmdlLm9mZnNldCwKLQkJCQkJIGxzZWctPnBsc19yYW5nZS5sZW5ndGgsIE5GUzRFUlJfTlhJTywKLQkJCQkJIE9QX0lMTEVHQUwsIEdGUF9OT0lPKTsKLQkJaWYgKGZhaWxfcmV0dXJuIHx8ICFmZl9sYXlvdXRfaGFzX2F2YWlsYWJsZV9kcyhsc2VnKSkKLQkJCXBuZnNfZXJyb3JfbWFya19sYXlvdXRfZm9yX3JldHVybihpbm8sIGxzZWcpOwotCQlkcyA9IE5VTEw7CisJCWdvdG8gb3V0OwogCX0KKwlmZl9sYXlvdXRfdHJhY2tfZHNfZXJyb3IoRkZfTEFZT1VUX0ZST01fSERSKGxzZWctPnBsc19sYXlvdXQpLAorCQkJCSBtaXJyb3IsIGxzZWctPnBsc19yYW5nZS5vZmZzZXQsCisJCQkJIGxzZWctPnBsc19yYW5nZS5sZW5ndGgsIE5GUzRFUlJfTlhJTywKKwkJCQkgT1BfSUxMRUdBTCwgR0ZQX05PSU8pOworb3V0X2ZhaWw6CisJaWYgKGZhaWxfcmV0dXJuIHx8ICFmZl9sYXlvdXRfaGFzX2F2YWlsYWJsZV9kcyhsc2VnKSkKKwkJcG5mc19lcnJvcl9tYXJrX2xheW91dF9mb3JfcmV0dXJuKGlubywgbHNlZyk7CisJZHMgPSBOVUxMOwogb3V0OgogCXJldHVybiBkczsKIH0KZGlmZiAtLWdpdCBhL2ZzL25mcy9pbnRlcm5hbC5oIGIvZnMvbmZzL2ludGVybmFsLmgKaW5kZXggN2NlNWUwMi4uZDdiMDYyYiAxMDA2NDQKLS0tIGEvZnMvbmZzL2ludGVybmFsLmgKKysrIGIvZnMvbmZzL2ludGVybmFsLmgKQEAgLTU4LDYgKzU4LDkgQEAKICAqLwogI2RlZmluZSBORlNfVU5TUEVDX1BPUlQJCSgtMSkKIAorI2RlZmluZSBORlNfVU5TUEVDX1JFVFJBTlMJKFVJTlRfTUFYKQorI2RlZmluZSBORlNfVU5TUEVDX1RJTUVPCShVSU5UX01BWCkKKwogLyoKICAqIE1heGltdW0gbnVtYmVyIG9mIHBhZ2VzIHRoYXQgcmVhZGRpciBjYW4gdXNlIGZvciBjcmVhdGluZwogICogYSB2bWFwcGVkIGFycmF5IG9mIHBhZ2VzLgpAQCAtMTU2LDcgKzE1OSw3IEBACiBpbnQgbmZzX3Byb2JlX2ZzaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICosIHN0cnVjdCBuZnNfZmF0dHIgKik7CiB2b2lkIG5mc19zZXJ2ZXJfaW5zZXJ0X2xpc3RzKHN0cnVjdCBuZnNfc2VydmVyICopOwogdm9pZCBuZnNfc2VydmVyX3JlbW92ZV9saXN0cyhzdHJ1Y3QgbmZzX3NlcnZlciAqKTsKLXZvaWQgbmZzX2luaXRfdGltZW91dF92YWx1ZXMoc3RydWN0IHJwY190aW1lb3V0ICosIGludCwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwordm9pZCBuZnNfaW5pdF90aW1lb3V0X3ZhbHVlcyhzdHJ1Y3QgcnBjX3RpbWVvdXQgKnRvLCBpbnQgcHJvdG8sIGludCB0aW1lbywgaW50IHJldHJhbnMpOwogaW50IG5mc19pbml0X3NlcnZlcl9ycGNjbGllbnQoc3RydWN0IG5mc19zZXJ2ZXIgKiwgY29uc3Qgc3RydWN0IHJwY190aW1lb3V0ICp0LAogCQlycGNfYXV0aGZsYXZvcl90KTsKIHN0cnVjdCBuZnNfc2VydmVyICpuZnNfYWxsb2Nfc2VydmVyKHZvaWQpOwpAQCAtMzYyLDggKzM2NSw2IEBACiBpbnQgbmZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKTsKIGxvZmZfdCBuZnNfZmlsZV9sbHNlZWsoc3RydWN0IGZpbGUgKiwgbG9mZl90LCBpbnQpOwogc3NpemVfdCBuZnNfZmlsZV9yZWFkKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW92X2l0ZXIgKik7Ci1zc2l6ZV90IG5mc19maWxlX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICosIGxvZmZfdCAqLCBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosCi0JCQkgICAgIHNpemVfdCwgdW5zaWduZWQgaW50KTsKIGludCBuZnNfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKIHNzaXplX3QgbmZzX2ZpbGVfd3JpdGUoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKIGludCBuZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0MnByb2MuYyBiL2ZzL25mcy9uZnM0MnByb2MuYwppbmRleCA2ZjQ3NTI3Li42NGI0M2I0IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNDJwcm9jLmMKKysrIGIvZnMvbmZzL25mczQycHJvYy5jCkBAIC0zMTgsMTAgKzMxOCwyMiBAQAogbmZzNDJfbGF5b3V0c3RhdF9wcmVwYXJlKHN0cnVjdCBycGNfdGFzayAqdGFzaywgdm9pZCAqY2FsbGRhdGEpCiB7CiAJc3RydWN0IG5mczQyX2xheW91dHN0YXRfZGF0YSAqZGF0YSA9IGNhbGxkYXRhOwotCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRhdGEtPmFyZ3MuaW5vZGUpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkYXRhLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG87CiAKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWxvID0gTkZTX0koaW5vZGUpLT5sYXlvdXQ7CisJaWYgKCFwbmZzX2xheW91dF9pc192YWxpZChsbykpIHsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlycGNfZXhpdCh0YXNrLCAwKTsKKwkJcmV0dXJuOworCX0KKwluZnM0X3N0YXRlaWRfY29weSgmZGF0YS0+YXJncy5zdGF0ZWlkLCAmbG8tPnBsaF9zdGF0ZWlkKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJbmZzNDFfc2V0dXBfc2VxdWVuY2UobmZzNF9nZXRfc2Vzc2lvbihzZXJ2ZXIpLCAmZGF0YS0+YXJncy5zZXFfYXJncywKIAkJCSAgICAgJmRhdGEtPnJlcy5zZXFfcmVzLCB0YXNrKTsKKwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzQxLDExICszNTMsMTEgQEAKIAljYXNlIC1ORlM0RVJSX0FETUlOX1JFVk9LRUQ6CiAJY2FzZSAtTkZTNEVSUl9ERUxFR19SRVZPS0VEOgogCWNhc2UgLU5GUzRFUlJfU1RBTEVfU1RBVEVJRDoKLQljYXNlIC1ORlM0RVJSX09MRF9TVEFURUlEOgogCWNhc2UgLU5GUzRFUlJfQkFEX1NUQVRFSUQ6CiAJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCWxvID0gTkZTX0koaW5vZGUpLT5sYXlvdXQ7Ci0JCWlmIChsbyAmJiBuZnM0X3N0YXRlaWRfbWF0Y2goJmRhdGEtPmFyZ3Muc3RhdGVpZCwKKwkJaWYgKHBuZnNfbGF5b3V0X2lzX3ZhbGlkKGxvKSAmJgorCQkgICAgbmZzNF9zdGF0ZWlkX21hdGNoKCZkYXRhLT5hcmdzLnN0YXRlaWQsCiAJCQkJCSAgICAgJmxvLT5wbGhfc3RhdGVpZCkpIHsKIAkJCUxJU1RfSEVBRChoZWFkKTsKIApAQCAtMzU5LDExICszNzEsMjMgQEAKIAkJfSBlbHNlCiAJCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJCWJyZWFrOworCWNhc2UgLU5GUzRFUlJfT0xEX1NUQVRFSUQ6CisJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCWxvID0gTkZTX0koaW5vZGUpLT5sYXlvdXQ7CisJCWlmIChwbmZzX2xheW91dF9pc192YWxpZChsbykgJiYKKwkJICAgIG5mczRfc3RhdGVpZF9tYXRjaF9vdGhlcigmZGF0YS0+YXJncy5zdGF0ZWlkLAorCQkJCQkmbG8tPnBsaF9zdGF0ZWlkKSkgeworCQkJLyogRG8gd2UgbmVlZCB0byBkZWxheSBiZWZvcmUgcmVzZW5kaW5nPyAqLworCQkJaWYgKCFuZnM0X3N0YXRlaWRfaXNfbmV3ZXIoJmxvLT5wbGhfc3RhdGVpZCwKKwkJCQkJCSZkYXRhLT5hcmdzLnN0YXRlaWQpKQorCQkJCXJwY19kZWxheSh0YXNrLCBIWik7CisJCQlycGNfcmVzdGFydF9jYWxsX3ByZXBhcmUodGFzayk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlicmVhazsKIAljYXNlIC1FTk9UU1VQUDoKIAljYXNlIC1FT1BOT1RTVVBQOgogCQlORlNfU0VSVkVSKGlub2RlKS0+Y2FwcyAmPSB+TkZTX0NBUF9MQVlPVVRTVEFUUzsKLQlkZWZhdWx0OgotCQlicmVhazsKIAl9CiAKIAlkcHJpbnRrKCIlcyBzZXJ2ZXIgcmV0dXJucyAlZFxuIiwgX19mdW5jX18sIHRhc2stPnRrX3N0YXR1cyk7CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNGNsaWVudC5jIGIvZnMvbmZzL25mczRjbGllbnQuYwppbmRleCA4ZDdkMDhkLi5jZDNiN2NmIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNGNsaWVudC5jCisrKyBiL2ZzL25mcy9uZnM0Y2xpZW50LmMKQEAgLTgxNyw2ICs4MTcsMTEgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKKwlpZiAoc2VydmVyLT5uZnNfY2xpZW50ID09IGNscCkgeworCQllcnJvciA9IC1FTE9PUDsKKwkJZ290byBlcnJvcjsKKwl9CisKIAkvKgogCSAqIFF1ZXJ5IGZvciB0aGUgbGVhc2UgdGltZSBvbiBjbGllbnRpZCBzZXR1cCBvciByZW5ld2FsCiAJICoKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0ZmlsZS5jIGIvZnMvbmZzL25mczRmaWxlLmMKaW5kZXggZDA4NWFkNy4uODlhNzc5NSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRmaWxlLmMKKysrIGIvZnMvbmZzL25mczRmaWxlLmMKQEAgLTI0OCw3ICsyNDgsNyBAQAogCS5mc3luYwkJPSBuZnNfZmlsZV9mc3luYywKIAkubG9jawkJPSBuZnNfbG9jaywKIAkuZmxvY2sJCT0gbmZzX2Zsb2NrLAotCS5zcGxpY2VfcmVhZAk9IG5mc19maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIAkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkuY2hlY2tfZmxhZ3MJPSBuZnNfY2hlY2tfZmxhZ3MsCiAJLnNldGxlYXNlCT0gc2ltcGxlX25vc2V0bGVhc2UsCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHByb2MuYyBiL2ZzL25mcy9uZnM0cHJvYy5jCmluZGV4IDE5NDliYmQuLmE5ZGVjMzIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0cHJvYy5jCisrKyBiL2ZzL25mcy9uZnM0cHJvYy5jCkBAIC02MzQsMTUgKzYzNCwxMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZzNDBfc2V0dXBfc2VxdWVuY2UpOwogCi1zdGF0aWMgaW50IG5mczQwX3NlcXVlbmNlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrLAotCQkJICAgICAgIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQorc3RhdGljIHZvaWQgbmZzNDBfc2VxdWVuY2VfZnJlZV9zbG90KHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQogewogCXN0cnVjdCBuZnM0X3Nsb3QgKnNsb3QgPSByZXMtPnNyX3Nsb3Q7CiAJc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsOwogCi0JaWYgKHNsb3QgPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0KIAl0YmwgPSBzbG90LT50YWJsZTsKIAlzcGluX2xvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CiAJaWYgKCFuZnM0MV93YWtlX2FuZF9hc3NpZ25fc2xvdCh0YmwsIHNsb3QpKQpAQCAtNjUwLDcgKzY0NiwxMyBAQAogCXNwaW5fdW5sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOwogCiAJcmVzLT5zcl9zbG90ID0gTlVMTDsKLW91dDoKK30KKworc3RhdGljIGludCBuZnM0MF9zZXF1ZW5jZV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaywKKwkJCSAgICAgICBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKK3sKKwlpZiAocmVzLT5zcl9zbG90ICE9IE5VTEwpCisJCW5mczQwX3NlcXVlbmNlX2ZyZWVfc2xvdChyZXMpOwogCXJldHVybiAxOwogfQogCkBAIC02NjYsNiArNjY4LDExIEBACiAJdGJsID0gc2xvdC0+dGFibGU7CiAJc2Vzc2lvbiA9IHRibC0+c2Vzc2lvbjsKIAorCS8qIEJ1bXAgdGhlIHNsb3Qgc2VxdWVuY2UgbnVtYmVyICovCisJaWYgKHNsb3QtPnNlcV9kb25lKQorCQlzbG90LT5zZXFfbnIrKzsKKwlzbG90LT5zZXFfZG9uZSA9IDA7CisKIAlzcGluX2xvY2soJnRibC0+c2xvdF90YmxfbG9jayk7CiAJLyogQmUgbmljZSB0byB0aGUgc2VydmVyOiB0cnkgdG8gZW5zdXJlIHRoYXQgdGhlIGxhc3QgdHJhbnNtaXR0ZWQKIAkgKiB2YWx1ZSBmb3IgaGlnaGVzdF91c2VyX3Nsb3RpZCA8PSB0YXJnZXRfaGlnaGVzdF9zbG90aWQKQEAgLTY4Niw5ICs2OTMsMTIgQEAKIAlyZXMtPnNyX3Nsb3QgPSBOVUxMOwogCWlmIChzZW5kX25ld19oaWdoZXN0X3VzZWRfc2xvdGlkKQogCQluZnM0MV9ub3RpZnlfc2VydmVyKHNlc3Npb24tPmNscCk7CisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnRibC0+c2xvdF93YWl0cSkpCisJCXdha2VfdXBfYWxsKCZ0YmwtPnNsb3Rfd2FpdHEpOwogfQogCi1pbnQgbmZzNDFfc2VxdWVuY2VfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQorc3RhdGljIGludCBuZnM0MV9zZXF1ZW5jZV9wcm9jZXNzKHN0cnVjdCBycGNfdGFzayAqdGFzaywKKwkJc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCiB7CiAJc3RydWN0IG5mczRfc2Vzc2lvbiAqc2Vzc2lvbjsKIAlzdHJ1Y3QgbmZzNF9zbG90ICpzbG90ID0gcmVzLT5zcl9zbG90OwpAQCAtNzE0LDcgKzcyNCw3IEBACiAJc3dpdGNoIChyZXMtPnNyX3N0YXR1cykgewogCWNhc2UgMDoKIAkJLyogVXBkYXRlIHRoZSBzbG90J3Mgc2VxdWVuY2UgYW5kIGNsaWVudGlkIGxlYXNlIHRpbWVyICovCi0JCSsrc2xvdC0+c2VxX25yOworCQlzbG90LT5zZXFfZG9uZSA9IDE7CiAJCWNscCA9IHNlc3Npb24tPmNscDsKIAkJZG9fcmVuZXdfbGVhc2UoY2xwLCByZXMtPnNyX3RpbWVzdGFtcCk7CiAJCS8qIENoZWNrIHNlcXVlbmNlIGZsYWdzICovCkBAIC03NjksMTYgKzc3OSwxNiBAQAogCQlnb3RvIHJldHJ5X25vd2FpdDsKIAlkZWZhdWx0OgogCQkvKiBKdXN0IHVwZGF0ZSB0aGUgc2xvdCBzZXF1ZW5jZSBuby4gKi8KLQkJKytzbG90LT5zZXFfbnI7CisJCXNsb3QtPnNlcV9kb25lID0gMTsKIAl9CiBvdXQ6CiAJLyogVGhlIHNlc3Npb24gbWF5IGJlIHJlc2V0IGJ5IG9uZSBvZiB0aGUgZXJyb3IgaGFuZGxlcnMuICovCiAJZHByaW50aygiJXM6IEVycm9yICVkIGZyZWUgdGhlIHNsb3QgXG4iLCBfX2Z1bmNfXywgcmVzLT5zcl9zdGF0dXMpOwotCW5mczQxX3NlcXVlbmNlX2ZyZWVfc2xvdChyZXMpOwogb3V0X25vYWN0aW9uOgogCXJldHVybiByZXQ7CiByZXRyeV9ub3dhaXQ6CiAJaWYgKHJwY19yZXN0YXJ0X2NhbGxfcHJlcGFyZSh0YXNrKSkgeworCQluZnM0MV9zZXF1ZW5jZV9mcmVlX3Nsb3QocmVzKTsKIAkJdGFzay0+dGtfc3RhdHVzID0gMDsKIAkJcmV0ID0gMDsKIAl9CkBAIC03ODksOCArNzk5LDM3IEBACiAJcnBjX2RlbGF5KHRhc2ssIE5GUzRfUE9MTF9SRVRSWV9NQVgpOwogCXJldHVybiAwOwogfQorCitpbnQgbmZzNDFfc2VxdWVuY2VfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQoreworCWlmICghbmZzNDFfc2VxdWVuY2VfcHJvY2Vzcyh0YXNrLCByZXMpKQorCQlyZXR1cm4gMDsKKwlpZiAocmVzLT5zcl9zbG90ICE9IE5VTEwpCisJCW5mczQxX3NlcXVlbmNlX2ZyZWVfc2xvdChyZXMpOworCXJldHVybiAxOworCit9CiBFWFBPUlRfU1lNQk9MX0dQTChuZnM0MV9zZXF1ZW5jZV9kb25lKTsKIAorc3RhdGljIGludCBuZnM0X3NlcXVlbmNlX3Byb2Nlc3Moc3RydWN0IHJwY190YXNrICp0YXNrLCBzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgKnJlcykKK3sKKwlpZiAocmVzLT5zcl9zbG90ID09IE5VTEwpCisJCXJldHVybiAxOworCWlmIChyZXMtPnNyX3Nsb3QtPnRhYmxlLT5zZXNzaW9uICE9IE5VTEwpCisJCXJldHVybiBuZnM0MV9zZXF1ZW5jZV9wcm9jZXNzKHRhc2ssIHJlcyk7CisJcmV0dXJuIG5mczQwX3NlcXVlbmNlX2RvbmUodGFzaywgcmVzKTsKK30KKworc3RhdGljIHZvaWQgbmZzNF9zZXF1ZW5jZV9mcmVlX3Nsb3Qoc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCit7CisJaWYgKHJlcy0+c3Jfc2xvdCAhPSBOVUxMKSB7CisJCWlmIChyZXMtPnNyX3Nsb3QtPnRhYmxlLT5zZXNzaW9uICE9IE5VTEwpCisJCQluZnM0MV9zZXF1ZW5jZV9mcmVlX3Nsb3QocmVzKTsKKwkJZWxzZQorCQkJbmZzNDBfc2VxdWVuY2VfZnJlZV9zbG90KHJlcyk7CisJfQorfQorCiBpbnQgbmZzNF9zZXF1ZW5jZV9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCiB7CiAJaWYgKHJlcy0+c3Jfc2xvdCA9PSBOVUxMKQpAQCAtOTIwLDYgKzk1OSwxNyBAQAogCQkJCSAgICBhcmdzLCByZXMsIHRhc2spOwogfQogCitzdGF0aWMgaW50IG5mczRfc2VxdWVuY2VfcHJvY2VzcyhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQoreworCXJldHVybiBuZnM0MF9zZXF1ZW5jZV9kb25lKHRhc2ssIHJlcyk7Cit9CisKK3N0YXRpYyB2b2lkIG5mczRfc2VxdWVuY2VfZnJlZV9zbG90KHN0cnVjdCBuZnM0X3NlcXVlbmNlX3JlcyAqcmVzKQoreworCWlmIChyZXMtPnNyX3Nsb3QgIT0gTlVMTCkKKwkJbmZzNDBfc2VxdWVuY2VfZnJlZV9zbG90KHJlcyk7Cit9CisKIGludCBuZnM0X3NlcXVlbmNlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrLAogCQkgICAgICAgc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzICpyZXMpCiB7CkBAIC0xMTk3LDYgKzEyNDcsNyBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBwLT5kZW50cnktPmRfc2I7CiAKIAluZnNfZnJlZV9zZXFpZChwLT5vX2FyZy5zZXFpZCk7CisJbmZzNF9zZXF1ZW5jZV9mcmVlX3Nsb3QoJnAtPm9fcmVzLnNlcV9yZXMpOwogCWlmIChwLT5zdGF0ZSAhPSBOVUxMKQogCQluZnM0X3B1dF9vcGVuX3N0YXRlKHAtPnN0YXRlKTsKIAluZnM0X3B1dF9zdGF0ZV9vd25lcihwLT5vd25lcik7CkBAIC0xNjU2LDkgKzE3MDcsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZSAqCiBuZnM0X29wZW5kYXRhX3RvX25mczRfc3RhdGUoc3RydWN0IG5mczRfb3BlbmRhdGEgKmRhdGEpCiB7CisJc3RydWN0IG5mczRfc3RhdGUgKnJldDsKKwogCWlmIChkYXRhLT5vX2FyZy5jbGFpbSA9PSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpCi0JCXJldHVybiBfbmZzNF9vcGVuZGF0YV9yZWNsYWltX3RvX25mczRfc3RhdGUoZGF0YSk7Ci0JcmV0dXJuIF9uZnM0X29wZW5kYXRhX3RvX25mczRfc3RhdGUoZGF0YSk7CisJCXJldCA9X25mczRfb3BlbmRhdGFfcmVjbGFpbV90b19uZnM0X3N0YXRlKGRhdGEpOworCWVsc2UKKwkJcmV0ID0gX25mczRfb3BlbmRhdGFfdG9fbmZzNF9zdGF0ZShkYXRhKTsKKwluZnM0X3NlcXVlbmNlX2ZyZWVfc2xvdCgmZGF0YS0+b19yZXMuc2VxX3Jlcyk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpuZnM0X3N0YXRlX2ZpbmRfb3Blbl9jb250ZXh0KHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKQEAgLTIwNTYsNyArMjExMiw3IEBACiAKIAlkYXRhLT5ycGNfc3RhdHVzID0gdGFzay0+dGtfc3RhdHVzOwogCi0JaWYgKCFuZnM0X3NlcXVlbmNlX2RvbmUodGFzaywgJmRhdGEtPm9fcmVzLnNlcV9yZXMpKQorCWlmICghbmZzNF9zZXF1ZW5jZV9wcm9jZXNzKHRhc2ssICZkYXRhLT5vX3Jlcy5zZXFfcmVzKSkKIAkJcmV0dXJuOwogCiAJaWYgKHRhc2stPnRrX3N0YXR1cyA9PSAwKSB7CkBAIC03NTE0LDEyICs3NTcwLDIwIEBACiAJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXNzaW9uLT5jbHAtPmNsX3JwY2NsaWVudCwgJm1zZywgUlBDX1RBU0tfVElNRU9VVCk7CiAJdHJhY2VfbmZzNF9jcmVhdGVfc2Vzc2lvbihjbHAsIHN0YXR1cyk7CiAKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQ6CisJY2FzZSAtTkZTNEVSUl9ERUxBWToKKwljYXNlIC1FVElNRURPVVQ6CisJY2FzZSAtRUFDQ0VTOgorCWNhc2UgLUVBR0FJTjoKKwkJZ290byBvdXQ7CisJfTsKKworCWNscC0+Y2xfc2VxaWQrKzsKIAlpZiAoIXN0YXR1cykgewogCQkvKiBWZXJpZnkgdGhlIHNlc3Npb24ncyBuZWdvdGlhdGVkIGNoYW5uZWxfYXR0cnMgdmFsdWVzICovCiAJCXN0YXR1cyA9IG5mczRfdmVyaWZ5X2NoYW5uZWxfYXR0cnMoJmFyZ3MsICZyZXMpOwogCQkvKiBJbmNyZW1lbnQgdGhlIGNsaWVudGlkIHNsb3Qgc2VxdWVuY2UgaWQgKi8KLQkJaWYgKGNscC0+Y2xfc2VxaWQgPT0gcmVzLnNlcWlkKQotCQkJY2xwLT5jbF9zZXFpZCsrOwogCQlpZiAoc3RhdHVzKQogCQkJZ290byBvdXQ7CiAJCW5mczRfdXBkYXRlX3Nlc3Npb24oc2Vzc2lvbiwgJnJlcyk7CkBAIC03ODY0LDcgKzc5MjgsNyBAQAogCXN0cnVjdCBuZnM0X2xheW91dGdldCAqbGdwID0gY2FsbGRhdGE7CiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKLQluZnM0MV9zZXF1ZW5jZV9kb25lKHRhc2ssICZsZ3AtPnJlcy5zZXFfcmVzKTsKKwluZnM0MV9zZXF1ZW5jZV9wcm9jZXNzKHRhc2ssICZsZ3AtPnJlcy5zZXFfcmVzKTsKIAlkcHJpbnRrKCI8LS0gJXNcbiIsIF9fZnVuY19fKTsKIH0KIApAQCAtODA4MCw2ICs4MTQ0LDcgQEAKIAkvKiBpZiBsYXlvdXRwLT5sZW4gaXMgMCwgbmZzNF9sYXlvdXRnZXRfcHJlcGFyZSBjYWxsZWQgcnBjX2V4aXQgKi8KIAlpZiAoc3RhdHVzID09IDAgJiYgbGdwLT5yZXMubGF5b3V0cC0+bGVuKQogCQlsc2VnID0gcG5mc19sYXlvdXRfcHJvY2VzcyhsZ3ApOworCW5mczRfc2VxdWVuY2VfZnJlZV9zbG90KCZsZ3AtPnJlcy5zZXFfcmVzKTsKIAlycGNfcHV0X3Rhc2sodGFzayk7CiAJZHByaW50aygiPC0tICVzIHN0YXR1cz0lZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAJaWYgKHN0YXR1cykKQEAgLTgxMDYsNyArODE3MSw3IEBACiAKIAlkcHJpbnRrKCItLT4gJXNcbiIsIF9fZnVuY19fKTsKIAotCWlmICghbmZzNDFfc2VxdWVuY2VfZG9uZSh0YXNrLCAmbHJwLT5yZXMuc2VxX3JlcykpCisJaWYgKCFuZnM0MV9zZXF1ZW5jZV9wcm9jZXNzKHRhc2ssICZscnAtPnJlcy5zZXFfcmVzKSkKIAkJcmV0dXJuOwogCiAJc2VydmVyID0gTkZTX1NFUlZFUihscnAtPmFyZ3MuaW5vZGUpOwpAQCAtODExOCw2ICs4MTgzLDcgQEAKIAljYXNlIC1ORlM0RVJSX0RFTEFZOgogCQlpZiAobmZzNF9hc3luY19oYW5kbGVfZXJyb3IodGFzaywgc2VydmVyLCBOVUxMLCBOVUxMKSAhPSAtRUFHQUlOKQogCQkJYnJlYWs7CisJCW5mczRfc2VxdWVuY2VfZnJlZV9zbG90KCZscnAtPnJlcy5zZXFfcmVzKTsKIAkJcnBjX3Jlc3RhcnRfY2FsbF9wcmVwYXJlKHRhc2spOwogCQlyZXR1cm47CiAJfQpAQCAtODEzMiwxMiArODE5OCwxNiBAQAogCiAJZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAJc3Bpbl9sb2NrKCZsby0+cGxoX2lub2RlLT5pX2xvY2spOwotCXBuZnNfbWFya19tYXRjaGluZ19sc2Vnc19pbnZhbGlkKGxvLCAmZnJlZW1lLCAmbHJwLT5hcmdzLnJhbmdlLAotCQkJYmUzMl90b19jcHUobHJwLT5hcmdzLnN0YXRlaWQuc2VxaWQpKTsKLQlpZiAobHJwLT5yZXMubHJzX3ByZXNlbnQgJiYgcG5mc19sYXlvdXRfaXNfdmFsaWQobG8pKQorCWlmIChscnAtPnJlcy5scnNfcHJlc2VudCkgeworCQlwbmZzX21hcmtfbWF0Y2hpbmdfbHNlZ3NfaW52YWxpZChsbywgJmZyZWVtZSwKKwkJCQkmbHJwLT5hcmdzLnJhbmdlLAorCQkJCWJlMzJfdG9fY3B1KGxycC0+YXJncy5zdGF0ZWlkLnNlcWlkKSk7CiAJCXBuZnNfc2V0X2xheW91dF9zdGF0ZWlkKGxvLCAmbHJwLT5yZXMuc3RhdGVpZCwgdHJ1ZSk7CisJfSBlbHNlCisJCXBuZnNfbWFya19sYXlvdXRfc3RhdGVpZF9pbnZhbGlkKGxvLCAmZnJlZW1lKTsKIAlwbmZzX2NsZWFyX2xheW91dHJldHVybl93YWl0Yml0KGxvKTsKIAlzcGluX3VubG9jaygmbG8tPnBsaF9pbm9kZS0+aV9sb2NrKTsKKwluZnM0X3NlcXVlbmNlX2ZyZWVfc2xvdCgmbHJwLT5yZXMuc2VxX3Jlcyk7CiAJcG5mc19mcmVlX2xzZWdfbGlzdCgmZnJlZW1lKTsKIAlwbmZzX3B1dF9sYXlvdXRfaGRyKGxycC0+YXJncy5sYXlvdXQpOwogCW5mc19pcHV0X2FuZF9kZWFjdGl2ZShscnAtPmlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0c2Vzc2lvbi5jIGIvZnMvbmZzL25mczRzZXNzaW9uLmMKaW5kZXggMzMyZDA2ZS4uYjYyOTczMCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRzZXNzaW9uLmMKKysrIGIvZnMvbmZzL25mczRzZXNzaW9uLmMKQEAgLTI4LDYgKzI4LDcgQEAKIAl0YmwtPmhpZ2hlc3RfdXNlZF9zbG90aWQgPSBORlM0X05PX1NMT1Q7CiAJc3Bpbl9sb2NrX2luaXQoJnRibC0+c2xvdF90YmxfbG9jayk7CiAJcnBjX2luaXRfcHJpb3JpdHlfd2FpdF9xdWV1ZSgmdGJsLT5zbG90X3RibF93YWl0cSwgcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnRibC0+c2xvdF93YWl0cSk7CiAJaW5pdF9jb21wbGV0aW9uKCZ0YmwtPmNvbXBsZXRlKTsKIH0KIApAQCAtMTcyLDYgKzE3Myw1OCBAQAogCXJldHVybiBFUlJfUFRSKC1FMkJJRyk7CiB9CiAKK3N0YXRpYyBpbnQgbmZzNF9zbG90X2dldF9zZXFpZChzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICAqdGJsLCB1MzIgc2xvdGlkLAorCQl1MzIgKnNlcV9ucikKKwlfX211c3RfaG9sZCgmdGJsLT5zbG90X3RibF9sb2NrKQoreworCXN0cnVjdCBuZnM0X3Nsb3QgKnNsb3Q7CisKKwlzbG90ID0gbmZzNF9sb29rdXBfc2xvdCh0YmwsIHNsb3RpZCk7CisJaWYgKElTX0VSUihzbG90KSkKKwkJcmV0dXJuIFBUUl9FUlIoc2xvdCk7CisJKnNlcV9uciA9IHNsb3QtPnNlcV9ucjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG5mczRfc2xvdF9zZXFpZF9pbl91c2UgLSB0ZXN0IGlmIGEgc2xvdCBzZXF1ZW5jZSBpZCBpcyBzdGlsbCBpbiB1c2UKKyAqCisgKiBHaXZlbiBhIHNsb3QgdGFibGUsIHNsb3QgaWQgYW5kIHNlcXVlbmNlIG51bWJlciwgZGV0ZXJtaW5lIGlmIHRoZQorICogUlBDIGNhbGwgaW4gcXVlc3Rpb24gaXMgc3RpbGwgaW4gZmxpZ2h0LiBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seQorICogaW50ZW5kZWQgZm9yIHVzZSBieSB0aGUgY2FsbGJhY2sgY2hhbm5lbC4KKyAqLworc3RhdGljIGJvb2wgbmZzNF9zbG90X3NlcWlkX2luX3VzZShzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwsCisJCXUzMiBzbG90aWQsIHUzMiBzZXFfbnIpCit7CisJdTMyIGN1cl9zZXE7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCXNwaW5fbG9jaygmdGJsLT5zbG90X3RibF9sb2NrKTsKKwlpZiAobmZzNF9zbG90X2dldF9zZXFpZCh0YmwsIHNsb3RpZCwgJmN1cl9zZXEpID09IDAgJiYKKwkgICAgY3VyX3NlcSA9PSBzZXFfbnIgJiYgdGVzdF9iaXQoc2xvdGlkLCB0YmwtPnVzZWRfc2xvdHMpKQorCQlyZXQgPSB0cnVlOworCXNwaW5fdW5sb2NrKCZ0YmwtPnNsb3RfdGJsX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBuZnM0X3Nsb3Rfd2FpdF9vbl9zZXFpZCAtIHdhaXQgdW50aWwgYSBzbG90IHNlcXVlbmNlIGlkIGlzIGNvbXBsZXRlCisgKgorICogR2l2ZW4gYSBzbG90IHRhYmxlLCBzbG90IGlkIGFuZCBzZXF1ZW5jZSBudW1iZXIsIHdhaXQgdW50aWwgdGhlCisgKiBjb3JyZXNwb25kaW5nIFJQQyBjYWxsIGNvbXBsZXRlcy4gVGhpcyBmdW5jdGlvbiBpcyBtYWlubHkKKyAqIGludGVuZGVkIGZvciB1c2UgYnkgdGhlIGNhbGxiYWNrIGNoYW5uZWwuCisgKi8KK2ludCBuZnM0X3Nsb3Rfd2FpdF9vbl9zZXFpZChzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwsCisJCXUzMiBzbG90aWQsIHUzMiBzZXFfbnIsCisJCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAod2FpdF9ldmVudF90aW1lb3V0KHRibC0+c2xvdF93YWl0cSwKKwkJCSFuZnM0X3Nsb3Rfc2VxaWRfaW5fdXNlKHRibCwgc2xvdGlkLCBzZXFfbnIpLAorCQkJdGltZW91dCkgPT0gMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBuZnM0X2FsbG9jX3Nsb3QgLSBlZmZpY2llbnRseSBsb29rIGZvciBhIGZyZWUgc2xvdAogICoKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0c2Vzc2lvbi5oIGIvZnMvbmZzL25mczRzZXNzaW9uLmgKaW5kZXggNWI1MTI5OC4uZjcwM2I3NSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRzZXNzaW9uLmgKKysrIGIvZnMvbmZzL25mczRzZXNzaW9uLmgKQEAgLTIxLDcgKzIxLDggQEAKIAl1bnNpZ25lZCBsb25nCQlnZW5lcmF0aW9uOwogCXUzMgkJCXNsb3RfbnI7CiAJdTMyCQkgCXNlcV9ucjsKLQl1bnNpZ25lZCBpbnQJCWludGVycnVwdGVkIDogMTsKKwl1bnNpZ25lZCBpbnQJCWludGVycnVwdGVkIDogMSwKKwkJCQlzZXFfZG9uZSA6IDE7CiB9OwogCiAvKiBTZXNzaW9ucyAqLwpAQCAtMzYsNiArMzcsNyBAQAogCXVuc2lnbmVkIGxvbmcgICB1c2VkX3Nsb3RzW1NMT1RfVEFCTEVfU1pdOyAvKiB1c2VkL3VudXNlZCBiaXRtYXAgKi8KIAlzcGlubG9ja190CXNsb3RfdGJsX2xvY2s7CiAJc3RydWN0IHJwY193YWl0X3F1ZXVlCXNsb3RfdGJsX3dhaXRxOwkvKiBhbGxvY2F0b3JzIG1heSB3YWl0IGhlcmUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAlzbG90X3dhaXRxOwkvKiBDb21wbGV0aW9uIHdhaXQgb24gc2xvdCAqLwogCXUzMgkJbWF4X3Nsb3RzOwkJLyogIyBzbG90cyBpbiB0YWJsZSAqLwogCXUzMgkJbWF4X3Nsb3RpZDsJCS8qIE1heCBhbGxvd2VkIHNsb3RpZCB2YWx1ZSAqLwogCXUzMgkJaGlnaGVzdF91c2VkX3Nsb3RpZDsJLyogc2VudCB0byBzZXJ2ZXIgb24gZWFjaCBTRVEuCkBAIC03OCw2ICs4MCw5IEBACiBleHRlcm4gdm9pZCBuZnM0X3NodXRkb3duX3Nsb3RfdGFibGUoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsKTsKIGV4dGVybiBzdHJ1Y3QgbmZzNF9zbG90ICpuZnM0X2FsbG9jX3Nsb3Qoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsKTsKIGV4dGVybiBzdHJ1Y3QgbmZzNF9zbG90ICpuZnM0X2xvb2t1cF9zbG90KHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCwgdTMyIHNsb3RpZCk7CitleHRlcm4gaW50IG5mczRfc2xvdF93YWl0X29uX3NlcWlkKHN0cnVjdCBuZnM0X3Nsb3RfdGFibGUgKnRibCwKKwkJdTMyIHNsb3RpZCwgdTMyIHNlcV9uciwKKwkJdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKIGV4dGVybiBib29sIG5mczRfdHJ5X3RvX2xvY2tfc2xvdChzdHJ1Y3QgbmZzNF9zbG90X3RhYmxlICp0YmwsIHN0cnVjdCBuZnM0X3Nsb3QgKnNsb3QpOwogZXh0ZXJuIHZvaWQgbmZzNF9mcmVlX3Nsb3Qoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsLCBzdHJ1Y3QgbmZzNF9zbG90ICpzbG90KTsKIGV4dGVybiB2b2lkIG5mczRfc2xvdF90YmxfZHJhaW5fY29tcGxldGUoc3RydWN0IG5mczRfc2xvdF90YWJsZSAqdGJsKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9wbmZzLmMgYi9mcy9uZnMvcG5mcy5jCmluZGV4IDcwODA2Y2EuLjJjOTNhODUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wbmZzLmMKKysrIGIvZnMvbmZzL3BuZnMuYwpAQCAtMzY1LDcgKzM2NSw4IEBACiAJLyogTWF0Y2hlZCBieSBwbmZzX2dldF9sYXlvdXRfaGRyIGluIHBuZnNfbGF5b3V0X2luc2VydF9sc2VnICovCiAJYXRvbWljX2RlYygmbG8tPnBsaF9yZWZjb3VudCk7CiAJaWYgKGxpc3RfZW1wdHkoJmxvLT5wbGhfc2VncykpIHsKLQkJc2V0X2JpdChORlNfTEFZT1VUX0lOVkFMSURfU1RJRCwgJmxvLT5wbGhfZmxhZ3MpOworCQlpZiAoYXRvbWljX3JlYWQoJmxvLT5wbGhfb3V0c3RhbmRpbmcpID09IDApCisJCQlzZXRfYml0KE5GU19MQVlPVVRfSU5WQUxJRF9TVElELCAmbG8tPnBsaF9mbGFncyk7CiAJCWNsZWFyX2JpdChORlNfTEFZT1VUX0JVTEtfUkVDQUxMLCAmbG8tPnBsaF9mbGFncyk7CiAJfQogCXJwY193YWtlX3VwKCZORlNfU0VSVkVSKGlub2RlKS0+cm9jX3JwY3dhaXRxKTsKQEAgLTc2OCwxNyArNzY5LDMyIEBACiAJcG5mc19kZXN0cm95X2xheW91dHNfYnljbGlkKGNscCwgZmFsc2UpOwogfQogCitzdGF0aWMgdm9pZAorcG5mc19jbGVhcl9sYXlvdXRyZXR1cm5faW5mbyhzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbykKK3sKKwlsby0+cGxoX3JldHVybl9pb21vZGUgPSAwOworCWxvLT5wbGhfcmV0dXJuX3NlcSA9IDA7CisJY2xlYXJfYml0KE5GU19MQVlPVVRfUkVUVVJOX1JFUVVFU1RFRCwgJmxvLT5wbGhfZmxhZ3MpOworfQorCiAvKiB1cGRhdGUgbG8tPnBsaF9zdGF0ZWlkIHdpdGggbmV3IGlmIGlzIG1vcmUgcmVjZW50ICovCiB2b2lkCiBwbmZzX3NldF9sYXlvdXRfc3RhdGVpZChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywgY29uc3QgbmZzNF9zdGF0ZWlkICpuZXcsCiAJCQlib29sIHVwZGF0ZV9iYXJyaWVyKQogewogCXUzMiBvbGRzZXEsIG5ld3NlcSwgbmV3X2JhcnJpZXIgPSAwOwotCWJvb2wgaW52YWxpZCA9ICFwbmZzX2xheW91dF9pc192YWxpZChsbyk7CiAKIAlvbGRzZXEgPSBiZTMyX3RvX2NwdShsby0+cGxoX3N0YXRlaWQuc2VxaWQpOwogCW5ld3NlcSA9IGJlMzJfdG9fY3B1KG5ldy0+c2VxaWQpOwotCWlmIChpbnZhbGlkIHx8IHBuZnNfc2VxaWRfaXNfbmV3ZXIobmV3c2VxLCBvbGRzZXEpKSB7CisKKwlpZiAoIXBuZnNfbGF5b3V0X2lzX3ZhbGlkKGxvKSkgeworCQluZnM0X3N0YXRlaWRfY29weSgmbG8tPnBsaF9zdGF0ZWlkLCBuZXcpOworCQlsby0+cGxoX2JhcnJpZXIgPSBuZXdzZXE7CisJCXBuZnNfY2xlYXJfbGF5b3V0cmV0dXJuX2luZm8obG8pOworCQljbGVhcl9iaXQoTkZTX0xBWU9VVF9JTlZBTElEX1NUSUQsICZsby0+cGxoX2ZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocG5mc19zZXFpZF9pc19uZXdlcihuZXdzZXEsIG9sZHNlcSkpIHsKIAkJbmZzNF9zdGF0ZWlkX2NvcHkoJmxvLT5wbGhfc3RhdGVpZCwgbmV3KTsKIAkJLyoKIAkJICogQmVjYXVzZSBvZiB3cmFwYXJvdW5kLCB3ZSB3YW50IHRvIGtlZXAgdGhlIGJhcnJpZXIKQEAgLTc5MCw3ICs4MDYsNyBAQAogCQluZXdfYmFycmllciA9IGJlMzJfdG9fY3B1KG5ldy0+c2VxaWQpOwogCWVsc2UgaWYgKG5ld19iYXJyaWVyID09IDApCiAJCXJldHVybjsKLQlpZiAoaW52YWxpZCB8fCBwbmZzX3NlcWlkX2lzX25ld2VyKG5ld19iYXJyaWVyLCBsby0+cGxoX2JhcnJpZXIpKQorCWlmIChwbmZzX3NlcWlkX2lzX25ld2VyKG5ld19iYXJyaWVyLCBsby0+cGxoX2JhcnJpZXIpKQogCQlsby0+cGxoX2JhcnJpZXIgPSBuZXdfYmFycmllcjsKIH0KIApAQCAtODg2LDE5ICs5MDIsMTQgQEAKIAlycGNfd2FrZV91cCgmTkZTX1NFUlZFUihsby0+cGxoX2lub2RlKS0+cm9jX3JwY3dhaXRxKTsKIH0KIAotc3RhdGljIHZvaWQKLXBuZnNfY2xlYXJfbGF5b3V0cmV0dXJuX2luZm8oc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8pCi17Ci0JbG8tPnBsaF9yZXR1cm5faW9tb2RlID0gMDsKLQlsby0+cGxoX3JldHVybl9zZXEgPSAwOwotCWNsZWFyX2JpdChORlNfTEFZT1VUX1JFVFVSTl9SRVFVRVNURUQsICZsby0+cGxoX2ZsYWdzKTsKLX0KLQogc3RhdGljIGJvb2wKIHBuZnNfcHJlcGFyZV9sYXlvdXRyZXR1cm4oc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCiAJCW5mczRfc3RhdGVpZCAqc3RhdGVpZCwKIAkJZW51bSBwbmZzX2lvbW9kZSAqaW9tb2RlKQogeworCS8qIFNlcmlhbGlzZSBMQVlPVVRHRVQvTEFZT1VUUkVUVVJOICovCisJaWYgKGF0b21pY19yZWFkKCZsby0+cGxoX291dHN0YW5kaW5nKSAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoTkZTX0xBWU9VVF9SRVRVUk4sICZsby0+cGxoX2ZsYWdzKSkKIAkJcmV0dXJuIGZhbHNlOwogCXBuZnNfZ2V0X2xheW91dF9oZHIobG8pOwpAQCAtMTU1NSw2ICsxNTY2LDcgQEAKIAl9CiAKIGxvb2t1cF9hZ2FpbjoKKwluZnM0X2NsaWVudF9yZWNvdmVyX2V4cGlyZWRfbGVhc2UoY2xwKTsKIAlmaXJzdCA9IGZhbHNlOwogCXNwaW5fbG9jaygmaW5vLT5pX2xvY2spOwogCWxvID0gcG5mc19maW5kX2FsbG9jX2xheW91dChpbm8sIGN0eCwgZ2ZwX2ZsYWdzKTsKQEAgLTE3OTcsMTYgKzE4MDksMTEgQEAKIAkJICovCiAJCXBuZnNfbWFya19sYXlvdXRfc3RhdGVpZF9pbnZhbGlkKGxvLCAmZnJlZV9tZSk7CiAKLQkJbmZzNF9zdGF0ZWlkX2NvcHkoJmxvLT5wbGhfc3RhdGVpZCwgJnJlcy0+c3RhdGVpZCk7Ci0JCWxvLT5wbGhfYmFycmllciA9IGJlMzJfdG9fY3B1KHJlcy0+c3RhdGVpZC5zZXFpZCk7CisJCXBuZnNfc2V0X2xheW91dF9zdGF0ZWlkKGxvLCAmcmVzLT5zdGF0ZWlkLCB0cnVlKTsKIAl9CiAKIAlwbmZzX2dldF9sc2VnKGxzZWcpOwogCXBuZnNfbGF5b3V0X2luc2VydF9sc2VnKGxvLCBsc2VnLCAmZnJlZV9tZSk7Ci0JaWYgKCFwbmZzX2xheW91dF9pc192YWxpZChsbykpIHsKLQkJcG5mc19jbGVhcl9sYXlvdXRyZXR1cm5faW5mbyhsbyk7Ci0JCWNsZWFyX2JpdChORlNfTEFZT1VUX0lOVkFMSURfU1RJRCwgJmxvLT5wbGhfZmxhZ3MpOwotCX0KIAogCiAJaWYgKHJlcy0+cmV0dXJuX29uX2Nsb3NlKQpAQCAtMjUxMCw3ICsyNTE3LDYgQEAKIAogCWRhdGEtPmFyZ3MuZmggPSBORlNfRkgoaW5vZGUpOwogCWRhdGEtPmFyZ3MuaW5vZGUgPSBpbm9kZTsKLQluZnM0X3N0YXRlaWRfY29weSgmZGF0YS0+YXJncy5zdGF0ZWlkLCAmaGRyLT5wbGhfc3RhdGVpZCk7CiAJc3RhdHVzID0gbGQtPnByZXBhcmVfbGF5b3V0c3RhdHMoJmRhdGEtPmFyZ3MpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gb3V0X2ZyZWU7CmRpZmYgLS1naXQgYS9mcy9uZnMvc3VwZXIuYyBiL2ZzL25mcy9zdXBlci5jCmluZGV4IDE4ZDQ0NmUuLmQzOTYwMTMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9zdXBlci5jCisrKyBiL2ZzL25mcy9zdXBlci5jCkBAIC05MjMsNiArOTIzLDggQEAKIAogCWRhdGEgPSBremFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwogCWlmIChkYXRhKSB7CisJCWRhdGEtPnRpbWVvCQk9IE5GU19VTlNQRUNfVElNRU87CisJCWRhdGEtPnJldHJhbnMJCT0gTkZTX1VOU1BFQ19SRVRSQU5TOwogCQlkYXRhLT5hY3JlZ21pbgkJPSBORlNfREVGX0FDUkVHTUlOOwogCQlkYXRhLT5hY3JlZ21heAkJPSBORlNfREVGX0FDUkVHTUFYOwogCQlkYXRhLT5hY2Rpcm1pbgkJPSBORlNfREVGX0FDRElSTUlOOwpAQCAtMTE4OSw2ICsxMTkxLDE5IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IG5mc19nZXRfb3B0aW9uX3VsX2JvdW5kKHN1YnN0cmluZ190IGFyZ3NbXSwgdW5zaWduZWQgbG9uZyAqb3B0aW9uLAorCQl1bnNpZ25lZCBsb25nIGxfYm91bmQsIHVuc2lnbmVkIGxvbmcgdV9ib3VuZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gbmZzX2dldF9vcHRpb25fdWwoYXJncywgb3B0aW9uKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CisJaWYgKCpvcHRpb24gPCBsX2JvdW5kIHx8ICpvcHRpb24gPiB1X2JvdW5kKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIEVycm9yLWNoZWNrIGFuZCBjb252ZXJ0IGEgc3RyaW5nIG9mIG1vdW50IG9wdGlvbnMgZnJvbSB1c2VyIHNwYWNlIGludG8KICAqIGEgZGF0YSBzdHJ1Y3R1cmUuICBUaGUgd2hvbGUgbW91bnQgc3RyaW5nIGlzIHByb2Nlc3NlZDsgYmFkIG9wdGlvbnMgYXJlCkBAIC0xMzUyLDEyICsxMzY3LDEyIEBACiAJCQltbnQtPmJzaXplID0gb3B0aW9uOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3RpbWVvOgotCQkJaWYgKG5mc19nZXRfb3B0aW9uX3VsKGFyZ3MsICZvcHRpb24pIHx8IG9wdGlvbiA9PSAwKQorCQkJaWYgKG5mc19nZXRfb3B0aW9uX3VsX2JvdW5kKGFyZ3MsICZvcHRpb24sIDEsIElOVF9NQVgpKQogCQkJCWdvdG8gb3V0X2ludmFsaWRfdmFsdWU7CiAJCQltbnQtPnRpbWVvID0gb3B0aW9uOwogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3JldHJhbnM6Ci0JCQlpZiAobmZzX2dldF9vcHRpb25fdWwoYXJncywgJm9wdGlvbikgfHwgb3B0aW9uID09IDApCisJCQlpZiAobmZzX2dldF9vcHRpb25fdWxfYm91bmQoYXJncywgJm9wdGlvbiwgMCwgSU5UX01BWCkpCiAJCQkJZ290byBvdXRfaW52YWxpZF92YWx1ZTsKIAkJCW1udC0+cmV0cmFucyA9IG9wdGlvbjsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5LmMgYi9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYwppbmRleCBkMmY5N2VjLi5lMGU1ZjdjIDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYworKysgYi9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnkuYwpAQCAtNjcsMTggKzY3LDcgQEAKIAogCXByX2RlYnVnKCIlczogZ3JvdXA9JXAgZXZlbnQ9JXBcbiIsIF9fZnVuY19fLCBncm91cCwgZXZlbnQpOwogCi0Jd2FpdF9ldmVudChncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3Nfd2FpdHEsIGV2ZW50LT5yZXNwb25zZSB8fAotCQkJCWF0b21pY19yZWFkKCZncm91cC0+ZmFub3RpZnlfZGF0YS5ieXBhc3NfcGVybSkpOwotCi0JaWYgKCFldmVudC0+cmVzcG9uc2UpIHsJLyogYnlwYXNzX3Blcm0gc2V0ICovCi0JCS8qCi0JCSAqIEV2ZW50IHdhcyBjYW5jZWxlZCBiZWNhdXNlIGdyb3VwIGlzIGJlaW5nIGRlc3Ryb3llZC4gUmVtb3ZlCi0JCSAqIGl0IGZyb20gZ3JvdXAncyBldmVudCBsaXN0IGJlY2F1c2Ugd2UgYXJlIHJlc3BvbnNpYmxlIGZvcgotCQkgKiBmcmVlaW5nIHRoZSBwZXJtaXNzaW9uIGV2ZW50LgotCQkgKi8KLQkJZnNub3RpZnlfcmVtb3ZlX2V2ZW50KGdyb3VwLCAmZXZlbnQtPmZhZS5mc2UpOwotCQlyZXR1cm4gMDsKLQl9CisJd2FpdF9ldmVudChncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3Nfd2FpdHEsIGV2ZW50LT5yZXNwb25zZSk7CiAKIAkvKiB1c2Vyc3BhY2UgcmVzcG9uZGVkLCBjb252ZXJ0IHRvIHNvbWV0aGluZyB1c2FibGUgKi8KIAlzd2l0Y2ggKGV2ZW50LT5yZXNwb25zZSkgewpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5X3VzZXIuYyBiL2ZzL25vdGlmeS9mYW5vdGlmeS9mYW5vdGlmeV91c2VyLmMKaW5kZXggOGU4ZTZiYy4uYTY0MzEzOCAxMDA2NDQKLS0tIGEvZnMvbm90aWZ5L2Zhbm90aWZ5L2Zhbm90aWZ5X3VzZXIuYworKysgYi9mcy9ub3RpZnkvZmFub3RpZnkvZmFub3RpZnlfdXNlci5jCkBAIC0zNTgsMTYgKzM1OCwyMCBAQAogCiAjaWZkZWYgQ09ORklHX0ZBTk9USUZZX0FDQ0VTU19QRVJNSVNTSU9OUwogCXN0cnVjdCBmYW5vdGlmeV9wZXJtX2V2ZW50X2luZm8gKmV2ZW50LCAqbmV4dDsKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmZzbl9ldmVudDsKIAogCS8qCi0JICogVGhlcmUgbWF5IGJlIHN0aWxsIG5ldyBldmVudHMgYXJyaXZpbmcgaW4gdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZQotCSAqIGJ1dCBzaW5jZSB1c2Vyc3BhY2UgY2Fubm90IHVzZSBmYW5vdGlmeSBmZCBhbnltb3JlLCBubyBldmVudCBjYW4KLQkgKiBlbnRlciBvciBsZWF2ZSBhY2Nlc3NfbGlzdCBieSBub3cuCisJICogU3RvcCBuZXcgZXZlbnRzIGZyb20gYXJyaXZpbmcgaW4gdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZS4gc2luY2UKKwkgKiB1c2Vyc3BhY2UgY2Fubm90IHVzZSBmYW5vdGlmeSBmZCBhbnltb3JlLCBubyBldmVudCBjYW4gZW50ZXIgb3IKKwkgKiBsZWF2ZSBhY2Nlc3NfbGlzdCBieSBub3cgZWl0aGVyLgorCSAqLworCWZzbm90aWZ5X2dyb3VwX3N0b3BfcXVldWVpbmcoZ3JvdXApOworCisJLyoKKwkgKiBQcm9jZXNzIGFsbCBwZXJtaXNzaW9uIGV2ZW50cyBvbiBhY2Nlc3NfbGlzdCBhbmQgbm90aWZpY2F0aW9uIHF1ZXVlCisJICogYW5kIHNpbXVsYXRlIHJlcGx5IGZyb20gdXNlcnNwYWNlLgogCSAqLwogCXNwaW5fbG9jaygmZ3JvdXAtPmZhbm90aWZ5X2RhdGEuYWNjZXNzX2xvY2spOwotCi0JYXRvbWljX2luYygmZ3JvdXAtPmZhbm90aWZ5X2RhdGEuYnlwYXNzX3Blcm0pOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGV2ZW50LCBuZXh0LCAmZ3JvdXAtPmZhbm90aWZ5X2RhdGEuYWNjZXNzX2xpc3QsCiAJCQkJIGZhZS5mc2UubGlzdCkgewogCQlwcl9kZWJ1ZygiJXM6IGZvdW5kIGdyb3VwPSVwIGV2ZW50PSVwXG4iLCBfX2Z1bmNfXywgZ3JvdXAsCkBAIC0zNzksMTIgKzM4MywyMSBAQAogCXNwaW5fdW5sb2NrKCZncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3NfbG9jayk7CiAKIAkvKgotCSAqIFNpbmNlIGJ5cGFzc19wZXJtIGlzIHNldCwgbmV3bHkgcXVldWVkIGV2ZW50cyB3aWxsIG5vdCB3YWl0IGZvcgotCSAqIGFjY2VzcyByZXNwb25zZS4gV2FrZSB1cCB0aGUgYWxyZWFkeSBzbGVlcGluZyBvbmVzIG5vdy4KLQkgKiBzeW5jaHJvbml6ZV9zcmN1KCkgaW4gZnNub3RpZnlfZGVzdHJveV9ncm91cCgpIHdpbGwgd2FpdCBmb3IgYWxsCi0JICogcHJvY2Vzc2VzIHNsZWVwaW5nIGluIGZhbm90aWZ5X2hhbmRsZV9ldmVudCgpIHdhaXRpbmcgZm9yIGFjY2VzcwotCSAqIHJlc3BvbnNlIGFuZCB0aHVzIGFsc28gZm9yIGFsbCBwZXJtaXNzaW9uIGV2ZW50cyB0byBiZSBmcmVlZC4KKwkgKiBEZXN0cm95IGFsbCBub24tcGVybWlzc2lvbiBldmVudHMuIEZvciBwZXJtaXNzaW9uIGV2ZW50cyBqdXN0CisJICogZGVxdWV1ZSB0aGVtIGFuZCBzZXQgdGhlIHJlc3BvbnNlLiBUaGV5IHdpbGwgYmUgZnJlZWQgb25jZSB0aGUKKwkgKiByZXNwb25zZSBpcyBjb25zdW1lZCBhbmQgZmFub3RpZnlfZ2V0X3Jlc3BvbnNlKCkgcmV0dXJucy4KIAkgKi8KKwltdXRleF9sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKKwl3aGlsZSAoIWZzbm90aWZ5X25vdGlmeV9xdWV1ZV9pc19lbXB0eShncm91cCkpIHsKKwkJZnNuX2V2ZW50ID0gZnNub3RpZnlfcmVtb3ZlX2ZpcnN0X2V2ZW50KGdyb3VwKTsKKwkJaWYgKCEoZnNuX2V2ZW50LT5tYXNrICYgRkFOX0FMTF9QRVJNX0VWRU5UUykpCisJCQlmc25vdGlmeV9kZXN0cm95X2V2ZW50KGdyb3VwLCBmc25fZXZlbnQpOworCQllbHNlCisJCQlGQU5PVElGWV9QRShmc25fZXZlbnQpLT5yZXNwb25zZSA9IEZBTl9BTExPVzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKKworCS8qIFJlc3BvbnNlIGZvciBhbGwgcGVybWlzc2lvbiBldmVudHMgaXQgc2V0LCB3YWtldXAgd2FpdGVycyAqLwogCXdha2VfdXAoJmdyb3VwLT5mYW5vdGlmeV9kYXRhLmFjY2Vzc193YWl0cSk7CiAjZW5kaWYKIApAQCAtNzU1LDcgKzc2OCw2IEBACiAJc3Bpbl9sb2NrX2luaXQoJmdyb3VwLT5mYW5vdGlmeV9kYXRhLmFjY2Vzc19sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3Nfd2FpdHEpOwogCUlOSVRfTElTVF9IRUFEKCZncm91cC0+ZmFub3RpZnlfZGF0YS5hY2Nlc3NfbGlzdCk7Ci0JYXRvbWljX3NldCgmZ3JvdXAtPmZhbm90aWZ5X2RhdGEuYnlwYXNzX3Blcm0sIDApOwogI2VuZGlmCiAJc3dpdGNoIChmbGFncyAmIEZBTl9BTExfQ0xBU1NfQklUUykgewogCWNhc2UgRkFOX0NMQVNTX05PVElGOgpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2dyb3VwLmMgYi9mcy9ub3RpZnkvZ3JvdXAuYwppbmRleCAzZTJkZDg1Li5iNDdmN2NmIDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvZ3JvdXAuYworKysgYi9mcy9ub3RpZnkvZ3JvdXAuYwpAQCAtNDAsNiArNDAsMTcgQEAKIH0KIAogLyoKKyAqIFN0b3AgcXVldWVpbmcgbmV3IGV2ZW50cyBmb3IgdGhpcyBncm91cC4gT25jZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAqIGZzbm90aWZ5X2FkZF9ldmVudCgpIHdpbGwgbm90IGFkZCBhbnkgbmV3IGV2ZW50cyB0byB0aGUgZ3JvdXAncyBxdWV1ZS4KKyAqLwordm9pZCBmc25vdGlmeV9ncm91cF9zdG9wX3F1ZXVlaW5nKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApCit7CisJbXV0ZXhfbG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7CisJZ3JvdXAtPnNodXRkb3duID0gdHJ1ZTsKKwltdXRleF91bmxvY2soJmdyb3VwLT5ub3RpZmljYXRpb25fbXV0ZXgpOworfQorCisvKgogICogVHJ5aW5nIHRvIGdldCByaWQgb2YgYSBncm91cC4gUmVtb3ZlIGFsbCBtYXJrcywgZmx1c2ggYWxsIGV2ZW50cyBhbmQgcmVsZWFzZQogICogdGhlIGdyb3VwIHJlZmVyZW5jZS4KICAqIE5vdGUgdGhhdCBhbm90aGVyIHRocmVhZCBjYWxsaW5nIGZzbm90aWZ5X2NsZWFyX21hcmtzX2J5X2dyb3VwKCkgbWF5IHN0aWxsCkBAIC00Nyw2ICs1OCwxNCBAQAogICovCiB2b2lkIGZzbm90aWZ5X2Rlc3Ryb3lfZ3JvdXAoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCkKIHsKKwkvKgorCSAqIFN0b3AgcXVldWVpbmcgbmV3IGV2ZW50cy4gVGhlIGNvZGUgYmVsb3cgaXMgY2FyZWZ1bCBlbm91Z2ggdG8gbm90CisJICogcmVxdWlyZSB0aGlzIGJ1dCBmYW5vdGlmeSBuZWVkcyB0byBzdG9wIHF1ZXVpbmcgZXZlbnRzIGV2ZW4gYmVmb3JlCisJICogZnNub3RpZnlfZGVzdHJveV9ncm91cCgpIGlzIGNhbGxlZCBhbmQgdGhpcyBtYWtlcyB0aGUgb3RoZXIgY2FsbGVycworCSAqIG9mIGZzbm90aWZ5X2Rlc3Ryb3lfZ3JvdXAoKSB0byBzZWUgdGhlIHNhbWUgYmVoYXZpb3IuCisJICovCisJZnNub3RpZnlfZ3JvdXBfc3RvcF9xdWV1ZWluZyhncm91cCk7CisKIAkvKiBjbGVhciBhbGwgaW5vZGUgbWFya3MgZm9yIHRoaXMgZ3JvdXAsIGF0dGFjaCB0aGVtIHRvIGRlc3Ryb3lfbGlzdCAqLwogCWZzbm90aWZ5X2RldGFjaF9ncm91cF9tYXJrcyhncm91cCk7CiAKZGlmZiAtLWdpdCBhL2ZzL25vdGlmeS9ub3RpZmljYXRpb24uYyBiL2ZzL25vdGlmeS9ub3RpZmljYXRpb24uYwppbmRleCBhOTVkOGUwLi5lNDU1ZTgzIDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvbm90aWZpY2F0aW9uLmMKKysrIGIvZnMvbm90aWZ5L25vdGlmaWNhdGlvbi5jCkBAIC04Miw3ICs4Miw4IEBACiAgKiBBZGQgYW4gZXZlbnQgdG8gdGhlIGdyb3VwIG5vdGlmaWNhdGlvbiBxdWV1ZS4gIFRoZSBncm91cCBjYW4gbGF0ZXIgcHVsbCB0aGlzCiAgKiBldmVudCBvZmYgdGhlIHF1ZXVlIHRvIGRlYWwgd2l0aC4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIDAgaWYgdGhlIGV2ZW50IHdhcwogICogYWRkZWQgdG8gdGhlIHF1ZXVlLCAxIGlmIHRoZSBldmVudCB3YXMgbWVyZ2VkIHdpdGggc29tZSBvdGhlciBxdWV1ZWQgZXZlbnQsCi0gKiAyIGlmIHRoZSBxdWV1ZSBvZiBldmVudHMgaGFzIG92ZXJmbG93bi4KKyAqIDIgaWYgdGhlIGV2ZW50IHdhcyBub3QgcXVldWVkIC0gZWl0aGVyIHRoZSBxdWV1ZSBvZiBldmVudHMgaGFzIG92ZXJmbG93bgorICogb3IgdGhlIGdyb3VwIGlzIHNodXR0aW5nIGRvd24uCiAgKi8KIGludCBmc25vdGlmeV9hZGRfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwKIAkJICAgICAgIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQsCkBAIC05Niw2ICs5NywxMSBAQAogCiAJbXV0ZXhfbG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7CiAKKwlpZiAoZ3JvdXAtPnNodXRkb3duKSB7CisJCW11dGV4X3VubG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7CisJCXJldHVybiAyOworCX0KKwogCWlmIChncm91cC0+cV9sZW4gPj0gZ3JvdXAtPm1heF9ldmVudHMpIHsKIAkJcmV0ID0gMjsKIAkJLyogUXVldWUgb3ZlcmZsb3cgZXZlbnQgb25seSBpZiBpdCBpc24ndCBhbHJlYWR5IHF1ZXVlZCAqLwpAQCAtMTI2LDIxICsxMzIsNiBAQAogfQogCiAvKgotICogUmVtb3ZlIEBldmVudCBmcm9tIGdyb3VwJ3Mgbm90aWZpY2F0aW9uIHF1ZXVlLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YKLSAqIHRoZSBjYWxsZXIgdG8gZGVzdHJveSB0aGUgZXZlbnQuCi0gKi8KLXZvaWQgZnNub3RpZnlfcmVtb3ZlX2V2ZW50KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXAsCi0JCQkgICBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50KQotewotCW11dGV4X2xvY2soJmdyb3VwLT5ub3RpZmljYXRpb25fbXV0ZXgpOwotCWlmICghbGlzdF9lbXB0eSgmZXZlbnQtPmxpc3QpKSB7Ci0JCWxpc3RfZGVsX2luaXQoJmV2ZW50LT5saXN0KTsKLQkJZ3JvdXAtPnFfbGVuLS07Ci0JfQotCW11dGV4X3VubG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7Ci19Ci0KLS8qCiAgKiBSZW1vdmUgYW5kIHJldHVybiB0aGUgZmlyc3QgZXZlbnQgZnJvbSB0aGUgbm90aWZpY2F0aW9uIGxpc3QuICBJdCBpcyB0aGUKICAqIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gZGVzdHJveSB0aGUgb2J0YWluZWQgZXZlbnQKICAqLwpkaWZmIC0tZ2l0IGEvZnMvbnNmcy5jIGIvZnMvbnNmcy5jCmluZGV4IDhmMjBkNjAuLjMwYmIxMDAgMTAwNjQ0Ci0tLSBhL2ZzL25zZnMuYworKysgYi9mcy9uc2ZzLmMKQEAgLTUsMTEgKzUsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L25zZnMuaD4KIAogc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqbnNmc19tbnQ7CiAKK3N0YXRpYyBsb25nIG5zX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgaW9jdGwsCisJCQl1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBuc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnVubG9ja2VkX2lvY3RsID0gbnNfaW9jdGwsCiB9OwogCiBzdGF0aWMgY2hhciAqbnNfZG5hbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIGludCBidWZsZW4pCkBAIC00NCwyMiArNDksMTQgQEAKIAlucy0+b3BzLT5wdXQobnMpOwogfQogCi12b2lkICpuc19nZXRfcGF0aChzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkJY29uc3Qgc3RydWN0IHByb2NfbnNfb3BlcmF0aW9ucyAqbnNfb3BzKQorc3RhdGljIHZvaWQgKl9fbnNfZ2V0X3BhdGgoc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBuc19jb21tb24gKm5zKQogewotCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gbW50Z2V0KG5zZnNfbW50KTsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IG5zZnNfbW50OwogCXN0cnVjdCBxc3RyIHFuYW1lID0geyAubmFtZSA9ICIiLCB9OwogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBuc19jb21tb24gKm5zOwogCXVuc2lnbmVkIGxvbmcgZDsKIAotYWdhaW46Ci0JbnMgPSBuc19vcHMtPmdldCh0YXNrKTsKLQlpZiAoIW5zKSB7Ci0JCW1udHB1dChtbnQpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKLQl9CiAJcmN1X3JlYWRfbG9jaygpOwogCWQgPSBhdG9taWNfbG9uZ19yZWFkKCZucy0+c3Rhc2hlZCk7CiAJaWYgKCFkKQpAQCAtNjgsMTcgKzY1LDE2IEBACiAJaWYgKCFsb2NrcmVmX2dldF9ub3RfZGVhZCgmZGVudHJ5LT5kX2xvY2tyZWYpKQogCQlnb3RvIHNsb3c7CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JbnNfb3BzLT5wdXQobnMpOworCW5zLT5vcHMtPnB1dChucyk7CiBnb3RfaXQ6Ci0JcGF0aC0+bW50ID0gbW50OworCXBhdGgtPm1udCA9IG1udGdldChtbnQpOwogCXBhdGgtPmRlbnRyeSA9IGRlbnRyeTsKIAlyZXR1cm4gTlVMTDsKIHNsb3c6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJaW5vZGUgPSBuZXdfaW5vZGVfcHNldWRvKG1udC0+bW50X3NiKTsKIAlpZiAoIWlub2RlKSB7Ci0JCW5zX29wcy0+cHV0KG5zKTsKLQkJbW50cHV0KG1udCk7CisJCW5zLT5vcHMtPnB1dChucyk7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAlpbm9kZS0+aV9pbm8gPSBucy0+aW51bTsKQEAgLTkxLDIxICs4Nyw5NiBAQAogCWRlbnRyeSA9IGRfYWxsb2NfcHNldWRvKG1udC0+bW50X3NiLCAmcW5hbWUpOwogCWlmICghZGVudHJ5KSB7CiAJCWlwdXQoaW5vZGUpOwotCQltbnRwdXQobW50KTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Ci0JZGVudHJ5LT5kX2ZzZGF0YSA9ICh2b2lkICopbnNfb3BzOworCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKW5zLT5vcHM7CiAJZCA9IGF0b21pY19sb25nX2NtcHhjaGcoJm5zLT5zdGFzaGVkLCAwLCAodW5zaWduZWQgbG9uZylkZW50cnkpOwogCWlmIChkKSB7CiAJCWRfZGVsZXRlKGRlbnRyeSk7CS8qIG1ha2Ugc3VyZSAtPmRfcHJ1bmUoKSBkb2VzIG5vdGhpbmcgKi8KIAkJZHB1dChkZW50cnkpOwogCQljcHVfcmVsYXgoKTsKLQkJZ290byBhZ2FpbjsKKwkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CiAJfQogCWdvdG8gZ290X2l0OwogfQogCit2b2lkICpuc19nZXRfcGF0aChzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJY29uc3Qgc3RydWN0IHByb2NfbnNfb3BlcmF0aW9ucyAqbnNfb3BzKQoreworCXN0cnVjdCBuc19jb21tb24gKm5zOworCXZvaWQgKnJldDsKKworYWdhaW46CisJbnMgPSBuc19vcHMtPmdldCh0YXNrKTsKKwlpZiAoIW5zKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKworCXJldCA9IF9fbnNfZ2V0X3BhdGgocGF0aCwgbnMpOworCWlmIChJU19FUlIocmV0KSAmJiBQVFJfRVJSKHJldCkgPT0gLUVBR0FJTikKKwkJZ290byBhZ2FpbjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9wZW5fcmVsYXRlZF9ucyhzdHJ1Y3QgbnNfY29tbW9uICpucywKKwkJICAgc3RydWN0IG5zX2NvbW1vbiAqKCpnZXRfbnMpKHN0cnVjdCBuc19jb21tb24gKm5zKSkKK3sKKwlzdHJ1Y3QgcGF0aCBwYXRoID0ge307CisJc3RydWN0IGZpbGUgKmY7CisJdm9pZCAqZXJyOworCWludCBmZDsKKworCWZkID0gZ2V0X3VudXNlZF9mZF9mbGFncyhPX0NMT0VYRUMpOworCWlmIChmZCA8IDApCisJCXJldHVybiBmZDsKKworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBuc19jb21tb24gKnJlbGF0aXZlOworCisJCXJlbGF0aXZlID0gZ2V0X25zKG5zKTsKKwkJaWYgKElTX0VSUihyZWxhdGl2ZSkpIHsKKwkJCXB1dF91bnVzZWRfZmQoZmQpOworCQkJcmV0dXJuIFBUUl9FUlIocmVsYXRpdmUpOworCQl9CisKKwkJZXJyID0gX19uc19nZXRfcGF0aCgmcGF0aCwgcmVsYXRpdmUpOworCQlpZiAoSVNfRVJSKGVycikgJiYgUFRSX0VSUihlcnIpID09IC1FQUdBSU4pCisJCQljb250aW51ZTsKKwkJYnJlYWs7CisJfQorCWlmIChJU19FUlIoZXJyKSkgeworCQlwdXRfdW51c2VkX2ZkKGZkKTsKKwkJcmV0dXJuIFBUUl9FUlIoZXJyKTsKKwl9CisKKwlmID0gZGVudHJ5X29wZW4oJnBhdGgsIE9fUkRPTkxZLCBjdXJyZW50X2NyZWQoKSk7CisJcGF0aF9wdXQoJnBhdGgpOworCWlmIChJU19FUlIoZikpIHsKKwkJcHV0X3VudXNlZF9mZChmZCk7CisJCWZkID0gUFRSX0VSUihmKTsKKwl9IGVsc2UKKwkJZmRfaW5zdGFsbChmZCwgZik7CisKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyBsb25nIG5zX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgaW9jdGwsCisJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbnNfY29tbW9uICpucyA9IGdldF9wcm9jX25zKGZpbGVfaW5vZGUoZmlscCkpOworCisJc3dpdGNoIChpb2N0bCkgeworCWNhc2UgTlNfR0VUX1VTRVJOUzoKKwkJcmV0dXJuIG9wZW5fcmVsYXRlZF9ucyhucywgbnNfZ2V0X293bmVyKTsKKwljYXNlIE5TX0dFVF9QQVJFTlQ6CisJCWlmICghbnMtPm9wcy0+Z2V0X3BhcmVudCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gb3Blbl9yZWxhdGVkX25zKG5zLCBucy0+b3BzLT5nZXRfcGFyZW50KTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9Cit9CisKIGludCBuc19nZXRfbmFtZShjaGFyICpidWYsIHNpemVfdCBzaXplLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCiAJCQljb25zdCBzdHJ1Y3QgcHJvY19uc19vcGVyYXRpb25zICpuc19vcHMpCiB7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hbGxvYy5jIGIvZnMvb2NmczIvYWxsb2MuYwppbmRleCA3ZGFiYmMzLi5mMTY1Zjg2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hbGxvYy5jCisrKyBiL2ZzL29jZnMyL2FsbG9jLmMKQEAgLTU5MjIsNyArNTkyMiw2IEBACiB9CiAKIHN0YXRpYyBpbnQgb2NmczJfcmVwbGF5X3RydW5jYXRlX3JlY29yZHMoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCi0JCQkJCSBoYW5kbGVfdCAqaGFuZGxlLAogCQkJCQkgc3RydWN0IGlub2RlICpkYXRhX2FsbG9jX2lub2RlLAogCQkJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpkYXRhX2FsbG9jX2JoKQogewpAQCAtNTkzNSwxMSArNTkzNCwxOSBAQAogCXN0cnVjdCBvY2ZzMl90cnVuY2F0ZV9sb2cgKnRsOwogCXN0cnVjdCBpbm9kZSAqdGxfaW5vZGUgPSBvc2ItPm9zYl90bF9pbm9kZTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRsX2JoID0gb3NiLT5vc2JfdGxfYmg7CisJaGFuZGxlX3QgKmhhbmRsZTsKIAogCWRpID0gKHN0cnVjdCBvY2ZzMl9kaW5vZGUgKikgdGxfYmgtPmJfZGF0YTsKIAl0bCA9ICZkaS0+aWQyLmlfZGVhbGxvYzsKIAlpID0gbGUxNl90b19jcHUodGwtPnRsX3VzZWQpIC0gMTsKIAl3aGlsZSAoaSA+PSAwKSB7CisJCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfVFJVTkNBVEVfTE9HX0ZMVVNIX09ORV9SRUMpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJCXN0YXR1cyA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCW1sb2dfZXJybm8oc3RhdHVzKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCiAJCS8qIENhbGxlciBoYXMgZ2l2ZW4gdXMgYXQgbGVhc3QgZW5vdWdoIGNyZWRpdHMgdG8KIAkJICogdXBkYXRlIHRoZSB0cnVuY2F0ZSBsb2cgZGlub2RlICovCiAJCXN0YXR1cyA9IG9jZnMyX2pvdXJuYWxfYWNjZXNzX2RpKGhhbmRsZSwgSU5PREVfQ0FDSEUodGxfaW5vZGUpLCB0bF9iaCwKQEAgLTU5NzQsMTIgKzU5ODEsNyBAQAogCQkJfQogCQl9CiAKLQkJc3RhdHVzID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwKLQkJCQlPQ0ZTMl9UUlVOQ0FURV9MT0dfRkxVU0hfT05FX1JFQyk7Ci0JCWlmIChzdGF0dXMgPCAwKSB7Ci0JCQltbG9nX2Vycm5vKHN0YXR1cyk7Ci0JCQlnb3RvIGJhaWw7Ci0JCX0KKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAkJaS0tOwogCX0KIApAQCAtNTk5NCw3ICs1OTk2LDYgQEAKIHsKIAlpbnQgc3RhdHVzOwogCXVuc2lnbmVkIGludCBudW1fdG9fZmx1c2g7Ci0JaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgaW5vZGUgKnRsX2lub2RlID0gb3NiLT5vc2JfdGxfaW5vZGU7CiAJc3RydWN0IGlub2RlICpkYXRhX2FsbG9jX2lub2RlID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRsX2JoID0gb3NiLT5vc2JfdGxfYmg7CkBAIC02MDM4LDIxICs2MDM5LDExIEBACiAJCWdvdG8gb3V0X211dGV4OwogCX0KIAotCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfVFJVTkNBVEVfTE9HX0ZMVVNIX09ORV9SRUMpOwotCWlmIChJU19FUlIoaGFuZGxlKSkgewotCQlzdGF0dXMgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCXN0YXR1cyA9IG9jZnMyX3JlcGxheV90cnVuY2F0ZV9yZWNvcmRzKG9zYiwgaGFuZGxlLCBkYXRhX2FsbG9jX2lub2RlLAorCXN0YXR1cyA9IG9jZnMyX3JlcGxheV90cnVuY2F0ZV9yZWNvcmRzKG9zYiwgZGF0YV9hbGxvY19pbm9kZSwKIAkJCQkJICAgICAgIGRhdGFfYWxsb2NfYmgpOwogCWlmIChzdGF0dXMgPCAwKQogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAKLQlvY2ZzMl9jb21taXRfdHJhbnMob3NiLCBoYW5kbGUpOwotCi1vdXRfdW5sb2NrOgogCWJyZWxzZShkYXRhX2FsbG9jX2JoKTsKIAlvY2ZzMl9pbm9kZV91bmxvY2soZGF0YV9hbGxvY19pbm9kZSwgMSk7CiAKQEAgLTY0MTMsNDMgKzY0MDQsMzQgQEAKIAkJZ290byBvdXRfbXV0ZXg7CiAJfQogCi0JaGFuZGxlID0gb2NmczJfc3RhcnRfdHJhbnMob3NiLCBPQ0ZTMl9TVUJBTExPQ19GUkVFKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQltbG9nX2Vycm5vKHJldCk7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KIAl3aGlsZSAoaGVhZCkgewogCQlpZiAoaGVhZC0+ZnJlZV9iZykKIAkJCWJnX2Jsa25vID0gaGVhZC0+ZnJlZV9iZzsKIAkJZWxzZQogCQkJYmdfYmxrbm8gPSBvY2ZzMl93aGljaF9zdWJhbGxvY19ncm91cChoZWFkLT5mcmVlX2JsaywKIAkJCQkJCQkgICAgICBoZWFkLT5mcmVlX2JpdCk7CisJCWhhbmRsZSA9IG9jZnMyX3N0YXJ0X3RyYW5zKG9zYiwgT0NGUzJfU1VCQUxMT0NfRlJFRSk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKIAkJdHJhY2Vfb2NmczJfZnJlZV9jYWNoZWRfYmxvY2tzKAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaGVhZC0+ZnJlZV9ibGssIGhlYWQtPmZyZWVfYml0KTsKIAogCQlyZXQgPSBvY2ZzMl9mcmVlX3N1YmFsbG9jX2JpdHMoaGFuZGxlLCBpbm9kZSwgZGlfYmgsCiAJCQkJCSAgICAgICBoZWFkLT5mcmVlX2JpdCwgYmdfYmxrbm8sIDEpOwotCQlpZiAocmV0KSB7CisJCWlmIChyZXQpCiAJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dF9qb3VybmFsOwotCQl9CiAKLQkJcmV0ID0gb2NmczJfZXh0ZW5kX3RyYW5zKGhhbmRsZSwgT0NGUzJfU1VCQUxMT0NfRlJFRSk7Ci0JCWlmIChyZXQpIHsKLQkJCW1sb2dfZXJybm8ocmV0KTsKLQkJCWdvdG8gb3V0X2pvdXJuYWw7Ci0JCX0KKwkJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAogCQl0bXAgPSBoZWFkOwogCQloZWFkID0gaGVhZC0+ZnJlZV9uZXh0OwogCQlrZnJlZSh0bXApOwogCX0KIAotb3V0X2pvdXJuYWw6Ci0Jb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKLQogb3V0X3VubG9jazoKIAlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIDEpOwogCWJyZWxzZShkaV9iaCk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9hb3BzLmMgYi9mcy9vY2ZzMi9hb3BzLmMKaW5kZXggOThkMzY1NC4uYmJiNGIzZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYW9wcy5jCisrKyBiL2ZzL29jZnMyL2FvcHMuYwpAQCAtMTg0Miw2ICsxODQyLDE2IEBACiAJb2NmczJfY29tbWl0X3RyYW5zKG9zYiwgaGFuZGxlKTsKIAogb3V0OgorCS8qCisJICogVGhlIG1tYXBwZWQgcGFnZSB3b24ndCBiZSB1bmxvY2tlZCBpbiBvY2ZzMl9mcmVlX3dyaXRlX2N0eHQoKSwKKwkgKiBldmVuIGluIGNhc2Ugb2YgZXJyb3IgaGVyZSBsaWtlIEVOT1NQQyBhbmQgRU5PTUVNLiBTbywgd2UgbmVlZAorCSAqIHRvIHVubG9jayB0aGUgdGFyZ2V0IHBhZ2UgbWFudWFsbHkgdG8gcHJldmVudCBkZWFkbG9ja3Mgd2hlbgorCSAqIHJldHJ5aW5nIGFnYWluIG9uIEVOT1NQQywgb3Igd2hlbiByZXR1cm5pbmcgbm9uLVZNX0ZBVUxUX0xPQ0tFRAorCSAqIHRvIFZNIGNvZGUuCisJICovCisJaWYgKHdjLT53X3RhcmdldF9sb2NrZWQpCisJCXVubG9ja19wYWdlKG1tYXBfcGFnZSk7CisKIAlvY2ZzMl9mcmVlX3dyaXRlX2N0eHQoaW5vZGUsIHdjKTsKIAogCWlmIChkYXRhX2FjKSB7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL3RjcF9pbnRlcm5hbC5oIGIvZnMvb2NmczIvY2x1c3Rlci90Y3BfaW50ZXJuYWwuaAppbmRleCA5NGIxODM2Li5iOTVlN2RmIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL3RjcF9pbnRlcm5hbC5oCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvdGNwX2ludGVybmFsLmgKQEAgLTQ0LDkgKzQ0LDYgQEAKICAqIHZlcnNpb24gaGVyZSBpbiB0Y3BfaW50ZXJuYWwuaCBzaG91bGQgbm90IG5lZWQgdG8gYmUgYnVtcGVkIGZvcgogICogZmlsZXN5c3RlbSBsb2NraW5nIGNoYW5nZXMuCiAgKgotICogTmV3IGluIHZlcnNpb24gMTIKLSAqCS0gTmVnb3RpYXRlIGhiIHRpbWVvdXQgd2hlbiBzdG9yYWdlIGlzIGRvd24uCi0gKgogICogTmV3IGluIHZlcnNpb24gMTEKICAqIAktIE5lZ290aWF0aW9uIG9mIGZpbGVzeXN0ZW0gbG9ja2luZyBpbiB0aGUgZGxtIGpvaW4uCiAgKgpAQCAtNzgsNyArNzUsNyBAQAogICogCS0gZnVsbCA2NCBiaXQgaV9zaXplIGluIHRoZSBtZXRhZGF0YSBsb2NrIGx2YnMKICAqIAktIGludHJvZHVjdGlvbiBvZiAicnciIGxvY2sgYW5kIHB1c2hpbmcgbWV0YS9kYXRhIGxvY2tpbmcgZG93bgogICovCi0jZGVmaW5lIE8yTkVUX1BST1RPQ09MX1ZFUlNJT04gMTJVTEwKKyNkZWZpbmUgTzJORVRfUFJPVE9DT0xfVkVSU0lPTiAxMVVMTAogc3RydWN0IG8ybmV0X2hhbmRzaGFrZSB7CiAJX19iZTY0CXByb3RvY29sX3ZlcnNpb247CiAJX19iZTY0CWNvbm5lY3Rvcl9pZDsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1jb252ZXJ0LmMgYi9mcy9vY2ZzMi9kbG0vZGxtY29udmVydC5jCmluZGV4IGNkZWFmYjQuLjBiYjEyODYgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2RsbS9kbG1jb252ZXJ0LmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWNvbnZlcnQuYwpAQCAtMjY4LDcgKzI2OCw2IEBACiAJCQkJICBzdHJ1Y3QgZGxtX2xvY2sgKmxvY2ssIGludCBmbGFncywgaW50IHR5cGUpCiB7CiAJZW51bSBkbG1fc3RhdHVzIHN0YXR1czsKLQl1OCBvbGRfb3duZXIgPSByZXMtPm93bmVyOwogCiAJbWxvZygwLCAidHlwZT0lZCwgY29udmVydF90eXBlPSVkLCBidXN5PSVkXG4iLCBsb2NrLT5tbC50eXBlLAogCSAgICAgbG9jay0+bWwuY29udmVydF90eXBlLCByZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX0lOX1BST0dSRVNTKTsKQEAgLTMzNSw3ICszMzQsNiBAQAogCiAJc3Bpbl9sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIAlyZXMtPnN0YXRlICY9IH5ETE1fTE9DS19SRVNfSU5fUFJPR1JFU1M7Ci0JbG9jay0+Y29udmVydF9wZW5kaW5nID0gMDsKIAkvKiBpZiBpdCBmYWlsZWQsIG1vdmUgaXQgYmFjayB0byBncmFudGVkIHF1ZXVlLgogCSAqIGlmIG1hc3RlciByZXR1cm5zIERMTV9OT1JNQUwgYW5kIHRoZW4gZG93biBiZWZvcmUgc2VuZGluZyBhc3QsCiAJICogaXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIG1vdmVkIHRvIGdyYW50ZWQgcXVldWUsIHJlc2V0IHRvCkBAIC0zNDQsMTIgKzM0MiwxNCBAQAogCQlpZiAoc3RhdHVzICE9IERMTV9OT1RRVUVVRUQpCiAJCQlkbG1fZXJyb3Ioc3RhdHVzKTsKIAkJZGxtX3JldmVydF9wZW5kaW5nX2NvbnZlcnQocmVzLCBsb2NrKTsKLQl9IGVsc2UgaWYgKChyZXMtPnN0YXRlICYgRExNX0xPQ0tfUkVTX1JFQ09WRVJJTkcpIHx8Ci0JCQkob2xkX293bmVyICE9IHJlcy0+b3duZXIpKSB7Ci0JCW1sb2coMCwgInJlcyAlLipzIGlzIGluIHJlY292ZXJpbmcgb3IgaGFzIGJlZW4gcmVjb3ZlcmVkLlxuIiwKLQkJCQlyZXMtPmxvY2tuYW1lLmxlbiwgcmVzLT5sb2NrbmFtZS5uYW1lKTsKKwl9IGVsc2UgaWYgKCFsb2NrLT5jb252ZXJ0X3BlbmRpbmcpIHsKKwkJbWxvZygwLCAiJXM6IHJlcyAlLipzLCBvd25lciBkaWVkIGFuZCBsb2NrIGhhcyBiZWVuIG1vdmVkIGJhY2sgIgorCQkJCSJ0byBncmFudGVkIGxpc3QsIHJldHJ5IGNvbnZlcnQuXG4iLAorCQkJCWRsbS0+bmFtZSwgcmVzLT5sb2NrbmFtZS5sZW4sIHJlcy0+bG9ja25hbWUubmFtZSk7CiAJCXN0YXR1cyA9IERMTV9SRUNPVkVSSU5HOwogCX0KKworCWxvY2stPmNvbnZlcnRfcGVuZGluZyA9IDA7CiBiYWlsOgogCXNwaW5fdW5sb2NrKCZyZXMtPnNwaW5sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5jIGIvZnMvb2NmczIvZmlsZS5jCmluZGV4IDRlN2IwZGMuLjhmOTE2MzkgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuYworKysgYi9mcy9vY2ZzMi9maWxlLmMKQEAgLTE1MDYsNyArMTUwNiw4IEBACiAJCQkJICAgICAgIHU2NCBzdGFydCwgdTY0IGxlbikKIHsKIAlpbnQgcmV0ID0gMDsKLQl1NjQgdG1wZW5kLCBlbmQgPSBzdGFydCArIGxlbjsKKwl1NjQgdG1wZW5kID0gMDsKKwl1NjQgZW5kID0gc3RhcnQgKyBsZW47CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7CiAJdW5zaWduZWQgaW50IGNzaXplID0gb3NiLT5zX2NsdXN0ZXJzaXplOwogCWhhbmRsZV90ICpoYW5kbGU7CkBAIC0xNTM4LDE4ICsxNTM5LDMxIEBACiAJfQogCiAJLyoKLQkgKiBXZSB3YW50IHRvIGdldCB0aGUgYnl0ZSBvZmZzZXQgb2YgdGhlIGVuZCBvZiB0aGUgMXN0IGNsdXN0ZXIuCisJICogSWYgc3RhcnQgaXMgb24gYSBjbHVzdGVyIGJvdW5kYXJ5IGFuZCBlbmQgaXMgc29tZXdoZXJlIGluIGFub3RoZXIKKwkgKiBjbHVzdGVyLCB3ZSBoYXZlIG5vdCBDT1dlZCB0aGUgY2x1c3RlciBzdGFydGluZyBhdCBzdGFydCwgdW5sZXNzCisJICogZW5kIGlzIGFsc28gd2l0aGluIHRoZSBzYW1lIGNsdXN0ZXIuIFNvLCBpbiB0aGlzIGNhc2UsIHdlIHNraXAgdGhpcworCSAqIGZpcnN0IGNhbGwgdG8gb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoKSB0cnVuY2F0ZSBhbmQgbW92ZSBvbgorCSAqIHRvIHRoZSBuZXh0IG9uZS4KIAkgKi8KLQl0bXBlbmQgPSAodTY0KW9zYi0+c19jbHVzdGVyc2l6ZSArIChzdGFydCAmIH4ob3NiLT5zX2NsdXN0ZXJzaXplIC0gMSkpOwotCWlmICh0bXBlbmQgPiBlbmQpCi0JCXRtcGVuZCA9IGVuZDsKKwlpZiAoKHN0YXJ0ICYgKGNzaXplIC0gMSkpICE9IDApIHsKKwkJLyoKKwkJICogV2Ugd2FudCB0byBnZXQgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZSBlbmQgb2YgdGhlIDFzdAorCQkgKiBjbHVzdGVyLgorCQkgKi8KKwkJdG1wZW5kID0gKHU2NClvc2ItPnNfY2x1c3RlcnNpemUgKworCQkJKHN0YXJ0ICYgfihvc2ItPnNfY2x1c3RlcnNpemUgLSAxKSk7CisJCWlmICh0bXBlbmQgPiBlbmQpCisJCQl0bXBlbmQgPSBlbmQ7CiAKLQl0cmFjZV9vY2ZzMl96ZXJvX3BhcnRpYWxfY2x1c3RlcnNfcmFuZ2UxKCh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnQsCi0JCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZyl0bXBlbmQpOworCQl0cmFjZV9vY2ZzMl96ZXJvX3BhcnRpYWxfY2x1c3RlcnNfcmFuZ2UxKAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzdGFydCwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdG1wZW5kKTsKIAotCXJldCA9IG9jZnMyX3plcm9fcmFuZ2VfZm9yX3RydW5jYXRlKGlub2RlLCBoYW5kbGUsIHN0YXJ0LCB0bXBlbmQpOwotCWlmIChyZXQpCi0JCW1sb2dfZXJybm8ocmV0KTsKKwkJcmV0ID0gb2NmczJfemVyb19yYW5nZV9mb3JfdHJ1bmNhdGUoaW5vZGUsIGhhbmRsZSwgc3RhcnQsCisJCQkJCQkgICAgdG1wZW5kKTsKKwkJaWYgKHJldCkKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwl9CiAKIAlpZiAodG1wZW5kIDwgZW5kKSB7CiAJCS8qCkBAIC0yMzA3LDM2ICsyMzIxLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdCBvY2ZzMl9maWxlX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICppbiwKLQkJCQkgICAgICBsb2ZmX3QgKnBwb3MsCi0JCQkJICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKLQkJCQkgICAgICBzaXplX3QgbGVuLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlpbnQgcmV0ID0gMCwgbG9ja19sZXZlbCA9IDA7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoaW4pOwotCi0JdHJhY2Vfb2NmczJfZmlsZV9zcGxpY2VfcmVhZChpbm9kZSwgaW4sIGluLT5mX3BhdGguZGVudHJ5LAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGlub2RlKS0+aXBfYmxrbm8sCi0JCQlpbi0+Zl9wYXRoLmRlbnRyeS0+ZF9uYW1lLmxlbiwKLQkJCWluLT5mX3BhdGguZGVudHJ5LT5kX25hbWUubmFtZSwgbGVuKTsKLQotCS8qCi0JICogU2VlIHRoZSBjb21tZW50IGluIG9jZnMyX2ZpbGVfcmVhZF9pdGVyKCkKLQkgKi8KLQlyZXQgPSBvY2ZzMl9pbm9kZV9sb2NrX2F0aW1lKGlub2RlLCBpbi0+Zl9wYXRoLm1udCwgJmxvY2tfbGV2ZWwpOwotCWlmIChyZXQgPCAwKSB7Ci0JCW1sb2dfZXJybm8ocmV0KTsKLQkJZ290byBiYWlsOwotCX0KLQlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIGxvY2tfbGV2ZWwpOwotCi0JcmV0ID0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkKGluLCBwcG9zLCBwaXBlLCBsZW4sIGZsYWdzKTsKLQotYmFpbDoKLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgc3NpemVfdCBvY2ZzMl9maWxlX3JlYWRfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsCiAJCQkJICAgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKQEAgLTI0OTUsNyArMjQ3OSw3IEBACiAjZW5kaWYKIAkubG9jawkJPSBvY2ZzMl9sb2NrLAogCS5mbG9jawkJPSBvY2ZzMl9mbG9jaywKLQkuc3BsaWNlX3JlYWQJPSBvY2ZzMl9maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIAkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkuZmFsbG9jYXRlCT0gb2NmczJfZmFsbG9jYXRlLAogfTsKQEAgLTI1NDAsNyArMjUyNCw3IEBACiAJLmNvbXBhdF9pb2N0bCAgID0gb2NmczJfY29tcGF0X2lvY3RsLAogI2VuZGlmCiAJLmZsb2NrCQk9IG9jZnMyX2Zsb2NrLAotCS5zcGxpY2VfcmVhZAk9IG9jZnMyX2ZpbGVfc3BsaWNlX3JlYWQsCisJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAogCS5zcGxpY2Vfd3JpdGUJPSBpdGVyX2ZpbGVfc3BsaWNlX3dyaXRlLAogCS5mYWxsb2NhdGUJPSBvY2ZzMl9mYWxsb2NhdGUsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvb2NmczJfdHJhY2UuaCBiL2ZzL29jZnMyL29jZnMyX3RyYWNlLmgKaW5kZXggZjhmNWZjNS4uMGI1OGFiYyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvb2NmczJfdHJhY2UuaAorKysgYi9mcy9vY2ZzMi9vY2ZzMl90cmFjZS5oCkBAIC0xMzE0LDggKzEzMTQsNiBAQAogCiBERUZJTkVfT0NGUzJfRklMRV9PUFMob2NmczJfZmlsZV9zcGxpY2Vfd3JpdGUpOwogCi1ERUZJTkVfT0NGUzJfRklMRV9PUFMob2NmczJfZmlsZV9zcGxpY2VfcmVhZCk7Ci0KIERFRklORV9PQ0ZTMl9GSUxFX09QUyhvY2ZzMl9maWxlX2Fpb19yZWFkKTsKIAogREVGSU5FX09DRlMyX1VMTF9VTExfVUxMX0VWRU5UKG9jZnMyX3RydW5jYXRlX2ZpbGUpOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuYyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKaW5kZXggZWE0NzEyMC4uNmFkMzUzMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuYworKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCkBAIC0xMTk5LDE0ICsxMTk5LDI0IEBACiAJCQlpbm9kZV91bmxvY2soKCphYyktPmFjX2lub2RlKTsKIAogCQkJcmV0ID0gb2NmczJfdHJ5X3RvX2ZyZWVfdHJ1bmNhdGVfbG9nKG9zYiwgYml0c193YW50ZWQpOwotCQkJaWYgKHJldCA9PSAxKQorCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJaXB1dCgoKmFjKS0+YWNfaW5vZGUpOworCQkJCSgqYWMpLT5hY19pbm9kZSA9IE5VTEw7CiAJCQkJZ290byByZXRyeTsKKwkJCX0KIAogCQkJaWYgKHJldCA8IDApCiAJCQkJbWxvZ19lcnJubyhyZXQpOwogCiAJCQlpbm9kZV9sb2NrKCgqYWMpLT5hY19pbm9kZSk7Ci0JCQlvY2ZzMl9pbm9kZV9sb2NrKCgqYWMpLT5hY19pbm9kZSwgTlVMTCwgMSk7CisJCQlyZXQgPSBvY2ZzMl9pbm9kZV9sb2NrKCgqYWMpLT5hY19pbm9kZSwgTlVMTCwgMSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlpbm9kZV91bmxvY2soKCphYyktPmFjX2lub2RlKTsKKwkJCQlpcHV0KCgqYWMpLT5hY19pbm9kZSk7CisJCQkJKCphYyktPmFjX2lub2RlID0gTlVMTDsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CiAJCX0KIAkJaWYgKHN0YXR1cyA8IDApIHsKIAkJCWlmIChzdGF0dXMgIT0gLUVOT1NQQykKZGlmZiAtLWdpdCBhL2ZzL29yYW5nZWZzL2RjYWNoZS5jIGIvZnMvb3JhbmdlZnMvZGNhY2hlLmMKaW5kZXggMDAyMzViZi4uMWU4ZmU4NCAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvZGNhY2hlLmMKKysrIGIvZnMvb3JhbmdlZnMvZGNhY2hlLmMKQEAgLTczLDcgKzczLDcgQEAKIAkJfQogCX0KIAotCWRlbnRyeS0+ZF90aW1lID0gamlmZmllcyArIGRjYWNoZV90aW1lb3V0X21zZWNzKkhaLzEwMDA7CisJZGVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzICsgb3JhbmdlZnNfZGNhY2hlX3RpbWVvdXRfbXNlY3MqSFovMTAwMDsKIAlyZXQgPSAxOwogb3V0X3JlbGVhc2Vfb3A6CiAJb3BfcmVsZWFzZShuZXdfb3ApOwpkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvZGV2b3JhbmdlZnMtcmVxLmMgYi9mcy9vcmFuZ2Vmcy9kZXZvcmFuZ2Vmcy1yZXEuYwppbmRleCBhMjg3YTY2Li41MTZmZmI0IDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy9kZXZvcmFuZ2Vmcy1yZXEuYworKysgYi9mcy9vcmFuZ2Vmcy9kZXZvcmFuZ2Vmcy1yZXEuYwpAQCAtMTEsMTQgKzExLDE5IEBACiAjaW5jbHVkZSAib3JhbmdlZnMta2VybmVsLmgiCiAjaW5jbHVkZSAib3JhbmdlZnMtZGV2LXByb3RvLmgiCiAjaW5jbHVkZSAib3JhbmdlZnMtYnVmbWFwLmgiCisjaW5jbHVkZSAib3JhbmdlZnMtZGVidWdmcy5oIgogCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyogdGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIC9kZXYvcHZmczItcmVxIGRldmljZSBub2RlICovCiAKK3VpbnQzMl90IG9yYW5nZWZzX3VzZXJzcGFjZV92ZXJzaW9uOworCiBzdGF0aWMgaW50IG9wZW5fYWNjZXNzX2NvdW50OwogCitzdGF0aWMgREVGSU5FX01VVEVYKGRldnJlcV9tdXRleCk7CisKICNkZWZpbmUgRFVNUF9ERVZJQ0VfRVJST1IoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAlnb3NzaXBfZXJyKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7XApAQCAtNDMsNyArNDgsNyBAQAogewogCWludCBpbmRleCA9IGhhc2hfZnVuYyhvcC0+dGFnLCBoYXNoX3RhYmxlX3NpemUpOwogCi0JbGlzdF9hZGRfdGFpbCgmb3AtPmxpc3QsICZodGFibGVfb3BzX2luX3Byb2dyZXNzW2luZGV4XSk7CisJbGlzdF9hZGRfdGFpbCgmb3AtPmxpc3QsICZvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzW2luZGV4XSk7CiB9CiAKIC8qCkBAIC01NywyMCArNjIsMjAgQEAKIAogCWluZGV4ID0gaGFzaF9mdW5jKHRhZywgaGFzaF90YWJsZV9zaXplKTsKIAotCXNwaW5fbG9jaygmaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKKwlzcGluX2xvY2soJm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9wLAogCQkJCSBuZXh0LAotCQkJCSAmaHRhYmxlX29wc19pbl9wcm9ncmVzc1tpbmRleF0sCisJCQkJICZvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzW2luZGV4XSwKIAkJCQkgbGlzdCkgewogCQlpZiAob3AtPnRhZyA9PSB0YWcgJiYgIW9wX3N0YXRlX3B1cmdlZChvcCkgJiYKIAkJICAgICFvcF9zdGF0ZV9naXZlbl91cChvcCkpIHsKIAkJCWxpc3RfZGVsX2luaXQoJm9wLT5saXN0KTsKLQkJCXNwaW5fdW5sb2NrKCZodGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOworCQkJc3Bpbl91bmxvY2soJm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CiAJCQlyZXR1cm4gb3A7CiAJCX0KIAl9CiAKLQlzcGluX3VubG9jaygmaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKKwlzcGluX3VubG9jaygmb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMjc2LDExICsyODEsMTEgQEAKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gZXJyb3I7CiAKLQlzcGluX2xvY2soJmh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CisJc3Bpbl9sb2NrKCZvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOwogCXNwaW5fbG9jaygmY3VyX29wLT5sb2NrKTsKIAlpZiAodW5saWtlbHkob3Bfc3RhdGVfZ2l2ZW5fdXAoY3VyX29wKSkpIHsKIAkJc3Bpbl91bmxvY2soJmN1cl9vcC0+bG9jayk7Ci0JCXNwaW5fdW5sb2NrKCZodGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOworCQlzcGluX3VubG9jaygmb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKIAkJY29tcGxldGUoJmN1cl9vcC0+d2FpdHEpOwogCQlnb3RvIHJlc3RhcnQ7CiAJfQpAQCAtMjk4LDcgKzMwMyw3IEBACiAJCSAgICAgY3VycmVudC0+Y29tbSk7CiAJb3JhbmdlZnNfZGV2cmVxX2FkZF9vcChjdXJfb3ApOwogCXNwaW5fdW5sb2NrKCZjdXJfb3AtPmxvY2spOwotCXNwaW5fdW5sb2NrKCZodGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOworCXNwaW5fdW5sb2NrKCZvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOwogCiAJLyogVGhlIGNsaWVudCBvbmx5IGFza3MgdG8gcmVhZCBvbmUgc2l6ZSBidWZmZXIuICovCiAJcmV0dXJuIE1BWF9ERVZfUkVRX1VQU0laRTsKQEAgLTM4Nyw2ICszOTIsMTMgQEAKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQogCisJaWYgKCFvcmFuZ2Vmc191c2Vyc3BhY2VfdmVyc2lvbikgeworCQlvcmFuZ2Vmc191c2Vyc3BhY2VfdmVyc2lvbiA9IGhlYWQudmVyc2lvbjsKKwl9IGVsc2UgaWYgKG9yYW5nZWZzX3VzZXJzcGFjZV92ZXJzaW9uICE9IGhlYWQudmVyc2lvbikgeworCQlnb3NzaXBfZXJyKCJFcnJvcjogdXNlcnNwYWNlIHZlcnNpb24gY2hhbmdlc1xuIik7CisJCXJldHVybiAtRVBST1RPOworCX0KKwogCS8qIHJlbW92ZSB0aGUgb3AgZnJvbSB0aGUgaW4gcHJvZ3Jlc3MgaGFzaCB0YWJsZSAqLwogCW9wID0gb3JhbmdlZnNfZGV2cmVxX3JlbW92ZV9vcChoZWFkLnRhZyk7CiAJaWYgKCFvcCkgewpAQCAtNTI3LDYgKzUzOSw3IEBACiAJZ29zc2lwX2RlYnVnKEdPU1NJUF9ERVZfREVCVUcsCiAJCSAgICAgInB2ZnMyLWNsaWVudC1jb3JlOiBkZXZpY2UgY2xvc2UgY29tcGxldGVcbiIpOwogCW9wZW5fYWNjZXNzX2NvdW50ID0gMDsKKwlvcmFuZ2Vmc191c2Vyc3BhY2VfdmVyc2lvbiA9IDA7CiAJbXV0ZXhfdW5sb2NrKCZkZXZyZXFfbXV0ZXgpOwogCXJldHVybiAwOwogfQpAQCAtNTc2LDggKzU4OSw2IEBACiAJc3RhdGljIF9fczMyIG1heF9kb3duX3NpemUgPSBNQVhfREVWX1JFUV9ET1dOU0laRTsKIAlzdHJ1Y3QgT1JBTkdFRlNfZGV2X21hcF9kZXNjIHVzZXJfZGVzYzsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgZGV2X21hc2tfaW5mb19zIG1hc2tfaW5mbyA9IHsgMCB9OwotCXN0cnVjdCBkZXZfbWFzazJfaW5mb19zIG1hc2syX2luZm8gPSB7IDAsIDAgfTsKIAlpbnQgdXBzdHJlYW1fa21vZCA9IDE7CiAJc3RydWN0IG9yYW5nZWZzX3NiX2luZm9fcyAqb3JhbmdlZnNfc2I7CiAKQEAgLTYxOSw3ICs2MzAsNyBAQAogCQkgKiBhbGwgb2YgdGhlIHJlbW91bnRzIGFyZSBzZXJ2aWNlZCAodG8gYXZvaWQgb3BzIGJldHdlZW4KIAkJICogbW91bnRzIHRvIGZhaWwpCiAJCSAqLwotCQlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnJlcXVlc3RfbXV0ZXgpOworCQlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm9yYW5nZWZzX3JlcXVlc3RfbXV0ZXgpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfREVWX0RFQlVHLApAQCAtNjU0LDcgKzY2NSw3IEBACiAJCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfREVWX0RFQlVHLAogCQkJICAgICAiJXM6IHByaW9yaXR5IHJlbW91bnQgY29tcGxldGVcbiIsCiAJCQkgICAgIF9fZnVuY19fKTsKLQkJbXV0ZXhfdW5sb2NrKCZyZXF1ZXN0X211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZvcmFuZ2Vmc19yZXF1ZXN0X211dGV4KTsKIAkJcmV0dXJuIHJldDsKIAogCWNhc2UgT1JBTkdFRlNfREVWX1VQU1RSRUFNOgpAQCAtNjY4LDEzNCArNjc5LDExIEBACiAJCQlyZXR1cm4gcmV0OwogCiAJY2FzZSBPUkFOR0VGU19ERVZfQ0xJRU5UX01BU0s6Ci0JCXJldCA9IGNvcHlfZnJvbV91c2VyKCZtYXNrMl9pbmZvLAotCQkJCSAgICAgKHZvaWQgX191c2VyICopYXJnLAotCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBkZXZfbWFzazJfaW5mb19zKSk7Ci0KLQkJaWYgKHJldCAhPSAwKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJY2xpZW50X2RlYnVnX21hc2subWFzazEgPSBtYXNrMl9pbmZvLm1hc2sxX3ZhbHVlOwotCQljbGllbnRfZGVidWdfbWFzay5tYXNrMiA9IG1hc2syX2luZm8ubWFzazJfdmFsdWU7Ci0KLQkJcHJfaW5mbygiJXM6IGNsaWVudCBkZWJ1ZyBtYXNrIGhhcyBiZWVuIGJlZW4gcmVjZWl2ZWQgIgotCQkJIjolbGx4OiA6JWxseDpcbiIsCi0JCQlfX2Z1bmNfXywKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY2xpZW50X2RlYnVnX21hc2subWFzazEsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKWNsaWVudF9kZWJ1Z19tYXNrLm1hc2syKTsKLQotCQlyZXR1cm4gcmV0OwotCisJCXJldHVybiBvcmFuZ2Vmc19kZWJ1Z2ZzX25ld19jbGllbnRfbWFzaygodm9pZCBfX3VzZXIgKilhcmcpOwogCWNhc2UgT1JBTkdFRlNfREVWX0NMSUVOVF9TVFJJTkc6Ci0JCXJldCA9IGNvcHlfZnJvbV91c2VyKCZjbGllbnRfZGVidWdfYXJyYXlfc3RyaW5nLAotCQkJCSAgICAgKHZvaWQgX191c2VyICopYXJnLAotCQkJCSAgICAgT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU4pOwotCQkvKgotCQkgKiBUaGUgcmVhbCBjbGllbnQtY29yZSBtYWtlcyBhbiBlZmZvcnQgdG8gZW5zdXJlCi0JCSAqIHRoYXQgYWN0dWFsIHN0cmluZ3MgdGhhdCBhcmVuJ3QgdG9vIGxvbmcgdG8gZml0IGluCi0JCSAqIHRoaXMgYnVmZmVyIGlzIHdoYXQgd2UgZ2V0IGhlcmUuIFdlJ3JlIGdvaW5nIHRvIHVzZQotCQkgKiBzdHJpbmcgZnVuY3Rpb25zIG9uIHRoZSBzdHVmZiB3ZSBnb3QsIHNvIHdlJ2xsIG1ha2UKLQkJICogdGhpcyBleHRyYSBlZmZvcnQgdG8gdHJ5IGFuZCBrZWVwIGZyb20KLQkJICogZmxvd2luZyBvdXQgb2YgdGhpcyBidWZmZXIgd2hlbiB3ZSB1c2UgdGhlIHN0cmluZwotCQkgKiBmdW5jdGlvbnMsIGV2ZW4gaWYgc29tZWhvdyB0aGUgc3R1ZmYgd2UgZW5kIHVwCi0JCSAqIHdpdGggaGVyZSBpcyBnYXJiYWdlLgotCQkgKi8KLQkJY2xpZW50X2RlYnVnX2FycmF5X3N0cmluZ1tPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTiAtIDFdID0KLQkJCSdcMCc7Ci0JCQotCQlpZiAocmV0ICE9IDApIHsKLQkJCXByX2luZm8oIiVzOiBDTElFTlRfU1RSSU5HOiBjb3B5X2Zyb21fdXNlciBmYWlsZWRcbiIsCi0JCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQlwcl9pbmZvKCIlczogY2xpZW50IGRlYnVnIGFycmF5IHN0cmluZyBoYXMgYmVlbiByZWNlaXZlZC5cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0KLQkJaWYgKCFoZWxwX3N0cmluZ19pbml0aWFsaXplZCkgewotCi0JCQkvKiBGcmVlIHRoZSAid2UgZG9uJ3Qga25vdyB5ZXQiIGRlZmF1bHQgc3RyaW5nLi4uICovCi0JCQlrZnJlZShkZWJ1Z19oZWxwX3N0cmluZyk7Ci0KLQkJCS8qIGJ1aWxkIGEgcHJvcGVyIGRlYnVnIGhlbHAgc3RyaW5nICovCi0JCQlpZiAob3JhbmdlZnNfcHJlcGFyZV9kZWJ1Z2ZzX2hlbHBfc3RyaW5nKDApKSB7Ci0JCQkJZ29zc2lwX2VycigiJXM6IG5vIGRlYnVnIGhlbHAgc3RyaW5nIFxuIiwKLQkJCQkJICAgX19mdW5jX18pOwotCQkJCXJldHVybiAtRUlPOwotCQkJfQotCi0JCQkvKiBSZXBsYWNlIHRoZSBib2lsZXJwbGF0ZSBib290LXRpbWUgZGVidWctaGVscCBmaWxlLiAqLwotCQkJZGVidWdmc19yZW1vdmUoaGVscF9maWxlX2RlbnRyeSk7Ci0KLQkJCWhlbHBfZmlsZV9kZW50cnkgPQotCQkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoCi0JCQkJCU9SQU5HRUZTX0tNT0RfREVCVUdfSEVMUF9GSUxFLAotCQkJCQkwNDQ0LAotCQkJCQlkZWJ1Z19kaXIsCi0JCQkJCWRlYnVnX2hlbHBfc3RyaW5nLAotCQkJCQkmZGVidWdfaGVscF9mb3BzKTsKLQotCQkJaWYgKCFoZWxwX2ZpbGVfZGVudHJ5KSB7Ci0JCQkJZ29zc2lwX2VycigiJXM6IGRlYnVnZnNfY3JlYXRlX2ZpbGUgZmFpbGVkIGZvciIKLQkJCQkJICAgIiA6JXM6IVxuIiwKLQkJCQkJICAgX19mdW5jX18sCi0JCQkJCSAgIE9SQU5HRUZTX0tNT0RfREVCVUdfSEVMUF9GSUxFKTsKLQkJCQlyZXR1cm4gLUVJTzsKLQkJCX0KLQkJfQotCi0JCWRlYnVnX21hc2tfdG9fc3RyaW5nKCZjbGllbnRfZGVidWdfbWFzaywgMSk7Ci0KLQkJZGVidWdmc19yZW1vdmUoY2xpZW50X2RlYnVnX2RlbnRyeSk7Ci0KLQkJb3JhbmdlZnNfY2xpZW50X2RlYnVnX2luaXQoKTsKLQotCQloZWxwX3N0cmluZ19pbml0aWFsaXplZCsrOwotCi0JCXJldHVybiByZXQ7Ci0KKwkJcmV0dXJuIG9yYW5nZWZzX2RlYnVnZnNfbmV3X2NsaWVudF9zdHJpbmcoKHZvaWQgX191c2VyICopYXJnKTsKIAljYXNlIE9SQU5HRUZTX0RFVl9ERUJVRzoKLQkJcmV0ID0gY29weV9mcm9tX3VzZXIoJm1hc2tfaW5mbywKLQkJCQkgICAgICh2b2lkIF9fdXNlciAqKWFyZywKLQkJCQkgICAgIHNpemVvZihtYXNrX2luZm8pKTsKLQotCQlpZiAocmV0ICE9IDApCi0JCQlyZXR1cm4gLUVJTzsKLQotCQlpZiAobWFza19pbmZvLm1hc2tfdHlwZSA9PSBLRVJORUxfTUFTSykgewotCQkJaWYgKChtYXNrX2luZm8ubWFza192YWx1ZSA9PSAwKQotCQkJICAgICYmIChrZXJuZWxfbWFza19zZXRfbW9kX2luaXQpKSB7Ci0JCQkJLyoKLQkJCQkgKiB0aGUga2VybmVsIGRlYnVnIG1hc2sgd2FzIHNldCB3aGVuIHRoZQotCQkJCSAqIGtlcm5lbCBtb2R1bGUgd2FzIGxvYWRlZDsgZG9uJ3Qgb3ZlcnJpZGUKLQkJCQkgKiBpdCBpZiB0aGUgY2xpZW50LWNvcmUgd2FzIHN0YXJ0ZWQgd2l0aG91dAotCQkJCSAqIGEgdmFsdWUgZm9yIE9SQU5HRUZTX0tNT0RNQVNLLgotCQkJCSAqLwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZGVidWdfbWFza190b19zdHJpbmcoJm1hc2tfaW5mby5tYXNrX3ZhbHVlLAotCQkJCQkgICAgIG1hc2tfaW5mby5tYXNrX3R5cGUpOwotCQkJZ29zc2lwX2RlYnVnX21hc2sgPSBtYXNrX2luZm8ubWFza192YWx1ZTsKLQkJCXByX2luZm8oIiVzOiBrZXJuZWwgZGVidWcgbWFzayBoYXMgYmVlbiBtb2RpZmllZCB0byAiCi0JCQkJIjolczogOiVsbHg6XG4iLAotCQkJCV9fZnVuY19fLAotCQkJCWtlcm5lbF9kZWJ1Z19zdHJpbmcsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylnb3NzaXBfZGVidWdfbWFzayk7Ci0JCX0gZWxzZSBpZiAobWFza19pbmZvLm1hc2tfdHlwZSA9PSBDTElFTlRfTUFTSykgewotCQkJZGVidWdfbWFza190b19zdHJpbmcoJm1hc2tfaW5mby5tYXNrX3ZhbHVlLAotCQkJCQkgICAgIG1hc2tfaW5mby5tYXNrX3R5cGUpOwotCQkJcHJfaW5mbygiJXM6IGNsaWVudCBkZWJ1ZyBtYXNrIGhhcyBiZWVuIG1vZGlmaWVkIHRvIgotCQkJCSI6JXM6IDolbGx4OlxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQljbGllbnRfZGVidWdfc3RyaW5nLAotCQkJCWxsdShtYXNrX2luZm8ubWFza192YWx1ZSkpOwotCQl9IGVsc2UgewotCQkJZ29zc2lwX2xlcnIoIkludmFsaWQgbWFzayB0eXBlLi4uLlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXJldHVybiByZXQ7Ci0KKwkJcmV0dXJuIG9yYW5nZWZzX2RlYnVnZnNfbmV3X2RlYnVnKCh2b2lkIF9fdXNlciAqKWFyZyk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9JT0NUTENNRDsKIAl9CmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy9kb3duY2FsbC5oIGIvZnMvb3JhbmdlZnMvZG93bmNhbGwuaAppbmRleCA2NmI5OTIxLi4zYjg5MjNmIDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy9kb3duY2FsbC5oCisrKyBiL2ZzL29yYW5nZWZzL2Rvd25jYWxsLmgKQEAgLTgzLDcgKzgzLDEwIEBACiB9OwogCiBzdHJ1Y3Qgb3JhbmdlZnNfcGFyYW1fcmVzcG9uc2UgewotCV9fczY0IHZhbHVlOworCXVuaW9uIHsKKwkJX19zNjQgdmFsdWU2NDsKKwkJX19zMzIgdmFsdWUzMlsyXTsKKwl9IHU7CiB9OwogCiAjZGVmaW5lIFBFUkZfQ09VTlRfQlVGX1NJWkUgNDA5NgpAQCAtOTgsNiArMTAxLDExIEBACiAJY2hhciBmc19rZXlbRlNfS0VZX0JVRl9TSVpFXTsKIH07CiAKKy8qIDIuOS42ICovCitzdHJ1Y3Qgb3JhbmdlZnNfZmVhdHVyZXNfcmVzcG9uc2UgeworCV9fdTY0IGZlYXR1cmVzOworfTsKKwogc3RydWN0IG9yYW5nZWZzX2Rvd25jYWxsX3MgewogCV9fczMyIHR5cGU7CiAJX19zMzIgc3RhdHVzOwpAQCAtMTE5LDYgKzEyNyw3IEBACiAJCXN0cnVjdCBvcmFuZ2Vmc19wYXJhbV9yZXNwb25zZSBwYXJhbTsKIAkJc3RydWN0IG9yYW5nZWZzX3BlcmZfY291bnRfcmVzcG9uc2UgcGVyZl9jb3VudDsKIAkJc3RydWN0IG9yYW5nZWZzX2ZzX2tleV9yZXNwb25zZSBmc19rZXk7CisJCXN0cnVjdCBvcmFuZ2Vmc19mZWF0dXJlc19yZXNwb25zZSBmZWF0dXJlczsKIAl9IHJlc3A7CiB9OwogCmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy9maWxlLmMgYi9mcy9vcmFuZ2Vmcy9maWxlLmMKaW5kZXggNTI2MDQwZS4uMzM4Njg4NiAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvZmlsZS5jCisrKyBiL2ZzL29yYW5nZWZzL2ZpbGUuYwpAQCAtMTQsNiArMTQsMzIgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KIAorc3RhdGljIGludCBmbHVzaF9yYWNhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG9yYW5nZWZzX2lub2RlX3MgKm9yYW5nZWZzX2lub2RlID0gT1JBTkdFRlNfSShpbm9kZSk7CisJc3RydWN0IG9yYW5nZWZzX2tlcm5lbF9vcF9zICpuZXdfb3A7CisJaW50IHJldDsKKworCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsCisJICAgICIlczogJXBVOiBIYW5kbGUgaXMgJXBVIHwgZnNfaWQgJWRcbiIsIF9fZnVuY19fLAorCSAgICBnZXRfa2hhbmRsZV9mcm9tX2lubyhpbm9kZSksICZvcmFuZ2Vmc19pbm9kZS0+cmVmbi5raGFuZGxlLAorCSAgICBvcmFuZ2Vmc19pbm9kZS0+cmVmbi5mc19pZCk7CisKKwluZXdfb3AgPSBvcF9hbGxvYyhPUkFOR0VGU19WRlNfT1BfUkFfRkxVU0gpOworCWlmICghbmV3X29wKQorCQlyZXR1cm4gLUVOT01FTTsKKwluZXdfb3AtPnVwY2FsbC5yZXEucmFfY2FjaGVfZmx1c2gucmVmbiA9IG9yYW5nZWZzX2lub2RlLT5yZWZuOworCisJcmV0ID0gc2VydmljZV9vcGVyYXRpb24obmV3X29wLCAib3JhbmdlZnNfZmx1c2hfcmFjYWNoZSIsCisJICAgIGdldF9pbnRlcnJ1cHRpYmxlX2ZsYWcoaW5vZGUpKTsKKworCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsICIlczogZ290IHJldHVybiB2YWx1ZSBvZiAlZFxuIiwKKwkgICAgX19mdW5jX18sIHJldCk7CisKKwlvcF9yZWxlYXNlKG5ld19vcCk7CisJcmV0dXJuIHJldDsKK30KKwogLyoKICAqIENvcHkgdG8gY2xpZW50LWNvcmUncyBhZGRyZXNzIHNwYWNlIGZyb20gdGhlIGJ1ZmZlcnMgc3BlY2lmaWVkCiAgKiBieSB0aGUgaW92ZWMgdXB0byB0b3RhbF9zaXplIGJ5dGVzLgpAQCAtMzg2LDcgKzQxMiw3IEBACiAJc2l6ZV90IGJ1Zm1hcF9zaXplOwogCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKIAotCWdfb3JhbmdlZnNfc3RhdHMucmVhZHMrKzsKKwlvcmFuZ2Vmc19zdGF0cy5yZWFkcysrOwogCiAJYnVmbWFwX3NpemUgPSBvcmFuZ2Vmc19idWZtYXBfc2l6ZV9xdWVyeSgpOwogCWlmIChjb3VudCA+IGJ1Zm1hcF9zaXplKSB7CkBAIC00MjcsNyArNDUzLDcgQEAKIAogCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfRklMRV9ERUJVRywgIm9yYW5nZWZzX2ZpbGVfcmVhZF9pdGVyXG4iKTsKIAotCWdfb3JhbmdlZnNfc3RhdHMucmVhZHMrKzsKKwlvcmFuZ2Vmc19zdGF0cy5yZWFkcysrOwogCiAJcmMgPSBkb19yZWFkdl93cml0ZXYoT1JBTkdFRlNfSU9fUkVBRCwgZmlsZSwgJnBvcywgaXRlcik7CiAJaW9jYi0+a2lfcG9zID0gcG9zOwpAQCAtNDg4LDcgKzUxNCw3IEBACiAJfQogCiAJaW9jYi0+a2lfcG9zID0gcG9zOwotCWdfb3JhbmdlZnNfc3RhdHMud3JpdGVzKys7CisJb3JhbmdlZnNfc3RhdHMud3JpdGVzKys7CiAKIG91dDoKIApAQCAtNTkxLDE1ICs2MTcsMjQgQEAKIAlvcmFuZ2Vmc19mbHVzaF9pbm9kZShpbm9kZSk7CiAKIAkvKgotCSAqIHJlbW92ZSBhbGwgYXNzb2NpYXRlZCBpbm9kZSBwYWdlcyBmcm9tIHRoZSBwYWdlIGNhY2hlIGFuZCBtbWFwCisJICogcmVtb3ZlIGFsbCBhc3NvY2lhdGVkIGlub2RlIHBhZ2VzIGZyb20gdGhlIHBhZ2UgY2FjaGUgYW5kCiAJICogcmVhZGFoZWFkIGNhY2hlIChpZiBhbnkpOyB0aGlzIGZvcmNlcyBhbiBleHBlbnNpdmUgcmVmcmVzaCBvZgogCSAqIGRhdGEgZm9yIHRoZSBuZXh0IGNhbGxlciBvZiBtbWFwIChvciAnZ2V0X2Jsb2NrJyBhY2Nlc3NlcykKIAkgKi8KIAlpZiAoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSAmJgogCSAgICBmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcgJiYKLQkgICAgbWFwcGluZ19ucnBhZ2VzKCZmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX2RhdGEpKQorCSAgICBtYXBwaW5nX25ycGFnZXMoJmZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfZGF0YSkpIHsKKwkJaWYgKG9yYW5nZWZzX2ZlYXR1cmVzICYgT1JBTkdFRlNfRkVBVFVSRV9SRUFEQUhFQUQpIHsKKwkJCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfSU5PREVfREVCVUcsCisJCQkgICAgImNhbGxpbmcgZmx1c2hfcmFjYWNoZSBvbiAlcFVcbiIsCisJCQkgICAgZ2V0X2toYW5kbGVfZnJvbV9pbm8oaW5vZGUpKTsKKwkJCWZsdXNoX3JhY2FjaGUoaW5vZGUpOworCQkJZ29zc2lwX2RlYnVnKEdPU1NJUF9JTk9ERV9ERUJVRywKKwkJCSAgICAiZmx1c2hfcmFjYWNoZSBmaW5pc2hlZFxuIik7CisJCX0KIAkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nLAogCQkJCSAgICAgMCk7CisJfQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy9uYW1laS5jIGIvZnMvb3JhbmdlZnMvbmFtZWkuYwppbmRleCA2MmM1MjU5Li4zNTI2OWUzIDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy9uYW1laS5jCisrKyBiL2ZzL29yYW5nZWZzL25hbWVpLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0JZGVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzICsgZGNhY2hlX3RpbWVvdXRfbXNlY3MqSFovMTAwMDsKKwlkZW50cnktPmRfdGltZSA9IGppZmZpZXMgKyBvcmFuZ2Vmc19kY2FjaGVfdGltZW91dF9tc2VjcypIWi8xMDAwOwogCU9SQU5HRUZTX0koaW5vZGUpLT5nZXRhdHRyX3RpbWUgPSBqaWZmaWVzIC0gMTsKIAogCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfTkFNRV9ERUJVRywKQEAgLTE4Myw3ICsxODMsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlkZW50cnktPmRfdGltZSA9IGppZmZpZXMgKyBkY2FjaGVfdGltZW91dF9tc2VjcypIWi8xMDAwOworCWRlbnRyeS0+ZF90aW1lID0gamlmZmllcyArIG9yYW5nZWZzX2RjYWNoZV90aW1lb3V0X21zZWNzKkhaLzEwMDA7CiAKIAlpbm9kZSA9IG9yYW5nZWZzX2lnZXQoZGlyLT5pX3NiLCAmbmV3X29wLT5kb3duY2FsbC5yZXNwLmxvb2t1cC5yZWZuKTsKIAlpZiAoSVNfRVJSKGlub2RlKSkgewpAQCAtMzIyLDcgKzMyMiw3IEBACiAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwotCWRlbnRyeS0+ZF90aW1lID0gamlmZmllcyArIGRjYWNoZV90aW1lb3V0X21zZWNzKkhaLzEwMDA7CisJZGVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzICsgb3JhbmdlZnNfZGNhY2hlX3RpbWVvdXRfbXNlY3MqSFovMTAwMDsKIAlPUkFOR0VGU19JKGlub2RlKS0+Z2V0YXR0cl90aW1lID0gamlmZmllcyAtIDE7CiAKIAlnb3NzaXBfZGVidWcoR09TU0lQX05BTUVfREVCVUcsCkBAIC0zODYsNyArMzg2LDcgQEAKIAogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7Ci0JZGVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzICsgZGNhY2hlX3RpbWVvdXRfbXNlY3MqSFovMTAwMDsKKwlkZW50cnktPmRfdGltZSA9IGppZmZpZXMgKyBvcmFuZ2Vmc19kY2FjaGVfdGltZW91dF9tc2VjcypIWi8xMDAwOwogCU9SQU5HRUZTX0koaW5vZGUpLT5nZXRhdHRyX3RpbWUgPSBqaWZmaWVzIC0gMTsKIAogCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfTkFNRV9ERUJVRywKZGlmZiAtLWdpdCBhL2ZzL29yYW5nZWZzL29yYW5nZWZzLWNhY2hlLmMgYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1jYWNoZS5jCmluZGV4IGI2ZWRiZTlmLi5hYTM4MzBiIDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1jYWNoZS5jCisrKyBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLWNhY2hlLmMKQEAgLTczLDggKzczLDggQEAKIAkJCXJldHVybiAiT1BfU1RBVEZTIjsKIAkJZWxzZSBpZiAodHlwZSA9PSBPUkFOR0VGU19WRlNfT1BfVFJVTkNBVEUpCiAJCQlyZXR1cm4gIk9QX1RSVU5DQVRFIjsKLQkJZWxzZSBpZiAodHlwZSA9PSBPUkFOR0VGU19WRlNfT1BfTU1BUF9SQV9GTFVTSCkKLQkJCXJldHVybiAiT1BfTU1BUF9SQV9GTFVTSCI7CisJCWVsc2UgaWYgKHR5cGUgPT0gT1JBTkdFRlNfVkZTX09QX1JBX0ZMVVNIKQorCQkJcmV0dXJuICJPUF9SQV9GTFVTSCI7CiAJCWVsc2UgaWYgKHR5cGUgPT0gT1JBTkdFRlNfVkZTX09QX0ZTX01PVU5UKQogCQkJcmV0dXJuICJPUF9GU19NT1VOVCI7CiAJCWVsc2UgaWYgKHR5cGUgPT0gT1JBTkdFRlNfVkZTX09QX0ZTX1VNT1VOVCkKQEAgLTk3LDYgKzk3LDggQEAKIAkJCXJldHVybiAiT1BfRlNZTkMiOwogCQllbHNlIGlmICh0eXBlID09IE9SQU5HRUZTX1ZGU19PUF9GU0tFWSkKIAkJCXJldHVybiAiT1BfRlNLRVkiOworCQllbHNlIGlmICh0eXBlID09IE9SQU5HRUZTX1ZGU19PUF9GRUFUVVJFUykKKwkJCXJldHVybiAiT1BfRkVBVFVSRVMiOwogCX0KIAlyZXR1cm4gIk9QX1VOS05PV04/IjsKIH0KZGlmZiAtLWdpdCBhL2ZzL29yYW5nZWZzL29yYW5nZWZzLWRlYnVnZnMuYyBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLWRlYnVnZnMuYwppbmRleCAxNzE0YTczLi45YjI0MTA3IDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1kZWJ1Z2ZzLmMKKysrIGIvZnMvb3JhbmdlZnMvb3JhbmdlZnMtZGVidWdmcy5jCkBAIC00MywzNiArNDMsMzUgQEAKICNpbmNsdWRlICJwcm90b2NvbC5oIgogI2luY2x1ZGUgIm9yYW5nZWZzLWtlcm5lbC5oIgogCi1zdGF0aWMgaW50IG9yYW5nZWZzX2RlYnVnX2Rpc2FibGVkID0gMTsKKyNkZWZpbmUgREVCVUdfSEVMUF9TVFJJTkdfU0laRSA0MDk2CisjZGVmaW5lIEhFTFBfU1RSSU5HX1VOSU5JVElBTElaRUQgXAorCSJDbGllbnQgRGVidWcgS2V5d29yZHMgYXJlIHVua25vd24gdW50aWwgdGhlIGZpcnN0IHRpbWVcbiIgXAorCSJ0aGUgY2xpZW50IGlzIHN0YXJ0ZWQgYWZ0ZXIgYm9vdC5cbiIKKyNkZWZpbmUgT1JBTkdFRlNfS01PRF9ERUJVR19IRUxQX0ZJTEUgImRlYnVnLWhlbHAiCisjZGVmaW5lIE9SQU5HRUZTX0tNT0RfREVCVUdfRklMRSAia2VybmVsLWRlYnVnIgorI2RlZmluZSBPUkFOR0VGU19DTElFTlRfREVCVUdfRklMRSAiY2xpZW50LWRlYnVnIgorI2RlZmluZSBPUkFOR0VGU19WRVJCT1NFICJ2ZXJib3NlIgorI2RlZmluZSBPUkFOR0VGU19BTEwgImFsbCIKIAotc3RhdGljIGludCBvcmFuZ2Vmc19kZWJ1Z19oZWxwX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwotCi1jb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX2hlbHBfZm9wcyA9IHsKLQkub3BlbiAgICAgICAgICAgPSBvcmFuZ2Vmc19kZWJ1Z19oZWxwX29wZW4sCi0JLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCi0JLnJlbGVhc2UgICAgICAgID0gc2VxX3JlbGVhc2UsCi0JLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorLyoKKyAqIEFuIGFycmF5IG9mIGNsaWVudF9kZWJ1Z19tYXNrIHdpbGwgYmUgYnVpbHQgdG8gaG9sZCBkZWJ1ZyBrZXl3b3JkL21hc2sKKyAqIHZhbHVlcyBmZXRjaGVkIGZyb20gdXNlcnNwYWNlLgorICovCitzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgeworCWNoYXIgKmtleXdvcmQ7CisJX191NjQgbWFzazE7CisJX191NjQgbWFzazI7CiB9OwogCitzdGF0aWMgaW50IG9yYW5nZWZzX2tlcm5lbF9kZWJ1Z19pbml0KHZvaWQpOworCitzdGF0aWMgaW50IG9yYW5nZWZzX2RlYnVnX2hlbHBfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiBzdGF0aWMgdm9pZCAqaGVscF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgbG9mZl90ICopOwogc3RhdGljIHZvaWQgKmhlbHBfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqLCBsb2ZmX3QgKik7CiBzdGF0aWMgdm9pZCBoZWxwX3N0b3Aoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7CiBzdGF0aWMgaW50IGhlbHBfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBoZWxwX2RlYnVnX29wcyA9IHsKLQkuc3RhcnQJPSBoZWxwX3N0YXJ0LAotCS5uZXh0CT0gaGVscF9uZXh0LAotCS5zdG9wCT0gaGVscF9zdG9wLAotCS5zaG93CT0gaGVscF9zaG93LAotfTsKLQotLyoKLSAqIFVzZWQgdG8gcHJvdGVjdCBkYXRhIGluIE9SQU5HRUZTX0tNT0RfREVCVUdfRklMRSBhbmQKLSAqIE9SQU5HRUZTX0tNT0RfREVCVUdfRklMRS4KLSAqLwotc3RhdGljIERFRklORV9NVVRFWChvcmFuZ2Vmc19kZWJ1Z19sb2NrKTsKLQotaW50IG9yYW5nZWZzX2RlYnVnX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCBvcmFuZ2Vmc19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKIAogc3RhdGljIHNzaXplX3Qgb3JhbmdlZnNfZGVidWdfcmVhZChzdHJ1Y3QgZmlsZSAqLAogCQkJCSBjaGFyIF9fdXNlciAqLApAQCAtODQsNiArODMsNDMgQEAKIAkJCQkgIHNpemVfdCwKIAkJCQkgIGxvZmZfdCAqKTsKIAorc3RhdGljIGludCBvcmFuZ2Vmc19wcmVwYXJlX2NkbV9hcnJheShjaGFyICopOworc3RhdGljIHZvaWQgZGVidWdfbWFza190b19zdHJpbmcodm9pZCAqLCBpbnQpOworc3RhdGljIHZvaWQgZG9fa19zdHJpbmcodm9pZCAqLCBpbnQpOworc3RhdGljIHZvaWQgZG9fY19zdHJpbmcodm9pZCAqLCBpbnQpOworc3RhdGljIGludCBrZXl3b3JkX2lzX2FtYWxnYW0oY2hhciAqKTsKK3N0YXRpYyBpbnQgY2hlY2tfYW1hbGdhbV9rZXl3b3JkKHZvaWQgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGRlYnVnX3N0cmluZ190b19tYXNrKGNoYXIgKiwgdm9pZCAqLCBpbnQpOworc3RhdGljIHZvaWQgZG9fY19tYXNrKGludCwgY2hhciAqLCBzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKiopOworc3RhdGljIHZvaWQgZG9fa19tYXNrKGludCwgY2hhciAqLCBfX3U2NCAqKik7CisKK3N0YXRpYyBjaGFyIGtlcm5lbF9kZWJ1Z19zdHJpbmdbT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU5dID0gIm5vbmUiOworc3RhdGljIGNoYXIgKmRlYnVnX2hlbHBfc3RyaW5nOworc3RhdGljIGNoYXIgY2xpZW50X2RlYnVnX3N0cmluZ1tPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTl07CitzdGF0aWMgY2hhciBjbGllbnRfZGVidWdfYXJyYXlfc3RyaW5nW09SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOXTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmhlbHBfZmlsZV9kZW50cnk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqY2xpZW50X2RlYnVnX2RlbnRyeTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kaXI7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQga2VybmVsX21hc2tfc2V0X21vZF9pbml0Oworc3RhdGljIGludCBvcmFuZ2Vmc19kZWJ1Z19kaXNhYmxlZCA9IDE7CitzdGF0aWMgaW50IGhlbHBfc3RyaW5nX2luaXRpYWxpemVkOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGhlbHBfZGVidWdfb3BzID0geworCS5zdGFydAk9IGhlbHBfc3RhcnQsCisJLm5leHQJPSBoZWxwX25leHQsCisJLnN0b3AJPSBoZWxwX3N0b3AsCisJLnNob3cJPSBoZWxwX3Nob3csCit9OworCitjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX2hlbHBfZm9wcyA9IHsKKwkub3BlbiAgICAgICAgICAgPSBvcmFuZ2Vmc19kZWJ1Z19oZWxwX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLnJlbGVhc2UgICAgICAgID0gc2VxX3JlbGVhc2UsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga2VybmVsX2RlYnVnX2ZvcHMgPSB7CiAJLm9wZW4gICAgICAgICAgID0gb3JhbmdlZnNfZGVidWdfb3BlbiwKIAkucmVhZCAgICAgICAgICAgPSBvcmFuZ2Vmc19kZWJ1Z19yZWFkLApAQCAtOTEsMTUgKzEyNyw1NSBAQAogCS5sbHNlZWsgICAgICAgICA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCitzdGF0aWMgaW50IGNsaWVudF9hbGxfaW5kZXg7CitzdGF0aWMgaW50IGNsaWVudF92ZXJib3NlX2luZGV4OworCitzdGF0aWMgc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICpjZG1fYXJyYXk7CitzdGF0aWMgaW50IGNkbV9lbGVtZW50X2NvdW50OworCitzdGF0aWMgc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrIGNsaWVudF9kZWJ1Z19tYXNrOworCisvKgorICogVXNlZCB0byBwcm90ZWN0IGRhdGEgaW4gT1JBTkdFRlNfS01PRF9ERUJVR19GSUxFIGFuZAorICogT1JBTkdFRlNfS01PRF9ERUJVR19GSUxFLgorICovCitzdGF0aWMgREVGSU5FX01VVEVYKG9yYW5nZWZzX2RlYnVnX2xvY2spOworCiAvKgogICogaW5pdGlhbGl6ZSBrbW9kIGRlYnVnIG9wZXJhdGlvbnMsIGNyZWF0ZSBvcmFuZ2VmcyBkZWJ1Z2ZzIGRpciBhbmQKICAqIE9SQU5HRUZTX0tNT0RfREVCVUdfSEVMUF9GSUxFLgogICovCi1pbnQgb3JhbmdlZnNfZGVidWdmc19pbml0KHZvaWQpCitpbnQgb3JhbmdlZnNfZGVidWdmc19pbml0KGludCBkZWJ1Z19tYXNrKQogewotCiAJaW50IHJjID0gLUVOT01FTTsKIAorCS8qIGNvbnZlcnQgaW5wdXQgZGVidWcgbWFzayB0byBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyICovCisgICAgICAgIG9yYW5nZWZzX2dvc3NpcF9kZWJ1Z19tYXNrID0gKHVuc2lnbmVkIGxvbmcgbG9uZylkZWJ1Z19tYXNrOworCisJLyoKKwkgKiBzZXQgdGhlIGtlcm5lbCdzIGdvc3NpcCBkZWJ1ZyBzdHJpbmc7IGludmFsaWQgbWFzayB2YWx1ZXMgd2lsbAorCSAqIGJlIGlnbm9yZWQuCisJICovCisJZGVidWdfbWFza190b19zdHJpbmcoJm9yYW5nZWZzX2dvc3NpcF9kZWJ1Z19tYXNrLCAwKTsKKworCS8qIHJlbW92ZSBhbnkgaW52YWxpZCB2YWx1ZXMgZnJvbSB0aGUgbWFzayAqLworCWRlYnVnX3N0cmluZ190b19tYXNrKGtlcm5lbF9kZWJ1Z19zdHJpbmcsICZvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzaywKKwkgICAgMCk7CisKKwkvKgorCSAqIGlmIHRoZSBtYXNrIGhhcyBhIG5vbi16ZXJvIHZhbHVlLCB0aGVuIGluZGljYXRlIHRoYXQgdGhlIG1hc2sKKwkgKiB3YXMgc2V0IHdoZW4gdGhlIGtlcm5lbCBtb2R1bGUgd2FzIGxvYWRlZC4gIFRoZSBvcmFuZ2VmcyBkZXYgaW9jdGwKKwkgKiBjb21tYW5kIHdpbGwgbG9vayBhdCB0aGlzIGJvb2xlYW4gdG8gZGV0ZXJtaW5lIGlmIHRoZSBrZXJuZWwncworCSAqIGRlYnVnIG1hc2sgc2hvdWxkIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlIGNsaWVudC1jb3JlIGlzIHN0YXJ0ZWQuCisJICovCisJaWYgKG9yYW5nZWZzX2dvc3NpcF9kZWJ1Z19tYXNrICE9IDApCisJCWtlcm5lbF9tYXNrX3NldF9tb2RfaW5pdCA9IHRydWU7CisKKwlwcl9pbmZvKCIlczogY2FsbGVkIHdpdGggZGVidWcgbWFzazogOiVzOiA6JWxseDpcbiIsCisJCV9fZnVuY19fLAorCQlrZXJuZWxfZGVidWdfc3RyaW5nLAorCQkodW5zaWduZWQgbG9uZyBsb25nKW9yYW5nZWZzX2dvc3NpcF9kZWJ1Z19tYXNrKTsKKwogCWRlYnVnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2Rpcigib3JhbmdlZnMiLCBOVUxMKTsKIAlpZiAoIWRlYnVnX2RpcikgewogCQlwcl9pbmZvKCIlczogZGVidWdmc19jcmVhdGVfZGlyIGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKQEAgLTExNywxMyArMTkzLDU4IEBACiAJfQogCiAJb3JhbmdlZnNfZGVidWdfZGlzYWJsZWQgPSAwOwotCXJjID0gMDsKKworCXJjID0gb3JhbmdlZnNfa2VybmVsX2RlYnVnX2luaXQoKTsKIAogb3V0OgogCiAJcmV0dXJuIHJjOwogfQogCisvKgorICogaW5pdGlhbGl6ZSB0aGUga2VybmVsLWRlYnVnIGZpbGUuCisgKi8KK3N0YXRpYyBpbnQgb3JhbmdlZnNfa2VybmVsX2RlYnVnX2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSAtRU5PTUVNOworCXN0cnVjdCBkZW50cnkgKnJldDsKKwljaGFyICprX2J1ZmZlciA9IE5VTEw7CisKKwlnb3NzaXBfZGVidWcoR09TU0lQX0RFQlVHRlNfREVCVUcsICIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKKworCWtfYnVmZmVyID0ga3phbGxvYyhPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrX2J1ZmZlcikKKwkJZ290byBvdXQ7CisKKwlpZiAoc3RybGVuKGtlcm5lbF9kZWJ1Z19zdHJpbmcpICsgMSA8IE9SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOKSB7CisJCXN0cmNweShrX2J1ZmZlciwga2VybmVsX2RlYnVnX3N0cmluZyk7CisJCXN0cmNhdChrX2J1ZmZlciwgIlxuIik7CisJfSBlbHNlIHsKKwkJc3RyY3B5KGtfYnVmZmVyLCAibm9uZVxuIik7CisJCXByX2luZm8oIiVzOiBvdmVyZmxvdyAxIVxuIiwgX19mdW5jX18pOworCX0KKworCXJldCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoT1JBTkdFRlNfS01PRF9ERUJVR19GSUxFLAorCQkJCSAgMDQ0NCwKKwkJCQkgIGRlYnVnX2RpciwKKwkJCQkgIGtfYnVmZmVyLAorCQkJCSAgJmtlcm5lbF9kZWJ1Z19mb3BzKTsKKwlpZiAoIXJldCkgeworCQlwcl9pbmZvKCIlczogZmFpbGVkIHRvIGNyZWF0ZSAlcy5cbiIsCisJCQlfX2Z1bmNfXywKKwkJCU9SQU5HRUZTX0tNT0RfREVCVUdfRklMRSk7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gMDsKKworb3V0OgorCisJZ29zc2lwX2RlYnVnKEdPU1NJUF9ERUJVR0ZTX0RFQlVHLCAiJXM6IHJjOiVkOlxuIiwgX19mdW5jX18sIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKwogdm9pZCBvcmFuZ2Vmc19kZWJ1Z2ZzX2NsZWFudXAodm9pZCkKIHsKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGVidWdfZGlyKTsKQEAgLTE5Niw0OSArMzE3LDYgQEAKIH0KIAogLyoKLSAqIGluaXRpYWxpemUgdGhlIGtlcm5lbC1kZWJ1ZyBmaWxlLgotICovCi1pbnQgb3JhbmdlZnNfa2VybmVsX2RlYnVnX2luaXQodm9pZCkKLXsKLQlpbnQgcmMgPSAtRU5PTUVNOwotCXN0cnVjdCBkZW50cnkgKnJldDsKLQljaGFyICprX2J1ZmZlciA9IE5VTEw7Ci0KLQlnb3NzaXBfZGVidWcoR09TU0lQX0RFQlVHRlNfREVCVUcsICIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKLQotCWtfYnVmZmVyID0ga3phbGxvYyhPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrX2J1ZmZlcikKLQkJZ290byBvdXQ7Ci0KLQlpZiAoc3RybGVuKGtlcm5lbF9kZWJ1Z19zdHJpbmcpICsgMSA8IE9SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOKSB7Ci0JCXN0cmNweShrX2J1ZmZlciwga2VybmVsX2RlYnVnX3N0cmluZyk7Ci0JCXN0cmNhdChrX2J1ZmZlciwgIlxuIik7Ci0JfSBlbHNlIHsKLQkJc3RyY3B5KGtfYnVmZmVyLCAibm9uZVxuIik7Ci0JCXByX2luZm8oIiVzOiBvdmVyZmxvdyAxIVxuIiwgX19mdW5jX18pOwotCX0KLQotCXJldCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoT1JBTkdFRlNfS01PRF9ERUJVR19GSUxFLAotCQkJCSAgMDQ0NCwKLQkJCQkgIGRlYnVnX2RpciwKLQkJCQkgIGtfYnVmZmVyLAotCQkJCSAgJmtlcm5lbF9kZWJ1Z19mb3BzKTsKLQlpZiAoIXJldCkgewotCQlwcl9pbmZvKCIlczogZmFpbGVkIHRvIGNyZWF0ZSAlcy5cbiIsCi0JCQlfX2Z1bmNfXywKLQkJCU9SQU5HRUZTX0tNT0RfREVCVUdfRklMRSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gMDsKLQotb3V0OgotCi0JZ29zc2lwX2RlYnVnKEdPU1NJUF9ERUJVR0ZTX0RFQlVHLCAiJXM6IHJjOiVkOlxuIiwgX19mdW5jX18sIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCiAgKiBpbml0aWFsaXplIHRoZSBjbGllbnQtZGVidWcgZmlsZS4KICAqLwogaW50IG9yYW5nZWZzX2NsaWVudF9kZWJ1Z19pbml0KHZvaWQpCkBAIC0yODIsNyArMzYwLDcgQEAKIH0KIAogLyogb3BlbiBPUkFOR0VGU19LTU9EX0RFQlVHX0ZJTEUgb3IgT1JBTkdFRlNfQ0xJRU5UX0RFQlVHX0ZJTEUuKi8KLWludCBvcmFuZ2Vmc19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBvcmFuZ2Vmc19kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCWludCByYyA9IC1FTk9ERVY7CiAKQEAgLTM4NCw4ICs0NjIsOCBAQAogCSAqLwogCWlmICghc3RyY21wKGZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLAogCQkgICAgT1JBTkdFRlNfS01PRF9ERUJVR19GSUxFKSkgewotCQlkZWJ1Z19zdHJpbmdfdG9fbWFzayhidWYsICZnb3NzaXBfZGVidWdfbWFzaywgMCk7Ci0JCWRlYnVnX21hc2tfdG9fc3RyaW5nKCZnb3NzaXBfZGVidWdfbWFzaywgMCk7CisJCWRlYnVnX3N0cmluZ190b19tYXNrKGJ1ZiwgJm9yYW5nZWZzX2dvc3NpcF9kZWJ1Z19tYXNrLCAwKTsKKwkJZGVidWdfbWFza190b19zdHJpbmcoJm9yYW5nZWZzX2dvc3NpcF9kZWJ1Z19tYXNrLCAwKTsKIAkJZGVidWdfc3RyaW5nID0ga2VybmVsX2RlYnVnX3N0cmluZzsKIAkJZ29zc2lwX2RlYnVnKEdPU1NJUF9ERUJVR0ZTX0RFQlVHLAogCQkJICAgICAiTmV3IGtlcm5lbCBkZWJ1ZyBzdHJpbmcgaXMgJXNcbiIsCkBAIC00NTIsMyArNTMwLDU0NiBAQAogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIHJjOwogfQorCisvKgorICogQWZ0ZXIgb2J0YWluaW5nIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGllbnQncyBkZWJ1ZworICoga2V5d29yZHMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgbWFza3MsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGJ1aWxkIGFuCisgKiBhcnJheSBvZiB0aGVzZSB2YWx1ZXMuCisgKi8KK3N0YXRpYyBpbnQgb3JhbmdlZnNfcHJlcGFyZV9jZG1fYXJyYXkoY2hhciAqZGVidWdfYXJyYXlfc3RyaW5nKQoreworCWludCBpOworCWludCByYyA9IC1FSU5WQUw7CisJY2hhciAqY2RzX2hlYWQgPSBOVUxMOworCWNoYXIgKmNkc19kZWxpbWl0ZXIgPSBOVUxMOworCWludCBrZXl3b3JkX2xlbiA9IDA7CisKKwlnb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLCAiJXM6IHN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisKKwkvKgorCSAqIGZpZ3VyZSBvdXQgaG93IG1hbnkgZWxlbWVudHMgdGhlIGNkbV9hcnJheSBuZWVkcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3RybGVuKGRlYnVnX2FycmF5X3N0cmluZyk7IGkrKykKKwkJaWYgKGRlYnVnX2FycmF5X3N0cmluZ1tpXSA9PSAnXG4nKQorCQkJY2RtX2VsZW1lbnRfY291bnQrKzsKKworCWlmICghY2RtX2VsZW1lbnRfY291bnQpIHsKKwkJcHJfaW5mbygiTm8gZWxlbWVudHMgaW4gY2xpZW50IGRlYnVnIGFycmF5IHN0cmluZyFcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwljZG1fYXJyYXkgPQorCQlremFsbG9jKGNkbV9lbGVtZW50X2NvdW50ICogc2l6ZW9mKHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWNkbV9hcnJheSkgeworCQlwcl9pbmZvKCJtYWxsb2MgZmFpbGVkIGZvciBjZG1fYXJyYXkhXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwljZHNfaGVhZCA9IGRlYnVnX2FycmF5X3N0cmluZzsKKworCWZvciAoaSA9IDA7IGkgPCBjZG1fZWxlbWVudF9jb3VudDsgaSsrKSB7CisJCWNkc19kZWxpbWl0ZXIgPSBzdHJjaHIoY2RzX2hlYWQsICdcbicpOworCQkqY2RzX2RlbGltaXRlciA9ICdcMCc7CisKKwkJa2V5d29yZF9sZW4gPSBzdHJjc3BuKGNkc19oZWFkLCAiICIpOworCisJCWNkbV9hcnJheVtpXS5rZXl3b3JkID0ga3phbGxvYyhrZXl3b3JkX2xlbiArIDEsIEdGUF9LRVJORUwpOworCQlpZiAoIWNkbV9hcnJheVtpXS5rZXl3b3JkKSB7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNzY2FuZihjZHNfaGVhZCwKKwkJICAgICAgICIlcyAlbGx4ICVsbHgiLAorCQkgICAgICAgY2RtX2FycmF5W2ldLmtleXdvcmQsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nICopJihjZG1fYXJyYXlbaV0ubWFzazEpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSYoY2RtX2FycmF5W2ldLm1hc2syKSk7CisKKwkJaWYgKCFzdHJjbXAoY2RtX2FycmF5W2ldLmtleXdvcmQsIE9SQU5HRUZTX1ZFUkJPU0UpKQorCQkJY2xpZW50X3ZlcmJvc2VfaW5kZXggPSBpOworCisJCWlmICghc3RyY21wKGNkbV9hcnJheVtpXS5rZXl3b3JkLCBPUkFOR0VGU19BTEwpKQorCQkJY2xpZW50X2FsbF9pbmRleCA9IGk7CisKKwkJY2RzX2hlYWQgPSBjZHNfZGVsaW1pdGVyICsgMTsKKwl9CisKKwlyYyA9IGNkbV9lbGVtZW50X2NvdW50OworCisJZ29zc2lwX2RlYnVnKEdPU1NJUF9VVElMU19ERUJVRywgIiVzOiByYzolZDpcbiIsIF9fZnVuY19fLCByYyk7CisKK291dDoKKworCXJldHVybiByYzsKKworfQorCisvKgorICogL3N5cy9rZXJuZWwvZGVidWcvb3JhbmdlZnMvZGVidWctaGVscCBjYW4gYmUgY2F0dGVkIHRvCisgKiBzZWUgYWxsIHRoZSBhdmFpbGFibGUga2VybmVsIGFuZCBjbGllbnQgZGVidWcga2V5d29yZHMuCisgKgorICogV2hlbiB0aGUga2VybmVsIGJvb3RzLCB3ZSBoYXZlIG5vIGlkZWEgd2hhdCBrZXl3b3JkcyB0aGUKKyAqIGNsaWVudCBzdXBwb3J0cywgbm9yIHRoZWlyIGFzc29jaWF0ZWQgbWFza3MuCisgKgorICogV2UgcGFzcyB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gb25jZSBhdCBib290IGFuZCBzdGFtcCBhCisgKiBib2lsZXJwbGF0ZSAid2UgZG9uJ3Qga25vdyIgbWVzc2FnZSBmb3IgdGhlIGNsaWVudCBpbiB0aGUKKyAqIGRlYnVnLWhlbHAgZmlsZS4gV2UgcGFzcyB0aHJvdWdoIGhlcmUgYWdhaW4gd2hlbiB0aGUgY2xpZW50CisgKiBzdGFydHMgYW5kIHRoZW4gd2UgY2FuIGZpbGwgb3V0IHRoZSBkZWJ1Zy1oZWxwIGZpbGUgZnVsbHkuCisgKgorICogVGhlIGNsaWVudCBtaWdodCBiZSByZXN0YXJ0ZWQgYW55IG51bWJlciBvZiB0aW1lcyBiZXR3ZWVuCisgKiByZWJvb3RzLCB3ZSBvbmx5IGJ1aWxkIHRoZSBkZWJ1Zy1oZWxwIGZpbGUgdGhlIGZpcnN0IHRpbWUuCisgKi8KK2ludCBvcmFuZ2Vmc19wcmVwYXJlX2RlYnVnZnNfaGVscF9zdHJpbmcoaW50IGF0X2Jvb3QpCit7CisJaW50IHJjID0gLUVJTlZBTDsKKwlpbnQgaTsKKwlpbnQgYnl0ZV9jb3VudCA9IDA7CisJY2hhciAqY2xpZW50X3RpdGxlID0gIkNsaWVudCBEZWJ1ZyBLZXl3b3JkczpcbiI7CisJY2hhciAqa2VybmVsX3RpdGxlID0gIktlcm5lbCBEZWJ1ZyBLZXl3b3JkczpcbiI7CisKKwlnb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLCAiJXM6IHN0YXJ0XG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoYXRfYm9vdCkgeworCQlieXRlX2NvdW50ICs9IHN0cmxlbihIRUxQX1NUUklOR19VTklOSVRJQUxJWkVEKTsKKwkJY2xpZW50X3RpdGxlID0gSEVMUF9TVFJJTkdfVU5JTklUSUFMSVpFRDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBmaWxsIHRoZSBjbGllbnQga2V5d29yZC9tYXNrIGFycmF5IGFuZCByZW1lbWJlcgorCQkgKiBob3cgbWFueSBlbGVtZW50cyB0aGVyZSB3ZXJlLgorCQkgKi8KKwkJY2RtX2VsZW1lbnRfY291bnQgPQorCQkJb3JhbmdlZnNfcHJlcGFyZV9jZG1fYXJyYXkoY2xpZW50X2RlYnVnX2FycmF5X3N0cmluZyk7CisJCWlmIChjZG1fZWxlbWVudF9jb3VudCA8PSAwKQorCQkJZ290byBvdXQ7CisKKwkJLyogQ291bnQgdGhlIGJ5dGVzIGRlc3RpbmVkIGZvciBkZWJ1Z19oZWxwX3N0cmluZy4gKi8KKwkJYnl0ZV9jb3VudCArPSBzdHJsZW4oY2xpZW50X3RpdGxlKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY2RtX2VsZW1lbnRfY291bnQ7IGkrKykgeworCQkJYnl0ZV9jb3VudCArPSBzdHJsZW4oY2RtX2FycmF5W2ldLmtleXdvcmQgKyAyKTsKKwkJCWlmIChieXRlX2NvdW50ID49IERFQlVHX0hFTFBfU1RSSU5HX1NJWkUpIHsKKwkJCQlwcl9pbmZvKCIlczogb3ZlcmZsb3cgMSFcbiIsIF9fZnVuY19fKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsCisJCQkgICAgICIlczogY2RtX2VsZW1lbnRfY291bnQ6JWQ6XG4iLAorCQkJICAgICBfX2Z1bmNfXywKKwkJCSAgICAgY2RtX2VsZW1lbnRfY291bnQpOworCX0KKworCWJ5dGVfY291bnQgKz0gc3RybGVuKGtlcm5lbF90aXRsZSk7CisJZm9yIChpID0gMDsgaSA8IG51bV9rbW9kX2tleXdvcmRfbWFza19tYXA7IGkrKykgeworCQlieXRlX2NvdW50ICs9CisJCQlzdHJsZW4oc19rbW9kX2tleXdvcmRfbWFza19tYXBbaV0ua2V5d29yZCArIDIpOworCQlpZiAoYnl0ZV9jb3VudCA+PSBERUJVR19IRUxQX1NUUklOR19TSVpFKSB7CisJCQlwcl9pbmZvKCIlczogb3ZlcmZsb3cgMiFcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJLyogYnVpbGQgZGVidWdfaGVscF9zdHJpbmcuICovCisJZGVidWdfaGVscF9zdHJpbmcgPSBremFsbG9jKERFQlVHX0hFTFBfU1RSSU5HX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghZGVidWdfaGVscF9zdHJpbmcpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsIGNsaWVudF90aXRsZSk7CisKKwlpZiAoIWF0X2Jvb3QpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNkbV9lbGVtZW50X2NvdW50OyBpKyspIHsKKwkJCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywgIlx0Iik7CisJCQlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsIGNkbV9hcnJheVtpXS5rZXl3b3JkKTsKKwkJCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywgIlxuIik7CisJCX0KKwl9CisKKwlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsICJcbiIpOworCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywga2VybmVsX3RpdGxlKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fa21vZF9rZXl3b3JkX21hc2tfbWFwOyBpKyspIHsKKwkJc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCAiXHQiKTsKKwkJc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCBzX2ttb2Rfa2V5d29yZF9tYXNrX21hcFtpXS5rZXl3b3JkKTsKKwkJc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCAiXG4iKTsKKwl9CisKKwlyYyA9IDA7CisKK291dDoKKworCXJldHVybiByYzsKKworfQorCisvKgorICoga2VybmVsID0gdHlwZSAwCisgKiBjbGllbnQgPSB0eXBlIDEKKyAqLworc3RhdGljIHZvaWQgZGVidWdfbWFza190b19zdHJpbmcodm9pZCAqbWFzaywgaW50IHR5cGUpCit7CisJaW50IGk7CisJaW50IGxlbiA9IDA7CisJY2hhciAqZGVidWdfc3RyaW5nOworCWludCBlbGVtZW50X2NvdW50ID0gMDsKKworCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsICIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKKworCWlmICh0eXBlKSB7CisJCWRlYnVnX3N0cmluZyA9IGNsaWVudF9kZWJ1Z19zdHJpbmc7CisJCWVsZW1lbnRfY291bnQgPSBjZG1fZWxlbWVudF9jb3VudDsKKwl9IGVsc2UgeworCQlkZWJ1Z19zdHJpbmcgPSBrZXJuZWxfZGVidWdfc3RyaW5nOworCQllbGVtZW50X2NvdW50ID0gbnVtX2ttb2Rfa2V5d29yZF9tYXNrX21hcDsKKwl9CisKKwltZW1zZXQoZGVidWdfc3RyaW5nLCAwLCBPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTik7CisKKwkvKgorCSAqIFNvbWUga2V5d29yZHMsIGxpa2UgImFsbCIgb3IgInZlcmJvc2UiLCBhcmUgYW1hbGdhbXMgb2YKKwkgKiBudW1lcm91cyBvdGhlciBrZXl3b3Jkcy4gTWFrZSBhIHNwZWNpYWwgY2hlY2sgZm9yIHRob3NlCisJICogYmVmb3JlIGdyaW5kaW5nIHRocm91Z2ggdGhlIHdob2xlIG1hc2sgb25seSB0byBmaW5kIG91dAorCSAqIGxhdGVyLi4uCisJICovCisJaWYgKGNoZWNrX2FtYWxnYW1fa2V5d29yZChtYXNrLCB0eXBlKSkKKwkJZ290byBvdXQ7CisKKwkvKiBCdWlsZCB0aGUgZGVidWcgc3RyaW5nLiAqLworCWZvciAoaSA9IDA7IGkgPCBlbGVtZW50X2NvdW50OyBpKyspCisJCWlmICh0eXBlKQorCQkJZG9fY19zdHJpbmcobWFzaywgaSk7CisJCWVsc2UKKwkJCWRvX2tfc3RyaW5nKG1hc2ssIGkpOworCisJbGVuID0gc3RybGVuKGRlYnVnX3N0cmluZyk7CisKKwlpZiAoKGxlbikgJiYgKHR5cGUpKQorCQljbGllbnRfZGVidWdfc3RyaW5nW2xlbiAtIDFdID0gJ1wwJzsKKwllbHNlIGlmIChsZW4pCisJCWtlcm5lbF9kZWJ1Z19zdHJpbmdbbGVuIC0gMV0gPSAnXDAnOworCWVsc2UgaWYgKHR5cGUpCisJCXN0cmNweShjbGllbnRfZGVidWdfc3RyaW5nLCAibm9uZSIpOworCWVsc2UKKwkJc3RyY3B5KGtlcm5lbF9kZWJ1Z19zdHJpbmcsICJub25lIik7CisKK291dDoKK2dvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsICIlczogc3RyaW5nOiVzOlxuIiwgX19mdW5jX18sIGRlYnVnX3N0cmluZyk7CisKKwlyZXR1cm47CisKK30KKworc3RhdGljIHZvaWQgZG9fa19zdHJpbmcodm9pZCAqa19tYXNrLCBpbnQgaW5kZXgpCit7CisJX191NjQgKm1hc2sgPSAoX191NjQgKikga19tYXNrOworCisJaWYgKGtleXdvcmRfaXNfYW1hbGdhbSgoY2hhciAqKSBzX2ttb2Rfa2V5d29yZF9tYXNrX21hcFtpbmRleF0ua2V5d29yZCkpCisJCWdvdG8gb3V0OworCisJaWYgKCptYXNrICYgc19rbW9kX2tleXdvcmRfbWFza19tYXBbaW5kZXhdLm1hc2tfdmFsKSB7CisJCWlmICgoc3RybGVuKGtlcm5lbF9kZWJ1Z19zdHJpbmcpICsKKwkJICAgICBzdHJsZW4oc19rbW9kX2tleXdvcmRfbWFza19tYXBbaW5kZXhdLmtleXdvcmQpKQorCQkJPCBPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTiAtIDEpIHsKKwkJCQlzdHJjYXQoa2VybmVsX2RlYnVnX3N0cmluZywKKwkJCQkgICAgICAgc19rbW9kX2tleXdvcmRfbWFza19tYXBbaW5kZXhdLmtleXdvcmQpOworCQkJCXN0cmNhdChrZXJuZWxfZGVidWdfc3RyaW5nLCAiLCIpOworCQkJfSBlbHNlIHsKKwkJCQlnb3NzaXBfZXJyKCIlczogb3ZlcmZsb3chXG4iLCBfX2Z1bmNfXyk7CisJCQkJc3RyY3B5KGtlcm5lbF9kZWJ1Z19zdHJpbmcsIE9SQU5HRUZTX0FMTCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJfQorCitvdXQ6CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGRvX2Nfc3RyaW5nKHZvaWQgKmNfbWFzaywgaW50IGluZGV4KQoreworCXN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqbWFzayA9IChzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKikgY19tYXNrOworCisJaWYgKGtleXdvcmRfaXNfYW1hbGdhbShjZG1fYXJyYXlbaW5kZXhdLmtleXdvcmQpKQorCQlnb3RvIG91dDsKKworCWlmICgobWFzay0+bWFzazEgJiBjZG1fYXJyYXlbaW5kZXhdLm1hc2sxKSB8fAorCSAgICAobWFzay0+bWFzazIgJiBjZG1fYXJyYXlbaW5kZXhdLm1hc2syKSkgeworCQlpZiAoKHN0cmxlbihjbGllbnRfZGVidWdfc3RyaW5nKSArCisJCSAgICAgc3RybGVuKGNkbV9hcnJheVtpbmRleF0ua2V5d29yZCkgKyAxKQorCQkJPCBPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTiAtIDIpIHsKKwkJCQlzdHJjYXQoY2xpZW50X2RlYnVnX3N0cmluZywKKwkJCQkgICAgICAgY2RtX2FycmF5W2luZGV4XS5rZXl3b3JkKTsKKwkJCQlzdHJjYXQoY2xpZW50X2RlYnVnX3N0cmluZywgIiwiKTsKKwkJCX0gZWxzZSB7CisJCQkJZ29zc2lwX2VycigiJXM6IG92ZXJmbG93IVxuIiwgX19mdW5jX18pOworCQkJCXN0cmNweShjbGllbnRfZGVidWdfc3RyaW5nLCBPUkFOR0VGU19BTEwpOworCQkJCWdvdG8gb3V0OworCQkJfQorCX0KK291dDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQga2V5d29yZF9pc19hbWFsZ2FtKGNoYXIgKmtleXdvcmQpCit7CisJaW50IHJjID0gMDsKKworCWlmICgoIXN0cmNtcChrZXl3b3JkLCBPUkFOR0VGU19BTEwpKSB8fCAoIXN0cmNtcChrZXl3b3JkLCBPUkFOR0VGU19WRVJCT1NFKSkpCisJCXJjID0gMTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIGtlcm5lbCA9IHR5cGUgMAorICogY2xpZW50ID0gdHlwZSAxCisgKgorICogcmV0dXJuIDEgaWYgd2UgZm91bmQgYW4gYW1hbGdhbS4KKyAqLworc3RhdGljIGludCBjaGVja19hbWFsZ2FtX2tleXdvcmQodm9pZCAqbWFzaywgaW50IHR5cGUpCit7CisJX191NjQgKmtfbWFzazsKKwlzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKmNfbWFzazsKKwlpbnQga19hbGxfaW5kZXggPSBudW1fa21vZF9rZXl3b3JkX21hc2tfbWFwIC0gMTsKKwlpbnQgcmMgPSAwOworCisJaWYgKHR5cGUpIHsKKwkJY19tYXNrID0gKHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqKSBtYXNrOworCisJCWlmICgoY19tYXNrLT5tYXNrMSA9PSBjZG1fYXJyYXlbY2xpZW50X2FsbF9pbmRleF0ubWFzazEpICYmCisJCSAgICAoY19tYXNrLT5tYXNrMiA9PSBjZG1fYXJyYXlbY2xpZW50X2FsbF9pbmRleF0ubWFzazIpKSB7CisJCQlzdHJjcHkoY2xpZW50X2RlYnVnX3N0cmluZywgT1JBTkdFRlNfQUxMKTsKKwkJCXJjID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKChjX21hc2stPm1hc2sxID09IGNkbV9hcnJheVtjbGllbnRfdmVyYm9zZV9pbmRleF0ubWFzazEpICYmCisJCSAgICAoY19tYXNrLT5tYXNrMiA9PSBjZG1fYXJyYXlbY2xpZW50X3ZlcmJvc2VfaW5kZXhdLm1hc2syKSkgeworCQkJc3RyY3B5KGNsaWVudF9kZWJ1Z19zdHJpbmcsIE9SQU5HRUZTX1ZFUkJPU0UpOworCQkJcmMgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKworCX0gZWxzZSB7CisJCWtfbWFzayA9IChfX3U2NCAqKSBtYXNrOworCisJCWlmICgqa19tYXNrID49IHNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2tfYWxsX2luZGV4XS5tYXNrX3ZhbCkgeworCQkJc3RyY3B5KGtlcm5lbF9kZWJ1Z19zdHJpbmcsIE9SQU5HRUZTX0FMTCk7CisJCQlyYyA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCisJcmV0dXJuIHJjOworfQorCisvKgorICoga2VybmVsID0gdHlwZSAwCisgKiBjbGllbnQgPSB0eXBlIDEKKyAqLworc3RhdGljIHZvaWQgZGVidWdfc3RyaW5nX3RvX21hc2soY2hhciAqZGVidWdfc3RyaW5nLCB2b2lkICptYXNrLCBpbnQgdHlwZSkKK3sKKwljaGFyICp1bmNoZWNrZWRfa2V5d29yZDsKKwlpbnQgaTsKKwljaGFyICpzdHJzZXBfZm9kZGVyID0ga3N0cmR1cChkZWJ1Z19zdHJpbmcsIEdGUF9LRVJORUwpOworCWNoYXIgKm9yaWdpbmFsX3BvaW50ZXI7CisJaW50IGVsZW1lbnRfY291bnQgPSAwOworCXN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqY19tYXNrID0gTlVMTDsKKwlfX3U2NCAqa19tYXNrID0gTlVMTDsKKworCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsICIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKKworCWlmICh0eXBlKSB7CisJCWNfbWFzayA9IChzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKiltYXNrOworCQllbGVtZW50X2NvdW50ID0gY2RtX2VsZW1lbnRfY291bnQ7CisJfSBlbHNlIHsKKwkJa19tYXNrID0gKF9fdTY0ICopbWFzazsKKwkJKmtfbWFzayA9IDA7CisJCWVsZW1lbnRfY291bnQgPSBudW1fa21vZF9rZXl3b3JkX21hc2tfbWFwOworCX0KKworCW9yaWdpbmFsX3BvaW50ZXIgPSBzdHJzZXBfZm9kZGVyOworCXdoaWxlICgodW5jaGVja2VkX2tleXdvcmQgPSBzdHJzZXAoJnN0cnNlcF9mb2RkZXIsICIsIikpKQorCQlpZiAoc3RybGVuKHVuY2hlY2tlZF9rZXl3b3JkKSkgeworCQkJZm9yIChpID0gMDsgaSA8IGVsZW1lbnRfY291bnQ7IGkrKykKKwkJCQlpZiAodHlwZSkKKwkJCQkJZG9fY19tYXNrKGksCisJCQkJCQkgIHVuY2hlY2tlZF9rZXl3b3JkLAorCQkJCQkJICAmY19tYXNrKTsKKwkJCQllbHNlCisJCQkJCWRvX2tfbWFzayhpLAorCQkJCQkJICB1bmNoZWNrZWRfa2V5d29yZCwKKwkJCQkJCSAgJmtfbWFzayk7CisJCX0KKworCWtmcmVlKG9yaWdpbmFsX3BvaW50ZXIpOworfQorCitzdGF0aWMgdm9pZCBkb19jX21hc2soaW50IGksIGNoYXIgKnVuY2hlY2tlZF9rZXl3b3JkLAorICAgIHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqKnNhbmVfbWFzaykKK3sKKworCWlmICghc3RyY21wKGNkbV9hcnJheVtpXS5rZXl3b3JkLCB1bmNoZWNrZWRfa2V5d29yZCkpIHsKKwkJKCoqc2FuZV9tYXNrKS5tYXNrMSA9ICgqKnNhbmVfbWFzaykubWFzazEgfCBjZG1fYXJyYXlbaV0ubWFzazE7CisJCSgqKnNhbmVfbWFzaykubWFzazIgPSAoKipzYW5lX21hc2spLm1hc2syIHwgY2RtX2FycmF5W2ldLm1hc2syOworCX0KK30KKworc3RhdGljIHZvaWQgZG9fa19tYXNrKGludCBpLCBjaGFyICp1bmNoZWNrZWRfa2V5d29yZCwgX191NjQgKipzYW5lX21hc2spCit7CisKKwlpZiAoIXN0cmNtcChzX2ttb2Rfa2V5d29yZF9tYXNrX21hcFtpXS5rZXl3b3JkLCB1bmNoZWNrZWRfa2V5d29yZCkpCisJCSoqc2FuZV9tYXNrID0gKCoqc2FuZV9tYXNrKSB8CisJCQkJc19rbW9kX2tleXdvcmRfbWFza19tYXBbaV0ubWFza192YWw7Cit9CisKK2ludCBvcmFuZ2Vmc19kZWJ1Z2ZzX25ld19jbGllbnRfbWFzayh2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBkZXZfbWFzazJfaW5mb19zIG1hc2syX2luZm8gPSB7MH07CisJaW50IHJldDsKKworCXJldCA9IGNvcHlfZnJvbV91c2VyKCZtYXNrMl9pbmZvLAorCQkJICAgICAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkgICAgIHNpemVvZihzdHJ1Y3QgZGV2X21hc2syX2luZm9fcykpOworCisJaWYgKHJldCAhPSAwKQorCQlyZXR1cm4gLUVJTzsKKworCWNsaWVudF9kZWJ1Z19tYXNrLm1hc2sxID0gbWFzazJfaW5mby5tYXNrMV92YWx1ZTsKKwljbGllbnRfZGVidWdfbWFzay5tYXNrMiA9IG1hc2syX2luZm8ubWFzazJfdmFsdWU7CisKKwlwcl9pbmZvKCIlczogY2xpZW50IGRlYnVnIG1hc2sgaGFzIGJlZW4gYmVlbiByZWNlaXZlZCAiCisJCSI6JWxseDogOiVsbHg6XG4iLAorCQlfX2Z1bmNfXywKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyljbGllbnRfZGVidWdfbWFzay5tYXNrMSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyljbGllbnRfZGVidWdfbWFzay5tYXNrMik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgb3JhbmdlZnNfZGVidWdmc19uZXdfY2xpZW50X3N0cmluZyh2b2lkIF9fdXNlciAqYXJnKSAKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY29weV9mcm9tX3VzZXIoJmNsaWVudF9kZWJ1Z19hcnJheV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgX191c2VyICopYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOKTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiAtRUlPOworCisJLyoKKwkgKiBUaGUgcmVhbCBjbGllbnQtY29yZSBtYWtlcyBhbiBlZmZvcnQgdG8gZW5zdXJlCisJICogdGhhdCBhY3R1YWwgc3RyaW5ncyB0aGF0IGFyZW4ndCB0b28gbG9uZyB0byBmaXQgaW4KKwkgKiB0aGlzIGJ1ZmZlciBpcyB3aGF0IHdlIGdldCBoZXJlLiBXZSdyZSBnb2luZyB0byB1c2UKKwkgKiBzdHJpbmcgZnVuY3Rpb25zIG9uIHRoZSBzdHVmZiB3ZSBnb3QsIHNvIHdlJ2xsIG1ha2UKKwkgKiB0aGlzIGV4dHJhIGVmZm9ydCB0byB0cnkgYW5kIGtlZXAgZnJvbQorCSAqIGZsb3dpbmcgb3V0IG9mIHRoaXMgYnVmZmVyIHdoZW4gd2UgdXNlIHRoZSBzdHJpbmcKKwkgKiBmdW5jdGlvbnMsIGV2ZW4gaWYgc29tZWhvdyB0aGUgc3R1ZmYgd2UgZW5kIHVwCisJICogd2l0aCBoZXJlIGlzIGdhcmJhZ2UuCisJICovCisJY2xpZW50X2RlYnVnX2FycmF5X3N0cmluZ1tPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTiAtIDFdID0KKwkJJ1wwJzsKKwkKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJfaW5mbygiJXM6IENMSUVOVF9TVFJJTkc6IGNvcHlfZnJvbV91c2VyIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcHJfaW5mbygiJXM6IGNsaWVudCBkZWJ1ZyBhcnJheSBzdHJpbmcgaGFzIGJlZW4gcmVjZWl2ZWQuXG4iLAorCQlfX2Z1bmNfXyk7CisKKwlpZiAoIWhlbHBfc3RyaW5nX2luaXRpYWxpemVkKSB7CisKKwkJLyogRnJlZSB0aGUgIndlIGRvbid0IGtub3cgeWV0IiBkZWZhdWx0IHN0cmluZy4uLiAqLworCQlrZnJlZShkZWJ1Z19oZWxwX3N0cmluZyk7CisKKwkJLyogYnVpbGQgYSBwcm9wZXIgZGVidWcgaGVscCBzdHJpbmcgKi8KKwkJaWYgKG9yYW5nZWZzX3ByZXBhcmVfZGVidWdmc19oZWxwX3N0cmluZygwKSkgeworCQkJZ29zc2lwX2VycigiJXM6IG5vIGRlYnVnIGhlbHAgc3RyaW5nIFxuIiwKKwkJCQkgICBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIFJlcGxhY2UgdGhlIGJvaWxlcnBsYXRlIGJvb3QtdGltZSBkZWJ1Zy1oZWxwIGZpbGUuICovCisJCWRlYnVnZnNfcmVtb3ZlKGhlbHBfZmlsZV9kZW50cnkpOworCisJCWhlbHBfZmlsZV9kZW50cnkgPQorCQkJZGVidWdmc19jcmVhdGVfZmlsZSgKKwkJCQlPUkFOR0VGU19LTU9EX0RFQlVHX0hFTFBfRklMRSwKKwkJCQkwNDQ0LAorCQkJCWRlYnVnX2RpciwKKwkJCQlkZWJ1Z19oZWxwX3N0cmluZywKKwkJCQkmZGVidWdfaGVscF9mb3BzKTsKKworCQlpZiAoIWhlbHBfZmlsZV9kZW50cnkpIHsKKwkJCWdvc3NpcF9lcnIoIiVzOiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlIGZhaWxlZCBmb3IiCisJCQkJICAgIiA6JXM6IVxuIiwKKwkJCQkgICBfX2Z1bmNfXywKKwkJCQkgICBPUkFOR0VGU19LTU9EX0RFQlVHX0hFTFBfRklMRSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCWRlYnVnX21hc2tfdG9fc3RyaW5nKCZjbGllbnRfZGVidWdfbWFzaywgMSk7CisKKwlkZWJ1Z2ZzX3JlbW92ZShjbGllbnRfZGVidWdfZGVudHJ5KTsKKworCW9yYW5nZWZzX2NsaWVudF9kZWJ1Z19pbml0KCk7CisKKwloZWxwX3N0cmluZ19pbml0aWFsaXplZCsrOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG9yYW5nZWZzX2RlYnVnZnNfbmV3X2RlYnVnKHZvaWQgX191c2VyICphcmcpIAoreworCXN0cnVjdCBkZXZfbWFza19pbmZvX3MgbWFza19pbmZvID0gezB9OworCWludCByZXQ7CisKKwlyZXQgPSBjb3B5X2Zyb21fdXNlcigmbWFza19pbmZvLAorCQkJICAgICAodm9pZCBfX3VzZXIgKilhcmcsCisJCQkgICAgIHNpemVvZihtYXNrX2luZm8pKTsKKworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAobWFza19pbmZvLm1hc2tfdHlwZSA9PSBLRVJORUxfTUFTSykgeworCQlpZiAoKG1hc2tfaW5mby5tYXNrX3ZhbHVlID09IDApCisJCSAgICAmJiAoa2VybmVsX21hc2tfc2V0X21vZF9pbml0KSkgeworCQkJLyoKKwkJCSAqIHRoZSBrZXJuZWwgZGVidWcgbWFzayB3YXMgc2V0IHdoZW4gdGhlCisJCQkgKiBrZXJuZWwgbW9kdWxlIHdhcyBsb2FkZWQ7IGRvbid0IG92ZXJyaWRlCisJCQkgKiBpdCBpZiB0aGUgY2xpZW50LWNvcmUgd2FzIHN0YXJ0ZWQgd2l0aG91dAorCQkJICogYSB2YWx1ZSBmb3IgT1JBTkdFRlNfS01PRE1BU0suCisJCQkgKi8KKwkJCXJldHVybiAwOworCQl9CisJCWRlYnVnX21hc2tfdG9fc3RyaW5nKCZtYXNrX2luZm8ubWFza192YWx1ZSwKKwkJCQkgICAgIG1hc2tfaW5mby5tYXNrX3R5cGUpOworCQlvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzayA9IG1hc2tfaW5mby5tYXNrX3ZhbHVlOworCQlwcl9pbmZvKCIlczoga2VybmVsIGRlYnVnIG1hc2sgaGFzIGJlZW4gbW9kaWZpZWQgdG8gIgorCQkJIjolczogOiVsbHg6XG4iLAorCQkJX19mdW5jX18sCisJCQlrZXJuZWxfZGVidWdfc3RyaW5nLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzayk7CisJfSBlbHNlIGlmIChtYXNrX2luZm8ubWFza190eXBlID09IENMSUVOVF9NQVNLKSB7CisJCWRlYnVnX21hc2tfdG9fc3RyaW5nKCZtYXNrX2luZm8ubWFza192YWx1ZSwKKwkJCQkgICAgIG1hc2tfaW5mby5tYXNrX3R5cGUpOworCQlwcl9pbmZvKCIlczogY2xpZW50IGRlYnVnIG1hc2sgaGFzIGJlZW4gbW9kaWZpZWQgdG8iCisJCQkiOiVzOiA6JWxseDpcbiIsCisJCQlfX2Z1bmNfXywKKwkJCWNsaWVudF9kZWJ1Z19zdHJpbmcsCisJCQlsbHUobWFza19pbmZvLm1hc2tfdmFsdWUpKTsKKwl9IGVsc2UgeworCQlnb3NzaXBfbGVycigiSW52YWxpZCBtYXNrIHR5cGUuLi4uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL29yYW5nZWZzL29yYW5nZWZzLWRlYnVnZnMuaCBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLWRlYnVnZnMuaAppbmRleCBlNDgyOGMwLi44MDM1MTcyIDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1kZWJ1Z2ZzLmgKKysrIGIvZnMvb3JhbmdlZnMvb3JhbmdlZnMtZGVidWdmcy5oCkBAIC0xLDMgKzEsNyBAQAotaW50IG9yYW5nZWZzX2RlYnVnZnNfaW5pdCh2b2lkKTsKLWludCBvcmFuZ2Vmc19rZXJuZWxfZGVidWdfaW5pdCh2b2lkKTsKK2ludCBvcmFuZ2Vmc19kZWJ1Z2ZzX2luaXQoaW50KTsKIHZvaWQgb3JhbmdlZnNfZGVidWdmc19jbGVhbnVwKHZvaWQpOworaW50IG9yYW5nZWZzX2NsaWVudF9kZWJ1Z19pbml0KHZvaWQpOworaW50IG9yYW5nZWZzX3ByZXBhcmVfZGVidWdmc19oZWxwX3N0cmluZyhpbnQpOworaW50IG9yYW5nZWZzX2RlYnVnZnNfbmV3X2NsaWVudF9tYXNrKHZvaWQgX191c2VyICopOworaW50IG9yYW5nZWZzX2RlYnVnZnNfbmV3X2NsaWVudF9zdHJpbmcodm9pZCBfX3VzZXIgKik7CitpbnQgb3JhbmdlZnNfZGVidWdmc19uZXdfZGVidWcodm9pZCBfX3VzZXIgKik7CmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1kZXYtcHJvdG8uaCBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLWRldi1wcm90by5oCmluZGV4IDllYWM5ZDkuLmEzZDg0ZmYgMTAwNjQ0Ci0tLSBhL2ZzL29yYW5nZWZzL29yYW5nZWZzLWRldi1wcm90by5oCisrKyBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLWRldi1wcm90by5oCkBAIC0yOCw3ICsyOCw3IEBACiAjZGVmaW5lIE9SQU5HRUZTX1ZGU19PUF9SRU5BTUUgICAgICAgICAweEZGMDAwMDBBCiAjZGVmaW5lIE9SQU5HRUZTX1ZGU19PUF9TVEFURlMgICAgICAgICAweEZGMDAwMDBCCiAjZGVmaW5lIE9SQU5HRUZTX1ZGU19PUF9UUlVOQ0FURSAgICAgICAweEZGMDAwMDBDCi0jZGVmaW5lIE9SQU5HRUZTX1ZGU19PUF9NTUFQX1JBX0ZMVVNIICAweEZGMDAwMDBECisjZGVmaW5lIE9SQU5HRUZTX1ZGU19PUF9SQV9GTFVTSCAgICAgICAweEZGMDAwMDBECiAjZGVmaW5lIE9SQU5HRUZTX1ZGU19PUF9GU19NT1VOVCAgICAgICAweEZGMDAwMDBFCiAjZGVmaW5lIE9SQU5HRUZTX1ZGU19PUF9GU19VTU9VTlQgICAgICAweEZGMDAwMDBGCiAjZGVmaW5lIE9SQU5HRUZTX1ZGU19PUF9HRVRYQVRUUiAgICAgICAweEZGMDAwMDEwCkBAIC00MSw2ICs0MSwxMCBAQAogI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfRlNZTkMgICAgICAgICAgMHhGRjAwRUUwMQogI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfRlNLRVkgICAgICAgICAgICAgMHhGRjAwRUUwMgogI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfUkVBRERJUlBMVVMgICAgICAgMHhGRjAwRUUwMworI2RlZmluZSBPUkFOR0VGU19WRlNfT1BfRkVBVFVSRVMJMHhGRjAwRUUwNSAvKiAyLjkuNiAqLworCisvKiBmZWF0dXJlcyBpcyBhIDY0LWJpdCB1bnNpZ25lZCBiaXRtYXNrICovCisjZGVmaW5lIE9SQU5HRUZTX0ZFQVRVUkVfUkVBREFIRUFEIDEKIAogLyoKICAqIE1pc2MgY29uc3RhbnRzLiBQbGVhc2UgcmV0YWluIHRoZW0gYXMgbXVsdGlwbGVzIG9mIDghCmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1rZXJuZWwuaCBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLWtlcm5lbC5oCmluZGV4IDYzM2MwN2EuLjBhODIwNDggMTAwNjQ0Ci0tLSBhL2ZzL29yYW5nZWZzL29yYW5nZWZzLWtlcm5lbC5oCisrKyBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLWtlcm5lbC5oCkBAIC0xMDAsMTYgKzEwMCw2IEBACiB9OwogCiAvKgotICogQW4gYXJyYXkgb2YgY2xpZW50X2RlYnVnX21hc2sgd2lsbCBiZSBidWlsdCB0byBob2xkIGRlYnVnIGtleXdvcmQvbWFzawotICogdmFsdWVzIGZldGNoZWQgZnJvbSB1c2Vyc3BhY2UuCi0gKi8KLXN0cnVjdCBjbGllbnRfZGVidWdfbWFzayB7Ci0JY2hhciAqa2V5d29yZDsKLQlfX3U2NCBtYXNrMTsKLQlfX3U2NCBtYXNrMjsKLX07Ci0KLS8qCiAgKiBvcmFuZ2VmcyBrZXJuZWwgbWVtb3J5IHJlbGF0ZWQgZmxhZ3MKICAqLwogCkBAIC0xMTksMjkgKzEwOSw2IEBACiAjZGVmaW5lIE9SQU5HRUZTX0NBQ0hFX0NSRUFURV9GTEFHUyAwCiAjZW5kaWYgLyogKChkZWZpbmVkIE9SQU5HRUZTX0tFUk5FTF9ERUJVRykgJiYgKGRlZmluZWQgQ09ORklHX0RFQlVHX1NMQUIpKSAqLwogCi0vKiB0aGVzZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gb3JhbmdlZnMtdXRpbHMuYyAqLwotaW50IG9yYW5nZWZzX3ByZXBhcmVfY2RtX2FycmF5KGNoYXIgKmRlYnVnX2FycmF5X3N0cmluZyk7Ci1pbnQgb3JhbmdlZnNfcHJlcGFyZV9kZWJ1Z2ZzX2hlbHBfc3RyaW5nKGludCk7Ci0KLS8qIGRlZmluZWQgaW4gb3JhbmdlZnMtZGVidWdmcy5jICovCi1pbnQgb3JhbmdlZnNfY2xpZW50X2RlYnVnX2luaXQodm9pZCk7Ci0KLXZvaWQgZGVidWdfc3RyaW5nX3RvX21hc2soY2hhciAqLCB2b2lkICosIGludCk7Ci12b2lkIGRvX2NfbWFzayhpbnQsIGNoYXIgKiwgc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICoqKTsKLXZvaWQgZG9fa19tYXNrKGludCwgY2hhciAqLCBfX3U2NCAqKik7Ci0KLXZvaWQgZGVidWdfbWFza190b19zdHJpbmcodm9pZCAqLCBpbnQpOwotdm9pZCBkb19rX3N0cmluZyh2b2lkICosIGludCk7Ci12b2lkIGRvX2Nfc3RyaW5nKHZvaWQgKiwgaW50KTsKLWludCBjaGVja19hbWFsZ2FtX2tleXdvcmQodm9pZCAqLCBpbnQpOwotaW50IGtleXdvcmRfaXNfYW1hbGdhbShjaGFyICopOwotCi0vKnRoZXNlIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBpbiBvcmFuZ2Vmcy1tb2QuYyAqLwotZXh0ZXJuIGNoYXIga2VybmVsX2RlYnVnX3N0cmluZ1tPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTl07Ci1leHRlcm4gY2hhciBjbGllbnRfZGVidWdfc3RyaW5nW09SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOXTsKLWV4dGVybiBjaGFyIGNsaWVudF9kZWJ1Z19hcnJheV9zdHJpbmdbT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU5dOwotZXh0ZXJuIHVuc2lnbmVkIGludCBrZXJuZWxfbWFza19zZXRfbW9kX2luaXQ7Ci0KIGV4dGVybiBpbnQgb3JhbmdlZnNfaW5pdF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpvcmFuZ2Vmc194YXR0cl9oYW5kbGVyc1tdOwogCkBAIC0zMzEsNyArMjk4LDcgQEAKIAl1bnNpZ25lZCBsb25nIHdyaXRlczsKIH07CiAKLWV4dGVybiBzdHJ1Y3Qgb3JhbmdlZnNfc3RhdHMgZ19vcmFuZ2Vmc19zdGF0czsKK2V4dGVybiBzdHJ1Y3Qgb3JhbmdlZnNfc3RhdHMgb3JhbmdlZnNfc3RhdHM7CiAKIC8qCiAgKiBOT1RFOiBTZWUgRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wb3J0aW5nIGZvciBpbmZvcm1hdGlvbgpAQCAtNDQ3LDYgKzQxNCw4IEBACiAvKgogICogZGVmaW5lZCBpbiBzdXBlci5jCiAgKi8KK2V4dGVybiB1aW50NjRfdCBvcmFuZ2Vmc19mZWF0dXJlczsKKwogc3RydWN0IGRlbnRyeSAqb3JhbmdlZnNfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzdCwKIAkJCSAgIGludCBmbGFncywKIAkJCSAgIGNvbnN0IGNoYXIgKmRldm5hbWUsCkBAIC01MDYsNiArNDc1LDggQEAKIC8qCiAgKiBkZWZpbmVkIGluIGRldm9yYW5nZWZzLXJlcS5jCiAgKi8KK2V4dGVybiB1aW50MzJfdCBvcmFuZ2Vmc191c2Vyc3BhY2VfdmVyc2lvbjsKKwogaW50IG9yYW5nZWZzX2Rldl9pbml0KHZvaWQpOwogdm9pZCBvcmFuZ2Vmc19kZXZfY2xlYW51cCh2b2lkKTsKIGludCBpc19kYWVtb25faW5fc2VydmljZSh2b2lkKTsKQEAgLTU0MywyMCArNTE0LDE4IEBACiAKIGludCBvcmFuZ2Vmc19ub3JtYWxpemVfdG9fZXJybm8oX19zMzIgZXJyb3JfY29kZSk7CiAKLWV4dGVybiBzdHJ1Y3QgbXV0ZXggZGV2cmVxX211dGV4OwotZXh0ZXJuIHN0cnVjdCBtdXRleCByZXF1ZXN0X211dGV4OwotZXh0ZXJuIGludCBkZWJ1ZzsKK2V4dGVybiBzdHJ1Y3QgbXV0ZXggb3JhbmdlZnNfcmVxdWVzdF9tdXRleDsKIGV4dGVybiBpbnQgb3BfdGltZW91dF9zZWNzOwogZXh0ZXJuIGludCBzbG90X3RpbWVvdXRfc2VjczsKLWV4dGVybiBpbnQgZGNhY2hlX3RpbWVvdXRfbXNlY3M7Ci1leHRlcm4gaW50IGdldGF0dHJfdGltZW91dF9tc2VjczsKK2V4dGVybiBpbnQgb3JhbmdlZnNfZGNhY2hlX3RpbWVvdXRfbXNlY3M7CitleHRlcm4gaW50IG9yYW5nZWZzX2dldGF0dHJfdGltZW91dF9tc2VjczsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIG9yYW5nZWZzX3N1cGVyYmxvY2tzOwogZXh0ZXJuIHNwaW5sb2NrX3Qgb3JhbmdlZnNfc3VwZXJibG9ja3NfbG9jazsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIG9yYW5nZWZzX3JlcXVlc3RfbGlzdDsKIGV4dGVybiBzcGlubG9ja190IG9yYW5nZWZzX3JlcXVlc3RfbGlzdF9sb2NrOwogZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IG9yYW5nZWZzX3JlcXVlc3RfbGlzdF93YWl0cTsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkICpodGFibGVfb3BzX2luX3Byb2dyZXNzOwotZXh0ZXJuIHNwaW5sb2NrX3QgaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrOworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgKm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3M7CitleHRlcm4gc3BpbmxvY2tfdCBvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2s7CiBleHRlcm4gaW50IGhhc2hfdGFibGVfc2l6ZTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgb3JhbmdlZnNfYWRkcmVzc19vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvb3JhbmdlZnMtbW9kLmMgYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1tb2QuYwppbmRleCBlOWZkNTc1Li4yZTViMDMwIDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1tb2QuYworKysgYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1tb2QuYwpAQCAtMjEsMzQgKzIxLDE3IEBACiAgKiBnbG9iYWwgdmFyaWFibGVzIGRlY2xhcmVkIGhlcmUKICAqLwogCi0vKiBhcnJheSBvZiBjbGllbnQgZGVidWcga2V5d29yZC9tYXNrIHZhbHVlcyAqLwotc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICpjZG1fYXJyYXk7Ci1pbnQgY2RtX2VsZW1lbnRfY291bnQ7Ci0KLWNoYXIga2VybmVsX2RlYnVnX3N0cmluZ1tPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTl0gPSAibm9uZSI7Ci1jaGFyIGNsaWVudF9kZWJ1Z19zdHJpbmdbT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU5dOwotY2hhciBjbGllbnRfZGVidWdfYXJyYXlfc3RyaW5nW09SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOXTsKLQotY2hhciAqZGVidWdfaGVscF9zdHJpbmc7Ci1pbnQgaGVscF9zdHJpbmdfaW5pdGlhbGl6ZWQ7Ci1zdHJ1Y3QgZGVudHJ5ICpoZWxwX2ZpbGVfZGVudHJ5Owotc3RydWN0IGRlbnRyeSAqY2xpZW50X2RlYnVnX2RlbnRyeTsKLXN0cnVjdCBkZW50cnkgKmRlYnVnX2RpcjsKLWludCBjbGllbnRfdmVyYm9zZV9pbmRleDsKLWludCBjbGllbnRfYWxsX2luZGV4Owotc3RydWN0IG9yYW5nZWZzX3N0YXRzIGdfb3JhbmdlZnNfc3RhdHM7CitzdHJ1Y3Qgb3JhbmdlZnNfc3RhdHMgb3JhbmdlZnNfc3RhdHM7CiAKIC8qIHRoZSBzaXplIG9mIHRoZSBoYXNoIHRhYmxlcyBmb3Igb3BzIGluIHByb2dyZXNzICovCiBpbnQgaGFzaF90YWJsZV9zaXplID0gNTA5OwogCiBzdGF0aWMgdWxvbmcgbW9kdWxlX3Bhcm1fZGVidWdfbWFzazsKLV9fdTY0IGdvc3NpcF9kZWJ1Z19tYXNrOwotc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrIGNsaWVudF9kZWJ1Z19tYXNrID0geyBOVUxMLCAwLCAwIH07Ci11bnNpZ25lZCBpbnQga2VybmVsX21hc2tfc2V0X21vZF9pbml0OyAvKiBpbXBsaWNpdGx5IGZhbHNlICovCitfX3U2NCBvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzazsKIGludCBvcF90aW1lb3V0X3NlY3MgPSBPUkFOR0VGU19ERUZBVUxUX09QX1RJTUVPVVRfU0VDUzsKIGludCBzbG90X3RpbWVvdXRfc2VjcyA9IE9SQU5HRUZTX0RFRkFVTFRfU0xPVF9USU1FT1VUX1NFQ1M7Ci1pbnQgZGNhY2hlX3RpbWVvdXRfbXNlY3MgPSA1MDsKLWludCBnZXRhdHRyX3RpbWVvdXRfbXNlY3MgPSA1MDsKK2ludCBvcmFuZ2Vmc19kY2FjaGVfdGltZW91dF9tc2VjcyA9IDUwOworaW50IG9yYW5nZWZzX2dldGF0dHJfdGltZW91dF9tc2VjcyA9IDUwOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJPUkFOR0VGUyBEZXZlbG9wbWVudCBUZWFtIik7CkBAIC03MSwyMCArNTQsMTcgQEAKIG1vZHVsZV9wYXJhbShvcF90aW1lb3V0X3NlY3MsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0oc2xvdF90aW1lb3V0X3NlY3MsIGludCwgMCk7CiAKLS8qIHN5bmNocm9uaXplcyB0aGUgcmVxdWVzdCBkZXZpY2UgZmlsZSAqLwotREVGSU5FX01VVEVYKGRldnJlcV9tdXRleCk7Ci0KIC8qCiAgKiBCbG9ja3Mgbm9uLXByaW9yaXR5IHJlcXVlc3RzIGZyb20gYmVpbmcgcXVldWVkIGZvciBzZXJ2aWNpbmcuICBUaGlzCiAgKiBjb3VsZCBiZSB1c2VkIGZvciBwcm90ZWN0aW5nIHRoZSByZXF1ZXN0IGxpc3QgZGF0YSBzdHJ1Y3R1cmUsIGJ1dAogICogZm9yIG5vdyBpdCdzIG9ubHkgYmVpbmcgdXNlZCB0byBzdGFsbCB0aGUgb3AgYWRkaXRpb24gdG8gdGhlIHJlcXVlc3QKICAqIGxpc3QKICAqLwotREVGSU5FX01VVEVYKHJlcXVlc3RfbXV0ZXgpOworREVGSU5FX01VVEVYKG9yYW5nZWZzX3JlcXVlc3RfbXV0ZXgpOwogCiAvKiBoYXNoIHRhYmxlIGZvciBzdG9yaW5nIG9wZXJhdGlvbnMgd2FpdGluZyBmb3IgbWF0Y2hpbmcgZG93bmNhbGwgKi8KLXN0cnVjdCBsaXN0X2hlYWQgKmh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3M7Ci1ERUZJTkVfU1BJTkxPQ0soaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKK3N0cnVjdCBsaXN0X2hlYWQgKm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3M7CitERUZJTkVfU1BJTkxPQ0sob3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKIAogLyogbGlzdCBmb3IgcXVldWVpbmcgdXBjYWxsIG9wZXJhdGlvbnMgKi8KIExJU1RfSEVBRChvcmFuZ2Vmc19yZXF1ZXN0X2xpc3QpOwpAQCAtMTAwLDMyICs4MCw2IEBACiAJaW50IHJldCA9IC0xOwogCV9fdTMyIGkgPSAwOwogCi0JLyogY29udmVydCBpbnB1dCBkZWJ1ZyBtYXNrIHRvIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgKi8KLQlnb3NzaXBfZGVidWdfbWFzayA9ICh1bnNpZ25lZCBsb25nIGxvbmcpIG1vZHVsZV9wYXJtX2RlYnVnX21hc2s7Ci0KLQkvKgotCSAqIHNldCB0aGUga2VybmVsJ3MgZ29zc2lwIGRlYnVnIHN0cmluZzsgaW52YWxpZCBtYXNrIHZhbHVlcyB3aWxsCi0JICogYmUgaWdub3JlZC4KLQkgKi8KLQlkZWJ1Z19tYXNrX3RvX3N0cmluZygmZ29zc2lwX2RlYnVnX21hc2ssIDApOwotCi0JLyogcmVtb3ZlIGFueSBpbnZhbGlkIHZhbHVlcyBmcm9tIHRoZSBtYXNrICovCi0JZGVidWdfc3RyaW5nX3RvX21hc2soa2VybmVsX2RlYnVnX3N0cmluZywgJmdvc3NpcF9kZWJ1Z19tYXNrLCAwKTsKLQotCS8qCi0JICogaWYgdGhlIG1hc2sgaGFzIGEgbm9uLXplcm8gdmFsdWUsIHRoZW4gaW5kaWNhdGUgdGhhdCB0aGUgbWFzawotCSAqIHdhcyBzZXQgd2hlbiB0aGUga2VybmVsIG1vZHVsZSB3YXMgbG9hZGVkLiAgVGhlIG9yYW5nZWZzIGRldiBpb2N0bAotCSAqIGNvbW1hbmQgd2lsbCBsb29rIGF0IHRoaXMgYm9vbGVhbiB0byBkZXRlcm1pbmUgaWYgdGhlIGtlcm5lbCdzCi0JICogZGVidWcgbWFzayBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUgY2xpZW50LWNvcmUgaXMgc3RhcnRlZC4KLQkgKi8KLQlpZiAoZ29zc2lwX2RlYnVnX21hc2sgIT0gMCkKLQkJa2VybmVsX21hc2tfc2V0X21vZF9pbml0ID0gdHJ1ZTsKLQotCXByX2luZm8oIiVzOiBjYWxsZWQgd2l0aCBkZWJ1ZyBtYXNrOiA6JXM6IDolbGx4OlxuIiwKLQkJX19mdW5jX18sCi0JCWtlcm5lbF9kZWJ1Z19zdHJpbmcsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpZ29zc2lwX2RlYnVnX21hc2spOwotCiAJcmV0ID0gYmRpX2luaXQoJm9yYW5nZWZzX2JhY2tpbmdfZGV2X2luZm8pOwogCiAJaWYgKHJldCkKQEAgLTE0Niw5ICsxMDAsOSBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGNsZWFudXBfb3A7CiAKLQlodGFibGVfb3BzX2luX3Byb2dyZXNzID0KKwlvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzID0KIAkgICAga2NhbGxvYyhoYXNoX3RhYmxlX3NpemUsIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFodGFibGVfb3BzX2luX3Byb2dyZXNzKSB7CisJaWYgKCFvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzKSB7CiAJCWdvc3NpcF9lcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIG9wIGhhc2h0YWJsZSIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGNsZWFudXBfaW5vZGU7CkBAIC0xNTYsNyArMTEwLDcgQEAKIAogCS8qIGluaXRpYWxpemUgYSBkb3VibHkgbGlua2VkIGF0IGVhY2ggaGFzaCB0YWJsZSBpbmRleCAqLwogCWZvciAoaSA9IDA7IGkgPCBoYXNoX3RhYmxlX3NpemU7IGkrKykKLQkJSU5JVF9MSVNUX0hFQUQoJmh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NbaV0pOworCQlJTklUX0xJU1RfSEVBRCgmb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc1tpXSk7CiAKIAlyZXQgPSBmc2lkX2tleV90YWJsZV9pbml0aWFsaXplKCk7CiAJaWYgKHJldCA8IDApCkBAIC0xNzksMTQgKzEzMywxMCBAQAogCWlmIChyZXQpCiAJCWdvdG8gY2xlYW51cF9rZXlfdGFibGU7CiAKLQlyZXQgPSBvcmFuZ2Vmc19kZWJ1Z2ZzX2luaXQoKTsKKwlyZXQgPSBvcmFuZ2Vmc19kZWJ1Z2ZzX2luaXQobW9kdWxlX3Bhcm1fZGVidWdfbWFzayk7CiAJaWYgKHJldCkKIAkJZ290byBkZWJ1Z2ZzX2luaXRfZmFpbGVkOwogCi0JcmV0ID0gb3JhbmdlZnNfa2VybmVsX2RlYnVnX2luaXQoKTsKLQlpZiAocmV0KQotCQlnb3RvIGtlcm5lbF9kZWJ1Z19pbml0X2ZhaWxlZDsKLQogCXJldCA9IG9yYW5nZWZzX3N5c2ZzX2luaXQoKTsKIAlpZiAocmV0KQogCQlnb3RvIHN5c2ZzX2luaXRfZmFpbGVkOwpAQCAtMjE0LDggKzE2NCw2IEBACiAKIHN5c2ZzX2luaXRfZmFpbGVkOgogCi1rZXJuZWxfZGVidWdfaW5pdF9mYWlsZWQ6Ci0KIGRlYnVnZnNfaW5pdF9mYWlsZWQ6CiAJb3JhbmdlZnNfZGVidWdmc19jbGVhbnVwKCk7CiAKQEAgLTIyMyw3ICsxNzEsNyBAQAogCWZzaWRfa2V5X3RhYmxlX2ZpbmFsaXplKCk7CiAKIGNsZWFudXBfcHJvZ3Jlc3NfdGFibGU6Ci0Ja2ZyZWUoaHRhYmxlX29wc19pbl9wcm9ncmVzcyk7CisJa2ZyZWUob3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzcyk7CiAKIGNsZWFudXBfaW5vZGU6CiAJb3JhbmdlZnNfaW5vZGVfY2FjaGVfZmluYWxpemUoKTsKQEAgLTI1MCwxMiArMTk4LDEyIEBACiAJb3JhbmdlZnNfZGV2X2NsZWFudXAoKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJm9yYW5nZWZzX3JlcXVlc3RfbGlzdCkpOwogCWZvciAoaSA9IDA7IGkgPCBoYXNoX3RhYmxlX3NpemU7IGkrKykKLQkJQlVHX09OKCFsaXN0X2VtcHR5KCZodGFibGVfb3BzX2luX3Byb2dyZXNzW2ldKSk7CisJCUJVR19PTighbGlzdF9lbXB0eSgmb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc1tpXSkpOwogCiAJb3JhbmdlZnNfaW5vZGVfY2FjaGVfZmluYWxpemUoKTsKIAlvcF9jYWNoZV9maW5hbGl6ZSgpOwogCi0Ja2ZyZWUoaHRhYmxlX29wc19pbl9wcm9ncmVzcyk7CisJa2ZyZWUob3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzcyk7CiAKIAliZGlfZGVzdHJveSgmb3JhbmdlZnNfYmFja2luZ19kZXZfaW5mbyk7CiAKQEAgLTI3NCwxMCArMjIyLDEwIEBACiAJCXN0cnVjdCBvcmFuZ2Vmc19rZXJuZWxfb3BfcyAqb3A7CiAJCXN0cnVjdCBvcmFuZ2Vmc19rZXJuZWxfb3BfcyAqbmV4dDsKIAotCQlzcGluX2xvY2soJmh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CisJCXNwaW5fbG9jaygmb3JhbmdlZnNfaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9wLAogCQkJCQkgbmV4dCwKLQkJCQkJICZodGFibGVfb3BzX2luX3Byb2dyZXNzW2ldLAorCQkJCQkgJm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NbaV0sCiAJCQkJCSBsaXN0KSB7CiAJCQlzZXRfb3Bfc3RhdGVfcHVyZ2VkKG9wKTsKIAkJCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfREVWX0RFQlVHLApAQCAtMjg3LDcgKzIzNSw3IEBACiAJCQkJICAgICBvcC0+b3Bfc3RhdGUsCiAJCQkJICAgICBjdXJyZW50LT5jb21tKTsKIAkJfQotCQlzcGluX3VubG9jaygmaHRhYmxlX29wc19pbl9wcm9ncmVzc19sb2NrKTsKKwkJc3Bpbl91bmxvY2soJm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1zeXNmcy5jIGIvZnMvb3JhbmdlZnMvb3JhbmdlZnMtc3lzZnMuYwppbmRleCAzNzU3MDhjLi5hNzk5NTQ2IDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy1zeXNmcy5jCisrKyBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLXN5c2ZzLmMKQEAgLTczLDYgKzczLDI0IEBACiAgKiBEZXNjcmlwdGlvbjoKICAqCQkJVGltZSBnZXRhdHRyIGlzIHZhbGlkIGluIG1pbGxpc2Vjb25kcy4KICAqCisgKiBXaGF0OgkJL3N5cy9mcy9vcmFuZ2Vmcy9yZWFkYWhlYWRfY291bnQKKyAqIERhdGU6CQlBdWcgMjAxNgorICogQ29udGFjdDoJCU1hcnRpbiBCcmFuZGVuYnVyZyA8bWFydGluQG9tbmlib25kLmNvbT4KKyAqIERlc2NyaXB0aW9uOgorICoJCQlSZWFkYWhlYWQgY2FjaGUgYnVmZmVyIGNvdW50LgorICoKKyAqIFdoYXQ6CQkvc3lzL2ZzL29yYW5nZWZzL3JlYWRhaGVhZF9zaXplCisgKiBEYXRlOgkJQXVnIDIwMTYKKyAqIENvbnRhY3Q6CQlNYXJ0aW4gQnJhbmRlbmJ1cmcgPG1hcnRpbkBvbW5pYm9uZC5jb20+CisgKiBEZXNjcmlwdGlvbjoKKyAqCQkJUmVhZGFoZWFkIGNhY2hlIGJ1ZmZlciBzaXplLgorICoKKyAqIFdoYXQ6CQkvc3lzL2ZzL29yYW5nZWZzL3JlYWRhaGVhZF9jb3VudF9zaXplCisgKiBEYXRlOgkJQXVnIDIwMTYKKyAqIENvbnRhY3Q6CQlNYXJ0aW4gQnJhbmRlbmJ1cmcgPG1hcnRpbkBvbW5pYm9uZC5jb20+CisgKiBEZXNjcmlwdGlvbjoKKyAqCQkJUmVhZGFoZWFkIGNhY2hlIGJ1ZmZlciBjb3VudCBhbmQgc2l6ZS4KKyAqCiAgKiBXaGF0OgkJL3N5cy9mcy9vcmFuZ2Vmcy9hY2FjaGUvLi4uCiAgKiBEYXRlOgkJSnVuIDIwMTUKICAqIENvbnRhY3Q6CQlNYXJ0aW4gQnJhbmRlbmJ1cmcgPG1hcnRpbkBvbW5pYm9uZC5jb20+CkBAIC0xMjEsMTU5ICsxMzksMzQgQEAKICNkZWZpbmUgUENfS09CSl9JRCAicGMiCiAjZGVmaW5lIFNUQVRTX0tPQkpfSUQgInN0YXRzIgogCi1zdHJ1Y3Qgb3JhbmdlZnNfb2JqIHsKLQlzdHJ1Y3Qga29iamVjdCBrb2JqOwotCWludCBvcF90aW1lb3V0X3NlY3M7Ci0JaW50IHBlcmZfY291bnRlcl9yZXNldDsKLQlpbnQgcGVyZl9oaXN0b3J5X3NpemU7Ci0JaW50IHBlcmZfdGltZV9pbnRlcnZhbF9zZWNzOwotCWludCBzbG90X3RpbWVvdXRfc2VjczsKLQlpbnQgZGNhY2hlX3RpbWVvdXRfbXNlY3M7Ci0JaW50IGdldGF0dHJfdGltZW91dF9tc2VjczsKLX07Ci0KLXN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfb2JqIHsKLQlzdHJ1Y3Qga29iamVjdCBrb2JqOwotCWludCBoYXJkX2xpbWl0OwotCWludCByZWNsYWltX3BlcmNlbnRhZ2U7Ci0JaW50IHNvZnRfbGltaXQ7Ci0JaW50IHRpbWVvdXRfbXNlY3M7Ci19OwotCi1zdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfb2JqIHsKLQlzdHJ1Y3Qga29iamVjdCBrb2JqOwotCWludCBoYXJkX2xpbWl0OwotCWludCByZWNsYWltX3BlcmNlbnRhZ2U7Ci0JaW50IHNvZnRfbGltaXQ7Ci0JaW50IHRpbWVvdXRfc2VjczsKLX07Ci0KLXN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfb2JqIHsKLQlzdHJ1Y3Qga29iamVjdCBrb2JqOwotCWludCBoYXJkX2xpbWl0OwotCWludCByZWNsYWltX3BlcmNlbnRhZ2U7Ci0JaW50IHNvZnRfbGltaXQ7Ci0JaW50IHRpbWVvdXRfc2VjczsKLX07Ci0KLXN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfb2JqIHsKLQlzdHJ1Y3Qga29iamVjdCBrb2JqOwotCWludCBoYXJkX2xpbWl0OwotCWludCByZWNsYWltX3BlcmNlbnRhZ2U7Ci0JaW50IHNvZnRfbGltaXQ7Ci0JaW50IHRpbWVvdXRfbXNlY3M7Ci19OwotCi1zdHJ1Y3QgcGNfb3JhbmdlZnNfb2JqIHsKLQlzdHJ1Y3Qga29iamVjdCBrb2JqOwotCWNoYXIgKmFjYWNoZTsKLQljaGFyICpjYXBjYWNoZTsKLQljaGFyICpuY2FjaGU7Ci19OwotCi1zdHJ1Y3Qgc3RhdHNfb3JhbmdlZnNfb2JqIHsKLQlzdHJ1Y3Qga29iamVjdCBrb2JqOwotCWludCByZWFkczsKLQlpbnQgd3JpdGVzOwotfTsKKy8qCisgKiBFdmVyeSBpdGVtIGNhbGxzIG9yYW5nZWZzX2F0dHJfc2hvdyBhbmQgb3JhbmdlZnNfYXR0cl9zdG9yZSB0aHJvdWdoCisgKiBvcmFuZ2Vmc19zeXNmc19vcHMuIFRoZXkgbG9vayBhdCB0aGUgb3JhbmdlZnNfYXR0cmlidXRlcyBmdXJ0aGVyIGJlbG93IHRvCisgKiBjYWxsIG9uZSBvZiBzeXNmc19pbnRfc2hvdywgc3lzZnNfaW50X3N0b3JlLCBzeXNmc19zZXJ2aWNlX29wX3Nob3csIG9yCisgKiBzeXNmc19zZXJ2aWNlX29wX3N0b3JlLgorICovCiAKIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgewogCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IG9yYW5nZWZzX29iaiAqb3JhbmdlZnNfb2JqLAorCXNzaXplX3QgKCpzaG93KShzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCXN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCiAJCQljaGFyICpidWYpOwotCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IG9yYW5nZWZzX29iaiAqb3JhbmdlZnNfb2JqLAorCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSBjb25zdCBjaGFyICpidWYsCiAJCQkgc2l6ZV90IGNvdW50KTsKIH07CiAKLXN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfb2JqICphY2FjaGVfb3JhbmdlZnNfb2JqLAotCQkJc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQljaGFyICpidWYpOwotCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19vYmogKmFjYWNoZV9vcmFuZ2Vmc19vYmosCi0JCQkgc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLAotCQkJIHNpemVfdCBjb3VudCk7Ci19OwotCi1zdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19vYmogKmNhcGNhY2hlX29yYW5nZWZzX29iaiwKLQkJCXN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQljaGFyICpidWYpOwotCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX29iaiAqY2FwY2FjaGVfb3JhbmdlZnNfb2JqLAotCQkJIHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgY29uc3QgY2hhciAqYnVmLAotCQkJIHNpemVfdCBjb3VudCk7Ci19OwotCi1zdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX29iaiAqY2NhY2hlX29yYW5nZWZzX29iaiwKLQkJCXN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJY2hhciAqYnVmKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfb2JqICpjY2FjaGVfb3JhbmdlZnNfb2JqLAotCQkJIHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSBzaXplX3QgY291bnQpOwotfTsKLQotc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgewotCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19vYmogKm5jYWNoZV9vcmFuZ2Vmc19vYmosCi0JCQlzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNoYXIgKmJ1Zik7Ci0Jc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX29iaiAqbmNhY2hlX29yYW5nZWZzX29iaiwKLQkJCSBzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjb25zdCBjaGFyICpidWYsCi0JCQkgc2l6ZV90IGNvdW50KTsKLX07Ci0KLXN0cnVjdCBwY19vcmFuZ2Vmc19hdHRyaWJ1dGUgewotCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IHBjX29yYW5nZWZzX29iaiAqcGNfb3JhbmdlZnNfb2JqLAotCQkJc3RydWN0IHBjX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNoYXIgKmJ1Zik7Ci0Jc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgcGNfb3JhbmdlZnNfb2JqICpwY19vcmFuZ2Vmc19vYmosCi0JCQkgc3RydWN0IHBjX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjb25zdCBjaGFyICpidWYsCi0JCQkgc2l6ZV90IGNvdW50KTsKLX07Ci0KLXN0cnVjdCBzdGF0c19vcmFuZ2Vmc19hdHRyaWJ1dGUgewotCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKLQlzc2l6ZV90ICgqc2hvdykoc3RydWN0IHN0YXRzX29yYW5nZWZzX29iaiAqc3RhdHNfb3JhbmdlZnNfb2JqLAotCQkJc3RydWN0IHN0YXRzX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNoYXIgKmJ1Zik7Ci0Jc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3Qgc3RhdHNfb3JhbmdlZnNfb2JqICpzdGF0c19vcmFuZ2Vmc19vYmosCi0JCQkgc3RydWN0IHN0YXRzX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjb25zdCBjaGFyICpidWYsCi0JCQkgc2l6ZV90IGNvdW50KTsKLX07Ci0KIHN0YXRpYyBzc2l6ZV90IG9yYW5nZWZzX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKIAkJCQkgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCiAJCQkJICBjaGFyICpidWYpCiB7CiAJc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0cmlidXRlOwotCXN0cnVjdCBvcmFuZ2Vmc19vYmogKm9yYW5nZWZzX29iajsKLQlpbnQgcmM7CiAKIAlhdHRyaWJ1dGUgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSwgYXR0cik7Ci0Jb3JhbmdlZnNfb2JqID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBvcmFuZ2Vmc19vYmosIGtvYmopOwotCi0JaWYgKCFhdHRyaWJ1dGUtPnNob3cpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGF0dHJpYnV0ZS0+c2hvdyhvcmFuZ2Vmc19vYmosIGF0dHJpYnV0ZSwgYnVmKTsKLQotb3V0OgotCXJldHVybiByYzsKKwlpZiAoIWF0dHJpYnV0ZS0+c2hvdykKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIGF0dHJpYnV0ZS0+c2hvdyhrb2JqLCBhdHRyaWJ1dGUsIGJ1Zik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9yYW5nZWZzX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCkBAIC0yODIsMjQgKzE3NSwxNSBAQAogCQkJCSAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0cmlidXRlOwotCXN0cnVjdCBvcmFuZ2Vmc19vYmogKm9yYW5nZWZzX29iajsKLQlpbnQgcmM7CiAKLQlnb3NzaXBfZGVidWcoR09TU0lQX1NZU0ZTX0RFQlVHLAotCQkgICAgICJvcmFuZ2Vmc19hdHRyX3N0b3JlOiBzdGFydFxuIik7CisJaWYgKCFzdHJjbXAoa29iai0+bmFtZSwgUENfS09CSl9JRCkgfHwKKwkgICAgIXN0cmNtcChrb2JqLT5uYW1lLCBTVEFUU19LT0JKX0lEKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAogCWF0dHJpYnV0ZSA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlLCBhdHRyKTsKLQlvcmFuZ2Vmc19vYmogPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG9yYW5nZWZzX29iaiwga29iaik7Ci0KLQlpZiAoIWF0dHJpYnV0ZS0+c3RvcmUpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGF0dHJpYnV0ZS0+c3RvcmUob3JhbmdlZnNfb2JqLCBhdHRyaWJ1dGUsIGJ1ZiwgbGVuKTsKLQotb3V0OgotCXJldHVybiByYzsKKwlpZiAoIWF0dHJpYnV0ZS0+c3RvcmUpCisJCXJldHVybiAtRUlPOworCXJldHVybiBhdHRyaWJ1dGUtPnN0b3JlKGtvYmosIGF0dHJpYnV0ZSwgYnVmLCBsZW4pOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBvcmFuZ2Vmc19zeXNmc19vcHMgPSB7CkBAIC0zMDcsNDAyICsxOTEsNTggQEAKIAkuc3RvcmUgPSBvcmFuZ2Vmc19hdHRyX3N0b3JlLAogfTsKIAotc3RhdGljIHNzaXplX3QgYWNhY2hlX29yYW5nZWZzX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKLQlzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX29iaiAqYWNhY2hlX29yYW5nZWZzX29iajsKLQlpbnQgcmM7Ci0KLQlhdHRyaWJ1dGUgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUsIGF0dHIpOwotCWFjYWNoZV9vcmFuZ2Vmc19vYmogPQotCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19vYmosIGtvYmopOwotCi0JaWYgKCFhdHRyaWJ1dGUtPnNob3cpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGF0dHJpYnV0ZS0+c2hvdyhhY2FjaGVfb3JhbmdlZnNfb2JqLCBhdHRyaWJ1dGUsIGJ1Zik7Ci0KLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFjYWNoZV9vcmFuZ2Vmc19hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCQkgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSAgY29uc3QgY2hhciAqYnVmLAotCQkJCQkgIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKLQlzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX29iaiAqYWNhY2hlX29yYW5nZWZzX29iajsKLQlpbnQgcmM7Ci0KLQlnb3NzaXBfZGVidWcoR09TU0lQX1NZU0ZTX0RFQlVHLAotCQkgICAgICJhY2FjaGVfb3JhbmdlZnNfYXR0cl9zdG9yZTogc3RhcnRcbiIpOwotCi0JYXR0cmlidXRlID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlLCBhdHRyKTsKLQlhY2FjaGVfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQotCWlmICghYXR0cmlidXRlLT5zdG9yZSkgewotCQlyYyA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gYXR0cmlidXRlLT5zdG9yZShhY2FjaGVfb3JhbmdlZnNfb2JqLCBhdHRyaWJ1dGUsIGJ1ZiwgbGVuKTsKLQotb3V0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgYWNhY2hlX29yYW5nZWZzX3N5c2ZzX29wcyA9IHsKLQkuc2hvdyA9IGFjYWNoZV9vcmFuZ2Vmc19hdHRyX3Nob3csCi0JLnN0b3JlID0gYWNhY2hlX29yYW5nZWZzX2F0dHJfc3RvcmUsCi19OwotCi1zdGF0aWMgc3NpemVfdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJCSAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyaWJ1dGU7Ci0Jc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX29iaiAqY2FwY2FjaGVfb3JhbmdlZnNfb2JqOwotCWludCByYzsKLQotCWF0dHJpYnV0ZSA9Ci0JCWNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlLCBhdHRyKTsKLQljYXBjYWNoZV9vcmFuZ2Vmc19vYmogPQotCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX29iaiwga29iaik7Ci0KLQlpZiAoIWF0dHJpYnV0ZS0+c2hvdykgewotCQlyYyA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gYXR0cmlidXRlLT5zaG93KGNhcGNhY2hlX29yYW5nZWZzX29iaiwgYXR0cmlidXRlLCBidWYpOwotCi1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCQkgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkJICAgIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0cmlidXRlOwotCXN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19vYmogKmNhcGNhY2hlX29yYW5nZWZzX29iajsKLQlpbnQgcmM7Ci0KLQlnb3NzaXBfZGVidWcoR09TU0lQX1NZU0ZTX0RFQlVHLAotCQkgICAgICJjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyX3N0b3JlOiBzdGFydFxuIik7Ci0KLQlhdHRyaWJ1dGUgPQotCQljb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSwgYXR0cik7Ci0JY2FwY2FjaGVfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19vYmosIGtvYmopOwotCi0JaWYgKCFhdHRyaWJ1dGUtPnN0b3JlKSB7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBhdHRyaWJ1dGUtPnN0b3JlKGNhcGNhY2hlX29yYW5nZWZzX29iaiwgYXR0cmlidXRlLCBidWYsIGxlbik7Ci0KLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIGNhcGNhY2hlX29yYW5nZWZzX3N5c2ZzX29wcyA9IHsKLQkuc2hvdyA9IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJfc2hvdywKLQkuc3RvcmUgPSBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyX3N0b3JlLAotfTsKLQotc3RhdGljIHNzaXplX3QgY2NhY2hlX29yYW5nZWZzX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKLQlzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX29iaiAqY2NhY2hlX29yYW5nZWZzX29iajsKLQlpbnQgcmM7Ci0KLQlhdHRyaWJ1dGUgPQotCQljb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUsIGF0dHIpOwotCWNjYWNoZV9vcmFuZ2Vmc19vYmogPQotCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19vYmosIGtvYmopOwotCi0JaWYgKCFhdHRyaWJ1dGUtPnNob3cpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGF0dHJpYnV0ZS0+c2hvdyhjY2FjaGVfb3JhbmdlZnNfb2JqLCBhdHRyaWJ1dGUsIGJ1Zik7Ci0KLW91dDoKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGNjYWNoZV9vcmFuZ2Vmc19hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCQkgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSAgY29uc3QgY2hhciAqYnVmLAotCQkJCQkgIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHJpYnV0ZTsKLQlzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX29iaiAqY2NhY2hlX29yYW5nZWZzX29iajsKLQlpbnQgcmM7Ci0KLQlnb3NzaXBfZGVidWcoR09TU0lQX1NZU0ZTX0RFQlVHLAotCQkgICAgICJjY2FjaGVfb3JhbmdlZnNfYXR0cl9zdG9yZTogc3RhcnRcbiIpOwotCi0JYXR0cmlidXRlID0KLQkJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlLCBhdHRyKTsKLQljY2FjaGVfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQotCWlmICghYXR0cmlidXRlLT5zdG9yZSkgewotCQlyYyA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gYXR0cmlidXRlLT5zdG9yZShjY2FjaGVfb3JhbmdlZnNfb2JqLCBhdHRyaWJ1dGUsIGJ1ZiwgbGVuKTsKLQotb3V0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgY2NhY2hlX29yYW5nZWZzX3N5c2ZzX29wcyA9IHsKLQkuc2hvdyA9IGNjYWNoZV9vcmFuZ2Vmc19hdHRyX3Nob3csCi0JLnN0b3JlID0gY2NhY2hlX29yYW5nZWZzX2F0dHJfc3RvcmUsCi19OwotCi1zdGF0aWMgc3NpemVfdCBuY2FjaGVfb3JhbmdlZnNfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCQkgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0cmlidXRlOwotCXN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfb2JqICpuY2FjaGVfb3JhbmdlZnNfb2JqOwotCWludCByYzsKLQotCWF0dHJpYnV0ZSA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSwgYXR0cik7Ci0JbmNhY2hlX29yYW5nZWZzX29iaiA9Ci0JCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX29iaiwga29iaik7Ci0KLQlpZiAoIWF0dHJpYnV0ZS0+c2hvdykgewotCQlyYyA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJjID0gYXR0cmlidXRlLT5zaG93KG5jYWNoZV9vcmFuZ2Vmc19vYmosIGF0dHJpYnV0ZSwgYnVmKTsKLQotb3V0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgbmNhY2hlX29yYW5nZWZzX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJCSAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJICBjb25zdCBjaGFyICpidWYsCi0JCQkJCSAgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0cmlidXRlOwotCXN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfb2JqICpuY2FjaGVfb3JhbmdlZnNfb2JqOwotCWludCByYzsKLQotCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfU1lTRlNfREVCVUcsCi0JCSAgICAgIm5jYWNoZV9vcmFuZ2Vmc19hdHRyX3N0b3JlOiBzdGFydFxuIik7Ci0KLQlhdHRyaWJ1dGUgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUsIGF0dHIpOwotCW5jYWNoZV9vcmFuZ2Vmc19vYmogPQotCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19vYmosIGtvYmopOwotCi0JaWYgKCFhdHRyaWJ1dGUtPnN0b3JlKSB7Ci0JCXJjID0gLUVJTzsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmMgPSBhdHRyaWJ1dGUtPnN0b3JlKG5jYWNoZV9vcmFuZ2Vmc19vYmosIGF0dHJpYnV0ZSwgYnVmLCBsZW4pOwotCi1vdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBuY2FjaGVfb3JhbmdlZnNfc3lzZnNfb3BzID0gewotCS5zaG93ID0gbmNhY2hlX29yYW5nZWZzX2F0dHJfc2hvdywKLQkuc3RvcmUgPSBuY2FjaGVfb3JhbmdlZnNfYXR0cl9zdG9yZSwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IHBjX29yYW5nZWZzX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHBjX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0cmlidXRlOwotCXN0cnVjdCBwY19vcmFuZ2Vmc19vYmogKnBjX29yYW5nZWZzX29iajsKLQlpbnQgcmM7Ci0KLQlhdHRyaWJ1dGUgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHBjX29yYW5nZWZzX2F0dHJpYnV0ZSwgYXR0cik7Ci0JcGNfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBwY19vcmFuZ2Vmc19vYmosIGtvYmopOwotCi0JaWYgKCFhdHRyaWJ1dGUtPnNob3cpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGF0dHJpYnV0ZS0+c2hvdyhwY19vcmFuZ2Vmc19vYmosIGF0dHJpYnV0ZSwgYnVmKTsKLQotb3V0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgcGNfb3JhbmdlZnNfc3lzZnNfb3BzID0gewotCS5zaG93ID0gcGNfb3JhbmdlZnNfYXR0cl9zaG93LAotfTsKLQotc3RhdGljIHNzaXplX3Qgc3RhdHNfb3JhbmdlZnNfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IHN0YXRzX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0cmlidXRlOwotCXN0cnVjdCBzdGF0c19vcmFuZ2Vmc19vYmogKnN0YXRzX29yYW5nZWZzX29iajsKLQlpbnQgcmM7Ci0KLQlhdHRyaWJ1dGUgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHN0YXRzX29yYW5nZWZzX2F0dHJpYnV0ZSwgYXR0cik7Ci0Jc3RhdHNfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBzdGF0c19vcmFuZ2Vmc19vYmosIGtvYmopOwotCi0JaWYgKCFhdHRyaWJ1dGUtPnNob3cpIHsKLQkJcmMgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGF0dHJpYnV0ZS0+c2hvdyhzdGF0c19vcmFuZ2Vmc19vYmosIGF0dHJpYnV0ZSwgYnVmKTsKLQotb3V0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgc3RhdHNfb3JhbmdlZnNfc3lzZnNfb3BzID0gewotCS5zaG93ID0gc3RhdHNfb3JhbmdlZnNfYXR0cl9zaG93LAotfTsKLQotc3RhdGljIHZvaWQgb3JhbmdlZnNfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKLXsKLQlzdHJ1Y3Qgb3JhbmdlZnNfb2JqICpvcmFuZ2Vmc19vYmo7Ci0KLQlvcmFuZ2Vmc19vYmogPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IG9yYW5nZWZzX29iaiwga29iaik7Ci0Ja2ZyZWUob3JhbmdlZnNfb2JqKTsKLX0KLQotc3RhdGljIHZvaWQgYWNhY2hlX29yYW5nZWZzX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19vYmogKmFjYWNoZV9vcmFuZ2Vmc19vYmo7Ci0KLQlhY2FjaGVfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQlrZnJlZShhY2FjaGVfb3JhbmdlZnNfb2JqKTsKLX0KLQotc3RhdGljIHZvaWQgY2FwY2FjaGVfb3JhbmdlZnNfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKLXsKLQlzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfb2JqICpjYXBjYWNoZV9vcmFuZ2Vmc19vYmo7Ci0KLQljYXBjYWNoZV9vcmFuZ2Vmc19vYmogPQotCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX29iaiwga29iaik7Ci0Ja2ZyZWUoY2FwY2FjaGVfb3JhbmdlZnNfb2JqKTsKLX0KLQotc3RhdGljIHZvaWQgY2NhY2hlX29yYW5nZWZzX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19vYmogKmNjYWNoZV9vcmFuZ2Vmc19vYmo7Ci0KLQljY2FjaGVfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQlrZnJlZShjY2FjaGVfb3JhbmdlZnNfb2JqKTsKLX0KLQotc3RhdGljIHZvaWQgbmNhY2hlX29yYW5nZWZzX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Jc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19vYmogKm5jYWNoZV9vcmFuZ2Vmc19vYmo7Ci0KLQluY2FjaGVfb3JhbmdlZnNfb2JqID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfb2JqLCBrb2JqKTsKLQlrZnJlZShuY2FjaGVfb3JhbmdlZnNfb2JqKTsKLX0KLQotc3RhdGljIHZvaWQgcGNfb3JhbmdlZnNfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKLXsKLQlzdHJ1Y3QgcGNfb3JhbmdlZnNfb2JqICpwY19vcmFuZ2Vmc19vYmo7Ci0KLQlwY19vcmFuZ2Vmc19vYmogPQotCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IHBjX29yYW5nZWZzX29iaiwga29iaik7Ci0Ja2ZyZWUocGNfb3JhbmdlZnNfb2JqKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhdHNfb3JhbmdlZnNfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKLXsKLQlzdHJ1Y3Qgc3RhdHNfb3JhbmdlZnNfb2JqICpzdGF0c19vcmFuZ2Vmc19vYmo7Ci0KLQlzdGF0c19vcmFuZ2Vmc19vYmogPQotCQljb250YWluZXJfb2Yoa29iaiwgc3RydWN0IHN0YXRzX29yYW5nZWZzX29iaiwga29iaik7Ci0Ja2ZyZWUoc3RhdHNfb3JhbmdlZnNfb2JqKTsKLX0KLQotc3RhdGljIHNzaXplX3Qgc3lzZnNfaW50X3Nob3coY2hhciAqa29ial9pZCwgY2hhciAqYnVmLCB2b2lkICphdHRyKQorc3RhdGljIHNzaXplX3Qgc3lzZnNfaW50X3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisgICAgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCWludCByYyA9IC1FSU87Ci0Jc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqb3JhbmdlZnNfYXR0cjsKLQlzdHJ1Y3Qgc3RhdHNfb3JhbmdlZnNfYXR0cmlidXRlICpzdGF0c19vcmFuZ2Vmc19hdHRyOwogCi0JZ29zc2lwX2RlYnVnKEdPU1NJUF9TWVNGU19ERUJVRywgInN5c2ZzX2ludF9zaG93OiBpZDolczpcbiIsIGtvYmpfaWQpOworCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfU1lTRlNfREVCVUcsICJzeXNmc19pbnRfc2hvdzogaWQ6JXM6XG4iLAorCSAgICBrb2JqLT5uYW1lKTsKIAotCWlmICghc3RyY21wKGtvYmpfaWQsIE9SQU5HRUZTX0tPQkpfSUQpKSB7Ci0JCW9yYW5nZWZzX2F0dHIgPSAoc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqKWF0dHI7Ci0KLQkJaWYgKCFzdHJjbXAob3JhbmdlZnNfYXR0ci0+YXR0ci5uYW1lLCAib3BfdGltZW91dF9zZWNzIikpIHsKKwlpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBPUkFOR0VGU19LT0JKX0lEKSkgeworCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJvcF90aW1lb3V0X3NlY3MiKSkgewogCQkJcmMgPSBzY25wcmludGYoYnVmLAogCQkJCSAgICAgICBQQUdFX1NJWkUsCiAJCQkJICAgICAgICIlZFxuIiwKIAkJCQkgICAgICAgb3BfdGltZW91dF9zZWNzKTsKIAkJCWdvdG8gb3V0OwotCQl9IGVsc2UgaWYgKCFzdHJjbXAob3JhbmdlZnNfYXR0ci0+YXR0ci5uYW1lLAorCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLAogCQkJCSAgICJzbG90X3RpbWVvdXRfc2VjcyIpKSB7CiAJCQlyYyA9IHNjbnByaW50ZihidWYsCiAJCQkJICAgICAgIFBBR0VfU0laRSwKIAkJCQkgICAgICAgIiVkXG4iLAogCQkJCSAgICAgICBzbG90X3RpbWVvdXRfc2Vjcyk7CiAJCQlnb3RvIG91dDsKLQkJfSBlbHNlIGlmICghc3RyY21wKG9yYW5nZWZzX2F0dHItPmF0dHIubmFtZSwKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKIAkJCQkgICAiZGNhY2hlX3RpbWVvdXRfbXNlY3MiKSkgewogCQkJcmMgPSBzY25wcmludGYoYnVmLAogCQkJCSAgICAgICBQQUdFX1NJWkUsCiAJCQkJICAgICAgICIlZFxuIiwKLQkJCQkgICAgICAgZGNhY2hlX3RpbWVvdXRfbXNlY3MpOworCQkJCSAgICAgICBvcmFuZ2Vmc19kY2FjaGVfdGltZW91dF9tc2Vjcyk7CiAJCQlnb3RvIG91dDsKLQkJfSBlbHNlIGlmICghc3RyY21wKG9yYW5nZWZzX2F0dHItPmF0dHIubmFtZSwKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKIAkJCQkgICAiZ2V0YXR0cl90aW1lb3V0X21zZWNzIikpIHsKIAkJCXJjID0gc2NucHJpbnRmKGJ1ZiwKIAkJCQkgICAgICAgUEFHRV9TSVpFLAogCQkJCSAgICAgICAiJWRcbiIsCi0JCQkJICAgICAgIGdldGF0dHJfdGltZW91dF9tc2Vjcyk7CisJCQkJICAgICAgIG9yYW5nZWZzX2dldGF0dHJfdGltZW91dF9tc2Vjcyk7CiAJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQl9IGVsc2UgaWYgKCFzdHJjbXAoa29ial9pZCwgU1RBVFNfS09CSl9JRCkpIHsKLQkJc3RhdHNfb3JhbmdlZnNfYXR0ciA9IChzdHJ1Y3Qgc3RhdHNfb3JhbmdlZnNfYXR0cmlidXRlICopYXR0cjsKLQotCQlpZiAoIXN0cmNtcChzdGF0c19vcmFuZ2Vmc19hdHRyLT5hdHRyLm5hbWUsICJyZWFkcyIpKSB7CisJfSBlbHNlIGlmICghc3RyY21wKGtvYmotPm5hbWUsIFNUQVRTX0tPQkpfSUQpKSB7CisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInJlYWRzIikpIHsKIAkJCXJjID0gc2NucHJpbnRmKGJ1ZiwKIAkJCQkgICAgICAgUEFHRV9TSVpFLAogCQkJCSAgICAgICAiJWx1XG4iLAotCQkJCSAgICAgICBnX29yYW5nZWZzX3N0YXRzLnJlYWRzKTsKKwkJCQkgICAgICAgb3JhbmdlZnNfc3RhdHMucmVhZHMpOwogCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChzdGF0c19vcmFuZ2Vmc19hdHRyLT5hdHRyLm5hbWUsICJ3cml0ZXMiKSkgeworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAid3JpdGVzIikpIHsKIAkJCXJjID0gc2NucHJpbnRmKGJ1ZiwKIAkJCQkgICAgICAgUEFHRV9TSVpFLAogCQkJCSAgICAgICAiJWx1XG4iLAotCQkJCSAgICAgICBnX29yYW5nZWZzX3N0YXRzLndyaXRlcyk7CisJCQkJICAgICAgIG9yYW5nZWZzX3N0YXRzLndyaXRlcyk7CiAJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKIAkJCWdvdG8gb3V0OwpAQCAtNzE0LDQ1ICsyNTQsMTMgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGludF9vcmFuZ2Vmc19zaG93KHN0cnVjdCBvcmFuZ2Vmc19vYmogKm9yYW5nZWZzX29iaiwKLQkJCQkgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY2hhciAqYnVmKQotewotCWludCByYzsKLQotCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfU1lTRlNfREVCVUcsCi0JCSAgICAgImludF9vcmFuZ2Vmc19zaG93OnN0YXJ0IGF0dHItPmF0dHIubmFtZTolczpcbiIsCi0JCSAgICAgYXR0ci0+YXR0ci5uYW1lKTsKLQotCXJjID0gc3lzZnNfaW50X3Nob3coT1JBTkdFRlNfS09CSl9JRCwgYnVmLCAodm9pZCAqKSBhdHRyKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QgaW50X3N0YXRzX3Nob3coc3RydWN0IHN0YXRzX29yYW5nZWZzX29iaiAqc3RhdHNfb3JhbmdlZnNfb2JqLAotCQkJc3RydWN0IHN0YXRzX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNoYXIgKmJ1ZikKLXsKLQlpbnQgcmM7Ci0KLQlnb3NzaXBfZGVidWcoR09TU0lQX1NZU0ZTX0RFQlVHLAotCQkgICAgICJpbnRfc3RhdHNfc2hvdzpzdGFydCBhdHRyLT5hdHRyLm5hbWU6JXM6XG4iLAotCQkgICAgIGF0dHItPmF0dHIubmFtZSk7Ci0KLQlyYyA9IHN5c2ZzX2ludF9zaG93KFNUQVRTX0tPQkpfSUQsIGJ1ZiwgKHZvaWQgKikgYXR0cik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGludF9zdG9yZShzdHJ1Y3Qgb3JhbmdlZnNfb2JqICpvcmFuZ2Vmc19vYmosCi0JCQkgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSBjb25zdCBjaGFyICpidWYsCi0JCQkgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3Qgc3lzZnNfaW50X3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorICAgIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCByYyA9IDA7CiAKIAlnb3NzaXBfZGVidWcoR09TU0lQX1NZU0ZTX0RFQlVHLAotCQkgICAgICJpbnRfc3RvcmU6IHN0YXJ0IGF0dHItPmF0dHIubmFtZTolczogYnVmOiVzOlxuIiwKKwkJICAgICAic3lzZnNfaW50X3N0b3JlOiBzdGFydCBhdHRyLT5hdHRyLm5hbWU6JXM6IGJ1ZjolczpcbiIsCiAJCSAgICAgYXR0ci0+YXR0ci5uYW1lLCBidWYpOwogCiAJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAib3BfdGltZW91dF9zZWNzIikpIHsKQEAgLTc2MiwxMCArMjcwLDEwIEBACiAJCXJjID0ga3N0cnRvaW50KGJ1ZiwgMCwgJnNsb3RfdGltZW91dF9zZWNzKTsKIAkJZ290byBvdXQ7CiAJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgImRjYWNoZV90aW1lb3V0X21zZWNzIikpIHsKLQkJcmMgPSBrc3RydG9pbnQoYnVmLCAwLCAmZGNhY2hlX3RpbWVvdXRfbXNlY3MpOworCQlyYyA9IGtzdHJ0b2ludChidWYsIDAsICZvcmFuZ2Vmc19kY2FjaGVfdGltZW91dF9tc2Vjcyk7CiAJCWdvdG8gb3V0OwogCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJnZXRhdHRyX3RpbWVvdXRfbXNlY3MiKSkgewotCQlyYyA9IGtzdHJ0b2ludChidWYsIDAsICZnZXRhdHRyX3RpbWVvdXRfbXNlY3MpOworCQlyYyA9IGtzdHJ0b2ludChidWYsIDAsICZvcmFuZ2Vmc19nZXRhdHRyX3RpbWVvdXRfbXNlY3MpOwogCQlnb3RvIG91dDsKIAl9IGVsc2UgewogCQlnb3RvIG91dDsKQEAgLTc4MywyNCArMjkxLDE5IEBACiAvKgogICogb2J0YWluIGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSB1c2Vyc3BhY2Ugd2l0aCBhIHNlcnZpY2Ugb3BlcmF0aW9uLgogICovCi1zdGF0aWMgaW50IHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdyhjaGFyICprb2JqX2lkLCBjaGFyICpidWYsIHZvaWQgKmF0dHIpCitzdGF0aWMgc3NpemVfdCBzeXNmc19zZXJ2aWNlX29wX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisgICAgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBvcmFuZ2Vmc19rZXJuZWxfb3BfcyAqbmV3X29wID0gTlVMTDsKIAlpbnQgcmMgPSAwOwogCWNoYXIgKnNlcl9vcF90eXBlID0gTlVMTDsKLQlzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlICpvcmFuZ2Vmc19hdHRyOwotCXN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphY2FjaGVfYXR0cjsKLQlzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICpjYXBjYWNoZV9hdHRyOwotCXN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICpjY2FjaGVfYXR0cjsKLQlzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqbmNhY2hlX2F0dHI7Ci0Jc3RydWN0IHBjX29yYW5nZWZzX2F0dHJpYnV0ZSAqcGNfYXR0cjsKIAlfX3UzMiBvcF9hbGxvY190eXBlOwogCiAJZ29zc2lwX2RlYnVnKEdPU1NJUF9TWVNGU19ERUJVRywKIAkJICAgICAic3lzZnNfc2VydmljZV9vcF9zaG93OiBpZDolczpcbiIsCi0JCSAgICAga29ial9pZCk7CisJCSAgICAga29iai0+bmFtZSk7CiAKLQlpZiAoc3RyY21wKGtvYmpfaWQsIFBDX0tPQkpfSUQpKQorCWlmIChzdHJjbXAoa29iai0+bmFtZSwgUENfS09CSl9JRCkpCiAJCW9wX2FsbG9jX3R5cGUgPSBPUkFOR0VGU19WRlNfT1BfUEFSQU07CiAJZWxzZQogCQlvcF9hbGxvY190eXBlID0gT1JBTkdFRlNfVkZTX09QX1BFUkZfQ09VTlQ7CkBAIC04MTgsMTI0ICszMjEsMTM1IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChzdHJjbXAoa29ial9pZCwgUENfS09CSl9JRCkpCisJaWYgKHN0cmNtcChrb2JqLT5uYW1lLCBQQ19LT0JKX0lEKSkKIAkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLnR5cGUgPSBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX0dFVDsKIAotCWlmICghc3RyY21wKGtvYmpfaWQsIE9SQU5HRUZTX0tPQkpfSUQpKSB7Ci0JCW9yYW5nZWZzX2F0dHIgPSAoc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSAqKWF0dHI7CisJaWYgKCFzdHJjbXAoa29iai0+bmFtZSwgT1JBTkdFRlNfS09CSl9JRCkpIHsKKwkJLyogRHJvcCB1bnN1cHBvcnRlZCByZXF1ZXN0cyBmaXJzdC4gKi8KKwkJaWYgKCEob3JhbmdlZnNfZmVhdHVyZXMgJiBPUkFOR0VGU19GRUFUVVJFX1JFQURBSEVBRCkgJiYKKwkJICAgICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInJlYWRhaGVhZF9jb3VudCIpIHx8CisJCSAgICAhc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInJlYWRhaGVhZF9zaXplIikgfHwKKwkJICAgICFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicmVhZGFoZWFkX2NvdW50X3NpemUiKSkpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CiAKLQkJaWYgKCFzdHJjbXAob3JhbmdlZnNfYXR0ci0+YXR0ci5uYW1lLCAicGVyZl9oaXN0b3J5X3NpemUiKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicGVyZl9oaXN0b3J5X3NpemUiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9QRVJGX0hJU1RPUllfU0laRTsKLQkJZWxzZSBpZiAoIXN0cmNtcChvcmFuZ2Vmc19hdHRyLT5hdHRyLm5hbWUsCisJCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLAogCQkJCSAicGVyZl90aW1lX2ludGVydmFsX3NlY3MiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9QRVJGX1RJTUVfSU5URVJWQUxfU0VDUzsKLQkJZWxzZSBpZiAoIXN0cmNtcChvcmFuZ2Vmc19hdHRyLT5hdHRyLm5hbWUsCisJCWVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLAogCQkJCSAicGVyZl9jb3VudGVyX3Jlc2V0IikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfUEVSRl9SRVNFVDsKIAotCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqX2lkLCBBQ0FDSEVfS09CSl9JRCkpIHsKLQkJYWNhY2hlX2F0dHIgPSAoc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKilhdHRyOworCQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKKwkJCQkgInJlYWRhaGVhZF9jb3VudCIpKQorCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KKwkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1JFQURBSEVBRF9DT1VOVDsKIAotCQlpZiAoIXN0cmNtcChhY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAidGltZW91dF9tc2VjcyIpKQorCQllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKKwkJCQkgInJlYWRhaGVhZF9zaXplIikpCisJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQorCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfUkVBREFIRUFEX1NJWkU7CisKKwkJZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCisJCQkJICJyZWFkYWhlYWRfY291bnRfc2l6ZSIpKQorCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KKwkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1JFQURBSEVBRF9DT1VOVF9TSVpFOworCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBBQ0FDSEVfS09CSl9JRCkpIHsKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAidGltZW91dF9tc2VjcyIpKQogCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0FDQUNIRV9USU1FT1VUX01TRUNTOwogCi0JCWlmICghc3RyY21wKGFjYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJoYXJkX2xpbWl0IikpCisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgImhhcmRfbGltaXQiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9BQ0FDSEVfSEFSRF9MSU1JVDsKIAotCQlpZiAoIXN0cmNtcChhY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAic29mdF9saW1pdCIpKQorCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQUNBQ0hFX1NPRlRfTElNSVQ7CiAKLQkJaWYgKCFzdHJjbXAoYWNhY2hlX2F0dHItPmF0dHIubmFtZSwgInJlY2xhaW1fcGVyY2VudGFnZSIpKQorCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJyZWNsYWltX3BlcmNlbnRhZ2UiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkgIE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQUNBQ0hFX1JFQ0xBSU1fUEVSQ0VOVEFHRTsKIAotCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqX2lkLCBDQVBDQUNIRV9LT0JKX0lEKSkgewotCQljYXBjYWNoZV9hdHRyID0gKHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKilhdHRyOwotCi0JCWlmICghc3RyY21wKGNhcGNhY2hlX2F0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfc2VjcyIpKQorCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBDQVBDQUNIRV9LT0JKX0lEKSkgeworCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJ0aW1lb3V0X3NlY3MiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9DQVBDQUNIRV9USU1FT1VUX1NFQ1M7CiAKLQkJaWYgKCFzdHJjbXAoY2FwY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKQorCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJoYXJkX2xpbWl0IikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0FQQ0FDSEVfSEFSRF9MSU1JVDsKIAotCQlpZiAoIXN0cmNtcChjYXBjYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpCisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInNvZnRfbGltaXQiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9DQVBDQUNIRV9TT0ZUX0xJTUlUOwogCi0JCWlmICghc3RyY21wKGNhcGNhY2hlX2F0dHItPmF0dHIubmFtZSwgInJlY2xhaW1fcGVyY2VudGFnZSIpKQorCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJyZWNsYWltX3BlcmNlbnRhZ2UiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkgIE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0FQQ0FDSEVfUkVDTEFJTV9QRVJDRU5UQUdFOwogCi0JfSBlbHNlIGlmICghc3RyY21wKGtvYmpfaWQsIENDQUNIRV9LT0JKX0lEKSkgewotCQljY2FjaGVfYXR0ciA9IChzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqKWF0dHI7Ci0KLQkJaWYgKCFzdHJjbXAoY2NhY2hlX2F0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfc2VjcyIpKQorCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBDQ0FDSEVfS09CSl9JRCkpIHsKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAidGltZW91dF9zZWNzIikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0NBQ0hFX1RJTUVPVVRfU0VDUzsKIAotCQlpZiAoIXN0cmNtcChjY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKQorCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJoYXJkX2xpbWl0IikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0NBQ0hFX0hBUkRfTElNSVQ7CiAKLQkJaWYgKCFzdHJjbXAoY2NhY2hlX2F0dHItPmF0dHIubmFtZSwgInNvZnRfbGltaXQiKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAic29mdF9saW1pdCIpKQogCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0NDQUNIRV9TT0ZUX0xJTUlUOwogCi0JCWlmICghc3RyY21wKGNjYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJyZWNsYWltX3BlcmNlbnRhZ2UiKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicmVjbGFpbV9wZXJjZW50YWdlIikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0NDQUNIRV9SRUNMQUlNX1BFUkNFTlRBR0U7CiAKLQl9IGVsc2UgaWYgKCFzdHJjbXAoa29ial9pZCwgTkNBQ0hFX0tPQkpfSUQpKSB7Ci0JCW5jYWNoZV9hdHRyID0gKHN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICopYXR0cjsKLQotCQlpZiAoIXN0cmNtcChuY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAidGltZW91dF9tc2VjcyIpKQorCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBOQ0FDSEVfS09CSl9JRCkpIHsKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAidGltZW91dF9tc2VjcyIpKQogCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX05DQUNIRV9USU1FT1VUX01TRUNTOwogCi0JCWlmICghc3RyY21wKG5jYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJoYXJkX2xpbWl0IikpCisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgImhhcmRfbGltaXQiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9OQ0FDSEVfSEFSRF9MSU1JVDsKIAotCQlpZiAoIXN0cmNtcChuY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAic29mdF9saW1pdCIpKQorCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfTkNBQ0hFX1NPRlRfTElNSVQ7CiAKLQkJaWYgKCFzdHJjbXAobmNhY2hlX2F0dHItPmF0dHIubmFtZSwgInJlY2xhaW1fcGVyY2VudGFnZSIpKQorCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJyZWNsYWltX3BlcmNlbnRhZ2UiKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkgIE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfTkNBQ0hFX1JFQ0xBSU1fUEVSQ0VOVEFHRTsKIAotCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqX2lkLCBQQ19LT0JKX0lEKSkgewotCQlwY19hdHRyID0gKHN0cnVjdCBwY19vcmFuZ2Vmc19hdHRyaWJ1dGUgKilhdHRyOwotCi0JCWlmICghc3RyY21wKHBjX2F0dHItPmF0dHIubmFtZSwgQUNBQ0hFX0tPQkpfSUQpKQorCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBQQ19LT0JKX0lEKSkgeworCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsIEFDQUNIRV9LT0JKX0lEKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wZXJmX2NvdW50LnR5cGUgPQogCQkJCU9SQU5HRUZTX1BFUkZfQ09VTlRfUkVRVUVTVF9BQ0FDSEU7CiAKLQkJaWYgKCFzdHJjbXAocGNfYXR0ci0+YXR0ci5uYW1lLCBDQVBDQUNIRV9LT0JKX0lEKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCBDQVBDQUNIRV9LT0JKX0lEKSkKIAkJCW5ld19vcC0+dXBjYWxsLnJlcS5wZXJmX2NvdW50LnR5cGUgPQogCQkJCU9SQU5HRUZTX1BFUkZfQ09VTlRfUkVRVUVTVF9DQVBDQUNIRTsKIAotCQlpZiAoIXN0cmNtcChwY19hdHRyLT5hdHRyLm5hbWUsIE5DQUNIRV9LT0JKX0lEKSkKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCBOQ0FDSEVfS09CSl9JRCkpCiAJCQluZXdfb3AtPnVwY2FsbC5yZXEucGVyZl9jb3VudC50eXBlID0KIAkJCQlPUkFOR0VGU19QRVJGX0NPVU5UX1JFUVVFU1RfTkNBQ0hFOwogCiAJfSBlbHNlIHsKIAkJZ29zc2lwX2Vycigic3lzZnNfc2VydmljZV9vcF9zaG93OiB1bmtub3duIGtvYmpfaWQ6JXM6XG4iLAotCQkJICAga29ial9pZCk7CisJCQkgICBrb2JqLT5uYW1lKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAKIAotCWlmIChzdHJjbXAoa29ial9pZCwgUENfS09CSl9JRCkpCisJaWYgKHN0cmNtcChrb2JqLT5uYW1lLCBQQ19LT0JKX0lEKSkKIAkJc2VyX29wX3R5cGUgPSAib3JhbmdlZnNfcGFyYW0iOwogCWVsc2UKIAkJc2VyX29wX3R5cGUgPSAib3JhbmdlZnNfcGVyZl9jb3VudCI7CkBAIC05NDgsMTEgKzQ2MiwxOCBAQAogCiBvdXQ6CiAJaWYgKCFyYykgewotCQlpZiAoc3RyY21wKGtvYmpfaWQsIFBDX0tPQkpfSUQpKSB7Ci0JCQlyYyA9IHNjbnByaW50ZihidWYsCi0JCQkJICAgICAgIFBBR0VfU0laRSwKLQkJCQkgICAgICAgIiVkXG4iLAotCQkJCSAgICAgICAoaW50KW5ld19vcC0+ZG93bmNhbGwucmVzcC5wYXJhbS52YWx1ZSk7CisJCWlmIChzdHJjbXAoa29iai0+bmFtZSwgUENfS09CSl9JRCkpIHsKKwkJCWlmIChuZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPT0KKwkJCSAgICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1JFQURBSEVBRF9DT1VOVF9TSVpFKSB7CisJCQkJcmMgPSBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZCAlZFxuIiwKKwkJCQkgICAgKGludCluZXdfb3AtPmRvd25jYWxsLnJlc3AucGFyYW0udS4KKwkJCQkgICAgdmFsdWUzMlswXSwKKwkJCQkgICAgKGludCluZXdfb3AtPmRvd25jYWxsLnJlc3AucGFyYW0udS4KKwkJCQkgICAgdmFsdWUzMlsxXSk7CisJCQl9IGVsc2UgeworCQkJCXJjID0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCQkJICAgIChpbnQpbmV3X29wLT5kb3duY2FsbC5yZXNwLnBhcmFtLnUudmFsdWU2NCk7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQlyYyA9IHNjbnByaW50ZigKIAkJCQlidWYsCkBAIC05NjgsNzcgKzQ4OSw2IEBACiAKIH0KIAotc3RhdGljIHNzaXplX3Qgc2VydmljZV9vcmFuZ2Vmc19zaG93KHN0cnVjdCBvcmFuZ2Vmc19vYmogKm9yYW5nZWZzX29iaiwKLQkJCQkgICAgIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjaGFyICpidWYpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3lzZnNfc2VydmljZV9vcF9zaG93KE9SQU5HRUZTX0tPQkpfSUQsIGJ1ZiwgKHZvaWQgKilhdHRyKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3QKLQlzZXJ2aWNlX2FjYWNoZV9zaG93KHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfb2JqICphY2FjaGVfb3JhbmdlZnNfb2JqLAotCQkJICAgIHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmMgPSAwOwotCi0JcmMgPSBzeXNmc19zZXJ2aWNlX29wX3Nob3coQUNBQ0hFX0tPQkpfSUQsIGJ1ZiwgKHZvaWQgKilhdHRyKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2VydmljZV9jYXBjYWNoZV9zaG93KHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19vYmoKLQkJCQkJKmNhcGNhY2hlX29yYW5nZWZzX29iaiwKLQkJCQkgICAgIHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgICBjaGFyICpidWYpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3lzZnNfc2VydmljZV9vcF9zaG93KENBUENBQ0hFX0tPQkpfSUQsIGJ1ZiwgKHZvaWQgKilhdHRyKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHNzaXplX3Qgc2VydmljZV9jY2FjaGVfc2hvdyhzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX29iagotCQkJCQkqY2NhY2hlX29yYW5nZWZzX29iaiwKLQkJCQkgICBzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICBjaGFyICpidWYpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3lzZnNfc2VydmljZV9vcF9zaG93KENDQUNIRV9LT0JKX0lELCBidWYsICh2b2lkICopYXR0cik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci0Jc2VydmljZV9uY2FjaGVfc2hvdyhzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX29iaiAqbmNhY2hlX29yYW5nZWZzX29iaiwKLQkJCSAgICBzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICBjaGFyICpidWYpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3lzZnNfc2VydmljZV9vcF9zaG93KE5DQUNIRV9LT0JKX0lELCBidWYsICh2b2lkICopYXR0cik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci0Jc2VydmljZV9wY19zaG93KHN0cnVjdCBwY19vcmFuZ2Vmc19vYmogKnBjX29yYW5nZWZzX29iaiwKLQkJCSAgICBzdHJ1Y3QgcGNfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNoYXIgKmJ1ZikKLXsKLQlpbnQgcmMgPSAwOwotCi0JcmMgPSBzeXNmc19zZXJ2aWNlX29wX3Nob3coUENfS09CSl9JRCwgYnVmLCAodm9pZCAqKWF0dHIpOwotCi0JcmV0dXJuIHJjOwotfQotCiAvKgogICogcGFzcyBhdHRyaWJ1dGUgdmFsdWVzIGJhY2sgdG8gdXNlcnNwYWNlIHdpdGggYSBzZXJ2aWNlIG9wZXJhdGlvbi4KICAqCkBAIC0xMDUwLDIwICs1MDAsMTYgQEAKICAqIFdlIHdhbnQgdG8gcmV0dXJuIDEgaWYgd2UgdGhpbmsgZXZlcnl0aGluZyB3ZW50IE9LLCBhbmQKICAqIEVJTlZBTCBpZiBub3QuCiAgKi8KLXN0YXRpYyBpbnQgc3lzZnNfc2VydmljZV9vcF9zdG9yZShjaGFyICprb2JqX2lkLCBjb25zdCBjaGFyICpidWYsIHZvaWQgKmF0dHIpCitzdGF0aWMgc3NpemVfdCBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorICAgIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBvcmFuZ2Vmc19rZXJuZWxfb3BfcyAqbmV3X29wID0gTlVMTDsKIAlpbnQgdmFsID0gMDsKIAlpbnQgcmMgPSAwOwotCXN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgKm9yYW5nZWZzX2F0dHI7Ci0Jc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmFjYWNoZV9hdHRyOwotCXN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmNhcGNhY2hlX2F0dHI7Ci0Jc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgKmNjYWNoZV9hdHRyOwotCXN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICpuY2FjaGVfYXR0cjsKIAogCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfU1lTRlNfREVCVUcsCiAJCSAgICAgInN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmU6IGlkOiVzOlxuIiwKLQkJICAgICBrb2JqX2lkKTsKKwkJICAgICBrb2JqLT5uYW1lKTsKIAogCW5ld19vcCA9IG9wX2FsbG9jKE9SQU5HRUZTX1ZGU19PUF9QQVJBTSk7CiAJaWYgKCFuZXdfb3ApCkBAIC0xMDc5LDE2ICs1MjUsMjkgQEAKIAl9CiAKIAkvKgotCSAqIFRoZSB2YWx1ZSB3ZSB3YW50IHRvIHNlbmQgYmFjayB0byB1c2Vyc3BhY2UgaXMgaW4gYnVmLgorCSAqIFRoZSB2YWx1ZSB3ZSB3YW50IHRvIHNlbmQgYmFjayB0byB1c2Vyc3BhY2UgaXMgaW4gYnVmLCB1bmxlc3MgdGhpcworCSAqIHRoZXJlIGFyZSB0d28gcGFyYW1ldGVycywgd2hpY2ggaXMgc3BlY2lhbGx5IGhhbmRsZWQgYmVsb3cuCiAJICovCi0JcmMgPSBrc3RydG9pbnQoYnVmLCAwLCAmdmFsKTsKLQlpZiAocmMpCi0JCWdvdG8gb3V0OworCWlmIChzdHJjbXAoa29iai0+bmFtZSwgT1JBTkdFRlNfS09CSl9JRCkgfHwKKwkgICAgc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInJlYWRhaGVhZF9jb3VudF9zaXplIikpIHsKKwkJcmMgPSBrc3RydG9pbnQoYnVmLCAwLCAmdmFsKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ7CisJfQogCi0JaWYgKCFzdHJjbXAoa29ial9pZCwgT1JBTkdFRlNfS09CSl9JRCkpIHsKLQkJb3JhbmdlZnNfYXR0ciA9IChzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlICopYXR0cjsKKwluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0udHlwZSA9IE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfU0VUOwogCi0JCWlmICghc3RyY21wKG9yYW5nZWZzX2F0dHItPmF0dHIubmFtZSwgInBlcmZfaGlzdG9yeV9zaXplIikpIHsKKwlpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBPUkFOR0VGU19LT0JKX0lEKSkgeworCQkvKiBEcm9wIHVuc3VwcG9ydGVkIHJlcXVlc3RzIGZpcnN0LiAqLworCQlpZiAoIShvcmFuZ2Vmc19mZWF0dXJlcyAmIE9SQU5HRUZTX0ZFQVRVUkVfUkVBREFIRUFEKSAmJgorCQkgICAgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicmVhZGFoZWFkX2NvdW50IikgfHwKKwkJICAgICFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAicmVhZGFoZWFkX3NpemUiKSB8fAorCQkgICAgIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJyZWFkYWhlYWRfY291bnRfc2l6ZSIpKSkgeworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJwZXJmX2hpc3Rvcnlfc2l6ZSIpKSB7CiAJCQlpZiAodmFsID4gMCkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1BFUkZfSElTVE9SWV9TSVpFOwpAQCAtMTA5Niw3ICs1NTUsNyBAQAogCQkJCXJjID0gMDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKG9yYW5nZWZzX2F0dHItPmF0dHIubmFtZSwKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKIAkJCQkgICAicGVyZl90aW1lX2ludGVydmFsX3NlY3MiKSkgewogCQkJaWYgKHZhbCA+IDApIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQpAQCAtMTEwNSw3ICs1NjQsNyBAQAogCQkJCXJjID0gMDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKG9yYW5nZWZzX2F0dHItPmF0dHIubmFtZSwKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKIAkJCQkgICAicGVyZl9jb3VudGVyX3Jlc2V0IikpIHsKIAkJCWlmICgodmFsID09IDApIHx8ICh2YWwgPT0gMSkpIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQpAQCAtMTExNCwxMiArNTczLDU1IEBACiAJCQkJcmMgPSAwOwogCQkJCWdvdG8gb3V0OwogCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLAorCQkJCSAgICJyZWFkYWhlYWRfY291bnQiKSkgeworCQkJaWYgKCh2YWwgPj0gMCkpIHsKKwkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQorCQkJCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfUkVBREFIRUFEX0NPVU5UOworCQkJfSBlbHNlIHsKKwkJCQlyYyA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCisJCQkJICAgInJlYWRhaGVhZF9zaXplIikpIHsKKwkJCWlmICgodmFsID49IDApKSB7CisJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KKwkJCQlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1JFQURBSEVBRF9TSVpFOworCQkJfSBlbHNlIHsKKwkJCQlyYyA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCisJCQkJICAgInJlYWRhaGVhZF9jb3VudF9zaXplIikpIHsKKwkJCWludCB2YWwxLCB2YWwyOworCQkJcmMgPSBzc2NhbmYoYnVmLCAiJWQgJWQiLCAmdmFsMSwgJnZhbDIpOworCQkJaWYgKHJjIDwgMikgeworCQkJCXJjID0gMDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmICgodmFsMSA+PSAwKSAmJiAodmFsMiA+PSAwKSkgeworCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CisJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9SRUFEQUhFQURfQ09VTlRfU0laRTsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLnUudmFsdWUzMlswXSA9IHZhbDE7CisJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0udS52YWx1ZTMyWzFdID0gdmFsMjsKKwkJCWdvdG8gdmFsdWVfc2V0OworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLAorCQkJCSAgICJwZXJmX2NvdW50ZXJfcmVzZXQiKSkgeworCQkJaWYgKCh2YWwgPiAwKSkgeworCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CisJCQkJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9SRUFEQUhFQURfQ09VTlRfU0laRTsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSAwOworCQkJCWdvdG8gb3V0OworCQkJfQogCQl9CiAKLQl9IGVsc2UgaWYgKCFzdHJjbXAoa29ial9pZCwgQUNBQ0hFX0tPQkpfSUQpKSB7Ci0JCWFjYWNoZV9hdHRyID0gKHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICopYXR0cjsKLQotCQlpZiAoIXN0cmNtcChhY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKSB7CisJfSBlbHNlIGlmICghc3RyY21wKGtvYmotPm5hbWUsIEFDQUNIRV9LT0JKX0lEKSkgeworCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJoYXJkX2xpbWl0IikpIHsKIAkJCWlmICh2YWwgPiAtMSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0FDQUNIRV9IQVJEX0xJTUlUOwpAQCAtMTEyNyw3ICs2MjksNyBAQAogCQkJCXJjID0gMDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKGFjYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpIHsKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInNvZnRfbGltaXQiKSkgewogCQkJaWYgKHZhbCA+IC0xKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQkgIE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQUNBQ0hFX1NPRlRfTElNSVQ7CkBAIC0xMTM1LDcgKzYzNyw3IEBACiAJCQkJcmMgPSAwOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAoYWNhY2hlX2F0dHItPmF0dHIubmFtZSwKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKIAkJCQkgICAicmVjbGFpbV9wZXJjZW50YWdlIikpIHsKIAkJCWlmICgodmFsID4gLTEpICYmICh2YWwgPCAxMDEpKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KQEAgLTExNDQsNyArNjQ2LDcgQEAKIAkJCQlyYyA9IDA7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChhY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAidGltZW91dF9tc2VjcyIpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJ0aW1lb3V0X21zZWNzIikpIHsKIAkJCWlmICh2YWwgPiAtMSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0FDQUNIRV9USU1FT1VUX01TRUNTOwpAQCAtMTE1NCwxMCArNjU2LDggQEAKIAkJCX0KIAkJfQogCi0JfSBlbHNlIGlmICghc3RyY21wKGtvYmpfaWQsIENBUENBQ0hFX0tPQkpfSUQpKSB7Ci0JCWNhcGNhY2hlX2F0dHIgPSAoc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqKWF0dHI7Ci0KLQkJaWYgKCFzdHJjbXAoY2FwY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKSB7CisJfSBlbHNlIGlmICghc3RyY21wKGtvYmotPm5hbWUsIENBUENBQ0hFX0tPQkpfSUQpKSB7CisJCWlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgImhhcmRfbGltaXQiKSkgewogCQkJaWYgKHZhbCA+IC0xKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQkgIE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0FQQ0FDSEVfSEFSRF9MSU1JVDsKQEAgLTExNjUsNyArNjY1LDcgQEAKIAkJCQlyYyA9IDA7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChjYXBjYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpIHsKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInNvZnRfbGltaXQiKSkgewogCQkJaWYgKHZhbCA+IC0xKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQkgIE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0FQQ0FDSEVfU09GVF9MSU1JVDsKQEAgLTExNzMsNyArNjczLDcgQEAKIAkJCQlyYyA9IDA7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChjYXBjYWNoZV9hdHRyLT5hdHRyLm5hbWUsCisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCiAJCQkJICAgInJlY2xhaW1fcGVyY2VudGFnZSIpKSB7CiAJCQlpZiAoKHZhbCA+IC0xKSAmJiAodmFsIDwgMTAxKSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CkBAIC0xMTgyLDcgKzY4Miw3IEBACiAJCQkJcmMgPSAwOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAoY2FwY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAidGltZW91dF9zZWNzIikpIHsKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfc2VjcyIpKSB7CiAJCQlpZiAodmFsID4gLTEpIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCSAgT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9DQVBDQUNIRV9USU1FT1VUX1NFQ1M7CkBAIC0xMTkyLDEwICs2OTIsOCBAQAogCQkJfQogCQl9CiAKLQl9IGVsc2UgaWYgKCFzdHJjbXAoa29ial9pZCwgQ0NBQ0hFX0tPQkpfSUQpKSB7Ci0JCWNjYWNoZV9hdHRyID0gKHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICopYXR0cjsKLQotCQlpZiAoIXN0cmNtcChjY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKSB7CisJfSBlbHNlIGlmICghc3RyY21wKGtvYmotPm5hbWUsIENDQUNIRV9LT0JKX0lEKSkgeworCQlpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJoYXJkX2xpbWl0IikpIHsKIAkJCWlmICh2YWwgPiAtMSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX0NDQUNIRV9IQVJEX0xJTUlUOwpAQCAtMTIwMyw3ICs3MDEsNyBAQAogCQkJCXJjID0gMDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKGNjYWNoZV9hdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpIHsKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInNvZnRfbGltaXQiKSkgewogCQkJaWYgKHZhbCA+IC0xKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KIAkJCQkgIE9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfQ0NBQ0hFX1NPRlRfTElNSVQ7CkBAIC0xMjExLDcgKzcwOSw3IEBACiAJCQkJcmMgPSAwOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAoY2NhY2hlX2F0dHItPmF0dHIubmFtZSwKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwKIAkJCQkgICAicmVjbGFpbV9wZXJjZW50YWdlIikpIHsKIAkJCWlmICgodmFsID4gLTEpICYmICh2YWwgPCAxMDEpKSB7CiAJCQkJbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLm9wID0KQEAgLTEyMjAsNyArNzE4LDcgQEAKIAkJCQlyYyA9IDA7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChjY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAidGltZW91dF9zZWNzIikpIHsKKwkJfSBlbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfc2VjcyIpKSB7CiAJCQlpZiAodmFsID4gLTEpIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCSAgT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9DQ0FDSEVfVElNRU9VVF9TRUNTOwpAQCAtMTIzMCwxMCArNzI4LDggQEAKIAkJCX0KIAkJfQogCi0JfSBlbHNlIGlmICghc3RyY21wKGtvYmpfaWQsIE5DQUNIRV9LT0JKX0lEKSkgewotCQluY2FjaGVfYXR0ciA9IChzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqKWF0dHI7Ci0KLQkJaWYgKCFzdHJjbXAobmNhY2hlX2F0dHItPmF0dHIubmFtZSwgImhhcmRfbGltaXQiKSkgeworCX0gZWxzZSBpZiAoIXN0cmNtcChrb2JqLT5uYW1lLCBOQ0FDSEVfS09CSl9JRCkpIHsKKwkJaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAiaGFyZF9saW1pdCIpKSB7CiAJCQlpZiAodmFsID4gLTEpIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCSAgT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9OQ0FDSEVfSEFSRF9MSU1JVDsKQEAgLTEyNDEsNyArNzM3LDcgQEAKIAkJCQlyYyA9IDA7CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChuY2FjaGVfYXR0ci0+YXR0ci5uYW1lLCAic29mdF9saW1pdCIpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJzb2Z0X2xpbWl0IikpIHsKIAkJCWlmICh2YWwgPiAtMSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CiAJCQkJICBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX05DQUNIRV9TT0ZUX0xJTUlUOwpAQCAtMTI0OSw3ICs3NDUsNyBAQAogCQkJCXJjID0gMDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJfSBlbHNlIGlmICghc3RyY21wKG5jYWNoZV9hdHRyLT5hdHRyLm5hbWUsCisJCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLT5hdHRyLm5hbWUsCiAJCQkJICAgInJlY2xhaW1fcGVyY2VudGFnZSIpKSB7CiAJCQlpZiAoKHZhbCA+IC0xKSAmJiAodmFsIDwgMTAxKSkgewogCQkJCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS5vcCA9CkBAIC0xMjU4LDcgKzc1NCw3IEBACiAJCQkJcmMgPSAwOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAobmNhY2hlX2F0dHItPmF0dHIubmFtZSwgInRpbWVvdXRfbXNlY3MiKSkgeworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAidGltZW91dF9tc2VjcyIpKSB7CiAJCQlpZiAodmFsID4gLTEpIHsKIAkJCQluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0ub3AgPQogCQkJCSAgT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9OQ0FDSEVfVElNRU9VVF9NU0VDUzsKQEAgLTEyNzAsMTQgKzc2NiwxMyBAQAogCiAJfSBlbHNlIHsKIAkJZ29zc2lwX2Vycigic3lzZnNfc2VydmljZV9vcF9zdG9yZTogdW5rbm93biBrb2JqX2lkOiVzOlxuIiwKLQkJCSAgIGtvYmpfaWQpOworCQkJICAga29iai0+bmFtZSk7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCi0JbmV3X29wLT51cGNhbGwucmVxLnBhcmFtLnR5cGUgPSBPUkFOR0VGU19QQVJBTV9SRVFVRVNUX1NFVDsKLQotCW5ld19vcC0+dXBjYWxsLnJlcS5wYXJhbS52YWx1ZSA9IHZhbDsKKwluZXdfb3AtPnVwY2FsbC5yZXEucGFyYW0udS52YWx1ZTY0ID0gdmFsOwordmFsdWVfc2V0OgogCiAJLyoKIAkgKiBUaGUgc2VydmljZV9vcGVyYXRpb24gd2lsbCByZXR1cm4gYSBlcnJubyByZXR1cm4gY29kZSBvbgpAQCAtMTI5MCw3ICs3ODUsNyBAQAogCQkJcmMpOwogCQlyYyA9IDA7CiAJfSBlbHNlIHsKLQkJcmMgPSAxOworCQlyYyA9IGNvdW50OwogCX0KIAogb3V0OgpAQCAtMTMwMiwxMjcgKzc5Nyw1NiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHNzaXplX3QKLQlzZXJ2aWNlX29yYW5nZWZzX3N0b3JlKHN0cnVjdCBvcmFuZ2Vmc19vYmogKm9yYW5nZWZzX29iaiwKLQkJCSAgICAgICBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSAgICAgICBzaXplX3QgY291bnQpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3lzZnNfc2VydmljZV9vcF9zdG9yZShPUkFOR0VGU19LT0JKX0lELCBidWYsICh2b2lkICopIGF0dHIpOwotCi0JLyogcmMgc2hvdWxkIGhhdmUgYW4gZXJybm8gdmFsdWUgaWYgdGhlIHNlcnZpY2Vfb3Agd2VudCBiYWQuICovCi0JaWYgKHJjID09IDEpCi0JCXJjID0gY291bnQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci0Jc2VydmljZV9hY2FjaGVfc3RvcmUoc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19vYmogKmFjYWNoZV9vcmFuZ2Vmc19vYmosCi0JCQkgICAgIHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgcmMgPSAwOwotCi0JcmMgPSBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKEFDQUNIRV9LT0JKX0lELCBidWYsICh2b2lkICopIGF0dHIpOwotCi0JLyogcmMgc2hvdWxkIGhhdmUgYW4gZXJybm8gdmFsdWUgaWYgdGhlIHNlcnZpY2Vfb3Agd2VudCBiYWQuICovCi0JaWYgKHJjID09IDEpCi0JCXJjID0gY291bnQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci0Jc2VydmljZV9jYXBjYWNoZV9zdG9yZShzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfb2JqCi0JCQkJKmNhcGNhY2hlX29yYW5nZWZzX29iaiwKLQkJCSAgICAgICBzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSAgICAgICBzaXplX3QgY291bnQpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3lzZnNfc2VydmljZV9vcF9zdG9yZShDQVBDQUNIRV9LT0JKX0lELCBidWYsICh2b2lkICopIGF0dHIpOwotCi0JLyogcmMgc2hvdWxkIGhhdmUgYW4gZXJybm8gdmFsdWUgaWYgdGhlIHNlcnZpY2Vfb3Agd2VudCBiYWQuICovCi0JaWYgKHJjID09IDEpCi0JCXJjID0gY291bnQ7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNlcnZpY2VfY2NhY2hlX3N0b3JlKHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfb2JqCi0JCQkJCSpjY2FjaGVfb3JhbmdlZnNfb2JqLAotCQkJCSAgICBzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgY29uc3QgY2hhciAqYnVmLAotCQkJCSAgICBzaXplX3QgY291bnQpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3lzZnNfc2VydmljZV9vcF9zdG9yZShDQ0FDSEVfS09CSl9JRCwgYnVmLCAodm9pZCAqKSBhdHRyKTsKLQotCS8qIHJjIHNob3VsZCBoYXZlIGFuIGVycm5vIHZhbHVlIGlmIHRoZSBzZXJ2aWNlX29wIHdlbnQgYmFkLiAqLwotCWlmIChyYyA9PSAxKQotCQlyYyA9IGNvdW50OwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgc3NpemVfdAotCXNlcnZpY2VfbmNhY2hlX3N0b3JlKHN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfb2JqICpuY2FjaGVfb3JhbmdlZnNfb2JqLAotCQkJICAgICBzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgY29uc3QgY2hhciAqYnVmLAotCQkJICAgICBzaXplX3QgY291bnQpCi17Ci0JaW50IHJjID0gMDsKLQotCXJjID0gc3lzZnNfc2VydmljZV9vcF9zdG9yZShOQ0FDSEVfS09CSl9JRCwgYnVmLCAodm9pZCAqKSBhdHRyKTsKLQotCS8qIHJjIHNob3VsZCBoYXZlIGFuIGVycm5vIHZhbHVlIGlmIHRoZSBzZXJ2aWNlX29wIHdlbnQgYmFkLiAqLwotCWlmIChyYyA9PSAxKQotCQlyYyA9IGNvdW50OwotCi0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBvcF90aW1lb3V0X3NlY3NfYXR0cmlidXRlID0KLQlfX0FUVFIob3BfdGltZW91dF9zZWNzLCAwNjY0LCBpbnRfb3JhbmdlZnNfc2hvdywgaW50X3N0b3JlKTsKKwlfX0FUVFIob3BfdGltZW91dF9zZWNzLCAwNjY0LCBzeXNmc19pbnRfc2hvdywgc3lzZnNfaW50X3N0b3JlKTsKIAogc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgc2xvdF90aW1lb3V0X3NlY3NfYXR0cmlidXRlID0KLQlfX0FUVFIoc2xvdF90aW1lb3V0X3NlY3MsIDA2NjQsIGludF9vcmFuZ2Vmc19zaG93LCBpbnRfc3RvcmUpOworCV9fQVRUUihzbG90X3RpbWVvdXRfc2VjcywgMDY2NCwgc3lzZnNfaW50X3Nob3csIHN5c2ZzX2ludF9zdG9yZSk7CiAKIHN0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIGRjYWNoZV90aW1lb3V0X21zZWNzX2F0dHJpYnV0ZSA9Ci0JX19BVFRSKGRjYWNoZV90aW1lb3V0X21zZWNzLCAwNjY0LCBpbnRfb3JhbmdlZnNfc2hvdywgaW50X3N0b3JlKTsKKwlfX0FUVFIoZGNhY2hlX3RpbWVvdXRfbXNlY3MsIDA2NjQsIHN5c2ZzX2ludF9zaG93LCBzeXNmc19pbnRfc3RvcmUpOwogCiBzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBnZXRhdHRyX3RpbWVvdXRfbXNlY3NfYXR0cmlidXRlID0KLQlfX0FUVFIoZ2V0YXR0cl90aW1lb3V0X21zZWNzLCAwNjY0LCBpbnRfb3JhbmdlZnNfc2hvdywgaW50X3N0b3JlKTsKKwlfX0FUVFIoZ2V0YXR0cl90aW1lb3V0X21zZWNzLCAwNjY0LCBzeXNmc19pbnRfc2hvdywgc3lzZnNfaW50X3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgcmVhZGFoZWFkX2NvdW50X2F0dHJpYnV0ZSA9CisJX19BVFRSKHJlYWRhaGVhZF9jb3VudCwgMDY2NCwgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKKworc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgcmVhZGFoZWFkX3NpemVfYXR0cmlidXRlID0KKwlfX0FUVFIocmVhZGFoZWFkX3NpemUsIDA2NjQsIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CisKK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIHJlYWRhaGVhZF9jb3VudF9zaXplX2F0dHJpYnV0ZSA9CisJX19BVFRSKHJlYWRhaGVhZF9jb3VudF9zaXplLCAwNjY0LCBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCiBzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBwZXJmX2NvdW50ZXJfcmVzZXRfYXR0cmlidXRlID0KIAlfX0FUVFIocGVyZl9jb3VudGVyX3Jlc2V0LAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX29yYW5nZWZzX3Nob3csCi0JICAgICAgIHNlcnZpY2Vfb3JhbmdlZnNfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCiBzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBwZXJmX2hpc3Rvcnlfc2l6ZV9hdHRyaWJ1dGUgPQogCV9fQVRUUihwZXJmX2hpc3Rvcnlfc2l6ZSwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9vcmFuZ2Vmc19zaG93LAotCSAgICAgICBzZXJ2aWNlX29yYW5nZWZzX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAogc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgcGVyZl90aW1lX2ludGVydmFsX3NlY3NfYXR0cmlidXRlID0KIAlfX0FUVFIocGVyZl90aW1lX2ludGVydmFsX3NlY3MsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2Vfb3JhbmdlZnNfc2hvdywKLQkgICAgICAgc2VydmljZV9vcmFuZ2Vmc19zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpvcmFuZ2Vmc19kZWZhdWx0X2F0dHJzW10gPSB7CiAJJm9wX3RpbWVvdXRfc2Vjc19hdHRyaWJ1dGUuYXR0ciwKIAkmc2xvdF90aW1lb3V0X3NlY3NfYXR0cmlidXRlLmF0dHIsCiAJJmRjYWNoZV90aW1lb3V0X21zZWNzX2F0dHJpYnV0ZS5hdHRyLAogCSZnZXRhdHRyX3RpbWVvdXRfbXNlY3NfYXR0cmlidXRlLmF0dHIsCisJJnJlYWRhaGVhZF9jb3VudF9hdHRyaWJ1dGUuYXR0ciwKKwkmcmVhZGFoZWFkX3NpemVfYXR0cmlidXRlLmF0dHIsCisJJnJlYWRhaGVhZF9jb3VudF9zaXplX2F0dHJpYnV0ZS5hdHRyLAogCSZwZXJmX2NvdW50ZXJfcmVzZXRfYXR0cmlidXRlLmF0dHIsCiAJJnBlcmZfaGlzdG9yeV9zaXplX2F0dHJpYnV0ZS5hdHRyLAogCSZwZXJmX3RpbWVfaW50ZXJ2YWxfc2Vjc19hdHRyaWJ1dGUuYXR0ciwKQEAgLTE0MzEsMzMgKzg1NSwzMiBAQAogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBvcmFuZ2Vmc19rdHlwZSA9IHsKIAkuc3lzZnNfb3BzID0gJm9yYW5nZWZzX3N5c2ZzX29wcywKLQkucmVsZWFzZSA9IG9yYW5nZWZzX3JlbGVhc2UsCiAJLmRlZmF1bHRfYXR0cnMgPSBvcmFuZ2Vmc19kZWZhdWx0X2F0dHJzLAogfTsKIAotc3RhdGljIHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIGFjYWNoZV9oYXJkX2xpbWl0X2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBhY2FjaGVfaGFyZF9saW1pdF9hdHRyaWJ1dGUgPQogCV9fQVRUUihoYXJkX2xpbWl0LAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX2FjYWNoZV9zaG93LAotCSAgICAgICBzZXJ2aWNlX2FjYWNoZV9zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSBhY2FjaGVfcmVjbGFpbV9wZXJjZW50X2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBhY2FjaGVfcmVjbGFpbV9wZXJjZW50X2F0dHJpYnV0ZSA9CiAJX19BVFRSKHJlY2xhaW1fcGVyY2VudGFnZSwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9hY2FjaGVfc2hvdywKLQkgICAgICAgc2VydmljZV9hY2FjaGVfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCi1zdGF0aWMgc3RydWN0IGFjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgYWNhY2hlX3NvZnRfbGltaXRfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIGFjYWNoZV9zb2Z0X2xpbWl0X2F0dHJpYnV0ZSA9CiAJX19BVFRSKHNvZnRfbGltaXQsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfYWNhY2hlX3Nob3csCi0JICAgICAgIHNlcnZpY2VfYWNhY2hlX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAotc3RhdGljIHN0cnVjdCBhY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIGFjYWNoZV90aW1lb3V0X21zZWNzX2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBhY2FjaGVfdGltZW91dF9tc2Vjc19hdHRyaWJ1dGUgPQogCV9fQVRUUih0aW1lb3V0X21zZWNzLAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX2FjYWNoZV9zaG93LAotCSAgICAgICBzZXJ2aWNlX2FjYWNoZV9zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphY2FjaGVfb3JhbmdlZnNfZGVmYXVsdF9hdHRyc1tdID0gewogCSZhY2FjaGVfaGFyZF9saW1pdF9hdHRyaWJ1dGUuYXR0ciwKQEAgLTE0NjgsMzQgKzg5MSwzMyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgYWNhY2hlX29yYW5nZWZzX2t0eXBlID0gewotCS5zeXNmc19vcHMgPSAmYWNhY2hlX29yYW5nZWZzX3N5c2ZzX29wcywKLQkucmVsZWFzZSA9IGFjYWNoZV9vcmFuZ2Vmc19yZWxlYXNlLAorCS5zeXNmc19vcHMgPSAmb3JhbmdlZnNfc3lzZnNfb3BzLAogCS5kZWZhdWx0X2F0dHJzID0gYWNhY2hlX29yYW5nZWZzX2RlZmF1bHRfYXR0cnMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSBjYXBjYWNoZV9oYXJkX2xpbWl0X2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBjYXBjYWNoZV9oYXJkX2xpbWl0X2F0dHJpYnV0ZSA9CiAJX19BVFRSKGhhcmRfbGltaXQsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfY2FwY2FjaGVfc2hvdywKLQkgICAgICAgc2VydmljZV9jYXBjYWNoZV9zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIGNhcGNhY2hlX3JlY2xhaW1fcGVyY2VudF9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgY2FwY2FjaGVfcmVjbGFpbV9wZXJjZW50X2F0dHJpYnV0ZSA9CiAJX19BVFRSKHJlY2xhaW1fcGVyY2VudGFnZSwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9jYXBjYWNoZV9zaG93LAotCSAgICAgICBzZXJ2aWNlX2NhcGNhY2hlX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAotc3RhdGljIHN0cnVjdCBjYXBjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgY2FwY2FjaGVfc29mdF9saW1pdF9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgY2FwY2FjaGVfc29mdF9saW1pdF9hdHRyaWJ1dGUgPQogCV9fQVRUUihzb2Z0X2xpbWl0LAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX2NhcGNhY2hlX3Nob3csCi0JICAgICAgIHNlcnZpY2VfY2FwY2FjaGVfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCi1zdGF0aWMgc3RydWN0IGNhcGNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSBjYXBjYWNoZV90aW1lb3V0X3NlY3NfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIGNhcGNhY2hlX3RpbWVvdXRfc2Vjc19hdHRyaWJ1dGUgPQogCV9fQVRUUih0aW1lb3V0X3NlY3MsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfY2FwY2FjaGVfc2hvdywKLQkgICAgICAgc2VydmljZV9jYXBjYWNoZV9zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpjYXBjYWNoZV9vcmFuZ2Vmc19kZWZhdWx0X2F0dHJzW10gPSB7CiAJJmNhcGNhY2hlX2hhcmRfbGltaXRfYXR0cmlidXRlLmF0dHIsCkBAIC0xNTA2LDM0ICs5MjgsMzMgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGNhcGNhY2hlX29yYW5nZWZzX2t0eXBlID0gewotCS5zeXNmc19vcHMgPSAmY2FwY2FjaGVfb3JhbmdlZnNfc3lzZnNfb3BzLAotCS5yZWxlYXNlID0gY2FwY2FjaGVfb3JhbmdlZnNfcmVsZWFzZSwKKwkuc3lzZnNfb3BzID0gJm9yYW5nZWZzX3N5c2ZzX29wcywKIAkuZGVmYXVsdF9hdHRycyA9IGNhcGNhY2hlX29yYW5nZWZzX2RlZmF1bHRfYXR0cnMsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgY2NhY2hlX2hhcmRfbGltaXRfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIGNjYWNoZV9oYXJkX2xpbWl0X2F0dHJpYnV0ZSA9CiAJX19BVFRSKGhhcmRfbGltaXQsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfY2NhY2hlX3Nob3csCi0JICAgICAgIHNlcnZpY2VfY2NhY2hlX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAotc3RhdGljIHN0cnVjdCBjY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIGNjYWNoZV9yZWNsYWltX3BlcmNlbnRfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIGNjYWNoZV9yZWNsYWltX3BlcmNlbnRfYXR0cmlidXRlID0KIAlfX0FUVFIocmVjbGFpbV9wZXJjZW50YWdlLAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX2NjYWNoZV9zaG93LAotCSAgICAgICBzZXJ2aWNlX2NjYWNoZV9zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgY2NhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSBjY2FjaGVfc29mdF9saW1pdF9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgY2NhY2hlX3NvZnRfbGltaXRfYXR0cmlidXRlID0KIAlfX0FUVFIoc29mdF9saW1pdCwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9jY2FjaGVfc2hvdywKLQkgICAgICAgc2VydmljZV9jY2FjaGVfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCi1zdGF0aWMgc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgY2NhY2hlX3RpbWVvdXRfc2Vjc19hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgY2NhY2hlX3RpbWVvdXRfc2Vjc19hdHRyaWJ1dGUgPQogCV9fQVRUUih0aW1lb3V0X3NlY3MsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfY2NhY2hlX3Nob3csCi0JICAgICAgIHNlcnZpY2VfY2NhY2hlX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNjYWNoZV9vcmFuZ2Vmc19kZWZhdWx0X2F0dHJzW10gPSB7CiAJJmNjYWNoZV9oYXJkX2xpbWl0X2F0dHJpYnV0ZS5hdHRyLApAQCAtMTU0NCwzNCArOTY1LDMzIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBjY2FjaGVfb3JhbmdlZnNfa3R5cGUgPSB7Ci0JLnN5c2ZzX29wcyA9ICZjY2FjaGVfb3JhbmdlZnNfc3lzZnNfb3BzLAotCS5yZWxlYXNlID0gY2NhY2hlX29yYW5nZWZzX3JlbGVhc2UsCisJLnN5c2ZzX29wcyA9ICZvcmFuZ2Vmc19zeXNmc19vcHMsCiAJLmRlZmF1bHRfYXR0cnMgPSBjY2FjaGVfb3JhbmdlZnNfZGVmYXVsdF9hdHRycywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSBuY2FjaGVfaGFyZF9saW1pdF9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgbmNhY2hlX2hhcmRfbGltaXRfYXR0cmlidXRlID0KIAlfX0FUVFIoaGFyZF9saW1pdCwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9uY2FjaGVfc2hvdywKLQkgICAgICAgc2VydmljZV9uY2FjaGVfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCi1zdGF0aWMgc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19hdHRyaWJ1dGUgbmNhY2hlX3JlY2xhaW1fcGVyY2VudF9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgbmNhY2hlX3JlY2xhaW1fcGVyY2VudF9hdHRyaWJ1dGUgPQogCV9fQVRUUihyZWNsYWltX3BlcmNlbnRhZ2UsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfbmNhY2hlX3Nob3csCi0JICAgICAgIHNlcnZpY2VfbmNhY2hlX3N0b3JlKTsKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3N0b3JlKTsKIAotc3RhdGljIHN0cnVjdCBuY2FjaGVfb3JhbmdlZnNfYXR0cmlidXRlIG5jYWNoZV9zb2Z0X2xpbWl0X2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBuY2FjaGVfc29mdF9saW1pdF9hdHRyaWJ1dGUgPQogCV9fQVRUUihzb2Z0X2xpbWl0LAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX25jYWNoZV9zaG93LAotCSAgICAgICBzZXJ2aWNlX25jYWNoZV9zdG9yZSk7CisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zdG9yZSk7CiAKLXN0YXRpYyBzdHJ1Y3QgbmNhY2hlX29yYW5nZWZzX2F0dHJpYnV0ZSBuY2FjaGVfdGltZW91dF9tc2Vjc19hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgbmNhY2hlX3RpbWVvdXRfbXNlY3NfYXR0cmlidXRlID0KIAlfX0FUVFIodGltZW91dF9tc2VjcywKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9uY2FjaGVfc2hvdywKLQkgICAgICAgc2VydmljZV9uY2FjaGVfc3RvcmUpOworCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc3RvcmUpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbmNhY2hlX29yYW5nZWZzX2RlZmF1bHRfYXR0cnNbXSA9IHsKIAkmbmNhY2hlX2hhcmRfbGltaXRfYXR0cmlidXRlLmF0dHIsCkBAIC0xNTgyLDI3ICsxMDAyLDI2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBuY2FjaGVfb3JhbmdlZnNfa3R5cGUgPSB7Ci0JLnN5c2ZzX29wcyA9ICZuY2FjaGVfb3JhbmdlZnNfc3lzZnNfb3BzLAotCS5yZWxlYXNlID0gbmNhY2hlX29yYW5nZWZzX3JlbGVhc2UsCisJLnN5c2ZzX29wcyA9ICZvcmFuZ2Vmc19zeXNmc19vcHMsCiAJLmRlZmF1bHRfYXR0cnMgPSBuY2FjaGVfb3JhbmdlZnNfZGVmYXVsdF9hdHRycywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGNfb3JhbmdlZnNfYXR0cmlidXRlIHBjX2FjYWNoZV9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgcGNfYWNhY2hlX2F0dHJpYnV0ZSA9CiAJX19BVFRSKGFjYWNoZSwKIAkgICAgICAgMDY2NCwKLQkgICAgICAgc2VydmljZV9wY19zaG93LAorCSAgICAgICBzeXNmc19zZXJ2aWNlX29wX3Nob3csCiAJICAgICAgIE5VTEwpOwogCi1zdGF0aWMgc3RydWN0IHBjX29yYW5nZWZzX2F0dHJpYnV0ZSBwY19jYXBjYWNoZV9hdHRyaWJ1dGUgPQorc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19hdHRyaWJ1dGUgcGNfY2FwY2FjaGVfYXR0cmlidXRlID0KIAlfX0FUVFIoY2FwY2FjaGUsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIHNlcnZpY2VfcGNfc2hvdywKKwkgICAgICAgc3lzZnNfc2VydmljZV9vcF9zaG93LAogCSAgICAgICBOVUxMKTsKIAotc3RhdGljIHN0cnVjdCBwY19vcmFuZ2Vmc19hdHRyaWJ1dGUgcGNfbmNhY2hlX2F0dHJpYnV0ZSA9CitzdGF0aWMgc3RydWN0IG9yYW5nZWZzX2F0dHJpYnV0ZSBwY19uY2FjaGVfYXR0cmlidXRlID0KIAlfX0FUVFIobmNhY2hlLAogCSAgICAgICAwNjY0LAotCSAgICAgICBzZXJ2aWNlX3BjX3Nob3csCisJICAgICAgIHN5c2ZzX3NlcnZpY2Vfb3Bfc2hvdywKIAkgICAgICAgTlVMTCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpwY19vcmFuZ2Vmc19kZWZhdWx0X2F0dHJzW10gPSB7CkBAIC0xNjEzLDIxICsxMDMyLDIwIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBwY19vcmFuZ2Vmc19rdHlwZSA9IHsKLQkuc3lzZnNfb3BzID0gJnBjX29yYW5nZWZzX3N5c2ZzX29wcywKLQkucmVsZWFzZSA9IHBjX29yYW5nZWZzX3JlbGVhc2UsCisJLnN5c2ZzX29wcyA9ICZvcmFuZ2Vmc19zeXNmc19vcHMsCiAJLmRlZmF1bHRfYXR0cnMgPSBwY19vcmFuZ2Vmc19kZWZhdWx0X2F0dHJzLAogfTsKIAotc3RhdGljIHN0cnVjdCBzdGF0c19vcmFuZ2Vmc19hdHRyaWJ1dGUgc3RhdHNfcmVhZHNfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIHN0YXRzX3JlYWRzX2F0dHJpYnV0ZSA9CiAJX19BVFRSKHJlYWRzLAogCSAgICAgICAwNjY0LAotCSAgICAgICBpbnRfc3RhdHNfc2hvdywKKwkgICAgICAgc3lzZnNfaW50X3Nob3csCiAJICAgICAgIE5VTEwpOwogCi1zdGF0aWMgc3RydWN0IHN0YXRzX29yYW5nZWZzX2F0dHJpYnV0ZSBzdGF0c193cml0ZXNfYXR0cmlidXRlID0KK3N0YXRpYyBzdHJ1Y3Qgb3JhbmdlZnNfYXR0cmlidXRlIHN0YXRzX3dyaXRlc19hdHRyaWJ1dGUgPQogCV9fQVRUUih3cml0ZXMsCiAJICAgICAgIDA2NjQsCi0JICAgICAgIGludF9zdGF0c19zaG93LAorCSAgICAgICBzeXNmc19pbnRfc2hvdywKIAkgICAgICAgTlVMTCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzdGF0c19vcmFuZ2Vmc19kZWZhdWx0X2F0dHJzW10gPSB7CkBAIC0xNjM3LDE4ICsxMDU1LDE3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBzdGF0c19vcmFuZ2Vmc19rdHlwZSA9IHsKLQkuc3lzZnNfb3BzID0gJnN0YXRzX29yYW5nZWZzX3N5c2ZzX29wcywKLQkucmVsZWFzZSA9IHN0YXRzX29yYW5nZWZzX3JlbGVhc2UsCisJLnN5c2ZzX29wcyA9ICZvcmFuZ2Vmc19zeXNmc19vcHMsCiAJLmRlZmF1bHRfYXR0cnMgPSBzdGF0c19vcmFuZ2Vmc19kZWZhdWx0X2F0dHJzLAogfTsKIAotc3RhdGljIHN0cnVjdCBvcmFuZ2Vmc19vYmogKm9yYW5nZWZzX29iajsKLXN0YXRpYyBzdHJ1Y3QgYWNhY2hlX29yYW5nZWZzX29iaiAqYWNhY2hlX29yYW5nZWZzX29iajsKLXN0YXRpYyBzdHJ1Y3QgY2FwY2FjaGVfb3JhbmdlZnNfb2JqICpjYXBjYWNoZV9vcmFuZ2Vmc19vYmo7Ci1zdGF0aWMgc3RydWN0IGNjYWNoZV9vcmFuZ2Vmc19vYmogKmNjYWNoZV9vcmFuZ2Vmc19vYmo7Ci1zdGF0aWMgc3RydWN0IG5jYWNoZV9vcmFuZ2Vmc19vYmogKm5jYWNoZV9vcmFuZ2Vmc19vYmo7Ci1zdGF0aWMgc3RydWN0IHBjX29yYW5nZWZzX29iaiAqcGNfb3JhbmdlZnNfb2JqOwotc3RhdGljIHN0cnVjdCBzdGF0c19vcmFuZ2Vmc19vYmogKnN0YXRzX29yYW5nZWZzX29iajsKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqb3JhbmdlZnNfb2JqOworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICphY2FjaGVfb3JhbmdlZnNfb2JqOworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpjYXBjYWNoZV9vcmFuZ2Vmc19vYmo7CitzdGF0aWMgc3RydWN0IGtvYmplY3QgKmNjYWNoZV9vcmFuZ2Vmc19vYmo7CitzdGF0aWMgc3RydWN0IGtvYmplY3QgKm5jYWNoZV9vcmFuZ2Vmc19vYmo7CitzdGF0aWMgc3RydWN0IGtvYmplY3QgKnBjX29yYW5nZWZzX29iajsKK3N0YXRpYyBzdHJ1Y3Qga29iamVjdCAqc3RhdHNfb3JhbmdlZnNfb2JqOwogCiBpbnQgb3JhbmdlZnNfc3lzZnNfaW5pdCh2b2lkKQogewpAQCAtMTY2MSw3ICsxMDc4LDcgQEAKIAlpZiAoIW9yYW5nZWZzX29iaikKIAkJZ290byBvdXQ7CiAKLQlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZvcmFuZ2Vmc19vYmotPmtvYmosCisJcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZChvcmFuZ2Vmc19vYmosCiAJCQkJICAmb3JhbmdlZnNfa3R5cGUsCiAJCQkJICBmc19rb2JqLAogCQkJCSAgT1JBTkdFRlNfS09CSl9JRCk7CkBAIC0xNjY5LDcgKzEwODYsNyBAQAogCWlmIChyYykKIAkJZ290byBvZnNfb2JqX2JhaWw7CiAKLQlrb2JqZWN0X3VldmVudCgmb3JhbmdlZnNfb2JqLT5rb2JqLCBLT0JKX0FERCk7CisJa29iamVjdF91ZXZlbnQob3JhbmdlZnNfb2JqLCBLT0JKX0FERCk7CiAKIAkvKiBjcmVhdGUgL3N5cy9mcy9vcmFuZ2Vmcy9hY2FjaGUuICovCiAJYWNhY2hlX29yYW5nZWZzX29iaiA9IGt6YWxsb2Moc2l6ZW9mKCphY2FjaGVfb3JhbmdlZnNfb2JqKSwgR0ZQX0tFUk5FTCk7CkBAIC0xNjc4LDE1ICsxMDk1LDE1IEBACiAJCWdvdG8gb2ZzX29ial9iYWlsOwogCX0KIAotCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmFjYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmosCisJcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZChhY2FjaGVfb3JhbmdlZnNfb2JqLAogCQkJCSAgJmFjYWNoZV9vcmFuZ2Vmc19rdHlwZSwKLQkJCQkgICZvcmFuZ2Vmc19vYmotPmtvYmosCisJCQkJICBvcmFuZ2Vmc19vYmosCiAJCQkJICBBQ0FDSEVfS09CSl9JRCk7CiAKIAlpZiAocmMpCiAJCWdvdG8gYWNhY2hlX29ial9iYWlsOwogCi0Ja29iamVjdF91ZXZlbnQoJmFjYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmosIEtPQkpfQUREKTsKKwlrb2JqZWN0X3VldmVudChhY2FjaGVfb3JhbmdlZnNfb2JqLCBLT0JKX0FERCk7CiAKIAkvKiBjcmVhdGUgL3N5cy9mcy9vcmFuZ2Vmcy9jYXBjYWNoZS4gKi8KIAljYXBjYWNoZV9vcmFuZ2Vmc19vYmogPQpAQCAtMTY5NiwxNCArMTExMywxNCBAQAogCQlnb3RvIGFjYWNoZV9vYmpfYmFpbDsKIAl9CiAKLQlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZjYXBjYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmosCisJcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZChjYXBjYWNoZV9vcmFuZ2Vmc19vYmosCiAJCQkJICAmY2FwY2FjaGVfb3JhbmdlZnNfa3R5cGUsCi0JCQkJICAmb3JhbmdlZnNfb2JqLT5rb2JqLAorCQkJCSAgb3JhbmdlZnNfb2JqLAogCQkJCSAgQ0FQQ0FDSEVfS09CSl9JRCk7CiAJaWYgKHJjKQogCQlnb3RvIGNhcGNhY2hlX29ial9iYWlsOwogCi0Ja29iamVjdF91ZXZlbnQoJmNhcGNhY2hlX29yYW5nZWZzX29iai0+a29iaiwgS09CSl9BREQpOworCWtvYmplY3RfdWV2ZW50KGNhcGNhY2hlX29yYW5nZWZzX29iaiwgS09CSl9BREQpOwogCiAJLyogY3JlYXRlIC9zeXMvZnMvb3JhbmdlZnMvY2NhY2hlLiAqLwogCWNjYWNoZV9vcmFuZ2Vmc19vYmogPQpAQCAtMTcxMywxNCArMTEzMCwxNCBAQAogCQlnb3RvIGNhcGNhY2hlX29ial9iYWlsOwogCX0KIAotCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQoJmNjYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmosCisJcmMgPSBrb2JqZWN0X2luaXRfYW5kX2FkZChjY2FjaGVfb3JhbmdlZnNfb2JqLAogCQkJCSAgJmNjYWNoZV9vcmFuZ2Vmc19rdHlwZSwKLQkJCQkgICZvcmFuZ2Vmc19vYmotPmtvYmosCisJCQkJICBvcmFuZ2Vmc19vYmosCiAJCQkJICBDQ0FDSEVfS09CSl9JRCk7CiAJaWYgKHJjKQogCQlnb3RvIGNjYWNoZV9vYmpfYmFpbDsKIAotCWtvYmplY3RfdWV2ZW50KCZjY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqLCBLT0JKX0FERCk7CisJa29iamVjdF91ZXZlbnQoY2NhY2hlX29yYW5nZWZzX29iaiwgS09CSl9BREQpOwogCiAJLyogY3JlYXRlIC9zeXMvZnMvb3JhbmdlZnMvbmNhY2hlLiAqLwogCW5jYWNoZV9vcmFuZ2Vmc19vYmogPSBremFsbG9jKHNpemVvZigqbmNhY2hlX29yYW5nZWZzX29iaiksIEdGUF9LRVJORUwpOwpAQCAtMTcyOSwxNSArMTE0NiwxNSBAQAogCQlnb3RvIGNjYWNoZV9vYmpfYmFpbDsKIAl9CiAKLQlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZuY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqLAorCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQobmNhY2hlX29yYW5nZWZzX29iaiwKIAkJCQkgICZuY2FjaGVfb3JhbmdlZnNfa3R5cGUsCi0JCQkJICAmb3JhbmdlZnNfb2JqLT5rb2JqLAorCQkJCSAgb3JhbmdlZnNfb2JqLAogCQkJCSAgTkNBQ0hFX0tPQkpfSUQpOwogCiAJaWYgKHJjKQogCQlnb3RvIG5jYWNoZV9vYmpfYmFpbDsKIAotCWtvYmplY3RfdWV2ZW50KCZuY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqLCBLT0JKX0FERCk7CisJa29iamVjdF91ZXZlbnQobmNhY2hlX29yYW5nZWZzX29iaiwgS09CSl9BREQpOwogCiAJLyogY3JlYXRlIC9zeXMvZnMvb3JhbmdlZnMvcGVyZl9jb3VudGVycy4gKi8KIAlwY19vcmFuZ2Vmc19vYmogPSBremFsbG9jKHNpemVvZigqcGNfb3JhbmdlZnNfb2JqKSwgR0ZQX0tFUk5FTCk7CkBAIC0xNzQ2LDE1ICsxMTYzLDE1IEBACiAJCWdvdG8gbmNhY2hlX29ial9iYWlsOwogCX0KIAotCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQoJnBjX29yYW5nZWZzX29iai0+a29iaiwKKwlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKHBjX29yYW5nZWZzX29iaiwKIAkJCQkgICZwY19vcmFuZ2Vmc19rdHlwZSwKLQkJCQkgICZvcmFuZ2Vmc19vYmotPmtvYmosCisJCQkJICBvcmFuZ2Vmc19vYmosCiAJCQkJICAicGVyZl9jb3VudGVycyIpOwogCiAJaWYgKHJjKQogCQlnb3RvIHBjX29ial9iYWlsOwogCi0Ja29iamVjdF91ZXZlbnQoJnBjX29yYW5nZWZzX29iai0+a29iaiwgS09CSl9BREQpOworCWtvYmplY3RfdWV2ZW50KHBjX29yYW5nZWZzX29iaiwgS09CSl9BREQpOwogCiAJLyogY3JlYXRlIC9zeXMvZnMvb3JhbmdlZnMvc3RhdHMuICovCiAJc3RhdHNfb3JhbmdlZnNfb2JqID0ga3phbGxvYyhzaXplb2YoKnN0YXRzX29yYW5nZWZzX29iaiksIEdGUF9LRVJORUwpOwpAQCAtMTc2MywzNyArMTE4MCwzMSBAQAogCQlnb3RvIHBjX29ial9iYWlsOwogCX0KIAotCXJjID0ga29iamVjdF9pbml0X2FuZF9hZGQoJnN0YXRzX29yYW5nZWZzX29iai0+a29iaiwKKwlyYyA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKHN0YXRzX29yYW5nZWZzX29iaiwKIAkJCQkgICZzdGF0c19vcmFuZ2Vmc19rdHlwZSwKLQkJCQkgICZvcmFuZ2Vmc19vYmotPmtvYmosCisJCQkJICBvcmFuZ2Vmc19vYmosCiAJCQkJICBTVEFUU19LT0JKX0lEKTsKIAogCWlmIChyYykKIAkJZ290byBzdGF0c19vYmpfYmFpbDsKIAotCWtvYmplY3RfdWV2ZW50KCZzdGF0c19vcmFuZ2Vmc19vYmotPmtvYmosIEtPQkpfQUREKTsKKwlrb2JqZWN0X3VldmVudChzdGF0c19vcmFuZ2Vmc19vYmosIEtPQkpfQUREKTsKIAlnb3RvIG91dDsKIAogc3RhdHNfb2JqX2JhaWw6Ci0JCWtvYmplY3RfcHV0KCZzdGF0c19vcmFuZ2Vmc19vYmotPmtvYmopOwotCisJCWtvYmplY3RfcHV0KHN0YXRzX29yYW5nZWZzX29iaik7CiBwY19vYmpfYmFpbDoKLQkJa29iamVjdF9wdXQoJnBjX29yYW5nZWZzX29iai0+a29iaik7Ci0KKwkJa29iamVjdF9wdXQocGNfb3JhbmdlZnNfb2JqKTsKIG5jYWNoZV9vYmpfYmFpbDoKLQkJa29iamVjdF9wdXQoJm5jYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmopOwotCisJCWtvYmplY3RfcHV0KG5jYWNoZV9vcmFuZ2Vmc19vYmopOwogY2NhY2hlX29ial9iYWlsOgotCQlrb2JqZWN0X3B1dCgmY2NhY2hlX29yYW5nZWZzX29iai0+a29iaik7Ci0KKwkJa29iamVjdF9wdXQoY2NhY2hlX29yYW5nZWZzX29iaik7CiBjYXBjYWNoZV9vYmpfYmFpbDoKLQkJa29iamVjdF9wdXQoJmNhcGNhY2hlX29yYW5nZWZzX29iai0+a29iaik7Ci0KKwkJa29iamVjdF9wdXQoY2FwY2FjaGVfb3JhbmdlZnNfb2JqKTsKIGFjYWNoZV9vYmpfYmFpbDoKLQkJa29iamVjdF9wdXQoJmFjYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmopOwotCisJCWtvYmplY3RfcHV0KGFjYWNoZV9vcmFuZ2Vmc19vYmopOwogb2ZzX29ial9iYWlsOgotCQlrb2JqZWN0X3B1dCgmb3JhbmdlZnNfb2JqLT5rb2JqKTsKKwkJa29iamVjdF9wdXQob3JhbmdlZnNfb2JqKTsKIG91dDoKIAlyZXR1cm4gcmM7CiB9CkBAIC0xODAxLDEzICsxMjEyLDExIEBACiB2b2lkIG9yYW5nZWZzX3N5c2ZzX2V4aXQodm9pZCkKIHsKIAlnb3NzaXBfZGVidWcoR09TU0lQX1NZU0ZTX0RFQlVHLCAib3JhbmdlZnNfc3lzZnNfZXhpdDogc3RhcnRcbiIpOwotCi0Ja29iamVjdF9wdXQoJmFjYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmopOwotCWtvYmplY3RfcHV0KCZjYXBjYWNoZV9vcmFuZ2Vmc19vYmotPmtvYmopOwotCWtvYmplY3RfcHV0KCZjY2FjaGVfb3JhbmdlZnNfb2JqLT5rb2JqKTsKLQlrb2JqZWN0X3B1dCgmbmNhY2hlX29yYW5nZWZzX29iai0+a29iaik7Ci0Ja29iamVjdF9wdXQoJnBjX29yYW5nZWZzX29iai0+a29iaik7Ci0Ja29iamVjdF9wdXQoJnN0YXRzX29yYW5nZWZzX29iai0+a29iaik7Ci0KLQlrb2JqZWN0X3B1dCgmb3JhbmdlZnNfb2JqLT5rb2JqKTsKKwlrb2JqZWN0X3B1dChhY2FjaGVfb3JhbmdlZnNfb2JqKTsKKwlrb2JqZWN0X3B1dChjYXBjYWNoZV9vcmFuZ2Vmc19vYmopOworCWtvYmplY3RfcHV0KGNjYWNoZV9vcmFuZ2Vmc19vYmopOworCWtvYmplY3RfcHV0KG5jYWNoZV9vcmFuZ2Vmc19vYmopOworCWtvYmplY3RfcHV0KHBjX29yYW5nZWZzX29iaik7CisJa29iamVjdF9wdXQoc3RhdHNfb3JhbmdlZnNfb2JqKTsKKwlrb2JqZWN0X3B1dChvcmFuZ2Vmc19vYmopOwogfQpkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvb3JhbmdlZnMtdXRpbHMuYyBiL2ZzL29yYW5nZWZzL29yYW5nZWZzLXV0aWxzLmMKaW5kZXggZDEzYzcyOS4uMDZhZjgxZiAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvb3JhbmdlZnMtdXRpbHMuYworKysgYi9mcy9vcmFuZ2Vmcy9vcmFuZ2Vmcy11dGlscy5jCkBAIC01MCw3ICs1MCw3IEBACiAJCWNhc2UgT1JBTkdFRlNfVkZTX09QX1RSVU5DQVRFOgogCQkJZnNpZCA9IG9wLT51cGNhbGwucmVxLnRydW5jYXRlLnJlZm4uZnNfaWQ7CiAJCQlicmVhazsKLQkJY2FzZSBPUkFOR0VGU19WRlNfT1BfTU1BUF9SQV9GTFVTSDoKKwkJY2FzZSBPUkFOR0VGU19WRlNfT1BfUkFfRkxVU0g6CiAJCQlmc2lkID0gb3AtPnVwY2FsbC5yZXEucmFfY2FjaGVfZmx1c2gucmVmbi5mc19pZDsKIAkJCWJyZWFrOwogCQljYXNlIE9SQU5HRUZTX1ZGU19PUF9GU19VTU9VTlQ6CkBAIC0zNDcsNyArMzQ3LDggQEAKIAlpbm9kZS0+aV9tb2RlID0gdHlwZSB8IChpc19yb290X2hhbmRsZShpbm9kZSkgPyBTX0lTVlRYIDogMCkgfAogCSAgICBvcmFuZ2Vmc19pbm9kZV9wZXJtcygmbmV3X29wLT5kb3duY2FsbC5yZXNwLmdldGF0dHIuYXR0cmlidXRlcyk7CiAKLQlvcmFuZ2Vmc19pbm9kZS0+Z2V0YXR0cl90aW1lID0gamlmZmllcyArIGdldGF0dHJfdGltZW91dF9tc2VjcypIWi8xMDAwOworCW9yYW5nZWZzX2lub2RlLT5nZXRhdHRyX3RpbWUgPSBqaWZmaWVzICsKKwkgICAgb3JhbmdlZnNfZ2V0YXR0cl90aW1lb3V0X21zZWNzKkhaLzEwMDA7CiAJcmV0ID0gMDsKIG91dDoKIAlvcF9yZWxlYXNlKG5ld19vcCk7CkBAIC02NTYsNDAxICs2NTcsMyBAQAogCXJldHVybiByZXQ7CiB9CiAjdW5kZWYgTlVNX01PREVTCi0KLS8qCi0gKiBBZnRlciBvYnRhaW5pbmcgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsaWVudCdzIGRlYnVnCi0gKiBrZXl3b3JkcyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBtYXNrcywgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gYnVpbGQgYW4KLSAqIGFycmF5IG9mIHRoZXNlIHZhbHVlcy4KLSAqLwotaW50IG9yYW5nZWZzX3ByZXBhcmVfY2RtX2FycmF5KGNoYXIgKmRlYnVnX2FycmF5X3N0cmluZykKLXsKLQlpbnQgaTsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCWNoYXIgKmNkc19oZWFkID0gTlVMTDsKLQljaGFyICpjZHNfZGVsaW1pdGVyID0gTlVMTDsKLQlpbnQga2V5d29yZF9sZW4gPSAwOwotCi0JZ29zc2lwX2RlYnVnKEdPU1NJUF9VVElMU19ERUJVRywgIiVzOiBzdGFydFxuIiwgX19mdW5jX18pOwotCi0JLyoKLQkgKiBmaWd1cmUgb3V0IGhvdyBtYW55IGVsZW1lbnRzIHRoZSBjZG1fYXJyYXkgbmVlZHMuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IHN0cmxlbihkZWJ1Z19hcnJheV9zdHJpbmcpOyBpKyspCi0JCWlmIChkZWJ1Z19hcnJheV9zdHJpbmdbaV0gPT0gJ1xuJykKLQkJCWNkbV9lbGVtZW50X2NvdW50Kys7Ci0KLQlpZiAoIWNkbV9lbGVtZW50X2NvdW50KSB7Ci0JCXByX2luZm8oIk5vIGVsZW1lbnRzIGluIGNsaWVudCBkZWJ1ZyBhcnJheSBzdHJpbmchXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JY2RtX2FycmF5ID0KLQkJa3phbGxvYyhjZG1fZWxlbWVudF9jb3VudCAqIHNpemVvZihzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2spLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjZG1fYXJyYXkpIHsKLQkJcHJfaW5mbygibWFsbG9jIGZhaWxlZCBmb3IgY2RtX2FycmF5IVxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JY2RzX2hlYWQgPSBkZWJ1Z19hcnJheV9zdHJpbmc7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2RtX2VsZW1lbnRfY291bnQ7IGkrKykgewotCQljZHNfZGVsaW1pdGVyID0gc3RyY2hyKGNkc19oZWFkLCAnXG4nKTsKLQkJKmNkc19kZWxpbWl0ZXIgPSAnXDAnOwotCi0JCWtleXdvcmRfbGVuID0gc3RyY3NwbihjZHNfaGVhZCwgIiAiKTsKLQotCQljZG1fYXJyYXlbaV0ua2V5d29yZCA9IGt6YWxsb2Moa2V5d29yZF9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjZG1fYXJyYXlbaV0ua2V5d29yZCkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlzc2NhbmYoY2RzX2hlYWQsCi0JCSAgICAgICAiJXMgJWxseCAlbGx4IiwKLQkJICAgICAgIGNkbV9hcnJheVtpXS5rZXl3b3JkLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSYoY2RtX2FycmF5W2ldLm1hc2sxKSwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcgKikmKGNkbV9hcnJheVtpXS5tYXNrMikpOwotCi0JCWlmICghc3RyY21wKGNkbV9hcnJheVtpXS5rZXl3b3JkLCBPUkFOR0VGU19WRVJCT1NFKSkKLQkJCWNsaWVudF92ZXJib3NlX2luZGV4ID0gaTsKLQotCQlpZiAoIXN0cmNtcChjZG1fYXJyYXlbaV0ua2V5d29yZCwgT1JBTkdFRlNfQUxMKSkKLQkJCWNsaWVudF9hbGxfaW5kZXggPSBpOwotCi0JCWNkc19oZWFkID0gY2RzX2RlbGltaXRlciArIDE7Ci0JfQotCi0JcmMgPSBjZG1fZWxlbWVudF9jb3VudDsKLQotCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsICIlczogcmM6JWQ6XG4iLCBfX2Z1bmNfXywgcmMpOwotCi1vdXQ6Ci0KLQlyZXR1cm4gcmM7Ci0KLX0KLQotLyoKLSAqIC9zeXMva2VybmVsL2RlYnVnL29yYW5nZWZzL2RlYnVnLWhlbHAgY2FuIGJlIGNhdHRlZCB0bwotICogc2VlIGFsbCB0aGUgYXZhaWxhYmxlIGtlcm5lbCBhbmQgY2xpZW50IGRlYnVnIGtleXdvcmRzLgotICoKLSAqIFdoZW4gdGhlIGtlcm5lbCBib290cywgd2UgaGF2ZSBubyBpZGVhIHdoYXQga2V5d29yZHMgdGhlCi0gKiBjbGllbnQgc3VwcG9ydHMsIG5vciB0aGVpciBhc3NvY2lhdGVkIG1hc2tzLgotICoKLSAqIFdlIHBhc3MgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIG9uY2UgYXQgYm9vdCBhbmQgc3RhbXAgYQotICogYm9pbGVycGxhdGUgIndlIGRvbid0IGtub3ciIG1lc3NhZ2UgZm9yIHRoZSBjbGllbnQgaW4gdGhlCi0gKiBkZWJ1Zy1oZWxwIGZpbGUuIFdlIHBhc3MgdGhyb3VnaCBoZXJlIGFnYWluIHdoZW4gdGhlIGNsaWVudAotICogc3RhcnRzIGFuZCB0aGVuIHdlIGNhbiBmaWxsIG91dCB0aGUgZGVidWctaGVscCBmaWxlIGZ1bGx5LgotICoKLSAqIFRoZSBjbGllbnQgbWlnaHQgYmUgcmVzdGFydGVkIGFueSBudW1iZXIgb2YgdGltZXMgYmV0d2VlbgotICogcmVib290cywgd2Ugb25seSBidWlsZCB0aGUgZGVidWctaGVscCBmaWxlIHRoZSBmaXJzdCB0aW1lLgotICovCi1pbnQgb3JhbmdlZnNfcHJlcGFyZV9kZWJ1Z2ZzX2hlbHBfc3RyaW5nKGludCBhdF9ib290KQotewotCWludCByYyA9IC1FSU5WQUw7Ci0JaW50IGk7Ci0JaW50IGJ5dGVfY291bnQgPSAwOwotCWNoYXIgKmNsaWVudF90aXRsZSA9ICJDbGllbnQgRGVidWcgS2V5d29yZHM6XG4iOwotCWNoYXIgKmtlcm5lbF90aXRsZSA9ICJLZXJuZWwgRGVidWcgS2V5d29yZHM6XG4iOwotCi0JZ29zc2lwX2RlYnVnKEdPU1NJUF9VVElMU19ERUJVRywgIiVzOiBzdGFydFxuIiwgX19mdW5jX18pOwotCi0JaWYgKGF0X2Jvb3QpIHsKLQkJYnl0ZV9jb3VudCArPSBzdHJsZW4oSEVMUF9TVFJJTkdfVU5JTklUSUFMSVpFRCk7Ci0JCWNsaWVudF90aXRsZSA9IEhFTFBfU1RSSU5HX1VOSU5JVElBTElaRUQ7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogZmlsbCB0aGUgY2xpZW50IGtleXdvcmQvbWFzayBhcnJheSBhbmQgcmVtZW1iZXIKLQkJICogaG93IG1hbnkgZWxlbWVudHMgdGhlcmUgd2VyZS4KLQkJICovCi0JCWNkbV9lbGVtZW50X2NvdW50ID0KLQkJCW9yYW5nZWZzX3ByZXBhcmVfY2RtX2FycmF5KGNsaWVudF9kZWJ1Z19hcnJheV9zdHJpbmcpOwotCQlpZiAoY2RtX2VsZW1lbnRfY291bnQgPD0gMCkKLQkJCWdvdG8gb3V0OwotCi0JCS8qIENvdW50IHRoZSBieXRlcyBkZXN0aW5lZCBmb3IgZGVidWdfaGVscF9zdHJpbmcuICovCi0JCWJ5dGVfY291bnQgKz0gc3RybGVuKGNsaWVudF90aXRsZSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IGNkbV9lbGVtZW50X2NvdW50OyBpKyspIHsKLQkJCWJ5dGVfY291bnQgKz0gc3RybGVuKGNkbV9hcnJheVtpXS5rZXl3b3JkICsgMik7Ci0JCQlpZiAoYnl0ZV9jb3VudCA+PSBERUJVR19IRUxQX1NUUklOR19TSVpFKSB7Ci0JCQkJcHJfaW5mbygiJXM6IG92ZXJmbG93IDEhXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQotCQlnb3NzaXBfZGVidWcoR09TU0lQX1VUSUxTX0RFQlVHLAotCQkJICAgICAiJXM6IGNkbV9lbGVtZW50X2NvdW50OiVkOlxuIiwKLQkJCSAgICAgX19mdW5jX18sCi0JCQkgICAgIGNkbV9lbGVtZW50X2NvdW50KTsKLQl9Ci0KLQlieXRlX2NvdW50ICs9IHN0cmxlbihrZXJuZWxfdGl0bGUpOwotCWZvciAoaSA9IDA7IGkgPCBudW1fa21vZF9rZXl3b3JkX21hc2tfbWFwOyBpKyspIHsKLQkJYnl0ZV9jb3VudCArPQotCQkJc3RybGVuKHNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2ldLmtleXdvcmQgKyAyKTsKLQkJaWYgKGJ5dGVfY291bnQgPj0gREVCVUdfSEVMUF9TVFJJTkdfU0laRSkgewotCQkJcHJfaW5mbygiJXM6IG92ZXJmbG93IDIhXG4iLCBfX2Z1bmNfXyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCS8qIGJ1aWxkIGRlYnVnX2hlbHBfc3RyaW5nLiAqLwotCWRlYnVnX2hlbHBfc3RyaW5nID0ga3phbGxvYyhERUJVR19IRUxQX1NUUklOR19TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRlYnVnX2hlbHBfc3RyaW5nKSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCBjbGllbnRfdGl0bGUpOwotCi0JaWYgKCFhdF9ib290KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBjZG1fZWxlbWVudF9jb3VudDsgaSsrKSB7Ci0JCQlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsICJcdCIpOwotCQkJc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCBjZG1fYXJyYXlbaV0ua2V5d29yZCk7Ci0JCQlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsICJcbiIpOwotCQl9Ci0JfQotCi0Jc3RyY2F0KGRlYnVnX2hlbHBfc3RyaW5nLCAiXG4iKTsKLQlzdHJjYXQoZGVidWdfaGVscF9zdHJpbmcsIGtlcm5lbF90aXRsZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2ttb2Rfa2V5d29yZF9tYXNrX21hcDsgaSsrKSB7Ci0JCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywgIlx0Iik7Ci0JCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywgc19rbW9kX2tleXdvcmRfbWFza19tYXBbaV0ua2V5d29yZCk7Ci0JCXN0cmNhdChkZWJ1Z19oZWxwX3N0cmluZywgIlxuIik7Ci0JfQotCi0JcmMgPSAwOwotCi1vdXQ6Ci0KLQlyZXR1cm4gcmM7Ci0KLX0KLQotLyoKLSAqIGtlcm5lbCA9IHR5cGUgMAotICogY2xpZW50ID0gdHlwZSAxCi0gKi8KLXZvaWQgZGVidWdfbWFza190b19zdHJpbmcodm9pZCAqbWFzaywgaW50IHR5cGUpCi17Ci0JaW50IGk7Ci0JaW50IGxlbiA9IDA7Ci0JY2hhciAqZGVidWdfc3RyaW5nOwotCWludCBlbGVtZW50X2NvdW50ID0gMDsKLQotCWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsICIlczogc3RhcnRcbiIsIF9fZnVuY19fKTsKLQotCWlmICh0eXBlKSB7Ci0JCWRlYnVnX3N0cmluZyA9IGNsaWVudF9kZWJ1Z19zdHJpbmc7Ci0JCWVsZW1lbnRfY291bnQgPSBjZG1fZWxlbWVudF9jb3VudDsKLQl9IGVsc2UgewotCQlkZWJ1Z19zdHJpbmcgPSBrZXJuZWxfZGVidWdfc3RyaW5nOwotCQllbGVtZW50X2NvdW50ID0gbnVtX2ttb2Rfa2V5d29yZF9tYXNrX21hcDsKLQl9Ci0KLQltZW1zZXQoZGVidWdfc3RyaW5nLCAwLCBPUkFOR0VGU19NQVhfREVCVUdfU1RSSU5HX0xFTik7Ci0KLQkvKgotCSAqIFNvbWUga2V5d29yZHMsIGxpa2UgImFsbCIgb3IgInZlcmJvc2UiLCBhcmUgYW1hbGdhbXMgb2YKLQkgKiBudW1lcm91cyBvdGhlciBrZXl3b3Jkcy4gTWFrZSBhIHNwZWNpYWwgY2hlY2sgZm9yIHRob3NlCi0JICogYmVmb3JlIGdyaW5kaW5nIHRocm91Z2ggdGhlIHdob2xlIG1hc2sgb25seSB0byBmaW5kIG91dAotCSAqIGxhdGVyLi4uCi0JICovCi0JaWYgKGNoZWNrX2FtYWxnYW1fa2V5d29yZChtYXNrLCB0eXBlKSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBCdWlsZCB0aGUgZGVidWcgc3RyaW5nLiAqLwotCWZvciAoaSA9IDA7IGkgPCBlbGVtZW50X2NvdW50OyBpKyspCi0JCWlmICh0eXBlKQotCQkJZG9fY19zdHJpbmcobWFzaywgaSk7Ci0JCWVsc2UKLQkJCWRvX2tfc3RyaW5nKG1hc2ssIGkpOwotCi0JbGVuID0gc3RybGVuKGRlYnVnX3N0cmluZyk7Ci0KLQlpZiAoKGxlbikgJiYgKHR5cGUpKQotCQljbGllbnRfZGVidWdfc3RyaW5nW2xlbiAtIDFdID0gJ1wwJzsKLQllbHNlIGlmIChsZW4pCi0JCWtlcm5lbF9kZWJ1Z19zdHJpbmdbbGVuIC0gMV0gPSAnXDAnOwotCWVsc2UgaWYgKHR5cGUpCi0JCXN0cmNweShjbGllbnRfZGVidWdfc3RyaW5nLCAibm9uZSIpOwotCWVsc2UKLQkJc3RyY3B5KGtlcm5lbF9kZWJ1Z19zdHJpbmcsICJub25lIik7Ci0KLW91dDoKLWdvc3NpcF9kZWJ1ZyhHT1NTSVBfVVRJTFNfREVCVUcsICIlczogc3RyaW5nOiVzOlxuIiwgX19mdW5jX18sIGRlYnVnX3N0cmluZyk7Ci0KLQlyZXR1cm47Ci0KLX0KLQotdm9pZCBkb19rX3N0cmluZyh2b2lkICprX21hc2ssIGludCBpbmRleCkKLXsKLQlfX3U2NCAqbWFzayA9IChfX3U2NCAqKSBrX21hc2s7Ci0KLQlpZiAoa2V5d29yZF9pc19hbWFsZ2FtKChjaGFyICopIHNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2luZGV4XS5rZXl3b3JkKSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoKm1hc2sgJiBzX2ttb2Rfa2V5d29yZF9tYXNrX21hcFtpbmRleF0ubWFza192YWwpIHsKLQkJaWYgKChzdHJsZW4oa2VybmVsX2RlYnVnX3N0cmluZykgKwotCQkgICAgIHN0cmxlbihzX2ttb2Rfa2V5d29yZF9tYXNrX21hcFtpbmRleF0ua2V5d29yZCkpCi0JCQk8IE9SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOIC0gMSkgewotCQkJCXN0cmNhdChrZXJuZWxfZGVidWdfc3RyaW5nLAotCQkJCSAgICAgICBzX2ttb2Rfa2V5d29yZF9tYXNrX21hcFtpbmRleF0ua2V5d29yZCk7Ci0JCQkJc3RyY2F0KGtlcm5lbF9kZWJ1Z19zdHJpbmcsICIsIik7Ci0JCQl9IGVsc2UgewotCQkJCWdvc3NpcF9lcnIoIiVzOiBvdmVyZmxvdyFcbiIsIF9fZnVuY19fKTsKLQkJCQlzdHJjcHkoa2VybmVsX2RlYnVnX3N0cmluZywgT1JBTkdFRlNfQUxMKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQl9Ci0KLW91dDoKLQotCXJldHVybjsKLX0KLQotdm9pZCBkb19jX3N0cmluZyh2b2lkICpjX21hc2ssIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKm1hc2sgPSAoc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICopIGNfbWFzazsKLQotCWlmIChrZXl3b3JkX2lzX2FtYWxnYW0oY2RtX2FycmF5W2luZGV4XS5rZXl3b3JkKSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoKG1hc2stPm1hc2sxICYgY2RtX2FycmF5W2luZGV4XS5tYXNrMSkgfHwKLQkgICAgKG1hc2stPm1hc2syICYgY2RtX2FycmF5W2luZGV4XS5tYXNrMikpIHsKLQkJaWYgKChzdHJsZW4oY2xpZW50X2RlYnVnX3N0cmluZykgKwotCQkgICAgIHN0cmxlbihjZG1fYXJyYXlbaW5kZXhdLmtleXdvcmQpICsgMSkKLQkJCTwgT1JBTkdFRlNfTUFYX0RFQlVHX1NUUklOR19MRU4gLSAyKSB7Ci0JCQkJc3RyY2F0KGNsaWVudF9kZWJ1Z19zdHJpbmcsCi0JCQkJICAgICAgIGNkbV9hcnJheVtpbmRleF0ua2V5d29yZCk7Ci0JCQkJc3RyY2F0KGNsaWVudF9kZWJ1Z19zdHJpbmcsICIsIik7Ci0JCQl9IGVsc2UgewotCQkJCWdvc3NpcF9lcnIoIiVzOiBvdmVyZmxvdyFcbiIsIF9fZnVuY19fKTsKLQkJCQlzdHJjcHkoY2xpZW50X2RlYnVnX3N0cmluZywgT1JBTkdFRlNfQUxMKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQl9Ci1vdXQ6Ci0JcmV0dXJuOwotfQotCi1pbnQga2V5d29yZF9pc19hbWFsZ2FtKGNoYXIgKmtleXdvcmQpCi17Ci0JaW50IHJjID0gMDsKLQotCWlmICgoIXN0cmNtcChrZXl3b3JkLCBPUkFOR0VGU19BTEwpKSB8fCAoIXN0cmNtcChrZXl3b3JkLCBPUkFOR0VGU19WRVJCT1NFKSkpCi0JCXJjID0gMTsKLQotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIGtlcm5lbCA9IHR5cGUgMAotICogY2xpZW50ID0gdHlwZSAxCi0gKgotICogcmV0dXJuIDEgaWYgd2UgZm91bmQgYW4gYW1hbGdhbS4KLSAqLwotaW50IGNoZWNrX2FtYWxnYW1fa2V5d29yZCh2b2lkICptYXNrLCBpbnQgdHlwZSkKLXsKLQlfX3U2NCAqa19tYXNrOwotCXN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqY19tYXNrOwotCWludCBrX2FsbF9pbmRleCA9IG51bV9rbW9kX2tleXdvcmRfbWFza19tYXAgLSAxOwotCWludCByYyA9IDA7Ci0KLQlpZiAodHlwZSkgewotCQljX21hc2sgPSAoc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICopIG1hc2s7Ci0KLQkJaWYgKChjX21hc2stPm1hc2sxID09IGNkbV9hcnJheVtjbGllbnRfYWxsX2luZGV4XS5tYXNrMSkgJiYKLQkJICAgIChjX21hc2stPm1hc2syID09IGNkbV9hcnJheVtjbGllbnRfYWxsX2luZGV4XS5tYXNrMikpIHsKLQkJCXN0cmNweShjbGllbnRfZGVidWdfc3RyaW5nLCBPUkFOR0VGU19BTEwpOwotCQkJcmMgPSAxOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlpZiAoKGNfbWFzay0+bWFzazEgPT0gY2RtX2FycmF5W2NsaWVudF92ZXJib3NlX2luZGV4XS5tYXNrMSkgJiYKLQkJICAgIChjX21hc2stPm1hc2syID09IGNkbV9hcnJheVtjbGllbnRfdmVyYm9zZV9pbmRleF0ubWFzazIpKSB7Ci0JCQlzdHJjcHkoY2xpZW50X2RlYnVnX3N0cmluZywgT1JBTkdFRlNfVkVSQk9TRSk7Ci0JCQlyYyA9IDE7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JfSBlbHNlIHsKLQkJa19tYXNrID0gKF9fdTY0ICopIG1hc2s7Ci0KLQkJaWYgKCprX21hc2sgPj0gc19rbW9kX2tleXdvcmRfbWFza19tYXBba19hbGxfaW5kZXhdLm1hc2tfdmFsKSB7Ci0JCQlzdHJjcHkoa2VybmVsX2RlYnVnX3N0cmluZywgT1JBTkdFRlNfQUxMKTsKLQkJCXJjID0gMTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi1vdXQ6Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiBrZXJuZWwgPSB0eXBlIDAKLSAqIGNsaWVudCA9IHR5cGUgMQotICovCi12b2lkIGRlYnVnX3N0cmluZ190b19tYXNrKGNoYXIgKmRlYnVnX3N0cmluZywgdm9pZCAqbWFzaywgaW50IHR5cGUpCi17Ci0JY2hhciAqdW5jaGVja2VkX2tleXdvcmQ7Ci0JaW50IGk7Ci0JY2hhciAqc3Ryc2VwX2ZvZGRlciA9IGtzdHJkdXAoZGVidWdfc3RyaW5nLCBHRlBfS0VSTkVMKTsKLQljaGFyICpvcmlnaW5hbF9wb2ludGVyOwotCWludCBlbGVtZW50X2NvdW50ID0gMDsKLQlzdHJ1Y3QgY2xpZW50X2RlYnVnX21hc2sgKmNfbWFzazsKLQlfX3U2NCAqa19tYXNrOwotCi0JZ29zc2lwX2RlYnVnKEdPU1NJUF9VVElMU19ERUJVRywgIiVzOiBzdGFydFxuIiwgX19mdW5jX18pOwotCi0JaWYgKHR5cGUpIHsKLQkJY19tYXNrID0gKHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqKW1hc2s7Ci0JCWVsZW1lbnRfY291bnQgPSBjZG1fZWxlbWVudF9jb3VudDsKLQl9IGVsc2UgewotCQlrX21hc2sgPSAoX191NjQgKiltYXNrOwotCQkqa19tYXNrID0gMDsKLQkJZWxlbWVudF9jb3VudCA9IG51bV9rbW9kX2tleXdvcmRfbWFza19tYXA7Ci0JfQotCi0Jb3JpZ2luYWxfcG9pbnRlciA9IHN0cnNlcF9mb2RkZXI7Ci0Jd2hpbGUgKCh1bmNoZWNrZWRfa2V5d29yZCA9IHN0cnNlcCgmc3Ryc2VwX2ZvZGRlciwgIiwiKSkpCi0JCWlmIChzdHJsZW4odW5jaGVja2VkX2tleXdvcmQpKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZWxlbWVudF9jb3VudDsgaSsrKQotCQkJCWlmICh0eXBlKQotCQkJCQlkb19jX21hc2soaSwKLQkJCQkJCSAgdW5jaGVja2VkX2tleXdvcmQsCi0JCQkJCQkgICZjX21hc2spOwotCQkJCWVsc2UKLQkJCQkJZG9fa19tYXNrKGksCi0JCQkJCQkgIHVuY2hlY2tlZF9rZXl3b3JkLAotCQkJCQkJICAma19tYXNrKTsKLQkJfQotCi0Ja2ZyZWUob3JpZ2luYWxfcG9pbnRlcik7Ci19Ci0KLXZvaWQgZG9fY19tYXNrKGludCBpLAotCSAgICAgICBjaGFyICp1bmNoZWNrZWRfa2V5d29yZCwKLQkgICAgICAgc3RydWN0IGNsaWVudF9kZWJ1Z19tYXNrICoqc2FuZV9tYXNrKQotewotCi0JaWYgKCFzdHJjbXAoY2RtX2FycmF5W2ldLmtleXdvcmQsIHVuY2hlY2tlZF9rZXl3b3JkKSkgewotCQkoKipzYW5lX21hc2spLm1hc2sxID0gKCoqc2FuZV9tYXNrKS5tYXNrMSB8IGNkbV9hcnJheVtpXS5tYXNrMTsKLQkJKCoqc2FuZV9tYXNrKS5tYXNrMiA9ICgqKnNhbmVfbWFzaykubWFzazIgfCBjZG1fYXJyYXlbaV0ubWFzazI7Ci0JfQotfQotCi12b2lkIGRvX2tfbWFzayhpbnQgaSwgY2hhciAqdW5jaGVja2VkX2tleXdvcmQsIF9fdTY0ICoqc2FuZV9tYXNrKQotewotCi0JaWYgKCFzdHJjbXAoc19rbW9kX2tleXdvcmRfbWFza19tYXBbaV0ua2V5d29yZCwgdW5jaGVja2VkX2tleXdvcmQpKQotCQkqKnNhbmVfbWFzayA9ICgqKnNhbmVfbWFzaykgfAotCQkJCXNfa21vZF9rZXl3b3JkX21hc2tfbWFwW2ldLm1hc2tfdmFsOwotfQpkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvcHJvdG9jb2wuaCBiL2ZzL29yYW5nZWZzL3Byb3RvY29sLmgKaW5kZXggM2Q3NDE4Yy4uOTcxMzA3YSAxMDA2NDQKLS0tIGEvZnMvb3JhbmdlZnMvcHJvdG9jb2wuaAorKysgYi9mcy9vcmFuZ2Vmcy9wcm90b2NvbC5oCkBAIC00LDI2ICs0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KIAotZXh0ZXJuIHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayAqY2RtX2FycmF5OwotZXh0ZXJuIGNoYXIgKmRlYnVnX2hlbHBfc3RyaW5nOwotZXh0ZXJuIGludCBoZWxwX3N0cmluZ19pbml0aWFsaXplZDsKLWV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z19kaXI7Ci1leHRlcm4gc3RydWN0IGRlbnRyeSAqaGVscF9maWxlX2RlbnRyeTsKLWV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpjbGllbnRfZGVidWdfZGVudHJ5OwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVidWdfaGVscF9mb3BzOwotZXh0ZXJuIGludCBjbGllbnRfYWxsX2luZGV4OwotZXh0ZXJuIGludCBjbGllbnRfdmVyYm9zZV9pbmRleDsKLWV4dGVybiBpbnQgY2RtX2VsZW1lbnRfY291bnQ7Ci0jZGVmaW5lIERFQlVHX0hFTFBfU1RSSU5HX1NJWkUgNDA5NgotI2RlZmluZSBIRUxQX1NUUklOR19VTklOSVRJQUxJWkVEIFwKLQkiQ2xpZW50IERlYnVnIEtleXdvcmRzIGFyZSB1bmtub3duIHVudGlsIHRoZSBmaXJzdCB0aW1lXG4iIFwKLQkidGhlIGNsaWVudCBpcyBzdGFydGVkIGFmdGVyIGJvb3QuXG4iCi0jZGVmaW5lIE9SQU5HRUZTX0tNT0RfREVCVUdfSEVMUF9GSUxFICJkZWJ1Zy1oZWxwIgotI2RlZmluZSBPUkFOR0VGU19LTU9EX0RFQlVHX0ZJTEUgImtlcm5lbC1kZWJ1ZyIKLSNkZWZpbmUgT1JBTkdFRlNfQ0xJRU5UX0RFQlVHX0ZJTEUgImNsaWVudC1kZWJ1ZyIKLSNkZWZpbmUgT1JBTkdFRlNfVkVSQk9TRSAidmVyYm9zZSIKLSNkZWZpbmUgT1JBTkdFRlNfQUxMICJhbGwiCi0KIC8qIHB2ZnMyLWNvbmZpZy5oICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBPUkFOR0VGU19WRVJTSU9OX01BSk9SIDIKICNkZWZpbmUgT1JBTkdFRlNfVkVSU0lPTl9NSU5PUiA5CkBAIC00MjYsMTMgKzQwNiwxMiBAQAogCQlwcmludGsoS0VSTl9ERUJVRyBmbXQsICMjX19WQV9BUkdTX18pOwkJCVwKIH0gd2hpbGUgKDApCiAjZWxzZQotZXh0ZXJuIF9fdTY0IGdvc3NpcF9kZWJ1Z19tYXNrOwotZXh0ZXJuIHN0cnVjdCBjbGllbnRfZGVidWdfbWFzayBjbGllbnRfZGVidWdfbWFzazsKK2V4dGVybiBfX3U2NCBvcmFuZ2Vmc19nb3NzaXBfZGVidWdfbWFzazsKIAogLyogdHJ5IHRvIGF2b2lkIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQgYnkgY2hlY2tpbmcgbWFza3MgaW4gbWFjcm8gKi8KICNkZWZpbmUgZ29zc2lwX2RlYnVnKG1hc2ssIGZtdCwgLi4uKQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlpZiAoZ29zc2lwX2RlYnVnX21hc2sgJiAobWFzaykpCQkJCQlcCisJaWYgKG9yYW5nZWZzX2dvc3NpcF9kZWJ1Z19tYXNrICYgKG1hc2spKQkJCVwKIAkJcHJpbnRrKEtFUk5fREVCVUcgZm10LCAjI19fVkFfQVJHU19fKTsJCQlcCiB9IHdoaWxlICgwKQogI2VuZGlmIC8qIEdPU1NJUF9ESVNBQkxFX0RFQlVHICovCmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy9zdXBlci5jIGIvZnMvb3JhbmdlZnMvc3VwZXIuYwppbmRleCBiOWRhOWEwLi5jNDg4NTlmIDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy9zdXBlci5jCisrKyBiL2ZzL29yYW5nZWZzL3N1cGVyLmMKQEAgLTMzLDYgKzMzLDcgQEAKIAl7IE9wdF9lcnIsCU5VTEwgfQogfTsKIAordWludDY0X3Qgb3JhbmdlZnNfZmVhdHVyZXM7CiAKIHN0YXRpYyBpbnQgcGFyc2VfbW91bnRfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpvcHRpb25zLAogCQlpbnQgc2lsZW50KQpAQCAtMjQ5LDYgKzI1MCwxOSBAQAogCX0KIAogCW9wX3JlbGVhc2UobmV3X29wKTsKKworCWlmIChvcmFuZ2Vmc191c2Vyc3BhY2VfdmVyc2lvbiA+PSAyMDkwNikgeworCQluZXdfb3AgPSBvcF9hbGxvYyhPUkFOR0VGU19WRlNfT1BfRkVBVFVSRVMpOworCQlpZiAoIW5ld19vcCkKKwkJCXJldHVybiAtRU5PTUVNOworCQluZXdfb3AtPnVwY2FsbC5yZXEuZmVhdHVyZXMuZmVhdHVyZXMgPSAwOworCQlyZXQgPSBzZXJ2aWNlX29wZXJhdGlvbihuZXdfb3AsICJvcmFuZ2Vmc19mZWF0dXJlcyIsIDApOworCQlvcmFuZ2Vmc19mZWF0dXJlcyA9IG5ld19vcC0+ZG93bmNhbGwucmVzcC5mZWF0dXJlcy5mZWF0dXJlczsKKwkJb3BfcmVsZWFzZShuZXdfb3ApOworCX0gZWxzZSB7CisJCW9yYW5nZWZzX2ZlYXR1cmVzID0gMDsKKwl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00OTIsNiArNTA2LDE5IEBACiAJbGlzdF9hZGRfdGFpbCgmT1JBTkdFRlNfU0Ioc2IpLT5saXN0LCAmb3JhbmdlZnNfc3VwZXJibG9ja3MpOwogCXNwaW5fdW5sb2NrKCZvcmFuZ2Vmc19zdXBlcmJsb2Nrc19sb2NrKTsKIAlvcF9yZWxlYXNlKG5ld19vcCk7CisKKwlpZiAob3JhbmdlZnNfdXNlcnNwYWNlX3ZlcnNpb24gPj0gMjA5MDYpIHsKKwkJbmV3X29wID0gb3BfYWxsb2MoT1JBTkdFRlNfVkZTX09QX0ZFQVRVUkVTKTsKKwkJaWYgKCFuZXdfb3ApCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJbmV3X29wLT51cGNhbGwucmVxLmZlYXR1cmVzLmZlYXR1cmVzID0gMDsKKwkJcmV0ID0gc2VydmljZV9vcGVyYXRpb24obmV3X29wLCAib3JhbmdlZnNfZmVhdHVyZXMiLCAwKTsKKwkJb3JhbmdlZnNfZmVhdHVyZXMgPSBuZXdfb3AtPmRvd25jYWxsLnJlc3AuZmVhdHVyZXMuZmVhdHVyZXM7CisJCW9wX3JlbGVhc2UobmV3X29wKTsKKwl9IGVsc2UgeworCQlvcmFuZ2Vmc19mZWF0dXJlcyA9IDA7CisJfQorCiAJcmV0dXJuIGRnZXQoc2ItPnNfcm9vdCk7CiAKIGZyZWVfb3A6CkBAIC01MzAsOCArNTU3LDggQEAKIAkgKiBtYWtlIHN1cmUgdGhhdCBPUkFOR0VGU19ERVZfUkVNT1VOVF9BTEwgbG9vcCB0aGF0IG1pZ2h0J3ZlIHNlZW4gdXMKIAkgKiBnZXRzIGNvbXBsZXRlZCBiZWZvcmUgd2UgZnJlZSB0aGUgZGFuZyB0aGluZy4KIAkgKi8KLQltdXRleF9sb2NrKCZyZXF1ZXN0X211dGV4KTsKLQltdXRleF91bmxvY2soJnJlcXVlc3RfbXV0ZXgpOworCW11dGV4X2xvY2soJm9yYW5nZWZzX3JlcXVlc3RfbXV0ZXgpOworCW11dGV4X3VubG9jaygmb3JhbmdlZnNfcmVxdWVzdF9tdXRleCk7CiAKIAkvKiBmcmVlIHRoZSBvcmFuZ2VmcyBzdXBlcmJsb2NrIHByaXZhdGUgZGF0YSAqLwogCWtmcmVlKE9SQU5HRUZTX1NCKHNiKSk7CmRpZmYgLS1naXQgYS9mcy9vcmFuZ2Vmcy91cGNhbGwuaCBiL2ZzL29yYW5nZWZzL3VwY2FsbC5oCmluZGV4IDAwMWIyMDIuLmFmMGIwZTMgMTAwNjQ0Ci0tLSBhL2ZzL29yYW5nZWZzL3VwY2FsbC5oCisrKyBiL2ZzL29yYW5nZWZzL3VwY2FsbC5oCkBAIC05OCw3ICs5OCw3IEBACiAJX19zNjQgc2l6ZTsKIH07CiAKLXN0cnVjdCBvcmFuZ2Vmc19tbWFwX3JhX2NhY2hlX2ZsdXNoX3JlcXVlc3RfcyB7CitzdHJ1Y3Qgb3JhbmdlZnNfcmFfY2FjaGVfZmx1c2hfcmVxdWVzdF9zIHsKIAlzdHJ1Y3Qgb3JhbmdlZnNfb2JqZWN0X2tyZWYgcmVmbjsKIH07CiAKQEAgLTE3OSwxMiArMTc5LDE4IEBACiAJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9DQVBDQUNIRV9TT0ZUX0xJTUlUID0gMjMsCiAJT1JBTkdFRlNfUEFSQU1fUkVRVUVTVF9PUF9DQVBDQUNIRV9SRUNMQUlNX1BFUkNFTlRBR0UgPSAyNCwKIAlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1RXT19NQVNLX1ZBTFVFUyA9IDI1LAorCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfUkVBREFIRUFEX1NJWkUgPSAyNiwKKwlPUkFOR0VGU19QQVJBTV9SRVFVRVNUX09QX1JFQURBSEVBRF9DT1VOVCA9IDI3LAorCU9SQU5HRUZTX1BBUkFNX1JFUVVFU1RfT1BfUkVBREFIRUFEX0NPVU5UX1NJWkUgPSAyOCwKIH07CiAKIHN0cnVjdCBvcmFuZ2Vmc19wYXJhbV9yZXF1ZXN0X3MgewogCWVudW0gb3JhbmdlZnNfcGFyYW1fcmVxdWVzdF90eXBlIHR5cGU7CiAJZW51bSBvcmFuZ2Vmc19wYXJhbV9yZXF1ZXN0X29wIG9wOwotCV9fczY0IHZhbHVlOworCXVuaW9uIHsKKwkJX19zNjQgdmFsdWU2NDsKKwkJX19zMzIgdmFsdWUzMlsyXTsKKwl9IHU7CiAJY2hhciBzX3ZhbHVlW09SQU5HRUZTX01BWF9ERUJVR19TVFJJTkdfTEVOXTsKIH07CiAKQEAgLTIwNCw2ICsyMTAsMTEgQEAKIAlfX3MzMiBfX3BhZDE7CiB9OwogCisvKiAyLjkuNiAqLworc3RydWN0IG9yYW5nZWZzX2ZlYXR1cmVzX3JlcXVlc3RfcyB7CisJX191NjQgZmVhdHVyZXM7Cit9OworCiBzdHJ1Y3Qgb3JhbmdlZnNfdXBjYWxsX3MgewogCV9fczMyIHR5cGU7CiAJX191MzIgdWlkOwpAQCAtMjI4LDcgKzIzOSw3IEBACiAJCXN0cnVjdCBvcmFuZ2Vmc19yZW5hbWVfcmVxdWVzdF9zIHJlbmFtZTsKIAkJc3RydWN0IG9yYW5nZWZzX3N0YXRmc19yZXF1ZXN0X3Mgc3RhdGZzOwogCQlzdHJ1Y3Qgb3JhbmdlZnNfdHJ1bmNhdGVfcmVxdWVzdF9zIHRydW5jYXRlOwotCQlzdHJ1Y3Qgb3JhbmdlZnNfbW1hcF9yYV9jYWNoZV9mbHVzaF9yZXF1ZXN0X3MgcmFfY2FjaGVfZmx1c2g7CisJCXN0cnVjdCBvcmFuZ2Vmc19yYV9jYWNoZV9mbHVzaF9yZXF1ZXN0X3MgcmFfY2FjaGVfZmx1c2g7CiAJCXN0cnVjdCBvcmFuZ2Vmc19mc19tb3VudF9yZXF1ZXN0X3MgZnNfbW91bnQ7CiAJCXN0cnVjdCBvcmFuZ2Vmc19mc191bW91bnRfcmVxdWVzdF9zIGZzX3Vtb3VudDsKIAkJc3RydWN0IG9yYW5nZWZzX2dldHhhdHRyX3JlcXVlc3RfcyBnZXR4YXR0cjsKQEAgLTI0MCw2ICsyNTEsNyBAQAogCQlzdHJ1Y3Qgb3JhbmdlZnNfcGFyYW1fcmVxdWVzdF9zIHBhcmFtOwogCQlzdHJ1Y3Qgb3JhbmdlZnNfcGVyZl9jb3VudF9yZXF1ZXN0X3MgcGVyZl9jb3VudDsKIAkJc3RydWN0IG9yYW5nZWZzX2ZzX2tleV9yZXF1ZXN0X3MgZnNfa2V5OworCQlzdHJ1Y3Qgb3JhbmdlZnNfZmVhdHVyZXNfcmVxdWVzdF9zIGZlYXR1cmVzOwogCX0gcmVxOwogfTsKIApkaWZmIC0tZ2l0IGEvZnMvb3JhbmdlZnMvd2FpdHF1ZXVlLmMgYi9mcy9vcmFuZ2Vmcy93YWl0cXVldWUuYwppbmRleCAzMTYzNWJjLi5hYmNmYTNmIDEwMDY0NAotLS0gYS9mcy9vcmFuZ2Vmcy93YWl0cXVldWUuYworKysgYi9mcy9vcmFuZ2Vmcy93YWl0cXVldWUuYwpAQCAtODcsOSArODcsOSBAQAogCSAqLwogCWlmICghKGZsYWdzICYgT1JBTkdFRlNfT1BfTk9fTVVURVgpKSB7CiAJCWlmIChmbGFncyAmIE9SQU5HRUZTX09QX0lOVEVSUlVQVElCTEUpCi0JCQlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnJlcXVlc3RfbXV0ZXgpOworCQkJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZvcmFuZ2Vmc19yZXF1ZXN0X211dGV4KTsKIAkJZWxzZQotCQkJcmV0ID0gbXV0ZXhfbG9ja19raWxsYWJsZSgmcmVxdWVzdF9tdXRleCk7CisJCQlyZXQgPSBtdXRleF9sb2NrX2tpbGxhYmxlKCZvcmFuZ2Vmc19yZXF1ZXN0X211dGV4KTsKIAkJLyoKIAkJICogY2hlY2sgdG8gc2VlIGlmIHdlIHdlcmUgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IKIAkJICogbXV0ZXgKQEAgLTEyOSw3ICsxMjksNyBAQAogCXNwaW5fdW5sb2NrKCZvcmFuZ2Vmc19yZXF1ZXN0X2xpc3RfbG9jayk7CiAKIAlpZiAoIShmbGFncyAmIE9SQU5HRUZTX09QX05PX01VVEVYKSkKLQkJbXV0ZXhfdW5sb2NrKCZyZXF1ZXN0X211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZvcmFuZ2Vmc19yZXF1ZXN0X211dGV4KTsKIAogCXJldCA9IHdhaXRfZm9yX21hdGNoaW5nX2Rvd25jYWxsKG9wLCB0aW1lb3V0LAogCQkJCQkgZmxhZ3MgJiBPUkFOR0VGU19PUF9JTlRFUlJVUFRJQkxFKTsKQEAgLTI3Miw5ICsyNzIsOSBAQAogCX0gZWxzZSBpZiAob3Bfc3RhdGVfaW5fcHJvZ3Jlc3Mob3ApKSB7CiAJCS8qIG9wIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBpbiBwcm9ncmVzcyBodGFibGUgKi8KIAkJc3Bpbl91bmxvY2soJm9wLT5sb2NrKTsKLQkJc3Bpbl9sb2NrKCZodGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOworCQlzcGluX2xvY2soJm9yYW5nZWZzX2h0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CiAJCWxpc3RfZGVsX2luaXQoJm9wLT5saXN0KTsKLQkJc3Bpbl91bmxvY2soJmh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZvcmFuZ2Vmc19odGFibGVfb3BzX2luX3Byb2dyZXNzX2xvY2spOwogCQlnb3NzaXBfZGVidWcoR09TU0lQX1dBSVRfREVCVUcsCiAJCQkgICAgICJJbnRlcnJ1cHRlZDogUmVtb3ZlZCBvcCAlcCIKIAkJCSAgICAgIiBmcm9tIGh0YWJsZV9vcHNfaW5fcHJvZ3Jlc3NcbiIsCmRpZmYgLS1naXQgYS9mcy9vdmVybGF5ZnMvY29weV91cC5jIGIvZnMvb3ZlcmxheWZzL2NvcHlfdXAuYwppbmRleCA1NGU1ZDY2Li5kYjM3YTBlIDEwMDY0NAotLS0gYS9mcy9vdmVybGF5ZnMvY29weV91cC5jCisrKyBiL2ZzL292ZXJsYXlmcy9jb3B5X3VwLmMKQEAgLTgwLDYgKzgwLDggQEAKIAl9CiAKIAlmb3IgKG5hbWUgPSBidWY7IG5hbWUgPCAoYnVmICsgbGlzdF9zaXplKTsgbmFtZSArPSBzdHJsZW4obmFtZSkgKyAxKSB7CisJCWlmIChvdmxfaXNfcHJpdmF0ZV94YXR0cihuYW1lKSkKKwkJCWNvbnRpbnVlOwogcmV0cnk6CiAJCXNpemUgPSB2ZnNfZ2V0eGF0dHIob2xkLCBuYW1lLCB2YWx1ZSwgdmFsdWVfc2l6ZSk7CiAJCWlmIChzaXplID09IC1FUkFOR0UpCkBAIC0xMDMsNiArMTA1LDEzIEBACiAJCQlnb3RvIHJldHJ5OwogCQl9CiAKKwkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9jb3B5X3VwX3hhdHRyKG5hbWUpOworCQlpZiAoZXJyb3IgPCAwICYmIGVycm9yICE9IC1FT1BOT1RTVVBQKQorCQkJYnJlYWs7CisJCWlmIChlcnJvciA9PSAxKSB7CisJCQllcnJvciA9IDA7CisJCQljb250aW51ZTsgLyogRGlzY2FyZCAqLworCQl9CiAJCWVycm9yID0gdmZzX3NldHhhdHRyKG5ldywgbmFtZSwgdmFsdWUsIHNpemUsIDApOwogCQlpZiAoZXJyb3IpCiAJCQlicmVhazsKQEAgLTI0Niw2ICsyNTUsOCBAQAogCXN0cnVjdCBkZW50cnkgKnVwcGVyID0gTlVMTDsKIAl1bW9kZV90IG1vZGUgPSBzdGF0LT5tb2RlOwogCWludCBlcnI7CisJY29uc3Qgc3RydWN0IGNyZWQgKm9sZF9jcmVkcyA9IE5VTEw7CisJc3RydWN0IGNyZWQgKm5ld19jcmVkcyA9IE5VTEw7CiAKIAluZXdkZW50cnkgPSBvdmxfbG9va3VwX3RlbXAod29ya2RpciwgZGVudHJ5KTsKIAllcnIgPSBQVFJfRVJSKG5ld2RlbnRyeSk7CkBAIC0yNTgsMTAgKzI2OSwyMyBAQAogCWlmIChJU19FUlIodXBwZXIpKQogCQlnb3RvIG91dDE7CiAKKwllcnIgPSBzZWN1cml0eV9pbm9kZV9jb3B5X3VwKGRlbnRyeSwgJm5ld19jcmVkcyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0MjsKKworCWlmIChuZXdfY3JlZHMpCisJCW9sZF9jcmVkcyA9IG92ZXJyaWRlX2NyZWRzKG5ld19jcmVkcyk7CisKIAkvKiBDYW4ndCBwcm9wZXJseSBzZXQgbW9kZSBvbiBjcmVhdGlvbiBiZWNhdXNlIG9mIHRoZSB1bWFzayAqLwogCXN0YXQtPm1vZGUgJj0gU19JRk1UOwogCWVyciA9IG92bF9jcmVhdGVfcmVhbCh3ZGlyLCBuZXdkZW50cnksIHN0YXQsIGxpbmssIE5VTEwsIHRydWUpOwogCXN0YXQtPm1vZGUgPSBtb2RlOworCisJaWYgKG5ld19jcmVkcykgeworCQlyZXZlcnRfY3JlZHMob2xkX2NyZWRzKTsKKwkJcHV0X2NyZWQobmV3X2NyZWRzKTsKKwl9CisKIAlpZiAoZXJyKQogCQlnb3RvIG91dDI7CiAKZGlmZiAtLWdpdCBhL2ZzL292ZXJsYXlmcy9kaXIuYyBiL2ZzL292ZXJsYXlmcy9kaXIuYwppbmRleCAxMmJjZDA3Li5iMGZmYTFkIDEwMDY0NAotLS0gYS9mcy9vdmVybGF5ZnMvZGlyLmMKKysrIGIvZnMvb3ZlcmxheWZzL2Rpci5jCkBAIC0xMiw2ICsxMiw4IEBACiAjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2NyZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KICNpbmNsdWRlICJvdmVybGF5ZnMuaCIKIAogdm9pZCBvdmxfY2xlYW51cChzdHJ1Y3QgaW5vZGUgKndkaXIsIHN0cnVjdCBkZW50cnkgKndkZW50cnkpCkBAIC0xODYsNiArMTg4LDkgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpuZXdkZW50cnk7CiAJaW50IGVycjsKIAorCWlmICghaGFyZGxpbmsgJiYgIUlTX1BPU0lYQUNMKHVkaXIpKQorCQlzdGF0LT5tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CisKIAlpbm9kZV9sb2NrX25lc3RlZCh1ZGlyLCBJX01VVEVYX1BBUkVOVCk7CiAJbmV3ZGVudHJ5ID0gbG9va3VwX29uZV9sZW4oZGVudHJ5LT5kX25hbWUubmFtZSwgdXBwZXJkaXIsCiAJCQkJICAgZGVudHJ5LT5kX25hbWUubGVuKTsKQEAgLTMzNSw2ICszNDAsMzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IG92bF9zZXRfdXBwZXJfYWNsKHN0cnVjdCBkZW50cnkgKnVwcGVyZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCit7CisJdm9pZCAqYnVmZmVyOworCXNpemVfdCBzaXplOworCWludCBlcnI7CisKKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0ZTX1BPU0lYX0FDTCkgfHwgIWFjbCkKKwkJcmV0dXJuIDA7CisKKwlzaXplID0gcG9zaXhfYWNsX3RvX3hhdHRyKE5VTEwsIGFjbCwgTlVMTCwgMCk7CisJYnVmZmVyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzaXplID0gcG9zaXhfYWNsX3RvX3hhdHRyKCZpbml0X3VzZXJfbnMsIGFjbCwgYnVmZmVyLCBzaXplKTsKKwllcnIgPSBzaXplOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJZXJyID0gdmZzX3NldHhhdHRyKHVwcGVyZGVudHJ5LCBuYW1lLCBidWZmZXIsIHNpemUsIFhBVFRSX0NSRUFURSk7CitvdXRfZnJlZToKKwlrZnJlZShidWZmZXIpOworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBpbnQgb3ZsX2NyZWF0ZV9vdmVyX3doaXRlb3V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgICAgc3RydWN0IGtzdGF0ICpzdGF0LCBjb25zdCBjaGFyICpsaW5rLAogCQkJCSAgICBzdHJ1Y3QgZGVudHJ5ICpoYXJkbGluaykKQEAgLTM0NiwxMCArMzc3LDE4IEBACiAJc3RydWN0IGRlbnRyeSAqdXBwZXI7CiAJc3RydWN0IGRlbnRyeSAqbmV3ZGVudHJ5OwogCWludCBlcnI7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqZGVmYXVsdF9hY2w7CiAKIAlpZiAoV0FSTl9PTighd29ya2RpcikpCiAJCXJldHVybiAtRVJPRlM7CiAKKwlpZiAoIWhhcmRsaW5rKSB7CisJCWVyciA9IHBvc2l4X2FjbF9jcmVhdGUoZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSwKKwkJCQkgICAgICAgJnN0YXQtPm1vZGUsICZkZWZhdWx0X2FjbCwgJmFjbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwogCWVyciA9IG92bF9sb2NrX3JlbmFtZV93b3JrZGlyKHdvcmtkaXIsIHVwcGVyZGlyKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKQEAgLTM4NCw2ICs0MjMsMTcgQEAKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0X2NsZWFudXA7CiAJfQorCWlmICghaGFyZGxpbmspIHsKKwkJZXJyID0gb3ZsX3NldF91cHBlcl9hY2wobmV3ZGVudHJ5LCBYQVRUUl9OQU1FX1BPU0lYX0FDTF9BQ0NFU1MsCisJCQkJCWFjbCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9jbGVhbnVwOworCisJCWVyciA9IG92bF9zZXRfdXBwZXJfYWNsKG5ld2RlbnRyeSwgWEFUVFJfTkFNRV9QT1NJWF9BQ0xfREVGQVVMVCwKKwkJCQkJZGVmYXVsdF9hY2wpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfY2xlYW51cDsKKwl9CiAKIAlpZiAoIWhhcmRsaW5rICYmIFNfSVNESVIoc3RhdC0+bW9kZSkpIHsKIAkJZXJyID0gb3ZsX3NldF9vcGFxdWUobmV3ZGVudHJ5KTsKQEAgLTQxMCw2ICs0NjAsMTAgQEAKIG91dF91bmxvY2s6CiAJdW5sb2NrX3JlbmFtZSh3b3JrZGlyLCB1cHBlcmRpcik7CiBvdXQ6CisJaWYgKCFoYXJkbGluaykgeworCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCQlwb3NpeF9hY2xfcmVsZWFzZShkZWZhdWx0X2FjbCk7CisJfQogCXJldHVybiBlcnI7CiAKIG91dF9jbGVhbnVwOgpAQCAtNDM1LDYgKzQ4OSwxNSBAQAogCWlmIChvdmVycmlkZV9jcmVkKSB7CiAJCW92ZXJyaWRlX2NyZWQtPmZzdWlkID0gaW5vZGUtPmlfdWlkOwogCQlvdmVycmlkZV9jcmVkLT5mc2dpZCA9IGlub2RlLT5pX2dpZDsKKwkJaWYgKCFoYXJkbGluaykgeworCQkJZXJyID0gc2VjdXJpdHlfZGVudHJ5X2NyZWF0ZV9maWxlc19hcyhkZW50cnksCisJCQkJCXN0YXQtPm1vZGUsICZkZW50cnktPmRfbmFtZSwgb2xkX2NyZWQsCisJCQkJCW92ZXJyaWRlX2NyZWQpOworCQkJaWYgKGVycikgeworCQkJCXB1dF9jcmVkKG92ZXJyaWRlX2NyZWQpOworCQkJCWdvdG8gb3V0X3JldmVydF9jcmVkczsKKwkJCX0KKwkJfQogCQlwdXRfY3JlZChvdmVycmlkZV9jcmVkcyhvdmVycmlkZV9jcmVkKSk7CiAJCXB1dF9jcmVkKG92ZXJyaWRlX2NyZWQpOwogCkBAIC00NDUsNiArNTA4LDcgQEAKIAkJCWVyciA9IG92bF9jcmVhdGVfb3Zlcl93aGl0ZW91dChkZW50cnksIGlub2RlLCBzdGF0LAogCQkJCQkJCWxpbmssIGhhcmRsaW5rKTsKIAl9CitvdXRfcmV2ZXJ0X2NyZWRzOgogCXJldmVydF9jcmVkcyhvbGRfY3JlZCk7CiAJaWYgKCFlcnIpIHsKIAkJc3RydWN0IGlub2RlICpyZWFsaW5vZGUgPSBkX2lub2RlKG92bF9kZW50cnlfdXBwZXIoZGVudHJ5KSk7CkBAIC05NTAsOSArMTAxNCw5IEBACiAJLnBlcm1pc3Npb24JPSBvdmxfcGVybWlzc2lvbiwKIAkuZ2V0YXR0cgk9IG92bF9kaXJfZ2V0YXR0ciwKIAkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAotCS5nZXR4YXR0cgk9IG92bF9nZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBvdmxfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0cgk9IG92bF9yZW1vdmV4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogCS5nZXRfYWNsCT0gb3ZsX2dldF9hY2wsCiAJLnVwZGF0ZV90aW1lCT0gb3ZsX3VwZGF0ZV90aW1lLAogfTsKZGlmZiAtLWdpdCBhL2ZzL292ZXJsYXlmcy9pbm9kZS5jIGIvZnMvb3ZlcmxheWZzL2lub2RlLmMKaW5kZXggMWI4ODVjMS4uYzc1NjI1YyAxMDA2NDQKLS0tIGEvZnMvb3ZlcmxheWZzL2lub2RlLmMKKysrIGIvZnMvb3ZlcmxheWZzL2lub2RlLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgogI2luY2x1ZGUgIm92ZXJsYXlmcy5oIgogCiBzdGF0aWMgaW50IG92bF9jb3B5X3VwX3RydW5jYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKQEAgLTE5MSwzMiArMTkyLDQ0IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGJvb2wgb3ZsX2lzX3ByaXZhdGVfeGF0dHIoY29uc3QgY2hhciAqbmFtZSkKK2Jvb2wgb3ZsX2lzX3ByaXZhdGVfeGF0dHIoY29uc3QgY2hhciAqbmFtZSkKIHsKLSNkZWZpbmUgT1ZMX1hBVFRSX1BSRV9OQU1FIE9WTF9YQVRUUl9QUkVGSVggIi4iCi0JcmV0dXJuIHN0cm5jbXAobmFtZSwgT1ZMX1hBVFRSX1BSRV9OQU1FLAotCQkgICAgICAgc2l6ZW9mKE9WTF9YQVRUUl9QUkVfTkFNRSkgLSAxKSA9PSAwOworCXJldHVybiBzdHJuY21wKG5hbWUsIE9WTF9YQVRUUl9QUkVGSVgsCisJCSAgICAgICBzaXplb2YoT1ZMX1hBVFRSX1BSRUZJWCkgLSAxKSA9PSAwOwogfQogCi1pbnQgb3ZsX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAotCQkgc2l6ZV90IHNpemUsIGludCBmbGFncykKK2ludCBvdmxfeGF0dHJfc2V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCisJCSAgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBkZW50cnkgKnVwcGVyZGVudHJ5OworCXN0cnVjdCBwYXRoIHJlYWxwYXRoOworCWVudW0gb3ZsX3BhdGhfdHlwZSB0eXBlID0gb3ZsX3BhdGhfcmVhbChkZW50cnksICZyZWFscGF0aCk7CiAJY29uc3Qgc3RydWN0IGNyZWQgKm9sZF9jcmVkOwogCiAJZXJyID0gb3ZsX3dhbnRfd3JpdGUoZGVudHJ5KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIAorCWlmICghdmFsdWUgJiYgIU9WTF9UWVBFX1VQUEVSKHR5cGUpKSB7CisJCWVyciA9IHZmc19nZXR4YXR0cihyZWFscGF0aC5kZW50cnksIG5hbWUsIE5VTEwsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X2Ryb3Bfd3JpdGU7CisJfQorCiAJZXJyID0gb3ZsX2NvcHlfdXAoZGVudHJ5KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9kcm9wX3dyaXRlOwogCi0JdXBwZXJkZW50cnkgPSBvdmxfZGVudHJ5X3VwcGVyKGRlbnRyeSk7CisJaWYgKCFPVkxfVFlQRV9VUFBFUih0eXBlKSkKKwkJb3ZsX3BhdGhfdXBwZXIoZGVudHJ5LCAmcmVhbHBhdGgpOworCiAJb2xkX2NyZWQgPSBvdmxfb3ZlcnJpZGVfY3JlZHMoZGVudHJ5LT5kX3NiKTsKLQllcnIgPSB2ZnNfc2V0eGF0dHIodXBwZXJkZW50cnksIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CisJaWYgKHZhbHVlKQorCQllcnIgPSB2ZnNfc2V0eGF0dHIocmVhbHBhdGguZGVudHJ5LCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworCWVsc2UgeworCQlXQVJOX09OKGZsYWdzICE9IFhBVFRSX1JFUExBQ0UpOworCQllcnIgPSB2ZnNfcmVtb3ZleGF0dHIocmVhbHBhdGguZGVudHJ5LCBuYW1lKTsKKwl9CiAJcmV2ZXJ0X2NyZWRzKG9sZF9jcmVkKTsKIAogb3V0X2Ryb3Bfd3JpdGU6CkBAIC0yMjUsMTYgKzIzOCwxMyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXNzaXplX3Qgb3ZsX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJICAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpCitpbnQgb3ZsX3hhdHRyX2dldChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBkZW50cnkgKnJlYWxkZW50cnkgPSBvdmxfZGVudHJ5X3JlYWwoZGVudHJ5KTsKIAlzc2l6ZV90IHJlczsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkX2NyZWQ7CiAKLQlpZiAob3ZsX2lzX3ByaXZhdGVfeGF0dHIobmFtZSkpCi0JCXJldHVybiAtRU5PREFUQTsKLQogCW9sZF9jcmVkID0gb3ZsX292ZXJyaWRlX2NyZWRzKGRlbnRyeS0+ZF9zYik7CiAJcmVzID0gdmZzX2dldHhhdHRyKHJlYWxkZW50cnksIG5hbWUsIHZhbHVlLCBzaXplKTsKIAlyZXZlcnRfY3JlZHMob2xkX2NyZWQpOwpAQCAtMjQ1LDcgKzI1NSw4IEBACiB7CiAJc3RydWN0IGRlbnRyeSAqcmVhbGRlbnRyeSA9IG92bF9kZW50cnlfcmVhbChkZW50cnkpOwogCXNzaXplX3QgcmVzOwotCWludCBvZmY7CisJc2l6ZV90IGxlbjsKKwljaGFyICpzOwogCWNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZDsKIAogCW9sZF9jcmVkID0gb3ZsX292ZXJyaWRlX2NyZWRzKGRlbnRyeS0+ZF9zYik7CkBAIC0yNTUsNzMgKzI2NiwzOSBAQAogCQlyZXR1cm4gcmVzOwogCiAJLyogZmlsdGVyIG91dCBwcml2YXRlIHhhdHRycyAqLwotCWZvciAob2ZmID0gMDsgb2ZmIDwgcmVzOykgewotCQljaGFyICpzID0gbGlzdCArIG9mZjsKLQkJc2l6ZV90IHNsZW4gPSBzdHJsZW4ocykgKyAxOworCWZvciAocyA9IGxpc3QsIGxlbiA9IHJlczsgbGVuOykgeworCQlzaXplX3Qgc2xlbiA9IHN0cm5sZW4ocywgbGVuKSArIDE7CiAKLQkJQlVHX09OKG9mZiArIHNsZW4gPiByZXMpOworCQkvKiB1bmRlcmx5aW5nIGZzIHByb3ZpZGluZyB1cyB3aXRoIGFuIGJyb2tlbiB4YXR0ciBsaXN0PyAqLworCQlpZiAoV0FSTl9PTihzbGVuID4gbGVuKSkKKwkJCXJldHVybiAtRUlPOwogCisJCWxlbiAtPSBzbGVuOwogCQlpZiAob3ZsX2lzX3ByaXZhdGVfeGF0dHIocykpIHsKIAkJCXJlcyAtPSBzbGVuOwotCQkJbWVtbW92ZShzLCBzICsgc2xlbiwgcmVzIC0gb2ZmKTsKKwkJCW1lbW1vdmUocywgcyArIHNsZW4sIGxlbik7CiAJCX0gZWxzZSB7Ci0JCQlvZmYgKz0gc2xlbjsKKwkJCXMgKz0gc2xlbjsKIAkJfQogCX0KIAogCXJldHVybiByZXM7CiB9CiAKLWludCBvdmxfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQotewotCWludCBlcnI7Ci0Jc3RydWN0IHBhdGggcmVhbHBhdGg7Ci0JZW51bSBvdmxfcGF0aF90eXBlIHR5cGUgPSBvdmxfcGF0aF9yZWFsKGRlbnRyeSwgJnJlYWxwYXRoKTsKLQljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkX2NyZWQ7Ci0KLQllcnIgPSBvdmxfd2FudF93cml0ZShkZW50cnkpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCi0JZXJyID0gLUVOT0RBVEE7Ci0JaWYgKG92bF9pc19wcml2YXRlX3hhdHRyKG5hbWUpKQotCQlnb3RvIG91dF9kcm9wX3dyaXRlOwotCi0JaWYgKCFPVkxfVFlQRV9VUFBFUih0eXBlKSkgewotCQllcnIgPSB2ZnNfZ2V0eGF0dHIocmVhbHBhdGguZGVudHJ5LCBuYW1lLCBOVUxMLCAwKTsKLQkJaWYgKGVyciA8IDApCi0JCQlnb3RvIG91dF9kcm9wX3dyaXRlOwotCi0JCWVyciA9IG92bF9jb3B5X3VwKGRlbnRyeSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dF9kcm9wX3dyaXRlOwotCi0JCW92bF9wYXRoX3VwcGVyKGRlbnRyeSwgJnJlYWxwYXRoKTsKLQl9Ci0KLQlvbGRfY3JlZCA9IG92bF9vdmVycmlkZV9jcmVkcyhkZW50cnktPmRfc2IpOwotCWVyciA9IHZmc19yZW1vdmV4YXR0cihyZWFscGF0aC5kZW50cnksIG5hbWUpOwotCXJldmVydF9jcmVkcyhvbGRfY3JlZCk7Ci1vdXRfZHJvcF93cml0ZToKLQlvdmxfZHJvcF93cml0ZShkZW50cnkpOwotb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KIHN0cnVjdCBwb3NpeF9hY2wgKm92bF9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQogewogCXN0cnVjdCBpbm9kZSAqcmVhbGlub2RlID0gb3ZsX2lub2RlX3JlYWwoaW5vZGUsIE5VTEwpOwogCWNvbnN0IHN0cnVjdCBjcmVkICpvbGRfY3JlZDsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAKLQlpZiAoIUlTX1BPU0lYQUNMKHJlYWxpbm9kZSkpCisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19GU19QT1NJWF9BQ0wpIHx8ICFJU19QT1NJWEFDTChyZWFsaW5vZGUpKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmICghcmVhbGlub2RlLT5pX29wLT5nZXRfYWNsKQogCQlyZXR1cm4gTlVMTDsKIAogCW9sZF9jcmVkID0gb3ZsX292ZXJyaWRlX2NyZWRzKGlub2RlLT5pX3NiKTsKLQlhY2wgPSByZWFsaW5vZGUtPmlfb3AtPmdldF9hY2wocmVhbGlub2RlLCB0eXBlKTsKKwlhY2wgPSBnZXRfYWNsKHJlYWxpbm9kZSwgdHlwZSk7CiAJcmV2ZXJ0X2NyZWRzKG9sZF9jcmVkKTsKIAogCXJldHVybiBhY2w7CkBAIC0zOTEsOSArMzY4LDkgQEAKIAkucGVybWlzc2lvbgk9IG92bF9wZXJtaXNzaW9uLAogCS5nZXRhdHRyCT0gb3ZsX2dldGF0dHIsCiAJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKLQkuZ2V0eGF0dHIJPSBvdmxfZ2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKIAkubGlzdHhhdHRyCT0gb3ZsX2xpc3R4YXR0ciwKLQkucmVtb3ZleGF0dHIJPSBvdmxfcmVtb3ZleGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKIAkuZ2V0X2FjbAk9IG92bF9nZXRfYWNsLAogCS51cGRhdGVfdGltZQk9IG92bF91cGRhdGVfdGltZSwKIH07CkBAIC00MDQsOSArMzgxLDkgQEAKIAkucmVhZGxpbmsJPSBvdmxfcmVhZGxpbmssCiAJLmdldGF0dHIJPSBvdmxfZ2V0YXR0ciwKIAkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAotCS5nZXR4YXR0cgk9IG92bF9nZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAogCS5saXN0eGF0dHIJPSBvdmxfbGlzdHhhdHRyLAotCS5yZW1vdmV4YXR0cgk9IG92bF9yZW1vdmV4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogCS51cGRhdGVfdGltZQk9IG92bF91cGRhdGVfdGltZSwKIH07CiAKQEAgLTQxNSw2ICszOTIsOSBAQAogCWlub2RlLT5pX2lubyA9IGdldF9uZXh0X2lubygpOwogCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9DTVRJTUU7CisjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAorCWlub2RlLT5pX2FjbCA9IGlub2RlLT5pX2RlZmF1bHRfYWNsID0gQUNMX0RPTlRfQ0FDSEU7CisjZW5kaWYKIAogCW1vZGUgJj0gU19JRk1UOwogCXN3aXRjaCAobW9kZSkgewpkaWZmIC0tZ2l0IGEvZnMvb3ZlcmxheWZzL292ZXJsYXlmcy5oIGIvZnMvb3ZlcmxheWZzL292ZXJsYXlmcy5oCmluZGV4IGU0ZjVjOTUuLjU4MTNjY2YgMTAwNjQ0Ci0tLSBhL2ZzL292ZXJsYXlmcy9vdmVybGF5ZnMuaAorKysgYi9mcy9vdmVybGF5ZnMvb3ZlcmxheWZzLmgKQEAgLTI0LDggKzI0LDggQEAKIAkoT1ZMX1RZUEVfTUVSR0UodHlwZSkgfHwgIU9WTF9UWVBFX1VQUEVSKHR5cGUpKQogCiAKLSNkZWZpbmUgT1ZMX1hBVFRSX1BSRUZJWCBYQVRUUl9UUlVTVEVEX1BSRUZJWCAib3ZlcmxheSIKLSNkZWZpbmUgT1ZMX1hBVFRSX09QQVFVRSBPVkxfWEFUVFJfUFJFRklYICIub3BhcXVlIgorI2RlZmluZSBPVkxfWEFUVFJfUFJFRklYIFhBVFRSX1RSVVNURURfUFJFRklYICJvdmVybGF5LiIKKyNkZWZpbmUgT1ZMX1hBVFRSX09QQVFVRSBPVkxfWEFUVFJfUFJFRklYICJvcGFxdWUiCiAKICNkZWZpbmUgT1ZMX0lTVVBQRVJfTUFTSyAxVUwKIApAQCAtMTc5LDIwICsxNzksMjEgQEAKIHZvaWQgb3ZsX2NsZWFudXBfd2hpdGVvdXRzKHN0cnVjdCBkZW50cnkgKnVwcGVyLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKIHZvaWQgb3ZsX2NhY2hlX2ZyZWUoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCk7CiBpbnQgb3ZsX2NoZWNrX2RfdHlwZV9zdXBwb3J0ZWQoc3RydWN0IHBhdGggKnJlYWxwYXRoKTsKK3ZvaWQgb3ZsX3dvcmtkaXJfY2xlYW51cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHZmc21vdW50ICptbnQsCisJCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbGV2ZWwpOwogCiAvKiBpbm9kZS5jICovCiBpbnQgb3ZsX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwogaW50IG92bF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKTsKLWludCBvdmxfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCi0JCSBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKLXNzaXplX3Qgb3ZsX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJICAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpOworaW50IG92bF94YXR0cl9zZXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwKKwkJICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKK2ludCBvdmxfeGF0dHJfZ2V0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpOwogc3NpemVfdCBvdmxfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqbGlzdCwgc2l6ZV90IHNpemUpOwotaW50IG92bF9yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpOwogc3RydWN0IHBvc2l4X2FjbCAqb3ZsX2dldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpOwogaW50IG92bF9vcGVuX21heWJlX2NvcHlfdXAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1bnNpZ25lZCBpbnQgZmlsZV9mbGFncyk7CiBpbnQgb3ZsX3VwZGF0ZV90aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCB0aW1lc3BlYyAqdHMsIGludCBmbGFncyk7Citib29sIG92bF9pc19wcml2YXRlX3hhdHRyKGNvbnN0IGNoYXIgKm5hbWUpOwogCiBzdHJ1Y3QgaW5vZGUgKm92bF9uZXdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW1vZGVfdCBtb2RlKTsKIHN0cnVjdCBpbm9kZSAqb3ZsX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKnJlYWxpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9vdmVybGF5ZnMvcmVhZGRpci5jIGIvZnMvb3ZlcmxheWZzL3JlYWRkaXIuYwppbmRleCBjZjM3ZmM3Li5mMjQxYjRlIDEwMDY0NAotLS0gYS9mcy9vdmVybGF5ZnMvcmVhZGRpci5jCisrKyBiL2ZzL292ZXJsYXlmcy9yZWFkZGlyLmMKQEAgLTI0OCw3ICsyNDgsNyBAQAogCQkJZXJyID0gcmRkLT5lcnI7CiAJfSB3aGlsZSAoIWVyciAmJiByZGQtPmNvdW50KTsKIAotCWlmICghZXJyICYmIHJkZC0+Zmlyc3RfbWF5YmVfd2hpdGVvdXQpCisJaWYgKCFlcnIgJiYgcmRkLT5maXJzdF9tYXliZV93aGl0ZW91dCAmJiByZGQtPmRlbnRyeSkKIAkJZXJyID0gb3ZsX2NoZWNrX3doaXRlb3V0cyhyZWFscGF0aC0+ZGVudHJ5LCByZGQpOwogCiAJZnB1dChyZWFsZmlsZSk7CkBAIC02MDYsMyArNjA2LDY0IEBACiAKIAlyZXR1cm4gcmRkLmRfdHlwZV9zdXBwb3J0ZWQ7CiB9CisKK3N0YXRpYyB2b2lkIG92bF93b3JrZGlyX2NsZWFudXBfcmVjdXJzZShzdHJ1Y3QgcGF0aCAqcGF0aCwgaW50IGxldmVsKQoreworCWludCBlcnI7CisJc3RydWN0IGlub2RlICpkaXIgPSBwYXRoLT5kZW50cnktPmRfaW5vZGU7CisJTElTVF9IRUFEKGxpc3QpOworCXN0cnVjdCBvdmxfY2FjaGVfZW50cnkgKnA7CisJc3RydWN0IG92bF9yZWFkZGlyX2RhdGEgcmRkID0geworCQkuY3R4LmFjdG9yID0gb3ZsX2ZpbGxfbWVyZ2UsCisJCS5kZW50cnkgPSBOVUxMLAorCQkubGlzdCA9ICZsaXN0LAorCQkucm9vdCA9IFJCX1JPT1QsCisJCS5pc19sb3dlc3QgPSBmYWxzZSwKKwl9OworCisJZXJyID0gb3ZsX2Rpcl9yZWFkKHBhdGgsICZyZGQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaW5vZGVfbG9ja19uZXN0ZWQoZGlyLCBJX01VVEVYX1BBUkVOVCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmbGlzdCwgbF9ub2RlKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCQlpZiAocC0+bmFtZVswXSA9PSAnLicpIHsKKwkJCWlmIChwLT5sZW4gPT0gMSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChwLT5sZW4gPT0gMiAmJiBwLT5uYW1lWzFdID09ICcuJykKKwkJCQljb250aW51ZTsKKwkJfQorCQlkZW50cnkgPSBsb29rdXBfb25lX2xlbihwLT5uYW1lLCBwYXRoLT5kZW50cnksIHAtPmxlbik7CisJCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGVudHJ5LT5kX2lub2RlKQorCQkJb3ZsX3dvcmtkaXJfY2xlYW51cChkaXIsIHBhdGgtPm1udCwgZGVudHJ5LCBsZXZlbCk7CisJCWRwdXQoZGVudHJ5KTsKKwl9CisJaW5vZGVfdW5sb2NrKGRpcik7CitvdXQ6CisJb3ZsX2NhY2hlX2ZyZWUoJmxpc3QpOworfQorCit2b2lkIG92bF93b3JrZGlyX2NsZWFudXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGxldmVsKQoreworCWludCBlcnI7CisKKwlpZiAoIWRfaXNfZGlyKGRlbnRyeSkgfHwgbGV2ZWwgPiAxKSB7CisJCW92bF9jbGVhbnVwKGRpciwgZGVudHJ5KTsKKwkJcmV0dXJuOworCX0KKworCWVyciA9IG92bF9kb19ybWRpcihkaXIsIGRlbnRyeSk7CisJaWYgKGVycikgeworCQlzdHJ1Y3QgcGF0aCBwYXRoID0geyAubW50ID0gbW50LCAuZGVudHJ5ID0gZGVudHJ5IH07CisKKwkJaW5vZGVfdW5sb2NrKGRpcik7CisJCW92bF93b3JrZGlyX2NsZWFudXBfcmVjdXJzZSgmcGF0aCwgbGV2ZWwgKyAxKTsKKwkJaW5vZGVfbG9ja19uZXN0ZWQoZGlyLCBJX01VVEVYX1BBUkVOVCk7CisJCW92bF9jbGVhbnVwKGRpciwgZGVudHJ5KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9vdmVybGF5ZnMvc3VwZXIuYyBiL2ZzL292ZXJsYXlmcy9zdXBlci5jCmluZGV4IDQwMzYxMzIuLmUyYTk0YTIgMTAwNjQ0Ci0tLSBhL2ZzL292ZXJsYXlmcy9zdXBlci5jCisrKyBiL2ZzL292ZXJsYXlmcy9zdXBlci5jCkBAIC04MTQsNiArODE0LDEwIEBACiAJCXN0cnVjdCBrc3RhdCBzdGF0ID0gewogCQkJLm1vZGUgPSBTX0lGRElSIHwgMCwKIAkJfTsKKwkJc3RydWN0IGlhdHRyIGF0dHIgPSB7CisJCQkuaWFfdmFsaWQgPSBBVFRSX01PREUsCisJCQkuaWFfbW9kZSA9IHN0YXQubW9kZSwKKwkJfTsKIAogCQlpZiAod29yay0+ZF9pbm9kZSkgewogCQkJZXJyID0gLUVFWElTVDsKQEAgLTgyMSw3ICs4MjUsNyBAQAogCQkJCWdvdG8gb3V0X2RwdXQ7CiAKIAkJCXJldHJpZWQgPSB0cnVlOwotCQkJb3ZsX2NsZWFudXAoZGlyLCB3b3JrKTsKKwkJCW92bF93b3JrZGlyX2NsZWFudXAoZGlyLCBtbnQsIHdvcmssIDApOwogCQkJZHB1dCh3b3JrKTsKIAkJCWdvdG8gcmV0cnk7CiAJCX0KQEAgLTgyOSw2ICs4MzMsMjEgQEAKIAkJZXJyID0gb3ZsX2NyZWF0ZV9yZWFsKGRpciwgd29yaywgJnN0YXQsIE5VTEwsIE5VTEwsIHRydWUpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfZHB1dDsKKworCQllcnIgPSB2ZnNfcmVtb3ZleGF0dHIod29yaywgWEFUVFJfTkFNRV9QT1NJWF9BQ0xfREVGQVVMVCk7CisJCWlmIChlcnIgJiYgZXJyICE9IC1FTk9EQVRBICYmIGVyciAhPSAtRU9QTk9UU1VQUCkKKwkJCWdvdG8gb3V0X2RwdXQ7CisKKwkJZXJyID0gdmZzX3JlbW92ZXhhdHRyKHdvcmssIFhBVFRSX05BTUVfUE9TSVhfQUNMX0FDQ0VTUyk7CisJCWlmIChlcnIgJiYgZXJyICE9IC1FTk9EQVRBICYmIGVyciAhPSAtRU9QTk9UU1VQUCkKKwkJCWdvdG8gb3V0X2RwdXQ7CisKKwkJLyogQ2xlYXIgYW55IGluaGVyaXRlZCBtb2RlIGJpdHMgKi8KKwkJaW5vZGVfbG9jayh3b3JrLT5kX2lub2RlKTsKKwkJZXJyID0gbm90aWZ5X2NoYW5nZSh3b3JrLCAmYXR0ciwgTlVMTCk7CisJCWlub2RlX3VubG9jayh3b3JrLT5kX2lub2RlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2RwdXQ7CiAJfQogb3V0X3VubG9jazoKIAlpbm9kZV91bmxvY2soZGlyKTsKQEAgLTk2NywxMCArOTg2LDE5IEBACiAJcmV0dXJuIGN0cjsKIH0KIAotc3RhdGljIGludCBvdmxfcG9zaXhfYWNsX3hhdHRyX3NldChjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwKLQkJCQkgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCi0JCQkJICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQKK292bF9wb3NpeF9hY2xfeGF0dHJfZ2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gb3ZsX3hhdHRyX2dldChkZW50cnksIGhhbmRsZXItPm5hbWUsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQKK292bF9wb3NpeF9hY2xfeGF0dHJfc2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCisJCQlzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQogewogCXN0cnVjdCBkZW50cnkgKndvcmtkaXIgPSBvdmxfd29ya2RpcihkZW50cnkpOwogCXN0cnVjdCBpbm9kZSAqcmVhbGlub2RlID0gb3ZsX2lub2RlX3JlYWwoaW5vZGUsIE5VTEwpOwpAQCAtOTk4LDE5ICsxMDI2LDIyIEBACiAKIAlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwogCi0JcmV0dXJuIG92bF9zZXR4YXR0cihkZW50cnksIGlub2RlLCBoYW5kbGVyLT5uYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworCWVyciA9IG92bF94YXR0cl9zZXQoZGVudHJ5LCBoYW5kbGVyLT5uYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworCWlmICghZXJyKQorCQlvdmxfY29weWF0dHIob3ZsX2lub2RlX3JlYWwoaW5vZGUsIE5VTEwpLCBpbm9kZSk7CisKKwlyZXR1cm4gZXJyOwogCiBvdXRfYWNsX3JlbGVhc2U6CiAJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG92bF9vdGhlcl94YXR0cl9zZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCi0JCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAotCQkJICAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IG92bF9vd25feGF0dHJfZ2V0KGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyLAorCQkJICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuIG92bF9zZXR4YXR0cihkZW50cnksIGlub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworCXJldHVybiAtRVBFUk07CiB9CiAKIHN0YXRpYyBpbnQgb3ZsX293bl94YXR0cl9zZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCkBAIC0xMDIxLDQyICsxMDUyLDU5IEBACiAJcmV0dXJuIC1FUEVSTTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIG92bF9wb3NpeF9hY2xfYWNjZXNzX3hhdHRyX2hhbmRsZXIgPSB7CitzdGF0aWMgaW50IG92bF9vdGhlcl94YXR0cl9nZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCisJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIG92bF94YXR0cl9nZXQoZGVudHJ5LCBuYW1lLCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50IG92bF9vdGhlcl94YXR0cl9zZXQoY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIsCisJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkJICAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIG92bF94YXR0cl9zZXQoZGVudHJ5LCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgX19tYXliZV91bnVzZWQKK292bF9wb3NpeF9hY2xfYWNjZXNzX3hhdHRyX2hhbmRsZXIgPSB7CiAJLm5hbWUgPSBYQVRUUl9OQU1FX1BPU0lYX0FDTF9BQ0NFU1MsCiAJLmZsYWdzID0gQUNMX1RZUEVfQUNDRVNTLAorCS5nZXQgPSBvdmxfcG9zaXhfYWNsX3hhdHRyX2dldCwKIAkuc2V0ID0gb3ZsX3Bvc2l4X2FjbF94YXR0cl9zZXQsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgb3ZsX3Bvc2l4X2FjbF9kZWZhdWx0X3hhdHRyX2hhbmRsZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgX19tYXliZV91bnVzZWQKK292bF9wb3NpeF9hY2xfZGVmYXVsdF94YXR0cl9oYW5kbGVyID0gewogCS5uYW1lID0gWEFUVFJfTkFNRV9QT1NJWF9BQ0xfREVGQVVMVCwKIAkuZmxhZ3MgPSBBQ0xfVFlQRV9ERUZBVUxULAorCS5nZXQgPSBvdmxfcG9zaXhfYWNsX3hhdHRyX2dldCwKIAkuc2V0ID0gb3ZsX3Bvc2l4X2FjbF94YXR0cl9zZXQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgb3ZsX293bl94YXR0cl9oYW5kbGVyID0gewogCS5wcmVmaXgJPSBPVkxfWEFUVFJfUFJFRklYLAorCS5nZXQgPSBvdmxfb3duX3hhdHRyX2dldCwKIAkuc2V0ID0gb3ZsX293bl94YXR0cl9zZXQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgb3ZsX290aGVyX3hhdHRyX2hhbmRsZXIgPSB7CiAJLnByZWZpeAk9ICIiLCAvKiBjYXRjaCBhbGwgKi8KKwkuZ2V0ID0gb3ZsX290aGVyX3hhdHRyX2dldCwKIAkuc2V0ID0gb3ZsX290aGVyX3hhdHRyX3NldCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqb3ZsX3hhdHRyX2hhbmRsZXJzW10gPSB7CisjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAogCSZvdmxfcG9zaXhfYWNsX2FjY2Vzc194YXR0cl9oYW5kbGVyLAogCSZvdmxfcG9zaXhfYWNsX2RlZmF1bHRfeGF0dHJfaGFuZGxlciwKKyNlbmRpZgogCSZvdmxfb3duX3hhdHRyX2hhbmRsZXIsCiAJJm92bF9vdGhlcl94YXR0cl9oYW5kbGVyLAogCU5VTEwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqb3ZsX3hhdHRyX25vYWNsX2hhbmRsZXJzW10gPSB7Ci0JJm92bF9vd25feGF0dHJfaGFuZGxlciwKLQkmb3ZsX290aGVyX3hhdHRyX2hhbmRsZXIsCi0JTlVMTCwKLX07Ci0KIHN0YXRpYyBpbnQgb3ZsX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKIAlzdHJ1Y3QgcGF0aCB1cHBlcnBhdGggPSB7IE5VTEwsIE5VTEwgfTsKQEAgLTExMzIsNyArMTE4MCw3IEBACiAJZXJyID0gLUVJTlZBTDsKIAlzdGFja2xlbiA9IG92bF9zcGxpdF9sb3dlcmRpcnMobG93ZXJ0bXApOwogCWlmIChzdGFja2xlbiA+IE9WTF9NQVhfU1RBQ0spIHsKLQkJcHJfZXJyKCJvdmVybGF5ZnM6IHRvbyBtYW55IGxvd2VyIGRpcmVjdHJpZXMsIGxpbWl0IGlzICVkXG4iLAorCQlwcl9lcnIoIm92ZXJsYXlmczogdG9vIG1hbnkgbG93ZXIgZGlyZWN0b3JpZXMsIGxpbWl0IGlzICVkXG4iLAogCQkgICAgICAgT1ZMX01BWF9TVEFDSyk7CiAJCWdvdG8gb3V0X2ZyZWVfbG93ZXJ0bXA7CiAJfSBlbHNlIGlmICghdWZzLT5jb25maWcudXBwZXJkaXIgJiYgc3RhY2tsZW4gPT0gMSkgewpAQCAtMTI2OSwxMCArMTMxNyw3IEBACiAKIAlzYi0+c19tYWdpYyA9IE9WRVJMQVlGU19TVVBFUl9NQUdJQzsKIAlzYi0+c19vcCA9ICZvdmxfc3VwZXJfb3BlcmF0aW9uczsKLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfRlNfUE9TSVhfQUNMKSkKLQkJc2ItPnNfeGF0dHIgPSBvdmxfeGF0dHJfaGFuZGxlcnM7Ci0JZWxzZQotCQlzYi0+c194YXR0ciA9IG92bF94YXR0cl9ub2FjbF9oYW5kbGVyczsKKwlzYi0+c194YXR0ciA9IG92bF94YXR0cl9oYW5kbGVyczsKIAlzYi0+c19yb290ID0gcm9vdF9kZW50cnk7CiAJc2ItPnNfZnNfaW5mbyA9IHVmczsKIAlzYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKZGlmZiAtLWdpdCBhL2ZzL3BpcGUuYyBiL2ZzL3BpcGUuYwppbmRleCA0ZWJlNmIyLi40ZmM0MjJmIDEwMDY0NAotLS0gYS9mcy9waXBlLmMKKysrIGIvZnMvcGlwZS5jCkBAIC0yNjcsNyArMjY3LDYgQEAKIAkJaWYgKGJ1ZnMpIHsKIAkJCWludCBjdXJidWYgPSBwaXBlLT5jdXJidWY7CiAJCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiA9IHBpcGUtPmJ1ZnMgKyBjdXJidWY7Ci0JCQljb25zdCBzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyAqb3BzID0gYnVmLT5vcHM7CiAJCQlzaXplX3QgY2hhcnMgPSBidWYtPmxlbjsKIAkJCXNpemVfdCB3cml0dGVuOwogCQkJaW50IGVycm9yOwpAQCAtMjc1LDcgKzI3NCw3IEBACiAJCQlpZiAoY2hhcnMgPiB0b3RhbF9sZW4pCiAJCQkJY2hhcnMgPSB0b3RhbF9sZW47CiAKLQkJCWVycm9yID0gb3BzLT5jb25maXJtKHBpcGUsIGJ1Zik7CisJCQllcnJvciA9IHBpcGVfYnVmX2NvbmZpcm0ocGlwZSwgYnVmKTsKIAkJCWlmIChlcnJvcikgewogCQkJCWlmICghcmV0KQogCQkJCQlyZXQgPSBlcnJvcjsKQEAgLTI5OSw4ICsyOTgsNyBAQAogCQkJfQogCiAJCQlpZiAoIWJ1Zi0+bGVuKSB7Ci0JCQkJYnVmLT5vcHMgPSBOVUxMOwotCQkJCW9wcy0+cmVsZWFzZShwaXBlLCBidWYpOworCQkJCXBpcGVfYnVmX3JlbGVhc2UocGlwZSwgYnVmKTsKIAkJCQljdXJidWYgPSAoY3VyYnVmICsgMSkgJiAocGlwZS0+YnVmZmVycyAtIDEpOwogCQkJCXBpcGUtPmN1cmJ1ZiA9IGN1cmJ1ZjsKIAkJCQlwaXBlLT5ucmJ1ZnMgPSAtLWJ1ZnM7CkBAIC0zODMsMTEgKzM4MSwxMCBAQAogCQlpbnQgbGFzdGJ1ZiA9IChwaXBlLT5jdXJidWYgKyBwaXBlLT5ucmJ1ZnMgLSAxKSAmCiAJCQkJCQkJKHBpcGUtPmJ1ZmZlcnMgLSAxKTsKIAkJc3RydWN0IHBpcGVfYnVmZmVyICpidWYgPSBwaXBlLT5idWZzICsgbGFzdGJ1ZjsKLQkJY29uc3Qgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgKm9wcyA9IGJ1Zi0+b3BzOwogCQlpbnQgb2Zmc2V0ID0gYnVmLT5vZmZzZXQgKyBidWYtPmxlbjsKIAotCQlpZiAob3BzLT5jYW5fbWVyZ2UgJiYgb2Zmc2V0ICsgY2hhcnMgPD0gUEFHRV9TSVpFKSB7Ci0JCQlyZXQgPSBvcHMtPmNvbmZpcm0ocGlwZSwgYnVmKTsKKwkJaWYgKGJ1Zi0+b3BzLT5jYW5fbWVyZ2UgJiYgb2Zmc2V0ICsgY2hhcnMgPD0gUEFHRV9TSVpFKSB7CisJCQlyZXQgPSBwaXBlX2J1Zl9jb25maXJtKHBpcGUsIGJ1Zik7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gb3V0OwogCkBAIC02NjQsNyArNjYxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgcGlwZS0+YnVmZmVyczsgaSsrKSB7CiAJCXN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmID0gcGlwZS0+YnVmcyArIGk7CiAJCWlmIChidWYtPm9wcykKLQkJCWJ1Zi0+b3BzLT5yZWxlYXNlKHBpcGUsIGJ1Zik7CisJCQlwaXBlX2J1Zl9yZWxlYXNlKHBpcGUsIGJ1Zik7CiAJfQogCWlmIChwaXBlLT50bXBfcGFnZSkKIAkJX19mcmVlX3BhZ2UocGlwZS0+dG1wX3BhZ2UpOwpkaWZmIC0tZ2l0IGEvZnMvcG5vZGUuYyBiL2ZzL3Bub2RlLmMKaW5kZXggOTk4OTk3MC4uMjM0YTlhYyAxMDA2NDQKLS0tIGEvZnMvcG5vZGUuYworKysgYi9mcy9wbm9kZS5jCkBAIC0yNTksNyArMjU5LDcgQEAKIAkJcmVhZF9zZXF1bmxvY2tfZXhjbCgmbW91bnRfbG9jayk7CiAJfQogCWhsaXN0X2FkZF9oZWFkKCZjaGlsZC0+bW50X2hhc2gsIGxpc3QpOwotCXJldHVybiAwOworCXJldHVybiBjb3VudF9tb3VudHMobS0+bW50X25zLCBjaGlsZCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9wbm9kZS5oIGIvZnMvcG5vZGUuaAppbmRleCAwZmNkYmU3Li41NTBmNWE4IDEwMDY0NAotLS0gYS9mcy9wbm9kZS5oCisrKyBiL2ZzL3Bub2RlLmgKQEAgLTUyLDQgKzUyLDUgQEAKIHN0cnVjdCBtb3VudCAqY29weV90cmVlKHN0cnVjdCBtb3VudCAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CiBib29sIGlzX3BhdGhfcmVhY2hhYmxlKHN0cnVjdCBtb3VudCAqLCBzdHJ1Y3QgZGVudHJ5ICosCiAJCQkgY29uc3Qgc3RydWN0IHBhdGggKnJvb3QpOworaW50IGNvdW50X21vdW50cyhzdHJ1Y3QgbW50X25hbWVzcGFjZSAqbnMsIHN0cnVjdCBtb3VudCAqbW50KTsKICNlbmRpZiAvKiBfTElOVVhfUE5PREVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9iYXNlLmMgYi9mcy9wcm9jL2Jhc2UuYwppbmRleCA1NGUyNzAyLi4zYjc5MmFiIDEwMDY0NAotLS0gYS9mcy9wcm9jL2Jhc2UuYworKysgYi9mcy9wcm9jL2Jhc2UuYwpAQCAtNDgzLDcgKzQ4Myw3IEBACiAJCXNhdmVfc3RhY2tfdHJhY2VfdHNrKHRhc2ssICZ0cmFjZSk7CiAKIAkJZm9yIChpID0gMDsgaSA8IHRyYWNlLm5yX2VudHJpZXM7IGkrKykgewotCQkJc2VxX3ByaW50ZihtLCAiWzwlcEs+XSAlcFNcbiIsCisJCQlzZXFfcHJpbnRmKG0sICJbPCVwSz5dICVwQlxuIiwKIAkJCQkgICAodm9pZCAqKWVudHJpZXNbaV0sICh2b2lkICopZW50cmllc1tpXSk7CiAJCX0KIAkJdW5sb2NrX3RyYWNlKHRhc2spOwpAQCAtMTU1NiwxOCArMTU1NiwxMyBAQAogc3RhdGljIGludCBwcm9jX2V4ZV9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhdGggKmV4ZV9wYXRoKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKIAlzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGU7CiAKIAl0YXNrID0gZ2V0X3Byb2NfdGFzayhkX2lub2RlKGRlbnRyeSkpOwogCWlmICghdGFzaykKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKKwlleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRhc2spOwogCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKLQlpZiAoIW1tKQotCQlyZXR1cm4gLUVOT0VOVDsKLQlleGVfZmlsZSA9IGdldF9tbV9leGVfZmlsZShtbSk7Ci0JbW1wdXQobW0pOwogCWlmIChleGVfZmlsZSkgewogCQkqZXhlX3BhdGggPSBleGVfZmlsZS0+Zl9wYXRoOwogCQlwYXRoX2dldCgmZXhlX2ZpbGUtPmZfcGF0aCk7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2dlbmVyaWMuYyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCmluZGV4IGM2MzM0NzYuLmJjYTY2ZDggMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvZ2VuZXJpYy5jCisrKyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCkBAIC0zOTAsNiArMzkwLDggQEAKIAlhdG9taWNfc2V0KCZlbnQtPmNvdW50LCAxKTsKIAlzcGluX2xvY2tfaW5pdCgmZW50LT5wZGVfdW5sb2FkX2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZlbnQtPnBkZV9vcGVuZXJzKTsKKwlwcm9jX3NldF91c2VyKGVudCwgKCpwYXJlbnQpLT51aWQsICgqcGFyZW50KS0+Z2lkKTsKKwogb3V0OgogCXJldHVybiBlbnQ7CiB9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2tjb3JlLmMgYi9mcy9wcm9jL2tjb3JlLmMKaW5kZXggYTkzOWY1ZS4uNWM4OWEwNyAxMDA2NDQKLS0tIGEvZnMvcHJvYy9rY29yZS5jCisrKyBiL2ZzL3Byb2Mva2NvcmUuYwpAQCAtNDMwLDYgKzQzMCw3IEBACiBzdGF0aWMgc3NpemVfdAogcmVhZF9rY29yZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbiwgbG9mZl90ICpmcG9zKQogeworCWNoYXIgKmJ1ZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzc2l6ZV90IGFjYyA9IDA7CiAJc2l6ZV90IHNpemUsIHRzejsKIAlzaXplX3QgZWxmX2J1ZmxlbjsKQEAgLTUwMCwyMyArNTAxLDIwIEBACiAJCQlpZiAoY2xlYXJfdXNlcihidWZmZXIsIHRzeikpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0gZWxzZSBpZiAoaXNfdm1hbGxvY19vcl9tb2R1bGVfYWRkcigodm9pZCAqKXN0YXJ0KSkgewotCQkJY2hhciAqIGVsZl9idWY7Ci0KLQkJCWVsZl9idWYgPSBremFsbG9jKHRzeiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIWVsZl9idWYpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl2cmVhZChlbGZfYnVmLCAoY2hhciAqKXN0YXJ0LCB0c3opOworCQkJdnJlYWQoYnVmLCAoY2hhciAqKXN0YXJ0LCB0c3opOwogCQkJLyogd2UgaGF2ZSB0byB6ZXJvLWZpbGwgdXNlciBidWZmZXIgZXZlbiBpZiBubyByZWFkICovCi0JCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZWxmX2J1ZiwgdHN6KSkgewotCQkJCWtmcmVlKGVsZl9idWYpOworCQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGJ1ZiwgdHN6KSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCWtmcmVlKGVsZl9idWYpOwogCQl9IGVsc2UgewogCQkJaWYgKGtlcm5fYWRkcl92YWxpZChzdGFydCkpIHsKIAkJCQl1bnNpZ25lZCBsb25nIG47CiAKLQkJCQluID0gY29weV90b191c2VyKGJ1ZmZlciwgKGNoYXIgKilzdGFydCwgdHN6KTsKKwkJCQkvKgorCQkJCSAqIFVzaW5nIGJvdW5jZSBidWZmZXIgdG8gYnlwYXNzIHRoZQorCQkJCSAqIGhhcmRlbmVkIHVzZXIgY29weSBrZXJuZWwgdGV4dCBjaGVja3MuCisJCQkJICovCisJCQkJbWVtY3B5KGJ1ZiwgKGNoYXIgKikgc3RhcnQsIHRzeik7CisJCQkJbiA9IGNvcHlfdG9fdXNlcihidWZmZXIsIGJ1ZiwgdHN6KTsKIAkJCQkvKgogCQkJCSAqIFdlIGNhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGZhdWx0IG9uIHNvdXJjZQogCQkJCSAqIGFuZCBmYXVsdCBvbiBkZXN0aW5hdGlvbi4gV2hlbiB0aGlzIGhhcHBlbnMKQEAgLTU0OSw2ICs1NDcsMTEgQEAKIHsKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCiAJCXJldHVybiAtRVBFUk07CisKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaWxwLT5wcml2YXRlX2RhdGEpCisJCXJldHVybiAtRU5PTUVNOworCiAJaWYgKGtjb3JlX25lZWRfdXBkYXRlKQogCQlrY29yZV91cGRhdGVfcmFtKCk7CiAJaWYgKGlfc2l6ZV9yZWFkKGlub2RlKSAhPSBwcm9jX3Jvb3Rfa2NvcmUtPnNpemUpIHsKQEAgLTU1OSwxMCArNTYyLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcmVsZWFzZV9rY29yZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlrZnJlZShmaWxlLT5wcml2YXRlX2RhdGEpOworCXJldHVybiAwOworfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2tjb3JlX29wZXJhdGlvbnMgPSB7CiAJLnJlYWQJCT0gcmVhZF9rY29yZSwKIAkub3BlbgkJPSBvcGVuX2tjb3JlLAorCS5yZWxlYXNlCT0gcmVsZWFzZV9rY29yZSwKIAkubGxzZWVrCQk9IGRlZmF1bHRfbGxzZWVrLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX25ldC5jIGIvZnMvcHJvYy9wcm9jX25ldC5jCmluZGV4IGM4YmJjNjguLjdhZTZiMWQgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvcHJvY19uZXQuYworKysgYi9mcy9wcm9jL3Byb2NfbmV0LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25zcHJveHkuaD4KKyNpbmNsdWRlIDxsaW51eC91aWRnaWQuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKQEAgLTE4NSw2ICsxODYsOCBAQAogc3RhdGljIF9fbmV0X2luaXQgaW50IHByb2NfbmV0X25zX2luaXQoc3RydWN0IG5ldCAqbmV0KQogewogCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqbmV0ZCwgKm5ldF9zdGF0ZDsKKwlrdWlkX3QgdWlkOworCWtnaWRfdCBnaWQ7CiAJaW50IGVycjsKIAogCWVyciA9IC1FTk9NRU07CkBAIC0xOTksNiArMjAyLDE2IEBACiAJbmV0ZC0+cGFyZW50ID0gJnByb2Nfcm9vdDsKIAltZW1jcHkobmV0ZC0+bmFtZSwgIm5ldCIsIDQpOwogCisJdWlkID0gbWFrZV9rdWlkKG5ldC0+dXNlcl9ucywgMCk7CisJaWYgKCF1aWRfdmFsaWQodWlkKSkKKwkJdWlkID0gbmV0ZC0+dWlkOworCisJZ2lkID0gbWFrZV9rZ2lkKG5ldC0+dXNlcl9ucywgMCk7CisJaWYgKCFnaWRfdmFsaWQoZ2lkKSkKKwkJZ2lkID0gbmV0ZC0+Z2lkOworCisJcHJvY19zZXRfdXNlcihuZXRkLCB1aWQsIGdpZCk7CisKIAllcnIgPSAtRUVYSVNUOwogCW5ldF9zdGF0ZCA9IHByb2NfbmV0X21rZGlyKG5ldCwgInN0YXQiLCBuZXRkKTsKIAlpZiAoIW5ldF9zdGF0ZCkKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19zeXNjdGwuYyBiL2ZzL3Byb2MvcHJvY19zeXNjdGwuYwppbmRleCAxYjkzNjUwLi43MTAyNWI5IDEwMDY0NAotLS0gYS9mcy9wcm9jL3Byb2Nfc3lzY3RsLmMKKysrIGIvZnMvcHJvYy9wcm9jX3N5c2N0bC5jCkBAIC03Miw3ICs3Miw3IEBACiAKIHN0YXRpYyB2b2lkIGRyb3Bfc3lzY3RsX3RhYmxlKHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZWFkZXIpOwogc3RhdGljIGludCBzeXNjdGxfZm9sbG93X2xpbmsoc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKipwaGVhZCwKLQlzdHJ1Y3QgY3RsX3RhYmxlICoqcGVudHJ5LCBzdHJ1Y3QgbnNwcm94eSAqbmFtZXNwYWNlcyk7CisJc3RydWN0IGN0bF90YWJsZSAqKnBlbnRyeSk7CiBzdGF0aWMgaW50IGluc2VydF9saW5rcyhzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZCk7CiBzdGF0aWMgdm9pZCBwdXRfbGlua3Moc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhlYWRlcik7CiAKQEAgLTMxOSwxMSArMzE5LDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX3NldCAqCi1sb29rdXBfaGVhZGVyX3NldChzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3QgKnJvb3QsIHN0cnVjdCBuc3Byb3h5ICpuYW1lc3BhY2VzKQorbG9va3VwX2hlYWRlcl9zZXQoc3RydWN0IGN0bF90YWJsZV9yb290ICpyb290KQogewogCXN0cnVjdCBjdGxfdGFibGVfc2V0ICpzZXQgPSAmcm9vdC0+ZGVmYXVsdF9zZXQ7CiAJaWYgKHJvb3QtPmxvb2t1cCkKLQkJc2V0ID0gcm9vdC0+bG9va3VwKHJvb3QsIG5hbWVzcGFjZXMpOworCQlzZXQgPSByb290LT5sb29rdXAocm9vdCk7CiAJcmV0dXJuIHNldDsKIH0KIApAQCAtNDMwLDYgKzQzMCw3IEBACiBzdGF0aWMgc3RydWN0IGlub2RlICpwcm9jX3N5c19tYWtlX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZWFkLCBzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSkKIHsKKwlzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3QgKnJvb3QgPSBoZWFkLT5yb290OwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IHByb2NfaW5vZGUgKmVpOwogCkBAIC00NTcsNiArNDU4LDEwIEBACiAJCWlmIChpc19lbXB0eV9kaXIoaGVhZCkpCiAJCQltYWtlX2VtcHR5X2Rpcl9pbm9kZShpbm9kZSk7CiAJfQorCisJaWYgKHJvb3QtPnNldF9vd25lcnNoaXApCisJCXJvb3QtPnNldF9vd25lcnNoaXAoaGVhZCwgdGFibGUsICZpbm9kZS0+aV91aWQsICZpbm9kZS0+aV9naWQpOworCiBvdXQ6CiAJcmV0dXJuIGlub2RlOwogfQpAQCAtNDkxLDcgKzQ5Niw3IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKFNfSVNMTksocC0+bW9kZSkpIHsKLQkJcmV0ID0gc3lzY3RsX2ZvbGxvd19saW5rKCZoLCAmcCwgY3VycmVudC0+bnNwcm94eSk7CisJCXJldCA9IHN5c2N0bF9mb2xsb3dfbGluaygmaCwgJnApOwogCQllcnIgPSBFUlJfUFRSKHJldCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKQEAgLTY1OSw3ICs2NjQsNyBAQAogCiAJaWYgKFNfSVNMTksodGFibGUtPm1vZGUpKSB7CiAJCS8qIEl0IGlzIG5vdCBhbiBlcnJvciBpZiB3ZSBjYW4gbm90IGZvbGxvdyB0aGUgbGluayBpZ25vcmUgaXQgKi8KLQkJaW50IGVyciA9IHN5c2N0bF9mb2xsb3dfbGluaygmaGVhZCwgJnRhYmxlLCBjdXJyZW50LT5uc3Byb3h5KTsKKwkJaW50IGVyciA9IHN5c2N0bF9mb2xsb3dfbGluaygmaGVhZCwgJnRhYmxlKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwogCX0KQEAgLTk3Niw3ICs5ODEsNyBAQAogfQogCiBzdGF0aWMgaW50IHN5c2N0bF9mb2xsb3dfbGluayhzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqKnBoZWFkLAotCXN0cnVjdCBjdGxfdGFibGUgKipwZW50cnksIHN0cnVjdCBuc3Byb3h5ICpuYW1lc3BhY2VzKQorCXN0cnVjdCBjdGxfdGFibGUgKipwZW50cnkpCiB7CiAJc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhlYWQ7CiAJc3RydWN0IGN0bF90YWJsZV9yb290ICpyb290OwpAQCAtOTg4LDcgKzk5Myw3IEBACiAJcmV0ID0gMDsKIAlzcGluX2xvY2soJnN5c2N0bF9sb2NrKTsKIAlyb290ID0gKCpwZW50cnkpLT5kYXRhOwotCXNldCA9IGxvb2t1cF9oZWFkZXJfc2V0KHJvb3QsIG5hbWVzcGFjZXMpOworCXNldCA9IGxvb2t1cF9oZWFkZXJfc2V0KHJvb3QpOwogCWRpciA9IHhsYXRlX2RpcihzZXQsICgqcGhlYWQpLT5wYXJlbnQpOwogCWlmIChJU19FUlIoZGlyKSkKIAkJcmV0ID0gUFRSX0VSUihkaXIpOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy90YXNrX21tdS5jIGIvZnMvcHJvYy90YXNrX21tdS5jCmluZGV4IDE4N2Q4NGUuLmY2ZmE5OWUgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvdGFza19tbXUuYworKysgYi9mcy9wcm9jL3Rhc2tfbW11LmMKQEAgLTU4MSw2ICs1ODEsOCBAQAogCQltc3MtPmFub255bW91c190aHAgKz0gSFBBR0VfUE1EX1NJWkU7CiAJZWxzZSBpZiAoUGFnZVN3YXBCYWNrZWQocGFnZSkpCiAJCW1zcy0+c2htZW1fdGhwICs9IEhQQUdFX1BNRF9TSVpFOworCWVsc2UgaWYgKGlzX3pvbmVfZGV2aWNlX3BhZ2UocGFnZSkpCisJCS8qIHBhc3MgKi87CiAJZWxzZQogCQlWTV9CVUdfT05fUEFHRSgxLCBwYWdlKTsKIAlzbWFwc19hY2NvdW50KG1zcywgcGFnZSwgdHJ1ZSwgcG1kX3lvdW5nKCpwbWQpLCBwbWRfZGlydHkoKnBtZCkpOwpkaWZmIC0tZ2l0IGEvZnMvcHN0b3JlL3BsYXRmb3JtLmMgYi9mcy9wc3RvcmUvcGxhdGZvcm0uYwppbmRleCAxNmVjY2E1Li4xNDk4NGQ5IDEwMDY0NAotLS0gYS9mcy9wc3RvcmUvcGxhdGZvcm0uYworKysgYi9mcy9wc3RvcmUvcGxhdGZvcm0uYwpAQCAtNjIzLDYgKzYyMyw0MCBAQAogCQkJICAgICBzaXplLCBwc2kpOwogfQogCitzdGF0aWMgaW50IHBzdG9yZV93cml0ZV9idWZfdXNlcl9jb21wYXQoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLAorCQkJICAgICAgIGVudW0ga21zZ19kdW1wX3JlYXNvbiByZWFzb24sCisJCQkgICAgICAgdTY0ICppZCwgdW5zaWduZWQgaW50IHBhcnQsCisJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgICBib29sIGNvbXByZXNzZWQsIHNpemVfdCBzaXplLAorCQkJICAgICAgIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCXNpemVfdCBpLCBidWZzaXplID0gc2l6ZTsKKwlsb25nIHJldCA9IDA7CisKKwlpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBzaXplKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChidWZzaXplID4gcHNpbmZvLT5idWZzaXplKQorCQlidWZzaXplID0gcHNpbmZvLT5idWZzaXplOworCXNwaW5fbG9ja19pcnFzYXZlKCZwc2luZm8tPmJ1Zl9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IHNpemU7ICkgeworCQlzaXplX3QgYyA9IG1pbihzaXplIC0gaSwgYnVmc2l6ZSk7CisKKwkJcmV0ID0gX19jb3B5X2Zyb21fdXNlcihwc2luZm8tPmJ1ZiwgYnVmICsgaSwgYyk7CisJCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBwc2ktPndyaXRlX2J1Zih0eXBlLCByZWFzb24sIGlkLCBwYXJ0LCBwc2luZm8tPmJ1ZiwKKwkJCQkgICAgIGNvbXByZXNzZWQsIGMsIHBzaSk7CisJCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJCWJyZWFrOworCQlpICs9IGM7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaW5mby0+YnVmX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gdW5saWtlbHkocmV0IDwgMCkgPyByZXQgOiBzaXplOworfQorCiAvKgogICogcGxhdGZvcm0gc3BlY2lmaWMgcGVyc2lzdGVudCBzdG9yYWdlIGRyaXZlciByZWdpc3RlcnMgd2l0aAogICogdXMgaGVyZS4gSWYgcHN0b3JlIGlzIGFscmVhZHkgbW91bnRlZCwgY2FsbCB0aGUgcGxhdGZvcm0KQEAgLTY0NSw2ICs2NzksOCBAQAogCiAJaWYgKCFwc2ktPndyaXRlKQogCQlwc2ktPndyaXRlID0gcHN0b3JlX3dyaXRlX2NvbXBhdDsKKwlpZiAoIXBzaS0+d3JpdGVfYnVmX3VzZXIpCisJCXBzaS0+d3JpdGVfYnVmX3VzZXIgPSBwc3RvcmVfd3JpdGVfYnVmX3VzZXJfY29tcGF0OwogCXBzaW5mbyA9IHBzaTsKIAltdXRleF9pbml0KCZwc2luZm8tPnJlYWRfbXV0ZXgpOwogCXNwaW5fdW5sb2NrKCZwc3RvcmVfbG9jayk7CkBAIC02NTksMTMgKzY5NSwxNCBAQAogCWlmIChwc3RvcmVfaXNfbW91bnRlZCgpKQogCQlwc3RvcmVfZ2V0X3JlY29yZHMoMCk7CiAKLQlwc3RvcmVfcmVnaXN0ZXJfa21zZygpOwotCi0JaWYgKChwc2ktPmZsYWdzICYgUFNUT1JFX0ZMQUdTX0ZSQUdJTEUpID09IDApIHsKKwlpZiAocHNpLT5mbGFncyAmIFBTVE9SRV9GTEFHU19ETUVTRykKKwkJcHN0b3JlX3JlZ2lzdGVyX2ttc2coKTsKKwlpZiAocHNpLT5mbGFncyAmIFBTVE9SRV9GTEFHU19DT05TT0xFKQogCQlwc3RvcmVfcmVnaXN0ZXJfY29uc29sZSgpOworCWlmIChwc2ktPmZsYWdzICYgUFNUT1JFX0ZMQUdTX0ZUUkFDRSkKIAkJcHN0b3JlX3JlZ2lzdGVyX2Z0cmFjZSgpOworCWlmIChwc2ktPmZsYWdzICYgUFNUT1JFX0ZMQUdTX1BNU0cpCiAJCXBzdG9yZV9yZWdpc3Rlcl9wbXNnKCk7Ci0JfQogCiAJaWYgKHBzdG9yZV91cGRhdGVfbXMgPj0gMCkgewogCQlwc3RvcmVfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKwpAQCAtNjg5LDEyICs3MjYsMTQgQEAKIAogdm9pZCBwc3RvcmVfdW5yZWdpc3RlcihzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKIHsKLQlpZiAoKHBzaS0+ZmxhZ3MgJiBQU1RPUkVfRkxBR1NfRlJBR0lMRSkgPT0gMCkgeworCWlmIChwc2ktPmZsYWdzICYgUFNUT1JFX0ZMQUdTX1BNU0cpCiAJCXBzdG9yZV91bnJlZ2lzdGVyX3Btc2coKTsKKwlpZiAocHNpLT5mbGFncyAmIFBTVE9SRV9GTEFHU19GVFJBQ0UpCiAJCXBzdG9yZV91bnJlZ2lzdGVyX2Z0cmFjZSgpOworCWlmIChwc2ktPmZsYWdzICYgUFNUT1JFX0ZMQUdTX0NPTlNPTEUpCiAJCXBzdG9yZV91bnJlZ2lzdGVyX2NvbnNvbGUoKTsKLQl9Ci0JcHN0b3JlX3VucmVnaXN0ZXJfa21zZygpOworCWlmIChwc2ktPmZsYWdzICYgUFNUT1JFX0ZMQUdTX0RNRVNHKQorCQlwc3RvcmVfdW5yZWdpc3Rlcl9rbXNnKCk7CiAKIAlmcmVlX2J1Zl9mb3JfY29tcHJlc3Npb24oKTsKIApkaWZmIC0tZ2l0IGEvZnMvcHN0b3JlL3Btc2cuYyBiL2ZzL3BzdG9yZS9wbXNnLmMKaW5kZXggN2RlMjBjZC4uNzhmNjE3NiAxMDA2NDQKLS0tIGEvZnMvcHN0b3JlL3Btc2cuYworKysgYi9mcy9wc3RvcmUvcG1zZy5jCkBAIC0xOSw0OCArMTksMjUgQEAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBzdGF0aWMgREVGSU5FX01VVEVYKHBtc2dfbG9jayk7Ci0jZGVmaW5lIFBNU0dfTUFYX0JPVU5DRV9CVUZGRVJfU0laRSAoMipQQUdFX1NJWkUpCiAKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX3Btc2coc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCiAJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXNpemVfdCBpLCBidWZmZXJfc2l6ZTsKLQljaGFyICpidWZmZXI7CisJdTY0IGlkOworCWludCByZXQ7CiAKIAlpZiAoIWNvdW50KQogCQlyZXR1cm4gMDsKIAorCS8qIGNoZWNrIG91dHNpZGUgbG9jaywgcGFnZSBpbiBhbnkgZGF0YS4gd3JpdGVfYnVmX3VzZXIgYWxzbyBjaGVja3MgKi8KIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JYnVmZmVyX3NpemUgPSBjb3VudDsKLQlpZiAoYnVmZmVyX3NpemUgPiBQTVNHX01BWF9CT1VOQ0VfQlVGRkVSX1NJWkUpCi0JCWJ1ZmZlcl9zaXplID0gUE1TR19NQVhfQk9VTkNFX0JVRkZFUl9TSVpFOwotCWJ1ZmZlciA9IHZtYWxsb2MoYnVmZmVyX3NpemUpOwotCWlmICghYnVmZmVyKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCW11dGV4X2xvY2soJnBtc2dfbG9jayk7Ci0JZm9yIChpID0gMDsgaSA8IGNvdW50OyApIHsKLQkJc2l6ZV90IGMgPSBtaW4oY291bnQgLSBpLCBidWZmZXJfc2l6ZSk7Ci0JCXU2NCBpZDsKLQkJbG9uZyByZXQ7Ci0KLQkJcmV0ID0gX19jb3B5X2Zyb21fdXNlcihidWZmZXIsIGJ1ZiArIGksIGMpOwotCQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7Ci0JCQltdXRleF91bmxvY2soJnBtc2dfbG9jayk7Ci0JCQl2ZnJlZShidWZmZXIpOwotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJcHNpbmZvLT53cml0ZV9idWYoUFNUT1JFX1RZUEVfUE1TRywgMCwgJmlkLCAwLCBidWZmZXIsIDAsIGMsCi0JCQkJICBwc2luZm8pOwotCi0JCWkgKz0gYzsKLQl9Ci0KKwlyZXQgPSBwc2luZm8tPndyaXRlX2J1Zl91c2VyKFBTVE9SRV9UWVBFX1BNU0csIDAsICZpZCwgMCwgYnVmLCAwLCBjb3VudCwKKwkJCQkgICAgIHBzaW5mbyk7CiAJbXV0ZXhfdW5sb2NrKCZwbXNnX2xvY2spOwotCXZmcmVlKGJ1ZmZlcik7Ci0JcmV0dXJuIGNvdW50OworCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcG1zZ19mb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMvcHN0b3JlL3JhbS5jIGIvZnMvcHN0b3JlL3JhbS5jCmluZGV4IDdhMDM0ZDYuLjZhZDgzMWIgMTAwNjQ0Ci0tLSBhL2ZzL3BzdG9yZS9yYW0uYworKysgYi9mcy9wc3RvcmUvcmFtLmMKQEAgLTMzMSw2ICszMzEsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBub3RyYWNlIHJhbW9vcHNfcHN0b3JlX3dyaXRlX2J1Zl91c2VyKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwKKwkJCQkJCSBlbnVtIGttc2dfZHVtcF9yZWFzb24gcmVhc29uLAorCQkJCQkJIHU2NCAqaWQsIHVuc2lnbmVkIGludCBwYXJ0LAorCQkJCQkJIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJCQkgYm9vbCBjb21wcmVzc2VkLCBzaXplX3Qgc2l6ZSwKKwkJCQkJCSBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwlpZiAodHlwZSA9PSBQU1RPUkVfVFlQRV9QTVNHKSB7CisJCXN0cnVjdCByYW1vb3BzX2NvbnRleHQgKmN4dCA9IHBzaS0+ZGF0YTsKKworCQlpZiAoIWN4dC0+bXByeikKKwkJCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gcGVyc2lzdGVudF9yYW1fd3JpdGVfdXNlcihjeHQtPm1wcnosIGJ1Ziwgc2l6ZSk7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKIHN0YXRpYyBpbnQgcmFtb29wc19wc3RvcmVfZXJhc2UoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgaWQsIGludCBjb3VudCwKIAkJCQlzdHJ1Y3QgdGltZXNwZWMgdGltZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCiB7CkBAIC0zNjksNiArMzg3LDcgQEAKIAkJLm9wZW4JPSByYW1vb3BzX3BzdG9yZV9vcGVuLAogCQkucmVhZAk9IHJhbW9vcHNfcHN0b3JlX3JlYWQsCiAJCS53cml0ZV9idWYJPSByYW1vb3BzX3BzdG9yZV93cml0ZV9idWYsCisJCS53cml0ZV9idWZfdXNlcgk9IHJhbW9vcHNfcHN0b3JlX3dyaXRlX2J1Zl91c2VyLAogCQkuZXJhc2UJPSByYW1vb3BzX3BzdG9yZV9lcmFzZSwKIAl9LAogfTsKQEAgLTM3NywxMyArMzk2LDE0IEBACiB7CiAJaW50IGk7CiAKLQljeHQtPm1heF9kdW1wX2NudCA9IDA7CiAJaWYgKCFjeHQtPnByenMpCiAJCXJldHVybjsKIAotCWZvciAoaSA9IDA7ICFJU19FUlJfT1JfTlVMTChjeHQtPnByenNbaV0pOyBpKyspCisJZm9yIChpID0gMDsgaSA8IGN4dC0+bWF4X2R1bXBfY250OyBpKyspCiAJCXBlcnNpc3RlbnRfcmFtX2ZyZWUoY3h0LT5wcnpzW2ldKTsKKwogCWtmcmVlKGN4dC0+cHJ6cyk7CisJY3h0LT5tYXhfZHVtcF9jbnQgPSAwOwogfQogCiBzdGF0aWMgaW50IHJhbW9vcHNfaW5pdF9wcnpzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJhbW9vcHNfY29udGV4dCAqY3h0LApAQCAtNDA4LDcgKzQyOCw3IEBACiAJCQkgICAgIEdGUF9LRVJORUwpOwogCWlmICghY3h0LT5wcnpzKSB7CiAJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgYSBwcnogYXJyYXkgZm9yIGR1bXBzXG4iKTsKLQkJZ290byBmYWlsX3ByejsKKwkJZ290byBmYWlsX21lbTsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgY3h0LT5tYXhfZHVtcF9jbnQ7IGkrKykgewpAQCAtNDE5LDYgKzQzOSwxMSBAQAogCQkJZXJyID0gUFRSX0VSUihjeHQtPnByenNbaV0pOwogCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBtZW0gcmVnaW9uICgweCV6eEAweCVsbHgpOiAlZFxuIiwKIAkJCQljeHQtPnJlY29yZF9zaXplLCAodW5zaWduZWQgbG9uZyBsb25nKSpwYWRkciwgZXJyKTsKKworCQkJd2hpbGUgKGkgPiAwKSB7CisJCQkJaS0tOworCQkJCXBlcnNpc3RlbnRfcmFtX2ZyZWUoY3h0LT5wcnpzW2ldKTsKKwkJCX0KIAkJCWdvdG8gZmFpbF9wcno7CiAJCX0KIAkJKnBhZGRyICs9IGN4dC0+cmVjb3JkX3NpemU7CkBAIC00MjYsNyArNDUxLDkgQEAKIAogCXJldHVybiAwOwogZmFpbF9wcno6Ci0JcmFtb29wc19mcmVlX3ByenMoY3h0KTsKKwlrZnJlZShjeHQtPnByenMpOworZmFpbF9tZW06CisJY3h0LT5tYXhfZHVtcF9jbnQgPSAwOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTYwOCwxMiArNjM1LDIwIEBACiAJCWN4dC0+cHN0b3JlLmJ1ZnNpemUgPSAxMDI0OyAvKiBMT0dfTElORV9NQVggKi8KIAljeHQtPnBzdG9yZS5idWZzaXplID0gbWF4KGN4dC0+cmVjb3JkX3NpemUsIGN4dC0+cHN0b3JlLmJ1ZnNpemUpOwogCWN4dC0+cHN0b3JlLmJ1ZiA9IGttYWxsb2MoY3h0LT5wc3RvcmUuYnVmc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmN4dC0+cHN0b3JlLmJ1Zl9sb2NrKTsKIAlpZiAoIWN4dC0+cHN0b3JlLmJ1ZikgewogCQlwcl9lcnIoImNhbm5vdCBhbGxvY2F0ZSBwc3RvcmUgYnVmZmVyXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsX2NsZWFyOwogCX0KKwlzcGluX2xvY2tfaW5pdCgmY3h0LT5wc3RvcmUuYnVmX2xvY2spOworCisJY3h0LT5wc3RvcmUuZmxhZ3MgPSBQU1RPUkVfRkxBR1NfRE1FU0c7CisJaWYgKGN4dC0+Y29uc29sZV9zaXplKQorCQljeHQtPnBzdG9yZS5mbGFncyB8PSBQU1RPUkVfRkxBR1NfQ09OU09MRTsKKwlpZiAoY3h0LT5mdHJhY2Vfc2l6ZSkKKwkJY3h0LT5wc3RvcmUuZmxhZ3MgfD0gUFNUT1JFX0ZMQUdTX0ZUUkFDRTsKKwlpZiAoY3h0LT5wbXNnX3NpemUpCisJCWN4dC0+cHN0b3JlLmZsYWdzIHw9IFBTVE9SRV9GTEFHU19QTVNHOwogCiAJZXJyID0gcHN0b3JlX3JlZ2lzdGVyKCZjeHQtPnBzdG9yZSk7CiAJaWYgKGVycikgewpAQCAtNjU5LDcgKzY5NCw2IEBACiAJc3RydWN0IHJhbW9vcHNfY29udGV4dCAqY3h0ID0gJm9vcHNfY3h0OwogCiAJcHN0b3JlX3VucmVnaXN0ZXIoJmN4dC0+cHN0b3JlKTsKLQljeHQtPm1heF9kdW1wX2NudCA9IDA7CiAKIAlrZnJlZShjeHQtPnBzdG9yZS5idWYpOwogCWN4dC0+cHN0b3JlLmJ1ZnNpemUgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvcHN0b3JlL3JhbV9jb3JlLmMgYi9mcy9wc3RvcmUvcmFtX2NvcmUuYwppbmRleCA3NmMzZjgwLi4zOTc1ZGVlIDEwMDY0NAotLS0gYS9mcy9wc3RvcmUvcmFtX2NvcmUuYworKysgYi9mcy9wc3RvcmUvcmFtX2NvcmUuYwpAQCAtMTcsMTUgKzE3LDE2IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wc3RvcmVfcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvcnNsaWIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9wc3RvcmVfcmFtLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogc3RydWN0IHBlcnNpc3RlbnRfcmFtX2J1ZmZlciB7CkBAIC00Nyw0MyArNDgsMTAgQEAKIAlyZXR1cm4gYXRvbWljX3JlYWQoJnByei0+YnVmZmVyLT5zdGFydCk7CiB9CiAKLS8qIGluY3JlYXNlIGFuZCB3cmFwIHRoZSBzdGFydCBwb2ludGVyLCByZXR1cm5pbmcgdGhlIG9sZCB2YWx1ZSAqLwotc3RhdGljIHNpemVfdCBidWZmZXJfc3RhcnRfYWRkX2F0b21pYyhzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6LCBzaXplX3QgYSkKLXsKLQlpbnQgb2xkOwotCWludCBuZXc7Ci0KLQlkbyB7Ci0JCW9sZCA9IGF0b21pY19yZWFkKCZwcnotPmJ1ZmZlci0+c3RhcnQpOwotCQluZXcgPSBvbGQgKyBhOwotCQl3aGlsZSAodW5saWtlbHkobmV3ID49IHByei0+YnVmZmVyX3NpemUpKQotCQkJbmV3IC09IHByei0+YnVmZmVyX3NpemU7Ci0JfSB3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnByei0+YnVmZmVyLT5zdGFydCwgb2xkLCBuZXcpICE9IG9sZCk7Ci0KLQlyZXR1cm4gb2xkOwotfQotCi0vKiBpbmNyZWFzZSB0aGUgc2l6ZSBjb3VudGVyIHVudGlsIGl0IGhpdHMgdGhlIG1heCBzaXplICovCi1zdGF0aWMgdm9pZCBidWZmZXJfc2l6ZV9hZGRfYXRvbWljKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcnosIHNpemVfdCBhKQotewotCXNpemVfdCBvbGQ7Ci0Jc2l6ZV90IG5ldzsKLQotCWlmIChhdG9taWNfcmVhZCgmcHJ6LT5idWZmZXItPnNpemUpID09IHByei0+YnVmZmVyX3NpemUpCi0JCXJldHVybjsKLQotCWRvIHsKLQkJb2xkID0gYXRvbWljX3JlYWQoJnByei0+YnVmZmVyLT5zaXplKTsKLQkJbmV3ID0gb2xkICsgYTsKLQkJaWYgKG5ldyA+IHByei0+YnVmZmVyX3NpemUpCi0JCQluZXcgPSBwcnotPmJ1ZmZlcl9zaXplOwotCX0gd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZwcnotPmJ1ZmZlci0+c2l6ZSwgb2xkLCBuZXcpICE9IG9sZCk7Ci19Ci0KIHN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGJ1ZmZlcl9sb2NrKTsKIAogLyogaW5jcmVhc2UgYW5kIHdyYXAgdGhlIHN0YXJ0IHBvaW50ZXIsIHJldHVybmluZyB0aGUgb2xkIHZhbHVlICovCi1zdGF0aWMgc2l6ZV90IGJ1ZmZlcl9zdGFydF9hZGRfbG9ja2VkKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcnosIHNpemVfdCBhKQorc3RhdGljIHNpemVfdCBidWZmZXJfc3RhcnRfYWRkKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcnosIHNpemVfdCBhKQogewogCWludCBvbGQ7CiAJaW50IG5ldzsKQEAgLTEwMyw3ICs3MSw3IEBACiB9CiAKIC8qIGluY3JlYXNlIHRoZSBzaXplIGNvdW50ZXIgdW50aWwgaXQgaGl0cyB0aGUgbWF4IHNpemUgKi8KLXN0YXRpYyB2b2lkIGJ1ZmZlcl9zaXplX2FkZF9sb2NrZWQoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeiwgc2l6ZV90IGEpCitzdGF0aWMgdm9pZCBidWZmZXJfc2l6ZV9hZGQoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeiwgc2l6ZV90IGEpCiB7CiAJc2l6ZV90IG9sZDsKIAlzaXplX3QgbmV3OwpAQCAtMTI0LDkgKzkyLDYgQEAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnVmZmVyX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHNpemVfdCAoKmJ1ZmZlcl9zdGFydF9hZGQpKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICosIHNpemVfdCkgPSBidWZmZXJfc3RhcnRfYWRkX2F0b21pYzsKLXN0YXRpYyB2b2lkICgqYnVmZmVyX3NpemVfYWRkKShzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqLCBzaXplX3QpID0gYnVmZmVyX3NpemVfYWRkX2F0b21pYzsKLQogc3RhdGljIHZvaWQgbm90cmFjZSBwZXJzaXN0ZW50X3JhbV9lbmNvZGVfcnM4KHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcnosCiAJdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbiwgdWludDhfdCAqZWNjKQogewpAQCAtMjk5LDEwICsyNjQsMjAgQEAKIAljb25zdCB2b2lkICpzLCB1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fYnVmZmVyICpidWZmZXIgPSBwcnotPmJ1ZmZlcjsKLQltZW1jcHkoYnVmZmVyLT5kYXRhICsgc3RhcnQsIHMsIGNvdW50KTsKKwltZW1jcHlfdG9pbyhidWZmZXItPmRhdGEgKyBzdGFydCwgcywgY291bnQpOwogCXBlcnNpc3RlbnRfcmFtX3VwZGF0ZV9lY2MocHJ6LCBzdGFydCwgY291bnQpOwogfQogCitzdGF0aWMgaW50IG5vdHJhY2UgcGVyc2lzdGVudF9yYW1fdXBkYXRlX3VzZXIoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeiwKKwljb25zdCB2b2lkIF9fdXNlciAqcywgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IHBlcnNpc3RlbnRfcmFtX2J1ZmZlciAqYnVmZmVyID0gcHJ6LT5idWZmZXI7CisJaW50IHJldCA9IHVubGlrZWx5KF9fY29weV9mcm9tX3VzZXIoYnVmZmVyLT5kYXRhICsgc3RhcnQsIHMsIGNvdW50KSkgPworCQktRUZBVUxUIDogMDsKKwlwZXJzaXN0ZW50X3JhbV91cGRhdGVfZWNjKHByeiwgc3RhcnQsIGNvdW50KTsKKwlyZXR1cm4gcmV0OworfQorCiB2b2lkIHBlcnNpc3RlbnRfcmFtX3NhdmVfb2xkKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcnopCiB7CiAJc3RydWN0IHBlcnNpc3RlbnRfcmFtX2J1ZmZlciAqYnVmZmVyID0gcHJ6LT5idWZmZXI7CkBAIC0zMjIsOCArMjk3LDggQEAKIAl9CiAKIAlwcnotPm9sZF9sb2dfc2l6ZSA9IHNpemU7Ci0JbWVtY3B5KHByei0+b2xkX2xvZywgJmJ1ZmZlci0+ZGF0YVtzdGFydF0sIHNpemUgLSBzdGFydCk7Ci0JbWVtY3B5KHByei0+b2xkX2xvZyArIHNpemUgLSBzdGFydCwgJmJ1ZmZlci0+ZGF0YVswXSwgc3RhcnQpOworCW1lbWNweV9mcm9taW8ocHJ6LT5vbGRfbG9nLCAmYnVmZmVyLT5kYXRhW3N0YXJ0XSwgc2l6ZSAtIHN0YXJ0KTsKKwltZW1jcHlfZnJvbWlvKHByei0+b2xkX2xvZyArIHNpemUgLSBzdGFydCwgJmJ1ZmZlci0+ZGF0YVswXSwgc3RhcnQpOwogfQogCiBpbnQgbm90cmFjZSBwZXJzaXN0ZW50X3JhbV93cml0ZShzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6LApAQCAtMzU2LDYgKzMzMSwzOCBAQAogCXJldHVybiBjb3VudDsKIH0KIAoraW50IG5vdHJhY2UgcGVyc2lzdGVudF9yYW1fd3JpdGVfdXNlcihzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6LAorCWNvbnN0IHZvaWQgX191c2VyICpzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJaW50IHJlbSwgcmV0ID0gMCwgYyA9IGNvdW50OworCXNpemVfdCBzdGFydDsKKworCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9SRUFELCBzLCBjb3VudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodW5saWtlbHkoYyA+IHByei0+YnVmZmVyX3NpemUpKSB7CisJCXMgKz0gYyAtIHByei0+YnVmZmVyX3NpemU7CisJCWMgPSBwcnotPmJ1ZmZlcl9zaXplOworCX0KKworCWJ1ZmZlcl9zaXplX2FkZChwcnosIGMpOworCisJc3RhcnQgPSBidWZmZXJfc3RhcnRfYWRkKHByeiwgYyk7CisKKwlyZW0gPSBwcnotPmJ1ZmZlcl9zaXplIC0gc3RhcnQ7CisJaWYgKHVubGlrZWx5KHJlbSA8IGMpKSB7CisJCXJldCA9IHBlcnNpc3RlbnRfcmFtX3VwZGF0ZV91c2VyKHByeiwgcywgc3RhcnQsIHJlbSk7CisJCXMgKz0gcmVtOworCQljIC09IHJlbTsKKwkJc3RhcnQgPSAwOworCX0KKwlpZiAobGlrZWx5KCFyZXQpKQorCQlyZXQgPSBwZXJzaXN0ZW50X3JhbV91cGRhdGVfdXNlcihwcnosIHMsIHN0YXJ0LCBjKTsKKworCXBlcnNpc3RlbnRfcmFtX3VwZGF0ZV9oZWFkZXJfZWNjKHByeik7CisKKwlyZXR1cm4gdW5saWtlbHkocmV0KSA/IHJldCA6IGNvdW50OworfQorCiBzaXplX3QgcGVyc2lzdGVudF9yYW1fb2xkX3NpemUoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeikKIHsKIAlyZXR1cm4gcHJ6LT5vbGRfbG9nX3NpemU7CkBAIC00MjYsOSArNDMzLDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JYnVmZmVyX3N0YXJ0X2FkZCA9IGJ1ZmZlcl9zdGFydF9hZGRfbG9ja2VkOwotCWJ1ZmZlcl9zaXplX2FkZCA9IGJ1ZmZlcl9zaXplX2FkZF9sb2NrZWQ7Ci0KIAlpZiAobWVtdHlwZSkKIAkJdmEgPSBpb3JlbWFwKHN0YXJ0LCBzaXplKTsKIAllbHNlCmRpZmYgLS1naXQgYS9mcy9xdW90YS9xdW90YS5jIGIvZnMvcXVvdGEvcXVvdGEuYwppbmRleCAzNWRmMDhlLi4yZDQ0NTQyIDEwMDY0NAotLS0gYS9mcy9xdW90YS9xdW90YS5jCisrKyBiL2ZzL3F1b3RhL3F1b3RhLmMKQEAgLTM0MSw2ICszNDEsNyBAQAogCXN0cnVjdCBxY19zdGF0ZSBzdGF0ZTsKIAlpbnQgcmV0OwogCisJbWVtc2V0KCZzdGF0ZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcWNfc3RhdGUpKTsKIAlyZXQgPSBzYi0+c19xY29wLT5nZXRfc3RhdGUoc2IsICZzdGF0ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC0zNjUsMTcgKzM2NiwxOSBAQAogCWZxcy0+cXNfcnRidGltZWxpbWl0ID0gc3RhdGUuc19zdGF0ZVt0eXBlXS5ydF9zcGNfdGltZWxpbWl0OwogCWZxcy0+cXNfYndhcm5saW1pdCA9IHN0YXRlLnNfc3RhdGVbdHlwZV0uc3BjX3dhcm5saW1pdDsKIAlmcXMtPnFzX2l3YXJubGltaXQgPSBzdGF0ZS5zX3N0YXRlW3R5cGVdLmlub193YXJubGltaXQ7Ci0JaWYgKHN0YXRlLnNfc3RhdGVbVVNSUVVPVEFdLmZsYWdzICYgUUNJX0FDQ1RfRU5BQkxFRCkgeworCisJLyogSW5vZGVzIG1heSBiZSBhbGxvY2F0ZWQgZXZlbiBpZiBpbmFjdGl2ZTsgY29weSBvdXQgaWYgcHJlc2VudCAqLworCWlmIChzdGF0ZS5zX3N0YXRlW1VTUlFVT1RBXS5pbm8pIHsKIAkJZnFzLT5xc191cXVvdGEucWZzX2lubyA9IHN0YXRlLnNfc3RhdGVbVVNSUVVPVEFdLmlubzsKIAkJZnFzLT5xc191cXVvdGEucWZzX25ibGtzID0gc3RhdGUuc19zdGF0ZVtVU1JRVU9UQV0uYmxvY2tzOwogCQlmcXMtPnFzX3VxdW90YS5xZnNfbmV4dGVudHMgPSBzdGF0ZS5zX3N0YXRlW1VTUlFVT1RBXS5uZXh0ZW50czsKIAl9Ci0JaWYgKHN0YXRlLnNfc3RhdGVbR1JQUVVPVEFdLmZsYWdzICYgUUNJX0FDQ1RfRU5BQkxFRCkgeworCWlmIChzdGF0ZS5zX3N0YXRlW0dSUFFVT1RBXS5pbm8pIHsKIAkJZnFzLT5xc19ncXVvdGEucWZzX2lubyA9IHN0YXRlLnNfc3RhdGVbR1JQUVVPVEFdLmlubzsKIAkJZnFzLT5xc19ncXVvdGEucWZzX25ibGtzID0gc3RhdGUuc19zdGF0ZVtHUlBRVU9UQV0uYmxvY2tzOwogCQlmcXMtPnFzX2dxdW90YS5xZnNfbmV4dGVudHMgPSBzdGF0ZS5zX3N0YXRlW0dSUFFVT1RBXS5uZXh0ZW50czsKIAl9Ci0JaWYgKHN0YXRlLnNfc3RhdGVbUFJKUVVPVEFdLmZsYWdzICYgUUNJX0FDQ1RfRU5BQkxFRCkgeworCWlmIChzdGF0ZS5zX3N0YXRlW1BSSlFVT1RBXS5pbm8pIHsKIAkJLyoKIAkJICogUV9YR0VUUVNUQVQgZG9lc24ndCBoYXZlIHJvb20gZm9yIGJvdGggZ3JvdXAgYW5kIHByb2plY3QKIAkJICogcXVvdGFzLiAgU28sIGFsbG93IHRoZSBwcm9qZWN0IHF1b3RhIHZhbHVlcyB0byBiZSBjb3BpZWQgb3V0CkBAIC00MTEsNiArNDE0LDcgQEAKIAlzdHJ1Y3QgcWNfc3RhdGUgc3RhdGU7CiAJaW50IHJldDsKIAorCW1lbXNldCgmc3RhdGUsIDAsIHNpemVvZiAoc3RydWN0IHFjX3N0YXRlKSk7CiAJcmV0ID0gc2ItPnNfcWNvcC0+Z2V0X3N0YXRlKHNiLCAmc3RhdGUpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNDM1LDE3ICs0MzksMTkgQEAKIAlmcXMtPnFzX3J0YnRpbWVsaW1pdCA9IHN0YXRlLnNfc3RhdGVbdHlwZV0ucnRfc3BjX3RpbWVsaW1pdDsKIAlmcXMtPnFzX2J3YXJubGltaXQgPSBzdGF0ZS5zX3N0YXRlW3R5cGVdLnNwY193YXJubGltaXQ7CiAJZnFzLT5xc19pd2FybmxpbWl0ID0gc3RhdGUuc19zdGF0ZVt0eXBlXS5pbm9fd2FybmxpbWl0OwotCWlmIChzdGF0ZS5zX3N0YXRlW1VTUlFVT1RBXS5mbGFncyAmIFFDSV9BQ0NUX0VOQUJMRUQpIHsKKworCS8qIElub2RlcyBtYXkgYmUgYWxsb2NhdGVkIGV2ZW4gaWYgaW5hY3RpdmU7IGNvcHkgb3V0IGlmIHByZXNlbnQgKi8KKwlpZiAoc3RhdGUuc19zdGF0ZVtVU1JRVU9UQV0uaW5vKSB7CiAJCWZxcy0+cXNfdXF1b3RhLnFmc19pbm8gPSBzdGF0ZS5zX3N0YXRlW1VTUlFVT1RBXS5pbm87CiAJCWZxcy0+cXNfdXF1b3RhLnFmc19uYmxrcyA9IHN0YXRlLnNfc3RhdGVbVVNSUVVPVEFdLmJsb2NrczsKIAkJZnFzLT5xc191cXVvdGEucWZzX25leHRlbnRzID0gc3RhdGUuc19zdGF0ZVtVU1JRVU9UQV0ubmV4dGVudHM7CiAJfQotCWlmIChzdGF0ZS5zX3N0YXRlW0dSUFFVT1RBXS5mbGFncyAmIFFDSV9BQ0NUX0VOQUJMRUQpIHsKKwlpZiAoc3RhdGUuc19zdGF0ZVtHUlBRVU9UQV0uaW5vKSB7CiAJCWZxcy0+cXNfZ3F1b3RhLnFmc19pbm8gPSBzdGF0ZS5zX3N0YXRlW0dSUFFVT1RBXS5pbm87CiAJCWZxcy0+cXNfZ3F1b3RhLnFmc19uYmxrcyA9IHN0YXRlLnNfc3RhdGVbR1JQUVVPVEFdLmJsb2NrczsKIAkJZnFzLT5xc19ncXVvdGEucWZzX25leHRlbnRzID0gc3RhdGUuc19zdGF0ZVtHUlBRVU9UQV0ubmV4dGVudHM7CiAJfQotCWlmIChzdGF0ZS5zX3N0YXRlW1BSSlFVT1RBXS5mbGFncyAmIFFDSV9BQ0NUX0VOQUJMRUQpIHsKKwlpZiAoc3RhdGUuc19zdGF0ZVtQUkpRVU9UQV0uaW5vKSB7CiAJCWZxcy0+cXNfcHF1b3RhLnFmc19pbm8gPSBzdGF0ZS5zX3N0YXRlW1BSSlFVT1RBXS5pbm87CiAJCWZxcy0+cXNfcHF1b3RhLnFmc19uYmxrcyA9IHN0YXRlLnNfc3RhdGVbUFJKUVVPVEFdLmJsb2NrczsKIAkJZnFzLT5xc19wcXVvdGEucWZzX25leHRlbnRzID0gc3RhdGUuc19zdGF0ZVtQUkpRVU9UQV0ubmV4dGVudHM7CmRpZmYgLS1naXQgYS9mcy9yYW1mcy9maWxlLW1tdS5jIGIvZnMvcmFtZnMvZmlsZS1tbXUuYwppbmRleCAxODNhMjEyLi4xMmFmMDQ5IDEwMDY0NAotLS0gYS9mcy9yYW1mcy9maWxlLW1tdS5jCisrKyBiL2ZzL3JhbWZzL2ZpbGUtbW11LmMKQEAgLTI3LDkgKzI3LDE3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbWZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJhbWZzX21tdV9nZXRfdW5tYXBwZWRfYXJlYShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwZ29mZiwKKwkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlyZXR1cm4gY3VycmVudC0+bW0tPmdldF91bm1hcHBlZF9hcmVhKGZpbGUsIGFkZHIsIGxlbiwgcGdvZmYsIGZsYWdzKTsKK30KKwogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYW1mc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCiAJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKQEAgLTM4LDYgKzQ2LDcgQEAKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiAJLnNwbGljZV93cml0ZQk9IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUsCiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5nZXRfdW5tYXBwZWRfYXJlYQk9IHJhbWZzX21tdV9nZXRfdW5tYXBwZWRfYXJlYSwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHJhbWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMgYi9mcy9yZWlzZXJmcy9zdXBlci5jCmluZGV4IDdhNGE4NWEuLjc0ZDVkZGQgMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL3N1cGVyLmMKKysrIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwpAQCAtMTkwLDcgKzE5MCwxNSBAQAogc3RhdGljIGludCByZWlzZXJmc19xdW90YV9vbl9tb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsKICNlbmRpZgogCi0vKiBsb29rIGZvciB1bmNvbXBsZXRlZCB1bmxpbmtzIGFuZCB0cnVuY2F0ZXMgYW5kIGNvbXBsZXRlIHRoZW0gKi8KKy8qCisgKiBMb29rIGZvciB1bmNvbXBsZXRlZCB1bmxpbmtzIGFuZCB0cnVuY2F0ZXMgYW5kIGNvbXBsZXRlIHRoZW0KKyAqCisgKiBDYWxsZWQgd2l0aCBzdXBlcmJsb2NrIHdyaXRlIGxvY2tlZC4gIElmIHF1b3RhcyBhcmUgZW5hYmxlZCwgd2UgaGF2ZSB0bworICogcmVsZWFzZS9yZXRha2UgbGVzdCB3ZSBjYWxsIGRxdW90X3F1b3RhX29uX21vdW50KCksIHByb2NlZWQgdG8KKyAqIHNjaGVkdWxlX29uX2VhY2hfY3B1KCkgaW4gaW52YWxpZGF0ZV9iZGV2KCkgYW5kIGRlYWRsb2NrIHdhaXRpbmcgZm9yIHRoZSBwZXIKKyAqIGNwdSB3b3JrbGV0cyB0byBjb21wbGV0ZSBmbHVzaF9hc3luY19jb21taXRzKCkgdGhhdCBpbiB0dXJuIHdhaXQgZm9yIHRoZQorICogc3VwZXJibG9jayB3cml0ZSBsb2NrLgorICovCiBzdGF0aWMgaW50IGZpbmlzaF91bmZpbmlzaGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKIHsKIAlJTklUSUFMSVpFX1BBVEgocGF0aCk7CkBAIC0yMzcsNyArMjQ1LDkgQEAKIAkJCQlxdW90YV9lbmFibGVkW2ldID0gMDsKIAkJCQljb250aW51ZTsKIAkJCX0KKwkJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKIAkJCXJldCA9IHJlaXNlcmZzX3F1b3RhX29uX21vdW50KHMsIGkpOworCQkJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzLTI1MDAiLAogCQkJCQkJICJjYW5ub3QgdHVybiBvbiBqb3VybmFsZWQgIgpkaWZmIC0tZ2l0IGEvZnMvc3BsaWNlLmMgYi9mcy9zcGxpY2UuYwppbmRleCBkZDliZjdlLi5hYTM4OTAxIDEwMDY0NAotLS0gYS9mcy9zcGxpY2UuYworKysgYi9mcy9zcGxpY2UuYwpAQCAtMTgzLDgyICsxODMsMzkgQEAKIAkJICAgICAgIHN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjICpzcGQpCiB7CiAJdW5zaWduZWQgaW50IHNwZF9wYWdlcyA9IHNwZC0+bnJfcGFnZXM7Ci0JaW50IHJldCwgZG9fd2FrZXVwLCBwYWdlX25yOworCWludCByZXQgPSAwLCBwYWdlX25yID0gMDsKIAogCWlmICghc3BkX3BhZ2VzKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IDA7Ci0JZG9fd2FrZXVwID0gMDsKLQlwYWdlX25yID0gMDsKLQotCXBpcGVfbG9jayhwaXBlKTsKLQotCWZvciAoOzspIHsKLQkJaWYgKCFwaXBlLT5yZWFkZXJzKSB7Ci0JCQlzZW5kX3NpZyhTSUdQSVBFLCBjdXJyZW50LCAwKTsKLQkJCWlmICghcmV0KQotCQkJCXJldCA9IC1FUElQRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHBpcGUtPm5yYnVmcyA8IHBpcGUtPmJ1ZmZlcnMpIHsKLQkJCWludCBuZXdidWYgPSAocGlwZS0+Y3VyYnVmICsgcGlwZS0+bnJidWZzKSAmIChwaXBlLT5idWZmZXJzIC0gMSk7Ci0JCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiA9IHBpcGUtPmJ1ZnMgKyBuZXdidWY7Ci0KLQkJCWJ1Zi0+cGFnZSA9IHNwZC0+cGFnZXNbcGFnZV9ucl07Ci0JCQlidWYtPm9mZnNldCA9IHNwZC0+cGFydGlhbFtwYWdlX25yXS5vZmZzZXQ7Ci0JCQlidWYtPmxlbiA9IHNwZC0+cGFydGlhbFtwYWdlX25yXS5sZW47Ci0JCQlidWYtPnByaXZhdGUgPSBzcGQtPnBhcnRpYWxbcGFnZV9ucl0ucHJpdmF0ZTsKLQkJCWJ1Zi0+b3BzID0gc3BkLT5vcHM7Ci0JCQlpZiAoc3BkLT5mbGFncyAmIFNQTElDRV9GX0dJRlQpCi0JCQkJYnVmLT5mbGFncyB8PSBQSVBFX0JVRl9GTEFHX0dJRlQ7Ci0KLQkJCXBpcGUtPm5yYnVmcysrOwotCQkJcGFnZV9ucisrOwotCQkJcmV0ICs9IGJ1Zi0+bGVuOwotCi0JCQlpZiAocGlwZS0+ZmlsZXMpCi0JCQkJZG9fd2FrZXVwID0gMTsKLQotCQkJaWYgKCEtLXNwZC0+bnJfcGFnZXMpCi0JCQkJYnJlYWs7Ci0JCQlpZiAocGlwZS0+bnJidWZzIDwgcGlwZS0+YnVmZmVycykKLQkJCQljb250aW51ZTsKLQotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoc3BkLT5mbGFncyAmIFNQTElDRV9GX05PTkJMT0NLKSB7Ci0JCQlpZiAoIXJldCkKLQkJCQlyZXQgPSAtRUFHQUlOOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCWlmICghcmV0KQotCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGRvX3dha2V1cCkgewotCQkJc21wX21iKCk7Ci0JCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmcGlwZS0+d2FpdCkpCi0JCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmMoJnBpcGUtPndhaXQpOwotCQkJa2lsbF9mYXN5bmMoJnBpcGUtPmZhc3luY19yZWFkZXJzLCBTSUdJTywgUE9MTF9JTik7Ci0JCQlkb193YWtldXAgPSAwOwotCQl9Ci0KLQkJcGlwZS0+d2FpdGluZ193cml0ZXJzKys7Ci0JCXBpcGVfd2FpdChwaXBlKTsKLQkJcGlwZS0+d2FpdGluZ193cml0ZXJzLS07CisJaWYgKHVubGlrZWx5KCFwaXBlLT5yZWFkZXJzKSkgeworCQlzZW5kX3NpZyhTSUdQSVBFLCBjdXJyZW50LCAwKTsKKwkJcmV0ID0gLUVQSVBFOworCQlnb3RvIG91dDsKIAl9CiAKLQlwaXBlX3VubG9jayhwaXBlKTsKKwl3aGlsZSAocGlwZS0+bnJidWZzIDwgcGlwZS0+YnVmZmVycykgeworCQlpbnQgbmV3YnVmID0gKHBpcGUtPmN1cmJ1ZiArIHBpcGUtPm5yYnVmcykgJiAocGlwZS0+YnVmZmVycyAtIDEpOworCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiA9IHBpcGUtPmJ1ZnMgKyBuZXdidWY7CiAKLQlpZiAoZG9fd2FrZXVwKQotCQl3YWtldXBfcGlwZV9yZWFkZXJzKHBpcGUpOworCQlidWYtPnBhZ2UgPSBzcGQtPnBhZ2VzW3BhZ2VfbnJdOworCQlidWYtPm9mZnNldCA9IHNwZC0+cGFydGlhbFtwYWdlX25yXS5vZmZzZXQ7CisJCWJ1Zi0+bGVuID0gc3BkLT5wYXJ0aWFsW3BhZ2VfbnJdLmxlbjsKKwkJYnVmLT5wcml2YXRlID0gc3BkLT5wYXJ0aWFsW3BhZ2VfbnJdLnByaXZhdGU7CisJCWJ1Zi0+b3BzID0gc3BkLT5vcHM7CiAKKwkJcGlwZS0+bnJidWZzKys7CisJCXBhZ2VfbnIrKzsKKwkJcmV0ICs9IGJ1Zi0+bGVuOworCisJCWlmICghLS1zcGQtPm5yX3BhZ2VzKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCFyZXQpCisJCXJldCA9IC1FQUdBSU47CisKK291dDoKIAl3aGlsZSAocGFnZV9uciA8IHNwZF9wYWdlcykKIAkJc3BkLT5zcGRfcmVsZWFzZShzcGQsIHBhZ2VfbnIrKyk7CiAKQEAgLTI2Niw2ICsyMjMsMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNwbGljZV90b19waXBlKTsKIAorc3NpemVfdCBhZGRfdG9fcGlwZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCBzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZikKK3sKKwlpbnQgcmV0OworCisJaWYgKHVubGlrZWx5KCFwaXBlLT5yZWFkZXJzKSkgeworCQlzZW5kX3NpZyhTSUdQSVBFLCBjdXJyZW50LCAwKTsKKwkJcmV0ID0gLUVQSVBFOworCX0gZWxzZSBpZiAocGlwZS0+bnJidWZzID09IHBpcGUtPmJ1ZmZlcnMpIHsKKwkJcmV0ID0gLUVBR0FJTjsKKwl9IGVsc2UgeworCQlpbnQgbmV3YnVmID0gKHBpcGUtPmN1cmJ1ZiArIHBpcGUtPm5yYnVmcykgJiAocGlwZS0+YnVmZmVycyAtIDEpOworCQlwaXBlLT5idWZzW25ld2J1Zl0gPSAqYnVmOworCQlwaXBlLT5ucmJ1ZnMrKzsKKwkJcmV0dXJuIGJ1Zi0+bGVuOworCX0KKwlwaXBlX2J1Zl9yZWxlYXNlKHBpcGUsIGJ1Zik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woYWRkX3RvX3BpcGUpOworCiB2b2lkIHNwZF9yZWxlYXNlX3BhZ2Uoc3RydWN0IHNwbGljZV9waXBlX2Rlc2MgKnNwZCwgdW5zaWduZWQgaW50IGkpCiB7CiAJcHV0X3BhZ2Uoc3BkLT5wYWdlc1tpXSk7CkBAIC0zMDMsMjA3ICsyODAsNiBAQAogCWtmcmVlKHNwZC0+cGFydGlhbCk7CiB9CiAKLXN0YXRpYyBpbnQKLV9fZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICppbiwgbG9mZl90ICpwcG9zLAotCQkJICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwKLQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGluLT5mX21hcHBpbmc7Ci0JdW5zaWduZWQgaW50IGxvZmYsIG5yX3BhZ2VzLCByZXFfcGFnZXM7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2VzW1BJUEVfREVGX0JVRkZFUlNdOwotCXN0cnVjdCBwYXJ0aWFsX3BhZ2UgcGFydGlhbFtQSVBFX0RFRl9CVUZGRVJTXTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlwZ29mZl90IGluZGV4LCBlbmRfaW5kZXg7Ci0JbG9mZl90IGlzaXplOwotCWludCBlcnJvciwgcGFnZV9ucjsKLQlzdHJ1Y3Qgc3BsaWNlX3BpcGVfZGVzYyBzcGQgPSB7Ci0JCS5wYWdlcyA9IHBhZ2VzLAotCQkucGFydGlhbCA9IHBhcnRpYWwsCi0JCS5ucl9wYWdlc19tYXggPSBQSVBFX0RFRl9CVUZGRVJTLAotCQkuZmxhZ3MgPSBmbGFncywKLQkJLm9wcyA9ICZwYWdlX2NhY2hlX3BpcGVfYnVmX29wcywKLQkJLnNwZF9yZWxlYXNlID0gc3BkX3JlbGVhc2VfcGFnZSwKLQl9OwotCi0JaWYgKHNwbGljZV9ncm93X3NwZChwaXBlLCAmc3BkKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpbmRleCA9ICpwcG9zID4+IFBBR0VfU0hJRlQ7Ci0JbG9mZiA9ICpwcG9zICYgflBBR0VfTUFTSzsKLQlyZXFfcGFnZXMgPSAobGVuICsgbG9mZiArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7Ci0JbnJfcGFnZXMgPSBtaW4ocmVxX3BhZ2VzLCBzcGQubnJfcGFnZXNfbWF4KTsKLQotCS8qCi0JICogTG9va3VwIHRoZSAoaG9wZWZ1bGx5KSBmdWxsIHJhbmdlIG9mIHBhZ2VzIHdlIG5lZWQuCi0JICovCi0Jc3BkLm5yX3BhZ2VzID0gZmluZF9nZXRfcGFnZXNfY29udGlnKG1hcHBpbmcsIGluZGV4LCBucl9wYWdlcywgc3BkLnBhZ2VzKTsKLQlpbmRleCArPSBzcGQubnJfcGFnZXM7Ci0KLQkvKgotCSAqIElmIGZpbmRfZ2V0X3BhZ2VzX2NvbnRpZygpIHJldHVybmVkIGZld2VyIHBhZ2VzIHRoYW4gd2UgbmVlZGVkLAotCSAqIHJlYWRhaGVhZC9hbGxvY2F0ZSB0aGUgcmVzdCBhbmQgZmlsbCBpbiB0aGUgaG9sZXMuCi0JICovCi0JaWYgKHNwZC5ucl9wYWdlcyA8IG5yX3BhZ2VzKQotCQlwYWdlX2NhY2hlX3N5bmNfcmVhZGFoZWFkKG1hcHBpbmcsICZpbi0+Zl9yYSwgaW4sCi0JCQkJaW5kZXgsIHJlcV9wYWdlcyAtIHNwZC5ucl9wYWdlcyk7Ci0KLQllcnJvciA9IDA7Ci0Jd2hpbGUgKHNwZC5ucl9wYWdlcyA8IG5yX3BhZ2VzKSB7Ci0JCS8qCi0JCSAqIFBhZ2UgY291bGQgYmUgdGhlcmUsIGZpbmRfZ2V0X3BhZ2VzX2NvbnRpZygpIGJyZWFrcyBvbgotCQkgKiB0aGUgZmlyc3QgaG9sZS4KLQkJICovCi0JCXBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIGluZGV4KTsKLQkJaWYgKCFwYWdlKSB7Ci0JCQkvKgotCQkJICogcGFnZSBkaWRuJ3QgZXhpc3QsIGFsbG9jYXRlIG9uZS4KLQkJCSAqLwotCQkJcGFnZSA9IHBhZ2VfY2FjaGVfYWxsb2NfY29sZChtYXBwaW5nKTsKLQkJCWlmICghcGFnZSkKLQkJCQlicmVhazsKLQotCQkJZXJyb3IgPSBhZGRfdG9fcGFnZV9jYWNoZV9scnUocGFnZSwgbWFwcGluZywgaW5kZXgsCi0JCQkJICAgbWFwcGluZ19nZnBfY29uc3RyYWludChtYXBwaW5nLCBHRlBfS0VSTkVMKSk7Ci0JCQlpZiAodW5saWtlbHkoZXJyb3IpKSB7Ci0JCQkJcHV0X3BhZ2UocGFnZSk7Ci0JCQkJaWYgKGVycm9yID09IC1FRVhJU1QpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLyoKLQkJCSAqIGFkZF90b19wYWdlX2NhY2hlKCkgbG9ja3MgdGhlIHBhZ2UsIHVubG9jayBpdAotCQkJICogdG8gYXZvaWQgY29udm9sdXRpbmcgdGhlIGxvZ2ljIGJlbG93IGV2ZW4gbW9yZS4KLQkJCSAqLwotCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCX0KLQotCQlzcGQucGFnZXNbc3BkLm5yX3BhZ2VzKytdID0gcGFnZTsKLQkJaW5kZXgrKzsKLQl9Ci0KLQkvKgotCSAqIE5vdyBsb29wIG92ZXIgdGhlIG1hcCBhbmQgc2VlIGlmIHdlIG5lZWQgdG8gc3RhcnQgSU8gb24gYW55Ci0JICogcGFnZXMsIGZpbGwgaW4gdGhlIHBhcnRpYWwgbWFwLCBldGMuCi0JICovCi0JaW5kZXggPSAqcHBvcyA+PiBQQUdFX1NISUZUOwotCW5yX3BhZ2VzID0gc3BkLm5yX3BhZ2VzOwotCXNwZC5ucl9wYWdlcyA9IDA7Ci0JZm9yIChwYWdlX25yID0gMDsgcGFnZV9uciA8IG5yX3BhZ2VzOyBwYWdlX25yKyspIHsKLQkJdW5zaWduZWQgaW50IHRoaXNfbGVuOwotCi0JCWlmICghbGVuKQotCQkJYnJlYWs7Ci0KLQkJLyoKLQkJICogdGhpc19sZW4gaXMgdGhlIG1heCB3ZSdsbCB1c2UgZnJvbSB0aGlzIHBhZ2UKLQkJICovCi0JCXRoaXNfbGVuID0gbWluX3QodW5zaWduZWQgbG9uZywgbGVuLCBQQUdFX1NJWkUgLSBsb2ZmKTsKLQkJcGFnZSA9IHNwZC5wYWdlc1twYWdlX25yXTsKLQotCQlpZiAoUGFnZVJlYWRhaGVhZChwYWdlKSkKLQkJCXBhZ2VfY2FjaGVfYXN5bmNfcmVhZGFoZWFkKG1hcHBpbmcsICZpbi0+Zl9yYSwgaW4sCi0JCQkJCXBhZ2UsIGluZGV4LCByZXFfcGFnZXMgLSBwYWdlX25yKTsKLQotCQkvKgotCQkgKiBJZiB0aGUgcGFnZSBpc24ndCB1cHRvZGF0ZSwgd2UgbWF5IG5lZWQgdG8gc3RhcnQgaW8gb24gaXQKLQkJICovCi0JCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7Ci0JCQlsb2NrX3BhZ2UocGFnZSk7Ci0KLQkJCS8qCi0JCQkgKiBQYWdlIHdhcyB0cnVuY2F0ZWQsIG9yIGludmFsaWRhdGVkIGJ5IHRoZQotCQkJICogZmlsZXN5c3RlbS4gIFJlZG8gdGhlIGZpbmQvY3JlYXRlLCBidXQgdGhpcyB0aW1lIHRoZQotCQkJICogcGFnZSBpcyBrZXB0IGxvY2tlZCwgc28gdGhlcmUncyBubyBjaGFuY2Ugb2YgYW5vdGhlcgotCQkJICogcmFjZSB3aXRoIHRydW5jYXRlL2ludmFsaWRhdGUuCi0JCQkgKi8KLQkJCWlmICghcGFnZS0+bWFwcGluZykgewotCQkJCXVubG9ja19wYWdlKHBhZ2UpOwotcmV0cnlfbG9va3VwOgotCQkJCXBhZ2UgPSBmaW5kX29yX2NyZWF0ZV9wYWdlKG1hcHBpbmcsIGluZGV4LAotCQkJCQkJbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKSk7Ci0KLQkJCQlpZiAoIXBhZ2UpIHsKLQkJCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJcHV0X3BhZ2Uoc3BkLnBhZ2VzW3BhZ2VfbnJdKTsKLQkJCQlzcGQucGFnZXNbcGFnZV9ucl0gPSBwYWdlOwotCQkJfQotCQkJLyoKLQkJCSAqIHBhZ2Ugd2FzIGFscmVhZHkgdW5kZXIgaW8gYW5kIGlzIG5vdyBkb25lLCBncmVhdAotCQkJICovCi0JCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7Ci0JCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJZ290byBmaWxsX2l0OwotCQkJfQotCi0JCQkvKgotCQkJICogbmVlZCB0byByZWFkIGluIHRoZSBwYWdlCi0JCQkgKi8KLQkJCWVycm9yID0gbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlKGluLCBwYWdlKTsKLQkJCWlmICh1bmxpa2VseShlcnJvcikpIHsKLQkJCQkvKgotCQkJCSAqIFJlLWxvb2t1cCB0aGUgcGFnZQotCQkJCSAqLwotCQkJCWlmIChlcnJvciA9PSBBT1BfVFJVTkNBVEVEX1BBR0UpCi0JCQkJCWdvdG8gcmV0cnlfbG9va3VwOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLWZpbGxfaXQ6Ci0JCS8qCi0JCSAqIGlfc2l6ZSBtdXN0IGJlIGNoZWNrZWQgYWZ0ZXIgUGFnZVVwdG9kYXRlLgotCQkgKi8KLQkJaXNpemUgPSBpX3NpemVfcmVhZChtYXBwaW5nLT5ob3N0KTsKLQkJZW5kX2luZGV4ID0gKGlzaXplIC0gMSkgPj4gUEFHRV9TSElGVDsKLQkJaWYgKHVubGlrZWx5KCFpc2l6ZSB8fCBpbmRleCA+IGVuZF9pbmRleCkpCi0JCQlicmVhazsKLQotCQkvKgotCQkgKiBpZiB0aGlzIGlzIHRoZSBsYXN0IHBhZ2UsIHNlZSBpZiB3ZSBuZWVkIHRvIHNocmluawotCQkgKiB0aGUgbGVuZ3RoIGFuZCBzdG9wCi0JCSAqLwotCQlpZiAoZW5kX2luZGV4ID09IGluZGV4KSB7Ci0JCQl1bnNpZ25lZCBpbnQgcGxlbjsKLQotCQkJLyoKLQkJCSAqIG1heCBnb29kIGJ5dGVzIGluIHRoaXMgcGFnZQotCQkJICovCi0JCQlwbGVuID0gKChpc2l6ZSAtIDEpICYgflBBR0VfTUFTSykgKyAxOwotCQkJaWYgKHBsZW4gPD0gbG9mZikKLQkJCQlicmVhazsKLQotCQkJLyoKLQkJCSAqIGZvcmNlIHF1aXQgYWZ0ZXIgYWRkaW5nIHRoaXMgcGFnZQotCQkJICovCi0JCQl0aGlzX2xlbiA9IG1pbih0aGlzX2xlbiwgcGxlbiAtIGxvZmYpOwotCQkJbGVuID0gdGhpc19sZW47Ci0JCX0KLQotCQlzcGQucGFydGlhbFtwYWdlX25yXS5vZmZzZXQgPSBsb2ZmOwotCQlzcGQucGFydGlhbFtwYWdlX25yXS5sZW4gPSB0aGlzX2xlbjsKLQkJbGVuIC09IHRoaXNfbGVuOwotCQlsb2ZmID0gMDsKLQkJc3BkLm5yX3BhZ2VzKys7Ci0JCWluZGV4Kys7Ci0JfQotCi0JLyoKLQkgKiBSZWxlYXNlIGFueSBwYWdlcyBhdCB0aGUgZW5kLCBpZiB3ZSBxdWl0IGVhcmx5LiAncGFnZV9ucicgaXMgaG93IGZhcgotCSAqIHdlIGdvdCwgJ25yX3BhZ2VzJyBpcyBob3cgbWFueSBwYWdlcyBhcmUgaW4gdGhlIG1hcC4KLQkgKi8KLQl3aGlsZSAocGFnZV9uciA8IG5yX3BhZ2VzKQotCQlwdXRfcGFnZShzcGQucGFnZXNbcGFnZV9ucisrXSk7Ci0JaW4tPmZfcmEucHJldl9wb3MgPSAobG9mZl90KWluZGV4IDw8IFBBR0VfU0hJRlQ7Ci0KLQlpZiAoc3BkLm5yX3BhZ2VzKQotCQllcnJvciA9IHNwbGljZV90b19waXBlKHBpcGUsICZzcGQpOwotCi0Jc3BsaWNlX3Nocmlua19zcGQoJnNwZCk7Ci0JcmV0dXJuIGVycm9yOwotfQotCiAvKioKICAqIGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCAtIHNwbGljZSBkYXRhIGZyb20gZmlsZSB0byBhIHBpcGUKICAqIEBpbjoJCWZpbGUgdG8gc3BsaWNlIGZyb20KQEAgLTUxNCwzOSArMjkwLDUzIEBACiAgKgogICogRGVzY3JpcHRpb246CiAgKiAgICBXaWxsIHJlYWQgcGFnZXMgZnJvbSBnaXZlbiBmaWxlIGFuZCBmaWxsIHRoZW0gaW50byBhIHBpcGUuIENhbiBiZQotICogICAgdXNlZCBhcyBsb25nIGFzIHRoZSBhZGRyZXNzX3NwYWNlIG9wZXJhdGlvbnMgZm9yIHRoZSBzb3VyY2UgaW1wbGVtZW50cwotICogICAgYSByZWFkcGFnZSgpIGhvb2suCisgKiAgICB1c2VkIGFzIGxvbmcgYXMgaXQgaGFzIG1vcmUgb3IgbGVzcyBzYW5lIC0+cmVhZF9pdGVyKCkuCiAgKgogICovCiBzc2l6ZV90IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqaW4sIGxvZmZfdCAqcHBvcywKIAkJCQkgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwKIAkJCQkgdW5zaWduZWQgaW50IGZsYWdzKQogewotCWxvZmZfdCBpc2l6ZSwgbGVmdDsKLQlpbnQgcmV0OwotCi0JaWYgKElTX0RBWChpbi0+Zl9tYXBwaW5nLT5ob3N0KSkKLQkJcmV0dXJuIGRlZmF1bHRfZmlsZV9zcGxpY2VfcmVhZChpbiwgcHBvcywgcGlwZSwgbGVuLCBmbGFncyk7CisJc3RydWN0IGlvdl9pdGVyIHRvOworCXN0cnVjdCBraW9jYiBraW9jYjsKKwlsb2ZmX3QgaXNpemU7CisJaW50IGlkeCwgcmV0OwogCiAJaXNpemUgPSBpX3NpemVfcmVhZChpbi0+Zl9tYXBwaW5nLT5ob3N0KTsKIAlpZiAodW5saWtlbHkoKnBwb3MgPj0gaXNpemUpKQogCQlyZXR1cm4gMDsKIAotCWxlZnQgPSBpc2l6ZSAtICpwcG9zOwotCWlmICh1bmxpa2VseShsZWZ0IDwgbGVuKSkKLQkJbGVuID0gbGVmdDsKLQotCXJldCA9IF9fZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkKGluLCBwcG9zLCBwaXBlLCBsZW4sIGZsYWdzKTsKKwlpb3ZfaXRlcl9waXBlKCZ0bywgSVRFUl9QSVBFIHwgUkVBRCwgcGlwZSwgbGVuKTsKKwlpZHggPSB0by5pZHg7CisJaW5pdF9zeW5jX2tpb2NiKCZraW9jYiwgaW4pOworCWtpb2NiLmtpX3BvcyA9ICpwcG9zOworCXJldCA9IGluLT5mX29wLT5yZWFkX2l0ZXIoJmtpb2NiLCAmdG8pOwogCWlmIChyZXQgPiAwKSB7Ci0JCSpwcG9zICs9IHJldDsKKwkJKnBwb3MgPSBraW9jYi5raV9wb3M7CiAJCWZpbGVfYWNjZXNzZWQoaW4pOworCX0gZWxzZSBpZiAocmV0IDwgMCkgeworCQlpZiAoV0FSTl9PTih0by5pZHggIT0gaWR4IHx8IHRvLmlvdl9vZmZzZXQpKSB7CisJCQkvKgorCQkJICogYSBib2d1cyAtPnJlYWRfaXRlcigpIGhhcyBjb3BpZWQgc29tZXRoaW5nIGFuZCBzdGlsbAorCQkJICogcmV0dXJuZWQgYW4gZXJyb3IgaW5zdGVhZCBvZiBhIHNob3J0IHJlYWQuCisJCQkgKi8KKwkJCXRvLmlkeCA9IGlkeDsKKwkJCXRvLmlvdl9vZmZzZXQgPSAwOworCQkJaW92X2l0ZXJfYWR2YW5jZSgmdG8sIDApOyAvKiB0byBmcmVlIHdoYXQgd2FzIGVtaXR0ZWQgKi8KKwkJfQorCQkvKgorCQkgKiBjYWxsZXJzIG9mIC0+c3BsaWNlX3JlYWQoKSBleHBlY3QgLUVBR0FJTiBvbgorCQkgKiAiY2FuJ3QgcHV0IGFueXRoaW5nIGluIHRoZXJlIiwgcmF0aGVyIHRoYW4gLUVGQVVMVC4KKwkJICovCisJCWlmIChyZXQgPT0gLUVGQVVMVCkKKwkJCXJldCA9IC1FQUdBSU47CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkKTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwaXBlX2J1Zl9vcGVyYXRpb25zIGRlZmF1bHRfcGlwZV9idWZfb3BzID0geworY29uc3Qgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgZGVmYXVsdF9waXBlX2J1Zl9vcHMgPSB7CiAJLmNhbl9tZXJnZSA9IDAsCiAJLmNvbmZpcm0gPSBnZW5lcmljX3BpcGVfYnVmX2NvbmZpcm0sCiAJLnJlbGVhc2UgPSBnZW5lcmljX3BpcGVfYnVmX3JlbGVhc2UsCkBAIC01NzAsNyArMzYwLDcgQEAKIH07CiBFWFBPUlRfU1lNQk9MKG5vc3RlYWxfcGlwZV9idWZfb3BzKTsKIAotc3RhdGljIHNzaXplX3Qga2VybmVsX3JlYWR2KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKnZlYywKK3N0YXRpYyBzc2l6ZV90IGtlcm5lbF9yZWFkdihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgc3RydWN0IGt2ZWMgKnZlYywKIAkJCSAgICB1bnNpZ25lZCBsb25nIHZsZW4sIGxvZmZfdCBvZmZzZXQpCiB7CiAJbW1fc2VnbWVudF90IG9sZF9mczsKQEAgLTYwMiwxMDIgKzM5Miw3MCBAQAogfQogRVhQT1JUX1NZTUJPTChrZXJuZWxfd3JpdGUpOwogCi1zc2l6ZV90IGRlZmF1bHRfZmlsZV9zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqaW4sIGxvZmZfdCAqcHBvcywKK3N0YXRpYyBzc2l6ZV90IGRlZmF1bHRfZmlsZV9zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqaW4sIGxvZmZfdCAqcHBvcywKIAkJCQkgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwKIAkJCQkgdW5zaWduZWQgaW50IGZsYWdzKQogeworCXN0cnVjdCBrdmVjICp2ZWMsIF9fdmVjW1BJUEVfREVGX0JVRkZFUlNdOworCXN0cnVjdCBpb3ZfaXRlciB0bzsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOwogCXVuc2lnbmVkIGludCBucl9wYWdlczsKLQl1bnNpZ25lZCBpbnQgbnJfZnJlZWQ7Ci0Jc2l6ZV90IG9mZnNldDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZXNbUElQRV9ERUZfQlVGRkVSU107Ci0Jc3RydWN0IHBhcnRpYWxfcGFnZSBwYXJ0aWFsW1BJUEVfREVGX0JVRkZFUlNdOwotCXN0cnVjdCBpb3ZlYyAqdmVjLCBfX3ZlY1tQSVBFX0RFRl9CVUZGRVJTXTsKKwlzaXplX3Qgb2Zmc2V0LCBkdW1teSwgY29waWVkID0gMDsKIAlzc2l6ZV90IHJlczsKLQlzaXplX3QgdGhpc19sZW47Ci0JaW50IGVycm9yOwogCWludCBpOwotCXN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjIHNwZCA9IHsKLQkJLnBhZ2VzID0gcGFnZXMsCi0JCS5wYXJ0aWFsID0gcGFydGlhbCwKLQkJLm5yX3BhZ2VzX21heCA9IFBJUEVfREVGX0JVRkZFUlMsCi0JCS5mbGFncyA9IGZsYWdzLAotCQkub3BzID0gJmRlZmF1bHRfcGlwZV9idWZfb3BzLAotCQkuc3BkX3JlbGVhc2UgPSBzcGRfcmVsZWFzZV9wYWdlLAotCX07CiAKLQlpZiAoc3BsaWNlX2dyb3dfc3BkKHBpcGUsICZzcGQpKQorCWlmIChwaXBlLT5ucmJ1ZnMgPT0gcGlwZS0+YnVmZmVycykKKwkJcmV0dXJuIC1FQUdBSU47CisKKwkvKgorCSAqIFRyeSB0byBrZWVwIHBhZ2UgYm91bmRhcmllcyBtYXRjaGluZyB0byBzb3VyY2UgcGFnZWNhY2hlIG9uZXMgLQorCSAqIGl0IHByb2JhYmx5IHdvbid0IGJlIG11Y2ggaGVscCwgYnV0Li4uCisJICovCisJb2Zmc2V0ID0gKnBwb3MgJiB+UEFHRV9NQVNLOworCisJaW92X2l0ZXJfcGlwZSgmdG8sIElURVJfUElQRSB8IFJFQUQsIHBpcGUsIGxlbiArIG9mZnNldCk7CisKKwlyZXMgPSBpb3ZfaXRlcl9nZXRfcGFnZXNfYWxsb2MoJnRvLCAmcGFnZXMsIGxlbiArIG9mZnNldCwgJmR1bW15KTsKKwlpZiAocmVzIDw9IDApCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmVzID0gLUVOT01FTTsKKwlucl9wYWdlcyA9IHJlcyAvIFBBR0VfU0laRTsKKwogCXZlYyA9IF9fdmVjOwotCWlmIChzcGQubnJfcGFnZXNfbWF4ID4gUElQRV9ERUZfQlVGRkVSUykgewotCQl2ZWMgPSBrbWFsbG9jKHNwZC5ucl9wYWdlc19tYXggKiBzaXplb2Yoc3RydWN0IGlvdmVjKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdmVjKQotCQkJZ290byBzaHJpbmtfcmV0OworCWlmIChucl9wYWdlcyA+IFBJUEVfREVGX0JVRkZFUlMpIHsKKwkJdmVjID0ga21hbGxvYyhucl9wYWdlcyAqIHNpemVvZihzdHJ1Y3Qga3ZlYyksIEdGUF9LRVJORUwpOworCQlpZiAodW5saWtlbHkoIXZlYykpIHsKKwkJCXJlcyA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAotCW9mZnNldCA9ICpwcG9zICYgflBBR0VfTUFTSzsKLQlucl9wYWdlcyA9IChsZW4gKyBvZmZzZXQgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOworCXBpcGUtPmJ1ZnNbdG8uaWR4XS5vZmZzZXQgPSBvZmZzZXQ7CisJcGlwZS0+YnVmc1t0by5pZHhdLmxlbiAtPSBvZmZzZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXMgJiYgaSA8IHNwZC5ucl9wYWdlc19tYXggJiYgbGVuOyBpKyspIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX1VTRVIpOwotCQllcnJvciA9IC1FTk9NRU07Ci0JCWlmICghcGFnZSkKLQkJCWdvdG8gZXJyOwotCi0JCXRoaXNfbGVuID0gbWluX3Qoc2l6ZV90LCBsZW4sIFBBR0VfU0laRSAtIG9mZnNldCk7Ci0JCXZlY1tpXS5pb3ZfYmFzZSA9ICh2b2lkIF9fdXNlciAqKSBwYWdlX2FkZHJlc3MocGFnZSk7CisJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJc2l6ZV90IHRoaXNfbGVuID0gbWluX3Qoc2l6ZV90LCBsZW4sIFBBR0VfU0laRSAtIG9mZnNldCk7CisJCXZlY1tpXS5pb3ZfYmFzZSA9IHBhZ2VfYWRkcmVzcyhwYWdlc1tpXSkgKyBvZmZzZXQ7CiAJCXZlY1tpXS5pb3ZfbGVuID0gdGhpc19sZW47Ci0JCXNwZC5wYWdlc1tpXSA9IHBhZ2U7Ci0JCXNwZC5ucl9wYWdlcysrOwogCQlsZW4gLT0gdGhpc19sZW47CiAJCW9mZnNldCA9IDA7CiAJfQogCi0JcmVzID0ga2VybmVsX3JlYWR2KGluLCB2ZWMsIHNwZC5ucl9wYWdlcywgKnBwb3MpOwotCWlmIChyZXMgPCAwKSB7Ci0JCWVycm9yID0gcmVzOwotCQlnb3RvIGVycjsKLQl9Ci0KLQllcnJvciA9IDA7Ci0JaWYgKCFyZXMpCi0JCWdvdG8gZXJyOwotCi0JbnJfZnJlZWQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBzcGQubnJfcGFnZXM7IGkrKykgewotCQl0aGlzX2xlbiA9IG1pbl90KHNpemVfdCwgdmVjW2ldLmlvdl9sZW4sIHJlcyk7Ci0JCXNwZC5wYXJ0aWFsW2ldLm9mZnNldCA9IDA7Ci0JCXNwZC5wYXJ0aWFsW2ldLmxlbiA9IHRoaXNfbGVuOwotCQlpZiAoIXRoaXNfbGVuKSB7Ci0JCQlfX2ZyZWVfcGFnZShzcGQucGFnZXNbaV0pOwotCQkJc3BkLnBhZ2VzW2ldID0gTlVMTDsKLQkJCW5yX2ZyZWVkKys7Ci0JCX0KLQkJcmVzIC09IHRoaXNfbGVuOwotCX0KLQlzcGQubnJfcGFnZXMgLT0gbnJfZnJlZWQ7Ci0KLQlyZXMgPSBzcGxpY2VfdG9fcGlwZShwaXBlLCAmc3BkKTsKLQlpZiAocmVzID4gMCkKKwlyZXMgPSBrZXJuZWxfcmVhZHYoaW4sIHZlYywgbnJfcGFnZXMsICpwcG9zKTsKKwlpZiAocmVzID4gMCkgeworCQljb3BpZWQgPSByZXM7CiAJCSpwcG9zICs9IHJlczsKKwl9CiAKLXNocmlua19yZXQ6CiAJaWYgKHZlYyAhPSBfX3ZlYykKIAkJa2ZyZWUodmVjKTsKLQlzcGxpY2Vfc2hyaW5rX3NwZCgmc3BkKTsKK291dDoKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykKKwkJcHV0X3BhZ2UocGFnZXNbaV0pOworCWt2ZnJlZShwYWdlcyk7CisJaW92X2l0ZXJfYWR2YW5jZSgmdG8sIGNvcGllZCk7CS8qIHRydW5jYXRlcyBhbmQgZGlzY2FyZHMgKi8KIAlyZXR1cm4gcmVzOwotCi1lcnI6Ci0JZm9yIChpID0gMDsgaSA8IHNwZC5ucl9wYWdlczsgaSsrKQotCQlfX2ZyZWVfcGFnZShzcGQucGFnZXNbaV0pOwotCi0JcmVzID0gZXJyb3I7Ci0JZ290byBzaHJpbmtfcmV0OwogfQotRVhQT1JUX1NZTUJPTChkZWZhdWx0X2ZpbGVfc3BsaWNlX3JlYWQpOwogCiAvKgogICogU2VuZCAnc2QtPmxlbicgYnl0ZXMgdG8gc29ja2V0IGZyb20gJ3NkLT5maWxlJyBhdCBwb3NpdGlvbiAnc2QtPnBvcycKQEAgLTc1NywxMyArNTE1LDEyIEBACiAKIAl3aGlsZSAocGlwZS0+bnJidWZzKSB7CiAJCXN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmID0gcGlwZS0+YnVmcyArIHBpcGUtPmN1cmJ1ZjsKLQkJY29uc3Qgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgKm9wcyA9IGJ1Zi0+b3BzOwogCiAJCXNkLT5sZW4gPSBidWYtPmxlbjsKIAkJaWYgKHNkLT5sZW4gPiBzZC0+dG90YWxfbGVuKQogCQkJc2QtPmxlbiA9IHNkLT50b3RhbF9sZW47CiAKLQkJcmV0ID0gYnVmLT5vcHMtPmNvbmZpcm0ocGlwZSwgYnVmKTsKKwkJcmV0ID0gcGlwZV9idWZfY29uZmlybShwaXBlLCBidWYpOwogCQlpZiAodW5saWtlbHkocmV0KSkgewogCQkJaWYgKHJldCA9PSAtRU5PREFUQSkKIAkJCQlyZXQgPSAwOwpAQCAtNzgzLDggKzU0MCw3IEBACiAJCXNkLT50b3RhbF9sZW4gLT0gcmV0OwogCiAJCWlmICghYnVmLT5sZW4pIHsKLQkJCWJ1Zi0+b3BzID0gTlVMTDsKLQkJCW9wcy0+cmVsZWFzZShwaXBlLCBidWYpOworCQkJcGlwZV9idWZfcmVsZWFzZShwaXBlLCBidWYpOwogCQkJcGlwZS0+Y3VyYnVmID0gKHBpcGUtPmN1cmJ1ZiArIDEpICYgKHBpcGUtPmJ1ZmZlcnMgLSAxKTsKIAkJCXBpcGUtPm5yYnVmcy0tOwogCQkJaWYgKHBpcGUtPmZpbGVzKQpAQCAtMTAwMyw3ICs3NTksNyBAQAogCQkJaWYgKGlkeCA9PSBwaXBlLT5idWZmZXJzIC0gMSkKIAkJCQlpZHggPSAtMTsKIAotCQkJcmV0ID0gYnVmLT5vcHMtPmNvbmZpcm0ocGlwZSwgYnVmKTsKKwkJCXJldCA9IHBpcGVfYnVmX2NvbmZpcm0ocGlwZSwgYnVmKTsKIAkJCWlmICh1bmxpa2VseShyZXQpKSB7CiAJCQkJaWYgKHJldCA9PSAtRU5PREFUQSkKIAkJCQkJcmV0ID0gMDsKQEAgLTEwMzAsMTEgKzc4Niw5IEBACiAJCXdoaWxlIChyZXQpIHsKIAkJCXN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmID0gcGlwZS0+YnVmcyArIHBpcGUtPmN1cmJ1ZjsKIAkJCWlmIChyZXQgPj0gYnVmLT5sZW4pIHsKLQkJCQljb25zdCBzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyAqb3BzID0gYnVmLT5vcHM7CiAJCQkJcmV0IC09IGJ1Zi0+bGVuOwogCQkJCWJ1Zi0+bGVuID0gMDsKLQkJCQlidWYtPm9wcyA9IE5VTEw7Ci0JCQkJb3BzLT5yZWxlYXNlKHBpcGUsIGJ1Zik7CisJCQkJcGlwZV9idWZfcmVsZWFzZShwaXBlLCBidWYpOwogCQkJCXBpcGUtPmN1cmJ1ZiA9IChwaXBlLT5jdXJidWYgKyAxKSAmIChwaXBlLT5idWZmZXJzIC0gMSk7CiAJCQkJcGlwZS0+bnJidWZzLS07CiAJCQkJaWYgKHBpcGUtPmZpbGVzKQpAQCAtMTI3MywxMCArMTAyNyw4IEBACiAJZm9yIChpID0gMDsgaSA8IHBpcGUtPmJ1ZmZlcnM7IGkrKykgewogCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiA9IHBpcGUtPmJ1ZnMgKyBpOwogCi0JCWlmIChidWYtPm9wcykgewotCQkJYnVmLT5vcHMtPnJlbGVhc2UocGlwZSwgYnVmKTsKLQkJCWJ1Zi0+b3BzID0gTlVMTDsKLQkJfQorCQlpZiAoYnVmLT5vcHMpCisJCQlwaXBlX2J1Zl9yZWxlYXNlKHBpcGUsIGJ1Zik7CiAJfQogCiAJaWYgKCFieXRlcykKQEAgLTEzNDIsNiArMTA5NCwyMCBAQAogfQogRVhQT1JUX1NZTUJPTChkb19zcGxpY2VfZGlyZWN0KTsKIAorc3RhdGljIGludCB3YWl0X2Zvcl9zcGFjZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCB1bnNpZ25lZCBmbGFncykKK3sKKwl3aGlsZSAocGlwZS0+bnJidWZzID09IHBpcGUtPmJ1ZmZlcnMpIHsKKwkJaWYgKGZsYWdzICYgU1BMSUNFX0ZfTk9OQkxPQ0spCisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJcGlwZS0+d2FpdGluZ193cml0ZXJzKys7CisJCXBpcGVfd2FpdChwaXBlKTsKKwkJcGlwZS0+d2FpdGluZ193cml0ZXJzLS07CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHNwbGljZV9waXBlX3RvX3BpcGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaXBpcGUsCiAJCQkgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqb3BpcGUsCiAJCQkgICAgICAgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKTsKQEAgLTE0MjQsOCArMTE5MCwxMyBAQAogCQkJb2Zmc2V0ID0gaW4tPmZfcG9zOwogCQl9CiAKLQkJcmV0ID0gZG9fc3BsaWNlX3RvKGluLCAmb2Zmc2V0LCBvcGlwZSwgbGVuLCBmbGFncyk7Ci0KKwkJcGlwZV9sb2NrKG9waXBlKTsKKwkJcmV0ID0gd2FpdF9mb3Jfc3BhY2Uob3BpcGUsIGZsYWdzKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBkb19zcGxpY2VfdG8oaW4sICZvZmZzZXQsIG9waXBlLCBsZW4sIGZsYWdzKTsKKwkJcGlwZV91bmxvY2sob3BpcGUpOworCQlpZiAocmV0ID4gMCkKKwkJCXdha2V1cF9waXBlX3JlYWRlcnMob3BpcGUpOwogCQlpZiAoIW9mZl9pbikKIAkJCWluLT5mX3BvcyA9IG9mZnNldDsKIAkJZWxzZSBpZiAoY29weV90b191c2VyKG9mZl9pbiwgJm9mZnNldCwgc2l6ZW9mKGxvZmZfdCkpKQpAQCAtMTQzNywxMDYgKzEyMDgsNTAgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotLyoKLSAqIE1hcCBhbiBpb3YgaW50byBhbiBhcnJheSBvZiBwYWdlcyBhbmQgb2Zmc2V0L2xlbmd0aCB0dXBwbGVzLiBXaXRoIHRoZQotICogcGFydGlhbF9wYWdlIHN0cnVjdHVyZSwgd2UgY2FuIG1hcCBzZXZlcmFsIG5vbi1jb250aWd1b3VzIHJhbmdlcyBpbnRvCi0gKiBvdXIgb25lcyBwYWdlc1tdIG1hcCBpbnN0ZWFkIG9mIHNwbGl0dGluZyB0aGF0IG9wZXJhdGlvbiBpbnRvIHBpZWNlcy4KLSAqIENvdWxkIGVhc2lseSBiZSBleHBvcnRlZCBhcyBhIGdlbmVyaWMgaGVscGVyIGZvciBvdGhlciB1c2VycywgaW4gd2hpY2gKLSAqIGNhc2Ugb25lIHdvdWxkIHByb2JhYmx5IHdhbnQgdG8gYWRkIGEgJ21heF9ucl9wYWdlcycgcGFyYW1ldGVyIGFzIHdlbGwuCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X2lvdmVjX3BhZ2VfYXJyYXkoY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqaW92LAotCQkJCXVuc2lnbmVkIGludCBucl92ZWNzLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAotCQkJCXN0cnVjdCBwYXJ0aWFsX3BhZ2UgKnBhcnRpYWwsIGJvb2wgYWxpZ25lZCwKLQkJCQl1bnNpZ25lZCBpbnQgcGlwZV9idWZmZXJzKQorc3RhdGljIGludCBpdGVyX3RvX3BpcGUoc3RydWN0IGlvdl9pdGVyICpmcm9tLAorCQkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKKwkJCXVuc2lnbmVkIGZsYWdzKQogewotCWludCBidWZmZXJzID0gMCwgZXJyb3IgPSAwOworCXN0cnVjdCBwaXBlX2J1ZmZlciBidWYgPSB7CisJCS5vcHMgPSAmdXNlcl9wYWdlX3BpcGVfYnVmX29wcywKKwkJLmZsYWdzID0gZmxhZ3MKKwl9OworCXNpemVfdCB0b3RhbCA9IDA7CisJaW50IHJldCA9IDA7CisJYm9vbCBmYWlsZWQgPSBmYWxzZTsKIAotCXdoaWxlIChucl92ZWNzKSB7Ci0JCXVuc2lnbmVkIGxvbmcgb2ZmLCBucGFnZXM7Ci0JCXN0cnVjdCBpb3ZlYyBlbnRyeTsKLQkJdm9pZCBfX3VzZXIgKmJhc2U7Ci0JCXNpemVfdCBsZW47Ci0JCWludCBpOworCXdoaWxlIChpb3ZfaXRlcl9jb3VudChmcm9tKSAmJiAhZmFpbGVkKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlc1sxNl07CisJCXNzaXplX3QgY29waWVkOworCQlzaXplX3Qgc3RhcnQ7CisJCWludCBuOwogCi0JCWVycm9yID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbnRyeSwgaW92LCBzaXplb2YoZW50cnkpKSkKKwkJY29waWVkID0gaW92X2l0ZXJfZ2V0X3BhZ2VzKGZyb20sIHBhZ2VzLCB+MFVMLCAxNiwgJnN0YXJ0KTsKKwkJaWYgKGNvcGllZCA8PSAwKSB7CisJCQlyZXQgPSBjb3BpZWQ7CiAJCQlicmVhazsKLQotCQliYXNlID0gZW50cnkuaW92X2Jhc2U7Ci0JCWxlbiA9IGVudHJ5Lmlvdl9sZW47Ci0KLQkJLyoKLQkJICogU2FuaXR5IGNoZWNrIHRoaXMgaW92ZWMuIDAgcmVhZCBzdWNjZWVkcy4KLQkJICovCi0JCWVycm9yID0gMDsKLQkJaWYgKHVubGlrZWx5KCFsZW4pKQotCQkJYnJlYWs7Ci0JCWVycm9yID0gLUVGQVVMVDsKLQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJhc2UsIGxlbikpCi0JCQlicmVhazsKLQotCQkvKgotCQkgKiBHZXQgdGhpcyBiYXNlIG9mZnNldCBhbmQgbnVtYmVyIG9mIHBhZ2VzLCB0aGVuIG1hcAotCQkgKiBpbiB0aGUgdXNlciBwYWdlcy4KLQkJICovCi0JCW9mZiA9ICh1bnNpZ25lZCBsb25nKSBiYXNlICYgflBBR0VfTUFTSzsKLQotCQkvKgotCQkgKiBJZiBhc2tlZCBmb3IgYWxpZ25tZW50LCB0aGUgb2Zmc2V0IG11c3QgYmUgemVybyBhbmQgdGhlCi0JCSAqIGxlbmd0aCBhIG11bHRpcGxlIG9mIHRoZSBQQUdFX1NJWkUuCi0JCSAqLwotCQllcnJvciA9IC1FSU5WQUw7Ci0JCWlmIChhbGlnbmVkICYmIChvZmYgfHwgbGVuICYgflBBR0VfTUFTSykpCi0JCQlicmVhazsKLQotCQlucGFnZXMgPSAob2ZmICsgbGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKLQkJaWYgKG5wYWdlcyA+IHBpcGVfYnVmZmVycyAtIGJ1ZmZlcnMpCi0JCQlucGFnZXMgPSBwaXBlX2J1ZmZlcnMgLSBidWZmZXJzOwotCi0JCWVycm9yID0gZ2V0X3VzZXJfcGFnZXNfZmFzdCgodW5zaWduZWQgbG9uZyliYXNlLCBucGFnZXMsCi0JCQkJCTAsICZwYWdlc1tidWZmZXJzXSk7Ci0KLQkJaWYgKHVubGlrZWx5KGVycm9yIDw9IDApKQotCQkJYnJlYWs7Ci0KLQkJLyoKLQkJICogRmlsbCB0aGlzIGNvbnRpZ3VvdXMgcmFuZ2UgaW50byB0aGUgcGFydGlhbCBwYWdlIG1hcC4KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBlcnJvcjsgaSsrKSB7Ci0JCQljb25zdCBpbnQgcGxlbiA9IG1pbl90KHNpemVfdCwgbGVuLCBQQUdFX1NJWkUgLSBvZmYpOwotCi0JCQlwYXJ0aWFsW2J1ZmZlcnNdLm9mZnNldCA9IG9mZjsKLQkJCXBhcnRpYWxbYnVmZmVyc10ubGVuID0gcGxlbjsKLQotCQkJb2ZmID0gMDsKLQkJCWxlbiAtPSBwbGVuOwotCQkJYnVmZmVycysrOwogCQl9CiAKLQkJLyoKLQkJICogV2UgZGlkbid0IGNvbXBsZXRlIHRoaXMgaW92LCBzdG9wIGhlcmUgc2luY2UgaXQgcHJvYmFibHkKLQkJICogbWVhbnMgd2UgaGF2ZSB0byBtb3ZlIHNvbWUgb2YgdGhpcyBpbnRvIGEgcGlwZSB0bwotCQkgKiBiZSBhYmxlIHRvIGNvbnRpbnVlLgotCQkgKi8KLQkJaWYgKGxlbikKLQkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIERvbid0IGNvbnRpbnVlIGlmIHdlIG1hcHBlZCBmZXdlciBwYWdlcyB0aGFuIHdlIGFza2VkIGZvciwKLQkJICogb3IgaWYgd2UgbWFwcGVkIHRoZSBtYXggbnVtYmVyIG9mIHBhZ2VzIHRoYXQgd2UgaGF2ZQotCQkgKiByb29tIGZvci4KLQkJICovCi0JCWlmIChlcnJvciA8IG5wYWdlcyB8fCBidWZmZXJzID09IHBpcGVfYnVmZmVycykKLQkJCWJyZWFrOwotCi0JCW5yX3ZlY3MtLTsKLQkJaW92Kys7CisJCWZvciAobiA9IDA7IGNvcGllZDsgbisrLCBzdGFydCA9IDApIHsKKwkJCWludCBzaXplID0gbWluX3QoaW50LCBjb3BpZWQsIFBBR0VfU0laRSAtIHN0YXJ0KTsKKwkJCWlmICghZmFpbGVkKSB7CisJCQkJYnVmLnBhZ2UgPSBwYWdlc1tuXTsKKwkJCQlidWYub2Zmc2V0ID0gc3RhcnQ7CisJCQkJYnVmLmxlbiA9IHNpemU7CisJCQkJcmV0ID0gYWRkX3RvX3BpcGUocGlwZSwgJmJ1Zik7CisJCQkJaWYgKHVubGlrZWx5KHJldCA8IDApKSB7CisJCQkJCWZhaWxlZCA9IHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW92X2l0ZXJfYWR2YW5jZShmcm9tLCByZXQpOworCQkJCQl0b3RhbCArPSByZXQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwdXRfcGFnZShwYWdlc1tuXSk7CisJCQl9CisJCQljb3BpZWQgLT0gc2l6ZTsKKwkJfQogCX0KLQotCWlmIChidWZmZXJzKQotCQlyZXR1cm4gYnVmZmVyczsKLQotCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gdG90YWwgPyB0b3RhbCA6IHJldDsKIH0KIAogc3RhdGljIGludCBwaXBlX3RvX3VzZXIoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IHBpcGVfYnVmZmVyICpidWYsCkBAIC0xNTkwLDM4ICsxMzA1LDM2IEBACiAgKiBhcyBzcGxpY2UtZnJvbS1tZW1vcnksIHdoZXJlIHRoZSByZWd1bGFyIHNwbGljZSBpcyBzcGxpY2UtZnJvbS1maWxlIChvcgogICogdG8gZmlsZSkuIEluIGJvdGggY2FzZXMgdGhlIG91dHB1dCBpcyBhIHBpcGUsIG5hdHVyYWxseS4KICAqLwotc3RhdGljIGxvbmcgdm1zcGxpY2VfdG9fcGlwZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqaW92LAorc3RhdGljIGxvbmcgdm1zcGxpY2VfdG9fcGlwZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqdWlvdiwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZXNbUElQRV9ERUZfQlVGRkVSU107Ci0Jc3RydWN0IHBhcnRpYWxfcGFnZSBwYXJ0aWFsW1BJUEVfREVGX0JVRkZFUlNdOwotCXN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjIHNwZCA9IHsKLQkJLnBhZ2VzID0gcGFnZXMsCi0JCS5wYXJ0aWFsID0gcGFydGlhbCwKLQkJLm5yX3BhZ2VzX21heCA9IFBJUEVfREVGX0JVRkZFUlMsCi0JCS5mbGFncyA9IGZsYWdzLAotCQkub3BzID0gJnVzZXJfcGFnZV9waXBlX2J1Zl9vcHMsCi0JCS5zcGRfcmVsZWFzZSA9IHNwZF9yZWxlYXNlX3BhZ2UsCi0JfTsKKwlzdHJ1Y3QgaW92ZWMgaW92c3RhY2tbVUlPX0ZBU1RJT1ZdOworCXN0cnVjdCBpb3ZlYyAqaW92ID0gaW92c3RhY2s7CisJc3RydWN0IGlvdl9pdGVyIGZyb207CiAJbG9uZyByZXQ7CisJdW5zaWduZWQgYnVmX2ZsYWcgPSAwOworCisJaWYgKGZsYWdzICYgU1BMSUNFX0ZfR0lGVCkKKwkJYnVmX2ZsYWcgPSBQSVBFX0JVRl9GTEFHX0dJRlQ7CiAKIAlwaXBlID0gZ2V0X3BpcGVfaW5mbyhmaWxlKTsKIAlpZiAoIXBpcGUpCiAJCXJldHVybiAtRUJBREY7CiAKLQlpZiAoc3BsaWNlX2dyb3dfc3BkKHBpcGUsICZzcGQpKQotCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSBpbXBvcnRfaW92ZWMoV1JJVEUsIHVpb3YsIG5yX3NlZ3MsCisJCQkgICBBUlJBWV9TSVpFKGlvdnN0YWNrKSwgJmlvdiwgJmZyb20pOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCi0Jc3BkLm5yX3BhZ2VzID0gZ2V0X2lvdmVjX3BhZ2VfYXJyYXkoaW92LCBucl9zZWdzLCBzcGQucGFnZXMsCi0JCQkJCSAgICBzcGQucGFydGlhbCwgZmFsc2UsCi0JCQkJCSAgICBzcGQubnJfcGFnZXNfbWF4KTsKLQlpZiAoc3BkLm5yX3BhZ2VzIDw9IDApCi0JCXJldCA9IHNwZC5ucl9wYWdlczsKLQllbHNlCi0JCXJldCA9IHNwbGljZV90b19waXBlKHBpcGUsICZzcGQpOwotCi0Jc3BsaWNlX3Nocmlua19zcGQoJnNwZCk7CisJcGlwZV9sb2NrKHBpcGUpOworCXJldCA9IHdhaXRfZm9yX3NwYWNlKHBpcGUsIGZsYWdzKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gaXRlcl90b19waXBlKCZmcm9tLCBwaXBlLCBidWZfZmxhZyk7CisJcGlwZV91bmxvY2socGlwZSk7CisJaWYgKHJldCA+IDApCisJCXdha2V1cF9waXBlX3JlYWRlcnMocGlwZSk7CisJa2ZyZWUoaW92KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xODc2LDcgKzE1ODksNyBAQAogCQkJICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoaXMgcGlwZSBidWZmZXIsCiAJCQkgKiBzbyB3ZSBjYW4gY29weSB0aGUgY29udGVudHMgb3Zlci4KIAkJCSAqLwotCQkJaWJ1Zi0+b3BzLT5nZXQoaXBpcGUsIGlidWYpOworCQkJcGlwZV9idWZfZ2V0KGlwaXBlLCBpYnVmKTsKIAkJCSpvYnVmID0gKmlidWY7CiAKIAkJCS8qCkBAIC0xOTQ4LDcgKzE2NjEsNyBAQAogCQkgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhpcyBwaXBlIGJ1ZmZlciwKIAkJICogc28gd2UgY2FuIGNvcHkgdGhlIGNvbnRlbnRzIG92ZXIuCiAJCSAqLwotCQlpYnVmLT5vcHMtPmdldChpcGlwZSwgaWJ1Zik7CisJCXBpcGVfYnVmX2dldChpcGlwZSwgaWJ1Zik7CiAKIAkJb2J1ZiA9IG9waXBlLT5idWZzICsgbmJ1ZjsKIAkJKm9idWYgPSAqaWJ1ZjsKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2ZpbGUuYyBiL2ZzL3N5c2ZzL2ZpbGUuYwppbmRleCBmMzU1MjNkLi5iODAzMjEzIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9maWxlLmMKKysrIGIvZnMvc3lzZnMvZmlsZS5jCkBAIC0xMTQsOSArMTE0LDE1IEBACiAJICogSWYgYnVmICE9IG9mLT5wcmVhbGxvY19idWYsIHdlIGRvbid0IGtub3cgaG93CiAJICogbGFyZ2UgaXQgaXMsIHNvIGNhbm5vdCBzYWZlbHkgcGFzcyBpdCB0byAtPnNob3cKIAkgKi8KLQlpZiAocG9zIHx8IFdBUk5fT05fT05DRShidWYgIT0gb2YtPnByZWFsbG9jX2J1ZikpCisJaWYgKFdBUk5fT05fT05DRShidWYgIT0gb2YtPnByZWFsbG9jX2J1ZikpCiAJCXJldHVybiAwOwogCWxlbiA9IG9wcy0+c2hvdyhrb2JqLCBvZi0+a24tPnByaXYsIGJ1Zik7CisJaWYgKHBvcykgeworCQlpZiAobGVuIDw9IHBvcykKKwkJCXJldHVybiAwOworCQlsZW4gLT0gcG9zOworCQltZW1tb3ZlKGJ1ZiwgYnVmICsgcG9zLCBsZW4pOworCX0KIAlyZXR1cm4gbWluKGNvdW50LCBsZW4pOwogfQogCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9ncm91cC5jIGIvZnMvc3lzZnMvZ3JvdXAuYwppbmRleCBkYzEzNThiLi5hYzJkZTBlIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9ncm91cC5jCisrKyBiL2ZzL3N5c2ZzL2dyb3VwLmMKQEAgLTIzMyw4ICsyMzMsOCBAQAogCQlrbiA9IGtlcm5mc19maW5kX2FuZF9nZXQocGFyZW50LCBncnAtPm5hbWUpOwogCQlpZiAoIWtuKSB7CiAJCQlXQVJOKCFrbiwgS0VSTl9XQVJOSU5HCi0JCQkgICAgICJzeXNmcyBncm91cCAlcCBub3QgZm91bmQgZm9yIGtvYmplY3QgJyVzJ1xuIiwKLQkJCSAgICAgZ3JwLCBrb2JqZWN0X25hbWUoa29iaikpOworCQkJICAgICAic3lzZnMgZ3JvdXAgJyVzJyBub3QgZm91bmQgZm9yIGtvYmplY3QgJyVzJ1xuIiwKKwkJCSAgICAgZ3JwLT5uYW1lLCBrb2JqZWN0X25hbWUoa29iaikpOwogCQkJcmV0dXJuOwogCQl9CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2ZzL3VkZi9maWxlLmMgYi9mcy91ZGYvZmlsZS5jCmluZGV4IDYzMjU3MDYuLmU4NTViZjggMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9maWxlLmMKKysrIGIvZnMvdWRmL2ZpbGUuYwpAQCAtOTQsNyArOTQsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAkqcGFnZXAgPSBwYWdlOwogCi0JaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgJiYgbGVuICE9IFBBR0VfU0laRSkKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKIAkJX191ZGZfYWRpbmljYl9yZWFkcGFnZShwYWdlKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNSwxMSArMTA1LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdWRmX2FkaW5pY2Jfd3JpdGVfZW5kKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkgbG9mZl90IHBvcywgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjb3BpZWQsCisJCQkJIHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpmc2RhdGEpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJbG9mZl90IGxhc3RfcG9zID0gcG9zICsgY29waWVkOworCWlmIChsYXN0X3BvcyA+IGlub2RlLT5pX3NpemUpCisJCWlfc2l6ZV93cml0ZShpbm9kZSwgbGFzdF9wb3MpOworCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXB1dF9wYWdlKHBhZ2UpOworCXJldHVybiBjb3BpZWQ7Cit9CisKIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdWRmX2FkaW5pY2JfYW9wcyA9IHsKIAkucmVhZHBhZ2UJPSB1ZGZfYWRpbmljYl9yZWFkcGFnZSwKIAkud3JpdGVwYWdlCT0gdWRmX2FkaW5pY2Jfd3JpdGVwYWdlLAogCS53cml0ZV9iZWdpbgk9IHVkZl9hZGluaWNiX3dyaXRlX2JlZ2luLAotCS53cml0ZV9lbmQJPSBzaW1wbGVfd3JpdGVfZW5kLAorCS53cml0ZV9lbmQJPSB1ZGZfYWRpbmljYl93cml0ZV9lbmQsCiAJLmRpcmVjdF9JTwk9IHVkZl9hZGluaWNiX2RpcmVjdF9JTywKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9NYWtlZmlsZSBiL2ZzL3hmcy9NYWtlZmlsZQppbmRleCBmYzU5M2M4Li41ODRlODdlIDEwMDY0NAotLS0gYS9mcy94ZnMvTWFrZWZpbGUKKysrIGIvZnMveGZzL01ha2VmaWxlCkBAIC01Miw2ICs1Miw3IEBACiAJCQkJICAgeGZzX2lub2RlX2ZvcmsubyBcCiAJCQkJICAgeGZzX2lub2RlX2J1Zi5vIFwKIAkJCQkgICB4ZnNfbG9nX3JsaW1pdC5vIFwKKwkJCQkgICB4ZnNfYWdfcmVzdi5vIFwKIAkJCQkgICB4ZnNfcm1hcC5vIFwKIAkJCQkgICB4ZnNfcm1hcF9idHJlZS5vIFwKIAkJCQkgICB4ZnNfc2IubyBcCmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19hZ19yZXN2LmMgYi9mcy94ZnMvbGlieGZzL3hmc19hZ19yZXN2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhZTBmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2FnX3Jlc3YuYwpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBPcmFjbGUuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIEF1dGhvcjogRGFycmljayBKLiBXb25nIDxkYXJyaWNrLndvbmdAb3JhY2xlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCisjaW5jbHVkZSAieGZzX3NoYXJlZC5oIgorI2luY2x1ZGUgInhmc19mb3JtYXQuaCIKKyNpbmNsdWRlICJ4ZnNfbG9nX2Zvcm1hdC5oIgorI2luY2x1ZGUgInhmc190cmFuc19yZXN2LmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2RlZmVyLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX3RyYWNlLmgiCisjaW5jbHVkZSAieGZzX2Nrc3VtLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWdfcmVzdi5oIgorI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgorI2luY2x1ZGUgInhmc19ybWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisKKy8qCisgKiBQZXItQUcgQmxvY2sgUmVzZXJ2YXRpb25zCisgKgorICogRm9yIHNvbWUga2luZHMgb2YgYWxsb2NhdGlvbiBncm91cCBtZXRhZGF0YSBzdHJ1Y3R1cmVzLCBpdCBpcyBhZHZhbnRhZ2VvdXMKKyAqIHRvIHJlc2VydmUgYSBzbWFsbCBudW1iZXIgb2YgYmxvY2tzIGluIGVhY2ggQUcgc28gdGhhdCBmdXR1cmUgZXhwYW5zaW9ucyBvZgorICogdGhhdCBkYXRhIHN0cnVjdHVyZSBkbyBub3QgZW5jb3VudGVyIEVOT1NQQyBiZWNhdXNlIGVycm9ycyBkdXJpbmcgYSBidHJlZQorICogc3BsaXQgY2F1c2UgdGhlIGZpbGVzeXN0ZW0gdG8gZ28gb2ZmbGluZS4KKyAqCisgKiBQcmlvciB0byB0aGUgaW50cm9kdWN0aW9uIG9mIHJlZmxpbmssIHRoaXMgd2Fzbid0IGFuIGlzc3VlIGJlY2F1c2UgdGhlIGZyZWUKKyAqIHNwYWNlIGJ0cmVlcyBtYWludGFpbiBhIHJlc2VydmUgb2Ygc3BhY2UgKHRoZSBBR0ZMKSB0byBoYW5kbGUgYW55IGV4cGFuc2lvbgorICogdGhhdCBtYXkgYmUgbmVjZXNzYXJ5OyBhbmQgYWxsb2NhdGlvbnMgb2Ygb3RoZXIgbWV0YWRhdGEgKGlub2RlcywgQk1CVCwKKyAqIGRpci9hdHRyKSBhcmVuJ3QgcmVzdHJpY3RlZCB0byBhIHNpbmdsZSBBRy4gIEhvd2V2ZXIsIHdpdGggcmVmbGluayBpdCBpcworICogcG9zc2libGUgdG8gYWxsb2NhdGUgYWxsIHRoZSBzcGFjZSBpbiBhbiBBRywgaGF2ZSBzdWJzZXF1ZW50IHJlZmxpbmsvQ29XCisgKiBhY3Rpdml0eSBleHBhbmQgdGhlIHJlZmNvdW50IGJ0cmVlLCBhbmQgZGlzY292ZXIgdGhhdCB0aGVyZSdzIG5vIHNwYWNlIGxlZnQKKyAqIHRvIGhhbmRsZSB0aGF0IGV4cGFuc2lvbi4gIFNpbmNlIHdlIGNhbiBjYWxjdWxhdGUgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUKKyAqIHJlZmNvdW50IGJ0cmVlLCB3ZSBjYW4gcmVzZXJ2ZSBzcGFjZSBmb3IgaXQgYW5kIGF2b2lkIEVOT1NQQy4KKyAqCisgKiBIYW5kbGluZyBwZXItQUcgcmVzZXJ2YXRpb25zIGNvbnNpc3RzIG9mIHRocmVlIGNoYW5nZXMgdG8gdGhlIGFsbG9jYXRvcidzCisgKiBiZWhhdmlvcjogIEZpcnN0LCBiZWNhdXNlIHRoZXNlIHJlc2VydmF0aW9ucyBhcmUgYWx3YXlzIG5lZWRlZCwgd2UgZGVjcmVhc2UKKyAqIHRoZSBhZ19tYXhfdXNhYmxlIGNvdW50ZXIgdG8gcmVmbGVjdCB0aGUgc2l6ZSBvZiB0aGUgQUcgYWZ0ZXIgdGhlIHJlc2VydmVkCisgKiBibG9ja3MgYXJlIHRha2VuLiAgU2Vjb25kLCB0aGUgcmVzZXJ2YXRpb25zIG11c3QgYmUgcmVmbGVjdGVkIGluIHRoZQorICogZmRibG9ja3MgY291bnQgdG8gbWFpbnRhaW4gcHJvcGVyIGFjY291bnRpbmcuICBUaGlyZCwgZWFjaCBBRyBtdXN0IG1haW50YWluCisgKiBpdHMgb3duIHJlc2VydmVkIGJsb2NrIGNvdW50ZXIgc28gdGhhdCB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBhbW91bnQgb2Ygc3BhY2UKKyAqIHRoYXQgbXVzdCByZW1haW4gZnJlZSB0byBtYWludGFpbiB0aGUgcmVzZXJ2YXRpb25zLiAgRm91cnRoLCB0aGUgInJlbWFpbmluZworICogcmVzZXJ2ZWQgYmxvY2tzIiBjb3VudCBtdXN0IGJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgbGVuZ3RoIG9mIHRoZQorICogbG9uZ2VzdCBmcmVlIGV4dGVudCBpbiBhbiBBRyBhbmQgdG8gY2xhbXAgbWF4bGVuIGluIHRoZSBwZXItQUcgYWxsb2NhdGlvbgorICogZnVuY3Rpb25zLiAgSW4gb3RoZXIgd29yZHMsIHdlIG1haW50YWluIGEgdmlydHVhbCBhbGxvY2F0aW9uIHZpYSBpbi1jb3JlCisgKiBhY2NvdW50aW5nIHRyaWNrcyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY2xlYW4gdXAgYWZ0ZXIgYSBjcmFzaC4gOikKKyAqCisgKiBSZXNlcnZlZCBibG9ja3MgY2FuIGJlIG1hbmFnZWQgYnkgcGFzc2luZyBvbmUgb2YgdGhlIGVudW0geGZzX2FnX3Jlc3ZfdHlwZQorICogdmFsdWVzIHZpYSBzdHJ1Y3QgeGZzX2FsbG9jX2FyZyBvciBkaXJlY3RseSB0byB0aGUgeGZzX2ZyZWVfZXh0ZW50CisgKiBmdW5jdGlvbi4gIEl0IG1pZ2h0IHNlZW0gYSBsaXR0bGUgZnVubnkgdG8gbWFpbnRhaW4gYSByZXNlcnZvaXIgb2YgYmxvY2tzCisgKiB0byBmZWVkIGFub3RoZXIgcmVzZXJ2b2lyLCBidXQgdGhlIEFHRkwgb25seSBob2xkcyBlbm91Z2ggYmxvY2tzIHRvIGdldAorICogdGhyb3VnaCB0aGUgbmV4dCB0cmFuc2FjdGlvbi4gIFRoZSBwZXItQUcgcmVzZXJ2YXRpb24gaXMgdG8gZW5zdXJlICh3ZQorICogaG9wZSkgdGhhdCBlYWNoIEFHIG5ldmVyIHJ1bnMgb3V0IG9mIGJsb2Nrcy4gIEVhY2ggZGF0YSBzdHJ1Y3R1cmUgd2FudGluZworICogdG8gdXNlIHRoZSByZXNlcnZhdGlvbiBzeXN0ZW0gc2hvdWxkIHVwZGF0ZSBhc2svdXNlZCBpbiB4ZnNfYWdfcmVzdl9pbml0LgorICovCisKKy8qCisgKiBBcmUgd2UgY3JpdGljYWxseSBsb3cgb24gYmxvY2tzPyAgRm9yIG5vdyB3ZSdsbCBkZWZpbmUgdGhhdCBhcyB0aGUgbnVtYmVyCisgKiBvZiBibG9ja3Mgd2UgY2FuIGdldCBvdXIgaGFuZHMgb24gYmVpbmcgbGVzcyB0aGFuIDEwJSBvZiB3aGF0IHdlIHJlc2VydmVkCisgKiBvciBsZXNzIHRoYW4gc29tZSBhcmJpdHJhcnkgbnVtYmVyIChtYXhpbXVtIGJ0cmVlIGhlaWdodCkuCisgKi8KK2Jvb2wKK3hmc19hZ19yZXN2X2NyaXRpY2FsKAorCXN0cnVjdCB4ZnNfcGVyYWcJCSpwYWcsCisJZW51bSB4ZnNfYWdfcmVzdl90eXBlCQl0eXBlKQoreworCXhmc19leHRsZW5fdAkJCWF2YWlsOworCXhmc19leHRsZW5fdAkJCW9yaWc7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFhGU19BR19SRVNWX01FVEFEQVRBOgorCQlhdmFpbCA9IHBhZy0+cGFnZl9mcmVlYmxrcyAtIHBhZy0+cGFnX2FnZmxfcmVzdi5hcl9yZXNlcnZlZDsKKwkJb3JpZyA9IHBhZy0+cGFnX21ldGFfcmVzdi5hcl9hc2tlZDsKKwkJYnJlYWs7CisJY2FzZSBYRlNfQUdfUkVTVl9BR0ZMOgorCQlhdmFpbCA9IHBhZy0+cGFnZl9mcmVlYmxrcyArIHBhZy0+cGFnZl9mbGNvdW50IC0KKwkJCXBhZy0+cGFnX21ldGFfcmVzdi5hcl9yZXNlcnZlZDsKKwkJb3JpZyA9IHBhZy0+cGFnX2FnZmxfcmVzdi5hcl9hc2tlZDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJdHJhY2VfeGZzX2FnX3Jlc3ZfY3JpdGljYWwocGFnLCB0eXBlLCBhdmFpbCk7CisKKwkvKiBDcml0aWNhbGx5IGxvdyBpZiBsZXNzIHRoYW4gMTAlIG9yIG1heCBidHJlZSBoZWlnaHQgcmVtYWlucy4gKi8KKwlyZXR1cm4gYXZhaWwgPCBvcmlnIC8gMTAgfHwgYXZhaWwgPCBYRlNfQlRSRUVfTUFYTEVWRUxTOworfQorCisvKgorICogSG93IG1hbnkgYmxvY2tzIGFyZSByZXNlcnZlZCBidXQgbm90IHVzZWQsIGFuZCB0aGVyZWZvcmUgbXVzdCBub3QgYmUKKyAqIGFsbG9jYXRlZCBhd2F5PworICovCit4ZnNfZXh0bGVuX3QKK3hmc19hZ19yZXN2X25lZWRlZCgKKwlzdHJ1Y3QgeGZzX3BlcmFnCQkqcGFnLAorCWVudW0geGZzX2FnX3Jlc3ZfdHlwZQkJdHlwZSkKK3sKKwl4ZnNfZXh0bGVuX3QJCQlsZW47CisKKwlsZW4gPSBwYWctPnBhZ19tZXRhX3Jlc3YuYXJfcmVzZXJ2ZWQgKyBwYWctPnBhZ19hZ2ZsX3Jlc3YuYXJfcmVzZXJ2ZWQ7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBYRlNfQUdfUkVTVl9NRVRBREFUQToKKwljYXNlIFhGU19BR19SRVNWX0FHRkw6CisJCWxlbiAtPSB4ZnNfcGVyYWdfcmVzdihwYWcsIHR5cGUpLT5hcl9yZXNlcnZlZDsKKwkJYnJlYWs7CisJY2FzZSBYRlNfQUdfUkVTVl9OT05FOgorCQkvKiBlbXB0eSAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJfQorCisJdHJhY2VfeGZzX2FnX3Jlc3ZfbmVlZGVkKHBhZywgdHlwZSwgbGVuKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qIENsZWFuIG91dCBhIHJlc2VydmF0aW9uICovCitzdGF0aWMgaW50CitfX3hmc19hZ19yZXN2X2ZyZWUoCisJc3RydWN0IHhmc19wZXJhZwkJKnBhZywKKwllbnVtIHhmc19hZ19yZXN2X3R5cGUJCXR5cGUpCit7CisJc3RydWN0IHhmc19hZ19yZXN2CQkqcmVzdjsKKwl4ZnNfZXh0bGVuX3QJCQlvbGRyZXN2OworCWludAkJCQllcnJvcjsKKworCXRyYWNlX3hmc19hZ19yZXN2X2ZyZWUocGFnLCB0eXBlLCAwKTsKKworCXJlc3YgPSB4ZnNfcGVyYWdfcmVzdihwYWcsIHR5cGUpOworCXBhZy0+cGFnX21vdW50LT5tX2FnX21heF91c2FibGUgKz0gcmVzdi0+YXJfYXNrZWQ7CisJLyoKKwkgKiBBR0ZMIGJsb2NrcyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgImZyZWUiLCBzbyB3aGF0ZXZlcgorCSAqIHdhcyByZXNlcnZlZCBhdCBtb3VudCB0aW1lIG11c3QgYmUgZ2l2ZW4gYmFjayBhdCB1bW91bnQuCisJICovCisJaWYgKHR5cGUgPT0gWEZTX0FHX1JFU1ZfQUdGTCkKKwkJb2xkcmVzdiA9IHJlc3YtPmFyX29yaWdfcmVzZXJ2ZWQ7CisJZWxzZQorCQlvbGRyZXN2ID0gcmVzdi0+YXJfcmVzZXJ2ZWQ7CisJZXJyb3IgPSB4ZnNfbW9kX2ZkYmxvY2tzKHBhZy0+cGFnX21vdW50LCBvbGRyZXN2LCB0cnVlKTsKKwlyZXN2LT5hcl9yZXNlcnZlZCA9IDA7CisJcmVzdi0+YXJfYXNrZWQgPSAwOworCisJaWYgKGVycm9yKQorCQl0cmFjZV94ZnNfYWdfcmVzdl9mcmVlX2Vycm9yKHBhZy0+cGFnX21vdW50LCBwYWctPnBhZ19hZ25vLAorCQkJCWVycm9yLCBfUkVUX0lQXyk7CisJcmV0dXJuIGVycm9yOworfQorCisvKiBGcmVlIGEgcGVyLUFHIHJlc2VydmF0aW9uLiAqLworaW50Cit4ZnNfYWdfcmVzdl9mcmVlKAorCXN0cnVjdCB4ZnNfcGVyYWcJCSpwYWcpCit7CisJaW50CQkJCWVycm9yOworCWludAkJCQllcnIyOworCisJZXJyb3IgPSBfX3hmc19hZ19yZXN2X2ZyZWUocGFnLCBYRlNfQUdfUkVTVl9BR0ZMKTsKKwllcnIyID0gX194ZnNfYWdfcmVzdl9mcmVlKHBhZywgWEZTX0FHX1JFU1ZfTUVUQURBVEEpOworCWlmIChlcnIyICYmICFlcnJvcikKKwkJZXJyb3IgPSBlcnIyOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorX194ZnNfYWdfcmVzdl9pbml0KAorCXN0cnVjdCB4ZnNfcGVyYWcJCSpwYWcsCisJZW51bSB4ZnNfYWdfcmVzdl90eXBlCQl0eXBlLAorCXhmc19leHRsZW5fdAkJCWFzaywKKwl4ZnNfZXh0bGVuX3QJCQl1c2VkKQoreworCXN0cnVjdCB4ZnNfbW91bnQJCSptcCA9IHBhZy0+cGFnX21vdW50OworCXN0cnVjdCB4ZnNfYWdfcmVzdgkJKnJlc3Y7CisJaW50CQkJCWVycm9yOworCisJcmVzdiA9IHhmc19wZXJhZ19yZXN2KHBhZywgdHlwZSk7CisJaWYgKHVzZWQgPiBhc2spCisJCWFzayA9IHVzZWQ7CisJcmVzdi0+YXJfYXNrZWQgPSBhc2s7CisJcmVzdi0+YXJfcmVzZXJ2ZWQgPSByZXN2LT5hcl9vcmlnX3Jlc2VydmVkID0gYXNrIC0gdXNlZDsKKwltcC0+bV9hZ19tYXhfdXNhYmxlIC09IGFzazsKKworCXRyYWNlX3hmc19hZ19yZXN2X2luaXQocGFnLCB0eXBlLCBhc2spOworCisJZXJyb3IgPSB4ZnNfbW9kX2ZkYmxvY2tzKG1wLCAtKGludDY0X3QpcmVzdi0+YXJfcmVzZXJ2ZWQsIHRydWUpOworCWlmIChlcnJvcikKKwkJdHJhY2VfeGZzX2FnX3Jlc3ZfaW5pdF9lcnJvcihwYWctPnBhZ19tb3VudCwgcGFnLT5wYWdfYWdubywKKwkJCQllcnJvciwgX1JFVF9JUF8pOworCisJcmV0dXJuIGVycm9yOworfQorCisvKiBDcmVhdGUgYSBwZXItQUcgYmxvY2sgcmVzZXJ2YXRpb24uICovCitpbnQKK3hmc19hZ19yZXN2X2luaXQoCisJc3RydWN0IHhmc19wZXJhZwkJKnBhZykKK3sKKwl4ZnNfZXh0bGVuX3QJCQlhc2s7CisJeGZzX2V4dGxlbl90CQkJdXNlZDsKKwlpbnQJCQkJZXJyb3IgPSAwOworCisJLyogQ3JlYXRlIHRoZSBtZXRhZGF0YSByZXNlcnZhdGlvbi4gKi8KKwlpZiAocGFnLT5wYWdfbWV0YV9yZXN2LmFyX2Fza2VkID09IDApIHsKKwkJYXNrID0gdXNlZCA9IDA7CisKKwkJZXJyb3IgPSBfX3hmc19hZ19yZXN2X2luaXQocGFnLCBYRlNfQUdfUkVTVl9NRVRBREFUQSwKKwkJCQlhc2ssIHVzZWQpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDcmVhdGUgdGhlIEFHRkwgbWV0YWRhdGEgcmVzZXJ2YXRpb24gKi8KKwlpZiAocGFnLT5wYWdfYWdmbF9yZXN2LmFyX2Fza2VkID09IDApIHsKKwkJYXNrID0gdXNlZCA9IDA7CisKKwkJZXJyb3IgPSBfX3hmc19hZ19yZXN2X2luaXQocGFnLCBYRlNfQUdfUkVTVl9BR0ZMLCBhc2ssIHVzZWQpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qIEFsbG9jYXRlIGEgYmxvY2sgZnJvbSB0aGUgcmVzZXJ2YXRpb24uICovCit2b2lkCit4ZnNfYWdfcmVzdl9hbGxvY19leHRlbnQoCisJc3RydWN0IHhmc19wZXJhZwkJKnBhZywKKwllbnVtIHhmc19hZ19yZXN2X3R5cGUJCXR5cGUsCisJc3RydWN0IHhmc19hbGxvY19hcmcJCSphcmdzKQoreworCXN0cnVjdCB4ZnNfYWdfcmVzdgkJKnJlc3Y7CisJeGZzX2V4dGxlbl90CQkJbGVuOworCXVpbnQJCQkJZmllbGQ7CisKKwl0cmFjZV94ZnNfYWdfcmVzdl9hbGxvY19leHRlbnQocGFnLCB0eXBlLCBhcmdzLT5sZW4pOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBYRlNfQUdfUkVTVl9NRVRBREFUQToKKwljYXNlIFhGU19BR19SRVNWX0FHRkw6CisJCXJlc3YgPSB4ZnNfcGVyYWdfcmVzdihwYWcsIHR5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgWEZTX0FHX1JFU1ZfTk9ORToKKwkJZmllbGQgPSBhcmdzLT53YXNkZWwgPyBYRlNfVFJBTlNfU0JfUkVTX0ZEQkxPQ0tTIDoKKwkJCQkgICAgICAgWEZTX1RSQU5TX1NCX0ZEQkxPQ0tTOworCQl4ZnNfdHJhbnNfbW9kX3NiKGFyZ3MtPnRwLCBmaWVsZCwgLShpbnQ2NF90KWFyZ3MtPmxlbik7CisJCXJldHVybjsKKwl9CisKKwlsZW4gPSBtaW5fdCh4ZnNfZXh0bGVuX3QsIGFyZ3MtPmxlbiwgcmVzdi0+YXJfcmVzZXJ2ZWQpOworCXJlc3YtPmFyX3Jlc2VydmVkIC09IGxlbjsKKwlpZiAodHlwZSA9PSBYRlNfQUdfUkVTVl9BR0ZMKQorCQlyZXR1cm47CisJLyogQWxsb2NhdGlvbnMgb2YgcmVzZXJ2ZWQgYmxvY2tzIG9ubHkgbmVlZCBvbi1kaXNrIHNiIHVwZGF0ZXMuLi4gKi8KKwl4ZnNfdHJhbnNfbW9kX3NiKGFyZ3MtPnRwLCBYRlNfVFJBTlNfU0JfUkVTX0ZEQkxPQ0tTLCAtKGludDY0X3QpbGVuKTsKKwkvKiAuLi5idXQgbm9uLXJlc2VydmVkIGJsb2NrcyBuZWVkIGluLWNvcmUgYW5kIG9uLWRpc2sgdXBkYXRlcy4gKi8KKwlpZiAoYXJncy0+bGVuID4gbGVuKQorCQl4ZnNfdHJhbnNfbW9kX3NiKGFyZ3MtPnRwLCBYRlNfVFJBTlNfU0JfRkRCTE9DS1MsCisJCQkJLSgoaW50NjRfdClhcmdzLT5sZW4gLSBsZW4pKTsKK30KKworLyogRnJlZSBhIGJsb2NrIHRvIHRoZSByZXNlcnZhdGlvbi4gKi8KK3ZvaWQKK3hmc19hZ19yZXN2X2ZyZWVfZXh0ZW50KAorCXN0cnVjdCB4ZnNfcGVyYWcJCSpwYWcsCisJZW51bSB4ZnNfYWdfcmVzdl90eXBlCQl0eXBlLAorCXN0cnVjdCB4ZnNfdHJhbnMJCSp0cCwKKwl4ZnNfZXh0bGVuX3QJCQlsZW4pCit7CisJeGZzX2V4dGxlbl90CQkJbGVmdG92ZXI7CisJc3RydWN0IHhmc19hZ19yZXN2CQkqcmVzdjsKKworCXRyYWNlX3hmc19hZ19yZXN2X2ZyZWVfZXh0ZW50KHBhZywgdHlwZSwgbGVuKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgWEZTX0FHX1JFU1ZfTUVUQURBVEE6CisJY2FzZSBYRlNfQUdfUkVTVl9BR0ZMOgorCQlyZXN2ID0geGZzX3BlcmFnX3Jlc3YocGFnLCB0eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFhGU19BR19SRVNWX05PTkU6CisJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9GREJMT0NLUywgKGludDY0X3QpbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWxlZnRvdmVyID0gbWluX3QoeGZzX2V4dGxlbl90LCBsZW4sIHJlc3YtPmFyX2Fza2VkIC0gcmVzdi0+YXJfcmVzZXJ2ZWQpOworCXJlc3YtPmFyX3Jlc2VydmVkICs9IGxlZnRvdmVyOworCWlmICh0eXBlID09IFhGU19BR19SRVNWX0FHRkwpCisJCXJldHVybjsKKwkvKiBGcmVlaW5nIGludG8gdGhlIHJlc2VydmVkIHBvb2wgb25seSByZXF1aXJlcyBvbi1kaXNrIHVwZGF0ZS4uLiAqLworCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9SRVNfRkRCTE9DS1MsIGxlbik7CisJLyogLi4uYnV0IGZyZWVpbmcgYmV5b25kIHRoYXQgcmVxdWlyZXMgaW4tY29yZSBhbmQgb24tZGlzayB1cGRhdGUuICovCisJaWYgKGxlbiA+IGxlZnRvdmVyKQorCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfRkRCTE9DS1MsIGxlbiAtIGxlZnRvdmVyKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2FnX3Jlc3YuaCBiL2ZzL3hmcy9saWJ4ZnMveGZzX2FnX3Jlc3YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDZjNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpYnhmcy94ZnNfYWdfcmVzdi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgT3JhY2xlLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBBdXRob3I6IERhcnJpY2sgSi4gV29uZyA8ZGFycmljay53b25nQG9yYWNsZS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sICA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBfX1hGU19BR19SRVNWX0hfXworI2RlZmluZQlfX1hGU19BR19SRVNWX0hfXworCitpbnQgeGZzX2FnX3Jlc3ZfZnJlZShzdHJ1Y3QgeGZzX3BlcmFnICpwYWcpOworaW50IHhmc19hZ19yZXN2X2luaXQoc3RydWN0IHhmc19wZXJhZyAqcGFnKTsKKworYm9vbCB4ZnNfYWdfcmVzdl9jcml0aWNhbChzdHJ1Y3QgeGZzX3BlcmFnICpwYWcsIGVudW0geGZzX2FnX3Jlc3ZfdHlwZSB0eXBlKTsKK3hmc19leHRsZW5fdCB4ZnNfYWdfcmVzdl9uZWVkZWQoc3RydWN0IHhmc19wZXJhZyAqcGFnLAorCQllbnVtIHhmc19hZ19yZXN2X3R5cGUgdHlwZSk7CisKK3ZvaWQgeGZzX2FnX3Jlc3ZfYWxsb2NfZXh0ZW50KHN0cnVjdCB4ZnNfcGVyYWcgKnBhZywgZW51bSB4ZnNfYWdfcmVzdl90eXBlIHR5cGUsCisJCXN0cnVjdCB4ZnNfYWxsb2NfYXJnICphcmdzKTsKK3ZvaWQgeGZzX2FnX3Jlc3ZfZnJlZV9leHRlbnQoc3RydWN0IHhmc19wZXJhZyAqcGFnLCBlbnVtIHhmc19hZ19yZXN2X3R5cGUgdHlwZSwKKwkJc3RydWN0IHhmc190cmFucyAqdHAsIHhmc19leHRsZW5fdCBsZW4pOworCisjZW5kaWYJLyogX19YRlNfQUdfUkVTVl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2FsbG9jLmMgYi9mcy94ZnMvbGlieGZzL3hmc19hbGxvYy5jCmluZGV4IDNkZDhmMWQuLmNhNzVkYzkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saWJ4ZnMveGZzX2FsbG9jLmMKKysrIGIvZnMveGZzL2xpYnhmcy94ZnNfYWxsb2MuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgInhmc190cmFucy5oIgogI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgogI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfYWdfcmVzdi5oIgogCiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqeGZzX2FsbG9jX3dxOwogCkBAIC03NCwxNCArNzUsOCBAQAogICogZXh0ZW50cyBuZWVkIHRvIGJlIGFjdHVhbGx5IGFsbG9jYXRlZC4gVG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSBleHBsaWNpdGx5IHNldAogICogYXNpZGUgYSBmZXcgYmxvY2tzIHdoaWNoIHdpbGwgbm90IGJlIHJlc2VydmVkIGluIGRlbGF5ZWQgYWxsb2NhdGlvbi4KICAqCi0gKiBXaGVuIHJtYXAgaXMgZGlzYWJsZWQsIHdlIG5lZWQgdG8gcmVzZXJ2ZSA0IGZzYnMgX3BlciBBR18gZm9yIHRoZSBmcmVlbGlzdAotICogYW5kIDQgbW9yZSB0byBoYW5kbGUgYSBwb3RlbnRpYWwgc3BsaXQgb2YgdGhlIGZpbGUncyBibWFwIGJ0cmVlLgotICoKLSAqIFdoZW4gcm1hcCBpcyBlbmFibGVkLCB3ZSBtdXN0IGFsc28gYmUgYWJsZSB0byBoYW5kbGUgdHdvIHJtYXAgYnRyZWUgaW5zZXJ0cwotICogdG8gcmVjb3JkIGJvdGggdGhlIGZpbGUgZGF0YSBleHRlbnQgYW5kIGEgbmV3IGJtYnQgYmxvY2suICBUaGUgYm1idCBibG9jawotICogbWlnaHQgbm90IGJlIGluIHRoZSBzYW1lIEFHIGFzIHRoZSBmaWxlIGRhdGEgZXh0ZW50LiAgSW4gdGhlIHdvcnN0IGNhc2UKLSAqIHRoZSBibWFwIGJ0cmVlIHNwbGl0cyBtdWx0aXBsZSBsZXZlbHMgYW5kIGFsbCB0aGUgbmV3IGJsb2NrcyBjb21lIGZyb20KLSAqIGRpZmZlcmVudCBBR3MsIHNvIHNldCBhc2lkZSBlbm91Z2ggdG8gaGFuZGxlIHJtYXAgYnRyZWUgc3BsaXRzIGluIGFsbCBBR3MuCisgKiBXZSBuZWVkIHRvIHJlc2VydmUgNCBmc2JzIF9wZXIgQUdfIGZvciB0aGUgZnJlZWxpc3QgYW5kIDQgbW9yZSB0byBoYW5kbGUgYQorICogcG90ZW50aWFsIHNwbGl0IG9mIHRoZSBmaWxlJ3MgYm1hcCBidHJlZS4KICAqLwogdW5zaWduZWQgaW50CiB4ZnNfYWxsb2Nfc2V0X2FzaWRlKApAQCAtOTAsOCArODUsNiBAQAogCXVuc2lnbmVkIGludAkJYmxvY2tzOwogCiAJYmxvY2tzID0gNCArIChtcC0+bV9zYi5zYl9hZ2NvdW50ICogWEZTX0FMTE9DX0FHRkxfUkVTRVJWRSk7Ci0JaWYgKHhmc19zYl92ZXJzaW9uX2hhc3JtYXBidCgmbXAtPm1fc2IpKQotCQlibG9ja3MgKz0gbXAtPm1fc2Iuc2JfYWdjb3VudCAqIG1wLT5tX3JtYXBfbWF4bGV2ZWxzOwogCXJldHVybiBibG9ja3M7CiB9CiAKQEAgLTI2NSw3ICsyNTgsNyBAQAogCXhmc19hZ2Jsb2NrX3QJd2FudGJubywJLyogdGFyZ2V0IHN0YXJ0aW5nIGJsb2NrICovCiAJeGZzX2V4dGxlbl90CXdhbnRsZW4sCS8qIHRhcmdldCBsZW5ndGggKi8KIAl4ZnNfZXh0bGVuX3QJYWxpZ25tZW50LAkvKiB0YXJnZXQgYWxpZ25tZW50ICovCi0JY2hhcgkJdXNlcmRhdGEsCS8qIGFyZSB3ZSBhbGxvY2F0aW5nIGRhdGE/ICovCisJaW50CQlkYXRhdHlwZSwJLyogYXJlIHdlIGFsbG9jYXRpbmcgZGF0YT8gKi8KIAl4ZnNfYWdibG9ja190CWZyZWVibm8sCS8qIGZyZWVzcGFjZSdzIHN0YXJ0aW5nIGJsb2NrICovCiAJeGZzX2V4dGxlbl90CWZyZWVsZW4sCS8qIGZyZWVzcGFjZSdzIGxlbmd0aCAqLwogCXhmc19hZ2Jsb2NrX3QJKm5ld2Jub3ApCS8qIHJlc3VsdDogYmVzdCBzdGFydCBibG9jayBmcm9tIGZyZWUgKi8KQEAgLTI3Niw2ICsyNjksNyBAQAogCXhmc19leHRsZW5fdAluZXdsZW4xPTA7CS8qIGxlbmd0aCB3aXRoIG5ld2JubzEgKi8KIAl4ZnNfZXh0bGVuX3QJbmV3bGVuMj0wOwkvKiBsZW5ndGggd2l0aCBuZXdibm8yICovCiAJeGZzX2FnYmxvY2tfdAl3YW50ZW5kOwkvKiBlbmQgb2YgdGFyZ2V0IGV4dGVudCAqLworCWJvb2wJCXVzZXJkYXRhID0geGZzX2FsbG9jX2lzX3VzZXJkYXRhKGRhdGF0eXBlKTsKIAogCUFTU0VSVChmcmVlbGVuID49IHdhbnRsZW4pOwogCWZyZWVlbmQgPSBmcmVlYm5vICsgZnJlZWxlbjsKQEAgLTY4MCwxMiArNjc0LDI5IEBACiAJeGZzX2FsbG9jX2FyZ190CSphcmdzKQkvKiBhcmd1bWVudCBzdHJ1Y3R1cmUgZm9yIGFsbG9jYXRpb24gKi8KIHsKIAlpbnQJCWVycm9yPTA7CisJeGZzX2V4dGxlbl90CXJlc2VydmF0aW9uOworCXhmc19leHRsZW5fdAlvbGRtYXg7CiAKIAlBU1NFUlQoYXJncy0+bWlubGVuID4gMCk7CiAJQVNTRVJUKGFyZ3MtPm1heGxlbiA+IDApOwogCUFTU0VSVChhcmdzLT5taW5sZW4gPD0gYXJncy0+bWF4bGVuKTsKIAlBU1NFUlQoYXJncy0+bW9kIDwgYXJncy0+cHJvZCk7CiAJQVNTRVJUKGFyZ3MtPmFsaWdubWVudCA+IDApOworCisJLyoKKwkgKiBDbGFtcCBtYXhsZW4gdG8gdGhlIGFtb3VudCBvZiBmcmVlIHNwYWNlIG1pbnVzIGFueSByZXNlcnZhdGlvbnMKKwkgKiB0aGF0IGhhdmUgYmVlbiBtYWRlLgorCSAqLworCW9sZG1heCA9IGFyZ3MtPm1heGxlbjsKKwlyZXNlcnZhdGlvbiA9IHhmc19hZ19yZXN2X25lZWRlZChhcmdzLT5wYWcsIGFyZ3MtPnJlc3YpOworCWlmIChhcmdzLT5tYXhsZW4gPiBhcmdzLT5wYWctPnBhZ2ZfZnJlZWJsa3MgLSByZXNlcnZhdGlvbikKKwkJYXJncy0+bWF4bGVuID0gYXJncy0+cGFnLT5wYWdmX2ZyZWVibGtzIC0gcmVzZXJ2YXRpb247CisJaWYgKGFyZ3MtPm1heGxlbiA9PSAwKSB7CisJCWFyZ3MtPmFnYm5vID0gTlVMTEFHQkxPQ0s7CisJCWFyZ3MtPm1heGxlbiA9IG9sZG1heDsKKwkJcmV0dXJuIDA7CisJfQorCiAJLyoKIAkgKiBCcmFuY2ggdG8gY29ycmVjdCByb3V0aW5lIGJhc2VkIG9uIHRoZSB0eXBlLgogCSAqLwpAQCAtNzA1LDEyICs3MTYsMTQgQEAKIAkJLyogTk9UUkVBQ0hFRCAqLwogCX0KIAorCWFyZ3MtPm1heGxlbiA9IG9sZG1heDsKKwogCWlmIChlcnJvciB8fCBhcmdzLT5hZ2JubyA9PSBOVUxMQUdCTE9DSykKIAkJcmV0dXJuIGVycm9yOwogCiAJQVNTRVJUKGFyZ3MtPmxlbiA+PSBhcmdzLT5taW5sZW4pOwogCUFTU0VSVChhcmdzLT5sZW4gPD0gYXJncy0+bWF4bGVuKTsKLQlBU1NFUlQoIWFyZ3MtPndhc2Zyb21mbCB8fCAhYXJncy0+aXNmbCk7CisJQVNTRVJUKCFhcmdzLT53YXNmcm9tZmwgfHwgYXJncy0+cmVzdiAhPSBYRlNfQUdfUkVTVl9BR0ZMKTsKIAlBU1NFUlQoYXJncy0+YWdibm8gJSBhcmdzLT5hbGlnbm1lbnQgPT0gMCk7CiAKIAkvKiBpZiBub3QgZmlsZSBkYXRhLCBpbnNlcnQgbmV3IGJsb2NrIGludG8gdGhlIHJldmVyc2UgbWFwIGJ0cmVlICovCkBAIC03MzIsMTIgKzc0NSw3IEBACiAJCQkJCSAgICAgIGFyZ3MtPmFnYm5vLCBhcmdzLT5sZW4pKTsKIAl9CiAKLQlpZiAoIWFyZ3MtPmlzZmwpIHsKLQkJeGZzX3RyYW5zX21vZF9zYihhcmdzLT50cCwgYXJncy0+d2FzZGVsID8KLQkJCQkgWEZTX1RSQU5TX1NCX1JFU19GREJMT0NLUyA6Ci0JCQkJIFhGU19UUkFOU19TQl9GREJMT0NLUywKLQkJCQkgLSgobG9uZykoYXJncy0+bGVuKSkpOwotCX0KKwl4ZnNfYWdfcmVzdl9hbGxvY19leHRlbnQoYXJncy0+cGFnLCBhcmdzLT5yZXN2LCBhcmdzKTsKIAogCVhGU19TVEFUU19JTkMoYXJncy0+bXAsIHhzX2FsbG9jeCk7CiAJWEZTX1NUQVRTX0FERChhcmdzLT5tcCwgeHNfYWxsb2NiLCBhcmdzLT5sZW4pOwpAQCAtOTE3LDcgKzkyNSw3IEBACiAKIAkJCXNkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZihhcmdzLT5hZ2JubywgYXJncy0+bGVuLAogCQkJCQkJICAgICAgIGFyZ3MtPmFsaWdubWVudCwKLQkJCQkJCSAgICAgICBhcmdzLT51c2VyZGF0YSwgKnNibm9hLAorCQkJCQkJICAgICAgIGFyZ3MtPmRhdGF0eXBlLCAqc2Jub2EsCiAJCQkJCQkgICAgICAgKnNsZW5hLCAmbmV3KTsKIAogCQkJLyoKQEAgLTExMDEsNyArMTEwOSw3IEBACiAJCQlpZiAoYXJncy0+bGVuIDwgYmxlbikKIAkJCQljb250aW51ZTsKIAkJCWx0ZGlmZiA9IHhmc19hbGxvY19jb21wdXRlX2RpZmYoYXJncy0+YWdibm8sIGFyZ3MtPmxlbiwKLQkJCQlhcmdzLT5hbGlnbm1lbnQsIGFyZ3MtPnVzZXJkYXRhLCBsdGJub2EsCisJCQkJYXJncy0+YWxpZ25tZW50LCBhcmdzLT5kYXRhdHlwZSwgbHRibm9hLAogCQkJCWx0bGVuYSwgJmx0bmV3KTsKIAkJCWlmIChsdG5ldyAhPSBOVUxMQUdCTE9DSyAmJgogCQkJICAgIChhcmdzLT5sZW4gPiBibGVuIHx8IGx0ZGlmZiA8IGJkaWZmKSkgewpAQCAtMTI1NCw3ICsxMjYyLDcgQEAKIAkJCWFyZ3MtPmxlbiA9IFhGU19FWFRMRU5fTUlOKGx0bGVuYSwgYXJncy0+bWF4bGVuKTsKIAkJCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOwogCQkJbHRkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZihhcmdzLT5hZ2JubywgYXJncy0+bGVuLAotCQkJCWFyZ3MtPmFsaWdubWVudCwgYXJncy0+dXNlcmRhdGEsIGx0Ym5vYSwKKwkJCQlhcmdzLT5hbGlnbm1lbnQsIGFyZ3MtPmRhdGF0eXBlLCBsdGJub2EsCiAJCQkJbHRsZW5hLCAmbHRuZXcpOwogCiAJCQllcnJvciA9IHhmc19hbGxvY19maW5kX2Jlc3RfZXh0ZW50KGFyZ3MsCkBAIC0xMjcxLDcgKzEyNzksNyBAQAogCQkJYXJncy0+bGVuID0gWEZTX0VYVExFTl9NSU4oZ3RsZW5hLCBhcmdzLT5tYXhsZW4pOwogCQkJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7CiAJCQlndGRpZmYgPSB4ZnNfYWxsb2NfY29tcHV0ZV9kaWZmKGFyZ3MtPmFnYm5vLCBhcmdzLT5sZW4sCi0JCQkJYXJncy0+YWxpZ25tZW50LCBhcmdzLT51c2VyZGF0YSwgZ3Ribm9hLAorCQkJCWFyZ3MtPmFsaWdubWVudCwgYXJncy0+ZGF0YXR5cGUsIGd0Ym5vYSwKIAkJCQlndGxlbmEsICZndG5ldyk7CiAKIAkJCWVycm9yID0geGZzX2FsbG9jX2ZpbmRfYmVzdF9leHRlbnQoYXJncywKQEAgLTEzMzEsNyArMTMzOSw3IEBACiAJfQogCXJsZW4gPSBhcmdzLT5sZW47CiAJKHZvaWQpeGZzX2FsbG9jX2NvbXB1dGVfZGlmZihhcmdzLT5hZ2JubywgcmxlbiwgYXJncy0+YWxpZ25tZW50LAotCQkJCSAgICAgYXJncy0+dXNlcmRhdGEsIGx0Ym5vYSwgbHRsZW5hLCAmbHRuZXcpOworCQkJCSAgICAgYXJncy0+ZGF0YXR5cGUsIGx0Ym5vYSwgbHRsZW5hLCAmbHRuZXcpOwogCUFTU0VSVChsdG5ldyA+PSBsdGJubyk7CiAJQVNTRVJUKGx0bmV3ICsgcmxlbiA8PSBsdGJub2EgKyBsdGxlbmEpOwogCUFTU0VSVChsdG5ldyArIHJsZW4gPD0gYmUzMl90b19jcHUoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgpKTsKQEAgLTE1ODMsNiArMTU5MSw3IEBACiAJaW50CQkqc3RhdCkJLyogc3RhdHVzOiAwLWZyZWVsaXN0LCAxLW5vcm1hbC9ub25lICovCiB7CiAJc3RydWN0IHhmc19vd25lcl9pbmZvCW9pbmZvOworCXN0cnVjdCB4ZnNfcGVyYWcJKnBhZzsKIAlpbnQJCWVycm9yOwogCXhmc19hZ2Jsb2NrX3QJZmJubzsKIAl4ZnNfZXh0bGVuX3QJZmxlbjsKQEAgLTE2MDAsNyArMTYwOSw4IEBACiAJICogdG8gcmVzcGVjdCBtaW5sZWZ0IGV2ZW4gd2hlbiBwdWxsaW5nIGZyb20gdGhlCiAJICogZnJlZWxpc3QuCiAJICovCi0JZWxzZSBpZiAoYXJncy0+bWlubGVuID09IDEgJiYgYXJncy0+YWxpZ25tZW50ID09IDEgJiYgIWFyZ3MtPmlzZmwgJiYKKwllbHNlIGlmIChhcmdzLT5taW5sZW4gPT0gMSAmJiBhcmdzLT5hbGlnbm1lbnQgPT0gMSAmJgorCQkgYXJncy0+cmVzdiAhPSBYRlNfQUdfUkVTVl9BR0ZMICYmCiAJCSAoYmUzMl90b19jcHUoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9mbGNvdW50KQogCQkgID4gYXJncy0+bWlubGVmdCkpIHsKIAkJZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X2ZyZWVsaXN0KGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLCAmZmJubywgMCk7CkBAIC0xNjA4LDkgKzE2MTgsOSBAQAogCQkJZ290byBlcnJvcjA7CiAJCWlmIChmYm5vICE9IE5VTExBR0JMT0NLKSB7CiAJCQl4ZnNfZXh0ZW50X2J1c3lfcmV1c2UoYXJncy0+bXAsIGFyZ3MtPmFnbm8sIGZibm8sIDEsCi0JCQkJCSAgICAgYXJncy0+dXNlcmRhdGEpOworCQkJICAgICAgeGZzX2FsbG9jX2FsbG93X2J1c3lfcmV1c2UoYXJncy0+ZGF0YXR5cGUpKTsKIAotCQkJaWYgKGFyZ3MtPnVzZXJkYXRhKSB7CisJCQlpZiAoeGZzX2FsbG9jX2lzX3VzZXJkYXRhKGFyZ3MtPmRhdGF0eXBlKSkgewogCQkJCXhmc19idWZfdAkqYnA7CiAKIAkJCQlicCA9IHhmc19idHJlZV9nZXRfYnVmcyhhcmdzLT5tcCwgYXJncy0+dHAsCkBAIC0xNjI5LDEzICsxNjM5LDE4IEBACiAJCQkvKgogCQkJICogSWYgd2UncmUgZmVlZGluZyBhbiBBR0ZMIGJsb2NrIHRvIHNvbWV0aGluZyB0aGF0CiAJCQkgKiBkb2Vzbid0IGxpdmUgaW4gdGhlIGZyZWUgc3BhY2UsIHdlIG5lZWQgdG8gY2xlYXIKLQkJCSAqIG91dCB0aGUgT1dOX0FHIHJtYXAuCisJCQkgKiBvdXQgdGhlIE9XTl9BRyBybWFwIGFuZCBhZGQgdGhlIGJsb2NrIGJhY2sgdG8KKwkJCSAqIHRoZSBBR0ZMIHBlci1BRyByZXNlcnZhdGlvbi4KIAkJCSAqLwogCQkJeGZzX3JtYXBfYWdfb3duZXIoJm9pbmZvLCBYRlNfUk1BUF9PV05fQUcpOwogCQkJZXJyb3IgPSB4ZnNfcm1hcF9mcmVlKGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLCBhcmdzLT5hZ25vLAogCQkJCQlmYm5vLCAxLCAmb2luZm8pOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gZXJyb3IwOworCQkJcGFnID0geGZzX3BlcmFnX2dldChhcmdzLT5tcCwgYXJncy0+YWdubyk7CisJCQl4ZnNfYWdfcmVzdl9mcmVlX2V4dGVudChwYWcsIFhGU19BR19SRVNWX0FHRkwsCisJCQkJCWFyZ3MtPnRwLCAxKTsKKwkJCXhmc19wZXJhZ19wdXQocGFnKTsKIAogCQkJKnN0YXQgPSAwOwogCQkJcmV0dXJuIDA7CkBAIC0xNjgzLDcgKzE2OTgsNyBAQAogCXhmc19hZ2Jsb2NrX3QJCWJubywKIAl4ZnNfZXh0bGVuX3QJCWxlbiwKIAlzdHJ1Y3QgeGZzX293bmVyX2luZm8JKm9pbmZvLAotCWludAkJCWlzZmwpCisJZW51bSB4ZnNfYWdfcmVzdl90eXBlCXR5cGUpCiB7CiAJeGZzX2J0cmVlX2N1cl90CSpibm9fY3VyOwkvKiBjdXJzb3IgZm9yIGJ5LWJsb2NrIGJ0cmVlICovCiAJeGZzX2J0cmVlX2N1cl90CSpjbnRfY3VyOwkvKiBjdXJzb3IgZm9yIGJ5LXNpemUgYnRyZWUgKi8KQEAgLTE5MTEsMjEgKzE5MjYsMjIgQEAKIAkgKi8KIAlwYWcgPSB4ZnNfcGVyYWdfZ2V0KG1wLCBhZ25vKTsKIAllcnJvciA9IHhmc19hbGxvY191cGRhdGVfY291bnRlcnModHAsIHBhZywgYWdicCwgbGVuKTsKKwl4ZnNfYWdfcmVzdl9mcmVlX2V4dGVudChwYWcsIHR5cGUsIHRwLCBsZW4pOwogCXhmc19wZXJhZ19wdXQocGFnKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyb3IwOwogCi0JaWYgKCFpc2ZsKQotCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfRkRCTE9DS1MsIChsb25nKWxlbik7CiAJWEZTX1NUQVRTX0lOQyhtcCwgeHNfZnJlZXgpOwogCVhGU19TVEFUU19BREQobXAsIHhzX2ZyZWViLCBsZW4pOwogCi0JdHJhY2VfeGZzX2ZyZWVfZXh0ZW50KG1wLCBhZ25vLCBibm8sIGxlbiwgaXNmbCwgaGF2ZWxlZnQsIGhhdmVyaWdodCk7CisJdHJhY2VfeGZzX2ZyZWVfZXh0ZW50KG1wLCBhZ25vLCBibm8sIGxlbiwgdHlwZSA9PSBYRlNfQUdfUkVTVl9BR0ZMLAorCQkJaGF2ZWxlZnQsIGhhdmVyaWdodCk7CiAKIAlyZXR1cm4gMDsKIAogIGVycm9yMDoKLQl0cmFjZV94ZnNfZnJlZV9leHRlbnQobXAsIGFnbm8sIGJubywgbGVuLCBpc2ZsLCAtMSwgLTEpOworCXRyYWNlX3hmc19mcmVlX2V4dGVudChtcCwgYWdubywgYm5vLCBsZW4sIHR5cGUgPT0gWEZTX0FHX1JFU1ZfQUdGTCwKKwkJCS0xLCAtMSk7CiAJaWYgKGJub19jdXIpCiAJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXIsIFhGU19CVFJFRV9FUlJPUik7CiAJaWYgKGNudF9jdXIpCkBAIC0xOTUwLDIxICsxOTY2LDQzIEBACiB9CiAKIC8qCi0gKiBGaW5kIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3QgZXh0ZW50IGluIGFuIEFHLgorICogRmluZCB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IGV4dGVudCBpbiBhbiBBRy4gIFRoZSAnbmVlZCcgcGFyYW1ldGVyCisgKiBzcGVjaWZpZXMgaG93IG11Y2ggc3BhY2Ugd2UncmUgZ29pbmcgdG8gbmVlZCBmb3IgdGhlIEFHRkwgYW5kIHRoZQorICogJ3Jlc2VydmVkJyBwYXJhbWV0ZXIgdGVsbHMgdXMgaG93IG1hbnkgYmxvY2tzIGluIHRoaXMgQUcgYXJlIHJlc2VydmVkIGZvcgorICogb3RoZXIgY2FsbGVycy4KICAqLwogeGZzX2V4dGxlbl90CiB4ZnNfYWxsb2NfbG9uZ2VzdF9mcmVlX2V4dGVudCgKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAlzdHJ1Y3QgeGZzX3BlcmFnCSpwYWcsCi0JeGZzX2V4dGxlbl90CQluZWVkKQorCXhmc19leHRsZW5fdAkJbmVlZCwKKwl4ZnNfZXh0bGVuX3QJCXJlc2VydmVkKQogewogCXhmc19leHRsZW5fdAkJZGVsdGEgPSAwOwogCisJLyoKKwkgKiBJZiB0aGUgQUdGTCBuZWVkcyBhIHJlY2hhcmdlLCB3ZSdsbCBoYXZlIHRvIHN1YnRyYWN0IHRoYXQgZnJvbSB0aGUKKwkgKiBsb25nZXN0IGV4dGVudC4KKwkgKi8KIAlpZiAobmVlZCA+IHBhZy0+cGFnZl9mbGNvdW50KQogCQlkZWx0YSA9IG5lZWQgLSBwYWctPnBhZ2ZfZmxjb3VudDsKIAorCS8qCisJICogSWYgd2UgY2Fubm90IG1haW50YWluIG90aGVycycgcmVzZXJ2YXRpb25zIHdpdGggc3BhY2UgZnJvbSB0aGUKKwkgKiBub3QtbG9uZ2VzdCBmcmVlc3AgZXh0ZW50cywgd2UnbGwgaGF2ZSB0byBzdWJ0cmFjdCAvdGhhdC8gZnJvbQorCSAqIHRoZSBsb25nZXN0IGV4dGVudCB0b28uCisJICovCisJaWYgKHBhZy0+cGFnZl9mcmVlYmxrcyAtIHBhZy0+cGFnZl9sb25nZXN0IDwgcmVzZXJ2ZWQpCisJCWRlbHRhICs9IHJlc2VydmVkIC0gKHBhZy0+cGFnZl9mcmVlYmxrcyAtIHBhZy0+cGFnZl9sb25nZXN0KTsKKworCS8qCisJICogSWYgdGhlIGxvbmdlc3QgZXh0ZW50IGlzIGxvbmcgZW5vdWdoIHRvIHNhdGlzZnkgYWxsIHRoZQorCSAqIHJlc2VydmF0aW9ucyBhbmQgQUdGTCBydWxlcyBpbiBwbGFjZSwgd2UgY2FuIHJldHVybiB0aGlzIGV4dGVudC4KKwkgKi8KIAlpZiAocGFnLT5wYWdmX2xvbmdlc3QgPiBkZWx0YSkKIAkJcmV0dXJuIHBhZy0+cGFnZl9sb25nZXN0IC0gZGVsdGE7CisKKwkvKiBPdGhlcndpc2UsIGxldCB0aGUgY2FsbGVyIHRyeSBmb3IgMSBibG9jayBpZiB0aGVyZSdzIHNwYWNlLiAqLwogCXJldHVybiBwYWctPnBhZ2ZfZmxjb3VudCA+IDAgfHwgcGFnLT5wYWdmX2xvbmdlc3QgPiAwOwogfQogCkBAIC0yMDA0LDIwICsyMDQyLDI0IEBACiB7CiAJc3RydWN0IHhmc19wZXJhZwkqcGFnID0gYXJncy0+cGFnOwogCXhmc19leHRsZW5fdAkJbG9uZ2VzdDsKKwl4ZnNfZXh0bGVuX3QJCXJlc2VydmF0aW9uOyAvKiBibG9ja3MgdGhhdCBhcmUgc3RpbGwgcmVzZXJ2ZWQgKi8KIAlpbnQJCQlhdmFpbGFibGU7CiAKIAlpZiAoZmxhZ3MgJiBYRlNfQUxMT0NfRkxBR19GUkVFSU5HKQogCQlyZXR1cm4gdHJ1ZTsKIAorCXJlc2VydmF0aW9uID0geGZzX2FnX3Jlc3ZfbmVlZGVkKHBhZywgYXJncy0+cmVzdik7CisKIAkvKiBkbyB3ZSBoYXZlIGVub3VnaCBjb250aWd1b3VzIGZyZWUgc3BhY2UgZm9yIHRoZSBhbGxvY2F0aW9uPyAqLwotCWxvbmdlc3QgPSB4ZnNfYWxsb2NfbG9uZ2VzdF9mcmVlX2V4dGVudChhcmdzLT5tcCwgcGFnLCBtaW5fZnJlZSk7CisJbG9uZ2VzdCA9IHhmc19hbGxvY19sb25nZXN0X2ZyZWVfZXh0ZW50KGFyZ3MtPm1wLCBwYWcsIG1pbl9mcmVlLAorCQkJcmVzZXJ2YXRpb24pOwogCWlmICgoYXJncy0+bWlubGVuICsgYXJncy0+YWxpZ25tZW50ICsgYXJncy0+bWluYWxpZ25zbG9wIC0gMSkgPiBsb25nZXN0KQogCQlyZXR1cm4gZmFsc2U7CiAKLQkvKiBkbyBoYXZlIGVub3VnaCBmcmVlIHNwYWNlIHJlbWFpbmluZyBmb3IgdGhlIGFsbG9jYXRpb24/ICovCisJLyogZG8gd2UgaGF2ZSBlbm91Z2ggZnJlZSBzcGFjZSByZW1haW5pbmcgZm9yIHRoZSBhbGxvY2F0aW9uPyAqLwogCWF2YWlsYWJsZSA9IChpbnQpKHBhZy0+cGFnZl9mcmVlYmxrcyArIHBhZy0+cGFnZl9mbGNvdW50IC0KLQkJCSAgbWluX2ZyZWUgLSBhcmdzLT50b3RhbCk7Ci0JaWYgKGF2YWlsYWJsZSA8IChpbnQpYXJncy0+bWlubGVmdCkKKwkJCSAgcmVzZXJ2YXRpb24gLSBtaW5fZnJlZSAtIGFyZ3MtPnRvdGFsKTsKKwlpZiAoYXZhaWxhYmxlIDwgKGludClhcmdzLT5taW5sZWZ0IHx8IGF2YWlsYWJsZSA8PSAwKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gdHJ1ZTsKQEAgLTIwNTgsNyArMjEwMCw3IEBACiAJICogc29tZXdoZXJlIGVsc2UgaWYgd2UgYXJlIG5vdCBiZWluZyBhc2tlZCB0byB0cnkgaGFyZGVyIGF0IHRoaXMKIAkgKiBwb2ludAogCSAqLwotCWlmIChwYWctPnBhZ2ZfbWV0YWRhdGEgJiYgYXJncy0+dXNlcmRhdGEgJiYKKwlpZiAocGFnLT5wYWdmX21ldGFkYXRhICYmIHhmc19hbGxvY19pc191c2VyZGF0YShhcmdzLT5kYXRhdHlwZSkgJiYKIAkgICAgKGZsYWdzICYgWEZTX0FMTE9DX0ZMQUdfVFJZTE9DSykpIHsKIAkJQVNTRVJUKCEoZmxhZ3MgJiBYRlNfQUxMT0NfRkxBR19GUkVFSU5HKSk7CiAJCWdvdG8gb3V0X2FnYnBfcmVsc2U7CkBAIC0yMTI0LDcgKzIxNjYsNyBAQAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9hZ2JwX3JlbHNlOwogCQllcnJvciA9IHhmc19mcmVlX2FnX2V4dGVudCh0cCwgYWdicCwgYXJncy0+YWdubywgYm5vLCAxLAotCQkJCQkgICAmdGFyZ3Mub2luZm8sIDEpOworCQkJCQkgICAmdGFyZ3Mub2luZm8sIFhGU19BR19SRVNWX0FHRkwpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9hZ2JwX3JlbHNlOwogCQlicCA9IHhmc19idHJlZV9nZXRfYnVmcyhtcCwgdHAsIGFyZ3MtPmFnbm8sIGJubywgMCk7CkBAIC0yMTM1LDcgKzIxNzcsNyBAQAogCXRhcmdzLm1wID0gbXA7CiAJdGFyZ3MuYWdicCA9IGFnYnA7CiAJdGFyZ3MuYWdubyA9IGFyZ3MtPmFnbm87Ci0JdGFyZ3MuYWxpZ25tZW50ID0gdGFyZ3MubWlubGVuID0gdGFyZ3MucHJvZCA9IHRhcmdzLmlzZmwgPSAxOworCXRhcmdzLmFsaWdubWVudCA9IHRhcmdzLm1pbmxlbiA9IHRhcmdzLnByb2QgPSAxOwogCXRhcmdzLnR5cGUgPSBYRlNfQUxMT0NUWVBFX1RISVNfQUc7CiAJdGFyZ3MucGFnID0gcGFnOwogCWVycm9yID0geGZzX2FsbG9jX3JlYWRfYWdmbChtcCwgdHAsIHRhcmdzLmFnbm8sICZhZ2ZsYnApOwpAQCAtMjE0Niw2ICsyMTg4LDcgQEAKIAl3aGlsZSAocGFnLT5wYWdmX2ZsY291bnQgPCBuZWVkKSB7CiAJCXRhcmdzLmFnYm5vID0gMDsKIAkJdGFyZ3MubWF4bGVuID0gbmVlZCAtIHBhZy0+cGFnZl9mbGNvdW50OworCQl0YXJncy5yZXN2ID0gWEZTX0FHX1JFU1ZfQUdGTDsKIAogCQkvKiBBbGxvY2F0ZSBhcyBtYW55IGJsb2NrcyBhcyBwb3NzaWJsZSBhdCBvbmNlLiAqLwogCQllcnJvciA9IHhmc19hbGxvY19hZ192ZXh0ZW50KCZ0YXJncyk7CkBAIC0yMjc4LDYgKzIzMjEsOCBAQAogCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl9idHJlZWJsa3MpLAogCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl91dWlkKSwKIAkJb2Zmc2V0b2YoeGZzX2FnZl90LCBhZ2Zfcm1hcF9ibG9ja3MpLAorCQkvKiBuZWVkZWQgc28gdGhhdCB3ZSBkb24ndCBsb2cgdGhlIHdob2xlIHJlc3Qgb2YgdGhlIHN0cnVjdHVyZTogKi8KKwkJb2Zmc2V0b2YoeGZzX2FnZl90LCBhZ2Zfc3BhcmU2NCksCiAJCXNpemVvZih4ZnNfYWdmX3QpCiAJfTsKIApAQCAtMjYzMSw3ICsyNjc2LDcgQEAKIAkJICogVHJ5IG5lYXIgYWxsb2NhdGlvbiBmaXJzdCwgdGhlbiBhbnl3aGVyZS1pbi1hZyBhZnRlcgogCQkgKiB0aGUgZmlyc3QgYS5nLiBmYWlscy4KIAkJICovCi0JCWlmICgoYXJncy0+dXNlcmRhdGEgJiBYRlNfQUxMT0NfSU5JVElBTF9VU0VSX0RBVEEpICYmCisJCWlmICgoYXJncy0+ZGF0YXR5cGUgJiBYRlNfQUxMT0NfSU5JVElBTF9VU0VSX0RBVEEpICYmCiAJCSAgICAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfMzJCSVRJTk9ERVMpKSB7CiAJCQlhcmdzLT5mc2JubyA9IFhGU19BR0JfVE9fRlNCKG1wLAogCQkJCQkoKG1wLT5tX2FnZnJvdG9yIC8gcm90b3JzdGVwKSAlCkBAIC0yNzY0LDcgKzI4MDksNyBAQAogI2VuZGlmCiAKIAkJLyogWmVybyB0aGUgZXh0ZW50IGlmIHdlIHdlcmUgYXNrZWQgdG8gZG8gc28gKi8KLQkJaWYgKGFyZ3MtPnVzZXJkYXRhICYgWEZTX0FMTE9DX1VTRVJEQVRBX1pFUk8pIHsKKwkJaWYgKGFyZ3MtPmRhdGF0eXBlICYgWEZTX0FMTE9DX1VTRVJEQVRBX1pFUk8pIHsKIAkJCWVycm9yID0geGZzX3plcm9fZXh0ZW50KGFyZ3MtPmlwLCBhcmdzLT5mc2JubywgYXJncy0+bGVuKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGVycm9yMDsKQEAgLTI4MjMsNyArMjg2OCw4IEBACiAJc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KIAl4ZnNfZnNibG9ja190CQlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiBleHRlbnQgKi8KIAl4ZnNfZXh0bGVuX3QJCWxlbiwJLyogbGVuZ3RoIG9mIGV4dGVudCAqLwotCXN0cnVjdCB4ZnNfb3duZXJfaW5mbwkqb2luZm8pCS8qIGV4dGVudCBvd25lciAqLworCXN0cnVjdCB4ZnNfb3duZXJfaW5mbwkqb2luZm8sCS8qIGV4dGVudCBvd25lciAqLworCWVudW0geGZzX2FnX3Jlc3ZfdHlwZQl0eXBlKQkvKiBibG9jayByZXNlcnZhdGlvbiB0eXBlICovCiB7CiAJc3RydWN0IHhmc19tb3VudAkqbXAgPSB0cC0+dF9tb3VudHA7CiAJc3RydWN0IHhmc19idWYJCSphZ2JwOwpAQCAtMjgzMiw2ICsyODc4LDcgQEAKIAlpbnQJCQllcnJvcjsKIAogCUFTU0VSVChsZW4gIT0gMCk7CisJQVNTRVJUKHR5cGUgIT0gWEZTX0FHX1JFU1ZfQUdGTCk7CiAKIAlpZiAoWEZTX1RFU1RfRVJST1IoZmFsc2UsIG1wLAogCQkJWEZTX0VSUlRBR19GUkVFX0VYVEVOVCwKQEAgLTI4NDksNyArMjg5Niw3IEBACiAJCWFnYm5vICsgbGVuIDw9IGJlMzJfdG9fY3B1KFhGU19CVUZfVE9fQUdGKGFnYnApLT5hZ2ZfbGVuZ3RoKSwKIAkJCQllcnIpOwogCi0JZXJyb3IgPSB4ZnNfZnJlZV9hZ19leHRlbnQodHAsIGFnYnAsIGFnbm8sIGFnYm5vLCBsZW4sIG9pbmZvLCAwKTsKKwllcnJvciA9IHhmc19mcmVlX2FnX2V4dGVudCh0cCwgYWdicCwgYWdubywgYWdibm8sIGxlbiwgb2luZm8sIHR5cGUpOwogCWlmIChlcnJvcikKIAkJZ290byBlcnI7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2FsbG9jLmggYi9mcy94ZnMvbGlieGZzL3hmc19hbGxvYy5oCmluZGV4IDZmZTJkNmIuLjdjNDA0YTYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saWJ4ZnMveGZzX2FsbG9jLmgKKysrIGIvZnMveGZzL2xpYnhmcy94ZnNfYWxsb2MuaApAQCAtODUsMjAgKzg1LDMzIEBACiAJeGZzX2V4dGxlbl90CWxlbjsJCS8qIG91dHB1dDogYWN0dWFsIHNpemUgb2YgZXh0ZW50ICovCiAJeGZzX2FsbG9jdHlwZV90CXR5cGU7CQkvKiBhbGxvY2F0aW9uIHR5cGUgWEZTX0FMTE9DVFlQRV8uLi4gKi8KIAl4ZnNfYWxsb2N0eXBlX3QJb3R5cGU7CQkvKiBvcmlnaW5hbCBhbGxvY2F0aW9uIHR5cGUgKi8KKwlpbnQJCWRhdGF0eXBlOwkvKiBtYXNrIGRlZmluaW5nIGRhdGEgdHlwZSB0cmVhdG1lbnQgKi8KIAljaGFyCQl3YXNkZWw7CQkvKiBzZXQgaWYgYWxsb2NhdGlvbiB3YXMgcHJldiBkZWxheWVkICovCiAJY2hhcgkJd2FzZnJvbWZsOwkvKiBzZXQgaWYgYWxsb2NhdGlvbiBpcyBmcm9tIGZyZWVsaXN0ICovCi0JY2hhcgkJaXNmbDsJCS8qIHNldCBpZiBpcyBmcmVlbGlzdCBibG9ja3MgLSAhYWNjdGcgKi8KLQljaGFyCQl1c2VyZGF0YTsJLyogbWFzayBkZWZpbmluZyB1c2VyZGF0YSB0cmVhdG1lbnQgKi8KIAl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CS8qIGlvIGZpcnN0IGJsb2NrIGFsbG9jYXRlZCAqLwogCXN0cnVjdCB4ZnNfb3duZXJfaW5mbwlvaW5mbzsJLyogb3duZXIgb2YgYmxvY2tzIGJlaW5nIGFsbG9jYXRlZCAqLworCWVudW0geGZzX2FnX3Jlc3ZfdHlwZQlyZXN2OwkvKiBibG9jayByZXNlcnZhdGlvbiB0byB1c2UgKi8KIH0geGZzX2FsbG9jX2FyZ190OwogCiAvKgotICogRGVmaW5lcyBmb3IgdXNlcmRhdGEKKyAqIERlZmluZXMgZm9yIGRhdGF0eXBlCiAgKi8KICNkZWZpbmUgWEZTX0FMTE9DX1VTRVJEQVRBCQkoMSA8PCAwKS8qIGFsbG9jYXRpb24gaXMgZm9yIHVzZXIgZGF0YSovCiAjZGVmaW5lIFhGU19BTExPQ19JTklUSUFMX1VTRVJfREFUQQkoMSA8PCAxKS8qIHNwZWNpYWwgY2FzZSBzdGFydCBvZiBmaWxlICovCiAjZGVmaW5lIFhGU19BTExPQ19VU0VSREFUQV9aRVJPCQkoMSA8PCAyKS8qIHplcm8gZXh0ZW50IG9uIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgWEZTX0FMTE9DX05PQlVTWQkJKDEgPDwgMykvKiBCdXN5IGV4dGVudHMgbm90IGFsbG93ZWQgKi8KKworc3RhdGljIGlubGluZSBib29sCit4ZnNfYWxsb2NfaXNfdXNlcmRhdGEoaW50IGRhdGF0eXBlKQoreworCXJldHVybiAoZGF0YXR5cGUgJiB+WEZTX0FMTE9DX05PQlVTWSkgIT0gMDsKK30KKworc3RhdGljIGlubGluZSBib29sCit4ZnNfYWxsb2NfYWxsb3dfYnVzeV9yZXVzZShpbnQgZGF0YXR5cGUpCit7CisJcmV0dXJuIChkYXRhdHlwZSAmIFhGU19BTExPQ19OT0JVU1kpID09IDA7Cit9CiAKIC8qIGZyZWVzcGFjZSBsaW1pdCBjYWxjdWxhdGlvbnMgKi8KICNkZWZpbmUgWEZTX0FMTE9DX0FHRkxfUkVTRVJWRQk0CkBAIC0xMDYsNyArMTE5LDggQEAKIHVuc2lnbmVkIGludCB4ZnNfYWxsb2NfYWdfbWF4X3VzYWJsZShzdHJ1Y3QgeGZzX21vdW50ICptcCk7CiAKIHhmc19leHRsZW5fdCB4ZnNfYWxsb2NfbG9uZ2VzdF9mcmVlX2V4dGVudChzdHJ1Y3QgeGZzX21vdW50ICptcCwKLQkJc3RydWN0IHhmc19wZXJhZyAqcGFnLCB4ZnNfZXh0bGVuX3QgbmVlZCk7CisJCXN0cnVjdCB4ZnNfcGVyYWcgKnBhZywgeGZzX2V4dGxlbl90IG5lZWQsCisJCXhmc19leHRsZW5fdCByZXNlcnZlZCk7CiB1bnNpZ25lZCBpbnQgeGZzX2FsbG9jX21pbl9mcmVlbGlzdChzdHJ1Y3QgeGZzX21vdW50ICptcCwKIAkJc3RydWN0IHhmc19wZXJhZyAqcGFnKTsKIApAQCAtMTg0LDcgKzE5OCw4IEBACiAJc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KIAl4ZnNfZnNibG9ja190CQlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiBleHRlbnQgKi8KIAl4ZnNfZXh0bGVuX3QJCWxlbiwJLyogbGVuZ3RoIG9mIGV4dGVudCAqLwotCXN0cnVjdCB4ZnNfb3duZXJfaW5mbwkqb2luZm8pOy8qIGV4dGVudCBvd25lciAqLworCXN0cnVjdCB4ZnNfb3duZXJfaW5mbwkqb2luZm8sCS8qIGV4dGVudCBvd25lciAqLworCWVudW0geGZzX2FnX3Jlc3ZfdHlwZQl0eXBlKTsJLyogYmxvY2sgcmVzZXJ2YXRpb24gdHlwZSAqLwogCiBpbnQJCQkJLyogZXJyb3IgKi8KIHhmc19hbGxvY19sb29rdXBfZ2UoCmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19ibWFwLmMgYi9mcy94ZnMvbGlieGZzL3hmc19ibWFwLmMKaW5kZXggYjA2MGJjYS4uOWQ3ZjYxZCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5jCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuYwpAQCAtNDcsNiArNDcsNyBAQAogI2luY2x1ZGUgInhmc19hdHRyX2xlYWYuaCIKICNpbmNsdWRlICJ4ZnNfZmlsZXN0cmVhbS5oIgogI2luY2x1ZGUgInhmc19ybWFwLmgiCisjaW5jbHVkZSAieGZzX2FnX3Jlc3YuaCIKIAogCiBrbWVtX3pvbmVfdAkJKnhmc19ibWFwX2ZyZWVfaXRlbV96b25lOwpAQCAtMTM4OCw3ICsxMzg5LDcgQEAKICAqIEVsc2UsICpsYXN0eHAgd2lsbCBiZSBzZXQgdG8gdGhlIGluZGV4IG9mIHRoZSBmb3VuZAogICogZW50cnk7ICpnb3RwIHdpbGwgY29udGFpbiB0aGUgZW50cnkuCiAgKi8KLVNUQVRJQyB4ZnNfYm1idF9yZWNfaG9zdF90ICogICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gZm91bmQgZXh0ZW50IGVudHJ5ICovCit4ZnNfYm1idF9yZWNfaG9zdF90ICogICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gZm91bmQgZXh0ZW50IGVudHJ5ICovCiB4ZnNfYm1hcF9zZWFyY2hfZXh0ZW50cygKIAl4ZnNfaW5vZGVfdCAgICAgKmlwLCAgICAgICAgICAgIC8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCiAJeGZzX2ZpbGVvZmZfdCAgIGJubywgICAgICAgICAgICAvKiBibG9jayBudW1iZXIgc2VhcmNoZWQgZm9yICovCkBAIC0zMzQ3LDcgKzMzNDgsOCBAQAogCiAJbXAgPSBhcC0+aXAtPmlfbW91bnQ7CiAJbnVsbGZiID0gKmFwLT5maXJzdGJsb2NrID09IE5VTExGU0JMT0NLOwotCXJ0ID0gWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGFwLT5pcCkgJiYgYXAtPnVzZXJkYXRhOworCXJ0ID0gWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGFwLT5pcCkgJiYKKwkJeGZzX2FsbG9jX2lzX3VzZXJkYXRhKGFwLT5kYXRhdHlwZSk7CiAJZmJfYWdubyA9IG51bGxmYiA/IE5VTExBR05VTUJFUiA6IFhGU19GU0JfVE9fQUdOTyhtcCwgKmFwLT5maXJzdGJsb2NrKTsKIAkvKgogCSAqIElmIGFsbG9jYXRpbmcgYXQgZW9mLCBhbmQgdGhlcmUncyBhIHByZXZpb3VzIHJlYWwgYmxvY2ssCkBAIC0zNTAxLDcgKzM1MDMsOCBAQAogCX0KIAogCWxvbmdlc3QgPSB4ZnNfYWxsb2NfbG9uZ2VzdF9mcmVlX2V4dGVudChtcCwgcGFnLAotCQkJCQl4ZnNfYWxsb2NfbWluX2ZyZWVsaXN0KG1wLCBwYWcpKTsKKwkJCQl4ZnNfYWxsb2NfbWluX2ZyZWVsaXN0KG1wLCBwYWcpLAorCQkJCXhmc19hZ19yZXN2X25lZWRlZChwYWcsIFhGU19BR19SRVNWX05PTkUpKTsKIAlpZiAoKmJsZW4gPCBsb25nZXN0KQogCQkqYmxlbiA9IGxvbmdlc3Q7CiAKQEAgLTM2MjIsNyArMzYyNSw3IEBACiB7CiAJeGZzX21vdW50X3QJKm1wOwkJLyogbW91bnQgcG9pbnQgc3RydWN0dXJlICovCiAJeGZzX2FsbG9jdHlwZV90CWF0eXBlID0gMDsJLyogdHlwZSBmb3IgYWxsb2NhdGlvbiByb3V0aW5lcyAqLwotCXhmc19leHRsZW5fdAlhbGlnbjsJCS8qIG1pbmltdW0gYWxsb2NhdGlvbiBhbGlnbm1lbnQgKi8KKwl4ZnNfZXh0bGVuX3QJYWxpZ24gPSAwOwkvKiBtaW5pbXVtIGFsbG9jYXRpb24gYWxpZ25tZW50ICovCiAJeGZzX2FnbnVtYmVyX3QJZmJfYWdubzsJLyogYWcgbnVtYmVyIG9mIGFwLT5maXJzdGJsb2NrICovCiAJeGZzX2FnbnVtYmVyX3QJYWc7CiAJeGZzX2FsbG9jX2FyZ190CWFyZ3M7CkBAIC0zNjQ1LDcgKzM2NDgsOCBAQAogCWVsc2UgaWYgKG1wLT5tX2RhbGlnbikKIAkJc3RyaXBlX2FsaWduID0gbXAtPm1fZGFsaWduOwogCi0JYWxpZ24gPSBhcC0+dXNlcmRhdGEgPyB4ZnNfZ2V0X2V4dHN6X2hpbnQoYXAtPmlwKSA6IDA7CisJaWYgKHhmc19hbGxvY19pc191c2VyZGF0YShhcC0+ZGF0YXR5cGUpKQorCQlhbGlnbiA9IHhmc19nZXRfZXh0c3pfaGludChhcC0+aXApOwogCWlmICh1bmxpa2VseShhbGlnbikpIHsKIAkJZXJyb3IgPSB4ZnNfYm1hcF9leHRzaXplX2FsaWduKG1wLCAmYXAtPmdvdCwgJmFwLT5wcmV2LAogCQkJCQkJYWxpZ24sIDAsIGFwLT5lb2YsIDAsIGFwLT5jb252LApAQCAtMzY1OCw3ICszNjYyLDggQEAKIAludWxsZmIgPSAqYXAtPmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0s7CiAJZmJfYWdubyA9IG51bGxmYiA/IE5VTExBR05VTUJFUiA6IFhGU19GU0JfVE9fQUdOTyhtcCwgKmFwLT5maXJzdGJsb2NrKTsKIAlpZiAobnVsbGZiKSB7Ci0JCWlmIChhcC0+dXNlcmRhdGEgJiYgeGZzX2lub2RlX2lzX2ZpbGVzdHJlYW0oYXAtPmlwKSkgeworCQlpZiAoeGZzX2FsbG9jX2lzX3VzZXJkYXRhKGFwLT5kYXRhdHlwZSkgJiYKKwkJICAgIHhmc19pbm9kZV9pc19maWxlc3RyZWFtKGFwLT5pcCkpIHsKIAkJCWFnID0geGZzX2ZpbGVzdHJlYW1fbG9va3VwX2FnKGFwLT5pcCk7CiAJCQlhZyA9IChhZyAhPSBOVUxMQUdOVU1CRVIpID8gYWcgOiAwOwogCQkJYXAtPmJsa25vID0gWEZTX0FHQl9UT19GU0IobXAsIGFnLCAwKTsKQEAgLTM2OTgsNyArMzcwMyw4IEBACiAJCSAqIGVub3VnaCBmb3IgdGhlIHJlcXVlc3QuICBJZiBvbmUgaXNuJ3QgZm91bmQsIHRoZW4gYWRqdXN0CiAJCSAqIHRoZSBtaW5pbXVtIGFsbG9jYXRpb24gc2l6ZSB0byB0aGUgbGFyZ2VzdCBzcGFjZSBmb3VuZC4KIAkJICovCi0JCWlmIChhcC0+dXNlcmRhdGEgJiYgeGZzX2lub2RlX2lzX2ZpbGVzdHJlYW0oYXAtPmlwKSkKKwkJaWYgKHhmc19hbGxvY19pc191c2VyZGF0YShhcC0+ZGF0YXR5cGUpICYmCisJCSAgICB4ZnNfaW5vZGVfaXNfZmlsZXN0cmVhbShhcC0+aXApKQogCQkJZXJyb3IgPSB4ZnNfYm1hcF9idGFsbG9jX2ZpbGVzdHJlYW1zKGFwLCAmYXJncywgJmJsZW4pOwogCQllbHNlCiAJCQllcnJvciA9IHhmc19ibWFwX2J0YWxsb2NfbnVsbGZiKGFwLCAmYXJncywgJmJsZW4pOwpAQCAtMzc4MSw5ICszNzg3LDkgQEAKIAl9CiAJYXJncy5taW5sZWZ0ID0gYXAtPm1pbmxlZnQ7CiAJYXJncy53YXNkZWwgPSBhcC0+d2FzZGVsOwotCWFyZ3MuaXNmbCA9IDA7Ci0JYXJncy51c2VyZGF0YSA9IGFwLT51c2VyZGF0YTsKLQlpZiAoYXAtPnVzZXJkYXRhICYgWEZTX0FMTE9DX1VTRVJEQVRBX1pFUk8pCisJYXJncy5yZXN2ID0gWEZTX0FHX1JFU1ZfTk9ORTsKKwlhcmdzLmRhdGF0eXBlID0gYXAtPmRhdGF0eXBlOworCWlmIChhcC0+ZGF0YXR5cGUgJiBYRlNfQUxMT0NfVVNFUkRBVEFfWkVSTykKIAkJYXJncy5pcCA9IGFwLT5pcDsKIAogCWVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpOwpAQCAtMzg3Nyw3ICszODgzLDggQEAKIHhmc19ibWFwX2FsbG9jKAogCXN0cnVjdCB4ZnNfYm1hbGxvY2EJKmFwKQkvKiBibWFwIGFsbG9jIGFyZ3VtZW50IHN0cnVjdCAqLwogewotCWlmIChYRlNfSVNfUkVBTFRJTUVfSU5PREUoYXAtPmlwKSAmJiBhcC0+dXNlcmRhdGEpCisJaWYgKFhGU19JU19SRUFMVElNRV9JTk9ERShhcC0+aXApICYmCisJICAgIHhmc19hbGxvY19pc191c2VyZGF0YShhcC0+ZGF0YXR5cGUpKQogCQlyZXR1cm4geGZzX2JtYXBfcnRhbGxvYyhhcCk7CiAJcmV0dXJuIHhmc19ibWFwX2J0YWxsb2MoYXApOwogfQpAQCAtNDA3NCw3ICs0MDgxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotU1RBVElDIGludAoraW50CiB4ZnNfYm1hcGlfcmVzZXJ2ZV9kZWxhbGxvYygKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKIAl4ZnNfZmlsZW9mZl90CQlhb2ZmLApAQCAtNDE3MCw5MSArNDE3Nyw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0vKgotICogTWFwIGZpbGUgYmxvY2tzIHRvIGZpbGVzeXN0ZW0gYmxvY2tzLCBhZGRpbmcgZGVsYXllZCBhbGxvY2F0aW9ucyBhcyBuZWVkZWQuCi0gKi8KLWludAoteGZzX2JtYXBpX2RlbGF5KAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkvKiBpbmNvcmUgaW5vZGUgKi8KLQl4ZnNfZmlsZW9mZl90CQlibm8sCS8qIHN0YXJ0aW5nIGZpbGUgb2Zmcy4gbWFwcGVkICovCi0JeGZzX2ZpbGJsa3NfdAkJbGVuLAkvKiBsZW5ndGggdG8gbWFwIGluIGZpbGUgKi8KLQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwkqbXZhbCwJLyogb3V0cHV0OiBtYXAgdmFsdWVzICovCi0JaW50CQkJKm5tYXAsCS8qIGkvbzogbXZhbCBzaXplL2NvdW50ICovCi0JaW50CQkJZmxhZ3MpCS8qIFhGU19CTUFQSV8uLi4gKi8KLXsKLQlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OwotCXN0cnVjdCB4ZnNfaWZvcmsJKmlmcCA9IFhGU19JRk9SS19QVFIoaXAsIFhGU19EQVRBX0ZPUkspOwotCXN0cnVjdCB4ZnNfYm1idF9pcmVjCWdvdDsJLyogY3VycmVudCBmaWxlIGV4dGVudCByZWNvcmQgKi8KLQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYwlwcmV2OwkvKiBwcmV2aW91cyBmaWxlIGV4dGVudCByZWNvcmQgKi8KLQl4ZnNfZmlsZW9mZl90CQlvYm5vOwkvKiBvbGQgYmxvY2sgbnVtYmVyIChvZmZzZXQpICovCi0JeGZzX2ZpbGVvZmZfdAkJZW5kOwkvKiBlbmQgb2YgbWFwcGVkIGZpbGUgcmVnaW9uICovCi0JeGZzX2V4dG51bV90CQlsYXN0eDsJLyogbGFzdCB1c2VmdWwgZXh0ZW50IG51bWJlciAqLwotCWludAkJCWVvZjsJLyogd2UndmUgaGl0IHRoZSBlbmQgb2YgZXh0ZW50cyAqLwotCWludAkJCW4gPSAwOwkvKiBjdXJyZW50IGV4dGVudCBpbmRleCAqLwotCWludAkJCWVycm9yID0gMDsKLQotCUFTU0VSVCgqbm1hcCA+PSAxKTsKLQlBU1NFUlQoKm5tYXAgPD0gWEZTX0JNQVBfTUFYX05NQVApOwotCUFTU0VSVCghKGZsYWdzICYgflhGU19CTUFQSV9FTlRJUkUpKTsKLQlBU1NFUlQoeGZzX2lzaWxvY2tlZChpcCwgWEZTX0lMT0NLX0VYQ0wpKTsKLQotCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUigKLQkgICAgKFhGU19JRk9SS19GT1JNQVQoaXAsIFhGU19EQVRBX0ZPUkspICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKLQkgICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIFhGU19EQVRBX0ZPUkspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFKSwKLQkgICAgIG1wLCBYRlNfRVJSVEFHX0JNQVBJRk9STUFULCBYRlNfUkFORE9NX0JNQVBJRk9STUFUKSkpIHsKLQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBpX2RlbGF5IiwgWEZTX0VSUkxFVkVMX0xPVywgbXApOwotCQlyZXR1cm4gLUVGU0NPUlJVUFRFRDsKLQl9Ci0KLQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCi0JCXJldHVybiAtRUlPOwotCi0JWEZTX1NUQVRTX0lOQyhtcCwgeHNfYmxrX21hcHcpOwotCi0JaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSB7Ci0JCWVycm9yID0geGZzX2lyZWFkX2V4dGVudHMoTlVMTCwgaXAsIFhGU19EQVRBX0ZPUkspOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JeGZzX2JtYXBfc2VhcmNoX2V4dGVudHMoaXAsIGJubywgWEZTX0RBVEFfRk9SSywgJmVvZiwgJmxhc3R4LCAmZ290LCAmcHJldik7Ci0JZW5kID0gYm5vICsgbGVuOwotCW9ibm8gPSBibm87Ci0KLQl3aGlsZSAoYm5vIDwgZW5kICYmIG4gPCAqbm1hcCkgewotCQlpZiAoZW9mIHx8IGdvdC5icl9zdGFydG9mZiA+IGJubykgewotCQkJZXJyb3IgPSB4ZnNfYm1hcGlfcmVzZXJ2ZV9kZWxhbGxvYyhpcCwgYm5vLCBsZW4sICZnb3QsCi0JCQkJCQkJICAgJnByZXYsICZsYXN0eCwgZW9mKTsKLQkJCWlmIChlcnJvcikgewotCQkJCWlmIChuID09IDApIHsKLQkJCQkJKm5tYXAgPSAwOwotCQkJCQlyZXR1cm4gZXJyb3I7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLyogc2V0IHVwIHRoZSBleHRlbnQgbWFwIHRvIHJldHVybi4gKi8KLQkJeGZzX2JtYXBpX3RyaW1fbWFwKG12YWwsICZnb3QsICZibm8sIGxlbiwgb2JubywgZW5kLCBuLCBmbGFncyk7Ci0JCXhmc19ibWFwaV91cGRhdGVfbWFwKCZtdmFsLCAmYm5vLCAmbGVuLCBvYm5vLCBlbmQsICZuLCBmbGFncyk7Ci0KLQkJLyogSWYgd2UncmUgZG9uZSwgc3RvcCBub3cuICovCi0JCWlmIChibm8gPj0gZW5kIHx8IG4gPj0gKm5tYXApCi0JCQlicmVhazsKLQotCQkvKiBFbHNlIGdvIG9uIHRvIHRoZSBuZXh0IHJlY29yZC4gKi8KLQkJcHJldiA9IGdvdDsKLQkJaWYgKCsrbGFzdHggPCBpZnAtPmlmX2J5dGVzIC8gc2l6ZW9mKHhmc19ibWJ0X3JlY190KSkKLQkJCXhmc19ibWJ0X2dldF9hbGwoeGZzX2lleHRfZ2V0X2V4dChpZnAsIGxhc3R4KSwgJmdvdCk7Ci0JCWVsc2UKLQkJCWVvZiA9IDE7Ci0JfQotCi0JKm5tYXAgPSBuOwotCXJldHVybiAwOwotfQotCi0KIHN0YXRpYyBpbnQKIHhmc19ibWFwaV9hbGxvY2F0ZSgKIAlzdHJ1Y3QgeGZzX2JtYWxsb2NhCSpibWEpCkBAIC00Mjg3LDE1ICs0MjA5LDIxIEBACiAJfQogCiAJLyoKLQkgKiBJbmRpY2F0ZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB1c2VyIGRhdGEgaW4gdGhlIGZpbGUsIG9yIGp1c3QgYW55Ci0JICogdXNlciBkYXRhLiBBbmQgaWYgaXQgaXMgdXNlcmRhdGEsIGluZGljYXRlIHdoZXRoZXIgaXQgbmVlZHMgdG8KLQkgKiBiZSBpbml0aWFsaXNlZCB0byB6ZXJvIGR1cmluZyBhbGxvY2F0aW9uLgorCSAqIFNldCB0aGUgZGF0YSB0eXBlIGJlaW5nIGFsbG9jYXRlZC4gRm9yIHRoZSBkYXRhIGZvcmssIHRoZSBmaXJzdCBkYXRhCisJICogaW4gdGhlIGZpbGUgaXMgdHJlYXRlZCBkaWZmZXJlbnRseSB0byBhbGwgb3RoZXIgYWxsb2NhdGlvbnMuIEZvciB0aGUKKwkgKiBhdHRyaWJ1dGUgZm9yaywgd2Ugb25seSBuZWVkIHRvIGVuc3VyZSB0aGUgYWxsb2NhdGVkIHJhbmdlIGlzIG5vdCBvbgorCSAqIHRoZSBidXN5IGxpc3QuCiAJICovCiAJaWYgKCEoYm1hLT5mbGFncyAmIFhGU19CTUFQSV9NRVRBREFUQSkpIHsKLQkJYm1hLT51c2VyZGF0YSA9IChibWEtPm9mZnNldCA9PSAwKSA/Ci0JCQlYRlNfQUxMT0NfSU5JVElBTF9VU0VSX0RBVEEgOiBYRlNfQUxMT0NfVVNFUkRBVEE7CisJCWJtYS0+ZGF0YXR5cGUgPSBYRlNfQUxMT0NfTk9CVVNZOworCQlpZiAod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspIHsKKwkJCWlmIChibWEtPm9mZnNldCA9PSAwKQorCQkJCWJtYS0+ZGF0YXR5cGUgfD0gWEZTX0FMTE9DX0lOSVRJQUxfVVNFUl9EQVRBOworCQkJZWxzZQorCQkJCWJtYS0+ZGF0YXR5cGUgfD0gWEZTX0FMTE9DX1VTRVJEQVRBOworCQl9CiAJCWlmIChibWEtPmZsYWdzICYgWEZTX0JNQVBJX1pFUk8pCi0JCQlibWEtPnVzZXJkYXRhIHw9IFhGU19BTExPQ19VU0VSREFUQV9aRVJPOworCQkJYm1hLT5kYXRhdHlwZSB8PSBYRlNfQUxMT0NfVVNFUkRBVEFfWkVSTzsKIAl9CiAKIAlibWEtPm1pbmxlbiA9IChibWEtPmZsYWdzICYgWEZTX0JNQVBJX0NPTlRJRykgPyBibWEtPmxlbmd0aCA6IDE7CkBAIC00NTY1LDcgKzQ0OTMsNyBAQAogCWJtYS50cCA9IHRwOwogCWJtYS5pcCA9IGlwOwogCWJtYS50b3RhbCA9IHRvdGFsOwotCWJtYS51c2VyZGF0YSA9IDA7CisJYm1hLmRhdGF0eXBlID0gMDsKIAlibWEuZGZvcHMgPSBkZm9wczsKIAlibWEuZmlyc3RibG9jayA9IGZpcnN0YmxvY2s7CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuaCBiL2ZzL3hmcy9saWJ4ZnMveGZzX2JtYXAuaAppbmRleCAyNTQwMzRmLi44Mzk1ZjZlIDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19ibWFwLmgKKysrIGIvZnMveGZzL2xpYnhmcy94ZnNfYm1hcC5oCkBAIC01NCw3ICs1NCw3IEBACiAJYm9vbAkJCXdhc2RlbDsJLyogcmVwbGFjaW5nIGEgZGVsYXllZCBhbGxvY2F0aW9uICovCiAJYm9vbAkJCWFlb2Y7CS8qIGFsbG9jYXRlZCBzcGFjZSBhdCBlb2YgKi8KIAlib29sCQkJY29udjsJLyogb3ZlcndyaXRpbmcgdW53cml0dGVuIGV4dGVudHMgKi8KLQljaGFyCQkJdXNlcmRhdGE7LyogdXNlcmRhdGEgbWFzayAqLworCWludAkJCWRhdGF0eXBlOy8qIGRhdGEgdHlwZSBiZWluZyBhbGxvY2F0ZWQgKi8KIAlpbnQJCQlmbGFnczsKIH07CiAKQEAgLTE4MSw5ICsxODEsNiBAQAogaW50CXhmc19ibWFwaV9yZWFkKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfZmlsZW9mZl90IGJubywKIAkJeGZzX2ZpbGJsa3NfdCBsZW4sIHN0cnVjdCB4ZnNfYm1idF9pcmVjICptdmFsLAogCQlpbnQgKm5tYXAsIGludCBmbGFncyk7Ci1pbnQJeGZzX2JtYXBpX2RlbGF5KHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfZmlsZW9mZl90IGJubywKLQkJeGZzX2ZpbGJsa3NfdCBsZW4sIHN0cnVjdCB4ZnNfYm1idF9pcmVjICptdmFsLAotCQlpbnQgKm5tYXAsIGludCBmbGFncyk7CiBpbnQJeGZzX2JtYXBpX3dyaXRlKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICppcCwKIAkJeGZzX2ZpbGVvZmZfdCBibm8sIHhmc19maWxibGtzX3QgbGVuLCBpbnQgZmxhZ3MsCiAJCXhmc19mc2Jsb2NrX3QgKmZpcnN0YmxvY2ssIHhmc19leHRsZW5fdCB0b3RhbCwKQEAgLTIwMiw1ICsxOTksMTIgQEAKIAkJc3RydWN0IHhmc19kZWZlcl9vcHMgKmRmb3BzLCBlbnVtIHNoaWZ0X2RpcmVjdGlvbiBkaXJlY3Rpb24sCiAJCWludCBudW1fZXh0cyk7CiBpbnQJeGZzX2JtYXBfc3BsaXRfZXh0ZW50KHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfZmlsZW9mZl90IHNwbGl0X29mZnNldCk7CitzdHJ1Y3QgeGZzX2JtYnRfcmVjX2hvc3QgKgorCXhmc19ibWFwX3NlYXJjaF9leHRlbnRzKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfZmlsZW9mZl90IGJubywKKwkJaW50IGZvcmssIGludCAqZW9mcCwgeGZzX2V4dG51bV90ICpsYXN0eHAsCisJCXN0cnVjdCB4ZnNfYm1idF9pcmVjICpnb3RwLCBzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqcHJldnApOworaW50CXhmc19ibWFwaV9yZXNlcnZlX2RlbGFsbG9jKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfZmlsZW9mZl90IGFvZmYsCisJCXhmc19maWxibGtzX3QgbGVuLCBzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqZ290LAorCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqcHJldiwgeGZzX2V4dG51bV90ICpsYXN0eCwgaW50IGVvZik7CiAKICNlbmRpZgkvKiBfX1hGU19CTUFQX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfYnRyZWUuYyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2J0cmVlLmMKaW5kZXggYjVjMjEzYS4uYWExNzUyZiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfYnRyZWUuYworKysgYi9mcy94ZnMvbGlieGZzL3hmc19idHJlZS5jCkBAIC0xODE0LDYgKzE4MTQsMTAgQEAKIAogCVhGU19CVFJFRV9TVEFUU19JTkMoY3VyLCBsb29rdXApOwogCisJLyogTm8gc3VjaCB0aGluZyBhcyBhIHplcm8tbGV2ZWwgdHJlZS4gKi8KKwlpZiAoY3VyLT5iY19ubGV2ZWxzID09IDApCisJCXJldHVybiAtRUZTQ09SUlVQVEVEOworCiAJYmxvY2sgPSBOVUxMOwogCWtleW5vID0gMDsKIApAQCAtMjA2Niw3ICsyMDcwLDcgQEAKIAlzdHJ1Y3QgeGZzX2J1ZgkJKmJwMCwKIAlib29sCQkJZm9yY2VfYWxsKQogewotCXVuaW9uIHhmc19idHJlZV9iaWdrZXkJa2V5OwkvKiBrZXlzIGZyb20gY3VycmVudCBsZXZlbCAqLworCXVuaW9uIHhmc19idHJlZV9rZXkJa2V5OwkvKiBrZXlzIGZyb20gY3VycmVudCBsZXZlbCAqLwogCXVuaW9uIHhmc19idHJlZV9rZXkJKmxrZXk7CS8qIGtleXMgZnJvbSB0aGUgbmV4dCBsZXZlbCB1cCAqLwogCXVuaW9uIHhmc19idHJlZV9rZXkJKmhrZXk7CiAJdW5pb24geGZzX2J0cmVlX2tleQkqbmxrZXk7CS8qIGtleXMgZnJvbSB0aGUgbmV4dCBsZXZlbCB1cCAqLwpAQCAtMjA4Miw3ICsyMDg2LDcgQEAKIAogCXRyYWNlX3hmc19idHJlZV91cGRrZXlzKGN1ciwgbGV2ZWwsIGJwMCk7CiAKLQlsa2V5ID0gKHVuaW9uIHhmc19idHJlZV9rZXkgKikma2V5OworCWxrZXkgPSAma2V5OwogCWhrZXkgPSB4ZnNfYnRyZWVfaGlnaF9rZXlfZnJvbV9rZXkoY3VyLCBsa2V5KTsKIAl4ZnNfYnRyZWVfZ2V0X2tleXMoY3VyLCBibG9jaywgbGtleSk7CiAJZm9yIChsZXZlbCsrOyBsZXZlbCA8IGN1ci0+YmNfbmxldmVsczsgbGV2ZWwrKykgewpAQCAtMzIyMiw3ICszMjI2LDcgQEAKIAlzdHJ1Y3QgeGZzX2J1ZgkJKmJwOwkvKiBidWZmZXIgZm9yIGJsb2NrICovCiAJdW5pb24geGZzX2J0cmVlX3B0cglucHRyOwkvKiBuZXcgYmxvY2sgcHRyICovCiAJc3RydWN0IHhmc19idHJlZV9jdXIJKm5jdXI7CS8qIG5ldyBidHJlZSBjdXJzb3IgKi8KLQl1bmlvbiB4ZnNfYnRyZWVfYmlna2V5CW5rZXk7CS8qIG5ldyBibG9jayBrZXkgKi8KKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CW5rZXk7CS8qIG5ldyBibG9jayBrZXkgKi8KIAl1bmlvbiB4ZnNfYnRyZWVfa2V5CSpsa2V5OwogCWludAkJCW9wdHI7CS8qIG9sZCBrZXkvcmVjb3JkIGluZGV4ICovCiAJaW50CQkJcHRyOwkvKiBrZXkvcmVjb3JkIGluZGV4ICovCkBAIC0zMjM3LDcgKzMyNDEsNyBAQAogCVhGU19CVFJFRV9UUkFDRV9BUkdJUFIoY3VyLCBsZXZlbCwgKnB0cnAsICZyZWMpOwogCiAJbmN1ciA9IE5VTEw7Ci0JbGtleSA9ICh1bmlvbiB4ZnNfYnRyZWVfa2V5ICopJm5rZXk7CisJbGtleSA9ICZua2V5OwogCiAJLyoKIAkgKiBJZiB3ZSBoYXZlIGFuIGV4dGVybmFsIHJvb3QgcG9pbnRlciwgYW5kIHdlJ3ZlIG1hZGUgaXQgdG8gdGhlCkBAIC0zNDQwLDE0ICszNDQ0LDE0IEBACiAJdW5pb24geGZzX2J0cmVlX3B0cglucHRyOwkvKiBuZXcgYmxvY2sgbnVtYmVyIChzcGxpdCByZXN1bHQpICovCiAJc3RydWN0IHhmc19idHJlZV9jdXIJKm5jdXI7CS8qIG5ldyBjdXJzb3IgKHNwbGl0IHJlc3VsdCkgKi8KIAlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqcGN1cjsJLyogcHJldmlvdXMgbGV2ZWwncyBjdXJzb3IgKi8KLQl1bmlvbiB4ZnNfYnRyZWVfYmlna2V5CWJrZXk7CS8qIGtleSBvZiBibG9jayB0byBpbnNlcnQgKi8KKwl1bmlvbiB4ZnNfYnRyZWVfa2V5CWJrZXk7CS8qIGtleSBvZiBibG9jayB0byBpbnNlcnQgKi8KIAl1bmlvbiB4ZnNfYnRyZWVfa2V5CSprZXk7CiAJdW5pb24geGZzX2J0cmVlX3JlYwlyZWM7CS8qIHJlY29yZCB0byBpbnNlcnQgKi8KIAogCWxldmVsID0gMDsKIAluY3VyID0gTlVMTDsKIAlwY3VyID0gY3VyOwotCWtleSA9ICh1bmlvbiB4ZnNfYnRyZWVfa2V5ICopJmJrZXk7CisJa2V5ID0gJmJrZXk7CiAKIAl4ZnNfYnRyZWVfc2V0X3B0cl9udWxsKGN1ciwgJm5wdHIpOwogCkBAIC00NTU0LDE1ICs0NTU4LDIyIEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAorCS8qIE5vdGhpbmc/ICBTZWUgaWYgdGhlcmUncyBhbnl0aGluZyB0byB0aGUgcmlnaHQuICovCisJaWYgKCFzdGF0KSB7CisJCWVycm9yID0geGZzX2J0cmVlX2luY3JlbWVudChjdXIsIDAsICZzdGF0KTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJfQorCiAJd2hpbGUgKHN0YXQpIHsKIAkJLyogRmluZCB0aGUgcmVjb3JkLiAqLwogCQllcnJvciA9IHhmc19idHJlZV9nZXRfcmVjKGN1ciwgJnJlY3AsICZzdGF0KTsKIAkJaWYgKGVycm9yIHx8ICFzdGF0KQogCQkJYnJlYWs7Ci0JCWN1ci0+YmNfb3BzLT5pbml0X2hpZ2hfa2V5X2Zyb21fcmVjKCZyZWNfa2V5LCByZWNwKTsKIAogCQkvKiBTa2lwIGlmIGhpZ2hfa2V5KHJlYykgPCBsb3dfa2V5LiAqLwogCQlpZiAoZmlyc3RyZWMpIHsKKwkJCWN1ci0+YmNfb3BzLT5pbml0X2hpZ2hfa2V5X2Zyb21fcmVjKCZyZWNfa2V5LCByZWNwKTsKIAkJCWZpcnN0cmVjID0gZmFsc2U7CiAJCQlkaWZmID0gY3VyLT5iY19vcHMtPmRpZmZfdHdvX2tleXMoY3VyLCBsb3dfa2V5LAogCQkJCQkmcmVjX2tleSk7CkBAIC00NTcxLDYgKzQ1ODIsNyBAQAogCQl9CiAKIAkJLyogU3RvcCBpZiBoaWdoX2tleSA8IGxvd19rZXkocmVjKS4gKi8KKwkJY3VyLT5iY19vcHMtPmluaXRfa2V5X2Zyb21fcmVjKCZyZWNfa2V5LCByZWNwKTsKIAkJZGlmZiA9IGN1ci0+YmNfb3BzLT5kaWZmX3R3b19rZXlzKGN1ciwgJnJlY19rZXksIGhpZ2hfa2V5KTsKIAkJaWYgKGRpZmYgPiAwKQogCQkJYnJlYWs7CkBAIC00Nzg1LDMgKzQ3OTcsNTAgQEAKIAlyZXR1cm4geGZzX2J0cmVlX292ZXJsYXBwZWRfcXVlcnlfcmFuZ2UoY3VyLCAmbG93X2tleSwgJmhpZ2hfa2V5LAogCQkJZm4sIHByaXYpOwogfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYmxvY2tzIG5lZWRlZCB0byBzdG9yZSBhIGdpdmVuIG51bWJlciBvZiByZWNvcmRzCisgKiBpbiBhIHNob3J0LWZvcm1hdCAocGVyLUFHIG1ldGFkYXRhKSBidHJlZS4KKyAqLworeGZzX2V4dGxlbl90Cit4ZnNfYnRyZWVfY2FsY19zaXplKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCXVpbnQJCQkqbGltaXRzLAorCXVuc2lnbmVkIGxvbmcgbG9uZwlsZW4pCit7CisJaW50CQkJbGV2ZWw7CisJaW50CQkJbWF4cmVjczsKKwl4ZnNfZXh0bGVuX3QJCXJ2YWw7CisKKwltYXhyZWNzID0gbGltaXRzWzBdOworCWZvciAobGV2ZWwgPSAwLCBydmFsID0gMDsgbGVuID4gMTsgbGV2ZWwrKykgeworCQlsZW4gKz0gbWF4cmVjcyAtIDE7CisJCWRvX2RpdihsZW4sIG1heHJlY3MpOworCQltYXhyZWNzID0gbGltaXRzWzFdOworCQlydmFsICs9IGxlbjsKKwl9CisJcmV0dXJuIHJ2YWw7Cit9CisKK2ludAoreGZzX2J0cmVlX2NvdW50X2Jsb2Nrc19oZWxwZXIoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwlpbnQJCQlsZXZlbCwKKwl2b2lkCQkJKmRhdGEpCit7CisJeGZzX2V4dGxlbl90CQkqYmxvY2tzID0gZGF0YTsKKwkoKmJsb2NrcykrKzsKKworCXJldHVybiAwOworfQorCisvKiBDb3VudCB0aGUgYmxvY2tzIGluIGEgYnRyZWUgYW5kIHJldHVybiB0aGUgcmVzdWx0IGluICpibG9ja3MuICovCitpbnQKK3hmc19idHJlZV9jb3VudF9ibG9ja3MoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwKKwl4ZnNfZXh0bGVuX3QJCSpibG9ja3MpCit7CisJKmJsb2NrcyA9IDA7CisJcmV0dXJuIHhmc19idHJlZV92aXNpdF9ibG9ja3MoY3VyLCB4ZnNfYnRyZWVfY291bnRfYmxvY2tzX2hlbHBlciwKKwkJCWJsb2Nrcyk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19idHJlZS5oIGIvZnMveGZzL2xpYnhmcy94ZnNfYnRyZWUuaAppbmRleCAwNGQwODY1Li4zZjg1NTZhIDEwMDY0NAotLS0gYS9mcy94ZnMvbGlieGZzL3hmc19idHJlZS5oCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2J0cmVlLmgKQEAgLTM3LDMwICszNywxOCBAQAogCV9fYmU2NAkJCWw7CS8qIGxvbmcgZm9ybSBwdHIgKi8KIH07CiAKKy8qCisgKiBUaGUgaW4tY29yZSBidHJlZSBrZXkuICBPdmVybGFwcGluZyBidHJlZXMgYWN0dWFsbHkgc3RvcmUgdHdvIGtleXMKKyAqIHBlciBwb2ludGVyLCBzbyB3ZSByZXNlcnZlIGVub3VnaCBtZW1vcnkgdG8gaG9sZCBib3RoLiAgVGhlIF9fKmJpZ2tleQorICogaXRlbXMgc2hvdWxkIG5ldmVyIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LgorICovCiB1bmlvbiB4ZnNfYnRyZWVfa2V5IHsKIAlzdHJ1Y3QgeGZzX2JtYnRfa2V5CQlibWJ0OwogCXhmc19ibWRyX2tleV90CQkJYm1icjsJLyogYm1idCByb290IGJsb2NrICovCiAJeGZzX2FsbG9jX2tleV90CQkJYWxsb2M7CiAJc3RydWN0IHhmc19pbm9idF9rZXkJCWlub2J0OwogCXN0cnVjdCB4ZnNfcm1hcF9rZXkJCXJtYXA7Ci19OwotCi0vKgotICogSW4tY29yZSBrZXkgdGhhdCBob2xkcyBib3RoIGxvdyBhbmQgaGlnaCBrZXlzIGZvciBvdmVybGFwcGVkIGJ0cmVlcy4KLSAqIFRoZSB0d28ga2V5cyBhcmUgcGFja2VkIG5leHQgdG8gZWFjaCBvdGhlciBvbiBkaXNrLCBzbyBkbyB0aGUgc2FtZQotICogaW4gbWVtb3J5LiAgUHJlc2VydmUgdGhlIGV4aXN0aW5nIHhmc19idHJlZV9rZXkgYXMgYSBzaW5nbGUga2V5IHRvCi0gKiBhdm9pZCB0aGUgbWVudGFsIG1vZGVsIGJyZWFrYWdlIHRoYXQgd291bGQgaGFwcGVuIGlmIHdlIHBhc3NlZCBhCi0gKiBiaWdrZXkgaW50byBhIGZ1bmN0aW9uIHRoYXQgb3BlcmF0ZXMgb24gYSBzaW5nbGUga2V5LgotICovCi11bmlvbiB4ZnNfYnRyZWVfYmlna2V5IHsKLQlzdHJ1Y3QgeGZzX2JtYnRfa2V5CQlibWJ0OwotCXhmc19ibWRyX2tleV90CQkJYm1icjsJLyogYm1idCByb290IGJsb2NrICovCi0JeGZzX2FsbG9jX2tleV90CQkJYWxsb2M7Ci0Jc3RydWN0IHhmc19pbm9idF9rZXkJCWlub2J0OwotCXN0cnVjdCB7Ci0JCXN0cnVjdCB4ZnNfcm1hcF9rZXkJcm1hcDsKLQkJc3RydWN0IHhmc19ybWFwX2tleQlybWFwX2hpOwotCX07CisJc3RydWN0IHhmc19ybWFwX2tleQkJX19ybWFwX2JpZ2tleVsyXTsKIH07CiAKIHVuaW9uIHhmc19idHJlZV9yZWMgewpAQCAtNTEzLDYgKzUwMSw4IEBACiBib29sIHhmc19idHJlZV9zYmxvY2tfdmVyaWZ5KHN0cnVjdCB4ZnNfYnVmICpicCwgdW5zaWduZWQgaW50IG1heF9yZWNzKTsKIHVpbnQgeGZzX2J0cmVlX2NvbXB1dGVfbWF4bGV2ZWxzKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB1aW50ICpsaW1pdHMsCiAJCQkJIHVuc2lnbmVkIGxvbmcgbGVuKTsKK3hmc19leHRsZW5fdCB4ZnNfYnRyZWVfY2FsY19zaXplKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB1aW50ICpsaW1pdHMsCisJCXVuc2lnbmVkIGxvbmcgbG9uZyBsZW4pOwogCiAvKiByZXR1cm4gY29kZXMgKi8KICNkZWZpbmUgWEZTX0JUUkVFX1FVRVJZX1JBTkdFX0NPTlRJTlVFCTAJLyoga2VlcCBpdGVyYXRpbmcgKi8KQEAgLTUyOSw0ICs1MTksNiBAQAogaW50IHhmc19idHJlZV92aXNpdF9ibG9ja3Moc3RydWN0IHhmc19idHJlZV9jdXIgKmN1ciwKIAkJeGZzX2J0cmVlX3Zpc2l0X2Jsb2Nrc19mbiBmbiwgdm9pZCAqZGF0YSk7CiAKK2ludCB4ZnNfYnRyZWVfY291bnRfYmxvY2tzKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIsIHhmc19leHRsZW5fdCAqYmxvY2tzKTsKKwogI2VuZGlmCS8qIF9fWEZTX0JUUkVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfZGVmZXIuYyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2RlZmVyLmMKaW5kZXggMDU0YTIwMy4uNjEzYzVjZiAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfZGVmZXIuYworKysgYi9mcy94ZnMvbGlieGZzL3hmc19kZWZlci5jCkBAIC04MSw2ICs4MSwxMCBAQAogICogICAtIEZvciBlYWNoIHdvcmsgaXRlbSBhdHRhY2hlZCB0byB0aGUgbG9nIGludGVudCBpdGVtLAogICogICAgICogUGVyZm9ybSB0aGUgZGVzY3JpYmVkIGFjdGlvbi4KICAqICAgICAqIEF0dGFjaCB0aGUgd29yayBpdGVtIHRvIHRoZSBsb2cgZG9uZSBpdGVtLgorICogICAgICogSWYgdGhlIHJlc3VsdCBvZiBkb2luZyB0aGUgd29yayB3YXMgLUVBR0FJTiwgLT5maW5pc2ggd29yaworICogICAgICAgd2FudHMgYSBuZXcgdHJhbnNhY3Rpb24uICBTZWUgdGhlICJSZXF1ZXN0aW5nIGEgRnJlc2gKKyAqICAgICAgIFRyYW5zYWN0aW9uIHdoaWxlIEZpbmlzaGluZyBEZWZlcnJlZCBXb3JrIiBzZWN0aW9uIGJlbG93IGZvcgorICogICAgICAgZGV0YWlscy4KICAqCiAgKiBUaGUga2V5IGhlcmUgaXMgdGhhdCB3ZSBtdXN0IGxvZyBhbiBpbnRlbnQgaXRlbSBmb3IgYWxsIHBlbmRpbmcKICAqIHdvcmsgaXRlbXMgZXZlcnkgdGltZSB3ZSByb2xsIHRoZSB0cmFuc2FjdGlvbiwgYW5kIHRoYXQgd2UgbXVzdCBsb2cKQEAgLTg4LDYgKzkyLDM0IEBACiAgKiB3ZSBjYW4gcGVyZm9ybSBjb21wbGV4IHJlbWFwcGluZyBvcGVyYXRpb25zLCBjaGFpbmluZyBpbnRlbnQgaXRlbXMKICAqIGFzIG5lZWRlZC4KICAqCisgKiBSZXF1ZXN0aW5nIGEgRnJlc2ggVHJhbnNhY3Rpb24gd2hpbGUgRmluaXNoaW5nIERlZmVycmVkIFdvcmsKKyAqCisgKiBJZiAtPmZpbmlzaF9pdGVtIGRlY2lkZXMgdGhhdCBpdCBuZWVkcyBhIGZyZXNoIHRyYW5zYWN0aW9uIHRvCisgKiBmaW5pc2ggdGhlIHdvcmssIGl0IG11c3QgYXNrIGl0cyBjYWxsZXIgKHhmc19kZWZlcl9maW5pc2gpIGZvciBhCisgKiBjb250aW51YXRpb24uICBUaGUgbW9zdCBsaWtlbHkgY2F1c2Ugb2YgdGhpcyBjaXJjdW1zdGFuY2UgYXJlIHRoZQorICogcmVmY291bnQgYWRqdXN0IGZ1bmN0aW9ucyBkZWNpZGluZyB0aGF0IHRoZXkndmUgbG9nZ2VkIGVub3VnaCBpdGVtcworICogdG8gYmUgYXQgcmlzayBvZiBleGNlZWRpbmcgdGhlIHRyYW5zYWN0aW9uIHJlc2VydmF0aW9uLgorICoKKyAqIFRvIGdldCBhIGZyZXNoIHRyYW5zYWN0aW9uLCB3ZSB3YW50IHRvIGxvZyB0aGUgZXhpc3RpbmcgbG9nIGRvbmUKKyAqIGl0ZW0gdG8gcHJldmVudCB0aGUgbG9nIGludGVudCBpdGVtIGZyb20gcmVwbGF5aW5nLCBpbW1lZGlhdGVseSBsb2cKKyAqIGEgbmV3IGxvZyBpbnRlbnQgaXRlbSB3aXRoIHRoZSB1bmZpbmlzaGVkIHdvcmsgaXRlbXMsIHJvbGwgdGhlCisgKiB0cmFuc2FjdGlvbiwgYW5kIHJlLWNhbGwgLT5maW5pc2hfaXRlbSB3aGVyZXZlciBpdCBsZWZ0IG9mZi4gIFRoZQorICogbG9nIGRvbmUgaXRlbSBhbmQgdGhlIG5ldyBsb2cgaW50ZW50IGl0ZW0gbXVzdCBiZSBpbiB0aGUgc2FtZQorICogdHJhbnNhY3Rpb24gb3IgYXRvbWljaXR5IGNhbm5vdCBiZSBndWFyYW50ZWVkOyBkZWZlcl9maW5pc2ggZW5zdXJlcworICogdGhhdCB0aGlzIGhhcHBlbnMuCisgKgorICogVGhpcyByZXF1aXJlcyBzb21lIGNvb3JkaW5hdGlvbiBiZXR3ZWVuIC0+ZmluaXNoX2l0ZW0gYW5kCisgKiBkZWZlcl9maW5pc2guICBVcG9uIGRlY2lkaW5nIHRvIHJlcXVlc3QgYSBuZXcgdHJhbnNhY3Rpb24sCisgKiAtPmZpbmlzaF9pdGVtIHNob3VsZCB1cGRhdGUgdGhlIGN1cnJlbnQgd29yayBpdGVtIHRvIHJlZmxlY3QgdGhlCisgKiB1bmZpbmlzaGVkIHdvcmsuICBOZXh0LCBpdCBzaG91bGQgcmVzZXQgdGhlIGxvZyBkb25lIGl0ZW0ncyBsaXN0CisgKiBjb3VudCB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zIGZpbmlzaGVkLCBhbmQgcmV0dXJuIC1FQUdBSU4uCisgKiBkZWZlcl9maW5pc2ggc2VlcyB0aGUgLUVBR0FJTiwgbG9ncyB0aGUgbmV3IGxvZyBpbnRlbnQgaXRlbQorICogd2l0aCB0aGUgcmVtYWluaW5nIHdvcmsgaXRlbXMsIGFuZCBsZWF2ZXMgdGhlIHhmc19kZWZlcl9wZW5kaW5nCisgKiBpdGVtIGF0IHRoZSBoZWFkIG9mIHRoZSBkb3Bfd29yayBxdWV1ZS4gIFRoZW4gaXQgcm9sbHMgdGhlCisgKiB0cmFuc2FjdGlvbiBhbmQgcGlja3MgdXAgcHJvY2Vzc2luZyB3aGVyZSBpdCBsZWZ0IG9mZi4gIEl0IGlzCisgKiByZXF1aXJlZCB0aGF0IC0+ZmluaXNoX2l0ZW0gbXVzdCBiZSBjYXJlZnVsIHRvIGxlYXZlIGVub3VnaAorICogdHJhbnNhY3Rpb24gcmVzZXJ2YXRpb24gdG8gZml0IHRoZSBuZXcgbG9nIGludGVudCBpdGVtLgorICoKICAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiByZW1hcHBpbmcgdGhlIGV4dGVudCAoRSwgRStCKSBpbnRvIGZpbGUgWCBhdAogICogb2Zmc2V0IEEgYW5kIGRlYWxpbmcgd2l0aCB0aGUgZXh0ZW50IChDLCBDK0IpIGFscmVhZHkgYmVpbmcgbWFwcGVkCiAgKiB0aGVyZToKQEAgLTEwNCwyMSArMTM2LDI2IEBACiAgKiB8IEludGVudCB0byBhZGQgcm1hcCAoWCwgRSwgQSwgQikgICAgICAgICAgICAgICAgIHwKICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICogfCBSZWR1Y2UgcmVmY291bnQgZm9yIGV4dGVudCAoQywgQikgICAgICAgICAgICAgICB8IHQyCi0gKiB8IERvbmUgcmVkdWNpbmcgcmVmY291bnQgZm9yIGV4dGVudCAoQywgQikgICAgICAgIHwKKyAqIHwgRG9uZSByZWR1Y2luZyByZWZjb3VudCBmb3IgZXh0ZW50IChDLCA5KSAgICAgICAgfAorICogfCBJbnRlbnQgdG8gcmVkdWNlIHJlZmNvdW50IGZvciBleHRlbnQgKEMrOSwgQi05KSB8CisgKiB8IChyYW4gb3V0IG9mIHNwYWNlIGFmdGVyIDkgcmVmY291bnQgdXBkYXRlcykgICAgIHwKKyAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogfCBSZWR1Y2UgcmVmY291bnQgZm9yIGV4dGVudCAoQys5LCBCKzkpICAgICAgICAgICB8IHQzCisgKiB8IERvbmUgcmVkdWNpbmcgcmVmY291bnQgZm9yIGV4dGVudCAoQys5LCBCLTkpICAgIHwKICAqIHwgSW5jcmVhc2UgcmVmY291bnQgZm9yIGV4dGVudCAoRSwgQikgICAgICAgICAgICAgfAogICogfCBEb25lIGluY3JlYXNpbmcgcmVmY291bnQgZm9yIGV4dGVudCAoRSwgQikgICAgICB8CiAgKiB8IEludGVudCB0byBmcmVlIGV4dGVudCAoQywgQikgICAgICAgICAgICAgICAgICAgIHwKICAqIHwgSW50ZW50IHRvIGZyZWUgZXh0ZW50IChGLCAxKSAocmVmY291bnRidCBibG9jaykgfAogICogfCBJbnRlbnQgdG8gcmVtb3ZlIHJtYXAgKEYsIDEsIFJFRkMpICAgICAgICAgICAgICB8CiAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAqIHwgUmVtb3ZlIHJtYXAgKFgsIEMsIEEsIEIpICAgICAgICAgICAgICAgICAgICAgICAgfCB0MworICogfCBSZW1vdmUgcm1hcCAoWCwgQywgQSwgQikgICAgICAgICAgICAgICAgICAgICAgICB8IHQ0CiAgKiB8IERvbmUgcmVtb3Zpbmcgcm1hcCAoWCwgQywgQSwgQikgICAgICAgICAgICAgICAgIHwKICAqIHwgQWRkIHJtYXAgKFgsIEUsIEEsIEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICogfCBEb25lIGFkZGluZyBybWFwIChYLCBFLCBBLCBCKSAgICAgICAgICAgICAgICAgICB8CiAgKiB8IFJlbW92ZSBybWFwIChGLCAxLCBSRUZDKSAgICAgICAgICAgICAgICAgICAgICAgIHwKICAqIHwgRG9uZSByZW1vdmluZyBybWFwIChGLCAxLCBSRUZDKSAgICAgICAgICAgICAgICAgfAogICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi0gKiB8IEZyZWUgZXh0ZW50IChDLCBCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdDQKKyAqIHwgRnJlZSBleHRlbnQgKEMsIEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0NQogICogfCBEb25lIGZyZWVpbmcgZXh0ZW50IChDLCBCKSAgICAgICAgICAgICAgICAgICAgICB8CiAgKiB8IEZyZWUgZXh0ZW50IChELCAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAqIHwgRG9uZSBmcmVlaW5nIGV4dGVudCAoRCwgMSkgICAgICAgICAgICAgICAgICAgICAgfApAQCAtMTQxLDYgKzE3OCw5IEBACiAgKiAtIEludGVudCB0byBmcmVlIGV4dGVudCAoQywgQikKICAqIC0gSW50ZW50IHRvIGZyZWUgZXh0ZW50IChGLCAxKSAocmVmY291bnRidCBibG9jaykKICAqIC0gSW50ZW50IHRvIHJlbW92ZSBybWFwIChGLCAxLCBSRUZDKQorICoKKyAqIE5vdGUgdGhhdCB0aGUgY29udGludWF0aW9uIHJlcXVlc3RlZCBiZXR3ZWVuIHQyIGFuZCB0MyBpcyBsaWtlbHkgdG8KKyAqIHJlb2NjdXIuCiAgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCB4ZnNfZGVmZXJfb3BfdHlwZSAqZGVmZXJfb3BfdHlwZXNbWEZTX0RFRkVSX09QU19UWVBFX01BWF07CkBAIC0xOTQsNyArMjM0LDcgQEAKIAkvKiBBYm9ydCBpbnRlbnQgaXRlbXMuICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZnAsICZkb3AtPmRvcF9wZW5kaW5nLCBkZnBfbGlzdCkgewogCQl0cmFjZV94ZnNfZGVmZXJfcGVuZGluZ19hYm9ydCh0cC0+dF9tb3VudHAsIGRmcCk7Ci0JCWlmIChkZnAtPmRmcF9jb21taXR0ZWQpCisJCWlmICghZGZwLT5kZnBfZG9uZSkKIAkJCWRmcC0+ZGZwX3R5cGUtPmFib3J0X2ludGVudChkZnAtPmRmcF9pbnRlbnQpOwogCX0KIApAQCAtMjkwLDcgKzMzMCw2IEBACiAJc3RydWN0IHhmc19kZWZlcl9wZW5kaW5nCSpkZnA7CiAJc3RydWN0IGxpc3RfaGVhZAkJKmxpOwogCXN0cnVjdCBsaXN0X2hlYWQJCSpuOwotCXZvaWQJCQkJKmRvbmVfaXRlbSA9IE5VTEw7CiAJdm9pZAkJCQkqc3RhdGU7CiAJaW50CQkJCWVycm9yID0gMDsKIAl2b2lkCQkJCSgqY2xlYW51cF9mbikoc3RydWN0IHhmc190cmFucyAqLCB2b2lkICosIGludCk7CkBAIC0zMDksMTkgKzM0OCwxMSBAQAogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dDsKIAotCQkvKiBNYXJrIGFsbCBwZW5kaW5nIGludGVudHMgYXMgY29tbWl0dGVkLiAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoZGZwLCAmZG9wLT5kb3BfcGVuZGluZywgZGZwX2xpc3QpIHsKLQkJCWlmIChkZnAtPmRmcF9jb21taXR0ZWQpCi0JCQkJYnJlYWs7Ci0JCQl0cmFjZV94ZnNfZGVmZXJfcGVuZGluZ19jb21taXQoKCp0cCktPnRfbW91bnRwLCBkZnApOwotCQkJZGZwLT5kZnBfY29tbWl0dGVkID0gdHJ1ZTsKLQkJfQotCiAJCS8qIExvZyBhbiBpbnRlbnQtZG9uZSBpdGVtIGZvciB0aGUgZmlyc3QgcGVuZGluZyBpdGVtLiAqLwogCQlkZnAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZkb3AtPmRvcF9wZW5kaW5nLAogCQkJCXN0cnVjdCB4ZnNfZGVmZXJfcGVuZGluZywgZGZwX2xpc3QpOwogCQl0cmFjZV94ZnNfZGVmZXJfcGVuZGluZ19maW5pc2goKCp0cCktPnRfbW91bnRwLCBkZnApOwotCQlkb25lX2l0ZW0gPSBkZnAtPmRmcF90eXBlLT5jcmVhdGVfZG9uZSgqdHAsIGRmcC0+ZGZwX2ludGVudCwKKwkJZGZwLT5kZnBfZG9uZSA9IGRmcC0+ZGZwX3R5cGUtPmNyZWF0ZV9kb25lKCp0cCwgZGZwLT5kZnBfaW50ZW50LAogCQkJCWRmcC0+ZGZwX2NvdW50KTsKIAkJY2xlYW51cF9mbiA9IGRmcC0+ZGZwX3R5cGUtPmZpbmlzaF9jbGVhbnVwOwogCkBAIC0zMzEsOCArMzYyLDE3IEBACiAJCQlsaXN0X2RlbChsaSk7CiAJCQlkZnAtPmRmcF9jb3VudC0tOwogCQkJZXJyb3IgPSBkZnAtPmRmcF90eXBlLT5maW5pc2hfaXRlbSgqdHAsIGRvcCwgbGksCi0JCQkJCWRvbmVfaXRlbSwgJnN0YXRlKTsKLQkJCWlmIChlcnJvcikgeworCQkJCQlkZnAtPmRmcF9kb25lLCAmc3RhdGUpOworCQkJaWYgKGVycm9yID09IC1FQUdBSU4pIHsKKwkJCQkvKgorCQkJCSAqIENhbGxlciB3YW50cyBhIGZyZXNoIHRyYW5zYWN0aW9uOworCQkJCSAqIHB1dCB0aGUgd29yayBpdGVtIGJhY2sgb24gdGhlIGxpc3QKKwkJCQkgKiBhbmQganVtcCBvdXQuCisJCQkJICovCisJCQkJbGlzdF9hZGQobGksICZkZnAtPmRmcF93b3JrKTsKKwkJCQlkZnAtPmRmcF9jb3VudCsrOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChlcnJvcikgewogCQkJCS8qCiAJCQkJICogQ2xlYW4gdXAgYWZ0ZXIgb3Vyc2VsdmVzIGFuZCBqdW1wIG91dC4KIAkJCQkgKiB4ZnNfZGVmZXJfY2FuY2VsIHdpbGwgdGFrZSBjYXJlIG9mIGZyZWVpbmcKQEAgLTM0NCw5ICszODQsMjUgQEAKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJfQotCQkvKiBEb25lIHdpdGggdGhlIGRmcCwgZnJlZSBpdC4gKi8KLQkJbGlzdF9kZWwoJmRmcC0+ZGZwX2xpc3QpOwotCQlrbWVtX2ZyZWUoZGZwKTsKKwkJaWYgKGVycm9yID09IC1FQUdBSU4pIHsKKwkJCS8qCisJCQkgKiBDYWxsZXIgd2FudHMgYSBmcmVzaCB0cmFuc2FjdGlvbiwgc28gbG9nIGEKKwkJCSAqIG5ldyBsb2cgaW50ZW50IGl0ZW0gdG8gcmVwbGFjZSB0aGUgb2xkIG9uZQorCQkJICogYW5kIHJvbGwgdGhlIHRyYW5zYWN0aW9uLiAgU2VlICJSZXF1ZXN0aW5nCisJCQkgKiBhIEZyZXNoIFRyYW5zYWN0aW9uIHdoaWxlIEZpbmlzaGluZworCQkJICogRGVmZXJyZWQgV29yayIgYWJvdmUuCisJCQkgKi8KKwkJCWRmcC0+ZGZwX2ludGVudCA9IGRmcC0+ZGZwX3R5cGUtPmNyZWF0ZV9pbnRlbnQoKnRwLAorCQkJCQlkZnAtPmRmcF9jb3VudCk7CisJCQlkZnAtPmRmcF9kb25lID0gTlVMTDsKKwkJCWxpc3RfZm9yX2VhY2gobGksICZkZnAtPmRmcF93b3JrKQorCQkJCWRmcC0+ZGZwX3R5cGUtPmxvZ19pdGVtKCp0cCwgZGZwLT5kZnBfaW50ZW50LAorCQkJCQkJbGkpOworCQl9IGVsc2UgeworCQkJLyogRG9uZSB3aXRoIHRoZSBkZnAsIGZyZWUgaXQuICovCisJCQlsaXN0X2RlbCgmZGZwLT5kZnBfbGlzdCk7CisJCQlrbWVtX2ZyZWUoZGZwKTsKKwkJfQogCiAJCWlmIChjbGVhbnVwX2ZuKQogCQkJY2xlYW51cF9mbigqdHAsIHN0YXRlLCBlcnJvcik7CkBAIC00MjgsOCArNDg0LDggQEAKIAkJZGZwID0ga21lbV9hbGxvYyhzaXplb2Yoc3RydWN0IHhmc19kZWZlcl9wZW5kaW5nKSwKIAkJCQlLTV9TTEVFUCB8IEtNX05PRlMpOwogCQlkZnAtPmRmcF90eXBlID0gZGVmZXJfb3BfdHlwZXNbdHlwZV07Ci0JCWRmcC0+ZGZwX2NvbW1pdHRlZCA9IGZhbHNlOwogCQlkZnAtPmRmcF9pbnRlbnQgPSBOVUxMOworCQlkZnAtPmRmcF9kb25lID0gTlVMTDsKIAkJZGZwLT5kZnBfY291bnQgPSAwOwogCQlJTklUX0xJU1RfSEVBRCgmZGZwLT5kZnBfd29yayk7CiAJCWxpc3RfYWRkX3RhaWwoJmRmcC0+ZGZwX2xpc3QsICZkb3AtPmRvcF9pbnRha2UpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpYnhmcy94ZnNfZGVmZXIuaCBiL2ZzL3hmcy9saWJ4ZnMveGZzX2RlZmVyLmgKaW5kZXggY2MzOTgxYy4uZTk2NTMzZCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfZGVmZXIuaAorKysgYi9mcy94ZnMvbGlieGZzL3hmc19kZWZlci5oCkBAIC0zMCw4ICszMCw4IEBACiBzdHJ1Y3QgeGZzX2RlZmVyX3BlbmRpbmcgewogCWNvbnN0IHN0cnVjdCB4ZnNfZGVmZXJfb3BfdHlwZQkqZGZwX3R5cGU7CS8qIGZ1bmN0aW9uIHBvaW50ZXJzICovCiAJc3RydWN0IGxpc3RfaGVhZAkJZGZwX2xpc3Q7CS8qIHBlbmRpbmcgaXRlbXMgKi8KLQlib29sCQkJCWRmcF9jb21taXR0ZWQ7CS8qIGNvbW1pdHRlZCB0cmFucz8gKi8KIAl2b2lkCQkJCSpkZnBfaW50ZW50OwkvKiBsb2cgaW50ZW50IGl0ZW0gKi8KKwl2b2lkCQkJCSpkZnBfZG9uZTsJLyogbG9nIGRvbmUgaXRlbSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJCWRmcF93b3JrOwkvKiB3b3JrIGl0ZW1zICovCiAJdW5zaWduZWQgaW50CQkJZGZwX2NvdW50OwkvKiAjIGV4dGVudCBpdGVtcyAqLwogfTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX2Zvcm1hdC5oIGIvZnMveGZzL2xpYnhmcy94ZnNfZm9ybWF0LmgKaW5kZXggZTZhOGJlYS4uMjcwZmI1YyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfZm9ybWF0LmgKKysrIGIvZnMveGZzL2xpYnhmcy94ZnNfZm9ybWF0LmgKQEAgLTY3NCw3ICs2NzQsOCBAQAogI2RlZmluZQlYRlNfQUdGX0JUUkVFQkxLUwkweDAwMDAwODAwCiAjZGVmaW5lCVhGU19BR0ZfVVVJRAkJMHgwMDAwMTAwMAogI2RlZmluZQlYRlNfQUdGX1JNQVBfQkxPQ0tTCTB4MDAwMDIwMDAKLSNkZWZpbmUJWEZTX0FHRl9OVU1fQklUUwkxNAorI2RlZmluZQlYRlNfQUdGX1NQQVJFNjQJCTB4MDAwMDQwMDAKKyNkZWZpbmUJWEZTX0FHRl9OVU1fQklUUwkxNQogI2RlZmluZQlYRlNfQUdGX0FMTF9CSVRTCSgoMSA8PCBYRlNfQUdGX05VTV9CSVRTKSAtIDEpCiAKICNkZWZpbmUgWEZTX0FHRl9GTEFHUyBcCkBAIC02OTEsNyArNjkyLDggQEAKIAl7IFhGU19BR0ZfTE9OR0VTVCwJIkxPTkdFU1QiIH0sIFwKIAl7IFhGU19BR0ZfQlRSRUVCTEtTLAkiQlRSRUVCTEtTIiB9LCBcCiAJeyBYRlNfQUdGX1VVSUQsCQkiVVVJRCIgfSwgXAotCXsgWEZTX0FHRl9STUFQX0JMT0NLUywJIlJNQVBfQkxPQ0tTIiB9CisJeyBYRlNfQUdGX1JNQVBfQkxPQ0tTLAkiUk1BUF9CTE9DS1MiIH0sIFwKKwl7IFhGU19BR0ZfU1BBUkU2NCwJIlNQQVJFNjQiIH0KIAogLyogZGlzayBibG9jayAoeGZzX2RhZGRyX3QpIGluIHRoZSBBRyAqLwogI2RlZmluZSBYRlNfQUdGX0RBRERSKG1wKQkoKHhmc19kYWRkcl90KSgxIDw8IChtcCktPm1fc2VjdGJiX2xvZykpCmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19pYWxsb2NfYnRyZWUuYyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2lhbGxvY19idHJlZS5jCmluZGV4IDMxY2EyMjAuLmVhYjY4YWUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saWJ4ZnMveGZzX2lhbGxvY19idHJlZS5jCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2lhbGxvY19idHJlZS5jCkBAIC0xMzIsNyArMTMyLDcgQEAKIAl4ZnNfcm1hcF9hZ19vd25lcigmb2luZm8sIFhGU19STUFQX09XTl9JTk9CVCk7CiAJcmV0dXJuIHhmc19mcmVlX2V4dGVudChjdXItPmJjX3RwLAogCQkJWEZTX0RBRERSX1RPX0ZTQihjdXItPmJjX21wLCBYRlNfQlVGX0FERFIoYnApKSwgMSwKLQkJCSZvaW5mbyk7CisJCQkmb2luZm8sIFhGU19BR19SRVNWX05PTkUpOwogfQogCiBTVEFUSUMgaW50CmRpZmYgLS1naXQgYS9mcy94ZnMvbGlieGZzL3hmc19sb2dfZm9ybWF0LmggYi9mcy94ZnMvbGlieGZzL3hmc19sb2dfZm9ybWF0LmgKaW5kZXggYTZlZWQ0My4uZmM1ZWVmOCAxMDA2NDQKLS0tIGEvZnMveGZzL2xpYnhmcy94ZnNfbG9nX2Zvcm1hdC5oCisrKyBiL2ZzL3hmcy9saWJ4ZnMveGZzX2xvZ19mb3JtYXQuaApAQCAtNjQ3LDkgKzY0NywxNyBAQAogCV9fdWludDE2X3QJCXJ1aV9zaXplOwkvKiBzaXplIG9mIHRoaXMgaXRlbSAqLwogCV9fdWludDMyX3QJCXJ1aV9uZXh0ZW50czsJLyogIyBleHRlbnRzIHRvIGZyZWUgKi8KIAlfX3VpbnQ2NF90CQlydWlfaWQ7CQkvKiBydWkgaWRlbnRpZmllciAqLwotCXN0cnVjdCB4ZnNfbWFwX2V4dGVudAlydWlfZXh0ZW50c1sxXTsJLyogYXJyYXkgb2YgZXh0ZW50cyB0byBybWFwICovCisJc3RydWN0IHhmc19tYXBfZXh0ZW50CXJ1aV9leHRlbnRzW107CS8qIGFycmF5IG9mIGV4dGVudHMgdG8gcm1hcCAqLwogfTsKIAorc3RhdGljIGlubGluZSBzaXplX3QKK3hmc19ydWlfbG9nX2Zvcm1hdF9zaXplb2YoCisJdW5zaWduZWQgaW50CQlucikKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCB4ZnNfcnVpX2xvZ19mb3JtYXQpICsKKwkJCW5yICogc2l6ZW9mKHN0cnVjdCB4ZnNfbWFwX2V4dGVudCk7Cit9CisKIC8qCiAgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBsYXkgb3V0IGFuIHJ1ZCBsb2cgaXRlbSBpbiB0aGUKICAqIGxvZy4gIFRoZSBydWRfZXh0ZW50cyBhcnJheSBpcyBhIHZhcmlhYmxlIHNpemUgYXJyYXkgd2hvc2UKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saWJ4ZnMveGZzX3NiLmMgYi9mcy94ZnMvbGlieGZzL3hmc19zYi5jCmluZGV4IDBlM2Q0ZjUuLjRhZWNjNWYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saWJ4ZnMveGZzX3NiLmMKKysrIGIvZnMveGZzL2xpYnhmcy94ZnNfc2IuYwpAQCAtNTgzLDcgKzU4Myw4IEBACiAJICogT25seSBjaGVjayB0aGUgaW4gcHJvZ3Jlc3MgZmllbGQgZm9yIHRoZSBwcmltYXJ5IHN1cGVyYmxvY2sgYXMKIAkgKiBta2ZzLnhmcyBkb2Vzbid0IGNsZWFyIGl0IGZyb20gc2Vjb25kYXJ5IHN1cGVyYmxvY2tzLgogCSAqLwotCXJldHVybiB4ZnNfbW91bnRfdmFsaWRhdGVfc2IobXAsICZzYiwgYnAtPmJfYm4gPT0gWEZTX1NCX0RBRERSLAorCXJldHVybiB4ZnNfbW91bnRfdmFsaWRhdGVfc2IobXAsICZzYiwKKwkJCQkgICAgIGJwLT5iX21hcHNbMF0uYm1fYm4gPT0gWEZTX1NCX0RBRERSLAogCQkJCSAgICAgY2hlY2tfdmVyc2lvbik7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYW9wcy5jIGIvZnMveGZzL3hmc19hb3BzLmMKaW5kZXggNzU3NWNmYy4uNGEyOGZhOSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hb3BzLmMKKysrIGIvZnMveGZzL3hmc19hb3BzLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogICogVXBkYXRlIG9uLWRpc2sgZmlsZSBzaXplIG5vdyB0aGF0IGRhdGEgaGFzIGJlZW4gd3JpdHRlbiB0byBkaXNrLgogICovCiBTVEFUSUMgaW50Ci14ZnNfc2V0ZmlsZXNpemUoCitfX3hmc19zZXRmaWxlc2l6ZSgKIAlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKIAlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwKIAl4ZnNfb2ZmX3QJCW9mZnNldCwKQEAgLTIyNSw2ICsyMjUsMjMgQEAKIAlyZXR1cm4geGZzX3RyYW5zX2NvbW1pdCh0cCk7CiB9CiAKK2ludAoreGZzX3NldGZpbGVzaXplKAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXhmc19vZmZfdAkJb2Zmc2V0LAorCXNpemVfdAkJCXNpemUpCit7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cDsKKwlpbnQJCQllcnJvcjsKKworCWVycm9yID0geGZzX3RyYW5zX2FsbG9jKG1wLCAmTV9SRVMobXApLT50cl9mc3luY3RzLCAwLCAwLCAwLCAmdHApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIF9feGZzX3NldGZpbGVzaXplKGlwLCB0cCwgb2Zmc2V0LCBzaXplKTsKK30KKwogU1RBVElDIGludAogeGZzX3NldGZpbGVzaXplX2lvZW5kKAogCXN0cnVjdCB4ZnNfaW9lbmQJKmlvZW5kLApAQCAtMjQ3LDcgKzI2NCw3IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQlyZXR1cm4geGZzX3NldGZpbGVzaXplKGlwLCB0cCwgaW9lbmQtPmlvX29mZnNldCwgaW9lbmQtPmlvX3NpemUpOworCXJldHVybiBfX3hmc19zZXRmaWxlc2l6ZShpcCwgdHAsIGlvZW5kLT5pb19vZmZzZXQsIGlvZW5kLT5pb19zaXplKTsKIH0KIAogLyoKQEAgLTEzMzYsMTMgKzEzNTMsMTIgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IGZpbGVfaW5vZGUoaW9jYi0+a2lfZmlscCk7CiAJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7Ci0Jc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKIAl1aW50cHRyX3QJCWZsYWdzID0gKHVpbnRwdHJfdClwcml2YXRlOwogCWludAkJCWVycm9yID0gMDsKIAogCXRyYWNlX3hmc19lbmRfaW9fZGlyZWN0X3dyaXRlKGlwLCBvZmZzZXQsIHNpemUpOwogCi0JaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoc2l6ZSA8PSAwKQpAQCAtMTM4MCwxNCArMTM5Niw5IEBACiAKIAkJZXJyb3IgPSB4ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuKGlwLCBvZmZzZXQsIHNpemUpOwogCX0gZWxzZSBpZiAoZmxhZ3MgJiBYRlNfRElPX0ZMQUdfQVBQRU5EKSB7Ci0JCXN0cnVjdCB4ZnNfdHJhbnMgKnRwOwotCiAJCXRyYWNlX3hmc19lbmRfaW9fZGlyZWN0X3dyaXRlX2FwcGVuZChpcCwgb2Zmc2V0LCBzaXplKTsKIAotCQllcnJvciA9IHhmc190cmFuc19hbGxvYyhtcCwgJk1fUkVTKG1wKS0+dHJfZnN5bmN0cywgMCwgMCwgMCwKLQkJCQkmdHApOwotCQlpZiAoIWVycm9yKQotCQkJZXJyb3IgPSB4ZnNfc2V0ZmlsZXNpemUoaXAsIHRwLCBvZmZzZXQsIHNpemUpOworCQllcnJvciA9IHhmc19zZXRmaWxlc2l6ZShpcCwgb2Zmc2V0LCBzaXplKTsKIAl9CiAKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FvcHMuaCBiL2ZzL3hmcy94ZnNfYW9wcy5oCmluZGV4IGJmMmQ5YTEuLjE5NTBlM2IgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYW9wcy5oCisrKyBiL2ZzL3hmcy94ZnNfYW9wcy5oCkBAIC02Miw2ICs2Miw3IEBACiAKIGludAl4ZnNfZW5kX2lvX2RpcmVjdF93cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGxvZmZfdCBvZmZzZXQsCiAJCXNzaXplX3Qgc2l6ZSwgdm9pZCAqcHJpdmF0ZSk7CitpbnQJeGZzX3NldGZpbGVzaXplKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKIGV4dGVybiB2b2lkIHhmc19jb3VudF9wYWdlX3N0YXRlKHN0cnVjdCBwYWdlICosIGludCAqLCBpbnQgKik7CiBleHRlcm4gc3RydWN0IGJsb2NrX2RldmljZSAqeGZzX2ZpbmRfYmRldl9mb3JfaW5vZGUoc3RydWN0IGlub2RlICopOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwX3V0aWwuYyBiL2ZzL3hmcy94ZnNfYm1hcF91dGlsLmMKaW5kZXggNGVjZTRmMi4uZTgyN2Q2NSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19ibWFwX3V0aWwuYworKysgYi9mcy94ZnMveGZzX2JtYXBfdXRpbC5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAkJCQkJWEZTX1RSQU5TX0RRX1JUQkNPVU5ULCAobG9uZykgcmFsZW4pOwogCiAJCS8qIFplcm8gdGhlIGV4dGVudCBpZiB3ZSB3ZXJlIGFza2VkIHRvIGRvIHNvICovCi0JCWlmIChhcC0+dXNlcmRhdGEgJiBYRlNfQUxMT0NfVVNFUkRBVEFfWkVSTykgeworCQlpZiAoYXAtPmRhdGF0eXBlICYgWEZTX0FMTE9DX1VTRVJEQVRBX1pFUk8pIHsKIAkJCWVycm9yID0geGZzX3plcm9fZXh0ZW50KGFwLT5pcCwgYXAtPmJsa25vLCBhcC0+bGVuZ3RoKTsKIAkJCWlmIChlcnJvcikKIAkJCQlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J1Zi5jIGIvZnMveGZzL3hmc19idWYuYwppbmRleCA2MDdjYzI5Li5iNWI5YmZmIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zi5jCisrKyBiL2ZzL3hmcy94ZnNfYnVmLmMKQEAgLTE2MTEsNyArMTYxMSw3IEBACiAJICovCiAJd2hpbGUgKHBlcmNwdV9jb3VudGVyX3N1bSgmYnRwLT5idF9pb19jb3VudCkpCiAJCWRlbGF5KDEwMCk7Ci0JZHJhaW5fd29ya3F1ZXVlKGJ0cC0+YnRfbW91bnQtPm1fYnVmX3dvcmtxdWV1ZSk7CisJZmx1c2hfd29ya3F1ZXVlKGJ0cC0+YnRfbW91bnQtPm1fYnVmX3dvcmtxdWV1ZSk7CiAKIAkvKiBsb29wIHVudGlsIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCBvbiB0aGUgbHJ1IGxpc3QuICovCiAJd2hpbGUgKGxpc3RfbHJ1X2NvdW50KCZidHAtPmJ0X2xydSkpIHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYwppbmRleCBlNDU1ZjkwLi4yOTc1Y2IyIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKKysrIGIvZnMveGZzL3hmc19idWZfaXRlbS5jCkBAIC04NjUsNyArODY1LDcgQEAKIAkgKi8KIAlpZiAoYml0KSB7CiAJCWVuZF9iaXQgPSBNSU4oYml0ICsgYml0c190b19zZXQsICh1aW50KU5CV09SRCk7Ci0JCW1hc2sgPSAoKDEgPDwgKGVuZF9iaXQgLSBiaXQpKSAtIDEpIDw8IGJpdDsKKwkJbWFzayA9ICgoMVUgPDwgKGVuZF9iaXQgLSBiaXQpKSAtIDEpIDw8IGJpdDsKIAkJKndvcmRwIHw9IG1hc2s7CiAJCXdvcmRwKys7CiAJCWJpdHNfc2V0ID0gZW5kX2JpdCAtIGJpdDsKQEAgLTg4OCw3ICs4ODgsNyBAQAogCSAqLwogCWVuZF9iaXQgPSBiaXRzX3RvX3NldCAtIGJpdHNfc2V0OwogCWlmIChlbmRfYml0KSB7Ci0JCW1hc2sgPSAoMSA8PCBlbmRfYml0KSAtIDE7CisJCW1hc2sgPSAoMVUgPDwgZW5kX2JpdCkgLSAxOwogCQkqd29yZHAgfD0gbWFzazsKIAl9CiB9CkBAIC0xMDk1LDcgKzEwOTUsOCBAQAogCSAgICAgYnAtPmJfbGFzdF9lcnJvciAhPSBicC0+Yl9lcnJvcikgewogCQlicC0+Yl9mbGFncyB8PSAoWEJGX1dSSVRFIHwgWEJGX0RPTkUgfCBYQkZfV1JJVEVfRkFJTCk7CiAJCWJwLT5iX2xhc3RfZXJyb3IgPSBicC0+Yl9lcnJvcjsKLQkJaWYgKGNmZy0+cmV0cnlfdGltZW91dCAmJiAhYnAtPmJfZmlyc3RfcmV0cnlfdGltZSkKKwkJaWYgKGNmZy0+cmV0cnlfdGltZW91dCAhPSBYRlNfRVJSX1JFVFJZX0ZPUkVWRVIgJiYKKwkJICAgICFicC0+Yl9maXJzdF9yZXRyeV90aW1lKQogCQkJYnAtPmJfZmlyc3RfcmV0cnlfdGltZSA9IGppZmZpZXM7CiAKIAkJeGZzX2J1Zl9pb2Vycm9yKGJwLCAwKTsKQEAgLTExMTEsNyArMTExMiw3IEBACiAJaWYgKGNmZy0+bWF4X3JldHJpZXMgIT0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSICYmCiAJICAgICsrYnAtPmJfcmV0cmllcyA+IGNmZy0+bWF4X3JldHJpZXMpCiAJCQlnb3RvIHBlcm1hbmVudF9lcnJvcjsKLQlpZiAoY2ZnLT5yZXRyeV90aW1lb3V0ICYmCisJaWYgKGNmZy0+cmV0cnlfdGltZW91dCAhPSBYRlNfRVJSX1JFVFJZX0ZPUkVWRVIgJiYKIAkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBjZmctPnJldHJ5X3RpbWVvdXQgKyBicC0+Yl9maXJzdF9yZXRyeV90aW1lKSkKIAkJCWdvdG8gcGVybWFuZW50X2Vycm9yOwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2V4dGVudF9idXN5LmMgYi9mcy94ZnMveGZzX2V4dGVudF9idXN5LmMKaW5kZXggYzI2M2UwNy4uMTYyZGMxOCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19leHRlbnRfYnVzeS5jCisrKyBiL2ZzL3hmcy94ZnNfZXh0ZW50X2J1c3kuYwpAQCAtMzg0LDcgKzM4NCw3IEBACiAJCSAqIElmIHRoaXMgaXMgYSBtZXRhZGF0YSBhbGxvY2F0aW9uLCB0cnkgdG8gcmV1c2UgdGhlIGJ1c3kKIAkJICogZXh0ZW50IGluc3RlYWQgb2YgdHJpbW1pbmcgdGhlIGFsbG9jYXRpb24uCiAJCSAqLwotCQlpZiAoIWFyZ3MtPnVzZXJkYXRhICYmCisJCWlmICgheGZzX2FsbG9jX2lzX3VzZXJkYXRhKGFyZ3MtPmRhdGF0eXBlKSAmJgogCQkgICAgIShidXN5cC0+ZmxhZ3MgJiBYRlNfRVhURU5UX0JVU1lfRElTQ0FSREVEKSkgewogCQkJaWYgKCF4ZnNfZXh0ZW50X2J1c3lfdXBkYXRlX2V4dGVudChhcmdzLT5tcCwgYXJncy0+cGFnLAogCQkJCQkJCSAgYnVzeXAsIGZibm8sIGZsZW4sCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ZpbGUuYyBiL2ZzL3hmcy94ZnNfZmlsZS5jCmluZGV4IGU2MTJhMDIuLmY0NmIyOTIgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZmlsZS5jCisrKyBiL2ZzL3hmcy94ZnNfZmlsZS5jCkBAIC0yNjksNiArMjY5LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJZmlsZV9hY2Nlc3NlZChpb2NiLT5raV9maWxwKTsKKwogCS8qCiAJICogTG9ja2luZyBpcyBhIGJpdCB0cmlja3kgaGVyZS4gSWYgd2UgdGFrZSBhbiBleGNsdXNpdmUgbG9jayBmb3IgZGlyZWN0CiAJICogSU8sIHdlIGVmZmVjdGl2ZWx5IHNlcmlhbGlzZSBhbGwgbmV3IGNvbmN1cnJlbnQgcmVhZCBJTyB0byB0aGlzIGZpbGUKQEAgLTMyMyw3ICszMjUsNiBAQAogCX0KIAl4ZnNfcndfaXVubG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwogCi0JZmlsZV9hY2Nlc3NlZChpb2NiLT5raV9maWxwKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zMzIsMTAgKzMzMyw3IEBACiAJc3RydWN0IGtpb2NiCQkqaW9jYiwKIAlzdHJ1Y3QgaW92X2l0ZXIJCSp0bykKIHsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZyA9IGlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZzsKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IG1hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7Ci0Jc3RydWN0IGlvdl9pdGVyCQlkYXRhID0gKnRvOworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW9jYi0+a2lfZmlscC0+Zl9tYXBwaW5nLT5ob3N0KTsKIAlzaXplX3QJCQljb3VudCA9IGlvdl9pdGVyX2NvdW50KHRvKTsKIAlzc2l6ZV90CQkJcmV0ID0gMDsKIApAQCAtMzQ1LDExICszNDMsNyBAQAogCQlyZXR1cm4gMDsgLyogc2tpcCBhdGltZSAqLwogCiAJeGZzX3J3X2lsb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7Ci0JcmV0ID0gZGF4X2RvX2lvKGlvY2IsIGlub2RlLCAmZGF0YSwgeGZzX2dldF9ibG9ja3NfZGlyZWN0LCBOVUxMLCAwKTsKLQlpZiAocmV0ID4gMCkgewotCQlpb2NiLT5raV9wb3MgKz0gcmV0OwotCQlpb3ZfaXRlcl9hZHZhbmNlKHRvLCByZXQpOwotCX0KKwlyZXQgPSBpb21hcF9kYXhfcncoaW9jYiwgdG8sICZ4ZnNfaW9tYXBfb3BzKTsKIAl4ZnNfcndfaXVubG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwogCiAJZmlsZV9hY2Nlc3NlZChpb2NiLT5raV9maWxwKTsKQEAgLTM5OSw0NSArMzkzLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1TVEFUSUMgc3NpemVfdAoteGZzX2ZpbGVfc3BsaWNlX3JlYWQoCi0Jc3RydWN0IGZpbGUJCSppbmZpbHAsCi0JbG9mZl90CQkJKnBwb3MsCi0Jc3RydWN0IHBpcGVfaW5vZGVfaW5mbwkqcGlwZSwKLQlzaXplX3QJCQljb3VudCwKLQl1bnNpZ25lZCBpbnQJCWZsYWdzKQotewotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwID0gWEZTX0koaW5maWxwLT5mX21hcHBpbmctPmhvc3QpOwotCXNzaXplX3QJCQlyZXQ7Ci0KLQlYRlNfU1RBVFNfSU5DKGlwLT5pX21vdW50LCB4c19yZWFkX2NhbGxzKTsKLQotCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkKLQkJcmV0dXJuIC1FSU87Ci0KLQl0cmFjZV94ZnNfZmlsZV9zcGxpY2VfcmVhZChpcCwgY291bnQsICpwcG9zKTsKLQotCS8qCi0JICogREFYIGlub2RlcyBjYW5ub3QgdWVzIHRoZSBwYWdlIGNhY2hlIGZvciBzcGxpY2UsIHNvIHdlIGhhdmUgdG8gcHVzaAotCSAqIHRoZW0gdGhyb3VnaCB0aGUgVkZTIElPIHBhdGguIFRoaXMgbWVhbnMgaXQgZ29lcyB0aHJvdWdoCi0JICogLT5yZWFkX2l0ZXIsIHdoaWNoIGZvciB1cyB0YWtlcyB0aGUgWEZTX0lPTE9DS19TSEFSRUQuIEhlbmNlIHdlCi0JICogY2Fubm90IGxvY2sgdGhlIHNwbGljZSBvcGVyYXRpb24gYXQgdGhpcyBsZXZlbCBmb3IgREFYIGlub2Rlcy4KLQkgKi8KLQlpZiAoSVNfREFYKFZGU19JKGlwKSkpIHsKLQkJcmV0ID0gZGVmYXVsdF9maWxlX3NwbGljZV9yZWFkKGluZmlscCwgcHBvcywgcGlwZSwgY291bnQsCi0JCQkJCSAgICAgICBmbGFncyk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXhmc19yd19pbG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOwotCXJldCA9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZChpbmZpbHAsIHBwb3MsIHBpcGUsIGNvdW50LCBmbGFncyk7Ci0JeGZzX3J3X2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKLW91dDoKLQlpZiAocmV0ID4gMCkKLQkJWEZTX1NUQVRTX0FERChpcC0+aV9tb3VudCwgeHNfcmVhZF9ieXRlcywgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCiAvKgogICogWmVybyBhbnkgb24gZGlzayBzcGFjZSBiZXR3ZWVuIHRoZSBjdXJyZW50IEVPRiBhbmQgdGhlIG5ldywgbGFyZ2VyIEVPRi4KICAqCkBAIC03MTEsNzAgKzY2NiwzMiBAQAogCXN0cnVjdCBraW9jYgkJKmlvY2IsCiAJc3RydWN0IGlvdl9pdGVyCQkqZnJvbSkKIHsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZQkqbWFwcGluZyA9IGlvY2ItPmtpX2ZpbHAtPmZfbWFwcGluZzsKLQlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBpb2NiLT5raV9maWxwLT5mX21hcHBpbmctPmhvc3Q7CiAJc3RydWN0IHhmc19pbm9kZQkqaXAgPSBYRlNfSShpbm9kZSk7Ci0Jc3RydWN0IHhmc19tb3VudAkqbXAgPSBpcC0+aV9tb3VudDsKLQlzc2l6ZV90CQkJcmV0ID0gMDsKLQlpbnQJCQl1bmFsaWduZWRfaW8gPSAwOwotCWludAkJCWlvbG9jazsKLQlzdHJ1Y3QgaW92X2l0ZXIJCWRhdGE7CisJaW50CQkJaW9sb2NrID0gWEZTX0lPTE9DS19FWENMOworCXNzaXplX3QJCQlyZXQsIGVycm9yID0gMDsKKwlzaXplX3QJCQljb3VudDsKKwlsb2ZmX3QJCQlwb3M7CiAKLQkvKiAidW5hbGlnbmVkIiBoZXJlIG1lYW5zIG5vdCBhbGlnbmVkIHRvIGEgZmlsZXN5c3RlbSBibG9jayAqLwotCWlmICgoaW9jYi0+a2lfcG9zICYgbXAtPm1fYmxvY2ttYXNrKSB8fAotCSAgICAoKGlvY2ItPmtpX3BvcyArIGlvdl9pdGVyX2NvdW50KGZyb20pKSAmIG1wLT5tX2Jsb2NrbWFzaykpIHsKLQkJdW5hbGlnbmVkX2lvID0gMTsKLQkJaW9sb2NrID0gWEZTX0lPTE9DS19FWENMOwotCX0gZWxzZSBpZiAobWFwcGluZy0+bnJwYWdlcykgewotCQlpb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7Ci0JfSBlbHNlIHsKLQkJaW9sb2NrID0gWEZTX0lPTE9DS19TSEFSRUQ7Ci0JfQogCXhmc19yd19pbG9jayhpcCwgaW9sb2NrKTsKLQogCXJldCA9IHhmc19maWxlX2Fpb193cml0ZV9jaGVja3MoaW9jYiwgZnJvbSwgJmlvbG9jayk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKLQkvKgotCSAqIFllcywgZXZlbiBEQVggZmlsZXMgY2FuIGhhdmUgcGFnZSBjYWNoZSBhdHRhY2hlZCB0byB0aGVtOiAgQSB6ZXJvZWQKLQkgKiBwYWdlIGlzIGluc2VydGVkIGludG8gdGhlIHBhZ2VjYWNoZSB3aGVuIHdlIGhhdmUgdG8gc2VydmUgYSB3cml0ZQotCSAqIGZhdWx0IG9uIGEgaG9sZS4gIEl0IHNob3VsZCBuZXZlciBiZSBkaXJ0aWVkIGFuZCBjYW4gc2ltcGx5IGJlCi0JICogZHJvcHBlZCBmcm9tIHRoZSBwYWdlY2FjaGUgb25jZSB3ZSBnZXQgcmVhbCBkYXRhIGZvciB0aGUgcGFnZS4KLQkgKgotCSAqIFhYWDogVGhpcyBpcyByYWN5IGFnYWluc3QgbW1hcCwgYW5kIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQKLQkgKiBpdC4gZGF4X2RvX2lvKCkgc2hvdWxkIHJlYWxseSBkbyB0aGlzIGludmFsaWRhdGlvbiBpbnRlcm5hbGx5IGFzCi0JICogaXQgd2lsbCBrbm93IGlmIHdlJ3ZlIGFsbG9jYXRlZCBvdmVyIGEgaG9sZWkgZm9yIHRoaXMgc3BlY2lmaWMgSU8gYW5kCi0JICogaWYgc28gaXQgbmVlZHMgdG8gdXBkYXRlIHRoZSBtYXBwaW5nIHRyZWUgYW5kIGludmFsaWRhdGUgZXhpc3RpbmcKLQkgKiBQVEVzIG92ZXIgdGhlIG5ld2x5IGFsbG9jYXRlZCByYW5nZS4gUmVtb3ZlIHRoaXMgaW52YWxpZGF0aW9uIHdoZW4KLQkgKiBkYXhfZG9faW8oKSBpcyBmaXhlZCB1cC4KLQkgKi8KLQlpZiAobWFwcGluZy0+bnJwYWdlcykgewotCQlsb2ZmX3QgZW5kID0gaW9jYi0+a2lfcG9zICsgaW92X2l0ZXJfY291bnQoZnJvbSkgLSAxOworCXBvcyA9IGlvY2ItPmtpX3BvczsKKwljb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOwogCi0JCXJldCA9IGludmFsaWRhdGVfaW5vZGVfcGFnZXMyX3JhbmdlKG1hcHBpbmcsCi0JCQkJCQkgICAgaW9jYi0+a2lfcG9zID4+IFBBR0VfU0hJRlQsCi0JCQkJCQkgICAgZW5kID4+IFBBR0VfU0hJRlQpOwotCQlXQVJOX09OX09OQ0UocmV0KTsKKwl0cmFjZV94ZnNfZmlsZV9kYXhfd3JpdGUoaXAsIGNvdW50LCBwb3MpOworCisJcmV0ID0gaW9tYXBfZGF4X3J3KGlvY2IsIGZyb20sICZ4ZnNfaW9tYXBfb3BzKTsKKwlpZiAocmV0ID4gMCAmJiBpb2NiLT5raV9wb3MgPiBpX3NpemVfcmVhZChpbm9kZSkpIHsKKwkJaV9zaXplX3dyaXRlKGlub2RlLCBpb2NiLT5raV9wb3MpOworCQllcnJvciA9IHhmc19zZXRmaWxlc2l6ZShpcCwgcG9zLCByZXQpOwogCX0KIAotCWlmIChpb2xvY2sgPT0gWEZTX0lPTE9DS19FWENMICYmICF1bmFsaWduZWRfaW8pIHsKLQkJeGZzX3J3X2lsb2NrX2RlbW90ZShpcCwgWEZTX0lPTE9DS19FWENMKTsKLQkJaW9sb2NrID0gWEZTX0lPTE9DS19TSEFSRUQ7Ci0JfQotCi0JdHJhY2VfeGZzX2ZpbGVfZGF4X3dyaXRlKGlwLCBpb3ZfaXRlcl9jb3VudChmcm9tKSwgaW9jYi0+a2lfcG9zKTsKLQotCWRhdGEgPSAqZnJvbTsKLQlyZXQgPSBkYXhfZG9faW8oaW9jYiwgaW5vZGUsICZkYXRhLCB4ZnNfZ2V0X2Jsb2Nrc19kaXJlY3QsCi0JCQl4ZnNfZW5kX2lvX2RpcmVjdF93cml0ZSwgMCk7Ci0JaWYgKHJldCA+IDApIHsKLQkJaW9jYi0+a2lfcG9zICs9IHJldDsKLQkJaW92X2l0ZXJfYWR2YW5jZShmcm9tLCByZXQpOwotCX0KIG91dDoKIAl4ZnNfcndfaXVubG9jayhpcCwgaW9sb2NrKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBlcnJvciA/IGVycm9yIDogcmV0OwogfQogCiBTVEFUSUMgc3NpemVfdApAQCAtMTUxMyw3ICsxNDMwLDcgQEAKIAl4ZnNfaWxvY2soWEZTX0koaW5vZGUpLCBYRlNfTU1BUExPQ0tfU0hBUkVEKTsKIAogCWlmIChJU19EQVgoaW5vZGUpKSB7Ci0JCXJldCA9IGRheF9ta3dyaXRlKHZtYSwgdm1mLCB4ZnNfZ2V0X2Jsb2Nrc19kYXhfZmF1bHQpOworCQlyZXQgPSBpb21hcF9kYXhfZmF1bHQodm1hLCB2bWYsICZ4ZnNfaW9tYXBfb3BzKTsKIAl9IGVsc2UgewogCQlyZXQgPSBpb21hcF9wYWdlX21rd3JpdGUodm1hLCB2bWYsICZ4ZnNfaW9tYXBfb3BzKTsKIAkJcmV0ID0gYmxvY2tfcGFnZV9ta3dyaXRlX3JldHVybihyZXQpOwpAQCAtMTU0Nyw3ICsxNDY0LDcgQEAKIAkJICogY2hhbmdlcyB0byB4ZnNfZ2V0X2Jsb2Nrc19kaXJlY3QoKSB0byBtYXAgdW53cml0dGVuIGV4dGVudAogCQkgKiBpb2VuZCBmb3IgY29udmVyc2lvbiBvbiByZWFkLW9ubHkgbWFwcGluZ3MuCiAJCSAqLwotCQlyZXQgPSBkYXhfZmF1bHQodm1hLCB2bWYsIHhmc19nZXRfYmxvY2tzX2RheF9mYXVsdCk7CisJCXJldCA9IGlvbWFwX2RheF9mYXVsdCh2bWEsIHZtZiwgJnhmc19pb21hcF9vcHMpOwogCX0gZWxzZQogCQlyZXQgPSBmaWxlbWFwX2ZhdWx0KHZtYSwgdm1mKTsKIAl4ZnNfaXVubG9jayhYRlNfSShpbm9kZSksIFhGU19NTUFQTE9DS19TSEFSRUQpOwpAQCAtMTY1Miw3ICsxNTY5LDcgQEAKIAkubGxzZWVrCQk9IHhmc19maWxlX2xsc2VlaywKIAkucmVhZF9pdGVyCT0geGZzX2ZpbGVfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyCT0geGZzX2ZpbGVfd3JpdGVfaXRlciwKLQkuc3BsaWNlX3JlYWQJPSB4ZnNfZmlsZV9zcGxpY2VfcmVhZCwKKwkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiAJLnNwbGljZV93cml0ZQk9IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUsCiAJLnVubG9ja2VkX2lvY3RsCT0geGZzX2ZpbGVfaW9jdGwsCiAjaWZkZWYgQ09ORklHX0NPTVBBVApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19maWxlc3RyZWFtLmMgYi9mcy94ZnMveGZzX2ZpbGVzdHJlYW0uYwppbmRleCA0YTMzYTMzLi4wNDNjYTM4MCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19maWxlc3RyZWFtLmMKKysrIGIvZnMveGZzL3hmc19maWxlc3RyZWFtLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJ4ZnNfbXJ1X2NhY2hlLmgiCiAjaW5jbHVkZSAieGZzX2ZpbGVzdHJlYW0uaCIKICNpbmNsdWRlICJ4ZnNfdHJhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfYWdfcmVzdi5oIgogCiBzdHJ1Y3QgeGZzX2ZzdHJtX2l0ZW0gewogCXN0cnVjdCB4ZnNfbXJ1X2NhY2hlX2VsZW0JbXJ1OwpAQCAtMTk4LDcgKzE5OSw4IEBACiAJCX0KIAogCQlsb25nZXN0ID0geGZzX2FsbG9jX2xvbmdlc3RfZnJlZV9leHRlbnQobXAsIHBhZywKLQkJCQkJeGZzX2FsbG9jX21pbl9mcmVlbGlzdChtcCwgcGFnKSk7CisJCQkJeGZzX2FsbG9jX21pbl9mcmVlbGlzdChtcCwgcGFnKSwKKwkJCQl4ZnNfYWdfcmVzdl9uZWVkZWQocGFnLCBYRlNfQUdfUkVTVl9OT05FKSk7CiAJCWlmICgoKG1pbmxlbiAmJiBsb25nZXN0ID49IG1pbmxlbikgfHwKIAkJICAgICAoIW1pbmxlbiAmJiBwYWctPnBhZ2ZfZnJlZWJsa3MgPj0gbWluZnJlZSkpICYmCiAJCSAgICAoIXBhZy0+cGFnZl9tZXRhZGF0YSB8fCAhKGZsYWdzICYgWEZTX1BJQ0tfVVNFUkRBVEEpIHx8CkBAIC0zNjksNyArMzcxLDggQEAKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OwogCXhmc19leHRsZW5fdAkJbWlubGVuID0gYXAtPmxlbmd0aDsKIAl4ZnNfYWdudW1iZXJfdAkJc3RhcnRhZyA9IDA7Ci0JaW50CQkJZmxhZ3MsIGVyciA9IDA7CisJaW50CQkJZmxhZ3MgPSAwOworCWludAkJCWVyciA9IDA7CiAJc3RydWN0IHhmc19tcnVfY2FjaGVfZWxlbSAqbXJ1OwogCiAJKmFncCA9IE5VTExBR05VTUJFUjsKQEAgLTM4NSw4ICszODgsMTAgQEAKIAkJc3RhcnRhZyA9IChpdGVtLT5hZyArIDEpICUgbXAtPm1fc2Iuc2JfYWdjb3VudDsKIAl9CiAKLQlmbGFncyA9IChhcC0+dXNlcmRhdGEgPyBYRlNfUElDS19VU0VSREFUQSA6IDApIHwKLQkgICAgICAgIChhcC0+ZGZvcHMtPmRvcF9sb3cgPyBYRlNfUElDS19MT1dTUEFDRSA6IDApOworCWlmICh4ZnNfYWxsb2NfaXNfdXNlcmRhdGEoYXAtPmRhdGF0eXBlKSkKKwkJZmxhZ3MgfD0gWEZTX1BJQ0tfVVNFUkRBVEE7CisJaWYgKGFwLT5kZm9wcy0+ZG9wX2xvdykKKwkJZmxhZ3MgfD0gWEZTX1BJQ0tfTE9XU1BBQ0U7CiAKIAllcnIgPSB4ZnNfZmlsZXN0cmVhbV9waWNrX2FnKHBpcCwgc3RhcnRhZywgYWdwLCBmbGFncywgbWlubGVuKTsKIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19mc29wcy5jIGIvZnMveGZzL3hmc19mc29wcy5jCmluZGV4IDBiN2Y5ODYuLjk0YWMwNmYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZnNvcHMuYworKysgYi9mcy94ZnMveGZzX2Zzb3BzLmMKQEAgLTU1Myw3ICs1NTMsNyBAQAogCQllcnJvciA9IHhmc19mcmVlX2V4dGVudCh0cCwKIAkJCQlYRlNfQUdCX1RPX0ZTQihtcCwgYWdubywKIAkJCQkJYmUzMl90b19jcHUoYWdmLT5hZ2ZfbGVuZ3RoKSAtIG5ldyksCi0JCQkJbmV3LCAmb2luZm8pOworCQkJCW5ldywgJm9pbmZvLCBYRlNfQUdfUkVTVl9OT05FKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBlcnJvcjA7CiAJfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pY2FjaGUuYyBiL2ZzL3hmcy94ZnNfaWNhY2hlLmMKaW5kZXggZmIzOWE2Ni4uNjViMmUzZiAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pY2FjaGUuYworKysgYi9mcy94ZnMveGZzX2ljYWNoZS5jCkBAIC0xNDE0LDYgKzE0MTQsMTYgQEAKIAlzdHJ1Y3QgeGZzX3BlcmFnICpwYWc7CiAJaW50IHRhZ2dlZDsKIAorCS8qCisJICogRG9uJ3QgYm90aGVyIGxvY2tpbmcgdGhlIEFHIGFuZCBsb29raW5nIHVwIGluIHRoZSByYWRpeCB0cmVlcworCSAqIGlmIHdlIGFscmVhZHkga25vdyB0aGF0IHdlIGhhdmUgdGhlIHRhZyBzZXQuCisJICovCisJaWYgKGlwLT5pX2ZsYWdzICYgWEZTX0lFT0ZCTE9DS1MpCisJCXJldHVybjsKKwlzcGluX2xvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCWlwLT5pX2ZsYWdzIHw9IFhGU19JRU9GQkxPQ0tTOworCXNwaW5fdW5sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwogCXBhZyA9IHhmc19wZXJhZ19nZXQobXAsIFhGU19JTk9fVE9fQUdOTyhtcCwgaXAtPmlfaW5vKSk7CiAJc3Bpbl9sb2NrKCZwYWctPnBhZ19pY2lfbG9jayk7CiAJdHJhY2VfeGZzX2lub2RlX3NldF9lb2ZibG9ja3NfdGFnKGlwKTsKQEAgLTE0NDksNiArMTQ1OSwxMCBAQAogCXN0cnVjdCB4ZnNfbW91bnQgKm1wID0gaXAtPmlfbW91bnQ7CiAJc3RydWN0IHhmc19wZXJhZyAqcGFnOwogCisJc3Bpbl9sb2NrKCZpcC0+aV9mbGFnc19sb2NrKTsKKwlpcC0+aV9mbGFncyAmPSB+WEZTX0lFT0ZCTE9DS1M7CisJc3Bpbl91bmxvY2soJmlwLT5pX2ZsYWdzX2xvY2spOworCiAJcGFnID0geGZzX3BlcmFnX2dldChtcCwgWEZTX0lOT19UT19BR05PKG1wLCBpcC0+aV9pbm8pKTsKIAlzcGluX2xvY2soJnBhZy0+cGFnX2ljaV9sb2NrKTsKIAl0cmFjZV94ZnNfaW5vZGVfY2xlYXJfZW9mYmxvY2tzX3RhZyhpcCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmggYi9mcy94ZnMveGZzX2lub2RlLmgKaW5kZXggZTFhNDExZS4uOGYzMGQyNSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuaApAQCAtMjE2LDYgKzIxNiw3IEBACiAjZGVmaW5lIF9fWEZTX0lQSU5ORURfQklUCTgJIC8qIHdha2V1cCBrZXkgZm9yIHplcm8gcGluIGNvdW50ICovCiAjZGVmaW5lIFhGU19JUElOTkVECQkoMSA8PCBfX1hGU19JUElOTkVEX0JJVCkKICNkZWZpbmUgWEZTX0lET05UQ0FDSEUJCSgxIDw8IDkpIC8qIGRvbid0IGNhY2hlIHRoZSBpbm9kZSBsb25nIHRlcm0gKi8KKyNkZWZpbmUgWEZTX0lFT0ZCTE9DS1MJCSgxIDw8IDEwKS8qIGhhcyB0aGUgcHJlYWxsb2NibG9ja3MgdGFnIHNldCAqLwogCiAvKgogICogUGVyLWxpZmV0aW1lIGZsYWdzIG5lZWQgdG8gYmUgcmVzZXQgd2hlbiByZS11c2luZyBhIHJlY2xhaW1hYmxlIGlub2RlIGR1cmluZwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5jIGIvZnMveGZzL3hmc19pb21hcC5jCmluZGV4IDJhZjBkZGEuLmMwODI1M2UgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9tYXAuYworKysgYi9mcy94ZnMveGZzX2lvbWFwLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE2IENocmlzdG9waCBIZWxsd2lnLgogICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC00MiwxNyArNDMsNDAgQEAKIAogI2RlZmluZSBYRlNfV1JJVEVJT19BTElHTihtcCxvZmYpCSgoKG9mZikgPj4gbXAtPm1fd3JpdGVpb19sb2cpIFwKIAkJCQkJCTw8IG1wLT5tX3dyaXRlaW9fbG9nKQotI2RlZmluZSBYRlNfV1JJVEVfSU1BUFMJCVhGU19CTUFQX01BWF9OTUFQCiAKLVNUQVRJQyBpbnQKLXhmc19pb21hcF9lb2ZfYWxpZ25fbGFzdF9mc2IoCi0JeGZzX21vdW50X3QJKm1wLAotCXhmc19pbm9kZV90CSppcCwKLQl4ZnNfZXh0bGVuX3QJZXh0c2l6ZSwKLQl4ZnNfZmlsZW9mZl90CSpsYXN0X2ZzYikKK3ZvaWQKK3hmc19ibWJ0X3RvX2lvbWFwKAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXN0cnVjdCBpb21hcAkJKmlvbWFwLAorCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSppbWFwKQogewotCXhmc19leHRsZW5fdAlhbGlnbiA9IDA7Ci0JaW50CQllb2YsIGVycm9yOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CisKKwlpZiAoaW1hcC0+YnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSykgeworCQlpb21hcC0+Ymxrbm8gPSBJT01BUF9OVUxMX0JMT0NLOworCQlpb21hcC0+dHlwZSA9IElPTUFQX0hPTEU7CisJfSBlbHNlIGlmIChpbWFwLT5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSykgeworCQlpb21hcC0+Ymxrbm8gPSBJT01BUF9OVUxMX0JMT0NLOworCQlpb21hcC0+dHlwZSA9IElPTUFQX0RFTEFMTE9DOworCX0gZWxzZSB7CisJCWlvbWFwLT5ibGtubyA9IHhmc19mc2JfdG9fZGIoaXAsIGltYXAtPmJyX3N0YXJ0YmxvY2spOworCQlpZiAoaW1hcC0+YnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4pCisJCQlpb21hcC0+dHlwZSA9IElPTUFQX1VOV1JJVFRFTjsKKwkJZWxzZQorCQkJaW9tYXAtPnR5cGUgPSBJT01BUF9NQVBQRUQ7CisJfQorCWlvbWFwLT5vZmZzZXQgPSBYRlNfRlNCX1RPX0IobXAsIGltYXAtPmJyX3N0YXJ0b2ZmKTsKKwlpb21hcC0+bGVuZ3RoID0gWEZTX0ZTQl9UT19CKG1wLCBpbWFwLT5icl9ibG9ja2NvdW50KTsKKwlpb21hcC0+YmRldiA9IHhmc19maW5kX2JkZXZfZm9yX2lub2RlKFZGU19JKGlwKSk7Cit9CisKK3N0YXRpYyB4ZnNfZXh0bGVuX3QKK3hmc19lb2ZfYWxpZ25tZW50KAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXhmc19leHRsZW5fdAkJZXh0c2l6ZSkKK3sKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXhmc19leHRsZW5fdAkJYWxpZ24gPSAwOwogCiAJaWYgKCFYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKSB7CiAJCS8qCkBAIC04Myw4ICsxMDcsMjEgQEAKIAkJCWFsaWduID0gZXh0c2l6ZTsKIAl9CiAKKwlyZXR1cm4gYWxpZ247Cit9CisKK1NUQVRJQyBpbnQKK3hmc19pb21hcF9lb2ZfYWxpZ25fbGFzdF9mc2IoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJeGZzX2V4dGxlbl90CQlleHRzaXplLAorCXhmc19maWxlb2ZmX3QJCSpsYXN0X2ZzYikKK3sKKwl4ZnNfZXh0bGVuX3QJCWFsaWduID0geGZzX2VvZl9hbGlnbm1lbnQoaXAsIGV4dHNpemUpOworCiAJaWYgKGFsaWduKSB7CiAJCXhmc19maWxlb2ZmX3QJbmV3X2xhc3RfZnNiID0gcm91bmR1cF82NCgqbGFzdF9mc2IsIGFsaWduKTsKKwkJaW50CQllb2YsIGVycm9yOworCiAJCWVycm9yID0geGZzX2JtYXBfZW9mKGlwLCBuZXdfbGFzdF9mc2IsIFhGU19EQVRBX0ZPUkssICZlb2YpOwogCQlpZiAoZXJyb3IpCiAJCQlyZXR1cm4gZXJyb3I7CkBAIC0xNTQsNyArMTkxLDcgQEAKIAkJICovCiAJCUFTU0VSVChYRlNfSUZPUktfUFRSKGlwLCBYRlNfREFUQV9GT1JLKS0+aWZfZmxhZ3MgJgogCQkJCQkJCQlYRlNfSUZFWFRFTlRTKTsKLQkJZXJyb3IgPSB4ZnNfaW9tYXBfZW9mX2FsaWduX2xhc3RfZnNiKG1wLCBpcCwgZXh0c3osICZsYXN0X2ZzYik7CisJCWVycm9yID0geGZzX2lvbWFwX2VvZl9hbGlnbl9sYXN0X2ZzYihpcCwgZXh0c3osICZsYXN0X2ZzYik7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X3VubG9jazsKIAl9IGVsc2UgewpAQCAtMjc0LDEzMCArMzExLDYgQEAKIAlnb3RvIG91dF91bmxvY2s7CiB9CiAKLS8qCi0gKiBJZiB0aGUgY2FsbGVyIGlzIGRvaW5nIGEgd3JpdGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgdGhlbiBleHRlbmQgdGhlCi0gKiBhbGxvY2F0aW9uIG91dCB0byB0aGUgZmlsZSBzeXN0ZW0ncyB3cml0ZSBpb3NpemUuICBXZSBjbGVhbiB1cCBhbnkgZXh0cmEKLSAqIHNwYWNlIGxlZnQgb3ZlciB3aGVuIHRoZSBmaWxlIGlzIGNsb3NlZCBpbiB4ZnNfaW5hY3RpdmUoKS4KLSAqCi0gKiBJZiB3ZSBmaW5kIHdlIGFscmVhZHkgaGF2ZSBkZWxhbGxvYyBwcmVhbGxvY2F0aW9uIGJleW9uZCBFT0YsIGRvbid0IGRvIG1vcmUKLSAqIHByZWFsbG9jYXRpb24gYXMgaXQgaXQgbm90IG5lZWRlZC4KLSAqLwotU1RBVElDIGludAoteGZzX2lvbWFwX2VvZl93YW50X3ByZWFsbG9jYXRlKAotCXhmc19tb3VudF90CSptcCwKLQl4ZnNfaW5vZGVfdAkqaXAsCi0JeGZzX29mZl90CW9mZnNldCwKLQlzaXplX3QJCWNvdW50LAotCXhmc19ibWJ0X2lyZWNfdCAqaW1hcCwKLQlpbnQJCW5pbWFwcywKLQlpbnQJCSpwcmVhbGxvYykKLXsKLQl4ZnNfZmlsZW9mZl90ICAgc3RhcnRfZnNiOwotCXhmc19maWxibGtzX3QgICBjb3VudF9mc2I7Ci0JaW50CQluLCBlcnJvciwgaW1hcHM7Ci0JaW50CQlmb3VuZF9kZWxhbGxvYyA9IDA7Ci0KLQkqcHJlYWxsb2MgPSAwOwotCWlmIChvZmZzZXQgKyBjb3VudCA8PSBYRlNfSVNJWkUoaXApKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogSWYgdGhlIGZpbGUgaXMgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIHByZWFsbG9jIGFuZCB3ZSBhcmUgdXNpbmcKLQkgKiBkeW5hbWljIHByZWFsbG9jYXRpb24sIGRvbid0IGRvIGFueSBwcmVhbGxvY2F0aW9uIGF0IGFsbCBhcyBpdCBpcwotCSAqIGxpa2VseSB0aGlzIGlzIHRoZSBvbmx5IHdyaXRlIHRvIHRoZSBmaWxlIHRoYXQgaXMgZ29pbmcgdG8gYmUgZG9uZS4KLQkgKi8KLQlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ERkxUX0lPU0laRSkgJiYKLQkgICAgWEZTX0lTSVpFKGlwKSA8IFhGU19GU0JfVE9fQihtcCwgbXAtPm1fd3JpdGVpb19ibG9ja3MpKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogSWYgdGhlcmUgYXJlIGFueSByZWFsIGJsb2NrcyBwYXN0IGVvZiwgdGhlbiBkb24ndAotCSAqIGRvIGFueSBzcGVjdWxhdGl2ZSBhbGxvY2F0aW9uLgotCSAqLwotCXN0YXJ0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsICgoeGZzX3Vmc2l6ZV90KShvZmZzZXQgKyBjb3VudCAtIDEpKSk7Ci0JY291bnRfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCBtcC0+bV9zdXBlci0+c19tYXhieXRlcyk7Ci0Jd2hpbGUgKGNvdW50X2ZzYiA+IDApIHsKLQkJaW1hcHMgPSBuaW1hcHM7Ci0JCWVycm9yID0geGZzX2JtYXBpX3JlYWQoaXAsIHN0YXJ0X2ZzYiwgY291bnRfZnNiLCBpbWFwLCAmaW1hcHMsCi0JCQkJICAgICAgIDApOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JCWZvciAobiA9IDA7IG4gPCBpbWFwczsgbisrKSB7Ci0JCQlpZiAoKGltYXBbbl0uYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykgJiYKLQkJCSAgICAoaW1hcFtuXS5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykpCi0JCQkJcmV0dXJuIDA7Ci0JCQlzdGFydF9mc2IgKz0gaW1hcFtuXS5icl9ibG9ja2NvdW50OwotCQkJY291bnRfZnNiIC09IGltYXBbbl0uYnJfYmxvY2tjb3VudDsKLQotCQkJaWYgKGltYXBbbl0uYnJfc3RhcnRibG9jayA9PSBERUxBWVNUQVJUQkxPQ0spCi0JCQkJZm91bmRfZGVsYWxsb2MgPSAxOwotCQl9Ci0JfQotCWlmICghZm91bmRfZGVsYWxsb2MpCi0JCSpwcmVhbGxvYyA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBEZXRlcm1pbmUgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcHJlYWxsb2NhdGlvbi4gV2UgYXJlIGJleW9uZCB0aGUgY3VycmVudAotICogRU9GIGhlcmUsIGJ1dCB3ZSBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IHdoZXRoZXIgdGhpcyBpcyBhIHNwYXJzZSB3cml0ZSBvcgotICogYW4gZXh0ZW5kaW5nIHdyaXRlIHdoZW4gZGV0ZXJtaW5pbmcgdGhlIHByZWFsbG9jYXRpb24gc2l6ZS4gIEhlbmNlIHdlIG5lZWQgdG8KLSAqIGxvb2sgdXAgdGhlIGV4dGVudCB0aGF0IGVuZHMgYXQgdGhlIGN1cnJlbnQgd3JpdGUgb2Zmc2V0IGFuZCB1c2UgdGhlIHJlc3VsdAotICogdG8gZGV0ZXJtaW5lIHRoZSBwcmVhbGxvY2F0aW9uIHNpemUuCi0gKgotICogSWYgdGhlIGV4dGVudCBpcyBhIGhvbGUsIHRoZW4gcHJlYWxsb2NhdGlvbiBpcyBlc3NlbnRpYWxseSBkaXNhYmxlZC4KLSAqIE90aGVyd2lzZSB3ZSB0YWtlIHRoZSBzaXplIG9mIHRoZSBwcmVjZWVkaW5nIGRhdGEgZXh0ZW50IGFzIHRoZSBiYXNpcyBmb3IgdGhlCi0gKiBwcmVhbGxvY2F0aW9uIHNpemUuIElmIHRoZSBzaXplIG9mIHRoZSBleHRlbnQgaXMgZ3JlYXRlciB0aGFuIGhhbGYgdGhlCi0gKiBtYXhpbXVtIGV4dGVudCBsZW5ndGgsIHRoZW4gdXNlIHRoZSBjdXJyZW50IG9mZnNldCBhcyB0aGUgYmFzaXMuIFRoaXMgZW5zdXJlcwotICogdGhhdCBmb3IgbGFyZ2UgZmlsZXMgdGhlIHByZWFsbG9jYXRpb24gc2l6ZSBhbHdheXMgZXh0ZW5kcyB0byBNQVhFWFRMRU4KLSAqIHJhdGhlciB0aGFuIGZhbGxpbmcgc2hvcnQgZHVlIHRvIHRoaW5ncyBsaWtlIHN0cmlwZSB1bml0L3dpZHRoIGFsaWdubWVudCBvZgotICogcmVhbCBleHRlbnRzLgotICovCi1TVEFUSUMgeGZzX2ZzYmxvY2tfdAoteGZzX2lvbWFwX2VvZl9wcmVhbGxvY19pbml0aWFsX3NpemUoCi0Jc3RydWN0IHhmc19tb3VudAkqbXAsCi0Jc3RydWN0IHhmc19pbm9kZQkqaXAsCi0JeGZzX29mZl90CQlvZmZzZXQsCi0JeGZzX2JtYnRfaXJlY190CQkqaW1hcCwKLQlpbnQJCQluaW1hcHMpCi17Ci0JeGZzX2ZpbGVvZmZfdCAgIHN0YXJ0X2ZzYjsKLQlpbnQJCWltYXBzID0gMTsKLQlpbnQJCWVycm9yOwotCi0JQVNTRVJUKG5pbWFwcyA+PSBpbWFwcyk7Ci0KLQkvKiBpZiB3ZSBhcmUgdXNpbmcgYSBzcGVjaWZpYyBwcmVhbGxvYyBzaXplLCByZXR1cm4gbm93ICovCi0JaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0RGTFRfSU9TSVpFKQotCQlyZXR1cm4gMDsKLQotCS8qIElmIHRoZSBmaWxlIGlzIHNtYWxsLCB0aGVuIHVzZSB0aGUgbWluaW11bSBwcmVhbGxvYyAqLwotCWlmIChYRlNfSVNJWkUoaXApIDwgWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV9kYWxpZ24pKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogQXMgd2Ugd3JpdGUgbXVsdGlwbGUgcGFnZXMsIHRoZSBvZmZzZXQgd2lsbCBhbHdheXMgYWxpZ24gdG8gdGhlCi0JICogc3RhcnQgb2YgYSBwYWdlIGFuZCBoZW5jZSBwb2ludCB0byBhIGhvbGUgYXQgRU9GLiBpLmUuIGlmIHRoZSBzaXplIGlzCi0JICogNDA5NiBieXRlcywgd2Ugb25seSBoYXZlIG9uZSBibG9jayBhdCBGU0IgMCwgYnV0IFhGU19CX1RPX0ZTQig0MDk2KQotCSAqIHdpbGwgcmV0dXJuIEZTQiAxLiBIZW5jZSBpZiB0aGVyZSBhcmUgYmxvY2tzIGluIHRoZSBmaWxlLCB3ZSB3YW50IHRvCi0JICogcG9pbnQgdG8gdGhlIGJsb2NrIHByaW9yIHRvIHRoZSBFT0YgYmxvY2sgYW5kIG5vdCB0aGUgaG9sZSB0aGF0IG1hcHMKLQkgKiBkaXJlY3RseSBhdCBAb2Zmc2V0LgotCSAqLwotCXN0YXJ0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgb2Zmc2V0KTsKLQlpZiAoc3RhcnRfZnNiKQotCQlzdGFydF9mc2ItLTsKLQllcnJvciA9IHhmc19ibWFwaV9yZWFkKGlwLCBzdGFydF9mc2IsIDEsIGltYXAsICZpbWFwcywgWEZTX0JNQVBJX0VOVElSRSk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gMDsKLQotCUFTU0VSVChpbWFwcyA9PSAxKTsKLQlpZiAoaW1hcFswXS5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKQotCQlyZXR1cm4gMDsKLQlpZiAoaW1hcFswXS5icl9ibG9ja2NvdW50IDw9IChNQVhFWFRMRU4gPj4gMSkpCi0JCXJldHVybiBpbWFwWzBdLmJyX2Jsb2NrY291bnQgPDwgMTsKLQlyZXR1cm4gWEZTX0JfVE9fRlNCKG1wLCBvZmZzZXQpOwotfQotCiBTVEFUSUMgYm9vbAogeGZzX3F1b3RhX25lZWRfdGhyb3R0bGUoCiAJc3RydWN0IHhmc19pbm9kZSAqaXAsCkBAIC00NTksMjcgKzM3Miw3NiBAQAogfQogCiAvKgorICogSWYgd2UgYXJlIGRvaW5nIGEgd3JpdGUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgdGhlcmUgYXJlIG5vIGFsbG9jYXRpb25zCisgKiBwYXN0IHRoaXMgb25lLCB0aGVuIGV4dGVuZCB0aGUgYWxsb2NhdGlvbiBvdXQgdG8gdGhlIGZpbGUgc3lzdGVtJ3Mgd3JpdGUKKyAqIGlvc2l6ZS4KKyAqCiAgKiBJZiB3ZSBkb24ndCBoYXZlIGEgdXNlciBzcGVjaWZpZWQgcHJlYWxsb2NhdGlvbiBzaXplLCBkeW5hbWljYWxseSBpbmNyZWFzZQotICogdGhlIHByZWFsbG9jYXRpb24gc2l6ZSBhcyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBncm93cy4gQ2FwIHRoZSBtYXhpbXVtIHNpemUKKyAqIHRoZSBwcmVhbGxvY2F0aW9uIHNpemUgYXMgdGhlIHNpemUgb2YgdGhlIGZpbGUgZ3Jvd3MuICBDYXAgdGhlIG1heGltdW0gc2l6ZQogICogYXQgYSBzaW5nbGUgZXh0ZW50IG9yIGxlc3MgaWYgdGhlIGZpbGVzeXN0ZW0gaXMgbmVhciBmdWxsLiBUaGUgY2xvc2VyIHRoZQogICogZmlsZXN5c3RlbSBpcyB0byBmdWxsLCB0aGUgc21hbGxlciB0aGUgbWF4aW11bSBwcmVhbG9jYXRpb24uCisgKgorICogQXMgYW4gZXhjZXB0aW9uIHdlIGRvbid0IGRvIGFueSBwcmVhbGxvY2F0aW9uIGF0IGFsbCBpZiB0aGUgZmlsZSBpcyBzbWFsbGVyCisgKiB0aGFuIHRoZSBtaW5pbXVtIHByZWFsbG9jYXRpb24gYW5kIHdlIGFyZSB1c2luZyB0aGUgZGVmYXVsdCBkeW5hbWljCisgKiBwcmVhbGxvY2F0aW9uIHNjaGVtZSwgYXMgaXQgaXMgbGlrZWx5IHRoaXMgaXMgdGhlIG9ubHkgd3JpdGUgdG8gdGhlIGZpbGUgdGhhdAorICogaXMgZ29pbmcgdG8gYmUgZG9uZS4KKyAqCisgKiBXZSBjbGVhbiB1cCBhbnkgZXh0cmEgc3BhY2UgbGVmdCBvdmVyIHdoZW4gdGhlIGZpbGUgaXMgY2xvc2VkIGluCisgKiB4ZnNfaW5hY3RpdmUoKS4KICAqLwogU1RBVElDIHhmc19mc2Jsb2NrX3QKIHhmc19pb21hcF9wcmVhbGxvY19zaXplKAotCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAogCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAotCXhmc19vZmZfdAkJb2Zmc2V0LAotCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSppbWFwLAotCWludAkJCW5pbWFwcykKKwlsb2ZmX3QJCQlvZmZzZXQsCisJbG9mZl90CQkJY291bnQsCisJeGZzX2V4dG51bV90CQlpZHgsCisJc3RydWN0IHhmc19ibWJ0X2lyZWMJKnByZXYpCiB7Ci0JeGZzX2ZzYmxvY2tfdAkJYWxsb2NfYmxvY2tzID0gMDsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXhmc19maWxlb2ZmX3QJCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOwogCWludAkJCXNoaWZ0ID0gMDsKIAlpbnQ2NF90CQkJZnJlZXNwOwogCXhmc19mc2Jsb2NrX3QJCXFibG9ja3M7CiAJaW50CQkJcXNoaWZ0ID0gMDsKKwl4ZnNfZnNibG9ja190CQlhbGxvY19ibG9ja3MgPSAwOwogCi0JYWxsb2NfYmxvY2tzID0geGZzX2lvbWFwX2VvZl9wcmVhbGxvY19pbml0aWFsX3NpemUobXAsIGlwLCBvZmZzZXQsCi0JCQkJCQkJICAgaW1hcCwgbmltYXBzKTsKKwlpZiAob2Zmc2V0ICsgY291bnQgPD0gWEZTX0lTSVpFKGlwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ERkxUX0lPU0laRSkgJiYKKwkgICAgKFhGU19JU0laRShpcCkgPCBYRlNfRlNCX1RPX0IobXAsIG1wLT5tX3dyaXRlaW9fYmxvY2tzKSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiBhbiBleHBsaWNpdCBhbGxvY3NpemUgaXMgc2V0LCB0aGUgZmlsZSBpcyBzbWFsbCwgb3Igd2UKKwkgKiBhcmUgd3JpdGluZyBiZWhpbmQgYSBob2xlLCB0aGVuIHVzZSB0aGUgbWluaW11bSBwcmVhbGxvYzoKKwkgKi8KKwlpZiAoKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0RGTFRfSU9TSVpFKSB8fAorCSAgICBYRlNfSVNJWkUoaXApIDwgWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV9kYWxpZ24pIHx8CisJICAgIGlkeCA9PSAwIHx8CisJICAgIHByZXYtPmJyX3N0YXJ0b2ZmICsgcHJldi0+YnJfYmxvY2tjb3VudCA8IG9mZnNldF9mc2IpCisJCXJldHVybiBtcC0+bV93cml0ZWlvX2Jsb2NrczsKKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIHByZWFsbG9jYXRpb24uIFdlIGFyZSBiZXlvbmQgdGhlCisJICogY3VycmVudCBFT0YgaGVyZSwgYnV0IHdlIG5lZWQgdG8gdGFrZSBpbnRvIGFjY291bnQgd2hldGhlciB0aGlzIGlzCisJICogYSBzcGFyc2Ugd3JpdGUgb3IgYW4gZXh0ZW5kaW5nIHdyaXRlIHdoZW4gZGV0ZXJtaW5pbmcgdGhlCisJICogcHJlYWxsb2NhdGlvbiBzaXplLiAgSGVuY2Ugd2UgbmVlZCB0byBsb29rIHVwIHRoZSBleHRlbnQgdGhhdCBlbmRzCisJICogYXQgdGhlIGN1cnJlbnQgd3JpdGUgb2Zmc2V0IGFuZCB1c2UgdGhlIHJlc3VsdCB0byBkZXRlcm1pbmUgdGhlCisJICogcHJlYWxsb2NhdGlvbiBzaXplLgorCSAqCisJICogSWYgdGhlIGV4dGVudCBpcyBhIGhvbGUsIHRoZW4gcHJlYWxsb2NhdGlvbiBpcyBlc3NlbnRpYWxseSBkaXNhYmxlZC4KKwkgKiBPdGhlcndpc2Ugd2UgdGFrZSB0aGUgc2l6ZSBvZiB0aGUgcHJlY2VkaW5nIGRhdGEgZXh0ZW50IGFzIHRoZSBiYXNpcworCSAqIGZvciB0aGUgcHJlYWxsb2NhdGlvbiBzaXplLiBJZiB0aGUgc2l6ZSBvZiB0aGUgZXh0ZW50IGlzIGdyZWF0ZXIgdGhhbgorCSAqIGhhbGYgdGhlIG1heGltdW0gZXh0ZW50IGxlbmd0aCwgdGhlbiB1c2UgdGhlIGN1cnJlbnQgb2Zmc2V0IGFzIHRoZQorCSAqIGJhc2lzLiBUaGlzIGVuc3VyZXMgdGhhdCBmb3IgbGFyZ2UgZmlsZXMgdGhlIHByZWFsbG9jYXRpb24gc2l6ZQorCSAqIGFsd2F5cyBleHRlbmRzIHRvIE1BWEVYVExFTiByYXRoZXIgdGhhbiBmYWxsaW5nIHNob3J0IGR1ZSB0byB0aGluZ3MKKwkgKiBsaWtlIHN0cmlwZSB1bml0L3dpZHRoIGFsaWdubWVudCBvZiByZWFsIGV4dGVudHMuCisJICovCisJaWYgKHByZXYtPmJyX2Jsb2NrY291bnQgPD0gKE1BWEVYVExFTiA+PiAxKSkKKwkJYWxsb2NfYmxvY2tzID0gcHJldi0+YnJfYmxvY2tjb3VudCA8PCAxOworCWVsc2UKKwkJYWxsb2NfYmxvY2tzID0gWEZTX0JfVE9fRlNCKG1wLCBvZmZzZXQpOwogCWlmICghYWxsb2NfYmxvY2tzKQogCQlnb3RvIGNoZWNrX3dyaXRlaW87CiAJcWJsb2NrcyA9IGFsbG9jX2Jsb2NrczsKQEAgLTU1MCwxMjAgKzUxMiwxNDUgQEAKIAkgKi8KIAl3aGlsZSAoYWxsb2NfYmxvY2tzICYmIGFsbG9jX2Jsb2NrcyA+PSBmcmVlc3ApCiAJCWFsbG9jX2Jsb2NrcyA+Pj0gNDsKLQogY2hlY2tfd3JpdGVpbzoKIAlpZiAoYWxsb2NfYmxvY2tzIDwgbXAtPm1fd3JpdGVpb19ibG9ja3MpCiAJCWFsbG9jX2Jsb2NrcyA9IG1wLT5tX3dyaXRlaW9fYmxvY2tzOwotCiAJdHJhY2VfeGZzX2lvbWFwX3ByZWFsbG9jX3NpemUoaXAsIGFsbG9jX2Jsb2Nrcywgc2hpZnQsCiAJCQkJICAgICAgbXAtPm1fd3JpdGVpb19ibG9ja3MpOwotCiAJcmV0dXJuIGFsbG9jX2Jsb2NrczsKIH0KIAotaW50Ci14ZnNfaW9tYXBfd3JpdGVfZGVsYXkoCi0JeGZzX2lub2RlX3QJKmlwLAotCXhmc19vZmZfdAlvZmZzZXQsCi0Jc2l6ZV90CQljb3VudCwKLQl4ZnNfYm1idF9pcmVjX3QgKnJldF9pbWFwKQorc3RhdGljIGludAoreGZzX2ZpbGVfaW9tYXBfYmVnaW5fZGVsYXkoCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJbG9mZl90CQkJb2Zmc2V0LAorCWxvZmZfdAkJCWNvdW50LAorCXVuc2lnbmVkCQlmbGFncywKKwlzdHJ1Y3QgaW9tYXAJCSppb21hcCkKIHsKLQl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKLQl4ZnNfZmlsZW9mZl90CW9mZnNldF9mc2I7Ci0JeGZzX2ZpbGVvZmZfdAlsYXN0X2ZzYjsKLQl4ZnNfb2ZmX3QJYWxpZ25lZF9vZmZzZXQ7Ci0JeGZzX2ZpbGVvZmZfdAlpb2FsaWduOwotCXhmc19leHRsZW5fdAlleHRzejsKLQlpbnQJCW5pbWFwczsKLQl4ZnNfYm1idF9pcmVjX3QgaW1hcFtYRlNfV1JJVEVfSU1BUFNdOwotCWludAkJcHJlYWxsb2M7Ci0JaW50CQllcnJvcjsKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCA9IFhGU19JKGlub2RlKTsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OworCXN0cnVjdCB4ZnNfaWZvcmsJKmlmcCA9IFhGU19JRk9SS19QVFIoaXAsIFhGU19EQVRBX0ZPUkspOworCXhmc19maWxlb2ZmX3QJCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOworCXhmc19maWxlb2ZmX3QJCW1heGJ5dGVzX2ZzYiA9CisJCVhGU19CX1RPX0ZTQihtcCwgbXAtPm1fc3VwZXItPnNfbWF4Ynl0ZXMpOworCXhmc19maWxlb2ZmX3QJCWVuZF9mc2IsIG9yaWdfZW5kX2ZzYjsKKwlpbnQJCQllcnJvciA9IDAsIGVvZiA9IDA7CisJc3RydWN0IHhmc19ibWJ0X2lyZWMJZ290OworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCXByZXY7CisJeGZzX2V4dG51bV90CQlpZHg7CiAKLQlBU1NFUlQoeGZzX2lzaWxvY2tlZChpcCwgWEZTX0lMT0NLX0VYQ0wpKTsKKwlBU1NFUlQoIVhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpOworCUFTU0VSVCgheGZzX2dldF9leHRzel9oaW50KGlwKSk7CiAKLQkvKgotCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgYXJlIHRoZXJlLiBUaGlzIGRvZXNuJ3QgaG9sZAotCSAqIHRoZSBpbG9jayBhY3Jvc3MgYSBkaXNrIHJlYWQuCi0JICovCisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoCisJICAgIChYRlNfSUZPUktfRk9STUFUKGlwLCBYRlNfREFUQV9GT1JLKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgICBYRlNfSUZPUktfRk9STUFUKGlwLCBYRlNfREFUQV9GT1JLKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSksCisJICAgICBtcCwgWEZTX0VSUlRBR19CTUFQSUZPUk1BVCwgWEZTX1JBTkRPTV9CTUFQSUZPUk1BVCkpKSB7CisJCVhGU19FUlJPUl9SRVBPUlQoX19mdW5jX18sIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJZXJyb3IgPSAtRUZTQ09SUlVQVEVEOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJWEZTX1NUQVRTX0lOQyhtcCwgeHNfYmxrX21hcHcpOworCisJaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSB7CisJCWVycm9yID0geGZzX2lyZWFkX2V4dGVudHMoTlVMTCwgaXAsIFhGU19EQVRBX0ZPUkspOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJeGZzX2JtYXBfc2VhcmNoX2V4dGVudHMoaXAsIG9mZnNldF9mc2IsIFhGU19EQVRBX0ZPUkssICZlb2YsICZpZHgsCisJCQkmZ290LCAmcHJldik7CisJaWYgKCFlb2YgJiYgZ290LmJyX3N0YXJ0b2ZmIDw9IG9mZnNldF9mc2IpIHsKKwkJdHJhY2VfeGZzX2lvbWFwX2ZvdW5kKGlwLCBvZmZzZXQsIGNvdW50LCAwLCAmZ290KTsKKwkJZ290byBkb25lOworCX0KKwogCWVycm9yID0geGZzX3FtX2RxYXR0YWNoX2xvY2tlZChpcCwgMCk7CiAJaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7CisJCWdvdG8gb3V0X3VubG9jazsKIAotCWV4dHN6ID0geGZzX2dldF9leHRzel9oaW50KGlwKTsKLQlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKKwkvKgorCSAqIFdlIGNhcCB0aGUgbWF4aW11bSBsZW5ndGggd2UgbWFwIGhlcmUgdG8gTUFYX1dSSVRFQkFDS19QQUdFUyBwYWdlcworCSAqIHRvIGtlZXAgdGhlIGNodW5rcyBvZiB3b3JrIGRvbmUgd2hlcmUgc29tZXdoYXQgc3ltbWV0cmljIHdpdGggdGhlCisJICogd29yayB3cml0ZWJhY2sgZG9lcy4gVGhpcyBpcyBhIGNvbXBsZXRlbHkgYXJiaXRyYXJ5IG51bWJlciBwdWxsZWQKKwkgKiBvdXQgb2YgdGhpbiBhaXIgYXMgYSBiZXN0IGd1ZXNzIGZvciBpbml0aWFsIHRlc3RpbmcuCisJICoKKwkgKiBOb3RlIHRoYXQgdGhlIHZhbHVlcyBuZWVkcyB0byBiZSBsZXNzIHRoYW4gMzItYml0cyB3aWRlIHVudGlsCisJICogdGhlIGxvd2VyIGxldmVsIGZ1bmN0aW9ucyBhcmUgdXBkYXRlZC4KKwkgKi8KKwljb3VudCA9IG1pbl90KGxvZmZfdCwgY291bnQsIDEwMjQgKiBQQUdFX1NJWkUpOworCWVuZF9mc2IgPSBvcmlnX2VuZF9mc2IgPQorCQltaW4oWEZTX0JfVE9fRlNCKG1wLCBvZmZzZXQgKyBjb3VudCksIG1heGJ5dGVzX2ZzYik7CiAKLQllcnJvciA9IHhmc19pb21hcF9lb2Zfd2FudF9wcmVhbGxvY2F0ZShtcCwgaXAsIG9mZnNldCwgY291bnQsCi0JCQkJaW1hcCwgWEZTX1dSSVRFX0lNQVBTLCAmcHJlYWxsb2MpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOworCWlmIChlb2YpIHsKKwkJeGZzX2ZzYmxvY2tfdAlwcmVhbGxvY19ibG9ja3M7CisKKwkJcHJlYWxsb2NfYmxvY2tzID0KKwkJCXhmc19pb21hcF9wcmVhbGxvY19zaXplKGlwLCBvZmZzZXQsIGNvdW50LCBpZHgsICZwcmV2KTsKKwkJaWYgKHByZWFsbG9jX2Jsb2NrcykgeworCQkJeGZzX2V4dGxlbl90CWFsaWduOworCQkJeGZzX29mZl90CWVuZF9vZmZzZXQ7CisKKwkJCWVuZF9vZmZzZXQgPSBYRlNfV1JJVEVJT19BTElHTihtcCwgb2Zmc2V0ICsgY291bnQgLSAxKTsKKwkJCWVuZF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBlbmRfb2Zmc2V0KSArCisJCQkJcHJlYWxsb2NfYmxvY2tzOworCisJCQlhbGlnbiA9IHhmc19lb2ZfYWxpZ25tZW50KGlwLCAwKTsKKwkJCWlmIChhbGlnbikKKwkJCQllbmRfZnNiID0gcm91bmR1cF82NChlbmRfZnNiLCBhbGlnbik7CisKKwkJCWVuZF9mc2IgPSBtaW4oZW5kX2ZzYiwgbWF4Ynl0ZXNfZnNiKTsKKwkJCUFTU0VSVChlbmRfZnNiID4gb2Zmc2V0X2ZzYik7CisJCX0KKwl9CiAKIHJldHJ5OgotCWlmIChwcmVhbGxvYykgewotCQl4ZnNfZnNibG9ja190CWFsbG9jX2Jsb2NrczsKLQotCQlhbGxvY19ibG9ja3MgPSB4ZnNfaW9tYXBfcHJlYWxsb2Nfc2l6ZShtcCwgaXAsIG9mZnNldCwgaW1hcCwKLQkJCQkJCSAgICAgICBYRlNfV1JJVEVfSU1BUFMpOwotCi0JCWFsaWduZWRfb2Zmc2V0ID0gWEZTX1dSSVRFSU9fQUxJR04obXAsIChvZmZzZXQgKyBjb3VudCAtIDEpKTsKLQkJaW9hbGlnbiA9IFhGU19CX1RPX0ZTQlQobXAsIGFsaWduZWRfb2Zmc2V0KTsKLQkJbGFzdF9mc2IgPSBpb2FsaWduICsgYWxsb2NfYmxvY2tzOwotCX0gZWxzZSB7Ci0JCWxhc3RfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoKHhmc191ZnNpemVfdCkob2Zmc2V0ICsgY291bnQpKSk7Ci0JfQotCi0JaWYgKHByZWFsbG9jIHx8IGV4dHN6KSB7Ci0JCWVycm9yID0geGZzX2lvbWFwX2VvZl9hbGlnbl9sYXN0X2ZzYihtcCwgaXAsIGV4dHN6LCAmbGFzdF9mc2IpOwotCQlpZiAoZXJyb3IpCi0JCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHN1cmUgcHJlYWxsb2NhdGlvbiBkb2VzIG5vdCBjcmVhdGUgZXh0ZW50cyBiZXlvbmQgdGhlIHJhbmdlIHdlCi0JICogYWN0dWFsbHkgc3VwcG9ydCBpbiB0aGlzIGZpbGVzeXN0ZW0uCi0JICovCi0JaWYgKGxhc3RfZnNiID4gWEZTX0JfVE9fRlNCKG1wLCBtcC0+bV9zdXBlci0+c19tYXhieXRlcykpCi0JCWxhc3RfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCBtcC0+bV9zdXBlci0+c19tYXhieXRlcyk7Ci0KLQlBU1NFUlQobGFzdF9mc2IgPiBvZmZzZXRfZnNiKTsKLQotCW5pbWFwcyA9IFhGU19XUklURV9JTUFQUzsKLQllcnJvciA9IHhmc19ibWFwaV9kZWxheShpcCwgb2Zmc2V0X2ZzYiwgbGFzdF9mc2IgLSBvZmZzZXRfZnNiLAotCQkJCWltYXAsICZuaW1hcHMsIFhGU19CTUFQSV9FTlRJUkUpOworCWVycm9yID0geGZzX2JtYXBpX3Jlc2VydmVfZGVsYWxsb2MoaXAsIG9mZnNldF9mc2IsCisJCQllbmRfZnNiIC0gb2Zmc2V0X2ZzYiwgJmdvdCwKKwkJCSZwcmV2LCAmaWR4LCBlb2YpOwogCXN3aXRjaCAoZXJyb3IpIHsKIAljYXNlIDA6CisJCWJyZWFrOwogCWNhc2UgLUVOT1NQQzoKIAljYXNlIC1FRFFVT1Q6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQkvKgotCSAqIElmIGJtYXBpIHJldHVybmVkIHVzIG5vdGhpbmcsIHdlIGdvdCBlaXRoZXIgRU5PU1BDIG9yIEVEUVVPVC4gUmV0cnkKLQkgKiB3aXRob3V0IEVPRiBwcmVhbGxvY2F0aW9uLgotCSAqLwotCWlmIChuaW1hcHMgPT0gMCkgeworCQkvKiByZXRyeSB3aXRob3V0IGFueSBwcmVhbGxvY2F0aW9uICovCiAJCXRyYWNlX3hmc19kZWxhbGxvY19lbm9zcGMoaXAsIG9mZnNldCwgY291bnQpOwotCQlpZiAocHJlYWxsb2MpIHsKLQkJCXByZWFsbG9jID0gMDsKLQkJCWVycm9yID0gMDsKKwkJaWYgKGVuZF9mc2IgIT0gb3JpZ19lbmRfZnNiKSB7CisJCQllbmRfZnNiID0gb3JpZ19lbmRfZnNiOwogCQkJZ290byByZXRyeTsKIAkJfQotCQlyZXR1cm4gZXJyb3IgPyBlcnJvciA6IC1FTk9TUEM7CisJCS8qRkFMTFRIUlUqLworCWRlZmF1bHQ6CisJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKLQlpZiAoIShpbWFwWzBdLmJyX3N0YXJ0YmxvY2sgfHwgWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSkpCi0JCXJldHVybiB4ZnNfYWxlcnRfZnNibG9ja196ZXJvKGlwLCAmaW1hcFswXSk7Ci0KIAkvKgogCSAqIFRhZyB0aGUgaW5vZGUgYXMgc3BlY3VsYXRpdmVseSBwcmVhbGxvY2F0ZWQgc28gd2UgY2FuIHJlY2xhaW0gdGhpcwogCSAqIHNwYWNlIG9uIGRlbWFuZCwgaWYgbmVjZXNzYXJ5LgogCSAqLwotCWlmIChwcmVhbGxvYykKKwlpZiAoZW5kX2ZzYiAhPSBvcmlnX2VuZF9mc2IpCiAJCXhmc19pbm9kZV9zZXRfZW9mYmxvY2tzX3RhZyhpcCk7CiAKLQkqcmV0X2ltYXAgPSBpbWFwWzBdOwotCXJldHVybiAwOworCXRyYWNlX3hmc19pb21hcF9hbGxvYyhpcCwgb2Zmc2V0LCBjb3VudCwgMCwgJmdvdCk7Citkb25lOgorCWlmIChpc251bGxzdGFydGJsb2NrKGdvdC5icl9zdGFydGJsb2NrKSkKKwkJZ290LmJyX3N0YXJ0YmxvY2sgPSBERUxBWVNUQVJUQkxPQ0s7CisKKwlpZiAoIWdvdC5icl9zdGFydGJsb2NrKSB7CisJCWVycm9yID0geGZzX2FsZXJ0X2ZzYmxvY2tfemVybyhpcCwgJmdvdCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwl4ZnNfYm1idF90b19pb21hcChpcCwgaW9tYXAsICZnb3QpOworCitvdXRfdW5sb2NrOgorCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJcmV0dXJuIGVycm9yOwogfQogCiAvKgpAQCAtOTQ3LDM3ICs5MzQsMTMgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXZvaWQKLXhmc19ibWJ0X3RvX2lvbWFwKAotCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAotCXN0cnVjdCBpb21hcAkJKmlvbWFwLAotCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSppbWFwKQotewotCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7Ci0KLQlpZiAoaW1hcC0+YnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSykgewotCQlpb21hcC0+Ymxrbm8gPSBJT01BUF9OVUxMX0JMT0NLOwotCQlpb21hcC0+dHlwZSA9IElPTUFQX0hPTEU7Ci0JfSBlbHNlIGlmIChpbWFwLT5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSykgewotCQlpb21hcC0+Ymxrbm8gPSBJT01BUF9OVUxMX0JMT0NLOwotCQlpb21hcC0+dHlwZSA9IElPTUFQX0RFTEFMTE9DOwotCX0gZWxzZSB7Ci0JCWlvbWFwLT5ibGtubyA9IHhmc19mc2JfdG9fZGIoaXAsIGltYXAtPmJyX3N0YXJ0YmxvY2spOwotCQlpZiAoaW1hcC0+YnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4pCi0JCQlpb21hcC0+dHlwZSA9IElPTUFQX1VOV1JJVFRFTjsKLQkJZWxzZQotCQkJaW9tYXAtPnR5cGUgPSBJT01BUF9NQVBQRUQ7Ci0JfQotCWlvbWFwLT5vZmZzZXQgPSBYRlNfRlNCX1RPX0IobXAsIGltYXAtPmJyX3N0YXJ0b2ZmKTsKLQlpb21hcC0+bGVuZ3RoID0gWEZTX0ZTQl9UT19CKG1wLCBpbWFwLT5icl9ibG9ja2NvdW50KTsKLQlpb21hcC0+YmRldiA9IHhmc19maW5kX2JkZXZfZm9yX2lub2RlKFZGU19JKGlwKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpbWFwX25lZWRzX2FsbG9jKHN0cnVjdCB4ZnNfYm1idF9pcmVjICppbWFwLCBpbnQgbmltYXBzKQorc3RhdGljIGlubGluZSBib29sIGltYXBfbmVlZHNfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSwKKwkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKmltYXAsIGludCBuaW1hcHMpCiB7CiAJcmV0dXJuICFuaW1hcHMgfHwKIAkJaW1hcC0+YnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSyB8fAotCQlpbWFwLT5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSzsKKwkJaW1hcC0+YnJfc3RhcnRibG9jayA9PSBERUxBWVNUQVJUQkxPQ0sgfHwKKwkJKElTX0RBWChpbm9kZSkgJiYgSVNVTldSSVRURU4oaW1hcCkpOwogfQogCiBzdGF0aWMgaW50CkBAIC05OTMsMTEgKzk1NiwxOCBAQAogCXN0cnVjdCB4ZnNfYm1idF9pcmVjCWltYXA7CiAJeGZzX2ZpbGVvZmZfdAkJb2Zmc2V0X2ZzYiwgZW5kX2ZzYjsKIAlpbnQJCQluaW1hcHMgPSAxLCBlcnJvciA9IDA7CisJdW5zaWduZWQJCWxvY2ttb2RlOwogCiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQlyZXR1cm4gLUVJTzsKIAotCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCWlmICgoZmxhZ3MgJiBJT01BUF9XUklURSkgJiYKKwkgICAgIUlTX0RBWChpbm9kZSkgJiYgIXhmc19nZXRfZXh0c3pfaGludChpcCkpIHsKKwkJcmV0dXJuIHhmc19maWxlX2lvbWFwX2JlZ2luX2RlbGF5KGlub2RlLCBvZmZzZXQsIGxlbmd0aCwgZmxhZ3MsCisJCQkJaW9tYXApOworCX0KKworCWxvY2ttb2RlID0geGZzX2lsb2NrX2RhdGFfbWFwX3NoYXJlZChpcCk7CiAKIAlBU1NFUlQob2Zmc2V0IDw9IG1wLT5tX3N1cGVyLT5zX21heGJ5dGVzKTsKIAlpZiAoKHhmc19mc2l6ZV90KW9mZnNldCArIGxlbmd0aCA+IG1wLT5tX3N1cGVyLT5zX21heGJ5dGVzKQpAQCAtMTAwOCwxMSArOTc4LDExIEBACiAJZXJyb3IgPSB4ZnNfYm1hcGlfcmVhZChpcCwgb2Zmc2V0X2ZzYiwgZW5kX2ZzYiAtIG9mZnNldF9mc2IsICZpbWFwLAogCQkJICAgICAgICZuaW1hcHMsIFhGU19CTUFQSV9FTlRJUkUpOwogCWlmIChlcnJvcikgewotCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfaXVubG9jayhpcCwgbG9ja21vZGUpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JaWYgKChmbGFncyAmIElPTUFQX1dSSVRFKSAmJiBpbWFwX25lZWRzX2FsbG9jKCZpbWFwLCBuaW1hcHMpKSB7CisJaWYgKChmbGFncyAmIElPTUFQX1dSSVRFKSAmJiBpbWFwX25lZWRzX2FsbG9jKGlub2RlLCAmaW1hcCwgbmltYXBzKSkgewogCQkvKgogCQkgKiBXZSBjYXAgdGhlIG1heGltdW0gbGVuZ3RoIHdlIG1hcCBoZXJlIHRvIE1BWF9XUklURUJBQ0tfUEFHRVMKIAkJICogcGFnZXMgdG8ga2VlcCB0aGUgY2h1bmtzIG9mIHdvcmsgZG9uZSB3aGVyZSBzb21ld2hhdCBzeW1tZXRyaWMKQEAgLTEwMjQsMjcgKzk5NCwyMyBAQAogCQkgKiB0aGUgbG93ZXIgbGV2ZWwgZnVuY3Rpb25zIGFyZSB1cGRhdGVkLgogCQkgKi8KIAkJbGVuZ3RoID0gbWluX3QobG9mZl90LCBsZW5ndGgsIDEwMjQgKiBQQUdFX1NJWkUpOwotCQlpZiAoeGZzX2dldF9leHRzel9oaW50KGlwKSkgewotCQkJLyoKLQkJCSAqIHhmc19pb21hcF93cml0ZV9kaXJlY3QoKSBleHBlY3RzIHRoZSBzaGFyZWQgbG9jay4gSXQKLQkJCSAqIGlzIHVubG9ja2VkIG9uIHJldHVybi4KLQkJCSAqLwotCQkJeGZzX2lsb2NrX2RlbW90ZShpcCwgWEZTX0lMT0NLX0VYQ0wpOwotCQkJZXJyb3IgPSB4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0KGlwLCBvZmZzZXQsIGxlbmd0aCwgJmltYXAsCi0JCQkJCW5pbWFwcyk7Ci0JCX0gZWxzZSB7Ci0JCQllcnJvciA9IHhmc19pb21hcF93cml0ZV9kZWxheShpcCwgb2Zmc2V0LCBsZW5ndGgsICZpbWFwKTsKLQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JCX0KLQorCQkvKgorCQkgKiB4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0KCkgZXhwZWN0cyB0aGUgc2hhcmVkIGxvY2suIEl0CisJCSAqIGlzIHVubG9ja2VkIG9uIHJldHVybi4KKwkJICovCisJCWlmIChsb2NrbW9kZSA9PSBYRlNfSUxPQ0tfRVhDTCkKKwkJCXhmc19pbG9ja19kZW1vdGUoaXAsIGxvY2ttb2RlKTsKKwkJZXJyb3IgPSB4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0KGlwLCBvZmZzZXQsIGxlbmd0aCwgJmltYXAsCisJCQkJbmltYXBzKTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwogCisJCWlvbWFwLT5mbGFncyA9IElPTUFQX0ZfTkVXOwogCQl0cmFjZV94ZnNfaW9tYXBfYWxsb2MoaXAsIG9mZnNldCwgbGVuZ3RoLCAwLCAmaW1hcCk7CiAJfSBlbHNlIHsKIAkJQVNTRVJUKG5pbWFwcyk7CiAKLQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX2l1bmxvY2soaXAsIGxvY2ttb2RlKTsKIAkJdHJhY2VfeGZzX2lvbWFwX2ZvdW5kKGlwLCBvZmZzZXQsIGxlbmd0aCwgMCwgJmltYXApOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5oIGIvZnMveGZzL3hmc19pb21hcC5oCmluZGV4IGZiOGFjYTMuLjY0OThiZTQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfaW9tYXAuaAorKysgYi9mcy94ZnMveGZzX2lvbWFwLmgKQEAgLTI1LDggKzI1LDYgQEAKIAogaW50IHhmc19pb21hcF93cml0ZV9kaXJlY3Qoc3RydWN0IHhmc19pbm9kZSAqLCB4ZnNfb2ZmX3QsIHNpemVfdCwKIAkJCXN0cnVjdCB4ZnNfYm1idF9pcmVjICosIGludCk7Ci1pbnQgeGZzX2lvbWFwX3dyaXRlX2RlbGF5KHN0cnVjdCB4ZnNfaW5vZGUgKiwgeGZzX29mZl90LCBzaXplX3QsCi0JCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqKTsKIGludCB4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGUoc3RydWN0IHhmc19pbm9kZSAqLCB4ZnNfb2ZmX3QsCiAJCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqKTsKIGludCB4ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuKHN0cnVjdCB4ZnNfaW5vZGUgKiwgeGZzX29mZl90LCB4ZnNfb2ZmX3QpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2dfcHJpdi5oIGIvZnMveGZzL3hmc19sb2dfcHJpdi5oCmluZGV4IDc2NWYwODQuLjJiNmVlYzUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaAorKysgYi9mcy94ZnMveGZzX2xvZ19wcml2LmgKQEAgLTQxMyw3ICs0MTMsOCBAQAogCS8qIGxvZyByZWNvcmQgY3JjIGVycm9yIGluamVjdGlvbiBmYWN0b3IgKi8KIAl1aW50MzJfdAkJbF9iYWRjcmNfZmFjdG9yOwogI2VuZGlmCi0KKwkvKiBsb2cgcmVjb3ZlcnkgbHNuIHRyYWNraW5nIChmb3IgYnVmZmVyIHN1Ym1pc3Npb24gKi8KKwl4ZnNfbHNuX3QJCWxfcmVjb3ZlcnlfbHNuOwogfTsKIAogI2RlZmluZSBYTE9HX0JVRl9DQU5DRUxfQlVDS0VUKGxvZywgYmxrbm8pIFwKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwppbmRleCBlODYzOGZkLi44NDY0ODNkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZ19yZWNvdmVyLmMKKysrIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCkBAIC00NCw2ICs0NCw3IEBACiAjaW5jbHVkZSAieGZzX2Vycm9yLmgiCiAjaW5jbHVkZSAieGZzX2RpcjIuaCIKICNpbmNsdWRlICJ4ZnNfcm1hcF9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCiAKICNkZWZpbmUgQkxLX0FWRyhibGsxLCBibGsyKQkoKGJsazErYmxrMikgPj4gMSkKIApAQCAtMzgxLDYgKzM4MiwxNSBAQAogCQkJCQkJU0hVVERPV05fTUVUQV9JT19FUlJPUik7CiAJCX0KIAl9CisKKwkvKgorCSAqIE9uIHY1IHN1cGVycywgYSBibGkgY291bGQgYmUgYXR0YWNoZWQgdG8gdXBkYXRlIHRoZSBtZXRhZGF0YSBMU04uCisJICogQ2xlYW4gaXQgdXAuCisJICovCisJaWYgKGJwLT5iX2ZzcHJpdikKKwkJeGZzX2J1Zl9pdGVtX3JlbHNlKGJwKTsKKwlBU1NFUlQoYnAtPmJfZnNwcml2ID09IE5VTEwpOworCiAJYnAtPmJfaW9kb25lID0gTlVMTDsKIAl4ZnNfYnVmX2lvZW5kKGJwKTsKIH0KQEAgLTIzNjAsMTIgKzIzNzAsMTQgQEAKIHhsb2dfcmVjb3Zlcl92YWxpZGF0ZV9idWZfdHlwZSgKIAlzdHJ1Y3QgeGZzX21vdW50CSptcCwKIAlzdHJ1Y3QgeGZzX2J1ZgkJKmJwLAotCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZikKKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2YsCisJeGZzX2xzbl90CQljdXJyZW50X2xzbikKIHsKIAlzdHJ1Y3QgeGZzX2RhX2Jsa2luZm8JKmluZm8gPSBicC0+Yl9hZGRyOwogCV9fdWludDMyX3QJCW1hZ2ljMzI7CiAJX191aW50MTZfdAkJbWFnaWMxNjsKIAlfX3VpbnQxNl90CQltYWdpY2RhOworCWNoYXIJCQkqd2Fybm1zZyA9IE5VTEw7CiAKIAkvKgogCSAqIFdlIGNhbiBvbmx5IGRvIHBvc3QgcmVjb3ZlcnkgdmFsaWRhdGlvbiBvbiBpdGVtcyBvbiBDUkMgZW5hYmxlZApAQCAtMjQwNCwzMSArMjQxNiwyNyBAQAogCQkJYnAtPmJfb3BzID0gJnhmc19ybWFwYnRfYnVmX29wczsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJeGZzX3dhcm4obXAsICJCYWQgYnRyZWUgYmxvY2sgbWFnaWMhIik7Ci0JCQlBU1NFUlQoMCk7CisJCQl3YXJubXNnID0gIkJhZCBidHJlZSBibG9jayBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBYRlNfQkxGVF9BR0ZfQlVGOgogCQlpZiAobWFnaWMzMiAhPSBYRlNfQUdGX01BR0lDKSB7Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBBR0YgYmxvY2sgbWFnaWMhIik7Ci0JCQlBU1NFUlQoMCk7CisJCQl3YXJubXNnID0gIkJhZCBBR0YgYmxvY2sgbWFnaWMhIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJwLT5iX29wcyA9ICZ4ZnNfYWdmX2J1Zl9vcHM7CiAJCWJyZWFrOwogCWNhc2UgWEZTX0JMRlRfQUdGTF9CVUY6CiAJCWlmIChtYWdpYzMyICE9IFhGU19BR0ZMX01BR0lDKSB7Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBBR0ZMIGJsb2NrIG1hZ2ljISIpOwotCQkJQVNTRVJUKDApOworCQkJd2Fybm1zZyA9ICJCYWQgQUdGTCBibG9jayBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnAtPmJfb3BzID0gJnhmc19hZ2ZsX2J1Zl9vcHM7CiAJCWJyZWFrOwogCWNhc2UgWEZTX0JMRlRfQUdJX0JVRjoKIAkJaWYgKG1hZ2ljMzIgIT0gWEZTX0FHSV9NQUdJQykgewotCQkJeGZzX3dhcm4obXAsICJCYWQgQUdJIGJsb2NrIG1hZ2ljISIpOwotCQkJQVNTRVJUKDApOworCQkJd2Fybm1zZyA9ICJCYWQgQUdJIGJsb2NrIG1hZ2ljISI7CiAJCQlicmVhazsKIAkJfQogCQlicC0+Yl9vcHMgPSAmeGZzX2FnaV9idWZfb3BzOwpAQCAtMjQzOCw4ICsyNDQ2LDcgQEAKIAljYXNlIFhGU19CTEZUX0dEUVVPVF9CVUY6CiAjaWZkZWYgQ09ORklHX1hGU19RVU9UQQogCQlpZiAobWFnaWMxNiAhPSBYRlNfRFFVT1RfTUFHSUMpIHsKLQkJCXhmc193YXJuKG1wLCAiQmFkIERRVU9UIGJsb2NrIG1hZ2ljISIpOwotCQkJQVNTRVJUKDApOworCQkJd2Fybm1zZyA9ICJCYWQgRFFVT1QgYmxvY2sgbWFnaWMhIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJwLT5iX29wcyA9ICZ4ZnNfZHF1b3RfYnVmX29wczsKQEAgLTI0NTEsMTYgKzI0NTgsMTQgQEAKIAkJYnJlYWs7CiAJY2FzZSBYRlNfQkxGVF9ESU5PX0JVRjoKIAkJaWYgKG1hZ2ljMTYgIT0gWEZTX0RJTk9ERV9NQUdJQykgewotCQkJeGZzX3dhcm4obXAsICJCYWQgSU5PREUgYmxvY2sgbWFnaWMhIik7Ci0JCQlBU1NFUlQoMCk7CisJCQl3YXJubXNnID0gIkJhZCBJTk9ERSBibG9jayBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnAtPmJfb3BzID0gJnhmc19pbm9kZV9idWZfb3BzOwogCQlicmVhazsKIAljYXNlIFhGU19CTEZUX1NZTUxJTktfQlVGOgogCQlpZiAobWFnaWMzMiAhPSBYRlNfU1lNTElOS19NQUdJQykgewotCQkJeGZzX3dhcm4obXAsICJCYWQgc3ltbGluayBibG9jayBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIHN5bWxpbmsgYmxvY2sgbWFnaWMhIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJwLT5iX29wcyA9ICZ4ZnNfc3ltbGlua19idWZfb3BzOwpAQCAtMjQ2OCw4ICsyNDczLDcgQEAKIAljYXNlIFhGU19CTEZUX0RJUl9CTE9DS19CVUY6CiAJCWlmIChtYWdpYzMyICE9IFhGU19ESVIyX0JMT0NLX01BR0lDICYmCiAJCSAgICBtYWdpYzMyICE9IFhGU19ESVIzX0JMT0NLX01BR0lDKSB7Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBkaXIgYmxvY2sgbWFnaWMhIik7Ci0JCQlBU1NFUlQoMCk7CisJCQl3YXJubXNnID0gIkJhZCBkaXIgYmxvY2sgbWFnaWMhIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJwLT5iX29wcyA9ICZ4ZnNfZGlyM19ibG9ja19idWZfb3BzOwpAQCAtMjQ3Nyw4ICsyNDgxLDcgQEAKIAljYXNlIFhGU19CTEZUX0RJUl9EQVRBX0JVRjoKIAkJaWYgKG1hZ2ljMzIgIT0gWEZTX0RJUjJfREFUQV9NQUdJQyAmJgogCQkgICAgbWFnaWMzMiAhPSBYRlNfRElSM19EQVRBX01BR0lDKSB7Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBkaXIgZGF0YSBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIGRpciBkYXRhIG1hZ2ljISI7CiAJCQlicmVhazsKIAkJfQogCQlicC0+Yl9vcHMgPSAmeGZzX2RpcjNfZGF0YV9idWZfb3BzOwpAQCAtMjQ4Niw4ICsyNDg5LDcgQEAKIAljYXNlIFhGU19CTEZUX0RJUl9GUkVFX0JVRjoKIAkJaWYgKG1hZ2ljMzIgIT0gWEZTX0RJUjJfRlJFRV9NQUdJQyAmJgogCQkgICAgbWFnaWMzMiAhPSBYRlNfRElSM19GUkVFX01BR0lDKSB7Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBkaXIzIGZyZWUgbWFnaWMhIik7Ci0JCQlBU1NFUlQoMCk7CisJCQl3YXJubXNnID0gIkJhZCBkaXIzIGZyZWUgbWFnaWMhIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJwLT5iX29wcyA9ICZ4ZnNfZGlyM19mcmVlX2J1Zl9vcHM7CkBAIC0yNDk1LDggKzI0OTcsNyBAQAogCWNhc2UgWEZTX0JMRlRfRElSX0xFQUYxX0JVRjoKIAkJaWYgKG1hZ2ljZGEgIT0gWEZTX0RJUjJfTEVBRjFfTUFHSUMgJiYKIAkJICAgIG1hZ2ljZGEgIT0gWEZTX0RJUjNfTEVBRjFfTUFHSUMpIHsKLQkJCXhmc193YXJuKG1wLCAiQmFkIGRpciBsZWFmMSBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIGRpciBsZWFmMSBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnAtPmJfb3BzID0gJnhmc19kaXIzX2xlYWYxX2J1Zl9vcHM7CkBAIC0yNTA0LDggKzI1MDUsNyBAQAogCWNhc2UgWEZTX0JMRlRfRElSX0xFQUZOX0JVRjoKIAkJaWYgKG1hZ2ljZGEgIT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMgJiYKIAkJICAgIG1hZ2ljZGEgIT0gWEZTX0RJUjNfTEVBRk5fTUFHSUMpIHsKLQkJCXhmc193YXJuKG1wLCAiQmFkIGRpciBsZWFmbiBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIGRpciBsZWFmbiBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnAtPmJfb3BzID0gJnhmc19kaXIzX2xlYWZuX2J1Zl9vcHM7CkBAIC0yNTEzLDggKzI1MTMsNyBAQAogCWNhc2UgWEZTX0JMRlRfREFfTk9ERV9CVUY6CiAJCWlmIChtYWdpY2RhICE9IFhGU19EQV9OT0RFX01BR0lDICYmCiAJCSAgICBtYWdpY2RhICE9IFhGU19EQTNfTk9ERV9NQUdJQykgewotCQkJeGZzX3dhcm4obXAsICJCYWQgZGEgbm9kZSBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIGRhIG5vZGUgbWFnaWMhIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJwLT5iX29wcyA9ICZ4ZnNfZGEzX25vZGVfYnVmX29wczsKQEAgLTI1MjIsMjQgKzI1MjEsMjEgQEAKIAljYXNlIFhGU19CTEZUX0FUVFJfTEVBRl9CVUY6CiAJCWlmIChtYWdpY2RhICE9IFhGU19BVFRSX0xFQUZfTUFHSUMgJiYKIAkJICAgIG1hZ2ljZGEgIT0gWEZTX0FUVFIzX0xFQUZfTUFHSUMpIHsKLQkJCXhmc193YXJuKG1wLCAiQmFkIGF0dHIgbGVhZiBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIGF0dHIgbGVhZiBtYWdpYyEiOwogCQkJYnJlYWs7CiAJCX0KIAkJYnAtPmJfb3BzID0gJnhmc19hdHRyM19sZWFmX2J1Zl9vcHM7CiAJCWJyZWFrOwogCWNhc2UgWEZTX0JMRlRfQVRUUl9STVRfQlVGOgogCQlpZiAobWFnaWMzMiAhPSBYRlNfQVRUUjNfUk1UX01BR0lDKSB7Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBhdHRyIHJlbW90ZSBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIGF0dHIgcmVtb3RlIG1hZ2ljISI7CiAJCQlicmVhazsKIAkJfQogCQlicC0+Yl9vcHMgPSAmeGZzX2F0dHIzX3JtdF9idWZfb3BzOwogCQlicmVhazsKIAljYXNlIFhGU19CTEZUX1NCX0JVRjoKIAkJaWYgKG1hZ2ljMzIgIT0gWEZTX1NCX01BR0lDKSB7Ci0JCQl4ZnNfd2FybihtcCwgIkJhZCBTQiBibG9jayBtYWdpYyEiKTsKLQkJCUFTU0VSVCgwKTsKKwkJCXdhcm5tc2cgPSAiQmFkIFNCIGJsb2NrIG1hZ2ljISI7CiAJCQlicmVhazsKIAkJfQogCQlicC0+Yl9vcHMgPSAmeGZzX3NiX2J1Zl9vcHM7CkBAIC0yNTU2LDYgKzI1NTIsNDAgQEAKIAkJCSB4ZnNfYmxmdF9mcm9tX2ZsYWdzKGJ1Zl9mKSk7CiAJCWJyZWFrOwogCX0KKworCS8qCisJICogTm90aGluZyBlbHNlIHRvIGRvIGluIHRoZSBjYXNlIG9mIGEgTlVMTCBjdXJyZW50IExTTiBhcyB0aGlzIG1lYW5zCisJICogdGhlIGJ1ZmZlciBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZSBjaGFuZ2UgaW4gdGhlIGxvZyBhbmQgd2lsbCBiZQorCSAqIHNraXBwZWQuCisJICovCisJaWYgKGN1cnJlbnRfbHNuID09IE5VTExDT01NSVRMU04pCisJCXJldHVybjsKKworCWlmICh3YXJubXNnKSB7CisJCXhmc193YXJuKG1wLCB3YXJubXNnKTsKKwkJQVNTRVJUKDApOworCX0KKworCS8qCisJICogV2UgbXVzdCB1cGRhdGUgdGhlIG1ldGFkYXRhIExTTiBvZiB0aGUgYnVmZmVyIGFzIGl0IGlzIHdyaXR0ZW4gb3V0IHRvCisJICogZW5zdXJlIHRoYXQgb2xkZXIgdHJhbnNhY3Rpb25zIG5ldmVyIHJlcGxheSBvdmVyIHRoaXMgb25lIGFuZCBjb3JydXB0CisJICogdGhlIGJ1ZmZlci4gVGhpcyBjYW4gb2NjdXIgaWYgbG9nIHJlY292ZXJ5IGlzIGludGVycnVwdGVkIGF0IHNvbWUKKwkgKiBwb2ludCBhZnRlciB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBjb21wbGV0ZXMsIGF0IHdoaWNoIHBvaW50IGEKKwkgKiBzdWJzZXF1ZW50IG1vdW50IHN0YXJ0cyByZWNvdmVyeSBmcm9tIHRoZSBiZWdpbm5pbmcuCisJICoKKwkgKiBXcml0ZSB2ZXJpZmllcnMgdXBkYXRlIHRoZSBtZXRhZGF0YSBMU04gZnJvbSBsb2cgaXRlbXMgYXR0YWNoZWQgdG8KKwkgKiB0aGUgYnVmZmVyLiBUaGVyZWZvcmUsIGluaXRpYWxpemUgYSBibGkgcHVyZWx5IHRvIGNhcnJ5IHRoZSBMU04gdG8KKwkgKiB0aGUgdmVyaWZpZXIuIFdlJ2xsIGNsZWFuIGl0IHVwIGluIG91ciAtPmlvZG9uZSgpIGNhbGxiYWNrLgorCSAqLworCWlmIChicC0+Yl9vcHMpIHsKKwkJc3RydWN0IHhmc19idWZfbG9nX2l0ZW0JKmJpcDsKKworCQlBU1NFUlQoIWJwLT5iX2lvZG9uZSB8fCBicC0+Yl9pb2RvbmUgPT0geGxvZ19yZWNvdmVyX2lvZG9uZSk7CisJCWJwLT5iX2lvZG9uZSA9IHhsb2dfcmVjb3Zlcl9pb2RvbmU7CisJCXhmc19idWZfaXRlbV9pbml0KGJwLCBtcCk7CisJCWJpcCA9IGJwLT5iX2ZzcHJpdjsKKwkJYmlwLT5ibGlfaXRlbS5saV9sc24gPSBjdXJyZW50X2xzbjsKKwl9CiB9CiAKIC8qCkBAIC0yNTY5LDcgKzI1OTksOCBAQAogCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAogCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sCiAJc3RydWN0IHhmc19idWYJCSpicCwKLQl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2YpCisJeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mLAorCXhmc19sc25fdAkJY3VycmVudF9sc24pCiB7CiAJaW50CQkJaTsKIAlpbnQJCQliaXQ7CkBAIC0yNjQyLDcgKzI2NzMsNyBAQAogCS8qIFNob3VsZG4ndCBiZSBhbnkgbW9yZSByZWdpb25zICovCiAJQVNTRVJUKGkgPT0gaXRlbS0+cmlfdG90YWwpOwogCi0JeGxvZ19yZWNvdmVyX3ZhbGlkYXRlX2J1Zl90eXBlKG1wLCBicCwgYnVmX2YpOworCXhsb2dfcmVjb3Zlcl92YWxpZGF0ZV9idWZfdHlwZShtcCwgYnAsIGJ1Zl9mLCBjdXJyZW50X2xzbik7CiB9CiAKIC8qCkBAIC0yNjg1LDcgKzI3MTYsNyBAQAogCWlmIChsb2ctPmxfcXVvdGFvZmZzX2ZsYWcgJiB0eXBlKQogCQlyZXR1cm4gZmFsc2U7CiAKLQl4bG9nX3JlY292ZXJfZG9fcmVnX2J1ZmZlcihtcCwgaXRlbSwgYnAsIGJ1Zl9mKTsKKwl4bG9nX3JlY292ZXJfZG9fcmVnX2J1ZmZlcihtcCwgaXRlbSwgYnAsIGJ1Zl9mLCBOVUxMQ09NTUlUTFNOKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMjc3Myw3ICsyODA0LDggQEAKIAkgKi8KIAlsc24gPSB4bG9nX3JlY292ZXJfZ2V0X2J1Zl9sc24obXAsIGJwKTsKIAlpZiAobHNuICYmIGxzbiAhPSAtMSAmJiBYRlNfTFNOX0NNUChsc24sIGN1cnJlbnRfbHNuKSA+PSAwKSB7Ci0JCXhsb2dfcmVjb3Zlcl92YWxpZGF0ZV9idWZfdHlwZShtcCwgYnAsIGJ1Zl9mKTsKKwkJdHJhY2VfeGZzX2xvZ19yZWNvdmVyX2J1Zl9za2lwKGxvZywgYnVmX2YpOworCQl4bG9nX3JlY292ZXJfdmFsaWRhdGVfYnVmX3R5cGUobXAsIGJwLCBidWZfZiwgTlVMTENPTU1JVExTTik7CiAJCWdvdG8gb3V0X3JlbGVhc2U7CiAJfQogCkBAIC0yNzg5LDcgKzI4MjEsNyBAQAogCQlpZiAoIWRpcnR5KQogCQkJZ290byBvdXRfcmVsZWFzZTsKIAl9IGVsc2UgewotCQl4bG9nX3JlY292ZXJfZG9fcmVnX2J1ZmZlcihtcCwgaXRlbSwgYnAsIGJ1Zl9mKTsKKwkJeGxvZ19yZWNvdmVyX2RvX3JlZ19idWZmZXIobXAsIGl0ZW0sIGJwLCBidWZfZiwgY3VycmVudF9sc24pOwogCX0KIAogCS8qCkBAIC0zODQ2LDE0ICszODc4LDEzIEBACiB4bG9nX3JlY292ZXJfY29tbWl0X3RyYW5zKAogCXN0cnVjdCB4bG9nCQkqbG9nLAogCXN0cnVjdCB4bG9nX3JlY292ZXIJKnRyYW5zLAotCWludAkJCXBhc3MpCisJaW50CQkJcGFzcywKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpidWZmZXJfbGlzdCkKIHsKIAlpbnQJCQkJZXJyb3IgPSAwOwotCWludAkJCQllcnJvcjI7CiAJaW50CQkJCWl0ZW1zX3F1ZXVlZCA9IDA7CiAJc3RydWN0IHhsb2dfcmVjb3Zlcl9pdGVtCSppdGVtOwogCXN0cnVjdCB4bG9nX3JlY292ZXJfaXRlbQkqbmV4dDsKLQlMSVNUX0hFQUQJCQkoYnVmZmVyX2xpc3QpOwogCUxJU1RfSEVBRAkJCShyYV9saXN0KTsKIAlMSVNUX0hFQUQJCQkoZG9uZV9saXN0KTsKIApAQCAtMzg3Niw3ICszOTA3LDcgQEAKIAkJCWl0ZW1zX3F1ZXVlZCsrOwogCQkJaWYgKGl0ZW1zX3F1ZXVlZCA+PSBYTE9HX1JFQ09WRVJfQ09NTUlUX1FVRVVFX01BWCkgewogCQkJCWVycm9yID0geGxvZ19yZWNvdmVyX2l0ZW1zX3Bhc3MyKGxvZywgdHJhbnMsCi0JCQkJCQkmYnVmZmVyX2xpc3QsICZyYV9saXN0KTsKKwkJCQkJCWJ1ZmZlcl9saXN0LCAmcmFfbGlzdCk7CiAJCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZyYV9saXN0LCAmZG9uZV9saXN0KTsKIAkJCQlpdGVtc19xdWV1ZWQgPSAwOwogCQkJfQpAQCAtMzg5NCwxNSArMzkyNSwxNCBAQAogCWlmICghbGlzdF9lbXB0eSgmcmFfbGlzdCkpIHsKIAkJaWYgKCFlcnJvcikKIAkJCWVycm9yID0geGxvZ19yZWNvdmVyX2l0ZW1zX3Bhc3MyKGxvZywgdHJhbnMsCi0JCQkJCSZidWZmZXJfbGlzdCwgJnJhX2xpc3QpOworCQkJCQlidWZmZXJfbGlzdCwgJnJhX2xpc3QpOwogCQlsaXN0X3NwbGljZV90YWlsX2luaXQoJnJhX2xpc3QsICZkb25lX2xpc3QpOwogCX0KIAogCWlmICghbGlzdF9lbXB0eSgmZG9uZV9saXN0KSkKIAkJbGlzdF9zcGxpY2VfaW5pdCgmZG9uZV9saXN0LCAmdHJhbnMtPnJfaXRlbXEpOwogCi0JZXJyb3IyID0geGZzX2J1Zl9kZWx3cmlfc3VibWl0KCZidWZmZXJfbGlzdCk7Ci0JcmV0dXJuIGVycm9yID8gZXJyb3IgOiBlcnJvcjI7CisJcmV0dXJuIGVycm9yOwogfQogCiBTVEFUSUMgdm9pZApAQCAtNDA4NSw3ICs0MTE1LDggQEAKIAljaGFyCQkJKmRwLAogCXVuc2lnbmVkIGludAkJbGVuLAogCXVuc2lnbmVkIGludAkJZmxhZ3MsCi0JaW50CQkJcGFzcykKKwlpbnQJCQlwYXNzLAorCXN0cnVjdCBsaXN0X2hlYWQJKmJ1ZmZlcl9saXN0KQogewogCWludAkJCWVycm9yID0gMDsKIAlib29sCQkJZnJlZWl0ID0gZmFsc2U7CkBAIC00MTA5LDcgKzQxNDAsOCBAQAogCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9hZGRfdG9fY29udF90cmFucyhsb2csIHRyYW5zLCBkcCwgbGVuKTsKIAkJYnJlYWs7CiAJY2FzZSBYTE9HX0NPTU1JVF9UUkFOUzoKLQkJZXJyb3IgPSB4bG9nX3JlY292ZXJfY29tbWl0X3RyYW5zKGxvZywgdHJhbnMsIHBhc3MpOworCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9jb21taXRfdHJhbnMobG9nLCB0cmFucywgcGFzcywKKwkJCQkJCSAgYnVmZmVyX2xpc3QpOwogCQkvKiBzdWNjZXNzIG9yIGZhaWwsIHdlIGFyZSBub3cgZG9uZSB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uICovCiAJCWZyZWVpdCA9IHRydWU7CiAJCWJyZWFrOwpAQCAtNDE5MSwxMCArNDIyMywxMiBAQAogCXN0cnVjdCB4bG9nX29wX2hlYWRlcgkqb2hlYWQsCiAJY2hhcgkJCSpkcCwKIAljaGFyCQkJKmVuZCwKLQlpbnQJCQlwYXNzKQorCWludAkJCXBhc3MsCisJc3RydWN0IGxpc3RfaGVhZAkqYnVmZmVyX2xpc3QpCiB7CiAJc3RydWN0IHhsb2dfcmVjb3ZlcgkqdHJhbnM7CiAJdW5zaWduZWQgaW50CQlsZW47CisJaW50CQkJZXJyb3I7CiAKIAkvKiBEbyB3ZSB1bmRlcnN0YW5kIHdobyB3cm90ZSB0aGlzIG9wPyAqLwogCWlmIChvaGVhZC0+b2hfY2xpZW50aWQgIT0gWEZTX1RSQU5TQUNUSU9OICYmCkBAIC00MjIxLDggKzQyNTUsMzkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJLyoKKwkgKiBUaGUgcmVjb3ZlcmVkIGJ1ZmZlciBxdWV1ZSBpcyBkcmFpbmVkIG9ubHkgb25jZSB3ZSBrbm93IHRoYXQgYWxsCisJICogcmVjb3ZlcnkgaXRlbXMgZm9yIHRoZSBjdXJyZW50IExTTiBoYXZlIGJlZW4gcHJvY2Vzc2VkLiBUaGlzIGlzCisJICogcmVxdWlyZWQgYmVjYXVzZToKKwkgKgorCSAqIC0gQnVmZmVyIHdyaXRlIHN1Ym1pc3Npb24gdXBkYXRlcyB0aGUgbWV0YWRhdGEgTFNOIG9mIHRoZSBidWZmZXIuCisJICogLSBMb2cgcmVjb3Zlcnkgc2tpcHMgaXRlbXMgd2l0aCBhIG1ldGFkYXRhIExTTiA+PSB0aGUgY3VycmVudCBMU04gb2YKKwkgKiAgIHRoZSByZWNvdmVyeSBpdGVtLgorCSAqIC0gU2VwYXJhdGUgcmVjb3ZlcnkgaXRlbXMgYWdhaW5zdCB0aGUgc2FtZSBtZXRhZGF0YSBidWZmZXIgY2FuIHNoYXJlCisJICogICBhIGN1cnJlbnQgTFNOLiBJLmUuLCBjb25zaWRlciB0aGF0IHRoZSBMU04gb2YgYSByZWNvdmVyeSBpdGVtIGlzCisJICogICBkZWZpbmVkIGFzIHRoZSBzdGFydGluZyBMU04gb2YgdGhlIGZpcnN0IHJlY29yZCBpbiB3aGljaCBpdHMKKwkgKiAgIHRyYW5zYWN0aW9uIGFwcGVhcnMsIHRoYXQgYSByZWNvcmQgY2FuIGhvbGQgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLAorCSAqICAgYW5kL29yIHRoYXQgYSB0cmFuc2FjdGlvbiBjYW4gc3BhbiBtdWx0aXBsZSByZWNvcmRzLgorCSAqCisJICogSW4gb3RoZXIgd29yZHMsIHdlIGFyZSBhbGxvd2VkIHRvIHN1Ym1pdCBhIGJ1ZmZlciBmcm9tIGxvZyByZWNvdmVyeQorCSAqIG9uY2UgcGVyIGN1cnJlbnQgTFNOLiBPdGhlcndpc2UsIHdlIG1heSBpbmNvcnJlY3RseSBza2lwIHJlY292ZXJ5CisJICogaXRlbXMgYW5kIGNhdXNlIGNvcnJ1cHRpb24uCisJICoKKwkgKiBXZSBkb24ndCBrbm93IHVwIGZyb250IHdoZXRoZXIgYnVmZmVycyBhcmUgdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBwZXIKKwkgKiBMU04uIFRoZXJlZm9yZSwgdHJhY2sgdGhlIGN1cnJlbnQgTFNOIG9mIGVhY2ggY29tbWl0IGxvZyByZWNvcmQgYXMgaXQKKwkgKiBpcyBwcm9jZXNzZWQgYW5kIGRyYWluIHRoZSBxdWV1ZSB3aGVuIGl0IGNoYW5nZXMuIFVzZSBjb21taXQgcmVjb3JkcworCSAqIGJlY2F1c2UgdGhleSBhcmUgb3JkZXJlZCBjb3JyZWN0bHkgYnkgdGhlIGxvZ2dpbmcgY29kZS4KKwkgKi8KKwlpZiAobG9nLT5sX3JlY292ZXJ5X2xzbiAhPSB0cmFucy0+cl9sc24gJiYKKwkgICAgb2hlYWQtPm9oX2ZsYWdzICYgWExPR19DT01NSVRfVFJBTlMpIHsKKwkJZXJyb3IgPSB4ZnNfYnVmX2RlbHdyaV9zdWJtaXQoYnVmZmVyX2xpc3QpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCWxvZy0+bF9yZWNvdmVyeV9sc24gPSB0cmFucy0+cl9sc247CisJfQorCiAJcmV0dXJuIHhsb2dfcmVjb3ZlcnlfcHJvY2Vzc190cmFucyhsb2csIHRyYW5zLCBkcCwgbGVuLAotCQkJCQkgICBvaGVhZC0+b2hfZmxhZ3MsIHBhc3MpOworCQkJCQkgICBvaGVhZC0+b2hfZmxhZ3MsIHBhc3MsIGJ1ZmZlcl9saXN0KTsKIH0KIAogLyoKQEAgLTQyNDAsNyArNDMwNSw4IEBACiAJc3RydWN0IGhsaXN0X2hlYWQJcmhhc2hbXSwKIAlzdHJ1Y3QgeGxvZ19yZWNfaGVhZGVyCSpyaGVhZCwKIAljaGFyCQkJKmRwLAotCWludAkJCXBhc3MpCisJaW50CQkJcGFzcywKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpidWZmZXJfbGlzdCkKIHsKIAlzdHJ1Y3QgeGxvZ19vcF9oZWFkZXIJKm9oZWFkOwogCWNoYXIJCQkqZW5kOwpAQCAtNDI1NCw2ICs0MzIwLDcgQEAKIAlpZiAoeGxvZ19oZWFkZXJfY2hlY2tfcmVjb3Zlcihsb2ctPmxfbXAsIHJoZWFkKSkKIAkJcmV0dXJuIC1FSU87CiAKKwl0cmFjZV94ZnNfbG9nX3JlY292ZXJfcmVjb3JkKGxvZywgcmhlYWQsIHBhc3MpOwogCXdoaWxlICgoZHAgPCBlbmQpICYmIG51bV9sb2dvcHMpIHsKIAogCQlvaGVhZCA9IChzdHJ1Y3QgeGxvZ19vcF9oZWFkZXIgKilkcDsKQEAgLTQyNjIsNyArNDMyOSw3IEBACiAKIAkJLyogZXJyb3JzIHdpbGwgYWJvcnQgcmVjb3ZlcnkgKi8KIAkJZXJyb3IgPSB4bG9nX3JlY292ZXJfcHJvY2Vzc19vcGhkcihsb2csIHJoYXNoLCByaGVhZCwgb2hlYWQsCi0JCQkJCQkgICAgZHAsIGVuZCwgcGFzcyk7CisJCQkJCQkgICBkcCwgZW5kLCBwYXNzLCBidWZmZXJfbGlzdCk7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKIApAQCAtNDY4NSw3ICs0NzUyLDggQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZAlyaGFzaFtdLAogCXN0cnVjdCB4bG9nX3JlY19oZWFkZXIJKnJoZWFkLAogCWNoYXIJCQkqZHAsCi0JaW50CQkJcGFzcykKKwlpbnQJCQlwYXNzLAorCXN0cnVjdCBsaXN0X2hlYWQJKmJ1ZmZlcl9saXN0KQogewogCWludAkJCWVycm9yOwogCV9fbGUzMgkJCWNyYzsKQEAgLTQ3MzIsNyArNDgwMCw4IEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAKLQlyZXR1cm4geGxvZ19yZWNvdmVyX3Byb2Nlc3NfZGF0YShsb2csIHJoYXNoLCByaGVhZCwgZHAsIHBhc3MpOworCXJldHVybiB4bG9nX3JlY292ZXJfcHJvY2Vzc19kYXRhKGxvZywgcmhhc2gsIHJoZWFkLCBkcCwgcGFzcywKKwkJCQkJIGJ1ZmZlcl9saXN0KTsKIH0KIAogU1RBVElDIGludApAQCAtNDc5Myw5ICs0ODYyLDExIEBACiAJY2hhcgkJCSpvZmZzZXQ7CiAJeGZzX2J1Zl90CQkqaGJwLCAqZGJwOwogCWludAkJCWVycm9yID0gMCwgaF9zaXplLCBoX2xlbjsKKwlpbnQJCQllcnJvcjIgPSAwOwogCWludAkJCWJibGtzLCBzcGxpdF9iYmxrczsKIAlpbnQJCQloYmxrcywgc3BsaXRfaGJsa3MsIHdyYXBwZWRfaGJsa3M7CiAJc3RydWN0IGhsaXN0X2hlYWQJcmhhc2hbWExPR19SSEFTSF9TSVpFXTsKKwlMSVNUX0hFQUQJCShidWZmZXJfbGlzdCk7CiAKIAlBU1NFUlQoaGVhZF9ibGsgIT0gdGFpbF9ibGspOwogCXJoZWFkX2JsayA9IDA7CkBAIC00OTgxLDcgKzUwNTIsNyBAQAogCQkJfQogCiAJCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9wcm9jZXNzKGxvZywgcmhhc2gsIHJoZWFkLCBvZmZzZXQsCi0JCQkJCQkgICAgIHBhc3MpOworCQkJCQkJICAgICBwYXNzLCAmYnVmZmVyX2xpc3QpOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gYnJlYWRfZXJyMjsKIApAQCAtNTAxMiw3ICs1MDgzLDggQEAKIAkJaWYgKGVycm9yKQogCQkJZ290byBicmVhZF9lcnIyOwogCi0JCWVycm9yID0geGxvZ19yZWNvdmVyX3Byb2Nlc3MobG9nLCByaGFzaCwgcmhlYWQsIG9mZnNldCwgcGFzcyk7CisJCWVycm9yID0geGxvZ19yZWNvdmVyX3Byb2Nlc3MobG9nLCByaGFzaCwgcmhlYWQsIG9mZnNldCwgcGFzcywKKwkJCQkJICAgICAmYnVmZmVyX2xpc3QpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGJyZWFkX2VycjI7CiAKQEAgLTUwMjUsMTAgKzUwOTcsMTcgQEAKICBicmVhZF9lcnIxOgogCXhsb2dfcHV0X2JwKGhicCk7CiAKKwkvKgorCSAqIFN1Ym1pdCBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIGZyb20gdGhlIGxhc3QgcmVjb3JkIHByb2Nlc3NlZCwKKwkgKiByZWdhcmRsZXNzIG9mIGVycm9yIHN0YXR1cy4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmJ1ZmZlcl9saXN0KSkKKwkJZXJyb3IyID0geGZzX2J1Zl9kZWx3cmlfc3VibWl0KCZidWZmZXJfbGlzdCk7CisKIAlpZiAoZXJyb3IgJiYgZmlyc3RfYmFkKQogCQkqZmlyc3RfYmFkID0gcmhlYWRfYmxrOwogCi0JcmV0dXJuIGVycm9yOworCXJldHVybiBlcnJvciA/IGVycm9yIDogZXJyb3IyOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tb3VudC5jIGIvZnMveGZzL3hmc19tb3VudC5jCmluZGV4IGZhZWVhZDYuLjU2ZTg1YTYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfbW91bnQuYworKysgYi9mcy94ZnMveGZzX21vdW50LmMKQEAgLTkzNCw2ICs5MzQsMjAgQEAKIAl9CiAKIAkvKgorCSAqIE5vdyB0aGUgbG9nIGlzIGZ1bGx5IHJlcGxheWVkLCB3ZSBjYW4gdHJhbnNpdGlvbiB0byBmdWxsIHJlYWQtb25seQorCSAqIG1vZGUgZm9yIHJlYWQtb25seSBtb3VudHMuIFRoaXMgd2lsbCBzeW5jIGFsbCB0aGUgbWV0YWRhdGEgYW5kIGNsZWFuCisJICogdGhlIGxvZyBzbyB0aGF0IHRoZSByZWNvdmVyeSB3ZSBqdXN0IHBlcmZvcm1lZCBkb2VzIG5vdCBoYXZlIHRvIGJlCisJICogcmVwbGF5ZWQgYWdhaW4gb24gdGhlIG5leHQgbW91bnQuCisJICoKKwkgKiBXZSB1c2UgdGhlIHNhbWUgcXVpZXNjZSBtZWNoYW5pc20gYXMgdGhlIHJ3LT5ybyByZW1vdW50LCBhcyB0aGV5IGFyZQorCSAqIHNlbWFudGljYWxseSBpZGVudGljYWwgb3BlcmF0aW9ucy4KKwkgKi8KKwlpZiAoKG1wLT5tX2ZsYWdzICYgKFhGU19NT1VOVF9SRE9OTFl8WEZTX01PVU5UX05PUkVDT1ZFUlkpKSA9PQorCQkJCQkJCVhGU19NT1VOVF9SRE9OTFkpIHsKKwkJeGZzX3F1aWVzY2VfYXR0cihtcCk7CisJfQorCisJLyoKIAkgKiBDb21wbGV0ZSB0aGUgcXVvdGEgaW5pdGlhbGlzYXRpb24sIHBvc3QtbG9nLXJlcGxheSBjb21wb25lbnQuCiAJICovCiAJaWYgKHF1b3RhbW91bnQpIHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbW91bnQuaCBiL2ZzL3hmcy94ZnNfbW91bnQuaAppbmRleCBiMzY2NzZjLi4wNDFkOTQ5IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX21vdW50LmgKKysrIGIvZnMveGZzL3hmc19tb3VudC5oCkBAIC01NywxMCArNTcsMTYgQEAKIAogI2RlZmluZSBYRlNfRVJSX1JFVFJZX0ZPUkVWRVIJLTEKIAorLyoKKyAqIEFsdGhvdWdoIHJldHJ5X3RpbWVvdXQgaXMgaW4gamlmZmllcyB3aGljaCBpcyBub3JtYWxseSBhbiB1bnNpZ25lZCBsb25nLAorICogd2UgbGltaXQgdGhlIHJldHJ5IHRpbWVvdXQgdG8gODY0MDAgc2Vjb25kcywgb3Igb25lIGRheS4gIFNvIGV2ZW4gYQorICogc2lnbmVkIDMyLWJpdCBsb25nIGlzIHN1ZmZpY2llbnQgZm9yIGEgSFogdmFsdWUgdXAgdG8gMjQ4NTUuICBNYWtpbmcgaXQKKyAqIHNpZ25lZCBsZXRzIHVzIHN0b3JlIHRoZSBzcGVjaWFsICItMSIgdmFsdWUsIG1lYW5pbmcgcmV0cnkgZm9yZXZlci4KKyAqLwogc3RydWN0IHhmc19lcnJvcl9jZmcgewogCXN0cnVjdCB4ZnNfa29iaglrb2JqOwogCWludAkJbWF4X3JldHJpZXM7Ci0JdW5zaWduZWQgbG9uZwlyZXRyeV90aW1lb3V0OwkvKiBpbiBqaWZmaWVzLCAwID0gbm8gdGltZW91dCAqLworCWxvbmcJCXJldHJ5X3RpbWVvdXQ7CS8qIGluIGppZmZpZXMsIC0xID0gaW5maW5pdGUgKi8KIH07CiAKIHR5cGVkZWYgc3RydWN0IHhmc19tb3VudCB7CkBAIC0zMjUsNiArMzMxLDIyIEBACiB9CiAjZW5kaWYKIAorLyogcGVyLUFHIGJsb2NrIHJlc2VydmF0aW9uIGRhdGEgc3RydWN0dXJlcyovCitlbnVtIHhmc19hZ19yZXN2X3R5cGUgeworCVhGU19BR19SRVNWX05PTkUgPSAwLAorCVhGU19BR19SRVNWX01FVEFEQVRBLAorCVhGU19BR19SRVNWX0FHRkwsCit9OworCitzdHJ1Y3QgeGZzX2FnX3Jlc3YgeworCS8qIG51bWJlciBvZiBibG9ja3Mgb3JpZ2luYWxseSByZXNlcnZlZCBoZXJlICovCisJeGZzX2V4dGxlbl90CQkJYXJfb3JpZ19yZXNlcnZlZDsKKwkvKiBudW1iZXIgb2YgYmxvY2tzIHJlc2VydmVkIGhlcmUgKi8KKwl4ZnNfZXh0bGVuX3QJCQlhcl9yZXNlcnZlZDsKKwkvKiBudW1iZXIgb2YgYmxvY2tzIG9yaWdpbmFsbHkgYXNrZWQgZm9yICovCisJeGZzX2V4dGxlbl90CQkJYXJfYXNrZWQ7Cit9OworCiAvKgogICogUGVyLWFnIGluY29yZSBzdHJ1Y3R1cmUsIGNvcGllcyBvZiBpbmZvcm1hdGlvbiBpbiBhZ2YgYW5kIGFnaSwgdG8gaW1wcm92ZSB0aGUKICAqIHBlcmZvcm1hbmNlIG9mIGFsbG9jYXRpb24gZ3JvdXAgc2VsZWN0aW9uLgpAQCAtMzcyLDggKzM5NCwyOCBAQAogCS8qIGZvciByY3Utc2FmZSBmcmVlaW5nICovCiAJc3RydWN0IHJjdV9oZWFkCXJjdV9oZWFkOwogCWludAkJcGFnYl9jb3VudDsJLyogcGFnYiBzbG90cyBpbiB1c2UgKi8KKworCS8qIEJsb2NrcyByZXNlcnZlZCBmb3IgYWxsIGtpbmRzIG9mIG1ldGFkYXRhLiAqLworCXN0cnVjdCB4ZnNfYWdfcmVzdglwYWdfbWV0YV9yZXN2OworCS8qIEJsb2NrcyByZXNlcnZlZCBmb3IganVzdCBBR0ZMLWJhc2VkIG1ldGFkYXRhLiAqLworCXN0cnVjdCB4ZnNfYWdfcmVzdglwYWdfYWdmbF9yZXN2OwogfSB4ZnNfcGVyYWdfdDsKIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgeGZzX2FnX3Jlc3YgKgoreGZzX3BlcmFnX3Jlc3YoCisJc3RydWN0IHhmc19wZXJhZwkqcGFnLAorCWVudW0geGZzX2FnX3Jlc3ZfdHlwZQl0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgWEZTX0FHX1JFU1ZfTUVUQURBVEE6CisJCXJldHVybiAmcGFnLT5wYWdfbWV0YV9yZXN2OworCWNhc2UgWEZTX0FHX1JFU1ZfQUdGTDoKKwkJcmV0dXJuICZwYWctPnBhZ19hZ2ZsX3Jlc3Y7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCiBleHRlcm4gdm9pZAl4ZnNfdXVpZF90YWJsZV9mcmVlKHZvaWQpOwogZXh0ZXJuIGludAl4ZnNfbG9nX3NiY291bnQoeGZzX21vdW50X3QgKik7CiBleHRlcm4gX191aW50NjRfdCB4ZnNfZGVmYXVsdF9yZXNibGtzKHhmc19tb3VudF90ICptcCk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3JtYXBfaXRlbS5jIGIvZnMveGZzL3hmc19ybWFwX2l0ZW0uYwppbmRleCAyNTAwZjI4Li4wNDMyYTQ1IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3JtYXBfaXRlbS5jCisrKyBiL2ZzL3hmcy94ZnNfcm1hcF9pdGVtLmMKQEAgLTUxLDI4ICs1MSwxNiBAQAogCQlrbWVtX3pvbmVfZnJlZSh4ZnNfcnVpX3pvbmUsIHJ1aXApOwogfQogCi0vKgotICogVGhpcyByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW92ZWNzIG5lZWRlZCB0byBsb2cgdGhlIGdpdmVuIHJ1aSBpdGVtLgotICogV2Ugb25seSBuZWVkIDEgaW92ZWMgZm9yIGFuIHJ1aSBpdGVtLiAgSXQganVzdCBsb2dzIHRoZSBydWlfbG9nX2Zvcm1hdAotICogc3RydWN0dXJlLgotICovCi1zdGF0aWMgaW5saW5lIGludAoteGZzX3J1aV9pdGVtX3NpemVvZigKLQlzdHJ1Y3QgeGZzX3J1aV9sb2dfaXRlbSAqcnVpcCkKLXsKLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCB4ZnNfcnVpX2xvZ19mb3JtYXQpICsKLQkJCShydWlwLT5ydWlfZm9ybWF0LnJ1aV9uZXh0ZW50cyAtIDEpICoKLQkJCXNpemVvZihzdHJ1Y3QgeGZzX21hcF9leHRlbnQpOwotfQotCiBTVEFUSUMgdm9pZAogeGZzX3J1aV9pdGVtX3NpemUoCiAJc3RydWN0IHhmc19sb2dfaXRlbQkqbGlwLAogCWludAkJCSpudmVjcywKIAlpbnQJCQkqbmJ5dGVzKQogeworCXN0cnVjdCB4ZnNfcnVpX2xvZ19pdGVtCSpydWlwID0gUlVJX0lURU0obGlwKTsKKwogCSpudmVjcyArPSAxOwotCSpuYnl0ZXMgKz0geGZzX3J1aV9pdGVtX3NpemVvZihSVUlfSVRFTShsaXApKTsKKwkqbmJ5dGVzICs9IHhmc19ydWlfbG9nX2Zvcm1hdF9zaXplb2YocnVpcC0+cnVpX2Zvcm1hdC5ydWlfbmV4dGVudHMpOwogfQogCiAvKgpAQCAtOTcsNyArODUsNyBAQAogCXJ1aXAtPnJ1aV9mb3JtYXQucnVpX3NpemUgPSAxOwogCiAJeGxvZ19jb3B5X2lvdmVjKGx2LCAmdmVjcCwgWExPR19SRUdfVFlQRV9SVUlfRk9STUFULCAmcnVpcC0+cnVpX2Zvcm1hdCwKLQkJCXhmc19ydWlfaXRlbV9zaXplb2YocnVpcCkpOworCQkJeGZzX3J1aV9sb2dfZm9ybWF0X3NpemVvZihydWlwLT5ydWlfZm9ybWF0LnJ1aV9uZXh0ZW50cykpOwogfQogCiAvKgpAQCAtMjA1LDE2ICsxOTMsMTIgQEAKIAogewogCXN0cnVjdCB4ZnNfcnVpX2xvZ19pdGVtCQkqcnVpcDsKLQl1aW50CQkJCXNpemU7CiAKIAlBU1NFUlQobmV4dGVudHMgPiAwKTsKLQlpZiAobmV4dGVudHMgPiBYRlNfUlVJX01BWF9GQVNUX0VYVEVOVFMpIHsKLQkJc2l6ZSA9ICh1aW50KShzaXplb2Yoc3RydWN0IHhmc19ydWlfbG9nX2l0ZW0pICsKLQkJCSgobmV4dGVudHMgLSAxKSAqIHNpemVvZihzdHJ1Y3QgeGZzX21hcF9leHRlbnQpKSk7Ci0JCXJ1aXAgPSBrbWVtX3phbGxvYyhzaXplLCBLTV9TTEVFUCk7Ci0JfSBlbHNlIHsKKwlpZiAobmV4dGVudHMgPiBYRlNfUlVJX01BWF9GQVNUX0VYVEVOVFMpCisJCXJ1aXAgPSBrbWVtX3phbGxvYyh4ZnNfcnVpX2xvZ19pdGVtX3NpemVvZihuZXh0ZW50cyksIEtNX1NMRUVQKTsKKwllbHNlCiAJCXJ1aXAgPSBrbWVtX3pvbmVfemFsbG9jKHhmc19ydWlfem9uZSwgS01fU0xFRVApOwotCX0KIAogCXhmc19sb2dfaXRlbV9pbml0KG1wLCAmcnVpcC0+cnVpX2l0ZW0sIFhGU19MSV9SVUksICZ4ZnNfcnVpX2l0ZW1fb3BzKTsKIAlydWlwLT5ydWlfZm9ybWF0LnJ1aV9uZXh0ZW50cyA9IG5leHRlbnRzOwpAQCAtMjM5LDE0ICsyMjMsMTIgQEAKIAl1aW50CQkJCWxlbjsKIAogCXNyY19ydWlfZm10ID0gYnVmLT5pX2FkZHI7Ci0JbGVuID0gc2l6ZW9mKHN0cnVjdCB4ZnNfcnVpX2xvZ19mb3JtYXQpICsKLQkJCShzcmNfcnVpX2ZtdC0+cnVpX25leHRlbnRzIC0gMSkgKgotCQkJc2l6ZW9mKHN0cnVjdCB4ZnNfbWFwX2V4dGVudCk7CisJbGVuID0geGZzX3J1aV9sb2dfZm9ybWF0X3NpemVvZihzcmNfcnVpX2ZtdC0+cnVpX25leHRlbnRzKTsKIAogCWlmIChidWYtPmlfbGVuICE9IGxlbikKIAkJcmV0dXJuIC1FRlNDT1JSVVBURUQ7CiAKLQltZW1jcHkoKGNoYXIgKilkc3RfcnVpX2ZtdCwgKGNoYXIgKilzcmNfcnVpX2ZtdCwgbGVuKTsKKwltZW1jcHkoZHN0X3J1aV9mbXQsIHNyY19ydWlfZm10LCBsZW4pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3JtYXBfaXRlbS5oIGIvZnMveGZzL3hmc19ybWFwX2l0ZW0uaAppbmRleCBhZWZjYzNhLi4zNDBjOTY4IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3JtYXBfaXRlbS5oCisrKyBiL2ZzL3hmcy94ZnNfcm1hcF9pdGVtLmgKQEAgLTcwLDYgKzcwLDE0IEBACiAJc3RydWN0IHhmc19ydWlfbG9nX2Zvcm1hdAlydWlfZm9ybWF0OwogfTsKIAorc3RhdGljIGlubGluZSBzaXplX3QKK3hmc19ydWlfbG9nX2l0ZW1fc2l6ZW9mKAorCXVuc2lnbmVkIGludAkJbnIpCit7CisJcmV0dXJuIG9mZnNldG9mKHN0cnVjdCB4ZnNfcnVpX2xvZ19pdGVtLCBydWlfZm9ybWF0KSArCisJCQl4ZnNfcnVpX2xvZ19mb3JtYXRfc2l6ZW9mKG5yKTsKK30KKwogLyoKICAqIFRoaXMgaXMgdGhlICJybWFwIHVwZGF0ZSBkb25lIiBsb2cgaXRlbS4gIEl0IGlzIHVzZWQgdG8gbG9nIHRoZSBmYWN0IHRoYXQKICAqIHNvbWUgcm1hcGJ0IHVwZGF0ZXMgbWVudGlvbmVkIGluIGFuIGVhcmxpZXIgcnVpIGl0ZW0gaGF2ZSBiZWVuIHBlcmZvcm1lZC4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfc3VwZXIuYyBiL2ZzL3hmcy94ZnNfc3VwZXIuYwppbmRleCAyNGVmODNlLi4yZDA5MmY5IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3N1cGVyLmMKKysrIGIvZnMveGZzL3hmc19zdXBlci5jCkBAIC0xMTM3LDcgKzExMzcsNyBAQAogICogTm90ZTogeGZzX2xvZ19xdWllc2NlKCkgc3RvcHMgYmFja2dyb3VuZCBsb2cgd29yayAtIHRoZSBjYWxsZXJzIG11c3QgZW5zdXJlCiAgKiBpdCBpcyBzdGFydGVkIGFnYWluIHdoZW4gYXBwcm9wcmlhdGUuCiAgKi8KLXN0YXRpYyB2b2lkCit2b2lkCiB4ZnNfcXVpZXNjZV9hdHRyKAogCXN0cnVjdCB4ZnNfbW91bnQJKm1wKQogewpAQCAtMTU3NCw5ICsxNTc0LDE2IEBACiAJCX0KIAl9CiAKLQlpZiAoeGZzX3NiX3ZlcnNpb25faGFzcm1hcGJ0KCZtcC0+bV9zYikpCisJaWYgKHhmc19zYl92ZXJzaW9uX2hhc3JtYXBidCgmbXAtPm1fc2IpKSB7CisJCWlmIChtcC0+bV9zYi5zYl9yYmxvY2tzKSB7CisJCQl4ZnNfYWxlcnQobXAsCisJIkVYUEVSSU1FTlRBTCByZXZlcnNlIG1hcHBpbmcgYnRyZWUgbm90IGNvbXBhdGlibGUgd2l0aCByZWFsdGltZSBkZXZpY2UhIik7CisJCQllcnJvciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9maWxlc3RyZWFtX3VubW91bnQ7CisJCX0KIAkJeGZzX2FsZXJ0KG1wLAogCSJFWFBFUklNRU5UQUwgcmV2ZXJzZSBtYXBwaW5nIGJ0cmVlIGZlYXR1cmUgZW5hYmxlZC4gVXNlIGF0IHlvdXIgb3duIHJpc2shIik7CisJfQogCiAJZXJyb3IgPSB4ZnNfbW91bnRmcyhtcCk7CiAJaWYgKGVycm9yKQpAQCAtMTc3NSw5ICsxNzgyLDggQEAKIAlpZiAoIXhmc19ydWRfem9uZSkKIAkJZ290byBvdXRfZGVzdHJveV9pY3JlYXRlX3pvbmU7CiAKLQl4ZnNfcnVpX3pvbmUgPSBrbWVtX3pvbmVfaW5pdCgoc2l6ZW9mKHN0cnVjdCB4ZnNfcnVpX2xvZ19pdGVtKSArCi0JCQkoKFhGU19SVUlfTUFYX0ZBU1RfRVhURU5UUyAtIDEpICoKLQkJCQlzaXplb2Yoc3RydWN0IHhmc19tYXBfZXh0ZW50KSkpLAorCXhmc19ydWlfem9uZSA9IGttZW1fem9uZV9pbml0KAorCQkJeGZzX3J1aV9sb2dfaXRlbV9zaXplb2YoWEZTX1JVSV9NQVhfRkFTVF9FWFRFTlRTKSwKIAkJCSJ4ZnNfcnVpX2l0ZW0iKTsKIAlpZiAoIXhmc19ydWlfem9uZSkKIAkJZ290byBvdXRfZGVzdHJveV9ydWRfem9uZTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfc3VwZXIuaCBiL2ZzL3hmcy94ZnNfc3VwZXIuaAppbmRleCA1MjliY2U5Li5iNjQxOGFiIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3N1cGVyLmgKKysrIGIvZnMveGZzL3hmc19zdXBlci5oCkBAIC02MSw2ICs2MSw3IEBACiBzdHJ1Y3QgeGZzX2J1ZnRhcmc7CiBzdHJ1Y3QgYmxvY2tfZGV2aWNlOwogCitleHRlcm4gdm9pZCB4ZnNfcXVpZXNjZV9hdHRyKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKIGV4dGVybiB2b2lkIHhmc19mbHVzaF9pbm9kZXMoc3RydWN0IHhmc19tb3VudCAqbXApOwogZXh0ZXJuIHZvaWQgeGZzX2Jsa2Rldl9pc3N1ZV9mbHVzaChzdHJ1Y3QgeGZzX2J1ZnRhcmcgKik7CiBleHRlcm4geGZzX2FnbnVtYmVyX3QgeGZzX3NldF9pbm9kZV9hbGxvYyhzdHJ1Y3QgeGZzX21vdW50ICosCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3N5c2ZzLmMgYi9mcy94ZnMveGZzX3N5c2ZzLmMKaW5kZXggNzljZmQzZi4uNWY4ZDU1ZCAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19zeXNmcy5jCisrKyBiL2ZzL3hmcy94ZnNfc3lzZnMuYwpAQCAtMzkzLDkgKzM5MywxNSBAQAogCXN0cnVjdCBrb2JqZWN0CSprb2JqZWN0LAogCWNoYXIJCSpidWYpCiB7CisJaW50CQlyZXRyaWVzOwogCXN0cnVjdCB4ZnNfZXJyb3JfY2ZnICpjZmcgPSB0b19lcnJvcl9jZmcoa29iamVjdCk7CiAKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgY2ZnLT5tYXhfcmV0cmllcyk7CisJaWYgKGNmZy0+cmV0cnlfdGltZW91dCA9PSBYRlNfRVJSX1JFVFJZX0ZPUkVWRVIpCisJCXJldHJpZXMgPSAtMTsKKwllbHNlCisJCXJldHJpZXMgPSBjZmctPm1heF9yZXRyaWVzOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHJldHJpZXMpOwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtNDE1LDcgKzQyMSwxMCBAQAogCWlmICh2YWwgPCAtMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQljZmctPm1heF9yZXRyaWVzID0gdmFsOworCWlmICh2YWwgPT0gLTEpCisJCWNmZy0+cmV0cnlfdGltZW91dCA9IFhGU19FUlJfUkVUUllfRk9SRVZFUjsKKwllbHNlCisJCWNmZy0+bWF4X3JldHJpZXMgPSB2YWw7CiAJcmV0dXJuIGNvdW50OwogfQogWEZTX1NZU0ZTX0FUVFJfUlcobWF4X3JldHJpZXMpOwpAQCAtNDI1LDEwICs0MzQsMTUgQEAKIAlzdHJ1Y3Qga29iamVjdAkqa29iamVjdCwKIAljaGFyCQkqYnVmKQogeworCWludAkJdGltZW91dDsKIAlzdHJ1Y3QgeGZzX2Vycm9yX2NmZyAqY2ZnID0gdG9fZXJyb3JfY2ZnKGtvYmplY3QpOwogCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxkXG4iLAotCQkJamlmZmllc190b19tc2VjcyhjZmctPnJldHJ5X3RpbWVvdXQpIC8gTVNFQ19QRVJfU0VDKTsKKwlpZiAoY2ZnLT5yZXRyeV90aW1lb3V0ID09IFhGU19FUlJfUkVUUllfRk9SRVZFUikKKwkJdGltZW91dCA9IC0xOworCWVsc2UKKwkJdGltZW91dCA9IGppZmZpZXNfdG9fbXNlY3MoY2ZnLT5yZXRyeV90aW1lb3V0KSAvIE1TRUNfUEVSX1NFQzsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB0aW1lb3V0KTsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTQ0NSwxMSArNDU5LDE2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCS8qIDEgZGF5IHRpbWVvdXQgbWF4aW11bSAqLwotCWlmICh2YWwgPCAwIHx8IHZhbCA+IDg2NDAwKQorCS8qIDEgZGF5IHRpbWVvdXQgbWF4aW11bSwgLTEgbWVhbnMgaW5maW5pdGUgKi8KKwlpZiAodmFsIDwgLTEgfHwgdmFsID4gODY0MDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JY2ZnLT5yZXRyeV90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyh2YWwgKiBNU0VDX1BFUl9TRUMpOworCWlmICh2YWwgPT0gLTEpCisJCWNmZy0+cmV0cnlfdGltZW91dCA9IFhGU19FUlJfUkVUUllfRk9SRVZFUjsKKwllbHNlIHsKKwkJY2ZnLT5yZXRyeV90aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyh2YWwgKiBNU0VDX1BFUl9TRUMpOworCQlBU1NFUlQobXNlY3NfdG9famlmZmllcyh2YWwgKiBNU0VDX1BFUl9TRUMpIDwgTE9OR19NQVgpOworCX0KIAlyZXR1cm4gY291bnQ7CiB9CiBYRlNfU1lTRlNfQVRUUl9SVyhyZXRyeV90aW1lb3V0X3NlY29uZHMpOwpAQCAtNTE5LDE4ICs1MzgsMTkgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeGZzX2Vycm9yX2luaXQgeGZzX2Vycm9yX21ldGFfaW5pdFtYRlNfRVJSX0VSUk5PX01BWF0gPSB7CiAJeyAubmFtZSA9ICJkZWZhdWx0IiwKIAkgIC5tYXhfcmV0cmllcyA9IFhGU19FUlJfUkVUUllfRk9SRVZFUiwKLQkgIC5yZXRyeV90aW1lb3V0ID0gMCwKKwkgIC5yZXRyeV90aW1lb3V0ID0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSLAogCX0sCiAJeyAubmFtZSA9ICJFSU8iLAogCSAgLm1heF9yZXRyaWVzID0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSLAotCSAgLnJldHJ5X3RpbWVvdXQgPSAwLAorCSAgLnJldHJ5X3RpbWVvdXQgPSBYRlNfRVJSX1JFVFJZX0ZPUkVWRVIsCiAJfSwKIAl7IC5uYW1lID0gIkVOT1NQQyIsCiAJICAubWF4X3JldHJpZXMgPSBYRlNfRVJSX1JFVFJZX0ZPUkVWRVIsCi0JICAucmV0cnlfdGltZW91dCA9IDAsCisJICAucmV0cnlfdGltZW91dCA9IFhGU19FUlJfUkVUUllfRk9SRVZFUiwKIAl9LAogCXsgLm5hbWUgPSAiRU5PREVWIiwKLQkgIC5tYXhfcmV0cmllcyA9IDAsCisJICAubWF4X3JldHJpZXMgPSAwLAkvKiBXZSBjYW4ndCByZWNvdmVyIGZyb20gZGV2aWNlcyBkaXNhcHBlYXJpbmcgKi8KKwkgIC5yZXRyeV90aW1lb3V0ID0gMCwKIAl9LAogfTsKIApAQCAtNTYxLDcgKzU4MSwxMCBAQAogCQkJZ290byBvdXRfZXJyb3I7CiAKIAkJY2ZnLT5tYXhfcmV0cmllcyA9IGluaXRbaV0ubWF4X3JldHJpZXM7Ci0JCWNmZy0+cmV0cnlfdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoCisJCWlmIChpbml0W2ldLnJldHJ5X3RpbWVvdXQgPT0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSKQorCQkJY2ZnLT5yZXRyeV90aW1lb3V0ID0gWEZTX0VSUl9SRVRSWV9GT1JFVkVSOworCQllbHNlCisJCQljZmctPnJldHJ5X3RpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKAogCQkJCQlpbml0W2ldLnJldHJ5X3RpbWVvdXQgKiBNU0VDX1BFUl9TRUMpOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhY2UuaCBiL2ZzL3hmcy94ZnNfdHJhY2UuaAppbmRleCA3ZTg4YmVjLi4xNjA5M2M3IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYWNlLmgKKysrIGIvZnMveGZzL3hmc190cmFjZS5oCkBAIC0xMTcwLDcgKzExNzAsNiBAQAogREVGSU5FX1JXX0VWRU5UKHhmc19maWxlX2J1ZmZlcmVkX3dyaXRlKTsKIERFRklORV9SV19FVkVOVCh4ZnNfZmlsZV9kaXJlY3Rfd3JpdGUpOwogREVGSU5FX1JXX0VWRU5UKHhmc19maWxlX2RheF93cml0ZSk7Ci1ERUZJTkVfUldfRVZFTlQoeGZzX2ZpbGVfc3BsaWNlX3JlYWQpOwogCiBERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19wYWdlX2NsYXNzLAogCVRQX1BST1RPKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZiwKQEAgLTE1NzAsMTQgKzE1NjksMTUgQEAKIAogVFJBQ0VfRVZFTlQoeGZzX2ZyZWVfZXh0ZW50LAogCVRQX1BST1RPKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfYWdudW1iZXJfdCBhZ25vLCB4ZnNfYWdibG9ja190IGFnYm5vLAotCQkgeGZzX2V4dGxlbl90IGxlbiwgYm9vbCBpc2ZsLCBpbnQgaGF2ZWxlZnQsIGludCBoYXZlcmlnaHQpLAotCVRQX0FSR1MobXAsIGFnbm8sIGFnYm5vLCBsZW4sIGlzZmwsIGhhdmVsZWZ0LCBoYXZlcmlnaHQpLAorCQkgeGZzX2V4dGxlbl90IGxlbiwgZW51bSB4ZnNfYWdfcmVzdl90eXBlIHJlc3YsIGludCBoYXZlbGVmdCwKKwkJIGludCBoYXZlcmlnaHQpLAorCVRQX0FSR1MobXAsIGFnbm8sIGFnYm5vLCBsZW4sIHJlc3YsIGhhdmVsZWZ0LCBoYXZlcmlnaHQpLAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoZGV2X3QsIGRldikKIAkJX19maWVsZCh4ZnNfYWdudW1iZXJfdCwgYWdubykKIAkJX19maWVsZCh4ZnNfYWdibG9ja190LCBhZ2JubykKIAkJX19maWVsZCh4ZnNfZXh0bGVuX3QsIGxlbikKLQkJX19maWVsZChpbnQsIGlzZmwpCisJCV9fZmllbGQoaW50LCByZXN2KQogCQlfX2ZpZWxkKGludCwgaGF2ZWxlZnQpCiAJCV9fZmllbGQoaW50LCBoYXZlcmlnaHQpCiAJKSwKQEAgLTE1ODYsMTYgKzE1ODYsMTYgQEAKIAkJX19lbnRyeS0+YWdubyA9IGFnbm87CiAJCV9fZW50cnktPmFnYm5vID0gYWdibm87CiAJCV9fZW50cnktPmxlbiA9IGxlbjsKLQkJX19lbnRyeS0+aXNmbCA9IGlzZmw7CisJCV9fZW50cnktPnJlc3YgPSByZXN2OwogCQlfX2VudHJ5LT5oYXZlbGVmdCA9IGhhdmVsZWZ0OwogCQlfX2VudHJ5LT5oYXZlcmlnaHQgPSBoYXZlcmlnaHQ7CiAJKSwKLQlUUF9wcmludGsoImRldiAlZDolZCBhZ25vICV1IGFnYm5vICV1IGxlbiAldSBpc2ZsICVkICVzIiwKKwlUUF9wcmludGsoImRldiAlZDolZCBhZ25vICV1IGFnYm5vICV1IGxlbiAldSByZXN2ICVkICVzIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgIF9fZW50cnktPmFnbm8sCiAJCSAgX19lbnRyeS0+YWdibm8sCiAJCSAgX19lbnRyeS0+bGVuLAotCQkgIF9fZW50cnktPmlzZmwsCisJCSAgX19lbnRyeS0+cmVzdiwKIAkJICBfX2VudHJ5LT5oYXZlbGVmdCA/CiAJCQkoX19lbnRyeS0+aGF2ZXJpZ2h0ID8gImJvdGgiIDogImxlZnQiKSA6CiAJCQkoX19lbnRyeS0+aGF2ZXJpZ2h0ID8gInJpZ2h0IiA6ICJub25lIikpCkBAIC0xNjIyLDggKzE2MjIsOCBAQAogCQlfX2ZpZWxkKHNob3J0LCBvdHlwZSkKIAkJX19maWVsZChjaGFyLCB3YXNkZWwpCiAJCV9fZmllbGQoY2hhciwgd2FzZnJvbWZsKQotCQlfX2ZpZWxkKGNoYXIsIGlzZmwpCi0JCV9fZmllbGQoY2hhciwgdXNlcmRhdGEpCisJCV9fZmllbGQoaW50LCByZXN2KQorCQlfX2ZpZWxkKGludCwgZGF0YXR5cGUpCiAJCV9fZmllbGQoeGZzX2ZzYmxvY2tfdCwgZmlyc3RibG9jaykKIAkpLAogCVRQX2Zhc3RfYXNzaWduKApAQCAtMTY0MywxNCArMTY0MywxNCBAQAogCQlfX2VudHJ5LT5vdHlwZSA9IGFyZ3MtPm90eXBlOwogCQlfX2VudHJ5LT53YXNkZWwgPSBhcmdzLT53YXNkZWw7CiAJCV9fZW50cnktPndhc2Zyb21mbCA9IGFyZ3MtPndhc2Zyb21mbDsKLQkJX19lbnRyeS0+aXNmbCA9IGFyZ3MtPmlzZmw7Ci0JCV9fZW50cnktPnVzZXJkYXRhID0gYXJncy0+dXNlcmRhdGE7CisJCV9fZW50cnktPnJlc3YgPSBhcmdzLT5yZXN2OworCQlfX2VudHJ5LT5kYXRhdHlwZSA9IGFyZ3MtPmRhdGF0eXBlOwogCQlfX2VudHJ5LT5maXJzdGJsb2NrID0gYXJncy0+Zmlyc3RibG9jazsKIAkpLAogCVRQX3ByaW50aygiZGV2ICVkOiVkIGFnbm8gJXUgYWdibm8gJXUgbWlubGVuICV1IG1heGxlbiAldSBtb2QgJXUgIgogCQkgICJwcm9kICV1IG1pbmxlZnQgJXUgdG90YWwgJXUgYWxpZ25tZW50ICV1IG1pbmFsaWduc2xvcCAldSAiCi0JCSAgImxlbiAldSB0eXBlICVzIG90eXBlICVzIHdhc2RlbCAlZCB3YXNmcm9tZmwgJWQgaXNmbCAlZCAiCi0JCSAgInVzZXJkYXRhICVkIGZpcnN0YmxvY2sgMHglbGx4IiwKKwkJICAibGVuICV1IHR5cGUgJXMgb3R5cGUgJXMgd2FzZGVsICVkIHdhc2Zyb21mbCAlZCByZXN2ICVkICIKKwkJICAiZGF0YXR5cGUgMHgleCBmaXJzdGJsb2NrIDB4JWxseCIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICBfX2VudHJ5LT5hZ25vLAogCQkgIF9fZW50cnktPmFnYm5vLApAQCAtMTY2Nyw4ICsxNjY3LDggQEAKIAkJICBfX3ByaW50X3N5bWJvbGljKF9fZW50cnktPm90eXBlLCBYRlNfQUxMT0NfVFlQRVMpLAogCQkgIF9fZW50cnktPndhc2RlbCwKIAkJICBfX2VudHJ5LT53YXNmcm9tZmwsCi0JCSAgX19lbnRyeS0+aXNmbCwKLQkJICBfX2VudHJ5LT51c2VyZGF0YSwKKwkJICBfX2VudHJ5LT5yZXN2LAorCQkgIF9fZW50cnktPmRhdGF0eXBlLAogCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+Zmlyc3RibG9jaykKICkKIApAQCAtMTk4NCw2ICsxOTg0LDI5IEBACiBERUZJTkVfU1dBUEVYVF9FVkVOVCh4ZnNfc3dhcF9leHRlbnRfYmVmb3JlKTsKIERFRklORV9TV0FQRVhUX0VWRU5UKHhmc19zd2FwX2V4dGVudF9hZnRlcik7CiAKK1RSQUNFX0VWRU5UKHhmc19sb2dfcmVjb3Zlcl9yZWNvcmQsCisJVFBfUFJPVE8oc3RydWN0IHhsb2cgKmxvZywgc3RydWN0IHhsb2dfcmVjX2hlYWRlciAqcmhlYWQsIGludCBwYXNzKSwKKwlUUF9BUkdTKGxvZywgcmhlYWQsIHBhc3MpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoZGV2X3QsIGRldikKKwkJX19maWVsZCh4ZnNfbHNuX3QsIGxzbikKKwkJX19maWVsZChpbnQsIGxlbikKKwkJX19maWVsZChpbnQsIG51bV9sb2dvcHMpCisJCV9fZmllbGQoaW50LCBwYXNzKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldiA9IGxvZy0+bF9tcC0+bV9zdXBlci0+c19kZXY7CisJCV9fZW50cnktPmxzbiA9IGJlNjRfdG9fY3B1KHJoZWFkLT5oX2xzbik7CisJCV9fZW50cnktPmxlbiA9IGJlMzJfdG9fY3B1KHJoZWFkLT5oX2xlbik7CisJCV9fZW50cnktPm51bV9sb2dvcHMgPSBiZTMyX3RvX2NwdShyaGVhZC0+aF9udW1fbG9nb3BzKTsKKwkJX19lbnRyeS0+cGFzcyA9IHBhc3M7CisJKSwKKwlUUF9wcmludGsoImRldiAlZDolZCBsc24gMHglbGx4IGxlbiAweCV4IG51bV9sb2dvcHMgMHgleCBwYXNzICVkIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgIF9fZW50cnktPmxzbiwgX19lbnRyeS0+bGVuLCBfX2VudHJ5LT5udW1fbG9nb3BzLAorCQkgICBfX2VudHJ5LT5wYXNzKQorKQorCiBERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19sb2dfcmVjb3Zlcl9pdGVtX2NsYXNzLAogCVRQX1BST1RPKHN0cnVjdCB4bG9nICpsb2csIHN0cnVjdCB4bG9nX3JlY292ZXIgKnRyYW5zLAogCQlzdHJ1Y3QgeGxvZ19yZWNvdmVyX2l0ZW0gKml0ZW0sIGludCBwYXNzKSwKQEAgLTE5OTIsNiArMjAxNSw3IEBACiAJCV9fZmllbGQoZGV2X3QsIGRldikKIAkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBpdGVtKQogCQlfX2ZpZWxkKHhsb2dfdGlkX3QsIHRpZCkKKwkJX19maWVsZCh4ZnNfbHNuX3QsIGxzbikKIAkJX19maWVsZChpbnQsIHR5cGUpCiAJCV9fZmllbGQoaW50LCBwYXNzKQogCQlfX2ZpZWxkKGludCwgY291bnQpCkBAIC0yMDAxLDE1ICsyMDI1LDE3IEBACiAJCV9fZW50cnktPmRldiA9IGxvZy0+bF9tcC0+bV9zdXBlci0+c19kZXY7CiAJCV9fZW50cnktPml0ZW0gPSAodW5zaWduZWQgbG9uZylpdGVtOwogCQlfX2VudHJ5LT50aWQgPSB0cmFucy0+cl9sb2dfdGlkOworCQlfX2VudHJ5LT5sc24gPSB0cmFucy0+cl9sc247CiAJCV9fZW50cnktPnR5cGUgPSBJVEVNX1RZUEUoaXRlbSk7CiAJCV9fZW50cnktPnBhc3MgPSBwYXNzOwogCQlfX2VudHJ5LT5jb3VudCA9IGl0ZW0tPnJpX2NudDsKIAkJX19lbnRyeS0+dG90YWwgPSBpdGVtLT5yaV90b3RhbDsKIAkpLAotCVRQX3ByaW50aygiZGV2ICVkOiVkIHRyYW5zIDB4JXgsIHBhc3MgJWQsIGl0ZW0gMHglcCwgaXRlbSB0eXBlICVzICIKLQkJICAiaXRlbSByZWdpb24gY291bnQvdG90YWwgJWQvJWQiLAorCVRQX3ByaW50aygiZGV2ICVkOiVkIHRpZCAweCV4IGxzbiAweCVsbHgsIHBhc3MgJWQsIGl0ZW0gMHglcCwgIgorCQkgICJpdGVtIHR5cGUgJXMgaXRlbSByZWdpb24gY291bnQvdG90YWwgJWQvJWQiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgX19lbnRyeS0+dGlkLAorCQkgIF9fZW50cnktPmxzbiwKIAkJICBfX2VudHJ5LT5wYXNzLAogCQkgICh2b2lkICopX19lbnRyeS0+aXRlbSwKIAkJICBfX3ByaW50X3N5bWJvbGljKF9fZW50cnktPnR5cGUsIFhGU19MSV9UWVBFX0RFU0MpLApAQCAtMjA2OCw2ICsyMDk0LDcgQEAKIERFRklORV9MT0dfUkVDT1ZFUl9CVUZfSVRFTSh4ZnNfbG9nX3JlY292ZXJfYnVmX2NhbmNlbF9hZGQpOwogREVGSU5FX0xPR19SRUNPVkVSX0JVRl9JVEVNKHhmc19sb2dfcmVjb3Zlcl9idWZfY2FuY2VsX3JlZl9pbmMpOwogREVGSU5FX0xPR19SRUNPVkVSX0JVRl9JVEVNKHhmc19sb2dfcmVjb3Zlcl9idWZfcmVjb3Zlcik7CitERUZJTkVfTE9HX1JFQ09WRVJfQlVGX0lURU0oeGZzX2xvZ19yZWNvdmVyX2J1Zl9za2lwKTsKIERFRklORV9MT0dfUkVDT1ZFUl9CVUZfSVRFTSh4ZnNfbG9nX3JlY292ZXJfYnVmX2lub2RlX2J1Zik7CiBERUZJTkVfTE9HX1JFQ09WRVJfQlVGX0lURU0oeGZzX2xvZ19yZWNvdmVyX2J1Zl9yZWdfYnVmKTsKIERFRklORV9MT0dfUkVDT1ZFUl9CVUZfSVRFTSh4ZnNfbG9nX3JlY292ZXJfYnVmX2RxdW90X2J1Zik7CkBAIC0yMjk1LDcgKzIzMjIsNyBAQAogCQlfX2VudHJ5LT5kZXYgPSBtcCA/IG1wLT5tX3N1cGVyLT5zX2RldiA6IDA7CiAJCV9fZW50cnktPnR5cGUgPSBkZnAtPmRmcF90eXBlLT50eXBlOwogCQlfX2VudHJ5LT5pbnRlbnQgPSBkZnAtPmRmcF9pbnRlbnQ7Ci0JCV9fZW50cnktPmNvbW1pdHRlZCA9IGRmcC0+ZGZwX2NvbW1pdHRlZDsKKwkJX19lbnRyeS0+Y29tbWl0dGVkID0gZGZwLT5kZnBfZG9uZSAhPSBOVUxMOwogCQlfX2VudHJ5LT5uciA9IGRmcC0+ZGZwX2NvdW50OwogCSksCiAJVFBfcHJpbnRrKCJkZXYgJWQ6JWQgb3B0eXBlICVkIGludGVudCAlcCBjb21taXR0ZWQgJWQgbnIgJWRcbiIsCkBAIC0yNTU4LDYgKzI1ODUsNjAgQEAKIERFRklORV9STUFQQlRfRVZFTlQoeGZzX3JtYXBfZmluZF9yaWdodF9uZWlnaGJvcl9yZXN1bHQpOwogREVGSU5FX1JNQVBCVF9FVkVOVCh4ZnNfcm1hcF9maW5kX2xlZnRfbmVpZ2hib3JfcmVzdWx0KTsKIAorLyogcGVyLUFHIHJlc2VydmF0aW9uICovCitERUNMQVJFX0VWRU5UX0NMQVNTKHhmc19hZ19yZXN2X2NsYXNzLAorCVRQX1BST1RPKHN0cnVjdCB4ZnNfcGVyYWcgKnBhZywgZW51bSB4ZnNfYWdfcmVzdl90eXBlIHJlc3YsCisJCSB4ZnNfZXh0bGVuX3QgbGVuKSwKKwlUUF9BUkdTKHBhZywgcmVzdiwgbGVuKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKGRldl90LCBkZXYpCisJCV9fZmllbGQoeGZzX2FnbnVtYmVyX3QsIGFnbm8pCisJCV9fZmllbGQoaW50LCByZXN2KQorCQlfX2ZpZWxkKHhmc19leHRsZW5fdCwgZnJlZWJsa3MpCisJCV9fZmllbGQoeGZzX2V4dGxlbl90LCBmbGNvdW50KQorCQlfX2ZpZWxkKHhmc19leHRsZW5fdCwgcmVzZXJ2ZWQpCisJCV9fZmllbGQoeGZzX2V4dGxlbl90LCBhc2tlZCkKKwkJX19maWVsZCh4ZnNfZXh0bGVuX3QsIGxlbikKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlzdHJ1Y3QgeGZzX2FnX3Jlc3YJKnIgPSB4ZnNfcGVyYWdfcmVzdihwYWcsIHJlc3YpOworCisJCV9fZW50cnktPmRldiA9IHBhZy0+cGFnX21vdW50LT5tX3N1cGVyLT5zX2RldjsKKwkJX19lbnRyeS0+YWdubyA9IHBhZy0+cGFnX2Fnbm87CisJCV9fZW50cnktPnJlc3YgPSByZXN2OworCQlfX2VudHJ5LT5mcmVlYmxrcyA9IHBhZy0+cGFnZl9mcmVlYmxrczsKKwkJX19lbnRyeS0+Zmxjb3VudCA9IHBhZy0+cGFnZl9mbGNvdW50OworCQlfX2VudHJ5LT5yZXNlcnZlZCA9IHIgPyByLT5hcl9yZXNlcnZlZCA6IDA7CisJCV9fZW50cnktPmFza2VkID0gciA/IHItPmFyX2Fza2VkIDogMDsKKwkJX19lbnRyeS0+bGVuID0gbGVuOworCSksCisJVFBfcHJpbnRrKCJkZXYgJWQ6JWQgYWdubyAldSByZXN2ICVkIGZyZWVibGtzICV1IGZsY291bnQgJXUgcmVzdiAldSBhc2sgJXUgbGVuICV1XG4iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+YWdubywKKwkJICBfX2VudHJ5LT5yZXN2LAorCQkgIF9fZW50cnktPmZyZWVibGtzLAorCQkgIF9fZW50cnktPmZsY291bnQsCisJCSAgX19lbnRyeS0+cmVzZXJ2ZWQsCisJCSAgX19lbnRyeS0+YXNrZWQsCisJCSAgX19lbnRyeS0+bGVuKQorKQorI2RlZmluZSBERUZJTkVfQUdfUkVTVl9FVkVOVChuYW1lKSBcCitERUZJTkVfRVZFTlQoeGZzX2FnX3Jlc3ZfY2xhc3MsIG5hbWUsIFwKKwlUUF9QUk9UTyhzdHJ1Y3QgeGZzX3BlcmFnICpwYWcsIGVudW0geGZzX2FnX3Jlc3ZfdHlwZSB0eXBlLCBcCisJCSB4ZnNfZXh0bGVuX3QgbGVuKSwgXAorCVRQX0FSR1MocGFnLCB0eXBlLCBsZW4pKQorCisvKiBwZXItQUcgcmVzZXJ2YXRpb24gdHJhY2Vwb2ludHMgKi8KK0RFRklORV9BR19SRVNWX0VWRU5UKHhmc19hZ19yZXN2X2luaXQpOworREVGSU5FX0FHX1JFU1ZfRVZFTlQoeGZzX2FnX3Jlc3ZfZnJlZSk7CitERUZJTkVfQUdfUkVTVl9FVkVOVCh4ZnNfYWdfcmVzdl9hbGxvY19leHRlbnQpOworREVGSU5FX0FHX1JFU1ZfRVZFTlQoeGZzX2FnX3Jlc3ZfZnJlZV9leHRlbnQpOworREVGSU5FX0FHX1JFU1ZfRVZFTlQoeGZzX2FnX3Jlc3ZfY3JpdGljYWwpOworREVGSU5FX0FHX1JFU1ZfRVZFTlQoeGZzX2FnX3Jlc3ZfbmVlZGVkKTsKKworREVGSU5FX0FHX0VSUk9SX0VWRU5UKHhmc19hZ19yZXN2X2ZyZWVfZXJyb3IpOworREVGSU5FX0FHX0VSUk9SX0VWRU5UKHhmc19hZ19yZXN2X2luaXRfZXJyb3IpOworCiAjZW5kaWYgLyogX1RSQUNFX1hGU19IICovCiAKICN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnMuYyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwppbmRleCA1ZjNkMzNkLi43MGY0MmVhIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX3RyYW5zLmMKKysrIGIvZnMveGZzL3hmc190cmFucy5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIAogdW5kb19ibG9ja3M6CiAJaWYgKGJsb2NrcyA+IDApIHsKLQkJeGZzX21vZF9mZGJsb2Nrcyh0cC0+dF9tb3VudHAsIC0oKGludDY0X3QpYmxvY2tzKSwgcnN2ZCk7CisJCXhmc19tb2RfZmRibG9ja3ModHAtPnRfbW91bnRwLCAoaW50NjRfdClibG9ja3MsIHJzdmQpOwogCQl0cC0+dF9ibGtfcmVzID0gMDsKIAl9CiAKQEAgLTMxOCw3ICszMTgsNiBAQAogCQkgKiBpbi1jb3JlIHN1cGVyYmxvY2sncyBjb3VudGVyLiAgVGhpcyBzaG91bGQgb25seQogCQkgKiBiZSBhcHBsaWVkIHRvIHRoZSBvbi1kaXNrIHN1cGVyYmxvY2suCiAJCSAqLwotCQlBU1NFUlQoZGVsdGEgPCAwKTsKIAkJdHAtPnRfcmVzX2ZkYmxvY2tzX2RlbHRhICs9IGRlbHRhOwogCQlpZiAoeGZzX3NiX3ZlcnNpb25faGFzbGF6eXNiY291bnQoJm1wLT5tX3NiKSkKIAkJCWZsYWdzICY9IH5YRlNfVFJBTlNfU0JfRElSVFk7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX2V4dGZyZWUuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfZXh0ZnJlZS5jCmluZGV4IDQ1OWRkZWMuLmFiNDM4NjQgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhbnNfZXh0ZnJlZS5jCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfZXh0ZnJlZS5jCkBAIC03OSw3ICs3OSw4IEBACiAKIAl0cmFjZV94ZnNfYm1hcF9mcmVlX2RlZmVycmVkKHRwLT50X21vdW50cCwgYWdubywgMCwgYWdibm8sIGV4dF9sZW4pOwogCi0JZXJyb3IgPSB4ZnNfZnJlZV9leHRlbnQodHAsIHN0YXJ0X2Jsb2NrLCBleHRfbGVuLCBvaW5mbyk7CisJZXJyb3IgPSB4ZnNfZnJlZV9leHRlbnQodHAsIHN0YXJ0X2Jsb2NrLCBleHRfbGVuLCBvaW5mbywKKwkJCVhGU19BR19SRVNWX05PTkUpOwogCiAJLyoKIAkgKiBNYXJrIHRoZSB0cmFuc2FjdGlvbiBkaXJ0eSwgZXZlbiBvbiBlcnJvci4gVGhpcyBlbnN1cmVzIHRoZQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc194YXR0ci5jIGIvZnMveGZzL3hmc194YXR0ci5jCmluZGV4IGVhNjIyNDUuLjYyOTAwOTMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfeGF0dHIuYworKysgYi9mcy94ZnMveGZzX3hhdHRyLmMKQEAgLTE0Nyw2ICsxNDcsNyBAQAogCWFycmF5dG9wID0gY29udGV4dC0+Y291bnQgKyBwcmVmaXhfbGVuICsgbmFtZWxlbiArIDE7CiAJaWYgKGFycmF5dG9wID4gY29udGV4dC0+Zmlyc3R1KSB7CiAJCWNvbnRleHQtPmNvdW50ID0gLTE7CS8qIGluc3VmZmljaWVudCBzcGFjZSAqLworCQljb250ZXh0LT5zZWVuX2Vub3VnaCA9IDE7CiAJCXJldHVybiAwOwogCX0KIAlvZmZzZXQgPSAoY2hhciAqKWNvbnRleHQtPmFsaXN0ICsgY29udGV4dC0+Y291bnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNjb25maWcuaCBiL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oCmluZGV4IGZlMmUzYWMuLjEyYzI4ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oCkBAIC0xNDQsNiArMTQ0LDEwIEBACiAKICNkZWZpbmUgQUNQSV9BRERSRVNTX1JBTkdFX01BWCAgICAgICAgICAyCiAKKy8qIE1heGltdW0gbnVtYmVyIG9mIFdoaWxlKCkgbG9vcHMgYmVmb3JlIGFib3J0ICovCisKKyNkZWZpbmUgQUNQSV9NQVhfTE9PUF9DT1VOVCAgICAgICAgICAgICAweEZGRkYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEFDUEkgU3BlY2lmaWNhdGlvbiBjb25zdGFudHMgKERvIG5vdCBjaGFuZ2UgdW5sZXNzIHRoZSBzcGVjaWZpY2F0aW9uIGNoYW5nZXMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaCBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCmluZGV4IDM0ZjYwMWUuLjQ4ZWI0ZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCkBAIC0zNjYsNyArMzY2LDcgQEAKIAlBQ1BJX1RSQUNFX0VOVFJZIChuYW1lLCBhY3BpX3V0X3RyYWNlX3UzMiwgdTMyLCB2YWx1ZSkKIAogI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihuYW1lLCBzdHJpbmcpIFwKLQlBQ1BJX1RSQUNFX0VOVFJZIChuYW1lLCBhY3BpX3V0X3RyYWNlX3N0ciwgY2hhciAqLCBzdHJpbmcpCisJQUNQSV9UUkFDRV9FTlRSWSAobmFtZSwgYWNwaV91dF90cmFjZV9zdHIsIGNvbnN0IGNoYXIgKiwgc3RyaW5nKQogCiAjZGVmaW5lIEFDUElfRlVOQ1RJT05fRU5UUlkoKSBcCiAJYWNwaV91dF90cmFja19zdGFja19wdHIoKQpAQCAtNDI1LDYgKzQyNSw5IEBACiAjZGVmaW5lIHJldHVybl9QVFIocG9pbnRlcikgXAogCUFDUElfVFJBQ0VfRVhJVCAoYWNwaV91dF9wdHJfZXhpdCwgdm9pZCAqLCBwb2ludGVyKQogCisjZGVmaW5lIHJldHVybl9TVFIoc3RyaW5nKSBcCisJQUNQSV9UUkFDRV9FWElUIChhY3BpX3V0X3N0cl9leGl0LCBjb25zdCBjaGFyICosIHN0cmluZykKKwogI2RlZmluZSByZXR1cm5fVkFMVUUodmFsdWUpIFwKIAlBQ1BJX1RSQUNFX0VYSVQgKGFjcGlfdXRfdmFsdWVfZXhpdCwgdTY0LCB2YWx1ZSkKIApAQCAtNDc4LDYgKzQ4MSw3IEBACiAjZGVmaW5lIHJldHVybl9WT0lEICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAjZGVmaW5lIHJldHVybl9BQ1BJX1NUQVRVUyhzKSAgICAgICAgICAgcmV0dXJuKHMpCiAjZGVmaW5lIHJldHVybl9QVFIocykgICAgICAgICAgICAgICAgICAgcmV0dXJuKHMpCisjZGVmaW5lIHJldHVybl9TVFIocykgICAgICAgICAgICAgICAgICAgcmV0dXJuKHMpCiAjZGVmaW5lIHJldHVybl9WQUxVRShzKSAgICAgICAgICAgICAgICAgcmV0dXJuKHMpCiAjZGVmaW5lIHJldHVybl9VSU5UOChzKSAgICAgICAgICAgICAgICAgcmV0dXJuKHMpCiAjZGVmaW5lIHJldHVybl9VSU5UMzIocykgICAgICAgICAgICAgICAgcmV0dXJuKHMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCmluZGV4IDU2MjYwM2QuLmYzNDE0YzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCkBAIC0zNzEsNiArMzcxLDEyIEBACiBhY3BpX3N0YXR1cyBhY3BpX29zX25vdGlmeV9jb21tYW5kX2NvbXBsZXRlKHZvaWQpOwogI2VuZGlmCiAKKyNpZm5kZWYgQUNQSV9VU0VfQUxURVJOQVRFX1BST1RPVFlQRV9hY3BpX29zX3RyYWNlX3BvaW50Cit2b2lkCithY3BpX29zX3RyYWNlX3BvaW50KGFjcGlfdHJhY2VfZXZlbnRfdHlwZSB0eXBlLAorCQkgICAgdTggYmVnaW4sIHU4ICphbWwsIGNoYXIgKnBhdGhuYW1lKTsKKyNlbmRpZgorCiAvKgogICogT2J0YWluIEFDUEkgdGFibGUocykKICAqLwpAQCAtNDE2LDQxICs0MjIsNCBAQAogdm9pZCBhY3BpX29zX2Nsb3NlX2RpcmVjdG9yeSh2b2lkICpkaXJfaGFuZGxlKTsKICNlbmRpZgogCi0vKgotICogRmlsZSBJL08gYW5kIHJlbGF0ZWQgc3VwcG9ydAotICovCi0jaWZuZGVmIEFDUElfVVNFX0FMVEVSTkFURV9QUk9UT1RZUEVfYWNwaV9vc19vcGVuX2ZpbGUKLUFDUElfRklMRSBhY3BpX29zX29wZW5fZmlsZShjb25zdCBjaGFyICpwYXRoLCB1OCBtb2Rlcyk7Ci0jZW5kaWYKLQotI2lmbmRlZiBBQ1BJX1VTRV9BTFRFUk5BVEVfUFJPVE9UWVBFX2FjcGlfb3NfY2xvc2VfZmlsZQotdm9pZCBhY3BpX29zX2Nsb3NlX2ZpbGUoQUNQSV9GSUxFIGZpbGUpOwotI2VuZGlmCi0KLSNpZm5kZWYgQUNQSV9VU0VfQUxURVJOQVRFX1BST1RPVFlQRV9hY3BpX29zX3JlYWRfZmlsZQotaW50Ci1hY3BpX29zX3JlYWRfZmlsZShBQ1BJX0ZJTEUgZmlsZSwKLQkJICB2b2lkICpidWZmZXIsIGFjcGlfc2l6ZSBzaXplLCBhY3BpX3NpemUgY291bnQpOwotI2VuZGlmCi0KLSNpZm5kZWYgQUNQSV9VU0VfQUxURVJOQVRFX1BST1RPVFlQRV9hY3BpX29zX3dyaXRlX2ZpbGUKLWludAotYWNwaV9vc193cml0ZV9maWxlKEFDUElfRklMRSBmaWxlLAotCQkgICB2b2lkICpidWZmZXIsIGFjcGlfc2l6ZSBzaXplLCBhY3BpX3NpemUgY291bnQpOwotI2VuZGlmCi0KLSNpZm5kZWYgQUNQSV9VU0VfQUxURVJOQVRFX1BST1RPVFlQRV9hY3BpX29zX2dldF9maWxlX29mZnNldAotbG9uZyBhY3BpX29zX2dldF9maWxlX29mZnNldChBQ1BJX0ZJTEUgZmlsZSk7Ci0jZW5kaWYKLQotI2lmbmRlZiBBQ1BJX1VTRV9BTFRFUk5BVEVfUFJPVE9UWVBFX2FjcGlfb3Nfc2V0X2ZpbGVfb2Zmc2V0Ci1hY3BpX3N0YXR1cyBhY3BpX29zX3NldF9maWxlX29mZnNldChBQ1BJX0ZJTEUgZmlsZSwgbG9uZyBvZmZzZXQsIHU4IGZyb20pOwotI2VuZGlmCi0KLSNpZm5kZWYgQUNQSV9VU0VfQUxURVJOQVRFX1BST1RPVFlQRV9hY3BpX29zX3RyYWNlX3BvaW50Ci12b2lkCi1hY3BpX29zX3RyYWNlX3BvaW50KGFjcGlfdHJhY2VfZXZlbnRfdHlwZSB0eXBlLAotCQkgICAgdTggYmVnaW4sIHU4ICphbWwsIGNoYXIgKnBhdGhuYW1lKTsKLSNlbmRpZgotCiAjZW5kaWYJCQkJLyogX19BQ1BJT1NYRl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaAppbmRleCAxZmYzYTc2Li5jN2IzYTEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCkBAIC00Niw3ICs0Niw3IEBACiAKIC8qIEN1cnJlbnQgQUNQSUNBIHN1YnN5c3RlbSB2ZXJzaW9uIGluIFlZWVlNTUREIGZvcm1hdCAqLwogCi0jZGVmaW5lIEFDUElfQ0FfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgyMDE2MDQyMgorI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAxNjA4MzEKIAogI2luY2x1ZGUgPGFjcGkvYWNjb25maWcuaD4KICNpbmNsdWRlIDxhY3BpL2FjdHlwZXMuaD4KQEAgLTE5NSw2ICsxOTUsMTMgQEAKIEFDUElfSU5JVF9HTE9CQUwodTgsIGFjcGlfZ2JsX2dyb3VwX21vZHVsZV9sZXZlbF9jb2RlLCBUUlVFKTsKIAogLyoKKyAqIE9wdGlvbmFsbHkgc3VwcG9ydCBtb2R1bGUgbGV2ZWwgY29kZSBieSBwYXJzaW5nIHRoZSBlbnRpcmUgdGFibGUgYXMKKyAqIGEgdGVybV9saXN0LiBEZWZhdWx0IGlzIEZBTFNFLCBkbyBub3QgZXhlY3V0ZSBlbnRpcmUgdGFibGUgdW50aWwgc29tZQorICogbG9jayBvcmRlciBpc3N1ZXMgYXJlIGZpeGVkLgorICovCitBQ1BJX0lOSVRfR0xPQkFMKHU4LCBhY3BpX2dibF9wYXJzZV90YWJsZV9hc190ZXJtX2xpc3QsIEZBTFNFKTsKKworLyoKICAqIE9wdGlvbmFsbHkgdXNlIDMyLWJpdCBGQURUIGFkZHJlc3NlcyBpZiBhbmQgd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0CiAgKiAoYWRkcmVzcyBtaXNtYXRjaCkgYmV0d2VlbiB0aGUgMzItYml0IGFuZCA2NC1iaXQgdmVyc2lvbnMgb2YgdGhlCiAgKiBhZGRyZXNzLiBBbHRob3VnaCBBQ1BJQ0EgYWRoZXJlcyB0byB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uIHdoaWNoCkBAIC00MTYsMTggKzQyMywxOSBAQAogLyoKICAqIEluaXRpYWxpemF0aW9uCiAgKi8KLUFDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBfX2luaXQKK0FDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04KIAkJCSAgICBhY3BpX2luaXRpYWxpemVfdGFibGVzKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MKIAkJCQkJCSAgICppbml0aWFsX3N0b3JhZ2UsCiAJCQkJCQkgICB1MzIgaW5pdGlhbF90YWJsZV9jb3VudCwKIAkJCQkJCSAgIHU4IGFsbG93X3Jlc2l6ZSkpCi1BQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0odm9pZCkpCi0KLUFDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBfX2luaXQgYWNwaV9lbmFibGVfc3Vic3lzdGVtKHUzMiBmbGFncykpCi0KLUFDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBfX2luaXQKLQkJCSAgICBhY3BpX2luaXRpYWxpemVfb2JqZWN0cyh1MzIgZmxhZ3MpKQotQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIF9faW5pdCBhY3BpX3Rlcm1pbmF0ZSh2b2lkKSkKK0FDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04KKwkJCSAgICAgYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSh2b2lkKSkKK0FDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04KKwkJCSAgICAgYWNwaV9lbmFibGVfc3Vic3lzdGVtKHUzMiBmbGFncykpCitBQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCisJCQkgICAgIGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzKHUzMiBmbGFncykpCitBQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCisJCQkgICAgIGFjcGlfdGVybWluYXRlKHZvaWQpKQogCiAvKgogICogTWlzY2VsbGFuZW91cyBnbG9iYWwgaW50ZXJmYWNlcwpAQCAtNDY3LDcgKzQ3NSw3IEBACiAvKgogICogQUNQSSB0YWJsZSBsb2FkL3VubG9hZCBpbnRlcmZhY2VzCiAgKi8KLUFDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBfX2luaXQKK0FDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04KIAkJCSAgICBhY3BpX2luc3RhbGxfdGFibGUoYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCiAJCQkJCSAgICAgICB1OCBwaHlzaWNhbCkpCiAKQEAgLTQ3NiwxNCArNDg0LDE3IEBACiAKIEFDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cwogCQkJICAgIGFjcGlfdW5sb2FkX3BhcmVudF90YWJsZShhY3BpX2hhbmRsZSBvYmplY3QpKQotQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIF9faW5pdCBhY3BpX2xvYWRfdGFibGVzKHZvaWQpKQorCitBQ1BJX0VYVEVSTkFMX1JFVFVSTl9TVEFUVVMoYWNwaV9zdGF0dXMgQUNQSV9JTklUX0ZVTkNUSU9OCisJCQkgICAgYWNwaV9sb2FkX3RhYmxlcyh2b2lkKSkKIAogLyoKICAqIEFDUEkgdGFibGUgbWFuaXB1bGF0aW9uIGludGVyZmFjZXMKICAqLwotQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIF9faW5pdCBhY3BpX3JlYWxsb2NhdGVfcm9vdF90YWJsZSh2b2lkKSkKK0FDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cyBBQ1BJX0lOSVRfRlVOQ1RJT04KKwkJCSAgICBhY3BpX3JlYWxsb2NhdGVfcm9vdF90YWJsZSh2b2lkKSkKIAotQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIF9faW5pdAorQUNQSV9FWFRFUk5BTF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTgogCQkJICAgIGFjcGlfZmluZF9yb290X3BvaW50ZXIoYWNwaV9waHlzaWNhbF9hZGRyZXNzCiAJCQkJCQkgICAqcnNkcF9hZGRyZXNzKSkKIEFDUElfRVhURVJOQUxfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cwpAQCAtNzMyLDYgKzc0MywxMCBAQAogCQkJCQkJdTMyIGdwZV9udW1iZXIpKQogCiBBQ1BJX0hXX0RFUEVOREVOVF9SRVRVUk5fU1RBVFVTKGFjcGlfc3RhdHVzCisJCQkJYWNwaV9tYXNrX2dwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAorCQkJCQkgICAgICB1MzIgZ3BlX251bWJlciwgdTggaXNfbWFza2VkKSkKKworQUNQSV9IV19ERVBFTkRFTlRfUkVUVVJOX1NUQVRVUyhhY3BpX3N0YXR1cwogCQkJCWFjcGlfbWFya19ncGVfZm9yX3dha2UoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwKIAkJCQkJCSAgICAgICB1MzIgZ3BlX251bWJlcikpCiAKQEAgLTkzNSw5ICs5NTAsNiBAQAogCQkJICAgICAgIGFjcGlfdHJhY2VfcG9pbnQoYWNwaV90cmFjZV9ldmVudF90eXBlIHR5cGUsCiAJCQkJCQl1OCBiZWdpbiwKIAkJCQkJCXU4ICphbWwsIGNoYXIgKnBhdGhuYW1lKSkKLUFDUElfQVBQX0RFUEVOREVOVF9SRVRVUk5fVk9JRChBQ1BJX1BSSU5URl9MSUtFKDEpCi0JCQkJdm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQotCQkJCWFjcGlfbG9nX2Vycm9yKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSkKIAogYWNwaV9zdGF0dXMgYWNwaV9pbml0aWFsaXplX2RlYnVnZ2VyKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWN0YmwuaCBiL2luY2x1ZGUvYWNwaS9hY3RibC5oCmluZGV4IGMxOTcwMGUuLjFiOTQ5ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RibC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3RibC5oCkBAIC0yMzAsNjIgKzIzMCw3MiBAQAogLyogRmllbGRzIGNvbW1vbiB0byBhbGwgdmVyc2lvbnMgb2YgdGhlIEZBRFQgKi8KIAogc3RydWN0IGFjcGlfdGFibGVfZmFkdCB7Ci0Jc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsJLyogQ29tbW9uIEFDUEkgdGFibGUgaGVhZGVyICovCi0JdTMyIGZhY3M7CQkvKiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBGQUNTICovCi0JdTMyIGRzZHQ7CQkvKiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUICovCi0JdTggbW9kZWw7CQkvKiBTeXN0ZW0gSW50ZXJydXB0IE1vZGVsIChBQ1BJIDEuMCkgLSBub3QgdXNlZCBpbiBBQ1BJIDIuMCsgKi8KLQl1OCBwcmVmZXJyZWRfcHJvZmlsZTsJLyogQ29udmV5cyBwcmVmZXJyZWQgcG93ZXIgbWFuYWdlbWVudCBwcm9maWxlIHRvIE9TUE0uICovCi0JdTE2IHNjaV9pbnRlcnJ1cHQ7CS8qIFN5c3RlbSB2ZWN0b3Igb2YgU0NJIGludGVycnVwdCAqLwotCXUzMiBzbWlfY29tbWFuZDsJLyogMzItYml0IFBvcnQgYWRkcmVzcyBvZiBTTUkgY29tbWFuZCBwb3J0ICovCi0JdTggYWNwaV9lbmFibGU7CQkvKiBWYWx1ZSB0byB3cml0ZSB0byBTTUlfQ01EIHRvIGVuYWJsZSBBQ1BJICovCi0JdTggYWNwaV9kaXNhYmxlOwkvKiBWYWx1ZSB0byB3cml0ZSB0byBTTUlfQ01EIHRvIGRpc2FibGUgQUNQSSAqLwotCXU4IHM0X2Jpb3NfcmVxdWVzdDsJLyogVmFsdWUgdG8gd3JpdGUgdG8gU01JX0NNRCB0byBlbnRlciBTNEJJT1Mgc3RhdGUgKi8KLQl1OCBwc3RhdGVfY29udHJvbDsJLyogUHJvY2Vzc29yIHBlcmZvcm1hbmNlIHN0YXRlIGNvbnRyb2wgKi8KLQl1MzIgcG0xYV9ldmVudF9ibG9jazsJLyogMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgRXZlbnQgUmVnIEJsayAqLwotCXUzMiBwbTFiX2V2ZW50X2Jsb2NrOwkvKiAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBFdmVudCBSZWcgQmxrICovCi0JdTMyIHBtMWFfY29udHJvbF9ibG9jazsJLyogMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrICovCi0JdTMyIHBtMWJfY29udHJvbF9ibG9jazsJLyogMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgQ29udHJvbCBSZWcgQmxrICovCi0JdTMyIHBtMl9jb250cm9sX2Jsb2NrOwkvKiAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayAqLwotCXUzMiBwbV90aW1lcl9ibG9jazsJLyogMzItYml0IHBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgVGltZXIgQ3RybCBSZWcgQmxrICovCi0JdTMyIGdwZTBfYmxvY2s7CQkvKiAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIEdlbmVyYWwgUHVycG9zZSBFdmVudCAwIFJlZyBCbGsgKi8KLQl1MzIgZ3BlMV9ibG9jazsJCS8qIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IDEgUmVnIEJsayAqLwotCXU4IHBtMV9ldmVudF9sZW5ndGg7CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMXhfZXZlbnRfYmxvY2sgKi8KLQl1OCBwbTFfY29udHJvbF9sZW5ndGg7CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMXhfY29udHJvbF9ibG9jayAqLwotCXU4IHBtMl9jb250cm9sX2xlbmd0aDsJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0yX2NvbnRyb2xfYmxvY2sgKi8KLQl1OCBwbV90aW1lcl9sZW5ndGg7CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtX3RpbWVyX2Jsb2NrICovCi0JdTggZ3BlMF9ibG9ja19sZW5ndGg7CS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTBfYmxvY2sgKi8KLQl1OCBncGUxX2Jsb2NrX2xlbmd0aDsJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgZ3BlMV9ibG9jayAqLwotCXU4IGdwZTFfYmFzZTsJCS8qIE9mZnNldCBpbiBHUEUgbnVtYmVyIHNwYWNlIHdoZXJlIEdQRTEgZXZlbnRzIHN0YXJ0ICovCi0JdTggY3N0X2NvbnRyb2w7CQkvKiBTdXBwb3J0IGZvciB0aGUgX0NTVCBvYmplY3QgYW5kIEMtU3RhdGVzIGNoYW5nZSBub3RpZmljYXRpb24gKi8KLQl1MTYgYzJfbGF0ZW5jeTsJCS8qIFdvcnN0IGNhc2UgSFcgbGF0ZW5jeSB0byBlbnRlci9leGl0IEMyIHN0YXRlICovCi0JdTE2IGMzX2xhdGVuY3k7CQkvKiBXb3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMyBzdGF0ZSAqLwotCXUxNiBmbHVzaF9zaXplOwkJLyogUHJvY2Vzc29yIG1lbW9yeSBjYWNoZSBsaW5lIHdpZHRoLCBpbiBieXRlcyAqLwotCXUxNiBmbHVzaF9zdHJpZGU7CS8qIE51bWJlciBvZiBmbHVzaCBzdHJpZGVzIHRoYXQgbmVlZCB0byBiZSByZWFkICovCi0JdTggZHV0eV9vZmZzZXQ7CQkvKiBQcm9jZXNzb3IgZHV0eSBjeWNsZSBpbmRleCBpbiBwcm9jZXNzb3IgUF9DTlQgcmVnICovCi0JdTggZHV0eV93aWR0aDsJCS8qIFByb2Nlc3NvciBkdXR5IGN5Y2xlIHZhbHVlIGJpdCB3aWR0aCBpbiBQX0NOVCByZWdpc3RlciAqLwotCXU4IGRheV9hbGFybTsJCS8qIEluZGV4IHRvIGRheS1vZi1tb250aCBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KLQl1OCBtb250aF9hbGFybTsJCS8qIEluZGV4IHRvIG1vbnRoLW9mLXllYXIgYWxhcm0gaW4gUlRDIENNT1MgUkFNICovCi0JdTggY2VudHVyeTsJCS8qIEluZGV4IHRvIGNlbnR1cnkgaW4gUlRDIENNT1MgUkFNICovCi0JdTE2IGJvb3RfZmxhZ3M7CQkvKiBJQS1QQyBCb290IEFyY2hpdGVjdHVyZSBGbGFncyAoc2VlIGJlbG93IGZvciBpbmRpdmlkdWFsIGZsYWdzKSAqLwotCXU4IHJlc2VydmVkOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCXUzMiBmbGFnczsJCS8qIE1pc2NlbGxhbmVvdXMgZmxhZyBiaXRzIChzZWUgYmVsb3cgZm9yIGluZGl2aWR1YWwgZmxhZ3MpICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHJlc2V0X3JlZ2lzdGVyOwkvKiA2NC1iaXQgYWRkcmVzcyBvZiB0aGUgUmVzZXQgcmVnaXN0ZXIgKi8KLQl1OCByZXNldF92YWx1ZTsJCS8qIFZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZXNldF9yZWdpc3RlciBwb3J0IHRvIHJlc2V0IHRoZSBzeXN0ZW0gKi8KLQl1MTYgYXJtX2Jvb3RfZmxhZ3M7CS8qIEFSTS1TcGVjaWZpYyBCb290IEZsYWdzIChzZWUgYmVsb3cgZm9yIGluZGl2aWR1YWwgZmxhZ3MpIChBQ1BJIDUuMSkgKi8KLQl1OCBtaW5vcl9yZXZpc2lvbjsJLyogRkFEVCBNaW5vciBSZXZpc2lvbiAoQUNQSSA1LjEpICovCi0JdTY0IFhmYWNzOwkJLyogNjQtYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLwotCXU2NCBYZHNkdDsJCS8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWFfZXZlbnRfYmxvY2s7CS8qIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMWEgRXZlbnQgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFiX2V2ZW50X2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDFiIEV2ZW50IFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYV9jb250cm9sX2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDFhIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFiX2NvbnRyb2xfYmxvY2s7CS8qIDY0LWJpdCBFeHRlbmRlZCBQb3dlciBNZ3QgMWIgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMl9jb250cm9sX2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtX3RpbWVyX2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IFRpbWVyIEN0cmwgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhncGUwX2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IDAgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhncGUxX2Jsb2NrOwkvKiA2NC1iaXQgRXh0ZW5kZWQgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IDEgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHNsZWVwX2NvbnRyb2w7CS8qIDY0LWJpdCBTbGVlcCBDb250cm9sIHJlZ2lzdGVyIChBQ1BJIDUuMCkgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3Mgc2xlZXBfc3RhdHVzOwkvKiA2NC1iaXQgU2xlZXAgU3RhdHVzIHJlZ2lzdGVyIChBQ1BJIDUuMCkgKi8KLQl1NjQgaHlwZXJ2aXNvcl9pZDsJLyogSHlwZXJ2aXNvciBWZW5kb3IgSUQgKEFDUEkgNi4wKSAqLworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CS8qIFtWMV0gQ29tbW9uIEFDUEkgdGFibGUgaGVhZGVyICovCisJdTMyIGZhY3M7CQkvKiBbVjFdIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8KKwl1MzIgZHNkdDsJCS8qIFtWMV0gMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRFNEVCAqLworCXU4IG1vZGVsOwkJLyogW1YxXSBTeXN0ZW0gSW50ZXJydXB0IE1vZGVsIChBQ1BJIDEuMCkgLSBub3QgdXNlZCBpbiBBQ1BJIDIuMCsgKi8KKwl1OCBwcmVmZXJyZWRfcHJvZmlsZTsJLyogW1YxXSBDb252ZXlzIHByZWZlcnJlZCBwb3dlciBtYW5hZ2VtZW50IHByb2ZpbGUgdG8gT1NQTS4gKi8KKwl1MTYgc2NpX2ludGVycnVwdDsJLyogW1YxXSBTeXN0ZW0gdmVjdG9yIG9mIFNDSSBpbnRlcnJ1cHQgKi8KKwl1MzIgc21pX2NvbW1hbmQ7CS8qIFtWMV0gMzItYml0IFBvcnQgYWRkcmVzcyBvZiBTTUkgY29tbWFuZCBwb3J0ICovCisJdTggYWNwaV9lbmFibGU7CQkvKiBbVjFdIFZhbHVlIHRvIHdyaXRlIHRvIFNNSV9DTUQgdG8gZW5hYmxlIEFDUEkgKi8KKwl1OCBhY3BpX2Rpc2FibGU7CS8qIFtWMV0gVmFsdWUgdG8gd3JpdGUgdG8gU01JX0NNRCB0byBkaXNhYmxlIEFDUEkgKi8KKwl1OCBzNF9iaW9zX3JlcXVlc3Q7CS8qIFtWMV0gVmFsdWUgdG8gd3JpdGUgdG8gU01JX0NNRCB0byBlbnRlciBTNEJJT1Mgc3RhdGUgKi8KKwl1OCBwc3RhdGVfY29udHJvbDsJLyogW1YxXSBQcm9jZXNzb3IgcGVyZm9ybWFuY2Ugc3RhdGUgY29udHJvbCAqLworCXUzMiBwbTFhX2V2ZW50X2Jsb2NrOwkvKiBbVjFdIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFhIEV2ZW50IFJlZyBCbGsgKi8KKwl1MzIgcG0xYl9ldmVudF9ibG9jazsJLyogW1YxXSAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBFdmVudCBSZWcgQmxrICovCisJdTMyIHBtMWFfY29udHJvbF9ibG9jazsJLyogW1YxXSAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBDb250cm9sIFJlZyBCbGsgKi8KKwl1MzIgcG0xYl9jb250cm9sX2Jsb2NrOwkvKiBbVjFdIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayAqLworCXUzMiBwbTJfY29udHJvbF9ibG9jazsJLyogW1YxXSAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayAqLworCXUzMiBwbV90aW1lcl9ibG9jazsJLyogW1YxXSAzMi1iaXQgcG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgKi8KKwl1MzIgZ3BlMF9ibG9jazsJCS8qIFtWMV0gMzItYml0IHBvcnQgYWRkcmVzcyBvZiBHZW5lcmFsIFB1cnBvc2UgRXZlbnQgMCBSZWcgQmxrICovCisJdTMyIGdwZTFfYmxvY2s7CQkvKiBbVjFdIDMyLWJpdCBwb3J0IGFkZHJlc3Mgb2YgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IDEgUmVnIEJsayAqLworCXU4IHBtMV9ldmVudF9sZW5ndGg7CS8qIFtWMV0gQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0xeF9ldmVudF9ibG9jayAqLworCXU4IHBtMV9jb250cm9sX2xlbmd0aDsJLyogW1YxXSBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbTF4X2NvbnRyb2xfYmxvY2sgKi8KKwl1OCBwbTJfY29udHJvbF9sZW5ndGg7CS8qIFtWMV0gQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0yX2NvbnRyb2xfYmxvY2sgKi8KKwl1OCBwbV90aW1lcl9sZW5ndGg7CS8qIFtWMV0gQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG1fdGltZXJfYmxvY2sgKi8KKwl1OCBncGUwX2Jsb2NrX2xlbmd0aDsJLyogW1YxXSBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUwX2Jsb2NrICovCisJdTggZ3BlMV9ibG9ja19sZW5ndGg7CS8qIFtWMV0gQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgZ3BlMV9ibG9jayAqLworCXU4IGdwZTFfYmFzZTsJCS8qIFtWMV0gT2Zmc2V0IGluIEdQRSBudW1iZXIgc3BhY2Ugd2hlcmUgR1BFMSBldmVudHMgc3RhcnQgKi8KKwl1OCBjc3RfY29udHJvbDsJCS8qIFtWMV0gU3VwcG9ydCBmb3IgdGhlIF9DU1Qgb2JqZWN0IGFuZCBDLVN0YXRlcyBjaGFuZ2Ugbm90aWZpY2F0aW9uICovCisJdTE2IGMyX2xhdGVuY3k7CQkvKiBbVjFdIFdvcnN0IGNhc2UgSFcgbGF0ZW5jeSB0byBlbnRlci9leGl0IEMyIHN0YXRlICovCisJdTE2IGMzX2xhdGVuY3k7CQkvKiBbVjFdIFdvcnN0IGNhc2UgSFcgbGF0ZW5jeSB0byBlbnRlci9leGl0IEMzIHN0YXRlICovCisJdTE2IGZsdXNoX3NpemU7CQkvKiBbVjFdIFByb2Nlc3NvciBtZW1vcnkgY2FjaGUgbGluZSB3aWR0aCwgaW4gYnl0ZXMgKi8KKwl1MTYgZmx1c2hfc3RyaWRlOwkvKiBbVjFdIE51bWJlciBvZiBmbHVzaCBzdHJpZGVzIHRoYXQgbmVlZCB0byBiZSByZWFkICovCisJdTggZHV0eV9vZmZzZXQ7CQkvKiBbVjFdIFByb2Nlc3NvciBkdXR5IGN5Y2xlIGluZGV4IGluIHByb2Nlc3NvciBQX0NOVCByZWcgKi8KKwl1OCBkdXR5X3dpZHRoOwkJLyogW1YxXSBQcm9jZXNzb3IgZHV0eSBjeWNsZSB2YWx1ZSBiaXQgd2lkdGggaW4gUF9DTlQgcmVnaXN0ZXIgKi8KKwl1OCBkYXlfYWxhcm07CQkvKiBbVjFdIEluZGV4IHRvIGRheS1vZi1tb250aCBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KKwl1OCBtb250aF9hbGFybTsJCS8qIFtWMV0gSW5kZXggdG8gbW9udGgtb2YteWVhciBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8KKwl1OCBjZW50dXJ5OwkJLyogW1YxXSBJbmRleCB0byBjZW50dXJ5IGluIFJUQyBDTU9TIFJBTSAqLworCXUxNiBib290X2ZsYWdzOwkJLyogW1YzXSBJQS1QQyBCb290IEFyY2hpdGVjdHVyZSBGbGFncyAoc2VlIGJlbG93IGZvciBpbmRpdmlkdWFsIGZsYWdzKSAqLworCXU4IHJlc2VydmVkOwkJLyogW1YxXSBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTMyIGZsYWdzOwkJLyogW1YxXSBNaXNjZWxsYW5lb3VzIGZsYWcgYml0cyAoc2VlIGJlbG93IGZvciBpbmRpdmlkdWFsIGZsYWdzKSAqLworCS8qIEVuZCBvZiBWZXJzaW9uIDEgRkFEVCBmaWVsZHMgKEFDUEkgMS4wKSAqLworCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHJlc2V0X3JlZ2lzdGVyOwkvKiBbVjNdIDY0LWJpdCBhZGRyZXNzIG9mIHRoZSBSZXNldCByZWdpc3RlciAqLworCXU4IHJlc2V0X3ZhbHVlOwkJLyogW1YzXSBWYWx1ZSB0byB3cml0ZSB0byB0aGUgcmVzZXRfcmVnaXN0ZXIgcG9ydCB0byByZXNldCB0aGUgc3lzdGVtICovCisJdTE2IGFybV9ib290X2ZsYWdzOwkvKiBbVjVdIEFSTS1TcGVjaWZpYyBCb290IEZsYWdzIChzZWUgYmVsb3cgZm9yIGluZGl2aWR1YWwgZmxhZ3MpIChBQ1BJIDUuMSkgKi8KKwl1OCBtaW5vcl9yZXZpc2lvbjsJLyogW1Y1XSBGQURUIE1pbm9yIFJldmlzaW9uIChBQ1BJIDUuMSkgKi8KKwl1NjQgWGZhY3M7CQkvKiBbVjNdIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8KKwl1NjQgWGRzZHQ7CQkvKiBbVjNdIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWFfZXZlbnRfYmxvY2s7CS8qIFtWM10gNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCAxYSBFdmVudCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWJfZXZlbnRfYmxvY2s7CS8qIFtWM10gNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCAxYiBFdmVudCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWFfY29udHJvbF9ibG9jazsJLyogW1YzXSA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IDFhIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFiX2NvbnRyb2xfYmxvY2s7CS8qIFtWM10gNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0yX2NvbnRyb2xfYmxvY2s7CS8qIFtWM10gNjQtYml0IEV4dGVuZGVkIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbV90aW1lcl9ibG9jazsJLyogW1YzXSA2NC1iaXQgRXh0ZW5kZWQgUG93ZXIgTWd0IFRpbWVyIEN0cmwgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhncGUwX2Jsb2NrOwkvKiBbVjNdIDY0LWJpdCBFeHRlbmRlZCBHZW5lcmFsIFB1cnBvc2UgRXZlbnQgMCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeGdwZTFfYmxvY2s7CS8qIFtWM10gNjQtYml0IEV4dGVuZGVkIEdlbmVyYWwgUHVycG9zZSBFdmVudCAxIFJlZyBCbGsgYWRkcmVzcyAqLworCS8qIEVuZCBvZiBWZXJzaW9uIDMgRkFEVCBmaWVsZHMgKEFDUEkgMi4wKSAqLworCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHNsZWVwX2NvbnRyb2w7CS8qIFtWNF0gNjQtYml0IFNsZWVwIENvbnRyb2wgcmVnaXN0ZXIgKEFDUEkgNS4wKSAqLworCS8qIEVuZCBvZiBWZXJzaW9uIDQgRkFEVCBmaWVsZHMgKEFDUEkgMy4wIGFuZCBBQ1BJIDQuMCkgKEZpZWxkIHdhcyBvcmlnaW5hbGx5IHJlc2VydmVkIGluIEFDUEkgMy4wKSAqLworCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHNsZWVwX3N0YXR1czsJLyogW1Y1XSA2NC1iaXQgU2xlZXAgU3RhdHVzIHJlZ2lzdGVyIChBQ1BJIDUuMCkgKi8KKwkvKiBFbmQgb2YgVmVyc2lvbiA1IEZBRFQgZmllbGRzIChBQ1BJIDUuMCkgKi8KKworCXU2NCBoeXBlcnZpc29yX2lkOwkvKiBbVjZdIEh5cGVydmlzb3IgVmVuZG9yIElEIChBQ1BJIDYuMCkgKi8KKwkvKiBFbmQgb2YgVmVyc2lvbiA2IEZBRFQgZmllbGRzIChBQ1BJIDYuMCkgKi8KKwogfTsKIAogLyogTWFza3MgZm9yIEZBRFQgSUEtUEMgQm9vdCBBcmNoaXRlY3R1cmUgRmxhZ3MgKGJvb3RfZmxhZ3MpIFtWeF09SW50cm9kdWNlZCBpbiB0aGlzIEZBRFQgcmV2aXNpb24gKi8KQEAgLTMwMSw4ICszMTEsOCBAQAogCiAvKiBNYXNrcyBmb3IgRkFEVCBBUk0gQm9vdCBBcmNoaXRlY3R1cmUgRmxhZ3MgKGFybV9ib290X2ZsYWdzKSBBQ1BJIDUuMSAqLwogCi0jZGVmaW5lIEFDUElfRkFEVF9QU0NJX0NPTVBMSUFOVCAgICAoMSkJLyogMDA6IFtWNStdIFBTQ0kgMC4yKyBpcyBpbXBsZW1lbnRlZCAqLwotI2RlZmluZSBBQ1BJX0ZBRFRfUFNDSV9VU0VfSFZDICAgICAgKDE8PDEpCS8qIDAxOiBbVjUrXSBIVkMgbXVzdCBiZSB1c2VkIGluc3RlYWQgb2YgU01DIGFzIHRoZSBQU0NJIGNvbmR1aXQgKi8KKyNkZWZpbmUgQUNQSV9GQURUX1BTQ0lfQ09NUExJQU5UICAgICgxKQkvKiAwMDogW1Y1XSBQU0NJIDAuMisgaXMgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgQUNQSV9GQURUX1BTQ0lfVVNFX0hWQyAgICAgICgxPDwxKQkvKiAwMTogW1Y1XSBIVkMgbXVzdCBiZSB1c2VkIGluc3RlYWQgb2YgU01DIGFzIHRoZSBQU0NJIGNvbmR1aXQgKi8KIAogLyogTWFza3MgZm9yIEZBRFQgZmxhZ3MgKi8KIApAQCAtMzk5LDIwICs0MDksMzQgQEAKICAqIG1hdGNoIHRoZSBleHBlY3RlZCBsZW5ndGguIEluIG90aGVyIHdvcmRzLCB0aGUgbGVuZ3RoIG9mIHRoZQogICogRkFEVCBpcyB0aGUgYm90dG9tIGxpbmUgYXMgdG8gd2hhdCB0aGUgdmVyc2lvbiByZWFsbHkgaXMuCiAgKgotICogRm9yIHJlZmVyZW5jZSwgdGhlIHZhbHVlcyBiZWxvdyBhcmUgYXMgZm9sbG93czoKLSAqICAgICBGQURUIFYxIHNpemU6IDB4MDc0Ci0gKiAgICAgRkFEVCBWMiBzaXplOiAweDA4NAotICogICAgIEZBRFQgVjMgc2l6ZTogMHgwRjQKLSAqICAgICBGQURUIFY0IHNpemU6IDB4MEY0Ci0gKiAgICAgRkFEVCBWNSBzaXplOiAweDEwQwotICogICAgIEZBRFQgVjYgc2l6ZTogMHgxMTQKKyAqIE5PVEU6IFRoZXJlIGlzIG5vIG9mZmljaWFseSByZWxlYXNlZCBWMiBvZiB0aGUgRkFEVC4gVGhpcworICogdmVyc2lvbiB3YXMgdXNlZCBvbmx5IGZvciBwcm90b3R5cGluZyBhbmQgdGVzdGluZyBkdXJpbmcgdGhlCisgKiAzMi1iaXQgdG8gNjQtYml0IHRyYW5zaXRpb24uIFYzIHdhcyB0aGUgZmlyc3Qgb2ZmaWNpYWwgNjQtYml0CisgKiB2ZXJzaW9uIG9mIHRoZSBGQURULgorICoKKyAqIFVwZGF0ZSB0aGlzIGxpc3Qgb2YgZGVmaW5lcyB3aGVuIGEgbmV3IHZlcnNpb24gb2YgdGhlIEZBRFQgaXMKKyAqIGFkZGVkIHRvIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24uIE5vdGUgdGhhdCB0aGUgRkFEVCB2ZXJzaW9uIGlzCisgKiBvbmx5IGluY3JlbWVudGVkIHdoZW4gbmV3IGZpZWxkcyBhcmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nCisgKiB2ZXJzaW9uLiBUaGVyZWZvcmUsIHRoZSBGQURUIHZlcnNpb24gaXMgY29tcGV0ZWx5IGluZGVwZW5kZW50CisgKiBmcm9tIHRoZSB2ZXJzaW9uIG9mIHRoZSBBQ1BJIHNwZWNpZmljYXRpb24gd2hlcmUgaXQgaXMKKyAqIGRlZmluZWQuCisgKgorICogRm9yIHJlZmVyZW5jZSwgdGhlIHZhcmlvdXMgRkFEVCBsZW5ndGhzIGFyZSBhcyBmb2xsb3dzOgorICogICAgIEZBRFQgVjEgc2l6ZTogMHgwNzQgICAgICBBQ1BJIDEuMAorICogICAgIEZBRFQgVjMgc2l6ZTogMHgwRjQgICAgICBBQ1BJIDIuMAorICogICAgIEZBRFQgVjQgc2l6ZTogMHgxMDAgICAgICBBQ1BJIDMuMCBhbmQgQUNQSSA0LjAKKyAqICAgICBGQURUIFY1IHNpemU6IDB4MTBDICAgICAgQUNQSSA1LjAKKyAqICAgICBGQURUIFY2IHNpemU6IDB4MTE0ICAgICAgQUNQSSA2LjAKICAqLwotI2RlZmluZSBBQ1BJX0ZBRFRfVjFfU0laRSAgICAgICAodTMyKSAoQUNQSV9GQURUX09GRlNFVCAoZmxhZ3MpICsgNCkKLSNkZWZpbmUgQUNQSV9GQURUX1YyX1NJWkUgICAgICAgKHUzMikgKEFDUElfRkFEVF9PRkZTRVQgKG1pbm9yX3JldmlzaW9uKSArIDEpCi0jZGVmaW5lIEFDUElfRkFEVF9WM19TSVpFICAgICAgICh1MzIpIChBQ1BJX0ZBRFRfT0ZGU0VUIChzbGVlcF9jb250cm9sKSkKLSNkZWZpbmUgQUNQSV9GQURUX1Y1X1NJWkUgICAgICAgKHUzMikgKEFDUElfRkFEVF9PRkZTRVQgKGh5cGVydmlzb3JfaWQpKQotI2RlZmluZSBBQ1BJX0ZBRFRfVjZfU0laRSAgICAgICAodTMyKSAoc2l6ZW9mIChzdHJ1Y3QgYWNwaV90YWJsZV9mYWR0KSkKKyNkZWZpbmUgQUNQSV9GQURUX1YxX1NJWkUgICAgICAgKHUzMikgKEFDUElfRkFEVF9PRkZTRVQgKGZsYWdzKSArIDQpCS8qIEFDUEkgMS4wICovCisjZGVmaW5lIEFDUElfRkFEVF9WM19TSVpFICAgICAgICh1MzIpIChBQ1BJX0ZBRFRfT0ZGU0VUIChzbGVlcF9jb250cm9sKSkJLyogQUNQSSAyLjAgKi8KKyNkZWZpbmUgQUNQSV9GQURUX1Y0X1NJWkUgICAgICAgKHUzMikgKEFDUElfRkFEVF9PRkZTRVQgKHNsZWVwX3N0YXR1cykpCS8qIEFDUEkgMy4wIGFuZCBBQ1BJIDQuMCAqLworI2RlZmluZSBBQ1BJX0ZBRFRfVjVfU0laRSAgICAgICAodTMyKSAoQUNQSV9GQURUX09GRlNFVCAoaHlwZXJ2aXNvcl9pZCkpCS8qIEFDUEkgNS4wICovCisjZGVmaW5lIEFDUElfRkFEVF9WNl9TSVpFICAgICAgICh1MzIpIChzaXplb2YgKHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQpKQkvKiBBQ1BJIDYuMCAqLwogCisvKiBVcGRhdGUgdGhlc2Ugd2hlbiBuZXcgRkFEVCB2ZXJzaW9ucyBhcmUgYWRkZWQgKi8KKworI2RlZmluZSBBQ1BJX0ZBRFRfTUFYX1ZFUlNJT04gICA2CiAjZGVmaW5lIEFDUElfRkFEVF9DT05GT1JNQU5DRSAgICJBQ1BJIDYuMSAoRkFEVCB2ZXJzaW9uIDYpIgogCiAjZW5kaWYJCQkJLyogX19BQ1RCTF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmggYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCmluZGV4IGNiMzg5ZWYuLjFkNzk4YWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaApAQCAtNzMyLDE2ICs3MzIsMTcgQEAKICAqIFRoZSBlbmNvZGluZyBvZiBhY3BpX2V2ZW50X3N0YXR1cyBpcyBpbGx1c3RyYXRlZCBiZWxvdy4KICAqIE5vdGUgdGhhdCBhIHNldCBiaXQgKDEpIGluZGljYXRlcyB0aGUgcHJvcGVydHkgaXMgVFJVRQogICogKGUuZy4gaWYgYml0IDAgaXMgc2V0IHRoZW4gdGhlIGV2ZW50IGlzIGVuYWJsZWQpLgotICogKy0tLS0tLS0tLS0tLS0rLSstKy0rLSstKwotICogfCAgIEJpdHMgMzE6NSB8NHwzfDJ8MXwwfAotICogKy0tLS0tLS0tLS0tLS0rLSstKy0rLSstKwotICogICAgICAgICAgfCAgICAgfCB8IHwgfCB8Ci0gKiAgICAgICAgICB8ICAgICB8IHwgfCB8ICstIEVuYWJsZWQ/Ci0gKiAgICAgICAgICB8ICAgICB8IHwgfCArLS0tIEVuYWJsZWQgZm9yIHdha2U/Ci0gKiAgICAgICAgICB8ICAgICB8IHwgKy0tLS0tIFN0YXR1cyBiaXQgc2V0PwotICogICAgICAgICAgfCAgICAgfCArLS0tLS0tLSBFbmFibGUgYml0IHNldD8KLSAqICAgICAgICAgIHwgICAgICstLS0tLS0tLS0gSGFzIGEgaGFuZGxlcj8KLSAqICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0gPFJlc2VydmVkPgorICogKy0tLS0tLS0tLS0tLS0rLSstKy0rLSstKy0rCisgKiB8ICAgQml0cyAzMTo2IHw1fDR8M3wyfDF8MHwKKyAqICstLS0tLS0tLS0tLS0tKy0rLSstKy0rLSstKworICogICAgICAgICAgfCAgICAgfCB8IHwgfCB8IHwKKyAqICAgICAgICAgIHwgICAgIHwgfCB8IHwgfCArLSBFbmFibGVkPworICogICAgICAgICAgfCAgICAgfCB8IHwgfCArLS0tIEVuYWJsZWQgZm9yIHdha2U/CisgKiAgICAgICAgICB8ICAgICB8IHwgfCArLS0tLS0gU3RhdHVzIGJpdCBzZXQ/CisgKiAgICAgICAgICB8ICAgICB8IHwgKy0tLS0tLS0gRW5hYmxlIGJpdCBzZXQ/CisgKiAgICAgICAgICB8ICAgICB8ICstLS0tLS0tLS0gSGFzIGEgaGFuZGxlcj8KKyAqICAgICAgICAgIHwgICAgICstLS0tLS0tLS0tLSBNYXNrZWQ/CisgKiAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0gPFJlc2VydmVkPgogICovCiB0eXBlZGVmIHUzMiBhY3BpX2V2ZW50X3N0YXR1czsKIApAQCAtNzUxLDYgKzc1Miw3IEBACiAjZGVmaW5lIEFDUElfRVZFTlRfRkxBR19TVEFUVVNfU0VUICAgICAgKGFjcGlfZXZlbnRfc3RhdHVzKSAweDA0CiAjZGVmaW5lIEFDUElfRVZFTlRfRkxBR19FTkFCTEVfU0VUICAgICAgKGFjcGlfZXZlbnRfc3RhdHVzKSAweDA4CiAjZGVmaW5lIEFDUElfRVZFTlRfRkxBR19IQVNfSEFORExFUiAgICAgKGFjcGlfZXZlbnRfc3RhdHVzKSAweDEwCisjZGVmaW5lIEFDUElfRVZFTlRfRkxBR19NQVNLRUQgICAgICAgICAgKGFjcGlfZXZlbnRfc3RhdHVzKSAweDIwCiAjZGVmaW5lIEFDUElfRVZFTlRfRkxBR19TRVQgICAgICAgICAgICAgQUNQSV9FVkVOVF9GTEFHX1NUQVRVU19TRVQKIAogLyogQWN0aW9ucyBmb3IgYWNwaV9zZXRfZ3BlLCBhY3BpX2dwZV93YWtldXAsIGFjcGlfaHdfbG93X3NldF9ncGUgKi8KQEAgLTc2MSwxNCArNzYzLDE1IEBACiAKIC8qCiAgKiBHUEUgaW5mbyBmbGFncyAtIFBlciBHUEUKLSAqICstLS0tLS0tKy0rLSstLS0rCi0gKiB8ICA3OjUgIHw0fDN8MjowfAotICogKy0tLS0tLS0rLSstKy0tLSsKLSAqICAgICB8ICAgIHwgfCAgfAotICogICAgIHwgICAgfCB8ICArLS0gVHlwZSBvZiBkaXNwYXRjaDp0byBtZXRob2QsIGhhbmRsZXIsIG5vdGlmeSwgb3Igbm9uZQotICogICAgIHwgICAgfCArLS0tLS0gSW50ZXJydXB0IHR5cGU6IGVkZ2Ugb3IgbGV2ZWwgdHJpZ2dlcmVkCi0gKiAgICAgfCAgICArLS0tLS0tLSBJcyBhIFdha2UgR1BFCi0gKiAgICAgKy0tLS0tLS0tLS0tLSA8UmVzZXJ2ZWQ+CisgKiArLS0tKy0rLSstKy0tLSsKKyAqIHw3OjZ8NXw0fDN8MjowfAorICogKy0tLSstKy0rLSstLS0rCisgKiAgIHwgIHwgfCB8ICB8CisgKiAgIHwgIHwgfCB8ICArLS0gVHlwZSBvZiBkaXNwYXRjaDp0byBtZXRob2QsIGhhbmRsZXIsIG5vdGlmeSwgb3Igbm9uZQorICogICB8ICB8IHwgKy0tLS0tIEludGVycnVwdCB0eXBlOiBlZGdlIG9yIGxldmVsIHRyaWdnZXJlZAorICogICB8ICB8ICstLS0tLS0tIElzIGEgV2FrZSBHUEUKKyAqICAgfCAgKy0tLS0tLS0tLSBJcyBHUEUgbWFza2VkIGJ5IHRoZSBzb2Z0d2FyZSBHUEUgbWFza2luZyBtYWNoYW5pc20KKyAqICAgKy0tLS0tLS0tLS0tLSA8UmVzZXJ2ZWQ+CiAgKi8KICNkZWZpbmUgQUNQSV9HUEVfRElTUEFUQ0hfTk9ORSAgICAgICAgICAodTgpIDB4MDAKICNkZWZpbmUgQUNQSV9HUEVfRElTUEFUQ0hfTUVUSE9EICAgICAgICAodTgpIDB4MDEKQEAgLTEwMzEsMTIgKzEwMzQsNiBAQAogCXUzMiBtZXRob2RfY291bnQ7CiB9OwogCi0vKiBUYWJsZSBFdmVudCBUeXBlcyAqLwotCi0jZGVmaW5lIEFDUElfVEFCTEVfRVZFTlRfTE9BRCAgICAgICAgICAgMHgwCi0jZGVmaW5lIEFDUElfVEFCTEVfRVZFTlRfVU5MT0FEICAgICAgICAgMHgxCi0jZGVmaW5lIEFDUElfTlVNX1RBQkxFX0VWRU5UUyAgICAgICAgICAgMgotCiAvKgogICogVHlwZXMgc3BlY2lmaWMgdG8gdGhlIE9TIHNlcnZpY2UgaW50ZXJmYWNlcwogICovCkBAIC0xMDg4LDkgKzEwODUsMTMgQEAKIHR5cGVkZWYKIGFjcGlfc3RhdHVzICgqYWNwaV90YWJsZV9oYW5kbGVyKSAodTMyIGV2ZW50LCB2b2lkICp0YWJsZSwgdm9pZCAqY29udGV4dCk7CiAKLSNkZWZpbmUgQUNQSV9UQUJMRV9MT0FEICAgICAgICAgICAgIDB4MAotI2RlZmluZSBBQ1BJX1RBQkxFX1VOTE9BRCAgICAgICAgICAgMHgxCi0jZGVmaW5lIEFDUElfTlVNX1RBQkxFX0VWRU5UUyAgICAgICAyCisvKiBUYWJsZSBFdmVudCBUeXBlcyAqLworCisjZGVmaW5lIEFDUElfVEFCTEVfRVZFTlRfTE9BRCAgICAgICAgICAgMHgwCisjZGVmaW5lIEFDUElfVEFCTEVfRVZFTlRfVU5MT0FEICAgICAgICAgMHgxCisjZGVmaW5lIEFDUElfVEFCTEVfRVZFTlRfSU5TVEFMTCAgICAgICAgMHgyCisjZGVmaW5lIEFDUElfVEFCTEVfRVZFTlRfVU5JTlNUQUxMICAgICAgMHgzCisjZGVmaW5lIEFDUElfTlVNX1RBQkxFX0VWRU5UUyAgICAgICAgICAgNAogCiAvKiBBZGRyZXNzIFNwYWNlcyAoRm9yIE9wZXJhdGlvbiBSZWdpb25zKSAqLwogCkBAIC0xMjg1LDE1ICsxMjg2LDYgQEAKICNkZWZpbmUgQUNQSV9PU0lfV0lOXzggICAgICAgICAgICAgICAgICAweDBDCiAjZGVmaW5lIEFDUElfT1NJX1dJTl8xMCAgICAgICAgICAgICAgICAgMHgwRAogCi0vKiBEZWZpbml0aW9ucyBvZiBmaWxlIElPICovCi0KLSNkZWZpbmUgQUNQSV9GSUxFX1JFQURJTkcgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEFDUElfRklMRV9XUklUSU5HICAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBBQ1BJX0ZJTEVfQklOQVJZICAgICAgICAgICAgICAgIDB4MDQKLQotI2RlZmluZSBBQ1BJX0ZJTEVfQkVHSU4gICAgICAgICAgICAgICAgIDB4MDEKLSNkZWZpbmUgQUNQSV9GSUxFX0VORCAgICAgICAgICAgICAgICAgICAweDAyCi0KIC8qIERlZmluaXRpb25zIG9mIGdldG9wdCAqLwogCiAjZGVmaW5lIEFDUElfT1BUX0VORCAgICAgICAgICAgICAgICAgICAgLTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9jcHBjX2FjcGkuaCBiL2luY2x1ZGUvYWNwaS9jcHBjX2FjcGkuaAppbmRleCAyODQ5NjVjLi40MjdhN2MzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvY3BwY19hY3BpLmgKKysrIGIvaW5jbHVkZS9hY3BpL2NwcGNfYWNwaS5oCkBAIC0yNCw3ICsyNCw5IEBACiAjZGVmaW5lIENQUENfTlVNX0VOVAkyMQogI2RlZmluZSBDUFBDX1JFVgkyCiAKLSNkZWZpbmUgUENDX0NNRF9DT01QTEVURSAxCisjZGVmaW5lIFBDQ19DTURfQ09NUExFVEVfTUFTSwkoMSA8PCAwKQorI2RlZmluZSBQQ0NfRVJST1JfTUFTSwkJKDEgPDwgMikKKwogI2RlZmluZSBNQVhfQ1BDX1JFR19FTlQgMTkKIAogLyogQ1BQQyBzcGVjaWZpYyBQQ0MgY29tbWFuZHMuICovCkBAIC00OSw2ICs1MSw3IEBACiAgKi8KIHN0cnVjdCBjcGNfcmVnaXN0ZXJfcmVzb3VyY2UgewogCWFjcGlfb2JqZWN0X3R5cGUgdHlwZTsKKwl1NjQgX19pb21lbSAqc3lzX21lbV92YWRkcjsKIAl1bmlvbiB7CiAJCXN0cnVjdCBjcGNfcmVnIHJlZzsKIAkJdTY0IGludF92YWx1ZTsKQEAgLTYwLDggKzYzLDExIEBACiAJaW50IG51bV9lbnRyaWVzOwogCWludCB2ZXJzaW9uOwogCWludCBjcHVfaWQ7CisJaW50IHdyaXRlX2NtZF9zdGF0dXM7CisJaW50IHdyaXRlX2NtZF9pZDsKIAlzdHJ1Y3QgY3BjX3JlZ2lzdGVyX3Jlc291cmNlIGNwY19yZWdzW01BWF9DUENfUkVHX0VOVF07CiAJc3RydWN0IGFjcGlfcHNkX3BhY2thZ2UgZG9tYWluX2luZm87CisJc3RydWN0IGtvYmplY3Qga29iajsKIH07CiAKIC8qIFRoZXNlIGFyZSBpbmRleGVzIGludG8gdGhlIHBlci1jcHUgY3BjX3JlZ3NbXS4gT3JkZXIgaXMgaW1wb3J0YW50LiAqLwpAQCAtOTYsNyArMTAyLDYgQEAKIHN0cnVjdCBjcHBjX3BlcmZfY2FwcyB7CiAJdTMyIGhpZ2hlc3RfcGVyZjsKIAl1MzIgbm9taW5hbF9wZXJmOwotCXUzMiByZWZlcmVuY2VfcGVyZjsKIAl1MzIgbG93ZXN0X3BlcmY7CiB9OwogCkBAIC0xMDgsMTMgKzExMywxMyBAQAogCiBzdHJ1Y3QgY3BwY19wZXJmX2ZiX2N0cnMgewogCXU2NCByZWZlcmVuY2U7Ci0JdTY0IHByZXZfcmVmZXJlbmNlOwogCXU2NCBkZWxpdmVyZWQ7Ci0JdTY0IHByZXZfZGVsaXZlcmVkOworCXU2NCByZWZlcmVuY2VfcGVyZjsKKwl1NjQgY3RyX3dyYXBfdGltZTsKIH07CiAKIC8qIFBlciBDUFUgY29udGFpbmVyIGZvciBydW50aW1lIENQUEMgbWFuYWdlbWVudC4gKi8KLXN0cnVjdCBjcHVkYXRhIHsKK3N0cnVjdCBjcHBjX2NwdWRhdGEgewogCWludCBjcHU7CiAJc3RydWN0IGNwcGNfcGVyZl9jYXBzIHBlcmZfY2FwczsKIAlzdHJ1Y3QgY3BwY19wZXJmX2N0cmxzIHBlcmZfY3RybHM7CkBAIC0xMjcsNiArMTMyLDcgQEAKIGV4dGVybiBpbnQgY3BwY19nZXRfcGVyZl9jdHJzKGludCBjcHUsIHN0cnVjdCBjcHBjX3BlcmZfZmJfY3RycyAqcGVyZl9mYl9jdHJzKTsKIGV4dGVybiBpbnQgY3BwY19zZXRfcGVyZihpbnQgY3B1LCBzdHJ1Y3QgY3BwY19wZXJmX2N0cmxzICpwZXJmX2N0cmxzKTsKIGV4dGVybiBpbnQgY3BwY19nZXRfcGVyZl9jYXBzKGludCBjcHUsIHN0cnVjdCBjcHBjX3BlcmZfY2FwcyAqY2Fwcyk7Ci1leHRlcm4gaW50IGFjcGlfZ2V0X3BzZF9tYXAoc3RydWN0IGNwdWRhdGEgKiopOworZXh0ZXJuIGludCBhY3BpX2dldF9wc2RfbWFwKHN0cnVjdCBjcHBjX2NwdWRhdGEgKiopOworZXh0ZXJuIHVuc2lnbmVkIGludCBjcHBjX2dldF90cmFuc2l0aW9uX2xhdGVuY3koaW50IGNwdSk7CiAKICNlbmRpZiAvKiBfQ1BQQ19BQ1BJX0gqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaAppbmRleCA4NmI1YTg0Li4zNGNjZTcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnYuaApAQCAtNzgsNiArNzgsNyBAQAogCShkZWZpbmVkIEFDUElfRVhBTVBMRV9BUFApCiAjZGVmaW5lIEFDUElfQVBQTElDQVRJT04KICNkZWZpbmUgQUNQSV9TSU5HTEVfVEhSRUFERUQKKyNkZWZpbmUgVVNFX05BVElWRV9BTExPQ0FURV9aRVJPRUQKICNlbmRpZgogCiAvKiBpQVNMIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTEyNCw3ICsxMjUsNiBAQAogCiAjaWZkZWYgQUNQSV9EVU1QX0FQUAogI2RlZmluZSBBQ1BJX1VTRV9OQVRJVkVfTUVNT1JZX01BUFBJTkcKLSNkZWZpbmUgVVNFX05BVElWRV9BTExPQ0FURV9aRVJPRUQKICNlbmRpZgogCiAvKiBhY3BpX25hbWVzL0V4YW1wbGUgY29uZmlndXJhdGlvbi4gSGFyZHdhcmUgZGlzYWJsZWQgKi8KQEAgLTE0OSw3ICsxNDksNiBAQAogLyogQ29tbW9uIGZvciBhbGwgQUNQSUNBIGFwcGxpY2F0aW9ucyAqLwogCiAjaWZkZWYgQUNQSV9BUFBMSUNBVElPTgotI2RlZmluZSBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkKICNkZWZpbmUgQUNQSV9VU0VfTE9DQUxfQ0FDSEUKICNlbmRpZgogCkBAIC0xNjcsMTAgKzE2NiwyMSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEhvc3QgY29uZmlndXJhdGlvbiBmaWxlcy4gVGhlIGNvbXBpbGVyIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIGluY2x1ZGVkCi0gKiBieSB0aGUgaG9zdCBmaWxlcy4KKyAqIGZpcnN0LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisjaW5jbHVkZSA8YWNwaS9wbGF0Zm9ybS9hY2djYy5oPgorCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2luY2x1ZGUgImFjbXN2Yy5oIgorCisjZWxpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisjaW5jbHVkZSAiYWNpbnRlbC5oIgorCisjZW5kaWYKKwogI2lmIGRlZmluZWQoX0xJTlVYKSB8fCBkZWZpbmVkKF9fbGludXhfXykKICNpbmNsdWRlIDxhY3BpL3BsYXRmb3JtL2FjbGludXguaD4KIApAQCAtMjEwLDE4ICsyMjAsMjAgQEAKICNlbGlmIGRlZmluZWQoX19PUzJfXykKICNpbmNsdWRlICJhY29zMi5oIgogCi0jZWxpZiBkZWZpbmVkKF9BRURfRUZJKQotI2luY2x1ZGUgImFjZWZpLmgiCi0KLSNlbGlmIGRlZmluZWQoX0dOVV9FRkkpCi0jaW5jbHVkZSAiYWNlZmkuaCIKLQogI2VsaWYgZGVmaW5lZChfX0hBSUtVX18pCiAjaW5jbHVkZSAiYWNoYWlrdS5oIgogCiAjZWxpZiBkZWZpbmVkKF9fUU5YX18pCiAjaW5jbHVkZSAiYWNxbnguaCIKIAorLyoKKyAqIEVGSSBhcHBsaWNhdGlvbnMgY2FuIGJlIGJ1aWx0IHdpdGggLW5vc3RkbGliLCBpbiB0aGlzIGNhc2UsIGl0IG11c3QgYmUKKyAqIGluY2x1ZGVkIGFmdGVyIGluY2x1ZGluZyBhbGwgb3RoZXIgaG9zdCBlbnZpcm9ubWVudGFsIGRlZmluaXRpb25zLCBpbgorICogb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIGRlZmluaXRpb25zLgorICovCisjZWxpZiBkZWZpbmVkKF9BRURfRUZJKSB8fCBkZWZpbmVkKF9HTlVfRUZJKSB8fCBkZWZpbmVkKF9FREsyX0VGSSkKKyNpbmNsdWRlICJhY2VmaS5oIgorCiAjZWxzZQogCiAvKiBVbmtub3duIGVudmlyb25tZW50ICovCkBAIC0zMjYsNyArMzM4LDggQEAKICAqIEFDUElfVVNFX1NZU1RFTV9DTElCUkFSWSAtIERlZmluZSB0aGlzIGlmIGxpbmtpbmcgdG8gYW4gYWN0dWFsIEMgbGlicmFyeS4KICAqICAgICAgT3RoZXJ3aXNlLCBsb2NhbCB2ZXJzaW9ucyBvZiBzdHJpbmcvbWVtb3J5IGZ1bmN0aW9ucyB3aWxsIGJlIHVzZWQuCiAgKiBBQ1BJX1VTRV9TVEFOREFSRF9IRUFERVJTIC0gRGVmaW5lIHRoaXMgaWYgbGlua2luZyB0byBhIEMgbGlicmFyeSBhbmQKLSAqICAgICAgdGhlIHN0YW5kYXJkIGhlYWRlciBmaWxlcyBtYXkgYmUgdXNlZC4KKyAqICAgICAgdGhlIHN0YW5kYXJkIGhlYWRlciBmaWxlcyBtYXkgYmUgdXNlZC4gRGVmaW5pbmcgdGhpcyBpbXBsaWVzIHRoYXQKKyAqICAgICAgQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZIGhhcyBiZWVuIGRlZmluZWQuCiAgKgogICogVGhlIEFDUElDQSBzdWJzeXN0ZW0gb25seSB1c2VzIGxvdyBsZXZlbCBDIGxpYnJhcnkgZnVuY3Rpb25zIHRoYXQgZG8gbm90CiAgKiBjYWxsIG9wZXJhdGluZyBzeXN0ZW0gc2VydmljZXMgYW5kIG1heSB0aGVyZWZvcmUgYmUgaW5saW5lZCBpbiB0aGUgY29kZS4KQEAgLTMzNCw3ICszNDcsNiBAQAogICogSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byB0YWlsb3IgdGhlc2UgaW5jbHVkZSBmaWxlcyB0byB0aGUgdGFyZ2V0CiAgKiBnZW5lcmF0aW9uIGVudmlyb25tZW50LgogICovCi0jaWZkZWYgQUNQSV9VU0VfU1lTVEVNX0NMSUJSQVJZCiAKIC8qIFVzZSB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGhlYWRlcnMuIFdlIHdhbnQgdG8ga2VlcCB0aGVzZSB0byBhIG1pbmltdW0uICovCiAKQEAgLTM0Miw1NyArMzU0LDIwIEBACiAKIC8qIFVzZSB0aGUgc3RhbmRhcmQgaGVhZGVycyBmcm9tIHRoZSBzdGFuZGFyZCBsb2NhdGlvbnMgKi8KIAotI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGN0eXBlLmg+CisjaWZkZWYgQUNQSV9BUFBMSUNBVElPTgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNlbmRpZgogCiAjZW5kaWYJCQkJLyogQUNQSV9VU0VfU1RBTkRBUkRfSEVBREVSUyAqLwogCi0vKiBXZSB3aWxsIGJlIGxpbmtpbmcgdG8gdGhlIHN0YW5kYXJkIENsaWIgZnVuY3Rpb25zICovCi0KLSNlbHNlCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBOb3QgdXNpbmcgbmF0aXZlIEMgbGlicmFyeSwgdXNlIGxvY2FsIGltcGxlbWVudGF0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFVzZSBsb2NhbCBkZWZpbml0aW9ucyBvZiBDIGxpYnJhcnkgbWFjcm9zIGFuZCBmdW5jdGlvbnMuIFRoZXNlIGZ1bmN0aW9uCi0gKiBpbXBsZW1lbnRhdGlvbnMgbWF5IG5vdCBiZSBhcyBlZmZpY2llbnQgYXMgYW4gaW5saW5lIG9yIGFzc2VtYmx5IGNvZGUKLSAqIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IGEgbmF0aXZlIEMgbGlicmFyeSwgYnV0IHRoZXkgYXJlIGZ1bmN0aW9uYWxseQotICogZXF1aXZhbGVudC4KLSAqLwotI2lmbmRlZiB2YV9hcmcKLQotI2lmbmRlZiBfVkFMSVNUCi0jZGVmaW5lIF9WQUxJU1QKLXR5cGVkZWYgY2hhciAqdmFfbGlzdDsKLSNlbmRpZgkJCQkvKiBfVkFMSVNUICovCi0KLS8qIFN0b3JhZ2UgYWxpZ25tZW50IHByb3BlcnRpZXMgKi8KLQotI2RlZmluZSAgX0FVUEJORCAgICAgICAgICAgICAgICAoc2l6ZW9mIChhY3BpX25hdGl2ZV9pbnQpIC0gMSkKLSNkZWZpbmUgIF9BRE5CTkQgICAgICAgICAgICAgICAgKHNpemVvZiAoYWNwaV9uYXRpdmVfaW50KSAtIDEpCi0KLS8qIFZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgbWFjcm8gZGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZSBfYm5kKFgsIGJuZCkgICAgICAgICAgICAoKChzaXplb2YgKFgpKSArIChibmQpKSAmICh+KGJuZCkpKQotI2RlZmluZSB2YV9hcmcoYXAsIFQpICAgICAgICAgICAoKihUICopKCgoYXApICs9IChfYm5kIChULCBfQVVQQk5EKSkpIC0gKF9ibmQgKFQsX0FETkJORCkpKSkKLSNkZWZpbmUgdmFfZW5kKGFwKSAgICAgICAgICAgICAgKGFwID0gKHZhX2xpc3QpIE5VTEwpCi0jZGVmaW5lIHZhX3N0YXJ0KGFwLCBBKSAgICAgICAgICh2b2lkKSAoKGFwKSA9ICgoKGNoYXIgKikgJihBKSkgKyAoX2JuZCAoQSxfQVVQQk5EKSkpKQotCi0jZW5kaWYJCQkJLyogdmFfYXJnICovCi0KLS8qIFVzZSB0aGUgbG9jYWwgKEFDUElDQSkgZGVmaW5pdGlvbnMgb2YgdGhlIGNsaWIgZnVuY3Rpb25zICovCi0KLSNlbmRpZgkJCQkvKiBBQ1BJX1VTRV9TWVNURU1fQ0xJQlJBUlkgKi8KLQotI2lmbmRlZiBBQ1BJX0ZJTEUKICNpZmRlZiBBQ1BJX0FQUExJQ0FUSU9OCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNkZWZpbmUgQUNQSV9GSUxFICAgICAgICAgICAgICBGSUxFICoKICNkZWZpbmUgQUNQSV9GSUxFX09VVCAgICAgICAgICBzdGRvdXQKICNkZWZpbmUgQUNQSV9GSUxFX0VSUiAgICAgICAgICBzdGRlcnIKQEAgLTQwMSw2ICszNzYsOSBAQAogI2RlZmluZSBBQ1BJX0ZJTEVfT1VUICAgICAgICAgIE5VTEwKICNkZWZpbmUgQUNQSV9GSUxFX0VSUiAgICAgICAgICBOVUxMCiAjZW5kaWYJCQkJLyogQUNQSV9BUFBMSUNBVElPTiAqLwotI2VuZGlmCQkJCS8qIEFDUElfRklMRSAqLworCisjaWZuZGVmIEFDUElfSU5JVF9GVU5DVElPTgorI2RlZmluZSBBQ1BJX0lOSVRfRlVOQ1RJT04KKyNlbmRpZgogCiAjZW5kaWYJCQkJLyogX19BQ0VOVl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2VudmV4LmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNlbnZleC5oCmluZGV4IDRmMTVjMWQuLmIzMTcxYjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2VudmV4LmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52ZXguaApAQCAtNTYsMTggKzU2LDI1IEBACiAjaWYgZGVmaW5lZChfTElOVVgpIHx8IGRlZmluZWQoX19saW51eF9fKQogI2luY2x1ZGUgPGFjcGkvcGxhdGZvcm0vYWNsaW51eGV4Lmg+CiAKLSNlbGlmIGRlZmluZWQoV0lOMzIpCi0jaW5jbHVkZSAiYWN3aW5leC5oIgotCi0jZWxpZiBkZWZpbmVkKF9BRURfRUZJKQotI2luY2x1ZGUgImFjZWZpZXguaCIKLQotI2VsaWYgZGVmaW5lZChfR05VX0VGSSkKLSNpbmNsdWRlICJhY2VmaWV4LmgiCi0KICNlbGlmIGRlZmluZWQoX19EcmFnb25GbHlfXykKICNpbmNsdWRlICJhY2RyYWdvbmZseWV4LmgiCiAKKy8qCisgKiBFRkkgYXBwbGljYXRpb25zIGNhbiBiZSBidWlsdCB3aXRoIC1ub3N0ZGxpYiwgaW4gdGhpcyBjYXNlLCBpdCBtdXN0IGJlCisgKiBpbmNsdWRlZCBhZnRlciBpbmNsdWRpbmcgYWxsIG90aGVyIGhvc3QgZW52aXJvbm1lbnRhbCBkZWZpbml0aW9ucywgaW4KKyAqIG9yZGVyIHRvIG92ZXJyaWRlIHRoZSBkZWZpbml0aW9ucy4KKyAqLworI2VsaWYgZGVmaW5lZChfQUVEX0VGSSkgfHwgZGVmaW5lZChfR05VX0VGSSkgfHwgZGVmaW5lZChfRURLMl9FRkkpCisjaW5jbHVkZSAiYWNlZmlleC5oIgorCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisjaW5jbHVkZSAiYWNnY2NleC5oIgorCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2luY2x1ZGUgImFjbXN2Y2V4LmgiCisKICNlbmRpZgogCiAvKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNnY2MuaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djYy5oCmluZGV4IGM1YTIxNmMuLjhmNjZhYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djYy5oCisrKyBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djYy5oCkBAIC00NCw2ICs0NCwxMiBAQAogI2lmbmRlZiBfX0FDR0NDX0hfXwogI2RlZmluZSBfX0FDR0NDX0hfXwogCisvKgorICogVXNlIGNvbXBpbGVyIHNwZWNpZmljIDxzdGRhcmcuaD4gaXMgYSBnb29kIHByYWN0aWNlIGZvciBldmVuIHdoZW4KKyAqIC1ub3N0ZGluYyBpcyBzcGVjaWZpZWQgKGkuZS4sIEFDUElfVVNFX1NUQU5EQVJEX0hFQURFUlMgdW5kZWZpbmVkLgorICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKICNkZWZpbmUgQUNQSV9JTkxJTkUgICAgICAgICAgICAgX19pbmxpbmVfXwogCiAvKiBGdW5jdGlvbiBuYW1lIGlzIHVzZWQgZm9yIGRlYnVnIG91dHB1dC4gTm9uLUFOU0ksIGNvbXBpbGVyLWRlcGVuZGVudCAqLwpAQCAtNjQsMTcgKzcwLDYgQEAKICAqLwogI2RlZmluZSBBQ1BJX1VOVVNFRF9WQVIgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpCiAKLS8qCi0gKiBTb21lIHZlcnNpb25zIG9mIGdjYyBpbXBsZW1lbnQgc3RyY2hyKCkgd2l0aCBhIGJ1Z2d5IG1hY3JvLiBTbywKLSAqIHVuZGVmIGl0IGhlcmUuIFByZXZlbnRzIGVycm9yIG1lc3NhZ2VzIG9mIHRoaXMgZm9ybSAodXN1YWxseSBmcm9tIHRoZQotICogZmlsZSBnZXRvcHQuYyk6Ci0gKgotICogZXJyb3I6IGxvZ2ljYWwgJyYmJyB3aXRoIG5vbi16ZXJvIGNvbnN0YW50IHdpbGwgYWx3YXlzIGV2YWx1YXRlIGFzIHRydWUKLSAqLwotI2lmZGVmIHN0cmNocgotI3VuZGVmIHN0cmNocgotI2VuZGlmCi0KIC8qIEdDQyBzdXBwb3J0cyBfX1ZBX0FSR1NfXyBpbiBtYWNyb3MgKi8KIAogI2RlZmluZSBDT01QSUxFUl9WQV9NQUNSTyAgICAgICAgICAgICAgIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2djY2V4LmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNnY2NleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWFkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNnY2NleC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBOYW1lOiBhY2djY2V4LmggLSBFeHRyYSBHQ0Mgc3BlY2lmaWMgZGVmaW5lcywgZXRjLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMTYsIEludGVsIENvcnAuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICogICAgc3Vic3RhbnRpYWxseSBzaW1pbGFyIHRvIHRoZSAiTk8gV0FSUkFOVFkiIGRpc2NsYWltZXIgYmVsb3cKKyAqICAgICgiRGlzY2xhaW1lciIpIGFuZCBhbnkgcmVkaXN0cmlidXRpb24gbXVzdCBiZSBjb25kaXRpb25lZCB1cG9uCisgKiAgICBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5IHNpbWlsYXIgRGlzY2xhaW1lciByZXF1aXJlbWVudCBmb3IgZnVydGhlcgorICogICAgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORworICogSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisgKi8KKworI2lmbmRlZiBfX0FDR0NDRVhfSF9fCisjZGVmaW5lIF9fQUNHQ0NFWF9IX18KKworLyoKKyAqIFNvbWUgdmVyc2lvbnMgb2YgZ2NjIGltcGxlbWVudCBzdHJjaHIoKSB3aXRoIGEgYnVnZ3kgbWFjcm8uIFNvLAorICogdW5kZWYgaXQgaGVyZS4gUHJldmVudHMgZXJyb3IgbWVzc2FnZXMgb2YgdGhpcyBmb3JtICh1c3VhbGx5IGZyb20gdGhlCisgKiBmaWxlIGdldG9wdC5jKToKKyAqCisgKiBlcnJvcjogbG9naWNhbCAnJiYnIHdpdGggbm9uLXplcm8gY29uc3RhbnQgd2lsbCBhbHdheXMgZXZhbHVhdGUgYXMgdHJ1ZQorICovCisjaWZkZWYgc3RyY2hyCisjdW5kZWYgc3RyY2hyCisjZW5kaWYKKworI2VuZGlmCQkJCS8qIF9fQUNHQ0NFWF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmggYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCmluZGV4IDkzYjYxYjEuLmE1ZDk4ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaApAQCAtOTIsNiArOTIsOCBAQAogI2luY2x1ZGUgPGFzbS9hY2Vudi5oPgogI2VuZGlmCiAKKyNkZWZpbmUgQUNQSV9JTklUX0ZVTkNUSU9OIF9faW5pdAorCiAjaWZuZGVmIENPTkZJR19BQ1BJCiAKIC8qIEV4dGVybmFsIGdsb2JhbHMgZm9yIF9fS0VSTkVMX18sIHN0dWJzIGlzIG5lZWRlZCAqLwpAQCAtMTY4LDEzICsxNzAsMjEgQEAKICNkZWZpbmUgQUNQSV9VU0VfQUxURVJOQVRFX1BST1RPVFlQRV9hY3BpX29zX2dldF9uZXh0X2ZpbGVuYW1lCiAjZGVmaW5lIEFDUElfVVNFX0FMVEVSTkFURV9QUk9UT1RZUEVfYWNwaV9vc19jbG9zZV9kaXJlY3RvcnkKIAorI2RlZmluZSBBQ1BJX01TR19FUlJPUiAgICAgICAgICBLRVJOX0VSUiAiQUNQSSBFcnJvcjogIgorI2RlZmluZSBBQ1BJX01TR19FWENFUFRJT04gICAgICBLRVJOX0VSUiAiQUNQSSBFeGNlcHRpb246ICIKKyNkZWZpbmUgQUNQSV9NU0dfV0FSTklORyAgICAgICAgS0VSTl9XQVJOSU5HICJBQ1BJIFdhcm5pbmc6ICIKKyNkZWZpbmUgQUNQSV9NU0dfSU5GTyAgICAgICAgICAgS0VSTl9JTkZPICJBQ1BJOiAiCisKKyNkZWZpbmUgQUNQSV9NU0dfQklPU19FUlJPUiAgICAgS0VSTl9FUlIgIkFDUEkgQklPUyBFcnJvciAoYnVnKTogIgorI2RlZmluZSBBQ1BJX01TR19CSU9TX1dBUk5JTkcgICBLRVJOX1dBUk5JTkcgIkFDUEkgQklPUyBXYXJuaW5nIChidWcpOiAiCisKICNlbHNlCQkJCS8qICFfX0tFUk5FTF9fICovCiAKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgorI2RlZmluZSBBQ1BJX1VTRV9TVEFOREFSRF9IRUFERVJTCisKKyNpZmRlZiBBQ1BJX1VTRV9TVEFOREFSRF9IRUFERVJTCiAjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKIAogLyogRGVmaW5lL2Rpc2FibGUga2VybmVsLXNwZWNpZmljIGRlY2xhcmF0b3JzICovCiAKQEAgLTIwNSw4ICsyMTUsNCBAQAogCiAjZW5kaWYJCQkJLyogX19LRVJORUxfXyAqLwogCi0vKiBMaW51eCB1c2VzIEdDQyAqLwotCi0jaW5jbHVkZSA8YWNwaS9wbGF0Zm9ybS9hY2djYy5oPgotCiAjZW5kaWYJCQkJLyogX19BQ0xJTlVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXhleC5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXhleC5oCmluZGV4IGY4YmIwZDguLmE1NTA5ZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4ZXguaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eGV4LmgKQEAgLTcxLDcgKzcxLDcgQEAKIC8qCiAgKiBPdmVycmlkZXMgZm9yIGluLWtlcm5lbCBBQ1BJQ0EKICAqLwotYWNwaV9zdGF0dXMgX19pbml0IGFjcGlfb3NfaW5pdGlhbGl6ZSh2b2lkKTsKK2FjcGlfc3RhdHVzIEFDUElfSU5JVF9GVU5DVElPTiBhY3BpX29zX2luaXRpYWxpemUodm9pZCk7CiAKIGFjcGlfc3RhdHVzIGFjcGlfb3NfdGVybWluYXRlKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKaW5kZXggYmZlNmIyZS4uZjNkYjExYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaApAQCAtMzU5LDcgKzM1OSw3IEBACiAgKiBvbmxpbmVkL29mZmxpbmVkLiBJbiBzdWNoIGNhc2UgdGhlIGZsYWdzLnRocm90dGxpbmcgd2lsbCBiZSB1cGRhdGVkLgogICovCiBleHRlcm4gdm9pZCBhY3BpX3Byb2Nlc3Nvcl9yZWV2YWx1YXRlX3RzdGF0ZShzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAotCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24pOworCQkJYm9vbCBpc19kZWFkKTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfZm9wczsKIGV4dGVybiB2b2lkIGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfaW5pdCh2b2lkKTsKICNlbHNlCkBAIC0zODAsNyArMzgwLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcHJvY2Vzc29yX3JlZXZhbHVhdGVfdHN0YXRlKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsCi0JCQl1bnNpZ25lZCBsb25nIGFjdGlvbikge30KKwkJCWJvb2wgaXNfZGVhZCkge30KIAogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcHJvY2Vzc29yX3Rocm90dGxpbmdfaW5pdCh2b2lkKSB7fQogI2VuZGlmCS8qIENPTkZJR19BQ1BJX0NQVV9GUkVRX1BTUyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VhY2Nlc3MuaAppbmRleCAxYmZhNjAyLi42ZGY5YjA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VhY2Nlc3MuaApAQCAtNzIsNiArNzIsNyBAQAogLyogUmV0dXJucyAwIGlmIGV4Y2VwdGlvbiBub3QgZm91bmQgYW5kIGZpeHVwIG90aGVyd2lzZS4gICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBzZWFyY2hfZXhjZXB0aW9uX3RhYmxlKHVuc2lnbmVkIGxvbmcpOwogCisKIC8qCiAgKiBhcmNoaXRlY3R1cmVzIHdpdGggYW4gTU1VIHNob3VsZCBvdmVycmlkZSB0aGVzZSB0d28KICAqLwpAQCAtMjMwLDE0ICsyMzEsMTggQEAKIAltaWdodF9mYXVsdCgpOwkJCQkJCVwKIAlhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIF9fcCwgc2l6ZW9mKCpwdHIpKSA/CQlcCiAJCV9fZ2V0X3VzZXIoKHgpLCAoX190eXBlb2ZfXygqKHB0cikpICopX19wKSA6CVwKLQkJLUVGQVVMVDsJCQkJCVwKKwkJKCh4KSA9IChfX3R5cGVvZl9fKCoocHRyKSkpMCwtRUZBVUxUKTsJCVwKIH0pCiAKICNpZm5kZWYgX19nZXRfdXNlcl9mbgogc3RhdGljIGlubGluZSBpbnQgX19nZXRfdXNlcl9mbihzaXplX3Qgc2l6ZSwgY29uc3Qgdm9pZCBfX3VzZXIgKnB0ciwgdm9pZCAqeCkKIHsKLQlzaXplID0gX19jb3B5X2Zyb21fdXNlcih4LCBwdHIsIHNpemUpOwotCXJldHVybiBzaXplID8gLUVGQVVMVCA6IHNpemU7CisJc2l6ZV90IG4gPSBfX2NvcHlfZnJvbV91c2VyKHgsIHB0ciwgc2l6ZSk7CisJaWYgKHVubGlrZWx5KG4pKSB7CisJCW1lbXNldCh4ICsgKHNpemUgLSBuKSwgMCwgbik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gMDsKIH0KIAogI2RlZmluZSBfX2dldF91c2VyX2ZuKHN6LCB1LCBrKQlfX2dldF91c2VyX2ZuKHN6LCB1LCBrKQpAQCAtMjU3LDExICsyNjIsMTMgQEAKIHN0YXRpYyBpbmxpbmUgbG9uZyBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywKIAkJY29uc3Qgdm9pZCBfX3VzZXIgKiBmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7CisJdW5zaWduZWQgbG9uZyByZXMgPSBuOwogCW1pZ2h0X2ZhdWx0KCk7Ci0JaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpCi0JCXJldHVybiBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKLQllbHNlCi0JCXJldHVybiBuOworCWlmIChsaWtlbHkoYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcm9tLCBuKSkpCisJCXJlcyA9IF9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pOworCWlmICh1bmxpa2VseShyZXMpKQorCQltZW1zZXQodG8gKyAobiAtIHJlcyksIDAsIHJlcyk7CisJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIGlubGluZSBsb25nIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0MTAuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQxMC5oCmluZGV4IDg1YjQ2N2IuLjZjYjRlOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQxMC5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQxMC5oCkBAIC0xOSw2ICsxOSw3IEBACiAjZGVmaW5lIENMS19GT1VUX01QTEwJCTQKICNkZWZpbmUgQ0xLX0ZPVVRfQlBMTAkJNQogI2RlZmluZSBDTEtfRk9VVF9LUExMCQk2CisjZGVmaW5lIENMS19GT1VUX0VQTEwJCTcKIAogLyogZ2F0ZSBmb3Igc3BlY2lhbCBjbG9ja3MgKHNjbGspICovCiAjZGVmaW5lIENMS19TQ0xLX1VBUlQwCQkxMjgKQEAgLTU1LDYgKzU2LDggQEAKICNkZWZpbmUgQ0xLX01NQzAJCTM1MQogI2RlZmluZSBDTEtfTU1DMQkJMzUyCiAjZGVmaW5lIENMS19NTUMyCQkzNTMKKyNkZWZpbmUgQ0xLX1BETUEwCQkzNjIKKyNkZWZpbmUgQ0xLX1BETUExCQkzNjMKICNkZWZpbmUgQ0xLX1VTQkgyMAkJMzY1CiAjZGVmaW5lIENMS19VU0JEMzAwCQkzNjYKICNkZWZpbmUgQ0xLX1VTQkQzMDEJCTM2NwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9leHlub3M1NDIwLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0MjAuaAppbmRleCAxN2FiODM5Li42ZmQyMWMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0MjAuaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0MjAuaApAQCAtMjE0LDYgKzIxNCw5IEBACiAjZGVmaW5lIENMS19NT1VUX1NXX0FDTEs0MDAgICAgIDY1MQogI2RlZmluZSBDTEtfTU9VVF9VU0VSX0FDTEszMDBfR1NDTAk2NTIKICNkZWZpbmUgQ0xLX01PVVRfU1dfQUNMSzMwMF9HU0NMCTY1MworI2RlZmluZSBDTEtfTU9VVF9NQ0xLX0NEUkVYCTY1NAorI2RlZmluZSBDTEtfTU9VVF9CUExMCQk2NTUKKyNkZWZpbmUgQ0xLX01PVVRfTVhfTVNQTExfQ0NPUkUJNjU2CiAKIC8qIGRpdmlkZXIgY2xvY2tzICovCiAjZGVmaW5lIENMS19ET1VUX1BJWEVMCQk3NjgKQEAgLTIzOSw4ICsyNDIsMTQgQEAKICNkZWZpbmUgQ0xLX0RPVVRfQUNMSzMwMF9ESVNQMQk3ODgKICNkZWZpbmUgQ0xLX0RPVVRfQUNMSzMwMF9HU0NMCTc4OQogI2RlZmluZSBDTEtfRE9VVF9BQ0xLNDAwX0RJU1AxCTc5MAorI2RlZmluZSBDTEtfRE9VVF9QQ0xLX0NEUkVYCTc5MQorI2RlZmluZSBDTEtfRE9VVF9TQ0xLX0NEUkVYCTc5MgorI2RlZmluZSBDTEtfRE9VVF9BQ0xLX0NEUkVYMQk3OTMKKyNkZWZpbmUgQ0xLX0RPVVRfQ0NMS19EUkVYMAk3OTQKKyNkZWZpbmUgQ0xLX0RPVVRfQ0xLMlhfUEhZMAk3OTUKKyNkZWZpbmUgQ0xLX0RPVVRfUENMS19DT1JFX01FTQk3OTYKIAogLyogbXVzdCBiZSBncmVhdGVyIHRoYW4gbWF4aW1hbCBjbG9jayBpZCAqLwotI2RlZmluZSBDTEtfTlJfQ0xLUwkJNzkxCisjZGVmaW5lIENMS19OUl9DTEtTCQk3OTcKIAogI2VuZGlmIC8qIF9EVF9CSU5ESU5HU19DTE9DS19FWFlOT1NfNTQyMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2V4eW5vczU0NDAuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQ0MC5oCmluZGV4IGM2NmZjNDAuLjg0MmNkYzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQ0MC5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZXh5bm9zNTQ0MC5oCkBAIC0xNCw2ICsxNCw4IEBACiAKICNkZWZpbmUgQ0xLX1hUQUwJCTEKICNkZWZpbmUgQ0xLX0FSTV9DTEsJCTIKKyNkZWZpbmUgQ0xLX0NQTExBCQkzCisjZGVmaW5lIENMS19DUExMQgkJNAogI2RlZmluZSBDTEtfU1BJX0JBVUQJCTE2CiAjZGVmaW5lIENMS19QQjBfMjUwCQkxNwogI2RlZmluZSBDTEtfUFIwXzI1MAkJMTgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZ3hiYi1hb2Nsa2MuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZ3hiYi1hb2Nsa2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTc1MTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9neGJiLWFvY2xrYy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQmF5TGlicmUsIFNBUy4KKyAqIEF1dGhvcjogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgQ09QWUlORy4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBCYXlMaWJyZSwgU0FTLgorICogQXV0aG9yOiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBEVF9CSU5ESU5HU19DTE9DS19BTUxPR0lDX01FU09OX0dYQkJfQU9DTEsKKyNkZWZpbmUgRFRfQklORElOR1NfQ0xPQ0tfQU1MT0dJQ19NRVNPTl9HWEJCX0FPQ0xLCisKKyNkZWZpbmUgQ0xLSURfQU9fUkVNT1RFCQkwCisjZGVmaW5lIENMS0lEX0FPX0kyQ19NQVNURVIJMQorI2RlZmluZSBDTEtJRF9BT19JMkNfU0xBVkUJMgorI2RlZmluZSBDTEtJRF9BT19VQVJUMQkJMworI2RlZmluZSBDTEtJRF9BT19VQVJUMgkJNAorI2RlZmluZSBDTEtJRF9BT19JUl9CTEFTVEVSCTUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2d4YmItY2xrYy5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9neGJiLWNsa2MuaAppbmRleCBmODg5ZDgwLi5jZTRhZDYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2d4YmItY2xrYy5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svZ3hiYi1jbGtjLmgKQEAgLTYsNyArNiwxNCBAQAogI2RlZmluZSBfX0dYQkJfQ0xLQ19ICiAKICNkZWZpbmUgQ0xLSURfQ1BVQ0xLCQkxCisjZGVmaW5lIENMS0lEX0hETUlfUExMCQkyCisjZGVmaW5lIENMS0lEX0ZDTEtfRElWMgkJNAorI2RlZmluZSBDTEtJRF9GQ0xLX0RJVjMJCTUKKyNkZWZpbmUgQ0xLSURfRkNMS19ESVY0CQk2CiAjZGVmaW5lIENMS0lEX0NMSzgxCQkxMgogI2RlZmluZSBDTEtJRF9FVEgJCTM2CisjZGVmaW5lIENMS0lEX1NEX0VNTUNfQQkJOTQKKyNkZWZpbmUgQ0xLSURfU0RfRU1NQ19CCQk5NQorI2RlZmluZSBDTEtJRF9TRF9FTU1DX0MJCTk2CiAKICNlbmRpZiAvKiBfX0dYQkJfQ0xLQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL2lteDUtY2xvY2suaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svaW14NS1jbG9jay5oCmluZGV4IGY0Yjc0NzguLmQzODJmYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svaW14NS1jbG9jay5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svaW14NS1jbG9jay5oCkBAIC0yMDEsNiArMjAxLDE5IEBACiAjZGVmaW5lIElNWDVfQ0xLX1NURVBfU0VMCQkxODkKICNkZWZpbmUgSU1YNV9DTEtfQ1BVX1BPREZfU0VMCQkxOTAKICNkZWZpbmUgSU1YNV9DTEtfQVJNCQkJMTkxCi0jZGVmaW5lIElNWDVfQ0xLX0VORAkJCTE5MgorI2RlZmluZSBJTVg1X0NMS19GSVJJX1BSRUQJCTE5MgorI2RlZmluZSBJTVg1X0NMS19GSVJJX1NFTAkJMTkzCisjZGVmaW5lIElNWDVfQ0xLX0ZJUklfUE9ERgkJMTk0CisjZGVmaW5lIElNWDVfQ0xLX0ZJUklfU0VSSUFMX0dBVEUJMTk1CisjZGVmaW5lIElNWDVfQ0xLX0ZJUklfSVBHX0dBVEUJCTE5NgorI2RlZmluZSBJTVg1X0NMS19DU0kwX01DTEsxX1BSRUQJMTk3CisjZGVmaW5lIElNWDVfQ0xLX0NTSTBfTUNMSzFfU0VMCQkxOTgKKyNkZWZpbmUgSU1YNV9DTEtfQ1NJMF9NQ0xLMV9QT0RGCTE5OQorI2RlZmluZSBJTVg1X0NMS19DU0kwX01DTEsxX0dBVEUJMjAwCisjZGVmaW5lIElNWDVfQ0xLX0lFRUUxNTg4X1BSRUQJCTIwMQorI2RlZmluZSBJTVg1X0NMS19JRUVFMTU4OF9TRUwJCTIwMgorI2RlZmluZSBJTVg1X0NMS19JRUVFMTU4OF9QT0RGCQkyMDMKKyNkZWZpbmUgSU1YNV9DTEtfSUVFRTE1ODhfR0FURQkJMjA0CisjZGVmaW5lIElNWDVfQ0xLX0VORAkJCTIwNQogCiAjZW5kaWYgLyogX19EVF9CSU5ESU5HU19DTE9DS19JTVg1X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svaW14NnFkbC1jbG9jay5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9pbXg2cWRsLWNsb2NrLmgKaW5kZXggMjkwNTAzMy4uZGE1OWZkOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9pbXg2cWRsLWNsb2NrLmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9pbXg2cWRsLWNsb2NrLmgKQEAgLTI2OSw2ICsyNjksOCBAQAogI2RlZmluZSBJTVg2UURMX0NMS19QUkcwX0FQQgkJCTI1NgogI2RlZmluZSBJTVg2UURMX0NMS19QUkcxX0FQQgkJCTI1NwogI2RlZmluZSBJTVg2UURMX0NMS19QUkVfQVhJCQkJMjU4Ci0jZGVmaW5lIElNWDZRRExfQ0xLX0VORAkJCQkyNTkKKyNkZWZpbmUgSU1YNlFETF9DTEtfTUxCX1NFTAkJCTI1OQorI2RlZmluZSBJTVg2UURMX0NMS19NTEJfUE9ERgkJCTI2MAorI2RlZmluZSBJTVg2UURMX0NMS19FTkQJCQkJMjYxCiAKICNlbmRpZiAvKiBfX0RUX0JJTkRJTkdTX0NMT0NLX0lNWDZRRExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzYyMC5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tYXhpbSxtYXg3NzYyMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYWJhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL21heGltLG1heDc3NjIwLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBOVklESUEgQ09SUE9SQVRJT04uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEZXZpY2UgVHJlZSBiaW5kaW5nIGNvbnN0YW50cyBjbG9ja3MgZm9yIHRoZSBNYXhpbSA3NzYyMCBQTUlDLgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX0NMT0NLX01BWElNX01BWDc3NjIwX0NMT0NLX0gKKyNkZWZpbmUgX0RUX0JJTkRJTkdTX0NMT0NLX01BWElNX01BWDc3NjIwX0NMT0NLX0gKKworLyogRml4ZWQgcmF0ZSBjbG9ja3MuICovCisKKyNkZWZpbmUgTUFYNzc2MjBfQ0xLXzMyS19PVVQwCQkwCisKKy8qIFRvdGFsIG51bWJlciBvZiBjbG9ja3MuICovCisjZGVmaW5lIE1BWDc3NjIwX0NMS1NfTlVNCQkoTUFYNzc2MjBfQ0xLXzMyS19PVVQwICsgMSkKKworI2VuZGlmIC8qIF9EVF9CSU5ESU5HU19DTE9DS19NQVhJTV9NQVg3NzYyMF9DTE9DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL21lc29uOGItY2xrYy5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tZXNvbjhiLWNsa2MuaAppbmRleCA1OTVhNThkLi5hNTVmZjhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL21lc29uOGItY2xrYy5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svbWVzb244Yi1jbGtjLmgKQEAgLTIyLDYgKzIyLDQgQEAKICNkZWZpbmUgQ0xLSURfTVBFR19TRUwJCTE0CiAjZGVmaW5lIENMS0lEX01QRUdfRElWCQkxNQogCi0jZGVmaW5lIENMS19OUl9DTEtTCQkoQ0xLSURfTVBFR19ESVYgKyAxKQotCiAjZW5kaWYgLyogX19NRVNPTjhCX0NMS0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tdDI3MDEtY2xrLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL210MjcwMS1jbGsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDYyYzY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9tdDI3MDEtY2xrLmgKQEAgLTAsMCArMSw0ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTWVkaWFUZWsgSW5jLgorICogQXV0aG9yOiBTaHVubGkgV2FuZyA8c2h1bmxpLndhbmdAbWVkaWF0ZWsuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19DTEtfTVQyNzAxX0gKKyNkZWZpbmUgX0RUX0JJTkRJTkdTX0NMS19NVDI3MDFfSAorCisvKiBUT1BDS0dFTiAqLworI2RlZmluZSBDTEtfVE9QX1NZU1BMTAkJCQkxCisjZGVmaW5lIENMS19UT1BfU1lTUExMX0QyCQkJMgorI2RlZmluZSBDTEtfVE9QX1NZU1BMTF9EMwkJCTMKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTExfRDUJCQk0CisjZGVmaW5lIENMS19UT1BfU1lTUExMX0Q3CQkJNQorI2RlZmluZSBDTEtfVE9QX1NZU1BMTDFfRDIJCQk2CisjZGVmaW5lIENMS19UT1BfU1lTUExMMV9ENAkJCTcKKyNkZWZpbmUgQ0xLX1RPUF9TWVNQTEwxX0Q4CQkJOAorI2RlZmluZSBDTEtfVE9QX1NZU1BMTDFfRDE2CQkJOQorI2RlZmluZSBDTEtfVE9QX1NZU1BMTDJfRDIJCQkxMAorI2RlZmluZSBDTEtfVE9QX1NZU1BMTDJfRDQJCQkxMQorI2RlZmluZSBDTEtfVE9QX1NZU1BMTDJfRDgJCQkxMgorI2RlZmluZSBDTEtfVE9QX1NZU1BMTDNfRDIJCQkxMworI2RlZmluZSBDTEtfVE9QX1NZU1BMTDNfRDQJCQkxNAorI2RlZmluZSBDTEtfVE9QX1NZU1BMTDRfRDIJCQkxNQorI2RlZmluZSBDTEtfVE9QX1NZU1BMTDRfRDQJCQkxNgorI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwJCQkJMTcKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMX0QyCQkJMTgKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMX0QzCQkJMTkKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMX0Q1CQkJMjAKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMX0Q3CQkJMjEKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMX0QyNgkJCTIyCisjZGVmaW5lIENMS19UT1BfVU5JVlBMTF9ENTIJCQkyMworI2RlZmluZSBDTEtfVE9QX1VOSVZQTExfRDEwOAkJCTI0CisjZGVmaW5lIENMS19UT1BfVVNCX1BIWTQ4TQkJCTI1CisjZGVmaW5lIENMS19UT1BfVU5JVlBMTDFfRDIJCQkyNgorI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwxX0Q0CQkJMjcKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMMV9EOAkJCTI4CisjZGVmaW5lIENMS19UT1BfVU5JVlBMTDJfRDIJCQkyOQorI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwyX0Q0CQkJMzAKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMMl9EOAkJCTMxCisjZGVmaW5lIENMS19UT1BfVU5JVlBMTDJfRDE2CQkJMzIKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMMl9EMzIJCQkzMworI2RlZmluZSBDTEtfVE9QX1VOSVZQTEwzX0QyCQkJMzQKKyNkZWZpbmUgQ0xLX1RPUF9VTklWUExMM19ENAkJCTM1CisjZGVmaW5lIENMS19UT1BfVU5JVlBMTDNfRDgJCQkzNgorI2RlZmluZSBDTEtfVE9QX01TRENQTEwJCQkJMzcKKyNkZWZpbmUgQ0xLX1RPUF9NU0RDUExMX0QyCQkJMzgKKyNkZWZpbmUgQ0xLX1RPUF9NU0RDUExMX0Q0CQkJMzkKKyNkZWZpbmUgQ0xLX1RPUF9NU0RDUExMX0Q4CQkJNDAKKyNkZWZpbmUgQ0xLX1RPUF9NTVBMTAkJCQk0MQorI2RlZmluZSBDTEtfVE9QX01NUExMX0QyCQkJNDIKKyNkZWZpbmUgQ0xLX1RPUF9ETVBMTAkJCQk0MworI2RlZmluZSBDTEtfVE9QX0RNUExMX0QyCQkJNDQKKyNkZWZpbmUgQ0xLX1RPUF9ETVBMTF9ENAkJCTQ1CisjZGVmaW5lIENMS19UT1BfRE1QTExfWDIJCQk0NgorI2RlZmluZSBDTEtfVE9QX1RWRFBMTAkJCQk0NworI2RlZmluZSBDTEtfVE9QX1RWRFBMTF9EMgkJCTQ4CisjZGVmaW5lIENMS19UT1BfVFZEUExMX0Q0CQkJNDkKKyNkZWZpbmUgQ0xLX1RPUF9UVkQyUExMCQkJCTUwCisjZGVmaW5lIENMS19UT1BfVFZEMlBMTF9EMgkJCTUxCisjZGVmaW5lIENMS19UT1BfSEFERFMyUExMXzk4TQkJCTUyCisjZGVmaW5lIENMS19UT1BfSEFERFMyUExMXzI5NE0JCQk1MworI2RlZmluZSBDTEtfVE9QX0hBRERTMl9GQgkJCTU0CisjZGVmaW5lIENMS19UT1BfTUlQSVBMTF9EMgkJCTU1CisjZGVmaW5lIENMS19UT1BfTUlQSVBMTF9ENAkJCTU2CisjZGVmaW5lIENMS19UT1BfSERNSVBMTAkJCQk1NworI2RlZmluZSBDTEtfVE9QX0hETUlQTExfRDIJCQk1OAorI2RlZmluZSBDTEtfVE9QX0hETUlQTExfRDMJCQk1OQorI2RlZmluZSBDTEtfVE9QX0hETUlfU0NMX1JYCQkJNjAKKyNkZWZpbmUgQ0xLX1RPUF9IRE1JXzBfUElYMzQwTQkJCTYxCisjZGVmaW5lIENMS19UT1BfSERNSV8wX0RFRVAzNDBNCQkJNjIKKyNkZWZpbmUgQ0xLX1RPUF9IRE1JXzBfUExMMzQwTQkJCTYzCisjZGVmaW5lIENMS19UT1BfQVVEMVBMTF85OE0JCQk2NAorI2RlZmluZSBDTEtfVE9QX0FVRDJQTExfOTBNCQkJNjUKKyNkZWZpbmUgQ0xLX1RPUF9BVURQTEwJCQkJNjYKKyNkZWZpbmUgQ0xLX1RPUF9BVURQTExfRDQJCQk2NworI2RlZmluZSBDTEtfVE9QX0FVRFBMTF9EOAkJCTY4CisjZGVmaW5lIENMS19UT1BfQVVEUExMX0QxNgkJCTY5CisjZGVmaW5lIENMS19UT1BfQVVEUExMX0QyNAkJCTcwCisjZGVmaW5lIENMS19UT1BfRVRIUExMXzUwME0JCQk3MQorI2RlZmluZSBDTEtfVE9QX1ZERUNQTEwJCQkJNzIKKyNkZWZpbmUgQ0xLX1RPUF9WRU5DUExMCQkJCTczCisjZGVmaW5lIENMS19UT1BfTUlQSVBMTAkJCQk3NAorI2RlZmluZSBDTEtfVE9QX0FSTVBMTF8xUDNHCQkJNzUKKworI2RlZmluZSBDTEtfVE9QX01NX1NFTAkJCQk3NgorI2RlZmluZSBDTEtfVE9QX0REUlBIWUNGR19TRUwJCQk3NworI2RlZmluZSBDTEtfVE9QX01FTV9TRUwJCQkJNzgKKyNkZWZpbmUgQ0xLX1RPUF9BWElfU0VMCQkJCTc5CisjZGVmaW5lIENMS19UT1BfQ0FNVEdfU0VMCQkJODAKKyNkZWZpbmUgQ0xLX1RPUF9NRkdfU0VMCQkJCTgxCisjZGVmaW5lIENMS19UT1BfVkRFQ19TRUwJCQk4MgorI2RlZmluZSBDTEtfVE9QX1BXTV9TRUwJCQkJODMKKyNkZWZpbmUgQ0xLX1RPUF9NU0RDMzBfMF9TRUwJCQk4NAorI2RlZmluZSBDTEtfVE9QX1VTQjIwX1NFTAkJCTg1CisjZGVmaW5lIENMS19UT1BfU1BJMF9TRUwJCQk4NgorI2RlZmluZSBDTEtfVE9QX1VBUlRfU0VMCQkJODcKKyNkZWZpbmUgQ0xLX1RPUF9BVURJTlRCVVNfU0VMCQkJODgKKyNkZWZpbmUgQ0xLX1RPUF9BVURJT19TRUwJCQk4OQorI2RlZmluZSBDTEtfVE9QX01TREMzMF8yX1NFTAkJCTkwCisjZGVmaW5lIENMS19UT1BfTVNEQzMwXzFfU0VMCQkJOTEKKyNkZWZpbmUgQ0xLX1RPUF9EUEkxX1NFTAkJCTkyCisjZGVmaW5lIENMS19UT1BfRFBJMF9TRUwJCQk5MworI2RlZmluZSBDTEtfVE9QX1NDUF9TRUwJCQkJOTQKKyNkZWZpbmUgQ0xLX1RPUF9QTUlDU1BJX1NFTAkJCTk1CisjZGVmaW5lIENMS19UT1BfQVBMTF9TRUwJCQk5NgorI2RlZmluZSBDTEtfVE9QX0hETUlfU0VMCQkJOTcKKyNkZWZpbmUgQ0xLX1RPUF9UVkVfU0VMCQkJCTk4CisjZGVmaW5lIENMS19UT1BfRU1NQ19IQ0xLX1NFTAkJCTk5CisjZGVmaW5lIENMS19UT1BfTkZJMlhfU0VMCQkJMTAwCisjZGVmaW5lIENMS19UT1BfUlRDX1NFTAkJCQkxMDEKKyNkZWZpbmUgQ0xLX1RPUF9PU0RfU0VMCQkJCTEwMgorI2RlZmluZSBDTEtfVE9QX05SX1NFTAkJCQkxMDMKKyNkZWZpbmUgQ0xLX1RPUF9ESV9TRUwJCQkJMTA0CisjZGVmaW5lIENMS19UT1BfRkxBU0hfU0VMCQkJMTA1CisjZGVmaW5lIENMS19UT1BfQVNNX01fU0VMCQkJMTA2CisjZGVmaW5lIENMS19UT1BfQVNNX0lfU0VMCQkJMTA3CisjZGVmaW5lIENMS19UT1BfSU5URElSX1NFTAkJCTEwOAorI2RlZmluZSBDTEtfVE9QX0hETUlSWF9CSVNUX1NFTAkJCTEwOQorI2RlZmluZSBDTEtfVE9QX0VUSElGX1NFTAkJCTExMAorI2RlZmluZSBDTEtfVE9QX01TX0NBUkRfU0VMCQkJMTExCisjZGVmaW5lIENMS19UT1BfQVNNX0hfU0VMCQkJMTEyCisjZGVmaW5lIENMS19UT1BfU1BJMV9TRUwJCQkxMTMKKyNkZWZpbmUgQ0xLX1RPUF9DTVNZU19TRUwJCQkxMTQKKyNkZWZpbmUgQ0xLX1RPUF9NU0RDMzBfM19TRUwJCQkxMTUKKyNkZWZpbmUgQ0xLX1RPUF9IRE1JUlgyNl8yNF9TRUwJCQkxMTYKKyNkZWZpbmUgQ0xLX1RPUF9BVUQyRFZEX1NFTAkJCTExNworI2RlZmluZSBDTEtfVE9QXzhCREFDX1NFTAkJCTExOAorI2RlZmluZSBDTEtfVE9QX1NQSTJfU0VMCQkJMTE5CisjZGVmaW5lIENMS19UT1BfQVVEX01VWDFfU0VMCQkJMTIwCisjZGVmaW5lIENMS19UT1BfQVVEX01VWDJfU0VMCQkJMTIxCisjZGVmaW5lIENMS19UT1BfQVVEUExMX01VWF9TRUwJCQkxMjIKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzFfU1JDX1NFTAkJCTEyMworI2RlZmluZSBDTEtfVE9QX0FVRF9LMl9TUkNfU0VMCQkJMTI0CisjZGVmaW5lIENMS19UT1BfQVVEX0szX1NSQ19TRUwJCQkxMjUKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzRfU1JDX1NFTAkJCTEyNgorI2RlZmluZSBDTEtfVE9QX0FVRF9LNV9TUkNfU0VMCQkJMTI3CisjZGVmaW5lIENMS19UT1BfQVVEX0s2X1NSQ19TRUwJCQkxMjgKKyNkZWZpbmUgQ0xLX1RPUF9QQURNQ0xLX1NFTAkJCTEyOQorI2RlZmluZSBDTEtfVE9QX0FVRF9FWFRDSzFfRElWCQkJMTMwCisjZGVmaW5lIENMS19UT1BfQVVEX0VYVENLMl9ESVYJCQkxMzEKKyNkZWZpbmUgQ0xLX1RPUF9BVURfTVVYMV9ESVYJCQkxMzIKKyNkZWZpbmUgQ0xLX1RPUF9BVURfTVVYMl9ESVYJCQkxMzMKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzFfU1JDX0RJVgkJCTEzNAorI2RlZmluZSBDTEtfVE9QX0FVRF9LMl9TUkNfRElWCQkJMTM1CisjZGVmaW5lIENMS19UT1BfQVVEX0szX1NSQ19ESVYJCQkxMzYKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSzRfU1JDX0RJVgkJCTEzNworI2RlZmluZSBDTEtfVE9QX0FVRF9LNV9TUkNfRElWCQkJMTM4CisjZGVmaW5lIENMS19UT1BfQVVEX0s2X1NSQ19ESVYJCQkxMzkKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSTJTMV9NQ0xLCQkJMTQwCisjZGVmaW5lIENMS19UT1BfQVVEX0kyUzJfTUNMSwkJCTE0MQorI2RlZmluZSBDTEtfVE9QX0FVRF9JMlMzX01DTEsJCQkxNDIKKyNkZWZpbmUgQ0xLX1RPUF9BVURfSTJTNF9NQ0xLCQkJMTQzCisjZGVmaW5lIENMS19UT1BfQVVEX0kyUzVfTUNMSwkJCTE0NAorI2RlZmluZSBDTEtfVE9QX0FVRF9JMlM2X01DTEsJCQkxNDUKKyNkZWZpbmUgQ0xLX1RPUF9BVURfNDhLX1RJTUlORwkJCTE0NgorI2RlZmluZSBDTEtfVE9QX0FVRF80NEtfVElNSU5HCQkJMTQ3CisKKyNkZWZpbmUgQ0xLX1RPUF8zMktfSU5URVJOQUwJCQkxNDgKKyNkZWZpbmUgQ0xLX1RPUF8zMktfRVhURVJOQUwJCQkxNDkKKyNkZWZpbmUgQ0xLX1RPUF9DTEsyNk1fRDgJCQkxNTAKKyNkZWZpbmUgQ0xLX1RPUF84QkRBQwkJCQkxNTEKKyNkZWZpbmUgQ0xLX1RPUF9XQkdfRElHXzQxNk0JCQkxNTIKKyNkZWZpbmUgQ0xLX1RPUF9EUEkJCQkJMTUzCisjZGVmaW5lIENMS19UT1BfSERNSVRYX0NMS0RJR19DVFMJCTE1NAorI2RlZmluZSBDTEtfVE9QX0RTSTBfTE5UQ19EU0kJCQkxNTUKKyNkZWZpbmUgQ0xLX1RPUF9BVURfRVhUMQkJCTE1NgorI2RlZmluZSBDTEtfVE9QX0FVRF9FWFQyCQkJMTU3CisjZGVmaW5lIENMS19UT1BfTkZJMVhfUEFECQkJMTU4CisjZGVmaW5lIENMS19UT1BfTlIJCQkJMTU5CisKKy8qIEFQTUlYRURTWVMgKi8KKworI2RlZmluZSBDTEtfQVBNSVhFRF9BUk1QTEwJCQkxCisjZGVmaW5lIENMS19BUE1JWEVEX01BSU5QTEwJCQkyCisjZGVmaW5lIENMS19BUE1JWEVEX1VOSVZQTEwJCQkzCisjZGVmaW5lIENMS19BUE1JWEVEX01NUExMCQkJNAorI2RlZmluZSBDTEtfQVBNSVhFRF9NU0RDUExMCQkJNQorI2RlZmluZSBDTEtfQVBNSVhFRF9UVkRQTEwJCQk2CisjZGVmaW5lIENMS19BUE1JWEVEX0FVRDFQTEwJCQk3CisjZGVmaW5lIENMS19BUE1JWEVEX1RSR1BMTAkJCTgKKyNkZWZpbmUgQ0xLX0FQTUlYRURfRVRIUExMCQkJOQorI2RlZmluZSBDTEtfQVBNSVhFRF9WREVDUExMCQkJMTAKKyNkZWZpbmUgQ0xLX0FQTUlYRURfSEFERFMyUExMCQkJMTEKKyNkZWZpbmUgQ0xLX0FQTUlYRURfQVVEMlBMTAkJCTEyCisjZGVmaW5lIENMS19BUE1JWEVEX1RWRDJQTEwJCQkxMworI2RlZmluZSBDTEtfQVBNSVhFRF9OUgkJCQkxNAorCisvKiBERFJQSFkgKi8KKworI2RlZmluZSBDTEtfRERSUEhZX1ZFTkNQTEwJCQkxCisjZGVmaW5lIENMS19ERFJQSFlfTlIJCQkJMgorCisvKiBJTkZSQUNGRyAqLworCisjZGVmaW5lIENMS19JTkZSQV9EQkcJCQkJMQorI2RlZmluZSBDTEtfSU5GUkFfU01JCQkJCTIKKyNkZWZpbmUgQ0xLX0lORlJBX1FBWElfQ000CQkJMworI2RlZmluZSBDTEtfSU5GUkFfQVVEX1NQTElOX0IJCQk0CisjZGVmaW5lIENMS19JTkZSQV9BVURJTwkJCQk1CisjZGVmaW5lIENMS19JTkZSQV9FRlVTRQkJCQk2CisjZGVmaW5lIENMS19JTkZSQV9MMkNfU1JBTQkJCTcKKyNkZWZpbmUgQ0xLX0lORlJBX000VQkJCQk4CisjZGVmaW5lIENMS19JTkZSQV9DT05OTUNVCQkJOQorI2RlZmluZSBDTEtfSU5GUkFfVFJORwkJCQkxMAorI2RlZmluZSBDTEtfSU5GUkFfUkFNQlVGSUYJCQkxMQorI2RlZmluZSBDTEtfSU5GUkFfQ1BVTQkJCQkxMgorI2RlZmluZSBDTEtfSU5GUkFfS1AJCQkJMTMKKyNkZWZpbmUgQ0xLX0lORlJBX0NFQwkJCQkxNAorI2RlZmluZSBDTEtfSU5GUkFfSVJSWAkJCQkxNQorI2RlZmluZSBDTEtfSU5GUkFfUE1JQ1NQSQkJCTE2CisjZGVmaW5lIENMS19JTkZSQV9QTUlDV1JBUAkJCTE3CisjZGVmaW5lIENMS19JTkZSQV9ERENDSQkJCQkxOAorI2RlZmluZSBDTEtfSU5GUkFfQ0xLXzEzTQkJCTE5CisjZGVmaW5lIENMS19JTkZSQV9OUgkJCQkyMAorCisvKiBQRVJJQ0ZHICovCisKKyNkZWZpbmUgQ0xLX1BFUklfTkZJCQkJCTEKKyNkZWZpbmUgQ0xLX1BFUklfVEhFUk0JCQkJMgorI2RlZmluZSBDTEtfUEVSSV9QV00xCQkJCTMKKyNkZWZpbmUgQ0xLX1BFUklfUFdNMgkJCQk0CisjZGVmaW5lIENMS19QRVJJX1BXTTMJCQkJNQorI2RlZmluZSBDTEtfUEVSSV9QV000CQkJCTYKKyNkZWZpbmUgQ0xLX1BFUklfUFdNNQkJCQk3CisjZGVmaW5lIENMS19QRVJJX1BXTTYJCQkJOAorI2RlZmluZSBDTEtfUEVSSV9QV003CQkJCTkKKyNkZWZpbmUgQ0xLX1BFUklfUFdNCQkJCTEwCisjZGVmaW5lIENMS19QRVJJX1VTQjAJCQkJMTEKKyNkZWZpbmUgQ0xLX1BFUklfVVNCMQkJCQkxMgorI2RlZmluZSBDTEtfUEVSSV9BUF9ETUEJCQkJMTMKKyNkZWZpbmUgQ0xLX1BFUklfTVNEQzMwXzAJCQkxNAorI2RlZmluZSBDTEtfUEVSSV9NU0RDMzBfMQkJCTE1CisjZGVmaW5lIENMS19QRVJJX01TREMzMF8yCQkJMTYKKyNkZWZpbmUgQ0xLX1BFUklfTVNEQzMwXzMJCQkxNworI2RlZmluZSBDTEtfUEVSSV9NU0RDNTBfMwkJCTE4CisjZGVmaW5lIENMS19QRVJJX05MSQkJCQkxOQorI2RlZmluZSBDTEtfUEVSSV9VQVJUMAkJCQkyMAorI2RlZmluZSBDTEtfUEVSSV9VQVJUMQkJCQkyMQorI2RlZmluZSBDTEtfUEVSSV9VQVJUMgkJCQkyMgorI2RlZmluZSBDTEtfUEVSSV9VQVJUMwkJCQkyMworI2RlZmluZSBDTEtfUEVSSV9CVElGCQkJCTI0CisjZGVmaW5lIENMS19QRVJJX0kyQzAJCQkJMjUKKyNkZWZpbmUgQ0xLX1BFUklfSTJDMQkJCQkyNgorI2RlZmluZSBDTEtfUEVSSV9JMkMyCQkJCTI3CisjZGVmaW5lIENMS19QRVJJX0kyQzMJCQkJMjgKKyNkZWZpbmUgQ0xLX1BFUklfQVVYQURDCQkJCTI5CisjZGVmaW5lIENMS19QRVJJX1NQSTAJCQkJMzAKKyNkZWZpbmUgQ0xLX1BFUklfRVRICQkJCTMxCisjZGVmaW5lIENMS19QRVJJX1VTQjBfTUNVCQkJMzIKKworI2RlZmluZSBDTEtfUEVSSV9VU0IxX01DVQkJCTMzCisjZGVmaW5lIENMS19QRVJJX1VTQl9TTFYJCQkzNAorI2RlZmluZSBDTEtfUEVSSV9HQ1BVCQkJCTM1CisjZGVmaW5lIENMS19QRVJJX05GSV9FQ0MJCQkzNgorI2RlZmluZSBDTEtfUEVSSV9ORklfUEFECQkJMzcKKyNkZWZpbmUgQ0xLX1BFUklfRkxBU0gJCQkJMzgKKyNkZWZpbmUgQ0xLX1BFUklfSE9TVDg5X0lOVAkJCTM5CisjZGVmaW5lIENMS19QRVJJX0hPU1Q4OV9TUEkJCQk0MAorI2RlZmluZSBDTEtfUEVSSV9IT1NUODlfRFZECQkJNDEKKyNkZWZpbmUgQ0xLX1BFUklfU1BJMQkJCQk0MgorI2RlZmluZSBDTEtfUEVSSV9TUEkyCQkJCTQzCisjZGVmaW5lIENMS19QRVJJX0ZDSQkJCQk0NAorCisjZGVmaW5lIENMS19QRVJJX1VBUlQwX1NFTAkJCTQ1CisjZGVmaW5lIENMS19QRVJJX1VBUlQxX1NFTAkJCTQ2CisjZGVmaW5lIENMS19QRVJJX1VBUlQyX1NFTAkJCTQ3CisjZGVmaW5lIENMS19QRVJJX1VBUlQzX1NFTAkJCTQ4CisjZGVmaW5lIENMS19QRVJJX05SCQkJCTQ5CisKKy8qIEFVRElPICovCisKKyNkZWZpbmUgQ0xLX0FVRF9BRkUJCQkJMQorI2RlZmluZSBDTEtfQVVEX0xSQ0tfREVURUNUCQkJMgorI2RlZmluZSBDTEtfQVVEX0kyUwkJCQkzCisjZGVmaW5lIENMS19BVURfQVBMTF9UVU5FUgkJCTQKKyNkZWZpbmUgQ0xLX0FVRF9IRE1JCQkJCTUKKyNkZWZpbmUgQ0xLX0FVRF9TUERGCQkJCTYKKyNkZWZpbmUgQ0xLX0FVRF9TUERGMgkJCQk3CisjZGVmaW5lIENMS19BVURfQVBMTAkJCQk4CisjZGVmaW5lIENMS19BVURfVE1MCQkJCTkKKyNkZWZpbmUgQ0xLX0FVRF9BSEJfSURMRV9FWFQJCQkxMAorI2RlZmluZSBDTEtfQVVEX0FIQl9JRExFX0lOVAkJCTExCisKKyNkZWZpbmUgQ0xLX0FVRF9JMlNJTjEJCQkJMTIKKyNkZWZpbmUgQ0xLX0FVRF9JMlNJTjIJCQkJMTMKKyNkZWZpbmUgQ0xLX0FVRF9JMlNJTjMJCQkJMTQKKyNkZWZpbmUgQ0xLX0FVRF9JMlNJTjQJCQkJMTUKKyNkZWZpbmUgQ0xLX0FVRF9JMlNJTjUJCQkJMTYKKyNkZWZpbmUgQ0xLX0FVRF9JMlNJTjYJCQkJMTcKKyNkZWZpbmUgQ0xLX0FVRF9JMlNPMQkJCQkxOAorI2RlZmluZSBDTEtfQVVEX0kyU08yCQkJCTE5CisjZGVmaW5lIENMS19BVURfSTJTTzMJCQkJMjAKKyNkZWZpbmUgQ0xLX0FVRF9JMlNPNAkJCQkyMQorI2RlZmluZSBDTEtfQVVEX0kyU081CQkJCTIyCisjZGVmaW5lIENMS19BVURfSTJTTzYJCQkJMjMKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDSTEJCQkJMjQKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDSTIJCQkJMjUKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDTzEJCQkJMjYKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDTzIJCQkJMjcKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDMTEJCQkJMjgKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDMTIJCQkJMjkKKyNkZWZpbmUgQ0xLX0FVRF9IRE1JUlgJCQkJMzAKKyNkZWZpbmUgQ0xLX0FVRF9JTlRESVIJCQkJMzEKKyNkZWZpbmUgQ0xLX0FVRF9BMVNZUwkJCQkzMgorI2RlZmluZSBDTEtfQVVEX0EyU1lTCQkJCTMzCisjZGVmaW5lIENMS19BVURfQUZFX0NPTk4JCQkzNAorI2RlZmluZSBDTEtfQVVEX0FGRV9QQ01JRgkJCTM1CisjZGVmaW5lIENMS19BVURfQUZFX01SR0lGCQkJMzYKKworI2RlZmluZSBDTEtfQVVEX01NSUZfVUwxCQkJMzcKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX1VMMgkJCTM4CisjZGVmaW5lIENMS19BVURfTU1JRl9VTDMJCQkzOQorI2RlZmluZSBDTEtfQVVEX01NSUZfVUw0CQkJNDAKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX1VMNQkJCTQxCisjZGVmaW5lIENMS19BVURfTU1JRl9VTDYJCQk0MgorI2RlZmluZSBDTEtfQVVEX01NSUZfREwxCQkJNDMKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX0RMMgkJCTQ0CisjZGVmaW5lIENMS19BVURfTU1JRl9ETDMJCQk0NQorI2RlZmluZSBDTEtfQVVEX01NSUZfREw0CQkJNDYKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX0RMNQkJCTQ3CisjZGVmaW5lIENMS19BVURfTU1JRl9ETDYJCQk0OAorI2RlZmluZSBDTEtfQVVEX01NSUZfRExNQ0gJCQk0OQorI2RlZmluZSBDTEtfQVVEX01NSUZfQVJCMQkJCTUwCisjZGVmaW5lIENMS19BVURfTU1JRl9BV0IxCQkJNTEKKyNkZWZpbmUgQ0xLX0FVRF9NTUlGX0FXQjIJCQk1MgorI2RlZmluZSBDTEtfQVVEX01NSUZfREFJCQkJNTMKKworI2RlZmluZSBDTEtfQVVEX0RNSUMxCQkJCTU0CisjZGVmaW5lIENMS19BVURfRE1JQzIJCQkJNTUKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDSTMJCQkJNTYKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDSTQJCQkJNTcKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDSTUJCQkJNTgKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDSTYJCQkJNTkKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDTzMJCQkJNjAKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDTzQJCQkJNjEKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDTzUJCQkJNjIKKyNkZWZpbmUgQ0xLX0FVRF9BU1JDTzYJCQkJNjMKKyNkZWZpbmUgQ0xLX0FVRF9NRU1fQVNSQzEJCQk2NAorI2RlZmluZSBDTEtfQVVEX01FTV9BU1JDMgkJCTY1CisjZGVmaW5lIENMS19BVURfTUVNX0FTUkMzCQkJNjYKKyNkZWZpbmUgQ0xLX0FVRF9NRU1fQVNSQzQJCQk2NworI2RlZmluZSBDTEtfQVVEX01FTV9BU1JDNQkJCTY4CisjZGVmaW5lIENMS19BVURfRFNEX0VOQwkJCQk2OQorI2RlZmluZSBDTEtfQVVEX0FTUkNfQlJHCQkJNzAKKyNkZWZpbmUgQ0xLX0FVRF9OUgkJCQk3MQorCisvKiBNTVNZUyAqLworCisjZGVmaW5lIENMS19NTV9TTUlfQ09NTU9OCQkJMQorI2RlZmluZSBDTEtfTU1fU01JX0xBUkIwCQkJMgorI2RlZmluZSBDTEtfTU1fQ01EUQkJCQkzCisjZGVmaW5lIENMS19NTV9NVVRFWAkJCQk0CisjZGVmaW5lIENMS19NTV9ESVNQX0NPTE9SCQkJNQorI2RlZmluZSBDTEtfTU1fRElTUF9CTFMJCQkJNgorI2RlZmluZSBDTEtfTU1fRElTUF9XRE1BCQkJNworI2RlZmluZSBDTEtfTU1fRElTUF9SRE1BCQkJOAorI2RlZmluZSBDTEtfTU1fRElTUF9PVkwJCQkJOQorI2RlZmluZSBDTEtfTU1fTURQX1REU0hQCQkJMTAKKyNkZWZpbmUgQ0xLX01NX01EUF9XUk9UCQkJCTExCisjZGVmaW5lIENMS19NTV9NRFBfV0RNQQkJCQkxMgorI2RlZmluZSBDTEtfTU1fTURQX1JTWjEJCQkJMTMKKyNkZWZpbmUgQ0xLX01NX01EUF9SU1owCQkJCTE0CisjZGVmaW5lIENMS19NTV9NRFBfUkRNQQkJCQkxNQorI2RlZmluZSBDTEtfTU1fTURQX0JMU18yNk0JCQkxNgorI2RlZmluZSBDTEtfTU1fQ0FNX01EUAkJCQkxNworI2RlZmluZSBDTEtfTU1fRkFLRV9FTkcJCQkJMTgKKyNkZWZpbmUgQ0xLX01NX01VVEVYXzMySwkJCTE5CisjZGVmaW5lIENMS19NTV9ESVNQX1JETUExCQkJMjAKKyNkZWZpbmUgQ0xLX01NX0RJU1BfVUZPRQkJCTIxCisKKyNkZWZpbmUgQ0xLX01NX0RTSV9FTkdJTkUJCQkyMgorI2RlZmluZSBDTEtfTU1fRFNJX0RJRwkJCQkyMworI2RlZmluZSBDTEtfTU1fRFBJX0RJR0wJCQkJMjQKKyNkZWZpbmUgQ0xLX01NX0RQSV9FTkdJTkUJCQkyNQorI2RlZmluZSBDTEtfTU1fRFBJMV9ESUdMCQkJMjYKKyNkZWZpbmUgQ0xLX01NX0RQSTFfRU5HSU5FCQkJMjcKKyNkZWZpbmUgQ0xLX01NX1RWRV9PVVRQVVQJCQkyOAorI2RlZmluZSBDTEtfTU1fVFZFX0lOUFVUCQkJMjkKKyNkZWZpbmUgQ0xLX01NX0hETUlfUElYRUwJCQkzMAorI2RlZmluZSBDTEtfTU1fSERNSV9QTEwJCQkJMzEKKyNkZWZpbmUgQ0xLX01NX0hETUlfQVVESU8JCQkzMgorI2RlZmluZSBDTEtfTU1fSERNSV9TUERJRgkJCTMzCisjZGVmaW5lIENMS19NTV9UVkVfRk1NCQkJCTM0CisjZGVmaW5lIENMS19NTV9OUgkJCQkzNQorCisvKiBJTUdTWVMgKi8KKworI2RlZmluZSBDTEtfSU1HX1NNSV9DT01NCQkJMQorI2RlZmluZSBDTEtfSU1HX1JFU1oJCQkJMgorI2RlZmluZSBDTEtfSU1HX0pQR0RFQ19TTUkJCQkzCisjZGVmaW5lIENMS19JTUdfSlBHREVDCQkJCTQKKyNkZWZpbmUgQ0xLX0lNR19WRU5DX0xUCQkJCTUKKyNkZWZpbmUgQ0xLX0lNR19WRU5DCQkJCTYKKyNkZWZpbmUgQ0xLX0lNR19OUgkJCQk3CisKKy8qIFZERUMgKi8KKworI2RlZmluZSBDTEtfVkRFQ19DS0dFTgkJCQkxCisjZGVmaW5lIENMS19WREVDX0xBUkIJCQkJMgorI2RlZmluZSBDTEtfVkRFQ19OUgkJCQkzCisKKy8qIEhJRlNZUyAqLworCisjZGVmaW5lIENMS19ISUZTWVNfVVNCMFBIWQkJCTEKKyNkZWZpbmUgQ0xLX0hJRlNZU19VU0IxUEhZCQkJMgorI2RlZmluZSBDTEtfSElGU1lTX1BDSUUwCQkJMworI2RlZmluZSBDTEtfSElGU1lTX1BDSUUxCQkJNAorI2RlZmluZSBDTEtfSElGU1lTX1BDSUUyCQkJNQorI2RlZmluZSBDTEtfSElGU1lTX05SCQkJCTYKKworLyogRVRIU1lTICovCisjZGVmaW5lIENMS19FVEhTWVNfSFNETUEJCQkxCisjZGVmaW5lIENMS19FVEhTWVNfRVNXCQkJCTIKKyNkZWZpbmUgQ0xLX0VUSFNZU19HUDIJCQkJMworI2RlZmluZSBDTEtfRVRIU1lTX0dQMQkJCQk0CisjZGVmaW5lIENMS19FVEhTWVNfUENNCQkJCTUKKyNkZWZpbmUgQ0xLX0VUSFNZU19HRE1BCQkJCTYKKyNkZWZpbmUgQ0xLX0VUSFNZU19JMlMJCQkJNworI2RlZmluZSBDTEtfRVRIU1lTX0NSWVBUTwkJCTgKKyNkZWZpbmUgQ0xLX0VUSFNZU19OUgkJCQk5CisKKy8qIEJEUCAqLworCisjZGVmaW5lIENMS19CRFBfQlJHX0JBCQkJCTEKKyNkZWZpbmUgQ0xLX0JEUF9CUkdfRFJBTQkJCTIKKyNkZWZpbmUgQ0xLX0JEUF9MQVJCX0RSQU0JCQkzCisjZGVmaW5lIENMS19CRFBfV1JfVkRJX1BYTAkJCTQKKyNkZWZpbmUgQ0xLX0JEUF9XUl9WRElfRFJBTQkJCTUKKyNkZWZpbmUgQ0xLX0JEUF9XUl9CCQkJCTYKKyNkZWZpbmUgQ0xLX0JEUF9ER0lfSU4JCQkJNworI2RlZmluZSBDTEtfQkRQX0RHSV9PVVQJCQkJOAorI2RlZmluZSBDTEtfQkRQX0ZNVF9NQVNUXzI3CQkJOQorI2RlZmluZSBDTEtfQkRQX0ZNVF9CCQkJCTEwCisjZGVmaW5lIENMS19CRFBfT1NEX0IJCQkJMTEKKyNkZWZpbmUgQ0xLX0JEUF9PU0RfRFJBTQkJCTEyCisjZGVmaW5lIENMS19CRFBfT1NEX0FHRU5UCQkJMTMKKyNkZWZpbmUgQ0xLX0JEUF9PU0RfUFhMCQkJCTE0CisjZGVmaW5lIENMS19CRFBfUkxFX0IJCQkJMTUKKyNkZWZpbmUgQ0xLX0JEUF9STEVfQUdFTlQJCQkxNgorI2RlZmluZSBDTEtfQkRQX1JMRV9EUkFNCQkJMTcKKyNkZWZpbmUgQ0xLX0JEUF9GMjdNCQkJCTE4CisjZGVmaW5lIENMS19CRFBfRjI3TV9WRE9VVAkJCTE5CisjZGVmaW5lIENMS19CRFBfRjI3Xzc0Xzc0CQkJMjAKKyNkZWZpbmUgQ0xLX0JEUF9GMkZTCQkJCTIxCisjZGVmaW5lIENMS19CRFBfRjJGUzc0XzE0OAkJCTIyCisjZGVmaW5lIENMS19CRFBfRkIJCQkJMjMKKyNkZWZpbmUgQ0xLX0JEUF9WRE9fRFJBTQkJCTI0CisjZGVmaW5lIENMS19CRFBfVkRPXzJGUwkJCQkyNQorI2RlZmluZSBDTEtfQkRQX1ZET19CCQkJCTI2CisjZGVmaW5lIENMS19CRFBfV1JfRElfUFhMCQkJMjcKKyNkZWZpbmUgQ0xLX0JEUF9XUl9ESV9EUkFNCQkJMjgKKyNkZWZpbmUgQ0xLX0JEUF9XUl9ESV9CCQkJCTI5CisjZGVmaW5lIENMS19CRFBfTlJfUFhMCQkJCTMwCisjZGVmaW5lIENMS19CRFBfTlJfRFJBTQkJCQkzMQorI2RlZmluZSBDTEtfQkRQX05SX0IJCQkJMzIKKworI2RlZmluZSBDTEtfQkRQX1JYX0YJCQkJMzMKKyNkZWZpbmUgQ0xLX0JEUF9SWF9YCQkJCTM0CisjZGVmaW5lIENMS19CRFBfUlhQRFQJCQkJMzUKKyNkZWZpbmUgQ0xLX0JEUF9SWF9DU0NMX04JCQkzNgorI2RlZmluZSBDTEtfQkRQX1JYX0NTQ0wJCQkJMzcKKyNkZWZpbmUgQ0xLX0JEUF9SWF9ERENTQ0xfTgkJCTM4CisjZGVmaW5lIENMS19CRFBfUlhfRERDU0NMCQkJMzkKKyNkZWZpbmUgQ0xLX0JEUF9SWF9WQ08JCQkJNDAKKyNkZWZpbmUgQ0xLX0JEUF9SWF9EUAkJCQk0MQorI2RlZmluZSBDTEtfQkRQX1JYX1AJCQkJNDIKKyNkZWZpbmUgQ0xLX0JEUF9SWF9NCQkJCTQzCisjZGVmaW5lIENMS19CRFBfUlhfUExMCQkJCTQ0CisjZGVmaW5lIENMS19CRFBfQlJHX1JUX0IJCQk0NQorI2RlZmluZSBDTEtfQkRQX0JSR19SVF9EUkFNCQkJNDYKKyNkZWZpbmUgQ0xLX0JEUF9MQVJCUlRfRFJBTQkJCTQ3CisjZGVmaW5lIENMS19CRFBfVE1EU19TWU4JCQk0OAorI2RlZmluZSBDTEtfQkRQX0hETUlfTU9OCQkJNDkKKyNkZWZpbmUgQ0xLX0JEUF9OUgkJCQk1MAorCisjZW5kaWYgLyogX0RUX0JJTkRJTkdTX0NMS19NVDI3MDFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1tZG05NjE1LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLW1kbTk2MTUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWIyYzQwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1tZG05NjE1LmgKQEAgLTAsMCArMSwzMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSBCYXlMaWJyZSwgU0FTLgorICogQXV0aG9yIDogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfRFRfQklORElOR1NfQ0xLX01ETV9HQ0NfOTYxNV9ICisjZGVmaW5lIF9EVF9CSU5ESU5HU19DTEtfTURNX0dDQ185NjE1X0gKKworI2RlZmluZSBBRkFCX0NMS19TUkMJCQkJMAorI2RlZmluZSBBRkFCX0NPUkVfQ0xLCQkJCTEKKyNkZWZpbmUgU0ZBQl9NU1NfUTZfU1dfQV9DTEsJCQkyCisjZGVmaW5lIFNGQUJfTVNTX1E2X0ZXX0FfQ0xLCQkJMworI2RlZmluZSBRRFNTX1NUTV9DTEsJCQkJNAorI2RlZmluZSBTQ1NTX0FfQ0xLCQkJCTUKKyNkZWZpbmUgU0NTU19IX0NMSwkJCQk2CisjZGVmaW5lIFNDU1NfWE9fU1JDX0NMSwkJCQk3CisjZGVmaW5lIEFGQUJfRUJJMV9DSDBfQV9DTEsJCQk4CisjZGVmaW5lIEFGQUJfRUJJMV9DSDFfQV9DTEsJCQk5CisjZGVmaW5lIEFGQUJfQVhJX1MwX0ZDTEsJCQkxMAorI2RlZmluZSBBRkFCX0FYSV9TMV9GQ0xLCQkJMTEKKyNkZWZpbmUgQUZBQl9BWElfUzJfRkNMSwkJCTEyCisjZGVmaW5lIEFGQUJfQVhJX1MzX0ZDTEsJCQkxMworI2RlZmluZSBBRkFCX0FYSV9TNF9GQ0xLCQkJMTQKKyNkZWZpbmUgU0ZBQl9DT1JFX0NMSwkJCQkxNQorI2RlZmluZSBTRkFCX0FYSV9TMF9GQ0xLCQkJMTYKKyNkZWZpbmUgU0ZBQl9BWElfUzFfRkNMSwkJCTE3CisjZGVmaW5lIFNGQUJfQVhJX1MyX0ZDTEsJCQkxOAorI2RlZmluZSBTRkFCX0FYSV9TM19GQ0xLCQkJMTkKKyNkZWZpbmUgU0ZBQl9BWElfUzRfRkNMSwkJCTIwCisjZGVmaW5lIFNGQUJfQUhCX1MwX0ZDTEsJCQkyMQorI2RlZmluZSBTRkFCX0FIQl9TMV9GQ0xLCQkJMjIKKyNkZWZpbmUgU0ZBQl9BSEJfUzJfRkNMSwkJCTIzCisjZGVmaW5lIFNGQUJfQUhCX1MzX0ZDTEsJCQkyNAorI2RlZmluZSBTRkFCX0FIQl9TNF9GQ0xLCQkJMjUKKyNkZWZpbmUgU0ZBQl9BSEJfUzVfRkNMSwkJCTI2CisjZGVmaW5lIFNGQUJfQUhCX1M2X0ZDTEsJCQkyNworI2RlZmluZSBTRkFCX0FIQl9TN19GQ0xLCQkJMjgKKyNkZWZpbmUgUURTU19BVF9DTEtfU1JDCQkJCTI5CisjZGVmaW5lIFFEU1NfQVRfQ0xLCQkJCTMwCisjZGVmaW5lIFFEU1NfVFJBQ0VDTEtJTl9DTEtfU1JDCQkJMzEKKyNkZWZpbmUgUURTU19UUkFDRUNMS0lOX0NMSwkJCTMyCisjZGVmaW5lIFFEU1NfVFNDVFJfQ0xLX1NSQwkJCTMzCisjZGVmaW5lIFFEU1NfVFNDVFJfQ0xLCQkJCTM0CisjZGVmaW5lIFNGQUJfQURNMF9NMF9BX0NMSwkJCTM1CisjZGVmaW5lIFNGQUJfQURNMF9NMV9BX0NMSwkJCTM2CisjZGVmaW5lIFNGQUJfQURNMF9NMl9IX0NMSwkJCTM3CisjZGVmaW5lIEFETTBfQ0xLCQkJCTM4CisjZGVmaW5lIEFETTBfUEJVU19DTEsJCQkJMzkKKyNkZWZpbmUgTVNTX1hQVV9DTEsJCQkJNDAKKyNkZWZpbmUgSU1FTTBfQV9DTEsJCQkJNDEKKyNkZWZpbmUgUURTU19IX0NMSwkJCQk0MgorI2RlZmluZSBQQ0lFX0FfQ0xLCQkJCTQzCisjZGVmaW5lIFBDSUVfQVVYX0NMSwkJCQk0NAorI2RlZmluZSBQQ0lFX1BIWV9SRUZfQ0xLCQkJNDUKKyNkZWZpbmUgUENJRV9IX0NMSwkJCQk0NgorI2RlZmluZSBTRkFCX0NMS19TUkMJCQkJNDcKKyNkZWZpbmUgTUFIQjBfQ0xLCQkJCTQ4CisjZGVmaW5lIFE2U1dfQ0xLX1NSQwkJCQk0OQorI2RlZmluZSBRNlNXX0NMSwkJCQk1MAorI2RlZmluZSBRNkZXX0NMS19TUkMJCQkJNTEKKyNkZWZpbmUgUTZGV19DTEsJCQkJNTIKKyNkZWZpbmUgU0ZBQl9NU1NfTV9BX0NMSwkJCTUzCisjZGVmaW5lIFNGQUJfVVNCM19NX0FfQ0xLCQkJNTQKKyNkZWZpbmUgU0ZBQl9MUEFTU19RNl9BX0NMSwkJCTU1CisjZGVmaW5lIFNGQUJfQUZBQl9NX0FfQ0xLCQkJNTYKKyNkZWZpbmUgQUZBQl9TRkFCX00wX0FfQ0xLCQkJNTcKKyNkZWZpbmUgQUZBQl9TRkFCX00xX0FfQ0xLCQkJNTgKKyNkZWZpbmUgU0ZBQl9TQVRBX1NfSF9DTEsJCQk1OQorI2RlZmluZSBERkFCX0NMS19TUkMJCQkJNjAKKyNkZWZpbmUgREZBQl9DTEsJCQkJNjEKKyNkZWZpbmUgU0ZBQl9ERkFCX01fQV9DTEsJCQk2MgorI2RlZmluZSBERkFCX1NGQUJfTV9BX0NMSwkJCTYzCisjZGVmaW5lIERGQUJfU1dBWTBfSF9DTEsJCQk2NAorI2RlZmluZSBERkFCX1NXQVkxX0hfQ0xLCQkJNjUKKyNkZWZpbmUgREZBQl9BUkIwX0hfQ0xLCQkJCTY2CisjZGVmaW5lIERGQUJfQVJCMV9IX0NMSwkJCQk2NworI2RlZmluZSBQUFNTX0hfQ0xLCQkJCTY4CisjZGVmaW5lIFBQU1NfUFJPQ19DTEsJCQkJNjkKKyNkZWZpbmUgUFBTU19USU1FUjBfQ0xLCQkJCTcwCisjZGVmaW5lIFBQU1NfVElNRVIxX0NMSwkJCQk3MQorI2RlZmluZSBQTUVNX0FfQ0xLCQkJCTcyCisjZGVmaW5lIERNQV9CQU1fSF9DTEsJCQkJNzMKKyNkZWZpbmUgU0lDX0hfQ0xLCQkJCTc0CisjZGVmaW5lIFNQU19USUNfSF9DTEsJCQkJNzUKKyNkZWZpbmUgU0xJTUJVU19IX0NMSwkJCQk3NgorI2RlZmluZSBTTElNQlVTX1hPX1NSQ19DTEsJCQk3NworI2RlZmluZSBDRlBCXzJYX0NMS19TUkMJCQkJNzgKKyNkZWZpbmUgQ0ZQQl9DTEsJCQkJNzkKKyNkZWZpbmUgQ0ZQQjBfSF9DTEsJCQkJODAKKyNkZWZpbmUgQ0ZQQjFfSF9DTEsJCQkJODEKKyNkZWZpbmUgQ0ZQQjJfSF9DTEsJCQkJODIKKyNkZWZpbmUgU0ZBQl9DRlBCX01fSF9DTEsJCQk4MworI2RlZmluZSBDRlBCX01BU1RFUl9IX0NMSwkJCTg0CisjZGVmaW5lIFNGQUJfQ0ZQQl9TX0hfQ0xLCQkJODUKKyNkZWZpbmUgQ0ZQQl9TUExJVFRFUl9IX0NMSwkJCTg2CisjZGVmaW5lIFRTSUZfSF9DTEsJCQkJODcKKyNkZWZpbmUgVFNJRl9JTkFDVElWSVRZX1RJTUVSU19DTEsJCTg4CisjZGVmaW5lIFRTSUZfUkVGX1NSQwkJCQk4OQorI2RlZmluZSBUU0lGX1JFRl9DTEsJCQkJOTAKKyNkZWZpbmUgQ0UxX0hfQ0xLCQkJCTkxCisjZGVmaW5lIENFMV9DT1JFX0NMSwkJCQk5MgorI2RlZmluZSBDRTFfU0xFRVBfQ0xLCQkJCTkzCisjZGVmaW5lIENFMl9IX0NMSwkJCQk5NAorI2RlZmluZSBDRTJfQ09SRV9DTEsJCQkJOTUKKyNkZWZpbmUgU0ZQQl9IX0NMS19TUkMJCQkJOTcKKyNkZWZpbmUgU0ZQQl9IX0NMSwkJCQk5OAorI2RlZmluZSBTRkFCX1NGUEJfTV9IX0NMSwkJCTk5CisjZGVmaW5lIFNGQUJfU0ZQQl9TX0hfQ0xLCQkJMTAwCisjZGVmaW5lIFJQTV9QUk9DX0NMSwkJCQkxMDEKKyNkZWZpbmUgUlBNX0JVU19IX0NMSwkJCQkxMDIKKyNkZWZpbmUgUlBNX1NMRUVQX0NMSwkJCQkxMDMKKyNkZWZpbmUgUlBNX1RJTUVSX0NMSwkJCQkxMDQKKyNkZWZpbmUgUlBNX01TR19SQU1fSF9DTEsJCQkxMDUKKyNkZWZpbmUgUE1JQ19BUkIwX0hfQ0xLCQkJCTEwNgorI2RlZmluZSBQTUlDX0FSQjFfSF9DTEsJCQkJMTA3CisjZGVmaW5lIFBNSUNfU1NCSTJfU1JDCQkJCTEwOAorI2RlZmluZSBQTUlDX1NTQkkyX0NMSwkJCQkxMDkKKyNkZWZpbmUgU0RDMV9IX0NMSwkJCQkxMTAKKyNkZWZpbmUgU0RDMl9IX0NMSwkJCQkxMTEKKyNkZWZpbmUgU0RDM19IX0NMSwkJCQkxMTIKKyNkZWZpbmUgU0RDNF9IX0NMSwkJCQkxMTMKKyNkZWZpbmUgU0RDNV9IX0NMSwkJCQkxMTQKKyNkZWZpbmUgU0RDMV9TUkMJCQkJMTE1CisjZGVmaW5lIFNEQzJfU1JDCQkJCTExNgorI2RlZmluZSBTREMzX1NSQwkJCQkxMTcKKyNkZWZpbmUgU0RDNF9TUkMJCQkJMTE4CisjZGVmaW5lIFNEQzVfU1JDCQkJCTExOQorI2RlZmluZSBTREMxX0NMSwkJCQkxMjAKKyNkZWZpbmUgU0RDMl9DTEsJCQkJMTIxCisjZGVmaW5lIFNEQzNfQ0xLCQkJCTEyMgorI2RlZmluZSBTREM0X0NMSwkJCQkxMjMKKyNkZWZpbmUgU0RDNV9DTEsJCQkJMTI0CisjZGVmaW5lIERGQUJfQTJfSF9DTEsJCQkJMTI1CisjZGVmaW5lIFVTQl9IUzFfSF9DTEsJCQkJMTI2CisjZGVmaW5lIFVTQl9IUzFfWENWUl9TUkMJCQkxMjcKKyNkZWZpbmUgVVNCX0hTMV9YQ1ZSX0NMSwkJCTEyOAorI2RlZmluZSBVU0JfSFNJQ19IX0NMSwkJCQkxMjkKKyNkZWZpbmUgVVNCX0hTSUNfWENWUl9GU19TUkMJCQkxMzAKKyNkZWZpbmUgVVNCX0hTSUNfWENWUl9GU19DTEsJCQkxMzEKKyNkZWZpbmUgVVNCX0hTSUNfU1lTVEVNX0NMS19TUkMJCQkxMzIKKyNkZWZpbmUgVVNCX0hTSUNfU1lTVEVNX0NMSwkJCTEzMworI2RlZmluZSBDRlBCMF9DMF9IX0NMSwkJCQkxMzQKKyNkZWZpbmUgQ0ZQQjBfQzFfSF9DTEsJCQkJMTM1CisjZGVmaW5lIENGUEIwX0QwX0hfQ0xLCQkJCTEzNgorI2RlZmluZSBDRlBCMF9EMV9IX0NMSwkJCQkxMzcKKyNkZWZpbmUgVVNCX0ZTMV9IX0NMSwkJCQkxMzgKKyNkZWZpbmUgVVNCX0ZTMV9YQ1ZSX0ZTX1NSQwkJCTEzOQorI2RlZmluZSBVU0JfRlMxX1hDVlJfRlNfQ0xLCQkJMTQwCisjZGVmaW5lIFVTQl9GUzFfU1lTVEVNX0NMSwkJCTE0MQorI2RlZmluZSBVU0JfRlMyX0hfQ0xLCQkJCTE0MgorI2RlZmluZSBVU0JfRlMyX1hDVlJfRlNfU1JDCQkJMTQzCisjZGVmaW5lIFVTQl9GUzJfWENWUl9GU19DTEsJCQkxNDQKKyNkZWZpbmUgVVNCX0ZTMl9TWVNURU1fQ0xLCQkJMTQ1CisjZGVmaW5lIEdTQklfQ09NTU9OX1NJTV9TUkMJCQkxNDYKKyNkZWZpbmUgR1NCSTFfSF9DTEsJCQkJMTQ3CisjZGVmaW5lIEdTQkkyX0hfQ0xLCQkJCTE0OAorI2RlZmluZSBHU0JJM19IX0NMSwkJCQkxNDkKKyNkZWZpbmUgR1NCSTRfSF9DTEsJCQkJMTUwCisjZGVmaW5lIEdTQkk1X0hfQ0xLCQkJCTE1MQorI2RlZmluZSBHU0JJNl9IX0NMSwkJCQkxNTIKKyNkZWZpbmUgR1NCSTdfSF9DTEsJCQkJMTUzCisjZGVmaW5lIEdTQkk4X0hfQ0xLCQkJCTE1NAorI2RlZmluZSBHU0JJOV9IX0NMSwkJCQkxNTUKKyNkZWZpbmUgR1NCSTEwX0hfQ0xLCQkJCTE1NgorI2RlZmluZSBHU0JJMTFfSF9DTEsJCQkJMTU3CisjZGVmaW5lIEdTQkkxMl9IX0NMSwkJCQkxNTgKKyNkZWZpbmUgR1NCSTFfVUFSVF9TUkMJCQkJMTU5CisjZGVmaW5lIEdTQkkxX1VBUlRfQ0xLCQkJCTE2MAorI2RlZmluZSBHU0JJMl9VQVJUX1NSQwkJCQkxNjEKKyNkZWZpbmUgR1NCSTJfVUFSVF9DTEsJCQkJMTYyCisjZGVmaW5lIEdTQkkzX1VBUlRfU1JDCQkJCTE2MworI2RlZmluZSBHU0JJM19VQVJUX0NMSwkJCQkxNjQKKyNkZWZpbmUgR1NCSTRfVUFSVF9TUkMJCQkJMTY1CisjZGVmaW5lIEdTQkk0X1VBUlRfQ0xLCQkJCTE2NgorI2RlZmluZSBHU0JJNV9VQVJUX1NSQwkJCQkxNjcKKyNkZWZpbmUgR1NCSTVfVUFSVF9DTEsJCQkJMTY4CisjZGVmaW5lIEdTQkk2X1VBUlRfU1JDCQkJCTE2OQorI2RlZmluZSBHU0JJNl9VQVJUX0NMSwkJCQkxNzAKKyNkZWZpbmUgR1NCSTdfVUFSVF9TUkMJCQkJMTcxCisjZGVmaW5lIEdTQkk3X1VBUlRfQ0xLCQkJCTE3MgorI2RlZmluZSBHU0JJOF9VQVJUX1NSQwkJCQkxNzMKKyNkZWZpbmUgR1NCSThfVUFSVF9DTEsJCQkJMTc0CisjZGVmaW5lIEdTQkk5X1VBUlRfU1JDCQkJCTE3NQorI2RlZmluZSBHU0JJOV9VQVJUX0NMSwkJCQkxNzYKKyNkZWZpbmUgR1NCSTEwX1VBUlRfU1JDCQkJCTE3NworI2RlZmluZSBHU0JJMTBfVUFSVF9DTEsJCQkJMTc4CisjZGVmaW5lIEdTQkkxMV9VQVJUX1NSQwkJCQkxNzkKKyNkZWZpbmUgR1NCSTExX1VBUlRfQ0xLCQkJCTE4MAorI2RlZmluZSBHU0JJMTJfVUFSVF9TUkMJCQkJMTgxCisjZGVmaW5lIEdTQkkxMl9VQVJUX0NMSwkJCQkxODIKKyNkZWZpbmUgR1NCSTFfUVVQX1NSQwkJCQkxODMKKyNkZWZpbmUgR1NCSTFfUVVQX0NMSwkJCQkxODQKKyNkZWZpbmUgR1NCSTJfUVVQX1NSQwkJCQkxODUKKyNkZWZpbmUgR1NCSTJfUVVQX0NMSwkJCQkxODYKKyNkZWZpbmUgR1NCSTNfUVVQX1NSQwkJCQkxODcKKyNkZWZpbmUgR1NCSTNfUVVQX0NMSwkJCQkxODgKKyNkZWZpbmUgR1NCSTRfUVVQX1NSQwkJCQkxODkKKyNkZWZpbmUgR1NCSTRfUVVQX0NMSwkJCQkxOTAKKyNkZWZpbmUgR1NCSTVfUVVQX1NSQwkJCQkxOTEKKyNkZWZpbmUgR1NCSTVfUVVQX0NMSwkJCQkxOTIKKyNkZWZpbmUgR1NCSTZfUVVQX1NSQwkJCQkxOTMKKyNkZWZpbmUgR1NCSTZfUVVQX0NMSwkJCQkxOTQKKyNkZWZpbmUgR1NCSTdfUVVQX1NSQwkJCQkxOTUKKyNkZWZpbmUgR1NCSTdfUVVQX0NMSwkJCQkxOTYKKyNkZWZpbmUgR1NCSThfUVVQX1NSQwkJCQkxOTcKKyNkZWZpbmUgR1NCSThfUVVQX0NMSwkJCQkxOTgKKyNkZWZpbmUgR1NCSTlfUVVQX1NSQwkJCQkxOTkKKyNkZWZpbmUgR1NCSTlfUVVQX0NMSwkJCQkyMDAKKyNkZWZpbmUgR1NCSTEwX1FVUF9TUkMJCQkJMjAxCisjZGVmaW5lIEdTQkkxMF9RVVBfQ0xLCQkJCTIwMgorI2RlZmluZSBHU0JJMTFfUVVQX1NSQwkJCQkyMDMKKyNkZWZpbmUgR1NCSTExX1FVUF9DTEsJCQkJMjA0CisjZGVmaW5lIEdTQkkxMl9RVVBfU1JDCQkJCTIwNQorI2RlZmluZSBHU0JJMTJfUVVQX0NMSwkJCQkyMDYKKyNkZWZpbmUgR1NCSTFfU0lNX0NMSwkJCQkyMDcKKyNkZWZpbmUgR1NCSTJfU0lNX0NMSwkJCQkyMDgKKyNkZWZpbmUgR1NCSTNfU0lNX0NMSwkJCQkyMDkKKyNkZWZpbmUgR1NCSTRfU0lNX0NMSwkJCQkyMTAKKyNkZWZpbmUgR1NCSTVfU0lNX0NMSwkJCQkyMTEKKyNkZWZpbmUgR1NCSTZfU0lNX0NMSwkJCQkyMTIKKyNkZWZpbmUgR1NCSTdfU0lNX0NMSwkJCQkyMTMKKyNkZWZpbmUgR1NCSThfU0lNX0NMSwkJCQkyMTQKKyNkZWZpbmUgR1NCSTlfU0lNX0NMSwkJCQkyMTUKKyNkZWZpbmUgR1NCSTEwX1NJTV9DTEsJCQkJMjE2CisjZGVmaW5lIEdTQkkxMV9TSU1fQ0xLCQkJCTIxNworI2RlZmluZSBHU0JJMTJfU0lNX0NMSwkJCQkyMTgKKyNkZWZpbmUgVVNCX0hTSUNfSFNJQ19DTEtfU1JDCQkJMjE5CisjZGVmaW5lIFVTQl9IU0lDX0hTSUNfQ0xLCQkJMjIwCisjZGVmaW5lIFVTQl9IU0lDX0hTSU9fQ0FMX0NMSwkJCTIyMQorI2RlZmluZSBTUERNX0NGR19IX0NMSwkJCQkyMjIKKyNkZWZpbmUgU1BETV9NU1RSX0hfQ0xLCQkJCTIyMworI2RlZmluZSBTUERNX0ZGX0NMS19TUkMJCQkJMjI0CisjZGVmaW5lIFNQRE1fRkZfQ0xLCQkJCTIyNQorI2RlZmluZSBTRUNfQ1RSTF9DTEsJCQkJMjI2CisjZGVmaW5lIFNFQ19DVFJMX0FDQ19DTEtfU1JDCQkJMjI3CisjZGVmaW5lIFNFQ19DVFJMX0FDQ19DTEsJCQkyMjgKKyNkZWZpbmUgVExNTV9IX0NMSwkJCQkyMjkKKyNkZWZpbmUgVExNTV9DTEsJCQkJMjMwCisjZGVmaW5lIFNGQUJfTVNTX1NfSF9DTEsJCQkyMzEKKyNkZWZpbmUgTVNTX1NMUF9DTEsJCQkJMjMyCisjZGVmaW5lIE1TU19RNlNXX0pUQUdfQ0xLCQkJMjMzCisjZGVmaW5lIE1TU19RNkZXX0pUQUdfQ0xLCQkJMjM0CisjZGVmaW5lIE1TU19TX0hfQ0xLCQkJCTIzNQorI2RlZmluZSBNU1NfQ1hPX1NSQ19DTEsJCQkJMjM2CisjZGVmaW5lIFNBVEFfSF9DTEsJCQkJMjM3CisjZGVmaW5lIFNBVEFfQ0xLX1NSQwkJCQkyMzgKKyNkZWZpbmUgU0FUQV9SWE9PQl9DTEsJCQkJMjM5CisjZGVmaW5lIFNBVEFfUE1BTElWRV9DTEsJCQkyNDAKKyNkZWZpbmUgU0FUQV9QSFlfUkVGX0NMSwkJCTI0MQorI2RlZmluZSBUU1NDX0NMS19TUkMJCQkJMjQyCisjZGVmaW5lIFRTU0NfQ0xLCQkJCTI0MworI2RlZmluZSBQRE1fU1JDCQkJCQkyNDQKKyNkZWZpbmUgUERNX0NMSwkJCQkJMjQ1CisjZGVmaW5lIEdQMF9TUkMJCQkJCTI0NgorI2RlZmluZSBHUDBfQ0xLCQkJCQkyNDcKKyNkZWZpbmUgR1AxX1NSQwkJCQkJMjQ4CisjZGVmaW5lIEdQMV9DTEsJCQkJCTI0OQorI2RlZmluZSBHUDJfU1JDCQkJCQkyNTAKKyNkZWZpbmUgR1AyX0NMSwkJCQkJMjUxCisjZGVmaW5lIE1QTV9DTEsJCQkJCTI1MgorI2RlZmluZSBFQkkxX0NMS19TUkMJCQkJMjUzCisjZGVmaW5lIEVCSTFfQ0gwX0NMSwkJCQkyNTQKKyNkZWZpbmUgRUJJMV9DSDFfQ0xLCQkJCTI1NQorI2RlZmluZSBFQkkxXzJYX0NMSwkJCQkyNTYKKyNkZWZpbmUgRUJJMV9DSDBfRFFfQ0xLCQkJCTI1NworI2RlZmluZSBFQkkxX0NIMV9EUV9DTEsJCQkJMjU4CisjZGVmaW5lIEVCSTFfQ0gwX0NBX0NMSwkJCQkyNTkKKyNkZWZpbmUgRUJJMV9DSDFfQ0FfQ0xLCQkJCTI2MAorI2RlZmluZSBFQkkxX1hPX0NMSwkJCQkyNjEKKyNkZWZpbmUgU0ZBQl9TTVBTU19TX0hfQ0xLCQkJMjYyCisjZGVmaW5lIFBSTkdfU1JDCQkJCTI2MworI2RlZmluZSBQUk5HX0NMSwkJCQkyNjQKKyNkZWZpbmUgUFhPX1NSQwkJCQkJMjY1CisjZGVmaW5lIExQQVNTX0NYT19DTEsJCQkJMjY2CisjZGVmaW5lIExQQVNTX1BYT19DTEsJCQkJMjY3CisjZGVmaW5lIFNQRE1fQ1lfUE9SVDBfQ0xLCQkJMjY4CisjZGVmaW5lIFNQRE1fQ1lfUE9SVDFfQ0xLCQkJMjY5CisjZGVmaW5lIFNQRE1fQ1lfUE9SVDJfQ0xLCQkJMjcwCisjZGVmaW5lIFNQRE1fQ1lfUE9SVDNfQ0xLCQkJMjcxCisjZGVmaW5lIFNQRE1fQ1lfUE9SVDRfQ0xLCQkJMjcyCisjZGVmaW5lIFNQRE1fQ1lfUE9SVDVfQ0xLCQkJMjczCisjZGVmaW5lIFNQRE1fQ1lfUE9SVDZfQ0xLCQkJMjc0CisjZGVmaW5lIFNQRE1fQ1lfUE9SVDdfQ0xLCQkJMjc1CisjZGVmaW5lIFBMTDAJCQkJCTI3NgorI2RlZmluZSBQTEwwX1ZPVEUJCQkJMjc3CisjZGVmaW5lIFBMTDMJCQkJCTI3OAorI2RlZmluZSBQTEwzX1ZPVEUJCQkJMjc5CisjZGVmaW5lIFBMTDRfVk9URQkJCQkyODAKKyNkZWZpbmUgUExMNQkJCQkJMjgxCisjZGVmaW5lIFBMTDVfVk9URQkJCQkyODIKKyNkZWZpbmUgUExMNgkJCQkJMjgzCisjZGVmaW5lIFBMTDZfVk9URQkJCQkyODQKKyNkZWZpbmUgUExMN19WT1RFCQkJCTI4NQorI2RlZmluZSBQTEw4CQkJCQkyODYKKyNkZWZpbmUgUExMOF9WT1RFCQkJCTI4NworI2RlZmluZSBQTEw5CQkJCQkyODgKKyNkZWZpbmUgUExMMTAJCQkJCTI4OQorI2RlZmluZSBQTEwxMQkJCQkJMjkwCisjZGVmaW5lIFBMTDEyCQkJCQkyOTEKKyNkZWZpbmUgUExMMTMJCQkJCTI5MgorI2RlZmluZSBQTEwxNAkJCQkJMjkzCisjZGVmaW5lIFBMTDE0X1ZPVEUJCQkJMjk0CisjZGVmaW5lIFVTQl9IUzNfSF9DTEsJCQkJMjk1CisjZGVmaW5lIFVTQl9IUzNfWENWUl9TUkMJCQkyOTYKKyNkZWZpbmUgVVNCX0hTM19YQ1ZSX0NMSwkJCTI5NworI2RlZmluZSBVU0JfSFM0X0hfQ0xLCQkJCTI5OAorI2RlZmluZSBVU0JfSFM0X1hDVlJfU1JDCQkJMjk5CisjZGVmaW5lIFVTQl9IUzRfWENWUl9DTEsJCQkzMDAKKyNkZWZpbmUgU0FUQV9QSFlfQ0ZHX0NMSwkJCTMwMQorI2RlZmluZSBTQVRBX0FfQ0xLCQkJCTMwMgorI2RlZmluZSBDRTNfU1JDCQkJCQkzMDMKKyNkZWZpbmUgQ0UzX0NPUkVfQ0xLCQkJCTMwNAorI2RlZmluZSBDRTNfSF9DTEsJCQkJMzA1CisjZGVmaW5lIFVTQl9IUzFfU1lTVEVNX0NMS19TUkMJCQkzMDYKKyNkZWZpbmUgVVNCX0hTMV9TWVNURU1fQ0xLCQkJMzA3CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGdjYy1tc204OTk2LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLW1zbTg5OTYuaAppbmRleCA2ZjgxNGRiLi4xODI4NzIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLW1zbTg5OTYuaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sZ2NjLW1zbTg5OTYuaApAQCAtMzM1LDYgKzMzNSwxMSBAQAogI2RlZmluZSBHQ0NfTVNNUFVfQkNSCQkJCQkJOTgKICNkZWZpbmUgR0NDX01TU19RNl9CQ1IJCQkJCQk5OQogI2RlZmluZSBHQ0NfUVJFRlNfVkJHX0NBTF9CQ1IJCQkJCTEwMAorI2RlZmluZSBHQ0NfUENJRV9QSFlfQ09NX0JDUgkJCQkJMTAxCisjZGVmaW5lIEdDQ19QQ0lFX1BIWV9DT01fTk9DU1JfQkNSCQkJCTEwMgorI2RlZmluZSBHQ0NfVVNCM19QSFlfQkNSCQkJCQkxMDMKKyNkZWZpbmUgR0NDX1VTQjNQSFlfUEhZX0JDUgkJCQkJMTA0CisKIAogLyogSW5kZXhlcyBmb3IgR0RTQ3MgKi8KICNkZWZpbmUgQUdHUkUwX05PQ19HRFNDCQkJMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGxjYy1tZG05NjE1LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sbGNjLW1kbTk2MTUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWM5NjNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLGxjYy1tZG05NjE1LmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3IgOiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19DTEtfTENDX01ETTk2MTVfSAorI2RlZmluZSBfRFRfQklORElOR1NfQ0xLX0xDQ19NRE05NjE1X0gKKworI2RlZmluZSBQTEw0CQkJCTAKKyNkZWZpbmUgTUkyU19PU1JfU1JDCQkJMQorI2RlZmluZSBNSTJTX09TUl9DTEsJCQkyCisjZGVmaW5lIE1JMlNfRElWX0NMSwkJCTMKKyNkZWZpbmUgTUkyU19CSVRfRElWX0NMSwkJNAorI2RlZmluZSBNSTJTX0JJVF9DTEsJCQk1CisjZGVmaW5lIFBDTV9TUkMJCQkJNgorI2RlZmluZSBQQ01fQ0xLX09VVAkJCTcKKyNkZWZpbmUgUENNX0NMSwkJCQk4CisjZGVmaW5lIFNMSU1CVVNfU1JDCQkJOQorI2RlZmluZSBBVURJT19TTElNQlVTX0NMSwkJMTAKKyNkZWZpbmUgU1BTX1NMSU1CVVNfQ0xLCQkJMTEKKyNkZWZpbmUgQ09ERUNfSTJTX01JQ19PU1JfU1JDCQkxMgorI2RlZmluZSBDT0RFQ19JMlNfTUlDX09TUl9DTEsJCTEzCisjZGVmaW5lIENPREVDX0kyU19NSUNfRElWX0NMSwkJMTQKKyNkZWZpbmUgQ09ERUNfSTJTX01JQ19CSVRfRElWX0NMSwkxNQorI2RlZmluZSBDT0RFQ19JMlNfTUlDX0JJVF9DTEsJCTE2CisjZGVmaW5lIFNQQVJFX0kyU19NSUNfT1NSX1NSQwkJMTcKKyNkZWZpbmUgU1BBUkVfSTJTX01JQ19PU1JfQ0xLCQkxOAorI2RlZmluZSBTUEFSRV9JMlNfTUlDX0RJVl9DTEsJCTE5CisjZGVmaW5lIFNQQVJFX0kyU19NSUNfQklUX0RJVl9DTEsJMjAKKyNkZWZpbmUgU1BBUkVfSTJTX01JQ19CSVRfQ0xLCQkyMQorI2RlZmluZSBDT0RFQ19JMlNfU1BLUl9PU1JfU1JDCQkyMgorI2RlZmluZSBDT0RFQ19JMlNfU1BLUl9PU1JfQ0xLCQkyMworI2RlZmluZSBDT0RFQ19JMlNfU1BLUl9ESVZfQ0xLCQkyNAorI2RlZmluZSBDT0RFQ19JMlNfU1BLUl9CSVRfRElWX0NMSwkyNQorI2RlZmluZSBDT0RFQ19JMlNfU1BLUl9CSVRfQ0xLCQkyNgorI2RlZmluZSBTUEFSRV9JMlNfU1BLUl9PU1JfU1JDCQkyNworI2RlZmluZSBTUEFSRV9JMlNfU1BLUl9PU1JfQ0xLCQkyOAorI2RlZmluZSBTUEFSRV9JMlNfU1BLUl9ESVZfQ0xLCQkyOQorI2RlZmluZSBTUEFSRV9JMlNfU1BLUl9CSVRfRElWX0NMSwkzMAorI2RlZmluZSBTUEFSRV9JMlNfU1BLUl9CSVRfQ0xLCQkzMQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxtbWNjLW1zbTg5OTYuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcWNvbSxtbWNjLW1zbTg5OTYuaAppbmRleCA3ZDNhN2ZhLi41YWJjNDQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3Fjb20sbW1jYy1tc204OTk2LmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9xY29tLG1tY2MtbXNtODk5Ni5oCkBAIC0yOTgsNSArMjk4LDYgQEAKICNkZWZpbmUgRkRfR0RTQwkJCTEyCiAjZGVmaW5lIE1EU1NfR0RTQwkJMTMKICNkZWZpbmUgR1BVX0dYX0dEU0MJCTE0CisjZGVmaW5lIE1NQUdJQ19CSU1DX0dEU0MJMTUKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3JrMzM5OS1jcnUuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcmszMzk5LWNydS5oCmluZGV4IDUwYTQ0Y2YuLjIyMGE2MGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcmszMzk5LWNydS5oCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svcmszMzk5LWNydS5oCkBAIC0xMzEsMTIgKzEzMSwxNSBAQAogI2RlZmluZSBTQ0xLX0RQSFlfUlgwX0NGRwkJMTY1CiAjZGVmaW5lIFNDTEtfUk1JSV9TUkMJCQkxNjYKICNkZWZpbmUgU0NMS19QQ0lFUEhZX1JFRjEwME0JCTE2NworI2RlZmluZSBTQ0xLX0REUkMJCQkxNjgKIAogI2RlZmluZSBEQ0xLX1ZPUDAJCQkxODAKICNkZWZpbmUgRENMS19WT1AxCQkJMTgxCiAjZGVmaW5lIERDTEtfVk9QMF9ESVYJCQkxODIKICNkZWZpbmUgRENMS19WT1AxX0RJVgkJCTE4MwogI2RlZmluZSBEQ0xLX00wX1BFUklMUAkJCTE4NAorI2RlZmluZSBEQ0xLX1ZPUDBfRlJBQwkJCTE4NQorI2RlZmluZSBEQ0xLX1ZPUDFfRlJBQwkJCTE4NgogCiAjZGVmaW5lIEZDTEtfQ00wUwkJCTE5MAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3N1bjZpLWEzMS1jY3UuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svc3VuNmktYTMxLWNjdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODI1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2Nsb2NrL3N1bjZpLWEzMS1jY3UuaApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBDaGVuLVl1IFRzYWkgPHdlbnNAY3NpZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIGR1YWwtbGljZW5zZWQ6IHlvdSBjYW4gdXNlIGl0IGVpdGhlciB1bmRlciB0aGUgdGVybXMKKyAqIG9mIHRoZSBHUEwgb3IgdGhlIFgxMSBsaWNlbnNlLCBhdCB5b3VyIG9wdGlvbi4gTm90ZSB0aGF0IHRoaXMgZHVhbAorICogbGljZW5zaW5nIG9ubHkgYXBwbGllcyB0byB0aGlzIGZpbGUsIGFuZCBub3QgdGhpcyBwcm9qZWN0IGFzIGEKKyAqIHdob2xlLgorICoKKyAqICBhKSBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUKKyAqICAgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE9yLCBhbHRlcm5hdGl2ZWx5LAorICoKKyAqICBiKSBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogICAgIG9idGFpbmluZyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uCisgKiAgICAgZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dAorICogICAgIHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLAorICogICAgIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogICAgIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiAgICAgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zOgorICoKKyAqICAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogICAgIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqICAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqICAgICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMKKyAqICAgICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogICAgIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUCisgKiAgICAgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksCisgKiAgICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiAgICAgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogICAgIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19DTEtfU1VONklfQTMxX0hfCisjZGVmaW5lIF9EVF9CSU5ESU5HU19DTEtfU1VONklfQTMxX0hfCisKKyNkZWZpbmUgQ0xLX1BMTF9QRVJJUEgJCTEwCisKKyNkZWZpbmUgQ0xLX0NQVQkJCTE4CisKKyNkZWZpbmUgQ0xLX0FIQjFfTUlQSURTSQkyMworI2RlZmluZSBDTEtfQUhCMV9TUwkJMjQKKyNkZWZpbmUgQ0xLX0FIQjFfRE1BCQkyNQorI2RlZmluZSBDTEtfQUhCMV9NTUMwCQkyNgorI2RlZmluZSBDTEtfQUhCMV9NTUMxCQkyNworI2RlZmluZSBDTEtfQUhCMV9NTUMyCQkyOAorI2RlZmluZSBDTEtfQUhCMV9NTUMzCQkyOQorI2RlZmluZSBDTEtfQUhCMV9OQU5EMQkJMzAKKyNkZWZpbmUgQ0xLX0FIQjFfTkFORDAJCTMxCisjZGVmaW5lIENMS19BSEIxX1NEUkFNCQkzMgorI2RlZmluZSBDTEtfQUhCMV9FTUFDCQkzMworI2RlZmluZSBDTEtfQUhCMV9UUwkJMzQKKyNkZWZpbmUgQ0xLX0FIQjFfSFNUSU1FUgkzNQorI2RlZmluZSBDTEtfQUhCMV9TUEkwCQkzNgorI2RlZmluZSBDTEtfQUhCMV9TUEkxCQkzNworI2RlZmluZSBDTEtfQUhCMV9TUEkyCQkzOAorI2RlZmluZSBDTEtfQUhCMV9TUEkzCQkzOQorI2RlZmluZSBDTEtfQUhCMV9PVEcJCTQwCisjZGVmaW5lIENMS19BSEIxX0VIQ0kwCQk0MQorI2RlZmluZSBDTEtfQUhCMV9FSENJMQkJNDIKKyNkZWZpbmUgQ0xLX0FIQjFfT0hDSTAJCTQzCisjZGVmaW5lIENMS19BSEIxX09IQ0kxCQk0NAorI2RlZmluZSBDTEtfQUhCMV9PSENJMgkJNDUKKyNkZWZpbmUgQ0xLX0FIQjFfVkUJCTQ2CisjZGVmaW5lIENMS19BSEIxX0xDRDAJCTQ3CisjZGVmaW5lIENMS19BSEIxX0xDRDEJCTQ4CisjZGVmaW5lIENMS19BSEIxX0NTSQkJNDkKKyNkZWZpbmUgQ0xLX0FIQjFfSERNSQkJNTAKKyNkZWZpbmUgQ0xLX0FIQjFfQkUwCQk1MQorI2RlZmluZSBDTEtfQUhCMV9CRTEJCTUyCisjZGVmaW5lIENMS19BSEIxX0ZFMAkJNTMKKyNkZWZpbmUgQ0xLX0FIQjFfRkUxCQk1NAorI2RlZmluZSBDTEtfQUhCMV9NUAkJNTUKKyNkZWZpbmUgQ0xLX0FIQjFfR1BVCQk1NgorI2RlZmluZSBDTEtfQUhCMV9ERVUwCQk1NworI2RlZmluZSBDTEtfQUhCMV9ERVUxCQk1OAorI2RlZmluZSBDTEtfQUhCMV9EUkMwCQk1OQorI2RlZmluZSBDTEtfQUhCMV9EUkMxCQk2MAorCisjZGVmaW5lIENMS19BUEIxX0NPREVDCQk2MQorI2RlZmluZSBDTEtfQVBCMV9TUERJRgkJNjIKKyNkZWZpbmUgQ0xLX0FQQjFfRElHSVRBTF9NSUMJNjMKKyNkZWZpbmUgQ0xLX0FQQjFfUElPCQk2NAorI2RlZmluZSBDTEtfQVBCMV9EQVVESU8wCTY1CisjZGVmaW5lIENMS19BUEIxX0RBVURJTzEJNjYKKworI2RlZmluZSBDTEtfQVBCMl9JMkMwCQk2NworI2RlZmluZSBDTEtfQVBCMl9JMkMxCQk2OAorI2RlZmluZSBDTEtfQVBCMl9JMkMyCQk2OQorI2RlZmluZSBDTEtfQVBCMl9JMkMzCQk3MAorI2RlZmluZSBDTEtfQVBCMl9VQVJUMAkJNzEKKyNkZWZpbmUgQ0xLX0FQQjJfVUFSVDEJCTcyCisjZGVmaW5lIENMS19BUEIyX1VBUlQyCQk3MworI2RlZmluZSBDTEtfQVBCMl9VQVJUMwkJNzQKKyNkZWZpbmUgQ0xLX0FQQjJfVUFSVDQJCTc1CisjZGVmaW5lIENMS19BUEIyX1VBUlQ1CQk3NgorCisjZGVmaW5lIENMS19OQU5EMAkJNzcKKyNkZWZpbmUgQ0xLX05BTkQxCQk3OAorI2RlZmluZSBDTEtfTU1DMAkJNzkKKyNkZWZpbmUgQ0xLX01NQzBfU0FNUExFCQk4MAorI2RlZmluZSBDTEtfTU1DMF9PVVRQVVQJCTgxCisjZGVmaW5lIENMS19NTUMxCQk4MgorI2RlZmluZSBDTEtfTU1DMV9TQU1QTEUJCTgzCisjZGVmaW5lIENMS19NTUMxX09VVFBVVAkJODQKKyNkZWZpbmUgQ0xLX01NQzIJCTg1CisjZGVmaW5lIENMS19NTUMyX1NBTVBMRQkJODYKKyNkZWZpbmUgQ0xLX01NQzJfT1VUUFVUCQk4NworI2RlZmluZSBDTEtfTU1DMwkJODgKKyNkZWZpbmUgQ0xLX01NQzNfU0FNUExFCQk4OQorI2RlZmluZSBDTEtfTU1DM19PVVRQVVQJCTkwCisjZGVmaW5lIENMS19UUwkJCTkxCisjZGVmaW5lIENMS19TUwkJCTkyCisjZGVmaW5lIENMS19TUEkwCQk5MworI2RlZmluZSBDTEtfU1BJMQkJOTQKKyNkZWZpbmUgQ0xLX1NQSTIJCTk1CisjZGVmaW5lIENMS19TUEkzCQk5NgorI2RlZmluZSBDTEtfREFVRElPMAkJOTcKKyNkZWZpbmUgQ0xLX0RBVURJTzEJCTk4CisjZGVmaW5lIENMS19TUERJRgkJOTkKKyNkZWZpbmUgQ0xLX1VTQl9QSFkwCQkxMDAKKyNkZWZpbmUgQ0xLX1VTQl9QSFkxCQkxMDEKKyNkZWZpbmUgQ0xLX1VTQl9QSFkyCQkxMDIKKyNkZWZpbmUgQ0xLX1VTQl9PSENJMAkJMTAzCisjZGVmaW5lIENMS19VU0JfT0hDSTEJCTEwNAorI2RlZmluZSBDTEtfVVNCX09IQ0kyCQkxMDUKKworI2RlZmluZSBDTEtfRFJBTV9WRQkJMTEwCisjZGVmaW5lIENMS19EUkFNX0NTSV9JU1AJMTExCisjZGVmaW5lIENMS19EUkFNX1RTCQkxMTIKKyNkZWZpbmUgQ0xLX0RSQU1fRFJDMAkJMTEzCisjZGVmaW5lIENMS19EUkFNX0RSQzEJCTExNAorI2RlZmluZSBDTEtfRFJBTV9ERVUwCQkxMTUKKyNkZWZpbmUgQ0xLX0RSQU1fREVVMQkJMTE2CisjZGVmaW5lIENMS19EUkFNX0ZFMAkJMTE3CisjZGVmaW5lIENMS19EUkFNX0ZFMQkJMTE4CisjZGVmaW5lIENMS19EUkFNX0JFMAkJMTE5CisjZGVmaW5lIENMS19EUkFNX0JFMQkJMTIwCisjZGVmaW5lIENMS19EUkFNX01QCQkxMjEKKworI2RlZmluZSBDTEtfQkUwCQkJMTIyCisjZGVmaW5lIENMS19CRTEJCQkxMjMKKyNkZWZpbmUgQ0xLX0ZFMAkJCTEyNAorI2RlZmluZSBDTEtfRkUxCQkJMTI1CisjZGVmaW5lIENMS19NUAkJCTEyNgorI2RlZmluZSBDTEtfTENEMF9DSDAJCTEyNworI2RlZmluZSBDTEtfTENEMV9DSDAJCTEyOAorI2RlZmluZSBDTEtfTENEMF9DSDEJCTEyOQorI2RlZmluZSBDTEtfTENEMV9DSDEJCTEzMAorI2RlZmluZSBDTEtfQ1NJMF9TQ0xLCQkxMzEKKyNkZWZpbmUgQ0xLX0NTSTBfTUNMSwkJMTMyCisjZGVmaW5lIENMS19DU0kxX01DTEsJCTEzMworI2RlZmluZSBDTEtfVkUJCQkxMzQKKyNkZWZpbmUgQ0xLX0NPREVDCQkxMzUKKyNkZWZpbmUgQ0xLX0FWUwkJCTEzNgorI2RlZmluZSBDTEtfRElHSVRBTF9NSUMJCTEzNworI2RlZmluZSBDTEtfSERNSQkJMTM4CisjZGVmaW5lIENMS19IRE1JX0REQwkJMTM5CisjZGVmaW5lIENMS19QUwkJCTE0MAorCisjZGVmaW5lIENMS19NSVBJX0RTSQkJMTQzCisjZGVmaW5lIENMS19NSVBJX0RTSV9EUEhZCTE0NAorI2RlZmluZSBDTEtfTUlQSV9DU0lfRFBIWQkxNDUKKyNkZWZpbmUgQ0xLX0lFUF9EUkMwCQkxNDYKKyNkZWZpbmUgQ0xLX0lFUF9EUkMxCQkxNDcKKyNkZWZpbmUgQ0xLX0lFUF9ERVUwCQkxNDgKKyNkZWZpbmUgQ0xLX0lFUF9ERVUxCQkxNDkKKyNkZWZpbmUgQ0xLX0dQVV9DT1JFCQkxNTAKKyNkZWZpbmUgQ0xLX0dQVV9NRU1PUlkJCTE1MQorI2RlZmluZSBDTEtfR1BVX0hZRAkJMTUyCisjZGVmaW5lIENMS19BVFMJCQkxNTMKKyNkZWZpbmUgQ0xLX1RSQUNFCQkxNTQKKworI2RlZmluZSBDTEtfT1VUX0EJCTE1NQorI2RlZmluZSBDTEtfT1VUX0IJCTE1NgorI2RlZmluZSBDTEtfT1VUX0MJCTE1NworCisjZW5kaWYgLyogX0RUX0JJTkRJTkdTX0NMS19TVU42SV9BMzFfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svc3VuOGktYTIzLWEzMy1jY3UuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svc3VuOGktYTIzLWEzMy1jY3UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODIyMmI2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay9zdW44aS1hMjMtYTMzLWNjdS5oCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE1heGltZSBSaXBhcmQgPG1heGltZS5yaXBhcmRAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBkdWFsLWxpY2Vuc2VkOiB5b3UgY2FuIHVzZSBpdCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR1BMIG9yIHRoZSBYMTEgbGljZW5zZSwgYXQgeW91ciBvcHRpb24uIE5vdGUgdGhhdCB0aGlzIGR1YWwKKyAqIGxpY2Vuc2luZyBvbmx5IGFwcGxpZXMgdG8gdGhpcyBmaWxlLCBhbmQgbm90IHRoaXMgcHJvamVjdCBhcyBhCisgKiB3aG9sZS4KKyAqCisgKiAgYSkgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiAgICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBPciwgYWx0ZXJuYXRpdmVseSwKKyAqCisgKiAgYikgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogICAgIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9uczoKKyAqCisgKiAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqICAgICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRFRfQklORElOR1NfQ0xLX1NVTjhJX0EyM19BMzNfSF8KKyNkZWZpbmUgX0RUX0JJTkRJTkdTX0NMS19TVU44SV9BMjNfQTMzX0hfCisKKyNkZWZpbmUgQ0xLX0NQVVgJCTE4CisKKyNkZWZpbmUgQ0xLX0JVU19NSVBJX0RTSQkyMworI2RlZmluZSBDTEtfQlVTX1NTCQkyNAorI2RlZmluZSBDTEtfQlVTX0RNQQkJMjUKKyNkZWZpbmUgQ0xLX0JVU19NTUMwCQkyNgorI2RlZmluZSBDTEtfQlVTX01NQzEJCTI3CisjZGVmaW5lIENMS19CVVNfTU1DMgkJMjgKKyNkZWZpbmUgQ0xLX0JVU19OQU5ECQkyOQorI2RlZmluZSBDTEtfQlVTX0RSQU0JCTMwCisjZGVmaW5lIENMS19CVVNfSFNUSU1FUgkJMzEKKyNkZWZpbmUgQ0xLX0JVU19TUEkwCQkzMgorI2RlZmluZSBDTEtfQlVTX1NQSTEJCTMzCisjZGVmaW5lIENMS19CVVNfT1RHCQkzNAorI2RlZmluZSBDTEtfQlVTX0VIQ0kJCTM1CisjZGVmaW5lIENMS19CVVNfT0hDSQkJMzYKKyNkZWZpbmUgQ0xLX0JVU19WRQkJMzcKKyNkZWZpbmUgQ0xLX0JVU19MQ0QJCTM4CisjZGVmaW5lIENMS19CVVNfQ1NJCQkzOQorI2RlZmluZSBDTEtfQlVTX0RFX0JFCQk0MAorI2RlZmluZSBDTEtfQlVTX0RFX0ZFCQk0MQorI2RlZmluZSBDTEtfQlVTX0dQVQkJNDIKKyNkZWZpbmUgQ0xLX0JVU19NU0dCT1gJCTQzCisjZGVmaW5lIENMS19CVVNfU1BJTkxPQ0sJNDQKKyNkZWZpbmUgQ0xLX0JVU19EUkMJCTQ1CisjZGVmaW5lIENMS19CVVNfU0FUCQk0NgorI2RlZmluZSBDTEtfQlVTX0NPREVDCQk0NworI2RlZmluZSBDTEtfQlVTX1BJTwkJNDgKKyNkZWZpbmUgQ0xLX0JVU19JMlMwCQk0OQorI2RlZmluZSBDTEtfQlVTX0kyUzEJCTUwCisjZGVmaW5lIENMS19CVVNfSTJDMAkJNTEKKyNkZWZpbmUgQ0xLX0JVU19JMkMxCQk1MgorI2RlZmluZSBDTEtfQlVTX0kyQzIJCTUzCisjZGVmaW5lIENMS19CVVNfVUFSVDAJCTU0CisjZGVmaW5lIENMS19CVVNfVUFSVDEJCTU1CisjZGVmaW5lIENMS19CVVNfVUFSVDIJCTU2CisjZGVmaW5lIENMS19CVVNfVUFSVDMJCTU3CisjZGVmaW5lIENMS19CVVNfVUFSVDQJCTU4CisjZGVmaW5lIENMS19OQU5ECQk1OQorI2RlZmluZSBDTEtfTU1DMAkJNjAKKyNkZWZpbmUgQ0xLX01NQzBfU0FNUExFCQk2MQorI2RlZmluZSBDTEtfTU1DMF9PVVRQVVQJCTYyCisjZGVmaW5lIENMS19NTUMxCQk2MworI2RlZmluZSBDTEtfTU1DMV9TQU1QTEUJCTY0CisjZGVmaW5lIENMS19NTUMxX09VVFBVVAkJNjUKKyNkZWZpbmUgQ0xLX01NQzIJCTY2CisjZGVmaW5lIENMS19NTUMyX1NBTVBMRQkJNjcKKyNkZWZpbmUgQ0xLX01NQzJfT1VUUFVUCQk2OAorI2RlZmluZSBDTEtfU1MJCQk2OQorI2RlZmluZSBDTEtfU1BJMAkJNzAKKyNkZWZpbmUgQ0xLX1NQSTEJCTcxCisjZGVmaW5lIENMS19JMlMwCQk3MgorI2RlZmluZSBDTEtfSTJTMQkJNzMKKyNkZWZpbmUgQ0xLX1VTQl9QSFkwCQk3NAorI2RlZmluZSBDTEtfVVNCX1BIWTEJCTc1CisjZGVmaW5lIENMS19VU0JfSFNJQwkJNzYKKyNkZWZpbmUgQ0xLX1VTQl9IU0lDXzEyTQk3NworI2RlZmluZSBDTEtfVVNCX09IQ0kJCTc4CisKKyNkZWZpbmUgQ0xLX0RSQU1fVkUJCTgwCisjZGVmaW5lIENMS19EUkFNX0NTSQkJODEKKyNkZWZpbmUgQ0xLX0RSQU1fRFJDCQk4MgorI2RlZmluZSBDTEtfRFJBTV9ERV9GRQkJODMKKyNkZWZpbmUgQ0xLX0RSQU1fREVfQkUJCTg0CisjZGVmaW5lIENMS19ERV9CRQkJODUKKyNkZWZpbmUgQ0xLX0RFX0ZFCQk4NgorI2RlZmluZSBDTEtfTENEX0NIMAkJODcKKyNkZWZpbmUgQ0xLX0xDRF9DSDEJCTg4CisjZGVmaW5lIENMS19DU0lfU0NMSwkJODkKKyNkZWZpbmUgQ0xLX0NTSV9NQ0xLCQk5MAorI2RlZmluZSBDTEtfVkUJCQk5MQorI2RlZmluZSBDTEtfQUNfRElHCQk5MgorI2RlZmluZSBDTEtfQUNfRElHXzRYCQk5MworI2RlZmluZSBDTEtfQVZTCQkJOTQKKworI2RlZmluZSBDTEtfRFNJX1NDTEsJCTk2CisjZGVmaW5lIENMS19EU0lfRFBIWQkJOTcKKyNkZWZpbmUgQ0xLX0RSQwkJCTk4CisjZGVmaW5lIENMS19HUFUJCQk5OQorI2RlZmluZSBDTEtfQVRTCQkJMTAwCisKKyNlbmRpZiAvKiBfRFRfQklORElOR1NfQ0xLX1NVTjhJX0EyM19BMzNfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svengyOTY3MTgtY2xvY2suaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvY2xvY2svengyOTY3MTgtY2xvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjJkNTIzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9jbG9jay96eDI5NjcxOC1jbG9jay5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IC0gMjAxNiBaVEUgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2lmbmRlZiBfX0RUX0JJTkRJTkdTX0NMT0NLX1pYMjk2NzE4X0gKKyNkZWZpbmUgX19EVF9CSU5ESU5HU19DTE9DS19aWDI5NjcxOF9ICisKKy8qIFBMTCAqLworI2RlZmluZSBaWDI5NjcxOF9QTExfQ1BVCTEKKyNkZWZpbmUgWlgyOTY3MThfUExMX01BQwkyCisjZGVmaW5lIFpYMjk2NzE4X1BMTF9NTTAJMworI2RlZmluZSBaWDI5NjcxOF9QTExfTU0xCTQKKyNkZWZpbmUgWlgyOTY3MThfUExMX1ZHQQk1CisjZGVmaW5lIFpYMjk2NzE4X1BMTF9ERFIJNgorI2RlZmluZSBaWDI5NjcxOF9QTExfQVVESU8JNworI2RlZmluZSBaWDI5NjcxOF9QTExfSFNJQwk4CisjZGVmaW5lIENQVV9EQkdfR0FURQkJOQorI2RlZmluZSBBNzJfR0FURQkJMTAKKyNkZWZpbmUgQ1BVX1BFUklfR0FURQkJMTEKKyNkZWZpbmUgQTUzX0dBVEUJCTEyCisjZGVmaW5lIEREUjFfR0FURQkJMTMKKyNkZWZpbmUgRERSMF9HQVRFCQkxNAorI2RlZmluZSBTRDFfV0NMSwkJMTUKKyNkZWZpbmUgU0QxX0FIQgkJCTE2CisjZGVmaW5lIFNEMF9XQ0xLCQkxNworI2RlZmluZSBTRDBfQUhCCQkJMTgKKyNkZWZpbmUgRU1NQ19XQ0xLCQkxOQorI2RlZmluZSBFTU1DX05BTkRfQVhJCQkyMAorI2RlZmluZSBOQU5EX1dDTEsJCTIxCisjZGVmaW5lIEVNTUNfTkFORF9BSEIJCTIyCisjZGVmaW5lIExTUDFfMTQ4TTUJCTIzCisjZGVmaW5lIExTUDFfOTlNCQkyNAorI2RlZmluZSBMU1AxXzI0TQkJMjUKKyNkZWZpbmUgTFNQMF83NE0yNQkJMjYKKyNkZWZpbmUgTFNQMF8zMksJCTI3CisjZGVmaW5lIExTUDBfMTQ4TTUJCTI4CisjZGVmaW5lIExTUDBfOTlNCQkyOQorI2RlZmluZSBMU1AwXzI0TQkJMzAKKyNkZWZpbmUgREVNVVhfQVhJCQkzMQorI2RlZmluZSBERU1VWF9BUEIJCTMyCisjZGVmaW5lIERFTVVYXzE0OE01CQkzMworI2RlZmluZSBERU1VWF8xMDhNCQkzNAorI2RlZmluZSBBVURJT19BUEIJCTM1CisjZGVmaW5lIEFVRElPXzk5TQkJMzYKKyNkZWZpbmUgQVVESU9fMjRNCQkzNworI2RlZmluZSBBVURJT18xNk0zODQJCTM4CisjZGVmaW5lIEFVRElPXzMySwkJMzkKKyNkZWZpbmUgV0RUX1dDTEsJCTQwCisjZGVmaW5lIFRJTUVSX1dDTEsJCTQxCisjZGVmaW5lIFZERV9BQ0xLCQk0MgorI2RlZmluZSBWQ0VfQUNMSwkJNDMKKyNkZWZpbmUgSERFX0FDTEsJCTQ0CisjZGVmaW5lIEdQVV9BQ0xLCQk0NQorI2RlZmluZSBTQVBQVV9BQ0xLCQk0NgorI2RlZmluZSBTQVBQVV9XQ0xLCQk0NworI2RlZmluZSBWT1VfQUNMSwkJNDgKKyNkZWZpbmUgVk9VX01BSU5fV0NMSwkJNDkKKyNkZWZpbmUgVk9VX0FVWF9XQ0xLCQk1MAorI2RlZmluZSBWT1VfUFBVX1dDTEsJCTUxCisjZGVmaW5lIE1JUElfQ0ZHX0NMSwkJNTIKKyNkZWZpbmUgVkdBX0kyQ19XQ0xLCQk1MworI2RlZmluZSBNSVBJX1JFRl9DTEsJCTU0CisjZGVmaW5lIEhETUlfT1NDX0NFQwkJNTUKKyNkZWZpbmUgSERNSV9PU0NfQ0xLCQk1NgorI2RlZmluZSBIRE1JX1hDTEsJCTU3CisjZGVmaW5lIFZJVV9NMF9BQ0xLCQk1OAorI2RlZmluZSBWSVVfTTFfQUNMSwkJNTkKKyNkZWZpbmUgVklVX1dDTEsJCTYwCisjZGVmaW5lIFZJVV9KUEVHX1dDTEsJCTYxCisjZGVmaW5lIFZJVV9DRkdfQ0xLCQk2MgorI2RlZmluZSBUU19TWVNfV0NMSwkJNjMKKyNkZWZpbmUgVFNfU1lTXzEwOE0JCTY0CisjZGVmaW5lIFVTQjIwX0hDTEsJCTY1CisjZGVmaW5lIFVTQjIwX1BIWV9DTEsJCTY2CisjZGVmaW5lIFVTQjIxX0hDTEsJCTY3CisjZGVmaW5lIFVTQjIxX1BIWV9DTEsJCTY4CisjZGVmaW5lIEdNQUNfUk1JSUNMSwkJNjkKKyNkZWZpbmUgR01BQ19QQ0xLCQk3MAorI2RlZmluZSBHTUFDX0FDTEsJCTcxCisjZGVmaW5lIEdNQUNfUkZDTEsJCTcyCisjZGVmaW5lIFRFTVBTRU5TT1JfR0FURQkJNzMKKworI2RlZmluZSBUT1BfTlJfQ0xLUwkJNzQKKworCisjZGVmaW5lIExTUDBfVElNRVIzX1BDTEsJMQorI2RlZmluZSBMU1AwX1RJTUVSM19XQ0xLCTIKKyNkZWZpbmUgTFNQMF9USU1FUjRfUENMSwkzCisjZGVmaW5lIExTUDBfVElNRVI0X1dDTEsJNAorI2RlZmluZSBMU1AwX1RJTUVSNV9QQ0xLCTUKKyNkZWZpbmUgTFNQMF9USU1FUjVfV0NMSwk2CisjZGVmaW5lIExTUDBfVUFSVDNfUENMSwkJNworI2RlZmluZSBMU1AwX1VBUlQzX1dDTEsJCTgKKyNkZWZpbmUgTFNQMF9VQVJUMV9QQ0xLCQk5CisjZGVmaW5lIExTUDBfVUFSVDFfV0NMSwkJMTAKKyNkZWZpbmUgTFNQMF9VQVJUMl9QQ0xLCQkxMQorI2RlZmluZSBMU1AwX1VBUlQyX1dDTEsJCTEyCisjZGVmaW5lIExTUDBfU1BJRkMwX1BDTEsJMTMKKyNkZWZpbmUgTFNQMF9TUElGQzBfV0NMSwkxNAorI2RlZmluZSBMU1AwX0kyQzRfUENMSwkJMTUKKyNkZWZpbmUgTFNQMF9JMkM0X1dDTEsJCTE2CisjZGVmaW5lIExTUDBfSTJDNV9QQ0xLCQkxNworI2RlZmluZSBMU1AwX0kyQzVfV0NMSwkJMTgKKyNkZWZpbmUgTFNQMF9TU1AwX1BDTEsJCTE5CisjZGVmaW5lIExTUDBfU1NQMF9XQ0xLCQkyMAorI2RlZmluZSBMU1AwX1NTUDFfUENMSwkJMjEKKyNkZWZpbmUgTFNQMF9TU1AxX1dDTEsJCTIyCisjZGVmaW5lIExTUDBfVVNJTV9QQ0xLCQkyMworI2RlZmluZSBMU1AwX1VTSU1fV0NMSwkJMjQKKyNkZWZpbmUgTFNQMF9HUElPX1BDTEsJCTI1CisjZGVmaW5lIExTUDBfR1BJT19XQ0xLCQkyNgorI2RlZmluZSBMU1AwX0kyQzNfUENMSwkJMjcKKyNkZWZpbmUgTFNQMF9JMkMzX1dDTEsJCTI4CisKKyNkZWZpbmUgTFNQMF9OUl9DTEtTCQkyOQorCisKKyNkZWZpbmUgTFNQMV9VQVJUNF9QQ0xLCQkxCisjZGVmaW5lIExTUDFfVUFSVDRfV0NMSwkJMgorI2RlZmluZSBMU1AxX1VBUlQ1X1BDTEsJCTMKKyNkZWZpbmUgTFNQMV9VQVJUNV9XQ0xLCQk0CisjZGVmaW5lIExTUDFfUFdNX1BDTEsJCTUKKyNkZWZpbmUgTFNQMV9QV01fV0NMSwkJNgorI2RlZmluZSBMU1AxX0kyQzJfUENMSwkJNworI2RlZmluZSBMU1AxX0kyQzJfV0NMSwkJOAorI2RlZmluZSBMU1AxX1NTUDJfUENMSwkJOQorI2RlZmluZSBMU1AxX1NTUDJfV0NMSwkJMTAKKyNkZWZpbmUgTFNQMV9TU1AzX1BDTEsJCTExCisjZGVmaW5lIExTUDFfU1NQM19XQ0xLCQkxMgorI2RlZmluZSBMU1AxX1NTUDRfUENMSwkJMTMKKyNkZWZpbmUgTFNQMV9TU1A0X1dDTEsJCTE0CisjZGVmaW5lIExTUDFfVVNJTTFfUENMSwkJMTUKKyNkZWZpbmUgTFNQMV9VU0lNMV9XQ0xLCQkxNgorCisjZGVmaW5lIExTUDFfTlJfQ0xLUwkJMTcKKworCisjZGVmaW5lIEFVRElPX0kyUzBfV0NMSwkJMQorI2RlZmluZSBBVURJT19JMlMwX1BDTEsJCTIKKyNkZWZpbmUgQVVESU9fSTJTMV9XQ0xLCQkzCisjZGVmaW5lIEFVRElPX0kyUzFfUENMSwkJNAorI2RlZmluZSBBVURJT19JMlMyX1dDTEsJCTUKKyNkZWZpbmUgQVVESU9fSTJTMl9QQ0xLCQk2CisjZGVmaW5lIEFVRElPX0kyUzNfV0NMSwkJNworI2RlZmluZSBBVURJT19JMlMzX1BDTEsJCTgKKyNkZWZpbmUgQVVESU9fSTJDMF9XQ0xLCQk5CisjZGVmaW5lIEFVRElPX0kyQzBfUENMSwkJMTAKKyNkZWZpbmUgQVVESU9fU1BESUYwX1dDTEsJMTEKKyNkZWZpbmUgQVVESU9fU1BESUYwX1BDTEsJMTIKKyNkZWZpbmUgQVVESU9fU1BESUYxX1dDTEsJMTMKKyNkZWZpbmUgQVVESU9fU1BESUYxX1BDTEsJMTQKKyNkZWZpbmUgQVVESU9fVElNRVJfV0NMSwkxNQorI2RlZmluZSBBVURJT19USU1FUl9QQ0xLCTE2CisjZGVmaW5lIEFVRElPX1RETV9XQ0xLCQkxNworI2RlZmluZSBBVURJT19URE1fUENMSwkJMTgKKyNkZWZpbmUgQVVESU9fVFNfUENMSwkJMTkKKworI2RlZmluZSBBVURJT19OUl9DTEtTCQkyMAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvbWZkL3Fjb20tcnBtLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL21mZC9xY29tLXJwbS5oCmluZGV4IDEzYTlkNGIuLjU0YWVmNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHQtYmluZGluZ3MvbWZkL3Fjb20tcnBtLmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9tZmQvcWNvbS1ycG0uaApAQCAtMTQ3LDYgKzE0NywyOCBAQAogI2RlZmluZSBRQ09NX1JQTV9TTUIyMDhfUzFiCQkJMTM3CiAjZGVmaW5lIFFDT01fUlBNX1NNQjIwOF9TMmEJCQkxMzgKICNkZWZpbmUgUUNPTV9SUE1fU01CMjA4X1MyYgkJCTEzOQorI2RlZmluZSBRQ09NX1JQTV9QTTgwMThfU01QUzEJCQkxNDAKKyNkZWZpbmUgUUNPTV9SUE1fUE04MDE4X1NNUFMyCQkJMTQxCisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9TTVBTMwkJCTE0MgorI2RlZmluZSBRQ09NX1JQTV9QTTgwMThfU01QUzQJCQkxNDMKKyNkZWZpbmUgUUNPTV9SUE1fUE04MDE4X1NNUFM1CQkJMTQ0CisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9MRE8xCQkJMTQ1CisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9MRE8yCQkJMTQ2CisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9MRE8zCQkJMTQ3CisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9MRE80CQkJMTQ4CisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9MRE81CQkJMTQ5CisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9MRE82CQkJMTUwCisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9MRE83CQkJMTUxCisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9MRE84CQkJMTUyCisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9MRE85CQkJMTUzCisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9MRE8xMAkJCTE1NAorI2RlZmluZSBRQ09NX1JQTV9QTTgwMThfTERPMTEJCQkxNTUKKyNkZWZpbmUgUUNPTV9SUE1fUE04MDE4X0xETzEyCQkJMTU2CisjZGVmaW5lIFFDT01fUlBNX1BNODAxOF9MRE8xMwkJCTE1NworI2RlZmluZSBRQ09NX1JQTV9QTTgwMThfTERPMTQJCQkxNTgKKyNkZWZpbmUgUUNPTV9SUE1fUE04MDE4X0xWUzEJCQkxNTkKKyNkZWZpbmUgUUNPTV9SUE1fUE04MDE4X05DUAkJCTE2MAorI2RlZmluZSBRQ09NX1JQTV9WT0xUQUdFX0NPUk5FUgkJCTE2MQogCiAvKgogICogQ29uc3RhbnRzIHVzZWQgdG8gc2VsZWN0IGZvcmNlIG1vZGUgZm9yIHJlZ3VsYXRvcnMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL25ldC9tc2NjLXBoeS12c2M4NTMxLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL25ldC9tc2NjLXBoeS12c2M4NTMxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4M2RkMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvbmV0L21zY2MtcGh5LXZzYzg1MzEuaApAQCAtMCwwICsxLDIxIEBACisvKgorICogRGV2aWNlIFRyZWUgY29uc3RhbnRzIGZvciBNaWNyb3NlbWkgVlNDODUzMSBQSFkKKyAqCisgKiBBdXRob3I6IE5hZ2FyYWp1IExha2thcmFqdQorICoKKyAqIExpY2Vuc2U6IER1YWwgTUlUL0dQTAorICogQ29weXJpZ2h0IChjKSAyMDE2IE1pY3Jvc2VtaSBDb3Jwb3JhdGlvbgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX01TQ0NfVlNDODUzMV9ICisjZGVmaW5lIF9EVF9CSU5ESU5HU19NU0NDX1ZTQzg1MzFfSAorCisvKiBNQUMgaW50ZXJmYWNlIEVkZ2UgcmF0ZSBjb250cm9sIFZERE1BQyBpbiBtaWxsaSBWb2x0cyAqLworI2RlZmluZSBNU0NDX1ZERE1BQ18zMzAwCQkgMzMwMAorI2RlZmluZSBNU0NDX1ZERE1BQ18yNTAwCQkgMjUwMAorI2RlZmluZSBNU0NDX1ZERE1BQ18xODAwCQkgMTgwMAorI2RlZmluZSBNU0NDX1ZERE1BQ18xNTAwCQkgMTUwMAorI2RlZmluZSBNU0NDX1ZERE1BQ19NQVgJCQkgNAorI2RlZmluZSBNU0NDX1NMT1dET1dOX01BWAkJIDgKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L2d4YmItYW9jbGtjLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L2d4YmItYW9jbGtjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzZmQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvZ3hiYi1hb2Nsa2MuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKKyAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3I6IE5laWwgQXJtc3Ryb25nIDxuYXJtc3Ryb25nQGJheWxpYnJlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIENPUFlJTkcuCisgKgorICogQlNEIExJQ0VOU0UKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQmF5TGlicmUsIFNBUy4KKyAqIEF1dGhvcjogTmVpbCBBcm1zdHJvbmcgPG5hcm1zdHJvbmdAYmF5bGlicmUuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRFRfQklORElOR1NfUkVTRVRfQU1MT0dJQ19NRVNPTl9HWEJCX0FPQ0xLCisjZGVmaW5lIERUX0JJTkRJTkdTX1JFU0VUX0FNTE9HSUNfTUVTT05fR1hCQl9BT0NMSworCisjZGVmaW5lIFJFU0VUX0FPX1JFTU9URQkJMAorI2RlZmluZSBSRVNFVF9BT19JMkNfTUFTVEVSCTEKKyNkZWZpbmUgUkVTRVRfQU9fSTJDX1NMQVZFCTIKKyNkZWZpbmUgUkVTRVRfQU9fVUFSVDEJCTMKKyNkZWZpbmUgUkVTRVRfQU9fVUFSVDIJCTQKKyNkZWZpbmUgUkVTRVRfQU9fSVJfQkxBU1RFUgk1CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9tdDI3MDEtcmVzZXRzLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L210MjcwMS1yZXNldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWYwMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9tdDI3MDEtcmVzZXRzLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBNZWRpYVRlaywgU2h1bmxpIFdhbmcgPHNodW5saS53YW5nQG1lZGlhdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfRFRfQklORElOR1NfUkVTRVRfQ09OVFJPTExFUl9NVDI3MDEKKyNkZWZpbmUgX0RUX0JJTkRJTkdTX1JFU0VUX0NPTlRST0xMRVJfTVQyNzAxCisKKy8qIElORlJBQ0ZHIHJlc2V0cyAqLworI2RlZmluZSBNVDI3MDFfSU5GUkFfRU1JX1JFR19SU1QJCTAKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0RSQU1DMF9BMF9SU1QJCTEKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0ZIQ1RMX1JTVAkJCTIKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0FQQ0lSUV9FSU5UX1JTVAkJMworI2RlZmluZSBNVDI3MDFfSU5GUkFfQVBYR1BUX1JTVAkJCTQKKyNkZWZpbmUgTVQyNzAxX0lORlJBX1NDUFNZU19SU1QJCQk1CisjZGVmaW5lIE1UMjcwMV9JTkZSQV9LUF9SU1QJCQk2CisjZGVmaW5lIE1UMjcwMV9JTkZSQV9QTUlDX1dSQVBfUlNUCQk3CisjZGVmaW5lIE1UMjcwMV9JTkZSQV9NSVBJX1JTVAkJCTgKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0lSUlhfUlNUCQkJOQorI2RlZmluZSBNVDI3MDFfSU5GUkFfQ0VDX1JTVAkJCTEwCisjZGVmaW5lIE1UMjcwMV9JTkZSQV9FTUlfUlNUCQkJMzIKKyNkZWZpbmUgTVQyNzAxX0lORlJBX0RSQU1DMF9SU1QJCQkzNAorI2RlZmluZSBNVDI3MDFfSU5GUkFfVFJOR19SU1QJCQkzNworI2RlZmluZSBNVDI3MDFfSU5GUkFfU1lTSVJRX1JTVAkJCTM4CisKKy8qICBQRVJJQ0ZHIHJlc2V0cyAqLworI2RlZmluZSBNVDI3MDFfUEVSSV9VQVJUMF9TV19SU1QJCTAKKyNkZWZpbmUgTVQyNzAxX1BFUklfVUFSVDFfU1dfUlNUCQkxCisjZGVmaW5lIE1UMjcwMV9QRVJJX1VBUlQyX1NXX1JTVAkJMgorI2RlZmluZSBNVDI3MDFfUEVSSV9VQVJUM19TV19SU1QJCTMKKyNkZWZpbmUgTVQyNzAxX1BFUklfR0NQVV9TV19SU1QJCQk1CisjZGVmaW5lIE1UMjcwMV9QRVJJX0JUSUZfU1dfUlNUCQkJNgorI2RlZmluZSBNVDI3MDFfUEVSSV9QV01fU1dfUlNUCQkJOAorI2RlZmluZSBNVDI3MDFfUEVSSV9BVVhBRENfU1dfUlNUCQkxMAorI2RlZmluZSBNVDI3MDFfUEVSSV9ETUFfU1dfUlNUCQkJMTEKKyNkZWZpbmUgTVQyNzAxX1BFUklfTkZJX1NXX1JTVAkJCTE0CisjZGVmaW5lIE1UMjcwMV9QRVJJX05MSV9TV19SU1QJCQkxNQorI2RlZmluZSBNVDI3MDFfUEVSSV9USEVSTV9TV19SU1QJCTE2CisjZGVmaW5lIE1UMjcwMV9QRVJJX01TREMyX1NXX1JTVAkJMTcKKyNkZWZpbmUgTVQyNzAxX1BFUklfTVNEQzBfU1dfUlNUCQkxOQorI2RlZmluZSBNVDI3MDFfUEVSSV9NU0RDMV9TV19SU1QJCTIwCisjZGVmaW5lIE1UMjcwMV9QRVJJX0kyQzBfU1dfUlNUCQkJMjIKKyNkZWZpbmUgTVQyNzAxX1BFUklfSTJDMV9TV19SU1QJCQkyMworI2RlZmluZSBNVDI3MDFfUEVSSV9JMkMyX1NXX1JTVAkJCTI0CisjZGVmaW5lIE1UMjcwMV9QRVJJX0kyQzNfU1dfUlNUCQkJMjUKKyNkZWZpbmUgTVQyNzAxX1BFUklfVVNCX1NXX1JTVAkJCTI4CisjZGVmaW5lIE1UMjcwMV9QRVJJX0VUSF9TV19SU1QJCQkyOQorI2RlZmluZSBNVDI3MDFfUEVSSV9TUEkwX1NXX1JTVAkJCTMzCisKKy8qIFRPUFJHVSByZXNldHMgKi8KKyNkZWZpbmUgTVQyNzAxX1RPUFJHVV9JTkZSQV9SU1QJCQkwCisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfTU1fUlNUCQkJMQorI2RlZmluZSBNVDI3MDFfVE9QUkdVX01GR19SU1QJCQkyCisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfRVRIRE1BX1JTVAkJMworI2RlZmluZSBNVDI3MDFfVE9QUkdVX1ZERUNfUlNUCQkJNAorI2RlZmluZSBNVDI3MDFfVE9QUkdVX1ZFTkNfSU1HX1JTVAkJNQorI2RlZmluZSBNVDI3MDFfVE9QUkdVX0REUlBIWV9SU1QJCTYKKyNkZWZpbmUgTVQyNzAxX1RPUFJHVV9NRF9SU1QJCQk3CisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfSU5GUkFfQU9fUlNUCQk4CisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfQ09OTl9SU1QJCQk5CisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfQVBNSVhFRF9SU1QJCTEwCisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfSElGU1lTX1JTVAkJMTEKKyNkZWZpbmUgTVQyNzAxX1RPUFJHVV9DT05OX01DVV9SU1QJCTEyCisjZGVmaW5lIE1UMjcwMV9UT1BSR1VfQkRQX0RJU1BfUlNUCQkxMworCisvKiBISUZTWVMgcmVzZXRzICovCisjZGVmaW5lIE1UMjcwMV9ISUZTWVNfVUhPU1QwX1JTVAkJMworI2RlZmluZSBNVDI3MDFfSElGU1lTX1VIT1NUMV9SU1QJCTQKKyNkZWZpbmUgTVQyNzAxX0hJRlNZU19VUEhZMF9SU1QJCQkyMQorI2RlZmluZSBNVDI3MDFfSElGU1lTX1VQSFkxX1JTVAkJCTIyCisjZGVmaW5lIE1UMjcwMV9ISUZTWVNfUENJRTBfUlNUCQkJMjQKKyNkZWZpbmUgTVQyNzAxX0hJRlNZU19QQ0lFMV9SU1QJCQkyNQorI2RlZmluZSBNVDI3MDFfSElGU1lTX1BDSUUyX1JTVAkJCTI2CisKKyNlbmRpZiAgLyogX0RUX0JJTkRJTkdTX1JFU0VUX0NPTlRST0xMRVJfTVQyNzAxICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L3Fjb20sZ2NjLW1kbTk2MTUuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvcmVzZXQvcWNvbSxnY2MtbWRtOTYxNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmODZlOWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L3Fjb20sZ2NjLW1kbTk2MTUuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIEJheUxpYnJlLCBTQVMuCisgKiBBdXRob3IgOiBOZWlsIEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19SRVNFVF9HQ0NfTURNOTYxNV9ICisjZGVmaW5lIF9EVF9CSU5ESU5HU19SRVNFVF9HQ0NfTURNOTYxNV9ICisKKyNkZWZpbmUgU0ZBQl9NU1NfUTZfU1dfUkVTRVQJCQkJMAorI2RlZmluZSBTRkFCX01TU19RNl9GV19SRVNFVAkJCQkxCisjZGVmaW5lIFFEU1NfU1RNX1JFU0VUCQkJCQkyCisjZGVmaW5lIEFGQUJfU01QU1NfU19SRVNFVAkJCQkzCisjZGVmaW5lIEFGQUJfU01QU1NfTTFfUkVTRVQJCQkJNAorI2RlZmluZSBBRkFCX1NNUFNTX00wX1JFU0VUCQkJCTUKKyNkZWZpbmUgQUZBQl9FQkkxX0NIMF9SRVNFVAkJCQk2CisjZGVmaW5lIEFGQUJfRUJJMV9DSDFfUkVTRVQJCQkJNworI2RlZmluZSBTRkFCX0FETTBfTTBfUkVTRVQJCQkJOAorI2RlZmluZSBTRkFCX0FETTBfTTFfUkVTRVQJCQkJOQorI2RlZmluZSBTRkFCX0FETTBfTTJfUkVTRVQJCQkJMTAKKyNkZWZpbmUgQURNMF9DMl9SRVNFVAkJCQkJMTEKKyNkZWZpbmUgQURNMF9DMV9SRVNFVAkJCQkJMTIKKyNkZWZpbmUgQURNMF9DMF9SRVNFVAkJCQkJMTMKKyNkZWZpbmUgQURNMF9QQlVTX1JFU0VUCQkJCQkxNAorI2RlZmluZSBBRE0wX1JFU0VUCQkJCQkxNQorI2RlZmluZSBRRFNTX0NMS1NfU1dfUkVTRVQJCQkJMTYKKyNkZWZpbmUgUURTU19QT1JfUkVTRVQJCQkJCTE3CisjZGVmaW5lIFFEU1NfVFNDVFJfUkVTRVQJCQkJMTgKKyNkZWZpbmUgUURTU19IUkVTRVRfUkVTRVQJCQkJMTkKKyNkZWZpbmUgUURTU19BWElfUkVTRVQJCQkJCTIwCisjZGVmaW5lIFFEU1NfREJHX1JFU0VUCQkJCQkyMQorI2RlZmluZSBQQ0lFX0FfUkVTRVQJCQkJCTIyCisjZGVmaW5lIFBDSUVfQVVYX1JFU0VUCQkJCQkyMworI2RlZmluZSBQQ0lFX0hfUkVTRVQJCQkJCTI0CisjZGVmaW5lIFNGQUJfUENJRV9NX1JFU0VUCQkJCTI1CisjZGVmaW5lIFNGQUJfUENJRV9TX1JFU0VUCQkJCTI2CisjZGVmaW5lIFNGQUJfTVNTX01fUkVTRVQJCQkJMjcKKyNkZWZpbmUgU0ZBQl9VU0IzX01fUkVTRVQJCQkJMjgKKyNkZWZpbmUgU0ZBQl9SSVZBX01fUkVTRVQJCQkJMjkKKyNkZWZpbmUgU0ZBQl9MUEFTU19SRVNFVAkJCQkzMAorI2RlZmluZSBTRkFCX0FGQUJfTV9SRVNFVAkJCQkzMQorI2RlZmluZSBBRkFCX1NGQUJfTTBfUkVTRVQJCQkJMzIKKyNkZWZpbmUgQUZBQl9TRkFCX00xX1JFU0VUCQkJCTMzCisjZGVmaW5lIFNGQUJfU0FUQV9TX1JFU0VUCQkJCTM0CisjZGVmaW5lIFNGQUJfREZBQl9NX1JFU0VUCQkJCTM1CisjZGVmaW5lIERGQUJfU0ZBQl9NX1JFU0VUCQkJCTM2CisjZGVmaW5lIERGQUJfU1dBWTBfUkVTRVQJCQkJMzcKKyNkZWZpbmUgREZBQl9TV0FZMV9SRVNFVAkJCQkzOAorI2RlZmluZSBERkFCX0FSQjBfUkVTRVQJCQkJCTM5CisjZGVmaW5lIERGQUJfQVJCMV9SRVNFVAkJCQkJNDAKKyNkZWZpbmUgUFBTU19QUk9DX1JFU0VUCQkJCQk0MQorI2RlZmluZSBQUFNTX1JFU0VUCQkJCQk0MgorI2RlZmluZSBETUFfQkFNX1JFU0VUCQkJCQk0MworI2RlZmluZSBTUFNfVElDX0hfUkVTRVQJCQkJCTQ0CisjZGVmaW5lIFNMSU1CVVNfSF9SRVNFVAkJCQkJNDUKKyNkZWZpbmUgU0ZBQl9DRlBCX01fUkVTRVQJCQkJNDYKKyNkZWZpbmUgU0ZBQl9DRlBCX1NfUkVTRVQJCQkJNDcKKyNkZWZpbmUgVFNJRl9IX1JFU0VUCQkJCQk0OAorI2RlZmluZSBDRTFfSF9SRVNFVAkJCQkJNDkKKyNkZWZpbmUgQ0UxX0NPUkVfUkVTRVQJCQkJCTUwCisjZGVmaW5lIENFMV9TTEVFUF9SRVNFVAkJCQkJNTEKKyNkZWZpbmUgQ0UyX0hfUkVTRVQJCQkJCTUyCisjZGVmaW5lIENFMl9DT1JFX1JFU0VUCQkJCQk1MworI2RlZmluZSBTRkFCX1NGUEJfTV9SRVNFVAkJCQk1NAorI2RlZmluZSBTRkFCX1NGUEJfU19SRVNFVAkJCQk1NQorI2RlZmluZSBSUE1fUFJPQ19SRVNFVAkJCQkJNTYKKyNkZWZpbmUgUE1JQ19TU0JJMl9SRVNFVAkJCQk1NworI2RlZmluZSBTREMxX1JFU0VUCQkJCQk1OAorI2RlZmluZSBTREMyX1JFU0VUCQkJCQk1OQorI2RlZmluZSBTREMzX1JFU0VUCQkJCQk2MAorI2RlZmluZSBTREM0X1JFU0VUCQkJCQk2MQorI2RlZmluZSBTREM1X1JFU0VUCQkJCQk2MgorI2RlZmluZSBERkFCX0EyX1JFU0VUCQkJCQk2MworI2RlZmluZSBVU0JfSFMxX1JFU0VUCQkJCQk2NAorI2RlZmluZSBVU0JfSFNJQ19SRVNFVAkJCQkJNjUKKyNkZWZpbmUgVVNCX0ZTMV9YQ1ZSX1JFU0VUCQkJCTY2CisjZGVmaW5lIFVTQl9GUzFfUkVTRVQJCQkJCTY3CisjZGVmaW5lIFVTQl9GUzJfWENWUl9SRVNFVAkJCQk2OAorI2RlZmluZSBVU0JfRlMyX1JFU0VUCQkJCQk2OQorI2RlZmluZSBHU0JJMV9SRVNFVAkJCQkJNzAKKyNkZWZpbmUgR1NCSTJfUkVTRVQJCQkJCTcxCisjZGVmaW5lIEdTQkkzX1JFU0VUCQkJCQk3MgorI2RlZmluZSBHU0JJNF9SRVNFVAkJCQkJNzMKKyNkZWZpbmUgR1NCSTVfUkVTRVQJCQkJCTc0CisjZGVmaW5lIEdTQkk2X1JFU0VUCQkJCQk3NQorI2RlZmluZSBHU0JJN19SRVNFVAkJCQkJNzYKKyNkZWZpbmUgR1NCSThfUkVTRVQJCQkJCTc3CisjZGVmaW5lIEdTQkk5X1JFU0VUCQkJCQk3OAorI2RlZmluZSBHU0JJMTBfUkVTRVQJCQkJCTc5CisjZGVmaW5lIEdTQkkxMV9SRVNFVAkJCQkJODAKKyNkZWZpbmUgR1NCSTEyX1JFU0VUCQkJCQk4MQorI2RlZmluZSBTUERNX1JFU0VUCQkJCQk4MgorI2RlZmluZSBUTE1NX0hfUkVTRVQJCQkJCTgzCisjZGVmaW5lIFNGQUJfTVNTX1NfUkVTRVQJCQkJODQKKyNkZWZpbmUgTVNTX1NMUF9SRVNFVAkJCQkJODUKKyNkZWZpbmUgTVNTX1E2U1dfSlRBR19SRVNFVAkJCQk4NgorI2RlZmluZSBNU1NfUTZGV19KVEFHX1JFU0VUCQkJCTg3CisjZGVmaW5lIE1TU19SRVNFVAkJCQkJODgKKyNkZWZpbmUgU0FUQV9IX1JFU0VUCQkJCQk4OQorI2RlZmluZSBTQVRBX1JYT09CX1JFU0UJCQkJCTkwCisjZGVmaW5lIFNBVEFfUE1BTElWRV9SRVNFVAkJCQk5MQorI2RlZmluZSBTQVRBX1NGQUJfTV9SRVNFVAkJCQk5MgorI2RlZmluZSBUU1NDX1JFU0VUCQkJCQk5MworI2RlZmluZSBQRE1fUkVTRVQJCQkJCTk0CisjZGVmaW5lIE1QTV9IX1JFU0VUCQkJCQk5NQorI2RlZmluZSBNUE1fUkVTRVQJCQkJCTk2CisjZGVmaW5lIFNGQUJfU01QU1NfU19SRVNFVAkJCQk5NworI2RlZmluZSBQUk5HX1JFU0VUCQkJCQk5OAorI2RlZmluZSBSSVZBX1JFU0VUCQkJCQk5OQorI2RlZmluZSBVU0JfSFMzX1JFU0VUCQkJCQkxMDAKKyNkZWZpbmUgVVNCX0hTNF9SRVNFVAkJCQkJMTAxCisjZGVmaW5lIENFM19SRVNFVAkJCQkJMTAyCisjZGVmaW5lIFBDSUVfRVhUX1BDSV9SRVNFVAkJCQkxMDMKKyNkZWZpbmUgUENJRV9QSFlfUkVTRVQJCQkJCTEwNAorI2RlZmluZSBQQ0lFX1BDSV9SRVNFVAkJCQkJMTA1CisjZGVmaW5lIFBDSUVfUE9SX1JFU0VUCQkJCQkxMDYKKyNkZWZpbmUgUENJRV9IQ0xLX1JFU0VUCQkJCQkxMDcKKyNkZWZpbmUgUENJRV9BQ0xLX1JFU0VUCQkJCQkxMDgKKyNkZWZpbmUgQ0UzX0hfUkVTRVQJCQkJCTEwOQorI2RlZmluZSBTRkFCX0NFM19NX1JFU0VUCQkJCTExMAorI2RlZmluZSBTRkFCX0NFM19TX1JFU0VUCQkJCTExMQorI2RlZmluZSBTQVRBX1JFU0VUCQkJCQkxMTIKKyNkZWZpbmUgQ0UzX1NMRUVQX1JFU0VUCQkJCQkxMTMKKyNkZWZpbmUgR1NTX1NMUF9SRVNFVAkJCQkJMTE0CisjZGVmaW5lIEdTU19SRVNFVAkJCQkJMTE1CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW42aS1hMzEtY2N1LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L3N1bjZpLWEzMS1jY3UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmZmMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW42aS1hMzEtY2N1LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgQ2hlbi1ZdSBUc2FpIDx3ZW5zQGNzaWUub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBkdWFsLWxpY2Vuc2VkOiB5b3UgY2FuIHVzZSBpdCBlaXRoZXIgdW5kZXIgdGhlIHRlcm1zCisgKiBvZiB0aGUgR1BMIG9yIHRoZSBYMTEgbGljZW5zZSwgYXQgeW91ciBvcHRpb24uIE5vdGUgdGhhdCB0aGlzIGR1YWwKKyAqIGxpY2Vuc2luZyBvbmx5IGFwcGxpZXMgdG8gdGhpcyBmaWxlLCBhbmQgbm90IHRoaXMgcHJvamVjdCBhcyBhCisgKiB3aG9sZS4KKyAqCisgKiAgYSkgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgKiAgICAgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBPciwgYWx0ZXJuYXRpdmVseSwKKyAqCisgKiAgYikgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KKyAqICAgICBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorICogICAgIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQKKyAqICAgICByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwKKyAqICAgICBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqICAgICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogICAgIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9uczoKKyAqCisgKiAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyAqICAgICBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiAgICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiAgICAgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTCisgKiAgICAgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqICAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAorICogICAgIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLAorICogICAgIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogICAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqICAgICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfRFRfQklORElOR1NfUlNUX1NVTjZJX0EzMV9IXworI2RlZmluZSBfRFRfQklORElOR1NfUlNUX1NVTjZJX0EzMV9IXworCisjZGVmaW5lIFJTVF9VU0JfUEhZMAkJMAorI2RlZmluZSBSU1RfVVNCX1BIWTEJCTEKKyNkZWZpbmUgUlNUX1VTQl9QSFkyCQkyCisKKyNkZWZpbmUgUlNUX0FIQjFfTUlQSV9EU0kJMworI2RlZmluZSBSU1RfQUhCMV9TUwkJNAorI2RlZmluZSBSU1RfQUhCMV9ETUEJCTUKKyNkZWZpbmUgUlNUX0FIQjFfTU1DMAkJNgorI2RlZmluZSBSU1RfQUhCMV9NTUMxCQk3CisjZGVmaW5lIFJTVF9BSEIxX01NQzIJCTgKKyNkZWZpbmUgUlNUX0FIQjFfTU1DMwkJOQorI2RlZmluZSBSU1RfQUhCMV9OQU5EMQkJMTAKKyNkZWZpbmUgUlNUX0FIQjFfTkFORDAJCTExCisjZGVmaW5lIFJTVF9BSEIxX1NEUkFNCQkxMgorI2RlZmluZSBSU1RfQUhCMV9FTUFDCQkxMworI2RlZmluZSBSU1RfQUhCMV9UUwkJMTQKKyNkZWZpbmUgUlNUX0FIQjFfSFNUSU1FUgkxNQorI2RlZmluZSBSU1RfQUhCMV9TUEkwCQkxNgorI2RlZmluZSBSU1RfQUhCMV9TUEkxCQkxNworI2RlZmluZSBSU1RfQUhCMV9TUEkyCQkxOAorI2RlZmluZSBSU1RfQUhCMV9TUEkzCQkxOQorI2RlZmluZSBSU1RfQUhCMV9PVEcJCTIwCisjZGVmaW5lIFJTVF9BSEIxX0VIQ0kwCQkyMQorI2RlZmluZSBSU1RfQUhCMV9FSENJMQkJMjIKKyNkZWZpbmUgUlNUX0FIQjFfT0hDSTAJCTIzCisjZGVmaW5lIFJTVF9BSEIxX09IQ0kxCQkyNAorI2RlZmluZSBSU1RfQUhCMV9PSENJMgkJMjUKKyNkZWZpbmUgUlNUX0FIQjFfVkUJCTI2CisjZGVmaW5lIFJTVF9BSEIxX0xDRDAJCTI3CisjZGVmaW5lIFJTVF9BSEIxX0xDRDEJCTI4CisjZGVmaW5lIFJTVF9BSEIxX0NTSQkJMjkKKyNkZWZpbmUgUlNUX0FIQjFfSERNSQkJMzAKKyNkZWZpbmUgUlNUX0FIQjFfQkUwCQkzMQorI2RlZmluZSBSU1RfQUhCMV9CRTEJCTMyCisjZGVmaW5lIFJTVF9BSEIxX0ZFMAkJMzMKKyNkZWZpbmUgUlNUX0FIQjFfRkUxCQkzNAorI2RlZmluZSBSU1RfQUhCMV9NUAkJMzUKKyNkZWZpbmUgUlNUX0FIQjFfR1BVCQkzNgorI2RlZmluZSBSU1RfQUhCMV9ERVUwCQkzNworI2RlZmluZSBSU1RfQUhCMV9ERVUxCQkzOAorI2RlZmluZSBSU1RfQUhCMV9EUkMwCQkzOQorI2RlZmluZSBSU1RfQUhCMV9EUkMxCQk0MAorI2RlZmluZSBSU1RfQUhCMV9MVkRTCQk0MQorCisjZGVmaW5lIFJTVF9BUEIxX0NPREVDCQk0MgorI2RlZmluZSBSU1RfQVBCMV9TUERJRgkJNDMKKyNkZWZpbmUgUlNUX0FQQjFfRElHSVRBTF9NSUMJNDQKKyNkZWZpbmUgUlNUX0FQQjFfREFVRElPMAk0NQorI2RlZmluZSBSU1RfQVBCMV9EQVVESU8xCTQ2CisjZGVmaW5lIFJTVF9BUEIyX0kyQzAJCTQ3CisjZGVmaW5lIFJTVF9BUEIyX0kyQzEJCTQ4CisjZGVmaW5lIFJTVF9BUEIyX0kyQzIJCTQ5CisjZGVmaW5lIFJTVF9BUEIyX0kyQzMJCTUwCisjZGVmaW5lIFJTVF9BUEIyX1VBUlQwCQk1MQorI2RlZmluZSBSU1RfQVBCMl9VQVJUMQkJNTIKKyNkZWZpbmUgUlNUX0FQQjJfVUFSVDIJCTUzCisjZGVmaW5lIFJTVF9BUEIyX1VBUlQzCQk1NAorI2RlZmluZSBSU1RfQVBCMl9VQVJUNAkJNTUKKyNkZWZpbmUgUlNUX0FQQjJfVUFSVDUJCTU2CisKKyNlbmRpZiAvKiBfRFRfQklORElOR1NfUlNUX1NVTjZJX0EzMV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW44aS1hMjMtYTMzLWNjdS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9yZXNldC9zdW44aS1hMjMtYTMzLWNjdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMjFmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3Jlc2V0L3N1bjhpLWEyMy1hMzMtY2N1LmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBNYXhpbWUgUmlwYXJkIDxtYXhpbWUucmlwYXJkQGZyZWUtZWxlY3Ryb25zLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgZHVhbC1saWNlbnNlZDogeW91IGNhbiB1c2UgaXQgZWl0aGVyIHVuZGVyIHRoZSB0ZXJtcworICogb2YgdGhlIEdQTCBvciB0aGUgWDExIGxpY2Vuc2UsIGF0IHlvdXIgb3B0aW9uLiBOb3RlIHRoYXQgdGhpcyBkdWFsCisgKiBsaWNlbnNpbmcgb25seSBhcHBsaWVzIHRvIHRoaXMgZmlsZSwgYW5kIG5vdCB0aGlzIHByb2plY3QgYXMgYQorICogd2hvbGUuCisgKgorICogIGEpIFRoaXMgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogICAgIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogT3IsIGFsdGVybmF0aXZlbHksCisgKgorICogIGIpIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uCisgKiAgICAgb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyAqICAgICBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiAgICAgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsCisgKiAgICAgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiAgICAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqICAgICBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnM6CisgKgorICogICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCisgKiAgICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUworICogICAgIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiAgICAgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQKKyAqICAgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKKyAqICAgICBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqICAgICBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiAgICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX1JTVF9TVU44SV9BMjNfQTMzX0hfCisjZGVmaW5lIF9EVF9CSU5ESU5HU19SU1RfU1VOOElfQTIzX0EzM19IXworCisjZGVmaW5lIFJTVF9VU0JfUEhZMAkJMAorI2RlZmluZSBSU1RfVVNCX1BIWTEJCTEKKyNkZWZpbmUgUlNUX1VTQl9IU0lDCQkyCisjZGVmaW5lIFJTVF9NQlVTCQkzCisjZGVmaW5lIFJTVF9CVVNfTUlQSV9EU0kJNAorI2RlZmluZSBSU1RfQlVTX1NTCQk1CisjZGVmaW5lIFJTVF9CVVNfRE1BCQk2CisjZGVmaW5lIFJTVF9CVVNfTU1DMAkJNworI2RlZmluZSBSU1RfQlVTX01NQzEJCTgKKyNkZWZpbmUgUlNUX0JVU19NTUMyCQk5CisjZGVmaW5lIFJTVF9CVVNfTkFORAkJMTAKKyNkZWZpbmUgUlNUX0JVU19EUkFNCQkxMQorI2RlZmluZSBSU1RfQlVTX0hTVElNRVIJCTEyCisjZGVmaW5lIFJTVF9CVVNfU1BJMAkJMTMKKyNkZWZpbmUgUlNUX0JVU19TUEkxCQkxNAorI2RlZmluZSBSU1RfQlVTX09URwkJMTUKKyNkZWZpbmUgUlNUX0JVU19FSENJCQkxNgorI2RlZmluZSBSU1RfQlVTX09IQ0kJCTE3CisjZGVmaW5lIFJTVF9CVVNfVkUJCTE4CisjZGVmaW5lIFJTVF9CVVNfTENECQkxOQorI2RlZmluZSBSU1RfQlVTX0NTSQkJMjAKKyNkZWZpbmUgUlNUX0JVU19ERV9CRQkJMjEKKyNkZWZpbmUgUlNUX0JVU19ERV9GRQkJMjIKKyNkZWZpbmUgUlNUX0JVU19HUFUJCTIzCisjZGVmaW5lIFJTVF9CVVNfTVNHQk9YCQkyNAorI2RlZmluZSBSU1RfQlVTX1NQSU5MT0NLCTI1CisjZGVmaW5lIFJTVF9CVVNfRFJDCQkyNgorI2RlZmluZSBSU1RfQlVTX1NBVAkJMjcKKyNkZWZpbmUgUlNUX0JVU19MVkRTCQkyOAorI2RlZmluZSBSU1RfQlVTX0NPREVDCQkyOQorI2RlZmluZSBSU1RfQlVTX0kyUzAJCTMwCisjZGVmaW5lIFJTVF9CVVNfSTJTMQkJMzEKKyNkZWZpbmUgUlNUX0JVU19JMkMwCQkzMgorI2RlZmluZSBSU1RfQlVTX0kyQzEJCTMzCisjZGVmaW5lIFJTVF9CVVNfSTJDMgkJMzQKKyNkZWZpbmUgUlNUX0JVU19VQVJUMAkJMzUKKyNkZWZpbmUgUlNUX0JVU19VQVJUMQkJMzYKKyNkZWZpbmUgUlNUX0JVU19VQVJUMgkJMzcKKyNkZWZpbmUgUlNUX0JVU19VQVJUMwkJMzgKKyNkZWZpbmUgUlNUX0JVU19VQVJUNAkJMzkKKworI2VuZGlmIC8qIF9EVF9CSU5ESU5HU19SU1RfU1VOOElfQTIzX0EzM19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9rdm0vYXJtX3ZnaWMuaCBiL2luY2x1ZGUva3ZtL2FybV92Z2ljLmgKaW5kZXggMTliNjk4ZS4uMDAyZjA5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9rdm0vYXJtX3ZnaWMuaAorKysgYi9pbmNsdWRlL2t2bS9hcm1fdmdpYy5oCkBAIC0yMCw5ICsyMCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdGljX2tleS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8a3ZtL2lvZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KIAogI2RlZmluZSBWR0lDX1YzX01BWF9DUFVTCTI1NQogI2RlZmluZSBWR0lDX1YyX01BWF9DUFVTCTgKQEAgLTQ5LDYgKzUxLDkgQEAKIAkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHZnaWMgdmlydHVhbCBjcHUgaW50ZXJmYWNlICovCiAJcGh5c19hZGRyX3QJCXZjcHVfYmFzZTsKIAorCS8qIEdJQ1YgbWFwcGluZyAqLworCXZvaWQgX19pb21lbQkJKnZjcHVfYmFzZV92YTsKKwogCS8qIHZpcnR1YWwgY29udHJvbCBpbnRlcmZhY2UgbWFwcGluZyAqLwogCXZvaWQgX19pb21lbQkJKnZjdHJsX2Jhc2U7CiAKQEAgLTYzLDYgKzY4LDkgQEAKIAogCS8qIE9ubHkgbmVlZGVkIGZvciB0aGUgbGVnYWN5IEtWTV9DUkVBVEVfSVJRQ0hJUCAqLwogCWJvb2wJCQljYW5fZW11bGF0ZV9naWN2MjsKKworCS8qIEdJQyBzeXN0ZW0gcmVnaXN0ZXIgQ1BVIGludGVyZmFjZSAqLworCXN0cnVjdCBzdGF0aWNfa2V5X2ZhbHNlIGdpY3YzX2NwdWlmOwogfTsKIAogZXh0ZXJuIHN0cnVjdCB2Z2ljX2dsb2JhbCBrdm1fdmdpY19nbG9iYWxfc3RhdGU7CkBAIC0yMTcsNyArMjI1LDYgQEAKIH07CiAKIHN0cnVjdCB2Z2ljX3YzX2NwdV9pZiB7Ci0jaWZkZWYgQ09ORklHX0tWTV9BUk1fVkdJQ19WMwogCXUzMgkJdmdpY19oY3I7CiAJdTMyCQl2Z2ljX3ZtY3I7CiAJdTMyCQl2Z2ljX3NyZTsJLyogUmVzdG9yZWQgb25seSwgY2hhbmdlIGlnbm9yZWQgKi8KQEAgLTIyNyw3ICsyMzQsNiBAQAogCXUzMgkJdmdpY19hcDByWzRdOwogCXUzMgkJdmdpY19hcDFyWzRdOwogCXU2NAkJdmdpY19scltWR0lDX1YzX01BWF9MUlNdOwotI2VuZGlmCiB9OwogCiBzdHJ1Y3QgdmdpY19jcHUgewpAQCAtMjY1LDYgKzI3MSw4IEBACiAJYm9vbCBscGlzX2VuYWJsZWQ7CiB9OwogCitleHRlcm4gc3RydWN0IHN0YXRpY19rZXlfZmFsc2UgdmdpY192Ml9jcHVpZl90cmFwOworCiBpbnQga3ZtX3ZnaWNfYWRkcihzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgdHlwZSwgdTY0ICphZGRyLCBib29sIHdyaXRlKTsKIHZvaWQga3ZtX3ZnaWNfZWFybHlfaW5pdChzdHJ1Y3Qga3ZtICprdm0pOwogaW50IGt2bV92Z2ljX2NyZWF0ZShzdHJ1Y3Qga3ZtICprdm0sIHUzMiB0eXBlKTsKQEAgLTI5NCwxMyArMzAyLDcgQEAKIHZvaWQga3ZtX3ZnaWNfc3luY19od3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV92Z2ljX2ZsdXNoX2h3c3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAotI2lmZGVmIENPTkZJR19LVk1fQVJNX1ZHSUNfVjMKIHZvaWQgdmdpY192M19kaXNwYXRjaF9zZ2koc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgcmVnKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgdmdpY192M19kaXNwYXRjaF9zZ2koc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgcmVnKQotewotfQotI2VuZGlmCiAKIC8qKgogICoga3ZtX3ZnaWNfZ2V0X21heF92Y3B1cyAtIEdldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgVkNQVXMgYWxsb3dlZCBieSBIVwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpLmggYi9pbmNsdWRlL2xpbnV4L2FjcGkuaAppbmRleCA0ZDg0NTJjLi45NGFmY2IyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKQEAgLTg1LDYgKzg1LDggQEAKIAlyZXR1cm4gZGV2X25hbWUoJmFkZXYtPmRldik7CiB9CiAKK3N0cnVjdCBkZXZpY2UgKmFjcGlfZ2V0X2ZpcnN0X3BoeXNpY2FsX25vZGUoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KTsKKwogZW51bSBhY3BpX2lycV9tb2RlbF9pZCB7CiAJQUNQSV9JUlFfTU9ERUxfUElDID0gMCwKIAlBQ1BJX0lSUV9NT0RFTF9JT0FQSUMsCkBAIC0yNjcsMTIgKzI2OSwxOCBAQAogCXJldHVybiBwaHlzX2lkID09IFBIWVNfQ1BVSURfSU5WQUxJRDsKIH0KIAorLyogVmFsaWRhdGUgdGhlIHByb2Nlc3NvciBvYmplY3QncyBwcm9jX2lkICovCitib29sIGFjcGlfcHJvY2Vzc29yX3ZhbGlkYXRlX3Byb2NfaWQoaW50IHByb2NfaWQpOworCiAjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19DUFUKIC8qIEFyY2ggZGVwZW5kZW50IGZ1bmN0aW9ucyBmb3IgY3B1IGhvdHBsdWcgc3VwcG9ydCAqLwogaW50IGFjcGlfbWFwX2NwdShhY3BpX2hhbmRsZSBoYW5kbGUsIHBoeXNfY3B1aWRfdCBwaHlzaWQsIGludCAqcGNwdSk7CiBpbnQgYWNwaV91bm1hcF9jcHUoaW50IGNwdSk7CitpbnQgYWNwaV9tYXBfY3B1Mm5vZGUoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgY3B1LCBpbnQgcGh5c2lkKTsKICNlbmRpZiAvKiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVSAqLwogCit2b2lkIGFjcGlfc2V0X3Byb2Nlc3Nvcl9tYXBwaW5nKHZvaWQpOworCiAjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19JT0FQSUMKIGludCBhY3BpX2dldF9pb2FwaWNfaWQoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZ3NpX2Jhc2UsIHU2NCAqcGh5c19hZGRyKTsKICNlbmRpZgpAQCAtNjM0LDYgKzY0MiwxMSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKmFjcGlfZ2V0X2ZpcnN0X3BoeXNpY2FsX25vZGUoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KQoreworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9lYXJseV9pbml0KHZvaWQpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfc3Vic3lzdGVtX2luaXQodm9pZCkgeyB9CiAKQEAgLTc1MSw2ICs3NjQsMTIgQEAKIAogI2VuZGlmCS8qICFDT05GSUdfQUNQSSAqLwogCisjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19JT0FQSUMKK2ludCBhY3BpX2lvYXBpY19hZGQoYWNwaV9oYW5kbGUgcm9vdCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgYWNwaV9pb2FwaWNfYWRkKGFjcGlfaGFuZGxlIHJvb3QpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0FDUEkKIHZvaWQgYWNwaV9vc19zZXRfcHJlcGFyZV9zbGVlcChpbnQgKCpmdW5jKSh1OCBzbGVlcF9zdGF0ZSwKIAkJCSAgICAgICB1MzIgcG0xYV9jdHJsLCAgdTMyIHBtMWJfY3RybCkpOwpAQCAtMTA1Niw3ICsxMDc1LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotI2RlZmluZSBBQ1BJX0RFQ0xBUkVfUFJPQkVfRU5UUlkodGFibGUsIG5hbWUsIHRhYmxlX2lkLCBzdWJ0YWJsZSwgdmFsaWRhdGUsIGRhdGEsIGZuKSBcCisjZGVmaW5lIEFDUElfREVDTEFSRV9QUk9CRV9FTlRSWSh0YWJsZSwgbmFtZSwgdGFibGVfaWQsIHN1YnRhYmxlLCB2YWxpZCwgZGF0YSwgZm4pIFwKIAlzdGF0aWMgY29uc3Qgdm9pZCAqIF9fYWNwaV90YWJsZV8jI25hbWVbXQkJCVwKIAkJX19hdHRyaWJ1dGVfXygodW51c2VkKSkJCQkJCVwKIAkJID0geyAodm9pZCAqKSB0YWJsZV9pZCwJCQkJCVwKQEAgLTEwNzQsNCArMTA5MywxNiBAQAogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfdGFibGVfdXBncmFkZSh2b2lkKSB7IH0KICNlbmRpZgogCisjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkgJiYgZGVmaW5lZChDT05GSUdfQUNQSV9XQVRDSERPRykKK2V4dGVybiBib29sIGFjcGlfaGFzX3dhdGNoZG9nKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBhY3BpX2hhc193YXRjaGRvZyh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQUNQSV9TUENSX1RBQkxFCitpbnQgcGFyc2Vfc3Bjcihib29sIGVhcmx5Y29uKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBwYXJzZV9zcGNyKGJvb2wgZWFybHljb24pIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCiAjZW5kaWYJLypfTElOVVhfQUNQSV9IKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaV9pb3J0LmggYi9pbmNsdWRlL2xpbnV4L2FjcGlfaW9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMzJkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2FjcGlfaW9ydC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYsIFNlbWloYWxmCisgKglBdXRob3I6IFRvbWFzeiBOb3dpY2tpIDx0bkBzZW1paGFsZi5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUKKyAqIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICovCisKKyNpZm5kZWYgX19BQ1BJX0lPUlRfSF9fCisjZGVmaW5lIF9fQUNQSV9JT1JUX0hfXworCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Z3bm9kZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorCitpbnQgaW9ydF9yZWdpc3Rlcl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkLCBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndfbm9kZSk7Cit2b2lkIGlvcnRfZGVyZWdpc3Rlcl9kb21haW5fdG9rZW4oaW50IHRyYW5zX2lkKTsKK3N0cnVjdCBmd25vZGVfaGFuZGxlICppb3J0X2ZpbmRfZG9tYWluX3Rva2VuKGludCB0cmFuc19pZCk7CisjaWZkZWYgQ09ORklHX0FDUElfSU9SVAordm9pZCBhY3BpX2lvcnRfaW5pdCh2b2lkKTsKK3UzMiBpb3J0X21zaV9tYXBfcmlkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHJlcV9pZCk7CitzdHJ1Y3QgaXJxX2RvbWFpbiAqaW9ydF9nZXRfZGV2aWNlX2RvbWFpbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiByZXFfaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2lvcnRfaW5pdCh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdTMyIGlvcnRfbXNpX21hcF9yaWQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgcmVxX2lkKQoreyByZXR1cm4gcmVxX2lkOyB9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBpcnFfZG9tYWluICppb3J0X2dldF9kZXZpY2VfZG9tYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCQl1MzIgcmVxX2lkKQoreyByZXR1cm4gTlVMTDsgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0FDUElfSU9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWVyLmggYi9pbmNsdWRlL2xpbnV4L2Flci5oCmluZGV4IDE2NDA0OTMuLjA0NjAyY2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9hZXIuaApAQCAtNjMsNyArNjMsNyBAQAogfQogI2VuZGlmCiAKLXZvaWQgY3Blcl9wcmludF9hZXIoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGNwZXJfc2V2ZXJpdHksCit2b2lkIGNwZXJfcHJpbnRfYWVyKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBhZXJfc2V2ZXJpdHksCiAJCSAgICBzdHJ1Y3QgYWVyX2NhcGFiaWxpdHlfcmVncyAqYWVyKTsKIGludCBjcGVyX3NldmVyaXR5X3RvX2FlcihpbnQgY3Blcl9zZXZlcml0eSk7CiB2b2lkIGFlcl9yZWNvdmVyX3F1ZXVlKGludCBkb21haW4sIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYW1iYS9idXMuaCBiL2luY2x1ZGUvbGludXgvYW1iYS9idXMuaAppbmRleCAzZDhkY2RkLi5kMTQzYzEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FtYmEvYnVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9hbWJhL2J1cy5oCkBAIC01Myw4ICs1MywxNCBAQAogCUFNQkFfVkVORE9SX1NUID0gMHg4MCwKIAlBTUJBX1ZFTkRPUl9RQ09NID0gMHg1MSwKIAlBTUJBX1ZFTkRPUl9MU0kgPSAweGI2LAorCUFNQkFfVkVORE9SX0xJTlVYID0gMHhmZSwJLyogVGhpcyB2YWx1ZSBpcyBub3Qgb2ZmaWNpYWwgKi8KIH07CiAKKy8qIFRoaXMgaXMgdXNlZCB0byBnZW5lcmF0ZSBwc2V1ZG8tSUQgZm9yIEFNQkEgZGV2aWNlICovCisjZGVmaW5lIEFNQkFfTElOVVhfSUQoY29uZiwgcmV2LCBwYXJ0KSBcCisJKCgoY29uZikgJiAweGZmKSA8PCAyNCB8ICgocmV2KSAmIDB4ZikgPDwgMjAgfCBcCisJQU1CQV9WRU5ET1JfTElOVVggPDwgMTIgfCAoKHBhcnQpICYgMHhmZmYpKQorCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIGFtYmFfYnVzdHlwZTsKIAogI2RlZmluZSB0b19hbWJhX2RldmljZShkKQljb250YWluZXJfb2YoZCwgc3RydWN0IGFtYmFfZGV2aWNlLCBkZXYpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FtYmEvc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L2FtYmEvc2VyaWFsLmgKaW5kZXggZDc2YTE5Yi4uYWQwOTY1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hbWJhL3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvYW1iYS9zZXJpYWwuaApAQCAtMTA0LDYgKzEwNCwxNSBAQAogI2RlZmluZSBVQVJUMDF4X0ZSX0NUUyAJCTB4MDAxCiAjZGVmaW5lIFVBUlQwMXhfRlJfVE1TSwkJKFVBUlQwMXhfRlJfVFhGRiArIFVBUlQwMXhfRlJfQlVTWSkKIAorLyoKKyAqIFNvbWUgYml0cyBvZiBGbGFnIFJlZ2lzdGVyIG9uIFpURSBkZXZpY2UgaGF2ZSBkaWZmZXJlbnQgcG9zaXRpb24gZnJvbQorICogc3RhbmRhcmQgb25lcy4KKyAqLworI2RlZmluZSBaWF9VQVJUMDF4X0ZSX0JVU1kJMHgxMDAKKyNkZWZpbmUgWlhfVUFSVDAxeF9GUl9EU1IJMHgwMDgKKyNkZWZpbmUgWlhfVUFSVDAxeF9GUl9DVFMJMHgwMDIKKyNkZWZpbmUgWlhfVUFSVDAxMV9GUl9SSQkweDAwMQorCiAjZGVmaW5lIFVBUlQwMTFfQ1JfQ1RTRU4JMHg4MDAwCS8qIENUUyBoYXJkd2FyZSBmbG93IGNvbnRyb2wgKi8KICNkZWZpbmUgVUFSVDAxMV9DUl9SVFNFTgkweDQwMDAJLyogUlRTIGhhcmR3YXJlIGZsb3cgY29udHJvbCAqLwogI2RlZmluZSBVQVJUMDExX0NSX09VVDIJCTB4MjAwMAkvKiBPVVQyICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FtZC1pb21tdS5oIGIvaW5jbHVkZS9saW51eC9hbWQtaW9tbXUuaAppbmRleCAyYjA4ZTc5Li4wOTc1MWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FtZC1pb21tdS5oCisrKyBiL2luY2x1ZGUvbGludXgvYW1kLWlvbW11LmgKQEAgLTIyLDYgKzIyLDIwIEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCisvKgorICogVGhpcyBpcyBtYWlubHkgdXNlZCB0byBjb21tdW5pY2F0ZSBpbmZvcm1hdGlvbiBiYWNrLWFuZC1mb3J0aAorICogYmV0d2VlbiBTVk0gYW5kIElPTU1VIGZvciBzZXR0aW5nIHVwIGFuZCB0ZWFyaW5nIGRvd24gcG9zdGVkCisgKiBpbnRlcnJ1cHQKKyAqLworc3RydWN0IGFtZF9pb21tdV9waV9kYXRhIHsKKwl1MzIgZ2FfdGFnOworCXUzMiBwcmV2X2dhX3RhZzsKKwl1NjQgYmFzZTsKKwlib29sIGlzX2d1ZXN0X21vZGU7CisJc3RydWN0IHZjcHVfZGF0YSAqdmNwdV9kYXRhOworCXZvaWQgKmlyX2RhdGE7Cit9OworCiAjaWZkZWYgQ09ORklHX0FNRF9JT01NVQogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CkBAIC0xNjgsMTEgKzE4MiwzNCBAQAogCiBleHRlcm4gaW50IGFtZF9pb21tdV9zZXRfaW52YWxpZGF0ZV9jdHhfY2Ioc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJCSAgIGFtZF9pb21tdV9pbnZhbGlkYXRlX2N0eCBjYik7Ci0KLSNlbHNlCisjZWxzZSAvKiBDT05GSUdfQU1EX0lPTU1VICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IGFtZF9pb21tdV9kZXRlY3Qodm9pZCkgeyByZXR1cm4gLUVOT0RFVjsgfQogCi0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfQU1EX0lPTU1VICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19BTURfSU9NTVUpICYmIGRlZmluZWQoQ09ORklHX0lSUV9SRU1BUCkKKworLyogSU9NTVUgQVZJQyBGdW5jdGlvbiAqLworZXh0ZXJuIGludCBhbWRfaW9tbXVfcmVnaXN0ZXJfZ2FfbG9nX25vdGlmaWVyKGludCAoKm5vdGlmaWVyKSh1MzIpKTsKKworZXh0ZXJuIGludAorYW1kX2lvbW11X3VwZGF0ZV9nYShpbnQgY3B1LCBib29sIGlzX3J1biwgdm9pZCAqZGF0YSk7CisKKyNlbHNlIC8qIGRlZmluZWQoQ09ORklHX0FNRF9JT01NVSkgJiYgZGVmaW5lZChDT05GSUdfSVJRX1JFTUFQKSAqLworCitzdGF0aWMgaW5saW5lIGludAorYW1kX2lvbW11X3JlZ2lzdGVyX2dhX2xvZ19ub3RpZmllcihpbnQgKCpub3RpZmllcikodTMyKSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FtZF9pb21tdV91cGRhdGVfZ2EoaW50IGNwdSwgYm9vbCBpc19ydW4sIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19BTURfSU9NTVUpICYmIGRlZmluZWQoQ09ORklHX0lSUV9SRU1BUCkgKi8KIAogI2VuZGlmIC8qIF9BU01fWDg2X0FNRF9JT01NVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0bWVsX3NlcmlhbC5oIGIvaW5jbHVkZS9saW51eC9hdG1lbF9zZXJpYWwuaAppbmRleCA1YTRkNjY0Li5iZDI1NjA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0bWVsX3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRtZWxfc2VyaWFsLmgKQEAgLTExOCw2ICsxMTgsOCBAQAogCiAjZGVmaW5lIEFUTUVMX1VTX0JSR1IJCTB4MjAJLyogQmF1ZCBSYXRlIEdlbmVyYXRvciBSZWdpc3RlciAqLwogI2RlZmluZQlBVE1FTF9VU19DRAkJR0VOTUFTSygxNSwgMCkJLyogQ2xvY2sgRGl2aWRlciAqLworI2RlZmluZSBBVE1FTF9VU19GUF9PRkZTRVQJMTYJLyogRnJhY3Rpb25hbCBQYXJ0ICovCisjZGVmaW5lIEFUTUVMX1VTX0ZQX01BU0sJMHg3CiAKICNkZWZpbmUgQVRNRUxfVVNfUlRPUgkJMHgyNAkvKiBSZWNlaXZlciBUaW1lLW91dCBSZWdpc3RlciBmb3IgVVNBUlQgKi8KICNkZWZpbmUgQVRNRUxfVUFfUlRPUgkJMHgyOAkvKiBSZWNlaXZlciBUaW1lLW91dCBSZWdpc3RlciBmb3IgVUFSVCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaCBiL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmgKaW5kZXggM2RiMjVkZi4uOGVlZWRiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYS5oCkBAIC0yMDUsNiArMjA1LDkgQEAKICNkZWZpbmUgIEJDTUFfUEtHX0lEX0JDTTQ3MDkJMAogI2RlZmluZSBCQ01BX0NISVBfSURfQkNNNDcwOTQJNTMwMzAKICNkZWZpbmUgQkNNQV9DSElQX0lEX0JDTTUzMDE4CTUzMDE4CisjZGVmaW5lIEJDTUFfQ0hJUF9JRF9CQ001MzU3Mwk1MzU3MworI2RlZmluZSAgQkNNQV9QS0dfSURfQkNNNTM1NzMJMAorI2RlZmluZSAgQkNNQV9QS0dfSURfQkNNNDcxODkJMQogCiAvKiBCb2FyZCB0eXBlcyAob24gUENJIHVzdWFsbHkgZXF1YWxzIHRvIHRoZSBzdWJzeXN0ZW0gZGV2IGlkKSAqLwogLyogQkNNNDMxMyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfcmVncy5oIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfcmVncy5oCmluZGV4IGViZDVjMWYuLjk5ODZmODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX3JlZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9yZWdzLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfSEFWRUFMUFJFUQkweDAwMDAwMDA4IC8qIEFMUCBhdmFpbGFibGUgcmVxdWVzdCAqLwogI2RlZmluZSAgQkNNQV9DTEtDVExTVF9IQVZFSFRSRVEJMHgwMDAwMDAxMCAvKiBIVCBhdmFpbGFibGUgcmVxdWVzdCAqLwogI2RlZmluZSAgQkNNQV9DTEtDVExTVF9IV0NST0ZGCQkweDAwMDAwMDIwIC8qIEZvcmNlIEhXIGNsb2NrIHJlcXVlc3Qgb2ZmICovCisjZGVmaW5lICBCQ01BX0NMS0NUTFNUX0hRQ0xLUkVRCQkweDAwMDAwMDQwIC8qIEhRIENsb2NrICovCiAjZGVmaW5lICBCQ01BX0NMS0NUTFNUX0VYVFJFU1JFUQkweDAwMDAwNzAwIC8qIE1hc2sgb2YgZXh0ZXJuYWwgcmVzb3VyY2UgcmVxdWVzdHMgKi8KICNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfRVhUUkVTUkVRX1NISUZUCTgKICNkZWZpbmUgIEJDTUFfQ0xLQ1RMU1RfSEFWRUFMUAkJMHgwMDAxMDAwMCAvKiBBTFAgYXZhaWxhYmxlICovCkBAIC0yMyw2ICsyNCw3IEBACiAjZGVmaW5lICBCQ01BX0NMS0NUTFNUXzQzMjhBMF9IQVZFQUxQCTB4MDAwMjAwMDAgLyogNDMyOGEwIGhhcyByZXZlcnNlZCBiaXRzICovCiAKIC8qIEFnZW50IHJlZ2lzdGVycyAoY29tbW9uIGZvciBldmVyeSBjb3JlKSAqLworI2RlZmluZSBCQ01BX09PQl9TRUxfT1VUX0EzMAkJMHgwMTAwCiAjZGVmaW5lIEJDTUFfSU9DVEwJCQkweDA0MDggLyogSU8gY29udHJvbCAqLwogI2RlZmluZSAgQkNNQV9JT0NUTF9DTEsJCQkweDAwMDEKICNkZWZpbmUgIEJDTUFfSU9DVExfRkdDCQkJMHgwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jpby5oIGIvaW5jbHVkZS9saW51eC9iaW8uaAppbmRleCAyM2RkZjRiLi45N2NiNDhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jpby5oCisrKyBiL2luY2x1ZGUvbGludXgvYmlvLmgKQEAgLTEsNiArMSw0IEBACiAvKgotICogMi41IGJsb2NrIEkvTyBtb2RlbAotICoKICAqIENvcHlyaWdodCAoQykgMjAwMSBKZW5zIEF4Ym9lIDxheGJvZUBzdXNlLmRlPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC00NjEsNiArNDU5LDcgQEAKIAogZXh0ZXJuIHZvaWQgYmlvX2NvcHlfZGF0YShzdHJ1Y3QgYmlvICpkc3QsIHN0cnVjdCBiaW8gKnNyYyk7CiBleHRlcm4gaW50IGJpb19hbGxvY19wYWdlcyhzdHJ1Y3QgYmlvICpiaW8sIGdmcF90IGdmcCk7CitleHRlcm4gdm9pZCBiaW9fZnJlZV9wYWdlcyhzdHJ1Y3QgYmlvICpiaW8pOwogCiBleHRlcm4gc3RydWN0IGJpbyAqYmlvX2NvcHlfdXNlcl9pb3Yoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwKIAkJCQkgICAgIHN0cnVjdCBycV9tYXBfZGF0YSAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaXRmaWVsZC5oIGIvaW5jbHVkZS9saW51eC9iaXRmaWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NTA1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2JpdGZpZWxkLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBGZWxpeCBGaWV0a2F1IDxuYmRAbmJkLm5hbWU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA5IEl2byB2YW4gRG9vcm4gPEl2RG9vcm5AZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0JJVEZJRUxEX0gKKyNkZWZpbmUgX0xJTlVYX0JJVEZJRUxEX0gKKworI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorCisvKgorICogQml0ZmllbGQgYWNjZXNzIG1hY3JvcworICoKKyAqIEZJRUxEX3tHRVQsUFJFUH0gbWFjcm9zIHRha2UgYXMgZmlyc3QgcGFyYW1ldGVyIHNoaWZ0ZWQgbWFzaworICogZnJvbSB3aGljaCB0aGV5IGV4dHJhY3QgdGhlIGJhc2UgbWFzayBhbmQgc2hpZnQgYW1vdW50LgorICogTWFzayBtdXN0IGJlIGEgY29tcGlsYXRpb24gdGltZSBjb25zdGFudC4KKyAqCisgKiBFeGFtcGxlOgorICoKKyAqICAjZGVmaW5lIFJFR19GSUVMRF9BICBHRU5NQVNLKDYsIDApCisgKiAgI2RlZmluZSBSRUdfRklFTERfQiAgQklUKDcpCisgKiAgI2RlZmluZSBSRUdfRklFTERfQyAgR0VOTUFTSygxNSwgOCkKKyAqICAjZGVmaW5lIFJFR19GSUVMRF9EICBHRU5NQVNLKDMxLCAxNikKKyAqCisgKiBHZXQ6CisgKiAgYSA9IEZJRUxEX0dFVChSRUdfRklFTERfQSwgcmVnKTsKKyAqICBiID0gRklFTERfR0VUKFJFR19GSUVMRF9CLCByZWcpOworICoKKyAqIFNldDoKKyAqICByZWcgPSBGSUVMRF9QUkVQKFJFR19GSUVMRF9BLCAxKSB8CisgKgkgIEZJRUxEX1BSRVAoUkVHX0ZJRUxEX0IsIDApIHwKKyAqCSAgRklFTERfUFJFUChSRUdfRklFTERfQywgYykgfAorICoJICBGSUVMRF9QUkVQKFJFR19GSUVMRF9ELCAweDQwKTsKKyAqCisgKiBNb2RpZnk6CisgKiAgcmVnICY9IH5SRUdfRklFTERfQzsKKyAqICByZWcgfD0gRklFTERfUFJFUChSRUdfRklFTERfQywgYyk7CisgKi8KKworI2RlZmluZSBfX2JmX3NoZih4KSAoX19idWlsdGluX2Zmc2xsKHgpIC0gMSkKKworI2RlZmluZSBfX0JGX0ZJRUxEX0NIRUNLKF9tYXNrLCBfcmVnLCBfdmFsLCBfcGZ4KQkJCVwKKwkoewkJCQkJCQkJXAorCQlCVUlMRF9CVUdfT05fTVNHKCFfX2J1aWx0aW5fY29uc3RhbnRfcChfbWFzayksCQlcCisJCQkJIF9wZnggIm1hc2sgaXMgbm90IGNvbnN0YW50Iik7CQlcCisJCUJVSUxEX0JVR19PTl9NU0coIShfbWFzayksIF9wZnggIm1hc2sgaXMgemVybyIpOwlcCisJCUJVSUxEX0JVR19PTl9NU0coX19idWlsdGluX2NvbnN0YW50X3AoX3ZhbCkgPwkJXAorCQkJCSB+KChfbWFzaykgPj4gX19iZl9zaGYoX21hc2spKSAmIChfdmFsKSA6IDAsIFwKKwkJCQkgX3BmeCAidmFsdWUgdG9vIGxhcmdlIGZvciB0aGUgZmllbGQiKTsgXAorCQlCVUlMRF9CVUdfT05fTVNHKChfbWFzaykgPiAodHlwZW9mKF9yZWcpKX4wdWxsLAkJXAorCQkJCSBfcGZ4ICJ0eXBlIG9mIHJlZyB0b28gc21hbGwgZm9yIG1hc2siKTsgXAorCQlfX0JVSUxEX0JVR19PTl9OT1RfUE9XRVJfT0ZfMigoX21hc2spICsJCQlcCisJCQkJCSAgICAgICgxVUxMIDw8IF9fYmZfc2hmKF9tYXNrKSkpOyBcCisJfSkKKworLyoqCisgKiBGSUVMRF9QUkVQKCkgLSBwcmVwYXJlIGEgYml0ZmllbGQgZWxlbWVudAorICogQF9tYXNrOiBzaGlmdGVkIG1hc2sgZGVmaW5pbmcgdGhlIGZpZWxkJ3MgbGVuZ3RoIGFuZCBwb3NpdGlvbgorICogQF92YWw6ICB2YWx1ZSB0byBwdXQgaW4gdGhlIGZpZWxkCisgKgorICogRklFTERfUFJFUCgpIG1hc2tzIGFuZCBzaGlmdHMgdXAgdGhlIHZhbHVlLiAgVGhlIHJlc3VsdCBzaG91bGQKKyAqIGJlIGNvbWJpbmVkIHdpdGggb3RoZXIgZmllbGRzIG9mIHRoZSBiaXRmaWVsZCB1c2luZyBsb2dpY2FsIE9SLgorICovCisjZGVmaW5lIEZJRUxEX1BSRVAoX21hc2ssIF92YWwpCQkJCQkJXAorCSh7CQkJCQkJCQlcCisJCV9fQkZfRklFTERfQ0hFQ0soX21hc2ssIDBVTEwsIF92YWwsICJGSUVMRF9QUkVQOiAiKTsJXAorCQkoKHR5cGVvZihfbWFzaykpKF92YWwpIDw8IF9fYmZfc2hmKF9tYXNrKSkgJiAoX21hc2spOwlcCisJfSkKKworLyoqCisgKiBGSUVMRF9HRVQoKSAtIGV4dHJhY3QgYSBiaXRmaWVsZCBlbGVtZW50CisgKiBAX21hc2s6IHNoaWZ0ZWQgbWFzayBkZWZpbmluZyB0aGUgZmllbGQncyBsZW5ndGggYW5kIHBvc2l0aW9uCisgKiBAX3JlZzogIDMyYml0IHZhbHVlIG9mIGVudGlyZSBiaXRmaWVsZAorICoKKyAqIEZJRUxEX0dFVCgpIGV4dHJhY3RzIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgQF9tYXNrIGZyb20gdGhlCisgKiBiaXRmaWVsZCBwYXNzZWQgaW4gYXMgQF9yZWcgYnkgbWFza2luZyBhbmQgc2hpZnRpbmcgaXQgZG93bi4KKyAqLworI2RlZmluZSBGSUVMRF9HRVQoX21hc2ssIF9yZWcpCQkJCQkJXAorCSh7CQkJCQkJCQlcCisJCV9fQkZfRklFTERfQ0hFQ0soX21hc2ssIF9yZWcsIDBVLCAiRklFTERfR0VUOiAiKTsJXAorCQkodHlwZW9mKF9tYXNrKSkoKChfcmVnKSAmIChfbWFzaykpID4+IF9fYmZfc2hmKF9tYXNrKSk7CVwKKwl9KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYml0bWFwLmggYi9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oCmluZGV4IDU5OGJjOTkuLjNiNzc1ODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYml0bWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaXRtYXAuaApAQCAtMzM5LDYgKzMzOSwyNCBAQAogCXJldHVybiBfX2JpdG1hcF9wYXJzZShidWYsIGJ1ZmxlbiwgMCwgbWFza3AsIG5tYXNrYml0cyk7CiB9CiAKKy8qCisgKiBiaXRtYXBfZnJvbV91NjQgLSBDaGVjayBhbmQgc3dhcCB3b3JkcyB3aXRoaW4gdTY0LgorICogIEBtYXNrOiBzb3VyY2UgYml0bWFwCisgKiAgQGRzdDogIGRlc3RpbmF0aW9uIGJpdG1hcAorICoKKyAqIEluIDMyLWJpdCBCaWcgRW5kaWFuIGtlcm5lbCwgd2hlbiB1c2luZyAodTMyICopKCZ2YWwpWypdCisgKiB0byByZWFkIHU2NCBtYXNrLCB3ZSB3aWxsIGdldCB0aGUgd3Jvbmcgd29yZC4KKyAqIFRoYXQgaXMgIih1MzIgKikoJnZhbClbMF0iIGdldHMgdGhlIHVwcGVyIDMyIGJpdHMsCisgKiBidXQgd2UgZXhwZWN0IHRoZSBsb3dlciAzMi1iaXRzIG9mIHU2NC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGJpdG1hcF9mcm9tX3U2NCh1bnNpZ25lZCBsb25nICpkc3QsIHU2NCBtYXNrKQoreworCWRzdFswXSA9IG1hc2sgJiBVTE9OR19NQVg7CisKKwlpZiAoc2l6ZW9mKG1hc2spID4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQlkc3RbMV0gPSBtYXNrID4+IDMyOworfQorCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX0xJTlVYX0JJVE1BUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsay1jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvYmxrLWNncm91cC5oCmluZGV4IDEwNjQ4ZTMuLmNiZGJmMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrLWNncm91cC5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrLWNncm91cC5oCkBAIC00NSw3ICs0NSw3IEBACiAJc3BpbmxvY2tfdAkJCWxvY2s7CiAKIAlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290CQlibGtnX3RyZWU7Ci0Jc3RydWN0IGJsa2NnX2dxCQkJKmJsa2dfaGludDsKKwlzdHJ1Y3QgYmxrY2dfZ3EJX19yY3UJCSpibGtnX2hpbnQ7CiAJc3RydWN0IGhsaXN0X2hlYWQJCWJsa2dfbGlzdDsKIAogCXN0cnVjdCBibGtjZ19wb2xpY3lfZGF0YQkqY3BkW0JMS0NHX01BWF9QT0xTXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrLW1xLmggYi9pbmNsdWRlL2xpbnV4L2Jsay1tcS5oCmluZGV4IGU0M2JiZmYuLjVkYWEwZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrLW1xLmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGstbXEuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgQkxLX01RX0gKIAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NiaXRtYXAuaD4KIAogc3RydWN0IGJsa19tcV90YWdzOwogc3RydWN0IGJsa19mbHVzaF9xdWV1ZTsKQEAgLTEyLDIxICsxMywxNCBAQAogCWludCAoKm5vdGlmeSkodm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHVuc2lnbmVkIGludCBjcHUpOwogfTsKIAotc3RydWN0IGJsa19tcV9jdHhtYXAgewotCXVuc2lnbmVkIGludCBzaXplOwotCXVuc2lnbmVkIGludCBiaXRzX3Blcl93b3JkOwotCXN0cnVjdCBibGtfYWxpZ25fYml0bWFwICptYXA7Ci19OwotCiBzdHJ1Y3QgYmxrX21xX2h3X2N0eCB7CiAJc3RydWN0IHsKIAkJc3BpbmxvY2tfdAkJbG9jazsKIAkJc3RydWN0IGxpc3RfaGVhZAlkaXNwYXRjaDsKKwkJdW5zaWduZWQgbG9uZwkJc3RhdGU7CQkvKiBCTEtfTVFfU18qIGZsYWdzICovCiAJfSBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCi0JdW5zaWduZWQgbG9uZwkJc3RhdGU7CQkvKiBCTEtfTVFfU18qIGZsYWdzICovCi0Jc3RydWN0IGRlbGF5ZWRfd29yawlydW5fd29yazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrCWRlbGF5X3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0CXJ1bl93b3JrOwogCWNwdW1hc2tfdmFyX3QJCWNwdW1hc2s7CiAJaW50CQkJbmV4dF9jcHU7CiAJaW50CQkJbmV4dF9jcHVfYmF0Y2g7CkBAIC0zOCwxMCArMzIsMTAgQEAKIAogCXZvaWQJCQkqZHJpdmVyX2RhdGE7CiAKLQlzdHJ1Y3QgYmxrX21xX2N0eG1hcAljdHhfbWFwOworCXN0cnVjdCBzYml0bWFwCQljdHhfbWFwOwogCi0JdW5zaWduZWQgaW50CQlucl9jdHg7CiAJc3RydWN0IGJsa19tcV9jdHgJKipjdHhzOworCXVuc2lnbmVkIGludAkJbnJfY3R4OwogCiAJYXRvbWljX3QJCXdhaXRfaW5kZXg7CiAKQEAgLTQ5LDcgKzQzLDcgQEAKIAogCXVuc2lnbmVkIGxvbmcJCXF1ZXVlZDsKIAl1bnNpZ25lZCBsb25nCQlydW47Ci0jZGVmaW5lIEJMS19NUV9NQVhfRElTUEFUQ0hfT1JERVIJMTAKKyNkZWZpbmUgQkxLX01RX01BWF9ESVNQQVRDSF9PUkRFUgk3CiAJdW5zaWduZWQgbG9uZwkJZGlzcGF0Y2hlZFtCTEtfTVFfTUFYX0RJU1BBVENIX09SREVSXTsKIAogCXVuc2lnbmVkIGludAkJbnVtYV9ub2RlOwpAQCAtNTcsOSArNTEsMTIgQEAKIAogCWF0b21pY190CQlucl9hY3RpdmU7CiAKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWRlbGF5X3dvcms7CisKIAlzdHJ1Y3QgYmxrX21xX2NwdV9ub3RpZmllcgljcHVfbm90aWZpZXI7CiAJc3RydWN0IGtvYmplY3QJCWtvYmo7CiAKKwl1bnNpZ25lZCBsb25nCQlwb2xsX2NvbnNpZGVyZWQ7CiAJdW5zaWduZWQgbG9uZwkJcG9sbF9pbnZva2VkOwogCXVuc2lnbmVkIGxvbmcJCXBvbGxfc3VjY2VzczsKIH07CkBAIC0xNTgsNiArMTU1LDcgQEAKIAlCTEtfTVFfRl9UQUdfU0hBUkVECT0gMSA8PCAxLAogCUJMS19NUV9GX1NHX01FUkdFCT0gMSA8PCAyLAogCUJMS19NUV9GX0RFRkVSX0lTU1VFCT0gMSA8PCA0LAorCUJMS19NUV9GX0JMT0NLSU5HCT0gMSA8PCA1LAogCUJMS19NUV9GX0FMTE9DX1BPTElDWV9TVEFSVF9CSVQgPSA4LAogCUJMS19NUV9GX0FMTE9DX1BPTElDWV9CSVRTID0gMSwKIApAQCAtMTc4LDggKzE3Niw4IEBACiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYmxrX21xX2luaXRfcXVldWUoc3RydWN0IGJsa19tcV90YWdfc2V0ICopOwogc3RydWN0IHJlcXVlc3RfcXVldWUgKmJsa19tcV9pbml0X2FsbG9jYXRlZF9xdWV1ZShzdHJ1Y3QgYmxrX21xX3RhZ19zZXQgKnNldCwKIAkJCQkJCSAgc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOwotaW50IGJsa19tcV9yZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICopOwotdm9pZCBibGtfbXFfdW5yZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICopOworaW50IGJsa19tcV9yZWdpc3Rlcl9kZXYoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKK3ZvaWQgYmxrX21xX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiAKIGludCBibGtfbXFfYWxsb2NfdGFnX3NldChzdHJ1Y3QgYmxrX21xX3RhZ19zZXQgKnNldCk7CiB2b2lkIGJsa19tcV9mcmVlX3RhZ19zZXQoc3RydWN0IGJsa19tcV90YWdfc2V0ICpzZXQpOwpAQCAtMjIxLDcgKzIxOSw2IEBACiB9CiAKIHN0cnVjdCBibGtfbXFfaHdfY3R4ICpibGtfbXFfbWFwX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIGNvbnN0IGludCBjdHhfaW5kZXgpOwotc3RydWN0IGJsa19tcV9od19jdHggKmJsa19tcV9hbGxvY19zaW5nbGVfaHdfcXVldWUoc3RydWN0IGJsa19tcV90YWdfc2V0ICosIHVuc2lnbmVkIGludCwgaW50KTsKIAogaW50IGJsa19tcV9yZXF1ZXN0X3N0YXJ0ZWQoc3RydWN0IHJlcXVlc3QgKnJxKTsKIHZvaWQgYmxrX21xX3N0YXJ0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxKTsKQEAgLTIzMiw2ICsyMjksNyBAQAogdm9pZCBibGtfbXFfYWRkX3RvX3JlcXVldWVfbGlzdChzdHJ1Y3QgcmVxdWVzdCAqcnEsIGJvb2wgYXRfaGVhZCk7CiB2b2lkIGJsa19tcV9jYW5jZWxfcmVxdWV1ZV93b3JrKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKIHZvaWQgYmxrX21xX2tpY2tfcmVxdWV1ZV9saXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKK3ZvaWQgYmxrX21xX2RlbGF5X2tpY2tfcmVxdWV1ZV9saXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB1bnNpZ25lZCBsb25nIG1zZWNzKTsKIHZvaWQgYmxrX21xX2Fib3J0X3JlcXVldWVfbGlzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiB2b2lkIGJsa19tcV9jb21wbGV0ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKaW5kZXggNDM2ZjQzZi4uY2QzOTVlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oCkBAIC0xNiw3ICsxNiw2IEBACiBzdHJ1Y3QgaW9fY29udGV4dDsKIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlOwogdHlwZWRlZiB2b2lkIChiaW9fZW5kX2lvX3QpIChzdHJ1Y3QgYmlvICopOwotdHlwZWRlZiB2b2lkIChiaW9fZGVzdHJ1Y3Rvcl90KSAoc3RydWN0IGJpbyAqKTsKIAogI2lmZGVmIENPTkZJR19CTE9DSwogLyoKQEAgLTg5LDE0ICs4OCwyMiBAQAogCXN0cnVjdCBiaW9fdmVjCQliaV9pbmxpbmVfdmVjc1swXTsKIH07CiAKLSNkZWZpbmUgQklPX09QX1NISUZUCSg4ICogc2l6ZW9mKHVuc2lnbmVkIGludCkgLSBSRVFfT1BfQklUUykKKyNkZWZpbmUgQklPX09QX1NISUZUCSg4ICogRklFTERfU0laRU9GKHN0cnVjdCBiaW8sIGJpX29wZikgLSBSRVFfT1BfQklUUykKKyNkZWZpbmUgYmlvX2ZsYWdzKGJpbykJKChiaW8pLT5iaV9vcGYgJiAoKDEgPDwgQklPX09QX1NISUZUKSAtIDEpKQogI2RlZmluZSBiaW9fb3AoYmlvKQkoKGJpbyktPmJpX29wZiA+PiBCSU9fT1BfU0hJRlQpCiAKLSNkZWZpbmUgYmlvX3NldF9vcF9hdHRycyhiaW8sIG9wLCBvcF9mbGFncykgZG8gewkJXAotCVdBUk5fT04ob3AgPj0gKDEgPDwgUkVRX09QX0JJVFMpKTsJCQlcCi0JKGJpbyktPmJpX29wZiAmPSAoKDEgPDwgQklPX09QX1NISUZUKSAtIDEpOwkJXAotCShiaW8pLT5iaV9vcGYgfD0gKCh1bnNpZ25lZCBpbnQpIChvcCkgPDwgQklPX09QX1NISUZUKTsJXAotCShiaW8pLT5iaV9vcGYgfD0gb3BfZmxhZ3M7CQkJCVwKKyNkZWZpbmUgYmlvX3NldF9vcF9hdHRycyhiaW8sIG9wLCBvcF9mbGFncykgZG8gewkJCVwKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aob3ApKQkJCQkJXAorCQlCVUlMRF9CVUdfT04oKG9wKSArIDBVID49ICgxVSA8PCBSRVFfT1BfQklUUykpOwkJXAorCWVsc2UJCQkJCQkJCVwKKwkJV0FSTl9PTl9PTkNFKChvcCkgKyAwVSA+PSAoMVUgPDwgUkVRX09QX0JJVFMpKTsJCVwKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aob3BfZmxhZ3MpKQkJCQlcCisJCUJVSUxEX0JVR19PTigob3BfZmxhZ3MpICsgMFUgPj0gKDFVIDw8IEJJT19PUF9TSElGVCkpOwlcCisJZWxzZQkJCQkJCQkJXAorCQlXQVJOX09OX09OQ0UoKG9wX2ZsYWdzKSArIDBVID49ICgxVSA8PCBCSU9fT1BfU0hJRlQpKTsJXAorCShiaW8pLT5iaV9vcGYgPSBiaW9fZmxhZ3MoYmlvKTsJCQkJCVwKKwkoYmlvKS0+Ymlfb3BmIHw9ICgoKG9wKSArIDBVKSA8PCBCSU9fT1BfU0hJRlQpOwkJCVwKKwkoYmlvKS0+Ymlfb3BmIHw9IChvcF9mbGFncyk7CQkJCQlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIEJJT19SRVNFVF9CWVRFUwkJb2Zmc2V0b2Yoc3RydWN0IGJpbywgYmlfbWF4X3ZlY3MpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCBlNzkwNTVjLi5jNDdjMzU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTQ0OSw3ICs0NDksNyBAQAogCiAJc3RydWN0IGxpc3RfaGVhZAlyZXF1ZXVlX2xpc3Q7CiAJc3BpbmxvY2tfdAkJcmVxdWV1ZV9sb2NrOwotCXN0cnVjdCB3b3JrX3N0cnVjdAlyZXF1ZXVlX3dvcms7CisJc3RydWN0IGRlbGF5ZWRfd29yawlyZXF1ZXVlX3dvcms7CiAKIAlzdHJ1Y3QgbXV0ZXgJCXN5c2ZzX2xvY2s7CiAKQEAgLTE0NDAsOCArMTQ0MCw4IEBACiAJcmV0dXJuIGJpb193aWxsX2dhcChyZXEtPnEsIGJpbywgcmVxLT5iaW8pOwogfQogCi1zdHJ1Y3Qgd29ya19zdHJ1Y3Q7CiBpbnQga2Jsb2NrZF9zY2hlZHVsZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitpbnQga2Jsb2NrZF9zY2hlZHVsZV93b3JrX29uKGludCBjcHUsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBpbnQga2Jsb2NrZF9zY2hlZHVsZV9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpOwogaW50IGtibG9ja2Rfc2NoZWR1bGVfZGVsYXllZF93b3JrX29uKGludCBjcHUsIHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrLCB1bnNpZ25lZCBsb25nIGRlbGF5KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ibG9ja2dyb3VwX2xvY2suaCBiL2luY2x1ZGUvbGludXgvYmxvY2tncm91cF9sb2NrLmgKaW5kZXggZTQ0Yjg4Yi4uMjI1YmRiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ibG9ja2dyb3VwX2xvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jsb2NrZ3JvdXBfbG9jay5oCkBAIC0xMCwyOCArMTAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogCiAjaWZkZWYgQ09ORklHX1NNUAotCi0vKgotICogV2Ugd2FudCBhIHBvd2VyLW9mLXR3by4gIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0aGFuIHRoaXM/Ci0gKi8KLQotI2lmIE5SX0NQVVMgPj0gMzIKLSNkZWZpbmUgTlJfQkdfTE9DS1MJMTI4Ci0jZWxpZiBOUl9DUFVTID49IDE2Ci0jZGVmaW5lIE5SX0JHX0xPQ0tTCTY0Ci0jZWxpZiBOUl9DUFVTID49IDgKLSNkZWZpbmUgTlJfQkdfTE9DS1MJMzIKLSNlbGlmIE5SX0NQVVMgPj0gNAotI2RlZmluZSBOUl9CR19MT0NLUwkxNgotI2VsaWYgTlJfQ1BVUyA+PSAyCi0jZGVmaW5lIE5SX0JHX0xPQ0tTCTgKKyNkZWZpbmUgTlJfQkdfTE9DS1MJKDQgPDwgaWxvZzIoTlJfQ1BVUyA8IDMyID8gTlJfQ1BVUyA6IDMyKSkKICNlbHNlCi0jZGVmaW5lIE5SX0JHX0xPQ0tTCTQKLSNlbmRpZgotCi0jZWxzZQkvKiBDT05GSUdfU01QICovCiAjZGVmaW5lIE5SX0JHX0xPQ0tTCTEKLSNlbmRpZgkvKiBDT05GSUdfU01QICovCisjZW5kaWYKIAogc3RydWN0IGJnbF9sb2NrIHsKIAlzcGlubG9ja190IGxvY2s7CkBAIC00OSwxNCArMzEsMTAgQEAKIAkJc3Bpbl9sb2NrX2luaXQoJmJnbC0+bG9ja3NbaV0ubG9jayk7CiB9CiAKLS8qCi0gKiBUaGUgYWNjZXNzb3IgaXMgYSBtYWNybyBzbyB3ZSBjYW4gZW1iZWQgYSBibG9ja2dyb3VwX2xvY2sgaW50byBkaWZmZXJlbnQKLSAqIHN1cGVyYmxvY2sgdHlwZXMKLSAqLwogc3RhdGljIGlubGluZSBzcGlubG9ja190ICoKIGJnbF9sb2NrX3B0cihzdHJ1Y3QgYmxvY2tncm91cF9sb2NrICpiZ2wsIHVuc2lnbmVkIGludCBibG9ja19ncm91cCkKIHsKLQlyZXR1cm4gJmJnbC0+bG9ja3NbKGJsb2NrX2dyb3VwKSAmIChOUl9CR19MT0NLUy0xKV0ubG9jazsKKwlyZXR1cm4gJmJnbC0+bG9ja3NbYmxvY2tfZ3JvdXAgJiAoTlJfQkdfTE9DS1MtMSldLmxvY2s7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icGYuaCBiL2luY2x1ZGUvbGludXgvYnBmLmgKaW5kZXggMTExMzQyMy4uYzIwMTAxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9icGYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JwZi5oCkBAIC05Niw2ICs5Niw3IEBACiBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gewogCXU2NCAoKmZ1bmMpKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KTsKIAlib29sIGdwbF9vbmx5OworCWJvb2wgcGt0X2FjY2VzczsKIAllbnVtIGJwZl9yZXR1cm5fdHlwZSByZXRfdHlwZTsKIAllbnVtIGJwZl9hcmdfdHlwZSBhcmcxX3R5cGU7CiAJZW51bSBicGZfYXJnX3R5cGUgYXJnMl90eXBlOwpAQCAtMTM4LDYgKzEzOSwxMyBAQAogCSAqLwogCVBUUl9UT19QQUNLRVQsCiAJUFRSX1RPX1BBQ0tFVF9FTkQsCSAvKiBza2ItPmRhdGEgKyBoZWFkbGVuICovCisKKwkvKiBQVFJfVE9fTUFQX1ZBTFVFX0FESiBpcyB1c2VkIGZvciBkb2luZyBwb2ludGVyIG1hdGggaW5zaWRlIG9mIGEgbWFwCisJICogZWxlbSB2YWx1ZS4gIFdlIG9ubHkgYWxsb3cgdGhpcyBpZiB3ZSBjYW4gc3RhdGljYWxseSB2ZXJpZnkgdGhhdAorCSAqIGFjY2VzcyBmcm9tIHRoaXMgcmVnaXN0ZXIgYXJlIGdvaW5nIHRvIGZhbGwgd2l0aGluIHRoZSBzaXplIG9mIHRoZQorCSAqIG1hcCBlbGVtZW50LgorCSAqLworCVBUUl9UT19NQVBfVkFMVUVfQURKLAogfTsKIAogc3RydWN0IGJwZl9wcm9nOwpAQCAtMTUxLDcgKzE1OSw4IEBACiAJICovCiAJYm9vbCAoKmlzX3ZhbGlkX2FjY2VzcykoaW50IG9mZiwgaW50IHNpemUsIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsCiAJCQkJZW51bSBicGZfcmVnX3R5cGUgKnJlZ190eXBlKTsKLQorCWludCAoKmdlbl9wcm9sb2d1ZSkoc3RydWN0IGJwZl9pbnNuICppbnNuLCBib29sIGRpcmVjdF93cml0ZSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpOwogCXUzMiAoKmNvbnZlcnRfY3R4X2FjY2VzcykoZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwgaW50IGRzdF9yZWcsCiAJCQkJICBpbnQgc3JjX3JlZywgaW50IGN0eF9vZmYsCiAJCQkJICBzdHJ1Y3QgYnBmX2luc24gKmluc24sIHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7CkBAIC0yOTcsNiArMzA2LDEwIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYnBmX3Byb2dfcHV0KHN0cnVjdCBicGZfcHJvZyAqcHJvZykKIHsKIH0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJwZl9wcm9nICpicGZfcHJvZ19pbmMoc3RydWN0IGJwZl9wcm9nICpwcm9nKQoreworCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKK30KICNlbmRpZiAvKiBDT05GSUdfQlBGX1NZU0NBTEwgKi8KIAogLyogdmVyaWZpZXIgcHJvdG90eXBlcyBmb3IgaGVscGVyIGZ1bmN0aW9ucyBjYWxsZWQgZnJvbSBlQlBGIHByb2dyYW1zICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZl92ZXJpZmllci5oIGIvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDM1Yjk5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9icGZfdmVyaWZpZXIuaApAQCAtMCwwICsxLDEwMiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQgUExVTWdyaWQsIGh0dHA6Ly9wbHVtZ3JpZC5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9CUEZfVkVSSUZJRVJfSAorI2RlZmluZSBfTElOVVhfQlBGX1ZFUklGSUVSX0ggMQorCisjaW5jbHVkZSA8bGludXgvYnBmLmg+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+aWQ7CiB9CiAKKy8qKgorICogdGFza191bmRlcl9jZ3JvdXBfaGllcmFyY2h5IC0gdGVzdCB0YXNrJ3MgbWVtYmVyc2hpcCBvZiBjZ3JvdXAgYW5jZXN0cnkKKyAqIEB0YXNrOiB0aGUgdGFzayB0byBiZSB0ZXN0ZWQKKyAqIEBhbmNlc3RvcjogcG9zc2libGUgYW5jZXN0b3Igb2YgQHRhc2sncyBjZ3JvdXAKKyAqCisgKiBUZXN0cyB3aGV0aGVyIEB0YXNrJ3MgZGVmYXVsdCBjZ3JvdXAgaGllcmFyY2h5IGlzIGEgZGVzY2VuZGFudCBvZiBAYW5jZXN0b3IuCisgKiBJdCBmb2xsb3dzIGFsbCB0aGUgc2FtZSBydWxlcyBhcyBjZ3JvdXBfaXNfZGVzY2VuZGFudCwgYW5kIG9ubHkgYXBwbGllcworICogdG8gdGhlIGRlZmF1bHQgaGllcmFyY2h5LgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgdGFza191bmRlcl9jZ3JvdXBfaGllcmFyY2h5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgICAgIHN0cnVjdCBjZ3JvdXAgKmFuY2VzdG9yKQoreworCXN0cnVjdCBjc3Nfc2V0ICpjc2V0ID0gdGFza19jc3Nfc2V0KHRhc2spOworCisJcmV0dXJuIGNncm91cF9pc19kZXNjZW5kYW50KGNzZXQtPmRmbF9jZ3JwLCBhbmNlc3Rvcik7Cit9CisKIC8qIG5vIHN5bmNocm9uaXphdGlvbiwgdGhlIHJlc3VsdCBjYW4gb25seSBiZSB1c2VkIGFzIGEgaGludCAqLwogc3RhdGljIGlubGluZSBib29sIGNncm91cF9pc19wb3B1bGF0ZWQoc3RydWN0IGNncm91cCAqY2dycCkKIHsKQEAgLTU1Nyw2ICs1NzQsNyBAQAogI2Vsc2UgLyogIUNPTkZJR19DR1JPVVBTICovCiAKIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlOworc3RydWN0IGNncm91cDsKIAogc3RhdGljIGlubGluZSB2b2lkIGNzc19wdXQoc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzcykge30KIHN0YXRpYyBpbmxpbmUgaW50IGNncm91cF9hdHRhY2hfdGFza19hbGwoc3RydWN0IHRhc2tfc3RydWN0ICpmcm9tLApAQCAtNTc0LDYgKzU5MiwxMSBAQAogc3RhdGljIGlubGluZSBpbnQgY2dyb3VwX2luaXRfZWFybHkodm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSBpbnQgY2dyb3VwX2luaXQodm9pZCkgeyByZXR1cm4gMDsgfQogCitzdGF0aWMgaW5saW5lIGJvb2wgdGFza191bmRlcl9jZ3JvdXBfaGllcmFyY2h5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgICAgIHN0cnVjdCBjZ3JvdXAgKmFuY2VzdG9yKQoreworCXJldHVybiB0cnVlOworfQogI2VuZGlmIC8qICFDT05GSUdfQ0dST1VQUyAqLwogCiAvKgpAQCAtNjIxLDYgKzY0NCw3IEBACiAJYXRvbWljX3QJCWNvdW50OwogCXN0cnVjdCBuc19jb21tb24JbnM7CiAJc3RydWN0IHVzZXJfbmFtZXNwYWNlCSp1c2VyX25zOworCXN0cnVjdCB1Y291bnRzCQkqdWNvdW50czsKIAlzdHJ1Y3QgY3NzX3NldCAgICAgICAgICAqcm9vdF9jc2V0OwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbGstcHJvdmlkZXIuaCBiL2luY2x1ZGUvbGludXgvY2xrLXByb3ZpZGVyLmgKaW5kZXggYTM5YzBjNS4uYWY1OTYzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jbGstcHJvdmlkZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsay1wcm92aWRlci5oCkBAIC03NzIsNyArNzcyLDcgQEAKIH07CiAKIHN0cnVjdCBjbGtfaHdfb25lY2VsbF9kYXRhIHsKLQlzaXplX3QgbnVtOworCXVuc2lnbmVkIGludCBudW07CiAJc3RydWN0IGNsa19odyAqaHdzW107CiB9OwogCkBAIC03ODAsNiArNzgwLDE4IEBACiAKICNkZWZpbmUgQ0xLX09GX0RFQ0xBUkUobmFtZSwgY29tcGF0LCBmbikgT0ZfREVDTEFSRV8xKGNsaywgbmFtZSwgY29tcGF0LCBmbikKIAorLyoKKyAqIFVzZSB0aGlzIG1hY3JvIHdoZW4geW91IGhhdmUgYSBkcml2ZXIgdGhhdCByZXF1aXJlcyB0d28gaW5pdGlhbGl6YXRpb24KKyAqIHJvdXRpbmVzLCBvbmUgYXQgb2ZfY2xrX2luaXQoKSwgYW5kIG9uZSBhdCBwbGF0Zm9ybSBkZXZpY2UgcHJvYmUKKyAqLworI2RlZmluZSBDTEtfT0ZfREVDTEFSRV9EUklWRVIobmFtZSwgY29tcGF0LCBmbikgXAorCXN0YXRpYyB2b2lkIG5hbWUjI19vZl9jbGtfaW5pdF9kcml2ZXIoc3RydWN0IGRldmljZV9ub2RlICpucCkJXAorCXsJCQkJCQkJCVwKKwkJb2Zfbm9kZV9jbGVhcl9mbGFnKG5wLCBPRl9QT1BVTEFURUQpOwkJCVwKKwkJZm4obnApOwkJCQkJCQlcCisJfQkJCQkJCQkJXAorCU9GX0RFQ0xBUkVfMShjbGssIG5hbWUsIGNvbXBhdCwgbmFtZSMjX29mX2Nsa19pbml0X2RyaXZlcikKKwogI2lmZGVmIENPTkZJR19PRgogaW50IG9mX2Nsa19hZGRfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCXN0cnVjdCBjbGsgKigqY2xrX3NyY19nZXQpKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MsCkBAIC04NDIsNyArODU0LDcgQEAKIHsKIAlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IG9mX2Nsa19nZXRfcGFyZW50X2NvdW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBvZl9jbGtfZ2V0X3BhcmVudF9jb3VudChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQogewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MuaCBiL2luY2x1ZGUvbGludXgvY29tcGlsZXItZ2NjLmgKaW5kZXggOGRiYzg5Mi4uNTczYzVhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21waWxlci1nY2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLWdjYy5oCkBAIC0xNTgsNyArMTU4LDcgQEAKICNkZWZpbmUgX19jb21waWxlcl9vZmZzZXRvZihhLCBiKQkJCQkJXAogCV9fYnVpbHRpbl9vZmZzZXRvZihhLCBiKQogCi0jaWYgR0NDX1ZFUlNJT04gPj0gNDAxMDAgJiYgR0NDX1ZFUlNJT04gPCA0MDYwMAorI2lmIEdDQ19WRVJTSU9OID49IDQwMTAwCiAjIGRlZmluZSBfX2NvbXBpbGV0aW1lX29iamVjdF9zaXplKG9iaikgX19idWlsdGluX29iamVjdF9zaXplKG9iaiwgMCkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmggYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKaW5kZXggNDM2YWE0ZS4uNjY4NTY5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb21waWxlci5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaApAQCAtNTI3LDEzICs1MjcsMTQgQEAKICAqIG9iamVjdCdzIGxpZmV0aW1lIGlzIG1hbmFnZWQgYnkgc29tZXRoaW5nIG90aGVyIHRoYW4gUkNVLiAgVGhhdAogICogInNvbWV0aGluZyBvdGhlciIgbWlnaHQgYmUgcmVmZXJlbmNlIGNvdW50aW5nIG9yIHNpbXBsZSBpbW1vcnRhbGl0eS4KICAqCi0gKiBUaGUgc2VlbWluZ2x5IHVudXNlZCBzaXplX3QgdmFyaWFibGUgaXMgdG8gdmFsaWRhdGUgQHAgaXMgaW5kZWVkIGEgcG9pbnRlcgotICogdHlwZSBieSBtYWtpbmcgc3VyZSBpdCBjYW4gYmUgZGVyZWZlcmVuY2VkLgorICogVGhlIHNlZW1pbmdseSB1bnVzZWQgdmFyaWFibGUgX19fdHlwZWNoZWNrX3AgdmFsaWRhdGVzIHRoYXQgQHAgaXMKKyAqIGluZGVlZCBhIHBvaW50ZXIgdHlwZSBieSB1c2luZyBhIHBvaW50ZXIgdG8gdHlwZW9mKCpwKSBhcyB0aGUgdHlwZS4KKyAqIFRha2luZyBhIHBvaW50ZXIgdG8gdHlwZW9mKCpwKSBhZ2FpbiBpcyBuZWVkZWQgaW4gY2FzZSBwIGlzIHZvaWQgKi4KICAqLwogI2RlZmluZSBsb2NrbGVzc19kZXJlZmVyZW5jZShwKSBcCiAoeyBcCiAJdHlwZW9mKHApIF9fX19fX19fX3AxID0gUkVBRF9PTkNFKHApOyBcCi0Jc2l6ZV90IF9fbWF5YmVfdW51c2VkIF9fc2l6ZV9vZl9wdHIgPSBzaXplb2YoKihwKSk7IFwKKwl0eXBlb2YoKihwKSkgKl9fX3R5cGVjaGVja19wIF9fbWF5YmVfdW51c2VkOyBcCiAJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7IC8qIERlcGVuZGVuY3kgb3JkZXIgdnMuIHAgYWJvdmUuICovIFwKIAkoX19fX19fX19fcDEpOyBcCiB9KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQuaCBiL2luY2x1ZGUvbGludXgvY29yZXNpZ2h0LmgKaW5kZXggMzg1ZDYyZS4uMmE1OTgyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvcmVzaWdodC5oCkBAIC0yMzIsOCArMjMyLDkgQEAKIAlpbnQgKCpjcHVfaWQpKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2Rldik7CiAJaW50ICgqdHJhY2VfaWQpKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2Rldik7CiAJaW50ICgqZW5hYmxlKShzdHJ1Y3QgY29yZXNpZ2h0X2RldmljZSAqY3NkZXYsCi0JCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsICB1MzIgbW9kZSk7Ci0Jdm9pZCAoKmRpc2FibGUpKHN0cnVjdCBjb3Jlc2lnaHRfZGV2aWNlICpjc2Rldik7CisJCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgIHUzMiBtb2RlKTsKKwl2b2lkICgqZGlzYWJsZSkoc3RydWN0IGNvcmVzaWdodF9kZXZpY2UgKmNzZGV2LAorCQkJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIH07CiAKIHN0cnVjdCBjb3Jlc2lnaHRfb3BzIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1LmggYi9pbmNsdWRlL2xpbnV4L2NwdS5oCmluZGV4IDc5N2Q5YzguLjc1NzJkOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3B1LmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHUuaApAQCAtNjEsMTcgKzYxLDggQEAKICNkZWZpbmUgQ1BVX0RPV05fUFJFUEFSRQkweDAwMDUgLyogQ1BVICh1bnNpZ25lZCl2IGdvaW5nIGRvd24gKi8KICNkZWZpbmUgQ1BVX0RPV05fRkFJTEVECQkweDAwMDYgLyogQ1BVICh1bnNpZ25lZCl2IE5PVCBnb2luZyBkb3duICovCiAjZGVmaW5lIENQVV9ERUFECQkweDAwMDcgLyogQ1BVICh1bnNpZ25lZCl2IGRlYWQgKi8KLSNkZWZpbmUgQ1BVX0RZSU5HCQkweDAwMDggLyogQ1BVICh1bnNpZ25lZCl2IG5vdCBydW5uaW5nIGFueSB0YXNrLAotCQkJCQkqIG5vdCBoYW5kbGluZyBpbnRlcnJ1cHRzLCBzb29uIGRlYWQuCi0JCQkJCSogQ2FsbGVkIG9uIHRoZSBkeWluZyBjcHUsIGludGVycnVwdHMKLQkJCQkJKiBhcmUgYWxyZWFkeSBkaXNhYmxlZC4gTXVzdCBub3QKLQkJCQkJKiBzbGVlcCwgbXVzdCBub3QgZmFpbCAqLwogI2RlZmluZSBDUFVfUE9TVF9ERUFECQkweDAwMDkgLyogQ1BVICh1bnNpZ25lZCl2IGRlYWQsIGNwdV9ob3RwbHVnCiAJCQkJCSogbG9jayBpcyBkcm9wcGVkICovCi0jZGVmaW5lIENQVV9TVEFSVElORwkJMHgwMDBBIC8qIENQVSAodW5zaWduZWQpdiBzb29uIHJ1bm5pbmcuCi0JCQkJCSogQ2FsbGVkIG9uIHRoZSBuZXcgY3B1LCBqdXN0IGJlZm9yZQotCQkJCQkqIGVuYWJsaW5nIGludGVycnVwdHMuIE11c3Qgbm90IHNsZWVwLAotCQkJCQkqIG11c3Qgbm90IGZhaWwgKi8KICNkZWZpbmUgQ1BVX0JST0tFTgkJMHgwMDBCIC8qIENQVSAodW5zaWduZWQpdiBkaWQgbm90IGRpZSBwcm9wZXJseSwKIAkJCQkJKiBwZXJoYXBzIGR1ZSB0byBwcmVlbXB0aW9uLiAqLwogCkBAIC04Niw5ICs3Nyw2IEBACiAjZGVmaW5lIENQVV9ET1dOX1BSRVBBUkVfRlJPWkVOCShDUFVfRE9XTl9QUkVQQVJFIHwgQ1BVX1RBU0tTX0ZST1pFTikKICNkZWZpbmUgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTgkoQ1BVX0RPV05fRkFJTEVEIHwgQ1BVX1RBU0tTX0ZST1pFTikKICNkZWZpbmUgQ1BVX0RFQURfRlJPWkVOCQkoQ1BVX0RFQUQgfCBDUFVfVEFTS1NfRlJPWkVOKQotI2RlZmluZSBDUFVfRFlJTkdfRlJPWkVOCShDUFVfRFlJTkcgfCBDUFVfVEFTS1NfRlJPWkVOKQotI2RlZmluZSBDUFVfU1RBUlRJTkdfRlJPWkVOCShDUFVfU1RBUlRJTkcgfCBDUFVfVEFTS1NfRlJPWkVOKQotCiAKICNpZmRlZiBDT05GSUdfU01QCiBleHRlcm4gYm9vbCBjcHVocF90YXNrc19mcm96ZW47CkBAIC0yMjgsNyArMjE2LDExIEBACiAjZW5kaWYJCS8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQX1NNUAotZXh0ZXJuIGludCBkaXNhYmxlX25vbmJvb3RfY3B1cyh2b2lkKTsKK2V4dGVybiBpbnQgZnJlZXplX3NlY29uZGFyeV9jcHVzKGludCBwcmltYXJ5KTsKK3N0YXRpYyBpbmxpbmUgaW50IGRpc2FibGVfbm9uYm9vdF9jcHVzKHZvaWQpCit7CisJcmV0dXJuIGZyZWV6ZV9zZWNvbmRhcnlfY3B1cygwKTsKK30KIGV4dGVybiB2b2lkIGVuYWJsZV9ub25ib290X2NwdXModm9pZCk7CiAjZWxzZSAvKiAhQ09ORklHX1BNX1NMRUVQX1NNUCAqLwogc3RhdGljIGlubGluZSBpbnQgZGlzYWJsZV9ub25ib290X2NwdXModm9pZCkgeyByZXR1cm4gMDsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVob3RwbHVnLmggYi9pbmNsdWRlL2xpbnV4L2NwdWhvdHBsdWcuaAppbmRleCAyNDJiZjUzLi45YjIwN2E4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWhvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWhvdHBsdWcuaApAQCAtMSw2ICsxLDggQEAKICNpZm5kZWYgX19DUFVIT1RQTFVHX0gKICNkZWZpbmUgX19DUFVIT1RQTFVHX0gKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKIGVudW0gY3B1aHBfc3RhdGUgewogCUNQVUhQX09GRkxJTkUsCiAJQ1BVSFBfQ1JFQVRFX1RIUkVBRFMsCkBAIC0xNCwxNSArMTYsNDIgQEAKIAlDUFVIUF9QRVJGX1NVUEVSSCwKIAlDUFVIUF9YODZfSFBFVF9ERUFELAogCUNQVUhQX1g4Nl9BUEJfREVBRCwKKwlDUFVIUF9WSVJUX05FVF9ERUFELAorCUNQVUhQX1NMVUJfREVBRCwKKwlDUFVIUF9NTV9XUklURUJBQ0tfREVBRCwKKwlDUFVIUF9TT0ZUSVJRX0RFQUQsCisJQ1BVSFBfTkVUX01WTkVUQV9ERUFELAorCUNQVUhQX0NQVUlETEVfREVBRCwKKwlDUFVIUF9BUk02NF9GUFNJTURfREVBRCwKKwlDUFVIUF9BUk1fT01BUF9XQUtFX0RFQUQsCisJQ1BVSFBfSVJRX1BPTExfREVBRCwKKwlDUFVIUF9CTE9DS19TT0ZUSVJRX0RFQUQsCisJQ1BVSFBfVklSVF9TQ1NJX0RFQUQsCisJQ1BVSFBfQUNQSV9DUFVEUlZfREVBRCwKKwlDUFVIUF9TMzkwX1BGQVVMVF9ERUFELAorCUNQVUhQX0JMS19NUV9ERUFELAogCUNQVUhQX1dPUktRVUVVRV9QUkVQLAogCUNQVUhQX1BPV0VSX05VTUFfUFJFUEFSRSwKIAlDUFVIUF9IUlRJTUVSU19QUkVQQVJFLAogCUNQVUhQX1BST0ZJTEVfUFJFUEFSRSwKIAlDUFVIUF9YMkFQSUNfUFJFUEFSRSwKIAlDUFVIUF9TTVBDRkRfUFJFUEFSRSwKKwlDUFVIUF9SRUxBWV9QUkVQQVJFLAorCUNQVUhQX1NMQUJfUFJFUEFSRSwKKwlDUFVIUF9NRF9SQUlENV9QUkVQQVJFLAogCUNQVUhQX1JDVVRSRUVfUFJFUCwKKwlDUFVIUF9DUFVJRExFX0NPVVBMRURfUFJFUEFSRSwKKwlDUFVIUF9QT1dFUlBDX1BNQUNfUFJFUEFSRSwKKwlDUFVIUF9QT1dFUlBDX01NVV9DVFhfUFJFUEFSRSwKKwlDUFVIUF9YRU5fUFJFUEFSRSwKKwlDUFVIUF9YRU5fRVZUQ0hOX1BSRVBBUkUsCiAJQ1BVSFBfTk9USUZZX1BSRVBBUkUsCisJQ1BVSFBfQVJNX1NITU9CSUxFX1NDVV9QUkVQQVJFLAorCUNQVUhQX1NIX1NIM1hfUFJFUEFSRSwKKwlDUFVIUF9CTEtfTVFfUFJFUEFSRSwKIAlDUFVIUF9USU1FUlNfREVBRCwKKwlDUFVIUF9OT1RGX0VSUl9JTkpfUFJFUEFSRSwKKwlDUFVIUF9NSVBTX1NPQ19QUkVQQVJFLAogCUNQVUhQX0JSSU5HVVBfQ1BVLAogCUNQVUhQX0FQX0lETEVfREVBRCwKIAlDUFVIUF9BUF9PRkZMSU5FLApAQCAtNDUsNiArNzQsOCBAQAogCUNQVUhQX0FQX1BFUkZfTUVUQUdfU1RBUlRJTkcsCiAJQ1BVSFBfQVBfTUlQU19PUF9MT09OR1NPTjNfU1RBUlRJTkcsCiAJQ1BVSFBfQVBfQVJNX1ZGUF9TVEFSVElORywKKwlDUFVIUF9BUF9BUk02NF9ERUJVR19NT05JVE9SU19TVEFSVElORywKKwlDUFVIUF9BUF9QRVJGX0FSTV9IV19CUkVBS1BPSU5UX1NUQVJUSU5HLAogCUNQVUhQX0FQX1BFUkZfQVJNX1NUQVJUSU5HLAogCUNQVUhQX0FQX0FSTV9MMlgwX1NUQVJUSU5HLAogCUNQVUhQX0FQX0FSTV9BUkNIX1RJTUVSX1NUQVJUSU5HLApAQCAtNjgsNyArOTksNiBAQAogCUNQVUhQX0FQX0FSTTY0X0lTTkRFUF9TVEFSVElORywKIAlDUFVIUF9BUF9TTVBDRkRfRFlJTkcsCiAJQ1BVSFBfQVBfWDg2X1RCT09UX0RZSU5HLAotCUNQVUhQX0FQX05PVElGWV9TVEFSVElORywKIAlDUFVIUF9BUF9PTkxJTkUsCiAJQ1BVSFBfVEVBUkRPV05fQ1BVLAogCUNQVUhQX0FQX09OTElORV9JRExFLApAQCAtODYsNiArMTE2LDcgQEAKIAlDUFVIUF9BUF9QRVJGX1MzOTBfU0ZfT05MSU5FLAogCUNQVUhQX0FQX1BFUkZfQVJNX0NDSV9PTkxJTkUsCiAJQ1BVSFBfQVBfUEVSRl9BUk1fQ0NOX09OTElORSwKKwlDUFVIUF9BUF9QRVJGX0FSTV9MMlgwX09OTElORSwKIAlDUFVIUF9BUF9XT1JLUVVFVUVfT05MSU5FLAogCUNQVUhQX0FQX1JDVVRSRUVfT05MSU5FLAogCUNQVUhQX0FQX05PVElGWV9PTkxJTkUsCkBAIC05OSw3ICsxMzAsNyBAQAogCiBpbnQgX19jcHVocF9zZXR1cF9zdGF0ZShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLAljb25zdCBjaGFyICpuYW1lLCBib29sIGludm9rZSwKIAkJCWludCAoKnN0YXJ0dXApKHVuc2lnbmVkIGludCBjcHUpLAotCQkJaW50ICgqdGVhcmRvd24pKHVuc2lnbmVkIGludCBjcHUpKTsKKwkJCWludCAoKnRlYXJkb3duKSh1bnNpZ25lZCBpbnQgY3B1KSwgYm9vbCBtdWx0aV9pbnN0YW5jZSk7CiAKIC8qKgogICogY3B1aHBfc2V0dXBfc3RhdGUgLSBTZXR1cCBob3RwbHVnIHN0YXRlIGNhbGxiYWNrcyB3aXRoIGNhbGxpbmcgdGhlIGNhbGxiYWNrcwpAQCAtMTE2LDcgKzE0Nyw3IEBACiAJCQkJICAgIGludCAoKnN0YXJ0dXApKHVuc2lnbmVkIGludCBjcHUpLAogCQkJCSAgICBpbnQgKCp0ZWFyZG93bikodW5zaWduZWQgaW50IGNwdSkpCiB7Ci0JcmV0dXJuIF9fY3B1aHBfc2V0dXBfc3RhdGUoc3RhdGUsIG5hbWUsIHRydWUsIHN0YXJ0dXAsIHRlYXJkb3duKTsKKwlyZXR1cm4gX19jcHVocF9zZXR1cF9zdGF0ZShzdGF0ZSwgbmFtZSwgdHJ1ZSwgc3RhcnR1cCwgdGVhcmRvd24sIGZhbHNlKTsKIH0KIAogLyoqCkBAIC0xMzUsNyArMTY2LDY2IEBACiAJCQkJCSAgICBpbnQgKCpzdGFydHVwKSh1bnNpZ25lZCBpbnQgY3B1KSwKIAkJCQkJICAgIGludCAoKnRlYXJkb3duKSh1bnNpZ25lZCBpbnQgY3B1KSkKIHsKLQlyZXR1cm4gX19jcHVocF9zZXR1cF9zdGF0ZShzdGF0ZSwgbmFtZSwgZmFsc2UsIHN0YXJ0dXAsIHRlYXJkb3duKTsKKwlyZXR1cm4gX19jcHVocF9zZXR1cF9zdGF0ZShzdGF0ZSwgbmFtZSwgZmFsc2UsIHN0YXJ0dXAsIHRlYXJkb3duLAorCQkJCSAgIGZhbHNlKTsKK30KKworLyoqCisgKiBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aSAtIEFkZCBjYWxsYmFja3MgZm9yIG11bHRpIHN0YXRlCisgKiBAc3RhdGU6CVRoZSBzdGF0ZSBmb3Igd2hpY2ggdGhlIGNhbGxzIGFyZSBpbnN0YWxsZWQKKyAqIEBuYW1lOglOYW1lIG9mIHRoZSBjYWxsYmFjay4KKyAqIEBzdGFydHVwOglzdGFydHVwIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAdGVhcmRvd246CXRlYXJkb3duIGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICogU2V0cyB0aGUgaW50ZXJuYWwgbXVsdGlfaW5zdGFuY2UgZmxhZyBhbmQgcHJlcGFyZXMgYSBzdGF0ZSB0byB3b3JrIGFzIGEgbXVsdGkKKyAqIGluc3RhbmNlIGNhbGxiYWNrLiBObyBjYWxsYmFja3MgYXJlIGludm9rZWQgYXQgdGhpcyBwb2ludC4gVGhlIGNhbGxiYWNrcyBhcmUKKyAqIGludm9rZWQgb25jZSBhbiBpbnN0YW5jZSBmb3IgdGhpcyBzdGF0ZSBhcmUgcmVnaXN0ZXJlZCB2aWEKKyAqIEBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Ugb3IgQGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzLgorICovCitzdGF0aWMgaW5saW5lIGludCBjcHVocF9zZXR1cF9zdGF0ZV9tdWx0aShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgaW50ICgqc3RhcnR1cCkodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJCQkgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpLAorCQkJCQkgIGludCAoKnRlYXJkb3duKSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkJCSAgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpKQoreworCXJldHVybiBfX2NwdWhwX3NldHVwX3N0YXRlKHN0YXRlLCBuYW1lLCBmYWxzZSwKKwkJCQkgICAodm9pZCAqKSBzdGFydHVwLAorCQkJCSAgICh2b2lkICopIHRlYXJkb3duLCB0cnVlKTsKK30KKworaW50IF9fY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlLAorCQkJICAgICAgIGJvb2wgaW52b2tlKTsKKworLyoqCisgKiBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2UgLSBBZGQgYW4gaW5zdGFuY2UgZm9yIGEgc3RhdGUgYW5kIGludm9rZSBzdGFydHVwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay4KKyAqIEBzdGF0ZToJVGhlIHN0YXRlIGZvciB3aGljaCB0aGUgaW5zdGFuY2UgaXMgaW5zdGFsbGVkCisgKiBAbm9kZToJVGhlIG5vZGUgZm9yIHRoaXMgaW5kaXZpZHVhbCBzdGF0ZS4KKyAqCisgKiBJbnN0YWxscyB0aGUgaW5zdGFuY2UgZm9yIHRoZSBAc3RhdGUgYW5kIGludm9rZXMgdGhlIHN0YXJ0dXAgY2FsbGJhY2sgb24KKyAqIHRoZSBwcmVzZW50IGNwdXMgd2hpY2ggaGF2ZSBhbHJlYWR5IHJlYWNoZWQgdGhlIEBzdGF0ZS4gVGhlIEBzdGF0ZSBtdXN0IGhhdmUKKyAqIGJlZW4gZWFybGllciBtYXJrZWQgYXMgbXVsdGktaW5zdGFuY2UgYnkgQGNwdWhwX3NldHVwX3N0YXRlX211bHRpLgorICovCitzdGF0aWMgaW5saW5lIGludCBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2UoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSwKKwkJCQkJICAgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCit7CisJcmV0dXJuIF9fY3B1aHBfc3RhdGVfYWRkX2luc3RhbmNlKHN0YXRlLCBub2RlLCB0cnVlKTsKK30KKworLyoqCisgKiBjcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Vfbm9jYWxscyAtIEFkZCBhbiBpbnN0YW5jZSBmb3IgYSBzdGF0ZSB3aXRob3V0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludm9raW5nIHRoZSBzdGFydHVwIGNhbGxiYWNrLgorICogQHN0YXRlOglUaGUgc3RhdGUgZm9yIHdoaWNoIHRoZSBpbnN0YW5jZSBpcyBpbnN0YWxsZWQKKyAqIEBub2RlOglUaGUgbm9kZSBmb3IgdGhpcyBpbmRpdmlkdWFsIHN0YXRlLgorICoKKyAqIEluc3RhbGxzIHRoZSBpbnN0YW5jZSBmb3IgdGhlIEBzdGF0ZSBUaGUgQHN0YXRlIG11c3QgaGF2ZSBiZWVuIGVhcmxpZXIKKyAqIG1hcmtlZCBhcyBtdWx0aS1pbnN0YW5jZSBieSBAY3B1aHBfc2V0dXBfc3RhdGVfbXVsdGkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNwdWhwX3N0YXRlX2FkZF9pbnN0YW5jZV9ub2NhbGxzKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCisJCQkJCQkgICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKK3sKKwlyZXR1cm4gX19jcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Uoc3RhdGUsIG5vZGUsIGZhbHNlKTsKIH0KIAogdm9pZCBfX2NwdWhwX3JlbW92ZV9zdGF0ZShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLCBib29sIGludm9rZSk7CkBAIC0xNjIsNiArMjUyLDUxIEBACiAJX19jcHVocF9yZW1vdmVfc3RhdGUoc3RhdGUsIGZhbHNlKTsKIH0KIAorLyoqCisgKiBjcHVocF9yZW1vdmVfbXVsdGlfc3RhdGUgLSBSZW1vdmUgaG90cGx1ZyBtdWx0aSBzdGF0ZSBjYWxsYmFjaworICogQHN0YXRlOglUaGUgc3RhdGUgZm9yIHdoaWNoIHRoZSBjYWxscyBhcmUgcmVtb3ZlZAorICoKKyAqIFJlbW92ZXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBmcm9tIGEgbXVsdGkgc3RhdGUuIFRoaXMgaXMgdGhlIHJldmVyc2Ugb2YKKyAqIGNwdWhwX3NldHVwX3N0YXRlX211bHRpKCkuIEFsbCBpbnN0YW5jZXMgc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkIGJlZm9yZQorICogaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlKQoreworCV9fY3B1aHBfcmVtb3ZlX3N0YXRlKHN0YXRlLCBmYWxzZSk7Cit9CisKK2ludCBfX2NwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLAorCQkJCSAgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsIGJvb2wgaW52b2tlKTsKKworLyoqCisgKiBjcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2UgLSBSZW1vdmUgaG90cGx1ZyBpbnN0YW5jZSBmcm9tIHN0YXRlIGFuZCBpbnZva2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0ZWFyZG93biBjYWxsYmFjaworICogQHN0YXRlOglUaGUgc3RhdGUgZnJvbSB3aGljaCB0aGUgaW5zdGFuY2UgaXMgcmVtb3ZlZAorICogQG5vZGU6CVRoZSBub2RlIGZvciB0aGlzIGluZGl2aWR1YWwgc3RhdGUuCisgKgorICogUmVtb3ZlcyB0aGUgaW5zdGFuY2UgYW5kIGludm9rZXMgdGhlIHRlYXJkb3duIGNhbGxiYWNrIG9uIHRoZSBwcmVzZW50IGNwdXMKKyAqIHdoaWNoIGhhdmUgYWxyZWFkeSByZWFjaGVkIHRoZSBAc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZShlbnVtIGNwdWhwX3N0YXRlIHN0YXRlLAorCQkJCQkgICAgICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKK3sKKwlyZXR1cm4gX19jcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Uoc3RhdGUsIG5vZGUsIHRydWUpOworfQorCisvKioKKyAqIGNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzIC0gUmVtb3ZlIGhvdHBsdWcgaW5zdGFuY2UgZnJvbSBzdGF0ZQorICoJCQkJCSB3aXRob3V0IGludm9raW5nIHRoZSByZWF0ZG93biBjYWxsYmFjaworICogQHN0YXRlOglUaGUgc3RhdGUgZnJvbSB3aGljaCB0aGUgaW5zdGFuY2UgaXMgcmVtb3ZlZAorICogQG5vZGU6CVRoZSBub2RlIGZvciB0aGlzIGluZGl2aWR1YWwgc3RhdGUuCisgKgorICogUmVtb3ZlcyB0aGUgaW5zdGFuY2Ugd2l0aG91dCBpbnZva2luZyB0aGUgdGVhcmRvd24gY2FsbGJhY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNwdWhwX3N0YXRlX3JlbW92ZV9pbnN0YW5jZV9ub2NhbGxzKGVudW0gY3B1aHBfc3RhdGUgc3RhdGUsCisJCQkJCQkgICAgICBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSkKK3sKKwlyZXR1cm4gX19jcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Uoc3RhdGUsIG5vZGUsIGZhbHNlKTsKK30KKwogI2lmZGVmIENPTkZJR19TTVAKIHZvaWQgY3B1aHBfb25saW5lX2lkbGUoZW51bSBjcHVocF9zdGF0ZSBzdGF0ZSk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kYXguaCBiL2luY2x1ZGUvbGludXgvZGF4LmgKaW5kZXggOWM2ZGM3Ny4uYWRkNmM0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kYXguaAorKysgYi9pbmNsdWRlL2xpbnV4L2RheC5oCkBAIC02LDEzICs2LDE5IEBACiAjaW5jbHVkZSA8bGludXgvcmFkaXgtdHJlZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKK3N0cnVjdCBpb21hcF9vcHM7CisKIC8qIFdlIHVzZSBsb3dlc3QgYXZhaWxhYmxlIGV4Y2VwdGlvbmFsIGVudHJ5IGJpdCBmb3IgbG9ja2luZyAqLwogI2RlZmluZSBSQURJWF9EQVhfRU5UUllfTE9DSyAoMSA8PCBSQURJWF9UUkVFX0VYQ0VQVElPTkFMX1NISUZUKQogCitzc2l6ZV90IGlvbWFwX2RheF9ydyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKKwkJc3RydWN0IGlvbWFwX29wcyAqb3BzKTsKIHNzaXplX3QgZGF4X2RvX2lvKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlvdl9pdGVyICosCiAJCSAgZ2V0X2Jsb2NrX3QsIGRpb19pb2RvbmVfdCwgaW50IGZsYWdzKTsKIGludCBkYXhfemVyb19wYWdlX3JhbmdlKHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3QgZnJvbSwgdW5zaWduZWQgbGVuLCBnZXRfYmxvY2tfdCk7CiBpbnQgZGF4X3RydW5jYXRlX3BhZ2Uoc3RydWN0IGlub2RlICosIGxvZmZfdCBmcm9tLCBnZXRfYmxvY2tfdCk7CitpbnQgaW9tYXBfZGF4X2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZiwKKwkJCXN0cnVjdCBpb21hcF9vcHMgKm9wcyk7CiBpbnQgZGF4X2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCBzdHJ1Y3Qgdm1fZmF1bHQgKiwgZ2V0X2Jsb2NrX3QpOwogaW50IGRheF9kZWxldGVfbWFwcGluZ19lbnRyeShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCBpbmRleCk7CiB2b2lkIGRheF93YWtlX21hcHBpbmdfZW50cnlfd2FpdGVyKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZWJ1Z2ZzLmggYi9pbmNsdWRlL2xpbnV4L2RlYnVnZnMuaAppbmRleCAxNDM4ZTIzLi40ZDNmMGQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RlYnVnZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RlYnVnZnMuaApAQCAtNDUsNiArNDUsMjMgQEAKIAogZXh0ZXJuIHN0cnVjdCBzcmN1X3N0cnVjdCBkZWJ1Z2ZzX3NyY3U7CiAKKy8qKgorICogZGVidWdmc19yZWFsX2ZvcHMgLSBnZXR0ZXIgZm9yIHRoZSByZWFsIGZpbGUgb3BlcmF0aW9uCisgKiBAZmlscDogYSBwb2ludGVyIHRvIGEgc3RydWN0IGZpbGUKKyAqCisgKiBNdXN0IG9ubHkgYmUgY2FsbGVkIHVuZGVyIHRoZSBwcm90ZWN0aW9uIGVzdGFibGlzaGVkIGJ5CisgKiBkZWJ1Z2ZzX3VzZV9maWxlX3N0YXJ0KCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZGVidWdmc19yZWFsX2ZvcHMoc3RydWN0IGZpbGUgKmZpbHApCisJX19tdXN0X2hvbGQoJmRlYnVnZnNfc3JjdSkKK3sKKwkvKgorCSAqIE5laXRoZXIgdGhlIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMsIG5vciBpdHMKKwkgKiBjb250ZW50cyBldmVyIGNoYW5nZSAtLSBzcmN1X2RlcmVmZXJlbmNlKCkgaXMgbm90IG5lZWRlZCBoZXJlLgorCSAqLworCXJldHVybiBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2ZzZGF0YTsKK30KKwogI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKQogCiBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2ZnJlcS1ldmVudC5oIGIvaW5jbHVkZS9saW51eC9kZXZmcmVxLWV2ZW50LmgKaW5kZXggMGE4M2ExZS4uNGRiMDBiMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZmcmVxLWV2ZW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZmcmVxLWV2ZW50LmgKQEAgLTE0OCwxMSArMTQ4LDYgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkICpkZXZmcmVxX2V2ZW50X2dldF9kcnZkYXRhKHN0cnVjdCBkZXZmcmVxX2V2ZW50X2RldiAqZWRldikKLXsKLQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2ZnJlcV9ldmVudF9kZXYgKmRldmZyZXFfZXZlbnRfZ2V0X2VkZXZfYnlfcGhhbmRsZSgKIAkJCQkJc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW5kZXgpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYS1kZWJ1Zy5oIGIvaW5jbHVkZS9saW51eC9kbWEtZGVidWcuaAppbmRleCBmZThjYjYxLi5jN2Q4NDRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYS1kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hLWRlYnVnLmgKQEAgLTU2LDYgKzU2LDEzIEBACiBleHRlcm4gdm9pZCBkZWJ1Z19kbWFfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAogCQkJCSAgICB2b2lkICp2aXJ0LCBkbWFfYWRkcl90IGFkZHIpOwogCitleHRlcm4gdm9pZCBkZWJ1Z19kbWFfbWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgYWRkciwKKwkJCQkgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbiwKKwkJCQkgICBkbWFfYWRkcl90IGRtYV9hZGRyKTsKKworZXh0ZXJuIHZvaWQgZGVidWdfZG1hX3VubWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJCQkgICAgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKTsKKwogZXh0ZXJuIHZvaWQgZGVidWdfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCiAJCQkJCSAgaW50IGRpcmVjdGlvbik7CkBAIC0xNDEsNiArMTQ4LDE4IEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19kbWFfbWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgYWRkciwKKwkJCQkJICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbiwKKwkJCQkJICBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfZG1hX3VubWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAorCQkJCQkgICAgaW50IGRpcmVjdGlvbikKK3sKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJCSBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCiAJCQkJCQkgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2xpbnV4L2RtYS1tYXBwaW5nLmgKaW5kZXggNjY1MzNlMS4uMGY5MGViNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hLW1hcHBpbmcuaApAQCAtOTUsNiArOTUsMTIgQEAKIAkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVudHMsCiAJCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAogCQkJIHVuc2lnbmVkIGxvbmcgYXR0cnMpOworCWRtYV9hZGRyX3QgKCptYXBfcmVzb3VyY2UpKHN0cnVjdCBkZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgcGh5c19hZGRyLAorCQkJICAgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhdHRycyk7CisJdm9pZCAoKnVubWFwX3Jlc291cmNlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKKwkJCSAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkgICB1bnNpZ25lZCBsb25nIGF0dHJzKTsKIAl2b2lkICgqc3luY19zaW5nbGVfZm9yX2NwdSkoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsIHNpemVfdCBzaXplLAogCQkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpOwpAQCAtMjU4LDYgKzI2NCw0MSBAQAogCWRlYnVnX2RtYV91bm1hcF9wYWdlKGRldiwgYWRkciwgc2l6ZSwgZGlyLCBmYWxzZSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdCBkbWFfbWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBwaHlzX2FkZHJfdCBwaHlzX2FkZHIsCisJCQkJCSAgc2l6ZV90IHNpemUsCisJCQkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJCQkgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCit7CisJc3RydWN0IGRtYV9tYXBfb3BzICpvcHMgPSBnZXRfZG1hX29wcyhkZXYpOworCWRtYV9hZGRyX3QgYWRkcjsKKworCUJVR19PTighdmFsaWRfZG1hX2RpcmVjdGlvbihkaXIpKTsKKworCS8qIERvbid0IGFsbG93IFJBTSB0byBiZSBtYXBwZWQgKi8KKwlCVUdfT04ocGZuX3ZhbGlkKFBIWVNfUEZOKHBoeXNfYWRkcikpKTsKKworCWFkZHIgPSBwaHlzX2FkZHI7CisJaWYgKG9wcy0+bWFwX3Jlc291cmNlKQorCQlhZGRyID0gb3BzLT5tYXBfcmVzb3VyY2UoZGV2LCBwaHlzX2FkZHIsIHNpemUsIGRpciwgYXR0cnMpOworCisJZGVidWdfZG1hX21hcF9yZXNvdXJjZShkZXYsIHBoeXNfYWRkciwgc2l6ZSwgZGlyLCBhZGRyKTsKKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3VubWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyLAorCQkJCSAgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwlzdHJ1Y3QgZG1hX21hcF9vcHMgKm9wcyA9IGdldF9kbWFfb3BzKGRldik7CisKKwlCVUdfT04oIXZhbGlkX2RtYV9kaXJlY3Rpb24oZGlyKSk7CisJaWYgKG9wcy0+dW5tYXBfcmVzb3VyY2UpCisJCW9wcy0+dW5tYXBfcmVzb3VyY2UoZGV2LCBhZGRyLCBzaXplLCBkaXIsIGF0dHJzKTsKKwlkZWJ1Z19kbWFfdW5tYXBfcmVzb3VyY2UoZGV2LCBhZGRyLCBzaXplLCBkaXIpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGFkZHIsCiAJCQkJCSAgIHNpemVfdCBzaXplLAogCQkJCQkgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCkBAIC03MTgsNyArNzU5LDcgQEAKICNkZWZpbmUgZG1hX21tYXBfd3JpdGVjb21iaW5lIGRtYV9tbWFwX3djCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19ORUVEX0RNQV9NQVBfU1RBVEUKKyNpZiBkZWZpbmVkKENPTkZJR19ORUVEX0RNQV9NQVBfU1RBVEUpIHx8IGRlZmluZWQoQ09ORklHX0RNQV9BUElfREVCVUcpCiAjZGVmaW5lIERFRklORV9ETUFfVU5NQVBfQUREUihBRERSX05BTUUpICAgICAgICBkbWFfYWRkcl90IEFERFJfTkFNRQogI2RlZmluZSBERUZJTkVfRE1BX1VOTUFQX0xFTihMRU5fTkFNRSkgICAgICAgICAgX191MzIgTEVOX05BTUUKICNkZWZpbmUgZG1hX3VubWFwX2FkZHIoUFRSLCBBRERSX05BTUUpICAgICAgICAgICAoKFBUUiktPkFERFJfTkFNRSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hL2R3LmggYi9pbmNsdWRlL2xpbnV4L2RtYS9kdy5oCmluZGV4IGYyZTUzOGEuLmNjZmQwYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hL2R3LmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWEvZHcuaApAQCAtNDAsOCArNDAsMTMgQEAKIH07CiAKIC8qIEV4cG9ydCB0byB0aGUgcGxhdGZvcm0gZHJpdmVycyAqLworI2lmIElTX0VOQUJMRUQoQ09ORklHX0RXX0RNQUNfQ09SRSkKIGludCBkd19kbWFfcHJvYmUoc3RydWN0IGR3X2RtYV9jaGlwICpjaGlwKTsKIGludCBkd19kbWFfcmVtb3ZlKHN0cnVjdCBkd19kbWFfY2hpcCAqY2hpcCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZHdfZG1hX3Byb2JlKHN0cnVjdCBkd19kbWFfY2hpcCAqY2hpcCkgeyByZXR1cm4gLUVOT0RFVjsgfQorc3RhdGljIGlubGluZSBpbnQgZHdfZG1hX3JlbW92ZShzdHJ1Y3QgZHdfZG1hX2NoaXAgKmNoaXApIHsgcmV0dXJuIDA7IH0KKyNlbmRpZiAvKiBDT05GSUdfRFdfRE1BQ19DT1JFICovCiAKIC8qIERNQSBBUEkgZXh0ZW5zaW9ucyAqLwogc3RydWN0IGR3X2Rlc2M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYS9oc3UuaCBiL2luY2x1ZGUvbGludXgvZG1hL2hzdS5oCmluZGV4IGFhZmY2OGUuLjE5N2VlYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hL2hzdS5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hL2hzdS5oCkBAIC00MSw4ICs0MSw3IEBACiAvKiBFeHBvcnQgdG8gdGhlIGludGVybmFsIHVzZXJzICovCiBpbnQgaHN1X2RtYV9nZXRfc3RhdHVzKHN0cnVjdCBoc3VfZG1hX2NoaXAgKmNoaXAsIHVuc2lnbmVkIHNob3J0IG5yLAogCQkgICAgICAgdTMyICpzdGF0dXMpOwotaXJxcmV0dXJuX3QgaHN1X2RtYV9kb19pcnEoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCwgdW5zaWduZWQgc2hvcnQgbnIsCi0JCQkgICB1MzIgc3RhdHVzKTsKK2ludCBoc3VfZG1hX2RvX2lycShzdHJ1Y3QgaHN1X2RtYV9jaGlwICpjaGlwLCB1bnNpZ25lZCBzaG9ydCBuciwgdTMyIHN0YXR1cyk7CiAKIC8qIEV4cG9ydCB0byB0aGUgcGxhdGZvcm0gZHJpdmVycyAqLwogaW50IGhzdV9kbWFfcHJvYmUoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCk7CkBAIC01MywxMCArNTIsMTAgQEAKIHsKIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyBpbmxpbmUgaXJxcmV0dXJuX3QgaHN1X2RtYV9kb19pcnEoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCwKLQkJCQkJIHVuc2lnbmVkIHNob3J0IG5yLCB1MzIgc3RhdHVzKQorc3RhdGljIGlubGluZSBpbnQgaHN1X2RtYV9kb19pcnEoc3RydWN0IGhzdV9kbWFfY2hpcCAqY2hpcCwgdW5zaWduZWQgc2hvcnQgbnIsCisJCQkJIHUzMiBzdGF0dXMpCiB7Ci0JcmV0dXJuIElSUV9OT05FOworCXJldHVybiAwOwogfQogc3RhdGljIGlubGluZSBpbnQgaHN1X2RtYV9wcm9iZShzdHJ1Y3QgaHN1X2RtYV9jaGlwICpjaGlwKSB7IHJldHVybiAtRU5PREVWOyB9CiBzdGF0aWMgaW5saW5lIGludCBoc3VfZG1hX3JlbW92ZShzdHJ1Y3QgaHN1X2RtYV9jaGlwICpjaGlwKSB7IHJldHVybiAwOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oIGIvaW5jbHVkZS9saW51eC9kbWFlbmdpbmUuaAppbmRleCAzMGRlMDE5Li5jYzUzNWE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYWVuZ2luZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hZW5naW5lLmgKQEAgLTQ0MSw2ICs0NDEsMjEgQEAKIAogdHlwZWRlZiB2b2lkICgqZG1hX2FzeW5jX3R4X2NhbGxiYWNrKSh2b2lkICpkbWFfYXN5bmNfcGFyYW0pOwogCitlbnVtIGRtYWVuZ2luZV90eF9yZXN1bHQgeworCURNQV9UUkFOU19OT0VSUk9SID0gMCwJCS8qIFNVQ0NFU1MgKi8KKwlETUFfVFJBTlNfUkVBRF9GQUlMRUQsCQkvKiBTb3VyY2UgRE1BIHJlYWQgZmFpbGVkICovCisJRE1BX1RSQU5TX1dSSVRFX0ZBSUxFRCwJCS8qIERlc3RpbmF0aW9uIERNQSB3cml0ZSBmYWlsZWQgKi8KKwlETUFfVFJBTlNfQUJPUlRFRCwJCS8qIE9wIG5ldmVyIHN1Ym1pdHRlZCAvIGFib3J0ZWQgKi8KK307CisKK3N0cnVjdCBkbWFlbmdpbmVfcmVzdWx0IHsKKwllbnVtIGRtYWVuZ2luZV90eF9yZXN1bHQgcmVzdWx0OworCXUzMiByZXNpZHVlOworfTsKKwordHlwZWRlZiB2b2lkICgqZG1hX2FzeW5jX3R4X2NhbGxiYWNrX3Jlc3VsdCkodm9pZCAqZG1hX2FzeW5jX3BhcmFtLAorCQkJCWNvbnN0IHN0cnVjdCBkbWFlbmdpbmVfcmVzdWx0ICpyZXN1bHQpOworCiBzdHJ1Y3QgZG1hZW5naW5lX3VubWFwX2RhdGEgewogCXU4IG1hcF9jbnQ7CiAJdTggdG9fY250OwpAQCAtNDc4LDYgKzQ5Myw3IEBACiAJZG1hX2Nvb2tpZV90ICgqdHhfc3VibWl0KShzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KTsKIAlpbnQgKCpkZXNjX2ZyZWUpKHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHgpOwogCWRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjazsKKwlkbWFfYXN5bmNfdHhfY2FsbGJhY2tfcmVzdWx0IGNhbGxiYWNrX3Jlc3VsdDsKIAl2b2lkICpjYWxsYmFja19wYXJhbTsKIAlzdHJ1Y3QgZG1hZW5naW5lX3VubWFwX2RhdGEgKnVubWFwOwogI2lmZGVmIENPTkZJR19BU1lOQ19UWF9FTkFCTEVfQ0hBTk5FTF9TV0lUQ0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWZpLmggYi9pbmNsdWRlL2xpbnV4L2VmaS5oCmluZGV4IDdmNWE1ODIuLjJkMDg5NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWZpLmgKKysrIGIvaW5jbHVkZS9saW51eC9lZmkuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BzdG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmdlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvdXVpZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CkBAIC0zNyw2ICszOCw3IEBACiAjZGVmaW5lIEVGSV9XUklURV9QUk9URUNURUQJKCA4IHwgKDFVTCA8PCAoQklUU19QRVJfTE9ORy0xKSkpCiAjZGVmaW5lIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTCSggOSB8ICgxVUwgPDwgKEJJVFNfUEVSX0xPTkctMSkpKQogI2RlZmluZSBFRklfTk9UX0ZPVU5ECQkoMTQgfCAoMVVMIDw8IChCSVRTX1BFUl9MT05HLTEpKSkKKyNkZWZpbmUgRUZJX0FCT1JURUQJCSgyMSB8ICgxVUwgPDwgKEJJVFNfUEVSX0xPTkctMSkpKQogI2RlZmluZSBFRklfU0VDVVJJVFlfVklPTEFUSU9OCSgyNiB8ICgxVUwgPDwgKEJJVFNfUEVSX0xPTkctMSkpKQogCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWZpX3N0YXR1c190OwpAQCAtMTE4LDYgKzEyMCwxNSBAQAogCXUzMiBpbWFnZXNpemU7CiB9IGVmaV9jYXBzdWxlX2hlYWRlcl90OwogCitzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwIHsKKwllZmlfbWVtb3J5X2Rlc2NfdAkqKm1hcDsKKwl1bnNpZ25lZCBsb25nCQkqbWFwX3NpemU7CisJdW5zaWduZWQgbG9uZwkJKmRlc2Nfc2l6ZTsKKwl1MzIJCQkqZGVzY192ZXI7CisJdW5zaWduZWQgbG9uZwkJKmtleV9wdHI7CisJdW5zaWduZWQgbG9uZwkJKmJ1ZmZfc2l6ZTsKK307CisKIC8qCiAgKiBFRkkgY2Fwc3VsZSBmbGFncwogICovCkBAIC02NjksNiArNjgwLDE4IEBACiAJdW5zaWduZWQgbG9uZyB0YWJsZXM7CiB9IGVmaV9zeXN0ZW1fdGFibGVfdDsKIAorLyoKKyAqIEFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudCBzdHJ1Y3R1cmUgZm9yIGRlc2NyaWJpbmcgYSBtZW1vcnkgbWFwIGZvciB0aGUKKyAqIGJlbmVmaXQgb2YgZWZpX21lbW1hcF9pbml0X2Vhcmx5KCksIHNhdmluZyB1cyB0aGUgbmVlZCB0byBwYXNzIGZvdXIKKyAqIHBhcmFtZXRlcnMuCisgKi8KK3N0cnVjdCBlZmlfbWVtb3J5X21hcF9kYXRhIHsKKwlwaHlzX2FkZHJfdCBwaHlzX21hcDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBkZXNjX3ZlcnNpb247CisJdW5zaWduZWQgbG9uZyBkZXNjX3NpemU7Cit9OworCiBzdHJ1Y3QgZWZpX21lbW9yeV9tYXAgewogCXBoeXNfYWRkcl90IHBoeXNfbWFwOwogCXZvaWQgKm1hcDsKQEAgLTY3Niw2ICs2OTksMTIgQEAKIAlpbnQgbnJfbWFwOwogCXVuc2lnbmVkIGxvbmcgZGVzY192ZXJzaW9uOwogCXVuc2lnbmVkIGxvbmcgZGVzY19zaXplOworCWJvb2wgbGF0ZTsKK307CisKK3N0cnVjdCBlZmlfbWVtX3JhbmdlIHsKKwlzdHJ1Y3QgcmFuZ2UgcmFuZ2U7CisJdTY0IGF0dHJpYnV0ZTsKIH07CiAKIHN0cnVjdCBlZmlfZmR0X3BhcmFtcyB7CkBAIC05MDAsNiArOTI5LDE2IEBACiB9CiAjZW5kaWYKIGV4dGVybiB2b2lkIF9faW9tZW0gKmVmaV9sb29rdXBfbWFwcGVkX2FkZHIodTY0IHBoeXNfYWRkcik7CisKK2V4dGVybiBpbnQgX19pbml0IGVmaV9tZW1tYXBfaW5pdF9lYXJseShzdHJ1Y3QgZWZpX21lbW9yeV9tYXBfZGF0YSAqZGF0YSk7CitleHRlcm4gaW50IF9faW5pdCBlZmlfbWVtbWFwX2luaXRfbGF0ZShwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9tZW1tYXBfdW5tYXAodm9pZCk7CitleHRlcm4gaW50IF9faW5pdCBlZmlfbWVtbWFwX2luc3RhbGwocGh5c19hZGRyX3QgYWRkciwgdW5zaWduZWQgaW50IG5yX21hcCk7CitleHRlcm4gaW50IF9faW5pdCBlZmlfbWVtbWFwX3NwbGl0X2NvdW50KGVmaV9tZW1vcnlfZGVzY190ICptZCwKKwkJCQkJIHN0cnVjdCByYW5nZSAqcmFuZ2UpOworZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9tZW1tYXBfaW5zZXJ0KHN0cnVjdCBlZmlfbWVtb3J5X21hcCAqb2xkX21lbW1hcCwKKwkJCQkgICAgIHZvaWQgKmJ1Ziwgc3RydWN0IGVmaV9tZW1fcmFuZ2UgKm1lbSk7CisKIGV4dGVybiBpbnQgZWZpX2NvbmZpZ19pbml0KGVmaV9jb25maWdfdGFibGVfdHlwZV90ICphcmNoX3RhYmxlcyk7CiAjaWZkZWYgQ09ORklHX0VGSV9FU1JUCiBleHRlcm4gdm9pZCBfX2luaXQgZWZpX2VzcnRfaW5pdCh2b2lkKTsKQEAgLTkxNSw2ICs5NTQsNyBAQAogZXh0ZXJuIGludCBfX2luaXQgZWZpX3VhcnRfY29uc29sZV9vbmx5ICh2b2lkKTsKIGV4dGVybiB1NjQgZWZpX21lbV9kZXNjX2VuZChlZmlfbWVtb3J5X2Rlc2NfdCAqbWQpOwogZXh0ZXJuIGludCBlZmlfbWVtX2Rlc2NfbG9va3VwKHU2NCBwaHlzX2FkZHIsIGVmaV9tZW1vcnlfZGVzY190ICpvdXRfbWQpOworZXh0ZXJuIHZvaWQgZWZpX21lbV9yZXNlcnZlKHBoeXNfYWRkcl90IGFkZHIsIHU2NCBzaXplKTsKIGV4dGVybiB2b2lkIGVmaV9pbml0aWFsaXplX2lvbWVtX3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKmNvZGVfcmVzb3VyY2UsCiAJCXN0cnVjdCByZXNvdXJjZSAqZGF0YV9yZXNvdXJjZSwgc3RydWN0IHJlc291cmNlICpic3NfcmVzb3VyY2UpOwogZXh0ZXJuIHZvaWQgZWZpX3Jlc2VydmVfYm9vdF9zZXJ2aWNlcyh2b2lkKTsKQEAgLTk0Niw3ICs5ODYsNyBAQAogLyogSXRlcmF0ZSB0aHJvdWdoIGFuIGVmaV9tZW1vcnlfbWFwICovCiAjZGVmaW5lIGZvcl9lYWNoX2VmaV9tZW1vcnlfZGVzY19pbl9tYXAobSwgbWQpCQkJCSAgIFwKIAlmb3IgKChtZCkgPSAobSktPm1hcDsJCQkJCQkgICBcCi0JICAgICAoKHZvaWQgKikobWQpICsgKG0pLT5kZXNjX3NpemUpIDw9IChtKS0+bWFwX2VuZDsJCSAgIFwKKwkgICAgIChtZCkgJiYgKCh2b2lkICopKG1kKSArIChtKS0+ZGVzY19zaXplKSA8PSAobSktPm1hcF9lbmQ7CSAgIFwKIAkgICAgIChtZCkgPSAodm9pZCAqKShtZCkgKyAobSktPmRlc2Nfc2l6ZSkKIAogLyoqCkBAIC0xMTI3LDEyICsxMTY3LDYgQEAKIH07CiAKIHN0cnVjdCBlZml2YXJzIHsKLQkvKgotCSAqIC0+bG9jayBwcm90ZWN0cyB0d28gdGhpbmdzOgotCSAqIDEpIGVmaXZhcmZzX2xpc3QgYW5kIGVmaXZhcnNfc3lzZnNfbGlzdAotCSAqIDIpIC0+b3BzIGNhbGxzCi0JICovCi0Jc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBrc2V0ICprc2V0OwogCXN0cnVjdCBrb2JqZWN0ICprb2JqZWN0OwogCWNvbnN0IHN0cnVjdCBlZml2YXJfb3BlcmF0aW9ucyAqb3BzOwpAQCAtMTI3Myw4ICsxMzA3LDggQEAKIGludCBlZml2YXJfaW5pdChpbnQgKCpmdW5jKShlZmlfY2hhcjE2X3QgKiwgZWZpX2d1aWRfdCwgdW5zaWduZWQgbG9uZywgdm9pZCAqKSwKIAkJdm9pZCAqZGF0YSwgYm9vbCBkdXBsaWNhdGVzLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKIAotdm9pZCBlZml2YXJfZW50cnlfYWRkKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKLXZvaWQgZWZpdmFyX2VudHJ5X3JlbW92ZShzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSk7CitpbnQgZWZpdmFyX2VudHJ5X2FkZChzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CitpbnQgZWZpdmFyX2VudHJ5X3JlbW92ZShzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSk7CiAKIGludCBfX2VmaXZhcl9lbnRyeV9kZWxldGUoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnkpOwogaW50IGVmaXZhcl9lbnRyeV9kZWxldGUoc3RydWN0IGVmaXZhcl9lbnRyeSAqZW50cnkpOwpAQCAtMTI5MSw3ICsxMzI1LDcgQEAKIGludCBlZml2YXJfZW50cnlfc2V0X3NhZmUoZWZpX2NoYXIxNl90ICpuYW1lLCBlZmlfZ3VpZF90IHZlbmRvciwgdTMyIGF0dHJpYnV0ZXMsCiAJCQkgIGJvb2wgYmxvY2ssIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqZGF0YSk7CiAKLXZvaWQgZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4odm9pZCk7CitpbnQgZWZpdmFyX2VudHJ5X2l0ZXJfYmVnaW4odm9pZCk7CiB2b2lkIGVmaXZhcl9lbnRyeV9pdGVyX2VuZCh2b2lkKTsKIAogaW50IF9fZWZpdmFyX2VudHJ5X2l0ZXIoaW50ICgqZnVuYykoc3RydWN0IGVmaXZhcl9lbnRyeSAqLCB2b2lkICopLApAQCAtMTMyNyw3ICsxMzYxLDYgQEAKIAogI2lmZGVmIENPTkZJR19FRklfUlVOVElNRV9NQVAKIGludCBlZmlfcnVudGltZV9tYXBfaW5pdChzdHJ1Y3Qga29iamVjdCAqKTsKLXZvaWQgZWZpX3J1bnRpbWVfbWFwX3NldHVwKHZvaWQgKiwgaW50LCB1MzIpOwogaW50IGVmaV9nZXRfcnVudGltZV9tYXBfc2l6ZSh2b2lkKTsKIGludCBlZmlfZ2V0X3J1bnRpbWVfbWFwX2Rlc2Nfc2l6ZSh2b2lkKTsKIGludCBlZmlfcnVudGltZV9tYXBfY29weSh2b2lkICpidWYsIHNpemVfdCBidWZzeik7CkBAIC0xMzM3LDkgKzEzNzAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLWVmaV9ydW50aW1lX21hcF9zZXR1cCh2b2lkICptYXAsIGludCBucl9lbnRyaWVzLCB1MzIgZGVzY19zaXplKSB7fQotCiBzdGF0aWMgaW5saW5lIGludCBlZmlfZ2V0X3J1bnRpbWVfbWFwX3NpemUodm9pZCkKIHsKIAlyZXR1cm4gMDsKQEAgLTEzNzEsMTEgKzE0MDEsNyBAQAogCQkJICBlZmlfbG9hZGVkX2ltYWdlX3QgKmltYWdlLCBpbnQgKmNtZF9saW5lX2xlbik7CiAKIGVmaV9zdGF0dXNfdCBlZmlfZ2V0X21lbW9yeV9tYXAoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGVfYXJnLAotCQkJCWVmaV9tZW1vcnlfZGVzY190ICoqbWFwLAotCQkJCXVuc2lnbmVkIGxvbmcgKm1hcF9zaXplLAotCQkJCXVuc2lnbmVkIGxvbmcgKmRlc2Nfc2l6ZSwKLQkJCQl1MzIgKmRlc2NfdmVyLAotCQkJCXVuc2lnbmVkIGxvbmcgKmtleV9wdHIpOworCQkJCXN0cnVjdCBlZmlfYm9vdF9tZW1tYXAgKm1hcCk7CiAKIGVmaV9zdGF0dXNfdCBlZmlfbG93X2FsbG9jKGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlX2FyZywKIAkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKQEAgLTE0NTcsNCArMTQ4MywxNCBAQAogCWFyY2hfZWZpX2NhbGxfdmlydF90ZWFyZG93bigpOwkJCQkJXAogfSkKIAordHlwZWRlZiBlZmlfc3RhdHVzX3QgKCplZmlfZXhpdF9ib290X21hcF9wcm9jZXNzaW5nKSgKKwllZmlfc3lzdGVtX3RhYmxlX3QgKnN5c190YWJsZV9hcmcsCisJc3RydWN0IGVmaV9ib290X21lbW1hcCAqbWFwLAorCXZvaWQgKnByaXYpOworCitlZmlfc3RhdHVzX3QgZWZpX2V4aXRfYm9vdF9zZXJ2aWNlcyhlZmlfc3lzdGVtX3RhYmxlX3QgKnN5c190YWJsZSwKKwkJCQkgICAgdm9pZCAqaGFuZGxlLAorCQkJCSAgICBzdHJ1Y3QgZWZpX2Jvb3RfbWVtbWFwICptYXAsCisJCQkJICAgIHZvaWQgKnByaXYsCisJCQkJICAgIGVmaV9leGl0X2Jvb3RfbWFwX3Byb2Nlc3NpbmcgcHJpdl9mdW5jKTsKICNlbmRpZiAvKiBfTElOVVhfRUZJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0Y29uLmggYi9pbmNsdWRlL2xpbnV4L2V4dGNvbi5oCmluZGV4IDYxMDA0NDEuLmI4NzFjMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0Y29uLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHRjb24uaApAQCAtMjksNiArMjksMTUgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAogLyoKKyAqIERlZmluZSB0aGUgdHlwZSBvZiBzdXBwb3J0ZWQgZXh0ZXJuYWwgY29ubmVjdG9ycworICovCisjZGVmaW5lIEVYVENPTl9UWVBFX1VTQgkJQklUKDApCS8qIFVTQiBjb25uZWN0b3IgKi8KKyNkZWZpbmUgRVhUQ09OX1RZUEVfQ0hHCQlCSVQoMSkJLyogQ2hhcmdlciBjb25uZWN0b3IgKi8KKyNkZWZpbmUgRVhUQ09OX1RZUEVfSkFDSwlCSVQoMikJLyogSmFjayBjb25uZWN0b3IgKi8KKyNkZWZpbmUgRVhUQ09OX1RZUEVfRElTUAlCSVQoMykJLyogRGlzcGxheSBjb25uZWN0b3IgKi8KKyNkZWZpbmUgRVhUQ09OX1RZUEVfTUlTQwlCSVQoNCkJLyogTWlzY2VsbGFuZW91cyBjb25uZWN0b3IgKi8KKworLyoKICAqIERlZmluZSB0aGUgdW5pcXVlIGlkIG9mIHN1cHBvcnRlZCBleHRlcm5hbCBjb25uZWN0b3JzCiAgKi8KICNkZWZpbmUgRVhUQ09OX05PTkUJCTAKQEAgLTQ0LDYgKzUzLDcgQEAKICNkZWZpbmUgRVhUQ09OX0NIR19VU0JfQUNBCTgJLyogQWNjZXNzb3J5IENoYXJnZXIgQWRhcHRlciAqLwogI2RlZmluZSBFWFRDT05fQ0hHX1VTQl9GQVNUCTkKICNkZWZpbmUgRVhUQ09OX0NIR19VU0JfU0xPVwkxMAorI2RlZmluZSBFWFRDT05fQ0hHX1dQVAkJMTEJLyogV2lyZWxlc3MgUG93ZXIgVHJhbnNmZXIgKi8KIAogLyogSmFjayBleHRlcm5hbCBjb25uZWN0b3IgKi8KICNkZWZpbmUgRVhUQ09OX0pBQ0tfTUlDUk9QSE9ORQkyMApAQCAtNjAsNiArNzAsOCBAQAogI2RlZmluZSBFWFRDT05fRElTUF9NSEwJCTQxCS8qIE1vYmlsZSBIaWdoLURlZmluaXRpb24gTGluayAqLwogI2RlZmluZSBFWFRDT05fRElTUF9EVkkJCTQyCS8qIERpZ2l0YWwgVmlzdWFsIEludGVyZmFjZSAqLwogI2RlZmluZSBFWFRDT05fRElTUF9WR0EJCTQzCS8qIFZpZGVvIEdyYXBoaWNzIEFycmF5ICovCisjZGVmaW5lIEVYVENPTl9ESVNQX0RQCQk0NAkvKiBEaXNwbGF5IFBvcnQgKi8KKyNkZWZpbmUgRVhUQ09OX0RJU1BfSE1ECQk0NQkvKiBIZWFkLU1vdW50ZWQgRGlzcGxheSAqLwogCiAvKiBNaXNjZWxsYW5lb3VzIGV4dGVybmFsIGNvbm5lY3RvciAqLwogI2RlZmluZSBFWFRDT05fRE9DSwkJNjAKQEAgLTY4LDYgKzgwLDg1IEBACiAKICNkZWZpbmUgRVhUQ09OX05VTQkJNjMKIAorLyoKKyAqIERlZmluZSB0aGUgcHJvcGVydHkgb2Ygc3VwcG9ydGVkIGV4dGVybmFsIGNvbm5lY3RvcnMuCisgKgorICogV2hlbiBhZGRpbmcgdGhlIG5ldyBleHRjb24gcHJvcGVydHksIHRoZXkgKm11c3QqIGhhdmUKKyAqIHRoZSB0eXBlL3ZhbHVlL2RlZmF1bHQgaW5mb3JtYXRpb24uIEFsc28sIHlvdSAqaGF2ZSB0byoKKyAqIG1vZGlmeSB0aGUgRVhUQ09OX1BST1BfW3R5cGVdX1NUQVJUL0VORCBkZWZpbml0aW9ucworICogd2hpY2ggbWVhbiB0aGUgcmFuZ2Ugb2YgdGhlIHN1cHBvcnRlZCBwcm9wZXJ0aWVzCisgKiBmb3IgZWFjaCBleHRjb24gdHlwZS4KKyAqCisgKiBUaGUgbmFtaW5nIHN0eWxlIG9mIHByb3BlcnR5CisgKiA6IEVYVENPTl9QUk9QX1t0eXBlXV9bcHJvcGVydHkgbmFtZV0KKyAqCisgKiBFWFRDT05fUFJPUF9VU0JfW3Byb3BlcnR5IG5hbWVdCTogVVNCIHByb3BlcnR5CisgKiBFWFRDT05fUFJPUF9DSEdfW3Byb3BlcnR5IG5hbWVdCTogQ2hhcmdlciBwcm9wZXJ0eQorICogRVhUQ09OX1BST1BfSkFDS19bcHJvcGVydHkgbmFtZV0JOiBKYWNrIHByb3BlcnR5CisgKiBFWFRDT05fUFJPUF9ESVNQX1twcm9wZXJ0eSBuYW1lXQk6IERpc3BsYXkgcHJvcGVydHkKKyAqLworCisvKgorICogUHJvcGVydGllcyBvZiBFWFRDT05fVFlQRV9VU0IuCisgKgorICogLSBFWFRDT05fUFJPUF9VU0JfVkJVUworICogQHR5cGU6CWludGVnZXIgKGludHZhbCkKKyAqIEB2YWx1ZToJMCAobG93KSBvciAxIChoaWdoKQorICogQGRlZmF1bHQ6CTAgKGxvdykKKyAqIC0gRVhUQ09OX1BST1BfVVNCX1RZUEVDX1BPTEFSSVRZCisgKiBAdHlwZToJaW50ZWdlciAoaW50dmFsKQorICogQHZhbHVlOgkwIChub3JtYWwpIG9yIDEgKGZsaXApCisgKiBAZGVmYXVsdDoJMCAobm9ybWFsKQorICogLSBFWFRDT05fUFJPUF9VU0JfU1MgKFN1cGVyU3BlZWQpCisgKiBAdHlwZTogICAgICAgaW50ZWdlciAoaW50dmFsKQorICogQHZhbHVlOiAgICAgIDAgKFVTQi9VU0IyKSBvciAxIChVU0IzKQorICogQGRlZmF1bHQ6ICAgIDAgKFVTQi9VU0IyKQorICoKKyAqLworI2RlZmluZSBFWFRDT05fUFJPUF9VU0JfVkJVUwkJMAorI2RlZmluZSBFWFRDT05fUFJPUF9VU0JfVFlQRUNfUE9MQVJJVFkJMQorI2RlZmluZSBFWFRDT05fUFJPUF9VU0JfU1MJCTIKKworI2RlZmluZSBFWFRDT05fUFJPUF9VU0JfTUlOCQkwCisjZGVmaW5lIEVYVENPTl9QUk9QX1VTQl9NQVgJCTIKKyNkZWZpbmUgRVhUQ09OX1BST1BfVVNCX0NOVAkoRVhUQ09OX1BST1BfVVNCX01BWCAtIEVYVENPTl9QUk9QX1VTQl9NSU4gKyAxKQorCisvKiBQcm9wZXJ0aWVzIG9mIEVYVENPTl9UWVBFX0NIRy4gKi8KKyNkZWZpbmUgRVhUQ09OX1BST1BfQ0hHX01JTgkJNTAKKyNkZWZpbmUgRVhUQ09OX1BST1BfQ0hHX01BWAkJNTAKKyNkZWZpbmUgRVhUQ09OX1BST1BfQ0hHX0NOVAkoRVhUQ09OX1BST1BfQ0hHX01BWCAtIEVYVENPTl9QUk9QX0NIR19NSU4gKyAxKQorCisvKiBQcm9wZXJ0aWVzIG9mIEVYVENPTl9UWVBFX0pBQ0suICovCisjZGVmaW5lIEVYVENPTl9QUk9QX0pBQ0tfTUlOCQkxMDAKKyNkZWZpbmUgRVhUQ09OX1BST1BfSkFDS19NQVgJCTEwMAorI2RlZmluZSBFWFRDT05fUFJPUF9KQUNLX0NOVCAoRVhUQ09OX1BST1BfSkFDS19NQVggLSBFWFRDT05fUFJPUF9KQUNLX01JTiArIDEpCisKKy8qCisgKiBQcm9wZXJ0aWVzIG9mIEVYVENPTl9UWVBFX0RJU1AuCisgKgorICogLSBFWFRDT05fUFJPUF9ESVNQX0hQRCAoSG90IFBsdWcgRGV0ZWN0KQorICogQHR5cGU6ICAgICAgIGludGVnZXIgKGludHZhbCkKKyAqIEB2YWx1ZTogICAgICAwIChubyBocGQpIG9yIDEgKGhwZCkKKyAqIEBkZWZhdWx0OiAgICAwIChubyBocGQpCisgKgorICovCisjZGVmaW5lIEVYVENPTl9QUk9QX0RJU1BfSFBECQkxNTAKKworLyogUHJvcGVydGllcyBvZiBFWFRDT05fVFlQRV9ESVNQLiAqLworI2RlZmluZSBFWFRDT05fUFJPUF9ESVNQX01JTgkJMTUwCisjZGVmaW5lIEVYVENPTl9QUk9QX0RJU1BfTUFYCQkxNTEKKyNkZWZpbmUgRVhUQ09OX1BST1BfRElTUF9DTlQgKEVYVENPTl9QUk9QX0RJU1BfTUFYIC0gRVhUQ09OX1BST1BfRElTUF9NSU4gKyAxKQorCisvKgorICogRGVmaW5lIHRoZSB0eXBlIG9mIHByb3BlcnR5J3MgdmFsdWUuCisgKgorICogRGVmaW5lIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGFzIHVuaW9uIHR5cGUuIEJlY2F1c2UgZWFjaCBwcm9wZXJ0eQorICogd291bGQgbmVlZCB0aGUgZGlmZmVyZW50IGRhdGEgdHlwZSB0byBzdG9yZSBpdC4KKyAqLwordW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIHsKKwlpbnQgaW50dmFsOwkvKiB0eXBlIDogaW50ZWdlciAoaW50dmFsKSAqLworfTsKKwogc3RydWN0IGV4dGNvbl9jYWJsZTsKIAogLyoqCkBAIC0xNTAsMjYgKzI0MSw0MiBAQAogZXh0ZXJuIHZvaWQgZGV2bV9leHRjb25fZGV2X2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldik7CiAKIC8qCi0gKiBnZXQvc2V0L3VwZGF0ZV9zdGF0ZSBhY2Nlc3MgdGhlIDMyYiBlbmNvZGVkIHN0YXRlIHZhbHVlLCB3aGljaCByZXByZXNlbnRzCi0gKiBzdGF0ZXMgb2YgYWxsIHBvc3NpYmxlIGNhYmxlcyBvZiB0aGUgbXVsdGlzdGF0ZSBwb3J0LiBGb3IgZXhhbXBsZSwgaWYgb25lCi0gKiBjYWxscyBleHRjb25fc2V0X3N0YXRlKGVkZXYsIDB4NyksIGl0IG1heSBtZWFuIHRoYXQgYWxsIHRoZSB0aHJlZSBjYWJsZXMKLSAqIGFyZSBhdHRhY2hlZCB0byB0aGUgcG9ydC4KLSAqLwotc3RhdGljIGlubGluZSB1MzIgZXh0Y29uX2dldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldikKLXsKLQlyZXR1cm4gZWRldi0+c3RhdGU7Ci19Ci0KLWV4dGVybiBpbnQgZXh0Y29uX3NldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdTMyIHN0YXRlKTsKLWV4dGVybiBpbnQgZXh0Y29uX3VwZGF0ZV9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdTMyIG1hc2ssIHUzMiBzdGF0ZSk7Ci0KLS8qCi0gKiBnZXQvc2V0X2NhYmxlX3N0YXRlIGFjY2VzcyBlYWNoIGJpdCBvZiB0aGUgMzJiIGVuY29kZWQgc3RhdGUgdmFsdWUuCisgKiBnZXQvc2V0X3N0YXRlIGFjY2VzcyBlYWNoIGJpdCBvZiB0aGUgMzJiIGVuY29kZWQgc3RhdGUgdmFsdWUuCiAgKiBUaGV5IGFyZSB1c2VkIHRvIGFjY2VzcyB0aGUgc3RhdHVzIG9mIGVhY2ggY2FibGUgYmFzZWQgb24gdGhlIGNhYmxlIGlkLgogICovCi1leHRlcm4gaW50IGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQpOwotZXh0ZXJuIGludCBleHRjb25fc2V0X2NhYmxlX3N0YXRlXyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorZXh0ZXJuIGludCBleHRjb25fZ2V0X3N0YXRlKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQpOworZXh0ZXJuIGludCBleHRjb25fc2V0X3N0YXRlKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCiAJCQkJICAgYm9vbCBjYWJsZV9zdGF0ZSk7CitleHRlcm4gaW50IGV4dGNvbl9zZXRfc3RhdGVfc3luYyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCWJvb2wgY2FibGVfc3RhdGUpOworLyoKKyAqIFN5bmNocm9uaXplIHRoZSBzdGF0ZSBhbmQgcHJvcGVydHkgZGF0YSBmb3IgYSBzcGVjaWZpYyBleHRlcm5hbCBjb25uZWN0b3IuCisgKi8KK2V4dGVybiBpbnQgZXh0Y29uX3N5bmMoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCk7CisKKy8qCisgKiBnZXQvc2V0X3Byb3BlcnR5IGFjY2VzcyB0aGUgcHJvcGVydHkgdmFsdWUgb2YgZWFjaCBleHRlcm5hbCBjb25uZWN0b3IuCisgKiBUaGV5IGFyZSB1c2VkIHRvIGFjY2VzcyB0aGUgcHJvcGVydHkgb2YgZWFjaCBjYWJsZSBiYXNlZCBvbiB0aGUgcHJvcGVydHkgaWQuCisgKi8KK2V4dGVybiBpbnQgZXh0Y29uX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSAqcHJvcF92YWwpOworZXh0ZXJuIGludCBleHRjb25fc2V0X3Byb3BlcnR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJdW5zaWduZWQgaW50IHByb3AsCisJCQkJdW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIHByb3BfdmFsKTsKK2V4dGVybiBpbnQgZXh0Y29uX3NldF9wcm9wZXJ0eV9zeW5jKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJdW5zaWduZWQgaW50IHByb3AsCisJCQkJdW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIHByb3BfdmFsKTsKKworLyoKKyAqIGdldC9zZXRfcHJvcGVydHlfY2FwYWJpbGl0eSBzZXQgdGhlIGNhcGFiaWxpdHkgb2YgdGhlIHByb3BlcnR5IGZvciBlYWNoCisgKiBleHRlcm5hbCBjb25uZWN0b3IuIFRoZXkgYXJlIHVzZWQgdG8gc2V0IHRoZSBjYXBhYmlsaXR5IG9mIHRoZSBwcm9wZXJ0eQorICogb2YgZWFjaCBleHRlcm5hbCBjb25uZWN0b3IgYmFzZWQgb24gdGhlIGlkIGFuZCBwcm9wZXJ0eS4KKyAqLworZXh0ZXJuIGludCBleHRjb25fZ2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsCisJCQkJdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgcHJvcCk7CitleHRlcm4gaW50IGV4dGNvbl9zZXRfcHJvcGVydHlfY2FwYWJpbGl0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwKKwkJCQl1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBwcm9wKTsKIAogLyoKICAqIEZvbGxvd2luZyBBUElzIGFyZSB0byBtb25pdG9yIGV2ZXJ5IGFjdGlvbiBvZiBhIG5vdGlmaWVyLgpAQCAtMjMyLDMwICszMzksNTcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGRldm1fZXh0Y29uX2Rldl9mcmVlKHN0cnVjdCBleHRjb25fZGV2ICplZGV2KSB7IH0KIAotc3RhdGljIGlubGluZSB1MzIgZXh0Y29uX2dldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldikKKworc3RhdGljIGlubGluZSBpbnQgZXh0Y29uX2dldF9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X3N0YXRlKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1MzIgc3RhdGUpCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X3N0YXRlKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJYm9vbCBjYWJsZV9zdGF0ZSkKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZXh0Y29uX3VwZGF0ZV9zdGF0ZShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdTMyIG1hc2ssCi0JCQkJICAgICAgIHUzMiBzdGF0ZSkKK3N0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9zZXRfc3RhdGVfc3luYyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwgdW5zaWduZWQgaW50IGlkLAorCQkJCWJvb2wgY2FibGVfc3RhdGUpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9nZXRfY2FibGVfc3RhdGVfKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LAotCQkJCQkgIHVuc2lnbmVkIGludCBpZCkKK3N0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9zeW5jKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LAotCQkJCQkgIHVuc2lnbmVkIGludCBpZCwgYm9vbCBjYWJsZV9zdGF0ZSkKK3N0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9nZXRfcHJvcGVydHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCwKKwkJCQkJdW5zaWduZWQgaW50IHByb3AsCisJCQkJCXVuaW9uIGV4dGNvbl9wcm9wZXJ0eV92YWx1ZSAqcHJvcF92YWwpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBleHRjb25fc2V0X3Byb3BlcnR5KHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJCXVuc2lnbmVkIGludCBwcm9wLAorCQkJCQl1bmlvbiBleHRjb25fcHJvcGVydHlfdmFsdWUgcHJvcF92YWwpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9zZXRfcHJvcGVydHlfc3luYyhzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwKKwkJCQkJdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgcHJvcCwKKwkJCQkJdW5pb24gZXh0Y29uX3Byb3BlcnR5X3ZhbHVlIHByb3BfdmFsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHRjb25fZ2V0X3Byb3BlcnR5X2NhcGFiaWxpdHkoc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsCisJCQkJCXVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHByb3ApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9zZXRfcHJvcGVydHlfY2FwYWJpbGl0eShzdHJ1Y3QgZXh0Y29uX2RldiAqZWRldiwKKwkJCQkJdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgcHJvcCkKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTMyMCw0ICs0NTQsMTUgQEAKIHsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KKworc3RhdGljIGlubGluZSBpbnQgZXh0Y29uX2dldF9jYWJsZV9zdGF0ZV8oc3RydWN0IGV4dGNvbl9kZXYgKmVkZXYsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlyZXR1cm4gZXh0Y29uX2dldF9zdGF0ZShlZGV2LCBpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dGNvbl9zZXRfY2FibGVfc3RhdGVfKHN0cnVjdCBleHRjb25fZGV2ICplZGV2LCB1bnNpZ25lZCBpbnQgaWQsCisJCQkJICAgYm9vbCBjYWJsZV9zdGF0ZSkKK3sKKwlyZXR1cm4gZXh0Y29uX3NldF9zdGF0ZV9zeW5jKGVkZXYsIGlkLCBjYWJsZV9zdGF0ZSk7Cit9CiAjZW5kaWYgLyogX19MSU5VWF9FWFRDT05fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dGNvbi9leHRjb24tYWRjLWphY2suaCBiL2luY2x1ZGUvbGludXgvZXh0Y29uL2V4dGNvbi1hZGMtamFjay5oCmluZGV4IGFjODVmMjAuLmEwZTAzYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0Y29uL2V4dGNvbi1hZGMtamFjay5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0Y29uL2V4dGNvbi1hZGMtamFjay5oCkBAIC0yMCw4ICsyMCw4IEBACiAKIC8qKgogICogc3RydWN0IGFkY19qYWNrX2NvbmQgLSBjb25kaXRpb24gdG8gdXNlIGFuIGV4dGNvbiBzdGF0ZQotICogQHN0YXRlOgkJdGhlIGNvcnJlc3BvbmRpbmcgZXh0Y29uIHN0YXRlIChpZiAwLCB0aGlzIHN0cnVjdAogICoJCQlkZW5vdGVzIHRoZSBsYXN0IGFkY19qYWNrX2NvbmQgZWxlbWVudCBhbW9uZyB0aGUgYXJyYXkpCisgKiBAaWQ6CQkJdGhlIHVuaXF1ZSBpZCBvZiBlYWNoIGV4dGVybmFsIGNvbm5lY3RvcgogICogQG1pbl9hZGM6CQltaW4gYWRjIHZhbHVlIGZvciB0aGlzIGNvbmRpdGlvbgogICogQG1heF9hZGM6CQltYXggYWRjIHZhbHVlIGZvciB0aGlzIGNvbmRpdGlvbgogICoKQEAgLTMzLDcgKzMzLDcgQEAKICAqIGJlY2F1c2Ugd2hlbiBubyBhZGNfamFja19jb25kIGlzIG1ldCwgc3RhdGUgPSAwIGlzIGF1dG9tYXRpY2FsbHkgY2hvc2VuLgogICovCiBzdHJ1Y3QgYWRjX2phY2tfY29uZCB7Ci0JdTMyIHN0YXRlOwkvKiBleHRjb24gc3RhdGUgdmFsdWUuIDAgaWYgaW52YWxpZCAqLworCXVuc2lnbmVkIGludCBpZDsKIAl1MzIgbWluX2FkYzsKIAl1MzIgbWF4X2FkYzsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2YyZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvZjJmc19mcy5oCmluZGV4IDRjMDJjNjUuLjQyMjYzMGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZjJmc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZjJmc19mcy5oCkBAIC0xMDAsNiArMTAwLDcgQEAKIC8qCiAgKiBGb3IgY2hlY2twb2ludAogICovCisjZGVmaW5lIENQX0NSQ19SRUNPVkVSWV9GTEFHCTB4MDAwMDAwNDAKICNkZWZpbmUgQ1BfRkFTVEJPT1RfRkxBRwkweDAwMDAwMDIwCiAjZGVmaW5lIENQX0ZTQ0tfRkxBRwkJMHgwMDAwMDAxMAogI2RlZmluZSBDUF9FUlJPUl9GTEFHCQkweDAwMDAwMDA4CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZlbmNlLmggYi9pbmNsdWRlL2xpbnV4L2ZlbmNlLmgKaW5kZXggOGNjNzE5YS4uMmFjNmZhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mZW5jZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZmVuY2UuaApAQCAtNDksOCArNDksNiBAQAogICogQHRpbWVzdGFtcDogVGltZXN0YW1wIHdoZW4gdGhlIGZlbmNlIHdhcyBzaWduYWxlZC4KICAqIEBzdGF0dXM6IE9wdGlvbmFsLCBvbmx5IHZhbGlkIGlmIDwgMCwgbXVzdCBiZSBzZXQgYmVmb3JlIGNhbGxpbmcKICAqIGZlbmNlX3NpZ25hbCwgaW5kaWNhdGVzIHRoYXQgdGhlIGZlbmNlIGhhcyBjb21wbGV0ZWQgd2l0aCBhbiBlcnJvci4KLSAqIEBjaGlsZF9saXN0OiBsaXN0IG9mIGNoaWxkcmVuIGZlbmNlcwotICogQGFjdGl2ZV9saXN0OiBsaXN0IG9mIGFjdGl2ZSBmZW5jZXMKICAqCiAgKiB0aGUgZmxhZ3MgbWVtYmVyIG11c3QgYmUgbWFuaXB1bGF0ZWQgYW5kIHJlYWQgdXNpbmcgdGhlIGFwcHJvcHJpYXRlCiAgKiBhdG9taWMgb3BzIChiaXRfKiksIHNvIHRha2luZyB0aGUgc3BpbmxvY2sgd2lsbCBub3QgYmUgbmVlZGVkIG1vc3QKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmlsdGVyLmggYi9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oCmluZGV4IGExNjQzOWIuLjFmMDljNTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmlsdGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9maWx0ZXIuaApAQCAtMzE0LDYgKzMxNCw3MCBAQAogCWJwZl9zaXplOwkJCQkJCVwKIH0pCiAKKyNkZWZpbmUgQlBGX1NJWkVPRih0eXBlKQkJCQkJXAorCSh7CQkJCQkJCVwKKwkJY29uc3QgaW50IF9fc2l6ZSA9IGJ5dGVzX3RvX2JwZl9zaXplKHNpemVvZih0eXBlKSk7IFwKKwkJQlVJTERfQlVHX09OKF9fc2l6ZSA8IDApOwkJCVwKKwkJX19zaXplOwkJCQkJCVwKKwl9KQorCisjZGVmaW5lIEJQRl9GSUVMRF9TSVpFT0YodHlwZSwgZmllbGQpCQkJCVwKKwkoewkJCQkJCQlcCisJCWNvbnN0IGludCBfX3NpemUgPSBieXRlc190b19icGZfc2l6ZShGSUVMRF9TSVpFT0YodHlwZSwgZmllbGQpKTsgXAorCQlCVUlMRF9CVUdfT04oX19zaXplIDwgMCk7CQkJXAorCQlfX3NpemU7CQkJCQkJXAorCX0pCisKKyNkZWZpbmUgX19CUEZfTUFQXzAobSwgdiwgLi4uKSB2CisjZGVmaW5lIF9fQlBGX01BUF8xKG0sIHYsIHQsIGEsIC4uLikgbSh0LCBhKQorI2RlZmluZSBfX0JQRl9NQVBfMihtLCB2LCB0LCBhLCAuLi4pIG0odCwgYSksIF9fQlBGX01BUF8xKG0sIHYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBfX0JQRl9NQVBfMyhtLCB2LCB0LCBhLCAuLi4pIG0odCwgYSksIF9fQlBGX01BUF8yKG0sIHYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBfX0JQRl9NQVBfNChtLCB2LCB0LCBhLCAuLi4pIG0odCwgYSksIF9fQlBGX01BUF8zKG0sIHYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBfX0JQRl9NQVBfNShtLCB2LCB0LCBhLCAuLi4pIG0odCwgYSksIF9fQlBGX01BUF80KG0sIHYsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIF9fQlBGX1JFR18wKC4uLikgX19CUEZfUEFEKDUpCisjZGVmaW5lIF9fQlBGX1JFR18xKC4uLikgX19CUEZfTUFQKDEsIF9fVkFfQVJHU19fKSwgX19CUEZfUEFEKDQpCisjZGVmaW5lIF9fQlBGX1JFR18yKC4uLikgX19CUEZfTUFQKDIsIF9fVkFfQVJHU19fKSwgX19CUEZfUEFEKDMpCisjZGVmaW5lIF9fQlBGX1JFR18zKC4uLikgX19CUEZfTUFQKDMsIF9fVkFfQVJHU19fKSwgX19CUEZfUEFEKDIpCisjZGVmaW5lIF9fQlBGX1JFR180KC4uLikgX19CUEZfTUFQKDQsIF9fVkFfQVJHU19fKSwgX19CUEZfUEFEKDEpCisjZGVmaW5lIF9fQlBGX1JFR181KC4uLikgX19CUEZfTUFQKDUsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIF9fQlBGX01BUChuLCAuLi4pIF9fQlBGX01BUF8jI24oX19WQV9BUkdTX18pCisjZGVmaW5lIF9fQlBGX1JFRyhuLCAuLi4pIF9fQlBGX1JFR18jI24oX19WQV9BUkdTX18pCisKKyNkZWZpbmUgX19CUEZfQ0FTVCh0LCBhKQkJCQkJCSAgICAgICBcCisJKF9fZm9yY2UgdCkJCQkJCQkJICAgICAgIFwKKwkoX19mb3JjZQkJCQkJCQkgICAgICAgXAorCSB0eXBlb2YoX19idWlsdGluX2Nob29zZV9leHByKHNpemVvZih0KSA9PSBzaXplb2YodW5zaWduZWQgbG9uZyksICAgICAgXAorCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKTAsICh0KTApKSkgYQorI2RlZmluZSBfX0JQRl9WIHZvaWQKKyNkZWZpbmUgX19CUEZfTgorCisjZGVmaW5lIF9fQlBGX0RFQ0xfQVJHUyh0LCBhKSB0ICAgYQorI2RlZmluZSBfX0JQRl9ERUNMX1JFR1ModCwgYSkgdTY0IGEKKworI2RlZmluZSBfX0JQRl9QQUQobikJCQkJCQkJICAgICAgIFwKKwlfX0JQRl9NQVAobiwgX19CUEZfREVDTF9BUkdTLCBfX0JQRl9OLCB1NjQsIF9fdXJfMSwgdTY0LCBfX3VyXzIsICAgICAgIFwKKwkJICB1NjQsIF9fdXJfMywgdTY0LCBfX3VyXzQsIHU2NCwgX191cl81KQorCisjZGVmaW5lIEJQRl9DQUxMX3goeCwgbmFtZSwgLi4uKQkJCQkJICAgICAgIFwKKwlzdGF0aWMgX19hbHdheXNfaW5saW5lCQkJCQkJICAgICAgIFwKKwl1NjQgX19fXyMjbmFtZShfX0JQRl9NQVAoeCwgX19CUEZfREVDTF9BUkdTLCBfX0JQRl9WLCBfX1ZBX0FSR1NfXykpOyAgIFwKKwl1NjQgbmFtZShfX0JQRl9SRUcoeCwgX19CUEZfREVDTF9SRUdTLCBfX0JQRl9OLCBfX1ZBX0FSR1NfXykpOwkgICAgICAgXAorCXU2NCBuYW1lKF9fQlBGX1JFRyh4LCBfX0JQRl9ERUNMX1JFR1MsIF9fQlBGX04sIF9fVkFfQVJHU19fKSkJICAgICAgIFwKKwl7CQkJCQkJCQkgICAgICAgXAorCQlyZXR1cm4gX19fXyMjbmFtZShfX0JQRl9NQVAoeCxfX0JQRl9DQVNULF9fQlBGX04sX19WQV9BUkdTX18pKTtcCisJfQkJCQkJCQkJICAgICAgIFwKKwlzdGF0aWMgX19hbHdheXNfaW5saW5lCQkJCQkJICAgICAgIFwKKwl1NjQgX19fXyMjbmFtZShfX0JQRl9NQVAoeCwgX19CUEZfREVDTF9BUkdTLCBfX0JQRl9WLCBfX1ZBX0FSR1NfXykpCisKKyNkZWZpbmUgQlBGX0NBTExfMChuYW1lLCAuLi4pCUJQRl9DQUxMX3goMCwgbmFtZSwgX19WQV9BUkdTX18pCisjZGVmaW5lIEJQRl9DQUxMXzEobmFtZSwgLi4uKQlCUEZfQ0FMTF94KDEsIG5hbWUsIF9fVkFfQVJHU19fKQorI2RlZmluZSBCUEZfQ0FMTF8yKG5hbWUsIC4uLikJQlBGX0NBTExfeCgyLCBuYW1lLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQlBGX0NBTExfMyhuYW1lLCAuLi4pCUJQRl9DQUxMX3goMywgbmFtZSwgX19WQV9BUkdTX18pCisjZGVmaW5lIEJQRl9DQUxMXzQobmFtZSwgLi4uKQlCUEZfQ0FMTF94KDQsIG5hbWUsIF9fVkFfQVJHU19fKQorI2RlZmluZSBCUEZfQ0FMTF81KG5hbWUsIC4uLikJQlBGX0NBTExfeCg1LCBuYW1lLCBfX1ZBX0FSR1NfXykKKwogI2lmZGVmIENPTkZJR19DT01QQVQKIC8qIEEgc3RydWN0IHNvY2tfZmlsdGVyIGlzIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudC4gKi8KIHN0cnVjdCBjb21wYXRfc29ja19mcHJvZyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggMzUyM2JmNi4uYjA0ODgzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtNTc0LDYgKzU3NCw3IEBACiAKIHN0cnVjdCBwb3NpeF9hY2w7CiAjZGVmaW5lIEFDTF9OT1RfQ0FDSEVEICgodm9pZCAqKSgtMSkpCisjZGVmaW5lIEFDTF9ET05UX0NBQ0hFICgodm9pZCAqKSgtMykpCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBvc2l4X2FjbCAqCiB1bmNhY2hlZF9hY2xfc2VudGluZWwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQpAQCAtMjc5Myw4ICsyNzk0LDYgQEAKIC8qIGZzL3NwbGljZS5jICovCiBleHRlcm4gc3NpemVfdCBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQoc3RydWN0IGZpbGUgKiwgbG9mZl90ICosCiAJCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIHNzaXplX3QgZGVmYXVsdF9maWxlX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICosIGxvZmZfdCAqLAotCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBzc2l6ZV90IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLAogCQlzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHNzaXplX3QgZ2VuZXJpY19zcGxpY2Vfc2VuZHBhZ2Uoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnNjcnlwdG8uaCBiL2luY2x1ZGUvbGludXgvZnNjcnlwdG8uaAppbmRleCBjZmE2Y2RlLi5mZjhiMTFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzY3J5cHRvLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc2NyeXB0by5oCkBAIC0xMTEsMjMgKzExMSw2IEBACiAJc3RydWN0IGZzY3J5cHRfY29tcGxldGlvbl9yZXN1bHQgZWNyID0geyBcCiAJCUNPTVBMRVRJT05fSU5JVElBTElaRVIoKGVjcikuY29tcGxldGlvbiksIDAgfQogCi1zdGF0aWMgaW5saW5lIGludCBmc2NyeXB0X2tleV9zaXplKGludCBtb2RlKQotewotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgRlNfRU5DUllQVElPTl9NT0RFX0FFU18yNTZfWFRTOgotCQlyZXR1cm4gRlNfQUVTXzI1Nl9YVFNfS0VZX1NJWkU7Ci0JY2FzZSBGU19FTkNSWVBUSU9OX01PREVfQUVTXzI1Nl9HQ006Ci0JCXJldHVybiBGU19BRVNfMjU2X0dDTV9LRVlfU0laRTsKLQljYXNlIEZTX0VOQ1JZUFRJT05fTU9ERV9BRVNfMjU2X0NCQzoKLQkJcmV0dXJuIEZTX0FFU18yNTZfQ0JDX0tFWV9TSVpFOwotCWNhc2UgRlNfRU5DUllQVElPTl9NT0RFX0FFU18yNTZfQ1RTOgotCQlyZXR1cm4gRlNfQUVTXzI1Nl9DVFNfS0VZX1NJWkU7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCXJldHVybiAwOwotfQotCiAjZGVmaW5lIEZTX0ZOQU1FX05VTV9TQ0FUVEVSX0VOVFJJRVMJNAogI2RlZmluZSBGU19DUllQVE9fQkxPQ0tfU0laRQkJMTYKICNkZWZpbmUgRlNfRk5BTUVfQ1JZUFRPX0RJR0VTVF9TSVpFCTMyCkBAIC0yMDIsMTMgKzE4NSw2IEBACiAJcmV0dXJuIChtb2RlID09IEZTX0VOQ1JZUFRJT05fTU9ERV9BRVNfMjU2X0NUUyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGZzY3J5cHRfdmFsaWRhdGVfZW5jcnlwdGlvbl9rZXlfc2l6ZSh1MzIgbW9kZSwgdTMyIHNpemUpCi17Ci0JaWYgKHNpemUgPT0gZnNjcnlwdF9rZXlfc2l6ZShtb2RlKSkKLQkJcmV0dXJuIHNpemU7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgYm9vbCBmc2NyeXB0X2lzX2RvdF9kb3Rkb3QoY29uc3Qgc3RydWN0IHFzdHIgKnN0cikKIHsKIAlpZiAoc3RyLT5sZW4gPT0gMSAmJiBzdHItPm5hbWVbMF0gPT0gJy4nKQpAQCAtMjc0LDggKzI1MCw3IEBACiBleHRlcm4gaW50IGZzY3J5cHRfemVyb291dF9yYW5nZShzdHJ1Y3QgaW5vZGUgKiwgcGdvZmZfdCwgc2VjdG9yX3QsCiAJCQkJCQl1bnNpZ25lZCBpbnQpOwogLyogcG9saWN5LmMgKi8KLWV4dGVybiBpbnQgZnNjcnlwdF9wcm9jZXNzX3BvbGljeShzdHJ1Y3QgaW5vZGUgKiwKLQkJCQkJY29uc3Qgc3RydWN0IGZzY3J5cHRfcG9saWN5ICopOworZXh0ZXJuIGludCBmc2NyeXB0X3Byb2Nlc3NfcG9saWN5KHN0cnVjdCBmaWxlICosIGNvbnN0IHN0cnVjdCBmc2NyeXB0X3BvbGljeSAqKTsKIGV4dGVybiBpbnQgZnNjcnlwdF9nZXRfcG9saWN5KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZnNjcnlwdF9wb2xpY3kgKik7CiBleHRlcm4gaW50IGZzY3J5cHRfaGFzX3Blcm1pdHRlZF9jb250ZXh0KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gaW50IGZzY3J5cHRfaW5oZXJpdF9jb250ZXh0KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKiwKQEAgLTM0NSw3ICszMjAsNyBAQAogfQogCiAvKiBwb2xpY3kuYyAqLwotc3RhdGljIGlubGluZSBpbnQgZnNjcnlwdF9ub3RzdXBwX3Byb2Nlc3NfcG9saWN5KHN0cnVjdCBpbm9kZSAqaSwKK3N0YXRpYyBpbmxpbmUgaW50IGZzY3J5cHRfbm90c3VwcF9wcm9jZXNzX3BvbGljeShzdHJ1Y3QgZmlsZSAqZiwKIAkJCQljb25zdCBzdHJ1Y3QgZnNjcnlwdF9wb2xpY3kgKnApCiB7CiAJcmV0dXJuIC1FT1BOT1RTVVBQOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc25vdGlmeV9iYWNrZW5kLmggYi9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaAppbmRleCA1ODIwNWYzMy4uNzI2OGVkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc25vdGlmeV9iYWNrZW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9mc25vdGlmeV9iYWNrZW5kLmgKQEAgLTE0OCw2ICsxNDgsNyBAQAogCSNkZWZpbmUgRlNfUFJJT18xCTEgLyogZmFub3RpZnkgY29udGVudCBiYXNlZCBhY2Nlc3MgY29udHJvbCAqLwogCSNkZWZpbmUgRlNfUFJJT18yCTIgLyogZmFub3RpZnkgcHJlLWNvbnRlbnQgYWNjZXNzICovCiAJdW5zaWduZWQgaW50IHByaW9yaXR5OworCWJvb2wgc2h1dGRvd247CQkvKiBncm91cCBpcyBiZWluZyBzaHV0IGRvd24sIGRvbid0IHF1ZXVlIG1vcmUgZXZlbnRzICovCiAKIAkvKiBzdG9yZXMgYWxsIGZhc3RwYXRoIG1hcmtzIGFzc29jIHdpdGggdGhpcyBncm91cCBzbyB0aGV5IGNhbiBiZSBjbGVhbmVkIG9uIHVucmVnaXN0ZXIgKi8KIAlzdHJ1Y3QgbXV0ZXggbWFya19tdXRleDsJLyogcHJvdGVjdCBtYXJrc19saXN0ICovCkBAIC0xNzksNyArMTgwLDYgQEAKIAkJCXNwaW5sb2NrX3QgYWNjZXNzX2xvY2s7CiAJCQlzdHJ1Y3QgbGlzdF9oZWFkIGFjY2Vzc19saXN0OwogCQkJd2FpdF9xdWV1ZV9oZWFkX3QgYWNjZXNzX3dhaXRxOwotCQkJYXRvbWljX3QgYnlwYXNzX3Blcm07CiAjZW5kaWYgLyogQ09ORklHX0ZBTk9USUZZX0FDQ0VTU19QRVJNSVNTSU9OUyAqLwogCQkJaW50IGZfZmxhZ3M7CiAJCQl1bnNpZ25lZCBpbnQgbWF4X21hcmtzOwpAQCAtMjkyLDYgKzI5Miw4IEBACiBleHRlcm4gdm9pZCBmc25vdGlmeV9nZXRfZ3JvdXAoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCk7CiAvKiBkcm9wIHJlZmVyZW5jZSBvbiBhIGdyb3VwIGZyb20gZnNub3RpZnlfYWxsb2NfZ3JvdXAgKi8KIGV4dGVybiB2b2lkIGZzbm90aWZ5X3B1dF9ncm91cChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKTsKKy8qIGdyb3VwIGRlc3RydWN0aW9uIGJlZ2lucywgc3RvcCBxdWV1aW5nIG5ldyBldmVudHMgKi8KK2V4dGVybiB2b2lkIGZzbm90aWZ5X2dyb3VwX3N0b3BfcXVldWVpbmcoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCk7CiAvKiBkZXN0cm95IGdyb3VwICovCiBleHRlcm4gdm9pZCBmc25vdGlmeV9kZXN0cm95X2dyb3VwKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApOwogLyogZmFzeW5jIGhhbmRsZXIgZnVuY3Rpb24gKi8KQEAgLTMwNCw4ICszMDYsNiBAQAogCQkJICAgICAgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCwKIAkJCSAgICAgIGludCAoKm1lcmdlKShzdHJ1Y3QgbGlzdF9oZWFkICosCiAJCQkJCSAgIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqKSk7Ci0vKiBSZW1vdmUgcGFzc2VkIGV2ZW50IGZyb20gZ3JvdXBzIG5vdGlmaWNhdGlvbiBxdWV1ZSAqLwotZXh0ZXJuIHZvaWQgZnNub3RpZnlfcmVtb3ZlX2V2ZW50KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXAsIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQpOwogLyogdHJ1ZSBpZiB0aGUgZ3JvdXAgbm90aWZpY2F0aW9uIHF1ZXVlIGlzIGVtcHR5ICovCiBleHRlcm4gYm9vbCBmc25vdGlmeV9ub3RpZnlfcXVldWVfaXNfZW1wdHkoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCk7CiAvKiByZXR1cm4sIGJ1dCBkbyBub3QgZGVxdWV1ZSB0aGUgZmlyc3QgZXZlbnQgb24gdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdHJhY2UuaCBiL2luY2x1ZGUvbGludXgvZnRyYWNlLmgKaW5kZXggN2Q1NjVhZi4uYjNkMzRkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdHJhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oCkBAIC03OTQsOCArNzk0LDE1IEBACiAJdW5zaWduZWQgbG9uZyByZXQ7CiAJdW5zaWduZWQgbG9uZyBmdW5jOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBjYWxsdGltZTsKKyNpZmRlZiBDT05GSUdfRlVOQ1RJT05fUFJPRklMRVIKIAl1bnNpZ25lZCBsb25nIGxvbmcgc3VidGltZTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAogCXVuc2lnbmVkIGxvbmcgZnA7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0ZVTkNUSU9OX0dSQVBIX1JFVF9BRERSX1BUUgorCXVuc2lnbmVkIGxvbmcgKnJldHA7CisjZW5kaWYKIH07CiAKIC8qCkBAIC04MDcsNyArODE0LDEwIEBACiAKIGV4dGVybiBpbnQKIGZ0cmFjZV9wdXNoX3JldHVybl90cmFjZSh1bnNpZ25lZCBsb25nIHJldCwgdW5zaWduZWQgbG9uZyBmdW5jLCBpbnQgKmRlcHRoLAotCQkJIHVuc2lnbmVkIGxvbmcgZnJhbWVfcG9pbnRlcik7CisJCQkgdW5zaWduZWQgbG9uZyBmcmFtZV9wb2ludGVyLCB1bnNpZ25lZCBsb25nICpyZXRwKTsKKwordW5zaWduZWQgbG9uZyBmdHJhY2VfZ3JhcGhfcmV0X2FkZHIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgKmlkeCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyByZXQsIHVuc2lnbmVkIGxvbmcgKnJldHApOwogCiAvKgogICogU29tZXRpbWVzIHdlIGRvbid0IHdhbnQgdG8gdHJhY2UgYSBmdW5jdGlvbiB3aXRoIHRoZSBmdW5jdGlvbgpAQCAtODcwLDYgKzg4MCwxMyBAQAogCXJldHVybiAtMTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitmdHJhY2VfZ3JhcGhfcmV0X2FkZHIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgKmlkeCwgdW5zaWduZWQgbG9uZyByZXQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnJldHApCit7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHBhdXNlX2dyYXBoX3RyYWNpbmcodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdW5wYXVzZV9ncmFwaF90cmFjaW5nKHZvaWQpIHsgfQogI2VuZGlmIC8qIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnRyYWNlX2lycS5oIGIvaW5jbHVkZS9saW51eC9mdHJhY2VfaXJxLmgKaW5kZXggZGNhN2JmOC4uNGVjMmM5YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdHJhY2VfaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdHJhY2VfaXJxLmgKQEAgLTMsMTEgKzMsMzQgQEAKIAogCiAjaWZkZWYgQ09ORklHX0ZUUkFDRV9OTUlfRU5URVIKLWV4dGVybiB2b2lkIGZ0cmFjZV9ubWlfZW50ZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBmdHJhY2Vfbm1pX2V4aXQodm9pZCk7CitleHRlcm4gdm9pZCBhcmNoX2Z0cmFjZV9ubWlfZW50ZXIodm9pZCk7CitleHRlcm4gdm9pZCBhcmNoX2Z0cmFjZV9ubWlfZXhpdCh2b2lkKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX25taV9lbnRlcih2b2lkKSB7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmdHJhY2Vfbm1pX2V4aXQodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9mdHJhY2Vfbm1pX2VudGVyKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZnRyYWNlX25taV9leGl0KHZvaWQpIHsgfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfSFdMQVRfVFJBQ0VSCitleHRlcm4gYm9vbCB0cmFjZV9od2xhdF9jYWxsYmFja19lbmFibGVkOworZXh0ZXJuIHZvaWQgdHJhY2VfaHdsYXRfY2FsbGJhY2soYm9vbCBlbnRlcik7CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9ubWlfZW50ZXIodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfSFdMQVRfVFJBQ0VSCisJaWYgKHRyYWNlX2h3bGF0X2NhbGxiYWNrX2VuYWJsZWQpCisJCXRyYWNlX2h3bGF0X2NhbGxiYWNrKHRydWUpOworI2VuZGlmCisJYXJjaF9mdHJhY2Vfbm1pX2VudGVyKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmdHJhY2Vfbm1pX2V4aXQodm9pZCkKK3sKKwlhcmNoX2Z0cmFjZV9ubWlfZXhpdCgpOworI2lmZGVmIENPTkZJR19IV0xBVF9UUkFDRVIKKwlpZiAodHJhY2VfaHdsYXRfY2FsbGJhY2tfZW5hYmxlZCkKKwkJdHJhY2VfaHdsYXRfY2FsbGJhY2soZmFsc2UpOworI2VuZGlmCit9CisKICNlbmRpZiAvKiBfTElOVVhfRlRSQUNFX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dwaW8vZHJpdmVyLmggYi9pbmNsdWRlL2xpbnV4L2dwaW8vZHJpdmVyLmgKaW5kZXggNTA4ODJlMC4uMWYwYmU3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ncGlvL2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZ3Bpby9kcml2ZXIuaApAQCAtMyw3ICszLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxY2hpcC9jaGFpbmVkX2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgpAQCAtMTYsNiArMTUsNyBAQAogc3RydWN0IGRldmljZV9ub2RlOwogc3RydWN0IHNlcV9maWxlOwogc3RydWN0IGdwaW9fZGV2aWNlOworc3RydWN0IG1vZHVsZTsKIAogI2lmZGVmIENPTkZJR19HUElPTElCCiAKQEAgLTExMiw2ICsxMTIsMTAgQEAKICAqCWluaXRpYWxpemF0aW9uLCBwcm92aWRlZCBieSBHUElPIGRyaXZlcgogICogQGlycV9wYXJlbnQ6IEdQSU8gSVJRIGNoaXAgcGFyZW50L2JhbmsgbGludXggaXJxIG51bWJlciwKICAqCXByb3ZpZGVkIGJ5IEdQSU8gZHJpdmVyCisgKiBAaXJxX25lZWRfdmFsaWRfbWFzazogSWYgc2V0IGNvcmUgYWxsb2NhdGVzIEBpcnFfdmFsaWRfbWFzayB3aXRoIGFsbAorICoJYml0cyBzZXQgdG8gb25lCisgKiBAaXJxX3ZhbGlkX21hc2s6IElmIG5vdCAlTlVMTCBob2xkcyBiaXRtYXNrIG9mIEdQSU9zIHdoaWNoIGFyZSB2YWxpZCB0bworICoJYmUgaW5jbHVkZWQgaW4gSVJRIGRvbWFpbiBvZiB0aGUgY2hpcAogICogQGxvY2tfa2V5OiBwZXIgR1BJTyBJUlEgY2hpcCBsb2NrZGVwIGNsYXNzCiAgKgogICogQSBncGlvX2NoaXAgY2FuIGhlbHAgcGxhdGZvcm1zIGFic3RyYWN0IHZhcmlvdXMgc291cmNlcyBvZiBHUElPcyBzbwpAQCAtMTkwLDYgKzE5NCw4IEBACiAJaXJxX2Zsb3dfaGFuZGxlcl90CWlycV9oYW5kbGVyOwogCXVuc2lnbmVkIGludAkJaXJxX2RlZmF1bHRfdHlwZTsKIAlpbnQJCQlpcnFfcGFyZW50OworCWJvb2wJCQlpcnFfbmVlZF92YWxpZF9tYXNrOworCXVuc2lnbmVkIGxvbmcJCSppcnFfdmFsaWRfbWFzazsKIAlzdHJ1Y3QgbG9ja19jbGFzc19rZXkJKmxvY2tfa2V5OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlkLXNlbnNvci1odWIuaCBiL2luY2x1ZGUvbGludXgvaGlkLXNlbnNvci1odWIuaAppbmRleCBjMDJiNWNlLi5kZDg1ZjM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hpZC1zZW5zb3ItaHViLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWh1Yi5oCkBAIC0yMzYsNiArMjM2LDcgQEAKIAlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfYXR0cmlidXRlX2luZm8gcmVwb3J0X3N0YXRlOwogCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9hdHRyaWJ1dGVfaW5mbyBwb3dlcl9zdGF0ZTsKIAlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfYXR0cmlidXRlX2luZm8gc2Vuc2l0aXZpdHk7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiB9OwogCiAvKiBDb252ZXJ0IGZyb20gaGlkIHVuaXQgZXhwbyB0byByZWd1bGFyIGV4cG9uZW50ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hpZC5oIGIvaW5jbHVkZS9saW51eC9oaWQuaAppbmRleCA3NWI2NmVjLi5iMmVjODI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hpZC5oCisrKyBiL2luY2x1ZGUvbGludXgvaGlkLmgKQEAgLTgzNyw3ICs4MzcsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgaGlkX2RldmljZV9pb19zdGFydChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKSB7CiAJaWYgKGhpZC0+aW9fc3RhcnRlZCkgewotCQlkZXZfd2FybigmaGlkLT5kZXYsICJpbyBhbHJlYWR5IHN0YXJ0ZWQiKTsKKwkJZGV2X3dhcm4oJmhpZC0+ZGV2LCAiaW8gYWxyZWFkeSBzdGFydGVkXG4iKTsKIAkJcmV0dXJuOwogCX0KIAloaWQtPmlvX3N0YXJ0ZWQgPSB0cnVlOwpAQCAtODU3LDcgKzg1Nyw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBoaWRfZGV2aWNlX2lvX3N0b3Aoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkgewogCWlmICghaGlkLT5pb19zdGFydGVkKSB7Ci0JCWRldl93YXJuKCZoaWQtPmRldiwgImlvIGFscmVhZHkgc3RvcHBlZCIpOworCQlkZXZfd2FybigmaGlkLT5kZXYsICJpbyBhbHJlYWR5IHN0b3BwZWRcbiIpOwogCQlyZXR1cm47CiAJfQogCWhpZC0+aW9fc3RhcnRlZCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9od21vbi5oIGIvaW5jbHVkZS9saW51eC9od21vbi5oCmluZGV4IDA5MzU0ZjYuLjlkMmY4YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHdtb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L2h3bW9uLmgKQEAgLTE0LDkgKzE0LDM0MSBAQAogI2lmbmRlZiBfSFdNT05fSF8KICNkZWZpbmUgX0hXTU9OX0hfCiAKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKwogc3RydWN0IGRldmljZTsKIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXA7CiAKK2VudW0gaHdtb25fc2Vuc29yX3R5cGVzIHsKKwlod21vbl9jaGlwLAorCWh3bW9uX3RlbXAsCisJaHdtb25faW4sCisJaHdtb25fY3VyciwKKwlod21vbl9wb3dlciwKKwlod21vbl9lbmVyZ3ksCisJaHdtb25faHVtaWRpdHksCisJaHdtb25fZmFuLAorCWh3bW9uX3B3bSwKK307CisKK2VudW0gaHdtb25fY2hpcF9hdHRyaWJ1dGVzIHsKKwlod21vbl9jaGlwX3RlbXBfcmVzZXRfaGlzdG9yeSwKKwlod21vbl9jaGlwX2luX3Jlc2V0X2hpc3RvcnksCisJaHdtb25fY2hpcF9jdXJyX3Jlc2V0X2hpc3RvcnksCisJaHdtb25fY2hpcF9wb3dlcl9yZXNldF9oaXN0b3J5LAorCWh3bW9uX2NoaXBfcmVnaXN0ZXJfdHosCisJaHdtb25fY2hpcF91cGRhdGVfaW50ZXJ2YWwsCisJaHdtb25fY2hpcF9hbGFybXMsCit9OworCisjZGVmaW5lIEhXTU9OX0NfVEVNUF9SRVNFVF9ISVNUT1JZCUJJVChod21vbl9jaGlwX3RlbXBfcmVzZXRfaGlzdG9yeSkKKyNkZWZpbmUgSFdNT05fQ19JTl9SRVNFVF9ISVNUT1JZCUJJVChod21vbl9jaGlwX2luX3Jlc2V0X2hpc3RvcnkpCisjZGVmaW5lIEhXTU9OX0NfQ1VSUl9SRVNFVF9ISVNUT1JZCUJJVChod21vbl9jaGlwX2N1cnJfcmVzZXRfaGlzdG9yeSkKKyNkZWZpbmUgSFdNT05fQ19QT1dFUl9SRVNFVF9ISVNUT1JZCUJJVChod21vbl9jaGlwX3Bvd2VyX3Jlc2V0X2hpc3RvcnkpCisjZGVmaW5lIEhXTU9OX0NfUkVHSVNURVJfVFoJCUJJVChod21vbl9jaGlwX3JlZ2lzdGVyX3R6KQorI2RlZmluZSBIV01PTl9DX1VQREFURV9JTlRFUlZBTAkJQklUKGh3bW9uX2NoaXBfdXBkYXRlX2ludGVydmFsKQorI2RlZmluZSBIV01PTl9DX0FMQVJNUwkJCUJJVChod21vbl9jaGlwX2FsYXJtcykKKworZW51bSBod21vbl90ZW1wX2F0dHJpYnV0ZXMgeworCWh3bW9uX3RlbXBfaW5wdXQgPSAwLAorCWh3bW9uX3RlbXBfdHlwZSwKKwlod21vbl90ZW1wX2xjcml0LAorCWh3bW9uX3RlbXBfbGNyaXRfaHlzdCwKKwlod21vbl90ZW1wX21pbiwKKwlod21vbl90ZW1wX21pbl9oeXN0LAorCWh3bW9uX3RlbXBfbWF4LAorCWh3bW9uX3RlbXBfbWF4X2h5c3QsCisJaHdtb25fdGVtcF9jcml0LAorCWh3bW9uX3RlbXBfY3JpdF9oeXN0LAorCWh3bW9uX3RlbXBfZW1lcmdlbmN5LAorCWh3bW9uX3RlbXBfZW1lcmdlbmN5X2h5c3QsCisJaHdtb25fdGVtcF9hbGFybSwKKwlod21vbl90ZW1wX2xjcml0X2FsYXJtLAorCWh3bW9uX3RlbXBfbWluX2FsYXJtLAorCWh3bW9uX3RlbXBfbWF4X2FsYXJtLAorCWh3bW9uX3RlbXBfY3JpdF9hbGFybSwKKwlod21vbl90ZW1wX2VtZXJnZW5jeV9hbGFybSwKKwlod21vbl90ZW1wX2ZhdWx0LAorCWh3bW9uX3RlbXBfb2Zmc2V0LAorCWh3bW9uX3RlbXBfbGFiZWwsCisJaHdtb25fdGVtcF9sb3dlc3QsCisJaHdtb25fdGVtcF9oaWdoZXN0LAorCWh3bW9uX3RlbXBfcmVzZXRfaGlzdG9yeSwKK307CisKKyNkZWZpbmUgSFdNT05fVF9JTlBVVAkJQklUKGh3bW9uX3RlbXBfaW5wdXQpCisjZGVmaW5lIEhXTU9OX1RfVFlQRQkJQklUKGh3bW9uX3RlbXBfdHlwZSkKKyNkZWZpbmUgSFdNT05fVF9MQ1JJVAkJQklUKGh3bW9uX3RlbXBfbGNyaXQpCisjZGVmaW5lIEhXTU9OX1RfTENSSVRfSFlTVAlCSVQoaHdtb25fdGVtcF9sY3JpdF9oeXN0KQorI2RlZmluZSBIV01PTl9UX01JTgkJQklUKGh3bW9uX3RlbXBfbWluKQorI2RlZmluZSBIV01PTl9UX01JTl9IWVNUCUJJVChod21vbl90ZW1wX21pbl9oeXN0KQorI2RlZmluZSBIV01PTl9UX01BWAkJQklUKGh3bW9uX3RlbXBfbWF4KQorI2RlZmluZSBIV01PTl9UX01BWF9IWVNUCUJJVChod21vbl90ZW1wX21heF9oeXN0KQorI2RlZmluZSBIV01PTl9UX0NSSVQJCUJJVChod21vbl90ZW1wX2NyaXQpCisjZGVmaW5lIEhXTU9OX1RfQ1JJVF9IWVNUCUJJVChod21vbl90ZW1wX2NyaXRfaHlzdCkKKyNkZWZpbmUgSFdNT05fVF9FTUVSR0VOQ1kJQklUKGh3bW9uX3RlbXBfZW1lcmdlbmN5KQorI2RlZmluZSBIV01PTl9UX0VNRVJHRU5DWV9IWVNUCUJJVChod21vbl90ZW1wX2VtZXJnZW5jeV9oeXN0KQorI2RlZmluZSBIV01PTl9UX01JTl9BTEFSTQlCSVQoaHdtb25fdGVtcF9taW5fYWxhcm0pCisjZGVmaW5lIEhXTU9OX1RfTUFYX0FMQVJNCUJJVChod21vbl90ZW1wX21heF9hbGFybSkKKyNkZWZpbmUgSFdNT05fVF9DUklUX0FMQVJNCUJJVChod21vbl90ZW1wX2NyaXRfYWxhcm0pCisjZGVmaW5lIEhXTU9OX1RfRU1FUkdFTkNZX0FMQVJNCUJJVChod21vbl90ZW1wX2VtZXJnZW5jeV9hbGFybSkKKyNkZWZpbmUgSFdNT05fVF9GQVVMVAkJQklUKGh3bW9uX3RlbXBfZmF1bHQpCisjZGVmaW5lIEhXTU9OX1RfT0ZGU0VUCQlCSVQoaHdtb25fdGVtcF9vZmZzZXQpCisjZGVmaW5lIEhXTU9OX1RfTEFCRUwJCUJJVChod21vbl90ZW1wX2xhYmVsKQorI2RlZmluZSBIV01PTl9UX0xPV0VTVAkJQklUKGh3bW9uX3RlbXBfbG93ZXN0KQorI2RlZmluZSBIV01PTl9UX0hJR0hFU1QJCUJJVChod21vbl90ZW1wX2hpZ2hlc3QpCisjZGVmaW5lIEhXTU9OX1RfUkVTRVRfSElTVE9SWQlCSVQoaHdtb25fdGVtcF9yZXNldF9oaXN0b3J5KQorCitlbnVtIGh3bW9uX2luX2F0dHJpYnV0ZXMgeworCWh3bW9uX2luX2lucHV0LAorCWh3bW9uX2luX21pbiwKKwlod21vbl9pbl9tYXgsCisJaHdtb25faW5fbGNyaXQsCisJaHdtb25faW5fY3JpdCwKKwlod21vbl9pbl9hdmVyYWdlLAorCWh3bW9uX2luX2xvd2VzdCwKKwlod21vbl9pbl9oaWdoZXN0LAorCWh3bW9uX2luX3Jlc2V0X2hpc3RvcnksCisJaHdtb25faW5fbGFiZWwsCisJaHdtb25faW5fYWxhcm0sCisJaHdtb25faW5fbWluX2FsYXJtLAorCWh3bW9uX2luX21heF9hbGFybSwKKwlod21vbl9pbl9sY3JpdF9hbGFybSwKKwlod21vbl9pbl9jcml0X2FsYXJtLAorfTsKKworI2RlZmluZSBIV01PTl9JX0lOUFVUCQlCSVQoaHdtb25faW5faW5wdXQpCisjZGVmaW5lIEhXTU9OX0lfTUlOCQlCSVQoaHdtb25faW5fbWluKQorI2RlZmluZSBIV01PTl9JX01BWAkJQklUKGh3bW9uX2luX21heCkKKyNkZWZpbmUgSFdNT05fSV9MQ1JJVAkJQklUKGh3bW9uX2luX2xjcml0KQorI2RlZmluZSBIV01PTl9JX0NSSVQJCUJJVChod21vbl9pbl9jcml0KQorI2RlZmluZSBIV01PTl9JX0FWRVJBR0UJCUJJVChod21vbl9pbl9hdmVyYWdlKQorI2RlZmluZSBIV01PTl9JX0xPV0VTVAkJQklUKGh3bW9uX2luX2xvd2VzdCkKKyNkZWZpbmUgSFdNT05fSV9ISUdIRVNUCQlCSVQoaHdtb25faW5faGlnaGVzdCkKKyNkZWZpbmUgSFdNT05fSV9SRVNFVF9ISVNUT1JZCUJJVChod21vbl9pbl9yZXNldF9oaXN0b3J5KQorI2RlZmluZSBIV01PTl9JX0xBQkVMCQlCSVQoaHdtb25faW5fbGFiZWwpCisjZGVmaW5lIEhXTU9OX0lfQUxBUk0JCUJJVChod21vbl9pbl9hbGFybSkKKyNkZWZpbmUgSFdNT05fSV9NSU5fQUxBUk0JQklUKGh3bW9uX2luX21pbl9hbGFybSkKKyNkZWZpbmUgSFdNT05fSV9NQVhfQUxBUk0JQklUKGh3bW9uX2luX21heF9hbGFybSkKKyNkZWZpbmUgSFdNT05fSV9MQ1JJVF9BTEFSTQlCSVQoaHdtb25faW5fbGNyaXRfYWxhcm0pCisjZGVmaW5lIEhXTU9OX0lfQ1JJVF9BTEFSTQlCSVQoaHdtb25faW5fY3JpdF9hbGFybSkKKworZW51bSBod21vbl9jdXJyX2F0dHJpYnV0ZXMgeworCWh3bW9uX2N1cnJfaW5wdXQsCisJaHdtb25fY3Vycl9taW4sCisJaHdtb25fY3Vycl9tYXgsCisJaHdtb25fY3Vycl9sY3JpdCwKKwlod21vbl9jdXJyX2NyaXQsCisJaHdtb25fY3Vycl9hdmVyYWdlLAorCWh3bW9uX2N1cnJfbG93ZXN0LAorCWh3bW9uX2N1cnJfaGlnaGVzdCwKKwlod21vbl9jdXJyX3Jlc2V0X2hpc3RvcnksCisJaHdtb25fY3Vycl9sYWJlbCwKKwlod21vbl9jdXJyX2FsYXJtLAorCWh3bW9uX2N1cnJfbWluX2FsYXJtLAorCWh3bW9uX2N1cnJfbWF4X2FsYXJtLAorCWh3bW9uX2N1cnJfbGNyaXRfYWxhcm0sCisJaHdtb25fY3Vycl9jcml0X2FsYXJtLAorfTsKKworI2RlZmluZSBIV01PTl9DX0lOUFVUCQlCSVQoaHdtb25fY3Vycl9pbnB1dCkKKyNkZWZpbmUgSFdNT05fQ19NSU4JCUJJVChod21vbl9jdXJyX21pbikKKyNkZWZpbmUgSFdNT05fQ19NQVgJCUJJVChod21vbl9jdXJyX21heCkKKyNkZWZpbmUgSFdNT05fQ19MQ1JJVAkJQklUKGh3bW9uX2N1cnJfbGNyaXQpCisjZGVmaW5lIEhXTU9OX0NfQ1JJVAkJQklUKGh3bW9uX2N1cnJfY3JpdCkKKyNkZWZpbmUgSFdNT05fQ19BVkVSQUdFCQlCSVQoaHdtb25fY3Vycl9hdmVyYWdlKQorI2RlZmluZSBIV01PTl9DX0xPV0VTVAkJQklUKGh3bW9uX2N1cnJfbG93ZXN0KQorI2RlZmluZSBIV01PTl9DX0hJR0hFU1QJCUJJVChod21vbl9jdXJyX2hpZ2hlc3QpCisjZGVmaW5lIEhXTU9OX0NfUkVTRVRfSElTVE9SWQlCSVQoaHdtb25fY3Vycl9yZXNldF9oaXN0b3J5KQorI2RlZmluZSBIV01PTl9DX0xBQkVMCQlCSVQoaHdtb25fY3Vycl9sYWJlbCkKKyNkZWZpbmUgSFdNT05fQ19BTEFSTQkJQklUKGh3bW9uX2N1cnJfYWxhcm0pCisjZGVmaW5lIEhXTU9OX0NfTUlOX0FMQVJNCUJJVChod21vbl9jdXJyX21pbl9hbGFybSkKKyNkZWZpbmUgSFdNT05fQ19NQVhfQUxBUk0JQklUKGh3bW9uX2N1cnJfbWF4X2FsYXJtKQorI2RlZmluZSBIV01PTl9DX0xDUklUX0FMQVJNCUJJVChod21vbl9jdXJyX2xjcml0X2FsYXJtKQorI2RlZmluZSBIV01PTl9DX0NSSVRfQUxBUk0JQklUKGh3bW9uX2N1cnJfY3JpdF9hbGFybSkKKworZW51bSBod21vbl9wb3dlcl9hdHRyaWJ1dGVzIHsKKwlod21vbl9wb3dlcl9hdmVyYWdlLAorCWh3bW9uX3Bvd2VyX2F2ZXJhZ2VfaW50ZXJ2YWwsCisJaHdtb25fcG93ZXJfYXZlcmFnZV9pbnRlcnZhbF9tYXgsCisJaHdtb25fcG93ZXJfYXZlcmFnZV9pbnRlcnZhbF9taW4sCisJaHdtb25fcG93ZXJfYXZlcmFnZV9oaWdoZXN0LAorCWh3bW9uX3Bvd2VyX2F2ZXJhZ2VfbG93ZXN0LAorCWh3bW9uX3Bvd2VyX2F2ZXJhZ2VfbWF4LAorCWh3bW9uX3Bvd2VyX2F2ZXJhZ2VfbWluLAorCWh3bW9uX3Bvd2VyX2lucHV0LAorCWh3bW9uX3Bvd2VyX2lucHV0X2hpZ2hlc3QsCisJaHdtb25fcG93ZXJfaW5wdXRfbG93ZXN0LAorCWh3bW9uX3Bvd2VyX3Jlc2V0X2hpc3RvcnksCisJaHdtb25fcG93ZXJfYWNjdXJhY3ksCisJaHdtb25fcG93ZXJfY2FwLAorCWh3bW9uX3Bvd2VyX2NhcF9oeXN0LAorCWh3bW9uX3Bvd2VyX2NhcF9tYXgsCisJaHdtb25fcG93ZXJfY2FwX21pbiwKKwlod21vbl9wb3dlcl9tYXgsCisJaHdtb25fcG93ZXJfY3JpdCwKKwlod21vbl9wb3dlcl9sYWJlbCwKKwlod21vbl9wb3dlcl9hbGFybSwKKwlod21vbl9wb3dlcl9jYXBfYWxhcm0sCisJaHdtb25fcG93ZXJfbWF4X2FsYXJtLAorCWh3bW9uX3Bvd2VyX2NyaXRfYWxhcm0sCit9OworCisjZGVmaW5lIEhXTU9OX1BfQVZFUkFHRQkJCUJJVChod21vbl9wb3dlcl9hdmVyYWdlKQorI2RlZmluZSBIV01PTl9QX0FWRVJBR0VfSU5URVJWQUwJQklUKGh3bW9uX3Bvd2VyX2F2ZXJhZ2VfaW50ZXJ2YWwpCisjZGVmaW5lIEhXTU9OX1BfQVZFUkFHRV9JTlRFUlZBTF9NQVgJQklUKGh3bW9uX3Bvd2VyX2F2ZXJhZ2VfaW50ZXJ2YWxfbWF4KQorI2RlZmluZSBIV01PTl9QX0FWRVJBR0VfSU5URVJWQUxfTUlOCUJJVChod21vbl9wb3dlcl9hdmVyYWdlX2ludGVydmFsX21pbikKKyNkZWZpbmUgSFdNT05fUF9BVkVSQUdFX0hJR0hFU1QJCUJJVChod21vbl9wb3dlcl9hdmVyYWdlX2hpZ2hlc3QpCisjZGVmaW5lIEhXTU9OX1BfQVZFUkFHRV9MT1dFU1QJCUJJVChod21vbl9wb3dlcl9hdmVyYWdlX2xvd2VzdCkKKyNkZWZpbmUgSFdNT05fUF9BVkVSQUdFX01BWAkJQklUKGh3bW9uX3Bvd2VyX2F2ZXJhZ2VfbWF4KQorI2RlZmluZSBIV01PTl9QX0FWRVJBR0VfTUlOCQlCSVQoaHdtb25fcG93ZXJfYXZlcmFnZV9taW4pCisjZGVmaW5lIEhXTU9OX1BfSU5QVVQJCQlCSVQoaHdtb25fcG93ZXJfaW5wdXQpCisjZGVmaW5lIEhXTU9OX1BfSU5QVVRfSElHSEVTVAkJQklUKGh3bW9uX3Bvd2VyX2lucHV0X2hpZ2hlc3QpCisjZGVmaW5lIEhXTU9OX1BfSU5QVVRfTE9XRVNUCQlCSVQoaHdtb25fcG93ZXJfaW5wdXRfbG93ZXN0KQorI2RlZmluZSBIV01PTl9QX1JFU0VUX0hJU1RPUlkJCUJJVChod21vbl9wb3dlcl9yZXNldF9oaXN0b3J5KQorI2RlZmluZSBIV01PTl9QX0FDQ1VSQUNZCQlCSVQoaHdtb25fcG93ZXJfYWNjdXJhY3kpCisjZGVmaW5lIEhXTU9OX1BfQ0FQCQkJQklUKGh3bW9uX3Bvd2VyX2NhcCkKKyNkZWZpbmUgSFdNT05fUF9DQVBfSFlTVAkJQklUKGh3bW9uX3Bvd2VyX2NhcF9oeXN0KQorI2RlZmluZSBIV01PTl9QX0NBUF9NQVgJCQlCSVQoaHdtb25fcG93ZXJfY2FwX21heCkKKyNkZWZpbmUgSFdNT05fUF9DQVBfTUlOCQkJQklUKGh3bW9uX3Bvd2VyX2NhcF9taW4pCisjZGVmaW5lIEhXTU9OX1BfTUFYCQkJQklUKGh3bW9uX3Bvd2VyX21heCkKKyNkZWZpbmUgSFdNT05fUF9DUklUCQkJQklUKGh3bW9uX3Bvd2VyX2NyaXQpCisjZGVmaW5lIEhXTU9OX1BfTEFCRUwJCQlCSVQoaHdtb25fcG93ZXJfbGFiZWwpCisjZGVmaW5lIEhXTU9OX1BfQUxBUk0JCQlCSVQoaHdtb25fcG93ZXJfYWxhcm0pCisjZGVmaW5lIEhXTU9OX1BfQ0FQX0FMQVJNCQlCSVQoaHdtb25fcG93ZXJfY2FwX2FsYXJtKQorI2RlZmluZSBIV01PTl9QX01BWF9BTEFSTQkJQklUKGh3bW9uX3Bvd2VyX21heF9hbGFybSkKKyNkZWZpbmUgSFdNT05fUF9DUklUX0FMQVJNCQlCSVQoaHdtb25fcG93ZXJfY3JpdF9hbGFybSkKKworZW51bSBod21vbl9lbmVyZ3lfYXR0cmlidXRlcyB7CisJaHdtb25fZW5lcmd5X2lucHV0LAorCWh3bW9uX2VuZXJneV9sYWJlbCwKK307CisKKyNkZWZpbmUgSFdNT05fRV9JTlBVVAkJCUJJVChod21vbl9lbmVyZ3lfaW5wdXQpCisjZGVmaW5lIEhXTU9OX0VfTEFCRUwJCQlCSVQoaHdtb25fZW5lcmd5X2xhYmVsKQorCitlbnVtIGh3bW9uX2h1bWlkaXR5X2F0dHJpYnV0ZXMgeworCWh3bW9uX2h1bWlkaXR5X2lucHV0LAorCWh3bW9uX2h1bWlkaXR5X2xhYmVsLAorCWh3bW9uX2h1bWlkaXR5X21pbiwKKwlod21vbl9odW1pZGl0eV9taW5faHlzdCwKKwlod21vbl9odW1pZGl0eV9tYXgsCisJaHdtb25faHVtaWRpdHlfbWF4X2h5c3QsCisJaHdtb25faHVtaWRpdHlfYWxhcm0sCisJaHdtb25faHVtaWRpdHlfZmF1bHQsCit9OworCisjZGVmaW5lIEhXTU9OX0hfSU5QVVQJCQlCSVQoaHdtb25faHVtaWRpdHlfaW5wdXQpCisjZGVmaW5lIEhXTU9OX0hfTEFCRUwJCQlCSVQoaHdtb25faHVtaWRpdHlfbGFiZWwpCisjZGVmaW5lIEhXTU9OX0hfTUlOCQkJQklUKGh3bW9uX2h1bWlkaXR5X21pbikKKyNkZWZpbmUgSFdNT05fSF9NSU5fSFlTVAkJQklUKGh3bW9uX2h1bWlkaXR5X21pbl9oeXN0KQorI2RlZmluZSBIV01PTl9IX01BWAkJCUJJVChod21vbl9odW1pZGl0eV9tYXgpCisjZGVmaW5lIEhXTU9OX0hfTUFYX0hZU1QJCUJJVChod21vbl9odW1pZGl0eV9tYXhfaHlzdCkKKyNkZWZpbmUgSFdNT05fSF9BTEFSTQkJCUJJVChod21vbl9odW1pZGl0eV9hbGFybSkKKyNkZWZpbmUgSFdNT05fSF9GQVVMVAkJCUJJVChod21vbl9odW1pZGl0eV9mYXVsdCkKKworZW51bSBod21vbl9mYW5fYXR0cmlidXRlcyB7CisJaHdtb25fZmFuX2lucHV0LAorCWh3bW9uX2Zhbl9sYWJlbCwKKwlod21vbl9mYW5fbWluLAorCWh3bW9uX2Zhbl9tYXgsCisJaHdtb25fZmFuX2RpdiwKKwlod21vbl9mYW5fcHVsc2VzLAorCWh3bW9uX2Zhbl90YXJnZXQsCisJaHdtb25fZmFuX2FsYXJtLAorCWh3bW9uX2Zhbl9taW5fYWxhcm0sCisJaHdtb25fZmFuX21heF9hbGFybSwKKwlod21vbl9mYW5fZmF1bHQsCit9OworCisjZGVmaW5lIEhXTU9OX0ZfSU5QVVQJCQlCSVQoaHdtb25fZmFuX2lucHV0KQorI2RlZmluZSBIV01PTl9GX0xBQkVMCQkJQklUKGh3bW9uX2Zhbl9sYWJlbCkKKyNkZWZpbmUgSFdNT05fRl9NSU4JCQlCSVQoaHdtb25fZmFuX21pbikKKyNkZWZpbmUgSFdNT05fRl9NQVgJCQlCSVQoaHdtb25fZmFuX21heCkKKyNkZWZpbmUgSFdNT05fRl9ESVYJCQlCSVQoaHdtb25fZmFuX2RpdikKKyNkZWZpbmUgSFdNT05fRl9QVUxTRVMJCQlCSVQoaHdtb25fZmFuX3B1bHNlcykKKyNkZWZpbmUgSFdNT05fRl9UQVJHRVQJCQlCSVQoaHdtb25fZmFuX3RhcmdldCkKKyNkZWZpbmUgSFdNT05fRl9BTEFSTQkJCUJJVChod21vbl9mYW5fYWxhcm0pCisjZGVmaW5lIEhXTU9OX0ZfTUlOX0FMQVJNCQlCSVQoaHdtb25fZmFuX21pbl9hbGFybSkKKyNkZWZpbmUgSFdNT05fRl9NQVhfQUxBUk0JCUJJVChod21vbl9mYW5fbWF4X2FsYXJtKQorI2RlZmluZSBIV01PTl9GX0ZBVUxUCQkJQklUKGh3bW9uX2Zhbl9mYXVsdCkKKworZW51bSBod21vbl9wd21fYXR0cmlidXRlcyB7CisJaHdtb25fcHdtX2lucHV0LAorCWh3bW9uX3B3bV9lbmFibGUsCisJaHdtb25fcHdtX21vZGUsCisJaHdtb25fcHdtX2ZyZXEsCit9OworCisjZGVmaW5lIEhXTU9OX1BXTV9JTlBVVAkJCUJJVChod21vbl9wd21faW5wdXQpCisjZGVmaW5lIEhXTU9OX1BXTV9FTkFCTEUJCUJJVChod21vbl9wd21fZW5hYmxlKQorI2RlZmluZSBIV01PTl9QV01fTU9ERQkJCUJJVChod21vbl9wd21fbW9kZSkKKyNkZWZpbmUgSFdNT05fUFdNX0ZSRVEJCQlCSVQoaHdtb25fcHdtX2ZyZXEpCisKKy8qKgorICogc3RydWN0IGh3bW9uX29wcyAtIGh3bW9uIGRldmljZSBvcGVyYXRpb25zCisgKiBAaXNfdmlzaWJsZTogQ2FsbGJhY2sgdG8gcmV0dXJuIGF0dHJpYnV0ZSB2aXNpYmlsaXR5LiBNYW5kYXRvcnkuCisgKgkJUGFyYW1ldGVycyBhcmU6CisgKgkJQGNvbnN0IHZvaWQgKmRydmRhdGE6CisgKgkJCVBvaW50ZXIgdG8gZHJpdmVyLXByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgcGFzc2VkCisgKgkJCWFzIGFyZ3VtZW50IHRvIGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oKS4KKyAqCQlAdHlwZToJU2Vuc29yIHR5cGUKKyAqCQlAYXR0cjoJU2Vuc29yIGF0dHJpYnV0ZQorICoJCUBjaGFubmVsOgorICoJCQlDaGFubmVsIG51bWJlcgorICoJCVRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaWxlIHBlcm1pc3Npb25zLgorICoJCUlmIHRoZSByZXR1cm4gdmFsdWUgaXMgMCwgbm8gYXR0cmlidXRlIHdpbGwgYmUgY3JlYXRlZC4KKyAqIEByZWFkOiAgICAgICBSZWFkIGNhbGxiYWNrLiBPcHRpb25hbC4gSWYgbm90IHByb3ZpZGVkLCBhdHRyaWJ1dGVzCisgKgkJd2lsbCBub3QgYmUgcmVhZGFibGUuCisgKgkJUGFyYW1ldGVycyBhcmU6CisgKgkJQGRldjoJUG9pbnRlciB0byBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZQorICoJCUB0eXBlOglTZW5zb3IgdHlwZQorICoJCUBhdHRyOglTZW5zb3IgYXR0cmlidXRlCisgKgkJQGNoYW5uZWw6CisgKgkJCUNoYW5uZWwgbnVtYmVyCisgKgkJQHZhbDoJUG9pbnRlciB0byByZXR1cm5lZCB2YWx1ZQorICoJCVRoZSBmdW5jdGlvbiByZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKyAqIEB3cml0ZToJV3JpdGUgY2FsbGJhY2suIE9wdGlvbmFsLiBJZiBub3QgcHJvdmlkZWQsIGF0dHJpYnV0ZXMKKyAqCQl3aWxsIG5vdCBiZSB3cml0YWJsZS4KKyAqCQlQYXJhbWV0ZXJzIGFyZToKKyAqCQlAZGV2OglQb2ludGVyIHRvIGhhcmR3YXJlIG1vbml0b3JpbmcgZGV2aWNlCisgKgkJQHR5cGU6CVNlbnNvciB0eXBlCisgKgkJQGF0dHI6CVNlbnNvciBhdHRyaWJ1dGUKKyAqCQlAY2hhbm5lbDoKKyAqCQkJQ2hhbm5lbCBudW1iZXIKKyAqCQlAdmFsOglWYWx1ZSB0byB3cml0ZQorICoJCVRoZSBmdW5jdGlvbiByZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKyAqLworc3RydWN0IGh3bW9uX29wcyB7CisJdW1vZGVfdCAoKmlzX3Zpc2libGUpKGNvbnN0IHZvaWQgKmRydmRhdGEsIGVudW0gaHdtb25fc2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgICAgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwpOworCWludCAoKnJlYWQpKHN0cnVjdCBkZXZpY2UgKmRldiwgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwKKwkJICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyAqdmFsKTsKKwlpbnQgKCp3cml0ZSkoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlLAorCQkgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCwgbG9uZyB2YWwpOworfTsKKworLyoqCisgKiBDaGFubmVsIGluZm9ybWF0aW9uCisgKiBAdHlwZToJQ2hhbm5lbCB0eXBlLgorICogQGNvbmZpZzoJUG9pbnRlciB0byBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBjaGFubmVsIHBhcmFtZXRlcnMuCisgKgkJVXNlIGZvciBwZXItY2hhbm5lbCBhdHRyaWJ1dGVzLgorICovCitzdHJ1Y3QgaHdtb25fY2hhbm5lbF9pbmZvIHsKKwllbnVtIGh3bW9uX3NlbnNvcl90eXBlcyB0eXBlOworCWNvbnN0IHUzMiAqY29uZmlnOworfTsKKworLyoqCisgKiBDaGlwIGNvbmZpZ3VyYXRpb24KKyAqIEBvcHM6CVBvaW50ZXIgdG8gaHdtb24gb3BlcmF0aW9ucy4KKyAqIEBpbmZvOglOdWxsLXRlcm1pbmF0ZWQgbGlzdCBvZiBjaGFubmVsIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIHsKKwljb25zdCBzdHJ1Y3QgaHdtb25fb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAqKmluZm87Cit9OworCiBzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KTsKIHN0cnVjdCBkZXZpY2UgKgogaHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfZ3JvdXBzKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSwKQEAgLTI2LDYgKzM1OCwxNiBAQAogZGV2bV9od21vbl9kZXZpY2VfcmVnaXN0ZXJfd2l0aF9ncm91cHMoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLAogCQkJCSAgICAgICB2b2lkICpkcnZkYXRhLAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzKTsKK3N0cnVjdCBkZXZpY2UgKgoraHdtb25fZGV2aWNlX3JlZ2lzdGVyX3dpdGhfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZHJ2ZGF0YSwKKwkJCQljb25zdCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpOworc3RydWN0IGRldmljZSAqCitkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZHJ2ZGF0YSwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBod21vbl9jaGlwX2luZm8gKmluZm8sCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzKTsKIAogdm9pZCBod21vbl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogdm9pZCBkZXZtX2h3bW9uX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h5cGVydi5oIGIvaW5jbHVkZS9saW51eC9oeXBlcnYuaAppbmRleCBiMTA5NTRhLi42ODI0NTU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h5cGVydi5oCisrKyBiL2luY2x1ZGUvbGludXgvaHlwZXJ2LmgKQEAgLTY3NCw2ICs2NzQsMTEgQEAKIAlIVl9TSUdOQUxfUE9MSUNZX0VYUExJQ0lULAogfTsKIAorZW51bSBodl9udW1hX3BvbGljeSB7CisJSFZfQkFMQU5DRUQgPSAwLAorCUhWX0xPQ0FMSVpFRCwKK307CisKIGVudW0gdm1idXNfZGV2aWNlX3R5cGUgewogCUhWX0lERSA9IDAsCiAJSFZfU0NTSSwKQEAgLTcwMSw5ICs3MDYsNiBAQAogfTsKIAogc3RydWN0IHZtYnVzX2NoYW5uZWwgewotCS8qIFVuaXF1ZSBjaGFubmVsIGlkICovCi0JaW50IGlkOwotCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0ZW50cnk7CiAKIAlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqOwpAQCAtODUwLDYgKzg1Miw0MyBAQAogCSAqIHJpbmcgbG9jayB0byBwcmVzZXJ2ZSB0aGUgY3VycmVudCBiZWhhdmlvci4KIAkgKi8KIAlib29sIGFjcXVpcmVfcmluZ19sb2NrOworCS8qCisJICogRm9yIHBlcmZvcm1hbmNlIGNyaXRpY2FsIGNoYW5uZWxzIChzdG9yYWdlLCBuZXR3b3JraW5nCisJICogZXRjLCksIEh5cGVyLVYgaGFzIGEgbWVjaGFuaXNtIHRvIGVuaGFuY2UgdGhlIHRocm91Z2hwdXQKKwkgKiBhdCB0aGUgZXhwZW5zZSBvZiBsYXRlbmN5OgorCSAqIFdoZW4gdGhlIGhvc3QgaXMgdG8gYmUgc2lnbmFsZWQsIHdlIGp1c3Qgc2V0IGEgYml0IGluIGEgc2hhcmVkIHBhZ2UKKwkgKiBhbmQgdGhpcyBiaXQgd2lsbCBiZSBpbnNwZWN0ZWQgYnkgdGhlIGh5cGVydmlzb3Igd2l0aGluIGEgY2VydGFpbgorCSAqIHdpbmRvdyBhbmQgaWYgdGhlIGJpdCBpcyBzZXQsIHRoZSBob3N0IHdpbGwgYmUgc2lnbmFsZWQuIFRoZSB3aW5kb3cKKwkgKiBvZiB0aW1lIGlzIHRoZSBtb25pdG9yIGxhdGVuY3kgLSBjdXJyZW50bHkgYXJvdW5kIDEwMCB1c2Vjcy4gVGhpcworCSAqIG1lY2hhbmlzbSBpbXByb3ZlcyB0aHJvdWdocHV0IGJ5OgorCSAqCisJICogQSkgTWFraW5nIHRoZSBob3N0IG1vcmUgZWZmaWNpZW50IC0gZWFjaCB0aW1lIGl0IHdha2VzIHVwLAorCSAqICAgIHBvdGVudGlhbGx5IGl0IHdpbGwgcHJvY2VzcyBtb3JldiBudW1iZXIgb2YgcGFja2V0cy4gVGhlCisJICogICAgbW9uaXRvciBsYXRlbmN5IGFsbG93cyBhIGJhdGNoIHRvIGJ1aWxkIHVwLgorCSAqIEIpIEJ5IGRlZmVycmluZyB0aGUgaHlwZXJjYWxsIHRvIHNpZ25hbCwgd2Ugd2lsbCBhbHNvIG1pbmltaXplCisJICogICAgdGhlIGludGVycnVwdHMuCisJICoKKwkgKiBDbGVhcmx5LCB0aGVzZSBvcHRpbWl6YXRpb25zIGltcHJvdmUgdGhyb3VnaHB1dCBhdCB0aGUgZXhwZW5zZSBvZgorCSAqIGxhdGVuY3kuIEZ1cnRoZXJtb3JlLCBzaW5jZSB0aGUgY2hhbm5lbCBpcyBzaGFyZWQgZm9yIGJvdGgKKwkgKiBjb250cm9sIGFuZCBkYXRhIG1lc3NhZ2VzLCBjb250cm9sIG1lc3NhZ2VzIGN1cnJlbnRseSBzdWZmZXIKKwkgKiB1bm5lY2Vzc2FyeSBsYXRlbmN5IGFkdmVyc2xleSBpbXBhY3RpbmcgcGVyZm9ybWFuY2UgYW5kIGJvb3QKKwkgKiB0aW1lLiBUbyBmaXggdGhpcyBpc3N1ZSwgcGVybWl0IHRhZ2dpbmcgdGhlIGNoYW5uZWwgYXMgYmVpbmcKKwkgKiBpbiAibG93IGxhdGVuY3kiIG1vZGUuIEluIHRoaXMgbW9kZSwgd2Ugd2lsbCBieXBhc3MgdGhlIG1vbml0b3IKKwkgKiBtZWNoYW5pc20uCisJICovCisJYm9vbCBsb3dfbGF0ZW5jeTsKKworCS8qCisJICogTlVNQSBkaXN0cmlidXRpb24gcG9saWN5OgorCSAqIFdlIHN1cHBvcnQgdGVvIHBvbGljaWVzOgorCSAqIDEpIEJhbGFuY2VkOiBIZXJlIGFsbCBwZXJmb3JtYW5jZSBjcml0aWNhbCBjaGFubmVscyBhcmUKKwkgKiAgICBkaXN0cmlidXRlZCBldmVubHkgYW1vbmdzdCBhbGwgdGhlIE5VTUEgbm9kZXMuCisJICogICAgVGhpcyBwb2xpY3kgd2lsbCBiZSB0aGUgZGVmYXVsdCBwb2xpY3kuCisJICogMikgTG9jYWxpemVkOiBBbGwgY2hhbm5lbHMgb2YgYSBnaXZlbiBpbnN0YW5jZSBvZiBhCisJICogICAgcGVyZm9ybWFuY2UgY3JpdGljYWwgc2VydmljZSB3aWxsIGJlIGFzc2lnbmVkIENQVXMKKwkgKiAgICB3aXRoaW4gYSBzZWxlY3RlZCBOVU1BIG5vZGUuCisJICovCisJZW51bSBodl9udW1hX3BvbGljeSBhZmZpbml0eV9wb2xpY3k7CiAKIH07CiAKQEAgLTg3MCw2ICs5MDksMTIgQEAKIAljLT5zaWduYWxfcG9saWN5ID0gcG9saWN5OwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NoYW5uZWxfYWZmaW5pdHlfc3RhdGUoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmMsCisJCQkJCSAgICAgIGVudW0gaHZfbnVtYV9wb2xpY3kgcG9saWN5KQoreworCWMtPmFmZmluaXR5X3BvbGljeSA9IHBvbGljeTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHNldF9jaGFubmVsX3JlYWRfc3RhdGUoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmMsIGJvb2wgc3RhdGUpCiB7CiAJYy0+YmF0Y2hlZF9yZWFkaW5nID0gc3RhdGU7CkBAIC04OTEsNiArOTM2LDE2IEBACiAJYy0+b3V0Ym91bmQucmluZ19idWZmZXItPnBlbmRpbmdfc2VuZF9zeiA9IHNpemU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbG93X2xhdGVuY3lfbW9kZShzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqYykKK3sKKwljLT5sb3dfbGF0ZW5jeSA9IHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9sb3dfbGF0ZW5jeV9tb2RlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjKQoreworCWMtPmxvd19sYXRlbmN5ID0gZmFsc2U7Cit9CisKIHZvaWQgdm1idXNfb25tZXNzYWdlKHZvaWQgKmNvbnRleHQpOwogCiBpbnQgdm1idXNfcmVxdWVzdF9vZmZlcnModm9pZCk7CkBAIC0xMTE0LDYgKzExNjksMTMgQEAKIAkJCQkJIGNvbnN0IGNoYXIgKm1vZF9uYW1lKTsKIHZvaWQgdm1idXNfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RyaXZlciAqaHZfZHJpdmVyKTsKIAorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICp2bWJ1c19kZXZfbmFtZShjb25zdCBzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqKQoreworCWNvbnN0IHN0cnVjdCBrb2JqZWN0ICprb2JqID0gJmRldmljZV9vYmotPmRldmljZS5rb2JqOworCisJcmV0dXJuIGtvYmotPm5hbWU7Cit9CisKIHZvaWQgdm1idXNfaHZzb2NrX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKTsKIAogaW50IHZtYnVzX2FsbG9jYXRlX21taW8oc3RydWN0IHJlc291cmNlICoqbmV3LCBzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqLApAQCAtMTI1Nyw2ICsxMzE5LDI3IEBACiAJCQkweDgwLCAweDJlLCAweDI3LCAweGVkLCAweGUxLCAweDlmKQogCiAvKgorICogTGludXggZG9lc24ndCBzdXBwb3J0IHRoZSAzIGRldmljZXM6IHRoZSBmaXJzdCB0d28gYXJlIGZvcgorICogQXV0b21hdGljIFZpcnR1YWwgTWFjaGluZSBBY3RpdmF0aW9uLCBhbmQgdGhlIHRoaXJkIGlzIGZvcgorICogUmVtb3RlIERlc2t0b3AgVmlydHVhbGl6YXRpb24uCisgKiB7ZjhlNjU3MTYtM2NiMy00YTA2LTlhNjAtMTg4OWM1Y2NjYWI1fQorICogezMzNzViYWY0LTllMTUtNGIzMC1iNzY1LTY3YWNiMTBkNjA3Yn0KKyAqIHsyNzZhYWNmNC1hYzE1LTQyNmMtOThkZC03NTIxYWQzZjAxZmV9CisgKi8KKworI2RlZmluZSBIVl9BVk1BMV9HVUlEIFwKKwkuZ3VpZCA9IFVVSURfTEUoMHhmOGU2NTcxNiwgMHgzY2IzLCAweDRhMDYsIDB4OWEsIDB4NjAsIFwKKwkJCTB4MTgsIDB4ODksIDB4YzUsIDB4Y2MsIDB4Y2EsIDB4YjUpCisKKyNkZWZpbmUgSFZfQVZNQTJfR1VJRCBcCisJLmd1aWQgPSBVVUlEX0xFKDB4MzM3NWJhZjQsIDB4OWUxNSwgMHg0YjMwLCAweGI3LCAweDY1LCBcCisJCQkweDY3LCAweGFjLCAweGIxLCAweDBkLCAweDYwLCAweDdiKQorCisjZGVmaW5lIEhWX1JEVl9HVUlEIFwKKwkuZ3VpZCA9IFVVSURfTEUoMHgyNzZhYWNmNCwgMHhhYzE1LCAweDQyNmMsIDB4OTgsIDB4ZGQsIFwKKwkJCTB4NzUsIDB4MjEsIDB4YWQsIDB4M2YsIDB4MDEsIDB4ZmUpCisKKy8qCiAgKiBDb21tb24gaGVhZGVyIGZvciBIeXBlci1WIElDcwogICovCiAKQEAgLTEzNDQsNiArMTQyNywxNSBAQAogCXU4IGZsYWdzOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IGljdGltZXN5bmNfcmVmX2RhdGEgeworCXU2NCBwYXJlbnR0aW1lOworCXU2NCB2bXJlZmVyZW5jZXRpbWU7CisJdTggZmxhZ3M7CisJY2hhciBsZWFwZmxhZ3M7CisJY2hhciBzdHJhdHVtOworCXU4IHJlc2VydmVkWzNdOworfSBfX3BhY2tlZDsKKwogc3RydWN0IGh5cGVydl9zZXJ2aWNlX2NhbGxiYWNrIHsKIAl1OCBtc2dfdHlwZTsKIAljaGFyICpsb2dfbXNnOwpAQCAtMTM1Nyw2ICsxNDQ5LDkgQEAKIAkJCQkJc3RydWN0IGljbXNnX25lZ290aWF0ZSAqLCB1OCAqLCBpbnQsCiAJCQkJCWludCk7CiAKK3ZvaWQgaHZfZXZlbnRfdGFza2xldF9kaXNhYmxlKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKTsKK3ZvaWQgaHZfZXZlbnRfdGFza2xldF9lbmFibGUoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpOworCiB2b2lkIGh2X3Byb2Nlc3NfY2hhbm5lbF9yZW1vdmFsKHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsLCB1MzIgcmVsaWQpOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oeXBlcnZpc29yLmggYi9pbmNsdWRlL2xpbnV4L2h5cGVydmlzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmE1ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9oeXBlcnZpc29yLmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBfX0xJTlVYX0hZUEVWSVNPUl9ICisjZGVmaW5lIF9fTElOVVhfSFlQRVZJU09SX0gKKworLyoKKyAqCUdlbmVyaWMgSHlwZXJ2aXNvciBzdXBwb3J0CisgKgkJSnVlcmdlbiBHcm9zcyA8amdyb3NzQHN1c2UuY29tPgorICovCisKKyNpZmRlZiBDT05GSUdfSFlQRVJWSVNPUl9HVUVTVAorI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGh5cGVydmlzb3JfcGluX3ZjcHUoaW50IGNwdSkKK3sKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19MSU5VWF9IWVBFVklTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pMmMtbXV4LmggYi9pbmNsdWRlL2xpbnV4L2kyYy1tdXguaAppbmRleCBkNGMxZDEyLi5iZDc0ZDU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy1tdXguaAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy1tdXguaApAQCAtMzIsNyArMzIsOSBAQAogc3RydWN0IGkyY19tdXhfY29yZSB7CiAJc3RydWN0IGkyY19hZGFwdGVyICpwYXJlbnQ7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCWJvb2wgbXV4X2xvY2tlZDsKKwl1bnNpZ25lZCBpbnQgbXV4X2xvY2tlZDoxOworCXVuc2lnbmVkIGludCBhcmJpdHJhdG9yOjE7CisJdW5zaWduZWQgaW50IGdhdGU6MTsKIAogCXZvaWQgKnByaXY7CiAKQEAgLTUxLDcgKzUzLDkgQEAKIAkJCQkgICBpbnQgKCpkZXNlbGVjdCkoc3RydWN0IGkyY19tdXhfY29yZSAqLCB1MzIpKTsKIAogLyogZmxhZ3MgZm9yIGkyY19tdXhfYWxsb2MgKi8KLSNkZWZpbmUgSTJDX01VWF9MT0NLRUQgQklUKDApCisjZGVmaW5lIEkyQ19NVVhfTE9DS0VEICAgICBCSVQoMCkKKyNkZWZpbmUgSTJDX01VWF9BUkJJVFJBVE9SIEJJVCgxKQorI2RlZmluZSBJMkNfTVVYX0dBVEUgICAgICAgQklUKDIpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqaTJjX211eF9wcml2KHN0cnVjdCBpMmNfbXV4X2NvcmUgKm11eGMpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy5oIGIvaW5jbHVkZS9saW51eC9pMmMuaAppbmRleCBmZmZkYzI3Li42NDIyZWVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLmgKQEAgLTQyNyw2ICs0MjcsMjAgQEAKIH07CiAKIC8qKgorICogc3RydWN0IGkyY19sb2NrX29wZXJhdGlvbnMgLSByZXByZXNlbnQgSTJDIGxvY2tpbmcgb3BlcmF0aW9ucworICogQGxvY2tfYnVzOiBHZXQgZXhjbHVzaXZlIGFjY2VzcyB0byBhbiBJMkMgYnVzIHNlZ21lbnQKKyAqIEB0cnlsb2NrX2J1czogVHJ5IHRvIGdldCBleGNsdXNpdmUgYWNjZXNzIHRvIGFuIEkyQyBidXMgc2VnbWVudAorICogQHVubG9ja19idXM6IFJlbGVhc2UgZXhjbHVzaXZlIGFjY2VzcyB0byBhbiBJMkMgYnVzIHNlZ21lbnQKKyAqCisgKiBUaGUgbWFpbiBvcGVyYXRpb25zIGFyZSB3cmFwcGVkIGJ5IGkyY19sb2NrX2J1cyBhbmQgaTJjX3VubG9ja19idXMuCisgKi8KK3N0cnVjdCBpMmNfbG9ja19vcGVyYXRpb25zIHsKKwl2b2lkICgqbG9ja19idXMpKHN0cnVjdCBpMmNfYWRhcHRlciAqLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCWludCAoKnRyeWxvY2tfYnVzKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgdW5zaWduZWQgaW50IGZsYWdzKTsKKwl2b2lkICgqdW5sb2NrX2J1cykoc3RydWN0IGkyY19hZGFwdGVyICosIHVuc2lnbmVkIGludCBmbGFncyk7Cit9OworCisvKioKICAqIHN0cnVjdCBpMmNfdGltaW5ncyAtIEkyQyB0aW1pbmcgaW5mb3JtYXRpb24KICAqIEBidXNfZnJlcV9oejogdGhlIGJ1cyBmcmVxdWVuY3kgaW4gSHoKICAqIEBzY2xfcmlzZV9uczogdGltZSBTQ0wgc2lnbmFsIHRha2VzIHRvIHJpc2UgaW4gbnM7IHQocikgaW4gdGhlIEkyQyBzcGVjaWZpY2F0aW9uCkBAIC01MzYsNiArNTUwLDcgQEAKIAl2b2lkICphbGdvX2RhdGE7CiAKIAkvKiBkYXRhIGZpZWxkcyB0aGF0IGFyZSB2YWxpZCBmb3IgYWxsIGRldmljZXMJKi8KKwljb25zdCBzdHJ1Y3QgaTJjX2xvY2tfb3BlcmF0aW9ucyAqbG9ja19vcHM7CiAJc3RydWN0IHJ0X211dGV4IGJ1c19sb2NrOwogCXN0cnVjdCBydF9tdXRleCBtdXhfbG9jazsKIApAQCAtNTUyLDEwICs1NjcsNiBAQAogCiAJc3RydWN0IGkyY19idXNfcmVjb3ZlcnlfaW5mbyAqYnVzX3JlY292ZXJ5X2luZm87CiAJY29uc3Qgc3RydWN0IGkyY19hZGFwdGVyX3F1aXJrcyAqcXVpcmtzOwotCi0Jdm9pZCAoKmxvY2tfYnVzKShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKiwgdW5zaWduZWQgaW50IGZsYWdzKTsKLQlpbnQgKCp0cnlsb2NrX2J1cykoc3RydWN0IGkyY19hZGFwdGVyICosIHVuc2lnbmVkIGludCBmbGFncyk7Ci0Jdm9pZCAoKnVubG9ja19idXMpKHN0cnVjdCBpMmNfYWRhcHRlciAqLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOwogfTsKICNkZWZpbmUgdG9faTJjX2FkYXB0ZXIoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBpMmNfYWRhcHRlciwgZGV2KQogCkBAIC01OTcsNyArNjA4LDIxIEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGkyY19sb2NrX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQlhZGFwdGVyLT5sb2NrX2J1cyhhZGFwdGVyLCBmbGFncyk7CisJYWRhcHRlci0+bG9ja19vcHMtPmxvY2tfYnVzKGFkYXB0ZXIsIGZsYWdzKTsKK30KKworLyoqCisgKiBpMmNfdHJ5bG9ja19idXMgLSBUcnkgdG8gZ2V0IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gYW4gSTJDIGJ1cyBzZWdtZW50CisgKiBAYWRhcHRlcjogVGFyZ2V0IEkyQyBidXMgc2VnbWVudAorICogQGZsYWdzOiBJMkNfTE9DS19ST09UX0FEQVBURVIgdHJpZXMgdG8gbG9ja3MgdGhlIHJvb3QgaTJjIGFkYXB0ZXIsCisgKglJMkNfTE9DS19TRUdNRU5UIHRyaWVzIHRvIGxvY2sgb25seSB0aGlzIGJyYW5jaCBpbiB0aGUgYWRhcHRlciB0cmVlCisgKgorICogUmV0dXJuOiB0cnVlIGlmIHRoZSBJMkMgYnVzIHNlZ21lbnQgaXMgbG9ja2VkLCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2kyY190cnlsb2NrX2J1cyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlyZXR1cm4gYWRhcHRlci0+bG9ja19vcHMtPnRyeWxvY2tfYnVzKGFkYXB0ZXIsIGZsYWdzKTsKIH0KIAogLyoqCkBAIC02MDksNyArNjM0LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogaTJjX3VubG9ja19idXMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0JYWRhcHRlci0+dW5sb2NrX2J1cyhhZGFwdGVyLCBmbGFncyk7CisJYWRhcHRlci0+bG9ja19vcHMtPnVubG9ja19idXMoYWRhcHRlciwgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTY3Myw2ICs2OTgsNyBAQAogCiBleHRlcm4gc3RydWN0IGkyY19hZGFwdGVyICppMmNfZ2V0X2FkYXB0ZXIoaW50IG5yKTsKIGV4dGVybiB2b2lkIGkyY19wdXRfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApOworZXh0ZXJuIHVuc2lnbmVkIGludCBpMmNfYWRhcHRlcl9kZXB0aChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCiB2b2lkIGkyY19wYXJzZV9md190aW1pbmdzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGkyY190aW1pbmdzICp0LCBib29sIHVzZV9kZWZhdWx0cyk7CiAKQEAgLTc2Niw0ICs3OTIsMTMgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0FDUEkpCit1MzIgaTJjX2FjcGlfZmluZF9idXNfc3BlZWQoc3RydWN0IGRldmljZSAqZGV2KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHUzMiBpMmNfYWNwaV9maW5kX2J1c19zcGVlZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KKwogI2VuZGlmIC8qIF9MSU5VWF9JMkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaCBiL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKaW5kZXggZGNiODllMy4uYzY1ODdjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oCkBAIC00NSw2ICs0NSw3IEBACiAjZGVmaW5lIEJSX1BST1hZQVJQCQlCSVQoOCkKICNkZWZpbmUgQlJfTEVBUk5JTkdfU1lOQwlCSVQoOSkKICNkZWZpbmUgQlJfUFJPWFlBUlBfV0lGSQlCSVQoMTApCisjZGVmaW5lIEJSX01DQVNUX0ZMT09ECQlCSVQoMTEpCiAKICNkZWZpbmUgQlJfREVGQVVMVF9BR0VJTkdfVElNRQkoMzAwICogSFopCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfbGluay5oIGIvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKaW5kZXggZjkyM2QxNS4uMGIxN2M1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl9saW5rLmgKQEAgLTI1LDUgKzI1LDYgQEAKIAlfX3UzMiBtYXhfdHhfcmF0ZTsKIAlfX3UzMiByc3NfcXVlcnlfZW47CiAJX191MzIgdHJ1c3RlZDsKKwlfX2JlMTYgdmxhbl9wcm90bzsKIH07CiAjZW5kaWYgLyogX0xJTlVYX0lGX0xJTktfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl92bGFuLmggYi9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaAppbmRleCBhNWY2Y2U2Li4zMzE5ZDk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaApAQCAtODEsNiArODEsNyBAQAogI2RlZmluZSBza2Jfdmxhbl90YWdfcHJlc2VudChfX3NrYikJKChfX3NrYiktPnZsYW5fdGNpICYgVkxBTl9UQUdfUFJFU0VOVCkKICNkZWZpbmUgc2tiX3ZsYW5fdGFnX2dldChfX3NrYikJCSgoX19za2IpLT52bGFuX3RjaSAmIH5WTEFOX1RBR19QUkVTRU5UKQogI2RlZmluZSBza2Jfdmxhbl90YWdfZ2V0X2lkKF9fc2tiKQkoKF9fc2tiKS0+dmxhbl90Y2kgJiBWTEFOX1ZJRF9NQVNLKQorI2RlZmluZSBza2Jfdmxhbl90YWdfZ2V0X3ByaW8oX19za2IpCSgoX19za2IpLT52bGFuX3RjaSAmIFZMQU5fUFJJT19NQVNLKQogCiAvKioKICAqCXN0cnVjdCB2bGFuX3BjcHVfc3RhdHMgLSBWTEFOIHBlcmNwdSByeC90eCBzdGF0cwpAQCAtMjcxLDYgKzI3MiwyMyBAQAogfQogI2VuZGlmCiAKKy8qKgorICogZXRoX3R5cGVfdmxhbiAtIGNoZWNrIGZvciB2YWxpZCB2bGFuIGV0aGVyIHR5cGUuCisgKiBAZXRoZXJ0eXBlOiBldGhlciB0eXBlIHRvIGNoZWNrCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBldGhlciB0eXBlIGlzIGEgdmxhbiBldGhlciB0eXBlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgZXRoX3R5cGVfdmxhbihfX2JlMTYgZXRoZXJ0eXBlKQoreworCXN3aXRjaCAoZXRoZXJ0eXBlKSB7CisJY2FzZSBodG9ucyhFVEhfUF84MDIxUSk6CisJY2FzZSBodG9ucyhFVEhfUF84MDIxQUQpOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCiBzdGF0aWMgaW5saW5lIGJvb2wgdmxhbl9od19vZmZsb2FkX2NhcGFibGUobmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMsCiAJCQkJCSAgIF9fYmUxNiBwcm90bykKIHsKQEAgLTQyNCw4ICs0NDIsNyBAQAogewogCXN0cnVjdCB2bGFuX2V0aGhkciAqdmV0aCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKilza2ItPmRhdGE7CiAKLQlpZiAodmV0aC0+aF92bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSAmJgotCSAgICB2ZXRoLT5oX3ZsYW5fcHJvdG8gIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkKKwlpZiAoIWV0aF90eXBlX3ZsYW4odmV0aC0+aF92bGFuX3Byb3RvKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkqdmxhbl90Y2kgPSBudG9ocyh2ZXRoLT5oX3ZsYW5fVENJKTsKQEAgLTQ4Nyw3ICs1MDQsNyBAQAogCSAqIHByZXNlbnQgYXQgbWFjX2xlbiAtIFZMQU5fSExFTiAoaWYgbWFjX2xlbiA+IDApLCBvciBhdAogCSAqIEVUSF9ITEVOIG90aGVyd2lzZQogCSAqLwotCWlmICh0eXBlID09IGh0b25zKEVUSF9QXzgwMjFRKSB8fCB0eXBlID09IGh0b25zKEVUSF9QXzgwMjFBRCkpIHsKKwlpZiAoZXRoX3R5cGVfdmxhbih0eXBlKSkgewogCQlpZiAodmxhbl9kZXB0aCkgewogCQkJaWYgKFdBUk5fT04odmxhbl9kZXB0aCA8IFZMQU5fSExFTikpCiAJCQkJcmV0dXJuIDA7CkBAIC01MDUsOCArNTIyLDcgQEAKIAkJCXZoID0gKHN0cnVjdCB2bGFuX2hkciAqKShza2ItPmRhdGEgKyB2bGFuX2RlcHRoKTsKIAkJCXR5cGUgPSB2aC0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bzsKIAkJCXZsYW5fZGVwdGggKz0gVkxBTl9ITEVOOwotCQl9IHdoaWxlICh0eXBlID09IGh0b25zKEVUSF9QXzgwMjFRKSB8fAotCQkJIHR5cGUgPT0gaHRvbnMoRVRIX1BfODAyMUFEKSk7CisJCX0gd2hpbGUgKGV0aF90eXBlX3ZsYW4odHlwZSkpOwogCX0KIAogCWlmIChkZXB0aCkKQEAgLTU3MSw4ICs1ODcsNyBAQAogc3RhdGljIGlubGluZSBib29sIHNrYl92bGFuX3RhZ2dlZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmICghc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSAmJgotCSAgICBsaWtlbHkoc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKLQkJICAgc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxQUQpKSkKKwkgICAgbGlrZWx5KCFldGhfdHlwZV92bGFuKHNrYi0+cHJvdG9jb2wpKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmV0dXJuIHRydWU7CkBAIC01OTIsMTUgKzYwNywxNCBAQAogCWlmICghc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkgewogCQlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZlaDsKIAotCQlpZiAobGlrZWx5KHByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFRKSAmJgotCQkJICAgcHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkpCisJCWlmIChsaWtlbHkoIWV0aF90eXBlX3ZsYW4ocHJvdG9jb2wpKSkKIAkJCXJldHVybiBmYWxzZTsKIAogCQl2ZWggPSAoc3RydWN0IHZsYW5fZXRoaGRyICopc2tiLT5kYXRhOwogCQlwcm90b2NvbCA9IHZlaC0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bzsKIAl9CiAKLQlpZiAocHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMVEpICYmIHByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpCisJaWYgKCFldGhfdHlwZV92bGFuKHByb3RvY29sKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby9jb25zdW1lci5oIGIvaW5jbHVkZS9saW51eC9paW8vY29uc3VtZXIuaAppbmRleCAzZDY3MmY3Li45ZWRjY2ZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lpby9jb25zdW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL2NvbnN1bWVyLmgKQEAgLTE2NSw2ICsxNjUsMTggQEAKICppaW9fY2hhbm5lbF9jYl9nZXRfY2hhbm5lbHMoY29uc3Qgc3RydWN0IGlpb19jYl9idWZmZXIgKmNiX2J1ZmZlcik7CiAKIC8qKgorICogaWlvX2NoYW5uZWxfY2JfZ2V0X2lpb19kZXYoKSAtIGdldCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgZGV2aWNlLgorICogQGNiX2J1ZmZlcjoJCVRoZSBjYWxsYmFjayBidWZmZXIgZnJvbSB3aG9tIHdlIHdhbnQgdGhlIGRldmljZQorICoJCQlpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBvbmUgdG8gb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UuCisgKiBUaGUgcHJpbWFyeSBhaW0gaXMgdG8gYWxsb3cgZHJpdmVycyB0aGF0IGFyZSBjb25zdW1pbmcgYSBkZXZpY2UgdG8gcXVlcnkKKyAqIHRoaW5ncyBsaWtlIGN1cnJlbnQgdHJpZ2dlci4KKyAqLworc3RydWN0IGlpb19kZXYKKyppaW9fY2hhbm5lbF9jYl9nZXRfaWlvX2Rldihjb25zdCBzdHJ1Y3QgaWlvX2NiX2J1ZmZlciAqY2JfYnVmZmVyKTsKKworLyoqCiAgKiBpaW9fcmVhZF9jaGFubmVsX3JhdygpIC0gcmVhZCBmcm9tIGEgZ2l2ZW4gY2hhbm5lbAogICogQGNoYW46CQlUaGUgY2hhbm5lbCBiZWluZyBxdWVyaWVkLgogICogQHZhbDoJCVZhbHVlIHJlYWQgYmFjay4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWlvL2lpby5oIGIvaW5jbHVkZS9saW51eC9paW8vaWlvLmgKaW5kZXggODU0ZTJkYS4uYjRhMDY3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vaWlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9paW8vaWlvLmgKQEAgLTQ4Myw2ICs0ODMsNyBAQAogICogQHNjYW5fdGltZXN0YW1wOglbSU5URVJOXSBzZXQgaWYgYW55IGJ1ZmZlcnMgaGF2ZSByZXF1ZXN0ZWQgdGltZXN0YW1wCiAgKiBAc2Nhbl9pbmRleF90aW1lc3RhbXA6W0lOVEVSTl0gY2FjaGUgb2YgdGhlIGluZGV4IHRvIHRoZSB0aW1lc3RhbXAKICAqIEB0cmlnOgkJW0lOVEVSTl0gY3VycmVudCBkZXZpY2UgdHJpZ2dlciAoYnVmZmVyIG1vZGVzKQorICogQHRyaWdfcmVhZG9ubHkJW0lOVEVSTl0gbWFyayB0aGUgY3VycmVudCB0cmlnZ2VyIGltbXV0YWJsZQogICogQHBvbGxmdW5jOgkJW0RSSVZFUl0gZnVuY3Rpb24gcnVuIG9uIHRyaWdnZXIgYmVpbmcgcmVjZWl2ZWQKICAqIEBwb2xsZnVuY19ldmVudDoJW0RSSVZFUl0gZnVuY3Rpb24gcnVuIG9uIGV2ZW50cyB0cmlnZ2VyIGJlaW5nIHJlY2VpdmVkCiAgKiBAY2hhbm5lbHM6CQlbRFJJVkVSXSBjaGFubmVsIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHRhYmxlCkBAIC01MjMsNiArNTI0LDcgQEAKIAlib29sCQkJCXNjYW5fdGltZXN0YW1wOwogCXVuc2lnbmVkCQkJc2Nhbl9pbmRleF90aW1lc3RhbXA7CiAJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKKwlib29sCQkJCXRyaWdfcmVhZG9ubHk7CiAJc3RydWN0IGlpb19wb2xsX2Z1bmMJCSpwb2xsZnVuYzsKIAlzdHJ1Y3QgaWlvX3BvbGxfZnVuYwkJKnBvbGxmdW5jX2V2ZW50OwogCkBAIC02NDIsNiArNjQ0LDcgQEAKIH0KIAogdm9pZCBpaW9fZGV2aWNlX2ZyZWUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgZGV2bV9paW9fZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcmVzLCB2b2lkICpkYXRhKTsKIHN0cnVjdCBpaW9fZGV2ICpkZXZtX2lpb19kZXZpY2VfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc2l6ZW9mX3ByaXYpOwogdm9pZCBkZXZtX2lpb19kZXZpY2VfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogc3RydWN0IGlpb190cmlnZ2VyICpkZXZtX2lpb190cmlnZ2VyX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWlvL3N3X3RyaWdnZXIuaCBiL2luY2x1ZGUvbGludXgvaWlvL3N3X3RyaWdnZXIuaAppbmRleCA1MTk4ZjhlLi5jOTdlYWI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lpby9zd190cmlnZ2VyLmgKKysrIGIvaW5jbHVkZS9saW51eC9paW8vc3dfdHJpZ2dlci5oCkBAIC02Miw3ICs2Miw3IEBACiAJCQkJICBjb25zdCBjaGFyICpuYW1lLAogCQkJCSAgc3RydWN0IGNvbmZpZ19pdGVtX3R5cGUgKnR5cGUpCiB7Ci0jaWZkZWYgQ09ORklHX0NPTkZJR0ZTX0ZTCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQ09ORklHRlNfRlMpCiAJY29uZmlnX2dyb3VwX2luaXRfdHlwZV9uYW1lKCZ0LT5ncm91cCwgbmFtZSwgdHlwZSk7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWlvL3RyaWdnZXIuaCBiL2luY2x1ZGUvbGludXgvaWlvL3RyaWdnZXIuaAppbmRleCAxYzllMDI4Li40ZjExNTRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lpby90cmlnZ2VyLmgKKysrIGIvaW5jbHVkZS9saW51eC9paW8vdHJpZ2dlci5oCkBAIC01Niw2ICs1Niw5IEBACiAgKiBAc3ViaXJxczoJCVtJTlRFUk5dIGluZm9ybWF0aW9uIGFib3V0IHRoZSAnY2hpbGQnIGlycXMuCiAgKiBAcG9vbDoJCVtJTlRFUk5dIGJpdG1hcCBvZiBpcnFzIGN1cnJlbnRseSBpbiB1c2UuCiAgKiBAcG9vbF9sb2NrOgkJW0lOVEVSTl0gcHJvdGVjdGlvbiBvZiB0aGUgaXJxIHBvb2wuCisgKiBAYXR0YWNoZWRfb3duX2RldmljZTpbSU5URVJOXSBpZiB3ZSBhcmUgdXNpbmcgb3VyIG93biBkZXZpY2UgYXMgdHJpZ2dlciwKKyAqCQkJaS5lLiBpZiB3ZSByZWdpc3RlcmVkIGEgcG9sbCBmdW5jdGlvbiB0byB0aGUgc2FtZQorICoJCQlkZXZpY2UgYXMgdGhlIG9uZSBwcm92aWRpbmcgdGhlIHRyaWdnZXIuCiAgKiovCiBzdHJ1Y3QgaWlvX3RyaWdnZXIgewogCWNvbnN0IHN0cnVjdCBpaW9fdHJpZ2dlcl9vcHMJKm9wczsKQEAgLTczLDYgKzc2LDcgQEAKIAlzdHJ1Y3QgaWlvX3N1YmlycSBzdWJpcnFzW0NPTkZJR19JSU9fQ09OU1VNRVJTX1BFUl9UUklHR0VSXTsKIAl1bnNpZ25lZCBsb25nIHBvb2xbQklUU19UT19MT05HUyhDT05GSUdfSUlPX0NPTlNVTUVSU19QRVJfVFJJR0dFUildOwogCXN0cnVjdCBtdXRleAkJCXBvb2xfbG9jazsKKwlib29sCQkJCWF0dGFjaGVkX293bl9kZXZpY2U7CiB9OwogCiAKQEAgLTEyNSwxMiArMTI5LDI3IEBACiAgKiovCiBpbnQgaWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnX2luZm8pOwogCitpbnQgZGV2bV9paW9fdHJpZ2dlcl9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdfaW5mbyk7CisKIC8qKgogICogaWlvX3RyaWdnZXJfdW5yZWdpc3RlcigpIC0gdW5yZWdpc3RlciBhIHRyaWdnZXIgZnJvbSB0aGUgY29yZQogICogQHRyaWdfaW5mbzoJdHJpZ2dlciB0byBiZSB1bnJlZ2lzdGVyZWQKICAqKi8KIHZvaWQgaWlvX3RyaWdnZXJfdW5yZWdpc3RlcihzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdfaW5mbyk7CiAKK3ZvaWQgZGV2bV9paW9fdHJpZ2dlcl91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGlpb190cmlnZ2VyICp0cmlnX2luZm8pOworCisvKioKKyAqIGlpb190cmlnZ2VyX3NldF9pbW11dGFibGUoKSAtIHNldCBhbiBpbW11dGFibGUgdHJpZ2dlciBvbiBkZXN0aW5hdGlvbgorICoKKyAqIEBpbmRpb19kZXYgLSBJSU8gZGV2aWNlIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBkZXZpY2UKKyAqIEB0cmlnIC0gdHJpZ2dlciB0byBhc3NpZ24gdG8gZGV2aWNlCisgKgorICoqLworaW50IGlpb190cmlnZ2VyX3NldF9pbW11dGFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldiwgc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKTsKKwogLyoqCiAgKiBpaW9fdHJpZ2dlcl9wb2xsKCkgLSBjYWxsZWQgb24gYSB0cmlnZ2VyIG9jY3VycmluZwogICogQHRyaWc6CXRyaWdnZXIgd2hpY2ggb2NjdXJyZWQKQEAgLTE0NSw2ICsxNjQsMTMgQEAKIF9fcHJpbnRmKDEsIDIpIHN0cnVjdCBpaW9fdHJpZ2dlciAqaWlvX3RyaWdnZXJfYWxsb2MoY29uc3QgY2hhciAqZm10LCAuLi4pOwogdm9pZCBpaW9fdHJpZ2dlcl9mcmVlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyk7CiAKKy8qKgorICogaWlvX3RyaWdnZXJfdXNpbmdfb3duKCkgLSB0ZWxscyB1cyBpZiB3ZSB1c2Ugb3VyIG93biBIVyB0cmlnZ2VyIG91cnNlbHZlcworICogQGluZGlvX2RldjogIGRldmljZSB0byBjaGVjaworICovCitib29sIGlpb190cmlnZ2VyX3VzaW5nX293bihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKworCiAjZWxzZQogc3RydWN0IGlpb190cmlnZ2VyOwogc3RydWN0IGlpb190cmlnZ2VyX29wczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaCBiL2luY2x1ZGUvbGludXgvaWlvL3RyaWdnZXJlZF9idWZmZXIuaAppbmRleCBmNzJmNzBkLi4zMDE0NTYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lpby90cmlnZ2VyZWRfYnVmZmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9paW8vdHJpZ2dlcmVkX2J1ZmZlci5oCkBAIC0xMiw0ICsxMiwxMiBAQAogCWNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyAqc2V0dXBfb3BzKTsKIHZvaWQgaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIAoraW50IGRldm1faWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgICBpcnFyZXR1cm5fdCAoKmgpKGludCBpcnEsIHZvaWQgKnApLAorCQkJCSAgICBpcnFyZXR1cm5fdCAoKnRocmVhZCkoaW50IGlycSwgdm9pZCAqcCksCisJCQkJICAgIGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyAqb3BzKTsKK3ZvaWQgZGV2bV9paW9fdHJpZ2dlcmVkX2J1ZmZlcl9jbGVhbnVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbmV0X2RpYWcuaCBiL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmgKaW5kZXggZmViMDRlYS4uNjVkYTQzMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbmV0X2RpYWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luZXRfZGlhZy5oCkBAIC0zNyw3ICszNyw3IEBACiAJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEsCiAJCSAgICAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywKIAkJICAgICAgdTMyIHBpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAotCQkgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgpOworCQkgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgsIGJvb2wgbmV0X2FkbWluKTsKIHZvaWQgaW5ldF9kaWFnX2R1bXBfaWNzayhzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCiAJCQkgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIsCkBAIC01Niw3ICs1Niw3IEBACiAKIGludCBpbmV0X2RpYWdfbXNnX2F0dHJzX2ZpbGwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICBzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqciwgaW50IGV4dCwKLQkJCSAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zKTsKKwkJCSAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLCBib29sIG5ldF9hZG1pbik7CiAKIGV4dGVybiBpbnQgIGluZXRfZGlhZ19yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX2hhbmRsZXIgKmhhbmRsZXIpOwogZXh0ZXJuIHZvaWQgaW5ldF9kaWFnX3VucmVnaXN0ZXIoY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdC5oIGIvaW5jbHVkZS9saW51eC9pbml0LmgKaW5kZXggNjkzNWQwMi4uNWEzMzIxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0LmgKQEAgLTQxLDIyICs0MSwxMSBAQAogICAgZGlzY2FyZCBpdCBpbiBtb2R1bGVzKSAqLwogI2RlZmluZSBfX2luaXQJCV9fc2VjdGlvbiguaW5pdC50ZXh0KSBfX2NvbGQgbm90cmFjZQogI2RlZmluZSBfX2luaXRkYXRhCV9fc2VjdGlvbiguaW5pdC5kYXRhKQotI2RlZmluZSBfX2luaXRjb25zdAlfX2NvbnN0c2VjdGlvbiguaW5pdC5yb2RhdGEpCisjZGVmaW5lIF9faW5pdGNvbnN0CV9fc2VjdGlvbiguaW5pdC5yb2RhdGEpCiAjZGVmaW5lIF9fZXhpdGRhdGEJX19zZWN0aW9uKC5leGl0LmRhdGEpCiAjZGVmaW5lIF9fZXhpdF9jYWxsCV9fdXNlZCBfX3NlY3Rpb24oLmV4aXRjYWxsLmV4aXQpCiAKIC8qCi0gKiBTb21lIGFyY2hpdGVjdHVyZSBoYXZlIHRvb2wgY2hhaW5zIHdoaWNoIGRvIG5vdCBoYW5kbGUgcm9kYXRhIGF0dHJpYnV0ZXMKLSAqIGNvcnJlY3RseS4gRm9yIHRob3NlIGRpc2FibGUgc3BlY2lhbCBzZWN0aW9ucyBmb3IgY29uc3QsIHNvIHRoYXQgb3RoZXIKLSAqIGFyY2hpdGVjdHVyZXMgY2FuIGFubm90YXRlIGNvcnJlY3RseS4KLSAqLwotI2lmZGVmIENPTkZJR19CUk9LRU5fUk9EQVRBCi0jZGVmaW5lIF9fY29uc3RzZWN0aW9uKHgpCi0jZWxzZQotI2RlZmluZSBfX2NvbnN0c2VjdGlvbih4KSBfX3NlY3Rpb24oeCkKLSNlbmRpZgotCi0vKgogICogbW9kcG9zdCBjaGVjayBmb3Igc2VjdGlvbiBtaXNtYXRjaGVzIGR1cmluZyB0aGUga2VybmVsIGJ1aWxkLgogICogQSBzZWN0aW9uIG1pc21hdGNoIGhhcHBlbnMgd2hlbiB0aGVyZSBhcmUgcmVmZXJlbmNlcyBmcm9tIGEKICAqIGNvZGUgb3IgZGF0YSBzZWN0aW9uIHRvIGFuIGluaXQgc2VjdGlvbiAoYm90aCBjb2RlIG9yIGRhdGEpLgpAQCAtNzUsNyArNjQsNyBAQAogICovCiAjZGVmaW5lIF9fcmVmICAgICAgICAgICAgX19zZWN0aW9uKC5yZWYudGV4dCkgbm9pbmxpbmUKICNkZWZpbmUgX19yZWZkYXRhICAgICAgICBfX3NlY3Rpb24oLnJlZi5kYXRhKQotI2RlZmluZSBfX3JlZmNvbnN0ICAgICAgIF9fY29uc3RzZWN0aW9uKC5yZWYucm9kYXRhKQorI2RlZmluZSBfX3JlZmNvbnN0ICAgICAgIF9fc2VjdGlvbigucmVmLnJvZGF0YSkKIAogI2lmZGVmIE1PRFVMRQogI2RlZmluZSBfX2V4aXR1c2VkCkBAIC04OCwxMCArNzcsMTAgQEAKIC8qIFVzZWQgZm9yIE1FTU9SWV9IT1RQTFVHICovCiAjZGVmaW5lIF9fbWVtaW5pdCAgICAgICAgX19zZWN0aW9uKC5tZW1pbml0LnRleHQpIF9fY29sZCBub3RyYWNlCiAjZGVmaW5lIF9fbWVtaW5pdGRhdGEgICAgX19zZWN0aW9uKC5tZW1pbml0LmRhdGEpCi0jZGVmaW5lIF9fbWVtaW5pdGNvbnN0ICAgX19jb25zdHNlY3Rpb24oLm1lbWluaXQucm9kYXRhKQorI2RlZmluZSBfX21lbWluaXRjb25zdCAgIF9fc2VjdGlvbigubWVtaW5pdC5yb2RhdGEpCiAjZGVmaW5lIF9fbWVtZXhpdCAgICAgICAgX19zZWN0aW9uKC5tZW1leGl0LnRleHQpIF9fZXhpdHVzZWQgX19jb2xkIG5vdHJhY2UKICNkZWZpbmUgX19tZW1leGl0ZGF0YSAgICBfX3NlY3Rpb24oLm1lbWV4aXQuZGF0YSkKLSNkZWZpbmUgX19tZW1leGl0Y29uc3QgICBfX2NvbnN0c2VjdGlvbigubWVtZXhpdC5yb2RhdGEpCisjZGVmaW5lIF9fbWVtZXhpdGNvbnN0ICAgX19zZWN0aW9uKC5tZW1leGl0LnJvZGF0YSkKIAogLyogRm9yIGFzc2VtYmx5IHJvdXRpbmVzICovCiAjZGVmaW5lIF9fSEVBRAkJLnNlY3Rpb24JIi5oZWFkLnRleHQiLCJheCIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmggYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCmluZGV4IGY4ODM0ZjguLjMyNWY2NDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaApAQCAtMTUsNiArMTUsOCBAQAogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQvcnQuaD4KIAorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorCiAjaWZkZWYgQ09ORklHX1NNUAogIyBkZWZpbmUgSU5JVF9QVVNIQUJMRV9UQVNLUyh0c2spCQkJCQlcCiAJLnB1c2hhYmxlX3Rhc2tzID0gUExJU1RfTk9ERV9JTklUKHRzay5wdXNoYWJsZV90YXNrcywgTUFYX1BSSU8pLApAQCAtMTgzLDEyICsxODUsMjEgQEAKICMgZGVmaW5lIElOSVRfS0FTQU4odHNrKQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworIyBkZWZpbmUgSU5JVF9UQVNLX1RJKHRzaykJCQlcCisJLnRocmVhZF9pbmZvID0gSU5JVF9USFJFQURfSU5GTyh0c2spLAlcCisJLnN0YWNrX3JlZmNvdW50ID0gQVRPTUlDX0lOSVQoMSksCisjZWxzZQorIyBkZWZpbmUgSU5JVF9UQVNLX1RJKHRzaykKKyNlbmRpZgorCiAvKgogICogIElOSVRfVEFTSyBpcyB1c2VkIHRvIHNldCB1cCB0aGUgZmlyc3QgdGFzayB0YWJsZSwgdG91Y2ggYXQKICAqIHlvdXIgb3duIHJpc2shLiBCYXNlPTAsIGxpbWl0PTB4MWZmZmZmICg9Mk1CKQogICovCiAjZGVmaW5lIElOSVRfVEFTSyh0c2spCVwKIHsJCQkJCQkJCQlcCisJSU5JVF9UQVNLX1RJKHRzaykJCQkJCQlcCiAJLnN0YXRlCQk9IDAsCQkJCQkJXAogCS5zdGFjawkJPSBpbml0X3N0YWNrLAkJCQkJXAogCS51c2FnZQkJPSBBVE9NSUNfSU5JVCgyKSwJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggYjY2ODNmMC4uNzJmMDcyMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC0yNzgsNyArMjc4LDggQEAKIGV4dGVybiBpbnQKIGlycV9zZXRfYWZmaW5pdHlfbm90aWZpZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9hZmZpbml0eV9ub3RpZnkgKm5vdGlmeSk7CiAKLXN0cnVjdCBjcHVtYXNrICppcnFfY3JlYXRlX2FmZmluaXR5X21hc2sodW5zaWduZWQgaW50ICpucl92ZWNzKTsKK3N0cnVjdCBjcHVtYXNrICppcnFfY3JlYXRlX2FmZmluaXR5X21hc2tzKGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSwgaW50IG52ZWMpOworaW50IGlycV9jYWxjX2FmZmluaXR5X3ZlY3RvcnMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5LCBpbnQgbWF4dmVjKTsKIAogI2Vsc2UgLyogQ09ORklHX1NNUCAqLwogCkBAIC0zMTEsMTEgKzMxMiwxOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjcHVtYXNrICppcnFfY3JlYXRlX2FmZmluaXR5X21hc2sodW5zaWduZWQgaW50ICpucl92ZWNzKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgY3B1bWFzayAqCitpcnFfY3JlYXRlX2FmZmluaXR5X21hc2tzKGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSwgaW50IG52ZWMpCiB7Ci0JKm5yX3ZlY3MgPSAxOwogCXJldHVybiBOVUxMOwogfQorCitzdGF0aWMgaW5saW5lIGludAoraXJxX2NhbGNfYWZmaW5pdHlfdmVjdG9ycyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHksIGludCBtYXh2ZWMpCit7CisJcmV0dXJuIG1heHZlYzsKK30KKwogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9tYXAuaCBiL2luY2x1ZGUvbGludXgvaW9tYXAuaAppbmRleCAzMjY3ZGY0Li5lNjNlMjg4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9pb21hcC5oCkBAIC0xOSw2ICsxOSwxMyBAQAogI2RlZmluZSBJT01BUF9VTldSSVRURU4JMHgwNAkvKiBibG9ja3MgYWxsb2NhdGVkIEBibGtubyBpbiB1bndyaXR0ZW4gc3RhdGUgKi8KIAogLyoKKyAqIEZsYWdzIGZvciBpb21hcCBtYXBwaW5nczoKKyAqLworI2RlZmluZSBJT01BUF9GX01FUkdFRAkweDAxCS8qIGNvbnRhaW5zIG11bHRpcGxlIGJsb2Nrcy9leHRlbnRzICovCisjZGVmaW5lIElPTUFQX0ZfU0hBUkVECTB4MDIJLyogYmxvY2sgc2hhcmVkIHdpdGggYW5vdGhlciBmaWxlICovCisjZGVmaW5lIElPTUFQX0ZfTkVXCTB4MDQJLyogYmxvY2tzIGhhdmUgYmVlbiBuZXdseSBhbGxvY2F0ZWQgKi8KKworLyoKICAqIE1hZ2ljIHZhbHVlIGZvciBibGtubzoKICAqLwogI2RlZmluZSBJT01BUF9OVUxMX0JMT0NLIC0xTEwJLyogYmxrbm8gaXMgbm90IHZhbGlkICovCkBAIC0yNyw3ICszNCw4IEBACiAJc2VjdG9yX3QJCWJsa25vOwkvKiAxc3Qgc2VjdG9yIG9mIG1hcHBpbmcsIDUxMmIgdW5pdHMgKi8KIAlsb2ZmX3QJCQlvZmZzZXQ7CS8qIGZpbGUgb2Zmc2V0IG9mIG1hcHBpbmcsIGJ5dGVzICovCiAJdTY0CQkJbGVuZ3RoOwkvKiBsZW5ndGggb2YgbWFwcGluZywgYnl0ZXMgKi8KLQlpbnQJCQl0eXBlOwkvKiB0eXBlIG9mIG1hcHBpbmcgKi8KKwl1MTYJCQl0eXBlOwkvKiB0eXBlIG9mIG1hcHBpbmcgKi8KKwl1MTYJCQlmbGFnczsJLyogZmxhZ3MgZm9yIG1hcHBpbmcgKi8KIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlCSpiZGV2OwkvKiBibG9jayBkZXZpY2UgZm9yIEkvTyAqLwogfTsKIApAQCAtNTgsNiArNjYsOCBAQAogCiBzc2l6ZV90IGlvbWFwX2ZpbGVfYnVmZmVyZWRfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20sCiAJCXN0cnVjdCBpb21hcF9vcHMgKm9wcyk7CitpbnQgaW9tYXBfZmlsZV9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgcG9zLCBsb2ZmX3QgbGVuLAorCQlzdHJ1Y3QgaW9tYXBfb3BzICpvcHMpOwogaW50IGlvbWFwX3plcm9fcmFuZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IHBvcywgbG9mZl90IGxlbiwKIAkJYm9vbCAqZGlkX3plcm8sIHN0cnVjdCBpb21hcF9vcHMgKm9wcyk7CiBpbnQgaW9tYXBfdHJ1bmNhdGVfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgcG9zLCBib29sICpkaWRfemVybywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9wcmlvLmggYi9pbmNsdWRlL2xpbnV4L2lvcHJpby5oCmluZGV4IGJlYjljZTEuLjhjMTIzOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9wcmlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pb3ByaW8uaApAQCAtNyw3ICs3LDYgQEAKIC8qCiAgKiBHaXZlcyB1cyA4IHByaW8gY2xhc3NlcyB3aXRoIDEzLWJpdHMgb2YgZGF0YSBmb3IgZWFjaCBjbGFzcwogICovCi0jZGVmaW5lIElPUFJJT19CSVRTCQkoMTYpCiAjZGVmaW5lIElPUFJJT19DTEFTU19TSElGVAkoMTMpCiAjZGVmaW5lIElPUFJJT19QUklPX01BU0sJKCgxVUwgPDwgSU9QUklPX0NMQVNTX1NISUZUKSAtIDEpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXBjX25hbWVzcGFjZS5oIGIvaW5jbHVkZS9saW51eC9pcGNfbmFtZXNwYWNlLmgKaW5kZXggZDEwZTU0Zi4uODQ4ZTU3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcGNfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcGNfbmFtZXNwYWNlLmgKQEAgLTU4LDYgKzU4LDcgQEAKIAogCS8qIHVzZXJfbnMgd2hpY2ggb3ducyB0aGUgaXBjIG5zICovCiAJc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zOworCXN0cnVjdCB1Y291bnRzICp1Y291bnRzOwogCiAJc3RydWN0IG5zX2NvbW1vbiBuczsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwdjYuaCBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCmluZGV4IGM2ZGJjZDguLjdlOWE3ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCkBAIC0xOCw2ICsxOCw3IEBACiAJX19zMzIJCWRhZF90cmFuc21pdHM7CiAJX19zMzIJCXJ0cl9zb2xpY2l0czsKIAlfX3MzMgkJcnRyX3NvbGljaXRfaW50ZXJ2YWw7CisJX19zMzIJCXJ0cl9zb2xpY2l0X21heF9pbnRlcnZhbDsKIAlfX3MzMgkJcnRyX3NvbGljaXRfZGVsYXk7CiAJX19zMzIJCWZvcmNlX21sZF92ZXJzaW9uOwogCV9fczMyCQltbGR2MV91bnNvbGljaXRlZF9yZXBvcnRfaW50ZXJ2YWw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycS5oIGIvaW5jbHVkZS9saW51eC9pcnEuaAppbmRleCBiNTI0MjRlLi5lNzk4NzU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTkxNiwxMiArOTE2LDIwIEBACiAJCQkgICAgIHVuc2lnbmVkIGludCBjbHIsIHVuc2lnbmVkIGludCBzZXQpOwogCiBzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqaXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgaHdfaXJxKTsKLWludCBpcnFfYWxsb2NfZG9tYWluX2dlbmVyaWNfY2hpcHMoc3RydWN0IGlycV9kb21haW4gKmQsIGludCBpcnFzX3Blcl9jaGlwLAotCQkJCSAgIGludCBudW1fY3QsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZXIsCi0JCQkJICAgdW5zaWduZWQgaW50IGNsciwgdW5zaWduZWQgaW50IHNldCwKLQkJCQkgICBlbnVtIGlycV9nY19mbGFncyBmbGFncyk7CiAKK2ludCBfX2lycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyhzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgaW50IGlycXNfcGVyX2NoaXAsCisJCQkJICAgICBpbnQgbnVtX2N0LCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZXIsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgY2xyLCB1bnNpZ25lZCBpbnQgc2V0LAorCQkJCSAgICAgZW51bSBpcnFfZ2NfZmxhZ3MgZmxhZ3MpOworCisjZGVmaW5lIGlycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyhkLCBpcnFzX3Blcl9jaGlwLCBudW1fY3QsIG5hbWUsCVwKKwkJCQkgICAgICAgaGFuZGxlciwJY2xyLCBzZXQsIGZsYWdzKQlcCisoewkJCQkJCQkJCVwKKwlNQVlCRV9CVUlMRF9CVUdfT04oaXJxc19wZXJfY2hpcCA+IDMyKTsJCQkJXAorCV9faXJxX2FsbG9jX2RvbWFpbl9nZW5lcmljX2NoaXBzKGQsIGlycXNfcGVyX2NoaXAsIG51bV9jdCwgbmFtZSxcCisJCQkJCSBoYW5kbGVyLCBjbHIsIHNldCwgZmxhZ3MpOwlcCit9KQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpcnFfY2hpcF90eXBlICppcnFfZGF0YV9nZXRfY2hpcF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKQEAgLTk0NSw2ICs5NTMsMTYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpcnFfZ2NfdW5sb2NrKHN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYykgeyB9CiAjZW5kaWYKIAorLyoKKyAqIFRoZSBpcnFzYXZlIHZhcmlhbnRzIGFyZSBmb3IgdXNhZ2UgaW4gbm9uIGludGVycnVwdCBjb2RlLiBEbyBub3QgdXNlCisgKiB0aGVtIGluIGlycV9jaGlwIGNhbGxiYWNrcy4gVXNlIGlycV9nY19sb2NrKCkgaW5zdGVhZC4KKyAqLworI2RlZmluZSBpcnFfZ2NfbG9ja19pcnFzYXZlKGdjLCBmbGFncykJXAorCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmKGdjKS0+bG9jaywgZmxhZ3MpCisKKyNkZWZpbmUgaXJxX2djX3VubG9ja19pcnFyZXN0b3JlKGdjLCBmbGFncykJXAorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCYoZ2MpLT5sb2NrLCBmbGFncykKKwogc3RhdGljIGlubGluZSB2b2lkIGlycV9yZWdfd3JpdGVsKHN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYywKIAkJCQkgIHUzMiB2YWwsIGludCByZWdfb2Zmc2V0KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnFjaGlwL2FybS1naWMtdjMuaCBiL2luY2x1ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLXYzLmgKaW5kZXggOTlhYzAyMi4uODM2MWM4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFjaGlwL2FybS1naWMtdjMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycWNoaXAvYXJtLWdpYy12My5oCkBAIC00MzAsOSArNDMwLDkgQEAKIH07CiAKIHN0cnVjdCBpcnFfZG9tYWluOwotc3RydWN0IGRldmljZV9ub2RlOworc3RydWN0IGZ3bm9kZV9oYW5kbGU7CiBpbnQgaXRzX2NwdV9pbml0KHZvaWQpOwotaW50IGl0c19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgc3RydWN0IHJkaXN0cyAqcmRpc3RzLAoraW50IGl0c19pbml0KHN0cnVjdCBmd25vZGVfaGFuZGxlICpoYW5kbGUsIHN0cnVjdCByZGlzdHMgKnJkaXN0cywKIAkgICAgIHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4pOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgZ2ljX2VuYWJsZV9zcmUodm9pZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxZGVzYy5oIGIvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKaW5kZXggYjUxYmVlYi4uYzliZTU3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnFkZXNjLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9MSU5VWF9JUlFERVNDX0gKIAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogCiAvKgogICogQ29yZSBpbnRlcm5hbCBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGlycSBkZXNjcmlwdG9ycwpAQCAtNDMsNiArNDQsNyBAQAogICogQGZvcmNlX3Jlc3VtZV9kZXB0aDoJbnVtYmVyIG9mIGlycWFjdGlvbnMgb24gYSBpcnEgZGVzY3JpcHRvciB3aXRoCiAgKgkJCUlSUUZfRk9SQ0VfUkVTVU1FIHNldAogICogQHJjdToJCXJjdSBoZWFkIGZvciBkZWxheWVkIGZyZWUKKyAqIEBrb2JqOgkJa29iamVjdCB1c2VkIHRvIHJlcHJlc2VudCB0aGlzIHN0cnVjdCBpbiBzeXNmcwogICogQGRpcjoJCS9wcm9jL2lycS8gcHJvY2ZzIGVudHJ5CiAgKiBAbmFtZToJCWZsb3cgaGFuZGxlciBuYW1lIGZvciAvcHJvYy9pbnRlcnJ1cHRzIG91dHB1dAogICovCkBAIC04OCw2ICs5MCw3IEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU1BBUlNFX0lSUQogCXN0cnVjdCByY3VfaGVhZAkJcmN1OworCXN0cnVjdCBrb2JqZWN0CQlrb2JqOwogI2VuZGlmCiAJaW50CQkJcGFyZW50X2lycTsKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaCBiL2luY2x1ZGUvbGludXgvanVtcF9sYWJlbC5oCmluZGV4IDY2MWFmNTYuLmEwNTQ3YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvanVtcF9sYWJlbC5oCisrKyBiL2luY2x1ZGUvbGludXgvanVtcF9sYWJlbC5oCkBAIC0yMSw2ICsyMSw4IEBACiAgKgogICogREVGSU5FX1NUQVRJQ19LRVlfVFJVRShrZXkpOwogICogREVGSU5FX1NUQVRJQ19LRVlfRkFMU0Uoa2V5KTsKKyAqIERFRklORV9TVEFUSUNfS0VZX0FSUkFZX1RSVUUoa2V5cywgY291bnQpOworICogREVGSU5FX1NUQVRJQ19LRVlfQVJSQVlfRkFMU0Uoa2V5cywgY291bnQpOwogICogc3RhdGljX2JyYW5jaF9saWtlbHkoKQogICogc3RhdGljX2JyYW5jaF91bmxpa2VseSgpCiAgKgpAQCAtMjY3LDkgKzI2OSwyNSBAQAogI2RlZmluZSBERUZJTkVfU1RBVElDX0tFWV9UUlVFKG5hbWUpCVwKIAlzdHJ1Y3Qgc3RhdGljX2tleV90cnVlIG5hbWUgPSBTVEFUSUNfS0VZX1RSVUVfSU5JVAogCisjZGVmaW5lIERFQ0xBUkVfU1RBVElDX0tFWV9UUlVFKG5hbWUpCVwKKwlleHRlcm4gc3RydWN0IHN0YXRpY19rZXlfdHJ1ZSBuYW1lCisKICNkZWZpbmUgREVGSU5FX1NUQVRJQ19LRVlfRkFMU0UobmFtZSkJXAogCXN0cnVjdCBzdGF0aWNfa2V5X2ZhbHNlIG5hbWUgPSBTVEFUSUNfS0VZX0ZBTFNFX0lOSVQKIAorI2RlZmluZSBERUNMQVJFX1NUQVRJQ19LRVlfRkFMU0UobmFtZSkJXAorCWV4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleV9mYWxzZSBuYW1lCisKKyNkZWZpbmUgREVGSU5FX1NUQVRJQ19LRVlfQVJSQVlfVFJVRShuYW1lLCBjb3VudCkJCVwKKwlzdHJ1Y3Qgc3RhdGljX2tleV90cnVlIG5hbWVbY291bnRdID0gewkJCVwKKwkJWzAgLi4uIChjb3VudCkgLSAxXSA9IFNUQVRJQ19LRVlfVFJVRV9JTklULAlcCisJfQorCisjZGVmaW5lIERFRklORV9TVEFUSUNfS0VZX0FSUkFZX0ZBTFNFKG5hbWUsIGNvdW50KQkJXAorCXN0cnVjdCBzdGF0aWNfa2V5X2ZhbHNlIG5hbWVbY291bnRdID0gewkJCVwKKwkJWzAgLi4uIChjb3VudCkgLSAxXSA9IFNUQVRJQ19LRVlfRkFMU0VfSU5JVCwJXAorCX0KKwogZXh0ZXJuIGJvb2wgX19fX3dyb25nX2JyYW5jaF9lcnJvcih2b2lkKTsKIAogI2RlZmluZSBzdGF0aWNfa2V5X2VuYWJsZWQoeCkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggZDk2YTYxMS4uNzRmZDZmMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0yNTksMTcgKzI1OSwxNCBAQAogZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBwYW5pY19ub3RpZmllcl9saXN0OwogZXh0ZXJuIGxvbmcgKCpwYW5pY19ibGluaykoaW50IHN0YXRlKTsKIF9fcHJpbnRmKDEsIDIpCi12b2lkIHBhbmljKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotCV9fbm9yZXR1cm4gX19jb2xkOwordm9pZCBwYW5pYyhjb25zdCBjaGFyICpmbXQsIC4uLikgX19ub3JldHVybiBfX2NvbGQ7CiB2b2lkIG5taV9wYW5pYyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgY29uc3QgY2hhciAqbXNnKTsKIGV4dGVybiB2b2lkIG9vcHNfZW50ZXIodm9pZCk7CiBleHRlcm4gdm9pZCBvb3BzX2V4aXQodm9pZCk7CiB2b2lkIHByaW50X29vcHNfZW5kX21hcmtlcih2b2lkKTsKIGV4dGVybiBpbnQgb29wc19tYXlfcHJpbnQodm9pZCk7Ci12b2lkIGRvX2V4aXQobG9uZyBlcnJvcl9jb2RlKQotCV9fbm9yZXR1cm47Ci12b2lkIGNvbXBsZXRlX2FuZF9leGl0KHN0cnVjdCBjb21wbGV0aW9uICosIGxvbmcpCi0JX19ub3JldHVybjsKK3ZvaWQgZG9fZXhpdChsb25nIGVycm9yX2NvZGUpIF9fbm9yZXR1cm47Cit2b2lkIGNvbXBsZXRlX2FuZF9leGl0KHN0cnVjdCBjb21wbGV0aW9uICosIGxvbmcpIF9fbm9yZXR1cm47CiAKIC8qIEludGVybmFsLCBkbyBub3QgdXNlLiAqLwogaW50IF9fbXVzdF9jaGVjayBfa3N0cnRvdWwoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGxvbmcgKnJlcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t0aW1lLmggYi9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKaW5kZXggMmI2YTIwNC4uMGZiN2ZmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgva3RpbWUuaApAQCAtNjQsNiArNjQsMTMgQEAKIAkJKHsgKGt0aW1lX3QpeyAudHY2NCA9IChsaHMpLnR2NjQgKyAocmhzKS50djY0IH07IH0pCiAKIC8qCisgKiBTYW1lIGFzIGt0aW1lX2FkZCgpLCBidXQgYXZvaWRzIHVuZGVmaW5lZCBiZWhhdmlvdXIgb24gb3ZlcmZsb3c7IGhvd2V2ZXIsCisgKiB0aGlzIG1lYW5zIHRoYXQgeW91IG11c3QgY2hlY2sgdGhlIHJlc3VsdCBmb3Igb3ZlcmZsb3cgeW91cnNlbGYuCisgKi8KKyNkZWZpbmUga3RpbWVfYWRkX3Vuc2FmZShsaHMsIHJocykgXAorCQkoeyAoa3RpbWVfdCl7IC50djY0ID0gKHU2NCkgKGxocykudHY2NCArIChyaHMpLnR2NjQgfTsgfSkKKworLyoKICAqIEFkZCBhIGt0aW1lX3QgdmFyaWFibGUgYW5kIGEgc2NhbGFyIG5hbm9zZWNvbmQgdmFsdWUuCiAgKiByZXMgPSBrdCArIG5zdmFsOgogICovCkBAIC0yMzEsNiArMjM4LDExIEBACiAJcmV0dXJuIGt0aW1lX3N1Yl9ucyhrdCwgdXNlYyAqIE5TRUNfUEVSX1VTRUMpOwogfQogCitzdGF0aWMgaW5saW5lIGt0aW1lX3Qga3RpbWVfc3ViX21zKGNvbnN0IGt0aW1lX3Qga3QsIGNvbnN0IHU2NCBtc2VjKQoreworCXJldHVybiBrdGltZV9zdWJfbnMoa3QsIG1zZWMgKiBOU0VDX1BFUl9NU0VDKTsKK30KKwogZXh0ZXJuIGt0aW1lX3Qga3RpbWVfYWRkX3NhZmUoY29uc3Qga3RpbWVfdCBsaHMsIGNvbnN0IGt0aW1lX3QgcmhzKTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKaW5kZXggOWMyOGI0ZC4uMDFjMGI5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCisrKyBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaApAQCAtMjY1LDYgKzI2NSw3IEBACiAjZW5kaWYKIAlib29sIHByZWVtcHRlZDsKIAlzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCBhcmNoOworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGVudHJ5OwogfTsKIAogc3RhdGljIGlubGluZSBpbnQga3ZtX3ZjcHVfZXhpdGluZ19ndWVzdF9tb2RlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTc0OSw2ICs3NTAsOSBAQAogdm9pZCBrdm1fYXJjaF92Y3B1X3Bvc3RjcmVhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQga3ZtX2FyY2hfdmNwdV9kZXN0cm95KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKK2Jvb2wga3ZtX2FyY2hfaGFzX3ZjcHVfZGVidWdmcyh2b2lkKTsKK2ludCBrdm1fYXJjaF9jcmVhdGVfdmNwdV9kZWJ1Z2ZzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisKIGludCBrdm1fYXJjaF9oYXJkd2FyZV9lbmFibGUodm9pZCk7CiB2b2lkIGt2bV9hcmNoX2hhcmR3YXJlX2Rpc2FibGUodm9pZCk7CiBpbnQga3ZtX2FyY2hfaGFyZHdhcmVfc2V0dXAodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xlZHMuaCBiL2luY2x1ZGUvbGludXgvbGVkcy5oCmluZGV4IDhhM2I1ZDIuLmRkZmNiMmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGVkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbGVkcy5oCkBAIC0zNTksNiArMzU5LDExIEBACiAJc3RydWN0IGxlZF9pbmZvCSpsZWRzOwogfTsKIAorc3RydWN0IGdwaW9fZGVzYzsKK3R5cGVkZWYgaW50ICgqZ3Bpb19ibGlua19zZXRfdCkoc3RydWN0IGdwaW9fZGVzYyAqZGVzYywgaW50IHN0YXRlLAorCQkJCXVuc2lnbmVkIGxvbmcgKmRlbGF5X29uLAorCQkJCXVuc2lnbmVkIGxvbmcgKmRlbGF5X29mZik7CisKIC8qIEZvciB0aGUgbGVkcy1ncGlvIGRyaXZlciAqLwogc3RydWN0IGdwaW9fbGVkIHsKIAljb25zdCBjaGFyICpuYW1lOwpAQCAtMzgyLDkgKzM4Nyw3IEBACiAjZGVmaW5lIEdQSU9fTEVEX05PX0JMSU5LX0xPVwkwCS8qIE5vIGJsaW5rIEdQSU8gc3RhdGUgbG93ICovCiAjZGVmaW5lIEdQSU9fTEVEX05PX0JMSU5LX0hJR0gJMQkvKiBObyBibGluayBHUElPIHN0YXRlIGhpZ2ggKi8KICNkZWZpbmUgR1BJT19MRURfQkxJTksJCTIJLyogUGxlYXNlLCBibGluayAqLwotCWludAkJKCpncGlvX2JsaW5rX3NldCkoc3RydWN0IGdwaW9fZGVzYyAqZGVzYywgaW50IHN0YXRlLAotCQkJCQl1bnNpZ25lZCBsb25nICpkZWxheV9vbiwKLQkJCQkJdW5zaWduZWQgbG9uZyAqZGVsYXlfb2ZmKTsKKwlncGlvX2JsaW5rX3NldF90CWdwaW9fYmxpbmtfc2V0OwogfTsKIAogI2lmZGVmIENPTkZJR19ORVdfTEVEUwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sZ2xvY2suaCBiL2luY2x1ZGUvbGludXgvbGdsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MmViZDEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9sZ2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBTcGVjaWFsaXNlZCBsb2NhbC1nbG9iYWwgc3BpbmxvY2suIENhbiBvbmx5IGJlIGRlY2xhcmVkIGFzIGdsb2JhbCB2YXJpYWJsZXMKLSAqIHRvIGF2b2lkIG92ZXJoZWFkIGFuZCBrZWVwIHRoaW5ncyBzaW1wbGUgKGFuZCB3ZSBkb24ndCB3YW50IHRvIHN0YXJ0IHVzaW5nCi0gKiB0aGVzZSBpbnNpZGUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0cnVjdHVyZXMpLgotICoKLSAqICJsb2NhbC9nbG9iYWwgbG9ja3MiIChsZ2xvY2tzKSBjYW4gYmUgdXNlZCB0bzoKLSAqCi0gKiAtIFByb3ZpZGUgZmFzdCBleGNsdXNpdmUgYWNjZXNzIHRvIHBlci1DUFUgZGF0YSwgd2l0aCBleGNsdXNpdmUgYWNjZXNzIHRvCi0gKiAgIGFub3RoZXIgQ1BVJ3MgZGF0YSBhbGxvd2VkIGJ1dCBwb3NzaWJseSBzdWJqZWN0IHRvIGNvbnRlbnRpb24sIGFuZCB0bwotICogICBwcm92aWRlIHZlcnkgc2xvdyBleGNsdXNpdmUgYWNjZXNzIHRvIGFsbCBwZXItQ1BVIGRhdGEuCi0gKiAtIE9yIHRvIHByb3ZpZGUgdmVyeSBmYXN0IGFuZCBzY2FsYWJsZSByZWFkIHNlcmlhbGlzYXRpb24sIGFuZCB0byBwcm92aWRlCi0gKiAgIHZlcnkgc2xvdyBleGNsdXNpdmUgc2VyaWFsaXNhdGlvbiBvZiBkYXRhIChub3QgbmVjZXNzYXJpbHkgcGVyLUNQVSBkYXRhKS4KLSAqCi0gKiBCcmxvY2tzIGFyZSBhbHNvIGltcGxlbWVudGVkIGFzIGEgc2hvcnQtaGFuZCBub3RhdGlvbiBmb3IgdGhlIGxhdHRlciB1c2UKLSAqIGNhc2UuCi0gKgotICogQ29weXJpZ2h0IDIwMDksIDIwMTAsIE5pY2sgUGlnZ2luLCBOb3ZlbGwgSW5jLgotICovCi0jaWZuZGVmIF9fTElOVVhfTEdMT0NLX0gKLSNkZWZpbmUgX19MSU5VWF9MR0xPQ0tfSAotCi0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KLQotI2lmZGVmIENPTkZJR19TTVAKLQotI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCi0jZGVmaW5lIExPQ0tERVBfSU5JVF9NQVAgbG9ja2RlcF9pbml0X21hcAotI2Vsc2UKLSNkZWZpbmUgTE9DS0RFUF9JTklUX01BUChhLCBiLCBjLCBkKQotI2VuZGlmCi0KLXN0cnVjdCBsZ2xvY2sgewotCWFyY2hfc3BpbmxvY2tfdCBfX3BlcmNwdSAqbG9jazsKLSNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQwotCXN0cnVjdCBsb2NrX2NsYXNzX2tleSBsb2NrX2tleTsKLQlzdHJ1Y3QgbG9ja2RlcF9tYXAgICAgbG9ja19kZXBfbWFwOwotI2VuZGlmCi19OwotCi0jZGVmaW5lIERFRklORV9MR0xPQ0sobmFtZSkJCQkJCQlcCi0Jc3RhdGljIERFRklORV9QRVJfQ1BVKGFyY2hfc3BpbmxvY2tfdCwgbmFtZSAjIyBfbG9jaykJCVwKLQk9IF9fQVJDSF9TUElOX0xPQ0tfVU5MT0NLRUQ7CQkJCQlcCi0Jc3RydWN0IGxnbG9jayBuYW1lID0geyAubG9jayA9ICZuYW1lICMjIF9sb2NrIH0KLQotI2RlZmluZSBERUZJTkVfU1RBVElDX0xHTE9DSyhuYW1lKQkJCQkJXAotCXN0YXRpYyBERUZJTkVfUEVSX0NQVShhcmNoX3NwaW5sb2NrX3QsIG5hbWUgIyMgX2xvY2spCQlcCi0JPSBfX0FSQ0hfU1BJTl9MT0NLX1VOTE9DS0VEOwkJCQkJXAotCXN0YXRpYyBzdHJ1Y3QgbGdsb2NrIG5hbWUgPSB7IC5sb2NrID0gJm5hbWUgIyMgX2xvY2sgfQotCi12b2lkIGxnX2xvY2tfaW5pdChzdHJ1Y3QgbGdsb2NrICpsZywgY2hhciAqbmFtZSk7Ci0KLXZvaWQgbGdfbG9jYWxfbG9jayhzdHJ1Y3QgbGdsb2NrICpsZyk7Ci12b2lkIGxnX2xvY2FsX3VubG9jayhzdHJ1Y3QgbGdsb2NrICpsZyk7Ci12b2lkIGxnX2xvY2FsX2xvY2tfY3B1KHN0cnVjdCBsZ2xvY2sgKmxnLCBpbnQgY3B1KTsKLXZvaWQgbGdfbG9jYWxfdW5sb2NrX2NwdShzdHJ1Y3QgbGdsb2NrICpsZywgaW50IGNwdSk7Ci0KLXZvaWQgbGdfZG91YmxlX2xvY2soc3RydWN0IGxnbG9jayAqbGcsIGludCBjcHUxLCBpbnQgY3B1Mik7Ci12b2lkIGxnX2RvdWJsZV91bmxvY2soc3RydWN0IGxnbG9jayAqbGcsIGludCBjcHUxLCBpbnQgY3B1Mik7Ci0KLXZvaWQgbGdfZ2xvYmFsX2xvY2soc3RydWN0IGxnbG9jayAqbGcpOwotdm9pZCBsZ19nbG9iYWxfdW5sb2NrKHN0cnVjdCBsZ2xvY2sgKmxnKTsKLQotI2Vsc2UKLS8qIFdoZW4gIUNPTkZJR19TTVAsIG1hcCBsZ2xvY2sgdG8gc3BpbmxvY2sgKi8KLSNkZWZpbmUgbGdsb2NrIHNwaW5sb2NrCi0jZGVmaW5lIERFRklORV9MR0xPQ0sobmFtZSkgREVGSU5FX1NQSU5MT0NLKG5hbWUpCi0jZGVmaW5lIERFRklORV9TVEFUSUNfTEdMT0NLKG5hbWUpIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobmFtZSkKLSNkZWZpbmUgbGdfbG9ja19pbml0KGxnLCBuYW1lKSBzcGluX2xvY2tfaW5pdChsZykKLSNkZWZpbmUgbGdfbG9jYWxfbG9jayBzcGluX2xvY2sKLSNkZWZpbmUgbGdfbG9jYWxfdW5sb2NrIHNwaW5fdW5sb2NrCi0jZGVmaW5lIGxnX2xvY2FsX2xvY2tfY3B1KGxnLCBjcHUpIHNwaW5fbG9jayhsZykKLSNkZWZpbmUgbGdfbG9jYWxfdW5sb2NrX2NwdShsZywgY3B1KSBzcGluX3VubG9jayhsZykKLSNkZWZpbmUgbGdfZ2xvYmFsX2xvY2sgc3Bpbl9sb2NrCi0jZGVmaW5lIGxnX2dsb2JhbF91bmxvY2sgc3Bpbl91bmxvY2sKLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGlnaHRudm0uaCBiL2luY2x1ZGUvbGludXgvbGlnaHRudm0uaAppbmRleCBiYTc4YjgzLi5kMTkwNzg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpZ2h0bnZtLmgKKysrIGIvaW5jbHVkZS9saW51eC9saWdodG52bS5oCkBAIC0zNTIsNyArMzUyLDEwIEBACiAKIAkvKiBCYWNrZW5kIGRldmljZSAqLwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxOworCXN0cnVjdCBkZXZpY2UgZGV2OworCXN0cnVjdCBkZXZpY2UgKnBhcmVudF9kZXY7CiAJY2hhciBuYW1lW0RJU0tfTkFNRV9MRU5dOworCXZvaWQgKnByaXZhdGVfZGF0YTsKIAogCXN0cnVjdCBtdXRleCBtbG9jazsKIAlzcGlubG9ja190IGxvY2s7CkBAIC01MjQsOSArNTI3LDkgQEAKIAkJCQkJCQkJdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCBudm1fcHV0X2JsayhzdHJ1Y3QgbnZtX2RldiAqLCBzdHJ1Y3QgbnZtX2Jsb2NrICopOwogCi1leHRlcm4gaW50IG52bV9yZWdpc3RlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBjaGFyICosCi0JCQkJCQlzdHJ1Y3QgbnZtX2Rldl9vcHMgKik7Ci1leHRlcm4gdm9pZCBudm1fdW5yZWdpc3RlcihjaGFyICopOworZXh0ZXJuIHN0cnVjdCBudm1fZGV2ICpudm1fYWxsb2NfZGV2KGludCk7CitleHRlcm4gaW50IG52bV9yZWdpc3RlcihzdHJ1Y3QgbnZtX2RldiAqKTsKK2V4dGVybiB2b2lkIG52bV91bnJlZ2lzdGVyKHN0cnVjdCBudm1fZGV2ICopOwogCiB2b2lkIG52bV9tYXJrX2JsayhzdHJ1Y3QgbnZtX2RldiAqZGV2LCBzdHJ1Y3QgcHBhX2FkZHIgcHBhLCBpbnQgdHlwZSk7CiAKQEAgLTU3NSwxMSArNTc4LDE0IEBACiAjZWxzZSAvKiBDT05GSUdfTlZNICovCiBzdHJ1Y3QgbnZtX2Rldl9vcHM7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG52bV9yZWdpc3RlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqZGlza19uYW1lLAotCQkJCQkJCXN0cnVjdCBudm1fZGV2X29wcyAqb3BzKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbnZtX2RldiAqbnZtX2FsbG9jX2RldihpbnQgbm9kZSkKK3sKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IG52bV9yZWdpc3RlcihzdHJ1Y3QgbnZtX2RldiAqZGV2KQogewogCXJldHVybiAtRUlOVkFMOwogfQotc3RhdGljIGlubGluZSB2b2lkIG52bV91bnJlZ2lzdGVyKGNoYXIgKmRpc2tfbmFtZSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBudm1fdW5yZWdpc3RlcihzdHJ1Y3QgbnZtX2RldiAqZGV2KSB7fQogI2VuZGlmIC8qIENPTkZJR19OVk0gKi8KICNlbmRpZiAvKiBMSUdIVE5WTS5IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpc3QuaCBiL2luY2x1ZGUvbGludXgvbGlzdC5oCmluZGV4IDUxODMxMzguLjU4MDllOWEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xpc3QuaApAQCAtMzgxLDggKzM4MSwxMSBAQAogICoKICAqIE5vdGUgdGhhdCBpZiB0aGUgbGlzdCBpcyBlbXB0eSwgaXQgcmV0dXJucyBOVUxMLgogICovCi0jZGVmaW5lIGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbChwdHIsIHR5cGUsIG1lbWJlcikgXAotCSghbGlzdF9lbXB0eShwdHIpID8gbGlzdF9maXJzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgOiBOVUxMKQorI2RlZmluZSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwocHRyLCB0eXBlLCBtZW1iZXIpICh7IFwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkX18gPSAocHRyKTsgXAorCXN0cnVjdCBsaXN0X2hlYWQgKnBvc19fID0gUkVBRF9PTkNFKGhlYWRfXy0+bmV4dCk7IFwKKwlwb3NfXyAhPSBoZWFkX18gPyBsaXN0X2VudHJ5KHBvc19fLCB0eXBlLCBtZW1iZXIpIDogTlVMTDsgXAorfSkKIAogLyoqCiAgKiBsaXN0X25leHRfZW50cnkgLSBnZXQgdGhlIG5leHQgZWxlbWVudCBpbiBsaXN0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpdmVwYXRjaC5oIGIvaW5jbHVkZS9saW51eC9saXZlcGF0Y2guaAppbmRleCBhOTNhMGIyLi45MDcyZjA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpdmVwYXRjaC5oCisrKyBiL2luY2x1ZGUvbGludXgvbGl2ZXBhdGNoLmgKQEAgLTExNiw2ICsxMTYsOSBAQAogaW50IGtscF9lbmFibGVfcGF0Y2goc3RydWN0IGtscF9wYXRjaCAqKTsKIGludCBrbHBfZGlzYWJsZV9wYXRjaChzdHJ1Y3Qga2xwX3BhdGNoICopOwogCit2b2lkIGFyY2hfa2xwX2luaXRfb2JqZWN0X2xvYWRlZChzdHJ1Y3Qga2xwX3BhdGNoICpwYXRjaCwKKwkJCQkgc3RydWN0IGtscF9vYmplY3QgKm9iaik7CisKIC8qIENhbGxlZCBmcm9tIHRoZSBtb2R1bGUgbG9hZGVyIGR1cmluZyBtb2R1bGUgY29taW5nL2dvaW5nIHN0YXRlcyAqLwogaW50IGtscF9tb2R1bGVfY29taW5nKHN0cnVjdCBtb2R1bGUgKm1vZCk7CiB2b2lkIGtscF9tb2R1bGVfZ29pbmcoc3RydWN0IG1vZHVsZSAqbW9kKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2RlcC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZGVwLmgKaW5kZXggZWFiZTAxMy4uYzE0NThmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZGVwLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZGVwLmgKQEAgLTE2LDYgKzE2LDggQEAKIGV4dGVybiBpbnQgcHJvdmVfbG9ja2luZzsKIGV4dGVybiBpbnQgbG9ja19zdGF0OwogCisjZGVmaW5lIE1BWF9MT0NLREVQX1NVQkNMQVNTRVMJCThVTAorCiAjaWZkZWYgQ09ORklHX0xPQ0tERVAKIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KQEAgLTI5LDggKzMxLDYgQEAKICAqLwogI2RlZmluZSBYWFhfTE9DS19VU0FHRV9TVEFURVMJCSgxKzMqNCkKIAotI2RlZmluZSBNQVhfTE9DS0RFUF9TVUJDTEFTU0VTCQk4VUwKLQogLyoKICAqIE5SX0xPQ0tERVBfQ0FDSElOR19DTEFTU0VTIC4uLiBOdW1iZXIgb2YgY2xhc3NlcwogICogY2FjaGVkIGluIHRoZSBpbnN0YW5jZSBvZiBsb2NrZGVwX21hcApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sc21fYXVkaXQuaCBiL2luY2x1ZGUvbGludXgvbHNtX2F1ZGl0LmgKaW5kZXggZmZiOWM5ZC4uZTU4ZTU3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sc21fYXVkaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xzbV9hdWRpdC5oCkBAIC01OSw2ICs1OSw3IEBACiAjZGVmaW5lIExTTV9BVURJVF9EQVRBX0lOT0RFCTkKICNkZWZpbmUgTFNNX0FVRElUX0RBVEFfREVOVFJZCTEwCiAjZGVmaW5lIExTTV9BVURJVF9EQVRBX0lPQ1RMX09QCTExCisjZGVmaW5lIExTTV9BVURJVF9EQVRBX0ZJTEUJMTIKIAl1bmlvbiAJewogCQlzdHJ1Y3QgcGF0aCBwYXRoOwogCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CkBAIC03NSw2ICs3Niw3IEBACiAjZW5kaWYKIAkJY2hhciAqa21vZF9uYW1lOwogCQlzdHJ1Y3QgbHNtX2lvY3Rsb3BfYXVkaXQgKm9wOworCQlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAl9IHU7CiAJLyogdGhpcyB1bmlvbiBjb250YWlucyBMU00gc3BlY2lmaWMgZGF0YSAqLwogCXVuaW9uIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbHNtX2hvb2tzLmggYi9pbmNsdWRlL2xpbnV4L2xzbV9ob29rcy5oCmluZGV4IDEwMWJmMTkuLjU1OGFkZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbHNtX2hvb2tzLmgKKysrIGIvaW5jbHVkZS9saW51eC9sc21faG9va3MuaApAQCAtMTUxLDYgKzE1MSwxNiBAQAogICoJQG5hbWUgbmFtZSBvZiB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCB1c2VkIHRvIGNyZWF0ZSBmaWxlCiAgKglAY3R4IHBvaW50ZXIgdG8gcGxhY2UgdGhlIHBvaW50ZXIgdG8gdGhlIHJlc3VsdGluZyBjb250ZXh0IGluLgogICoJQGN0eGxlbiBwb2ludCB0byBwbGFjZSB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgY29udGV4dC4KKyAqIEBkZW50cnlfY3JlYXRlX2ZpbGVzX2FzOgorICoJQ29tcHV0ZSBhIGNvbnRleHQgZm9yIGEgZGVudHJ5IGFzIHRoZSBpbm9kZSBpcyBub3QgeWV0IGF2YWlsYWJsZQorICoJYW5kIHNldCB0aGF0IGNvbnRleHQgaW4gcGFzc2VkIGluIGNyZWRzIHNvIHRoYXQgbmV3IGZpbGVzIGFyZQorICoJY3JlYXRlZCB1c2luZyB0aGF0IGNvbnRleHQuIENvbnRleHQgaXMgY2FsY3VsYXRlZCB1c2luZyB0aGUKKyAqCXBhc3NlZCBpbiBjcmVkcyBhbmQgbm90IHRoZSBjcmVkcyBvZiB0aGUgY2FsbGVyLgorICoJQGRlbnRyeSBkZW50cnkgdG8gdXNlIGluIGNhbGN1bGF0aW5nIHRoZSBjb250ZXh0LgorICoJQG1vZGUgbW9kZSB1c2VkIHRvIGRldGVybWluZSByZXNvdXJjZSB0eXBlLgorICoJQG5hbWUgbmFtZSBvZiB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCB1c2VkIHRvIGNyZWF0ZSBmaWxlCisgKglAb2xkIGNyZWRzIHdoaWNoIHNob3VsZCBiZSB1c2VkIGZvciBjb250ZXh0IGNhbGN1bGF0aW9uCisgKglAbmV3IGNyZWRzIHRvIG1vZGlmeQogICoKICAqCiAgKiBTZWN1cml0eSBob29rcyBmb3IgaW5vZGUgb3BlcmF0aW9ucy4KQEAgLTQwMSw2ICs0MTEsMjMgQEAKICAqCUBpbm9kZSBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIGlub2RlLgogICoJQHNlY2lkIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUgcmVzdWx0IHdpbGwgYmUgc2F2ZWQuCiAgKglJbiBjYXNlIG9mIGZhaWx1cmUsIEBzZWNpZCB3aWxsIGJlIHNldCB0byB6ZXJvLgorICogQGlub2RlX2NvcHlfdXA6CisgKglBIGZpbGUgaXMgYWJvdXQgdG8gYmUgY29waWVkIHVwIGZyb20gbG93ZXIgbGF5ZXIgdG8gdXBwZXIgbGF5ZXIgb2YKKyAqCW92ZXJsYXkgZmlsZXN5c3RlbS4gU2VjdXJpdHkgbW9kdWxlIGNhbiBwcmVwYXJlIGEgc2V0IG9mIG5ldyBjcmVkcworICoJYW5kIG1vZGlmeSBhcyBuZWVkIGJlIGFuZCByZXR1cm4gbmV3IGNyZWRzLiBDYWxsZXIgd2lsbCBzd2l0Y2ggdG8KKyAqCW5ldyBjcmVkcyB0ZW1wb3JhcmlseSB0byBjcmVhdGUgbmV3IGZpbGUgYW5kIHJlbGVhc2UgbmV3bHkgYWxsb2NhdGVkCisgKgljcmVkcy4KKyAqCUBzcmMgaW5kaWNhdGVzIHRoZSB1bmlvbiBkZW50cnkgb2YgZmlsZSB0aGF0IGlzIGJlaW5nIGNvcGllZCB1cC4KKyAqCUBuZXcgcG9pbnRlciB0byBwb2ludGVyIHRvIHJldHVybiBuZXdseSBhbGxvY2F0ZWQgY3JlZHMuCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZXJyb3IuCisgKiBAaW5vZGVfY29weV91cF94YXR0cjoKKyAqCUZpbHRlciB0aGUgeGF0dHJzIGJlaW5nIGNvcGllZCB1cCB3aGVuIGEgdW5pb25lZCBmaWxlIGlzIGNvcGllZAorICoJdXAgZnJvbSBhIGxvd2VyIGxheWVyIHRvIHRoZSB1bmlvbi9vdmVybGF5IGxheWVyLgorICoJQG5hbWUgaW5kaWNhdGVzIHRoZSBuYW1lIG9mIHRoZSB4YXR0ci4KKyAqCVJldHVybnMgMCB0byBhY2NlcHQgdGhlIHhhdHRyLCAxIHRvIGRpc2NhcmQgdGhlIHhhdHRyLCAtRU9QTk9UU1VQUCBpZgorICoJc2VjdXJpdHkgbW9kdWxlIGRvZXMgbm90IGtub3cgYWJvdXQgYXR0cmlidXRlIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZQorICoJdG8gYWJvcnQgdGhlIGNvcHkgdXAuIE5vdGUgdGhhdCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciByZWFkaW5nCisgKglhbmQgd3JpdGluZyB0aGUgeGF0dHJzIGFzIHRoaXMgaG9vayBpcyBtZXJlbHkgYSBmaWx0ZXIuCiAgKgogICogU2VjdXJpdHkgaG9va3MgZm9yIGZpbGUgb3BlcmF0aW9ucwogICoKQEAgLTEzNTgsNiArMTM4NSwxMCBAQAogCWludCAoKmRlbnRyeV9pbml0X3NlY3VyaXR5KShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAogCQkJCQljb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwgdm9pZCAqKmN0eCwKIAkJCQkJdTMyICpjdHhsZW4pOworCWludCAoKmRlbnRyeV9jcmVhdGVfZmlsZXNfYXMpKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQkJCXN0cnVjdCBxc3RyICpuYW1lLAorCQkJCQljb25zdCBzdHJ1Y3QgY3JlZCAqb2xkLAorCQkJCQlzdHJ1Y3QgY3JlZCAqbmV3KTsKIAogCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1BBVEgKQEAgLTE0MjUsNiArMTQ1Niw4IEBACiAJaW50ICgqaW5vZGVfbGlzdHNlY3VyaXR5KShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpidWZmZXIsCiAJCQkJCXNpemVfdCBidWZmZXJfc2l6ZSk7CiAJdm9pZCAoKmlub2RlX2dldHNlY2lkKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgKnNlY2lkKTsKKwlpbnQgKCppbm9kZV9jb3B5X3VwKShzdHJ1Y3QgZGVudHJ5ICpzcmMsIHN0cnVjdCBjcmVkICoqbmV3KTsKKwlpbnQgKCppbm9kZV9jb3B5X3VwX3hhdHRyKShjb25zdCBjaGFyICpuYW1lKTsKIAogCWludCAoKmZpbGVfcGVybWlzc2lvbikoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtYXNrKTsKIAlpbnQgKCpmaWxlX2FsbG9jX3NlY3VyaXR5KShzdHJ1Y3QgZmlsZSAqZmlsZSk7CkBAIC0xNDU1LDcgKzE0ODgsNiBAQAogCWludCAoKmtlcm5lbF9hY3RfYXMpKHN0cnVjdCBjcmVkICpuZXcsIHUzMiBzZWNpZCk7CiAJaW50ICgqa2VybmVsX2NyZWF0ZV9maWxlc19hcykoc3RydWN0IGNyZWQgKm5ldywgc3RydWN0IGlub2RlICppbm9kZSk7CiAJaW50ICgqa2VybmVsX21vZHVsZV9yZXF1ZXN0KShjaGFyICprbW9kX25hbWUpOwotCWludCAoKmtlcm5lbF9tb2R1bGVfZnJvbV9maWxlKShzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAJaW50ICgqa2VybmVsX3JlYWRfZmlsZSkoc3RydWN0IGZpbGUgKmZpbGUsIGVudW0ga2VybmVsX3JlYWRfZmlsZV9pZCBpZCk7CiAJaW50ICgqa2VybmVsX3Bvc3RfcmVhZF9maWxlKShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBsb2ZmX3Qgc2l6ZSwKIAkJCQkgICAgIGVudW0ga2VybmVsX3JlYWRfZmlsZV9pZCBpZCk7CkBAIC0xNjU2LDYgKzE2ODgsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgc2JfY2xvbmVfbW50X29wdHM7CiAJc3RydWN0IGxpc3RfaGVhZCBzYl9wYXJzZV9vcHRzX3N0cjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGRlbnRyeV9pbml0X3NlY3VyaXR5OworCXN0cnVjdCBsaXN0X2hlYWQgZGVudHJ5X2NyZWF0ZV9maWxlc19hczsKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfUEFUSAogCXN0cnVjdCBsaXN0X2hlYWQgcGF0aF91bmxpbms7CiAJc3RydWN0IGxpc3RfaGVhZCBwYXRoX21rZGlyOwpAQCAtMTY5Niw2ICsxNzI5LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGlub2RlX3NldHNlY3VyaXR5OwogCXN0cnVjdCBsaXN0X2hlYWQgaW5vZGVfbGlzdHNlY3VyaXR5OwogCXN0cnVjdCBsaXN0X2hlYWQgaW5vZGVfZ2V0c2VjaWQ7CisJc3RydWN0IGxpc3RfaGVhZCBpbm9kZV9jb3B5X3VwOworCXN0cnVjdCBsaXN0X2hlYWQgaW5vZGVfY29weV91cF94YXR0cjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZpbGVfcGVybWlzc2lvbjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZpbGVfYWxsb2Nfc2VjdXJpdHk7CiAJc3RydWN0IGxpc3RfaGVhZCBmaWxlX2ZyZWVfc2VjdXJpdHk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21idXMuaCBiL2luY2x1ZGUvbGludXgvbWJ1cy5oCmluZGV4IGQ2MTAyMzIuLjI5MzFhYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWJ1cy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWJ1cy5oCkBAIC0xMSw2ICsxMSw4IEBACiAjaWZuZGVmIF9fTElOVVhfTUJVU19ICiAjZGVmaW5lIF9fTElOVVhfTUJVU19ICiAKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCiBzdHJ1Y3QgcmVzb3VyY2U7CiAKIHN0cnVjdCBtYnVzX2RyYW1fdGFyZ2V0X2luZm8KQEAgLTU1LDYgKzU3LDggQEAKICNpZmRlZiBDT05GSUdfUExBVF9PUklPTgogZXh0ZXJuIGNvbnN0IHN0cnVjdCBtYnVzX2RyYW1fdGFyZ2V0X2luZm8gKm12X21idXNfZHJhbV9pbmZvKHZvaWQpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBtYnVzX2RyYW1fdGFyZ2V0X2luZm8gKm12X21idXNfZHJhbV9pbmZvX25vb3ZlcmxhcCh2b2lkKTsKK2ludCBtdmVidV9tYnVzX2dldF9pb193aW5faW5mbyhwaHlzX2FkZHJfdCBwaHlhZGRyLCB1MzIgKnNpemUsIHU4ICp0YXJnZXQsCisJCQkgICAgICAgdTggKmF0dHIpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IG1idXNfZHJhbV90YXJnZXRfaW5mbyAqbXZfbWJ1c19kcmFtX2luZm8odm9pZCkKIHsKQEAgLTY0LDE0ICs2OCwyNCBAQAogewogCXJldHVybiBOVUxMOwogfQorc3RhdGljIGlubGluZSBpbnQgbXZlYnVfbWJ1c19nZXRfaW9fd2luX2luZm8ocGh5c19hZGRyX3QgcGh5YWRkciwgdTMyICpzaXplLAorCQkJCQkgICAgIHU4ICp0YXJnZXQsIHU4ICphdHRyKQoreworCS8qCisJICogT24gYWxsIEFSTTMyIE1WRUJVIHBsYXRmb3JtcyB3aXRoIE1CdXMgc3VwcG9ydCwgdGhpcyBzdHViCisJICogZnVuY3Rpb24gd2lsbCBub3QgZ2V0IGNhbGxlZC4gVGhlIHJlYWwgZnVuY3Rpb24gZnJvbSB0aGUKKwkgKiBNQnVzIGRyaXZlciBpcyBjYWxsZWQgaW5zdGVhZC4gQVJNNjQgTVZFQlUgcGxhdGZvcm1zIGxpa2UKKwkgKiB0aGUgQXJtYWRhIDM3MDAgY291bGQgdXNlIHRoZSBtdl94b3IgZGV2aWNlIGRyaXZlciB3aGljaCBjYWxscworCSAqIGludG8gdGhpcyBmdW5jdGlvbgorCSAqLworCXJldHVybiAtRUlOVkFMOworfQogI2VuZGlmCiAKIGludCBtdmVidV9tYnVzX3NhdmVfY3B1X3RhcmdldCh1MzIgX19pb21lbSAqc3RvcmVfYWRkcik7CiB2b2lkIG12ZWJ1X21idXNfZ2V0X3BjaWVfbWVtX2FwZXJ0dXJlKHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKIHZvaWQgbXZlYnVfbWJ1c19nZXRfcGNpZV9pb19hcGVydHVyZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CiBpbnQgbXZlYnVfbWJ1c19nZXRfZHJhbV93aW5faW5mbyhwaHlzX2FkZHJfdCBwaHlhZGRyLCB1OCAqdGFyZ2V0LCB1OCAqYXR0cik7Ci1pbnQgbXZlYnVfbWJ1c19nZXRfaW9fd2luX2luZm8ocGh5c19hZGRyX3QgcGh5YWRkciwgdTMyICpzaXplLCB1OCAqdGFyZ2V0LAotCQkJICAgICAgIHU4ICphdHRyKTsKIGludCBtdmVidV9tYnVzX2FkZF93aW5kb3dfcmVtYXBfYnlfaWQodW5zaWduZWQgaW50IHRhcmdldCwKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgYXR0cmlidXRlLAogCQkJCSAgICAgIHBoeXNfYWRkcl90IGJhc2UsIHNpemVfdCBzaXplLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tY2IuaCBiL2luY2x1ZGUvbGludXgvbWNiLmgKaW5kZXggZWFkMTNkMi4uNDA5N2FjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tY2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L21jYi5oCkBAIC00MSwxNSArNDEsMTcgQEAKIAljaGFyIG5hbWVbQ0hBTUVMRU9OX0ZJTEVOQU1FX0xFTiArIDFdOwogCWludCAoKmdldF9pcnEpKHN0cnVjdCBtY2JfZGV2aWNlICpkZXYpOwogfTsKLSNkZWZpbmUgdG9fbWNiX2J1cyhiKSBjb250YWluZXJfb2YoKGIpLCBzdHJ1Y3QgbWNiX2J1cywgZGV2KQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtY2JfYnVzICp0b19tY2JfYnVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG1jYl9idXMsIGRldik7Cit9CiAKIC8qKgogICogc3RydWN0IG1jYl9kZXZpY2UgLSBNRU4gQ2hhbWVsZW9uIEJ1cyBkZXZpY2UKICAqCi0gKiBAYnVzX2xpc3Q6IGludGVybmFsIGxpc3QgaGFuZGxpbmcgZm9yIGJ1cyBjb2RlCiAgKiBAZGV2OiBkZXZpY2UgaW4ga2VybmVsIHJlcHJlc2VudGF0aW9uCiAgKiBAYnVzOiBtY2IgYnVzIHRoZSBkZXZpY2UgaXMgcGx1Z2dlZCB0bwotICogQHN1Ym9yZGluYXRlOiBzdWJvcmRpbmF0ZSBNQ0J1cyBpbiBjYXNlIG9mIGJyaWRnZQogICogQGlzX2FkZGVkOiBmbGFnIHRvIGNoZWNrIGlmIGRldmljZSBpcyBhZGRlZCB0byBidXMKICAqIEBkcml2ZXI6IGFzc29jaWF0ZWQgbWNiX2RyaXZlcgogICogQGlkOiBtY2IgZGV2aWNlIGlkCkBAIC02MiwxMCArNjQsOCBAQAogICogQG1lbW9yeTogbWVtb3J5IHJlc291cmNlCiAgKi8KIHN0cnVjdCBtY2JfZGV2aWNlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGJ1c19saXN0OwogCXN0cnVjdCBkZXZpY2UgZGV2OwogCXN0cnVjdCBtY2JfYnVzICpidXM7Ci0Jc3RydWN0IG1jYl9idXMgKnN1Ym9yZGluYXRlOwogCWJvb2wgaXNfYWRkZWQ7CiAJc3RydWN0IG1jYl9kcml2ZXIgKmRyaXZlcjsKIAl1MTYgaWQ7CkBAIC03Niw4ICs3NiwxMyBAQAogCWludCByZXY7CiAJc3RydWN0IHJlc291cmNlIGlycTsKIAlzdHJ1Y3QgcmVzb3VyY2UgbWVtOworCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXY7CiB9OwotI2RlZmluZSB0b19tY2JfZGV2aWNlKHgpIGNvbnRhaW5lcl9vZigoeCksIHN0cnVjdCBtY2JfZGV2aWNlLCBkZXYpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1jYl9kZXZpY2UgKnRvX21jYl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgbWNiX2RldmljZSwgZGV2KTsKK30KIAogLyoqCiAgKiBzdHJ1Y3QgbWNiX2RyaXZlciAtIE1FTiBDaGFtZWxlb24gQnVzIGRldmljZSBkcml2ZXIKQEAgLTk1LDcgKzEwMCwxMSBAQAogCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBtY2JfZGV2aWNlICptZGV2KTsKIAl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBtY2JfZGV2aWNlICptZGV2KTsKIH07Ci0jZGVmaW5lIHRvX21jYl9kcml2ZXIoeCkgY29udGFpbmVyX29mKCh4KSwgc3RydWN0IG1jYl9kcml2ZXIsIGRyaXZlcikKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWNiX2RyaXZlciAqdG9fbWNiX2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXJldHVybiBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3QgbWNiX2RyaXZlciwgZHJpdmVyKTsKK30KIAogc3RhdGljIGlubGluZSB2b2lkICptY2JfZ2V0X2RydmRhdGEoc3RydWN0IG1jYl9kZXZpY2UgKmRldikKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmggYi9pbmNsdWRlL2xpbnV4L21lbXBvbGljeS5oCmluZGV4IDQ0MjlkMjUuLjVlNWIyOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtcG9saWN5LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZW1wb2xpY3kuaApAQCAtMTk1LDYgKzE5NSw3IEBACiB9CiAKIGV4dGVybiBpbnQgbXBvbF9taXNwbGFjZWQoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgbXBvbF9wdXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICopOwogCiAjZWxzZQogCkBAIC0yOTcsNSArMjk4LDggQEAKIAlyZXR1cm4gLTE7IC8qIG5vIG5vZGUgcHJlZmVyZW5jZSAqLwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbXBvbF9wdXRfdGFza19wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworfQogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkLzg4cG04MHguaCBiL2luY2x1ZGUvbGludXgvbWZkLzg4cG04MHguaAppbmRleCBkNDA5Y2ViLi5jMTE4YTdlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC84OHBtODB4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvODhwbTgweC5oCkBAIC0zNTAsNyArMzUwLDcgQEAKIAlpbnQgaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAogCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQotCQlzZXRfYml0KCgxIDw8IGlycSksICZjaGlwLT53dV9mbGFnKTsKKwkJc2V0X2JpdChpcnEsICZjaGlwLT53dV9mbGFnKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzYyLDcgKzM2Miw3IEBACiAJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAKIAlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSkKLQkJY2xlYXJfYml0KCgxIDw8IGlycSksICZjaGlwLT53dV9mbGFnKTsKKwkJY2xlYXJfYml0KGlycSwgJmNoaXAtPnd1X2ZsYWcpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9hYng1MDAvYWI4NTAwLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hYng1MDAvYWI4NTAwLmgKaW5kZXggOTQ3NWZlZS4uZDMzYzI0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvYWJ4NTAwL2FiODUwMC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2FieDUwMC9hYjg1MDAuaApAQCAtNjMsNiArNjMsOCBAQAogI2RlZmluZSBBQjg1MDBfU1RFX1RFU1QJCTB4MTQKICNkZWZpbmUgQUI4NTAwX09UUF9FTVVMCQkweDE1CiAKKyNkZWZpbmUgQUI4NTAwX0RFQlVHX0ZJRUxEX0xBU1QJMHgxNgorCiAvKgogICogSW50ZXJydXB0cwogICogVmFsdWVzIHVzZWQgdG8gaW5kZXggaW50byBhcnJheSBhYjg1MDBfaXJxX3JlZ29mZnNldFtdIGRlZmluZWQgaW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2FjMTAwLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hYzEwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTQ4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hYzEwMC5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogRnVuY3Rpb25zIGFuZCByZWdpc3RlcnMgdG8gYWNjZXNzIEFDMTAwIGNvZGVjIC8gUlRDIGNvbWJvIElDLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBDaGVuLVl1IFRzYWkKKyAqCisgKiBDaGVuLVl1IFRzYWkgPHdlbnNAY3NpZS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX0FDMTAwX0gKKyNkZWZpbmUgX19MSU5VWF9NRkRfQUMxMDBfSAorCisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKK3N0cnVjdCBhYzEwMF9kZXYgeworCXN0cnVjdCBkZXZpY2UJCQkqZGV2OworCXN0cnVjdCByZWdtYXAJCQkqcmVnbWFwOworfTsKKworLyogQXVkaW8gY29kZWMgcmVsYXRlZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgQUMxMDBfQ0hJUF9BVURJT19SU1QJCTB4MDAKKyNkZWZpbmUgQUMxMDBfUExMX0NUUkwxCQkJMHgwMQorI2RlZmluZSBBQzEwMF9QTExfQ1RSTDIJCQkweDAyCisjZGVmaW5lIEFDMTAwX1NZU0NMS19DVFJMCQkweDAzCisjZGVmaW5lIEFDMTAwX01PRF9DTEtfRU5BCQkweDA0CisjZGVmaW5lIEFDMTAwX01PRF9SU1RfQ1RSTAkJMHgwNQorI2RlZmluZSBBQzEwMF9JMlNfU1JfQ1RSTAkJMHgwNgorCisvKiBJMlMxIGludGVyZmFjZSAqLworI2RlZmluZSBBQzEwMF9JMlMxX0NMS19DVFJMCQkweDEwCisjZGVmaW5lIEFDMTAwX0kyUzFfU05EX09VVF9DVFJMCQkweDExCisjZGVmaW5lIEFDMTAwX0kyUzFfU05EX0lOX0NUUkwJCTB4MTIKKyNkZWZpbmUgQUMxMDBfSTJTMV9NWFJfU1JDCQkweDEzCisjZGVmaW5lIEFDMTAwX0kyUzFfVk9MX0NUUkwxCQkweDE0CisjZGVmaW5lIEFDMTAwX0kyUzFfVk9MX0NUUkwyCQkweDE1CisjZGVmaW5lIEFDMTAwX0kyUzFfVk9MX0NUUkwzCQkweDE2CisjZGVmaW5lIEFDMTAwX0kyUzFfVk9MX0NUUkw0CQkweDE3CisjZGVmaW5lIEFDMTAwX0kyUzFfTVhSX0dBSU4JCTB4MTgKKworLyogSTJTMiBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUMxMDBfSTJTMl9DTEtfQ1RSTAkJMHgyMAorI2RlZmluZSBBQzEwMF9JMlMyX1NORF9PVVRfQ1RSTAkJMHgyMQorI2RlZmluZSBBQzEwMF9JMlMyX1NORF9JTl9DVFJMCQkweDIyCisjZGVmaW5lIEFDMTAwX0kyUzJfTVhSX1NSQwkJMHgyMworI2RlZmluZSBBQzEwMF9JMlMyX1ZPTF9DVFJMMQkJMHgyNAorI2RlZmluZSBBQzEwMF9JMlMyX1ZPTF9DVFJMMgkJMHgyNQorI2RlZmluZSBBQzEwMF9JMlMyX1ZPTF9DVFJMMwkJMHgyNgorI2RlZmluZSBBQzEwMF9JMlMyX1ZPTF9DVFJMNAkJMHgyNworI2RlZmluZSBBQzEwMF9JMlMyX01YUl9HQUlOCQkweDI4CisKKy8qIEkyUzMgaW50ZXJmYWNlICovCisjZGVmaW5lIEFDMTAwX0kyUzNfQ0xLX0NUUkwJCTB4MzAKKyNkZWZpbmUgQUMxMDBfSTJTM19TTkRfT1VUX0NUUkwJCTB4MzEKKyNkZWZpbmUgQUMxMDBfSTJTM19TTkRfSU5fQ1RSTAkJMHgzMgorI2RlZmluZSBBQzEwMF9JMlMzX1NJR19QQVRIX0NUUkwJMHgzMworCisvKiBBREMgZGlnaXRhbCBjb250cm9scyAqLworI2RlZmluZSBBQzEwMF9BRENfRElHX0NUUkwJCTB4NDAKKyNkZWZpbmUgQUMxMDBfQURDX1ZPTF9DVFJMCQkweDQxCisKKy8qIEhNSUMgcGx1ZyBzZW5zaW5nIC8ga2V5IGRldGVjdGlvbiAqLworI2RlZmluZSBBQzEwMF9ITUlDX0NUUkwxCQkweDQ0CisjZGVmaW5lIEFDMTAwX0hNSUNfQ1RSTDIJCTB4NDUKKyNkZWZpbmUgQUMxMDBfSE1JQ19TVEFUVVMJCTB4NDYKKworLyogREFDIGRpZ2l0YWwgY29udHJvbHMgKi8KKyNkZWZpbmUgQUMxMDBfREFDX0RJR19DVFJMCQkweDQ4CisjZGVmaW5lIEFDMTAwX0RBQ19WT0xfQ1RSTAkJMHg0OQorI2RlZmluZSBBQzEwMF9EQUNfTVhSX1NSQwkJMHg0YworI2RlZmluZSBBQzEwMF9EQUNfTVhSX0dBSU4JCTB4NGQKKworLyogQW5hbG9nIGNvbnRyb2xzICovCisjZGVmaW5lIEFDMTAwX0FEQ19BUENfQ1RSTAkJMHg1MAorI2RlZmluZSBBQzEwMF9BRENfU1JDCQkJMHg1MQorI2RlZmluZSBBQzEwMF9BRENfU1JDX0JTVF9DVFJMCQkweDUyCisjZGVmaW5lIEFDMTAwX09VVF9NWFJfREFDX0FfQ1RSTAkweDUzCisjZGVmaW5lIEFDMTAwX09VVF9NWFJfU1JDCQkweDU0CisjZGVmaW5lIEFDMTAwX09VVF9NWFJfU1JDX0JTVAkJMHg1NQorI2RlZmluZSBBQzEwMF9IUE9VVF9DVFJMCQkweDU2CisjZGVmaW5lIEFDMTAwX0VSUE9VVF9DVFJMCQkweDU3CisjZGVmaW5lIEFDMTAwX1NQS09VVF9DVFJMCQkweDU4CisjZGVmaW5lIEFDMTAwX0xJTkVPVVRfQ1RSTAkJMHg1OQorCisvKiBBREMgZGlnaXRhbCBhdWRpbyBwcm9jZXNzaW5nIChoaWdoIHBhc3MgZmlsdGVyICYgYXV0byBnYWluIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9MX1NUQQkJMHg4MAorI2RlZmluZSBBQzEwMF9BRENfREFQX1JfU1RBCQkweDgxCisjZGVmaW5lIEFDMTAwX0FEQ19EQVBfTF9DVFJMCQkweDgyCisjZGVmaW5lIEFDMTAwX0FEQ19EQVBfUl9DVFJMCQkweDgzCisjZGVmaW5lIEFDMTAwX0FEQ19EQVBfTF9UX0wJCTB4ODQgLyogTGVmdCBUYXJnZXQgTGV2ZWwgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9SX1RfTAkJMHg4NSAvKiBSaWdodCBUYXJnZXQgTGV2ZWwgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9MX0hfQV9DCQkweDg2IC8qIExlZnQgSGlnaCBBdmcuIENvZWYgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9MX0xfQV9DCQkweDg3IC8qIExlZnQgTG93IEF2Zy4gQ29lZiAqLworI2RlZmluZSBBQzEwMF9BRENfREFQX1JfSF9BX0MJCTB4ODggLyogUmlnaHQgSGlnaCBBdmcuIENvZWYgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9SX0xfQV9DCQkweDg5IC8qIFJpZ2h0IExvdyBBdmcuIENvZWYgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9MX0RfVAkJMHg4YSAvKiBMZWZ0IERlY2F5IFRpbWUgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9MX0FfVAkJMHg4YiAvKiBMZWZ0IEF0dGFjayBUaW1lICovCisjZGVmaW5lIEFDMTAwX0FEQ19EQVBfUl9EX1QJCTB4OGMgLyogUmlnaHQgRGVjYXkgVGltZSAqLworI2RlZmluZSBBQzEwMF9BRENfREFQX1JfQV9UCQkweDhkIC8qIFJpZ2h0IEF0dGFjayBUaW1lICovCisjZGVmaW5lIEFDMTAwX0FEQ19EQVBfTl9USAkJMHg4ZSAvKiBOb2lzZSBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9MX0hfTl9BX0MJCTB4OGYgLyogTGVmdCBIaWdoIE5vaXNlIEF2Zy4gQ29lZiAqLworI2RlZmluZSBBQzEwMF9BRENfREFQX0xfTF9OX0FfQwkJMHg5MCAvKiBMZWZ0IExvdyBOb2lzZSBBdmcuIENvZWYgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9SX0hfTl9BX0MJCTB4OTEgLyogUmlnaHQgSGlnaCBOb2lzZSBBdmcuIENvZWYgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9SX0xfTl9BX0MJCTB4OTIgLyogUmlnaHQgTG93IE5vaXNlIEF2Zy4gQ29lZiAqLworI2RlZmluZSBBQzEwMF9BRENfREFQX0hfSFBGX0MJCTB4OTMgLyogSGlnaCBIaWdoLVBhc3MtRmlsdGVyIENvZWYgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9MX0hQRl9DCQkweDk0IC8qIExvdyBIaWdoLVBhc3MtRmlsdGVyIENvZWYgKi8KKyNkZWZpbmUgQUMxMDBfQURDX0RBUF9PUFQJCTB4OTUgLyogQUdDIE9wdGltdW0gKi8KKworLyogREFDIGRpZ2l0YWwgYXVkaW8gcHJvY2Vzc2luZyAoaGlnaCBwYXNzIGZpbHRlciAmIGR5bmFtaWMgcmFuZ2UgY29udHJvbCkgKi8KKyNkZWZpbmUgQUMxMDBfREFDX0RBUF9DVFJMCQkweGEwCisjZGVmaW5lIEFDMTAwX0RBQ19EQVBfSF9IUEZfQwkJMHhhMSAvKiBIaWdoIEhpZ2gtUGFzcy1GaWx0ZXIgQ29lZiAqLworI2RlZmluZSBBQzEwMF9EQUNfREFQX0xfSFBGX0MJCTB4YTIgLyogTG93IEhpZ2gtUGFzcy1GaWx0ZXIgQ29lZiAqLworI2RlZmluZSBBQzEwMF9EQUNfREFQX0xfSF9FX0FfQwkJMHhhMyAvKiBMZWZ0IEhpZ2ggRW5lcmd5IEF2ZyBDb2VmICovCisjZGVmaW5lIEFDMTAwX0RBQ19EQVBfTF9MX0VfQV9DCQkweGE0IC8qIExlZnQgTG93IEVuZXJneSBBdmcgQ29lZiAqLworI2RlZmluZSBBQzEwMF9EQUNfREFQX1JfSF9FX0FfQwkJMHhhNSAvKiBSaWdodCBIaWdoIEVuZXJneSBBdmcgQ29lZiAqLworI2RlZmluZSBBQzEwMF9EQUNfREFQX1JfTF9FX0FfQwkJMHhhNiAvKiBSaWdodCBMb3cgRW5lcmd5IEF2ZyBDb2VmICovCisjZGVmaW5lIEFDMTAwX0RBQ19EQVBfSF9HX0RfVF9DCQkweGE3IC8qIEhpZ2ggR2FpbiBEZWxheSBUaW1lIENvZWYgKi8KKyNkZWZpbmUgQUMxMDBfREFDX0RBUF9MX0dfRF9UX0MJCTB4YTggLyogTG93IEdhaW4gRGVsYXkgVGltZSBDb2VmICovCisjZGVmaW5lIEFDMTAwX0RBQ19EQVBfSF9HX0FfVF9DCQkweGE5IC8qIEhpZ2ggR2FpbiBBdHRhY2sgVGltZSBDb2VmICovCisjZGVmaW5lIEFDMTAwX0RBQ19EQVBfTF9HX0FfVF9DCQkweGFhIC8qIExvdyBHYWluIEF0dGFjayBUaW1lIENvZWYgKi8KKyNkZWZpbmUgQUMxMDBfREFDX0RBUF9IX0VfVEgJCTB4YWIgLyogSGlnaCBFbmVyZ3kgVGhyZXNob2xkICovCisjZGVmaW5lIEFDMTAwX0RBQ19EQVBfTF9FX1RICQkweGFjIC8qIExvdyBFbmVyZ3kgVGhyZXNob2xkICovCisjZGVmaW5lIEFDMTAwX0RBQ19EQVBfSF9HX0sJCTB4YWQgLyogSGlnaCBHYWluIEsgcGFyYW1ldGVyICovCisjZGVmaW5lIEFDMTAwX0RBQ19EQVBfTF9HX0sJCTB4YWUgLyogTG93IEdhaW4gSyBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgQUMxMDBfREFDX0RBUF9IX0dfT0ZGCQkweGFmIC8qIEhpZ2ggR2FpbiBvZmZzZXQgKi8KKyNkZWZpbmUgQUMxMDBfREFDX0RBUF9MX0dfT0ZGCQkweGIwIC8qIExvdyBHYWluIG9mZnNldCAqLworI2RlZmluZSBBQzEwMF9EQUNfREFQX09QVAkJMHhiMSAvKiBEUkMgb3B0aW11bSAqLworCisvKiBEaWdpdGFsIGF1ZGlvIHByb2Nlc3NpbmcgZW5hYmxlICovCisjZGVmaW5lIEFDMTAwX0FEQ19EQVBfRU5BCQkweGI0CisjZGVmaW5lIEFDMTAwX0RBQ19EQVBfRU5BCQkweGI1CisKKy8qIFNSQyBjb250cm9sICovCisjZGVmaW5lIEFDMTAwX1NSQzFfQ1RSTDEJCTB4YjgKKyNkZWZpbmUgQUMxMDBfU1JDMV9DVFJMMgkJMHhiOQorI2RlZmluZSBBQzEwMF9TUkMxX0NUUkwzCQkweGJhCisjZGVmaW5lIEFDMTAwX1NSQzFfQ1RSTDQJCTB4YmIKKyNkZWZpbmUgQUMxMDBfU1JDMl9DVFJMMQkJMHhiYworI2RlZmluZSBBQzEwMF9TUkMyX0NUUkwyCQkweGJkCisjZGVmaW5lIEFDMTAwX1NSQzJfQ1RSTDMJCTB4YmUKKyNkZWZpbmUgQUMxMDBfU1JDMl9DVFJMNAkJMHhiZgorCisvKiBSVEMgY2xrIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUMxMDBfQ0xLMzJLX0FOQUxPR19DVFJMCTB4YzAKKyNkZWZpbmUgQUMxMDBfQ0xLT1VUX0NUUkwxCQkweGMxCisjZGVmaW5lIEFDMTAwX0NMS09VVF9DVFJMMgkJMHhjMgorI2RlZmluZSBBQzEwMF9DTEtPVVRfQ1RSTDMJCTB4YzMKKworLyogUlRDIG1vZHVsZSAqLworI2RlZmluZSBBQzEwMF9SVENfUlNUCQkJMHhjNgorI2RlZmluZSBBQzEwMF9SVENfQ1RSTAkJCTB4YzcKKyNkZWZpbmUgQUMxMDBfUlRDX1NFQwkJCTB4YzggLyogc2Vjb25kICovCisjZGVmaW5lIEFDMTAwX1JUQ19NSU4JCQkweGM5IC8qIG1pbnV0ZSAqLworI2RlZmluZSBBQzEwMF9SVENfSE9VCQkJMHhjYSAvKiBob3VyICovCisjZGVmaW5lIEFDMTAwX1JUQ19XRUUJCQkweGNiIC8qIHdlZWtkYXkgKi8KKyNkZWZpbmUgQUMxMDBfUlRDX0RBWQkJCTB4Y2MgLyogZGF5ICovCisjZGVmaW5lIEFDMTAwX1JUQ19NT04JCQkweGNkIC8qIG1vbnRoICovCisjZGVmaW5lIEFDMTAwX1JUQ19ZRUEJCQkweGNlIC8qIHllYXIgKi8KKyNkZWZpbmUgQUMxMDBfUlRDX1VQRAkJCTB4Y2YgLyogdXBkYXRlIHRyaWdnZXIgKi8KKworLyogUlRDIGFsYXJtICovCisjZGVmaW5lIEFDMTAwX0FMTV9JTlRfRU5BCQkweGQwCisjZGVmaW5lCUFDMTAwX0FMTV9JTlRfU1RBCQkweGQxCisjZGVmaW5lIEFDMTAwX0FMTV9TRUMJCQkweGQ4CisjZGVmaW5lIEFDMTAwX0FMTV9NSU4JCQkweGQ5CisjZGVmaW5lIEFDMTAwX0FMTV9IT1UJCQkweGRhCisjZGVmaW5lIEFDMTAwX0FMTV9XRUUJCQkweGRiCisjZGVmaW5lIEFDMTAwX0FMTV9EQVkJCQkweGRjCisjZGVmaW5lIEFDMTAwX0FMTV9NT04JCQkweGRkCisjZGVmaW5lIEFDMTAwX0FMTV9ZRUEJCQkweGRlCisjZGVmaW5lIEFDMTAwX0FMTV9VUEQJCQkweGRmCisKKy8qIFJUQyBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgMCB+IDE1ICovCisjZGVmaW5lIEFDMTAwX1JUQ19HUCh4KQkJCSgweGUwICsgKHgpKQorCisjZW5kaWYgLyogX19MSU5VWF9NRkRfQUMxMDBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvYXJpem9uYS9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL2NvcmUuaAppbmRleCA1OGFiNGMwLi5iMzFiM2JlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL2NvcmUuaApAQCAtMTMsNiArMTMsNyBAQAogI2lmbmRlZiBfV01fQVJJWk9OQV9DT1JFX0gKICNkZWZpbmUgX1dNX0FSSVpPTkFfQ09SRV9ICiAKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgpAQCAtMjEsNiArMjIsMTIgQEAKIAogI2RlZmluZSBBUklaT05BX01BWF9DT1JFX1NVUFBMSUVTIDIKIAorZW51bSB7CisJQVJJWk9OQV9NQ0xLMSwKKwlBUklaT05BX01DTEsyLAorCUFSSVpPTkFfTlVNX01DTEsKK307CisKIGVudW0gYXJpem9uYV90eXBlIHsKIAlXTTUxMDIgPSAxLAogCVdNNTExMCA9IDIsCkBAIC0xMzksNiArMTQ2LDggQEAKIAlzdHJ1Y3QgbXV0ZXggY2xrX2xvY2s7CiAJaW50IGNsazMya19yZWY7CiAKKwlzdHJ1Y3QgY2xrICptY2xrW0FSSVpPTkFfTlVNX01DTEtdOworCiAJYm9vbCBjdHJsaWZfZXJyb3I7CiAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG07CkBAIC0xODIsNyArMTkxLDQgQEAKIGludCB3bTg5OTdfcGF0Y2goc3RydWN0IGFyaXpvbmEgKmFyaXpvbmEpOwogaW50IHdtODk5OF9wYXRjaChzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSk7CiAKLWV4dGVybiBpbnQgYXJpem9uYV9vZl9nZXRfbmFtZWRfZ3BpbyhzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSwgY29uc3QgY2hhciAqcHJvcCwKLQkJCQkgICAgIGJvb2wgbWFuZGF0b3J5KTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9heHAyMHguaCBiL2luY2x1ZGUvbGludXgvbWZkL2F4cDIweC5oCmluZGV4IDBiZTQ5ODIuLmZlYzU5N2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2F4cDIweC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2F4cDIweC5oCkBAIC0yMCw2ICsyMCw3IEBACiAJQVhQMjIxX0lELAogCUFYUDIyM19JRCwKIAlBWFAyODhfSUQsCisJQVhQODA2X0lELAogCUFYUDgwOV9JRCwKIAlOUl9BWFAyMFhfVkFSSUFOVFMsCiB9OwpAQCAtOTEsNiArOTIsMzAgQEAKICNkZWZpbmUgQVhQMjJYX0FMRE8zX1ZfT1VUCQkweDJhCiAjZGVmaW5lIEFYUDIyWF9DSFJHX0NUUkwzCQkweDM1CiAKKyNkZWZpbmUgQVhQODA2X1NUQVJUVVBfU1JDCQkweDAwCisjZGVmaW5lIEFYUDgwNl9DSElQX0lECQkJMHgwMworI2RlZmluZSBBWFA4MDZfUFdSX09VVF9DVFJMMQkJMHgxMAorI2RlZmluZSBBWFA4MDZfUFdSX09VVF9DVFJMMgkJMHgxMQorI2RlZmluZSBBWFA4MDZfRENEQ0FfVl9DVFJMCQkweDEyCisjZGVmaW5lIEFYUDgwNl9EQ0RDQl9WX0NUUkwJCTB4MTMKKyNkZWZpbmUgQVhQODA2X0RDRENDX1ZfQ1RSTAkJMHgxNAorI2RlZmluZSBBWFA4MDZfRENEQ0RfVl9DVFJMCQkweDE1CisjZGVmaW5lIEFYUDgwNl9EQ0RDRV9WX0NUUkwJCTB4MTYKKyNkZWZpbmUgQVhQODA2X0FMRE8xX1ZfQ1RSTAkJMHgxNworI2RlZmluZSBBWFA4MDZfQUxETzJfVl9DVFJMCQkweDE4CisjZGVmaW5lIEFYUDgwNl9BTERPM19WX0NUUkwJCTB4MTkKKyNkZWZpbmUgQVhQODA2X0RDRENfTU9ERV9DVFJMMQkJMHgxYQorI2RlZmluZSBBWFA4MDZfRENEQ19NT0RFX0NUUkwyCQkweDFiCisjZGVmaW5lIEFYUDgwNl9EQ0RDX0ZSRVFfQ1RSTAkJMHgxYworI2RlZmluZSBBWFA4MDZfQkxETzFfVl9DVFJMCQkweDIwCisjZGVmaW5lIEFYUDgwNl9CTERPMl9WX0NUUkwJCTB4MjEKKyNkZWZpbmUgQVhQODA2X0JMRE8zX1ZfQ1RSTAkJMHgyMgorI2RlZmluZSBBWFA4MDZfQkxETzRfVl9DVFJMCQkweDIzCisjZGVmaW5lIEFYUDgwNl9DTERPMV9WX0NUUkwJCTB4MjQKKyNkZWZpbmUgQVhQODA2X0NMRE8yX1ZfQ1RSTAkJMHgyNQorI2RlZmluZSBBWFA4MDZfQ0xETzNfVl9DVFJMCQkweDI2CisjZGVmaW5lIEFYUDgwNl9WUkVGX1RFTVBfV0FSTl9MCQkweGYzCisKIC8qIEludGVycnVwdCAqLwogI2RlZmluZSBBWFAxNTJfSVJRMV9FTgkJCTB4NDAKICNkZWZpbmUgQVhQMTUyX0lSUTJfRU4JCQkweDQxCkBAIC0yNjYsNiArMjkxLDI2IEBACiB9OwogCiBlbnVtIHsKKwlBWFA4MDZfRENEQ0EgPSAwLAorCUFYUDgwNl9EQ0RDQiwKKwlBWFA4MDZfRENEQ0MsCisJQVhQODA2X0RDRENELAorCUFYUDgwNl9EQ0RDRSwKKwlBWFA4MDZfQUxETzEsCisJQVhQODA2X0FMRE8yLAorCUFYUDgwNl9BTERPMywKKwlBWFA4MDZfQkxETzEsCisJQVhQODA2X0JMRE8yLAorCUFYUDgwNl9CTERPMywKKwlBWFA4MDZfQkxETzQsCisJQVhQODA2X0NMRE8xLAorCUFYUDgwNl9DTERPMiwKKwlBWFA4MDZfQ0xETzMsCisJQVhQODA2X1NXLAorCUFYUDgwNl9SRUdfSURfTUFYLAorfTsKKworZW51bSB7CiAJQVhQODA5X0RDREMxID0gMCwKIAlBWFA4MDlfRENEQzIsCiAJQVhQODA5X0RDREMzLApAQCAtNDE0LDYgKzQ1OSwyMSBAQAogCUFYUDI4OF9JUlFfQkNfVVNCX0NITkcsCiB9OwogCitlbnVtIGF4cDgwNl9pcnFzIHsKKwlBWFA4MDZfSVJRX0RJRV9URU1QX0hJR0hfTFYxLAorCUFYUDgwNl9JUlFfRElFX1RFTVBfSElHSF9MVjIsCisJQVhQODA2X0lSUV9EQ0RDQV9WX0xPVywKKwlBWFA4MDZfSVJRX0RDRENCX1ZfTE9XLAorCUFYUDgwNl9JUlFfRENEQ0NfVl9MT1csCisJQVhQODA2X0lSUV9EQ0RDRF9WX0xPVywKKwlBWFA4MDZfSVJRX0RDRENFX1ZfTE9XLAorCUFYUDgwNl9JUlFfUFdST0tfTE9ORywKKwlBWFA4MDZfSVJRX1BXUk9LX1NIT1JULAorCUFYUDgwNl9JUlFfV0FLRVVQLAorCUFYUDgwNl9JUlFfUFdST0tfRkFMTCwKKwlBWFA4MDZfSVJRX1BXUk9LX1JJU0UsCit9OworCiBlbnVtIGF4cDgwOV9pcnFzIHsKIAlBWFA4MDlfSVJRX0FDSU5fT1ZFUl9WID0gMSwKIAlBWFA4MDlfSVJRX0FDSU5fUExVR0lOLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvY3Jvc19lYy5oIGIvaW5jbHVkZS9saW51eC9tZmQvY3Jvc19lYy5oCmluZGV4IGQ2NDFhMTguLjc2ZjdlZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2Nyb3NfZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9jcm9zX2VjLmgKQEAgLTEwOSw2ICsxMDksMTAgQEAKICAqICAgICBzaG91bGQgY2hlY2sgbXNnLnJlc3VsdCBmb3IgdGhlIEVDJ3MgcmVzdWx0IGNvZGUuCiAgKiBAcGt0X3hmZXI6IHNlbmQgcGFja2V0IHRvIEVDIGFuZCBnZXQgcmVzcG9uc2UKICAqIEBsb2NrOiBvbmUgdHJhbnNhY3Rpb24gYXQgYSB0aW1lCisgKiBAbWticF9ldmVudF9zdXBwb3J0ZWQ6IHRydWUgaWYgdGhpcyBFQyBzdXBwb3J0cyB0aGUgTUtCUCBldmVudCBwcm90b2NvbC4KKyAqIEBldmVudF9ub3RpZmllcjogaW50ZXJydXB0IGV2ZW50IG5vdGlmaWVyIGZvciB0cmFuc3BvcnQgZGV2aWNlcy4KKyAqIEBldmVudF9kYXRhOiByYXcgcGF5bG9hZCB0cmFuc2ZlcnJlZCB3aXRoIHRoZSBNS0JQIGV2ZW50LgorICogQGV2ZW50X3NpemU6IHNpemUgaW4gYnl0ZXMgb2YgdGhlIGV2ZW50IGRhdGEuCiAgKi8KIHN0cnVjdCBjcm9zX2VjX2RldmljZSB7CiAKQEAgLTEzNyw2ICsxNDEsMTEgQEAKIAlpbnQgKCpwa3RfeGZlcikoc3RydWN0IGNyb3NfZWNfZGV2aWNlICplYywKIAkJCXN0cnVjdCBjcm9zX2VjX2NvbW1hbmQgKm1zZyk7CiAJc3RydWN0IG11dGV4IGxvY2s7CisJYm9vbCBta2JwX2V2ZW50X3N1cHBvcnRlZDsKKwlzdHJ1Y3QgYmxvY2tpbmdfbm90aWZpZXJfaGVhZCBldmVudF9ub3RpZmllcjsKKworCXN0cnVjdCBlY19yZXNwb25zZV9nZXRfbmV4dF9ldmVudCBldmVudF9kYXRhOworCWludCBldmVudF9zaXplOwogfTsKIAogLyogc3RydWN0IGNyb3NfZWNfcGxhdGZvcm0gLSBDaHJvbWVPUyBFQyBwbGF0Zm9ybSBpbmZvcm1hdGlvbgpAQCAtMjY5LDYgKzI3OCwxNSBAQAogICovCiBpbnQgY3Jvc19lY19xdWVyeV9hbGwoc3RydWN0IGNyb3NfZWNfZGV2aWNlICplY19kZXYpOwogCisvKioKKyAqIGNyb3NfZWNfZ2V0X25leHRfZXZlbnQgLSAgRmV0Y2ggbmV4dCBldmVudCBmcm9tIHRoZSBDaHJvbWVPUyBFQworICoKKyAqIEBlY19kZXY6IERldmljZSB0byBmZXRjaCBldmVudCBmcm9tCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCBMaW51eCBlcnJvciBudW1iZXIgb24gZmFpbHVyZQorICovCitpbnQgY3Jvc19lY19nZXRfbmV4dF9ldmVudChzdHJ1Y3QgY3Jvc19lY19kZXZpY2UgKmVjX2Rldik7CisKIC8qIHN5c2ZzIHN0dWZmICovCiBleHRlcm4gc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjcm9zX2VjX2F0dHJfZ3JvdXA7CiBleHRlcm4gc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjcm9zX2VjX2xpZ2h0YmFyX2F0dHJfZ3JvdXA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9jcm9zX2VjX2NvbW1hbmRzLmggYi9pbmNsdWRlL2xpbnV4L21mZC9jcm9zX2VjX2NvbW1hbmRzLmgKaW5kZXggN2U3YThkNC4uNzY3MjhmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvY3Jvc19lY19jb21tYW5kcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2Nyb3NfZWNfY29tbWFuZHMuaApAQCAtMTc5Myw2ICsxNzkzLDQwIEBACiAJfTsKIH0gX19wYWNrZWQ7CiAKKy8qCisgKiBDb21tYW5kIGZvciByZXRyaWV2aW5nIHRoZSBuZXh0IHBlbmRpbmcgTUtCUCBldmVudCBmcm9tIHRoZSBFQyBkZXZpY2UKKyAqCisgKiBUaGUgZGV2aWNlIHJlcGxpZXMgd2l0aCBVTkFWQUlMQUJMRSBpZiB0aGVyZSBhcmVuJ3QgYW55IHBlbmRpbmcgZXZlbnRzLgorICovCisjZGVmaW5lIEVDX0NNRF9HRVRfTkVYVF9FVkVOVCAweDY3CisKK2VudW0gZWNfbWticF9ldmVudCB7CisJLyogS2V5Ym9hcmQgbWF0cml4IGNoYW5nZWQuIFRoZSBldmVudCBkYXRhIGlzIHRoZSBuZXcgbWF0cml4IHN0YXRlLiAqLworCUVDX01LQlBfRVZFTlRfS0VZX01BVFJJWCA9IDAsCisKKwkvKiBOZXcgaG9zdCBldmVudC4gVGhlIGV2ZW50IGRhdGEgaXMgNCBieXRlcyBvZiBob3N0IGV2ZW50IGZsYWdzLiAqLworCUVDX01LQlBfRVZFTlRfSE9TVF9FVkVOVCA9IDEsCisKKwkvKiBOZXcgU2Vuc29yIEZJRk8gZGF0YS4gVGhlIGV2ZW50IGRhdGEgaXMgZmlmb19pbmZvIHN0cnVjdHVyZS4gKi8KKwlFQ19NS0JQX0VWRU5UX1NFTlNPUl9GSUZPID0gMiwKKworCS8qIE51bWJlciBvZiBNS0JQIGV2ZW50cyAqLworCUVDX01LQlBfRVZFTlRfQ09VTlQsCit9OworCit1bmlvbiBlY19yZXNwb25zZV9nZXRfbmV4dF9kYXRhIHsKKwl1aW50OF90ICAga2V5X21hdHJpeFsxM107CisKKwkvKiBVbmFsaWduZWQgKi8KKwl1aW50MzJfdCAgaG9zdF9ldmVudDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBlY19yZXNwb25zZV9nZXRfbmV4dF9ldmVudCB7CisJdWludDhfdCBldmVudF90eXBlOworCS8qIEZvbGxvd2VkIGJ5IGV2ZW50IGRhdGEgaWYgYW55ICovCisJdW5pb24gZWNfcmVzcG9uc2VfZ2V0X25leHRfZGF0YSBkYXRhOworfSBfX3BhY2tlZDsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVGVtcGVyYXR1cmUgc2Vuc29yIGNvbW1hbmRzICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2RhOHh4LWNmZ2NoaXAuaCBiL2luY2x1ZGUvbGludXgvbWZkL2RhOHh4LWNmZ2NoaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQ5ODVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvZGE4eHgtY2ZnY2hpcC5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogVEkgRGFWaW5jaSBEQTh4eCBDSElQQ0ZHeCByZWdpc3RlcnMgZm9yIHN5c2NvbiBjb25zdW1lcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IERhdmlkIExlY2huZXIgPGRhdmlkQGxlY2hub2xvZ3kuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NRkRfREE4WFhfQ0ZHQ0hJUF9ICisjZGVmaW5lIF9fTElOVVhfTUZEX0RBOFhYX0NGR0NISVBfSAorCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKy8qIHJlZ2lzdGVyIG9mZnNldCAoMzItYml0IHJlZ2lzdGVycykgKi8KKyNkZWZpbmUgQ0ZHQ0hJUChuKQkJCQkoKG4pICogNCkKKworLyogQ0ZHQ0hJUDAgKFBMTDAvRURNQTNfMCkgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBDRkdDSElQMF9QTExfTUFTVEVSX0xPQ0sJCUJJVCg0KQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzBUQzFEQlMobikJCSgobikgPDwgMikKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMwVEMxREJTX01BU0sJCUNGR0NISVAwX0VETUEzMFRDMURCUygweDMpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMFRDMURCU18xNgkJQ0ZHQ0hJUDBfRURNQTMwVEMxREJTKDB4MCkKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMwVEMxREJTXzMyCQlDRkdDSElQMF9FRE1BMzBUQzFEQlMoMHgxKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzBUQzFEQlNfNjQJCUNGR0NISVAwX0VETUEzMFRDMURCUygweDIpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMFRDMERCUyhuKQkJKChuKSA8PCAwKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzBUQzBEQlNfTUFTSwkJQ0ZHQ0hJUDBfRURNQTMwVEMwREJTKDB4MykKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMwVEMwREJTXzE2CQlDRkdDSElQMF9FRE1BMzBUQzBEQlMoMHgwKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzBUQzBEQlNfMzIJCUNGR0NISVAwX0VETUEzMFRDMERCUygweDEpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMFRDMERCU182NAkJQ0ZHQ0hJUDBfRURNQTMwVEMwREJTKDB4MikKKworLyogQ0ZHQ0hJUDEgKGVDQVAvSFBJL0VETUEzXzEvZUhSUFdNIFRCQ0xLL01jQVNQMCBBTVVURUlOKSByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkMobikJCQkoKG4pIDw8IDI3KQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX01BU0sJCQlDRkdDSElQMV9DQVAyU1JDKDB4MWYpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfRUNBUF9QSU4JCUNGR0NISVAxX0NBUDJTUkMoMHgwKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX01DQVNQMF9UWAkJQ0ZHQ0hJUDFfQ0FQMlNSQygweDEpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfTUNBU1AwX1JYCQlDRkdDSElQMV9DQVAyU1JDKDB4MikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MwX1JYX1RIUkVTSE9MRAlDRkdDSElQMV9DQVAyU1JDKDB4NykKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MwX1JYCQlDRkdDSElQMV9DQVAyU1JDKDB4OCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MwX1RYCQlDRkdDSElQMV9DQVAyU1JDKDB4OSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MwX01JU0MJCUNGR0NISVAxX0NBUDJTUkMoMHhhKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzFfUlhfVEhSRVNIT0xECUNGR0NISVAxX0NBUDJTUkMoMHhiKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzFfUlgJCUNGR0NISVAxX0NBUDJTUkMoMHhjKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzFfVFgJCUNGR0NISVAxX0NBUDJTUkMoMHhkKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzFfTUlTQwkJQ0ZHQ0hJUDFfQ0FQMlNSQygweGUpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfRU1BQ19DMl9SWF9USFJFU0hPTEQJQ0ZHQ0hJUDFfQ0FQMlNSQygweGYpCisjZGVmaW5lIENGR0NISVAxX0NBUDJTUkNfRU1BQ19DMl9SWAkJQ0ZHQ0hJUDFfQ0FQMlNSQygweDEwKQorI2RlZmluZSBDRkdDSElQMV9DQVAyU1JDX0VNQUNfQzJfVFgJCUNGR0NISVAxX0NBUDJTUkMoMHgxMSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMlNSQ19FTUFDX0MyX01JU0MJCUNGR0NISVAxX0NBUDJTUkMoMHgxMikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQyhuKQkJCSgobikgPDwgMjIpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfTUFTSwkJCUNGR0NISVAxX0NBUDFTUkMoMHgxZikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19FQ0FQX1BJTgkJQ0ZHQ0hJUDFfQ0FQMVNSQygweDApCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfTUNBU1AwX1RYCQlDRkdDSElQMV9DQVAxU1JDKDB4MSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19NQ0FTUDBfUlgJCUNGR0NISVAxX0NBUDFTUkMoMHgyKQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzBfUlhfVEhSRVNIT0xECUNGR0NISVAxX0NBUDFTUkMoMHg3KQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzBfUlgJCUNGR0NISVAxX0NBUDFTUkMoMHg4KQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzBfVFgJCUNGR0NISVAxX0NBUDFTUkMoMHg5KQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzBfTUlTQwkJQ0ZHQ0hJUDFfQ0FQMVNSQygweGEpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMV9SWF9USFJFU0hPTEQJQ0ZHQ0hJUDFfQ0FQMVNSQygweGIpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMV9SWAkJQ0ZHQ0hJUDFfQ0FQMVNSQygweGMpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMV9UWAkJQ0ZHQ0hJUDFfQ0FQMVNSQygweGQpCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMV9NSVNDCQlDRkdDSElQMV9DQVAxU1JDKDB4ZSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19FTUFDX0MyX1JYX1RIUkVTSE9MRAlDRkdDSElQMV9DQVAxU1JDKDB4ZikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMVNSQ19FTUFDX0MyX1JYCQlDRkdDSElQMV9DQVAxU1JDKDB4MTApCisjZGVmaW5lIENGR0NISVAxX0NBUDFTUkNfRU1BQ19DMl9UWAkJQ0ZHQ0hJUDFfQ0FQMVNSQygweDExKQorI2RlZmluZSBDRkdDSElQMV9DQVAxU1JDX0VNQUNfQzJfTUlTQwkJQ0ZHQ0hJUDFfQ0FQMVNSQygweDEyKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDKG4pCQkJKChuKSA8PCAxNykKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19NQVNLCQkJQ0ZHQ0hJUDFfQ0FQMFNSQygweDFmKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX0VDQVBfUElOCQlDRkdDSElQMV9DQVAwU1JDKDB4MCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19NQ0FTUDBfVFgJCUNGR0NISVAxX0NBUDBTUkMoMHgxKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX01DQVNQMF9SWAkJQ0ZHQ0hJUDFfQ0FQMFNSQygweDIpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMF9SWF9USFJFU0hPTEQJQ0ZHQ0hJUDFfQ0FQMFNSQygweDcpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMF9SWAkJQ0ZHQ0hJUDFfQ0FQMFNSQygweDgpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMF9UWAkJQ0ZHQ0hJUDFfQ0FQMFNSQygweDkpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMF9NSVNDCQlDRkdDSElQMV9DQVAwU1JDKDB4YSkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MxX1JYX1RIUkVTSE9MRAlDRkdDSElQMV9DQVAwU1JDKDB4YikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MxX1JYCQlDRkdDSElQMV9DQVAwU1JDKDB4YykKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MxX1RYCQlDRkdDSElQMV9DQVAwU1JDKDB4ZCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MxX01JU0MJCUNGR0NISVAxX0NBUDBTUkMoMHhlKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX0VNQUNfQzJfUlhfVEhSRVNIT0xECUNGR0NISVAxX0NBUDBTUkMoMHhmKQorI2RlZmluZSBDRkdDSElQMV9DQVAwU1JDX0VNQUNfQzJfUlgJCUNGR0NISVAxX0NBUDBTUkMoMHgxMCkKKyNkZWZpbmUgQ0ZHQ0hJUDFfQ0FQMFNSQ19FTUFDX0MyX1RYCQlDRkdDSElQMV9DQVAwU1JDKDB4MTEpCisjZGVmaW5lIENGR0NISVAxX0NBUDBTUkNfRU1BQ19DMl9NSVNDCQlDRkdDSElQMV9DQVAwU1JDKDB4MTIpCisjZGVmaW5lIENGR0NISVAxX0hQSUJZVEVBRAkJCUJJVCgxNikKKyNkZWZpbmUgQ0ZHQ0hJUDFfSFBJRU5BCQkJCUJJVCgxNSkKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMxVEMwREJTKG4pCQkoKG4pIDw8IDEzKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzFUQzBEQlNfTUFTSwkJQ0ZHQ0hJUDBfRURNQTMxVEMwREJTKDB4MykKKyNkZWZpbmUgQ0ZHQ0hJUDBfRURNQTMxVEMwREJTXzE2CQlDRkdDSElQMF9FRE1BMzFUQzBEQlMoMHgwKQorI2RlZmluZSBDRkdDSElQMF9FRE1BMzFUQzBEQlNfMzIJCUNGR0NISVAwX0VETUEzMVRDMERCUygweDEpCisjZGVmaW5lIENGR0NISVAwX0VETUEzMVRDMERCU182NAkJQ0ZHQ0hJUDBfRURNQTMxVEMwREJTKDB4MikKKyNkZWZpbmUgQ0ZHQ0hJUDFfVEJDTEtTWU5DCQkJQklUKDEyKQorI2RlZmluZSBDRkdDSElQMV9BTVVURVNFTDAobikJCQkoKG4pIDw8IDApCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9NQVNLCQkJQ0ZHQ0hJUDFfQU1VVEVTRUwwKDB4ZikKKyNkZWZpbmUgQ0ZHQ0hJUDFfQU1VVEVTRUwwX0xPVwkJCUNGR0NISVAxX0FNVVRFU0VMMCgweDApCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzAJCUNGR0NISVAxX0FNVVRFU0VMMCgweDEpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzEJCUNGR0NISVAxX0FNVVRFU0VMMCgweDIpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzIJCUNGR0NISVAxX0FNVVRFU0VMMCgweDMpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzMJCUNGR0NISVAxX0FNVVRFU0VMMCgweDQpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzQJCUNGR0NISVAxX0FNVVRFU0VMMCgweDUpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzUJCUNGR0NISVAxX0FNVVRFU0VMMCgweDYpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzYJCUNGR0NISVAxX0FNVVRFU0VMMCgweDcpCisjZGVmaW5lIENGR0NISVAxX0FNVVRFU0VMMF9CQU5LXzcJCUNGR0NISVAxX0FNVVRFU0VMMCgweDgpCisKKy8qIENGR0NISVAyIChVU0IgUEhZKSByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIENGR0NISVAyX1BIWUNMS0dECQkJQklUKDE3KQorI2RlZmluZSBDRkdDSElQMl9WQlVTU0VOU0UJCQlCSVQoMTYpCisjZGVmaW5lIENGR0NISVAyX1JFU0VUCQkJCUJJVCgxNSkKKyNkZWZpbmUgQ0ZHQ0hJUDJfT1RHTU9ERShuKQkJCSgobikgPDwgMTMpCisjZGVmaW5lIENGR0NISVAyX09UR01PREVfTUFTSwkJCUNGR0NISVAyX09UR01PREUoMHgzKQorI2RlZmluZSBDRkdDSElQMl9PVEdNT0RFX05PX09WRVJSSURFCQlDRkdDSElQMl9PVEdNT0RFKDB4MCkKKyNkZWZpbmUgQ0ZHQ0hJUDJfT1RHTU9ERV9GT1JDRV9IT1NUCQlDRkdDSElQMl9PVEdNT0RFKDB4MSkKKyNkZWZpbmUgQ0ZHQ0hJUDJfT1RHTU9ERV9GT1JDRV9ERVZJQ0UJCUNGR0NISVAyX09UR01PREUoMHgyKQorI2RlZmluZSBDRkdDSElQMl9PVEdNT0RFX0ZPUkNFX0hPU1RfVkJVU19MT1cJQ0ZHQ0hJUDJfT1RHTU9ERSgweDMpCisjZGVmaW5lIENGR0NISVAyX1VTQjFQSFlDTEtNVVgJCQlCSVQoMTIpCisjZGVmaW5lIENGR0NISVAyX1VTQjJQSFlDTEtNVVgJCQlCSVQoMTEpCisjZGVmaW5lIENGR0NISVAyX1BIWVBXUkROCQkJQklUKDEwKQorI2RlZmluZSBDRkdDSElQMl9PVEdQV1JETgkJCUJJVCg5KQorI2RlZmluZSBDRkdDSElQMl9EQVRQT0wJCQkJQklUKDgpCisjZGVmaW5lIENGR0NISVAyX1VTQjFTVVNQRU5ETQkJCUJJVCg3KQorI2RlZmluZSBDRkdDSElQMl9QSFlfUExMT04JCQlCSVQoNikKKyNkZWZpbmUgQ0ZHQ0hJUDJfU0VTRU5ERU4JCQlCSVQoNSkKKyNkZWZpbmUgQ0ZHQ0hJUDJfVkJEVENURU4JCQlCSVQoNCkKKyNkZWZpbmUgQ0ZHQ0hJUDJfUkVGRlJFUShuKQkJCSgobikgPDwgMCkKKyNkZWZpbmUgQ0ZHQ0hJUDJfUkVGRlJFUV9NQVNLCQkJQ0ZHQ0hJUDJfUkVGRlJFUSgweGYpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfMTJNSFoJCQlDRkdDSElQMl9SRUZGUkVRKDB4MSkKKyNkZWZpbmUgQ0ZHQ0hJUDJfUkVGRlJFUV8yNE1IWgkJCUNGR0NISVAyX1JFRkZSRVEoMHgyKQorI2RlZmluZSBDRkdDSElQMl9SRUZGUkVRXzQ4TUhaCQkJQ0ZHQ0hJUDJfUkVGRlJFUSgweDMpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfMTlfMk1IWgkJQ0ZHQ0hJUDJfUkVGRlJFUSgweDQpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfMzhfNE1IWgkJQ0ZHQ0hJUDJfUkVGRlJFUSgweDUpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfMTNNSFoJCQlDRkdDSElQMl9SRUZGUkVRKDB4NikKKyNkZWZpbmUgQ0ZHQ0hJUDJfUkVGRlJFUV8yNk1IWgkJCUNGR0NISVAyX1JFRkZSRVEoMHg3KQorI2RlZmluZSBDRkdDSElQMl9SRUZGUkVRXzIwTUhaCQkJQ0ZHQ0hJUDJfUkVGRlJFUSgweDgpCisjZGVmaW5lIENGR0NISVAyX1JFRkZSRVFfNDBNSFoJCQlDRkdDSElQMl9SRUZGUkVRKDB4OSkKKworLyogQ0ZHQ0hJUDMgKEVNQUMvdVBQL1BMTDEvQVNZTkMzL1BSVS9ESVY0LjUvRU1JRkEpIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgQ0ZHQ0hJUDNfUk1JSV9TRUwJCQlCSVQoOCkKKyNkZWZpbmUgQ0ZHQ0hJUDNfVVBQX1RYX0NMS1NSQwkJCUJJVCg2KQorI2RlZmluZSBDRkdDSElQM19QTEwxX01BU1RFUl9MT0NLCQlCSVQoNSkKKyNkZWZpbmUgQ0ZHQ0hJUDNfQVNZTkMzX0NMS1NSQwkJCUJJVCg0KQorI2RlZmluZSBDRkdDSElQM19QUlVFVlRTRUwJCQlCSVQoMykKKyNkZWZpbmUgQ0ZHQ0hJUDNfRElWNDVQRU5BCQkJQklUKDIpCisjZGVmaW5lIENGR0NISVAzX0VNQV9DTEtTUkMJCQlCSVQoMSkKKworLyogQ0ZHQ0hJUDQgKE1jQVNQMCBBTVVOVEVJTikgcmVnaXN0ZXIgYml0cyAqLworI2RlZmluZSBDRkdDSElQNF9BTVVURUNMUjAJCQlCSVQoMCkKKworI2VuZGlmIC8qIF9fTElOVVhfTUZEX0RBOFhYX0NGR0NISVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvZGE5MDYzL2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2My9jb3JlLmgKaW5kZXggNjIxYWY4Mi4uZjNhZTY1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvZGE5MDYzL2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9kYTkwNjMvY29yZS5oCkBAIC0zLDggKzMsOCBAQAogICoKICAqIENvcHlyaWdodCAyMDEyIERpYWxvZyBTZW1pY29uZHVjdG9yIEx0ZC4KICAqCi0gKiBBdXRob3I6IE1pY2hhbCBIYWpkdWsgPG1pY2hhbC5oYWpkdWtAZGlhc2VtaS5jb20+Ci0gKgkgICBLcnlzdGlhbiBHYXJiYWNpYWsgPGtyeXN0aWFuLmdhcmJhY2lha0BkaWFzZW1pLmNvbT4KKyAqIEF1dGhvcjogTWljaGFsIEhhamR1aywgRGlhbG9nIFNlbWljb25kdWN0b3IKKyAqIEF1dGhvcjogS3J5c3RpYW4gR2FyYmFjaWFrLCBEaWFsb2cgU2VtaWNvbmR1Y3RvcgogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2My9wZGF0YS5oIGIvaW5jbHVkZS9saW51eC9tZmQvZGE5MDYzL3BkYXRhLmgKaW5kZXggNjEyMzgzYi4uOGExMjU3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvZGE5MDYzL3BkYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvZGE5MDYzL3BkYXRhLmgKQEAgLTMsOCArMyw4IEBACiAgKgogICogQ29weXJpZ2h0IDIwMTIgRGlhbG9nIFNlbWljb25kdWN0b3IgTHRkLgogICoKLSAqIEF1dGhvcjogTWljaGFsIEhhamR1ayA8bWljaGFsLmhhamR1a0BkaWFzZW1pLmNvbT4KLSAqIEF1dGhvcjogS3J5c3RpYW4gR2FyYmFjaWFrIDxrcnlzdGlhbi5nYXJiYWNpYWtAZGlhc2VtaS5jb20+CisgKiBBdXRob3I6IE1pY2hhbCBIYWpkdWssIERpYWxvZyBTZW1pY29uZHVjdG9yCisgKiBBdXRob3I6IEtyeXN0aWFuIEdhcmJhY2lhaywgRGlhbG9nIFNlbWljb25kdWN0b3IKICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9kYTkwNjMvcmVnaXN0ZXJzLmggYi9pbmNsdWRlL2xpbnV4L21mZC9kYTkwNjMvcmVnaXN0ZXJzLmgKaW5kZXggMmUwYmE2ZC4uNWQ0Mjg1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvZGE5MDYzL3JlZ2lzdGVycy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2RhOTA2My9yZWdpc3RlcnMuaApAQCAtMyw4ICszLDggQEAKICAqCiAgKiBDb3B5cmlnaHQgMjAxMiBEaWFsb2cgU2VtaWNvbmR1Y3RvciBMdGQuCiAgKgotICogQXV0aG9yOiBNaWNoYWwgSGFqZHVrIDxtaWNoYWwuaGFqZHVrQGRpYXNlbWkuY29tPgotICoJICAgS3J5c3RpYW4gR2FyYmFjaWFrIDxrcnlzdGlhbi5nYXJiYWNpYWtAZGlhc2VtaS5jb20+CisgKiBBdXRob3I6IE1pY2hhbCBIYWpkdWssIERpYWxvZyBTZW1pY29uZHVjdG9yCisgKiBBdXRob3I6IEtyeXN0aWFuIEdhcmJhY2lhaywgRGlhbG9nIFNlbWljb25kdWN0b3IKICAqCiAgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9kYjg1MDAtcHJjbXUuaCBiL2luY2x1ZGUvbGludXgvbWZkL2RiODUwMC1wcmNtdS5oCmluZGV4IDBiZDY5NDQuLjdiYTY3YjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2RiODUwMC1wcmNtdS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2RiODUwMC1wcmNtdS5oCkBAIC01MzgsNyArNTM4LDYgQEAKIGludCBkYjg1MDBfcHJjbXVfc2V0X2FwZV9vcHAodTggb3BwKTsKIGludCBkYjg1MDBfcHJjbXVfZ2V0X2FwZV9vcHAodm9pZCk7CiBpbnQgZGI4NTAwX3ByY211X3JlcXVlc3RfYXBlX29wcF8xMDBfdm9sdGFnZShib29sIGVuYWJsZSk7Ci1pbnQgZGI4NTAwX3ByY211X3NldF9kZHJfb3BwKHU4IG9wcCk7CiBpbnQgZGI4NTAwX3ByY211X2dldF9kZHJfb3BwKHZvaWQpOwogCiB1MzIgZGI4NTAwX3ByY211X3JlYWQodW5zaWduZWQgaW50IHJlZyk7CkBAIC01OTQsMTEgKzU5Myw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9zZXRfZGRyX29wcCh1OCBvcHApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IGRiODUwMF9wcmNtdV9nZXRfZGRyX29wcCh2b2lkKQogewogCXJldHVybiBERFJfMTAwX09QUDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2RieDUwMC1wcmNtdS5oIGIvaW5jbHVkZS9saW51eC9tZmQvZGJ4NTAwLXByY211LmgKaW5kZXggNWQzNzQ2MC4uMmUyYzZhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvZGJ4NTAwLXByY211LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvZGJ4NTAwLXByY211LmgKQEAgLTI2OSwxMCArMjY5LDYgQEAKIGxvbmcgcHJjbXVfcm91bmRfY2xvY2tfcmF0ZSh1OCBjbG9jaywgdW5zaWduZWQgbG9uZyByYXRlKTsKIGludCBwcmNtdV9zZXRfY2xvY2tfcmF0ZSh1OCBjbG9jaywgdW5zaWduZWQgbG9uZyByYXRlKTsKIAotc3RhdGljIGlubGluZSBpbnQgcHJjbXVfc2V0X2Rkcl9vcHAodTggb3BwKQotewotCXJldHVybiBkYjg1MDBfcHJjbXVfc2V0X2Rkcl9vcHAob3BwKTsKLX0KIHN0YXRpYyBpbmxpbmUgaW50IHByY211X2dldF9kZHJfb3BwKHZvaWQpCiB7CiAJcmV0dXJuIGRiODUwMF9wcmNtdV9nZXRfZGRyX29wcCgpOwpAQCAtNDg5LDExICs0ODUsNiBAQAogCXJldHVybiBBUk1fMTAwX09QUDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHJjbXVfc2V0X2Rkcl9vcHAodTggb3BwKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBwcmNtdV9nZXRfZGRyX29wcCh2b2lkKQogewogCXJldHVybiBERFJfMTAwX09QUDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL2xwODczeC5oIGIvaW5jbHVkZS9saW51eC9tZmQvbHA4NzN4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiZWM4MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL2xwODczeC5oCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogRnVuY3Rpb25zIHRvIGFjY2VzcyBMUDg3M1ggcG93ZXIgbWFuYWdlbWVudCBjaGlwLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX0xQODczWF9ICisjZGVmaW5lIF9fTElOVVhfTUZEX0xQODczWF9ICisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKworLyogTFA4NzN4IGNoaXAgaWQgbGlzdCAqLworI2RlZmluZSBMUDg3M1gJCQkweDAwCisKKy8qIEFsbCByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgTFA4NzNYX1JFR19ERVZfUkVWCQkwWDAwCisjZGVmaW5lIExQODczWF9SRUdfT1RQX1JFVgkJMFgwMQorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0swX0NUUkxfMQkJMFgwMgorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0swX0NUUkxfMgkJMFgwMworI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0sxX0NUUkxfMQkJMFgwNAorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0sxX0NUUkxfMgkJMFgwNQorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0swX1ZPVVQJCTBYMDYKKyNkZWZpbmUgTFA4NzNYX1JFR19CVUNLMV9WT1VUCQkwWDA3CisjZGVmaW5lIExQODczWF9SRUdfTERPMF9DVFJMCQkwWDA4CisjZGVmaW5lIExQODczWF9SRUdfTERPMV9DVFJMICAgICAgICAgICAgMFgwOQorI2RlZmluZSBMUDg3M1hfUkVHX0xETzBfVk9VVAkJMFgwQQorI2RlZmluZSBMUDg3M1hfUkVHX0xETzFfVk9VVAkJMFgwQgorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0swX0RFTEFZCQkwWDBDCisjZGVmaW5lIExQODczWF9SRUdfQlVDSzFfREVMQVkJCTBYMEQKKyNkZWZpbmUgTFA4NzNYX1JFR19MRE8wX0RFTEFZCQkwWDBFCisjZGVmaW5lIExQODczWF9SRUdfTERPMV9ERUxBWQkJMFgwRgorI2RlZmluZSBMUDg3M1hfUkVHX0dQT19ERUxBWQkJMFgxMAorI2RlZmluZSBMUDg3M1hfUkVHX0dQTzJfREVMQVkJCTBYMTEKKyNkZWZpbmUgTFA4NzNYX1JFR19HUE9fQ1RSTAkJMFgxMgorI2RlZmluZSBMUDg3M1hfUkVHX0NPTkZJRwkJMFgxMworI2RlZmluZSBMUDg3M1hfUkVHX1BMTF9DVFJMCQkwWDE0CisjZGVmaW5lIExQODczWF9SRUdfUEdPT0RfQ1RSTDEJCTBYMTUKKyNkZWZpbmUgTFA4NzNYX1JFR19QR09PRF9DVFJMMgkJMFgxNgorI2RlZmluZSBMUDg3M1hfUkVHX1BHX0ZBVUxUCQkwWDE3CisjZGVmaW5lIExQODczWF9SRUdfUkVTRVQJCTBYMTgKKyNkZWZpbmUgTFA4NzNYX1JFR19JTlRfVE9QXzEJCTBYMTkKKyNkZWZpbmUgTFA4NzNYX1JFR19JTlRfVE9QXzIJCTBYMUEKKyNkZWZpbmUgTFA4NzNYX1JFR19JTlRfQlVDSwkJMFgxQgorI2RlZmluZSBMUDg3M1hfUkVHX0lOVF9MRE8JCTBYMUMKKyNkZWZpbmUgTFA4NzNYX1JFR19UT1BfU1RBVAkJMFgxRAorI2RlZmluZSBMUDg3M1hfUkVHX0JVQ0tfU1RBVAkJMFgxRQorI2RlZmluZSBMUDg3M1hfUkVHX0xET19TVEFUCQkweDFGCisjZGVmaW5lIExQODczWF9SRUdfVE9QX01BU0tfMQkJMHgyMAorI2RlZmluZSBMUDg3M1hfUkVHX1RPUF9NQVNLXzIJCTB4MjEKKyNkZWZpbmUgTFA4NzNYX1JFR19CVUNLX01BU0sJCTB4MjIKKyNkZWZpbmUgTFA4NzNYX1JFR19MRE9fTUFTSwkJMHgyMworI2RlZmluZSBMUDg3M1hfUkVHX1NFTF9JX0xPQUQJCTB4MjQKKyNkZWZpbmUgTFA4NzNYX1JFR19JX0xPQURfMgkJMHgyNQorI2RlZmluZSBMUDg3M1hfUkVHX0lfTE9BRF8xCQkweDI2CisKKyNkZWZpbmUgTFA4NzNYX1JFR19NQVgJCQlMUDg3M1hfUkVHX0lfTE9BRF8xCisKKy8qIFJlZ2lzdGVyIGZpZWxkIGRlZmluaXRpb25zICovCisjZGVmaW5lIExQODczWF9ERVZfUkVWX0RFVl9JRAkJCTB4QzAKKyNkZWZpbmUgTFA4NzNYX0RFVl9SRVZfQUxMX0xBWUVSCQkweDMwCisjZGVmaW5lIExQODczWF9ERVZfUkVWX01FVEFMX0xBWUVSCQkweDBGCisKKyNkZWZpbmUgTFA4NzNYX09UUF9SRVZfT1RQX0lECQkJMHhGRgorCisjZGVmaW5lIExQODczWF9CVUNLMF9DVFJMXzFfQlVDSzBfRlBXTQkJQklUKDMpCisjZGVmaW5lIExQODczWF9CVUNLMF9DVFJMXzFfQlVDSzBfUkRJU19FTglCSVQoMikKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX0NUUkxfMV9CVUNLMF9FTl9QSU5fQ1RSTAlCSVQoMSkKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX0NUUkxfMV9CVUNLMF9FTgkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX0NUUkxfMl9CVUNLMF9JTElNCQkweDM4CisjZGVmaW5lIExQODczWF9CVUNLMF9DVFJMXzJfQlVDSzBfU0xFV19SQVRFCTB4MDcKKworI2RlZmluZSBMUDg3M1hfQlVDSzFfQ1RSTF8xX0JVQ0sxX0ZQV00JCUJJVCgzKQorI2RlZmluZSBMUDg3M1hfQlVDSzFfQ1RSTF8xX0JVQ0sxX1JESVNfRU4JQklUKDIpCisjZGVmaW5lIExQODczWF9CVUNLMV9DVFJMXzFfQlVDSzFfRU5fUElOX0NUUkwJQklUKDEpCisjZGVmaW5lIExQODczWF9CVUNLMV9DVFJMXzFfQlVDSzFfRU4JCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9CVUNLMV9DVFJMXzJfQlVDSzFfSUxJTQkJMHgzOAorI2RlZmluZSBMUDg3M1hfQlVDSzFfQ1RSTF8yX0JVQ0sxX1NMRVdfUkFURQkweDA3CisKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX1ZPVVRfQlVDSzBfVlNFVAkJMHhGRgorCisjZGVmaW5lIExQODczWF9CVUNLMV9WT1VUX0JVQ0sxX1ZTRVQJCTB4RkYKKworI2RlZmluZSBMUDg3M1hfTERPMF9DVFJMX0xETzBfUkRJU19FTgkJQklUKDIpCisjZGVmaW5lIExQODczWF9MRE8wX0NUUkxfTERPMF9FTl9QSU5fQ1RSTAlCSVQoMSkKKyNkZWZpbmUgTFA4NzNYX0xETzBfQ1RSTF9MRE8wX0VOCQlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfTERPMV9DVFJMX0xETzFfUkRJU19FTgkJQklUKDIpCisjZGVmaW5lIExQODczWF9MRE8xX0NUUkxfTERPMV9FTl9QSU5fQ1RSTAlCSVQoMSkKKyNkZWZpbmUgTFA4NzNYX0xETzFfQ1RSTF9MRE8xX0VOCQlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfTERPMF9WT1VUX0xETzBfVlNFVAkJMHgxRgorCisjZGVmaW5lIExQODczWF9MRE8xX1ZPVVRfTERPMV9WU0VUCQkweDFGCisKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX0RFTEFZX0JVQ0swX1NEX0RFTEFZCTB4RjAKKyNkZWZpbmUgTFA4NzNYX0JVQ0swX0RFTEFZX0JVQ0swX1NVX0RFTEFZCTB4MEYKKworI2RlZmluZSBMUDg3M1hfQlVDSzFfREVMQVlfQlVDSzFfU0RfREVMQVkJMHhGMAorI2RlZmluZSBMUDg3M1hfQlVDSzFfREVMQVlfQlVDSzFfU1VfREVMQVkJMHgwRgorCisjZGVmaW5lIExQODczWF9MRE8wX0RFTEFZX0xETzBfU0RfREVMQVkJMHhGMAorI2RlZmluZSBMUDg3M1hfTERPMF9ERUxBWV9MRE8wX1NVX0RFTEFZCTB4MEYKKworI2RlZmluZSBMUDg3M1hfTERPMV9ERUxBWV9MRE8xX1NEX0RFTEFZCTB4RjAKKyNkZWZpbmUgTFA4NzNYX0xETzFfREVMQVlfTERPMV9TVV9ERUxBWQkweDBGCisKKyNkZWZpbmUgTFA4NzNYX0dQT19ERUxBWV9HUE9fU0RfREVMQVkJCTB4RjAKKyNkZWZpbmUgTFA4NzNYX0dQT19ERUxBWV9HUE9fU1VfREVMQVkJCTB4MEYKKworI2RlZmluZSBMUDg3M1hfR1BPMl9ERUxBWV9HUE8yX1NEX0RFTEFZCTB4RjAKKyNkZWZpbmUgTFA4NzNYX0dQTzJfREVMQVlfR1BPMl9TVV9ERUxBWQkweDBGCisKKyNkZWZpbmUgTFA4NzNYX0dQT19DVFJMX0dQTzJfT0QJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfR1BPX0NUUkxfR1BPMl9FTl9QSU5fQ1RSTAlCSVQoNSkKKyNkZWZpbmUgTFA4NzNYX0dQT19DVFJMX0dQTzJfRU4JCUJJVCg0KQorI2RlZmluZSBMUDg3M1hfR1BPX0NUUkxfR1BPX09ECQkJQklUKDIpCisjZGVmaW5lIExQODczWF9HUE9fQ1RSTF9HUE9fRU5fUElOX0NUUkwJQklUKDEpCisjZGVmaW5lIExQODczWF9HUE9fQ1RSTF9HUE9fRU4JCQlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfQ09ORklHX1NVX0RFTEFZX1NFTAkJQklUKDYpCisjZGVmaW5lIExQODczWF9DT05GSUdfU0RfREVMQVlfU0VMCQlCSVQoNSkKKyNkZWZpbmUgTFA4NzNYX0NPTkZJR19DTEtJTl9QSU5fU0VMCQlCSVQoNCkKKyNkZWZpbmUgTFA4NzNYX0NPTkZJR19DTEtJTl9QRAkJCUJJVCgzKQorI2RlZmluZSBMUDg3M1hfQ09ORklHX0VOX1BECQkJQklUKDIpCisjZGVmaW5lIExQODczWF9DT05GSUdfVERJRV9XQVJOX0xFVkVMCQlCSVQoMSkKKyNkZWZpbmUgTFA4NzNYX0VOX1NQUkVBRF9TUEVDCQkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX1BMTF9DVFJMX0VOX1BMTAkJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfRVhUX0NMS19GUkVRCQkJMHgxRgorCisjZGVmaW5lIExQODczWF9QR09PRF9DVFJMMV9QR09PRF9QT0wJCUJJVCg3KQorI2RlZmluZSBMUDg3M1hfUEdPT0RfQ1RSTDFfUEdPT0RfT0QJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfUEdPT0RfQ1RSTDFfUEdPT0RfV0lORE9XX0xETwlCSVQoNSkKKyNkZWZpbmUgTFA4NzNYX1BHT09EX0NUUkwxX1BHT09EX1dJTkRPV05fQlVDSwlCSVQoNCkKKyNkZWZpbmUgTFA4NzNYX1BHT09EX0NUUkwxX1BHT09EX0VOX1BHT09EX0xETzEJQklUKDMpCisjZGVmaW5lIExQODczWF9QR09PRF9DVFJMMV9QR09PRF9FTl9QR09PRF9MRE8wCUJJVCgyKQorI2RlZmluZSBMUDg3M1hfUEdPT0RfQ1RSTDFfUEdPT0RfRU5fUEdPT0RfQlVDSzEJQklUKDEpCisjZGVmaW5lIExQODczWF9QR09PRF9DVFJMMV9QR09PRF9FTl9QR09PRF9CVUNLMAlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfUEdPT0RfQ1RSTDJfRU5fUEdPT0RfVFdBUk4JQklUKDIpCisjZGVmaW5lIExQODczWF9QR09PRF9DVFJMMl9FTl9QR19GQVVMVF9HQVRFCUJJVCgxKQorI2RlZmluZSBMUDg3M1hfUEdPT0RfQ1RSTDJfUEdPT0RfTU9ERQkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX1BHX0ZBVUxUX1BHX0ZBVUxUX0xETzEJCUJJVCgzKQorI2RlZmluZSBMUDg3M1hfUEdfRkFVTFRfUEdfRkFVTFRfTERPMAkJQklUKDIpCisjZGVmaW5lIExQODczWF9QR19GQVVMVF9QR19GQVVMVF9CVUNLMQkJQklUKDEpCisjZGVmaW5lIExQODczWF9QR19GQVVMVF9QR19GQVVMVF9CVUNLMAkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX1JFU0VUX1NXX1JFU0VUCQkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX0lOVF9UT1BfMV9QR09PRF9JTlQJCUJJVCg3KQorI2RlZmluZSBMUDg3M1hfSU5UX1RPUF8xX0xET19JTlQJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfSU5UX1RPUF8xX0JVQ0tfSU5UCQlCSVQoNSkKKyNkZWZpbmUgTFA4NzNYX0lOVF9UT1BfMV9TWU5DX0NMS19JTlQJCUJJVCg0KQorI2RlZmluZSBMUDg3M1hfSU5UX1RPUF8xX1RESUVfU0RfSU5UCQlCSVQoMykKKyNkZWZpbmUgTFA4NzNYX0lOVF9UT1BfMV9URElFX1dBUk5fSU5UCQlCSVQoMikKKyNkZWZpbmUgTFA4NzNYX0lOVF9UT1BfMV9PVlBfSU5UCQlCSVQoMSkKKyNkZWZpbmUgTFA4NzNYX0lOVF9UT1BfMV9JX01FQVNfSU5UCQlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfSU5UX1RPUF8yX1JFU0VUX1JFR19JTlQJCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9JTlRfQlVDS19CVUNLMV9QR19JTlQJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfSU5UX0JVQ0tfQlVDSzFfU0NfSU5UCQlCSVQoNSkKKyNkZWZpbmUgTFA4NzNYX0lOVF9CVUNLX0JVQ0sxX0lMSU1fSU5UCQlCSVQoNCkKKyNkZWZpbmUgTFA4NzNYX0lOVF9CVUNLX0JVQ0swX1BHX0lOVAkJQklUKDIpCisjZGVmaW5lIExQODczWF9JTlRfQlVDS19CVUNLMF9TQ19JTlQJCUJJVCgxKQorI2RlZmluZSBMUDg3M1hfSU5UX0JVQ0tfQlVDSzBfSUxJTV9JTlQJCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9JTlRfTERPX0xETzFfUEdfSU5UCQlCSVQoNikKKyNkZWZpbmUgTFA4NzNYX0lOVF9MRE9fTERPMV9TQ19JTlQJCUJJVCg1KQorI2RlZmluZSBMUDg3M1hfSU5UX0xET19MRE8xX0lMSU1fSU5UCQlCSVQoNCkKKyNkZWZpbmUgTFA4NzNYX0lOVF9MRE9fTERPMF9QR19JTlQJCUJJVCgyKQorI2RlZmluZSBMUDg3M1hfSU5UX0xET19MRE8wX1NDX0lOVAkJQklUKDEpCisjZGVmaW5lIExQODczWF9JTlRfTERPX0xETzBfSUxJTV9JTlQJCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9UT1BfU1RBVF9QR09PRF9TVEFUCQlCSVQoNykKKyNkZWZpbmUgTFA4NzNYX1RPUF9TVEFUX1NZTkNfQ0xLX1NUQVQJCUJJVCg0KQorI2RlZmluZSBMUDg3M1hfVE9QX1NUQVRfVERJRV9TRF9TVEFUCQlCSVQoMykKKyNkZWZpbmUgTFA4NzNYX1RPUF9TVEFUX1RESUVfV0FSTl9TVEFUCQlCSVQoMikKKyNkZWZpbmUgTFA4NzNYX1RPUF9TVEFUX09WUF9TVEFUCQlCSVQoMSkKKworI2RlZmluZSBMUDg3M1hfQlVDS19TVEFUX0JVQ0sxX1NUQVQJCUJJVCg3KQorI2RlZmluZSBMUDg3M1hfQlVDS19TVEFUX0JVQ0sxX1BHX1NUQVQJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfQlVDS19TVEFUX0JVQ0sxX0lMSU1fU1RBVAlCSVQoNCkKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfU1RBVF9CVUNLMF9TVEFUCQlCSVQoMykKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfU1RBVF9CVUNLMF9QR19TVEFUCQlCSVQoMikKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfU1RBVF9CVUNLMF9JTElNX1NUQVQJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX0xET19TVEFUX0xETzFfU1RBVAkJQklUKDcpCisjZGVmaW5lIExQODczWF9MRE9fU1RBVF9MRE8xX1BHX1NUQVQJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfTERPX1NUQVRfTERPMV9JTElNX1NUQVQJCUJJVCg0KQorI2RlZmluZSBMUDg3M1hfTERPX1NUQVRfTERPMF9TVEFUCQlCSVQoMykKKyNkZWZpbmUgTFA4NzNYX0xET19TVEFUX0xETzBfUEdfU1RBVAkJQklUKDIpCisjZGVmaW5lIExQODczWF9MRE9fU1RBVF9MRE8wX0lMSU1fU1RBVAkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX1RPUF9NQVNLXzFfUEdPT0RfSU5UX01BU0sJQklUKDcpCisjZGVmaW5lIExQODczWF9UT1BfTUFTS18xX1NZTkNfQ0xLX01BU0sJQklUKDQpCisjZGVmaW5lIExQODczWF9UT1BfTUFTS18xX1RESUVfV0FSTl9NQVNLCUJJVCgyKQorI2RlZmluZSBMUDg3M1hfVE9QX01BU0tfMV9JX01FQVNfTUFTSwkJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX1RPUF9NQVNLXzJfUkVTRVRfUkVHX01BU0sJQklUKDApCisKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfTUFTS19CVUNLMV9QR0ZfTUFTSwlCSVQoNykKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfTUFTS19CVUNLMV9QR1JfTUFTSwlCSVQoNikKKyNkZWZpbmUgTFA4NzNYX0JVQ0tfTUFTS19CVUNLMV9JTElNX01BU0sJQklUKDQpCisjZGVmaW5lIExQODczWF9CVUNLX01BU0tfQlVDSzBfUEdGX01BU0sJQklUKDMpCisjZGVmaW5lIExQODczWF9CVUNLX01BU0tfQlVDSzBfUEdSX01BU0sJQklUKDIpCisjZGVmaW5lIExQODczWF9CVUNLX01BU0tfQlVDSzBfSUxJTV9NQVNLCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9MRE9fTUFTS19MRE8xX1BHRl9NQVNLCQlCSVQoNykKKyNkZWZpbmUgTFA4NzNYX0xET19NQVNLX0xETzFfUEdSX01BU0sJCUJJVCg2KQorI2RlZmluZSBMUDg3M1hfTERPX01BU0tfTERPMV9JTElNX01BU0sJCUJJVCg0KQorI2RlZmluZSBMUDg3M1hfTERPX01BU0tfTERPMF9QR0ZfTUFTSwkJQklUKDMpCisjZGVmaW5lIExQODczWF9MRE9fTUFTS19MRE8wX1BHUl9NQVNLCQlCSVQoMikKKyNkZWZpbmUgTFA4NzNYX0xET19NQVNLX0xETzBfSUxJTV9NQVNLCQlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfU0VMX0lfTE9BRF9DVVJSRU5UX0JVQ0tfU0VMRUNUCUJJVCgwKQorCisjZGVmaW5lIExQODczWF9JX0xPQURfMl9CVUNLX0xPQURfQ1VSUkVOVAlCSVQoMCkKKworI2RlZmluZSBMUDg3M1hfSV9MT0FEXzFfQlVDS19MT0FEX0NVUlJFTlQJMHhGRgorCisjZGVmaW5lIExQODczWF9NQVhfUkVHX0lECQlMUDg3M1hfTERPXzEKKworLyogTnVtYmVyIG9mIHN0ZXAtZG93biBjb252ZXJ0ZXJzIGF2YWlsYWJsZSAqLworI2RlZmluZSBMUDg3M1hfTlVNX0JVQ0sJCTIKKy8qIE51bWJlciBvZiBMRE8gdm9sdGFnZSByZWd1bGF0b3JzIGF2YWlsYWJsZSAqLworI2RlZmluZSBMUDg3M1hfTlVNX0xETwkJMgorLyogTnVtYmVyIG9mIHRvdGFsIHJlZ3VsYXRvcnMgYXZhaWxhYmxlICovCisjZGVmaW5lIExQODczWF9OVU1fUkVHVUxBVE9SCQkoTFA4NzNYX05VTV9CVUNLICsgTFA4NzNYX05VTV9MRE8pCisKK2VudW0gbHA4NzN4X3JlZ3VsYXRvcl9pZCB7CisJLyogQlVDSydzICovCisJTFA4NzNYX0JVQ0tfMCwKKwlMUDg3M1hfQlVDS18xLAorCS8qIExET3MgKi8KKwlMUDg3M1hfTERPXzAsCisJTFA4NzNYX0xET18xLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgbHA4NzN4IC0gc3RhdGUgaG9sZGVyIGZvciB0aGUgbHA4NzN4IGRyaXZlcgorICogQGRldjogc3RydWN0IGRldmljZSBwb2ludGVyIGZvciBNRkQgZGV2aWNlCisgKiBAcmV2OiByZXZpc2lvbiBvZiB0aGUgbHA4NzN4CisgKiBAbG9jazogbG9jayBndWFyZGluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAqIEByZWdtYXA6IHJlZ2lzdGVyIG1hcCBvZiB0aGUgbHA4NzN4IFBNSUMKKyAqCisgKiBEZXZpY2UgZGF0YSBtYXkgYmUgdXNlZCB0byBhY2Nlc3MgdGhlIExQODczWCBjaGlwCisgKi8KK3N0cnVjdCBscDg3M3ggeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1OCByZXY7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworfTsKKyNlbmRpZiAvKiBfX0xJTlVYX01GRF9MUDg3M1hfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvbWF4MTQ1NzctcHJpdmF0ZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4MTQ1NzctcHJpdmF0ZS5oCmluZGV4IGYwMWMxZmEuLmRmNzUyMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL21heDE0NTc3LXByaXZhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9tYXgxNDU3Ny1wcml2YXRlLmgKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDE0IFNhbXN1bmcgRWxlY3Rybm9pY3MKICAqIENoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgotICogS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CisgKiBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9tYXgxNDU3Ny5oIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4MTQ1NzcuaAppbmRleCBjY2ZhZjk1Li5kODFiNTJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9tYXgxNDU3Ny5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL21heDE0NTc3LmgKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDE0IFNhbXN1bmcgRWxlY3Rybm9pY3MKICAqIENoYW53b28gQ2hvaSA8Y3cwMC5jaG9pQHNhbXN1bmcuY29tPgotICogS3J6eXN6dG9mIEtvemxvd3NraSA8ay5rb3psb3dza2lAc2Ftc3VuZy5jb20+CisgKiBLcnp5c3p0b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9yazgwOC5oIGIvaW5jbHVkZS9saW51eC9tZmQvcms4MDguaAppbmRleCA0NDFiNmVlLi42ZDQzNWEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9yazgwOC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3JrODA4LmgKQEAgLTEsMTEgKzEsMTUgQEAKIC8qCi0gKiByazgwOC5oIGZvciBSb2NrY2hpcCBSSzgwOAorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIFJvY2tjaGlwJ3MgUks4MDgvUks4MTggUE1JQwogICoKICAqIENvcHlyaWdodCAoYykgMjAxNCwgRnV6aG91IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkCiAgKgogICogQXV0aG9yOiBDaHJpcyBaaG9uZyA8enl3QHJvY2stY2hpcHMuY29tPgogICogQXV0aG9yOiBaaGFuZyBRaW5nIDx6aGFuZ3FpbmdAcm9jay1jaGlwcy5jb20+CiAgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFBIWVRFQyBNZXNzdGVjaG5payBHbWJICisgKgorICogQXV0aG9yOiBXYWRpbSBFZ29yb3YgPHcuZWdvcm92QHBoeXRlYy5kZT4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKICAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCkBAIC0xNiw4ICsyMCw4IEBACiAgKiBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2lmbmRlZiBfX0xJTlVYX1JFR1VMQVRPUl9yazgwOF9ICi0jZGVmaW5lIF9fTElOVVhfUkVHVUxBVE9SX3JrODA4X0gKKyNpZm5kZWYgX19MSU5VWF9SRUdVTEFUT1JfUks4MDhfSAorI2RlZmluZSBfX0xJTlVYX1JFR1VMQVRPUl9SSzgwOF9ICiAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgpAQCAtMjgsNyArMzIsNyBAQAogCiAjZGVmaW5lIFJLODA4X0RDREMxCTAgLyogKDArUks4MDhfU1RBUlQpICovCiAjZGVmaW5lIFJLODA4X0xETzEJNCAvKiAoNCtSSzgwOF9TVEFSVCkgKi8KLSNkZWZpbmUgUks4MDhfTlVNX1JFR1VMQVRPUlMgICAxNAorI2RlZmluZSBSSzgwOF9OVU1fUkVHVUxBVE9SUwkxNAogCiBlbnVtIHJrODA4X3JlZyB7CiAJUks4MDhfSURfRENEQzEsCkBAIC02NSw2ICs2OSw4IEBACiAjZGVmaW5lIFJLODA4X1JUQ19JTlRfUkVHCTB4MTIKICNkZWZpbmUgUks4MDhfUlRDX0NPTVBfTFNCX1JFRwkweDEzCiAjZGVmaW5lIFJLODA4X1JUQ19DT01QX01TQl9SRUcJMHgxNAorI2RlZmluZSBSSzgwOF9JRF9NU0IJCTB4MTcKKyNkZWZpbmUgUks4MDhfSURfTFNCCQkweDE4CiAjZGVmaW5lIFJLODA4X0NMSzMyT1VUX1JFRwkweDIwCiAjZGVmaW5lIFJLODA4X1ZCX01PTl9SRUcJMHgyMQogI2RlZmluZSBSSzgwOF9USEVSTUFMX1JFRwkweDIyCkBAIC0xMTUsNyArMTIxLDkyIEBACiAjZGVmaW5lIFJLODA4X0lOVF9TVFNfTVNLX1JFRzIJMHg0ZgogI2RlZmluZSBSSzgwOF9JT19QT0xfUkVHCTB4NTAKIAotLyogSVJRIERlZmluaXRpb25zICovCisvKiBSSzgxOCAqLworI2RlZmluZSBSSzgxOF9EQ0RDMQkJCTAKKyNkZWZpbmUgUks4MThfTERPMQkJCTQKKyNkZWZpbmUgUks4MThfTlVNX1JFR1VMQVRPUlMJCTE3CisKK2VudW0gcms4MThfcmVnIHsKKwlSSzgxOF9JRF9EQ0RDMSwKKwlSSzgxOF9JRF9EQ0RDMiwKKwlSSzgxOF9JRF9EQ0RDMywKKwlSSzgxOF9JRF9EQ0RDNCwKKwlSSzgxOF9JRF9CT09TVCwKKwlSSzgxOF9JRF9MRE8xLAorCVJLODE4X0lEX0xETzIsCisJUks4MThfSURfTERPMywKKwlSSzgxOF9JRF9MRE80LAorCVJLODE4X0lEX0xETzUsCisJUks4MThfSURfTERPNiwKKwlSSzgxOF9JRF9MRE83LAorCVJLODE4X0lEX0xETzgsCisJUks4MThfSURfTERPOSwKKwlSSzgxOF9JRF9TV0lUQ0gsCisJUks4MThfSURfSERNSV9TV0lUQ0gsCisJUks4MThfSURfT1RHX1NXSVRDSCwKK307CisKKyNkZWZpbmUgUks4MThfRENEQ19FTl9SRUcJCTB4MjMKKyNkZWZpbmUgUks4MThfTERPX0VOX1JFRwkJMHgyNAorI2RlZmluZSBSSzgxOF9TTEVFUF9TRVRfT0ZGX1JFRzEJMHgyNQorI2RlZmluZSBSSzgxOF9TTEVFUF9TRVRfT0ZGX1JFRzIJMHgyNgorI2RlZmluZSBSSzgxOF9EQ0RDX1VWX1NUU19SRUcJCTB4MjcKKyNkZWZpbmUgUks4MThfRENEQ19VVl9BQ1RfUkVHCQkweDI4CisjZGVmaW5lIFJLODE4X0xET19VVl9TVFNfUkVHCQkweDI5CisjZGVmaW5lIFJLODE4X0xET19VVl9BQ1RfUkVHCQkweDJhCisjZGVmaW5lIFJLODE4X0RDRENfUEdfUkVHCQkweDJiCisjZGVmaW5lIFJLODE4X0xET19QR19SRUcJCTB4MmMKKyNkZWZpbmUgUks4MThfVk9VVF9NT05fVERCX1JFRwkJMHgyZAorI2RlZmluZSBSSzgxOF9CVUNLMV9DT05GSUdfUkVHCQkweDJlCisjZGVmaW5lIFJLODE4X0JVQ0sxX09OX1ZTRUxfUkVHCQkweDJmCisjZGVmaW5lIFJLODE4X0JVQ0sxX1NMUF9WU0VMX1JFRwkweDMwCisjZGVmaW5lIFJLODE4X0JVQ0syX0NPTkZJR19SRUcJCTB4MzIKKyNkZWZpbmUgUks4MThfQlVDSzJfT05fVlNFTF9SRUcJCTB4MzMKKyNkZWZpbmUgUks4MThfQlVDSzJfU0xQX1ZTRUxfUkVHCTB4MzQKKyNkZWZpbmUgUks4MThfQlVDSzNfQ09ORklHX1JFRwkJMHgzNgorI2RlZmluZSBSSzgxOF9CVUNLNF9DT05GSUdfUkVHCQkweDM3CisjZGVmaW5lIFJLODE4X0JVQ0s0X09OX1ZTRUxfUkVHCQkweDM4CisjZGVmaW5lIFJLODE4X0JVQ0s0X1NMUF9WU0VMX1JFRwkweDM5CisjZGVmaW5lIFJLODE4X0JPT1NUX0NPTkZJR19SRUcJCTB4M2EKKyNkZWZpbmUgUks4MThfTERPMV9PTl9WU0VMX1JFRwkJMHgzYgorI2RlZmluZSBSSzgxOF9MRE8xX1NMUF9WU0VMX1JFRwkJMHgzYworI2RlZmluZSBSSzgxOF9MRE8yX09OX1ZTRUxfUkVHCQkweDNkCisjZGVmaW5lIFJLODE4X0xETzJfU0xQX1ZTRUxfUkVHCQkweDNlCisjZGVmaW5lIFJLODE4X0xETzNfT05fVlNFTF9SRUcJCTB4M2YKKyNkZWZpbmUgUks4MThfTERPM19TTFBfVlNFTF9SRUcJCTB4NDAKKyNkZWZpbmUgUks4MThfTERPNF9PTl9WU0VMX1JFRwkJMHg0MQorI2RlZmluZSBSSzgxOF9MRE80X1NMUF9WU0VMX1JFRwkJMHg0MgorI2RlZmluZSBSSzgxOF9MRE81X09OX1ZTRUxfUkVHCQkweDQzCisjZGVmaW5lIFJLODE4X0xETzVfU0xQX1ZTRUxfUkVHCQkweDQ0CisjZGVmaW5lIFJLODE4X0xETzZfT05fVlNFTF9SRUcJCTB4NDUKKyNkZWZpbmUgUks4MThfTERPNl9TTFBfVlNFTF9SRUcJCTB4NDYKKyNkZWZpbmUgUks4MThfTERPN19PTl9WU0VMX1JFRwkJMHg0NworI2RlZmluZSBSSzgxOF9MRE83X1NMUF9WU0VMX1JFRwkJMHg0OAorI2RlZmluZSBSSzgxOF9MRE84X09OX1ZTRUxfUkVHCQkweDQ5CisjZGVmaW5lIFJLODE4X0xETzhfU0xQX1ZTRUxfUkVHCQkweDRhCisjZGVmaW5lIFJLODE4X0JPT1NUX0xETzlfT05fVlNFTF9SRUcJMHg1NAorI2RlZmluZSBSSzgxOF9CT09TVF9MRE85X1NMUF9WU0VMX1JFRwkweDU1CisjZGVmaW5lIFJLODE4X0RFVkNUUkxfUkVHCQkweDRiCisjZGVmaW5lIFJLODE4X0lOVF9TVFNfUkVHMQkJMFg0YworI2RlZmluZSBSSzgxOF9JTlRfU1RTX01TS19SRUcxCQkweDRkCisjZGVmaW5lIFJLODE4X0lOVF9TVFNfUkVHMgkJMHg0ZQorI2RlZmluZSBSSzgxOF9JTlRfU1RTX01TS19SRUcyCQkweDRmCisjZGVmaW5lIFJLODE4X0lPX1BPTF9SRUcJCTB4NTAKKyNkZWZpbmUgUks4MThfSDVWX0VOX1JFRwkJMHg1MgorI2RlZmluZSBSSzgxOF9TTEVFUF9TRVRfT0ZGX1JFRzMJMHg1MworI2RlZmluZSBSSzgxOF9CT09TVF9MRE85X09OX1ZTRUxfUkVHCTB4NTQKKyNkZWZpbmUgUks4MThfQk9PU1RfTERPOV9TTFBfVlNFTF9SRUcJMHg1NQorI2RlZmluZSBSSzgxOF9CT09TVF9DVFJMX1JFRwkJMHg1NgorI2RlZmluZSBSSzgxOF9EQ0RDX0lMTUFYCQkweDkwCisjZGVmaW5lIFJLODE4X1VTQl9DVFJMX1JFRwkJMHhhMQorCisjZGVmaW5lIFJLODE4X0g1Vl9FTgkJCUJJVCgwKQorI2RlZmluZSBSSzgxOF9SRUZfUkRZX0NUUkwJCUJJVCgxKQorI2RlZmluZSBSSzgxOF9VU0JfSUxJTV9TRUxfTUFTSwkJMHhmCisjZGVmaW5lIFJLODE4X1VTQl9JTE1JTl8yMDAwTUEJCTB4NworI2RlZmluZSBSSzgxOF9VU0JfQ0hHX1NEX1ZTRUxfTUFTSwkweDcwCisKKy8qIFJLODA4IElSUSBEZWZpbml0aW9ucyAqLwogI2RlZmluZSBSSzgwOF9JUlFfVk9VVF9MTwkwCiAjZGVmaW5lIFJLODA4X0lSUV9WQl9MTwkJMQogI2RlZmluZSBSSzgwOF9JUlFfUFdST04JCTIKQEAgLTEzNyw2ICsyMjgsNDMgQEAKICNkZWZpbmUgUks4MDhfSVJRX1BMVUdfSU5fSU5UX01TSwlCSVQoMCkKICNkZWZpbmUgUks4MDhfSVJRX1BMVUdfT1VUX0lOVF9NU0sJQklUKDEpCiAKKy8qIFJLODE4IElSUSBEZWZpbml0aW9ucyAqLworI2RlZmluZSBSSzgxOF9JUlFfVk9VVF9MTwkwCisjZGVmaW5lIFJLODE4X0lSUV9WQl9MTwkJMQorI2RlZmluZSBSSzgxOF9JUlFfUFdST04JCTIKKyNkZWZpbmUgUks4MThfSVJRX1BXUk9OX0xQCTMKKyNkZWZpbmUgUks4MThfSVJRX0hPVERJRQk0CisjZGVmaW5lIFJLODE4X0lSUV9SVENfQUxBUk0JNQorI2RlZmluZSBSSzgxOF9JUlFfUlRDX1BFUklPRAk2CisjZGVmaW5lIFJLODE4X0lSUV9VU0JfT1YJNworI2RlZmluZSBSSzgxOF9JUlFfUExVR19JTgk4CisjZGVmaW5lIFJLODE4X0lSUV9QTFVHX09VVAk5CisjZGVmaW5lIFJLODE4X0lSUV9DSEdfT0sJMTAKKyNkZWZpbmUgUks4MThfSVJRX0NIR19URQkxMQorI2RlZmluZSBSSzgxOF9JUlFfQ0hHX1RTMQkxMgorI2RlZmluZSBSSzgxOF9JUlFfVFMyCQkxMworI2RlZmluZSBSSzgxOF9JUlFfQ0hHX0NWVExJTQkxNAorI2RlZmluZSBSSzgxOF9JUlFfRElTQ0hHX0lMSU0JMTUKKworI2RlZmluZSBSSzgxOF9JUlFfVk9VVF9MT19NU0sJCUJJVCgwKQorI2RlZmluZSBSSzgxOF9JUlFfVkJfTE9fTVNLCQlCSVQoMSkKKyNkZWZpbmUgUks4MThfSVJRX1BXUk9OX01TSwkJQklUKDIpCisjZGVmaW5lIFJLODE4X0lSUV9QV1JPTl9MUF9NU0sJCUJJVCgzKQorI2RlZmluZSBSSzgxOF9JUlFfSE9URElFX01TSwkJQklUKDQpCisjZGVmaW5lIFJLODE4X0lSUV9SVENfQUxBUk1fTVNLCQlCSVQoNSkKKyNkZWZpbmUgUks4MThfSVJRX1JUQ19QRVJJT0RfTVNLCUJJVCg2KQorI2RlZmluZSBSSzgxOF9JUlFfVVNCX09WX01TSwkJQklUKDcpCisjZGVmaW5lIFJLODE4X0lSUV9QTFVHX0lOX01TSwkJQklUKDApCisjZGVmaW5lIFJLODE4X0lSUV9QTFVHX09VVF9NU0sJCUJJVCgxKQorI2RlZmluZSBSSzgxOF9JUlFfQ0hHX09LX01TSwkJQklUKDIpCisjZGVmaW5lIFJLODE4X0lSUV9DSEdfVEVfTVNLCQlCSVQoMykKKyNkZWZpbmUgUks4MThfSVJRX0NIR19UUzFfTVNLCQlCSVQoNCkKKyNkZWZpbmUgUks4MThfSVJRX1RTMl9NU0sJCUJJVCg1KQorI2RlZmluZSBSSzgxOF9JUlFfQ0hHX0NWVExJTV9NU0sJQklUKDYpCisjZGVmaW5lIFJLODE4X0lSUV9ESVNDSEdfSUxJTV9NU0sJQklUKDcpCisKKyNkZWZpbmUgUks4MThfTlVNX0lSUQkJMTYKKwogI2RlZmluZSBSSzgwOF9WQkFUX0xPV18yVjgJMHgwMAogI2RlZmluZSBSSzgwOF9WQkFUX0xPV18yVjkJMHgwMQogI2RlZmluZSBSSzgwOF9WQkFUX0xPV18zVjAJMHgwMgpAQCAtMTkxLDkgKzMxOSwxNyBAQAogCUJPT1NUX0lMTUlOXzI1ME1BLAogfTsKIAotc3RydWN0IHJrODA4IHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOwotCXN0cnVjdCByZWdtYXBfaXJxX2NoaXBfZGF0YSAqaXJxX2RhdGE7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOworZW51bSB7CisJUks4MDhfSUQgPSAweDAwMDAsCisJUks4MThfSUQgPSAweDgxODEsCiB9OwotI2VuZGlmIC8qIF9fTElOVVhfUkVHVUxBVE9SX3JrODA4X0ggKi8KKworc3RydWN0IHJrODA4IHsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkJKmkyYzsKKwlzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwX2RhdGEJKmlycV9kYXRhOworCXN0cnVjdCByZWdtYXAJCQkqcmVnbWFwOworCWxvbmcJCQkJdmFyaWFudDsKKwljb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZwkqcmVnbWFwX2NmZzsKKwljb25zdCBzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwCSpyZWdtYXBfaXJxX2NoaXA7Cit9OworI2VuZGlmIC8qIF9fTElOVVhfUkVHVUxBVE9SX1JLODA4X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3N0bXBlLmggYi9pbmNsdWRlL2xpbnV4L21mZC9zdG1wZS5oCmluZGV4IGRlNzQ4YmMuLjRhODI3YWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3N0bXBlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvc3RtcGUuaApAQCAtMjYsNiArMjYsNyBAQAogCVNUTVBFNjEwLAogCVNUTVBFODAxLAogCVNUTVBFODExLAorCVNUTVBFMTYwMCwKIAlTVE1QRTE2MDEsCiAJU1RNUEUxODAxLAogCVNUTVBFMjQwMSwKQEAgLTM5LDIyICs0MCw0MiBAQAogICovCiBlbnVtIHsKIAlTVE1QRV9JRFhfQ0hJUF9JRCwKKwlTVE1QRV9JRFhfU1lTX0NUUkwsCisJU1RNUEVfSURYX1NZU19DVFJMMiwKIAlTVE1QRV9JRFhfSUNSX0xTQiwKIAlTVE1QRV9JRFhfSUVSX0xTQiwKKwlTVE1QRV9JRFhfSUVSX01TQiwKIAlTVE1QRV9JRFhfSVNSX0xTQiwKIAlTVE1QRV9JRFhfSVNSX01TQiwKIAlTVE1QRV9JRFhfR1BNUl9MU0IsCisJU1RNUEVfSURYX0dQTVJfQ1NCLAorCVNUTVBFX0lEWF9HUE1SX01TQiwKIAlTVE1QRV9JRFhfR1BTUl9MU0IsCisJU1RNUEVfSURYX0dQU1JfQ1NCLAorCVNUTVBFX0lEWF9HUFNSX01TQiwKIAlTVE1QRV9JRFhfR1BDUl9MU0IsCisJU1RNUEVfSURYX0dQQ1JfQ1NCLAorCVNUTVBFX0lEWF9HUENSX01TQiwKIAlTVE1QRV9JRFhfR1BEUl9MU0IsCisJU1RNUEVfSURYX0dQRFJfQ1NCLAorCVNUTVBFX0lEWF9HUERSX01TQiwKKwlTVE1QRV9JRFhfR1BFRFJfTFNCLAorCVNUTVBFX0lEWF9HUEVEUl9DU0IsCiAJU1RNUEVfSURYX0dQRURSX01TQiwKIAlTVE1QRV9JRFhfR1BSRVJfTFNCLAorCVNUTVBFX0lEWF9HUFJFUl9DU0IsCisJU1RNUEVfSURYX0dQUkVSX01TQiwKIAlTVE1QRV9JRFhfR1BGRVJfTFNCLAorCVNUTVBFX0lEWF9HUEZFUl9DU0IsCisJU1RNUEVfSURYX0dQRkVSX01TQiwKIAlTVE1QRV9JRFhfR1BQVVJfTFNCLAogCVNUTVBFX0lEWF9HUFBEUl9MU0IsCiAJU1RNUEVfSURYX0dQQUZSX1VfTVNCLAogCVNUTVBFX0lEWF9JRUdQSU9SX0xTQiwKKwlTVE1QRV9JRFhfSUVHUElPUl9DU0IsCisJU1RNUEVfSURYX0lFR1BJT1JfTVNCLAogCVNUTVBFX0lEWF9JU0dQSU9SX0xTQiwKKwlTVE1QRV9JRFhfSVNHUElPUl9DU0IsCiAJU1RNUEVfSURYX0lTR1BJT1JfTVNCLAogCVNUTVBFX0lEWF9NQVgsCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvc3lzY29uL2V4eW5vczUtcG11LmggYi9pbmNsdWRlL2xpbnV4L21mZC9zeXNjb24vZXh5bm9zNS1wbXUuaAppbmRleCA3NmYzMGY5Li5jMjhmZjIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9zeXNjb24vZXh5bm9zNS1wbXUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9zeXNjb24vZXh5bm9zNS1wbXUuaApAQCAtNDMsOCArNDMsMTAgQEAKICNkZWZpbmUgRVhZTk9TNTQzM19NSVBJX1BIWTJfQ09OVFJPTAkJKDB4NzE4KQogCiAjZGVmaW5lIEVYWU5PUzVfUEhZX0VOQUJMRQkJCUJJVCgwKQotCiAjZGVmaW5lIEVYWU5PUzVfTUlQSV9QSFlfU19SRVNFVE4JCUJJVCgxKQogI2RlZmluZSBFWFlOT1M1X01JUElfUEhZX01fUkVTRVROCQlCSVQoMikKIAorI2RlZmluZSBFWFlOT1M1NDMzX1BBRF9SRVRFTlRJT05fQVVEX09QVElPTgkJKDB4MzAyOCkKKyNkZWZpbmUgRVhZTk9TNTQzM19QQURfSU5JVElBVEVfV0FLRVVQX0ZST01fTE9XUFdSCUJJVCgyOCkKKwogI2VuZGlmIC8qIF9MSU5VWF9NRkRfU1lTQ09OX1BNVV9FWFlOT1M1X0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC90aV9hbTMzNXhfdHNjYWRjLmggYi9pbmNsdWRlL2xpbnV4L21mZC90aV9hbTMzNXhfdHNjYWRjLmgKaW5kZXggMjU2N2E4Ny4uN2Y1NWI4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvdGlfYW0zMzV4X3RzY2FkYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3RpX2FtMzM1eF90c2NhZGMuaApAQCAtMTM4LDE2ICsxMzgsMTYgQEAKIC8qCiAgKiB0aW1lIGluIHVzIGZvciBwcm9jZXNzaW5nIGEgc2luZ2xlIGNoYW5uZWwsIGNhbGN1bGF0ZWQgYXMgZm9sbG93czoKICAqCi0gKiBudW0gY3ljbGVzID0gb3BlbiBkZWxheSArIChzYW1wbGUgZGVsYXkgKyBjb252IHRpbWUpICogYXZlcmFnaW5nCisgKiBtYXggbnVtIGN5Y2xlcyA9IG9wZW4gZGVsYXkgKyAoc2FtcGxlIGRlbGF5ICsgY29udiB0aW1lKSAqIGF2ZXJhZ2luZwogICoKLSAqIG51bSBjeWNsZXM6IDE1MiArICgxICsgMTMpICogMTYgPSAzNzYKKyAqIG1heCBudW0gY3ljbGVzOiAyNjIxNDMgKyAoMjU1ICsgMTMpICogMTYgPSAyNjY0MzEKICAqCiAgKiBjbG9jayBmcmVxdWVuY3k6IDI2TUh6IC8gOCA9IDMuMjVNSHoKICAqIGNsb2NrIHBlcmlvZDogMSAvIDMuMjVNSHogPSAzMDhucwogICoKLSAqIHByb2Nlc3NpbmcgdGltZTogMzc2ICogMzA4bnMgPSAxMTZ1cworICogbWF4IHByb2Nlc3NpbmcgdGltZTogMjY2NDMxICogMzA4bnMgPSA4M21zKGFwcHJveCkKICAqLwotI2RlZmluZSBJRExFX1RJTUVPVVQgMTE2IC8qIG1pY3Jvc2VjICovCisjZGVmaW5lIElETEVfVElNRU9VVCA4MyAvKiBtaWxsaXNlY29uZHMgKi8KIAogI2RlZmluZSBUU0NBRENfQ0VMTFMJCTIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjUyMTcuaCBiL2luY2x1ZGUvbGludXgvbWZkL3RwczY1MjE3LmgKaW5kZXggMWM4ODIzMS4uNGNjZGE4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjUyMTcuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTIxNy5oCkBAIC03Myw2ICs3Myw3IEBACiAjZGVmaW5lIFRQUzY1MjE3X1BQQVRIX0FDX0NVUlJFTlRfTUFTSwkweDBDCiAjZGVmaW5lIFRQUzY1MjE3X1BQQVRIX1VTQl9DVVJSRU5UX01BU0sJMHgwMwogCisjZGVmaW5lIFRQUzY1MjE3X0lOVF9SRVNFUlZFRE0JCUJJVCg3KQogI2RlZmluZSBUUFM2NTIxN19JTlRfUEJNCQlCSVQoNikKICNkZWZpbmUgVFBTNjUyMTdfSU5UX0FDTQkJQklUKDUpCiAjZGVmaW5lIFRQUzY1MjE3X0lOVF9VU0JNCQlCSVQoNCkKQEAgLTIzMyw2ICsyMzQsMTMgQEAKIAlpbnQgZGZ0X2JyaWdodG5lc3M7CiB9OwogCitlbnVtIHRwczY1MjE3X2lycV90eXBlIHsKKwlUUFM2NTIxN19JUlFfUEIsCisJVFBTNjUyMTdfSVJRX0FDLAorCVRQUzY1MjE3X0lSUV9VU0IsCisJVFBTNjUyMTdfTlVNX0lSUQorfTsKKwogLyoqCiAgKiBzdHJ1Y3QgdHBzNjUyMTdfYm9hcmQgLSBwYWNrYWdlcyByZWd1bGF0b3IgaW5pdCBkYXRhCiAgKiBAdHBzNjUyMTdfcmVndWxhdG9yX2RhdGE6IHJlZ3VsYXRvciBpbml0aWFsaXphdGlvbiB2YWx1ZXMKQEAgLTI1OCw2ICsyNjYsMTAgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgZGVzY1tUUFM2NTIxN19OVU1fUkVHVUxBVE9SXTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJdTggKnN0cm9iZXM7CisJc3RydWN0IGlycV9kb21haW4gKmlycV9kb21haW47CisJc3RydWN0IG11dGV4IGlycV9sb2NrOworCXU4IGlycV9tYXNrOworCWludCBpcnE7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0cHM2NTIxNyAqZGV2X3RvX3RwczY1MjE3KHN0cnVjdCBkZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3RwczY1MjE4LmggYi9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTIxOC5oCmluZGV4IDdmZGY1MzIuLmQxZGI5NTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3RwczY1MjE4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvdHBzNjUyMTguaApAQCAtNjMsNiArNjMsMTEgQEAKICNkZWZpbmUgVFBTNjUyMThfQ0hJUElEX0NISVBfTUFTSwkweEY4CiAjZGVmaW5lIFRQUzY1MjE4X0NISVBJRF9SRVZfTUFTSwkweDA3CiAKKyNkZWZpbmUgVFBTNjUyMThfUkVWXzFfMAkJMHgwCisjZGVmaW5lIFRQUzY1MjE4X1JFVl8xXzEJCTB4MQorI2RlZmluZSBUUFM2NTIxOF9SRVZfMl8wCQkweDIKKyNkZWZpbmUgVFBTNjUyMThfUkVWXzJfMQkJMHgzCisKICNkZWZpbmUgVFBTNjUyMThfSU5UMV9WUFJHCQlCSVQoNSkKICNkZWZpbmUgVFBTNjUyMThfSU5UMV9BQwkJQklUKDQpCiAjZGVmaW5lIFRQUzY1MjE4X0lOVDFfUEIJCUJJVCgzKQpAQCAtMjY3LDYgKzI3Miw3IEBACiBzdHJ1Y3QgdHBzNjUyMTggewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBpbnQgaWQ7CisJdTggcmV2OwogCiAJc3RydWN0IG11dGV4IHRwc19sb2NrOwkJLyogbG9jayBndWFyZGluZyB0aGUgZGF0YSBzdHJ1Y3R1cmUgKi8KIAkvKiBJUlEgRGF0YSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdHdsNjA0MC5oIGIvaW5jbHVkZS9saW51eC9tZmQvdHdsNjA0MC5oCmluZGV4IDM2Nzk1YTEuLmEyZTg4NzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3R3bDYwNDAuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90d2w2MDQwLmgKQEAgLTE2OCw3ICsxNjgsNyBAQAogI2RlZmluZSBUV0w2MDQwX1ZJQlJPQ0RFVAkJMHgyMAogI2RlZmluZSBUV0w2MDQwX1RTSFVUREVUICAgICAgICAgICAgICAgIDB4NDAKIAotI2RlZmluZSBUV0w2MDQwX0NFTExTCQkJMworI2RlZmluZSBUV0w2MDQwX0NFTExTCQkJNAogCiAjZGVmaW5lIFRXTDYwNDBfUkVWX0VTMV8wCQkweDAwCiAjZGVmaW5lIFRXTDYwNDBfUkVWX0VTMV8xCQkweDAxIC8qIFJldiBFUzEuMSBhbmQgRVMxLjIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWlzY2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKaW5kZXggNTQzMDM3NC4uNzIyNjk4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9taXNjZGV2aWNlLmgKQEAgLTMsNiArMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KIAogLyoKICAqCVRoZXNlIGFsbG9jYXRpb25zIGFyZSBtYW5hZ2VkIGJ5IGRldmljZUBsYW5hbmEub3JnLiBJZiB5b3UgdXNlIGFuCkBAIC03MCw2ICs3MSwxMyBAQAogZXh0ZXJuIGludCBtaXNjX3JlZ2lzdGVyKHN0cnVjdCBtaXNjZGV2aWNlICptaXNjKTsKIGV4dGVybiB2b2lkIG1pc2NfZGVyZWdpc3RlcihzdHJ1Y3QgbWlzY2RldmljZSAqbWlzYyk7CiAKKy8qCisgKiBIZWxwZXIgbWFjcm8gZm9yIGRyaXZlcnMgdGhhdCBkb24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIGluIG1vZHVsZSBpbml0IC8gZXhpdAorICogY2FsbC4gVGhpcyBoZWxwcyBpbiBlbGVtaW5hdGluZyBvZiBib2lsZXJwbGF0ZSBjb2RlLgorICovCisjZGVmaW5lIG1vZHVsZV9taXNjX2RldmljZShfX21pc2NfZGV2aWNlKSBcCisJbW9kdWxlX2RyaXZlcihfX21pc2NfZGV2aWNlLCBtaXNjX3JlZ2lzdGVyLCBtaXNjX2RlcmVnaXN0ZXIpCisKICNkZWZpbmUgTU9EVUxFX0FMSUFTX01JU0NERVYobWlub3IpCQkJCVwKIAlNT0RVTEVfQUxJQVMoImNoYXItbWFqb3ItIiBfX3N0cmluZ2lmeShNSVNDX01BSk9SKQlcCiAJIi0iIF9fc3RyaW5naWZ5KG1pbm9yKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NC9jbWQuaCBiL2luY2x1ZGUvbGludXgvbWx4NC9jbWQuaAppbmRleCAxMTZiMjg0Li4xZjM1Njg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDQvY21kLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg0L2NtZC5oCkBAIC0zMDksNyArMzA5LDggQEAKIAkJICAgICAgc3RydWN0IGlmbGFfdmZfc3RhdHMgKnZmX3N0YXRzKTsKIHUzMiBtbHg0X2NvbW1fZ2V0X3ZlcnNpb24odm9pZCk7CiBpbnQgbWx4NF9zZXRfdmZfbWFjKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgaW50IHZmLCB1NjQgbWFjKTsKLWludCBtbHg0X3NldF92Zl92bGFuKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zKTsKK2ludCBtbHg0X3NldF92Zl92bGFuKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgaW50IHZmLCB1MTYgdmxhbiwKKwkJICAgICB1OCBxb3MsIF9fYmUxNiBwcm90byk7CiBpbnQgbWx4NF9zZXRfdmZfcmF0ZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHBvcnQsIGludCB2ZiwgaW50IG1pbl90eF9yYXRlLAogCQkgICAgIGludCBtYXhfdHhfcmF0ZSk7CiBpbnQgbWx4NF9zZXRfdmZfc3Bvb2ZjaGsoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0LCBpbnQgdmYsIGJvb2wgc2V0dGluZyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKaW5kZXggNDJkYTM1NS4uNTliNTBkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaApAQCAtMjIxLDYgKzIyMSw3IEBACiAJTUxYNF9ERVZfQ0FQX0ZMQUcyX1JPQ0VfVjFfVjIJCT0gMVVMTCA8PCAgMzMsCiAJTUxYNF9ERVZfQ0FQX0ZMQUcyX0RNRlNfVUNfTUNfU05JRkZFUiAgID0gMVVMTCA8PCAgMzQsCiAJTUxYNF9ERVZfQ0FQX0ZMQUcyX0RJQUdfUEVSX1BPUlQJPSAxVUxMIDw8ICAzNSwKKwlNTFg0X0RFVl9DQVBfRkxBRzJfU1ZMQU5fQllfUVAgICAgICAgICAgPSAxVUxMIDw8ICAzNiwKIH07CiAKIGVudW0gewpAQCAtMTM3MSw2ICsxMzcyLDggQEAKIGludCBtbHg0X1NFVF9QT1JUX1ZYTEFOKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1OCBzdGVlcmluZywgaW50IGVuYWJsZSk7CiBpbnQgc2V0X3Bodl9iaXQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCBuZXdfdmFsKTsKIGludCBnZXRfcGh2X2JpdChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgaW50ICpwaHYpOworaW50IG1seDRfZ2V0X2lzX3ZsYW5fb2ZmbG9hZF9kaXNhYmxlZChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwKKwkJCQkgICAgICBib29sICp2bGFuX29mZmxvYWRfZGlzYWJsZWQpOwogaW50IG1seDRfZmluZF9jYWNoZWRfbWFjKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1NjQgbWFjLCBpbnQgKmlkeCk7CiBpbnQgbWx4NF9maW5kX2NhY2hlZF92bGFuKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1MTYgdmlkLCBpbnQgKmlkeCk7CiBpbnQgbWx4NF9yZWdpc3Rlcl92bGFuKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1MTYgdmxhbiwgaW50ICppbmRleCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDQvcXAuaCBiL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oCmluZGV4IGRlYWEyMjEuLmI0ZWU4ZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oCkBAIC0xNjAsNiArMTYwLDcgQEAKIAogZW51bSB7IC8qIGZsICovCiAJTUxYNF9GTF9DVgk9IDEgPDwgNiwKKwlNTFg0X0ZMX1NWCT0gMSA8PCA1LAogCU1MWDRfRkxfRVRIX0hJREVfQ1FFX1ZMQU4JPSAxIDw8IDIsCiAJTUxYNF9GTF9FVEhfU1JDX0NIRUNLX01DX0xCCT0gMSA8PCAxLAogCU1MWDRfRkxfRVRIX1NSQ19DSEVDS19VQ19MQgk9IDEgPDwgMCwKQEAgLTI2Nyw2ICsyNjgsNyBAQAogCU1MWDRfVVBEX1FQX1BBVEhfTUFTS19GVkxfUlgJCQk9IDE2ICsgMzIsCiAJTUxYNF9VUERfUVBfUEFUSF9NQVNLX0VUSF9TUkNfQ0hFQ0tfVUNfTEIJPSAxOCArIDMyLAogCU1MWDRfVVBEX1FQX1BBVEhfTUFTS19FVEhfU1JDX0NIRUNLX01DX0xCCT0gMTkgKyAzMiwKKwlNTFg0X1VQRF9RUF9QQVRIX01BU0tfU1YJCQk9IDIyICsgMzIsCiB9OwogCiBlbnVtIHsgLyogcGFyYW0zICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDUvY3EuaCBiL2luY2x1ZGUvbGludXgvbWx4NS9jcS5oCmluZGV4IDI1NjZmNmQuLjdjM2MwZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NS9jcS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NS9jcS5oCkBAIC0xNzAsMTIgKzE3MCwxMiBAQAogaW50IG1seDVfaW5pdF9jcV90YWJsZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIHZvaWQgbWx4NV9jbGVhbnVwX2NxX3RhYmxlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogaW50IG1seDVfY29yZV9jcmVhdGVfY3Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9jcSAqY3EsCi0JCQlzdHJ1Y3QgbWx4NV9jcmVhdGVfY3FfbWJveF9pbiAqaW4sIGludCBpbmxlbik7CisJCQl1MzIgKmluLCBpbnQgaW5sZW4pOwogaW50IG1seDVfY29yZV9kZXN0cm95X2NxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfY3EgKmNxKTsKIGludCBtbHg1X2NvcmVfcXVlcnlfY3Eoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9jcSAqY3EsCi0JCSAgICAgICBzdHJ1Y3QgbWx4NV9xdWVyeV9jcV9tYm94X291dCAqb3V0KTsKKwkJICAgICAgIHUzMiAqb3V0LCBpbnQgb3V0bGVuKTsKIGludCBtbHg1X2NvcmVfbW9kaWZ5X2NxKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfY3EgKmNxLAotCQkJc3RydWN0IG1seDVfbW9kaWZ5X2NxX21ib3hfaW4gKmluLCBpbnQgaW5fc3opOworCQkJdTMyICppbiwgaW50IGlubGVuKTsKIGludCBtbHg1X2NvcmVfbW9kaWZ5X2NxX21vZGVyYXRpb24oc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCQkgICBzdHJ1Y3QgbWx4NV9jb3JlX2NxICpjcSwgdTE2IGNxX3BlcmlvZCwKIAkJCQkgICB1MTYgY3FfbWF4X2NvdW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvbWx4NS9kZXZpY2UuaAppbmRleCAwYjZkMTVjLi43N2MxNDE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDUvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L2RldmljZS5oCkBAIC0xOTgsMTkgKzE5OCw2IEBACiB9OwogCiBlbnVtIHsKLQlNTFg1X0FDQ0VTU19NT0RFX1BBCT0gMCwKLQlNTFg1X0FDQ0VTU19NT0RFX01UVAk9IDEsCi0JTUxYNV9BQ0NFU1NfTU9ERV9LTE0JPSAyCi19OwotCi1lbnVtIHsKLQlNTFg1X01LRVlfUkVNT1RFX0lOVkFMCT0gMSA8PCAyNCwKLQlNTFg1X01LRVlfRkxBR19TWU5DX1VNUiA9IDEgPDwgMjksCi0JTUxYNV9NS0VZX0JTRl9FTgk9IDEgPDwgMzAsCi0JTUxYNV9NS0VZX0xFTjY0CQk9IDEgPDwgMzEsCi19OwotCi1lbnVtIHsKIAlNTFg1X0VOX1JECT0gKHU2NCkxLAogCU1MWDVfRU5fV1IJPSAodTY0KTIKIH07CkBAIC00MTEsMzMgKzM5OCw2IEBACiAJTUxYNV9NQVhfU0dFX1JECT0gKDUxMiAtIDE2IC0gMTYpIC8gMTYKIH07CiAKLXN0cnVjdCBtbHg1X2luYm94X2hkciB7Ci0JX19iZTE2CQlvcGNvZGU7Ci0JdTgJCXJzdmRbNF07Ci0JX19iZTE2CQlvcG1vZDsKLX07Ci0KLXN0cnVjdCBtbHg1X291dGJveF9oZHIgewotCXU4CQlzdGF0dXM7Ci0JdTgJCXJzdmRbM107Ci0JX19iZTMyCQlzeW5kcm9tZTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NtZF9xdWVyeV9hZGFwdGVyX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfY21kX3F1ZXJ5X2FkYXB0ZXJfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbMjRdOwotCXU4CQkJaW50YXBpbjsKLQl1OAkJCXJzdmQxWzEzXTsKLQlfX2JlMTYJCQl2c2RfdmVuZG9yX2lkOwotCXU4CQkJdnNkWzIwOF07Ci0JdTgJCQl2c2RfcHNpZFsxNl07Ci19OwotCiBlbnVtIG1seDVfb2RwX3RyYW5zcG9ydF9jYXBfYml0cyB7CiAJTUxYNV9PRFBfU1VQUE9SVF9TRU5ECSA9IDEgPDwgMzEsCiAJTUxYNV9PRFBfU1VQUE9SVF9SRUNWCSA9IDEgPDwgMzAsCkBAIC00NTUsMzAgKzQxNSw2IEBACiAJY2hhciByZXNlcnZlZDJbMHhlNF07CiB9OwogCi1zdHJ1Y3QgbWx4NV9jbWRfaW5pdF9oY2FfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzJdOwotCV9fYmUxNgkJCXByb2ZpbGU7Ci0JdTgJCQlyc3ZkMVs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NtZF9pbml0X2hjYV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfY21kX3RlYXJkb3duX2hjYV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbMl07Ci0JX19iZTE2CQkJcHJvZmlsZTsKLQl1OAkJCXJzdmQxWzRdOwotfTsKLQotc3RydWN0IG1seDVfY21kX3RlYXJkb3duX2hjYV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQogc3RydWN0IG1seDVfY21kX2xheW91dCB7CiAJdTgJCXR5cGU7CiAJdTgJCXJzdmQwWzNdOwpAQCAtNDk0LDcgKzQzMCw2IEBACiAJdTgJCXN0YXR1c19vd247CiB9OwogCi0KIHN0cnVjdCBoZWFsdGhfYnVmZmVyIHsKIAlfX2JlMzIJCWFzc2VydF92YXJbNV07CiAJX19iZTMyCQlyc3ZkMFszXTsKQEAgLTg1NiwyNDUgKzc5MSwxNSBAQAogCXN0cnVjdCBtbHg1X2NxZTY0CWNxZTY0OwogfTsKIAotc3RydWN0IG1seDVfc3JxX2N0eCB7Ci0JdTgJCQlzdGF0ZV9sb2dfc3o7Ci0JdTgJCQlyc3ZkMFszXTsKLQlfX2JlMzIJCQlmbGFnc194cmNkOwotCV9fYmUzMgkJCXBnb2ZmX2NxbjsKLQl1OAkJCXJzdmQxWzRdOwotCXU4CQkJbG9nX3BnX3N6OwotCXU4CQkJcnN2ZDJbN107Ci0JX19iZTMyCQkJcGQ7Ci0JX19iZTE2CQkJbHdtOwotCV9fYmUxNgkJCXdxZV9jbnQ7Ci0JdTgJCQlyc3ZkM1s4XTsKLQlfX2JlNjQJCQlkYl9yZWNvcmQ7Ci19OwotCi1zdHJ1Y3QgbWx4NV9jcmVhdGVfc3JxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJaW5wdXRfc3JxbjsKLQl1OAkJCXJzdmQwWzRdOwotCXN0cnVjdCBtbHg1X3NycV9jdHgJY3R4OwotCXU4CQkJcnN2ZDFbMjA4XTsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jcmVhdGVfc3JxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlzcnFuOwotCXU4CQkJcnN2ZFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfc3JxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJc3JxbjsKLQl1OAkJCXJzdmRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X3NycV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfcXVlcnlfc3JxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJc3JxbjsKLQl1OAkJCXJzdmQwWzRdOwotfTsKLQotc3RydWN0IG1seDVfcXVlcnlfc3JxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzhdOwotCXN0cnVjdCBtbHg1X3NycV9jdHgJY3R4OwotCXU4CQkJcnN2ZDFbMzJdOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X2FybV9zcnFfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlzcnFuOwotCV9fYmUxNgkJCXJzdmQ7Ci0JX19iZTE2CQkJbHdtOwotfTsKLQotc3RydWN0IG1seDVfYXJtX3NycV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfY3FfY29udGV4dCB7Ci0JdTgJCQlzdGF0dXM7Ci0JdTgJCQljcWVfc3pfZmxhZ3M7Ci0JdTgJCQlzdDsKLQl1OAkJCXJzdmQzOwotCXU4CQkJcnN2ZDRbNl07Ci0JX19iZTE2CQkJcGFnZV9vZmZzZXQ7Ci0JX19iZTMyCQkJbG9nX3N6X3Vzcl9wYWdlOwotCV9fYmUxNgkJCWNxX3BlcmlvZDsKLQlfX2JlMTYJCQljcV9tYXhfY291bnQ7Ci0JX19iZTE2CQkJcnN2ZDIwOwotCV9fYmUxNgkJCWNfZXFuOwotCXU4CQkJbG9nX3BnX3N6OwotCXU4CQkJcnN2ZDI1WzddOwotCV9fYmUzMgkJCWxhc3Rfbm90aWZpZWRfaW5kZXg7Ci0JX19iZTMyCQkJc29saWNpdF9wcm9kdWNlcl9pbmRleDsKLQlfX2JlMzIJCQljb25zdW1lcl9jb3VudGVyOwotCV9fYmUzMgkJCXByb2R1Y2VyX2NvdW50ZXI7Ci0JdTgJCQlyc3ZkNDhbOF07Ci0JX19iZTY0CQkJZGJfcmVjb3JkX2FkZHI7Ci19OwotCi1zdHJ1Y3QgbWx4NV9jcmVhdGVfY3FfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlpbnB1dF9jcW47Ci0JdTgJCQlyc3ZkeFs0XTsKLQlzdHJ1Y3QgbWx4NV9jcV9jb250ZXh0CWN0eDsKLQl1OAkJCXJzdmQ2WzE5Ml07Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfY3JlYXRlX2NxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQljcW47Ci0JdTgJCQlyc3ZkMFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfY3FfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQljcW47Ci0JdTgJCQlyc3ZkMFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfY3FfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9jcV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCWNxbjsKLQl1OAkJCXJzdmQwWzRdOwotfTsKLQotc3RydWN0IG1seDVfcXVlcnlfY3FfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbOF07Ci0Jc3RydWN0IG1seDVfY3FfY29udGV4dAljdHg7Ci0JdTgJCQlyc3ZkNlsxNl07Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfbW9kaWZ5X2NxX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJY3FuOwotCV9fYmUzMgkJCWZpZWxkX3NlbGVjdDsKLQlzdHJ1Y3QgbWx4NV9jcV9jb250ZXh0CWN0eDsKLQl1OAkJCXJzdmRbMTkyXTsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9tb2RpZnlfY3FfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2VuYWJsZV9oY2FfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9lbmFibGVfaGNhX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kaXNhYmxlX2hjYV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rpc2FibGVfaGNhX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9lcV9jb250ZXh0IHsKLQl1OAkJCXN0YXR1czsKLQl1OAkJCWVjX29pOwotCXU4CQkJc3Q7Ci0JdTgJCQlyc3ZkMls3XTsKLQlfX2JlMTYJCQlwYWdlX3BmZnNldDsKLQlfX2JlMzIJCQlsb2dfc3pfdXNyX3BhZ2U7Ci0JdTgJCQlyc3ZkM1s3XTsKLQl1OAkJCWludHI7Ci0JdTgJCQlsb2dfcGFnZV9zaXplOwotCXU4CQkJcnN2ZDRbMTVdOwotCV9fYmUzMgkJCWNvbnN1bWVyX2NvdW50ZXI7Ci0JX19iZTMyCQkJcHJvZHVzZXJfY291bnRlcjsKLQl1OAkJCXJzdmQ1WzE2XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NyZWF0ZV9lcV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbM107Ci0JdTgJCQlpbnB1dF9lcW47Ci0JdTgJCQlyc3ZkMVs0XTsKLQlzdHJ1Y3QgbWx4NV9lcV9jb250ZXh0CWN0eDsKLQl1OAkJCXJzdmQyWzhdOwotCV9fYmU2NAkJCWV2ZW50c19tYXNrOwotCXU4CQkJcnN2ZDNbMTc2XTsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jcmVhdGVfZXFfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZDBbM107Ci0JdTgJCQllcV9udW1iZXI7Ci0JdTgJCQlyc3ZkMVs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfZXFfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzNdOwotCXU4CQkJZXFuOwotCXU4CQkJcnN2ZDFbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X2VxX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9tYXBfZXFfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlNjQJCQltYXNrOwotCXU4CQkJbXU7Ci0JdTgJCQlyc3ZkMFsyXTsKLQl1OAkJCWVxbjsKLQl1OAkJCXJzdmQxWzI0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X21hcF9lcV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfcXVlcnlfZXFfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzNdOwotCXU4CQkJZXFuOwotCXU4CQkJcnN2ZDFbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9lcV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotCXN0cnVjdCBtbHg1X2VxX2NvbnRleHQJY3R4OworZW51bSB7CisJTUxYNV9NS0VZX1NUQVRVU19GUkVFID0gMSA8PCA2LAogfTsKIAogZW51bSB7Ci0JTUxYNV9NS0VZX1NUQVRVU19GUkVFID0gMSA8PCA2LAorCU1MWDVfTUtFWV9SRU1PVEVfSU5WQUwJPSAxIDw8IDI0LAorCU1MWDVfTUtFWV9GTEFHX1NZTkNfVU1SID0gMSA8PCAyOSwKKwlNTFg1X01LRVlfQlNGX0VOCT0gMSA8PCAzMCwKKwlNTFg1X01LRVlfTEVONjQJCT0gMSA8PCAzMSwKIH07CiAKIHN0cnVjdCBtbHg1X21rZXlfc2VnIHsKQEAgLTExMTksMTM0ICs4MjQsMTIgQEAKIAl1OAkJcnN2ZDRbNF07CiB9OwogCi1zdHJ1Y3QgbWx4NV9xdWVyeV9zcGVjaWFsX2N0eHNfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9zcGVjaWFsX2N0eHNfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCV9fYmUzMgkJCWR1bXBfZmlsbF9ta2V5OwotCV9fYmUzMgkJCXJlc2VydmVkX2xrZXk7Ci19OwotCi1zdHJ1Y3QgbWx4NV9jcmVhdGVfbWtleV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCWlucHV0X21rZXlfaW5kZXg7Ci0JX19iZTMyCQkJZmxhZ3M7Ci0Jc3RydWN0IG1seDVfbWtleV9zZWcJc2VnOwotCXU4CQkJcnN2ZDFbMTZdOwotCV9fYmUzMgkJCXhsYXRfb2N0X2FjdF9zaXplOwotCV9fYmUzMgkJCXJzdmQyOwotCXU4CQkJcnN2ZDNbMTY4XTsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9jcmVhdGVfbWtleV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JX19iZTMyCQkJbWtleTsKLQl1OAkJCXJzdmRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X21rZXlfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlta2V5OwotCXU4CQkJcnN2ZFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfbWtleV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfcXVlcnlfbWtleV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCW1rZXk7Ci19OwotCi1zdHJ1Y3QgbWx4NV9xdWVyeV9ta2V5X21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQlfX2JlNjQJCQlwYXNbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9tb2RpZnlfbWtleV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMgkJCW1rZXk7Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfbW9kaWZ5X21rZXlfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2R1bXBfbWtleV9tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotfTsKLQotc3RydWN0IG1seDVfZHVtcF9ta2V5X21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlta2V5OwotfTsKLQotc3RydWN0IG1seDVfbWFkX2lmY19tYm94X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUxNgkJCXJlbW90ZV9saWQ7Ci0JdTgJCQlyc3ZkMDsKLQl1OAkJCXBvcnQ7Ci0JdTgJCQlyc3ZkMVs0XTsKLQl1OAkJCWRhdGFbMjU2XTsKLX07Ci0KLXN0cnVjdCBtbHg1X21hZF9pZmNfbWJveF9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIJaGRyOwotCXU4CQkJcnN2ZFs4XTsKLQl1OAkJCWRhdGFbMjU2XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2FjY2Vzc19yZWdfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCQloZHI7Ci0JdTgJCQkJcnN2ZDBbMl07Ci0JX19iZTE2CQkJCXJlZ2lzdGVyX2lkOwotCV9fYmUzMgkJCQlhcmc7Ci0JX19iZTMyCQkJCWRhdGFbMF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9hY2Nlc3NfcmVnX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCQloZHI7Ci0JdTgJCQkJcnN2ZFs4XTsKLQlfX2JlMzIJCQkJZGF0YVswXTsKLX07Ci0KICNkZWZpbmUgTUxYNV9BVFRSX0VYVEVOREVEX1BPUlRfSU5GTwljcHVfdG9fYmUxNigweGZmOTApCiAKIGVudW0gewogCU1MWF9FWFRfUE9SVF9DQVBfRkxBR19FWFRFTkRFRF9QT1JUX0lORk8JPSAxIDw8ICAwCiB9OwogCi1zdHJ1Y3QgbWx4NV9hbGxvY2F0ZV9wc3ZfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkciAgIGhkcjsKLQlfX2JlMzIJCQlucHN2X3BkOwotCV9fYmUzMgkJCXJzdmRfcHN2MDsKLX07Ci0KLXN0cnVjdCBtbHg1X2FsbG9jYXRlX3Bzdl9vdXQgewotCXN0cnVjdCBtbHg1X291dGJveF9oZHIgIGhkcjsKLQl1OAkJCXJzdmRbOF07Ci0JX19iZTMyCQkJcHN2X2lkeFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfcHN2X2luIHsKLQlzdHJ1Y3QgbWx4NV9pbmJveF9oZHIJaGRyOwotCV9fYmUzMiAgICAgICAgICAgICAgICAgIHBzdl9udW1iZXI7Ci0JdTggICAgICAgICAgICAgICAgICAgICAgcnN2ZFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X2Rlc3Ryb3lfcHN2X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkciAgaGRyOwotCXU4ICAgICAgICAgICAgICAgICAgICAgIHJzdmRbOF07Ci19OwotCiBlbnVtIHsKIAlWUE9SVF9TVEFURV9ET1dOCQk9IDB4MCwKIAlWUE9SVF9TVEFURV9VUAkJCT0gMHgxLApAQCAtMTM4MSw2ICs5NjQsMTggQEAKICNkZWZpbmUgTUxYNV9DQVBfRkxPV1RBQkxFX05JQ19SWF9NQVgobWRldiwgY2FwKSBcCiAJTUxYNV9DQVBfRkxPV1RBQkxFX01BWChtZGV2LCBmbG93X3RhYmxlX3Byb3BlcnRpZXNfbmljX3JlY2VpdmUuY2FwKQogCisjZGVmaW5lIE1MWDVfQ0FQX0ZMT1dUQUJMRV9TTklGRkVSX1JYKG1kZXYsIGNhcCkgXAorCU1MWDVfQ0FQX0ZMT1dUQUJMRShtZGV2LCBmbG93X3RhYmxlX3Byb3BlcnRpZXNfbmljX3JlY2VpdmVfc25pZmZlci5jYXApCisKKyNkZWZpbmUgTUxYNV9DQVBfRkxPV1RBQkxFX1NOSUZGRVJfUlhfTUFYKG1kZXYsIGNhcCkgXAorCU1MWDVfQ0FQX0ZMT1dUQUJMRV9NQVgobWRldiwgZmxvd190YWJsZV9wcm9wZXJ0aWVzX25pY19yZWNlaXZlX3NuaWZmZXIuY2FwKQorCisjZGVmaW5lIE1MWDVfQ0FQX0ZMT1dUQUJMRV9TTklGRkVSX1RYKG1kZXYsIGNhcCkgXAorCU1MWDVfQ0FQX0ZMT1dUQUJMRShtZGV2LCBmbG93X3RhYmxlX3Byb3BlcnRpZXNfbmljX3RyYW5zbWl0X3NuaWZmZXIuY2FwKQorCisjZGVmaW5lIE1MWDVfQ0FQX0ZMT1dUQUJMRV9TTklGRkVSX1RYX01BWChtZGV2LCBjYXApIFwKKwlNTFg1X0NBUF9GTE9XVEFCTEVfTUFYKG1kZXYsIGZsb3dfdGFibGVfcHJvcGVydGllc19uaWNfdHJhbnNtaXRfc25pZmZlci5jYXApCisKICNkZWZpbmUgTUxYNV9DQVBfRVNXX0ZMT1dUQUJMRShtZGV2LCBjYXApIFwKIAlNTFg1X0dFVChmbG93X3RhYmxlX2Vzd2l0Y2hfY2FwLCBcCiAJCSBtZGV2LT5oY2FfY2Fwc19jdXJbTUxYNV9DQVBfRVNXSVRDSF9GTE9XX1RBQkxFXSwgY2FwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg1L2RyaXZlci5oIGIvaW5jbHVkZS9saW51eC9tbHg1L2RyaXZlci5oCmluZGV4IGNjZWE2ZmIuLjg1YzQ3ODYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NS9kcml2ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDUvZHJpdmVyLmgKQEAgLTQ5LDEwICs0OSw2IEBACiAjaW5jbHVkZSA8bGludXgvbWx4NS9zcnEuaD4KIAogZW51bSB7Ci0JTUxYNV9SUV9CSVRNQVNLX1ZTRCA9IDEgPDwgMSwKLX07Ci0KLWVudW0gewogCU1MWDVfQk9BUkRfSURfTEVOID0gNjQsCiAJTUxYNV9NQVhfTkFNRV9MRU4gPSAxNiwKIH07CkBAIC00ODEsNiArNDc3LDcgQEAKIH07CiAKIHN0cnVjdCBtbHg1X2Vzd2l0Y2g7CitzdHJ1Y3QgbWx4NV9sYWc7CiAKIHN0cnVjdCBtbHg1X3JsX2VudHJ5IHsKIAl1MzIgICAgICAgICAgICAgICAgICAgICByYXRlOwpAQCAtNTU0LDYgKzU1MSw3IEBACiAJc3RydWN0IG1seDVfZmxvd19zdGVlcmluZyAqc3RlZXJpbmc7CiAJc3RydWN0IG1seDVfZXN3aXRjaCAgICAgKmVzd2l0Y2g7CiAJc3RydWN0IG1seDVfY29yZV9zcmlvdglzcmlvdjsKKwlzdHJ1Y3QgbWx4NV9sYWcJCSpsYWc7CiAJdW5zaWduZWQgbG9uZwkJcGNpX2Rldl9kYXRhOwogCXN0cnVjdCBtbHg1X2ZjX3N0YXRzCQlmY19zdGF0czsKIAlzdHJ1Y3QgbWx4NV9ybF90YWJsZSAgICAgICAgICAgIHJsX3RhYmxlOwpAQCAtNzcxLDE0ICs3NjksMTUgQEAKIHZvaWQgbWx4NV9jbWRfY2xlYW51cChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIHZvaWQgbWx4NV9jbWRfdXNlX2V2ZW50cyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIHZvaWQgbWx4NV9jbWRfdXNlX3BvbGxpbmcoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7Ci1pbnQgbWx4NV9jbWRfc3RhdHVzX3RvX2VycihzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyICpoZHIpOwotaW50IG1seDVfY21kX3N0YXR1c190b19lcnJfdjIodm9pZCAqcHRyKTsKLWludCBtbHg1X2NvcmVfZ2V0X2NhcHMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgZW51bSBtbHg1X2NhcF90eXBlIGNhcF90eXBlKTsKKwogaW50IG1seDVfY21kX2V4ZWMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdm9pZCAqaW4sIGludCBpbl9zaXplLCB2b2lkICpvdXQsCiAJCSAgaW50IG91dF9zaXplKTsKIGludCBtbHg1X2NtZF9leGVjX2NiKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHZvaWQgKmluLCBpbnQgaW5fc2l6ZSwKIAkJICAgICB2b2lkICpvdXQsIGludCBvdXRfc2l6ZSwgbWx4NV9jbWRfY2JrX3QgY2FsbGJhY2ssCiAJCSAgICAgdm9pZCAqY29udGV4dCk7Cit2b2lkIG1seDVfY21kX21ib3hfc3RhdHVzKHZvaWQgKm91dCwgdTggKnN0YXR1cywgdTMyICpzeW5kcm9tZSk7CisKK2ludCBtbHg1X2NvcmVfZ2V0X2NhcHMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgZW51bSBtbHg1X2NhcF90eXBlIGNhcF90eXBlKTsKIGludCBtbHg1X2NtZF9hbGxvY191YXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICp1YXJuKTsKIGludCBtbHg1X2NtZF9mcmVlX3VhcihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgdWFybik7CiBpbnQgbWx4NV9hbGxvY191dWFycyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV91dWFyX2luZm8gKnV1YXJpKTsKQEAgLTgwNywxNSArODA2LDE4IEBACiAJCSAgICAgIHUxNiBsd20sIGludCBpc19zcnEpOwogdm9pZCBtbHg1X2luaXRfbWtleV90YWJsZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIHZvaWQgbWx4NV9jbGVhbnVwX21rZXlfdGFibGUoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CitpbnQgbWx4NV9jb3JlX2NyZWF0ZV9ta2V5X2NiKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCisJCQkgICAgIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqbWtleSwKKwkJCSAgICAgdTMyICppbiwgaW50IGlubGVuLAorCQkJICAgICB1MzIgKm91dCwgaW50IG91dGxlbiwKKwkJCSAgICAgbWx4NV9jbWRfY2JrX3QgY2FsbGJhY2ssIHZvaWQgKmNvbnRleHQpOwogaW50IG1seDVfY29yZV9jcmVhdGVfbWtleShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJICBzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKm1rZXksCi0JCQkgIHN0cnVjdCBtbHg1X2NyZWF0ZV9ta2V5X21ib3hfaW4gKmluLCBpbnQgaW5sZW4sCi0JCQkgIG1seDVfY21kX2Nia190IGNhbGxiYWNrLCB2b2lkICpjb250ZXh0LAotCQkJICBzdHJ1Y3QgbWx4NV9jcmVhdGVfbWtleV9tYm94X291dCAqb3V0KTsKKwkJCSAgdTMyICppbiwgaW50IGlubGVuKTsKIGludCBtbHg1X2NvcmVfZGVzdHJveV9ta2V5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkgICBzdHJ1Y3QgbWx4NV9jb3JlX21rZXkgKm1rZXkpOwogaW50IG1seDVfY29yZV9xdWVyeV9ta2V5KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHN0cnVjdCBtbHg1X2NvcmVfbWtleSAqbWtleSwKLQkJCSBzdHJ1Y3QgbWx4NV9xdWVyeV9ta2V5X21ib3hfb3V0ICpvdXQsIGludCBvdXRsZW4pOworCQkJIHUzMiAqb3V0LCBpbnQgb3V0bGVuKTsKIGludCBtbHg1X2NvcmVfZHVtcF9maWxsX21rZXkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9ta2V5ICpfbWtleSwKIAkJCSAgICAgdTMyICpta2V5KTsKIGludCBtbHg1X2NvcmVfYWxsb2NfcGQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICpwZG4pOwpAQCAtODI2LDggKzgyOCw2IEBACiB2b2lkIG1seDVfcGFnZWFsbG9jX2NsZWFudXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiBpbnQgbWx4NV9wYWdlYWxsb2Nfc3RhcnQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiB2b2lkIG1seDVfcGFnZWFsbG9jX3N0b3Aoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7Ci1pbnQgbWx4NV9zcmlvdl9pbml0KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwotaW50IG1seDVfc3Jpb3ZfY2xlYW51cChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIHZvaWQgbWx4NV9jb3JlX3JlcV9wYWdlc19oYW5kbGVyKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHUxNiBmdW5jX2lkLAogCQkJCSBzMzIgbnBhZ2VzKTsKIGludCBtbHg1X3NhdGlzZnlfc3RhcnR1cF9wYWdlcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBpbnQgYm9vdCk7CkBAIC04NjUsNyArODY1LDcgQEAKIGludCBtbHg1X2RlYnVnX2VxX2FkZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9lcSAqZXEpOwogdm9pZCBtbHg1X2RlYnVnX2VxX3JlbW92ZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9lcSAqZXEpOwogaW50IG1seDVfY29yZV9lcV9xdWVyeShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9lcSAqZXEsCi0JCSAgICAgICBzdHJ1Y3QgbWx4NV9xdWVyeV9lcV9tYm94X291dCAqb3V0LCBpbnQgb3V0bGVuKTsKKwkJICAgICAgIHUzMiAqb3V0LCBpbnQgb3V0bGVuKTsKIGludCBtbHg1X2VxX2RlYnVnZnNfaW5pdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIHZvaWQgbWx4NV9lcV9kZWJ1Z2ZzX2NsZWFudXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CiBpbnQgbWx4NV9jcV9kZWJ1Z2ZzX2luaXQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldik7CkBAIC05MzAsNiArOTMwLDggQEAKIHN0cnVjdCBtbHg1X2ludGVyZmFjZSB7CiAJdm9pZCAqCQkJKCphZGQpKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogCXZvaWQJCQkoKnJlbW92ZSkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdm9pZCAqY29udGV4dCk7CisJaW50CQkJKCphdHRhY2gpKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHZvaWQgKmNvbnRleHQpOworCXZvaWQJCQkoKmRldGFjaCkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdm9pZCAqY29udGV4dCk7CiAJdm9pZAkJCSgqZXZlbnQpKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHZvaWQgKmNvbnRleHQsCiAJCQkJCSBlbnVtIG1seDVfZGV2X2V2ZW50IGV2ZW50LCB1bnNpZ25lZCBsb25nIHBhcmFtKTsKIAl2b2lkICogICAgICAgICAgICAgICAgICAoKmdldF9kZXYpKHZvaWQgKmNvbnRleHQpOwpAQCAtOTQyLDYgKzk0NCwxMSBAQAogdm9pZCBtbHg1X3VucmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50Zik7CiBpbnQgbWx4NV9jb3JlX3F1ZXJ5X3ZlbmRvcl9pZChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTMyICp2ZW5kb3JfaWQpOwogCitpbnQgbWx4NV9jbWRfY3JlYXRlX3Zwb3J0X2xhZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKK2ludCBtbHg1X2NtZF9kZXN0cm95X3Zwb3J0X2xhZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKK2Jvb2wgbWx4NV9sYWdfaXNfYWN0aXZlKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOworc3RydWN0IG5ldF9kZXZpY2UgKm1seDVfbGFnX2dldF9yb2NlX25ldGRldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKKwogc3RydWN0IG1seDVfcHJvZmlsZSB7CiAJdTY0CW1hc2s7CiAJdTgJbG9nX21heF9xcDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9mcy5oIGIvaW5jbHVkZS9saW51eC9tbHg1L2ZzLmgKaW5kZXggZTAzNmQ2MC4uOTNlYmM1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L2ZzLmgKQEAgLTU0LDYgKzU0LDcgQEAKIAogZW51bSBtbHg1X2Zsb3dfbmFtZXNwYWNlX3R5cGUgewogCU1MWDVfRkxPV19OQU1FU1BBQ0VfQllQQVNTLAorCU1MWDVfRkxPV19OQU1FU1BBQ0VfTEFHLAogCU1MWDVfRkxPV19OQU1FU1BBQ0VfT0ZGTE9BRFMsCiAJTUxYNV9GTE9XX05BTUVTUEFDRV9FVEhUT09MLAogCU1MWDVfRkxPV19OQU1FU1BBQ0VfS0VSTkVMLApAQCAtNjIsNiArNjMsOCBAQAogCU1MWDVfRkxPV19OQU1FU1BBQ0VfRkRCLAogCU1MWDVfRkxPV19OQU1FU1BBQ0VfRVNXX0VHUkVTUywKIAlNTFg1X0ZMT1dfTkFNRVNQQUNFX0VTV19JTkdSRVNTLAorCU1MWDVfRkxPV19OQU1FU1BBQ0VfU05JRkZFUl9SWCwKKwlNTFg1X0ZMT1dfTkFNRVNQQUNFX1NOSUZGRVJfVFgsCiB9OwogCiBzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlOwpAQCAtMTA2LDYgKzEwOSw5IEBACiAJCQkgICAgIGludCBwcmlvLAogCQkJICAgICBpbnQgbnVtX2Zsb3dfdGFibGVfZW50cmllcywKIAkJCSAgICAgdTMyIGxldmVsLCB1MTYgdnBvcnQpOworc3RydWN0IG1seDVfZmxvd190YWJsZSAqbWx4NV9jcmVhdGVfbGFnX2RlbXV4X2Zsb3dfdGFibGUoCisJCQkJCSAgICAgICBzdHJ1Y3QgbWx4NV9mbG93X25hbWVzcGFjZSAqbnMsCisJCQkJCSAgICAgICBpbnQgcHJpbywgdTMyIGxldmVsKTsKIGludCBtbHg1X2Rlc3Ryb3lfZmxvd190YWJsZShzdHJ1Y3QgbWx4NV9mbG93X3RhYmxlICpmdCk7CiAKIC8qIGluYm94IHNob3VsZCBiZSBzZXQgd2l0aCB0aGUgZm9sbG93aW5nIHZhbHVlczoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9tbHg1X2lmYy5oIGIvaW5jbHVkZS9saW51eC9tbHg1L21seDVfaWZjLmgKaW5kZXggMjFiYzQ1NS4uNjA0NWQ0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L21seDVfaWZjLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L21seDVfaWZjLmgKQEAgLTE1Miw3ICsxNTIsNyBAQAogCU1MWDVfQ01EX09QX0NPTkZJR19JTlRfTU9ERVJBVElPTiAgICAgICAgID0gMHg4MDQsCiAJTUxYNV9DTURfT1BfQUNDRVNTX1JFRyAgICAgICAgICAgICAgICAgICAgPSAweDgwNSwKIAlNTFg1X0NNRF9PUF9BVFRBQ0hfVE9fTUNHICAgICAgICAgICAgICAgICA9IDB4ODA2LAotCU1MWDVfQ01EX09QX0RFVFRBQ0hfRlJPTV9NQ0cgICAgICAgICAgICAgID0gMHg4MDcsCisJTUxYNV9DTURfT1BfREVUQUNIX0ZST01fTUNHICAgICAgICAgICAgICAgPSAweDgwNywKIAlNTFg1X0NNRF9PUF9HRVRfRFJPUFBFRF9QQUNLRVRfTE9HICAgICAgICA9IDB4ODBhLAogCU1MWDVfQ01EX09QX01BRF9JRkMgICAgICAgICAgICAgICAgICAgICAgID0gMHg1MGQsCiAJTUxYNV9DTURfT1BfUVVFUllfTUFEX0RFTVVYICAgICAgICAgICAgICAgPSAweDgwYiwKQEAgLTE3NCw2ICsxNzQsMTIgQEAKIAlNTFg1X0NNRF9PUF9ERUxFVEVfTDJfVEFCTEVfRU5UUlkgICAgICAgICA9IDB4ODJiLAogCU1MWDVfQ01EX09QX1NFVF9XT0xfUk9MICAgICAgICAgICAgICAgICAgID0gMHg4MzAsCiAJTUxYNV9DTURfT1BfUVVFUllfV09MX1JPTCAgICAgICAgICAgICAgICAgPSAweDgzMSwKKwlNTFg1X0NNRF9PUF9DUkVBVEVfTEFHICAgICAgICAgICAgICAgICAgICA9IDB4ODQwLAorCU1MWDVfQ01EX09QX01PRElGWV9MQUcgICAgICAgICAgICAgICAgICAgID0gMHg4NDEsCisJTUxYNV9DTURfT1BfUVVFUllfTEFHICAgICAgICAgICAgICAgICAgICAgPSAweDg0MiwKKwlNTFg1X0NNRF9PUF9ERVNUUk9ZX0xBRyAgICAgICAgICAgICAgICAgICA9IDB4ODQzLAorCU1MWDVfQ01EX09QX0NSRUFURV9WUE9SVF9MQUcgICAgICAgICAgICAgID0gMHg4NDQsCisJTUxYNV9DTURfT1BfREVTVFJPWV9WUE9SVF9MQUcgICAgICAgICAgICAgPSAweDg0NSwKIAlNTFg1X0NNRF9PUF9DUkVBVEVfVElSICAgICAgICAgICAgICAgICAgICA9IDB4OTAwLAogCU1MWDVfQ01EX09QX01PRElGWV9USVIgICAgICAgICAgICAgICAgICAgID0gMHg5MDEsCiAJTUxYNV9DTURfT1BfREVTVFJPWV9USVIgICAgICAgICAgICAgICAgICAgPSAweDkwMiwKQEAgLTIxMiw2ICsyMTgsOCBAQAogCU1MWDVfQ01EX09QX0RFQUxMT0NfRkxPV19DT1VOVEVSICAgICAgICAgID0gMHg5M2EsCiAJTUxYNV9DTURfT1BfUVVFUllfRkxPV19DT1VOVEVSICAgICAgICAgICAgPSAweDkzYiwKIAlNTFg1X0NNRF9PUF9NT0RJRllfRkxPV19UQUJMRSAgICAgICAgICAgICA9IDB4OTNjLAorCU1MWDVfQ01EX09QX0FMTE9DX0VOQ0FQX0hFQURFUiAgICAgICAgICAgID0gMHg5M2QsCisJTUxYNV9DTURfT1BfREVBTExPQ19FTkNBUF9IRUFERVIgICAgICAgICAgPSAweDkzZSwKIAlNTFg1X0NNRF9PUF9NQVgKIH07CiAKQEAgLTI4MSw3ICsyODksOSBAQAogCXU4ICAgICAgICAgbW9kaWZ5X3Jvb3RbMHgxXTsKIAl1OCAgICAgICAgIGlkZW50aWZpZWRfbWlzc190YWJsZV9tb2RlWzB4MV07CiAJdTggICAgICAgICBmbG93X3RhYmxlX21vZGlmeVsweDFdOwotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfN1sweDE5XTsKKwl1OCAgICAgICAgIGVuY2FwWzB4MV07CisJdTggICAgICAgICBkZWNhcFsweDFdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOVsweDE3XTsKIAogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgyXTsKIAl1OCAgICAgICAgIGxvZ19tYXhfZnRfc2l6ZVsweDZdOwpAQCAtNDczLDcgKzQ4Myw5IEBACiAKIHN0cnVjdCBtbHg1X2lmY19mbG93X3RhYmxlX25pY19jYXBfYml0cyB7CiAJdTggICAgICAgICBuaWNfcnhfbXVsdGlfcGF0aF90aXJzWzB4MV07Ci0JdTggICAgICAgICByZXNlcnZlZF9hdF8xWzB4MWZmXTsKKwl1OCAgICAgICAgIG5pY19yeF9tdWx0aV9wYXRoX3RpcnNfZnRzWzB4MV07CisJdTggICAgICAgICBhbGxvd19zbmlmZmVyX2FuZF9uaWNfcnhfc2hhcmVkX3RpclsweDFdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfM1sweDFmZF07CiAKIAlzdHJ1Y3QgbWx4NV9pZmNfZmxvd190YWJsZV9wcm9wX2xheW91dF9iaXRzIGZsb3dfdGFibGVfcHJvcGVydGllc19uaWNfcmVjZWl2ZTsKIApAQCAtNTEyLDcgKzUyNCwxNSBAQAogCXU4ICAgICAgICAgbmljX3Zwb3J0X25vZGVfZ3VpZF9tb2RpZnlbMHgxXTsKIAl1OCAgICAgICAgIG5pY192cG9ydF9wb3J0X2d1aWRfbW9kaWZ5WzB4MV07CiAKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4N2UwXTsKKwl1OCAgICAgICAgIHZ4bGFuX2VuY2FwX2RlY2FwWzB4MV07CisJdTggICAgICAgICBudmdyZV9lbmNhcF9kZWNhcFsweDFdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjJbMHg5XTsKKwl1OCAgICAgICAgIGxvZ19tYXhfZW5jYXBfaGVhZGVyc1sweDVdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfMmJbMHg2XTsKKwl1OCAgICAgICAgIG1heF9lbmNhcF9oZWFkZXJfc2l6ZVsweGFdOworCisJdTggICAgICAgICByZXNlcnZlZF80MFsweDdjMF07CisKIH07CiAKIHN0cnVjdCBtbHg1X2lmY19xb3NfY2FwX2JpdHMgewpAQCAtNzY3LDcgKzc4Nyw5IEBACiAJdTggICAgICAgICBvdXRfb2Zfc2VxX2NudFsweDFdOwogCXU4ICAgICAgICAgdnBvcnRfY291bnRlcnNbMHgxXTsKIAl1OCAgICAgICAgIHJldHJhbnNtaXNzaW9uX3FfY291bnRlcnNbMHgxXTsKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzE4M1sweDNdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTgzWzB4MV07CisJdTggICAgICAgICBtb2RpZnlfcnFfY291bnRlcl9zZXRfaWRbMHgxXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzE4NVsweDFdOwogCXU4ICAgICAgICAgbWF4X3FwX2NudFsweGFdOwogCXU4ICAgICAgICAgcGtleV90YWJsZV9zaXplWzB4MTBdOwogCkBAIC04NzAsNyArODkyLDEwIEBACiAJdTggICAgICAgICBwYWRfdHhfZXRoX3BhY2tldFsweDFdOwogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjYzWzB4OF07CiAJdTggICAgICAgICBsb2dfYmZfcmVnX3NpemVbMHg1XTsKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzI3MFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjcwWzB4Yl07CisJdTggICAgICAgICBsYWdfbWFzdGVyWzB4MV07CisJdTggICAgICAgICBudW1fbGFnX3BvcnRzWzB4NF07CiAKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzI4MFsweDEwXTsKIAl1OCAgICAgICAgIG1heF93cWVfc3pfc3FbMHgxMF07CkBAIC0xOTA0LDcgKzE5MjksNyBAQAogCiBzdHJ1Y3QgbWx4NV9pZmNfcXBjX2JpdHMgewogCXU4ICAgICAgICAgc3RhdGVbMHg0XTsKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzRbMHg0XTsKKwl1OCAgICAgICAgIGxhZ190eF9wb3J0X2FmZmluaXR5WzB4NF07CiAJdTggICAgICAgICBzdFsweDhdOwogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgzXTsKIAl1OCAgICAgICAgIHBtX3N0YXRlWzB4Ml07CkBAIC0xOTY2LDcgKzE5OTEsMTAgQEAKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzNlMFsweDhdOwogCXU4ICAgICAgICAgY3FuX3NuZFsweDE4XTsKIAotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDAwWzB4NDBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDAwWzB4OF07CisJdTggICAgICAgICBkZXRoX3NxcG5bMHgxOF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQyMFsweDIwXTsKIAogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDQwWzB4OF07CiAJdTggICAgICAgICBsYXN0X2Fja2VkX3BzblsweDE4XTsKQEAgLTIwNjQsNiArMjA5Miw4IEBACiAJTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0RST1AgICAgICA9IDB4MiwKIAlNTFg1X0ZMT1dfQ09OVEVYVF9BQ1RJT05fRldEX0RFU1QgID0gMHg0LAogCU1MWDVfRkxPV19DT05URVhUX0FDVElPTl9DT1VOVCAgICAgPSAweDgsCisJTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0VOQ0FQICAgICA9IDB4MTAsCisJTUxYNV9GTE9XX0NPTlRFWFRfQUNUSU9OX0RFQ0FQICAgICA9IDB4MjAsCiB9OwogCiBzdHJ1Y3QgbWx4NV9pZmNfZmxvd19jb250ZXh0X2JpdHMgewpAQCAtMjA4Myw3ICsyMTEzLDkgQEAKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0X2EwWzB4OF07CiAJdTggICAgICAgICBmbG93X2NvdW50ZXJfbGlzdF9zaXplWzB4MThdOwogCi0JdTggICAgICAgICByZXNlcnZlZF9hdF9jMFsweDE0MF07CisJdTggICAgICAgICBlbmNhcF9pZFsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfZTBbMHgxMjBdOwogCiAJc3RydWN0IG1seDVfaWZjX2Z0ZV9tYXRjaF9wYXJhbV9iaXRzIG1hdGNoX3ZhbHVlOwogCkBAIC0yMTQ2LDcgKzIxNzgsMTEgQEAKIH07CiAKIHN0cnVjdCBtbHg1X2lmY190aXNjX2JpdHMgewotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMFsweGNdOworCXU4ICAgICAgICAgc3RyaWN0X2xhZ190eF9wb3J0X2FmZmluaXR5WzB4MV07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xWzB4M107CisJdTggICAgICAgICBsYWdfdHhfcG9ydF9hZmZpbml0eVsweDA0XTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDRdOwogCXU4ICAgICAgICAgcHJpb1sweDRdOwogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgxMF07CiAKQEAgLTI4MDgsNyArMjg0NCw3IEBACiAKIAlzdHJ1Y3QgbWx4NV9pZmNfdGFnX21hdGNoaW5nX3RvcG9sb2d5X2NvbnRleHRfYml0cyB0YWdfbWF0Y2hpbmdfdG9wb2xvZ3lfY29udGV4dDsKIAotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTgwWzB4MTgwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzE4MFsweDIwMF07CiAKIAlzdHJ1Y3QgbWx4NV9pZmNfd3FfYml0cyB3cTsKIH07CkBAIC0zNDg5LDcgKzM1MjUsNyBAQAogCiAJdTggICAgICAgICBzeW5kcm9tZVsweDIwXTsKIAotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHgyMF07CisJdTggICAgICAgICBkdW1wX2ZpbGxfbWtleVsweDIwXTsKIAogCXU4ICAgICAgICAgcmVzZF9sa2V5WzB4MjBdOwogfTsKQEAgLTQyMTMsNiArNDI0OSw4NSBAQAogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNjBbMHgyMF07CiB9OwogCitzdHJ1Y3QgbWx4NV9pZmNfZW5jYXBfaGVhZGVyX2luX2JpdHMgeworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMFsweDVdOworCXU4ICAgICAgICAgaGVhZGVyX3R5cGVbMHgzXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzhbMHhlXTsKKwl1OCAgICAgICAgIGVuY2FwX2hlYWRlcl9zaXplWzB4YV07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MTBdOworCXU4ICAgICAgICAgZW5jYXBfaGVhZGVyWzJdWzB4OF07CisKKwl1OCAgICAgICAgIG1vcmVfZW5jYXBfaGVhZGVyWzBdWzB4OF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfcXVlcnlfZW5jYXBfaGVhZGVyX291dF9iaXRzIHsKKwl1OCAgICAgICAgIHN0YXR1c1sweDhdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDE4XTsKKworCXU4ICAgICAgICAgc3luZHJvbWVbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4YTBdOworCisJc3RydWN0IG1seDVfaWZjX2VuY2FwX2hlYWRlcl9pbl9iaXRzIGVuY2FwX2hlYWRlclswXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19xdWVyeV9lbmNhcF9oZWFkZXJfaW5fYml0cyB7CisJdTggICAgICAgICBvcGNvZGVbMHgxMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxMF07CisJdTggICAgICAgICBvcF9tb2RbMHgxMF07CisKKwl1OCAgICAgICAgIGVuY2FwX2lkWzB4MjBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF82MFsweGEwXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19hbGxvY19lbmNhcF9oZWFkZXJfb3V0X2JpdHMgeworCXU4ICAgICAgICAgc3RhdHVzWzB4OF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4MThdOworCisJdTggICAgICAgICBzeW5kcm9tZVsweDIwXTsKKworCXU4ICAgICAgICAgZW5jYXBfaWRbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzYwWzB4MjBdOworfTsKKworc3RydWN0IG1seDVfaWZjX2FsbG9jX2VuY2FwX2hlYWRlcl9pbl9iaXRzIHsKKwl1OCAgICAgICAgIG9wY29kZVsweDEwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDEwXTsKKwl1OCAgICAgICAgIG9wX21vZFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHhhMF07CisKKwlzdHJ1Y3QgbWx4NV9pZmNfZW5jYXBfaGVhZGVyX2luX2JpdHMgZW5jYXBfaGVhZGVyOworfTsKKworc3RydWN0IG1seDVfaWZjX2RlYWxsb2NfZW5jYXBfaGVhZGVyX291dF9iaXRzIHsKKwl1OCAgICAgICAgIHN0YXR1c1sweDhdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDE4XTsKKworCXU4ICAgICAgICAgc3luZHJvbWVbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKworc3RydWN0IG1seDVfaWZjX2RlYWxsb2NfZW5jYXBfaGVhZGVyX2luX2JpdHMgeworCXU4ICAgICAgICAgb3Bjb2RlWzB4MTBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkXzIwWzB4MTBdOworCXU4ICAgICAgICAgb3BfbW9kWzB4MTBdOworCisJdTggICAgICAgICBlbmNhcF9pZFsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfNjBbMHgyMF07Cit9OworCiBzdHJ1Y3QgbWx4NV9pZmNfcXVlcnlfZGN0X291dF9iaXRzIHsKIAl1OCAgICAgICAgIHN0YXR1c1sweDhdOwogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDE4XTsKQEAgLTQ1MTcsNyArNDYzMiw5IEBACiBzdHJ1Y3QgbWx4NV9pZmNfbW9kaWZ5X3Rpc19iaXRtYXNrX2JpdHMgewogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMFsweDIwXTsKIAotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxZl07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDFkXTsKKwl1OCAgICAgICAgIGxhZ190eF9wb3J0X2FmZmluaXR5WzB4MV07CisJdTggICAgICAgICBzdHJpY3RfbGFnX3R4X3BvcnRfYWZmaW5pdHlbMHgxXTsKIAl1OCAgICAgICAgIHByaW9bMHgxXTsKIH07CiAKQEAgLTQ2NTIsNiArNDc2OSwxMSBAQAogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07CiB9OwogCitlbnVtIHsKKwlNTFg1X01PRElGWV9SUV9JTl9NT0RJRllfQklUTUFTS19WU0QgPSAxVUxMIDw8IDEsCisJTUxYNV9NT0RJRllfUlFfSU5fTU9ESUZZX0JJVE1BU0tfTU9ESUZZX1JRX0NPVU5URVJfU0VUX0lEID0gMVVMTCA8PCAzLAorfTsKKwogc3RydWN0IG1seDVfaWZjX21vZGlmeV9ycV9pbl9iaXRzIHsKIAl1OCAgICAgICAgIG9wY29kZVsweDEwXTsKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOwpAQCAtNDcyMSw3ICs0ODQzLDcgQEAKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0XzBbMHgxNl07CiAJdTggICAgICAgICBub2RlX2d1aWRbMHgxXTsKIAl1OCAgICAgICAgIHBvcnRfZ3VpZFsweDFdOwotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMThbMHgxXTsKKwl1OCAgICAgICAgIG1pbl9pbmxpbmVbMHgxXTsKIAl1OCAgICAgICAgIG10dVsweDFdOwogCXU4ICAgICAgICAgY2hhbmdlX2V2ZW50WzB4MV07CiAJdTggICAgICAgICBwcm9taXNjWzB4MV07CkBAIC02MDk5LDcgKzYyMjEsOSBAQAogCiAJdTggICAgICAgICByZXNlcnZlZF9hdF9hMFsweDIwXTsKIAotCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfYzBbMHg0XTsKKwl1OCAgICAgICAgIGVuY2FwX2VuWzB4MV07CisJdTggICAgICAgICBkZWNhcF9lblsweDFdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfYzJbMHgyXTsKIAl1OCAgICAgICAgIHRhYmxlX21pc3NfbW9kZVsweDRdOwogCXU4ICAgICAgICAgbGV2ZWxbMHg4XTsKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0X2QwWzB4OF07CkBAIC02MTA4LDcgKzYyMzIsMTAgQEAKIAl1OCAgICAgICAgIHJlc2VydmVkX2F0X2UwWzB4OF07CiAJdTggICAgICAgICB0YWJsZV9taXNzX2lkWzB4MThdOwogCi0JdTggICAgICAgICByZXNlcnZlZF9hdF8xMDBbMHgxMDBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTAwWzB4OF07CisJdTggICAgICAgICBsYWdfbWFzdGVyX25leHRfdGFibGVfaWRbMHgxOF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEyMFsweDgwXTsKIH07CiAKIHN0cnVjdCBtbHg1X2lmY19jcmVhdGVfZmxvd19ncm91cF9vdXRfYml0cyB7CkBAIC02NzEwLDkgKzY4MzcsMTAgQEAKIH07CiAKIHN0cnVjdCBtbHg1X2lmY19wdHlzX3JlZ19iaXRzIHsKLQl1OCAgICAgICAgIGFuX2Rpc2FibGVfY2FwWzB4MV07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8wWzB4MV07CiAJdTggICAgICAgICBhbl9kaXNhYmxlX2FkbWluWzB4MV07Ci0JdTggICAgICAgICByZXNlcnZlZF9hdF8yWzB4Nl07CisJdTggICAgICAgICBhbl9kaXNhYmxlX2NhcFsweDFdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfM1sweDVdOwogCXU4ICAgICAgICAgbG9jYWxfcG9ydFsweDhdOwogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHhkXTsKIAl1OCAgICAgICAgIHByb3RvX21hc2tbMHgzXTsKQEAgLTc1NjIsNyArNzY5MCw4IEBACiB9OwogCiBlbnVtIHsKLQlNTFg1X01PRElGWV9GTE9XX1RBQkxFX01JU1NfVEFCTEVfSUQgPSAweDEsCisJTUxYNV9NT0RJRllfRkxPV19UQUJMRV9NSVNTX1RBQkxFX0lEICAgICA9ICgxVUwgPDwgMCksCisJTUxYNV9NT0RJRllfRkxPV19UQUJMRV9MQUdfTkVYVF9UQUJMRV9JRCA9ICgxVUwgPDwgMTUpLAogfTsKIAogc3RydWN0IG1seDVfaWZjX21vZGlmeV9mbG93X3RhYmxlX291dF9iaXRzIHsKQEAgLTc2MDEsNyArNzczMCwxMCBAQAogCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfZTBbMHg4XTsKIAl1OCAgICAgICAgIHRhYmxlX21pc3NfaWRbMHgxOF07CiAKLQl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwMFsweDEwMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMDBbMHg4XTsKKwl1OCAgICAgICAgIGxhZ19tYXN0ZXJfbmV4dF90YWJsZV9pZFsweDE4XTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTIwWzB4ODBdOwogfTsKIAogc3RydWN0IG1seDVfaWZjX2V0c190Y25fY29uZmlnX3JlZ19iaXRzIHsKQEAgLTc3MDksNCArNzg0MSwxMzQgQEAKIAl1OCAgICAgICAgIGVycm9yWzB4OF07CiAJdTggICAgICAgICByZXNlcnZlZF9hdF9hMFsweDE2MF07CiB9OworCitzdHJ1Y3QgbWx4NV9pZmNfbGFnY19iaXRzIHsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzBbMHgxZF07CisJdTggICAgICAgICBsYWdfc3RhdGVbMHgzXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxNF07CisJdTggICAgICAgICB0eF9yZW1hcF9hZmZpbml0eV8yWzB4NF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8zOFsweDRdOworCXU4ICAgICAgICAgdHhfcmVtYXBfYWZmaW5pdHlfMVsweDRdOworfTsKKworc3RydWN0IG1seDVfaWZjX2NyZWF0ZV9sYWdfb3V0X2JpdHMgeworCXU4ICAgICAgICAgc3RhdHVzWzB4OF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4MThdOworCisJdTggICAgICAgICBzeW5kcm9tZVsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfY3JlYXRlX2xhZ19pbl9iaXRzIHsKKwl1OCAgICAgICAgIG9wY29kZVsweDEwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDEwXTsKKwl1OCAgICAgICAgIG9wX21vZFsweDEwXTsKKworCXN0cnVjdCBtbHg1X2lmY19sYWdjX2JpdHMgY3R4OworfTsKKworc3RydWN0IG1seDVfaWZjX21vZGlmeV9sYWdfb3V0X2JpdHMgeworCXU4ICAgICAgICAgc3RhdHVzWzB4OF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4MThdOworCisJdTggICAgICAgICBzeW5kcm9tZVsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07Cit9OworCitzdHJ1Y3QgbWx4NV9pZmNfbW9kaWZ5X2xhZ19pbl9iaXRzIHsKKwl1OCAgICAgICAgIG9wY29kZVsweDEwXTsKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzEwWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF8yMFsweDEwXTsKKwl1OCAgICAgICAgIG9wX21vZFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHgyMF07CisJdTggICAgICAgICBmaWVsZF9zZWxlY3RbMHgyMF07CisKKwlzdHJ1Y3QgbWx4NV9pZmNfbGFnY19iaXRzIGN0eDsKK307CisKK3N0cnVjdCBtbHg1X2lmY19xdWVyeV9sYWdfb3V0X2JpdHMgeworCXU4ICAgICAgICAgc3RhdHVzWzB4OF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF84WzB4MThdOworCisJdTggICAgICAgICBzeW5kcm9tZVsweDIwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfNDBbMHg0MF07CisKKwlzdHJ1Y3QgbWx4NV9pZmNfbGFnY19iaXRzIGN0eDsKK307CisKK3N0cnVjdCBtbHg1X2lmY19xdWVyeV9sYWdfaW5fYml0cyB7CisJdTggICAgICAgICBvcGNvZGVbMHgxMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxMF07CisJdTggICAgICAgICBvcF9tb2RbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKworc3RydWN0IG1seDVfaWZjX2Rlc3Ryb3lfbGFnX291dF9iaXRzIHsKKwl1OCAgICAgICAgIHN0YXR1c1sweDhdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDE4XTsKKworCXU4ICAgICAgICAgc3luZHJvbWVbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKworc3RydWN0IG1seDVfaWZjX2Rlc3Ryb3lfbGFnX2luX2JpdHMgeworCXU4ICAgICAgICAgb3Bjb2RlWzB4MTBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MTBdOworCXU4ICAgICAgICAgb3BfbW9kWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKK307CisKK3N0cnVjdCBtbHg1X2lmY19jcmVhdGVfdnBvcnRfbGFnX291dF9iaXRzIHsKKwl1OCAgICAgICAgIHN0YXR1c1sweDhdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDE4XTsKKworCXU4ICAgICAgICAgc3luZHJvbWVbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKworc3RydWN0IG1seDVfaWZjX2NyZWF0ZV92cG9ydF9sYWdfaW5fYml0cyB7CisJdTggICAgICAgICBvcGNvZGVbMHgxMF07CisJdTggICAgICAgICByZXNlcnZlZF9hdF8xMFsweDEwXTsKKworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMjBbMHgxMF07CisJdTggICAgICAgICBvcF9tb2RbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKworc3RydWN0IG1seDVfaWZjX2Rlc3Ryb3lfdnBvcnRfbGFnX291dF9iaXRzIHsKKwl1OCAgICAgICAgIHN0YXR1c1sweDhdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfOFsweDE4XTsKKworCXU4ICAgICAgICAgc3luZHJvbWVbMHgyMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzQwWzB4NDBdOworfTsKKworc3RydWN0IG1seDVfaWZjX2Rlc3Ryb3lfdnBvcnRfbGFnX2luX2JpdHMgeworCXU4ICAgICAgICAgb3Bjb2RlWzB4MTBdOworCXU4ICAgICAgICAgcmVzZXJ2ZWRfYXRfMTBbMHgxMF07CisKKwl1OCAgICAgICAgIHJlc2VydmVkX2F0XzIwWzB4MTBdOworCXU4ICAgICAgICAgb3BfbW9kWzB4MTBdOworCisJdTggICAgICAgICByZXNlcnZlZF9hdF80MFsweDQwXTsKK307CisKICNlbmRpZiAvKiBNTFg1X0lGQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDUvcG9ydC5oIGIvaW5jbHVkZS9saW51eC9tbHg1L3BvcnQuaAppbmRleCBlMzAxMmNjLi5iMzA2NWFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDUvcG9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NS9wb3J0LmgKQEAgLTYxLDYgKzYxLDM5IEBACiAjZGVmaW5lIE1MWDVfSTJDX0FERFJfSElHSAkJMHg1MQogI2RlZmluZSBNTFg1X0VFUFJPTV9QQUdFX0xFTkdUSAkJMjU2CiAKK2VudW0gbWx4NWVfbGlua19tb2RlIHsKKwlNTFg1RV8xMDAwQkFTRV9DWF9TR01JSQkgPSAwLAorCU1MWDVFXzEwMDBCQVNFX0tYCSA9IDEsCisJTUxYNUVfMTBHQkFTRV9DWDQJID0gMiwKKwlNTFg1RV8xMEdCQVNFX0tYNAkgPSAzLAorCU1MWDVFXzEwR0JBU0VfS1IJID0gNCwKKwlNTFg1RV8yMEdCQVNFX0tSMgkgPSA1LAorCU1MWDVFXzQwR0JBU0VfQ1I0CSA9IDYsCisJTUxYNUVfNDBHQkFTRV9LUjQJID0gNywKKwlNTFg1RV81NkdCQVNFX1I0CSA9IDgsCisJTUxYNUVfMTBHQkFTRV9DUgkgPSAxMiwKKwlNTFg1RV8xMEdCQVNFX1NSCSA9IDEzLAorCU1MWDVFXzEwR0JBU0VfRVIJID0gMTQsCisJTUxYNUVfNDBHQkFTRV9TUjQJID0gMTUsCisJTUxYNUVfNDBHQkFTRV9MUjQJID0gMTYsCisJTUxYNUVfNTBHQkFTRV9TUjIJID0gMTgsCisJTUxYNUVfMTAwR0JBU0VfQ1I0CSA9IDIwLAorCU1MWDVFXzEwMEdCQVNFX1NSNAkgPSAyMSwKKwlNTFg1RV8xMDBHQkFTRV9LUjQJID0gMjIsCisJTUxYNUVfMTAwR0JBU0VfTFI0CSA9IDIzLAorCU1MWDVFXzEwMEJBU0VfVFgJID0gMjQsCisJTUxYNUVfMTAwMEJBU0VfVAkgPSAyNSwKKwlNTFg1RV8xMEdCQVNFX1QJCSA9IDI2LAorCU1MWDVFXzI1R0JBU0VfQ1IJID0gMjcsCisJTUxYNUVfMjVHQkFTRV9LUgkgPSAyOCwKKwlNTFg1RV8yNUdCQVNFX1NSCSA9IDI5LAorCU1MWDVFXzUwR0JBU0VfQ1IyCSA9IDMwLAorCU1MWDVFXzUwR0JBU0VfS1IyCSA9IDMxLAorCU1MWDVFX0xJTktfTU9ERVNfTlVNQkVSLAorfTsKKworI2RlZmluZSBNTFg1RV9QUk9UX01BU0sobGlua19tb2RlKSAoMSA8PCBsaW5rX21vZGUpCisKIGludCBtbHg1X3NldF9wb3J0X2NhcHMoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTggcG9ydF9udW0sIHUzMiBjYXBzKTsKIGludCBtbHg1X3F1ZXJ5X3BvcnRfcHR5cyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgKnB0eXMsCiAJCQkgaW50IHB0eXNfc2l6ZSwgaW50IHByb3RvX21hc2ssIHU4IGxvY2FsX3BvcnQpOwpAQCAtNzAsOSArMTAzLDEwIEBACiAJCQkJdTMyICpwcm90b19hZG1pbiwgaW50IHByb3RvX21hc2spOwogaW50IG1seDVfcXVlcnlfcG9ydF9saW5rX3dpZHRoX29wZXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCQkgICAgdTggKmxpbmtfd2lkdGhfb3BlciwgdTggbG9jYWxfcG9ydCk7Ci1pbnQgbWx4NV9xdWVyeV9wb3J0X3Byb3RvX29wZXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKLQkJCSAgICAgICB1OCAqcHJvdG9fb3BlciwgaW50IHByb3RvX21hc2ssCi0JCQkgICAgICAgdTggbG9jYWxfcG9ydCk7CitpbnQgbWx4NV9xdWVyeV9wb3J0X2liX3Byb3RvX29wZXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKKwkJCQkgIHU4ICpwcm90b19vcGVyLCB1OCBsb2NhbF9wb3J0KTsKK2ludCBtbHg1X3F1ZXJ5X3BvcnRfZXRoX3Byb3RvX29wZXIoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKKwkJCQkgICB1MzIgKnByb3RvX29wZXIsIHU4IGxvY2FsX3BvcnQpOwogaW50IG1seDVfc2V0X3BvcnRfcHR5cyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBib29sIGFuX2Rpc2FibGUsCiAJCSAgICAgICB1MzIgcHJvdG9fYWRtaW4sIGludCBwcm90b19tYXNrKTsKIHZvaWQgbWx4NV90b2dnbGVfcG9ydF9saW5rKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg1L3FwLmggYi9pbmNsdWRlL2xpbnV4L21seDUvcXAuaAppbmRleCA3ODc5YmY0Li4wYWFjYjJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDUvcXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDUvcXAuaApAQCAtMTIzLDEyICsxMjMsMTMgQEAKIH07CiAKIGVudW0gewotCU1MWDVfTk9OX1pFUk9fUlEJPSAwIDw8IDI0LAotCU1MWDVfU1JRX1JRCQk9IDEgPDwgMjQsCi0JTUxYNV9DUlFfUlEJCT0gMiA8PCAyNCwKLQlNTFg1X1pFUk9fTEVOX1JRCT0gMyA8PCAyNAorCU1MWDVfTk9OX1pFUk9fUlEJPSAweDAsCisJTUxYNV9TUlFfUlEJCT0gMHgxLAorCU1MWDVfQ1JRX1JRCQk9IDB4MiwKKwlNTFg1X1pFUk9fTEVOX1JRCT0gMHgzCiB9OwogCisvKiBUT0RPIFJFTSAqLwogZW51bSB7CiAJLyogcGFyYW1zMSAqLwogCU1MWDVfUVBfQklUX1NSRQkJCQk9IDEgPDwgMTUsCkBAIC0xNzgsMTIgKzE3OSw2IEBACiB9OwogCiBlbnVtIHsKLQlNTFg1X1FQX0xBVF9TRU5TSVRJVkUJPSAxIDw8IDI4LAotCU1MWDVfUVBfQkxPQ0tfTUNBU1QJPSAxIDw8IDMwLAotCU1MWDVfUVBfRU5BQkxFX1NJRwk9IDEgPDwgMzEsCi19OwotCi1lbnVtIHsKIAlNTFg1X1JDVl9EQlIJPSAwLAogCU1MWDVfU05EX0RCUgk9IDEsCiB9OwpAQCAtNDg0LDYgKzQ3OSw3IEBACiAJdTgJCQlybWFjWzZdOwogfTsKIAorLyogRklYTUU6IHVzZSBtbHg1X2lmYy5oIHFwYyAqLwogc3RydWN0IG1seDVfcXBfY29udGV4dCB7CiAJX19iZTMyCQkJZmxhZ3M7CiAJX19iZTMyCQkJZmxhZ3NfcGQ7CkBAIC01MjUsOTkgKzUyMSw2IEBACiAJdTgJCQlyc3ZkMVsyNF07CiB9OwogCi1zdHJ1Y3QgbWx4NV9jcmVhdGVfcXBfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlpbnB1dF9xcG47Ci0JdTgJCQlyc3ZkMFs0XTsKLQlfX2JlMzIJCQlvcHRfcGFyYW1fbWFzazsKLQl1OAkJCXJzdmQxWzRdOwotCXN0cnVjdCBtbHg1X3FwX2NvbnRleHQJY3R4OwotCXU4CQkJcnN2ZDNbMTZdOwotCV9fYmU2NAkJCXBhc1swXTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NyZWF0ZV9xcF9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JX19iZTMyCQkJcXBuOwotCXU4CQkJcnN2ZDBbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X3FwX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJcXBuOwotCXU4CQkJcnN2ZDBbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9kZXN0cm95X3FwX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQwWzhdOwotfTsKLQotc3RydWN0IG1seDVfbW9kaWZ5X3FwX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJcXBuOwotCXU4CQkJcnN2ZDBbNF07Ci0JX19iZTMyCQkJb3B0cGFyYW07Ci0JdTgJCQlyc3ZkMVs0XTsKLQlzdHJ1Y3QgbWx4NV9xcF9jb250ZXh0CWN0eDsKLQl1OAkJCXJzdmQyWzE2XTsKLX07Ci0KLXN0cnVjdCBtbHg1X21vZGlmeV9xcF9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkMFs4XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X3FwX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJcXBuOwotCXU4CQkJcnN2ZFs0XTsKLX07Ci0KLXN0cnVjdCBtbHg1X3F1ZXJ5X3FwX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmQxWzhdOwotCV9fYmUzMgkJCW9wdHBhcmFtOwotCXU4CQkJcnN2ZDBbNF07Ci0Jc3RydWN0IG1seDVfcXBfY29udGV4dAljdHg7Ci0JdTgJCQlyc3ZkMlsxNl07Ci0JX19iZTY0CQkJcGFzWzBdOwotfTsKLQotc3RydWN0IG1seDVfY29uZl9zcXBfbWJveF9pbiB7Ci0Jc3RydWN0IG1seDVfaW5ib3hfaGRyCWhkcjsKLQlfX2JlMzIJCQlxcG47Ci0JdTgJCQlyc3ZkWzNdOwotCXU4CQkJdHlwZTsKLX07Ci0KLXN0cnVjdCBtbHg1X2NvbmZfc3FwX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9hbGxvY194cmNkX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQotc3RydWN0IG1seDVfYWxsb2NfeHJjZF9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JX19iZTMyCQkJeHJjZG47Ci0JdTgJCQlyc3ZkWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVhbGxvY194cmNkX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJeHJjZG47Ci0JdTgJCQlyc3ZkWzRdOwotfTsKLQotc3RydWN0IG1seDVfZGVhbGxvY194cmNkX21ib3hfb3V0IHsKLQlzdHJ1Y3QgbWx4NV9vdXRib3hfaGRyCWhkcjsKLQl1OAkJCXJzdmRbOF07Ci19OwotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtbHg1X2NvcmVfcXAgKl9fbWx4NV9xcF9sb29rdXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyIHFwbikKIHsKIAlyZXR1cm4gcmFkaXhfdHJlZV9sb29rdXAoJmRldi0+cHJpdi5xcF90YWJsZS50cmVlLCBxcG4pOwpAQCAtNjI4LDI4ICs1MzEsMTcgQEAKIAlyZXR1cm4gcmFkaXhfdHJlZV9sb29rdXAoJmRldi0+cHJpdi5ta2V5X3RhYmxlLnRyZWUsIGtleSk7CiB9CiAKLXN0cnVjdCBtbHg1X3BhZ2VfZmF1bHRfcmVzdW1lX21ib3hfaW4gewotCXN0cnVjdCBtbHg1X2luYm94X2hkcgloZHI7Ci0JX19iZTMyCQkJZmxhZ3NfcXBuOwotCXU4CQkJcmVzZXJ2ZWRbNF07Ci19OwotCi1zdHJ1Y3QgbWx4NV9wYWdlX2ZhdWx0X3Jlc3VtZV9tYm94X291dCB7Ci0Jc3RydWN0IG1seDVfb3V0Ym94X2hkcgloZHI7Ci0JdTgJCQlyc3ZkWzhdOwotfTsKLQogaW50IG1seDVfY29yZV9jcmVhdGVfcXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwKIAkJCXN0cnVjdCBtbHg1X2NvcmVfcXAgKnFwLAotCQkJc3RydWN0IG1seDVfY3JlYXRlX3FwX21ib3hfaW4gKmluLAorCQkJdTMyICppbiwKIAkJCWludCBpbmxlbik7Ci1pbnQgbWx4NV9jb3JlX3FwX21vZGlmeShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MTYgb3BlcmF0aW9uLAotCQkJc3RydWN0IG1seDVfbW9kaWZ5X3FwX21ib3hfaW4gKmluLCBpbnQgc3FkX2V2ZW50LAoraW50IG1seDVfY29yZV9xcF9tb2RpZnkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTE2IG9wY29kZSwKKwkJCXUzMiBvcHRfcGFyYW1fbWFzaywgdm9pZCAqcXBjLAogCQkJc3RydWN0IG1seDVfY29yZV9xcCAqcXApOwogaW50IG1seDVfY29yZV9kZXN0cm95X3FwKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsCiAJCQkgc3RydWN0IG1seDVfY29yZV9xcCAqcXApOwogaW50IG1seDVfY29yZV9xcF9xdWVyeShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jb3JlX3FwICpxcCwKLQkJICAgICAgIHN0cnVjdCBtbHg1X3F1ZXJ5X3FwX21ib3hfb3V0ICpvdXQsIGludCBvdXRsZW4pOworCQkgICAgICAgdTMyICpvdXQsIGludCBvdXRsZW4pOwogCiBpbnQgbWx4NV9jb3JlX3hyY2RfYWxsb2Moc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdTMyICp4cmNkbik7CiBpbnQgbWx4NV9jb3JlX3hyY2RfZGVhbGxvYyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1MzIgeHJjZG4pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg1L3Zwb3J0LmggYi9pbmNsdWRlL2xpbnV4L21seDUvdnBvcnQuaAppbmRleCBlMDg3YjdkLi40NTFiMGJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDUvdnBvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDUvdnBvcnQuaApAQCAtNDUsNiArNDUsOCBAQAogCQkJCSAgICAgdTE2IHZwb3J0LCB1OCAqYWRkcik7CiB2b2lkIG1seDVfcXVlcnlfbmljX3Zwb3J0X21pbl9pbmxpbmUoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsCiAJCQkJICAgICB1OCAqbWluX2lubGluZSk7CitpbnQgbWx4NV9tb2RpZnlfbmljX3Zwb3J0X21pbl9pbmxpbmUoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsCisJCQkJICAgICB1MTYgdnBvcnQsIHU4IG1pbl9pbmxpbmUpOwogaW50IG1seDVfbW9kaWZ5X25pY192cG9ydF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LAogCQkJCSAgICAgIHUxNiB2cG9ydCwgdTggKmFkZHIpOwogaW50IG1seDVfcXVlcnlfbmljX3Zwb3J0X210dShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgdTE2ICptdHUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IDA4ZWQ1M2UuLjVmMTQ1MzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTIwMTQsMTAgKzIwMTQsMTMgQEAKIAogZXh0ZXJuIHZvaWQgc2V0X21tX2V4ZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgZmlsZSAqbmV3X2V4ZV9maWxlKTsKIGV4dGVybiBzdHJ1Y3QgZmlsZSAqZ2V0X21tX2V4ZV9maWxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK2V4dGVybiBzdHJ1Y3QgZmlsZSAqZ2V0X3Rhc2tfZXhlX2ZpbGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIAogZXh0ZXJuIGJvb2wgbWF5X2V4cGFuZF92bShzdHJ1Y3QgbW1fc3RydWN0ICosIHZtX2ZsYWdzX3QsIHVuc2lnbmVkIGxvbmcgbnBhZ2VzKTsKIGV4dGVybiB2b2lkIHZtX3N0YXRfYWNjb3VudChzdHJ1Y3QgbW1fc3RydWN0ICosIHZtX2ZsYWdzX3QsIGxvbmcgbnBhZ2VzKTsKIAorZXh0ZXJuIGJvb2wgdm1hX2lzX3NwZWNpYWxfbWFwcGluZyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkgICBjb25zdCBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nICpzbSk7CiBleHRlcm4gc3RydWN0IHZtX2FyZWFfc3RydWN0ICpfaW5zdGFsbF9zcGVjaWFsX21hcHBpbmcoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oIGIvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCmluZGV4IGQ4NjczY2EuLjczZmFkODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKQEAgLTI5Miw2ICsyOTIsNyBAQAogCXUzMgkJCXJhd19jaWRbNF07CS8qIHJhdyBjYXJkIENJRCAqLwogCXUzMgkJCXJhd19jc2RbNF07CS8qIHJhdyBjYXJkIENTRCAqLwogCXUzMgkJCXJhd19zY3JbMl07CS8qIHJhdyBjYXJkIFNDUiAqLworCXUzMgkJCXJhd19zc3JbMTZdOwkvKiByYXcgY2FyZCBTU1IgKi8KIAlzdHJ1Y3QgbW1jX2NpZAkJY2lkOwkJLyogY2FyZCBpZGVudGlmaWNhdGlvbiAqLwogCXN0cnVjdCBtbWNfY3NkCQljc2Q7CQkvKiBjYXJkIHNwZWNpZmljICovCiAJc3RydWN0IG1tY19leHRfY3NkCWV4dF9jc2Q7CS8qIG1tYyB2NCBleHRlbmRlZCBjYXJkIHNwZWNpZmljICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21tYy9jb3JlLmgKaW5kZXggYjAxZTc3ZC4uMmI5NTNlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2NvcmUuaApAQCAtNTUsNiArNTUsOSBAQAogI2RlZmluZSBNTUNfUlNQX1I2CShNTUNfUlNQX1BSRVNFTlR8TU1DX1JTUF9DUkN8TU1DX1JTUF9PUENPREUpCiAjZGVmaW5lIE1NQ19SU1BfUjcJKE1NQ19SU1BfUFJFU0VOVHxNTUNfUlNQX0NSQ3xNTUNfUlNQX09QQ09ERSkKIAorLyogQ2FuIGJlIHVzZWQgYnkgY29yZSB0byBwb2xsIGFmdGVyIHN3aXRjaCB0byBNTUMgSFMgbW9kZSAqLworI2RlZmluZSBNTUNfUlNQX1IxX05PX0NSQwkoTU1DX1JTUF9QUkVTRU5UfE1NQ19SU1BfT1BDT0RFKQorCiAjZGVmaW5lIG1tY19yZXNwX3R5cGUoY21kKQkoKGNtZCktPmZsYWdzICYgKE1NQ19SU1BfUFJFU0VOVHxNTUNfUlNQXzEzNnxNTUNfUlNQX0NSQ3xNTUNfUlNQX0JVU1l8TU1DX1JTUF9PUENPREUpKQogCiAvKgpAQCAtMTMzLDggKzEzNiwxMiBAQAogCXN0cnVjdCBtbWNfY29tbWFuZAkqc3RvcDsKIAogCXN0cnVjdCBjb21wbGV0aW9uCWNvbXBsZXRpb247CisJc3RydWN0IGNvbXBsZXRpb24JY21kX2NvbXBsZXRpb247CiAJdm9pZAkJCSgqZG9uZSkoc3RydWN0IG1tY19yZXF1ZXN0ICopOy8qIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KIAlzdHJ1Y3QgbW1jX2hvc3QJCSpob3N0OworCisJLyogQWxsb3cgb3RoZXIgY29tbWFuZHMgZHVyaW5nIHRoaXMgb25nb2luZyBkYXRhIHRyYW5zZmVyIG9yIGJ1c3kgd2FpdCAqLworCWJvb2wJCQljYXBfY21kX2R1cmluZ190ZnI7CiB9OwogCiBzdHJ1Y3QgbW1jX2NhcmQ7CkBAIC0xNDYsNiArMTUzLDkgQEAKIAkJCQkJICAgc3RydWN0IG1tY19hc3luY19yZXEgKiwgaW50ICopOwogZXh0ZXJuIGludCBtbWNfaW50ZXJydXB0X2hwaShzdHJ1Y3QgbW1jX2NhcmQgKik7CiBleHRlcm4gdm9pZCBtbWNfd2FpdF9mb3JfcmVxKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKik7CitleHRlcm4gdm9pZCBtbWNfd2FpdF9mb3JfcmVxX2RvbmUoc3RydWN0IG1tY19ob3N0ICpob3N0LAorCQkJCSAgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpOworZXh0ZXJuIGJvb2wgbW1jX2lzX3JlcV9kb25lKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCwgc3RydWN0IG1tY19yZXF1ZXN0ICptcnEpOwogZXh0ZXJuIGludCBtbWNfd2FpdF9mb3JfY21kKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX2NvbW1hbmQgKiwgaW50KTsKIGV4dGVybiBpbnQgbW1jX2FwcF9jbWQoc3RydWN0IG1tY19ob3N0ICosIHN0cnVjdCBtbWNfY2FyZCAqKTsKIGV4dGVybiBpbnQgbW1jX3dhaXRfZm9yX2FwcF9jbWQoc3RydWN0IG1tY19ob3N0ICosIHN0cnVjdCBtbWNfY2FyZCAqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvZHdfbW1jLmggYi9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaAppbmRleCA4M2IwZWRmYy4uZjVhZjJiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvZHdfbW1jLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvZHdfbW1jLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9jb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KIAogI2RlZmluZSBNQVhfTUNJX1NMT1RTCTIKIApAQCAtMjU5LDYgKzI2MCw3IEBACiAJLyogZGVsYXkgaW4gbVMgYmVmb3JlIGRldGVjdGluZyBjYXJkcyBhZnRlciBpbnRlcnJ1cHQgKi8KIAl1MzIgZGV0ZWN0X2RlbGF5X21zOwogCisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnJzdGM7CiAJc3RydWN0IGR3X21jaV9kbWFfb3BzICpkbWFfb3BzOwogCXN0cnVjdCBkbWFfcGRhdGEgKmRhdGE7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCmluZGV4IGFhNGJmYmYuLjBiMjQzOTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKQEAgLTI4MSw2ICsyODEsNyBAQAogI2RlZmluZSBNTUNfQ0FQX0RSSVZFUl9UWVBFX0EJKDEgPDwgMjMpCS8qIEhvc3Qgc3VwcG9ydHMgRHJpdmVyIFR5cGUgQSAqLwogI2RlZmluZSBNTUNfQ0FQX0RSSVZFUl9UWVBFX0MJKDEgPDwgMjQpCS8qIEhvc3Qgc3VwcG9ydHMgRHJpdmVyIFR5cGUgQyAqLwogI2RlZmluZSBNTUNfQ0FQX0RSSVZFUl9UWVBFX0QJKDEgPDwgMjUpCS8qIEhvc3Qgc3VwcG9ydHMgRHJpdmVyIFR5cGUgRCAqLworI2RlZmluZSBNTUNfQ0FQX0NNRF9EVVJJTkdfVEZSCSgxIDw8IDI5KQkvKiBDb21tYW5kcyBkdXJpbmcgZGF0YSB0cmFuc2ZlciAqLwogI2RlZmluZSBNTUNfQ0FQX0NNRDIzCQkoMSA8PCAzMCkJLyogQ01EMjMgc3VwcG9ydGVkLiAqLwogI2RlZmluZSBNTUNfQ0FQX0hXX1JFU0VUCSgxIDw8IDMxKQkvKiBIYXJkd2FyZSByZXNldCAqLwogCkBAIC0zODIsNiArMzgzLDkgQEAKIAlzdHJ1Y3QgbW1jX2FzeW5jX3JlcQkqYXJlcTsJCS8qIGFjdGl2ZSBhc3luYyByZXEgKi8KIAlzdHJ1Y3QgbW1jX2NvbnRleHRfaW5mbwljb250ZXh0X2luZm87CS8qIGFzeW5jIHN5bmNocm9uaXphdGlvbiBpbmZvICovCiAKKwkvKiBPbmdvaW5nIGRhdGEgdHJhbnNmZXIgdGhhdCBhbGxvd3MgY29tbWFuZHMgZHVyaW5nIHRyYW5zZmVyICovCisJc3RydWN0IG1tY19yZXF1ZXN0CSpvbmdvaW5nX21ycTsKKwogI2lmZGVmIENPTkZJR19GQUlMX01NQ19SRVFVRVNUCiAJc3RydWN0IGZhdWx0X2F0dHIJZmFpbF9tbWNfcmVxdWVzdDsKICNlbmRpZgpAQCAtNDE4LDYgKzQyMiw3IEBACiAKIHZvaWQgbW1jX2RldGVjdF9jaGFuZ2Uoc3RydWN0IG1tY19ob3N0ICosIHVuc2lnbmVkIGxvbmcgZGVsYXkpOwogdm9pZCBtbWNfcmVxdWVzdF9kb25lKHN0cnVjdCBtbWNfaG9zdCAqLCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKik7Cit2b2lkIG1tY19jb21tYW5kX2RvbmUoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtbWNfc2lnbmFsX3NkaW9faXJxKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL3NkaW9faWRzLmggYi9pbmNsdWRlL2xpbnV4L21tYy9zZGlvX2lkcy5oCmluZGV4IDBkMTI2YWUuLmQ0M2VmOTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL3NkaW9faWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvc2Rpb19pZHMuaApAQCAtMzIsNiArMzIsNyBAQAogI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM0MAkJMHhhOTRjCiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzQxCQkweGE5NGQKICNkZWZpbmUgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNV80MzM5CTB4NDMzNQorI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM5CQkweDQzMzkKICNkZWZpbmUgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNjIJCTB4YTk2MgogI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzQzMAkJMHhhOWE2CiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzNDUJCTB4NDM0NQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKaW5kZXggZDU3MmI3OC4uN2YyYWU5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC04MjgsOSArODI4LDIxIEBACiAgKi8KICNkZWZpbmUgem9uZV9pZHgoem9uZSkJCSgoem9uZSkgLSAoem9uZSktPnpvbmVfcGdkYXQtPm5vZGVfem9uZXMpCiAKLXN0YXRpYyBpbmxpbmUgaW50IHBvcHVsYXRlZF96b25lKHN0cnVjdCB6b25lICp6b25lKQorLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhIHpvbmUgaGFzIHBhZ2VzIG1hbmFnZWQgYnkgdGhlIGJ1ZGR5IGFsbG9jYXRvci4KKyAqIEFsbCB0aGUgcmVjbGFpbSBkZWNpc2lvbnMgaGF2ZSB0byB1c2UgdGhpcyBmdW5jdGlvbiByYXRoZXIgdGhhbgorICogcG9wdWxhdGVkX3pvbmUoKS4gSWYgdGhlIHdob2xlIHpvbmUgaXMgcmVzZXJ2ZWQgdGhlbiB3ZSBjYW4gZWFzaWx5CisgKiBlbmQgdXAgd2l0aCBwb3B1bGF0ZWRfem9uZSgpICYmICFtYW5hZ2VkX3pvbmUoKS4KKyAqLworc3RhdGljIGlubGluZSBib29sIG1hbmFnZWRfem9uZShzdHJ1Y3Qgem9uZSAqem9uZSkKIHsKLQlyZXR1cm4gKCEhem9uZS0+cHJlc2VudF9wYWdlcyk7CisJcmV0dXJuIHpvbmUtPm1hbmFnZWRfcGFnZXM7Cit9CisKKy8qIFJldHVybnMgdHJ1ZSBpZiBhIHpvbmUgaGFzIG1lbW9yeSAqLworc3RhdGljIGlubGluZSBib29sIHBvcHVsYXRlZF96b25lKHN0cnVjdCB6b25lICp6b25lKQoreworCXJldHVybiB6b25lLT5wcmVzZW50X3BhZ2VzOwogfQogCiBleHRlcm4gaW50IG1vdmFibGVfem9uZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW91bnQuaCBiL2luY2x1ZGUvbGludXgvbW91bnQuaAppbmRleCA1NGE1OTRkLi4xMTcyY2NlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vdW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9tb3VudC5oCkBAIC05Niw0ICs5Niw2IEBACiAKIGV4dGVybiBkZXZfdCBuYW1lX3RvX2Rldl90KGNvbnN0IGNoYXIgKm5hbWUpOwogCitleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9tb3VudF9tYXg7CisKICNlbmRpZiAvKiBfTElOVVhfTU9VTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tcm91dGUuaCBiL2luY2x1ZGUvbGludXgvbXJvdXRlLmgKaW5kZXggZDM1MWZkMy4uZTVmYjgxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tcm91dGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21yb3V0ZS5oCkBAIC0xMjAsNSArMTIwLDUgQEAKIHN0cnVjdCBydG1zZzsKIGludCBpcG1yX2dldF9yb3V0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgIF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAotCQkgICBzdHJ1Y3QgcnRtc2cgKnJ0bSwgaW50IG5vd2FpdCk7CisJCSAgIHN0cnVjdCBydG1zZyAqcnRtLCBpbnQgbm93YWl0LCB1MzIgcG9ydGlkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tcm91dGU2LmggYi9pbmNsdWRlL2xpbnV4L21yb3V0ZTYuaAppbmRleCAzOTg3YjY0Li4xOWExYzBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21yb3V0ZTYuaAorKysgYi9pbmNsdWRlL2xpbnV4L21yb3V0ZTYuaApAQCAtMTE2LDcgKzExNiw3IEBACiAKIHN0cnVjdCBydG1zZzsKIGV4dGVybiBpbnQgaXA2bXJfZ2V0X3JvdXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgIHN0cnVjdCBydG1zZyAqcnRtLCBpbnQgbm93YWl0KTsKKwkJCSAgIHN0cnVjdCBydG1zZyAqcnRtLCBpbnQgbm93YWl0LCB1MzIgcG9ydGlkKTsKIAogI2lmZGVmIENPTkZJR19JUFY2X01ST1VURQogZXh0ZXJuIHN0cnVjdCBzb2NrICptcm91dGU2X3NvY2tldChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tc2kuaCBiL2luY2x1ZGUvbGludXgvbXNpLmgKaW5kZXggZThjODFmYi4uMGRiMzIwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tc2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L21zaS5oCkBAIC02OCw3ICs2OCw3IEBACiAJdW5zaWduZWQgaW50CQkJbnZlY191c2VkOwogCXN0cnVjdCBkZXZpY2UJCQkqZGV2OwogCXN0cnVjdCBtc2lfbXNnCQkJbXNnOwotCWNvbnN0IHN0cnVjdCBjcHVtYXNrCQkqYWZmaW5pdHk7CisJc3RydWN0IGNwdW1hc2sJCQkqYWZmaW5pdHk7CiAKIAl1bmlvbiB7CiAJCS8qIFBDSSBNU0kvWCBzcGVjaWZpYyBkYXRhICovCkBAIC0xMjMsNyArMTIzLDggQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLwogCi1zdHJ1Y3QgbXNpX2Rlc2MgKmFsbG9jX21zaV9lbnRyeShzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RydWN0IG1zaV9kZXNjICphbGxvY19tc2lfZW50cnkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbnZlYywKKwkJCQkgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5KTsKIHZvaWQgZnJlZV9tc2lfZW50cnkoc3RydWN0IG1zaV9kZXNjICplbnRyeSk7CiB2b2lkIF9fcGNpX3JlYWRfbXNpX21zZyhzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5LCBzdHJ1Y3QgbXNpX21zZyAqbXNnKTsKIHZvaWQgX19wY2lfd3JpdGVfbXNpX21zZyhzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5LCBzdHJ1Y3QgbXNpX21zZyAqbXNnKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0LmggYi9pbmNsdWRlL2xpbnV4L25ldC5oCmluZGV4IGI5ZjBmZjQuLmNkMGM4YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXQuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ttZW1jaGVjay5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvb25jZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAKICNpbmNsdWRlIDx1YXBpL2xpbnV4L25ldC5oPgogCkBAIC0xMjgsNiArMTI5LDkgQEAKIHN0cnVjdCBzb2NrYWRkcjsKIHN0cnVjdCBtc2doZHI7CiBzdHJ1Y3QgbW9kdWxlOworc3RydWN0IHNrX2J1ZmY7Cit0eXBlZGVmIGludCAoKnNrX3JlYWRfYWN0b3JfdCkocmVhZF9kZXNjcmlwdG9yX3QgKiwgc3RydWN0IHNrX2J1ZmYgKiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQsIHNpemVfdCk7CiAKIHN0cnVjdCBwcm90b19vcHMgewogCWludAkJZmFtaWx5OwpAQCAtMTg2LDYgKzE5MCw4IEBACiAJCQkJICAgICAgIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBmbGFncyk7CiAJaW50CQkoKnNldF9wZWVrX29mZikoc3RydWN0IHNvY2sgKnNrLCBpbnQgdmFsKTsKIAlpbnQJCSgqcGVla19sZW4pKHN0cnVjdCBzb2NrZXQgKnNvY2spOworCWludAkJKCpyZWFkX3NvY2spKHN0cnVjdCBzb2NrICpzaywgcmVhZF9kZXNjcmlwdG9yX3QgKmRlc2MsCisJCQkJICAgICBza19yZWFkX2FjdG9yX3QgcmVjdl9hY3Rvcik7CiB9OwogCiAjZGVmaW5lIERFQ0xBUkVfU09DS0FERFIodHlwZSwgZHN0LCBzcmMpCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IDNhNzg4YmYuLjEzNmFlNmJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlIDx1YXBpL2xpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPHVhcGkvbGludXgvaWZfYm9uZGluZy5oPgogI2luY2x1ZGUgPHVhcGkvbGludXgvcGt0X2Nscy5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2h0YWJsZS5oPgogCiBzdHJ1Y3QgbmV0cG9sbF9pbmZvOwogc3RydWN0IGRldmljZTsKQEAgLTc4OCw2ICs3ODksNyBAQAogCVRDX1NFVFVQX0NMU1UzMiwKIAlUQ19TRVRVUF9DTFNGTE9XRVIsCiAJVENfU0VUVVBfTUFUQ0hBTEwsCisJVENfU0VUVVBfQ0xTQlBGLAogfTsKIAogc3RydWN0IHRjX2Nsc191MzJfb2ZmbG9hZDsKQEAgLTc5OSw2ICs4MDEsNyBAQAogCQlzdHJ1Y3QgdGNfY2xzX3UzMl9vZmZsb2FkICpjbHNfdTMyOwogCQlzdHJ1Y3QgdGNfY2xzX2Zsb3dlcl9vZmZsb2FkICpjbHNfZmxvd2VyOwogCQlzdHJ1Y3QgdGNfY2xzX21hdGNoYWxsX29mZmxvYWQgKmNsc19tYWxsOworCQlzdHJ1Y3QgdGNfY2xzX2JwZl9vZmZsb2FkICpjbHNfYnBmOwogCX07CiB9OwogCkBAIC05MjMsNiArOTI2LDE0IEBACiAgKgkzLiBVcGRhdGUgZGV2LT5zdGF0cyBhc3luY2hyb25vdXNseSBhbmQgYXRvbWljYWxseSwgYW5kIGRlZmluZQogICoJICAgbmVpdGhlciBvcGVyYXRpb24uCiAgKgorICogYm9vbCAoKm5kb19oYXNfb2ZmbG9hZF9zdGF0cykoaW50IGF0dHJfaWQpCisgKglSZXR1cm4gdHJ1ZSBpZiB0aGlzIGRldmljZSBzdXBwb3J0cyBvZmZsb2FkIHN0YXRzIG9mIHRoaXMgYXR0cl9pZC4KKyAqCisgKiBpbnQgKCpuZG9fZ2V0X29mZmxvYWRfc3RhdHMpKGludCBhdHRyX2lkLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICoJdm9pZCAqYXR0cl9kYXRhKQorICoJR2V0IHN0YXRpc3RpY3MgZm9yIG9mZmxvYWQgb3BlcmF0aW9ucyBieSBhdHRyX2lkLiBXcml0ZSBpdCBpbnRvIHRoZQorICoJYXR0cl9kYXRhIHBvaW50ZXIuCisgKgogICogaW50ICgqbmRvX3ZsYW5fcnhfYWRkX3ZpZCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTE2IHByb3RvLCB1MTYgdmlkKTsKICAqCUlmIGRldmljZSBzdXBwb3J0cyBWTEFOIGZpbHRlcmluZyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEKICAqCVZMQU4gaWQgaXMgcmVnaXN0ZXJlZC4KQEAgLTkzNSw3ICs5NDYsOCBAQAogICoKICAqCVNSLUlPViBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4KICAqIGludCAoKm5kb19zZXRfdmZfbWFjKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIHU4KiBtYWMpOwotICogaW50ICgqbmRvX3NldF92Zl92bGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIHUxNiB2bGFuLCB1OCBxb3MpOworICogaW50ICgqbmRvX3NldF92Zl92bGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIHUxNiB2bGFuLAorICoJCQkgIHU4IHFvcywgX19iZTE2IHByb3RvKTsKICAqIGludCAoKm5kb19zZXRfdmZfcmF0ZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLCBpbnQgbWluX3R4X3JhdGUsCiAgKgkJCSAgaW50IG1heF90eF9yYXRlKTsKICAqIGludCAoKm5kb19zZXRfdmZfc3Bvb2ZjaGspKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB2ZiwgYm9vbCBzZXR0aW5nKTsKQEAgLTEwMzAsNyArMTA0Miw3IEBACiAgKglEZWxldGVzIHRoZSBGREIgZW50cnkgZnJvbSBkZXYgY29yZXNwb25kaW5nIHRvIGFkZHIuCiAgKiBpbnQgKCpuZG9fZmRiX2R1bXApKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKICAqCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsCi0gKgkJICAgICAgIGludCBpZHgpCisgKgkJICAgICAgIGludCAqaWR4KQogICoJVXNlZCB0byBhZGQgRkRCIGVudHJpZXMgdG8gZHVtcCByZXF1ZXN0cy4gSW1wbGVtZW50ZXJzIHNob3VsZCBhZGQKICAqCWVudHJpZXMgdG8gc2tiIGFuZCB1cGRhdGUgaWR4IHdpdGggdGhlIG51bWJlciBvZiBlbnRyaWVzLgogICoKQEAgLTExNTQsNiArMTE2NiwxMCBAQAogCiAJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0KiAoKm5kb19nZXRfc3RhdHM2NCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCSAgICAgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdG9yYWdlKTsKKwlib29sCQkJKCpuZG9faGFzX29mZmxvYWRfc3RhdHMpKGludCBhdHRyX2lkKTsKKwlpbnQJCQkoKm5kb19nZXRfb2ZmbG9hZF9zdGF0cykoaW50IGF0dHJfaWQsCisJCQkJCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCQkJIHZvaWQgKmF0dHJfZGF0YSk7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqICgqbmRvX2dldF9zdGF0cykoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKIAlpbnQJCQkoKm5kb192bGFuX3J4X2FkZF92aWQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0xMTcyLDcgKzExODgsOCBAQAogCWludAkJCSgqbmRvX3NldF92Zl9tYWMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgIGludCBxdWV1ZSwgdTggKm1hYyk7CiAJaW50CQkJKCpuZG9fc2V0X3ZmX3ZsYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkgICBpbnQgcXVldWUsIHUxNiB2bGFuLCB1OCBxb3MpOworCQkJCQkJICAgaW50IHF1ZXVlLCB1MTYgdmxhbiwKKwkJCQkJCSAgIHU4IHFvcywgX19iZTE2IHByb3RvKTsKIAlpbnQJCQkoKm5kb19zZXRfdmZfcmF0ZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCSAgIGludCB2ZiwgaW50IG1pbl90eF9yYXRlLAogCQkJCQkJICAgaW50IG1heF90eF9yYXRlKTsKQEAgLTEyNjIsNyArMTI3OSw3IEBACiAJCQkJCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCiAJCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsCi0JCQkJCQlpbnQgaWR4KTsKKwkJCQkJCWludCAqaWR4KTsKIAogCWludAkJCSgqbmRvX2JyaWRnZV9zZXRsaW5rKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJICAgICAgc3RydWN0IG5sbXNnaGRyICpubGgsCkBAIC0xNTYxLDggKzE1NzgsNiBAQAogICoKICAqCUB4cHNfbWFwczoJWFhYOiBuZWVkIGNvbW1lbnRzIG9uIHRoaXMgb25lCiAgKgotICoJQG9mZmxvYWRfZndkX21hcms6CU9mZmxvYWQgZGV2aWNlIGZ3ZGluZyBtYXJrCi0gKgogICoJQHdhdGNoZG9nX3RpbWVvOglSZXByZXNlbnRzIHRoZSB0aW1lb3V0IHRoYXQgaXMgdXNlZCBieQogICoJCQkJdGhlIHdhdGNoZG9nIChzZWUgZGV2X3dhdGNoZG9nKCkpCiAgKglAd2F0Y2hkb2dfdGltZXI6CUxpc3Qgb2YgdGltZXJzCkBAIC0xNzg0LDcgKzE3OTksNyBAQAogI2VuZGlmCiAJc3RydWN0IG5ldGRldl9xdWV1ZSBfX3JjdSAqaW5ncmVzc19xdWV1ZTsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSX0lOR1JFU1MKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5mX2hvb2tzX2luZ3Jlc3M7CisJc3RydWN0IG5mX2hvb2tfZW50cnkgX19yY3UgKm5mX2hvb2tzX2luZ3Jlc3M7CiAjZW5kaWYKIAogCXVuc2lnbmVkIGNoYXIJCWJyb2FkY2FzdFtNQVhfQUREUl9MRU5dOwpAQCAtMTgwMCw2ICsxODE1LDkgQEAKIAl1bnNpZ25lZCBpbnQJCW51bV90eF9xdWV1ZXM7CiAJdW5zaWduZWQgaW50CQlyZWFsX251bV90eF9xdWV1ZXM7CiAJc3RydWN0IFFkaXNjCQkqcWRpc2M7CisjaWZkZWYgQ09ORklHX05FVF9TQ0hFRAorCURFQ0xBUkVfSEFTSFRBQkxFCShxZGlzY19oYXNoLCA0KTsKKyNlbmRpZgogCXVuc2lnbmVkIGxvbmcJCXR4X3F1ZXVlX2xlbjsKIAlzcGlubG9ja190CQl0eF9nbG9iYWxfbG9jazsKIAlpbnQJCQl3YXRjaGRvZ190aW1lbzsKQEAgLTE4MTAsOSArMTgyOCw2IEBACiAjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCiAJc3RydWN0IHRjZl9wcm90byBfX3JjdSAgKmVncmVzc19jbF9saXN0OwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX05FVF9TV0lUQ0hERVYKLQl1MzIJCQlvZmZsb2FkX2Z3ZF9tYXJrOwotI2VuZGlmCiAKIAkvKiBUaGVzZSBtYXkgYmUgbmVlZGVkIGZvciBmdXR1cmUgbmV0d29yay1wb3dlci1kb3duIGNvZGUuICovCiAJc3RydWN0IHRpbWVyX2xpc3QJd2F0Y2hkb2dfdGltZXI7CkBAIC0zMjY3LDYgKzMyODIsNyBAQAogCW5hcGktPnNrYiA9IE5VTEw7CiB9CiAKK2Jvb2wgbmV0ZGV2X2lzX3J4X2hhbmRsZXJfYnVzeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGludCBuZXRkZXZfcnhfaGFuZGxlcl9yZWdpc3RlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgIHJ4X2hhbmRsZXJfZnVuY190ICpyeF9oYW5kbGVyLAogCQkJICAgICAgIHZvaWQgKnJ4X2hhbmRsZXJfZGF0YSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaAppbmRleCA5MjMwZjlhLi5hYmM3ZmRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKQEAgLTU1LDEyICs1NSwzNCBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpvdXQ7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCBuZXQgKm5ldDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpob29rX2xpc3Q7CisJc3RydWN0IG5mX2hvb2tfZW50cnkgX19yY3UgKmhvb2tfZW50cmllczsKIAlpbnQgKCpva2ZuKShzdHJ1Y3QgbmV0ICosIHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopOwogfTsKIAordHlwZWRlZiB1bnNpZ25lZCBpbnQgbmZfaG9va2ZuKHZvaWQgKnByaXYsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpOworc3RydWN0IG5mX2hvb2tfb3BzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisKKwkvKiBVc2VyIGZpbGxzIGluIGZyb20gaGVyZSBkb3duLiAqLworCW5mX2hvb2tmbgkJKmhvb2s7CisJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKKwl2b2lkCQkJKnByaXY7CisJdV9pbnQ4X3QJCXBmOworCXVuc2lnbmVkIGludAkJaG9va251bTsKKwkvKiBIb29rcyBhcmUgb3JkZXJlZCBpbiBhc2NlbmRpbmcgcHJpb3JpdHkuICovCisJaW50CQkJcHJpb3JpdHk7Cit9OworCitzdHJ1Y3QgbmZfaG9va19lbnRyeSB7CisJc3RydWN0IG5mX2hvb2tfZW50cnkgX19yY3UJKm5leHQ7CisJc3RydWN0IG5mX2hvb2tfb3BzCQlvcHM7CisJY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzCSpvcmlnX29wczsKK307CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZl9ob29rX3N0YXRlX2luaXQoc3RydWN0IG5mX2hvb2tfc3RhdGUgKnAsCi0JCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqaG9va19saXN0LAorCQkJCSAgICAgIHN0cnVjdCBuZl9ob29rX2VudHJ5ICpob29rX2VudHJ5LAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBob29rLAogCQkJCSAgICAgIGludCB0aHJlc2gsIHVfaW50OF90IHBmLAogCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKQEAgLTc2LDI2ICs5OCwxMSBAQAogCXAtPm91dCA9IG91dGRldjsKIAlwLT5zayA9IHNrOwogCXAtPm5ldCA9IG5ldDsKLQlwLT5ob29rX2xpc3QgPSBob29rX2xpc3Q7CisJUkNVX0lOSVRfUE9JTlRFUihwLT5ob29rX2VudHJpZXMsIGhvb2tfZW50cnkpOwogCXAtPm9rZm4gPSBva2ZuOwogfQogCi10eXBlZGVmIHVuc2lnbmVkIGludCBuZl9ob29rZm4odm9pZCAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSk7CiAKLXN0cnVjdCBuZl9ob29rX29wcyB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAJbGlzdDsKLQotCS8qIFVzZXIgZmlsbHMgaW4gZnJvbSBoZXJlIGRvd24uICovCi0JbmZfaG9va2ZuCQkqaG9vazsKLQlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwotCXZvaWQJCQkqcHJpdjsKLQl1X2ludDhfdAkJcGY7Ci0JdW5zaWduZWQgaW50CQlob29rbnVtOwotCS8qIEhvb2tzIGFyZSBvcmRlcmVkIGluIGFzY2VuZGluZyBwcmlvcml0eS4gKi8KLQlpbnQJCQlwcmlvcml0eTsKLX07CiAKIHN0cnVjdCBuZl9zb2Nrb3B0X29wcyB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpAQCAtMTMzLDYgKzE0MCw4IEBACiB2b2lkIG5mX3VucmVnaXN0ZXJfaG9vayhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZyk7CiBpbnQgbmZfcmVnaXN0ZXJfaG9va3Moc3RydWN0IG5mX2hvb2tfb3BzICpyZWcsIHVuc2lnbmVkIGludCBuKTsKIHZvaWQgbmZfdW5yZWdpc3Rlcl9ob29rcyhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZywgdW5zaWduZWQgaW50IG4pOworaW50IF9uZl9yZWdpc3Rlcl9ob29rcyhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZywgdW5zaWduZWQgaW50IG4pOwordm9pZCBfbmZfdW5yZWdpc3Rlcl9ob29rcyhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZywgdW5zaWduZWQgaW50IG4pOwogCiAvKiBGdW5jdGlvbnMgdG8gcmVnaXN0ZXIgZ2V0L3NldHNvY2tvcHQgcmFuZ2VzIChub24taW5jbHVzaXZlKS4gIFlvdQogICAgbmVlZCB0byBjaGVjayBwZXJtaXNzaW9ucyB5b3Vyc2VsZiEgKi8KQEAgLTE2MSw3ICsxNzAsOCBAQAogCQkJCSBpbnQgKCpva2ZuKShzdHJ1Y3QgbmV0ICosIHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopLAogCQkJCSBpbnQgdGhyZXNoKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhvb2tfbGlzdDsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqaG9va19oZWFkOworCWludCByZXQgPSAxOwogCiAjaWZkZWYgSEFWRV9KVU1QX0xBQkVMCiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHBmKSAmJgpAQCAtMTcwLDE2ICsxODAsMTkgQEAKIAkJcmV0dXJuIDE7CiAjZW5kaWYKIAotCWhvb2tfbGlzdCA9ICZuZXQtPm5mLmhvb2tzW3BmXVtob29rXTsKLQotCWlmICghbGlzdF9lbXB0eShob29rX2xpc3QpKSB7CisJcmN1X3JlYWRfbG9jaygpOworCWhvb2tfaGVhZCA9IHJjdV9kZXJlZmVyZW5jZShuZXQtPm5mLmhvb2tzW3BmXVtob29rXSk7CisJaWYgKGhvb2tfaGVhZCkgewogCQlzdHJ1Y3QgbmZfaG9va19zdGF0ZSBzdGF0ZTsKIAotCQluZl9ob29rX3N0YXRlX2luaXQoJnN0YXRlLCBob29rX2xpc3QsIGhvb2ssIHRocmVzaCwKKwkJbmZfaG9va19zdGF0ZV9pbml0KCZzdGF0ZSwgaG9va19oZWFkLCBob29rLCB0aHJlc2gsCiAJCQkJICAgcGYsIGluZGV2LCBvdXRkZXYsIHNrLCBuZXQsIG9rZm4pOwotCQlyZXR1cm4gbmZfaG9va19zbG93KHNrYiwgJnN0YXRlKTsKKworCQlyZXQgPSBuZl9ob29rX3Nsb3coc2tiLCAmc3RhdGUpOwogCX0KLQlyZXR1cm4gMTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG5mX2hvb2sodV9pbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3QgbmV0ICpuZXQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKaW5kZXggMjc1NTA1Ny4uMWQxZWY0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaApAQCAtNCwxMyArNCw5IEBACiAjaW5jbHVkZSA8dWFwaS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oPgogCiBzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQgewotCXVuc2lnbmVkIGludCBzZWFyY2hlZDsKIAl1bnNpZ25lZCBpbnQgZm91bmQ7Ci0JdW5zaWduZWQgaW50IG5ldzsKIAl1bnNpZ25lZCBpbnQgaW52YWxpZDsKIAl1bnNpZ25lZCBpbnQgaWdub3JlOwotCXVuc2lnbmVkIGludCBkZWxldGU7Ci0JdW5zaWduZWQgaW50IGRlbGV0ZV9saXN0OwogCXVuc2lnbmVkIGludCBpbnNlcnQ7CiAJdW5zaWduZWQgaW50IGluc2VydF9mYWlsZWQ7CiAJdW5zaWduZWQgaW50IGRyb3A7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmgKaW5kZXggZGY3OGRjMi4uZGVlMGFjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19ncmUuaApAQCAtMSw2OCArMSw4IEBACiAjaWZuZGVmIF9DT05OVFJBQ0tfUFJPVE9fR1JFX0gKICNkZWZpbmUgX0NPTk5UUkFDS19QUk9UT19HUkVfSAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLQotLyogR1JFIFBST1RPQ09MIEhFQURFUiAqLwotCi0vKiBHUkUgVmVyc2lvbiBmaWVsZCAqLwotI2RlZmluZSBHUkVfVkVSU0lPTl8xNzAxCTB4MAotI2RlZmluZSBHUkVfVkVSU0lPTl9QUFRQCTB4MQotCi0vKiBHUkUgUHJvdG9jb2wgZmllbGQgKi8KLSNkZWZpbmUgR1JFX1BST1RPQ09MX1BQVFAJMHg4ODBCCi0KLS8qIEdSRSBGbGFncyAqLwotI2RlZmluZSBHUkVfRkxBR19DCQkweDgwCi0jZGVmaW5lIEdSRV9GTEFHX1IJCTB4NDAKLSNkZWZpbmUgR1JFX0ZMQUdfSwkJMHgyMAotI2RlZmluZSBHUkVfRkxBR19TCQkweDEwCi0jZGVmaW5lIEdSRV9GTEFHX0EJCTB4ODAKLQotI2RlZmluZSBHUkVfSVNfQyhmKQkoKGYpJkdSRV9GTEFHX0MpCi0jZGVmaW5lIEdSRV9JU19SKGYpCSgoZikmR1JFX0ZMQUdfUikKLSNkZWZpbmUgR1JFX0lTX0soZikJKChmKSZHUkVfRkxBR19LKQotI2RlZmluZSBHUkVfSVNfUyhmKQkoKGYpJkdSRV9GTEFHX1MpCi0jZGVmaW5lIEdSRV9JU19BKGYpCSgoZikmR1JFX0ZMQUdfQSkKLQotLyogR1JFIGlzIGEgbWVzczogRm91ciBkaWZmZXJlbnQgc3RhbmRhcmRzICovCi1zdHJ1Y3QgZ3JlX2hkciB7Ci0jaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCi0JX191MTYJcmVjOjMsCi0JCXNycjoxLAotCQlzZXE6MSwKLQkJa2V5OjEsCi0JCXJvdXRpbmc6MSwKLQkJY3N1bToxLAotCQl2ZXJzaW9uOjMsCi0JCXJlc2VydmVkOjQsCi0JCWFjazoxOwotI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCi0JX191MTYJY3N1bToxLAotCQlyb3V0aW5nOjEsCi0JCWtleToxLAotCQlzZXE6MSwKLQkJc3JyOjEsCi0JCXJlYzozLAotCQlhY2s6MSwKLQkJcmVzZXJ2ZWQ6NCwKLQkJdmVyc2lvbjozOwotI2Vsc2UKLSNlcnJvciAiQWRqdXN0IHlvdXIgPGFzbS9ieXRlb3JkZXIuaD4gZGVmaW5lcyIKLSNlbmRpZgotCV9fYmUxNglwcm90b2NvbDsKLX07Ci0KLS8qIG1vZGlmaWVkIEdSRSBoZWFkZXIgZm9yIFBQVFAgKi8KLXN0cnVjdCBncmVfaGRyX3BwdHAgewotCV9fdTggICBmbGFnczsJCS8qIGJpdGZpZWxkICovCi0JX191OCAgIHZlcnNpb247CQkvKiBzaG91bGQgYmUgR1JFX1ZFUlNJT05fUFBUUCAqLwotCV9fYmUxNiBwcm90b2NvbDsJLyogc2hvdWxkIGJlIEdSRV9QUk9UT0NPTF9QUFRQICovCi0JX19iZTE2IHBheWxvYWRfbGVuOwkvKiBzaXplIG9mIHBwcCBwYXlsb2FkLCBub3QgaW5jLiBncmUgaGVhZGVyICovCi0JX19iZTE2IGNhbGxfaWQ7CQkvKiBwZWVyJ3MgY2FsbF9pZCBmb3IgdGhpcyBzZXNzaW9uICovCi0JX19iZTMyIHNlcTsJCS8qIHNlcXVlbmNlIG51bWJlci4gIFByZXNlbnQgaWYgUz09MSAqLwotCV9fYmUzMiBhY2s7CQkvKiBzZXEgbnVtYmVyIG9mIGhpZ2hlc3QgcGFja2V0IHJlY2VpdmVkIGJ5ICovCi0JCQkJLyogIHNlbmRlciBpbiB0aGlzIHNlc3Npb24gKi8KLX07CisjaW5jbHVkZSA8bmV0L2dyZS5oPgorI2luY2x1ZGUgPG5ldC9wcHRwLmg+CiAKIHN0cnVjdCBuZl9jdF9ncmUgewogCXVuc2lnbmVkIGludCBzdHJlYW1fdGltZW91dDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5oCmluZGV4IDgwY2E4ODkuLjY2NGRhMDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuaApAQCAtMTUsNiArMTUsNiBAQAogc3RydWN0IG5mX2FjY3QgKm5mbmxfYWNjdF9maW5kX2dldChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IGNoYXIgKmZpbHRlcl9uYW1lKTsKIHZvaWQgbmZubF9hY2N0X3B1dChzdHJ1Y3QgbmZfYWNjdCAqYWNjdCk7CiB2b2lkIG5mbmxfYWNjdF91cGRhdGUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2FjY3QgKm5mYWNjdCk7Ci1leHRlcm4gaW50IG5mbmxfYWNjdF9vdmVycXVvdGEoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgIHN0cnVjdCBuZl9hY2N0ICpuZmFjY3QpOworaW50IG5mbmxfYWNjdF9vdmVycXVvdGEoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJc3RydWN0IG5mX2FjY3QgKm5mYWNjdCk7CiAjZW5kaWYgLyogX05GTkxfQUNDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pbmdyZXNzLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pbmdyZXNzLmgKaW5kZXggNWZjZDM3NS4uMzNlMzdmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaW5ncmVzcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2luZ3Jlc3MuaApAQCAtMTEsMjIgKzExLDMwIEBACiAJaWYgKCFzdGF0aWNfa2V5X2ZhbHNlKCZuZl9ob29rc19uZWVkZWRbTkZQUk9UT19ORVRERVZdW05GX05FVERFVl9JTkdSRVNTXSkpCiAJCXJldHVybiBmYWxzZTsKICNlbmRpZgotCXJldHVybiAhbGlzdF9lbXB0eSgmc2tiLT5kZXYtPm5mX2hvb2tzX2luZ3Jlc3MpOworCXJldHVybiByY3VfYWNjZXNzX3BvaW50ZXIoc2tiLT5kZXYtPm5mX2hvb2tzX2luZ3Jlc3MpOwogfQogCisvKiBjYWxsZXIgbXVzdCBob2xkIHJjdV9yZWFkX2xvY2sgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG5mX2hvb2tfaW5ncmVzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCBuZl9ob29rX2VudHJ5ICplID0gcmN1X2RlcmVmZXJlbmNlKHNrYi0+ZGV2LT5uZl9ob29rc19pbmdyZXNzKTsKIAlzdHJ1Y3QgbmZfaG9va19zdGF0ZSBzdGF0ZTsKIAotCW5mX2hvb2tfc3RhdGVfaW5pdCgmc3RhdGUsICZza2ItPmRldi0+bmZfaG9va3NfaW5ncmVzcywKLQkJCSAgIE5GX05FVERFVl9JTkdSRVNTLCBJTlRfTUlOLCBORlBST1RPX05FVERFViwKLQkJCSAgIHNrYi0+ZGV2LCBOVUxMLCBOVUxMLCBkZXZfbmV0KHNrYi0+ZGV2KSwgTlVMTCk7CisJLyogTXVzdCByZWNoZWNrIHRoZSBpbmdyZXNzIGhvb2sgaGVhZCwgaW4gdGhlIGV2ZW50IGl0IGJlY2FtZSBOVUxMCisJICogYWZ0ZXIgdGhlIGNoZWNrIGluIG5mX2hvb2tfaW5ncmVzc19hY3RpdmUgZXZhbHVhdGVkIHRvIHRydWUuCisJICovCisJaWYgKHVubGlrZWx5KCFlKSkKKwkJcmV0dXJuIDA7CisKKwluZl9ob29rX3N0YXRlX2luaXQoJnN0YXRlLCBlLCBORl9ORVRERVZfSU5HUkVTUywgSU5UX01JTiwKKwkJCSAgIE5GUFJPVE9fTkVUREVWLCBza2ItPmRldiwgTlVMTCwgTlVMTCwKKwkJCSAgIGRldl9uZXQoc2tiLT5kZXYpLCBOVUxMKTsKIAlyZXR1cm4gbmZfaG9va19zbG93KHNrYiwgJnN0YXRlKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG5mX2hvb2tfaW5ncmVzc19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+bmZfaG9va3NfaW5ncmVzcyk7CisJUkNVX0lOSVRfUE9JTlRFUihkZXYtPm5mX2hvb2tzX2luZ3Jlc3MsIE5VTEwpOwogfQogI2Vsc2UgLyogQ09ORklHX05FVEZJTFRFUl9JTkdSRVNTICovCiBzdGF0aWMgaW5saW5lIGludCBuZl9ob29rX2luZ3Jlc3NfYWN0aXZlKHN0cnVjdCBza19idWZmICpza2IpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L252bWUuaCBiL2luY2x1ZGUvbGludXgvbnZtZS5oCmluZGV4IGQ4YjM3YmEuLjc2NzY1NTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbnZtZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbnZtZS5oCkBAIC03OTQsNyArNzk0LDcgQEAKIH07CiAKIHN0cnVjdCBudm1mX2Nvbm5lY3RfZGF0YSB7Ci0JdXVpZF9sZQkJaG9zdGlkOworCXV1aWRfYmUJCWhvc3RpZDsKIAlfX2xlMTYJCWNudGxpZDsKIAljaGFyCQlyZXN2NFsyMzhdOwogCWNoYXIJCXN1YnN5c25xbltOVk1GX05RTl9GSUVMRF9MRU5dOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZi5oIGIvaW5jbHVkZS9saW51eC9vZi5oCmluZGV4IDNkOWZmOGUuLjI5OWFlYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2YuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mLmgKQEAgLTI5MSwyMCArMjkxLDI0IEBACiBleHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAogCQkJCSAgICAgICB1MzIgaW5kZXgsIHUzMiAqb3V0X3ZhbHVlKTsKLWV4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF91OF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHU4ICpvdXRfdmFsdWVzLCBzaXplX3Qgc3opOwotZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UxNl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHUxNiAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KTsKLWV4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKLQkJCQkgICAgICB1MzIgKm91dF92YWx1ZXMsCi0JCQkJICAgICAgc2l6ZV90IHN6KTsKK2V4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91OF9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTggKm91dF92YWx1ZXMsCisJCQkJCXNpemVfdCBzel9taW4sIHNpemVfdCBzel9tYXgpOworZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3ZhcmlhYmxlX3UxNl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgdTE2ICpvdXRfdmFsdWVzLAorCQkJCQlzaXplX3Qgc3pfbWluLCBzaXplX3Qgc3pfbWF4KTsKK2V4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsCisJCQkJCXUzMiAqb3V0X3ZhbHVlcywKKwkJCQkJc2l6ZV90IHN6X21pbiwKKwkJCQkJc2l6ZV90IHN6X21heCk7CiBleHRlcm4gaW50IG9mX3Byb3BlcnR5X3JlYWRfdTY0KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCiAJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsIHU2NCAqb3V0X3ZhbHVlKTsKLWV4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF91NjRfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKLQkJCQkgICAgICB1NjQgKm91dF92YWx1ZXMsCi0JCQkJICAgICAgc2l6ZV90IHN6KTsKK2V4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91NjRfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJY29uc3QgY2hhciAqcHJvcG5hbWUsCisJCQkJCXU2NCAqb3V0X3ZhbHVlcywKKwkJCQkJc2l6ZV90IHN6X21pbiwKKwkJCQkJc2l6ZV90IHN6X21heCk7CiAKIGV4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQkgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKQEAgLTM4MCw2ICszODQsMTIyIEBACiAKICNkZWZpbmUgb2ZfbWF0Y2hfcHRyKF9wdHIpCShfcHRyKQogCisvKioKKyAqIG9mX3Byb3BlcnR5X3JlYWRfdThfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIHU4IGZyb20gYSBwcm9wZXJ0eS4KKyAqCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqIEBvdXRfdmFsdWVzOglwb2ludGVyIHRvIHJldHVybiB2YWx1ZSwgbW9kaWZpZWQgb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMC4KKyAqIEBzejoJCW51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIHJlYWQgOC1iaXQgdmFsdWUocykgZnJvbQorICogaXQuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBleGlzdCwKKyAqIC1FTk9EQVRBIGlmIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIC1FT1ZFUkZMT1cgaWYgdGhlCisgKiBwcm9wZXJ0eSBkYXRhIGlzbid0IGxhcmdlIGVub3VnaC4KKyAqCisgKiBkdHMgZW50cnkgb2YgYXJyYXkgc2hvdWxkIGJlIGxpa2U6CisgKglwcm9wZXJ0eSA9IC9iaXRzLyA4IDwweDUwIDB4NjAgMHg3MD47CisgKgorICogVGhlIG91dF92YWx1ZXMgaXMgbW9kaWZpZWQgb25seSBpZiBhIHZhbGlkIHU4IHZhbHVlIGNhbiBiZSBkZWNvZGVkLgorICovCitzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3U4X2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCSAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkJICAgIHU4ICpvdXRfdmFsdWVzLCBzaXplX3Qgc3opCit7CisJaW50IHJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdmFyaWFibGVfdThfYXJyYXkobnAsIHByb3BuYW1lLCBvdXRfdmFsdWVzLAorCQkJCQkJICAgICBzeiwgMCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogb2ZfcHJvcGVydHlfcmVhZF91MTZfYXJyYXkgLSBGaW5kIGFuZCByZWFkIGFuIGFycmF5IG9mIHUxNiBmcm9tIGEgcHJvcGVydHkuCisgKgorICogQG5wOgkJZGV2aWNlIG5vZGUgZnJvbSB3aGljaCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdG8gYmUgcmVhZC4KKyAqIEBwcm9wbmFtZToJbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2VhcmNoZWQuCisgKiBAb3V0X3ZhbHVlczoJcG9pbnRlciB0byByZXR1cm4gdmFsdWUsIG1vZGlmaWVkIG9ubHkgaWYgcmV0dXJuIHZhbHVlIGlzIDAuCisgKiBAc3o6CQludW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgdG8gcmVhZAorICoKKyAqIFNlYXJjaCBmb3IgYSBwcm9wZXJ0eSBpbiBhIGRldmljZSBub2RlIGFuZCByZWFkIDE2LWJpdCB2YWx1ZShzKSBmcm9tCisgKiBpdC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGV4aXN0LAorICogLUVOT0RBVEEgaWYgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLCBhbmQgLUVPVkVSRkxPVyBpZiB0aGUKKyAqIHByb3BlcnR5IGRhdGEgaXNuJ3QgbGFyZ2UgZW5vdWdoLgorICoKKyAqIGR0cyBlbnRyeSBvZiBhcnJheSBzaG91bGQgYmUgbGlrZToKKyAqCXByb3BlcnR5ID0gL2JpdHMvIDE2IDwweDUwMDAgMHg2MDAwIDB4NzAwMD47CisgKgorICogVGhlIG91dF92YWx1ZXMgaXMgbW9kaWZpZWQgb25seSBpZiBhIHZhbGlkIHUxNiB2YWx1ZSBjYW4gYmUgZGVjb2RlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfcmVhZF91MTZfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkJICAgICB1MTYgKm91dF92YWx1ZXMsIHNpemVfdCBzeikKK3sKKwlpbnQgcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91MTZfYXJyYXkobnAsIHByb3BuYW1lLCBvdXRfdmFsdWVzLAorCQkJCQkJICAgICAgc3osIDApOworCWlmIChyZXQgPj0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5IC0gRmluZCBhbmQgcmVhZCBhbiBhcnJheSBvZiAzMiBiaXQgaW50ZWdlcnMKKyAqIGZyb20gYSBwcm9wZXJ0eS4KKyAqCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqIEBvdXRfdmFsdWVzOglwb2ludGVyIHRvIHJldHVybiB2YWx1ZSwgbW9kaWZpZWQgb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMC4KKyAqIEBzejoJCW51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIHJlYWQgMzItYml0IHZhbHVlKHMpIGZyb20KKyAqIGl0LiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsCisgKiAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XIGlmIHRoZQorICogcHJvcGVydHkgZGF0YSBpc24ndCBsYXJnZSBlbm91Z2guCisgKgorICogVGhlIG91dF92YWx1ZXMgaXMgbW9kaWZpZWQgb25seSBpZiBhIHZhbGlkIHUzMiB2YWx1ZSBjYW4gYmUgZGVjb2RlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkJICAgICB1MzIgKm91dF92YWx1ZXMsIHNpemVfdCBzeikKK3sKKwlpbnQgcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91MzJfYXJyYXkobnAsIHByb3BuYW1lLCBvdXRfdmFsdWVzLAorCQkJCQkJICAgICAgc3osIDApOworCWlmIChyZXQgPj0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG9mX3Byb3BlcnR5X3JlYWRfdTY0X2FycmF5IC0gRmluZCBhbmQgcmVhZCBhbiBhcnJheSBvZiA2NCBiaXQgaW50ZWdlcnMKKyAqIGZyb20gYSBwcm9wZXJ0eS4KKyAqCisgKiBAbnA6CQlkZXZpY2Ugbm9kZSBmcm9tIHdoaWNoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0byBiZSByZWFkLgorICogQHByb3BuYW1lOgluYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBiZSBzZWFyY2hlZC4KKyAqIEBvdXRfdmFsdWVzOglwb2ludGVyIHRvIHJldHVybiB2YWx1ZSwgbW9kaWZpZWQgb25seSBpZiByZXR1cm4gdmFsdWUgaXMgMC4KKyAqIEBzejoJCW51bWJlciBvZiBhcnJheSBlbGVtZW50cyB0byByZWFkCisgKgorICogU2VhcmNoIGZvciBhIHByb3BlcnR5IGluIGEgZGV2aWNlIG5vZGUgYW5kIHJlYWQgNjQtYml0IHZhbHVlKHMpIGZyb20KKyAqIGl0LiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgZXhpc3QsCisgKiAtRU5PREFUQSBpZiBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsIGFuZCAtRU9WRVJGTE9XIGlmIHRoZQorICogcHJvcGVydHkgZGF0YSBpc24ndCBsYXJnZSBlbm91Z2guCisgKgorICogVGhlIG91dF92YWx1ZXMgaXMgbW9kaWZpZWQgb25seSBpZiBhIHZhbGlkIHU2NCB2YWx1ZSBjYW4gYmUgZGVjb2RlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfcmVhZF91NjRfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkJICAgICB1NjQgKm91dF92YWx1ZXMsIHNpemVfdCBzeikKK3sKKwlpbnQgcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF92YXJpYWJsZV91NjRfYXJyYXkobnAsIHByb3BuYW1lLCBvdXRfdmFsdWVzLAorCQkJCQkJICAgICAgc3osIDApOworCWlmIChyZXQgPj0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gcmV0OworfQorCiAvKgogICogc3RydWN0IHByb3BlcnR5ICpwcm9wOwogICogY29uc3QgX19iZTMyICpwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9mZHQuaCBiL2luY2x1ZGUvbGludXgvb2ZfZmR0LmgKaW5kZXggMjZjMzMwMi4uNDM0MWYzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9mZHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX2ZkdC5oCkBAIC0xNCw2ICsxNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCiAvKiBEZWZpbml0aW9ucyB1c2VkIGJ5IHRoZSBmbGF0dGVuZWQgZGV2aWNlIHRyZWUgKi8KICNkZWZpbmUgT0ZfRFRfSEVBREVSCQkweGQwMGRmZWVkCS8qIG1hcmtlciAqLwpAQCAtNjYsNiArNjcsNyBAQAogCQkJCSAgICAgaW50IGRlcHRoLCB2b2lkICpkYXRhKTsKIGV4dGVybiBpbnQgZWFybHlfaW5pdF9kdF9zY2FuX21lbW9yeSh1bnNpZ25lZCBsb25nIG5vZGUsIGNvbnN0IGNoYXIgKnVuYW1lLAogCQkJCSAgICAgaW50IGRlcHRoLCB2b2lkICpkYXRhKTsKK2V4dGVybiBpbnQgZWFybHlfaW5pdF9kdF9zY2FuX2Nob3Nlbl9zdGRvdXQodm9pZCk7CiBleHRlcm4gdm9pZCBlYXJseV9pbml0X2ZkdF9zY2FuX3Jlc2VydmVkX21lbSh2b2lkKTsKIGV4dGVybiB2b2lkIGVhcmx5X2luaXRfZmR0X3Jlc2VydmVfc2VsZih2b2lkKTsKIGV4dGVybiB2b2lkIGVhcmx5X2luaXRfZHRfYWRkX21lbW9yeV9hcmNoKHU2NCBiYXNlLCB1NjQgc2l6ZSk7CkBAIC05NCw2ICs5Niw3IEBACiBleHRlcm4gdTY0IG9mX2ZsYXRfZHRfdHJhbnNsYXRlX2FkZHJlc3ModW5zaWduZWQgbG9uZyBub2RlKTsKIGV4dGVybiB2b2lkIG9mX2ZkdF9saW1pdF9tZW1vcnkoaW50IGxpbWl0KTsKICNlbHNlIC8qIENPTkZJR19PRl9GTEFUVFJFRSAqLworc3RhdGljIGlubGluZSBpbnQgZWFybHlfaW5pdF9kdF9zY2FuX2Nob3Nlbl9zdGRvdXQodm9pZCkgeyByZXR1cm4gLUVOT0RFVjsgfQogc3RhdGljIGlubGluZSB2b2lkIGVhcmx5X2luaXRfZmR0X3NjYW5fcmVzZXJ2ZWRfbWVtKHZvaWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgZWFybHlfaW5pdF9mZHRfcmVzZXJ2ZV9zZWxmKHZvaWQpIHt9CiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKm9mX2ZsYXRfZHRfZ2V0X21hY2hpbmVfbmFtZSh2b2lkKSB7IHJldHVybiBOVUxMOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX2dwaW8uaCBiL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oCmluZGV4IDA5MjE4NmMuLjNmODdlYTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfZ3Bpby5oCkBAIC02MSw4ICs2MSw2IEBACiB9CiBleHRlcm4gdm9pZCBvZl9tbV9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IG9mX21tX2dwaW9fY2hpcCAqbW1fZ2MpOwogCi1leHRlcm4gaW50IG9mX2dwaW9jaGlwX2FkZChzdHJ1Y3QgZ3Bpb19jaGlwICpnYyk7Ci1leHRlcm4gdm9pZCBvZl9ncGlvY2hpcF9yZW1vdmUoc3RydWN0IGdwaW9fY2hpcCAqZ2MpOwogZXh0ZXJuIGludCBvZl9ncGlvX3NpbXBsZV94bGF0ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywKIAkJCQljb25zdCBzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpncGlvc3BlYywKIAkJCQl1MzIgKmZsYWdzKTsKQEAgLTg2LDkgKzg0LDYgQEAKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgb2ZfZ3Bpb2NoaXBfYWRkKHN0cnVjdCBncGlvX2NoaXAgKmdjKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgb2ZfZ3Bpb2NoaXBfcmVtb3ZlKHN0cnVjdCBncGlvX2NoaXAgKmdjKSB7IH0KLQogI2VuZGlmIC8qIENPTkZJR19PRl9HUElPICovCiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vbWFwLWRtYS5oIGIvaW5jbHVkZS9saW51eC9vbWFwLWRtYS5oCmluZGV4IDFkOTliNjEuLjI5MDA4MTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb21hcC1kbWEuaAorKysgYi9pbmNsdWRlL2xpbnV4L29tYXAtZG1hLmgKQEAgLTI5Nyw2ICsyOTcsNyBAQAogI2RlZmluZSBkbWFfb21hcDE1eHgoKQlfX2RtYV9vbWFwMTV4eChkKQogI2RlZmluZSBkbWFfb21hcDE2eHgoKQlfX2RtYV9vbWFwMTZ4eChkKQogCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9PTUFQKQogZXh0ZXJuIHN0cnVjdCBvbWFwX3N5c3RlbV9kbWFfcGxhdF9pbmZvICpvbWFwX2dldF9wbGF0X2luZm8odm9pZCk7CiAKIGV4dGVybiB2b2lkIG9tYXBfc2V0X2RtYV9wcmlvcml0eShpbnQgbGNoLCBpbnQgZHN0X3BvcnQsIGludCBwcmlvcml0eSk7CkBAIC0zNTUsNCArMzU2LDIyIEBACiB9CiAjZW5kaWYKIAorI2Vsc2UgLyogQ09ORklHX0FSQ0hfT01BUCAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBvbWFwX3N5c3RlbV9kbWFfcGxhdF9pbmZvICpvbWFwX2dldF9wbGF0X2luZm8odm9pZCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgb21hcF9yZXF1ZXN0X2RtYShpbnQgZGV2X2lkLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCXZvaWQgKCpjYWxsYmFjaykoaW50IGxjaCwgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSksCisJCQl2b2lkICpkYXRhLCBpbnQgKmRtYV9jaCkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG9tYXBfZnJlZV9kbWEoaW50IGNoKSB7IH0KKworI2VuZGlmIC8qIENPTkZJR19BUkNIX09NQVAgKi8KKwogI2VuZGlmIC8qIF9fTElOVVhfT01BUF9ETUFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWRhdGEuaCBiL2luY2x1ZGUvbGludXgvcGFkYXRhLmgKaW5kZXggMTEzZWU2Mi4uMGY5ZTU2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYWRhdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZGF0YS5oCkBAIC0xNTEsNyArMTUxLDcgQEAKICAqIEBmbGFnczogcGFkYXRhIGZsYWdzLgogICovCiBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlIHsKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJCSBjcHVfbm90aWZpZXI7CisJc3RydWN0IGhsaXN0X25vZGUJCSBub2RlOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CQkqd3E7CiAJc3RydWN0IHBhcmFsbGVsX2RhdGEJCSpwZDsKIAlzdHJ1Y3QgcGFkYXRhX2NwdW1hc2sJCWNwdW1hc2s7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaCBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCmluZGV4IDY2YTEyNjAuLjAxZTg0NDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZW1hcC5oCkBAIC01NzEsNTYgKzU3MSw1NyBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBmYXVsdF9pbl9tdWx0aXBhZ2VzX3dyaXRlYWJsZShjaGFyIF9fdXNlciAqdWFkZHIsIGludCBzaXplKQogewotCWludCByZXQgPSAwOwogCWNoYXIgX191c2VyICplbmQgPSB1YWRkciArIHNpemUgLSAxOwogCiAJaWYgKHVubGlrZWx5KHNpemUgPT0gMCkpCi0JCXJldHVybiByZXQ7CisJCXJldHVybiAwOwogCisJaWYgKHVubGlrZWx5KHVhZGRyID4gZW5kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJLyoKIAkgKiBXcml0aW5nIHplcm9lcyBpbnRvIHVzZXJzcGFjZSBoZXJlIGlzIE9LLCBiZWNhdXNlIHdlIGtub3cgdGhhdCBpZgogCSAqIHRoZSB6ZXJvIGdldHMgdGhlcmUsIHdlJ2xsIGJlIG92ZXJ3cml0aW5nIGl0LgogCSAqLwotCXdoaWxlICh1YWRkciA8PSBlbmQpIHsKLQkJcmV0ID0gX19wdXRfdXNlcigwLCB1YWRkcik7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCXJldHVybiByZXQ7CisJZG8geworCQlpZiAodW5saWtlbHkoX19wdXRfdXNlcigwLCB1YWRkcikgIT0gMCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAkJdWFkZHIgKz0gUEFHRV9TSVpFOwotCX0KKwl9IHdoaWxlICh1YWRkciA8PSBlbmQpOwogCiAJLyogQ2hlY2sgd2hldGhlciB0aGUgcmFuZ2Ugc3BpbGxlZCBpbnRvIHRoZSBuZXh0IHBhZ2UuICovCiAJaWYgKCgodW5zaWduZWQgbG9uZyl1YWRkciAmIFBBR0VfTUFTSykgPT0KIAkJCSgodW5zaWduZWQgbG9uZyllbmQgJiBQQUdFX01BU0spKQotCQlyZXQgPSBfX3B1dF91c2VyKDAsIGVuZCk7CisJCXJldHVybiBfX3B1dF91c2VyKDAsIGVuZCk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBmYXVsdF9pbl9tdWx0aXBhZ2VzX3JlYWRhYmxlKGNvbnN0IGNoYXIgX191c2VyICp1YWRkciwKIAkJCQkJICAgICAgIGludCBzaXplKQogewogCXZvbGF0aWxlIGNoYXIgYzsKLQlpbnQgcmV0ID0gMDsKIAljb25zdCBjaGFyIF9fdXNlciAqZW5kID0gdWFkZHIgKyBzaXplIC0gMTsKIAogCWlmICh1bmxpa2VseShzaXplID09IDApKQotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gMDsKIAotCXdoaWxlICh1YWRkciA8PSBlbmQpIHsKLQkJcmV0ID0gX19nZXRfdXNlcihjLCB1YWRkcik7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCXJldHVybiByZXQ7CisJaWYgKHVubGlrZWx5KHVhZGRyID4gZW5kKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkbyB7CisJCWlmICh1bmxpa2VseShfX2dldF91c2VyKGMsIHVhZGRyKSAhPSAwKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCQl1YWRkciArPSBQQUdFX1NJWkU7Ci0JfQorCX0gd2hpbGUgKHVhZGRyIDw9IGVuZCk7CiAKIAkvKiBDaGVjayB3aGV0aGVyIHRoZSByYW5nZSBzcGlsbGVkIGludG8gdGhlIG5leHQgcGFnZS4gKi8KIAlpZiAoKCh1bnNpZ25lZCBsb25nKXVhZGRyICYgUEFHRV9NQVNLKSA9PQogCQkJKCh1bnNpZ25lZCBsb25nKWVuZCAmIFBBR0VfTUFTSykpIHsKLQkJcmV0ID0gX19nZXRfdXNlcihjLCBlbmQpOwotCQkodm9pZCljOworCQlyZXR1cm4gX19nZXRfdXNlcihjLCBlbmQpOwogCX0KIAotCXJldHVybiByZXQ7CisJKHZvaWQpYzsKKwlyZXR1cm4gMDsKIH0KIAogaW50IGFkZF90b19wYWdlX2NhY2hlX2xvY2tlZChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaS5oIGIvaW5jbHVkZS9saW51eC9wY2kuaAppbmRleCBmYmMxZmE2Li4wZTQ5ZjcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpLmgKQEAgLTE4Nyw4ICsxODcsOSBAQAogCiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IF9fYml0d2lzZSBwY2lfYnVzX2ZsYWdzX3Q7CiBlbnVtIHBjaV9idXNfZmxhZ3MgewotCVBDSV9CVVNfRkxBR1NfTk9fTVNJICAgPSAoX19mb3JjZSBwY2lfYnVzX2ZsYWdzX3QpIDEsCi0JUENJX0JVU19GTEFHU19OT19NTVJCQyA9IChfX2ZvcmNlIHBjaV9idXNfZmxhZ3NfdCkgMiwKKwlQQ0lfQlVTX0ZMQUdTX05PX01TSQk9IChfX2ZvcmNlIHBjaV9idXNfZmxhZ3NfdCkgMSwKKwlQQ0lfQlVTX0ZMQUdTX05PX01NUkJDCT0gKF9fZm9yY2UgcGNpX2J1c19mbGFnc190KSAyLAorCVBDSV9CVVNfRkxBR1NfTk9fQUVSU0lECT0gKF9fZm9yY2UgcGNpX2J1c19mbGFnc190KSA0LAogfTsKIAogLyogVGhlc2UgdmFsdWVzIGNvbWUgZnJvbSB0aGUgUENJIEV4cHJlc3MgU3BlYyAqLwpAQCAtMjY4LDYgKzI2OSw5IEBACiAJdW5zaWduZWQgaW50CWNsYXNzOwkJLyogMyBieXRlczogKGJhc2Usc3ViLHByb2ctaWYpICovCiAJdTgJCXJldmlzaW9uOwkvKiBQQ0kgcmV2aXNpb24sIGxvdyBieXRlIG9mIGNsYXNzIHdvcmQgKi8KIAl1OAkJaGRyX3R5cGU7CS8qIFBDSSBoZWFkZXIgdHlwZSAoYG11bHRpJyBmbGFnIG1hc2tlZCBvdXQpICovCisjaWZkZWYgQ09ORklHX1BDSUVBRVIKKwl1MTYJCWFlcl9jYXA7CS8qIEFFUiBjYXBhYmlsaXR5IG9mZnNldCAqLworI2VuZGlmCiAJdTgJCXBjaWVfY2FwOwkvKiBQQ0llIGNhcGFiaWxpdHkgb2Zmc2V0ICovCiAJdTgJCW1zaV9jYXA7CS8qIE1TSSBjYXBhYmlsaXR5IG9mZnNldCAqLwogCXU4CQltc2l4X2NhcDsJLyogTVNJLVggY2FwYWJpbGl0eSBvZmZzZXQgKi8KQEAgLTMwOCw2ICszMTIsOSBAQAogCQkJCQkJICAgcG93ZXJlZCBvbi9vZmYgYnkgdGhlCiAJCQkJCQkgICBjb3JyZXNwb25kaW5nIGJyaWRnZSAqLwogCXVuc2lnbmVkIGludAlpZ25vcmVfaG90cGx1ZzoxOwkvKiBJZ25vcmUgaG90cGx1ZyBldmVudHMgKi8KKwl1bnNpZ25lZCBpbnQJaG90cGx1Z191c2VyX2luZGljYXRvcnM6MTsgLyogU2xvdEN0bCBpbmRpY2F0b3JzCisJCQkJCQkgICAgICBjb250cm9sbGVkIGV4Y2x1c2l2ZWx5IGJ5CisJCQkJCQkgICAgICB1c2VyIHN5c2ZzICovCiAJdW5zaWduZWQgaW50CWQzX2RlbGF5OwkvKiBEMy0+RDAgdHJhbnNpdGlvbiB0aW1lIGluIG1zICovCiAJdW5zaWduZWQgaW50CWQzY29sZF9kZWxheTsJLyogRDNjb2xkLT5EMCB0cmFuc2l0aW9uIHRpbWUgaW4gbXMgKi8KIApAQCAtMzY3LDYgKzM3NCwxMiBAQAogCWludCByb21fYXR0cl9lbmFibGVkOwkJLyogaGFzIGRpc3BsYXkgb2YgdGhlIHJvbSBhdHRyaWJ1dGUgYmVlbiBlbmFibGVkPyAqLwogCXN0cnVjdCBiaW5fYXR0cmlidXRlICpyZXNfYXR0cltERVZJQ0VfQ09VTlRfUkVTT1VSQ0VdOyAvKiBzeXNmcyBmaWxlIGZvciByZXNvdXJjZXMgKi8KIAlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqcmVzX2F0dHJfd2NbREVWSUNFX0NPVU5UX1JFU09VUkNFXTsgLyogc3lzZnMgZmlsZSBmb3IgV0MgbWFwcGluZyBvZiByZXNvdXJjZXMgKi8KKworI2lmZGVmIENPTkZJR19QQ0lFX1BUTQorCXVuc2lnbmVkIGludAlwdG1fcm9vdDoxOworCXVuc2lnbmVkIGludAlwdG1fZW5hYmxlZDoxOworCXU4CQlwdG1fZ3JhbnVsYXJpdHk7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfUENJX01TSQogCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKiptc2lfaXJxX2dyb3VwczsKICNlbmRpZgpAQCAtNjgzLDE1ICs2OTYsNiBAQAogI2RlZmluZQl0b19wY2lfZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydiwgc3RydWN0IHBjaV9kcml2ZXIsIGRyaXZlcikKIAogLyoqCi0gKiBERUZJTkVfUENJX0RFVklDRV9UQUJMRSAtIG1hY3JvIHVzZWQgdG8gZGVzY3JpYmUgYSBwY2kgZGV2aWNlIHRhYmxlCi0gKiBAX3RhYmxlOiBkZXZpY2UgdGFibGUgbmFtZQotICoKLSAqIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIG5ldyBjb2RlLgotICovCi0jZGVmaW5lIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKF90YWJsZSkgXAotCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIF90YWJsZVtdCi0KLS8qKgogICogUENJX0RFVklDRSAtIG1hY3JvIHVzZWQgdG8gZGVzY3JpYmUgYSBzcGVjaWZpYyBwY2kgZGV2aWNlCiAgKiBAdmVuZDogdGhlIDE2IGJpdCBQQ0kgVmVuZG9yIElECiAgKiBAZGV2OiB0aGUgMTYgYml0IFBDSSBEZXZpY2UgSUQKQEAgLTExMzUsNiArMTEzOSw3IEBACiBpbnQgcGNpX2VuYWJsZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKiwgaW50IG1hc2spOwogdm9pZCBwY2lfZml4dXBfaXJxcyh1OCAoKikoc3RydWN0IHBjaV9kZXYgKiwgdTggKiksCiAJCSAgICBpbnQgKCopKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpOworc3RydWN0IHJlc291cmNlICpwY2lfZmluZF9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CiAjZGVmaW5lIEhBVkVfUENJX1JFUV9SRUdJT05TCTIKIGludCBfX211c3RfY2hlY2sgcGNpX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOwogaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb25zX2V4Y2x1c2l2ZShzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOwpAQCAtMTMwOSw2ICsxMzE0LDcgQEAKIAkJdW5zaWduZWQgaW50IG1heF92ZWNzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOwogdm9pZCBwY2lfZnJlZV9pcnFfdmVjdG9ycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGludCBwY2lfaXJxX3ZlY3RvcihzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgbnIpOworY29uc3Qgc3RydWN0IGNwdW1hc2sgKnBjaV9pcnFfZ2V0X2FmZmluaXR5KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgdmVjKTsKIAogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IHBjaV9tc2lfdmVjX2NvdW50KHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgcmV0dXJuIC1FTk9TWVM7IH0KQEAgLTEzNTEsNiArMTM1NywxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gZGV2LT5pcnE7CiB9CitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpwY2lfaXJxX2dldF9hZmZpbml0eShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJaW50IHZlYykKK3sKKwlyZXR1cm4gY3B1X3Bvc3NpYmxlX21hc2s7Cit9CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QQ0lFUE9SVEJVUwpAQCAtMTM3MCw5ICsxMzgxLDExIEBACiAjaWZkZWYgQ09ORklHX1BDSUVBRVIKIHZvaWQgcGNpX25vX2Flcih2b2lkKTsKIGJvb2wgcGNpX2Flcl9hdmFpbGFibGUodm9pZCk7CitpbnQgcGNpX2Flcl9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfbm9fYWVyKHZvaWQpIHsgfQogc3RhdGljIGlubGluZSBib29sIHBjaV9hZXJfYXZhaWxhYmxlKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9CitzdGF0aWMgaW5saW5lIGludCBwY2lfYWVyX2luaXQoc3RydWN0IHBjaV9kZXYgKmQpIHsgcmV0dXJuIC1FTk9ERVY7IH0KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSUVfRUNSQwpAQCAtMTQwNCw2ICsxNDE3LDEzIEBACiBzdGF0aWMgaW5saW5lIGludCBwY2lfYXRzX3F1ZXVlX2RlcHRoKHN0cnVjdCBwY2lfZGV2ICpkKSB7IHJldHVybiAtRU5PREVWOyB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19QQ0lFX1BUTQoraW50IHBjaV9lbmFibGVfcHRtKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpncmFudWxhcml0eSk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgcGNpX2VuYWJsZV9wdG0oc3RydWN0IHBjaV9kZXYgKmRldiwgdTggKmdyYW51bGFyaXR5KQoreyByZXR1cm4gLUVJTlZBTDsgfQorI2VuZGlmCisKIHZvaWQgcGNpX2NmZ19hY2Nlc3NfbG9jayhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGJvb2wgcGNpX2NmZ19hY2Nlc3NfdHJ5bG9jayhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHZvaWQgcGNpX2NmZ19hY2Nlc3NfdW5sb2NrKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwpAQCAtMTU1MSw2ICsxNTcxLDkgQEAKIAkJCQkgIGludCBlbmFibGUpCiB7IHJldHVybiAwOyB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlc291cmNlICpwY2lfZmluZF9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkJIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreyByZXR1cm4gTlVMTDsgfQogc3RhdGljIGlubGluZSBpbnQgcGNpX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBjaGFyICpyZXNfbmFtZSkKIHsgcmV0dXJuIC1FSU87IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfcmVsZWFzZV9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICpkZXYpIHsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJjcHUtcndzZW0uaCBiL2luY2x1ZGUvbGludXgvcGVyY3B1LXJ3c2VtLmgKaW5kZXggYzJmYTNlYy4uNWIyZTYxNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJjcHUtcndzZW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmNwdS1yd3NlbS5oCkBAIC0xMCwzMiArMTAsMTIyIEBACiAKIHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlIHsKIAlzdHJ1Y3QgcmN1X3N5bmMJCXJzczsKLQl1bnNpZ25lZCBpbnQgX19wZXJjcHUJKmZhc3RfcmVhZF9jdHI7CisJdW5zaWduZWQgaW50IF9fcGVyY3B1CSpyZWFkX2NvdW50OwogCXN0cnVjdCByd19zZW1hcGhvcmUJcndfc2VtOwotCWF0b21pY190CQlzbG93X3JlYWRfY3RyOwotCXdhaXRfcXVldWVfaGVhZF90CXdyaXRlX3dhaXRxOworCXdhaXRfcXVldWVfaGVhZF90CXdyaXRlcjsKKwlpbnQJCQlyZWFkZXJzX2Jsb2NrOwogfTsKIAotZXh0ZXJuIHZvaWQgcGVyY3B1X2Rvd25fcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqKTsKLWV4dGVybiBpbnQgIHBlcmNwdV9kb3duX3JlYWRfdHJ5bG9jayhzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqKTsKLWV4dGVybiB2b2lkIHBlcmNwdV91cF9yZWFkKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICopOworI2RlZmluZSBERUZJTkVfU1RBVElDX1BFUkNQVV9SV1NFTShuYW1lKQkJCQlcCitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCBfX3BlcmNwdV9yd3NlbV9yY18jI25hbWUpOwkJXAorc3RhdGljIHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlIG5hbWUgPSB7CQkJCVwKKwkucnNzID0gX19SQ1VfU1lOQ19JTklUSUFMSVpFUihuYW1lLnJzcywgUkNVX1NDSEVEX1NZTkMpLAlcCisJLnJlYWRfY291bnQgPSAmX19wZXJjcHVfcndzZW1fcmNfIyNuYW1lLAkJCVwKKwkucndfc2VtID0gX19SV1NFTV9JTklUSUFMSVpFUihuYW1lLnJ3X3NlbSksCQkJXAorCS53cml0ZXIgPSBfX1dBSVRfUVVFVUVfSEVBRF9JTklUSUFMSVpFUihuYW1lLndyaXRlciksCQlcCit9CisKK2V4dGVybiBpbnQgX19wZXJjcHVfZG93bl9yZWFkKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICosIGludCk7CitleHRlcm4gdm9pZCBfX3BlcmNwdV91cF9yZWFkKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICopOworCitzdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X2Rvd25fcmVhZF9wcmVlbXB0X2Rpc2FibGUoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKnNlbSkKK3sKKwltaWdodF9zbGVlcCgpOworCisJcndzZW1fYWNxdWlyZV9yZWFkKCZzZW0tPnJ3X3NlbS5kZXBfbWFwLCAwLCAwLCBfUkVUX0lQXyk7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwkvKgorCSAqIFdlIGFyZSBpbiBhbiBSQ1Utc2NoZWQgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24sIHNvIHRoZSB3cml0ZXIKKwkgKiBjYW5ub3QgYm90aCBjaGFuZ2Ugc2VtLT5zdGF0ZSBmcm9tIHJlYWRlcnNfZmFzdCBhbmQgc3RhcnQgY2hlY2tpbmcKKwkgKiBjb3VudGVycyB3aGlsZSB3ZSBhcmUgaGVyZS4gU28gaWYgd2Ugc2VlICFzZW0tPnN0YXRlLCB3ZSBrbm93IHRoYXQKKwkgKiB0aGUgd3JpdGVyIHdvbid0IGJlIGNoZWNraW5nIHVudGlsIHdlJ3JlIHBhc3QgdGhlIHByZWVtcHRfZW5hYmxlKCkKKwkgKiBhbmQgdGhhdCBvbmUgdGhlIHN5bmNocm9uaXplX3NjaGVkKCkgaXMgZG9uZSwgdGhlIHdyaXRlciB3aWxsIHNlZQorCSAqIGFueXRoaW5nIHdlIGRpZCB3aXRoaW4gdGhpcyBSQ1Utc2NoZWQgcmVhZC1zaXplIGNyaXRpY2FsIHNlY3Rpb24uCisJICovCisJX190aGlzX2NwdV9pbmMoKnNlbS0+cmVhZF9jb3VudCk7CisJaWYgKHVubGlrZWx5KCFyY3Vfc3luY19pc19pZGxlKCZzZW0tPnJzcykpKQorCQlfX3BlcmNwdV9kb3duX3JlYWQoc2VtLCBmYWxzZSk7IC8qIFVuY29uZGl0aW9uYWwgbWVtb3J5IGJhcnJpZXIgKi8KKwliYXJyaWVyKCk7CisJLyoKKwkgKiBUaGUgYmFycmllcigpIHByZXZlbnRzIHRoZSBjb21waWxlciBmcm9tCisJICogYmxlZWRpbmcgdGhlIGNyaXRpY2FsIHNlY3Rpb24gb3V0LgorCSAqLworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X2Rvd25fcmVhZChzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtKQoreworCXBlcmNwdV9kb3duX3JlYWRfcHJlZW1wdF9kaXNhYmxlKHNlbSk7CisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGVyY3B1X2Rvd25fcmVhZF90cnlsb2NrKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpzZW0pCit7CisJaW50IHJldCA9IDE7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwkvKgorCSAqIFNhbWUgYXMgaW4gcGVyY3B1X2Rvd25fcmVhZCgpLgorCSAqLworCV9fdGhpc19jcHVfaW5jKCpzZW0tPnJlYWRfY291bnQpOworCWlmICh1bmxpa2VseSghcmN1X3N5bmNfaXNfaWRsZSgmc2VtLT5yc3MpKSkKKwkJcmV0ID0gX19wZXJjcHVfZG93bl9yZWFkKHNlbSwgdHJ1ZSk7IC8qIFVuY29uZGl0aW9uYWwgbWVtb3J5IGJhcnJpZXIgKi8KKwlwcmVlbXB0X2VuYWJsZSgpOworCS8qCisJICogVGhlIGJhcnJpZXIoKSBmcm9tIHByZWVtcHRfZW5hYmxlKCkgcHJldmVudHMgdGhlIGNvbXBpbGVyIGZyb20KKwkgKiBibGVlZGluZyB0aGUgY3JpdGljYWwgc2VjdGlvbiBvdXQuCisJICovCisKKwlpZiAocmV0KQorCQlyd3NlbV9hY3F1aXJlX3JlYWQoJnNlbS0+cndfc2VtLmRlcF9tYXAsIDAsIDEsIF9SRVRfSVBfKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfdXBfcmVhZF9wcmVlbXB0X2VuYWJsZShzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqc2VtKQoreworCS8qCisJICogVGhlIGJhcnJpZXIoKSBwcmV2ZW50cyB0aGUgY29tcGlsZXIgZnJvbQorCSAqIGJsZWVkaW5nIHRoZSBjcml0aWNhbCBzZWN0aW9uIG91dC4KKwkgKi8KKwliYXJyaWVyKCk7CisJLyoKKwkgKiBTYW1lIGFzIGluIHBlcmNwdV9kb3duX3JlYWQoKS4KKwkgKi8KKwlpZiAobGlrZWx5KHJjdV9zeW5jX2lzX2lkbGUoJnNlbS0+cnNzKSkpCisJCV9fdGhpc19jcHVfZGVjKCpzZW0tPnJlYWRfY291bnQpOworCWVsc2UKKwkJX19wZXJjcHVfdXBfcmVhZChzZW0pOyAvKiBVbmNvbmRpdGlvbmFsIG1lbW9yeSBiYXJyaWVyICovCisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJ3c2VtX3JlbGVhc2UoJnNlbS0+cndfc2VtLmRlcF9tYXAsIDEsIF9SRVRfSVBfKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV91cF9yZWFkKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpzZW0pCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJcGVyY3B1X3VwX3JlYWRfcHJlZW1wdF9lbmFibGUoc2VtKTsKK30KIAogZXh0ZXJuIHZvaWQgcGVyY3B1X2Rvd25fd3JpdGUoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKik7CiBleHRlcm4gdm9pZCBwZXJjcHVfdXBfd3JpdGUoc3RydWN0IHBlcmNwdV9yd19zZW1hcGhvcmUgKik7CiAKIGV4dGVybiBpbnQgX19wZXJjcHVfaW5pdF9yd3NlbShzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqLAogCQkJCWNvbnN0IGNoYXIgKiwgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICopOworCiBleHRlcm4gdm9pZCBwZXJjcHVfZnJlZV9yd3NlbShzdHJ1Y3QgcGVyY3B1X3J3X3NlbWFwaG9yZSAqKTsKIAotI2RlZmluZSBwZXJjcHVfaW5pdF9yd3NlbShicncpCVwKKyNkZWZpbmUgcGVyY3B1X2luaXRfcndzZW0oc2VtKQkJCQkJXAogKHsJCQkJCQkJCVwKIAlzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHJ3c2VtX2tleTsJCQlcCi0JX19wZXJjcHVfaW5pdF9yd3NlbShicncsICNicncsICZyd3NlbV9rZXkpOwkJXAorCV9fcGVyY3B1X2luaXRfcndzZW0oc2VtLCAjc2VtLCAmcndzZW1fa2V5KTsJCVwKIH0pCiAKLQogI2RlZmluZSBwZXJjcHVfcndzZW1faXNfaGVsZChzZW0pIGxvY2tkZXBfaXNfaGVsZCgmKHNlbSktPnJ3X3NlbSkKIAorI2RlZmluZSBwZXJjcHVfcndzZW1fYXNzZXJ0X2hlbGQoc2VtKQkJCQlcCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmKHNlbSktPnJ3X3NlbSkKKwogc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV9yd3NlbV9yZWxlYXNlKHN0cnVjdCBwZXJjcHVfcndfc2VtYXBob3JlICpzZW0sCiAJCQkJCWJvb2wgcmVhZCwgdW5zaWduZWQgbG9uZyBpcCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyZi9hcm1fcG11LmggYi9pbmNsdWRlL2xpbnV4L3BlcmYvYXJtX3BtdS5oCmluZGV4IGUxODg0MzguLjg0NjJkYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGVyZi9hcm1fcG11LmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJmL2FybV9wbXUuaApAQCAtMTQsNyArMTQsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgotCisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxhc20vY3B1dHlwZS5oPgogCiAvKgpAQCAtNzcsNiArNzcsMTMgQEAKIAlzdHJ1Y3QgYXJtX3BtdQkJKnBlcmNwdV9wbXU7CiB9OwogCitlbnVtIGFybXBtdV9hdHRyX2dyb3VwcyB7CisJQVJNUE1VX0FUVFJfR1JPVVBfQ09NTU9OLAorCUFSTVBNVV9BVFRSX0dST1VQX0VWRU5UUywKKwlBUk1QTVVfQVRUUl9HUk9VUF9GT1JNQVRTLAorCUFSTVBNVV9OUl9BVFRSX0dST1VQUworfTsKKwogc3RydWN0IGFybV9wbXUgewogCXN0cnVjdCBwbXUJcG11OwogCWNwdW1hc2tfdAlhY3RpdmVfaXJxczsKQEAgLTEwOSw4ICsxMTYsMTAgQEAKIAlERUNMQVJFX0JJVE1BUChwbWNlaWRfYml0bWFwLCBBUk1WOF9QTVVWM19NQVhfQ09NTU9OX0VWRU5UUyk7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGxhdF9kZXZpY2U7CiAJc3RydWN0IHBtdV9od19ldmVudHMJX19wZXJjcHUgKmh3X2V2ZW50czsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWVudHJ5OworCXN0cnVjdCBobGlzdF9ub2RlCW5vZGU7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrCWNwdV9wbV9uYjsKKwkvKiB0aGUgYXR0cl9ncm91cHMgYXJyYXkgbXVzdCBiZSBOVUxMLXRlcm1pbmF0ZWQgKi8KKwljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICphdHRyX2dyb3Vwc1tBUk1QTVVfTlJfQVRUUl9HUk9VUFMgKyAxXTsKIH07CiAKICNkZWZpbmUgdG9fYXJtX3BtdShwKSAoY29udGFpbmVyX29mKHAsIHN0cnVjdCBhcm1fcG11LCBwbXUpKQpAQCAtMTUxLDYgKzE2MCw4IEBACiAJCQkgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfdGFibGUsCiAJCQkgY29uc3Qgc3RydWN0IHBtdV9wcm9iZV9pbmZvICpwcm9iZV90YWJsZSk7CiAKKyNkZWZpbmUgQVJNVjhfUE1VX1BERVZfTkFNRSAiYXJtdjgtcG11IgorCiAjZW5kaWYgLyogQ09ORklHX0FSTV9QTVUgKi8KIAogI2VuZGlmIC8qIF9fQVJNX1BNVV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyZl9ldmVudC5oIGIvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKaW5kZXggMmI2YjQzYy4uMDYwZDBlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmgKQEAgLTUxMCw5ICs1MTAsMTUgQEAKIAkJCQkJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKiwKIAkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCi1lbnVtIHBlcmZfZ3JvdXBfZmxhZyB7Ci0JUEVSRl9HUk9VUF9TT0ZUV0FSRQkJPSAweDEsCi19OworLyoKKyAqIEV2ZW50IGNhcGFiaWxpdGllcy4gRm9yIGV2ZW50X2NhcHMgYW5kIGdyb3VwcyBjYXBzLgorICoKKyAqIFBFUkZfRVZfQ0FQX1NPRlRXQVJFOiBJcyBhIHNvZnR3YXJlIGV2ZW50LgorICogUEVSRl9FVl9DQVBfUkVBRF9BQ1RJVkVfUEtHOiBBIENQVSBldmVudCAob3IgY2dyb3VwIGV2ZW50KSB0aGF0IGNhbiBiZSByZWFkCisgKiBmcm9tIGFueSBDUFUgaW4gdGhlIHBhY2thZ2Ugd2hlcmUgaXQgaXMgYWN0aXZlLgorICovCisjZGVmaW5lIFBFUkZfRVZfQ0FQX1NPRlRXQVJFCQlCSVQoMCkKKyNkZWZpbmUgUEVSRl9FVl9DQVBfUkVBRF9BQ1RJVkVfUEtHCUJJVCgxKQogCiAjZGVmaW5lIFNXRVZFTlRfSExJU1RfQklUUwkJOAogI2RlZmluZSBTV0VWRU5UX0hMSVNUX1NJWkUJCSgxIDw8IFNXRVZFTlRfSExJU1RfQklUUykKQEAgLTU2OCw3ICs1NzQsMTIgQEAKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQkJaGxpc3RfZW50cnk7CiAJc3RydWN0IGxpc3RfaGVhZAkJYWN0aXZlX2VudHJ5OwogCWludAkJCQlucl9zaWJsaW5nczsKLQlpbnQJCQkJZ3JvdXBfZmxhZ3M7CisKKwkvKiBOb3Qgc2VyaWFsaXplZC4gT25seSB3cml0dGVuIGR1cmluZyBldmVudCBpbml0aWFsaXphdGlvbi4gKi8KKwlpbnQJCQkJZXZlbnRfY2FwczsKKwkvKiBUaGUgY3VtdWxhdGl2ZSBBTkQgb2YgYWxsIGV2ZW50X2NhcHMgZm9yIGV2ZW50cyBpbiB0aGlzIGdyb3VwLiAqLworCWludAkJCQlncm91cF9jYXBzOworCiAJc3RydWN0IHBlcmZfZXZlbnQJCSpncm91cF9sZWFkZXI7CiAJc3RydWN0IHBtdQkJCSpwbXU7CiAJdm9pZAkJCQkqcG11X3ByaXZhdGU7CkBAIC02NzksNiArNjkwLDEwIEBACiAJdTY0CQkJCSgqY2xvY2spKHZvaWQpOwogCXBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90CQlvdmVyZmxvd19oYW5kbGVyOwogCXZvaWQJCQkJKm92ZXJmbG93X2hhbmRsZXJfY29udGV4dDsKKyNpZmRlZiBDT05GSUdfQlBGX1NZU0NBTEwKKwlwZXJmX292ZXJmbG93X2hhbmRsZXJfdAkJb3JpZ19vdmVyZmxvd19oYW5kbGVyOworCXN0cnVjdCBicGZfcHJvZwkJCSpwcm9nOworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRVZFTlRfVFJBQ0lORwogCXN0cnVjdCB0cmFjZV9ldmVudF9jYWxsCQkqdHBfZXZlbnQ7CkBAIC03NzQsNiArNzg5LDkgQEAKICNpZmRlZiBDT05GSUdfQ0dST1VQX1BFUkYKIAlzdHJ1Y3QgcGVyZl9jZ3JvdXAJCSpjZ3JwOwogI2VuZGlmCisKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlzY2hlZF9jYl9lbnRyeTsKKwlpbnQJCQkJc2NoZWRfY2JfdXNhZ2U7CiB9OwogCiBzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlIHsKQEAgLTc4OCw2ICs4MDYsMTEgQEAKIAlpbnQJCQkJcGFnZTsKIH07CiAKK3N0cnVjdCBicGZfcGVyZl9ldmVudF9kYXRhX2tlcm4geworCXN0cnVjdCBwdF9yZWdzICpyZWdzOworCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhOworfTsKKwogI2lmZGVmIENPTkZJR19DR1JPVVBfUEVSRgogCiAvKgpAQCAtOTg1LDcgKzEwMDgsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBpc19zb2Z0d2FyZV9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7Ci0JcmV0dXJuIGV2ZW50LT5wbXUtPnRhc2tfY3R4X25yID09IHBlcmZfc3dfY29udGV4dDsKKwlyZXR1cm4gZXZlbnQtPmV2ZW50X2NhcHMgJiBQRVJGX0VWX0NBUF9TT0ZUV0FSRTsKIH0KIAogZXh0ZXJuIHN0cnVjdCBzdGF0aWNfa2V5IHBlcmZfc3dldmVudF9lbmFibGVkW1BFUkZfQ09VTlRfU1dfTUFYXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGh5LmggYi9pbmNsdWRlL2xpbnV4L3BoeS5oCmluZGV4IDJkMjRiMjguLmUyNWYxODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGh5LmgKKysrIGIvaW5jbHVkZS9saW51eC9waHkuaApAQCAtODAsNiArODAsNyBAQAogCVBIWV9JTlRFUkZBQ0VfTU9ERV9YR01JSSwKIAlQSFlfSU5URVJGQUNFX01PREVfTU9DQSwKIAlQSFlfSU5URVJGQUNFX01PREVfUVNHTUlJLAorCVBIWV9JTlRFUkZBQ0VfTU9ERV9UUkdNSUksCiAJUEhZX0lOVEVSRkFDRV9NT0RFX01BWCwKIH0gcGh5X2ludGVyZmFjZV90OwogCkBAIC0xMjMsNiArMTI0LDggQEAKIAkJcmV0dXJuICJtb2NhIjsKIAljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9RU0dNSUk6CiAJCXJldHVybiAicXNnbWlpIjsKKwljYXNlIFBIWV9JTlRFUkZBQ0VfTU9ERV9UUkdNSUk6CisJCXJldHVybiAidHJnbWlpIjsKIAlkZWZhdWx0OgogCQlyZXR1cm4gInVua25vd24iOwogCX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGh5L3BoeS5oIGIvaW5jbHVkZS9saW51eC9waHkvcGh5LmgKaW5kZXggZjA4YjY3Mi4uZWUxYmVkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waHkvcGh5LmgKKysrIGIvaW5jbHVkZS9saW51eC9waHkvcGh5LmgKQEAgLTM2LDYgKzM2LDcgQEAKICAqIEBwb3dlcl9vbjogcG93ZXJpbmcgb24gdGhlIHBoeQogICogQHBvd2VyX29mZjogcG93ZXJpbmcgb2ZmIHRoZSBwaHkKICAqIEBzZXRfbW9kZTogc2V0IHRoZSBtb2RlIG9mIHRoZSBwaHkKKyAqIEByZXNldDogcmVzZXR0aW5nIHRoZSBwaHkKICAqIEBvd25lcjogdGhlIG1vZHVsZSBvd25lciBjb250YWluaW5nIHRoZSBvcHMKICAqLwogc3RydWN0IHBoeV9vcHMgewpAQCAtNDQsNiArNDUsNyBAQAogCWludAkoKnBvd2VyX29uKShzdHJ1Y3QgcGh5ICpwaHkpOwogCWludAkoKnBvd2VyX29mZikoc3RydWN0IHBoeSAqcGh5KTsKIAlpbnQJKCpzZXRfbW9kZSkoc3RydWN0IHBoeSAqcGh5LCBlbnVtIHBoeV9tb2RlIG1vZGUpOworCWludAkoKnJlc2V0KShzdHJ1Y3QgcGh5ICpwaHkpOwogCXN0cnVjdCBtb2R1bGUgKm93bmVyOwogfTsKIApAQCAtMTM2LDYgKzEzOCw3IEBACiBpbnQgcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBoeSk7CiBpbnQgcGh5X3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICpwaHkpOwogaW50IHBoeV9zZXRfbW9kZShzdHJ1Y3QgcGh5ICpwaHksIGVudW0gcGh5X21vZGUgbW9kZSk7CitpbnQgcGh5X3Jlc2V0KHN0cnVjdCBwaHkgKnBoeSk7CiBzdGF0aWMgaW5saW5lIGludCBwaHlfZ2V0X2J1c193aWR0aChzdHJ1Y3QgcGh5ICpwaHkpCiB7CiAJcmV0dXJuIHBoeS0+YXR0cnMuYnVzX3dpZHRoOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waWRfbmFtZXNwYWNlLmggYi9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaAppbmRleCA5MThiMTE3Li4zNGNjZTk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BpZF9uYW1lc3BhY2UuaApAQCAtNDAsNiArNDAsNyBAQAogCXN0cnVjdCBmc19waW4gKmJhY2N0OwogI2VuZGlmCiAJc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zOworCXN0cnVjdCB1Y291bnRzICp1Y291bnRzOwogCXN0cnVjdCB3b3JrX3N0cnVjdCBwcm9jX3dvcms7CiAJa2dpZF90IHBpZF9naWQ7CiAJaW50IGhpZGVfcGlkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waXBlX2ZzX2kuaCBiL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmgKaW5kZXggMjRmNTQ3MC4uZTc0OTdjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waXBlX2ZzX2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oCkBAIC02NiwxNSArNjYsMTAgQEAKICAqCiAgKiAtPmNvbmZpcm0oKQogICoJLT5zdGVhbCgpCi0gKgkuLi4KLSAqCS0+bWFwKCkKLSAqCS4uLgotICoJLT51bm1hcCgpCiAgKgotICogVGhhdCBpcywgLT5tYXAoKSBtdXN0IGJlIGNhbGxlZCBvbiBhIGNvbmZpcm1lZCBidWZmZXIsCi0gKiBzYW1lIGdvZXMgZm9yIC0+c3RlYWwoKS4gU2VlIGJlbG93IGZvciB0aGUgbWVhbmluZyBvZiBlYWNoCi0gKiBvcGVyYXRpb24uIEFsc28gc2VlIGtlcm5lbGRvYyBpbiBmcy9waXBlLmMgZm9yIHRoZSBwaXBlCi0gKiBhbmQgZ2VuZXJpYyB2YXJpYW50cyBvZiB0aGVzZSBob29rcy4KKyAqIFRoYXQgaXMsIC0+c3RlYWwoKSBtdXN0IGJlIGNhbGxlZCBvbiBhIGNvbmZpcm1lZCBidWZmZXIuCisgKiBTZWUgYmVsb3cgZm9yIHRoZSBtZWFuaW5nIG9mIGVhY2ggb3BlcmF0aW9uLiBBbHNvIHNlZSBrZXJuZWxkb2MKKyAqIGluIGZzL3BpcGUuYyBmb3IgdGhlIHBpcGUgYW5kIGdlbmVyaWMgdmFyaWFudHMgb2YgdGhlc2UgaG9va3MuCiAgKi8KIHN0cnVjdCBwaXBlX2J1Zl9vcGVyYXRpb25zIHsKIAkvKgpAQCAtMTE1LDYgKzExMCw1MyBAQAogCXZvaWQgKCpnZXQpKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc3RydWN0IHBpcGVfYnVmZmVyICopOwogfTsKIAorLyoqCisgKiBwaXBlX2J1Zl9nZXQgLSBnZXQgYSByZWZlcmVuY2UgdG8gYSBwaXBlX2J1ZmZlcgorICogQHBpcGU6CXRoZSBwaXBlIHRoYXQgdGhlIGJ1ZmZlciBiZWxvbmdzIHRvCisgKiBAYnVmOgl0aGUgYnVmZmVyIHRvIGdldCBhIHJlZmVyZW5jZSB0bworICovCitzdGF0aWMgaW5saW5lIHZvaWQgcGlwZV9idWZfZ2V0KHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsCisJCQkJc3RydWN0IHBpcGVfYnVmZmVyICpidWYpCit7CisJYnVmLT5vcHMtPmdldChwaXBlLCBidWYpOworfQorCisvKioKKyAqIHBpcGVfYnVmX3JlbGVhc2UgLSBwdXQgYSByZWZlcmVuY2UgdG8gYSBwaXBlX2J1ZmZlcgorICogQHBpcGU6CXRoZSBwaXBlIHRoYXQgdGhlIGJ1ZmZlciBiZWxvbmdzIHRvCisgKiBAYnVmOgl0aGUgYnVmZmVyIHRvIHB1dCBhIHJlZmVyZW5jZSB0bworICovCitzdGF0aWMgaW5saW5lIHZvaWQgcGlwZV9idWZfcmVsZWFzZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAorCQkJCSAgICBzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZikKK3sKKwljb25zdCBzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyAqb3BzID0gYnVmLT5vcHM7CisKKwlidWYtPm9wcyA9IE5VTEw7CisJb3BzLT5yZWxlYXNlKHBpcGUsIGJ1Zik7Cit9CisKKy8qKgorICogcGlwZV9idWZfY29uZmlybSAtIHZlcmlmeSBjb250ZW50cyBvZiB0aGUgcGlwZSBidWZmZXIKKyAqIEBwaXBlOgl0aGUgcGlwZSB0aGF0IHRoZSBidWZmZXIgYmVsb25ncyB0bworICogQGJ1ZjoJdGhlIGJ1ZmZlciB0byBjb25maXJtCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBpcGVfYnVmX2NvbmZpcm0oc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKKwkJCQkgICBzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZikKK3sKKwlyZXR1cm4gYnVmLT5vcHMtPmNvbmZpcm0ocGlwZSwgYnVmKTsKK30KKworLyoqCisgKiBwaXBlX2J1Zl9zdGVhbCAtIGF0dGVtcHQgdG8gdGFrZSBvd25lcnNoaXAgb2YgYSBwaXBlX2J1ZmZlcgorICogQHBpcGU6CXRoZSBwaXBlIHRoYXQgdGhlIGJ1ZmZlciBiZWxvbmdzIHRvCisgKiBAYnVmOgl0aGUgYnVmZmVyIHRvIGF0dGVtcHQgdG8gc3RlYWwKKyAqLworc3RhdGljIGlubGluZSBpbnQgcGlwZV9idWZfc3RlYWwoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKKwkJCQkgc3RydWN0IHBpcGVfYnVmZmVyICpidWYpCit7CisJcmV0dXJuIGJ1Zi0+b3BzLT5zdGVhbChwaXBlLCBidWYpOworfQorCiAvKiBEaWZmZXJzIGZyb20gUElQRV9CVUYgaW4gdGhhdCBQSVBFX1NJWkUgaXMgdGhlIGxlbmd0aCBvZiB0aGUgYWN0dWFsCiAgICBtZW1vcnkgYWxsb2NhdGlvbiwgd2hlcmVhcyBQSVBFX0JVRiBtYWtlcyBhdG9taWNpdHkgZ3VhcmFudGVlcy4gICovCiAjZGVmaW5lIFBJUEVfU0laRQkJUEFHRV9TSVpFCkBAIC0xMjksNyArMTcxLDYgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHBpcGVfdXNlcl9wYWdlc19zb2Z0OwogaW50IHBpcGVfcHJvY19mbihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIAotCiAvKiBEcm9wIHRoZSBpbm9kZSBzZW1hcGhvcmUgYW5kIHdhaXQgZm9yIGEgcGlwZSBldmVudCwgYXRvbWljYWxseSAqLwogdm9pZCBwaXBlX3dhaXQoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtZHcuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtZHcuaAppbmRleCBkMTVkOGJhLi41ZjBlMTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLWR3LmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1kdy5oCkBAIC0yMyw2ICsyMyw3IEBACiAgKiBAZHN0X2lkOglkc3QgcmVxdWVzdCBsaW5lCiAgKiBAbV9tYXN0ZXI6CW1lbW9yeSBtYXN0ZXIgZm9yIHRyYW5zZmVycyBvbiBhbGxvY2F0ZWQgY2hhbm5lbAogICogQHBfbWFzdGVyOglwZXJpcGhlcmFsIG1hc3RlciBmb3IgdHJhbnNmZXJzIG9uIGFsbG9jYXRlZCBjaGFubmVsCisgKiBAaHNfcG9sYXJpdHk6c2V0IGFjdGl2ZSBsb3cgcG9sYXJpdHkgb2YgaGFuZHNoYWtlIGludGVyZmFjZQogICovCiBzdHJ1Y3QgZHdfZG1hX3NsYXZlIHsKIAlzdHJ1Y3QgZGV2aWNlCQkqZG1hX2RldjsKQEAgLTMwLDYgKzMxLDcgQEAKIAl1OAkJCWRzdF9pZDsKIAl1OAkJCW1fbWFzdGVyOwogCXU4CQkJcF9tYXN0ZXI7CisJYm9vbAkJCWhzX3BvbGFyaXR5OwogfTsKIAogLyoqCkBAIC0zOCw2ICs0MCw3IEBACiAgKiBAaXNfcHJpdmF0ZTogVGhlIGRldmljZSBjaGFubmVscyBzaG91bGQgYmUgbWFya2VkIGFzIHByaXZhdGUgYW5kIG5vdCBmb3IKICAqCWJ5IHRoZSBnZW5lcmFsIHB1cnBvc2UgRE1BIGNoYW5uZWwgYWxsb2NhdG9yLgogICogQGlzX21lbWNweTogVGhlIGRldmljZSBjaGFubmVscyBkbyBzdXBwb3J0IG1lbW9yeS10by1tZW1vcnkgdHJhbnNmZXJzLgorICogQGlzX25vbGxwOiBUaGUgZGV2aWNlIGNoYW5uZWxzIGRvZXMgbm90IHN1cHBvcnQgbXVsdGkgYmxvY2sgdHJhbnNmZXJzLgogICogQGNoYW5fYWxsb2NhdGlvbl9vcmRlcjogQWxsb2NhdGUgY2hhbm5lbHMgc3RhcnRpbmcgZnJvbSAwIG9yIDcKICAqIEBjaGFuX3ByaW9yaXR5OiBTZXQgY2hhbm5lbCBwcmlvcml0eSBpbmNyZWFzaW5nIGZyb20gMCB0byA3IG9yIDcgdG8gMC4KICAqIEBibG9ja19zaXplOiBNYXhpbXVtIGJsb2NrIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBjb250cm9sbGVyCkBAIC00OSw2ICs1Miw3IEBACiAJdW5zaWduZWQgaW50CW5yX2NoYW5uZWxzOwogCWJvb2wJCWlzX3ByaXZhdGU7CiAJYm9vbAkJaXNfbWVtY3B5OworCWJvb2wJCWlzX25vbGxwOwogI2RlZmluZSBDSEFOX0FMTE9DQVRJT05fQVNDRU5ESU5HCTAJLyogemVybyB0byBzZXZlbiAqLwogI2RlZmluZSBDSEFOX0FMTE9DQVRJT05fREVTQ0VORElORwkxCS8qIHNldmVuIHRvIHplcm8gKi8KIAl1bnNpZ25lZCBjaGFyCWNoYW5fYWxsb2NhdGlvbl9vcmRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtbW1wX3RkbWEuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtbW1wX3RkbWEuaAppbmRleCAwYzcyODg2Li40MjJkNDUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLW1tcF90ZG1hLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1tbXBfdGRtYS5oCkBAIC0yOCw3ICsyOCw3IEBACiAJaW50IGdyYW51bGFyaXR5OwogfTsKIAotI2lmZGVmIENPTkZJR19BUk0KKyNpZmRlZiBDT05GSUdfTU1QX1NSQU0KIGV4dGVybiBzdHJ1Y3QgZ2VuX3Bvb2wgKnNyYW1fZ2V0X2dwb29sKGNoYXIgKnBvb2xfbmFtZSk7CiAjZWxzZQogc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2VuX3Bvb2wgKnNyYW1fZ2V0X2dwb29sKGNoYXIgKnBvb2xfbmFtZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9kbWEtczNjMjR4eC5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1zM2MyNHh4LmgKaW5kZXggODliYTFiMC4uNGY5YWJhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1zM2MyNHh4LmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1zM2MyNHh4LmgKQEAgLTMwLDE2ICszMCwyMiBAQAogCXUxNiBjaGFuc2VsOwogfTsKIAorc3RydWN0IGRtYV9zbGF2ZV9tYXA7CisKIC8qKgogICogc3RydWN0IHMzYzI0eHhfZG1hX3BsYXRkYXRhIC0gcGxhdGZvcm0gc3BlY2lmaWMgc2V0dGluZ3MKICAqIEBudW1fcGh5X2NoYW5uZWxzOiBudW1iZXIgb2YgcGh5c2ljYWwgY2hhbm5lbHMKICAqIEBjaGFubmVsczogYXJyYXkgb2YgdmlydHVhbCBjaGFubmVsIGRlc2NyaXB0aW9ucwogICogQG51bV9jaGFubmVsczogbnVtYmVyIG9mIHZpcnR1YWwgY2hhbm5lbHMKKyAqIEBzbGF2ZV9tYXA6IGRtYSBzbGF2ZSBtYXAgbWF0Y2hpbmcgdGFibGUKKyAqIEBzbGF2ZWNudDogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHNsYXZlX21hcAogICovCiBzdHJ1Y3QgczNjMjR4eF9kbWFfcGxhdGRhdGEgewogCWludCBudW1fcGh5X2NoYW5uZWxzOwogCXN0cnVjdCBzM2MyNHh4X2RtYV9jaGFubmVsICpjaGFubmVsczsKIAlpbnQgbnVtX2NoYW5uZWxzOworCWNvbnN0IHN0cnVjdCBkbWFfc2xhdmVfbWFwICpzbGF2ZV9tYXA7CisJaW50IHNsYXZlY250OwogfTsKIAogc3RydWN0IGRtYV9jaGFuOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvaHRjLWVncGlvLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1odGMtZWdwaW8uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9saW51eC9tZmQvaHRjLWVncGlvLmgKcmVuYW1lIHRvIGluY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9ncGlvLWh0Yy1lZ3Bpby5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1scGMzMnh4LmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvZ3Bpby1scGMzMnh4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDRlOTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2dwaW8tbHBjMzJ4eC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIEF1dGhvcjogS2V2aW4gV2VsbHMgPGtldmluLndlbGxzQG54cC5jb20+Ci0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIE5YUCBTZW1pY29uZHVjdG9ycwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF9fTUFDSF9HUElPX0xQQzMyWFhfSAotI2RlZmluZSBfX01BQ0hfR1BJT19MUEMzMlhYX0gKLQotLyoKLSAqIE5vdGUhCi0gKiBNdXhlZCBHUCBwaW5zIG5lZWQgdG8gYmUgc2V0dXAgdG8gdGhlIEdQIHN0YXRlIGluIHRoZSBib2FyZCBsZXZlbAotICogY29kZSBwcmlvciB0byB1c2luZyB0aGlzIGRyaXZlci4KLSAqIEdQSSBwaW5zIDogMjh4UDMgZ3JvdXAKLSAqIEdQTyBwaW5zIDogMjR4UDMgZ3JvdXAKLSAqIEdQSU8gcGluczogOHhQMCBncm91cCwgMjR4UDEgZ3JvdXAsIDEzeFAyIGdyb3VwLCA2eFAzIGdyb3VwCi0gKi8KLQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDBfTUFYIDgKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AxX01BWCAyNAotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfTUFYIDEzCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QM19NQVggNgotI2RlZmluZSBMUEMzMlhYX0dQSV9QM19NQVggMjkKLSNkZWZpbmUgTFBDMzJYWF9HUE9fUDNfTUFYIDI0Ci0KLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AwX0dSUCAwCi0jZGVmaW5lIExQQzMyWFhfR1BJT19QMV9HUlAgKExQQzMyWFhfR1BJT19QMF9HUlAgKyBMUEMzMlhYX0dQSU9fUDBfTUFYKQotI2RlZmluZSBMUEMzMlhYX0dQSU9fUDJfR1JQIChMUEMzMlhYX0dQSU9fUDFfR1JQICsgTFBDMzJYWF9HUElPX1AxX01BWCkKLSNkZWZpbmUgTFBDMzJYWF9HUElPX1AzX0dSUCAoTFBDMzJYWF9HUElPX1AyX0dSUCArIExQQzMyWFhfR1BJT19QMl9NQVgpCi0jZGVmaW5lIExQQzMyWFhfR1BJX1AzX0dSUCAoTFBDMzJYWF9HUElPX1AzX0dSUCArIExQQzMyWFhfR1BJT19QM19NQVgpCi0jZGVmaW5lIExQQzMyWFhfR1BPX1AzX0dSUCAoTFBDMzJYWF9HUElfUDNfR1JQICsgTFBDMzJYWF9HUElfUDNfTUFYKQotCi0vKgotICogQSBzcGVjaWZpYyBHUElPIGNhbiBiZSBzZWxlY3RlZCB3aXRoIHRoaXMgbWFjcm8KLSAqIGllLCBHUElPXzA1IGNhbiBiZSBzZWxlY3RlZCB3aXRoIExQQzMyWFhfR1BJTyhMUEMzMlhYX0dQSU9fUDNfR1JQLCA1KQotICogU2VlIHRoZSBMUEMzMngwIFVzZXIncyBndWlkZSBmb3IgR1BJTyBncm91cCBudW1iZXJzCi0gKi8KLSNkZWZpbmUgTFBDMzJYWF9HUElPKHgsIHkpICgoeCkgKyAoeSkpCi0KLSNlbmRpZiAvKiBfX01BQ0hfR1BJT19MUEMzMlhYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9yZW1vdGVwcm9jLW9tYXAuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9yZW1vdGVwcm9jLW9tYXAuaAppbmRleCBiZmJkMTJiLi43MWExYjIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvcmVtb3RlcHJvYy1vbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3JlbW90ZXByb2Mtb21hcC5oCkBAIC0zOSw5ICszOSw5IEBACiAJY29uc3QgY2hhciAqZmlybXdhcmU7CiAJY29uc3QgY2hhciAqbWJveF9uYW1lOwogCWNvbnN0IHN0cnVjdCBycHJvY19vcHMgKm9wczsKLQlpbnQgKCpkZXZpY2VfZW5hYmxlKSAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci0JaW50ICgqZGV2aWNlX3NodXRkb3duKSAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7Ci0Jdm9pZCgqc2V0X2Jvb3RhZGRyKSh1MzIpOworCWludCAoKmRldmljZV9lbmFibGUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCWludCAoKmRldmljZV9zaHV0ZG93bikoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisJdm9pZCAoKnNldF9ib290YWRkcikodTMyKTsKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19PTUFQX1JFTU9URVBST0MpIHx8IGRlZmluZWQoQ09ORklHX09NQVBfUkVNT1RFUFJPQ19NT0RVTEUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtX2RvbWFpbi5oIGIvaW5jbHVkZS9saW51eC9wbV9kb21haW4uaAppbmRleCAzMWZlYzg1Li5hMDlmZTVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtX2RvbWFpbi5oCisrKyBiL2luY2x1ZGUvbGludXgvcG1fZG9tYWluLmgKQEAgLTUxLDYgKzUxLDggQEAKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlzdHJ1Y3QgZGV2X3Bvd2VyX2dvdmVybm9yICpnb3Y7CiAJc3RydWN0IHdvcmtfc3RydWN0IHBvd2VyX29mZl93b3JrOworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpwcm92aWRlcjsJLyogSWRlbnRpdHkgb2YgdGhlIGRvbWFpbiBwcm92aWRlciAqLworCWJvb2wgaGFzX3Byb3ZpZGVyOwogCWNvbnN0IGNoYXIgKm5hbWU7CiAJYXRvbWljX3Qgc2RfY291bnQ7CS8qIE51bWJlciBvZiBzdWJkb21haW5zIHdpdGggcG93ZXIgIm9uIiAqLwogCWVudW0gZ3BkX3N0YXR1cyBzdGF0dXM7CS8qIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGRvbWFpbiAqLwpAQCAtMTE2LDcgKzExOCw2IEBACiAJcmV0dXJuIHRvX2dwZF9kYXRhKGRldi0+cG93ZXIuc3Vic3lzX2RhdGEtPmRvbWFpbl9kYXRhKTsKIH0KIAotZXh0ZXJuIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqcG1fZ2VucGRfbG9va3VwX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBfX3BtX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKIAkJCQkgc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZ3BkX3RpbWluZ19kYXRhICp0ZCk7CkBAIC0xMjksNiArMTMwLDcgQEAKIAkJCQkgICAgIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqdGFyZ2V0KTsKIGV4dGVybiBpbnQgcG1fZ2VucGRfaW5pdChzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAogCQkJIHN0cnVjdCBkZXZfcG93ZXJfZ292ZXJub3IgKmdvdiwgYm9vbCBpc19vZmYpOworZXh0ZXJuIGludCBwbV9nZW5wZF9yZW1vdmUoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCk7CiAKIGV4dGVybiBzdHJ1Y3QgZGV2X3Bvd2VyX2dvdmVybm9yIHNpbXBsZV9xb3NfZ292ZXJub3I7CiBleHRlcm4gc3RydWN0IGRldl9wb3dlcl9nb3Zlcm5vciBwbV9kb21haW5fYWx3YXlzX29uX2dvdjsKQEAgLTEzOCwxMCArMTQwLDYgQEAKIHsKIAlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKIH0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwbV9nZW5wZF9sb29rdXBfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gTlVMTDsKLX0KIHN0YXRpYyBpbmxpbmUgaW50IF9fcG1fZ2VucGRfYWRkX2RldmljZShzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkLAogCQkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBncGRfdGltaW5nX2RhdGEgKnRkKQpAQCAtMTY4LDYgKzE2NiwxMCBAQAogewogCXJldHVybiAtRU5PU1lTOwogfQorc3RhdGljIGlubGluZSBpbnQgcG1fZ2VucGRfcmVtb3ZlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQpCit7CisJcmV0dXJuIC1FTk9UU1VQUDsKK30KICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludCBwbV9nZW5wZF9hZGRfZGV2aWNlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCkBAIC0xOTIsNTcgKzE5NCw1NyBAQAogCXVuc2lnbmVkIGludCBudW1fZG9tYWluczsKIH07CiAKLXR5cGVkZWYgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICooKmdlbnBkX3hsYXRlX3QpKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MsCi0JCQkJCQl2b2lkICpkYXRhKTsKLQogI2lmZGVmIENPTkZJR19QTV9HRU5FUklDX0RPTUFJTlNfT0YKLWludCBfX29mX2dlbnBkX2FkZF9wcm92aWRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBnZW5wZF94bGF0ZV90IHhsYXRlLAotCQkJdm9pZCAqZGF0YSk7CitpbnQgb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyX3NpbXBsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmdlbnBkKTsKK2ludCBvZl9nZW5wZF9hZGRfcHJvdmlkZXJfb25lY2VsbChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgc3RydWN0IGdlbnBkX29uZWNlbGxfZGF0YSAqZGF0YSk7CiB2b2lkIG9mX2dlbnBkX2RlbF9wcm92aWRlcihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLXN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqb2ZfZ2VucGRfZ2V0X2Zyb21fcHJvdmlkZXIoCi0JCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMpOwotCi1zdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKl9fb2ZfZ2VucGRfeGxhdGVfc2ltcGxlKAotCQkJCQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpnZW5wZHNwZWMsCi0JCQkJCXZvaWQgKmRhdGEpOwotc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwoCi0JCQkJCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmdlbnBkc3BlYywKLQkJCQkJdm9pZCAqZGF0YSk7CitleHRlcm4gaW50IG9mX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncywKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBvZl9nZW5wZF9hZGRfc3ViZG9tYWluKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKnBhcmVudCwKKwkJCQkgIHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKm5ld19zdWJkb21haW4pOworZXh0ZXJuIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqb2ZfZ2VucGRfcmVtb3ZlX2xhc3Qoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiAKIGludCBnZW5wZF9kZXZfcG1fYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldik7CiAjZWxzZSAvKiAhQ09ORklHX1BNX0dFTkVSSUNfRE9NQUlOU19PRiAqLwotc3RhdGljIGlubGluZSBpbnQgX19vZl9nZW5wZF9hZGRfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJZ2VucGRfeGxhdGVfdCB4bGF0ZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbmxpbmUgaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKIHsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVOT1RTVVBQOwogfQorCitzdGF0aWMgaW5saW5lIGludCBvZl9nZW5wZF9hZGRfcHJvdmlkZXJfb25lY2VsbChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQlzdHJ1Y3QgZ2VucGRfb25lY2VsbF9kYXRhICpkYXRhKQoreworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBvZl9nZW5wZF9kZWxfcHJvdmlkZXIoc3RydWN0IGRldmljZV9ub2RlICpucCkge30KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKm9mX2dlbnBkX2dldF9mcm9tX3Byb3ZpZGVyKAotCQkJc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqZ2VucGRzcGVjKQorc3RhdGljIGlubGluZSBpbnQgb2ZfZ2VucGRfYWRkX2RldmljZShzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICphcmdzLAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAotI2RlZmluZSBfX29mX2dlbnBkX3hsYXRlX3NpbXBsZQkJTlVMTAotI2RlZmluZSBfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwJTlVMTAorc3RhdGljIGlubGluZSBpbnQgb2ZfZ2VucGRfYWRkX3N1YmRvbWFpbihzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpwYXJlbnQsCisJCQkJCSBzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpuZXdfc3ViZG9tYWluKQoreworCXJldHVybiAtRU5PREVWOworfQogCiBzdGF0aWMgaW5saW5lIGludCBnZW5wZF9kZXZfcG1fYXR0YWNoKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUE1fR0VORVJJQ19ET01BSU5TX09GICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9zaW1wbGUoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCkKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqb2ZfZ2VucGRfcmVtb3ZlX2xhc3Qoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKLQlyZXR1cm4gX19vZl9nZW5wZF9hZGRfcHJvdmlkZXIobnAsIF9fb2ZfZ2VucGRfeGxhdGVfc2ltcGxlLCBnZW5wZCk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT1RTVVBQKTsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IG9mX2dlbnBkX2FkZF9wcm92aWRlcl9vbmVjZWxsKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkJCXN0cnVjdCBnZW5wZF9vbmVjZWxsX2RhdGEgKmRhdGEpCi17Ci0JcmV0dXJuIF9fb2ZfZ2VucGRfYWRkX3Byb3ZpZGVyKG5wLCBfX29mX2dlbnBkX3hsYXRlX29uZWNlbGwsIGRhdGEpOwotfQorI2VuZGlmIC8qIENPTkZJR19QTV9HRU5FUklDX0RPTUFJTlNfT0YgKi8KIAogI2lmZGVmIENPTkZJR19QTQogZXh0ZXJuIGludCBkZXZfcG1fZG9tYWluX2F0dGFjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgcG93ZXJfb24pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wb3dlci9icTI0NzM1LWNoYXJnZXIuaCBiL2luY2x1ZGUvbGludXgvcG93ZXIvYnEyNDczNS1jaGFyZ2VyLmgKaW5kZXggNmI3NTBjMWEuLmIwNGJlNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG93ZXIvYnEyNDczNS1jaGFyZ2VyLmgKKysrIGIvaW5jbHVkZS9saW51eC9wb3dlci9icTI0NzM1LWNoYXJnZXIuaApAQCAtMjgsMTAgKzI4LDYgQEAKIAogCWNvbnN0IGNoYXIgKm5hbWU7CiAKLQlpbnQgc3RhdHVzX2dwaW87Ci0JaW50IHN0YXR1c19ncGlvX2FjdGl2ZV9sb3c7Ci0JYm9vbCBzdGF0dXNfZ3Bpb192YWxpZDsKLQogCWJvb2wgZXh0X2NvbnRyb2w7CiAKIAljaGFyICoqc3VwcGxpZWRfdG87CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL2JxMjd4eHhfYmF0dGVyeS5oIGIvaW5jbHVkZS9saW51eC9wb3dlci9icTI3eHh4X2JhdHRlcnkuaAppbmRleCBiNTBjMDQ5Li5lMzBkZWIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL2JxMjd4eHhfYmF0dGVyeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG93ZXIvYnEyN3h4eF9iYXR0ZXJ5LmgKQEAgLTU4LDYgKzU4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBtdXRleCBsb2NrOwogCXU4ICpyZWdzOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG93ZXIvc2JzLWJhdHRlcnkuaCBiL2luY2x1ZGUvbGludXgvcG93ZXIvc2JzLWJhdHRlcnkuaAppbmRleCAyYjBhOWQ5Li41MTliOGI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL3Nicy1iYXR0ZXJ5LmgKKysrIGIvaW5jbHVkZS9saW51eC9wb3dlci9zYnMtYmF0dGVyeS5oCkBAIC0yNiwxNyArMjYsMTMgQEAKIAogLyoqCiAgKiBzdHJ1Y3Qgc2JzX3BsYXRmb3JtX2RhdGEgLSBwbGF0Zm9ybSBkYXRhIGZvciBzYnMgZGV2aWNlcwotICogQGJhdHRlcnlfZGV0ZWN0OgkJR1BJTyB3aGljaCBpcyB1c2VkIHRvIGRldGVjdCBiYXR0ZXJ5IHByZXNlbmNlCi0gKiBAYmF0dGVyeV9kZXRlY3RfcHJlc2VudDoJZ3BpbyBzdGF0ZSB3aGVuIGJhdHRlcnkgaXMgcHJlc2VudCAoMCAvIDEpCiAgKiBAaTJjX3JldHJ5X2NvdW50OgkJIyBvZiB0aW1lcyB0byByZXRyeSBvbiBpMmMgSU8gZmFpbHVyZQogICogQHBvbGxfcmV0cnlfY291bnQ6CQkjIG9mIHRpbWVzIHRvIHJldHJ5IGxvb2tpbmcgZm9yIG5ldyBzdGF0dXMgYWZ0ZXIKICAqCQkJCWV4dGVybmFsIGNoYW5nZSBub3RpZmljYXRpb24KICAqLwogc3RydWN0IHNic19wbGF0Zm9ybV9kYXRhIHsKLQlpbnQgYmF0dGVyeV9kZXRlY3Q7Ci0JaW50IGJhdHRlcnlfZGV0ZWN0X3ByZXNlbnQ7Ci0JaW50IGkyY19yZXRyeV9jb3VudDsKLQlpbnQgcG9sbF9yZXRyeV9jb3VudDsKKwl1MzIgaTJjX3JldHJ5X2NvdW50OworCXUzMiBwb2xsX3JldHJ5X2NvdW50OwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Byb2NfbnMuaCBiL2luY2x1ZGUvbGludXgvcHJvY19ucy5oCmluZGV4IGRlMGU3NzEuLjEyY2I4YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJvY19ucy5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJvY19ucy5oCkBAIC0xOCw2ICsxOCw4IEBACiAJc3RydWN0IG5zX2NvbW1vbiAqKCpnZXQpKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CiAJdm9pZCAoKnB1dCkoc3RydWN0IG5zX2NvbW1vbiAqbnMpOwogCWludCAoKmluc3RhbGwpKHN0cnVjdCBuc3Byb3h5ICpuc3Byb3h5LCBzdHJ1Y3QgbnNfY29tbW9uICpucyk7CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICooKm93bmVyKShzdHJ1Y3QgbnNfY29tbW9uICpucyk7CisJc3RydWN0IG5zX2NvbW1vbiAqKCpnZXRfcGFyZW50KShzdHJ1Y3QgbnNfY29tbW9uICpucyk7CiB9OwogCiBleHRlcm4gY29uc3Qgc3RydWN0IHByb2NfbnNfb3BlcmF0aW9ucyBuZXRuc19vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcm9wZXJ0eS5oIGIvaW5jbHVkZS9saW51eC9wcm9wZXJ0eS5oCmluZGV4IDNhMmY5YWUuLjg1NmU1MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJvcGVydHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Byb3BlcnR5LmgKQEAgLTE5MCw3ICsxOTAsNyBAQAogCS5sZW5ndGggPSBBUlJBWV9TSVpFKF92YWxfKSAqIHNpemVvZihfdHlwZV8pLAkJXAogCS5pc19hcnJheSA9IHRydWUsCQkJCQlcCiAJLmlzX3N0cmluZyA9IGZhbHNlLAkJCQkJXAotCXsgLnBvaW50ZXIgPSB7IF90eXBlXyMjX2RhdGEgPSBfdmFsXyB9IH0sCQlcCisJeyAucG9pbnRlciA9IHsgLl90eXBlXyMjX2RhdGEgPSBfdmFsXyB9IH0sCQlcCiB9CiAKICNkZWZpbmUgUFJPUEVSVFlfRU5UUllfVThfQVJSQVkoX25hbWVfLCBfdmFsXykJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oIGIvaW5jbHVkZS9saW51eC9wc3RvcmUuaAppbmRleCA4OTllOTVlLi45MjAxM2NjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHN0b3JlLmgKQEAgLTIyLDEyICsyMiwxMyBAQAogI2lmbmRlZiBfTElOVVhfUFNUT1JFX0gKICNkZWZpbmUgX0xJTlVYX1BTVE9SRV9ICiAKLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ttc2dfZHVtcC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qIHR5cGVzICovCiBlbnVtIHBzdG9yZV90eXBlX2lkIHsKQEAgLTY4LDEzICs2OSwyMSBAQAogCQkJZW51bSBrbXNnX2R1bXBfcmVhc29uIHJlYXNvbiwgdTY0ICppZCwKIAkJCXVuc2lnbmVkIGludCBwYXJ0LCBjb25zdCBjaGFyICpidWYsIGJvb2wgY29tcHJlc3NlZCwKIAkJCXNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CisJaW50CQkoKndyaXRlX2J1Zl91c2VyKShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsCisJCQllbnVtIGttc2dfZHVtcF9yZWFzb24gcmVhc29uLCB1NjQgKmlkLAorCQkJdW5zaWduZWQgaW50IHBhcnQsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQlib29sIGNvbXByZXNzZWQsIHNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJaW50CQkoKmVyYXNlKShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCBpZCwKIAkJCWludCBjb3VudCwgc3RydWN0IHRpbWVzcGVjIHRpbWUsCiAJCQlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiAJdm9pZAkJKmRhdGE7CiB9OwogCi0jZGVmaW5lCVBTVE9SRV9GTEFHU19GUkFHSUxFCTEKKyNkZWZpbmUgUFNUT1JFX0ZMQUdTX0RNRVNHCSgxIDw8IDApCisjZGVmaW5lIFBTVE9SRV9GTEFHU19GUkFHSUxFCVBTVE9SRV9GTEFHU19ETUVTRworI2RlZmluZSBQU1RPUkVfRkxBR1NfQ09OU09MRQkoMSA8PCAxKQorI2RlZmluZSBQU1RPUkVfRkxBR1NfRlRSQUNFCSgxIDw8IDIpCisjZGVmaW5lIFBTVE9SRV9GTEFHU19QTVNHCSgxIDw8IDMpCiAKIGV4dGVybiBpbnQgcHN0b3JlX3JlZ2lzdGVyKHN0cnVjdCBwc3RvcmVfaW5mbyAqKTsKIGV4dGVybiB2b2lkIHBzdG9yZV91bnJlZ2lzdGVyKHN0cnVjdCBwc3RvcmVfaW5mbyAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHN0b3JlX3JhbS5oIGIvaW5jbHVkZS9saW51eC9wc3RvcmVfcmFtLmgKaW5kZXggNDY2MGFhYS4uYzY2OGM4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wc3RvcmVfcmFtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wc3RvcmVfcmFtLmgKQEAgLTE3LDExICsxNywxMiBAQAogI2lmbmRlZiBfX0xJTlVYX1BTVE9SRV9SQU1fSF9fCiAjZGVmaW5lIF9fTElOVVhfUFNUT1JFX1JBTV9IX18KIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogc3RydWN0IHBlcnNpc3RlbnRfcmFtX2J1ZmZlcjsKIHN0cnVjdCByc19jb250cm9sOwpAQCAtNTksNyArNjAsOSBAQAogdm9pZCBwZXJzaXN0ZW50X3JhbV96YXAoc3RydWN0IHBlcnNpc3RlbnRfcmFtX3pvbmUgKnByeik7CiAKIGludCBwZXJzaXN0ZW50X3JhbV93cml0ZShzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6LCBjb25zdCB2b2lkICpzLAotCXVuc2lnbmVkIGludCBjb3VudCk7CisJCQkgdW5zaWduZWQgaW50IGNvdW50KTsKK2ludCBwZXJzaXN0ZW50X3JhbV93cml0ZV91c2VyKHN0cnVjdCBwZXJzaXN0ZW50X3JhbV96b25lICpwcnosCisJCQkgICAgICBjb25zdCB2b2lkIF9fdXNlciAqcywgdW5zaWduZWQgaW50IGNvdW50KTsKIAogdm9pZCBwZXJzaXN0ZW50X3JhbV9zYXZlX29sZChzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6KTsKIHNpemVfdCBwZXJzaXN0ZW50X3JhbV9vbGRfc2l6ZShzdHJ1Y3QgcGVyc2lzdGVudF9yYW1fem9uZSAqcHJ6KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHRwX2Nsb2NrX2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9wdHBfY2xvY2tfa2VybmVsLmgKaW5kZXggNmIxNWUxNi4uNWFkNTRmYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wdHBfY2xvY2tfa2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wdHBfY2xvY2tfa2VybmVsLmgKQEAgLTEyNyw2ICsxMjcsMTEgQEAKICAqCiAgKiBAaW5mbzogICBTdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgbmV3IGNsb2NrLgogICogQHBhcmVudDogUG9pbnRlciB0byB0aGUgcGFyZW50IGRldmljZSBvZiB0aGUgbmV3IGNsb2NrLgorICoKKyAqIFJldHVybnMgYSB2YWxpZCBwb2ludGVyIG9uIHN1Y2Nlc3Mgb3IgUFRSX0VSUiBvbiBmYWlsdXJlLiAgSWYgUEhDCisgKiBzdXBwb3J0IGlzIG1pc3NpbmcgYXQgdGhlIGNvbmZpZ3VyYXRpb24gbGV2ZWwsIHRoaXMgZnVuY3Rpb24KKyAqIHJldHVybnMgTlVMTCwgYW5kIGRyaXZlcnMgYXJlIGV4cGVjdGVkIHRvIGdyYWNlZnVsbHkgaGFuZGxlIHRoYXQKKyAqIGNhc2Ugc2VwYXJhdGVseS4KICAqLwogCiBleHRlcm4gc3RydWN0IHB0cF9jbG9jayAqcHRwX2Nsb2NrX3JlZ2lzdGVyKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqaW5mbywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHhhMnh4X3NzcC5oIGIvaW5jbHVkZS9saW51eC9weGEyeHhfc3NwLmgKaW5kZXggMmEwOTdkMS4uMmQ2ZjBjMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHhhMnh4X3NzcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcHhhMnh4X3NzcC5oCkBAIC04Myw3ICs4Myw2IEBACiAjZGVmaW5lIFNTU1JfUkZTCSgxIDw8IDYpCS8qIFJlY2VpdmUgRklGTyBTZXJ2aWNlIFJlcXVlc3QgKi8KICNkZWZpbmUgU1NTUl9ST1IJKDEgPDwgNykJLyogUmVjZWl2ZSBGSUZPIE92ZXJydW4gKi8KIAotI2lmZGVmIENPTkZJR19BUkNIX1BYQQogI2RlZmluZSBSWF9USFJFU0hfREZMVAk4CiAjZGVmaW5lIFRYX1RIUkVTSF9ERkxUCTgKIApAQCAtOTUsMTkgKzk0LDE2IEBACiAjZGVmaW5lIFNTQ1IxX1JGVAkoMHgwMDAwM2MwMCkJLyogUmVjZWl2ZSBGSUZPIFRocmVzaG9sZCAobWFzaykgKi8KICNkZWZpbmUgU1NDUjFfUnhUcmVzaCh4KSAoKCh4KSAtIDEpIDw8IDEwKSAvKiBsZXZlbCBbMS4uMTZdICovCiAKLSNlbHNlCisjZGVmaW5lIFJYX1RIUkVTSF9DRTQxMDBfREZMVAkyCisjZGVmaW5lIFRYX1RIUkVTSF9DRTQxMDBfREZMVAkyCiAKLSNkZWZpbmUgUlhfVEhSRVNIX0RGTFQJMgotI2RlZmluZSBUWF9USFJFU0hfREZMVAkyCisjZGVmaW5lIENFNDEwMF9TU1NSX1RGTF9NQVNLCSgweDMgPDwgOCkJLyogVHJhbnNtaXQgRklGTyBMZXZlbCBtYXNrICovCisjZGVmaW5lIENFNDEwMF9TU1NSX1JGTF9NQVNLCSgweDMgPDwgMTIpCS8qIFJlY2VpdmUgRklGTyBMZXZlbCBtYXNrICovCiAKLSNkZWZpbmUgU1NTUl9URkxfTUFTSwkoMHgzIDw8IDgpCS8qIFRyYW5zbWl0IEZJRk8gTGV2ZWwgbWFzayAqLwotI2RlZmluZSBTU1NSX1JGTF9NQVNLCSgweDMgPDwgMTIpCS8qIFJlY2VpdmUgRklGTyBMZXZlbCBtYXNrICovCi0KLSNkZWZpbmUgU1NDUjFfVEZUCSgweDAwMDAwMGMwKQkvKiBUcmFuc21pdCBGSUZPIFRocmVzaG9sZCAobWFzaykgKi8KLSNkZWZpbmUgU1NDUjFfVHhUcmVzaCh4KSAoKCh4KSAtIDEpIDw8IDYpIC8qIGxldmVsIFsxLi40XSAqLwotI2RlZmluZSBTU0NSMV9SRlQJKDB4MDAwMDBjMDApCS8qIFJlY2VpdmUgRklGTyBUaHJlc2hvbGQgKG1hc2spICovCi0jZGVmaW5lIFNTQ1IxX1J4VHJlc2goeCkgKCgoeCkgLSAxKSA8PCAxMCkgLyogbGV2ZWwgWzEuLjRdICovCi0jZW5kaWYKKyNkZWZpbmUgQ0U0MTAwX1NTQ1IxX1RGVAkoMHgwMDAwMDBjMCkJLyogVHJhbnNtaXQgRklGTyBUaHJlc2hvbGQgKG1hc2spICovCisjZGVmaW5lIENFNDEwMF9TU0NSMV9UeFRyZXNoKHgpICgoKHgpIC0gMSkgPDwgNikJLyogbGV2ZWwgWzEuLjRdICovCisjZGVmaW5lIENFNDEwMF9TU0NSMV9SRlQJKDB4MDAwMDBjMDApCS8qIFJlY2VpdmUgRklGTyBUaHJlc2hvbGQgKG1hc2spICovCisjZGVmaW5lIENFNDEwMF9TU0NSMV9SeFRyZXNoKHgpICgoKHgpIC0gMSkgPDwgMTApCS8qIGxldmVsIFsxLi40XSAqLwogCiAvKiBRVUFSS19YMTAwMCBTU0NSMCBiaXQgZGVmaW5pdGlvbiAqLwogI2RlZmluZSBRVUFSS19YMTAwMF9TU0NSMF9EU1MJKDB4MUYpCQkvKiBEYXRhIFNpemUgU2VsZWN0IChtYXNrKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZWQvY29tbW9uX2hzaS5oIGIvaW5jbHVkZS9saW51eC9xZWQvY29tbW9uX2hzaS5oCmluZGV4IDQwYzBhZGEuLjczNGRlYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWVkL2NvbW1vbl9oc2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3FlZC9jb21tb25faHNpLmgKQEAgLTUsMjggKzUsNzcgQEAKICAqIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YKICAqIHRoaXMgc291cmNlIHRyZWUuCiAgKi8KKyNpZm5kZWYgX0NPTU1PTl9IU0lfSAorI2RlZmluZSBfQ09NTU9OX0hTSV9ICisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKiBkbWFfYWRkcl90IG1hbmlwICovCisjZGVmaW5lIERNQV9MT19MRSh4KQkJY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyh4KSkKKyNkZWZpbmUgRE1BX0hJX0xFKHgpCQljcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKHgpKQorI2RlZmluZSBETUFfUkVHUEFJUl9MRSh4LCB2YWwpCWRvIHsgXAorCQkJCQkoeCkuaGkgPSBETUFfSElfTEUoKHZhbCkpOyBcCisJCQkJCSh4KS5sbyA9IERNQV9MT19MRSgodmFsKSk7IFwKKwkJCQl9IHdoaWxlICgwKQorCisjZGVmaW5lIEhJTE9fR0VOKGhpLCBsbywgdHlwZSkgICgoKCh0eXBlKShoaSkpIDw8IDMyKSArIChsbykpCisjZGVmaW5lIEhJTE9fNjQoaGksIGxvKSBISUxPX0dFTigobGUzMl90b19jcHUoaGkpKSwgKGxlMzJfdG9fY3B1KGxvKSksIHU2NCkKKyNkZWZpbmUgSElMT182NF9SRUdQQUlSKHJlZ3BhaXIpICAgICAgICAoSElMT182NChyZWdwYWlyLmhpLCByZWdwYWlyLmxvKSkKKyNkZWZpbmUgSElMT19ETUFfUkVHUEFJUihyZWdwYWlyKQkoKGRtYV9hZGRyX3QpSElMT182NF9SRUdQQUlSKHJlZ3BhaXIpKQogCiAjaWZuZGVmIF9fQ09NTU9OX0hTSV9fCiAjZGVmaW5lIF9fQ09NTU9OX0hTSV9fCiAKLSNkZWZpbmUgQ09SRV9TUFFFX1BBR0VfU0laRV9CWVRFUyAgICAgICAgICAgICAgICAgICAgICAgNDA5NgogCiAjZGVmaW5lIFhfRklOQUxfQ0xFQU5VUF9BR0dfSU5UIDEKKworI2RlZmluZSBFVkVOVF9SSU5HX1BBR0VfU0laRV9CWVRFUyAgICAgICAgICA0MDk2CisKICNkZWZpbmUgTlVNX09GX0dMT0JBTF9RVUVVRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4CisjZGVmaW5lIENPTU1PTl9RVUVVRV9FTlRSWV9NQVhfQllURV9TSVpFICAgICAgICA2NAorCisjZGVmaW5lIElTQ1NJX0NEVV9UQVNLX1NFR19UWVBFICAgICAgIDAKKyNkZWZpbmUgUkRNQV9DRFVfVEFTS19TRUdfVFlQRSAgICAgICAgMQorCisjZGVmaW5lIEZXX0FTU0VSVF9HRU5FUkFMX0FUVE5fSURYICAgIDMyCisKKyNkZWZpbmUgTUFYX1BJTk5FRF9DQ0ZDICAgICAgICAgICAgICAgICAzMgogCiAvKiBRdWV1ZSBab25lIHNpemVzIGluIGJ5dGVzICovCiAjZGVmaW5lIFRTVE9STV9RWk9ORV9TSVpFIDgKLSNkZWZpbmUgTVNUT1JNX1FaT05FX1NJWkUgMAorI2RlZmluZSBNU1RPUk1fUVpPTkVfU0laRSAxNgogI2RlZmluZSBVU1RPUk1fUVpPTkVfU0laRSA4CiAjZGVmaW5lIFhTVE9STV9RWk9ORV9TSVpFIDgKICNkZWZpbmUgWVNUT1JNX1FaT05FX1NJWkUgMAogI2RlZmluZSBQU1RPUk1fUVpPTkVfU0laRSAwCiAKLSNkZWZpbmUgRVRIX01BWF9OVU1fUlhfUVVFVUVTX1BFUl9WRiAxNgorI2RlZmluZSBNU1RPUk1fVkZfWk9ORV9ERUZBVUxUX1NJWkVfTE9HCTcKKyNkZWZpbmUgRVRIX01BWF9OVU1fUlhfUVVFVUVTX1BFUl9WRl9ERUZBVUxUCTE2CisjZGVmaW5lIEVUSF9NQVhfTlVNX1JYX1FVRVVFU19QRVJfVkZfRE9VQkxFCTQ4CisjZGVmaW5lIEVUSF9NQVhfTlVNX1JYX1FVRVVFU19QRVJfVkZfUVVBRAkxMTIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ09SRSAoTElHSFQgTDIpIEZXIENPTlNUQU5UUyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENPUkVfTEwyX01BWF9SQU1ST0RfUEVSX0NPTgk4CisjZGVmaW5lIENPUkVfTEwyX1RYX0JEX1BBR0VfU0laRV9CWVRFUwk0MDk2CisjZGVmaW5lIENPUkVfTEwyX1JYX0JEX1BBR0VfU0laRV9CWVRFUwk0MDk2CisjZGVmaW5lIENPUkVfTEwyX1JYX0NRRV9QQUdFX1NJWkVfQllURVMJNDA5NgorI2RlZmluZSBDT1JFX0xMMl9SWF9OVU1fTkVYVF9QQUdFX0JEUwkxCisKKyNkZWZpbmUgQ09SRV9MTDJfVFhfTUFYX0JEU19QRVJfUEFDS0VUCTEyCisKKyNkZWZpbmUgQ09SRV9TUFFFX1BBR0VfU0laRV9CWVRFUwk0MDk2CisKKyNkZWZpbmUgTUFYX05VTV9MTDJfUlhfUVVFVUVTCQkzMgorI2RlZmluZSBNQVhfTlVNX0xMMl9UWF9TVEFUU19DT1VOVEVSUwkzMgogCiAjZGVmaW5lIEZXX01BSk9SX1ZFUlNJT04JOAogI2RlZmluZSBGV19NSU5PUl9WRVJTSU9OCTEwCi0jZGVmaW5lIEZXX1JFVklTSU9OX1ZFUlNJT04JNQorI2RlZmluZSBGV19SRVZJU0lPTl9WRVJTSU9OCTEwCiAjZGVmaW5lIEZXX0VOR0lORUVSSU5HX1ZFUlNJT04JMAogCiAvKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04Myw2ICsxMzIsMjAgQEAKICNkZWZpbmUgTlVNX09GX0xDSURTCQkoMzIwKQogI2RlZmluZSBOVU1fT0ZfTFRJRFMJCSgzMjApCiAKKy8qIENsb2NrIHZhbHVlcyAqLworI2RlZmluZSBNQVNURVJfQ0xLX0ZSRVFfRTQJKDM3NWU2KQorI2RlZmluZSBTVE9STV9DTEtfRlJFUV9FNAkoMTAwMGU2KQorI2RlZmluZSBDTEsyNU1fQ0xLX0ZSRVFfRTQJKDI1ZTYpCisKKy8qIEdsb2JhbCBQWFAgd2luZG93cyAoR1RUKSAqLworI2RlZmluZSBOVU1fT0ZfR1RUCQkxOQorI2RlZmluZSBHVFRfRFdPUkRfU0laRV9CSVRTCTEwCisjZGVmaW5lIEdUVF9CWVRFX1NJWkVfQklUUwkoR1RUX0RXT1JEX1NJWkVfQklUUyArIDIpCisjZGVmaW5lIEdUVF9EV09SRF9TSVpFCQlCSVQoR1RUX0RXT1JEX1NJWkVfQklUUykKKworLyogVG9vbHMgVmVyc2lvbiAqLworI2RlZmluZSBUT09MU19WRVJTSU9OIDEwCisKIC8qKioqKioqKioqKioqKioqKi8KIC8qIENEVSBDT05TVEFOVFMgKi8KIC8qKioqKioqKioqKioqKioqKi8KQEAgLTkwLDYgKzE1Myw4IEBACiAjZGVmaW5lIENEVV9TRUdfVFlQRV9PRkZTRVRfUkVHX1RZUEVfU0hJRlQgICAgICAgICAgICAgICgxNykKICNkZWZpbmUgQ0RVX1NFR19UWVBFX09GRlNFVF9SRUdfT0ZGU0VUX01BU0sgICAgICAgICAgICAgKDB4MWZmZmYpCiAKKyNkZWZpbmUgQ0RVX1ZGX0ZMX1NFR19UWVBFX09GRlNFVF9SRUdfVFlQRV9TSElGVAkoMTIpCisjZGVmaW5lIENEVV9WRl9GTF9TRUdfVFlQRV9PRkZTRVRfUkVHX09GRlNFVF9NQVNLCSgweGZmZikKIC8qKioqKioqKioqKioqKioqKi8KIC8qIERRIENPTlNUQU5UUyAgKi8KIC8qKioqKioqKioqKioqKioqKi8KQEAgLTExNSw2ICsxODAsMTEgQEAKICNkZWZpbmUJRFFfWENNX0VUSF9UWF9CRF9DT05TX0NNRAlEUV9YQ01fQUdHX1ZBTF9TRUxfV09SRDMKICNkZWZpbmUJRFFfWENNX0VUSF9UWF9CRF9QUk9EX0NNRAlEUV9YQ01fQUdHX1ZBTF9TRUxfV09SRDQKICNkZWZpbmUJRFFfWENNX0VUSF9HT19UT19CRF9DT05TX0NNRAlEUV9YQ01fQUdHX1ZBTF9TRUxfV09SRDUKKyNkZWZpbmUgRFFfWENNX0lTQ1NJX1NRX0NPTlNfQ01ECURRX1hDTV9BR0dfVkFMX1NFTF9XT1JEMworI2RlZmluZSBEUV9YQ01fSVNDU0lfU1FfUFJPRF9DTUQJRFFfWENNX0FHR19WQUxfU0VMX1dPUkQ0CisjZGVmaW5lIERRX1hDTV9JU0NTSV9NT1JFX1RPX1NFTkRfU0VRX0NNRCBEUV9YQ01fQUdHX1ZBTF9TRUxfUkVHMworI2RlZmluZSBEUV9YQ01fSVNDU0lfRVhQX1NUQVRfU05fQ01ECURRX1hDTV9BR0dfVkFMX1NFTF9SRUc2CisjZGVmaW5lIERRX1hDTV9ST0NFX1NRX1BST0RfQ01ECURRX1hDTV9BR0dfVkFMX1NFTF9XT1JENAogCiAvKiBVQ00gYWdnIHZhbCBzZWxlY3Rpb24gKEhXKSAqLwogI2RlZmluZQlEUV9VQ01fQUdHX1ZBTF9TRUxfV09SRDAJMApAQCAtMTU5LDEzICsyMjksMTYgQEAKICNkZWZpbmUJRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YyMwk3CiAKIC8qIFhDTSBhZ2cgY291bnRlciBmbGFnIHNlbGVjdGlvbiAqLwotI2RlZmluZSBEUV9YQ01fQ09SRV9EUV9DRl9DTUQJCSgxIDw8IERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTgpCi0jZGVmaW5lIERRX1hDTV9DT1JFX1RFUk1JTkFURV9DTUQJKDEgPDwgRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YxOSkKLSNkZWZpbmUgRFFfWENNX0NPUkVfU0xPV19QQVRIX0NNRAkoMSA8PCBEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIyKQotI2RlZmluZSBEUV9YQ01fRVRIX0RRX0NGX0NNRAkJKDEgPDwgRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YxOCkKLSNkZWZpbmUgRFFfWENNX0VUSF9URVJNSU5BVEVfQ01ECSgxIDw8IERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTkpCi0jZGVmaW5lIERRX1hDTV9FVEhfU0xPV19QQVRIX0NNRAkoMSA8PCBEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIyKQotI2RlZmluZSBEUV9YQ01fRVRIX1RQSF9FTl9DTUQJCSgxIDw8IERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMjMpCisjZGVmaW5lIERRX1hDTV9DT1JFX0RRX0NGX0NNRAkJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTgpCisjZGVmaW5lIERRX1hDTV9DT1JFX1RFUk1JTkFURV9DTUQJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTkpCisjZGVmaW5lIERRX1hDTV9DT1JFX1NMT1dfUEFUSF9DTUQJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMjIpCisjZGVmaW5lIERRX1hDTV9FVEhfRFFfQ0ZfQ01ECQlCSVQoRFFfWENNX0FHR19GTEdfU0hJRlRfQ0YxOCkKKyNkZWZpbmUgRFFfWENNX0VUSF9URVJNSU5BVEVfQ01ECUJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjE5KQorI2RlZmluZSBEUV9YQ01fRVRIX1NMT1dfUEFUSF9DTUQJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMjIpCisjZGVmaW5lIERRX1hDTV9FVEhfVFBIX0VOX0NNRAkJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMjMpCisjZGVmaW5lIERRX1hDTV9JU0NTSV9EUV9GTFVTSF9DTUQJQklUKERRX1hDTV9BR0dfRkxHX1NISUZUX0NGMTkpCisjZGVmaW5lIERRX1hDTV9JU0NTSV9TTE9XX1BBVEhfQ01ECUJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIyKQorI2RlZmluZSBEUV9YQ01fSVNDU0lfUFJPQ19PTkxZX0NMRUFOVVBfQ01EIEJJVChEUV9YQ01fQUdHX0ZMR19TSElGVF9DRjIzKQogCiAvKiBVQ00gYWdnIGNvdW50ZXIgZmxhZyBzZWxlY3Rpb24gKEhXKSAqLwogI2RlZmluZQlEUV9VQ01fQUdHX0ZMR19TSElGVF9DRjAJMApAQCAtMTc4LDkgKzI1MSw0NSBAQAogI2RlZmluZQlEUV9VQ01fQUdHX0ZMR19TSElGVF9SVUxFMUVOCTcKIAogLyogVUNNIGFnZyBjb3VudGVyIGZsYWcgc2VsZWN0aW9uIChGVykgKi8KLSNkZWZpbmUgRFFfVUNNX0VUSF9QTURfVFhfQVJNX0NNRAkoMSA8PCBEUV9VQ01fQUdHX0ZMR19TSElGVF9DRjQpCi0jZGVmaW5lIERRX1VDTV9FVEhfUE1EX1JYX0FSTV9DTUQJKDEgPDwgRFFfVUNNX0FHR19GTEdfU0hJRlRfQ0Y1KQorI2RlZmluZSBEUV9VQ01fRVRIX1BNRF9UWF9BUk1fQ01ECUJJVChEUV9VQ01fQUdHX0ZMR19TSElGVF9DRjQpCisjZGVmaW5lIERRX1VDTV9FVEhfUE1EX1JYX0FSTV9DTUQJQklUKERRX1VDTV9BR0dfRkxHX1NISUZUX0NGNSkKKyNkZWZpbmUgRFFfVUNNX1JPQ0VfQ1FfQVJNX1NFX0NGX0NNRAlCSVQoRFFfVUNNX0FHR19GTEdfU0hJRlRfQ0Y0KQorI2RlZmluZSBEUV9VQ01fUk9DRV9DUV9BUk1fQ0ZfQ01ECUJJVChEUV9VQ01fQUdHX0ZMR19TSElGVF9DRjUpCiAKKy8qIFRDTSBhZ2cgY291bnRlciBmbGFnIHNlbGVjdGlvbiAoSFcpICovCisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGMAkwCisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGMQkxCisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGMgkyCisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGMwkzCisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGNAk0CisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGNQk1CisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGNgk2CisjZGVmaW5lIERRX1RDTV9BR0dfRkxHX1NISUZUX0NGNwk3CisvKiBUQ00gYWdnIGNvdW50ZXIgZmxhZyBzZWxlY3Rpb24gKEZXKSAqLworI2RlZmluZSBEUV9UQ01fSVNDU0lfRkxVU0hfUTBfQ01ECUJJVChEUV9UQ01fQUdHX0ZMR19TSElGVF9DRjEpCisjZGVmaW5lIERRX1RDTV9JU0NTSV9USU1FUl9TVE9QX0FMTF9DTUQJQklUKERRX1RDTV9BR0dfRkxHX1NISUZUX0NGMykKKworLyogUFdNIGFkZHJlc3MgbWFwcGluZyAqLworI2RlZmluZSBEUV9QV01fT0ZGU0VUX0RQTV9CQVNFCTB4MAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX0RQTV9FTkQJMHgyNworI2RlZmluZSBEUV9QV01fT0ZGU0VUX1hDTTE2X0JBU0UJMHg0MAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1hDTTMyX0JBU0UJMHg0NAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1VDTTE2X0JBU0UJMHg0OAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1VDTTMyX0JBU0UJMHg0QworI2RlZmluZSBEUV9QV01fT0ZGU0VUX1VDTTE2XzQJMHg1MAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1RDTTE2X0JBU0UJMHg1OAorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1RDTTMyX0JBU0UJMHg1QworI2RlZmluZSBEUV9QV01fT0ZGU0VUX1hDTV9GTEFHUwkweDY4CisjZGVmaW5lIERRX1BXTV9PRkZTRVRfVUNNX0ZMQUdTCTB4NjkKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9UQ01fRkxBR1MJMHg2QgorCisjZGVmaW5lIERRX1BXTV9PRkZTRVRfWENNX1JETUFfU1FfUFJPRAkJKERRX1BXTV9PRkZTRVRfWENNMTZfQkFTRSArIDIpCisjZGVmaW5lIERRX1BXTV9PRkZTRVRfVUNNX1JETUFfQ1FfQ09OU18zMkJJVAkoRFFfUFdNX09GRlNFVF9VQ00zMl9CQVNFKQorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1VDTV9SRE1BX0NRX0NPTlNfMTZCSVQJKERRX1BXTV9PRkZTRVRfVUNNMTZfNCkKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9VQ01fUkRNQV9JTlRfVElNRU9VVAkoRFFfUFdNX09GRlNFVF9VQ00xNl9CQVNFICsgMikKKyNkZWZpbmUgRFFfUFdNX09GRlNFVF9VQ01fUkRNQV9BUk1fRkxBR1MJKERRX1BXTV9PRkZTRVRfVUNNX0ZMQUdTKQorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1RDTV9ST0NFX1JRX1BST0QJCShEUV9QV01fT0ZGU0VUX1RDTTE2X0JBU0UgKyAxKQorI2RlZmluZSBEUV9QV01fT0ZGU0VUX1RDTV9JV0FSUF9SUV9QUk9ECQkoRFFfUFdNX09GRlNFVF9UQ00xNl9CQVNFICsgMykKICNkZWZpbmUJRFFfUkVHSU9OX1NISUZUCSgxMikKIAogLyogRFBNICovCkBAIC0yMTQsMTUgKzMyMywxNyBAQAogICovCiAjZGVmaW5lIENNX1RYX1BRX0JBU0UJMHgyMDAKIAorLyogbnVtYmVyIG9mIGdsb2JhbCBWcG9ydC9RQ04gcmF0ZSBsaW1pdGVycyAqLworI2RlZmluZSBNQVhfUU1fR0xPQkFMX1JMUwkyNTYKIC8qIFFNIHJlZ2lzdGVycyBkYXRhICovCiAjZGVmaW5lIFFNX0xJTkVfQ1JEX1JFR19XSURUSAkJMTYKLSNkZWZpbmUgUU1fTElORV9DUkRfUkVHX1NJR05fQklUCSgxIDw8IChRTV9MSU5FX0NSRF9SRUdfV0lEVEggLSAxKSkKKyNkZWZpbmUgUU1fTElORV9DUkRfUkVHX1NJR05fQklUCUJJVCgoUU1fTElORV9DUkRfUkVHX1dJRFRIIC0gMSkpCiAjZGVmaW5lIFFNX0JZVEVfQ1JEX1JFR19XSURUSAkJMjQKLSNkZWZpbmUgUU1fQllURV9DUkRfUkVHX1NJR05fQklUCSgxIDw8IChRTV9CWVRFX0NSRF9SRUdfV0lEVEggLSAxKSkKKyNkZWZpbmUgUU1fQllURV9DUkRfUkVHX1NJR05fQklUCUJJVCgoUU1fQllURV9DUkRfUkVHX1dJRFRIIC0gMSkpCiAjZGVmaW5lIFFNX1dGUV9DUkRfUkVHX1dJRFRICQkzMgotI2RlZmluZSBRTV9XRlFfQ1JEX1JFR19TSUdOX0JJVAkJKDEgPDwgKFFNX1dGUV9DUkRfUkVHX1dJRFRIIC0gMSkpCisjZGVmaW5lIFFNX1dGUV9DUkRfUkVHX1NJR05fQklUCQlCSVQoKFFNX1dGUV9DUkRfUkVHX1dJRFRIIC0gMSkpCiAjZGVmaW5lIFFNX1JMX0NSRF9SRUdfV0lEVEgJCTMyCi0jZGVmaW5lIFFNX1JMX0NSRF9SRUdfU0lHTl9CSVQJCSgxIDw8IChRTV9STF9DUkRfUkVHX1dJRFRIIC0gMSkpCisjZGVmaW5lIFFNX1JMX0NSRF9SRUdfU0lHTl9CSVQJCUJJVCgoUU1fUkxfQ1JEX1JFR19XSURUSCAtIDEpKQogCiAvKioqKioqKioqKioqKioqKiovCiAvKiBDQVUgQ09OU1RBTlRTICovCkBAIC0yODcsNiArMzk4LDE3IEBACiAvKiBQWFAgQ09OU1RBTlRTICovCiAvKioqKioqKioqKioqKioqKiovCiAKKy8qIEJhcnMgZm9yIEJsb2NrcyAqLworI2RlZmluZSBQWFBfQkFSX0dSQwkwCisjZGVmaW5lIFBYUF9CQVJfVFNETQkwCisjZGVmaW5lIFBYUF9CQVJfVVNETQkwCisjZGVmaW5lIFBYUF9CQVJfWFNETQkwCisjZGVmaW5lIFBYUF9CQVJfTVNETQkwCisjZGVmaW5lIFBYUF9CQVJfWVNETQkwCisjZGVmaW5lIFBYUF9CQVJfUFNETQkwCisjZGVmaW5lIFBYUF9CQVJfSUdVCTAKKyNkZWZpbmUgUFhQX0JBUl9EUQkxCisKIC8qIFBUVCBhbmQgR1RUICovCiAjZGVmaW5lIFBYUF9OVU1fUEZfV0lORE9XUwkJMTIKICNkZWZpbmUgUFhQX1BFUl9QRl9FTlRSWV9TSVpFCQk4CkBAIC0zMzQsNiArNDU2LDUyIEBACiAJKFBYUF9FWFRFUk5BTF9CQVJfR0xPQkFMX1dJTkRPV19TVEFSVCArIFwKIAkgUFhQX0VYVEVSTkFMX0JBUl9HTE9CQUxfV0lORE9XX0xFTkdUSCAtIDEpCiAKKy8qIFBGIEJBUiAqLworI2RlZmluZSBQWFBfQkFSMF9TVEFSVF9HUkMJMHgwMDAwCisjZGVmaW5lIFBYUF9CQVIwX0dSQ19MRU5HVEgJMHgxQzAwMDAwCisjZGVmaW5lIFBYUF9CQVIwX0VORF9HUkMJKFBYUF9CQVIwX1NUQVJUX0dSQyArIFwKKwkJCQkgUFhQX0JBUjBfR1JDX0xFTkdUSCAtIDEpCisKKyNkZWZpbmUgUFhQX0JBUjBfU1RBUlRfSUdVCTB4MUMwMDAwMAorI2RlZmluZSBQWFBfQkFSMF9JR1VfTEVOR1RICTB4MTAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfRU5EX0lHVQkoUFhQX0JBUjBfU1RBUlRfSUdVICsgXAorCQkJCSBQWFBfQkFSMF9JR1VfTEVOR1RIIC0gMSkKKworI2RlZmluZSBQWFBfQkFSMF9TVEFSVF9UU0RNCTB4MUM4MDAwMAorI2RlZmluZSBQWFBfQkFSMF9TRE1fTEVOR1RICTB4NDAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfU0RNX1JFU0VSVkVEX0xFTkdUSAkweDQwMDAwCisjZGVmaW5lIFBYUF9CQVIwX0VORF9UU0RNCShQWFBfQkFSMF9TVEFSVF9UU0RNICsgXAorCQkJCSBQWFBfQkFSMF9TRE1fTEVOR1RIIC0gMSkKKworI2RlZmluZSBQWFBfQkFSMF9TVEFSVF9NU0RNCTB4MUQwMDAwMAorI2RlZmluZSBQWFBfQkFSMF9FTkRfTVNETQkoUFhQX0JBUjBfU1RBUlRfTVNETSArIFwKKwkJCQkgUFhQX0JBUjBfU0RNX0xFTkdUSCAtIDEpCisKKyNkZWZpbmUgUFhQX0JBUjBfU1RBUlRfVVNETQkweDFEODAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfRU5EX1VTRE0JKFBYUF9CQVIwX1NUQVJUX1VTRE0gKyBcCisJCQkJIFBYUF9CQVIwX1NETV9MRU5HVEggLSAxKQorCisjZGVmaW5lIFBYUF9CQVIwX1NUQVJUX1hTRE0JMHgxRTAwMDAwCisjZGVmaW5lIFBYUF9CQVIwX0VORF9YU0RNCShQWFBfQkFSMF9TVEFSVF9YU0RNICsgXAorCQkJCSBQWFBfQkFSMF9TRE1fTEVOR1RIIC0gMSkKKworI2RlZmluZSBQWFBfQkFSMF9TVEFSVF9ZU0RNCTB4MUU4MDAwMAorI2RlZmluZSBQWFBfQkFSMF9FTkRfWVNETQkoUFhQX0JBUjBfU1RBUlRfWVNETSArIFwKKwkJCQkgUFhQX0JBUjBfU0RNX0xFTkdUSCAtIDEpCisKKyNkZWZpbmUgUFhQX0JBUjBfU1RBUlRfUFNETQkweDFGMDAwMDAKKyNkZWZpbmUgUFhQX0JBUjBfRU5EX1BTRE0JKFBYUF9CQVIwX1NUQVJUX1BTRE0gKyBcCisJCQkJIFBYUF9CQVIwX1NETV9MRU5HVEggLSAxKQorCisjZGVmaW5lIFBYUF9CQVIwX0ZJUlNUX0lOVkFMSURfQUREUkVTUwkoUFhQX0JBUjBfRU5EX1BTRE0gKyAxKQorCisvKiBWRiBCQVIgKi8KKyNkZWZpbmUgUFhQX1ZGX0JBUjAJMAorCisjZGVmaW5lIFBYUF9WRl9CQVIwX1NUQVJUX0dSQwkweDNFMDAKKyNkZWZpbmUgUFhQX1ZGX0JBUjBfR1JDX0xFTkdUSAkweDIwMAorI2RlZmluZSBQWFBfVkZfQkFSMF9FTkRfR1JDCShQWFBfVkZfQkFSMF9TVEFSVF9HUkMgKyBcCisJCQkJIFBYUF9WRl9CQVIwX0dSQ19MRU5HVEggLSAxKQogCiAjZGVmaW5lIFBYUF9WRl9CQVIwX1NUQVJUX0lHVSAgICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIFBYUF9WRl9CQVIwX0lHVV9MRU5HVEggICAgICAgICAgICAgICAgICAweDMwMDAKQEAgLTM5OSw2ICs1NjcsMjAgQEAKICNkZWZpbmUgUFhQX05VTV9JTFRfUkVDT1JEU19CQiA3NjAwCiAjZGVmaW5lIFBYUF9OVU1fSUxUX1JFQ09SRFNfSzIgMTEwMDAKICNkZWZpbmUgTUFYX05VTV9JTFRfUkVDT1JEUyBNQVgoUFhQX05VTV9JTFRfUkVDT1JEU19CQiwgUFhQX05VTV9JTFRfUkVDT1JEU19LMikKKyNkZWZpbmUgUFhQX1FVRVVFU19aT05FX01BWF9OVU0gMzIwCisvKioqKioqKioqKioqKioqKiovCisvKiBQUk0gQ09OU1RBTlRTICovCisvKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFBSTV9ETUFfUEFEX0JZVEVTX05VTQkyCisvKioqKioqKioqKioqKioqKioqLworLyogU0RNcyBDT05TVEFOVFMgKi8KKy8qKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFNETV9PUF9HRU5fVFJJR19OT05FCTAKKyNkZWZpbmUgU0RNX09QX0dFTl9UUklHX1dBS0VfVEhSRUFECTEKKyNkZWZpbmUgU0RNX09QX0dFTl9UUklHX0FHR19JTlQJMgorI2RlZmluZSBTRE1fT1BfR0VOX1RSSUdfTE9BREVSCTQKKyNkZWZpbmUgU0RNX09QX0dFTl9UUklHX0lORElDQVRFX0VSUk9SCTYKKyNkZWZpbmUgU0RNX09QX0dFTl9UUklHX1JFTEVBU0VfVEhSRUFECTcKIAogI2RlZmluZSBTRE1fQ09NUF9UWVBFX05PTkUgICAgICAgICAgICAgIDAKICNkZWZpbmUgU0RNX0NPTVBfVFlQRV9XQUtFX1RIUkVBRCAgICAgICAxCkBAIC00MjQsNiArNjA2LDggQEAKIC8qIFBSUyBDT05TVEFOVFMgKi8KIC8qKioqKioqKioqKioqKioqKi8KIAorI2RlZmluZSBQUlNfR0ZUX0NBTV9MSU5FU19OT19NQVRDSAkzMQorCiAvKiBBc3luYyBkYXRhIEtDUSBDUUUgKi8KIHN0cnVjdCBhc3luY19kYXRhIHsKIAlfX2xlMzIJY2lkOwpAQCAtNDQwLDIwICs2MjQsNiBAQAogI2RlZmluZQlDT0FMRVNDSU5HX1RJTUVTRVRfVkFMSURfU0hJRlQJCTcKIH07CiAKLXN0cnVjdCBjb21tb25fcHJzX3BmX21zZ19pbmZvIHsKLQlfX2xlMzIgdmFsdWU7Ci0jZGVmaW5lCUNPTU1PTl9QUlNfUEZfTVNHX0lORk9fTlBBUl9ERUZBVUxUX1BGX01BU0sJMHgxCi0jZGVmaW5lCUNPTU1PTl9QUlNfUEZfTVNHX0lORk9fTlBBUl9ERUZBVUxUX1BGX1NISUZUCTAKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19GV19ERUJVR18xX01BU0sJCTB4MQotI2RlZmluZQlDT01NT05fUFJTX1BGX01TR19JTkZPX0ZXX0RFQlVHXzFfU0hJRlQJCTEKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19GV19ERUJVR18yX01BU0sJCTB4MQotI2RlZmluZQlDT01NT05fUFJTX1BGX01TR19JTkZPX0ZXX0RFQlVHXzJfU0hJRlQJCTIKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19GV19ERUJVR18zX01BU0sJCTB4MQotI2RlZmluZQlDT01NT05fUFJTX1BGX01TR19JTkZPX0ZXX0RFQlVHXzNfU0hJRlQJCTMKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19SRVNFUlZFRF9NQVNLCQkweEZGRkZGRkYKLSNkZWZpbmUJQ09NTU9OX1BSU19QRl9NU0dfSU5GT19SRVNFUlZFRF9TSElGVAkJNAotfTsKLQogc3RydWN0IGNvbW1vbl9xdWV1ZV96b25lIHsKIAlfX2xlMTYgcmluZ19kcnZfZGF0YV9jb25zdW1lcjsKIAlfX2xlMTYgcmVzZXJ2ZWQ7CkBAIC00NzMsNiArNjQzLDE5IEBACiAJc3RydWN0IHJlZ3BhaXIgbXNnX2FkZHI7CiB9OwogCitzdHJ1Y3QgaXNjc2lfZXFlX2RhdGEgeworCV9fbGUzMiBjaWQ7CisJX19sZTE2IGNvbm5faWQ7CisJdTggZXJyb3JfY29kZTsKKwl1OCBlcnJvcl9wZHVfb3Bjb2RlX3Jlc2VydmVkOworI2RlZmluZSBJU0NTSV9FUUVfREFUQV9FUlJPUl9QRFVfT1BDT0RFX01BU0sJCTB4M0YKKyNkZWZpbmUgSVNDU0lfRVFFX0RBVEFfRVJST1JfUERVX09QQ09ERV9TSElGVAkJMAorI2RlZmluZSBJU0NTSV9FUUVfREFUQV9FUlJPUl9QRFVfT1BDT0RFX1ZBTElEX01BU0sJMHgxCisjZGVmaW5lIElTQ1NJX0VRRV9EQVRBX0VSUk9SX1BEVV9PUENPREVfVkFMSURfU0hJRlQJIDYKKyNkZWZpbmUgSVNDU0lfRVFFX0RBVEFfUkVTRVJWRUQwX01BU0sJCQkweDEKKyNkZWZpbmUgSVNDU0lfRVFFX0RBVEFfUkVTRVJWRUQwX1NISUZUCQkJNworfTsKKwogc3RydWN0IG1hbGljaW91c192Zl9lcWVfZGF0YSB7CiAJdTggdmZfaWQ7CiAJdTggZXJyX2lkOwpAQCAtNDg4LDggKzY3MSwxMCBAQAogdW5pb24gZXZlbnRfcmluZ19kYXRhIHsKIAl1OCBieXRlc1s4XTsKIAlzdHJ1Y3QgdmZfcGZfY2hhbm5lbF9lcWVfZGF0YSB2Zl9wZl9jaGFubmVsOworCXN0cnVjdCBpc2NzaV9lcWVfZGF0YSBpc2NzaV9pbmZvOwogCXN0cnVjdCBtYWxpY2lvdXNfdmZfZXFlX2RhdGEgbWFsaWNpb3VzX3ZmOwogCXN0cnVjdCBpbml0aWFsX2NsZWFudXBfZXFlX2RhdGEgdmZfaW5pdF9jbGVhbnVwOworCXN0cnVjdCByZWdwYWlyIHJvY2VfaGFuZGxlOwogfTsKIAogLyogRXZlbnQgUmluZyBFbnRyeSAqLwpAQCAtNjE2LDYgKzgwMSw1MiBAQAogCU1BWF9EQl9ERVNUCiB9OwogCisvKiBFbnVtIG9mIGRvb3JiZWxsIERQTSB0eXBlcyAqLworZW51bSBkYl9kcG1fdHlwZSB7CisJRFBNX0xFR0FDWSwKKwlEUE1fUk9DRSwKKwlEUE1fTDJfSU5MSU5FLAorCURQTV9MMl9CRCwKKwlNQVhfREJfRFBNX1RZUEUKK307CisKKy8qIFN0cnVjdHVyZSBmb3IgZG9vcmJlbGwgZGF0YSwgaW4gTDIgRFBNIG1vZGUsIGZvciAxc3QgZGIgaW4gYSBEUE0gYnVyc3QgKi8KK3N0cnVjdCBkYl9sMl9kcG1fZGF0YSB7CisJX19sZTE2IGljaWQ7CisJX19sZTE2IGJkX3Byb2Q7CisJX19sZTMyIHBhcmFtczsKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfU0laRV9NQVNLCTB4M0YKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfU0laRV9TSElGVAkwCisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX0RQTV9UWVBFX01BU0sJMHgzCisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX0RQTV9UWVBFX1NISUZUCTYKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfTlVNX0JEU19NQVNLCTB4RkYKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfTlVNX0JEU19TSElGVAk4CisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1BLVF9TSVpFX01BU0sJMHg3RkYKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfUEtUX1NJWkVfU0hJRlQJMTYKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfUkVTRVJWRUQwX01BU0sJMHgxCisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1JFU0VSVkVEMF9TSElGVCAyNworI2RlZmluZSBEQl9MMl9EUE1fREFUQV9TR0VfTlVNX01BU0sJMHg3CisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1NHRV9OVU1fU0hJRlQJMjgKKyNkZWZpbmUgREJfTDJfRFBNX0RBVEFfUkVTRVJWRUQxX01BU0sJMHgxCisjZGVmaW5lIERCX0wyX0RQTV9EQVRBX1JFU0VSVkVEMV9TSElGVCAzMQorfTsKKworLyogU3RydWN0dXJlIGZvciBTR0UgaW4gYSBEUE0gZG9vcmJlbGwgb2YgdHlwZSBEUE1fTDJfQkQgKi8KK3N0cnVjdCBkYl9sMl9kcG1fc2dlIHsKKwlzdHJ1Y3QgcmVncGFpciBhZGRyOworCV9fbGUxNiBuYnl0ZXM7CisJX19sZTE2IGJpdGZpZWxkczsKKyNkZWZpbmUgREJfTDJfRFBNX1NHRV9UUEhfU1RfSU5ERVhfTUFTSwkweDFGRgorI2RlZmluZSBEQl9MMl9EUE1fU0dFX1RQSF9TVF9JTkRFWF9TSElGVCAwCisjZGVmaW5lIERCX0wyX0RQTV9TR0VfUkVTRVJWRUQwX01BU0sJMHgzCisjZGVmaW5lIERCX0wyX0RQTV9TR0VfUkVTRVJWRUQwX1NISUZUCTkKKyNkZWZpbmUgREJfTDJfRFBNX1NHRV9TVF9WQUxJRF9NQVNLCTB4MQorI2RlZmluZSBEQl9MMl9EUE1fU0dFX1NUX1ZBTElEX1NISUZUCTExCisjZGVmaW5lIERCX0wyX0RQTV9TR0VfUkVTRVJWRUQxX01BU0sJMHhGCisjZGVmaW5lIERCX0wyX0RQTV9TR0VfUkVTRVJWRUQxX1NISUZUCTEyCisJX19sZTMyIHJlc2VydmVkMjsKK307CisKIC8qIFN0cnVjdHVyZSBmb3IgZG9vcmJlbGwgYWRkcmVzcywgaW4gbGVnYWN5IG1vZGUgKi8KIHN0cnVjdCBkYl9sZWdhY3lfYWRkciB7CiAJX19sZTMyIGFkZHI7CkBAIC02MjcsNiArODU4LDQ5IEBACiAjZGVmaW5lIERCX0xFR0FDWV9BRERSX0lDSURfU0hJRlQgICAgICA1CiB9OwogCisvKiBTdHJ1Y3R1cmUgZm9yIGRvb3JiZWxsIGFkZHJlc3MsIGluIFBXTSBtb2RlICovCitzdHJ1Y3QgZGJfcHdtX2FkZHIgeworCV9fbGUzMiBhZGRyOworI2RlZmluZSBEQl9QV01fQUREUl9SRVNFUlZFRDBfTUFTSwkweDcKKyNkZWZpbmUgREJfUFdNX0FERFJfUkVTRVJWRUQwX1NISUZUIDAKKyNkZWZpbmUgREJfUFdNX0FERFJfT0ZGU0VUX01BU0sJMHg3RgorI2RlZmluZSBEQl9QV01fQUREUl9PRkZTRVRfU0hJRlQJMworI2RlZmluZSBEQl9QV01fQUREUl9XSURfTUFTSwkweDMKKyNkZWZpbmUgREJfUFdNX0FERFJfV0lEX1NISUZUCTEwCisjZGVmaW5lIERCX1BXTV9BRERSX0RQSV9NQVNLCTB4RkZGRgorI2RlZmluZSBEQl9QV01fQUREUl9EUElfU0hJRlQJMTIKKyNkZWZpbmUgREJfUFdNX0FERFJfUkVTRVJWRUQxX01BU0sJMHhGCisjZGVmaW5lIERCX1BXTV9BRERSX1JFU0VSVkVEMV9TSElGVCAyOAorfTsKKworLyogUGFyYW1ldGVycyB0byBSb0NFIGZpcm13YXJlLCBwYXNzZWQgaW4gRURQTSBkb29yYmVsbCAqLworc3RydWN0IGRiX3JvY2VfZHBtX3BhcmFtcyB7CisJX19sZTMyIHBhcmFtczsKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1NJWkVfTUFTSwkJMHgzRgorI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfU0laRV9TSElGVAkJMAorI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfRFBNX1RZUEVfTUFTSwkweDMKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX0RQTV9UWVBFX1NISUZUCTYKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX09QQ09ERV9NQVNLCQkweEZGCisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19PUENPREVfU0hJRlQJCTgKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1dRRV9TSVpFX01BU0sJMHg3RkYKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1dRRV9TSVpFX1NISUZUCTE2CisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19SRVNFUlZFRDBfTUFTSwkweDEKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1JFU0VSVkVEMF9TSElGVAkyNworI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfQ09NUExFVElPTl9GTEdfTUFTSwkweDEKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX0NPTVBMRVRJT05fRkxHX1NISUZUIDI4CisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19TX0ZMR19NQVNLCQkweDEKKyNkZWZpbmUgREJfUk9DRV9EUE1fUEFSQU1TX1NfRkxHX1NISUZUCQkyOQorI2RlZmluZSBEQl9ST0NFX0RQTV9QQVJBTVNfUkVTRVJWRUQxX01BU0sJMHgzCisjZGVmaW5lIERCX1JPQ0VfRFBNX1BBUkFNU19SRVNFUlZFRDFfU0hJRlQJMzAKK307CisKKy8qIFN0cnVjdHVyZSBmb3IgZG9vcmJlbGwgZGF0YSwgaW4gUk9DRSBEUE0gbW9kZSwgZm9yIDFzdCBkYiBpbiBhIERQTSBidXJzdCAqLworc3RydWN0IGRiX3JvY2VfZHBtX2RhdGEgeworCV9fbGUxNiBpY2lkOworCV9fbGUxNiBwcm9kX3ZhbDsKKwlzdHJ1Y3QgZGJfcm9jZV9kcG1fcGFyYW1zIHBhcmFtczsKK307CisKIC8qIElndSBpbnRlcnJ1cHQgY29tbWFuZCAqLwogZW51bSBpZ3VfaW50X2NtZCB7CiAJSUdVX0lOVF9FTkFCTEUJPSAwLApAQCAtNzY0LDYgKzEwMzgsMTkgQEAKIAlzdHJ1Y3QgcHhwX3ByZXRlbmRfY21kCXByZXRlbmQ7CiB9OwogCisvKiBWRiBab25lIEEgUGVybWlzc2lvbiBSZWdpc3Rlci4gKi8KK3N0cnVjdCBweHBfdmZfem9uZV9hX3Blcm1pc3Npb24geworCV9fbGUzMiBjb250cm9sOworI2RlZmluZSBQWFBfVkZfWk9ORV9BX1BFUk1JU1NJT05fVkZJRF9NQVNLCTB4RkYKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1ZGSURfU0hJRlQJMAorI2RlZmluZSBQWFBfVkZfWk9ORV9BX1BFUk1JU1NJT05fVkFMSURfTUFTSwkweDEKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1ZBTElEX1NISUZUCTgKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1JFU0VSVkVEMF9NQVNLCTB4N0YKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1JFU0VSVkVEMF9TSElGVCA5CisjZGVmaW5lIFBYUF9WRl9aT05FX0FfUEVSTUlTU0lPTl9SRVNFUlZFRDFfTUFTSwkweEZGRkYKKyNkZWZpbmUgUFhQX1ZGX1pPTkVfQV9QRVJNSVNTSU9OX1JFU0VSVkVEMV9TSElGVCAxNgorfTsKKwogLyogUlNTIGhhc2ggdHlwZSAqLwogc3RydWN0IHJkaWZfdGFza19jb250ZXh0IHsKIAlfX2xlMzIgaW5pdGlhbF9yZWZfdGFnOwpAQCAtODMxLDYgKzExMTgsNyBAQAogCV9fbGUzMiByZXNlcnZlZDI7CiB9OwogCisvKiBSU1MgaGFzaCB0eXBlICovCiBlbnVtIHJzc19oYXNoX3R5cGUgewogCVJTU19IQVNIX1RZUEVfREVGQVVMVAk9IDAsCiAJUlNTX0hBU0hfVFlQRV9JUFY0CT0gMSwKQEAgLTk0Miw3ICsxMjMwLDcgQEAKIH07CiAKIHN0cnVjdCB0aW1lcnNfY29udGV4dCB7Ci0JX19sZTMyIGxvZ2ljYWxfY2xpZW50MDsKKwlfX2xlMzIgbG9naWNhbF9jbGllbnRfMDsKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfRVhQSVJBVElPTlRJTUVMQzBfTUFTSyAgICAgMHhGRkZGRkZGCiAjZGVmaW5lIFRJTUVSU19DT05URVhUX0VYUElSQVRJT05USU1FTEMwX1NISUZUICAgIDAKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfVkFMSURMQzBfTUFTSyAgICAgICAgICAgICAgMHgxCkBAIC05NTEsNyArMTIzOSw3IEBACiAjZGVmaW5lIFRJTUVSU19DT05URVhUX0FDVElWRUxDMF9TSElGVCAgICAgICAgICAgIDI5CiAjZGVmaW5lIFRJTUVSU19DT05URVhUX1JFU0VSVkVEMF9NQVNLICAgICAgICAgICAgIDB4MwogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9SRVNFUlZFRDBfU0hJRlQgICAgICAgICAgICAzMAotCV9fbGUzMiBsb2dpY2FsX2NsaWVudDE7CisJX19sZTMyIGxvZ2ljYWxfY2xpZW50XzE7CiAjZGVmaW5lIFRJTUVSU19DT05URVhUX0VYUElSQVRJT05USU1FTEMxX01BU0sgICAgIDB4RkZGRkZGRgogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9FWFBJUkFUSU9OVElNRUxDMV9TSElGVCAgICAwCiAjZGVmaW5lIFRJTUVSU19DT05URVhUX1ZBTElETEMxX01BU0sgICAgICAgICAgICAgIDB4MQpAQCAtOTYwLDcgKzEyNDgsNyBAQAogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9BQ1RJVkVMQzFfU0hJRlQgICAgICAgICAgICAyOQogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9SRVNFUlZFRDFfTUFTSyAgICAgICAgICAgICAweDMKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfUkVTRVJWRUQxX1NISUZUICAgICAgICAgICAgMzAKLQlfX2xlMzIgbG9naWNhbF9jbGllbnQyOworCV9fbGUzMiBsb2dpY2FsX2NsaWVudF8yOwogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9FWFBJUkFUSU9OVElNRUxDMl9NQVNLICAgICAweEZGRkZGRkYKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfRVhQSVJBVElPTlRJTUVMQzJfU0hJRlQgICAgMAogI2RlZmluZSBUSU1FUlNfQ09OVEVYVF9WQUxJRExDMl9NQVNLICAgICAgICAgICAgICAweDEKQEAgLTk3OCwzICsxMjY2LDQgQEAKICNkZWZpbmUgVElNRVJTX0NPTlRFWFRfUkVTRVJWRUQzX1NISUZUICAgICAgICAgICAgMjkKIH07CiAjZW5kaWYgLyogX19DT01NT05fSFNJX18gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZWQvZXRoX2NvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9xZWQvZXRoX2NvbW1vbi5oCmluZGV4IGI1ZWJjNjkuLjFhYTA3MjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWVkL2V0aF9jb21tb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L3FlZC9ldGhfY29tbW9uLmgKQEAgLTEzLDkgKzEzLDEyIEBACiAvKiBFVEggRlcgQ09OU1RBTlRTICovCiAvKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIEVUSF9IU0lfVkVSX01BSk9SICAgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgRVRIX0hTSV9WRVJfTUlOT1IgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBFVEhfQ0FDSEVfTElORV9TSVpFICAgICAgICAgICAgICAgICA2NAorI2RlZmluZSBFVEhfSFNJX1ZFUl9NSU5PUgkxMAogCisjZGVmaW5lIEVUSF9IU0lfVkVSX05PX1BLVF9MRU5fVFVOTgk1CisKKyNkZWZpbmUgRVRIX0NBQ0hFX0xJTkVfU0laRSAgICAgICAgICAgICAgICAgNjQKKyNkZWZpbmUgRVRIX1JYX0NRRV9HQVAJMzIKICNkZWZpbmUgRVRIX01BWF9SQU1ST0RfUEVSX0NPTiAgICAgICAgICAgICAgICAgICAgICAgICAgOAogI2RlZmluZSBFVEhfVFhfQkRfUEFHRV9TSVpFX0JZVEVTICAgICAgICAgICAgICAgICAgICAgICA0MDk2CiAjZGVmaW5lIEVUSF9SWF9CRF9QQUdFX1NJWkVfQllURVMgICAgICAgICAgICAgICAgICAgICAgIDQwOTYKQEAgLTI0LDE1ICsyNywyNSBAQAogCiAjZGVmaW5lIEVUSF9UWF9NSU5fQkRTX1BFUl9OT05fTFNPX1BLVCAgICAgICAgICAgICAgICAgICAgICAgICAgMQogI2RlZmluZSBFVEhfVFhfTUFYX0JEU19QRVJfTk9OX0xTT19QQUNLRVQgICAgICAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEVUSF9UWF9NQVhfQkRTX1BFUl9MU09fUEFDS0VUCTI1NQogI2RlZmluZSBFVEhfVFhfTUFYX0xTT19IRFJfTkJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAogI2RlZmluZSBFVEhfVFhfTUlOX0JEU19QRVJfTFNPX1BLVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMwogI2RlZmluZSBFVEhfVFhfTUlOX0JEU19QRVJfVFVOTl9JUFY2X1dJVEhfRVhUX1BLVCAgICAgICAzCiAjZGVmaW5lIEVUSF9UWF9NSU5fQkRTX1BFUl9JUFY2X1dJVEhfRVhUX1BLVCAgICAgICAgICAgIDIKICNkZWZpbmUgRVRIX1RYX01JTl9CRFNfUEVSX1BLVF9XX0xPT1BCQUNLX01PREUgICAgICAgICAgMgotI2RlZmluZSBFVEhfVFhfTUFYX05PTl9MU09fUEtUX0xFTiAgICAgICAgICAgICAgICAgICg5NzAwIC0gKDQgKyAxMiArIDgpKQorI2RlZmluZSBFVEhfVFhfTUFYX05PTl9MU09fUEtUX0xFTgkoOTcwMCAtICg0ICsgNCArIDEyICsgOCkpCiAjZGVmaW5lIEVUSF9UWF9NQVhfTFNPX0hEUl9CWVRFUyAgICAgICAgICAgICAgICAgICAgNTEwCisjZGVmaW5lIEVUSF9UWF9MU09fV0lORE9XX0JEU19OVU0JKDE4IC0gMSkKKyNkZWZpbmUgRVRIX1RYX0xTT19XSU5ET1dfTUlOX0xFTgk5NzAwCisjZGVmaW5lIEVUSF9UWF9NQVhfTFNPX1BBWUxPQURfTEVOCTB4RkUwMDAKKyNkZWZpbmUgRVRIX1RYX05VTV9TQU1FX0FTX0xBU1RfRU5UUklFUwkzMjAKKyNkZWZpbmUgRVRIX1RYX0lOQUNUSVZFX1NBTUVfQVNfTEFTVAkweEZGRkYKIAogI2RlZmluZSBFVEhfTlVNX1NUQVRJU1RJQ19DT1VOVEVSUyAgICAgICAgICAgICAgICAgICAgICBNQVhfTlVNX1ZQT1JUUworI2RlZmluZSBFVEhfTlVNX1NUQVRJU1RJQ19DT1VOVEVSU19ET1VCTEVfVkZfWk9ORSBcCisJKEVUSF9OVU1fU1RBVElTVElDX0NPVU5URVJTIC0gTUFYX05VTV9WRlMgLyAyKQorI2RlZmluZSBFVEhfTlVNX1NUQVRJU1RJQ19DT1VOVEVSU19RVUFEX1ZGX1pPTkUgXAorCShFVEhfTlVNX1NUQVRJU1RJQ19DT1VOVEVSUyAtIDMgKiBNQVhfTlVNX1ZGUyAvIDQpCiAKIC8qIE1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMsIHVzZWQgZm9yIFJYIHBhY2tldCBwbGFjZW1lbnQgKi8KICNkZWZpbmUgRVRIX1JYX01BWF9CVUZGX1BFUl9QS1QgICAgICAgICAgICAgNQpAQCAtNTksNiArNzIsOCBAQAogI2RlZmluZSBFVEhfVFBBX0NRRV9DT05UX0xFTl9MSVNUX1NJWkUgICAgNgogI2RlZmluZSBFVEhfVFBBX0NRRV9FTkRfTEVOX0xJU1RfU0laRSAgICAgNAogCisvKiBDb250cm9sIGZyYW1lIGNoZWNrIGNvbnN0YW50cyAqLworI2RlZmluZSBFVEhfQ1RMX0ZSQU1FX0VUSF9UWVBFX05VTQk0CiAKIHN0cnVjdCBldGhfdHhfMXN0X2JkX2ZsYWdzIHsKIAl1OCBiaXRmaWVsZHM7CkBAIC04MiwxMCArOTcsMTAgQEAKIAogLyogVGhlIHBhcnNpbmcgaW5mb3JtYXRpb24gZGF0YSBmbyBydGhlIGZpcnN0IHR4IGJkIG9mIGEgZ2l2ZW4gcGFja2V0LiAqLwogc3RydWN0IGV0aF90eF9kYXRhXzFzdF9iZCB7Ci0JX19sZTE2CQkJCXZsYW47Ci0JdTgJCQkJbmJkczsKLQlzdHJ1Y3QgZXRoX3R4XzFzdF9iZF9mbGFncwliZF9mbGFnczsKLQlfX2xlMTYJCQkJYml0ZmllbGRzOworCV9fbGUxNiB2bGFuOworCXU4IG5iZHM7CisJc3RydWN0IGV0aF90eF8xc3RfYmRfZmxhZ3MgYmRfZmxhZ3M7CisJX19sZTE2IGJpdGZpZWxkczsKICNkZWZpbmUgRVRIX1RYX0RBVEFfMVNUX0JEX1RVTk5fRkxBR19NQVNLICAweDEKICNkZWZpbmUgRVRIX1RYX0RBVEFfMVNUX0JEX1RVTk5fRkxBR19TSElGVCAwCiAjZGVmaW5lIEVUSF9UWF9EQVRBXzFTVF9CRF9SRVNFUlZFRDBfTUFTSyAgICAgICAgICAweDEKQEAgLTk2LDcgKzExMSw3IEBACiAKIC8qIFRoZSBwYXJzaW5nIGluZm9ybWF0aW9uIGRhdGEgZm9yIHRoZSBzZWNvbmQgdHggYmQgb2YgYSBnaXZlbiBwYWNrZXQuICovCiBzdHJ1Y3QgZXRoX3R4X2RhdGFfMm5kX2JkIHsKLQlfX2xlMTYJdHVubl9pcF9zaXplOworCV9fbGUxNiB0dW5uX2lwX3NpemU7CiAJX19sZTE2CWJpdGZpZWxkczE7CiAjZGVmaW5lIEVUSF9UWF9EQVRBXzJORF9CRF9UVU5OX0lOTkVSX0wyX0hEUl9TSVpFX1dfTUFTSyAgMHhGCiAjZGVmaW5lIEVUSF9UWF9EQVRBXzJORF9CRF9UVU5OX0lOTkVSX0wyX0hEUl9TSVpFX1dfU0hJRlQgMApAQCAtMTI1LDkgKzE0MCwxNCBAQAogI2RlZmluZSBFVEhfVFhfREFUQV8yTkRfQkRfUkVTRVJWRUQwX1NISUZUICAgICAgICAgICAgICAgIDEzCiB9OwogCisvKiBGaXJtd2FyZSBkYXRhIGZvciBMMi1FRFBNIHBhY2tldC4gKi8KK3N0cnVjdCBldGhfZWRwbV9md19kYXRhIHsKKwlzdHJ1Y3QgZXRoX3R4X2RhdGFfMXN0X2JkIGRhdGFfMXN0X2JkOworCXN0cnVjdCBldGhfdHhfZGF0YV8ybmRfYmQgZGF0YV8ybmRfYmQ7CisJX19sZTMyIHJlc2VydmVkOworfTsKKwogc3RydWN0IGV0aF9mYXN0X3BhdGhfY3FlX2Z3X2RlYnVnIHsKLQl1OCByZXNlcnZlZDA7Ci0JdTggcmVzZXJ2ZWQxOwogCV9fbGUxNiByZXNlcnZlZDI7CiB9OwogCkBAIC0xNDgsNiArMTY4LDE3IEBACiAjZGVmaW5lCUVUSF9UVU5ORUxfUEFSU0lOR19GTEFHU19JUFY0X09QVElPTlNfU0hJRlQJNwogfTsKIAorLyogUE1EIGZsb3cgY29udHJvbCBiaXRzICovCitzdHJ1Y3QgZXRoX3BtZF9mbG93X2ZsYWdzIHsKKwl1OCBmbGFnczsKKyNkZWZpbmUgRVRIX1BNRF9GTE9XX0ZMQUdTX1ZBTElEX01BU0sJMHgxCisjZGVmaW5lIEVUSF9QTURfRkxPV19GTEFHU19WQUxJRF9TSElGVAkwCisjZGVmaW5lIEVUSF9QTURfRkxPV19GTEFHU19UT0dHTEVfTUFTSwkweDEKKyNkZWZpbmUgRVRIX1BNRF9GTE9XX0ZMQUdTX1RPR0dMRV9TSElGVAkxCisjZGVmaW5lIEVUSF9QTURfRkxPV19GTEFHU19SRVNFUlZFRF9NQVNLIDB4M0YKKyNkZWZpbmUgRVRIX1BNRF9GTE9XX0ZMQUdTX1JFU0VSVkVEX1NISUZUIDIKK307CisKIC8qIFJlZ3VsYXIgRVRIIFJ4IEZQIENRRS4gKi8KIHN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X3JlZ19jcWUgewogCXU4IHR5cGU7CkBAIC0xNjYsNjQgKzE5Nyw2MyBAQAogCXU4IHBsYWNlbWVudF9vZmZzZXQ7CiAJc3RydWN0IGV0aF90dW5uZWxfcGFyc2luZ19mbGFncyB0dW5uZWxfcGFyc19mbGFnczsKIAl1OCBiZF9udW07Ci0JdTggcmVzZXJ2ZWRbN107CisJdTggcmVzZXJ2ZWRbOV07CiAJc3RydWN0IGV0aF9mYXN0X3BhdGhfY3FlX2Z3X2RlYnVnIGZ3X2RlYnVnOwogCXU4IHJlc2VydmVkMVszXTsKLQl1OCBmbGFnczsKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9SRUdfQ1FFX1ZBTElEX01BU0sgICAgICAgICAgMHgxCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfUkVHX0NRRV9WQUxJRF9TSElGVCAgICAgICAgIDAKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9SRUdfQ1FFX1ZBTElEX1RPR0dMRV9NQVNLICAgMHgxCi0jZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfUkVHX0NRRV9WQUxJRF9UT0dHTEVfU0hJRlQgIDEKLSNkZWZpbmUgRVRIX0ZBU1RfUEFUSF9SWF9SRUdfQ1FFX1JFU0VSVkVEMl9NQVNLICAgICAgMHgzRgotI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1JFR19DUUVfUkVTRVJWRUQyX1NISUZUICAgICAyCisJc3RydWN0IGV0aF9wbWRfZmxvd19mbGFncyBwbWRfZmxhZ3M7CiB9OwogCiAvKiBUUEEtY29udGludWUgRVRIIFJ4IEZQIENRRS4gKi8KIHN0cnVjdCBldGhfZmFzdF9wYXRoX3J4X3RwYV9jb250X2NxZSB7Ci0JdTgJdHlwZTsKLQl1OAl0cGFfYWdnX2luZGV4OwotCV9fbGUxNglsZW5fbGlzdFtFVEhfVFBBX0NRRV9DT05UX0xFTl9MSVNUX1NJWkVdOwotCXU4CXJlc2VydmVkWzVdOwotCXU4CXJlc2VydmVkMTsKLQlfX2xlMTYJcmVzZXJ2ZWQyW0VUSF9UUEFfQ1FFX0NPTlRfTEVOX0xJU1RfU0laRV07CisJdTggdHlwZTsKKwl1OCB0cGFfYWdnX2luZGV4OworCV9fbGUxNiBsZW5fbGlzdFtFVEhfVFBBX0NRRV9DT05UX0xFTl9MSVNUX1NJWkVdOworCXU4IHJlc2VydmVkOworCXU4IHJlc2VydmVkMTsKKwlfX2xlMTYgcmVzZXJ2ZWQyW0VUSF9UUEFfQ1FFX0NPTlRfTEVOX0xJU1RfU0laRV07CisJdTggcmVzZXJ2ZWQzWzNdOworCXN0cnVjdCBldGhfcG1kX2Zsb3dfZmxhZ3MgcG1kX2ZsYWdzOwogfTsKIAogLyogVFBBLWVuZCBFVEggUnggRlAgQ1FFLiAqLwogc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfdHBhX2VuZF9jcWUgewotCXU4CXR5cGU7Ci0JdTgJdHBhX2FnZ19pbmRleDsKLQlfX2xlMTYJdG90YWxfcGFja2V0X2xlbjsKLQl1OAludW1fb2ZfYmRzOwotCXU4CWVuZF9yZWFzb247Ci0JX19sZTE2CW51bV9vZl9jb2FsZXNjZWRfc2VnczsKLQlfX2xlMzIJdHNfZGVsdGE7Ci0JX19sZTE2CWxlbl9saXN0W0VUSF9UUEFfQ1FFX0VORF9MRU5fTElTVF9TSVpFXTsKLQl1OAlyZXNlcnZlZDFbM107Ci0JdTgJcmVzZXJ2ZWQyOwotCV9fbGUxNglyZXNlcnZlZDNbRVRIX1RQQV9DUUVfRU5EX0xFTl9MSVNUX1NJWkVdOworCXU4IHR5cGU7CisJdTggdHBhX2FnZ19pbmRleDsKKwlfX2xlMTYgdG90YWxfcGFja2V0X2xlbjsKKwl1OCBudW1fb2ZfYmRzOworCXU4IGVuZF9yZWFzb247CisJX19sZTE2IG51bV9vZl9jb2FsZXNjZWRfc2VnczsKKwlfX2xlMzIgdHNfZGVsdGE7CisJX19sZTE2IGxlbl9saXN0W0VUSF9UUEFfQ1FFX0VORF9MRU5fTElTVF9TSVpFXTsKKwlfX2xlMTYgcmVzZXJ2ZWQzW0VUSF9UUEFfQ1FFX0VORF9MRU5fTElTVF9TSVpFXTsKKwlfX2xlMTYgcmVzZXJ2ZWQxOworCXU4IHJlc2VydmVkMjsKKwlzdHJ1Y3QgZXRoX3BtZF9mbG93X2ZsYWdzIHBtZF9mbGFnczsKIH07CiAKIC8qIFRQQS1zdGFydCBFVEggUnggRlAgQ1FFLiAqLwogc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfdHBhX3N0YXJ0X2NxZSB7Ci0JdTgJdHlwZTsKLQl1OAliaXRmaWVsZHM7CisJdTggdHlwZTsKKwl1OCBiaXRmaWVsZHM7CiAjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfVFBBX1NUQVJUX0NRRV9SU1NfSEFTSF9UWVBFX01BU0sgIDB4NwogI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1RQQV9TVEFSVF9DUUVfUlNTX0hBU0hfVFlQRV9TSElGVCAwCiAjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfVFBBX1NUQVJUX0NRRV9UQ19NQVNLICAgICAgICAgICAgIDB4RgogI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1RQQV9TVEFSVF9DUUVfVENfU0hJRlQgICAgICAgICAgICAzCiAjZGVmaW5lIEVUSF9GQVNUX1BBVEhfUlhfVFBBX1NUQVJUX0NRRV9SRVNFUlZFRDBfTUFTSyAgICAgIDB4MQogI2RlZmluZSBFVEhfRkFTVF9QQVRIX1JYX1RQQV9TVEFSVF9DUUVfUkVTRVJWRUQwX1NISUZUICAgICA3Ci0JX19sZTE2CXNlZ19sZW47CisJX19sZTE2IHNlZ19sZW47CiAJc3RydWN0IHBhcnNpbmdfYW5kX2Vycl9mbGFncyBwYXJzX2ZsYWdzOwotCV9fbGUxNgl2bGFuX3RhZzsKLQlfX2xlMzIJcnNzX2hhc2g7Ci0JX19sZTE2CWxlbl9vbl9maXJzdF9iZDsKLQl1OAlwbGFjZW1lbnRfb2Zmc2V0OworCV9fbGUxNiB2bGFuX3RhZzsKKwlfX2xlMzIgcnNzX2hhc2g7CisJX19sZTE2IGxlbl9vbl9maXJzdF9iZDsKKwl1OCBwbGFjZW1lbnRfb2Zmc2V0OwogCXN0cnVjdCBldGhfdHVubmVsX3BhcnNpbmdfZmxhZ3MgdHVubmVsX3BhcnNfZmxhZ3M7Ci0JdTgJdHBhX2FnZ19pbmRleDsKLQl1OAloZWFkZXJfbGVuOwotCV9fbGUxNglleHRfYmRfbGVuX2xpc3RbRVRIX1RQQV9DUUVfU1RBUlRfTEVOX0xJU1RfU0laRV07CisJdTggdHBhX2FnZ19pbmRleDsKKwl1OCBoZWFkZXJfbGVuOworCV9fbGUxNiBleHRfYmRfbGVuX2xpc3RbRVRIX1RQQV9DUUVfU1RBUlRfTEVOX0xJU1RfU0laRV07CiAJc3RydWN0IGV0aF9mYXN0X3BhdGhfY3FlX2Z3X2RlYnVnIGZ3X2RlYnVnOworCXU4IHJlc2VydmVkOworCXN0cnVjdCBldGhfcG1kX2Zsb3dfZmxhZ3MgcG1kX2ZsYWdzOwogfTsKIAogLyogVGhlIEw0IHBzZXVkbyBjaGVja3N1bSBtb2RlIGZvciBFdGhlcm5ldCAqLwpAQCAtMjQ1LDE1ICsyNzUsNyBAQAogCXU4CXJlc2VydmVkWzI1XTsKIAlfX2xlMTYJZWNobzsKIAl1OAlyZXNlcnZlZDE7Ci0JdTgJZmxhZ3M7Ci0vKiBmb3IgUE1EIG1vZGUgLSB2YWxpZCBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEVUSF9TTE9XX1BBVEhfUlhfQ1FFX1ZBTElEX01BU0sgICAgICAgICAweDEKLSNkZWZpbmUgRVRIX1NMT1dfUEFUSF9SWF9DUUVfVkFMSURfU0hJRlQgICAgICAgIDAKLS8qIGZvciBQTUQgbW9kZSAtIHZhbGlkIHRvZ2dsZSBpbmRpY2F0aW9uICovCi0jZGVmaW5lIEVUSF9TTE9XX1BBVEhfUlhfQ1FFX1ZBTElEX1RPR0dMRV9NQVNLICAweDEKLSNkZWZpbmUgRVRIX1NMT1dfUEFUSF9SWF9DUUVfVkFMSURfVE9HR0xFX1NISUZUIDEKLSNkZWZpbmUgRVRIX1NMT1dfUEFUSF9SWF9DUUVfUkVTRVJWRUQyX01BU0sgICAgIDB4M0YKLSNkZWZpbmUgRVRIX1NMT1dfUEFUSF9SWF9DUUVfUkVTRVJWRUQyX1NISUZUICAgIDIKKwlzdHJ1Y3QgZXRoX3BtZF9mbG93X2ZsYWdzIHBtZF9mbGFnczsKIH07CiAKIC8qIHVuaW9uIGZvciBhbGwgRVRIIFJ4IENRRSB0eXBlcyAqLwpAQCAtMjc2LDYgKzI5OCwxMSBAQAogCU1BWF9FVEhfUlhfQ1FFX1RZUEUKIH07CiAKK3N0cnVjdCBldGhfcnhfcG1kX2NxZSB7CisJdW5pb24gZXRoX3J4X2NxZSBjcWU7CisJdTggcmVzZXJ2ZWRbRVRIX1JYX0NRRV9HQVBdOworfTsKKwogZW51bSBldGhfcnhfdHVubl90eXBlIHsKIAlFVEhfUlhfTk9fVFVOTiwKIAlFVEhfUlhfVFVOTl9HRU5FVkUsCkBAIC0zMTMsOCArMzQwLDggQEAKIAogLyogVGhlIHBhcnNpbmcgaW5mb3JtYXRpb24gZGF0YSBmb3IgdGhlIHRoaXJkIHR4IGJkIG9mIGEgZ2l2ZW4gcGFja2V0LiAqLwogc3RydWN0IGV0aF90eF9kYXRhXzNyZF9iZCB7Ci0JX19sZTE2CWxzb19tc3M7Ci0JX19sZTE2CWJpdGZpZWxkczsKKwlfX2xlMTYgbHNvX21zczsKKwlfX2xlMTYgYml0ZmllbGRzOwogI2RlZmluZSBFVEhfVFhfREFUQV8zUkRfQkRfVENQX0hEUl9MRU5fRFdfTUFTSyAgMHhGCiAjZGVmaW5lIEVUSF9UWF9EQVRBXzNSRF9CRF9UQ1BfSERSX0xFTl9EV19TSElGVCAwCiAjZGVmaW5lIEVUSF9UWF9EQVRBXzNSRF9CRF9IRFJfTkJEX01BU0sgICAgICAgICAweEYKQEAgLTMyMyw4ICszNTAsOCBAQAogI2RlZmluZSBFVEhfVFhfREFUQV8zUkRfQkRfU1RBUlRfQkRfU0hJRlQgICAgICAgOAogI2RlZmluZSBFVEhfVFhfREFUQV8zUkRfQkRfUkVTRVJWRUQwX01BU0sgICAgICAgMHg3RgogI2RlZmluZSBFVEhfVFhfREFUQV8zUkRfQkRfUkVTRVJWRUQwX1NISUZUICAgICAgOQotCXU4CXR1bm5fbDRfaGRyX3N0YXJ0X29mZnNldF93OwotCXU4CXR1bm5faGRyX3NpemVfdzsKKwl1OCB0dW5uX2w0X2hkcl9zdGFydF9vZmZzZXRfdzsKKwl1OCB0dW5uX2hkcl9zaXplX3c7CiB9OwogCiAvKiBUaGUgdGhpcmQgdHggYmQgb2YgYSBnaXZlbiBwYWNrZXQgKi8KQEAgLTM1NSwxMCArMzgyLDEwIEBACiB9OwogCiB1bmlvbiBldGhfdHhfYmRfdHlwZXMgewotCXN0cnVjdCBldGhfdHhfMXN0X2JkCWZpcnN0X2JkOwotCXN0cnVjdCBldGhfdHhfMm5kX2JkCXNlY29uZF9iZDsKLQlzdHJ1Y3QgZXRoX3R4XzNyZF9iZAl0aGlyZF9iZDsKLQlzdHJ1Y3QgZXRoX3R4X2JkCXJlZ19iZDsKKwlzdHJ1Y3QgZXRoX3R4XzFzdF9iZCBmaXJzdF9iZDsKKwlzdHJ1Y3QgZXRoX3R4XzJuZF9iZCBzZWNvbmRfYmQ7CisJc3RydWN0IGV0aF90eF8zcmRfYmQgdGhpcmRfYmQ7CisJc3RydWN0IGV0aF90eF9iZCByZWdfYmQ7CiB9OwogCiAvKiBNc3Rvcm0gUXVldWUgWm9uZSAqLwpAQCAtMzg5LDggKzQxNiw4IEBACiAjZGVmaW5lIEVUSF9EQl9EQVRBX1JFU0VSVkVEX1NISUZUICAgIDUKICNkZWZpbmUgRVRIX0RCX0RBVEFfQUdHX1ZBTF9TRUxfTUFTSyAgMHgzCiAjZGVmaW5lIEVUSF9EQl9EQVRBX0FHR19WQUxfU0VMX1NISUZUIDYKLQl1OAlhZ2dfZmxhZ3M7Ci0JX19sZTE2CWJkX3Byb2Q7CisJdTggYWdnX2ZsYWdzOworCV9fbGUxNiBiZF9wcm9kOwogfTsKIAogI2VuZGlmIC8qIF9fRVRIX0NPTU1PTl9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FlZC9pc2NzaV9jb21tb24uaCBiL2luY2x1ZGUvbGludXgvcWVkL2lzY3NpX2NvbW1vbi5oCmluZGV4IGIzYzBmZWIuLjhmNjRiMTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWVkL2lzY3NpX2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvcWVkL2lzY3NpX2NvbW1vbi5oCkBAIC0zMTEsNyArMzExLDcgQEAKICNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9EQVRBX1NFR19MRU5fU0hJRlQgIDAKICNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9UT1RBTF9BSFNfTEVOX01BU0sgIDB4RkYKICNkZWZpbmUgSVNDU0lfTE9HSU5fUkVRX0hEUl9UT1RBTF9BSFNfTEVOX1NISUZUIDI0Ci0JX19sZTMyIGlzaWRfVEFCQzsKKwlfX2xlMzIgaXNpZF90YWJjOwogCV9fbGUxNiB0c2loOwogCV9fbGUxNiBpc2lkX2Q7CiAJX19sZTMyIGl0dDsKQEAgLTQ2NCw3ICs0NjQsNyBAQAogI2RlZmluZSBJU0NTSV9MT0dJTl9SRVNQT05TRV9IRFJfREFUQV9TRUdfTEVOX1NISUZUICAwCiAjZGVmaW5lIElTQ1NJX0xPR0lOX1JFU1BPTlNFX0hEUl9UT1RBTF9BSFNfTEVOX01BU0sgIDB4RkYKICNkZWZpbmUgSVNDU0lfTE9HSU5fUkVTUE9OU0VfSERSX1RPVEFMX0FIU19MRU5fU0hJRlQgMjQKLQlfX2xlMzIgaXNpZF9UQUJDOworCV9fbGUzMiBpc2lkX3RhYmM7CiAJX19sZTE2IHRzaWg7CiAJX19sZTE2IGlzaWRfZDsKIAlfX2xlMzIgaXR0OwpAQCAtNjg4LDggKzY4OCw3IEBACiBlbnVtIGlzY3NpX2NxZXNfdHlwZSB7CiAJSVNDU0lfQ1FFX1RZUEVfU09MSUNJVEVEID0gMSwKIAlJU0NTSV9DUUVfVFlQRV9VTlNPTElDSVRFRCwKLQlJU0NTSV9DUUVfVFlQRV9TT0xJQ0lURURfV0lUSF9TRU5TRQotCSAgICwKKwlJU0NTSV9DUUVfVFlQRV9TT0xJQ0lURURfV0lUSF9TRU5TRSwKIAlJU0NTSV9DUUVfVFlQRV9UQVNLX0NMRUFOVVAsCiAJSVNDU0lfQ1FFX1RZUEVfRFVNTVksCiAJTUFYX0lTQ1NJX0NRRVNfVFlQRQpAQCAtNzY5LDkgKzc2OCw5IEBACiAJSVNDU0lfRVZFTlRfVFlQRV9VUERBVEVfQ09OTiwKIAlJU0NTSV9FVkVOVF9UWVBFX0NMRUFSX1NRLAogCUlTQ1NJX0VWRU5UX1RZUEVfVEVSTUlOQVRFX0NPTk4sCisJSVNDU0lfRVZFTlRfVFlQRV9NQUNfVVBEQVRFX0NPTk4sCiAJSVNDU0lfRVZFTlRfVFlQRV9BU1lOX0NPTk5FQ1RfQ09NUExFVEUsCiAJSVNDU0lfRVZFTlRfVFlQRV9BU1lOX1RFUk1JTkFURV9ET05FLAotCVJFU0VSVkVEOCwKIAlSRVNFUlZFRDksCiAJSVNDU0lfRVZFTlRfVFlQRV9TVEFSVF9PRl9FUlJPUl9UWVBFUyA9IDEwLAogCUlTQ1NJX0VWRU5UX1RZUEVfQVNZTl9BQk9SVF9SQ1ZELApAQCAtODY3LDYgKzg2Niw3IEBACiAJSVNDU0lfUkFNUk9EX0NNRF9JRF9VUERBVEVfQ09OTiA9IDQsCiAJSVNDU0lfUkFNUk9EX0NNRF9JRF9URVJNSU5BVElPTl9DT05OID0gNSwKIAlJU0NTSV9SQU1ST0RfQ01EX0lEX0NMRUFSX1NRID0gNiwKKwlJU0NTSV9SQU1ST0RfQ01EX0lEX01BQ19VUERBVEUgPSA3LAogCU1BWF9JU0NTSV9SQU1ST0RfQ01EX0lECiB9OwogCkBAIC04ODMsNiArODgzLDE2IEBACiAJX19sZTE2IHIydF9zbjsKIH07CiAKK3N0cnVjdCBpc2NzaV9zcGVfY29ubl9tYWNfdXBkYXRlIHsKKwlzdHJ1Y3QgaXNjc2lfc2xvd19wYXRoX2hkciBoZHI7CisJX19sZTE2IGNvbm5faWQ7CisJX19sZTMyIGZ3X2NpZDsKKwlfX2xlMTYgcmVtb3RlX21hY19hZGRyX2xvOworCV9fbGUxNiByZW1vdGVfbWFjX2FkZHJfbWlkOworCV9fbGUxNiByZW1vdGVfbWFjX2FkZHJfaGk7CisJdTggcmVzZXJ2ZWQwWzJdOworfTsKKwogc3RydWN0IGlzY3NpX3NwZV9jb25uX29mZmxvYWQgewogCXN0cnVjdCBpc2NzaV9zbG93X3BhdGhfaGRyIGhkcjsKIAlfX2xlMTYgY29ubl9pZDsKQEAgLTEzMDIsMTQgKzEzMTIsNiBAQAogCXN0cnVjdCByZWdwYWlyIGlzY3NpX3J4X2Ryb3BwZWRfcGR1c190YXNrX25vdF92YWxpZDsKIH07CiAKLXN0cnVjdCBvb29fb3BhcXVlIHsKLQlfX2xlMzIgY2lkOwotCXU4IGRyb3BfaXNsZTsKLQl1OCBkcm9wX3NpemU7Ci0JdTggb29vX29wY29kZTsKLQl1OCBvb29faXNsZTsKLX07Ci0KIHN0cnVjdCBwc3Rvcm1faXNjc2lfc3RhdHNfZHJ2IHsKIAlzdHJ1Y3QgcmVncGFpciBpc2NzaV90eF9ieXRlc19jbnQ7CiAJc3RydWN0IHJlZ3BhaXIgaXNjc2lfdHhfcGFja2V0X2NudDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWVkL3FlZF9jaGFpbi5oIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX2NoYWluLmgKaW5kZXggN2U0NDFiZC4uNzJkODhjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xZWQvcWVkX2NoYWluLmgKKysrIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX2NoYWluLmgKQEAgLTE2LDE5ICsxNiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3FlZC9jb21tb25faHNpLmg+CiAKLS8qIGRtYV9hZGRyX3QgbWFuaXAgKi8KLSNkZWZpbmUgRE1BX0xPX0xFKHgpICAgICAgICAgICAgY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyh4KSkKLSNkZWZpbmUgRE1BX0hJX0xFKHgpICAgICAgICAgICAgY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyh4KSkKLSNkZWZpbmUgRE1BX1JFR1BBSVJfTEUoeCwgdmFsKSAgZG8geyBcCi0JCQkJCSh4KS5oaSA9IERNQV9ISV9MRSgodmFsKSk7IFwKLQkJCQkJKHgpLmxvID0gRE1BX0xPX0xFKCh2YWwpKTsgXAotCQkJCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgSElMT19HRU4oaGksIGxvLCB0eXBlKSAgKCgoKHR5cGUpKGhpKSkgPDwgMzIpICsgKGxvKSkKLSNkZWZpbmUgSElMT182NChoaSwgbG8pIEhJTE9fR0VOKChsZTMyX3RvX2NwdShoaSkpLCAobGUzMl90b19jcHUobG8pKSwgdTY0KQotI2RlZmluZSBISUxPXzY0X1JFR1BBSVIocmVncGFpcikgICAgICAgIChISUxPXzY0KHJlZ3BhaXIuaGksIHJlZ3BhaXIubG8pKQotI2RlZmluZSBISUxPX0RNQV9SRUdQQUlSKHJlZ3BhaXIpCSgoZG1hX2FkZHJfdClISUxPXzY0X1JFR1BBSVIocmVncGFpcikpCi0KIGVudW0gcWVkX2NoYWluX21vZGUgewogCS8qIEVhY2ggUGFnZSBjb250YWlucyBhIG5leHQgcG9pbnRlciBhdCBpdHMgZW5kICovCiAJUUVEX0NIQUlOX01PREVfTkVYVF9QVFIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfZXRoX2lmLmggYi9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfZXRoX2lmLmgKaW5kZXggNDQ3NWE5ZC4uMzNjMjRlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xZWQvcWVkX2V0aF9pZi5oCisrKyBiL2luY2x1ZGUvbGludXgvcWVkL3FlZF9ldGhfaWYuaApAQCAtMjMsNiArMjMsOSBAQAogCiAJdTgJcG9ydF9tYWNbRVRIX0FMRU5dOwogCXU4CW51bV92bGFuX2ZpbHRlcnM7CisKKwkvKiBMZWdhY3kgVkYgLSB0aGlzIGFmZmVjdHMgdGhlIGRhdGFwYXRoLCBzbyBxZWRlIGhhcyB0byBrbm93ICovCisJYm9vbCBpc19sZWdhY3k7CiB9OwogCiBzdHJ1Y3QgcWVkX3VwZGF0ZV92cG9ydF9yc3NfcGFyYW1zIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWVkL3FlZF9pZi5oIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX2lmLmgKaW5kZXggZDZjNDE3Ny4uZjlhZTkwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9xZWQvcWVkX2lmLmgKKysrIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX2lmLmgKQEAgLTM0LDYgKzM0LDggQEAKIAlEQ0JYX01BWF9QUk9UT0NPTF9UWVBFCiB9OwogCisjZGVmaW5lIFFFRF9ST0NFX1BST1RPQ09MX0lOREVYICgzKQorCiAjaWZkZWYgQ09ORklHX0RDQgogI2RlZmluZSBRRURfTExEUF9DSEFTU0lTX0lEX1NUQVRfTEVOIDQKICNkZWZpbmUgUUVEX0xMRFBfUE9SVF9JRF9TVEFUX0xFTiA0CkBAIC0yNjAsMTUgKzI2MiwxNSBAQAogCS8qIE1GVyB2ZXJzaW9uICovCiAJdTMyCQltZndfcmV2OwogCi0JYm9vbCByZG1hX3N1cHBvcnRlZDsKLQogCXUzMgkJZmxhc2hfc2l6ZTsKIAl1OAkJbWZfbW9kZTsKIAlib29sCQl0eF9zd2l0Y2hpbmc7CisJYm9vbAkJcmRtYV9zdXBwb3J0ZWQ7CiB9OwogCiBlbnVtIHFlZF9zYl90eXBlIHsKIAlRRURfU0JfVFlQRV9MMl9RVUVVRSwKKwlRRURfU0JfVFlQRV9DTlEsCiB9OwogCiBlbnVtIHFlZF9wcm90b2NvbCB7CkBAIC0yNzYsNiArMjc4LDIxIEBACiAJUUVEX1BST1RPQ09MX0lTQ1NJLAogfTsKIAorZW51bSBxZWRfbGlua19tb2RlX2JpdHMgeworCVFFRF9MTV9GSUJSRV9CSVQgPSBCSVQoMCksCisJUUVEX0xNX0F1dG9uZWdfQklUID0gQklUKDEpLAorCVFFRF9MTV9Bc3ltX1BhdXNlX0JJVCA9IEJJVCgyKSwKKwlRRURfTE1fUGF1c2VfQklUID0gQklUKDMpLAorCVFFRF9MTV8xMDAwYmFzZVRfSGFsZl9CSVQgPSBCSVQoNCksCisJUUVEX0xNXzEwMDBiYXNlVF9GdWxsX0JJVCA9IEJJVCg1KSwKKwlRRURfTE1fMTAwMDBiYXNlS1JfRnVsbF9CSVQgPSBCSVQoNiksCisJUUVEX0xNXzI1MDAwYmFzZUtSX0Z1bGxfQklUID0gQklUKDcpLAorCVFFRF9MTV80MDAwMGJhc2VMUjRfRnVsbF9CSVQgPSBCSVQoOCksCisJUUVEX0xNXzUwMDAwYmFzZUtSMl9GdWxsX0JJVCA9IEJJVCg5KSwKKwlRRURfTE1fMTAwMDAwYmFzZUtSNF9GdWxsX0JJVCA9IEJJVCgxMCksCisJUUVEX0xNX0NPVU5UID0gMTEKK307CisKIHN0cnVjdCBxZWRfbGlua19wYXJhbXMgewogCWJvb2wJbGlua191cDsKIApAQCAtMzAzLDkgKzMyMCwxMSBAQAogc3RydWN0IHFlZF9saW5rX291dHB1dCB7CiAJYm9vbAlsaW5rX3VwOwogCi0JdTMyCXN1cHBvcnRlZF9jYXBzOyAgICAgICAgIC8qIEluIFNVUFBPUlRFRCBkZWZzICovCi0JdTMyCWFkdmVydGlzZWRfY2FwczsgICAgICAgIC8qIEluIEFEVkVSVElTRUQgZGVmcyAqLwotCXUzMglscF9jYXBzOyAgICAgICAgICAgICAgICAvKiBJbiBBRFZFUlRJU0VEIGRlZnMgKi8KKwkvKiBJbiBRRURfTE1fKiBkZWZzICovCisJdTMyCXN1cHBvcnRlZF9jYXBzOworCXUzMglhZHZlcnRpc2VkX2NhcHM7CisJdTMyCWxwX2NhcHM7CisKIAl1MzIJc3BlZWQ7ICAgICAgICAgICAgICAgICAgLyogSW4gTWIvcyAqLwogCXU4CWR1cGxleDsgICAgICAgICAgICAgICAgIC8qIEluIERVUExFWCBkZWZzICovCiAJdTgJcG9ydDsgICAgICAgICAgICAgICAgICAgLyogSW4gUE9SVCBkZWZzICovCkBAIC00MzgsNiArNDU3LDEwIEBACiAJdm9pZAkJKCpzaW1kX2hhbmRsZXJfY2xlYW4pKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAogCQkJCQkgICAgICBpbnQgaW5kZXgpOwogCisJaW50ICgqZGJnX2FsbF9kYXRhKSAoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHZvaWQgKmJ1ZmZlcik7CisKKwlpbnQgKCpkYmdfYWxsX2RhdGFfc2l6ZSkgKHN0cnVjdCBxZWRfZGV2ICpjZGV2KTsKKwogLyoqCiAgKiBAYnJpZWYgY2FuX2xpbmtfY2hhbmdlIC0gY2FuIHRoZSBpbnN0YW5jZSBjaGFuZ2UgdGhlIGxpbmsgb3Igbm90CiAgKgpAQCAtNjA2LDggKzYyOSw5IEBACiAJUUVEX01TR19TUAk9IDB4MTAwMDAwLAogCVFFRF9NU0dfU1RPUkFHRSA9IDB4MjAwMDAwLAogCVFFRF9NU0dfQ1hUCT0gMHg4MDAwMDAsCisJUUVEX01TR19MTDIJPSAweDEwMDAwMDAsCiAJUUVEX01TR19JTFQJPSAweDIwMDAwMDAsCi0JUUVEX01TR19ST0NFCT0gMHg0MDAwMDAwLAorCVFFRF9NU0dfUkRNQQk9IDB4NDAwMDAwMCwKIAlRRURfTVNHX0RFQlVHCT0gMHg4MDAwMDAwLAogCS8qIHRvIGJlIGFkZGVkLi4udXAgdG8gMHg4MDAwMDAwICovCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9xZWQvcWVkX2xsMl9pZi5oIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkX2xsMl9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNzVjMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfbGwyX2lmLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qIFFMb2dpYyBxZWQgTklDIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mCisgKiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpZm5kZWYgX1FFRF9MTDJfSUZfSAorI2RlZmluZSBfUUVEX0xMMl9JRl9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcWVkL3FlZF9pZi5oPgorCitzdHJ1Y3QgcWVkX2xsMl9zdGF0cyB7CisJdTY0IGdzaV9pbnZhbGlkX2hkcjsKKwl1NjQgZ3NpX2ludmFsaWRfcGt0X2xlbmd0aDsKKwl1NjQgZ3NpX3Vuc3VwcG9ydGVkX3BrdF90eXA7CisJdTY0IGdzaV9jcmNjaGtzbV9lcnJvcjsKKworCXU2NCBwYWNrZXRfdG9vX2JpZ19kaXNjYXJkOworCXU2NCBub19idWZmX2Rpc2NhcmQ7CisKKwl1NjQgcmN2X3VjYXN0X2J5dGVzOworCXU2NCByY3ZfbWNhc3RfYnl0ZXM7CisJdTY0IHJjdl9iY2FzdF9ieXRlczsKKwl1NjQgcmN2X3VjYXN0X3BrdHM7CisJdTY0IHJjdl9tY2FzdF9wa3RzOworCXU2NCByY3ZfYmNhc3RfcGt0czsKKworCXU2NCBzZW50X3VjYXN0X2J5dGVzOworCXU2NCBzZW50X21jYXN0X2J5dGVzOworCXU2NCBzZW50X2JjYXN0X2J5dGVzOworCXU2NCBzZW50X3VjYXN0X3BrdHM7CisJdTY0IHNlbnRfbWNhc3RfcGt0czsKKwl1NjQgc2VudF9iY2FzdF9wa3RzOworfTsKKworI2RlZmluZSBRRURfTEwyX1VOVVNFRF9IQU5ETEUgICAoMHhmZikKKworc3RydWN0IHFlZF9sbDJfY2Jfb3BzIHsKKwlpbnQgKCpyeF9jYikodm9pZCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCB1MzIsIHUzMik7CisJaW50ICgqdHhfY2IpKHZvaWQgKiwgc3RydWN0IHNrX2J1ZmYgKiwgYm9vbCk7Cit9OworCitzdHJ1Y3QgcWVkX2xsMl9wYXJhbXMgeworCXUxNiBtdHU7CisJYm9vbCBkcm9wX3R0bDBfcGFja2V0czsKKwlib29sIHJ4X3ZsYW5fc3RyaXBwaW5nOworCXU4IHR4X3RjOworCWJvb2wgZnJhZ3NfbWFwcGVkOworCXU4IGxsMl9tYWNfYWRkcmVzc1tFVEhfQUxFTl07Cit9OworCitzdHJ1Y3QgcWVkX2xsMl9vcHMgeworLyoqCisgKiBAYnJpZWYgc3RhcnQgLSBpbml0aWFsaXplcyBsbDIKKyAqCisgKiBAcGFyYW0gY2RldgorICogQHBhcmFtIHBhcmFtcyAtIHByb3RvY29sIGRyaXZlciBjb25maWd1cmF0aW9uIGZvciB0aGUgbGwyLgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgdmFsdWUuCisgKi8KKwlpbnQgKCpzdGFydCkoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHN0cnVjdCBxZWRfbGwyX3BhcmFtcyAqcGFyYW1zKTsKKworLyoqCisgKiBAYnJpZWYgc3RvcCAtIHN0b3BzIHRoZSBsbDIKKyAqCisgKiBAcGFyYW0gY2RldgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgdmFsdWUuCisgKi8KKwlpbnQgKCpzdG9wKShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CisKKy8qKgorICogQGJyaWVmIHN0YXJ0X3htaXQgLSB0cmFuc21pdHMgYW4gc2tiIG92ZXIgdGhlIGxsMiBpbnRlcmZhY2UKKyAqCisgKiBAcGFyYW0gY2RldgorICogQHBhcmFtIHNrYgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBvdGhlcndpc2UgZXJyb3IgdmFsdWUuCisgKi8KKwlpbnQgKCpzdGFydF94bWl0KShzdHJ1Y3QgcWVkX2RldiAqY2Rldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKy8qKgorICogQGJyaWVmIHJlZ2lzdGVyX2NiX29wcyAtIHByb3RvY29sIGRyaXZlciByZWdpc3RlciB0aGUgY2FsbGJhY2sgZm9yIFJ4L1R4CisgKiBwYWNrZXRzLiBTaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBgc3RhcnQnLgorICoKKyAqIEBwYXJhbSBjZGV2CisgKiBAcGFyYW0gY29va2llIC0gdG8gYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMuCisgKiBAcGFyYW0gb3BzIC0gdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byByZWdpc3RlciBmb3IgUnggLyBUeC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIGVycm9yIHZhbHVlLgorICovCisJdm9pZCAoKnJlZ2lzdGVyX2NiX29wcykoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkJY29uc3Qgc3RydWN0IHFlZF9sbDJfY2Jfb3BzICpvcHMsCisJCQkJdm9pZCAqY29va2llKTsKKworLyoqCisgKiBAYnJpZWYgZ2V0IExMMiByZWxhdGVkIHN0YXRpc3RpY3MKKyAqCisgKiBAcGFyYW0gY2RldgorICogQHBhcmFtIHN0YXRzIC0gcG9pbnRlciB0byBzdHJ1Y3QgdGhhdCB3b3VsZCBiZSBmaWxsZWQgd2l0aCBzdGF0cworICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBlcnJvciBvdGhlcndpc2UuCisgKi8KKwlpbnQgKCpnZXRfc3RhdHMpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LCBzdHJ1Y3QgcWVkX2xsMl9zdGF0cyAqc3RhdHMpOworfTsKKworI2lmZGVmIENPTkZJR19RRURfTEwyCitpbnQgcWVkX2xsMl9hbGxvY19pZihzdHJ1Y3QgcWVkX2RldiAqKTsKK3ZvaWQgcWVkX2xsMl9kZWFsbG9jX2lmKHN0cnVjdCBxZWRfZGV2ICopOworI2Vsc2UKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcWVkX2xsMl9vcHMgcWVkX2xsMl9vcHNfcGFzcyA9IHsKKwkuc3RhcnQgPSBOVUxMLAorCS5zdG9wID0gTlVMTCwKKwkuc3RhcnRfeG1pdCA9IE5VTEwsCisJLnJlZ2lzdGVyX2NiX29wcyA9IE5VTEwsCisJLmdldF9zdGF0cyA9IE5VTEwsCit9OworCitzdGF0aWMgaW5saW5lIGludCBxZWRfbGwyX2FsbG9jX2lmKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVkX2xsMl9kZWFsbG9jX2lmKHN0cnVjdCBxZWRfZGV2ICpjZGV2KQoreworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWVkL3FlZF9yb2NlX2lmLmggYi9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfcm9jZV9pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDQ3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3FlZC9xZWRfcm9jZV9pZi5oCkBAIC0wLDAgKzEsNjA0IEBACisvKiBRTG9naWMgcWVkIE5JQyBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2ICBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBfUUVEX1JPQ0VfSUZfSAorI2RlZmluZSBfUUVEX1JPQ0VfSUZfSAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcWVkL3FlZF9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L3FlZC9xZWRfbGwyX2lmLmg+CisjaW5jbHVkZSA8bGludXgvcWVkL3JkbWFfY29tbW9uLmg+CisKK2VudW0gcWVkX3JvY2VfbGwyX3R4X2Rlc3QgeworCS8qIExpZ2h0IEwyIFRYIERlc3RpbmF0aW9uIHRvIHRoZSBOZXR3b3JrICovCisJUUVEX1JPQ0VfTEwyX1RYX0RFU1RfTlcsCisKKwkvKiBMaWdodCBMMiBUWCBEZXN0aW5hdGlvbiB0byB0aGUgTG9vcGJhY2sgKi8KKwlRRURfUk9DRV9MTDJfVFhfREVTVF9MQiwKKwlRRURfUk9DRV9MTDJfVFhfREVTVF9NQVgKK307CisKKyNkZWZpbmUgUUVEX1JETUFfTUFYX0NOUV9TSVpFICAgICAgICAgICAgICAgKDB4RkZGRikKKworLyogcmRtYSBpbnRlcmZhY2UgKi8KKworZW51bSBxZWRfcm9jZV9xcF9zdGF0ZSB7CisJUUVEX1JPQ0VfUVBfU1RBVEVfUkVTRVQsCisJUUVEX1JPQ0VfUVBfU1RBVEVfSU5JVCwKKwlRRURfUk9DRV9RUF9TVEFURV9SVFIsCisJUUVEX1JPQ0VfUVBfU1RBVEVfUlRTLAorCVFFRF9ST0NFX1FQX1NUQVRFX1NRRCwKKwlRRURfUk9DRV9RUF9TVEFURV9FUlIsCisJUUVEX1JPQ0VfUVBfU1RBVEVfU1FFCit9OworCitlbnVtIHFlZF9yZG1hX3RpZF90eXBlIHsKKwlRRURfUkRNQV9USURfUkVHSVNURVJFRF9NUiwKKwlRRURfUkRNQV9USURfRk1SLAorCVFFRF9SRE1BX1RJRF9NV19UWVBFMSwKKwlRRURfUkRNQV9USURfTVdfVFlQRTJBCit9OworCitzdHJ1Y3QgcWVkX3JkbWFfZXZlbnRzIHsKKwl2b2lkICpjb250ZXh0OworCXZvaWQgKCphZmZpbGlhdGVkX2V2ZW50KSh2b2lkICpjb250ZXh0LCB1OCBmd19ldmVudF9jb2RlLAorCQkJCSB2b2lkICpmd19oYW5kbGUpOworCXZvaWQgKCp1bmFmZmlsaWF0ZWRfZXZlbnQpKHZvaWQgKmNvbnRleHQsIHU4IGV2ZW50X2NvZGUpOworfTsKKworc3RydWN0IHFlZF9yZG1hX2RldmljZSB7CisJdTMyIHZlbmRvcl9pZDsKKwl1MzIgdmVuZG9yX3BhcnRfaWQ7CisJdTMyIGh3X3ZlcjsKKwl1NjQgZndfdmVyOworCisJdTY0IG5vZGVfZ3VpZDsKKwl1NjQgc3lzX2ltYWdlX2d1aWQ7CisKKwl1OCBtYXhfY25xOworCXU4IG1heF9zZ2U7CisJdTggbWF4X3NycV9zZ2U7CisJdTE2IG1heF9pbmxpbmU7CisJdTMyIG1heF93cWU7CisJdTMyIG1heF9zcnFfd3FlOworCXU4IG1heF9xcF9yZXNwX3JkX2F0b21pY19yZXNjOworCXU4IG1heF9xcF9yZXFfcmRfYXRvbWljX3Jlc2M7CisJdTY0IG1heF9kZXZfcmVzcF9yZF9hdG9taWNfcmVzYzsKKwl1MzIgbWF4X2NxOworCXUzMiBtYXhfcXA7CisJdTMyIG1heF9zcnE7CisJdTMyIG1heF9tcjsKKwl1NjQgbWF4X21yX3NpemU7CisJdTMyIG1heF9jcWU7CisJdTMyIG1heF9tdzsKKwl1MzIgbWF4X2ZtcjsKKwl1MzIgbWF4X21yX213X2Ztcl9wYmw7CisJdTY0IG1heF9tcl9td19mbXJfc2l6ZTsKKwl1MzIgbWF4X3BkOworCXUzMiBtYXhfYWg7CisJdTggbWF4X3BrZXk7CisJdTE2IG1heF9zcnFfd3I7CisJdTggbWF4X3N0YXRzX3F1ZXVlczsKKwl1MzIgZGV2X2NhcHM7CisKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBSTlItTkFLIGdlbmVyYXRpb24gKi8KKworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1JOUl9OQUtfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1JOUl9OQUtfU0hJRlQgICAgICAgICAgICAgICAgICAwCisJLyogQWJpbHR5IHRvIHN1cHBvcnQgc2h1dGRvd24gcG9ydCAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1NIVVRET1dOX1BPUlRfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1NIVVRET1dOX1BPUlRfU0hJRlQgICAgICAgICAgICAgICAgICAgIDEKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBwb3J0IGFjdGl2ZSBldmVudCAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1BPUlRfQUNUSVZFX0VWRU5UX01BU0sgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9QT1JUX0FDVElWRV9FVkVOVF9TSElGVCAgICAgICAgICAgICAgICAyCisJLyogQWJpbHR5IHRvIHN1cHBvcnQgcG9ydCBjaGFuZ2UgZXZlbnQgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9QT1JUX0NIQU5HRV9FVkVOVF9NQVNLICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfUE9SVF9DSEFOR0VfRVZFTlRfU0hJRlQgICAgICAgICAgICAgICAgMworCS8qIEFiaWx0eSB0byBzdXBwb3J0IHN5c3RlbSBpbWFnZSBHVUlEICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfU1lTX0lNQUdFX01BU0sgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1NZU19JTUFHRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDQKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBiYWQgUF9LZXkgY291bnRlciBzdXBwb3J0ICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQkFEX1BLRVlfQ05UX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQkFEX1BLRVlfQ05UX1NISUZUICAgICAgICAgICAgICAgICAgICAgNQorCS8qIEFiaWx0eSB0byBzdXBwb3J0IGF0b21pYyBvcGVyYXRpb25zICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfQVRPTUlDX09QX01BU0sgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0FUT01JQ19PUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9SRVNJWkVfQ1FfTUFTSyAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfUkVTSVpFX0NRX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgNworCS8qIEFiaWx0eSB0byBzdXBwb3J0IG1vZGlmeWluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKwkgKiBvdXRzdGFuZGluZyB3b3JrIHJlcXVlc3RzIHBlciBRUAorCSAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1JFU0laRV9NQVhfV1JfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX1JFU0laRV9NQVhfV1JfU0hJRlQgICAgICAgICAgICAgICAgICAgIDgKKwkvKiBBYmlsdHkgdG8gc3VwcG9ydCBhdXRvbWF0aWMgcGF0aCBtaWdyYXRpb24gKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9BVVRPX1BBVEhfTUlHX01BU0sgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9BVVRPX1BBVEhfTUlHX1NISUZUICAgICAgICAgICAgICAgICAgICA5CisJLyogQWJpbHR5IHRvIHN1cHBvcnQgdGhlIGJhc2UgbWVtb3J5IG1hbmFnZW1lbnQgZXh0ZW5zaW9ucyAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0JBU0VfTUVNT1JZX0VYVF9NQVNLICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0JBU0VfTUVNT1JZX0VYVF9TSElGVCAgICAgICAgICAxMAorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0JBU0VfUVVFVUVfRVhUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0JBU0VfUVVFVUVfRVhUX1NISUZUICAgICAgICAgICAgICAgICAgIDExCisJLyogQWJpbHR5IHRvIHN1cHBvcnQgbXVsdGlwaWxlIHBhZ2Ugc2l6ZXMgcGVyIG1lbW9yeSByZWdpb24gKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9NVUxUSV9QQUdFX1BFUl9NUl9FWFRfTUFTSyAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9NVUxUSV9QQUdFX1BFUl9NUl9FWFRfU0hJRlQgICAgICAgICAgICAxMgorCS8qIEFiaWx0eSB0byBzdXBwb3J0IGJsb2NrIGxpc3QgcGh5c2ljYWwgYnVmZmVyIGxpc3QgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9CTE9DS19NT0RFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9CTE9DS19NT0RFX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAxMworCS8qIEFiaWx0eSB0byBzdXBwb3J0IHplcm8gYmFzZWQgdmlydHVhbCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9aQlZBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JETUFfREVWX0NBUF9aQlZBX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNAorCS8qIEFiaWx0eSB0byBzdXBwb3J0IGxvY2FsIGludmFsaWRhdGUgZmVuY2luZyAqLworI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0xPQ0FMX0lOVl9GRU5DRV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUkRNQV9ERVZfQ0FQX0xPQ0FMX0lOVl9GRU5DRV9TSElGVCAgICAgICAgICAxNQorCS8qIEFiaWx0eSB0byBzdXBwb3J0IExvb3BiYWNrIG9uIFFQICovCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfTEJfSU5ESUNBVE9SX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX0RFVl9DQVBfTEJfSU5ESUNBVE9SX1NISUZUICAgICAgICAgICAgICAgICAgICAgMTYKKwl1NjQgcGFnZV9zaXplX2NhcHM7CisJdTggZGV2X2Fja19kZWxheTsKKwl1MzIgcmVzZXJ2ZWRfbGtleTsKKwl1MzIgYmFkX3BrZXlfY291bnRlcjsKKwlzdHJ1Y3QgcWVkX3JkbWFfZXZlbnRzIGV2ZW50czsKK307CisKK2VudW0gcWVkX3BvcnRfc3RhdGUgeworCVFFRF9SRE1BX1BPUlRfVVAsCisJUUVEX1JETUFfUE9SVF9ET1dOLAorfTsKKworZW51bSBxZWRfcm9jZV9jYXBhYmlsaXR5IHsKKwlRRURfUk9DRV9WMSA9IDEgPDwgMCwKKwlRRURfUk9DRV9WMiA9IDEgPDwgMSwKK307CisKK3N0cnVjdCBxZWRfcmRtYV9wb3J0IHsKKwllbnVtIHFlZF9wb3J0X3N0YXRlIHBvcnRfc3RhdGU7CisJaW50IGxpbmtfc3BlZWQ7CisJdTY0IG1heF9tc2dfc2l6ZTsKKwl1OCBzb3VyY2VfZ2lkX3RhYmxlX2xlbjsKKwl2b2lkICpzb3VyY2VfZ2lkX3RhYmxlX3B0cjsKKwl1OCBwa2V5X3RhYmxlX2xlbjsKKwl2b2lkICpwa2V5X3RhYmxlX3B0cjsKKwl1MzIgcGtleV9iYWRfY291bnRlcjsKKwllbnVtIHFlZF9yb2NlX2NhcGFiaWxpdHkgY2FwYWJpbGl0eTsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9jbnFfcGFyYW1zIHsKKwl1OCBudW1fcGJsX3BhZ2VzOworCXU2NCBwYmxfcHRyOworfTsKKworLyogVGhlIENRIE1vZGUgYWZmZWN0cyB0aGUgQ1EgZG9vcmJlbGwgdHJhbnNhY3Rpb24gc2l6ZS4KKyAqIDY0LzMyIGJpdCBtYWNoaW5lcyBzaG91bGQgY29uZmlndXJlIHRvIDMyLzE2IGJpdHMgcmVzcGVjdGl2ZWx5LgorICovCitlbnVtIHFlZF9yZG1hX2NxX21vZGUgeworCVFFRF9SRE1BX0NRX01PREVfMTZfQklUUywKKwlRRURfUkRNQV9DUV9NT0RFXzMyX0JJVFMsCit9OworCitzdHJ1Y3QgcWVkX3JvY2VfZGNxY25fcGFyYW1zIHsKKwl1OCBub3RpZmljYXRpb25fcG9pbnQ7CisJdTggcmVhY3Rpb25fcG9pbnQ7CisKKwkvKiBmaWVsZHMgZm9yIG5vdGlmaWNhdGlvbiBwb2ludCAqLworCXUzMiBjbnBfc2VuZF90aW1lb3V0OworCisJLyogZmllbGRzIGZvciByZWFjdGlvbiBwb2ludCAqLworCXUzMiBybF9iY19yYXRlOworCXUxNiBybF9tYXhfcmF0ZTsKKwl1MTYgcmxfcl9haTsKKwl1MTYgcmxfcl9oYWk7CisJdTE2IGRjcWNuX2c7CisJdTMyIGRjcWNuX2tfdXM7CisJdTMyIGRjcWNuX3RpbWVvdXRfdXM7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfc3RhcnRfaW5fcGFyYW1zIHsKKwlzdHJ1Y3QgcWVkX3JkbWFfZXZlbnRzICpldmVudHM7CisJc3RydWN0IHFlZF9yZG1hX2NucV9wYXJhbXMgY25xX3BibF9saXN0WzEyOF07CisJdTggZGVzaXJlZF9jbnE7CisJZW51bSBxZWRfcmRtYV9jcV9tb2RlIGNxX21vZGU7CisJc3RydWN0IHFlZF9yb2NlX2RjcWNuX3BhcmFtcyBkY3Fjbl9wYXJhbXM7CisJdTE2IG1heF9tdHU7CisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOworCXU4IGl3YXJwX2ZsYWdzOworfTsKKworc3RydWN0IHFlZF9yZG1hX2FkZF91c2VyX291dF9wYXJhbXMgeworCXUxNiBkcGk7CisJdTY0IGRwaV9hZGRyOworCXU2NCBkcGlfcGh5c19hZGRyOworCXUzMiBkcGlfc2l6ZTsKK307CisKK2VudW0gcm9jZV9tb2RlIHsKKwlST0NFX1YxLAorCVJPQ0VfVjJfSVBWNCwKKwlST0NFX1YyX0lQVjYsCisJTUFYX1JPQ0VfTU9ERQorfTsKKwordW5pb24gcWVkX2dpZCB7CisJdTggYnl0ZXNbMTZdOworCXUxNiB3b3Jkc1s4XTsKKwl1MzIgZHdvcmRzWzRdOworCXU2NCBxd29yZHNbMl07CisJdTMyIGlwdjRfYWRkcjsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9yZWdpc3Rlcl90aWRfaW5fcGFyYW1zIHsKKwl1MzIgaXRpZDsKKwllbnVtIHFlZF9yZG1hX3RpZF90eXBlIHRpZF90eXBlOworCXU4IGtleTsKKwl1MTYgcGQ7CisJYm9vbCBsb2NhbF9yZWFkOworCWJvb2wgbG9jYWxfd3JpdGU7CisJYm9vbCByZW1vdGVfcmVhZDsKKwlib29sIHJlbW90ZV93cml0ZTsKKwlib29sIHJlbW90ZV9hdG9taWM7CisJYm9vbCBtd19iaW5kOworCXU2NCBwYmxfcHRyOworCWJvb2wgcGJsX3R3b19sZXZlbDsKKwl1OCBwYmxfcGFnZV9zaXplX2xvZzsKKwl1OCBwYWdlX3NpemVfbG9nOworCXUzMiBmYm87CisJdTY0IGxlbmd0aDsKKwl1NjQgdmFkZHI7CisJYm9vbCB6YnZhOworCWJvb2wgcGh5X21yOworCWJvb2wgZG1hX21yOworCisJYm9vbCBkaWZfZW5hYmxlZDsKKwl1NjQgZGlmX2Vycm9yX2FkZHI7CisJdTY0IGRpZl9ydW50X2FkZHI7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfY3JlYXRlX2NxX2luX3BhcmFtcyB7CisJdTMyIGNxX2hhbmRsZV9sbzsKKwl1MzIgY3FfaGFuZGxlX2hpOworCXUzMiBjcV9zaXplOworCXUxNiBkcGk7CisJYm9vbCBwYmxfdHdvX2xldmVsOworCXU2NCBwYmxfcHRyOworCXUxNiBwYmxfbnVtX3BhZ2VzOworCXU4IHBibF9wYWdlX3NpemVfbG9nOworCXU4IGNucV9pZDsKKwl1MTYgaW50X3RpbWVvdXQ7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfY3JlYXRlX3NycV9pbl9wYXJhbXMgeworCXU2NCBwYmxfYmFzZV9hZGRyOworCXU2NCBwcm9kX3BhaXJfYWRkcjsKKwl1MTYgbnVtX3BhZ2VzOworCXUxNiBwZF9pZDsKKwl1MTYgcGFnZV9zaXplOworfTsKKworc3RydWN0IHFlZF9yZG1hX2Rlc3Ryb3lfY3FfaW5fcGFyYW1zIHsKKwl1MTYgaWNpZDsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9kZXN0cm95X2NxX291dF9wYXJhbXMgeworCXUxNiBudW1fY3Ffbm90aWY7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfY3JlYXRlX3FwX2luX3BhcmFtcyB7CisJdTMyIHFwX2hhbmRsZV9sbzsKKwl1MzIgcXBfaGFuZGxlX2hpOworCXUzMiBxcF9oYW5kbGVfYXN5bmNfbG87CisJdTMyIHFwX2hhbmRsZV9hc3luY19oaTsKKwlib29sIHVzZV9zcnE7CisJYm9vbCBzaWduYWxfYWxsOworCWJvb2wgZm1yX2FuZF9yZXNlcnZlZF9sa2V5OworCXUxNiBwZDsKKwl1MTYgZHBpOworCXUxNiBzcV9jcV9pZDsKKwl1MTYgc3FfbnVtX3BhZ2VzOworCXU2NCBzcV9wYmxfcHRyOworCXU4IG1heF9zcV9zZ2VzOworCXUxNiBycV9jcV9pZDsKKwl1MTYgcnFfbnVtX3BhZ2VzOworCXU2NCBycV9wYmxfcHRyOworCXUxNiBzcnFfaWQ7CisJdTggc3RhdHNfcXVldWU7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfY3JlYXRlX3FwX291dF9wYXJhbXMgeworCXUzMiBxcF9pZDsKKwl1MTYgaWNpZDsKKwl2b2lkICpycV9wYmxfdmlydDsKKwlkbWFfYWRkcl90IHJxX3BibF9waHlzOworCXZvaWQgKnNxX3BibF92aXJ0OworCWRtYV9hZGRyX3Qgc3FfcGJsX3BoeXM7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfbW9kaWZ5X3FwX2luX3BhcmFtcyB7CisJdTMyIG1vZGlmeV9mbGFnczsKKyNkZWZpbmUgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX05FV19TVEFURV9NQVNLICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9ORVdfU1RBVEVfU0hJRlQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1BLRVlfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9QS0VZX1NISUZUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX1JETUFfT1BTX0VOX01BU0sgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9SRE1BX09QU19FTl9TSElGVCAgICAgICAgICAgIDIKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX0RFU1RfUVBfTUFTSyAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9ERVNUX1FQX1NISUZUICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX0FERFJFU1NfVkVDVE9SX01BU0sgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9BRERSRVNTX1ZFQ1RPUl9TSElGVCAgICAgICAgIDQKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JRX1BTTl9NQVNLICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9SUV9QU05fU0hJRlQgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1NRX1BTTl9NQVNLICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9TUV9QU05fU0hJRlQgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX01BWF9SRF9BVE9NSUNfUkVRX01BU0sgICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9NQVhfUkRfQVRPTUlDX1JFUV9TSElGVCAgICAgIDcKKyNkZWZpbmUgUUVEX1JETUFfTU9ESUZZX1FQX1ZBTElEX01BWF9SRF9BVE9NSUNfUkVTUF9NQVNLICAgICAgMHgxCisjZGVmaW5lIFFFRF9SRE1BX01PRElGWV9RUF9WQUxJRF9NQVhfUkRfQVRPTUlDX1JFU1BfU0hJRlQgICAgIDgKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX0FDS19USU1FT1VUX01BU0sgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9BQ0tfVElNRU9VVF9TSElGVCAgICAgICAgICAgIDkKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX1JFVFJZX0NOVF9NQVNLICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9SRVRSWV9DTlRfU0hJRlQgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9STlJfUkVUUllfQ05UX01BU0sgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUk5SX1JFVFJZX0NOVF9TSElGVCAgICAgICAgICAxMQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfTUlOX1JOUl9OQUtfVElNRVJfTUFTSyAgICAgICAweDEKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX01JTl9STlJfTkFLX1RJTUVSX1NISUZUICAgICAgMTIKKyNkZWZpbmUgUUVEX1JPQ0VfTU9ESUZZX1FQX1ZBTElEX0UyRV9GTE9XX0NPTlRST0xfRU5fTUFTSyAgICAgMHgxCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9FMkVfRkxPV19DT05UUk9MX0VOX1NISUZUICAgIDEzCisjZGVmaW5lIFFFRF9ST0NFX01PRElGWV9RUF9WQUxJRF9ST0NFX01PREVfTUFTSyAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBRRURfUk9DRV9NT0RJRllfUVBfVkFMSURfUk9DRV9NT0RFX1NISUZUICAgICAgICAgICAgICAxNAorCisJZW51bSBxZWRfcm9jZV9xcF9zdGF0ZSBuZXdfc3RhdGU7CisJdTE2IHBrZXk7CisJYm9vbCBpbmNvbWluZ19yZG1hX3JlYWRfZW47CisJYm9vbCBpbmNvbWluZ19yZG1hX3dyaXRlX2VuOworCWJvb2wgaW5jb21pbmdfYXRvbWljX2VuOworCWJvb2wgZTJlX2Zsb3dfY29udHJvbF9lbjsKKwl1MzIgZGVzdF9xcDsKKwlib29sIGxiX2luZGljYXRpb247CisJdTE2IG10dTsKKwl1OCB0cmFmZmljX2NsYXNzX3RvczsKKwl1OCBob3BfbGltaXRfdHRsOworCXUzMiBmbG93X2xhYmVsOworCXVuaW9uIHFlZF9naWQgc2dpZDsKKwl1bmlvbiBxZWRfZ2lkIGRnaWQ7CisJdTE2IHVkcF9zcmNfcG9ydDsKKworCXUxNiB2bGFuX2lkOworCisJdTMyIHJxX3BzbjsKKwl1MzIgc3FfcHNuOworCXU4IG1heF9yZF9hdG9taWNfcmVzcDsKKwl1OCBtYXhfcmRfYXRvbWljX3JlcTsKKwl1MzIgYWNrX3RpbWVvdXQ7CisJdTggcmV0cnlfY250OworCXU4IHJucl9yZXRyeV9jbnQ7CisJdTggbWluX3Jucl9uYWtfdGltZXI7CisJYm9vbCBzcWRfYXN5bmM7CisJdTggcmVtb3RlX21hY19hZGRyWzZdOworCXU4IGxvY2FsX21hY19hZGRyWzZdOworCWJvb2wgdXNlX2xvY2FsX21hYzsKKwllbnVtIHJvY2VfbW9kZSByb2NlX21vZGU7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfcXVlcnlfcXBfb3V0X3BhcmFtcyB7CisJZW51bSBxZWRfcm9jZV9xcF9zdGF0ZSBzdGF0ZTsKKwl1MzIgcnFfcHNuOworCXUzMiBzcV9wc247CisJYm9vbCBkcmFpbmluZzsKKwl1MTYgbXR1OworCXUzMiBkZXN0X3FwOworCWJvb2wgaW5jb21pbmdfcmRtYV9yZWFkX2VuOworCWJvb2wgaW5jb21pbmdfcmRtYV93cml0ZV9lbjsKKwlib29sIGluY29taW5nX2F0b21pY19lbjsKKwlib29sIGUyZV9mbG93X2NvbnRyb2xfZW47CisJdW5pb24gcWVkX2dpZCBzZ2lkOworCXVuaW9uIHFlZF9naWQgZGdpZDsKKwl1MzIgZmxvd19sYWJlbDsKKwl1OCBob3BfbGltaXRfdHRsOworCXU4IHRyYWZmaWNfY2xhc3NfdG9zOworCXUzMiB0aW1lb3V0OworCXU4IHJucl9yZXRyeTsKKwl1OCByZXRyeV9jbnQ7CisJdTggbWluX3Jucl9uYWtfdGltZXI7CisJdTE2IHBrZXlfaW5kZXg7CisJdTggbWF4X3JkX2F0b21pYzsKKwl1OCBtYXhfZGVzdF9yZF9hdG9taWM7CisJYm9vbCBzcWRfYXN5bmM7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfY3JlYXRlX3NycV9vdXRfcGFyYW1zIHsKKwl1MTYgc3JxX2lkOworfTsKKworc3RydWN0IHFlZF9yZG1hX2Rlc3Ryb3lfc3JxX2luX3BhcmFtcyB7CisJdTE2IHNycV9pZDsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9tb2RpZnlfc3JxX2luX3BhcmFtcyB7CisJdTMyIHdxZV9saW1pdDsKKwl1MTYgc3JxX2lkOworfTsKKworc3RydWN0IHFlZF9yZG1hX3N0YXRzX291dF9wYXJhbXMgeworCXU2NCBzZW50X2J5dGVzOworCXU2NCBzZW50X3BrdHM7CisJdTY0IHJjdl9ieXRlczsKKwl1NjQgcmN2X3BrdHM7Cit9OworCitzdHJ1Y3QgcWVkX3JkbWFfY291bnRlcnNfb3V0X3BhcmFtcyB7CisJdTY0IHBkX2NvdW50OworCXU2NCBtYXhfcGQ7CisJdTY0IGRwaV9jb3VudDsKKwl1NjQgbWF4X2RwaTsKKwl1NjQgY3FfY291bnQ7CisJdTY0IG1heF9jcTsKKwl1NjQgcXBfY291bnQ7CisJdTY0IG1heF9xcDsKKwl1NjQgdGlkX2NvdW50OworCXU2NCBtYXhfdGlkOworfTsKKworI2RlZmluZSBRRURfUk9DRV9UWF9IRUFEX0ZBSUxVUkUgICAgICAgICgxKQorI2RlZmluZSBRRURfUk9DRV9UWF9GUkFHX0ZBSUxVUkUgICAgICAgICgyKQorCitzdHJ1Y3QgcWVkX3JvY2VfbGwyX2hlYWRlciB7CisJdm9pZCAqdmFkZHI7CisJZG1hX2FkZHJfdCBiYWRkcjsKKwlzaXplX3QgbGVuOworfTsKKworc3RydWN0IHFlZF9yb2NlX2xsMl9idWZmZXIgeworCWRtYV9hZGRyX3QgYmFkZHI7CisJc2l6ZV90IGxlbjsKK307CisKK3N0cnVjdCBxZWRfcm9jZV9sbDJfcGFja2V0IHsKKwlzdHJ1Y3QgcWVkX3JvY2VfbGwyX2hlYWRlciBoZWFkZXI7CisJaW50IG5fc2VnOworCXN0cnVjdCBxZWRfcm9jZV9sbDJfYnVmZmVyIHBheWxvYWRbUkRNQV9NQVhfU0dFX1BFUl9TUV9XUUVdOworCWludCByb2NlX21vZGU7CisJZW51bSBxZWRfcm9jZV9sbDJfdHhfZGVzdCB0eF9kZXN0OworfTsKKworc3RydWN0IHFlZF9yb2NlX2xsMl90eF9wYXJhbXMgeworCWludCByZXNlcnZlZDsKK307CisKK3N0cnVjdCBxZWRfcm9jZV9sbDJfcnhfcGFyYW1zIHsKKwl1MTYgdmxhbl9pZDsKKwl1OCBzbWFjW0VUSF9BTEVOXTsKKwlpbnQgcmM7Cit9OworCitzdHJ1Y3QgcWVkX3JvY2VfbGwyX2NicyB7CisJdm9pZCAoKnR4X2NiKSh2b2lkICpwZGV2LCBzdHJ1Y3QgcWVkX3JvY2VfbGwyX3BhY2tldCAqcGt0KTsKKworCXZvaWQgKCpyeF9jYikodm9pZCAqcGRldiwgc3RydWN0IHFlZF9yb2NlX2xsMl9wYWNrZXQgKnBrdCwKKwkJICAgICAgc3RydWN0IHFlZF9yb2NlX2xsMl9yeF9wYXJhbXMgKnBhcmFtcyk7Cit9OworCitzdHJ1Y3QgcWVkX3JvY2VfbGwyX3BhcmFtcyB7CisJdTE2IG1heF9yeF9idWZmZXJzOworCXUxNiBtYXhfdHhfYnVmZmVyczsKKwl1MTYgbXR1OworCXU4IG1hY19hZGRyZXNzW0VUSF9BTEVOXTsKKwlzdHJ1Y3QgcWVkX3JvY2VfbGwyX2NicyBjYnM7CisJdm9pZCAqY2JfY29va2llOworfTsKKworc3RydWN0IHFlZF9yb2NlX2xsMl9pbmZvIHsKKwl1OCBoYW5kbGU7CisJc3RydWN0IHFlZF9yb2NlX2xsMl9jYnMgY2JzOworCXU4IG1hY19hZGRyZXNzW0VUSF9BTEVOXTsKKwl2b2lkICpjYl9jb29raWU7CisKKwkvKiBMb2NrIHRvIHByb3RlY3QgbGwyICovCisJc3RydWN0IG11dGV4IGxvY2s7Cit9OworCitlbnVtIHFlZF9yZG1hX3R5cGUgeworCVFFRF9SRE1BX1RZUEVfUk9DRSwKK307CisKK3N0cnVjdCBxZWRfZGV2X3JkbWFfaW5mbyB7CisJc3RydWN0IHFlZF9kZXZfaW5mbyBjb21tb247CisJZW51bSBxZWRfcmRtYV90eXBlIHJkbWFfdHlwZTsKK307CisKK3N0cnVjdCBxZWRfcmRtYV9vcHMgeworCWNvbnN0IHN0cnVjdCBxZWRfY29tbW9uX29wcyAqY29tbW9uOworCisJaW50ICgqZmlsbF9kZXZfaW5mbykoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkgICAgIHN0cnVjdCBxZWRfZGV2X3JkbWFfaW5mbyAqaW5mbyk7CisJdm9pZCAqKCpyZG1hX2dldF9yZG1hX2N0eCkoc3RydWN0IHFlZF9kZXYgKmNkZXYpOworCisJaW50ICgqcmRtYV9pbml0KShzdHJ1Y3QgcWVkX2RldiAqZGV2LAorCQkJIHN0cnVjdCBxZWRfcmRtYV9zdGFydF9pbl9wYXJhbXMgKmlwYXJhbXMpOworCisJaW50ICgqcmRtYV9hZGRfdXNlcikodm9pZCAqcmRtYV9jeHQsCisJCQkgICAgIHN0cnVjdCBxZWRfcmRtYV9hZGRfdXNlcl9vdXRfcGFyYW1zICpvcGFyYW1zKTsKKworCXZvaWQgKCpyZG1hX3JlbW92ZV91c2VyKSh2b2lkICpyZG1hX2N4dCwgdTE2IGRwaSk7CisJaW50ICgqcmRtYV9zdG9wKSh2b2lkICpyZG1hX2N4dCk7CisJc3RydWN0IHFlZF9yZG1hX2RldmljZSogKCpyZG1hX3F1ZXJ5X2RldmljZSkodm9pZCAqcmRtYV9jeHQpOworCXN0cnVjdCBxZWRfcmRtYV9wb3J0KiAoKnJkbWFfcXVlcnlfcG9ydCkodm9pZCAqcmRtYV9jeHQpOworCWludCAoKnJkbWFfZ2V0X3N0YXJ0X3NiKShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CisJaW50ICgqcmRtYV9nZXRfbWluX2NucV9tc2l4KShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CisJdm9pZCAoKnJkbWFfY25xX3Byb2RfdXBkYXRlKSh2b2lkICpyZG1hX2N4dCwgdTggY25xX2luZGV4LCB1MTYgcHJvZCk7CisJaW50ICgqcmRtYV9nZXRfcmRtYV9pbnQpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJCSBzdHJ1Y3QgcWVkX2ludF9pbmZvICppbmZvKTsKKwlpbnQgKCpyZG1hX3NldF9yZG1hX2ludCkoc3RydWN0IHFlZF9kZXYgKmNkZXYsIHUxNiBjbnQpOworCWludCAoKnJkbWFfYWxsb2NfcGQpKHZvaWQgKnJkbWFfY3h0LCB1MTYgKnBkKTsKKwl2b2lkICgqcmRtYV9kZWFsbG9jX3BkKSh2b2lkICpyZG1hX2N4dCwgdTE2IHBkKTsKKwlpbnQgKCpyZG1hX2NyZWF0ZV9jcSkodm9pZCAqcmRtYV9jeHQsCisJCQkgICAgICBzdHJ1Y3QgcWVkX3JkbWFfY3JlYXRlX2NxX2luX3BhcmFtcyAqcGFyYW1zLAorCQkJICAgICAgdTE2ICppY2lkKTsKKwlpbnQgKCpyZG1hX2Rlc3Ryb3lfY3EpKHZvaWQgKnJkbWFfY3h0LAorCQkJICAgICAgIHN0cnVjdCBxZWRfcmRtYV9kZXN0cm95X2NxX2luX3BhcmFtcyAqaXBhcmFtcywKKwkJCSAgICAgICBzdHJ1Y3QgcWVkX3JkbWFfZGVzdHJveV9jcV9vdXRfcGFyYW1zICpvcGFyYW1zKTsKKwlzdHJ1Y3QgcWVkX3JkbWFfcXAgKgorCSgqcmRtYV9jcmVhdGVfcXApKHZvaWQgKnJkbWFfY3h0LAorCQkJICBzdHJ1Y3QgcWVkX3JkbWFfY3JlYXRlX3FwX2luX3BhcmFtcyAqaXBhcmFtcywKKwkJCSAgc3RydWN0IHFlZF9yZG1hX2NyZWF0ZV9xcF9vdXRfcGFyYW1zICpvcGFyYW1zKTsKKworCWludCAoKnJkbWFfbW9kaWZ5X3FwKSh2b2lkICpyb2NlX2N4dCwgc3RydWN0IHFlZF9yZG1hX3FwICpxcCwKKwkJCSAgICAgIHN0cnVjdCBxZWRfcmRtYV9tb2RpZnlfcXBfaW5fcGFyYW1zICppcGFyYW1zKTsKKworCWludCAoKnJkbWFfcXVlcnlfcXApKHZvaWQgKnJkbWFfY3h0LCBzdHJ1Y3QgcWVkX3JkbWFfcXAgKnFwLAorCQkJICAgICBzdHJ1Y3QgcWVkX3JkbWFfcXVlcnlfcXBfb3V0X3BhcmFtcyAqb3BhcmFtcyk7CisJaW50ICgqcmRtYV9kZXN0cm95X3FwKSh2b2lkICpyZG1hX2N4dCwgc3RydWN0IHFlZF9yZG1hX3FwICpxcCk7CisJaW50CisJKCpyZG1hX3JlZ2lzdGVyX3RpZCkodm9pZCAqcmRtYV9jeHQsCisJCQkgICAgIHN0cnVjdCBxZWRfcmRtYV9yZWdpc3Rlcl90aWRfaW5fcGFyYW1zICppcGFyYW1zKTsKKwlpbnQgKCpyZG1hX2RlcmVnaXN0ZXJfdGlkKSh2b2lkICpyZG1hX2N4dCwgdTMyIGl0aWQpOworCWludCAoKnJkbWFfYWxsb2NfdGlkKSh2b2lkICpyZG1hX2N4dCwgdTMyICppdGlkKTsKKwl2b2lkICgqcmRtYV9mcmVlX3RpZCkodm9pZCAqcmRtYV9jeHQsIHUzMiBpdGlkKTsKKwlpbnQgKCpyb2NlX2xsMl9zdGFydCkoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkgICAgICBzdHJ1Y3QgcWVkX3JvY2VfbGwyX3BhcmFtcyAqcGFyYW1zKTsKKwlpbnQgKCpyb2NlX2xsMl9zdG9wKShzdHJ1Y3QgcWVkX2RldiAqY2Rldik7CisJaW50ICgqcm9jZV9sbDJfdHgpKHN0cnVjdCBxZWRfZGV2ICpjZGV2LAorCQkJICAgc3RydWN0IHFlZF9yb2NlX2xsMl9wYWNrZXQgKnBhY2tldCwKKwkJCSAgIHN0cnVjdCBxZWRfcm9jZV9sbDJfdHhfcGFyYW1zICpwYXJhbXMpOworCWludCAoKnJvY2VfbGwyX3Bvc3RfcnhfYnVmZmVyKShzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCQkgICAgICAgc3RydWN0IHFlZF9yb2NlX2xsMl9idWZmZXIgKmJ1ZiwKKwkJCQkgICAgICAgdTY0IGNvb2tpZSwgdTggbm90aWZ5X2Z3KTsKKwlpbnQgKCpyb2NlX2xsMl9zZXRfbWFjX2ZpbHRlcikoc3RydWN0IHFlZF9kZXYgKmNkZXYsCisJCQkJICAgICAgIHU4ICpvbGRfbWFjX2FkZHJlc3MsCisJCQkJICAgICAgIHU4ICpuZXdfbWFjX2FkZHJlc3MpOworCWludCAoKnJvY2VfbGwyX3N0YXRzKShzdHJ1Y3QgcWVkX2RldiAqY2RldiwKKwkJCSAgICAgIHN0cnVjdCBxZWRfbGwyX3N0YXRzICpzdGF0cyk7Cit9OworCitjb25zdCBzdHJ1Y3QgcWVkX3JkbWFfb3BzICpxZWRfZ2V0X3JkbWFfb3BzKHZvaWQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWVkL3FlZGVfcm9jZS5oIGIvaW5jbHVkZS9saW51eC9xZWQvcWVkZV9yb2NlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmYmU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcWVkL3FlZGVfcm9jZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qIFFMb2dpYyBxZWRyIE5JQyBEcml2ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2ICBRTG9naWMgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBRRURFX1JPQ0VfSAorI2RlZmluZSBRRURFX1JPQ0VfSAorCitzdHJ1Y3QgcWVkcl9kZXY7CitzdHJ1Y3QgcWVkX2RldjsKK3N0cnVjdCBxZWRlX2RldjsKKworZW51bSBxZWRlX3JvY2VfZXZlbnQgeworCVFFREVfVVAsCisJUUVERV9ET1dOLAorCVFFREVfQ0hBTkdFX0FERFIsCisJUUVERV9DTE9TRQorfTsKKworc3RydWN0IHFlZGVfcm9jZV9ldmVudF93b3JrIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJdm9pZCAqcHRyOworCWVudW0gcWVkZV9yb2NlX2V2ZW50IGV2ZW50OworfTsKKworc3RydWN0IHFlZHJfZHJpdmVyIHsKKwl1bnNpZ25lZCBjaGFyIG5hbWVbMzJdOworCisJc3RydWN0IHFlZHJfZGV2KiAoKmFkZCkoc3RydWN0IHFlZF9kZXYgKiwgc3RydWN0IHBjaV9kZXYgKiwKKwkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBxZWRyX2RldiAqKTsKKwl2b2lkICgqbm90aWZ5KShzdHJ1Y3QgcWVkcl9kZXYgKiwgZW51bSBxZWRlX3JvY2VfZXZlbnQpOworfTsKKworLyogQVBJcyBmb3IgUm9DRSBkcml2ZXIgdG8gcmVnaXN0ZXIgY2FsbGJhY2sgaGFuZGxlcnMsCisgKiB3aGljaCB3aWxsIGJlIGludm9rZWQgd2hlbiBkZXZpY2UgaXMgYWRkZWQsIHJlbW92ZWQsIGlmdXAsIGlmZG93bgorICovCitpbnQgcWVkZV9yb2NlX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcWVkcl9kcml2ZXIgKmRydik7Cit2b2lkIHFlZGVfcm9jZV91bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcWVkcl9kcml2ZXIgKmRydik7CisKK2Jvb2wgcWVkZV9yb2NlX3N1cHBvcnRlZChzdHJ1Y3QgcWVkZV9kZXYgKmRldik7CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTkZJTklCQU5EX1FFRFIpCitpbnQgcWVkZV9yb2NlX2Rldl9hZGQoc3RydWN0IHFlZGVfZGV2ICpkZXYpOwordm9pZCBxZWRlX3JvY2VfZGV2X2V2ZW50X29wZW4oc3RydWN0IHFlZGVfZGV2ICpkZXYpOwordm9pZCBxZWRlX3JvY2VfZGV2X2V2ZW50X2Nsb3NlKHN0cnVjdCBxZWRlX2RldiAqZGV2KTsKK3ZvaWQgcWVkZV9yb2NlX2Rldl9yZW1vdmUoc3RydWN0IHFlZGVfZGV2ICpkZXYpOwordm9pZCBxZWRlX3JvY2VfZXZlbnRfY2hhbmdlYWRkcihzdHJ1Y3QgcWVkZV9kZXYgKnFlZHIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHFlZGVfcm9jZV9kZXZfYWRkKHN0cnVjdCBxZWRlX2RldiAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWVkZV9yb2NlX2Rldl9ldmVudF9vcGVuKHN0cnVjdCBxZWRlX2RldiAqZGV2KSB7fQorc3RhdGljIGlubGluZSB2b2lkIHFlZGVfcm9jZV9kZXZfZXZlbnRfY2xvc2Uoc3RydWN0IHFlZGVfZGV2ICpkZXYpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcWVkZV9yb2NlX2Rldl9yZW1vdmUoc3RydWN0IHFlZGVfZGV2ICpkZXYpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcWVkZV9yb2NlX2V2ZW50X2NoYW5nZWFkZHIoc3RydWN0IHFlZGVfZGV2ICpxZWRyKSB7fQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWVkL3JkbWFfY29tbW9uLmggYi9pbmNsdWRlL2xpbnV4L3FlZC9yZG1hX2NvbW1vbi5oCmluZGV4IDE4Nzk5MWMuLjc2NjM3MjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcWVkL3JkbWFfY29tbW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9xZWQvcmRtYV9jb21tb24uaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmluZSBSRE1BX01BWF9QRFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDY0ICogMTAyNCkKIAogI2RlZmluZSBSRE1BX05VTV9TVEFUSVNUSUNfQ09VTlRFUlMgICAgICAgICAgICAgICAgICAgICBNQVhfTlVNX1ZQT1JUUworI2RlZmluZSBSRE1BX05VTV9TVEFUSVNUSUNfQ09VTlRFUlNfQkIJCQlNQVhfTlVNX1ZQT1JUU19CQgogCiAjZGVmaW5lIFJETUFfVEFTS19UWVBFIChQUk9UT0NPTElEX1JPQ0UpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcWVkL3RjcF9jb21tb24uaCBiL2luY2x1ZGUvbGludXgvcWVkL3RjcF9jb21tb24uaAppbmRleCBhY2NiYTBlLi5kYzM4ODlkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3FlZC90Y3BfY29tbW9uLmgKKysrIGIvaW5jbHVkZS9saW51eC9xZWQvdGNwX2NvbW1vbi5oCkBAIC0xMSw2ICsxMSwxNCBAQAogCiAjZGVmaW5lIFRDUF9JTlZBTElEX1RJTUVPVVRfVkFMIC0xCiAKK3N0cnVjdCBvb29fb3BhcXVlIHsKKwlfX2xlMzIgY2lkOworCXU4IGRyb3BfaXNsZTsKKwl1OCBkcm9wX3NpemU7CisJdTggb29vX29wY29kZTsKKwl1OCBvb29faXNsZTsKK307CisKIGVudW0gdGNwX2Nvbm5lY3RfbW9kZSB7CiAJVENQX0NPTk5FQ1RfQUNUSVZFLAogCVRDUF9DT05ORUNUX1BBU1NJVkUsCkBAIC0xOCwxNCArMjYsMTAgQEAKIH07CiAKIHN0cnVjdCB0Y3BfaW5pdF9wYXJhbXMgewotCV9fbGUzMiBtYXhfY3duZDsKLQlfX2xlMTYgZHVwX2Fja190aHJlc2hvbGQ7CisJX19sZTMyIHR3b19tc2xfdGltZXI7CiAJX19sZTE2IHR4X3N3c190aW1lcjsKLQlfX2xlMTYgbWluX3J0bzsKLQlfX2xlMTYgbWluX3J0b19ydDsKLQlfX2xlMTYgbWF4X3J0bzsKIAl1OCBtYXhmaW5ydDsKLQl1OCByZXNlcnZlZFsxXTsKKwl1OCByZXNlcnZlZFs5XTsKIH07CiAKIGVudW0gdGNwX2lwX3ZlcnNpb24gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmggYi9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaAppbmRleCA0YzQ1MTA1Li41MmI5N2RiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaApAQCAtMjgwLDkgKzI4MCw5IEBACiAJCQkgICAgICBzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlKTsKIHZvaWQgKnJhZGl4X3RyZWVfZGVsZXRlX2l0ZW0oc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOwogdm9pZCAqcmFkaXhfdHJlZV9kZWxldGUoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqLCB1bnNpZ25lZCBsb25nKTsKLXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnJhZGl4X3RyZWVfcmVwbGFjZV9jbGVhcl90YWdzKAotCQkJCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCi0JCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgdm9pZCAqZW50cnkpOwordm9pZCByYWRpeF90cmVlX2NsZWFyX3RhZ3Moc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCSAgIHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsCisJCQkgICB2b2lkICoqc2xvdCk7CiB1bnNpZ25lZCBpbnQgcmFkaXhfdHJlZV9nYW5nX2xvb2t1cChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAogCQkJdm9pZCAqKnJlc3VsdHMsIHVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXgsCiAJCQl1bnNpZ25lZCBpbnQgbWF4X2l0ZW1zKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFpZC9wcS5oIGIvaW5jbHVkZS9saW51eC9yYWlkL3BxLmgKaW5kZXggYTAxMThkNS4uNGQ1N2JiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWlkL3BxLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWlkL3BxLmgKQEAgLTEwMiw3ICsxMDIsMTEgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfYXZ4MngxOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9hdngyeDI7CiBleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2F2eDJ4NDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfYXZ4NTEyeDE7CitleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2F2eDUxMngyOworZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9hdng1MTJ4NDsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfdGlsZWd4ODsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfczM5MHZ4ODsKIAogc3RydWN0IHJhaWQ2X3JlY292X2NhbGxzIHsKIAl2b2lkICgqZGF0YTIpKGludCwgc2l6ZV90LCBpbnQsIGludCwgdm9pZCAqKik7CkBAIC0xMTUsNiArMTE5LDggQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfcmVjb3ZfY2FsbHMgcmFpZDZfcmVjb3ZfaW50eDE7CiBleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X3JlY292X2NhbGxzIHJhaWQ2X3JlY292X3Nzc2UzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyByYWlkNl9yZWNvdl9hdngyOworZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyByYWlkNl9yZWNvdl9hdng1MTI7CitleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X3JlY292X2NhbGxzIHJhaWQ2X3JlY292X3MzOTB4YzsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9uZW9ueDE7CiBleHRlcm4gY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X25lb254MjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1X3N5bmMuaCBiL2luY2x1ZGUvbGludXgvcmN1X3N5bmMuaAppbmRleCBhNjNhMzNlLi5lY2U3ZWQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdV9zeW5jLmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3Vfc3luYy5oCkBAIC01OSw2ICs1OSw3IEBACiB9CiAKIGV4dGVybiB2b2lkIHJjdV9zeW5jX2luaXQoc3RydWN0IHJjdV9zeW5jICosIGVudW0gcmN1X3N5bmNfdHlwZSk7CitleHRlcm4gdm9pZCByY3Vfc3luY19lbnRlcl9zdGFydChzdHJ1Y3QgcmN1X3N5bmMgKik7CiBleHRlcm4gdm9pZCByY3Vfc3luY19lbnRlcihzdHJ1Y3QgcmN1X3N5bmMgKik7CiBleHRlcm4gdm9pZCByY3Vfc3luY19leGl0KHN0cnVjdCByY3Vfc3luYyAqKTsKIGV4dGVybiB2b2lkIHJjdV9zeW5jX2R0b3Ioc3RydWN0IHJjdV9zeW5jICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCmluZGV4IDFhYTYyZTEuLjMyMWY5ZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKQEAgLTMzNCw2ICszMzQsNyBAQAogdm9pZCByY3VfYmhfcXModm9pZCk7CiB2b2lkIHJjdV9jaGVja19jYWxsYmFja3MoaW50IHVzZXIpOwogdm9pZCByY3VfcmVwb3J0X2RlYWQodW5zaWduZWQgaW50IGNwdSk7Cit2b2lkIHJjdV9jcHVfc3RhcnRpbmcodW5zaWduZWQgaW50IGNwdSk7CiAKICNpZm5kZWYgQ09ORklHX1RJTllfUkNVCiB2b2lkIHJjdV9lbmRfaW5rZXJuZWxfYm9vdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVnbWFwLmggYi9pbmNsdWRlL2xpbnV4L3JlZ21hcC5oCmluZGV4IDJjMTJjYzUuLjlhZGM3YjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVnbWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWdtYXAuaApAQCAtMjQxLDkgKzI0MSw5IEBACiAgKiAgICAgICAgICAgICAgICByZWdpc3RlciBjYWNoZSBzdXBwb3J0KS4KICAqIEBudW1fcmVnX2RlZmF1bHRzOiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gcmVnX2RlZmF1bHRzLgogICoKLSAqIEByZWFkX2ZsYWdfbWFzazogTWFzayB0byBiZSBzZXQgaW4gdGhlIHRvcCBieXRlIG9mIHRoZSByZWdpc3RlciB3aGVuIGRvaW5nCisgKiBAcmVhZF9mbGFnX21hc2s6IE1hc2sgdG8gYmUgc2V0IGluIHRoZSB0b3AgYnl0ZXMgb2YgdGhlIHJlZ2lzdGVyIHdoZW4gZG9pbmcKICAqICAgICAgICAgICAgICAgICAgYSByZWFkLgotICogQHdyaXRlX2ZsYWdfbWFzazogTWFzayB0byBiZSBzZXQgaW4gdGhlIHRvcCBieXRlIG9mIHRoZSByZWdpc3RlciB3aGVuIGRvaW5nCisgKiBAd3JpdGVfZmxhZ19tYXNrOiBNYXNrIHRvIGJlIHNldCBpbiB0aGUgdG9wIGJ5dGVzIG9mIHRoZSByZWdpc3RlciB3aGVuIGRvaW5nCiAgKiAgICAgICAgICAgICAgICAgICBhIHdyaXRlLiBJZiBib3RoIHJlYWRfZmxhZ19tYXNrIGFuZCB3cml0ZV9mbGFnX21hc2sgYXJlCiAgKiAgICAgICAgICAgICAgICAgICBlbXB0eSB0aGUgcmVnbWFwX2J1cyBkZWZhdWx0IG1hc2tzIGFyZSB1c2VkLgogICogQHVzZV9zaW5nbGVfcnc6IElmIHNldCwgY29udmVydHMgdGhlIGJ1bGsgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucyBpbnRvCkBAIC0yOTksOCArMjk5LDggQEAKIAljb25zdCB2b2lkICpyZWdfZGVmYXVsdHNfcmF3OwogCXVuc2lnbmVkIGludCBudW1fcmVnX2RlZmF1bHRzX3JhdzsKIAotCXU4IHJlYWRfZmxhZ19tYXNrOwotCXU4IHdyaXRlX2ZsYWdfbWFzazsKKwl1bnNpZ25lZCBsb25nIHJlYWRfZmxhZ19tYXNrOworCXVuc2lnbmVkIGxvbmcgd3JpdGVfZmxhZ19tYXNrOwogCiAJYm9vbCB1c2Vfc2luZ2xlX3J3OwogCWJvb2wgY2FuX211bHRpX3dyaXRlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKaW5kZXggY2FlNTAwYi4uNjkyMTA4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCkBAIC0xNDAsOCArMTQwLDYgQEAKICAqCiAgKiBAc3VwcGx5OiAgIFRoZSBuYW1lIG9mIHRoZSBzdXBwbHkuICBJbml0aWFsaXNlZCBieSB0aGUgdXNlciBiZWZvcmUKICAqICAgICAgICAgICAgdXNpbmcgdGhlIGJ1bGsgcmVndWxhdG9yIEFQSXMuCi0gKiBAb3B0aW9uYWw6IFRoZSBzdXBwbHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3B0aW9uYWwuIEluaXRpYWxpc2VkIGJ5IHRoZSB1c2VyCi0gKiAgICAgICAgICAgIGJlZm9yZSB1c2luZyB0aGUgYnVsayByZWd1bGF0b3IgQVBJcy4KICAqIEBjb25zdW1lcjogVGhlIHJlZ3VsYXRvciBjb25zdW1lciBmb3IgdGhlIHN1cHBseS4gIFRoaXMgd2lsbCBiZSBtYW5hZ2VkCiAgKiAgICAgICAgICAgIGJ5IHRoZSBidWxrIEFQSS4KICAqCkBAIC0xNTEsNyArMTQ5LDYgQEAKICAqLwogc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgewogCWNvbnN0IGNoYXIgKnN1cHBseTsKLQlib29sIG9wdGlvbmFsOwogCXN0cnVjdCByZWd1bGF0b3IgKmNvbnN1bWVyOwogCiAJLyogcHJpdmF0ZTogSW50ZXJuYWwgdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCmluZGV4IGZjZmE0MGEuLjM3YjUzMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCkBAIC0xMTMsMTAgKzExMywxNCBAQAogICogICAgICAgICAgICAgICBzdGFiaWxpc2UgYWZ0ZXIgYmVpbmcgZW5hYmxlZCwgaW4gbWljcm9zZWNvbmRzLgogICogQHNldF9yYW1wX2RlbGF5OiBTZXQgdGhlIHJhbXAgZGVsYXkgZm9yIHRoZSByZWd1bGF0b3IuIFRoZSBkcml2ZXIgc2hvdWxkCiAgKgkJc2VsZWN0IHJhbXAgZGVsYXkgZXF1YWwgdG8gb3IgbGVzcyB0aGFuKGNsb3Nlc3QpIHJhbXBfZGVsYXkuCisgKiBAc2V0X3ZvbHRhZ2VfdGltZTogVGltZSB0YWtlbiBmb3IgdGhlIHJlZ3VsYXRvciB2b2x0YWdlIG91dHB1dCB2b2x0YWdlCisgKiAgICAgICAgICAgICAgIHRvIHN0YWJpbGlzZSBhZnRlciBiZWluZyBzZXQgdG8gYSBuZXcgdmFsdWUsIGluIG1pY3Jvc2Vjb25kcy4KKyAqICAgICAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSBmcm9tIGFuZCB0byB2b2x0YWdlIGFzIGlucHV0LCBpdAorICogICAgICAgICAgICAgICBzaG91bGQgcmV0dXJuIHRoZSB3b3JzdCBjYXNlLgogICogQHNldF92b2x0YWdlX3RpbWVfc2VsOiBUaW1lIHRha2VuIGZvciB0aGUgcmVndWxhdG9yIHZvbHRhZ2Ugb3V0cHV0IHZvbHRhZ2UKICAqICAgICAgICAgICAgICAgdG8gc3RhYmlsaXNlIGFmdGVyIGJlaW5nIHNldCB0byBhIG5ldyB2YWx1ZSwgaW4gbWljcm9zZWNvbmRzLgotICogICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIGZyb20gYW5kIHRvIHZvbHRhZ2Ugc2VsZWN0b3IsIHRoZQotICogICAgICAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSB3b3JzdCBjYXNlLgorICogICAgICAgICAgICAgICBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgdGhlIGZyb20gYW5kIHRvIHZvbHRhZ2Ugc2VsZWN0b3IgYXMKKyAqICAgICAgICAgICAgICAgaW5wdXQsIGl0IHNob3VsZCByZXR1cm4gdGhlIHdvcnN0IGNhc2UuCiAgKiBAc2V0X3NvZnRfc3RhcnQ6IEVuYWJsZSBzb2Z0IHN0YXJ0IGZvciB0aGUgcmVndWxhdG9yLgogICoKICAqIEBzZXRfc3VzcGVuZF92b2x0YWdlOiBTZXQgdGhlIHZvbHRhZ2UgZm9yIHRoZSByZWd1bGF0b3Igd2hlbiB0aGUgc3lzdGVtCkBAIC0xNjgsNiArMTcyLDggQEAKIAkvKiBUaW1lIHRha2VuIHRvIGVuYWJsZSBvciBzZXQgdm9sdGFnZSBvbiB0aGUgcmVndWxhdG9yICovCiAJaW50ICgqZW5hYmxlX3RpbWUpIChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKTsKIAlpbnQgKCpzZXRfcmFtcF9kZWxheSkgKHN0cnVjdCByZWd1bGF0b3JfZGV2ICosIGludCByYW1wX2RlbGF5KTsKKwlpbnQgKCpzZXRfdm9sdGFnZV90aW1lKSAoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKiwgaW50IG9sZF91ViwKKwkJCQkgaW50IG5ld191Vik7CiAJaW50ICgqc2V0X3ZvbHRhZ2VfdGltZV9zZWwpIChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqLAogCQkJCSAgICAgdW5zaWduZWQgaW50IG9sZF9zZWxlY3RvciwKIAkJCQkgICAgIHVuc2lnbmVkIGludCBuZXdfc2VsZWN0b3IpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWxheS5oIGIvaW5jbHVkZS9saW51eC9yZWxheS5oCmluZGV4IGQ3YzgzNTkuLmVjYmIzNGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVsYXkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlbGF5LmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAKIC8qCiAgKiBUcmFja3MgY2hhbmdlcyB0byByY2hhbi9yY2hhbl9idWYgc3RydWN0cwpAQCAtNjMsNyArNjQsNyBAQAogCXN0cnVjdCBrcmVmIGtyZWY7CQkvKiBjaGFubmVsIHJlZmNvdW50ICovCiAJdm9pZCAqcHJpdmF0ZV9kYXRhOwkJLyogZm9yIHVzZXItZGVmaW5lZCBkYXRhICovCiAJc2l6ZV90IGxhc3RfdG9vYmlnOwkJLyogdHJpZWQgdG8gbG9nIGV2ZW50ID4gc3ViYnVmIHNpemUgKi8KLQlzdHJ1Y3QgcmNoYW5fYnVmICpidWZbTlJfQ1BVU107IC8qIHBlci1jcHUgY2hhbm5lbCBidWZmZXJzICovCisJc3RydWN0IHJjaGFuX2J1ZiAqKiBfX3BlcmNwdSBidWY7IC8qIHBlci1jcHUgY2hhbm5lbCBidWZmZXJzICovCiAJaW50IGlzX2dsb2JhbDsJCQkvKiBPbmUgZ2xvYmFsIGJ1ZmZlciA/ICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogZm9yIGNoYW5uZWwgbGlzdCAqLwogCXN0cnVjdCBkZW50cnkgKnBhcmVudDsJCS8qIHBhcmVudCBkZW50cnkgcGFzc2VkIHRvIG9wZW4gKi8KQEAgLTIwNCw3ICsyMDUsNyBAQAogCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlidWYgPSBjaGFuLT5idWZbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKKwlidWYgPSAqdGhpc19jcHVfcHRyKGNoYW4tPmJ1Zik7CiAJaWYgKHVubGlrZWx5KGJ1Zi0+b2Zmc2V0ICsgbGVuZ3RoID4gY2hhbi0+c3ViYnVmX3NpemUpKQogCQlsZW5ndGggPSByZWxheV9zd2l0Y2hfc3ViYnVmKGJ1ZiwgbGVuZ3RoKTsKIAltZW1jcHkoYnVmLT5kYXRhICsgYnVmLT5vZmZzZXQsIGRhdGEsIGxlbmd0aCk7CkBAIC0yMzAsMTIgKzIzMSwxMiBAQAogewogCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKIAotCWJ1ZiA9IGNoYW4tPmJ1ZltnZXRfY3B1KCldOworCWJ1ZiA9ICpnZXRfY3B1X3B0cihjaGFuLT5idWYpOwogCWlmICh1bmxpa2VseShidWYtPm9mZnNldCArIGxlbmd0aCA+IGJ1Zi0+Y2hhbi0+c3ViYnVmX3NpemUpKQogCQlsZW5ndGggPSByZWxheV9zd2l0Y2hfc3ViYnVmKGJ1ZiwgbGVuZ3RoKTsKIAltZW1jcHkoYnVmLT5kYXRhICsgYnVmLT5vZmZzZXQsIGRhdGEsIGxlbmd0aCk7CiAJYnVmLT5vZmZzZXQgKz0gbGVuZ3RoOwotCXB1dF9jcHUoKTsKKwlwdXRfY3B1X3B0cihjaGFuLT5idWYpOwogfQogCiAvKioKQEAgLTI1MSwxNyArMjUyLDE5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqcmVsYXlfcmVzZXJ2ZShzdHJ1Y3QgcmNoYW4gKmNoYW4sIHNpemVfdCBsZW5ndGgpCiB7Ci0Jdm9pZCAqcmVzZXJ2ZWQ7Ci0Jc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gY2hhbi0+YnVmW3NtcF9wcm9jZXNzb3JfaWQoKV07CisJdm9pZCAqcmVzZXJ2ZWQgPSBOVUxMOworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZiA9ICpnZXRfY3B1X3B0cihjaGFuLT5idWYpOwogCiAJaWYgKHVubGlrZWx5KGJ1Zi0+b2Zmc2V0ICsgbGVuZ3RoID4gYnVmLT5jaGFuLT5zdWJidWZfc2l6ZSkpIHsKIAkJbGVuZ3RoID0gcmVsYXlfc3dpdGNoX3N1YmJ1ZihidWYsIGxlbmd0aCk7CiAJCWlmICghbGVuZ3RoKQotCQkJcmV0dXJuIE5VTEw7CisJCQlnb3RvIGVuZDsKIAl9CiAJcmVzZXJ2ZWQgPSBidWYtPmRhdGEgKyBidWYtPm9mZnNldDsKIAlidWYtPm9mZnNldCArPSBsZW5ndGg7CiAKK2VuZDoKKwlwdXRfY3B1X3B0cihjaGFuLT5idWYpOwogCXJldHVybiByZXNlcnZlZDsKIH0KIApAQCAtMjg1LDUgKzI4OCwxMSBAQAogICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZWxheV9maWxlX29wZXJhdGlvbnM7CiAKKyNpZmRlZiBDT05GSUdfUkVMQVkKK2ludCByZWxheV9wcmVwYXJlX2NwdSh1bnNpZ25lZCBpbnQgY3B1KTsKKyNlbHNlCisjZGVmaW5lIHJlbGF5X3ByZXBhcmVfY3B1ICAgICBOVUxMCisjZW5kaWYKKwogI2VuZGlmIC8qIF9MSU5VWF9SRUxBWV9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVtb3RlcHJvYy5oIGIvaW5jbHVkZS9saW51eC9yZW1vdGVwcm9jLmgKaW5kZXggMWM0NTdhOC4uOTMwMDIzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZW1vdGVwcm9jLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZW1vdGVwcm9jLmgKQEAgLTExOCw3ICsxMTgsNyBAQAogCVJTQ19MQVNUCT0gNCwKIH07CiAKLSNkZWZpbmUgRldfUlNDX0FERFJfQU5ZICgweEZGRkZGRkZGRkZGRkZGRkYpCisjZGVmaW5lIEZXX1JTQ19BRERSX0FOWSAoLTEpCiAKIC8qKgogICogc3RydWN0IGZ3X3JzY19jYXJ2ZW91dCAtIHBoeXNpY2FsbHkgY29udGlndW91cyBtZW1vcnkgcmVxdWVzdApAQCAtMjQxLDcgKzI0MSw3IEBACiAgKiBAbm90aWZ5aWQgaXMgYSB1bmlxdWUgcnByb2Mtd2lkZSBub3RpZnkgaW5kZXggZm9yIHRoaXMgdnJpbmcuIFRoaXMgbm90aWZ5CiAgKiBpbmRleCBpcyB1c2VkIHdoZW4ga2lja2luZyBhIHJlbW90ZSBwcm9jZXNzb3IsIHRvIGxldCBpdCBrbm93IHRoYXQgdGhpcwogICogdnJpbmcgaXMgdHJpZ2dlcmVkLgotICogQHJlc2VydmVkOiByZXNlcnZlZCAobXVzdCBiZSB6ZXJvKQorICogQHBhOiBwaHlzaWNhbCBhZGRyZXNzCiAgKgogICogVGhpcyBkZXNjcmlwdG9yIGlzIG5vdCBhIHJlc291cmNlIGVudHJ5IGJ5IGl0c2VsZjsgaXQgaXMgcGFydCBvZiB0aGUKICAqIHZkZXYgcmVzb3VyY2UgdHlwZSAoc2VlIGJlbG93KS4KQEAgLTI1NSw3ICsyNTUsNyBAQAogCXUzMiBhbGlnbjsKIAl1MzIgbnVtOwogCXUzMiBub3RpZnlpZDsKLQl1MzIgcmVzZXJ2ZWQ7CisJdTMyIHBhOwogfSBfX3BhY2tlZDsKIAogLyoqCkBAIC00MDksNyArNDA5LDYgQEAKICAqIEBtYXhfbm90aWZ5aWQ6IGxhcmdlc3QgYWxsb2NhdGVkIG5vdGlmeSBpZC4KICAqIEB0YWJsZV9wdHI6IHBvaW50ZXIgdG8gdGhlIHJlc291cmNlIHRhYmxlIGluIGVmZmVjdAogICogQGNhY2hlZF90YWJsZTogY29weSBvZiB0aGUgcmVzb3VyY2UgdGFibGUKLSAqIEB0YWJsZV9jc3VtOiBjaGVja3N1bSBvZiB0aGUgcmVzb3VyY2UgdGFibGUKICAqIEBoYXNfaW9tbXU6IGZsYWcgdG8gaW5kaWNhdGUgaWYgcmVtb3RlIHByb2Nlc3NvciBpcyBiZWhpbmQgYW4gTU1VCiAgKi8KIHN0cnVjdCBycHJvYyB7CkBAIC00MzUsMTQgKzQzNCwxNCBAQAogCXN0cnVjdCBpZHIgbm90aWZ5aWRzOwogCWludCBpbmRleDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY3Jhc2hfaGFuZGxlcjsKLQl1bnNpZ25lZCBjcmFzaF9jbnQ7CisJdW5zaWduZWQgaW50IGNyYXNoX2NudDsKIAlzdHJ1Y3QgY29tcGxldGlvbiBjcmFzaF9jb21wOwogCWJvb2wgcmVjb3ZlcnlfZGlzYWJsZWQ7CiAJaW50IG1heF9ub3RpZnlpZDsKIAlzdHJ1Y3QgcmVzb3VyY2VfdGFibGUgKnRhYmxlX3B0cjsKIAlzdHJ1Y3QgcmVzb3VyY2VfdGFibGUgKmNhY2hlZF90YWJsZTsKLQl1MzIgdGFibGVfY3N1bTsKIAlib29sIGhhc19pb21tdTsKKwlib29sIGF1dG9fYm9vdDsKIH07CiAKIC8qIHdlIGN1cnJlbnRseSBzdXBwb3J0IG9ubHkgdHdvIHZyaW5ncyBwZXIgcnZkZXYgKi8KQEAgLTQ4OSwxMSArNDg4LDEyIEBACiAKIHN0cnVjdCBycHJvYyAqcnByb2NfZ2V0X2J5X3BoYW5kbGUocGhhbmRsZSBwaGFuZGxlKTsKIHN0cnVjdCBycHJvYyAqcnByb2NfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLAotCQkJCWNvbnN0IHN0cnVjdCBycHJvY19vcHMgKm9wcywKLQkJCQljb25zdCBjaGFyICpmaXJtd2FyZSwgaW50IGxlbik7CisJCQkgIGNvbnN0IHN0cnVjdCBycHJvY19vcHMgKm9wcywKKwkJCSAgY29uc3QgY2hhciAqZmlybXdhcmUsIGludCBsZW4pOwogdm9pZCBycHJvY19wdXQoc3RydWN0IHJwcm9jICpycHJvYyk7CiBpbnQgcnByb2NfYWRkKHN0cnVjdCBycHJvYyAqcnByb2MpOwogaW50IHJwcm9jX2RlbChzdHJ1Y3QgcnByb2MgKnJwcm9jKTsKK3ZvaWQgcnByb2NfZnJlZShzdHJ1Y3QgcnByb2MgKnJwcm9jKTsKIAogaW50IHJwcm9jX2Jvb3Qoc3RydWN0IHJwcm9jICpycHJvYyk7CiB2b2lkIHJwcm9jX3NodXRkb3duKHN0cnVjdCBycHJvYyAqcnByb2MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yaGFzaHRhYmxlLmggYi9pbmNsdWRlL2xpbnV4L3JoYXNodGFibGUuaAppbmRleCAzZWVmMDgwLi41YzEzMmQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JoYXNodGFibGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JoYXNodGFibGUuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBSZXNpemFibGUsIFNjYWxhYmxlLCBDb25jdXJyZW50IEhhc2ggVGFibGUKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgogICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNCBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KICAqCkBAIC01Myw2ICs1MywxMSBAQAogCXN0cnVjdCByaGFzaF9oZWFkIF9fcmN1CQkqbmV4dDsKIH07CiAKK3N0cnVjdCByaGxpc3RfaGVhZCB7CisJc3RydWN0IHJoYXNoX2hlYWQJCXJoZWFkOworCXN0cnVjdCByaGxpc3RfaGVhZCBfX3JjdQkqbmV4dDsKK307CisKIC8qKgogICogc3RydWN0IGJ1Y2tldF90YWJsZSAtIFRhYmxlIG9mIGhhc2ggYnVja2V0cwogICogQHNpemU6IE51bWJlciBvZiBoYXNoIGJ1Y2tldHMKQEAgLTEzNyw2ICsxNDIsNyBAQAogICogQGtleV9sZW46IEtleSBsZW5ndGggZm9yIGhhc2hmbgogICogQGVsYXN0aWNpdHk6IE1heGltdW0gY2hhaW4gbGVuZ3RoIGJlZm9yZSByZWhhc2gKICAqIEBwOiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqIEByaGxpc3Q6IFRydWUgaWYgdGhpcyBpcyBhbiByaGx0YWJsZQogICogQHJ1bl93b3JrOiBEZWZlcnJlZCB3b3JrZXIgdG8gZXhwYW5kL3NocmluayBhc3luY2hyb25vdXNseQogICogQG11dGV4OiBNdXRleCB0byBwcm90ZWN0IGN1cnJlbnQvZnV0dXJlIHRhYmxlIHN3YXBwaW5nCiAgKiBAbG9jazogU3BpbiBsb2NrIHRvIHByb3RlY3Qgd2Fsa2VyIGxpc3QKQEAgLTE0NywxMiArMTUzLDIxIEBACiAJdW5zaWduZWQgaW50CQkJa2V5X2xlbjsKIAl1bnNpZ25lZCBpbnQJCQllbGFzdGljaXR5OwogCXN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcwlwOworCWJvb2wJCQkJcmhsaXN0OwogCXN0cnVjdCB3b3JrX3N0cnVjdAkJcnVuX3dvcms7CiAJc3RydWN0IG11dGV4ICAgICAgICAgICAgICAgICAgICBtdXRleDsKIAlzcGlubG9ja190CQkJbG9jazsKIH07CiAKIC8qKgorICogc3RydWN0IHJobHRhYmxlIC0gSGFzaCB0YWJsZSB3aXRoIGR1cGxpY2F0ZSBvYmplY3RzIGluIGEgbGlzdAorICogQGh0OiBVbmRlcmx5aW5nIHJodGFibGUKKyAqLworc3RydWN0IHJobHRhYmxlIHsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZSBodDsKK307CisKKy8qKgogICogc3RydWN0IHJoYXNodGFibGVfd2Fsa2VyIC0gSGFzaCB0YWJsZSB3YWxrZXIKICAqIEBsaXN0OiBMaXN0IGVudHJ5IG9uIGxpc3Qgb2Ygd2Fsa2VycwogICogQHRibDogVGhlIHRhYmxlIHRoYXQgd2Ugd2VyZSB3YWxraW5nIG92ZXIKQEAgLTE2Myw5ICsxNzgsMTAgQEAKIH07CiAKIC8qKgotICogc3RydWN0IHJoYXNodGFibGVfaXRlciAtIEhhc2ggdGFibGUgaXRlcmF0b3IsIGZpdHMgaW50byBuZXRsaW5rIGNiCisgKiBzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyIC0gSGFzaCB0YWJsZSBpdGVyYXRvcgogICogQGh0OiBUYWJsZSB0byBpdGVyYXRlIHRocm91Z2gKICAqIEBwOiBDdXJyZW50IHBvaW50ZXIKKyAqIEBsaXN0OiBDdXJyZW50IGhhc2ggbGlzdCBwb2ludGVyCiAgKiBAd2Fsa2VyOiBBc3NvY2lhdGVkIHJoYXNodGFibGUgd2Fsa2VyCiAgKiBAc2xvdDogQ3VycmVudCBzbG90CiAgKiBAc2tpcDogTnVtYmVyIG9mIGVudHJpZXMgdG8gc2tpcCBpbiBzbG90CkBAIC0xNzMsNyArMTg5LDggQEAKIHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgewogCXN0cnVjdCByaGFzaHRhYmxlICpodDsKIAlzdHJ1Y3Qgcmhhc2hfaGVhZCAqcDsKLQlzdHJ1Y3Qgcmhhc2h0YWJsZV93YWxrZXIgKndhbGtlcjsKKwlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IHJoYXNodGFibGVfd2Fsa2VyIHdhbGtlcjsKIAl1bnNpZ25lZCBpbnQgc2xvdDsKIAl1bnNpZ25lZCBpbnQgc2tpcDsKIH07CkBAIC0zMzksMTUgKzM1NiwxNCBAQAogCiBpbnQgcmhhc2h0YWJsZV9pbml0KHN0cnVjdCByaGFzaHRhYmxlICpodCwKIAkJICAgIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyAqcGFyYW1zKTsKK2ludCByaGx0YWJsZV9pbml0KHN0cnVjdCByaGx0YWJsZSAqaGx0LAorCQkgIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyAqcGFyYW1zKTsKIAotc3RydWN0IGJ1Y2tldF90YWJsZSAqcmhhc2h0YWJsZV9pbnNlcnRfc2xvdyhzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCi0JCQkJCSAgICBjb25zdCB2b2lkICprZXksCi0JCQkJCSAgICBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAotCQkJCQkgICAgc3RydWN0IGJ1Y2tldF90YWJsZSAqb2xkX3RibCk7Ci1pbnQgcmhhc2h0YWJsZV9pbnNlcnRfcmVoYXNoKHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsKTsKK3ZvaWQgKnJoYXNodGFibGVfaW5zZXJ0X3Nsb3coc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksCisJCQkgICAgIHN0cnVjdCByaGFzaF9oZWFkICpvYmopOwogCi1pbnQgcmhhc2h0YWJsZV93YWxrX2luaXQoc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyLAotCQkJIGdmcF90IGdmcCk7Cit2b2lkIHJoYXNodGFibGVfd2Fsa19lbnRlcihzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkgICBzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyKTsKIHZvaWQgcmhhc2h0YWJsZV93YWxrX2V4aXQoc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcik7CiBpbnQgcmhhc2h0YWJsZV93YWxrX3N0YXJ0KHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpIF9fYWNxdWlyZXMoUkNVKTsKIHZvaWQgKnJoYXNodGFibGVfd2Fsa19uZXh0KHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpOwpAQCAtNTA2LDYgKzUyMiwzMSBAQAogCXJodF9mb3JfZWFjaF9lbnRyeV9yY3VfY29udGludWUodHBvcywgcG9zLCAodGJsKS0+YnVja2V0c1toYXNoXSxcCiAJCQkJCXRibCwgaGFzaCwgbWVtYmVyKQogCisvKioKKyAqIHJobF9mb3JfZWFjaF9yY3UgLSBpdGVyYXRlIG92ZXIgcmN1IGhhc2ggdGFibGUgbGlzdAorICogQHBvczoJdGhlICZzdHJ1Y3Qgcmxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBsaXN0Ogl0aGUgaGVhZCBvZiB0aGUgbGlzdAorICoKKyAqIFRoaXMgaGFzaCBjaGFpbiBsaXN0LXRyYXZlcnNhbCBwcmltaXRpdmUgc2hvdWxkIGJlIHVzZWQgb24gdGhlCisgKiBsaXN0IHJldHVybmVkIGJ5IHJobHRhYmxlX2xvb2t1cC4KKyAqLworI2RlZmluZSByaGxfZm9yX2VhY2hfcmN1KHBvcywgbGlzdCkJCQkJCVwKKwlmb3IgKHBvcyA9IGxpc3Q7IHBvczsgcG9zID0gcmN1X2RlcmVmZXJlbmNlX3Jhdyhwb3MtPm5leHQpKQorCisvKioKKyAqIHJobF9mb3JfZWFjaF9lbnRyeV9yY3UgLSBpdGVyYXRlIG92ZXIgcmN1IGhhc2ggdGFibGUgbGlzdCBvZiBnaXZlbiB0eXBlCisgKiBAdHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBwb3M6CXRoZSAmc3RydWN0IHJsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbGlzdDoJdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqIEBtZW1iZXI6CW5hbWUgb2YgdGhlICZzdHJ1Y3Qgcmxpc3RfaGVhZCB3aXRoaW4gdGhlIGhhc2hhYmxlIHN0cnVjdC4KKyAqCisgKiBUaGlzIGhhc2ggY2hhaW4gbGlzdC10cmF2ZXJzYWwgcHJpbWl0aXZlIHNob3VsZCBiZSB1c2VkIG9uIHRoZQorICogbGlzdCByZXR1cm5lZCBieSByaGx0YWJsZV9sb29rdXAuCisgKi8KKyNkZWZpbmUgcmhsX2Zvcl9lYWNoX2VudHJ5X3JjdSh0cG9zLCBwb3MsIGxpc3QsIG1lbWJlcikJCQlcCisJZm9yIChwb3MgPSBsaXN0OyBwb3MgJiYgcmh0X2VudHJ5KHRwb3MsIHBvcywgbWVtYmVyKTsJCVwKKwkgICAgIHBvcyA9IHJjdV9kZXJlZmVyZW5jZV9yYXcocG9zLT5uZXh0KSkKKwogc3RhdGljIGlubGluZSBpbnQgcmhhc2h0YWJsZV9jb21wYXJlKHN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnICphcmcsCiAJCQkJICAgICBjb25zdCB2b2lkICpvYmopCiB7CkBAIC01MTUsMTggKzU1Niw4IEBACiAJcmV0dXJuIG1lbWNtcChwdHIgKyBodC0+cC5rZXlfb2Zmc2V0LCBhcmctPmtleSwgaHQtPnAua2V5X2xlbik7CiB9CiAKLS8qKgotICogcmhhc2h0YWJsZV9sb29rdXBfZmFzdCAtIHNlYXJjaCBoYXNoIHRhYmxlLCBpbmxpbmVkIHZlcnNpb24KLSAqIEBodDoJCWhhc2ggdGFibGUKLSAqIEBrZXk6CXRoZSBwb2ludGVyIHRvIHRoZSBrZXkKLSAqIEBwYXJhbXM6CWhhc2ggdGFibGUgcGFyYW1ldGVycwotICoKLSAqIENvbXB1dGVzIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUga2V5IGFuZCB0cmF2ZXJzZXMgdGhlIGJ1Y2tldCBjaGFpbiBsb29raW5nCi0gKiBmb3IgYSBlbnRyeSB3aXRoIGFuIGlkZW50aWNhbCBrZXkuIFRoZSBmaXJzdCBtYXRjaGluZyBlbnRyeSBpcyByZXR1cm5lZC4KLSAqCi0gKiBSZXR1cm5zIHRoZSBmaXJzdCBlbnRyeSBvbiB3aGljaCB0aGUgY29tcGFyZSBmdW5jdGlvbiByZXR1cm5lZCB0cnVlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgKnJoYXNodGFibGVfbG9va3VwX2Zhc3QoCisvKiBJbnRlcm5hbCBmdW5jdGlvbiwgZG8gbm90IHVzZS4gKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJoYXNoX2hlYWQgKl9fcmhhc2h0YWJsZV9sb29rdXAoCiAJc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksCiAJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKIHsKQEAgLTUzOCw4ICs1NjksNiBAQAogCXN0cnVjdCByaGFzaF9oZWFkICpoZTsKIAl1bnNpZ25lZCBpbnQgaGFzaDsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQogCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOwogcmVzdGFydDoKIAloYXNoID0gcmh0X2tleV9oYXNoZm4oaHQsIHRibCwga2V5LCBwYXJhbXMpOwpAQCAtNTQ4LDggKzU3Nyw3IEBACiAJCSAgICBwYXJhbXMub2JqX2NtcGZuKCZhcmcsIHJodF9vYmooaHQsIGhlKSkgOgogCQkgICAgcmhhc2h0YWJsZV9jb21wYXJlKCZhcmcsIHJodF9vYmooaHQsIGhlKSkpCiAJCQljb250aW51ZTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybiByaHRfb2JqKGh0LCBoZSk7CisJCXJldHVybiBoZTsKIAl9CiAKIAkvKiBFbnN1cmUgd2Ugc2VlIGFueSBuZXcgdGFibGVzLiAqLwpAQCAtNTU4LDg5ICs1ODYsMTY1IEBACiAJdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdSh0YmwtPmZ1dHVyZV90YmwsIGh0KTsKIAlpZiAodW5saWtlbHkodGJsKSkKIAkJZ290byByZXN0YXJ0OwotCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qIEludGVybmFsIGZ1bmN0aW9uLCBwbGVhc2UgdXNlIHJoYXNodGFibGVfaW5zZXJ0X2Zhc3QoKSBpbnN0ZWFkICovCi1zdGF0aWMgaW5saW5lIGludCBfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoCi0Jc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCisvKioKKyAqIHJoYXNodGFibGVfbG9va3VwIC0gc2VhcmNoIGhhc2ggdGFibGUKKyAqIEBodDoJCWhhc2ggdGFibGUKKyAqIEBrZXk6CXRoZSBwb2ludGVyIHRvIHRoZSBrZXkKKyAqIEBwYXJhbXM6CWhhc2ggdGFibGUgcGFyYW1ldGVycworICoKKyAqIENvbXB1dGVzIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUga2V5IGFuZCB0cmF2ZXJzZXMgdGhlIGJ1Y2tldCBjaGFpbiBsb29raW5nCisgKiBmb3IgYSBlbnRyeSB3aXRoIGFuIGlkZW50aWNhbCBrZXkuIFRoZSBmaXJzdCBtYXRjaGluZyBlbnRyeSBpcyByZXR1cm5lZC4KKyAqCisgKiBUaGlzIG11c3Qgb25seSBiZSBjYWxsZWQgdW5kZXIgdGhlIFJDVSByZWFkIGxvY2suCisgKgorICogUmV0dXJucyB0aGUgZmlyc3QgZW50cnkgb24gd2hpY2ggdGhlIGNvbXBhcmUgZnVuY3Rpb24gcmV0dXJuZWQgdHJ1ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpyaGFzaHRhYmxlX2xvb2t1cCgKKwlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwKIAljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQogeworCXN0cnVjdCByaGFzaF9oZWFkICpoZSA9IF9fcmhhc2h0YWJsZV9sb29rdXAoaHQsIGtleSwgcGFyYW1zKTsKKworCXJldHVybiBoZSA/IHJodF9vYmooaHQsIGhlKSA6IE5VTEw7Cit9CisKKy8qKgorICogcmhhc2h0YWJsZV9sb29rdXBfZmFzdCAtIHNlYXJjaCBoYXNoIHRhYmxlLCB3aXRob3V0IFJDVSByZWFkIGxvY2sKKyAqIEBodDoJCWhhc2ggdGFibGUKKyAqIEBrZXk6CXRoZSBwb2ludGVyIHRvIHRoZSBrZXkKKyAqIEBwYXJhbXM6CWhhc2ggdGFibGUgcGFyYW1ldGVycworICoKKyAqIENvbXB1dGVzIHRoZSBoYXNoIHZhbHVlIGZvciB0aGUga2V5IGFuZCB0cmF2ZXJzZXMgdGhlIGJ1Y2tldCBjaGFpbiBsb29raW5nCisgKiBmb3IgYSBlbnRyeSB3aXRoIGFuIGlkZW50aWNhbCBrZXkuIFRoZSBmaXJzdCBtYXRjaGluZyBlbnRyeSBpcyByZXR1cm5lZC4KKyAqCisgKiBPbmx5IHVzZSB0aGlzIGZ1bmN0aW9uIHdoZW4geW91IGhhdmUgb3RoZXIgbWVjaGFuaXNtcyBndWFyYW50ZWVpbmcKKyAqIHRoYXQgdGhlIG9iamVjdCB3b24ndCBnbyBhd2F5IGFmdGVyIHRoZSBSQ1UgcmVhZCBsb2NrIGlzIHJlbGVhc2VkLgorICoKKyAqIFJldHVybnMgdGhlIGZpcnN0IGVudHJ5IG9uIHdoaWNoIHRoZSBjb21wYXJlIGZ1bmN0aW9uIHJldHVybmVkIHRydWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgKKwlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQoreworCXZvaWQgKm9iajsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlvYmogPSByaGFzaHRhYmxlX2xvb2t1cChodCwga2V5LCBwYXJhbXMpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIG9iajsKK30KKworLyoqCisgKiByaGx0YWJsZV9sb29rdXAgLSBzZWFyY2ggaGFzaCBsaXN0IHRhYmxlCisgKiBAaGx0OgloYXNoIHRhYmxlCisgKiBAa2V5Ogl0aGUgcG9pbnRlciB0byB0aGUga2V5CisgKiBAcGFyYW1zOgloYXNoIHRhYmxlIHBhcmFtZXRlcnMKKyAqCisgKiBDb21wdXRlcyB0aGUgaGFzaCB2YWx1ZSBmb3IgdGhlIGtleSBhbmQgdHJhdmVyc2VzIHRoZSBidWNrZXQgY2hhaW4gbG9va2luZworICogZm9yIGEgZW50cnkgd2l0aCBhbiBpZGVudGljYWwga2V5LiAgQWxsIG1hdGNoaW5nIGVudHJpZXMgYXJlIHJldHVybmVkCisgKiBpbiBhIGxpc3QuCisgKgorICogVGhpcyBtdXN0IG9ubHkgYmUgY2FsbGVkIHVuZGVyIHRoZSBSQ1UgcmVhZCBsb2NrLgorICoKKyAqIFJldHVybnMgdGhlIGxpc3Qgb2YgZW50cmllcyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBrZXkuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJobGlzdF9oZWFkICpyaGx0YWJsZV9sb29rdXAoCisJc3RydWN0IHJobHRhYmxlICpobHQsIGNvbnN0IHZvaWQgKmtleSwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQoreworCXN0cnVjdCByaGFzaF9oZWFkICpoZSA9IF9fcmhhc2h0YWJsZV9sb29rdXAoJmhsdC0+aHQsIGtleSwgcGFyYW1zKTsKKworCXJldHVybiBoZSA/IGNvbnRhaW5lcl9vZihoZSwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCkgOiBOVUxMOworfQorCisvKiBJbnRlcm5hbCBmdW5jdGlvbiwgcGxlYXNlIHVzZSByaGFzaHRhYmxlX2luc2VydF9mYXN0KCkgaW5zdGVhZC4gVGhpcworICogZnVuY3Rpb24gcmV0dXJucyB0aGUgZXhpc3RpbmcgZWxlbWVudCBhbHJlYWR5IGluIGhhc2hlcyBpbiB0aGVyZSBpcyBhIGNsYXNoLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgYW4gZXJyb3IgdmlhIEVSUl9QVFIoKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICpfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoCisJc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCisJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcywgYm9vbCByaGxpc3QpCit7CiAJc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgYXJnID0gewogCQkuaHQgPSBodCwKIAkJLmtleSA9IGtleSwKIAl9OwotCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwgKm5ld190Ymw7CisJc3RydWN0IHJoYXNoX2hlYWQgX19yY3UgKipwcHJldjsKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CiAJc3RydWN0IHJoYXNoX2hlYWQgKmhlYWQ7CiAJc3BpbmxvY2tfdCAqbG9jazsKLQl1bnNpZ25lZCBpbnQgZWxhc3RpY2l0eTsKIAl1bnNpZ25lZCBpbnQgaGFzaDsKLQlpbnQgZXJyOworCWludCBlbGFzdGljaXR5OworCXZvaWQgKmRhdGE7CiAKLXJlc3RhcnQ6CiAJcmN1X3JlYWRfbG9jaygpOwogCiAJdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+dGJsLCBodCk7CisJaGFzaCA9IHJodF9oZWFkX2hhc2hmbihodCwgdGJsLCBvYmosIHBhcmFtcyk7CisJbG9jayA9IHJodF9idWNrZXRfbG9jayh0YmwsIGhhc2gpOworCXNwaW5fbG9ja19iaChsb2NrKTsKIAotCS8qIEFsbCBpbnNlcnRpb25zIG11c3QgZ3JhYiB0aGUgb2xkZXN0IHRhYmxlIGNvbnRhaW5pbmcKLQkgKiB0aGUgaGFzaGVkIGJ1Y2tldCB0aGF0IGlzIHlldCB0byBiZSByZWhhc2hlZC4KLQkgKi8KLQlmb3IgKDs7KSB7Ci0JCWhhc2ggPSByaHRfaGVhZF9oYXNoZm4oaHQsIHRibCwgb2JqLCBwYXJhbXMpOwotCQlsb2NrID0gcmh0X2J1Y2tldF9sb2NrKHRibCwgaGFzaCk7Ci0JCXNwaW5fbG9ja19iaChsb2NrKTsKLQotCQlpZiAodGJsLT5yZWhhc2ggPD0gaGFzaCkKLQkJCWJyZWFrOwotCisJaWYgKHVubGlrZWx5KHJodF9kZXJlZmVyZW5jZV9idWNrZXQodGJsLT5mdXR1cmVfdGJsLCB0YmwsIGhhc2gpKSkgeworc2xvd19wYXRoOgogCQlzcGluX3VubG9ja19iaChsb2NrKTsKLQkJdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdSh0YmwtPmZ1dHVyZV90YmwsIGh0KTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiByaGFzaHRhYmxlX2luc2VydF9zbG93KGh0LCBrZXksIG9iaik7CiAJfQogCi0JbmV3X3RibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UodGJsLT5mdXR1cmVfdGJsLCBodCk7Ci0JaWYgKHVubGlrZWx5KG5ld190YmwpKSB7Ci0JCXRibCA9IHJoYXNodGFibGVfaW5zZXJ0X3Nsb3coaHQsIGtleSwgb2JqLCBuZXdfdGJsKTsKLQkJaWYgKCFJU19FUlJfT1JfTlVMTCh0YmwpKQotCQkJZ290byBzbG93X3BhdGg7CisJZWxhc3RpY2l0eSA9IGh0LT5lbGFzdGljaXR5OworCXBwcmV2ID0gJnRibC0+YnVja2V0c1toYXNoXTsKKwlyaHRfZm9yX2VhY2goaGVhZCwgdGJsLCBoYXNoKSB7CisJCXN0cnVjdCByaGxpc3RfaGVhZCAqcGxpc3Q7CisJCXN0cnVjdCByaGxpc3RfaGVhZCAqbGlzdDsKIAotCQllcnIgPSBQVFJfRVJSKHRibCk7Ci0JCWdvdG8gb3V0OworCQllbGFzdGljaXR5LS07CisJCWlmICgha2V5IHx8CisJCSAgICAocGFyYW1zLm9ial9jbXBmbiA/CisJCSAgICAgcGFyYW1zLm9ial9jbXBmbigmYXJnLCByaHRfb2JqKGh0LCBoZWFkKSkgOgorCQkgICAgIHJoYXNodGFibGVfY29tcGFyZSgmYXJnLCByaHRfb2JqKGh0LCBoZWFkKSkpKQorCQkJY29udGludWU7CisKKwkJZGF0YSA9IHJodF9vYmooaHQsIGhlYWQpOworCisJCWlmICghcmhsaXN0KQorCQkJZ290byBvdXQ7CisKKworCQlsaXN0ID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCk7CisJCXBsaXN0ID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpOworCisJCVJDVV9JTklUX1BPSU5URVIobGlzdC0+bmV4dCwgcGxpc3QpOworCQloZWFkID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldChoZWFkLT5uZXh0LCB0YmwsIGhhc2gpOworCQlSQ1VfSU5JVF9QT0lOVEVSKGxpc3QtPnJoZWFkLm5leHQsIGhlYWQpOworCQlyY3VfYXNzaWduX3BvaW50ZXIoKnBwcmV2LCBvYmopOworCisJCWdvdG8gZ29vZDsKIAl9CiAKLQllcnIgPSAtRTJCSUc7CisJaWYgKGVsYXN0aWNpdHkgPD0gMCkKKwkJZ290byBzbG93X3BhdGg7CisKKwlkYXRhID0gRVJSX1BUUigtRTJCSUcpOwogCWlmICh1bmxpa2VseShyaHRfZ3Jvd19hYm92ZV9tYXgoaHQsIHRibCkpKQogCQlnb3RvIG91dDsKIAotCWlmICh1bmxpa2VseShyaHRfZ3Jvd19hYm92ZV8xMDAoaHQsIHRibCkpKSB7Ci1zbG93X3BhdGg6Ci0JCXNwaW5fdW5sb2NrX2JoKGxvY2spOwotCQllcnIgPSByaGFzaHRhYmxlX2luc2VydF9yZWhhc2goaHQsIHRibCk7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCi0JZXJyID0gLUVFWElTVDsKLQllbGFzdGljaXR5ID0gaHQtPmVsYXN0aWNpdHk7Ci0Jcmh0X2Zvcl9lYWNoKGhlYWQsIHRibCwgaGFzaCkgewotCQlpZiAoa2V5ICYmCi0JCSAgICB1bmxpa2VseSghKHBhcmFtcy5vYmpfY21wZm4gPwotCQkJICAgICAgIHBhcmFtcy5vYmpfY21wZm4oJmFyZywgcmh0X29iaihodCwgaGVhZCkpIDoKLQkJCSAgICAgICByaGFzaHRhYmxlX2NvbXBhcmUoJmFyZywgcmh0X29iaihodCwgaGVhZCkpKSkpCi0JCQlnb3RvIG91dDsKLQkJaWYgKCEtLWVsYXN0aWNpdHkpCi0JCQlnb3RvIHNsb3dfcGF0aDsKLQl9Ci0KLQllcnIgPSAwOworCWlmICh1bmxpa2VseShyaHRfZ3Jvd19hYm92ZV8xMDAoaHQsIHRibCkpKQorCQlnb3RvIHNsb3dfcGF0aDsKIAogCWhlYWQgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KHRibC0+YnVja2V0c1toYXNoXSwgdGJsLCBoYXNoKTsKIAogCVJDVV9JTklUX1BPSU5URVIob2JqLT5uZXh0LCBoZWFkKTsKKwlpZiAocmhsaXN0KSB7CisJCXN0cnVjdCByaGxpc3RfaGVhZCAqbGlzdDsKKworCQlsaXN0ID0gY29udGFpbmVyX29mKG9iaiwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCk7CisJCVJDVV9JTklUX1BPSU5URVIobGlzdC0+bmV4dCwgTlVMTCk7CisJfQogCiAJcmN1X2Fzc2lnbl9wb2ludGVyKHRibC0+YnVja2V0c1toYXNoXSwgb2JqKTsKIApAQCAtNjQ4LDExICs3NTIsMTQgQEAKIAlpZiAocmh0X2dyb3dfYWJvdmVfNzUoaHQsIHRibCkpCiAJCXNjaGVkdWxlX3dvcmsoJmh0LT5ydW5fd29yayk7CiAKK2dvb2Q6CisJZGF0YSA9IE5VTEw7CisKIG91dDoKIAlzcGluX3VubG9ja19iaChsb2NrKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCXJldHVybiBlcnI7CisJcmV0dXJuIGRhdGE7CiB9CiAKIC8qKgpAQCAtNjc1LDcgKzc4Miw2NSBAQAogCXN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKIAljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQogewotCXJldHVybiBfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoaHQsIE5VTEwsIG9iaiwgcGFyYW1zKTsKKwl2b2lkICpyZXQ7CisKKwlyZXQgPSBfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoaHQsIE5VTEwsIG9iaiwgcGFyYW1zLCBmYWxzZSk7CisJaWYgKElTX0VSUihyZXQpKQorCQlyZXR1cm4gUFRSX0VSUihyZXQpOworCisJcmV0dXJuIHJldCA9PSBOVUxMID8gMCA6IC1FRVhJU1Q7Cit9CisKKy8qKgorICogcmhsdGFibGVfaW5zZXJ0X2tleSAtIGluc2VydCBvYmplY3QgaW50byBoYXNoIGxpc3QgdGFibGUKKyAqIEBobHQ6CWhhc2ggbGlzdCB0YWJsZQorICogQGtleToJdGhlIHBvaW50ZXIgdG8gdGhlIGtleQorICogQGxpc3Q6CXBvaW50ZXIgdG8gaGFzaCBsaXN0IGhlYWQgaW5zaWRlIG9iamVjdAorICogQHBhcmFtczoJaGFzaCB0YWJsZSBwYXJhbWV0ZXJzCisgKgorICogV2lsbCB0YWtlIGEgcGVyIGJ1Y2tldCBzcGlubG9jayB0byBwcm90ZWN0IGFnYWluc3QgbXV0dWFsIG11dGF0aW9ucworICogb24gdGhlIHNhbWUgYnVja2V0LiBNdWx0aXBsZSBpbnNlcnRpb25zIG1heSBvY2N1ciBpbiBwYXJhbGxlbCB1bmxlc3MKKyAqIHRoZXkgbWFwIHRvIHRoZSBzYW1lIGJ1Y2tldCBsb2NrLgorICoKKyAqIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gYXRvbWljIGNvbnRleHQuCisgKgorICogV2lsbCB0cmlnZ2VyIGFuIGF1dG9tYXRpYyBkZWZlcnJlZCB0YWJsZSByZXNpemluZyBpZiB0aGUgc2l6ZSBncm93cworICogYmV5b25kIHRoZSB3YXRlcm1hcmsgaW5kaWNhdGVkIGJ5IGdyb3dfZGVjaXNpb24oKSB3aGljaCBjYW4gYmUgcGFzc2VkCisgKiB0byByaGFzaHRhYmxlX2luaXQoKS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmhsdGFibGVfaW5zZXJ0X2tleSgKKwlzdHJ1Y3QgcmhsdGFibGUgKmhsdCwgY29uc3Qgdm9pZCAqa2V5LCBzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3QsCisJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKK3sKKwlyZXR1cm4gUFRSX0VSUihfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoJmhsdC0+aHQsIGtleSwgJmxpc3QtPnJoZWFkLAorCQkJCQkJcGFyYW1zLCB0cnVlKSk7Cit9CisKKy8qKgorICogcmhsdGFibGVfaW5zZXJ0IC0gaW5zZXJ0IG9iamVjdCBpbnRvIGhhc2ggbGlzdCB0YWJsZQorICogQGhsdDoJaGFzaCBsaXN0IHRhYmxlCisgKiBAbGlzdDoJcG9pbnRlciB0byBoYXNoIGxpc3QgaGVhZCBpbnNpZGUgb2JqZWN0CisgKiBAcGFyYW1zOgloYXNoIHRhYmxlIHBhcmFtZXRlcnMKKyAqCisgKiBXaWxsIHRha2UgYSBwZXIgYnVja2V0IHNwaW5sb2NrIHRvIHByb3RlY3QgYWdhaW5zdCBtdXR1YWwgbXV0YXRpb25zCisgKiBvbiB0aGUgc2FtZSBidWNrZXQuIE11bHRpcGxlIGluc2VydGlvbnMgbWF5IG9jY3VyIGluIHBhcmFsbGVsIHVubGVzcworICogdGhleSBtYXAgdG8gdGhlIHNhbWUgYnVja2V0IGxvY2suCisgKgorICogSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhdG9taWMgY29udGV4dC4KKyAqCisgKiBXaWxsIHRyaWdnZXIgYW4gYXV0b21hdGljIGRlZmVycmVkIHRhYmxlIHJlc2l6aW5nIGlmIHRoZSBzaXplIGdyb3dzCisgKiBiZXlvbmQgdGhlIHdhdGVybWFyayBpbmRpY2F0ZWQgYnkgZ3Jvd19kZWNpc2lvbigpIHdoaWNoIGNhbiBiZSBwYXNzZWQKKyAqIHRvIHJoYXNodGFibGVfaW5pdCgpLgorICovCitzdGF0aWMgaW5saW5lIGludCByaGx0YWJsZV9pbnNlcnQoCisJc3RydWN0IHJobHRhYmxlICpobHQsIHN0cnVjdCByaGxpc3RfaGVhZCAqbGlzdCwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQoreworCWNvbnN0IGNoYXIgKmtleSA9IHJodF9vYmooJmhsdC0+aHQsICZsaXN0LT5yaGVhZCk7CisKKwlrZXkgKz0gcGFyYW1zLmtleV9vZmZzZXQ7CisKKwlyZXR1cm4gcmhsdGFibGVfaW5zZXJ0X2tleShobHQsIGtleSwgbGlzdCwgcGFyYW1zKTsKIH0KIAogLyoqCkBAIC03MDQsMTEgKzg2OSwxNiBAQAogCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCiB7CiAJY29uc3QgY2hhciAqa2V5ID0gcmh0X29iaihodCwgb2JqKTsKKwl2b2lkICpyZXQ7CiAKIAlCVUdfT04oaHQtPnAub2JqX2hhc2hmbik7CiAKLQlyZXR1cm4gX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KGh0LCBrZXkgKyBodC0+cC5rZXlfb2Zmc2V0LCBvYmosCi0JCQkJCXBhcmFtcyk7CisJcmV0ID0gX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KGh0LCBrZXkgKyBodC0+cC5rZXlfb2Zmc2V0LCBvYmosIHBhcmFtcywKKwkJCQkgICAgICAgZmFsc2UpOworCWlmIChJU19FUlIocmV0KSkKKwkJcmV0dXJuIFBUUl9FUlIocmV0KTsKKworCXJldHVybiByZXQgPT0gTlVMTCA/IDAgOiAtRUVYSVNUOwogfQogCiAvKioKQEAgLTczNywxNSArOTA3LDQyIEBACiAJc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCiAJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKIHsKKwl2b2lkICpyZXQ7CisKIAlCVUdfT04oIWh0LT5wLm9ial9oYXNoZm4gfHwgIWtleSk7CiAKLQlyZXR1cm4gX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KGh0LCBrZXksIG9iaiwgcGFyYW1zKTsKKwlyZXQgPSBfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoaHQsIGtleSwgb2JqLCBwYXJhbXMsIGZhbHNlKTsKKwlpZiAoSVNfRVJSKHJldCkpCisJCXJldHVybiBQVFJfRVJSKHJldCk7CisKKwlyZXR1cm4gcmV0ID09IE5VTEwgPyAwIDogLUVFWElTVDsKK30KKworLyoqCisgKiByaGFzaHRhYmxlX2xvb2t1cF9nZXRfaW5zZXJ0X2tleSAtIGxvb2t1cCBhbmQgaW5zZXJ0IG9iamVjdCBpbnRvIGhhc2ggdGFibGUKKyAqIEBodDoJCWhhc2ggdGFibGUKKyAqIEBvYmo6CXBvaW50ZXIgdG8gaGFzaCBoZWFkIGluc2lkZSBvYmplY3QKKyAqIEBwYXJhbXM6CWhhc2ggdGFibGUgcGFyYW1ldGVycworICogQGRhdGE6CXBvaW50ZXIgdG8gZWxlbWVudCBkYXRhIGFscmVhZHkgaW4gaGFzaGVzCisgKgorICogSnVzdCBsaWtlIHJoYXNodGFibGVfbG9va3VwX2luc2VydF9rZXkoKSwgYnV0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUKKyAqIG9iamVjdCBpZiBpdCBleGlzdHMsIE5VTEwgaWYgaXQgZG9lcyBub3QgYW5kIHRoZSBpbnNlcnRpb24gd2FzIHN1Y2Nlc3NmdWwsCisgKiBhbmQgYW4gRVJSX1BUUiBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqcmhhc2h0YWJsZV9sb29rdXBfZ2V0X2luc2VydF9rZXkoCisJc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCisJY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKK3sKKwlCVUdfT04oIWh0LT5wLm9ial9oYXNoZm4gfHwgIWtleSk7CisKKwlyZXR1cm4gX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KGh0LCBrZXksIG9iaiwgcGFyYW1zLCBmYWxzZSk7CiB9CiAKIC8qIEludGVybmFsIGZ1bmN0aW9uLCBwbGVhc2UgdXNlIHJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoKSBpbnN0ZWFkICovCi1zdGF0aWMgaW5saW5lIGludCBfX3JoYXNodGFibGVfcmVtb3ZlX2Zhc3QoCitzdGF0aWMgaW5saW5lIGludCBfX3JoYXNodGFibGVfcmVtb3ZlX2Zhc3Rfb25lKAogCXN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLAotCXN0cnVjdCByaGFzaF9oZWFkICpvYmosIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCisJc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcywKKwlib29sIHJobGlzdCkKIHsKIAlzdHJ1Y3Qgcmhhc2hfaGVhZCBfX3JjdSAqKnBwcmV2OwogCXN0cnVjdCByaGFzaF9oZWFkICpoZTsKQEAgLTc2MCwxOCArOTU3LDg2IEBACiAKIAlwcHJldiA9ICZ0YmwtPmJ1Y2tldHNbaGFzaF07CiAJcmh0X2Zvcl9lYWNoKGhlLCB0YmwsIGhhc2gpIHsKKwkJc3RydWN0IHJobGlzdF9oZWFkICpsaXN0OworCisJCWxpc3QgPSBjb250YWluZXJfb2YoaGUsIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpOworCiAJCWlmIChoZSAhPSBvYmopIHsKKwkJCXN0cnVjdCByaGxpc3RfaGVhZCBfX3JjdSAqKmxwcHJldjsKKwogCQkJcHByZXYgPSAmaGUtPm5leHQ7Ci0JCQljb250aW51ZTsKKworCQkJaWYgKCFyaGxpc3QpCisJCQkJY29udGludWU7CisKKwkJCWRvIHsKKwkJCQlscHByZXYgPSAmbGlzdC0+bmV4dDsKKwkJCQlsaXN0ID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldChsaXN0LT5uZXh0LAorCQkJCQkJCSAgICAgIHRibCwgaGFzaCk7CisJCQl9IHdoaWxlIChsaXN0ICYmIG9iaiAhPSAmbGlzdC0+cmhlYWQpOworCisJCQlpZiAoIWxpc3QpCisJCQkJY29udGludWU7CisKKwkJCWxpc3QgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KGxpc3QtPm5leHQsIHRibCwgaGFzaCk7CisJCQlSQ1VfSU5JVF9QT0lOVEVSKCpscHByZXYsIGxpc3QpOworCQkJZXJyID0gMDsKKwkJCWJyZWFrOwogCQl9CiAKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKCpwcHJldiwgb2JqLT5uZXh0KTsKLQkJZXJyID0gMDsKKwkJb2JqID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldChvYmotPm5leHQsIHRibCwgaGFzaCk7CisJCWVyciA9IDE7CisKKwkJaWYgKHJobGlzdCkgeworCQkJbGlzdCA9IHJodF9kZXJlZmVyZW5jZV9idWNrZXQobGlzdC0+bmV4dCwgdGJsLCBoYXNoKTsKKwkJCWlmIChsaXN0KSB7CisJCQkJUkNVX0lOSVRfUE9JTlRFUihsaXN0LT5yaGVhZC5uZXh0LCBvYmopOworCQkJCW9iaiA9ICZsaXN0LT5yaGVhZDsKKwkJCQllcnIgPSAwOworCQkJfQorCQl9CisKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKCpwcHJldiwgb2JqKTsKIAkJYnJlYWs7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgobG9jayk7CiAKKwlpZiAoZXJyID4gMCkgeworCQlhdG9taWNfZGVjKCZodC0+bmVsZW1zKTsKKwkJaWYgKHVubGlrZWx5KGh0LT5wLmF1dG9tYXRpY19zaHJpbmtpbmcgJiYKKwkJCSAgICAgcmh0X3Nocmlua19iZWxvd18zMChodCwgdGJsKSkpCisJCQlzY2hlZHVsZV93b3JrKCZodC0+cnVuX3dvcmspOworCQllcnIgPSAwOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKy8qIEludGVybmFsIGZ1bmN0aW9uLCBwbGVhc2UgdXNlIHJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoKSBpbnN0ZWFkICovCitzdGF0aWMgaW5saW5lIGludCBfX3JoYXNodGFibGVfcmVtb3ZlX2Zhc3QoCisJc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAorCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMsIGJvb2wgcmhsaXN0KQoreworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKKwlpbnQgZXJyOworCisJcmN1X3JlYWRfbG9jaygpOworCisJdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+dGJsLCBodCk7CisKKwkvKiBCZWNhdXNlIHdlIGhhdmUgYWxyZWFkeSB0YWtlbiAoYW5kIHJlbGVhc2VkKSB0aGUgYnVja2V0CisJICogbG9jayBpbiBvbGRfdGJsLCBpZiB3ZSBmaW5kIHRoYXQgZnV0dXJlX3RibCBpcyBub3QgeWV0CisJICogdmlzaWJsZSB0aGVuIHRoYXQgZ3VhcmFudGVlcyB0aGUgZW50cnkgdG8gc3RpbGwgYmUgaW4KKwkgKiB0aGUgb2xkIHRibCBpZiBpdCBleGlzdHMuCisJICovCisJd2hpbGUgKChlcnIgPSBfX3JoYXNodGFibGVfcmVtb3ZlX2Zhc3Rfb25lKGh0LCB0YmwsIG9iaiwgcGFyYW1zLAorCQkJCQkJICAgcmhsaXN0KSkgJiYKKwkgICAgICAgKHRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UodGJsLT5mdXR1cmVfdGJsLCBodCkpKQorCQk7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTc5NCwzNCArMTA1OSwyOSBAQAogCXN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKIAljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQogewotCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKLQlpbnQgZXJyOworCXJldHVybiBfX3JoYXNodGFibGVfcmVtb3ZlX2Zhc3QoaHQsIG9iaiwgcGFyYW1zLCBmYWxzZSk7Cit9CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT50YmwsIGh0KTsKLQotCS8qIEJlY2F1c2Ugd2UgaGF2ZSBhbHJlYWR5IHRha2VuIChhbmQgcmVsZWFzZWQpIHRoZSBidWNrZXQKLQkgKiBsb2NrIGluIG9sZF90YmwsIGlmIHdlIGZpbmQgdGhhdCBmdXR1cmVfdGJsIGlzIG5vdCB5ZXQKLQkgKiB2aXNpYmxlIHRoZW4gdGhhdCBndWFyYW50ZWVzIHRoZSBlbnRyeSB0byBzdGlsbCBiZSBpbgotCSAqIHRoZSBvbGQgdGJsIGlmIGl0IGV4aXN0cy4KLQkgKi8KLQl3aGlsZSAoKGVyciA9IF9fcmhhc2h0YWJsZV9yZW1vdmVfZmFzdChodCwgdGJsLCBvYmosIHBhcmFtcykpICYmCi0JICAgICAgICh0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KHRibC0+ZnV0dXJlX3RibCwgaHQpKSkKLQkJOwotCi0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLQlhdG9taWNfZGVjKCZodC0+bmVsZW1zKTsKLQlpZiAodW5saWtlbHkoaHQtPnAuYXV0b21hdGljX3Nocmlua2luZyAmJgotCQkgICAgIHJodF9zaHJpbmtfYmVsb3dfMzAoaHQsIHRibCkpKQotCQlzY2hlZHVsZV93b3JrKCZodC0+cnVuX3dvcmspOwotCi1vdXQ6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gZXJyOworLyoqCisgKiByaGx0YWJsZV9yZW1vdmUgLSByZW1vdmUgb2JqZWN0IGZyb20gaGFzaCBsaXN0IHRhYmxlCisgKiBAaGx0OgloYXNoIGxpc3QgdGFibGUKKyAqIEBsaXN0Oglwb2ludGVyIHRvIGhhc2ggbGlzdCBoZWFkIGluc2lkZSBvYmplY3QKKyAqIEBwYXJhbXM6CWhhc2ggdGFibGUgcGFyYW1ldGVycworICoKKyAqIFNpbmNlIHRoZSBoYXNoIGNoYWluIGlzIHNpbmdsZSBsaW5rZWQsIHRoZSByZW1vdmFsIG9wZXJhdGlvbiBuZWVkcyB0bworICogd2FsayB0aGUgYnVja2V0IGNoYWluIHVwb24gcmVtb3ZhbC4gVGhlIHJlbW92YWwgb3BlcmF0aW9uIGlzIHRodXMKKyAqIGNvbnNpZGVyYWJsZSBzbG93IGlmIHRoZSBoYXNoIHRhYmxlIGlzIG5vdCBjb3JyZWN0bHkgc2l6ZWQuCisgKgorICogV2lsbCBhdXRvbWF0aWNhbGx5IHNocmluayB0aGUgdGFibGUgdmlhIHJoYXNodGFibGVfZXhwYW5kKCkgaWYgdGhlCisgKiBzaHJpbmtfZGVjaXNpb24gZnVuY3Rpb24gc3BlY2lmaWVkIGF0IHJoYXNodGFibGVfaW5pdCgpIHJldHVybnMgdHJ1ZS4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgLUVOT0VOVCBpZiB0aGUgZW50cnkgY291bGQgbm90IGJlIGZvdW5kLgorICovCitzdGF0aWMgaW5saW5lIGludCByaGx0YWJsZV9yZW1vdmUoCisJc3RydWN0IHJobHRhYmxlICpobHQsIHN0cnVjdCByaGxpc3RfaGVhZCAqbGlzdCwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQoreworCXJldHVybiBfX3JoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJmhsdC0+aHQsICZsaXN0LT5yaGVhZCwgcGFyYW1zLCB0cnVlKTsKIH0KIAogLyogSW50ZXJuYWwgZnVuY3Rpb24sIHBsZWFzZSB1c2Ugcmhhc2h0YWJsZV9yZXBsYWNlX2Zhc3QoKSBpbnN0ZWFkICovCkBAIC05MDYsNCArMTE2Niw1OSBAQAogCXJldHVybiBlcnI7CiB9CiAKKy8qIE9ic29sZXRlIGZ1bmN0aW9uLCBkbyBub3QgdXNlIGluIG5ldyBjb2RlLiAqLworc3RhdGljIGlubGluZSBpbnQgcmhhc2h0YWJsZV93YWxrX2luaXQoc3RydWN0IHJoYXNodGFibGUgKmh0LAorCQkJCSAgICAgICBzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyLCBnZnBfdCBnZnApCit7CisJcmhhc2h0YWJsZV93YWxrX2VudGVyKGh0LCBpdGVyKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiByaGx0YWJsZV93YWxrX2VudGVyIC0gSW5pdGlhbGlzZSBhbiBpdGVyYXRvcgorICogQGhsdDoJVGFibGUgdG8gd2FsayBvdmVyCisgKiBAaXRlcjoJSGFzaCB0YWJsZSBJdGVyYXRvcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgYSBoYXNoIHRhYmxlIHdhbGsuCisgKgorICogTm90ZSB0aGF0IGlmIHlvdSByZXN0YXJ0IGEgd2FsayBhZnRlciByaGFzaHRhYmxlX3dhbGtfc3RvcCB5b3UKKyAqIG1heSBzZWUgdGhlIHNhbWUgb2JqZWN0IHR3aWNlLiAgQWxzbywgeW91IG1heSBtaXNzIG9iamVjdHMgaWYKKyAqIHRoZXJlIGFyZSByZW1vdmFscyBpbiBiZXR3ZWVuIHJoYXNodGFibGVfd2Fsa19zdG9wIGFuZCB0aGUgbmV4dAorICogY2FsbCB0byByaGFzaHRhYmxlX3dhbGtfc3RhcnQuCisgKgorICogRm9yIGEgY29tcGxldGVseSBzdGFibGUgd2FsayB5b3Ugc2hvdWxkIGNvbnN0cnVjdCB5b3VyIG93biBkYXRhCisgKiBzdHJ1Y3R1cmUgb3V0c2lkZSB0aGUgaGFzaCB0YWJsZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBzbGVlcCBzbyB5b3UgbXVzdCBub3QgY2FsbCBpdCBmcm9tIGludGVycnVwdAorICogY29udGV4dCBvciB3aXRoIHNwaW4gbG9ja3MgaGVsZC4KKyAqCisgKiBZb3UgbXVzdCBjYWxsIHJoYXNodGFibGVfd2Fsa19leGl0IGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJobHRhYmxlX3dhbGtfZW50ZXIoc3RydWN0IHJobHRhYmxlICpobHQsCisJCQkJICAgICAgIHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpCit7CisJcmV0dXJuIHJoYXNodGFibGVfd2Fsa19lbnRlcigmaGx0LT5odCwgaXRlcik7Cit9CisKKy8qKgorICogcmhsdGFibGVfZnJlZV9hbmRfZGVzdHJveSAtIGZyZWUgZWxlbWVudHMgYW5kIGRlc3Ryb3kgaGFzaCBsaXN0IHRhYmxlCisgKiBAaGx0Ogl0aGUgaGFzaCBsaXN0IHRhYmxlIHRvIGRlc3Ryb3kKKyAqIEBmcmVlX2ZuOgljYWxsYmFjayB0byByZWxlYXNlIHJlc291cmNlcyBvZiBlbGVtZW50CisgKiBAYXJnOglwb2ludGVyIHBhc3NlZCB0byBmcmVlX2ZuCisgKgorICogU2VlIGRvY3VtZW50YXRpb24gZm9yIHJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJobHRhYmxlX2ZyZWVfYW5kX2Rlc3Ryb3koc3RydWN0IHJobHRhYmxlICpobHQsCisJCQkJCSAgICAgdm9pZCAoKmZyZWVfZm4pKHZvaWQgKnB0ciwKKwkJCQkJCQkgICAgIHZvaWQgKmFyZyksCisJCQkJCSAgICAgdm9pZCAqYXJnKQoreworCXJldHVybiByaGFzaHRhYmxlX2ZyZWVfYW5kX2Rlc3Ryb3koJmhsdC0+aHQsIGZyZWVfZm4sIGFyZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByaGx0YWJsZV9kZXN0cm95KHN0cnVjdCByaGx0YWJsZSAqaGx0KQoreworCXJldHVybiByaGx0YWJsZV9mcmVlX2FuZF9kZXN0cm95KGhsdCwgTlVMTCwgTlVMTCk7Cit9CisKICNlbmRpZiAvKiBfTElOVVhfUkhBU0hUQUJMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JwbXNnLmggYi9pbmNsdWRlL2xpbnV4L3JwbXNnLmgKaW5kZXggYWRhNTBmZi4uNDUyZDM5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ycG1zZy5oCisrKyBiL2luY2x1ZGUvbGludXgvcnBtc2cuaApAQCAtNDEsNjUgKzQxLDI3IEBACiAjaW5jbHVkZSA8bGludXgva3JlZi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKLS8qIFRoZSBmZWF0dXJlIGJpdG1hcCBmb3IgdmlydGlvIHJwbXNnICovCi0jZGVmaW5lIFZJUlRJT19SUE1TR19GX05TCTAgLyogUlAgc3VwcG9ydHMgbmFtZSBzZXJ2aWNlIG5vdGlmaWNhdGlvbnMgKi8KLQotLyoqCi0gKiBzdHJ1Y3QgcnBtc2dfaGRyIC0gY29tbW9uIGhlYWRlciBmb3IgYWxsIHJwbXNnIG1lc3NhZ2VzCi0gKiBAc3JjOiBzb3VyY2UgYWRkcmVzcwotICogQGRzdDogZGVzdGluYXRpb24gYWRkcmVzcwotICogQHJlc2VydmVkOiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQotICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQgKGluIGJ5dGVzKQotICogQGZsYWdzOiBtZXNzYWdlIGZsYWdzCi0gKiBAZGF0YTogQGxlbiBieXRlcyBvZiBtZXNzYWdlIHBheWxvYWQgZGF0YQotICoKLSAqIEV2ZXJ5IG1lc3NhZ2Ugc2VudCgvcmVjZWl2ZWQpIG9uIHRoZSBycG1zZyBidXMgYmVnaW5zIHdpdGggdGhpcyBoZWFkZXIuCi0gKi8KLXN0cnVjdCBycG1zZ19oZHIgewotCXUzMiBzcmM7Ci0JdTMyIGRzdDsKLQl1MzIgcmVzZXJ2ZWQ7Ci0JdTE2IGxlbjsKLQl1MTYgZmxhZ3M7Ci0JdTggZGF0YVswXTsKLX0gX19wYWNrZWQ7Ci0KLS8qKgotICogc3RydWN0IHJwbXNnX25zX21zZyAtIGR5bmFtaWMgbmFtZSBzZXJ2aWNlIGFubm91bmNlbWVudCBtZXNzYWdlCi0gKiBAbmFtZTogbmFtZSBvZiByZW1vdGUgc2VydmljZSB0aGF0IGlzIHB1Ymxpc2hlZAotICogQGFkZHI6IGFkZHJlc3Mgb2YgcmVtb3RlIHNlcnZpY2UgdGhhdCBpcyBwdWJsaXNoZWQKLSAqIEBmbGFnczogaW5kaWNhdGVzIHdoZXRoZXIgc2VydmljZSBpcyBjcmVhdGVkIG9yIGRlc3Ryb3llZAotICoKLSAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGFjcm9zcyB0byBwdWJsaXNoIGEgbmV3IHNlcnZpY2UsIG9yIGFubm91bmNlCi0gKiBhYm91dCBpdHMgcmVtb3ZhbC4gV2hlbiB3ZSByZWNlaXZlIHRoZXNlIG1lc3NhZ2VzLCBhbiBhcHByb3ByaWF0ZQotICogcnBtc2cgY2hhbm5lbCAoaS5lIGRldmljZSkgaXMgY3JlYXRlZC9kZXN0cm95ZWQuIEluIHR1cm4sIHRoZSAtPnByb2JlKCkKLSAqIG9yIC0+cmVtb3ZlKCkgaGFuZGxlciBvZiB0aGUgYXBwcm9wcmlhdGUgcnBtc2cgZHJpdmVyIHdpbGwgYmUgaW52b2tlZAotICogKGlmL2FzLXNvb24tYXMgb25lIGlzIHJlZ2lzdGVyZWQpLgotICovCi1zdHJ1Y3QgcnBtc2dfbnNfbXNnIHsKLQljaGFyIG5hbWVbUlBNU0dfTkFNRV9TSVpFXTsKLQl1MzIgYWRkcjsKLQl1MzIgZmxhZ3M7Ci19IF9fcGFja2VkOwotCi0vKioKLSAqIGVudW0gcnBtc2dfbnNfZmxhZ3MgLSBkeW5hbWljIG5hbWUgc2VydmljZSBhbm5vdW5jZW1lbnQgZmxhZ3MKLSAqCi0gKiBAUlBNU0dfTlNfQ1JFQVRFOiBhIG5ldyByZW1vdGUgc2VydmljZSB3YXMganVzdCBjcmVhdGVkCi0gKiBAUlBNU0dfTlNfREVTVFJPWTogYSBrbm93biByZW1vdGUgc2VydmljZSB3YXMganVzdCBkZXN0cm95ZWQKLSAqLwotZW51bSBycG1zZ19uc19mbGFncyB7Ci0JUlBNU0dfTlNfQ1JFQVRFCQk9IDAsCi0JUlBNU0dfTlNfREVTVFJPWQk9IDEsCi19OwotCiAjZGVmaW5lIFJQTVNHX0FERFJfQU5ZCQkweEZGRkZGRkZGCiAKLXN0cnVjdCB2aXJ0cHJvY19pbmZvOworc3RydWN0IHJwbXNnX2RldmljZTsKK3N0cnVjdCBycG1zZ19lbmRwb2ludDsKK3N0cnVjdCBycG1zZ19kZXZpY2Vfb3BzOworc3RydWN0IHJwbXNnX2VuZHBvaW50X29wczsKIAogLyoqCi0gKiBycG1zZ19jaGFubmVsIC0gZGV2aWNlcyB0aGF0IGJlbG9uZyB0byB0aGUgcnBtc2cgYnVzIGFyZSBjYWxsZWQgY2hhbm5lbHMKLSAqIEB2cnA6IHRoZSByZW1vdGUgcHJvY2Vzc29yIHRoaXMgY2hhbm5lbCBiZWxvbmdzIHRvCisgKiBzdHJ1Y3QgcnBtc2dfY2hhbm5lbF9pbmZvIC0gY2hhbm5lbCBpbmZvIHJlcHJlc2VudGF0aW9uCisgKiBAbmFtZTogbmFtZSBvZiBzZXJ2aWNlCisgKiBAc3JjOiBsb2NhbCBhZGRyZXNzCisgKiBAZHN0OiBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKi8KK3N0cnVjdCBycG1zZ19jaGFubmVsX2luZm8geworCWNoYXIgbmFtZVtSUE1TR19OQU1FX1NJWkVdOworCXUzMiBzcmM7CisJdTMyIGRzdDsKK307CisKKy8qKgorICogcnBtc2dfZGV2aWNlIC0gZGV2aWNlIHRoYXQgYmVsb25nIHRvIHRoZSBycG1zZyBidXMKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0CiAgKiBAaWQ6IGRldmljZSBpZCAodXNlZCB0byBtYXRjaCBiZXR3ZWVuIHJwbXNnIGRyaXZlcnMgYW5kIGRldmljZXMpCiAgKiBAc3JjOiBsb2NhbCBhZGRyZXNzCkBAIC0xMDcsMTcgKzY5LDE4IEBACiAgKiBAZXB0OiB0aGUgcnBtc2cgZW5kcG9pbnQgb2YgdGhpcyBjaGFubmVsCiAgKiBAYW5ub3VuY2U6IGlmIHNldCwgcnBtc2cgd2lsbCBhbm5vdW5jZSB0aGUgY3JlYXRpb24vcmVtb3ZhbCBvZiB0aGlzIGNoYW5uZWwKICAqLwotc3RydWN0IHJwbXNnX2NoYW5uZWwgewotCXN0cnVjdCB2aXJ0cHJvY19pbmZvICp2cnA7CitzdHJ1Y3QgcnBtc2dfZGV2aWNlIHsKIAlzdHJ1Y3QgZGV2aWNlIGRldjsKIAlzdHJ1Y3QgcnBtc2dfZGV2aWNlX2lkIGlkOwogCXUzMiBzcmM7CiAJdTMyIGRzdDsKIAlzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdDsKIAlib29sIGFubm91bmNlOworCisJY29uc3Qgc3RydWN0IHJwbXNnX2RldmljZV9vcHMgKm9wczsKIH07CiAKLXR5cGVkZWYgdm9pZCAoKnJwbXNnX3J4X2NiX3QpKHN0cnVjdCBycG1zZ19jaGFubmVsICosIHZvaWQgKiwgaW50LCB2b2lkICosIHUzMik7Cit0eXBlZGVmIGludCAoKnJwbXNnX3J4X2NiX3QpKHN0cnVjdCBycG1zZ19kZXZpY2UgKiwgdm9pZCAqLCBpbnQsIHZvaWQgKiwgdTMyKTsKIAogLyoqCiAgKiBzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgLSBiaW5kcyBhIGxvY2FsIHJwbXNnIGFkZHJlc3MgdG8gaXRzIHVzZXIKQEAgLTE0MywxMiArMTA2LDE0IEBACiAgKiBjcmVhdGUgYWRkaXRpb25hbCBlbmRwb2ludHMgYnkgdGhlbXNlbHZlcyAoc2VlIHJwbXNnX2NyZWF0ZV9lcHQoKSkuCiAgKi8KIHN0cnVjdCBycG1zZ19lbmRwb2ludCB7Ci0Jc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2OworCXN0cnVjdCBycG1zZ19kZXZpY2UgKnJwZGV2OwogCXN0cnVjdCBrcmVmIHJlZmNvdW50OwogCXJwbXNnX3J4X2NiX3QgY2I7CiAJc3RydWN0IG11dGV4IGNiX2xvY2s7CiAJdTMyIGFkZHI7CiAJdm9pZCAqcHJpdjsKKworCWNvbnN0IHN0cnVjdCBycG1zZ19lbmRwb2ludF9vcHMgKm9wczsKIH07CiAKIC8qKgpAQCAtMTYyLDIwICsxMjcsMTkgQEAKIHN0cnVjdCBycG1zZ19kcml2ZXIgewogCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRydjsKIAljb25zdCBzdHJ1Y3QgcnBtc2dfZGV2aWNlX2lkICppZF90YWJsZTsKLQlpbnQgKCpwcm9iZSkoc3RydWN0IHJwbXNnX2NoYW5uZWwgKmRldik7Ci0Jdm9pZCAoKnJlbW92ZSkoc3RydWN0IHJwbXNnX2NoYW5uZWwgKmRldik7Ci0Jdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgcnBtc2dfY2hhbm5lbCAqLCB2b2lkICosIGludCwgdm9pZCAqLCB1MzIpOworCWludCAoKnByb2JlKShzdHJ1Y3QgcnBtc2dfZGV2aWNlICpkZXYpOworCXZvaWQgKCpyZW1vdmUpKHN0cnVjdCBycG1zZ19kZXZpY2UgKmRldik7CisJaW50ICgqY2FsbGJhY2spKHN0cnVjdCBycG1zZ19kZXZpY2UgKiwgdm9pZCAqLCBpbnQsIHZvaWQgKiwgdTMyKTsKIH07CiAKLWludCByZWdpc3Rlcl9ycG1zZ19kZXZpY2Uoc3RydWN0IHJwbXNnX2NoYW5uZWwgKmRldik7Ci12b2lkIHVucmVnaXN0ZXJfcnBtc2dfZGV2aWNlKHN0cnVjdCBycG1zZ19jaGFubmVsICpkZXYpOworaW50IHJlZ2lzdGVyX3JwbXNnX2RldmljZShzdHJ1Y3QgcnBtc2dfZGV2aWNlICpkZXYpOwordm9pZCB1bnJlZ2lzdGVyX3JwbXNnX2RldmljZShzdHJ1Y3QgcnBtc2dfZGV2aWNlICpkZXYpOwogaW50IF9fcmVnaXN0ZXJfcnBtc2dfZHJpdmVyKHN0cnVjdCBycG1zZ19kcml2ZXIgKmRydiwgc3RydWN0IG1vZHVsZSAqb3duZXIpOwogdm9pZCB1bnJlZ2lzdGVyX3JwbXNnX2RyaXZlcihzdHJ1Y3QgcnBtc2dfZHJpdmVyICpkcnYpOwogdm9pZCBycG1zZ19kZXN0cm95X2VwdChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKik7Ci1zdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKnJwbXNnX2NyZWF0ZV9lcHQoc3RydWN0IHJwbXNnX2NoYW5uZWwgKiwKLQkJCQlycG1zZ19yeF9jYl90IGNiLCB2b2lkICpwcml2LCB1MzIgYWRkcik7Ci1pbnQKLXJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcoc3RydWN0IHJwbXNnX2NoYW5uZWwgKiwgdTMyLCB1MzIsIHZvaWQgKiwgaW50LCBib29sKTsKK3N0cnVjdCBycG1zZ19lbmRwb2ludCAqcnBtc2dfY3JlYXRlX2VwdChzdHJ1Y3QgcnBtc2dfZGV2aWNlICosCisJCQkJCXJwbXNnX3J4X2NiX3QgY2IsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCBycG1zZ19jaGFubmVsX2luZm8gY2hpbmZvKTsKIAogLyogdXNlIGEgbWFjcm8gdG8gYXZvaWQgaW5jbHVkZSBjaGFpbmluZyB0byBnZXQgVEhJU19NT0RVTEUgKi8KICNkZWZpbmUgcmVnaXN0ZXJfcnBtc2dfZHJpdmVyKGRydikgXApAQCAtMTkzLDE1NiArMTU3LDE0IEBACiAJbW9kdWxlX2RyaXZlcihfX3JwbXNnX2RyaXZlciwgcmVnaXN0ZXJfcnBtc2dfZHJpdmVyLCBcCiAJCQl1bnJlZ2lzdGVyX3JwbXNnX2RyaXZlcikKIAotLyoqCi0gKiBycG1zZ19zZW5kKCkgLSBzZW5kIGEgbWVzc2FnZSBhY3Jvc3MgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3IKLSAqIEBycGRldjogdGhlIHJwbXNnIGNoYW5uZWwKLSAqIEBkYXRhOiBwYXlsb2FkIG9mIG1lc3NhZ2UKLSAqIEBsZW46IGxlbmd0aCBvZiBwYXlsb2FkCi0gKgotICogVGhpcyBmdW5jdGlvbiBzZW5kcyBAZGF0YSBvZiBsZW5ndGggQGxlbiBvbiB0aGUgQHJwZGV2IGNoYW5uZWwuCi0gKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2hpY2ggdGhlIEBycGRldgotICogY2hhbm5lbCBiZWxvbmdzIHRvLCB1c2luZyBAcnBkZXYncyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3Nlcy4KLSAqIEluIGNhc2UgdGhlcmUgYXJlIG5vIFRYIGJ1ZmZlcnMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbAotICogb25lIGJlY29tZXMgYXZhaWxhYmxlLCBvciBhIHRpbWVvdXQgb2YgMTUgc2Vjb25kcyBlbGFwc2VzLiBXaGVuIHRoZSBsYXR0ZXIKLSAqIGhhcHBlbnMsIC1FUkVTVEFSVFNZUyBpcyByZXR1cm5lZC4KLSAqCi0gKiBDYW4gb25seSBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgKGZvciBub3cpLgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW5saW5lIGludCBycG1zZ19zZW5kKHN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiwgdm9pZCAqZGF0YSwgaW50IGxlbikKLXsKLQl1MzIgc3JjID0gcnBkZXYtPnNyYywgZHN0ID0gcnBkZXYtPmRzdDsKK2ludCBycG1zZ19zZW5kKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKK2ludCBycG1zZ19zZW5kdG8oc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHZvaWQgKmRhdGEsIGludCBsZW4sIHUzMiBkc3QpOworaW50IHJwbXNnX3NlbmRfb2ZmY2hhbm5lbChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdTMyIHNyYywgdTMyIGRzdCwKKwkJCSAgdm9pZCAqZGF0YSwgaW50IGxlbik7CiAKLQlyZXR1cm4gcnBtc2dfc2VuZF9vZmZjaGFubmVsX3JhdyhycGRldiwgc3JjLCBkc3QsIGRhdGEsIGxlbiwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogcnBtc2dfc2VuZHRvKCkgLSBzZW5kIGEgbWVzc2FnZSBhY3Jvc3MgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3IsIHNwZWNpZnkgZHN0Ci0gKiBAcnBkZXY6IHRoZSBycG1zZyBjaGFubmVsCi0gKiBAZGF0YTogcGF5bG9hZCBvZiBtZXNzYWdlCi0gKiBAbGVuOiBsZW5ndGggb2YgcGF5bG9hZAotICogQGRzdDogZGVzdGluYXRpb24gYWRkcmVzcwotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgQGRhdGEgb2YgbGVuZ3RoIEBsZW4gdG8gdGhlIHJlbW90ZSBAZHN0IGFkZHJlc3MuCi0gKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2hpY2ggdGhlIEBycGRldgotICogY2hhbm5lbCBiZWxvbmdzIHRvLCB1c2luZyBAcnBkZXYncyBzb3VyY2UgYWRkcmVzcy4KLSAqIEluIGNhc2UgdGhlcmUgYXJlIG5vIFRYIGJ1ZmZlcnMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gd2lsbCBibG9jayB1bnRpbAotICogb25lIGJlY29tZXMgYXZhaWxhYmxlLCBvciBhIHRpbWVvdXQgb2YgMTUgc2Vjb25kcyBlbGFwc2VzLiBXaGVuIHRoZSBsYXR0ZXIKLSAqIGhhcHBlbnMsIC1FUkVTVEFSVFNZUyBpcyByZXR1cm5lZC4KLSAqCi0gKiBDYW4gb25seSBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgKGZvciBub3cpLgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW5saW5lCi1pbnQgcnBtc2dfc2VuZHRvKHN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiwgdm9pZCAqZGF0YSwgaW50IGxlbiwgdTMyIGRzdCkKLXsKLQl1MzIgc3JjID0gcnBkZXYtPnNyYzsKLQotCXJldHVybiBycG1zZ19zZW5kX29mZmNoYW5uZWxfcmF3KHJwZGV2LCBzcmMsIGRzdCwgZGF0YSwgbGVuLCB0cnVlKTsKLX0KLQotLyoqCi0gKiBycG1zZ19zZW5kX29mZmNoYW5uZWwoKSAtIHNlbmQgYSBtZXNzYWdlIHVzaW5nIGV4cGxpY2l0IHNyYy9kc3QgYWRkcmVzc2VzCi0gKiBAcnBkZXY6IHRoZSBycG1zZyBjaGFubmVsCi0gKiBAc3JjOiBzb3VyY2UgYWRkcmVzcwotICogQGRzdDogZGVzdGluYXRpb24gYWRkcmVzcwotICogQGRhdGE6IHBheWxvYWQgb2YgbWVzc2FnZQotICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIEBkYXRhIG9mIGxlbmd0aCBAbGVuIHRvIHRoZSByZW1vdGUgQGRzdCBhZGRyZXNzLAotICogYW5kIHVzZXMgQHNyYyBhcyB0aGUgc291cmNlIGFkZHJlc3MuCi0gKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2hpY2ggdGhlIEBycGRldgotICogY2hhbm5lbCBiZWxvbmdzIHRvLgotICogSW4gY2FzZSB0aGVyZSBhcmUgbm8gVFggYnVmZmVycyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsCi0gKiBvbmUgYmVjb21lcyBhdmFpbGFibGUsIG9yIGEgdGltZW91dCBvZiAxNSBzZWNvbmRzIGVsYXBzZXMuIFdoZW4gdGhlIGxhdHRlcgotICogaGFwcGVucywgLUVSRVNUQVJUU1lTIGlzIHJldHVybmVkLgotICoKLSAqIENhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCAoZm9yIG5vdykuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUKLWludCBycG1zZ19zZW5kX29mZmNoYW5uZWwoc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2LCB1MzIgc3JjLCB1MzIgZHN0LAotCQkJCQkJCXZvaWQgKmRhdGEsIGludCBsZW4pCi17Ci0JcmV0dXJuIHJwbXNnX3NlbmRfb2ZmY2hhbm5lbF9yYXcocnBkZXYsIHNyYywgZHN0LCBkYXRhLCBsZW4sIHRydWUpOwotfQotCi0vKioKLSAqIHJwbXNnX3NlbmQoKSAtIHNlbmQgYSBtZXNzYWdlIGFjcm9zcyB0byB0aGUgcmVtb3RlIHByb2Nlc3NvcgotICogQHJwZGV2OiB0aGUgcnBtc2cgY2hhbm5lbAotICogQGRhdGE6IHBheWxvYWQgb2YgbWVzc2FnZQotICogQGxlbjogbGVuZ3RoIG9mIHBheWxvYWQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNlbmRzIEBkYXRhIG9mIGxlbmd0aCBAbGVuIG9uIHRoZSBAcnBkZXYgY2hhbm5lbC4KLSAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcmVtb3RlIHByb2Nlc3NvciB3aGljaCB0aGUgQHJwZGV2Ci0gKiBjaGFubmVsIGJlbG9uZ3MgdG8sIHVzaW5nIEBycGRldidzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLgotICogSW4gY2FzZSB0aGVyZSBhcmUgbm8gVFggYnVmZmVycyBhdmFpbGFibGUsIHRoZSBmdW5jdGlvbiB3aWxsIGltbWVkaWF0ZWx5Ci0gKiByZXR1cm4gLUVOT01FTSB3aXRob3V0IHdhaXRpbmcgdW50aWwgb25lIGJlY29tZXMgYXZhaWxhYmxlLgotICoKLSAqIENhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIHByb2Nlc3MgY29udGV4dCAoZm9yIG5vdykuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGFuIGFwcHJvcHJpYXRlIGVycm9yIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUKLWludCBycG1zZ190cnlzZW5kKHN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiwgdm9pZCAqZGF0YSwgaW50IGxlbikKLXsKLQl1MzIgc3JjID0gcnBkZXYtPnNyYywgZHN0ID0gcnBkZXYtPmRzdDsKLQotCXJldHVybiBycG1zZ19zZW5kX29mZmNoYW5uZWxfcmF3KHJwZGV2LCBzcmMsIGRzdCwgZGF0YSwgbGVuLCBmYWxzZSk7Ci19Ci0KLS8qKgotICogcnBtc2dfc2VuZHRvKCkgLSBzZW5kIGEgbWVzc2FnZSBhY3Jvc3MgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3IsIHNwZWNpZnkgZHN0Ci0gKiBAcnBkZXY6IHRoZSBycG1zZyBjaGFubmVsCi0gKiBAZGF0YTogcGF5bG9hZCBvZiBtZXNzYWdlCi0gKiBAbGVuOiBsZW5ndGggb2YgcGF5bG9hZAotICogQGRzdDogZGVzdGluYXRpb24gYWRkcmVzcwotICoKLSAqIFRoaXMgZnVuY3Rpb24gc2VuZHMgQGRhdGEgb2YgbGVuZ3RoIEBsZW4gdG8gdGhlIHJlbW90ZSBAZHN0IGFkZHJlc3MuCi0gKiBUaGUgbWVzc2FnZSB3aWxsIGJlIHNlbnQgdG8gdGhlIHJlbW90ZSBwcm9jZXNzb3Igd2hpY2ggdGhlIEBycGRldgotICogY2hhbm5lbCBiZWxvbmdzIHRvLCB1c2luZyBAcnBkZXYncyBzb3VyY2UgYWRkcmVzcy4KLSAqIEluIGNhc2UgdGhlcmUgYXJlIG5vIFRYIGJ1ZmZlcnMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gd2lsbCBpbW1lZGlhdGVseQotICogcmV0dXJuIC1FTk9NRU0gd2l0aG91dCB3YWl0aW5nIHVudGlsIG9uZSBiZWNvbWVzIGF2YWlsYWJsZS4KLSAqCi0gKiBDYW4gb25seSBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgKGZvciBub3cpLgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW5saW5lCi1pbnQgcnBtc2dfdHJ5c2VuZHRvKHN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiwgdm9pZCAqZGF0YSwgaW50IGxlbiwgdTMyIGRzdCkKLXsKLQl1MzIgc3JjID0gcnBkZXYtPnNyYzsKLQotCXJldHVybiBycG1zZ19zZW5kX29mZmNoYW5uZWxfcmF3KHJwZGV2LCBzcmMsIGRzdCwgZGF0YSwgbGVuLCBmYWxzZSk7Ci19Ci0KLS8qKgotICogcnBtc2dfc2VuZF9vZmZjaGFubmVsKCkgLSBzZW5kIGEgbWVzc2FnZSB1c2luZyBleHBsaWNpdCBzcmMvZHN0IGFkZHJlc3NlcwotICogQHJwZGV2OiB0aGUgcnBtc2cgY2hhbm5lbAotICogQHNyYzogc291cmNlIGFkZHJlc3MKLSAqIEBkc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3MKLSAqIEBkYXRhOiBwYXlsb2FkIG9mIG1lc3NhZ2UKLSAqIEBsZW46IGxlbmd0aCBvZiBwYXlsb2FkCi0gKgotICogVGhpcyBmdW5jdGlvbiBzZW5kcyBAZGF0YSBvZiBsZW5ndGggQGxlbiB0byB0aGUgcmVtb3RlIEBkc3QgYWRkcmVzcywKLSAqIGFuZCB1c2VzIEBzcmMgYXMgdGhlIHNvdXJjZSBhZGRyZXNzLgotICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIHRoZSByZW1vdGUgcHJvY2Vzc29yIHdoaWNoIHRoZSBAcnBkZXYKLSAqIGNoYW5uZWwgYmVsb25ncyB0by4KLSAqIEluIGNhc2UgdGhlcmUgYXJlIG5vIFRYIGJ1ZmZlcnMgYXZhaWxhYmxlLCB0aGUgZnVuY3Rpb24gd2lsbCBpbW1lZGlhdGVseQotICogcmV0dXJuIC1FTk9NRU0gd2l0aG91dCB3YWl0aW5nIHVudGlsIG9uZSBiZWNvbWVzIGF2YWlsYWJsZS4KLSAqCi0gKiBDYW4gb25seSBiZSBjYWxsZWQgZnJvbSBwcm9jZXNzIGNvbnRleHQgKGZvciBub3cpLgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW5saW5lCi1pbnQgcnBtc2dfdHJ5c2VuZF9vZmZjaGFubmVsKHN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiwgdTMyIHNyYywgdTMyIGRzdCwKLQkJCQkJCQl2b2lkICpkYXRhLCBpbnQgbGVuKQotewotCXJldHVybiBycG1zZ19zZW5kX29mZmNoYW5uZWxfcmF3KHJwZGV2LCBzcmMsIGRzdCwgZGF0YSwgbGVuLCBmYWxzZSk7Ci19CitpbnQgcnBtc2dfdHJ5c2VuZChzdHJ1Y3QgcnBtc2dfZW5kcG9pbnQgKmVwdCwgdm9pZCAqZGF0YSwgaW50IGxlbik7CitpbnQgcnBtc2dfdHJ5c2VuZHRvKHN0cnVjdCBycG1zZ19lbmRwb2ludCAqZXB0LCB2b2lkICpkYXRhLCBpbnQgbGVuLCB1MzIgZHN0KTsKK2ludCBycG1zZ190cnlzZW5kX29mZmNoYW5uZWwoc3RydWN0IHJwbXNnX2VuZHBvaW50ICplcHQsIHUzMiBzcmMsIHUzMiBkc3QsCisJCQkgICAgIHZvaWQgKmRhdGEsIGludCBsZW4pOwogCiAjZW5kaWYgLyogX0xJTlVYX1JQTVNHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCmluZGV4IDJkYWVjZTguLjU3ZTU0ODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaApAQCAtMTA1LDcgKzEwNSw3IEBACiAJCQkgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsCi0JCQkgICAgIGludCBpZHgpOworCQkJICAgICBpbnQgKmlkeCk7CiBleHRlcm4gaW50IG5kb19kZmx0X2ZkYl9hZGQoc3RydWN0IG5kbXNnICpuZG0sCiAJCQkgICAgc3RydWN0IG5sYXR0ciAqdGJbXSwKIAkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zYml0bWFwLmggYi9pbmNsdWRlL2xpbnV4L3NiaXRtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDE3ZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zYml0bWFwLmgKQEAgLTAsMCArMSwzNzMgQEAKKy8qCisgKiBGYXN0IGFuZCBzY2FsYWJsZSBiaXRtYXBzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBGYWNlYm9vaworICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTQgSmVucyBBeGJvZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX1NDQUxFX0JJVE1BUF9ICisjZGVmaW5lIF9fTElOVVhfU0NBTEVfQklUTUFQX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworLyoqCisgKiBzdHJ1Y3Qgc2JpdG1hcF93b3JkIC0gV29yZCBpbiBhICZzdHJ1Y3Qgc2JpdG1hcC4KKyAqLworc3RydWN0IHNiaXRtYXBfd29yZCB7CisJLyoqCisJICogQHdvcmQ6IFRoZSBiaXRtYXAgd29yZCBpdHNlbGYuCisJICovCisJdW5zaWduZWQgbG9uZyB3b3JkOworCisJLyoqCisJICogQGRlcHRoOiBOdW1iZXIgb2YgYml0cyBiZWluZyB1c2VkIGluIEB3b3JkLgorCSAqLworCXVuc2lnbmVkIGxvbmcgZGVwdGg7Cit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisKKy8qKgorICogc3RydWN0IHNiaXRtYXAgLSBTY2FsYWJsZSBiaXRtYXAuCisgKgorICogQSAmc3RydWN0IHNiaXRtYXAgaXMgc3ByZWFkIG92ZXIgbXVsdGlwbGUgY2FjaGVsaW5lcyB0byBhdm9pZCBwaW5nLXBvbmcuIFRoaXMKKyAqIHRyYWRlcyBvZmYgaGlnaGVyIG1lbW9yeSB1c2FnZSBmb3IgYmV0dGVyIHNjYWxhYmlsaXR5LgorICovCitzdHJ1Y3Qgc2JpdG1hcCB7CisJLyoqCisJICogQGRlcHRoOiBOdW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZSB3aG9sZSBiaXRtYXAuCisJICovCisJdW5zaWduZWQgaW50IGRlcHRoOworCisJLyoqCisJICogQHNoaWZ0OiBsb2cyKG51bWJlciBvZiBiaXRzIHVzZWQgcGVyIHdvcmQpCisJICovCisJdW5zaWduZWQgaW50IHNoaWZ0OworCisJLyoqCisJICogQG1hcF9ucjogTnVtYmVyIG9mIHdvcmRzIChjYWNoZWxpbmVzKSBiZWluZyB1c2VkIGZvciB0aGUgYml0bWFwLgorCSAqLworCXVuc2lnbmVkIGludCBtYXBfbnI7CisKKwkvKioKKwkgKiBAbWFwOiBBbGxvY2F0ZWQgYml0bWFwLgorCSAqLworCXN0cnVjdCBzYml0bWFwX3dvcmQgKm1hcDsKK307CisKKyNkZWZpbmUgU0JRX1dBSVRfUVVFVUVTIDgKKyNkZWZpbmUgU0JRX1dBS0VfQkFUQ0ggOAorCisvKioKKyAqIHN0cnVjdCBzYnFfd2FpdF9zdGF0ZSAtIFdhaXQgcXVldWUgaW4gYSAmc3RydWN0IHNiaXRtYXBfcXVldWUuCisgKi8KK3N0cnVjdCBzYnFfd2FpdF9zdGF0ZSB7CisJLyoqCisJICogQHdhaXRfY250OiBOdW1iZXIgb2YgZnJlZXMgcmVtYWluaW5nIGJlZm9yZSB3ZSB3YWtlIHVwLgorCSAqLworCWF0b21pY190IHdhaXRfY250OworCisJLyoqCisJICogQHdhaXQ6IFdhaXQgcXVldWUuCisJICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKK30gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKKworLyoqCisgKiBzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAtIFNjYWxhYmxlIGJpdG1hcCB3aXRoIHRoZSBhZGRlZCBhYmlsaXR5IHRvIHdhaXQgb24gZnJlZQorICogYml0cy4KKyAqCisgKiBBICZzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSB1c2VzIG11bHRpcGxlIHdhaXQgcXVldWVzIGFuZCByb2xsaW5nIHdha2V1cHMgdG8KKyAqIGF2b2lkIGNvbnRlbnRpb24gb24gdGhlIHdhaXQgcXVldWUgc3BpbmxvY2suIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGRvbid0IGhpdCBhCisgKiBzY2FsYWJpbGl0eSB3YWxsIHdoZW4gd2UgcnVuIG91dCBvZiBmcmVlIGJpdHMgYW5kIGhhdmUgdG8gc3RhcnQgcHV0dGluZyB0YXNrcworICogdG8gc2xlZXAuCisgKi8KK3N0cnVjdCBzYml0bWFwX3F1ZXVlIHsKKwkvKioKKwkgKiBAc2I6IFNjYWxhYmxlIGJpdG1hcC4KKwkgKi8KKwlzdHJ1Y3Qgc2JpdG1hcCBzYjsKKworCS8qCisJICogQGFsbG9jX2hpbnQ6IENhY2hlIG9mIGxhc3Qgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCBvciBmcmVlZCBiaXQuCisJICoKKwkgKiBUaGlzIGlzIHBlci1jcHUsIHdoaWNoIGFsbG93cyBtdWx0aXBsZSB1c2VycyB0byBzdGljayB0byBkaWZmZXJlbnQKKwkgKiBjYWNoZWxpbmVzIHVudGlsIHRoZSBtYXAgaXMgZXhoYXVzdGVkLgorCSAqLworCXVuc2lnbmVkIGludCBfX3BlcmNwdSAqYWxsb2NfaGludDsKKworCS8qKgorCSAqIEB3YWtlX2JhdGNoOiBOdW1iZXIgb2YgYml0cyB3aGljaCBtdXN0IGJlIGZyZWVkIGJlZm9yZSB3ZSB3YWtlIHVwIGFueQorCSAqIHdhaXRlcnMuCisJICovCisJdW5zaWduZWQgaW50IHdha2VfYmF0Y2g7CisKKwkvKioKKwkgKiBAd2FrZV9pbmRleDogTmV4dCB3YWl0IHF1ZXVlIGluIEB3cyB0byB3YWtlIHVwLgorCSAqLworCWF0b21pY190IHdha2VfaW5kZXg7CisKKwkvKioKKwkgKiBAd3M6IFdhaXQgcXVldWVzLgorCSAqLworCXN0cnVjdCBzYnFfd2FpdF9zdGF0ZSAqd3M7CisKKwkvKioKKwkgKiBAcm91bmRfcm9iaW46IEFsbG9jYXRlIGJpdHMgaW4gc3RyaWN0IHJvdW5kLXJvYmluIG9yZGVyLgorCSAqLworCWJvb2wgcm91bmRfcm9iaW47Cit9OworCisvKioKKyAqIHNiaXRtYXBfaW5pdF9ub2RlKCkgLSBJbml0aWFsaXplIGEgJnN0cnVjdCBzYml0bWFwIG9uIGEgc3BlY2lmaWMgbWVtb3J5IG5vZGUuCisgKiBAc2I6IEJpdG1hcCB0byBpbml0aWFsaXplLgorICogQGRlcHRoOiBOdW1iZXIgb2YgYml0cyB0byBhbGxvY2F0ZS4KKyAqIEBzaGlmdDogVXNlIDJeQHNoaWZ0IGJpdHMgcGVyIHdvcmQgaW4gdGhlIGJpdG1hcDsgaWYgYSBuZWdhdGl2ZSBudW1iZXIgaWYKKyAqICAgICAgICAgZ2l2ZW4sIGEgZ29vZCBkZWZhdWx0IGlzIGNob3Nlbi4KKyAqIEBmbGFnczogQWxsb2NhdGlvbiBmbGFncy4KKyAqIEBub2RlOiBNZW1vcnkgbm9kZSB0byBhbGxvY2F0ZSBvbi4KKyAqCisgKiBSZXR1cm46IFplcm8gb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgorICovCitpbnQgc2JpdG1hcF9pbml0X25vZGUoc3RydWN0IHNiaXRtYXAgKnNiLCB1bnNpZ25lZCBpbnQgZGVwdGgsIGludCBzaGlmdCwKKwkJICAgICAgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKTsKKworLyoqCisgKiBzYml0bWFwX2ZyZWUoKSAtIEZyZWUgbWVtb3J5IHVzZWQgYnkgYSAmc3RydWN0IHNiaXRtYXAuCisgKiBAc2I6IEJpdG1hcCB0byBmcmVlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2JpdG1hcF9mcmVlKHN0cnVjdCBzYml0bWFwICpzYikKK3sKKwlrZnJlZShzYi0+bWFwKTsKKwlzYi0+bWFwID0gTlVMTDsKK30KKworLyoqCisgKiBzYml0bWFwX3Jlc2l6ZSgpIC0gUmVzaXplIGEgJnN0cnVjdCBzYml0bWFwLgorICogQHNiOiBCaXRtYXAgdG8gcmVzaXplLgorICogQGRlcHRoOiBOZXcgbnVtYmVyIG9mIGJpdHMgdG8gcmVzaXplIHRvLgorICoKKyAqIERvZXNuJ3QgcmVhbGxvY2F0ZSBhbnl0aGluZy4gSXQncyB1cCB0byB0aGUgY2FsbGVyIHRvIGVuc3VyZSB0aGF0IHRoZSBuZXcKKyAqIGRlcHRoIGRvZXNuJ3QgZXhjZWVkIHRoZSBkZXB0aCB0aGF0IHRoZSBzYiB3YXMgaW5pdGlhbGl6ZWQgd2l0aC4KKyAqLwordm9pZCBzYml0bWFwX3Jlc2l6ZShzdHJ1Y3Qgc2JpdG1hcCAqc2IsIHVuc2lnbmVkIGludCBkZXB0aCk7CisKKy8qKgorICogc2JpdG1hcF9nZXQoKSAtIFRyeSB0byBhbGxvY2F0ZSBhIGZyZWUgYml0IGZyb20gYSAmc3RydWN0IHNiaXRtYXAuCisgKiBAc2I6IEJpdG1hcCB0byBhbGxvY2F0ZSBmcm9tLgorICogQGFsbG9jX2hpbnQ6IEhpbnQgZm9yIHdoZXJlIHRvIHN0YXJ0IHNlYXJjaGluZyBmb3IgYSBmcmVlIGJpdC4KKyAqIEByb3VuZF9yb2JpbjogSWYgdHJ1ZSwgYmUgc3RyaWN0ZXIgYWJvdXQgYWxsb2NhdGlvbiBvcmRlcjsgYWx3YXlzIGFsbG9jYXRlCisgKiAgICAgICAgICAgICAgIHN0YXJ0aW5nIGZyb20gdGhlIGxhc3QgYWxsb2NhdGVkIGJpdC4gVGhpcyBpcyBsZXNzIGVmZmljaWVudAorICogICAgICAgICAgICAgICB0aGFuIHRoZSBkZWZhdWx0IGJlaGF2aW9yIChmYWxzZSkuCisgKgorICogUmV0dXJuOiBOb24tbmVnYXRpdmUgYWxsb2NhdGVkIGJpdCBudW1iZXIgaWYgc3VjY2Vzc2Z1bCwgLTEgb3RoZXJ3aXNlLgorICovCitpbnQgc2JpdG1hcF9nZXQoc3RydWN0IHNiaXRtYXAgKnNiLCB1bnNpZ25lZCBpbnQgYWxsb2NfaGludCwgYm9vbCByb3VuZF9yb2Jpbik7CisKKy8qKgorICogc2JpdG1hcF9hbnlfYml0X3NldCgpIC0gQ2hlY2sgZm9yIGEgc2V0IGJpdCBpbiBhICZzdHJ1Y3Qgc2JpdG1hcC4KKyAqIEBzYjogQml0bWFwIHRvIGNoZWNrLgorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBhbnkgYml0IGluIHRoZSBiaXRtYXAgaXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgc2JpdG1hcF9hbnlfYml0X3NldChjb25zdCBzdHJ1Y3Qgc2JpdG1hcCAqc2IpOworCisvKioKKyAqIHNiaXRtYXBfYW55X2JpdF9jbGVhcigpIC0gQ2hlY2sgZm9yIGFuIHVuc2V0IGJpdCBpbiBhICZzdHJ1Y3QKKyAqIHNiaXRtYXAuCisgKiBAc2I6IEJpdG1hcCB0byBjaGVjay4KKyAqCisgKiBSZXR1cm46IHRydWUgaWYgYW55IGJpdCBpbiB0aGUgYml0bWFwIGlzIGNsZWFyLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgc2JpdG1hcF9hbnlfYml0X2NsZWFyKGNvbnN0IHN0cnVjdCBzYml0bWFwICpzYik7CisKK3R5cGVkZWYgYm9vbCAoKnNiX2Zvcl9lYWNoX2ZuKShzdHJ1Y3Qgc2JpdG1hcCAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgKik7CisKKy8qKgorICogc2JpdG1hcF9mb3JfZWFjaF9zZXQoKSAtIEl0ZXJhdGUgb3ZlciBlYWNoIHNldCBiaXQgaW4gYSAmc3RydWN0IHNiaXRtYXAuCisgKiBAc2I6IEJpdG1hcCB0byBpdGVyYXRlIG92ZXIuCisgKiBAZm46IENhbGxiYWNrLiBTaG91bGQgcmV0dXJuIHRydWUgdG8gY29udGludWUgb3IgZmFsc2UgdG8gYnJlYWsgZWFybHkuCisgKiBAZGF0YTogUG9pbnRlciB0byBwYXNzIHRvIGNhbGxiYWNrLgorICoKKyAqIFRoaXMgaXMgaW5saW5lIGV2ZW4gdGhvdWdoIGl0J3Mgbm9uLXRyaXZpYWwgc28gdGhhdCB0aGUgZnVuY3Rpb24gY2FsbHMgdG8gdGhlCisgKiBjYWxsYmFjayB3aWxsIGhvcGVmdWxseSBnZXQgb3B0aW1pemVkIGF3YXkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzYml0bWFwX2Zvcl9lYWNoX3NldChzdHJ1Y3Qgc2JpdG1hcCAqc2IsIHNiX2Zvcl9lYWNoX2ZuIGZuLAorCQkJCQl2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNiLT5tYXBfbnI7IGkrKykgeworCQlzdHJ1Y3Qgc2JpdG1hcF93b3JkICp3b3JkID0gJnNiLT5tYXBbaV07CisJCXVuc2lnbmVkIGludCBvZmYsIG5yOworCisJCWlmICghd29yZC0+d29yZCkKKwkJCWNvbnRpbnVlOworCisJCW5yID0gMDsKKwkJb2ZmID0gaSA8PCBzYi0+c2hpZnQ7CisJCXdoaWxlICgxKSB7CisJCQluciA9IGZpbmRfbmV4dF9iaXQoJndvcmQtPndvcmQsIHdvcmQtPmRlcHRoLCBucik7CisJCQlpZiAobnIgPj0gd29yZC0+ZGVwdGgpCisJCQkJYnJlYWs7CisKKwkJCWlmICghZm4oc2IsIG9mZiArIG5yLCBkYXRhKSkKKwkJCQlyZXR1cm47CisKKwkJCW5yKys7CisJCX0KKwl9Cit9CisKKyNkZWZpbmUgU0JfTlJfVE9fSU5ERVgoc2IsIGJpdG5yKSAoKGJpdG5yKSA+PiAoc2IpLT5zaGlmdCkKKyNkZWZpbmUgU0JfTlJfVE9fQklUKHNiLCBiaXRucikgKChiaXRucikgJiAoKDFVIDw8IChzYiktPnNoaWZ0KSAtIDFVKSkKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICpfX3NiaXRtYXBfd29yZChzdHJ1Y3Qgc2JpdG1hcCAqc2IsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgYml0bnIpCit7CisJcmV0dXJuICZzYi0+bWFwW1NCX05SX1RPX0lOREVYKHNiLCBiaXRucildLndvcmQ7Cit9CisKKy8qIEhlbHBlcnMgZXF1aXZhbGVudCB0byB0aGUgb3BlcmF0aW9ucyBpbiBhc20vYml0b3BzLmggYW5kIGxpbnV4L2JpdG1hcC5oICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYml0bWFwX3NldF9iaXQoc3RydWN0IHNiaXRtYXAgKnNiLCB1bnNpZ25lZCBpbnQgYml0bnIpCit7CisJc2V0X2JpdChTQl9OUl9UT19CSVQoc2IsIGJpdG5yKSwgX19zYml0bWFwX3dvcmQoc2IsIGJpdG5yKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYml0bWFwX2NsZWFyX2JpdChzdHJ1Y3Qgc2JpdG1hcCAqc2IsIHVuc2lnbmVkIGludCBiaXRucikKK3sKKwljbGVhcl9iaXQoU0JfTlJfVE9fQklUKHNiLCBiaXRuciksIF9fc2JpdG1hcF93b3JkKHNiLCBiaXRucikpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzYml0bWFwX3Rlc3RfYml0KHN0cnVjdCBzYml0bWFwICpzYiwgdW5zaWduZWQgaW50IGJpdG5yKQoreworCXJldHVybiB0ZXN0X2JpdChTQl9OUl9UT19CSVQoc2IsIGJpdG5yKSwgX19zYml0bWFwX3dvcmQoc2IsIGJpdG5yKSk7Cit9CisKK3Vuc2lnbmVkIGludCBzYml0bWFwX3dlaWdodChjb25zdCBzdHJ1Y3Qgc2JpdG1hcCAqc2IpOworCisvKioKKyAqIHNiaXRtYXBfcXVldWVfaW5pdF9ub2RlKCkgLSBJbml0aWFsaXplIGEgJnN0cnVjdCBzYml0bWFwX3F1ZXVlIG9uIGEgc3BlY2lmaWMKKyAqIG1lbW9yeSBub2RlLgorICogQHNicTogQml0bWFwIHF1ZXVlIHRvIGluaXRpYWxpemUuCisgKiBAZGVwdGg6IFNlZSBzYml0bWFwX2luaXRfbm9kZSgpLgorICogQHNoaWZ0OiBTZWUgc2JpdG1hcF9pbml0X25vZGUoKS4KKyAqIEByb3VuZF9yb2JpbjogU2VlIHNiaXRtYXBfZ2V0KCkuCisgKiBAZmxhZ3M6IEFsbG9jYXRpb24gZmxhZ3MuCisgKiBAbm9kZTogTWVtb3J5IG5vZGUgdG8gYWxsb2NhdGUgb24uCisgKgorICogUmV0dXJuOiBaZXJvIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS4KKyAqLworaW50IHNiaXRtYXBfcXVldWVfaW5pdF9ub2RlKHN0cnVjdCBzYml0bWFwX3F1ZXVlICpzYnEsIHVuc2lnbmVkIGludCBkZXB0aCwKKwkJCSAgICBpbnQgc2hpZnQsIGJvb2wgcm91bmRfcm9iaW4sIGdmcF90IGZsYWdzLCBpbnQgbm9kZSk7CisKKy8qKgorICogc2JpdG1hcF9xdWV1ZV9mcmVlKCkgLSBGcmVlIG1lbW9yeSB1c2VkIGJ5IGEgJnN0cnVjdCBzYml0bWFwX3F1ZXVlLgorICoKKyAqIEBzYnE6IEJpdG1hcCBxdWV1ZSB0byBmcmVlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2JpdG1hcF9xdWV1ZV9mcmVlKHN0cnVjdCBzYml0bWFwX3F1ZXVlICpzYnEpCit7CisJa2ZyZWUoc2JxLT53cyk7CisJZnJlZV9wZXJjcHUoc2JxLT5hbGxvY19oaW50KTsKKwlzYml0bWFwX2ZyZWUoJnNicS0+c2IpOworfQorCisvKioKKyAqIHNiaXRtYXBfcXVldWVfcmVzaXplKCkgLSBSZXNpemUgYSAmc3RydWN0IHNiaXRtYXBfcXVldWUuCisgKiBAc2JxOiBCaXRtYXAgcXVldWUgdG8gcmVzaXplLgorICogQGRlcHRoOiBOZXcgbnVtYmVyIG9mIGJpdHMgdG8gcmVzaXplIHRvLgorICoKKyAqIExpa2Ugc2JpdG1hcF9yZXNpemUoKSwgdGhpcyBkb2Vzbid0IHJlYWxsb2NhdGUgYW55dGhpbmcuIEl0IGhhcyB0byBkbworICogc29tZSBleHRyYSB3b3JrIG9uIHRoZSAmc3RydWN0IHNiaXRtYXBfcXVldWUsIHNvIGl0J3Mgbm90IHNhZmUgdG8ganVzdAorICogcmVzaXplIHRoZSB1bmRlcmx5aW5nICZzdHJ1Y3Qgc2JpdG1hcC4KKyAqLwordm9pZCBzYml0bWFwX3F1ZXVlX3Jlc2l6ZShzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAqc2JxLCB1bnNpZ25lZCBpbnQgZGVwdGgpOworCisvKioKKyAqIF9fc2JpdG1hcF9xdWV1ZV9nZXQoKSAtIFRyeSB0byBhbGxvY2F0ZSBhIGZyZWUgYml0IGZyb20gYSAmc3RydWN0CisgKiBzYml0bWFwX3F1ZXVlIHdpdGggcHJlZW1wdGlvbiBhbHJlYWR5IGRpc2FibGVkLgorICogQHNicTogQml0bWFwIHF1ZXVlIHRvIGFsbG9jYXRlIGZyb20uCisgKgorICogUmV0dXJuOiBOb24tbmVnYXRpdmUgYWxsb2NhdGVkIGJpdCBudW1iZXIgaWYgc3VjY2Vzc2Z1bCwgLTEgb3RoZXJ3aXNlLgorICovCitpbnQgX19zYml0bWFwX3F1ZXVlX2dldChzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAqc2JxKTsKKworLyoqCisgKiBzYml0bWFwX3F1ZXVlX2dldCgpIC0gVHJ5IHRvIGFsbG9jYXRlIGEgZnJlZSBiaXQgZnJvbSBhICZzdHJ1Y3QKKyAqIHNiaXRtYXBfcXVldWUuCisgKiBAc2JxOiBCaXRtYXAgcXVldWUgdG8gYWxsb2NhdGUgZnJvbS4KKyAqIEBjcHU6IE91dHB1dCBwYXJhbWV0ZXI7IHdpbGwgY29udGFpbiB0aGUgQ1BVIHdlIHJhbiBvbiAoZS5nLiwgdG8gYmUgcGFzc2VkIHRvCisgKiAgICAgICBzYml0bWFwX3F1ZXVlX2NsZWFyKCkpLgorICoKKyAqIFJldHVybjogTm9uLW5lZ2F0aXZlIGFsbG9jYXRlZCBiaXQgbnVtYmVyIGlmIHN1Y2Nlc3NmdWwsIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc2JpdG1hcF9xdWV1ZV9nZXQoc3RydWN0IHNiaXRtYXBfcXVldWUgKnNicSwKKwkJCQkgICAgdW5zaWduZWQgaW50ICpjcHUpCit7CisJaW50IG5yOworCisJKmNwdSA9IGdldF9jcHUoKTsKKwluciA9IF9fc2JpdG1hcF9xdWV1ZV9nZXQoc2JxKTsKKwlwdXRfY3B1KCk7CisJcmV0dXJuIG5yOworfQorCisvKioKKyAqIHNiaXRtYXBfcXVldWVfY2xlYXIoKSAtIEZyZWUgYW4gYWxsb2NhdGVkIGJpdCBhbmQgd2FrZSB1cCB3YWl0ZXJzIG9uIGEKKyAqICZzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZS4KKyAqIEBzYnE6IEJpdG1hcCB0byBmcmVlIGZyb20uCisgKiBAbnI6IEJpdCBudW1iZXIgdG8gZnJlZS4KKyAqIEBjcHU6IENQVSB0aGUgYml0IHdhcyBhbGxvY2F0ZWQgb24uCisgKi8KK3ZvaWQgc2JpdG1hcF9xdWV1ZV9jbGVhcihzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAqc2JxLCB1bnNpZ25lZCBpbnQgbnIsCisJCQkgdW5zaWduZWQgaW50IGNwdSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHNicV9pbmRleF9pbmMoaW50IGluZGV4KQoreworCXJldHVybiAoaW5kZXggKyAxKSAmIChTQlFfV0FJVF9RVUVVRVMgLSAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNicV9pbmRleF9hdG9taWNfaW5jKGF0b21pY190ICppbmRleCkKK3sKKwlpbnQgb2xkID0gYXRvbWljX3JlYWQoaW5kZXgpOworCWludCBuZXcgPSBzYnFfaW5kZXhfaW5jKG9sZCk7CisJYXRvbWljX2NtcHhjaGcoaW5kZXgsIG9sZCwgbmV3KTsKK30KKworLyoqCisgKiBzYnFfd2FpdF9wdHIoKSAtIEdldCB0aGUgbmV4dCB3YWl0IHF1ZXVlIHRvIHVzZSBmb3IgYSAmc3RydWN0CisgKiBzYml0bWFwX3F1ZXVlLgorICogQHNicTogQml0bWFwIHF1ZXVlIHRvIHdhaXQgb24uCisgKiBAd2FpdF9pbmRleDogQSBjb3VudGVyIHBlciAidXNlciIgb2YgQHNicS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2JxX3dhaXRfc3RhdGUgKnNicV93YWl0X3B0cihzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAqc2JxLAorCQkJCQkJICBhdG9taWNfdCAqd2FpdF9pbmRleCkKK3sKKwlzdHJ1Y3Qgc2JxX3dhaXRfc3RhdGUgKndzOworCisJd3MgPSAmc2JxLT53c1thdG9taWNfcmVhZCh3YWl0X2luZGV4KV07CisJc2JxX2luZGV4X2F0b21pY19pbmMod2FpdF9pbmRleCk7CisJcmV0dXJuIHdzOworfQorCisvKioKKyAqIHNiaXRtYXBfcXVldWVfd2FrZV9hbGwoKSAtIFdha2UgdXAgZXZlcnl0aGluZyB3YWl0aW5nIG9uIGEgJnN0cnVjdAorICogc2JpdG1hcF9xdWV1ZS4KKyAqIEBzYnE6IEJpdG1hcCBxdWV1ZSB0byB3YWtlIHVwLgorICovCit2b2lkIHNiaXRtYXBfcXVldWVfd2FrZV9hbGwoc3RydWN0IHNiaXRtYXBfcXVldWUgKnNicSk7CisKKyNlbmRpZiAvKiBfX0xJTlVYX1NDQUxFX0JJVE1BUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggNjJjNjhlNS4uNzU0M2E0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtNDQ4LDYgKzQ0OCw4IEBACiAJaW9fc2NoZWR1bGVfdGltZW91dChNQVhfU0NIRURVTEVfVElNRU9VVCk7CiB9CiAKK3ZvaWQgX19ub3JldHVybiBkb190YXNrX2RlYWQodm9pZCk7CisKIHN0cnVjdCBuc3Byb3h5Owogc3RydWN0IHVzZXJfbmFtZXNwYWNlOwogCkBAIC0xMDIyLDcgKzEwMjQsOCBAQAogI2RlZmluZSBTRF9CQUxBTkNFX0ZPUksJCTB4MDAwOAkvKiBCYWxhbmNlIG9uIGZvcmssIGNsb25lICovCiAjZGVmaW5lIFNEX0JBTEFOQ0VfV0FLRQkJMHgwMDEwICAvKiBCYWxhbmNlIG9uIHdha2V1cCAqLwogI2RlZmluZSBTRF9XQUtFX0FGRklORQkJMHgwMDIwCS8qIFdha2UgdGFzayB0byB3YWtpbmcgQ1BVICovCi0jZGVmaW5lIFNEX1NIQVJFX0NQVUNBUEFDSVRZCTB4MDA4MAkvKiBEb21haW4gbWVtYmVycyBzaGFyZSBjcHUgcG93ZXIgKi8KKyNkZWZpbmUgU0RfQVNZTV9DUFVDQVBBQ0lUWQkweDAwNDAgIC8qIEdyb3VwcyBoYXZlIGRpZmZlcmVudCBtYXggY3B1IGNhcGFjaXRpZXMgKi8KKyNkZWZpbmUgU0RfU0hBUkVfQ1BVQ0FQQUNJVFkJMHgwMDgwCS8qIERvbWFpbiBtZW1iZXJzIHNoYXJlIGNwdSBjYXBhY2l0eSAqLwogI2RlZmluZSBTRF9TSEFSRV9QT1dFUkRPTUFJTgkweDAxMDAJLyogRG9tYWluIG1lbWJlcnMgc2hhcmUgcG93ZXIgZG9tYWluICovCiAjZGVmaW5lIFNEX1NIQVJFX1BLR19SRVNPVVJDRVMJMHgwMjAwCS8qIERvbWFpbiBtZW1iZXJzIHNoYXJlIGNwdSBwa2cgcmVzb3VyY2VzICovCiAjZGVmaW5lIFNEX1NFUklBTElaRQkJMHgwNDAwCS8qIE9ubHkgYSBzaW5nbGUgbG9hZCBiYWxhbmNpbmcgaW5zdGFuY2UgKi8KQEAgLTEwNjQsNiArMTA2NywxMiBAQAogCiBzdHJ1Y3Qgc2NoZWRfZ3JvdXA7CiAKK3N0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkIHsKKwlhdG9taWNfdAlyZWY7CisJYXRvbWljX3QJbnJfYnVzeV9jcHVzOworCWludAkJaGFzX2lkbGVfY29yZXM7Cit9OworCiBzdHJ1Y3Qgc2NoZWRfZG9tYWluIHsKIAkvKiBUaGVzZSBmaWVsZHMgbXVzdCBiZSBzZXR1cCAqLwogCXN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudDsJLyogdG9wIGRvbWFpbiBtdXN0IGJlIG51bGwgdGVybWluYXRlZCAqLwpAQCAtMTA5NCw2ICsxMTAzLDggQEAKIAl1NjQgbWF4X25ld2lkbGVfbGJfY29zdDsKIAl1bnNpZ25lZCBsb25nIG5leHRfZGVjYXlfbWF4X2xiX2Nvc3Q7CiAKKwl1NjQgYXZnX3NjYW5fY29zdDsJCS8qIHNlbGVjdF9pZGxlX3NpYmxpbmcgKi8KKwogI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCiAJLyogbG9hZF9iYWxhbmNlKCkgc3RhdHMgKi8KIAl1bnNpZ25lZCBpbnQgbGJfY291bnRbQ1BVX01BWF9JRExFX1RZUEVTXTsKQEAgLTExMzIsNiArMTE0Myw3IEBACiAJCXZvaWQgKnByaXZhdGU7CQkvKiB1c2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gKi8KIAkJc3RydWN0IHJjdV9oZWFkIHJjdTsJLyogdXNlZCBkdXJpbmcgZGVzdHJ1Y3Rpb24gKi8KIAl9OworCXN0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkICpzaGFyZWQ7CiAKIAl1bnNpZ25lZCBpbnQgc3Bhbl93ZWlnaHQ7CiAJLyoKQEAgLTExNjUsNiArMTE3Nyw3IEBACiAKIHN0cnVjdCBzZF9kYXRhIHsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICoqX19wZXJjcHUgc2Q7CisJc3RydWN0IHNjaGVkX2RvbWFpbl9zaGFyZWQgKipfX3BlcmNwdSBzZHM7CiAJc3RydWN0IHNjaGVkX2dyb3VwICoqX19wZXJjcHUgc2c7CiAJc3RydWN0IHNjaGVkX2dyb3VwX2NhcGFjaXR5ICoqX19wZXJjcHUgc2djOwogfTsKQEAgLTE0NTgsNiArMTQ3MSwxMyBAQAogfTsKIAogc3RydWN0IHRhc2tfc3RydWN0IHsKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCS8qCisJICogRm9yIHJlYXNvbnMgb2YgaGVhZGVyIHNvdXAgKHNlZSBjdXJyZW50X3RocmVhZF9pbmZvKCkpLCB0aGlzCisJICogbXVzdCBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0YXNrX3N0cnVjdC4KKwkgKi8KKwlzdHJ1Y3QgdGhyZWFkX2luZm8gdGhyZWFkX2luZm87CisjZW5kaWYKIAl2b2xhdGlsZSBsb25nIHN0YXRlOwkvKiAtMSB1bnJ1bm5hYmxlLCAwIHJ1bm5hYmxlLCA+MCBzdG9wcGVkICovCiAJdm9pZCAqc3RhY2s7CiAJYXRvbWljX3QgdXNhZ2U7CkBAIC0xNDY3LDYgKzE0ODcsOSBAQAogI2lmZGVmIENPTkZJR19TTVAKIAlzdHJ1Y3QgbGxpc3Rfbm9kZSB3YWtlX2VudHJ5OwogCWludCBvbl9jcHU7CisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKwl1bnNpZ25lZCBpbnQgY3B1OwkvKiBjdXJyZW50IENQVSAqLworI2VuZGlmCiAJdW5zaWduZWQgaW50IHdha2VlX2ZsaXBzOwogCXVuc2lnbmVkIGxvbmcgd2FrZWVfZmxpcF9kZWNheV90czsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmxhc3Rfd2FrZWU7CkBAIC0xOTIzLDYgKzE5NDYsMTMgQEAKICNpZmRlZiBDT05GSUdfTU1VCiAJc3RydWN0IHRhc2tfc3RydWN0ICpvb21fcmVhcGVyX2xpc3Q7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCXN0cnVjdCB2bV9zdHJ1Y3QgKnN0YWNrX3ZtX2FyZWE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCS8qIEEgbGl2ZSB0YXNrIGhvbGRzIG9uZSByZWZlcmVuY2UuICovCisJYXRvbWljX3Qgc3RhY2tfcmVmY291bnQ7CisjZW5kaWYKIC8qIENQVS1zcGVjaWZpYyBzdGF0ZSBvZiB0aGlzIHRhc2sgKi8KIAlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB0aHJlYWQ7CiAvKgpAQCAtMTkzOSw2ICsxOTY5LDE4IEBACiAjIGRlZmluZSBhcmNoX3Rhc2tfc3RydWN0X3NpemUgKHNpemVvZihzdHJ1Y3QgdGFza19zdHJ1Y3QpKQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm1fc3RydWN0ICp0YXNrX3N0YWNrX3ZtX2FyZWEoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICp0KQoreworCXJldHVybiB0LT5zdGFja192bV9hcmVhOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZtX3N0cnVjdCAqdGFza19zdGFja192bV9hcmVhKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCiAvKiBGdXR1cmUtc2FmZSBhY2Nlc3NvciBmb3Igc3RydWN0IHRhc2tfc3RydWN0J3MgY3B1c19hbGxvd2VkLiAqLwogI2RlZmluZSB0c2tfY3B1c19hbGxvd2VkKHRzaykgKCYodHNrKS0+Y3B1c19hbGxvd2VkKQogCkBAIC0yNTY4LDEyICsyNjEwLDE0IEBACiAJcmV0dXJuIHAtPnBpZCA9PSAwOwogfQogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3Vycl90YXNrKGludCBjcHUpOwotZXh0ZXJuIHZvaWQgc2V0X2N1cnJfdGFzayhpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworZXh0ZXJuIHZvaWQgaWE2NF9zZXRfY3Vycl90YXNrKGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiAKIHZvaWQgeWllbGQodm9pZCk7CiAKIHVuaW9uIHRocmVhZF91bmlvbiB7CisjaWZuZGVmIENPTkZJR19USFJFQURfSU5GT19JTl9UQVNLCiAJc3RydWN0IHRocmVhZF9pbmZvIHRocmVhZF9pbmZvOworI2VuZGlmCiAJdW5zaWduZWQgbG9uZyBzdGFja1tUSFJFQURfU0laRS9zaXplb2YobG9uZyldOwogfTsKIApAQCAtMzA2MSwxMCArMzEwNSwzNCBAQAogCWNncm91cF90aHJlYWRncm91cF9jaGFuZ2VfZW5kKHRzayk7CiB9CiAKLSNpZm5kZWYgX19IQVZFX1RIUkVBRF9GVU5DVElPTlMKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGFza190aHJlYWRfaW5mbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuICZ0YXNrLT50aHJlYWRfaW5mbzsKK30KKworLyoKKyAqIFdoZW4gYWNjZXNzaW5nIHRoZSBzdGFjayBvZiBhIG5vbi1jdXJyZW50IHRhc2sgdGhhdCBtaWdodCBleGl0LCB1c2UKKyAqIHRyeV9nZXRfdGFza19zdGFjaygpIGluc3RlYWQuICB0YXNrX3N0YWNrX3BhZ2Ugd2lsbCByZXR1cm4gYSBwb2ludGVyCisgKiB0aGF0IGNvdWxkIGdldCBmcmVlZCBvdXQgZnJvbSB1bmRlciB5b3UuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqdGFza19zdGFja19wYWdlKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gdGFzay0+c3RhY2s7Cit9CisKKyNkZWZpbmUgc2V0dXBfdGhyZWFkX3N0YWNrKG5ldyxvbGQpCWRvIHsgfSB3aGlsZSgwKQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKmVuZF9vZl9zdGFjayhjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuIHRhc2stPnN0YWNrOworfQorCisjZWxpZiAhZGVmaW5lZChfX0hBVkVfVEhSRUFEX0ZVTkNUSU9OUykKIAogI2RlZmluZSB0YXNrX3RocmVhZF9pbmZvKHRhc2spCSgoc3RydWN0IHRocmVhZF9pbmZvICopKHRhc2spLT5zdGFjaykKLSNkZWZpbmUgdGFza19zdGFja19wYWdlKHRhc2spCSgodGFzayktPnN0YWNrKQorI2RlZmluZSB0YXNrX3N0YWNrX3BhZ2UodGFzaykJKCh2b2lkICopKHRhc2spLT5zdGFjaykKIAogc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3RocmVhZF9zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqb3JnKQogewpAQCAtMzA5MSw2ICszMTU5LDI0IEBACiB9CiAKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdHJ5X2dldF90YXNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiBhdG9taWNfaW5jX25vdF96ZXJvKCZ0c2stPnN0YWNrX3JlZmNvdW50KSA/CisJCXRhc2tfc3RhY2tfcGFnZSh0c2spIDogTlVMTDsKK30KKworZXh0ZXJuIHZvaWQgcHV0X3Rhc2tfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCAqdHJ5X2dldF90YXNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiB0YXNrX3N0YWNrX3BhZ2UodHNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF90YXNrX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKSB7fQorI2VuZGlmCisKICNkZWZpbmUgdGFza19zdGFja19lbmRfY29ycnVwdGVkKHRhc2spIFwKIAkJKCooZW5kX29mX3N0YWNrKHRhc2spKSAhPSBTVEFDS19FTkRfTUFHSUMpCiAKQEAgLTMyMDYsNyArMzI5MiwxMSBAQAogICogY29uZF9yZXNjaGVkX2xvY2soKSB3aWxsIGRyb3AgdGhlIHNwaW5sb2NrIGJlZm9yZSBzY2hlZHVsaW5nLAogICogY29uZF9yZXNjaGVkX3NvZnRpcnEoKSB3aWxsIGVuYWJsZSBiaHMgYmVmb3JlIHNjaGVkdWxpbmcuCiAgKi8KKyNpZm5kZWYgQ09ORklHX1BSRUVNUFQKIGV4dGVybiBpbnQgX2NvbmRfcmVzY2hlZCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBfY29uZF9yZXNjaGVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgogCiAjZGVmaW5lIGNvbmRfcmVzY2hlZCgpICh7CQkJXAogCV9fX21pZ2h0X3NsZWVwKF9fRklMRV9fLCBfX0xJTkVfXywgMCk7CVwKQEAgLTMyMzYsNiArMzMyNiwxNSBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfcHJlZW1wdF9kaXNhYmxlX2lwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKyNpZmRlZiBDT05GSUdfREVCVUdfUFJFRU1QVAorCXJldHVybiBwLT5wcmVlbXB0X2Rpc2FibGVfaXA7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKIC8qCiAgKiBEb2VzIGEgY3JpdGljYWwgc2VjdGlvbiBuZWVkIHRvIGJlIGJyb2tlbiBkdWUgdG8gYW5vdGhlcgogICogdGFzayB3YWl0aW5nPzogKHRlY2huaWNhbGx5IGRvZXMgbm90IGRlcGVuZCBvbiBDT05GSUdfUFJFRU1QVCwKQEAgLTMzNjQsNyArMzQ2MywxMSBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0YXNrX2NwdShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKwlyZXR1cm4gcC0+Y3B1OworI2Vsc2UKIAlyZXR1cm4gdGFza190aHJlYWRfaW5mbyhwKS0+Y3B1OworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfbm9kZShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCkBAIC0zNDY5LDE1ICszNTcyLDIwIEBACiAJcmV0dXJuIHRhc2tfcmxpbWl0X21heChjdXJyZW50LCBsaW1pdCk7CiB9CiAKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9SVAkoMVUgPDwgMCkKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9ETAkoMVUgPDwgMSkKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9JT1dBSVQJKDFVIDw8IDIpCisKKyNkZWZpbmUgU0NIRURfQ1BVRlJFUV9SVF9ETAkoU0NIRURfQ1BVRlJFUV9SVCB8IFNDSEVEX0NQVUZSRVFfREwpCisKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIHN0cnVjdCB1cGRhdGVfdXRpbF9kYXRhIHsKLQl2b2lkICgqZnVuYykoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsCi0JCSAgICAgdTY0IHRpbWUsIHVuc2lnbmVkIGxvbmcgdXRpbCwgdW5zaWduZWQgbG9uZyBtYXgpOworICAgICAgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqZGF0YSwgdTY0IHRpbWUsIHVuc2lnbmVkIGludCBmbGFncyk7CiB9OwogCiB2b2lkIGNwdWZyZXFfYWRkX3VwZGF0ZV91dGlsX2hvb2soaW50IGNwdSwgc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsCi0JCQl2b2lkICgqZnVuYykoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsIHU2NCB0aW1lLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkpOworICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnVuYykoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsIHU2NCB0aW1lLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpKTsKIHZvaWQgY3B1ZnJlcV9yZW1vdmVfdXBkYXRlX3V0aWxfaG9vayhpbnQgY3B1KTsKICNlbmRpZiAvKiBDT05GSUdfQ1BVX0ZSRVEgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IDc4MzFjZDUuLmMyMTI1ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTI0Miw2ICsyNDIsMTAgQEAKIGludCBzZWN1cml0eV9kZW50cnlfaW5pdF9zZWN1cml0eShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAogCQkJCQljb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwgdm9pZCAqKmN0eCwKIAkJCQkJdTMyICpjdHhsZW4pOworaW50IHNlY3VyaXR5X2RlbnRyeV9jcmVhdGVfZmlsZXNfYXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCQkJc3RydWN0IHFzdHIgKm5hbWUsCisJCQkJCWNvbnN0IHN0cnVjdCBjcmVkICpvbGQsCisJCQkJCXN0cnVjdCBjcmVkICpuZXcpOwogCiBpbnQgc2VjdXJpdHlfaW5vZGVfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSk7CiB2b2lkIHNlY3VyaXR5X2lub2RlX2ZyZWUoc3RydWN0IGlub2RlICppbm9kZSk7CkBAIC0yODIsNiArMjg2LDggQEAKIGludCBzZWN1cml0eV9pbm9kZV9zZXRzZWN1cml0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncyk7CiBpbnQgc2VjdXJpdHlfaW5vZGVfbGlzdHNlY3VyaXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKTsKIHZvaWQgc2VjdXJpdHlfaW5vZGVfZ2V0c2VjaWQoc3RydWN0IGlub2RlICppbm9kZSwgdTMyICpzZWNpZCk7CitpbnQgc2VjdXJpdHlfaW5vZGVfY29weV91cChzdHJ1Y3QgZGVudHJ5ICpzcmMsIHN0cnVjdCBjcmVkICoqbmV3KTsKK2ludCBzZWN1cml0eV9pbm9kZV9jb3B5X3VwX3hhdHRyKGNvbnN0IGNoYXIgKm5hbWUpOwogaW50IHNlY3VyaXR5X2ZpbGVfcGVybWlzc2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1hc2spOwogaW50IHNlY3VyaXR5X2ZpbGVfYWxsb2Moc3RydWN0IGZpbGUgKmZpbGUpOwogdm9pZCBzZWN1cml0eV9maWxlX2ZyZWUoc3RydWN0IGZpbGUgKmZpbGUpOwpAQCAtMzA3LDcgKzMxMyw2IEBACiBpbnQgc2VjdXJpdHlfa2VybmVsX2FjdF9hcyhzdHJ1Y3QgY3JlZCAqbmV3LCB1MzIgc2VjaWQpOwogaW50IHNlY3VyaXR5X2tlcm5lbF9jcmVhdGVfZmlsZXNfYXMoc3RydWN0IGNyZWQgKm5ldywgc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgc2VjdXJpdHlfa2VybmVsX21vZHVsZV9yZXF1ZXN0KGNoYXIgKmttb2RfbmFtZSk7Ci1pbnQgc2VjdXJpdHlfa2VybmVsX21vZHVsZV9mcm9tX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUpOwogaW50IHNlY3VyaXR5X2tlcm5lbF9yZWFkX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGVudW0ga2VybmVsX3JlYWRfZmlsZV9pZCBpZCk7CiBpbnQgc2VjdXJpdHlfa2VybmVsX3Bvc3RfcmVhZF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIGxvZmZfdCBzaXplLAogCQkJCSAgIGVudW0ga2VybmVsX3JlYWRfZmlsZV9pZCBpZCk7CkBAIC01OTgsNiArNjAzLDE0IEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCitzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9kZW50cnlfY3JlYXRlX2ZpbGVzX2FzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkJCSAgaW50IG1vZGUsIHN0cnVjdCBxc3RyICpuYW1lLAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgY3JlZCAqb2xkLAorCQkJCQkJICBzdHJ1Y3QgY3JlZCAqbmV3KQoreworCXJldHVybiAwOworfQorCiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCXN0cnVjdCBpbm9kZSAqZGlyLApAQCAtNzU4LDYgKzc3MSwxNiBAQAogCSpzZWNpZCA9IDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2NvcHlfdXAoc3RydWN0IGRlbnRyeSAqc3JjLCBzdHJ1Y3QgY3JlZCAqKm5ldykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfaW5vZGVfY29weV91cF94YXR0cihjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfZmlsZV9wZXJtaXNzaW9uKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbWFzaykKIHsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaAppbmRleCA5MjMyNjZjLi40OGVjNzY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF84MjUwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfODI1MC5oCkBAIC0xMTEsNyArMTExLDYgQEAKIAkJCQkJCSAqICAgaWYgbm9fY29uc29sZV9zdXNwZW5kCiAJCQkJCQkgKi8KIAl1bnNpZ25lZCBjaGFyCQlwcm9iZTsKLQlzdHJ1Y3QgbWN0cmxfZ3Bpb3MJKmdwaW9zOwogI2RlZmluZSBVQVJUX1BST0JFX1JTQQkoMSA8PCAwKQogCiAJLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCAyZjQ0ZTIwLi4zNDQyMDE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC0zNjcsMTQgKzM2NywyMSBAQAogCiAjZGVmaW5lIEVBUkxZQ09OX0RFQ0xBUkUoX25hbWUsIGZuKQlPRl9FQVJMWUNPTl9ERUNMQVJFKF9uYW1lLCAiIiwgZm4pCiAKLWV4dGVybiBpbnQgc2V0dXBfZWFybHljb24oY2hhciAqYnVmKTsKIGV4dGVybiBpbnQgb2Zfc2V0dXBfZWFybHljb24oY29uc3Qgc3RydWN0IGVhcmx5Y29uX2lkICptYXRjaCwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBub2RlLAogCQkJICAgICBjb25zdCBjaGFyICpvcHRpb25zKTsKIAorI2lmZGVmIENPTkZJR19TRVJJQUxfRUFSTFlDT04KK2V4dGVybiBib29sIGVhcmx5Y29uX2luaXRfaXNfZGVmZXJyZWQgX19pbml0ZGF0YTsKK2ludCBzZXR1cF9lYXJseWNvbihjaGFyICpidWYpOworI2Vsc2UKK3N0YXRpYyBjb25zdCBib29sIGVhcmx5Y29uX2luaXRfaXNfZGVmZXJyZWQ7CitzdGF0aWMgaW5saW5lIGludCBzZXR1cF9lYXJseWNvbihjaGFyICpidWYpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCiBzdHJ1Y3QgdWFydF9wb3J0ICp1YXJ0X2dldF9jb25zb2xlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnRzLCBpbnQgbnIsCiAJCQkJICAgc3RydWN0IGNvbnNvbGUgKmMpOwotaW50IHVhcnRfcGFyc2VfZWFybHljb24oY2hhciAqcCwgdW5zaWduZWQgY2hhciAqaW90eXBlLCB1bnNpZ25lZCBsb25nICphZGRyLAoraW50IHVhcnRfcGFyc2VfZWFybHljb24oY2hhciAqcCwgdW5zaWduZWQgY2hhciAqaW90eXBlLCByZXNvdXJjZV9zaXplX3QgKmFkZHIsCiAJCQljaGFyICoqb3B0aW9ucyk7CiB2b2lkIHVhcnRfcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBpbnQgKmJhdWQsIGludCAqcGFyaXR5LCBpbnQgKmJpdHMsCiAJCQlpbnQgKmZsb3cpOwpAQCAtNDEyLDcgKzQxOSw3IEBACiBzdGF0aWMgaW5saW5lIGludCB1YXJ0X3R4X3N0b3BwZWQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+c3RhdGUtPnBvcnQudHR5OwotCWlmICh0dHktPnN0b3BwZWQgfHwgcG9ydC0+aHdfc3RvcHBlZCkKKwlpZiAoKHR0eSAmJiB0dHktPnN0b3BwZWQpIHx8IHBvcnQtPmh3X3N0b3BwZWQpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaCBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKaW5kZXggMGY2NjVjYi4uNjAxMjU4ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9za2J1ZmYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCkBAIC02MTIsNyArNjEyLDYgQEAKICAqCUBub19mY3M6ICBSZXF1ZXN0IE5JQyB0byB0cmVhdCBsYXN0IDQgYnl0ZXMgYXMgRXRoZXJuZXQgRkNTCiAgICoJQG5hcGlfaWQ6IGlkIG9mIHRoZSBOQVBJIHN0cnVjdCB0aGlzIHNrYiBjYW1lIGZyb20KICAqCUBzZWNtYXJrOiBzZWN1cml0eSBtYXJraW5nCi0gKglAb2ZmbG9hZF9md2RfbWFyazogZndkaW5nIG9mZmxvYWQgbWFyawogICoJQG1hcms6IEdlbmVyaWMgcGFja2V0IG1hcmsKICAqCUB2bGFuX3Byb3RvOiB2bGFuIGVuY2Fwc3VsYXRpb24gcHJvdG9jb2wKICAqCUB2bGFuX3RjaTogdmxhbiB0YWcgY29udHJvbCBpbmZvcm1hdGlvbgpAQCAtNjc3LDEzICs2NzYsMjMgQEAKIAkgKi8KIAlrbWVtY2hlY2tfYml0ZmllbGRfYmVnaW4oZmxhZ3MxKTsKIAlfX3UxNgkJCXF1ZXVlX21hcHBpbmc7CisKKy8qIGlmIHlvdSBtb3ZlIGNsb25lZCBhcm91bmQgeW91IGFsc28gbXVzdCBhZGFwdCB0aG9zZSBjb25zdGFudHMgKi8KKyNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKKyNkZWZpbmUgQ0xPTkVEX01BU0sJKDEgPDwgNykKKyNlbHNlCisjZGVmaW5lIENMT05FRF9NQVNLCTEKKyNlbmRpZgorI2RlZmluZSBDTE9ORURfT0ZGU0VUKCkJCW9mZnNldG9mKHN0cnVjdCBza19idWZmLCBfX2Nsb25lZF9vZmZzZXQpCisKKwlfX3U4CQkJX19jbG9uZWRfb2Zmc2V0WzBdOwogCV9fdTgJCQljbG9uZWQ6MSwKIAkJCQlub2hkcjoxLAogCQkJCWZjbG9uZToyLAogCQkJCXBlZWtlZDoxLAogCQkJCWhlYWRfZnJhZzoxLAotCQkJCXhtaXRfbW9yZToxOwotCS8qIG9uZSBiaXQgaG9sZSAqLworCQkJCXhtaXRfbW9yZToxLAorCQkJCV9fdW51c2VkOjE7IC8qIG9uZSBiaXQgaG9sZSAqLwogCWttZW1jaGVja19iaXRmaWVsZF9lbmQoZmxhZ3MxKTsKIAogCS8qIGZpZWxkcyBlbmNsb3NlZCBpbiBoZWFkZXJzX3N0YXJ0L2hlYWRlcnNfZW5kIGFyZSBjb3BpZWQKQEAgLTczMCw3ICs3MzksMTAgQEAKIAlfX3U4CQkJaXB2c19wcm9wZXJ0eToxOwogCV9fdTgJCQlpbm5lcl9wcm90b2NvbF90eXBlOjE7CiAJX191OAkJCXJlbWNzdW1fb2ZmbG9hZDoxOwotCS8qIDMgb3IgNSBiaXQgaG9sZSAqLworI2lmZGVmIENPTkZJR19ORVRfU1dJVENIREVWCisJX191OAkJCW9mZmxvYWRfZndkX21hcms6MTsKKyNlbmRpZgorCS8qIDIsIDQgb3IgNSBiaXQgaG9sZSAqLwogCiAjaWZkZWYgQ09ORklHX05FVF9TQ0hFRAogCV9fdTE2CQkJdGNfaW5kZXg7CS8qIHRyYWZmaWMgY29udHJvbCBpbmRleCAqLwpAQCAtNzU3LDE0ICs3NjksOSBAQAogCQl1bnNpZ25lZCBpbnQJc2VuZGVyX2NwdTsKIAl9OwogI2VuZGlmCi0JdW5pb24gewogI2lmZGVmIENPTkZJR19ORVRXT1JLX1NFQ01BUksKLQkJX191MzIJCXNlY21hcms7CisJX191MzIJCXNlY21hcms7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTkVUX1NXSVRDSERFVgotCQlfX3UzMgkJb2ZmbG9hZF9md2RfbWFyazsKLSNlbmRpZgotCX07CiAKIAl1bmlvbiB7CiAJCV9fdTMyCQltYXJrOwpAQCAtMjI5NSw3ICsyMzAyLDcgQEAKIAogaW50IF9fX3Bza2JfdHJpbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NrYl9zZXRfbGVuZ3RoKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJaWYgKHVubGlrZWx5KHNrYl9pc19ub25saW5lYXIoc2tiKSkpIHsKIAkJV0FSTl9PTigxKTsKQEAgLTIzMDUsNiArMjMxMiwxMSBAQAogCXNrYl9zZXRfdGFpbF9wb2ludGVyKHNrYiwgbGVuKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIF9fc2tiX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlfX3NrYl9zZXRfbGVuZ3RoKHNrYiwgbGVuKTsKK30KKwogdm9pZCBza2JfdHJpbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAogc3RhdGljIGlubGluZSBpbnQgX19wc2tiX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKQEAgLTIzMzUsNiArMjM0NywyMCBAQAogCUJVR19PTihlcnIpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBfX3NrYl9ncm93KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGRpZmYgPSBsZW4gLSBza2ItPmxlbjsKKworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IGRpZmYpIHsKKwkJaW50IHJldCA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCBkaWZmIC0gc2tiX3RhaWxyb29tKHNrYiksCisJCQkJCSAgIEdGUF9BVE9NSUMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJX19za2Jfc2V0X2xlbmd0aChza2IsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICoJc2tiX29ycGhhbiAtIG9ycGhhbiBhIGJ1ZmZlcgogICoJQHNrYjogYnVmZmVyIHRvIG9ycGhhbgpAQCAtMjM4Niw2ICsyNDEyLDggQEAKIAkJa2ZyZWVfc2tiKHNrYik7CiB9CiAKK3ZvaWQgc2tiX3JidHJlZV9wdXJnZShzdHJ1Y3QgcmJfcm9vdCAqcm9vdCk7CisKIHZvaWQgKm5ldGRldl9hbGxvY19mcmFnKHVuc2lnbmVkIGludCBmcmFnc3opOwogCiBzdHJ1Y3Qgc2tfYnVmZiAqX19uZXRkZXZfYWxsb2Nfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBsZW5ndGgsCkBAIC0yOTM4LDYgKzI5NjYsMjEgQEAKIAlyZXR1cm4gX19wc2tiX3RyaW0oc2tiLCBsZW4pOwogfQogCitzdGF0aWMgaW5saW5lIGludCBfX3NrYl90cmltX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7CisJX19za2JfdHJpbShza2IsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9fc2tiX2dyb3dfcmNzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKwlyZXR1cm4gX19za2JfZ3Jvdyhza2IsIGxlbik7Cit9CisKICNkZWZpbmUgc2tiX3F1ZXVlX3dhbGsocXVldWUsIHNrYikgXAogCQlmb3IgKHNrYiA9IChxdWV1ZSktPm5leHQ7CQkJCQlcCiAJCSAgICAgc2tiICE9IChzdHJ1Y3Qgc2tfYnVmZiAqKShxdWV1ZSk7CQkJCVwKQEAgLTMwMjEsMTUgKzMwNjQsOSBAQAogaW50IHNrYl9zdG9yZV9iaXRzKHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmZyb20sIGludCBsZW4pOwogX193c3VtIHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwgdTggKnRvLAogCQkJICAgICAgaW50IGxlbiwgX193c3VtIGNzdW0pOwotc3NpemVfdCBza2Jfc29ja2V0X3NwbGljZShzdHJ1Y3Qgc29jayAqc2ssCi0JCQkgIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsCi0JCQkgIHN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjICpzcGQpOwogaW50IHNrYl9zcGxpY2VfYml0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBvZmZzZXQsCiAJCSAgICBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCB1bnNpZ25lZCBpbnQgbGVuLAotCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkgICAgc3NpemVfdCAoKnNwbGljZV9jYikoc3RydWN0IHNvY2sgKiwKLQkJCQkJIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwKLQkJCQkJIHN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjICopKTsKKwkJICAgIHVuc2lnbmVkIGludCBmbGFncyk7CiB2b2lkIHNrYl9jb3B5X2FuZF9jc3VtX2Rldihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqdG8pOwogdW5zaWduZWQgaW50IHNrYl96ZXJvY29weV9oZWFkbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpmcm9tKTsKIGludCBza2JfemVyb2NvcHkoc3RydWN0IHNrX2J1ZmYgKnRvLCBzdHJ1Y3Qgc2tfYnVmZiAqZnJvbSwKQEAgLTMwNDIsNiArMzA3OSw3IEBACiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOwogc3RydWN0IHNrX2J1ZmYgKnNrYl92bGFuX3VudGFnKHN0cnVjdCBza19idWZmICpza2IpOwogaW50IHNrYl9lbnN1cmVfd3JpdGFibGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHdyaXRlX2xlbik7CitpbnQgX19za2Jfdmxhbl9wb3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2ICp2bGFuX3RjaSk7CiBpbnQgc2tiX3ZsYW5fcG9wKHN0cnVjdCBza19idWZmICpza2IpOwogaW50IHNrYl92bGFuX3B1c2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19iZTE2IHZsYW5fcHJvdG8sIHUxNiB2bGFuX3RjaSk7CiBzdHJ1Y3Qgc2tfYnVmZiAqcHNrYl9leHRyYWN0KHN0cnVjdCBza19idWZmICpza2IsIGludCBvZmYsIGludCB0b19jb3B5LApAQCAtMzcyNiw2ICszNzY0LDEzIEBACiAJcmV0dXJuIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1RDUFY2OwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX2dzb19yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPSAwOworCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPSAwOworCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgPSAwOworfQorCiB2b2lkIF9fc2tiX3dhcm5fbHJvX2ZvcndhcmRpbmcoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBza2Jfd2Fybl9pZl9scm8oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2xhYi5oIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKaW5kZXggNDI5MzgwOC4uMDg0YjEyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKQEAgLTY1MCw0ICs2NTAsMTIgQEAKIHVuc2lnbmVkIGludCBrbWVtX2NhY2hlX3NpemUoc3RydWN0IGttZW1fY2FjaGUgKnMpOwogdm9pZCBfX2luaXQga21lbV9jYWNoZV9pbml0X2xhdGUodm9pZCk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoQ09ORklHX1NMQUIpCitpbnQgc2xhYl9wcmVwYXJlX2NwdSh1bnNpZ25lZCBpbnQgY3B1KTsKK2ludCBzbGFiX2RlYWRfY3B1KHVuc2lnbmVkIGludCBjcHUpOworI2Vsc2UKKyNkZWZpbmUgc2xhYl9wcmVwYXJlX2NwdQlOVUxMCisjZGVmaW5lIHNsYWJfZGVhZF9jcHUJCU5VTEwKKyNlbmRpZgorCiAjZW5kaWYJLyogX0xJTlVYX1NMQUJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbWM5MXguaCBiL2luY2x1ZGUvbGludXgvc21jOTF4LmgKaW5kZXggNzYxOTliNy4uZTMwMmM0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbWM5MXguaAorKysgYi9pbmNsdWRlL2xpbnV4L3NtYzkxeC5oCkBAIC0xLDYgKzEsMTYgQEAKICNpZm5kZWYgX19TTUM5MVhfSF9fCiAjZGVmaW5lIF9fU01DOTFYX0hfXwogCisvKgorICogVGhlc2UgYml0cyBkZWZpbmUgd2hpY2ggYWNjZXNzIHNpemVzIGEgcGxhdGZvcm0gY2FuIHN1cHBvcnQsIHJhdGhlcgorICogdGhhbiB0aGUgbWF4aW1hbCBhY2Nlc3Mgc2l6ZS4gIFNvLCBpZiB5b3VyIHBsYXRmb3JtIGNhbiBkbyAxNi1iaXQKKyAqIGFuZCAzMi1iaXQgYWNjZXNzZXMgdG8gdGhlIFNNQzkxeCBkZXZpY2UsIGJ1dCBub3QgOC1iaXQsIHNldCBib3RoCisgKiBTTUM5MVhfVVNFXzE2QklUIGFuZCBTTUM5MVhfVVNFXzMyQklULgorICoKKyAqIFRoZSBTTUM5MXggZHJpdmVyIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBvZiBTTUM5MVhfVVNFXzhCSVQgb3IKKyAqIFNNQzkxWF9VU0VfMTZCSVQgdG8gYmUgc3VwcG9ydGVkIC0ganVzdCBzZXR0aW5nIFNNQzkxWF9VU0VfMzJCSVQgaXMKKyAqIGFuIGludmFsaWQgY29uZmlndXJhdGlvbi4KKyAqLwogI2RlZmluZSBTTUM5MVhfVVNFXzhCSVQgKDEgPDwgMCkKICNkZWZpbmUgU01DOTFYX1VTRV8xNkJJVCAoMSA8PCAxKQogI2RlZmluZSBTTUM5MVhfVVNFXzMyQklUICgxIDw8IDIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NtcC5oIGIvaW5jbHVkZS9saW51eC9zbXAuaAppbmRleCBlY2NhZTQ2OS4uOGUwY2I3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NtcC5oCkBAIC0xOTYsNiArMTk2LDkgQEAKIAogdm9pZCBzbXBfc2V0dXBfcHJvY2Vzc29yX2lkKHZvaWQpOwogCitpbnQgc21wX2NhbGxfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIGludCAoKmZ1bmMpKHZvaWQgKiksIHZvaWQgKnBhciwKKwkJICAgIGJvb2wgcGh5cyk7CisKIC8qIFNNUCBjb3JlIGZ1bmN0aW9ucyAqLwogaW50IHNtcGNmZF9wcmVwYXJlX2NwdSh1bnNpZ25lZCBpbnQgY3B1KTsKIGludCBzbXBjZmRfZGVhZF9jcHUodW5zaWduZWQgaW50IGNwdSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaCBiL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCmluZGV4IDA3MmNiMmEuLjRiNzQzYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL3NwaS5oCkBAIC0zMTIsNiArMzEyLDggQEAKICAqIEBmbGFnczogb3RoZXIgY29uc3RyYWludHMgcmVsZXZhbnQgdG8gdGhpcyBkcml2ZXIKICAqIEBtYXhfdHJhbnNmZXJfc2l6ZTogZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtYXggdHJhbnNmZXIgc2l6ZSBmb3IKICAqCWEgJnNwaV9kZXZpY2U7IG1heSBiZSAlTlVMTCwgc28gdGhlIGRlZmF1bHQgJVNJWkVfTUFYIHdpbGwgYmUgdXNlZC4KKyAqIEBtYXhfbWVzc2FnZV9zaXplOiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG1heCBtZXNzYWdlIHNpemUgZm9yCisgKglhICZzcGlfZGV2aWNlOyBtYXkgYmUgJU5VTEwsIHNvIHRoZSBkZWZhdWx0ICVTSVpFX01BWCB3aWxsIGJlIHVzZWQuCiAgKiBAaW9fbXV0ZXg6IG11dGV4IGZvciBwaHlzaWNhbCBidXMgYWNjZXNzCiAgKiBAYnVzX2xvY2tfc3BpbmxvY2s6IHNwaW5sb2NrIGZvciBTUEkgYnVzIGxvY2tpbmcKICAqIEBidXNfbG9ja19tdXRleDogbXV0ZXggZm9yIGV4Y2x1c2lvbiBvZiBtdWx0aXBsZSBjYWxsZXJzCkBAIC00NDIsMTAgKzQ0NCwxMSBAQAogI2RlZmluZSBTUElfTUFTVEVSX01VU1RfVFggICAgICBCSVQoNCkJCS8qIHJlcXVpcmVzIHR4ICovCiAKIAkvKgotCSAqIG9uIHNvbWUgaGFyZHdhcmUgdHJhbnNmZXIgc2l6ZSBtYXkgYmUgY29uc3RyYWluZWQKKwkgKiBvbiBzb21lIGhhcmR3YXJlIHRyYW5zZmVyIC8gbWVzc2FnZSBzaXplIG1heSBiZSBjb25zdHJhaW5lZAogCSAqIHRoZSBsaW1pdCBtYXkgZGVwZW5kIG9uIGRldmljZSB0cmFuc2ZlciBzZXR0aW5ncwogCSAqLwogCXNpemVfdCAoKm1heF90cmFuc2Zlcl9zaXplKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKKwlzaXplX3QgKCptYXhfbWVzc2FnZV9zaXplKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKIAogCS8qIEkvTyBtdXRleCAqLwogCXN0cnVjdCBtdXRleAkJaW9fbXV0ZXg7CkBAIC05MDUsMTIgKzkwOCwyNiBAQAogCQkJICAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbWVzc2FnZSk7CiAKIHN0YXRpYyBpbmxpbmUgc2l6ZV90CitzcGlfbWF4X21lc3NhZ2Vfc2l6ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGktPm1hc3RlcjsKKwlpZiAoIW1hc3Rlci0+bWF4X21lc3NhZ2Vfc2l6ZSkKKwkJcmV0dXJuIFNJWkVfTUFYOworCXJldHVybiBtYXN0ZXItPm1heF9tZXNzYWdlX3NpemUoc3BpKTsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QKIHNwaV9tYXhfdHJhbnNmZXJfc2l6ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGktPm1hc3RlcjsKLQlpZiAoIW1hc3Rlci0+bWF4X3RyYW5zZmVyX3NpemUpCi0JCXJldHVybiBTSVpFX01BWDsKLQlyZXR1cm4gbWFzdGVyLT5tYXhfdHJhbnNmZXJfc2l6ZShzcGkpOworCXNpemVfdCB0cl9tYXggPSBTSVpFX01BWDsKKwlzaXplX3QgbXNnX21heCA9IHNwaV9tYXhfbWVzc2FnZV9zaXplKHNwaSk7CisKKwlpZiAobWFzdGVyLT5tYXhfdHJhbnNmZXJfc2l6ZSkKKwkJdHJfbWF4ID0gbWFzdGVyLT5tYXhfdHJhbnNmZXJfc2l6ZShzcGkpOworCisJLyogdHJhbnNmZXIgc2l6ZSBsaW1pdCBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gbWVzc3NhZ2Ugc2l6ZSBsaW1pdCAqLworCXJldHVybiBtaW4odHJfbWF4LCBtc2dfbWF4KTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtOTgwLDU4ICs5OTcsNiBAQAogZXh0ZXJuIGludCBzcGlfYnVzX3VubG9jayhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKTsKIAogLyoqCi0gKiBzcGlfd3JpdGUgLSBTUEkgc3luY2hyb25vdXMgd3JpdGUKLSAqIEBzcGk6IGRldmljZSB0byB3aGljaCBkYXRhIHdpbGwgYmUgd3JpdHRlbgotICogQGJ1ZjogZGF0YSBidWZmZXIKLSAqIEBsZW46IGRhdGEgYnVmZmVyIHNpemUKLSAqIENvbnRleHQ6IGNhbiBzbGVlcAotICoKLSAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBidWZmZXIgQGJ1Zi4KLSAqIENhbGxhYmxlIG9ubHkgZnJvbSBjb250ZXh0cyB0aGF0IGNhbiBzbGVlcC4KLSAqCi0gKiBSZXR1cm46IHplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1zcGlfd3JpdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQotewotCXN0cnVjdCBzcGlfdHJhbnNmZXIJdCA9IHsKLQkJCS50eF9idWYJCT0gYnVmLAotCQkJLmxlbgkJPSBsZW4sCi0JCX07Ci0Jc3RydWN0IHNwaV9tZXNzYWdlCW07Ci0KLQlzcGlfbWVzc2FnZV9pbml0KCZtKTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdCwgJm0pOwotCXJldHVybiBzcGlfc3luYyhzcGksICZtKTsKLX0KLQotLyoqCi0gKiBzcGlfcmVhZCAtIFNQSSBzeW5jaHJvbm91cyByZWFkCi0gKiBAc3BpOiBkZXZpY2UgZnJvbSB3aGljaCBkYXRhIHdpbGwgYmUgcmVhZAotICogQGJ1ZjogZGF0YSBidWZmZXIKLSAqIEBsZW46IGRhdGEgYnVmZmVyIHNpemUKLSAqIENvbnRleHQ6IGNhbiBzbGVlcAotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGJ1ZmZlciBAYnVmLgotICogQ2FsbGFibGUgb25seSBmcm9tIGNvbnRleHRzIHRoYXQgY2FuIHNsZWVwLgotICoKLSAqIFJldHVybjogemVybyBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQKLXNwaV9yZWFkKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXQgPSB7Ci0JCQkucnhfYnVmCQk9IGJ1ZiwKLQkJCS5sZW4JCT0gbGVuLAotCQl9OwotCXN0cnVjdCBzcGlfbWVzc2FnZQltOwotCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbSk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKLQlyZXR1cm4gc3BpX3N5bmMoc3BpLCAmbSk7Ci19Ci0KLS8qKgogICogc3BpX3N5bmNfdHJhbnNmZXIgLSBzeW5jaHJvbm91cyBTUEkgZGF0YSB0cmFuc2ZlcgogICogQHNwaTogZGV2aWNlIHdpdGggd2hpY2ggZGF0YSB3aWxsIGJlIGV4Y2hhbmdlZAogICogQHhmZXJzOiBBbiBhcnJheSBvZiBzcGlfdHJhbnNmZXJzCkBAIC0xMDU1LDYgKzEwMjAsNTIgQEAKIAlyZXR1cm4gc3BpX3N5bmMoc3BpLCAmbXNnKTsKIH0KIAorLyoqCisgKiBzcGlfd3JpdGUgLSBTUEkgc3luY2hyb25vdXMgd3JpdGUKKyAqIEBzcGk6IGRldmljZSB0byB3aGljaCBkYXRhIHdpbGwgYmUgd3JpdHRlbgorICogQGJ1ZjogZGF0YSBidWZmZXIKKyAqIEBsZW46IGRhdGEgYnVmZmVyIHNpemUKKyAqIENvbnRleHQ6IGNhbiBzbGVlcAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBidWZmZXIgQGJ1Zi4KKyAqIENhbGxhYmxlIG9ubHkgZnJvbSBjb250ZXh0cyB0aGF0IGNhbiBzbGVlcC4KKyAqCisgKiBSZXR1cm46IHplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzcGlfd3JpdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBzcGlfdHJhbnNmZXIJdCA9IHsKKwkJCS50eF9idWYJCT0gYnVmLAorCQkJLmxlbgkJPSBsZW4sCisJCX07CisKKwlyZXR1cm4gc3BpX3N5bmNfdHJhbnNmZXIoc3BpLCAmdCwgMSk7Cit9CisKKy8qKgorICogc3BpX3JlYWQgLSBTUEkgc3luY2hyb25vdXMgcmVhZAorICogQHNwaTogZGV2aWNlIGZyb20gd2hpY2ggZGF0YSB3aWxsIGJlIHJlYWQKKyAqIEBidWY6IGRhdGEgYnVmZmVyCisgKiBAbGVuOiBkYXRhIGJ1ZmZlciBzaXplCisgKiBDb250ZXh0OiBjYW4gc2xlZXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBidWZmZXIgQGJ1Zi4KKyAqIENhbGxhYmxlIG9ubHkgZnJvbSBjb250ZXh0cyB0aGF0IGNhbiBzbGVlcC4KKyAqCisgKiBSZXR1cm46IHplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzcGlfcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwaV90cmFuc2Zlcgl0ID0geworCQkJLnJ4X2J1ZgkJPSBidWYsCisJCQkubGVuCQk9IGxlbiwKKwkJfTsKKworCXJldHVybiBzcGlfc3luY190cmFuc2ZlcihzcGksICZ0LCAxKTsKK30KKwogLyogdGhpcyBjb3BpZXMgdHhidWYgYW5kIHJ4YnVmIGRhdGE7IGZvciBzbWFsbCB0cmFuc2ZlcnMgb25seSEgKi8KIGV4dGVybiBpbnQgc3BpX3dyaXRlX3RoZW5fcmVhZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAogCQljb25zdCB2b2lkICp0eGJ1ZiwgdW5zaWduZWQgbl90eCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BsaWNlLmggYi9pbmNsdWRlL2xpbnV4L3NwbGljZS5oCmluZGV4IGRhMjc1MWQuLjAwYTIxMTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BsaWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGxpY2UuaApAQCAtNzIsNiArNzIsOCBAQAogCQkJCSAgc3RydWN0IHNwbGljZV9kZXNjICosIHNwbGljZV9hY3RvciAqKTsKIGV4dGVybiBzc2l6ZV90IHNwbGljZV90b19waXBlKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwKIAkJCSAgICAgIHN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjICopOworZXh0ZXJuIHNzaXplX3QgYWRkX3RvX3BpcGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLAorCQkJICAgICAgc3RydWN0IHBpcGVfYnVmZmVyICopOwogZXh0ZXJuIHNzaXplX3Qgc3BsaWNlX2RpcmVjdF90b19hY3RvcihzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgc3BsaWNlX2Rlc2MgKiwKIAkJCQkgICAgICBzcGxpY2VfZGlyZWN0X2FjdG9yICopOwogCkBAIC04Myw0ICs4NSw1IEBACiBleHRlcm4gdm9pZCBzcGRfcmVsZWFzZV9wYWdlKHN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjICosIHVuc2lnbmVkIGludCk7CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyBwYWdlX2NhY2hlX3BpcGVfYnVmX29wczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyBkZWZhdWx0X3BpcGVfYnVmX29wczsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmggYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaAppbmRleCA3NjkzZTM5Li5kOTcxODM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1c3BlbmQuaApAQCAtMjQ1LDYgKzI0NSw3IEBACiAJcmV0dXJuIHVubGlrZWx5KHN1c3BlbmRfZnJlZXplX3N0YXRlID09IEZSRUVaRV9TVEFURV9FTlRFUik7CiB9CiAKK2V4dGVybiB2b2lkIF9faW5pdCBwbV9zdGF0ZXNfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGZyZWV6ZV9zZXRfb3BzKGNvbnN0IHN0cnVjdCBwbGF0Zm9ybV9mcmVlemVfb3BzICpvcHMpOwogZXh0ZXJuIHZvaWQgZnJlZXplX3dha2Uodm9pZCk7CiAKQEAgLTI3OSw2ICsyODAsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHN1c3BlbmRfc2V0X29wcyhjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fc3VzcGVuZF9vcHMgKm9wcykge30KIHN0YXRpYyBpbmxpbmUgaW50IHBtX3N1c3BlbmQoc3VzcGVuZF9zdGF0ZV90IHN0YXRlKSB7IHJldHVybiAtRU5PU1lTOyB9CiBzdGF0aWMgaW5saW5lIGJvb2wgaWRsZV9zaG91bGRfZnJlZXplKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IHBtX3N0YXRlc19pbml0KHZvaWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgZnJlZXplX3NldF9vcHMoY29uc3Qgc3RydWN0IHBsYXRmb3JtX2ZyZWV6ZV9vcHMgKm9wcykge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlemVfd2FrZSh2b2lkKSB7fQogI2VuZGlmIC8qICFDT05GSUdfU1VTUEVORCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2FwLmggYi9pbmNsdWRlL2xpbnV4L3N3YXAuaAppbmRleCBiMTdjYzQ4Li5lMWQ3NjE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXAuaApAQCAtMjU3LDYgKzI1Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3b3JraW5nc2V0X25vZGVfcGFnZXNfZGVjKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUpCiB7CisJVk1fV0FSTl9PTl9PTkNFKCF3b3JraW5nc2V0X25vZGVfcGFnZXMobm9kZSkpOwogCW5vZGUtPmNvdW50LS07CiB9CiAKQEAgLTI3Miw2ICsyNzMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgd29ya2luZ3NldF9ub2RlX3NoYWRvd3NfZGVjKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUpCiB7CisJVk1fV0FSTl9PTl9PTkNFKCF3b3JraW5nc2V0X25vZGVfc2hhZG93cyhub2RlKSk7CiAJbm9kZS0+Y291bnQgLT0gMVUgPDwgUkFESVhfVFJFRV9DT1VOVF9TSElGVDsKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaCBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKaW5kZXggYTRmNzIwMy4uYWRmNGU1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvdWlkZ2lkLmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9zeXNjdGwuaD4KIAogLyogRm9yIHRoZSAvcHJvYy9zeXMgc3VwcG9ydCAqLwpAQCAtMTU3LDggKzE1OCwxMCBAQAogCiBzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3QgewogCXN0cnVjdCBjdGxfdGFibGVfc2V0IGRlZmF1bHRfc2V0OwotCXN0cnVjdCBjdGxfdGFibGVfc2V0ICooKmxvb2t1cCkoc3RydWN0IGN0bF90YWJsZV9yb290ICpyb290LAotCQkJCQkgICBzdHJ1Y3QgbnNwcm94eSAqbmFtZXNwYWNlcyk7CisJc3RydWN0IGN0bF90YWJsZV9zZXQgKigqbG9va3VwKShzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3QgKnJvb3QpOworCXZvaWQgKCpzZXRfb3duZXJzaGlwKShzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqaGVhZCwKKwkJCSAgICAgIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLAorCQkJICAgICAga3VpZF90ICp1aWQsIGtnaWRfdCAqZ2lkKTsKIAlpbnQgKCpwZXJtaXNzaW9ucykoc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmhlYWQsIHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlKTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdDEwLXBpLmggYi9pbmNsdWRlL2xpbnV4L3QxMC1waS5oCmluZGV4IGRkOGRlODIuLjlmYmE5ZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdDEwLXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC90MTAtcGkuaApAQCAtNSw2ICs1LDI2IEBACiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAKIC8qCisgKiBBIFQxMCBQSS1jYXBhYmxlIHRhcmdldCBkZXZpY2UgY2FuIGJlIGZvcm1hdHRlZCB3aXRoIGRpZmZlcmVudAorICogcHJvdGVjdGlvbiBzY2hlbWVzLglDdXJyZW50bHkgMCB0aHJvdWdoIDMgYXJlIGRlZmluZWQ6CisgKgorICogVHlwZSAwIGlzIHJlZ3VsYXIgKHVucHJvdGVjdGVkKSBJL08KKyAqCisgKiBUeXBlIDEgZGVmaW5lcyB0aGUgY29udGVudHMgb2YgdGhlIGd1YXJkIGFuZCByZWZlcmVuY2UgdGFncworICoKKyAqIFR5cGUgMiBkZWZpbmVzIHRoZSBjb250ZW50cyBvZiB0aGUgZ3VhcmQgYW5kIHJlZmVyZW5jZSB0YWdzIGFuZAorICogdXNlcyAzMi1ieXRlIGNvbW1hbmRzIHRvIHNlZWQgdGhlIGxhdHRlcgorICoKKyAqIFR5cGUgMyBkZWZpbmVzIHRoZSBjb250ZW50cyBvZiB0aGUgZ3VhcmQgdGFnIG9ubHkKKyAqLworZW51bSB0MTBfZGlmX3R5cGUgeworCVQxMF9QSV9UWVBFMF9QUk9URUNUSU9OID0gMHgwLAorCVQxMF9QSV9UWVBFMV9QUk9URUNUSU9OID0gMHgxLAorCVQxMF9QSV9UWVBFMl9QUk9URUNUSU9OID0gMHgyLAorCVQxMF9QSV9UWVBFM19QUk9URUNUSU9OID0gMHgzLAorfTsKKworLyoKICAqIFQxMCBQcm90ZWN0aW9uIEluZm9ybWF0aW9uIHR1cGxlLgogICovCiBzdHJ1Y3QgdDEwX3BpX3R1cGxlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGNwLmggYi9pbmNsdWRlL2xpbnV4L3RjcC5oCmluZGV4IDdiZTliMTIuLmExN2FlN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGNwLmgKKysrIGIvaW5jbHVkZS9saW51eC90Y3AuaApAQCAtMTksNiArMTksNyBAQAogCiAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC93aW5fbWlubWF4Lmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaD4KICNpbmNsdWRlIDxuZXQvaW5ldF90aW1ld2FpdF9zb2NrLmg+CkBAIC0yMTIsNyArMjEzLDggQEAKIAkJdTggcmVvcmQ7ICAgIC8qIHJlb3JkZXJpbmcgZGV0ZWN0ZWQgKi8KIAl9IHJhY2s7CiAJdTE2CWFkdm1zczsJCS8qIEFkdmVydGlzZWQgTVNTCQkJKi8KLQl1OAl1bnVzZWQ7CisJdTgJcmF0ZV9hcHBfbGltaXRlZDoxLCAgLyogcmF0ZV97ZGVsaXZlcmVkLGludGVydmFsX3VzfSBsaW1pdGVkPyAqLworCQl1bnVzZWQ6NzsKIAl1OAlub25hZ2xlICAgICA6IDQsLyogRGlzYWJsZSBOYWdsZSBhbGdvcml0aG0/ICAgICAgICAgICAgICovCiAJCXRoaW5fbHRvICAgIDogMSwvKiBVc2UgbGluZWFyIHRpbWVvdXRzIGZvciB0aGluIHN0cmVhbXMgKi8KIAkJdGhpbl9kdXBhY2sgOiAxLC8qIEZhc3QgcmV0cmFuc21pdCBvbiBmaXJzdCBkdXBhY2sgICAgICAqLwpAQCAtMjM0LDkgKzIzNiw3IEBACiAJdTMyCW1kZXZfbWF4X3VzOwkvKiBtYXhpbWFsIG1kZXYgZm9yIHRoZSBsYXN0IHJ0dCBwZXJpb2QJKi8KIAl1MzIJcnR0dmFyX3VzOwkvKiBzbW9vdGhlZCBtZGV2X21heAkJCSovCiAJdTMyCXJ0dF9zZXE7CS8qIHNlcXVlbmNlIG51bWJlciB0byB1cGRhdGUgcnR0dmFyCSovCi0Jc3RydWN0IHJ0dF9tZWFzIHsKLQkJdTMyIHJ0dCwgdHM7CS8qIFJUVCBpbiB1c2VjIGFuZCBzYW1wbGluZyB0aW1lIGluIGppZmZpZXMuICovCi0JfSBydHRfbWluWzNdOworCXN0cnVjdCAgbWlubWF4IHJ0dF9taW47CiAKIAl1MzIJcGFja2V0c19vdXQ7CS8qIFBhY2tldHMgd2hpY2ggYXJlICJpbiBmbGlnaHQiCSovCiAJdTMyCXJldHJhbnNfb3V0OwkvKiBSZXRyYW5zbWl0dGVkIHBhY2tldHMgb3V0CQkqLwpAQCAtMjY4LDYgKzI2OCwxMiBAQAogCQkJCSAqIHJlY2VpdmVyIGluIFJlY292ZXJ5LiAqLwogCXUzMglwcnJfb3V0OwkvKiBUb3RhbCBudW1iZXIgb2YgcGt0cyBzZW50IGR1cmluZyBSZWNvdmVyeS4gKi8KIAl1MzIJZGVsaXZlcmVkOwkvKiBUb3RhbCBkYXRhIHBhY2tldHMgZGVsaXZlcmVkIGluY2wuIHJleG1pdHMgKi8KKwl1MzIJbG9zdDsJCS8qIFRvdGFsIGRhdGEgcGFja2V0cyBsb3N0IGluY2wuIHJleG1pdHMgKi8KKwl1MzIJYXBwX2xpbWl0ZWQ7CS8qIGxpbWl0ZWQgdW50aWwgImRlbGl2ZXJlZCIgcmVhY2hlcyB0aGlzIHZhbCAqLworCXN0cnVjdCBza2JfbXN0YW1wIGZpcnN0X3R4X21zdGFtcDsgIC8qIHN0YXJ0IG9mIHdpbmRvdyBzZW5kIHBoYXNlICovCisJc3RydWN0IHNrYl9tc3RhbXAgZGVsaXZlcmVkX21zdGFtcDsgLyogdGltZSB3ZSByZWFjaGVkICJkZWxpdmVyZWQiICovCisJdTMyCXJhdGVfZGVsaXZlcmVkOyAgICAvKiBzYXZlZCByYXRlIHNhbXBsZTogcGFja2V0cyBkZWxpdmVyZWQgKi8KKwl1MzIJcmF0ZV9pbnRlcnZhbF91czsgIC8qIHNhdmVkIHJhdGUgc2FtcGxlOiB0aW1lIGVsYXBzZWQgKi8KIAogIAl1MzIJcmN2X3duZDsJLyogQ3VycmVudCByZWNlaXZlciB3aW5kb3cJCSovCiAJdTMyCXdyaXRlX3NlcTsJLyogVGFpbCgrMSkgb2YgZGF0YSBoZWxkIGluIHRjcCBzZW5kIGJ1ZmZlciAqLwpAQCAtMjgxLDEwICsyODcsOSBAQAogCXN0cnVjdCBza19idWZmKiBsb3N0X3NrYl9oaW50OwogCXN0cnVjdCBza19idWZmICpyZXRyYW5zbWl0X3NrYl9oaW50OwogCi0JLyogT09PIHNlZ21lbnRzIGdvIGluIHRoaXMgbGlzdC4gTm90ZSB0aGF0IHNvY2tldCBsb2NrIG11c3QgYmUgaGVsZCwKLQkgKiBhcyB3ZSBkbyBub3QgdXNlIHNrX2J1ZmZfaGVhZCBsb2NrLgotCSAqLwotCXN0cnVjdCBza19idWZmX2hlYWQJb3V0X29mX29yZGVyX3F1ZXVlOworCS8qIE9PTyBzZWdtZW50cyBnbyBpbiB0aGlzIHJidHJlZS4gU29ja2V0IGxvY2sgbXVzdCBiZSBoZWxkLiAqLworCXN0cnVjdCByYl9yb290CW91dF9vZl9vcmRlcl9xdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZgkqb29vX2xhc3Rfc2tiOyAvKiBjYWNoZSByYl9sYXN0KG91dF9vZl9vcmRlcl9xdWV1ZSkgKi8KIAogCS8qIFNBQ0tzIGRhdGEsIHRoZXNlIDIgbmVlZCB0byBiZSB0b2dldGhlciAoc2VlIHRjcF9vcHRpb25zX3dyaXRlKSAqLwogCXN0cnVjdCB0Y3Bfc2Fja19ibG9jayBkdXBsaWNhdGVfc2Fja1sxXTsgLyogRC1TQUNLIGJsb2NrICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2xpbnV4L3RocmVhZF9pbmZvLmgKaW5kZXggY2JkODk5MC4uNDVmMDA0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aHJlYWRfaW5mby5oCisrKyBiL2luY2x1ZGUvbGludXgvdGhyZWFkX2luZm8uaApAQCAtMTMsNiArMTMsMjEgQEAKIHN0cnVjdCB0aW1lc3BlYzsKIHN0cnVjdCBjb21wYXRfdGltZXNwZWM7CiAKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworc3RydWN0IHRocmVhZF9pbmZvIHsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGxvdyBsZXZlbCBmbGFncyAqLworfTsKKworI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCit7CQkJCQkJXAorCS5mbGFncwkJPSAwLAkJCVwKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1RIUkVBRF9JTkZPX0lOX1RBU0sKKyNkZWZpbmUgY3VycmVudF90aHJlYWRfaW5mbygpICgoc3RydWN0IHRocmVhZF9pbmZvICopY3VycmVudCkKKyNlbmRpZgorCiAvKgogICogU3lzdGVtIGNhbGwgcmVzdGFydCBibG9jay4KICAqLwpAQCAtMTE4LDEwICsxMzMsMTEgQEAKIGV4dGVybiB2b2lkIF9fY2hlY2tfb2JqZWN0X3NpemUoY29uc3Qgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG4sCiAJCQkJCWJvb2wgdG9fdXNlcik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19vYmplY3Rfc2l6ZShjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgbiwKLQkJCQkgICAgIGJvb2wgdG9fdXNlcikKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBjaGVja19vYmplY3Rfc2l6ZShjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgbiwKKwkJCQkJICAgICAgYm9vbCB0b191c2VyKQogewotCV9fY2hlY2tfb2JqZWN0X3NpemUocHRyLCBuLCB0b191c2VyKTsKKwlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKG4pKQorCQlfX2NoZWNrX29iamVjdF9zaXplKHB0ciwgbiwgdG9fdXNlcik7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX29iamVjdF9zaXplKGNvbnN0IHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBuLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lNjQuaCBiL2luY2x1ZGUvbGludXgvdGltZTY0LmgKaW5kZXggN2U1ZDJmYS4uOTgwYzcxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1lNjQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWU2NC5oCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogCiB0eXBlZGVmIF9fczY0IHRpbWU2NF90OwordHlwZWRlZiBfX3U2NCB0aW1ldTY0X3Q7CiAKIC8qCiAgKiBUaGlzIHdhbnRzIHRvIGdvIGludG8gdWFwaS9saW51eC90aW1lLmggb25jZSB3ZSBhZ3JlZWQgYWJvdXQgdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWVrZWVwaW5nLmggYi9pbmNsdWRlL2xpbnV4L3RpbWVrZWVwaW5nLmgKaW5kZXggODE2Yjc1NC4uMDkxNjhjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1la2VlcGluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZWtlZXBpbmcuaApAQCAtMSw3ICsxLDcgQEAKICNpZm5kZWYgX0xJTlVYX1RJTUVLRUVQSU5HX0gKICNkZWZpbmUgX0xJTlVYX1RJTUVLRUVQSU5HX0gKIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Vycm5vLWJhc2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCiAvKiBJbmNsdWRlZCBmcm9tIGxpbnV4L2t0aW1lLmggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90b3J0dXJlLmggYi9pbmNsdWRlL2xpbnV4L3RvcnR1cmUuaAppbmRleCA2Njg1YTczLi5hNDU3MDJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RvcnR1cmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RvcnR1cmUuaApAQCAtNDMsNyArNDMsNyBAQAogCiAjZGVmaW5lIFRPUlRVUkVfRkxBRyAiLXRvcnR1cmU6IgogI2RlZmluZSBUT1JPVVRfU1RSSU5HKHMpIFwKLQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRyBzICJcbiIsIHRvcnR1cmVfdHlwZSkKKwlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRyAiICVzXG4iLCB0b3J0dXJlX3R5cGUsIHMpCiAjZGVmaW5lIFZFUkJPU0VfVE9ST1VUX1NUUklORyhzKSBcCiAJZG8geyBpZiAodmVyYm9zZSkgcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcgIiAlc1xuIiwgdG9ydHVyZV90eXBlLCBzKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgVkVSQk9TRV9UT1JPVVRfRVJSU1RSSU5HKHMpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdTY0X3N0YXRzX3N5bmMuaCBiL2luY2x1ZGUvbGludXgvdTY0X3N0YXRzX3N5bmMuaAppbmRleCBkM2EyYmI3Li42NTBmM2RkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3U2NF9zdGF0c19zeW5jLmgKKysrIGIvaW5jbHVkZS9saW51eC91NjRfc3RhdHNfc3luYy5oCkBAIC0xMDMsMjkgKzEwMyw0MCBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHU2NF9zdGF0c19mZXRjaF9iZWdpbihjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX191NjRfc3RhdHNfZmV0Y2hfYmVnaW4oY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCkKIHsKICNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCiAJcmV0dXJuIHJlYWRfc2VxY291bnRfYmVnaW4oJnN5bmNwLT5zZXEpOwogI2Vsc2UKLSNpZiBCSVRTX1BFUl9MT05HPT0zMgorCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHU2NF9zdGF0c19mZXRjaF9iZWdpbihjb25zdCBzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgKnN5bmNwKQoreworI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmICFkZWZpbmVkKENPTkZJR19TTVApCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAjZW5kaWYKLQlyZXR1cm4gMDsKKwlyZXR1cm4gX191NjRfc3RhdHNfZmV0Y2hfYmVnaW4oc3luY3ApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX191NjRfc3RhdHNfZmV0Y2hfcmV0cnkoY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCwKKwkJCQkJIHVuc2lnbmVkIGludCBzdGFydCkKK3sKKyNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCisJcmV0dXJuIHJlYWRfc2VxY291bnRfcmV0cnkoJnN5bmNwLT5zZXEsIHN0YXJ0KTsKKyNlbHNlCisJcmV0dXJuIGZhbHNlOwogI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCB1NjRfc3RhdHNfZmV0Y2hfcmV0cnkoY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCwKIAkJCQkJIHVuc2lnbmVkIGludCBzdGFydCkKIHsKLSNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCi0JcmV0dXJuIHJlYWRfc2VxY291bnRfcmV0cnkoJnN5bmNwLT5zZXEsIHN0YXJ0KTsKLSNlbHNlCi0jaWYgQklUU19QRVJfTE9ORz09MzIKKyNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiAhZGVmaW5lZChDT05GSUdfU01QKQogCXByZWVtcHRfZW5hYmxlKCk7CiAjZW5kaWYKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKKwlyZXR1cm4gX191NjRfc3RhdHNfZmV0Y2hfcmV0cnkoc3luY3AsIHN0YXJ0KTsKIH0KIAogLyoKQEAgLTEzNiwyNyArMTQ3LDE5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9pcnEoY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCkKIHsKLSNpZiBCSVRTX1BFUl9MT05HPT0zMiAmJiBkZWZpbmVkKENPTkZJR19TTVApCi0JcmV0dXJuIHJlYWRfc2VxY291bnRfYmVnaW4oJnN5bmNwLT5zZXEpOwotI2Vsc2UKLSNpZiBCSVRTX1BFUl9MT05HPT0zMgorI2lmIEJJVFNfUEVSX0xPTkc9PTMyICYmICFkZWZpbmVkKENPTkZJR19TTVApCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKICNlbmRpZgotCXJldHVybiAwOwotI2VuZGlmCisJcmV0dXJuIF9fdTY0X3N0YXRzX2ZldGNoX2JlZ2luKHN5bmNwKTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIHU2NF9zdGF0c19mZXRjaF9yZXRyeV9pcnEoY29uc3Qgc3RydWN0IHU2NF9zdGF0c19zeW5jICpzeW5jcCwKLQkJCQkJIHVuc2lnbmVkIGludCBzdGFydCkKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgc3RhcnQpCiB7Ci0jaWYgQklUU19QRVJfTE9ORz09MzIgJiYgZGVmaW5lZChDT05GSUdfU01QKQotCXJldHVybiByZWFkX3NlcWNvdW50X3JldHJ5KCZzeW5jcC0+c2VxLCBzdGFydCk7Ci0jZWxzZQotI2lmIEJJVFNfUEVSX0xPTkc9PTMyCisjaWYgQklUU19QRVJfTE9ORz09MzIgJiYgIWRlZmluZWQoQ09ORklHX1NNUCkKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAjZW5kaWYKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKKwlyZXR1cm4gX191NjRfc3RhdHNfZmV0Y2hfcmV0cnkoc3luY3AsIHN0YXJ0KTsKIH0KIAogI2VuZGlmIC8qIF9MSU5VWF9VNjRfU1RBVFNfU1lOQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vpby5oIGIvaW5jbHVkZS9saW51eC91aW8uaAppbmRleCAxYjVkMWNkLi5iNWViZTZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Vpby5oCisrKyBiL2luY2x1ZGUvbGludXgvdWlvLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDx1YXBpL2xpbnV4L3Vpby5oPgogCiBzdHJ1Y3QgcGFnZTsKK3N0cnVjdCBwaXBlX2lub2RlX2luZm87CiAKIHN0cnVjdCBrdmVjIHsKIAl2b2lkICppb3ZfYmFzZTsgLyogYW5kIHRoYXQgc2hvdWxkICpuZXZlciogaG9sZCBhIHVzZXJsYW5kIHBvaW50ZXIgKi8KQEAgLTIzLDYgKzI0LDcgQEAKIAlJVEVSX0lPVkVDID0gMCwKIAlJVEVSX0tWRUMgPSAyLAogCUlURVJfQlZFQyA9IDQsCisJSVRFUl9QSVBFID0gOCwKIH07CiAKIHN0cnVjdCBpb3ZfaXRlciB7CkBAIC0zMyw4ICszNSwxMiBAQAogCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdjsKIAkJY29uc3Qgc3RydWN0IGt2ZWMgKmt2ZWM7CiAJCWNvbnN0IHN0cnVjdCBiaW9fdmVjICpidmVjOworCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlOwogCX07Ci0JdW5zaWduZWQgbG9uZyBucl9zZWdzOworCXVuaW9uIHsKKwkJdW5zaWduZWQgbG9uZyBucl9zZWdzOworCQlpbnQgaWR4OworCX07CiB9OwogCiAvKgpAQCAtNjQsNyArNzAsNyBAQAogfQogCiAjZGVmaW5lIGlvdl9mb3JfZWFjaChpb3YsIGl0ZXIsIHN0YXJ0KQkJCQlcCi0JaWYgKCEoKHN0YXJ0KS50eXBlICYgSVRFUl9CVkVDKSkJCQlcCisJaWYgKCEoKHN0YXJ0KS50eXBlICYgKElURVJfQlZFQyB8IElURVJfUElQRSkpKQkJXAogCWZvciAoaXRlciA9IChzdGFydCk7CQkJCQlcCiAJICAgICAoaXRlcikuY291bnQgJiYJCQkJCVwKIAkgICAgICgoaW92ID0gaW92X2l0ZXJfaW92ZWMoJihpdGVyKSkpLCAxKTsJCVwKQEAgLTc2LDcgKzgyLDcgQEAKIAkJc3RydWN0IGlvdl9pdGVyICppLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IGJ5dGVzKTsKIHZvaWQgaW92X2l0ZXJfYWR2YW5jZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcyk7CiBpbnQgaW92X2l0ZXJfZmF1bHRfaW5fcmVhZGFibGUoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3QgYnl0ZXMpOwotaW50IGlvdl9pdGVyX2ZhdWx0X2luX211bHRpcGFnZXNfcmVhZGFibGUoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3QgYnl0ZXMpOworI2RlZmluZSBpb3ZfaXRlcl9mYXVsdF9pbl9tdWx0aXBhZ2VzX3JlYWRhYmxlIGlvdl9pdGVyX2ZhdWx0X2luX3JlYWRhYmxlCiBzaXplX3QgaW92X2l0ZXJfc2luZ2xlX3NlZ19jb3VudChjb25zdCBzdHJ1Y3QgaW92X2l0ZXIgKmkpOwogc2l6ZV90IGNvcHlfcGFnZV90b19pdGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgYnl0ZXMsCiAJCQkgc3RydWN0IGlvdl9pdGVyICppKTsKQEAgLTk0LDYgKzEwMCw4IEBACiAJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIHNpemVfdCBjb3VudCk7CiB2b2lkIGlvdl9pdGVyX2J2ZWMoc3RydWN0IGlvdl9pdGVyICppLCBpbnQgZGlyZWN0aW9uLCBjb25zdCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywKIAkJCXVuc2lnbmVkIGxvbmcgbnJfc2Vncywgc2l6ZV90IGNvdW50KTsKK3ZvaWQgaW92X2l0ZXJfcGlwZShzdHJ1Y3QgaW92X2l0ZXIgKmksIGludCBkaXJlY3Rpb24sIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsCisJCQlzaXplX3QgY291bnQpOwogc3NpemVfdCBpb3ZfaXRlcl9nZXRfcGFnZXMoc3RydWN0IGlvdl9pdGVyICppLCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAogCQkJc2l6ZV90IG1heHNpemUsIHVuc2lnbmVkIG1heHBhZ2VzLCBzaXplX3QgKnN0YXJ0KTsKIHNzaXplX3QgaW92X2l0ZXJfZ2V0X3BhZ2VzX2FsbG9jKHN0cnVjdCBpb3ZfaXRlciAqaSwgc3RydWN0IHBhZ2UgKioqcGFnZXMsCkBAIC0xMDksNyArMTE3LDcgQEAKIAogc3RhdGljIGlubGluZSBib29sIGl0ZXJfaXNfaW92ZWMoc3RydWN0IGlvdl9pdGVyICppKQogewotCXJldHVybiAhKGktPnR5cGUgJiAoSVRFUl9CVkVDIHwgSVRFUl9LVkVDKSk7CisJcmV0dXJuICEoaS0+dHlwZSAmIChJVEVSX0JWRUMgfCBJVEVSX0tWRUMgfCBJVEVSX1BJUEUpKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWxwaS9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvdWxwaS9kcml2ZXIuaAppbmRleCAzODhmNmUwLi5hN2FmMjFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VscGkvZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC91bHBpL2RyaXZlci5oCkBAIC0xNSw3ICsxNSw3IEBACiAgKi8KIHN0cnVjdCB1bHBpIHsKIAlzdHJ1Y3QgdWxwaV9kZXZpY2VfaWQgaWQ7Ci0Jc3RydWN0IHVscGlfb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IHVscGlfb3BzICpvcHM7CiAJc3RydWN0IGRldmljZSBkZXY7CiB9OwogCkBAIC00Nyw3ICs0NywxMSBAQAogCiAjZGVmaW5lIHRvX3VscGlfZHJpdmVyKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgdWxwaV9kcml2ZXIsIGRyaXZlcikKIAotaW50IHVscGlfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB1bHBpX2RyaXZlciAqZHJ2KTsKKy8qCisgKiB1c2UgYSBtYWNybyB0byBhdm9pZCBpbmNsdWRlIGNoYWluaW5nIHRvIGdldCBUSElTX01PRFVMRQorICovCisjZGVmaW5lIHVscGlfcmVnaXN0ZXJfZHJpdmVyKGRydikgX191bHBpX3JlZ2lzdGVyX2RyaXZlcihkcnYsIFRISVNfTU9EVUxFKQoraW50IF9fdWxwaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVscGlfZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSk7CiB2b2lkIHVscGlfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVscGlfZHJpdmVyICpkcnYpOwogCiAjZGVmaW5lIG1vZHVsZV91bHBpX2RyaXZlcihfX3VscGlfZHJpdmVyKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VscGkvaW50ZXJmYWNlLmggYi9pbmNsdWRlL2xpbnV4L3VscGkvaW50ZXJmYWNlLmgKaW5kZXggNGRlOGFiNC4uYTIwMTFhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91bHBpL2ludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdWxwaS9pbnRlcmZhY2UuaApAQCAtNCwyMCArNCwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIHN0cnVjdCB1bHBpOworc3RydWN0IGRldmljZTsKIAogLyoqCiAgKiBzdHJ1Y3QgdWxwaV9vcHMgLSBVTFBJIHJlZ2lzdGVyIGFjY2VzcwotICogQGRldjogdGhlIGludGVyZmFjZSBwcm92aWRlcgogICogQHJlYWQ6IHJlYWQgb3BlcmF0aW9uIGZvciBVTFBJIHJlZ2lzdGVyIGFjY2VzcwogICogQHdyaXRlOiB3cml0ZSBvcGVyYXRpb24gZm9yIFVMUEkgcmVnaXN0ZXIgYWNjZXNzCiAgKi8KIHN0cnVjdCB1bHBpX29wcyB7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCWludCAoKnJlYWQpKHN0cnVjdCB1bHBpX29wcyAqb3BzLCB1OCBhZGRyKTsKLQlpbnQgKCp3cml0ZSkoc3RydWN0IHVscGlfb3BzICpvcHMsIHU4IGFkZHIsIHU4IHZhbCk7CisJaW50ICgqcmVhZCkoc3RydWN0IGRldmljZSAqZGV2LCB1OCBhZGRyKTsKKwlpbnQgKCp3cml0ZSkoc3RydWN0IGRldmljZSAqZGV2LCB1OCBhZGRyLCB1OCB2YWwpOwogfTsKIAotc3RydWN0IHVscGkgKnVscGlfcmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHVscGlfb3BzICopOworc3RydWN0IHVscGkgKnVscGlfcmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBkZXZpY2UgKiwgY29uc3Qgc3RydWN0IHVscGlfb3BzICopOwogdm9pZCB1bHBpX3VucmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCB1bHBpICopOwogCiAjZW5kaWYgLyogX19MSU5VWF9VTFBJX0lOVEVSRkFDRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaCBiL2luY2x1ZGUvbGludXgvdXNiL2NvbXBvc2l0ZS5oCmluZGV4IDJiODFiMjQuLjQ2MTZhNDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2NvbXBvc2l0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2NvbXBvc2l0ZS5oCkBAIC0yMjAsNyArMjIwLDggQEAKIAlpbnQJCQkoKnNldHVwKShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICosCiAJCQkJCWNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKik7CiAJYm9vbAkJCSgqcmVxX21hdGNoKShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICosCi0JCQkJCWNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKik7CisJCQkJCWNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKiwKKwkJCQkJYm9vbCBjb25maWcwKTsKIAl2b2lkCQkJKCpzdXNwZW5kKShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICopOwogCXZvaWQJCQkoKnJlc3VtZSkoc3RydWN0IHVzYl9mdW5jdGlvbiAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0LmggYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaAppbmRleCA2MTJkYmRmLi44ZTgxZjllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaApAQCAtMzQ2LDYgKzM0Niw4IEBACiAgKglvciBCLVBlcmlwaGVyYWwgd2FudHMgdG8gdGFrZSBob3N0IHJvbGUuCiAgKiBAcXVpcmtfZXBfb3V0X2FsaWduZWRfc2l6ZTogZXBvdXQgcmVxdWlyZXMgYnVmZmVyIHNpemUgdG8gYmUgYWxpZ25lZCB0bwogICoJTWF4UGFja2V0U2l6ZS4KKyAqIEBxdWlya19hdm9pZHNfc2tiX3Jlc2VydmU6IHVkYy9wbGF0Zm9ybSB3YW50cyB0byBhdm9pZCBza2JfcmVzZXJ2ZSgpIGluCisgKgl1X2V0aGVyLmMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KICAqIEBpc19zZWxmcG93ZXJlZDogaWYgdGhlIGdhZGdldCBpcyBzZWxmLXBvd2VyZWQuCiAgKiBAZGVhY3RpdmF0ZWQ6IFRydWUgaWYgZ2FkZ2V0IGlzIGRlYWN0aXZhdGVkIC0gaW4gZGVhY3RpdmF0ZWQgc3RhdGUgaXQgY2Fubm90CiAgKgliZSBjb25uZWN0ZWQuCkBAIC0zOTgsNiArNDAwLDcgQEAKIAl1bnNpZ25lZAkJCXF1aXJrX2FsdHNldF9ub3Rfc3VwcDoxOwogCXVuc2lnbmVkCQkJcXVpcmtfc3RhbGxfbm90X3N1cHA6MTsKIAl1bnNpZ25lZAkJCXF1aXJrX3pscF9ub3Rfc3VwcDoxOworCXVuc2lnbmVkCQkJcXVpcmtfYXZvaWRzX3NrYl9yZXNlcnZlOjE7CiAJdW5zaWduZWQJCQlpc19zZWxmcG93ZXJlZDoxOwogCXVuc2lnbmVkCQkJZGVhY3RpdmF0ZWQ6MTsKIAl1bnNpZ25lZAkJCWNvbm5lY3RlZDoxOwpAQCAtNDE4LDggKzQyMSwyMCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmKGdhZGdldCktPmVwX2xpc3QsIGVwX2xpc3QpCiAKIC8qKgorICogdXNiX2VwX2FsaWduIC0gcmV0dXJucyBAbGVuIGFsaWduZWQgdG8gZXAncyBtYXhwYWNrZXRzaXplLgorICogQGVwOiB0aGUgZW5kcG9pbnQgd2hvc2UgbWF4cGFja2V0c2l6ZSBpcyB1c2VkIHRvIGFsaWduIEBsZW4KKyAqIEBsZW46IGJ1ZmZlciBzaXplJ3MgbGVuZ3RoIHRvIGFsaWduIHRvIEBlcCdzIG1heHBhY2tldHNpemUKKyAqCisgKiBUaGlzIGhlbHBlciBpcyB1c2VkIHRvIGFsaWduIGJ1ZmZlcidzIHNpemUgdG8gYW4gZXAncyBtYXhwYWNrZXRzaXplLgorICovCitzdGF0aWMgaW5saW5lIHNpemVfdCB1c2JfZXBfYWxpZ24oc3RydWN0IHVzYl9lcCAqZXAsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIHJvdW5kX3VwKGxlbiwgKHNpemVfdClsZTE2X3RvX2NwdShlcC0+ZGVzYy0+d01heFBhY2tldFNpemUpKTsKK30KKworLyoqCiAgKiB1c2JfZXBfYWxpZ25fbWF5YmUgLSByZXR1cm5zIEBsZW4gYWxpZ25lZCB0byBlcCdzIG1heHBhY2tldHNpemUgaWYgZ2FkZ2V0Ci0gKglyZXF1aXJlcyBxdWlya19lcF9vdXRfYWxpZ25lZF9zaXplLCBvdGhlcndpc2UgcmVndWVucyBsZW4uCisgKglyZXF1aXJlcyBxdWlya19lcF9vdXRfYWxpZ25lZF9zaXplLCBvdGhlcndpc2UgcmV0dXJucyBsZW4uCiAgKiBAZzogY29udHJvbGxlciB0byBjaGVjayBmb3IgcXVpcmsKICAqIEBlcDogdGhlIGVuZHBvaW50IHdob3NlIG1heHBhY2tldHNpemUgaXMgdXNlZCB0byBhbGlnbiBAbGVuCiAgKiBAbGVuOiBidWZmZXIgc2l6ZSdzIGxlbmd0aCB0byBhbGlnbiB0byBAZXAncyBtYXhwYWNrZXRzaXplCkBAIC00MzAsOCArNDQ1LDcgQEAKIHN0YXRpYyBpbmxpbmUgc2l6ZV90CiB1c2JfZXBfYWxpZ25fbWF5YmUoc3RydWN0IHVzYl9nYWRnZXQgKmcsIHN0cnVjdCB1c2JfZXAgKmVwLCBzaXplX3QgbGVuKQogewotCXJldHVybiAhZy0+cXVpcmtfZXBfb3V0X2FsaWduZWRfc2l6ZSA/IGxlbiA6Ci0JCQlyb3VuZF91cChsZW4sIChzaXplX3QpZXAtPmRlc2MtPndNYXhQYWNrZXRTaXplKTsKKwlyZXR1cm4gZy0+cXVpcmtfZXBfb3V0X2FsaWduZWRfc2l6ZSA/IHVzYl9lcF9hbGlnbihlcCwgbGVuKSA6IGxlbjsKIH0KIAogLyoqCkBAIC00NjMsNiArNDc3LDE2IEBACiB9CiAKIC8qKgorICogZ2FkZ2V0X2F2b2lkc19za2JfcmVzZXJ2ZSAtIHJldHVybiB0cnVlIGlmZiB0aGUgaGFyZHdhcmUgd291bGQgbGlrZSB0byBhdm9pZAorICoJc2tiX3Jlc2VydmUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAqIEBnOiBjb250cm9sbGVyIHRvIGNoZWNrIGZvciBxdWlyaworICovCitzdGF0aWMgaW5saW5lIGludCBnYWRnZXRfYXZvaWRzX3NrYl9yZXNlcnZlKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnKQoreworCXJldHVybiBnLT5xdWlya19hdm9pZHNfc2tiX3Jlc2VydmU7Cit9CisKKy8qKgogICogZ2FkZ2V0X2lzX2R1YWxzcGVlZCAtIHJldHVybiB0cnVlIGlmZiB0aGUgaGFyZHdhcmUgaGFuZGxlcyBoaWdoIHNwZWVkCiAgKiBAZzogY29udHJvbGxlciB0aGF0IG1pZ2h0IHN1cHBvcnQgYm90aCBoaWdoIGFuZCBmdWxsIHNwZWVkcwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oIGIvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAppbmRleCAyNDVmNTdkLi4wYWFlMWIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKQEAgLTgxLDYgKzgxLDggQEAKIAkJLyogU2V0cyBtYXhfc2VjdG9ycyB0byAyNDAgKi8JCQlcCiAJVVNfRkxBRyhOT19SRVBPUlRfTFVOUywJMHgxMDAwMDAwMCkJCQlcCiAJCS8qIENhbm5vdCBoYW5kbGUgUkVQT1JUX0xVTlMgKi8JCQlcCisJVVNfRkxBRyhBTFdBWVNfU1lOQywgMHgyMDAwMDAwMCkJCQlcCisJCS8qIGxpZXMgYWJvdXQgY2FjaGluZywgc28gYWx3YXlzIHN5bmMgKi8JXAogCiAjZGVmaW5lIFVTX0ZMQUcobmFtZSwgdmFsdWUpCVVTX0ZMXyMjbmFtZSA9IHZhbHVlICwKIGVudW0geyBVU19ET19BTExfRkxBR1MgfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNlcl9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbGludXgvdXNlcl9uYW1lc3BhY2UuaAppbmRleCA5MjE3MTY5Li5lYjIwOWQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzZXJfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2VyX25hbWVzcGFjZS5oCkBAIC0yMiw2ICsyMiwxOSBAQAogCiAjZGVmaW5lIFVTRVJOU19JTklUX0ZMQUdTIFVTRVJOU19TRVRHUk9VUFNfQUxMT1dFRAogCitzdHJ1Y3QgdWNvdW50czsKKworZW51bSB1Y291bnRfdHlwZSB7CisJVUNPVU5UX1VTRVJfTkFNRVNQQUNFUywKKwlVQ09VTlRfUElEX05BTUVTUEFDRVMsCisJVUNPVU5UX1VUU19OQU1FU1BBQ0VTLAorCVVDT1VOVF9JUENfTkFNRVNQQUNFUywKKwlVQ09VTlRfTkVUX05BTUVTUEFDRVMsCisJVUNPVU5UX01OVF9OQU1FU1BBQ0VTLAorCVVDT1VOVF9DR1JPVVBfTkFNRVNQQUNFUywKKwlVQ09VTlRfQ09VTlRTLAorfTsKKwogc3RydWN0IHVzZXJfbmFtZXNwYWNlIHsKIAlzdHJ1Y3QgdWlkX2dpZF9tYXAJdWlkX21hcDsKIAlzdHJ1Y3QgdWlkX2dpZF9tYXAJZ2lkX21hcDsKQEAgLTM5LDEwICs1MiwzMCBAQAogCXN0cnVjdCBrZXkJCSpwZXJzaXN0ZW50X2tleXJpbmdfcmVnaXN0ZXI7CiAJc3RydWN0IHJ3X3NlbWFwaG9yZQlwZXJzaXN0ZW50X2tleXJpbmdfcmVnaXN0ZXJfc2VtOwogI2VuZGlmCisJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisjaWZkZWYgQ09ORklHX1NZU0NUTAorCXN0cnVjdCBjdGxfdGFibGVfc2V0CXNldDsKKwlzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc3lzY3RsczsKKyNlbmRpZgorCXN0cnVjdCB1Y291bnRzCQkqdWNvdW50czsKKwlpbnQgdWNvdW50X21heFtVQ09VTlRfQ09VTlRTXTsKK307CisKK3N0cnVjdCB1Y291bnRzIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOworCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnM7CisJa3VpZF90IHVpZDsKKwlhdG9taWNfdCBjb3VudDsKKwlhdG9taWNfdCB1Y291bnRbVUNPVU5UX0NPVU5UU107CiB9OwogCiBleHRlcm4gc3RydWN0IHVzZXJfbmFtZXNwYWNlIGluaXRfdXNlcl9uczsKIAorYm9vbCBzZXR1cF91c2VybnNfc3lzY3RscyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKTsKK3ZvaWQgcmV0aXJlX3VzZXJuc19zeXNjdGxzKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpOworc3RydWN0IHVjb3VudHMgKmluY191Y291bnQoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucywga3VpZF90IHVpZCwgZW51bSB1Y291bnRfdHlwZSB0eXBlKTsKK3ZvaWQgZGVjX3Vjb3VudChzdHJ1Y3QgdWNvdW50cyAqdWNvdW50cywgZW51bSB1Y291bnRfdHlwZSB0eXBlKTsKKwogI2lmZGVmIENPTkZJR19VU0VSX05TCiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpnZXRfdXNlcl9ucyhzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zKQpAQCAtNTQsMTIgKzg3LDEyIEBACiAKIGV4dGVybiBpbnQgY3JlYXRlX3VzZXJfbnMoc3RydWN0IGNyZWQgKm5ldyk7CiBleHRlcm4gaW50IHVuc2hhcmVfdXNlcm5zKHVuc2lnbmVkIGxvbmcgdW5zaGFyZV9mbGFncywgc3RydWN0IGNyZWQgKipuZXdfY3JlZCk7Ci1leHRlcm4gdm9pZCBmcmVlX3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucyk7CitleHRlcm4gdm9pZCBfX3B1dF91c2VyX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3VzZXJfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucykKIHsKIAlpZiAobnMgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmbnMtPmNvdW50KSkKLQkJZnJlZV91c2VyX25zKG5zKTsKKwkJX19wdXRfdXNlcl9ucyhucyk7CiB9CiAKIHN0cnVjdCBzZXFfb3BlcmF0aW9uczsKQEAgLTczLDYgKzEwNiw4IEBACiBleHRlcm4gaW50IHByb2Nfc2V0Z3JvdXBzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKIGV4dGVybiBib29sIHVzZXJuc19tYXlfc2V0Z3JvdXBzKGNvbnN0IHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpOwogZXh0ZXJuIGJvb2wgY3VycmVudF9pbl91c2VybnMoY29uc3Qgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp0YXJnZXRfbnMpOworCitzdHJ1Y3QgbnNfY29tbW9uICpuc19nZXRfb3duZXIoc3RydWN0IG5zX2NvbW1vbiAqbnMpOwogI2Vsc2UKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmdldF91c2VyX25zKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCkBAIC0xMDYsNiArMTQxLDExIEBACiB7CiAJcmV0dXJuIHRydWU7CiB9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5zX2NvbW1vbiAqbnNfZ2V0X293bmVyKHN0cnVjdCBuc19jb21tb24gKm5zKQoreworCXJldHVybiBFUlJfUFRSKC1FUEVSTSk7Cit9CiAjZW5kaWYKIAogI2VuZGlmIC8qIF9MSU5VWF9VU0VSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXRzbmFtZS5oIGIvaW5jbHVkZS9saW51eC91dHNuYW1lLmgKaW5kZXggNTA5M2Y1OC4uNjBmMGJiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91dHNuYW1lLmgKKysrIGIvaW5jbHVkZS9saW51eC91dHNuYW1lLmgKQEAgLTI0LDYgKzI0LDcgQEAKIAlzdHJ1Y3Qga3JlZiBrcmVmOwogCXN0cnVjdCBuZXdfdXRzbmFtZSBuYW1lOwogCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9uczsKKwlzdHJ1Y3QgdWNvdW50cyAqdWNvdW50czsKIAlzdHJ1Y3QgbnNfY29tbW9uIG5zOwogfTsKIGV4dGVybiBzdHJ1Y3QgdXRzX25hbWVzcGFjZSBpbml0X3V0c19uczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1lLmggYi9pbmNsdWRlL2xpbnV4L3ZtZS5oCmluZGV4IDcxZTRhNmQuLmVhNjA5NWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1lLmgKKysrIGIvaW5jbHVkZS9saW51eC92bWUuaApAQCAtMTY2LDcgKzE2Niw3IEBACiBpbnQgdm1lX2xtX2NvdW50KHN0cnVjdCB2bWVfcmVzb3VyY2UgKik7CiBpbnQgdm1lX2xtX3NldChzdHJ1Y3Qgdm1lX3Jlc291cmNlICosIHVuc2lnbmVkIGxvbmcgbG9uZywgdTMyLCB1MzIpOwogaW50IHZtZV9sbV9nZXQoc3RydWN0IHZtZV9yZXNvdXJjZSAqLCB1bnNpZ25lZCBsb25nIGxvbmcgKiwgdTMyICosIHUzMiAqKTsKLWludCB2bWVfbG1fYXR0YWNoKHN0cnVjdCB2bWVfcmVzb3VyY2UgKiwgaW50LCB2b2lkICgqY2FsbGJhY2spKGludCkpOworaW50IHZtZV9sbV9hdHRhY2goc3RydWN0IHZtZV9yZXNvdXJjZSAqLCBpbnQsIHZvaWQgKCpjYWxsYmFjaykodm9pZCAqKSwgdm9pZCAqKTsKIGludCB2bWVfbG1fZGV0YWNoKHN0cnVjdCB2bWVfcmVzb3VyY2UgKiwgaW50KTsKIHZvaWQgdm1lX2xtX2ZyZWUoc3RydWN0IHZtZV9yZXNvdXJjZSAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93YWl0LmggYi9pbmNsdWRlL2xpbnV4L3dhaXQuaAppbmRleCBjM2ZmNzRkLi4yNDA4ZThkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93YWl0LmgKKysrIGIvaW5jbHVkZS9saW51eC93YWl0LmgKQEAgLTI0OCw2ICsyNDgsOCBAQAogCSghX19idWlsdGluX2NvbnN0YW50X3Aoc3RhdGUpIHx8CQkJCVwKIAkJc3RhdGUgPT0gVEFTS19JTlRFUlJVUFRJQkxFIHx8IHN0YXRlID09IFRBU0tfS0lMTEFCTEUpCVwKIAorZXh0ZXJuIHZvaWQgaW5pdF93YWl0X2VudHJ5KHdhaXRfcXVldWVfdCAqX193YWl0LCBpbnQgZmxhZ3MpOworCiAvKgogICogVGhlIGJlbG93IG1hY3JvIF9fX3dhaXRfZXZlbnQoKSBoYXMgYW4gZXhwbGljaXQgc2hhZG93IG9mIHRoZSBfX3JldAogICogdmFyaWFibGUgd2hlbiB1c2VkIGZyb20gdGhlIHdhaXRfZXZlbnRfKigpIG1hY3Jvcy4KQEAgLTI2NiwxMiArMjY4LDcgQEAKIAl3YWl0X3F1ZXVlX3QgX193YWl0OwkJCQkJCVwKIAlsb25nIF9fcmV0ID0gcmV0OwkvKiBleHBsaWNpdCBzaGFkb3cgKi8JCQlcCiAJCQkJCQkJCQlcCi0JSU5JVF9MSVNUX0hFQUQoJl9fd2FpdC50YXNrX2xpc3QpOwkJCQlcCi0JaWYgKGV4Y2x1c2l2ZSkJCQkJCQkJXAotCQlfX3dhaXQuZmxhZ3MgPSBXUV9GTEFHX0VYQ0xVU0lWRTsJCQlcCi0JZWxzZQkJCQkJCQkJXAotCQlfX3dhaXQuZmxhZ3MgPSAwOwkJCQkJXAotCQkJCQkJCQkJXAorCWluaXRfd2FpdF9lbnRyeSgmX193YWl0LCBleGNsdXNpdmUgPyBXUV9GTEFHX0VYQ0xVU0lWRSA6IDApOwlcCiAJZm9yICg7OykgewkJCQkJCQlcCiAJCWxvbmcgX19pbnQgPSBwcmVwYXJlX3RvX3dhaXRfZXZlbnQoJndxLCAmX193YWl0LCBzdGF0ZSk7XAogCQkJCQkJCQkJXApAQCAtMjgwLDEyICsyNzcsNyBAQAogCQkJCQkJCQkJXAogCQlpZiAoX19fd2FpdF9pc19pbnRlcnJ1cHRpYmxlKHN0YXRlKSAmJiBfX2ludCkgewkJXAogCQkJX19yZXQgPSBfX2ludDsJCQkJCVwKLQkJCWlmIChleGNsdXNpdmUpIHsJCQkJXAotCQkJCWFib3J0X2V4Y2x1c2l2ZV93YWl0KCZ3cSwgJl9fd2FpdCwJXAotCQkJCQkJICAgICBzdGF0ZSwgTlVMTCk7CVwKLQkJCQlnb3RvIF9fb3V0OwkJCQlcCi0JCQl9CQkJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAorCQkJZ290byBfX291dDsJCQkJCVwKIAkJfQkJCQkJCQlcCiAJCQkJCQkJCQlcCiAJCWNtZDsJCQkJCQkJXApAQCAtOTg5LDcgKzk4MSw2IEBACiB2b2lkIHByZXBhcmVfdG9fd2FpdF9leGNsdXNpdmUod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHdhaXRfcXVldWVfdCAqd2FpdCwgaW50IHN0YXRlKTsKIGxvbmcgcHJlcGFyZV90b193YWl0X2V2ZW50KHdhaXRfcXVldWVfaGVhZF90ICpxLCB3YWl0X3F1ZXVlX3QgKndhaXQsIGludCBzdGF0ZSk7CiB2b2lkIGZpbmlzaF93YWl0KHdhaXRfcXVldWVfaGVhZF90ICpxLCB3YWl0X3F1ZXVlX3QgKndhaXQpOwotdm9pZCBhYm9ydF9leGNsdXNpdmVfd2FpdCh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgd2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBpbnQgbW9kZSwgdm9pZCAqa2V5KTsKIGxvbmcgd2FpdF93b2tlbih3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsIGxvbmcgdGltZW91dCk7CiBpbnQgd29rZW5fd2FrZV9mdW5jdGlvbih3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsIGludCBzeW5jLCB2b2lkICprZXkpOwogaW50IGF1dG9yZW1vdmVfd2FrZV9mdW5jdGlvbih3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsIGludCBzeW5jLCB2b2lkICprZXkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93aW5fbWlubWF4LmggYi9pbmNsdWRlL2xpbnV4L3dpbl9taW5tYXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU2OTYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC93aW5fbWlubWF4LmgKQEAgLTAsMCArMSwzNyBAQAorLyoqCisgKiBsaWIvbWlubWF4LmM6IHdpbmRvd2VkIG1pbi9tYXggdHJhY2tlciBieSBLYXRobGVlbiBOaWNob2xzLgorICoKKyAqLworI2lmbmRlZiBNSU5NQVhfSAorI2RlZmluZSBNSU5NQVhfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogQSBzaW5nbGUgZGF0YSBwb2ludCBmb3Igb3VyIHBhcmFtZXRlcml6ZWQgbWluLW1heCB0cmFja2VyICovCitzdHJ1Y3QgbWlubWF4X3NhbXBsZSB7CisJdTMyCXQ7CS8qIHRpbWUgbWVhc3VyZW1lbnQgd2FzIHRha2VuICovCisJdTMyCXY7CS8qIHZhbHVlIG1lYXN1cmVkICovCit9OworCisvKiBTdGF0ZSBmb3IgdGhlIHBhcmFtZXRlcml6ZWQgbWluLW1heCB0cmFja2VyICovCitzdHJ1Y3QgbWlubWF4IHsKKwlzdHJ1Y3QgbWlubWF4X3NhbXBsZSBzWzNdOworfTsKKworc3RhdGljIGlubGluZSB1MzIgbWlubWF4X2dldChjb25zdCBzdHJ1Y3QgbWlubWF4ICptKQoreworCXJldHVybiBtLT5zWzBdLnY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1pbm1heF9yZXNldChzdHJ1Y3QgbWlubWF4ICptLCB1MzIgdCwgdTMyIG1lYXMpCit7CisJc3RydWN0IG1pbm1heF9zYW1wbGUgdmFsID0geyAudCA9IHQsIC52ID0gbWVhcyB9OworCisJbS0+c1syXSA9IG0tPnNbMV0gPSBtLT5zWzBdID0gdmFsOworCXJldHVybiBtLT5zWzBdLnY7Cit9CisKK3UzMiBtaW5tYXhfcnVubmluZ19tYXgoc3RydWN0IG1pbm1heCAqbSwgdTMyIHdpbiwgdTMyIHQsIHUzMiBtZWFzKTsKK3UzMiBtaW5tYXhfcnVubmluZ19taW4oc3RydWN0IG1pbm1heCAqbSwgdTMyIHdpbiwgdTMyIHQsIHUzMiBtZWFzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oIGIvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAppbmRleCAyNmNjMWRmLi5mYzZlMjIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKQEAgLTQ0Miw2ICs0NDIsNyBAQAogaW50IGV4ZWN1dGVfaW5fcHJvY2Vzc19jb250ZXh0KHdvcmtfZnVuY190IGZuLCBzdHJ1Y3QgZXhlY3V0ZV93b3JrICopOwogCiBleHRlcm4gYm9vbCBmbHVzaF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitleHRlcm4gYm9vbCBjYW5jZWxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogZXh0ZXJuIGJvb2wgY2FuY2VsX3dvcmtfc3luYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBleHRlcm4gYm9vbCBmbHVzaF9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmspOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9jZWMuaCBiL2luY2x1ZGUvbWVkaWEvY2VjLmgKaW5kZXggZGM3ODU0Yi4uZmRiNWQ2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9jZWMuaAorKysgYi9pbmNsdWRlL21lZGlhL2NlYy5oCkBAIC01Nyw4ICs1Nyw4IEBACiAJaW50IG1pbm9yOwogCWJvb2wgcmVnaXN0ZXJlZDsKIAlib29sIHVucmVnaXN0ZXJlZDsKLQlzdHJ1Y3QgbXV0ZXggZmhzX2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCBmaHM7CisJc3RydWN0IG11dGV4IGxvY2s7CiB9OwogCiBzdHJ1Y3QgY2VjX2FkYXB0ZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oIGIvaW5jbHVkZS9uZXQvYWRkcmNvbmYuaAppbmRleCA5ODI2ZDNhLi5mMmQwNzI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hZGRyY29uZi5oCisrKyBiL2luY2x1ZGUvbmV0L2FkZHJjb25mLmgKQEAgLTEsOCArMSw5IEBACiAjaWZuZGVmIF9BRERSQ09ORl9ICiAjZGVmaW5lIF9BRERSQ09ORl9ICiAKLSNkZWZpbmUgTUFYX1JUUl9TT0xJQ0lUQVRJT05TCQkzCisjZGVmaW5lIE1BWF9SVFJfU09MSUNJVEFUSU9OUwkJLTEJCS8qIHVubGltaXRlZCAqLwogI2RlZmluZSBSVFJfU09MSUNJVEFUSU9OX0lOVEVSVkFMCSg0KkhaKQorI2RlZmluZSBSVFJfU09MSUNJVEFUSU9OX01BWF9JTlRFUlZBTAkoMzYwMCpIWikJLyogMSBob3VyICovCiAKICNkZWZpbmUgTUlOX1ZBTElEX0xJRkVUSU1FCQkoMiozNjAwKQkvKiAyIGhvdXJzICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2FmX3J4cnBjLmggYi9pbmNsdWRlL25ldC9hZl9yeHJwYy5oCmluZGV4IDdiMGY4ODYuLjEwNjFhNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2FmX3J4cnBjLmgKKysrIGIvaW5jbHVkZS9uZXQvYWZfcnhycGMuaApAQCAtMTIsNDIgKzEyLDM5IEBACiAjaWZuZGVmIF9ORVRfUlhSUENfSAogI2RlZmluZSBfTkVUX1JYUlBDX0gKIAotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3J4cnBjLmg+CiAKK3N0cnVjdCBrZXk7CitzdHJ1Y3Qgc29jazsKK3N0cnVjdCBzb2NrZXQ7CiBzdHJ1Y3QgcnhycGNfY2FsbDsKIAotLyoKLSAqIHRoZSBtYXJrIGFwcGxpZWQgdG8gc29ja2V0IGJ1ZmZlcnMgdGhhdCBtYXkgYmUgaW50ZXJjZXB0ZWQKLSAqLwotZW51bSByeHJwY19za2JfbWFyayB7Ci0JUlhSUENfU0tCX01BUktfREFUQSwJCS8qIGRhdGEgbWVzc2FnZSAqLwotCVJYUlBDX1NLQl9NQVJLX0ZJTkFMX0FDSywJLyogZmluYWwgQUNLIHJlY2VpdmVkIG1lc3NhZ2UgKi8KLQlSWFJQQ19TS0JfTUFSS19CVVNZLAkJLyogc2VydmVyIGJ1c3kgbWVzc2FnZSAqLwotCVJYUlBDX1NLQl9NQVJLX1JFTU9URV9BQk9SVCwJLyogcmVtb3RlIGFib3J0IG1lc3NhZ2UgKi8KLQlSWFJQQ19TS0JfTUFSS19MT0NBTF9BQk9SVCwJLyogbG9jYWwgYWJvcnQgbWVzc2FnZSAqLwotCVJYUlBDX1NLQl9NQVJLX05FVF9FUlJPUiwJLyogbmV0d29yayBlcnJvciBtZXNzYWdlICovCi0JUlhSUENfU0tCX01BUktfTE9DQUxfRVJST1IsCS8qIGxvY2FsIGVycm9yIG1lc3NhZ2UgKi8KLQlSWFJQQ19TS0JfTUFSS19ORVdfQ0FMTCwJLyogbG9jYWwgZXJyb3IgbWVzc2FnZSAqLwotfTsKK3R5cGVkZWYgdm9pZCAoKnJ4cnBjX25vdGlmeV9yeF90KShzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqLAorCQkJCSAgdW5zaWduZWQgbG9uZyk7Cit0eXBlZGVmIHZvaWQgKCpyeHJwY19ub3RpZnlfbmV3X2NhbGxfdCkoc3RydWN0IHNvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwKKwkJCQkJdW5zaWduZWQgbG9uZyk7Cit0eXBlZGVmIHZvaWQgKCpyeHJwY19kaXNjYXJkX25ld19jYWxsX3QpKHN0cnVjdCByeHJwY19jYWxsICosIHVuc2lnbmVkIGxvbmcpOwordHlwZWRlZiB2b2lkICgqcnhycGNfdXNlcl9hdHRhY2hfY2FsbF90KShzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1bnNpZ25lZCBsb25nKTsKIAotdHlwZWRlZiB2b2lkICgqcnhycGNfaW50ZXJjZXB0b3JfdCkoc3RydWN0IHNvY2sgKiwgdW5zaWduZWQgbG9uZywKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKik7Ci12b2lkIHJ4cnBjX2tlcm5lbF9pbnRlcmNlcHRfcnhfbWVzc2FnZXMoc3RydWN0IHNvY2tldCAqLCByeHJwY19pbnRlcmNlcHRvcl90KTsKK3ZvaWQgcnhycGNfa2VybmVsX25ld19jYWxsX25vdGlmaWNhdGlvbihzdHJ1Y3Qgc29ja2V0ICosCisJCQkJCXJ4cnBjX25vdGlmeV9uZXdfY2FsbF90LAorCQkJCQlyeHJwY19kaXNjYXJkX25ld19jYWxsX3QpOwogc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2tlcm5lbF9iZWdpbl9jYWxsKHN0cnVjdCBzb2NrZXQgKiwKIAkJCQkJICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICosCiAJCQkJCSAgIHN0cnVjdCBrZXkgKiwKIAkJCQkJICAgdW5zaWduZWQgbG9uZywKLQkJCQkJICAgZ2ZwX3QpOwotaW50IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QpOwotdm9pZCByeHJwY19rZXJuZWxfZGF0YV9jb25zdW1lZChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLXZvaWQgcnhycGNfa2VybmVsX2Fib3J0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKiwgdTMyKTsKLXZvaWQgcnhycGNfa2VybmVsX2VuZF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOwotYm9vbCByeHJwY19rZXJuZWxfaXNfZGF0YV9sYXN0KHN0cnVjdCBza19idWZmICopOwotdTMyIHJ4cnBjX2tlcm5lbF9nZXRfYWJvcnRfY29kZShzdHJ1Y3Qgc2tfYnVmZiAqKTsKLWludCByeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcihzdHJ1Y3Qgc2tfYnVmZiAqKTsKLXZvaWQgcnhycGNfa2VybmVsX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICopOwotc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2tlcm5lbF9hY2NlcHRfY2FsbChzdHJ1Y3Qgc29ja2V0ICosIHVuc2lnbmVkIGxvbmcpOwotaW50IHJ4cnBjX2tlcm5lbF9yZWplY3RfY2FsbChzdHJ1Y3Qgc29ja2V0ICopOworCQkJCQkgICBnZnBfdCwKKwkJCQkJICAgcnhycGNfbm90aWZ5X3J4X3QpOworaW50IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqLAorCQkJICAgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QpOworaW50IHJ4cnBjX2tlcm5lbF9yZWN2X2RhdGEoc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqLAorCQkJICAgdm9pZCAqLCBzaXplX3QsIHNpemVfdCAqLCBib29sLCB1MzIgKik7Cit2b2lkIHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKiwKKwkJCSAgICAgdTMyLCBpbnQsIGNvbnN0IGNoYXIgKik7Cit2b2lkIHJ4cnBjX2tlcm5lbF9lbmRfY2FsbChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCByeHJwY19jYWxsICopOwordm9pZCByeHJwY19rZXJuZWxfZ2V0X3BlZXIoc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqLAorCQkJICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICopOworaW50IHJ4cnBjX2tlcm5lbF9jaGFyZ2VfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKiwgcnhycGNfbm90aWZ5X3J4X3QsCisJCQkgICAgICAgcnhycGNfdXNlcl9hdHRhY2hfY2FsbF90LCB1bnNpZ25lZCBsb25nLCBnZnBfdCk7CiAKICNlbmRpZiAvKiBfTkVUX1JYUlBDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2FmX3VuaXguaCBiL2luY2x1ZGUvbmV0L2FmX3VuaXguaAppbmRleCA5YjRjNDE4Li5mZDYwZWNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hZl91bml4LmgKKysrIGIvaW5jbHVkZS9uZXQvYWZfdW5peC5oCkBAIC01Miw3ICs1Miw3IEBACiAJc3RydWN0IHNvY2sJCXNrOwogCXN0cnVjdCB1bml4X2FkZHJlc3MgICAgICphZGRyOwogCXN0cnVjdCBwYXRoCQlwYXRoOwotCXN0cnVjdCBtdXRleAkJcmVhZGxvY2s7CisJc3RydWN0IG11dGV4CQlpb2xvY2ssIGJpbmRsb2NrOwogCXN0cnVjdCBzb2NrCQkqcGVlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CiAJYXRvbWljX2xvbmdfdAkJaW5mbGlnaHQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmgKaW5kZXggYmZkMTU5MC4uMGExZTIxZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaApAQCAtMjksNyArMjksOCBAQAogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAotI2RlZmluZSBCVF9TVUJTWVNfVkVSU0lPTiAiMi4yMSIKKyNkZWZpbmUgQlRfU1VCU1lTX1ZFUlNJT04JMgorI2RlZmluZSBCVF9TVUJTWVNfUkVWSVNJT04JMjIKIAogI2lmbmRlZiBBRl9CTFVFVE9PVEgKICNkZWZpbmUgQUZfQkxVRVRPT1RICTMxCkBAIC0zNzEsNiArMzcyLDcgQEAKIHZvaWQgaGNpX3NvY2tfY2xlYXJfZmxhZyhzdHJ1Y3Qgc29jayAqc2ssIGludCBucik7CiBpbnQgaGNpX3NvY2tfdGVzdF9mbGFnKHN0cnVjdCBzb2NrICpzaywgaW50IG5yKTsKIHVuc2lnbmVkIHNob3J0IGhjaV9zb2NrX2dldF9jaGFubmVsKHN0cnVjdCBzb2NrICpzayk7Cit1MzIgaGNpX3NvY2tfZ2V0X2Nvb2tpZShzdHJ1Y3Qgc29jayAqc2spOwogCiBpbnQgaGNpX3NvY2tfaW5pdCh2b2lkKTsKIHZvaWQgaGNpX3NvY2tfY2xlYW51cCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaAppbmRleCAwMDNiMjUyLi45OWFhNWU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCkBAIC02Myw2ICs2Myw3IEBACiAjZGVmaW5lIEhDSV9TRElPCTYKICNkZWZpbmUgSENJX1NQSQkJNwogI2RlZmluZSBIQ0lfSTJDCQk4CisjZGVmaW5lIEhDSV9TTUQJCTkKIAogLyogSENJIGNvbnRyb2xsZXIgdHlwZXMgKi8KICNkZWZpbmUgSENJX1BSSU1BUlkJMHgwMApAQCAtMjA3LDcgKzIwOCwxMSBAQAogCUhDSV9NR01UX0lOREVYX0VWRU5UUywKIAlIQ0lfTUdNVF9VTkNPTkZfSU5ERVhfRVZFTlRTLAogCUhDSV9NR01UX0VYVF9JTkRFWF9FVkVOVFMsCi0JSENJX01HTVRfR0VORVJJQ19FVkVOVFMsCisJSENJX01HTVRfRVhUX0lORk9fRVZFTlRTLAorCUhDSV9NR01UX09QVElPTl9FVkVOVFMsCisJSENJX01HTVRfU0VUVElOR19FVkVOVFMsCisJSENJX01HTVRfREVWX0NMQVNTX0VWRU5UUywKKwlIQ0lfTUdNVF9MT0NBTF9OQU1FX0VWRU5UUywKIAlIQ0lfTUdNVF9PT0JfREFUQV9FVkVOVFMsCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCmluZGV4IGVlN2ZjNDcuLmYwMGJmNjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCkBAIC0yMTEsNiArMjExLDcgQEAKIAlfX3U4CQlkZXZfbmFtZVtIQ0lfTUFYX05BTUVfTEVOR1RIXTsKIAlfX3U4CQlzaG9ydF9uYW1lW0hDSV9NQVhfU0hPUlRfTkFNRV9MRU5HVEhdOwogCV9fdTgJCWVpcltIQ0lfTUFYX0VJUl9MRU5HVEhdOworCV9fdTE2CQlhcHBlYXJhbmNlOwogCV9fdTgJCWRldl9jbGFzc1szXTsKIAlfX3U4CQltYWpvcl9jbGFzczsKIAlfX3U4CQltaW5vcl9jbGFzczsKQEAgLTM5OSw3ICs0MDAsOSBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsJcnBhX2V4cGlyZWQ7CiAJYmRhZGRyX3QJCXJwYTsKIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0JUX0xFRFMpCiAJc3RydWN0IGxlZF90cmlnZ2VyCSpwb3dlcl9sZWQ7CisjZW5kaWYKIAogCWludCAoKm9wZW4pKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIAlpbnQgKCpjbG9zZSkoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwpAQCAtMTAyNiw4ICsxMDI5LDggQEAKIGludCBoY2lfcmVzZXRfZGV2KHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIGludCBoY2lfcmVjdl9mcmFtZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgaGNpX3JlY3ZfZGlhZyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci12b2lkIGhjaV9zZXRfaHdfaW5mbyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwotdm9pZCBoY2lfc2V0X2Z3X2luZm8oc3RydWN0IGhjaV9kZXYgKmhkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK19fcHJpbnRmKDIsIDMpIHZvaWQgaGNpX3NldF9od19pbmZvKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitfX3ByaW50ZigyLCAzKSB2b2lkIGhjaV9zZXRfZndfaW5mbyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogaW50IGhjaV9kZXZfb3BlbihfX3UxNiBkZXYpOwogaW50IGhjaV9kZXZfY2xvc2UoX191MTYgZGV2KTsKIGludCBoY2lfZGV2X2RvX2Nsb3NlKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKQEAgLTE0MDQsNiArMTQwNyw5IEBACiB2b2lkIGhjaV9zZW5kX3RvX2NoYW5uZWwodW5zaWduZWQgc2hvcnQgY2hhbm5lbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSBpbnQgZmxhZywgc3RydWN0IHNvY2sgKnNraXBfc2spOwogdm9pZCBoY2lfc2VuZF90b19tb25pdG9yKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgaGNpX3NlbmRfbW9uaXRvcl9jdHJsX2V2ZW50KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1MTYgZXZlbnQsCisJCQkJIHZvaWQgKmRhdGEsIHUxNiBkYXRhX2xlbiwga3RpbWVfdCB0c3RhbXAsCisJCQkJIGludCBmbGFnLCBzdHJ1Y3Qgc29jayAqc2tpcF9zayk7CiAKIHZvaWQgaGNpX3NvY2tfZGV2X2V2ZW50KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgZXZlbnQpOwogCkBAIC0xNDQ5LDYgKzE0NTUsNyBAQAogI2RlZmluZSBESVNDT1ZfQlJFRFJfSU5RVUlSWV9MRU4JMHgwOAogI2RlZmluZSBESVNDT1ZfTEVfUkVTVEFSVF9ERUxBWQkJbXNlY3NfdG9famlmZmllcygyMDApCS8qIG1zZWMgKi8KIAordm9pZCBtZ210X2ZpbGxfdmVyc2lvbl9pbmZvKHZvaWQgKnZlcik7CiBpbnQgbWdtdF9uZXdfc2V0dGluZ3Moc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogdm9pZCBtZ210X2luZGV4X2FkZGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIHZvaWQgbWdtdF9pbmRleF9yZW1vdmVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfbW9uLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX21vbi5oCmluZGV4IDU4N2QwMTMuLjI0MDc4NmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfbW9uLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaV9tb24uaApAQCAtNDUsNiArNDUsMTAgQEAKICNkZWZpbmUgSENJX01PTl9WRU5ET1JfRElBRwkxMQogI2RlZmluZSBIQ0lfTU9OX1NZU1RFTV9OT1RFCTEyCiAjZGVmaW5lIEhDSV9NT05fVVNFUl9MT0dHSU5HCTEzCisjZGVmaW5lIEhDSV9NT05fQ1RSTF9PUEVOCTE0CisjZGVmaW5lIEhDSV9NT05fQ1RSTF9DTE9TRQkxNQorI2RlZmluZSBIQ0lfTU9OX0NUUkxfQ09NTUFORAkxNgorI2RlZmluZSBIQ0lfTU9OX0NUUkxfRVZFTlQJMTcKIAogc3RydWN0IGhjaV9tb25fbmV3X2luZGV4IHsKIAlfX3U4CQl0eXBlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmgKaW5kZXggNzY0Nzk2NC4uNzJhNDU2YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvbWdtdC5oCkBAIC01ODYsNiArNTg2LDI0IEBACiAKICNkZWZpbmUgTUdNVF9PUF9TVEFSVF9MSU1JVEVEX0RJU0NPVkVSWQkweDAwNDEKIAorI2RlZmluZSBNR01UX09QX1JFQURfRVhUX0lORk8JCTB4MDA0MgorI2RlZmluZSBNR01UX1JFQURfRVhUX0lORk9fU0laRQkJMAorc3RydWN0IG1nbXRfcnBfcmVhZF9leHRfaW5mbyB7CisJYmRhZGRyX3QgYmRhZGRyOworCV9fdTggICAgIHZlcnNpb247CisJX19sZTE2ICAgbWFudWZhY3R1cmVyOworCV9fbGUzMiAgIHN1cHBvcnRlZF9zZXR0aW5nczsKKwlfX2xlMzIgICBjdXJyZW50X3NldHRpbmdzOworCV9fbGUxNiAgIGVpcl9sZW47CisJX191OCAgICAgZWlyWzBdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBNR01UX09QX1NFVF9BUFBFQVJBTkNFCQkweDAwNDMKK3N0cnVjdCBtZ210X2NwX3NldF9hcHBlYXJhbmNlIHsKKwlfX3UxNglhcHBlYXJhbmNlOworfSBfX3BhY2tlZDsKKyNkZWZpbmUgTUdNVF9TRVRfQVBQRUFSQU5DRV9TSVpFCTIKKwogI2RlZmluZSBNR01UX0VWX0NNRF9DT01QTEVURQkJMHgwMDAxCiBzdHJ1Y3QgbWdtdF9ldl9jbWRfY29tcGxldGUgewogCV9fbGUxNglvcGNvZGU7CkBAIC04MDAsMyArODE4LDkgQEAKIHN0cnVjdCBtZ210X2V2X2FkdmVydGlzaW5nX3JlbW92ZWQgewogCV9fdTggICAgaW5zdGFuY2U7CiB9IF9fcGFja2VkOworCisjZGVmaW5lIE1HTVRfRVZfRVhUX0lORk9fQ0hBTkdFRAkweDAwMjUKK3N0cnVjdCBtZ210X2V2X2V4dF9pbmZvX2NoYW5nZWQgeworCV9fbGUxNgllaXJfbGVuOworCV9fdTgJZWlyWzBdOworfSBfX3BhY2tlZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NmZzgwMjExLmggYi9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCmluZGV4IDljMjNmNGQzLi5mZTc4ZjAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKQEAgLTUsNyArNSw3IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDYtMjAxMAlKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgogICogQ29weXJpZ2h0IDIwMTMtMjAxNCBJbnRlbCBNb2JpbGUgQ29tbXVuaWNhdGlvbnMgR21iSAotICogQ29weXJpZ2h0IDIwMTUJSW50ZWwgRGV1dHNjaGxhbmQgR21iSAorICogQ29weXJpZ2h0IDIwMTUtMjAxNglJbnRlbCBEZXV0c2NobGFuZCBHbWJICiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC01OTMsNiArNTkzLDggQEAKIAlzOCBub2lzZTsKIH07CiAKKyNkZWZpbmUgQ0ZHODAyMTFfTUFYX1dFUF9LRVlTCTQKKwogLyoqCiAgKiBzdHJ1Y3QgY2ZnODAyMTFfY3J5cHRvX3NldHRpbmdzIC0gQ3J5cHRvIHNldHRpbmdzCiAgKiBAd3BhX3ZlcnNpb25zOiBpbmRpY2F0ZXMgd2hpY2gsIGlmIGFueSwgV1BBIHZlcnNpb25zIGFyZSBlbmFibGVkCkBAIC02MTAsNiArNjEyLDkgQEAKICAqCWFsbG93ZWQgdGhyb3VnaCBldmVuIG9uIHVuYXV0aG9yaXplZCBwb3J0cwogICogQGNvbnRyb2xfcG9ydF9ub19lbmNyeXB0OiBUUlVFIHRvIHByZXZlbnQgZW5jcnlwdGlvbiBvZiBjb250cm9sIHBvcnQKICAqCXByb3RvY29sIGZyYW1lcy4KKyAqIEB3ZXBfa2V5czogc3RhdGljIFdFUCBrZXlzLCBpZiBub3QgTlVMTCBwb2ludHMgdG8gYW4gYXJyYXkgb2YKKyAqCUNGRzgwMjExX01BWF9XRVBfS0VZUyBXRVAga2V5cworICogQHdlcF90eF9rZXk6IGtleSBpbmRleCAoMC4uMykgb2YgdGhlIGRlZmF1bHQgVFggc3RhdGljIFdFUCBrZXkKICAqLwogc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyB7CiAJdTMyIHdwYV92ZXJzaW9uczsKQEAgLTYyMSw2ICs2MjYsOCBAQAogCWJvb2wgY29udHJvbF9wb3J0OwogCV9fYmUxNiBjb250cm9sX3BvcnRfZXRoZXJ0eXBlOwogCWJvb2wgY29udHJvbF9wb3J0X25vX2VuY3J5cHQ7CisJc3RydWN0IGtleV9wYXJhbXMgKndlcF9rZXlzOworCWludCB3ZXBfdHhfa2V5OwogfTsKIAogLyoqCkBAIC02NzYsNiArNjgzLDE4IEBACiAJc3RydWN0IG1hY19hZGRyZXNzIG1hY19hZGRyc1tdOwogfTsKIAorLyoKKyAqIGNmZzgwMjExX2JpdHJhdGVfbWFzayAtIG1hc2tzIGZvciBiaXRyYXRlIGNvbnRyb2wKKyAqLworc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayB7CisJc3RydWN0IHsKKwkJdTMyIGxlZ2FjeTsKKwkJdTggaHRfbWNzW0lFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU5dOworCQl1MTYgdmh0X21jc1tOTDgwMjExX1ZIVF9OU1NfTUFYXTsKKwkJZW51bSBubDgwMjExX3R4cmF0ZV9naSBnaTsKKwl9IGNvbnRyb2xbTlVNX05MODAyMTFfQkFORFNdOworfTsKKwogLyoqCiAgKiBzdHJ1Y3QgY2ZnODAyMTFfYXBfc2V0dGluZ3MgLSBBUCBjb25maWd1cmF0aW9uCiAgKgpAQCAtNzAwLDYgKzcxOSw3IEBACiAgKglNQUMgYWRkcmVzcyBiYXNlZCBhY2Nlc3MgY29udHJvbAogICogQHBic3M6IElmIHNldCwgc3RhcnQgYXMgYSBQQ1AgaW5zdGVhZCBvZiBBUC4gUmVsZXZhbnQgZm9yIERNRwogICoJbmV0d29ya3MuCisgKiBAYmVhY29uX3JhdGU6IGJpdHJhdGUgdG8gYmUgdXNlZCBmb3IgYmVhY29ucwogICovCiBzdHJ1Y3QgY2ZnODAyMTFfYXBfc2V0dGluZ3MgewogCXN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiBjaGFuZGVmOwpAQCAtNzE5LDYgKzczOSw3IEBACiAJYm9vbCBwMnBfb3BwX3BzOwogCWNvbnN0IHN0cnVjdCBjZmc4MDIxMV9hY2xfZGF0YSAqYWNsOwogCWJvb2wgcGJzczsKKwlzdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrIGJlYWNvbl9yYXRlOwogfTsKIAogLyoqCkBAIC0xMTAyLDYgKzExMjMsNyBAQAogCXN0cnVjdCBjZmc4MDIxMV90aWRfc3RhdHMgcGVydGlkW0lFRUU4MDIxMV9OVU1fVElEUyArIDFdOwogfTsKIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0NGRzgwMjExKQogLyoqCiAgKiBjZmc4MDIxMV9nZXRfc3RhdGlvbiAtIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gc3RhdGlvbgogICogQGRldjogdGhlIGRldmljZSB3aGVyZSB0aGUgc3RhdGlvbiBpcyBzdXBwb3NlZCB0byBiZSBjb25uZWN0ZWQgdG8KQEAgLTExMTQsNiArMTEzNiwxNCBAQAogICovCiBpbnQgY2ZnODAyMTFfZ2V0X3N0YXRpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKm1hY19hZGRyLAogCQkJIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBjZmc4MDIxMV9nZXRfc3RhdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBjb25zdCB1OCAqbWFjX2FkZHIsCisJCQkJICAgICAgIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQoreworCXJldHVybiAtRU5PRU5UOworfQorI2VuZGlmCiAKIC8qKgogICogZW51bSBtb25pdG9yX2ZsYWdzIC0gbW9uaXRvciBmbGFncwpAQCAtMTM0Miw2ICsxMzcyLDcgQEAKICAqIEBiZWFjb25faW50ZXJ2YWw6IGJlYWNvbiBpbnRlcnZhbCB0byB1c2UKICAqIEBtY2FzdF9yYXRlOiBtdWx0aWNhdCByYXRlIGZvciBNZXNoIE5vZGUgWzZNYnBzIGlzIHRoZSBkZWZhdWx0IGZvciA4MDIuMTFhXQogICogQGJhc2ljX3JhdGVzOiBiYXNpYyByYXRlcyB0byB1c2Ugd2hlbiBjcmVhdGluZyB0aGUgbWVzaAorICogQGJlYWNvbl9yYXRlOiBiaXRyYXRlIHRvIGJlIHVzZWQgZm9yIGJlYWNvbnMKICAqCiAgKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSBmaXhlZCB3aGVuIHRoZSBtZXNoIGlzIGNyZWF0ZWQuCiAgKi8KQEAgLTEzNjIsNiArMTM5Myw3IEBACiAJdTE2IGJlYWNvbl9pbnRlcnZhbDsKIAlpbnQgbWNhc3RfcmF0ZVtOVU1fTkw4MDIxMV9CQU5EU107CiAJdTMyIGJhc2ljX3JhdGVzOworCXN0cnVjdCBjZmc4MDIxMV9iaXRyYXRlX21hc2sgYmVhY29uX3JhdGU7CiB9OwogCiAvKioKQEAgLTIwMDEsMTcgKzIwMzMsNiBAQAogCVdJUEhZX1BBUkFNX0RZTl9BQ0sJCT0gMSA8PCA1LAogfTsKIAotLyoKLSAqIGNmZzgwMjExX2JpdHJhdGVfbWFzayAtIG1hc2tzIGZvciBiaXRyYXRlIGNvbnRyb2wKLSAqLwotc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayB7Ci0Jc3RydWN0IHsKLQkJdTMyIGxlZ2FjeTsKLQkJdTggaHRfbWNzW0lFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU5dOwotCQl1MTYgdmh0X21jc1tOTDgwMjExX1ZIVF9OU1NfTUFYXTsKLQkJZW51bSBubDgwMjExX3R4cmF0ZV9naSBnaTsKLQl9IGNvbnRyb2xbTlVNX05MODAyMTFfQkFORFNdOwotfTsKIC8qKgogICogc3RydWN0IGNmZzgwMjExX3Bta3NhIC0gUE1LIFNlY3VyaXR5IEFzc29jaWF0aW9uCiAgKgpAQCAtMjI5Myw2ICsyMzE0LDk4IEBACiB9OwogCiAvKioKKyAqIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAtIE5BTiBjb25maWd1cmF0aW9uCisgKgorICogVGhpcyBzdHJ1Y3QgZGVmaW5lcyBOQU4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKgorICogQG1hc3Rlcl9wcmVmOiBtYXN0ZXIgcHJlZmVyZW5jZSAoMSAtIDI1NSkKKyAqIEBkdWFsOiBkdWFsIGJhbmQgb3BlcmF0aW9uIG1vZGUsIHNlZSAmZW51bSBubDgwMjExX25hbl9kdWFsX2JhbmRfY29uZgorICovCitzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgeworCXU4IG1hc3Rlcl9wcmVmOworCXU4IGR1YWw7Cit9OworCisvKioKKyAqIGVudW0gY2ZnODAyMTFfbmFuX2NvbmZfY2hhbmdlcyAtIGluZGljYXRlcyBjaGFuZ2VkIGZpZWxkcyBpbiBOQU4KKyAqIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBAQ0ZHODAyMTFfTkFOX0NPTkZfQ0hBTkdFRF9QUkVGOiBtYXN0ZXIgcHJlZmVyZW5jZQorICogQENGRzgwMjExX05BTl9DT05GX0NIQU5HRURfRFVBTDogZHVhbCBiYW5kIG9wZXJhdGlvbgorICovCitlbnVtIGNmZzgwMjExX25hbl9jb25mX2NoYW5nZXMgeworCUNGRzgwMjExX05BTl9DT05GX0NIQU5HRURfUFJFRiA9IEJJVCgwKSwKKwlDRkc4MDIxMV9OQU5fQ09ORl9DSEFOR0VEX0RVQUwgPSBCSVQoMSksCit9OworCisvKioKKyAqIHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuY19maWx0ZXIgLSBhIE5BTiBmdW5jdGlvbiBSeCAvIFR4IGZpbHRlcgorICoKKyAqIEBmaWx0ZXI6IHRoZSBjb250ZW50IG9mIHRoZSBmaWx0ZXIKKyAqIEBsZW46IHRoZSBsZW5ndGggb2YgdGhlIGZpbHRlcgorICovCitzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmNfZmlsdGVyIHsKKwljb25zdCB1OCAqZmlsdGVyOworCXU4IGxlbjsKK307CisKKy8qKgorICogc3RydWN0IGNmZzgwMjExX25hbl9mdW5jIC0gYSBOQU4gZnVuY3Rpb24KKyAqCisgKiBAdHlwZTogJmVudW0gbmw4MDIxMV9uYW5fZnVuY3Rpb25fdHlwZQorICogQHNlcnZpY2VfaWQ6IHRoZSBzZXJ2aWNlIElEIG9mIHRoZSBmdW5jdGlvbgorICogQHB1Ymxpc2hfdHlwZTogJm5sODAyMTFfbmFuX3B1Ymxpc2hfdHlwZQorICogQGNsb3NlX3JhbmdlOiBpZiB0cnVlLCB0aGUgcmFuZ2Ugc2hvdWxkIGJlIGxpbWl0ZWQuIFRocmVzaG9sZCBpcworICoJaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuCisgKiBAcHVibGlzaF9iY2FzdDogaWYgdHJ1ZSwgdGhlIHNvbGljaXRlZCBwdWJsaXNoIHNob3VsZCBiZSBicm9hZGNhc3RlZAorICogQHN1YnNjcmliZV9hY3RpdmU6IGlmIHRydWUsIHRoZSBzdWJzY3JpYmUgaXMgYWN0aXZlCisgKiBAZm9sbG93dXBfaWQ6IHRoZSBpbnN0YW5jZSBJRCBmb3IgZm9sbG93IHVwCisgKiBAZm9sbG93dXBfcmVxaWQ6IHRoZSByZXF1ZXN0b3IgaW5zdGFuY2UgSUQgZm9yIGZvbGxvdyB1cAorICogQGZvbGxvd3VwX2Rlc3Q6IE1BQyBhZGRyZXNzIG9mIHRoZSByZWNpcGllbnQgb2YgdGhlIGZvbGxvdyB1cAorICogQHR0bDogdGltZSB0byBsaXZlIGNvdW50ZXIgaW4gRFcuCisgKiBAc2Vydl9zcGVjX2luZm86IFNlcnZpY2UgU3BlY2lmaWMgSW5mbworICogQHNlcnZfc3BlY19pbmZvX2xlbjogU2VydmljZSBTcGVjaWZpYyBJbmZvIGxlbmd0aAorICogQHNyZl9pbmNsdWRlOiBpZiB0cnVlLCBTUkYgaXMgaW5jbHVzaXZlCisgKiBAc3JmX2JmOiBCbG9vbSBGaWx0ZXIKKyAqIEBzcmZfYmZfbGVuOiBCbG9vbSBGaWx0ZXIgbGVuZ3RoCisgKiBAc3JmX2JmX2lkeDogQmxvb20gRmlsdGVyIGluZGV4CisgKiBAc3JmX21hY3M6IFNSRiBNQUMgYWRkcmVzc2VzCisgKiBAc3JmX251bV9tYWNzOiBudW1iZXIgb2YgTUFDIGFkZHJlc3NlcyBpbiBTUkYKKyAqIEByeF9maWx0ZXJzOiByeCBmaWx0ZXJzIHRoYXQgYXJlIG1hdGNoZWQgd2l0aCBjb3JyZXNwb25kaW5nIHBlZXIncyB0eF9maWx0ZXIKKyAqIEB0eF9maWx0ZXJzOiBmaWx0ZXJzIHRoYXQgc2hvdWxkIGJlIHRyYW5zbWl0dGVkIGluIHRoZSBTREYuCisgKiBAbnVtX3J4X2ZpbHRlcnM6IGxlbmd0aCBvZiAmcnhfZmlsdGVycy4KKyAqIEBudW1fdHhfZmlsdGVyczogbGVuZ3RoIG9mICZ0eF9maWx0ZXJzLgorICogQGluc3RhbmNlX2lkOiBkcml2ZXIgYWxsb2NhdGVkIGlkIG9mIHRoZSBmdW5jdGlvbi4KKyAqIEBjb29raWU6IHVuaXF1ZSBOQU4gZnVuY3Rpb24gaWRlbnRpZmllci4KKyAqLworc3RydWN0IGNmZzgwMjExX25hbl9mdW5jIHsKKwllbnVtIG5sODAyMTFfbmFuX2Z1bmN0aW9uX3R5cGUgdHlwZTsKKwl1OCBzZXJ2aWNlX2lkW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JRF9MRU5dOworCXU4IHB1Ymxpc2hfdHlwZTsKKwlib29sIGNsb3NlX3JhbmdlOworCWJvb2wgcHVibGlzaF9iY2FzdDsKKwlib29sIHN1YnNjcmliZV9hY3RpdmU7CisJdTggZm9sbG93dXBfaWQ7CisJdTggZm9sbG93dXBfcmVxaWQ7CisJc3RydWN0IG1hY19hZGRyZXNzIGZvbGxvd3VwX2Rlc3Q7CisJdTMyIHR0bDsKKwljb25zdCB1OCAqc2Vydl9zcGVjX2luZm87CisJdTggc2Vydl9zcGVjX2luZm9fbGVuOworCWJvb2wgc3JmX2luY2x1ZGU7CisJY29uc3QgdTggKnNyZl9iZjsKKwl1OCBzcmZfYmZfbGVuOworCXU4IHNyZl9iZl9pZHg7CisJc3RydWN0IG1hY19hZGRyZXNzICpzcmZfbWFjczsKKwlpbnQgc3JmX251bV9tYWNzOworCXN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuY19maWx0ZXIgKnJ4X2ZpbHRlcnM7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jX2ZpbHRlciAqdHhfZmlsdGVyczsKKwl1OCBudW1fdHhfZmlsdGVyczsKKwl1OCBudW1fcnhfZmlsdGVyczsKKwl1OCBpbnN0YW5jZV9pZDsKKwl1NjQgY29va2llOworfTsKKworLyoqCiAgKiBzdHJ1Y3QgY2ZnODAyMTFfb3BzIC0gYmFja2VuZCBkZXNjcmlwdGlvbiBmb3Igd2lyZWxlc3MgY29uZmlndXJhdGlvbgogICoKICAqIFRoaXMgc3RydWN0IGlzIHJlZ2lzdGVyZWQgYnkgZnVsbG1hYyBjYXJkIGRyaXZlcnMgYW5kL29yIHdpcmVsZXNzIHN0YWNrcwpAQCAtMjQyMyw3ICsyNTM2LDggQEAKICAqCWNhc2VzLCB0aGUgcmVzdWx0IG9mIHJvYW1pbmcgaXMgaW5kaWNhdGVkIHdpdGggYSBjYWxsIHRvCiAgKgljZmc4MDIxMV9yb2FtZWQoKSBvciBjZmc4MDIxMV9yb2FtZWRfYnNzKCkuCiAgKgkoaW52b2tlZCB3aXRoIHRoZSB3aXJlbGVzc19kZXYgbXV0ZXggaGVsZCkKLSAqIEBkaXNjb25uZWN0OiBEaXNjb25uZWN0IGZyb20gdGhlIEJTUy9FU1MuCisgKiBAZGlzY29ubmVjdDogRGlzY29ubmVjdCBmcm9tIHRoZSBCU1MvRVNTLiBPbmNlIGRvbmUsIGNhbGwKKyAqCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZCgpLgogICoJKGludm9rZWQgd2l0aCB0aGUgd2lyZWxlc3NfZGV2IG11dGV4IGhlbGQpCiAgKgogICogQGpvaW5faWJzczogSm9pbiB0aGUgc3BlY2lmaWVkIElCU1MgKG9yIGNyZWF0ZSBpZiBuZWNlc3NhcnkpLiBPbmNlIGRvbmUsIGNhbGwKQEAgLTI1NzksNiArMjY5MywxOSBAQAogICoJYW5kIHJldHVybmluZyB0byB0aGUgYmFzZSBjaGFubmVsIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIEFQLgogICogQHRkbHNfY2FuY2VsX2NoYW5uZWxfc3dpdGNoOiBTdG9wIGNoYW5uZWwtc3dpdGNoaW5nIHdpdGggYSBURExTIHBlZXIuIEJvdGgKICAqCXBlZXJzIG11c3QgYmUgb24gdGhlIGJhc2UgY2hhbm5lbCB3aGVuIHRoZSBjYWxsIGNvbXBsZXRlcy4KKyAqIEBzdGFydF9uYW46IFN0YXJ0IHRoZSBOQU4gaW50ZXJmYWNlLgorICogQHN0b3BfbmFuOiBTdG9wIHRoZSBOQU4gaW50ZXJmYWNlLgorICogQGFkZF9uYW5fZnVuYzogQWRkIGEgTkFOIGZ1bmN0aW9uLiBSZXR1cm5zIG5lZ2F0aXZlIHZhbHVlIG9uIGZhaWx1cmUuCisgKglPbiBzdWNjZXNzIEBuYW5fZnVuYyBvd25lcnNoaXAgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIGRyaXZlciBhbmQKKyAqCWl0IG1heSBhY2Nlc3MgaXQgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YgdGhpcyBmdW5jdGlvbi4gVGhlIGRyaXZlcgorICoJc2hvdWxkIGZyZWUgdGhlIEBuYW5fZnVuYyB3aGVuIG5vIGxvbmdlciBuZWVkZWQgYnkgY2FsbGluZworICoJY2ZnODAyMTFfZnJlZV9uYW5fZnVuYygpLgorICoJT24gc3VjY2VzcyB0aGUgZHJpdmVyIHNob3VsZCBhc3NpZ24gYW4gaW5zdGFuY2VfaWQgaW4gdGhlCisgKglwcm92aWRlZCBAbmFuX2Z1bmMuCisgKiBAZGVsX25hbl9mdW5jOiBEZWxldGUgYSBOQU4gZnVuY3Rpb24uCisgKiBAbmFuX2NoYW5nZV9jb25mOiBjaGFuZ2VzIE5BTiBjb25maWd1cmF0aW9uLiBUaGUgY2hhbmdlZCBwYXJhbWV0ZXJzIG11c3QKKyAqCWJlIHNwZWNpZmllZCBpbiBAY2hhbmdlcyAodXNpbmcgJmVudW0gY2ZnODAyMTFfbmFuX2NvbmZfY2hhbmdlcyk7CisgKglBbGwgb3RoZXIgcGFyYW1ldGVycyBtdXN0IGJlIGlnbm9yZWQuCiAgKi8KIHN0cnVjdCBjZmc4MDIxMV9vcHMgewogCWludAkoKnN1c3BlbmQpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvdyk7CkBAIC0yODQ0LDYgKzI5NzEsMTcgQEAKIAl2b2lkCSgqdGRsc19jYW5jZWxfY2hhbm5lbF9zd2l0Y2gpKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgIGNvbnN0IHU4ICphZGRyKTsKKwlpbnQJKCpzdGFydF9uYW4pKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZik7CisJdm9pZAkoKnN0b3BfbmFuKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKKwlpbnQJKCphZGRfbmFuX2Z1bmMpKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpuYW5fZnVuYyk7CisJdm9pZAkoKmRlbF9uYW5fZnVuYykoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCSAgICAgICB1NjQgY29va2llKTsKKwlpbnQJKCpuYW5fY2hhbmdlX2NvbmYpKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgICBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgKmNvbmYsCisJCQkJICAgdTMyIGNoYW5nZXMpOwogfTsKIAogLyoKQEAgLTI4OTAsNiArMzAyOCw4IEBACiAgKiBAV0lQSFlfRkxBR19TVVBQT1JUU181XzEwX01IWjogRGV2aWNlIHN1cHBvcnRzIDUgTUh6IGFuZCAxMCBNSHogY2hhbm5lbHMuCiAgKiBAV0lQSFlfRkxBR19IQVNfQ0hBTk5FTF9TV0lUQ0g6IERldmljZSBzdXBwb3J0cyBjaGFubmVsIHN3aXRjaCBpbgogICoJYmVhY29uaW5nIG1vZGUgKEFQLCBJQlNTLCBNZXNoLCAuLi4pLgorICogQFdJUEhZX0ZMQUdfSEFTX1NUQVRJQ19XRVA6IFRoZSBkZXZpY2Ugc3VwcG9ydHMgc3RhdGljIFdFUCBrZXkgaW5zdGFsbGF0aW9uCisgKgliZWZvcmUgY29ubmVjdGlvbi4KICAqLwogZW51bSB3aXBoeV9mbGFncyB7CiAJLyogdXNlIGhvbGUgYXQgMCAqLwpAQCAtMjkxNSw2ICszMDU1LDcgQEAKIAlXSVBIWV9GTEFHX0hBU19SRU1BSU5fT05fQ0hBTk5FTAk9IEJJVCgyMSksCiAJV0lQSFlfRkxBR19TVVBQT1JUU181XzEwX01IWgkJPSBCSVQoMjIpLAogCVdJUEhZX0ZMQUdfSEFTX0NIQU5ORUxfU1dJVENICQk9IEJJVCgyMyksCisJV0lQSFlfRkxBR19IQVNfU1RBVElDX1dFUAkJPSBCSVQoMjQpLAogfTsKIAogLyoqCkBAIC0zMjkyLDYgKzM0MzMsOCBAQAogICogQGJzc19zZWxlY3Rfc3VwcG9ydDogYml0bWFzayBpbmRpY2F0aW5nIHRoZSBCU1Mgc2VsZWN0aW9uIGNyaXRlcmlhIHN1cHBvcnRlZAogICoJYnkgdGhlIGRyaXZlciBpbiB0aGUgLmNvbm5lY3QoKSBjYWxsYmFjay4gVGhlIGJpdCBwb3NpdGlvbiBtYXBzIHRvIHRoZQogICoJYXR0cmlidXRlIGluZGljZXMgZGVmaW5lZCBpbiAmZW51bSBubDgwMjExX2Jzc19zZWxlY3RfYXR0ci4KKyAqCisgKiBAY29va2llX2NvdW50ZXI6IHVuaXF1ZSBnZW5lcmljIGNvb2tpZSBjb3VudGVyLCB1c2VkIHRvIGlkZW50aWZ5IG9iamVjdHMuCiAgKi8KIHN0cnVjdCB3aXBoeSB7CiAJLyogYXNzaWduIHRoZXNlIGZpZWxkcyBiZWZvcmUgeW91IHJlZ2lzdGVyIHRoZSB3aXBoeSAqLwpAQCAtMzQyMSw2ICszNTY0LDggQEAKIAogCXUzMiBic3Nfc2VsZWN0X3N1cHBvcnQ7CiAKKwl1NjQgY29va2llX2NvdW50ZXI7CisKIAljaGFyIHByaXZbMF0gX19hbGlnbmVkKE5FVERFVl9BTElHTik7CiB9OwogCkBAIC0zNjAxLDYgKzM3NDYsNyBAQAogICoJYmVhY29ucywgMCB3aGVuIG5vdCB2YWxpZAogICogQGFkZHJlc3M6IFRoZSBhZGRyZXNzIGZvciB0aGlzIGRldmljZSwgdmFsaWQgb25seSBpZiBAbmV0ZGV2IGlzICVOVUxMCiAgKiBAcDJwX3N0YXJ0ZWQ6IHRydWUgaWYgdGhpcyBpcyBhIFAyUCBEZXZpY2UgdGhhdCBoYXMgYmVlbiBzdGFydGVkCisgKiBAbmFuX3N0YXJ0ZWQ6IHRydWUgaWYgdGhpcyBpcyBhIE5BTiBpbnRlcmZhY2UgdGhhdCBoYXMgYmVlbiBzdGFydGVkCiAgKiBAY2FjX3N0YXJ0ZWQ6IHRydWUgaWYgREZTIGNoYW5uZWwgYXZhaWxhYmlsaXR5IGNoZWNrIGhhcyBiZWVuIHN0YXJ0ZWQKICAqIEBjYWNfc3RhcnRfdGltZTogdGltZXN0YW1wIChqaWZmaWVzKSB3aGVuIHRoZSBkZnMgc3RhdGUgd2FzIGVudGVyZWQuCiAgKiBAY2FjX3RpbWVfbXM6IENBQyB0aW1lIGluIG1zCkBAIC0zNjMyLDcgKzM3NzgsNyBAQAogCiAJc3RydWN0IG11dGV4IG10eDsKIAotCWJvb2wgdXNlXzRhZGRyLCBwMnBfc3RhcnRlZDsKKwlib29sIHVzZV80YWRkciwgcDJwX3N0YXJ0ZWQsIG5hbl9zdGFydGVkOwogCiAJdTggYWRkcmVzc1tFVEhfQUxFTl0gX19hbGlnbmVkKHNpemVvZih1MTYpKTsKIApAQCAtMzk0Niw2ICs0MDkyLDM0IEBACiAJCQkJICAgIHN0cnVjdCBjZmc4MDIxMV9xb3NfbWFwICpxb3NfbWFwKTsKIAogLyoqCisgKiBjZmc4MDIxMV9maW5kX2llX21hdGNoIC0gbWF0Y2ggaW5mb3JtYXRpb24gZWxlbWVudCBhbmQgYnl0ZSBhcnJheSBpbiBkYXRhCisgKgorICogQGVpZDogZWxlbWVudCBJRAorICogQGllczogZGF0YSBjb25zaXN0aW5nIG9mIElFcworICogQGxlbjogbGVuZ3RoIG9mIGRhdGEKKyAqIEBtYXRjaDogYnl0ZSBhcnJheSB0byBtYXRjaAorICogQG1hdGNoX2xlbjogbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBtYXRjaCBhcnJheQorICogQG1hdGNoX29mZnNldDogb2Zmc2V0IGluIHRoZSBJRSB3aGVyZSB0aGUgYnl0ZSBhcnJheSBzaG91bGQgbWF0Y2guCisgKglJZiBtYXRjaF9sZW4gaXMgemVybywgdGhpcyBtdXN0IGFsc28gYmUgc2V0IHRvIHplcm8uCisgKglPdGhlcndpc2UgdGhpcyBtdXN0IGJlIHNldCB0byAyIG9yIG1vcmUsIGJlY2F1c2UgdGhlIGZpcnN0CisgKglieXRlIGlzIHRoZSBlbGVtZW50IGlkLCB3aGljaCBpcyBhbHJlYWR5IGNvbXBhcmVkIHRvIGVpZCwgYW5kCisgKgl0aGUgc2Vjb25kIGJ5dGUgaXMgdGhlIElFIGxlbmd0aC4KKyAqCisgKiBSZXR1cm46ICVOVUxMIGlmIHRoZSBlbGVtZW50IElEIGNvdWxkIG5vdCBiZSBmb3VuZCBvciBpZgorICogdGhlIGVsZW1lbnQgaXMgaW52YWxpZCAoY2xhaW1zIHRvIGJlIGxvbmdlciB0aGFuIHRoZSBnaXZlbgorICogZGF0YSkgb3IgaWYgdGhlIGJ5dGUgYXJyYXkgZG9lc24ndCBtYXRjaCwgb3IgYSBwb2ludGVyIHRvIHRoZSBmaXJzdAorICogYnl0ZSBvZiB0aGUgcmVxdWVzdGVkIGVsZW1lbnQsIHRoYXQgaXMgdGhlIGJ5dGUgY29udGFpbmluZyB0aGUKKyAqIGVsZW1lbnQgSUQuCisgKgorICogTm90ZTogVGhlcmUgYXJlIG5vIGNoZWNrcyBvbiB0aGUgZWxlbWVudCBsZW5ndGggb3RoZXIgdGhhbgorICogaGF2aW5nIHRvIGZpdCBpbnRvIHRoZSBnaXZlbiBkYXRhIGFuZCBiZWluZyBsYXJnZSBlbm91Z2ggZm9yIHRoZQorICogYnl0ZSBhcnJheSB0byBtYXRjaC4KKyAqLworY29uc3QgdTggKmNmZzgwMjExX2ZpbmRfaWVfbWF0Y2godTggZWlkLCBjb25zdCB1OCAqaWVzLCBpbnQgbGVuLAorCQkJCSBjb25zdCB1OCAqbWF0Y2gsIGludCBtYXRjaF9sZW4sCisJCQkJIGludCBtYXRjaF9vZmZzZXQpOworCisvKioKICAqIGNmZzgwMjExX2ZpbmRfaWUgLSBmaW5kIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gZGF0YQogICoKICAqIEBlaWQ6IGVsZW1lbnQgSUQKQEAgLTM5NjAsNyArNDEzNCwxMCBAQAogICogTm90ZTogVGhlcmUgYXJlIG5vIGNoZWNrcyBvbiB0aGUgZWxlbWVudCBsZW5ndGggb3RoZXIgdGhhbgogICogaGF2aW5nIHRvIGZpdCBpbnRvIHRoZSBnaXZlbiBkYXRhLgogICovCi1jb25zdCB1OCAqY2ZnODAyMTFfZmluZF9pZSh1OCBlaWQsIGNvbnN0IHU4ICppZXMsIGludCBsZW4pOworc3RhdGljIGlubGluZSBjb25zdCB1OCAqY2ZnODAyMTFfZmluZF9pZSh1OCBlaWQsIGNvbnN0IHU4ICppZXMsIGludCBsZW4pCit7CisJcmV0dXJuIGNmZzgwMjExX2ZpbmRfaWVfbWF0Y2goZWlkLCBpZXMsIGxlbiwgTlVMTCwgMCwgMCk7Cit9CiAKIC8qKgogICogY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUgLSBmaW5kIHZlbmRvciBzcGVjaWZpYyBpbmZvcm1hdGlvbiBlbGVtZW50IGluIGRhdGEKQEAgLTU1MDksNiArNTY4Niw2NyBAQAogCXJldHVybiAoZnRfYnl0ZSAmIEJJVChmdGlkeCAlIDgpKSAhPSAwOwogfQogCisvKioKKyAqIGNmZzgwMjExX2ZyZWVfbmFuX2Z1bmMgLSBmcmVlIE5BTiBmdW5jdGlvbgorICogQGY6IE5BTiBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBmcmVlZAorICoKKyAqIEZyZWVzIGFsbCB0aGUgTkFOIGZ1bmN0aW9uIGFuZCBhbGwgaXQncyBhbGxvY2F0ZWQgbWVtYmVycy4KKyAqLwordm9pZCBjZmc4MDIxMV9mcmVlX25hbl9mdW5jKHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqZik7CisKKy8qKgorICogc3RydWN0IGNmZzgwMjExX25hbl9tYXRjaF9wYXJhbXMgLSBOQU4gbWF0Y2ggcGFyYW1ldGVycworICogQHR5cGU6IHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHRyaWdnZXJlZCBhIG1hdGNoLiBJZiBpdCBpcworICoJICVOTDgwMjExX05BTl9GVU5DX1NVQlNDUklCRSBpdCBtZWFucyB0aGF0IHdlIHJlcGxpZWQgdG8gYSBzdWJzY3JpYmVyLgorICoJIElmIGl0IGlzICVOTDgwMjExX05BTl9GVU5DX1BVQkxJU0gsIGl0IG1lYW5zIHRoYXQgd2UgZ290IGEgZGlzY292ZXJ5CisgKgkgcmVzdWx0LgorICoJIElmIGl0IGlzICVOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUCwgd2UgcmVjZWl2ZWQgYSBmb2xsb3cgdXAuCisgKiBAaW5zdF9pZDogdGhlIGxvY2FsIGluc3RhbmNlIGlkCisgKiBAcGVlcl9pbnN0X2lkOiB0aGUgaW5zdGFuY2UgaWQgb2YgdGhlIHBlZXIncyBmdW5jdGlvbgorICogQGFkZHI6IHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgcGVlcgorICogQGluZm9fbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSAmaW5mbworICogQGluZm86IHRoZSBTZXJ2aWNlIFNwZWNpZmljIEluZm8gZnJvbSB0aGUgcGVlciAoaWYgYW55KQorICogQGNvb2tpZTogdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24KKyAqLworc3RydWN0IGNmZzgwMjExX25hbl9tYXRjaF9wYXJhbXMgeworCWVudW0gbmw4MDIxMV9uYW5fZnVuY3Rpb25fdHlwZSB0eXBlOworCXU4IGluc3RfaWQ7CisJdTggcGVlcl9pbnN0X2lkOworCWNvbnN0IHU4ICphZGRyOworCXU4IGluZm9fbGVuOworCWNvbnN0IHU4ICppbmZvOworCXU2NCBjb29raWU7Cit9OworCisvKioKKyAqIGNmZzgwMjExX25hbl9tYXRjaCAtIHJlcG9ydCBhIG1hdGNoIGZvciBhIE5BTiBmdW5jdGlvbi4KKyAqIEB3ZGV2OiB0aGUgd2lyZWxlc3MgZGV2aWNlIHJlcG9ydGluZyB0aGUgbWF0Y2gKKyAqIEBtYXRjaDogbWF0Y2ggbm90aWZpY2F0aW9uIHBhcmFtZXRlcnMKKyAqIEBnZnA6IGFsbG9jYXRpb24gZmxhZ3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcG9ydHMgdGhhdCB0aGUgYSBOQU4gZnVuY3Rpb24gaGFkIGEgbWF0Y2guIFRoaXMKKyAqIGNhbiBiZSBhIHN1YnNjcmliZSB0aGF0IGhhZCBhIG1hdGNoIG9yIGEgc29saWNpdGVkIHB1Ymxpc2ggdGhhdAorICogd2FzIHNlbnQuIEl0IGNhbiBhbHNvIGJlIGEgZm9sbG93IHVwIHRoYXQgd2FzIHJlY2VpdmVkLgorICovCit2b2lkIGNmZzgwMjExX25hbl9tYXRjaChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJc3RydWN0IGNmZzgwMjExX25hbl9tYXRjaF9wYXJhbXMgKm1hdGNoLCBnZnBfdCBnZnApOworCisvKioKKyAqIGNmZzgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQgLSBub3RpZnkgYWJvdXQgTkFOIGZ1bmN0aW9uIHRlcm1pbmF0aW9uLgorICoKKyAqIEB3ZGV2OiB0aGUgd2lyZWxlc3MgZGV2aWNlIHJlcG9ydGluZyB0aGUgbWF0Y2gKKyAqIEBpbnN0X2lkOiB0aGUgbG9jYWwgaW5zdGFuY2UgaWQKKyAqIEByZWFzb246IHRlcm1pbmF0aW9uIHJlYXNvbiAob25lIG9mIHRoZSBOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OXyopCisgKiBAY29va2llOiB1bmlxdWUgTkFOIGZ1bmN0aW9uIGlkZW50aWZpZXIKKyAqIEBnZnA6IGFsbG9jYXRpb24gZmxhZ3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcG9ydHMgdGhhdCB0aGUgYSBOQU4gZnVuY3Rpb24gaXMgdGVybWluYXRlZC4KKyAqLwordm9pZCBjZmc4MDIxMV9uYW5fZnVuY190ZXJtaW5hdGVkKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICB1OCBpbnN0X2lkLAorCQkJCSAgZW51bSBubDgwMjExX25hbl9mdW5jX3Rlcm1fcmVhc29uIHJlYXNvbiwKKwkJCQkgIHU2NCBjb29raWUsIGdmcF90IGdmcCk7CisKIC8qIGV0aHRvb2wgaGVscGVyICovCiB2b2lkIGNmZzgwMjExX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kZXZsaW5rLmggYi9pbmNsdWRlL25ldC9kZXZsaW5rLmgKaW5kZXggYzk5ZmZlOC4uMjExYmQzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZGV2bGluay5oCisrKyBiL2luY2x1ZGUvbmV0L2RldmxpbmsuaApAQCAtNTAsNyArNTAsNiBAQAogfTsKIAogc3RydWN0IGRldmxpbmtfb3BzIHsKLQlzaXplX3QgcHJpdl9zaXplOwogCWludCAoKnBvcnRfdHlwZV9zZXQpKHN0cnVjdCBkZXZsaW5rX3BvcnQgKmRldmxpbmtfcG9ydCwKIAkJCSAgICAgZW51bSBkZXZsaW5rX3BvcnRfdHlwZSBwb3J0X3R5cGUpOwogCWludCAoKnBvcnRfc3BsaXQpKHN0cnVjdCBkZXZsaW5rICpkZXZsaW5rLCB1bnNpZ25lZCBpbnQgcG9ydF9pbmRleCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RzYS5oIGIvaW5jbHVkZS9uZXQvZHNhLmgKaW5kZXggMjIxN2EzZi4uYjEyMjE5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZHNhLmgKKysrIGIvaW5jbHVkZS9uZXQvZHNhLmgKQEAgLTI2LDYgKzI2LDcgQEAKIAlEU0FfVEFHX1BST1RPX1RSQUlMRVIsCiAJRFNBX1RBR19QUk9UT19FRFNBLAogCURTQV9UQUdfUFJPVE9fQlJDTSwKKwlEU0FfVEFHX1BST1RPX1FDQSwKIAlEU0FfVEFHX0xBU1QsCQkvKiBNVVNUIEJFIExBU1QgKi8KIH07CiAKQEAgLTE0Miw2ICsxNDMsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlCSpuZXRkZXY7CiAJc3RydWN0IGRldmljZV9ub2RlCSpkbjsKIAl1bnNpZ25lZCBpbnQJCWFnZWluZ190aW1lOworCXU4CQkJc3RwX3N0YXRlOwogfTsKIAogc3RydWN0IGRzYV9zd2l0Y2ggewpAQCAtMTY1LDkgKzE2Nyw5IEBACiAJc3RydWN0IGRzYV9jaGlwX2RhdGEJKmNkOwogCiAJLyoKLQkgKiBUaGUgdXNlZCBzd2l0Y2ggZHJpdmVyLgorCSAqIFRoZSBzd2l0Y2ggb3BlcmF0aW9ucy4KIAkgKi8KLQlzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIJKmRydjsKKwlzdHJ1Y3QgZHNhX3N3aXRjaF9vcHMJKm9wczsKIAogCS8qCiAJICogQW4gYXJyYXkgb2Ygd2hpY2ggZWxlbWVudCBbYV0gaW5kaWNhdGVzIHdoaWNoIHBvcnQgb24gdGhpcwpAQCAtMjM0LDE5ICsyMzYsMjEgQEAKIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnM7CiBzdHJ1Y3Qgc3dpdGNoZGV2X29iajsKIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfZmRiOworc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGI7CiBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X3ZsYW47CiAKLXN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciB7CitzdHJ1Y3QgZHNhX3N3aXRjaF9vcHMgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAotCWVudW0gZHNhX3RhZ19wcm90b2NvbAl0YWdfcHJvdG9jb2w7Ci0KIAkvKgogCSAqIFByb2JpbmcgYW5kIHNldHVwLgogCSAqLwogCWNvbnN0IGNoYXIJKigqcHJvYmUpKHN0cnVjdCBkZXZpY2UgKmRzYV9kZXYsCiAJCQkJICBzdHJ1Y3QgZGV2aWNlICpob3N0X2RldiwgaW50IHN3X2FkZHIsCiAJCQkJICB2b2lkICoqcHJpdik7CisKKwllbnVtIGRzYV90YWdfcHJvdG9jb2wgKCpnZXRfdGFnX3Byb3RvY29sKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOworCiAJaW50CSgqc2V0dXApKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7CiAJaW50CSgqc2V0X2FkZHIpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgdTggKmFkZHIpOwogCXUzMgkoKmdldF9waHlfZmxhZ3MpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpOwpAQCAtMzM2LDYgKzM0MCw3IEBACiAJdm9pZAkoKnBvcnRfYnJpZGdlX2xlYXZlKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KTsKIAl2b2lkCSgqcG9ydF9zdHBfc3RhdGVfc2V0KShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSAgICAgIHU4IHN0YXRlKTsKKwl2b2lkCSgqcG9ydF9mYXN0X2FnZSkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCk7CiAKIAkvKgogCSAqIFZMQU4gc3VwcG9ydApAQCAtMzY4LDE3ICszNzMsMjcgQEAKIAlpbnQJKCpwb3J0X2ZkYl9kdW1wKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJCSBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYiAqZmRiLAogCQkJCSBpbnQgKCpjYikoc3RydWN0IHN3aXRjaGRldl9vYmogKm9iaikpOworCisJLyoKKwkgKiBNdWx0aWNhc3QgZGF0YWJhc2UKKwkgKi8KKwlpbnQJKCpwb3J0X21kYl9wcmVwYXJlKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiLAorCQkJCSAgICBzdHJ1Y3Qgc3dpdGNoZGV2X3RyYW5zICp0cmFucyk7CisJdm9pZAkoKnBvcnRfbWRiX2FkZCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQljb25zdCBzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X21kYiAqbWRiLAorCQkJCXN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKTsKKwlpbnQJKCpwb3J0X21kYl9kZWwpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkJY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYik7CisJaW50CSgqcG9ydF9tZGJfZHVtcCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYiwKKwkJCQkgaW50ICgqY2IpKHN0cnVjdCBzd2l0Y2hkZXZfb2JqICpvYmopKTsKIH07CiAKLXZvaWQgcmVnaXN0ZXJfc3dpdGNoX2RyaXZlcihzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKnR5cGUpOwotdm9pZCB1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICp0eXBlKTsKK3ZvaWQgcmVnaXN0ZXJfc3dpdGNoX2RyaXZlcihzdHJ1Y3QgZHNhX3N3aXRjaF9vcHMgKnR5cGUpOwordm9pZCB1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfb3BzICp0eXBlKTsKIHN0cnVjdCBtaWlfYnVzICpkc2FfaG9zdF9kZXZfdG9fbWlpX2J1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmRzX3RvX3ByaXYoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQotewotCXJldHVybiBkcy0+cHJpdjsKLX0KLQogc3RhdGljIGlubGluZSBib29sIGRzYV91c2VzX3RhZ2dlZF9wcm90b2NvbChzdHJ1Y3QgZHNhX3N3aXRjaF90cmVlICpkc3QpCiB7CiAJcmV0dXJuIGRzdC0+cmN2ICE9IE5VTEw7CkBAIC0zODYsNCArNDAxLDE4IEBACiAKIHZvaWQgZHNhX3VucmVnaXN0ZXJfc3dpdGNoKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7CiBpbnQgZHNhX3JlZ2lzdGVyX3N3aXRjaChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworI2lmZGVmIENPTkZJR19QTV9TTEVFUAoraW50IGRzYV9zd2l0Y2hfc3VzcGVuZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOworaW50IGRzYV9zd2l0Y2hfcmVzdW1lKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZHNhX3N3aXRjaF9zdXNwZW5kKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGRzYV9zd2l0Y2hfcmVzdW1lKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc3RfbWV0YWRhdGEuaCBiL2luY2x1ZGUvbmV0L2RzdF9tZXRhZGF0YS5oCmluZGV4IDVkYjlmNTkuLjY5NjVjOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RzdF9tZXRhZGF0YS5oCisrKyBiL2luY2x1ZGUvbmV0L2RzdF9tZXRhZGF0YS5oCkBAIC0xMTIsMTIgKzExMiwxMyBAQAogCXJldHVybiAmZHN0LT51LnR1bl9pbmZvOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtZXRhZGF0YV9kc3QgKmlwX3R1bl9yeF9kc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCSBfX2JlMTYgZmxhZ3MsCi0JCQkJCQkgX19iZTY0IHR1bm5lbF9pZCwKLQkJCQkJCSBpbnQgbWRfc2l6ZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1ldGFkYXRhX2RzdCAqX19pcF90dW5fc2V0X2RzdChfX2JlMzIgc2FkZHIsCisJCQkJCQkgICAgX19iZTMyIGRhZGRyLAorCQkJCQkJICAgIF9fdTggdG9zLCBfX3U4IHR0bCwKKwkJCQkJCSAgICBfX2JlMTYgZmxhZ3MsCisJCQkJCQkgICAgX19iZTY0IHR1bm5lbF9pZCwKKwkJCQkJCSAgICBpbnQgbWRfc2l6ZSkKIHsKLQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCXN0cnVjdCBtZXRhZGF0YV9kc3QgKnR1bl9kc3Q7CiAKIAl0dW5fZHN0ID0gdHVuX3J4X2RzdChtZF9zaXplKTsKQEAgLTEyNSwxNyArMTI2LDMwIEBACiAJCXJldHVybiBOVUxMOwogCiAJaXBfdHVubmVsX2tleV9pbml0KCZ0dW5fZHN0LT51LnR1bl9pbmZvLmtleSwKLQkJCSAgIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIsIGlwaC0+dG9zLCBpcGgtPnR0bCwKKwkJCSAgIHNhZGRyLCBkYWRkciwgdG9zLCB0dGwsCiAJCQkgICAwLCAwLCAwLCB0dW5uZWxfaWQsIGZsYWdzKTsKIAlyZXR1cm4gdHVuX2RzdDsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbWV0YWRhdGFfZHN0ICppcHY2X3R1bl9yeF9kc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1ldGFkYXRhX2RzdCAqaXBfdHVuX3J4X2RzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkJIF9fYmUxNiBmbGFncywKIAkJCQkJCSBfX2JlNjQgdHVubmVsX2lkLAogCQkJCQkJIGludCBtZF9zaXplKQogewotCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoID0gaXB2Nl9oZHIoc2tiKTsKKwljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCisJcmV0dXJuIF9faXBfdHVuX3NldF9kc3QoaXBoLT5zYWRkciwgaXBoLT5kYWRkciwgaXBoLT50b3MsIGlwaC0+dHRsLAorCQkJCWZsYWdzLCB0dW5uZWxfaWQsIG1kX3NpemUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtZXRhZGF0YV9kc3QgKl9faXB2Nl90dW5fc2V0X2RzdChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAorCQkJCQkJICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKKwkJCQkJCSAgICAgIF9fdTggdG9zLCBfX3U4IHR0bCwKKwkJCQkJCSAgICAgIF9fYmUzMiBsYWJlbCwKKwkJCQkJCSAgICAgIF9fYmUxNiBmbGFncywKKwkJCQkJCSAgICAgIF9fYmU2NCB0dW5uZWxfaWQsCisJCQkJCQkgICAgICBpbnQgbWRfc2l6ZSkKK3sKIAlzdHJ1Y3QgbWV0YWRhdGFfZHN0ICp0dW5fZHN0OwogCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqaW5mbzsKIApAQCAtMTUwLDE0ICsxNjQsMjYgQEAKIAlpbmZvLT5rZXkudHBfc3JjID0gMDsKIAlpbmZvLT5rZXkudHBfZHN0ID0gMDsKIAotCWluZm8tPmtleS51LmlwdjYuc3JjID0gaXA2aC0+c2FkZHI7Ci0JaW5mby0+a2V5LnUuaXB2Ni5kc3QgPSBpcDZoLT5kYWRkcjsKKwlpbmZvLT5rZXkudS5pcHY2LnNyYyA9ICpzYWRkcjsKKwlpbmZvLT5rZXkudS5pcHY2LmRzdCA9ICpkYWRkcjsKIAotCWluZm8tPmtleS50b3MgPSBpcHY2X2dldF9kc2ZpZWxkKGlwNmgpOwotCWluZm8tPmtleS50dGwgPSBpcDZoLT5ob3BfbGltaXQ7Ci0JaW5mby0+a2V5LmxhYmVsID0gaXA2X2Zsb3dsYWJlbChpcDZoKTsKKwlpbmZvLT5rZXkudG9zID0gdG9zOworCWluZm8tPmtleS50dGwgPSB0dGw7CisJaW5mby0+a2V5LmxhYmVsID0gbGFiZWw7CiAKIAlyZXR1cm4gdHVuX2RzdDsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgbWV0YWRhdGFfZHN0ICppcHY2X3R1bl9yeF9kc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJCSAgIF9fYmUxNiBmbGFncywKKwkJCQkJCSAgIF9fYmU2NCB0dW5uZWxfaWQsCisJCQkJCQkgICBpbnQgbWRfc2l6ZSkKK3sKKwljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IGlwdjZfaGRyKHNrYik7CisKKwlyZXR1cm4gX19pcHY2X3R1bl9zZXRfZHN0KCZpcDZoLT5zYWRkciwgJmlwNmgtPmRhZGRyLAorCQkJCSAgaXB2Nl9nZXRfZHNmaWVsZChpcDZoKSwgaXA2aC0+aG9wX2xpbWl0LAorCQkJCSAgaXA2X2Zsb3dsYWJlbChpcDZoKSwgZmxhZ3MsIHR1bm5lbF9pZCwKKwkJCQkgIG1kX3NpemUpOworfQogI2VuZGlmIC8qIF9fTkVUX0RTVF9NRVRBREFUQV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9mbG93LmggYi9pbmNsdWRlL25ldC9mbG93LmgKaW5kZXggZDQ3ZWY0Yi4uMDM1YWE3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZmxvdy5oCisrKyBiL2luY2x1ZGUvbmV0L2Zsb3cuaApAQCAtMzQsOCArMzQsNyBAQAogCV9fdTgJZmxvd2ljX2ZsYWdzOwogI2RlZmluZSBGTE9XSV9GTEFHX0FOWVNSQwkJMHgwMQogI2RlZmluZSBGTE9XSV9GTEFHX0tOT1dOX05ICQkweDAyCi0jZGVmaW5lIEZMT1dJX0ZMQUdfTDNNREVWX1NSQwkJMHgwNAotI2RlZmluZSBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGCQkweDA4CisjZGVmaW5lIEZMT1dJX0ZMQUdfU0tJUF9OSF9PSUYJCTB4MDQKIAlfX3UzMglmbG93aWNfc2VjaWQ7CiAJc3RydWN0IGZsb3dpX3R1bm5lbCBmbG93aWNfdHVuX2tleTsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9mbG93X2Rpc3NlY3Rvci5oIGIvaW5jbHVkZS9uZXQvZmxvd19kaXNzZWN0b3IuaAppbmRleCBkM2Q2MGRjLi5kOTUzNDkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9mbG93X2Rpc3NlY3Rvci5oCisrKyBiL2luY2x1ZGUvbmV0L2Zsb3dfZGlzc2VjdG9yLmgKQEAgLTMyLDggKzMyLDEzIEBACiB9OwogCiBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3RhZ3MgewotCXUzMgl2bGFuX2lkOjEyLAotCQlmbG93X2xhYmVsOjIwOworCXUzMglmbG93X2xhYmVsOworfTsKKworc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV92bGFuIHsKKwl1MTYJdmxhbl9pZDoxMiwKKwkJdmxhbl9wcmlvcml0eTozOworCXUxNglwYWRkaW5nOwogfTsKIAogc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9rZXlpZCB7CkBAIC0xMTksNyArMTI0LDcgQEAKIAlGTE9XX0RJU1NFQ1RPUl9LRVlfUE9SVFMsIC8qIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfcG9ydHMgKi8KIAlGTE9XX0RJU1NFQ1RPUl9LRVlfRVRIX0FERFJTLCAvKiBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2V0aF9hZGRycyAqLwogCUZMT1dfRElTU0VDVE9SX0tFWV9USVBDX0FERFJTLCAvKiBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3RpcGNfYWRkcnMgKi8KLQlGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTklELCAvKiBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2Zsb3dfdGFncyAqLworCUZMT1dfRElTU0VDVE9SX0tFWV9WTEFOLCAvKiBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2Zsb3dfdmxhbiAqLwogCUZMT1dfRElTU0VDVE9SX0tFWV9GTE9XX0xBQkVMLCAvKiBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2Zsb3dfdGFncyAqLwogCUZMT1dfRElTU0VDVE9SX0tFWV9HUkVfS0VZSUQsIC8qIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfa2V5aWQgKi8KIAlGTE9XX0RJU1NFQ1RPUl9LRVlfTVBMU19FTlRST1BZLCAvKiBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2tleWlkICovCkBAIC0xNDgsNiArMTUzLDcgQEAKICNkZWZpbmUgRkxPV19LRVlTX0hBU0hfU1RBUlRfRklFTEQgYmFzaWMKIAlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2Jhc2ljIGJhc2ljOwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdGFncyB0YWdzOworCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdmxhbiB2bGFuOwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfa2V5aWQga2V5aWQ7CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9wb3J0cyBwb3J0czsKIAlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2FkZHJzIGFkZHJzOwpAQCAtMTc3LDcgKzE4Myw3IEBACiB2b2lkIG1ha2VfZmxvd19rZXlzX2RpZ2VzdChzdHJ1Y3QgZmxvd19rZXlzX2RpZ2VzdCAqZGlnZXN0LAogCQkJICAgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdyk7CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBmbG93X2tleXNfaGF2ZV9sNChzdHJ1Y3QgZmxvd19rZXlzICprZXlzKQorc3RhdGljIGlubGluZSBib29sIGZsb3dfa2V5c19oYXZlX2w0KGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmtleXMpCiB7CiAJcmV0dXJuIChrZXlzLT5wb3J0cy5wb3J0cyB8fCBrZXlzLT50YWdzLmZsb3dfbGFiZWwpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZnEuaCBiL2luY2x1ZGUvbmV0L2ZxLmgKaW5kZXggMjY4YjQ5MC4uNmQ4NTIxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZnEuaAorKysgYi9pbmNsdWRlL25ldC9mcS5oCkBAIC03Miw5ICs3MiwxMiBAQAogCXUzMiBmbG93c19jbnQ7CiAJdTMyIHBlcnR1cmJhdGlvbjsKIAl1MzIgbGltaXQ7CisJdTMyIG1lbW9yeV9saW1pdDsKKwl1MzIgbWVtb3J5X3VzYWdlOwogCXUzMiBxdWFudHVtOwogCXUzMiBiYWNrbG9nOwogCXUzMiBvdmVybGltaXQ7CisJdTMyIG92ZXJtZW1vcnk7CiAJdTMyIGNvbGxpc2lvbnM7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9mcV9pbXBsLmggYi9pbmNsdWRlL25ldC9mcV9pbXBsLmgKaW5kZXggMTYzZjNlZC4uNGU2MTMxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZnFfaW1wbC5oCisrKyBiL2luY2x1ZGUvbmV0L2ZxX2ltcGwuaApAQCAtMjksNiArMjksNyBAQAogCXRpbi0+YmFja2xvZ19wYWNrZXRzLS07CiAJZmxvdy0+YmFja2xvZyAtPSBza2ItPmxlbjsKIAlmcS0+YmFja2xvZy0tOworCWZxLT5tZW1vcnlfdXNhZ2UgLT0gc2tiLT50cnVlc2l6ZTsKIAogCWlmIChmbG93LT5iYWNrbG9nID09IDApIHsKIAkJbGlzdF9kZWxfaW5pdCgmZmxvdy0+YmFja2xvZ2NoYWluKTsKQEAgLTE1NCw2ICsxNTUsNyBAQAogCWZsb3ctPmJhY2tsb2cgKz0gc2tiLT5sZW47CiAJdGluLT5iYWNrbG9nX2J5dGVzICs9IHNrYi0+bGVuOwogCXRpbi0+YmFja2xvZ19wYWNrZXRzKys7CisJZnEtPm1lbW9yeV91c2FnZSArPSBza2ItPnRydWVzaXplOwogCWZxLT5iYWNrbG9nKys7CiAKIAlmcV9yZWNhbGNfYmFja2xvZyhmcSwgdGluLCBmbG93KTsKQEAgLTE2Niw3ICsxNjgsNyBAQAogCiAJX19za2JfcXVldWVfdGFpbCgmZmxvdy0+cXVldWUsIHNrYik7CiAKLQlpZiAoZnEtPmJhY2tsb2cgPiBmcS0+bGltaXQpIHsKKwlpZiAoZnEtPmJhY2tsb2cgPiBmcS0+bGltaXQgfHwgZnEtPm1lbW9yeV91c2FnZSA+IGZxLT5tZW1vcnlfbGltaXQpIHsKIAkJZmxvdyA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZnEtPmJhY2tsb2dzLAogCQkJCQkJc3RydWN0IGZxX2Zsb3csCiAJCQkJCQliYWNrbG9nY2hhaW4pOwpAQCAtMTgxLDYgKzE4Myw4IEBACiAKIAkJZmxvdy0+dGluLT5vdmVybGltaXQrKzsKIAkJZnEtPm92ZXJsaW1pdCsrOworCQlpZiAoZnEtPm1lbW9yeV91c2FnZSA+IGZxLT5tZW1vcnlfbGltaXQpCisJCQlmcS0+b3Zlcm1lbW9yeSsrOwogCX0KIH0KIApAQCAtMjUxLDYgKzI1NSw3IEBACiAJZnEtPnBlcnR1cmJhdGlvbiA9IHByYW5kb21fdTMyKCk7CiAJZnEtPnF1YW50dW0gPSAzMDA7CiAJZnEtPmxpbWl0ID0gODE5MjsKKwlmcS0+bWVtb3J5X2xpbWl0ID0gMTYgPDwgMjA7IC8qIDE2IE1CeXRlcyAqLwogCiAJZnEtPmZsb3dzID0ga2NhbGxvYyhmcS0+Zmxvd3NfY250LCBzaXplb2YoZnEtPmZsb3dzWzBdKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmcS0+Zmxvd3MpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ncmUuaCBiL2luY2x1ZGUvbmV0L2dyZS5oCmluZGV4IDczZWEyNTYuLmQyNWQ4MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2dyZS5oCisrKyBiL2luY2x1ZGUvbmV0L2dyZS5oCkBAIC03LDcgKzcsMTUgQEAKIHN0cnVjdCBncmVfYmFzZV9oZHIgewogCV9fYmUxNiBmbGFnczsKIAlfX2JlMTYgcHJvdG9jb2w7Ci19OworfSBfX3BhY2tlZDsKKworc3RydWN0IGdyZV9mdWxsX2hkciB7CisJc3RydWN0IGdyZV9iYXNlX2hkciBmaXhlZF9oZWFkZXI7CisJX19iZTE2IGNzdW07CisJX19iZTE2IHJlc2VydmVkMTsKKwlfX2JlMzIga2V5OworCV9fYmUzMiBzZXE7Cit9IF9fcGFja2VkOwogI2RlZmluZSBHUkVfSEVBREVSX1NFQ1RJT04gNAogCiAjZGVmaW5lIEdSRVBST1RPX0NJU0NPCQkwCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pZWVlODAyMTFfcmFkaW90YXAuaCBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oCmluZGV4IGIwZmQ5NDcuLmJhMDdiOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oCisrKyBiL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oCkBAIC0xOTAsNiArMTkwLDEwIEBACiAgKiBJRUVFODAyMTFfUkFESU9UQVBfVkhUCXUxNiwgdTgsIHU4LCB1OFs0XSwgdTgsIHU4LCB1MTYKICAqCiAgKglDb250YWlucyBWSFQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBmcmFtZS4KKyAqCisgKiBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QCQl1NjQsIHUxNiwgdTgsIHU4CXZhcmlhYmxlCisgKgorICoJQ29udGFpbnMgdGltZXN0YW1wIGluZm9ybWF0aW9uIGZvciB0aGlzIGZyYW1lLgogICovCiBlbnVtIGllZWU4MDIxMV9yYWRpb3RhcF90eXBlIHsKIAlJRUVFODAyMTFfUkFESU9UQVBfVFNGVCA9IDAsCkBAIC0yMTQsNiArMjE4LDcgQEAKIAlJRUVFODAyMTFfUkFESU9UQVBfTUNTID0gMTksCiAJSUVFRTgwMjExX1JBRElPVEFQX0FNUERVX1NUQVRVUyA9IDIwLAogCUlFRUU4MDIxMV9SQURJT1RBUF9WSFQgPSAyMSwKKwlJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QID0gMjIsCiAKIAkvKiB2YWxpZCBpbiBldmVyeSBpdF9wcmVzZW50IGJpdG1hcCwgZXZlbiB2ZW5kb3IgbmFtZXNwYWNlcyAqLwogCUlFRUU4MDIxMV9SQURJT1RBUF9SQURJT1RBUF9OQU1FU1BBQ0UgPSAyOSwKQEAgLTMyMSw2ICszMjYsMjIgQEAKICNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX0NPRElOR19MRFBDX1VTRVIyCQkJMHgwNAogI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfQ09ESU5HX0xEUENfVVNFUjMJCQkweDA4CiAKKy8qIEZvciBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QICovCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfVU5JVF9NQVNLCQkJMHgwMDBGCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfVU5JVF9NUwkJCTB4MDAwMAorI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1VOSVRfVVMJCQkweDAwMDEKKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9VTklUX05TCQkJMHgwMDAzCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfU1BPU19NQVNLCQkJMHgwMEYwCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfU1BPU19CRUdJTl9NRFBVCQkweDAwMDAKKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9TUE9TX0VPX01QRFUJCTB4MDAxMAorI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1NQT1NfRU9fUFBEVQkJMHgwMDIwCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfU1BPU19QTENQX1NJR19BQ1EJCTB4MDAzMAorI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1NQT1NfVU5LTk9XTgkJMHgwMEYwCisKKyNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9GTEFHXzY0QklUCQkJMHgwMAorI2RlZmluZSBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX0ZMQUdfMzJCSVQJCQkweDAxCisjZGVmaW5lIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfRkxBR19BQ0NVUkFDWQkJMHgwMgorCiAvKiBoZWxwZXJzICovCiBzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X3JhZGlvdGFwX2xlbih1bnNpZ25lZCBjaGFyICpkYXRhKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaCBiL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmgKaW5kZXggMWM4YjY4Mi4uNTE1MzUyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaAorKysgYi9pbmNsdWRlL25ldC9pZl9pbmV0Ni5oCkBAIC0yMDEsNiArMjAxLDcgQEAKIAlzdHJ1Y3QgaXB2Nl9kZXZzdGF0CXN0YXRzOwogCiAJc3RydWN0IHRpbWVyX2xpc3QJcnNfdGltZXI7CisJX19zMzIJCQlyc19pbnRlcnZhbDsJLyogaW4gamlmZmllcyAqLwogCV9fdTgJCQlyc19wcm9iZXM7CiAKIAlfX3U4CQkJYWRkcl9nZW5fbW9kZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oCmluZGV4IDQ5ZGNhZDQuLjE5N2EzMGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaApAQCAtMTM0LDggKzEzNCw4IEBACiAJfSBpY3NrX210dXA7CiAJdTMyCQkJICBpY3NrX3VzZXJfdGltZW91dDsKIAotCXU2NAkJCSAgaWNza19jYV9wcml2WzY0IC8gc2l6ZW9mKHU2NCldOwotI2RlZmluZSBJQ1NLX0NBX1BSSVZfU0laRSAgICAgICg4ICogc2l6ZW9mKHU2NCkpCisJdTY0CQkJICBpY3NrX2NhX3ByaXZbODggLyBzaXplb2YodTY0KV07CisjZGVmaW5lIElDU0tfQ0FfUFJJVl9TSVpFICAgICAgKDExICogc2l6ZW9mKHU2NCkpCiB9OwogCiAjZGVmaW5lIElDU0tfVElNRV9SRVRSQU5TCTEJLyogUmV0cmFuc21pdCB0aW1lciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXAuaCBiL2luY2x1ZGUvbmV0L2lwLmgKaW5kZXggOTc0MmI5Mi4uYmM0M2MwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXAuaAorKysgYi9pbmNsdWRlL25ldC9pcC5oCkBAIC0yMTksNiArMjE5LDI5IEBACiB9CiAjZW5kaWYKIAorI2RlZmluZSBzbm1wX2dldF9jcHVfZmllbGQ2NF9iYXRjaChidWZmNjQsIHN0YXRzX2xpc3QsIG1pYl9zdGF0aXN0aWMsIG9mZnNldCkgXAoreyBcCisJaW50IGksIGM7IFwKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoYykgeyBcCisJCWZvciAoaSA9IDA7IHN0YXRzX2xpc3RbaV0ubmFtZTsgaSsrKSBcCisJCQlidWZmNjRbaV0gKz0gc25tcF9nZXRfY3B1X2ZpZWxkNjQoIFwKKwkJCQkJbWliX3N0YXRpc3RpYywgXAorCQkJCQljLCBzdGF0c19saXN0W2ldLmVudHJ5LCBcCisJCQkJCW9mZnNldCk7IFwKKwl9IFwKK30KKworI2RlZmluZSBzbm1wX2dldF9jcHVfZmllbGRfYmF0Y2goYnVmZiwgc3RhdHNfbGlzdCwgbWliX3N0YXRpc3RpYykgXAoreyBcCisJaW50IGksIGM7IFwKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoYykgeyBcCisJCWZvciAoaSA9IDA7IHN0YXRzX2xpc3RbaV0ubmFtZTsgaSsrKSBcCisJCQlidWZmW2ldICs9IHNubXBfZ2V0X2NwdV9maWVsZCggXAorCQkJCQkJbWliX3N0YXRpc3RpYywgXAorCQkJCQkJYywgc3RhdHNfbGlzdFtpXS5lbnRyeSk7IFwKKwl9IFwKK30KKwogdm9pZCBpbmV0X2dldF9sb2NhbF9wb3J0X3JhbmdlKHN0cnVjdCBuZXQgKm5ldCwgaW50ICpsb3csIGludCAqaGlnaCk7CiAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcDZfcm91dGUuaCBiL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCmluZGV4IGQ5NzMwNWQuLmUwY2QzMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCisrKyBiL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCkBAIC02NCw2ICs2NCw5IEBACiB9CiAKIHZvaWQgaXA2X3JvdXRlX2lucHV0KHN0cnVjdCBza19idWZmICpza2IpOworc3RydWN0IGRzdF9lbnRyeSAqaXA2X3JvdXRlX2lucHV0X2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGZsb3dpNiAqZmw2LCBpbnQgZmxhZ3MpOwogCiBzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfcm91dGVfb3V0cHV0X2ZsYWdzKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgc3RydWN0IGZsb3dpNiAqZmw2LCBpbnQgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXA2X3R1bm5lbC5oIGIvaW5jbHVkZS9uZXQvaXA2X3R1bm5lbC5oCmluZGV4IDQzYTVhMGUuLjIwZWQ5NjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwNl90dW5uZWwuaAorKysgYi9pbmNsdWRlL25ldC9pcDZfdHVubmVsLmgKQEAgLTIzLDYgKzIzLDcgQEAKIAlfX3U4IHByb3RvOwkJLyogdHVubmVsIHByb3RvY29sICovCiAJX191OCBlbmNhcF9saW1pdDsJLyogZW5jYXBzdWxhdGlvbiBsaW1pdCBmb3IgdHVubmVsICovCiAJX191OCBob3BfbGltaXQ7CQkvKiBob3AgbGltaXQgZm9yIHR1bm5lbCAqLworCWJvb2wgY29sbGVjdF9tZDsKIAlfX2JlMzIgZmxvd2luZm87CS8qIHRyYWZmaWMgY2xhc3MgYW5kIGZsb3dsYWJlbCBmb3IgdHVubmVsICovCiAJX191MzIgZmxhZ3M7CQkvKiB0dW5uZWwgZmxhZ3MgKi8KIAlzdHJ1Y3QgaW42X2FkZHIgbGFkZHI7CS8qIGxvY2FsIHR1bm5lbCBlbmQtcG9pbnQgYWRkcmVzcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXBfZmliLmggYi9pbmNsdWRlL25ldC9pcF9maWIuaAppbmRleCA0MDc5ZmMxLi5iOTMxNGI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcF9maWIuaAorKysgYi9pbmNsdWRlL25ldC9pcF9maWIuaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPG5ldC9maWJfcnVsZXMuaD4KICNpbmNsdWRlIDxuZXQvaW5ldHBlZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCiBzdHJ1Y3QgZmliX2NvbmZpZyB7CiAJdTgJCQlmY19kc3RfbGVuOwpAQCAtMTExLDYgKzExMiw3IEBACiAJdW5zaWduZWQgY2hhcgkJZmliX3Njb3BlOwogCXVuc2lnbmVkIGNoYXIJCWZpYl90eXBlOwogCV9fYmUzMgkJCWZpYl9wcmVmc3JjOworCXUzMgkJCWZpYl90Yl9pZDsKIAl1MzIJCQlmaWJfcHJpb3JpdHk7CiAJdTMyCQkJKmZpYl9tZXRyaWNzOwogI2RlZmluZSBmaWJfbXR1IGZpYl9tZXRyaWNzW1JUQVhfTVRVLTFdCkBAIC0xMjEsNiArMTIzLDcgQEAKICNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRICiAJaW50CQkJZmliX3dlaWdodDsKICNlbmRpZgorCXVuc2lnbmVkIGludAkJZmliX29mZmxvYWRfY250OwogCXN0cnVjdCByY3VfaGVhZAkJcmN1OwogCXN0cnVjdCBmaWJfbmgJCWZpYl9uaFswXTsKICNkZWZpbmUgZmliX2RldgkJZmliX25oWzBdLm5oX2RldgpAQCAtMTcyLDYgKzE3NSwxOCBAQAogCiBfX2JlMzIgZmliX2luZm9fdXBkYXRlX25oX3NhZGRyKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZpYl9uaCAqbmgpOwogCitzdGF0aWMgaW5saW5lIHZvaWQgZmliX2luZm9fb2ZmbG9hZF9pbmMoc3RydWN0IGZpYl9pbmZvICpmaSkKK3sKKwlmaS0+ZmliX29mZmxvYWRfY250Kys7CisJZmktPmZpYl9mbGFncyB8PSBSVE5IX0ZfT0ZGTE9BRDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZpYl9pbmZvX29mZmxvYWRfZGVjKHN0cnVjdCBmaWJfaW5mbyAqZmkpCit7CisJaWYgKC0tZmktPmZpYl9vZmZsb2FkX2NudCA9PSAwKQorCQlmaS0+ZmliX2ZsYWdzICY9IH5SVE5IX0ZfT0ZGTE9BRDsKK30KKwogI2RlZmluZSBGSUJfUkVTX1NBRERSKG5ldCwgcmVzKQkJCQlcCiAJKChGSUJfUkVTX05IKHJlcykubmhfc2FkZHJfZ2VuaWQgPT0JCVwKIAkgIGF0b21pY19yZWFkKCYobmV0KS0+aXB2NC5kZXZfYWRkcl9nZW5pZCkpID8JXApAQCAtMTg0LDYgKzE5OSwzMyBAQAogI2RlZmluZSBGSUJfUkVTX1BSRUZTUkMobmV0LCByZXMpCSgocmVzKS5maS0+ZmliX3ByZWZzcmMgPyA6IFwKIAkJCQkJIEZJQl9SRVNfU0FERFIobmV0LCByZXMpKQogCitzdHJ1Y3QgZmliX25vdGlmaWVyX2luZm8geworCXN0cnVjdCBuZXQgKm5ldDsKK307CisKK3N0cnVjdCBmaWJfZW50cnlfbm90aWZpZXJfaW5mbyB7CisJc3RydWN0IGZpYl9ub3RpZmllcl9pbmZvIGluZm87IC8qIG11c3QgYmUgZmlyc3QgKi8KKwl1MzIgZHN0OworCWludCBkc3RfbGVuOworCXN0cnVjdCBmaWJfaW5mbyAqZmk7CisJdTggdG9zOworCXU4IHR5cGU7CisJdTMyIHRiX2lkOworCXUzMiBubGZsYWdzOworfTsKKworZW51bSBmaWJfZXZlbnRfdHlwZSB7CisJRklCX0VWRU5UX0VOVFJZX0FERCwKKwlGSUJfRVZFTlRfRU5UUllfREVMLAorCUZJQl9FVkVOVF9SVUxFX0FERCwKKwlGSUJfRVZFTlRfUlVMRV9ERUwsCit9OworCitpbnQgcmVnaXN0ZXJfZmliX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworaW50IHVucmVnaXN0ZXJfZmliX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworaW50IGNhbGxfZmliX25vdGlmaWVycyhzdHJ1Y3QgbmV0ICpuZXQsIGVudW0gZmliX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSwKKwkJICAgICAgIHN0cnVjdCBmaWJfbm90aWZpZXJfaW5mbyAqaW5mbyk7CisKIHN0cnVjdCBmaWJfdGFibGUgewogCXN0cnVjdCBobGlzdF9ub2RlCXRiX2hsaXN0OwogCXUzMgkJCXRiX2lkOwpAQCAtMTk1LDEzICsyMzcsMTIgQEAKIAogaW50IGZpYl90YWJsZV9sb29rdXAoc3RydWN0IGZpYl90YWJsZSAqdGIsIGNvbnN0IHN0cnVjdCBmbG93aTQgKmZscCwKIAkJICAgICBzdHJ1Y3QgZmliX3Jlc3VsdCAqcmVzLCBpbnQgZmliX2ZsYWdzKTsKLWludCBmaWJfdGFibGVfaW5zZXJ0KHN0cnVjdCBmaWJfdGFibGUgKiwgc3RydWN0IGZpYl9jb25maWcgKik7Ci1pbnQgZmliX3RhYmxlX2RlbGV0ZShzdHJ1Y3QgZmliX3RhYmxlICosIHN0cnVjdCBmaWJfY29uZmlnICopOworaW50IGZpYl90YWJsZV9pbnNlcnQoc3RydWN0IG5ldCAqLCBzdHJ1Y3QgZmliX3RhYmxlICosIHN0cnVjdCBmaWJfY29uZmlnICopOworaW50IGZpYl90YWJsZV9kZWxldGUoc3RydWN0IG5ldCAqLCBzdHJ1Y3QgZmliX3RhYmxlICosIHN0cnVjdCBmaWJfY29uZmlnICopOwogaW50IGZpYl90YWJsZV9kdW1wKHN0cnVjdCBmaWJfdGFibGUgKnRhYmxlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwotaW50IGZpYl90YWJsZV9mbHVzaChzdHJ1Y3QgZmliX3RhYmxlICp0YWJsZSk7CitpbnQgZmliX3RhYmxlX2ZsdXNoKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZpYl90YWJsZSAqdGFibGUpOwogc3RydWN0IGZpYl90YWJsZSAqZmliX3RyaWVfdW5tZXJnZShzdHJ1Y3QgZmliX3RhYmxlICptYWluX3RiKTsKLXZvaWQgZmliX3RhYmxlX2ZsdXNoX2V4dGVybmFsKHN0cnVjdCBmaWJfdGFibGUgKnRhYmxlKTsKIHZvaWQgZmliX2ZyZWVfdGFibGUoc3RydWN0IGZpYl90YWJsZSAqdGIpOwogCiAjaWZuZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKQEAgLTMxNCwxMiArMzU1LDExIEBACiB9CiAjZW5kaWYKIGludCBmaWJfdW5tZXJnZShzdHJ1Y3QgbmV0ICpuZXQpOwotdm9pZCBmaWJfZmx1c2hfZXh0ZXJuYWwoc3RydWN0IG5ldCAqbmV0KTsKIAogLyogRXhwb3J0ZWQgYnkgZmliX3NlbWFudGljcy5jICovCiBpbnQgaXBfZmliX2NoZWNrX2RlZmF1bHQoX19iZTMyIGd3LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIGludCBmaWJfc3luY19kb3duX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGV2ZW50LCBib29sIGZvcmNlKTsKLWludCBmaWJfc3luY19kb3duX2FkZHIoc3RydWN0IG5ldCAqbmV0LCBfX2JlMzIgbG9jYWwpOworaW50IGZpYl9zeW5jX2Rvd25fYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMzIgbG9jYWwpOwogaW50IGZpYl9zeW5jX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuaF9mbGFncyk7CiAKIGV4dGVybiB1MzIgZmliX211bHRpcGF0aF9zZWNyZXQgX19yZWFkX21vc3RseTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwX3R1bm5lbHMuaCBiL2luY2x1ZGUvbmV0L2lwX3R1bm5lbHMuaAppbmRleCBhNWU3MDM1Li41OTU1N2MwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcF90dW5uZWxzLmgKKysrIGIvaW5jbHVkZS9uZXQvaXBfdHVubmVscy5oCkBAIC0yMjIsNiArMjIyLDI1IEBACiAJcmV0dXJuIHR1bl9pbmZvLT5tb2RlICYgSVBfVFVOTkVMX0lORk9fSVBWNiA/IEFGX0lORVQ2IDogQUZfSU5FVDsKIH0KIAorc3RhdGljIGlubGluZSBfX2JlNjQga2V5MzJfdG9fdHVubmVsX2lkKF9fYmUzMiBrZXkpCit7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJcmV0dXJuIChfX2ZvcmNlIF9fYmU2NClrZXk7CisjZWxzZQorCXJldHVybiAoX19mb3JjZSBfX2JlNjQpKChfX2ZvcmNlIHU2NClrZXkgPDwgMzIpOworI2VuZGlmCit9CisKKy8qIFJldHVybnMgdGhlIGxlYXN0LXNpZ25pZmljYW50IDMyIGJpdHMgb2YgYSBfX2JlNjQuICovCitzdGF0aWMgaW5saW5lIF9fYmUzMiB0dW5uZWxfaWRfdG9fa2V5MzIoX19iZTY0IHR1bl9pZCkKK3sKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwlyZXR1cm4gKF9fZm9yY2UgX19iZTMyKXR1bl9pZDsKKyNlbHNlCisJcmV0dXJuIChfX2ZvcmNlIF9fYmUzMikoKF9fZm9yY2UgdTY0KXR1bl9pZCA+PiAzMik7CisjZW5kaWYKK30KKwogI2lmZGVmIENPTkZJR19JTkVUCiAKIGludCBpcF90dW5uZWxfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTIzNiw2ICsyNTUsOCBAQAogCiB2b2lkIGlwX3R1bm5lbF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCSAgICBjb25zdCBzdHJ1Y3QgaXBoZHIgKnRubF9wYXJhbXMsIGNvbnN0IHU4IHByb3RvY29sKTsKK3ZvaWQgaXBfbWRfdHVubmVsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJICAgICAgIGNvbnN0IHU4IHByb3RvKTsKIGludCBpcF90dW5uZWxfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwLCBpbnQgY21kKTsKIGludCBfX2lwX3R1bm5lbF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1LCBib29sIHN0cmljdCk7CiBpbnQgaXBfdHVubmVsX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQva2NtLmggYi9pbmNsdWRlL25ldC9rY20uaAppbmRleCAyODQwYjU4Li4yYTg5NjU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9rY20uaAorKysgYi9pbmNsdWRlL25ldC9rY20uaApAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvc3RycGFyc2VyLmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9rY20uaD4KIAogZXh0ZXJuIHVuc2lnbmVkIGludCBrY21fbmV0X2lkOwpAQCAtMjEsMTYgKzIyLDggQEAKICNkZWZpbmUgS0NNX1NUQVRTX0lOQ1Ioc3RhdCkgKChzdGF0KSsrKQogCiBzdHJ1Y3Qga2NtX3Bzb2NrX3N0YXRzIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcnhfbXNnczsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcnhfYnl0ZXM7CiAJdW5zaWduZWQgbG9uZyBsb25nIHR4X21zZ3M7CiAJdW5zaWduZWQgbG9uZyBsb25nIHR4X2J5dGVzOwotCXVuc2lnbmVkIGludCByeF9hYm9ydHM7Ci0JdW5zaWduZWQgaW50IHJ4X21lbV9mYWlsOwotCXVuc2lnbmVkIGludCByeF9uZWVkX21vcmVfaGRyOwotCXVuc2lnbmVkIGludCByeF9tc2dfdG9vX2JpZzsKLQl1bnNpZ25lZCBpbnQgcnhfbXNnX3RpbWVvdXRzOwotCXVuc2lnbmVkIGludCByeF9iYWRfaGRyX2xlbjsKIAl1bnNpZ25lZCBsb25nIGxvbmcgcmVzZXJ2ZWQ7CiAJdW5zaWduZWQgbG9uZyBsb25nIHVucmVzZXJ2ZWQ7CiAJdW5zaWduZWQgaW50IHR4X2Fib3J0czsKQEAgLTY0LDEzICs1Nyw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKmxhc3Rfc2tiOwogfTsKIAotc3RydWN0IGtjbV9yeF9tc2cgewotCWludCBmdWxsX2xlbjsKLQlpbnQgYWNjdW1fbGVuOwotCWludCBvZmZzZXQ7Ci0JaW50IGVhcmx5X2VhdGVuOwotfTsKLQogLyogU29ja2V0IHN0cnVjdHVyZSBmb3IgS0NNIGNsaWVudCBzb2NrZXRzICovCiBzdHJ1Y3Qga2NtX3NvY2sgewogCXN0cnVjdCBzb2NrIHNrOwpAQCAtODcsNiArNzMsNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF93b3JrOwogCXN0cnVjdCBsaXN0X2hlYWQgd2FpdF9wc29ja19saXN0OwogCXN0cnVjdCBza19idWZmICpzZXFfc2tiOworCXUzMiB0eF9zdG9wcGVkIDogMTsKIAogCS8qIERvbid0IHVzZSBiaXQgZmllbGRzIGhlcmUsIHRoZXNlIGFyZSBzZXQgdW5kZXIgZGlmZmVyZW50IGxvY2tzICovCiAJYm9vbCB0eF93YWl0OwpAQCAtMTA0LDExICs5MSwxMSBAQAogLyogU3RydWN0dXJlIGZvciBhbiBhdHRhY2hlZCBsb3dlciBzb2NrZXQgKi8KIHN0cnVjdCBrY21fcHNvY2sgewogCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3Qgc3RycGFyc2VyIHN0cnA7CiAJc3RydWN0IGtjbV9tdXggKm11eDsKIAlpbnQgaW5kZXg7CiAKIAl1MzIgdHhfc3RvcHBlZCA6IDE7Ci0JdTMyIHJ4X3N0b3BwZWQgOiAxOwogCXUzMiBkb25lIDogMTsKIAl1MzIgdW5hdHRhY2hpbmcgOiAxOwogCkBAIC0xMjEsMTggKzEwOCwxMiBAQAogCXN0cnVjdCBrY21fcHNvY2tfc3RhdHMgc3RhdHM7CiAKIAkvKiBSZWNlaXZlICovCi0Jc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYl9oZWFkOwotCXN0cnVjdCBza19idWZmICoqcnhfc2tiX25leHRwOwotCXN0cnVjdCBza19idWZmICpyZWFkeV9yeF9tc2c7CiAJc3RydWN0IGxpc3RfaGVhZCBwc29ja19yZWFkeV9saXN0OwotCXN0cnVjdCB3b3JrX3N0cnVjdCByeF93b3JrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgcnhfZGVsYXllZF93b3JrOwogCXN0cnVjdCBicGZfcHJvZyAqYnBmX3Byb2c7CiAJc3RydWN0IGtjbV9zb2NrICpyeF9rY207CiAJdW5zaWduZWQgbG9uZyBsb25nIHNhdmVkX3J4X2J5dGVzOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBzYXZlZF9yeF9tc2dzOwotCXN0cnVjdCB0aW1lcl9saXN0IHJ4X21zZ190aW1lcjsKLQl1bnNpZ25lZCBpbnQgcnhfbmVlZF9ieXRlczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVhZHlfcnhfbXNnOwogCiAJLyogVHJhbnNtaXQgKi8KIAlzdHJ1Y3Qga2NtX3NvY2sgKnR4X2tjbTsKQEAgLTE0Niw2ICsxMjcsNyBAQAogCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzdHJ1Y3Qga2NtX3Bzb2NrX3N0YXRzIGFnZ3JlZ2F0ZV9wc29ja19zdGF0czsKIAlzdHJ1Y3Qga2NtX211eF9zdGF0cyBhZ2dyZWdhdGVfbXV4X3N0YXRzOworCXN0cnVjdCBzdHJwX2FnZ3Jfc3RhdHMgYWdncmVnYXRlX3N0cnBfc3RhdHM7CiAJc3RydWN0IGxpc3RfaGVhZCBtdXhfbGlzdDsKIAlpbnQgY291bnQ7CiB9OwpAQCAtMTYzLDYgKzE0NSw3IEBACiAKIAlzdHJ1Y3Qga2NtX211eF9zdGF0cyBzdGF0czsKIAlzdHJ1Y3Qga2NtX3Bzb2NrX3N0YXRzIGFnZ3JlZ2F0ZV9wc29ja19zdGF0czsKKwlzdHJ1Y3Qgc3RycF9hZ2dyX3N0YXRzIGFnZ3JlZ2F0ZV9zdHJwX3N0YXRzOwogCiAJLyogUmVjZWl2ZSAqLwogCXNwaW5sb2NrX3QgcnhfbG9jayBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwpAQCAtMTkwLDE0ICsxNzMsNiBAQAogCS8qIFNhdmUgcHNvY2sgc3RhdGlzdGljcyBpbiB0aGUgbXV4IHdoZW4gcHNvY2sgaXMgYmVpbmcgdW5hdHRhY2hlZC4gKi8KIAogI2RlZmluZSBTQVZFX1BTT0NLX1NUQVRTKF9zdGF0KSAoYWdnX3N0YXRzLT5fc3RhdCArPSBzdGF0cy0+X3N0YXQpCi0JU0FWRV9QU09DS19TVEFUUyhyeF9tc2dzKTsKLQlTQVZFX1BTT0NLX1NUQVRTKHJ4X2J5dGVzKTsKLQlTQVZFX1BTT0NLX1NUQVRTKHJ4X2Fib3J0cyk7Ci0JU0FWRV9QU09DS19TVEFUUyhyeF9tZW1fZmFpbCk7Ci0JU0FWRV9QU09DS19TVEFUUyhyeF9uZWVkX21vcmVfaGRyKTsKLQlTQVZFX1BTT0NLX1NUQVRTKHJ4X21zZ190b29fYmlnKTsKLQlTQVZFX1BTT0NLX1NUQVRTKHJ4X21zZ190aW1lb3V0cyk7Ci0JU0FWRV9QU09DS19TVEFUUyhyeF9iYWRfaGRyX2xlbik7CiAJU0FWRV9QU09DS19TVEFUUyh0eF9tc2dzKTsKIAlTQVZFX1BTT0NLX1NUQVRTKHR4X2J5dGVzKTsKIAlTQVZFX1BTT0NLX1NUQVRTKHJlc2VydmVkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2wzbWRldi5oIGIvaW5jbHVkZS9uZXQvbDNtZGV2LmgKaW5kZXggZTkwMDk1MC4uYjIyMGRhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbDNtZGV2LmgKKysrIGIvaW5jbHVkZS9uZXQvbDNtZGV2LmgKQEAgLTExLDYgKzExLDcgQEAKICNpZm5kZWYgX05FVF9MM01ERVZfSF8KICNkZWZpbmUgX05FVF9MM01ERVZfSF8KIAorI2luY2x1ZGUgPG5ldC9kc3QuaD4KICNpbmNsdWRlIDxuZXQvZmliX3J1bGVzLmg+CiAKIC8qKgpAQCAtMTgsMzAgKzE5LDI0IEBACiAgKgogICogQGwzbWRldl9maWJfdGFibGU6IEdldCBGSUIgdGFibGUgaWQgdG8gdXNlIGZvciBsb29rdXBzCiAgKgotICogQGwzbWRldl9nZXRfcnRhYmxlOiBHZXQgY2FjaGVkIElQdjQgcnRhYmxlIChkc3RfZW50cnkpIGZvciBkZXZpY2UKKyAqIEBsM21kZXZfbDNfcmN2OiAgICBIb29rIGluIEwzIHJlY2VpdmUgcGF0aAogICoKLSAqIEBsM21kZXZfZ2V0X3NhZGRyOiBHZXQgc291cmNlIGFkZHJlc3MgZm9yIGEgZmxvdworICogQGwzbWRldl9sM19vdXQ6ICAgIEhvb2sgaW4gTDMgb3V0cHV0IHBhdGgKICAqCi0gKiBAbDNtZGV2X2dldF9ydDZfZHN0OiBHZXQgY2FjaGVkIElQdjYgcnQ2X2luZm8gKGRzdF9lbnRyeSkgZm9yIGRldmljZQorICogQGwzbWRldl9saW5rX3Njb3BlX2xvb2t1cDogSVB2NiBsb29rdXAgZm9yIGxpbmtsb2NhbCBhbmQgbWNhc3QgZGVzdGluYXRpb25zCiAgKi8KIAogc3RydWN0IGwzbWRldl9vcHMgewogCXUzMgkJKCpsM21kZXZfZmliX3RhYmxlKShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqICgqbDNtZGV2X2wzX3Jjdikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgcHJvdG8pOwotCi0JLyogSVB2NCBvcHMgKi8KLQlzdHJ1Y3QgcnRhYmxlICoJKCpsM21kZXZfZ2V0X3J0YWJsZSkoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJICAgICBjb25zdCBzdHJ1Y3QgZmxvd2k0ICpmbDQpOwotCWludAkJKCpsM21kZXZfZ2V0X3NhZGRyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkgICAgc3RydWN0IGZsb3dpNCAqZmw0KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqICgqbDNtZGV2X2wzX291dCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgdTE2IHByb3RvKTsKIAogCS8qIElQdjYgb3BzICovCi0Jc3RydWN0IGRzdF9lbnRyeSAqICgqbDNtZGV2X2dldF9ydDZfZHN0KShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCXN0cnVjdCBkc3RfZW50cnkgKiAoKmwzbWRldl9saW5rX3Njb3BlX2xvb2t1cCkoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCSBzdHJ1Y3QgZmxvd2k2ICpmbDYpOwotCWludAkJICAgKCpsM21kZXZfZ2V0X3NhZGRyNikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCWNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCXN0cnVjdCBmbG93aTYgKmZsNik7CiB9OwogCiAjaWZkZWYgQ09ORklHX05FVF9MM19NQVNURVJfREVWCkBAIC00OSw2ICs0NCw4IEBACiBpbnQgbDNtZGV2X2ZpYl9ydWxlX21hdGNoKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZsb3dpICpmbCwKIAkJCSAgc3RydWN0IGZpYl9sb29rdXBfYXJnICphcmcpOwogCit2b2lkIGwzbWRldl91cGRhdGVfZmxvdyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmbG93aSAqZmwpOworCiBpbnQgbDNtZGV2X21hc3Rlcl9pZmluZGV4X3JjdShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyBpbmxpbmUgaW50IGwzbWRldl9tYXN0ZXJfaWZpbmRleChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtODAsNyArNzcsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lCi1jb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbDNtZGV2X21hc3Rlcl9kZXZfcmN1KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpfZGV2KQorc3RydWN0IG5ldF9kZXZpY2UgKmwzbWRldl9tYXN0ZXJfZGV2X3JjdShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqX2RldikKIHsKIAkvKiBuZXRkZXZfbWFzdGVyX3VwcGVyX2Rldl9nZXRfcmN1IGNhbGxzCiAJICogbGlzdF9maXJzdF9vcl9udWxsX3JjdSB0byB3YWxrIHRoZSB1cHBlciBkZXYgbGlzdC4KQEAgLTg5LDcgKzg2LDcgQEAKIAkgKiB0eXBlY2FzdCB0byByZW1vdmUgdGhlIGNvbnN0CiAJICovCiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKV9kZXY7Ci0JY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyOwogCiAJaWYgKCFkZXYpCiAJCXJldHVybiBOVUxMOwpAQCAtMTA0LDI2ICsxMDEsNiBAQAogCXJldHVybiBtYXN0ZXI7CiB9CiAKLS8qIGdldCBpbmRleCBvZiBhbiBpbnRlcmZhY2UgdG8gdXNlIGZvciBGSUIgbG9va3Vwcy4gRm9yIGRldmljZXMKLSAqIGVuc2xhdmVkIHRvIGFuIEwzIG1hc3RlciBkZXZpY2UgRklCIGxvb2t1cHMgYXJlIGJhc2VkIG9uIHRoZQotICogbWFzdGVyIGluZGV4Ci0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGwzbWRldl9maWJfb2lmX3JjdShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiBsM21kZXZfbWFzdGVyX2lmaW5kZXhfcmN1KGRldikgPyA6IGRldi0+aWZpbmRleDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbDNtZGV2X2ZpYl9vaWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlpbnQgb2lmOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCW9pZiA9IGwzbWRldl9maWJfb2lmX3JjdShkZXYpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIG9pZjsKLX0KLQogdTMyIGwzbWRldl9maWJfdGFibGVfcmN1KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdTMyIGwzbWRldl9maWJfdGFibGVfYnlfaW5kZXgoc3RydWN0IG5ldCAqbmV0LCBpbnQgaWZpbmRleCk7CiBzdGF0aWMgaW5saW5lIHUzMiBsM21kZXZfZmliX3RhYmxlKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMzcsMzkgKzExNCw3IEBACiAJcmV0dXJuIHRiX2lkOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBydGFibGUgKmwzbWRldl9nZXRfcnRhYmxlKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmxvd2k0ICpmbDQpCi17Ci0JaWYgKG5ldGlmX2lzX2wzX21hc3RlcihkZXYpICYmIGRldi0+bDNtZGV2X29wcy0+bDNtZGV2X2dldF9ydGFibGUpCi0JCXJldHVybiBkZXYtPmwzbWRldl9vcHMtPmwzbWRldl9nZXRfcnRhYmxlKGRldiwgZmw0KTsKLQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgbmV0aWZfaW5kZXhfaXNfbDNfbWFzdGVyKHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlib29sIHJjID0gZmFsc2U7Ci0KLQlpZiAoaWZpbmRleCA9PSAwKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0KLQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4X3JjdShuZXQsIGlmaW5kZXgpOwotCWlmIChkZXYpCi0JCXJjID0gbmV0aWZfaXNfbDNfbWFzdGVyKGRldik7Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiByYzsKLX0KLQotaW50IGwzbWRldl9nZXRfc2FkZHIoc3RydWN0IG5ldCAqbmV0LCBpbnQgaWZpbmRleCwgc3RydWN0IGZsb3dpNCAqZmw0KTsKLQotc3RydWN0IGRzdF9lbnRyeSAqbDNtZGV2X2dldF9ydDZfZHN0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZsb3dpNiAqZmw2KTsKLWludCBsM21kZXZfZ2V0X3NhZGRyNihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJICAgICAgc3RydWN0IGZsb3dpNiAqZmw2KTsKK3N0cnVjdCBkc3RfZW50cnkgKmwzbWRldl9saW5rX3Njb3BlX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmbG93aTYgKmZsNik7CiAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBza19idWZmICpsM21kZXZfbDNfcmN2KHN0cnVjdCBza19idWZmICpza2IsIHUxNiBwcm90bykKQEAgLTE5OSw2ICsxNDQsMzQgQEAKIAlyZXR1cm4gbDNtZGV2X2wzX3Jjdihza2IsIEFGX0lORVQ2KTsKIH0KIAorc3RhdGljIGlubGluZQorc3RydWN0IHNrX2J1ZmYgKmwzbWRldl9sM19vdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgcHJvdG8pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYl9kc3Qoc2tiKS0+ZGV2OworCisJaWYgKG5ldGlmX2lzX2wzX3NsYXZlKGRldikpIHsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlcjsKKworCQltYXN0ZXIgPSBuZXRkZXZfbWFzdGVyX3VwcGVyX2Rldl9nZXRfcmN1KGRldik7CisJCWlmIChtYXN0ZXIgJiYgbWFzdGVyLT5sM21kZXZfb3BzLT5sM21kZXZfbDNfb3V0KQorCQkJc2tiID0gbWFzdGVyLT5sM21kZXZfb3BzLT5sM21kZXZfbDNfb3V0KG1hc3Rlciwgc2ssCisJCQkJCQkJCXNrYiwgcHJvdG8pOworCX0KKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBza19idWZmICpsM21kZXZfaXBfb3V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gbDNtZGV2X2wzX291dChzaywgc2tiLCBBRl9JTkVUKTsKK30KKworc3RhdGljIGlubGluZQorc3RydWN0IHNrX2J1ZmYgKmwzbWRldl9pcDZfb3V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gbDNtZGV2X2wzX291dChzaywgc2tiLCBBRl9JTkVUNik7Cit9CiAjZWxzZQogCiBzdGF0aWMgaW5saW5lIGludCBsM21kZXZfbWFzdGVyX2lmaW5kZXhfcmN1KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yMTYsMjAgKzE4OSwxMSBAQAogfQogCiBzdGF0aWMgaW5saW5lCi1jb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbDNtZGV2X21hc3Rlcl9kZXZfcmN1KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdHJ1Y3QgbmV0X2RldmljZSAqbDNtZGV2X21hc3Rlcl9kZXZfcmN1KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGwzbWRldl9maWJfb2lmX3JjdShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiBkZXYgPyBkZXYtPmlmaW5kZXggOiAwOwotfQotc3RhdGljIGlubGluZSBpbnQgbDNtZGV2X2ZpYl9vaWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gZGV2ID8gZGV2LT5pZmluZGV4IDogMDsKLX0KLQogc3RhdGljIGlubGluZSB1MzIgbDNtZGV2X2ZpYl90YWJsZV9yY3UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gMDsKQEAgLTI0MywzNSArMjA3LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJ0YWJsZSAqbDNtZGV2X2dldF9ydGFibGUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBmbG93aTQgKmZsNCkKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBib29sIG5ldGlmX2luZGV4X2lzX2wzX21hc3RlcihzdHJ1Y3QgbmV0ICpuZXQsIGludCBpZmluZGV4KQotewotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbDNtZGV2X2dldF9zYWRkcihzdHJ1Y3QgbmV0ICpuZXQsIGludCBpZmluZGV4LAotCQkJCSAgIHN0cnVjdCBmbG93aTQgKmZsNCkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGluZQotc3RydWN0IGRzdF9lbnRyeSAqbDNtZGV2X2dldF9ydDZfZHN0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZsb3dpNiAqZmw2KQorc3RydWN0IGRzdF9lbnRyeSAqbDNtZGV2X2xpbmtfc2NvcGVfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZsb3dpNiAqZmw2KQogewogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBsM21kZXZfZ2V0X3NhZGRyNihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkgICAgc3RydWN0IGZsb3dpNiAqZmw2KQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3Qgc2tfYnVmZiAqbDNtZGV2X2lwX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMjg1LDExICsyMjYsMjcgQEAKIH0KIAogc3RhdGljIGlubGluZQorc3RydWN0IHNrX2J1ZmYgKmwzbWRldl9pcF9vdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBza19idWZmICpsM21kZXZfaXA2X291dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGlubGluZQogaW50IGwzbWRldl9maWJfcnVsZV9tYXRjaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmbG93aSAqZmwsCiAJCQkgIHN0cnVjdCBmaWJfbG9va3VwX2FyZyAqYXJnKQogewogCXJldHVybiAxOwogfQorc3RhdGljIGlubGluZQordm9pZCBsM21kZXZfdXBkYXRlX2Zsb3coc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZmxvd2kgKmZsKQoreworfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfTkVUX0wzTURFVl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbHd0dW5uZWwuaCBiL2luY2x1ZGUvbmV0L2x3dHVubmVsLmgKaW5kZXggZTlmMTE2ZS4uZWEzZjgwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbHd0dW5uZWwuaAorKysgYi9pbmNsdWRlL25ldC9sd3R1bm5lbC5oCkBAIC0xMyw2ICsxMywxMyBAQAogLyogbHcgdHVubmVsIHN0YXRlIGZsYWdzICovCiAjZGVmaW5lIExXVFVOTkVMX1NUQVRFX09VVFBVVF9SRURJUkVDVAlCSVQoMCkKICNkZWZpbmUgTFdUVU5ORUxfU1RBVEVfSU5QVVRfUkVESVJFQ1QJQklUKDEpCisjZGVmaW5lIExXVFVOTkVMX1NUQVRFX1hNSVRfUkVESVJFQ1QJQklUKDIpCisKK2VudW0geworCUxXVFVOTkVMX1hNSVRfRE9ORSwKKwlMV1RVTk5FTF9YTUlUX0NPTlRJTlVFLAorfTsKKwogCiBzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgewogCV9fdTE2CQl0eXBlOwpAQCAtMjEsNiArMjgsNyBAQAogCWludAkJKCpvcmlnX291dHB1dCkoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogCWludAkJKCpvcmlnX2lucHV0KShzdHJ1Y3Qgc2tfYnVmZiAqKTsKIAlpbnQgICAgICAgICAgICAgbGVuOworCV9fdTE2CQloZWFkcm9vbTsKIAlfX3U4ICAgICAgICAgICAgZGF0YVswXTsKIH07CiAKQEAgLTM0LDYgKzQyLDcgQEAKIAkJCSAgc3RydWN0IGx3dHVubmVsX3N0YXRlICpsd3RzdGF0ZSk7CiAJaW50ICgqZ2V0X2VuY2FwX3NpemUpKHN0cnVjdCBsd3R1bm5lbF9zdGF0ZSAqbHd0c3RhdGUpOwogCWludCAoKmNtcF9lbmNhcCkoc3RydWN0IGx3dHVubmVsX3N0YXRlICphLCBzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmIpOworCWludCAoKnhtaXQpKHN0cnVjdCBza19idWZmICpza2IpOwogfTsKIAogI2lmZGVmIENPTkZJR19MV1RVTk5FTApAQCAtNzUsNiArODQsMjQgQEAKIAogCXJldHVybiBmYWxzZTsKIH0KKworc3RhdGljIGlubGluZSBib29sIGx3dHVubmVsX3htaXRfcmVkaXJlY3Qoc3RydWN0IGx3dHVubmVsX3N0YXRlICpsd3RzdGF0ZSkKK3sKKwlpZiAobHd0c3RhdGUgJiYgKGx3dHN0YXRlLT5mbGFncyAmIExXVFVOTkVMX1NUQVRFX1hNSVRfUkVESVJFQ1QpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbHd0dW5uZWxfaGVhZHJvb20oc3RydWN0IGx3dHVubmVsX3N0YXRlICpsd3RzdGF0ZSwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgbXR1KQoreworCWlmIChsd3R1bm5lbF94bWl0X3JlZGlyZWN0KGx3dHN0YXRlKSAmJiBsd3RzdGF0ZS0+aGVhZHJvb20gPCBtdHUpCisJCXJldHVybiBsd3RzdGF0ZS0+aGVhZHJvb207CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGx3dHVubmVsX2VuY2FwX2FkZF9vcHMoY29uc3Qgc3RydWN0IGx3dHVubmVsX2VuY2FwX29wcyAqb3AsCiAJCQkgICB1bnNpZ25lZCBpbnQgbnVtKTsKIGludCBsd3R1bm5lbF9lbmNhcF9kZWxfb3BzKGNvbnN0IHN0cnVjdCBsd3R1bm5lbF9lbmNhcF9vcHMgKm9wLApAQCAtOTAsNiArMTE3LDcgQEAKIGludCBsd3R1bm5lbF9jbXBfZW5jYXAoc3RydWN0IGx3dHVubmVsX3N0YXRlICphLCBzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmIpOwogaW50IGx3dHVubmVsX291dHB1dChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgbHd0dW5uZWxfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgbHd0dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogI2Vsc2UKIApAQCAtMTE3LDYgKzE0NSwxNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGx3dHVubmVsX3htaXRfcmVkaXJlY3Qoc3RydWN0IGx3dHVubmVsX3N0YXRlICpsd3RzdGF0ZSkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGx3dHVubmVsX2hlYWRyb29tKHN0cnVjdCBsd3R1bm5lbF9zdGF0ZSAqbHd0c3RhdGUsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG10dSkKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgbHd0dW5uZWxfZW5jYXBfYWRkX29wcyhjb25zdCBzdHJ1Y3QgbHd0dW5uZWxfZW5jYXBfb3BzICpvcCwKIAkJCQkJIHVuc2lnbmVkIGludCBudW0pCiB7CkBAIC0xNzAsNiArMjA5LDExIEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCitzdGF0aWMgaW5saW5lIGludCBsd3R1bm5lbF94bWl0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCiAjZW5kaWYgLyogQ09ORklHX0xXVFVOTkVMICovCiAKICNkZWZpbmUgTU9EVUxFX0FMSUFTX1JUTkxfTFdUKGVuY2FwX3R5cGUpIE1PRFVMRV9BTElBUygicnRubC1sd3QtIiBfX3N0cmluZ2lmeShlbmNhcF90eXBlKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L21hYzgwMjExLmggYi9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCmluZGV4IGNjYTUxMGEuLmE4MTBkZmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKKysrIGIvaW5jbHVkZS9uZXQvbWFjODAyMTEuaApAQCAtNzE1LDYgKzcxNSw3IEBACiAgKglmcmFtZSAoUFMtUG9sbCBvciB1QVBTRCkuCiAgKiBASUVFRTgwMjExX1RYX0NUUkxfUkFURV9JTkpFQ1Q6IFRoaXMgZnJhbWUgaXMgaW5qZWN0ZWQgd2l0aCByYXRlIGluZm9ybWF0aW9uCiAgKiBASUVFRTgwMjExX1RYX0NUUkxfQU1TRFU6IFRoaXMgZnJhbWUgaXMgYW4gQS1NU0RVIGZyYW1lCisgKiBASUVFRTgwMjExX1RYX0NUUkxfRkFTVF9YTUlUOiBUaGlzIGZyYW1lIGlzIGdvaW5nIHRocm91Z2ggdGhlIGZhc3RfeG1pdCBwYXRoCiAgKgogICogVGhlc2UgZmxhZ3MgYXJlIHVzZWQgaW4gdHhfaW5mby0+Y29udHJvbC5mbGFncy4KICAqLwpAQCAtNzIzLDYgKzcyNCw3IEBACiAJSUVFRTgwMjExX1RYX0NUUkxfUFNfUkVTUE9OU0UJCT0gQklUKDEpLAogCUlFRUU4MDIxMV9UWF9DVFJMX1JBVEVfSU5KRUNUCQk9IEJJVCgyKSwKIAlJRUVFODAyMTFfVFhfQ1RSTF9BTVNEVQkJCT0gQklUKDMpLAorCUlFRUU4MDIxMV9UWF9DVFJMX0ZBU1RfWE1JVAkJPSBCSVQoNCksCiB9OwogCiAvKgpAQCAtMTczNSw2ICsxNzM3LDkgQEAKICAqIEBzdXBwX3JhdGVzOiBCaXRtYXAgb2Ygc3VwcG9ydGVkIHJhdGVzIChwZXIgYmFuZCkKICAqIEBodF9jYXA6IEhUIGNhcGFiaWxpdGllcyBvZiB0aGlzIFNUQTsgcmVzdHJpY3RlZCB0byBvdXIgb3duIGNhcGFiaWxpdGllcwogICogQHZodF9jYXA6IFZIVCBjYXBhYmlsaXRpZXMgb2YgdGhpcyBTVEE7IHJlc3RyaWN0ZWQgdG8gb3VyIG93biBjYXBhYmlsaXRpZXMKKyAqIEBtYXhfcnhfYWdncmVnYXRpb25fc3ViZnJhbWVzOiBtYXhpbWFsIGFtb3VudCBvZiBmcmFtZXMgaW4gYSBzaW5nbGUgQU1QRFUKKyAqCXRoYXQgdGhpcyBzdGF0aW9uIGlzIGFsbG93ZWQgdG8gdHJhbnNtaXQgdG8gdXMuCisgKglDYW4gYmUgbW9kaWZpZWQgYnkgZHJpdmVyLgogICogQHdtZTogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIFNUQSBzdXBwb3J0cyBRb1MvV01FIChpZiBsb2NhbCBkZXZpY2VzIGRvZXMsCiAgKglvdGhlcndpc2UgYWx3YXlzIGZhbHNlKQogICogQGRydl9wcml2OiBkYXRhIGFyZWEgZm9yIGRyaXZlciB1c2UsIHdpbGwgYWx3YXlzIGJlIGFsaWduZWQgdG8KQEAgLTE3NzUsNiArMTc4MCw3IEBACiAJdTE2IGFpZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgaHRfY2FwOwogCXN0cnVjdCBpZWVlODAyMTFfc3RhX3ZodF9jYXAgdmh0X2NhcDsKKwl1OCBtYXhfcnhfYWdncmVnYXRpb25fc3ViZnJhbWVzOwogCWJvb2wgd21lOwogCXU4IHVhcHNkX3F1ZXVlczsKIAl1OCBtYXhfc3A7CkBAIC0yMDE0LDYgKzIwMjAsMTEgQEAKICAqIEBJRUVFODAyMTFfSFdfVFhfRlJBR19MSVNUOiBIYXJkd2FyZSAob3IgZHJpdmVyKSBzdXBwb3J0cyBzZW5kaW5nIGZyYWdfbGlzdAogICoJc2ticywgbmVlZGVkIGZvciB6ZXJvLWNvcHkgc29mdHdhcmUgQS1NU0RVLgogICoKKyAqIEBJRUVFODAyMTFfSFdfUkVQT1JUU19MT1dfQUNLOiBUaGUgZHJpdmVyIChvciBmaXJtd2FyZSkgcmVwb3J0cyBsb3cgYWNrIGV2ZW50CisgKglieSBpZWVlODAyMTFfcmVwb3J0X2xvd19hY2soKSBiYXNlZCBvbiBpdHMgb3duIGFsZ29yaXRobS4gRm9yIHN1Y2gKKyAqCWRyaXZlcnMsIG1hYzgwMjExIHBhY2tldCBsb3NzIG1lY2hhbmlzbSB3aWxsIG5vdCBiZSB0cmlnZ2VyZWQgYW5kIGRyaXZlcgorICoJaXMgY29tcGxldGVseSBkZXBlbmRpbmcgb24gZmlybXdhcmUgZXZlbnQgZm9yIHN0YXRpb24ga2lja291dC4KKyAqCiAgKiBATlVNX0lFRUU4MDIxMV9IV19GTEFHUzogbnVtYmVyIG9mIGhhcmR3YXJlIGZsYWdzLCB1c2VkIGZvciBzaXppbmcgYXJyYXlzCiAgKi8KIGVudW0gaWVlZTgwMjExX2h3X2ZsYWdzIHsKQEAgLTIwNTQsNiArMjA2NSw3IEBACiAJSUVFRTgwMjExX0hXX1VTRVNfUlNTLAogCUlFRUU4MDIxMV9IV19UWF9BTVNEVSwKIAlJRUVFODAyMTFfSFdfVFhfRlJBR19MSVNULAorCUlFRUU4MDIxMV9IV19SRVBPUlRTX0xPV19BQ0ssCiAKIAkvKiBrZWVwIGxhc3QsIG9idmlvdXNseSAqLwogCU5VTV9JRUVFODAyMTFfSFdfRkxBR1MKQEAgLTIxNDEsNiArMjE1MywxNCBAQAogICoJdGhlIGRlZmF1bHQgaXMgX0dJIHwgX0JBTkRXSURUSC4KICAqCVVzZSB0aGUgJUlFRUU4MDIxMV9SQURJT1RBUF9WSFRfS05PV05fKiB2YWx1ZXMuCiAgKgorICogQHJhZGlvdGFwX3RpbWVzdGFtcDogSW5mb3JtYXRpb24gZm9yIHRoZSByYWRpb3RhcCB0aW1lc3RhbXAgZmllbGQ7IGlmIHRoZQorICoJJ3VuaXRzX3BvcycgbWVtYmVyIGlzIHNldCB0byBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSBpdCBtdXN0IGJlIHNldCB0bworICoJYSBjb21iaW5hdGlvbiBvZiBhIElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfVU5JVF8qIGFuZCBhCisgKglJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QX1NQT1NfKiB2YWx1ZSwgYW5kIHRoZW4gdGhlIHRpbWVzdGFtcAorICoJZmllbGQgd2lsbCBiZSBhZGRlZCBhbmQgcG9wdWxhdGVkIGZyb20gdGhlICZzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cworICoJZGV2aWNlX3RpbWVzdGFtcC4gSWYgdGhlICdhY2N1cmFjeScgbWVtYmVyIGlzIG5vbi1uZWdhdGl2ZSwgaXQncyBwdXQKKyAqCWludG8gdGhlIGFjY3VyYWN5IHJhZGlvdGFwIGZpZWxkIGFuZCB0aGUgYWNjdXJhY3kga25vd24gZmxhZyBpcyBzZXQuCisgKgogICogQG5ldGRldl9mZWF0dXJlczogbmV0ZGV2IGZlYXR1cmVzIHRvIGJlIHNldCBpbiBlYWNoIG5ldGRldiBjcmVhdGVkCiAgKglmcm9tIHRoaXMgSFcuIE5vdGUgdGhhdCBub3QgYWxsIGZlYXR1cmVzIGFyZSB1c2FibGUgd2l0aCBtYWM4MDIxMSwKICAqCW90aGVyIGZlYXR1cmVzIHdpbGwgYmUgcmVqZWN0ZWQgZHVyaW5nIEhXIHJlZ2lzdHJhdGlvbi4KQEAgLTIxNTksNiArMjE3OSw4IEBACiAgKiBAbl9jaXBoZXJfc2NoZW1lczogYSBzaXplIG9mIGFuIGFycmF5IG9mIGNpcGhlciBzY2hlbWVzIGRlZmluaXRpb25zLgogICogQGNpcGhlcl9zY2hlbWVzOiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgY2lwaGVyIHNjaGVtZSBkZWZpbml0aW9ucwogICoJc3VwcG9ydGVkIGJ5IEhXLgorICogQG1heF9uYW5fZGVfZW50cmllczogbWF4aW11bSBudW1iZXIgb2YgTkFOIERFIGZ1bmN0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlCisgKglkZXZpY2UuCiAgKi8KIHN0cnVjdCBpZWVlODAyMTFfaHcgewogCXN0cnVjdCBpZWVlODAyMTFfY29uZiBjb25mOwpAQCAtMjE4NCwxMSArMjIwNiwxNiBAQAogCXU4IG9mZmNoYW5uZWxfdHhfaHdfcXVldWU7CiAJdTggcmFkaW90YXBfbWNzX2RldGFpbHM7CiAJdTE2IHJhZGlvdGFwX3ZodF9kZXRhaWxzOworCXN0cnVjdCB7CisJCWludCB1bml0c19wb3M7CisJCXMxNiBhY2N1cmFjeTsKKwl9IHJhZGlvdGFwX3RpbWVzdGFtcDsKIAluZXRkZXZfZmVhdHVyZXNfdCBuZXRkZXZfZmVhdHVyZXM7CiAJdTggdWFwc2RfcXVldWVzOwogCXU4IHVhcHNkX21heF9zcF9sZW47CiAJdTggbl9jaXBoZXJfc2NoZW1lczsKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2NpcGhlcl9zY2hlbWUgKmNpcGhlcl9zY2hlbWVzOworCXU4IG1heF9uYW5fZGVfZW50cmllczsKIH07CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBfaWVlZTgwMjExX2h3X2NoZWNrKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMzA4NSwxMSArMzExMiw4IEBACiAgKgogICogQHN0YV9hZGRfZGVidWdmczogRHJpdmVycyBjYW4gdXNlIHRoaXMgY2FsbGJhY2sgdG8gYWRkIGRlYnVnZnMgZmlsZXMKICAqCXdoZW4gYSBzdGF0aW9uIGlzIGFkZGVkIHRvIG1hYzgwMjExJ3Mgc3RhdGlvbiBsaXN0LiBUaGlzIGNhbGxiYWNrCi0gKglhbmQgQHN0YV9yZW1vdmVfZGVidWdmcyBzaG91bGQgYmUgd2l0aGluIGEgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKLSAqCWNvbmRpdGlvbmFsLiBUaGlzIGNhbGxiYWNrIGNhbiBzbGVlcC4KLSAqCi0gKiBAc3RhX3JlbW92ZV9kZWJ1Z2ZzOiBSZW1vdmUgdGhlIGRlYnVnZnMgZmlsZXMgd2hpY2ggd2VyZSBhZGRlZCB1c2luZwotICoJQHN0YV9hZGRfZGVidWdmcy4gVGhpcyBjYWxsYmFjayBjYW4gc2xlZXAuCisgKglzaG91bGQgYmUgd2l0aGluIGEgQ09ORklHX01BQzgwMjExX0RFQlVHRlMgY29uZGl0aW9uYWwuIFRoaXMKKyAqCWNhbGxiYWNrIGNhbiBzbGVlcC4KICAqCiAgKiBAc3RhX25vdGlmeTogTm90aWZpZXMgbG93IGxldmVsIGRyaXZlciBhYm91dCBwb3dlciBzdGF0ZSB0cmFuc2l0aW9uIG9mIGFuCiAgKglhc3NvY2lhdGVkIHN0YXRpb24sIEFQLCAgSUJTUy9XRFMvbWVzaCBwZWVyIGV0Yy4gRm9yIGEgVklGIG9wZXJhdGluZwpAQCAtMzE0Nyw2ICszMTcxLDEyIEBACiAgKglyZXF1aXJlZCBmdW5jdGlvbi4KICAqCVRoZSBjYWxsYmFjayBjYW4gc2xlZXAuCiAgKgorICogQG9mZnNldF90c2Y6IE9mZnNldCB0aGUgVFNGIHRpbWVyIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlCisgKglmaXJtd2FyZS9oYXJkd2FyZS4gIFByZWZlcnJlZCB0byBzZXRfdHNmIGFzIGl0IGF2b2lkcyBkZWxheSBiZXR3ZWVuCisgKgljYWxsaW5nIHNldF90c2YoKSBhbmQgaGFyZHdhcmUgZ2V0dGluZyBwcm9ncmFtbWVkLCB3aGljaCB3aWxsIHNob3cgdXAKKyAqCWFzIFRTRiBkZWxheS4gSXMgbm90IGEgcmVxdWlyZWQgZnVuY3Rpb24uCisgKglUaGUgY2FsbGJhY2sgY2FuIHNsZWVwLgorICoKICAqIEByZXNldF90c2Y6IFJlc2V0IHRoZSBUU0YgdGltZXIgYW5kIGFsbG93IGZpcm13YXJlL2hhcmR3YXJlIHRvIHN5bmNocm9uaXplCiAgKgl3aXRoIG90aGVyIFNUQXMgaW4gdGhlIElCU1MuIFRoaXMgaXMgb25seSB1c2VkIGluIElCU1MgbW9kZS4gVGhpcwogICoJZnVuY3Rpb24gaXMgb3B0aW9uYWwgaWYgdGhlIGZpcm13YXJlL2hhcmR3YXJlIHRha2VzIGZ1bGwgY2FyZSBvZgpAQCAtMzQwMSw2ICszNDMxLDIxIEBACiAgKglzeW5jaHJvbml6YXRpb24gd2hpY2ggaXMgbmVlZGVkIGluIGNhc2UgZHJpdmVyIGhhcyBpbiBpdHMgUlNTIHF1ZXVlcwogICoJcGVuZGluZyBmcmFtZXMgdGhhdCB3ZXJlIHJlY2VpdmVkIHByaW9yIHRvIHRoZSBjb250cm9sIHBhdGggYWN0aW9uCiAgKgljdXJyZW50bHkgdGFrZW4gKGUuZy4gZGlzYXNzb2NpYXRpb24pIGJ1dCBhcmUgbm90IHByb2Nlc3NlZCB5ZXQuCisgKgorICogQHN0YXJ0X25hbjogam9pbiBhbiBleGlzdGluZyBOQU4gY2x1c3Rlciwgb3IgY3JlYXRlIGEgbmV3IG9uZS4KKyAqIEBzdG9wX25hbjogbGVhdmUgdGhlIE5BTiBjbHVzdGVyLgorICogQG5hbl9jaGFuZ2VfY29uZjogY2hhbmdlIE5BTiBjb25maWd1cmF0aW9uLiBUaGUgZGF0YSBpbiBjZmc4MDIxMV9uYW5fY29uZgorICoJY29udGFpbnMgZnVsbCBuZXcgY29uZmlndXJhdGlvbiBhbmQgY2hhbmdlcyBzcGVjaWZ5IHdoaWNoIHBhcmFtZXRlcnMKKyAqCWFyZSBjaGFuZ2VkIHdpdGggcmVzcGVjdCB0byB0aGUgbGFzdCBOQU4gY29uZmlnLgorICoJVGhlIGRyaXZlciBnZXRzIGJvdGggZnVsbCBjb25maWd1cmF0aW9uIGFuZCB0aGUgY2hhbmdlZCBwYXJhbWV0ZXJzIHNpbmNlCisgKglzb21lIGRldmljZXMgbWF5IG5lZWQgdGhlIGZ1bGwgY29uZmlndXJhdGlvbiB3aGlsZSBvdGhlcnMgbmVlZCBvbmx5IHRoZQorICoJY2hhbmdlZCBwYXJhbWV0ZXJzLgorICogQGFkZF9uYW5fZnVuYzogQWRkIGEgTkFOIGZ1bmN0aW9uLiBSZXR1cm5zIDAgb24gc3VjY2Vzcy4gVGhlIGRhdGEgaW4KKyAqCWNmZzgwMjExX25hbl9mdW5jIG11c3Qgbm90IGJlIHJlZmVyZW5jZWQgb3V0c2lkZSB0aGUgc2NvcGUgb2YKKyAqCXRoaXMgY2FsbC4KKyAqIEBkZWxfbmFuX2Z1bmM6IFJlbW92ZSBhIE5BTiBmdW5jdGlvbi4gVGhlIGRyaXZlciBtdXN0IGNhbGwKKyAqCWllZWU4MDIxMV9uYW5fZnVuY190ZXJtaW5hdGVkKCkgd2l0aAorICoJTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl9VU0VSX1JFUVVFU1QgcmVhc29uIGNvZGUgdXBvbiByZW1vdmFsLgogICovCiBzdHJ1Y3QgaWVlZTgwMjExX29wcyB7CiAJdm9pZCAoKnR4KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKQEAgLTM0ODUsMTAgKzM1MzAsNiBAQAogCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKIAkJCQlzdHJ1Y3QgZGVudHJ5ICpkaXIpOwotCXZvaWQgKCpzdGFfcmVtb3ZlX2RlYnVnZnMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQkgICBzdHJ1Y3QgZGVudHJ5ICpkaXIpOwogI2VuZGlmCiAJdm9pZCAoKnN0YV9ub3RpZnkpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJZW51bSBzdGFfbm90aWZ5X2NtZCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CkBAIC0zNTE2LDYgKzM1NTcsOCBAQAogCXU2NCAoKmdldF90c2YpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKIAl2b2lkICgqc2V0X3RzZikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQl1NjQgdHNmKTsKKwl2b2lkICgqb2Zmc2V0X3RzZikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICBzNjQgb2Zmc2V0KTsKIAl2b2lkICgqcmVzZXRfdHNmKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CiAJaW50ICgqdHhfbGFzdF9iZWFjb24pKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIAlpbnQgKCphbXBkdV9hY3Rpb24pKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMzY0MCw2ICszNjgzLDIxIEBACiAJdm9pZCAoKndha2VfdHhfcXVldWUpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSk7CiAJdm9pZCAoKnN5bmNfcnhfcXVldWVzKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisKKwlpbnQgKCpzdGFydF9uYW4pKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mKTsKKwlpbnQgKCpzdG9wX25hbikoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKKwlpbnQgKCpuYW5fY2hhbmdlX2NvbmYpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICAgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mLCB1MzIgY2hhbmdlcyk7CisJaW50ICgqYWRkX25hbl9mdW5jKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqbmFuX2Z1bmMpOworCXZvaWQgKCpkZWxfbmFuX2Z1bmMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgdTggaW5zdGFuY2VfaWQpOwogfTsKIAogLyoqCkBAIC01NzEzLDQgKzU3NzEsMzYgQEAKIHZvaWQgaWVlZTgwMjExX3R4cV9nZXRfZGVwdGgoc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyAqZnJhbWVfY250LAogCQkJICAgICB1bnNpZ25lZCBsb25nICpieXRlX2NudCk7CisKKy8qKgorICogaWVlZTgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQgLSBub3RpZnkgYWJvdXQgTkFOIGZ1bmN0aW9uIHRlcm1pbmF0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBub3RpZnkgbWFjODAyMTEgYWJvdXQgTkFOIGZ1bmN0aW9uIHRlcm1pbmF0aW9uLgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgY2FsbGVkIGZyb20gaGFyZCBpcnEuCisgKgorICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KKyAqIEBpbnN0X2lkOiB0aGUgbG9jYWwgaW5zdGFuY2UgaWQKKyAqIEByZWFzb246IHRlcm1pbmF0aW9uIHJlYXNvbiAob25lIG9mIHRoZSBOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OXyopCisgKiBAZ2ZwOiBhbGxvY2F0aW9uIGZsYWdzCisgKi8KK3ZvaWQgaWVlZTgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICB1OCBpbnN0X2lkLAorCQkJCSAgIGVudW0gbmw4MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbiByZWFzb24sCisJCQkJICAgZ2ZwX3QgZ2ZwKTsKKworLyoqCisgKiBpZWVlODAyMTFfbmFuX2Z1bmNfbWF0Y2ggLSBub3RpZnkgYWJvdXQgTkFOIGZ1bmN0aW9uIG1hdGNoIGV2ZW50LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBub3RpZnkgbWFjODAyMTEgYWJvdXQgTkFOIGZ1bmN0aW9uIG1hdGNoLiBUaGUKKyAqIGNvb2tpZSBpbnNpZGUgdGhlIG1hdGNoIHN0cnVjdCB3aWxsIGJlIGFzc2lnbmVkIGJ5IG1hYzgwMjExLgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgY2FsbGVkIGZyb20gaGFyZCBpcnEuCisgKgorICogQHZpZjogJnN0cnVjdCBpZWVlODAyMTFfdmlmIHBvaW50ZXIgZnJvbSB0aGUgYWRkX2ludGVyZmFjZSBjYWxsYmFjay4KKyAqIEBtYXRjaDogbWF0Y2ggZXZlbnQgaW5mb3JtYXRpb24KKyAqIEBnZnA6IGFsbG9jYXRpb24gZmxhZ3MKKyAqLwordm9pZCBpZWVlODAyMTFfbmFuX2Z1bmNfbWF0Y2goc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fbWF0Y2hfcGFyYW1zICptYXRjaCwKKwkJCSAgICAgIGdmcF90IGdmcCk7CisKICNlbmRpZiAvKiBNQUM4MDIxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9tcGxzLmggYi9pbmNsdWRlL25ldC9tcGxzLmgKaW5kZXggNWIzYjVhZC4uMWRiYzY2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbXBscy5oCisrKyBiL2luY2x1ZGUvbmV0L21wbHMuaApAQCAtMTksMjEgKzE5LDE4IEBACiAKICNkZWZpbmUgTVBMU19ITEVOIDQKIAorc3RydWN0IG1wbHNfc2hpbV9oZHIgeworCV9fYmUzMiBsYWJlbF9zdGFja19lbnRyeTsKK307CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBldGhfcF9tcGxzKF9fYmUxNiBldGhfdHlwZSkKIHsKIAlyZXR1cm4gZXRoX3R5cGUgPT0gaHRvbnMoRVRIX1BfTVBMU19VQykgfHwKIAkJZXRoX3R5cGUgPT0gaHRvbnMoRVRIX1BfTVBMU19NQyk7CiB9CiAKLS8qCi0gKiBGb3Igbm9uLU1QTFMgc2ticyB0aGlzIHdpbGwgY29ycmVzcG9uZCB0byB0aGUgbmV0d29yayBoZWFkZXIuCi0gKiBGb3IgTVBMUyBza2JzIGl0IHdpbGwgYmUgYmVmb3JlIHRoZSBuZXR3b3JrX2hlYWRlciBhcyB0aGUgTVBMUwotICogbGFiZWwgc3RhY2sgbGllcyBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIG1hYyBoZWFkZXIgYW5kIHRoZSBuZXR3b3JrCi0gKiBoZWFkZXIuIFRoYXQgaXMsIGZvciBNUExTIHNrYnMgdGhlIGVuZCBvZiB0aGUgbWFjIGhlYWRlcgotICogaXMgdGhlIHRvcCBvZiB0aGUgTVBMUyBsYWJlbCBzdGFjay4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICpza2JfbXBsc19oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1wbHNfc2hpbV9oZHIgKm1wbHNfaGRyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNrYl9tYWNfaGVhZGVyKHNrYikgKyBza2ItPm1hY19sZW47CisJcmV0dXJuIChzdHJ1Y3QgbXBsc19zaGltX2hkciAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uY3NpLmggYi9pbmNsdWRlL25ldC9uY3NpLmgKaW5kZXggMWRiZjQyZi4uNjg2ODBiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmNzaS5oCisrKyBiL2luY2x1ZGUvbmV0L25jc2kuaApAQCAtMzEsNiArMzEsNyBAQAogc3RydWN0IG5jc2lfZGV2ICpuY3NpX3JlZ2lzdGVyX2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHZvaWQgKCpub3RpZmllcikoc3RydWN0IG5jc2lfZGV2ICpuZCkpOwogaW50IG5jc2lfc3RhcnRfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpOwordm9pZCBuY3NpX3N0b3BfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpOwogdm9pZCBuY3NpX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpOwogI2Vsc2UgLyogIUNPTkZJR19ORVRfTkNTSSAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmNzaV9kZXYgKm5jc2lfcmVnaXN0ZXJfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC00NCw2ICs0NSwxMCBAQAogCXJldHVybiAtRU5PVFRZOwogfQogCitzdGF0aWMgdm9pZCBuY3NpX3N0b3BfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBuY3NpX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBuY3NpX2RldiAqbmQpCiB7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmggYi9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmgKaW5kZXggMDkzM2M3NC4uZmM0Zjc1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0X25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaApAQCAtNjAsNiArNjAsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJZXhpdF9saXN0OwkvKiBVc2Ugb25seSBuZXRfbXV0ZXggKi8KIAogCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAgICp1c2VyX25zOwkvKiBPd25pbmcgdXNlciBuYW1lc3BhY2UgKi8KKwlzdHJ1Y3QgdWNvdW50cwkJKnVjb3VudHM7CiAJc3BpbmxvY2tfdAkJbnNpZF9sb2NrOwogCXN0cnVjdCBpZHIJCW5ldG5zX2lkczsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2JyX25ldGZpbHRlci5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2JyX25ldGZpbHRlci5oCmluZGV4IGU4ZDE0NDguLjBiMGMzNWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9icl9uZXRmaWx0ZXIuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvYnJfbmV0ZmlsdGVyLmgKQEAgLTE1LDYgKzE1LDEyIEBACiAKIHZvaWQgbmZfYnJpZGdlX3VwZGF0ZV9wcm90b2NvbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAoraW50IGJyX25mX2hvb2tfdGhyZXNoKHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrICpzaywKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LAorCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAorCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3QgbmV0ICosIHN0cnVjdCBzb2NrICosCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqKSk7CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5mX2JyaWRnZV9pbmZvICoKIG5mX2JyaWRnZV9pbmZvX2dldChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCmluZGV4IDQ0NWIwMTkuLjUwNDE4MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKQEAgLTQyLDcgKzQyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+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+dHByb3QgPSBwcm90b2hkcjsKIAlwa3QtPnh0LnRob2ZmID0gdGhvZmY7CiAJcGt0LT54dC5mcmFnb2ZmID0gZnJhZ19vZmY7CiAKIAlyZXR1cm4gMDsKKyNlbHNlCisJcmV0dXJuIC0xOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbmZ0X3NldF9wa3RpbmZvX2lwdjZfdmFsaWRhdGUoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQoreworCW5mdF9zZXRfcGt0aW5mbyhwa3QsIHNrYiwgc3RhdGUpOworCWlmIChfX25mdF9zZXRfcGt0aW5mb19pcHY2X3ZhbGlkYXRlKHBrdCwgc2tiLCBzdGF0ZSkgPCAwKQorCQluZnRfc2V0X3BrdGluZm9fcHJvdG9fdW5zcGVjKHBrdCwgc2tiKTsKIH0KIAogZXh0ZXJuIHN0cnVjdCBuZnRfYWZfaW5mbyBuZnRfYWZfaXB2NjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmgKaW5kZXggZDI3NTg4Yy4uMTEzOWNkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmgKQEAgLTM2LDQgKzM2LDggQEAKIHZvaWQgbmZ0X21ldGFfc2V0X2Rlc3Ryb3koY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKIAkJCSAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKTsKIAoraW50IG5mdF9tZXRhX3NldF92YWxpZGF0ZShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgIGNvbnN0IHN0cnVjdCBuZnRfZGF0YSAqKmRhdGEpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdC5oCmluZGV4IDYwZmExNTMuLjAyZTI4YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuaApAQCAtOCw2ICs4LDEwIEBACiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfcmVqZWN0X3BvbGljeVtdOwogCitpbnQgbmZ0X3JlamVjdF92YWxpZGF0ZShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJY29uc3Qgc3RydWN0IG5mdF9kYXRhICoqZGF0YSk7CisKIGludCBuZnRfcmVqZWN0X2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKIAkJICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKIAkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldG5zL2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKaW5kZXggMzhiMWE4MC4uZTQ2OWU4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKQEAgLTE1LDEwICsxNSw2IEBACiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpjdGxfdGFibGVfaGVhZGVyOwogCXN0cnVjdCBjdGxfdGFibGUgICAgICAgICpjdGxfdGFibGU7Ci0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVAotCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpjdGxfY29tcGF0X2hlYWRlcjsKLQlzdHJ1Y3QgY3RsX3RhYmxlICAgICAgICAqY3RsX2NvbXBhdF90YWJsZTsKLSNlbmRpZgogI2VuZGlmCiAJdW5zaWduZWQgaW50CQl1c2VyczsKIH07CkBAIC01OCwxMCArNTQsNiBAQAogCXN0cnVjdCBuZl91ZHBfbmV0CXVkcDsKIAlzdHJ1Y3QgbmZfaWNtcF9uZXQJaWNtcDsKIAlzdHJ1Y3QgbmZfaWNtcF9uZXQJaWNtcHY2OwotI2lmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpjdGxfdGFibGVfaGVhZGVyOwotCXN0cnVjdCBjdGxfdGFibGUJKmN0bF90YWJsZTsKLSNlbmRpZgogfTsKIAogc3RydWN0IGN0X3BjcHUgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oIGIvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oCmluZGV4IGQwNjFmZmUuLjdhZGY0MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldG5zL2lwdjQuaAorKysgYi9pbmNsdWRlL25ldC9uZXRucy9pcHY0LmgKQEAgLTQwLDcgKzQwLDYgQEAKICNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCiAJc3RydWN0IGZpYl9ydWxlc19vcHMJKnJ1bGVzX29wczsKIAlib29sCQkJZmliX2hhc19jdXN0b21fcnVsZXM7Ci0Jc3RydWN0IGZpYl90YWJsZSBfX3JjdQkqZmliX2xvY2FsOwogCXN0cnVjdCBmaWJfdGFibGUgX19yY3UJKmZpYl9tYWluOwogCXN0cnVjdCBmaWJfdGFibGUgX19yY3UJKmZpYl9kZWZhdWx0OwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRucy9uZXRmaWx0ZXIuaCBiL2luY2x1ZGUvbmV0L25ldG5zL25ldGZpbHRlci5oCmluZGV4IDM2ZDcyMzUuLjU4NDg3YjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldG5zL25ldGZpbHRlci5oCisrKyBiL2luY2x1ZGUvbmV0L25ldG5zL25ldGZpbHRlci5oCkBAIC0xNiw2ICsxNiw2IEBACiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpuZl9sb2dfZGlyX2hlYWRlcjsKICNlbmRpZgotCXN0cnVjdCBsaXN0X2hlYWQgaG9va3NbTkZQUk9UT19OVU1QUk9UT11bTkZfTUFYX0hPT0tTXTsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSBfX3JjdSAqaG9va3NbTkZQUk9UT19OVU1QUk9UT11bTkZfTUFYX0hPT0tTXTsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldG5zL3hmcm0uaCBiL2luY2x1ZGUvbmV0L25ldG5zL3hmcm0uaAppbmRleCAyNGNkMzk0Li4yN2JiOTYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRucy94ZnJtLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bnMveGZybS5oCkBAIC0xMSw3ICsxMSw3IEBACiBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlcjsKIAogc3RydWN0IHhmcm1fcG9saWN5X2hhc2ggewotCXN0cnVjdCBobGlzdF9oZWFkCSp0YWJsZTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAlfX3JjdSAqdGFibGU7CiAJdW5zaWduZWQgaW50CQlobWFzazsKIAl1OAkJCWRiaXRzNDsKIAl1OAkJCXNiaXRzNDsKQEAgLTM4LDE0ICszOCwxMiBAQAogCSAqIG1vZGUuIEFsc28sIGl0IGNhbiBiZSB1c2VkIGJ5IGFoL2VzcCBpY21wIGVycm9yIGhhbmRsZXIgdG8gZmluZAogCSAqIG9mZmVuZGluZyBTQS4KIAkgKi8KLQlzdHJ1Y3QgaGxpc3RfaGVhZAkqc3RhdGVfYnlkc3Q7Ci0Jc3RydWN0IGhsaXN0X2hlYWQJKnN0YXRlX2J5c3JjOwotCXN0cnVjdCBobGlzdF9oZWFkCSpzdGF0ZV9ieXNwaTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAlfX3JjdSAqc3RhdGVfYnlkc3Q7CisJc3RydWN0IGhsaXN0X2hlYWQJX19yY3UgKnN0YXRlX2J5c3JjOworCXN0cnVjdCBobGlzdF9oZWFkCV9fcmN1ICpzdGF0ZV9ieXNwaTsKIAl1bnNpZ25lZCBpbnQJCXN0YXRlX2htYXNrOwogCXVuc2lnbmVkIGludAkJc3RhdGVfbnVtOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlzdGF0ZV9oYXNoX3dvcms7Ci0Jc3RydWN0IGhsaXN0X2hlYWQJc3RhdGVfZ2NfbGlzdDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJc3RhdGVfZ2Nfd29yazsKIAogCXN0cnVjdCBsaXN0X2hlYWQJcG9saWN5X2FsbDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZAkqcG9saWN5X2J5aWR4OwpAQCAtNzMsNyArNzEsNyBAQAogCXN0cnVjdCBkc3Rfb3BzCQl4ZnJtNl9kc3Rfb3BzOwogI2VuZGlmCiAJc3BpbmxvY2tfdCB4ZnJtX3N0YXRlX2xvY2s7Ci0Jcndsb2NrX3QgeGZybV9wb2xpY3lfbG9jazsKKwlzcGlubG9ja190IHhmcm1fcG9saWN5X2xvY2s7CiAJc3RydWN0IG11dGV4IHhmcm1fY2ZnX211dGV4OwogCiAJLyogZmxvdyBjYWNoZSBwYXJ0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wa3RfY2xzLmggYi9pbmNsdWRlL25ldC9wa3RfY2xzLmgKaW5kZXggYzk5NTA4ZC4uNzY3YjAzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcGt0X2Nscy5oCisrKyBiL2luY2x1ZGUvbmV0L3BrdF9jbHMuaApAQCAtNjksMTcgKzY5LDE5IEBACiAJaW50IHBvbGljZTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0Y2ZfZXh0c19pbml0KHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cywgaW50IGFjdGlvbiwgaW50IHBvbGljZSkKK3N0YXRpYyBpbmxpbmUgaW50IHRjZl9leHRzX2luaXQoc3RydWN0IHRjZl9leHRzICpleHRzLCBpbnQgYWN0aW9uLCBpbnQgcG9saWNlKQogewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAogCWV4dHMtPnR5cGUgPSAwOwogCWV4dHMtPm5yX2FjdGlvbnMgPSAwOwogCWV4dHMtPmFjdGlvbnMgPSBrY2FsbG9jKFRDQV9BQ1RfTUFYX1BSSU8sIHNpemVvZihzdHJ1Y3QgdGNfYWN0aW9uICopLAogCQkJCUdGUF9LRVJORUwpOwotCVdBUk5fT04oIWV4dHMtPmFjdGlvbnMpOyAvKiBUT0RPOiBwcm9wYWdhdGUgdGhlIGVycm9yIHRvIGNhbGxlcnMgKi8KKwlpZiAoIWV4dHMtPmFjdGlvbnMpCisJCXJldHVybiAtRU5PTUVNOwogI2VuZGlmCiAJZXh0cy0+YWN0aW9uID0gYWN0aW9uOwogCWV4dHMtPnBvbGljZSA9IHBvbGljZTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMjEsNyArMTIzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgZXh0cy0+bnJfYWN0aW9uczsgaSsrKSB7CiAJCXN0cnVjdCB0Y19hY3Rpb24gKmEgPSBleHRzLT5hY3Rpb25zW2ldOwogCi0JCWxpc3RfYWRkKCZhLT5saXN0LCBhY3Rpb25zKTsKKwkJbGlzdF9hZGRfdGFpbCgmYS0+bGlzdCwgYWN0aW9ucyk7CiAJfQogI2VuZGlmCiB9CkBAIC00ODQsNCArNDg2LDIwIEBACiAJdW5zaWduZWQgbG9uZyBjb29raWU7CiB9OwogCitlbnVtIHRjX2Nsc2JwZl9jb21tYW5kIHsKKwlUQ19DTFNCUEZfQURELAorCVRDX0NMU0JQRl9SRVBMQUNFLAorCVRDX0NMU0JQRl9ERVNUUk9ZLAorCVRDX0NMU0JQRl9TVEFUUywKK307CisKK3N0cnVjdCB0Y19jbHNfYnBmX29mZmxvYWQgeworCWVudW0gdGNfY2xzYnBmX2NvbW1hbmQgY29tbWFuZDsKKwlzdHJ1Y3QgdGNmX2V4dHMgKmV4dHM7CisJc3RydWN0IGJwZl9wcm9nICpwcm9nOworCWNvbnN0IGNoYXIgKm5hbWU7CisJYm9vbCBleHRzX2ludGVncmF0ZWQ7CisJdTMyIGdlbl9mbGFnczsKK307CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcGt0X3NjaGVkLmggYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAppbmRleCA3Y2FhOTliLi5jZDMzNGM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaAorKysgYi9pbmNsdWRlL25ldC9wa3Rfc2NoZWQuaApAQCAtOTAsOCArOTAsOCBAQAogdm9pZCBxZGlzY19nZXRfZGVmYXVsdChjaGFyICppZCwgc2l6ZV90IGxlbik7CiBpbnQgcWRpc2Nfc2V0X2RlZmF1bHQoY29uc3QgY2hhciAqaWQpOwogCi12b2lkIHFkaXNjX2xpc3RfYWRkKHN0cnVjdCBRZGlzYyAqcSk7Ci12b2lkIHFkaXNjX2xpc3RfZGVsKHN0cnVjdCBRZGlzYyAqcSk7Cit2b2lkIHFkaXNjX2hhc2hfYWRkKHN0cnVjdCBRZGlzYyAqcSk7Cit2b2lkIHFkaXNjX2hhc2hfZGVsKHN0cnVjdCBRZGlzYyAqcSk7CiBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2xvb2t1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgaGFuZGxlKTsKIHN0cnVjdCBRZGlzYyAqcWRpc2NfbG9va3VwX2NsYXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBoYW5kbGUpOwogc3RydWN0IHFkaXNjX3JhdGVfdGFibGUgKnFkaXNjX2dldF9ydGFiKHN0cnVjdCB0Y19yYXRlc3BlYyAqciwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3BwdHAuaCBiL2luY2x1ZGUvbmV0L3BwdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmU5ZjFmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvcHB0cC5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX05FVF9QUFRQX0gKKyNkZWZpbmUgX05FVF9QUFRQX0gKKworI2RlZmluZSBQUFBfTENQX0VDSE9SRVEgMHgwOQorI2RlZmluZSBQUFBfTENQX0VDSE9SRVAgMHgwQQorI2RlZmluZSBTQ19SQ1ZfQklUUyAgICAgKFNDX1JDVl9CN18xfFNDX1JDVl9CN18wfFNDX1JDVl9PRERQfFNDX1JDVl9FVk5QKQorCisjZGVmaW5lIE1JU1NJTkdfV0lORE9XIDIwCisjZGVmaW5lIFdSQVBQRUQoY3Vyc2VxLCBsYXN0c2VxKVwKKwkoKCgoY3Vyc2VxKSAmIDB4ZmZmZmZmMDApID09IDApICYmXAorCSgoKGxhc3RzZXEpICYgMHhmZmZmZmYwMCkgPT0gMHhmZmZmZmYwMCkpCisKKyNkZWZpbmUgUFBUUF9IRUFERVJfT1ZFUkhFQUQgKDIrc2l6ZW9mKHN0cnVjdCBwcHRwX2dyZV9oZWFkZXIpKQorc3RydWN0IHBwdHBfZ3JlX2hlYWRlciB7CisJc3RydWN0IGdyZV9iYXNlX2hkciBncmVfaGQ7CisJX19iZTE2IHBheWxvYWRfbGVuOworCV9fYmUxNiBjYWxsX2lkOworCV9fYmUzMiBzZXE7CisJX19iZTMyIGFjazsKK30gX19wYWNrZWQ7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9yb3V0ZS5oIGIvaW5jbHVkZS9uZXQvcm91dGUuaAppbmRleCBhZDc3N2Q3Li4wNDI5ZDQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9yb3V0ZS5oCisrKyBiL2luY2x1ZGUvbmV0L3JvdXRlLmgKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxuZXQvZmxvdy5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X3NvY2suaD4KICNpbmNsdWRlIDxuZXQvaXBfZmliLmg+Ci0jaW5jbHVkZSA8bmV0L2wzbWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2luX3JvdXRlLmg+CiAjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KQEAgLTI4NSwxNSArMjg0LDYgQEAKIAlpcF9yb3V0ZV9jb25uZWN0X2luaXQoZmw0LCBkc3QsIHNyYywgdG9zLCBvaWYsIHByb3RvY29sLAogCQkJICAgICAgc3BvcnQsIGRwb3J0LCBzayk7CiAKLQlpZiAoIXNyYyAmJiBvaWYpIHsKLQkJaW50IHJjOwotCi0JCXJjID0gbDNtZGV2X2dldF9zYWRkcihuZXQsIG9pZiwgZmw0KTsKLQkJaWYgKHJjIDwgMCkKLQkJCXJldHVybiBFUlJfUFRSKHJjKTsKLQotCQlzcmMgPSBmbDQtPnNhZGRyOwotCX0KIAlpZiAoIWRzdCB8fCAhc3JjKSB7CiAJCXJ0ID0gX19pcF9yb3V0ZV9vdXRwdXRfa2V5KG5ldCwgZmw0KTsKIAkJaWYgKElTX0VSUihydCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oIGIvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAppbmRleCA5MDlhZmYyLi5lNmFhMGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKQEAgLTM2LDYgKzM2LDE0IEBACiAJdTE2CQkJZGF0YVtdOwogfTsKIAorLyogc2ltaWxhciB0byBza19idWZmX2hlYWQsIGJ1dCBza2ItPnByZXYgcG9pbnRlciBpcyB1bmRlZmluZWQuICovCitzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgeworCXN0cnVjdCBza19idWZmCSpoZWFkOworCXN0cnVjdCBza19idWZmCSp0YWlsOworCV9fdTMyCQlxbGVuOworCXNwaW5sb2NrX3QJbG9jazsKK307CisKIHN0cnVjdCBRZGlzYyB7CiAJaW50IAkJCSgqZW5xdWV1ZSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgc3RydWN0IFFkaXNjICpzY2gsCkBAIC02MSw3ICs2OSw3IEBACiAJdTMyCQkJbGltaXQ7CiAJY29uc3Qgc3RydWN0IFFkaXNjX29wcwkqb3BzOwogCXN0cnVjdCBxZGlzY19zaXplX3RhYmxlCV9fcmN1ICpzdGFiOwotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAgICAgICBoYXNoOwogCXUzMgkJCWhhbmRsZTsKIAl1MzIJCQlwYXJlbnQ7CiAJdm9pZAkJCSp1MzJfbm9kZTsKQEAgLTc2LDcgKzg0LDcgQEAKIAkgKiBGb3IgcGVyZm9ybWFuY2Ugc2FrZSBvbiBTTVAsIHdlIHB1dCBoaWdobHkgbW9kaWZpZWQgZmllbGRzIGF0IHRoZSBlbmQKIAkgKi8KIAlzdHJ1Y3Qgc2tfYnVmZgkJKmdzb19za2IgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCXE7CisJc3RydWN0IHFkaXNjX3NrYl9oZWFkCXE7CiAJc3RydWN0IGduZXRfc3RhdHNfYmFzaWNfcGFja2VkIGJzdGF0czsKIAlzZXFjb3VudF90CQlydW5uaW5nOwogCXN0cnVjdCBnbmV0X3N0YXRzX3F1ZXVlCXFzdGF0czsKQEAgLTU5Miw3ICs2MDAsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcWRpc2NfcXN0YXRzX2NwdV9kcm9wKHN0cnVjdCBRZGlzYyAqc2NoKQogewotCXFzdGF0c19kcm9wX2luYyh0aGlzX2NwdV9wdHIoc2NoLT5jcHVfcXN0YXRzKSk7CisJdGhpc19jcHVfaW5jKHNjaC0+Y3B1X3FzdGF0cy0+ZHJvcHMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcWRpc2NfcXN0YXRzX292ZXJsaW1pdChzdHJ1Y3QgUWRpc2MgKnNjaCkKQEAgLTYwMCwxMCArNjA4LDI3IEBACiAJc2NoLT5xc3RhdHMub3ZlcmxpbWl0cysrOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX3FkaXNjX2VucXVldWVfdGFpbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCwKLQkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZGlzY19za2JfaGVhZF9pbml0KHN0cnVjdCBxZGlzY19za2JfaGVhZCAqcWgpCiB7Ci0JX19za2JfcXVldWVfdGFpbChsaXN0LCBza2IpOworCXFoLT5oZWFkID0gTlVMTDsKKwlxaC0+dGFpbCA9IE5VTEw7CisJcWgtPnFsZW4gPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3FkaXNjX2VucXVldWVfdGFpbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCwKKwkJCQkgICAgICAgc3RydWN0IHFkaXNjX3NrYl9oZWFkICpxaCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbGFzdCA9IHFoLT50YWlsOworCisJaWYgKGxhc3QpIHsKKwkJc2tiLT5uZXh0ID0gTlVMTDsKKwkJbGFzdC0+bmV4dCA9IHNrYjsKKwkJcWgtPnRhaWwgPSBza2I7CisJfSBlbHNlIHsKKwkJcWgtPnRhaWwgPSBza2I7CisJCXFoLT5oZWFkID0gc2tiOworCX0KKwlxaC0+cWxlbisrOwogCXFkaXNjX3FzdGF0c19iYWNrbG9nX2luYyhzY2gsIHNrYik7CiAKIAlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKQEAgLTYxNCwxNCArNjM5LDE2IEBACiAJcmV0dXJuIF9fcWRpc2NfZW5xdWV1ZV90YWlsKHNrYiwgc2NoLCAmc2NoLT5xKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqX19xZGlzY19kZXF1ZXVlX2hlYWQoc3RydWN0IFFkaXNjICpzY2gsCi0JCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqX19xZGlzY19kZXF1ZXVlX2hlYWQoc3RydWN0IHFkaXNjX3NrYl9oZWFkICpxaCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19za2JfZGVxdWV1ZShsaXN0KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcWgtPmhlYWQ7CiAKIAlpZiAobGlrZWx5KHNrYiAhPSBOVUxMKSkgewotCQlxZGlzY19xc3RhdHNfYmFja2xvZ19kZWMoc2NoLCBza2IpOwotCQlxZGlzY19ic3RhdHNfdXBkYXRlKHNjaCwgc2tiKTsKKwkJcWgtPmhlYWQgPSBza2ItPm5leHQ7CisJCXFoLT5xbGVuLS07CisJCWlmIChxaC0+aGVhZCA9PSBOVUxMKQorCQkJcWgtPnRhaWwgPSBOVUxMOworCQlza2ItPm5leHQgPSBOVUxMOwogCX0KIAogCXJldHVybiBza2I7CkBAIC02MjksNyArNjU2LDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnFkaXNjX2RlcXVldWVfaGVhZChzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKLQlyZXR1cm4gX19xZGlzY19kZXF1ZXVlX2hlYWQoc2NoLCAmc2NoLT5xKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQoJnNjaC0+cSk7CisKKwlpZiAobGlrZWx5KHNrYiAhPSBOVUxMKSkgeworCQlxZGlzY19xc3RhdHNfYmFja2xvZ19kZWMoc2NoLCBza2IpOworCQlxZGlzY19ic3RhdHNfdXBkYXRlKHNjaCwgc2tiKTsKKwl9CisKKwlyZXR1cm4gc2tiOwogfQogCiAvKiBJbnN0ZWFkIG9mIGNhbGxpbmcga2ZyZWVfc2tiKCkgd2hpbGUgcm9vdCBxZGlzYyBsb2NrIGlzIGhlbGQsCkBAIC02NDIsMTAgKzY3NiwxMCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBfX3FkaXNjX3F1ZXVlX2Ryb3BfaGVhZChzdHJ1Y3QgUWRpc2MgKnNjaCwKLQkJCQkJCSAgIHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QsCisJCQkJCQkgICBzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKnFoLAogCQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKip0b19mcmVlKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSBfX3NrYl9kZXF1ZXVlKGxpc3QpOworCXN0cnVjdCBza19idWZmICpza2IgPSBfX3FkaXNjX2RlcXVldWVfaGVhZChxaCk7CiAKIAlpZiAobGlrZWx5KHNrYiAhPSBOVUxMKSkgewogCQl1bnNpZ25lZCBpbnQgbGVuID0gcWRpc2NfcGt0X2xlbihza2IpOwpAQCAtNjY2LDcgKzcwMCw5IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnFkaXNjX3BlZWtfaGVhZChzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKLQlyZXR1cm4gc2tiX3BlZWsoJnNjaC0+cSk7CisJY29uc3Qgc3RydWN0IHFkaXNjX3NrYl9oZWFkICpxaCA9ICZzY2gtPnE7CisKKwlyZXR1cm4gcWgtPmhlYWQ7CiB9CiAKIC8qIGdlbmVyaWMgcHNldWRvIHBlZWsgbWV0aG9kIGZvciBub24td29yay1jb25zZXJ2aW5nIHFkaXNjICovCkBAIC03MDEsMTUgKzczNywxOSBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3FkaXNjX3Jlc2V0X3F1ZXVlKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCitzdGF0aWMgaW5saW5lIHZvaWQgX19xZGlzY19yZXNldF9xdWV1ZShzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKnFoKQogewogCS8qCiAJICogV2UgZG8gbm90IGtub3cgdGhlIGJhY2tsb2cgaW4gYnl0ZXMgb2YgdGhpcyBsaXN0LCBpdAogCSAqIGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gY29ycmVjdCBpdAogCSAqLwotCWlmICghc2tiX3F1ZXVlX2VtcHR5KGxpc3QpKSB7Ci0JCXJ0bmxfa2ZyZWVfc2ticyhsaXN0LT5uZXh0LCBsaXN0LT5wcmV2KTsKLQkJX19za2JfcXVldWVfaGVhZF9pbml0KGxpc3QpOworCUFTU0VSVF9SVE5MKCk7CisJaWYgKHFoLT5xbGVuKSB7CisJCXJ0bmxfa2ZyZWVfc2ticyhxaC0+aGVhZCwgcWgtPnRhaWwpOworCisJCXFoLT5oZWFkID0gTlVMTDsKKwkJcWgtPnRhaWwgPSBOVUxMOworCQlxaC0+cWxlbiA9IDA7CiAJfQogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaCBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCmluZGV4IDYzMmUyMDUuLjg3YTdmNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCkBAIC04Myw5ICs4Myw5IEBACiAjZW5kaWYKIAogLyogUm91bmQgYW4gaW50IHVwIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIDQuICAqLwotI2RlZmluZSBXT1JEX1JPVU5EKHMpICgoKHMpKzMpJn4zKQorI2RlZmluZSBTQ1RQX1BBRDQocykgKCgocykrMykmfjMpCiAvKiBUcnVuY2F0ZSB0byB0aGUgcHJldmlvdXMgbXVsdGlwbGUgb2YgNC4gICovCi0jZGVmaW5lIFdPUkRfVFJVTkMocykgKChzKSZ+MykKKyNkZWZpbmUgU0NUUF9UUlVOQzQocykgKChzKSZ+MykKIAogLyoKICAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KQEAgLTQzMyw3ICs0MzMsNyBAQAogCWlmIChhc29jLT51c2VyX2ZyYWcpCiAJCWZyYWcgPSBtaW5fdChpbnQsIGZyYWcsIGFzb2MtPnVzZXJfZnJhZyk7CiAKLQlmcmFnID0gV09SRF9UUlVOQyhtaW5fdChpbnQsIGZyYWcsIFNDVFBfTUFYX0NIVU5LX0xFTikpOworCWZyYWcgPSBTQ1RQX1RSVU5DNChtaW5fdChpbnQsIGZyYWcsIFNDVFBfTUFYX0NIVU5LX0xFTikpOwogCiAJcmV0dXJuIGZyYWc7CiB9CkBAIC00NjIsNyArNDYyLDcgQEAKIGZvciAocG9zLnYgPSBjaHVuay0+bWVtYmVyO1wKICAgICAgcG9zLnYgPD0gKHZvaWQgKiljaHVuayArIGVuZCAtIG50b2hzKHBvcy5wLT5sZW5ndGgpICYmXAogICAgICBudG9ocyhwb3MucC0+bGVuZ3RoKSA+PSBzaXplb2Yoc2N0cF9wYXJhbWhkcl90KTtcCi0gICAgIHBvcy52ICs9IFdPUkRfUk9VTkQobnRvaHMocG9zLnAtPmxlbmd0aCkpKQorICAgICBwb3MudiArPSBTQ1RQX1BBRDQobnRvaHMocG9zLnAtPmxlbmd0aCkpKQogCiAjZGVmaW5lIHNjdHBfd2Fsa19lcnJvcnMoZXJyLCBjaHVua19oZHIpXAogX3NjdHBfd2Fsa19lcnJvcnMoKGVyciksIChjaHVua19oZHIpLCBudG9ocygoY2h1bmtfaGRyKS0+bGVuZ3RoKSkKQEAgLTQ3Miw3ICs0NzIsNyBAQAogCSAgICBzaXplb2Yoc2N0cF9jaHVua2hkcl90KSk7XAogICAgICAodm9pZCAqKWVyciA8PSAodm9pZCAqKWNodW5rX2hkciArIGVuZCAtIG50b2hzKGVyci0+bGVuZ3RoKSAmJlwKICAgICAgbnRvaHMoZXJyLT5sZW5ndGgpID49IHNpemVvZihzY3RwX2Vycmhkcl90KTsgXAotICAgICBlcnIgPSAoc2N0cF9lcnJoZHJfdCAqKSgodm9pZCAqKWVyciArIFdPUkRfUk9VTkQobnRvaHMoZXJyLT5sZW5ndGgpKSkpCisgICAgIGVyciA9IChzY3RwX2Vycmhkcl90ICopKCh2b2lkICopZXJyICsgU0NUUF9QQUQ0KG50b2hzKGVyci0+bGVuZ3RoKSkpKQogCiAjZGVmaW5lIHNjdHBfd2Fsa19md2R0c24ocG9zLCBjaHVuaylcCiBfc2N0cF93YWxrX2Z3ZHRzbigocG9zKSwgKGNodW5rKSwgbnRvaHMoKGNodW5rKS0+Y2h1bmtfaGRyLT5sZW5ndGgpIC0gc2l6ZW9mKHN0cnVjdCBzY3RwX2Z3ZHRzbl9jaHVuaykpCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3NtLmggYi9pbmNsdWRlL25ldC9zY3RwL3NtLmgKaW5kZXggZWZjMDE3NC4uY2E2Yzk3MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zbS5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc20uaApAQCAtMzA3LDg1ICszMDcsMjcgQEAKIH0KIAogLyogQ29tcGFyZSB0d28gVFNOcyAqLworI2RlZmluZSBUU05fbHQoYSxiKQlcCisJKHR5cGVjaGVjayhfX3UzMiwgYSkgJiYgXAorCSB0eXBlY2hlY2soX191MzIsIGIpICYmIFwKKwkgKChfX3MzMikoKGEpIC0gKGIpKSA8IDApKQogCi0vKiBSRkMgMTk4MiAtIFNlcmlhbCBOdW1iZXIgQXJpdGhtZXRpYwotICoKLSAqIDIuIENvbXBhcmlzb24KLSAqICBUaGVuLCBzMSBpcyBzYWlkIHRvIGJlIGVxdWFsIHRvIHMyIGlmIGFuZCBvbmx5IGlmIGkxIGlzIGVxdWFsIHRvIGkyLAotICogIGluIGFsbCBvdGhlciBjYXNlcywgczEgaXMgbm90IGVxdWFsIHRvIHMyLgotICoKLSAqIHMxIGlzIHNhaWQgdG8gYmUgbGVzcyB0aGFuIHMyIGlmLCBhbmQgb25seSBpZiwgczEgaXMgbm90IGVxdWFsIHRvIHMyLAotICogYW5kCi0gKgotICogICAgICAoaTEgPCBpMiBhbmQgaTIgLSBpMSA8IDJeKFNFUklBTF9CSVRTIC0gMSkpIG9yCi0gKiAgICAgIChpMSA+IGkyIGFuZCBpMSAtIGkyID4gMl4oU0VSSUFMX0JJVFMgLSAxKSkKLSAqCi0gKiBzMSBpcyBzYWlkIHRvIGJlIGdyZWF0ZXIgdGhhbiBzMiBpZiwgYW5kIG9ubHkgaWYsIHMxIGlzIG5vdCBlcXVhbCB0bwotICogczIsIGFuZAotICoKLSAqICAgICAgKGkxIDwgaTIgYW5kIGkyIC0gaTEgPiAyXihTRVJJQUxfQklUUyAtIDEpKSBvcgotICogICAgICAoaTEgPiBpMiBhbmQgaTEgLSBpMiA8IDJeKFNFUklBTF9CSVRTIC0gMSkpCi0gKi8KLQotLyoKLSAqIFJGQyAyOTYwCi0gKiAgMS42IFNlcmlhbCBOdW1iZXIgQXJpdGhtZXRpYwotICoKLSAqIENvbXBhcmlzb25zIGFuZCBhcml0aG1ldGljIG9uIFRTTnMgaW4gdGhpcyBkb2N1bWVudCBTSE9VTEQgdXNlIFNlcmlhbAotICogTnVtYmVyIEFyaXRobWV0aWMgYXMgZGVmaW5lZCBpbiBbUkZDMTk4Ml0gd2hlcmUgU0VSSUFMX0JJVFMgPSAzMi4KLSAqLwotCi1lbnVtIHsKLQlUU05fU0lHTl9CSVQgPSAoMTw8MzEpCi19OwotCi1zdGF0aWMgaW5saW5lIGludCBUU05fbHQoX191MzIgcywgX191MzIgdCkKLXsKLQlyZXR1cm4gKChzKSAtICh0KSkgJiBUU05fU0lHTl9CSVQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IFRTTl9sdGUoX191MzIgcywgX191MzIgdCkKLXsKLQlyZXR1cm4gKChzKSA9PSAodCkpIHx8ICgoKHMpIC0gKHQpKSAmIFRTTl9TSUdOX0JJVCk7Ci19CisjZGVmaW5lIFRTTl9sdGUoYSxiKQlcCisJKHR5cGVjaGVjayhfX3UzMiwgYSkgJiYgXAorCSB0eXBlY2hlY2soX191MzIsIGIpICYmIFwKKwkgKChfX3MzMikoKGEpIC0gKGIpKSA8PSAwKSkKIAogLyogQ29tcGFyZSB0d28gU1NOcyAqLworI2RlZmluZSBTU05fbHQoYSxiKQkJXAorCSh0eXBlY2hlY2soX191MTYsIGEpICYmIFwKKwkgdHlwZWNoZWNrKF9fdTE2LCBiKSAmJiBcCisJICgoX19zMTYpKChhKSAtIChiKSkgPCAwKSkKIAotLyoKLSAqIFJGQyAyOTYwCi0gKiAgMS42IFNlcmlhbCBOdW1iZXIgQXJpdGhtZXRpYwotICoKLSAqIENvbXBhcmlzb25zIGFuZCBhcml0aG1ldGljIG9uIFN0cmVhbSBTZXF1ZW5jZSBOdW1iZXJzIGluIHRoaXMgZG9jdW1lbnQKLSAqIFNIT1VMRCB1c2UgU2VyaWFsIE51bWJlciBBcml0aG1ldGljIGFzIGRlZmluZWQgaW4gW1JGQzE5ODJdIHdoZXJlCi0gKiBTRVJJQUxfQklUUyA9IDE2LgotICovCi1lbnVtIHsKLQlTU05fU0lHTl9CSVQgPSAoMTw8MTUpCi19OwotCi1zdGF0aWMgaW5saW5lIGludCBTU05fbHQoX191MTYgcywgX191MTYgdCkKLXsKLQlyZXR1cm4gKChzKSAtICh0KSkgJiBTU05fU0lHTl9CSVQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IFNTTl9sdGUoX191MTYgcywgX191MTYgdCkKLXsKLQlyZXR1cm4gKChzKSA9PSAodCkpIHx8ICgoKHMpIC0gKHQpKSAmIFNTTl9TSUdOX0JJVCk7Ci19Ci0KLS8qCi0gKiBBRERJUCAzLjEuMQotICogVGhlIHZhbGlkIHJhbmdlIG9mIFNlcmlhbCBOdW1iZXIgaXMgZnJvbSAwIHRvIDQyOTQ5NjcyOTUgKDIqKjMyIC0gMSkuIFNlcmlhbAotICogTnVtYmVycyB3cmFwIGJhY2sgdG8gMCBhZnRlciByZWFjaGluZyA0Mjk0OTY3Mjk1LgotICovCi1lbnVtIHsKLQlBRERJUF9TRVJJQUxfU0lHTl9CSVQgPSAoMTw8MzEpCi19OwotCi1zdGF0aWMgaW5saW5lIGludCBBRERJUF9TRVJJQUxfZ3RlKF9fdTE2IHMsIF9fdTE2IHQpCi17Ci0JcmV0dXJuICgocykgPT0gKHQpKSB8fCAoKCh0KSAtIChzKSkgJiBBRERJUF9TRVJJQUxfU0lHTl9CSVQpOwotfQorLyogQURESVAgMy4xLjEgKi8KKyNkZWZpbmUgQURESVBfU0VSSUFMX2d0ZShhLGIpCVwKKwkodHlwZWNoZWNrKF9fdTMyLCBhKSAmJiBcCisJIHR5cGVjaGVjayhfX3UzMiwgYikgJiYgXAorCSAoKF9fczMyKSgoYikgLSAoYSkpIDw9IDApKQogCiAvKiBDaGVjayBWVEFHIG9mIHRoZSBwYWNrZXQgbWF0Y2hlcyB0aGUgc2VuZGVyJ3Mgb3duIHRhZy4gKi8KIHN0YXRpYyBpbmxpbmUgaW50CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3N0cnVjdHMuaCBiL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCmluZGV4IGNlOTNjNGIuLjExYzNiZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oCkBAIC01MzcsNiArNTM3LDcgQEAKIHN0cnVjdCBzY3RwX2RhdGFtc2cgKnNjdHBfZGF0YW1zZ19mcm9tX3VzZXIoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwKIAkJCQkJICAgIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKiwKIAkJCQkJICAgIHN0cnVjdCBpb3ZfaXRlciAqKTsKK3ZvaWQgc2N0cF9kYXRhbXNnX2ZyZWUoc3RydWN0IHNjdHBfZGF0YW1zZyAqKTsKIHZvaWQgc2N0cF9kYXRhbXNnX3B1dChzdHJ1Y3Qgc2N0cF9kYXRhbXNnICopOwogdm9pZCBzY3RwX2NodW5rX2ZhaWwoc3RydWN0IHNjdHBfY2h1bmsgKiwgaW50IGVycm9yKTsKIGludCBzY3RwX2NodW5rX2FiYW5kb25lZChzdHJ1Y3Qgc2N0cF9jaHVuayAqKTsKQEAgLTU1NCw2ICs1NTUsOSBAQAogCiAJYXRvbWljX3QgcmVmY250OwogCisJLyogSG93IG1hbnkgdGltZXMgdGhpcyBjaHVuayBoYXZlIGJlZW4gc2VudCwgZm9yIHByc2N0cCBSVFggcG9saWN5ICovCisJaW50IHNlbnRfY291bnQ7CisKIAkvKiBUaGlzIGlzIG91ciBsaW5rIHRvIHRoZSBwZXItdHJhbnNwb3J0IHRyYW5zbWl0dGVkIGxpc3QuICAqLwogCXN0cnVjdCBsaXN0X2hlYWQgdHJhbnNtaXR0ZWRfbGlzdDsKIApAQCAtNjAzLDE2ICs2MDcsNiBAQAogCS8qIFRoaXMgbmVlZHMgdG8gYmUgcmVjb3ZlcmFibGUgZm9yIFNDVFBfU0VORF9GQUlMRUQgZXZlbnRzLiAqLwogCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gc2luZm87CiAKLQkvKiBXZSB1c2UgdGhpcyBmaWVsZCB0byByZWNvcmQgcGFyYW0gZm9yIHByc2N0cCBwb2xpY2llcywKLQkgKiBmb3IgVFRMIHBvbGljeSwgaXQgaXMgdGhlIHRpbWVfdG9fZHJvcCBvZiB0aGlzIGNodW5rLAotCSAqIGZvciBSVFggcG9saWN5LCBpdCBpcyB0aGUgbWF4X3NlbnRfY291bnQgb2YgdGhpcyBjaHVuaywKLQkgKiBmb3IgUFJJTyBwb2xpY3ksIGl0IGlzIHRoZSBwcmlvcml0eSBvZiB0aGlzIGNodW5rLgotCSAqLwotCXVuc2lnbmVkIGxvbmcgcHJzY3RwX3BhcmFtOwotCi0JLyogSG93IG1hbnkgdGltZXMgdGhpcyBjaHVuayBoYXZlIGJlZW4gc2VudCwgZm9yIHByc2N0cCBSVFggcG9saWN5ICovCi0JaW50IHNlbnRfY291bnQ7Ci0KIAkvKiBXaGljaCBhc3NvY2lhdGlvbiBkb2VzIHRoaXMgYmVsb25nIHRvPyAgKi8KIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsKIApAQCAtMTA3Niw3ICsxMDcwLDcgQEAKIHZvaWQgc2N0cF9vdXRxX2luaXQoc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKiwgc3RydWN0IHNjdHBfb3V0cSAqKTsKIHZvaWQgc2N0cF9vdXRxX3RlYXJkb3duKHN0cnVjdCBzY3RwX291dHEgKik7CiB2b2lkIHNjdHBfb3V0cV9mcmVlKHN0cnVjdCBzY3RwX291dHEqKTsKLWludCBzY3RwX291dHFfdGFpbChzdHJ1Y3Qgc2N0cF9vdXRxICosIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgZ2ZwX3QpOwordm9pZCBzY3RwX291dHFfdGFpbChzdHJ1Y3Qgc2N0cF9vdXRxICosIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgZ2ZwX3QpOwogaW50IHNjdHBfb3V0cV9zYWNrKHN0cnVjdCBzY3RwX291dHEgKiwgc3RydWN0IHNjdHBfY2h1bmsgKik7CiBpbnQgc2N0cF9vdXRxX2lzX2VtcHR5KGNvbnN0IHN0cnVjdCBzY3RwX291dHEgKik7CiB2b2lkIHNjdHBfb3V0cV9yZXN0YXJ0KHN0cnVjdCBzY3RwX291dHEgKik7CkBAIC0xMDg0LDcgKzEwNzgsNyBAQAogdm9pZCBzY3RwX3JldHJhbnNtaXQoc3RydWN0IHNjdHBfb3V0cSAqLCBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKiwKIAkJICAgICBzY3RwX3JldHJhbnNtaXRfcmVhc29uX3QpOwogdm9pZCBzY3RwX3JldHJhbnNtaXRfbWFyayhzdHJ1Y3Qgc2N0cF9vdXRxICosIHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqLCBfX3U4KTsKLWludCBzY3RwX291dHFfdW5jb3JrKHN0cnVjdCBzY3RwX291dHEgKiwgZ2ZwX3QgZ2ZwKTsKK3ZvaWQgc2N0cF9vdXRxX3VuY29yayhzdHJ1Y3Qgc2N0cF9vdXRxICosIGdmcF90IGdmcCk7CiB2b2lkIHNjdHBfcHJzY3RwX3BydW5lKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jLAogCQkgICAgICAgc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm8sIGludCBtc2dfbGVuKTsKIC8qIFVuY29yayBhbmQgZmx1c2ggYW4gb3V0cXVldWUuICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc29jay5oIGIvaW5jbHVkZS9uZXQvc29jay5oCmluZGV4IGZmNWJlN2UuLmViZjc1ZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9zb2NrLmgKQEAgLTEwMjAsNyArMTAyMCw2IEBACiAJdm9pZAkJCSgqdW5oYXNoKShzdHJ1Y3Qgc29jayAqc2spOwogCXZvaWQJCQkoKnJlaGFzaCkoc3RydWN0IHNvY2sgKnNrKTsKIAlpbnQJCQkoKmdldF9wb3J0KShzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIHNob3J0IHNudW0pOwotCXZvaWQJCQkoKmNsZWFyX3NrKShzdHJ1Y3Qgc29jayAqc2ssIGludCBzaXplKTsKIAogCS8qIEtlZXBpbmcgdHJhY2sgb2Ygc29ja2V0cyBpbiB1c2UgKi8KICNpZmRlZiBDT05GSUdfUFJPQ19GUwpAQCAtMTExNCw2ICsxMTEzLDE2IEBACiAJICAgICAgIHNrX3N0cmVhbV9tZW1vcnlfZnJlZShzayk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNrX3VuZGVyX2Nncm91cF9oaWVyYXJjaHkoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkgICAgc3RydWN0IGNncm91cCAqYW5jZXN0b3IpCit7CisjaWZkZWYgQ09ORklHX1NPQ0tfQ0dST1VQX0RBVEEKKwlyZXR1cm4gY2dyb3VwX2lzX2Rlc2NlbmRhbnQoc29ja19jZ3JvdXBfcHRyKCZzay0+c2tfY2dycF9kYXRhKSwKKwkJCQkgICAgYW5jZXN0b3IpOworI2Vsc2UKKwlyZXR1cm4gLUVOT1RTVVBQOworI2VuZGlmCit9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBza19oYXNfbWVtb3J5X3ByZXNzdXJlKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKIHsKQEAgLTEyMzIsOCArMTI0MSw2IEBACiAJcmV0dXJuIHNrLT5za19wcm90LT5oYXNoKHNrKTsKIH0KIAotdm9pZCBza19wcm90X2NsZWFyX3BvcnRhZGRyX251bGxzKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUpOwotCiAvKiBBYm91dCAxMCBzZWNvbmRzICovCiAjZGVmaW5lIFNPQ0tfREVTVFJPWV9USU1FICgxMCpIWikKIApAQCAtMTMzMiw2ICsxMzM5LDE2IEBACiAJaWYgKCFza19oYXNfYWNjb3VudChzaykpCiAJCXJldHVybjsKIAlzay0+c2tfZm9yd2FyZF9hbGxvYyArPSBzaXplOworCisJLyogQXZvaWQgYSBwb3NzaWJsZSBvdmVyZmxvdy4KKwkgKiBUQ1Agc2VuZCBxdWV1ZXMgY2FuIG1ha2UgdGhpcyBoYXBwZW4sIGlmIHNrX21lbV9yZWNsYWltKCkKKwkgKiBpcyBub3QgY2FsbGVkIGFuZCBtb3JlIHRoYW4gMiBHQnl0ZXMgYXJlIHJlbGVhc2VkIGF0IG9uY2UuCisJICoKKwkgKiBJZiB3ZSByZWFjaCAyIE1CeXRlcywgcmVjbGFpbSAxIE1CeXRlcyByaWdodCBub3csIHRoZXJlIGlzCisJICogbm8gbmVlZCB0byBob2xkIHRoYXQgbXVjaCBmb3J3YXJkIGFsbG9jYXRpb24gYW55d2F5LgorCSAqLworCWlmICh1bmxpa2VseShzay0+c2tfZm9yd2FyZF9hbGxvYyA+PSAxIDw8IDIxKSkKKwkJX19za19tZW1fcmVjbGFpbShzaywgMSA8PCAyMCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBza193bWVtX2ZyZWVfc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3N0cnBhcnNlci5oIGIvaW5jbHVkZS9uZXQvc3RycGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMyOGFkOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3N0cnBhcnNlci5oCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogU3RyZWFtIFBhcnNlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBUb20gSGVyYmVydCA8dG9tQGhlcmJlcnRsYW5kLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19ORVRfU1RSUEFSU0VSX0hfCisjZGVmaW5lIF9fTkVUX1NUUlBBUlNFUl9IXworCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworI2RlZmluZSBTVFJQX1NUQVRTX0FERChzdGF0LCBjb3VudCkgKChzdGF0KSArPSAoY291bnQpKQorI2RlZmluZSBTVFJQX1NUQVRTX0lOQ1Ioc3RhdCkgKChzdGF0KSsrKQorCitzdHJ1Y3Qgc3RycF9zdGF0cyB7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X21zZ3M7CisJdW5zaWduZWQgbG9uZyBsb25nIHJ4X2J5dGVzOworCXVuc2lnbmVkIGludCByeF9tZW1fZmFpbDsKKwl1bnNpZ25lZCBpbnQgcnhfbmVlZF9tb3JlX2hkcjsKKwl1bnNpZ25lZCBpbnQgcnhfbXNnX3Rvb19iaWc7CisJdW5zaWduZWQgaW50IHJ4X21zZ190aW1lb3V0czsKKwl1bnNpZ25lZCBpbnQgcnhfYmFkX2hkcl9sZW47Cit9OworCitzdHJ1Y3Qgc3RycF9hZ2dyX3N0YXRzIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcnhfbXNnczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcnhfYnl0ZXM7CisJdW5zaWduZWQgaW50IHJ4X21lbV9mYWlsOworCXVuc2lnbmVkIGludCByeF9uZWVkX21vcmVfaGRyOworCXVuc2lnbmVkIGludCByeF9tc2dfdG9vX2JpZzsKKwl1bnNpZ25lZCBpbnQgcnhfbXNnX3RpbWVvdXRzOworCXVuc2lnbmVkIGludCByeF9iYWRfaGRyX2xlbjsKKwl1bnNpZ25lZCBpbnQgcnhfYWJvcnRzOworCXVuc2lnbmVkIGludCByeF9pbnRlcnJ1cHRlZDsKKwl1bnNpZ25lZCBpbnQgcnhfdW5yZWNvdl9pbnRyOworfTsKKworc3RydWN0IHN0cnBhcnNlcjsKKworLyogQ2FsbGJhY2tzIGFyZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQgZm9yIHRoZSBhdHRhY2hlZCBzb2NrZXQgKi8KK3N0cnVjdCBzdHJwX2NhbGxiYWNrcyB7CisJaW50ICgqcGFyc2VfbXNnKShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwl2b2lkICgqcmN2X21zZykoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJaW50ICgqcmVhZF9zb2NrX2RvbmUpKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIGludCBlcnIpOworCXZvaWQgKCphYm9ydF9wYXJzZXIpKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsIGludCBlcnIpOworfTsKKworc3RydWN0IHN0cnBfcnhfbXNnIHsKKwlpbnQgZnVsbF9sZW47CisJaW50IG9mZnNldDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN0cnBfcnhfbXNnICpzdHJwX3J4X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiAoc3RydWN0IHN0cnBfcnhfbXNnICopKCh2b2lkICopc2tiLT5jYiArCisJCW9mZnNldG9mKHN0cnVjdCBxZGlzY19za2JfY2IsIGRhdGEpKTsKK30KKworLyogU3RydWN0dXJlIGZvciBhbiBhdHRhY2hlZCBsb3dlciBzb2NrZXQgKi8KK3N0cnVjdCBzdHJwYXJzZXIgeworCXN0cnVjdCBzb2NrICpzazsKKworCXUzMiByeF9zdG9wcGVkIDogMTsKKwl1MzIgcnhfcGF1c2VkIDogMTsKKwl1MzIgcnhfYWJvcnRlZCA6IDE7CisJdTMyIHJ4X2ludGVycnVwdGVkIDogMTsKKwl1MzIgcnhfdW5yZWNvdl9pbnRyIDogMTsKKworCXN0cnVjdCBza19idWZmICoqcnhfc2tiX25leHRwOworCXN0cnVjdCB0aW1lcl9saXN0IHJ4X21zZ190aW1lcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiX2hlYWQ7CisJdW5zaWduZWQgaW50IHJ4X25lZWRfYnl0ZXM7CisJc3RydWN0IGRlbGF5ZWRfd29yayByeF9kZWxheWVkX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IHJ4X3dvcms7CisJc3RydWN0IHN0cnBfc3RhdHMgc3RhdHM7CisJc3RydWN0IHN0cnBfY2FsbGJhY2tzIGNiOworfTsKKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQgZm9yIGF0dGFjaGVkIHNvY2tldCAqLworc3RhdGljIGlubGluZSB2b2lkIHN0cnBfcGF1c2Uoc3RydWN0IHN0cnBhcnNlciAqc3RycCkKK3sKKwlzdHJwLT5yeF9wYXVzZWQgPSAxOworfQorCisvKiBNYXkgYmUgY2FsbGVkIHdpdGhvdXQgaG9sZGluZyBsb2NrIGZvciBhdHRhY2hlZCBzb2NrZXQgKi8KK3ZvaWQgc3RycF91bnBhdXNlKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApOworCitzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9zdHJwX3N0YXRzKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnAsCisJCQkJICAgc3RydWN0IHN0cnBfYWdncl9zdGF0cyAqYWdnX3N0YXRzKQoreworCS8qIFNhdmUgcHNvY2sgc3RhdGlzdGljcyBpbiB0aGUgbXV4IHdoZW4gcHNvY2sgaXMgYmVpbmcgdW5hdHRhY2hlZC4gKi8KKworI2RlZmluZSBTQVZFX1BTT0NLX1NUQVRTKF9zdGF0KSAoYWdnX3N0YXRzLT5fc3RhdCArPQkJXAorCQkJCSBzdHJwLT5zdGF0cy5fc3RhdCkKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X21zZ3MpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfYnl0ZXMpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfbWVtX2ZhaWwpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfbmVlZF9tb3JlX2hkcik7CisJU0FWRV9QU09DS19TVEFUUyhyeF9tc2dfdG9vX2JpZyk7CisJU0FWRV9QU09DS19TVEFUUyhyeF9tc2dfdGltZW91dHMpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfYmFkX2hkcl9sZW4pOworI3VuZGVmIFNBVkVfUFNPQ0tfU1RBVFMKKworCWlmIChzdHJwLT5yeF9hYm9ydGVkKQorCQlhZ2dfc3RhdHMtPnJ4X2Fib3J0cysrOworCWlmIChzdHJwLT5yeF9pbnRlcnJ1cHRlZCkKKwkJYWdnX3N0YXRzLT5yeF9pbnRlcnJ1cHRlZCsrOworCWlmIChzdHJwLT5yeF91bnJlY292X2ludHIpCisJCWFnZ19zdGF0cy0+cnhfdW5yZWNvdl9pbnRyKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZ2dyZWdhdGVfc3RycF9zdGF0cyhzdHJ1Y3Qgc3RycF9hZ2dyX3N0YXRzICpzdGF0cywKKwkJCQkJc3RydWN0IHN0cnBfYWdncl9zdGF0cyAqYWdnX3N0YXRzKQoreworI2RlZmluZSBTQVZFX1BTT0NLX1NUQVRTKF9zdGF0KSAoYWdnX3N0YXRzLT5fc3RhdCArPSBzdGF0cy0+X3N0YXQpCisJU0FWRV9QU09DS19TVEFUUyhyeF9tc2dzKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X2J5dGVzKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X21lbV9mYWlsKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X25lZWRfbW9yZV9oZHIpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfbXNnX3Rvb19iaWcpOworCVNBVkVfUFNPQ0tfU1RBVFMocnhfbXNnX3RpbWVvdXRzKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X2JhZF9oZHJfbGVuKTsKKwlTQVZFX1BTT0NLX1NUQVRTKHJ4X2Fib3J0cyk7CisJU0FWRV9QU09DS19TVEFUUyhyeF9pbnRlcnJ1cHRlZCk7CisJU0FWRV9QU09DS19TVEFUUyhyeF91bnJlY292X2ludHIpOworI3VuZGVmIFNBVkVfUFNPQ0tfU1RBVFMKKworfQorCit2b2lkIHN0cnBfZG9uZShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKTsKK3ZvaWQgc3RycF9zdG9wKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApOwordm9pZCBzdHJwX2NoZWNrX3JjdihzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKTsKK2ludCBzdHJwX2luaXQoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgc3RydWN0IHNvY2sgKmNzaywKKwkgICAgICBzdHJ1Y3Qgc3RycF9jYWxsYmFja3MgKmNiKTsKK3ZvaWQgc3RycF9kYXRhX3JlYWR5KHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApOworCisjZW5kaWYgLyogX19ORVRfU1RSUEFSU0VSX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zd2l0Y2hkZXYuaCBiL2luY2x1ZGUvbmV0L3N3aXRjaGRldi5oCmluZGV4IDYyZjZhOTYuLmViYTgwYzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3N3aXRjaGRldi5oCisrKyBiL2luY2x1ZGUvbmV0L3N3aXRjaGRldi5oCkBAIC02OCw3ICs2OCw2IEBACiBlbnVtIHN3aXRjaGRldl9vYmpfaWQgewogCVNXSVRDSERFVl9PQkpfSURfVU5ERUZJTkVELAogCVNXSVRDSERFVl9PQkpfSURfUE9SVF9WTEFOLAotCVNXSVRDSERFVl9PQkpfSURfSVBWNF9GSUIsCiAJU1dJVENIREVWX09CSl9JRF9QT1JUX0ZEQiwKIAlTV0lUQ0hERVZfT0JKX0lEX1BPUlRfTURCLAogfTsKQEAgLTkyLDIxICs5MSw2IEBACiAjZGVmaW5lIFNXSVRDSERFVl9PQkpfUE9SVF9WTEFOKG9iaikgXAogCWNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfdmxhbiwgb2JqKQogCi0vKiBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCICovCi1zdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiB7Ci0Jc3RydWN0IHN3aXRjaGRldl9vYmogb2JqOwotCXUzMiBkc3Q7Ci0JaW50IGRzdF9sZW47Ci0Jc3RydWN0IGZpYl9pbmZvICpmaTsKLQl1OCB0b3M7Ci0JdTggdHlwZTsKLQl1MzIgbmxmbGFnczsKLQl1MzIgdGJfaWQ7Ci19OwotCi0jZGVmaW5lIFNXSVRDSERFVl9PQkpfSVBWNF9GSUIob2JqKSBcCi0JY29udGFpbmVyX29mKG9iaiwgc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIsIG9iaikKLQogLyogU1dJVENIREVWX09CSl9JRF9QT1JUX0ZEQiAqLwogc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9mZGIgewogCXN0cnVjdCBzd2l0Y2hkZXZfb2JqIG9iajsKQEAgLTIwOSwxMSArMTkzLDYgQEAKIAkJCQkgIHN0cnVjdCBubG1zZ2hkciAqbmxoLCB1MTYgZmxhZ3MpOwogaW50IHN3aXRjaGRldl9wb3J0X2JyaWRnZV9kZWxsaW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdTE2IGZsYWdzKTsKLWludCBzd2l0Y2hkZXZfZmliX2lwdjRfYWRkKHUzMiBkc3QsIGludCBkc3RfbGVuLCBzdHJ1Y3QgZmliX2luZm8gKmZpLAotCQkJICAgdTggdG9zLCB1OCB0eXBlLCB1MzIgbmxmbGFncywgdTMyIHRiX2lkKTsKLWludCBzd2l0Y2hkZXZfZmliX2lwdjRfZGVsKHUzMiBkc3QsIGludCBkc3RfbGVuLCBzdHJ1Y3QgZmliX2luZm8gKmZpLAotCQkJICAgdTggdG9zLCB1OCB0eXBlLCB1MzIgdGJfaWQpOwotdm9pZCBzd2l0Y2hkZXZfZmliX2lwdjRfYWJvcnQoc3RydWN0IGZpYl9pbmZvICpmaSk7CiBpbnQgc3dpdGNoZGV2X3BvcnRfZmRiX2FkZChzdHJ1Y3QgbmRtc2cgKm5kbSwgc3RydWN0IG5sYXR0ciAqdGJbXSwKIAkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsCiAJCQkgICB1MTYgdmlkLCB1MTYgbmxtX2ZsYWdzKTsKQEAgLTIyMiw3ICsyMDEsNyBAQAogCQkJICAgdTE2IHZpZCk7CiBpbnQgc3dpdGNoZGV2X3BvcnRfZmRiX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsIGludCBpZHgpOworCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpmaWx0ZXJfZGV2LCBpbnQgKmlkeCk7CiB2b2lkIHN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZ3JvdXBfZGV2LAogCQkJCSBib29sIGpvaW5pbmcpOwpAQCAtMzA0LDI1ICsyODMsNiBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc3dpdGNoZGV2X2ZpYl9pcHY0X2FkZCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwKLQkJCQkJIHN0cnVjdCBmaWJfaW5mbyAqZmksCi0JCQkJCSB1OCB0b3MsIHU4IHR5cGUsCi0JCQkJCSB1MzIgbmxmbGFncywgdTMyIHRiX2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBzd2l0Y2hkZXZfZmliX2lwdjRfZGVsKHUzMiBkc3QsIGludCBkc3RfbGVuLAotCQkJCQkgc3RydWN0IGZpYl9pbmZvICpmaSwKLQkJCQkJIHU4IHRvcywgdTggdHlwZSwgdTMyIHRiX2lkKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3dpdGNoZGV2X2ZpYl9pcHY0X2Fib3J0KHN0cnVjdCBmaWJfaW5mbyAqZmkpCi17Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IHN3aXRjaGRldl9wb3J0X2ZkYl9hZGQoc3RydWN0IG5kbXNnICpuZG0sIHN0cnVjdCBubGF0dHIgKnRiW10sCiAJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwKQEAgLTM0MiwxNSArMzAyLDkgQEAKIAkJCQkJICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCiAJCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwKLQkJCQkJICBpbnQgaWR4KQorCQkJCQkgIGludCAqaWR4KQogewotICAgICAgIHJldHVybiBpZHg7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19zZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpncm91cF9kZXYsCi0JCQkJCSAgICAgICBib29sIGpvaW5pbmcpCi17CisgICAgICAgcmV0dXJuICppZHg7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBzd2l0Y2hkZXZfcG9ydF9zYW1lX3BhcmVudF9pZChzdHJ1Y3QgbmV0X2RldmljZSAqYSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjX2FjdC90Y19pZmUuaCBiL2luY2x1ZGUvbmV0L3RjX2FjdC90Y19pZmUuaAppbmRleCA1MTY0YmQ3Li45ZmQyYmVhMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX2lmZS5oCisrKyBiL2luY2x1ZGUvbmV0L3RjX2FjdC90Y19pZmUuaApAQCAtNTAsOSArNTAsMTEgQEAKIGludCBpZmVfYWxsb2NfbWV0YV91MzIoc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pLCB2b2lkICptZXRhdmFsLCBnZnBfdCBnZnApOwogaW50IGlmZV9hbGxvY19tZXRhX3UxNihzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqbWksIHZvaWQgKm1ldGF2YWwsIGdmcF90IGdmcCk7CiBpbnQgaWZlX2NoZWNrX21ldGFfdTMyKHUzMiBtZXRhdmFsLCBzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqbWkpOworaW50IGlmZV9jaGVja19tZXRhX3UxNih1MTYgbWV0YXZhbCwgc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pKTsKIGludCBpZmVfZW5jb2RlX21ldGFfdTMyKHUzMiBtZXRhdmFsLCB2b2lkICpza2JkYXRhLCBzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqbWkpOwogaW50IGlmZV92YWxpZGF0ZV9tZXRhX3UzMih2b2lkICp2YWwsIGludCBsZW4pOwogaW50IGlmZV92YWxpZGF0ZV9tZXRhX3UxNih2b2lkICp2YWwsIGludCBsZW4pOworaW50IGlmZV9lbmNvZGVfbWV0YV91MTYodTE2IG1ldGF2YWwsIHZvaWQgKnNrYmRhdGEsIHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICptaSk7CiB2b2lkIGlmZV9yZWxlYXNlX21ldGFfZ2VuKHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICptaSk7CiBpbnQgcmVnaXN0ZXJfaWZlX29wKHN0cnVjdCB0Y2ZfbWV0YV9vcHMgKm1vcHMpOwogaW50IHVucmVnaXN0ZXJfaWZlX29wKHN0cnVjdCB0Y2ZfbWV0YV9vcHMgKm1vcHMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3NrYm1vZC5oIGIvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3NrYm1vZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NGEyMTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfc2tibW9kLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgSmFtYWwgSGFkaSBTYWxpbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqLworCisjaWZuZGVmIF9fTkVUX1RDX1NLQk1PRF9ICisjZGVmaW5lIF9fTkVUX1RDX1NLQk1PRF9ICisKKyNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y19za2Jtb2QuaD4KKworc3RydWN0IHRjZl9za2Jtb2RfcGFyYW1zIHsKKwlzdHJ1Y3QgcmN1X2hlYWQJcmN1OworCXU2NAlmbGFnczsgLyp1cCB0byA2NCB0eXBlcyBvZiBvcGVyYXRpb25zOyBleHRlbmQgaWYgbmVlZGVkICovCisJdTgJZXRoX2RzdFtFVEhfQUxFTl07CisJdTE2CWV0aF90eXBlOworCXU4CWV0aF9zcmNbRVRIX0FMRU5dOworfTsKKworc3RydWN0IHRjZl9za2Jtb2QgeworCXN0cnVjdCB0Y19hY3Rpb24JY29tbW9uOworCXN0cnVjdCB0Y2Zfc2tibW9kX3BhcmFtcyBfX3JjdSAqc2tibW9kX3A7Cit9OworI2RlZmluZSB0b19za2Jtb2QoYSkgKChzdHJ1Y3QgdGNmX3NrYm1vZCAqKWEpCisKKyNlbmRpZiAvKiBfX05FVF9UQ19TS0JNT0RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3R1bm5lbF9rZXkuaCBiL2luY2x1ZGUvbmV0L3RjX2FjdC90Y190dW5uZWxfa2V5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUzZjhkYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L3RjX2FjdC90Y190dW5uZWxfa2V5LmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgQW1pciBWYWRhaSA8YW1pckB2YWRhaS5tZT4KKyAqIENvcHlyaWdodCAoYykgMjAxNiwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfX05FVF9UQ19UVU5ORUxfS0VZX0gKKyNkZWZpbmUgX19ORVRfVENfVFVOTkVMX0tFWV9ICisKKyNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorCitzdHJ1Y3QgdGNmX3R1bm5lbF9rZXlfcGFyYW1zIHsKKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKKwlpbnQJCQl0Y2Z0X2FjdGlvbjsKKwlpbnQJCQlhY3Rpb247CisJc3RydWN0IG1ldGFkYXRhX2RzdCAgICAgKnRjZnRfZW5jX21ldGFkYXRhOworfTsKKworc3RydWN0IHRjZl90dW5uZWxfa2V5IHsKKwlzdHJ1Y3QgdGNfYWN0aW9uCSAgICAgIGNvbW1vbjsKKwlzdHJ1Y3QgdGNmX3R1bm5lbF9rZXlfcGFyYW1zIF9fcmN1ICpwYXJhbXM7Cit9OworCisjZGVmaW5lIHRvX3R1bm5lbF9rZXkoYSkgKChzdHJ1Y3QgdGNmX3R1bm5lbF9rZXkgKilhKQorCisjZW5kaWYgLyogX19ORVRfVENfVFVOTkVMX0tFWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y19hY3QvdGNfdmxhbi5oIGIvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX3ZsYW4uaAppbmRleCBlMjlmNTJlLi40OGNjYTMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC90Y19hY3QvdGNfdmxhbi5oCisrKyBiL2luY2x1ZGUvbmV0L3RjX2FjdC90Y192bGFuLmgKQEAgLTExLDYgKzExLDcgQEAKICNkZWZpbmUgX19ORVRfVENfVkxBTl9ICiAKICNpbmNsdWRlIDxuZXQvYWN0X2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3RjX2FjdC90Y192bGFuLmg+CiAKICNkZWZpbmUgVkxBTl9GX1BPUAkJMHgxCiAjZGVmaW5lIFZMQU5fRl9QVVNICQkweDIKQEAgLTIwLDcgKzIxLDMyIEBACiAJaW50CQkJdGNmdl9hY3Rpb247CiAJdTE2CQkJdGNmdl9wdXNoX3ZpZDsKIAlfX2JlMTYJCQl0Y2Z2X3B1c2hfcHJvdG87CisJdTgJCQl0Y2Z2X3B1c2hfcHJpbzsKIH07CiAjZGVmaW5lIHRvX3ZsYW4oYSkgKChzdHJ1Y3QgdGNmX3ZsYW4gKilhKQogCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfdGNmX3ZsYW4oY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYSkKK3sKKyNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKKwlpZiAoYS0+b3BzICYmIGEtPm9wcy0+dHlwZSA9PSBUQ0FfQUNUX1ZMQU4pCisJCXJldHVybiB0cnVlOworI2VuZGlmCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB0Y2Zfdmxhbl9hY3Rpb24oY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYSkKK3sKKwlyZXR1cm4gdG9fdmxhbihhKS0+dGNmdl9hY3Rpb247Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IHRjZl92bGFuX3B1c2hfdmlkKGNvbnN0IHN0cnVjdCB0Y19hY3Rpb24gKmEpCit7CisJcmV0dXJuIHRvX3ZsYW4oYSktPnRjZnZfcHVzaF92aWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19iZTE2IHRjZl92bGFuX3B1c2hfcHJvdG8oY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYSkKK3sKKwlyZXR1cm4gdG9fdmxhbihhKS0+dGNmdl9wdXNoX3Byb3RvOworfQorCiAjZW5kaWYgLyogX19ORVRfVENfVkxBTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y3AuaCBiL2luY2x1ZGUvbmV0L3RjcC5oCmluZGV4IGMwMGU3ZDUuLmY4M2I3ZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RjcC5oCisrKyBiL2luY2x1ZGUvbmV0L3RjcC5oCkBAIC0yMjcsMTAgKzIyNyw5IEBACiAjZGVmaW5lCVRGT19TRVJWRVJfQ09PS0lFX05PVF9SRVFECTB4MjAwCiAKIC8qIEZvcmNlIGVuYWJsZSBURk8gb24gYWxsIGxpc3RlbmVycywgaS5lLiwgbm90IHJlcXVpcmluZyB0aGUKLSAqIFRDUF9GQVNUT1BFTiBzb2NrZXQgb3B0aW9uLiBTT0NLT1BUMS8yIGRldGVybWluZSBob3cgdG8gc2V0IG1heF9xbGVuLgorICogVENQX0ZBU1RPUEVOIHNvY2tldCBvcHRpb24uCiAgKi8KICNkZWZpbmUJVEZPX1NFUlZFUl9XT19TT0NLT1BUMQkweDQwMAotI2RlZmluZQlURk9fU0VSVkVSX1dPX1NPQ0tPUFQyCTB4ODAwCiAKIGV4dGVybiBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgdGNwX2RlYXRoX3JvdzsKIApAQCAtNTM0LDYgKzUzMyw4IEBACiAjZW5kaWYKIC8qIHRjcF9vdXRwdXQuYyAqLwogCit1MzIgdGNwX3Rzb19hdXRvc2l6ZShjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBtc3Nfbm93LAorCQkgICAgIGludCBtaW5fdHNvX3NlZ3MpOwogdm9pZCBfX3RjcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IGN1cl9tc3MsCiAJCQkgICAgICAgaW50IG5vbmFnbGUpOwogYm9vbCB0Y3BfbWF5X3NlbmRfbm93KHN0cnVjdCBzb2NrICpzayk7CkBAIC02MDQsOCArNjA1LDYgQEAKIHZvaWQgdGNwX2dldF9pbmZvKHN0cnVjdCBzb2NrICosIHN0cnVjdCB0Y3BfaW5mbyAqKTsKIAogLyogUmVhZCAnc2VuZGZpbGUoKSctc3R5bGUgZnJvbSBhIFRDUCBzb2NrZXQgKi8KLXR5cGVkZWYgaW50ICgqc2tfcmVhZF9hY3Rvcl90KShyZWFkX2Rlc2NyaXB0b3JfdCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLAotCQkJCXVuc2lnbmVkIGludCwgc2l6ZV90KTsKIGludCB0Y3BfcmVhZF9zb2NrKHN0cnVjdCBzb2NrICpzaywgcmVhZF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAJCSAgc2tfcmVhZF9hY3Rvcl90IHJlY3ZfYWN0b3IpOwogCkBAIC02NDMsNyArNjQyLDcgQEAKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAotCWlmIChza2JfcXVldWVfZW1wdHkoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpICYmCisJaWYgKFJCX0VNUFRZX1JPT1QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpICYmCiAJICAgIHRwLT5yY3Zfd25kICYmCiAJICAgIGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPCBzay0+c2tfcmN2YnVmICYmCiAJICAgICF0cC0+dXJnX2RhdGEpCkBAIC02NzQsNyArNjczLDcgQEAKIC8qIE1pbmltdW0gUlRUIGluIHVzZWMuIH4wIG1lYW5zIG5vdCBhdmFpbGFibGUuICovCiBzdGF0aWMgaW5saW5lIHUzMiB0Y3BfbWluX3J0dChjb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewotCXJldHVybiB0cC0+cnR0X21pblswXS5ydHQ7CisJcmV0dXJuIG1pbm1heF9nZXQoJnRwLT5ydHRfbWluKTsKIH0KIAogLyogQ29tcHV0ZSB0aGUgYWN0dWFsIHJlY2VpdmUgd2luZG93IHdlIGFyZSBjdXJyZW50bHkgYWR2ZXJ0aXNpbmcuCkBAIC03NjYsOCArNzY1LDE2IEBACiAJX191MzIJCWFja19zZXE7CS8qIFNlcXVlbmNlIG51bWJlciBBQ0snZAkqLwogCXVuaW9uIHsKIAkJc3RydWN0IHsKLQkJCS8qIFRoZXJlIGlzIHNwYWNlIGZvciB1cCB0byAyMCBieXRlcyAqLwotCQkJX191MzIgaW5fZmxpZ2h0Oy8qIEJ5dGVzIGluIGZsaWdodCB3aGVuIHBhY2tldCBzZW50ICovCisJCQkvKiBUaGVyZSBpcyBzcGFjZSBmb3IgdXAgdG8gMjQgYnl0ZXMgKi8KKwkJCV9fdTMyIGluX2ZsaWdodDozMCwvKiBCeXRlcyBpbiBmbGlnaHQgYXQgdHJhbnNtaXQgKi8KKwkJCSAgICAgIGlzX2FwcF9saW1pdGVkOjEsIC8qIGN3bmQgbm90IGZ1bGx5IHVzZWQ/ICovCisJCQkgICAgICB1bnVzZWQ6MTsKKwkJCS8qIHBrdHMgUy9BQ0tlZCBzbyBmYXIgdXBvbiB0eCBvZiBza2IsIGluY2wgcmV0cmFuczogKi8KKwkJCV9fdTMyIGRlbGl2ZXJlZDsKKwkJCS8qIHN0YXJ0IG9mIHNlbmQgcGlwZWxpbmUgcGhhc2UgKi8KKwkJCXN0cnVjdCBza2JfbXN0YW1wIGZpcnN0X3R4X21zdGFtcDsKKwkJCS8qIHdoZW4gd2UgcmVhY2hlZCB0aGUgImRlbGl2ZXJlZCIgY291bnQgKi8KKwkJCXN0cnVjdCBza2JfbXN0YW1wIGRlbGl2ZXJlZF9tc3RhbXA7CiAJCX0gdHg7ICAgLyogb25seSB1c2VkIGZvciBvdXRnb2luZyBza2JzICovCiAJCXVuaW9uIHsKIAkJCXN0cnVjdCBpbmV0X3NrYl9wYXJtCWg0OwpAQCAtODYzLDYgKzg3MCwyNyBAQAogCXUzMiBpbl9mbGlnaHQ7CiB9OwogCisvKiBBIHJhdGUgc2FtcGxlIG1lYXN1cmVzIHRoZSBudW1iZXIgb2YgKG9yaWdpbmFsL3JldHJhbnNtaXR0ZWQpIGRhdGEKKyAqIHBhY2tldHMgZGVsaXZlcmVkICJkZWxpdmVyZWQiIG92ZXIgYW4gaW50ZXJ2YWwgb2YgdGltZSAiaW50ZXJ2YWxfdXMiLgorICogVGhlIHRjcF9yYXRlLmMgY29kZSBmaWxscyBpbiB0aGUgcmF0ZSBzYW1wbGUsIGFuZCBjb25nZXN0aW9uCisgKiBjb250cm9sIG1vZHVsZXMgdGhhdCBkZWZpbmUgYSBjb25nX2NvbnRyb2wgZnVuY3Rpb24gdG8gcnVuIGF0IHRoZSBlbmQKKyAqIG9mIEFDSyBwcm9jZXNzaW5nIGNhbiBvcHRpb25hbGx5IGNob3NlIHRvIGNvbnN1bHQgdGhpcyBzYW1wbGUgd2hlbgorICogc2V0dGluZyBjd25kIGFuZCBwYWNpbmcgcmF0ZS4KKyAqIEEgc2FtcGxlIGlzIGludmFsaWQgaWYgImRlbGl2ZXJlZCIgb3IgImludGVydmFsX3VzIiBpcyBuZWdhdGl2ZS4KKyAqLworc3RydWN0IHJhdGVfc2FtcGxlIHsKKwlzdHJ1Y3QJc2tiX21zdGFtcCBwcmlvcl9tc3RhbXA7IC8qIHN0YXJ0aW5nIHRpbWVzdGFtcCBmb3IgaW50ZXJ2YWwgKi8KKwl1MzIgIHByaW9yX2RlbGl2ZXJlZDsJLyogdHAtPmRlbGl2ZXJlZCBhdCAicHJpb3JfbXN0YW1wIiAqLworCXMzMiAgZGVsaXZlcmVkOwkJLyogbnVtYmVyIG9mIHBhY2tldHMgZGVsaXZlcmVkIG92ZXIgaW50ZXJ2YWwgKi8KKwlsb25nIGludGVydmFsX3VzOwkvKiB0aW1lIGZvciB0cC0+ZGVsaXZlcmVkIHRvIGluY3IgImRlbGl2ZXJlZCIgKi8KKwlsb25nIHJ0dF91czsJCS8qIFJUVCBvZiBsYXN0IChTKUFDS2VkIHBhY2tldCAob3IgLTEpICovCisJaW50ICBsb3NzZXM7CQkvKiBudW1iZXIgb2YgcGFja2V0cyBtYXJrZWQgbG9zdCB1cG9uIEFDSyAqLworCXUzMiAgYWNrZWRfc2Fja2VkOwkvKiBudW1iZXIgb2YgcGFja2V0cyBuZXdseSAoUylBQ0tlZCB1cG9uIEFDSyAqLworCXUzMiAgcHJpb3JfaW5fZmxpZ2h0OwkvKiBpbiBmbGlnaHQgYmVmb3JlIHRoaXMgQUNLICovCisJYm9vbCBpc19hcHBfbGltaXRlZDsJLyogaXMgc2FtcGxlIGZyb20gcGFja2V0IHdpdGggYnViYmxlIGluIHBpcGU/ICovCisJYm9vbCBpc19yZXRyYW5zOwkvKiBpcyBzYW1wbGUgZnJvbSByZXRyYW5zbWlzc2lvbj8gKi8KK307CisKIHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAl1MzIga2V5OwpAQCAtODg3LDYgKzkxNSwxNCBAQAogCXUzMiAgKCp1bmRvX2N3bmQpKHN0cnVjdCBzb2NrICpzayk7CiAJLyogaG9vayBmb3IgcGFja2V0IGFjayBhY2NvdW50aW5nIChvcHRpb25hbCkgKi8KIAl2b2lkICgqcGt0c19hY2tlZCkoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3QgYWNrX3NhbXBsZSAqc2FtcGxlKTsKKwkvKiBzdWdnZXN0IG51bWJlciBvZiBzZWdtZW50cyBmb3IgZWFjaCBza2IgdG8gdHJhbnNtaXQgKG9wdGlvbmFsKSAqLworCXUzMiAoKnRzb19zZWdzX2dvYWwpKHN0cnVjdCBzb2NrICpzayk7CisJLyogcmV0dXJucyB0aGUgbXVsdGlwbGllciB1c2VkIGluIHRjcF9zbmRidWZfZXhwYW5kIChvcHRpb25hbCkgKi8KKwl1MzIgKCpzbmRidWZfZXhwYW5kKShzdHJ1Y3Qgc29jayAqc2spOworCS8qIGNhbGwgd2hlbiBwYWNrZXRzIGFyZSBkZWxpdmVyZWQgdG8gdXBkYXRlIGN3bmQgYW5kIHBhY2luZyByYXRlLAorCSAqIGFmdGVyIGFsbCB0aGUgY2Ffc3RhdGUgcHJvY2Vzc2luZy4gKG9wdGlvbmFsKQorCSAqLworCXZvaWQgKCpjb25nX2NvbnRyb2wpKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycyk7CiAJLyogZ2V0IGluZm8gZm9yIGluZXRfZGlhZyAob3B0aW9uYWwpICovCiAJc2l6ZV90ICgqZ2V0X2luZm8pKHN0cnVjdCBzb2NrICpzaywgdTMyIGV4dCwgaW50ICphdHRyLAogCQkJICAgdW5pb24gdGNwX2NjX2luZm8gKmluZm8pOwpAQCAtOTQ5LDYgKzk4NSwxNCBAQAogCQlpY3NrLT5pY3NrX2NhX29wcy0+Y3duZF9ldmVudChzaywgZXZlbnQpOwogfQogCisvKiBGcm9tIHRjcF9yYXRlLmMgKi8KK3ZvaWQgdGNwX3JhdGVfc2tiX3NlbnQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgdGNwX3JhdGVfc2tiX2RlbGl2ZXJlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgc3RydWN0IHJhdGVfc2FtcGxlICpycyk7Cit2b2lkIHRjcF9yYXRlX2dlbihzdHJ1Y3Qgc29jayAqc2ssIHUzMiBkZWxpdmVyZWQsIHUzMiBsb3N0LAorCQkgIHN0cnVjdCBza2JfbXN0YW1wICpub3csIHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpOwordm9pZCB0Y3BfcmF0ZV9jaGVja19hcHBfbGltaXRlZChzdHJ1Y3Qgc29jayAqc2spOworCiAvKiBUaGVzZSBmdW5jdGlvbnMgZGV0ZXJtaW5lIGhvdyB0aGUgY3VycmVudCBmbG93IGJlaGF2ZXMgaW4gcmVzcGVjdCBvZiBTQUNLCiAgKiBoYW5kbGluZy4gU0FDSyBpcyBuZWdvdGlhdGVkIHdpdGggdGhlIHBlZXIsIGFuZCB0aGVyZWZvcmUgaXQgY2FuIHZhcnkKICAqIGJldHdlZW4gZGlmZmVyZW50IGZsb3dzLgpAQCAtMTE2NCw2ICsxMjA4LDcgQEAKIH0KIAogYm9vbCB0Y3BfcHJlcXVldWUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2Jvb2wgdGNwX2FkZF9iYWNrbG9nKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKICN1bmRlZiBTVEFURV9UUkFDRQogCkBAIC0xNTIzLDYgKzE1NjgsOCBAQAogewogCWlmIChzay0+c2tfc2VuZF9oZWFkID09IHNrYl91bmxpbmtlZCkKIAkJc2stPnNrX3NlbmRfaGVhZCA9IE5VTEw7CisJaWYgKHRjcF9zayhzayktPmhpZ2hlc3Rfc2FjayA9PSBza2JfdW5saW5rZWQpCisJCXRjcF9zayhzayktPmhpZ2hlc3Rfc2FjayA9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0Y3BfaW5pdF9zZW5kX2hlYWQoc3RydWN0IHNvY2sgKnNrKQpAQCAtMTg1MSw2ICsxODk4LDggQEAKIAlyZXR1cm4gYW5zdzsKIH0KIAoraW50IHRjcF9wZWVrX2xlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKKwogc3RhdGljIGlubGluZSB2b2lkIHRjcF9zZWdzX2luKHN0cnVjdCB0Y3Bfc29jayAqdHAsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdTE2IHNlZ3NfaW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC91ZHAuaCBiL2luY2x1ZGUvbmV0L3VkcC5oCmluZGV4IDg4OTRkNzEuLmVhNTNhODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3VkcC5oCisrKyBiL2luY2x1ZGUvbmV0L3VkcC5oCkBAIC0yNTEsNiArMjUxLDcgQEAKIAkJIGludCAoKnNhZGRyX2NtcCkoY29uc3Qgc3RydWN0IHNvY2sgKiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBzb2NrICopKTsKIHZvaWQgdWRwX2VycihzdHJ1Y3Qgc2tfYnVmZiAqLCB1MzIpOworaW50IHVkcF9hYm9ydChzdHJ1Y3Qgc29jayAqc2ssIGludCBlcnIpOwogaW50IHVkcF9zZW5kbXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKTsKIGludCB1ZHBfcHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2spOwogdm9pZCB1ZHBfZmx1c2hfcGVuZGluZ19mcmFtZXMoc3RydWN0IHNvY2sgKnNrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3Z4bGFuLmggYi9pbmNsdWRlL25ldC92eGxhbi5oCmluZGV4IGI5NmQwMzYuLjAyNTU2MTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3Z4bGFuLmgKKysrIGIvaW5jbHVkZS9uZXQvdnhsYW4uaApAQCAtMzUwLDI0ICszNTAsNiBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgX19iZTMyIHZ4bGFuX3R1bl9pZF90b192bmkoX19iZTY0IHR1bl9pZCkKLXsKLSNpZiBkZWZpbmVkKF9fQklHX0VORElBTikKLQlyZXR1cm4gKF9fZm9yY2UgX19iZTMyKXR1bl9pZDsKLSNlbHNlCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmUzMikoKF9fZm9yY2UgdTY0KXR1bl9pZCA+PiAzMik7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSBfX2JlNjQgdnhsYW5fdm5pX3RvX3R1bl9pZChfX2JlMzIgdm5pKQotewotI2lmIGRlZmluZWQoX19CSUdfRU5ESUFOKQotCXJldHVybiAoX19mb3JjZSBfX2JlNjQpdm5pOwotI2Vsc2UKLQlyZXR1cm4gKF9fZm9yY2UgX19iZTY0KSgodTY0KShfX2ZvcmNlIHUzMil2bmkgPDwgMzIpOwotI2VuZGlmCi19Ci0KIHN0YXRpYyBpbmxpbmUgc2l6ZV90IHZ4bGFuX3Jjb19zdGFydChfX2JlMzIgdm5pX2ZpZWxkKQogewogCXJldHVybiBiZTMyX3RvX2NwdSh2bmlfZmllbGQgJiBWWExBTl9SQ09fTUFTSykgPDwgVlhMQU5fUkNPX1NISUZUOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQveGZybS5oIGIvaW5jbHVkZS9uZXQveGZybS5oCmluZGV4IGFkZmViZDYuLjMxOTQ3YjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3hmcm0uaAorKysgYi9pbmNsdWRlL25ldC94ZnJtLmgKQEAgLTE4Nyw3ICsxODcsNyBAQAogCXN0cnVjdCB4ZnJtX3JlcGxheV9zdGF0ZV9lc24gKnByZXBsYXlfZXNuOwogCiAJLyogVGhlIGZ1bmN0aW9ucyBmb3IgcmVwbGF5IGRldGVjdGlvbi4gKi8KLQlzdHJ1Y3QgeGZybV9yZXBsYXkJKnJlcGw7CisJY29uc3Qgc3RydWN0IHhmcm1fcmVwbGF5ICpyZXBsOwogCiAJLyogaW50ZXJuYWwgZmxhZyB0aGF0IG9ubHkgaG9sZHMgc3RhdGUgZm9yIGRlbGF5ZWQgYWV2ZW50IGF0IHRoZQogCSAqIG1vbWVudApAQCAtMTU0MCw4ICsxNTQwLDEwIEBACiB2b2lkIHhmcm00X2xvY2FsX2Vycm9yKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBtdHUpOwogaW50IHhmcm02X2V4dHJhY3RfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpOwogaW50IHhmcm02X2V4dHJhY3RfaW5wdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpOwotaW50IHhmcm02X3Jjdl9zcGkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5leHRoZHIsIF9fYmUzMiBzcGkpOworaW50IHhmcm02X3Jjdl9zcGkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5leHRoZHIsIF9fYmUzMiBzcGksCisJCSAgc3RydWN0IGlwNl90bmwgKnQpOwogaW50IHhmcm02X3RyYW5zcG9ydF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGFzeW5jKTsKK2ludCB4ZnJtNl9yY3ZfdG5sKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcDZfdG5sICp0KTsKIGludCB4ZnJtNl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgeGZybTZfaW5wdXRfYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsCiAJCSAgICAgeGZybV9hZGRyZXNzX3QgKnNhZGRyLCB1OCBwcm90byk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3JkbWEvaWJfaGRycy5oIGIvaW5jbHVkZS9yZG1hL2liX2hkcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDg0MzlmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9yZG1hL2liX2hkcnMuaApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodChjKSAyMDE2IEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCisgKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCisgKgorICogR1BMIExJQ0VOU0UgU1VNTUFSWQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKiAgLSBOZWl0aGVyIHRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIElCX0hEUlNfSAorI2RlZmluZSBJQl9IRFJTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPHJkbWEvaWJfdmVyYnMuaD4KKworI2RlZmluZSBJQl9TRVFfTkFLCSgzIDw8IDI5KQorCisvKiBBRVRIIE5BSyBvcGNvZGUgdmFsdWVzICovCisjZGVmaW5lIElCX1JOUl9OQUsgICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBJQl9OQUtfUFNOX0VSUk9SICAgICAgICAgICAgICAgIDB4NjAKKyNkZWZpbmUgSUJfTkFLX0lOVkFMSURfUkVRVUVTVCAgICAgICAgICAweDYxCisjZGVmaW5lIElCX05BS19SRU1PVEVfQUNDRVNTX0VSUk9SICAgICAgMHg2MgorI2RlZmluZSBJQl9OQUtfUkVNT1RFX09QRVJBVElPTkFMX0VSUk9SIDB4NjMKKyNkZWZpbmUgSUJfTkFLX0lOVkFMSURfUkRfUkVRVUVTVCAgICAgICAweDY0CisKKyNkZWZpbmUgSUJfQlRIX1JFUV9BQ0sJCUJJVCgzMSkKKyNkZWZpbmUgSUJfQlRIX1NPTElDSVRFRAlCSVQoMjMpCisjZGVmaW5lIElCX0JUSF9NSUdfUkVRCQlCSVQoMjIpCisKKyNkZWZpbmUgSUJfR1JIX1ZFUlNJT04JCTYKKyNkZWZpbmUgSUJfR1JIX1ZFUlNJT05fTUFTSwkweEYKKyNkZWZpbmUgSUJfR1JIX1ZFUlNJT05fU0hJRlQJMjgKKyNkZWZpbmUgSUJfR1JIX1RDTEFTU19NQVNLCTB4RkYKKyNkZWZpbmUgSUJfR1JIX1RDTEFTU19TSElGVAkyMAorI2RlZmluZSBJQl9HUkhfRkxPV19NQVNLCTB4RkZGRkYKKyNkZWZpbmUgSUJfR1JIX0ZMT1dfU0hJRlQJMAorI2RlZmluZSBJQl9HUkhfTkVYVF9IRFIJCTB4MUIKKworc3RydWN0IGliX3JldGggeworCV9fYmU2NCB2YWRkcjsgICAgICAgIC8qIHBvdGVudGlhbGx5IHVuYWxpZ25lZCAqLworCV9fYmUzMiBya2V5OworCV9fYmUzMiBsZW5ndGg7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWJfYXRvbWljX2V0aCB7CisJX19iZTY0IHZhZGRyOyAgICAgICAgLyogcG90ZW50aWFsbHkgdW5hbGlnbmVkICovCisJX19iZTMyIHJrZXk7CisJX19iZTY0IHN3YXBfZGF0YTsgICAgLyogcG90ZW50aWFsbHkgdW5hbGlnbmVkICovCisJX19iZTY0IGNvbXBhcmVfZGF0YTsgLyogcG90ZW50aWFsbHkgdW5hbGlnbmVkICovCit9IF9fcGFja2VkOworCit1bmlvbiBpYl9laGRycyB7CisJc3RydWN0IHsKKwkJX19iZTMyIGRldGhbMl07CisJCV9fYmUzMiBpbW1fZGF0YTsKKwl9IHVkOworCXN0cnVjdCB7CisJCXN0cnVjdCBpYl9yZXRoIHJldGg7CisJCV9fYmUzMiBpbW1fZGF0YTsKKwl9IHJjOworCXN0cnVjdCB7CisJCV9fYmUzMiBhZXRoOworCQlfX2JlNjQgYXRvbWljX2Fja19ldGg7IC8qIHBvdGVudGlhbGx5IHVuYWxpZ25lZCAqLworCX0gX19wYWNrZWQgYXQ7CisJX19iZTMyIGltbV9kYXRhOworCV9fYmUzMiBhZXRoOworCV9fYmUzMiBpZXRoOworCXN0cnVjdCBpYl9hdG9taWNfZXRoIGF0b21pY19ldGg7Cit9ICBfX3BhY2tlZDsKKworc3RydWN0IGliX290aGVyX2hlYWRlcnMgeworCV9fYmUzMiBidGhbM107CisJdW5pb24gaWJfZWhkcnMgdTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpYl9oZWFkZXIgeworCV9fYmUxNiBscmhbNF07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGliX2dyaCBncmg7CisJCQlzdHJ1Y3QgaWJfb3RoZXJfaGVhZGVycyBvdGg7CisJCX0gbDsKKwkJc3RydWN0IGliX290aGVyX2hlYWRlcnMgb3RoOworCX0gdTsKK30gX19wYWNrZWQ7CisKKy8qIGFjY2Vzc29ycyBmb3IgdW5hbGlnbmVkIF9fYmU2NCBpdGVtcyAqLworCitzdGF0aWMgaW5saW5lIHU2NCBpYl91NjRfZ2V0KF9fYmU2NCAqcCkKK3sKKwlyZXR1cm4gZ2V0X3VuYWxpZ25lZF9iZTY0KHApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWJfdTY0X3B1dCh1NjQgdmFsLCBfX2JlNjQgKnApCit7CisJcHV0X3VuYWxpZ25lZF9iZTY0KHZhbCwgcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IGdldF9pYl9yZXRoX3ZhZGRyKHN0cnVjdCBpYl9yZXRoICpyZXRoKQoreworCXJldHVybiBpYl91NjRfZ2V0KCZyZXRoLT52YWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaWJfcmV0aF92YWRkcih1NjQgdmFsLCBzdHJ1Y3QgaWJfcmV0aCAqcmV0aCkKK3sKKwlpYl91NjRfcHV0KHZhbCwgJnJldGgtPnZhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1NjQgZ2V0X2liX2F0ZXRoX3ZhZGRyKHN0cnVjdCBpYl9hdG9taWNfZXRoICphdGV0aCkKK3sKKwlyZXR1cm4gaWJfdTY0X2dldCgmYXRldGgtPnZhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9pYl9hdGV0aF92YWRkcih1NjQgdmFsLCBzdHJ1Y3QgaWJfYXRvbWljX2V0aCAqYXRldGgpCit7CisJaWJfdTY0X3B1dCh2YWwsICZhdGV0aC0+dmFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBnZXRfaWJfYXRldGhfc3dhcChzdHJ1Y3QgaWJfYXRvbWljX2V0aCAqYXRldGgpCit7CisJcmV0dXJuIGliX3U2NF9nZXQoJmF0ZXRoLT5zd2FwX2RhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2liX2F0ZXRoX3N3YXAodTY0IHZhbCwgc3RydWN0IGliX2F0b21pY19ldGggKmF0ZXRoKQoreworCWliX3U2NF9wdXQodmFsLCAmYXRldGgtPnN3YXBfZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IGdldF9pYl9hdGV0aF9jb21wYXJlKHN0cnVjdCBpYl9hdG9taWNfZXRoICphdGV0aCkKK3sKKwlyZXR1cm4gaWJfdTY0X2dldCgmYXRldGgtPmNvbXBhcmVfZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaWJfYXRldGhfY29tcGFyZSh1NjQgdmFsLCBzdHJ1Y3QgaWJfYXRvbWljX2V0aCAqYXRldGgpCit7CisJaWJfdTY0X3B1dCh2YWwsICZhdGV0aC0+Y29tcGFyZV9kYXRhKTsKK30KKworI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJQl9IRFJTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmRtYS9yZG1hdnRfcXAuaCBiL2luY2x1ZGUvcmRtYS9yZG1hdnRfcXAuaAppbmRleCBiZDM0ZDBiLi4yYzUxODNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3JkbWEvcmRtYXZ0X3FwLmgKKysrIGIvaW5jbHVkZS9yZG1hL3JkbWF2dF9xcC5oCkBAIC00NjYsNiArNDY2LDI1IEBACiB9CiAKIC8qKgorICogcnZ0X2dldF9xcCAtIGdldCBhIFFQIHJlZmVyZW5jZQorICogQHFwIC0gdGhlIFFQIHRvIGhvbGQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJ2dF9nZXRfcXAoc3RydWN0IHJ2dF9xcCAqcXApCit7CisJYXRvbWljX2luYygmcXAtPnJlZmNvdW50KTsKK30KKworLyoqCisgKiBydnRfcHV0X3FwIC0gcmVsZWFzZSBhIFFQIHJlZmVyZW5jZQorICogQHFwIC0gdGhlIFFQIHRvIHJlbGVhc2UKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJ2dF9wdXRfcXAoc3RydWN0IHJ2dF9xcCAqcXApCit7CisJaWYgKHFwICYmIGF0b21pY19kZWNfYW5kX3Rlc3QoJnFwLT5yZWZjb3VudCkpCisJCXdha2VfdXAoJnFwLT53YWl0KTsKK30KKworLyoqCiAgKiBydnRfcXBfd3FlX3Jlc2VydmUgLSByZXNlcnZlIG9wZXJhdGlvbgogICogQHFwIC0gdGhlIHJ2dCBxcAogICogQHdxZSAtIHRoZSBzZW5kIHdxZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yeHJwYy9wYWNrZXQuaCBiL2luY2x1ZGUvcnhycGMvcGFja2V0LmgKaW5kZXggYjIwMTc0NC4uNzAzYTY0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yeHJwYy9wYWNrZXQuaAorKysgYi9pbmNsdWRlL3J4cnBjL3BhY2tldC5oCkBAIC0yNCw2ICsyNCw3IEBACiAgKi8KIHN0cnVjdCByeHJwY193aXJlX2hlYWRlciB7CiAJX19iZTMyCQllcG9jaDsJCS8qIGNsaWVudCBib290IHRpbWVzdGFtcCAqLworI2RlZmluZSBSWFJQQ19SQU5ET01fRVBPQ0gJMHg4MDAwMDAwMAkvKiBSYW5kb20gaWYgc2V0LCBkYXRlLWJhc2VkIGlmIG5vdCAqLwogCiAJX19iZTMyCQljaWQ7CQkvKiBjb25uZWN0aW9uIGFuZCBjaGFubmVsIElEICovCiAjZGVmaW5lIFJYUlBDX01BWENBTExTCQk0CQkJLyogbWF4IGFjdGl2ZSBjYWxscyBwZXIgY29ubiAqLwpAQCAtMzMsOCArMzQsNiBAQAogI2RlZmluZSBSWFJQQ19DSURfSU5DCQkoMSA8PCBSWFJQQ19DSURTSElGVCkJLyogY29ubmVjdGlvbiBJRCBpbmNyZW1lbnQgKi8KIAogCV9fYmUzMgkJY2FsbE51bWJlcjsJLyogY2FsbCBJRCAoMCBmb3IgY29ubmVjdGlvbi1sZXZlbCBwYWNrZXRzKSAqLwotI2RlZmluZSBSWFJQQ19QUk9DRVNTX01BWENBTExTCSgxPDwyKQkvKiBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgY2FsbHMgcGVyIGNvbm4gKHBvd2VyIG9mIDIpICovCi0KIAlfX2JlMzIJCXNlcTsJCS8qIHNlcXVlbmNlIG51bWJlciBvZiBwa3QgaW4gY2FsbCBzdHJlYW0gKi8KIAlfX2JlMzIJCXNlcmlhbDsJCS8qIHNlcmlhbCBudW1iZXIgb2YgcGt0IHNlbnQgdG8gbmV0d29yayAqLwogCkBAIC05MiwxMCArOTEsMTQgQEAKIHN0cnVjdCByeHJwY19qdW1ib19oZWFkZXIgewogCXVpbnQ4X3QJCWZsYWdzOwkJLyogcGFja2V0IGZsYWdzIChhcyBwZXIgcnhycGNfaGVhZGVyKSAqLwogCXVpbnQ4X3QJCXBhZDsKLQlfX2JlMTYJCV9yc3ZkOwkJLyogcmVzZXJ2ZWQgKHVzZWQgYnkga2VyYmVyb3Mgc2VjdXJpdHkgYXMgY2tzdW0pICovCisJdW5pb24geworCQlfX2JlMTYJX3JzdmQ7CQkvKiByZXNlcnZlZCAqLworCQlfX2JlMTYJY2tzdW07CQkvKiBrZXJiZXJvcyBzZWN1cml0eSBjaGVja3N1bSAqLworCX07CiB9OwogCiAjZGVmaW5lIFJYUlBDX0pVTUJPX0RBVEFMRU4JMTQxMgkvKiBub24tdGVybWluYWwganVtYm8gcGFja2V0IGRhdGEgbGVuZ3RoICovCisjZGVmaW5lIFJYUlBDX0pVTUJPX1NVQlBLVExFTgkoUlhSUENfSlVNQk9fREFUQUxFTiArIHNpemVvZihzdHJ1Y3QgcnhycGNfanVtYm9faGVhZGVyKSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoKQEAgLTEyMCw2ICsxMjMsNyBAQAogI2RlZmluZSBSWFJQQ19BQ0tfUElOR19SRVNQT05TRQkJNwkvKiByZXNwb25zZSB0byBSWFJQQ19BQ0tfUElORyAqLwogI2RlZmluZSBSWFJQQ19BQ0tfREVMQVkJCQk4CS8qIG5vdGhpbmcgaGFwcGVuZWQgc2luY2UgcmVjZWl2ZWQgcGFja2V0ICovCiAjZGVmaW5lIFJYUlBDX0FDS19JRExFCQkJOQkvKiBBQ0sgZHVlIHRvIGZ1bGx5IHJlY2VpdmVkIEFDSyB3aW5kb3cgKi8KKyNkZWZpbmUgUlhSUENfQUNLX19JTlZBTElECQkxMAkvKiBSZXByZXNlbnRhdGlvbiBvZiBpbnZhbGlkIEFDSyByZWFzb24gKi8KIAogCXVpbnQ4X3QJCW5BY2tzOwkJLyogbnVtYmVyIG9mIEFDS3MgKi8KICNkZWZpbmUgUlhSUENfTUFYQUNLUwkyNTUKQEAgLTEzMCw2ICsxMzQsMTMgQEAKIAogfSBfX3BhY2tlZDsKIAorLyogU29tZSBBQ0tzIHJlZmVyIHRvIHNwZWNpZmljIHBhY2tldHMgYW5kIHNvbWUgYXJlIGdlbmVyYWwgYW5kIGNhbiBiZSB1cGRhdGVkLiAqLworI2RlZmluZSBSWFJQQ19BQ0tfVVBEQVRFQUJMRSAoKDEgPDwgUlhSUENfQUNLX1JFUVVFU1RFRCkJfAlcCisJCQkgICAgICAoMSA8PCBSWFJQQ19BQ0tfUElOR19SRVNQT05TRSkJfAlcCisJCQkgICAgICAoMSA8PCBSWFJQQ19BQ0tfREVMQVkpCQl8CVwKKwkJCSAgICAgICgxIDw8IFJYUlBDX0FDS19JRExFKSkKKworCiAvKgogICogQUNLIHBhY2tldHMgY2FuIGhhdmUgYSBmdXJ0aGVyIHBpZWNlIG9mIGluZm9ybWF0aW9uIHRhZ2dlZCBvbiB0aGUgZW5kCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAppbmRleCAwZGVlN2FmLi43ZTRjZDUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCkBAIC03NzEsMTIgKzc3MSw5IEBACiAJCXNob3N0LT50bWZfaW5fcHJvZ3Jlc3M7CiB9CiAKLWV4dGVybiBib29sIHNjc2lfdXNlX2Jsa19tcTsKLQogc3RhdGljIGlubGluZSBib29sIHNob3N0X3VzZV9ibGtfbXEoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCiB7Ci0JcmV0dXJuIHNjc2lfdXNlX2Jsa19tcTsKLQorCXJldHVybiBzaG9zdC0+dXNlX2Jsa19tcTsKIH0KIAogZXh0ZXJuIGludCBzY3NpX3F1ZXVlX3dvcmsoc3RydWN0IFNjc2lfSG9zdCAqLCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmggYi9pbmNsdWRlL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmgKaW5kZXggMTNjMGIyYi4uNzNkODcwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5oCisrKyBiL2luY2x1ZGUvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuaApAQCAtMTEsMTIgKzExLDEyIEBACiBzdHJ1Y3QgcmVxdWVzdDsKIAogI2lmICFJU19FTkFCTEVEKENPTkZJR19TQ1NJX1NBU19BVFRSUykKLXN0YXRpYyBpbmxpbmUgaW50IGlzX3Nhc19hdHRhY2hlZChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCitzdGF0aWMgaW5saW5lIGludCBzY3NpX2lzX3Nhc19ycGh5KGNvbnN0IHN0cnVjdCBkZXZpY2UgKnNkZXYpCiB7CiAJcmV0dXJuIDA7CiB9CiAjZWxzZQotZXh0ZXJuIGludCBpc19zYXNfYXR0YWNoZWQoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KTsKK2V4dGVybiBpbnQgc2NzaV9pc19zYXNfcnBoeShjb25zdCBzdHJ1Y3QgZGV2aWNlICopOwogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgaW50IHNhc19wcm90b2NvbF9hdGEoZW51bSBzYXNfcHJvdG9jb2wgcHJvdG8pCkBAIC0yMDIsNyArMjAyLDYgQEAKIGV4dGVybiB2b2lkIHNhc19ycGh5X3JlbW92ZShzdHJ1Y3Qgc2FzX3JwaHkgKik7CiBleHRlcm4gdm9pZCBzYXNfcnBoeV9kZWxldGUoc3RydWN0IHNhc19ycGh5ICopOwogZXh0ZXJuIHZvaWQgc2FzX3JwaHlfdW5saW5rKHN0cnVjdCBzYXNfcnBoeSAqKTsKLWV4dGVybiBpbnQgc2NzaV9pc19zYXNfcnBoeShjb25zdCBzdHJ1Y3QgZGV2aWNlICopOwogCiBzdHJ1Y3Qgc2FzX3BvcnQgKnNhc19wb3J0X2FsbG9jKHN0cnVjdCBkZXZpY2UgKiwgaW50KTsKIHN0cnVjdCBzYXNfcG9ydCAqc2FzX3BvcnRfYWxsb2NfbnVtKHN0cnVjdCBkZXZpY2UgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvYy9hdDkxL2F0bWVsLXNmci5oIGIvaW5jbHVkZS9zb2MvYXQ5MS9hdG1lbC1zZnIuaAppbmRleCAyZjliYjk4Li41MDZlYThmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvYy9hdDkxL2F0bWVsLXNmci5oCisrKyBiL2luY2x1ZGUvc29jL2F0OTEvYXRtZWwtc2ZyLmgKQEAgLTEzLDYgKzEzLDIwIEBACiAjaWZuZGVmIF9MSU5VWF9NRkRfU1lTQ09OX0FUTUVMX1NGUl9ICiAjZGVmaW5lIF9MSU5VWF9NRkRfU1lTQ09OX0FUTUVMX1NGUl9ICiAKKyNkZWZpbmUgQVQ5MV9TRlJfRERSQ0ZHCQkweDA0CS8qIEREUiBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisvKiAweDA4IH4gMHgwYzogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQVQ5MV9TRlJfT0hDSUlDUgkweDEwCS8qIE9IQ0kgSU5UIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9TRlJfT0hDSUlTUgkweDE0CS8qIE9IQ0kgSU5UIFN0YXR1cyBSZWdpc3RlciAqLwogI2RlZmluZSBBVDkxX1NGUl9JMlNDTEtTRUwJMHg5MAkvKiBJMlNDIFJlZ2lzdGVyICovCiAKKy8qIEZpZWxkIGRlZmluaXRpb25zICovCisjZGVmaW5lIEFUOTFfT0hDSUlDUl9TVVNQRU5EX0EJQklUKDgpCisjZGVmaW5lIEFUOTFfT0hDSUlDUl9TVVNQRU5EX0IJQklUKDkpCisjZGVmaW5lIEFUOTFfT0hDSUlDUl9TVVNQRU5EX0MJQklUKDEwKQorCisjZGVmaW5lIEFUOTFfT0hDSUlDUl9VU0JfU1VTUEVORAkoQVQ5MV9PSENJSUNSX1NVU1BFTkRfQSB8IFwKKwkJCQkJIEFUOTFfT0hDSUlDUl9TVVNQRU5EX0IgfCBcCisJCQkJCSBBVDkxX09IQ0lJQ1JfU1VTUEVORF9DKQorCisKICNlbmRpZiAvKiBfTElOVVhfTUZEX1NZU0NPTl9BVE1FTF9TRlJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb2Mvcm9ja2NoaXAvcm9ja2NoaXBfc2lwLmggYi9pbmNsdWRlL3NvYy9yb2NrY2hpcC9yb2NrY2hpcF9zaXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTI4MDkyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb2Mvcm9ja2NoaXAvcm9ja2NoaXBfc2lwLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgRnV6aG91IFJvY2tjaGlwIEVsZWN0cm9uaWNzIENvLiwgTHRkCisgKiBBdXRob3I6IExpbiBIdWFuZyA8aGxAcm9jay1jaGlwcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICovCisjaWZuZGVmIF9fU09DX1JPQ0tDSElQX1NJUF9ICisjZGVmaW5lIF9fU09DX1JPQ0tDSElQX1NJUF9ICisKKyNkZWZpbmUgUk9DS0NISVBfU0lQX0RSQU1fRlJFUQkJCTB4ODIwMDAwMDgKKyNkZWZpbmUgUk9DS0NISVBfU0lQX0NPTkZJR19EUkFNX0lOSVQJCTB4MDAKKyNkZWZpbmUgUk9DS0NISVBfU0lQX0NPTkZJR19EUkFNX1NFVF9SQVRFCTB4MDEKKyNkZWZpbmUgUk9DS0NISVBfU0lQX0NPTkZJR19EUkFNX1JPVU5EX1JBVEUJMHgwMgorI2RlZmluZSBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fU0VUX0FUX1NSCTB4MDMKKyNkZWZpbmUgUk9DS0NISVBfU0lQX0NPTkZJR19EUkFNX0dFVF9CVwkJMHgwNAorI2RlZmluZSBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fR0VUX1JBVEUJMHgwNQorI2RlZmluZSBST0NLQ0hJUF9TSVBfQ09ORklHX0RSQU1fQ0xSX0lSUQkweDA2CisjZGVmaW5lIFJPQ0tDSElQX1NJUF9DT05GSUdfRFJBTV9TRVRfUEFSQU0JMHgwNworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvZGE3MjE5LmggYi9pbmNsdWRlL3NvdW5kL2RhNzIxOS5oCmluZGV4IDAyODc2YWMuLjQwOWVmMTM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2RhNzIxOS5oCisrKyBiL2luY2x1ZGUvc291bmQvZGE3MjE5LmgKQEAgLTM0LDYgKzM0LDggQEAKIHN0cnVjdCBkYTcyMTlfYWFkX3BkYXRhOwogCiBzdHJ1Y3QgZGE3MjE5X3BkYXRhIHsKKwlib29sIHdha2V1cF9zb3VyY2U7CisKIAkvKiBNaWMgKi8KIAllbnVtIGRhNzIxOV9taWNiaWFzX3ZvbHRhZ2UgbWljYmlhc19sdmw7CiAJZW51bSBkYTcyMTlfbWljX2FtcF9pbl9zZWwgbWljX2FtcF9pbl9zZWw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2hkYV9yZWdpc3Rlci5oIGIvaW5jbHVkZS9zb3VuZC9oZGFfcmVnaXN0ZXIuaAppbmRleCBmZjFhZWNmLi4wMDEzMDYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2hkYV9yZWdpc3Rlci5oCisrKyBiL2luY2x1ZGUvc291bmQvaGRhX3JlZ2lzdGVyLmgKQEAgLTg5LDYgKzg5LDE5IEBACiAjZGVmaW5lIEFaWF9SRUdfU0RfQkRMUEwJCTB4MTgKICNkZWZpbmUgQVpYX1JFR19TRF9CRExQVQkJMHgxYwogCisvKiBHVFMgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFaWF9SRUdfTExDSAkJCTB4MTQKKworI2RlZmluZSBBWlhfUkVHX0dUU19CQVNFCQkweDUyMAorCisjZGVmaW5lIEFaWF9SRUdfR1RTQ0MJKEFaWF9SRUdfR1RTX0JBU0UgKyAweDAwKQorI2RlZmluZSBBWlhfUkVHX1dBTEZDQwkoQVpYX1JFR19HVFNfQkFTRSArIDB4MDQpCisjZGVmaW5lIEFaWF9SRUdfVFNDQ0wJKEFaWF9SRUdfR1RTX0JBU0UgKyAweDA4KQorI2RlZmluZSBBWlhfUkVHX1RTQ0NVCShBWlhfUkVHX0dUU19CQVNFICsgMHgwQykKKyNkZWZpbmUgQVpYX1JFR19MTFBGT0MJKEFaWF9SRUdfR1RTX0JBU0UgKyAweDE0KQorI2RlZmluZSBBWlhfUkVHX0xMUENMCShBWlhfUkVHX0dUU19CQVNFICsgMHgxOCkKKyNkZWZpbmUgQVpYX1JFR19MTFBDVQkoQVpYX1JFR19HVFNfQkFTRSArIDB4MUMpCisKIC8qIEhhc3dlbGwvQnJvYWR3ZWxsIGRpc3BsYXkgSEQtQSBjb250cm9sbGVyIEV4dGVuZGVkIE1vZGUgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFaWF9SRUdfSFNXX0VNNAkJCTB4MTAwYwogI2RlZmluZSBBWlhfUkVHX0hTV19FTTUJCQkweDEwMTAKQEAgLTI0Miw2ICsyNTUsMjkgQEAKIC8qIEludGVydmFsIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBpdGVyYXRpbmcgcmVnaXN0ZXIgb2Zmc2V0ICovCiAjZGVmaW5lIEFaWF9EUlNNX0lOVEVSVkFMCQkweDA4CiAKKy8qIEdsb2JhbCB0aW1lIHN5bmNocm9uaXphdGlvbiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgR1RTQ0NfVFNDQ0RfTUFTSwkJMHg4MDAwMDAwMAorI2RlZmluZSBHVFNDQ19UU0NDRF9TSElGVAkJQklUKDMxKQorI2RlZmluZSBHVFNDQ19UU0NDSV9NQVNLCQkweDIwCisjZGVmaW5lIEdUU0NDX0NETUFTX0RNQV9ESVJfU0hJRlQJNAorCisjZGVmaW5lIFdBTEZDQ19DSUZfTUFTSwkJCTB4MUZGCisjZGVmaW5lIFdBTEZDQ19GTl9TSElGVAkJCTkKKyNkZWZpbmUgSERBX0NMS19DWUNMRVNfUEVSX0ZSQU1FCTUxMgorCisvKgorICogQW4gZXJyb3Igb2NjdXJzIG5lYXIgZnJhbWUgInJvbGxvdmVyIi4gVGhlIGNsb2NrcyBpbiBmcmFtZSB2YWx1ZSBpbmRpY2F0ZXMKKyAqIHdoZXRoZXIgdGhpcyBlcnJvciBtYXkgaGF2ZSBvY2N1cnJlZC4gSGVyZSB3ZSB1c2UgdGhlIHZhbHVlIG9mIDEwLiBQbGVhc2UKKyAqIHNlZSB0aGUgZXJyYXRhIGZvciB0aGUgcmlnaHQgbnVtYmVyIFs8MTBdCisgKi8KKyNkZWZpbmUgSERBX01BWF9DWUNMRV9WQUxVRQkJNDk5CisjZGVmaW5lIEhEQV9NQVhfQ1lDTEVfT0ZGU0VUCQkxMAorI2RlZmluZSBIREFfTUFYX0NZQ0xFX1JFQURfUkVUUlkJMTAKKworI2RlZmluZSBUU0NDVV9DQ1VfU0hJRlQJCQkzMgorI2RlZmluZSBMTFBDX0NDVV9TSElGVAkJCTMyCisKKwogLyoKICAqIGhlbHBlcnMgdG8gcmVhZCB0aGUgc3RyZWFtIHBvc2l0aW9uCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvaGRhdWRpby5oIGIvaW5jbHVkZS9zb3VuZC9oZGF1ZGlvLmgKaW5kZXggOTNlNjNjNS4uNTYwMDRlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9oZGF1ZGlvLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9oZGF1ZGlvLmgKQEAgLTI0NSw2ICsyNDUsMTIgQEAKIAogLyoKICAqIEhELWF1ZGlvIGJ1cyBiYXNlIGRyaXZlcgorICoKKyAqIEBwcGNhcDogcHAgY2FwYWJpbGl0aWVzIHBvaW50ZXIKKyAqIEBzcGJjYXA6IFNQSUIgY2FwYWJpbGl0aWVzIHBvaW50ZXIKKyAqIEBtbGNhcDogTXVsdGlMaW5rIGNhcGFiaWxpdGllcyBwb2ludGVyCisgKiBAZ3RzY2FwOiBndHMgY2FwYWJpbGl0aWVzIHBvaW50ZXIKKyAqIEBkcnNtY2FwOiBkbWEgcmVzdW1lIGNhcGFiaWxpdGllcyBwb2ludGVyCiAgKi8KIHN0cnVjdCBoZGFjX2J1cyB7CiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtMjU2LDYgKzI2MiwxMiBAQAogCXZvaWQgX19pb21lbSAqcmVtYXBfYWRkcjsKIAlpbnQgaXJxOwogCisJdm9pZCBfX2lvbWVtICpwcGNhcDsKKwl2b2lkIF9faW9tZW0gKnNwYmNhcDsKKwl2b2lkIF9faW9tZW0gKm1sY2FwOworCXZvaWQgX19pb21lbSAqZ3RzY2FwOworCXZvaWQgX19pb21lbSAqZHJzbWNhcDsKKwogCS8qIGNvZGVjIGxpbmtlZCBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBjb2RlY19saXN0OwogCXVuc2lnbmVkIGludCBudW1fY29kZWNzOwpAQCAtMzM1LDYgKzM0Nyw3IEBACiBpbnQgc25kX2hkYWNfYnVzX3NlbmRfY21kKHN0cnVjdCBoZGFjX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgdmFsKTsKIGludCBzbmRfaGRhY19idXNfZ2V0X3Jlc3BvbnNlKHN0cnVjdCBoZGFjX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgYWRkciwKIAkJCSAgICAgIHVuc2lnbmVkIGludCAqcmVzKTsKK2ludCBzbmRfaGRhY19idXNfcGFyc2VfY2FwYWJpbGl0aWVzKHN0cnVjdCBoZGFjX2J1cyAqYnVzKTsKIGludCBzbmRfaGRhY19saW5rX3Bvd2VyKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIGJvb2wgZW5hYmxlKTsKIAogYm9vbCBzbmRfaGRhY19idXNfaW5pdF9jaGlwKHN0cnVjdCBoZGFjX2J1cyAqYnVzLCBib29sIGZ1bGxfcmVzZXQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9oZGF1ZGlvX2V4dC5oIGIvaW5jbHVkZS9zb3VuZC9oZGF1ZGlvX2V4dC5oCmluZGV4IGI5NTkzYjIuLjg2NjBhN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvaGRhdWRpb19leHQuaAorKysgYi9pbmNsdWRlL3NvdW5kL2hkYXVkaW9fZXh0LmgKQEAgLTgsMTEgKzgsNiBAQAogICoKICAqIEBidXM6IGhkYWMgYnVzCiAgKiBAbnVtX3N0cmVhbXM6IHN0cmVhbXMgc3VwcG9ydGVkCi0gKiBAcHBjYXA6IHBwIGNhcGFiaWxpdGllcyBwb2ludGVyCi0gKiBAc3BiY2FwOiBTUElCIGNhcGFiaWxpdGllcyBwb2ludGVyCi0gKiBAbWxjYXA6IE11bHRpTGluayBjYXBhYmlsaXRpZXMgcG9pbnRlcgotICogQGd0c2NhcDogZ3RzIGNhcGFiaWxpdGllcyBwb2ludGVyCi0gKiBAZHJzbWNhcDogZG1hIHJlc3VtZSBjYXBhYmlsaXRpZXMgcG9pbnRlcgogICogQGhsaW5rX2xpc3Q6IGxpbmsgbGlzdCBvZiBIREEgbGlua3MKICAqIEBsb2NrOiBsb2NrIGZvciBsaW5rIG1nbXQKICAqIEBjbWRfZG1hX3N0YXRlOiBzdGF0ZSBvZiBjbWQgRE1BczogQ09SQiBhbmQgUklSQgpAQCAtMjIsMTIgKzE3LDYgQEAKIAlpbnQgbnVtX3N0cmVhbXM7CiAJaW50IGlkeDsKIAotCXZvaWQgX19pb21lbSAqcHBjYXA7Ci0Jdm9pZCBfX2lvbWVtICpzcGJjYXA7Ci0Jdm9pZCBfX2lvbWVtICptbGNhcDsKLQl2b2lkIF9faW9tZW0gKmd0c2NhcDsKLQl2b2lkIF9faW9tZW0gKmRyc21jYXA7Ci0KIAlzdHJ1Y3QgbGlzdF9oZWFkIGhsaW5rX2xpc3Q7CiAKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKQEAgLTU0LDcgKzQzLDYgQEAKICNkZWZpbmUgSERBX0NPREVDX0VYVF9FTlRSWShfdmlkLCBfcmV2aWQsIF9uYW1lLCBfZHJ2X2RhdGEpIFwKIAlIREFfQ09ERUNfUkVWX0VYVF9FTlRSWShfdmlkLCBfcmV2aWQsIF9uYW1lLCBfZHJ2X2RhdGEpCiAKLWludCBzbmRfaGRhY19leHRfYnVzX3BhcnNlX2NhcGFiaWxpdGllcyhzdHJ1Y3QgaGRhY19leHRfYnVzICpzYnVzKTsKIHZvaWQgc25kX2hkYWNfZXh0X2J1c19wcGNhcF9lbmFibGUoc3RydWN0IGhkYWNfZXh0X2J1cyAqY2hpcCwgYm9vbCBlbmFibGUpOwogdm9pZCBzbmRfaGRhY19leHRfYnVzX3BwY2FwX2ludF9lbmFibGUoc3RydWN0IGhkYWNfZXh0X2J1cyAqY2hpcCwgYm9vbCBlbmFibGUpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2wzLmggYi9pbmNsdWRlL3NvdW5kL2wzLmgKaW5kZXggNDIzYTA4Zi4uMTQ3MWRhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9sMy5oCisrKyBiL2luY2x1ZGUvc291bmQvbDMuaApAQCAtMiw5ICsyLDE1IEBACiAjZGVmaW5lIF9MM19IXyAxCiAKIHN0cnVjdCBsM19waW5zIHsKLQl2b2lkICgqc2V0ZGF0KShpbnQpOwotCXZvaWQgKCpzZXRjbGspKGludCk7Ci0Jdm9pZCAoKnNldG1vZGUpKGludCk7CisJdm9pZCAoKnNldGRhdCkoc3RydWN0IGwzX3BpbnMgKiwgaW50KTsKKwl2b2lkICgqc2V0Y2xrKShzdHJ1Y3QgbDNfcGlucyAqLCBpbnQpOworCXZvaWQgKCpzZXRtb2RlKShzdHJ1Y3QgbDNfcGlucyAqLCBpbnQpOworCisJaW50IGdwaW9fZGF0YTsKKwlpbnQgZ3Bpb19jbGs7CisJaW50IGdwaW9fbW9kZTsKKwlpbnQgdXNlX2dwaW9zOworCiAJaW50IGRhdGFfaG9sZDsKIAlpbnQgZGF0YV9zZXR1cDsKIAlpbnQgY2xvY2tfaGlnaDsKQEAgLTEzLDYgKzE5LDkgQEAKIAlpbnQgbW9kZV9zZXR1cDsKIH07CiAKK3N0cnVjdCBkZXZpY2U7CisKIGludCBsM193cml0ZShzdHJ1Y3QgbDNfcGlucyAqYWRhcCwgdTggYWRkciwgdTggKmRhdGEsIGludCBsZW4pOworaW50IGwzX3NldF9ncGlvX29wcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBsM19waW5zICphZGFwKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3J0NTY2MC5oIGIvaW5jbHVkZS9zb3VuZC9ydDU2NjAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjVmODNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9ydDU2NjAuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogbGludXgvc291bmQvcnQ1NjYwLmggLS0gUGxhdGZvcm0gZGF0YSBmb3IgUlQ1NjYwCisgKgorICogQ29weXJpZ2h0IDIwMTYgUmVhbHRlayBTZW1pY29uZHVjdG9yIENvcnAuCisgKiBBdXRob3I6IE9kZXIgQ2hpb3UgPG9kZXJfY2hpb3VAcmVhbHRlay5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfU05EX1JUNTY2MF9ICisjZGVmaW5lIF9fTElOVVhfU05EX1JUNTY2MF9ICisKK2VudW0gcnQ1NjYwX2RtaWMxX2RhdGFfcGluIHsKKwlSVDU2NjBfRE1JQzFfTlVMTCwKKwlSVDU2NjBfRE1JQzFfREFUQV9HUElPMiwKKwlSVDU2NjBfRE1JQzFfREFUQV9JTjFQLAorfTsKKworc3RydWN0IHJ0NTY2MF9wbGF0Zm9ybV9kYXRhIHsKKwkvKiBJTjEgJiBJTjMgY2FuIG9wdGlvbmFsbHkgYmUgZGlmZmVyZW50aWFsICovCisJYm9vbCBpbjFfZGlmZjsKKwlib29sIGluM19kaWZmOworCWJvb2wgdXNlX2xkbzI7CisJYm9vbCBwb3dlcm9mZl9jb2RlY19pbl9zdXNwZW5kOworCisJZW51bSBydDU2NjBfZG1pYzFfZGF0YV9waW4gZG1pYzFfZGF0YV9waW47Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvczNjMjR4eF91ZGExMzR4LmggYi9pbmNsdWRlL3NvdW5kL3MzYzI0eHhfdWRhMTM0eC5oCmluZGV4IDMzZGY0Y2IuLmZmYWYxZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvczNjMjR4eF91ZGExMzR4LmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zM2MyNHh4X3VkYTEzNHguaApAQCAtNyw3ICs3LDYgQEAKIAlpbnQgbDNfY2xrOwogCWludCBsM19tb2RlOwogCWludCBsM19kYXRhOwotCXZvaWQgKCpwb3dlcikgKGludCk7CiAJaW50IG1vZGVsOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zaW1wbGVfY2FyZF91dGlscy5oIGIvaW5jbHVkZS9zb3VuZC9zaW1wbGVfY2FyZF91dGlscy5oCmluZGV4IDg2MDg4YWUuLmZkNjQxMjU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkX3V0aWxzLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zaW1wbGVfY2FyZF91dGlscy5oCkBAIC0yNywxMCArMjcsNDUgQEAKIAkJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29kZWMsCiAJCQkJICBjaGFyICpwcmVmaXgsCiAJCQkJICB1bnNpZ25lZCBpbnQgKnJldGZtdCk7CitfX3ByaW50ZigzLCA0KQogaW50IGFzb2Nfc2ltcGxlX2NhcmRfc2V0X2RhaWxpbmtfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgICAgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rLAogCQkJCSAgICAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIGludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NhcmRfbmFtZShzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkLAogCQkJCSAgICAgY2hhciAqcHJlZml4KTsKIAorI2RlZmluZSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2Nsa19jcHUobm9kZSwgZGFpX2xpbmssIHNpbXBsZV9kYWkpCQlcCisJYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jbGsobm9kZSwgZGFpX2xpbmstPmNwdV9vZl9ub2RlLCBzaW1wbGVfZGFpKQorI2RlZmluZSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2Nsa19jb2RlYyhub2RlLCBkYWlfbGluaywgc2ltcGxlX2RhaSkJCVwKKwlhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2Nsayhub2RlLCBkYWlfbGluay0+Y29kZWNfb2Zfbm9kZSwgc2ltcGxlX2RhaSkKK2ludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NsayhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9ub2RlICpkYWlfb2Zfbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpzaW1wbGVfZGFpKTsKKworI2RlZmluZSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NwdShub2RlLCBkYWlfbGluaywJCQkJXAorCQkJCSAgIGxpc3RfbmFtZSwgY2VsbHNfbmFtZSwgaXNfc2luZ2xlX2xpbmspCVwKKwlhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2RhaShub2RlLCAmZGFpX2xpbmstPmNwdV9vZl9ub2RlLAkJXAorCQkmZGFpX2xpbmstPmNwdV9kYWlfbmFtZSwgbGlzdF9uYW1lLCBjZWxsc19uYW1lLCBpc19zaW5nbGVfbGluaykKKyNkZWZpbmUgYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jb2RlYyhub2RlLCBkYWlfbGluaywgbGlzdF9uYW1lLCBjZWxsc19uYW1lKQlcCisJYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9kYWkobm9kZSwgJmRhaV9saW5rLT5jb2RlY19vZl9ub2RlLAkJXAorCQkmZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lLCBsaXN0X25hbWUsIGNlbGxzX25hbWUsIE5VTEwpCisjZGVmaW5lIGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfcGxhdGZvcm0obm9kZSwgZGFpX2xpbmssIGxpc3RfbmFtZSwgY2VsbHNfbmFtZSkJXAorCWFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfZGFpKG5vZGUsICZkYWlfbGluay0+cGxhdGZvcm1fb2Zfbm9kZSwJCVwKKwkJTlVMTCwgbGlzdF9uYW1lLCBjZWxsc19uYW1lLCBOVUxMKQoraW50IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfZGFpKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKmVuZHBvaW50X25wLAorCQkJCSAgY29uc3QgY2hhciAqKmRhaV9uYW1lLAorCQkJCSAgY29uc3QgY2hhciAqbGlzdF9uYW1lLAorCQkJCSAgY29uc3QgY2hhciAqY2VsbHNfbmFtZSwKKwkJCQkgIGludCAqaXNfc2luZ2xlX2xpbmtzKTsKKworaW50IGFzb2Nfc2ltcGxlX2NhcmRfaW5pdF9kYWkoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkgICAgICBzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpzaW1wbGVfZGFpKTsKKworaW50IGFzb2Nfc2ltcGxlX2NhcmRfY2Fub25pY2FsaXplX2RhaWxpbmsoc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rKTsKK3ZvaWQgYXNvY19zaW1wbGVfY2FyZF9jYW5vbmljYWxpemVfY3B1KHN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluaywKKwkJCQkgICAgICBpbnQgaXNfc2luZ2xlX2xpbmtzKTsKKworaW50IGFzb2Nfc2ltcGxlX2NhcmRfY2xlYW5fcmVmZXJlbmNlKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpOworCiAjZW5kaWYgLyogX19TSU1QTEVfQ0FSRF9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc29jLmggYi9pbmNsdWRlL3NvdW5kL3NvYy5oCmluZGV4IDYxNDQ4ODIuLjRmMWM3ODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc29jLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MuaApAQCAtODk4LDE0ICs4OTgsNiBAQAogCWludCAoKnJlc3VtZSkoc3RydWN0IHNuZF9zb2NfY29kZWMgKik7CiAJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciBjb21wb25lbnRfZHJpdmVyOwogCi0JLyogRGVmYXVsdCBjb250cm9sIGFuZCBzZXR1cCwgYWRkZWQgYWZ0ZXIgcHJvYmUoKSBpcyBydW4gKi8KLQljb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyAqY29udHJvbHM7Ci0JaW50IG51bV9jb250cm9sczsKLQljb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqZGFwbV93aWRnZXRzOwotCWludCBudW1fZGFwbV93aWRnZXRzOwotCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgKmRhcG1fcm91dGVzOwotCWludCBudW1fZGFwbV9yb3V0ZXM7Ci0KIAkvKiBjb2RlYyB3aWRlIG9wZXJhdGlvbnMgKi8KIAlpbnQgKCpzZXRfc3lzY2xrKShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkgIGludCBjbGtfaWQsIGludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKTsKQEAgLTE1NDcsMTcgKzE1MzksNiBAQAogCXJldHVybiBzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YSgmcGxhdGZvcm0tPmNvbXBvbmVudCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfc29jX3BjbV9zZXRfZHJ2ZGF0YShzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAotCQl2b2lkICpkYXRhKQotewotCWRldl9zZXRfZHJ2ZGF0YShydGQtPmRldiwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCAqc25kX3NvY19wY21fZ2V0X2RydmRhdGEoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKHJ0ZC0+ZGV2KTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHNuZF9zb2NfaW5pdGlhbGl6ZV9jYXJkX2xpc3RzKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJmNhcmQtPmNvZGVjX2Rldl9saXN0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvdGx2LmggYi9pbmNsdWRlL3NvdW5kL3Rsdi5oCmluZGV4IGRmOTdkMTkuLjM2NzdlYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdGx2LmgKKysrIGIvaW5jbHVkZS9zb3VuZC90bHYuaApAQCAtMjIsNjcgKzIyLDM5IEBACiAgKgogICovCiAKLS8qCi0gKiBUTFYgc3RydWN0dXJlIGlzIHJpZ2h0IGJlaGluZCB0aGUgc3RydWN0IHNuZF9jdGxfdGx2OgotICogICB1bnNpZ25lZCBpbnQgdHlwZSAgCS0gc2VlIFNORFJWX0NUTF9UTFZUXyoKLSAqICAgdW5zaWduZWQgaW50IGxlbmd0aAotICogICAuLi4uIGRhdGEgYWxpZ25lZCB0byBzaXplb2YodW5zaWduZWQgaW50KSwgdXNlCi0gKiAgICAgICAgYmxvY2tfbGVuZ3RoID0gKGxlbmd0aCArIChzaXplb2YodW5zaWduZWQgaW50KSAtIDEpKSAmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgfihzaXplb2YodW5zaWduZWQgaW50KSAtIDEpKSAuLi4uCi0gKi8KLQogI2luY2x1ZGUgPHVhcGkvc291bmQvdGx2Lmg+CiAKLSNkZWZpbmUgVExWX0lURU0odHlwZSwgLi4uKSBcCi0JKHR5cGUpLCBUTFZfTEVOR1RIKF9fVkFfQVJHU19fKSwgX19WQV9BUkdTX18KLSNkZWZpbmUgVExWX0xFTkdUSCguLi4pIFwKLQkoKHVuc2lnbmVkIGludClzaXplb2YoKGNvbnN0IHVuc2lnbmVkIGludFtdKSB7IF9fVkFfQVJHU19fIH0pKQorLyogRm9yIGhpc3RvcmljYWwgcmVhc29ucywgdGhlc2UgbWFjcm9zIGFyZSBhbGlhc2VzIHRvIHRoZSBvbmVzIGluIFVBUEkuICovCisjZGVmaW5lIFRMVl9JVEVNCQkJU05EUlZfQ1RMX1RMVkRfSVRFTQorI2RlZmluZSBUTFZfTEVOR1RICQkJU05EUlZfQ1RMX1RMVkRfTEVOR1RICiAKLSNkZWZpbmUgVExWX0NPTlRBSU5FUl9JVEVNKC4uLikgXAotCVRMVl9JVEVNKFNORFJWX0NUTF9UTFZUX0NPTlRBSU5FUiwgX19WQV9BUkdTX18pCi0jZGVmaW5lIERFQ0xBUkVfVExWX0NPTlRBSU5FUihuYW1lLCAuLi4pIFwKLQl1bnNpZ25lZCBpbnQgbmFtZVtdID0geyBUTFZfQ09OVEFJTkVSX0lURU0oX19WQV9BUkdTX18pIH0KKyNkZWZpbmUgVExWX0NPTlRBSU5FUl9JVEVNCQlTTkRSVl9DVExfVExWRF9DT05UQUlORVJfSVRFTQorI2RlZmluZSBERUNMQVJFX1RMVl9DT05UQUlORVIJCVNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfQ09OVEFJTkVSCiAKLSNkZWZpbmUgVExWX0RCX1NDQUxFX01BU0sJMHhmZmZmCi0jZGVmaW5lIFRMVl9EQl9TQ0FMRV9NVVRFCTB4MTAwMDAKLSNkZWZpbmUgVExWX0RCX1NDQUxFX0lURU0obWluLCBzdGVwLCBtdXRlKQkJCVwKLQlUTFZfSVRFTShTTkRSVl9DVExfVExWVF9EQl9TQ0FMRSwJCQlcCi0JCSAobWluKSwJCQkJCVwKLQkJICgoc3RlcCkgJiBUTFZfREJfU0NBTEVfTUFTSykgfAkJXAotCQkJKChtdXRlKSA/IFRMVl9EQl9TQ0FMRV9NVVRFIDogMCkpCi0jZGVmaW5lIERFQ0xBUkVfVExWX0RCX1NDQUxFKG5hbWUsIG1pbiwgc3RlcCwgbXV0ZSkgXAotCXVuc2lnbmVkIGludCBuYW1lW10gPSB7IFRMVl9EQl9TQ0FMRV9JVEVNKG1pbiwgc3RlcCwgbXV0ZSkgfQorI2RlZmluZSBUTFZfREJfU0NBTEVfTUFTSwkJU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfTUFTSworI2RlZmluZSBUTFZfREJfU0NBTEVfTVVURQkJU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfTVVURQorI2RlZmluZSBUTFZfREJfU0NBTEVfSVRFTQkJU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfSVRFTQorI2RlZmluZSBERUNMQVJFX1RMVl9EQl9TQ0FMRQkJU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9TQ0FMRQogCi0vKiBkQiBzY2FsZSBzcGVjaWZpZWQgd2l0aCBtaW4vbWF4IHZhbHVlcyBpbnN0ZWFkIG9mIHN0ZXAgKi8KLSNkZWZpbmUgVExWX0RCX01JTk1BWF9JVEVNKG1pbl9kQiwgbWF4X2RCKQkJCVwKLQlUTFZfSVRFTShTTkRSVl9DVExfVExWVF9EQl9NSU5NQVgsIChtaW5fZEIpLCAobWF4X2RCKSkKLSNkZWZpbmUgVExWX0RCX01JTk1BWF9NVVRFX0lURU0obWluX2RCLCBtYXhfZEIpCQkJXAotCVRMVl9JVEVNKFNORFJWX0NUTF9UTFZUX0RCX01JTk1BWF9NVVRFLCAobWluX2RCKSwgKG1heF9kQikpCi0jZGVmaW5lIERFQ0xBUkVfVExWX0RCX01JTk1BWChuYW1lLCBtaW5fZEIsIG1heF9kQikgXAotCXVuc2lnbmVkIGludCBuYW1lW10gPSB7IFRMVl9EQl9NSU5NQVhfSVRFTShtaW5fZEIsIG1heF9kQikgfQotI2RlZmluZSBERUNMQVJFX1RMVl9EQl9NSU5NQVhfTVVURShuYW1lLCBtaW5fZEIsIG1heF9kQikgXAotCXVuc2lnbmVkIGludCBuYW1lW10gPSB7IFRMVl9EQl9NSU5NQVhfTVVURV9JVEVNKG1pbl9kQiwgbWF4X2RCKSB9CisjZGVmaW5lIFRMVl9EQl9NSU5NQVhfSVRFTQkJU05EUlZfQ1RMX1RMVkRfREJfTUlOTUFYX0lURU0KKyNkZWZpbmUgVExWX0RCX01JTk1BWF9NVVRFX0lURU0JCVNORFJWX0NUTF9UTFZEX0RCX01JTk1BWF9NVVRFX0lURU0KKyNkZWZpbmUgREVDTEFSRV9UTFZfREJfTUlOTUFYCQlTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX01JTk1BWAorI2RlZmluZSBERUNMQVJFX1RMVl9EQl9NSU5NQVhfTVVURQlTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX01JTk1BWF9NVVRFCiAKLS8qIGxpbmVhciB2b2x1bWUgYmV0d2VlbiBtaW5fZEIgYW5kIG1heF9kQiAoLjAxZEIgdW5pdCkgKi8KLSNkZWZpbmUgVExWX0RCX0xJTkVBUl9JVEVNKG1pbl9kQiwgbWF4X2RCKQkJICAgIFwKLQlUTFZfSVRFTShTTkRSVl9DVExfVExWVF9EQl9MSU5FQVIsIChtaW5fZEIpLCAobWF4X2RCKSkKLSNkZWZpbmUgREVDTEFSRV9UTFZfREJfTElORUFSKG5hbWUsIG1pbl9kQiwgbWF4X2RCKQlcCi0JdW5zaWduZWQgaW50IG5hbWVbXSA9IHsgVExWX0RCX0xJTkVBUl9JVEVNKG1pbl9kQiwgbWF4X2RCKSB9CisjZGVmaW5lIFRMVl9EQl9MSU5FQVJfSVRFTQkJU05EUlZfQ1RMX1RMVkRfREJfTElORUFSX0lURU0KKyNkZWZpbmUgREVDTEFSRV9UTFZfREJfTElORUFSCQlTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX0xJTkVBUgogCi0vKiBkQiByYW5nZSBjb250YWluZXI6Ci0gKiBJdGVtcyBpbiBkQiByYW5nZSBjb250YWluZXIgbXVzdCBiZSBvcmRlcmVkIGJ5IHRoZWlyIHZhbHVlcyBhbmQgYnkgdGhlaXIKLSAqIGRCIHZhbHVlcy4gVGhpcyBpbXBsaWVzIHRoYXQgbGFyZ2VyIHZhbHVlcyBtdXN0IGNvcnJlc3BvbmQgd2l0aCBsYXJnZXIKLSAqIGRCIHZhbHVlcyAod2hpY2ggaXMgYWxzbyByZXF1aXJlZCBmb3IgYWxsIG90aGVyIG1peGVyIGNvbnRyb2xzKS4KKyNkZWZpbmUgVExWX0RCX1JBTkdFX0lURU0JCVNORFJWX0NUTF9UTFZEX0RCX1JBTkdFX0lURU0KKyNkZWZpbmUgREVDTEFSRV9UTFZfREJfUkFOR0UJCVNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfUkFOR0UKKworI2RlZmluZSBUTFZfREJfR0FJTl9NVVRFCQlTTkRSVl9DVExfVExWRF9EQl9HQUlOX01VVEUKKworLyoKKyAqIFRoZSBiZWxvdyBhc3N1bWVzIHRoYXQgZWFjaCBpdGVtIFRMViBpcyA0IHdvcmRzIGxpa2UgREJfU0NBTEUgb3IgTElORUFSLgorICogVGhpcyBpcyBhbiBvbGQgZmFzaW9uIGFuZCBvYnNvbGV0ZWQgYnkgY29tbWl0IGJmMWQxYzliNjE3OSgiQUxTQTogdGx2OiBhZGQKKyAqIERFQ0xBUkVfVExWX0RCX1JBTkdFKCkiKS4KICAqLwotLyogRWFjaCBpdGVtIGlzOiA8bWluPiA8bWF4PiA8VExWPiAqLwotI2RlZmluZSBUTFZfREJfUkFOR0VfSVRFTSguLi4pIFwKLQlUTFZfSVRFTShTTkRSVl9DVExfVExWVF9EQl9SQU5HRSwgX19WQV9BUkdTX18pCi0jZGVmaW5lIERFQ0xBUkVfVExWX0RCX1JBTkdFKG5hbWUsIC4uLikgXAotCXVuc2lnbmVkIGludCBuYW1lW10gPSB7IFRMVl9EQl9SQU5HRV9JVEVNKF9fVkFfQVJHU19fKSB9Ci0vKiBUaGUgYmVsb3cgYXNzdW1lcyB0aGF0IGVhY2ggaXRlbSBUTFYgaXMgNCB3b3JkcyBsaWtlIERCX1NDQUxFIG9yIExJTkVBUiAqLwotI2RlZmluZSBUTFZfREJfUkFOR0VfSEVBRChudW0pCQkJXAorI2RlZmluZSBUTFZfREJfUkFOR0VfSEVBRChudW0pIFwKIAlTTkRSVl9DVExfVExWVF9EQl9SQU5HRSwgNiAqIChudW0pICogc2l6ZW9mKHVuc2lnbmVkIGludCkKIAotI2RlZmluZSBUTFZfREJfR0FJTl9NVVRFCS05OTk5OTk5Ci0KICNlbmRpZiAvKiBfX1NPVU5EX1RMVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9jcHVocC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvY3B1aHAuaAppbmRleCBhNzJiZDkzLi45OTY5NTNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9jcHVocC5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2NwdWhwLmgKQEAgLTMzLDYgKzMzLDM0IEBACiAJCSAgX19lbnRyeS0+Y3B1LCBfX2VudHJ5LT50YXJnZXQsIF9fZW50cnktPmlkeCwgX19lbnRyeS0+ZnVuKQogKTsKIAorVFJBQ0VfRVZFTlQoY3B1aHBfbXVsdGlfZW50ZXIsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBpbnQgY3B1LAorCQkgaW50IHRhcmdldCwKKwkJIGludCBpZHgsCisJCSBpbnQgKCpmdW4pKHVuc2lnbmVkIGludCwgc3RydWN0IGhsaXN0X25vZGUgKiksCisJCSBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSksCisKKwlUUF9BUkdTKGNwdSwgdGFyZ2V0LCBpZHgsIGZ1biwgbm9kZSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCWNwdQkJKQorCQlfX2ZpZWxkKCBpbnQsCQl0YXJnZXQJCSkKKwkJX19maWVsZCggaW50LAkJaWR4CQkpCisJCV9fZmllbGQoIHZvaWQgKiwJZnVuCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5jcHUJPSBjcHU7CisJCV9fZW50cnktPnRhcmdldAk9IHRhcmdldDsKKwkJX19lbnRyeS0+aWR4CT0gaWR4OworCQlfX2VudHJ5LT5mdW4JPSBmdW47CisJKSwKKworCVRQX3ByaW50aygiY3B1OiAlMDR1IHRhcmdldDogJTNkIHN0ZXA6ICUzZCAoJXBmKSIsCisJCSAgX19lbnRyeS0+Y3B1LCBfX2VudHJ5LT50YXJnZXQsIF9fZW50cnktPmlkeCwgX19lbnRyeS0+ZnVuKQorKTsKKwogVFJBQ0VfRVZFTlQoY3B1aHBfZXhpdCwKIAogCVRQX1BST1RPKHVuc2lnbmVkIGludCBjcHUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9mMmZzLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9mMmZzLmgKaW5kZXggZmY5NWZkMDIuLjkwM2EwOTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2YyZnMuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9mMmZzLmgKQEAgLTU4LDE2ICs1OCwxMiBAQAogI2RlZmluZSBGMkZTX0JJT19GTEFHX01BU0sodCkJKHQgJiAoUkVRX1JBSEVBRCB8IFdSSVRFX0ZMVVNIX0ZVQSkpCiAjZGVmaW5lIEYyRlNfQklPX0VYVFJBX01BU0sodCkJKHQgJiAoUkVRX01FVEEgfCBSRVFfUFJJTykpCiAKLSNkZWZpbmUgc2hvd19iaW9fdHlwZShvcCwgb3BfZmxhZ3MpIHNob3dfYmlvX29wKG9wKSwJCQlcCi0JCQlzaG93X2Jpb19vcF9mbGFncyhvcF9mbGFncyksIHNob3dfYmlvX2V4dHJhKG9wX2ZsYWdzKQotCi0jZGVmaW5lIHNob3dfYmlvX29wKG9wKQkJCQkJCQlcCi0JX19wcmludF9zeW1ib2xpYyhvcCwJCQkJCQlcCi0JCXsgUkVBRCwgCQkiUkVBRCIgfSwJCQlcCi0JCXsgV1JJVEUsCQkiV1JJVEUiIH0pCisjZGVmaW5lIHNob3dfYmlvX3R5cGUob3BfZmxhZ3MpCXNob3dfYmlvX29wX2ZsYWdzKG9wX2ZsYWdzKSwgCQlcCisJCQkJCQlzaG93X2Jpb19leHRyYShvcF9mbGFncykKIAogI2RlZmluZSBzaG93X2Jpb19vcF9mbGFncyhmbGFncykJCQkJCVwKIAlfX3ByaW50X3N5bWJvbGljKEYyRlNfQklPX0ZMQUdfTUFTSyhmbGFncyksCQkJXAorCQl7IDAsCQkJIldSSVRFIiB9LAkJCVwKIAkJeyBSRVFfUkFIRUFELCAJCSJSRUFEQUhFQUQiIH0sCQkJXAogCQl7IFJFQURfU1lOQywgCQkiUkVBRF9TWU5DIiB9LAkJCVwKIAkJeyBXUklURV9TWU5DLCAJCSJXUklURV9TWU5DIiB9LAkJCVwKQEAgLTc1NCwxMiArNzUwLDEyIEBACiAJKSwKIAogCVRQX3ByaW50aygiZGV2ID0gKCVkLCVkKSwgaW5vID0gJWx1LCBwYWdlX2luZGV4ID0gMHglbHgsICIKLQkJIm9sZGFkZHIgPSAweCVsbHgsIG5ld2FkZHIgPSAweCVsbHggcncgPSAlcyVzaSVzLCB0eXBlID0gJXMiLAorCQkib2xkYWRkciA9IDB4JWxseCwgbmV3YWRkciA9IDB4JWxseCwgcncgPSAlcyVzLCB0eXBlID0gJXMiLAogCQlzaG93X2Rldl9pbm8oX19lbnRyeSksCiAJCSh1bnNpZ25lZCBsb25nKV9fZW50cnktPmluZGV4LAogCQkodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPm9sZF9ibGthZGRyLAogCQkodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPm5ld19ibGthZGRyLAotCQlzaG93X2Jpb190eXBlKF9fZW50cnktPm9wLCBfX2VudHJ5LT5vcF9mbGFncyksCisJCXNob3dfYmlvX3R5cGUoX19lbnRyeS0+b3BfZmxhZ3MpLAogCQlzaG93X2Jsb2NrX3R5cGUoX19lbnRyeS0+dHlwZSkpCiApOwogCkBAIC04MDYsOSArODAyLDkgQEAKIAkJX19lbnRyeS0+c2l6ZQkJPSBiaW8tPmJpX2l0ZXIuYmlfc2l6ZTsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgPSAoJWQsJWQpLCAlcyVzJXMsICVzLCBzZWN0b3IgPSAlbGxkLCBzaXplID0gJXUiLAorCVRQX3ByaW50aygiZGV2ID0gKCVkLCVkKSwgcncgPSAlcyVzLCAlcywgc2VjdG9yID0gJWxsZCwgc2l6ZSA9ICV1IiwKIAkJc2hvd19kZXYoX19lbnRyeSksCi0JCXNob3dfYmlvX3R5cGUoX19lbnRyeS0+b3AsIF9fZW50cnktPm9wX2ZsYWdzKSwKKwkJc2hvd19iaW9fdHlwZShfX2VudHJ5LT5vcF9mbGFncyksCiAJCXNob3dfYmxvY2tfdHlwZShfX2VudHJ5LT50eXBlKSwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCiAJCV9fZW50cnktPnNpemUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pbnRlbF9pc2guaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2ludGVsX2lzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZjdkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pbnRlbF9pc2guaApAQCAtMCwwICsxLDMwIEBACisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBpbnRlbF9pc2gKKworI2lmICFkZWZpbmVkKF9UUkFDRV9JTlRFTF9JU0hfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX0lOVEVMX0lTSF9ICisKKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKK1RSQUNFX0VWRU5UKGlzaHRwX2R1bXAsCisKKwlUUF9QUk9UTyhjb25zdCBjaGFyICptZXNzYWdlKSwKKworCVRQX0FSR1MobWVzc2FnZSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX3N0cmluZyhtZXNzYWdlLCBtZXNzYWdlKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19hc3NpZ25fc3RyKG1lc3NhZ2UsIG1lc3NhZ2UpOworCSksCisKKwlUUF9wcmludGsoIiVzIiwgX19nZXRfc3RyKG1lc3NhZ2UpKQorKTsKKworCisjZW5kaWYgLyogX1RSQUNFX0lOVEVMX0lTSF9IICovCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaAppbmRleCBmOTVmMjVlLi4xYzQxYjc0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaApAQCAtNzUsNyArNzUsNyBAQAogICogQHJldDogcmV0dXJuIHZhbHVlCiAgKgogICogSWYgdGhlIEByZXQgdmFsdWUgaXMgc2V0IHRvIElSUV9IQU5ETEVELCB0aGVuIHdlIGtub3cgdGhhdCB0aGUgY29ycmVzcG9uZGluZwotICogQGFjdGlvbi0+aGFuZGxlciBzY3VjY2Vzc3VsbHkgaGFuZGxlZCB0aGlzIGlycS4gT3RoZXJ3aXNlLCB0aGUgaXJxIG1pZ2h0IGJlCisgKiBAYWN0aW9uLT5oYW5kbGVyIHN1Y2Nlc3NmdWxseSBoYW5kbGVkIHRoaXMgaXJxLiBPdGhlcndpc2UsIHRoZSBpcnEgbWlnaHQgYmUKICAqIGEgc2hhcmVkIGlycSBsaW5lLCBvciB0aGUgaXJxIHdhcyBub3QgaGFuZGxlZCBzdWNjZXNzZnVsbHkuIENhbiBiZSB1c2VkIGluCiAgKiBjb25qdW5jdGlvbiB3aXRoIHRoZSBpcnFfaGFuZGxlcl9lbnRyeSB0byB1bmRlcnN0YW5kIGlycSBoYW5kbGVyIGxhdGVuY2llcy4KICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvbWNlLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9tY2UuaAppbmRleCA0Y2JiY2VmLi43MGYwMjE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9tY2UuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9tY2UuaApAQCAtMjAsNiArMjAsOCBAQAogCQlfX2ZpZWxkKAl1NjQsCQlzdGF0dXMJCSkKIAkJX19maWVsZCgJdTY0LAkJYWRkcgkJKQogCQlfX2ZpZWxkKAl1NjQsCQltaXNjCQkpCisJCV9fZmllbGQoCXU2NCwJCXN5bmQJCSkKKwkJX19maWVsZCgJdTY0LAkJaXBpZAkJKQogCQlfX2ZpZWxkKAl1NjQsCQlpcAkJKQogCQlfX2ZpZWxkKAl1NjQsCQl0c2MJCSkKIAkJX19maWVsZCgJdTY0LAkJd2FsbHRpbWUJKQpAQCAtMzgsNiArNDAsOCBAQAogCQlfX2VudHJ5LT5zdGF0dXMJCT0gbS0+c3RhdHVzOwogCQlfX2VudHJ5LT5hZGRyCQk9IG0tPmFkZHI7CiAJCV9fZW50cnktPm1pc2MJCT0gbS0+bWlzYzsKKwkJX19lbnRyeS0+c3luZAkJPSBtLT5zeW5kOworCQlfX2VudHJ5LT5pcGlkCQk9IG0tPmlwaWQ7CiAJCV9fZW50cnktPmlwCQk9IG0tPmlwOwogCQlfX2VudHJ5LT50c2MJCT0gbS0+dHNjOwogCQlfX2VudHJ5LT53YWxsdGltZQk9IG0tPnRpbWU7CkBAIC01MCwxMSArNTQsMTIgQEAKIAkJX19lbnRyeS0+Y3B1dmVuZG9yCT0gbS0+Y3B1dmVuZG9yOwogCSksCiAKLQlUUF9wcmludGsoIkNQVTogJWQsIE1DR2MvczogJWxseC8lbGx4LCBNQyVkOiAlMDE2THgsIEFERFIvTUlTQzogJTAxNkx4LyUwMTZMeCwgUklQOiAlMDJ4OjwlMDE2THg+LCBUU0M6ICVsbHgsIFBST0NFU1NPUjogJXU6JXgsIFRJTUU6ICVsbHUsIFNPQ0tFVDogJXUsIEFQSUM6ICV4IiwKKwlUUF9wcmludGsoIkNQVTogJWQsIE1DR2MvczogJWxseC8lbGx4LCBNQyVkOiAlMDE2THgsIElQSUQ6ICUwMTZMeCwgQUREUi9NSVNDL1NZTkQ6ICUwMTZMeC8lMDE2THgvJTAxNkx4LCBSSVA6ICUwMng6PCUwMTZMeD4sIFRTQzogJWxseCwgUFJPQ0VTU09SOiAldToleCwgVElNRTogJWxsdSwgU09DS0VUOiAldSwgQVBJQzogJXgiLAogCQlfX2VudHJ5LT5jcHUsCiAJCV9fZW50cnktPm1jZ2NhcCwgX19lbnRyeS0+bWNnc3RhdHVzLAogCQlfX2VudHJ5LT5iYW5rLCBfX2VudHJ5LT5zdGF0dXMsCi0JCV9fZW50cnktPmFkZHIsIF9fZW50cnktPm1pc2MsCisJCV9fZW50cnktPmlwaWQsCisJCV9fZW50cnktPmFkZHIsIF9fZW50cnktPm1pc2MsIF9fZW50cnktPnN5bmQsCiAJCV9fZW50cnktPmNzLCBfX2VudHJ5LT5pcCwKIAkJX19lbnRyeS0+dHNjLAogCQlfX2VudHJ5LT5jcHV2ZW5kb3IsIF9fZW50cnktPmNwdWlkLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvcG93ZXIuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Bvd2VyLmgKaW5kZXggMTllNTAzMC4uNTRlM2FhZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvcG93ZXIuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9wb3dlci5oCkBAIC02OSw3ICs2OSw4IEBACiAJCXU2NCBtcGVyZiwKIAkJdTY0IGFwZXJmLAogCQl1NjQgdHNjLAotCQl1MzIgZnJlcQorCQl1MzIgZnJlcSwKKwkJdTMyIGlvX2Jvb3N0CiAJCSksCiAKIAlUUF9BUkdTKGNvcmVfYnVzeSwKQEAgLTc5LDcgKzgwLDggQEAKIAkJbXBlcmYsCiAJCWFwZXJmLAogCQl0c2MsCi0JCWZyZXEKKwkJZnJlcSwKKwkJaW9fYm9vc3QKIAkJKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCkBAIC05MSw2ICs5Myw3IEBACiAJCV9fZmllbGQodTY0LCBhcGVyZikKIAkJX19maWVsZCh1NjQsIHRzYykKIAkJX19maWVsZCh1MzIsIGZyZXEpCisJCV9fZmllbGQodTMyLCBpb19ib29zdCkKIAkJKSwKIAogCVRQX2Zhc3RfYXNzaWduKApAQCAtMTAyLDkgKzEwNSwxMCBAQAogCQlfX2VudHJ5LT5hcGVyZiA9IGFwZXJmOwogCQlfX2VudHJ5LT50c2MgPSB0c2M7CiAJCV9fZW50cnktPmZyZXEgPSBmcmVxOworCQlfX2VudHJ5LT5pb19ib29zdCA9IGlvX2Jvb3N0OwogCQkpLAogCi0JVFBfcHJpbnRrKCJjb3JlX2J1c3k9JWx1IHNjYWxlZD0lbHUgZnJvbT0lbHUgdG89JWx1IG1wZXJmPSVsbHUgYXBlcmY9JWxsdSB0c2M9JWxsdSBmcmVxPSVsdSAiLAorCVRQX3ByaW50aygiY29yZV9idXN5PSVsdSBzY2FsZWQ9JWx1IGZyb209JWx1IHRvPSVsdSBtcGVyZj0lbGx1IGFwZXJmPSVsbHUgdHNjPSVsbHUgZnJlcT0lbHUgaW9fYm9vc3Q9JWx1IiwKIAkJKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+Y29yZV9idXN5LAogCQkodW5zaWduZWQgbG9uZylfX2VudHJ5LT5zY2FsZWRfYnVzeSwKIAkJKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+ZnJvbSwKQEAgLTExMiw3ICsxMTYsOCBAQAogCQkodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPm1wZXJmLAogCQkodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPmFwZXJmLAogCQkodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnRzYywKLQkJKHVuc2lnbmVkIGxvbmcpX19lbnRyeS0+ZnJlcQorCQkodW5zaWduZWQgbG9uZylfX2VudHJ5LT5mcmVxLAorCQkodW5zaWduZWQgbG9uZylfX2VudHJ5LT5pb19ib29zdAogCQkpCiAKICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9yeHJwYy5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcnhycGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzgzZTVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcnhycGMuaApAQCAtMCwwICsxLDYyNSBAQAorLyogQUZfUlhSUEMgdHJhY2Vwb2ludHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIHJ4cnBjCisKKyNpZiAhZGVmaW5lZChfVFJBQ0VfUlhSUENfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX1JYUlBDX0gKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworVFJBQ0VfRVZFTlQocnhycGNfY29ubiwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sIGVudW0gcnhycGNfY29ubl90cmFjZSBvcCwKKwkJICAgICBpbnQgdXNhZ2UsIGNvbnN0IHZvaWQgKndoZXJlKSwKKworCSAgICBUUF9BUkdTKGNvbm4sIG9wLCB1c2FnZSwgd2hlcmUpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICosCWNvbm4JCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCW9wCQkpCisJCSAgICBfX2ZpZWxkKGludCwJCQl1c2FnZQkJKQorCQkgICAgX19maWVsZChjb25zdCB2b2lkICosCQl3aGVyZQkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y29ubiA9IGNvbm47CisJCSAgICBfX2VudHJ5LT5vcCA9IG9wOworCQkgICAgX19lbnRyeS0+dXNhZ2UgPSB1c2FnZTsKKwkJICAgIF9fZW50cnktPndoZXJlID0gd2hlcmU7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiQz0lcCAlcyB1PSVkIHNwPSVwU1IiLAorCQkgICAgICBfX2VudHJ5LT5jb25uLAorCQkgICAgICByeHJwY19jb25uX3RyYWNlc1tfX2VudHJ5LT5vcF0sCisJCSAgICAgIF9fZW50cnktPnVzYWdlLAorCQkgICAgICBfX2VudHJ5LT53aGVyZSkKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfY2xpZW50LAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwgaW50IGNoYW5uZWwsCisJCSAgICAgZW51bSByeHJwY19jbGllbnRfdHJhY2Ugb3ApLAorCisJICAgIFRQX0FSR1MoY29ubiwgY2hhbm5lbCwgb3ApLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICosCWNvbm4JCSkKKwkJICAgIF9fZmllbGQodTMyLAkJCWNpZAkJKQorCQkgICAgX19maWVsZChpbnQsCQkJY2hhbm5lbAkJKQorCQkgICAgX19maWVsZChpbnQsCQkJdXNhZ2UJCSkKKwkJICAgIF9fZmllbGQoZW51bSByeHJwY19jbGllbnRfdHJhY2UsCW9wCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfY29ubl9jYWNoZV9zdGF0ZSwgY3MJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNvbm4gPSBjb25uOworCQkgICAgX19lbnRyeS0+Y2hhbm5lbCA9IGNoYW5uZWw7CisJCSAgICBfX2VudHJ5LT51c2FnZSA9IGF0b21pY19yZWFkKCZjb25uLT51c2FnZSk7CisJCSAgICBfX2VudHJ5LT5vcCA9IG9wOworCQkgICAgX19lbnRyeS0+Y2lkID0gY29ubi0+cHJvdG8uY2lkOworCQkgICAgX19lbnRyeS0+Y3MgPSBjb25uLT5jYWNoZV9zdGF0ZTsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJDPSVwIGg9JTJkICVzICVzIGk9JTA4eCB1PSVkIiwKKwkJICAgICAgX19lbnRyeS0+Y29ubiwKKwkJICAgICAgX19lbnRyeS0+Y2hhbm5lbCwKKwkJICAgICAgcnhycGNfY2xpZW50X3RyYWNlc1tfX2VudHJ5LT5vcF0sCisJCSAgICAgIHJ4cnBjX2Nvbm5fY2FjaGVfc3RhdGVzW19fZW50cnktPmNzXSwKKwkJICAgICAgX19lbnRyeS0+Y2lkLAorCQkgICAgICBfX2VudHJ5LT51c2FnZSkKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfY2FsbCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfY2FsbF90cmFjZSBvcCwKKwkJICAgICBpbnQgdXNhZ2UsIGNvbnN0IHZvaWQgKndoZXJlLCBjb25zdCB2b2lkICphdXgpLAorCisJICAgIFRQX0FSR1MoY2FsbCwgb3AsIHVzYWdlLCB3aGVyZSwgYXV4KSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAljYWxsCQkpCisJCSAgICBfX2ZpZWxkKGludCwJCQlvcAkJKQorCQkgICAgX19maWVsZChpbnQsCQkJdXNhZ2UJCSkKKwkJICAgIF9fZmllbGQoY29uc3Qgdm9pZCAqLAkJd2hlcmUJCSkKKwkJICAgIF9fZmllbGQoY29uc3Qgdm9pZCAqLAkJYXV4CQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsID0gY2FsbDsKKwkJICAgIF9fZW50cnktPm9wID0gb3A7CisJCSAgICBfX2VudHJ5LT51c2FnZSA9IHVzYWdlOworCQkgICAgX19lbnRyeS0+d2hlcmUgPSB3aGVyZTsKKwkJICAgIF9fZW50cnktPmF1eCA9IGF1eDsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwICVzIHU9JWQgc3A9JXBTUiBhPSVwIiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgcnhycGNfY2FsbF90cmFjZXNbX19lbnRyeS0+b3BdLAorCQkgICAgICBfX2VudHJ5LT51c2FnZSwKKwkJICAgICAgX19lbnRyeS0+d2hlcmUsCisJCSAgICAgIF9fZW50cnktPmF1eCkKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfc2tiLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHJ4cnBjX3NrYl90cmFjZSBvcCwKKwkJICAgICBpbnQgdXNhZ2UsIGludCBtb2RfY291bnQsIGNvbnN0IHZvaWQgKndoZXJlKSwKKworCSAgICBUUF9BUkdTKHNrYiwgb3AsIHVzYWdlLCBtb2RfY291bnQsIHdoZXJlKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3Qgc2tfYnVmZiAqLAkJc2tiCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfc2tiX3RyYWNlLAlvcAkJKQorCQkgICAgX19maWVsZChpbnQsCQkJdXNhZ2UJCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCW1vZF9jb3VudAkpCisJCSAgICBfX2ZpZWxkKGNvbnN0IHZvaWQgKiwJCXdoZXJlCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5za2IgPSBza2I7CisJCSAgICBfX2VudHJ5LT5vcCA9IG9wOworCQkgICAgX19lbnRyeS0+dXNhZ2UgPSB1c2FnZTsKKwkJICAgIF9fZW50cnktPm1vZF9jb3VudCA9IG1vZF9jb3VudDsKKwkJICAgIF9fZW50cnktPndoZXJlID0gd2hlcmU7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygicz0lcCAlcyB1PSVkIG09JWQgcD0lcFNSIiwKKwkJICAgICAgX19lbnRyeS0+c2tiLAorCQkgICAgICByeHJwY19za2JfdHJhY2VzW19fZW50cnktPm9wXSwKKwkJICAgICAgX19lbnRyeS0+dXNhZ2UsCisJCSAgICAgIF9fZW50cnktPm1vZF9jb3VudCwKKwkJICAgICAgX19lbnRyeS0+d2hlcmUpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3J4X3BhY2tldCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCksCisKKwkgICAgVFBfQVJHUyhzcCksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGRfc3RydWN0KHN0cnVjdCByeHJwY19ob3N0X2hlYWRlciwJaGRyCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBtZW1jcHkoJl9fZW50cnktPmhkciwgJnNwLT5oZHIsIHNpemVvZihfX2VudHJ5LT5oZHIpKTsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCIlMDh4OiUwOHg6JTA4eDolMDR4ICUwOHggJTA4eCAlMDJ4ICUwMnggJXMiLAorCQkgICAgICBfX2VudHJ5LT5oZHIuZXBvY2gsIF9fZW50cnktPmhkci5jaWQsCisJCSAgICAgIF9fZW50cnktPmhkci5jYWxsTnVtYmVyLCBfX2VudHJ5LT5oZHIuc2VydmljZUlkLAorCQkgICAgICBfX2VudHJ5LT5oZHIuc2VyaWFsLCBfX2VudHJ5LT5oZHIuc2VxLAorCQkgICAgICBfX2VudHJ5LT5oZHIudHlwZSwgX19lbnRyeS0+aGRyLmZsYWdzLAorCQkgICAgICBfX2VudHJ5LT5oZHIudHlwZSA8PSAxNSA/IHJ4cnBjX3BrdHNbX19lbnRyeS0+aGRyLnR5cGVdIDogIj9VTksiKQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY19yeF9kb25lLAorCSAgICBUUF9QUk9UTyhpbnQgcmVzdWx0LCBpbnQgYWJvcnRfY29kZSksCisKKwkgICAgVFBfQVJHUyhyZXN1bHQsIGFib3J0X2NvZGUpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKGludCwJCQlyZXN1bHQJCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCWFib3J0X2NvZGUJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+cmVzdWx0ID0gcmVzdWx0OworCQkgICAgX19lbnRyeS0+YWJvcnRfY29kZSA9IGFib3J0X2NvZGU7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygicj0lZCBhPSVkIiwgX19lbnRyeS0+cmVzdWx0LCBfX2VudHJ5LT5hYm9ydF9jb2RlKQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY19hYm9ydCwKKwkgICAgVFBfUFJPVE8oY29uc3QgY2hhciAqd2h5LCB1MzIgY2lkLCB1MzIgY2FsbF9pZCwgcnhycGNfc2VxX3Qgc2VxLAorCQkgICAgIGludCBhYm9ydF9jb2RlLCBpbnQgZXJyb3IpLAorCisJICAgIFRQX0FSR1Mod2h5LCBjaWQsIGNhbGxfaWQsIHNlcSwgYWJvcnRfY29kZSwgZXJyb3IpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2FycmF5KGNoYXIsCQkJd2h5LCA0CQkpCisJCSAgICBfX2ZpZWxkKHUzMiwJCQljaWQJCSkKKwkJICAgIF9fZmllbGQodTMyLAkJCWNhbGxfaWQJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQlzZXEJCSkKKwkJICAgIF9fZmllbGQoaW50LAkJCWFib3J0X2NvZGUJKQorCQkgICAgX19maWVsZChpbnQsCQkJZXJyb3IJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIG1lbWNweShfX2VudHJ5LT53aHksIHdoeSwgNCk7CisJCSAgICBfX2VudHJ5LT5jaWQgPSBjaWQ7CisJCSAgICBfX2VudHJ5LT5jYWxsX2lkID0gY2FsbF9pZDsKKwkJICAgIF9fZW50cnktPmFib3J0X2NvZGUgPSBhYm9ydF9jb2RlOworCQkgICAgX19lbnRyeS0+ZXJyb3IgPSBlcnJvcjsKKwkJICAgIF9fZW50cnktPnNlcSA9IHNlcTsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCIlMDh4OiUwOHggcz0ldSBhPSVkIGU9JWQgJXMiLAorCQkgICAgICBfX2VudHJ5LT5jaWQsIF9fZW50cnktPmNhbGxfaWQsIF9fZW50cnktPnNlcSwKKwkJICAgICAgX19lbnRyeS0+YWJvcnRfY29kZSwgX19lbnRyeS0+ZXJyb3IsIF9fZW50cnktPndoeSkKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfdHJhbnNtaXQsCisJICAgIFRQX1BST1RPKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBlbnVtIHJ4cnBjX3RyYW5zbWl0X3RyYWNlIHdoeSksCisKKwkgICAgVFBfQVJHUyhjYWxsLCB3aHkpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jYWxsICosCWNhbGwJCSkKKwkJICAgIF9fZmllbGQoZW51bSByeHJwY190cmFuc21pdF90cmFjZSwJd2h5CQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJdHhfaGFyZF9hY2sJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCXR4X3RvcAkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbCA9IGNhbGw7CisJCSAgICBfX2VudHJ5LT53aHkgPSB3aHk7CisJCSAgICBfX2VudHJ5LT50eF9oYXJkX2FjayA9IGNhbGwtPnR4X2hhcmRfYWNrOworCQkgICAgX19lbnRyeS0+dHhfdG9wID0gY2FsbC0+dHhfdG9wOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgJXMgZj0lMDh4IG49JXUiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICByeHJwY190cmFuc21pdF90cmFjZXNbX19lbnRyeS0+d2h5XSwKKwkJICAgICAgX19lbnRyeS0+dHhfaGFyZF9hY2sgKyAxLAorCQkgICAgICBfX2VudHJ5LT50eF90b3AgLSBfX2VudHJ5LT50eF9oYXJkX2FjaykKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcnhfYWNrLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgcnhycGNfc2VxX3QgZmlyc3QsIHU4IHJlYXNvbiwgdTggbl9hY2tzKSwKKworCSAgICBUUF9BUkdTKGNhbGwsIGZpcnN0LCByZWFzb24sIG5fYWNrcyksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCWZpcnN0CQkpCisJCSAgICBfX2ZpZWxkKHU4LAkJCQlyZWFzb24JCSkKKwkJICAgIF9fZmllbGQodTgsCQkJCW5fYWNrcwkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbCA9IGNhbGw7CisJCSAgICBfX2VudHJ5LT5maXJzdCA9IGZpcnN0OworCQkgICAgX19lbnRyeS0+cmVhc29uID0gcmVhc29uOworCQkgICAgX19lbnRyeS0+bl9hY2tzID0gbl9hY2tzOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgJXMgZj0lMDh4IG49JXUiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICByeHJwY19hY2tfbmFtZXNbX19lbnRyeS0+cmVhc29uXSwKKwkJICAgICAgX19lbnRyeS0+Zmlyc3QsCisJCSAgICAgIF9fZW50cnktPm5fYWNrcykKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfdHhfZGF0YSwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHJ4cnBjX3NlcV90IHNlcSwKKwkJICAgICByeHJwY19zZXJpYWxfdCBzZXJpYWwsIHU4IGZsYWdzLCBib29sIHJldHJhbnMsIGJvb2wgbG9zZSksCisKKwkgICAgVFBfQVJHUyhjYWxsLCBzZXEsIHNlcmlhbCwgZmxhZ3MsIHJldHJhbnMsIGxvc2UpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jYWxsICosCWNhbGwJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQlzZXEJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VyaWFsX3QsCQlzZXJpYWwJCSkKKwkJICAgIF9fZmllbGQodTgsCQkJCWZsYWdzCQkpCisJCSAgICBfX2ZpZWxkKGJvb2wsCQkJcmV0cmFucwkJKQorCQkgICAgX19maWVsZChib29sLAkJCWxvc2UJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwgPSBjYWxsOworCQkgICAgX19lbnRyeS0+c2VxID0gc2VxOworCQkgICAgX19lbnRyeS0+c2VyaWFsID0gc2VyaWFsOworCQkgICAgX19lbnRyeS0+ZmxhZ3MgPSBmbGFnczsKKwkJICAgIF9fZW50cnktPnJldHJhbnMgPSByZXRyYW5zOworCQkgICAgX19lbnRyeS0+bG9zZSA9IGxvc2U7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCBEQVRBICUwOHggcT0lMDh4IGZsPSUwMnglcyVzIiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgX19lbnRyeS0+c2VyaWFsLAorCQkgICAgICBfX2VudHJ5LT5zZXEsCisJCSAgICAgIF9fZW50cnktPmZsYWdzLAorCQkgICAgICBfX2VudHJ5LT5yZXRyYW5zID8gIiAqUkVUUkFOUyoiIDogIiIsCisJCSAgICAgIF9fZW50cnktPmxvc2UgPyAiICpMT1NFKiIgOiAiIikKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfdHhfYWNrLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgcnhycGNfc2VyaWFsX3Qgc2VyaWFsLAorCQkgICAgIHJ4cnBjX3NlcV90IGFja19maXJzdCwgcnhycGNfc2VyaWFsX3QgYWNrX3NlcmlhbCwKKwkJICAgICB1OCByZWFzb24sIHU4IG5fYWNrcyksCisKKwkgICAgVFBfQVJHUyhjYWxsLCBzZXJpYWwsIGFja19maXJzdCwgYWNrX3NlcmlhbCwgcmVhc29uLCBuX2Fja3MpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jYWxsICosCWNhbGwJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VyaWFsX3QsCQlzZXJpYWwJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQlhY2tfZmlyc3QJKQorCQkgICAgX19maWVsZChyeHJwY19zZXJpYWxfdCwJCWFja19zZXJpYWwJKQorCQkgICAgX19maWVsZCh1OCwJCQkJcmVhc29uCQkpCisJCSAgICBfX2ZpZWxkKHU4LAkJCQluX2Fja3MJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwgPSBjYWxsOworCQkgICAgX19lbnRyeS0+c2VyaWFsID0gc2VyaWFsOworCQkgICAgX19lbnRyeS0+YWNrX2ZpcnN0ID0gYWNrX2ZpcnN0OworCQkgICAgX19lbnRyeS0+YWNrX3NlcmlhbCA9IGFja19zZXJpYWw7CisJCSAgICBfX2VudHJ5LT5yZWFzb24gPSByZWFzb247CisJCSAgICBfX2VudHJ5LT5uX2Fja3MgPSBuX2Fja3M7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiIGM9JXAgQUNLICAlMDh4ICVzIGY9JTA4eCByPSUwOHggbj0ldSIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIF9fZW50cnktPnNlcmlhbCwKKwkJICAgICAgcnhycGNfYWNrX25hbWVzW19fZW50cnktPnJlYXNvbl0sCisJCSAgICAgIF9fZW50cnktPmFja19maXJzdCwKKwkJICAgICAgX19lbnRyeS0+YWNrX3NlcmlhbCwKKwkJICAgICAgX19lbnRyeS0+bl9hY2tzKQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY19yZWNlaXZlLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY19yZWNlaXZlX3RyYWNlIHdoeSwKKwkJICAgICByeHJwY19zZXJpYWxfdCBzZXJpYWwsIHJ4cnBjX3NlcV90IHNlcSksCisKKwkgICAgVFBfQVJHUyhjYWxsLCB3aHksIHNlcmlhbCwgc2VxKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAljYWxsCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfcmVjZWl2ZV90cmFjZSwJd2h5CQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcmlhbF90LAkJc2VyaWFsCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJc2VxCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJaGFyZF9hY2sJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCXRvcAkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbCA9IGNhbGw7CisJCSAgICBfX2VudHJ5LT53aHkgPSB3aHk7CisJCSAgICBfX2VudHJ5LT5zZXJpYWwgPSBzZXJpYWw7CisJCSAgICBfX2VudHJ5LT5zZXEgPSBzZXE7CisJCSAgICBfX2VudHJ5LT5oYXJkX2FjayA9IGNhbGwtPnJ4X2hhcmRfYWNrOworCQkgICAgX19lbnRyeS0+dG9wID0gY2FsbC0+cnhfdG9wOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgJXMgcj0lMDh4IHE9JTA4eCB3PSUwOHgtJTA4eCIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIHJ4cnBjX3JlY2VpdmVfdHJhY2VzW19fZW50cnktPndoeV0sCisJCSAgICAgIF9fZW50cnktPnNlcmlhbCwKKwkJICAgICAgX19lbnRyeS0+c2VxLAorCQkgICAgICBfX2VudHJ5LT5oYXJkX2FjaywKKwkJICAgICAgX19lbnRyeS0+dG9wKQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY19yZWN2bXNnLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY19yZWN2bXNnX3RyYWNlIHdoeSwKKwkJICAgICByeHJwY19zZXFfdCBzZXEsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sCisJCSAgICAgaW50IHJldCksCisKKwkgICAgVFBfQVJHUyhjYWxsLCB3aHksIHNlcSwgb2Zmc2V0LCBsZW4sIHJldCksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJY2FsbAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX3JlY3Ztc2dfdHJhY2UsCXdoeQkJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCXNlcQkJKQorCQkgICAgX19maWVsZCh1bnNpZ25lZCBpbnQsCQlvZmZzZXQJCSkKKwkJICAgIF9fZmllbGQodW5zaWduZWQgaW50LAkJbGVuCQkpCisJCSAgICBfX2ZpZWxkKGludCwJCQlyZXQJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwgPSBjYWxsOworCQkgICAgX19lbnRyeS0+d2h5ID0gd2h5OworCQkgICAgX19lbnRyeS0+c2VxID0gc2VxOworCQkgICAgX19lbnRyeS0+b2Zmc2V0ID0gb2Zmc2V0OworCQkgICAgX19lbnRyeS0+bGVuID0gbGVuOworCQkgICAgX19lbnRyeS0+cmV0ID0gcmV0OworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoImM9JXAgJXMgcT0lMDh4IG89JXUgbD0ldSByZXQ9JWQiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICByeHJwY19yZWN2bXNnX3RyYWNlc1tfX2VudHJ5LT53aHldLAorCQkgICAgICBfX2VudHJ5LT5zZXEsCisJCSAgICAgIF9fZW50cnktPm9mZnNldCwKKwkJICAgICAgX19lbnRyeS0+bGVuLAorCQkgICAgICBfX2VudHJ5LT5yZXQpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3J0dF90eCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfcnR0X3R4X3RyYWNlIHdoeSwKKwkJICAgICByeHJwY19zZXJpYWxfdCBzZW5kX3NlcmlhbCksCisKKwkgICAgVFBfQVJHUyhjYWxsLCB3aHksIHNlbmRfc2VyaWFsKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAljYWxsCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfcnR0X3R4X3RyYWNlLAl3aHkJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VyaWFsX3QsCQlzZW5kX3NlcmlhbAkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsID0gY2FsbDsKKwkJICAgIF9fZW50cnktPndoeSA9IHdoeTsKKwkJICAgIF9fZW50cnktPnNlbmRfc2VyaWFsID0gc2VuZF9zZXJpYWw7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCAlcyBzcj0lMDh4IiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgcnhycGNfcnR0X3R4X3RyYWNlc1tfX2VudHJ5LT53aHldLAorCQkgICAgICBfX2VudHJ5LT5zZW5kX3NlcmlhbCkKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcnR0X3J4LAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY19ydHRfcnhfdHJhY2Ugd2h5LAorCQkgICAgIHJ4cnBjX3NlcmlhbF90IHNlbmRfc2VyaWFsLCByeHJwY19zZXJpYWxfdCByZXNwX3NlcmlhbCwKKwkJICAgICBzNjQgcnR0LCB1OCBuciwgczY0IGF2ZyksCisKKwkgICAgVFBfQVJHUyhjYWxsLCB3aHksIHNlbmRfc2VyaWFsLCByZXNwX3NlcmlhbCwgcnR0LCBuciwgYXZnKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAljYWxsCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfcnR0X3J4X3RyYWNlLAl3aHkJCSkKKwkJICAgIF9fZmllbGQodTgsCQkJCW5yCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcmlhbF90LAkJc2VuZF9zZXJpYWwJKQorCQkgICAgX19maWVsZChyeHJwY19zZXJpYWxfdCwJCXJlc3Bfc2VyaWFsCSkKKwkJICAgIF9fZmllbGQoczY0LAkJCXJ0dAkJKQorCQkgICAgX19maWVsZCh1NjQsCQkJYXZnCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsID0gY2FsbDsKKwkJICAgIF9fZW50cnktPndoeSA9IHdoeTsKKwkJICAgIF9fZW50cnktPnNlbmRfc2VyaWFsID0gc2VuZF9zZXJpYWw7CisJCSAgICBfX2VudHJ5LT5yZXNwX3NlcmlhbCA9IHJlc3Bfc2VyaWFsOworCQkgICAgX19lbnRyeS0+cnR0ID0gcnR0OworCQkgICAgX19lbnRyeS0+bnIgPSBucjsKKwkJICAgIF9fZW50cnktPmF2ZyA9IGF2ZzsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwICVzIHNyPSUwOHggcnI9JTA4eCBydHQ9JWxsZCBucj0ldSBhdmc9JWxsZCIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIHJ4cnBjX3J0dF9yeF90cmFjZXNbX19lbnRyeS0+d2h5XSwKKwkJICAgICAgX19lbnRyeS0+c2VuZF9zZXJpYWwsCisJCSAgICAgIF9fZW50cnktPnJlc3Bfc2VyaWFsLAorCQkgICAgICBfX2VudHJ5LT5ydHQsCisJCSAgICAgIF9fZW50cnktPm5yLAorCQkgICAgICBfX2VudHJ5LT5hdmcpCisJICAgICk7CisKK1RSQUNFX0VWRU5UKHJ4cnBjX3RpbWVyLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgZW51bSByeHJwY190aW1lcl90cmFjZSB3aHksCisJCSAgICAga3RpbWVfdCBub3csIHVuc2lnbmVkIGxvbmcgbm93X2opLAorCisJICAgIFRQX0FSR1MoY2FsbCwgd2h5LCBub3csIG5vd19qKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAkJY2FsbAkJKQorCQkgICAgX19maWVsZChlbnVtIHJ4cnBjX3RpbWVyX3RyYWNlLAkJd2h5CQkpCisJCSAgICBfX2ZpZWxkX3N0cnVjdChrdGltZV90LAkJCW5vdwkJKQorCQkgICAgX19maWVsZF9zdHJ1Y3Qoa3RpbWVfdCwJCQlleHBpcmVfYXQJKQorCQkgICAgX19maWVsZF9zdHJ1Y3Qoa3RpbWVfdCwJCQlhY2tfYXQJCSkKKwkJICAgIF9fZmllbGRfc3RydWN0KGt0aW1lX3QsCQkJcmVzZW5kX2F0CSkKKwkJICAgIF9fZmllbGQodW5zaWduZWQgbG9uZywJCQlub3dfagkJKQorCQkgICAgX19maWVsZCh1bnNpZ25lZCBsb25nLAkJCXRpbWVyCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsCT0gY2FsbDsKKwkJICAgIF9fZW50cnktPndoeQk9IHdoeTsKKwkJICAgIF9fZW50cnktPm5vdwk9IG5vdzsKKwkJICAgIF9fZW50cnktPmV4cGlyZV9hdAk9IGNhbGwtPmV4cGlyZV9hdDsKKwkJICAgIF9fZW50cnktPmFja19hdAk9IGNhbGwtPmFja19hdDsKKwkJICAgIF9fZW50cnktPnJlc2VuZF9hdAk9IGNhbGwtPnJlc2VuZF9hdDsKKwkJICAgIF9fZW50cnktPm5vd19qCT0gbm93X2o7CisJCSAgICBfX2VudHJ5LT50aW1lcgk9IGNhbGwtPnRpbWVyLmV4cGlyZXM7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCAlcyB4PSVsbGQgYT0lbGxkIHI9JWxsZCB0PSVsZCIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIHJ4cnBjX3RpbWVyX3RyYWNlc1tfX2VudHJ5LT53aHldLAorCQkgICAgICBrdGltZV90b19ucyhrdGltZV9zdWIoX19lbnRyeS0+ZXhwaXJlX2F0LCBfX2VudHJ5LT5ub3cpKSwKKwkJICAgICAga3RpbWVfdG9fbnMoa3RpbWVfc3ViKF9fZW50cnktPmFja19hdCwgX19lbnRyeS0+bm93KSksCisJCSAgICAgIGt0aW1lX3RvX25zKGt0aW1lX3N1YihfX2VudHJ5LT5yZXNlbmRfYXQsIF9fZW50cnktPm5vdykpLAorCQkgICAgICBfX2VudHJ5LT50aW1lciAtIF9fZW50cnktPm5vd19qKQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY19yeF9sb3NlLAorCSAgICBUUF9QUk9UTyhzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwKSwKKworCSAgICBUUF9BUkdTKHNwKSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZF9zdHJ1Y3Qoc3RydWN0IHJ4cnBjX2hvc3RfaGVhZGVyLAloZHIJCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIG1lbWNweSgmX19lbnRyeS0+aGRyLCAmc3AtPmhkciwgc2l6ZW9mKF9fZW50cnktPmhkcikpOworCQkJICAgKSwKKworCSAgICBUUF9wcmludGsoIiUwOHg6JTA4eDolMDh4OiUwNHggJTA4eCAlMDh4ICUwMnggJTAyeCAlcyAqTE9TRSoiLAorCQkgICAgICBfX2VudHJ5LT5oZHIuZXBvY2gsIF9fZW50cnktPmhkci5jaWQsCisJCSAgICAgIF9fZW50cnktPmhkci5jYWxsTnVtYmVyLCBfX2VudHJ5LT5oZHIuc2VydmljZUlkLAorCQkgICAgICBfX2VudHJ5LT5oZHIuc2VyaWFsLCBfX2VudHJ5LT5oZHIuc2VxLAorCQkgICAgICBfX2VudHJ5LT5oZHIudHlwZSwgX19lbnRyeS0+aGRyLmZsYWdzLAorCQkgICAgICBfX2VudHJ5LT5oZHIudHlwZSA8PSAxNSA/IHJ4cnBjX3BrdHNbX19lbnRyeS0+aGRyLnR5cGVdIDogIj9VTksiKQorCSAgICApOworCitUUkFDRV9FVkVOVChyeHJwY19wcm9wb3NlX2FjaywKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfcHJvcG9zZV9hY2tfdHJhY2Ugd2h5LAorCQkgICAgIHU4IGFja19yZWFzb24sIHJ4cnBjX3NlcmlhbF90IHNlcmlhbCwgYm9vbCBpbW1lZGlhdGUsCisJCSAgICAgYm9vbCBiYWNrZ3JvdW5kLCBlbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX291dGNvbWUgb3V0Y29tZSksCisKKwkgICAgVFBfQVJHUyhjYWxsLCB3aHksIGFja19yZWFzb24sIHNlcmlhbCwgaW1tZWRpYXRlLCBiYWNrZ3JvdW5kLAorCQkgICAgb3V0Y29tZSksCisKKwkgICAgVFBfU1RSVUNUX19lbnRyeSgKKwkJICAgIF9fZmllbGQoc3RydWN0IHJ4cnBjX2NhbGwgKiwJCWNhbGwJCSkKKwkJICAgIF9fZmllbGQoZW51bSByeHJwY19wcm9wb3NlX2Fja190cmFjZSwJd2h5CQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcmlhbF90LAkJCXNlcmlhbAkJKQorCQkgICAgX19maWVsZCh1OCwJCQkJCWFja19yZWFzb24JKQorCQkgICAgX19maWVsZChib29sLAkJCQlpbW1lZGlhdGUJKQorCQkgICAgX19maWVsZChib29sLAkJCQliYWNrZ3JvdW5kCSkKKwkJICAgIF9fZmllbGQoZW51bSByeHJwY19wcm9wb3NlX2Fja19vdXRjb21lLAlvdXRjb21lCQkpCisJCQkgICAgICksCisKKwkgICAgVFBfZmFzdF9hc3NpZ24oCisJCSAgICBfX2VudHJ5LT5jYWxsCT0gY2FsbDsKKwkJICAgIF9fZW50cnktPndoeQk9IHdoeTsKKwkJICAgIF9fZW50cnktPnNlcmlhbAk9IHNlcmlhbDsKKwkJICAgIF9fZW50cnktPmFja19yZWFzb24JPSBhY2tfcmVhc29uOworCQkgICAgX19lbnRyeS0+aW1tZWRpYXRlCT0gaW1tZWRpYXRlOworCQkgICAgX19lbnRyeS0+YmFja2dyb3VuZAk9IGJhY2tncm91bmQ7CisJCSAgICBfX2VudHJ5LT5vdXRjb21lCT0gb3V0Y29tZTsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwICVzICVzIHI9JTA4eCBpPSV1IGI9JXUlcyIsCisJCSAgICAgIF9fZW50cnktPmNhbGwsCisJCSAgICAgIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlc1tfX2VudHJ5LT53aHldLAorCQkgICAgICByeHJwY19hY2tfbmFtZXNbX19lbnRyeS0+YWNrX3JlYXNvbl0sCisJCSAgICAgIF9fZW50cnktPnNlcmlhbCwKKwkJICAgICAgX19lbnRyeS0+aW1tZWRpYXRlLAorCQkgICAgICBfX2VudHJ5LT5iYWNrZ3JvdW5kLAorCQkgICAgICByeHJwY19wcm9wb3NlX2Fja19vdXRjb21lc1tfX2VudHJ5LT5vdXRjb21lXSkKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfcmV0cmFuc21pdCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHJ4cnBjX3NlcV90IHNlcSwgdTggYW5ub3RhdGlvbiwKKwkJICAgICBzNjQgZXhwaXJ5KSwKKworCSAgICBUUF9BUkdTKGNhbGwsIHNlcSwgYW5ub3RhdGlvbiwgZXhwaXJ5KSwKKworCSAgICBUUF9TVFJVQ1RfX2VudHJ5KAorCQkgICAgX19maWVsZChzdHJ1Y3QgcnhycGNfY2FsbCAqLAljYWxsCQkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcV90LAkJc2VxCQkpCisJCSAgICBfX2ZpZWxkKHU4LAkJCQlhbm5vdGF0aW9uCSkKKwkJICAgIF9fZmllbGQoczY0LAkJCWV4cGlyeQkJKQorCQkJICAgICApLAorCisJICAgIFRQX2Zhc3RfYXNzaWduKAorCQkgICAgX19lbnRyeS0+Y2FsbCA9IGNhbGw7CisJCSAgICBfX2VudHJ5LT5zZXEgPSBzZXE7CisJCSAgICBfX2VudHJ5LT5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKKwkJICAgIF9fZW50cnktPmV4cGlyeSA9IGV4cGlyeTsKKwkJCSAgICksCisKKwkgICAgVFBfcHJpbnRrKCJjPSVwIHE9JXggYT0lMDJ4IHhwPSVsbGQiLAorCQkgICAgICBfX2VudHJ5LT5jYWxsLAorCQkgICAgICBfX2VudHJ5LT5zZXEsCisJCSAgICAgIF9fZW50cnktPmFubm90YXRpb24sCisJCSAgICAgIF9fZW50cnktPmV4cGlyeSkKKwkgICAgKTsKKworVFJBQ0VfRVZFTlQocnhycGNfY29uZ2VzdCwKKwkgICAgVFBfUFJPVE8oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCByeHJwY19hY2tfc3VtbWFyeSAqc3VtbWFyeSwKKwkJICAgICByeHJwY19zZXJpYWxfdCBhY2tfc2VyaWFsLCBlbnVtIHJ4cnBjX2Nvbmdlc3RfY2hhbmdlIGNoYW5nZSksCisKKwkgICAgVFBfQVJHUyhjYWxsLCBzdW1tYXJ5LCBhY2tfc2VyaWFsLCBjaGFuZ2UpLAorCisJICAgIFRQX1NUUlVDVF9fZW50cnkoCisJCSAgICBfX2ZpZWxkKHN0cnVjdCByeHJwY19jYWxsICosCQljYWxsCQkpCisJCSAgICBfX2ZpZWxkKGVudW0gcnhycGNfY29uZ2VzdF9jaGFuZ2UsCQljaGFuZ2UJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQkJaGFyZF9hY2sJKQorCQkgICAgX19maWVsZChyeHJwY19zZXFfdCwJCQl0b3AJCSkKKwkJICAgIF9fZmllbGQocnhycGNfc2VxX3QsCQkJbG93ZXN0X25hawkpCisJCSAgICBfX2ZpZWxkKHJ4cnBjX3NlcmlhbF90LAkJCWFja19zZXJpYWwJKQorCQkgICAgX19maWVsZF9zdHJ1Y3Qoc3RydWN0IHJ4cnBjX2Fja19zdW1tYXJ5LAlzdW0JCSkKKwkJCSAgICAgKSwKKworCSAgICBUUF9mYXN0X2Fzc2lnbigKKwkJICAgIF9fZW50cnktPmNhbGwJPSBjYWxsOworCQkgICAgX19lbnRyeS0+Y2hhbmdlCT0gY2hhbmdlOworCQkgICAgX19lbnRyeS0+aGFyZF9hY2sJPSBjYWxsLT50eF9oYXJkX2FjazsKKwkJICAgIF9fZW50cnktPnRvcAk9IGNhbGwtPnR4X3RvcDsKKwkJICAgIF9fZW50cnktPmxvd2VzdF9uYWsJPSBjYWxsLT5hY2tzX2xvd2VzdF9uYWs7CisJCSAgICBfX2VudHJ5LT5hY2tfc2VyaWFsCT0gYWNrX3NlcmlhbDsKKwkJICAgIG1lbWNweSgmX19lbnRyeS0+c3VtLCBzdW1tYXJ5LCBzaXplb2YoX19lbnRyeS0+c3VtKSk7CisJCQkgICApLAorCisJICAgIFRQX3ByaW50aygiYz0lcCAlMDh4ICVzICUwOHggJXMgY3c9JXUgc3M9JXUgbnI9JXUsJXUgbnc9JXUsJXUgcj0ldSBiPSV1IHU9JXUgZD0ldSBsPSV4JXMlcyVzIiwKKwkJICAgICAgX19lbnRyeS0+Y2FsbCwKKwkJICAgICAgX19lbnRyeS0+YWNrX3NlcmlhbCwKKwkJICAgICAgcnhycGNfYWNrX25hbWVzW19fZW50cnktPnN1bS5hY2tfcmVhc29uXSwKKwkJICAgICAgX19lbnRyeS0+aGFyZF9hY2ssCisJCSAgICAgIHJ4cnBjX2Nvbmdlc3RfbW9kZXNbX19lbnRyeS0+c3VtLm1vZGVdLAorCQkgICAgICBfX2VudHJ5LT5zdW0uY3duZCwKKwkJICAgICAgX19lbnRyeS0+c3VtLnNzdGhyZXNoLAorCQkgICAgICBfX2VudHJ5LT5zdW0ubnJfYWNrcywgX19lbnRyeS0+c3VtLm5yX25hY2tzLAorCQkgICAgICBfX2VudHJ5LT5zdW0ubnJfbmV3X2Fja3MsIF9fZW50cnktPnN1bS5ucl9uZXdfbmFja3MsCisJCSAgICAgIF9fZW50cnktPnN1bS5ucl9yb3RfbmV3X2Fja3MsCisJCSAgICAgIF9fZW50cnktPnRvcCAtIF9fZW50cnktPmhhcmRfYWNrLAorCQkgICAgICBfX2VudHJ5LT5zdW0uY3VtdWxhdGl2ZV9hY2tzLAorCQkgICAgICBfX2VudHJ5LT5zdW0uZHVwX2Fja3MsCisJCSAgICAgIF9fZW50cnktPmxvd2VzdF9uYWssIF9fZW50cnktPnN1bS5uZXdfbG93X25hY2sgPyAiISIgOiAiIiwKKwkJICAgICAgcnhycGNfY29uZ2VzdF9jaGFuZ2VzW19fZW50cnktPmNoYW5nZV0sCisJCSAgICAgIF9fZW50cnktPnN1bS5yZXRyYW5zX3RpbWVvID8gIiByVHhUbyIgOiAiIikKKwkgICAgKTsKKworI2VuZGlmIC8qIF9UUkFDRV9SWFJQQ19IICovCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZCBiL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQKaW5kZXggMTg1ZjhlYS4uZDAzNTJhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkCkBAIC03MSw2ICs3MSw3IEBACiBoZWFkZXIteSArPSBibGtwZy5oCiBoZWFkZXIteSArPSBibGt0cmFjZV9hcGkuaAogaGVhZGVyLXkgKz0gYnBmX2NvbW1vbi5oCitoZWFkZXIteSArPSBicGZfcGVyZl9ldmVudC5oCiBoZWFkZXIteSArPSBicGYuaAogaGVhZGVyLXkgKz0gYnBxZXRoZXIuaAogaGVhZGVyLXkgKz0gYnNnLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9hdG1femF0bS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2F0bV96YXRtLmgKaW5kZXggOWM5YzZhZC4uNWNkNGQ0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2F0bV96YXRtLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2F0bV96YXRtLmgKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2F0bWFwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2F0bWlvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAogI2RlZmluZSBaQVRNX0dFVFBPT0wJX0lPVygnYScsQVRNSU9DX1NBUlBSVisxLHN0cnVjdCBhdG1pZl9zaW9jKQogCQkJCQkJLyogZ2V0IHBvb2wgc3RhdGlzdGljcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2F1ZGl0LmggYi9pbmNsdWRlL3VhcGkvbGludXgvYXVkaXQuaAppbmRleCA4MmU4YWE1Li4yMDhkZjdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvYXVkaXQuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYXVkaXQuaApAQCAtMzI5LDkgKzMyOSwxMSBAQAogI2RlZmluZSBBVURJVF9GRUFUVVJFX0JJVE1BUF9CQUNLTE9HX0xJTUlUCTB4MDAwMDAwMDEKICNkZWZpbmUgQVVESVRfRkVBVFVSRV9CSVRNQVBfQkFDS0xPR19XQUlUX1RJTUUJMHgwMDAwMDAwMgogI2RlZmluZSBBVURJVF9GRUFUVVJFX0JJVE1BUF9FWEVDVVRBQkxFX1BBVEgJMHgwMDAwMDAwNAorI2RlZmluZSBBVURJVF9GRUFUVVJFX0JJVE1BUF9FWENMVURFX0VYVEVORAkweDAwMDAwMDA4CiAjZGVmaW5lIEFVRElUX0ZFQVRVUkVfQklUTUFQX0FMTCAoQVVESVRfRkVBVFVSRV9CSVRNQVBfQkFDS0xPR19MSU1JVCB8IFwKIAkJCQkgIEFVRElUX0ZFQVRVUkVfQklUTUFQX0JBQ0tMT0dfV0FJVF9USU1FIHwgXAotCQkJCSAgQVVESVRfRkVBVFVSRV9CSVRNQVBfRVhFQ1VUQUJMRV9QQVRIKQorCQkJCSAgQVVESVRfRkVBVFVSRV9CSVRNQVBfRVhFQ1VUQUJMRV9QQVRIIHwgXAorCQkJCSAgQVVESVRfRkVBVFVSRV9CSVRNQVBfRVhDTFVERV9FWFRFTkQpCiAKIC8qIGRlcHJlY2F0ZWQ6IEFVRElUX1ZFUlNJT05fKiAqLwogI2RlZmluZSBBVURJVF9WRVJTSU9OX0xBVEVTVCAJCUFVRElUX0ZFQVRVUkVfQklUTUFQX0FMTApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2JhdG1hbl9hZHYuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9iYXRtYW5fYWR2LmgKaW5kZXggMGZiZjZmZC4uNzM0ZmU4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2JhdG1hbl9hZHYuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYmF0bWFuX2Fkdi5oCkBAIC0yMyw2ICsyMyw0MiBAQAogI2RlZmluZSBCQVRBRFZfTkxfTUNBU1RfR1JPVVBfVFBNRVRFUgkidHBtZXRlciIKIAogLyoqCisgKiBlbnVtIGJhdGFkdl90dF9jbGllbnRfZmxhZ3MgLSBUVCBjbGllbnQgc3BlY2lmaWMgZmxhZ3MKKyAqIEBCQVRBRFZfVFRfQ0xJRU5UX0RFTDogdGhlIGNsaWVudCBoYXMgdG8gYmUgZGVsZXRlZCBmcm9tIHRoZSB0YWJsZQorICogQEJBVEFEVl9UVF9DTElFTlRfUk9BTTogdGhlIGNsaWVudCByb2FtZWQgdG8vZnJvbSBhbm90aGVyIG5vZGUgYW5kIHRoZSBuZXcKKyAqICB1cGRhdGUgdGVsbGluZyBpdHMgbmV3IHJlYWwgbG9jYXRpb24gaGFzIG5vdCBiZWVuIHJlY2VpdmVkL3NlbnQgeWV0CisgKiBAQkFUQURWX1RUX0NMSUVOVF9XSUZJOiB0aGlzIGNsaWVudCBpcyBjb25uZWN0ZWQgdGhyb3VnaCBhIHdpZmkgaW50ZXJmYWNlLgorICogIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBieSB0aGUgIkFQIElzb2xhdGlvbiIgZmVhdHVyZQorICogQEJBVEFEVl9UVF9DTElFTlRfSVNPTEE6IHRoaXMgY2xpZW50IGlzIGNvbnNpZGVyZWQgImlzb2xhdGVkIi4gVGhpcworICogIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgdGhlIEV4dGVuZGVkIElzb2xhdGlvbiBmZWF0dXJlCisgKiBAQkFUQURWX1RUX0NMSUVOVF9OT1BVUkdFOiB0aGlzIGNsaWVudCBzaG91bGQgbmV2ZXIgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0YWJsZQorICogQEJBVEFEVl9UVF9DTElFTlRfTkVXOiB0aGlzIGNsaWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbG9jYWwgdGFibGUgYnV0IGhhcworICogIG5vdCBiZWVuIGFubm91bmNlZCB5ZXQKKyAqIEBCQVRBRFZfVFRfQ0xJRU5UX1BFTkRJTkc6IHRoaXMgY2xpZW50IGlzIG1hcmtlZCBmb3IgcmVtb3ZhbCBidXQgaXQgaXMga2VwdAorICogIGluIHRoZSB0YWJsZSBmb3Igb25lIG1vcmUgb3JpZ2luYXRvciBpbnRlcnZhbCBmb3IgY29uc2lzdGVuY3kgcHVycG9zZXMKKyAqIEBCQVRBRFZfVFRfQ0xJRU5UX1RFTVA6IHRoaXMgZ2xvYmFsIGNsaWVudCBoYXMgYmVlbiBkZXRlY3RlZCB0byBiZSBwYXJ0IG9mCisgKiAgdGhlIG5ldHdvcmsgYnV0IG5vIG5ub2RlIGhhcyBhbHJlYWR5IGFubm91bmNlZCBpdAorICoKKyAqIEJpdHMgZnJvbSAwIHRvIDcgYXJlIGNhbGxlZCBfcmVtb3RlIGZsYWdzXyBiZWNhdXNlIHRoZXkgYXJlIHNlbnQgb24gdGhlIHdpcmUuCisgKiBCaXRzIGZyb20gOCB0byAxNSBhcmUgY2FsbGVkIF9sb2NhbCBmbGFnc18gYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGZvciBsb2NhbAorICogY29tcHV0YXRpb25zIG9ubHkuCisgKgorICogQml0cyBmcm9tIDQgdG8gNyAtIGEgc3Vic2V0IG9mIHJlbW90ZSBmbGFncyAtIGFyZSBlbnN1cmVkIHRvIGJlIGluIHN5bmMgd2l0aAorICogdGhlIG90aGVyIG5vZGVzIGluIHRoZSBuZXR3b3JrLiBUbyBhY2hpZXZlIHRoaXMgZ29hbCB0aGVzZSBmbGFncyBhcmUgaW5jbHVkZWQKKyAqIGluIHRoZSBUVCBDUkMgY29tcHV0YXRpb24uCisgKi8KK2VudW0gYmF0YWR2X3R0X2NsaWVudF9mbGFncyB7CisJQkFUQURWX1RUX0NMSUVOVF9ERUwgICAgID0gKDEgPDwgMCksCisJQkFUQURWX1RUX0NMSUVOVF9ST0FNICAgID0gKDEgPDwgMSksCisJQkFUQURWX1RUX0NMSUVOVF9XSUZJICAgID0gKDEgPDwgNCksCisJQkFUQURWX1RUX0NMSUVOVF9JU09MQQkgPSAoMSA8PCA1KSwKKwlCQVRBRFZfVFRfQ0xJRU5UX05PUFVSR0UgPSAoMSA8PCA4KSwKKwlCQVRBRFZfVFRfQ0xJRU5UX05FVyAgICAgPSAoMSA8PCA5KSwKKwlCQVRBRFZfVFRfQ0xJRU5UX1BFTkRJTkcgPSAoMSA8PCAxMCksCisJQkFUQURWX1RUX0NMSUVOVF9URU1QCSA9ICgxIDw8IDExKSwKK307CisKKy8qKgogICogZW51bSBiYXRhZHZfbmxfYXR0cnMgLSBiYXRtYW4tYWR2IG5ldGxpbmsgYXR0cmlidXRlcwogICoKICAqIEBCQVRBRFZfQVRUUl9VTlNQRUM6IHVuc3BlY2lmaWVkIGF0dHJpYnV0ZSB0byBjYXRjaCBlcnJvcnMKQEAgLTQwLDYgKzc2LDI2IEBACiAgKiBAQkFUQURWX0FUVFJfVFBNRVRFUl9CWVRFUzogYW1vdW50IG9mIGFja2VkIGJ5dGVzIGR1cmluZyBydW4KICAqIEBCQVRBRFZfQVRUUl9UUE1FVEVSX0NPT0tJRTogc2Vzc2lvbiBjb29raWUgdG8gbWF0Y2ggdHBfbWV0ZXIgc2Vzc2lvbgogICogQEJBVEFEVl9BVFRSX1BBRDogYXR0cmlidXRlIHVzZWQgZm9yIHBhZGRpbmcgZm9yIDY0LWJpdCBhbGlnbm1lbnQKKyAqIEBCQVRBRFZfQVRUUl9BQ1RJVkU6IEZsYWcgaW5kaWNhdGluZyBpZiB0aGUgaGFyZCBpbnRlcmZhY2UgaXMgYWN0aXZlCisgKiBAQkFUQURWX0FUVFJfVFRfQUREUkVTUzogQ2xpZW50IE1BQyBhZGRyZXNzCisgKiBAQkFUQURWX0FUVFJfVFRfVFRWTjogVHJhbnNsYXRpb24gdGFibGUgdmVyc2lvbgorICogQEJBVEFEVl9BVFRSX1RUX0xBU1RfVFRWTjogUHJldmlvdXMgdHJhbnNsYXRpb24gdGFibGUgdmVyc2lvbgorICogQEJBVEFEVl9BVFRSX1RUX0NSQzMyOiBDUkMzMiBvdmVyIHRyYW5zbGF0aW9uIHRhYmxlCisgKiBAQkFUQURWX0FUVFJfVFRfVklEOiBWTEFOIElECisgKiBAQkFUQURWX0FUVFJfVFRfRkxBR1M6IFRyYW5zbGF0aW9uIHRhYmxlIGNsaWVudCBmbGFncworICogQEJBVEFEVl9BVFRSX0ZMQUdfQkVTVDogRmxhZ3MgaW5kaWNhdGluZyBlbnRyeSBpcyB0aGUgYmVzdAorICogQEJBVEFEVl9BVFRSX0xBU1RfU0VFTl9NU0VDUzogVGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgbGFzdCBzZWVuCisgKiBAQkFUQURWX0FUVFJfTkVJR0hfQUREUkVTUzogTmVpZ2hib3VyIE1BQyBhZGRyZXNzCisgKiBAQkFUQURWX0FUVFJfVFE6IFRRIHRvIG5laWdoYm91cgorICogQEJBVEFEVl9BVFRSX1RIUk9VR0hQVVQ6IEVzdGltYXRlZCB0aHJvdWdocHV0IHRvIE5laWdoYm91cgorICogQEJBVEFEVl9BVFRSX0JBTkRXSURUSF9VUDogUmVwb3J0ZWQgdXBsaW5rIGJhbmR3aWR0aAorICogQEJBVEFEVl9BVFRSX0JBTkRXSURUSF9ET1dOOiBSZXBvcnRlZCBkb3dubGluayBiYW5kd2lkdGgKKyAqIEBCQVRBRFZfQVRUUl9ST1VURVI6IEdhdGV3YXkgcm91dGVyIE1BQyBhZGRyZXNzCisgKiBAQkFUQURWX0FUVFJfQkxBX09XTjogRmxhZyBpbmRpY2F0aW5nIG93biBvcmlnaW5hdG9yCisgKiBAQkFUQURWX0FUVFJfQkxBX0FERFJFU1M6IEJyaWRnZSBsb29wIGF2b2lkYW5jZSBjbGFpbSBNQUMgYWRkcmVzcworICogQEJBVEFEVl9BVFRSX0JMQV9WSUQ6IEJMQSBWTEFOIElECisgKiBAQkFUQURWX0FUVFJfQkxBX0JBQ0tCT05FOiBCTEEgZ2F0ZXdheSBvcmlnaW5hdG9yIE1BQyBhZGRyZXNzCisgKiBAQkFUQURWX0FUVFJfQkxBX0NSQzogQkxBIENSQwogICogQF9fQkFUQURWX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKiBATlVNX0JBVEFEVl9BVFRSOiB0b3RhbCBudW1iZXIgb2YgYmF0YWR2X25sX2F0dHJzIGF2YWlsYWJsZQogICogQEJBVEFEVl9BVFRSX01BWDogaGlnaGVzdCBhdHRyaWJ1dGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCkBAIC02MCw2ICsxMTYsMjYgQEAKIAlCQVRBRFZfQVRUUl9UUE1FVEVSX0JZVEVTLAogCUJBVEFEVl9BVFRSX1RQTUVURVJfQ09PS0lFLAogCUJBVEFEVl9BVFRSX1BBRCwKKwlCQVRBRFZfQVRUUl9BQ1RJVkUsCisJQkFUQURWX0FUVFJfVFRfQUREUkVTUywKKwlCQVRBRFZfQVRUUl9UVF9UVFZOLAorCUJBVEFEVl9BVFRSX1RUX0xBU1RfVFRWTiwKKwlCQVRBRFZfQVRUUl9UVF9DUkMzMiwKKwlCQVRBRFZfQVRUUl9UVF9WSUQsCisJQkFUQURWX0FUVFJfVFRfRkxBR1MsCisJQkFUQURWX0FUVFJfRkxBR19CRVNULAorCUJBVEFEVl9BVFRSX0xBU1RfU0VFTl9NU0VDUywKKwlCQVRBRFZfQVRUUl9ORUlHSF9BRERSRVNTLAorCUJBVEFEVl9BVFRSX1RRLAorCUJBVEFEVl9BVFRSX1RIUk9VR0hQVVQsCisJQkFUQURWX0FUVFJfQkFORFdJRFRIX1VQLAorCUJBVEFEVl9BVFRSX0JBTkRXSURUSF9ET1dOLAorCUJBVEFEVl9BVFRSX1JPVVRFUiwKKwlCQVRBRFZfQVRUUl9CTEFfT1dOLAorCUJBVEFEVl9BVFRSX0JMQV9BRERSRVNTLAorCUJBVEFEVl9BVFRSX0JMQV9WSUQsCisJQkFUQURWX0FUVFJfQkxBX0JBQ0tCT05FLAorCUJBVEFEVl9BVFRSX0JMQV9DUkMsCiAJLyogYWRkIGF0dHJpYnV0ZXMgYWJvdmUgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmV0bGluay5jICovCiAJX19CQVRBRFZfQVRUUl9BRlRFUl9MQVNULAogCU5VTV9CQVRBRFZfQVRUUiA9IF9fQkFUQURWX0FUVFJfQUZURVJfTEFTVCwKQEAgLTczLDYgKzE0OSwxNSBAQAogICogQEJBVEFEVl9DTURfR0VUX01FU0hfSU5GTzogUXVlcnkgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgYmF0bWFuLWFkdiBkZXZpY2UKICAqIEBCQVRBRFZfQ01EX1RQX01FVEVSOiBTdGFydCBhIHRwIG1ldGVyIHNlc3Npb24KICAqIEBCQVRBRFZfQ01EX1RQX01FVEVSX0NBTkNFTDogQ2FuY2VsIGEgdHAgbWV0ZXIgc2Vzc2lvbgorICogQEJBVEFEVl9DTURfR0VUX1JPVVRJTkdfQUxHT1M6IFF1ZXJ5IHRoZSBsaXN0IG9mIHJvdXRpbmcgYWxnb3JpdGhtcy4KKyAqIEBCQVRBRFZfQ01EX0dFVF9IQVJESUZTOiBRdWVyeSBsaXN0IG9mIGhhcmQgaW50ZXJmYWNlcworICogQEJBVEFEVl9DTURfR0VUX1RSQU5TVEFCTEVfTE9DQUw6IFF1ZXJ5IGxpc3Qgb2YgbG9jYWwgdHJhbnNsYXRpb25zCisgKiBAQkFUQURWX0NNRF9HRVRfVFJBTlNUQUJMRV9HTE9CQUwgUXVlcnkgbGlzdCBvZiBnbG9iYWwgdHJhbnNsYXRpb25zCisgKiBAQkFUQURWX0NNRF9HRVRfT1JJR0lOQVRPUlM6IFF1ZXJ5IGxpc3Qgb2Ygb3JpZ2luYXRvcnMKKyAqIEBCQVRBRFZfQ01EX0dFVF9ORUlHSEJPUlM6IFF1ZXJ5IGxpc3Qgb2YgbmVpZ2hib3VycworICogQEJBVEFEVl9DTURfR0VUX0dBVEVXQVlTOiBRdWVyeSBsaXN0IG9mIGdhdGV3YXlzCisgKiBAQkFUQURWX0NNRF9HRVRfQkxBX0NMQUlNOiBRdWVyeSBsaXN0IG9mIGJyaWRnZSBsb29wIGF2b2lkYW5jZSBjbGFpbXMKKyAqIEBCQVRBRFZfQ01EX0dFVF9CTEFfQkFDS0JPTkU6IFF1ZXJ5IGxpc3Qgb2YgYnJpZGdlIGxvb3AgYXZvaWRhbmNlIGJhY2tib25lcwogICogQF9fQkFUQURWX0NNRF9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKICAqIEBCQVRBRFZfQ01EX01BWDogaGlnaGVzdCB1c2VkIGNvbW1hbmQgbnVtYmVyCiAgKi8KQEAgLTgxLDYgKzE2NiwxNSBAQAogCUJBVEFEVl9DTURfR0VUX01FU0hfSU5GTywKIAlCQVRBRFZfQ01EX1RQX01FVEVSLAogCUJBVEFEVl9DTURfVFBfTUVURVJfQ0FOQ0VMLAorCUJBVEFEVl9DTURfR0VUX1JPVVRJTkdfQUxHT1MsCisJQkFUQURWX0NNRF9HRVRfSEFSRElGUywKKwlCQVRBRFZfQ01EX0dFVF9UUkFOU1RBQkxFX0xPQ0FMLAorCUJBVEFEVl9DTURfR0VUX1RSQU5TVEFCTEVfR0xPQkFMLAorCUJBVEFEVl9DTURfR0VUX09SSUdJTkFUT1JTLAorCUJBVEFEVl9DTURfR0VUX05FSUdIQk9SUywKKwlCQVRBRFZfQ01EX0dFVF9HQVRFV0FZUywKKwlCQVRBRFZfQ01EX0dFVF9CTEFfQ0xBSU0sCisJQkFUQURWX0NNRF9HRVRfQkxBX0JBQ0tCT05FLAogCS8qIGFkZCBuZXcgY29tbWFuZHMgYWJvdmUgaGVyZSAqLwogCV9fQkFUQURWX0NNRF9BRlRFUl9MQVNULAogCUJBVEFEVl9DTURfTUFYID0gX19CQVRBRFZfQ01EX0FGVEVSX0xBU1QgLSAxCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgKaW5kZXggOWU1ZmMxNi4uZjA5YzcwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaApAQCAtOTUsNiArOTUsNyBAQAogCUJQRl9QUk9HX1RZUEVfU0NIRURfQUNULAogCUJQRl9QUk9HX1RZUEVfVFJBQ0VQT0lOVCwKIAlCUEZfUFJPR19UWVBFX1hEUCwKKwlCUEZfUFJPR19UWVBFX1BFUkZfRVZFTlQsCiB9OwogCiAjZGVmaW5lIEJQRl9QU0VVRE9fTUFQX0ZECTEKQEAgLTM3NSw2ICszNzYsNTYgQEAKIAkgKi8KIAlCUEZfRlVOQ19wcm9iZV93cml0ZV91c2VyLAogCisJLyoqCisJICogYnBmX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAobWFwLCBpbmRleCkgLSBDaGVjayBjZ3JvdXAyIG1lbWJlcnNoaXAgb2YgY3VycmVudCB0YXNrCisJICogQG1hcDogcG9pbnRlciB0byBicGZfbWFwIGluIEJQRl9NQVBfVFlQRV9DR1JPVVBfQVJSQVkgdHlwZQorCSAqIEBpbmRleDogaW5kZXggb2YgdGhlIGNncm91cCBpbiB0aGUgYnBmX21hcAorCSAqIFJldHVybjoKKwkgKiAgID09IDAgY3VycmVudCBmYWlsZWQgdGhlIGNncm91cDIgZGVzY2VuZGFudCB0ZXN0CisJICogICA9PSAxIGN1cnJlbnQgc3VjY2VlZGVkIHRoZSBjZ3JvdXAyIGRlc2NlbmRhbnQgdGVzdAorCSAqICAgIDwgMCBlcnJvcgorCSAqLworCUJQRl9GVU5DX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAsCisKKwkvKioKKwkgKiBicGZfc2tiX2NoYW5nZV90YWlsKHNrYiwgbGVuLCBmbGFncykKKwkgKiBUaGUgaGVscGVyIHdpbGwgcmVzaXplIHRoZSBza2IgdG8gdGhlIGdpdmVuIG5ldyBzaXplLAorCSAqIHRvIGJlIHVzZWQgZi5lLiB3aXRoIGNvbnRyb2wgbWVzc2FnZXMuCisJICogQHNrYjogcG9pbnRlciB0byBza2IKKwkgKiBAbGVuOiBuZXcgc2tiIGxlbmd0aAorCSAqIEBmbGFnczogcmVzZXJ2ZWQKKwkgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvcgorCSAqLworCUJQRl9GVU5DX3NrYl9jaGFuZ2VfdGFpbCwKKworCS8qKgorCSAqIGJwZl9za2JfcHVsbF9kYXRhKHNrYiwgbGVuKQorCSAqIFRoZSBoZWxwZXIgd2lsbCBwdWxsIGluIG5vbi1saW5lYXIgZGF0YSBpbiBjYXNlIHRoZQorCSAqIHNrYiBpcyBub24tbGluZWFyIGFuZCBub3QgYWxsIG9mIGxlbiBhcmUgcGFydCBvZiB0aGUKKwkgKiBsaW5lYXIgc2VjdGlvbi4gT25seSBuZWVkZWQgZm9yIHJlYWQvd3JpdGUgd2l0aCBkaXJlY3QKKwkgKiBwYWNrZXQgYWNjZXNzLgorCSAqIEBza2I6IHBvaW50ZXIgdG8gc2tiCisJICogQGxlbjogbGVuIHRvIG1ha2UgcmVhZC93cml0ZWFibGUKKwkgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvcgorCSAqLworCUJQRl9GVU5DX3NrYl9wdWxsX2RhdGEsCisKKwkvKioKKwkgKiBicGZfY3N1bV91cGRhdGUoc2tiLCBjc3VtKQorCSAqIEFkZHMgY3N1bSBpbnRvIHNrYi0+Y3N1bSBpbiBjYXNlIG9mIENIRUNLU1VNX0NPTVBMRVRFLgorCSAqIEBza2I6IHBvaW50ZXIgdG8gc2tiCisJICogQGNzdW06IGNzdW0gdG8gYWRkCisJICogUmV0dXJuOiBjc3VtIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IKKwkgKi8KKwlCUEZfRlVOQ19jc3VtX3VwZGF0ZSwKKworCS8qKgorCSAqIGJwZl9zZXRfaGFzaF9pbnZhbGlkKHNrYikKKwkgKiBJbnZhbGlkYXRlIGN1cnJlbnQgc2tiPmhhc2guCisJICogQHNrYjogcG9pbnRlciB0byBza2IKKwkgKi8KKwlCUEZfRlVOQ19zZXRfaGFzaF9pbnZhbGlkLAorCiAJX19CUEZfRlVOQ19NQVhfSUQsCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvYnBmX3BlcmZfZXZlbnQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9icGZfcGVyZl9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzQyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmX3BlcmZfZXZlbnQuaApAQCAtMCwwICsxLDE4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYgRmFjZWJvb2sKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIF9VQVBJX19MSU5VWF9CUEZfUEVSRl9FVkVOVF9IX18KKyNkZWZpbmUgX1VBUElfX0xJTlVYX0JQRl9QRVJGX0VWRU5UX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKworc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGEgeworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisJX191NjQgc2FtcGxlX3BlcmlvZDsKK307CisKKyNlbmRpZiAvKiBfVUFQSV9fTElOVVhfQlBGX1BFUkZfRVZFTlRfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvZXRodG9vbC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2V0aHRvb2wuaAppbmRleCBiOGYzOGU4Li4wOTlhNDIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvZXRodG9vbC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9ldGh0b29sLmgKQEAgLTEzNjIsNyArMTM2MiwxNCBAQAogCUVUSFRPT0xfTElOS19NT0RFXzEwMDAwMGJhc2VTUjRfRnVsbF9CSVQJPSAzNywKIAlFVEhUT09MX0xJTktfTU9ERV8xMDAwMDBiYXNlQ1I0X0Z1bGxfQklUCT0gMzgsCiAJRVRIVE9PTF9MSU5LX01PREVfMTAwMDAwYmFzZUxSNF9FUjRfRnVsbF9CSVQJPSAzOSwKLQlFVEhUT09MX0xJTktfTU9ERV81MDAwMGJhc2VTUjJfRnVsbF9CSVQgICAgICAgICA9IDQwLAorCUVUSFRPT0xfTElOS19NT0RFXzUwMDAwYmFzZVNSMl9GdWxsX0JJVAkJPSA0MCwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwYmFzZVhfRnVsbF9CSVQJPSA0MSwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwMGJhc2VDUl9GdWxsX0JJVAk9IDQyLAorCUVUSFRPT0xfTElOS19NT0RFXzEwMDAwYmFzZVNSX0Z1bGxfQklUCT0gNDMsCisJRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlTFJfRnVsbF9CSVQJPSA0NCwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwMGJhc2VMUk1fRnVsbF9CSVQJPSA0NSwKKwlFVEhUT09MX0xJTktfTU9ERV8xMDAwMGJhc2VFUl9GdWxsX0JJVAk9IDQ2LAorCiAKIAkvKiBMYXN0IGFsbG93ZWQgYml0IGZvciBfX0VUSFRPT0xfTElOS19NT0RFX0xFR0FDWV9NQVNLIGlzIGJpdAogCSAqIDMxLiBQbGVhc2UgZG8gTk9UIGRlZmluZSBhbnkgU1VQUE9SVEVEXyogb3IgQURWRVJUSVNFRF8qCkBAIC0xMzcxLDcgKzEzNzgsNyBAQAogCSAqLwogCiAJX19FVEhUT09MX0xJTktfTU9ERV9MQVNUCi0JICA9IEVUSFRPT0xfTElOS19NT0RFXzUwMDAwYmFzZVNSMl9GdWxsX0JJVCwKKwkgID0gRVRIVE9PTF9MSU5LX01PREVfMTAwMDBiYXNlRVJfRnVsbF9CSVQsCiB9OwogCiAjZGVmaW5lIF9fRVRIVE9PTF9MSU5LX01PREVfTEVHQUNZX01BU0soYmFzZV9uYW1lKQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvZnVzZS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2Z1c2UuaAppbmRleCAyN2UxNzM2Li40MmZhOTc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvZnVzZS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9mdXNlLmgKQEAgLTEwOCw2ICsxMDgsMTAgQEAKICAqCiAgKiAgNy4yNQogICogIC0gYWRkIEZVU0VfUEFSQUxMRUxfRElST1BTCisgKgorICogIDcuMjYKKyAqICAtIGFkZCBGVVNFX0hBTkRMRV9LSUxMUFJJVgorICogIC0gYWRkIEZVU0VfUE9TSVhfQUNMCiAgKi8KIAogI2lmbmRlZiBfTElOVVhfRlVTRV9ICkBAIC0xNDMsNyArMTQ3LDcgQEAKICNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CiAKIC8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLwotI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDI1CisjZGVmaW5lIEZVU0VfS0VSTkVMX01JTk9SX1ZFUlNJT04gMjYKIAogLyoqIFRoZSBub2RlIElEIG9mIHRoZSByb290IGlub2RlICovCiAjZGVmaW5lIEZVU0VfUk9PVF9JRCAxCkBAIC0yMzgsNiArMjQyLDggQEAKICAqIEZVU0VfV1JJVEVCQUNLX0NBQ0hFOiB1c2Ugd3JpdGViYWNrIGNhY2hlIGZvciBidWZmZXJlZCB3cml0ZXMKICAqIEZVU0VfTk9fT1BFTl9TVVBQT1JUOiBrZXJuZWwgc3VwcG9ydHMgemVyby1tZXNzYWdlIG9wZW5zCiAgKiBGVVNFX1BBUkFMTEVMX0RJUk9QUzogYWxsb3cgcGFyYWxsZWwgbG9va3VwcyBhbmQgcmVhZGRpcgorICogRlVTRV9IQU5ETEVfS0lMTFBSSVY6IGZzIGhhbmRsZXMga2lsbGluZyBzdWlkL3NnaWQvY2FwIG9uIHdyaXRlL2Nob3duL3RydW5jCisgKiBGVVNFX1BPU0lYX0FDTDogZmlsZXN5c3RlbSBzdXBwb3J0cyBwb3NpeCBhY2xzCiAgKi8KICNkZWZpbmUgRlVTRV9BU1lOQ19SRUFECQkoMSA8PCAwKQogI2RlZmluZSBGVVNFX1BPU0lYX0xPQ0tTCSgxIDw8IDEpCkBAIC0yNTgsNiArMjY0LDggQEAKICNkZWZpbmUgRlVTRV9XUklURUJBQ0tfQ0FDSEUJKDEgPDwgMTYpCiAjZGVmaW5lIEZVU0VfTk9fT1BFTl9TVVBQT1JUCSgxIDw8IDE3KQogI2RlZmluZSBGVVNFX1BBUkFMTEVMX0RJUk9QUyAgICAoMSA8PCAxOCkKKyNkZWZpbmUgRlVTRV9IQU5ETEVfS0lMTFBSSVYJKDEgPDwgMTkpCisjZGVmaW5lIEZVU0VfUE9TSVhfQUNMCQkoMSA8PCAyMCkKIAogLyoqCiAgKiBDVVNFIElOSVQgcmVxdWVzdC9yZXBseSBmbGFncwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2hzaS9oc2lfY2hhci5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2hzaS9oc2lfY2hhci5oCmluZGV4IDc2MTYwYjQuLmMwMGE0NjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9oc2kvaHNpX2NoYXIuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaHNpL2hzaV9jaGFyLmgKQEAgLTIwLDEwICsyMCwxMSBAQAogICogMDIxMTAtMTMwMSBVU0EKICAqLwogCi0KICNpZm5kZWYgX19IU0lfQ0hBUl9ICiAjZGVmaW5lIF9fSFNJX0NIQVJfSAogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogI2RlZmluZSBIU0lfQ0hBUl9NQUdJQwkJJ2snCiAjZGVmaW5lIEhTQ19JT1cobnVtLCBkdHlwZSkJX0lPVyhIU0lfQ0hBUl9NQUdJQywgbnVtLCBkdHlwZSkKICNkZWZpbmUgSFNDX0lPUihudW0sIGR0eXBlKQlfSU9SKEhTSV9DSEFSX01BR0lDLCBudW0sIGR0eXBlKQpAQCAtNDgsMTYgKzQ5LDE2IEBACiAjZGVmaW5lIEhTQ19BUkJfUFJJTwkJMQogCiBzdHJ1Y3QgaHNjX3J4X2NvbmZpZyB7Ci0JdWludDMyX3QgbW9kZTsKLQl1aW50MzJfdCBmbG93OwotCXVpbnQzMl90IGNoYW5uZWxzOworCV9fdTMyIG1vZGU7CisJX191MzIgZmxvdzsKKwlfX3UzMiBjaGFubmVsczsKIH07CiAKIHN0cnVjdCBoc2NfdHhfY29uZmlnIHsKLQl1aW50MzJfdCBtb2RlOwotCXVpbnQzMl90IGNoYW5uZWxzOwotCXVpbnQzMl90IHNwZWVkOwotCXVpbnQzMl90IGFyYl9tb2RlOworCV9fdTMyIG1vZGU7CisJX191MzIgY2hhbm5lbHM7CisJX191MzIgc3BlZWQ7CisJX191MzIgYXJiX21vZGU7CiB9OwogCiAjZW5kaWYgLyogX19IU0lfQ0hBUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaWZfYnJpZGdlLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfYnJpZGdlLmgKaW5kZXggYzE4NmY2NC4uYWI5MmJjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2JyaWRnZS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pZl9icmlkZ2UuaApAQCAtMTQwLDcgKzE0MCw3IEBACiAJX191NjQgdHhfYnl0ZXM7CiAJX191NjQgdHhfcGFja2V0czsKIAlfX3UxNiB2aWQ7Ci0JX191MTYgcGFkMTsKKwlfX3UxNiBmbGFnczsKIAlfX3UzMiBwYWQyOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2xpbmsuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9pZl9saW5rLmgKaW5kZXggYTFiNTIwMi4uYjRmYmE2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2xpbmsuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfbGluay5oCkBAIC0zMTgsNiArMzE4LDcgQEAKIAlJRkxBX0JSUE9SVF9GTFVTSCwKIAlJRkxBX0JSUE9SVF9NVUxUSUNBU1RfUk9VVEVSLAogCUlGTEFfQlJQT1JUX1BBRCwKKwlJRkxBX0JSUE9SVF9NQ0FTVF9GTE9PRCwKIAlfX0lGTEFfQlJQT1JUX01BWAogfTsKICNkZWZpbmUgSUZMQV9CUlBPUlRfTUFYIChfX0lGTEFfQlJQT1JUX01BWCAtIDEpCkBAIC00NjMsNiArNDY0LDcgQEAKIGVudW0gaXB2bGFuX21vZGUgewogCUlQVkxBTl9NT0RFX0wyID0gMCwKIAlJUFZMQU5fTU9ERV9MMywKKwlJUFZMQU5fTU9ERV9MM1MsCiAJSVBWTEFOX01PREVfTUFYCiB9OwogCkBAIC02MTcsNyArNjE5LDcgQEAKIGVudW0gewogCUlGTEFfVkZfVU5TUEVDLAogCUlGTEFfVkZfTUFDLAkJLyogSGFyZHdhcmUgcXVldWUgc3BlY2lmaWMgYXR0cmlidXRlcyAqLwotCUlGTEFfVkZfVkxBTiwKKwlJRkxBX1ZGX1ZMQU4sCQkvKiBWTEFOIElEIGFuZCBRb1MgKi8KIAlJRkxBX1ZGX1RYX1JBVEUsCS8qIE1heCBUWCBCYW5kd2lkdGggQWxsb2NhdGlvbiAqLwogCUlGTEFfVkZfU1BPT0ZDSEssCS8qIFNwb29mIENoZWNraW5nIG9uL29mZiBzd2l0Y2ggKi8KIAlJRkxBX1ZGX0xJTktfU1RBVEUsCS8qIGxpbmsgc3RhdGUgZW5hYmxlL2Rpc2FibGUvYXV0byBzd2l0Y2ggKi8KQEAgLTYyOSw2ICs2MzEsNyBAQAogCUlGTEFfVkZfVFJVU1QsCQkvKiBUcnVzdCBWRiAqLwogCUlGTEFfVkZfSUJfTk9ERV9HVUlELAkvKiBWRiBJbmZpbmliYW5kIG5vZGUgR1VJRCAqLwogCUlGTEFfVkZfSUJfUE9SVF9HVUlELAkvKiBWRiBJbmZpbmliYW5kIHBvcnQgR1VJRCAqLworCUlGTEFfVkZfVkxBTl9MSVNULAkvKiBuZXN0ZWQgbGlzdCBvZiB2bGFucywgb3B0aW9uIGZvciBRaW5RICovCiAJX19JRkxBX1ZGX01BWCwKIH07CiAKQEAgLTY0NSw2ICs2NDgsMjIgQEAKIAlfX3UzMiBxb3M7CiB9OwogCitlbnVtIHsKKwlJRkxBX1ZGX1ZMQU5fSU5GT19VTlNQRUMsCisJSUZMQV9WRl9WTEFOX0lORk8sCS8qIFZMQU4gSUQsIFFvUyBhbmQgVkxBTiBwcm90b2NvbCAqLworCV9fSUZMQV9WRl9WTEFOX0lORk9fTUFYLAorfTsKKworI2RlZmluZSBJRkxBX1ZGX1ZMQU5fSU5GT19NQVggKF9fSUZMQV9WRl9WTEFOX0lORk9fTUFYIC0gMSkKKyNkZWZpbmUgTUFYX1ZMQU5fTElTVF9MRU4gMQorCitzdHJ1Y3QgaWZsYV92Zl92bGFuX2luZm8geworCV9fdTMyIHZmOworCV9fdTMyIHZsYW47IC8qIDAgLSA0MDk1LCAwIGRpc2FibGVzIFZMQU4gZmlsdGVyICovCisJX191MzIgcW9zOworCV9fYmUxNiB2bGFuX3Byb3RvOyAvKiBWTEFOIHByb3RvY29sIGVpdGhlciA4MDIuMVEgb3IgODAyLjFhZCAqLworfTsKKwogc3RydWN0IGlmbGFfdmZfdHhfcmF0ZSB7CiAJX191MzIgdmY7CiAJX191MzIgcmF0ZTsgLyogTWF4IFRYIGJhbmR3aWR0aCBpbiBNYnBzLCAwIGRpc2FibGVzIHRocm90dGxpbmcgKi8KQEAgLTgyNSw2ICs4NDQsNyBAQAogCUlGTEFfU1RBVFNfTElOS182NCwKIAlJRkxBX1NUQVRTX0xJTktfWFNUQVRTLAogCUlGTEFfU1RBVFNfTElOS19YU1RBVFNfU0xBVkUsCisJSUZMQV9TVEFUU19MSU5LX09GRkxPQURfWFNUQVRTLAogCV9fSUZMQV9TVEFUU19NQVgsCiB9OwogCkBAIC04NDQsNiArODY0LDE0IEBACiB9OwogI2RlZmluZSBMSU5LX1hTVEFUU19UWVBFX01BWCAoX19MSU5LX1hTVEFUU19UWVBFX01BWCAtIDEpCiAKKy8qIFRoZXNlIGFyZSBzdGF0cyBlbWJlZGRlZCBpbnRvIElGTEFfU1RBVFNfTElOS19PRkZMT0FEX1hTVEFUUyAqLworZW51bSB7CisJSUZMQV9PRkZMT0FEX1hTVEFUU19VTlNQRUMsCisJSUZMQV9PRkZMT0FEX1hTVEFUU19DUFVfSElULCAvKiBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKi8KKwlfX0lGTEFfT0ZGTE9BRF9YU1RBVFNfTUFYCit9OworI2RlZmluZSBJRkxBX09GRkxPQURfWFNUQVRTX01BWCAoX19JRkxBX09GRkxPQURfWFNUQVRTX01BWCAtIDEpCisKIC8qIFhEUCBzZWN0aW9uICovCiAKIGVudW0gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BwcG9sMnRwLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb2wydHAuaAppbmRleCAxNjNlOGFkLi40YmQxZjU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb2wydHAuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb2wydHAuaApAQCAtMTYsNyArMTYsOCBAQAogI2RlZmluZSBfVUFQSV9fTElOVVhfSUZfUFBQT0wyVFBfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAKIC8qIFN0cnVjdHVyZSB1c2VkIHRvIGNvbm5lY3QoKSB0aGUgc29ja2V0IHRvIGEgcGFydGljdWxhciB0dW5uZWwgVURQCiAgKiBzb2NrZXQgb3ZlciBJUHY0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BwcG94LmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb3guaAppbmRleCBlMTI4NzY5Li5kMzdiYmIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb3guaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfcHBwb3guaApAQCAtMjEsOCArMjEsMTEgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfcHBwb2wydHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogCiAvKiBGb3IgdXNlci1zcGFjZSBwcm9ncmFtcyB0byBwaWNrIHVwIHRoZXNlIGRlZmluaXRpb25zCiAgKiB3aGljaCB0aGV5IHdvdWxkbid0IGdldCBvdGhlcndpc2Ugd2l0aG91dCBkZWZpbmluZyBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaWZfdHVubmVsLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfdHVubmVsLmgKaW5kZXggMTA0NmY1NS4uOTJmM2M4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3R1bm5lbC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pZl90dW5uZWwuaApAQCAtMiw2ICsyLDkgQEAKICNkZWZpbmUgX1VBUElfSUZfVFVOTkVMX0hfCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKIApAQCAtMjQsOSArMjcsMjMgQEAKICNkZWZpbmUgR1JFX1NFUQkJX19jcHVfdG9fYmUxNigweDEwMDApCiAjZGVmaW5lIEdSRV9TVFJJQ1QJX19jcHVfdG9fYmUxNigweDA4MDApCiAjZGVmaW5lIEdSRV9SRUMJCV9fY3B1X3RvX2JlMTYoMHgwNzAwKQotI2RlZmluZSBHUkVfRkxBR1MJX19jcHVfdG9fYmUxNigweDAwRjgpCisjZGVmaW5lIEdSRV9BQ0sJCV9fY3B1X3RvX2JlMTYoMHgwMDgwKQorI2RlZmluZSBHUkVfRkxBR1MJX19jcHVfdG9fYmUxNigweDAwNzgpCiAjZGVmaW5lIEdSRV9WRVJTSU9OCV9fY3B1X3RvX2JlMTYoMHgwMDA3KQogCisjZGVmaW5lIEdSRV9JU19DU1VNKGYpCQkoKGYpICYgR1JFX0NTVU0pCisjZGVmaW5lIEdSRV9JU19ST1VUSU5HKGYpCSgoZikgJiBHUkVfUk9VVElORykKKyNkZWZpbmUgR1JFX0lTX0tFWShmKQkJKChmKSAmIEdSRV9LRVkpCisjZGVmaW5lIEdSRV9JU19TRVEoZikJCSgoZikgJiBHUkVfU0VRKQorI2RlZmluZSBHUkVfSVNfU1RSSUNUKGYpCSgoZikgJiBHUkVfU1RSSUNUKQorI2RlZmluZSBHUkVfSVNfUkVDKGYpCQkoKGYpICYgR1JFX1JFQykKKyNkZWZpbmUgR1JFX0lTX0FDSyhmKQkJKChmKSAmIEdSRV9BQ0spCisKKyNkZWZpbmUgR1JFX1ZFUlNJT05fMAkJX19jcHVfdG9fYmUxNigweDAwMDApCisjZGVmaW5lIEdSRV9WRVJTSU9OXzEJCV9fY3B1X3RvX2JlMTYoMHgwMDAxKQorI2RlZmluZSBHUkVfUFJPVE9fUFBQCQlfX2NwdV90b19iZTE2KDB4ODgwYikKKyNkZWZpbmUgR1JFX1BQVFBfS0VZX01BU0sJX19jcHVfdG9fYmUzMigweGZmZmYpCisKIHN0cnVjdCBpcF90dW5uZWxfcGFybSB7CiAJY2hhcgkJCW5hbWVbSUZOQU1TSVpdOwogCWludAkJCWxpbms7CkBAIC01Nyw2ICs3NCw3IEBACiAJSUZMQV9JUFRVTl9FTkNBUF9GTEFHUywKIAlJRkxBX0lQVFVOX0VOQ0FQX1NQT1JULAogCUlGTEFfSVBUVU5fRU5DQVBfRFBPUlQsCisJSUZMQV9JUFRVTl9DT0xMRUNUX01FVEFEQVRBLAogCV9fSUZMQV9JUFRVTl9NQVgsCiB9OwogI2RlZmluZSBJRkxBX0lQVFVOX01BWAkoX19JRkxBX0lQVFVOX01BWCAtIDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaW5ldF9kaWFnLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaW5ldF9kaWFnLmgKaW5kZXggYWJiZDFkYy4uNTA5Y2Q5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2luZXRfZGlhZy5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pbmV0X2RpYWcuaApAQCAtNzMsNiArNzMsNyBAQAogCUlORVRfRElBR19CQ19TX0NPTkQsCiAJSU5FVF9ESUFHX0JDX0RfQ09ORCwKIAlJTkVUX0RJQUdfQkNfREVWX0NPTkQsICAgLyogdTMyIGlmaW5kZXggKi8KKwlJTkVUX0RJQUdfQkNfTUFSS19DT05ELAogfTsKIAogc3RydWN0IGluZXRfZGlhZ19ob3N0Y29uZCB7CkBAIC04Miw2ICs4MywxMSBAQAogCV9fYmUzMglhZGRyWzBdOwogfTsKIAorc3RydWN0IGluZXRfZGlhZ19tYXJrY29uZCB7CisJX191MzIgbWFyazsKKwlfX3UzMiBtYXNrOworfTsKKwogLyogQmFzZSBpbmZvIHN0cnVjdHVyZS4gSXQgY29udGFpbnMgc29ja2V0IGlkZW50aXR5IChhZGRycy9wb3J0cy9jb29raWUpCiAgKiBhbmQsIGFsYXMsIHRoZSBpbmZvcm1hdGlvbiBzaG93biBieSBuZXRzdGF0LiAqLwogc3RydWN0IGluZXRfZGlhZ19tc2cgewpAQCAtMTE3LDYgKzEyMyw4IEBACiAJSU5FVF9ESUFHX0xPQ0FMUywKIAlJTkVUX0RJQUdfUEVFUlMsCiAJSU5FVF9ESUFHX1BBRCwKKwlJTkVUX0RJQUdfTUFSSywKKwlJTkVUX0RJQUdfQkJSSU5GTywKIAlfX0lORVRfRElBR19NQVgsCiB9OwogCkBAIC0xNTAsOCArMTU4LDIwIEBACiAJX191MzIJZGN0Y3BfYWJfdG90OwogfTsKIAorLyogSU5FVF9ESUFHX0JCUklORk8gKi8KKworc3RydWN0IHRjcF9iYnJfaW5mbyB7CisJLyogdTY0IGJ3OiBtYXgtZmlsdGVyZWQgQlcgKGFwcCB0aHJvdWdocHV0KSBlc3RpbWF0ZSBpbiBCeXRlIHBlciBzZWM6ICovCisJX191MzIJYmJyX2J3X2xvOwkJLyogbG93ZXIgMzIgYml0cyBvZiBidyAqLworCV9fdTMyCWJicl9id19oaTsJCS8qIHVwcGVyIDMyIGJpdHMgb2YgYncgKi8KKwlfX3UzMgliYnJfbWluX3J0dDsJCS8qIG1pbi1maWx0ZXJlZCBSVFQgaW4gdVNlYyAqLworCV9fdTMyCWJicl9wYWNpbmdfZ2FpbjsJLyogcGFjaW5nIGdhaW4gc2hpZnRlZCBsZWZ0IDggYml0cyAqLworCV9fdTMyCWJicl9jd25kX2dhaW47CQkvKiBjd25kIGdhaW4gc2hpZnRlZCBsZWZ0IDggYml0cyAqLworfTsKKwogdW5pb24gdGNwX2NjX2luZm8gewogCXN0cnVjdCB0Y3B2ZWdhc19pbmZvCXZlZ2FzOwogCXN0cnVjdCB0Y3BfZGN0Y3BfaW5mbwlkY3RjcDsKKwlzdHJ1Y3QgdGNwX2Jicl9pbmZvCWJicjsKIH07CiAjZW5kaWYgLyogX1VBUElfSU5FVF9ESUFHX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaW5wdXQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9pbnB1dC5oCmluZGV4IGM1MTQ5NDEuLmU3OTRmN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pbnB1dC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pbnB1dC5oCkBAIC0yNDgsNiArMjQ4LDcgQEAKICNkZWZpbmUgQlVTX1NQSQkJCTB4MUMKICNkZWZpbmUgQlVTX1JNSQkJCTB4MUQKICNkZWZpbmUgQlVTX0NFQwkJCTB4MUUKKyNkZWZpbmUgQlVTX0lOVEVMX0lTSFRQCQkweDFGCiAKIC8qCiAgKiBNVF9UT09MIHR5cGVzCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaXB2Ni5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lwdjYuaAppbmRleCAzOTU4NzYwLi44YzI3NzIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvaXB2Ni5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9pcHY2LmgKQEAgLTE3Nyw2ICsxNzcsNyBAQAogCURFVkNPTkZfRFJPUF9VTklDQVNUX0lOX0wyX01VTFRJQ0FTVCwKIAlERVZDT05GX0RST1BfVU5TT0xJQ0lURURfTkEsCiAJREVWQ09ORl9LRUVQX0FERFJfT05fRE9XTiwKKwlERVZDT05GX1JUUl9TT0xJQ0lUX01BWF9JTlRFUlZBTCwKIAlERVZDT05GX01BWAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lweC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lweC5oCmluZGV4IDNkNDgwMTQuLjMwZjAzMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pcHguaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaXB4LmgKQEAgLTEsMTEgKzEsMTMgQEAKICNpZm5kZWYgX0lQWF9IXwogI2RlZmluZSBfSVBYX0hfCisjaW5jbHVkZSA8bGludXgvbGliYy1jb21wYXQuaD4JLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBnbGliYyBuZXRpcHgvaXB4LmggKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KICNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KICNkZWZpbmUgSVBYX05PREVfTEVOCTYKICNkZWZpbmUgSVBYX01UVQkJNTc2CiAKKyNpZiBfX1VBUElfREVGX1NPQ0tBRERSX0lQWAogc3RydWN0IHNvY2thZGRyX2lweCB7CiAJX19rZXJuZWxfc2FfZmFtaWx5X3Qgc2lweF9mYW1pbHk7CiAJX19iZTE2CQlzaXB4X3BvcnQ7CkBAIC0xNCw2ICsxNiw3IEBACiAJX191OAkJc2lweF90eXBlOwogCXVuc2lnbmVkIGNoYXIJc2lweF96ZXJvOwkvKiAxNiBieXRlIGZpbGwgKi8KIH07CisjZW5kaWYgLyogX19VQVBJX0RFRl9TT0NLQUREUl9JUFggKi8KIAogLyoKICAqIFNvIHdlIGNhbiBmaXQgdGhlIGV4dHJhIGluZm8gZm9yIFNJT0NTSUZBRERSIGludG8gdGhlIGFkZHJlc3MgbmljZWx5CkBAIC0yMywxMiArMjYsMTUgQEAKICNkZWZpbmUgSVBYX0RMVElURgkwCiAjZGVmaW5lIElQWF9DUlRJVEYJMQogCisjaWYgX19VQVBJX0RFRl9JUFhfUk9VVEVfREVGSU5JVElPTgogc3RydWN0IGlweF9yb3V0ZV9kZWZpbml0aW9uIHsKIAlfX2JlMzIgICAgICAgIGlweF9uZXR3b3JrOwogCV9fYmUzMiAgICAgICAgaXB4X3JvdXRlcl9uZXR3b3JrOwogCXVuc2lnbmVkIGNoYXIgaXB4X3JvdXRlcl9ub2RlW0lQWF9OT0RFX0xFTl07CiB9OworI2VuZGlmIC8qIF9fVUFQSV9ERUZfSVBYX1JPVVRFX0RFRklOSVRJT04gKi8KIAorI2lmIF9fVUFQSV9ERUZfSVBYX0lOVEVSRkFDRV9ERUZJTklUSU9OCiBzdHJ1Y3QgaXB4X2ludGVyZmFjZV9kZWZpbml0aW9uIHsKIAlfX2JlMzIgICAgICAgIGlweF9uZXR3b3JrOwogCXVuc2lnbmVkIGNoYXIgaXB4X2RldmljZVsxNl07CkBAIC00NSwxNiArNTEsMjAgQEAKICNkZWZpbmUgSVBYX0lOVEVSTkFMCQkyCiAJdW5zaWduZWQgY2hhciBpcHhfbm9kZVtJUFhfTk9ERV9MRU5dOwogfTsKLQkKKyNlbmRpZiAvKiBfX1VBUElfREVGX0lQWF9JTlRFUkZBQ0VfREVGSU5JVElPTiAqLworCisjaWYgX19VQVBJX0RFRl9JUFhfQ09ORklHX0RBVEEKIHN0cnVjdCBpcHhfY29uZmlnX2RhdGEgewogCXVuc2lnbmVkIGNoYXIJaXB4Y2ZnX2F1dG9fc2VsZWN0X3ByaW1hcnk7CiAJdW5zaWduZWQgY2hhcglpcHhjZmdfYXV0b19jcmVhdGVfaW50ZXJmYWNlczsKIH07CisjZW5kaWYgLyogX19VQVBJX0RFRl9JUFhfQ09ORklHX0RBVEEgKi8KIAogLyoKICAqIE9MRCBSb3V0ZSBEZWZpbml0aW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICovCiAKKyNpZiBfX1VBUElfREVGX0lQWF9ST1VURV9ERUYKIHN0cnVjdCBpcHhfcm91dGVfZGVmIHsKIAlfX2JlMzIJCWlweF9uZXR3b3JrOwogCV9fYmUzMgkJaXB4X3JvdXRlcl9uZXR3b3JrOwpAQCAtNjcsNiArNzcsNyBAQAogI2RlZmluZSBJUFhfUlRfQkxVRUJPT0sJCTIKICNkZWZpbmUgSVBYX1JUX1JPVVRFRAkJMQogfTsKKyNlbmRpZiAvKiBfX1VBUElfREVGX0lQWF9ST1VURV9ERUYgKi8KIAogI2RlZmluZSBTSU9DQUlQWElURkNSVAkJKFNJT0NQUk9UT1BSSVZBVEUpCiAjZGVmaW5lIFNJT0NBSVBYUFJJU0xUCQkoU0lPQ1BST1RPUFJJVkFURSArIDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbGliYy1jb21wYXQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9saWJjLWNvbXBhdC5oCmluZGV4IGU0ZjA0OGUuLjQ0YjhhNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9saWJjLWNvbXBhdC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9saWJjLWNvbXBhdC5oCkBAIC0xMzksNiArMTM5LDI1IEBACiAKICNlbmRpZiAvKiBfTkVUSU5FVF9JTl9IICovCiAKKy8qIENvb3JkaW5hdGUgd2l0aCBnbGliYyBuZXRpcHgvaXB4LmggaGVhZGVyLiAqLworI2lmIGRlZmluZWQoX19ORVRJUFhfSVBYX0gpCisKKyNkZWZpbmUgX19VQVBJX0RFRl9TT0NLQUREUl9JUFgJCQkwCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX1JPVVRFX0RFRklOSVRJT04JCTAKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfSU5URVJGQUNFX0RFRklOSVRJT04JMAorI2RlZmluZSBfX1VBUElfREVGX0lQWF9DT05GSUdfREFUQQkJMAorI2RlZmluZSBfX1VBUElfREVGX0lQWF9ST1VURV9ERUYJCTAKKworI2Vsc2UgLyogZGVmaW5lZChfX05FVElQWF9JUFhfSCkgKi8KKworI2RlZmluZSBfX1VBUElfREVGX1NPQ0tBRERSX0lQWAkJCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfUk9VVEVfREVGSU5JVElPTgkJMQorI2RlZmluZSBfX1VBUElfREVGX0lQWF9JTlRFUkZBQ0VfREVGSU5JVElPTgkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX0NPTkZJR19EQVRBCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX1JPVVRFX0RFRgkJMQorCisjZW5kaWYgLyogZGVmaW5lZChfX05FVElQWF9JUFhfSCkgKi8KKwogLyogRGVmaW5pdGlvbnMgZm9yIHhhdHRyLmggKi8KICNpZiBkZWZpbmVkKF9TWVNfWEFUVFJfSCkKICNkZWZpbmUgX19VQVBJX0RFRl9YQVRUUgkJMApAQCAtMTc5LDYgKzE5OCwxMyBAQAogI2RlZmluZSBfX1VBUElfREVGX0lONl9QS1RJTkZPCQkxCiAjZGVmaW5lIF9fVUFQSV9ERUZfSVA2X01UVUlORk8JCTEKIAorLyogRGVmaW5pdGlvbnMgZm9yIGlweC5oICovCisjZGVmaW5lIF9fVUFQSV9ERUZfU09DS0FERFJfSVBYCQkJMQorI2RlZmluZSBfX1VBUElfREVGX0lQWF9ST1VURV9ERUZJTklUSU9OCQkxCisjZGVmaW5lIF9fVUFQSV9ERUZfSVBYX0lOVEVSRkFDRV9ERUZJTklUSU9OCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfQ09ORklHX0RBVEEJCTEKKyNkZWZpbmUgX19VQVBJX0RFRl9JUFhfUk9VVEVfREVGCQkxCisKIC8qIERlZmluaXRpb25zIGZvciB4YXR0ci5oICovCiAjZGVmaW5lIF9fVUFQSV9ERUZfWEFUVFIJCTEKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L21paS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21paS5oCmluZGV4IDIzN2ZhYzQuLjE1ZDg1MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9taWkuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbWlpLmgKQEAgLTQ4LDYgKzQ4LDcgQEAKICNkZWZpbmUgQk1DUl9TUEVFRDEwMAkJMHgyMDAwCS8qIFNlbGVjdCAxMDBNYnBzICAgICAgICAgICAgICAqLwogI2RlZmluZSBCTUNSX0xPT1BCQUNLCQkweDQwMDAJLyogVFhEIGxvb3BiYWNrIGJpdHMgICAgICAgICAgICovCiAjZGVmaW5lIEJNQ1JfUkVTRVQJCTB4ODAwMAkvKiBSZXNldCB0byBkZWZhdWx0IHN0YXRlICAgICAgKi8KKyNkZWZpbmUgQk1DUl9TUEVFRDEwCQkweDAwMDAJLyogU2VsZWN0IDEwTWJwcyAgICAgICAgICAgICAgICovCiAKIC8qIEJhc2ljIG1vZGUgc3RhdHVzIHJlZ2lzdGVyLiAqLwogI2RlZmluZSBCTVNSX0VSQ0FQCQkweDAwMDEJLyogRXh0LXJlZyBjYXBhYmlsaXR5ICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mX2xvZy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl9sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmUyMWUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl9sb2cuaApAQCAtMCwwICsxLDEyIEBACisjaWZuZGVmIF9ORVRGSUxURVJfTkZfTE9HX0gKKyNkZWZpbmUgX05FVEZJTFRFUl9ORl9MT0dfSAorCisjZGVmaW5lIE5GX0xPR19UQ1BTRVEJCTB4MDEJLyogTG9nIFRDUCBzZXF1ZW5jZSBudW1iZXJzICovCisjZGVmaW5lIE5GX0xPR19UQ1BPUFQJCTB4MDIJLyogTG9nIFRDUCBvcHRpb25zICovCisjZGVmaW5lIE5GX0xPR19JUE9QVAkJMHgwNAkvKiBMb2cgSVAgb3B0aW9ucyAqLworI2RlZmluZSBORl9MT0dfVUlECQkweDA4CS8qIExvZyBVSUQgb3duaW5nIGxvY2FsIHNvY2tldCAqLworI2RlZmluZSBORl9MT0dfTkZMT0cJCTB4MTAJLyogVW5zdXBwb3J0ZWQsIGRvbid0IHJldXNlICovCisjZGVmaW5lIE5GX0xPR19NQUNERUNPREUJMHgyMAkvKiBEZWNvZGUgTUFDIGhlYWRlciAqLworI2RlZmluZSBORl9MT0dfTUFTSwkJMHgyZgorCisjZW5kaWYgLyogX05FVEZJTFRFUl9ORl9MT0dfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmgKaW5kZXggYzY3NGJhMi4uYzZjNDQ3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oCkBAIC01NDYsNiArNTQ2LDM1IEBACiB9OwogI2RlZmluZSBORlRBX0NNUF9NQVgJCShfX05GVEFfQ01QX01BWCAtIDEpCiAKKy8qKgorICogZW51bSBuZnRfcmFuZ2Vfb3BzIC0gbmZfdGFibGVzIHJhbmdlIG9wZXJhdG9yCisgKgorICogQE5GVF9SQU5HRV9FUTogZXF1YWwKKyAqIEBORlRfUkFOR0VfTkVROiBub3QgZXF1YWwKKyAqLworZW51bSBuZnRfcmFuZ2Vfb3BzIHsKKwlORlRfUkFOR0VfRVEsCisJTkZUX1JBTkdFX05FUSwKK307CisKKy8qKgorICogZW51bSBuZnRfcmFuZ2VfYXR0cmlidXRlcyAtIG5mX3RhYmxlcyByYW5nZSBleHByZXNzaW9uIG5ldGxpbmsgYXR0cmlidXRlcworICoKKyAqIEBORlRBX1JBTkdFX1NSRUc6IHNvdXJjZSByZWdpc3RlciBvZiBkYXRhIHRvIGNvbXBhcmUgKE5MQV9VMzI6IG5mdF9yZWdpc3RlcnMpCisgKiBATkZUQV9SQU5HRV9PUDogY21wIG9wZXJhdGlvbiAoTkxBX1UzMjogbmZ0X2NtcF9vcHMpCisgKiBATkZUQV9SQU5HRV9GUk9NX0RBVEE6IGRhdGEgcmFuZ2UgZnJvbSAoTkxBX05FU1RFRDogbmZ0X2RhdGFfYXR0cmlidXRlcykKKyAqIEBORlRBX1JBTkdFX1RPX0RBVEE6IGRhdGEgcmFuZ2UgdG8gKE5MQV9ORVNURUQ6IG5mdF9kYXRhX2F0dHJpYnV0ZXMpCisgKi8KK2VudW0gbmZ0X3JhbmdlX2F0dHJpYnV0ZXMgeworCU5GVEFfUkFOR0VfVU5TUEVDLAorCU5GVEFfUkFOR0VfU1JFRywKKwlORlRBX1JBTkdFX09QLAorCU5GVEFfUkFOR0VfRlJPTV9EQVRBLAorCU5GVEFfUkFOR0VfVE9fREFUQSwKKwlfX05GVEFfUkFOR0VfTUFYCit9OworI2RlZmluZSBORlRBX1JBTkdFX01BWAkJKF9fTkZUQV9SQU5HRV9NQVggLSAxKQorCiBlbnVtIG5mdF9sb29rdXBfZmxhZ3MgewogCU5GVF9MT09LVVBfRl9JTlYgPSAoMSA8PCAwKSwKIH07CkBAIC01NzUsNiArNjA0LDEwIEBACiAJTkZUX0RZTlNFVF9PUF9VUERBVEUsCiB9OwogCitlbnVtIG5mdF9keW5zZXRfZmxhZ3MgeworCU5GVF9EWU5TRVRfRl9JTlYJPSAoMSA8PCAwKSwKK307CisKIC8qKgogICogZW51bSBuZnRfZHluc2V0X2F0dHJpYnV0ZXMgLSBkeW5zZXQgZXhwcmVzc2lvbiBhdHRyaWJ1dGVzCiAgKgpAQCAtNTg1LDYgKzYxOCw3IEBACiAgKiBATkZUQV9EWU5TRVRfU1JFR19EQVRBOiBzb3VyY2UgcmVnaXN0ZXIgb2YgdGhlIGRhdGEgKE5MQV9VMzIpCiAgKiBATkZUQV9EWU5TRVRfVElNRU9VVDogdGltZW91dCB2YWx1ZSBmb3IgdGhlIG5ldyBlbGVtZW50IChOTEFfVTY0KQogICogQE5GVEFfRFlOU0VUX0VYUFI6IGV4cHJlc3Npb24gKE5MQV9ORVNURUQ6IG5mdF9leHByX2F0dHJpYnV0ZXMpCisgKiBATkZUQV9EWU5TRVRfRkxBR1M6IGZsYWdzIChOTEFfVTMyKQogICovCiBlbnVtIG5mdF9keW5zZXRfYXR0cmlidXRlcyB7CiAJTkZUQV9EWU5TRVRfVU5TUEVDLApAQCAtNTk2LDYgKzYzMCw3IEBACiAJTkZUQV9EWU5TRVRfVElNRU9VVCwKIAlORlRBX0RZTlNFVF9FWFBSLAogCU5GVEFfRFlOU0VUX1BBRCwKKwlORlRBX0RZTlNFVF9GTEFHUywKIAlfX05GVEFfRFlOU0VUX01BWCwKIH07CiAjZGVmaW5lIE5GVEFfRFlOU0VUX01BWAkJKF9fTkZUQV9EWU5TRVRfTUFYIC0gMSkKQEAgLTcyNCw2ICs3NTksMjggQEAKIH07CiAKIC8qKgorICogZW51bSBuZnRfaGFzaF9hdHRyaWJ1dGVzIC0gbmZfdGFibGVzIGhhc2ggZXhwcmVzc2lvbiBuZXRsaW5rIGF0dHJpYnV0ZXMKKyAqCisgKiBATkZUQV9IQVNIX1NSRUc6IHNvdXJjZSByZWdpc3RlciAoTkxBX1UzMikKKyAqIEBORlRBX0hBU0hfRFJFRzogZGVzdGluYXRpb24gcmVnaXN0ZXIgKE5MQV9VMzIpCisgKiBATkZUQV9IQVNIX0xFTjogc291cmNlIGRhdGEgbGVuZ3RoIChOTEFfVTMyKQorICogQE5GVEFfSEFTSF9NT0RVTFVTOiBtb2R1bHVzIHZhbHVlIChOTEFfVTMyKQorICogQE5GVEFfSEFTSF9TRUVEOiBzZWVkIHZhbHVlIChOTEFfVTMyKQorICogQE5GVEFfSEFTSF9PRkZTRVQ6IGFkZCB0aGlzIG9mZnNldCB2YWx1ZSB0byBoYXNoIHJlc3VsdCAoTkxBX1UzMikKKyAqLworZW51bSBuZnRfaGFzaF9hdHRyaWJ1dGVzIHsKKwlORlRBX0hBU0hfVU5TUEVDLAorCU5GVEFfSEFTSF9TUkVHLAorCU5GVEFfSEFTSF9EUkVHLAorCU5GVEFfSEFTSF9MRU4sCisJTkZUQV9IQVNIX01PRFVMVVMsCisJTkZUQV9IQVNIX1NFRUQsCisJTkZUQV9IQVNIX09GRlNFVCwKKwlfX05GVEFfSEFTSF9NQVgsCit9OworI2RlZmluZSBORlRBX0hBU0hfTUFYCShfX05GVEFfSEFTSF9NQVggLSAxKQorCisvKioKICAqIGVudW0gbmZ0X21ldGFfYXR0cmlidXRlcyAtIG5mX3RhYmxlcyBtZXRhIGV4cHJlc3Npb24gbmV0bGluayBhdHRyaWJ1dGVzCiAgKgogICogQE5GVEFfTUVUQV9EUkVHOiBkZXN0aW5hdGlvbiByZWdpc3RlciAoTkxBX1UzMikKQEAgLTg2NiwxMiArOTIzLDE0IEBACiAgKiBATkZUQV9RVUVVRV9OVU06IG5ldGxpbmsgcXVldWUgdG8gc2VuZCBtZXNzYWdlcyB0byAoTkxBX1UxNikKICAqIEBORlRBX1FVRVVFX1RPVEFMOiBudW1iZXIgb2YgcXVldWVzIHRvIGxvYWQgYmFsYW5jZSBwYWNrZXRzIG9uIChOTEFfVTE2KQogICogQE5GVEFfUVVFVUVfRkxBR1M6IHZhcmlvdXMgZmxhZ3MgKE5MQV9VMTYpCisgKiBATkZUQV9RVUVVRV9TUkVHX1FOVU06IHNvdXJjZSByZWdpc3RlciBvZiBxdWV1ZSBudW1iZXIgKE5MQV9VMzI6IG5mdF9yZWdpc3RlcnMpCiAgKi8KIGVudW0gbmZ0X3F1ZXVlX2F0dHJpYnV0ZXMgewogCU5GVEFfUVVFVUVfVU5TUEVDLAogCU5GVEFfUVVFVUVfTlVNLAogCU5GVEFfUVVFVUVfVE9UQUwsCiAJTkZUQV9RVUVVRV9GTEFHUywKKwlORlRBX1FVRVVFX1NSRUdfUU5VTSwKIAlfX05GVEFfUVVFVUVfTUFYCiB9OwogI2RlZmluZSBORlRBX1FVRVVFX01BWAkJKF9fTkZUQV9RVUVVRV9NQVggLSAxKQpAQCAtODgwLDYgKzkzOSwyNSBAQAogI2RlZmluZSBORlRfUVVFVUVfRkxBR19DUFVfRkFOT1VUCTB4MDIgLyogdXNlIGN1cnJlbnQgQ1BVIChubyBoYXNoaW5nKSAqLwogI2RlZmluZSBORlRfUVVFVUVfRkxBR19NQVNLCQkweDAzCiAKK2VudW0gbmZ0X3F1b3RhX2ZsYWdzIHsKKwlORlRfUVVPVEFfRl9JTlYJCT0gKDEgPDwgMCksCit9OworCisvKioKKyAqIGVudW0gbmZ0X3F1b3RhX2F0dHJpYnV0ZXMgLSBuZl90YWJsZXMgcXVvdGEgZXhwcmVzc2lvbiBuZXRsaW5rIGF0dHJpYnV0ZXMKKyAqCisgKiBATkZUQV9RVU9UQV9CWVRFUzogcXVvdGEgaW4gYnl0ZXMgKE5MQV9VMTYpCisgKiBATkZUQV9RVU9UQV9GTEFHUzogZmxhZ3MgKE5MQV9VMzIpCisgKi8KK2VudW0gbmZ0X3F1b3RhX2F0dHJpYnV0ZXMgeworCU5GVEFfUVVPVEFfVU5TUEVDLAorCU5GVEFfUVVPVEFfQllURVMsCisJTkZUQV9RVU9UQV9GTEFHUywKKwlORlRBX1FVT1RBX1BBRCwKKwlfX05GVEFfUVVPVEFfTUFYCit9OworI2RlZmluZSBORlRBX1FVT1RBX01BWAkJKF9fTkZUQV9RVU9UQV9NQVggLSAxKQorCiAvKioKICAqIGVudW0gbmZ0X3JlamVjdF90eXBlcyAtIG5mX3RhYmxlcyByZWplY3QgZXhwcmVzc2lvbiByZWplY3QgdHlwZXMKICAqCkBAIC0xMDUxLDcgKzExMjksNyBAQAogICogQE5GVEFfVFJBQ0VfTkZQUk9UTzogbmYgcHJvdG9jb2wgcHJvY2Vzc2VkIChOTEFfVTMyKQogICogQE5GVEFfVFJBQ0VfUE9MSUNZOiBwb2xpY3kgdGhhdCBkZWNpZGVkIGZhdGUgb2YgcGFja2V0IChOTEFfVTMyKQogICovCi1lbnVtIG5mdF90cmFjZV9hdHRpYnV0ZXMgeworZW51bSBuZnRfdHJhY2VfYXR0cmlidXRlcyB7CiAJTkZUQV9UUkFDRV9VTlNQRUMsCiAJTkZUQV9UUkFDRV9UQUJMRSwKIAlORlRBX1RSQUNFX0NIQUlOLApAQCAtMTA4Miw0ICsxMTYwLDMwIEBACiAJX19ORlRfVFJBQ0VUWVBFX01BWAogfTsKICNkZWZpbmUgTkZUX1RSQUNFVFlQRV9NQVggKF9fTkZUX1RSQUNFVFlQRV9NQVggLSAxKQorCisvKioKKyAqIGVudW0gbmZ0X25nX2F0dHJpYnV0ZXMgLSBuZl90YWJsZXMgbnVtYmVyIGdlbmVyYXRvciBleHByZXNzaW9uIG5ldGxpbmsgYXR0cmlidXRlcworICoKKyAqIEBORlRBX05HX0RSRUc6IGRlc3RpbmF0aW9uIHJlZ2lzdGVyIChOTEFfVTMyKQorICogQE5GVEFfTkdfTU9EVUxVUzogbWF4aW11bSBjb3VudGVyIHZhbHVlIChOTEFfVTMyKQorICogQE5GVEFfTkdfVFlQRTogb3BlcmF0aW9uIHR5cGUgKE5MQV9VMzIpCisgKiBATkZUQV9OR19PRkZTRVQ6IG9mZnNldCB0byBiZSBhZGRlZCB0byB0aGUgY291bnRlciAoTkxBX1UzMikKKyAqLworZW51bSBuZnRfbmdfYXR0cmlidXRlcyB7CisJTkZUQV9OR19VTlNQRUMsCisJTkZUQV9OR19EUkVHLAorCU5GVEFfTkdfTU9EVUxVUywKKwlORlRBX05HX1RZUEUsCisJTkZUQV9OR19PRkZTRVQsCisJX19ORlRBX05HX01BWAorfTsKKyNkZWZpbmUgTkZUQV9OR19NQVgJKF9fTkZUQV9OR19NQVggLSAxKQorCitlbnVtIG5mdF9uZ190eXBlcyB7CisJTkZUX05HX0lOQ1JFTUVOVEFMLAorCU5GVF9OR19SQU5ET00sCisJX19ORlRfTkdfTUFYCit9OworI2RlZmluZSBORlRfTkdfTUFYCShfX05GVF9OR19NQVggLSAxKQorCiAjZW5kaWYgLyogX0xJTlVYX05GX1RBQkxFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2Nvbm50cmFjay5oCmluZGV4IDlkZjc4OTcwLi42ZGViODg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaApAQCAtMjMxLDEzICsyMzEsMTMgQEAKIAogZW51bSBjdGF0dHJfc3RhdHNfY3B1IHsKIAlDVEFfU1RBVFNfVU5TUEVDLAotCUNUQV9TVEFUU19TRUFSQ0hFRCwKKwlDVEFfU1RBVFNfU0VBUkNIRUQsCS8qIG5vIGxvbmdlciB1c2VkICovCiAJQ1RBX1NUQVRTX0ZPVU5ELAotCUNUQV9TVEFUU19ORVcsCisJQ1RBX1NUQVRTX05FVywJCS8qIG5vIGxvbmdlciB1c2VkICovCiAJQ1RBX1NUQVRTX0lOVkFMSUQsCiAJQ1RBX1NUQVRTX0lHTk9SRSwKLQlDVEFfU1RBVFNfREVMRVRFLAotCUNUQV9TVEFUU19ERUxFVEVfTElTVCwKKwlDVEFfU1RBVFNfREVMRVRFLAkvKiBubyBsb25nZXIgdXNlZCAqLworCUNUQV9TVEFUU19ERUxFVEVfTElTVCwJLyogbm8gbG9uZ2VyIHVzZWQgKi8KIAlDVEFfU1RBVFNfSU5TRVJULAogCUNUQV9TVEFUU19JTlNFUlRfRkFJTEVELAogCUNUQV9TVEFUU19EUk9QLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmgKaW5kZXggNmRiOTAzNy4uM2VmYzBjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5oCkBAIC02LDYgKzYsNyBAQAogCiAvKiB0aW1pbmdzIGFyZSBpbiBtaWxsaXNlY29uZHMuICovCiAjZGVmaW5lIFhUX0hBU0hMSU1JVF9TQ0FMRSAxMDAwMAorI2RlZmluZSBYVF9IQVNITElNSVRfU0NBTEVfdjIgMTAwMDAwMGxsdQogLyogMS8xMCwwMDAgc2VjIHBlcmlvZCA9PiBtYXggb2YgMTAsMDAwL3NlYy4gIE1pbiByYXRlIGlzIHRoZW4gNDI5NDkwCiAgKiBzZWNvbmRzLCBvciBvbmUgcGFja2V0IGV2ZXJ5IDU5IGhvdXJzLgogICovCkBAIC02Myw2ICs2NCwyMCBAQAogCV9fdTggc3JjbWFzaywgZHN0bWFzazsKIH07CiAKK3N0cnVjdCBoYXNobGltaXRfY2ZnMiB7CisJX191NjQgYXZnOwkJLyogQXZlcmFnZSBzZWNzIGJldHdlZW4gcGFja2V0cyAqIHNjYWxlICovCisJX191NjQgYnVyc3Q7CQkvKiBQZXJpb2QgbXVsdGlwbGllciBmb3IgdXBwZXIgbGltaXQuICovCisJX191MzIgbW9kZTsJCS8qIGJpdG1hc2sgb2YgWFRfSEFTSExJTUlUX0hBU0hfKiAqLworCisJLyogdXNlciBzcGVjaWZpZWQgKi8KKwlfX3UzMiBzaXplOwkJLyogaG93IG1hbnkgYnVja2V0cyAqLworCV9fdTMyIG1heDsJCS8qIG1heCBudW1iZXIgb2YgZW50cmllcyAqLworCV9fdTMyIGdjX2ludGVydmFsOwkvKiBnYyBpbnRlcnZhbCAqLworCV9fdTMyIGV4cGlyZTsJCS8qIHdoZW4gZG8gZW50cmllcyBleHBpcmU/ICovCisKKwlfX3U4IHNyY21hc2ssIGRzdG1hc2s7Cit9OworCiBzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzEgewogCWNoYXIgbmFtZVtJRk5BTVNJWl07CiAJc3RydWN0IGhhc2hsaW1pdF9jZmcxIGNmZzsKQEAgLTcxLDQgKzg2LDEyIEBACiAJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvIF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKIH07CiAKK3N0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMiB7CisJY2hhciBuYW1lW05BTUVfTUFYXTsKKwlzdHJ1Y3QgaGFzaGxpbWl0X2NmZzIgY2ZnOworCisJLyogVXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBrZXJuZWwgKi8KKwlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworfTsKKwogI2VuZGlmIC8qIF9VQVBJX1hUX0hBU0hMSU1JVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbmw4MDIxMS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L25sODAyMTEuaAppbmRleCAyMjA2OTQxLi41NjM2OGU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbmw4MDIxMS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9ubDgwMjExLmgKQEAgLTQ4LDYgKzQ4LDcgQEAKICNkZWZpbmUgTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfUkVHCQkicmVndWxhdG9yeSIKICNkZWZpbmUgTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfTUxNRQkJIm1sbWUiCiAjZGVmaW5lIE5MODAyMTFfTVVMVElDQVNUX0dST1VQX1ZFTkRPUgkJInZlbmRvciIKKyNkZWZpbmUgTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfTkFOCQkibmFuIgogI2RlZmluZSBOTDgwMjExX01VTFRJQ0FTVF9HUk9VUF9URVNUTU9ERQkidGVzdG1vZGUiCiAKIC8qKgpAQCAtODM4LDYgKzgzOSw0MSBAQAogICoJbm90IHJ1bm5pbmcuIFRoZSBkcml2ZXIgaW5kaWNhdGVzIHRoZSBzdGF0dXMgb2YgdGhlIHNjYW4gdGhyb3VnaAogICoJY2ZnODAyMTFfc2Nhbl9kb25lKCkuCiAgKgorICogQE5MODAyMTFfQ01EX1NUQVJUX05BTjogU3RhcnQgTkFOIG9wZXJhdGlvbiwgaWRlbnRpZmllZCBieSBpdHMKKyAqCSVOTDgwMjExX0FUVFJfV0RFViBpbnRlcmZhY2UuIFRoaXMgaW50ZXJmYWNlIG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkKKyAqCWNyZWF0ZWQgd2l0aCAlTkw4MDIxMV9DTURfTkVXX0lOVEVSRkFDRS4gQWZ0ZXIgaXQgaGFzIGJlZW4gc3RhcnRlZCwgdGhlCisgKglOQU4gaW50ZXJmYWNlIHdpbGwgY3JlYXRlIG9yIGpvaW4gYSBjbHVzdGVyLiBUaGlzIGNvbW1hbmQgbXVzdCBoYXZlIGEKKyAqCXZhbGlkICVOTDgwMjExX0FUVFJfTkFOX01BU1RFUl9QUkVGIGF0dHJpYnV0ZSBhbmQgb3B0aW9uYWwKKyAqCSVOTDgwMjExX0FUVFJfTkFOX0RVQUwgYXR0cmlidXRlcy4KKyAqCUFmdGVyIHRoaXMgY29tbWFuZCBOQU4gZnVuY3Rpb25zIGNhbiBiZSBhZGRlZC4KKyAqIEBOTDgwMjExX0NNRF9TVE9QX05BTjogU3RvcCB0aGUgTkFOIG9wZXJhdGlvbiwgaWRlbnRpZmllZCBieQorICoJaXRzICVOTDgwMjExX0FUVFJfV0RFViBpbnRlcmZhY2UuCisgKiBATkw4MDIxMV9DTURfQUREX05BTl9GVU5DVElPTjogQWRkIGEgTkFOIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gaXMgZGVmaW5lZAorICoJd2l0aCAlTkw4MDIxMV9BVFRSX05BTl9GVU5DIG5lc3RlZCBhdHRyaWJ1dGUuIFdoZW4gY2FsbGVkLCB0aGlzCisgKglvcGVyYXRpb24gcmV0dXJucyB0aGUgc3RyaWN0bHkgcG9zaXRpdmUgYW5kIHVuaXF1ZSBpbnN0YW5jZSBpZAorICoJKCVOTDgwMjExX0FUVFJfTkFOX0ZVTkNfSU5TVF9JRCkgYW5kIGEgY29va2llICglTkw4MDIxMV9BVFRSX0NPT0tJRSkKKyAqCW9mIHRoZSBmdW5jdGlvbiB1cG9uIHN1Y2Nlc3MuCisgKglTaW5jZSBpbnN0YW5jZSBJRCdzIGNhbiBiZSByZS11c2VkLCB0aGlzIGNvb2tpZSBpcyB0aGUgcmlnaHQKKyAqCXdheSB0byBpZGVudGlmeSB0aGUgZnVuY3Rpb24uIFRoaXMgd2lsbCBhdm9pZCByYWNlcyB3aGVuIGEgdGVybWluYXRpb24KKyAqCWV2ZW50IGlzIGhhbmRsZWQgYnkgdGhlIHVzZXIgc3BhY2UgYWZ0ZXIgaXQgaGFzIGFscmVhZHkgYWRkZWQgYSBuZXcKKyAqCWZ1bmN0aW9uIHRoYXQgZ290IHRoZSBzYW1lIGluc3RhbmNlIGlkIGZyb20gdGhlIGtlcm5lbCBhcyB0aGUgb25lCisgKgl3aGljaCBqdXN0IHRlcm1pbmF0ZWQuCisgKglUaGlzIGNvb2tpZSBtYXkgYmUgdXNlZCBpbiBOQU4gZXZlbnRzIGV2ZW4gYmVmb3JlIHRoZSBjb21tYW5kCisgKglyZXR1cm5zLCBzbyB1c2Vyc3BhY2Ugc2hvdWxkbid0IHByb2Nlc3MgTkFOIGV2ZW50cyB1bnRpbCBpdCBwcm9jZXNzZXMKKyAqCXRoZSByZXNwb25zZSB0byB0aGlzIGNvbW1hbmQuCisgKglMb29rIGF0ICVOTDgwMjExX0FUVFJfU09DS0VUX09XTkVSIGFzIHdlbGwuCisgKiBATkw4MDIxMV9DTURfREVMX05BTl9GVU5DVElPTjogRGVsZXRlIGEgTkFOIGZ1bmN0aW9uIGJ5IGNvb2tpZS4KKyAqCVRoaXMgY29tbWFuZCBpcyBhbHNvIHVzZWQgYXMgYSBub3RpZmljYXRpb24gc2VudCB3aGVuIGEgTkFOIGZ1bmN0aW9uIGlzCisgKgl0ZXJtaW5hdGVkLiBUaGlzIHdpbGwgY29udGFpbiBhICVOTDgwMjExX0FUVFJfTkFOX0ZVTkNfSU5TVF9JRAorICoJYW5kICVOTDgwMjExX0FUVFJfQ09PS0lFIGF0dHJpYnV0ZXMuCisgKiBATkw4MDIxMV9DTURfQ0hBTkdFX05BTl9DT05GSUc6IENoYW5nZSBjdXJyZW50IE5BTiBjb25maWd1cmF0aW9uLiBOQU4KKyAqCW11c3QgYmUgb3BlcmF0aW9uYWwgKCVOTDgwMjExX0NNRF9TVEFSVF9OQU4gd2FzIGV4ZWN1dGVkKS4KKyAqCUl0IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICoJJU5MODAyMTFfQVRUUl9OQU5fTUFTVEVSX1BSRUYsICVOTDgwMjExX0FUVFJfTkFOX0RVQUwuCisgKiBATkw4MDIxMV9DTURfTkFOX0ZVTkNfTUFUQ0g6IE5vdGlmaWNhdGlvbiBzZW50IHdoZW4gYSBtYXRjaCBpcyByZXBvcnRlZC4KKyAqCVRoaXMgd2lsbCBjb250YWluIGEgJU5MODAyMTFfQVRUUl9OQU5fTUFUQ0ggbmVzdGVkIGF0dHJpYnV0ZSBhbmQKKyAqCSVOTDgwMjExX0FUVFJfQ09PS0lFLgorICoKICAqIEBOTDgwMjExX0NNRF9NQVg6IGhpZ2hlc3QgdXNlZCBjb21tYW5kIG51bWJlcgogICogQF9fTkw4MDIxMV9DTURfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KQEAgLTEwMjYsNiArMTA2MiwxMyBAQAogCiAJTkw4MDIxMV9DTURfQUJPUlRfU0NBTiwKIAorCU5MODAyMTFfQ01EX1NUQVJUX05BTiwKKwlOTDgwMjExX0NNRF9TVE9QX05BTiwKKwlOTDgwMjExX0NNRF9BRERfTkFOX0ZVTkNUSU9OLAorCU5MODAyMTFfQ01EX0RFTF9OQU5fRlVOQ1RJT04sCisJTkw4MDIxMV9DTURfQ0hBTkdFX05BTl9DT05GSUcsCisJTkw4MDIxMV9DTURfTkFOX01BVENILAorCiAJLyogYWRkIG5ldyBjb21tYW5kcyBhYm92ZSBoZXJlICovCiAKIAkvKiB1c2VkIHRvIGRlZmluZSBOTDgwMjExX0NNRF9NQVggYmVsb3cgKi8KQEAgLTEzNDMsNyArMTM4NiwxMyBAQAogICoJZW51bSBubDgwMjExX2JhbmQgdmFsdWUgaXMgdXNlZCBhcyB0aGUgaW5kZXggKG5sYV90eXBlKCkgb2YgdGhlIG5lc3RlZAogICoJZGF0YS4gSWYgYSBiYW5kIGlzIG5vdCBpbmNsdWRlZCwgaXQgd2lsbCBiZSBjb25maWd1cmVkIHRvIGFsbG93IGFsbAogICoJcmF0ZXMgYmFzZWQgb24gbmVnb3RpYXRlZCBzdXBwb3J0ZWQgcmF0ZXMgaW5mb3JtYXRpb24uIFRoaXMgYXR0cmlidXRlCi0gKglpcyB1c2VkIHdpdGggJU5MODAyMTFfQ01EX1NFVF9UWF9CSVRSQVRFX01BU0suCisgKglpcyB1c2VkIHdpdGggJU5MODAyMTFfQ01EX1NFVF9UWF9CSVRSQVRFX01BU0sgYW5kIHdpdGggc3RhcnRpbmcgQVAsCisgKglhbmQgam9pbmluZyBtZXNoIG5ldHdvcmtzIChub3QgSUJTUyB5ZXQpLiBJbiB0aGUgbGF0ZXIgY2FzZSwgaXQgbXVzdAorICoJc3BlY2lmeSBqdXN0IGEgc2luZ2xlIGJpdHJhdGUsIHdoaWNoIGlzIHRvIGJlIHVzZWQgZm9yIHRoZSBiZWFjb24uCisgKglUaGUgZHJpdmVyIG11c3QgYWxzbyBzcGVjaWZ5IHN1cHBvcnQgZm9yIHRoaXMgd2l0aCB0aGUgZXh0ZW5kZWQKKyAqCWZlYXR1cmVzIE5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfTEVHQUNZLAorICoJTkw4MDIxMV9FWFRfRkVBVFVSRV9CRUFDT05fUkFURV9IVCBhbmQKKyAqCU5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfVkhULgogICoKICAqIEBOTDgwMjExX0FUVFJfRlJBTUVfTUFUQ0g6IEEgYmluYXJ5IGF0dHJpYnV0ZSB3aGljaCB0eXBpY2FsbHkgbXVzdCBjb250YWluCiAgKglhdCBsZWFzdCBvbmUgYnl0ZSwgY3VycmVudGx5IHVzZWQgd2l0aCBATkw4MDIxMV9DTURfUkVHSVNURVJfRlJBTUUuCkBAIC0xNzMzLDYgKzE3ODIsMTIgQEAKICAqCXJlZ3VsYXRvcnkgaW5kb29yIGNvbmZpZ3VyYXRpb24gd291bGQgYmUgb3duZWQgYnkgdGhlIG5ldGxpbmsgc29ja2V0CiAgKgl0aGF0IGNvbmZpZ3VyZWQgdGhlIGluZG9vciBzZXR0aW5nLCBhbmQgdGhlIGluZG9vciBvcGVyYXRpb24gd291bGQgYmUKICAqCWNsZWFyZWQgd2hlbiB0aGUgc29ja2V0IGlzIGNsb3NlZC4KKyAqCUlmIHNldCBkdXJpbmcgTkFOIGludGVyZmFjZSBjcmVhdGlvbiwgdGhlIGludGVyZmFjZSB3aWxsIGJlIGRlc3Ryb3llZAorICoJaWYgdGhlIHNvY2tldCBpcyBjbG9zZWQganVzdCBsaWtlIGFueSBvdGhlciBpbnRlcmZhY2UuIE1vcmVvdmVyLCBvbmx5CisgKgl0aGUgbmV0bGluayBzb2NrZXQgdGhhdCBjcmVhdGVkIHRoZSBpbnRlcmZhY2Ugd2lsbCBiZSBhbGxvd2VkIHRvIGFkZAorICoJYW5kIHJlbW92ZSBmdW5jdGlvbnMuIE5BTiBub3RpZmljYXRpb25zIHdpbGwgYmUgc2VudCBpbiB1bmljYXN0IHRvIHRoYXQKKyAqCXNvY2tldC4gV2l0aG91dCB0aGlzIGF0dHJpYnV0ZSwgYW55IHNvY2tldCBjYW4gYWRkIGZ1bmN0aW9ucyBhbmQgdGhlCisgKglub3RpZmljYXRpb25zIHdpbGwgYmUgc2VudCB0byB0aGUgJU5MODAyMTFfTUNHUlBfTkFOIG11bHRpY2FzdCBncm91cC4KICAqCiAgKiBATkw4MDIxMV9BVFRSX1RETFNfSU5JVElBVE9SOiBmbGFnIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IGVuZCBpcwogICoJdGhlIFRETFMgbGluayBpbml0aWF0b3IuCkBAIC0xODY3LDYgKzE5MjIsMjEgQEAKICAqIEBOTDgwMjExX0FUVFJfTUVTSF9QRUVSX0FJRDogQXNzb2NpYXRpb24gSUQgZm9yIHRoZSBtZXNoIHBlZXIgKHUxNikuIFRoaXMgaXMKICAqCXVzZWQgdG8gcHVsbCB0aGUgc3RvcmVkIGRhdGEgZm9yIG1lc2ggcGVlciBpbiBwb3dlciBzYXZlIHN0YXRlLgogICoKKyAqIEBOTDgwMjExX0FUVFJfTkFOX01BU1RFUl9QUkVGOiB0aGUgbWFzdGVyIHByZWZlcmVuY2UgdG8gYmUgdXNlZCBieQorICoJJU5MODAyMTFfQ01EX1NUQVJUX05BTiBhbmQgb3B0aW9uYWxseSB3aXRoCisgKgklTkw4MDIxMV9DTURfQ0hBTkdFX05BTl9DT05GSUcuIEl0cyB0eXBlIGlzIHU4IGFuZCBpdCBjYW4ndCBiZSAwLgorICoJQWxzbywgdmFsdWVzIDEgYW5kIDI1NSBhcmUgcmVzZXJ2ZWQgZm9yIGNlcnRpZmljYXRpb24gcHVycG9zZXMgYW5kCisgKglzaG91bGQgbm90IGJlIHVzZWQgZHVyaW5nIGEgbm9ybWFsIGRldmljZSBvcGVyYXRpb24uCisgKiBATkw4MDIxMV9BVFRSX05BTl9EVUFMOiBOQU4gZHVhbCBiYW5kIG9wZXJhdGlvbiBjb25maWcgKHNlZQorICoJJmVudW0gbmw4MDIxMV9uYW5fZHVhbF9iYW5kX2NvbmYpLiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHdpdGgKKyAqCSVOTDgwMjExX0NNRF9TVEFSVF9OQU4gYW5kIG9wdGlvbmFsbHkgd2l0aAorICoJJU5MODAyMTFfQ01EX0NIQU5HRV9OQU5fQ09ORklHLgorICogQE5MODAyMTFfQVRUUl9OQU5fRlVOQzogYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBhZGRlZCB0byBOQU4uIFNlZQorICoJJmVudW0gbmw4MDIxMV9uYW5fZnVuY19hdHRyaWJ1dGVzIGZvciBkZXNjcmlwdGlvbiBvZiB0aGlzIG5lc3RlZAorICoJYXR0cmlidXRlLgorICogQE5MODAyMTFfQVRUUl9OQU5fTUFUQ0g6IHVzZWQgdG8gcmVwb3J0IGEgbWF0Y2guIFRoaXMgaXMgYSBuZXN0ZWQgYXR0cmlidXRlLgorICoJU2VlICZlbnVtIG5sODAyMTFfbmFuX21hdGNoX2F0dHJpYnV0ZXMuCisgKgogICogQE5VTV9OTDgwMjExX0FUVFI6IHRvdGFsIG51bWJlciBvZiBubDgwMjExX2F0dHJzIGF2YWlsYWJsZQogICogQE5MODAyMTFfQVRUUl9NQVg6IGhpZ2hlc3QgYXR0cmlidXRlIG51bWJlciBjdXJyZW50bHkgZGVmaW5lZAogICogQF9fTkw4MDIxMV9BVFRSX0FGVEVSX0xBU1Q6IGludGVybmFsIHVzZQpAQCAtMjI2MSw2ICsyMzMxLDExIEBACiAKIAlOTDgwMjExX0FUVFJfTUVTSF9QRUVSX0FJRCwKIAorCU5MODAyMTFfQVRUUl9OQU5fTUFTVEVSX1BSRUYsCisJTkw4MDIxMV9BVFRSX05BTl9EVUFMLAorCU5MODAyMTFfQVRUUl9OQU5fRlVOQywKKwlOTDgwMjExX0FUVFJfTkFOX01BVENILAorCiAJLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCiAKIAlfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNULApAQCAtMjMzOSw2ICsyNDE0LDcgQEAKICAqCWNvbW1hbmRzIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBvbmUKICAqIEBOTDgwMjExX0lGX1RZUEVfT0NCOiBPdXRzaWRlIENvbnRleHQgb2YgYSBCU1MKICAqCVRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byB0aGUgTUlCIHZhcmlhYmxlIGRvdDExT0NCQWN0aXZhdGVkPXRydWUKKyAqIEBOTDgwMjExX0lGVFlQRV9OQU46IE5BTiBkZXZpY2UgaW50ZXJmYWNlIHR5cGUgKG5vdCBhIG5ldGRldikKICAqIEBOTDgwMjExX0lGVFlQRV9NQVg6IGhpZ2hlc3QgaW50ZXJmYWNlIHR5cGUgbnVtYmVyIGN1cnJlbnRseSBkZWZpbmVkCiAgKiBATlVNX05MODAyMTFfSUZUWVBFUzogbnVtYmVyIG9mIGRlZmluZWQgaW50ZXJmYWNlIHR5cGVzCiAgKgpAQCAtMjM1OSw2ICsyNDM1LDcgQEAKIAlOTDgwMjExX0lGVFlQRV9QMlBfR08sCiAJTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSwKIAlOTDgwMjExX0lGVFlQRV9PQ0IsCisJTkw4MDIxMV9JRlRZUEVfTkFOLAogCiAJLyoga2VlcCBsYXN0ICovCiAJTlVNX05MODAyMTFfSUZUWVBFUywKQEAgLTQ1NTEsNiArNDYyOCwxMiBAQAogICoJKGlmIGF2YWlsYWJsZSkuCiAgKiBATkw4MDIxMV9FWFRfRkVBVFVSRV9TRVRfU0NBTl9EV0VMTDogVGhpcyBkcml2ZXIgc3VwcG9ydHMgY29uZmlndXJhdGlvbiBvZgogICoJY2hhbm5lbCBkd2VsbCB0aW1lLgorICogQE5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfTEVHQUNZOiBEcml2ZXIgc3VwcG9ydHMgYmVhY29uIHJhdGUKKyAqCWNvbmZpZ3VyYXRpb24gKEFQL21lc2gpLCBzdXBwb3J0aW5nIGEgbGVnYWN5IChub24gSFQvVkhUKSByYXRlLgorICogQE5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfSFQ6IERyaXZlciBzdXBwb3J0cyBiZWFjb24gcmF0ZQorICoJY29uZmlndXJhdGlvbiAoQVAvbWVzaCkgd2l0aCBIVCByYXRlcy4KKyAqIEBOTDgwMjExX0VYVF9GRUFUVVJFX0JFQUNPTl9SQVRFX1ZIVDogRHJpdmVyIHN1cHBvcnRzIGJlYWNvbiByYXRlCisgKgljb25maWd1cmF0aW9uIChBUC9tZXNoKSB3aXRoIFZIVCByYXRlcy4KICAqCiAgKiBATlVNX05MODAyMTFfRVhUX0ZFQVRVUkVTOiBudW1iZXIgb2YgZXh0ZW5kZWQgZmVhdHVyZXMuCiAgKiBATUFYX05MODAyMTFfRVhUX0ZFQVRVUkVTOiBoaWdoZXN0IGV4dGVuZGVkIGZlYXR1cmUgaW5kZXguCkBAIC00NTYyLDYgKzQ2NDUsOSBAQAogCU5MODAyMTFfRVhUX0ZFQVRVUkVfU0NBTl9TVEFSVF9USU1FLAogCU5MODAyMTFfRVhUX0ZFQVRVUkVfQlNTX1BBUkVOVF9UU0YsCiAJTkw4MDIxMV9FWFRfRkVBVFVSRV9TRVRfU0NBTl9EV0VMTCwKKwlOTDgwMjExX0VYVF9GRUFUVVJFX0JFQUNPTl9SQVRFX0xFR0FDWSwKKwlOTDgwMjExX0VYVF9GRUFUVVJFX0JFQUNPTl9SQVRFX0hULAorCU5MODAyMTFfRVhUX0ZFQVRVUkVfQkVBQ09OX1JBVEVfVkhULAogCiAJLyogYWRkIG5ldyBmZWF0dXJlcyBiZWZvcmUgdGhlIGRlZmluaXRpb24gYmVsb3cgKi8KIAlOVU1fTkw4MDIxMV9FWFRfRkVBVFVSRVMsCkBAIC00ODU1LDQgKzQ5NDEsMTg2IEBACiAJTkw4MDIxMV9CU1NfU0VMRUNUX0FUVFJfTUFYID0gX19OTDgwMjExX0JTU19TRUxFQ1RfQVRUUl9BRlRFUl9MQVNUIC0gMQogfTsKIAorLyoqCisgKiBlbnVtIG5sODAyMTFfbmFuX2R1YWxfYmFuZF9jb25mIC0gTkFOIGR1YWwgYmFuZCBjb25maWd1cmF0aW9uCisgKgorICogRGVmaW5lcyB0aGUgTkFOIGR1YWwgYmFuZCBtb2RlIG9mIG9wZXJhdGlvbgorICoKKyAqIEBOTDgwMjExX05BTl9CQU5EX0RFRkFVTFQ6IGRldmljZSBkZWZhdWx0IG1vZGUKKyAqIEBOTDgwMjExX05BTl9CQU5EXzJHSFo6IDIuNEdIeiBtb2RlCisgKiBATkw4MDIxMV9OQU5fQkFORF81R0haOiA1R0h6IG1vZGUKKyAgKi8KK2VudW0gbmw4MDIxMV9uYW5fZHVhbF9iYW5kX2NvbmYgeworCU5MODAyMTFfTkFOX0JBTkRfREVGQVVMVAk9IDEgPDwgMCwKKwlOTDgwMjExX05BTl9CQU5EXzJHSFoJCT0gMSA8PCAxLAorCU5MODAyMTFfTkFOX0JBTkRfNUdIWgkJPSAxIDw8IDIsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9uYW5fZnVuY3Rpb25fdHlwZSAtIE5BTiBmdW5jdGlvbiB0eXBlCisgKgorICogRGVmaW5lcyB0aGUgZnVuY3Rpb24gdHlwZSBvZiBhIE5BTiBmdW5jdGlvbgorICoKKyAqIEBOTDgwMjExX05BTl9GVU5DX1BVQkxJU0g6IGZ1bmN0aW9uIGlzIHB1Ymxpc2gKKyAqIEBOTDgwMjExX05BTl9GVU5DX1NVQlNDUklCRTogZnVuY3Rpb24gaXMgc3Vic2NyaWJlCisgKiBATkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVA6IGZ1bmN0aW9uIGlzIGZvbGxvdy11cAorICovCitlbnVtIG5sODAyMTFfbmFuX2Z1bmN0aW9uX3R5cGUgeworCU5MODAyMTFfTkFOX0ZVTkNfUFVCTElTSCwKKwlOTDgwMjExX05BTl9GVU5DX1NVQlNDUklCRSwKKwlOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUCwKKworCS8qIGtlZXAgbGFzdCAqLworCV9fTkw4MDIxMV9OQU5fRlVOQ19UWVBFX0FGVEVSX0xBU1QsCisJTkw4MDIxMV9OQU5fRlVOQ19NQVhfVFlQRSA9IF9fTkw4MDIxMV9OQU5fRlVOQ19UWVBFX0FGVEVSX0xBU1QgLSAxLAorfTsKKworLyoqCisgKiBlbnVtIG5sODAyMTFfbmFuX3B1Ymxpc2hfdHlwZSAtIE5BTiBwdWJsaXNoIHR4IHR5cGUKKyAqCisgKiBEZWZpbmVzIGhvdyB0byBzZW5kIHB1Ymxpc2ggU2VydmljZSBEaXNjb3ZlcnkgRnJhbWVzCisgKgorICogQE5MODAyMTFfTkFOX1NPTElDSVRFRF9QVUJMSVNIOiBwdWJsaXNoIGZ1bmN0aW9uIGlzIHNvbGljaXRlZAorICogQE5MODAyMTFfTkFOX1VOU09MSUNJVEVEX1BVQkxJU0g6IHB1Ymxpc2ggZnVuY3Rpb24gaXMgdW5zb2xpY2l0ZWQKKyAqLworZW51bSBubDgwMjExX25hbl9wdWJsaXNoX3R5cGUgeworCU5MODAyMTFfTkFOX1NPTElDSVRFRF9QVUJMSVNIID0gMSA8PCAwLAorCU5MODAyMTFfTkFOX1VOU09MSUNJVEVEX1BVQkxJU0ggPSAxIDw8IDEsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbiAtIE5BTiBmdW5jdGlvbnMgdGVybWluYXRpb24gcmVhc29uCisgKgorICogRGVmaW5lcyB0ZXJtaW5hdGlvbiByZWFzb25zIG9mIGEgTkFOIGZ1bmN0aW9uCisgKgorICogQE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fVVNFUl9SRVFVRVNUOiByZXF1ZXN0ZWQgYnkgdXNlcgorICogQE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT05fVFRMX0VYUElSRUQ6IHRpbWVvdXQKKyAqIEBOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OX0VSUk9SOiBlcnJvcmVkCisgKi8KK2VudW0gbmw4MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbiB7CisJTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl9VU0VSX1JFUVVFU1QsCisJTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl9UVExfRVhQSVJFRCwKKwlOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OX0VSUk9SLAorfTsKKworI2RlZmluZSBOTDgwMjExX05BTl9GVU5DX1NFUlZJQ0VfSURfTEVOIDYKKyNkZWZpbmUgTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX1NQRUNfSU5GT19NQVhfTEVOIDB4ZmYKKyNkZWZpbmUgTkw4MDIxMV9OQU5fRlVOQ19TUkZfTUFYX0xFTiAweGZmCisKKy8qKgorICogZW51bSBubDgwMjExX25hbl9mdW5jX2F0dHJpYnV0ZXMgLSBOQU4gZnVuY3Rpb24gYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9OQU5fRlVOQ19JTlZBTElEOiBpbnZhbGlkCisgKiBATkw4MDIxMV9OQU5fRlVOQ19UWVBFOiAmZW51bSBubDgwMjExX25hbl9mdW5jdGlvbl90eXBlICh1OCkuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lEOiA2IGJ5dGVzIG9mIHRoZSBzZXJ2aWNlIElEIGhhc2ggYXMKKyAqCXNwZWNpZmllZCBpbiBOQU4gc3BlYy4gVGhpcyBpcyBhIGJpbmFyeSBhdHRyaWJ1dGUuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNIX1RZUEU6IHJlbGV2YW50IGlmIHRoZSBmdW5jdGlvbidzIHR5cGUgaXMKKyAqCXB1Ymxpc2guIERlZmluZXMgdGhlIHRyYW5zbWlzc2lvbiB0eXBlIGZvciB0aGUgcHVibGlzaCBTZXJ2aWNlIERpc2NvdmVyeQorICoJRnJhbWUsIHNlZSAmZW51bSBubDgwMjExX25hbl9wdWJsaXNoX3R5cGUuIEl0cyB0eXBlIGlzIHU4LgorICogQE5MODAyMTFfTkFOX0ZVTkNfUFVCTElTSF9CQ0FTVDogcmVsZXZhbnQgaWYgdGhlIGZ1bmN0aW9uIGlzIGEgc29saWNpdGVkCisgKglwdWJsaXNoLiBTaG91bGQgdGhlIHNvbGljaXRlZCBwdWJsaXNoIFNlcnZpY2UgRGlzY292ZXJ5IEZyYW1lIGJlIHNlbnQgdG8KKyAqCXRoZSBOQU4gQnJvYWRjYXN0IGFkZHJlc3MuIFRoaXMgaXMgYSBmbGFnLgorICogQE5MODAyMTFfTkFOX0ZVTkNfU1VCU0NSSUJFX0FDVElWRTogcmVsZXZhbnQgaWYgdGhlIGZ1bmN0aW9uJ3MgdHlwZSBpcworICoJc3Vic2NyaWJlLiBJcyB0aGUgc3Vic2NyaWJlIGFjdGl2ZS4gVGhpcyBpcyBhIGZsYWcuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfSUQ6IHJlbGV2YW50IGlmIHRoZSBmdW5jdGlvbidzIHR5cGUgaXMgZm9sbG93IHVwLgorICoJVGhlIGluc3RhbmNlIElEIGZvciB0aGUgZm9sbG93IHVwIFNlcnZpY2UgRGlzY292ZXJ5IEZyYW1lLiBUaGlzIGlzIHU4LgorICogQE5MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQX1JFUV9JRDogcmVsZXZhbnQgaWYgdGhlIGZ1bmN0aW9uJ3MgdHlwZQorICoJaXMgZm9sbG93IHVwLiBUaGlzIGlzIGEgdTguCisgKglUaGUgcmVxdWVzdG9yIGluc3RhbmNlIElEIGZvciB0aGUgZm9sbG93IHVwIFNlcnZpY2UgRGlzY292ZXJ5IEZyYW1lLgorICogQE5MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQX0RFU1Q6IHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgcmVjaXBpZW50IG9mIHRoZQorICoJZm9sbG93IHVwIFNlcnZpY2UgRGlzY292ZXJ5IEZyYW1lLiBUaGlzIGlzIGEgYmluYXJ5IGF0dHJpYnV0ZS4KKyAqIEBOTDgwMjExX05BTl9GVU5DX0NMT1NFX1JBTkdFOiBpcyB0aGlzIGZ1bmN0aW9uIGxpbWl0ZWQgZm9yIGRldmljZXMgaW4gYQorICoJY2xvc2UgcmFuZ2UuIFRoZSByYW5nZSBpdHNlbGYgKFJTU0kpIGlzIGRlZmluZWQgYnkgdGhlIGRldmljZS4KKyAqCVRoaXMgaXMgYSBmbGFnLgorICogQE5MODAyMTFfTkFOX0ZVTkNfVFRMOiBzdHJpY3RseSBwb3NpdGl2ZSBudW1iZXIgb2YgRFdzIHRoaXMgZnVuY3Rpb24gc2hvdWxkCisgKglzdGF5IGFjdGl2ZS4gSWYgbm90IHByZXNlbnQgaW5maW5pdGUgVFRMIGlzIGFzc3VtZWQuIFRoaXMgaXMgYSB1MzIuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lORk86IGFycmF5IG9mIGJ5dGVzIGRlc2NyaWJpbmcgdGhlIHNlcnZpY2UKKyAqCXNwZWNpZmljIGluZm8uIFRoaXMgaXMgYSBiaW5hcnkgYXR0cmlidXRlLgorICogQE5MODAyMTFfTkFOX0ZVTkNfU1JGOiBTZXJ2aWNlIFJlY2VpdmUgRmlsdGVyLiBUaGlzIGlzIGEgbmVzdGVkIGF0dHJpYnV0ZS4KKyAqCVNlZSAmZW51bSBubDgwMjExX25hbl9zcmZfYXR0cmlidXRlcy4KKyAqIEBOTDgwMjExX05BTl9GVU5DX1JYX01BVENIX0ZJTFRFUjogUmVjZWl2ZSBNYXRjaGluZyBmaWx0ZXIuIFRoaXMgaXMgYSBuZXN0ZWQKKyAqCWF0dHJpYnV0ZS4gSXQgaXMgYSBsaXN0IG9mIGJpbmFyeSB2YWx1ZXMuCisgKiBATkw4MDIxMV9OQU5fRlVOQ19UWF9NQVRDSF9GSUxURVI6IFRyYW5zbWl0IE1hdGNoaW5nIGZpbHRlci4gVGhpcyBpcyBhCisgKgluZXN0ZWQgYXR0cmlidXRlLiBJdCBpcyBhIGxpc3Qgb2YgYmluYXJ5IHZhbHVlcy4KKyAqIEBOTDgwMjExX05BTl9GVU5DX0lOU1RBTkNFX0lEOiBUaGUgaW5zdGFuY2UgSUQgb2YgdGhlIGZ1bmN0aW9uLgorICoJSXRzIHR5cGUgaXMgdTggYW5kIGl0IGNhbm5vdCBiZSAwLgorICogQE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT046IE5BTiBmdW5jdGlvbiB0ZXJtaW5hdGlvbiByZWFzb24uCisgKglTZWUgJmVudW0gbmw4MDIxMV9uYW5fZnVuY190ZXJtX3JlYXNvbi4KKyAqCisgKiBATlVNX05MODAyMTFfTkFOX0ZVTkNfQVRUUjogaW50ZXJuYWwKKyAqIEBOTDgwMjExX05BTl9GVU5DX0FUVFJfTUFYOiBoaWdoZXN0IE5BTiBmdW5jdGlvbiBhdHRyaWJ1dGUKKyAqLworZW51bSBubDgwMjExX25hbl9mdW5jX2F0dHJpYnV0ZXMgeworCV9fTkw4MDIxMV9OQU5fRlVOQ19JTlZBTElELAorCU5MODAyMTFfTkFOX0ZVTkNfVFlQRSwKKwlOTDgwMjExX05BTl9GVU5DX1NFUlZJQ0VfSUQsCisJTkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNIX1RZUEUsCisJTkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNIX0JDQVNULAorCU5MODAyMTFfTkFOX0ZVTkNfU1VCU0NSSUJFX0FDVElWRSwKKwlOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9JRCwKKwlOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9SRVFfSUQsCisJTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfREVTVCwKKwlOTDgwMjExX05BTl9GVU5DX0NMT1NFX1JBTkdFLAorCU5MODAyMTFfTkFOX0ZVTkNfVFRMLAorCU5MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JTkZPLAorCU5MODAyMTFfTkFOX0ZVTkNfU1JGLAorCU5MODAyMTFfTkFOX0ZVTkNfUlhfTUFUQ0hfRklMVEVSLAorCU5MODAyMTFfTkFOX0ZVTkNfVFhfTUFUQ0hfRklMVEVSLAorCU5MODAyMTFfTkFOX0ZVTkNfSU5TVEFOQ0VfSUQsCisJTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTiwKKworCS8qIGtlZXAgbGFzdCAqLworCU5VTV9OTDgwMjExX05BTl9GVU5DX0FUVFIsCisJTkw4MDIxMV9OQU5fRlVOQ19BVFRSX01BWCA9IE5VTV9OTDgwMjExX05BTl9GVU5DX0FUVFIgLSAxCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9uYW5fc3JmX2F0dHJpYnV0ZXMgLSBOQU4gU2VydmljZSBSZXNwb25zZSBmaWx0ZXIgYXR0cmlidXRlcworICogQF9fTkw4MDIxMV9OQU5fU1JGX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBOTDgwMjExX05BTl9TUkZfSU5DTFVERTogcHJlc2VudCBpZiB0aGUgaW5jbHVkZSBiaXQgb2YgdGhlIFNSRiBzZXQuCisgKglUaGlzIGlzIGEgZmxhZy4KKyAqIEBOTDgwMjExX05BTl9TUkZfQkY6IEJsb29tIEZpbHRlci4gUHJlc2VudCBpZiBhbmQgb25seSBpZgorICoJJk5MODAyMTFfTkFOX1NSRl9NQUNfQUREUlMgaXNuJ3QgcHJlc2VudC4gVGhpcyBhdHRyaWJ1dGUgaXMgYmluYXJ5LgorICogQE5MODAyMTFfTkFOX1NSRl9CRl9JRFg6IGluZGV4IG9mIHRoZSBCbG9vbSBGaWx0ZXIuIE1hbmRhdG9yeSBpZgorICoJJk5MODAyMTFfTkFOX1NSRl9CRiBpcyBwcmVzZW50LiBUaGlzIGlzIGEgdTguCisgKiBATkw4MDIxMV9OQU5fU1JGX01BQ19BRERSUzogbGlzdCBvZiBNQUMgYWRkcmVzc2VzIGZvciB0aGUgU1JGLiBQcmVzZW50IGlmCisgKglhbmQgb25seSBpZiAmTkw4MDIxMV9OQU5fU1JGX0JGIGlzbid0IHByZXNlbnQuIFRoaXMgaXMgYSBuZXN0ZWQKKyAqCWF0dHJpYnV0ZS4gRWFjaCBuZXN0ZWQgYXR0cmlidXRlIGlzIGEgTUFDIGFkZHJlc3MuCisgKiBATlVNX05MODAyMTFfTkFOX1NSRl9BVFRSOiBpbnRlcm5hbAorICogQE5MODAyMTFfTkFOX1NSRl9BVFRSX01BWDogaGlnaGVzdCBOQU4gU1JGIGF0dHJpYnV0ZQorICovCitlbnVtIG5sODAyMTFfbmFuX3NyZl9hdHRyaWJ1dGVzIHsKKwlfX05MODAyMTFfTkFOX1NSRl9JTlZBTElELAorCU5MODAyMTFfTkFOX1NSRl9JTkNMVURFLAorCU5MODAyMTFfTkFOX1NSRl9CRiwKKwlOTDgwMjExX05BTl9TUkZfQkZfSURYLAorCU5MODAyMTFfTkFOX1NSRl9NQUNfQUREUlMsCisKKwkvKiBrZWVwIGxhc3QgKi8KKwlOVU1fTkw4MDIxMV9OQU5fU1JGX0FUVFIsCisJTkw4MDIxMV9OQU5fU1JGX0FUVFJfTUFYID0gTlVNX05MODAyMTFfTkFOX1NSRl9BVFRSIC0gMSwKK307CisKKy8qKgorICogZW51bSBubDgwMjExX25hbl9tYXRjaF9hdHRyaWJ1dGVzIC0gTkFOIG1hdGNoIGF0dHJpYnV0ZXMKKyAqIEBfX05MODAyMTFfTkFOX01BVENIX0lOVkFMSUQ6IGludmFsaWQKKyAqIEBOTDgwMjExX05BTl9NQVRDSF9GVU5DX0xPQ0FMOiB0aGUgbG9jYWwgZnVuY3Rpb24gdGhhdCBoYWQgdGhlCisgKgltYXRjaC4gVGhpcyBpcyBhIG5lc3RlZCBhdHRyaWJ1dGUuCisgKglTZWUgJmVudW0gbmw4MDIxMV9uYW5fZnVuY19hdHRyaWJ1dGVzLgorICogQE5MODAyMTFfTkFOX01BVENIX0ZVTkNfUEVFUjogdGhlIHBlZXIgZnVuY3Rpb24KKyAqCXRoYXQgY2F1c2VkIHRoZSBtYXRjaC4gVGhpcyBpcyBhIG5lc3RlZCBhdHRyaWJ1dGUuCisgKglTZWUgJmVudW0gbmw4MDIxMV9uYW5fZnVuY19hdHRyaWJ1dGVzLgorICoKKyAqIEBOVU1fTkw4MDIxMV9OQU5fTUFUQ0hfQVRUUjogaW50ZXJuYWwKKyAqIEBOTDgwMjExX05BTl9NQVRDSF9BVFRSX01BWDogaGlnaGVzdCBOQU4gbWF0Y2ggYXR0cmlidXRlCisgKi8KK2VudW0gbmw4MDIxMV9uYW5fbWF0Y2hfYXR0cmlidXRlcyB7CisJX19OTDgwMjExX05BTl9NQVRDSF9JTlZBTElELAorCU5MODAyMTFfTkFOX01BVENIX0ZVTkNfTE9DQUwsCisJTkw4MDIxMV9OQU5fTUFUQ0hfRlVOQ19QRUVSLAorCisJLyoga2VlcCBsYXN0ICovCisJTlVNX05MODAyMTFfTkFOX01BVENIX0FUVFIsCisJTkw4MDIxMV9OQU5fTUFUQ0hfQVRUUl9NQVggPSBOVU1fTkw4MDIxMV9OQU5fTUFUQ0hfQVRUUiAtIDEKK307CisKICNlbmRpZiAvKiBfX0xJTlVYX05MODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L25zZnMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uc2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FmNjE3MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9uc2ZzLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfX0xJTlVYX05TRlNfSAorI2RlZmluZSBfX0xJTlVYX05TRlNfSAorCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKworI2RlZmluZSBOU0lPCTB4YjcKKworLyogUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IHJlZmVycyB0byBhbiBvd25pbmcgdXNlciBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgTlNfR0VUX1VTRVJOUwlfSU8oTlNJTywgMHgxKQorLyogUmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciB0aGF0IHJlZmVycyB0byBhIHBhcmVudCBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgTlNfR0VUX1BBUkVOVAlfSU8oTlNJTywgMHgyKQorCisjZW5kaWYgLyogX19MSU5VWF9OU0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9vcGVudnN3aXRjaC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L29wZW52c3dpdGNoLmgKaW5kZXggZDk1YTMwMS4uNTllZDM5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L29wZW52c3dpdGNoLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L29wZW52c3dpdGNoLmgKQEAgLTU4Myw3ICs1ODMsNyBAQAogI2RlZmluZSBPVlNfVVNFUlNQQUNFX0FUVFJfTUFYIChfX09WU19VU0VSU1BBQ0VfQVRUUl9NQVggLSAxKQogCiBzdHJ1Y3Qgb3ZzX2FjdGlvbl90cnVuYyB7Ci0JdWludDMyX3QgbWF4X2xlbjsgLyogTWF4IHBhY2tldCBzaXplIGluIGJ5dGVzLiAqLworCV9fdTMyIG1heF9sZW47IC8qIE1heCBwYWNrZXQgc2l6ZSBpbiBieXRlcy4gKi8KIH07CiAKIC8qKgpAQCAtNjA1LDEzICs2MDUsMTMgQEAKICAqIEB2bGFuX3RjaTogVGFnIGNvbnRyb2wgaWRlbnRpZmllciAoVENJKSB0byBwdXNoLiAgVGhlIENGSSBiaXQgbXVzdCBiZSBzZXQKICAqIChidXQgaXQgd2lsbCBub3QgYmUgc2V0IGluIHRoZSA4MDIuMVEgaGVhZGVyIHRoYXQgaXMgcHVzaGVkKS4KICAqCi0gKiBUaGUgQHZsYW5fdHBpZCB2YWx1ZSBpcyB0eXBpY2FsbHkgJUVUSF9QXzgwMjFRLiAgVGhlIG9ubHkgYWNjZXB0YWJsZSBUUElECi0gKiB2YWx1ZXMgYXJlIHRob3NlIHRoYXQgdGhlIGtlcm5lbCBtb2R1bGUgYWxzbyBwYXJzZXMgYXMgODAyLjFRIGhlYWRlcnMsIHRvCi0gKiBwcmV2ZW50ICVPVlNfQUNUSU9OX0FUVFJfUFVTSF9WTEFOIGZvbGxvd2VkIGJ5ICVPVlNfQUNUSU9OX0FUVFJfUE9QX1ZMQU4KLSAqIGZyb20gaGF2aW5nIHN1cnByaXNpbmcgcmVzdWx0cy4KKyAqIFRoZSBAdmxhbl90cGlkIHZhbHVlIGlzIHR5cGljYWxseSAlRVRIX1BfODAyMVEgb3IgJUVUSF9QXzgwMjFBRC4KKyAqIFRoZSBvbmx5IGFjY2VwdGFibGUgVFBJRCB2YWx1ZXMgYXJlIHRob3NlIHRoYXQgdGhlIGtlcm5lbCBtb2R1bGUgYWxzbyBwYXJzZXMKKyAqIGFzIDgwMi4xUSBvciA4MDIuMUFEIGhlYWRlcnMsIHRvIHByZXZlbnQgJU9WU19BQ1RJT05fQVRUUl9QVVNIX1ZMQU4gZm9sbG93ZWQKKyAqIGJ5ICVPVlNfQUNUSU9OX0FUVFJfUE9QX1ZMQU4gZnJvbSBoYXZpbmcgc3VycHJpc2luZyByZXN1bHRzLgogICovCiBzdHJ1Y3Qgb3ZzX2FjdGlvbl9wdXNoX3ZsYW4gewotCV9fYmUxNiB2bGFuX3RwaWQ7CS8qIDgwMi4xUSBUUElELiAqLworCV9fYmUxNiB2bGFuX3RwaWQ7CS8qIDgwMi4xUSBvciA4MDIuMWFkIFRQSUQuICovCiAJX19iZTE2IHZsYW5fdGNpOwkvKiA4MDIuMVEgVENJIChWTEFOIElEIGFuZCBwcmlvcml0eSkuICovCiB9OwogCkBAIC02MzIsOCArNjMyLDggQEAKICAqIEBoYXNoX2Jhc2lzOiBiYXNpcyB1c2VkIGZvciBjb21wdXRpbmcgaGFzaC4KICAqLwogc3RydWN0IG92c19hY3Rpb25faGFzaCB7Ci0JdWludDMyX3QgIGhhc2hfYWxnOyAgICAgLyogT25lIG9mIG92c19oYXNoX2FsZy4gKi8KLQl1aW50MzJfdCAgaGFzaF9iYXNpczsKKwlfX3UzMiAgaGFzaF9hbGc7ICAgICAvKiBPbmUgb2Ygb3ZzX2hhc2hfYWxnLiAqLworCV9fdTMyICBoYXNoX2Jhc2lzOwogfTsKIAogLyoqCkBAIC03MjEsOSArNzIxLDEwIEBACiAgKiBpcyBjb3BpZWQgZnJvbSB0aGUgdmFsdWUgdG8gdGhlIHBhY2tldCBoZWFkZXIgZmllbGQsIHJlc3Qgb2YgdGhlIGJpdHMgYXJlCiAgKiBsZWZ0IHVuY2hhbmdlZC4gIFRoZSBub24tbWFza2VkIHZhbHVlIGJpdHMgbXVzdCBiZSBwYXNzZWQgaW4gYXMgemVyb2VzLgogICogTWFza2luZyBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgJU9WU19LRVlfQVRUUl9UVU5ORUwgYXR0cmlidXRlLgotICogQE9WU19BQ1RJT05fQVRUUl9QVVNIX1ZMQU46IFB1c2ggYSBuZXcgb3V0ZXJtb3N0IDgwMi4xUSBoZWFkZXIgb250byB0aGUKLSAqIHBhY2tldC4KLSAqIEBPVlNfQUNUSU9OX0FUVFJfUE9QX1ZMQU46IFBvcCB0aGUgb3V0ZXJtb3N0IDgwMi4xUSBoZWFkZXIgb2ZmIHRoZSBwYWNrZXQuCisgKiBAT1ZTX0FDVElPTl9BVFRSX1BVU0hfVkxBTjogUHVzaCBhIG5ldyBvdXRlcm1vc3QgODAyLjFRIG9yIDgwMi4xYWQgaGVhZGVyCisgKiBvbnRvIHRoZSBwYWNrZXQuCisgKiBAT1ZTX0FDVElPTl9BVFRSX1BPUF9WTEFOOiBQb3AgdGhlIG91dGVybW9zdCA4MDIuMVEgb3IgODAyLjFhZCBoZWFkZXIKKyAqIGZyb20gdGhlIHBhY2tldC4KICAqIEBPVlNfQUNUSU9OX0FUVFJfU0FNUExFOiBQcm9iYWJpbGl0aWNhbGx5IGV4ZWN1dGVzIGFjdGlvbnMsIGFzIHNwZWNpZmllZCBpbgogICogdGhlIG5lc3RlZCAlT1ZTX1NBTVBMRV9BVFRSXyogYXR0cmlidXRlcy4KICAqIEBPVlNfQUNUSU9OX0FUVFJfUFVTSF9NUExTOiBQdXNoIGEgbmV3IE1QTFMgbGFiZWwgc3RhY2sgZW50cnkgb250byB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9wY2lfcmVncy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BjaV9yZWdzLmgKaW5kZXggNDA0MDk1MS4uZDgxMjE3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3BjaV9yZWdzLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BjaV9yZWdzLmgKQEAgLTY3MSw3ICs2NzEsOCBAQAogI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9QTVVYCTB4MUEJLyogUHJvdG9jb2wgTXVsdGlwbGV4aW5nICovCiAjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX1BBU0lECTB4MUIJLyogUHJvY2VzcyBBZGRyZXNzIFNwYWNlIElEICovCiAjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX0RQQwkweDFECS8qIERvd25zdHJlYW0gUG9ydCBDb250YWlubWVudCAqLwotI2RlZmluZSBQQ0lfRVhUX0NBUF9JRF9NQVgJUENJX0VYVF9DQVBfSURfRFBDCisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX1BUTQkweDFGCS8qIFByZWNpc2lvbiBUaW1lIE1lYXN1cmVtZW50ICovCisjZGVmaW5lIFBDSV9FWFRfQ0FQX0lEX01BWAlQQ0lfRVhUX0NBUF9JRF9QVE0KIAogI2RlZmluZSBQQ0lfRVhUX0NBUF9EU05fU0laRU9GCTEyCiAjZGVmaW5lIFBDSV9FWFRfQ0FQX01DQVNUX0VORFBPSU5UX1NJWkVPRiA0MApAQCAtOTY0LDQgKzk2NSwxMyBAQAogCiAjZGVmaW5lIFBDSV9FWFBfRFBDX1NPVVJDRV9JRAkJMTAJLyogRFBDIFNvdXJjZSBJZGVudGlmaWVyICovCiAKKy8qIFByZWNpc2lvbiBUaW1lIE1lYXN1cmVtZW50ICovCisjZGVmaW5lIFBDSV9QVE1fQ0FQCQkJMHgwNAkgICAgLyogUFRNIENhcGFiaWxpdHkgKi8KKyNkZWZpbmUgIFBDSV9QVE1fQ0FQX1JFUQkJMHgwMDAwMDAwMSAgLyogUmVxdWVzdGVyIGNhcGFibGUgKi8KKyNkZWZpbmUgIFBDSV9QVE1fQ0FQX1JPT1QJCTB4MDAwMDAwMDQgIC8qIFJvb3QgY2FwYWJsZSAqLworI2RlZmluZSAgUENJX1BUTV9HUkFOVUxBUklUWV9NQVNLCTB4MDAwMEZGMDAgIC8qIENsb2NrIGdyYW51bGFyaXR5ICovCisjZGVmaW5lIFBDSV9QVE1fQ1RSTAkJCTB4MDgJICAgIC8qIFBUTSBDb250cm9sICovCisjZGVmaW5lICBQQ0lfUFRNX0NUUkxfRU5BQkxFCQkweDAwMDAwMDAxICAvKiBQVE0gZW5hYmxlICovCisjZGVmaW5lICBQQ0lfUFRNX0NUUkxfUk9PVAkJMHgwMDAwMDAwMiAgLyogUm9vdCBzZWxlY3QgKi8KKwogI2VuZGlmIC8qIExJTlVYX1BDSV9SRUdTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9wa3RfY2xzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvcGt0X2Nscy5oCmluZGV4IGQxYzFjY2EuLjhmZDcxNWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9wa3RfY2xzLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9jbHMuaApAQCAtMzk2LDYgKzM5Niw3IEBACiAJVENBX0JQRl9GRCwKIAlUQ0FfQlBGX05BTUUsCiAJVENBX0JQRl9GTEFHUywKKwlUQ0FfQlBGX0ZMQUdTX0dFTiwKIAlfX1RDQV9CUEZfTUFYLAogfTsKIApAQCAtNDI4LDYgKzQyOSwyNCBAQAogCVRDQV9GTE9XRVJfS0VZX1VEUF9EU1QsCQkvKiBiZTE2ICovCiAKIAlUQ0FfRkxPV0VSX0ZMQUdTLAorCVRDQV9GTE9XRVJfS0VZX1ZMQU5fSUQsCQkvKiBiZTE2ICovCisJVENBX0ZMT1dFUl9LRVlfVkxBTl9QUklPLAkvKiB1OCAgICovCisJVENBX0ZMT1dFUl9LRVlfVkxBTl9FVEhfVFlQRSwJLyogYmUxNiAqLworCisJVENBX0ZMT1dFUl9LRVlfRU5DX0tFWV9JRCwJLyogYmUzMiAqLworCVRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X1NSQywJLyogYmUzMiAqLworCVRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X1NSQ19NQVNLLC8qIGJlMzIgKi8KKwlUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9EU1QsCS8qIGJlMzIgKi8KKwlUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9EU1RfTUFTSywvKiBiZTMyICovCisJVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfU1JDLAkvKiBzdHJ1Y3QgaW42X2FkZHIgKi8KKwlUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9TUkNfTUFTSywvKiBzdHJ1Y3QgaW42X2FkZHIgKi8KKwlUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9EU1QsCS8qIHN0cnVjdCBpbjZfYWRkciAqLworCVRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVF9NQVNLLC8qIHN0cnVjdCBpbjZfYWRkciAqLworCisJVENBX0ZMT1dFUl9LRVlfVENQX1NSQ19NQVNLLAkvKiBiZTE2ICovCisJVENBX0ZMT1dFUl9LRVlfVENQX0RTVF9NQVNLLAkvKiBiZTE2ICovCisJVENBX0ZMT1dFUl9LRVlfVURQX1NSQ19NQVNLLAkvKiBiZTE2ICovCisJVENBX0ZMT1dFUl9LRVlfVURQX0RTVF9NQVNLLAkvKiBiZTE2ICovCiAJX19UQ0FfRkxPV0VSX01BWCwKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9wa3Rfc2NoZWQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9wa3Rfc2NoZWQuaAppbmRleCAyMzgyZWVkLi5kZjc0NTFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvcGt0X3NjaGVkLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9zY2hlZC5oCkBAIC03OTIsNiArNzkyLDggQEAKIAogCVRDQV9GUV9PUlBIQU5fTUFTSywJLyogbWFzayBhcHBsaWVkIHRvIG9ycGhhbmVkIHNrYiBoYXNoZXMgKi8KIAorCVRDQV9GUV9MT1dfUkFURV9USFJFU0hPTEQsIC8qIHBlciBwYWNrZXQgZGVsYXkgdW5kZXIgdGhpcyByYXRlICovCisKIAlfX1RDQV9GUV9NQVgKIH07CiAKQEAgLTgwOSw3ICs4MTEsNyBAQAogCV9fdTMyCWZsb3dzOwogCV9fdTMyCWluYWN0aXZlX2Zsb3dzOwogCV9fdTMyCXRocm90dGxlZF9mbG93czsKLQlfX3UzMglwYWQ7CisJX191MzIJdW50aHJvdHRsZV9sYXRlbmN5X25zOwogfTsKIAogLyogSGVhdnktSGl0dGVyIEZpbHRlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3NlcmlhbF9yZWcuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9zZXJpYWxfcmVnLmgKaW5kZXggMWU1YWM0ZTcuLmI0YzA0ODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9zZXJpYWxfcmVnLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3NlcmlhbF9yZWcuaApAQCAtMzc2LDUgKzM3NiwxMyBAQAogI2RlZmluZSBVQVJUX0VYQVJfVFhUUkcJCTB4MGEJLyogVHggRklGTyB0cmlnZ2VyIGxldmVsIHdyaXRlLW9ubHkgKi8KICNkZWZpbmUgVUFSVF9FWEFSX1JYVFJHCQkweDBiCS8qIFJ4IEZJRk8gdHJpZ2dlciBsZXZlbCB3cml0ZS1vbmx5ICovCiAKKy8qCisgKiBUaGVzZSBhcmUgZGVmaW5pdGlvbnMgZm9yIHRoZSBBbHRlcmEgQUxUUl8xNjU1MF9GMzIvRjY0L0YxMjgKKyAqIE5vcm1hbGl6ZWQgZnJvbSAweDEwMCB0byAweDQwIGJlY2F1c2Ugb2Ygc2hpZnQgYnkgMiAoMzIgYml0IHJlZ3MpLgorICovCisjZGVmaW5lIFVBUlRfQUxUUl9BRlIJCTB4NDAJLyogQWRkaXRpb25hbCBGZWF0dXJlcyBSZWdpc3RlciAqLworI2RlZmluZSBVQVJUX0FMVFJfRU5fVFhGSUZPX0xXCTB4MDEJLyogRW5hYmxlIHRoZSBUWCBGSUZPIExvdyBXYXRlcm1hcmsgKi8KKyNkZWZpbmUgVUFSVF9BTFRSX1RYX0xPVwkweDQxCS8qIFR4IEZJRk8gTG93IFdhdGVybWFyayAqLworCiAjZW5kaWYgLyogX0xJTlVYX1NFUklBTF9SRUdfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvc25tcC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3NubXAuaAppbmRleCAyNWE5YWQ4Li5lN2EzMWY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvc25tcC5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9zbm1wLmgKQEAgLTIzNSw2ICsyMzUsNyBAQAogCUxJTlVYX01JQl9UQ1BTUFVSSU9VU1JUT1MsCQkvKiBUQ1BTcHVyaW91c1JUT3MgKi8KIAlMSU5VWF9NSUJfVENQTUQ1Tk9URk9VTkQsCQkvKiBUQ1BNRDVOb3RGb3VuZCAqLwogCUxJTlVYX01JQl9UQ1BNRDVVTkVYUEVDVEVELAkJLyogVENQTUQ1VW5leHBlY3RlZCAqLworCUxJTlVYX01JQl9UQ1BNRDVGQUlMVVJFLAkJLyogVENQTUQ1RmFpbHVyZSAqLwogCUxJTlVYX01JQl9TQUNLU0hJRlRFRCwKIAlMSU5VWF9NSUJfU0FDS01FUkdFRCwKIAlMSU5VWF9NSUJfU0FDS1NISUZURkFMTEJBQ0ssCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX2lmZS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3RjX2FjdC90Y19pZmUuaAppbmRleCA0ZWNlMDJhLi5jZDE4MzYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX2lmZS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfaWZlLmgKQEAgLTMyLDggKzMyLDkgQEAKICNkZWZpbmUgSUZFX01FVEFfSEFTSElEIDIKICNkZWZpbmUJSUZFX01FVEFfUFJJTyAzCiAjZGVmaW5lCUlGRV9NRVRBX1FNQVAgNAorI2RlZmluZQlJRkVfTUVUQV9UQ0lOREVYIDUKIC8qQ2FuIGJlIG92ZXJyaWRkZW4gYXQgcnVudGltZSBieSBtb2R1bGUgb3B0aW9uKi8KLSNkZWZpbmUJX19JRkVfTUVUQV9NQVggNQorI2RlZmluZQlfX0lGRV9NRVRBX01BWCA2CiAjZGVmaW5lIElGRV9NRVRBX01BWCAoX19JRkVfTUVUQV9NQVggLSAxKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfc2tibW9kLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX3NrYm1vZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmMwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX3NrYm1vZC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEphbWFsIEhhZGkgU2FsaW0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKi8KKworI2lmbmRlZiBfX0xJTlVYX1RDX1NLQk1PRF9ICisjZGVmaW5lIF9fTElOVVhfVENfU0tCTU9EX0gKKworI2luY2x1ZGUgPGxpbnV4L3BrdF9jbHMuaD4KKworI2RlZmluZSBUQ0FfQUNUX1NLQk1PRCAxNQorCisjZGVmaW5lIFNLQk1PRF9GX0RNQUMJMHgxCisjZGVmaW5lIFNLQk1PRF9GX1NNQUMJMHgyCisjZGVmaW5lIFNLQk1PRF9GX0VUWVBFCTB4NAorI2RlZmluZSBTS0JNT0RfRl9TV0FQTUFDIDB4OAorCitzdHJ1Y3QgdGNfc2tibW9kIHsKKwl0Y19nZW47CisJX191NjQgZmxhZ3M7Cit9OworCitlbnVtIHsKKwlUQ0FfU0tCTU9EX1VOU1BFQywKKwlUQ0FfU0tCTU9EX1RNLAorCVRDQV9TS0JNT0RfUEFSTVMsCisJVENBX1NLQk1PRF9ETUFDLAorCVRDQV9TS0JNT0RfU01BQywKKwlUQ0FfU0tCTU9EX0VUWVBFLAorCVRDQV9TS0JNT0RfUEFELAorCV9fVENBX1NLQk1PRF9NQVgKK307CisjZGVmaW5lIFRDQV9TS0JNT0RfTUFYIChfX1RDQV9TS0JNT0RfTUFYIC0gMSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX3R1bm5lbF9rZXkuaCBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfdHVubmVsX2tleS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MDEwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX3R1bm5lbF9rZXkuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBBbWlyIFZhZGFpIDxhbWlyQHZhZGFpLm1lPgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfVENfVFVOTkVMX0tFWV9ICisjZGVmaW5lIF9fTElOVVhfVENfVFVOTkVMX0tFWV9ICisKKyNpbmNsdWRlIDxsaW51eC9wa3RfY2xzLmg+CisKKyNkZWZpbmUgVENBX0FDVF9UVU5ORUxfS0VZIDE3CisKKyNkZWZpbmUgVENBX1RVTk5FTF9LRVlfQUNUX1NFVAkgICAgMQorI2RlZmluZSBUQ0FfVFVOTkVMX0tFWV9BQ1RfUkVMRUFTRSAgMgorCitzdHJ1Y3QgdGNfdHVubmVsX2tleSB7CisJdGNfZ2VuOworCWludCB0X2FjdGlvbjsKK307CisKK2VudW0geworCVRDQV9UVU5ORUxfS0VZX1VOU1BFQywKKwlUQ0FfVFVOTkVMX0tFWV9UTSwKKwlUQ0FfVFVOTkVMX0tFWV9QQVJNUywKKwlUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNF9TUkMsCS8qIGJlMzIgKi8KKwlUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNF9EU1QsCS8qIGJlMzIgKi8KKwlUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNl9TUkMsCS8qIHN0cnVjdCBpbjZfYWRkciAqLworCVRDQV9UVU5ORUxfS0VZX0VOQ19JUFY2X0RTVCwJLyogc3RydWN0IGluNl9hZGRyICovCisJVENBX1RVTk5FTF9LRVlfRU5DX0tFWV9JRCwJLyogYmU2NCAqLworCVRDQV9UVU5ORUxfS0VZX1BBRCwKKwlfX1RDQV9UVU5ORUxfS0VZX01BWCwKK307CisKKyNkZWZpbmUgVENBX1RVTk5FTF9LRVlfTUFYIChfX1RDQV9UVU5ORUxfS0VZX01BWCAtIDEpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3RjX2FjdC90Y192bGFuLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX3ZsYW4uaAppbmRleCAzMTE1MWZmLi5iZGRiMjcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX3ZsYW4uaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdGNfYWN0L3RjX3ZsYW4uaApAQCAtMTYsNiArMTYsNyBAQAogCiAjZGVmaW5lIFRDQV9WTEFOX0FDVF9QT1AJMQogI2RlZmluZSBUQ0FfVkxBTl9BQ1RfUFVTSAkyCisjZGVmaW5lIFRDQV9WTEFOX0FDVF9NT0RJRlkJMwogCiBzdHJ1Y3QgdGNfdmxhbiB7CiAJdGNfZ2VuOwpAQCAtMjksNiArMzAsNyBAQAogCVRDQV9WTEFOX1BVU0hfVkxBTl9JRCwKIAlUQ0FfVkxBTl9QVVNIX1ZMQU5fUFJPVE9DT0wsCiAJVENBX1ZMQU5fUEFELAorCVRDQV9WTEFOX1BVU0hfVkxBTl9QUklPUklUWSwKIAlfX1RDQV9WTEFOX01BWCwKIH07CiAjZGVmaW5lIFRDQV9WTEFOX01BWCAoX19UQ0FfVkxBTl9NQVggLSAxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3RjcC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3RjcC5oCmluZGV4IDQ4Mjg5OGYuLjczYWMwZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC90Y3AuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdGNwLmgKQEAgLTE2Nyw2ICsxNjcsNyBAQAogCV9fdTgJdGNwaV9iYWNrb2ZmOwogCV9fdTgJdGNwaV9vcHRpb25zOwogCV9fdTgJdGNwaV9zbmRfd3NjYWxlIDogNCwgdGNwaV9yY3Zfd3NjYWxlIDogNDsKKwlfX3U4CXRjcGlfZGVsaXZlcnlfcmF0ZV9hcHBfbGltaXRlZDoxOwogCiAJX191MzIJdGNwaV9ydG87CiAJX191MzIJdGNwaV9hdG87CkBAIC0yMTEsNiArMjEyLDggQEAKIAlfX3UzMgl0Y3BpX21pbl9ydHQ7CiAJX191MzIJdGNwaV9kYXRhX3NlZ3NfaW47CS8qIFJGQzQ4OTggdGNwRVN0YXRzRGF0YVNlZ3NJbiAqLwogCV9fdTMyCXRjcGlfZGF0YV9zZWdzX291dDsJLyogUkZDNDg5OCB0Y3BFU3RhdHNEYXRhU2Vnc091dCAqLworCisJX191NjQgICB0Y3BpX2RlbGl2ZXJ5X3JhdGU7CiB9OwogCiAvKiBmb3IgVENQX01ENVNJRyBzb2NrZXQgb3B0aW9uICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdGlwY19uZXRsaW5rLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdGlwY19uZXRsaW5rLmgKaW5kZXggNWYzZjZkMC4uZjllZGQyMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3RpcGNfbmV0bGluay5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC90aXBjX25ldGxpbmsuaApAQCAtNTksNiArNTksOSBAQAogCVRJUENfTkxfTU9OX1NFVCwKIAlUSVBDX05MX01PTl9HRVQsCiAJVElQQ19OTF9NT05fUEVFUl9HRVQsCisJVElQQ19OTF9QRUVSX1JFTU9WRSwKKwlUSVBDX05MX0JFQVJFUl9BREQsCisJVElQQ19OTF9VRFBfR0VUX1JFTU9URUlQLAogCiAJX19USVBDX05MX0NNRF9NQVgsCiAJVElQQ19OTF9DTURfTUFYID0gX19USVBDX05MX0NNRF9NQVggLSAxCkBAIC05OCw2ICsxMDEsNyBAQAogCVRJUENfTkxBX1VEUF9VTlNQRUMsCiAJVElQQ19OTEFfVURQX0xPQ0FMLAkJLyogc29ja2FkZHJfc3RvcmFnZSAqLwogCVRJUENfTkxBX1VEUF9SRU1PVEUsCQkvKiBzb2NrYWRkcl9zdG9yYWdlICovCisJVElQQ19OTEFfVURQX01VTFRJX1JFTU9URUlQLAkvKiBmbGFnICovCiAKIAlfX1RJUENfTkxBX1VEUF9NQVgsCiAJVElQQ19OTEFfVURQX01BWCA9IF9fVElQQ19OTEFfVURQX01BWCAtIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC91c2IvZnVuY3Rpb25mcy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3VzYi9mdW5jdGlvbmZzLmgKaW5kZXggMTA4ZGQ3OS4uYWNjNjM2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3VzYi9mdW5jdGlvbmZzLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3VzYi9mdW5jdGlvbmZzLmgKQEAgLTIxLDYgKzIxLDggQEAKIAlGVU5DVElPTkZTX0hBU19NU19PU19ERVNDID0gOCwKIAlGVU5DVElPTkZTX1ZJUlRVQUxfQUREUiA9IDE2LAogCUZVTkNUSU9ORlNfRVZFTlRGRCA9IDMyLAorCUZVTkNUSU9ORlNfQUxMX0NUUkxfUkVDSVAgPSA2NCwKKwlGVU5DVElPTkZTX0NPTkZJRzBfU0VUVVAgPSAxMjgsCiB9OwogCiAvKiBEZXNjcmlwdG9yIG9mIGFuIG5vbi1hdWRpbyBlbmRwb2ludCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3hmcm0uaCBiL2luY2x1ZGUvdWFwaS9saW51eC94ZnJtLmgKaW5kZXggMTQzMzM4OS4uMWZjNjJiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3hmcm0uaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgveGZybS5oCkBAIC0yOTgsNyArMjk4LDcgQEAKIAlYRlJNQV9BTEdfQVVUSF9UUlVOQywJLyogc3RydWN0IHhmcm1fYWxnb19hdXRoICovCiAJWEZSTUFfTUFSSywJCS8qIHN0cnVjdCB4ZnJtX21hcmsgKi8KIAlYRlJNQV9URkNQQUQsCQkvKiBfX3UzMiAqLwotCVhGUk1BX1JFUExBWV9FU05fVkFMLAkvKiBzdHJ1Y3QgeGZybV9yZXBsYXlfZXNuICovCisJWEZSTUFfUkVQTEFZX0VTTl9WQUwsCS8qIHN0cnVjdCB4ZnJtX3JlcGxheV9zdGF0ZV9lc24gKi8KIAlYRlJNQV9TQV9FWFRSQV9GTEFHUywJLyogX191MzIgKi8KIAlYRlJNQV9QUk9UTywJCS8qIF9fdTggKi8KIAlYRlJNQV9BRERSRVNTX0ZJTFRFUiwJLyogc3RydWN0IHhmcm1fYWRkcmVzc19maWx0ZXIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9zY3NpL2N4bGZsYXNoX2lvY3RsLmggYi9pbmNsdWRlL3VhcGkvc2NzaS9jeGxmbGFzaF9pb2N0bC5oCmluZGV4IDIzMDJmM2MuLjZiZjFmOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9zY3NpL2N4bGZsYXNoX2lvY3RsLmgKKysrIGIvaW5jbHVkZS91YXBpL3Njc2kvY3hsZmxhc2hfaW9jdGwuaApAQCAtMzksMTkgKzM5LDI4IEBACiAgKiBhdCB0aGlzIHRpbWUsIHRoaXMgcHJvdmlkZXMgZnV0dXJlIGZsZXhpYmlsaXR5LgogICovCiAjZGVmaW5lIERLX0NYTEZMQVNIX0FMTF9QT1JUU19BQ1RJVkUJMHgwMDAwMDAwMDAwMDAwMDAxVUxMCisjZGVmaW5lIERLX0NYTEZMQVNIX0FQUF9DTE9TRV9BREFQX0ZECTB4MDAwMDAwMDAwMDAwMDAwMlVMTAogCiAvKgotICogTm90ZXM6Ci0gKiAtLS0tLQorICogR2VuZXJhbCBOb3RlczoKKyAqIC0tLS0tLS0tLS0tLS0KICAqIFRoZSAnY29udGV4dF9pZCcgZmllbGQgb2YgYWxsIGlvY3RsIHN0cnVjdHVyZXMgY29udGFpbnMgdGhlIGNvbnRleHQKICAqIGlkZW50aWZpZXIgZm9yIGEgY29udGV4dCBpbiB0aGUgbG93ZXIgMzItYml0cyAodXBwZXIgMzItYml0cyBhcmUgbm90CiAgKiB0byBiZSB1c2VkIHdoZW4gaWRlbnRpZnlpbmcgYSBjb250ZXh0IHRvIHRoZSBBRlUpLiBUaGF0IHNhaWQsIHRoZSB2YWx1ZQogICogaW4gaXRzIGVudGlyZXR5IChhbGwgNjQtYml0cykgaXMgdG8gYmUgdHJlYXRlZCBhcyBhbiBvcGFxdWUgY29va2llIGFuZAogICogc2hvdWxkIGJlIHByZXNlbnRlZCBhcyBzdWNoIHdoZW4gaXNzdWluZyBpb2N0bHMuCisgKi8KKworLyoKKyAqIERLX0NYTEZMQVNIX0FUVEFDSCBOb3RlczoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUmVhZC93cml0ZSBhY2Nlc3MgcGVybWlzc2lvbnMgYXJlIHNwZWNpZmllZCB2aWEgdGhlIE9fUkRPTkxZLCBPX1dST05MWSwKKyAqIGFuZCBPX1JEV1IgZmxhZ3MgZGVmaW5lZCBpbiB0aGUgZmNudGwuaCBoZWFkZXIgZmlsZS4KICAqCi0gKiBGb3IgREtfQ1hMRkxBU0hfQVRUQUNIIGlvY3RsLCB1c2VyIHNwZWNpZmllcyByZWFkL3dyaXRlIGFjY2VzcwotICogcGVybWlzc2lvbnMgdmlhIHRoZSBPX1JET05MWSwgT19XUk9OTFksIGFuZCBPX1JEV1IgZmxhZ3MgZGVmaW5lZCBpbgotICogdGhlIGZjbnRsLmggaGVhZGVyIGZpbGUuCisgKiBBIHZhbGlkIGFkYXB0ZXIgZmlsZSBkZXNjcmlwdG9yIChmZCA+PSAwKSBpcyBvbmx5IHJldHVybmVkIG9uIHRoZSBpbml0aWFsCisgKiBhdHRhY2ggKHN1Y2Nlc3NmdWwpIG9mIGEgY29udGV4dC4gV2hlbiBhIGNvbnRleHQgaXMgc2hhcmVkKHJldXNlZCksIHRoZSB1c2VyCisgKiBpcyBleHBlY3RlZCB0byBhbHJlYWR5ICdrbm93JyB0aGUgYWRhcHRlciBmaWxlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogY29udGV4dC4KICAqLwogI2RlZmluZSBES19DWExGTEFTSF9BVFRBQ0hfUkVVU0VfQ09OVEVYVAkweDgwMDAwMDAwMDAwMDAwMDBVTEwKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL0tidWlsZCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9LYnVpbGQKaW5kZXggNjkxOTg0Yy4uOTU3OGQ4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL0tidWlsZAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvS2J1aWxkCkBAIC0xMywzICsxMyw0IEBACiBoZWFkZXIteSArPSBzZm50X2luZm8uaAogaGVhZGVyLXkgKz0gdGx2LmgKIGhlYWRlci15ICs9IHVzYl9zdHJlYW0uaAoraGVhZGVyLXkgKz0gc25kX3NzdF90b2tlbnMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL2Fzb2MuaCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9hc29jLmgKaW5kZXggZTQ3MDFhMy4uMzNkMDBhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL2Fzb2MuaAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvYXNvYy5oCkBAIC04Myw3ICs4Myw3IEBACiAjZGVmaW5lIFNORF9TT0NfVFBMR19OVU1fVEVYVFMJCTE2CiAKIC8qIEFCSSB2ZXJzaW9uICovCi0jZGVmaW5lIFNORF9TT0NfVFBMR19BQklfVkVSU0lPTgkweDQKKyNkZWZpbmUgU05EX1NPQ19UUExHX0FCSV9WRVJTSU9OCTB4NQogCiAvKiBNYXggc2l6ZSBvZiBUTFYgZGF0YSAqLwogI2RlZmluZSBTTkRfU09DX1RQTEdfVExWX1NJWkUJCTMyCkBAIC0xMDUsNyArMTA1LDggQEAKICNkZWZpbmUgU05EX1NPQ19UUExHX1RZUEVfQ09ERUNfTElOSwk5CiAjZGVmaW5lIFNORF9TT0NfVFBMR19UWVBFX0JBQ0tFTkRfTElOSwkxMAogI2RlZmluZSBTTkRfU09DX1RQTEdfVFlQRV9QREFUQQkJMTEKLSNkZWZpbmUgU05EX1NPQ19UUExHX1RZUEVfTUFYCVNORF9TT0NfVFBMR19UWVBFX1BEQVRBCisjZGVmaW5lIFNORF9TT0NfVFBMR19UWVBFX0JFX0RBSQkxMgorI2RlZmluZSBTTkRfU09DX1RQTEdfVFlQRV9NQVgJCVNORF9TT0NfVFBMR19UWVBFX0JFX0RBSQogCiAvKiB2ZW5kb3IgYmxvY2sgSURzIC0gcGxlYXNlIGFkZCBuZXcgdmVuZG9yIHR5cGVzIHRvIGVuZCAqLwogI2RlZmluZSBTTkRfU09DX1RQTEdfVFlQRV9WRU5ET1JfRlcJMTAwMApAQCAtMTI0LDYgKzEyNSwxMSBAQAogI2RlZmluZSBTTkRfU09DX1RQTEdfVFVQTEVfVFlQRV9XT1JECTQKICNkZWZpbmUgU05EX1NPQ19UUExHX1RVUExFX1RZUEVfU0hPUlQJNQogCisvKiBCRSBEQUkgZmxhZ3MgKi8KKyNkZWZpbmUgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX1JBVEVTICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX0NIQU5ORUxTICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgU05EX1NPQ19UUExHX0RBSV9GTEdCSVRfU1lNTUVUUklDX1NBTVBMRUJJVFMgICAgKDEgPDwgMikKKwogLyoKICAqIEJsb2NrIEhlYWRlci4KICAqIFRoaXMgaGVhZGVyIHByZWNlZGVzIGFsbCBvYmplY3QgYW5kIG9iamVjdCBhcnJheXMgYmVsb3cuCkBAIC0yNTEsNiArMjU3LDcgQEAKIAlfX2xlMzIgcGVyaW9kX3NpemVfbWF4OwkvKiBtYXggcGVyaW9kIHNpemUgYnl0ZXMgKi8KIAlfX2xlMzIgYnVmZmVyX3NpemVfbWluOwkvKiBtaW4gYnVmZmVyIHNpemUgYnl0ZXMgKi8KIAlfX2xlMzIgYnVmZmVyX3NpemVfbWF4OwkvKiBtYXggYnVmZmVyIHNpemUgYnl0ZXMgKi8KKwlfX2xlMzIgc2lnX2JpdHM7ICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBvZiBjb250ZW50ICovCiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKgpAQCAtMjg1LDYgKzI5Miw4IEBACiAJX19sZTMyIGdyYXBoX2VsZW1zOwkvKiBudW1iZXIgb2YgZ3JhcGggZWxlbWVudHMgKi8KIAlfX2xlMzIgcGNtX2VsZW1zOwkvKiBudW1iZXIgb2YgUENNIGVsZW1lbnRzICovCiAJX19sZTMyIGRhaV9saW5rX2VsZW1zOwkvKiBudW1iZXIgb2YgREFJIGxpbmsgZWxlbWVudHMgKi8KKwlfX2xlMzIgYmVfZGFpX2VsZW1zOwkvKiBudW1iZXIgb2YgQkUgREFJIGVsZW1lbnRzICovCisJX19sZTMyIHJlc2VydmVkWzIwXTsJLyogcmVzZXJ2ZWQgZm9yIG5ldyBBQkkgZWxlbWVudCB0eXBlcyAqLwogCXN0cnVjdCBzbmRfc29jX3RwbGdfcHJpdmF0ZSBwcml2OwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIApAQCAtNDUwLDQgKzQ1OSwyNiBAQAogCXN0cnVjdCBzbmRfc29jX3RwbGdfc3RyZWFtIHN0cmVhbVtTTkRfU09DX1RQTEdfU1RSRUFNX0NPTkZJR19NQVhdOyAvKiBzdXBwb3J0ZWQgY29uZmlncyBwbGF5YmFjayBhbmQgY2FwdHJ1cmUgKi8KIAlfX2xlMzIgbnVtX3N0cmVhbXM7ICAgICAvKiBudW1iZXIgb2Ygc3RyZWFtcyAqLwogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyoKKyAqIERlc2NyaWJlcyBTVy9GVyBzcGVjaWZpYyBmZWF0dXJlcyBvZiBCRSBEQUkuCisgKgorICogRmlsZSBibG9jayByZXByZXNlbnRhdGlvbiBmb3IgQkUgREFJIDotCisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0rCisgKiB8IHN0cnVjdCBzbmRfc29jX3RwbGdfaGRyICAgICAgICAgICB8ICAxICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0rCisgKiB8IHN0cnVjdCBzbmRfc29jX3RwbGdfYmVfZGFpICAgICAgICB8ICBOICB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0rCisgKi8KK3N0cnVjdCBzbmRfc29jX3RwbGdfYmVfZGFpIHsKKwlfX2xlMzIgc2l6ZTsgICAgICAgICAgICAvKiBpbiBieXRlcyBvZiB0aGlzIHN0cnVjdHVyZSAqLworCWNoYXIgZGFpX25hbWVbU05EUlZfQ1RMX0VMRU1fSURfTkFNRV9NQVhMRU5dOyAvKiBuYW1lIC0gdXNlZCB0byBtYXRjaCAqLworCV9fbGUzMiBkYWlfaWQ7ICAgICAgICAgIC8qIHVuaXF1ZSBJRCAtIHVzZWQgdG8gbWF0Y2ggKi8KKwlfX2xlMzIgcGxheWJhY2s7ICAgICAgICAvKiBzdXBwb3J0cyBwbGF5YmFjayBtb2RlICovCisJX19sZTMyIGNhcHR1cmU7ICAgICAgICAgLyogc3VwcG9ydHMgY2FwdHVyZSBtb2RlICovCisJc3RydWN0IHNuZF9zb2NfdHBsZ19zdHJlYW1fY2FwcyBjYXBzWzJdOyAvKiBwbGF5YmFjayBhbmQgY2FwdHVyZSBmb3IgREFJICovCisJX19sZTMyIGZsYWdfbWFzazsgICAgICAgLyogYml0bWFzayBvZiBmbGFncyB0byBjb25maWd1cmUgKi8KKwlfX2xlMzIgZmxhZ3M7ICAgICAgICAgICAvKiBTTkRfU09DX1RQTEdfREFJX0ZMR0JJVF8qICovCisJc3RydWN0IHNuZF9zb2NfdHBsZ19wcml2YXRlIHByaXY7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvc291bmQvYXNvdW5kLmggYi9pbmNsdWRlL3VhcGkvc291bmQvYXNvdW5kLmgKaW5kZXggNjA5Y2FkYi4uYmUzNTNhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL2Fzb3VuZC5oCisrKyBiL2luY2x1ZGUvdWFwaS9zb3VuZC9hc291bmQuaApAQCAtMTA2LDkgKzEwNiwxMCBAQAogCVNORFJWX0hXREVQX0lGQUNFX0ZXX09YRlcsCS8qIE94Zm9yZCBPWEZXOTcwLzk3MSBiYXNlZCBkZXZpY2UgKi8KIAlTTkRSVl9IV0RFUF9JRkFDRV9GV19ESUdJMDBYLAkvKiBEaWdpZGVzaWduIERpZ2kgMDAyLzAwMyBmYW1pbHkgKi8KIAlTTkRSVl9IV0RFUF9JRkFDRV9GV19UQVNDQU0sCS8qIFRBU0NBTSBGaXJlV2lyZSBzZXJpZXMgKi8KKwlTTkRSVl9IV0RFUF9JRkFDRV9MSU5FNiwJLyogTGluZTYgVVNCIHByb2Nlc3NvcnMgKi8KIAogCS8qIERvbid0IGZvcmdldCB0byBjaGFuZ2UgdGhlIGZvbGxvd2luZzogKi8KLQlTTkRSVl9IV0RFUF9JRkFDRV9MQVNUID0gU05EUlZfSFdERVBfSUZBQ0VfRldfVEFTQ0FNCisJU05EUlZfSFdERVBfSUZBQ0VfTEFTVCA9IFNORFJWX0hXREVQX0lGQUNFX0xJTkU2CiB9OwogCiBzdHJ1Y3Qgc25kX2h3ZGVwX2luZm8gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL3NuZF9zc3RfdG9rZW5zLmggYi9pbmNsdWRlL3VhcGkvc291bmQvc25kX3NzdF90b2tlbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWUyZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL3NvdW5kL3NuZF9zc3RfdG9rZW5zLmgKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBzbmRfc3N0X3Rva2Vucy5oIC0gSW50ZWwgU1NUIHRva2VucyBkZWZpbml0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnAKKyAqIEF1dGhvcjogU2hyZXlhcyBOQyA8c2hyZXlhcy5uY0BpbnRlbC5jb20+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/Pz8gKHNjaGVkdWxlciBvcGVyYXRpb24pLgogICogQGFyZyA9PSAwICAgICAgICAgICAgICAgKFNDSEVET1BfeWllbGQgYW5kIFNDSEVET1BfYmxvY2spCiAgKiAgICAgID09IFNIVVRET1dOXyogY29kZSAoU0NIRURPUF9zaHV0ZG93bikKKyAqCisgKiBUaGlzIGxlZ2FjeSB2ZXJzaW9uIGlzIGF2YWlsYWJsZSB0byBuZXcgZ3Vlc3RzIGFzOgorICogbG9uZyBIWVBFUlZJU09SX3NjaGVkX29wX2NvbXBhdChlbnVtIHNjaGVkX29wIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiAgKi8KIAogLyoKQEAgLTQ0LDEyICs3NCwxNyBAQAogLyoKICAqIEhhbHQgZXhlY3V0aW9uIG9mIHRoaXMgZG9tYWluIChhbGwgVkNQVXMpIGFuZCBub3RpZnkgdGhlIHN5c3RlbSBjb250cm9sbGVyLgogICogQGFyZyA9PSBwb2ludGVyIHRvIHNjaGVkX3NodXRkb3duIHN0cnVjdHVyZS4KKyAqCisgKiBJZiB0aGUgc2NoZWRfc2h1dGRvd25fdCByZWFzb24gaXMgU0hVVERPV05fc3VzcGVuZCB0aGVuCisgKiB4ODYgUFYgZ3Vlc3RzIG11c3QgYWxzbyBzZXQgUkRYIChFRFggZm9yIDMyLWJpdCBndWVzdHMpIHRvIHRoZSBNRk4KKyAqIG9mIHRoZSBndWVzdCdzIHN0YXJ0IGluZm8gcGFnZS4gIFJEWC9FRFggaXMgdGhlIHRoaXJkIGh5cGVyY2FsbAorICogYXJndW1lbnQuCisgKgorICogSW4gYWRkaXRpb24sIHdoaWNoIHJlYXNvbiBpcyBTSFVURE9XTl9zdXNwZW5kIHRoaXMgaHlwZXJjYWxsCisgKiByZXR1cm5zIDEgaWYgc3VzcGVuZCB3YXMgY2FuY2VsbGVkIG9yIHRoZSBkb21haW4gd2FzIG1lcmVseQorICogY2hlY2twb2ludGVkLCBhbmQgMCBpZiBpdCBpcyByZXN1bWluZyBpbiBhIG5ldyBkb21haW4uCiAgKi8KICNkZWZpbmUgU0NIRURPUF9zaHV0ZG93biAgICAyCi1zdHJ1Y3Qgc2NoZWRfc2h1dGRvd24gewotICAgIHVuc2lnbmVkIGludCByZWFzb247IC8qIFNIVVRET1dOXyogKi8KLX07Ci1ERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVChzY2hlZF9zaHV0ZG93bik7CiAKIC8qCiAgKiBQb2xsIGEgc2V0IG9mIGV2ZW50LWNoYW5uZWwgcG9ydHMuIFJldHVybiB3aGVuIG9uZSBvciBtb3JlIGFyZSBwZW5kaW5nLiBBbgpAQCAtNTcsMTIgKzkyLDYgQEAKICAqIEBhcmcgPT0gcG9pbnRlciB0byBzY2hlZF9wb2xsIHN0cnVjdHVyZS4KICAqLwogI2RlZmluZSBTQ0hFRE9QX3BvbGwgICAgICAgIDMKLXN0cnVjdCBzY2hlZF9wb2xsIHsKLSAgICBHVUVTVF9IQU5ETEUoZXZ0Y2huX3BvcnRfdCkgcG9ydHM7Ci0gICAgdW5zaWduZWQgaW50IG5yX3BvcnRzOwotICAgIHVpbnQ2NF90IHRpbWVvdXQ7Ci19OwotREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfcG9sbCk7CiAKIC8qCiAgKiBEZWNsYXJlIGEgc2h1dGRvd24gZm9yIGFub3RoZXIgZG9tYWluLiBUaGUgbWFpbiB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpcwpAQCAtNzEsMTUgKzEwMCwxMSBAQAogICogQGFyZyA9PSBwb2ludGVyIHRvIHNjaGVkX3JlbW90ZV9zaHV0ZG93biBzdHJ1Y3R1cmUuCiAgKi8KICNkZWZpbmUgU0NIRURPUF9yZW1vdGVfc2h1dGRvd24gICAgICAgIDQKLXN0cnVjdCBzY2hlZF9yZW1vdGVfc2h1dGRvd24gewotICAgIGRvbWlkX3QgZG9tYWluX2lkOyAgICAgICAgIC8qIFJlbW90ZSBkb21haW4gSUQgKi8KLSAgICB1bnNpZ25lZCBpbnQgcmVhc29uOyAgICAgICAvKiBTSFVURE9XTl94eHggcmVhc29uICovCi19OwogCiAvKgogICogTGF0Y2ggYSBzaHV0ZG93biBjb2RlLCBzbyB0aGF0IHdoZW4gdGhlIGRvbWFpbiBsYXRlciBzaHV0cyBkb3duIGl0CiAgKiByZXBvcnRzIHRoaXMgY29kZSB0byB0aGUgY29udHJvbCB0b29scy4KLSAqIEBhcmcgPT0gYXMgZm9yIFNDSEVET1Bfc2h1dGRvd24uCisgKiBAYXJnID09IHNjaGVkX3NodXRkb3duLCBhcyBmb3IgU0NIRURPUF9zaHV0ZG93bi4KICAqLwogI2RlZmluZSBTQ0hFRE9QX3NodXRkb3duX2NvZGUgNQogCkBAIC05MiwxMCArMTE3LDQ3IEBACiAgKiBXaXRoIGlkICE9IDAgYW5kIHRpbWVvdXQgIT0gMCwgcG9rZSB3YXRjaGRvZyB0aW1lciBhbmQgc2V0IG5ldyB0aW1lb3V0LgogICovCiAjZGVmaW5lIFNDSEVET1Bfd2F0Y2hkb2cgICAgNgorCisvKgorICogT3ZlcnJpZGUgdGhlIGN1cnJlbnQgdmNwdSBhZmZpbml0eSBieSBwaW5uaW5nIGl0IHRvIG9uZSBwaHlzaWNhbCBjcHUgb3IKKyAqIHVuZG8gdGhpcyBvdmVycmlkZSByZXN0b3JpbmcgdGhlIHByZXZpb3VzIGFmZmluaXR5LgorICogQGFyZyA9PSBwb2ludGVyIHRvIHNjaGVkX3Bpbl9vdmVycmlkZSBzdHJ1Y3R1cmUuCisgKgorICogQSBuZWdhdGl2ZSBwY3B1IHZhbHVlIHdpbGwgdW5kbyBhIHByZXZpb3VzIHBpbiBvdmVycmlkZSBhbmQgcmVzdG9yZSB0aGUKKyAqIHByZXZpb3VzIGNwdSBhZmZpbml0eS4KKyAqIFRoaXMgY2FsbCBpcyBhbGxvd2VkIGZvciB0aGUgaGFyZHdhcmUgZG9tYWluIG9ubHkgYW5kIHJlcXVpcmVzIHRoZSBjcHUKKyAqIHRvIGJlIHBhcnQgb2YgdGhlIGRvbWFpbidzIGNwdXBvb2wuCisgKi8KKyNkZWZpbmUgU0NIRURPUF9waW5fb3ZlcnJpZGUgNworCitzdHJ1Y3Qgc2NoZWRfc2h1dGRvd24geworICAgIHVuc2lnbmVkIGludCByZWFzb247IC8qIFNIVVRET1dOXyogPT4gc2h1dGRvd24gcmVhc29uICovCit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfc2h1dGRvd24pOworCitzdHJ1Y3Qgc2NoZWRfcG9sbCB7CisgICAgR1VFU1RfSEFORExFKGV2dGNobl9wb3J0X3QpIHBvcnRzOworICAgIHVuc2lnbmVkIGludCBucl9wb3J0czsKKyAgICB1aW50NjRfdCB0aW1lb3V0OworfTsKK0RFRklORV9HVUVTVF9IQU5ETEVfU1RSVUNUKHNjaGVkX3BvbGwpOworCitzdHJ1Y3Qgc2NoZWRfcmVtb3RlX3NodXRkb3duIHsKKyAgICBkb21pZF90IGRvbWFpbl9pZDsgICAgICAgICAvKiBSZW1vdGUgZG9tYWluIElEICovCisgICAgdW5zaWduZWQgaW50IHJlYXNvbjsgICAgICAgLyogU0hVVERPV05fKiA9PiBzaHV0ZG93biByZWFzb24gKi8KK307CitERUZJTkVfR1VFU1RfSEFORExFX1NUUlVDVChzY2hlZF9yZW1vdGVfc2h1dGRvd24pOworCiBzdHJ1Y3Qgc2NoZWRfd2F0Y2hkb2cgewogICAgIHVpbnQzMl90IGlkOyAgICAgICAgICAgICAgICAvKiB3YXRjaGRvZyBJRCAqLwogICAgIHVpbnQzMl90IHRpbWVvdXQ7ICAgICAgICAgICAvKiB0aW1lb3V0ICovCiB9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfd2F0Y2hkb2cpOworCitzdHJ1Y3Qgc2NoZWRfcGluX292ZXJyaWRlIHsKKyAgICBpbnQzMl90IHBjcHU7Cit9OworREVGSU5FX0dVRVNUX0hBTkRMRV9TVFJVQ1Qoc2NoZWRfcGluX292ZXJyaWRlKTsKIAogLyoKICAqIFJlYXNvbiBjb2RlcyBmb3IgU0NIRURPUF9zaHV0ZG93bi4gVGhlc2UgbWF5IGJlIGludGVycHJldGVkIGJ5IGNvbnRyb2wKQEAgLTEwNyw2ICsxNjksNyBAQAogI2RlZmluZSBTSFVURE9XTl9zdXNwZW5kICAgIDIgIC8qIENsZWFuIHVwLCBzYXZlIHN1c3BlbmQgaW5mbywga2lsbC4gICAgICAgICAqLwogI2RlZmluZSBTSFVURE9XTl9jcmFzaCAgICAgIDMgIC8qIFRlbGwgY29udHJvbGxlciB3ZSd2ZSBjcmFzaGVkLiAgICAgICAgICAgICAqLwogI2RlZmluZSBTSFVURE9XTl93YXRjaGRvZyAgIDQgIC8qIFJlc3RhcnQgYmVjYXVzZSB3YXRjaGRvZyB0aW1lIGV4cGlyZWQuICAgICAqLworCiAvKgogICogRG9tYWluIGFza2VkIHRvIHBlcmZvcm0gJ3NvZnQgcmVzZXQnIGZvciBpdC4gVGhlIGV4cGVjdGVkIGJlaGF2aW9yIGlzIHRvCiAgKiByZXNldCBpbnRlcm5hbCBYZW4gc3RhdGUgZm9yIHRoZSBkb21haW4gcmV0dXJuaW5nIGl0IHRvIHRoZSBwb2ludCB3aGVyZSBpdApAQCAtMTE1LDUgKzE3OCw2IEBACiAgKiBpbnRlcmZhY2VzIGFnYWluLgogICovCiAjZGVmaW5lIFNIVVRET1dOX3NvZnRfcmVzZXQgNQorI2RlZmluZSBTSFVURE9XTl9NQVggICAgICAgIDUgIC8qIE1heGltdW0gdmFsaWQgc2h1dGRvd24gcmVhc29uLiAgICAgICAgICAgICAqLwogCiAjZW5kaWYgLyogX19YRU5fUFVCTElDX1NDSEVEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4veGVuLmggYi9pbmNsdWRlL3hlbi94ZW4uaAppbmRleCAwYzBlM2VmLi5mMGYwMjUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3hlbi94ZW4uaAorKysgYi9pbmNsdWRlL3hlbi94ZW4uaApAQCAtMzgsOCArMzgsNyBAQAogICovCiAjaW5jbHVkZSA8eGVuL2ZlYXR1cmVzLmg+CiAjZGVmaW5lIHhlbl9wdmhfZG9tYWluKCkgKHhlbl9wdl9kb21haW4oKSAmJiBcCi0JCQkgIHhlbl9mZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApICYmIFwKLQkJCSAgeGVuX2hhdmVfdmVjdG9yX2NhbGxiYWNrKQorCQkJICB4ZW5fZmVhdHVyZShYRU5GRUFUX2F1dG9fdHJhbnNsYXRlZF9waHlzbWFwKSkKICNlbHNlCiAjZGVmaW5lIHhlbl9wdmhfZG9tYWluKCkJKDApCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCBjYWMzZjA5Li5kN2ZjMjI2IDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0yNiw2ICsyNiwxNiBAQAogY29uZmlnIEJVSUxEVElNRV9FWFRBQkxFX1NPUlQKIAlib29sCiAKK2NvbmZpZyBUSFJFQURfSU5GT19JTl9UQVNLCisJYm9vbAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIHRvIG1vdmUgdGhyZWFkX2luZm8gb2ZmIHRoZSBzdGFjayBpbnRvIHRhc2tfc3RydWN0LiAgVG8KKwkgIG1ha2UgdGhpcyB3b3JrLCBhbiBhcmNoIHdpbGwgbmVlZCB0byByZW1vdmUgYWxsIHRocmVhZF9pbmZvIGZpZWxkcworCSAgZXhjZXB0IGZsYWdzIGFuZCBmaXggYW55IHJ1bnRpbWUgYnVncy4KKworCSAgT25lIHN1YnRsZSBjaGFuZ2UgdGhhdCB3aWxsIGJlIG5lZWRlZCBpcyB0byB1c2UgdHJ5X2dldF90YXNrX3N0YWNrKCkKKwkgIGFuZCBwdXRfdGFza19zdGFjaygpIGluIHNhdmVfdGhyZWFkX3N0YWNrX3RzaygpIGFuZCBnZXRfd2NoYW4oKS4KKwogbWVudSAiR2VuZXJhbCBzZXR1cCIKIAogY29uZmlnIEJST0tFTgpAQCAtMjEwOCwxMiArMjExOCw2IEBACiAJZGVwZW5kcyBvbiBTTVAKIAlib29sCiAKLSMgQ2FuIGJlIHNlbGVjdGVkIGJ5IGFyY2hpdGVjdHVyZXMgd2l0aCBicm9rZW4gdG9vbGNoYWlucwotIyB0aGF0IGdldCBjb25mdXNlZCBieSBjb3JyZWN0IGNvbnN0PC0+cmVhZF9vbmx5IHNlY3Rpb24KLSMgbWFwcGluZ3MKLWNvbmZpZyBCUk9LRU5fUk9EQVRBCi0JYm9vbAotCiBjb25maWcgQVNOMQogCXRyaXN0YXRlCiAJaGVscApkaWZmIC0tZ2l0IGEvaW5pdC9pbml0X3Rhc2suYyBiL2luaXQvaW5pdF90YXNrLmMKaW5kZXggYmEwYTdmMzYuLjExZjgzYmUxIDEwMDY0NAotLS0gYS9pbml0L2luaXRfdGFzay5jCisrKyBiL2luaXQvaW5pdF90YXNrLmMKQEAgLTIyLDUgKzIyLDggQEAKICAqIEluaXRpYWwgdGhyZWFkIHN0cnVjdHVyZS4gQWxpZ25tZW50IG9mIHRoaXMgaXMgaGFuZGxlZCBieSBhIHNwZWNpYWwKICAqIGxpbmtlciBtYXAgZW50cnkuCiAgKi8KLXVuaW9uIHRocmVhZF91bmlvbiBpbml0X3RocmVhZF91bmlvbiBfX2luaXRfdGFza19kYXRhID0KLQl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwordW5pb24gdGhyZWFkX3VuaW9uIGluaXRfdGhyZWFkX3VuaW9uIF9faW5pdF90YXNrX2RhdGEgPSB7CisjaWZuZGVmIENPTkZJR19USFJFQURfSU5GT19JTl9UQVNLCisJSU5JVF9USFJFQURfSU5GTyhpbml0X3Rhc2spCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9pcGMvbmFtZXNwYWNlLmMgYi9pcGMvbmFtZXNwYWNlLmMKaW5kZXggZDg3ZTZiYS4uMGFiZGVhNCAxMDA2NDQKLS0tIGEvaXBjL25hbWVzcGFjZS5jCisrKyBiL2lwYy9uYW1lc3BhY2UuYwpAQCAtMTYsMzkgKzE2LDYxIEBACiAKICNpbmNsdWRlICJ1dGlsLmgiCiAKK3N0YXRpYyBzdHJ1Y3QgdWNvdW50cyAqaW5jX2lwY19uYW1lc3BhY2VzKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7CisJcmV0dXJuIGluY191Y291bnQobnMsIGN1cnJlbnRfZXVpZCgpLCBVQ09VTlRfSVBDX05BTUVTUEFDRVMpOworfQorCitzdGF0aWMgdm9pZCBkZWNfaXBjX25hbWVzcGFjZXMoc3RydWN0IHVjb3VudHMgKnVjb3VudHMpCit7CisJZGVjX3Vjb3VudCh1Y291bnRzLCBVQ09VTlRfSVBDX05BTUVTUEFDRVMpOworfQorCiBzdGF0aWMgc3RydWN0IGlwY19uYW1lc3BhY2UgKmNyZWF0ZV9pcGNfbnMoc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAogCQkJCQkgICBzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqb2xkX25zKQogewogCXN0cnVjdCBpcGNfbmFtZXNwYWNlICpuczsKKwlzdHJ1Y3QgdWNvdW50cyAqdWNvdW50czsKIAlpbnQgZXJyOwogCisJZXJyID0gLUVOT1NQQzsKKwl1Y291bnRzID0gaW5jX2lwY19uYW1lc3BhY2VzKHVzZXJfbnMpOworCWlmICghdWNvdW50cykKKwkJZ290byBmYWlsOworCisJZXJyID0gLUVOT01FTTsKIAlucyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcGNfbmFtZXNwYWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG5zID09IE5VTEwpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIGZhaWxfZGVjOwogCiAJZXJyID0gbnNfYWxsb2NfaW51bSgmbnMtPm5zKTsKLQlpZiAoZXJyKSB7Ci0JCWtmcmVlKG5zKTsKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKLQl9CisJaWYgKGVycikKKwkJZ290byBmYWlsX2ZyZWU7CiAJbnMtPm5zLm9wcyA9ICZpcGNuc19vcGVyYXRpb25zOwogCiAJYXRvbWljX3NldCgmbnMtPmNvdW50LCAxKTsKIAlucy0+dXNlcl9ucyA9IGdldF91c2VyX25zKHVzZXJfbnMpOworCW5zLT51Y291bnRzID0gdWNvdW50czsKIAogCWVyciA9IG1xX2luaXRfbnMobnMpOwotCWlmIChlcnIpIHsKLQkJcHV0X3VzZXJfbnMobnMtPnVzZXJfbnMpOwotCQluc19mcmVlX2ludW0oJm5zLT5ucyk7Ci0JCWtmcmVlKG5zKTsKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKLQl9CisJaWYgKGVycikKKwkJZ290byBmYWlsX3B1dDsKIAogCXNlbV9pbml0X25zKG5zKTsKIAltc2dfaW5pdF9ucyhucyk7CiAJc2htX2luaXRfbnMobnMpOwogCiAJcmV0dXJuIG5zOworCitmYWlsX3B1dDoKKwlwdXRfdXNlcl9ucyhucy0+dXNlcl9ucyk7CisJbnNfZnJlZV9pbnVtKCZucy0+bnMpOworZmFpbF9mcmVlOgorCWtmcmVlKG5zKTsKK2ZhaWxfZGVjOgorCWRlY19pcGNfbmFtZXNwYWNlcyh1Y291bnRzKTsKK2ZhaWw6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAogc3RydWN0IGlwY19uYW1lc3BhY2UgKmNvcHlfaXBjcyh1bnNpZ25lZCBsb25nIGZsYWdzLApAQCAtOTYsNiArMTE4LDcgQEAKIAltc2dfZXhpdF9ucyhucyk7CiAJc2htX2V4aXRfbnMobnMpOwogCisJZGVjX2lwY19uYW1lc3BhY2VzKG5zLT51Y291bnRzKTsKIAlwdXRfdXNlcl9ucyhucy0+dXNlcl9ucyk7CiAJbnNfZnJlZV9pbnVtKCZucy0+bnMpOwogCWtmcmVlKG5zKTsKQEAgLTE2NSwxMCArMTg4LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKmlwY25zX293bmVyKHN0cnVjdCBuc19jb21tb24gKm5zKQoreworCXJldHVybiB0b19pcGNfbnMobnMpLT51c2VyX25zOworfQorCiBjb25zdCBzdHJ1Y3QgcHJvY19uc19vcGVyYXRpb25zIGlwY25zX29wZXJhdGlvbnMgPSB7CiAJLm5hbWUJCT0gImlwYyIsCiAJLnR5cGUJCT0gQ0xPTkVfTkVXSVBDLAogCS5nZXQJCT0gaXBjbnNfZ2V0LAogCS5wdXQJCT0gaXBjbnNfcHV0LAogCS5pbnN0YWxsCT0gaXBjbnNfaW5zdGFsbCwKKwkub3duZXIJCT0gaXBjbnNfb3duZXIsCiB9OwpkaWZmIC0tZ2l0IGEva2VybmVsL01ha2VmaWxlIGIva2VybmVsL01ha2VmaWxlCmluZGV4IGUyZWM1NGUuLmViMjZlMTJjIDEwMDY0NAotLS0gYS9rZXJuZWwvTWFrZWZpbGUKKysrIGIva2VybmVsL01ha2VmaWxlCkBAIC05LDcgKzksNyBAQAogCSAgICBleHRhYmxlLm8gcGFyYW1zLm8gXAogCSAgICBrdGhyZWFkLm8gc3lzX25pLm8gbnNwcm94eS5vIFwKIAkgICAgbm90aWZpZXIubyBrc3lzZnMubyBjcmVkLm8gcmVib290Lm8gXAotCSAgICBhc3luYy5vIHJhbmdlLm8gc21wYm9vdC5vCisJICAgIGFzeW5jLm8gcmFuZ2UubyBzbXBib290Lm8gdWNvdW50Lm8KIAogb2JqLSQoQ09ORklHX01VTFRJVVNFUikgKz0gZ3JvdXBzLm8KIApkaWZmIC0tZ2l0IGEva2VybmVsL2F1ZGl0LmMgYi9rZXJuZWwvYXVkaXQuYwppbmRleCBhOGE5MWJkLi5mMWNhMTE2IDEwMDY0NAotLS0gYS9rZXJuZWwvYXVkaXQuYworKysgYi9rZXJuZWwvYXVkaXQuYwpAQCAtODc3LDYgKzg3NywxMiBAQAogCQkJCXJldHVybiBlcnI7CiAJCX0KIAkJaWYgKHMubWFzayAmIEFVRElUX1NUQVRVU19QSUQpIHsKKwkJCS8qIE5PVEU6IHdlIGFyZSB1c2luZyB0YXNrX3RnaWRfdm5yKCkgYmVsb3cgYmVjYXVzZQorCQkJICogICAgICAgdGhlIHMucGlkIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBuYW1lc3BhY2UKKwkJCSAqICAgICAgIG9mIHRoZSBjYWxsZXI7IGF0IHByZXNlbnQgdGhpcyBkb2Vzbid0IG1hdHRlcgorCQkJICogICAgICAgbXVjaCBzaW5jZSB5b3UgY2FuIHJlYWxseSBvbmx5IHJ1biBhdWRpdGQKKwkJCSAqICAgICAgIGZyb20gdGhlIGluaXRpYWwgcGlkIG5hbWVzcGFjZSwgYnV0IHNvbWV0aGluZworCQkJICogICAgICAgdG8ga2VlcCBpbiBtaW5kIGlmIHRoaXMgY2hhbmdlcyAqLwogCQkJaW50IG5ld19waWQgPSBzLnBpZDsKIAkJCXBpZF90IHJlcXVlc3RpbmdfcGlkID0gdGFza190Z2lkX3ZucihjdXJyZW50KTsKIApAQCAtMTkxNyw3ICsxOTIzLDcgQEAKIAkJCSAiIGV1aWQ9JXUgc3VpZD0ldSBmc3VpZD0ldSIKIAkJCSAiIGVnaWQ9JXUgc2dpZD0ldSBmc2dpZD0ldSB0dHk9JXMgc2VzPSV1IiwKIAkJCSB0YXNrX3BwaWRfbnIodHNrKSwKLQkJCSB0YXNrX3BpZF9ucih0c2spLAorCQkJIHRhc2tfdGdpZF9ucih0c2spLAogCQkJIGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCBhdWRpdF9nZXRfbG9naW51aWQodHNrKSksCiAJCQkgZnJvbV9rdWlkKCZpbml0X3VzZXJfbnMsIGNyZWQtPnVpZCksCiAJCQkgZnJvbV9rZ2lkKCZpbml0X3VzZXJfbnMsIGNyZWQtPmdpZCksCmRpZmYgLS1naXQgYS9rZXJuZWwvYXVkaXRfd2F0Y2guYyBiL2tlcm5lbC9hdWRpdF93YXRjaC5jCmluZGV4IGQ2NzA5ZWIuLjBkMzAyYTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdF93YXRjaC5jCisrKyBiL2tlcm5lbC9hdWRpdF93YXRjaC5jCkBAIC0xOSw2ICsxOSw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KQEAgLTU0NCwxMCArNTQ1LDExIEBACiAJdW5zaWduZWQgbG9uZyBpbm87CiAJZGV2X3QgZGV2OwogCi0JcmN1X3JlYWRfbG9jaygpOwotCWV4ZV9maWxlID0gcmN1X2RlcmVmZXJlbmNlKHRzay0+bW0tPmV4ZV9maWxlKTsKKwlleGVfZmlsZSA9IGdldF90YXNrX2V4ZV9maWxlKHRzayk7CisJaWYgKCFleGVfZmlsZSkKKwkJcmV0dXJuIDA7CiAJaW5vID0gZXhlX2ZpbGUtPmZfaW5vZGUtPmlfaW5vOwogCWRldiA9IGV4ZV9maWxlLT5mX2lub2RlLT5pX3NiLT5zX2RldjsKLQlyY3VfcmVhZF91bmxvY2soKTsKKwlmcHV0KGV4ZV9maWxlKTsKIAlyZXR1cm4gYXVkaXRfbWFya19jb21wYXJlKG1hcmssIGlubywgZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdHNjLmMgYi9rZXJuZWwvYXVkaXRzYy5jCmluZGV4IDVhYmYxZGMuLjJjZDUyNTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdHNjLmMKKysrIGIva2VybmVsL2F1ZGl0c2MuYwpAQCAtNDU3LDcgKzQ1Nyw3IEBACiAKIAkJc3dpdGNoIChmLT50eXBlKSB7CiAJCWNhc2UgQVVESVRfUElEOgotCQkJcGlkID0gdGFza19waWRfbnIodHNrKTsKKwkJCXBpZCA9IHRhc2tfdGdpZF9ucih0c2spOwogCQkJcmVzdWx0ID0gYXVkaXRfY29tcGFyYXRvcihwaWQsIGYtPm9wLCBmLT52YWwpOwogCQkJYnJlYWs7CiAJCWNhc2UgQVVESVRfUFBJRDoKQEAgLTE5OTMsNyArMTk5Myw3IEBACiAJbG9naW51aWQgPSBmcm9tX2t1aWQoJmluaXRfdXNlcl9ucywga2xvZ2ludWlkKSwKIAl0dHkgPSBhdWRpdF9nZXRfdHR5KGN1cnJlbnQpOwogCi0JYXVkaXRfbG9nX2Zvcm1hdChhYiwgInBpZD0lZCB1aWQ9JXUiLCB0YXNrX3BpZF9ucihjdXJyZW50KSwgdWlkKTsKKwlhdWRpdF9sb2dfZm9ybWF0KGFiLCAicGlkPSVkIHVpZD0ldSIsIHRhc2tfdGdpZF9ucihjdXJyZW50KSwgdWlkKTsKIAlhdWRpdF9sb2dfdGFza19jb250ZXh0KGFiKTsKIAlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIG9sZC1hdWlkPSV1IGF1aWQ9JXUgdHR5PSVzIG9sZC1zZXM9JXUgc2VzPSV1IHJlcz0lZCIsCiAJCQkgb2xkbG9naW51aWQsIGxvZ2ludWlkLCB0dHkgPyB0dHlfbmFtZSh0dHkpIDogIihub25lKSIsCkBAIC0yMjIwLDcgKzIyMjAsNyBAQAogewogCXN0cnVjdCBhdWRpdF9jb250ZXh0ICpjb250ZXh0ID0gY3VycmVudC0+YXVkaXRfY29udGV4dDsKIAotCWNvbnRleHQtPnRhcmdldF9waWQgPSB0YXNrX3BpZF9ucih0KTsKKwljb250ZXh0LT50YXJnZXRfcGlkID0gdGFza190Z2lkX25yKHQpOwogCWNvbnRleHQtPnRhcmdldF9hdWlkID0gYXVkaXRfZ2V0X2xvZ2ludWlkKHQpOwogCWNvbnRleHQtPnRhcmdldF91aWQgPSB0YXNrX3VpZCh0KTsKIAljb250ZXh0LT50YXJnZXRfc2Vzc2lvbmlkID0gYXVkaXRfZ2V0X3Nlc3Npb25pZCh0KTsKQEAgLTIyNDUsNyArMjI0NSw3IEBACiAKIAlpZiAoYXVkaXRfcGlkICYmIHQtPnRnaWQgPT0gYXVkaXRfcGlkKSB7CiAJCWlmIChzaWcgPT0gU0lHVEVSTSB8fCBzaWcgPT0gU0lHSFVQIHx8IHNpZyA9PSBTSUdVU1IxIHx8IHNpZyA9PSBTSUdVU1IyKSB7Ci0JCQlhdWRpdF9zaWdfcGlkID0gdGFza19waWRfbnIodHNrKTsKKwkJCWF1ZGl0X3NpZ19waWQgPSB0YXNrX3RnaWRfbnIodHNrKTsKIAkJCWlmICh1aWRfdmFsaWQodHNrLT5sb2dpbnVpZCkpCiAJCQkJYXVkaXRfc2lnX3VpZCA9IHRzay0+bG9naW51aWQ7CiAJCQllbHNlCkBAIC0yMzQ1LDcgKzIzNDUsNyBAQAogdm9pZCBfX2F1ZGl0X2xvZ19jYXBzZXQoY29uc3Qgc3RydWN0IGNyZWQgKm5ldywgY29uc3Qgc3RydWN0IGNyZWQgKm9sZCkKIHsKIAlzdHJ1Y3QgYXVkaXRfY29udGV4dCAqY29udGV4dCA9IGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQ7Ci0JY29udGV4dC0+Y2Fwc2V0LnBpZCA9IHRhc2tfcGlkX25yKGN1cnJlbnQpOworCWNvbnRleHQtPmNhcHNldC5waWQgPSB0YXNrX3RnaWRfbnIoY3VycmVudCk7CiAJY29udGV4dC0+Y2Fwc2V0LmNhcC5lZmZlY3RpdmUgICA9IG5ldy0+Y2FwX2VmZmVjdGl2ZTsKIAljb250ZXh0LT5jYXBzZXQuY2FwLmluaGVyaXRhYmxlID0gbmV3LT5jYXBfZWZmZWN0aXZlOwogCWNvbnRleHQtPmNhcHNldC5jYXAucGVybWl0dGVkICAgPSBuZXctPmNhcF9wZXJtaXR0ZWQ7CkBAIC0yMzc3LDcgKzIzNzcsNyBAQAogCQkJIGZyb21fa2dpZCgmaW5pdF91c2VyX25zLCBnaWQpLAogCQkJIHNlc3Npb25pZCk7CiAJYXVkaXRfbG9nX3Rhc2tfY29udGV4dChhYik7Ci0JYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBwaWQ9JWQgY29tbT0iLCB0YXNrX3BpZF9ucihjdXJyZW50KSk7CisJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBwaWQ9JWQgY29tbT0iLCB0YXNrX3RnaWRfbnIoY3VycmVudCkpOwogCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIGdldF90YXNrX2NvbW0oY29tbSwgY3VycmVudCkpOwogCWF1ZGl0X2xvZ19kX3BhdGhfZXhlKGFiLCBjdXJyZW50LT5tbSk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2FycmF5bWFwLmMgYi9rZXJuZWwvYnBmL2FycmF5bWFwLmMKaW5kZXggNjMzYTY1MC4uYTJhYzA1MSAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9hcnJheW1hcC5jCisrKyBiL2tlcm5lbC9icGYvYXJyYXltYXAuYwpAQCAtNTM4LDcgKzUzOCw3IEBACiB9CiBsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX3BlcmZfZXZlbnRfYXJyYXlfbWFwKTsKIAotI2lmZGVmIENPTkZJR19TT0NLX0NHUk9VUF9EQVRBCisjaWZkZWYgQ09ORklHX0NHUk9VUFMKIHN0YXRpYyB2b2lkICpjZ3JvdXBfZmRfYXJyYXlfZ2V0X3B0cihzdHJ1Y3QgYnBmX21hcCAqbWFwLAogCQkJCSAgICAgc3RydWN0IGZpbGUgKm1hcF9maWxlIC8qIG5vdCB1c2VkICovLAogCQkJCSAgICAgaW50IGZkKQpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9jb3JlLmMgYi9rZXJuZWwvYnBmL2NvcmUuYwppbmRleCAwM2ZkMjNkLi5hYTZkOTgxIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2NvcmUuYworKysgYi9rZXJuZWwvYnBmL2NvcmUuYwpAQCAtMTAxOCw3ICsxMDE4LDcgQEAKIAlwcmFuZG9tX2luaXRfb25jZSgmYnBmX3VzZXJfcm5kX3N0YXRlKTsKIH0KIAotdTY0IGJwZl91c2VyX3JuZF91MzIodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8wKGJwZl91c2VyX3JuZF91MzIpCiB7CiAJLyogU2hvdWxkIHNvbWVvbmUgZXZlciBoYXZlIHRoZSByYXRoZXIgdW53aXNlIGlkZWEgdG8gdXNlIHNvbWUKIAkgKiBvZiB0aGUgcmVnaXN0ZXJzIHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24sIHRoZW4gbm90ZSB0aGF0CkBAIC0xMDMxLDcgKzEwMzEsNyBAQAogCiAJc3RhdGUgPSAmZ2V0X2NwdV92YXIoYnBmX3VzZXJfcm5kX3N0YXRlKTsKIAlyZXMgPSBwcmFuZG9tX3UzMl9zdGF0ZShzdGF0ZSk7Ci0JcHV0X2NwdV92YXIoc3RhdGUpOworCXB1dF9jcHVfdmFyKGJwZl91c2VyX3JuZF9zdGF0ZSk7CiAKIAlyZXR1cm4gcmVzOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi9oZWxwZXJzLmMgYi9rZXJuZWwvYnBmL2hlbHBlcnMuYwppbmRleCAxZWEzYWZiLi4zOTkxODQwIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL2hlbHBlcnMuYworKysgYi9rZXJuZWwvYnBmL2hlbHBlcnMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC91aWRnaWQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KIAogLyogSWYga2VybmVsIHN1YnN5c3RlbSBpcyBhbGxvd2luZyBlQlBGIHByb2dyYW1zIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiwKICAqIGluc2lkZSBpdHMgb3duIHZlcmlmaWVyX29wcy0+Z2V0X2Z1bmNfcHJvdG8oKSBjYWxsYmFjayBpdCBzaG91bGQgcmV0dXJuCkBAIC0yNiw0OCArMjcsMzIgQEAKICAqIGlmIHByb2dyYW0gaXMgYWxsb3dlZCB0byBhY2Nlc3MgbWFwcywgc28gY2hlY2sgcmN1X3JlYWRfbG9ja19oZWxkIGluCiAgKiBhbGwgdGhyZWUgZnVuY3Rpb25zLgogICovCi1zdGF0aWMgdTY0IGJwZl9tYXBfbG9va3VwX2VsZW0odTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8yKGJwZl9tYXBfbG9va3VwX2VsZW0sIHN0cnVjdCBicGZfbWFwICosIG1hcCwgdm9pZCAqLCBrZXkpCiB7Ci0JLyogdmVyaWZpZXIgY2hlY2tlZCB0aGF0IFIxIGNvbnRhaW5zIGEgdmFsaWQgcG9pbnRlciB0byBicGZfbWFwCi0JICogYW5kIFIyIHBvaW50cyB0byBhIHByb2dyYW0gc3RhY2sgYW5kIG1hcC0+a2V5X3NpemUgYnl0ZXMgd2VyZQotCSAqIGluaXRpYWxpemVkCi0JICovCi0Jc3RydWN0IGJwZl9tYXAgKm1hcCA9IChzdHJ1Y3QgYnBmX21hcCAqKSAodW5zaWduZWQgbG9uZykgcjE7Ci0Jdm9pZCAqa2V5ID0gKHZvaWQgKikgKHVuc2lnbmVkIGxvbmcpIHIyOwotCXZvaWQgKnZhbHVlOwotCiAJV0FSTl9PTl9PTkNFKCFyY3VfcmVhZF9sb2NrX2hlbGQoKSk7Ci0KLQl2YWx1ZSA9IG1hcC0+b3BzLT5tYXBfbG9va3VwX2VsZW0obWFwLCBrZXkpOwotCi0JLyogbG9va3VwKCkgcmV0dXJucyBlaXRoZXIgcG9pbnRlciB0byBlbGVtZW50IHZhbHVlIG9yIE5VTEwKLQkgKiB3aGljaCBpcyB0aGUgbWVhbmluZyBvZiBQVFJfVE9fTUFQX1ZBTFVFX09SX05VTEwgdHlwZQotCSAqLwotCXJldHVybiAodW5zaWduZWQgbG9uZykgdmFsdWU7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKSBtYXAtPm9wcy0+bWFwX2xvb2t1cF9lbGVtKG1hcCwga2V5KTsKIH0KIAogY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9tYXBfbG9va3VwX2VsZW1fcHJvdG8gPSB7CiAJLmZ1bmMJCT0gYnBmX21hcF9sb29rdXBfZWxlbSwKIAkuZ3BsX29ubHkJPSBmYWxzZSwKKwkucGt0X2FjY2Vzcwk9IHRydWUsCiAJLnJldF90eXBlCT0gUkVUX1BUUl9UT19NQVBfVkFMVUVfT1JfTlVMTCwKIAkuYXJnMV90eXBlCT0gQVJHX0NPTlNUX01BUF9QVFIsCiAJLmFyZzJfdHlwZQk9IEFSR19QVFJfVE9fTUFQX0tFWSwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX21hcF91cGRhdGVfZWxlbSh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzQoYnBmX21hcF91cGRhdGVfZWxlbSwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLCB2b2lkICosIGtleSwKKwkgICB2b2lkICosIHZhbHVlLCB1NjQsIGZsYWdzKQogewotCXN0cnVjdCBicGZfbWFwICptYXAgPSAoc3RydWN0IGJwZl9tYXAgKikgKHVuc2lnbmVkIGxvbmcpIHIxOwotCXZvaWQgKmtleSA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKSByMjsKLQl2b2lkICp2YWx1ZSA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKSByMzsKLQogCVdBUk5fT05fT05DRSghcmN1X3JlYWRfbG9ja19oZWxkKCkpOwotCi0JcmV0dXJuIG1hcC0+b3BzLT5tYXBfdXBkYXRlX2VsZW0obWFwLCBrZXksIHZhbHVlLCByNCk7CisJcmV0dXJuIG1hcC0+b3BzLT5tYXBfdXBkYXRlX2VsZW0obWFwLCBrZXksIHZhbHVlLCBmbGFncyk7CiB9CiAKIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX3VwZGF0ZV9lbGVtX3Byb3RvID0gewogCS5mdW5jCQk9IGJwZl9tYXBfdXBkYXRlX2VsZW0sCiAJLmdwbF9vbmx5CT0gZmFsc2UsCisJLnBrdF9hY2Nlc3MJPSB0cnVlLAogCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAogCS5hcmcxX3R5cGUJPSBBUkdfQ09OU1RfTUFQX1BUUiwKIAkuYXJnMl90eXBlCT0gQVJHX1BUUl9UT19NQVBfS0VZLApAQCAtNzUsMTkgKzYwLDE2IEBACiAJLmFyZzRfdHlwZQk9IEFSR19BTllUSElORywKIH07CiAKLXN0YXRpYyB1NjQgYnBmX21hcF9kZWxldGVfZWxlbSh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzIoYnBmX21hcF9kZWxldGVfZWxlbSwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLCB2b2lkICosIGtleSkKIHsKLQlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gKHN0cnVjdCBicGZfbWFwICopICh1bnNpZ25lZCBsb25nKSByMTsKLQl2b2lkICprZXkgPSAodm9pZCAqKSAodW5zaWduZWQgbG9uZykgcjI7Ci0KIAlXQVJOX09OX09OQ0UoIXJjdV9yZWFkX2xvY2tfaGVsZCgpKTsKLQogCXJldHVybiBtYXAtPm9wcy0+bWFwX2RlbGV0ZV9lbGVtKG1hcCwga2V5KTsKIH0KIAogY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9tYXBfZGVsZXRlX2VsZW1fcHJvdG8gPSB7CiAJLmZ1bmMJCT0gYnBmX21hcF9kZWxldGVfZWxlbSwKIAkuZ3BsX29ubHkJPSBmYWxzZSwKKwkucGt0X2FjY2Vzcwk9IHRydWUsCiAJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCiAJLmFyZzFfdHlwZQk9IEFSR19DT05TVF9NQVBfUFRSLAogCS5hcmcyX3R5cGUJPSBBUkdfUFRSX1RPX01BUF9LRVksCkBAIC05OSw3ICs4MSw3IEBACiAJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9nZXRfc21wX3Byb2Nlc3Nvcl9pZCh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzAoYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkKQogewogCXJldHVybiBzbXBfcHJvY2Vzc29yX2lkKCk7CiB9CkBAIC0xMTAsNyArOTIsNyBAQAogCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAogfTsKIAotc3RhdGljIHU2NCBicGZfa3RpbWVfZ2V0X25zKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMChicGZfa3RpbWVfZ2V0X25zKQogewogCS8qIE5NSSBzYWZlIGFjY2VzcyB0byBjbG9jayBtb25vdG9uaWMgKi8KIAlyZXR1cm4ga3RpbWVfZ2V0X21vbm9fZmFzdF9ucygpOwpAQCAtMTIyLDExICsxMDQsMTEgQEAKIAkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMChicGZfZ2V0X2N1cnJlbnRfcGlkX3RnaWQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gY3VycmVudDsKIAotCWlmICghdGFzaykKKwlpZiAodW5saWtlbHkoIXRhc2spKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiAodTY0KSB0YXNrLT50Z2lkIDw8IDMyIHwgdGFzay0+cGlkOwpAQCAtMTM4LDE4ICsxMjAsMTggQEAKIAkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2dldF9jdXJyZW50X3VpZF9naWQodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8wKGJwZl9nZXRfY3VycmVudF91aWRfZ2lkKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGN1cnJlbnQ7CiAJa3VpZF90IHVpZDsKIAlrZ2lkX3QgZ2lkOwogCi0JaWYgKCF0YXNrKQorCWlmICh1bmxpa2VseSghdGFzaykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJY3VycmVudF91aWRfZ2lkKCZ1aWQsICZnaWQpOwogCXJldHVybiAodTY0KSBmcm9tX2tnaWQoJmluaXRfdXNlcl9ucywgZ2lkKSA8PCAzMiB8Ci0JCWZyb21fa3VpZCgmaW5pdF91c2VyX25zLCB1aWQpOworCQkgICAgIGZyb21fa3VpZCgmaW5pdF91c2VyX25zLCB1aWQpOwogfQogCiBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2dldF9jdXJyZW50X3VpZF9naWRfcHJvdG8gPSB7CkBAIC0xNTgsMTAgKzE0MCw5IEBACiAJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9nZXRfY3VycmVudF9jb21tKHU2NCByMSwgdTY0IHNpemUsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8yKGJwZl9nZXRfY3VycmVudF9jb21tLCBjaGFyICosIGJ1ZiwgdTMyLCBzaXplKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGN1cnJlbnQ7Ci0JY2hhciAqYnVmID0gKGNoYXIgKikgKGxvbmcpIHIxOwogCiAJaWYgKHVubGlrZWx5KCF0YXNrKSkKIAkJZ290byBlcnJfY2xlYXI7CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3N0YWNrbWFwLmMgYi9rZXJuZWwvYnBmL3N0YWNrbWFwLmMKaW5kZXggYmY0NDk1Zi4uNzMyYWUxNiAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9zdGFja21hcC5jCisrKyBiL2tlcm5lbC9icGYvc3RhY2ttYXAuYwpAQCAtMTE2LDEwICsxMTYsOSBAQAogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKLXU2NCBicGZfZ2V0X3N0YWNraWQodTY0IHIxLCB1NjQgcjIsIHU2NCBmbGFncywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKGJwZl9nZXRfc3RhY2tpZCwgc3RydWN0IHB0X3JlZ3MgKiwgcmVncywgc3RydWN0IGJwZl9tYXAgKiwgbWFwLAorCSAgIHU2NCwgZmxhZ3MpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKikgKGxvbmcpIHIxOwotCXN0cnVjdCBicGZfbWFwICptYXAgPSAoc3RydWN0IGJwZl9tYXAgKikgKGxvbmcpIHIyOwogCXN0cnVjdCBicGZfc3RhY2tfbWFwICpzbWFwID0gY29udGFpbmVyX29mKG1hcCwgc3RydWN0IGJwZl9zdGFja19tYXAsIG1hcCk7CiAJc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICp0cmFjZTsKIAlzdHJ1Y3Qgc3RhY2tfbWFwX2J1Y2tldCAqYnVja2V0LCAqbmV3X2J1Y2tldCwgKm9sZF9idWNrZXQ7CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMgYi9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKaW5kZXggZGFlYTc2NS4uOTlhN2U1YiAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi92ZXJpZmllci5jCisrKyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZl92ZXJpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgpAQCAtMTI2LDc2ICsxMjcsMTYgQEAKICAqIGFyZSBzZXQgdG8gTk9UX0lOSVQgdG8gaW5kaWNhdGUgdGhhdCB0aGV5IGFyZSBubyBsb25nZXIgcmVhZGFibGUuCiAgKi8KIAotc3RydWN0IHJlZ19zdGF0ZSB7Ci0JZW51bSBicGZfcmVnX3R5cGUgdHlwZTsKLQl1bmlvbiB7Ci0JCS8qIHZhbGlkIHdoZW4gdHlwZSA9PSBDT05TVF9JTU0gfCBQVFJfVE9fU1RBQ0sgfCBVTktOT1dOX1ZBTFVFICovCi0JCXM2NCBpbW07Ci0KLQkJLyogdmFsaWQgd2hlbiB0eXBlID09IFBUUl9UT19QQUNLRVQqICovCi0JCXN0cnVjdCB7Ci0JCQl1MzIgaWQ7Ci0JCQl1MTYgb2ZmOwotCQkJdTE2IHJhbmdlOwotCQl9OwotCi0JCS8qIHZhbGlkIHdoZW4gdHlwZSA9PSBDT05TVF9QVFJfVE9fTUFQIHwgUFRSX1RPX01BUF9WQUxVRSB8Ci0JCSAqICAgUFRSX1RPX01BUF9WQUxVRV9PUl9OVUxMCi0JCSAqLwotCQlzdHJ1Y3QgYnBmX21hcCAqbWFwX3B0cjsKLQl9OwotfTsKLQotZW51bSBicGZfc3RhY2tfc2xvdF90eXBlIHsKLQlTVEFDS19JTlZBTElELCAgICAvKiBub3RoaW5nIHdhcyBzdG9yZWQgaW4gdGhpcyBzdGFjayBzbG90ICovCi0JU1RBQ0tfU1BJTEwsICAgICAgLyogcmVnaXN0ZXIgc3BpbGxlZCBpbnRvIHN0YWNrICovCi0JU1RBQ0tfTUlTQwkgIC8qIEJQRiBwcm9ncmFtIHdyb3RlIHNvbWUgZGF0YSBpbnRvIHRoaXMgc2xvdCAqLwotfTsKLQotI2RlZmluZSBCUEZfUkVHX1NJWkUgOAkvKiBzaXplIG9mIGVCUEYgcmVnaXN0ZXIgaW4gYnl0ZXMgKi8KLQotLyogc3RhdGUgb2YgdGhlIHByb2dyYW06Ci0gKiB0eXBlIG9mIGFsbCByZWdpc3RlcnMgYW5kIHN0YWNrIGluZm8KLSAqLwotc3RydWN0IHZlcmlmaWVyX3N0YXRlIHsKLQlzdHJ1Y3QgcmVnX3N0YXRlIHJlZ3NbTUFYX0JQRl9SRUddOwotCXU4IHN0YWNrX3Nsb3RfdHlwZVtNQVhfQlBGX1NUQUNLXTsKLQlzdHJ1Y3QgcmVnX3N0YXRlIHNwaWxsZWRfcmVnc1tNQVhfQlBGX1NUQUNLIC8gQlBGX1JFR19TSVpFXTsKLX07Ci0KLS8qIGxpbmtlZCBsaXN0IG9mIHZlcmlmaWVyIHN0YXRlcyB1c2VkIHRvIHBydW5lIHNlYXJjaCAqLwotc3RydWN0IHZlcmlmaWVyX3N0YXRlX2xpc3QgewotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSBzdGF0ZTsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqbmV4dDsKLX07Ci0KIC8qIHZlcmlmaWVyX3N0YXRlICsgaW5zbl9pZHggYXJlIHB1c2hlZCB0byBzdGFjayB3aGVuIGJyYW5jaCBpcyBlbmNvdW50ZXJlZCAqLwotc3RydWN0IHZlcmlmaWVyX3N0YWNrX2VsZW0geworc3RydWN0IGJwZl92ZXJpZmllcl9zdGFja19lbGVtIHsKIAkvKiB2ZXJpZmVyIHN0YXRlIGlzICdzdCcKIAkgKiBiZWZvcmUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnaW5zbl9pZHgnCiAJICogYW5kIGFmdGVyIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJ3ByZXZfaW5zbl9pZHgnCiAJICovCi0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlIHN0OworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgc3Q7CiAJaW50IGluc25faWR4OwogCWludCBwcmV2X2luc25faWR4OwotCXN0cnVjdCB2ZXJpZmllcl9zdGFja19lbGVtICpuZXh0OwotfTsKLQotI2RlZmluZSBNQVhfVVNFRF9NQVBTIDY0IC8qIG1heCBudW1iZXIgb2YgbWFwcyBhY2Nlc3NlZCBieSBvbmUgZUJQRiBwcm9ncmFtICovCi0KLS8qIHNpbmdsZSBjb250YWluZXIgZm9yIGFsbCBzdHJ1Y3RzCi0gKiBvbmUgdmVyaWZpZXJfZW52IHBlciBicGZfY2hlY2soKSBjYWxsCi0gKi8KLXN0cnVjdCB2ZXJpZmllcl9lbnYgewotCXN0cnVjdCBicGZfcHJvZyAqcHJvZzsJCS8qIGVCUEYgcHJvZ3JhbSBiZWluZyB2ZXJpZmllZCAqLwotCXN0cnVjdCB2ZXJpZmllcl9zdGFja19lbGVtICpoZWFkOyAvKiBzdGFjayBvZiB2ZXJpZmllciBzdGF0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCi0JaW50IHN0YWNrX3NpemU7CQkJLyogbnVtYmVyIG9mIHN0YXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgY3VyX3N0YXRlOyAvKiBjdXJyZW50IHZlcmlmaWVyIHN0YXRlICovCi0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlX2xpc3QgKipleHBsb3JlZF9zdGF0ZXM7IC8qIHNlYXJjaCBwcnVuaW5nIG9wdGltaXphdGlvbiAqLwotCXN0cnVjdCBicGZfbWFwICp1c2VkX21hcHNbTUFYX1VTRURfTUFQU107IC8qIGFycmF5IG9mIG1hcCdzIHVzZWQgYnkgZUJQRiBwcm9ncmFtICovCi0JdTMyIHVzZWRfbWFwX2NudDsJCS8qIG51bWJlciBvZiB1c2VkIG1hcHMgKi8KLQl1MzIgaWRfZ2VuOwkJCS8qIHVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIHJlZyBJRHMgKi8KLQlib29sIGFsbG93X3B0cl9sZWFrczsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YWNrX2VsZW0gKm5leHQ7CiB9OwogCiAjZGVmaW5lIEJQRl9DT01QTEVYSVRZX0xJTUlUX0lOU05TCTY1NTM2CkBAIC0yMDQsNiArMTQ1LDcgQEAKIHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSB7CiAJc3RydWN0IGJwZl9tYXAgKm1hcF9wdHI7CiAJYm9vbCByYXdfbW9kZTsKKwlib29sIHBrdF9hY2Nlc3M7CiAJaW50IHJlZ25vOwogCWludCBhY2Nlc3Nfc2l6ZTsKIH07CkBAIC0yNDAsNiArMTgyLDcgQEAKIAlbQ09OU1RfUFRSX1RPX01BUF0JPSAibWFwX3B0ciIsCiAJW1BUUl9UT19NQVBfVkFMVUVdCT0gIm1hcF92YWx1ZSIsCiAJW1BUUl9UT19NQVBfVkFMVUVfT1JfTlVMTF0gPSAibWFwX3ZhbHVlX29yX251bGwiLAorCVtQVFJfVE9fTUFQX1ZBTFVFX0FESl0JPSAibWFwX3ZhbHVlX2FkaiIsCiAJW0ZSQU1FX1BUUl0JCT0gImZwIiwKIAlbUFRSX1RPX1NUQUNLXQkJPSAiZnAiLAogCVtDT05TVF9JTU1dCQk9ICJpbW0iLApAQCAtMjQ3LDkgKzE5MCw5IEBACiAJW1BUUl9UT19QQUNLRVRfRU5EXQk9ICJwa3RfZW5kIiwKIH07CiAKLXN0YXRpYyB2b2lkIHByaW50X3ZlcmlmaWVyX3N0YXRlKHN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqc3RhdGUpCitzdGF0aWMgdm9pZCBwcmludF92ZXJpZmllcl9zdGF0ZShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpzdGF0ZSkKIHsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWc7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZzsKIAllbnVtIGJwZl9yZWdfdHlwZSB0OwogCWludCBpOwogCkBAIC0yNjcsMTAgKzIxMCwxNyBAQAogCQllbHNlIGlmICh0ID09IFVOS05PV05fVkFMVUUgJiYgcmVnLT5pbW0pCiAJCQl2ZXJib3NlKCIlbGxkIiwgcmVnLT5pbW0pOwogCQllbHNlIGlmICh0ID09IENPTlNUX1BUUl9UT19NQVAgfHwgdCA9PSBQVFJfVE9fTUFQX1ZBTFVFIHx8Ci0JCQkgdCA9PSBQVFJfVE9fTUFQX1ZBTFVFX09SX05VTEwpCisJCQkgdCA9PSBQVFJfVE9fTUFQX1ZBTFVFX09SX05VTEwgfHwKKwkJCSB0ID09IFBUUl9UT19NQVBfVkFMVUVfQURKKQogCQkJdmVyYm9zZSgiKGtzPSVkLHZzPSVkKSIsCiAJCQkJcmVnLT5tYXBfcHRyLT5rZXlfc2l6ZSwKIAkJCQlyZWctPm1hcF9wdHItPnZhbHVlX3NpemUpOworCQlpZiAocmVnLT5taW5fdmFsdWUgIT0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRSkKKwkJCXZlcmJvc2UoIixtaW5fdmFsdWU9JWxsdSIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZWctPm1pbl92YWx1ZSk7CisJCWlmIChyZWctPm1heF92YWx1ZSAhPSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFKQorCQkJdmVyYm9zZSgiLG1heF92YWx1ZT0lbGx1IiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlZy0+bWF4X3ZhbHVlKTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IE1BWF9CUEZfU1RBQ0s7IGkgKz0gQlBGX1JFR19TSVpFKSB7CiAJCWlmIChzdGF0ZS0+c3RhY2tfc2xvdF90eXBlW2ldID09IFNUQUNLX1NQSUxMKQpAQCAtNDI1LDkgKzM3NSw5IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHBvcF9zdGFjayhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIGludCAqcHJldl9pbnNuX2lkeCkKK3N0YXRpYyBpbnQgcG9wX3N0YWNrKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCAqcHJldl9pbnNuX2lkeCkKIHsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhY2tfZWxlbSAqZWxlbTsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YWNrX2VsZW0gKmVsZW07CiAJaW50IGluc25faWR4OwogCiAJaWYgKGVudi0+aGVhZCA9PSBOVUxMKQpAQCAtNDQ0LDEyICszOTQsMTIgQEAKIAlyZXR1cm4gaW5zbl9pZHg7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgKnB1c2hfc3RhY2soc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBpbnQgaW5zbl9pZHgsCi0JCQkJCSBpbnQgcHJldl9pbnNuX2lkeCkKK3N0YXRpYyBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpwdXNoX3N0YWNrKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCisJCQkJCSAgICAgaW50IGluc25faWR4LCBpbnQgcHJldl9pbnNuX2lkeCkKIHsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhY2tfZWxlbSAqZWxlbTsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YWNrX2VsZW0gKmVsZW07CiAKLQllbGVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZlcmlmaWVyX3N0YWNrX2VsZW0pLCBHRlBfS0VSTkVMKTsKKwllbGVtID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJwZl92ZXJpZmllcl9zdGFja19lbGVtKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbGVtKQogCQlnb3RvIGVycjsKIApAQCAtNDc1LDEzICs0MjUsMTUgQEAKIAlCUEZfUkVHXzAsIEJQRl9SRUdfMSwgQlBGX1JFR18yLCBCUEZfUkVHXzMsIEJQRl9SRUdfNCwgQlBGX1JFR181CiB9OwogCi1zdGF0aWMgdm9pZCBpbml0X3JlZ19zdGF0ZShzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzKQorc3RhdGljIHZvaWQgaW5pdF9yZWdfc3RhdGUoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JQRl9SRUc7IGkrKykgewogCQlyZWdzW2ldLnR5cGUgPSBOT1RfSU5JVDsKIAkJcmVnc1tpXS5pbW0gPSAwOworCQlyZWdzW2ldLm1pbl92YWx1ZSA9IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0U7CisJCXJlZ3NbaV0ubWF4X3ZhbHVlID0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRTsKIAl9CiAKIAkvKiBmcmFtZSBwb2ludGVyICovCkBAIC00OTEsMjAgKzQ0MywyNiBAQAogCXJlZ3NbQlBGX1JFR18xXS50eXBlID0gUFRSX1RPX0NUWDsKIH0KIAotc3RhdGljIHZvaWQgbWFya19yZWdfdW5rbm93bl92YWx1ZShzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzLCB1MzIgcmVnbm8pCitzdGF0aWMgdm9pZCBtYXJrX3JlZ191bmtub3duX3ZhbHVlKHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzLCB1MzIgcmVnbm8pCiB7CiAJQlVHX09OKHJlZ25vID49IE1BWF9CUEZfUkVHKTsKIAlyZWdzW3JlZ25vXS50eXBlID0gVU5LTk9XTl9WQUxVRTsKIAlyZWdzW3JlZ25vXS5pbW0gPSAwOwogfQogCitzdGF0aWMgdm9pZCByZXNldF9yZWdfcmFuZ2VfdmFsdWVzKHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzLCB1MzIgcmVnbm8pCit7CisJcmVnc1tyZWdub10ubWluX3ZhbHVlID0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRTsKKwlyZWdzW3JlZ25vXS5tYXhfdmFsdWUgPSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFOworfQorCiBlbnVtIHJlZ19hcmdfdHlwZSB7CiAJU1JDX09QLAkJLyogcmVnaXN0ZXIgaXMgdXNlZCBhcyBzb3VyY2Ugb3BlcmFuZCAqLwogCURTVF9PUCwJCS8qIHJlZ2lzdGVyIGlzIHVzZWQgYXMgZGVzdGluYXRpb24gb3BlcmFuZCAqLwogCURTVF9PUF9OT19NQVJLCS8qIHNhbWUgYXMgYWJvdmUsIGNoZWNrIG9ubHksIGRvbid0IG1hcmsgKi8KIH07CiAKLXN0YXRpYyBpbnQgY2hlY2tfcmVnX2FyZyhzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzLCB1MzIgcmVnbm8sCitzdGF0aWMgaW50IGNoZWNrX3JlZ19hcmcoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MsIHUzMiByZWdubywKIAkJCSBlbnVtIHJlZ19hcmdfdHlwZSB0KQogewogCWlmIChyZWdubyA+PSBNQVhfQlBGX1JFRykgewpAQCAtNTY0LDggKzUyMiw4IEBACiAvKiBjaGVja19zdGFja19yZWFkL3dyaXRlIGZ1bmN0aW9ucyB0cmFjayBzcGlsbC9maWxsIG9mIHJlZ2lzdGVycywKICAqIHN0YWNrIGJvdW5kYXJ5IGFuZCBhbGlnbm1lbnQgYXJlIGNoZWNrZWQgaW4gY2hlY2tfbWVtX2FjY2VzcygpCiAgKi8KLXN0YXRpYyBpbnQgY2hlY2tfc3RhY2tfd3JpdGUoc3RydWN0IHZlcmlmaWVyX3N0YXRlICpzdGF0ZSwgaW50IG9mZiwgaW50IHNpemUsCi0JCQkgICAgIGludCB2YWx1ZV9yZWdubykKK3N0YXRpYyBpbnQgY2hlY2tfc3RhY2tfd3JpdGUoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqc3RhdGUsIGludCBvZmYsCisJCQkgICAgIGludCBzaXplLCBpbnQgdmFsdWVfcmVnbm8pCiB7CiAJaW50IGk7CiAJLyogY2FsbGVyIGNoZWNrZWQgdGhhdCBvZmYgJSBzaXplID09IDAgYW5kIC1NQVhfQlBGX1NUQUNLIDw9IG9mZiA8IDAsCkBAIC01OTAsNyArNTQ4LDcgQEAKIAl9IGVsc2UgewogCQkvKiByZWd1bGFyIHdyaXRlIG9mIGRhdGEgaW50byBzdGFjayAqLwogCQlzdGF0ZS0+c3BpbGxlZF9yZWdzWyhNQVhfQlBGX1NUQUNLICsgb2ZmKSAvIEJQRl9SRUdfU0laRV0gPQotCQkJKHN0cnVjdCByZWdfc3RhdGUpIHt9OworCQkJKHN0cnVjdCBicGZfcmVnX3N0YXRlKSB7fTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogCQkJc3RhdGUtPnN0YWNrX3Nsb3RfdHlwZVtNQVhfQlBGX1NUQUNLICsgb2ZmICsgaV0gPSBTVEFDS19NSVNDOwpAQCAtNTk4LDcgKzU1Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfc3RhY2tfcmVhZChzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgKnN0YXRlLCBpbnQgb2ZmLCBpbnQgc2l6ZSwKK3N0YXRpYyBpbnQgY2hlY2tfc3RhY2tfcmVhZChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpzdGF0ZSwgaW50IG9mZiwgaW50IHNpemUsCiAJCQkgICAgaW50IHZhbHVlX3JlZ25vKQogewogCXU4ICpzbG90X3R5cGU7CkBAIC02MzksNyArNTk3LDcgQEAKIH0KIAogLyogY2hlY2sgcmVhZC93cml0ZSBpbnRvIG1hcCBlbGVtZW50IHJldHVybmVkIGJ5IGJwZl9tYXBfbG9va3VwX2VsZW0oKSAqLwotc3RhdGljIGludCBjaGVja19tYXBfYWNjZXNzKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgdTMyIHJlZ25vLCBpbnQgb2ZmLAorc3RhdGljIGludCBjaGVja19tYXBfYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiByZWdubywgaW50IG9mZiwKIAkJCSAgICBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gZW52LT5jdXJfc3RhdGUucmVnc1tyZWdub10ubWFwX3B0cjsKQEAgLTY1NCwyNCArNjEyLDMxIEBACiAKICNkZWZpbmUgTUFYX1BBQ0tFVF9PRkYgMHhmZmZmCiAKLXN0YXRpYyBib29sIG1heV93cml0ZV9wa3RfZGF0YShlbnVtIGJwZl9wcm9nX3R5cGUgdHlwZSkKK3N0YXRpYyBib29sIG1heV9hY2Nlc3NfZGlyZWN0X3BrdF9kYXRhKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBicGZfY2FsbF9hcmdfbWV0YSAqbWV0YSkKIHsKLQlzd2l0Y2ggKHR5cGUpIHsKKwlzd2l0Y2ggKGVudi0+cHJvZy0+dHlwZSkgeworCWNhc2UgQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFM6CisJY2FzZSBCUEZfUFJPR19UWVBFX1NDSEVEX0FDVDoKIAljYXNlIEJQRl9QUk9HX1RZUEVfWERQOgorCQlpZiAobWV0YSkKKwkJCXJldHVybiBtZXRhLT5wa3RfYWNjZXNzOworCisJCWVudi0+c2Vlbl9kaXJlY3Rfd3JpdGUgPSB0cnVlOwogCQlyZXR1cm4gdHJ1ZTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gZmFsc2U7CiAJfQogfQogCi1zdGF0aWMgaW50IGNoZWNrX3BhY2tldF9hY2Nlc3Moc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCB1MzIgcmVnbm8sIGludCBvZmYsCitzdGF0aWMgaW50IGNoZWNrX3BhY2tldF9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgdTMyIHJlZ25vLCBpbnQgb2ZmLAogCQkJICAgICAgIGludCBzaXplKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOwotCXN0cnVjdCByZWdfc3RhdGUgKnJlZyA9ICZyZWdzW3JlZ25vXTsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZyA9ICZyZWdzW3JlZ25vXTsKIAogCW9mZiArPSByZWctPm9mZjsKLQlpZiAob2ZmIDwgMCB8fCBvZmYgKyBzaXplID4gcmVnLT5yYW5nZSkgeworCWlmIChvZmYgPCAwIHx8IHNpemUgPD0gMCB8fCBvZmYgKyBzaXplID4gcmVnLT5yYW5nZSkgewogCQl2ZXJib3NlKCJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQsIG9mZj0lZCBzaXplPSVkLCBSJWQoaWQ9JWQsb2ZmPSVkLHI9JWQpXG4iLAogCQkJb2ZmLCBzaXplLCByZWdubywgcmVnLT5pZCwgcmVnLT5vZmYsIHJlZy0+cmFuZ2UpOwogCQlyZXR1cm4gLUVBQ0NFUzsKQEAgLTY4MCw5ICs2NDUsMTMgQEAKIH0KIAogLyogY2hlY2sgYWNjZXNzIHRvICdzdHJ1Y3QgYnBmX2NvbnRleHQnIGZpZWxkcyAqLwotc3RhdGljIGludCBjaGVja19jdHhfYWNjZXNzKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgaW50IG9mZiwgaW50IHNpemUsCitzdGF0aWMgaW50IGNoZWNrX2N0eF9hY2Nlc3Moc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IG9mZiwgaW50IHNpemUsCiAJCQkgICAgZW51bSBicGZfYWNjZXNzX3R5cGUgdCwgZW51bSBicGZfcmVnX3R5cGUgKnJlZ190eXBlKQogeworCS8qIGZvciBhbmFseXplciBjdHggYWNjZXNzZXMgYXJlIGFscmVhZHkgdmFsaWRhdGVkIGFuZCBjb252ZXJ0ZWQgKi8KKwlpZiAoZW52LT5hbmFseXplcl9vcHMpCisJCXJldHVybiAwOworCiAJaWYgKGVudi0+cHJvZy0+YXV4LT5vcHMtPmlzX3ZhbGlkX2FjY2VzcyAmJgogCSAgICBlbnYtPnByb2ctPmF1eC0+b3BzLT5pc192YWxpZF9hY2Nlc3Mob2ZmLCBzaXplLCB0LCByZWdfdHlwZSkpIHsKIAkJLyogcmVtZW1iZXIgdGhlIG9mZnNldCBvZiBsYXN0IGJ5dGUgYWNjZXNzZWQgaW4gY3R4ICovCkBAIC02OTUsNyArNjY0LDcgQEAKIAlyZXR1cm4gLUVBQ0NFUzsKIH0KIAotc3RhdGljIGJvb2wgaXNfcG9pbnRlcl92YWx1ZShzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIGludCByZWdubykKK3N0YXRpYyBib29sIGlzX3BvaW50ZXJfdmFsdWUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IHJlZ25vKQogewogCWlmIChlbnYtPmFsbG93X3B0cl9sZWFrcykKIAkJcmV0dXJuIGZhbHNlOwpAQCAtNzA5LDI4ICs2NzgsMTkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfcHRyX2FsaWdubWVudChzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCByZWdfc3RhdGUgKnJlZywKLQkJCSAgICAgICBpbnQgb2ZmLCBpbnQgc2l6ZSkKK3N0YXRpYyBpbnQgY2hlY2tfcHRyX2FsaWdubWVudChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAorCQkJICAgICAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWcsIGludCBvZmYsIGludCBzaXplKQogewotCWlmIChyZWctPnR5cGUgIT0gUFRSX1RPX1BBQ0tFVCkgeworCWlmIChyZWctPnR5cGUgIT0gUFRSX1RPX1BBQ0tFVCAmJiByZWctPnR5cGUgIT0gUFRSX1RPX01BUF9WQUxVRV9BREopIHsKIAkJaWYgKG9mZiAlIHNpemUgIT0gMCkgewotCQkJdmVyYm9zZSgibWlzYWxpZ25lZCBhY2Nlc3Mgb2ZmICVkIHNpemUgJWRcbiIsIG9mZiwgc2l6ZSk7CisJCQl2ZXJib3NlKCJtaXNhbGlnbmVkIGFjY2VzcyBvZmYgJWQgc2l6ZSAlZFxuIiwKKwkJCQlvZmYsIHNpemUpOwogCQkJcmV0dXJuIC1FQUNDRVM7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAotCXN3aXRjaCAoZW52LT5wcm9nLT50eXBlKSB7Ci0JY2FzZSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUzoKLQljYXNlIEJQRl9QUk9HX1RZUEVfU0NIRURfQUNUOgotCWNhc2UgQlBGX1BST0dfVFlQRV9YRFA6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXZlcmJvc2UoInZlcmlmaWVyIGlzIG1pc2NvbmZpZ3VyZWRcbiIpOwotCQlyZXR1cm4gLUVBQ0NFUzsKLQl9Ci0KIAlpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUykpCiAJCS8qIG1pc2FsaWduZWQgYWNjZXNzIHRvIHBhY2tldCBpcyBvayBvbiB4ODYsYXJtLGFybTY0ICovCiAJCXJldHVybiAwOwpAQCAtNzQxLDcgKzcwMSw4IEBACiAJfQogCiAJLyogc2tiLT5kYXRhIGlzIE5FVF9JUF9BTElHTi1lZCAqLwotCWlmICgoTkVUX0lQX0FMSUdOICsgcmVnLT5vZmYgKyBvZmYpICUgc2l6ZSAhPSAwKSB7CisJaWYgKHJlZy0+dHlwZSA9PSBQVFJfVE9fUEFDS0VUICYmCisJICAgIChORVRfSVBfQUxJR04gKyByZWctPm9mZiArIG9mZikgJSBzaXplICE9IDApIHsKIAkJdmVyYm9zZSgibWlzYWxpZ25lZCBwYWNrZXQgYWNjZXNzIG9mZiAlZCslZCslZCBzaXplICVkXG4iLAogCQkJTkVUX0lQX0FMSUdOLCByZWctPm9mZiwgb2ZmLCBzaXplKTsKIAkJcmV0dXJuIC1FQUNDRVM7CkBAIC03NTUsMTIgKzcxNiwxMiBAQAogICogaWYgdD09d3JpdGUgJiYgdmFsdWVfcmVnbm89PS0xLCBzb21lIHVua25vd24gdmFsdWUgaXMgc3RvcmVkIGludG8gbWVtb3J5CiAgKiBpZiB0PT1yZWFkICYmIHZhbHVlX3JlZ25vPT0tMSwgZG9uJ3QgY2FyZSB3aGF0IHdlIHJlYWQgZnJvbSBtZW1vcnkKICAqLwotc3RhdGljIGludCBjaGVja19tZW1fYWNjZXNzKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgdTMyIHJlZ25vLCBpbnQgb2ZmLAorc3RhdGljIGludCBjaGVja19tZW1fYWNjZXNzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHUzMiByZWdubywgaW50IG9mZiwKIAkJCSAgICBpbnQgYnBmX3NpemUsIGVudW0gYnBmX2FjY2Vzc190eXBlIHQsCiAJCQkgICAgaW50IHZhbHVlX3JlZ25vKQogewotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVnID0gJnN0YXRlLT5yZWdzW3JlZ25vXTsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVnID0gJnN0YXRlLT5yZWdzW3JlZ25vXTsKIAlpbnQgc2l6ZSwgZXJyID0gMDsKIAogCWlmIChyZWctPnR5cGUgPT0gUFRSX1RPX1NUQUNLKQpAQCAtNzc0LDEyICs3MzUsNTIgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKHJlZy0+dHlwZSA9PSBQVFJfVE9fTUFQX1ZBTFVFKSB7CisJaWYgKHJlZy0+dHlwZSA9PSBQVFJfVE9fTUFQX1ZBTFVFIHx8CisJICAgIHJlZy0+dHlwZSA9PSBQVFJfVE9fTUFQX1ZBTFVFX0FESikgewogCQlpZiAodCA9PSBCUEZfV1JJVEUgJiYgdmFsdWVfcmVnbm8gPj0gMCAmJgogCQkgICAgaXNfcG9pbnRlcl92YWx1ZShlbnYsIHZhbHVlX3JlZ25vKSkgewogCQkJdmVyYm9zZSgiUiVkIGxlYWtzIGFkZHIgaW50byBtYXBcbiIsIHZhbHVlX3JlZ25vKTsKIAkJCXJldHVybiAtRUFDQ0VTOwogCQl9CisKKwkJLyogSWYgd2UgYWRqdXN0ZWQgdGhlIHJlZ2lzdGVyIHRvIHRoaXMgbWFwIHZhbHVlIGF0IGFsbCB0aGVuIHdlCisJCSAqIG5lZWQgdG8gY2hhbmdlIG9mZiBhbmQgc2l6ZSB0byBtaW5fdmFsdWUgYW5kIG1heF92YWx1ZQorCQkgKiByZXNwZWN0aXZlbHkgdG8gbWFrZSBzdXJlIG91ciB0aGVvcmV0aWNhbCBhY2Nlc3Mgd2lsbCBiZQorCQkgKiBzYWZlLgorCQkgKi8KKwkJaWYgKHJlZy0+dHlwZSA9PSBQVFJfVE9fTUFQX1ZBTFVFX0FESikgeworCQkJaWYgKGxvZ19sZXZlbCkKKwkJCQlwcmludF92ZXJpZmllcl9zdGF0ZShzdGF0ZSk7CisJCQllbnYtPnZhcmxlbl9tYXBfdmFsdWVfYWNjZXNzID0gdHJ1ZTsKKwkJCS8qIFRoZSBtaW5pbXVtIHZhbHVlIGlzIG9ubHkgaW1wb3J0YW50IHdpdGggc2lnbmVkCisJCQkgKiBjb21wYXJpc29ucyB3aGVyZSB3ZSBjYW4ndCBhc3N1bWUgdGhlIGZsb29yIG9mIGEKKwkJCSAqIHZhbHVlIGlzIDAuICBJZiB3ZSBhcmUgdXNpbmcgc2lnbmVkIHZhcmlhYmxlcyBmb3Igb3VyCisJCQkgKiBpbmRleCdlcyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdoYXRldmVyIHdlIHVzZQorCQkJICogd2lsbCBoYXZlIGEgc2V0IGZsb29yIHdpdGhpbiBvdXIgcmFuZ2UuCisJCQkgKi8KKwkJCWlmICgoczY0KXJlZy0+bWluX3ZhbHVlIDwgMCkgeworCQkJCXZlcmJvc2UoIlIlZCBtaW4gdmFsdWUgaXMgbmVnYXRpdmUsIGVpdGhlciB1c2UgdW5zaWduZWQgaW5kZXggb3IgZG8gYSBpZiAoaW5kZXggPj0wKSBjaGVjay5cbiIsCisJCQkJCXJlZ25vKTsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCX0KKwkJCWVyciA9IGNoZWNrX21hcF9hY2Nlc3MoZW52LCByZWdubywgcmVnLT5taW5fdmFsdWUgKyBvZmYsCisJCQkJCSAgICAgICBzaXplKTsKKwkJCWlmIChlcnIpIHsKKwkJCQl2ZXJib3NlKCJSJWQgbWluIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhlIGFycmF5IHJhbmdlXG4iLAorCQkJCQlyZWdubyk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKworCQkJLyogSWYgd2UgaGF2ZW4ndCBzZXQgYSBtYXggdmFsdWUgdGhlbiB3ZSBuZWVkIHRvIGJhaWwKKwkJCSAqIHNpbmNlIHdlIGNhbid0IGJlIHN1cmUgd2Ugd29uJ3QgZG8gYmFkIHRoaW5ncy4KKwkJCSAqLworCQkJaWYgKHJlZy0+bWF4X3ZhbHVlID09IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UpIHsKKwkJCQl2ZXJib3NlKCJSJWQgdW5ib3VuZGVkIG1lbW9yeSBhY2Nlc3MsIG1ha2Ugc3VyZSB0byBib3VuZHMgY2hlY2sgYW55IGFycmF5IGFjY2VzcyBpbnRvIGEgbWFwXG4iLAorCQkJCQlyZWdubyk7CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQl9CisJCQlvZmYgKz0gcmVnLT5tYXhfdmFsdWU7CisJCX0KIAkJZXJyID0gY2hlY2tfbWFwX2FjY2VzcyhlbnYsIHJlZ25vLCBvZmYsIHNpemUpOwogCQlpZiAoIWVyciAmJiB0ID09IEJQRl9SRUFEICYmIHZhbHVlX3JlZ25vID49IDApCiAJCQltYXJrX3JlZ191bmtub3duX3ZhbHVlKHN0YXRlLT5yZWdzLCB2YWx1ZV9yZWdubyk7CkBAIC03OTUsOSArNzk2LDggQEAKIAkJZXJyID0gY2hlY2tfY3R4X2FjY2VzcyhlbnYsIG9mZiwgc2l6ZSwgdCwgJnJlZ190eXBlKTsKIAkJaWYgKCFlcnIgJiYgdCA9PSBCUEZfUkVBRCAmJiB2YWx1ZV9yZWdubyA+PSAwKSB7CiAJCQltYXJrX3JlZ191bmtub3duX3ZhbHVlKHN0YXRlLT5yZWdzLCB2YWx1ZV9yZWdubyk7Ci0JCQlpZiAoZW52LT5hbGxvd19wdHJfbGVha3MpCi0JCQkJLyogbm90ZSB0aGF0IHJlZy5baWR8b2ZmfHJhbmdlXSA9PSAwICovCi0JCQkJc3RhdGUtPnJlZ3NbdmFsdWVfcmVnbm9dLnR5cGUgPSByZWdfdHlwZTsKKwkJCS8qIG5vdGUgdGhhdCByZWcuW2lkfG9mZnxyYW5nZV0gPT0gMCAqLworCQkJc3RhdGUtPnJlZ3NbdmFsdWVfcmVnbm9dLnR5cGUgPSByZWdfdHlwZTsKIAkJfQogCiAJfSBlbHNlIGlmIChyZWctPnR5cGUgPT0gRlJBTUVfUFRSIHx8IHJlZy0+dHlwZSA9PSBQVFJfVE9fU1RBQ0spIHsKQEAgLTgxNyw3ICs4MTcsNyBAQAogCQkJZXJyID0gY2hlY2tfc3RhY2tfcmVhZChzdGF0ZSwgb2ZmLCBzaXplLCB2YWx1ZV9yZWdubyk7CiAJCX0KIAl9IGVsc2UgaWYgKHN0YXRlLT5yZWdzW3JlZ25vXS50eXBlID09IFBUUl9UT19QQUNLRVQpIHsKLQkJaWYgKHQgPT0gQlBGX1dSSVRFICYmICFtYXlfd3JpdGVfcGt0X2RhdGEoZW52LT5wcm9nLT50eXBlKSkgeworCQlpZiAodCA9PSBCUEZfV1JJVEUgJiYgIW1heV9hY2Nlc3NfZGlyZWN0X3BrdF9kYXRhKGVudiwgTlVMTCkpIHsKIAkJCXZlcmJvc2UoImNhbm5vdCB3cml0ZSBpbnRvIHBhY2tldFxuIik7CiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJfQpAQCAtODQ2LDkgKzg0Niw5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBjaGVja194YWRkKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQorc3RhdGljIGludCBjaGVja194YWRkKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbikKIHsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVnczsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7CiAJaW50IGVycjsKIAogCWlmICgoQlBGX1NJWkUoaW5zbi0+Y29kZSkgIT0gQlBGX1cgJiYgQlBGX1NJWkUoaW5zbi0+Y29kZSkgIT0gQlBGX0RXKSB8fApAQCAtODgyLDEyICs4ODIsMTIgQEAKICAqIGJ5dGVzIGZyb20gdGhhdCBwb2ludGVyLCBtYWtlIHN1cmUgdGhhdCBpdCdzIHdpdGhpbiBzdGFjayBib3VuZGFyeQogICogYW5kIGFsbCBlbGVtZW50cyBvZiBzdGFjayBhcmUgaW5pdGlhbGl6ZWQKICAqLwotc3RhdGljIGludCBjaGVja19zdGFja19ib3VuZGFyeShzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIGludCByZWdubywKK3N0YXRpYyBpbnQgY2hlY2tfc3RhY2tfYm91bmRhcnkoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IHJlZ25vLAogCQkJCWludCBhY2Nlc3Nfc2l6ZSwgYm9vbCB6ZXJvX3NpemVfYWxsb3dlZCwKIAkJCQlzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEpCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBzdGF0ZS0+cmVnczsKIAlpbnQgb2ZmLCBpOwogCiAJaWYgKHJlZ3NbcmVnbm9dLnR5cGUgIT0gUFRSX1RPX1NUQUNLKSB7CkBAIC05MjYsMTggKzkyNiwxOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNoZWNrX2Z1bmNfYXJnKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgdTMyIHJlZ25vLAorc3RhdGljIGludCBjaGVja19mdW5jX2FyZyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCB1MzIgcmVnbm8sCiAJCQkgIGVudW0gYnBmX2FyZ190eXBlIGFyZ190eXBlLAogCQkJICBzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgKm1ldGEpCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVnID0gZW52LT5jdXJfc3RhdGUucmVncyArIHJlZ25vOwotCWVudW0gYnBmX3JlZ190eXBlIGV4cGVjdGVkX3R5cGU7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzLCAqcmVnID0gJnJlZ3NbcmVnbm9dOworCWVudW0gYnBmX3JlZ190eXBlIGV4cGVjdGVkX3R5cGUsIHR5cGUgPSByZWctPnR5cGU7CiAJaW50IGVyciA9IDA7CiAKIAlpZiAoYXJnX3R5cGUgPT0gQVJHX0RPTlRDQVJFKQogCQlyZXR1cm4gMDsKIAotCWlmIChyZWctPnR5cGUgPT0gTk9UX0lOSVQpIHsKKwlpZiAodHlwZSA9PSBOT1RfSU5JVCkgewogCQl2ZXJib3NlKCJSJWQgIXJlYWRfb2tcbiIsIHJlZ25vKTsKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQpAQCAtOTUwLDE2ICs5NTAsMjkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJaWYgKHR5cGUgPT0gUFRSX1RPX1BBQ0tFVCAmJiAhbWF5X2FjY2Vzc19kaXJlY3RfcGt0X2RhdGEoZW52LCBtZXRhKSkgeworCQl2ZXJib3NlKCJoZWxwZXIgYWNjZXNzIHRvIHRoZSBwYWNrZXQgaXMgbm90IGFsbG93ZWRcbiIpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKIAlpZiAoYXJnX3R5cGUgPT0gQVJHX1BUUl9UT19NQVBfS0VZIHx8CiAJICAgIGFyZ190eXBlID09IEFSR19QVFJfVE9fTUFQX1ZBTFVFKSB7CiAJCWV4cGVjdGVkX3R5cGUgPSBQVFJfVE9fU1RBQ0s7CisJCWlmICh0eXBlICE9IFBUUl9UT19QQUNLRVQgJiYgdHlwZSAhPSBleHBlY3RlZF90eXBlKQorCQkJZ290byBlcnJfdHlwZTsKIAl9IGVsc2UgaWYgKGFyZ190eXBlID09IEFSR19DT05TVF9TVEFDS19TSVpFIHx8CiAJCSAgIGFyZ190eXBlID09IEFSR19DT05TVF9TVEFDS19TSVpFX09SX1pFUk8pIHsKIAkJZXhwZWN0ZWRfdHlwZSA9IENPTlNUX0lNTTsKKwkJaWYgKHR5cGUgIT0gZXhwZWN0ZWRfdHlwZSkKKwkJCWdvdG8gZXJyX3R5cGU7CiAJfSBlbHNlIGlmIChhcmdfdHlwZSA9PSBBUkdfQ09OU1RfTUFQX1BUUikgewogCQlleHBlY3RlZF90eXBlID0gQ09OU1RfUFRSX1RPX01BUDsKKwkJaWYgKHR5cGUgIT0gZXhwZWN0ZWRfdHlwZSkKKwkJCWdvdG8gZXJyX3R5cGU7CiAJfSBlbHNlIGlmIChhcmdfdHlwZSA9PSBBUkdfUFRSX1RPX0NUWCkgewogCQlleHBlY3RlZF90eXBlID0gUFRSX1RPX0NUWDsKKwkJaWYgKHR5cGUgIT0gZXhwZWN0ZWRfdHlwZSkKKwkJCWdvdG8gZXJyX3R5cGU7CiAJfSBlbHNlIGlmIChhcmdfdHlwZSA9PSBBUkdfUFRSX1RPX1NUQUNLIHx8CiAJCSAgIGFyZ190eXBlID09IEFSR19QVFJfVE9fUkFXX1NUQUNLKSB7CiAJCWV4cGVjdGVkX3R5cGUgPSBQVFJfVE9fU1RBQ0s7CkBAIC05NjcsMjAgKzk4MCwxNiBAQAogCQkgKiBwYXNzZWQgaW4gYXMgYXJndW1lbnQsIGl0J3MgYSBDT05TVF9JTU0gdHlwZS4gRmluYWwgdGVzdAogCQkgKiBoYXBwZW5zIGR1cmluZyBzdGFjayBib3VuZGFyeSBjaGVja2luZy4KIAkJICovCi0JCWlmIChyZWctPnR5cGUgPT0gQ09OU1RfSU1NICYmIHJlZy0+aW1tID09IDApCi0JCQlleHBlY3RlZF90eXBlID0gQ09OU1RfSU1NOworCQlpZiAodHlwZSA9PSBDT05TVF9JTU0gJiYgcmVnLT5pbW0gPT0gMCkKKwkJCS8qIGZpbmFsIHRlc3QgaW4gY2hlY2tfc3RhY2tfYm91bmRhcnkoKSAqLzsKKwkJZWxzZSBpZiAodHlwZSAhPSBQVFJfVE9fUEFDS0VUICYmIHR5cGUgIT0gZXhwZWN0ZWRfdHlwZSkKKwkJCWdvdG8gZXJyX3R5cGU7CiAJCW1ldGEtPnJhd19tb2RlID0gYXJnX3R5cGUgPT0gQVJHX1BUUl9UT19SQVdfU1RBQ0s7CiAJfSBlbHNlIHsKIAkJdmVyYm9zZSgidW5zdXBwb3J0ZWQgYXJnX3R5cGUgJWRcbiIsIGFyZ190eXBlKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JaWYgKHJlZy0+dHlwZSAhPSBleHBlY3RlZF90eXBlKSB7Ci0JCXZlcmJvc2UoIlIlZCB0eXBlPSVzIGV4cGVjdGVkPSVzXG4iLCByZWdubywKLQkJCXJlZ190eXBlX3N0cltyZWctPnR5cGVdLCByZWdfdHlwZV9zdHJbZXhwZWN0ZWRfdHlwZV0pOwotCQlyZXR1cm4gLUVBQ0NFUzsKLQl9Ci0KIAlpZiAoYXJnX3R5cGUgPT0gQVJHX0NPTlNUX01BUF9QVFIpIHsKIAkJLyogYnBmX21hcF94eHgobWFwX3B0cikgY2FsbDogcmVtZW1iZXIgdGhhdCBtYXBfcHRyICovCiAJCW1ldGEtPm1hcF9wdHIgPSByZWctPm1hcF9wdHI7CkBAIC05OTgsOCArMTAwNywxMyBAQAogCQkJdmVyYm9zZSgiaW52YWxpZCBtYXBfcHRyIHRvIGFjY2VzcyBtYXAtPmtleVxuIik7CiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJfQotCQllcnIgPSBjaGVja19zdGFja19ib3VuZGFyeShlbnYsIHJlZ25vLCBtZXRhLT5tYXBfcHRyLT5rZXlfc2l6ZSwKLQkJCQkJICAgZmFsc2UsIE5VTEwpOworCQlpZiAodHlwZSA9PSBQVFJfVE9fUEFDS0VUKQorCQkJZXJyID0gY2hlY2tfcGFja2V0X2FjY2VzcyhlbnYsIHJlZ25vLCAwLAorCQkJCQkJICBtZXRhLT5tYXBfcHRyLT5rZXlfc2l6ZSk7CisJCWVsc2UKKwkJCWVyciA9IGNoZWNrX3N0YWNrX2JvdW5kYXJ5KGVudiwgcmVnbm8sCisJCQkJCQkgICBtZXRhLT5tYXBfcHRyLT5rZXlfc2l6ZSwKKwkJCQkJCSAgIGZhbHNlLCBOVUxMKTsKIAl9IGVsc2UgaWYgKGFyZ190eXBlID09IEFSR19QVFJfVE9fTUFQX1ZBTFVFKSB7CiAJCS8qIGJwZl9tYXBfeHh4KC4uLiwgbWFwX3B0ciwgLi4uLCB2YWx1ZSkgY2FsbDoKIAkJICogY2hlY2sgW3ZhbHVlLCB2YWx1ZSArIG1hcC0+dmFsdWVfc2l6ZSkgdmFsaWRpdHkKQEAgLTEwMDksOSArMTAyMywxMyBAQAogCQkJdmVyYm9zZSgiaW52YWxpZCBtYXBfcHRyIHRvIGFjY2VzcyBtYXAtPnZhbHVlXG4iKTsKIAkJCXJldHVybiAtRUFDQ0VTOwogCQl9Ci0JCWVyciA9IGNoZWNrX3N0YWNrX2JvdW5kYXJ5KGVudiwgcmVnbm8sCi0JCQkJCSAgIG1ldGEtPm1hcF9wdHItPnZhbHVlX3NpemUsCi0JCQkJCSAgIGZhbHNlLCBOVUxMKTsKKwkJaWYgKHR5cGUgPT0gUFRSX1RPX1BBQ0tFVCkKKwkJCWVyciA9IGNoZWNrX3BhY2tldF9hY2Nlc3MoZW52LCByZWdubywgMCwKKwkJCQkJCSAgbWV0YS0+bWFwX3B0ci0+dmFsdWVfc2l6ZSk7CisJCWVsc2UKKwkJCWVyciA9IGNoZWNrX3N0YWNrX2JvdW5kYXJ5KGVudiwgcmVnbm8sCisJCQkJCQkgICBtZXRhLT5tYXBfcHRyLT52YWx1ZV9zaXplLAorCQkJCQkJICAgZmFsc2UsIE5VTEwpOwogCX0gZWxzZSBpZiAoYXJnX3R5cGUgPT0gQVJHX0NPTlNUX1NUQUNLX1NJWkUgfHwKIAkJICAgYXJnX3R5cGUgPT0gQVJHX0NPTlNUX1NUQUNLX1NJWkVfT1JfWkVSTykgewogCQlib29sIHplcm9fc2l6ZV9hbGxvd2VkID0gKGFyZ190eXBlID09IEFSR19DT05TVF9TVEFDS19TSVpFX09SX1pFUk8pOwpAQCAtMTAyNSwxMSArMTA0MywxOCBAQAogCQkJdmVyYm9zZSgiQVJHX0NPTlNUX1NUQUNLX1NJWkUgY2Fubm90IGJlIGZpcnN0IGFyZ3VtZW50XG4iKTsKIAkJCXJldHVybiAtRUFDQ0VTOwogCQl9Ci0JCWVyciA9IGNoZWNrX3N0YWNrX2JvdW5kYXJ5KGVudiwgcmVnbm8gLSAxLCByZWctPmltbSwKLQkJCQkJICAgemVyb19zaXplX2FsbG93ZWQsIG1ldGEpOworCQlpZiAocmVnc1tyZWdubyAtIDFdLnR5cGUgPT0gUFRSX1RPX1BBQ0tFVCkKKwkJCWVyciA9IGNoZWNrX3BhY2tldF9hY2Nlc3MoZW52LCByZWdubyAtIDEsIDAsIHJlZy0+aW1tKTsKKwkJZWxzZQorCQkJZXJyID0gY2hlY2tfc3RhY2tfYm91bmRhcnkoZW52LCByZWdubyAtIDEsIHJlZy0+aW1tLAorCQkJCQkJICAgemVyb19zaXplX2FsbG93ZWQsIG1ldGEpOwogCX0KIAogCXJldHVybiBlcnI7CitlcnJfdHlwZToKKwl2ZXJib3NlKCJSJWQgdHlwZT0lcyBleHBlY3RlZD0lc1xuIiwgcmVnbm8sCisJCXJlZ190eXBlX3N0clt0eXBlXSwgcmVnX3R5cGVfc3RyW2V4cGVjdGVkX3R5cGVdKTsKKwlyZXR1cm4gLUVBQ0NFUzsKIH0KIAogc3RhdGljIGludCBjaGVja19tYXBfZnVuY19jb21wYXRpYmlsaXR5KHN0cnVjdCBicGZfbWFwICptYXAsIGludCBmdW5jX2lkKQpAQCAtMTA1Myw3ICsxMDc4LDggQEAKIAkJCWdvdG8gZXJyb3I7CiAJCWJyZWFrOwogCWNhc2UgQlBGX01BUF9UWVBFX0NHUk9VUF9BUlJBWToKLQkJaWYgKGZ1bmNfaWQgIT0gQlBGX0ZVTkNfc2tiX3VuZGVyX2Nncm91cCkKKwkJaWYgKGZ1bmNfaWQgIT0gQlBGX0ZVTkNfc2tiX3VuZGVyX2Nncm91cCAmJgorCQkgICAgZnVuY19pZCAhPSBCUEZfRlVOQ19jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwKQogCQkJZ290byBlcnJvcjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTEwNzUsNiArMTEwMSw3IEBACiAJCWlmIChtYXAtPm1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9TVEFDS19UUkFDRSkKIAkJCWdvdG8gZXJyb3I7CiAJCWJyZWFrOworCWNhc2UgQlBGX0ZVTkNfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cDoKIAljYXNlIEJQRl9GVU5DX3NrYl91bmRlcl9jZ3JvdXA6CiAJCWlmIChtYXAtPm1hcF90eXBlICE9IEJQRl9NQVBfVFlQRV9DR1JPVVBfQVJSQVkpCiAJCQlnb3RvIGVycm9yOwpAQCAtMTEwOCwxMCArMTEzNSwxMCBAQAogCXJldHVybiBjb3VudCA+IDEgPyAtRUlOVkFMIDogMDsKIH0KIAotc3RhdGljIHZvaWQgY2xlYXJfYWxsX3BrdF9wb2ludGVycyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYpCitzdGF0aWMgdm9pZCBjbGVhcl9hbGxfcGt0X3BvaW50ZXJzKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3MsICpyZWc7CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBzdGF0ZS0+cmVncywgKnJlZzsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfQlBGX1JFRzsgaSsrKQpAQCAtMTEzMSwxMiArMTE1OCwxMiBAQAogCX0KIH0KIAotc3RhdGljIGludCBjaGVja19jYWxsKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgaW50IGZ1bmNfaWQpCitzdGF0aWMgaW50IGNoZWNrX2NhbGwoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgaW50IGZ1bmNfaWQpCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKIAljb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gKmZuID0gTlVMTDsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3M7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVnOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZzsKIAlzdHJ1Y3QgYnBmX2NhbGxfYXJnX21ldGEgbWV0YTsKIAlib29sIGNoYW5nZXNfZGF0YTsKIAlpbnQgaSwgZXJyOwpAQCAtMTE2NCw2ICsxMTkxLDcgQEAKIAljaGFuZ2VzX2RhdGEgPSBicGZfaGVscGVyX2NoYW5nZXNfc2tiX2RhdGEoZm4tPmZ1bmMpOwogCiAJbWVtc2V0KCZtZXRhLCAwLCBzaXplb2YobWV0YSkpOworCW1ldGEucGt0X2FjY2VzcyA9IGZuLT5wa3RfYWNjZXNzOwogCiAJLyogV2Ugb25seSBzdXBwb3J0IG9uZSBhcmcgYmVpbmcgaW4gcmF3IG1vZGUgYXQgdGhlIG1vbWVudCwgd2hpY2gKIAkgKiBpcyBzdWZmaWNpZW50IGZvciB0aGUgaGVscGVyIGZ1bmN0aW9ucyB3ZSBoYXZlIHJpZ2h0IG5vdy4KQEAgLTEyMTQsNiArMTI0Miw3IEBACiAJCXJlZ3NbQlBGX1JFR18wXS50eXBlID0gTk9UX0lOSVQ7CiAJfSBlbHNlIGlmIChmbi0+cmV0X3R5cGUgPT0gUkVUX1BUUl9UT19NQVBfVkFMVUVfT1JfTlVMTCkgewogCQlyZWdzW0JQRl9SRUdfMF0udHlwZSA9IFBUUl9UT19NQVBfVkFMVUVfT1JfTlVMTDsKKwkJcmVnc1tCUEZfUkVHXzBdLm1heF92YWx1ZSA9IHJlZ3NbQlBGX1JFR18wXS5taW5fdmFsdWUgPSAwOwogCQkvKiByZW1lbWJlciBtYXBfcHRyLCBzbyB0aGF0IGNoZWNrX21hcF9hY2Nlc3MoKQogCQkgKiBjYW4gY2hlY2sgJ3ZhbHVlX3NpemUnIGJvdW5kYXJ5IG9mIG1lbW9yeSBhY2Nlc3MKIAkJICogdG8gbWFwIGVsZW1lbnQgcmV0dXJuZWQgZnJvbSBicGZfbWFwX2xvb2t1cF9lbGVtKCkKQEAgLTEyMzgsMTIgKzEyNjcsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjaGVja19wYWNrZXRfcHRyX2FkZChzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsIHN0cnVjdCBicGZfaW5zbiAqaW5zbikKK3N0YXRpYyBpbnQgY2hlY2tfcGFja2V0X3B0cl9hZGQoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwKKwkJCQlzdHJ1Y3QgYnBmX2luc24gKmluc24pCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqZHN0X3JlZyA9ICZyZWdzW2luc24tPmRzdF9yZWddOwotCXN0cnVjdCByZWdfc3RhdGUgKnNyY19yZWcgPSAmcmVnc1tpbnNuLT5zcmNfcmVnXTsKLQlzdHJ1Y3QgcmVnX3N0YXRlIHRtcF9yZWc7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpkc3RfcmVnID0gJnJlZ3NbaW5zbi0+ZHN0X3JlZ107CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyY19yZWcgPSAmcmVnc1tpbnNuLT5zcmNfcmVnXTsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSB0bXBfcmVnOwogCXMzMiBpbW07CiAKIAlpZiAoQlBGX1NSQyhpbnNuLT5jb2RlKSA9PSBCUEZfSykgewpAQCAtMTMxMSwxMCArMTM0MSwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGV2YWx1YXRlX3JlZ19hbHUoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgaW50IGV2YWx1YXRlX3JlZ19hbHUoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudiwgc3RydWN0IGJwZl9pbnNuICppbnNuKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOwotCXN0cnVjdCByZWdfc3RhdGUgKmRzdF9yZWcgPSAmcmVnc1tpbnNuLT5kc3RfcmVnXTsKKwlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKmRzdF9yZWcgPSAmcmVnc1tpbnNuLT5kc3RfcmVnXTsKIAl1OCBvcGNvZGUgPSBCUEZfT1AoaW5zbi0+Y29kZSk7CiAJczY0IGltbV9sb2cyOwogCkBAIC0xMzI0LDcgKzEzNTQsNyBAQAogCSAqLwogCiAJaWYgKEJQRl9TUkMoaW5zbi0+Y29kZSkgPT0gQlBGX1gpIHsKLQkJc3RydWN0IHJlZ19zdGF0ZSAqc3JjX3JlZyA9ICZyZWdzW2luc24tPnNyY19yZWddOworCQlzdHJ1Y3QgYnBmX3JlZ19zdGF0ZSAqc3JjX3JlZyA9ICZyZWdzW2luc24tPnNyY19yZWddOwogCiAJCWlmIChzcmNfcmVnLT50eXBlID09IFVOS05PV05fVkFMVUUgJiYgc3JjX3JlZy0+aW1tID4gMCAmJgogCQkgICAgZHN0X3JlZy0+aW1tICYmIG9wY29kZSA9PSBCUEZfQUREKSB7CkBAIC0xNDEzLDExICsxNDQzLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXZhbHVhdGVfcmVnX2ltbV9hbHUoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgaW50IGV2YWx1YXRlX3JlZ19pbW1fYWx1KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCisJCQkJc3RydWN0IGJwZl9pbnNuICppbnNuKQogewotCXN0cnVjdCByZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOwotCXN0cnVjdCByZWdfc3RhdGUgKmRzdF9yZWcgPSAmcmVnc1tpbnNuLT5kc3RfcmVnXTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpzcmNfcmVnID0gJnJlZ3NbaW5zbi0+c3JjX3JlZ107CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpkc3RfcmVnID0gJnJlZ3NbaW5zbi0+ZHN0X3JlZ107CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnNyY19yZWcgPSAmcmVnc1tpbnNuLT5zcmNfcmVnXTsKIAl1OCBvcGNvZGUgPSBCUEZfT1AoaW5zbi0+Y29kZSk7CiAKIAkvKiBkc3RfcmVnLT50eXBlID09IENPTlNUX0lNTSBoZXJlLCBzaW11bGF0ZSBleGVjdXRpb24gb2YgJ2FkZCcgaW5zbi4KQEAgLTE0MzMsMTAgKzE0NjQsMTEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIGNoZWNrIHZhbGlkaXR5IG9mIDMyLWJpdCBhbmQgNjQtYml0IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAqLwotc3RhdGljIGludCBjaGVja19hbHVfb3Aoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgdm9pZCBjaGVja19yZWdfb3ZlcmZsb3coc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZykKIHsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gZW52LT5jdXJfc3RhdGUucmVncywgKmRzdF9yZWc7CisJaWYgKHJlZy0+bWF4X3ZhbHVlID4gQlBGX1JFR0lTVEVSX01BWF9SQU5HRSkKKwkJcmVnLT5tYXhfdmFsdWUgPSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFOworCWlmICgoczY0KXJlZy0+bWluX3ZhbHVlIDwgQlBGX1JFR0lTVEVSX01JTl9SQU5HRSkKKwkJcmVnLT5taW5fdmFsdWUgPSBCUEZfUkVHSVNURVJfTUlOX1JBTkdFOworfQorCitzdGF0aWMgdm9pZCBhZGp1c3RfcmVnX21pbl9tYXhfdmFscyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAorCQkJCSAgICBzdHJ1Y3QgYnBmX2luc24gKmluc24pCit7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzLCAqZHN0X3JlZzsKKwl1NjQgbWluX3ZhbCA9IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0UsIG1heF92YWwgPSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFOworCWJvb2wgbWluX3NldCA9IGZhbHNlLCBtYXhfc2V0ID0gZmFsc2U7CisJdTggb3Bjb2RlID0gQlBGX09QKGluc24tPmNvZGUpOworCisJZHN0X3JlZyA9ICZyZWdzW2luc24tPmRzdF9yZWddOworCWlmIChCUEZfU1JDKGluc24tPmNvZGUpID09IEJQRl9YKSB7CisJCWNoZWNrX3JlZ19vdmVyZmxvdygmcmVnc1tpbnNuLT5zcmNfcmVnXSk7CisJCW1pbl92YWwgPSByZWdzW2luc24tPnNyY19yZWddLm1pbl92YWx1ZTsKKwkJbWF4X3ZhbCA9IHJlZ3NbaW5zbi0+c3JjX3JlZ10ubWF4X3ZhbHVlOworCisJCS8qIElmIHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMgYSByYW5kb20gcG9pbnRlciB0aGVuIHRoZQorCQkgKiBtaW5fdmFsdWUvbWF4X3ZhbHVlIHZhbHVlcyByZXByZXNlbnQgdGhlIHJhbmdlIG9mIHRoZSBrbm93bgorCQkgKiBhY2Nlc3NlcyBpbnRvIHRoYXQgdmFsdWUsIG5vdCB0aGUgYWN0dWFsIG1pbi9tYXggdmFsdWUgb2YgdGhlCisJCSAqIHJlZ2lzdGVyIGl0c2VsZi4gIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIHJlc2V0IHRoZSByZWcgcmFuZ2UKKwkJICogdmFsdWVzIHNvIHdlIGtub3cgaXQgaXMgbm90IHNhZmUgdG8gbG9vayBhdC4KKwkJICovCisJCWlmIChyZWdzW2luc24tPnNyY19yZWddLnR5cGUgIT0gQ09OU1RfSU1NICYmCisJCSAgICByZWdzW2luc24tPnNyY19yZWddLnR5cGUgIT0gVU5LTk9XTl9WQUxVRSkgeworCQkJbWluX3ZhbCA9IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0U7CisJCQltYXhfdmFsID0gQlBGX1JFR0lTVEVSX01BWF9SQU5HRTsKKwkJfQorCX0gZWxzZSBpZiAoaW5zbi0+aW1tIDwgQlBGX1JFR0lTVEVSX01BWF9SQU5HRSAmJgorCQkgICAoczY0KWluc24tPmltbSA+IEJQRl9SRUdJU1RFUl9NSU5fUkFOR0UpIHsKKwkJbWluX3ZhbCA9IG1heF92YWwgPSBpbnNuLT5pbW07CisJCW1pbl9zZXQgPSBtYXhfc2V0ID0gdHJ1ZTsKKwl9CisKKwkvKiBXZSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHdoYXQgd2FzIGRvbmUgdG8gdGhpcyByZWdpc3RlciwgbWFyayBpdAorCSAqIGFzIHVua25vd24uCisJICovCisJaWYgKG1pbl92YWwgPT0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRSAmJgorCSAgICBtYXhfdmFsID09IEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UpIHsKKwkJcmVzZXRfcmVnX3JhbmdlX3ZhbHVlcyhyZWdzLCBpbnNuLT5kc3RfcmVnKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBCUEZfQUREOgorCQlkc3RfcmVnLT5taW5fdmFsdWUgKz0gbWluX3ZhbDsKKwkJZHN0X3JlZy0+bWF4X3ZhbHVlICs9IG1heF92YWw7CisJCWJyZWFrOworCWNhc2UgQlBGX1NVQjoKKwkJZHN0X3JlZy0+bWluX3ZhbHVlIC09IG1pbl92YWw7CisJCWRzdF9yZWctPm1heF92YWx1ZSAtPSBtYXhfdmFsOworCQlicmVhazsKKwljYXNlIEJQRl9NVUw6CisJCWRzdF9yZWctPm1pbl92YWx1ZSAqPSBtaW5fdmFsOworCQlkc3RfcmVnLT5tYXhfdmFsdWUgKj0gbWF4X3ZhbDsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQU5EOgorCQkvKiAmIGlzIHNwZWNpYWwgc2luY2UgaXQgY291bGQgZW5kIHVwIHdpdGggMCBiaXRzIHNldC4gKi8KKwkJZHN0X3JlZy0+bWluX3ZhbHVlICY9IG1pbl92YWw7CisJCWRzdF9yZWctPm1heF92YWx1ZSA9IG1heF92YWw7CisJCWJyZWFrOworCWNhc2UgQlBGX0xTSDoKKwkJLyogR290dGEgaGF2ZSBzcGVjaWFsIG92ZXJmbG93IGxvZ2ljIGhlcmUsIGlmIHdlJ3JlIHNoaWZ0aW5nCisJCSAqIG1vcmUgdGhhbiBNQVhfUkFOR0UgdGhlbiBqdXN0IGFzc3VtZSB3ZSBoYXZlIGFuIGludmFsaWQKKwkJICogcmFuZ2UuCisJCSAqLworCQlpZiAobWluX3ZhbCA+IGlsb2cyKEJQRl9SRUdJU1RFUl9NQVhfUkFOR0UpKQorCQkJZHN0X3JlZy0+bWluX3ZhbHVlID0gQlBGX1JFR0lTVEVSX01JTl9SQU5HRTsKKwkJZWxzZQorCQkJZHN0X3JlZy0+bWluX3ZhbHVlIDw8PSBtaW5fdmFsOworCisJCWlmIChtYXhfdmFsID4gaWxvZzIoQlBGX1JFR0lTVEVSX01BWF9SQU5HRSkpCisJCQlkc3RfcmVnLT5tYXhfdmFsdWUgPSBCUEZfUkVHSVNURVJfTUFYX1JBTkdFOworCQllbHNlCisJCQlkc3RfcmVnLT5tYXhfdmFsdWUgPDw9IG1heF92YWw7CisJCWJyZWFrOworCWNhc2UgQlBGX1JTSDoKKwkJZHN0X3JlZy0+bWluX3ZhbHVlID4+PSBtaW5fdmFsOworCQlkc3RfcmVnLT5tYXhfdmFsdWUgPj49IG1heF92YWw7CisJCWJyZWFrOworCWNhc2UgQlBGX01PRDoKKwkJLyogJSBpcyBzcGVjaWFsIHNpbmNlIGl0IGlzIGFuIHVuc2lnbmVkIG1vZHVsdXMsIHNvIHRoZSBmbG9vcgorCQkgKiB3aWxsIGFsd2F5cyBiZSAwLgorCQkgKi8KKwkJZHN0X3JlZy0+bWluX3ZhbHVlID0gMDsKKwkJZHN0X3JlZy0+bWF4X3ZhbHVlID0gbWF4X3ZhbCAtIDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlc2V0X3JlZ19yYW5nZV92YWx1ZXMocmVncywgaW5zbi0+ZHN0X3JlZyk7CisJCWJyZWFrOworCX0KKworCWNoZWNrX3JlZ19vdmVyZmxvdyhkc3RfcmVnKTsKK30KKworLyogY2hlY2sgdmFsaWRpdHkgb2YgMzItYml0IGFuZCA2NC1iaXQgYXJpdGhtZXRpYyBvcGVyYXRpb25zICovCitzdGF0aWMgaW50IGNoZWNrX2FsdV9vcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCit7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzLCAqZHN0X3JlZzsKIAl1OCBvcGNvZGUgPSBCUEZfT1AoaW5zbi0+Y29kZSk7CiAJaW50IGVycjsKIApAQCAtMTQ5Niw2ICsxNjI3LDExIEBACiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwogCisJCS8qIHdlIGFyZSBzZXR0aW5nIG91ciByZWdpc3RlciB0byBzb21ldGhpbmcgbmV3LCB3ZSBuZWVkIHRvCisJCSAqIHJlc2V0IGl0cyByYW5nZSB2YWx1ZXMuCisJCSAqLworCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKHJlZ3MsIGluc24tPmRzdF9yZWcpOworCiAJCWlmIChCUEZfU1JDKGluc24tPmNvZGUpID09IEJQRl9YKSB7CiAJCQlpZiAoQlBGX0NMQVNTKGluc24tPmNvZGUpID09IEJQRl9BTFU2NCkgewogCQkJCS8qIGNhc2U6IFIxID0gUjIKQEAgLTE1MTcsNiArMTY1Myw4IEBACiAJCQkgKi8KIAkJCXJlZ3NbaW5zbi0+ZHN0X3JlZ10udHlwZSA9IENPTlNUX0lNTTsKIAkJCXJlZ3NbaW5zbi0+ZHN0X3JlZ10uaW1tID0gaW5zbi0+aW1tOworCQkJcmVnc1tpbnNuLT5kc3RfcmVnXS5tYXhfdmFsdWUgPSBpbnNuLT5pbW07CisJCQlyZWdzW2luc24tPmRzdF9yZWddLm1pbl92YWx1ZSA9IGluc24tPmltbTsKIAkJfQogCiAJfSBlbHNlIGlmIChvcGNvZGUgPiBCUEZfRU5EKSB7CkBAIC0xNTY5LDYgKzE3MDcsOSBAQAogCiAJCWRzdF9yZWcgPSAmcmVnc1tpbnNuLT5kc3RfcmVnXTsKIAorCQkvKiBmaXJzdCB3ZSB3YW50IHRvIGFkanVzdCBvdXIgcmFuZ2VzLiAqLworCQlhZGp1c3RfcmVnX21pbl9tYXhfdmFscyhlbnYsIGluc24pOworCiAJCS8qIHBhdHRlcm4gbWF0Y2ggJ2JwZl9hZGQgUngsIGltbScgaW5zdHJ1Y3Rpb24gKi8KIAkJaWYgKG9wY29kZSA9PSBCUEZfQUREICYmIEJQRl9DTEFTUyhpbnNuLT5jb2RlKSA9PSBCUEZfQUxVNjQgJiYKIAkJICAgIGRzdF9yZWctPnR5cGUgPT0gRlJBTUVfUFRSICYmIEJQRl9TUkMoaW5zbi0+Y29kZSkgPT0gQlBGX0spIHsKQEAgLTE2MDMsMjggKzE3NDQsNTggQEAKIAkJCXJldHVybiAtRUFDQ0VTOwogCQl9CiAKLQkJLyogbWFyayBkZXN0IG9wZXJhbmQgKi8KLQkJbWFya19yZWdfdW5rbm93bl92YWx1ZShyZWdzLCBpbnNuLT5kc3RfcmVnKTsKKwkJLyogSWYgd2UgZGlkIHBvaW50ZXIgbWF0aCBvbiBhIG1hcCB2YWx1ZSB0aGVuIGp1c3Qgc2V0IGl0IHRvIG91cgorCQkgKiBQVFJfVE9fTUFQX1ZBTFVFX0FESiB0eXBlIHNvIHdlIGNhbiBkZWFsIHdpdGggYW55IHN0b3JlcyBvcgorCQkgKiBsb2FkcyB0byB0aGlzIHJlZ2lzdGVyIGFwcHJvcHJpYXRlbHksIG90aGVyd2lzZSBqdXN0IG1hcmsgdGhlCisJCSAqIHJlZ2lzdGVyIGFzIHVua25vd24uCisJCSAqLworCQlpZiAoZW52LT5hbGxvd19wdHJfbGVha3MgJiYKKwkJICAgIChkc3RfcmVnLT50eXBlID09IFBUUl9UT19NQVBfVkFMVUUgfHwKKwkJICAgICBkc3RfcmVnLT50eXBlID09IFBUUl9UT19NQVBfVkFMVUVfQURKKSkKKwkJCWRzdF9yZWctPnR5cGUgPSBQVFJfVE9fTUFQX1ZBTFVFX0FESjsKKwkJZWxzZQorCQkJbWFya19yZWdfdW5rbm93bl92YWx1ZShyZWdzLCBpbnNuLT5kc3RfcmVnKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZmluZF9nb29kX3BrdF9wb2ludGVycyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYsCi0JCQkJICAgc3RydWN0IHJlZ19zdGF0ZSAqZHN0X3JlZykKK3N0YXRpYyB2b2lkIGZpbmRfZ29vZF9wa3RfcG9pbnRlcnMoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZSAqc3RhdGUsCisJCQkJICAgc3RydWN0IGJwZl9yZWdfc3RhdGUgKmRzdF9yZWcpCiB7Ci0Jc3RydWN0IHZlcmlmaWVyX3N0YXRlICpzdGF0ZSA9ICZlbnYtPmN1cl9zdGF0ZTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3MsICpyZWc7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBzdGF0ZS0+cmVncywgKnJlZzsKIAlpbnQgaTsKLQkvKiByMiA9IHIzOwotCSAqIHIyICs9IDgKLQkgKiBpZiAocjIgPiBwa3RfZW5kKSBnb3RvIHNvbWV3aGVyZQotCSAqIHIyID09IGRzdF9yZWcsIHBrdF9lbmQgPT0gc3JjX3JlZywKLQkgKiByMj1wa3QoaWQ9bixvZmY9OCxyPTApCi0JICogcjM9cGt0KGlkPW4sb2ZmPTAscj0wKQotCSAqIGZpbmQgcmVnaXN0ZXIgcjMgYW5kIG1hcmsgaXRzIHJhbmdlIGFzIHIzPXBrdChpZD1uLG9mZj0wLHI9OCkKLQkgKiBzbyB0aGF0IHJhbmdlIG9mIGJ5dGVzIFtyMywgcjMgKyA4KSBpcyBzYWZlIHRvIGFjY2VzcworCisJLyogTExWTSBjYW4gZ2VuZXJhdGUgdHdvIGtpbmQgb2YgY2hlY2tzOgorCSAqCisJICogVHlwZSAxOgorCSAqCisJICogICByMiA9IHIzOworCSAqICAgcjIgKz0gODsKKwkgKiAgIGlmIChyMiA+IHBrdF9lbmQpIGdvdG8gPGhhbmRsZSBleGNlcHRpb24+CisJICogICA8YWNjZXNzIG9rYXk+CisJICoKKwkgKiAgIFdoZXJlOgorCSAqICAgICByMiA9PSBkc3RfcmVnLCBwa3RfZW5kID09IHNyY19yZWcKKwkgKiAgICAgcjI9cGt0KGlkPW4sb2ZmPTgscj0wKQorCSAqICAgICByMz1wa3QoaWQ9bixvZmY9MCxyPTApCisJICoKKwkgKiBUeXBlIDI6CisJICoKKwkgKiAgIHIyID0gcjM7CisJICogICByMiArPSA4OworCSAqICAgaWYgKHBrdF9lbmQgPj0gcjIpIGdvdG8gPGFjY2VzcyBva2F5PgorCSAqICAgPGhhbmRsZSBleGNlcHRpb24+CisJICoKKwkgKiAgIFdoZXJlOgorCSAqICAgICBwa3RfZW5kID09IGRzdF9yZWcsIHIyID09IHNyY19yZWcKKwkgKiAgICAgcjI9cGt0KGlkPW4sb2ZmPTgscj0wKQorCSAqICAgICByMz1wa3QoaWQ9bixvZmY9MCxyPTApCisJICoKKwkgKiBGaW5kIHJlZ2lzdGVyIHIzIGFuZCBtYXJrIGl0cyByYW5nZSBhcyByMz1wa3QoaWQ9bixvZmY9MCxyPTgpCisJICogc28gdGhhdCByYW5nZSBvZiBieXRlcyBbcjMsIHIzICsgOCkgaXMgc2FmZSB0byBhY2Nlc3MuCiAJICovCisKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JQRl9SRUc7IGkrKykKIAkJaWYgKHJlZ3NbaV0udHlwZSA9PSBQVFJfVE9fUEFDS0VUICYmIHJlZ3NbaV0uaWQgPT0gZHN0X3JlZy0+aWQpCiAJCQlyZWdzW2ldLnJhbmdlID0gZHN0X3JlZy0+b2ZmOwpAQCAtMTYzOCwxMSArMTgwOSwxMDkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfY29uZF9qbXBfb3Aoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LAorLyogQWRqdXN0cyB0aGUgcmVnaXN0ZXIgbWluL21heCB2YWx1ZXMgaW4gdGhlIGNhc2UgdGhhdCB0aGUgZHN0X3JlZyBpcyB0aGUKKyAqIHZhcmlhYmxlIHJlZ2lzdGVyIHRoYXQgd2UgYXJlIHdvcmtpbmcgb24sIGFuZCBzcmNfcmVnIGlzIGEgY29uc3RhbnQgb3Igd2UncmUKKyAqIHNpbXBseSBkb2luZyBhIEJQRl9LIGNoZWNrLgorICovCitzdGF0aWMgdm9pZCByZWdfc2V0X21pbl9tYXgoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnRydWVfcmVnLAorCQkJICAgIHN0cnVjdCBicGZfcmVnX3N0YXRlICpmYWxzZV9yZWcsIHU2NCB2YWwsCisJCQkgICAgdTggb3Bjb2RlKQoreworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBCUEZfSkVROgorCQkvKiBJZiB0aGlzIGlzIGZhbHNlIHRoZW4gd2Uga25vdyBub3RoaW5nIEpvbiBTbm93LCBidXQgaWYgaXQgaXMKKwkJICogdHJ1ZSB0aGVuIHdlIGtub3cgZm9yIHN1cmUuCisJCSAqLworCQl0cnVlX3JlZy0+bWF4X3ZhbHVlID0gdHJ1ZV9yZWctPm1pbl92YWx1ZSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk5FOgorCQkvKiBJZiB0aGlzIGlzIHRydWUgd2Uga25vdyBub3RoaW5nIEpvbiBTbm93LCBidXQgaWYgaXQgaXMgZmFsc2UKKwkJICogd2Uga25vdyB0aGUgdmFsdWUgZm9yIHN1cmU7CisJCSAqLworCQlmYWxzZV9yZWctPm1heF92YWx1ZSA9IGZhbHNlX3JlZy0+bWluX3ZhbHVlID0gdmFsOworCQlicmVhazsKKwljYXNlIEJQRl9KR1Q6CisJCS8qIFVuc2lnbmVkIGNvbXBhcmlzb24sIHRoZSBtaW5pbXVtIHZhbHVlIGlzIDAuICovCisJCWZhbHNlX3JlZy0+bWluX3ZhbHVlID0gMDsKKwljYXNlIEJQRl9KU0dUOgorCQkvKiBJZiB0aGlzIGlzIGZhbHNlIHRoZW4gd2Uga25vdyB0aGUgbWF4aW11bSB2YWwgaXMgdmFsLAorCQkgKiBvdGhlcndpc2Ugd2Uga25vdyB0aGUgbWluIHZhbCBpcyB2YWwrMS4KKwkJICovCisJCWZhbHNlX3JlZy0+bWF4X3ZhbHVlID0gdmFsOworCQl0cnVlX3JlZy0+bWluX3ZhbHVlID0gdmFsICsgMTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSkdFOgorCQkvKiBVbnNpZ25lZCBjb21wYXJpc29uLCB0aGUgbWluaW11bSB2YWx1ZSBpcyAwLiAqLworCQlmYWxzZV9yZWctPm1pbl92YWx1ZSA9IDA7CisJY2FzZSBCUEZfSlNHRToKKwkJLyogSWYgdGhpcyBpcyBmYWxzZSB0aGVuIHdlIGtub3cgdGhlIG1heGltdW0gdmFsdWUgaXMgdmFsIC0gMSwKKwkJICogb3RoZXJ3aXNlIHdlIGtub3cgdGhlIG1pbWltdW0gdmFsdWUgaXMgdmFsLgorCQkgKi8KKwkJZmFsc2VfcmVnLT5tYXhfdmFsdWUgPSB2YWwgLSAxOworCQl0cnVlX3JlZy0+bWluX3ZhbHVlID0gdmFsOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwljaGVja19yZWdfb3ZlcmZsb3coZmFsc2VfcmVnKTsKKwljaGVja19yZWdfb3ZlcmZsb3codHJ1ZV9yZWcpOworfQorCisvKiBTYW1lIGFzIGFib3ZlLCBidXQgZm9yIHRoZSBjYXNlIHRoYXQgZHN0X3JlZyBpcyBhIENPTlNUX0lNTSByZWcgYW5kIHNyY19yZWcKKyAqIGlzIHRoZSB2YXJpYWJsZSByZWcuCisgKi8KK3N0YXRpYyB2b2lkIHJlZ19zZXRfbWluX21heF9pbnYoc3RydWN0IGJwZl9yZWdfc3RhdGUgKnRydWVfcmVnLAorCQkJCXN0cnVjdCBicGZfcmVnX3N0YXRlICpmYWxzZV9yZWcsIHU2NCB2YWwsCisJCQkJdTggb3Bjb2RlKQoreworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBCUEZfSkVROgorCQkvKiBJZiB0aGlzIGlzIGZhbHNlIHRoZW4gd2Uga25vdyBub3RoaW5nIEpvbiBTbm93LCBidXQgaWYgaXQgaXMKKwkJICogdHJ1ZSB0aGVuIHdlIGtub3cgZm9yIHN1cmUuCisJCSAqLworCQl0cnVlX3JlZy0+bWF4X3ZhbHVlID0gdHJ1ZV9yZWctPm1pbl92YWx1ZSA9IHZhbDsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk5FOgorCQkvKiBJZiB0aGlzIGlzIHRydWUgd2Uga25vdyBub3RoaW5nIEpvbiBTbm93LCBidXQgaWYgaXQgaXMgZmFsc2UKKwkJICogd2Uga25vdyB0aGUgdmFsdWUgZm9yIHN1cmU7CisJCSAqLworCQlmYWxzZV9yZWctPm1heF92YWx1ZSA9IGZhbHNlX3JlZy0+bWluX3ZhbHVlID0gdmFsOworCQlicmVhazsKKwljYXNlIEJQRl9KR1Q6CisJCS8qIFVuc2lnbmVkIGNvbXBhcmlzb24sIHRoZSBtaW5pbXVtIHZhbHVlIGlzIDAuICovCisJCXRydWVfcmVnLT5taW5fdmFsdWUgPSAwOworCWNhc2UgQlBGX0pTR1Q6CisJCS8qCisJCSAqIElmIHRoaXMgaXMgZmFsc2UsIHRoZW4gdGhlIHZhbCBpcyA8PSB0aGUgcmVnaXN0ZXIsIGlmIGl0IGlzCisJCSAqIHRydWUgdGhlIHJlZ2lzdGVyIDw9IHRvIHRoZSB2YWwuCisJCSAqLworCQlmYWxzZV9yZWctPm1pbl92YWx1ZSA9IHZhbDsKKwkJdHJ1ZV9yZWctPm1heF92YWx1ZSA9IHZhbCAtIDE7CisJCWJyZWFrOworCWNhc2UgQlBGX0pHRToKKwkJLyogVW5zaWduZWQgY29tcGFyaXNvbiwgdGhlIG1pbmltdW0gdmFsdWUgaXMgMC4gKi8KKwkJdHJ1ZV9yZWctPm1pbl92YWx1ZSA9IDA7CisJY2FzZSBCUEZfSlNHRToKKwkJLyogSWYgdGhpcyBpcyBmYWxzZSB0aGVuIGNvbnN0YW50IDwgcmVnaXN0ZXIsIGlmIGl0IGlzIHRydWUgdGhlbgorCQkgKiB0aGUgcmVnaXN0ZXIgPCBjb25zdGFudC4KKwkJICovCisJCWZhbHNlX3JlZy0+bWluX3ZhbHVlID0gdmFsICsgMTsKKwkJdHJ1ZV9yZWctPm1heF92YWx1ZSA9IHZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJY2hlY2tfcmVnX292ZXJmbG93KGZhbHNlX3JlZyk7CisJY2hlY2tfcmVnX292ZXJmbG93KHRydWVfcmVnKTsKK30KKworc3RhdGljIGludCBjaGVja19jb25kX2ptcF9vcChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAogCQkJICAgICBzdHJ1Y3QgYnBmX2luc24gKmluc24sIGludCAqaW5zbl9pZHgpCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3MsICpkc3RfcmVnOwotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqb3RoZXJfYnJhbmNoOworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKm90aGVyX2JyYW5jaCwgKnRoaXNfYnJhbmNoID0gJmVudi0+Y3VyX3N0YXRlOworCXN0cnVjdCBicGZfcmVnX3N0YXRlICpyZWdzID0gdGhpc19icmFuY2gtPnJlZ3MsICpkc3RfcmVnOwogCXU4IG9wY29kZSA9IEJQRl9PUChpbnNuLT5jb2RlKTsKIAlpbnQgZXJyOwogCkBAIC0xNzA0LDcgKzE5NzMsMjQgQEAKIAlpZiAoIW90aGVyX2JyYW5jaCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkvKiBkZXRlY3QgaWYgUiA9PSAwIHdoZXJlIFIgaXMgcmV0dXJuZWQgdmFsdWUgZnJvbSBicGZfbWFwX2xvb2t1cF9lbGVtKCkgKi8KKwkvKiBkZXRlY3QgaWYgd2UgYXJlIGNvbXBhcmluZyBhZ2FpbnN0IGEgY29uc3RhbnQgdmFsdWUgc28gd2UgY2FuIGFkanVzdAorCSAqIG91ciBtaW4vbWF4IHZhbHVlcyBmb3Igb3VyIGRzdCByZWdpc3Rlci4KKwkgKi8KKwlpZiAoQlBGX1NSQyhpbnNuLT5jb2RlKSA9PSBCUEZfWCkgeworCQlpZiAocmVnc1tpbnNuLT5zcmNfcmVnXS50eXBlID09IENPTlNUX0lNTSkKKwkJCXJlZ19zZXRfbWluX21heCgmb3RoZXJfYnJhbmNoLT5yZWdzW2luc24tPmRzdF9yZWddLAorCQkJCQlkc3RfcmVnLCByZWdzW2luc24tPnNyY19yZWddLmltbSwKKwkJCQkJb3Bjb2RlKTsKKwkJZWxzZSBpZiAoZHN0X3JlZy0+dHlwZSA9PSBDT05TVF9JTU0pCisJCQlyZWdfc2V0X21pbl9tYXhfaW52KCZvdGhlcl9icmFuY2gtPnJlZ3NbaW5zbi0+c3JjX3JlZ10sCisJCQkJCSAgICAmcmVnc1tpbnNuLT5zcmNfcmVnXSwgZHN0X3JlZy0+aW1tLAorCQkJCQkgICAgb3Bjb2RlKTsKKwl9IGVsc2UgeworCQlyZWdfc2V0X21pbl9tYXgoJm90aGVyX2JyYW5jaC0+cmVnc1tpbnNuLT5kc3RfcmVnXSwKKwkJCQkJZHN0X3JlZywgaW5zbi0+aW1tLCBvcGNvZGUpOworCX0KKworCS8qIGRldGVjdCBpZiBSID09IDAgd2hlcmUgUiBpcyByZXR1cm5lZCBmcm9tIGJwZl9tYXBfbG9va3VwX2VsZW0oKSAqLwogCWlmIChCUEZfU1JDKGluc24tPmNvZGUpID09IEJQRl9LICYmCiAJICAgIGluc24tPmltbSA9PSAwICYmIChvcGNvZGUgPT0gQlBGX0pFUSB8fCBvcGNvZGUgPT0gQlBGX0pORSkgJiYKIAkgICAgZHN0X3JlZy0+dHlwZSA9PSBQVFJfVE9fTUFQX1ZBTFVFX09SX05VTEwpIHsKQEAgLTE3MjMsMTMgKzIwMDksMTcgQEAKIAl9IGVsc2UgaWYgKEJQRl9TUkMoaW5zbi0+Y29kZSkgPT0gQlBGX1ggJiYgb3Bjb2RlID09IEJQRl9KR1QgJiYKIAkJICAgZHN0X3JlZy0+dHlwZSA9PSBQVFJfVE9fUEFDS0VUICYmCiAJCSAgIHJlZ3NbaW5zbi0+c3JjX3JlZ10udHlwZSA9PSBQVFJfVE9fUEFDS0VUX0VORCkgewotCQlmaW5kX2dvb2RfcGt0X3BvaW50ZXJzKGVudiwgZHN0X3JlZyk7CisJCWZpbmRfZ29vZF9wa3RfcG9pbnRlcnModGhpc19icmFuY2gsIGRzdF9yZWcpOworCX0gZWxzZSBpZiAoQlBGX1NSQyhpbnNuLT5jb2RlKSA9PSBCUEZfWCAmJiBvcGNvZGUgPT0gQlBGX0pHRSAmJgorCQkgICBkc3RfcmVnLT50eXBlID09IFBUUl9UT19QQUNLRVRfRU5EICYmCisJCSAgIHJlZ3NbaW5zbi0+c3JjX3JlZ10udHlwZSA9PSBQVFJfVE9fUEFDS0VUKSB7CisJCWZpbmRfZ29vZF9wa3RfcG9pbnRlcnMob3RoZXJfYnJhbmNoLCAmcmVnc1tpbnNuLT5zcmNfcmVnXSk7CiAJfSBlbHNlIGlmIChpc19wb2ludGVyX3ZhbHVlKGVudiwgaW5zbi0+ZHN0X3JlZykpIHsKIAkJdmVyYm9zZSgiUiVkIHBvaW50ZXIgY29tcGFyaXNvbiBwcm9oaWJpdGVkXG4iLCBpbnNuLT5kc3RfcmVnKTsKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCWlmIChsb2dfbGV2ZWwpCi0JCXByaW50X3ZlcmlmaWVyX3N0YXRlKCZlbnYtPmN1cl9zdGF0ZSk7CisJCXByaW50X3ZlcmlmaWVyX3N0YXRlKHRoaXNfYnJhbmNoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc0Miw5ICsyMDMyLDkgQEAKIH0KIAogLyogdmVyaWZ5IEJQRl9MRF9JTU02NCBpbnN0cnVjdGlvbiAqLwotc3RhdGljIGludCBjaGVja19sZF9pbW0oc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgaW50IGNoZWNrX2xkX2ltbShzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOwogCWludCBlcnI7CiAKIAlpZiAoQlBGX1NJWkUoaW5zbi0+Y29kZSkgIT0gQlBGX0RXKSB7CkBAIC0xNzYwLDkgKzIwNTAsMTkgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKGluc24tPnNyY19yZWcgPT0gMCkKLQkJLyogZ2VuZXJpYyBtb3ZlIDY0LWJpdCBpbW1lZGlhdGUgaW50byBhIHJlZ2lzdGVyICovCisJaWYgKGluc24tPnNyY19yZWcgPT0gMCkgeworCQkvKiBnZW5lcmljIG1vdmUgNjQtYml0IGltbWVkaWF0ZSBpbnRvIGEgcmVnaXN0ZXIsCisJCSAqIG9ubHkgYW5hbHl6ZXIgbmVlZHMgdG8gY29sbGVjdCB0aGUgbGRfaW1tIHZhbHVlLgorCQkgKi8KKwkJdTY0IGltbSA9ICgodTY0KShpbnNuICsgMSktPmltbSA8PCAzMikgfCAodTMyKWluc24tPmltbTsKKworCQlpZiAoIWVudi0+YW5hbHl6ZXJfb3BzKQorCQkJcmV0dXJuIDA7CisKKwkJcmVnc1tpbnNuLT5kc3RfcmVnXS50eXBlID0gQ09OU1RfSU1NOworCQlyZWdzW2luc24tPmRzdF9yZWddLmltbSA9IGltbTsKIAkJcmV0dXJuIDA7CisJfQogCiAJLyogcmVwbGFjZV9tYXBfZmRfd2l0aF9tYXBfcHRyKCkgc2hvdWxkIGhhdmUgY2F1Z2h0IGJhZCBsZF9pbW02NCAqLwogCUJVR19PTihpbnNuLT5zcmNfcmVnICE9IEJQRl9QU0VVRE9fTUFQX0ZEKTsKQEAgLTE3OTksMTEgKzIwOTksMTEgQEAKICAqIE91dHB1dDoKICAqICAgUjAgLSA4LzE2LzMyLWJpdCBza2IgZGF0YSBjb252ZXJ0ZWQgdG8gY3B1IGVuZGlhbm5lc3MKICAqLwotc3RhdGljIGludCBjaGVja19sZF9hYnMoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCitzdGF0aWMgaW50IGNoZWNrX2xkX2FicyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LCBzdHJ1Y3QgYnBmX2luc24gKmluc24pCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcmVncyA9IGVudi0+Y3VyX3N0YXRlLnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBlbnYtPmN1cl9zdGF0ZS5yZWdzOwogCXU4IG1vZGUgPSBCUEZfTU9ERShpbnNuLT5jb2RlKTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWc7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZzsKIAlpbnQgaSwgZXJyOwogCiAJaWYgKCFtYXlfYWNjZXNzX3NrYihlbnYtPnByb2ctPnR5cGUpKSB7CkBAIC0xODg5LDcgKzIxODksNyBAQAogCUJSQU5DSCA9IDIsCiB9OwogCi0jZGVmaW5lIFNUQVRFX0xJU1RfTUFSSyAoKHN0cnVjdCB2ZXJpZmllcl9zdGF0ZV9saXN0ICopIC0xTCkKKyNkZWZpbmUgU1RBVEVfTElTVF9NQVJLICgoc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZV9saXN0ICopIC0xTCkKIAogc3RhdGljIGludCAqaW5zbl9zdGFjazsJLyogc3RhY2sgb2YgaW5zbnMgdG8gcHJvY2VzcyAqLwogc3RhdGljIGludCBjdXJfc3RhY2s7CS8qIGN1cnJlbnQgc3RhY2sgaW5kZXggKi8KQEAgLTE5MDAsNyArMjIwMCw3IEBACiAgKiB3IC0gbmV4dCBpbnN0cnVjdGlvbgogICogZSAtIGVkZ2UKICAqLwotc3RhdGljIGludCBwdXNoX2luc24oaW50IHQsIGludCB3LCBpbnQgZSwgc3RydWN0IHZlcmlmaWVyX2VudiAqZW52KQorc3RhdGljIGludCBwdXNoX2luc24oaW50IHQsIGludCB3LCBpbnQgZSwgc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIHsKIAlpZiAoZSA9PSBGQUxMVEhST1VHSCAmJiBpbnNuX3N0YXRlW3RdID49IChESVNDT1ZFUkVEIHwgRkFMTFRIUk9VR0gpKQogCQlyZXR1cm4gMDsKQEAgLTE5NDEsNyArMjI0MSw3IEBACiAvKiBub24tcmVjdXJzaXZlIGRlcHRoLWZpcnN0LXNlYXJjaCB0byBkZXRlY3QgbG9vcHMgaW4gQlBGIHByb2dyYW0KICAqIGxvb3AgPT0gYmFjay1lZGdlIGluIGRpcmVjdGVkIGdyYXBoCiAgKi8KLXN0YXRpYyBpbnQgY2hlY2tfY2ZnKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudikKK3N0YXRpYyBpbnQgY2hlY2tfY2ZnKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCiB7CiAJc3RydWN0IGJwZl9pbnNuICppbnNucyA9IGVudi0+cHJvZy0+aW5zbnNpOwogCWludCBpbnNuX2NudCA9IGVudi0+cHJvZy0+bGVuOwpAQCAtMjA1MCw3ICsyMzUwLDggQEAKIC8qIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyByZWR1Y2UgdGhlIG51bWJlciBvZiBleHBsb3JlZCBpbnNucwogICogZnJvbSB+MTQwayB0byB+ODBrIGZvciB1bHRyYSBsYXJnZSBwcm9ncmFtcyB0aGF0IHVzZSBhIGxvdCBvZiBwdHJfdG9fcGFja2V0CiAgKi8KLXN0YXRpYyBib29sIGNvbXBhcmVfcHRyc190b19wYWNrZXQoc3RydWN0IHJlZ19zdGF0ZSAqb2xkLCBzdHJ1Y3QgcmVnX3N0YXRlICpjdXIpCitzdGF0aWMgYm9vbCBjb21wYXJlX3B0cnNfdG9fcGFja2V0KHN0cnVjdCBicGZfcmVnX3N0YXRlICpvbGQsCisJCQkJICAgc3RydWN0IGJwZl9yZWdfc3RhdGUgKmN1cikKIHsKIAlpZiAob2xkLT5pZCAhPSBjdXItPmlkKQogCQlyZXR1cm4gZmFsc2U7CkBAIC0yMTI1LDkgKzI0MjYsMTEgQEAKICAqIHdoZXJlYXMgcmVnaXN0ZXIgdHlwZSBpbiBjdXJyZW50IHN0YXRlIGlzIG1lYW5pbmdmdWwsIGl0IG1lYW5zIHRoYXQKICAqIHRoZSBjdXJyZW50IHN0YXRlIHdpbGwgcmVhY2ggJ2JwZl9leGl0JyBpbnN0cnVjdGlvbiBzYWZlbHkKICAqLwotc3RhdGljIGJvb2wgc3RhdGVzX2VxdWFsKHN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqb2xkLCBzdHJ1Y3QgdmVyaWZpZXJfc3RhdGUgKmN1cikKK3N0YXRpYyBib29sIHN0YXRlc19lcXVhbChzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52LAorCQkJIHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKm9sZCwKKwkJCSBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlICpjdXIpCiB7Ci0Jc3RydWN0IHJlZ19zdGF0ZSAqcm9sZCwgKnJjdXI7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJvbGQsICpyY3VyOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CUEZfUkVHOyBpKyspIHsKQEAgLTIxMzcsNiArMjQ0MCwxMyBAQAogCQlpZiAobWVtY21wKHJvbGQsIHJjdXIsIHNpemVvZigqcm9sZCkpID09IDApCiAJCQljb250aW51ZTsKIAorCQkvKiBJZiB0aGUgcmFuZ2VzIHdlcmUgbm90IHRoZSBzYW1lLCBidXQgZXZlcnl0aGluZyBlbHNlIHdhcyBhbmQKKwkJICogd2UgZGlkbid0IGRvIGEgdmFyaWFibGUgYWNjZXNzIGludG8gYSBtYXAgdGhlbiB3ZSBhcmUgYS1vay4KKwkJICovCisJCWlmICghZW52LT52YXJsZW5fbWFwX3ZhbHVlX2FjY2VzcyAmJgorCQkgICAgcm9sZC0+dHlwZSA9PSByY3VyLT50eXBlICYmIHJvbGQtPmltbSA9PSByY3VyLT5pbW0pCisJCQljb250aW51ZTsKKwogCQlpZiAocm9sZC0+dHlwZSA9PSBOT1RfSU5JVCB8fAogCQkgICAgKHJvbGQtPnR5cGUgPT0gVU5LTk9XTl9WQUxVRSAmJiByY3VyLT50eXBlICE9IE5PVF9JTklUKSkKIAkJCWNvbnRpbnVlOwpAQCAtMjE2Nyw5ICsyNDc3LDkgQEAKIAkJCSAqIHRoZSBzYW1lLCBjaGVjayB0aGF0IHN0b3JlZCBwb2ludGVycyB0eXBlcwogCQkJICogYXJlIHRoZSBzYW1lIGFzIHdlbGwuCiAJCQkgKiBFeDogZXhwbG9yZWQgc2FmZSBwYXRoIGNvdWxkIGhhdmUgc3RvcmVkCi0JCQkgKiAoc3RydWN0IHJlZ19zdGF0ZSkgey50eXBlID0gUFRSX1RPX1NUQUNLLCAuaW1tID0gLTh9CisJCQkgKiAoYnBmX3JlZ19zdGF0ZSkgey50eXBlID0gUFRSX1RPX1NUQUNLLCAuaW1tID0gLTh9CiAJCQkgKiBidXQgY3VycmVudCBwYXRoIGhhcyBzdG9yZWQ6Ci0JCQkgKiAoc3RydWN0IHJlZ19zdGF0ZSkgey50eXBlID0gUFRSX1RPX1NUQUNLLCAuaW1tID0gLTE2fQorCQkJICogKGJwZl9yZWdfc3RhdGUpIHsudHlwZSA9IFBUUl9UT19TVEFDSywgLmltbSA9IC0xNn0KIAkJCSAqIHN1Y2ggdmVyaWZpZXIgc3RhdGVzIGFyZSBub3QgZXF1aXZhbGVudC4KIAkJCSAqIHJldHVybiBmYWxzZSB0byBjb250aW51ZSB2ZXJpZmljYXRpb24gb2YgdGhpcyBwYXRoCiAJCQkgKi8KQEAgLTIxODAsMTAgKzI0OTAsMTAgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBpc19zdGF0ZV92aXNpdGVkKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudiwgaW50IGluc25faWR4KQorc3RhdGljIGludCBpc19zdGF0ZV92aXNpdGVkKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsIGludCBpbnNuX2lkeCkKIHsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqbmV3X3NsOwotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZV9saXN0ICpzbDsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlX2xpc3QgKm5ld19zbDsKKwlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlX2xpc3QgKnNsOwogCiAJc2wgPSBlbnYtPmV4cGxvcmVkX3N0YXRlc1tpbnNuX2lkeF07CiAJaWYgKCFzbCkKQEAgLTIxOTMsNyArMjUwMyw3IEBACiAJCXJldHVybiAwOwogCiAJd2hpbGUgKHNsICE9IFNUQVRFX0xJU1RfTUFSSykgewotCQlpZiAoc3RhdGVzX2VxdWFsKCZzbC0+c3RhdGUsICZlbnYtPmN1cl9zdGF0ZSkpCisJCWlmIChzdGF0ZXNfZXF1YWwoZW52LCAmc2wtPnN0YXRlLCAmZW52LT5jdXJfc3RhdGUpKQogCQkJLyogcmVhY2hlZCBlcXVpdmFsZW50IHJlZ2lzdGVyL3N0YWNrIHN0YXRlLAogCQkJICogcHJ1bmUgdGhlIHNlYXJjaAogCQkJICovCkBAIC0yMjA3LDcgKzI1MTcsNyBAQAogCSAqIGl0IHdpbGwgYmUgcmVqZWN0ZWQuIFNpbmNlIHRoZXJlIGFyZSBubyBsb29wcywgd2Ugd29uJ3QgYmUKIAkgKiBzZWVpbmcgdGhpcyAnaW5zbl9pZHgnIGluc3RydWN0aW9uIGFnYWluIG9uIHRoZSB3YXkgdG8gYnBmX2V4aXQKIAkgKi8KLQluZXdfc2wgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCksIEdGUF9VU0VSKTsKKwluZXdfc2wgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX3N0YXRlX2xpc3QpLCBHRlBfVVNFUik7CiAJaWYgKCFuZXdfc2wpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yMjE4LDExICsyNTI4LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG9fY2hlY2soc3RydWN0IHZlcmlmaWVyX2VudiAqZW52KQorc3RhdGljIGludCBleHRfYW5hbHl6ZXJfaW5zbl9ob29rKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYsCisJCQkJICBpbnQgaW5zbl9pZHgsIGludCBwcmV2X2luc25faWR4KQogewotCXN0cnVjdCB2ZXJpZmllcl9zdGF0ZSAqc3RhdGUgPSAmZW52LT5jdXJfc3RhdGU7CisJaWYgKCFlbnYtPmFuYWx5emVyX29wcyB8fCAhZW52LT5hbmFseXplcl9vcHMtPmluc25faG9vaykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZW52LT5hbmFseXplcl9vcHMtPmluc25faG9vayhlbnYsIGluc25faWR4LCBwcmV2X2luc25faWR4KTsKK30KKworc3RhdGljIGludCBkb19jaGVjayhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQoreworCXN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGUgKnN0YXRlID0gJmVudi0+Y3VyX3N0YXRlOwogCXN0cnVjdCBicGZfaW5zbiAqaW5zbnMgPSBlbnYtPnByb2ctPmluc25zaTsKLQlzdHJ1Y3QgcmVnX3N0YXRlICpyZWdzID0gc3RhdGUtPnJlZ3M7CisJc3RydWN0IGJwZl9yZWdfc3RhdGUgKnJlZ3MgPSBzdGF0ZS0+cmVnczsKIAlpbnQgaW5zbl9jbnQgPSBlbnYtPnByb2ctPmxlbjsKIAlpbnQgaW5zbl9pZHgsIHByZXZfaW5zbl9pZHggPSAwOwogCWludCBpbnNuX3Byb2Nlc3NlZCA9IDA7CkBAIC0yMjMwLDYgKzI1NDksNyBAQAogCiAJaW5pdF9yZWdfc3RhdGUocmVncyk7CiAJaW5zbl9pZHggPSAwOworCWVudi0+dmFybGVuX21hcF92YWx1ZV9hY2Nlc3MgPSBmYWxzZTsKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCBicGZfaW5zbiAqaW5zbjsKIAkJdTggY2xhc3M7CkBAIC0yMjc2LDEzICsyNTk2LDE3IEBACiAJCQlwcmludF9icGZfaW5zbihpbnNuKTsKIAkJfQogCisJCWVyciA9IGV4dF9hbmFseXplcl9pbnNuX2hvb2soZW52LCBpbnNuX2lkeCwgcHJldl9pbnNuX2lkeCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCiAJCWlmIChjbGFzcyA9PSBCUEZfQUxVIHx8IGNsYXNzID09IEJQRl9BTFU2NCkgewogCQkJZXJyID0gY2hlY2tfYWx1X29wKGVudiwgaW5zbik7CiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiBlcnI7CiAKIAkJfSBlbHNlIGlmIChjbGFzcyA9PSBCUEZfTERYKSB7Ci0JCQllbnVtIGJwZl9yZWdfdHlwZSBzcmNfcmVnX3R5cGU7CisJCQllbnVtIGJwZl9yZWdfdHlwZSAqcHJldl9zcmNfdHlwZSwgc3JjX3JlZ190eXBlOwogCiAJCQkvKiBjaGVjayBmb3IgcmVzZXJ2ZWQgZmllbGRzIGlzIGFscmVhZHkgZG9uZSAqLwogCkBAIC0yMzA2LDIxICsyNjMwLDI1IEBACiAJCQlpZiAoZXJyKQogCQkJCXJldHVybiBlcnI7CiAKLQkJCWlmIChCUEZfU0laRShpbnNuLT5jb2RlKSAhPSBCUEZfVykgeworCQkJcmVzZXRfcmVnX3JhbmdlX3ZhbHVlcyhyZWdzLCBpbnNuLT5kc3RfcmVnKTsKKwkJCWlmIChCUEZfU0laRShpbnNuLT5jb2RlKSAhPSBCUEZfVyAmJgorCQkJICAgIEJQRl9TSVpFKGluc24tPmNvZGUpICE9IEJQRl9EVykgewogCQkJCWluc25faWR4Kys7CiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWlmIChpbnNuLT5pbW0gPT0gMCkgeworCQkJcHJldl9zcmNfdHlwZSA9ICZlbnYtPmluc25fYXV4X2RhdGFbaW5zbl9pZHhdLnB0cl90eXBlOworCisJCQlpZiAoKnByZXZfc3JjX3R5cGUgPT0gTk9UX0lOSVQpIHsKIAkJCQkvKiBzYXcgYSB2YWxpZCBpbnNuCiAJCQkJICogZHN0X3JlZyA9ICoodTMyICopKHNyY19yZWcgKyBvZmYpCi0JCQkJICogdXNlIHJlc2VydmVkICdpbW0nIGZpZWxkIHRvIG1hcmsgdGhpcyBpbnNuCisJCQkJICogc2F2ZSB0eXBlIHRvIHZhbGlkYXRlIGludGVyc2VjdGluZyBwYXRocwogCQkJCSAqLwotCQkJCWluc24tPmltbSA9IHNyY19yZWdfdHlwZTsKKwkJCQkqcHJldl9zcmNfdHlwZSA9IHNyY19yZWdfdHlwZTsKIAotCQkJfSBlbHNlIGlmIChzcmNfcmVnX3R5cGUgIT0gaW5zbi0+aW1tICYmCisJCQl9IGVsc2UgaWYgKHNyY19yZWdfdHlwZSAhPSAqcHJldl9zcmNfdHlwZSAmJgogCQkJCSAgIChzcmNfcmVnX3R5cGUgPT0gUFRSX1RPX0NUWCB8fAotCQkJCSAgICBpbnNuLT5pbW0gPT0gUFRSX1RPX0NUWCkpIHsKKwkJCQkgICAgKnByZXZfc3JjX3R5cGUgPT0gUFRSX1RPX0NUWCkpIHsKIAkJCQkvKiBBQnVzZXIgcHJvZ3JhbSBpcyB0cnlpbmcgdG8gdXNlIHRoZSBzYW1lIGluc24KIAkJCQkgKiBkc3RfcmVnID0gKih1MzIqKSAoc3JjX3JlZyArIG9mZikKIAkJCQkgKiB3aXRoIGRpZmZlcmVudCBwb2ludGVyIHR5cGVzOgpAQCAtMjMzMyw3ICsyNjYxLDcgQEAKIAkJCX0KIAogCQl9IGVsc2UgaWYgKGNsYXNzID09IEJQRl9TVFgpIHsKLQkJCWVudW0gYnBmX3JlZ190eXBlIGRzdF9yZWdfdHlwZTsKKwkJCWVudW0gYnBmX3JlZ190eXBlICpwcmV2X2RzdF90eXBlLCBkc3RfcmVnX3R5cGU7CiAKIAkJCWlmIChCUEZfTU9ERShpbnNuLT5jb2RlKSA9PSBCUEZfWEFERCkgewogCQkJCWVyciA9IGNoZWNrX3hhZGQoZW52LCBpbnNuKTsKQEAgLTIzNjEsMTEgKzI2ODksMTMgQEAKIAkJCWlmIChlcnIpCiAJCQkJcmV0dXJuIGVycjsKIAotCQkJaWYgKGluc24tPmltbSA9PSAwKSB7Ci0JCQkJaW5zbi0+aW1tID0gZHN0X3JlZ190eXBlOwotCQkJfSBlbHNlIGlmIChkc3RfcmVnX3R5cGUgIT0gaW5zbi0+aW1tICYmCisJCQlwcmV2X2RzdF90eXBlID0gJmVudi0+aW5zbl9hdXhfZGF0YVtpbnNuX2lkeF0ucHRyX3R5cGU7CisKKwkJCWlmICgqcHJldl9kc3RfdHlwZSA9PSBOT1RfSU5JVCkgeworCQkJCSpwcmV2X2RzdF90eXBlID0gZHN0X3JlZ190eXBlOworCQkJfSBlbHNlIGlmIChkc3RfcmVnX3R5cGUgIT0gKnByZXZfZHN0X3R5cGUgJiYKIAkJCQkgICAoZHN0X3JlZ190eXBlID09IFBUUl9UT19DVFggfHwKLQkJCQkgICAgaW5zbi0+aW1tID09IFBUUl9UT19DVFgpKSB7CisJCQkJICAgICpwcmV2X2RzdF90eXBlID09IFBUUl9UT19DVFgpKSB7CiAJCQkJdmVyYm9zZSgic2FtZSBpbnNuIGNhbm5vdCBiZSB1c2VkIHdpdGggZGlmZmVyZW50IHBvaW50ZXJzXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KQEAgLTI0NzEsNiArMjgwMSw3IEBACiAJCQkJdmVyYm9zZSgiaW52YWxpZCBCUEZfTEQgbW9kZVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CisJCQlyZXNldF9yZWdfcmFuZ2VfdmFsdWVzKHJlZ3MsIGluc24tPmRzdF9yZWcpOwogCQl9IGVsc2UgewogCQkJdmVyYm9zZSgidW5rbm93biBpbnNuIGNsYXNzICVkXG4iLCBjbGFzcyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI0ODMsMTQgKzI4MTQsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjaGVja19tYXBfcHJvZ19jb21wYXRpYmlsaXR5KHN0cnVjdCBicGZfbWFwICptYXAsCisJCQkJCXN0cnVjdCBicGZfcHJvZyAqcHJvZykKKworeworCWlmIChwcm9nLT50eXBlID09IEJQRl9QUk9HX1RZUEVfUEVSRl9FVkVOVCAmJgorCSAgICAobWFwLT5tYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfSEFTSCB8fAorCSAgICAgbWFwLT5tYXBfdHlwZSA9PSBCUEZfTUFQX1RZUEVfUEVSQ1BVX0hBU0gpICYmCisJICAgIChtYXAtPm1hcF9mbGFncyAmIEJQRl9GX05PX1BSRUFMTE9DKSkgeworCQl2ZXJib3NlKCJwZXJmX2V2ZW50IHByb2dyYW1zIGNhbiBvbmx5IHVzZSBwcmVhbGxvY2F0ZWQgaGFzaCBtYXBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qIGxvb2sgZm9yIHBzZXVkbyBlQlBGIGluc3RydWN0aW9ucyB0aGF0IGFjY2VzcyBtYXAgRkRzIGFuZAogICogcmVwbGFjZSB0aGVtIHdpdGggYWN0dWFsIG1hcCBwb2ludGVycwogICovCi1zdGF0aWMgaW50IHJlcGxhY2VfbWFwX2ZkX3dpdGhfbWFwX3B0cihzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYpCitzdGF0aWMgaW50IHJlcGxhY2VfbWFwX2ZkX3dpdGhfbWFwX3B0cihzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogewogCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGVudi0+cHJvZy0+aW5zbnNpOwogCWludCBpbnNuX2NudCA9IGVudi0+cHJvZy0+bGVuOwotCWludCBpLCBqOworCWludCBpLCBqLCBlcnI7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbl9jbnQ7IGkrKywgaW5zbisrKSB7CiAJCWlmIChCUEZfQ0xBU1MoaW5zbi0+Y29kZSkgPT0gQlBGX0xEWCAmJgpAQCAtMjUzNCw2ICsyODc5LDEyIEBACiAJCQkJcmV0dXJuIFBUUl9FUlIobWFwKTsKIAkJCX0KIAorCQkJZXJyID0gY2hlY2tfbWFwX3Byb2dfY29tcGF0aWJpbGl0eShtYXAsIGVudi0+cHJvZyk7CisJCQlpZiAoZXJyKSB7CisJCQkJZmRwdXQoZik7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwogCQkJLyogc3RvcmUgbWFwIHBvaW50ZXIgaW5zaWRlIEJQRl9MRF9JTU02NCBpbnN0cnVjdGlvbiAqLwogCQkJaW5zblswXS5pbW0gPSAodTMyKSAodW5zaWduZWQgbG9uZykgbWFwOwogCQkJaW5zblsxXS5pbW0gPSAoKHU2NCkgKHVuc2lnbmVkIGxvbmcpIG1hcCkgPj4gMzI7CkBAIC0yNTc3LDcgKzI5MjgsNyBAQAogfQogCiAvKiBkcm9wIHJlZmNudCBvZiBtYXBzIHVzZWQgYnkgdGhlIHJlamVjdGVkIHByb2dyYW0gKi8KLXN0YXRpYyB2b2lkIHJlbGVhc2VfbWFwcyhzdHJ1Y3QgdmVyaWZpZXJfZW52ICplbnYpCitzdGF0aWMgdm9pZCByZWxlYXNlX21hcHMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIHsKIAlpbnQgaTsKIApAQCAtMjU4Niw3ICsyOTM3LDcgQEAKIH0KIAogLyogY29udmVydCBwc2V1ZG8gQlBGX0xEX0lNTTY0IGludG8gZ2VuZXJpYyBCUEZfTERfSU1NNjQgKi8KLXN0YXRpYyB2b2lkIGNvbnZlcnRfcHNldWRvX2xkX2ltbTY0KHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudikKK3N0YXRpYyB2b2lkIGNvbnZlcnRfcHNldWRvX2xkX2ltbTY0KHN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnYpCiB7CiAJc3RydWN0IGJwZl9pbnNuICppbnNuID0gZW52LT5wcm9nLT5pbnNuc2k7CiAJaW50IGluc25fY250ID0gZW52LT5wcm9nLT5sZW47CkBAIC0yNjAwLDYyICsyOTUxLDc0IEBACiAvKiBjb252ZXJ0IGxvYWQgaW5zdHJ1Y3Rpb25zIHRoYXQgYWNjZXNzIGZpZWxkcyBvZiAnc3RydWN0IF9fc2tfYnVmZicKICAqIGludG8gc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgYWNjZXNzIGZpZWxkcyBvZiAnc3RydWN0IHNrX2J1ZmYnCiAgKi8KLXN0YXRpYyBpbnQgY29udmVydF9jdHhfYWNjZXNzZXMoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52KQorc3RhdGljIGludCBjb252ZXJ0X2N0eF9hY2Nlc3NlcyhzdHJ1Y3QgYnBmX3ZlcmlmaWVyX2VudiAqZW52KQogewotCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGVudi0+cHJvZy0+aW5zbnNpOwotCWludCBpbnNuX2NudCA9IGVudi0+cHJvZy0+bGVuOwotCXN0cnVjdCBicGZfaW5zbiBpbnNuX2J1ZlsxNl07CisJY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgKm9wcyA9IGVudi0+cHJvZy0+YXV4LT5vcHM7CisJY29uc3QgaW50IGluc25fY250ID0gZW52LT5wcm9nLT5sZW47CisJc3RydWN0IGJwZl9pbnNuIGluc25fYnVmWzE2XSwgKmluc247CiAJc3RydWN0IGJwZl9wcm9nICpuZXdfcHJvZzsKIAllbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlOwotCWludCBpOworCWludCBpLCBjbnQsIGRlbHRhID0gMDsKIAotCWlmICghZW52LT5wcm9nLT5hdXgtPm9wcy0+Y29udmVydF9jdHhfYWNjZXNzKQorCWlmIChvcHMtPmdlbl9wcm9sb2d1ZSkgeworCQljbnQgPSBvcHMtPmdlbl9wcm9sb2d1ZShpbnNuX2J1ZiwgZW52LT5zZWVuX2RpcmVjdF93cml0ZSwKKwkJCQkJZW52LT5wcm9nKTsKKwkJaWYgKGNudCA+PSBBUlJBWV9TSVpFKGluc25fYnVmKSkgeworCQkJdmVyYm9zZSgiYnBmIHZlcmlmaWVyIGlzIG1pc2NvbmZpZ3VyZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAoY250KSB7CisJCQluZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX3NpbmdsZShlbnYtPnByb2csIDAsCisJCQkJCQkJIGluc25fYnVmLCBjbnQpOworCQkJaWYgKCFuZXdfcHJvZykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWVudi0+cHJvZyA9IG5ld19wcm9nOworCQkJZGVsdGEgKz0gY250IC0gMTsKKwkJfQorCX0KKworCWlmICghb3BzLT5jb252ZXJ0X2N0eF9hY2Nlc3MpCiAJCXJldHVybiAwOwogCi0JZm9yIChpID0gMDsgaSA8IGluc25fY250OyBpKyssIGluc24rKykgewotCQl1MzIgaW5zbl9kZWx0YSwgY250OworCWluc24gPSBlbnYtPnByb2ctPmluc25zaSArIGRlbHRhOwogCi0JCWlmIChpbnNuLT5jb2RlID09IChCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XKSkKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbl9jbnQ7IGkrKywgaW5zbisrKSB7CisJCWlmIChpbnNuLT5jb2RlID09IChCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9XKSB8fAorCQkgICAgaW5zbi0+Y29kZSA9PSAoQlBGX0xEWCB8IEJQRl9NRU0gfCBCUEZfRFcpKQogCQkJdHlwZSA9IEJQRl9SRUFEOwotCQllbHNlIGlmIChpbnNuLT5jb2RlID09IChCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9XKSkKKwkJZWxzZSBpZiAoaW5zbi0+Y29kZSA9PSAoQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZfVykgfHwKKwkJCSBpbnNuLT5jb2RlID09IChCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9EVykpCiAJCQl0eXBlID0gQlBGX1dSSVRFOwogCQllbHNlCiAJCQljb250aW51ZTsKIAotCQlpZiAoaW5zbi0+aW1tICE9IFBUUl9UT19DVFgpIHsKLQkJCS8qIGNsZWFyIGludGVybmFsIG1hcmsgKi8KLQkJCWluc24tPmltbSA9IDA7CisJCWlmIChlbnYtPmluc25fYXV4X2RhdGFbaV0ucHRyX3R5cGUgIT0gUFRSX1RPX0NUWCkKIAkJCWNvbnRpbnVlOwotCQl9CiAKLQkJY250ID0gZW52LT5wcm9nLT5hdXgtPm9wcy0+Ci0JCQljb252ZXJ0X2N0eF9hY2Nlc3ModHlwZSwgaW5zbi0+ZHN0X3JlZywgaW5zbi0+c3JjX3JlZywKLQkJCQkJICAgaW5zbi0+b2ZmLCBpbnNuX2J1ZiwgZW52LT5wcm9nKTsKKwkJY250ID0gb3BzLT5jb252ZXJ0X2N0eF9hY2Nlc3ModHlwZSwgaW5zbi0+ZHN0X3JlZywgaW5zbi0+c3JjX3JlZywKKwkJCQkJICAgICAgaW5zbi0+b2ZmLCBpbnNuX2J1ZiwgZW52LT5wcm9nKTsKIAkJaWYgKGNudCA9PSAwIHx8IGNudCA+PSBBUlJBWV9TSVpFKGluc25fYnVmKSkgewogCQkJdmVyYm9zZSgiYnBmIHZlcmlmaWVyIGlzIG1pc2NvbmZpZ3VyZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQluZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX3NpbmdsZShlbnYtPnByb2csIGksIGluc25fYnVmLCBjbnQpOworCQluZXdfcHJvZyA9IGJwZl9wYXRjaF9pbnNuX3NpbmdsZShlbnYtPnByb2csIGkgKyBkZWx0YSwgaW5zbl9idWYsCisJCQkJCQkgY250KTsKIAkJaWYgKCFuZXdfcHJvZykKIAkJCXJldHVybiAtRU5PTUVNOwogCi0JCWluc25fZGVsdGEgPSBjbnQgLSAxOworCQlkZWx0YSArPSBjbnQgLSAxOwogCiAJCS8qIGtlZXAgd2Fsa2luZyBuZXcgcHJvZ3JhbSBhbmQgc2tpcCBpbnNucyB3ZSBqdXN0IGluc2VydGVkICovCiAJCWVudi0+cHJvZyA9IG5ld19wcm9nOwotCQlpbnNuICAgICAgPSBuZXdfcHJvZy0+aW5zbnNpICsgaSArIGluc25fZGVsdGE7Ci0KLQkJaW5zbl9jbnQgKz0gaW5zbl9kZWx0YTsKLQkJaSAgICAgICAgKz0gaW5zbl9kZWx0YTsKKwkJaW5zbiAgICAgID0gbmV3X3Byb2ctPmluc25zaSArIGkgKyBkZWx0YTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9zdGF0ZXMoc3RydWN0IHZlcmlmaWVyX2VudiAqZW52KQorc3RhdGljIHZvaWQgZnJlZV9zdGF0ZXMoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudikKIHsKLQlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqc2wsICpzbG47CisJc3RydWN0IGJwZl92ZXJpZmllcl9zdGF0ZV9saXN0ICpzbCwgKnNsbjsKIAlpbnQgaTsKIAogCWlmICghZW52LT5leHBsb3JlZF9zdGF0ZXMpCkBAIC0yNjc4LDE5ICszMDQxLDI0IEBACiBpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyKQogewogCWNoYXIgX191c2VyICpsb2dfdWJ1ZiA9IE5VTEw7Ci0Jc3RydWN0IHZlcmlmaWVyX2VudiAqZW52OworCXN0cnVjdCBicGZfdmVyaWZpZXJfZW52ICplbnY7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKIAlpZiAoKCpwcm9nKS0+bGVuIDw9IDAgfHwgKCpwcm9nKS0+bGVuID4gQlBGX01BWElOU05TKQogCQlyZXR1cm4gLUUyQklHOwogCi0JLyogJ3N0cnVjdCB2ZXJpZmllcl9lbnYnIGNhbiBiZSBnbG9iYWwsIGJ1dCBzaW5jZSBpdCdzIG5vdCBzbWFsbCwKKwkvKiAnc3RydWN0IGJwZl92ZXJpZmllcl9lbnYnIGNhbiBiZSBnbG9iYWwsIGJ1dCBzaW5jZSBpdCdzIG5vdCBzbWFsbCwKIAkgKiBhbGxvY2F0ZS9mcmVlIGl0IGV2ZXJ5IHRpbWUgYnBmX2NoZWNrKCkgaXMgY2FsbGVkCiAJICovCi0JZW52ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZlcmlmaWVyX2VudiksIEdGUF9LRVJORUwpOworCWVudiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicGZfdmVyaWZpZXJfZW52KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbnYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZW52LT5pbnNuX2F1eF9kYXRhID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IGJwZl9pbnNuX2F1eF9kYXRhKSAqCisJCQkJICAgICAoKnByb2cpLT5sZW4pOworCXJldCA9IC1FTk9NRU07CisJaWYgKCFlbnYtPmluc25fYXV4X2RhdGEpCisJCWdvdG8gZXJyX2ZyZWVfZW52OwogCWVudi0+cHJvZyA9ICpwcm9nOwogCiAJLyogZ3JhYiB0aGUgbXV0ZXggdG8gcHJvdGVjdCBmZXcgZ2xvYmFscyB1c2VkIGJ5IHZlcmlmaWVyICovCkBAIC0yNzA5LDEyICszMDc3LDEyIEBACiAJCS8qIGxvZ18qIHZhbHVlcyBoYXZlIHRvIGJlIHNhbmUgKi8KIAkJaWYgKGxvZ19zaXplIDwgMTI4IHx8IGxvZ19zaXplID4gVUlOVF9NQVggPj4gOCB8fAogCQkgICAgbG9nX2xldmVsID09IDAgfHwgbG9nX3VidWYgPT0gTlVMTCkKLQkJCWdvdG8gZnJlZV9lbnY7CisJCQlnb3RvIGVycl91bmxvY2s7CiAKIAkJcmV0ID0gLUVOT01FTTsKIAkJbG9nX2J1ZiA9IHZtYWxsb2MobG9nX3NpemUpOwogCQlpZiAoIWxvZ19idWYpCi0JCQlnb3RvIGZyZWVfZW52OworCQkJZ290byBlcnJfdW5sb2NrOwogCX0gZWxzZSB7CiAJCWxvZ19sZXZlbCA9IDA7CiAJfQpAQCAtMjcyNCw3ICszMDkyLDcgQEAKIAkJZ290byBza2lwX2Z1bGxfY2hlY2s7CiAKIAllbnYtPmV4cGxvcmVkX3N0YXRlcyA9IGtjYWxsb2MoZW52LT5wcm9nLT5sZW4sCi0JCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqKSwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBicGZfdmVyaWZpZXJfc3RhdGVfbGlzdCAqKSwKIAkJCQkgICAgICAgR0ZQX1VTRVIpOwogCXJldCA9IC1FTk9NRU07CiAJaWYgKCFlbnYtPmV4cGxvcmVkX3N0YXRlcykKQEAgLTI3ODMsMTQgKzMxNTEsNjcgQEAKIGZyZWVfbG9nX2J1ZjoKIAlpZiAobG9nX2xldmVsKQogCQl2ZnJlZShsb2dfYnVmKTsKLWZyZWVfZW52OgogCWlmICghZW52LT5wcm9nLT5hdXgtPnVzZWRfbWFwcykKIAkJLyogaWYgd2UgZGlkbid0IGNvcHkgbWFwIHBvaW50ZXJzIGludG8gYnBmX3Byb2dfaW5mbywgcmVsZWFzZQogCQkgKiB0aGVtIG5vdy4gT3RoZXJ3aXNlIGZyZWVfYnBmX3Byb2dfaW5mbygpIHdpbGwgcmVsZWFzZSB0aGVtLgogCQkgKi8KIAkJcmVsZWFzZV9tYXBzKGVudik7CiAJKnByb2cgPSBlbnYtPnByb2c7Ci0Ja2ZyZWUoZW52KTsKK2Vycl91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZicGZfdmVyaWZpZXJfbG9jayk7CisJdmZyZWUoZW52LT5pbnNuX2F1eF9kYXRhKTsKK2Vycl9mcmVlX2VudjoKKwlrZnJlZShlbnYpOwogCXJldHVybiByZXQ7CiB9CisKK2ludCBicGZfYW5hbHl6ZXIoc3RydWN0IGJwZl9wcm9nICpwcm9nLCBjb25zdCBzdHJ1Y3QgYnBmX2V4dF9hbmFseXplcl9vcHMgKm9wcywKKwkJIHZvaWQgKnByaXYpCit7CisJc3RydWN0IGJwZl92ZXJpZmllcl9lbnYgKmVudjsKKwlpbnQgcmV0OworCisJZW52ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJwZl92ZXJpZmllcl9lbnYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnYtPmluc25fYXV4X2RhdGEgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgYnBmX2luc25fYXV4X2RhdGEpICoKKwkJCQkgICAgIHByb2ctPmxlbik7CisJcmV0ID0gLUVOT01FTTsKKwlpZiAoIWVudi0+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+ZWZmZWN0aXZlX2NwdXMsIGNwdV9vbmxpbmVfbWFzayk7CiB9CiAKQEAgLTIwNjksNiArMjA4MCwyMCBAQAogCW11dGV4X3VubG9jaygmY3B1c2V0X211dGV4KTsKIH0KIAorLyoKKyAqIE1ha2Ugc3VyZSB0aGUgbmV3IHRhc2sgY29uZm9ybSB0byB0aGUgY3VycmVudCBzdGF0ZSBvZiBpdHMgcGFyZW50LAorICogd2hpY2ggY291bGQgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgY3B1c2V0IGp1c3QgYWZ0ZXIgaXQgaW5oZXJpdHMgdGhlCisgKiBzdGF0ZSBmcm9tIHRoZSBwYXJlbnQgYW5kIGJlZm9yZSBpdCBzaXRzIG9uIHRoZSBjZ3JvdXAncyB0YXNrIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIGNwdXNldF9mb3JrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlpZiAodGFza19jc3NfaXNfcm9vdCh0YXNrLCBjcHVzZXRfY2dycF9pZCkpCisJCXJldHVybjsKKworCXNldF9jcHVzX2FsbG93ZWRfcHRyKHRhc2ssICZjdXJyZW50LT5jcHVzX2FsbG93ZWQpOworCXRhc2stPm1lbXNfYWxsb3dlZCA9IGN1cnJlbnQtPm1lbXNfYWxsb3dlZDsKK30KKwogc3RydWN0IGNncm91cF9zdWJzeXMgY3B1c2V0X2NncnBfc3Vic3lzID0gewogCS5jc3NfYWxsb2MJPSBjcHVzZXRfY3NzX2FsbG9jLAogCS5jc3Nfb25saW5lCT0gY3B1c2V0X2Nzc19vbmxpbmUsCkBAIC0yMDc5LDYgKzIxMDQsNyBAQAogCS5hdHRhY2gJCT0gY3B1c2V0X2F0dGFjaCwKIAkucG9zdF9hdHRhY2gJPSBjcHVzZXRfcG9zdF9hdHRhY2gsCiAJLmJpbmQJCT0gY3B1c2V0X2JpbmQsCisJLmZvcmsJCT0gY3B1c2V0X2ZvcmssCiAJLmxlZ2FjeV9jZnR5cGVzCT0gZmlsZXMsCiAJLmVhcmx5X2luaXQJPSB0cnVlLAogfTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvY29yZS5jIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKaW5kZXggM2NmYWJkZi4uYzZlNDdlOSAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9jb3JlLmMKKysrIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKQEAgLTE0NzUsOCArMTQ3NSw3IEBACiAJaWYgKGV2ZW50LT5ncm91cF9sZWFkZXIgPT0gZXZlbnQpIHsKIAkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAotCQlpZiAoaXNfc29mdHdhcmVfZXZlbnQoZXZlbnQpKQotCQkJZXZlbnQtPmdyb3VwX2ZsYWdzIHw9IFBFUkZfR1JPVVBfU09GVFdBUkU7CisJCWV2ZW50LT5ncm91cF9jYXBzID0gZXZlbnQtPmV2ZW50X2NhcHM7CiAKIAkJbGlzdCA9IGN0eF9ncm91cF9saXN0KGV2ZW50LCBjdHgpOwogCQlsaXN0X2FkZF90YWlsKCZldmVudC0+Z3JvdXBfZW50cnksIGxpc3QpOwpAQCAtMTYzMCw5ICsxNjI5LDcgQEAKIAogCVdBUk5fT05fT05DRShncm91cF9sZWFkZXItPmN0eCAhPSBldmVudC0+Y3R4KTsKIAotCWlmIChncm91cF9sZWFkZXItPmdyb3VwX2ZsYWdzICYgUEVSRl9HUk9VUF9TT0ZUV0FSRSAmJgotCQkJIWlzX3NvZnR3YXJlX2V2ZW50KGV2ZW50KSkKLQkJZ3JvdXBfbGVhZGVyLT5ncm91cF9mbGFncyAmPSB+UEVSRl9HUk9VUF9TT0ZUV0FSRTsKKwlncm91cF9sZWFkZXItPmdyb3VwX2NhcHMgJj0gZXZlbnQtPmV2ZW50X2NhcHM7CiAKIAlsaXN0X2FkZF90YWlsKCZldmVudC0+Z3JvdXBfZW50cnksICZncm91cF9sZWFkZXItPnNpYmxpbmdfbGlzdCk7CiAJZ3JvdXBfbGVhZGVyLT5ucl9zaWJsaW5ncysrOwpAQCAtMTcyMyw3ICsxNzIwLDcgQEAKIAkJc2libGluZy0+Z3JvdXBfbGVhZGVyID0gc2libGluZzsKIAogCQkvKiBJbmhlcml0IGdyb3VwIGZsYWdzIGZyb20gdGhlIHByZXZpb3VzIGxlYWRlciAqLwotCQlzaWJsaW5nLT5ncm91cF9mbGFncyA9IGV2ZW50LT5ncm91cF9mbGFnczsKKwkJc2libGluZy0+Z3JvdXBfY2FwcyA9IGV2ZW50LT5ncm91cF9jYXBzOwogCiAJCVdBUk5fT05fT05DRShzaWJsaW5nLT5jdHggIT0gZXZlbnQtPmN0eCk7CiAJfQpAQCAtMTgzMiw2ICsxODI5LDggQEAKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQ7CiAJaW50IHN0YXRlID0gZ3JvdXBfZXZlbnQtPnN0YXRlOwogCisJcGVyZl9wbXVfZGlzYWJsZShjdHgtPnBtdSk7CisKIAlldmVudF9zY2hlZF9vdXQoZ3JvdXBfZXZlbnQsIGNwdWN0eCwgY3R4KTsKIAogCS8qCkBAIC0xODQwLDYgKzE4MzksOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZXZlbnQsICZncm91cF9ldmVudC0+c2libGluZ19saXN0LCBncm91cF9lbnRyeSkKIAkJZXZlbnRfc2NoZWRfb3V0KGV2ZW50LCBjcHVjdHgsIGN0eCk7CiAKKwlwZXJmX3BtdV9lbmFibGUoY3R4LT5wbXUpOworCiAJaWYgKHN0YXRlID09IFBFUkZfRVZFTlRfU1RBVEVfQUNUSVZFICYmIGdyb3VwX2V2ZW50LT5hdHRyLmV4Y2x1c2l2ZSkKIAkJY3B1Y3R4LT5leGNsdXNpdmUgPSAwOwogfQpAQCAtMjE0NSw3ICsyMTQ2LDcgQEAKIAkvKgogCSAqIEdyb3VwcyBjb25zaXN0aW5nIGVudGlyZWx5IG9mIHNvZnR3YXJlIGV2ZW50cyBjYW4gYWx3YXlzIGdvIG9uLgogCSAqLwotCWlmIChldmVudC0+Z3JvdXBfZmxhZ3MgJiBQRVJGX0dST1VQX1NPRlRXQVJFKQorCWlmIChldmVudC0+Z3JvdXBfY2FwcyAmIFBFUkZfRVZfQ0FQX1NPRlRXQVJFKQogCQlyZXR1cm4gMTsKIAkvKgogCSAqIElmIGFuIGV4Y2x1c2l2ZSBncm91cCBpcyBhbHJlYWR5IG9uLCBubyBvdGhlciBoYXJkd2FyZQpAQCAtMjQ5MSwxNiArMjQ5MiwxNiBAQAogCSAqIHdoaWxlIHJlc3RhcnRpbmcuCiAJICovCiAJaWYgKHNkLT5yZXN0YXJ0KQotCQlldmVudC0+cG11LT5zdGFydChldmVudCwgUEVSRl9FRl9TVEFSVCk7CisJCWV2ZW50LT5wbXUtPnN0YXJ0KGV2ZW50LCAwKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBlcmZfZXZlbnRfcmVzdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCitzdGF0aWMgaW50IHBlcmZfZXZlbnRfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCByZXN0YXJ0KQogewogCXN0cnVjdCBzdG9wX2V2ZW50X2RhdGEgc2QgPSB7CiAJCS5ldmVudAkJPSBldmVudCwKLQkJLnJlc3RhcnQJPSAxLAorCQkucmVzdGFydAk9IHJlc3RhcnQsCiAJfTsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjgzNywxOSArMjgzOCwzNiBAQAogCX0KIH0KIAorc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBsaXN0X2hlYWQsIHNjaGVkX2NiX2xpc3QpOworCiB2b2lkIHBlcmZfc2NoZWRfY2JfZGVjKHN0cnVjdCBwbXUgKnBtdSkKIHsKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gdGhpc19jcHVfcHRyKHBtdS0+cG11X2NwdV9jb250ZXh0KTsKKwogCXRoaXNfY3B1X2RlYyhwZXJmX3NjaGVkX2NiX3VzYWdlcyk7CisKKwlpZiAoIS0tY3B1Y3R4LT5zY2hlZF9jYl91c2FnZSkKKwkJbGlzdF9kZWwoJmNwdWN0eC0+c2NoZWRfY2JfZW50cnkpOwogfQogCisKIHZvaWQgcGVyZl9zY2hlZF9jYl9pbmMoc3RydWN0IHBtdSAqcG11KQogeworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSB0aGlzX2NwdV9wdHIocG11LT5wbXVfY3B1X2NvbnRleHQpOworCisJaWYgKCFjcHVjdHgtPnNjaGVkX2NiX3VzYWdlKyspCisJCWxpc3RfYWRkKCZjcHVjdHgtPnNjaGVkX2NiX2VudHJ5LCB0aGlzX2NwdV9wdHIoJnNjaGVkX2NiX2xpc3QpKTsKKwogCXRoaXNfY3B1X2luYyhwZXJmX3NjaGVkX2NiX3VzYWdlcyk7CiB9CiAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIHRoZSBjb250ZXh0IHN3aXRjaCBjYWxsYmFjayB0byB0aGUgbG93ZXIgY29kZQogICogbGF5ZXIuIEl0IGlzIGludm9rZWQgT05MWSB3aGVuIHRoZSBjb250ZXh0IHN3aXRjaCBjYWxsYmFjayBpcyBlbmFibGVkLgorICoKKyAqIFRoaXMgY2FsbGJhY2sgaXMgcmVsZXZhbnQgZXZlbiB0byBwZXItY3B1IGV2ZW50czsgZm9yIGV4YW1wbGUgbXVsdGkgZXZlbnQKKyAqIFBFQlMgcmVxdWlyZXMgdGhpcyB0byBwcm92aWRlIFBJRC9USUQgaW5mb3JtYXRpb24uIFRoaXMgcmVxdWlyZXMgd2UgZmx1c2gKKyAqIGFsbCBxdWV1ZWQgUEVCUyByZWNvcmRzIGJlZm9yZSB3ZSBjb250ZXh0IHN3aXRjaCB0byBhIG5ldyB0YXNrLgogICovCiBzdGF0aWMgdm9pZCBwZXJmX3BtdV9zY2hlZF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKIAkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQsCkBAIC0yODU3LDM0ICsyODc1LDI0IEBACiB7CiAJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eDsKIAlzdHJ1Y3QgcG11ICpwbXU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChwcmV2ID09IG5leHQpCiAJCXJldHVybjsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwdWN0eCwgdGhpc19jcHVfcHRyKCZzY2hlZF9jYl9saXN0KSwgc2NoZWRfY2JfZW50cnkpIHsKKwkJcG11ID0gY3B1Y3R4LT51bmlxdWVfcG11OyAvKiBzb2Z0d2FyZSBQTVVzIHdpbGwgbm90IGhhdmUgc2NoZWRfdGFzayAqLwogCi0JcmN1X3JlYWRfbG9jaygpOworCQlpZiAoV0FSTl9PTl9PTkNFKCFwbXUtPnNjaGVkX3Rhc2spKQorCQkJY29udGludWU7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwbXUsICZwbXVzLCBlbnRyeSkgewotCQlpZiAocG11LT5zY2hlZF90YXNrKSB7Ci0JCQljcHVjdHggPSB0aGlzX2NwdV9wdHIocG11LT5wbXVfY3B1X2NvbnRleHQpOworCQlwZXJmX2N0eF9sb2NrKGNwdWN0eCwgY3B1Y3R4LT50YXNrX2N0eCk7CisJCXBlcmZfcG11X2Rpc2FibGUocG11KTsKIAotCQkJcGVyZl9jdHhfbG9jayhjcHVjdHgsIGNwdWN0eC0+dGFza19jdHgpOworCQlwbXUtPnNjaGVkX3Rhc2soY3B1Y3R4LT50YXNrX2N0eCwgc2NoZWRfaW4pOwogCi0JCQlwZXJmX3BtdV9kaXNhYmxlKHBtdSk7Ci0KLQkJCXBtdS0+c2NoZWRfdGFzayhjcHVjdHgtPnRhc2tfY3R4LCBzY2hlZF9pbik7Ci0KLQkJCXBlcmZfcG11X2VuYWJsZShwbXUpOwotCi0JCQlwZXJmX2N0eF91bmxvY2soY3B1Y3R4LCBjcHVjdHgtPnRhc2tfY3R4KTsKLQkJfQorCQlwZXJmX3BtdV9lbmFibGUocG11KTsKKwkJcGVyZl9jdHhfdW5sb2NrKGNwdWN0eCwgY3B1Y3R4LT50YXNrX2N0eCk7CiAJfQotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKQEAgLTM0MTYsNiArMzQyNCwyMiBAQAogCWludCByZXQ7CiB9OwogCitzdGF0aWMgaW50IGZpbmRfY3B1X3RvX3JlYWQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbG9jYWxfY3B1KQoreworCWludCBldmVudF9jcHUgPSBldmVudC0+b25jcHU7CisJdTE2IGxvY2FsX3BrZywgZXZlbnRfcGtnOworCisJaWYgKGV2ZW50LT5ncm91cF9jYXBzICYgUEVSRl9FVl9DQVBfUkVBRF9BQ1RJVkVfUEtHKSB7CisJCWV2ZW50X3BrZyA9ICB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGV2ZW50X2NwdSk7CisJCWxvY2FsX3BrZyA9ICB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGxvY2FsX2NwdSk7CisKKwkJaWYgKGV2ZW50X3BrZyA9PSBsb2NhbF9wa2cpCisJCQlyZXR1cm4gbG9jYWxfY3B1OworCX0KKworCXJldHVybiBldmVudF9jcHU7Cit9CisKIC8qCiAgKiBDcm9zcyBDUFUgY2FsbCB0byByZWFkIHRoZSBoYXJkd2FyZSBldmVudAogICovCkBAIC0zNTM3LDcgKzM1NjEsNyBAQAogCiBzdGF0aWMgaW50IHBlcmZfZXZlbnRfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGJvb2wgZ3JvdXApCiB7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IDAsIGNwdV90b19yZWFkLCBsb2NhbF9jcHU7CiAKIAkvKgogCSAqIElmIGV2ZW50IGlzIGVuYWJsZWQgYW5kIGN1cnJlbnRseSBhY3RpdmUgb24gYSBDUFUsIHVwZGF0ZSB0aGUKQEAgLTM1NDksMTAgKzM1NzMsMjMgQEAKIAkJCS5ncm91cCA9IGdyb3VwLAogCQkJLnJldCA9IDAsCiAJCX07Ci0JCXJldCA9IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShldmVudC0+b25jcHUsIF9fcGVyZl9ldmVudF9yZWFkLCAmZGF0YSwgMSk7Ci0JCS8qIFRoZSBldmVudCBtdXN0IGhhdmUgYmVlbiByZWFkIGZyb20gYW4gb25saW5lIENQVTogKi8KLQkJV0FSTl9PTl9PTkNFKHJldCk7Ci0JCXJldCA9IHJldCA/IDogZGF0YS5yZXQ7CisKKwkJbG9jYWxfY3B1ID0gZ2V0X2NwdSgpOworCQljcHVfdG9fcmVhZCA9IGZpbmRfY3B1X3RvX3JlYWQoZXZlbnQsIGxvY2FsX2NwdSk7CisJCXB1dF9jcHUoKTsKKworCQkvKgorCQkgKiBQdXJwb3NlbHkgaWdub3JlIHRoZSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoKSByZXR1cm4KKwkJICogdmFsdWUuCisJCSAqCisJCSAqIElmIGV2ZW50LT5vbmNwdSBpc24ndCBhIHZhbGlkIENQVSBpdCBtZWFucyB0aGUgZXZlbnQgZ290CisJCSAqIHNjaGVkdWxlZCBvdXQgYW5kIHRoYXQgd2lsbCBoYXZlIHVwZGF0ZWQgdGhlIGV2ZW50IGNvdW50LgorCQkgKgorCQkgKiBUaGVyZWZvcmUsIGVpdGhlciB3YXksIHdlJ2xsIGhhdmUgYW4gdXAtdG8tZGF0ZSBldmVudCBjb3VudAorCQkgKiBhZnRlciB0aGlzLgorCQkgKi8KKwkJKHZvaWQpc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdV90b19yZWFkLCBfX3BlcmZfZXZlbnRfcmVhZCwgJmRhdGEsIDEpOworCQlyZXQgPSBkYXRhLnJldDsKIAl9IGVsc2UgaWYgKGV2ZW50LT5zdGF0ZSA9PSBQRVJGX0VWRU5UX1NUQVRFX0lOQUNUSVZFKSB7CiAJCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCA9IGV2ZW50LT5jdHg7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zOTIxLDcgKzM5NTgsNyBAQAogCiBzdGF0aWMgYm9vbCBleGNsdXNpdmVfZXZlbnRfbWF0Y2goc3RydWN0IHBlcmZfZXZlbnQgKmUxLCBzdHJ1Y3QgcGVyZl9ldmVudCAqZTIpCiB7Ci0JaWYgKChlMS0+cG11LT5jYXBhYmlsaXRpZXMgJiBQRVJGX1BNVV9DQVBfRVhDTFVTSVZFKSAmJgorCWlmICgoZTEtPnBtdSA9PSBlMi0+cG11KSAmJgogCSAgICAoZTEtPmNwdSA9PSBlMi0+Y3B1IHx8CiAJICAgICBlMS0+Y3B1ID09IC0xIHx8CiAJICAgICBlMi0+Y3B1ID09IC0xKSkKQEAgLTQ4MzcsNiArNDg3NCwxOSBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyYi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwogCX0KIAorCS8qCisJICogQXZvaWQgcmFjaW5nIHdpdGggcGVyZl9tbWFwX2Nsb3NlKEFVWCk6IHN0b3AgdGhlIGV2ZW50CisJICogYmVmb3JlIHN3aXp6bGluZyB0aGUgZXZlbnQ6OnJiIHBvaW50ZXI7IGlmIGl0J3MgZ2V0dGluZworCSAqIHVubWFwcGVkLCBpdHMgYXV4X21tYXBfY291bnQgd2lsbCBiZSAwIGFuZCBpdCB3b24ndAorCSAqIHJlc3RhcnQuIFNlZSB0aGUgY29tbWVudCBpbiBfX3BlcmZfcG11X291dHB1dF9zdG9wKCkuCisJICoKKwkgKiBEYXRhIHdpbGwgaW5ldml0YWJseSBiZSBsb3N0IHdoZW4gc2V0X291dHB1dCBpcyBkb25lIGluCisJICogbWlkLWFpciwgYnV0IHRoZW4gYWdhaW4sIHdob2V2ZXIgZG9lcyBpdCBsaWtlIHRoaXMgaXMKKwkgKiBub3QgaW4gZm9yIHRoZSBkYXRhIGFueXdheS4KKwkgKi8KKwlpZiAoaGFzX2F1eChldmVudCkpCisJCXBlcmZfZXZlbnRfc3RvcChldmVudCwgMCk7CisKIAlyY3VfYXNzaWduX3BvaW50ZXIoZXZlbnQtPnJiLCByYik7CiAKIAlpZiAob2xkX3JiKSB7CkBAIC01MzI5LDkgKzUzNzksMTAgQEAKIAkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCB1NjQgbWFzaykKIHsKIAlpbnQgYml0OworCURFQ0xBUkVfQklUTUFQKF9tYXNrLCA2NCk7CiAKLQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgKGNvbnN0IHVuc2lnbmVkIGxvbmcgKikgJm1hc2ssCi0JCQkgc2l6ZW9mKG1hc2spICogQklUU19QRVJfQllURSkgeworCWJpdG1hcF9mcm9tX3U2NChfbWFzaywgbWFzayk7CisJZm9yX2VhY2hfc2V0X2JpdChiaXQsIF9tYXNrLCBzaXplb2YobWFzaykgKiBCSVRTX1BFUl9CWVRFKSB7CiAJCXU2NCB2YWw7CiAKIAkJdmFsID0gcGVyZl9yZWdfdmFsdWUocmVncywgYml0KTsKQEAgLTYxMTIsNyArNjE2Myw3IEBACiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlmaC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKHJlc3RhcnQpCi0JCXBlcmZfZXZlbnRfcmVzdGFydChldmVudCk7CisJCXBlcmZfZXZlbnRfc3RvcChldmVudCwgMSk7CiB9CiAKIHZvaWQgcGVyZl9ldmVudF9leGVjKHZvaWQpCkBAIC02MTU2LDcgKzYyMDcsMTMgQEAKIAogCS8qCiAJICogSW4gY2FzZSBvZiBpbmhlcml0YW5jZSwgaXQgd2lsbCBiZSB0aGUgcGFyZW50IHRoYXQgbGlua3MgdG8gdGhlCi0JICogcmluZy1idWZmZXIsIGJ1dCBpdCB3aWxsIGJlIHRoZSBjaGlsZCB0aGF0J3MgYWN0dWFsbHkgdXNpbmcgaXQ6CisJICogcmluZy1idWZmZXIsIGJ1dCBpdCB3aWxsIGJlIHRoZSBjaGlsZCB0aGF0J3MgYWN0dWFsbHkgdXNpbmcgaXQuCisJICoKKwkgKiBXZSBhcmUgdXNpbmcgZXZlbnQ6OnJiIHRvIGRldGVybWluZSBpZiB0aGUgZXZlbnQgc2hvdWxkIGJlIHN0b3BwZWQsCisJICogaG93ZXZlciB0aGlzIG1heSByYWNlIHdpdGggcmluZ19idWZmZXJfYXR0YWNoKCkgKHRocm91Z2ggc2V0X291dHB1dCksCisJICogd2hpY2ggd2lsbCBtYWtlIHVzIHNraXAgdGhlIGV2ZW50IHRoYXQgYWN0dWFsbHkgbmVlZHMgdG8gYmUgc3RvcHBlZC4KKwkgKiBTbyByaW5nX2J1ZmZlcl9hdHRhY2goKSBoYXMgdG8gc3RvcCBhbiBhdXggZXZlbnQgYmVmb3JlIHJlLWFzc2lnbmluZworCSAqIGl0cyByYiBwb2ludGVyLgogCSAqLwogCWlmIChyY3VfZGVyZWZlcmVuY2UocGFyZW50LT5yYikgPT0gcmIpCiAJCXJvLT5lcnIgPSBfX3BlcmZfZXZlbnRfc3RvcCgmc2QpOwpAQCAtNjY3MCw3ICs2NzI3LDcgQEAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWZoLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAocmVzdGFydCkKLQkJcGVyZl9ldmVudF9yZXN0YXJ0KGV2ZW50KTsKKwkJcGVyZl9ldmVudF9zdG9wKGV2ZW50LCAxKTsKIH0KIAogLyoKQEAgLTcwMjIsNyArNzA3OSw3IEBACiAJCWlycV93b3JrX3F1ZXVlKCZldmVudC0+cGVuZGluZyk7CiAJfQogCi0JZXZlbnQtPm92ZXJmbG93X2hhbmRsZXIoZXZlbnQsIGRhdGEsIHJlZ3MpOworCVJFQURfT05DRShldmVudC0+b3ZlcmZsb3dfaGFuZGxlcikoZXZlbnQsIGRhdGEsIHJlZ3MpOwogCiAJaWYgKCpwZXJmX2V2ZW50X2Zhc3luYyhldmVudCkgJiYgZXZlbnQtPnBlbmRpbmdfa2lsbCkgewogCQlldmVudC0+cGVuZGluZ193YWtldXAgPSAxOwpAQCAtNzYzNywxMSArNzY5NCw4MyBAQAogCWZ0cmFjZV9wcm9maWxlX2ZyZWVfZmlsdGVyKGV2ZW50KTsKIH0KIAorI2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTAorc3RhdGljIHZvaWQgYnBmX292ZXJmbG93X2hhbmRsZXIoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJCSBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSwKKwkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGFfa2VybiBjdHggPSB7CisJCS5kYXRhID0gZGF0YSwKKwkJLnJlZ3MgPSByZWdzLAorCX07CisJaW50IHJldCA9IDA7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlpZiAodW5saWtlbHkoX190aGlzX2NwdV9pbmNfcmV0dXJuKGJwZl9wcm9nX2FjdGl2ZSkgIT0gMSkpCisJCWdvdG8gb3V0OworCXJjdV9yZWFkX2xvY2soKTsKKwlyZXQgPSBCUEZfUFJPR19SVU4oZXZlbnQtPnByb2csICh2b2lkICopJmN0eCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CitvdXQ6CisJX190aGlzX2NwdV9kZWMoYnBmX3Byb2dfYWN0aXZlKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworCWlmICghcmV0KQorCQlyZXR1cm47CisKKwlldmVudC0+b3JpZ19vdmVyZmxvd19oYW5kbGVyKGV2ZW50LCBkYXRhLCByZWdzKTsKK30KKworc3RhdGljIGludCBwZXJmX2V2ZW50X3NldF9icGZfaGFuZGxlcihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIHUzMiBwcm9nX2ZkKQoreworCXN0cnVjdCBicGZfcHJvZyAqcHJvZzsKKworCWlmIChldmVudC0+b3ZlcmZsb3dfaGFuZGxlcl9jb250ZXh0KQorCQkvKiBodyBicmVha3BvaW50IG9yIGtlcm5lbCBjb3VudGVyICovCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGV2ZW50LT5wcm9nKQorCQlyZXR1cm4gLUVFWElTVDsKKworCXByb2cgPSBicGZfcHJvZ19nZXRfdHlwZShwcm9nX2ZkLCBCUEZfUFJPR19UWVBFX1BFUkZfRVZFTlQpOworCWlmIChJU19FUlIocHJvZykpCisJCXJldHVybiBQVFJfRVJSKHByb2cpOworCisJZXZlbnQtPnByb2cgPSBwcm9nOworCWV2ZW50LT5vcmlnX292ZXJmbG93X2hhbmRsZXIgPSBSRUFEX09OQ0UoZXZlbnQtPm92ZXJmbG93X2hhbmRsZXIpOworCVdSSVRFX09OQ0UoZXZlbnQtPm92ZXJmbG93X2hhbmRsZXIsIGJwZl9vdmVyZmxvd19oYW5kbGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGVyZl9ldmVudF9mcmVlX2JwZl9oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2cgPSBldmVudC0+cHJvZzsKKworCWlmICghcHJvZykKKwkJcmV0dXJuOworCisJV1JJVEVfT05DRShldmVudC0+b3ZlcmZsb3dfaGFuZGxlciwgZXZlbnQtPm9yaWdfb3ZlcmZsb3dfaGFuZGxlcik7CisJZXZlbnQtPnByb2cgPSBOVUxMOworCWJwZl9wcm9nX3B1dChwcm9nKTsKK30KKyNlbHNlCitzdGF0aWMgaW50IHBlcmZfZXZlbnRfc2V0X2JwZl9oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdTMyIHByb2dfZmQpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorc3RhdGljIHZvaWQgcGVyZl9ldmVudF9mcmVlX2JwZl9oYW5kbGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50IHBlcmZfZXZlbnRfc2V0X2JwZl9wcm9nKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdTMyIHByb2dfZmQpCiB7CiAJYm9vbCBpc19rcHJvYmUsIGlzX3RyYWNlcG9pbnQ7CiAJc3RydWN0IGJwZl9wcm9nICpwcm9nOwogCisJaWYgKGV2ZW50LT5hdHRyLnR5cGUgPT0gUEVSRl9UWVBFX0hBUkRXQVJFIHx8CisJICAgIGV2ZW50LT5hdHRyLnR5cGUgPT0gUEVSRl9UWVBFX1NPRlRXQVJFKQorCQlyZXR1cm4gcGVyZl9ldmVudF9zZXRfYnBmX2hhbmRsZXIoZXZlbnQsIHByb2dfZmQpOworCiAJaWYgKGV2ZW50LT5hdHRyLnR5cGUgIT0gUEVSRl9UWVBFX1RSQUNFUE9JTlQpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC03NjgyLDYgKzc4MTEsOCBAQAogewogCXN0cnVjdCBicGZfcHJvZyAqcHJvZzsKIAorCXBlcmZfZXZlbnRfZnJlZV9icGZfaGFuZGxlcihldmVudCk7CisKIAlpZiAoIWV2ZW50LT50cF9ldmVudCkKIAkJcmV0dXJuOwogCkBAIC03ODU5LDcgKzc5OTAsNyBAQAogCW1tcHV0KG1tKTsKIAogcmVzdGFydDoKLQlwZXJmX2V2ZW50X3Jlc3RhcnQoZXZlbnQpOworCXBlcmZfZXZlbnRfc3RvcChldmVudCwgMSk7CiB9CiAKIC8qCkBAIC04OTk4LDYgKzkxMjksMTkgQEAKIAlpZiAoIW92ZXJmbG93X2hhbmRsZXIgJiYgcGFyZW50X2V2ZW50KSB7CiAJCW92ZXJmbG93X2hhbmRsZXIgPSBwYXJlbnRfZXZlbnQtPm92ZXJmbG93X2hhbmRsZXI7CiAJCWNvbnRleHQgPSBwYXJlbnRfZXZlbnQtPm92ZXJmbG93X2hhbmRsZXJfY29udGV4dDsKKyNpZiBkZWZpbmVkKENPTkZJR19CUEZfU1lTQ0FMTCkgJiYgZGVmaW5lZChDT05GSUdfRVZFTlRfVFJBQ0lORykKKwkJaWYgKG92ZXJmbG93X2hhbmRsZXIgPT0gYnBmX292ZXJmbG93X2hhbmRsZXIpIHsKKwkJCXN0cnVjdCBicGZfcHJvZyAqcHJvZyA9IGJwZl9wcm9nX2luYyhwYXJlbnRfZXZlbnQtPnByb2cpOworCisJCQlpZiAoSVNfRVJSKHByb2cpKSB7CisJCQkJZXJyID0gUFRSX0VSUihwcm9nKTsKKwkJCQlnb3RvIGVycl9uczsKKwkJCX0KKwkJCWV2ZW50LT5wcm9nID0gcHJvZzsKKwkJCWV2ZW50LT5vcmlnX292ZXJmbG93X2hhbmRsZXIgPQorCQkJCXBhcmVudF9ldmVudC0+b3JpZ19vdmVyZmxvd19oYW5kbGVyOworCQl9CisjZW5kaWYKIAl9CiAKIAlpZiAob3ZlcmZsb3dfaGFuZGxlcikgewpAQCAtOTQ3OCw2ICs5NjIyLDkgQEAKIAkJCWdvdG8gZXJyX2FsbG9jOwogCX0KIAorCWlmIChwbXUtPnRhc2tfY3R4X25yID09IHBlcmZfc3dfY29udGV4dCkKKwkJZXZlbnQtPmV2ZW50X2NhcHMgfD0gUEVSRl9FVl9DQVBfU09GVFdBUkU7CisKIAlpZiAoZ3JvdXBfbGVhZGVyICYmCiAJICAgIChpc19zb2Z0d2FyZV9ldmVudChldmVudCkgIT0gaXNfc29mdHdhcmVfZXZlbnQoZ3JvdXBfbGVhZGVyKSkpIHsKIAkJaWYgKGlzX3NvZnR3YXJlX2V2ZW50KGV2ZW50KSkgewpAQCAtOTQ5MSw3ICs5NjM4LDcgQEAKIAkJCSAqLwogCQkJcG11ID0gZ3JvdXBfbGVhZGVyLT5wbXU7CiAJCX0gZWxzZSBpZiAoaXNfc29mdHdhcmVfZXZlbnQoZ3JvdXBfbGVhZGVyKSAmJgotCQkJICAgKGdyb3VwX2xlYWRlci0+Z3JvdXBfZmxhZ3MgJiBQRVJGX0dST1VQX1NPRlRXQVJFKSkgeworCQkJICAgKGdyb3VwX2xlYWRlci0+Z3JvdXBfY2FwcyAmIFBFUkZfRVZfQ0FQX1NPRlRXQVJFKSkgewogCQkJLyoKIAkJCSAqIEluIGNhc2UgdGhlIGdyb3VwIGlzIGEgcHVyZSBzb2Z0d2FyZSBncm91cCwgYW5kIHdlCiAJCQkgKiB0cnkgdG8gYWRkIGEgaGFyZHdhcmUgZXZlbnQsIG1vdmUgdGhlIHdob2xlIGdyb3VwIHRvCkBAIC0xMDQyNiw2ICsxMDU3Myw4IEBACiAKIAkJSU5JVF9MSVNUX0hFQUQoJnBlcl9jcHUocG11X3NiX2V2ZW50cy5saXN0LCBjcHUpKTsKIAkJcmF3X3NwaW5fbG9ja19pbml0KCZwZXJfY3B1KHBtdV9zYl9ldmVudHMubG9jaywgY3B1KSk7CisKKwkJSU5JVF9MSVNUX0hFQUQoJnBlcl9jcHUoc2NoZWRfY2JfbGlzdCwgY3B1KSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvZXZlbnRzL3JpbmdfYnVmZmVyLmMgYi9rZXJuZWwvZXZlbnRzL3JpbmdfYnVmZmVyLmMKaW5kZXggYWU5YjkwZC4uMjU3ZmE0NiAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9yaW5nX2J1ZmZlci5jCisrKyBiL2tlcm5lbC9ldmVudHMvcmluZ19idWZmZXIuYwpAQCAtMzMwLDE1ICszMzAsMjIgQEAKIAlpZiAoIXJiKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmICghcmJfaGFzX2F1eChyYikgfHwgIWF0b21pY19pbmNfbm90X3plcm8oJnJiLT5hdXhfcmVmY291bnQpKQorCWlmICghcmJfaGFzX2F1eChyYikpCiAJCWdvdG8gZXJyOwogCiAJLyoKLQkgKiBJZiByYjo6YXV4X21tYXBfY291bnQgaXMgemVybyAoYW5kIHJiX2hhc19hdXgoKSBhYm92ZSB3ZW50IHRocm91Z2gpLAotCSAqIHRoZSBhdXggYnVmZmVyIGlzIGluIHBlcmZfbW1hcF9jbG9zZSgpLCBhYm91dCB0byBnZXQgZnJlZWQuCisJICogSWYgYXV4X21tYXBfY291bnQgaXMgemVybywgdGhlIGF1eCBidWZmZXIgaXMgaW4gcGVyZl9tbWFwX2Nsb3NlKCksCisJICogYWJvdXQgdG8gZ2V0IGZyZWVkLCBzbyB3ZSBsZWF2ZSBpbW1lZGlhdGVseS4KKwkgKgorCSAqIENoZWNraW5nIHJiOjphdXhfbW1hcF9jb3VudCBhbmQgcmI6OnJlZmNvdW50IGhhcyB0byBiZSBkb25lIGluCisJICogdGhlIHNhbWUgb3JkZXIsIHNlZSBwZXJmX21tYXBfY2xvc2UuIE90aGVyd2lzZSB3ZSBlbmQgdXAgZnJlZWluZworCSAqIGF1eCBwYWdlcyBpbiB0aGlzIHBhdGgsIHdoaWNoIGlzIGEgYnVnLCBiZWNhdXNlIGluX2F0b21pYygpLgogCSAqLwogCWlmICghYXRvbWljX3JlYWQoJnJiLT5hdXhfbW1hcF9jb3VudCkpCi0JCWdvdG8gZXJyX3B1dDsKKwkJZ290byBlcnI7CisKKwlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJnJiLT5hdXhfcmVmY291bnQpKQorCQlnb3RvIGVycjsKIAogCS8qCiAJICogTmVzdGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvciBBVVggYXJlYSwgbWFrZSBzdXJlIG5lc3RlZApkaWZmIC0tZ2l0IGEva2VybmVsL2V2ZW50cy91cHJvYmVzLmMgYi9rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYwppbmRleCA4YzUwMjc2Li5kNDEyOWJiIDEwMDY0NAotLS0gYS9rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYworKysgYi9rZXJuZWwvZXZlbnRzL3Vwcm9iZXMuYwpAQCAtMTUwLDcgKzE1MCw3IEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVGQVVMVCBvbiBmYWlsdXJlLgogICovCiBzdGF0aWMgaW50IF9fcmVwbGFjZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQkJc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBwYWdlICprcGFnZSkKKwkJCQlzdHJ1Y3QgcGFnZSAqb2xkX3BhZ2UsIHN0cnVjdCBwYWdlICpuZXdfcGFnZSkKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CiAJc3BpbmxvY2tfdCAqcHRsOwpAQCAtMTYxLDQ5ICsxNjEsNDkgQEAKIAljb25zdCB1bnNpZ25lZCBsb25nIG1tdW5fZW5kICAgPSBhZGRyICsgUEFHRV9TSVpFOwogCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKIAotCWVyciA9IG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZShrcGFnZSwgdm1hLT52bV9tbSwgR0ZQX0tFUk5FTCwgJm1lbWNnLAorCWVyciA9IG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZShuZXdfcGFnZSwgdm1hLT52bV9tbSwgR0ZQX0tFUk5FTCwgJm1lbWNnLAogCQkJZmFsc2UpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKIAkvKiBGb3IgdHJ5X3RvX2ZyZWVfc3dhcCgpIGFuZCBtdW5sb2NrX3ZtYV9wYWdlKCkgYmVsb3cgKi8KLQlsb2NrX3BhZ2UocGFnZSk7CisJbG9ja19wYWdlKG9sZF9wYWdlKTsKIAogCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KG1tLCBtbXVuX3N0YXJ0LCBtbXVuX2VuZCk7CiAJZXJyID0gLUVBR0FJTjsKLQlwdGVwID0gcGFnZV9jaGVja19hZGRyZXNzKHBhZ2UsIG1tLCBhZGRyLCAmcHRsLCAwKTsKKwlwdGVwID0gcGFnZV9jaGVja19hZGRyZXNzKG9sZF9wYWdlLCBtbSwgYWRkciwgJnB0bCwgMCk7CiAJaWYgKCFwdGVwKSB7Ci0JCW1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZShrcGFnZSwgbWVtY2csIGZhbHNlKTsKKwkJbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKG5ld19wYWdlLCBtZW1jZywgZmFsc2UpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlnZXRfcGFnZShrcGFnZSk7Ci0JcGFnZV9hZGRfbmV3X2Fub25fcm1hcChrcGFnZSwgdm1hLCBhZGRyLCBmYWxzZSk7Ci0JbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKGtwYWdlLCBtZW1jZywgZmFsc2UsIGZhbHNlKTsKLQlscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShrcGFnZSwgdm1hKTsKKwlnZXRfcGFnZShuZXdfcGFnZSk7CisJcGFnZV9hZGRfbmV3X2Fub25fcm1hcChuZXdfcGFnZSwgdm1hLCBhZGRyLCBmYWxzZSk7CisJbWVtX2Nncm91cF9jb21taXRfY2hhcmdlKG5ld19wYWdlLCBtZW1jZywgZmFsc2UsIGZhbHNlKTsKKwlscnVfY2FjaGVfYWRkX2FjdGl2ZV9vcl91bmV2aWN0YWJsZShuZXdfcGFnZSwgdm1hKTsKIAotCWlmICghUGFnZUFub24ocGFnZSkpIHsKLQkJZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShwYWdlKSk7CisJaWYgKCFQYWdlQW5vbihvbGRfcGFnZSkpIHsKKwkJZGVjX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShvbGRfcGFnZSkpOwogCQlpbmNfbW1fY291bnRlcihtbSwgTU1fQU5PTlBBR0VTKTsKIAl9CiAKIAlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkciwgcHRlX3BmbigqcHRlcCkpOwogCXB0ZXBfY2xlYXJfZmx1c2hfbm90aWZ5KHZtYSwgYWRkciwgcHRlcCk7Ci0Jc2V0X3B0ZV9hdF9ub3RpZnkobW0sIGFkZHIsIHB0ZXAsIG1rX3B0ZShrcGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpKTsKKwlzZXRfcHRlX2F0X25vdGlmeShtbSwgYWRkciwgcHRlcCwgbWtfcHRlKG5ld19wYWdlLCB2bWEtPnZtX3BhZ2VfcHJvdCkpOwogCi0JcGFnZV9yZW1vdmVfcm1hcChwYWdlLCBmYWxzZSk7Ci0JaWYgKCFwYWdlX21hcHBlZChwYWdlKSkKLQkJdHJ5X3RvX2ZyZWVfc3dhcChwYWdlKTsKKwlwYWdlX3JlbW92ZV9ybWFwKG9sZF9wYWdlLCBmYWxzZSk7CisJaWYgKCFwYWdlX21hcHBlZChvbGRfcGFnZSkpCisJCXRyeV90b19mcmVlX3N3YXAob2xkX3BhZ2UpOwogCXB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTsKIAogCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKQotCQltdW5sb2NrX3ZtYV9wYWdlKHBhZ2UpOwotCXB1dF9wYWdlKHBhZ2UpOworCQltdW5sb2NrX3ZtYV9wYWdlKG9sZF9wYWdlKTsKKwlwdXRfcGFnZShvbGRfcGFnZSk7CiAKIAllcnIgPSAwOwogIHVubG9jazoKIAltbXVfbm90aWZpZXJfaW52YWxpZGF0ZV9yYW5nZV9lbmQobW0sIG1tdW5fc3RhcnQsIG1tdW5fZW5kKTsKLQl1bmxvY2tfcGFnZShwYWdlKTsKKwl1bmxvY2tfcGFnZShvbGRfcGFnZSk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggMmY5NzRhZS4uMWUxZDkxMyAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC03MjUsNyArNzI1LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19zdGFja191c2FnZSh2b2lkKSB7fQogI2VuZGlmCiAKLXZvaWQgZG9fZXhpdChsb25nIGNvZGUpCit2b2lkIF9fbm9yZXR1cm4gZG9fZXhpdChsb25nIGNvZGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCWludCBncm91cF9kZWFkOwpAQCAtODQ4LDEyICs4NDgsNyBAQAogCVRBU0tTX1JDVShwcmVlbXB0X2VuYWJsZSgpKTsKIAlleGl0X25vdGlmeSh0c2ssIGdyb3VwX2RlYWQpOwogCXByb2NfZXhpdF9jb25uZWN0b3IodHNrKTsKLSNpZmRlZiBDT05GSUdfTlVNQQotCXRhc2tfbG9jayh0c2spOwotCW1wb2xfcHV0KHRzay0+bWVtcG9saWN5KTsKLQl0c2stPm1lbXBvbGljeSA9IE5VTEw7Ci0JdGFza191bmxvY2sodHNrKTsKLSNlbmRpZgorCW1wb2xfcHV0X3Rhc2tfcG9saWN5KHRzayk7CiAjaWZkZWYgQ09ORklHX0ZVVEVYCiAJaWYgKHVubGlrZWx5KGN1cnJlbnQtPnBpX3N0YXRlX2NhY2hlKSkKIAkJa2ZyZWUoY3VycmVudC0+cGlfc3RhdGVfY2FjaGUpOwpAQCAtODg3LDI5ICs4ODIsNyBAQAogCWV4aXRfcmN1KCk7CiAJVEFTS1NfUkNVKF9fc3JjdV9yZWFkX3VubG9jaygmdGFza3NfcmN1X2V4aXRfc3JjdSwgdGFza3NfcmN1X2kpKTsKIAotCS8qCi0JICogVGhlIHNldHRpbmcgb2YgVEFTS19SVU5OSU5HIGJ5IHRyeV90b193YWtlX3VwKCkgbWF5IGJlIGRlbGF5ZWQKLQkgKiB3aGVuIHRoZSBmb2xsb3dpbmcgdHdvIGNvbmRpdGlvbnMgYmVjb21lIHRydWUuCi0JICogICAtIFRoZXJlIGlzIHJhY2UgY29uZGl0aW9uIG9mIG1tYXBfc2VtIChJdCBpcyBhY3F1aXJlZCBieQotCSAqICAgICBleGl0X21tKCkpLCBhbmQKLQkgKiAgIC0gU01JIG9jY3VycyBiZWZvcmUgc2V0dGluZyBUQVNLX1JVTklOTkcuCi0JICogICAgIChvciBoeXBlcnZpc29yIG9mIHZpcnR1YWwgbWFjaGluZSBzd2l0Y2hlcyB0byBvdGhlciBndWVzdCkKLQkgKiAgQXMgYSByZXN1bHQsIHdlIG1heSBiZWNvbWUgVEFTS19SVU5OSU5HIGFmdGVyIGJlY29taW5nIFRBU0tfREVBRAotCSAqCi0JICogVG8gYXZvaWQgaXQsIHdlIGhhdmUgdG8gd2FpdCBmb3IgcmVsZWFzaW5nIHRzay0+cGlfbG9jayB3aGljaAotCSAqIGlzIGhlbGQgYnkgdHJ5X3RvX3dha2VfdXAoKQotCSAqLwotCXNtcF9tYigpOwotCXJhd19zcGluX3VubG9ja193YWl0KCZ0c2stPnBpX2xvY2spOwotCi0JLyogY2F1c2VzIGZpbmFsIHB1dF90YXNrX3N0cnVjdCBpbiBmaW5pc2hfdGFza19zd2l0Y2goKS4gKi8KLQl0c2stPnN0YXRlID0gVEFTS19ERUFEOwotCXRzay0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CS8qIHRlbGwgZnJlZXplciB0byBpZ25vcmUgdXMgKi8KLQlzY2hlZHVsZSgpOwotCUJVRygpOwotCS8qIEF2b2lkICJub3JldHVybiBmdW5jdGlvbiBkb2VzIHJldHVybiIuICAqLwotCWZvciAoOzspCi0JCWNwdV9yZWxheCgpOwkvKiBGb3Igd2hlbiBCVUcgaXMgbnVsbCAqLworCWRvX3Rhc2tfZGVhZCgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZG9fZXhpdCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IDUyZTcyNWQ0Li45YTA1YmQ5IDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTE1OCwxOSArMTU4LDgzIEBACiAgKiBBbGxvY2F0ZSBwYWdlcyBpZiBUSFJFQURfU0laRSBpcyA+PSBQQUdFX1NJWkUsIG90aGVyd2lzZSB1c2UgYQogICoga21lbWNhY2hlIGJhc2VkIGFsbG9jYXRvci4KICAqLwotIyBpZiBUSFJFQURfU0laRSA+PSBQQUdFX1NJWkUKLXN0YXRpYyB1bnNpZ25lZCBsb25nICphbGxvY190aHJlYWRfc3RhY2tfbm9kZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLQkJCQkJCSAgaW50IG5vZGUpCisjIGlmIFRIUkVBRF9TSVpFID49IFBBR0VfU0laRSB8fCBkZWZpbmVkKENPTkZJR19WTUFQX1NUQUNLKQorCisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKKy8qCisgKiB2bWFsbG9jKCkgaXMgYSBiaXQgc2xvdywgYW5kIGNhbGxpbmcgdmZyZWUoKSBlbm91Z2ggdGltZXMgd2lsbCBmb3JjZSBhIFRMQgorICogZmx1c2guICBUcnkgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBjYWxscyBieSBjYWNoaW5nIHN0YWNrcy4KKyAqLworI2RlZmluZSBOUl9DQUNIRURfU1RBQ0tTIDIKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgdm1fc3RydWN0ICosIGNhY2hlZF9zdGFja3NbTlJfQ0FDSEVEX1NUQUNLU10pOworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nICphbGxvY190aHJlYWRfc3RhY2tfbm9kZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IG5vZGUpCiB7CisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKKwl2b2lkICpzdGFjazsKKwlpbnQgaTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJZm9yIChpID0gMDsgaSA8IE5SX0NBQ0hFRF9TVEFDS1M7IGkrKykgeworCQlzdHJ1Y3Qgdm1fc3RydWN0ICpzID0gdGhpc19jcHVfcmVhZChjYWNoZWRfc3RhY2tzW2ldKTsKKworCQlpZiAoIXMpCisJCQljb250aW51ZTsKKwkJdGhpc19jcHVfd3JpdGUoY2FjaGVkX3N0YWNrc1tpXSwgTlVMTCk7CisKKwkJdHNrLT5zdGFja192bV9hcmVhID0gczsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCQlyZXR1cm4gcy0+YWRkcjsKKwl9CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJc3RhY2sgPSBfX3ZtYWxsb2Nfbm9kZV9yYW5nZShUSFJFQURfU0laRSwgVEhSRUFEX1NJWkUsCisJCQkJICAgICBWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCwKKwkJCQkgICAgIFRIUkVBRElORk9fR0ZQIHwgX19HRlBfSElHSE1FTSwKKwkJCQkgICAgIFBBR0VfS0VSTkVMLAorCQkJCSAgICAgMCwgbm9kZSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKworCS8qCisJICogV2UgY2FuJ3QgY2FsbCBmaW5kX3ZtX2FyZWEoKSBpbiBpbnRlcnJ1cHQgY29udGV4dCwgYW5kCisJICogZnJlZV90aHJlYWRfc3RhY2soKSBjYW4gYmUgY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0LAorCSAqIHNvIGNhY2hlIHRoZSB2bV9zdHJ1Y3QuCisJICovCisJaWYgKHN0YWNrKQorCQl0c2stPnN0YWNrX3ZtX2FyZWEgPSBmaW5kX3ZtX2FyZWEoc3RhY2spOworCXJldHVybiBzdGFjazsKKyNlbHNlCiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5vZGUsIFRIUkVBRElORk9fR0ZQLAogCQkJCQkgICAgIFRIUkVBRF9TSVpFX09SREVSKTsKIAogCXJldHVybiBwYWdlID8gcGFnZV9hZGRyZXNzKHBhZ2UpIDogTlVMTDsKKyNlbmRpZgogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZV90aHJlYWRfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2spCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV90aHJlYWRfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0JX19mcmVlX3BhZ2VzKHZpcnRfdG9fcGFnZShzdGFjayksIFRIUkVBRF9TSVpFX09SREVSKTsKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCWlmICh0YXNrX3N0YWNrX3ZtX2FyZWEodHNrKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlpbnQgaTsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWZvciAoaSA9IDA7IGkgPCBOUl9DQUNIRURfU1RBQ0tTOyBpKyspIHsKKwkJCWlmICh0aGlzX2NwdV9yZWFkKGNhY2hlZF9zdGFja3NbaV0pKQorCQkJCWNvbnRpbnVlOworCisJCQl0aGlzX2NwdV93cml0ZShjYWNoZWRfc3RhY2tzW2ldLCB0c2stPnN0YWNrX3ZtX2FyZWEpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQl2ZnJlZSh0c2stPnN0YWNrKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJX19mcmVlX3BhZ2VzKHZpcnRfdG9fcGFnZSh0c2stPnN0YWNrKSwgVEhSRUFEX1NJWkVfT1JERVIpOwogfQogIyBlbHNlCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnRocmVhZF9zdGFja19jYWNoZTsKQEAgLTE4MSw5ICsyNDUsOSBAQAogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jX25vZGUodGhyZWFkX3N0YWNrX2NhY2hlLCBUSFJFQURJTkZPX0dGUCwgbm9kZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGZyZWVfdGhyZWFkX3N0YWNrKHVuc2lnbmVkIGxvbmcgKnN0YWNrKQorc3RhdGljIHZvaWQgZnJlZV90aHJlYWRfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0Ja21lbV9jYWNoZV9mcmVlKHRocmVhZF9zdGFja19jYWNoZSwgc3RhY2spOworCWttZW1fY2FjaGVfZnJlZSh0aHJlYWRfc3RhY2tfY2FjaGUsIHRzay0+c3RhY2spOwogfQogCiB2b2lkIHRocmVhZF9zdGFja19jYWNoZV9pbml0KHZvaWQpCkBAIC0yMTMsMjQgKzI3Nyw3NiBAQAogLyogU0xBQiBjYWNoZSBmb3IgbW1fc3RydWN0IHN0cnVjdHVyZXMgKHRzay0+bW0pICovCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm1tX2NhY2hlcDsKIAotc3RhdGljIHZvaWQgYWNjb3VudF9rZXJuZWxfc3RhY2sodW5zaWduZWQgbG9uZyAqc3RhY2ssIGludCBhY2NvdW50KQorc3RhdGljIHZvaWQgYWNjb3VudF9rZXJuZWxfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBhY2NvdW50KQogewotCS8qIEFsbCBzdGFjayBwYWdlcyBhcmUgaW4gdGhlIHNhbWUgem9uZSBhbmQgYmVsb25nIHRvIHRoZSBzYW1lIG1lbWNnLiAqLwotCXN0cnVjdCBwYWdlICpmaXJzdF9wYWdlID0gdmlydF90b19wYWdlKHN0YWNrKTsKKwl2b2lkICpzdGFjayA9IHRhc2tfc3RhY2tfcGFnZSh0c2spOworCXN0cnVjdCB2bV9zdHJ1Y3QgKnZtID0gdGFza19zdGFja192bV9hcmVhKHRzayk7CiAKLQltb2Rfem9uZV9wYWdlX3N0YXRlKHBhZ2Vfem9uZShmaXJzdF9wYWdlKSwgTlJfS0VSTkVMX1NUQUNLX0tCLAotCQkJICAgIFRIUkVBRF9TSVpFIC8gMTAyNCAqIGFjY291bnQpOworCUJVSUxEX0JVR19PTihJU19FTkFCTEVEKENPTkZJR19WTUFQX1NUQUNLKSAmJiBQQUdFX1NJWkUgJSAxMDI0ICE9IDApOwogCi0JbWVtY2dfa21lbV91cGRhdGVfcGFnZV9zdGF0KAotCQlmaXJzdF9wYWdlLCBNRU1DR19LRVJORUxfU1RBQ0tfS0IsCi0JCWFjY291bnQgKiAoVEhSRUFEX1NJWkUgLyAxMDI0KSk7CisJaWYgKHZtKSB7CisJCWludCBpOworCisJCUJVR19PTih2bS0+bnJfcGFnZXMgIT0gVEhSRUFEX1NJWkUgLyBQQUdFX1NJWkUpOworCisJCWZvciAoaSA9IDA7IGkgPCBUSFJFQURfU0laRSAvIFBBR0VfU0laRTsgaSsrKSB7CisJCQltb2Rfem9uZV9wYWdlX3N0YXRlKHBhZ2Vfem9uZSh2bS0+cGFnZXNbaV0pLAorCQkJCQkgICAgTlJfS0VSTkVMX1NUQUNLX0tCLAorCQkJCQkgICAgUEFHRV9TSVpFIC8gMTAyNCAqIGFjY291bnQpOworCQl9CisKKwkJLyogQWxsIHN0YWNrIHBhZ2VzIGJlbG9uZyB0byB0aGUgc2FtZSBtZW1jZy4gKi8KKwkJbWVtY2dfa21lbV91cGRhdGVfcGFnZV9zdGF0KHZtLT5wYWdlc1swXSwgTUVNQ0dfS0VSTkVMX1NUQUNLX0tCLAorCQkJCQkgICAgYWNjb3VudCAqIChUSFJFQURfU0laRSAvIDEwMjQpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBBbGwgc3RhY2sgcGFnZXMgYXJlIGluIHRoZSBzYW1lIHpvbmUgYW5kIGJlbG9uZyB0byB0aGUKKwkJICogc2FtZSBtZW1jZy4KKwkJICovCisJCXN0cnVjdCBwYWdlICpmaXJzdF9wYWdlID0gdmlydF90b19wYWdlKHN0YWNrKTsKKworCQltb2Rfem9uZV9wYWdlX3N0YXRlKHBhZ2Vfem9uZShmaXJzdF9wYWdlKSwgTlJfS0VSTkVMX1NUQUNLX0tCLAorCQkJCSAgICBUSFJFQURfU0laRSAvIDEwMjQgKiBhY2NvdW50KTsKKworCQltZW1jZ19rbWVtX3VwZGF0ZV9wYWdlX3N0YXQoZmlyc3RfcGFnZSwgTUVNQ0dfS0VSTkVMX1NUQUNLX0tCLAorCQkJCQkgICAgYWNjb3VudCAqIChUSFJFQURfU0laRSAvIDEwMjQpKTsKKwl9CiB9CiAKK3N0YXRpYyB2b2lkIHJlbGVhc2VfdGFza19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlhY2NvdW50X2tlcm5lbF9zdGFjayh0c2ssIC0xKTsKKwlhcmNoX3JlbGVhc2VfdGhyZWFkX3N0YWNrKHRzay0+c3RhY2spOworCWZyZWVfdGhyZWFkX3N0YWNrKHRzayk7CisJdHNrLT5zdGFjayA9IE5VTEw7CisjaWZkZWYgQ09ORklHX1ZNQVBfU1RBQ0sKKwl0c2stPnN0YWNrX3ZtX2FyZWEgPSBOVUxMOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSwordm9pZCBwdXRfdGFza19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdHNrLT5zdGFja19yZWZjb3VudCkpCisJCXJlbGVhc2VfdGFza19zdGFjayh0c2spOworfQorI2VuZGlmCisKIHZvaWQgZnJlZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotCWFjY291bnRfa2VybmVsX3N0YWNrKHRzay0+c3RhY2ssIC0xKTsKLQlhcmNoX3JlbGVhc2VfdGhyZWFkX3N0YWNrKHRzay0+c3RhY2spOwotCWZyZWVfdGhyZWFkX3N0YWNrKHRzay0+c3RhY2spOworI2lmbmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCS8qCisJICogVGhlIHRhc2sgaXMgZmluYWxseSBkb25lIHdpdGggYm90aCB0aGUgc3RhY2sgYW5kIHRocmVhZF9pbmZvLAorCSAqIHNvIGZyZWUgYm90aC4KKwkgKi8KKwlyZWxlYXNlX3Rhc2tfc3RhY2sodHNrKTsKKyNlbHNlCisJLyoKKwkgKiBJZiB0aGUgdGFzayBoYWQgYSBzZXBhcmF0ZSBzdGFjayBhbGxvY2F0aW9uLCBpdCBzaG91bGQgYmUgZ29uZQorCSAqIGJ5IG5vdy4KKwkgKi8KKwlXQVJOX09OX09OQ0UoYXRvbWljX3JlYWQoJnRzay0+c3RhY2tfcmVmY291bnQpICE9IDApOworI2VuZGlmCiAJcnRfbXV0ZXhfZGVidWdfdGFza19mcmVlKHRzayk7CiAJZnRyYWNlX2dyYXBoX2V4aXRfdGFzayh0c2spOwogCXB1dF9zZWNjb21wX2ZpbHRlcih0c2spOwpAQCAtMzAyLDYgKzQxOCw3IEBACiAKIHZvaWQgX19pbml0IGZvcmtfaW5pdCh2b2lkKQogeworCWludCBpOwogI2lmbmRlZiBDT05GSUdfQVJDSF9UQVNLX1NUUlVDVF9BTExPQ0FUT1IKICNpZm5kZWYgQVJDSF9NSU5fVEFTS0FMSUdOCiAjZGVmaW5lIEFSQ0hfTUlOX1RBU0tBTElHTglMMV9DQUNIRV9CWVRFUwpAQCAtMzIxLDYgKzQzOCwxMCBAQAogCWluaXRfdGFzay5zaWduYWwtPnJsaW1bUkxJTUlUX05QUk9DXS5ybGltX21heCA9IG1heF90aHJlYWRzLzI7CiAJaW5pdF90YXNrLnNpZ25hbC0+cmxpbVtSTElNSVRfU0lHUEVORElOR10gPQogCQlpbml0X3Rhc2suc2lnbmFsLT5ybGltW1JMSU1JVF9OUFJPQ107CisKKwlmb3IgKGkgPSAwOyBpIDwgVUNPVU5UX0NPVU5UUzsgaSsrKSB7CisJCWluaXRfdXNlcl9ucy51Y291bnRfbWF4W2ldID0gbWF4X3RocmVhZHMvMjsKKwl9CiB9CiAKIGludCBfX3dlYWsgYXJjaF9kdXBfdGFza19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICpkc3QsCkBAIC0zNDIsNiArNDYzLDcgQEAKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAl1bnNpZ25lZCBsb25nICpzdGFjazsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICpzdGFja192bV9hcmVhOwogCWludCBlcnI7CiAKIAlpZiAobm9kZSA9PSBOVU1BX05PX05PREUpCkBAIC0zNTQsMTEgKzQ3NiwyNiBAQAogCWlmICghc3RhY2spCiAJCWdvdG8gZnJlZV90c2s7CiAKKwlzdGFja192bV9hcmVhID0gdGFza19zdGFja192bV9hcmVhKHRzayk7CisKIAllcnIgPSBhcmNoX2R1cF90YXNrX3N0cnVjdCh0c2ssIG9yaWcpOworCisJLyoKKwkgKiBhcmNoX2R1cF90YXNrX3N0cnVjdCgpIGNsb2JiZXJzIHRoZSBzdGFjay1yZWxhdGVkIGZpZWxkcy4gIE1ha2UKKwkgKiBzdXJlIHRoZXkncmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzaW5nIGFueSBzdGFjay1yZWxhdGVkCisJICogZnVuY3Rpb25zIGFnYWluLgorCSAqLworCXRzay0+c3RhY2sgPSBzdGFjazsKKyNpZmRlZiBDT05GSUdfVk1BUF9TVEFDSworCXRzay0+c3RhY2tfdm1fYXJlYSA9IHN0YWNrX3ZtX2FyZWE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVEhSRUFEX0lORk9fSU5fVEFTSworCWF0b21pY19zZXQoJnRzay0+c3RhY2tfcmVmY291bnQsIDEpOworI2VuZGlmCisKIAlpZiAoZXJyKQogCQlnb3RvIGZyZWVfc3RhY2s7CiAKLQl0c2stPnN0YWNrID0gc3RhY2s7CiAjaWZkZWYgQ09ORklHX1NFQ0NPTVAKIAkvKgogCSAqIFdlIG11c3QgaGFuZGxlIHNldHRpbmcgdXAgc2VjY29tcCBmaWx0ZXJzIG9uY2Ugd2UncmUgdW5kZXIKQEAgLTM5MCwxNCArNTI3LDE0IEBACiAJdHNrLT50YXNrX2ZyYWcucGFnZSA9IE5VTEw7CiAJdHNrLT53YWtlX3EubmV4dCA9IE5VTEw7CiAKLQlhY2NvdW50X2tlcm5lbF9zdGFjayhzdGFjaywgMSk7CisJYWNjb3VudF9rZXJuZWxfc3RhY2sodHNrLCAxKTsKIAogCWtjb3ZfdGFza19pbml0KHRzayk7CiAKIAlyZXR1cm4gdHNrOwogCiBmcmVlX3N0YWNrOgotCWZyZWVfdGhyZWFkX3N0YWNrKHN0YWNrKTsKKwlmcmVlX3RocmVhZF9zdGFjayh0c2spOwogZnJlZV90c2s6CiAJZnJlZV90YXNrX3N0cnVjdCh0c2spOwogCXJldHVybiBOVUxMOwpAQCAtNzk5LDYgKzkzNiwyOSBAQAogRVhQT1JUX1NZTUJPTChnZXRfbW1fZXhlX2ZpbGUpOwogCiAvKioKKyAqIGdldF90YXNrX2V4ZV9maWxlIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIGV4ZWN1dGFibGUgZmlsZQorICoKKyAqIFJldHVybnMgJU5VTEwgaWYgdGFzaydzIG1tIChpZiBhbnkpIGhhcyBubyBhc3NvY2lhdGVkIGV4ZWN1dGFibGUgZmlsZSBvcgorICogdGhpcyBpcyBhIGtlcm5lbCB0aHJlYWQgd2l0aCBib3Jyb3dlZCBtbSAoc2VlIHRoZSBjb21tZW50IGFib3ZlIGdldF90YXNrX21tKS4KKyAqIFVzZXIgbXVzdCByZWxlYXNlIGZpbGUgdmlhIGZwdXQoKS4KKyAqLworc3RydWN0IGZpbGUgKmdldF90YXNrX2V4ZV9maWxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzdHJ1Y3QgZmlsZSAqZXhlX2ZpbGUgPSBOVUxMOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCisJdGFza19sb2NrKHRhc2spOworCW1tID0gdGFzay0+bW07CisJaWYgKG1tKSB7CisJCWlmICghKHRhc2stPmZsYWdzICYgUEZfS1RIUkVBRCkpCisJCQlleGVfZmlsZSA9IGdldF9tbV9leGVfZmlsZShtbSk7CisJfQorCXRhc2tfdW5sb2NrKHRhc2spOworCXJldHVybiBleGVfZmlsZTsKK30KK0VYUE9SVF9TWU1CT0woZ2V0X3Rhc2tfZXhlX2ZpbGUpOworCisvKioKICAqIGdldF90YXNrX21tIC0gYWNxdWlyZSBhIHJlZmVyZW5jZSB0byB0aGUgdGFzaydzIG1tCiAgKgogICogUmV0dXJucyAlTlVMTCBpZiB0aGUgdGFzayBoYXMgbm8gbW0uICBDaGVja3MgUEZfS1RIUkVBRCAobWVhbmluZwpAQCAtOTEzLDE0ICsxMDczLDEyIEBACiAJZGVhY3RpdmF0ZV9tbSh0c2ssIG1tKTsKIAogCS8qCi0JICogSWYgd2UncmUgZXhpdGluZyBub3JtYWxseSwgY2xlYXIgYSB1c2VyLXNwYWNlIHRpZCBmaWVsZCBpZgotCSAqIHJlcXVlc3RlZC4gIFdlIGxlYXZlIHRoaXMgYWxvbmUgd2hlbiBkeWluZyBieSBzaWduYWwsIHRvIGxlYXZlCi0JICogdGhlIHZhbHVlIGludGFjdCBpbiBhIGNvcmUgZHVtcCwgYW5kIHRvIHNhdmUgdGhlIHVubmVjZXNzYXJ5Ci0JICogdHJvdWJsZSwgc2F5LCBhIGtpbGxlZCB2Zm9yayBwYXJlbnQgc2hvdWxkbid0IHRvdWNoIHRoaXMgbW0uCi0JICogVXNlcmxhbmQgb25seSB3YW50cyB0aGlzIGRvbmUgZm9yIGEgc3lzX2V4aXQuCisJICogU2lnbmFsIHVzZXJzcGFjZSBpZiB3ZSdyZSBub3QgZXhpdGluZyB3aXRoIGEgY29yZSBkdW1wCisJICogYmVjYXVzZSB3ZSB3YW50IHRvIGxlYXZlIHRoZSB2YWx1ZSBpbnRhY3QgZm9yIGRlYnVnZ2luZworCSAqIHB1cnBvc2VzLgogCSAqLwogCWlmICh0c2stPmNsZWFyX2NoaWxkX3RpZCkgewotCQlpZiAoISh0c2stPmZsYWdzICYgUEZfU0lHTkFMRUQpICYmCisJCWlmICghKHRzay0+c2lnbmFsLT5mbGFncyAmIFNJR05BTF9HUk9VUF9DT1JFRFVNUCkgJiYKIAkJICAgIGF0b21pY19yZWFkKCZtbS0+bW1fdXNlcnMpID4gMSkgewogCQkJLyoKIAkJCSAqIFdlIGRvbid0IGNoZWNrIHRoZSBlcnJvciBjb2RlIC0gaWYgdXNlcnNwYWNlIGhhcwpAQCAtMTQwNCw3ICsxNTYyLDYgQEAKIAlwLT5yZWFsX3N0YXJ0X3RpbWUgPSBrdGltZV9nZXRfYm9vdF9ucygpOwogCXAtPmlvX2NvbnRleHQgPSBOVUxMOwogCXAtPmF1ZGl0X2NvbnRleHQgPSBOVUxMOwotCXRocmVhZGdyb3VwX2NoYW5nZV9iZWdpbihjdXJyZW50KTsKIAljZ3JvdXBfZm9yayhwKTsKICNpZmRlZiBDT05GSUdfTlVNQQogCXAtPm1lbXBvbGljeSA9IG1wb2xfZHVwKHAtPm1lbXBvbGljeSk7CkBAIC0xNTU2LDYgKzE3MTMsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZwLT50aHJlYWRfZ3JvdXApOwogCXAtPnRhc2tfd29ya3MgPSBOVUxMOwogCisJdGhyZWFkZ3JvdXBfY2hhbmdlX2JlZ2luKGN1cnJlbnQpOwogCS8qCiAJICogRW5zdXJlIHRoYXQgdGhlIGNncm91cCBzdWJzeXN0ZW0gcG9saWNpZXMgYWxsb3cgdGhlIG5ldyBwcm9jZXNzIHRvIGJlCiAJICogZm9ya2VkLiBJdCBzaG91bGQgYmUgbm90ZWQgdGhlIHRoZSBuZXcgcHJvY2VzcydzIGNzc19zZXQgY2FuIGJlIGNoYW5nZWQKQEAgLTE2NTYsNiArMTgxNCw3IEBACiBiYWRfZm9ya19jYW5jZWxfY2dyb3VwOgogCWNncm91cF9jYW5jZWxfZm9yayhwKTsKIGJhZF9mb3JrX2ZyZWVfcGlkOgorCXRocmVhZGdyb3VwX2NoYW5nZV9lbmQoY3VycmVudCk7CiAJaWYgKHBpZCAhPSAmaW5pdF9zdHJ1Y3RfcGlkKQogCQlmcmVlX3BpZChwaWQpOwogYmFkX2ZvcmtfY2xlYW51cF90aHJlYWQ6CkBAIC0xNjg4LDEyICsxODQ3LDEyIEBACiAJbXBvbF9wdXQocC0+bWVtcG9saWN5KTsKIGJhZF9mb3JrX2NsZWFudXBfdGhyZWFkZ3JvdXBfbG9jazoKICNlbmRpZgotCXRocmVhZGdyb3VwX2NoYW5nZV9lbmQoY3VycmVudCk7CiAJZGVsYXlhY2N0X3Rza19mcmVlKHApOwogYmFkX2ZvcmtfY2xlYW51cF9jb3VudDoKIAlhdG9taWNfZGVjKCZwLT5jcmVkLT51c2VyLT5wcm9jZXNzZXMpOwogCWV4aXRfY3JlZHMocCk7CiBiYWRfZm9ya19mcmVlOgorCXB1dF90YXNrX3N0YWNrKHApOwogCWZyZWVfdGFzayhwKTsKIGZvcmtfb3V0OgogCXJldHVybiBFUlJfUFRSKHJldHZhbCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZnV0ZXguYyBiL2tlcm5lbC9mdXRleC5jCmluZGV4IDQ2Y2IzYTMuLjJjNGJlNDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleC5jCisrKyBiL2tlcm5lbC9mdXRleC5jCkBAIC0zODEsOCArMzgxLDEyIEBACiAjZW5kaWYKIH0KIAotLyoKLSAqIFdlIGhhc2ggb24gdGhlIGtleXMgcmV0dXJuZWQgZnJvbSBnZXRfZnV0ZXhfa2V5IChzZWUgYmVsb3cpLgorLyoqCisgKiBoYXNoX2Z1dGV4IC0gUmV0dXJuIHRoZSBoYXNoIGJ1Y2tldCBpbiB0aGUgZ2xvYmFsIGhhc2gKKyAqIEBrZXk6CVBvaW50ZXIgdG8gdGhlIGZ1dGV4IGtleSBmb3Igd2hpY2ggdGhlIGhhc2ggaXMgY2FsY3VsYXRlZAorICoKKyAqIFdlIGhhc2ggb24gdGhlIGtleXMgcmV0dXJuZWQgZnJvbSBnZXRfZnV0ZXhfa2V5IChzZWUgYmVsb3cpIGFuZCByZXR1cm4gdGhlCisgKiBjb3JyZXNwb25kaW5nIGhhc2ggYnVja2V0IGluIHRoZSBnbG9iYWwgaGFzaC4KICAqLwogc3RhdGljIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGFzaF9mdXRleCh1bmlvbiBmdXRleF9rZXkgKmtleSkKIHsKQEAgLTM5Miw3ICszOTYsMTIgQEAKIAlyZXR1cm4gJmZ1dGV4X3F1ZXVlc1toYXNoICYgKGZ1dGV4X2hhc2hzaXplIC0gMSldOwogfQogCi0vKgorCisvKioKKyAqIG1hdGNoX2Z1dGV4IC0gQ2hlY2sgd2hldGhlciB0d28gZnV0ZXgga2V5cyBhcmUgZXF1YWwKKyAqIEBrZXkxOglQb2ludGVyIHRvIGtleTEKKyAqIEBrZXkyOglQb2ludGVyIHRvIGtleTIKKyAqCiAgKiBSZXR1cm4gMSBpZiB0d28gZnV0ZXhfa2V5cyBhcmUgZXF1YWwsIDAgb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgaW5saW5lIGludCBtYXRjaF9mdXRleCh1bmlvbiBmdXRleF9rZXkgKmtleTEsIHVuaW9uIGZ1dGV4X2tleSAqa2V5MikKZGlmZiAtLWdpdCBhL2tlcm5lbC9odW5nX3Rhc2suYyBiL2tlcm5lbC9odW5nX3Rhc2suYwppbmRleCBkMjM0MDIyLi40MzJjM2Q3IDEwMDY0NAotLS0gYS9rZXJuZWwvaHVuZ190YXNrLmMKKysrIGIva2VybmVsL2h1bmdfdGFzay5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIAlwcl9lcnIoIlwiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dF9zZWNzXCIiCiAJCSIgZGlzYWJsZXMgdGhpcyBtZXNzYWdlLlxuIik7CiAJc2NoZWRfc2hvd190YXNrKHQpOwotCWRlYnVnX3Nob3dfaGVsZF9sb2Nrcyh0KTsKKwlkZWJ1Z19zaG93X2FsbF9sb2NrcygpOwogCiAJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvYWZmaW5pdHkuYyBiL2tlcm5lbC9pcnEvYWZmaW5pdHkuYwppbmRleCAzMmY2Y2ZjLi4xN2Y1MWQ2MyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9hZmZpbml0eS5jCisrKyBiL2tlcm5lbC9pcnEvYWZmaW5pdHkuYwpAQCAtNCw2MCArNCwxNTEgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKLXN0YXRpYyBpbnQgZ2V0X2ZpcnN0X3NpYmxpbmcodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyB2b2lkIGlycV9zcHJlYWRfaW5pdF9vbmUoc3RydWN0IGNwdW1hc2sgKmlycW1zaywgc3RydWN0IGNwdW1hc2sgKm5tc2ssCisJCQkJaW50IGNwdXNfcGVyX3ZlYykKIHsKLQl1bnNpZ25lZCBpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpzaWJsbXNrOworCWludCBjcHUsIHNpYmw7CiAKLQlyZXQgPSBjcHVtYXNrX2ZpcnN0KHRvcG9sb2d5X3NpYmxpbmdfY3B1bWFzayhjcHUpKTsKLQlpZiAocmV0IDwgbnJfY3B1X2lkcykKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gY3B1OworCWZvciAoIDsgY3B1c19wZXJfdmVjID4gMDsgKSB7CisJCWNwdSA9IGNwdW1hc2tfZmlyc3Qobm1zayk7CisKKwkJLyogU2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBJJ20gdG9vIGxhenkgdG8gdGhpbmsgYWJvdXQgaXQgKi8KKwkJaWYgKGNwdSA+PSBucl9jcHVfaWRzKQorCQkJcmV0dXJuOworCisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbm1zayk7CisJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGlycW1zayk7CisJCWNwdXNfcGVyX3ZlYy0tOworCisJCS8qIElmIHRoZSBjcHUgaGFzIHNpYmxpbmdzLCB1c2UgdGhlbSBmaXJzdCAqLworCQlzaWJsbXNrID0gdG9wb2xvZ3lfc2libGluZ19jcHVtYXNrKGNwdSk7CisJCWZvciAoc2libCA9IC0xOyBjcHVzX3Blcl92ZWMgPiAwOyApIHsKKwkJCXNpYmwgPSBjcHVtYXNrX25leHQoc2libCwgc2libG1zayk7CisJCQlpZiAoc2libCA+PSBucl9jcHVfaWRzKQorCQkJCWJyZWFrOworCQkJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShzaWJsLCBubXNrKSkKKwkJCQljb250aW51ZTsKKwkJCWNwdW1hc2tfc2V0X2NwdShzaWJsLCBpcnFtc2spOworCQkJY3B1c19wZXJfdmVjLS07CisJCX0KKwl9CiB9CiAKLS8qCi0gKiBUYWtlIGEgbWFwIG9mIG9ubGluZSBDUFVzIGFuZCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBpbnRlcnJ1cHQgdmVjdG9ycwotICogYW5kIGdlbmVyYXRlIGFuIG91dHB1dCBjcHVtYXNrIHN1aXRhYmxlIGZvciBzcHJlYWRpbmcgTVNJL01TSS1YIHZlY3RvcnMKLSAqIHNvIHRoYXQgdGhleSBhcmUgZGlzdHJpYnV0ZWQgYXMgZ29vZCBhcyBwb3NzaWJsZSBhcm91bmQgdGhlIENQVXMuICBJZgotICogbW9yZSB2ZWN0b3JzIHRoYW4gQ1BVcyBhcmUgYXZhaWxhYmxlIHdlJ2xsIG1hcCBvbmUgdG8gZWFjaCBDUFUsCi0gKiBvdGhlcndpc2Ugd2UgbWFwIG9uZSB0byB0aGUgZmlyc3Qgc2libGluZyBvZiBlYWNoIHNvY2tldC4KLSAqCi0gKiBJZiB0aGVyZSBhcmUgbW9yZSB2ZWN0b3JzIHRoYW4gQ1BVcyB3ZSB3aWxsIHN0aWxsIG9ubHkgaGF2ZSBvbmUgYml0Ci0gKiBzZXQgcGVyIENQVSwgYnV0IGludGVycnVwdCBjb2RlIHdpbGwga2VlcCBvbiBhc3NpZ25pbmcgdGhlIHZlY3RvcnMgZnJvbQotICogdGhlIHN0YXJ0IG9mIHRoZSBiaXRtYXAgdW50aWwgd2UgcnVuIG91dCBvZiB2ZWN0b3JzLgotICovCi1zdHJ1Y3QgY3B1bWFzayAqaXJxX2NyZWF0ZV9hZmZpbml0eV9tYXNrKHVuc2lnbmVkIGludCAqbnJfdmVjcykKK3N0YXRpYyBpbnQgZ2V0X25vZGVzX2luX2NwdW1hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIG5vZGVtYXNrX3QgKm5vZGVtc2spCiB7Ci0Jc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5X21hc2s7Ci0JdW5zaWduZWQgaW50IG1heF92ZWNzID0gKm5yX3ZlY3M7CisJaW50IG4sIG5vZGVzOwogCi0JaWYgKG1heF92ZWNzID09IDEpCi0JCXJldHVybiBOVUxMOwotCi0JYWZmaW5pdHlfbWFzayA9IGt6YWxsb2MoY3B1bWFza19zaXplKCksIEdGUF9LRVJORUwpOwotCWlmICghYWZmaW5pdHlfbWFzaykgewotCQkqbnJfdmVjcyA9IDE7Ci0JCXJldHVybiBOVUxMOworCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBzdXBwbGllZCBhZmZpbml0eSBtYXNrICovCisJZm9yIChuID0gMCwgbm9kZXMgPSAwOyBuIDwgbnVtX29ubGluZV9ub2RlcygpOyBuKyspIHsKKwkJaWYgKGNwdW1hc2tfaW50ZXJzZWN0cyhtYXNrLCBjcHVtYXNrX29mX25vZGUobikpKSB7CisJCQlub2RlX3NldChuLCAqbm9kZW1zayk7CisJCQlub2RlcysrOworCQl9CiAJfQorCXJldHVybiBub2RlczsKK30KIAorLyoqCisgKiBpcnFfY3JlYXRlX2FmZmluaXR5X21hc2tzIC0gQ3JlYXRlIGFmZmluaXR5IG1hc2tzIGZvciBtdWx0aXF1ZXVlIHNwcmVhZGluZworICogQGFmZmluaXR5OgkJVGhlIGFmZmluaXR5IG1hc2sgdG8gc3ByZWFkLiBJZiBOVUxMIGNwdV9vbmxpbmVfbWFzaworICoJCQlpcyB1c2VkCisgKiBAbnZlY3M6CQlUaGUgbnVtYmVyIG9mIHZlY3RvcnMKKyAqCisgKiBSZXR1cm5zIHRoZSBtYXNrcyBwb2ludGVyIG9yIE5VTEwgaWYgYWxsb2NhdGlvbiBmYWlsZWQuCisgKi8KK3N0cnVjdCBjcHVtYXNrICppcnFfY3JlYXRlX2FmZmluaXR5X21hc2tzKGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSwKKwkJCQkJICBpbnQgbnZlYykKK3sKKwlpbnQgbiwgbm9kZXMsIHZlY3NfcGVyX25vZGUsIGNwdXNfcGVyX3ZlYywgZXh0cmFfdmVjcywgY3VydmVjID0gMDsKKwlub2RlbWFza190IG5vZGVtc2sgPSBOT0RFX01BU0tfTk9ORTsKKwlzdHJ1Y3QgY3B1bWFzayAqbWFza3M7CisJY3B1bWFza192YXJfdCBubXNrOworCisJaWYgKCF6YWxsb2NfY3B1bWFza192YXIoJm5tc2ssIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gTlVMTDsKKworCW1hc2tzID0ga3phbGxvYyhudmVjICogc2l6ZW9mKCptYXNrcyksIEdGUF9LRVJORUwpOworCWlmICghbWFza3MpCisJCWdvdG8gb3V0OworCisJLyogU3RhYmlsaXplIHRoZSBjcHVtYXNrcyAqLwogCWdldF9vbmxpbmVfY3B1cygpOwotCWlmIChtYXhfdmVjcyA+PSBudW1fb25saW5lX2NwdXMoKSkgewotCQljcHVtYXNrX2NvcHkoYWZmaW5pdHlfbWFzaywgY3B1X29ubGluZV9tYXNrKTsKLQkJKm5yX3ZlY3MgPSBudW1fb25saW5lX2NwdXMoKTsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgdmVjcyA9IDAsIGNwdTsKKwkvKiBJZiB0aGUgc3VwcGxpZWQgYWZmaW5pdHkgbWFzayBpcyBOVUxMLCB1c2UgY3B1IG9ubGluZSBtYXNrICovCisJaWYgKCFhZmZpbml0eSkKKwkJYWZmaW5pdHkgPSBjcHVfb25saW5lX21hc2s7CiAKLQkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJCWlmIChjcHUgPT0gZ2V0X2ZpcnN0X3NpYmxpbmcoY3B1KSkgewotCQkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIGFmZmluaXR5X21hc2spOwotCQkJCXZlY3MrKzsKLQkJCX0KKwlub2RlcyA9IGdldF9ub2Rlc19pbl9jcHVtYXNrKGFmZmluaXR5LCAmbm9kZW1zayk7CiAKLQkJCWlmICgtLW1heF92ZWNzID09IDApCisJLyoKKwkgKiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBtYXNrIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUKKwkgKiBudW1iZXIgb2YgdmVjdG9ycyB3ZSBqdXN0IHNwcmVhZCB0aGUgdmVjdG9ycyBhY3Jvc3MgdGhlIG5vZGVzLgorCSAqLworCWlmIChudmVjIDw9IG5vZGVzKSB7CisJCWZvcl9lYWNoX25vZGVfbWFzayhuLCBub2RlbXNrKSB7CisJCQljcHVtYXNrX2NvcHkobWFza3MgKyBjdXJ2ZWMsIGNwdW1hc2tfb2Zfbm9kZShuKSk7CisJCQlpZiAoKytjdXJ2ZWMgPT0gbnZlYykKIAkJCQlicmVhazsKIAkJfQotCQkqbnJfdmVjcyA9IHZlY3M7CisJCWdvdG8gb3V0b25sOwogCX0KLQlwdXRfb25saW5lX2NwdXMoKTsKIAotCXJldHVybiBhZmZpbml0eV9tYXNrOworCS8qIFNwcmVhZCB0aGUgdmVjdG9ycyBwZXIgbm9kZSAqLworCXZlY3NfcGVyX25vZGUgPSBudmVjIC8gbm9kZXM7CisJLyogQWNjb3VudCBmb3Igcm91bmRpbmcgZXJyb3JzICovCisJZXh0cmFfdmVjcyA9IG52ZWMgLSAobm9kZXMgKiB2ZWNzX3Blcl9ub2RlKTsKKworCWZvcl9lYWNoX25vZGVfbWFzayhuLCBub2RlbXNrKSB7CisJCWludCBuY3B1cywgdiwgdmVjc190b19hc3NpZ24gPSB2ZWNzX3Blcl9ub2RlOworCisJCS8qIEdldCB0aGUgY3B1cyBvbiB0aGlzIG5vZGUgd2hpY2ggYXJlIGluIHRoZSBtYXNrICovCisJCWNwdW1hc2tfYW5kKG5tc2ssIGFmZmluaXR5LCBjcHVtYXNrX29mX25vZGUobikpOworCisJCS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGNwdXMgcGVyIHZlY3RvciAqLworCQluY3B1cyA9IGNwdW1hc2tfd2VpZ2h0KG5tc2spOworCisJCWZvciAodiA9IDA7IGN1cnZlYyA8IG52ZWMgJiYgdiA8IHZlY3NfdG9fYXNzaWduOyBjdXJ2ZWMrKywgdisrKSB7CisJCQljcHVzX3Blcl92ZWMgPSBuY3B1cyAvIHZlY3NfdG9fYXNzaWduOworCisJCQkvKiBBY2NvdW50IGZvciBleHRyYSB2ZWN0b3JzIHRvIGNvbXBlbnNhdGUgcm91bmRpbmcgZXJyb3JzICovCisJCQlpZiAoZXh0cmFfdmVjcykgeworCQkJCWNwdXNfcGVyX3ZlYysrOworCQkJCWlmICghLS1leHRyYV92ZWNzKQorCQkJCQl2ZWNzX3Blcl9ub2RlKys7CisJCQl9CisJCQlpcnFfc3ByZWFkX2luaXRfb25lKG1hc2tzICsgY3VydmVjLCBubXNrLCBjcHVzX3Blcl92ZWMpOworCQl9CisKKwkJaWYgKGN1cnZlYyA+PSBudmVjKQorCQkJYnJlYWs7CisJfQorCitvdXRvbmw6CisJcHV0X29ubGluZV9jcHVzKCk7CitvdXQ6CisJZnJlZV9jcHVtYXNrX3ZhcihubXNrKTsKKwlyZXR1cm4gbWFza3M7Cit9CisKKy8qKgorICogaXJxX2NhbGNfYWZmaW5pdHlfdmVjdG9ycyAtIENhbGN1bGF0ZSB0byBvcHRpbWFsIG51bWJlciBvZiB2ZWN0b3JzIGZvciBhIGdpdmVuIGFmZmluaXR5IG1hc2sKKyAqIEBhZmZpbml0eToJCVRoZSBhZmZpbml0eSBtYXNrIHRvIHNwcmVhZC4gSWYgTlVMTCBjcHVfb25saW5lX21hc2sKKyAqCQkJaXMgdXNlZAorICogQG1heHZlYzoJCVRoZSBtYXhpbXVtIG51bWJlciBvZiB2ZWN0b3JzIGF2YWlsYWJsZQorICovCitpbnQgaXJxX2NhbGNfYWZmaW5pdHlfdmVjdG9ycyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHksIGludCBtYXh2ZWMpCit7CisJaW50IGNwdXMsIHJldDsKKworCS8qIFN0YWJpbGl6ZSB0aGUgY3B1bWFza3MgKi8KKwlnZXRfb25saW5lX2NwdXMoKTsKKwkvKiBJZiB0aGUgc3VwcGxpZWQgYWZmaW5pdHkgbWFzayBpcyBOVUxMLCB1c2UgY3B1IG9ubGluZSBtYXNrICovCisJaWYgKCFhZmZpbml0eSkKKwkJYWZmaW5pdHkgPSBjcHVfb25saW5lX21hc2s7CisKKwljcHVzID0gY3B1bWFza193ZWlnaHQoYWZmaW5pdHkpOworCXJldCA9IChjcHVzIDwgbWF4dmVjKSA/IGNwdXMgOiBtYXh2ZWM7CisKKwlwdXRfb25saW5lX2NwdXMoKTsKKwlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9jaGlwLmMgYi9rZXJuZWwvaXJxL2NoaXAuYwppbmRleCA2MzczODkwLi5iZTNjMzRlIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2NoaXAuYworKysgYi9rZXJuZWwvaXJxL2NoaXAuYwpAQCAtNzYsNyArNzYsNiBAQAogCWlmICghZGVzYykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0eXBlICY9IElSUV9UWVBFX1NFTlNFX01BU0s7CiAJcmV0ID0gX19pcnFfc2V0X3RyaWdnZXIoZGVzYywgdHlwZSk7CiAJaXJxX3B1dF9kZXNjX2J1c3VubG9jayhkZXNjLCBmbGFncyk7CiAJcmV0dXJuIHJldDsKQEAgLTc1Niw3ICs3NTUsNiBAQAogewogCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOwogCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbiA9IGRlc2MtPmFjdGlvbjsKLQl2b2lkICpkZXZfaWQgPSByYXdfY3B1X3B0cihhY3Rpb24tPnBlcmNwdV9kZXZfaWQpOwogCXVuc2lnbmVkIGludCBpcnEgPSBpcnFfZGVzY19nZXRfaXJxKGRlc2MpOwogCWlycXJldHVybl90IHJlczsKIApAQCAtNzY1LDE1ICs3NjMsMjYgQEAKIAlpZiAoY2hpcC0+aXJxX2FjaykKIAkJY2hpcC0+aXJxX2FjaygmZGVzYy0+aXJxX2RhdGEpOwogCi0JdHJhY2VfaXJxX2hhbmRsZXJfZW50cnkoaXJxLCBhY3Rpb24pOwotCXJlcyA9IGFjdGlvbi0+aGFuZGxlcihpcnEsIGRldl9pZCk7Ci0JdHJhY2VfaXJxX2hhbmRsZXJfZXhpdChpcnEsIGFjdGlvbiwgcmVzKTsKKwlpZiAobGlrZWx5KGFjdGlvbikpIHsKKwkJdHJhY2VfaXJxX2hhbmRsZXJfZW50cnkoaXJxLCBhY3Rpb24pOworCQlyZXMgPSBhY3Rpb24tPmhhbmRsZXIoaXJxLCByYXdfY3B1X3B0cihhY3Rpb24tPnBlcmNwdV9kZXZfaWQpKTsKKwkJdHJhY2VfaXJxX2hhbmRsZXJfZXhpdChpcnEsIGFjdGlvbiwgcmVzKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCQlib29sIGVuYWJsZWQgPSBjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgZGVzYy0+cGVyY3B1X2VuYWJsZWQpOworCisJCWlmIChlbmFibGVkKQorCQkJaXJxX3BlcmNwdV9kaXNhYmxlKGRlc2MsIGNwdSk7CisKKwkJcHJfZXJyX29uY2UoIlNwdXJpb3VzJXMgcGVyY3B1IElSUSV1IG9uIENQVSV1XG4iLAorCQkJICAgIGVuYWJsZWQgPyAiIGFuZCB1bm1hc2tlZCIgOiAiIiwgaXJxLCBjcHUpOworCX0KIAogCWlmIChjaGlwLT5pcnFfZW9pKQogCQljaGlwLT5pcnFfZW9pKCZkZXNjLT5pcnFfZGF0YSk7CiB9CiAKLXZvaWQKK3N0YXRpYyB2b2lkCiBfX2lycV9kb19zZXRfaGFuZGxlcihzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGlycV9mbG93X2hhbmRsZXJfdCBoYW5kbGUsCiAJCSAgICAgaW50IGlzX2NoYWluZWQsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC04MjAsNiArODI5LDggQEAKIAlkZXNjLT5uYW1lID0gbmFtZTsKIAogCWlmIChoYW5kbGUgIT0gaGFuZGxlX2JhZF9pcnEgJiYgaXNfY2hhaW5lZCkgeworCQl1bnNpZ25lZCBpbnQgdHlwZSA9IGlycWRfZ2V0X3RyaWdnZXJfdHlwZSgmZGVzYy0+aXJxX2RhdGEpOworCiAJCS8qCiAJCSAqIFdlJ3JlIGFib3V0IHRvIHN0YXJ0IHRoaXMgaW50ZXJydXB0IGltbWVkaWF0ZWx5LAogCQkgKiBoZW5jZSB0aGUgbmVlZCB0byBzZXQgdGhlIHRyaWdnZXIgY29uZmlndXJhdGlvbi4KQEAgLTgyOCw4ICs4MzksMTAgQEAKIAkJICogY2hhaW5lZCBpbnRlcnJ1cHQuIFJlc2V0IGl0IGltbWVkaWF0ZWx5IGJlY2F1c2Ugd2UKIAkJICogZG8ga25vdyBiZXR0ZXIuCiAJCSAqLwotCQlfX2lycV9zZXRfdHJpZ2dlcihkZXNjLCBpcnFkX2dldF90cmlnZ2VyX3R5cGUoJmRlc2MtPmlycV9kYXRhKSk7Ci0JCWRlc2MtPmhhbmRsZV9pcnEgPSBoYW5kbGU7CisJCWlmICh0eXBlICE9IElSUV9UWVBFX05PTkUpIHsKKwkJCV9faXJxX3NldF90cmlnZ2VyKGRlc2MsIHR5cGUpOworCQkJZGVzYy0+aGFuZGxlX2lycSA9IGhhbmRsZTsKKwkJfQogCiAJCWlycV9zZXR0aW5nc19zZXRfbm9wcm9iZShkZXNjKTsKIAkJaXJxX3NldHRpbmdzX3NldF9ub3JlcXVlc3QoZGVzYyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jIGIva2VybmVsL2lycS9nZW5lcmljLWNoaXAuYwppbmRleCBhYmQyODZhLi5lZTMyODcwIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2dlbmVyaWMtY2hpcC5jCisrKyBiL2tlcm5lbC9pcnEvZ2VuZXJpYy1jaGlwLmMKQEAgLTI2MCw5ICsyNjAsOSBAQAogfQogCiAvKioKLSAqIGlycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwIC0gQWxsb2NhdGUgZ2VuZXJpYyBjaGlwcyBmb3IgYW4gaXJxIGRvbWFpbgorICogX19pcnFfYWxsb2NfZG9tYWluX2dlbmVyaWNfY2hpcCAtIEFsbG9jYXRlIGdlbmVyaWMgY2hpcHMgZm9yIGFuIGlycSBkb21haW4KICAqIEBkOgkJCWlycSBkb21haW4gZm9yIHdoaWNoIHRvIGFsbG9jYXRlIGNoaXBzCi0gKiBAaXJxc19wZXJfY2hpcDoJTnVtYmVyIG9mIGludGVycnVwdHMgZWFjaCBjaGlwIGhhbmRsZXMKKyAqIEBpcnFzX3Blcl9jaGlwOglOdW1iZXIgb2YgaW50ZXJydXB0cyBlYWNoIGNoaXAgaGFuZGxlcyAobWF4IDMyKQogICogQG51bV9jdDoJCU51bWJlciBvZiBpcnFfY2hpcF90eXBlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcwogICogQG5hbWU6CQlOYW1lIG9mIHRoZSBpcnEgY2hpcAogICogQGhhbmRsZXI6CQlEZWZhdWx0IGZsb3cgaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggdGhlc2UgY2hpcHMKQEAgLTI3MCwxMSArMjcwLDExIEBACiAgKiBAc2V0OgkJSVJRXyogYml0cyB0byBzZXQgaW4gdGhlIG1hcHBpbmcgZnVuY3Rpb24KICAqIEBnY2ZsYWdzOgkJR2VuZXJpYyBjaGlwIHNwZWNpZmljIHNldHVwIGZsYWdzCiAgKi8KLWludCBpcnFfYWxsb2NfZG9tYWluX2dlbmVyaWNfY2hpcHMoc3RydWN0IGlycV9kb21haW4gKmQsIGludCBpcnFzX3Blcl9jaGlwLAotCQkJCSAgIGludCBudW1fY3QsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJICAgaXJxX2Zsb3dfaGFuZGxlcl90IGhhbmRsZXIsCi0JCQkJICAgdW5zaWduZWQgaW50IGNsciwgdW5zaWduZWQgaW50IHNldCwKLQkJCQkgICBlbnVtIGlycV9nY19mbGFncyBnY2ZsYWdzKQoraW50IF9faXJxX2FsbG9jX2RvbWFpbl9nZW5lcmljX2NoaXBzKHN0cnVjdCBpcnFfZG9tYWluICpkLCBpbnQgaXJxc19wZXJfY2hpcCwKKwkJCQkgICAgIGludCBudW1fY3QsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICBpcnFfZmxvd19oYW5kbGVyX3QgaGFuZGxlciwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjbHIsIHVuc2lnbmVkIGludCBzZXQsCisJCQkJICAgICBlbnVtIGlycV9nY19mbGFncyBnY2ZsYWdzKQogewogCXN0cnVjdCBpcnFfZG9tYWluX2NoaXBfZ2VuZXJpYyAqZGdjOwogCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKQEAgLTMyNiw3ICszMjYsMjEgQEAKIAlkLT5uYW1lID0gbmFtZTsKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGlycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyk7CitFWFBPUlRfU1lNQk9MX0dQTChfX2lycV9hbGxvY19kb21haW5fZ2VuZXJpY19jaGlwcyk7CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqCitfX2lycV9nZXRfZG9tYWluX2dlbmVyaWNfY2hpcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgdW5zaWduZWQgaW50IGh3X2lycSkKK3sKKwlzdHJ1Y3QgaXJxX2RvbWFpbl9jaGlwX2dlbmVyaWMgKmRnYyA9IGQtPmdjOworCWludCBpZHg7CisKKwlpZiAoIWRnYykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJaWR4ID0gaHdfaXJxIC8gZGdjLT5pcnFzX3Blcl9jaGlwOworCWlmIChpZHggPj0gZGdjLT5udW1fY2hpcHMpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCXJldHVybiBkZ2MtPmdjW2lkeF07Cit9CiAKIC8qKgogICogaXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwIC0gR2V0IGEgcG9pbnRlciB0byB0aGUgZ2VuZXJpYyBjaGlwIG9mIGEgaHdfaXJxCkBAIC0zMzYsMTUgKzM1MCw5IEBACiBzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqCiBpcnFfZ2V0X2RvbWFpbl9nZW5lcmljX2NoaXAoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCBod19pcnEpCiB7Ci0Jc3RydWN0IGlycV9kb21haW5fY2hpcF9nZW5lcmljICpkZ2MgPSBkLT5nYzsKLQlpbnQgaWR4OworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IF9faXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKGQsIGh3X2lycSk7CiAKLQlpZiAoIWRnYykKLQkJcmV0dXJuIE5VTEw7Ci0JaWR4ID0gaHdfaXJxIC8gZGdjLT5pcnFzX3Blcl9jaGlwOwotCWlmIChpZHggPj0gZGdjLT5udW1fY2hpcHMpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBkZ2MtPmdjW2lkeF07CisJcmV0dXJuICFJU19FUlIoZ2MpID8gZ2MgOiBOVUxMOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2dldF9kb21haW5fZ2VuZXJpY19jaGlwKTsKIApAQCAtMzY4LDEzICszNzYsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGlkeDsKIAotCWlmICghZC0+Z2MpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWR4ID0gaHdfaXJxIC8gZGdjLT5pcnFzX3Blcl9jaGlwOwotCWlmIChpZHggPj0gZGdjLT5udW1fY2hpcHMpCi0JCXJldHVybiAtRUlOVkFMOwotCWdjID0gZGdjLT5nY1tpZHhdOworCWdjID0gX19pcnFfZ2V0X2RvbWFpbl9nZW5lcmljX2NoaXAoZCwgaHdfaXJxKTsKKwlpZiAoSVNfRVJSKGdjKSkKKwkJcmV0dXJuIFBUUl9FUlIoZ2MpOwogCiAJaWR4ID0gaHdfaXJxICUgZGdjLT5pcnFzX3Blcl9jaGlwOwogCkBAIC00MDksMTAgKzQxMywzMCBAQAogCWlycV9tb2RpZnlfc3RhdHVzKHZpcnEsIGRnYy0+aXJxX2ZsYWdzX3RvX2NsZWFyLCBkZ2MtPmlycV9mbGFnc190b19zZXQpOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoaXJxX21hcF9nZW5lcmljX2NoaXApOworCitzdGF0aWMgdm9pZCBpcnFfdW5tYXBfZ2VuZXJpY19jaGlwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgdmlycSkKK3sKKwlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEgPSBpcnFfZG9tYWluX2dldF9pcnFfZGF0YShkLCB2aXJxKTsKKwlzdHJ1Y3QgaXJxX2RvbWFpbl9jaGlwX2dlbmVyaWMgKmRnYyA9IGQtPmdjOworCXVuc2lnbmVkIGludCBod19pcnEgPSBkYXRhLT5od2lycTsKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CisJaW50IGlycV9pZHg7CisKKwlnYyA9IGlycV9nZXRfZG9tYWluX2dlbmVyaWNfY2hpcChkLCBod19pcnEpOworCWlmICghZ2MpCisJCXJldHVybjsKKworCWlycV9pZHggPSBod19pcnEgJSBkZ2MtPmlycXNfcGVyX2NoaXA7CisKKwljbGVhcl9iaXQoaXJxX2lkeCwgJmdjLT5pbnN0YWxsZWQpOworCWlycV9kb21haW5fc2V0X2luZm8oZCwgdmlycSwgaHdfaXJxLCAmbm9faXJxX2NoaXAsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkgICAgTlVMTCk7CisKK30KIAogc3RydWN0IGlycV9kb21haW5fb3BzIGlycV9nZW5lcmljX2NoaXBfb3BzID0gewogCS5tYXAJPSBpcnFfbWFwX2dlbmVyaWNfY2hpcCwKKwkudW5tYXAgID0gaXJxX3VubWFwX2dlbmVyaWNfY2hpcCwKIAkueGxhdGUJPSBpcnFfZG9tYWluX3hsYXRlX29uZXR3b2NlbGwsCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2dlbmVyaWNfY2hpcF9vcHMpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9pcnFkZXNjLmMgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwppbmRleCBhNjIzYjQ0Li4wMGJiMGFlIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2lycWRlc2MuYworKysgYi9rZXJuZWwvaXJxL2lycWRlc2MuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWxzLmgiCiAKQEAgLTEyMyw2ICsxMjQsMTgxIEBACiAKICNpZmRlZiBDT05GSUdfU1BBUlNFX0lSUQogCitzdGF0aWMgdm9pZCBpcnFfa29ial9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKTsKKworI2lmZGVmIENPTkZJR19TWVNGUworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICppcnFfa29ial9iYXNlOworCisjZGVmaW5lIElSUV9BVFRSX1JPKF9uYW1lKSBcCitzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIF9uYW1lIyNfYXR0ciA9IF9fQVRUUl9STyhfbmFtZSkKKworc3RhdGljIHNzaXplX3QgcGVyX2NwdV9jb3VudF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpcnFfZGVzYywga29iaik7CisJaW50IGNwdSwgaXJxID0gZGVzYy0+aXJxX2RhdGEuaXJxOworCXNzaXplX3QgcmV0ID0gMDsKKwljaGFyICpwID0gIiI7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXVuc2lnbmVkIGludCBjID0ga3N0YXRfaXJxc19jcHUoaXJxLCBjcHUpOworCisJCXJldCArPSBzY25wcmludGYoYnVmICsgcmV0LCBQQUdFX1NJWkUgLSByZXQsICIlcyV1IiwgcCwgYyk7CisJCXAgPSAiLCI7CisJfQorCisJcmV0ICs9IHNjbnByaW50ZihidWYgKyByZXQsIFBBR0VfU0laRSAtIHJldCwgIlxuIik7CisJcmV0dXJuIHJldDsKK30KK0lSUV9BVFRSX1JPKHBlcl9jcHVfY291bnQpOworCitzdGF0aWMgc3NpemVfdCBjaGlwX25hbWVfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgaXJxX2Rlc2MsIGtvYmopOworCXNzaXplX3QgcmV0ID0gMDsKKworCXJhd19zcGluX2xvY2tfaXJxKCZkZXNjLT5sb2NrKTsKKwlpZiAoZGVzYy0+aXJxX2RhdGEuY2hpcCAmJiBkZXNjLT5pcnFfZGF0YS5jaGlwLT5uYW1lKSB7CisJCXJldCA9IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLAorCQkJCWRlc2MtPmlycV9kYXRhLmNoaXAtPm5hbWUpOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitJUlFfQVRUUl9STyhjaGlwX25hbWUpOworCitzdGF0aWMgc3NpemVfdCBod2lycV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGlycV9kZXNjLCBrb2JqKTsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwlyYXdfc3Bpbl9sb2NrX2lycSgmZGVzYy0+bG9jayk7CisJaWYgKGRlc2MtPmlycV9kYXRhLmRvbWFpbikKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgKGludClkZXNjLT5pcnFfZGF0YS5od2lycSk7CisJcmF3X3NwaW5fdW5sb2NrX2lycSgmZGVzYy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorSVJRX0FUVFJfUk8oaHdpcnEpOworCitzdGF0aWMgc3NpemVfdCB0eXBlX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpcnFfZGVzYywga29iaik7CisJc3NpemVfdCByZXQgPSAwOworCisJcmF3X3NwaW5fbG9ja19pcnEoJmRlc2MtPmxvY2spOworCXJldCA9IHNwcmludGYoYnVmLCAiJXNcbiIsCisJCSAgICAgIGlycWRfaXNfbGV2ZWxfdHlwZSgmZGVzYy0+aXJxX2RhdGEpID8gImxldmVsIiA6ICJlZGdlIik7CisJcmF3X3NwaW5fdW5sb2NrX2lycSgmZGVzYy0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworCit9CitJUlFfQVRUUl9STyh0eXBlKTsKKworc3RhdGljIHNzaXplX3QgbmFtZV9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgaXJxX2Rlc2MsIGtvYmopOworCXNzaXplX3QgcmV0ID0gMDsKKworCXJhd19zcGluX2xvY2tfaXJxKCZkZXNjLT5sb2NrKTsKKwlpZiAoZGVzYy0+bmFtZSkKKwkJcmV0ID0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsIGRlc2MtPm5hbWUpOworCXJhd19zcGluX3VubG9ja19pcnEoJmRlc2MtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KK0lSUV9BVFRSX1JPKG5hbWUpOworCitzdGF0aWMgc3NpemVfdCBhY3Rpb25zX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpcnFfZGVzYywga29iaik7CisJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uOworCXNzaXplX3QgcmV0ID0gMDsKKwljaGFyICpwID0gIiI7CisKKwlyYXdfc3Bpbl9sb2NrX2lycSgmZGVzYy0+bG9jayk7CisJZm9yIChhY3Rpb24gPSBkZXNjLT5hY3Rpb247IGFjdGlvbiAhPSBOVUxMOyBhY3Rpb24gPSBhY3Rpb24tPm5leHQpIHsKKwkJcmV0ICs9IHNjbnByaW50ZihidWYgKyByZXQsIFBBR0VfU0laRSAtIHJldCwgIiVzJXMiLAorCQkJCSBwLCBhY3Rpb24tPm5hbWUpOworCQlwID0gIiwiOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxKCZkZXNjLT5sb2NrKTsKKworCWlmIChyZXQpCisJCXJldCArPSBzY25wcmludGYoYnVmICsgcmV0LCBQQUdFX1NJWkUgLSByZXQsICJcbiIpOworCisJcmV0dXJuIHJldDsKK30KK0lSUV9BVFRSX1JPKGFjdGlvbnMpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXJxX2F0dHJzW10gPSB7CisJJnBlcl9jcHVfY291bnRfYXR0ci5hdHRyLAorCSZjaGlwX25hbWVfYXR0ci5hdHRyLAorCSZod2lycV9hdHRyLmF0dHIsCisJJnR5cGVfYXR0ci5hdHRyLAorCSZuYW1lX2F0dHIuYXR0ciwKKwkmYWN0aW9uc19hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgaXJxX2tvYmpfdHlwZSA9IHsKKwkucmVsZWFzZQk9IGlycV9rb2JqX3JlbGVhc2UsCisJLnN5c2ZzX29wcwk9ICZrb2JqX3N5c2ZzX29wcywKKwkuZGVmYXVsdF9hdHRycwk9IGlycV9hdHRycywKK307CisKK3N0YXRpYyB2b2lkIGlycV9zeXNmc19hZGQoaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWlmIChpcnFfa29ial9iYXNlKSB7CisJCS8qCisJCSAqIENvbnRpbnVlIGV2ZW4gaW4gY2FzZSBvZiBmYWlsdXJlIGFzIHRoaXMgaXMgbm90aGluZworCQkgKiBjcnVjaWFsLgorCQkgKi8KKwkJaWYgKGtvYmplY3RfYWRkKCZkZXNjLT5rb2JqLCBpcnFfa29ial9iYXNlLCAiJWQiLCBpcnEpKQorCQkJcHJfd2FybigiRmFpbGVkIHRvIGFkZCBrb2JqZWN0IGZvciBpcnEgJWRcbiIsIGlycSk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBpcnFfc3lzZnNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwlpbnQgaXJxOworCisJLyogUHJldmVudCBjb25jdXJyZW50IGlycSBhbGxvYy9mcmVlICovCisJaXJxX2xvY2tfc3BhcnNlKCk7CisKKwlpcnFfa29ial9iYXNlID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgiaXJxIiwga2VybmVsX2tvYmopOworCWlmICghaXJxX2tvYmpfYmFzZSkgeworCQlpcnFfdW5sb2NrX3NwYXJzZSgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBBZGQgdGhlIGFscmVhZHkgYWxsb2NhdGVkIGludGVycnVwdHMgKi8KKwlmb3JfZWFjaF9pcnFfZGVzYyhpcnEsIGRlc2MpCisJCWlycV9zeXNmc19hZGQoaXJxLCBkZXNjKTsKKwlpcnFfdW5sb2NrX3NwYXJzZSgpOworCisJcmV0dXJuIDA7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChpcnFfc3lzZnNfaW5pdCk7CisKKyNlbHNlIC8qICFDT05GSUdfU1lTRlMgKi8KKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgaXJxX2tvYmpfdHlwZSA9IHsKKwkucmVsZWFzZQk9IGlycV9rb2JqX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCBpcnFfc3lzZnNfYWRkKGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykge30KKworI2VuZGlmIC8qIENPTkZJR19TWVNGUyAqLworCiBzdGF0aWMgUkFESVhfVFJFRShpcnFfZGVzY190cmVlLCBHRlBfS0VSTkVMKTsKIAogc3RhdGljIHZvaWQgaXJxX2luc2VydF9kZXNjKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKQEAgLTE4Nyw2ICszNjMsNyBAQAogCiAJZGVzY19zZXRfZGVmYXVsdHMoaXJxLCBkZXNjLCBub2RlLCBhZmZpbml0eSwgb3duZXIpOwogCWlycWRfc2V0KCZkZXNjLT5pcnFfZGF0YSwgZmxhZ3MpOworCWtvYmplY3RfaW5pdCgmZGVzYy0+a29iaiwgJmlycV9rb2JqX3R5cGUpOwogCiAJcmV0dXJuIGRlc2M7CiAKQEAgLTE5NywxNSArMzc0LDIyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGRlbGF5ZWRfZnJlZV9kZXNjKHN0cnVjdCByY3VfaGVhZCAqcmhwKQorc3RhdGljIHZvaWQgaXJxX2tvYmpfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBjb250YWluZXJfb2YocmhwLCBzdHJ1Y3QgaXJxX2Rlc2MsIHJjdSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBpcnFfZGVzYywga29iaik7CiAKIAlmcmVlX21hc2tzKGRlc2MpOwogCWZyZWVfcGVyY3B1KGRlc2MtPmtzdGF0X2lycXMpOwogCWtmcmVlKGRlc2MpOwogfQogCitzdGF0aWMgdm9pZCBkZWxheWVkX2ZyZWVfZGVzYyhzdHJ1Y3QgcmN1X2hlYWQgKnJocCkKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBjb250YWluZXJfb2YocmhwLCBzdHJ1Y3QgaXJxX2Rlc2MsIHJjdSk7CisKKwlrb2JqZWN0X3B1dCgmZGVzYy0+a29iaik7Cit9CisKIHN0YXRpYyB2b2lkIGZyZWVfZGVzYyh1bnNpZ25lZCBpbnQgaXJxKQogewogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CkBAIC0yMTcsOCArNDAxLDEyIEBACiAJICoga3N0YXRfaXJxX3VzcigpLiBPbmNlIHdlIGRlbGV0ZWQgdGhlIGRlc2NyaXB0b3IgZnJvbSB0aGUKIAkgKiBzcGFyc2UgdHJlZSB3ZSBjYW4gZnJlZSBpdC4gQWNjZXNzIGluIHByb2Mgd2lsbCBmYWlsIHRvCiAJICogbG9va3VwIHRoZSBkZXNjcmlwdG9yLgorCSAqCisJICogVGhlIHN5c2ZzIGVudHJ5IG11c3QgYmUgc2VyaWFsaXplZCBhZ2FpbnN0IGEgY29uY3VycmVudAorCSAqIGlycV9zeXNmc19pbml0KCkgYXMgd2VsbC4KIAkgKi8KIAltdXRleF9sb2NrKCZzcGFyc2VfaXJxX2xvY2spOworCWtvYmplY3RfZGVsKCZkZXNjLT5rb2JqKTsKIAlkZWxldGVfaXJxX2Rlc2MoaXJxKTsKIAltdXRleF91bmxvY2soJnNwYXJzZV9pcnFfbG9jayk7CiAKQEAgLTIzNiwzMSArNDI0LDMxIEBACiAJY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2sgPSBOVUxMOwogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0JaW50IGksIGNwdSA9IC0xOworCWludCBpOwogCi0JaWYgKGFmZmluaXR5ICYmIGNwdW1hc2tfZW1wdHkoYWZmaW5pdHkpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBWYWxpZGF0ZSBhZmZpbml0eSBtYXNrKHMpICovCisJaWYgKGFmZmluaXR5KSB7CisJCWZvciAoaSA9IDAsIG1hc2sgPSBhZmZpbml0eTsgaSA8IGNudDsgaSsrLCBtYXNrKyspIHsKKwkJCWlmIChjcHVtYXNrX2VtcHR5KG1hc2spKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQogCiAJZmxhZ3MgPSBhZmZpbml0eSA/IElSUURfQUZGSU5JVFlfTUFOQUdFRCA6IDA7CisJbWFzayA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKIAkJaWYgKGFmZmluaXR5KSB7Ci0JCQljcHUgPSBjcHVtYXNrX25leHQoY3B1LCBhZmZpbml0eSk7Ci0JCQlpZiAoY3B1ID49IG5yX2NwdV9pZHMpCi0JCQkJY3B1ID0gY3B1bWFza19maXJzdChhZmZpbml0eSk7Ci0JCQlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKLQotCQkJLyoKLQkJCSAqIEZvciBzaW5nbGUgYWxsb2NhdGlvbnMgd2UgdXNlIHRoZSBjYWxsZXIgcHJvdmlkZWQKLQkJCSAqIG1hc2sgb3RoZXJ3aXNlIHdlIHVzZSB0aGUgbWFzayBvZiB0aGUgdGFyZ2V0IGNwdQotCQkJICovCi0JCQltYXNrID0gY250ID09IDEgPyBhZmZpbml0eSA6IGNwdW1hc2tfb2YoY3B1KTsKKwkJCW5vZGUgPSBjcHVfdG9fbm9kZShjcHVtYXNrX2ZpcnN0KGFmZmluaXR5KSk7CisJCQltYXNrID0gYWZmaW5pdHk7CisJCQlhZmZpbml0eSsrOwogCQl9CiAJCWRlc2MgPSBhbGxvY19kZXNjKHN0YXJ0ICsgaSwgbm9kZSwgZmxhZ3MsIG1hc2ssIG93bmVyKTsKIAkJaWYgKCFkZXNjKQogCQkJZ290byBlcnI7CiAJCW11dGV4X2xvY2soJnNwYXJzZV9pcnFfbG9jayk7CiAJCWlycV9pbnNlcnRfZGVzYyhzdGFydCArIGksIGRlc2MpOworCQlpcnFfc3lzZnNfYWRkKHN0YXJ0ICsgaSwgZGVzYyk7CiAJCW11dGV4X3VubG9jaygmc3BhcnNlX2lycV9sb2NrKTsKIAl9CiAJcmV0dXJuIHN0YXJ0OwpAQCAtNDgxLDkgKzY2OSw5IEBACiAgKiBAY250OglOdW1iZXIgb2YgY29uc2VjdXRpdmUgaXJxcyB0byBhbGxvY2F0ZS4KICAqIEBub2RlOglQcmVmZXJyZWQgbm9kZSBvbiB3aGljaCB0aGUgaXJxIGRlc2NyaXB0b3Igc2hvdWxkIGJlIGFsbG9jYXRlZAogICogQG93bmVyOglPd25pbmcgbW9kdWxlIChjYW4gYmUgTlVMTCkKLSAqIEBhZmZpbml0eToJT3B0aW9uYWwgcG9pbnRlciB0byBhbiBhZmZpbml0eSBtYXNrIHdoaWNoIGhpbnRzIHdoZXJlIHRoZQotICoJCWlycSBkZXNjcmlwdG9ycyBzaG91bGQgYmUgYWxsb2NhdGVkIGFuZCB3aGljaCBkZWZhdWx0Ci0gKgkJYWZmaW5pdGllcyB0byB1c2UKKyAqIEBhZmZpbml0eToJT3B0aW9uYWwgcG9pbnRlciB0byBhbiBhZmZpbml0eSBtYXNrIGFycmF5IG9mIHNpemUgQGNudCB3aGljaAorICoJCWhpbnRzIHdoZXJlIHRoZSBpcnEgZGVzY3JpcHRvcnMgc2hvdWxkIGJlIGFsbG9jYXRlZCBhbmQgd2hpY2gKKyAqCQlkZWZhdWx0IGFmZmluaXRpZXMgdG8gdXNlCiAgKgogICogUmV0dXJucyB0aGUgZmlyc3QgaXJxIG51bWJlciBvciBlcnJvciBjb2RlCiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMgYi9rZXJuZWwvaXJxL2lycWRvbWFpbi5jCmluZGV4IDQ3NTJiNDMuLjhjMGEwYWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMKKysrIGIva2VybmVsL2lycS9pcnFkb21haW4uYwpAQCAtODAsNyArODAsNyBAQAogCiAvKioKICAqIF9faXJxX2RvbWFpbl9hZGQoKSAtIEFsbG9jYXRlIGEgbmV3IGlycV9kb21haW4gZGF0YSBzdHJ1Y3R1cmUKLSAqIEBvZl9ub2RlOiBvcHRpb25hbCBkZXZpY2UtdHJlZSBub2RlIG9mIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgorICogQGZ3bm9kZTogZmlybXdhcmUgbm9kZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyCiAgKiBAc2l6ZTogU2l6ZSBvZiBsaW5lYXIgbWFwOyAwIGZvciByYWRpeCBtYXBwaW5nIG9ubHkKICAqIEBod2lycV9tYXg6IE1heGltdW0gbnVtYmVyIG9mIGludGVycnVwdHMgc3VwcG9ydGVkIGJ5IGNvbnRyb2xsZXIKICAqIEBkaXJlY3RfbWF4OiBNYXhpbXVtIHZhbHVlIG9mIGRpcmVjdCBtYXBzOyBVc2UgfjAgZm9yIG5vIGxpbWl0OyAwIGZvciBubwpAQCAtOTYsMTAgKzk2LDggQEAKIAkJCQkgICAgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzICpvcHMsCiAJCQkJICAgIHZvaWQgKmhvc3RfZGF0YSkKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSB0b19vZl9ub2RlKGZ3bm9kZSk7CiAJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7Ci0KLQlvZl9ub2RlID0gdG9fb2Zfbm9kZShmd25vZGUpOwogCiAJZG9tYWluID0ga3phbGxvY19ub2RlKHNpemVvZigqZG9tYWluKSArIChzaXplb2YodW5zaWduZWQgaW50KSAqIHNpemUpLAogCQkJICAgICAgR0ZQX0tFUk5FTCwgb2Zfbm9kZV90b19uaWQob2Zfbm9kZSkpOwpAQCAtODY4LDcgKzg2NiwxMCBAQAogCWlmIChXQVJOX09OKGludHNpemUgPCAxKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJKm91dF9od2lycSA9IGludHNwZWNbMF07Ci0JKm91dF90eXBlID0gKGludHNpemUgPiAxKSA/IGludHNwZWNbMV0gOiBJUlFfVFlQRV9OT05FOworCWlmIChpbnRzaXplID4gMSkKKwkJKm91dF90eXBlID0gaW50c3BlY1sxXSAmIElSUV9UWVBFX1NFTlNFX01BU0s7CisJZWxzZQorCQkqb3V0X3R5cGUgPSBJUlFfVFlQRV9OT05FOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2RvbWFpbl94bGF0ZV9vbmV0d29jZWxsKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvbWFuYWdlLmMgYi9rZXJuZWwvaXJxL21hbmFnZS5jCmluZGV4IDk1MzBmY2QuLjBjNWYxYTUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvbWFuYWdlLmMKKysrIGIva2VybmVsL2lycS9tYW5hZ2UuYwpAQCAtNjY5LDggKzY2OSw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCWZsYWdzICY9IElSUV9UWVBFX1NFTlNFX01BU0s7Ci0KIAlpZiAoY2hpcC0+ZmxhZ3MgJiBJUlFDSElQX1NFVF9UWVBFX01BU0tFRCkgewogCQlpZiAoIWlycWRfaXJxX21hc2tlZCgmZGVzYy0+aXJxX2RhdGEpKQogCQkJbWFza19pcnEoZGVzYyk7CkBAIC02NzgsNyArNjc2LDggQEAKIAkJCXVubWFzayA9IDE7CiAJfQogCi0JLyogY2FsbGVyIG1hc2tlZCBvdXQgYWxsIGV4Y2VwdCB0cmlnZ2VyIG1vZGUgZmxhZ3MgKi8KKwkvKiBNYXNrIGFsbCBmbGFncyBleGNlcHQgdHJpZ2dlciBtb2RlICovCisJZmxhZ3MgJj0gSVJRX1RZUEVfU0VOU0VfTUFTSzsKIAlyZXQgPSBjaGlwLT5pcnFfc2V0X3R5cGUoJmRlc2MtPmlycV9kYXRhLCBmbGFncyk7CiAKIAlzd2l0Y2ggKHJldCkgewpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9tc2kuYyBiL2tlcm5lbC9pcnEvbXNpLmMKaW5kZXggMTllOWRmYi4uOGEzZTg3MjcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvbXNpLmMKKysrIGIva2VybmVsL2lycS9tc2kuYwpAQCAtMTgsMjAgKzE4LDQyIEBACiAvKiBUZW1wYXJvcnkgc29sdXRpb24gZm9yIGJ1aWxkaW5nLCB3aWxsIGJlIHJlbW92ZWQgbGF0ZXIgKi8KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotc3RydWN0IG1zaV9kZXNjICphbGxvY19tc2lfZW50cnkoc3RydWN0IGRldmljZSAqZGV2KQorLyoqCisgKiBhbGxvY19tc2lfZW50cnkgLSBBbGxvY2F0ZSBhbiBpbml0aWFsaXplIG1zaV9lbnRyeQorICogQGRldjoJUG9pbnRlciB0byB0aGUgZGV2aWNlIGZvciB3aGljaCB0aGlzIGlzIGFsbG9jYXRlZAorICogQG52ZWM6CVRoZSBudW1iZXIgb2YgdmVjdG9ycyB1c2VkIGluIHRoaXMgZW50cnkKKyAqIEBhZmZpbml0eToJT3B0aW9uYWwgcG9pbnRlciB0byBhbiBhZmZpbml0eSBtYXNrIGFycmF5IHNpemUgb2YgQG52ZWMKKyAqCisgKiBJZiBAYWZmaW5pdHkgaXMgbm90IE5VTEwgdGhlbiBhIGFuIGFmZmluaXR5IGFycmF5W0BudmVjXSBpcyBhbGxvY2F0ZWQKKyAqIGFuZCB0aGUgYWZmaW5pdHkgbWFza3MgZnJvbSBAYWZmaW5pdHkgYXJlIGNvcGllZC4KKyAqLworc3RydWN0IG1zaV9kZXNjICoKK2FsbG9jX21zaV9lbnRyeShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBudmVjLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHkpCiB7Ci0Jc3RydWN0IG1zaV9kZXNjICpkZXNjID0ga3phbGxvYyhzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgbXNpX2Rlc2MgKmRlc2M7CisKKwlkZXNjID0ga3phbGxvYyhzaXplb2YoKmRlc2MpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRlc2MpCiAJCXJldHVybiBOVUxMOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRlc2MtPmxpc3QpOwogCWRlc2MtPmRldiA9IGRldjsKKwlkZXNjLT5udmVjX3VzZWQgPSBudmVjOworCWlmIChhZmZpbml0eSkgeworCQlkZXNjLT5hZmZpbml0eSA9IGttZW1kdXAoYWZmaW5pdHksCisJCQludmVjICogc2l6ZW9mKCpkZXNjLT5hZmZpbml0eSksIEdGUF9LRVJORUwpOworCQlpZiAoIWRlc2MtPmFmZmluaXR5KSB7CisJCQlrZnJlZShkZXNjKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQogCiAJcmV0dXJuIGRlc2M7CiB9CiAKIHZvaWQgZnJlZV9tc2lfZW50cnkoc3RydWN0IG1zaV9kZXNjICplbnRyeSkKIHsKKwlrZnJlZShlbnRyeS0+YWZmaW5pdHkpOwogCWtmcmVlKGVudHJ5KTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2tleGVjX2ZpbGUuYyBiL2tlcm5lbC9rZXhlY19maWxlLmMKaW5kZXggNTAzYmMyZC4uMDM3YzMyMSAxMDA2NDQKLS0tIGEva2VybmVsL2tleGVjX2ZpbGUuYworKysgYi9rZXJuZWwva2V4ZWNfZmlsZS5jCkBAIC04ODcsNyArODg3LDEwIEBACiAJcmV0dXJuIDA7CiBvdXQ6CiAJdmZyZWUocGktPnNlY2hkcnMpOworCXBpLT5zZWNoZHJzID0gTlVMTDsKKwogCXZmcmVlKHBpLT5wdXJnYXRvcnlfYnVmKTsKKwlwaS0+cHVyZ2F0b3J5X2J1ZiA9IE5VTEw7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2t0aHJlYWQuYyBiL2tlcm5lbC9rdGhyZWFkLmMKaW5kZXggOWZmMTczZC4uNGFiNGMzNyAxMDA2NDQKLS0tIGEva2VybmVsL2t0aHJlYWQuYworKysgYi9rZXJuZWwva3RocmVhZC5jCkBAIC02NCw3ICs2NCw3IEBACiBzdGF0aWMgc3RydWN0IGt0aHJlYWQgKnRvX2xpdmVfa3RocmVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmspCiB7CiAJc3RydWN0IGNvbXBsZXRpb24gKnZmb3JrID0gQUNDRVNTX09OQ0Uoay0+dmZvcmtfZG9uZSk7Ci0JaWYgKGxpa2VseSh2Zm9yaykpCisJaWYgKGxpa2VseSh2Zm9yaykgJiYgdHJ5X2dldF90YXNrX3N0YWNrKGspKQogCQlyZXR1cm4gX190b19rdGhyZWFkKHZmb3JrKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTQyNSw4ICs0MjUsMTAgQEAKIHsKIAlzdHJ1Y3Qga3RocmVhZCAqa3RocmVhZCA9IHRvX2xpdmVfa3RocmVhZChrKTsKIAotCWlmIChrdGhyZWFkKQorCWlmIChrdGhyZWFkKSB7CiAJCV9fa3RocmVhZF91bnBhcmsoaywga3RocmVhZCk7CisJCXB1dF90YXNrX3N0YWNrKGspOworCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt0aHJlYWRfdW5wYXJrKTsKIApAQCAtNDU1LDYgKzQ1Nyw3IEBACiAJCQkJd2FpdF9mb3JfY29tcGxldGlvbigma3RocmVhZC0+cGFya2VkKTsKIAkJCX0KIAkJfQorCQlwdXRfdGFza19zdGFjayhrKTsKIAkJcmV0ID0gMDsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTQ5MCw2ICs0OTMsNyBAQAogCQlfX2t0aHJlYWRfdW5wYXJrKGssIGt0aHJlYWQpOwogCQl3YWtlX3VwX3Byb2Nlc3Moayk7CiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmt0aHJlYWQtPmV4aXRlZCk7CisJCXB1dF90YXNrX3N0YWNrKGspOwogCX0KIAlyZXQgPSBrLT5leGl0X2NvZGU7CiAJcHV0X3Rhc2tfc3RydWN0KGspOwpkaWZmIC0tZ2l0IGEva2VybmVsL2xpdmVwYXRjaC9jb3JlLmMgYi9rZXJuZWwvbGl2ZXBhdGNoL2NvcmUuYwppbmRleCA4YmJlNTA3Li5hZjQ2NDM4IDEwMDY0NAotLS0gYS9rZXJuZWwvbGl2ZXBhdGNoL2NvcmUuYworKysgYi9rZXJuZWwvbGl2ZXBhdGNoL2NvcmUuYwpAQCAtMjc0LDcgKzI3NCw2IEBACiAKIAlvYmpuYW1lID0ga2xwX2lzX21vZHVsZShvYmopID8gb2JqLT5uYW1lIDogInZtbGludXgiOwogCi0JbW9kdWxlX2Rpc2FibGVfcm8ocG1vZCk7CiAJLyogRm9yIGVhY2gga2xwIHJlbG9jYXRpb24gc2VjdGlvbiAqLwogCWZvciAoaSA9IDE7IGkgPCBwbW9kLT5rbHBfaW5mby0+aGRyLmVfc2hudW07IGkrKykgewogCQlzZWMgPSBwbW9kLT5rbHBfaW5mby0+c2VjaGRycyArIGk7CkBAIC0zMDksNyArMzA4LDYgQEAKIAkJCWJyZWFrOwogCX0KIAotCW1vZHVsZV9lbmFibGVfcm8ocG1vZCwgdHJ1ZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTQ3LDkgKzU0NSw2IEBACiAJICAgIGxpc3RfcHJldl9lbnRyeShwYXRjaCwgbGlzdCktPnN0YXRlID09IEtMUF9ESVNBQkxFRCkKIAkJcmV0dXJuIC1FQlVTWTsKIAotCXByX25vdGljZV9vbmNlKCJ0YWludGluZyBrZXJuZWwgd2l0aCBUQUlOVF9MSVZFUEFUQ0hcbiIpOwotCWFkZF90YWludChUQUlOVF9MSVZFUEFUQ0gsIExPQ0tERVBfU1RJTExfT0spOwotCiAJcHJfbm90aWNlKCJlbmFibGluZyBwYXRjaCAnJXMnXG4iLCBwYXRjaC0+bW9kLT5uYW1lKTsKIAogCWtscF9mb3JfZWFjaF9vYmplY3QocGF0Y2gsIG9iaikgewpAQCAtNzYzLDYgKzc1OCwxMiBAQAogCQkJCSAgICBmdW5jLT5vbGRfc3ltcG9zID8gZnVuYy0+b2xkX3N5bXBvcyA6IDEpOwogfQogCisvKiBBcmNoZXMgbWF5IG92ZXJyaWRlIHRoaXMgdG8gZmluaXNoIGFueSByZW1haW5pbmcgYXJjaC1zcGVjaWZpYyB0YXNrcyAqLwordm9pZCBfX3dlYWsgYXJjaF9rbHBfaW5pdF9vYmplY3RfbG9hZGVkKHN0cnVjdCBrbHBfcGF0Y2ggKnBhdGNoLAorCQkJCQlzdHJ1Y3Qga2xwX29iamVjdCAqb2JqKQoreworfQorCiAvKiBwYXJ0cyBvZiB0aGUgaW5pdGlhbGl6YXRpb24gdGhhdCBpcyBkb25lIG9ubHkgd2hlbiB0aGUgb2JqZWN0IGlzIGxvYWRlZCAqLwogc3RhdGljIGludCBrbHBfaW5pdF9vYmplY3RfbG9hZGVkKHN0cnVjdCBrbHBfcGF0Y2ggKnBhdGNoLAogCQkJCSAgc3RydWN0IGtscF9vYmplY3QgKm9iaikKQEAgLTc3MCw5ICs3NzEsMTUgQEAKIAlzdHJ1Y3Qga2xwX2Z1bmMgKmZ1bmM7CiAJaW50IHJldDsKIAorCW1vZHVsZV9kaXNhYmxlX3JvKHBhdGNoLT5tb2QpOwogCXJldCA9IGtscF93cml0ZV9vYmplY3RfcmVsb2NhdGlvbnMocGF0Y2gtPm1vZCwgb2JqKTsKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKKwkJbW9kdWxlX2VuYWJsZV9ybyhwYXRjaC0+bW9kLCB0cnVlKTsKIAkJcmV0dXJuIHJldDsKKwl9CisKKwlhcmNoX2tscF9pbml0X29iamVjdF9sb2FkZWQocGF0Y2gsIG9iaik7CisJbW9kdWxlX2VuYWJsZV9ybyhwYXRjaC0+bW9kLCB0cnVlKTsKIAogCWtscF9mb3JfZWFjaF9mdW5jKG9iaiwgZnVuYykgewogCQlyZXQgPSBrbHBfZmluZF9vYmplY3Rfc3ltYm9sKG9iai0+bmFtZSwgZnVuYy0+b2xkX25hbWUsCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9NYWtlZmlsZSBiL2tlcm5lbC9sb2NraW5nL01ha2VmaWxlCmluZGV4IDMxMzIyYTQuLjZmODhlMzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NraW5nL01ha2VmaWxlCisrKyBiL2tlcm5lbC9sb2NraW5nL01ha2VmaWxlCkBAIC0xOCw3ICsxOCw2IEBACiBlbmRpZgogb2JqLSQoQ09ORklHX1NNUCkgKz0gc3BpbmxvY2subwogb2JqLSQoQ09ORklHX0xPQ0tfU1BJTl9PTl9PV05FUikgKz0gb3NxX2xvY2subwotb2JqLSQoQ09ORklHX1NNUCkgKz0gbGdsb2NrLm8KIG9iai0kKENPTkZJR19QUk9WRV9MT0NLSU5HKSArPSBzcGlubG9jay5vCiBvYmotJChDT05GSUdfUVVFVUVEX1NQSU5MT0NLUykgKz0gcXNwaW5sb2NrLm8KIG9iai0kKENPTkZJR19SVF9NVVRFWEVTKSArPSBydG11dGV4Lm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL2xnbG9jay5jIGIva2VybmVsL2xvY2tpbmcvbGdsb2NrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MWNmY2QuLjAwMDAwMDAKLS0tIGEva2VybmVsL2xvY2tpbmcvbGdsb2NrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyogU2VlIGluY2x1ZGUvbGludXgvbGdsb2NrLmggZm9yIGRlc2NyaXB0aW9uICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+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+YWx0bWFwICYmIHBnbWFwLT5hbHRtYXAtPmFsbG9jLAogCQkJIiVzOiBmYWlsZWQgdG8gZnJlZSBhbGwgcmVzZXJ2ZWQgcGFnZXNcbiIsIF9fZnVuY19fKTsKQEAgLTI4Miw2ICsyODMsNyBAQAogCQlzdHJ1Y3QgcGVyY3B1X3JlZiAqcmVmLCBzdHJ1Y3Qgdm1lbV9hbHRtYXAgKmFsdG1hcCkKIHsKIAlyZXNvdXJjZV9zaXplX3Qga2V5LCBhbGlnbl9zdGFydCwgYWxpZ25fc2l6ZSwgYWxpZ25fZW5kOworCXBncHJvdF90IHBncHJvdCA9IFBBR0VfS0VSTkVMOwogCXN0cnVjdCBkZXZfcGFnZW1hcCAqcGdtYXA7CiAJc3RydWN0IHBhZ2VfbWFwICpwYWdlX21hcDsKIAlpbnQgZXJyb3IsIG5pZCwgaXNfcmFtOwpAQCAtMzUxLDYgKzM1MywxMSBAQAogCWlmIChuaWQgPCAwKQogCQluaWQgPSBudW1hX21lbV9pZCgpOwogCisJZXJyb3IgPSB0cmFja19wZm5fcmVtYXAoTlVMTCwgJnBncHJvdCwgUEhZU19QRk4oYWxpZ25fc3RhcnQpLCAwLAorCQkJYWxpZ25fc2l6ZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9wZm5fcmVtYXA7CisKIAllcnJvciA9IGFyY2hfYWRkX21lbW9yeShuaWQsIGFsaWduX3N0YXJ0LCBhbGlnbl9zaXplLCB0cnVlKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyX2FkZF9tZW1vcnk7CkBAIC0zNzEsNiArMzc4LDggQEAKIAlyZXR1cm4gX192YShyZXMtPnN0YXJ0KTsKIAogIGVycl9hZGRfbWVtb3J5OgorCXVudHJhY2tfcGZuKE5VTEwsIFBIWVNfUEZOKGFsaWduX3N0YXJ0KSwgYWxpZ25fc2l6ZSk7CisgZXJyX3Bmbl9yZW1hcDoKICBlcnJfcmFkaXg6CiAJcGdtYXBfcmFkaXhfcmVsZWFzZShyZXMpOwogCWRldnJlc19mcmVlKHBhZ2VfbWFwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9tb2R1bGUuYyBiL2tlcm5lbC9tb2R1bGUuYwppbmRleCA1MjllZmFlLi5mNTdkZDYzIDEwMDY0NAotLS0gYS9rZXJuZWwvbW9kdWxlLmMKKysrIGIva2VybmVsL21vZHVsZS5jCkBAIC0xMTQ5LDYgKzExNDksOCBAQAogCQlidWZbbCsrXSA9ICdDJzsKIAlpZiAobW9kLT50YWludHMgJiAoMSA8PCBUQUlOVF9VTlNJR05FRF9NT0RVTEUpKQogCQlidWZbbCsrXSA9ICdFJzsKKwlpZiAobW9kLT50YWludHMgJiAoMSA8PCBUQUlOVF9MSVZFUEFUQ0gpKQorCQlidWZbbCsrXSA9ICdLJzsKIAkvKgogCSAqIFRBSU5UX0ZPUkNFRF9STU1PRDogY291bGQgYmUgYWRkZWQuCiAJICogVEFJTlRfQ1BVX09VVF9PRl9TUEVDLCBUQUlOVF9NQUNISU5FX0NIRUNLLCBUQUlOVF9CQURfUEFHRSBkb24ndApAQCAtMjc5MiwxNCArMjc5NCwxNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0xJVkVQQVRDSAotc3RhdGljIGludCBmaW5kX2xpdmVwYXRjaF9tb2RpbmZvKHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQgY2hlY2tfbW9kaW5mb19saXZlcGF0Y2goc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQogewotCW1vZC0+a2xwID0gZ2V0X21vZGluZm8oaW5mbywgImxpdmVwYXRjaCIpID8gdHJ1ZSA6IGZhbHNlOworCWlmIChnZXRfbW9kaW5mbyhpbmZvLCAibGl2ZXBhdGNoIikpIHsKKwkJbW9kLT5rbHAgPSB0cnVlOworCQlhZGRfdGFpbnRfbW9kdWxlKG1vZCwgVEFJTlRfTElWRVBBVENILCBMT0NLREVQX1NUSUxMX09LKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KICNlbHNlIC8qICFDT05GSUdfTElWRVBBVENIICovCi1zdGF0aWMgaW50IGZpbmRfbGl2ZXBhdGNoX21vZGluZm8oc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgbG9hZF9pbmZvICppbmZvKQorc3RhdGljIGludCBjaGVja19tb2RpbmZvX2xpdmVwYXRjaChzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBsb2FkX2luZm8gKmluZm8pCiB7CiAJaWYgKGdldF9tb2RpbmZvKGluZm8sICJsaXZlcGF0Y2giKSkgewogCQlwcl9lcnIoIiVzOiBtb2R1bGUgaXMgbWFya2VkIGFzIGxpdmVwYXRjaCBtb2R1bGUsIGJ1dCBsaXZlcGF0Y2ggc3VwcG9ydCBpcyBkaXNhYmxlZCIsCkBAIC0yOTY5LDcgKzI5NzQsNyBAQAogCQkJImlzIHVua25vd24sIHlvdSBoYXZlIGJlZW4gd2FybmVkLlxuIiwgbW9kLT5uYW1lKTsKIAl9CiAKLQllcnIgPSBmaW5kX2xpdmVwYXRjaF9tb2RpbmZvKG1vZCwgaW5mbyk7CisJZXJyID0gY2hlY2tfbW9kaW5mb19saXZlcGF0Y2gobW9kLCBpbmZvKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvcGFkYXRhLmMgYi9rZXJuZWwvcGFkYXRhLmMKaW5kZXggOTkzMjc4OC4uNzg0OGYwNSAxMDA2NDQKLS0tIGEva2VybmVsL3BhZGF0YS5jCisrKyBiL2tlcm5lbC9wYWRhdGEuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNkZWZpbmUgTUFYX09CSl9OVU0gMTAwMAogCkBAIC03NjksNTIgKzc3MCw0MyBAQAogCQljcHVtYXNrX3Rlc3RfY3B1KGNwdSwgcGluc3QtPmNwdW1hc2suY2JjcHUpOwogfQogCi0KLXN0YXRpYyBpbnQgcGFkYXRhX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgcGFkYXRhX2NwdV9vbmxpbmUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUpCiB7Ci0JaW50IGVycjsKIAlzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlICpwaW5zdDsKLQlpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKKwlpbnQgcmV0OwogCi0JcGluc3QgPSBjb250YWluZXJfb2YobmZiLCBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlLCBjcHVfbm90aWZpZXIpOworCXBpbnN0ID0gaGxpc3RfZW50cnlfc2FmZShub2RlLCBzdHJ1Y3QgcGFkYXRhX2luc3RhbmNlLCBub2RlKTsKKwlpZiAoIXBpbnN0X2hhc19jcHUocGluc3QsIGNwdSkpCisJCXJldHVybiAwOwogCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQljYXNlIENQVV9ET1dOX0ZBSUxFRF9GUk9aRU46Ci0JCWlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSkKLQkJCWJyZWFrOwotCQltdXRleF9sb2NrKCZwaW5zdC0+bG9jayk7Ci0JCWVyciA9IF9fcGFkYXRhX2FkZF9jcHUocGluc3QsIGNwdSk7Ci0JCW11dGV4X3VubG9jaygmcGluc3QtPmxvY2spOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oZXJyKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTjoKLQljYXNlIENQVV9VUF9DQU5DRUxFRDoKLQljYXNlIENQVV9VUF9DQU5DRUxFRF9GUk9aRU46Ci0JCWlmICghcGluc3RfaGFzX2NwdShwaW5zdCwgY3B1KSkKLQkJCWJyZWFrOwotCQltdXRleF9sb2NrKCZwaW5zdC0+bG9jayk7Ci0JCWVyciA9IF9fcGFkYXRhX3JlbW92ZV9jcHUocGluc3QsIGNwdSk7Ci0JCW11dGV4X3VubG9jaygmcGluc3QtPmxvY2spOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oZXJyKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKKwltdXRleF9sb2NrKCZwaW5zdC0+bG9jayk7CisJcmV0ID0gX19wYWRhdGFfYWRkX2NwdShwaW5zdCwgY3B1KTsKKwltdXRleF91bmxvY2soJnBpbnN0LT5sb2NrKTsKKwlyZXR1cm4gcmV0OwogfQorCitzdGF0aWMgaW50IHBhZGF0YV9jcHVfcHJlcF9kb3duKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBobGlzdF9ub2RlICpub2RlKQoreworCXN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0OworCWludCByZXQ7CisKKwlwaW5zdCA9IGhsaXN0X2VudHJ5X3NhZmUobm9kZSwgc3RydWN0IHBhZGF0YV9pbnN0YW5jZSwgbm9kZSk7CisJaWYgKCFwaW5zdF9oYXNfY3B1KHBpbnN0LCBjcHUpKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJnBpbnN0LT5sb2NrKTsKKwlyZXQgPSBfX3BhZGF0YV9yZW1vdmVfY3B1KHBpbnN0LCBjcHUpOworCW11dGV4X3VubG9jaygmcGluc3QtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBlbnVtIGNwdWhwX3N0YXRlIGhwX29ubGluZTsKICNlbmRpZgogCiBzdGF0aWMgdm9pZCBfX3BhZGF0YV9mcmVlKHN0cnVjdCBwYWRhdGFfaW5zdGFuY2UgKnBpbnN0KQogewogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZwaW5zdC0+Y3B1X25vdGlmaWVyKTsKKwljcHVocF9zdGF0ZV9yZW1vdmVfaW5zdGFuY2Vfbm9jYWxscyhocF9vbmxpbmUsICZwaW5zdC0+bm9kZSk7CiAjZW5kaWYKIAogCXBhZGF0YV9zdG9wKHBpbnN0KTsKQEAgLTEwMTIsMTEgKzEwMDQsOCBAQAogCW11dGV4X2luaXQoJnBpbnN0LT5sb2NrKTsKIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCXBpbnN0LT5jcHVfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IHBhZGF0YV9jcHVfY2FsbGJhY2s7Ci0JcGluc3QtPmNwdV9ub3RpZmllci5wcmlvcml0eSA9IDA7Ci0JcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZwaW5zdC0+Y3B1X25vdGlmaWVyKTsKKwljcHVocF9zdGF0ZV9hZGRfaW5zdGFuY2Vfbm9jYWxscyhocF9vbmxpbmUsICZwaW5zdC0+bm9kZSk7CiAjZW5kaWYKLQogCXJldHVybiBwaW5zdDsKIAogZXJyX2ZyZWVfbWFza3M6CkBAIC0xMDM5LDMgKzEwMjgsMjYgQEAKIAlrb2JqZWN0X3B1dCgmcGluc3QtPmtvYmopOwogfQogRVhQT1JUX1NZTUJPTChwYWRhdGFfZnJlZSk7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKworc3RhdGljIF9faW5pdCBpbnQgcGFkYXRhX2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX211bHRpKENQVUhQX0FQX09OTElORV9EWU4sICJwYWRhdGE6b25saW5lIiwKKwkJCQkgICAgICBwYWRhdGFfY3B1X29ubGluZSwKKwkJCQkgICAgICBwYWRhdGFfY3B1X3ByZXBfZG93bik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaHBfb25saW5lID0gcmV0OworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQocGFkYXRhX2RyaXZlcl9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIHBhZGF0YV9kcml2ZXJfZXhpdCh2b2lkKQoreworCWNwdWhwX3JlbW92ZV9tdWx0aV9zdGF0ZShocF9vbmxpbmUpOworfQorbW9kdWxlX2V4aXQocGFkYXRhX2RyaXZlcl9leGl0KTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3BpZF9uYW1lc3BhY2UuYyBiL2tlcm5lbC9waWRfbmFtZXNwYWNlLmMKaW5kZXggYTY1YmExMy4uZGY5ZThlOSAxMDA2NDQKLS0tIGEva2VybmVsL3BpZF9uYW1lc3BhY2UuYworKysgYi9rZXJuZWwvcGlkX25hbWVzcGFjZS5jCkBAIC03OSwyMyArNzksMzYgQEAKIC8qIE1BWF9QSURfTlNfTEVWRUwgaXMgbmVlZGVkIGZvciBsaW1pdGluZyBzaXplIG9mICdzdHJ1Y3QgcGlkJyAqLwogI2RlZmluZSBNQVhfUElEX05TX0xFVkVMIDMyCiAKK3N0YXRpYyBzdHJ1Y3QgdWNvdW50cyAqaW5jX3BpZF9uYW1lc3BhY2VzKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7CisJcmV0dXJuIGluY191Y291bnQobnMsIGN1cnJlbnRfZXVpZCgpLCBVQ09VTlRfUElEX05BTUVTUEFDRVMpOworfQorCitzdGF0aWMgdm9pZCBkZWNfcGlkX25hbWVzcGFjZXMoc3RydWN0IHVjb3VudHMgKnVjb3VudHMpCit7CisJZGVjX3Vjb3VudCh1Y291bnRzLCBVQ09VTlRfUElEX05BTUVTUEFDRVMpOworfQorCiBzdGF0aWMgc3RydWN0IHBpZF9uYW1lc3BhY2UgKmNyZWF0ZV9waWRfbmFtZXNwYWNlKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywKIAlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqcGFyZW50X3BpZF9ucykKIHsKIAlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnM7CiAJdW5zaWduZWQgaW50IGxldmVsID0gcGFyZW50X3BpZF9ucy0+bGV2ZWwgKyAxOworCXN0cnVjdCB1Y291bnRzICp1Y291bnRzOwogCWludCBpOwogCWludCBlcnI7CiAKLQlpZiAobGV2ZWwgPiBNQVhfUElEX05TX0xFVkVMKSB7Ci0JCWVyciA9IC1FSU5WQUw7CisJZXJyID0gLUVOT1NQQzsKKwlpZiAobGV2ZWwgPiBNQVhfUElEX05TX0xFVkVMKQogCQlnb3RvIG91dDsKLQl9CisJdWNvdW50cyA9IGluY19waWRfbmFtZXNwYWNlcyh1c2VyX25zKTsKKwlpZiAoIXVjb3VudHMpCisJCWdvdG8gb3V0OwogCiAJZXJyID0gLUVOT01FTTsKIAlucyA9IGttZW1fY2FjaGVfemFsbG9jKHBpZF9uc19jYWNoZXAsIEdGUF9LRVJORUwpOwogCWlmIChucyA9PSBOVUxMKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfZGVjOwogCiAJbnMtPnBpZG1hcFswXS5wYWdlID0ga3phbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghbnMtPnBpZG1hcFswXS5wYWdlKQpAQCAtMTE0LDYgKzEyNyw3IEBACiAJbnMtPmxldmVsID0gbGV2ZWw7CiAJbnMtPnBhcmVudCA9IGdldF9waWRfbnMocGFyZW50X3BpZF9ucyk7CiAJbnMtPnVzZXJfbnMgPSBnZXRfdXNlcl9ucyh1c2VyX25zKTsKKwlucy0+dWNvdW50cyA9IHVjb3VudHM7CiAJbnMtPm5yX2hhc2hlZCA9IFBJRE5TX0hBU0hfQURESU5HOwogCUlOSVRfV09SSygmbnMtPnByb2Nfd29yaywgcHJvY19jbGVhbnVwX3dvcmspOwogCkBAIC0xMjksNiArMTQzLDggQEAKIAlrZnJlZShucy0+cGlkbWFwWzBdLnBhZ2UpOwogb3V0X2ZyZWU6CiAJa21lbV9jYWNoZV9mcmVlKHBpZF9uc19jYWNoZXAsIG5zKTsKK291dF9kZWM6CisJZGVjX3BpZF9uYW1lc3BhY2VzKHVjb3VudHMpOwogb3V0OgogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CkBAIC0xNDYsNiArMTYyLDcgQEAKIAluc19mcmVlX2ludW0oJm5zLT5ucyk7CiAJZm9yIChpID0gMDsgaSA8IFBJRE1BUF9FTlRSSUVTOyBpKyspCiAJCWtmcmVlKG5zLT5waWRtYXBbaV0ucGFnZSk7CisJZGVjX3BpZF9uYW1lc3BhY2VzKG5zLT51Y291bnRzKTsKIAlwdXRfdXNlcl9ucyhucy0+dXNlcl9ucyk7CiAJY2FsbF9yY3UoJm5zLT5yY3UsIGRlbGF5ZWRfZnJlZV9waWRucyk7CiB9CkBAIC0zODgsMTIgKzQwNSwzNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IG5zX2NvbW1vbiAqcGlkbnNfZ2V0X3BhcmVudChzdHJ1Y3QgbnNfY29tbW9uICpucykKK3sKKwlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqYWN0aXZlID0gdGFza19hY3RpdmVfcGlkX25zKGN1cnJlbnQpOworCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpwaWRfbnMsICpwOworCisJLyogU2VlIGlmIHRoZSBwYXJlbnQgaXMgaW4gdGhlIGN1cnJlbnQgbmFtZXNwYWNlICovCisJcGlkX25zID0gcCA9IHRvX3BpZF9ucyhucyktPnBhcmVudDsKKwlmb3IgKDs7KSB7CisJCWlmICghcCkKKwkJCXJldHVybiBFUlJfUFRSKC1FUEVSTSk7CisJCWlmIChwID09IGFjdGl2ZSkKKwkJCWJyZWFrOworCQlwID0gcC0+cGFyZW50OworCX0KKworCXJldHVybiAmZ2V0X3BpZF9ucyhwaWRfbnMpLT5uczsKK30KKworc3RhdGljIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqcGlkbnNfb3duZXIoc3RydWN0IG5zX2NvbW1vbiAqbnMpCit7CisJcmV0dXJuIHRvX3BpZF9ucyhucyktPnVzZXJfbnM7Cit9CisKIGNvbnN0IHN0cnVjdCBwcm9jX25zX29wZXJhdGlvbnMgcGlkbnNfb3BlcmF0aW9ucyA9IHsKIAkubmFtZQkJPSAicGlkIiwKIAkudHlwZQkJPSBDTE9ORV9ORVdQSUQsCiAJLmdldAkJPSBwaWRuc19nZXQsCiAJLnB1dAkJPSBwaWRuc19wdXQsCiAJLmluc3RhbGwJPSBwaWRuc19pbnN0YWxsLAorCS5vd25lcgkJPSBwaWRuc19vd25lciwKKwkuZ2V0X3BhcmVudAk9IHBpZG5zX2dldF9wYXJlbnQsCiB9OwogCiBzdGF0aWMgX19pbml0IGludCBwaWRfbmFtZXNwYWNlc19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IDY4ZDNlYmMuLmU4NTE3YjYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0xODYsNyArMTg2LDcgQEAKIAogY29uZmlnIERQTV9XQVRDSERPRwogCWJvb2wgIkRldmljZSBzdXNwZW5kL3Jlc3VtZSB3YXRjaGRvZyIKLQlkZXBlbmRzIG9uIFBNX0RFQlVHICYmIFBTVE9SRQorCWRlcGVuZHMgb24gUE1fREVCVUcgJiYgUFNUT1JFICYmIEVYUEVSVAogCS0tLWhlbHAtLS0KIAkgIFNldHMgdXAgYSB3YXRjaGRvZyB0aW1lciB0byBjYXB0dXJlIGRyaXZlcnMgdGhhdCBhcmUKIAkgIGxvY2tlZCB1cCBhdHRlbXB0aW5nIHRvIHN1c3BlbmQvcmVzdW1lIGEgZGV2aWNlLgpAQCAtMTk3LDcgKzE5Nyw3IEBACiBjb25maWcgRFBNX1dBVENIRE9HX1RJTUVPVVQKIAlpbnQgIldhdGNoZG9nIHRpbWVvdXQgaW4gc2Vjb25kcyIKIAlyYW5nZSAxIDEyMAotCWRlZmF1bHQgNjAKKwlkZWZhdWx0IDEyMAogCWRlcGVuZHMgb24gRFBNX1dBVENIRE9HCiAKIGNvbmZpZyBQTV9UUkFDRQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jIGIva2VybmVsL3Bvd2VyL2hpYmVybmF0ZS5jCmluZGV4IDMzYzc5YjYuLmIyNmRiYzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9oaWJlcm5hdGUuYworKysgYi9rZXJuZWwvcG93ZXIvaGliZXJuYXRlLmMKQEAgLTMwNiw4ICszMDYsMTAgQEAKIAlpZiAoZXJyb3IpCiAJCXByaW50ayhLRVJOX0VSUiAiUE06IEVycm9yICVkIGNyZWF0aW5nIGhpYmVybmF0aW9uIGltYWdlXG4iLAogCQkJZXJyb3IpOwotCWlmICghaW5fc3VzcGVuZCkKKwlpZiAoIWluX3N1c3BlbmQpIHsKIAkJZXZlbnRzX2NoZWNrX2VuYWJsZWQgPSBmYWxzZTsKKwkJY2xlYXJfZnJlZV9wYWdlcygpOworCX0KIAogCXBsYXRmb3JtX2xlYXZlKHBsYXRmb3JtX21vZGUpOwogCkBAIC0xMTg5LDIyICsxMTkxLDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgcGFnZV9wb2lzb25fbm9oaWJlcm5hdGVfc2V0dXAoY2hhciAqc3RyKQotewotI2lmZGVmIENPTkZJR19QQUdFX1BPSVNPTklOR19aRVJPCi0JLyoKLQkgKiBUaGUgemVyb2luZyBvcHRpb24gZm9yIHBhZ2UgcG9pc29uIHNraXBzIHRoZSBjaGVja3Mgb24gYWxsb2MuCi0JICogc2luY2UgaGliZXJuYXRpb24gZG9lc24ndCBzYXZlIGZyZWUgcGFnZXMgdGhlcmUncyBubyB3YXkgdG8KLQkgKiBndWFyYW50ZWUgdGhlIHBhZ2VzIHdpbGwgc3RpbGwgYmUgemVyb2VkLgotCSAqLwotCWlmICghc3RyY21wKHN0ciwgIm9uIikpIHsKLQkJcHJfaW5mbygiRGlzYWJsaW5nIGhpYmVybmF0aW9uIGR1ZSB0byBwYWdlIHBvaXNvbmluZ1xuIik7Ci0JCXJldHVybiBub2hpYmVybmF0ZV9zZXR1cChzdHIpOwotCX0KLSNlbmRpZgotCXJldHVybiAxOwotfQotCiBfX3NldHVwKCJub3Jlc3VtZSIsIG5vcmVzdW1lX3NldHVwKTsKIF9fc2V0dXAoInJlc3VtZV9vZmZzZXQ9IiwgcmVzdW1lX29mZnNldF9zZXR1cCk7CiBfX3NldHVwKCJyZXN1bWU9IiwgcmVzdW1lX3NldHVwKTsKQEAgLTEyMTIsNCArMTE5OCwzIEBACiBfX3NldHVwKCJyZXN1bWV3YWl0IiwgcmVzdW1ld2FpdF9zZXR1cCk7CiBfX3NldHVwKCJyZXN1bWVkZWxheT0iLCByZXN1bWVkZWxheV9zZXR1cCk7CiBfX3NldHVwKCJub2hpYmVybmF0ZSIsIG5vaGliZXJuYXRlX3NldHVwKTsKLV9fc2V0dXAoInBhZ2VfcG9pc29uPSIsIHBhZ2VfcG9pc29uX25vaGliZXJuYXRlX3NldHVwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9tYWluLmMgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCmluZGV4IDVlYTUwYjEuLjI4MWE2OTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9tYWluLmMKKysrIGIva2VybmVsL3Bvd2VyL21haW4uYwpAQCAtNjQ0LDYgKzY0NCw3IEBACiAJCXJldHVybiBlcnJvcjsKIAloaWJlcm5hdGVfaW1hZ2Vfc2l6ZV9pbml0KCk7CiAJaGliZXJuYXRlX3Jlc2VydmVkX3NpemVfaW5pdCgpOworCXBtX3N0YXRlc19pbml0KCk7CiAJcG93ZXJfa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoInBvd2VyIiwgTlVMTCk7CiAJaWYgKCFwb3dlcl9rb2JqKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9wb3dlci5oIGIva2VybmVsL3Bvd2VyL3Bvd2VyLmgKaW5kZXggMjQyZDhiOC4uNTZkMWQwZCAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3Bvd2VyLmgKKysrIGIva2VybmVsL3Bvd2VyL3Bvd2VyLmgKQEAgLTExMCw2ICsxMTAsOCBAQAogZXh0ZXJuIHZvaWQgZnJlZV9iYXNpY19tZW1vcnlfYml0bWFwcyh2b2lkKTsKIGV4dGVybiBpbnQgaGliZXJuYXRlX3ByZWFsbG9jYXRlX21lbW9yeSh2b2lkKTsKIAorZXh0ZXJuIHZvaWQgY2xlYXJfZnJlZV9wYWdlcyh2b2lkKTsKKwogLyoqCiAgKglBdXhpbGlhcnkgc3RydWN0dXJlIHVzZWQgZm9yIHJlYWRpbmcgdGhlIHNuYXBzaG90IGltYWdlIGRhdGEgYW5kCiAgKgltZXRhZGF0YSBmcm9tIGFuZCB3cml0aW5nIHRoZW0gdG8gdGhlIGxpc3Qgb2YgcGFnZSBiYWNrdXAgZW50cmllcwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Fvcy5jIGIva2VybmVsL3Bvd2VyL3Fvcy5jCmluZGV4IDk3YjBkZjcuLjE2OGZmNDQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9xb3MuYworKysgYi9rZXJuZWwvcG93ZXIvcW9zLmMKQEAgLTQ4Miw3ICs0ODIsMTYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcmVxLT53b3JrKTsKKwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCB2ZXJ5IGVhcmx5IGR1cmluZyBib290LCBmb3IgZXhhbXBsZSwKKwkgKiBmcm9tIG9mX2Nsa19pbml0KCksIHdoZXJlIGlycSBuZWVkcyB0byBzdGF5IGRpc2FibGVkLgorCSAqIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygpIGFzc3VtZXMgdGhhdCBpcnEgaXMgZW5hYmxlZCBvbgorCSAqIGludm9jYXRpb24gYW5kIHJlLWVuYWJsZXMgaXQgb24gcmV0dXJuLiAgQXZvaWQgY2FsbGluZyBpdCB1bnRpbAorCSAqIHdvcmtxdWV1ZSBpcyBpbml0aWFsaXplZC4KKwkgKi8KKwlpZiAoa2V2ZW50ZF91cCgpKQorCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnJlcS0+d29yayk7CisKIAlfX3BtX3Fvc191cGRhdGVfcmVxdWVzdChyZXEsIG5ld192YWx1ZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbV9xb3NfdXBkYXRlX3JlcXVlc3QpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwppbmRleCBiMDIyMjg0Li40ZjBmMDYwIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYworKysgYi9rZXJuZWwvcG93ZXIvc25hcHNob3QuYwpAQCAtMTEzMiw2ICsxMTMyLDI4IEBACiAJcHJfZGVidWcoIlBNOiBCYXNpYyBtZW1vcnkgYml0bWFwcyBmcmVlZFxuIik7CiB9CiAKK3ZvaWQgY2xlYXJfZnJlZV9wYWdlcyh2b2lkKQoreworI2lmZGVmIENPTkZJR19QQUdFX1BPSVNPTklOR19aRVJPCisJc3RydWN0IG1lbW9yeV9iaXRtYXAgKmJtID0gZnJlZV9wYWdlc19tYXA7CisJdW5zaWduZWQgbG9uZyBwZm47CisKKwlpZiAoV0FSTl9PTighKGZyZWVfcGFnZXNfbWFwKSkpCisJCXJldHVybjsKKworCW1lbW9yeV9ibV9wb3NpdGlvbl9yZXNldChibSk7CisJcGZuID0gbWVtb3J5X2JtX25leHRfcGZuKGJtKTsKKwl3aGlsZSAocGZuICE9IEJNX0VORF9PRl9NQVApIHsKKwkJaWYgKHBmbl92YWxpZChwZm4pKQorCQkJY2xlYXJfaGlnaHBhZ2UocGZuX3RvX3BhZ2UocGZuKSk7CisKKwkJcGZuID0gbWVtb3J5X2JtX25leHRfcGZuKGJtKTsKKwl9CisJbWVtb3J5X2JtX3Bvc2l0aW9uX3Jlc2V0KGJtKTsKKwlwcl9pbmZvKCJQTTogZnJlZSBwYWdlcyBjbGVhcmVkIGFmdGVyIHJlc3RvcmVcbiIpOworI2VuZGlmIC8qIFBBR0VfUE9JU09OSU5HX1pFUk8gKi8KK30KKwogLyoqCiAgKiBzbmFwc2hvdF9hZGRpdGlvbmFsX3BhZ2VzIC0gRXN0aW1hdGUgdGhlIG51bWJlciBvZiBleHRyYSBwYWdlcyBuZWVkZWQuCiAgKiBAem9uZTogTWVtb3J5IHpvbmUgdG8gY2Fycnkgb3V0IHRoZSBjb21wdXRhdGlvbiBmb3IuCmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jIGIva2VybmVsL3Bvd2VyL3N1c3BlbmQuYwppbmRleCAwYWNhYjlkLi4xZTdmNWRhIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCisrKyBiL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKQEAgLTExOCwxMCArMTE4LDE4IEBACiAgKi8KIHN0YXRpYyBib29sIHJlbGF0aXZlX3N0YXRlczsKIAordm9pZCBfX2luaXQgcG1fc3RhdGVzX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIGZyZWV6ZSBzdGF0ZSBzaG91bGQgYmUgc3VwcG9ydGVkIGV2ZW4gd2l0aG91dCBhbnkgc3VzcGVuZF9vcHMsCisJICogaW5pdGlhbGl6ZSBwbV9zdGF0ZXMgYWNjb3JkaW5nbHkgaGVyZQorCSAqLworCXBtX3N0YXRlc1tQTV9TVVNQRU5EX0ZSRUVaRV0gPSBwbV9sYWJlbHNbcmVsYXRpdmVfc3RhdGVzID8gMCA6IDJdOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBzbGVlcF9zdGF0ZXNfc2V0dXAoY2hhciAqc3RyKQogewogCXJlbGF0aXZlX3N0YXRlcyA9ICFzdHJuY21wKHN0ciwgIjEiLCAxKTsKLQlwbV9zdGF0ZXNbUE1fU1VTUEVORF9GUkVFWkVdID0gcG1fbGFiZWxzW3JlbGF0aXZlX3N0YXRlcyA/IDAgOiAyXTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjExLDcgKzIxOSw3IEBACiB7CiAJaWYgKHN0YXRlID09IFBNX1NVU1BFTkRfRlJFRVpFICYmIGZyZWV6ZV9vcHMgJiYgZnJlZXplX29wcy0+YmVnaW4pCiAJCXJldHVybiBmcmVlemVfb3BzLT5iZWdpbigpOwotCWVsc2UgaWYgKHN1c3BlbmRfb3BzLT5iZWdpbikKKwllbHNlIGlmIChzdXNwZW5kX29wcyAmJiBzdXNwZW5kX29wcy0+YmVnaW4pCiAJCXJldHVybiBzdXNwZW5kX29wcy0+YmVnaW4oc3RhdGUpOwogCWVsc2UKIAkJcmV0dXJuIDA7CkBAIC0yMjEsNyArMjI5LDcgQEAKIHsKIAlpZiAoc3RhdGUgPT0gUE1fU1VTUEVORF9GUkVFWkUgJiYgZnJlZXplX29wcyAmJiBmcmVlemVfb3BzLT5lbmQpCiAJCWZyZWV6ZV9vcHMtPmVuZCgpOwotCWVsc2UgaWYgKHN1c3BlbmRfb3BzLT5lbmQpCisJZWxzZSBpZiAoc3VzcGVuZF9vcHMgJiYgc3VzcGVuZF9vcHMtPmVuZCkKIAkJc3VzcGVuZF9vcHMtPmVuZCgpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrL25taS5jIGIva2VybmVsL3ByaW50ay9ubWkuYwppbmRleCBiNjllYjhhLi4xNmJhYjQ3IDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrL25taS5jCisrKyBiL2tlcm5lbC9wcmludGsvbm1pLmMKQEAgLTk5LDI3ICs5OSwzMyBAQAogCXJldHVybiBhZGQ7CiB9CiAKLS8qCi0gKiBwcmludGsgb25lIGxpbmUgZnJvbSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciBmcm9tIEBzdGFydCBpbmRleCB1bnRpbAotICogYW5kIGluY2x1ZGluZyB0aGUgQGVuZCBpbmRleC4KLSAqLwotc3RhdGljIHZvaWQgcHJpbnRfbm1pX3NlcV9saW5lKHN0cnVjdCBubWlfc2VxX2J1ZiAqcywgaW50IHN0YXJ0LCBpbnQgZW5kKQorc3RhdGljIHZvaWQgcHJpbnRrX25taV9mbHVzaF9saW5lKGNvbnN0IGNoYXIgKnRleHQsIGludCBsZW4pCiB7Ci0JY29uc3QgY2hhciAqYnVmID0gcy0+YnVmZmVyICsgc3RhcnQ7Ci0KIAkvKgogCSAqIFRoZSBidWZmZXJzIGFyZSBmbHVzaGVkIGluIE5NSSBvbmx5IG9uIHBhbmljLiAgVGhlIG1lc3NhZ2VzIG11c3QKIAkgKiBnbyBvbmx5IGludG8gdGhlIHJpbmcgYnVmZmVyIGF0IHRoaXMgc3RhZ2UuICBDb25zb2xlcyB3aWxsIGdldAogCSAqIGV4cGxpY2l0bHkgY2FsbGVkIGxhdGVyIHdoZW4gYSBjcmFzaGR1bXAgaXMgbm90IGdlbmVyYXRlZC4KIAkgKi8KIAlpZiAoaW5fbm1pKCkpCi0JCXByaW50a19kZWZlcnJlZCgiJS4qcyIsIChlbmQgLSBzdGFydCkgKyAxLCBidWYpOworCQlwcmludGtfZGVmZXJyZWQoIiUuKnMiLCBsZW4sIHRleHQpOwogCWVsc2UKLQkJcHJpbnRrKCIlLipzIiwgKGVuZCAtIHN0YXJ0KSArIDEsIGJ1Zik7CisJCXByaW50aygiJS4qcyIsIGxlbiwgdGV4dCk7CiAKIH0KIAogLyoKKyAqIHByaW50ayBvbmUgbGluZSBmcm9tIHRoZSB0ZW1wb3JhcnkgYnVmZmVyIGZyb20gQHN0YXJ0IGluZGV4IHVudGlsCisgKiBhbmQgaW5jbHVkaW5nIHRoZSBAZW5kIGluZGV4LgorICovCitzdGF0aWMgdm9pZCBwcmludGtfbm1pX2ZsdXNoX3NlcV9saW5lKHN0cnVjdCBubWlfc2VxX2J1ZiAqcywKKwkJCQkJaW50IHN0YXJ0LCBpbnQgZW5kKQoreworCWNvbnN0IGNoYXIgKmJ1ZiA9IHMtPmJ1ZmZlciArIHN0YXJ0OworCisJcHJpbnRrX25taV9mbHVzaF9saW5lKGJ1ZiwgKGVuZCAtIHN0YXJ0KSArIDEpOworfQorCisvKgogICogRmx1c2ggZGF0YSBmcm9tIHRoZSBhc3NvY2lhdGVkIHBlcl9DUFUgYnVmZmVyLiBUaGUgZnVuY3Rpb24KICAqIGNhbiBiZSBjYWxsZWQgZWl0aGVyIHZpYSBJUlEgd29yayBvciBpbmRlcGVuZGVudGx5LgogICovCkBAIC0xNTAsOSArMTU2LDExIEBACiAJICogdGhlIGJ1ZmZlciBhbiB1bmV4cGVjdGVkIHdheS4gSWYgd2UgcHJpbnRlZCBzb21ldGhpbmcgdGhlbgogCSAqIEBsZW4gbXVzdCBvbmx5IGluY3JlYXNlLgogCSAqLwotCWlmIChpICYmIGkgPj0gbGVuKQotCQlwcl9lcnIoInByaW50a19ubWlfZmx1c2g6IGludGVybmFsIGVycm9yOiBpPSVkID49IGxlbj0lenVcbiIsCi0JCSAgICAgICBpLCBsZW4pOworCWlmIChpICYmIGkgPj0gbGVuKSB7CisJCWNvbnN0IGNoYXIgKm1zZyA9ICJwcmludGtfbm1pX2ZsdXNoOiBpbnRlcm5hbCBlcnJvclxuIjsKKworCQlwcmludGtfbm1pX2ZsdXNoX2xpbmUobXNnLCBzdHJsZW4obXNnKSk7CisJfQogCiAJaWYgKCFsZW4pCiAJCWdvdG8gb3V0OyAvKiBTb21lb25lIGVsc2UgaGFzIGFscmVhZHkgZmx1c2hlZCB0aGUgYnVmZmVyLiAqLwpAQCAtMTY2LDE0ICsxNzQsMTQgQEAKIAkvKiBQcmludCBsaW5lIGJ5IGxpbmUuICovCiAJZm9yICg7IGkgPCBzaXplOyBpKyspIHsKIAkJaWYgKHMtPmJ1ZmZlcltpXSA9PSAnXG4nKSB7Ci0JCQlwcmludF9ubWlfc2VxX2xpbmUocywgbGFzdF9pLCBpKTsKKwkJCXByaW50a19ubWlfZmx1c2hfc2VxX2xpbmUocywgbGFzdF9pLCBpKTsKIAkJCWxhc3RfaSA9IGkgKyAxOwogCQl9CiAJfQogCS8qIENoZWNrIGlmIHRoZXJlIHdhcyBhIHBhcnRpYWwgbGluZS4gKi8KIAlpZiAobGFzdF9pIDwgc2l6ZSkgewotCQlwcmludF9ubWlfc2VxX2xpbmUocywgbGFzdF9pLCBzaXplIC0gMSk7Ci0JCXByX2NvbnQoIlxuIik7CisJCXByaW50a19ubWlfZmx1c2hfc2VxX2xpbmUocywgbGFzdF9pLCBzaXplIC0gMSk7CisJCXByaW50a19ubWlfZmx1c2hfbGluZSgiXG4iLCBzdHJsZW4oIlxuIikpOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3JjdXBlcmYuYyBiL2tlcm5lbC9yY3UvcmN1cGVyZi5jCmluZGV4IGQzOGFiMDguLjEyM2NjYmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3UvcmN1cGVyZi5jCisrKyBiL2tlcm5lbC9yY3UvcmN1cGVyZi5jCkBAIC01Miw3ICs1Miw3IEBACiAKICNkZWZpbmUgUEVSRl9GTEFHICItcGVyZjoiCiAjZGVmaW5lIFBFUkZPVVRfU1RSSU5HKHMpIFwKLQlwcl9hbGVydCgiJXMiIFBFUkZfRkxBRyBzICJcbiIsIHBlcmZfdHlwZSkKKwlwcl9hbGVydCgiJXMiIFBFUkZfRkxBRyAiICVzXG4iLCBwZXJmX3R5cGUsIHMpCiAjZGVmaW5lIFZFUkJPU0VfUEVSRk9VVF9TVFJJTkcocykgXAogCWRvIHsgaWYgKHZlcmJvc2UpIHByX2FsZXJ0KCIlcyIgUEVSRl9GTEFHICIgJXNcbiIsIHBlcmZfdHlwZSwgcyk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIFZFUkJPU0VfUEVSRk9VVF9FUlJTVFJJTkcocykgXApAQCAtNDAwLDkgKzQwMCw4IEBACiAJCQlzcC5zY2hlZF9wcmlvcml0eSA9IDA7CiAJCQlzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayhjdXJyZW50LAogCQkJCQkJICAgU0NIRURfTk9STUFMLCAmc3ApOwotCQkJcHJfYWxlcnQoIiVzIiBQRVJGX0ZMQUcKLQkJCQkgInJjdV9wZXJmX3dyaXRlciAlbGQgaGFzICVkIG1lYXN1cmVtZW50c1xuIiwKLQkJCQkgcGVyZl90eXBlLCBtZSwgTUlOX01FQVMpOworCQkJcHJfYWxlcnQoIiVzJXMgcmN1X3BlcmZfd3JpdGVyICVsZCBoYXMgJWQgbWVhc3VyZW1lbnRzXG4iLAorCQkJCSBwZXJmX3R5cGUsIFBFUkZfRkxBRywgbWUsIE1JTl9NRUFTKTsKIAkJCWlmIChhdG9taWNfaW5jX3JldHVybigmbl9yY3VfcGVyZl93cml0ZXJfZmluaXNoZWQpID49CiAJCQkgICAgbnJlYWx3cml0ZXJzKSB7CiAJCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKDEwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvcmN1dG9ydHVyZS5jIGIva2VybmVsL3JjdS9yY3V0b3J0dXJlLmMKaW5kZXggOTcxZTJiMS4uYmYwOGZlZSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS9yY3V0b3J0dXJlLmMKKysrIGIva2VybmVsL3JjdS9yY3V0b3J0dXJlLmMKQEAgLTEyMzgsNiArMTIzOCw3IEBACiAJbG9uZyBwaXBlc3VtbWFyeVtSQ1VfVE9SVFVSRV9QSVBFX0xFTiArIDFdID0geyAwIH07CiAJbG9uZyBiYXRjaHN1bW1hcnlbUkNVX1RPUlRVUkVfUElQRV9MRU4gKyAxXSA9IHsgMCB9OwogCXN0YXRpYyB1bnNpZ25lZCBsb25nIHJ0Y3Zfc25hcCA9IFVMT05HX01BWDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnd0cDsKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJZm9yIChpID0gMDsgaSA8IFJDVV9UT1JUVVJFX1BJUEVfTEVOICsgMTsgaSsrKSB7CkBAIC0xMjU4LDggKzEyNTksOSBAQAogCQlhdG9taWNfcmVhZCgmbl9yY3VfdG9ydHVyZV9hbGxvYyksCiAJCWF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX2FsbG9jX2ZhaWwpLAogCQlhdG9taWNfcmVhZCgmbl9yY3VfdG9ydHVyZV9mcmVlKSk7Ci0JcHJfY29udCgicnRtYmU6ICVkIHJ0YmtlOiAlbGQgcnRicmU6ICVsZCAiLAorCXByX2NvbnQoInJ0bWJlOiAlZCBydGJlOiAlbGQgcnRia2U6ICVsZCBydGJyZTogJWxkICIsCiAJCWF0b21pY19yZWFkKCZuX3JjdV90b3J0dXJlX21iZXJyb3IpLAorCQluX3JjdV90b3J0dXJlX2JhcnJpZXJfZXJyb3IsCiAJCW5fcmN1X3RvcnR1cmVfYm9vc3Rfa3RyZXJyb3IsCiAJCW5fcmN1X3RvcnR1cmVfYm9vc3RfcnRlcnJvcik7CiAJcHJfY29udCgicnRiZjogJWxkIHJ0YjogJWxkIG50OiAlbGQgIiwKQEAgLTEzMTIsMTAgKzEzMTQsMTIgQEAKIAogCQlyY3V0b3J0dXJlX2dldF9ncF9kYXRhKGN1cl9vcHMtPnR0eXBlLAogCQkJCSAgICAgICAmZmxhZ3MsICZncG51bSwgJmNvbXBsZXRlZCk7Ci0JCXByX2FsZXJ0KCI/Pz8gV3JpdGVyIHN0YWxsIHN0YXRlICVzKCVkKSBnJWx1IGMlbHUgZiUjeFxuIiwKKwkJd3RwID0gUkVBRF9PTkNFKHdyaXRlcl90YXNrKTsKKwkJcHJfYWxlcnQoIj8/PyBXcml0ZXIgc3RhbGwgc3RhdGUgJXMoJWQpIGclbHUgYyVsdSBmJSN4IC0+c3RhdGUgJSNseFxuIiwKIAkJCSByY3VfdG9ydHVyZV93cml0ZXJfc3RhdGVfZ2V0bmFtZSgpLAogCQkJIHJjdV90b3J0dXJlX3dyaXRlcl9zdGF0ZSwKLQkJCSBncG51bSwgY29tcGxldGVkLCBmbGFncyk7CisJCQkgZ3BudW0sIGNvbXBsZXRlZCwgZmxhZ3MsCisJCQkgd3RwID09IE5VTEwgPyB+MFVMIDogd3RwLT5zdGF0ZSk7CiAJCXNob3dfcmN1X2dwX2t0aHJlYWRzKCk7CiAJCXJjdV9mdHJhY2VfZHVtcChEVU1QX0FMTCk7CiAJfQpAQCAtMTM2MiwxMiArMTM2NiwxMiBAQAogCQkgb25vZmZfaW50ZXJ2YWwsIG9ub2ZmX2hvbGRvZmYpOwogfQogCi1zdGF0aWMgdm9pZCByY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChpbnQgY3B1KQorc3RhdGljIGludCByY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cCh1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsKIAogCWlmIChib29zdF90YXNrc1tjcHVdID09IE5VTEwpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJbXV0ZXhfbG9jaygmYm9vc3RfbXV0ZXgpOwogCXQgPSBib29zdF90YXNrc1tjcHVdOwogCWJvb3N0X3Rhc2tzW2NwdV0gPSBOVUxMOwpAQCAtMTM3NSw5ICsxMzc5LDEwIEBACiAKIAkvKiBUaGlzIG11c3QgYmUgb3V0c2lkZSBvZiB0aGUgbXV0ZXgsIG90aGVyd2lzZSBkZWFkbG9jayEgKi8KIAl0b3J0dXJlX3N0b3Bfa3RocmVhZChyY3VfdG9ydHVyZV9ib29zdCwgdCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoaW50IGNwdSkKK3N0YXRpYyBpbnQgcmN1dG9ydHVyZV9ib29zdGVyX2luaXQodW5zaWduZWQgaW50IGNwdSkKIHsKIAlpbnQgcmV0dmFsOwogCkBAIC0xNTc3LDI4ICsxNTgyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcmN1dG9ydHVyZV9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCQkgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCi17Ci0JbG9uZyBjcHUgPSAobG9uZyloY3B1OwotCi0Jc3dpdGNoIChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgewotCWNhc2UgQ1BVX09OTElORToKLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQkJKHZvaWQpcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQlyY3V0b3J0dXJlX2Jvb3N0ZXJfY2xlYW51cChjcHUpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0JcmV0dXJuIE5PVElGWV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayByY3V0b3J0dXJlX2NwdV9uYiA9IHsKLQkubm90aWZpZXJfY2FsbCA9IHJjdXRvcnR1cmVfY3B1X25vdGlmeSwKLX07CitzdGF0aWMgZW51bSBjcHVocF9zdGF0ZSByY3V0b3JfaHA7CiAKIHN0YXRpYyB2b2lkCiByY3VfdG9ydHVyZV9jbGVhbnVwKHZvaWQpCkBAIC0xNjM4LDExICsxNjIyLDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgbmNiZmxvb2RlcnM7IGkrKykKIAkJdG9ydHVyZV9zdG9wX2t0aHJlYWQocmN1X3RvcnR1cmVfY2JmbG9vZCwgY2JmbG9vZF90YXNrW2ldKTsKIAlpZiAoKHRlc3RfYm9vc3QgPT0gMSAmJiBjdXJfb3BzLT5jYW5fYm9vc3QpIHx8Ci0JICAgIHRlc3RfYm9vc3QgPT0gMikgewotCQl1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcigmcmN1dG9ydHVyZV9jcHVfbmIpOwotCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJCXJjdXRvcnR1cmVfYm9vc3Rlcl9jbGVhbnVwKGkpOwotCX0KKwkgICAgdGVzdF9ib29zdCA9PSAyKQorCQljcHVocF9yZW1vdmVfc3RhdGUocmN1dG9yX2hwKTsKIAogCS8qCiAJICogV2FpdCBmb3IgYWxsIFJDVSBjYWxsYmFja3MgdG8gZmlyZSwgdGhlbiBkbyBmbGF2b3Itc3BlY2lmaWMKQEAgLTE4NjksMTQgKzE4NTAsMTMgQEAKIAkgICAgdGVzdF9ib29zdCA9PSAyKSB7CiAKIAkJYm9vc3Rfc3RhcnR0aW1lID0gamlmZmllcyArIHRlc3RfYm9vc3RfaW50ZXJ2YWwgKiBIWjsKLQkJcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZyY3V0b3J0dXJlX2NwdV9uYik7Ci0JCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCQlpZiAoY3B1X2lzX29mZmxpbmUoaSkpCi0JCQkJY29udGludWU7ICAvKiBIZXVyaXN0aWM6IENQVSBjYW4gZ28gb2ZmbGluZS4gKi8KLQkJCWZpcnN0ZXJyID0gcmN1dG9ydHVyZV9ib29zdGVyX2luaXQoaSk7Ci0JCQlpZiAoZmlyc3RlcnIpCi0JCQkJZ290byB1bndpbmQ7Ci0JCX0KKworCQlmaXJzdGVyciA9IGNwdWhwX3NldHVwX3N0YXRlKENQVUhQX0FQX09OTElORV9EWU4sICJSQ1VfVE9SVFVSRSIsCisJCQkJCSAgICAgcmN1dG9ydHVyZV9ib29zdGVyX2luaXQsCisJCQkJCSAgICAgcmN1dG9ydHVyZV9ib29zdGVyX2NsZWFudXApOworCQlpZiAoZmlyc3RlcnIgPCAwKQorCQkJZ290byB1bndpbmQ7CisJCXJjdXRvcl9ocCA9IGZpcnN0ZXJyOwogCX0KIAlmaXJzdGVyciA9IHRvcnR1cmVfc2h1dGRvd25faW5pdChzaHV0ZG93bl9zZWNzLCByY3VfdG9ydHVyZV9jbGVhbnVwKTsKIAlpZiAoZmlyc3RlcnIpCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3N5bmMuYyBiL2tlcm5lbC9yY3Uvc3luYy5jCmluZGV4IGJlOTIyYzkuLjUwZDE4NjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3Uvc3luYy5jCisrKyBiL2tlcm5lbC9yY3Uvc3luYy5jCkBAIC02OCw2ICs2OCw4IEBACiAJUkNVX0xPQ0tERVBfV0FSTighZ3Bfb3BzW3JzcC0+Z3BfdHlwZV0uaGVsZCgpLAogCQkJICJzdXNwaWNpb3VzIHJjdV9zeW5jX2lzX2lkbGUoKSB1c2FnZSIpOwogfQorCitFWFBPUlRfU1lNQk9MX0dQTChyY3Vfc3luY19sb2NrZGVwX2Fzc2VydCk7CiAjZW5kaWYKIAogLyoqCkBAIC04Myw2ICs4NSwxOCBAQAogfQogCiAvKioKKyAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIHJjdV9zeW5jX2luaXQoKSBhbmQgYmVmb3JlIGZpcnN0IHVzZS4KKyAqCisgKiBFbnN1cmVzIHJjdV9zeW5jX2lzX2lkbGUoKSByZXR1cm5zIGZhbHNlIGFuZCByY3Vfc3luY197ZW50ZXIsZXhpdH0oKQorICogcGFpcnMgdHVybiBpbnRvIE5PLU9Qcy4KKyAqLwordm9pZCByY3Vfc3luY19lbnRlcl9zdGFydChzdHJ1Y3QgcmN1X3N5bmMgKnJzcCkKK3sKKwlyc3AtPmdwX2NvdW50Kys7CisJcnNwLT5ncF9zdGF0ZSA9IEdQX1BBU1NFRDsKK30KKworLyoqCiAgKiByY3Vfc3luY19lbnRlcigpIC0gRm9yY2UgcmVhZGVycyBvbnRvIHNsb3dwYXRoCiAgKiBAcnNwOiBQb2ludGVyIHRvIHJjdV9zeW5jIHN0cnVjdHVyZSB0byB1c2UgZm9yIHN5bmNocm9uaXphdGlvbgogICoKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdHJlZS5jIGIva2VybmVsL3JjdS90cmVlLmMKaW5kZXggNWQ4MDkyNS4uN2UyZTAzOCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlLmMKKysrIGIva2VybmVsL3JjdS90cmVlLmMKQEAgLTQxLDcgKzQxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgpAQCAtNjAsNyArNTksNiBAQAogI2luY2x1ZGUgInRyZWUuaCIKICNpbmNsdWRlICJyY3UuaCIKIAotTU9EVUxFX0FMSUFTKCJyY3V0cmVlIik7CiAjaWZkZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAogI3VuZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKICNlbmRpZgpAQCAtMTg0OCw2ICsxODQ2LDcgQEAKIAkJCSAgICAgIHN0cnVjdCByY3VfZGF0YSAqcmRwKQogewogCWJvb2wgcmV0OworCWJvb2wgbmVlZF9ncDsKIAogCS8qIEhhbmRsZSB0aGUgZW5kcyBvZiBhbnkgcHJlY2VkaW5nIGdyYWNlIHBlcmlvZHMgZmlyc3QuICovCiAJaWYgKHJkcC0+Y29tcGxldGVkID09IHJucC0+Y29tcGxldGVkICYmCkBAIC0xODc0LDkgKzE4NzMsMTAgQEAKIAkJICovCiAJCXJkcC0+Z3BudW0gPSBybnAtPmdwbnVtOwogCQl0cmFjZV9yY3VfZ3JhY2VfcGVyaW9kKHJzcC0+bmFtZSwgcmRwLT5ncG51bSwgVFBTKCJjcHVzdGFydCIpKTsKLQkJcmRwLT5jcHVfbm9fcXMuYi5ub3JtID0gdHJ1ZTsKKwkJbmVlZF9ncCA9ICEhKHJucC0+cXNtYXNrICYgcmRwLT5ncnBtYXNrKTsKKwkJcmRwLT5jcHVfbm9fcXMuYi5ub3JtID0gbmVlZF9ncDsKIAkJcmRwLT5yY3VfcXNfY3RyX3NuYXAgPSBfX3RoaXNfY3B1X3JlYWQocmN1X3FzX2N0cik7Ci0JCXJkcC0+Y29yZV9uZWVkc19xcyA9ICEhKHJucC0+cXNtYXNrICYgcmRwLT5ncnBtYXNrKTsKKwkJcmRwLT5jb3JlX25lZWRzX3FzID0gbmVlZF9ncDsKIAkJemVyb19jcHVfc3RhbGxfdGlja3MocmRwKTsKIAkJV1JJVEVfT05DRShyZHAtPmdwd3JhcCwgZmFsc2UpOwogCX0KQEAgLTIzNDQsNyArMjM0NCw3IEBACiAJV0FSTl9PTl9PTkNFKCFyY3VfZ3BfaW5fcHJvZ3Jlc3MocnNwKSk7CiAJV1JJVEVfT05DRShyc3AtPmdwX2ZsYWdzLCBSRUFEX09OQ0UocnNwLT5ncF9mbGFncykgfCBSQ1VfR1BfRkxBR19GUVMpOwogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlX3JjdV9ub2RlKHJjdV9nZXRfcm9vdChyc3ApLCBmbGFncyk7Ci0Jc3dha2VfdXAoJnJzcC0+Z3Bfd3EpOyAgLyogTWVtb3J5IGJhcnJpZXIgaW1wbGllZCBieSBzd2FrZV91cCgpIHBhdGguICovCisJcmN1X2dwX2t0aHJlYWRfd2FrZShyc3ApOwogfQogCiAvKgpAQCAtMjk3MCw3ICsyOTcwLDcgQEAKIAl9CiAJV1JJVEVfT05DRShyc3AtPmdwX2ZsYWdzLCBSRUFEX09OQ0UocnNwLT5ncF9mbGFncykgfCBSQ1VfR1BfRkxBR19GUVMpOwogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlX3JjdV9ub2RlKHJucF9vbGQsIGZsYWdzKTsKLQlzd2FrZV91cCgmcnNwLT5ncF93cSk7IC8qIE1lbW9yeSBiYXJyaWVyIGltcGxpZWQgYnkgc3dha2VfdXAoKSBwYXRoLiAqLworCXJjdV9ncF9rdGhyZWFkX3dha2UocnNwKTsKIH0KIAogLyoKQEAgLTM3OTIsOCArMzc5Miw2IEBACiAJcm5wID0gcmRwLT5teW5vZGU7CiAJbWFzayA9IHJkcC0+Z3JwbWFzazsKIAlyYXdfc3Bpbl9sb2NrX3JjdV9ub2RlKHJucCk7CQkvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQuICovCi0Jcm5wLT5xc21hc2tpbml0bmV4dCB8PSBtYXNrOwotCXJucC0+ZXhwbWFza2luaXRuZXh0IHw9IG1hc2s7CiAJaWYgKCFyZHAtPmJlZW5vbmxpbmUpCiAJCVdSSVRFX09OQ0UocnNwLT5uY3B1cywgUkVBRF9PTkNFKHJzcC0+bmNwdXMpICsgMSk7CiAJcmRwLT5iZWVub25saW5lID0gdHJ1ZTsJIC8qIFdlIGhhdmUgbm93IGJlZW4gb25saW5lLiAqLwpAQCAtMzg2MCw2ICszODU4LDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBNYXJrIHRoZSBzcGVjaWZpZWQgQ1BVIGFzIGJlaW5nIG9ubGluZSBzbyB0aGF0IHN1YnNlcXVlbnQgZ3JhY2UgcGVyaW9kcworICogKGJvdGggZXhwZWRpdGVkIGFuZCBub3JtYWwpIHdpbGwgd2FpdCBvbiBpdC4gIE5vdGUgdGhhdCB0aGlzIG1lYW5zIHRoYXQKKyAqIGluY29taW5nIENQVXMgYXJlIG5vdCBhbGxvd2VkIHRvIHVzZSBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zCisgKiB1bnRpbCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gIEZhaWxpbmcgdG8gb2JzZXJ2ZSB0aGlzIHJlc3RyaWN0aW9uCisgKiB3aWxsIHJlc3VsdCBpbiBsb2NrZGVwIHNwbGF0cy4KKyAqLwordm9pZCByY3VfY3B1X3N0YXJ0aW5nKHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJc3RydWN0IHJjdV9kYXRhICpyZHA7CisJc3RydWN0IHJjdV9ub2RlICpybnA7CisJc3RydWN0IHJjdV9zdGF0ZSAqcnNwOworCisJZm9yX2VhY2hfcmN1X2ZsYXZvcihyc3ApIHsKKwkJcmRwID0gdGhpc19jcHVfcHRyKHJzcC0+cmRhKTsKKwkJcm5wID0gcmRwLT5teW5vZGU7CisJCW1hc2sgPSByZHAtPmdycG1hc2s7CisJCXJhd19zcGluX2xvY2tfaXJxc2F2ZV9yY3Vfbm9kZShybnAsIGZsYWdzKTsKKwkJcm5wLT5xc21hc2tpbml0bmV4dCB8PSBtYXNrOworCQlybnAtPmV4cG1hc2tpbml0bmV4dCB8PSBtYXNrOworCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZV9yY3Vfbm9kZShybnAsIGZsYWdzKTsKKwl9Cit9CisKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIC8qCiAgKiBUaGUgQ1BVIGlzIGV4aXRpbmcgdGhlIGlkbGUgbG9vcCBpbnRvIHRoZSBhcmNoX2NwdV9pZGxlX2RlYWQoKQpAQCAtNDIwOSw4ICs0MjMzLDEwIEBACiAJICogb3IgdGhlIHNjaGVkdWxlciBhcmUgb3BlcmF0aW9uYWwuCiAJICovCiAJcG1fbm90aWZpZXIocmN1X3BtX25vdGlmeSwgMCk7Ci0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJcmN1dHJlZV9wcmVwYXJlX2NwdShjcHUpOworCQlyY3VfY3B1X3N0YXJ0aW5nKGNwdSk7CisJfQogfQogCiAjaW5jbHVkZSAidHJlZV9leHAuaCIKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdHJlZS5oIGIva2VybmVsL3JjdS90cmVlLmgKaW5kZXggZjcxNGY4Ny4uZTk5YTUyMyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlLmgKKysrIGIva2VybmVsL3JjdS90cmVlLmgKQEAgLTQwMCw2ICs0MDAsNyBAQAogI2lmZGVmIENPTkZJR19SQ1VfRkFTVF9OT19IWgogCXN0cnVjdCByY3VfaGVhZCBvb21faGVhZDsKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9GQVNUX05PX0haICovCisJYXRvbWljX2xvbmdfdCBleHBfd29ya2RvbmUwOwkvKiAjIGRvbmUgYnkgd29ya3F1ZXVlLiAqLwogCWF0b21pY19sb25nX3QgZXhwX3dvcmtkb25lMTsJLyogIyBkb25lIGJ5IG90aGVycyAjMS4gKi8KIAlhdG9taWNfbG9uZ190IGV4cF93b3JrZG9uZTI7CS8qICMgZG9uZSBieSBvdGhlcnMgIzIuICovCiAJYXRvbWljX2xvbmdfdCBleHBfd29ya2RvbmUzOwkvKiAjIGRvbmUgYnkgb3RoZXJzICMzLiAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90cmVlX2V4cC5oIGIva2VybmVsL3JjdS90cmVlX2V4cC5oCmluZGV4IDZkODZhYjYuLjI0MzQzZWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3UvdHJlZV9leHAuaAorKysgYi9rZXJuZWwvcmN1L3RyZWVfZXhwLmgKQEAgLTM1OSw3ICszNTksOCBAQAogCQkJc3RydWN0IHJjdV9keW50aWNrcyAqcmR0cCA9ICZwZXJfY3B1KHJjdV9keW50aWNrcywgY3B1KTsKIAogCQkJaWYgKHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgPT0gY3B1IHx8Ci0JCQkgICAgIShhdG9taWNfYWRkX3JldHVybigwLCAmcmR0cC0+ZHludGlja3MpICYgMHgxKSkKKwkJCSAgICAhKGF0b21pY19hZGRfcmV0dXJuKDAsICZyZHRwLT5keW50aWNrcykgJiAweDEpIHx8CisJCQkgICAgIShybnAtPnFzbWFza2luaXRuZXh0ICYgcmRwLT5ncnBtYXNrKSkKIAkJCQltYXNrX29mbF90ZXN0IHw9IHJkcC0+Z3JwbWFzazsKIAkJfQogCQltYXNrX29mbF9pcGkgPSBybnAtPmV4cG1hc2sgJiB+bWFza19vZmxfdGVzdDsKQEAgLTM4NCwxNyArMzg1LDE2IEBACiAJCQkJbWFza19vZmxfaXBpICY9IH5tYXNrOwogCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJLyogRmFpbGVkLCByYWNlZCB3aXRoIG9mZmxpbmUuICovCisJCQkvKiBGYWlsZWQsIHJhY2VkIHdpdGggQ1BVIGhvdHBsdWcgb3BlcmF0aW9uLiAqLwogCQkJcmF3X3NwaW5fbG9ja19pcnFzYXZlX3JjdV9ub2RlKHJucCwgZmxhZ3MpOwotCQkJaWYgKGNwdV9vbmxpbmUoY3B1KSAmJgorCQkJaWYgKChybnAtPnFzbWFza2luaXRuZXh0ICYgbWFzaykgJiYKIAkJCSAgICAocm5wLT5leHBtYXNrICYgbWFzaykpIHsKKwkJCQkvKiBPbmxpbmUsIHNvIGRlbGF5IGZvciBhIGJpdCBhbmQgdHJ5IGFnYWluLiAqLwogCQkJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlX3JjdV9ub2RlKHJucCwgZmxhZ3MpOwogCQkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDEpOwotCQkJCWlmIChjcHVfb25saW5lKGNwdSkgJiYKLQkJCQkgICAgKHJucC0+ZXhwbWFzayAmIG1hc2spKQotCQkJCQlnb3RvIHJldHJ5X2lwaTsKLQkJCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmVfcmN1X25vZGUocm5wLCBmbGFncyk7CisJCQkJZ290byByZXRyeV9pcGk7CiAJCQl9CisJCQkvKiBDUFUgcmVhbGx5IGlzIG9mZmxpbmUsIHNvIHdlIGNhbiBpZ25vcmUgaXQuICovCiAJCQlpZiAoIShybnAtPmV4cG1hc2sgJiBtYXNrKSkKIAkJCQltYXNrX29mbF9pcGkgJj0gfm1hc2s7CiAJCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZV9yY3Vfbm9kZShybnAsIGZsYWdzKTsKQEAgLTQyNywxMiArNDI3LDEwIEBACiAJCQkJamlmZmllc19zdGFsbCk7CiAJCWlmIChyZXQgPiAwIHx8IHN5bmNfcmN1X3ByZWVtcHRfZXhwX2RvbmUocm5wX3Jvb3QpKQogCQkJcmV0dXJuOwotCQlpZiAocmV0IDwgMCkgewotCQkJLyogSGl0IGEgc2lnbmFsLCBkaXNhYmxlIENQVSBzdGFsbCB3YXJuaW5ncy4gKi8KLQkJCXN3YWl0X2V2ZW50KHJzcC0+ZXhwZWRpdGVkX3dxLAotCQkJCSAgIHN5bmNfcmN1X3ByZWVtcHRfZXhwX2RvbmUocm5wX3Jvb3QpKTsKLQkJCXJldHVybjsKLQkJfQorCQlXQVJOX09OKHJldCA8IDApOyAgLyogd29ya3F1ZXVlcyBzaG91bGQgbm90IGJlIHNpZ25hbGVkLiAqLworCQlpZiAocmN1X2NwdV9zdGFsbF9zdXBwcmVzcykKKwkJCWNvbnRpbnVlOworCQlwYW5pY19vbl9yY3Vfc3RhbGwoKTsKIAkJcHJfZXJyKCJJTkZPOiAlcyBkZXRlY3RlZCBleHBlZGl0ZWQgc3RhbGxzIG9uIENQVXMvdGFza3M6IHsiLAogCQkgICAgICAgcnNwLT5uYW1lKTsKIAkJbmRldGVjdGVkID0gMDsKQEAgLTUwMCw3ICs0OTgsNiBAQAogCSAqIG5leHQgR1AsIHRvIHByb2NlZWQuCiAJICovCiAJbXV0ZXhfbG9jaygmcnNwLT5leHBfd2FrZV9tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZyc3AtPmV4cF9tdXRleCk7CiAKIAlyY3VfZm9yX2VhY2hfbm9kZV9icmVhZHRoX2ZpcnN0KHJzcCwgcm5wKSB7CiAJCWlmIChVTE9OR19DTVBfTFQoUkVBRF9PTkNFKHJucC0+ZXhwX3NlcV9ycSksIHMpKSB7CkBAIC01MTYsNiArNTEzLDcwIEBACiAJbXV0ZXhfdW5sb2NrKCZyc3AtPmV4cF93YWtlX211dGV4KTsKIH0KIAorLyogTGV0IHRoZSB3b3JrcXVldWUgaGFuZGxlciBrbm93IHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uICovCitzdHJ1Y3QgcmN1X2V4cF93b3JrIHsKKwlzbXBfY2FsbF9mdW5jX3QgcmV3X2Z1bmM7CisJc3RydWN0IHJjdV9zdGF0ZSAqcmV3X3JzcDsKKwl1bnNpZ25lZCBsb25nIHJld19zOworCXN0cnVjdCB3b3JrX3N0cnVjdCByZXdfd29yazsKK307CisKKy8qCisgKiBXb3JrLXF1ZXVlIGhhbmRsZXIgdG8gZHJpdmUgYW4gZXhwZWRpdGVkIGdyYWNlIHBlcmlvZCBmb3J3YXJkLgorICovCitzdGF0aWMgdm9pZCB3YWl0X3JjdV9leHBfZ3Aoc3RydWN0IHdvcmtfc3RydWN0ICp3cCkKK3sKKwlzdHJ1Y3QgcmN1X2V4cF93b3JrICpyZXdwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmN1X25vZGUgdHJlZSBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlIHdhaXQuICovCisJcmV3cCA9IGNvbnRhaW5lcl9vZih3cCwgc3RydWN0IHJjdV9leHBfd29yaywgcmV3X3dvcmspOworCXN5bmNfcmN1X2V4cF9zZWxlY3RfY3B1cyhyZXdwLT5yZXdfcnNwLCByZXdwLT5yZXdfZnVuYyk7CisKKwkvKiBXYWl0IGFuZCBjbGVhbiB1cCwgaW5jbHVkaW5nIHdha2luZyBldmVyeW9uZS4gKi8KKwlyY3VfZXhwX3dhaXRfd2FrZShyZXdwLT5yZXdfcnNwLCByZXdwLT5yZXdfcyk7Cit9CisKKy8qCisgKiBHaXZlbiBhbiByY3Vfc3RhdGUgcG9pbnRlciBhbmQgYSBzbXBfY2FsbF9mdW5jdGlvbigpIGhhbmRsZXIsIGtpY2sKKyAqIG9mZiB0aGUgc3BlY2lmaWVkIGZsYXZvciBvZiBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kLgorICovCitzdGF0aWMgdm9pZCBfc3luY2hyb25pemVfcmN1X2V4cGVkaXRlZChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCisJCQkJICAgICAgIHNtcF9jYWxsX2Z1bmNfdCBmdW5jKQoreworCXN0cnVjdCByY3VfZGF0YSAqcmRwOworCXN0cnVjdCByY3VfZXhwX3dvcmsgcmV3OworCXN0cnVjdCByY3Vfbm9kZSAqcm5wOworCXVuc2lnbmVkIGxvbmcgczsKKworCS8qIElmIGV4cGVkaXRlZCBncmFjZSBwZXJpb2RzIGFyZSBwcm9oaWJpdGVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsLiAqLworCWlmIChyY3VfZ3BfaXNfbm9ybWFsKCkpIHsKKwkJd2FpdF9yY3VfZ3AocnNwLT5jYWxsKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgc2VxdWVuY2UgbnVtYmVyLiAgKi8KKwlzID0gcmN1X2V4cF9ncF9zZXFfc25hcChyc3ApOworCWlmIChleHBfZnVubmVsX2xvY2socnNwLCBzKSkKKwkJcmV0dXJuOyAgLyogU29tZW9uZSBlbHNlIGRpZCBvdXIgd29yayBmb3IgdXMuICovCisKKwkvKiBNYXJzaGFsbCBhcmd1bWVudHMgYW5kIHNjaGVkdWxlIHRoZSBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kLiAqLworCXJldy5yZXdfZnVuYyA9IGZ1bmM7CisJcmV3LnJld19yc3AgPSByc3A7CisJcmV3LnJld19zID0gczsKKwlJTklUX1dPUktfT05TVEFDSygmcmV3LnJld193b3JrLCB3YWl0X3JjdV9leHBfZ3ApOworCXNjaGVkdWxlX3dvcmsoJnJldy5yZXdfd29yayk7CisKKwkvKiBXYWl0IGZvciBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kIHRvIGNvbXBsZXRlLiAqLworCXJkcCA9IHBlcl9jcHVfcHRyKHJzcC0+cmRhLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlybnAgPSByY3VfZ2V0X3Jvb3QocnNwKTsKKwl3YWl0X2V2ZW50KHJucC0+ZXhwX3dxWyhzID4+IDEpICYgMHgzXSwKKwkJICAgc3luY19leHBfd29ya19kb25lKHJzcCwKKwkJCQkgICAgICAmcmRwLT5leHBfd29ya2RvbmUwLCBzKSk7CisKKwkvKiBMZXQgdGhlIG5leHQgZXhwZWRpdGVkIGdyYWNlIHBlcmlvZCBzdGFydC4gKi8KKwltdXRleF91bmxvY2soJnJzcC0+ZXhwX211dGV4KTsKK30KKwogLyoqCiAgKiBzeW5jaHJvbml6ZV9zY2hlZF9leHBlZGl0ZWQgLSBCcnV0ZS1mb3JjZSBSQ1Utc2NoZWQgZ3JhY2UgcGVyaW9kCiAgKgpAQCAtNTM0LDI5ICs1OTUsMTMgQEAKICAqLwogdm9pZCBzeW5jaHJvbml6ZV9zY2hlZF9leHBlZGl0ZWQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHM7CiAJc3RydWN0IHJjdV9zdGF0ZSAqcnNwID0gJnJjdV9zY2hlZF9zdGF0ZTsKIAogCS8qIElmIG9ubHkgb25lIENQVSwgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IGEgZ3JhY2UgcGVyaW9kLiAqLwogCWlmIChyY3VfYmxvY2tpbmdfaXNfZ3AoKSkKIAkJcmV0dXJuOwogCi0JLyogSWYgZXhwZWRpdGVkIGdyYWNlIHBlcmlvZHMgYXJlIHByb2hpYml0ZWQsIGZhbGwgYmFjayB0byBub3JtYWwuICovCi0JaWYgKHJjdV9ncF9pc19ub3JtYWwoKSkgewotCQl3YWl0X3JjdV9ncChjYWxsX3JjdV9zY2hlZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIHNlcXVlbmNlIG51bWJlci4gICovCi0JcyA9IHJjdV9leHBfZ3Bfc2VxX3NuYXAocnNwKTsKLQlpZiAoZXhwX2Z1bm5lbF9sb2NrKHJzcCwgcykpCi0JCXJldHVybjsgIC8qIFNvbWVvbmUgZWxzZSBkaWQgb3VyIHdvcmsgZm9yIHVzLiAqLwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgcmN1X25vZGUgdHJlZSBpbiBwcmVwYXJhdGlvbiBmb3IgdGhlIHdhaXQuICovCi0Jc3luY19yY3VfZXhwX3NlbGVjdF9jcHVzKHJzcCwgc3luY19zY2hlZF9leHBfaGFuZGxlcik7Ci0KLQkvKiBXYWl0IGFuZCBjbGVhbiB1cCwgaW5jbHVkaW5nIHdha2luZyBldmVyeW9uZS4gKi8KLQlyY3VfZXhwX3dhaXRfd2FrZShyc3AsIHMpOworCV9zeW5jaHJvbml6ZV9yY3VfZXhwZWRpdGVkKHJzcCwgc3luY19zY2hlZF9leHBfaGFuZGxlcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzeW5jaHJvbml6ZV9zY2hlZF9leHBlZGl0ZWQpOwogCkBAIC02MjAsMjMgKzY2NSw4IEBACiB2b2lkIHN5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQodm9pZCkKIHsKIAlzdHJ1Y3QgcmN1X3N0YXRlICpyc3AgPSByY3Vfc3RhdGVfcDsKLQl1bnNpZ25lZCBsb25nIHM7CiAKLQkvKiBJZiBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kcyBhcmUgcHJvaGliaXRlZCwgZmFsbCBiYWNrIHRvIG5vcm1hbC4gKi8KLQlpZiAocmN1X2dwX2lzX25vcm1hbCgpKSB7Ci0JCXdhaXRfcmN1X2dwKGNhbGxfcmN1KTsKLQkJcmV0dXJuOwotCX0KLQotCXMgPSByY3VfZXhwX2dwX3NlcV9zbmFwKHJzcCk7Ci0JaWYgKGV4cF9mdW5uZWxfbG9jayhyc3AsIHMpKQotCQlyZXR1cm47ICAvKiBTb21lb25lIGVsc2UgZGlkIG91ciB3b3JrIGZvciB1cy4gKi8KLQotCS8qIEluaXRpYWxpemUgdGhlIHJjdV9ub2RlIHRyZWUgaW4gcHJlcGFyYXRpb24gZm9yIHRoZSB3YWl0LiAqLwotCXN5bmNfcmN1X2V4cF9zZWxlY3RfY3B1cyhyc3AsIHN5bmNfcmN1X2V4cF9oYW5kbGVyKTsKLQotCS8qIFdhaXQgZm9yIC0+YmxrZF90YXNrcyBsaXN0cyB0byBkcmFpbiwgdGhlbiB3YWtlIGV2ZXJ5b25lIHVwLiAqLwotCXJjdV9leHBfd2FpdF93YWtlKHJzcCwgcyk7CisJX3N5bmNocm9uaXplX3JjdV9leHBlZGl0ZWQocnNwLCBzeW5jX3JjdV9leHBfaGFuZGxlcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzeW5jaHJvbml6ZV9yY3VfZXhwZWRpdGVkKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS90cmVlX3BsdWdpbi5oIGIva2VybmVsL3JjdS90cmVlX3BsdWdpbi5oCmluZGV4IDAwODJmY2UuLjg1YzVhODggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3UvdHJlZV9wbHVnaW4uaAorKysgYi9rZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmgKQEAgLTIxNzMsNiArMjE3Myw3IEBACiAJCQkJY2wrKzsKIAkJCWMrKzsKIAkJCWxvY2FsX2JoX2VuYWJsZSgpOworCQkJY29uZF9yZXNjaGVkX3JjdV9xcygpOwogCQkJbGlzdCA9IG5leHQ7CiAJCX0KIAkJdHJhY2VfcmN1X2JhdGNoX2VuZChyZHAtPnJzcC0+bmFtZSwgYywgISFsaXN0LCAwLCAwLCAxKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdHJlZV90cmFjZS5jIGIva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKaW5kZXggODY3ODJmOWEuLmIxZjI4OTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3UvdHJlZV90cmFjZS5jCisrKyBiL2tlcm5lbC9yY3UvdHJlZV90cmFjZS5jCkBAIC0xODUsMTYgKzE4NSwxNyBAQAogCWludCBjcHU7CiAJc3RydWN0IHJjdV9zdGF0ZSAqcnNwID0gKHN0cnVjdCByY3Vfc3RhdGUgKiltLT5wcml2YXRlOwogCXN0cnVjdCByY3VfZGF0YSAqcmRwOwotCXVuc2lnbmVkIGxvbmcgczEgPSAwLCBzMiA9IDAsIHMzID0gMDsKKwl1bnNpZ25lZCBsb25nIHMwID0gMCwgczEgPSAwLCBzMiA9IDAsIHMzID0gMDsKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJcmRwID0gcGVyX2NwdV9wdHIocnNwLT5yZGEsIGNwdSk7CisJCXMwICs9IGF0b21pY19sb25nX3JlYWQoJnJkcC0+ZXhwX3dvcmtkb25lMCk7CiAJCXMxICs9IGF0b21pY19sb25nX3JlYWQoJnJkcC0+ZXhwX3dvcmtkb25lMSk7CiAJCXMyICs9IGF0b21pY19sb25nX3JlYWQoJnJkcC0+ZXhwX3dvcmtkb25lMik7CiAJCXMzICs9IGF0b21pY19sb25nX3JlYWQoJnJkcC0+ZXhwX3dvcmtkb25lMyk7CiAJfQotCXNlcV9wcmludGYobSwgInM9JWx1IHdkMT0lbHUgd2QyPSVsdSB3ZDM9JWx1IG49JWx1IGVucT0lZCBzYz0lbHVcbiIsCi0JCSAgIHJzcC0+ZXhwZWRpdGVkX3NlcXVlbmNlLCBzMSwgczIsIHMzLAorCXNlcV9wcmludGYobSwgInM9JWx1IHdkMD0lbHUgd2QxPSVsdSB3ZDI9JWx1IHdkMz0lbHUgbj0lbHUgZW5xPSVkIHNjPSVsdVxuIiwKKwkJICAgcnNwLT5leHBlZGl0ZWRfc2VxdWVuY2UsIHMwLCBzMSwgczIsIHMzLAogCQkgICBhdG9taWNfbG9uZ19yZWFkKCZyc3AtPmV4cGVkaXRlZF9ub3JtYWwpLAogCQkgICBhdG9taWNfcmVhZCgmcnNwLT5leHBlZGl0ZWRfbmVlZF9xcyksCiAJCSAgIHJzcC0+ZXhwZWRpdGVkX3NlcXVlbmNlIC8gMik7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3VwZGF0ZS5jIGIva2VybmVsL3JjdS91cGRhdGUuYwppbmRleCBmMGQ4MzIyLi5mMTkyNzFkYyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS91cGRhdGUuYworKysgYi9rZXJuZWwvcmN1L3VwZGF0ZS5jCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgogCkBAIC01NCw3ICs1NCw2IEBACiAKICNpbmNsdWRlICJyY3UuaCIKIAotTU9EVUxFX0FMSUFTKCJyY3VwZGF0ZSIpOwogI2lmZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKICN1bmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9yZWxheS5jIGIva2VybmVsL3JlbGF5LmMKaW5kZXggZDc5NzUwMi4uOTk4OGY1YyAxMDA2NDQKLS0tIGEva2VybmVsL3JlbGF5LmMKKysrIGIva2VybmVsL3JlbGF5LmMKQEAgLTIxNCw3ICsyMTQsNyBAQAogCQkJX19mcmVlX3BhZ2UoYnVmLT5wYWdlX2FycmF5W2ldKTsKIAkJcmVsYXlfZnJlZV9wYWdlX2FycmF5KGJ1Zi0+cGFnZV9hcnJheSk7CiAJfQotCWNoYW4tPmJ1ZltidWYtPmNwdV0gPSBOVUxMOworCSpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGJ1Zi0+Y3B1KSA9IE5VTEw7CiAJa2ZyZWUoYnVmLT5wYWRkaW5nKTsKIAlrZnJlZShidWYpOwogCWtyZWZfcHV0KCZjaGFuLT5rcmVmLCByZWxheV9kZXN0cm95X2NoYW5uZWwpOwpAQCAtMzgyLDIwICszODIsMjEgQEAKICAqLwogdm9pZCByZWxheV9yZXNldChzdHJ1Y3QgcmNoYW4gKmNoYW4pCiB7CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwogCXVuc2lnbmVkIGludCBpOwogCiAJaWYgKCFjaGFuKQogCQlyZXR1cm47CiAKLQlpZiAoY2hhbi0+aXNfZ2xvYmFsICYmIGNoYW4tPmJ1ZlswXSkgewotCQlfX3JlbGF5X3Jlc2V0KGNoYW4tPmJ1ZlswXSwgMCk7CisJaWYgKGNoYW4tPmlzX2dsb2JhbCAmJiAoYnVmID0gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgMCkpKSB7CisJCV9fcmVsYXlfcmVzZXQoYnVmLCAwKTsKIAkJcmV0dXJuOwogCX0KIAogCW11dGV4X2xvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKLQkJaWYgKGNoYW4tPmJ1ZltpXSkKLQkJCV9fcmVsYXlfcmVzZXQoY2hhbi0+YnVmW2ldLCAwKTsKKwkJaWYgKChidWYgPSAqcGVyX2NwdV9wdHIoY2hhbi0+YnVmLCBpKSkpCisJCQlfX3JlbGF5X3Jlc2V0KGJ1ZiwgMCk7CiAJbXV0ZXhfdW5sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9yZXNldCk7CkBAIC00NDAsNyArNDQxLDcgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CiAKICAJaWYgKGNoYW4tPmlzX2dsb2JhbCkKLQkJcmV0dXJuIGNoYW4tPmJ1ZlswXTsKKwkJcmV0dXJuICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIDApOwogCiAJYnVmID0gcmVsYXlfY3JlYXRlX2J1ZihjaGFuKTsKIAlpZiAoIWJ1ZikKQEAgLTQ2NCw3ICs0NjUsNyBAQAogIAlfX3JlbGF5X3Jlc2V0KGJ1ZiwgMSk7CiAKICAJaWYoY2hhbi0+aXNfZ2xvYmFsKSB7Ci0gCQljaGFuLT5idWZbMF0gPSBidWY7CisJCSpwZXJfY3B1X3B0cihjaGFuLT5idWYsIDApID0gYnVmOwogIAkJYnVmLT5jcHUgPSAwOwogICAJfQogCkBAIC01MTIsNDYgKzUxMywyNSBAQAogCWNoYW4tPmNiID0gY2I7CiB9CiAKLS8qKgotICogCXJlbGF5X2hvdGNwdV9jYWxsYmFjayAtIENQVSBob3RwbHVnIGNhbGxiYWNrCi0gKiAJQG5iOiBub3RpZmllciBibG9jawotICogCUBhY3Rpb246IGhvdHBsdWcgYWN0aW9uIHRvIHRha2UKLSAqIAlAaGNwdTogQ1BVIG51bWJlcgotICoKLSAqIAlSZXR1cm5zIHRoZSBzdWNjZXNzL2ZhaWx1cmUgb2YgdGhlIG9wZXJhdGlvbi4gKCVOT1RJRllfT0ssICVOT1RJRllfQkFEKQotICovCi1zdGF0aWMgaW50IHJlbGF5X2hvdGNwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAotCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJCXZvaWQgKmhjcHUpCitpbnQgcmVsYXlfcHJlcGFyZV9jcHUodW5zaWduZWQgaW50IGNwdSkKIHsKLQl1bnNpZ25lZCBpbnQgaG90Y3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKIAlzdHJ1Y3QgcmNoYW4gKmNoYW47CisJc3RydWN0IHJjaGFuX2J1ZiAqYnVmOwogCi0Jc3dpdGNoKGFjdGlvbikgewotCWNhc2UgQ1BVX1VQX1BSRVBBUkU6Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRV9GUk9aRU46Ci0JCW11dGV4X2xvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmcmVsYXlfY2hhbm5lbHMsIGxpc3QpIHsKLQkJCWlmIChjaGFuLT5idWZbaG90Y3B1XSkKLQkJCQljb250aW51ZTsKLQkJCWNoYW4tPmJ1Zltob3RjcHVdID0gcmVsYXlfb3Blbl9idWYoY2hhbiwgaG90Y3B1KTsKLQkJCWlmKCFjaGFuLT5idWZbaG90Y3B1XSkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkicmVsYXlfaG90Y3B1X2NhbGxiYWNrOiBjcHUgJWQgYnVmZmVyICIKLQkJCQkJImNyZWF0aW9uIGZhaWxlZFxuIiwgaG90Y3B1KTsKLQkJCQltdXRleF91bmxvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKLQkJCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubygtRU5PTUVNKTsKLQkJCX0KKwltdXRleF9sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmcmVsYXlfY2hhbm5lbHMsIGxpc3QpIHsKKwkJaWYgKChidWYgPSAqcGVyX2NwdV9wdHIoY2hhbi0+YnVmLCBjcHUpKSkKKwkJCWNvbnRpbnVlOworCQlidWYgPSByZWxheV9vcGVuX2J1ZihjaGFuLCBjcHUpOworCQlpZiAoIWJ1ZikgeworCQkJcHJfZXJyKCJyZWxheTogY3B1ICVkIGJ1ZmZlciBjcmVhdGlvbiBmYWlsZWRcbiIsIGNwdSk7CisJCQltdXRleF91bmxvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKKwkJCXJldHVybiAtRU5PTUVNOwogCQl9Ci0JCW11dGV4X3VubG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOwotCQlicmVhazsKLQljYXNlIENQVV9ERUFEOgotCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQkvKiBObyBuZWVkIHRvIGZsdXNoIHRoZSBjcHUgOiB3aWxsIGJlIGZsdXNoZWQgdXBvbgotCQkgKiBmaW5hbCByZWxheV9mbHVzaCgpIGNhbGwuICovCi0JCWJyZWFrOworCQkqcGVyX2NwdV9wdHIoY2hhbi0+YnVmLCBjcHUpID0gYnVmOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCW11dGV4X3VubG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTU4Myw2ICs1NjMsNyBAQAogewogCXVuc2lnbmVkIGludCBpOwogCXN0cnVjdCByY2hhbiAqY2hhbjsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWY7CiAKIAlpZiAoIShzdWJidWZfc2l6ZSAmJiBuX3N1YmJ1ZnMpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTU5Myw2ICs1NzQsNyBAQAogCWlmICghY2hhbikKIAkJcmV0dXJuIE5VTEw7CiAKKwljaGFuLT5idWYgPSBhbGxvY19wZXJjcHUoc3RydWN0IHJjaGFuX2J1ZiAqKTsKIAljaGFuLT52ZXJzaW9uID0gUkVMQVlGU19DSEFOTkVMX1ZFUlNJT047CiAJY2hhbi0+bl9zdWJidWZzID0gbl9zdWJidWZzOwogCWNoYW4tPnN1YmJ1Zl9zaXplID0gc3ViYnVmX3NpemU7CkBAIC02MDgsOSArNTkwLDEwIEBACiAKIAltdXRleF9sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7CiAJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7Ci0JCWNoYW4tPmJ1ZltpXSA9IHJlbGF5X29wZW5fYnVmKGNoYW4sIGkpOwotCQlpZiAoIWNoYW4tPmJ1ZltpXSkKKwkJYnVmID0gcmVsYXlfb3Blbl9idWYoY2hhbiwgaSk7CisJCWlmICghYnVmKQogCQkJZ290byBmcmVlX2J1ZnM7CisJCSpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGkpID0gYnVmOwogCX0KIAlsaXN0X2FkZCgmY2hhbi0+bGlzdCwgJnJlbGF5X2NoYW5uZWxzKTsKIAltdXRleF91bmxvY2soJnJlbGF5X2NoYW5uZWxzX211dGV4KTsKQEAgLTYxOSw4ICs2MDIsOCBAQAogCiBmcmVlX2J1ZnM6CiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJaWYgKGNoYW4tPmJ1ZltpXSkKLQkJCXJlbGF5X2Nsb3NlX2J1ZihjaGFuLT5idWZbaV0pOworCQlpZiAoKGJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGkpKSkKKwkJCXJlbGF5X2Nsb3NlX2J1ZihidWYpOwogCX0KIAogCWtyZWZfcHV0KCZjaGFuLT5rcmVmLCByZWxheV9kZXN0cm95X2NoYW5uZWwpOwpAQCAtNjY2LDYgKzY0OSw3IEBACiAJdW5zaWduZWQgaW50IGksIGN1cnJfY3B1OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKIAlzdHJ1Y3QgcmNoYW5fcGVyY3B1X2J1Zl9kaXNwYXRjaGVyIGRpc3A7CiAKIAlpZiAoIWNoYW4gfHwgIWJhc2VfZmlsZW5hbWUpCkBAIC02ODQsMTAgKzY2OCwxMSBAQAogCiAJaWYgKGNoYW4tPmlzX2dsb2JhbCkgewogCQllcnIgPSAtRUlOVkFMOwotCQlpZiAoIVdBUk5fT05fT05DRSghY2hhbi0+YnVmWzBdKSkgewotCQkJZGVudHJ5ID0gcmVsYXlfY3JlYXRlX2J1Zl9maWxlKGNoYW4sIGNoYW4tPmJ1ZlswXSwgMCk7CisJCWJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIDApOworCQlpZiAoIVdBUk5fT05fT05DRSghYnVmKSkgeworCQkJZGVudHJ5ID0gcmVsYXlfY3JlYXRlX2J1Zl9maWxlKGNoYW4sIGJ1ZiwgMCk7CiAJCQlpZiAoZGVudHJ5ICYmICFXQVJOX09OX09OQ0UoIWNoYW4tPmlzX2dsb2JhbCkpIHsKLQkJCQlyZWxheV9zZXRfYnVmX2RlbnRyeShjaGFuLT5idWZbMF0sIGRlbnRyeSk7CisJCQkJcmVsYXlfc2V0X2J1Zl9kZW50cnkoYnVmLCBkZW50cnkpOwogCQkJCWVyciA9IDA7CiAJCQl9CiAJCX0KQEAgLTcwMiwxMyArNjg3LDE0IEBACiAJICogb24gYWxsIGN1cnJlbnRseSBvbmxpbmUgQ1BVcy4KIAkgKi8KIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJaWYgKHVubGlrZWx5KCFjaGFuLT5idWZbaV0pKSB7CisJCWJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIGkpOworCQlpZiAodW5saWtlbHkoIWJ1ZikpIHsKIAkJCVdBUk5fT05DRSgxLCBLRVJOX0VSUiAiQ1BVIGhhcyBubyBidWZmZXIhXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlicmVhazsKIAkJfQogCi0JCWRlbnRyeSA9IHJlbGF5X2NyZWF0ZV9idWZfZmlsZShjaGFuLCBjaGFuLT5idWZbaV0sIGkpOworCQlkZW50cnkgPSByZWxheV9jcmVhdGVfYnVmX2ZpbGUoY2hhbiwgYnVmLCBpKTsKIAkJaWYgKHVubGlrZWx5KCFkZW50cnkpKSB7CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJYnJlYWs7CkBAIC03MTYsMTAgKzcwMiwxMCBAQAogCiAJCWlmIChjdXJyX2NwdSA9PSBpKSB7CiAJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCQlyZWxheV9zZXRfYnVmX2RlbnRyeShjaGFuLT5idWZbaV0sIGRlbnRyeSk7CisJCQlyZWxheV9zZXRfYnVmX2RlbnRyeShidWYsIGRlbnRyeSk7CiAJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCX0gZWxzZSB7Ci0JCQlkaXNwLmJ1ZiA9IGNoYW4tPmJ1ZltpXTsKKwkJCWRpc3AuYnVmID0gYnVmOwogCQkJZGlzcC5kZW50cnkgPSBkZW50cnk7CiAJCQlzbXBfbWIoKTsKIAkJCS8qIHJlbGF5X2NoYW5uZWxzX211dGV4IG11c3QgYmUgaGVsZCwgc28gd2FpdC4gKi8KQEAgLTgyMiwxMSArODA4LDEwIEBACiAJaWYgKCFjaGFuKQogCQlyZXR1cm47CiAKLQlpZiAoY3B1ID49IE5SX0NQVVMgfHwgIWNoYW4tPmJ1ZltjcHVdIHx8Ci0JCQkJCXN1YmJ1ZnNfY29uc3VtZWQgPiBjaGFuLT5uX3N1YmJ1ZnMpCisJYnVmID0gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgY3B1KTsKKwlpZiAoY3B1ID49IE5SX0NQVVMgfHwgIWJ1ZiB8fCBzdWJidWZzX2NvbnN1bWVkID4gY2hhbi0+bl9zdWJidWZzKQogCQlyZXR1cm47CiAKLQlidWYgPSBjaGFuLT5idWZbY3B1XTsKIAlpZiAoc3ViYnVmc19jb25zdW1lZCA+IGJ1Zi0+c3ViYnVmc19wcm9kdWNlZCAtIGJ1Zi0+c3ViYnVmc19jb25zdW1lZCkKIAkJYnVmLT5zdWJidWZzX2NvbnN1bWVkID0gYnVmLT5zdWJidWZzX3Byb2R1Y2VkOwogCWVsc2UKQEAgLTg0MiwxOCArODI3LDE5IEBACiAgKi8KIHZvaWQgcmVsYXlfY2xvc2Uoc3RydWN0IHJjaGFuICpjaGFuKQogeworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKIAl1bnNpZ25lZCBpbnQgaTsKIAogCWlmICghY2hhbikKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOwotCWlmIChjaGFuLT5pc19nbG9iYWwgJiYgY2hhbi0+YnVmWzBdKQotCQlyZWxheV9jbG9zZV9idWYoY2hhbi0+YnVmWzBdKTsKKwlpZiAoY2hhbi0+aXNfZ2xvYmFsICYmIChidWYgPSAqcGVyX2NwdV9wdHIoY2hhbi0+YnVmLCAwKSkpCisJCXJlbGF5X2Nsb3NlX2J1ZihidWYpOwogCWVsc2UKIAkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCi0JCQlpZiAoY2hhbi0+YnVmW2ldKQotCQkJCXJlbGF5X2Nsb3NlX2J1ZihjaGFuLT5idWZbaV0pOworCQkJaWYgKChidWYgPSAqcGVyX2NwdV9wdHIoY2hhbi0+YnVmLCBpKSkpCisJCQkJcmVsYXlfY2xvc2VfYnVmKGJ1Zik7CiAKIAlpZiAoY2hhbi0+bGFzdF90b29iaWcpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInJlbGF5OiBvbmUgb3IgbW9yZSBpdGVtcyBub3QgbG9nZ2VkICIKQEAgLTg3NCwyMCArODYwLDIxIEBACiAgKi8KIHZvaWQgcmVsYXlfZmx1c2goc3RydWN0IHJjaGFuICpjaGFuKQogeworCXN0cnVjdCByY2hhbl9idWYgKmJ1ZjsKIAl1bnNpZ25lZCBpbnQgaTsKIAogCWlmICghY2hhbikKIAkJcmV0dXJuOwogCi0JaWYgKGNoYW4tPmlzX2dsb2JhbCAmJiBjaGFuLT5idWZbMF0pIHsKLQkJcmVsYXlfc3dpdGNoX3N1YmJ1ZihjaGFuLT5idWZbMF0sIDApOworCWlmIChjaGFuLT5pc19nbG9iYWwgJiYgKGJ1ZiA9ICpwZXJfY3B1X3B0cihjaGFuLT5idWYsIDApKSkgeworCQlyZWxheV9zd2l0Y2hfc3ViYnVmKGJ1ZiwgMCk7CiAJCXJldHVybjsKIAl9CiAKIAltdXRleF9sb2NrKCZyZWxheV9jaGFubmVsc19tdXRleCk7CiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCi0JCWlmIChjaGFuLT5idWZbaV0pCi0JCQlyZWxheV9zd2l0Y2hfc3ViYnVmKGNoYW4tPmJ1ZltpXSwgMCk7CisJCWlmICgoYnVmID0gKnBlcl9jcHVfcHRyKGNoYW4tPmJ1ZiwgaSkpKQorCQkJcmVsYXlfc3dpdGNoX3N1YmJ1ZihidWYsIDApOwogCW11dGV4X3VubG9jaygmcmVsYXlfY2hhbm5lbHNfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmVsYXlfZmx1c2gpOwpAQCAtMTEyMSw1MSArMTEwOCwyMyBAQAogCXJldHVybiBlbmRfcG9zOwogfQogCi0vKgotICoJc3ViYnVmX3JlYWRfYWN0b3IgLSByZWFkIHVwIHRvIG9uZSBzdWJidWYncyB3b3J0aCBvZiBkYXRhCi0gKi8KLXN0YXRpYyBpbnQgc3ViYnVmX3JlYWRfYWN0b3Ioc2l6ZV90IHJlYWRfc3RhcnQsCi0JCQkgICAgIHN0cnVjdCByY2hhbl9idWYgKmJ1ZiwKLQkJCSAgICAgc2l6ZV90IGF2YWlsLAotCQkJICAgICByZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYykKLXsKLQl2b2lkICpmcm9tOwotCWludCByZXQgPSAwOwotCi0JZnJvbSA9IGJ1Zi0+c3RhcnQgKyByZWFkX3N0YXJ0OwotCXJldCA9IGF2YWlsOwotCWlmIChjb3B5X3RvX3VzZXIoZGVzYy0+YXJnLmJ1ZiwgZnJvbSwgYXZhaWwpKSB7Ci0JCWRlc2MtPmVycm9yID0gLUVGQVVMVDsKLQkJcmV0ID0gMDsKLQl9Ci0JZGVzYy0+YXJnLmRhdGEgKz0gcmV0OwotCWRlc2MtPndyaXR0ZW4gKz0gcmV0OwotCWRlc2MtPmNvdW50IC09IHJldDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXR5cGVkZWYgaW50ICgqc3ViYnVmX2FjdG9yX3QpIChzaXplX3QgcmVhZF9zdGFydCwKLQkJCSAgICAgICBzdHJ1Y3QgcmNoYW5fYnVmICpidWYsCi0JCQkgICAgICAgc2l6ZV90IGF2YWlsLAotCQkJICAgICAgIHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjKTsKLQotLyoKLSAqCXJlbGF5X2ZpbGVfcmVhZF9zdWJidWZzIC0gcmVhZCBjb3VudCBieXRlcywgYnJpZGdpbmcgc3ViYnVmIGJvdW5kYXJpZXMKLSAqLwotc3RhdGljIHNzaXplX3QgcmVsYXlfZmlsZV9yZWFkX3N1YmJ1ZnMoc3RydWN0IGZpbGUgKmZpbHAsIGxvZmZfdCAqcHBvcywKLQkJCQkJc3ViYnVmX2FjdG9yX3Qgc3ViYnVmX2FjdG9yLAotCQkJCQlyZWFkX2Rlc2NyaXB0b3JfdCAqZGVzYykKK3N0YXRpYyBzc2l6ZV90IHJlbGF5X2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICAgICBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwKKwkJCSAgICAgICBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXNpemVfdCByZWFkX3N0YXJ0LCBhdmFpbDsKKwlzaXplX3Qgd3JpdHRlbiA9IDA7CiAJaW50IHJldDsKIAotCWlmICghZGVzYy0+Y291bnQpCisJaWYgKCFjb3VudCkKIAkJcmV0dXJuIDA7CiAKIAlpbm9kZV9sb2NrKGZpbGVfaW5vZGUoZmlscCkpOwogCWRvIHsKKwkJdm9pZCAqZnJvbTsKKwogCQlpZiAoIXJlbGF5X2ZpbGVfcmVhZF9hdmFpbChidWYsICpwcG9zKSkKIAkJCWJyZWFrOwogCkBAIC0xMTc0LDMyICsxMTMzLDIyIEBACiAJCWlmICghYXZhaWwpCiAJCQlicmVhazsKIAotCQlhdmFpbCA9IG1pbihkZXNjLT5jb3VudCwgYXZhaWwpOwotCQlyZXQgPSBzdWJidWZfYWN0b3IocmVhZF9zdGFydCwgYnVmLCBhdmFpbCwgZGVzYyk7Ci0JCWlmIChkZXNjLT5lcnJvciA8IDApCisJCWF2YWlsID0gbWluKGNvdW50LCBhdmFpbCk7CisJCWZyb20gPSBidWYtPnN0YXJ0ICsgcmVhZF9zdGFydDsKKwkJcmV0ID0gYXZhaWw7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBmcm9tLCBhdmFpbCkpCiAJCQlicmVhazsKIAotCQlpZiAocmV0KSB7Ci0JCQlyZWxheV9maWxlX3JlYWRfY29uc3VtZShidWYsIHJlYWRfc3RhcnQsIHJldCk7Ci0JCQkqcHBvcyA9IHJlbGF5X2ZpbGVfcmVhZF9lbmRfcG9zKGJ1ZiwgcmVhZF9zdGFydCwgcmV0KTsKLQkJfQotCX0gd2hpbGUgKGRlc2MtPmNvdW50ICYmIHJldCk7CisJCWJ1ZmZlciArPSByZXQ7CisJCXdyaXR0ZW4gKz0gcmV0OworCQljb3VudCAtPSByZXQ7CisKKwkJcmVsYXlfZmlsZV9yZWFkX2NvbnN1bWUoYnVmLCByZWFkX3N0YXJ0LCByZXQpOworCQkqcHBvcyA9IHJlbGF5X2ZpbGVfcmVhZF9lbmRfcG9zKGJ1ZiwgcmVhZF9zdGFydCwgcmV0KTsKKwl9IHdoaWxlIChjb3VudCk7CiAJaW5vZGVfdW5sb2NrKGZpbGVfaW5vZGUoZmlscCkpOwogCi0JcmV0dXJuIGRlc2MtPndyaXR0ZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHJlbGF5X2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgICAgICBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJICAgICAgIHNpemVfdCBjb3VudCwKLQkJCSAgICAgICBsb2ZmX3QgKnBwb3MpCi17Ci0JcmVhZF9kZXNjcmlwdG9yX3QgZGVzYzsKLQlkZXNjLndyaXR0ZW4gPSAwOwotCWRlc2MuY291bnQgPSBjb3VudDsKLQlkZXNjLmFyZy5idWYgPSBidWZmZXI7Ci0JZGVzYy5lcnJvciA9IDA7Ci0JcmV0dXJuIHJlbGF5X2ZpbGVfcmVhZF9zdWJidWZzKGZpbHAsIHBwb3MsIHN1YmJ1Zl9yZWFkX2FjdG9yLCAmZGVzYyk7CisJcmV0dXJuIHdyaXR0ZW47CiB9CiAKIHN0YXRpYyB2b2lkIHJlbGF5X2NvbnN1bWVfYnl0ZXMoc3RydWN0IHJjaGFuX2J1ZiAqcmJ1ZiwgaW50IGJ5dGVzX2NvbnN1bWVkKQpAQCAtMTM3NywxMiArMTMyNiwzIEBACiAJLnNwbGljZV9yZWFkCT0gcmVsYXlfZmlsZV9zcGxpY2VfcmVhZCwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChyZWxheV9maWxlX29wZXJhdGlvbnMpOwotCi1zdGF0aWMgX19pbml0IGludCByZWxheV9pbml0KHZvaWQpCi17Ci0KLQlob3RjcHVfbm90aWZpZXIocmVsYXlfaG90Y3B1X2NhbGxiYWNrLCAwKTsKLQlyZXR1cm4gMDsKLX0KLQotZWFybHlfaW5pdGNhbGwocmVsYXlfaW5pdCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvY29yZS5jIGIva2VybmVsL3NjaGVkL2NvcmUuYwppbmRleCAyYTkwNmYyLi45NDczMmQxIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvY29yZS5jCisrKyBiL2tlcm5lbC9zY2hlZC9jb3JlLmMKQEAgLTU4MSw2ICs1ODEsOCBAQAogCSAqIElmIG5lZWRlZCB3ZSBjYW4gc3RpbGwgb3B0aW1pemUgdGhhdCBsYXRlciB3aXRoIGFuCiAJICogZW1wdHkgSVJRLgogCSAqLworCWlmIChjcHVfaXNfb2ZmbGluZShjcHUpKQorCQlyZXR1cm4gdHJ1ZTsgIC8qIERvbid0IHRyeSB0byB3YWtlIG9mZmxpbmUgQ1BVcy4gKi8KIAlpZiAodGlja19ub2h6X2Z1bGxfY3B1KGNwdSkpIHsKIAkJaWYgKGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkgfHwKIAkJICAgIHRpY2tfbm9oel90aWNrX3N0b3BwZWQoKSkKQEAgLTU5MSw2ICs1OTMsMTEgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKKy8qCisgKiBXYWtlIHVwIHRoZSBzcGVjaWZpZWQgQ1BVLiAgSWYgdGhlIENQVSBpcyBnb2luZyBvZmZsaW5lLCBpdCBpcyB0aGUKKyAqIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlYWwgd2l0aCB0aGUgbG9zdCB3YWtldXAsIGZvciBleGFtcGxlLAorICogYnkgaG9va2luZyBpbnRvIHRoZSBDUFVfREVBRCBub3RpZmllciBsaWtlIHRpbWVycyBhbmQgaHJ0aW1lcnMgZG8uCisgKi8KIHZvaWQgd2FrZV91cF9ub2h6X2NwdShpbnQgY3B1KQogewogCWlmICghd2FrZV91cF9mdWxsX25vaHpfY3B1KGNwdSkpCkBAIC0xMDYzLDggKzEwNzAsMTIgQEAKIAkgKiBob2xkaW5nIHJxLT5sb2NrLCBpZiBwLT5vbl9ycSA9PSAwIGl0IGNhbm5vdCBnZXQgZW5xdWV1ZWQgYmVjYXVzZQogCSAqIHdlJ3JlIGhvbGRpbmcgcC0+cGlfbG9jay4KIAkgKi8KLQlpZiAodGFza19ycShwKSA9PSBycSAmJiB0YXNrX29uX3JxX3F1ZXVlZChwKSkKLQkJcnEgPSBfX21pZ3JhdGVfdGFzayhycSwgcCwgYXJnLT5kZXN0X2NwdSk7CisJaWYgKHRhc2tfcnEocCkgPT0gcnEpIHsKKwkJaWYgKHRhc2tfb25fcnFfcXVldWVkKHApKQorCQkJcnEgPSBfX21pZ3JhdGVfdGFzayhycSwgcCwgYXJnLT5kZXN0X2NwdSk7CisJCWVsc2UKKwkJCXAtPndha2VfY3B1ID0gYXJnLT5kZXN0X2NwdTsKKwl9CiAJcmF3X3NwaW5fdW5sb2NrKCZycS0+bG9jayk7CiAJcmF3X3NwaW5fdW5sb2NrKCZwLT5waV9sb2NrKTsKIApAQCAtMTEwNSwxMCArMTExNiwxMCBAQAogCiAJcC0+c2NoZWRfY2xhc3MtPnNldF9jcHVzX2FsbG93ZWQocCwgbmV3X21hc2spOwogCi0JaWYgKHJ1bm5pbmcpCi0JCXAtPnNjaGVkX2NsYXNzLT5zZXRfY3Vycl90YXNrKHJxKTsKIAlpZiAocXVldWVkKQogCQllbnF1ZXVlX3Rhc2socnEsIHAsIEVOUVVFVUVfUkVTVE9SRSk7CisJaWYgKHJ1bm5pbmcpCisJCXNldF9jdXJyX3Rhc2socnEsIHApOwogfQogCiAvKgpAQCAtMTI2NSw3ICsxMjc2LDcgQEAKIAkJLyoKIAkJICogVGFzayBpc24ndCBydW5uaW5nIGFueW1vcmU7IG1ha2UgaXQgYXBwZWFyIGxpa2Ugd2UgbWlncmF0ZWQKIAkJICogaXQgYmVmb3JlIGl0IHdlbnQgdG8gc2xlZXAuIFRoaXMgbWVhbnMgb24gd2FrZXVwIHdlIG1ha2UgdGhlCi0JCSAqIHByZXZpb3VzIGNwdSBvdXIgdGFyZ2VyIGluc3RlYWQgb2Ygd2hlcmUgaXQgcmVhbGx5IGlzLgorCQkgKiBwcmV2aW91cyBjcHUgb3VyIHRhcmdldCBpbnN0ZWFkIG9mIHdoZXJlIGl0IHJlYWxseSBpcy4KIAkJICovCiAJCXAtPndha2VfY3B1ID0gY3B1OwogCX0KQEAgLTE2MjksMjMgKzE2NDAsMjUgQEAKIHN0YXRpYyB2b2lkCiB0dHd1X3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgY3B1LCBpbnQgd2FrZV9mbGFncykKIHsKLSNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwotCXN0cnVjdCBycSAqcnEgPSB0aGlzX3JxKCk7CisJc3RydWN0IHJxICpycTsKKworCWlmICghc2NoZWRzdGF0X2VuYWJsZWQoKSkKKwkJcmV0dXJuOworCisJcnEgPSB0aGlzX3JxKCk7CiAKICNpZmRlZiBDT05GSUdfU01QCi0JaW50IHRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JaWYgKGNwdSA9PSB0aGlzX2NwdSkgewotCQlzY2hlZHN0YXRfaW5jKHJxLCB0dHd1X2xvY2FsKTsKLQkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbG9jYWwpOworCWlmIChjcHUgPT0gcnEtPmNwdSkgeworCQlzY2hlZHN0YXRfaW5jKHJxLT50dHd1X2xvY2FsKTsKKwkJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbG9jYWwpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwogCi0JCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3JlbW90ZSk7CisJCXNjaGVkc3RhdF9pbmMocC0+c2Uuc3RhdGlzdGljcy5ucl93YWtldXBzX3JlbW90ZSk7CiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJZm9yX2VhY2hfZG9tYWluKHRoaXNfY3B1LCBzZCkgeworCQlmb3JfZWFjaF9kb21haW4ocnEtPmNwdSwgc2QpIHsKIAkJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgc2NoZWRfZG9tYWluX3NwYW4oc2QpKSkgewotCQkJCXNjaGVkc3RhdF9pbmMoc2QsIHR0d3Vfd2FrZV9yZW1vdGUpOworCQkJCXNjaGVkc3RhdF9pbmMoc2QtPnR0d3Vfd2FrZV9yZW1vdGUpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0xNjUzLDE3ICsxNjY2LDE0IEBACiAJfQogCiAJaWYgKHdha2VfZmxhZ3MgJiBXRl9NSUdSQVRFRCkKLQkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbWlncmF0ZSk7Ci0KKwkJc2NoZWRzdGF0X2luYyhwLT5zZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfbWlncmF0ZSk7CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCi0Jc2NoZWRzdGF0X2luYyhycSwgdHR3dV9jb3VudCk7Ci0Jc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHMpOworCXNjaGVkc3RhdF9pbmMocnEtPnR0d3VfY291bnQpOworCXNjaGVkc3RhdF9pbmMocC0+c2Uuc3RhdGlzdGljcy5ucl93YWtldXBzKTsKIAogCWlmICh3YWtlX2ZsYWdzICYgV0ZfU1lOQykKLQkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX3dha2V1cHNfc3luYyk7Ci0KLSNlbmRpZiAvKiBDT05GSUdfU0NIRURTVEFUUyAqLworCQlzY2hlZHN0YXRfaW5jKHAtPnNlLnN0YXRpc3RpY3MubnJfd2FrZXVwc19zeW5jKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHR0d3VfYWN0aXZhdGUoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgZW5fZmxhZ3MpCkBAIC0yMDE2LDYgKzIwMjYsMjggQEAKIAlzdWNjZXNzID0gMTsgLyogd2UncmUgZ29pbmcgdG8gY2hhbmdlIC0+c3RhdGUgKi8KIAljcHUgPSB0YXNrX2NwdShwKTsKIAorCS8qCisJICogRW5zdXJlIHdlIGxvYWQgcC0+b25fcnEgX2FmdGVyXyBwLT5zdGF0ZSwgb3RoZXJ3aXNlIGl0IHdvdWxkCisJICogYmUgcG9zc2libGUgdG8sIGZhbHNlbHksIG9ic2VydmUgcC0+b25fcnEgPT0gMCBhbmQgZ2V0IHN0dWNrCisJICogaW4gc21wX2NvbmRfbG9hZF9hY3F1aXJlKCkgYmVsb3cuCisJICoKKwkgKiBzY2hlZF90dHd1X3BlbmRpbmcoKSAgICAgICAgICAgICAgICAgdHJ5X3RvX3dha2VfdXAoKQorCSAqICAgW1NdIHAtPm9uX3JxID0gMTsgICAgICAgICAgICAgICAgICBbTF0gUC0+c3RhdGUKKwkgKiAgICAgICBVTkxPQ0sgcnEtPmxvY2sgIC0tLS0tLgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAqCQkJCSArLS0tICAgUk1CCisJICogc2NoZWR1bGUoKSAgICAgICAgICAgICAgICAgICAvCisJICogICAgICAgTE9DSyBycS0+bG9jayAgICAtLS0tLScKKwkgKiAgICAgICBVTkxPQ0sgcnEtPmxvY2sKKwkgKgorCSAqIFt0YXNrIHBdCisJICogICBbU10gcC0+c3RhdGUgPSBVTklOVEVSUlVQVElCTEUgICAgIFtMXSBwLT5vbl9ycQorCSAqCisJICogUGFpcnMgd2l0aCB0aGUgVU5MT0NLK0xPQ0sgb24gcnEtPmxvY2sgZnJvbSB0aGUKKwkgKiBsYXN0IHdha2V1cCBvZiBvdXIgdGFzayBhbmQgdGhlIHNjaGVkdWxlIHRoYXQgZ290IG91ciB0YXNrCisJICogY3VycmVudC4KKwkgKi8KKwlzbXBfcm1iKCk7CiAJaWYgKHAtPm9uX3JxICYmIHR0d3VfcmVtb3RlKHAsIHdha2VfZmxhZ3MpKQogCQlnb3RvIHN0YXQ7CiAKQEAgLTIwNjIsOCArMjA5NCw3IEBACiAKIAl0dHd1X3F1ZXVlKHAsIGNwdSwgd2FrZV9mbGFncyk7CiBzdGF0OgotCWlmIChzY2hlZHN0YXRfZW5hYmxlZCgpKQotCQl0dHd1X3N0YXQocCwgY3B1LCB3YWtlX2ZsYWdzKTsKKwl0dHd1X3N0YXQocCwgY3B1LCB3YWtlX2ZsYWdzKTsKIG91dDoKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cGlfbG9jaywgZmxhZ3MpOwogCkBAIC0yMDczLDYgKzIxMDQsNyBAQAogLyoqCiAgKiB0cnlfdG9fd2FrZV91cF9sb2NhbCAtIHRyeSB0byB3YWtlIHVwIGEgbG9jYWwgdGFzayB3aXRoIHJxIGxvY2sgaGVsZAogICogQHA6IHRoZSB0aHJlYWQgdG8gYmUgYXdha2VuZWQKKyAqIEBjb29raWU6IGNvbnRleHQncyBjb29raWUgZm9yIHBpbm5pbmcKICAqCiAgKiBQdXQgQHAgb24gdGhlIHJ1bi1xdWV1ZSBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLiBUaGUgY2FsbGVyIG11c3QKICAqIGVuc3VyZSB0aGF0IHRoaXNfcnEoKSBpcyBsb2NrZWQsIEBwIGlzIGJvdW5kIHRvIHRoaXNfcnEoKSBhbmQgbm90CkBAIC0yMTExLDggKzIxNDMsNyBAQAogCQl0dHd1X2FjdGl2YXRlKHJxLCBwLCBFTlFVRVVFX1dBS0VVUCk7CiAKIAl0dHd1X2RvX3dha2V1cChycSwgcCwgMCwgY29va2llKTsKLQlpZiAoc2NoZWRzdGF0X2VuYWJsZWQoKSkKLQkJdHR3dV9zdGF0KHAsIHNtcF9wcm9jZXNzb3JfaWQoKSwgMCk7CisJdHR3dV9zdGF0KHAsIHNtcF9wcm9jZXNzb3JfaWQoKSwgMCk7CiBvdXQ6CiAJcmF3X3NwaW5fdW5sb2NrKCZwLT5waV9sb2NrKTsKIH0KQEAgLTI3NTAsNiArMjc4MSwxMCBAQAogCQkgKiB0YXNrIGFuZCBwdXQgdGhlbSBiYWNrIG9uIHRoZSBmcmVlIGxpc3QuCiAJCSAqLwogCQlrcHJvYmVfZmx1c2hfdGFzayhwcmV2KTsKKworCQkvKiBUYXNrIGlzIGRvbmUgd2l0aCBpdHMgc3RhY2suICovCisJCXB1dF90YXNrX3N0YWNrKHByZXYpOworCiAJCXB1dF90YXNrX3N0cnVjdChwcmV2KTsKIAl9CiAKQEAgLTMxNzAsNiArMzIwNSw5IEBACiAgKi8KIHN0YXRpYyBub2lubGluZSB2b2lkIF9fc2NoZWR1bGVfYnVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKIHsKKwkvKiBTYXZlIHRoaXMgYmVmb3JlIGNhbGxpbmcgcHJpbnRrKCksIHNpbmNlIHRoYXQgd2lsbCBjbG9iYmVyIGl0ICovCisJdW5zaWduZWQgbG9uZyBwcmVlbXB0X2Rpc2FibGVfaXAgPSBnZXRfcHJlZW1wdF9kaXNhYmxlX2lwKGN1cnJlbnQpOworCiAJaWYgKG9vcHNfaW5fcHJvZ3Jlc3MpCiAJCXJldHVybjsKIApAQCAtMzE4MCwxMyArMzIxOCwxMiBAQAogCXByaW50X21vZHVsZXMoKTsKIAlpZiAoaXJxc19kaXNhYmxlZCgpKQogCQlwcmludF9pcnF0cmFjZV9ldmVudHMocHJldik7Ci0jaWZkZWYgQ09ORklHX0RFQlVHX1BSRUVNUFQKLQlpZiAoaW5fYXRvbWljX3ByZWVtcHRfb2ZmKCkpIHsKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfREVCVUdfUFJFRU1QVCkKKwkgICAgJiYgaW5fYXRvbWljX3ByZWVtcHRfb2ZmKCkpIHsKIAkJcHJfZXJyKCJQcmVlbXB0aW9uIGRpc2FibGVkIGF0OiIpOwotCQlwcmludF9pcF9zeW0oY3VycmVudC0+cHJlZW1wdF9kaXNhYmxlX2lwKTsKKwkJcHJpbnRfaXBfc3ltKHByZWVtcHRfZGlzYWJsZV9pcCk7CiAJCXByX2NvbnQoIlxuIik7CiAJfQotI2VuZGlmCiAJaWYgKHBhbmljX29uX3dhcm4pCiAJCXBhbmljKCJzY2hlZHVsaW5nIHdoaWxlIGF0b21pY1xuIik7CiAKQEAgLTMyMTIsNyArMzI0OSw3IEBACiAKIAlwcm9maWxlX2hpdChTQ0hFRF9QUk9GSUxJTkcsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAKLQlzY2hlZHN0YXRfaW5jKHRoaXNfcnEoKSwgc2NoZWRfY291bnQpOworCXNjaGVkc3RhdF9pbmModGhpc19ycSgpLT5zY2hlZF9jb3VudCk7CiB9CiAKIC8qCkBAIC0zMzA1LDE3ICszMzQyLDYgQEAKIAlycSA9IGNwdV9ycShjcHUpOwogCXByZXYgPSBycS0+Y3VycjsKIAotCS8qCi0JICogZG9fZXhpdCgpIGNhbGxzIHNjaGVkdWxlKCkgd2l0aCBwcmVlbXB0aW9uIGRpc2FibGVkIGFzIGFuIGV4Y2VwdGlvbjsKLQkgKiBob3dldmVyIHdlIG11c3QgZml4IHRoYXQgdXAsIG90aGVyd2lzZSB0aGUgbmV4dCB0YXNrIHdpbGwgc2VlIGFuCi0JICogaW5jb25zaXN0ZW50IChoaWdoZXIpIHByZWVtcHQgY291bnQuCi0JICoKLQkgKiBJdCBhbHNvIGF2b2lkcyB0aGUgYmVsb3cgc2NoZWR1bGVfZGVidWcoKSB0ZXN0IGZyb20gY29tcGxhaW5pbmcKLQkgKiBhYm91dCB0aGlzLgotCSAqLwotCWlmICh1bmxpa2VseShwcmV2LT5zdGF0ZSA9PSBUQVNLX0RFQUQpKQotCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkX25vdHJhY2UoKTsKLQogCXNjaGVkdWxlX2RlYnVnKHByZXYpOwogCiAJaWYgKHNjaGVkX2ZlYXQoSFJUSUNLKSkKQEAgLTMzODEsNyArMzQwNywzMyBAQAogCiAJYmFsYW5jZV9jYWxsYmFjayhycSk7CiB9Ci1TVEFDS19GUkFNRV9OT05fU1RBTkRBUkQoX19zY2hlZHVsZSk7IC8qIHN3aXRjaF90bygpICovCisKK3ZvaWQgX19ub3JldHVybiBkb190YXNrX2RlYWQodm9pZCkKK3sKKwkvKgorCSAqIFRoZSBzZXR0aW5nIG9mIFRBU0tfUlVOTklORyBieSB0cnlfdG9fd2FrZV91cCgpIG1heSBiZSBkZWxheWVkCisJICogd2hlbiB0aGUgZm9sbG93aW5nIHR3byBjb25kaXRpb25zIGJlY29tZSB0cnVlLgorCSAqICAgLSBUaGVyZSBpcyByYWNlIGNvbmRpdGlvbiBvZiBtbWFwX3NlbSAoSXQgaXMgYWNxdWlyZWQgYnkKKwkgKiAgICAgZXhpdF9tbSgpKSwgYW5kCisJICogICAtIFNNSSBvY2N1cnMgYmVmb3JlIHNldHRpbmcgVEFTS19SVU5JTk5HLgorCSAqICAgICAob3IgaHlwZXJ2aXNvciBvZiB2aXJ0dWFsIG1hY2hpbmUgc3dpdGNoZXMgdG8gb3RoZXIgZ3Vlc3QpCisJICogIEFzIGEgcmVzdWx0LCB3ZSBtYXkgYmVjb21lIFRBU0tfUlVOTklORyBhZnRlciBiZWNvbWluZyBUQVNLX0RFQUQKKwkgKgorCSAqIFRvIGF2b2lkIGl0LCB3ZSBoYXZlIHRvIHdhaXQgZm9yIHJlbGVhc2luZyB0c2stPnBpX2xvY2sgd2hpY2gKKwkgKiBpcyBoZWxkIGJ5IHRyeV90b193YWtlX3VwKCkKKwkgKi8KKwlzbXBfbWIoKTsKKwlyYXdfc3Bpbl91bmxvY2tfd2FpdCgmY3VycmVudC0+cGlfbG9jayk7CisKKwkvKiBjYXVzZXMgZmluYWwgcHV0X3Rhc2tfc3RydWN0IGluIGZpbmlzaF90YXNrX3N3aXRjaCgpLiAqLworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19ERUFEKTsKKwljdXJyZW50LT5mbGFncyB8PSBQRl9OT0ZSRUVaRTsJLyogdGVsbCBmcmVlemVyIHRvIGlnbm9yZSB1cyAqLworCV9fc2NoZWR1bGUoZmFsc2UpOworCUJVRygpOworCS8qIEF2b2lkICJub3JldHVybiBmdW5jdGlvbiBkb2VzIHJldHVybiIuICAqLworCWZvciAoOzspCisJCWNwdV9yZWxheCgpOwkvKiBGb3Igd2hlbiBCVUcgaXMgbnVsbCAqLworfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfc3VibWl0X3dvcmsoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CkBAIC0zNjY1LDEwICszNzE3LDEwIEBACiAKIAlwLT5wcmlvID0gcHJpbzsKIAotCWlmIChydW5uaW5nKQotCQlwLT5zY2hlZF9jbGFzcy0+c2V0X2N1cnJfdGFzayhycSk7CiAJaWYgKHF1ZXVlZCkKIAkJZW5xdWV1ZV90YXNrKHJxLCBwLCBxdWV1ZV9mbGFnKTsKKwlpZiAocnVubmluZykKKwkJc2V0X2N1cnJfdGFzayhycSwgcCk7CiAKIAljaGVja19jbGFzc19jaGFuZ2VkKHJxLCBwLCBwcmV2X2NsYXNzLCBvbGRwcmlvKTsKIG91dF91bmxvY2s6CkBAIC0zNjgyLDcgKzM3MzQsOCBAQAogCiB2b2lkIHNldF91c2VyX25pY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBsb25nIG5pY2UpCiB7Ci0JaW50IG9sZF9wcmlvLCBkZWx0YSwgcXVldWVkOworCWJvb2wgcXVldWVkLCBydW5uaW5nOworCWludCBvbGRfcHJpbywgZGVsdGE7CiAJc3RydWN0IHJxX2ZsYWdzIHJmOwogCXN0cnVjdCBycSAqcnE7CiAKQEAgLTM3MDQsOCArMzc1NywxMSBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCXF1ZXVlZCA9IHRhc2tfb25fcnFfcXVldWVkKHApOworCXJ1bm5pbmcgPSB0YXNrX2N1cnJlbnQocnEsIHApOwogCWlmIChxdWV1ZWQpCiAJCWRlcXVldWVfdGFzayhycSwgcCwgREVRVUVVRV9TQVZFKTsKKwlpZiAocnVubmluZykKKwkJcHV0X3ByZXZfdGFzayhycSwgcCk7CiAKIAlwLT5zdGF0aWNfcHJpbyA9IE5JQ0VfVE9fUFJJTyhuaWNlKTsKIAlzZXRfbG9hZF93ZWlnaHQocCk7CkBAIC0zNzIyLDYgKzM3NzgsOCBAQAogCQlpZiAoZGVsdGEgPCAwIHx8IChkZWx0YSA+IDAgJiYgdGFza19ydW5uaW5nKHJxLCBwKSkpCiAJCQlyZXNjaGVkX2N1cnIocnEpOwogCX0KKwlpZiAocnVubmluZykKKwkJc2V0X2N1cnJfdGFzayhycSwgcCk7CiBvdXRfdW5sb2NrOgogCXRhc2tfcnFfdW5sb2NrKHJxLCBwLCAmcmYpOwogfQpAQCAtNDIyMSw4ICs0Mjc5LDYgQEAKIAlwcmV2X2NsYXNzID0gcC0+c2NoZWRfY2xhc3M7CiAJX19zZXRzY2hlZHVsZXIocnEsIHAsIGF0dHIsIHBpKTsKIAotCWlmIChydW5uaW5nKQotCQlwLT5zY2hlZF9jbGFzcy0+c2V0X2N1cnJfdGFzayhycSk7CiAJaWYgKHF1ZXVlZCkgewogCQkvKgogCQkgKiBXZSBlbnF1ZXVlIHRvIHRhaWwgd2hlbiB0aGUgcHJpb3JpdHkgb2YgYSB0YXNrIGlzCkBAIC00MjMzLDYgKzQyODksOCBAQAogCiAJCWVucXVldWVfdGFzayhycSwgcCwgcXVldWVfZmxhZ3MpOwogCX0KKwlpZiAocnVubmluZykKKwkJc2V0X2N1cnJfdGFzayhycSwgcCk7CiAKIAljaGVja19jbGFzc19jaGFuZ2VkKHJxLCBwLCBwcmV2X2NsYXNzLCBvbGRwcmlvKTsKIAlwcmVlbXB0X2Rpc2FibGUoKTsgLyogYXZvaWQgcnEgZnJvbSBnb2luZyBhd2F5IG9uIHVzICovCkBAIC00ODI0LDcgKzQ4ODIsNyBAQAogewogCXN0cnVjdCBycSAqcnEgPSB0aGlzX3JxX2xvY2soKTsKIAotCXNjaGVkc3RhdF9pbmMocnEsIHlsZF9jb3VudCk7CisJc2NoZWRzdGF0X2luYyhycS0+eWxkX2NvdW50KTsKIAljdXJyZW50LT5zY2hlZF9jbGFzcy0+eWllbGRfdGFzayhycSk7CiAKIAkvKgpAQCAtNDg0MSw2ICs0ODk5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmbmRlZiBDT05GSUdfUFJFRU1QVAogaW50IF9fc2NoZWQgX2NvbmRfcmVzY2hlZCh2b2lkKQogewogCWlmIChzaG91bGRfcmVzY2hlZCgwKSkgewpAQCAtNDg1MCw2ICs0OTA5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woX2NvbmRfcmVzY2hlZCk7CisjZW5kaWYKIAogLyoKICAqIF9fY29uZF9yZXNjaGVkX2xvY2soKSAtIGlmIGEgcmVzY2hlZHVsZSBpcyBwZW5kaW5nLCBkcm9wIHRoZSBnaXZlbiBsb2NrLApAQCAtNDk3NSw3ICs1MDM1LDcgQEAKIAogCXlpZWxkZWQgPSBjdXJyLT5zY2hlZF9jbGFzcy0+eWllbGRfdG9fdGFzayhycSwgcCwgcHJlZW1wdCk7CiAJaWYgKHlpZWxkZWQpIHsKLQkJc2NoZWRzdGF0X2luYyhycSwgeWxkX2NvdW50KTsKKwkJc2NoZWRzdGF0X2luYyhycS0+eWxkX2NvdW50KTsKIAkJLyoKIAkJICogTWFrZSBwJ3MgQ1BVIHJlc2NoZWR1bGU7IHBpY2tfbmV4dF9lbnRpdHkgdGFrZXMgY2FyZSBvZgogCQkgKiBmYWlybmVzcy4KQEAgLTUzOTUsMTAgKzU0NTUsMTAgQEAKIAogCXAtPm51bWFfcHJlZmVycmVkX25pZCA9IG5pZDsKIAotCWlmIChydW5uaW5nKQotCQlwLT5zY2hlZF9jbGFzcy0+c2V0X2N1cnJfdGFzayhycSk7CiAJaWYgKHF1ZXVlZCkKIAkJZW5xdWV1ZV90YXNrKHJxLCBwLCBFTlFVRVVFX1JFU1RPUkUpOworCWlmIChydW5uaW5nKQorCQlzZXRfY3Vycl90YXNrKHJxLCBwKTsKIAl0YXNrX3JxX3VubG9jayhycSwgcCwgJnJmKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfTlVNQV9CQUxBTkNJTkcgKi8KQEAgLTU2OTUsNiArNTc1NSw4IEBACiAJfQogfQogI2Vsc2UgLyogIUNPTkZJR19TQ0hFRF9ERUJVRyAqLworCisjIGRlZmluZSBzY2hlZF9kZWJ1Z19lbmFibGVkIDAKICMgZGVmaW5lIHNjaGVkX2RvbWFpbl9kZWJ1ZyhzZCwgY3B1KSBkbyB7IH0gd2hpbGUgKDApCiBzdGF0aWMgaW5saW5lIGJvb2wgc2NoZWRfZGVidWcodm9pZCkKIHsKQEAgLTU3MTMsNiArNTc3NSw3IEBACiAJCQkgU0RfQkFMQU5DRV9GT1JLIHwKIAkJCSBTRF9CQUxBTkNFX0VYRUMgfAogCQkJIFNEX1NIQVJFX0NQVUNBUEFDSVRZIHwKKwkJCSBTRF9BU1lNX0NQVUNBUEFDSVRZIHwKIAkJCSBTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTIHwKIAkJCSBTRF9TSEFSRV9QT1dFUkRPTUFJTikpIHsKIAkJaWYgKHNkLT5ncm91cHMgIT0gc2QtPmdyb3Vwcy0+bmV4dCkKQEAgLTU3NDMsNiArNTgwNiw3IEBACiAJCQkJU0RfQkFMQU5DRV9ORVdJRExFIHwKIAkJCQlTRF9CQUxBTkNFX0ZPUksgfAogCQkJCVNEX0JBTEFOQ0VfRVhFQyB8CisJCQkJU0RfQVNZTV9DUFVDQVBBQ0lUWSB8CiAJCQkJU0RfU0hBUkVfQ1BVQ0FQQUNJVFkgfAogCQkJCVNEX1NIQVJFX1BLR19SRVNPVVJDRVMgfAogCQkJCVNEX1BSRUZFUl9TSUJMSU5HIHwKQEAgLTU4ODcsMTAgKzU5NTEsOCBAQAogCX0gd2hpbGUgKHNnICE9IGZpcnN0KTsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9zY2hlZF9kb21haW4oc3RydWN0IHJjdV9oZWFkICpyY3UpCitzdGF0aWMgdm9pZCBkZXN0cm95X3NjaGVkX2RvbWFpbihzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKIHsKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBzY2hlZF9kb21haW4sIHJjdSk7Ci0KIAkvKgogCSAqIElmIGl0cyBhbiBvdmVybGFwcGluZyBkb21haW4gaXQgaGFzIHByaXZhdGUgZ3JvdXBzLCBpdGVyYXRlIGFuZAogCSAqIG51a2UgdGhlbSBhbGwuCkBAIC01OTAxLDE4ICs1OTYzLDI2IEBACiAJCWtmcmVlKHNkLT5ncm91cHMtPnNnYyk7CiAJCWtmcmVlKHNkLT5ncm91cHMpOwogCX0KKwlpZiAoc2QtPnNoYXJlZCAmJiBhdG9taWNfZGVjX2FuZF90ZXN0KCZzZC0+c2hhcmVkLT5yZWYpKQorCQlrZnJlZShzZC0+c2hhcmVkKTsKIAlrZnJlZShzZCk7CiB9CiAKLXN0YXRpYyB2b2lkIGRlc3Ryb3lfc2NoZWRfZG9tYWluKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQorc3RhdGljIHZvaWQgZGVzdHJveV9zY2hlZF9kb21haW5zX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKIHsKLQljYWxsX3JjdSgmc2QtPnJjdSwgZnJlZV9zY2hlZF9kb21haW4pOworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHNjaGVkX2RvbWFpbiwgcmN1KTsKKworCXdoaWxlIChzZCkgeworCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpwYXJlbnQgPSBzZC0+cGFyZW50OworCQlkZXN0cm95X3NjaGVkX2RvbWFpbihzZCk7CisJCXNkID0gcGFyZW50OworCX0KIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9zY2hlZF9kb21haW5zKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQorc3RhdGljIHZvaWQgZGVzdHJveV9zY2hlZF9kb21haW5zKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkKQogewotCWZvciAoOyBzZDsgc2QgPSBzZC0+cGFyZW50KQotCQlkZXN0cm95X3NjaGVkX2RvbWFpbihzZCwgY3B1KTsKKwlpZiAoc2QpCisJCWNhbGxfcmN1KCZzZC0+cmN1LCBkZXN0cm95X3NjaGVkX2RvbWFpbnNfcmN1KTsKIH0KIAogLyoKQEAgLTU5MjcsMTQgKzU5OTcsMTQgQEAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4gKiwgc2RfbGxjKTsKIERFRklORV9QRVJfQ1BVKGludCwgc2RfbGxjX3NpemUpOwogREVGSU5FX1BFUl9DUFUoaW50LCBzZF9sbGNfaWQpOworREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbl9zaGFyZWQgKiwgc2RfbGxjX3NoYXJlZCk7CiBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluICosIHNkX251bWEpOwotREVGSU5FX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiAqLCBzZF9idXN5KTsKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzY2hlZF9kb21haW4gKiwgc2RfYXN5bSk7CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV90b3BfY2FjaGVfZG9tYWluKGludCBjcHUpCiB7CisJc3RydWN0IHNjaGVkX2RvbWFpbl9zaGFyZWQgKnNkcyA9IE5VTEw7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7Ci0Jc3RydWN0IHNjaGVkX2RvbWFpbiAqYnVzeV9zZCA9IE5VTEw7CiAJaW50IGlkID0gY3B1OwogCWludCBzaXplID0gMTsKIApAQCAtNTk0MiwxMyArNjAxMiwxMyBAQAogCWlmIChzZCkgewogCQlpZCA9IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZG9tYWluX3NwYW4oc2QpKTsKIAkJc2l6ZSA9IGNwdW1hc2tfd2VpZ2h0KHNjaGVkX2RvbWFpbl9zcGFuKHNkKSk7Ci0JCWJ1c3lfc2QgPSBzZC0+cGFyZW50OyAvKiBzZF9idXN5ICovCisJCXNkcyA9IHNkLT5zaGFyZWQ7CiAJfQotCXJjdV9hc3NpZ25fcG9pbnRlcihwZXJfY3B1KHNkX2J1c3ksIGNwdSksIGJ1c3lfc2QpOwogCiAJcmN1X2Fzc2lnbl9wb2ludGVyKHBlcl9jcHUoc2RfbGxjLCBjcHUpLCBzZCk7CiAJcGVyX2NwdShzZF9sbGNfc2l6ZSwgY3B1KSA9IHNpemU7CiAJcGVyX2NwdShzZF9sbGNfaWQsIGNwdSkgPSBpZDsKKwlyY3VfYXNzaWduX3BvaW50ZXIocGVyX2NwdShzZF9sbGNfc2hhcmVkLCBjcHUpLCBzZHMpOwogCiAJc2QgPSBsb3dlc3RfZmxhZ19kb21haW4oY3B1LCBTRF9OVU1BKTsKIAlyY3VfYXNzaWduX3BvaW50ZXIocGVyX2NwdShzZF9udW1hLCBjcHUpLCBzZCk7CkBAIC01OTg0LDcgKzYwNTQsNyBAQAogCQkJICovCiAJCQlpZiAocGFyZW50LT5mbGFncyAmIFNEX1BSRUZFUl9TSUJMSU5HKQogCQkJCXRtcC0+ZmxhZ3MgfD0gU0RfUFJFRkVSX1NJQkxJTkc7Ci0JCQlkZXN0cm95X3NjaGVkX2RvbWFpbihwYXJlbnQsIGNwdSk7CisJCQlkZXN0cm95X3NjaGVkX2RvbWFpbihwYXJlbnQpOwogCQl9IGVsc2UKIAkJCXRtcCA9IHRtcC0+cGFyZW50OwogCX0KQEAgLTU5OTIsNyArNjA2Miw3IEBACiAJaWYgKHNkICYmIHNkX2RlZ2VuZXJhdGUoc2QpKSB7CiAJCXRtcCA9IHNkOwogCQlzZCA9IHNkLT5wYXJlbnQ7Ci0JCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHRtcCwgY3B1KTsKKwkJZGVzdHJveV9zY2hlZF9kb21haW4odG1wKTsKIAkJaWYgKHNkKQogCQkJc2QtPmNoaWxkID0gTlVMTDsKIAl9CkBAIC02MDAyLDcgKzYwNzIsNyBAQAogCXJxX2F0dGFjaF9yb290KHJxLCByZCk7CiAJdG1wID0gcnEtPnNkOwogCXJjdV9hc3NpZ25fcG9pbnRlcihycS0+c2QsIHNkKTsKLQlkZXN0cm95X3NjaGVkX2RvbWFpbnModG1wLCBjcHUpOworCWRlc3Ryb3lfc2NoZWRfZG9tYWlucyh0bXApOwogCiAJdXBkYXRlX3RvcF9jYWNoZV9kb21haW4oY3B1KTsKIH0KQEAgLTYyNDUsNyArNjMxNSw2IEBACiAJCXJldHVybjsKIAogCXVwZGF0ZV9ncm91cF9jYXBhY2l0eShzZCwgY3B1KTsKLQlhdG9taWNfc2V0KCZzZy0+c2djLT5ucl9idXN5X2NwdXMsIHNnLT5ncm91cF93ZWlnaHQpOwogfQogCiAvKgpAQCAtNjMzMyw2ICs2NDAyLDkgQEAKIAlXQVJOX09OX09OQ0UoKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGNwdSkgIT0gc2QpOwogCSpwZXJfY3B1X3B0cihzZGQtPnNkLCBjcHUpID0gTlVMTDsKIAorCWlmIChhdG9taWNfcmVhZCgmKCpwZXJfY3B1X3B0cihzZGQtPnNkcywgY3B1KSktPnJlZikpCisJCSpwZXJfY3B1X3B0cihzZGQtPnNkcywgY3B1KSA9IE5VTEw7CisKIAlpZiAoYXRvbWljX3JlYWQoJigqcGVyX2NwdV9wdHIoc2RkLT5zZywgY3B1KSktPnJlZikpCiAJCSpwZXJfY3B1X3B0cihzZGQtPnNnLCBjcHUpID0gTlVMTDsKIApAQCAtNjM1MiwyNiArNjQyNCwzNyBAQAogLyoKICAqIFNEX2ZsYWdzIGFsbG93ZWQgaW4gdG9wb2xvZ3kgZGVzY3JpcHRpb25zLgogICoKLSAqIFNEX1NIQVJFX0NQVUNBUEFDSVRZICAgICAgLSBkZXNjcmliZXMgU01UIHRvcG9sb2dpZXMKLSAqIFNEX1NIQVJFX1BLR19SRVNPVVJDRVMgLSBkZXNjcmliZXMgc2hhcmVkIGNhY2hlcwotICogU0RfTlVNQSAgICAgICAgICAgICAgICAtIGRlc2NyaWJlcyBOVU1BIHRvcG9sb2dpZXMKLSAqIFNEX1NIQVJFX1BPV0VSRE9NQUlOICAgLSBkZXNjcmliZXMgc2hhcmVkIHBvd2VyIGRvbWFpbgorICogVGhlc2UgZmxhZ3MgYXJlIHB1cmVseSBkZXNjcmlwdGl2ZSBvZiB0aGUgdG9wb2xvZ3kgYW5kIGRvIG5vdCBwcmVzY3JpYmUKKyAqIGJlaGF2aW91ci4gQmVoYXZpb3VyIGlzIGFydGlmaWNpYWwgYW5kIG1hcHBlZCBpbiB0aGUgYmVsb3cgc2RfaW5pdCgpCisgKiBmdW5jdGlvbjoKICAqCi0gKiBPZGQgb25lIG91dDoKLSAqIFNEX0FTWU1fUEFDS0lORyAgICAgICAgLSBkZXNjcmliZXMgU01UIHF1aXJrcworICogICBTRF9TSEFSRV9DUFVDQVBBQ0lUWSAgIC0gZGVzY3JpYmVzIFNNVCB0b3BvbG9naWVzCisgKiAgIFNEX1NIQVJFX1BLR19SRVNPVVJDRVMgLSBkZXNjcmliZXMgc2hhcmVkIGNhY2hlcworICogICBTRF9OVU1BICAgICAgICAgICAgICAgIC0gZGVzY3JpYmVzIE5VTUEgdG9wb2xvZ2llcworICogICBTRF9TSEFSRV9QT1dFUkRPTUFJTiAgIC0gZGVzY3JpYmVzIHNoYXJlZCBwb3dlciBkb21haW4KKyAqICAgU0RfQVNZTV9DUFVDQVBBQ0lUWSAgICAtIGRlc2NyaWJlcyBtaXhlZCBjYXBhY2l0eSB0b3BvbG9naWVzCisgKgorICogT2RkIG9uZSBvdXQsIHdoaWNoIGJlc2lkZSBkZXNjcmliaW5nIHRoZSB0b3BvbG9neSBoYXMgYSBxdWlyayBhbHNvCisgKiBwcmVzY3JpYmVzIHRoZSBkZXNpcmVkIGJlaGF2aW91ciB0aGF0IGdvZXMgYWxvbmcgd2l0aCBpdDoKKyAqCisgKiAgIFNEX0FTWU1fUEFDS0lORyAgICAgICAgLSBkZXNjcmliZXMgU01UIHF1aXJrcwogICovCiAjZGVmaW5lIFRPUE9MT0dZX1NEX0ZMQUdTCQlcCiAJKFNEX1NIQVJFX0NQVUNBUEFDSVRZIHwJCVwKIAkgU0RfU0hBUkVfUEtHX1JFU09VUkNFUyB8CVwKIAkgU0RfTlVNQSB8CQkJXAogCSBTRF9BU1lNX1BBQ0tJTkcgfAkJXAorCSBTRF9BU1lNX0NQVUNBUEFDSVRZIHwJCVwKIAkgU0RfU0hBUkVfUE9XRVJET01BSU4pCiAKIHN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZG9tYWluICoKLXNkX2luaXQoc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGwsIGludCBjcHUpCitzZF9pbml0KHN0cnVjdCBzY2hlZF9kb21haW5fdG9wb2xvZ3lfbGV2ZWwgKnRsLAorCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwLAorCXN0cnVjdCBzY2hlZF9kb21haW4gKmNoaWxkLCBpbnQgY3B1KQogewotCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gKnBlcl9jcHVfcHRyKHRsLT5kYXRhLnNkLCBjcHUpOwotCWludCBzZF93ZWlnaHQsIHNkX2ZsYWdzID0gMDsKKwlzdHJ1Y3Qgc2RfZGF0YSAqc2RkID0gJnRsLT5kYXRhOworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGNwdSk7CisJaW50IHNkX2lkLCBzZF93ZWlnaHQsIHNkX2ZsYWdzID0gMDsKIAogI2lmZGVmIENPTkZJR19OVU1BCiAJLyoKQEAgLTY0MjAsMTUgKzY1MDMsMjYgQEAKIAkJLnNtdF9nYWluCQk9IDAsCiAJCS5tYXhfbmV3aWRsZV9sYl9jb3N0CT0gMCwKIAkJLm5leHRfZGVjYXlfbWF4X2xiX2Nvc3QJPSBqaWZmaWVzLAorCQkuY2hpbGQJCQk9IGNoaWxkLAogI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwogCQkubmFtZQkJCT0gdGwtPm5hbWUsCiAjZW5kaWYKIAl9OwogCisJY3B1bWFza19hbmQoc2NoZWRfZG9tYWluX3NwYW4oc2QpLCBjcHVfbWFwLCB0bC0+bWFzayhjcHUpKTsKKwlzZF9pZCA9IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZG9tYWluX3NwYW4oc2QpKTsKKwogCS8qCiAJICogQ29udmVydCB0b3BvbG9naWNhbCBwcm9wZXJ0aWVzIGludG8gYmVoYXZpb3VyLgogCSAqLwogCisJaWYgKHNkLT5mbGFncyAmIFNEX0FTWU1fQ1BVQ0FQQUNJVFkpIHsKKwkJc3RydWN0IHNjaGVkX2RvbWFpbiAqdCA9IHNkOworCisJCWZvcl9lYWNoX2xvd2VyX2RvbWFpbih0KQorCQkJdC0+ZmxhZ3MgfD0gU0RfQkFMQU5DRV9XQUtFOworCX0KKwogCWlmIChzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9DUFVDQVBBQ0lUWSkgewogCQlzZC0+ZmxhZ3MgfD0gU0RfUFJFRkVSX1NJQkxJTkc7CiAJCXNkLT5pbWJhbGFuY2VfcGN0ID0gMTEwOwpAQCAtNjQ2MCw3ICs2NTU0LDE3IEBACiAJCXNkLT5pZGxlX2lkeCA9IDE7CiAJfQogCi0Jc2QtPnByaXZhdGUgPSAmdGwtPmRhdGE7CisJLyoKKwkgKiBGb3IgYWxsIGxldmVscyBzaGFyaW5nIGNhY2hlOyBjb25uZWN0IGEgc2NoZWRfZG9tYWluX3NoYXJlZAorCSAqIGluc3RhbmNlLgorCSAqLworCWlmIChzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTKSB7CisJCXNkLT5zaGFyZWQgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZHMsIHNkX2lkKTsKKwkJYXRvbWljX2luYygmc2QtPnNoYXJlZC0+cmVmKTsKKwkJYXRvbWljX3NldCgmc2QtPnNoYXJlZC0+bnJfYnVzeV9jcHVzLCBzZF93ZWlnaHQpOworCX0KKworCXNkLT5wcml2YXRlID0gc2RkOwogCiAJcmV0dXJuIHNkOwogfQpAQCAtNjQ4Nyw2ICs2NTkxLDkgQEAKIAogdm9pZCBzZXRfc2NoZWRfdG9wb2xvZ3koc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGwpCiB7CisJaWYgKFdBUk5fT05fT05DRShzY2hlZF9zbXBfaW5pdGlhbGl6ZWQpKQorCQlyZXR1cm47CisKIAlzY2hlZF9kb21haW5fdG9wb2xvZ3kgPSB0bDsKIH0KIApAQCAtNjc2Nyw2ICs2ODc0LDEwIEBACiAJCWlmICghc2RkLT5zZCkKIAkJCXJldHVybiAtRU5PTUVNOwogCisJCXNkZC0+c2RzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBzY2hlZF9kb21haW5fc2hhcmVkICopOworCQlpZiAoIXNkZC0+c2RzKQorCQkJcmV0dXJuIC1FTk9NRU07CisKIAkJc2RkLT5zZyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKik7CiAJCWlmICghc2RkLT5zZykKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtNjc3Nyw2ICs2ODg4LDcgQEAKIAogCQlmb3JfZWFjaF9jcHUoaiwgY3B1X21hcCkgewogCQkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisJCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluX3NoYXJlZCAqc2RzOwogCQkJc3RydWN0IHNjaGVkX2dyb3VwICpzZzsKIAkJCXN0cnVjdCBzY2hlZF9ncm91cF9jYXBhY2l0eSAqc2djOwogCkBAIC02Nzg3LDYgKzY4OTksMTMgQEAKIAogCQkJKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGopID0gc2Q7CiAKKwkJCXNkcyA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX2RvbWFpbl9zaGFyZWQpLAorCQkJCQlHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShqKSk7CisJCQlpZiAoIXNkcykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJKnBlcl9jcHVfcHRyKHNkZC0+c2RzLCBqKSA9IHNkczsKKwogCQkJc2cgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBzY2hlZF9ncm91cCkgKyBjcHVtYXNrX3NpemUoKSwKIAkJCQkJR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaikpOwogCQkJaWYgKCFzZykKQEAgLTY4MjYsNiArNjk0NSw4IEBACiAJCQkJa2ZyZWUoKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGopKTsKIAkJCX0KIAorCQkJaWYgKHNkZC0+c2RzKQorCQkJCWtmcmVlKCpwZXJfY3B1X3B0cihzZGQtPnNkcywgaikpOwogCQkJaWYgKHNkZC0+c2cpCiAJCQkJa2ZyZWUoKnBlcl9jcHVfcHRyKHNkZC0+c2csIGopKTsKIAkJCWlmIChzZGQtPnNnYykKQEAgLTY4MzMsNiArNjk1NCw4IEBACiAJCX0KIAkJZnJlZV9wZXJjcHUoc2RkLT5zZCk7CiAJCXNkZC0+c2QgPSBOVUxMOworCQlmcmVlX3BlcmNwdShzZGQtPnNkcyk7CisJCXNkZC0+c2RzID0gTlVMTDsKIAkJZnJlZV9wZXJjcHUoc2RkLT5zZyk7CiAJCXNkZC0+c2cgPSBOVUxMOwogCQlmcmVlX3BlcmNwdShzZGQtPnNnYyk7CkBAIC02ODQ0LDE2ICs2OTY3LDEyIEBACiAJCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwLCBzdHJ1Y3Qgc2NoZWRfZG9tYWluX2F0dHIgKmF0dHIsCiAJCXN0cnVjdCBzY2hlZF9kb21haW4gKmNoaWxkLCBpbnQgY3B1KQogewotCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkID0gc2RfaW5pdCh0bCwgY3B1KTsKLQlpZiAoIXNkKQotCQlyZXR1cm4gY2hpbGQ7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSBzZF9pbml0KHRsLCBjcHVfbWFwLCBjaGlsZCwgY3B1KTsKIAotCWNwdW1hc2tfYW5kKHNjaGVkX2RvbWFpbl9zcGFuKHNkKSwgY3B1X21hcCwgdGwtPm1hc2soY3B1KSk7CiAJaWYgKGNoaWxkKSB7CiAJCXNkLT5sZXZlbCA9IGNoaWxkLT5sZXZlbCArIDE7CiAJCXNjaGVkX2RvbWFpbl9sZXZlbF9tYXggPSBtYXgoc2NoZWRfZG9tYWluX2xldmVsX21heCwgc2QtPmxldmVsKTsKIAkJY2hpbGQtPnBhcmVudCA9IHNkOwotCQlzZC0+Y2hpbGQgPSBjaGlsZDsKIAogCQlpZiAoIWNwdW1hc2tfc3Vic2V0KHNjaGVkX2RvbWFpbl9zcGFuKGNoaWxkKSwKIAkJCQkgICAgc2NoZWRfZG9tYWluX3NwYW4oc2QpKSkgewpAQCAtNjg4NCw2ICs3MDAzLDcgQEAKIAllbnVtIHNfYWxsb2MgYWxsb2Nfc3RhdGU7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAJc3RydWN0IHNfZGF0YSBkOworCXN0cnVjdCBycSAqcnEgPSBOVUxMOwogCWludCBpLCByZXQgPSAtRU5PTUVNOwogCiAJYWxsb2Nfc3RhdGUgPSBfX3Zpc2l0X2RvbWFpbl9hbGxvY2F0aW9uX2hlbGwoJmQsIGNwdV9tYXApOwpAQCAtNjkzNCwxMSArNzA1NCwyMiBAQAogCS8qIEF0dGFjaCB0aGUgZG9tYWlucyAqLwogCXJjdV9yZWFkX2xvY2soKTsKIAlmb3JfZWFjaF9jcHUoaSwgY3B1X21hcCkgeworCQlycSA9IGNwdV9ycShpKTsKIAkJc2QgPSAqcGVyX2NwdV9wdHIoZC5zZCwgaSk7CisKKwkJLyogVXNlIFJFQURfT05DRSgpL1dSSVRFX09OQ0UoKSB0byBhdm9pZCBsb2FkL3N0b3JlIHRlYXJpbmc6ICovCisJCWlmIChycS0+Y3B1X2NhcGFjaXR5X29yaWcgPiBSRUFEX09OQ0UoZC5yZC0+bWF4X2NwdV9jYXBhY2l0eSkpCisJCQlXUklURV9PTkNFKGQucmQtPm1heF9jcHVfY2FwYWNpdHksIHJxLT5jcHVfY2FwYWNpdHlfb3JpZyk7CisKIAkJY3B1X2F0dGFjaF9kb21haW4oc2QsIGQucmQsIGkpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAorCWlmIChycSAmJiBzY2hlZF9kZWJ1Z19lbmFibGVkKSB7CisJCXByX2luZm8oInNwYW46ICUqcGJsIChtYXggY3B1X2NhcGFjaXR5ID0gJWx1KVxuIiwKKwkJCWNwdW1hc2tfcHJfYXJncyhjcHVfbWFwKSwgcnEtPnJkLT5tYXhfY3B1X2NhcGFjaXR5KTsKKwl9CisKIAlyZXQgPSAwOwogZXJyb3I6CiAJX19mcmVlX2RvbWFpbl9hbGxvY3MoJmQsIGFsbG9jX3N0YXRlLCBjcHVfbWFwKTsKQEAgLTcyOTcsNiArNzQyOCwyMiBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfU0NIRURfU01UCitERUZJTkVfU1RBVElDX0tFWV9GQUxTRShzY2hlZF9zbXRfcHJlc2VudCk7CisKK3N0YXRpYyB2b2lkIHNjaGVkX2luaXRfc210KHZvaWQpCit7CisJLyoKKwkgKiBXZSd2ZSBlbnVtZXJhdGVkIGFsbCBDUFVzIGFuZCB3aWxsIGFzc3VtZSB0aGF0IGlmIGFueSBDUFUKKwkgKiBoYXMgU01UIHNpYmxpbmdzLCBDUFUwIHdpbGwgdG9vLgorCSAqLworCWlmIChjcHVtYXNrX3dlaWdodChjcHVfc210X21hc2soMCkpID4gMSkKKwkJc3RhdGljX2JyYW5jaF9lbmFibGUoJnNjaGVkX3NtdF9wcmVzZW50KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfaW5pdF9zbXQodm9pZCkgeyB9CisjZW5kaWYKKwogdm9pZCBfX2luaXQgc2NoZWRfaW5pdF9zbXAodm9pZCkKIHsKIAljcHVtYXNrX3Zhcl90IG5vbl9pc29sYXRlZF9jcHVzOwpAQCAtNzMyNiw2ICs3NDczLDkgQEAKIAogCWluaXRfc2NoZWRfcnRfY2xhc3MoKTsKIAlpbml0X3NjaGVkX2RsX2NsYXNzKCk7CisKKwlzY2hlZF9pbml0X3NtdCgpOworCiAJc2NoZWRfc21wX2luaXRpYWxpemVkID0gdHJ1ZTsKIH0KIApAQCAtNzM2Myw2ICs3NTEzLDcgQEAKICNlbmRpZgogCiBERUNMQVJFX1BFUl9DUFUoY3B1bWFza192YXJfdCwgbG9hZF9iYWxhbmNlX21hc2spOworREVDTEFSRV9QRVJfQ1BVKGNwdW1hc2tfdmFyX3QsIHNlbGVjdF9pZGxlX21hc2spOwogCiB2b2lkIF9faW5pdCBzY2hlZF9pbml0KHZvaWQpCiB7CkBAIC03Mzk5LDYgKzc1NTAsOCBAQAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCXBlcl9jcHUobG9hZF9iYWxhbmNlX21hc2ssIGkpID0gKGNwdW1hc2tfdmFyX3Qpa3phbGxvY19ub2RlKAogCQkJY3B1bWFza19zaXplKCksIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGkpKTsKKwkJcGVyX2NwdShzZWxlY3RfaWRsZV9tYXNrLCBpKSA9IChjcHVtYXNrX3Zhcl90KWt6YWxsb2Nfbm9kZSgKKwkJCWNwdW1hc2tfc2l6ZSgpLCBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShpKSk7CiAJfQogI2VuZGlmIC8qIENPTkZJR19DUFVNQVNLX09GRlNUQUNLICovCiAKQEAgLTc1MDEsMTAgKzc2NTQsNiBAQAogCiAJc2V0X2xvYWRfd2VpZ2h0KCZpbml0X3Rhc2spOwogCi0jaWZkZWYgQ09ORklHX1BSRUVNUFRfTk9USUZJRVJTCi0JSU5JVF9ITElTVF9IRUFEKCZpbml0X3Rhc2sucHJlZW1wdF9ub3RpZmllcnMpOwotI2VuZGlmCi0KIAkvKgogCSAqIFRoZSBib290IGlkbGUgdGhyZWFkIGRvZXMgbGF6eSBNTVUgc3dpdGNoaW5nIGFzIHdlbGw6CiAJICovCkBAIC03NTEyLDExICs3NjYxLDYgQEAKIAllbnRlcl9sYXp5X3RsYigmaW5pdF9tbSwgY3VycmVudCk7CiAKIAkvKgotCSAqIER1cmluZyBlYXJseSBib290dXAgd2UgcHJldGVuZCB0byBiZSBhIG5vcm1hbCB0YXNrOgotCSAqLwotCWN1cnJlbnQtPnNjaGVkX2NsYXNzID0gJmZhaXJfc2NoZWRfY2xhc3M7Ci0KLQkvKgogCSAqIE1ha2UgdXMgdGhlIGlkbGUgdGhyZWFkLiBUZWNobmljYWxseSwgc2NoZWR1bGUoKSBzaG91bGQgbm90IGJlCiAJICogY2FsbGVkIGZyb20gdGhpcyB0aHJlYWQsIGhvd2V2ZXIgc29tZXdoZXJlIGJlbG93IGl0IG1pZ2h0IGJlLAogCSAqIGJ1dCBiZWNhdXNlIHdlIGFyZSB0aGUgaWRsZSB0aHJlYWQsIHdlIGp1c3QgcGljayB1cCBydW5uaW5nIGFnYWluCkBAIC03NTcwLDYgKzc3MTQsNyBAQAogdm9pZCBfX19taWdodF9zbGVlcChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IHByZWVtcHRfb2Zmc2V0KQogewogCXN0YXRpYyB1bnNpZ25lZCBsb25nIHByZXZfamlmZnk7CS8qIHJhdGVsaW1pdGluZyAqLworCXVuc2lnbmVkIGxvbmcgcHJlZW1wdF9kaXNhYmxlX2lwOwogCiAJcmN1X3NsZWVwX2NoZWNrKCk7IC8qIFdBUk5fT05fT05DRSgpIGJ5IGRlZmF1bHQsIG5vIHJhdGUgbGltaXQgcmVxZC4gKi8KIAlpZiAoKHByZWVtcHRfY291bnRfZXF1YWxzKHByZWVtcHRfb2Zmc2V0KSAmJiAhaXJxc19kaXNhYmxlZCgpICYmCkBAIC03NTgwLDYgKzc3MjUsOSBAQAogCQlyZXR1cm47CiAJcHJldl9qaWZmeSA9IGppZmZpZXM7CiAKKwkvKiBTYXZlIHRoaXMgYmVmb3JlIGNhbGxpbmcgcHJpbnRrKCksIHNpbmNlIHRoYXQgd2lsbCBjbG9iYmVyIGl0ICovCisJcHJlZW1wdF9kaXNhYmxlX2lwID0gZ2V0X3ByZWVtcHRfZGlzYWJsZV9pcChjdXJyZW50KTsKKwogCXByaW50ayhLRVJOX0VSUgogCQkiQlVHOiBzbGVlcGluZyBmdW5jdGlvbiBjYWxsZWQgZnJvbSBpbnZhbGlkIGNvbnRleHQgYXQgJXM6JWRcbiIsCiAJCQlmaWxlLCBsaW5lKTsKQEAgLTc1OTQsMTQgKzc3NDIsMTQgQEAKIAlkZWJ1Z19zaG93X2hlbGRfbG9ja3MoY3VycmVudCk7CiAJaWYgKGlycXNfZGlzYWJsZWQoKSkKIAkJcHJpbnRfaXJxdHJhY2VfZXZlbnRzKGN1cnJlbnQpOwotI2lmZGVmIENPTkZJR19ERUJVR19QUkVFTVBUCi0JaWYgKCFwcmVlbXB0X2NvdW50X2VxdWFscyhwcmVlbXB0X29mZnNldCkpIHsKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfREVCVUdfUFJFRU1QVCkKKwkgICAgJiYgIXByZWVtcHRfY291bnRfZXF1YWxzKHByZWVtcHRfb2Zmc2V0KSkgewogCQlwcl9lcnIoIlByZWVtcHRpb24gZGlzYWJsZWQgYXQ6Iik7Ci0JCXByaW50X2lwX3N5bShjdXJyZW50LT5wcmVlbXB0X2Rpc2FibGVfaXApOworCQlwcmludF9pcF9zeW0ocHJlZW1wdF9kaXNhYmxlX2lwKTsKIAkJcHJfY29udCgiXG4iKTsKIAl9Ci0jZW5kaWYKIAlkdW1wX3N0YWNrKCk7CisJYWRkX3RhaW50KFRBSU5UX1dBUk4sIExPQ0tERVBfU1RJTExfT0spOwogfQogRVhQT1JUX1NZTUJPTChfX19taWdodF9zbGVlcCk7CiAjZW5kaWYKQEAgLTc2MjIsMTIgKzc3NzAsMTAgQEAKIAkJaWYgKHAtPmZsYWdzICYgUEZfS1RIUkVBRCkKIAkJCWNvbnRpbnVlOwogCi0JCXAtPnNlLmV4ZWNfc3RhcnQJCT0gMDsKLSNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwotCQlwLT5zZS5zdGF0aXN0aWNzLndhaXRfc3RhcnQJPSAwOwotCQlwLT5zZS5zdGF0aXN0aWNzLnNsZWVwX3N0YXJ0CT0gMDsKLQkJcC0+c2Uuc3RhdGlzdGljcy5ibG9ja19zdGFydAk9IDA7Ci0jZW5kaWYKKwkJcC0+c2UuZXhlY19zdGFydCA9IDA7CisJCXNjaGVkc3RhdF9zZXQocC0+c2Uuc3RhdGlzdGljcy53YWl0X3N0YXJ0LCAgMCk7CisJCXNjaGVkc3RhdF9zZXQocC0+c2Uuc3RhdGlzdGljcy5zbGVlcF9zdGFydCwgMCk7CisJCXNjaGVkc3RhdF9zZXQocC0+c2Uuc3RhdGlzdGljcy5ibG9ja19zdGFydCwgMCk7CiAKIAkJaWYgKCFkbF90YXNrKHApICYmICFydF90YXNrKHApKSB7CiAJCQkvKgpAQCAtNzY4OCw3ICs3ODM0LDcgQEAKICAqCiAgKiBPTkxZIFZBTElEIFdIRU4gVEhFIFdIT0xFIFNZU1RFTSBJUyBTVE9QUEVEIQogICovCi12b2lkIHNldF9jdXJyX3Rhc2soaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQordm9pZCBpYTY0X3NldF9jdXJyX3Rhc2soaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCWNwdV9jdXJyKGNwdSkgPSBwOwogfQpAQCAtNzgxOSwxMCArNzk2NSwxMCBAQAogCiAJc2NoZWRfY2hhbmdlX2dyb3VwKHRzaywgVEFTS19NT1ZFX0dST1VQKTsKIAotCWlmICh1bmxpa2VseShydW5uaW5nKSkKLQkJdHNrLT5zY2hlZF9jbGFzcy0+c2V0X2N1cnJfdGFzayhycSk7CiAJaWYgKHF1ZXVlZCkKIAkJZW5xdWV1ZV90YXNrKHJxLCB0c2ssIEVOUVVFVUVfUkVTVE9SRSB8IEVOUVVFVUVfTU9WRSk7CisJaWYgKHVubGlrZWx5KHJ1bm5pbmcpKQorCQlzZXRfY3Vycl90YXNrKHJxLCB0c2spOwogCiAJdGFza19ycV91bmxvY2socnEsIHRzaywgJnJmKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9jcHVkZWFkbGluZS5jIGIva2VybmVsL3NjaGVkL2NwdWRlYWRsaW5lLmMKaW5kZXggZDQxODQ0OS4uZTczMTE5MCAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2NwdWRlYWRsaW5lLmMKKysrIGIva2VybmVsL3NjaGVkL2NwdWRlYWRsaW5lLmMKQEAgLTMxLDU2ICszMSw4MSBAQAogCXJldHVybiAoaSA8PCAxKSArIDI7CiB9CiAKLXN0YXRpYyB2b2lkIGNwdWRsX2V4Y2hhbmdlKHN0cnVjdCBjcHVkbCAqY3AsIGludCBhLCBpbnQgYikKK3N0YXRpYyB2b2lkIGNwdWRsX2hlYXBpZnlfZG93bihzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgaWR4KQogewotCWludCBjcHVfYSA9IGNwLT5lbGVtZW50c1thXS5jcHUsIGNwdV9iID0gY3AtPmVsZW1lbnRzW2JdLmNwdTsKKwlpbnQgbCwgciwgbGFyZ2VzdDsKIAotCXN3YXAoY3AtPmVsZW1lbnRzW2FdLmNwdSwgY3AtPmVsZW1lbnRzW2JdLmNwdSk7Ci0Jc3dhcChjcC0+ZWxlbWVudHNbYV0uZGwgLCBjcC0+ZWxlbWVudHNbYl0uZGwgKTsKKwlpbnQgb3JpZ19jcHUgPSBjcC0+ZWxlbWVudHNbaWR4XS5jcHU7CisJdTY0IG9yaWdfZGwgPSBjcC0+ZWxlbWVudHNbaWR4XS5kbDsKIAotCXN3YXAoY3AtPmVsZW1lbnRzW2NwdV9hXS5pZHgsIGNwLT5lbGVtZW50c1tjcHVfYl0uaWR4KTsKKwlpZiAobGVmdF9jaGlsZChpZHgpID49IGNwLT5zaXplKQorCQlyZXR1cm47CisKKwkvKiBhZGFwdGVkIGZyb20gbGliL3ByaW9faGVhcC5jICovCisJd2hpbGUoMSkgeworCQl1NjQgbGFyZ2VzdF9kbDsKKwkJbCA9IGxlZnRfY2hpbGQoaWR4KTsKKwkJciA9IHJpZ2h0X2NoaWxkKGlkeCk7CisJCWxhcmdlc3QgPSBpZHg7CisJCWxhcmdlc3RfZGwgPSBvcmlnX2RsOworCisJCWlmICgobCA8IGNwLT5zaXplKSAmJiBkbF90aW1lX2JlZm9yZShvcmlnX2RsLAorCQkJCQkJY3AtPmVsZW1lbnRzW2xdLmRsKSkgeworCQkJbGFyZ2VzdCA9IGw7CisJCQlsYXJnZXN0X2RsID0gY3AtPmVsZW1lbnRzW2xdLmRsOworCQl9CisJCWlmICgociA8IGNwLT5zaXplKSAmJiBkbF90aW1lX2JlZm9yZShsYXJnZXN0X2RsLAorCQkJCQkJY3AtPmVsZW1lbnRzW3JdLmRsKSkKKwkJCWxhcmdlc3QgPSByOworCisJCWlmIChsYXJnZXN0ID09IGlkeCkKKwkJCWJyZWFrOworCisJCS8qIHB1bGwgbGFyZ2VzdCBjaGlsZCBvbnRvIGlkeCAqLworCQljcC0+ZWxlbWVudHNbaWR4XS5jcHUgPSBjcC0+ZWxlbWVudHNbbGFyZ2VzdF0uY3B1OworCQljcC0+ZWxlbWVudHNbaWR4XS5kbCA9IGNwLT5lbGVtZW50c1tsYXJnZXN0XS5kbDsKKwkJY3AtPmVsZW1lbnRzW2NwLT5lbGVtZW50c1tpZHhdLmNwdV0uaWR4ID0gaWR4OworCQlpZHggPSBsYXJnZXN0OworCX0KKwkvKiBhY3R1YWwgcHVzaCBkb3duIG9mIHNhdmVkIG9yaWdpbmFsIHZhbHVlcyBvcmlnXyogKi8KKwljcC0+ZWxlbWVudHNbaWR4XS5jcHUgPSBvcmlnX2NwdTsKKwljcC0+ZWxlbWVudHNbaWR4XS5kbCA9IG9yaWdfZGw7CisJY3AtPmVsZW1lbnRzW2NwLT5lbGVtZW50c1tpZHhdLmNwdV0uaWR4ID0gaWR4OworfQorCitzdGF0aWMgdm9pZCBjcHVkbF9oZWFwaWZ5X3VwKHN0cnVjdCBjcHVkbCAqY3AsIGludCBpZHgpCit7CisJaW50IHA7CisKKwlpbnQgb3JpZ19jcHUgPSBjcC0+ZWxlbWVudHNbaWR4XS5jcHU7CisJdTY0IG9yaWdfZGwgPSBjcC0+ZWxlbWVudHNbaWR4XS5kbDsKKworCWlmIChpZHggPT0gMCkKKwkJcmV0dXJuOworCisJZG8geworCQlwID0gcGFyZW50KGlkeCk7CisJCWlmIChkbF90aW1lX2JlZm9yZShvcmlnX2RsLCBjcC0+ZWxlbWVudHNbcF0uZGwpKQorCQkJYnJlYWs7CisJCS8qIHB1bGwgcGFyZW50IG9udG8gaWR4ICovCisJCWNwLT5lbGVtZW50c1tpZHhdLmNwdSA9IGNwLT5lbGVtZW50c1twXS5jcHU7CisJCWNwLT5lbGVtZW50c1tpZHhdLmRsID0gY3AtPmVsZW1lbnRzW3BdLmRsOworCQljcC0+ZWxlbWVudHNbY3AtPmVsZW1lbnRzW2lkeF0uY3B1XS5pZHggPSBpZHg7CisJCWlkeCA9IHA7CisJfSB3aGlsZSAoaWR4ICE9IDApOworCS8qIGFjdHVhbCBwdXNoIHVwIG9mIHNhdmVkIG9yaWdpbmFsIHZhbHVlcyBvcmlnXyogKi8KKwljcC0+ZWxlbWVudHNbaWR4XS5jcHUgPSBvcmlnX2NwdTsKKwljcC0+ZWxlbWVudHNbaWR4XS5kbCA9IG9yaWdfZGw7CisJY3AtPmVsZW1lbnRzW2NwLT5lbGVtZW50c1tpZHhdLmNwdV0uaWR4ID0gaWR4OwogfQogCiBzdGF0aWMgdm9pZCBjcHVkbF9oZWFwaWZ5KHN0cnVjdCBjcHVkbCAqY3AsIGludCBpZHgpCiB7Ci0JaW50IGwsIHIsIGxhcmdlc3Q7Ci0KLQkvKiBhZGFwdGVkIGZyb20gbGliL3ByaW9faGVhcC5jICovCi0Jd2hpbGUoMSkgewotCQlsID0gbGVmdF9jaGlsZChpZHgpOwotCQlyID0gcmlnaHRfY2hpbGQoaWR4KTsKLQkJbGFyZ2VzdCA9IGlkeDsKLQotCQlpZiAoKGwgPCBjcC0+c2l6ZSkgJiYgZGxfdGltZV9iZWZvcmUoY3AtPmVsZW1lbnRzW2lkeF0uZGwsCi0JCQkJCQkJY3AtPmVsZW1lbnRzW2xdLmRsKSkKLQkJCWxhcmdlc3QgPSBsOwotCQlpZiAoKHIgPCBjcC0+c2l6ZSkgJiYgZGxfdGltZV9iZWZvcmUoY3AtPmVsZW1lbnRzW2xhcmdlc3RdLmRsLAotCQkJCQkJCWNwLT5lbGVtZW50c1tyXS5kbCkpCi0JCQlsYXJnZXN0ID0gcjsKLQkJaWYgKGxhcmdlc3QgPT0gaWR4KQotCQkJYnJlYWs7Ci0KLQkJLyogUHVzaCBpZHggZG93biB0aGUgaGVhcCBvbmUgbGV2ZWwgYW5kIGJ1bXAgb25lIHVwICovCi0JCWNwdWRsX2V4Y2hhbmdlKGNwLCBsYXJnZXN0LCBpZHgpOwotCQlpZHggPSBsYXJnZXN0OwotCX0KLX0KLQotc3RhdGljIHZvaWQgY3B1ZGxfY2hhbmdlX2tleShzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgaWR4LCB1NjQgbmV3X2RsKQotewotCVdBUk5fT04oaWR4ID09IElEWF9JTlZBTElEIHx8ICFjcHVfcHJlc2VudChpZHgpKTsKLQotCWlmIChkbF90aW1lX2JlZm9yZShuZXdfZGwsIGNwLT5lbGVtZW50c1tpZHhdLmRsKSkgewotCQljcC0+ZWxlbWVudHNbaWR4XS5kbCA9IG5ld19kbDsKLQkJY3B1ZGxfaGVhcGlmeShjcCwgaWR4KTsKLQl9IGVsc2UgewotCQljcC0+ZWxlbWVudHNbaWR4XS5kbCA9IG5ld19kbDsKLQkJd2hpbGUgKGlkeCA+IDAgJiYgZGxfdGltZV9iZWZvcmUoY3AtPmVsZW1lbnRzW3BhcmVudChpZHgpXS5kbCwKLQkJCQkJY3AtPmVsZW1lbnRzW2lkeF0uZGwpKSB7Ci0JCQljcHVkbF9leGNoYW5nZShjcCwgaWR4LCBwYXJlbnQoaWR4KSk7Ci0JCQlpZHggPSBwYXJlbnQoaWR4KTsKLQkJfQotCX0KKwlpZiAoaWR4ID4gMCAmJiBkbF90aW1lX2JlZm9yZShjcC0+ZWxlbWVudHNbcGFyZW50KGlkeCldLmRsLAorCQkJCWNwLT5lbGVtZW50c1tpZHhdLmRsKSkKKwkJY3B1ZGxfaGVhcGlmeV91cChjcCwgaWR4KTsKKwllbHNlCisJCWNwdWRsX2hlYXBpZnlfZG93bihjcCwgaWR4KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY3B1ZGxfbWF4aW11bShzdHJ1Y3QgY3B1ZGwgKmNwKQpAQCAtMTIwLDYgKzE0NSw0NSBAQAogfQogCiAvKgorICogY3B1ZGxfY2xlYXIgLSByZW1vdmUgYSBjcHUgZnJvbSB0aGUgY3B1ZGwgbWF4LWhlYXAKKyAqIEBjcDogdGhlIGNwdWRsIG1heC1oZWFwIGNvbnRleHQKKyAqIEBjcHU6IHRoZSB0YXJnZXQgY3B1CisgKgorICogTm90ZXM6IGFzc3VtZXMgY3B1X3JxKGNwdSktPmxvY2sgaXMgbG9ja2VkCisgKgorICogUmV0dXJuczogKHZvaWQpCisgKi8KK3ZvaWQgY3B1ZGxfY2xlYXIoc3RydWN0IGNwdWRsICpjcCwgaW50IGNwdSkKK3sKKwlpbnQgb2xkX2lkeCwgbmV3X2NwdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJV0FSTl9PTighY3B1X3ByZXNlbnQoY3B1KSk7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmNwLT5sb2NrLCBmbGFncyk7CisKKwlvbGRfaWR4ID0gY3AtPmVsZW1lbnRzW2NwdV0uaWR4OworCWlmIChvbGRfaWR4ID09IElEWF9JTlZBTElEKSB7CisJCS8qCisJCSAqIE5vdGhpbmcgdG8gcmVtb3ZlIGlmIG9sZF9pZHggd2FzIGludmFsaWQuCisJCSAqIFRoaXMgY291bGQgaGFwcGVuIGlmIGEgcnFfb2ZmbGluZV9kbCBpcworCQkgKiBjYWxsZWQgZm9yIGEgQ1BVIHdpdGhvdXQgLWRsIHRhc2tzIHJ1bm5pbmcuCisJCSAqLworCX0gZWxzZSB7CisJCW5ld19jcHUgPSBjcC0+ZWxlbWVudHNbY3AtPnNpemUgLSAxXS5jcHU7CisJCWNwLT5lbGVtZW50c1tvbGRfaWR4XS5kbCA9IGNwLT5lbGVtZW50c1tjcC0+c2l6ZSAtIDFdLmRsOworCQljcC0+ZWxlbWVudHNbb2xkX2lkeF0uY3B1ID0gbmV3X2NwdTsKKwkJY3AtPnNpemUtLTsKKwkJY3AtPmVsZW1lbnRzW25ld19jcHVdLmlkeCA9IG9sZF9pZHg7CisJCWNwLT5lbGVtZW50c1tjcHVdLmlkeCA9IElEWF9JTlZBTElEOworCQljcHVkbF9oZWFwaWZ5KGNwLCBvbGRfaWR4KTsKKworCQljcHVtYXNrX3NldF9jcHUoY3B1LCBjcC0+ZnJlZV9jcHVzKTsKKwl9CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCiAgKiBjcHVkbF9zZXQgLSB1cGRhdGUgdGhlIGNwdWRsIG1heC1oZWFwCiAgKiBAY3A6IHRoZSBjcHVkbCBtYXgtaGVhcCBjb250ZXh0CiAgKiBAY3B1OiB0aGUgdGFyZ2V0IGNwdQpAQCAtMTI5LDU1ICsxOTMsMjggQEAKICAqCiAgKiBSZXR1cm5zOiAodm9pZCkKICAqLwotdm9pZCBjcHVkbF9zZXQoc3RydWN0IGNwdWRsICpjcCwgaW50IGNwdSwgdTY0IGRsLCBpbnQgaXNfdmFsaWQpCit2b2lkIGNwdWRsX3NldChzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgY3B1LCB1NjQgZGwpCiB7Ci0JaW50IG9sZF9pZHgsIG5ld19jcHU7CisJaW50IG9sZF9pZHg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCVdBUk5fT04oIWNwdV9wcmVzZW50KGNwdSkpOwogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZjcC0+bG9jaywgZmxhZ3MpOworCiAJb2xkX2lkeCA9IGNwLT5lbGVtZW50c1tjcHVdLmlkeDsKLQlpZiAoIWlzX3ZhbGlkKSB7Ci0JCS8qIHJlbW92ZSBpdGVtICovCi0JCWlmIChvbGRfaWR4ID09IElEWF9JTlZBTElEKSB7Ci0JCQkvKgotCQkJICogTm90aGluZyB0byByZW1vdmUgaWYgb2xkX2lkeCB3YXMgaW52YWxpZC4KLQkJCSAqIFRoaXMgY291bGQgaGFwcGVuIGlmIGEgcnFfb2ZmbGluZV9kbCBpcwotCQkJICogY2FsbGVkIGZvciBhIENQVSB3aXRob3V0IC1kbCB0YXNrcyBydW5uaW5nLgotCQkJICovCi0JCQlnb3RvIG91dDsKLQkJfQotCQluZXdfY3B1ID0gY3AtPmVsZW1lbnRzW2NwLT5zaXplIC0gMV0uY3B1OwotCQljcC0+ZWxlbWVudHNbb2xkX2lkeF0uZGwgPSBjcC0+ZWxlbWVudHNbY3AtPnNpemUgLSAxXS5kbDsKLQkJY3AtPmVsZW1lbnRzW29sZF9pZHhdLmNwdSA9IG5ld19jcHU7Ci0JCWNwLT5zaXplLS07Ci0JCWNwLT5lbGVtZW50c1tuZXdfY3B1XS5pZHggPSBvbGRfaWR4OwotCQljcC0+ZWxlbWVudHNbY3B1XS5pZHggPSBJRFhfSU5WQUxJRDsKLQkJd2hpbGUgKG9sZF9pZHggPiAwICYmIGRsX3RpbWVfYmVmb3JlKAotCQkJCWNwLT5lbGVtZW50c1twYXJlbnQob2xkX2lkeCldLmRsLAotCQkJCWNwLT5lbGVtZW50c1tvbGRfaWR4XS5kbCkpIHsKLQkJCWNwdWRsX2V4Y2hhbmdlKGNwLCBvbGRfaWR4LCBwYXJlbnQob2xkX2lkeCkpOwotCQkJb2xkX2lkeCA9IHBhcmVudChvbGRfaWR4KTsKLQkJfQotCQljcHVtYXNrX3NldF9jcHUoY3B1LCBjcC0+ZnJlZV9jcHVzKTsKLSAgICAgICAgICAgICAgICBjcHVkbF9oZWFwaWZ5KGNwLCBvbGRfaWR4KTsKLQotCQlnb3RvIG91dDsKLQl9Ci0KIAlpZiAob2xkX2lkeCA9PSBJRFhfSU5WQUxJRCkgewotCQljcC0+c2l6ZSsrOwotCQljcC0+ZWxlbWVudHNbY3AtPnNpemUgLSAxXS5kbCA9IGRsOwotCQljcC0+ZWxlbWVudHNbY3AtPnNpemUgLSAxXS5jcHUgPSBjcHU7Ci0JCWNwLT5lbGVtZW50c1tjcHVdLmlkeCA9IGNwLT5zaXplIC0gMTsKLQkJY3B1ZGxfY2hhbmdlX2tleShjcCwgY3AtPnNpemUgLSAxLCBkbCk7CisJCWludCBuZXdfaWR4ID0gY3AtPnNpemUrKzsKKwkJY3AtPmVsZW1lbnRzW25ld19pZHhdLmRsID0gZGw7CisJCWNwLT5lbGVtZW50c1tuZXdfaWR4XS5jcHUgPSBjcHU7CisJCWNwLT5lbGVtZW50c1tjcHVdLmlkeCA9IG5ld19pZHg7CisJCWNwdWRsX2hlYXBpZnlfdXAoY3AsIG5ld19pZHgpOwogCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNwLT5mcmVlX2NwdXMpOwogCX0gZWxzZSB7Ci0JCWNwdWRsX2NoYW5nZV9rZXkoY3AsIG9sZF9pZHgsIGRsKTsKKwkJY3AtPmVsZW1lbnRzW29sZF9pZHhdLmRsID0gZGw7CisJCWNwdWRsX2hlYXBpZnkoY3AsIG9sZF9pZHgpOwogCX0KIAotb3V0OgogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcC0+bG9jaywgZmxhZ3MpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvY3B1ZGVhZGxpbmUuaCBiL2tlcm5lbC9zY2hlZC9jcHVkZWFkbGluZS5oCmluZGV4IGZjYmRmODMuLmY3ZGE4YzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9jcHVkZWFkbGluZS5oCisrKyBiL2tlcm5lbC9zY2hlZC9jcHVkZWFkbGluZS5oCkBAIC0yMyw3ICsyMyw4IEBACiAjaWZkZWYgQ09ORklHX1NNUAogaW50IGNwdWRsX2ZpbmQoc3RydWN0IGNwdWRsICpjcCwgc3RydWN0IHRhc2tfc3RydWN0ICpwLAogCSAgICAgICBzdHJ1Y3QgY3B1bWFzayAqbGF0ZXJfbWFzayk7Ci12b2lkIGNwdWRsX3NldChzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgY3B1LCB1NjQgZGwsIGludCBpc192YWxpZCk7Cit2b2lkIGNwdWRsX3NldChzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgY3B1LCB1NjQgZGwpOwordm9pZCBjcHVkbF9jbGVhcihzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgY3B1KTsKIGludCBjcHVkbF9pbml0KHN0cnVjdCBjcHVkbCAqY3ApOwogdm9pZCBjcHVkbF9zZXRfZnJlZWNwdShzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgY3B1KTsKIHZvaWQgY3B1ZGxfY2xlYXJfZnJlZWNwdShzdHJ1Y3QgY3B1ZGwgKmNwLCBpbnQgY3B1KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9jcHVmcmVxLmMgYi9rZXJuZWwvc2NoZWQvY3B1ZnJlcS5jCmluZGV4IDExNDE5NTQuLmRiYzUxNDQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9jcHVmcmVxLmMKKysrIGIva2VybmVsL3NjaGVkL2NwdWZyZXEuYwpAQCAtMzMsNyArMzMsNyBAQAogICovCiB2b2lkIGNwdWZyZXFfYWRkX3VwZGF0ZV91dGlsX2hvb2soaW50IGNwdSwgc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsCiAJCQl2b2lkICgqZnVuYykoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmRhdGEsIHU2NCB0aW1lLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkpCisJCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpKQogewogCWlmIChXQVJOX09OKCFkYXRhIHx8ICFmdW5jKSkKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2NwdWZyZXFfc2NoZWR1dGlsLmMgYi9rZXJuZWwvc2NoZWQvY3B1ZnJlcV9zY2hlZHV0aWwuYwppbmRleCBhODQ2NDFiLi42OWUwNjg5IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvY3B1ZnJlcV9zY2hlZHV0aWwuYworKysgYi9rZXJuZWwvc2NoZWQvY3B1ZnJlcV9zY2hlZHV0aWwuYwpAQCAtMTIsNyArMTIsNiBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KIApAQCAtNDgsMTEgKzQ3LDE0IEBACiAJc3RydWN0IHN1Z292X3BvbGljeSAqc2dfcG9saWN5OwogCiAJdW5zaWduZWQgaW50IGNhY2hlZF9yYXdfZnJlcTsKKwl1bnNpZ25lZCBsb25nIGlvd2FpdF9ib29zdDsKKwl1bnNpZ25lZCBsb25nIGlvd2FpdF9ib29zdF9tYXg7CisJdTY0IGxhc3RfdXBkYXRlOwogCiAJLyogVGhlIGZpZWxkcyBiZWxvdyBhcmUgb25seSBuZWVkZWQgd2hlbiBzaGFyaW5nIGEgcG9saWN5LiAqLwogCXVuc2lnbmVkIGxvbmcgdXRpbDsKIAl1bnNpZ25lZCBsb25nIG1heDsKLQl1NjQgbGFzdF91cGRhdGU7CisJdW5zaWduZWQgaW50IGZsYWdzOwogfTsKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBzdWdvdl9jcHUsIHN1Z292X2NwdSk7CkBAIC0xNDQsMjQgKzE0Niw3NSBAQAogCXJldHVybiBjcHVmcmVxX2RyaXZlcl9yZXNvbHZlX2ZyZXEocG9saWN5LCBmcmVxKTsKIH0KIAorc3RhdGljIHZvaWQgc3Vnb3ZfZ2V0X3V0aWwodW5zaWduZWQgbG9uZyAqdXRpbCwgdW5zaWduZWQgbG9uZyAqbWF4KQoreworCXN0cnVjdCBycSAqcnEgPSB0aGlzX3JxKCk7CisJdW5zaWduZWQgbG9uZyBjZnNfbWF4OworCisJY2ZzX21heCA9IGFyY2hfc2NhbGVfY3B1X2NhcGFjaXR5KE5VTEwsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwkqdXRpbCA9IG1pbihycS0+Y2ZzLmF2Zy51dGlsX2F2ZywgY2ZzX21heCk7CisJKm1heCA9IGNmc19tYXg7Cit9CisKK3N0YXRpYyB2b2lkIHN1Z292X3NldF9pb3dhaXRfYm9vc3Qoc3RydWN0IHN1Z292X2NwdSAqc2dfY3B1LCB1NjQgdGltZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgU0NIRURfQ1BVRlJFUV9JT1dBSVQpIHsKKwkJc2dfY3B1LT5pb3dhaXRfYm9vc3QgPSBzZ19jcHUtPmlvd2FpdF9ib29zdF9tYXg7CisJfSBlbHNlIGlmIChzZ19jcHUtPmlvd2FpdF9ib29zdCkgeworCQlzNjQgZGVsdGFfbnMgPSB0aW1lIC0gc2dfY3B1LT5sYXN0X3VwZGF0ZTsKKworCQkvKiBDbGVhciBpb3dhaXRfYm9vc3QgaWYgdGhlIENQVSBhcHByZWFycyB0byBoYXZlIGJlZW4gaWRsZS4gKi8KKwkJaWYgKGRlbHRhX25zID4gVElDS19OU0VDKQorCQkJc2dfY3B1LT5pb3dhaXRfYm9vc3QgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQgc3Vnb3ZfaW93YWl0X2Jvb3N0KHN0cnVjdCBzdWdvdl9jcHUgKnNnX2NwdSwgdW5zaWduZWQgbG9uZyAqdXRpbCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nICptYXgpCit7CisJdW5zaWduZWQgbG9uZyBib29zdF91dGlsID0gc2dfY3B1LT5pb3dhaXRfYm9vc3Q7CisJdW5zaWduZWQgbG9uZyBib29zdF9tYXggPSBzZ19jcHUtPmlvd2FpdF9ib29zdF9tYXg7CisKKwlpZiAoIWJvb3N0X3V0aWwpCisJCXJldHVybjsKKworCWlmICgqdXRpbCAqIGJvb3N0X21heCA8ICptYXggKiBib29zdF91dGlsKSB7CisJCSp1dGlsID0gYm9vc3RfdXRpbDsKKwkJKm1heCA9IGJvb3N0X21heDsKKwl9CisJc2dfY3B1LT5pb3dhaXRfYm9vc3QgPj49IDE7Cit9CisKIHN0YXRpYyB2b2lkIHN1Z292X3VwZGF0ZV9zaW5nbGUoc3RydWN0IHVwZGF0ZV91dGlsX2RhdGEgKmhvb2ssIHU2NCB0aW1lLAotCQkJCXVuc2lnbmVkIGxvbmcgdXRpbCwgdW5zaWduZWQgbG9uZyBtYXgpCisJCQkJdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBzdWdvdl9jcHUgKnNnX2NwdSA9IGNvbnRhaW5lcl9vZihob29rLCBzdHJ1Y3Qgc3Vnb3ZfY3B1LCB1cGRhdGVfdXRpbCk7CiAJc3RydWN0IHN1Z292X3BvbGljeSAqc2dfcG9saWN5ID0gc2dfY3B1LT5zZ19wb2xpY3k7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBzZ19wb2xpY3ktPnBvbGljeTsKKwl1bnNpZ25lZCBsb25nIHV0aWwsIG1heDsKIAl1bnNpZ25lZCBpbnQgbmV4dF9mOwogCisJc3Vnb3Zfc2V0X2lvd2FpdF9ib29zdChzZ19jcHUsIHRpbWUsIGZsYWdzKTsKKwlzZ19jcHUtPmxhc3RfdXBkYXRlID0gdGltZTsKKwogCWlmICghc3Vnb3Zfc2hvdWxkX3VwZGF0ZV9mcmVxKHNnX3BvbGljeSwgdGltZSkpCiAJCXJldHVybjsKIAotCW5leHRfZiA9IHV0aWwgPT0gVUxPTkdfTUFYID8gcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxIDoKLQkJCWdldF9uZXh0X2ZyZXEoc2dfY3B1LCB1dGlsLCBtYXgpOworCWlmIChmbGFncyAmIFNDSEVEX0NQVUZSRVFfUlRfREwpIHsKKwkJbmV4dF9mID0gcG9saWN5LT5jcHVpbmZvLm1heF9mcmVxOworCX0gZWxzZSB7CisJCXN1Z292X2dldF91dGlsKCZ1dGlsLCAmbWF4KTsKKwkJc3Vnb3ZfaW93YWl0X2Jvb3N0KHNnX2NwdSwgJnV0aWwsICZtYXgpOworCQluZXh0X2YgPSBnZXRfbmV4dF9mcmVxKHNnX2NwdSwgdXRpbCwgbWF4KTsKKwl9CiAJc3Vnb3ZfdXBkYXRlX2NvbW1pdChzZ19wb2xpY3ksIHRpbWUsIG5leHRfZik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3Vnb3ZfbmV4dF9mcmVxX3NoYXJlZChzdHJ1Y3Qgc3Vnb3ZfY3B1ICpzZ19jcHUsCi0JCQkJCSAgIHVuc2lnbmVkIGxvbmcgdXRpbCwgdW5zaWduZWQgbG9uZyBtYXgpCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgdXRpbCwgdW5zaWduZWQgbG9uZyBtYXgsCisJCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc3Vnb3ZfcG9saWN5ICpzZ19wb2xpY3kgPSBzZ19jcHUtPnNnX3BvbGljeTsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9IHNnX3BvbGljeS0+cG9saWN5OwpAQCAtMTY5LDkgKzIyMiwxMSBAQAogCXU2NCBsYXN0X2ZyZXFfdXBkYXRlX3RpbWUgPSBzZ19wb2xpY3ktPmxhc3RfZnJlcV91cGRhdGVfdGltZTsKIAl1bnNpZ25lZCBpbnQgajsKIAotCWlmICh1dGlsID09IFVMT05HX01BWCkKKwlpZiAoZmxhZ3MgJiBTQ0hFRF9DUFVGUkVRX1JUX0RMKQogCQlyZXR1cm4gbWF4X2Y7CiAKKwlzdWdvdl9pb3dhaXRfYm9vc3Qoc2dfY3B1LCAmdXRpbCwgJm1heCk7CisKIAlmb3JfZWFjaF9jcHUoaiwgcG9saWN5LT5jcHVzKSB7CiAJCXN0cnVjdCBzdWdvdl9jcHUgKmpfc2dfY3B1OwogCQl1bnNpZ25lZCBsb25nIGpfdXRpbCwgal9tYXg7CkBAIC0xODYsNDEgKzI0MSw1MCBAQAogCQkgKiBmcmVxdWVuY3kgdXBkYXRlIGFuZCB0aGUgdGltZSBlbGFwc2VkIGJldHdlZW4gdGhlIGxhc3QgdXBkYXRlCiAJCSAqIG9mIHRoZSBDUFUgdXRpbGl6YXRpb24gYW5kIHRoZSBsYXN0IGZyZXF1ZW5jeSB1cGRhdGUgaXMgbG9uZwogCQkgKiBlbm91Z2gsIGRvbid0IHRha2UgdGhlIENQVSBpbnRvIGFjY291bnQgYXMgaXQgcHJvYmFibHkgaXMKLQkJICogaWRsZSBub3cuCisJCSAqIGlkbGUgbm93IChhbmQgY2xlYXIgaW93YWl0X2Jvb3N0IGZvciBpdCkuCiAJCSAqLwogCQlkZWx0YV9ucyA9IGxhc3RfZnJlcV91cGRhdGVfdGltZSAtIGpfc2dfY3B1LT5sYXN0X3VwZGF0ZTsKLQkJaWYgKGRlbHRhX25zID4gVElDS19OU0VDKQorCQlpZiAoZGVsdGFfbnMgPiBUSUNLX05TRUMpIHsKKwkJCWpfc2dfY3B1LT5pb3dhaXRfYm9vc3QgPSAwOwogCQkJY29udGludWU7Ci0KLQkJal91dGlsID0gal9zZ19jcHUtPnV0aWw7Ci0JCWlmIChqX3V0aWwgPT0gVUxPTkdfTUFYKQorCQl9CisJCWlmIChqX3NnX2NwdS0+ZmxhZ3MgJiBTQ0hFRF9DUFVGUkVRX1JUX0RMKQogCQkJcmV0dXJuIG1heF9mOwogCisJCWpfdXRpbCA9IGpfc2dfY3B1LT51dGlsOwogCQlqX21heCA9IGpfc2dfY3B1LT5tYXg7CiAJCWlmIChqX3V0aWwgKiBtYXggPiBqX21heCAqIHV0aWwpIHsKIAkJCXV0aWwgPSBqX3V0aWw7CiAJCQltYXggPSBqX21heDsKIAkJfQorCisJCXN1Z292X2lvd2FpdF9ib29zdChqX3NnX2NwdSwgJnV0aWwsICZtYXgpOwogCX0KIAogCXJldHVybiBnZXRfbmV4dF9mcmVxKHNnX2NwdSwgdXRpbCwgbWF4KTsKIH0KIAogc3RhdGljIHZvaWQgc3Vnb3ZfdXBkYXRlX3NoYXJlZChzdHJ1Y3QgdXBkYXRlX3V0aWxfZGF0YSAqaG9vaywgdTY0IHRpbWUsCi0JCQkJdW5zaWduZWQgbG9uZyB1dGlsLCB1bnNpZ25lZCBsb25nIG1heCkKKwkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHN1Z292X2NwdSAqc2dfY3B1ID0gY29udGFpbmVyX29mKGhvb2ssIHN0cnVjdCBzdWdvdl9jcHUsIHVwZGF0ZV91dGlsKTsKIAlzdHJ1Y3Qgc3Vnb3ZfcG9saWN5ICpzZ19wb2xpY3kgPSBzZ19jcHUtPnNnX3BvbGljeTsKKwl1bnNpZ25lZCBsb25nIHV0aWwsIG1heDsKIAl1bnNpZ25lZCBpbnQgbmV4dF9mOwogCisJc3Vnb3ZfZ2V0X3V0aWwoJnV0aWwsICZtYXgpOworCiAJcmF3X3NwaW5fbG9jaygmc2dfcG9saWN5LT51cGRhdGVfbG9jayk7CiAKIAlzZ19jcHUtPnV0aWwgPSB1dGlsOwogCXNnX2NwdS0+bWF4ID0gbWF4OworCXNnX2NwdS0+ZmxhZ3MgPSBmbGFnczsKKworCXN1Z292X3NldF9pb3dhaXRfYm9vc3Qoc2dfY3B1LCB0aW1lLCBmbGFncyk7CiAJc2dfY3B1LT5sYXN0X3VwZGF0ZSA9IHRpbWU7CiAKIAlpZiAoc3Vnb3Zfc2hvdWxkX3VwZGF0ZV9mcmVxKHNnX3BvbGljeSwgdGltZSkpIHsKLQkJbmV4dF9mID0gc3Vnb3ZfbmV4dF9mcmVxX3NoYXJlZChzZ19jcHUsIHV0aWwsIG1heCk7CisJCW5leHRfZiA9IHN1Z292X25leHRfZnJlcV9zaGFyZWQoc2dfY3B1LCB1dGlsLCBtYXgsIGZsYWdzKTsKIAkJc3Vnb3ZfdXBkYXRlX2NvbW1pdChzZ19wb2xpY3ksIHRpbWUsIG5leHRfZik7CiAJfQogCkBAIC00NDQsMTAgKzUwOCwxMyBAQAogCiAJCXNnX2NwdS0+c2dfcG9saWN5ID0gc2dfcG9saWN5OwogCQlpZiAocG9saWN5X2lzX3NoYXJlZChwb2xpY3kpKSB7Ci0JCQlzZ19jcHUtPnV0aWwgPSBVTE9OR19NQVg7CisJCQlzZ19jcHUtPnV0aWwgPSAwOwogCQkJc2dfY3B1LT5tYXggPSAwOworCQkJc2dfY3B1LT5mbGFncyA9IFNDSEVEX0NQVUZSRVFfUlQ7CiAJCQlzZ19jcHUtPmxhc3RfdXBkYXRlID0gMDsKIAkJCXNnX2NwdS0+Y2FjaGVkX3Jhd19mcmVxID0gMDsKKwkJCXNnX2NwdS0+aW93YWl0X2Jvb3N0ID0gMDsKKwkJCXNnX2NwdS0+aW93YWl0X2Jvb3N0X21heCA9IHBvbGljeS0+Y3B1aW5mby5tYXhfZnJlcTsKIAkJCWNwdWZyZXFfYWRkX3VwZGF0ZV91dGlsX2hvb2soY3B1LCAmc2dfY3B1LT51cGRhdGVfdXRpbCwKIAkJCQkJCSAgICAgc3Vnb3ZfdXBkYXRlX3NoYXJlZCk7CiAJCX0gZWxzZSB7CkBAIC00OTUsMjggKzU2MiwxNSBAQAogCS5saW1pdHMgPSBzdWdvdl9saW1pdHMsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBzdWdvdl9tb2R1bGVfaW5pdCh2b2lkKQotewotCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2dvdmVybm9yKCZzY2hlZHV0aWxfZ292KTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHN1Z292X21vZHVsZV9leGl0KHZvaWQpCi17Ci0JY3B1ZnJlcV91bnJlZ2lzdGVyX2dvdmVybm9yKCZzY2hlZHV0aWxfZ292KTsKLX0KLQotTU9EVUxFX0FVVEhPUigiUmFmYWVsIEouIFd5c29ja2kgPHJhZmFlbC5qLnd5c29ja2lAaW50ZWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJVdGlsaXphdGlvbi1iYXNlZCBDUFUgZnJlcXVlbmN5IHNlbGVjdGlvbiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1NDSEVEVVRJTAogc3RydWN0IGNwdWZyZXFfZ292ZXJub3IgKmNwdWZyZXFfZGVmYXVsdF9nb3Zlcm5vcih2b2lkKQogewogCXJldHVybiAmc2NoZWR1dGlsX2dvdjsKIH0KLQotZnNfaW5pdGNhbGwoc3Vnb3ZfbW9kdWxlX2luaXQpOwotI2Vsc2UKLW1vZHVsZV9pbml0KHN1Z292X21vZHVsZV9pbml0KTsKICNlbmRpZgotbW9kdWxlX2V4aXQoc3Vnb3ZfbW9kdWxlX2V4aXQpOworCitzdGF0aWMgaW50IF9faW5pdCBzdWdvdl9yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiBjcHVmcmVxX3JlZ2lzdGVyX2dvdmVybm9yKCZzY2hlZHV0aWxfZ292KTsKK30KK2ZzX2luaXRjYWxsKHN1Z292X3JlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9jcHV0aW1lLmMgYi9rZXJuZWwvc2NoZWQvY3B1dGltZS5jCmluZGV4IGE4NDZjZjguLjVlYmVlMzEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9jcHV0aW1lLmMKKysrIGIva2VybmVsL3NjaGVkL2NwdXRpbWUuYwpAQCAtMjMsMTAgKzIzLDggQEAKICAqIHRhc2sgd2hlbiBpcnEgaXMgaW4gcHJvZ3Jlc3Mgd2hpbGUgd2UgcmVhZCBycS0+Y2xvY2suIFRoYXQgaXMgYSB3b3J0aHkKICAqIGNvbXByb21pc2UgaW4gcGxhY2Ugb2YgaGF2aW5nIGxvY2tzIG9uIGVhY2ggaXJxIGluIGFjY291bnRfc3lzdGVtX3RpbWUuCiAgKi8KLURFRklORV9QRVJfQ1BVKHU2NCwgY3B1X2hhcmRpcnFfdGltZSk7Ci1ERUZJTkVfUEVSX0NQVSh1NjQsIGNwdV9zb2Z0aXJxX3RpbWUpOworREVGSU5FX1BFUl9DUFUoc3RydWN0IGlycXRpbWUsIGNwdV9pcnF0aW1lKTsKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCwgaXJxX3N0YXJ0X3RpbWUpOwogc3RhdGljIGludCBzY2hlZF9jbG9ja19pcnF0aW1lOwogCiB2b2lkIGVuYWJsZV9zY2hlZF9jbG9ja19pcnF0aW1lKHZvaWQpCkBAIC0zOSwxNiArMzcsMTMgQEAKIAlzY2hlZF9jbG9ja19pcnF0aW1lID0gMDsKIH0KIAotI2lmbmRlZiBDT05GSUdfNjRCSVQKLURFRklORV9QRVJfQ1BVKHNlcWNvdW50X3QsIGlycV90aW1lX3NlcSk7Ci0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCi0KIC8qCiAgKiBDYWxsZWQgYmVmb3JlIGluY3JlbWVudGluZyBwcmVlbXB0X2NvdW50IG9uIHtzb2Z0LH1pcnFfZW50ZXIKICAqIGFuZCBiZWZvcmUgZGVjcmVtZW50aW5nIHByZWVtcHRfY291bnQgb24ge3NvZnQsfWlycV9leGl0LgogICovCiB2b2lkIGlycXRpbWVfYWNjb3VudF9pcnEoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKQogeworCXN0cnVjdCBpcnF0aW1lICppcnF0aW1lID0gdGhpc19jcHVfcHRyKCZjcHVfaXJxdGltZSk7CiAJczY0IGRlbHRhOwogCWludCBjcHU7CiAKQEAgLTU2LDEwICs1MSwxMCBAQAogCQlyZXR1cm47CiAKIAljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JZGVsdGEgPSBzY2hlZF9jbG9ja19jcHUoY3B1KSAtIF9fdGhpc19jcHVfcmVhZChpcnFfc3RhcnRfdGltZSk7Ci0JX190aGlzX2NwdV9hZGQoaXJxX3N0YXJ0X3RpbWUsIGRlbHRhKTsKKwlkZWx0YSA9IHNjaGVkX2Nsb2NrX2NwdShjcHUpIC0gaXJxdGltZS0+aXJxX3N0YXJ0X3RpbWU7CisJaXJxdGltZS0+aXJxX3N0YXJ0X3RpbWUgKz0gZGVsdGE7CiAKLQlpcnFfdGltZV93cml0ZV9iZWdpbigpOworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmlycXRpbWUtPnN5bmMpOwogCS8qCiAJICogV2UgZG8gbm90IGFjY291bnQgZm9yIHNvZnRpcnEgdGltZSBmcm9tIGtzb2Z0aXJxZCBoZXJlLgogCSAqIFdlIHdhbnQgdG8gY29udGludWUgYWNjb3VudGluZyBzb2Z0aXJxIHRpbWUgdG8ga3NvZnRpcnFkIHRocmVhZApAQCAtNjcsNDIgKzYyLDM2IEBACiAJICogdGhhdCBkbyBub3QgY29uc3VtZSBhbnkgdGltZSwgYnV0IHN0aWxsIHdhbnRzIHRvIHJ1bi4KIAkgKi8KIAlpZiAoaGFyZGlycV9jb3VudCgpKQotCQlfX3RoaXNfY3B1X2FkZChjcHVfaGFyZGlycV90aW1lLCBkZWx0YSk7CisJCWlycXRpbWUtPmhhcmRpcnFfdGltZSArPSBkZWx0YTsKIAllbHNlIGlmIChpbl9zZXJ2aW5nX3NvZnRpcnEoKSAmJiBjdXJyICE9IHRoaXNfY3B1X2tzb2Z0aXJxZCgpKQotCQlfX3RoaXNfY3B1X2FkZChjcHVfc29mdGlycV90aW1lLCBkZWx0YSk7CisJCWlycXRpbWUtPnNvZnRpcnFfdGltZSArPSBkZWx0YTsKIAotCWlycV90aW1lX3dyaXRlX2VuZCgpOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZpcnF0aW1lLT5zeW5jKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlycXRpbWVfYWNjb3VudF9pcnEpOwogCi1zdGF0aWMgY3B1dGltZV90IGlycXRpbWVfYWNjb3VudF9oaV91cGRhdGUoY3B1dGltZV90IG1heHRpbWUpCitzdGF0aWMgY3B1dGltZV90IGlycXRpbWVfYWNjb3VudF91cGRhdGUodTY0IGlycXRpbWUsIGludCBpZHgsIGNwdXRpbWVfdCBtYXh0aW1lKQogewogCXU2NCAqY3B1c3RhdCA9IGtjcHVzdGF0X3RoaXNfY3B1LT5jcHVzdGF0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJY3B1dGltZV90IGlycV9jcHV0aW1lOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlycV9jcHV0aW1lID0gbnNlY3NfdG9fY3B1dGltZTY0KHRoaXNfY3B1X3JlYWQoY3B1X2hhcmRpcnFfdGltZSkpIC0KLQkJICAgICAgY3B1c3RhdFtDUFVUSU1FX0lSUV07CisJaXJxX2NwdXRpbWUgPSBuc2Vjc190b19jcHV0aW1lNjQoaXJxdGltZSkgLSBjcHVzdGF0W2lkeF07CiAJaXJxX2NwdXRpbWUgPSBtaW4oaXJxX2NwdXRpbWUsIG1heHRpbWUpOwotCWNwdXN0YXRbQ1BVVElNRV9JUlFdICs9IGlycV9jcHV0aW1lOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwljcHVzdGF0W2lkeF0gKz0gaXJxX2NwdXRpbWU7CisKIAlyZXR1cm4gaXJxX2NwdXRpbWU7CiB9CiAKK3N0YXRpYyBjcHV0aW1lX3QgaXJxdGltZV9hY2NvdW50X2hpX3VwZGF0ZShjcHV0aW1lX3QgbWF4dGltZSkKK3sKKwlyZXR1cm4gaXJxdGltZV9hY2NvdW50X3VwZGF0ZShfX3RoaXNfY3B1X3JlYWQoY3B1X2lycXRpbWUuaGFyZGlycV90aW1lKSwKKwkJCQkgICAgICBDUFVUSU1FX0lSUSwgbWF4dGltZSk7Cit9CisKIHN0YXRpYyBjcHV0aW1lX3QgaXJxdGltZV9hY2NvdW50X3NpX3VwZGF0ZShjcHV0aW1lX3QgbWF4dGltZSkKIHsKLQl1NjQgKmNwdXN0YXQgPSBrY3B1c3RhdF90aGlzX2NwdS0+Y3B1c3RhdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWNwdXRpbWVfdCBzb2Z0aXJxX2NwdXRpbWU7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jc29mdGlycV9jcHV0aW1lID0gbnNlY3NfdG9fY3B1dGltZTY0KHRoaXNfY3B1X3JlYWQoY3B1X3NvZnRpcnFfdGltZSkpIC0KLQkJCSAgY3B1c3RhdFtDUFVUSU1FX1NPRlRJUlFdOwotCXNvZnRpcnFfY3B1dGltZSA9IG1pbihzb2Z0aXJxX2NwdXRpbWUsIG1heHRpbWUpOwotCWNwdXN0YXRbQ1BVVElNRV9TT0ZUSVJRXSArPSBzb2Z0aXJxX2NwdXRpbWU7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiBzb2Z0aXJxX2NwdXRpbWU7CisJcmV0dXJuIGlycXRpbWVfYWNjb3VudF91cGRhdGUoX190aGlzX2NwdV9yZWFkKGNwdV9pcnF0aW1lLnNvZnRpcnFfdGltZSksCisJCQkJICAgICAgQ1BVVElNRV9TT0ZUSVJRLCBtYXh0aW1lKTsKIH0KIAogI2Vsc2UgLyogQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkcgKi8KQEAgLTI5NSw2ICsyODQsOSBAQAogewogCWNwdXRpbWVfdCBhY2NvdW50ZWQ7CiAKKwkvKiBTaGFsbCBiZSBjb252ZXJ0ZWQgdG8gYSBsb2NrZGVwLWVuYWJsZWQgbGlnaHR3ZWlnaHQgY2hlY2sgKi8KKwlXQVJOX09OX09OQ0UoIWlycXNfZGlzYWJsZWQoKSk7CisKIAlhY2NvdW50ZWQgPSBzdGVhbF9hY2NvdW50X3Byb2Nlc3NfdGltZShtYXgpOwogCiAJaWYgKGFjY291bnRlZCA8IG1heCkKQEAgLTMwNiw2ICsyOTgsMjYgQEAKIAlyZXR1cm4gYWNjb3VudGVkOwogfQogCisjaWZkZWYgQ09ORklHXzY0QklUCitzdGF0aWMgaW5saW5lIHU2NCByZWFkX3N1bV9leGVjX3J1bnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0KQoreworCXJldHVybiB0LT5zZS5zdW1fZXhlY19ydW50aW1lOworfQorI2Vsc2UKK3N0YXRpYyB1NjQgcmVhZF9zdW1fZXhlY19ydW50aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKK3sKKwl1NjQgbnM7CisJc3RydWN0IHJxX2ZsYWdzIHJmOworCXN0cnVjdCBycSAqcnE7CisKKwlycSA9IHRhc2tfcnFfbG9jayh0LCAmcmYpOworCW5zID0gdC0+c2Uuc3VtX2V4ZWNfcnVudGltZTsKKwl0YXNrX3JxX3VubG9jayhycSwgdCwgJnJmKTsKKworCXJldHVybiBuczsKK30KKyNlbmRpZgorCiAvKgogICogQWNjdW11bGF0ZSByYXcgY3B1dGltZSB2YWx1ZXMgb2YgZGVhZCB0YXNrcyAoc2lnLT5bdXNddGltZSkgYW5kIGxpdmUKICAqIHRhc2tzIChzdW0gb24gZ3JvdXAgaXRlcmF0aW9uKSBiZWxvbmdpbmcgdG8gQHRzaydzIGdyb3VwLgpAQCAtMzE4LDYgKzMzMCwxNyBAQAogCXVuc2lnbmVkIGludCBzZXEsIG5leHRzZXE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCS8qCisJICogVXBkYXRlIGN1cnJlbnQgdGFzayBydW50aW1lIHRvIGFjY291bnQgcGVuZGluZyB0aW1lIHNpbmNlIGxhc3QKKwkgKiBzY2hlZHVsZXIgYWN0aW9uIG9yIHRocmVhZF9ncm91cF9jcHV0aW1lKCkgY2FsbC4gVGhpcyB0aHJlYWQgZ3JvdXAKKwkgKiBtaWdodCBoYXZlIG90aGVyIHJ1bm5pbmcgdGFza3Mgb24gZGlmZmVyZW50IENQVXMsIGJ1dCB1cGRhdGluZworCSAqIHRoZWlyIHJ1bnRpbWUgY2FuIGFmZmVjdCBzeXNjYWxsIHBlcmZvcm1hbmNlLCBzbyB3ZSBza2lwIGFjY291bnQKKwkgKiB0aG9zZSBwZW5kaW5nIHRpbWVzIGFuZCByZWx5IG9ubHkgb24gdmFsdWVzIHVwZGF0ZWQgb24gdGljayBvcgorCSAqIG90aGVyIHNjaGVkdWxlciBhY3Rpb24uCisJICovCisJaWYgKHNhbWVfdGhyZWFkX2dyb3VwKGN1cnJlbnQsIHRzaykpCisJCSh2b2lkKSB0YXNrX3NjaGVkX3J1bnRpbWUoY3VycmVudCk7CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAJLyogQXR0ZW1wdCBhIGxvY2tsZXNzIHJlYWQgb24gdGhlIGZpcnN0IHJvdW5kLiAqLwogCW5leHRzZXEgPSAwOwpAQCAtMzMyLDcgKzM1NSw3IEBACiAJCQl0YXNrX2NwdXRpbWUodCwgJnV0aW1lLCAmc3RpbWUpOwogCQkJdGltZXMtPnV0aW1lICs9IHV0aW1lOwogCQkJdGltZXMtPnN0aW1lICs9IHN0aW1lOwotCQkJdGltZXMtPnN1bV9leGVjX3J1bnRpbWUgKz0gdGFza19zY2hlZF9ydW50aW1lKHQpOworCQkJdGltZXMtPnN1bV9leGVjX3J1bnRpbWUgKz0gcmVhZF9zdW1fZXhlY19ydW50aW1lKHQpOwogCQl9CiAJCS8qIElmIGxvY2tsZXNzIGFjY2VzcyBmYWlsZWQsIHRha2UgdGhlIGxvY2suICovCiAJCW5leHRzZXEgPSAxOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2RlYWRsaW5lLmMgYi9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYwppbmRleCAxY2U4ODY3Li4zN2UyNDQ5IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYworKysgYi9rZXJuZWwvc2NoZWQvZGVhZGxpbmUuYwpAQCAtMjQzLDEwICsyNDMsOCBAQAogc3RhdGljIHN0cnVjdCBycSAqZGxfdGFza19vZmZsaW5lX21pZ3JhdGlvbihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJc3RydWN0IHJxICpsYXRlcl9ycSA9IE5VTEw7Ci0JYm9vbCBmYWxsYmFjayA9IGZhbHNlOwogCiAJbGF0ZXJfcnEgPSBmaW5kX2xvY2tfbGF0ZXJfcnEocCwgcnEpOwotCiAJaWYgKCFsYXRlcl9ycSkgewogCQlpbnQgY3B1OwogCkBAIC0yNTQsNyArMjUyLDYgQEAKIAkJICogSWYgd2UgY2Fubm90IHByZWVtcHQgYW55IHJxLCBmYWxsIGJhY2sgdG8gcGljayBhbnkKIAkJICogb25saW5lIGNwdS4KIAkJICovCi0JCWZhbGxiYWNrID0gdHJ1ZTsKIAkJY3B1ID0gY3B1bWFza19hbnlfYW5kKGNwdV9hY3RpdmVfbWFzaywgdHNrX2NwdXNfYWxsb3dlZChwKSk7CiAJCWlmIChjcHUgPj0gbnJfY3B1X2lkcykgewogCQkJLyoKQEAgLTI3NCwxNiArMjcxLDcgQEAKIAkJZG91YmxlX2xvY2tfYmFsYW5jZShycSwgbGF0ZXJfcnEpOwogCX0KIAotCS8qCi0JICogQnkgbm93IHRoZSB0YXNrIGlzIHJlcGxlbmlzaGVkIGFuZCBlbnF1ZXVlZDsgbWlncmF0ZSBpdC4KLQkgKi8KLQlkZWFjdGl2YXRlX3Rhc2socnEsIHAsIDApOwogCXNldF90YXNrX2NwdShwLCBsYXRlcl9ycS0+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+ZW5hYmxlZCB8fCAhc3RvcHBlcjItPmVuYWJsZWQpCiAJCWdvdG8gdW5sb2NrOworCS8qCisJICogRW5zdXJlIHRoYXQgaWYgd2UgcmFjZSB3aXRoIF9fc3RvcF9jcHVzKCkgdGhlIHN0b3BwZXJzIHdvbid0IGdldAorCSAqIHF1ZXVlZCB1cCBpbiByZXZlcnNlIG9yZGVyIGxlYWRpbmcgdG8gc3lzdGVtIGRlYWRsb2NrLgorCSAqCisJICogV2UgY2FuJ3QgbWlzcyBzdG9wX2NwdXNfaW5fcHJvZ3Jlc3MgaWYgcXVldWVfc3RvcF9jcHVzX3dvcmsoKSBoYXMKKwkgKiBxdWV1ZWQgYSB3b3JrIG9uIGNwdTEgYnV0IG5vdCBvbiBjcHUyLCB3ZSBob2xkIGJvdGggbG9ja3MuCisJICoKKwkgKiBJdCBjYW4gYmUgZmFsc2VseSB0cnVlIGJ1dCBpdCBpcyBzYWZlIHRvIHNwaW4gdW50aWwgaXQgaXMgY2xlYXJlZCwKKwkgKiBxdWV1ZV9zdG9wX2NwdXNfd29yaygpIGRvZXMgZXZlcnl0aGluZyB1bmRlciBwcmVlbXB0X2Rpc2FibGUoKS4KKwkgKi8KKwllcnIgPSAtRURFQURMSzsKKwlpZiAodW5saWtlbHkoc3RvcF9jcHVzX2luX3Byb2dyZXNzKSkKKwkJCWdvdG8gdW5sb2NrOwogCiAJZXJyID0gMDsKIAlfX2NwdV9zdG9wX3F1ZXVlX3dvcmsoc3RvcHBlcjEsIHdvcmsxKTsKQEAgLTI0NSw4ICsyNTcsMTIgQEAKIHVubG9jazoKIAlzcGluX3VubG9jaygmc3RvcHBlcjItPmxvY2spOwogCXNwaW5fdW5sb2NrX2lycSgmc3RvcHBlcjEtPmxvY2spOwotCWxnX2RvdWJsZV91bmxvY2soJnN0b3BfY3B1c19sb2NrLCBjcHUxLCBjcHUyKTsKIAorCWlmICh1bmxpa2VseShlcnIgPT0gLUVERUFETEspKSB7CisJCXdoaWxlIChzdG9wX2NwdXNfaW5fcHJvZ3Jlc3MpCisJCQljcHVfcmVsYXgoKTsKKwkJZ290byByZXRyeTsKKwl9CiAJcmV0dXJuIGVycjsKIH0KIC8qKgpAQCAtMzE2LDkgKzMzMiw2IEBACiAJcmV0dXJuIGNwdV9zdG9wX3F1ZXVlX3dvcmsoY3B1LCB3b3JrX2J1Zik7CiB9CiAKLS8qIHN0YXRpYyBkYXRhIGZvciBzdG9wX2NwdXMgKi8KLXN0YXRpYyBERUZJTkVfTVVURVgoc3RvcF9jcHVzX211dGV4KTsKLQogc3RhdGljIGJvb2wgcXVldWVfc3RvcF9jcHVzX3dvcmsoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssCiAJCQkJIGNwdV9zdG9wX2ZuX3QgZm4sIHZvaWQgKmFyZywKIAkJCQkgc3RydWN0IGNwdV9zdG9wX2RvbmUgKmRvbmUpCkBAIC0zMzIsNyArMzQ1LDggQEAKIAkgKiBwcmVlbXB0ZWQgYnkgYSBzdG9wcGVyIHdoaWNoIG1pZ2h0IHdhaXQgZm9yIG90aGVyIHN0b3BwZXJzCiAJICogdG8gZW50ZXIgQGZuIHdoaWNoIGNhbiBsZWFkIHRvIGRlYWRsb2NrLgogCSAqLwotCWxnX2dsb2JhbF9sb2NrKCZzdG9wX2NwdXNfbG9jayk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJc3RvcF9jcHVzX2luX3Byb2dyZXNzID0gdHJ1ZTsKIAlmb3JfZWFjaF9jcHUoY3B1LCBjcHVtYXNrKSB7CiAJCXdvcmsgPSAmcGVyX2NwdShjcHVfc3RvcHBlci5zdG9wX3dvcmssIGNwdSk7CiAJCXdvcmstPmZuID0gZm47CkBAIC0zNDEsNyArMzU1LDggQEAKIAkJaWYgKGNwdV9zdG9wX3F1ZXVlX3dvcmsoY3B1LCB3b3JrKSkKIAkJCXF1ZXVlZCA9IHRydWU7CiAJfQotCWxnX2dsb2JhbF91bmxvY2soJnN0b3BfY3B1c19sb2NrKTsKKwlzdG9wX2NwdXNfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwlwcmVlbXB0X2VuYWJsZSgpOwogCiAJcmV0dXJuIHF1ZXVlZDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGwuYyBiL2tlcm5lbC9zeXNjdGwuYwppbmRleCBhMTNiYmRhLi5hNDM3NzVjIDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzY3RsLmMKKysrIGIva2VybmVsL3N5c2N0bC5jCkBAIC02NSw2ICs2NSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC0xODM4LDYgKzE4MzksMTQgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgsCiAJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJtb3VudC1tYXgiLAorCQkuZGF0YQkJPSAmc3lzY3RsX21vdW50X21heCwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuZXh0cmExCQk9ICZvbmUsCisJfSwKIAl7IH0KIH07CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCmluZGV4IDZhNWEzMTAuLjdlNGZhZDcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwpAQCAtNjAwLDkgKzYwMCwxOCBAQAogCQkgKi8KIAkJaWYgKCEoY3MtPmZsYWdzICYgQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTKSAmJiBvbmVzaG90KSB7CiAJCQkvKiBPdmVycmlkZSBjbG9ja3NvdXJjZSBjYW5ub3QgYmUgdXNlZC4gKi8KLQkJCXByX3dhcm4oIk92ZXJyaWRlIGNsb2Nrc291cmNlICVzIGlzIG5vdCBIUlQgY29tcGF0aWJsZSAtIGNhbm5vdCBzd2l0Y2ggd2hpbGUgaW4gSFJUL05PSFogbW9kZVxuIiwKLQkJCQljcy0+bmFtZSk7Ci0JCQlvdmVycmlkZV9uYW1lWzBdID0gMDsKKwkJCWlmIChjcy0+ZmxhZ3MgJiBDTE9DS19TT1VSQ0VfVU5TVEFCTEUpIHsKKwkJCQlwcl93YXJuKCJPdmVycmlkZSBjbG9ja3NvdXJjZSAlcyBpcyB1bnN0YWJsZSBhbmQgbm90IEhSVCBjb21wYXRpYmxlIC0gY2Fubm90IHN3aXRjaCB3aGlsZSBpbiBIUlQvTk9IWiBtb2RlXG4iLAorCQkJCQljcy0+bmFtZSk7CisJCQkJb3ZlcnJpZGVfbmFtZVswXSA9IDA7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogVGhlIG92ZXJyaWRlIGNhbm5vdCBiZSBjdXJyZW50bHkgdmVyaWZpZWQuCisJCQkJICogRGVmZXJyaW5nIHRvIGxldCB0aGUgd2F0Y2hkb2cgY2hlY2suCisJCQkJICovCisJCQkJcHJfaW5mbygiT3ZlcnJpZGUgY2xvY2tzb3VyY2UgJXMgaXMgbm90IGN1cnJlbnRseSBIUlQgY29tcGF0aWJsZSAtIGRlZmVycmluZ1xuIiwKKwkJCQkJY3MtPm5hbWUpOworCQkJfQogCQl9IGVsc2UKIAkJCS8qIE92ZXJyaWRlIGNsb2Nrc291cmNlIGNhbiBiZSB1c2VkLiAqLwogCQkJYmVzdCA9IGNzOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvaHJ0aW1lci5jIGIva2VybmVsL3RpbWUvaHJ0aW1lci5jCmluZGV4IDliYTdjODIuLmJiNWVjNDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2hydGltZXIuYworKysgYi9rZXJuZWwvdGltZS9ocnRpbWVyLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogICovCiBrdGltZV90IGt0aW1lX2FkZF9zYWZlKGNvbnN0IGt0aW1lX3QgbGhzLCBjb25zdCBrdGltZV90IHJocykKIHsKLQlrdGltZV90IHJlcyA9IGt0aW1lX2FkZChsaHMsIHJocyk7CisJa3RpbWVfdCByZXMgPSBrdGltZV9hZGRfdW5zYWZlKGxocywgcmhzKTsKIAogCS8qCiAJICogV2UgdXNlIEtUSU1FX1NFQ19NQVggaGVyZSwgdGhlIG1heGltdW0gdGltZW91dCB3aGljaCB3ZSBjYW4KQEAgLTcwMyw3ICs3MDMsNyBAQAogc3RhdGljIERFQ0xBUkVfV09SSyhocnRpbWVyX3dvcmssIGNsb2NrX3dhc19zZXRfd29yayk7CiAKIC8qCi0gKiBDYWxsZWQgZnJvbSB0aW1la2VlcGluZyBhbmQgcmVzdW1lIGNvZGUgdG8gcmVwcm9ncmFtbSB0aGUgaHJ0aW1lcgorICogQ2FsbGVkIGZyb20gdGltZWtlZXBpbmcgYW5kIHJlc3VtZSBjb2RlIHRvIHJlcHJvZ3JhbSB0aGUgaHJ0aW1lcgogICogaW50ZXJydXB0IGRldmljZSBvbiBhbGwgY3B1cy4KICAqLwogdm9pZCBjbG9ja193YXNfc2V0X2RlbGF5ZWQodm9pZCkKQEAgLTEyNDEsNyArMTI0MSw3IEBACiAKIAkvKgogCSAqIE5vdGU6IFdlIGNsZWFyIHRoZSBydW5uaW5nIHN0YXRlIGFmdGVyIGVucXVldWVfaHJ0aW1lciBhbmQKLQkgKiB3ZSBkbyBub3QgcmVwcm9ncmFtbSB0aGUgZXZlbnQgaGFyZHdhcmUuIEhhcHBlbnMgZWl0aGVyIGluCisJICogd2UgZG8gbm90IHJlcHJvZ3JhbSB0aGUgZXZlbnQgaGFyZHdhcmUuIEhhcHBlbnMgZWl0aGVyIGluCiAJICogaHJ0aW1lcl9zdGFydF9yYW5nZV9ucygpIG9yIGluIGhydGltZXJfaW50ZXJydXB0KCkKIAkgKgogCSAqIE5vdGU6IEJlY2F1c2Ugd2UgZHJvcHBlZCB0aGUgY3B1X2Jhc2UtPmxvY2sgYWJvdmUsCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKaW5kZXggMjA0ZmRjOC4uM2JjYjYxYiAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCisrKyBiL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYwpAQCAtMTg2LDEwICsxODYsMTMgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBib29sIGNhbl9zdG9wX2Z1bGxfdGljayhzdHJ1Y3QgdGlja19zY2hlZCAqdHMpCitzdGF0aWMgYm9vbCBjYW5fc3RvcF9mdWxsX3RpY2soaW50IGNwdSwgc3RydWN0IHRpY2tfc2NoZWQgKnRzKQogewogCVdBUk5fT05fT05DRSghaXJxc19kaXNhYmxlZCgpKTsKIAorCWlmICh1bmxpa2VseSghY3B1X29ubGluZShjcHUpKSkKKwkJcmV0dXJuIGZhbHNlOworCiAJaWYgKGNoZWNrX3RpY2tfZGVwZW5kZW5jeSgmdGlja19kZXBfbWFzaykpCiAJCXJldHVybiBmYWxzZTsKIApAQCAtODQzLDcgKzg0Niw3IEBACiAJaWYgKCF0cy0+dGlja19zdG9wcGVkICYmIHRzLT5ub2h6X21vZGUgPT0gTk9IWl9NT0RFX0lOQUNUSVZFKQogCQlyZXR1cm47CiAKLQlpZiAoY2FuX3N0b3BfZnVsbF90aWNrKHRzKSkKKwlpZiAoY2FuX3N0b3BfZnVsbF90aWNrKGNwdSwgdHMpKQogCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHRzLCBrdGltZV9nZXQoKSwgY3B1KTsKIAllbHNlIGlmICh0cy0+dGlja19zdG9wcGVkKQogCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKHRzLCBrdGltZV9nZXQoKSk7CkBAIC05MDgsMTAgKzkxMSwxMSBAQAogCWt0aW1lX3Qgbm93LCBleHBpcmVzOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKKwlub3cgPSB0aWNrX25vaHpfc3RhcnRfaWRsZSh0cyk7CisKIAlpZiAoY2FuX3N0b3BfaWRsZV90aWNrKGNwdSwgdHMpKSB7CiAJCWludCB3YXNfc3RvcHBlZCA9IHRzLT50aWNrX3N0b3BwZWQ7CiAKLQkJbm93ID0gdGlja19ub2h6X3N0YXJ0X2lkbGUodHMpOwogCQl0cy0+aWRsZV9jYWxscysrOwogCiAJCWV4cGlyZXMgPSB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHRzLCBub3csIGNwdSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lLmMgYi9rZXJuZWwvdGltZS90aW1lLmMKaW5kZXggNjY3YjkzMy4uYmQ2MmZiOCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWUuYwpAQCAtNzgwLDcgKzc4MCw3IEBACiB7CiAJc3RydWN0IHRpbWVzcGVjNjQgcmVzOwogCi0Jc2V0X25vcm1hbGl6ZWRfdGltZXNwZWM2NCgmcmVzLCBsaHMudHZfc2VjICsgcmhzLnR2X3NlYywKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYzY0KCZyZXMsICh0aW1ldTY0X3QpIGxocy50dl9zZWMgKyByaHMudHZfc2VjLAogCQkJbGhzLnR2X25zZWMgKyByaHMudHZfbnNlYyk7CiAKIAlpZiAodW5saWtlbHkocmVzLnR2X3NlYyA8IGxocy50dl9zZWMgfHwgcmVzLnR2X3NlYyA8IHJocy50dl9zZWMpKSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZ19kZWJ1Zy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmdfZGVidWcuYwppbmRleCAxMDczMTBhLi5jYTlmYjgwIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZ19kZWJ1Zy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nX2RlYnVnLmMKQEAgLTc1LDUgKzc1LDcgQEAKIAlpbnQgYmluID0gbWluKGZscyh0LT50dl9zZWMpLCBOVU1fQklOUy0xKTsKIAogCXNsZWVwX3RpbWVfYmluW2Jpbl0rKzsKKwlwcl9pbmZvKCJTdXNwZW5kZWQgZm9yICVsbGQuJTAzbHUgc2Vjb25kc1xuIiwgKHM2NCl0LT50dl9zZWMsCisJCQl0LT50dl9uc2VjIC8gTlNFQ19QRVJfTVNFQyk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90b3J0dXJlLmMgYi9rZXJuZWwvdG9ydHVyZS5jCmluZGV4IDc1OTYxYjMuLjBkODg3ZWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90b3J0dXJlLmMKKysrIGIva2VybmVsL3RvcnR1cmUuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHJhY2VfY2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxsaW51eC90b3J0dXJlLmg+CiAKQEAgLTQ0Niw5ICs0NDcsOCBAQAogICogVmFyaWFibGVzIGZvciBhdXRvLXNodXRkb3duLiAgVGhpcyBhbGxvd3MgImxpZ2h0cyBvdXQiIHRvcnR1cmUgcnVucwogICogdG8gYmUgZnVsbHkgc2NyaXB0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgc2h1dGRvd25fc2VjczsJCS8qIGRlc2lyZWQgdGVzdCBkdXJhdGlvbiBpbiBzZWNvbmRzLiAqLwogc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc2h1dGRvd25fdGFzazsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNodXRkb3duX3RpbWU7CS8qIGppZmZpZXMgdG8gc3lzdGVtIHNodXRkb3duLiAqLworc3RhdGljIGt0aW1lX3Qgc2h1dGRvd25fdGltZTsJCS8qIHRpbWUgdG8gc3lzdGVtIHNodXRkb3duLiAqLwogc3RhdGljIHZvaWQgKCp0b3J0dXJlX3NodXRkb3duX2hvb2spKHZvaWQpOwogCiAvKgpAQCAtNDcxLDIwICs0NzEsMjAgQEAKICAqLwogc3RhdGljIGludCB0b3J0dXJlX3NodXRkb3duKHZvaWQgKmFyZykKIHsKLQlsb25nIGRlbHRhOwotCXVuc2lnbmVkIGxvbmcgamlmZmllc19zbmFwOworCWt0aW1lX3Qga3RpbWVfc25hcDsKIAogCVZFUkJPU0VfVE9ST1VUX1NUUklORygidG9ydHVyZV9zaHV0ZG93biB0YXNrIHN0YXJ0ZWQiKTsKLQlqaWZmaWVzX3NuYXAgPSBqaWZmaWVzOwotCXdoaWxlIChVTE9OR19DTVBfTFQoamlmZmllc19zbmFwLCBzaHV0ZG93bl90aW1lKSAmJgorCWt0aW1lX3NuYXAgPSBrdGltZV9nZXQoKTsKKwl3aGlsZSAoa3RpbWVfYmVmb3JlKGt0aW1lX3NuYXAsIHNodXRkb3duX3RpbWUpICYmCiAJICAgICAgICF0b3J0dXJlX211c3Rfc3RvcCgpKSB7Ci0JCWRlbHRhID0gc2h1dGRvd25fdGltZSAtIGppZmZpZXNfc25hcDsKIAkJaWYgKHZlcmJvc2UpCiAJCQlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRwotCQkJCSAidG9ydHVyZV9zaHV0ZG93biB0YXNrOiAlbHUgamlmZmllcyByZW1haW5pbmdcbiIsCi0JCQkJIHRvcnR1cmVfdHlwZSwgZGVsdGEpOwotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoZGVsdGEpOwotCQlqaWZmaWVzX3NuYXAgPSBqaWZmaWVzOworCQkJCSAidG9ydHVyZV9zaHV0ZG93biB0YXNrOiAlbGx1IG1zIHJlbWFpbmluZ1xuIiwKKwkJCQkgdG9ydHVyZV90eXBlLAorCQkJCSBrdGltZV9tc19kZWx0YShzaHV0ZG93bl90aW1lLCBrdGltZV9zbmFwKSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX2hydGltZW91dCgmc2h1dGRvd25fdGltZSwgSFJUSU1FUl9NT0RFX0FCUyk7CisJCWt0aW1lX3NuYXAgPSBrdGltZV9nZXQoKTsKIAl9CiAJaWYgKHRvcnR1cmVfbXVzdF9zdG9wKCkpIHsKIAkJdG9ydHVyZV9rdGhyZWFkX3N0b3BwaW5nKCJ0b3J0dXJlX3NodXRkb3duIik7CkBAIC01MTEsMTAgKzUxMSw5IEBACiB7CiAJaW50IHJldCA9IDA7CiAKLQlzaHV0ZG93bl9zZWNzID0gc3NlY3M7CiAJdG9ydHVyZV9zaHV0ZG93bl9ob29rID0gY2xlYW51cDsKLQlpZiAoc2h1dGRvd25fc2VjcyA+IDApIHsKLQkJc2h1dGRvd25fdGltZSA9IGppZmZpZXMgKyBzaHV0ZG93bl9zZWNzICogSFo7CisJaWYgKHNzZWNzID4gMCkgeworCQlzaHV0ZG93bl90aW1lID0ga3RpbWVfYWRkKGt0aW1lX2dldCgpLCBrdGltZV9zZXQoc3NlY3MsIDApKTsKIAkJcmV0ID0gdG9ydHVyZV9jcmVhdGVfa3RocmVhZCh0b3J0dXJlX3NodXRkb3duLCBOVUxMLAogCQkJCQkgICAgIHNodXRkb3duX3Rhc2spOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9LY29uZmlnIGIva2VybmVsL3RyYWNlL0tjb25maWcKaW5kZXggZjRiODZlOC4uMmE5NmIwNiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL0tjb25maWcKKysrIGIva2VybmVsL3RyYWNlL0tjb25maWcKQEAgLTI0LDExICsyNCw2IEBACiAJaGVscAogCSAgU2VlIERvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLWRlc2lnbi50eHQKIAotY29uZmlnIEhBVkVfRlVOQ1RJT05fR1JBUEhfRlBfVEVTVAotCWJvb2wKLQloZWxwCi0JICBTZWUgRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UtZGVzaWduLnR4dAotCiBjb25maWcgSEFWRV9EWU5BTUlDX0ZUUkFDRQogCWJvb2wKIAloZWxwCkBAIC0yMjEsNiArMjE2LDQxIEBACiAJICBUaGlzIHRyYWNlciB0cmFja3MgdGhlIGxhdGVuY3kgb2YgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgdGFzawogCSAgdG8gYmUgc2NoZWR1bGVkIGluLCBzdGFydGluZyBmcm9tIHRoZSBwb2ludCBpdCBoYXMgd29rZW4gdXAuCiAKK2NvbmZpZyBIV0xBVF9UUkFDRVIKKwlib29sICJUcmFjZXIgdG8gZGV0ZWN0IGhhcmR3YXJlIGxhdGVuY2llcyAobGlrZSBTTUlzKSIKKwlzZWxlY3QgR0VORVJJQ19UUkFDRVIKKwloZWxwCisJIFRoaXMgdHJhY2VyLCB3aGVuIGVuYWJsZWQgd2lsbCBjcmVhdGUgb25lIG9yIG1vcmUga2VybmVsIHRocmVhZHMsCisJIGRlcGVuaW5nIG9uIHdoYXQgdGhlIGNwdW1hc2sgZmlsZSBpcyBzZXQgdG8sIHdoaWNoIGVhY2ggdGhyZWFkCisJIHNwaW5uaW5nIGluIGEgbG9vcCBsb29raW5nIGZvciBpbnRlcnJ1cHRpb25zIGNhdXNlZCBieQorCSBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUga2VybmVsLiBGb3IgZXhhbXBsZSwgaWYgYQorCSBTeXN0ZW0gTWFuYWdlbWVudCBJbnRlcnJ1cHQgKFNNSSkgdGFrZXMgYSBub3RpY2VhYmxlIGFtb3VudCBvZgorCSB0aW1lLCB0aGlzIHRyYWNlciB3aWxsIGRldGVjdCBpdC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcKKwkgaWYgYSBzeXN0ZW0gaXMgcmVsaWFibGUgZm9yIFJlYWwgVGltZSB0YXNrcy4KKworCSBTb21lIGZpbGVzIGFyZSBjcmVhdGVkIGluIHRoZSB0cmFjaW5nIGRpcmVjdG9yeSB3aGVuIHRoaXMKKwkgaXMgZW5hYmxlZDoKKworCSAgIGh3bGF0X2RldGVjdG9yL3dpZHRoICAgLSB0aW1lIGluIHVzZWNzIGZvciBob3cgbG9uZyB0byBzcGluIGZvcgorCSAgIGh3bGF0X2RldGVjdG9yL3dpbmRvdyAgLSB0aW1lIGluIHVzZWNzIGJldHdlZW4gdGhlIHN0YXJ0IG9mIGVhY2gKKwkJCQkgICAgIGl0ZXJhdGlvbgorCisJIEEga2VybmVsIHRocmVhZCBpcyBjcmVhdGVkIHRoYXQgd2lsbCBzcGluIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorCSBmb3IgIndpZHRoIiBtaWNyb3NlY29uZHMgaW4gZXZlcnkgIndpZG93IiBjeWNsZS4gSXQgd2lsbCBub3Qgc3BpbgorCSBmb3IgIndpbmRvdyAtIHdpZHRoIiBtaWNyb3NlY29uZHMsIHdoZXJlIHRoZSBzeXN0ZW0gY2FuCisJIGNvbnRpbnVlIHRvIG9wZXJhdGUuCisKKwkgVGhlIG91dHB1dCB3aWxsIGFwcGVhciBpbiB0aGUgdHJhY2UgYW5kIHRyYWNlX3BpcGUgZmlsZXMuCisKKwkgV2hlbiB0aGUgdHJhY2VyIGlzIG5vdCBydW5uaW5nLCBpdCBoYXMgbm8gYWZmZWN0IG9uIHRoZSBzeXN0ZW0sCisJIGJ1dCB3aGVuIGl0IGlzIHJ1bm5pbmcsIGl0IGNhbiBjYXVzZSB0aGUgc3lzdGVtIHRvIGJlCisJIHBlcmlvZGljYWxseSBub24gcmVzcG9uc2l2ZS4gRG8gbm90IHJ1biB0aGlzIHRyYWNlciBvbiBhCisJIHByb2R1Y3Rpb24gc3lzdGVtLgorCisJIFRvIGVuYWJsZSB0aGlzIHRyYWNlciwgZWNobyBpbiAiaHdsYXQiIGludG8gdGhlIGN1cnJlbnRfdHJhY2VyCisJIGZpbGUuIEV2ZXJ5IHRpbWUgYSBsYXRlbmN5IGlzIGdyZWF0ZXIgdGhhbiB0cmFjaW5nX3RocmVzaCwgaXQgd2lsbAorCSBiZSByZWNvcmRlZCBpbnRvIHRoZSByaW5nIGJ1ZmZlci4KKwogY29uZmlnIEVOQUJMRV9ERUZBVUxUX1RSQUNFUlMKIAlib29sICJUcmFjZSBwcm9jZXNzIGNvbnRleHQgc3dpdGNoZXMgYW5kIGV2ZW50cyIKIAlkZXBlbmRzIG9uICFHRU5FUklDX1RSQUNFUgpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL01ha2VmaWxlIGIva2VybmVsL3RyYWNlL01ha2VmaWxlCmluZGV4IGQwYTE2MTcuLjk5MmFiOWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9NYWtlZmlsZQorKysgYi9rZXJuZWwvdHJhY2UvTWFrZWZpbGUKQEAgLTQxLDYgKzQxLDcgQEAKIG9iai0kKENPTkZJR19JUlFTT0ZGX1RSQUNFUikgKz0gdHJhY2VfaXJxc29mZi5vCiBvYmotJChDT05GSUdfUFJFRU1QVF9UUkFDRVIpICs9IHRyYWNlX2lycXNvZmYubwogb2JqLSQoQ09ORklHX1NDSEVEX1RSQUNFUikgKz0gdHJhY2Vfc2NoZWRfd2FrZXVwLm8KK29iai0kKENPTkZJR19IV0xBVF9UUkFDRVIpICs9IHRyYWNlX2h3bGF0Lm8KIG9iai0kKENPTkZJR19OT1BfVFJBQ0VSKSArPSB0cmFjZV9ub3Aubwogb2JqLSQoQ09ORklHX1NUQUNLX1RSQUNFUikgKz0gdHJhY2Vfc3RhY2subwogb2JqLSQoQ09ORklHX01NSU9UUkFDRSkgKz0gdHJhY2VfbW1pb3RyYWNlLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9icGZfdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9icGZfdHJhY2UuYwppbmRleCBiMjA0MzhmLi41ZGNiOTkyIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvYnBmX3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2JwZl90cmFjZS5jCkBAIC0xLDQgKzEsNSBAQAogLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTUgUExVTWdyaWQsIGh0dHA6Ly9wbHVtZ3JpZC5jb20KKyAqIENvcHlyaWdodCAoYykgMjAxNiBGYWNlYm9vawogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKQEAgLTgsNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYnBmLmg+CisjaW5jbHVkZSA8bGludXgvYnBmX3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KQEAgLTU5LDExICs2MSw5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0cmFjZV9jYWxsX2JwZik7CiAKLXN0YXRpYyB1NjQgYnBmX3Byb2JlX3JlYWQodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKGJwZl9wcm9iZV9yZWFkLCB2b2lkICosIGRzdCwgdTMyLCBzaXplLCBjb25zdCB2b2lkICosIHVuc2FmZV9wdHIpCiB7Ci0Jdm9pZCAqZHN0ID0gKHZvaWQgKikgKGxvbmcpIHIxOwotCWludCByZXQsIHNpemUgPSAoaW50KSByMjsKLQl2b2lkICp1bnNhZmVfcHRyID0gKHZvaWQgKikgKGxvbmcpIHIzOworCWludCByZXQ7CiAKIAlyZXQgPSBwcm9iZV9rZXJuZWxfcmVhZChkc3QsIHVuc2FmZV9wdHIsIHNpemUpOwogCWlmICh1bmxpa2VseShyZXQgPCAwKSkKQEAgLTgxLDEyICs4MSw5IEBACiAJLmFyZzNfdHlwZQk9IEFSR19BTllUSElORywKIH07CiAKLXN0YXRpYyB1NjQgYnBmX3Byb2JlX3dyaXRlX3VzZXIodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKGJwZl9wcm9iZV93cml0ZV91c2VyLCB2b2lkICosIHVuc2FmZV9wdHIsIGNvbnN0IHZvaWQgKiwgc3JjLAorCSAgIHUzMiwgc2l6ZSkKIHsKLQl2b2lkICp1bnNhZmVfcHRyID0gKHZvaWQgKikgKGxvbmcpIHIxOwotCXZvaWQgKnNyYyA9ICh2b2lkICopIChsb25nKSByMjsKLQlpbnQgc2l6ZSA9IChpbnQpIHIzOwotCiAJLyoKIAkgKiBFbnN1cmUgd2UncmUgaW4gdXNlciBjb250ZXh0IHdoaWNoIGlzIHNhZmUgZm9yIHRoZSBoZWxwZXIgdG8KIAkgKiBydW4uIFRoaXMgaGVscGVyIGhhcyBubyBidXNpbmVzcyBpbiBhIGt0aHJlYWQuCkBAIC0xMjgsOSArMTI1LDkgQEAKICAqIGxpbWl0ZWQgdHJhY2VfcHJpbnRrKCkKICAqIG9ubHkgJWQgJXUgJXggJWxkICVsdSAlbHggJWxsZCAlbGx1ICVsbHggJXAgJXMgY29udmVyc2lvbiBzcGVjaWZpZXJzIGFsbG93ZWQKICAqLwotc3RhdGljIHU2NCBicGZfdHJhY2VfcHJpbnRrKHU2NCByMSwgdTY0IGZtdF9zaXplLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfNShicGZfdHJhY2VfcHJpbnRrLCBjaGFyICosIGZtdCwgdTMyLCBmbXRfc2l6ZSwgdTY0LCBhcmcxLAorCSAgIHU2NCwgYXJnMiwgdTY0LCBhcmczKQogewotCWNoYXIgKmZtdCA9IChjaGFyICopIChsb25nKSByMTsKIAlib29sIHN0cl9zZWVuID0gZmFsc2U7CiAJaW50IG1vZFszXSA9IHt9OwogCWludCBmbXRfY250ID0gMDsKQEAgLTE3NiwxNiArMTczLDE2IEBACiAKIAkJCQlzd2l0Y2ggKGZtdF9jbnQpIHsKIAkJCQljYXNlIDE6Ci0JCQkJCXVuc2FmZV9hZGRyID0gcjM7Ci0JCQkJCXIzID0gKGxvbmcpIGJ1ZjsKKwkJCQkJdW5zYWZlX2FkZHIgPSBhcmcxOworCQkJCQlhcmcxID0gKGxvbmcpIGJ1ZjsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSAyOgotCQkJCQl1bnNhZmVfYWRkciA9IHI0OwotCQkJCQlyNCA9IChsb25nKSBidWY7CisJCQkJCXVuc2FmZV9hZGRyID0gYXJnMjsKKwkJCQkJYXJnMiA9IChsb25nKSBidWY7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgMzoKLQkJCQkJdW5zYWZlX2FkZHIgPSByNTsKLQkJCQkJcjUgPSAobG9uZykgYnVmOworCQkJCQl1bnNhZmVfYWRkciA9IGFyZzM7CisJCQkJCWFyZzMgPSAobG9uZykgYnVmOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJYnVmWzBdID0gMDsKQEAgLTIwNyw5ICsyMDQsOSBAQAogCX0KIAogCXJldHVybiBfX3RyYWNlX3ByaW50aygxLyogZmFrZSBpcCB3aWxsIG5vdCBiZSBwcmludGVkICovLCBmbXQsCi0JCQkgICAgICBtb2RbMF0gPT0gMiA/IHIzIDogbW9kWzBdID09IDEgPyAobG9uZykgcjMgOiAodTMyKSByMywKLQkJCSAgICAgIG1vZFsxXSA9PSAyID8gcjQgOiBtb2RbMV0gPT0gMSA/IChsb25nKSByNCA6ICh1MzIpIHI0LAotCQkJICAgICAgbW9kWzJdID09IDIgPyByNSA6IG1vZFsyXSA9PSAxID8gKGxvbmcpIHI1IDogKHUzMikgcjUpOworCQkJICAgICAgbW9kWzBdID09IDIgPyBhcmcxIDogbW9kWzBdID09IDEgPyAobG9uZykgYXJnMSA6ICh1MzIpIGFyZzEsCisJCQkgICAgICBtb2RbMV0gPT0gMiA/IGFyZzIgOiBtb2RbMV0gPT0gMSA/IChsb25nKSBhcmcyIDogKHUzMikgYXJnMiwKKwkJCSAgICAgIG1vZFsyXSA9PSAyID8gYXJnMyA6IG1vZFsyXSA9PSAxID8gKGxvbmcpIGFyZzMgOiAodTMyKSBhcmczKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfdHJhY2VfcHJpbnRrX3Byb3RvID0gewpAQCAtMjMxLDkgKzIyOCw4IEBACiAJcmV0dXJuICZicGZfdHJhY2VfcHJpbnRrX3Byb3RvOwogfQogCi1zdGF0aWMgdTY0IGJwZl9wZXJmX2V2ZW50X3JlYWQodTY0IHIxLCB1NjQgZmxhZ3MsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8yKGJwZl9wZXJmX2V2ZW50X3JlYWQsIHN0cnVjdCBicGZfbWFwICosIG1hcCwgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gKHN0cnVjdCBicGZfbWFwICopICh1bnNpZ25lZCBsb25nKSByMTsKIAlzdHJ1Y3QgYnBmX2FycmF5ICphcnJheSA9IGNvbnRhaW5lcl9vZihtYXAsIHN0cnVjdCBicGZfYXJyYXksIG1hcCk7CiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl1NjQgaW5kZXggPSBmbGFncyAmIEJQRl9GX0lOREVYX01BU0s7CkBAIC0zMTAsMTEgKzMwNiw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1NjQgYnBmX3BlcmZfZXZlbnRfb3V0cHV0KHU2NCByMSwgdTY0IHIyLCB1NjQgZmxhZ3MsIHU2NCByNCwgdTY0IHNpemUpCitCUEZfQ0FMTF81KGJwZl9wZXJmX2V2ZW50X291dHB1dCwgc3RydWN0IHB0X3JlZ3MgKiwgcmVncywgc3RydWN0IGJwZl9tYXAgKiwgbWFwLAorCSAgIHU2NCwgZmxhZ3MsIHZvaWQgKiwgZGF0YSwgdTY0LCBzaXplKQogewotCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKHN0cnVjdCBwdF9yZWdzICopKGxvbmcpIHIxOwotCXN0cnVjdCBicGZfbWFwICptYXAgID0gKHN0cnVjdCBicGZfbWFwICopKGxvbmcpIHIyOwotCXZvaWQgKmRhdGEgPSAodm9pZCAqKShsb25nKSByNDsKIAlzdHJ1Y3QgcGVyZl9yYXdfcmVjb3JkIHJhdyA9IHsKIAkJLmZyYWcgPSB7CiAJCQkuc2l6ZSA9IHNpemUsCkBAIC0zNjUsNyArMzU5LDcgQEAKIAlyZXR1cm4gX19icGZfcGVyZl9ldmVudF9vdXRwdXQocmVncywgbWFwLCBmbGFncywgJnJhdyk7CiB9CiAKLXN0YXRpYyB1NjQgYnBmX2dldF9jdXJyZW50X3Rhc2sodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8wKGJwZl9nZXRfY3VycmVudF90YXNrKQogewogCXJldHVybiAobG9uZykgY3VycmVudDsKIH0KQEAgLTM3Niw2ICszNzAsMzEgQEAKIAkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKIH07CiAKK0JQRl9DQUxMXzIoYnBmX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAsIHN0cnVjdCBicGZfbWFwICosIG1hcCwgdTMyLCBpZHgpCit7CisJc3RydWN0IGJwZl9hcnJheSAqYXJyYXkgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2FycmF5LCBtYXApOworCXN0cnVjdCBjZ3JvdXAgKmNncnA7CisKKwlpZiAodW5saWtlbHkoaW5faW50ZXJydXB0KCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkoaWR4ID49IGFycmF5LT5tYXAubWF4X2VudHJpZXMpKQorCQlyZXR1cm4gLUUyQklHOworCisJY2dycCA9IFJFQURfT05DRShhcnJheS0+cHRyc1tpZHhdKTsKKwlpZiAodW5saWtlbHkoIWNncnApKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiB0YXNrX3VuZGVyX2Nncm91cF9oaWVyYXJjaHkoY3VycmVudCwgY2dycCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXBfcHJvdG8gPSB7CisJLmZ1bmMgICAgICAgICAgID0gYnBmX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXAsCisJLmdwbF9vbmx5ICAgICAgID0gZmFsc2UsCisJLnJldF90eXBlICAgICAgID0gUkVUX0lOVEVHRVIsCisJLmFyZzFfdHlwZSAgICAgID0gQVJHX0NPTlNUX01BUF9QVFIsCisJLmFyZzJfdHlwZSAgICAgID0gQVJHX0FOWVRISU5HLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqdHJhY2luZ19mdW5jX3Byb3RvKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCkKIHsKIAlzd2l0Y2ggKGZ1bmNfaWQpIHsKQEAgLTQwNyw2ICs0MjYsMTAgQEAKIAkJcmV0dXJuICZicGZfcGVyZl9ldmVudF9yZWFkX3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfcHJvYmVfd3JpdGVfdXNlcjoKIAkJcmV0dXJuIGJwZl9nZXRfcHJvYmVfd3JpdGVfcHJvdG8oKTsKKwljYXNlIEJQRl9GVU5DX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXA6CisJCXJldHVybiAmYnBmX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXBfcHJvdG87CisJY2FzZSBCUEZfRlVOQ19nZXRfcHJhbmRvbV91MzI6CisJCXJldHVybiAmYnBmX2dldF9wcmFuZG9tX3UzMl9wcm90bzsKIAlkZWZhdWx0OgogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC00NDcsMTYgKzQ3MCwxNyBAQAogCS50eXBlCT0gQlBGX1BST0dfVFlQRV9LUFJPQkUsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9wZXJmX2V2ZW50X291dHB1dF90cCh1NjQgcjEsIHU2NCByMiwgdTY0IGluZGV4LCB1NjQgcjQsIHU2NCBzaXplKQorQlBGX0NBTExfNShicGZfcGVyZl9ldmVudF9vdXRwdXRfdHAsIHZvaWQgKiwgdHBfYnVmZiwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLAorCSAgIHU2NCwgZmxhZ3MsIHZvaWQgKiwgZGF0YSwgdTY0LCBzaXplKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gKihzdHJ1Y3QgcHRfcmVncyAqKil0cF9idWZmOworCiAJLyoKIAkgKiByMSBwb2ludHMgdG8gcGVyZiB0cmFjZXBvaW50IGJ1ZmZlciB3aGVyZSBmaXJzdCA4IGJ5dGVzIGFyZSBoaWRkZW4KIAkgKiBmcm9tIGJwZiBwcm9ncmFtIGFuZCBjb250YWluIGEgcG9pbnRlciB0byAnc3RydWN0IHB0X3JlZ3MnLiBGZXRjaCBpdAotCSAqIGZyb20gdGhlcmUgYW5kIGNhbGwgdGhlIHNhbWUgYnBmX3BlcmZfZXZlbnRfb3V0cHV0KCkgaGVscGVyCisJICogZnJvbSB0aGVyZSBhbmQgY2FsbCB0aGUgc2FtZSBicGZfcGVyZl9ldmVudF9vdXRwdXQoKSBoZWxwZXIgaW5saW5lLgogCSAqLwotCXU2NCBjdHggPSAqKGxvbmcgKikodWludHB0cl90KXIxOwotCi0JcmV0dXJuIGJwZl9wZXJmX2V2ZW50X291dHB1dChjdHgsIHIyLCBpbmRleCwgcjQsIHNpemUpOworCXJldHVybiBfX19fYnBmX3BlcmZfZXZlbnRfb3V0cHV0KHJlZ3MsIG1hcCwgZmxhZ3MsIGRhdGEsIHNpemUpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9wZXJmX2V2ZW50X291dHB1dF9wcm90b190cCA9IHsKQEAgLTQ3MCwxMSArNDk0LDE4IEBACiAJLmFyZzVfdHlwZQk9IEFSR19DT05TVF9TVEFDS19TSVpFLAogfTsKIAotc3RhdGljIHU2NCBicGZfZ2V0X3N0YWNraWRfdHAodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKGJwZl9nZXRfc3RhY2tpZF90cCwgdm9pZCAqLCB0cF9idWZmLCBzdHJ1Y3QgYnBmX21hcCAqLCBtYXAsCisJICAgdTY0LCBmbGFncykKIHsKLQl1NjQgY3R4ID0gKihsb25nICopKHVpbnRwdHJfdClyMTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9ICooc3RydWN0IHB0X3JlZ3MgKiopdHBfYnVmZjsKIAotCXJldHVybiBicGZfZ2V0X3N0YWNraWQoY3R4LCByMiwgcjMsIHI0LCByNSk7CisJLyoKKwkgKiBTYW1lIGNvbW1lbnQgYXMgaW4gYnBmX3BlcmZfZXZlbnRfb3V0cHV0X3RwKCksIG9ubHkgdGhhdCB0aGlzIHRpbWUKKwkgKiB0aGUgb3RoZXIgaGVscGVyJ3MgZnVuY3Rpb24gYm9keSBjYW5ub3QgYmUgaW5saW5lZCBkdWUgdG8gYmVpbmcKKwkgKiBleHRlcm5hbCwgdGh1cyB3ZSBuZWVkIHRvIGNhbGwgcmF3IGhlbHBlciBmdW5jdGlvbi4KKwkgKi8KKwlyZXR1cm4gYnBmX2dldF9zdGFja2lkKCh1bnNpZ25lZCBsb25nKSByZWdzLCAodW5zaWduZWQgbG9uZykgbWFwLAorCQkJICAgICAgIGZsYWdzLCAwLCAwKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfZ2V0X3N0YWNraWRfcHJvdG9fdHAgPSB7CkBAIC01MjAsMTAgKzU1MSw2OSBAQAogCS50eXBlCT0gQlBGX1BST0dfVFlQRV9UUkFDRVBPSU5ULAogfTsKIAorc3RhdGljIGJvb2wgcGVfcHJvZ19pc192YWxpZF9hY2Nlc3MoaW50IG9mZiwgaW50IHNpemUsIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUsCisJCQkJICAgIGVudW0gYnBmX3JlZ190eXBlICpyZWdfdHlwZSkKK3sKKwlpZiAob2ZmIDwgMCB8fCBvZmYgPj0gc2l6ZW9mKHN0cnVjdCBicGZfcGVyZl9ldmVudF9kYXRhKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICh0eXBlICE9IEJQRl9SRUFEKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKG9mZiAlIHNpemUgIT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChvZmYgPT0gb2Zmc2V0b2Yoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGEsIHNhbXBsZV9wZXJpb2QpKSB7CisJCWlmIChzaXplICE9IHNpemVvZih1NjQpKQorCQkJcmV0dXJuIGZhbHNlOworCX0gZWxzZSB7CisJCWlmIChzaXplICE9IHNpemVvZihsb25nKSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB1MzIgcGVfcHJvZ19jb252ZXJ0X2N0eF9hY2Nlc3MoZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwgaW50IGRzdF9yZWcsCisJCQkJICAgICAgaW50IHNyY19yZWcsIGludCBjdHhfb2ZmLAorCQkJCSAgICAgIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYsCisJCQkJICAgICAgc3RydWN0IGJwZl9wcm9nICpwcm9nKQoreworCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGluc25fYnVmOworCisJc3dpdGNoIChjdHhfb2ZmKSB7CisJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgYnBmX3BlcmZfZXZlbnRfZGF0YSwgc2FtcGxlX3BlcmlvZCk6CisJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEsIHBlcmlvZCkgIT0gc2l6ZW9mKHU2NCkpOworCisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfRklFTERfU0laRU9GKHN0cnVjdCBicGZfcGVyZl9ldmVudF9kYXRhX2tlcm4sCisJCQkJCQkgICAgICAgZGF0YSksIGRzdF9yZWcsIHNyY19yZWcsCisJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGFfa2VybiwgZGF0YSkpOworCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0RXLCBkc3RfcmVnLCBkc3RfcmVnLAorCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhLCBwZXJpb2QpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9GSUVMRF9TSVpFT0Yoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGFfa2VybiwKKwkJCQkJCSAgICAgICByZWdzKSwgZHN0X3JlZywgc3JjX3JlZywKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgYnBmX3BlcmZfZXZlbnRfZGF0YV9rZXJuLCByZWdzKSk7CisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfU0laRU9GKGxvbmcpLCBkc3RfcmVnLCBkc3RfcmVnLCBjdHhfb2ZmKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGluc24gLSBpbnNuX2J1ZjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIHBlcmZfZXZlbnRfcHJvZ19vcHMgPSB7CisJLmdldF9mdW5jX3Byb3RvCQk9IHRwX3Byb2dfZnVuY19wcm90bywKKwkuaXNfdmFsaWRfYWNjZXNzCT0gcGVfcHJvZ19pc192YWxpZF9hY2Nlc3MsCisJLmNvbnZlcnRfY3R4X2FjY2Vzcwk9IHBlX3Byb2dfY29udmVydF9jdHhfYWNjZXNzLAorfTsKKworc3RhdGljIHN0cnVjdCBicGZfcHJvZ190eXBlX2xpc3QgcGVyZl9ldmVudF90bCA9IHsKKwkub3BzCT0gJnBlcmZfZXZlbnRfcHJvZ19vcHMsCisJLnR5cGUJPSBCUEZfUFJPR19UWVBFX1BFUkZfRVZFTlQsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9rcHJvYmVfcHJvZ19vcHModm9pZCkKIHsKIAlicGZfcmVnaXN0ZXJfcHJvZ190eXBlKCZrcHJvYmVfdGwpOwogCWJwZl9yZWdpc3Rlcl9wcm9nX3R5cGUoJnRyYWNlcG9pbnRfdGwpOworCWJwZl9yZWdpc3Rlcl9wcm9nX3R5cGUoJnBlcmZfZXZlbnRfdGwpOwogCXJldHVybiAwOwogfQogbGF0ZV9pbml0Y2FsbChyZWdpc3Rlcl9rcHJvYmVfcHJvZ19vcHMpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL2Z0cmFjZS5jIGIva2VybmVsL3RyYWNlL2Z0cmFjZS5jCmluZGV4IDg0NzUyYzguLjIwNTBhNzY1IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2Z0cmFjZS5jCkBAIC04NzIsNyArODcyLDEzIEBACiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgogc3RhdGljIGludCBwcm9maWxlX2dyYXBoX2VudHJ5KHN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50ICp0cmFjZSkKIHsKKwlpbnQgaW5kZXggPSB0cmFjZS0+ZGVwdGg7CisKIAlmdW5jdGlvbl9wcm9maWxlX2NhbGwodHJhY2UtPmZ1bmMsIDAsIE5VTEwsIE5VTEwpOworCisJaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBGVFJBQ0VfUkVURlVOQ19ERVBUSCkKKwkJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5zdWJ0aW1lID0gMDsKKwogCXJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2UuYyBiL2tlcm5lbC90cmFjZS90cmFjZS5jCmluZGV4IGRhZGU0YzkuLjg2OTZjZTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZS5jCkBAIC0xMDQ3LDcgKzEwNDcsNyBAQAogICoKICAqIFNob3dzIHJlYWwgc3RhdGUgb2YgdGhlIHJpbmcgYnVmZmVyIGlmIGl0IGlzIGVuYWJsZWQgb3Igbm90LgogICovCi1zdGF0aWMgaW50IHRyYWNlcl90cmFjaW5nX2lzX29uKHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCitpbnQgdHJhY2VyX3RyYWNpbmdfaXNfb24oc3RydWN0IHRyYWNlX2FycmF5ICp0cikKIHsKIAlpZiAodHItPnRyYWNlX2J1ZmZlci5idWZmZXIpCiAJCXJldHVybiByaW5nX2J1ZmZlcl9yZWNvcmRfaXNfb24odHItPnRyYWNlX2J1ZmZlci5idWZmZXIpOwpAQCAtNDEyMyw2ICs0MTIzLDMwIEBACiAJIlx0XHRcdCAgdHJhY2VzXG4iCiAjZW5kaWYKICNlbmRpZiAvKiBDT05GSUdfU1RBQ0tfVFJBQ0VSICovCisjaWZkZWYgQ09ORklHX0tQUk9CRV9FVkVOVAorCSIgIGtwcm9iZV9ldmVudHNcdFx0LSBBZGQvcmVtb3ZlL3Nob3cgdGhlIGtlcm5lbCBkeW5hbWljIGV2ZW50c1xuIgorCSJcdFx0XHQgIFdyaXRlIGludG8gdGhpcyBmaWxlIHRvIGRlZmluZS91bmRlZmluZSBuZXcgdHJhY2UgZXZlbnRzLlxuIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1VQUk9CRV9FVkVOVAorCSIgIHVwcm9iZV9ldmVudHNcdFx0LSBBZGQvcmVtb3ZlL3Nob3cgdGhlIHVzZXJzcGFjZSBkeW5hbWljIGV2ZW50c1xuIgorCSJcdFx0XHQgIFdyaXRlIGludG8gdGhpcyBmaWxlIHRvIGRlZmluZS91bmRlZmluZSBuZXcgdHJhY2UgZXZlbnRzLlxuIgorI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfS1BST0JFX0VWRU5UKSB8fCBkZWZpbmVkKENPTkZJR19VUFJPQkVfRVZFTlQpCisJIlx0ICBhY2NlcHRzOiBldmVudC1kZWZpbml0aW9ucyAob25lIGRlZmluaXRpb24gcGVyIGxpbmUpXG4iCisJIlx0ICAgRm9ybWF0OiBwfHJbOls8Z3JvdXA+L108ZXZlbnQ+XSA8cGxhY2U+IFs8YXJncz5dXG4iCisJIlx0ICAgICAgICAgICAtOls8Z3JvdXA+L108ZXZlbnQ+XG4iCisjaWZkZWYgQ09ORklHX0tQUk9CRV9FVkVOVAorCSJcdCAgICBwbGFjZTogWzxtb2R1bGU+Ol08c3ltYm9sPlsrPG9mZnNldD5dfDxtZW1hZGRyPlxuIgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1VQUk9CRV9FVkVOVAorCSJcdCAgICBwbGFjZTogPHBhdGg+OjxvZmZzZXQ+XG4iCisjZW5kaWYKKwkiXHQgICAgIGFyZ3M6IDxuYW1lPj1mZXRjaGFyZ1s6dHlwZV1cbiIKKwkiXHQgZmV0Y2hhcmc6ICU8cmVnaXN0ZXI+LCBAPGFkZHJlc3M+LCBAPHN5bWJvbD5bK3wtPG9mZnNldD5dLFxuIgorCSJcdCAgICAgICAgICAgJHN0YWNrPGluZGV4PiwgJHN0YWNrLCAkcmV0dmFsLCAkY29tbVxuIgorCSJcdCAgICAgdHlwZTogczgvMTYvMzIvNjQsIHU4LzE2LzMyLzY0LCB4OC8xNi8zMi82NCwgc3RyaW5nLFxuIgorCSJcdCAgICAgICAgICAgYjxiaXQtd2lkdGg+QDxiaXQtb2Zmc2V0Pi88Y29udGFpbmVyLXNpemU+XG4iCisjZW5kaWYKIAkiICBldmVudHMvXHRcdC0gRGlyZWN0b3J5IGNvbnRhaW5pbmcgYWxsIHRyYWNlIGV2ZW50IHN1YnN5c3RlbXM6XG4iCiAJIiAgICAgIGVuYWJsZVx0XHQtIFdyaXRlIDAvMSB0byBlbmFibGUvZGlzYWJsZSB0cmFjaW5nIG9mIGFsbCBldmVudHNcbiIKIAkiICBldmVudHMvPHN5c3RlbT4vXHQtIERpcmVjdG9yeSBjb250YWluaW5nIGFsbCB0cmFjZSBldmVudHMgZm9yIDxzeXN0ZW0+OlxuIgpAQCAtNDk0NSw3ICs0OTY5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jaWZkZWYgQ09ORklHX1RSQUNFUl9NQVhfVFJBQ0UKKyNpZiBkZWZpbmVkKENPTkZJR19UUkFDRVJfTUFYX1RSQUNFKSB8fCBkZWZpbmVkKENPTkZJR19IV0xBVF9UUkFDRVIpCiAKIHN0YXRpYyBzc2l6ZV90CiB0cmFjaW5nX21heF9sYXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsCkBAIC01MTI0LDE5ICs1MTQ4LDIwIEBACiAJc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXNzaXplX3Qgc3JldDsKIAotCS8qIHJldHVybiBhbnkgbGVmdG92ZXIgZGF0YSAqLwotCXNyZXQgPSB0cmFjZV9zZXFfdG9fdXNlcigmaXRlci0+c2VxLCB1YnVmLCBjbnQpOwotCWlmIChzcmV0ICE9IC1FQlVTWSkKLQkJcmV0dXJuIHNyZXQ7Ci0KLQl0cmFjZV9zZXFfaW5pdCgmaXRlci0+c2VxKTsKLQogCS8qCiAJICogQXZvaWQgbW9yZSB0aGFuIG9uZSBjb25zdW1lciBvbiBhIHNpbmdsZSBmaWxlIGRlc2NyaXB0b3IKIAkgKiBUaGlzIGlzIGp1c3QgYSBtYXR0ZXIgb2YgdHJhY2VzIGNvaGVyZW5jeSwgdGhlIHJpbmcgYnVmZmVyIGl0c2VsZgogCSAqIGlzIHByb3RlY3RlZC4KIAkgKi8KIAltdXRleF9sb2NrKCZpdGVyLT5tdXRleCk7CisKKwkvKiByZXR1cm4gYW55IGxlZnRvdmVyIGRhdGEgKi8KKwlzcmV0ID0gdHJhY2Vfc2VxX3RvX3VzZXIoJml0ZXItPnNlcSwgdWJ1ZiwgY250KTsKKwlpZiAoc3JldCAhPSAtRUJVU1kpCisJCWdvdG8gb3V0OworCisJdHJhY2Vfc2VxX2luaXQoJml0ZXItPnNlcSk7CisKIAlpZiAoaXRlci0+dHJhY2UtPnJlYWQpIHsKIAkJc3JldCA9IGl0ZXItPnRyYWNlLT5yZWFkKGl0ZXIsIGZpbHAsIHVidWYsIGNudCwgcHBvcyk7CiAJCWlmIChzcmV0KQpAQCAtNTg2Nyw3ICs1ODkyLDcgQEAKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCi0jaWZkZWYgQ09ORklHX1RSQUNFUl9NQVhfVFJBQ0UKKyNpZiBkZWZpbmVkKENPTkZJR19UUkFDRVJfTUFYX1RSQUNFKSB8fCBkZWZpbmVkKENPTkZJR19IV0xBVF9UUkFDRVIpCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjaW5nX21heF9sYXRfZm9wcyA9IHsKIAkub3BlbgkJPSB0cmFjaW5nX29wZW5fZ2VuZXJpYywKIAkucmVhZAkJPSB0cmFjaW5nX21heF9sYXRfcmVhZCwKQEAgLTYxNjMsOSArNjE4OCw2IEBACiAJCXJldHVybiAtRUJVU1k7CiAjZW5kaWYKIAotCWlmIChzcGxpY2VfZ3Jvd19zcGQocGlwZSwgJnNwZCkpCi0JCXJldHVybiAtRU5PTUVNOwotCiAJaWYgKCpwcG9zICYgKFBBR0VfU0laRSAtIDEpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNjE3NSw2ICs2MTk3LDkgQEAKIAkJbGVuICY9IFBBR0VfTUFTSzsKIAl9CiAKKwlpZiAoc3BsaWNlX2dyb3dfc3BkKHBpcGUsICZzcGQpKQorCQlyZXR1cm4gLUVOT01FTTsKKwogIGFnYWluOgogCXRyYWNlX2FjY2Vzc19sb2NrKGl0ZXItPmNwdV9maWxlKTsKIAllbnRyaWVzID0gcmluZ19idWZmZXJfZW50cmllc19jcHUoaXRlci0+dHJhY2VfYnVmZmVyLT5idWZmZXIsIGl0ZXItPmNwdV9maWxlKTsKQEAgLTYyMzIsMTkgKzYyNTcsMjEgQEAKIAkvKiBkaWQgd2UgcmVhZCBhbnl0aGluZz8gKi8KIAlpZiAoIXNwZC5ucl9wYWdlcykgewogCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0OwogCisJCXJldCA9IC1FQUdBSU47CiAJCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHx8IChmbGFncyAmIFNQTElDRV9GX05PTkJMT0NLKSkKLQkJCXJldHVybiAtRUFHQUlOOworCQkJZ290byBvdXQ7CiAKIAkJcmV0ID0gd2FpdF9vbl9waXBlKGl0ZXIsIHRydWUpOwogCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0OwogCiAJCWdvdG8gYWdhaW47CiAJfQogCiAJcmV0ID0gc3BsaWNlX3RvX3BpcGUocGlwZSwgJnNwZCk7CitvdXQ6CiAJc3BsaWNlX3Nocmlua19zcGQoJnNwZCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNzE5NSw3ICs3MjIyLDcgQEAKIAogCWNyZWF0ZV90cmFjZV9vcHRpb25zX2Rpcih0cik7CiAKLSNpZmRlZiBDT05GSUdfVFJBQ0VSX01BWF9UUkFDRQorI2lmIGRlZmluZWQoQ09ORklHX1RSQUNFUl9NQVhfVFJBQ0UpIHx8IGRlZmluZWQoQ09ORklHX0hXTEFUX1RSQUNFUikKIAl0cmFjZV9jcmVhdGVfZmlsZSgidHJhY2luZ19tYXhfbGF0ZW5jeSIsIDA2NDQsIGRfdHJhY2VyLAogCQkJJnRyLT5tYXhfbGF0ZW5jeSwgJnRyYWNpbmdfbWF4X2xhdF9mb3BzKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlLmggYi9rZXJuZWwvdHJhY2UvdHJhY2UuaAppbmRleCBmNzgzZGY0Li5mZDI0YjFmIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2UuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2UuaApAQCAtMzgsNiArMzgsNyBAQAogCVRSQUNFX1VTRVJfU1RBQ0ssCiAJVFJBQ0VfQkxLLAogCVRSQUNFX0JQVVRTLAorCVRSQUNFX0hXTEFULAogCiAJX19UUkFDRV9MQVNUX1RZUEUsCiB9OwpAQCAtMjEzLDYgKzIxNCw4IEBACiAJICovCiAJc3RydWN0IHRyYWNlX2J1ZmZlcgltYXhfYnVmZmVyOwogCWJvb2wJCQlhbGxvY2F0ZWRfc25hcHNob3Q7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19UUkFDRVJfTUFYX1RSQUNFKSB8fCBkZWZpbmVkKENPTkZJR19IV0xBVF9UUkFDRVIpCiAJdW5zaWduZWQgbG9uZwkJbWF4X2xhdGVuY3k7CiAjZW5kaWYKIAlzdHJ1Y3QgdHJhY2VfcGlkX2xpc3QJX19yY3UgKmZpbHRlcmVkX3BpZHM7CkBAIC0zMjYsNiArMzI5LDcgQEAKIAkJSUZfQVNTSUdOKHZhciwgZW50LCBzdHJ1Y3QgcHJpbnRfZW50cnksIFRSQUNFX1BSSU5UKTsJXAogCQlJRl9BU1NJR04odmFyLCBlbnQsIHN0cnVjdCBicHJpbnRfZW50cnksIFRSQUNFX0JQUklOVCk7CVwKIAkJSUZfQVNTSUdOKHZhciwgZW50LCBzdHJ1Y3QgYnB1dHNfZW50cnksIFRSQUNFX0JQVVRTKTsJXAorCQlJRl9BU1NJR04odmFyLCBlbnQsIHN0cnVjdCBod2xhdF9lbnRyeSwgVFJBQ0VfSFdMQVQpOwlcCiAJCUlGX0FTU0lHTih2YXIsIGVudCwgc3RydWN0IHRyYWNlX21taW90cmFjZV9ydywJCVwKIAkJCSAgVFJBQ0VfTU1JT19SVyk7CQkJCVwKIAkJSUZfQVNTSUdOKHZhciwgZW50LCBzdHJ1Y3QgdHJhY2VfbW1pb3RyYWNlX21hcCwJCVwKQEAgLTU3MSw2ICs1NzUsNyBAQAogdm9pZCB0cmFjaW5nX3Jlc2V0X2FsbF9vbmxpbmVfY3B1cyh2b2lkKTsKIGludCB0cmFjaW5nX29wZW5fZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CiBib29sIHRyYWNpbmdfaXNfZGlzYWJsZWQodm9pZCk7CitpbnQgdHJhY2VyX3RyYWNpbmdfaXNfb24oc3RydWN0IHRyYWNlX2FycmF5ICp0cik7CiBzdHJ1Y3QgZGVudHJ5ICp0cmFjZV9jcmVhdGVfZmlsZShjb25zdCBjaGFyICpuYW1lLAogCQkJCSB1bW9kZV90IG1vZGUsCiAJCQkJIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9lbnRyaWVzLmggYi9rZXJuZWwvdHJhY2UvdHJhY2VfZW50cmllcy5oCmluZGV4IDVjMzBlZmMuLmQxY2MzN2UgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9lbnRyaWVzLmgKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2VudHJpZXMuaApAQCAtMzIyLDMgKzMyMiwzMCBAQAogCUZJTFRFUl9PVEhFUgogKTsKIAorCitGVFJBQ0VfRU5UUlkoaHdsYXQsIGh3bGF0X2VudHJ5LAorCisJVFJBQ0VfSFdMQVQsCisKKwlGX1NUUlVDVCgKKwkJX19maWVsZCgJdTY0LAkJCWR1cmF0aW9uCSkKKwkJX19maWVsZCgJdTY0LAkJCW91dGVyX2R1cmF0aW9uCSkKKwkJX19maWVsZCgJdTY0LAkJCW5taV90b3RhbF90cwkpCisJCV9fZmllbGRfc3RydWN0KCBzdHJ1Y3QgdGltZXNwZWMsCXRpbWVzdGFtcAkpCisJCV9fZmllbGRfZGVzYygJbG9uZywJdGltZXN0YW1wLAl0dl9zZWMJCSkKKwkJX19maWVsZF9kZXNjKAlsb25nLAl0aW1lc3RhbXAsCXR2X25zZWMJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAkJbm1pX2NvdW50CSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAkJc2VxbnVtCQkpCisJKSwKKworCUZfcHJpbnRrKCJjbnQ6JXVcdHRzOiUwMTBsdS4lMDEwbHVcdGlubmVyOiVsbHVcdG91dGVyOiVsbHVubWktdHM6JWxsdVx0bm1pLWNvdW50OiV1XG4iLAorCQkgX19lbnRyeS0+c2VxbnVtLAorCQkgX19lbnRyeS0+dHZfc2VjLAorCQkgX19lbnRyeS0+dHZfbnNlYywKKwkJIF9fZW50cnktPmR1cmF0aW9uLAorCQkgX19lbnRyeS0+b3V0ZXJfZHVyYXRpb24sCisJCSBfX2VudHJ5LT5ubWlfdG90YWxfdHMsCisJCSBfX2VudHJ5LT5ubWlfY291bnQpLAorCisJRklMVEVSX09USEVSCispOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c190cmlnZ2VyLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3RyaWdnZXIuYwppbmRleCBhOTc1NTcxLi42NzIxYTFlOCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c190cmlnZ2VyLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c190cmlnZ2VyLmMKQEAgLTEwMjgsNiArMTAyOCw3IEBACiBzdGF0aWMgc3RydWN0IGV2ZW50X2NvbW1hbmQgdHJpZ2dlcl90cmFjZW9mZl9jbWQgPSB7CiAJLm5hbWUJCQk9ICJ0cmFjZW9mZiIsCiAJLnRyaWdnZXJfdHlwZQkJPSBFVFRfVFJBQ0VfT05PRkYsCisJLmZsYWdzCQkJPSBFVkVOVF9DTURfRkxfUE9TVF9UUklHR0VSLAogCS5mdW5jCQkJPSBldmVudF90cmlnZ2VyX2NhbGxiYWNrLAogCS5yZWcJCQk9IHJlZ2lzdGVyX3RyaWdnZXIsCiAJLnVucmVnCQkJPSB1bnJlZ2lzdGVyX3RyaWdnZXIsCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMKaW5kZXggNzM2M2NjZi4uNGU0ODBlOCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYwpAQCAtMTE5LDcgKzExOSw3IEBACiAvKiBBZGQgYSBmdW5jdGlvbiByZXR1cm4gYWRkcmVzcyB0byB0aGUgdHJhY2Ugc3RhY2sgb24gdGhyZWFkIGluZm8uKi8KIGludAogZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKHVuc2lnbmVkIGxvbmcgcmV0LCB1bnNpZ25lZCBsb25nIGZ1bmMsIGludCAqZGVwdGgsCi0JCQkgdW5zaWduZWQgbG9uZyBmcmFtZV9wb2ludGVyKQorCQkJIHVuc2lnbmVkIGxvbmcgZnJhbWVfcG9pbnRlciwgdW5zaWduZWQgbG9uZyAqcmV0cCkKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgY2FsbHRpbWU7CiAJaW50IGluZGV4OwpAQCAtMTcwLDggKzE3MCwxMiBAQAogCWN1cnJlbnQtPnJldF9zdGFja1tpbmRleF0ucmV0ID0gcmV0OwogCWN1cnJlbnQtPnJldF9zdGFja1tpbmRleF0uZnVuYyA9IGZ1bmM7CiAJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5jYWxsdGltZSA9IGNhbGx0aW1lOwotCWN1cnJlbnQtPnJldF9zdGFja1tpbmRleF0uc3VidGltZSA9IDA7CisjaWZkZWYgSEFWRV9GVU5DVElPTl9HUkFQSF9GUF9URVNUCiAJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5mcCA9IGZyYW1lX3BvaW50ZXI7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0ZVTkNUSU9OX0dSQVBIX1JFVF9BRERSX1BUUgorCWN1cnJlbnQtPnJldF9zdGFja1tpbmRleF0ucmV0cCA9IHJldHA7CisjZW5kaWYKIAkqZGVwdGggPSBjdXJyZW50LT5jdXJyX3JldF9zdGFjazsKIAogCXJldHVybiAwOwpAQCAtMjA0LDcgKzIwOCw3IEBACiAJCXJldHVybjsKIAl9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QpICYmICFkZWZpbmVkKENDX1VTSU5HX0ZFTlRSWSkKKyNpZmRlZiBIQVZFX0ZVTkNUSU9OX0dSQVBIX0ZQX1RFU1QKIAkvKgogCSAqIFRoZSBhcmNoIG1heSBjaG9vc2UgdG8gcmVjb3JkIHRoZSBmcmFtZSBwb2ludGVyIHVzZWQKIAkgKiBhbmQgY2hlY2sgaXQgaGVyZSB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyB3aGF0IHdlIGV4cGVjdCBpdApAQCAtMjc5LDYgKzI4Myw2NCBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogZnRyYWNlX2dyYXBoX3JldF9hZGRyIC0gY29udmVydCBhIHBvdGVudGlhbGx5IG1vZGlmaWVkIHN0YWNrIHJldHVybiBhZGRyZXNzCisgKgkJCSAgIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBieSBzdGFjayB1bndpbmRpbmcgY29kZSB0byBjb252ZXJ0IGEgZm91bmQgc3RhY2sKKyAqIHJldHVybiBhZGRyZXNzICgncmV0JykgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLCBpbiBjYXNlIHRoZSBmdW5jdGlvbiBncmFwaAorICogdHJhY2VyIGhhcyBtb2RpZmllZCBpdCB0byBiZSAncmV0dXJuX3RvX2hhbmRsZXInLiAgSWYgdGhlIGFkZHJlc3MgaGFzbid0CisgKiBiZWVuIG1vZGlmaWVkLCB0aGUgdW5jaGFuZ2VkIHZhbHVlIG9mICdyZXQnIGlzIHJldHVybmVkLgorICoKKyAqICdpZHgnIGlzIGEgc3RhdGUgdmFyaWFibGUgd2hpY2ggc2hvdWxkIGJlIGluaXRpYWxpemVkIGJ5IHRoZSBjYWxsZXIgdG8gemVybworICogYmVmb3JlIHRoZSBmaXJzdCBjYWxsLgorICoKKyAqICdyZXRwJyBpcyBhIHBvaW50ZXIgdG8gdGhlIHJldHVybiBhZGRyZXNzIG9uIHRoZSBzdGFjay4gIEl0J3MgaWdub3JlZCBpZgorICogdGhlIGFyY2ggZG9lc24ndCBoYXZlIEhBVkVfRlVOQ1RJT05fR1JBUEhfUkVUX0FERFJfUFRSIGRlZmluZWQuCisgKi8KKyNpZmRlZiBIQVZFX0ZVTkNUSU9OX0dSQVBIX1JFVF9BRERSX1BUUgordW5zaWduZWQgbG9uZyBmdHJhY2VfZ3JhcGhfcmV0X2FkZHIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgKmlkeCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyByZXQsIHVuc2lnbmVkIGxvbmcgKnJldHApCit7CisJaW50IGluZGV4ID0gdGFzay0+Y3Vycl9yZXRfc3RhY2s7CisJaW50IGk7CisKKwlpZiAocmV0ICE9ICh1bnNpZ25lZCBsb25nKXJldHVybl90b19oYW5kbGVyKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGluZGV4IDwgLTEpCisJCWluZGV4ICs9IEZUUkFDRV9OT1RSQUNFX0RFUFRIOworCisJaWYgKGluZGV4IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPD0gaW5kZXg7IGkrKykKKwkJaWYgKHRhc2stPnJldF9zdGFja1tpXS5yZXRwID09IHJldHApCisJCQlyZXR1cm4gdGFzay0+cmV0X3N0YWNrW2ldLnJldDsKKworCXJldHVybiByZXQ7Cit9CisjZWxzZSAvKiAhSEFWRV9GVU5DVElPTl9HUkFQSF9SRVRfQUREUl9QVFIgKi8KK3Vuc2lnbmVkIGxvbmcgZnRyYWNlX2dyYXBoX3JldF9hZGRyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50ICppZHgsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcmV0LCB1bnNpZ25lZCBsb25nICpyZXRwKQoreworCWludCB0YXNrX2lkeDsKKworCWlmIChyZXQgIT0gKHVuc2lnbmVkIGxvbmcpcmV0dXJuX3RvX2hhbmRsZXIpCisJCXJldHVybiByZXQ7CisKKwl0YXNrX2lkeCA9IHRhc2stPmN1cnJfcmV0X3N0YWNrOworCisJaWYgKCF0YXNrLT5yZXRfc3RhY2sgfHwgdGFza19pZHggPCAqaWR4KQorCQlyZXR1cm4gcmV0OworCisJdGFza19pZHggLT0gKmlkeDsKKwkoKmlkeCkrKzsKKworCXJldHVybiB0YXNrLT5yZXRfc3RhY2tbdGFza19pZHhdLnJldDsKK30KKyNlbmRpZiAvKiBIQVZFX0ZVTkNUSU9OX0dSQVBIX1JFVF9BRERSX1BUUiAqLworCiBpbnQgX190cmFjZV9ncmFwaF9lbnRyeShzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLAogCQkJCXN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50ICp0cmFjZSwKIAkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLApAQCAtMTEyMCw2ICsxMTgyLDExIEBACiAJdHJhY2Vfc2VxX3B1dHMocywgIi8qICIpOwogCiAJc3dpdGNoIChpdGVyLT5lbnQtPnR5cGUpIHsKKwljYXNlIFRSQUNFX0JQVVRTOgorCQlyZXQgPSB0cmFjZV9wcmludF9icHV0c19tc2dfb25seShpdGVyKTsKKwkJaWYgKHJldCAhPSBUUkFDRV9UWVBFX0hBTkRMRUQpCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKIAljYXNlIFRSQUNFX0JQUklOVDoKIAkJcmV0ID0gdHJhY2VfcHJpbnRfYnByaW50a19tc2dfb25seShpdGVyKTsKIAkJaWYgKHJldCAhPSBUUkFDRV9UWVBFX0hBTkRMRUQpCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfaHdsYXQuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9od2xhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NzI4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfaHdsYXQuYwpAQCAtMCwwICsxLDYzMyBAQAorLyoKKyAqIHRyYWNlX2h3bGF0ZGV0ZWN0LmMgLSBBIHNpbXBsZSBIYXJkd2FyZSBMYXRlbmN5IGRldGVjdG9yLgorICoKKyAqIFVzZSB0aGlzIHRyYWNlciB0byBkZXRlY3QgbGFyZ2Ugc3lzdGVtIGxhdGVuY2llcyBpbmR1Y2VkIGJ5IHRoZSBiZWhhdmlvciBvZgorICogY2VydGFpbiB1bmRlcmx5aW5nIHN5c3RlbSBoYXJkd2FyZSBvciBmaXJtd2FyZSwgaW5kZXBlbmRlbnQgb2YgTGludXggaXRzZWxmLgorICogVGhlIGNvZGUgd2FzIGRldmVsb3BlZCBvcmlnaW5hbGx5IHRvIGRldGVjdCB0aGUgcHJlc2VuY2Ugb2YgU01JcyBvbiBJbnRlbAorICogYW5kIEFNRCBzeXN0ZW1zLCBhbHRob3VnaCB0aGVyZSBpcyBubyBkZXBlbmRlbmN5IHVwb24geDg2IGhlcmVpbi4KKyAqCisgKiBUaGUgY2xhc3NpY2FsIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyB0cmFjZXIgaXMgaW4gZGV0ZWN0aW5nIHRoZSBwcmVzZW5jZSBvZgorICogU01JcyBvciBTeXN0ZW0gTWFuYWdlbWVudCBJbnRlcnJ1cHRzIG9uIEludGVsIGFuZCBBTUQgc3lzdGVtcy4gQW4gU01JIGlzIGEKKyAqIHNvbWV3aGF0IHNwZWNpYWwgZm9ybSBvZiBoYXJkd2FyZSBpbnRlcnJ1cHQgc3Bhd25lZCBmcm9tIGVhcmxpZXIgQ1BVIGRlYnVnCisgKiBtb2RlcyBpbiB3aGljaCB0aGUgKEJJT1MvRUZJL2V0Yy4pIGZpcm13YXJlIGFycmFuZ2VzIGZvciB0aGUgU291dGggQnJpZGdlCisgKiBMUEMgKG9yIG90aGVyIGRldmljZSkgdG8gZ2VuZXJhdGUgYSBzcGVjaWFsIGludGVycnVwdCB1bmRlciBjZXJ0YWluCisgKiBjaXJjdW1zdGFuY2VzLCBmb3IgZXhhbXBsZSwgdXBvbiBleHBpcmF0aW9uIG9mIGEgc3BlY2lhbCBTTUkgdGltZXIgZGV2aWNlLAorICogZHVlIHRvIGNlcnRhaW4gZXh0ZXJuYWwgdGhlcm1hbCByZWFkaW5ncywgb24gY2VydGFpbiBJL08gYWRkcmVzcyBhY2Nlc3NlcywKKyAqIGFuZCBvdGhlciBzaXR1YXRpb25zLiBBbiBTTUkgaGl0cyBhIHNwZWNpYWwgQ1BVIHBpbiwgdHJpZ2dlcnMgYSBzcGVjaWFsCisgKiBTTUkgbW9kZSAoY29tcGxldGUgd2l0aCBzcGVjaWFsIG1lbW9yeSBtYXApLCBhbmQgdGhlIE9TIGlzIHVuYXdhcmUuCisgKgorICogQWx0aG91Z2ggY2VydGFpbiBoYXJkd2FyZS1pbmR1Y2luZyBsYXRlbmNpZXMgYXJlIG5lY2Vzc2FyeSAoZm9yIGV4YW1wbGUsCisgKiBhIG1vZGVybiBzeXN0ZW0gb2Z0ZW4gcmVxdWlyZXMgYW4gU01JIGhhbmRsZXIgZm9yIGNvcnJlY3QgdGhlcm1hbCBjb250cm9sCisgKiBhbmQgcmVtb3RlIG1hbmFnZW1lbnQpIHRoZXkgY2FuIHdyZWFrIGhhdm9jIHVwb24gYW55IE9TLWxldmVsIHBlcmZvcm1hbmNlCisgKiBndWFyYW50ZWVzIHRvd2FyZCBsb3ctbGF0ZW5jeSwgZXNwZWNpYWxseSB3aGVuIHRoZSBPUyBpcyBub3QgZXZlbiBtYWRlCisgKiBhd2FyZSBvZiB0aGUgcHJlc2VuY2Ugb2YgdGhlc2UgaW50ZXJydXB0cy4gRm9yIHRoaXMgcmVhc29uLCB3ZSBuZWVkIGEKKyAqIHNvbWV3aGF0IGJydXRlIGZvcmNlIG1lY2hhbmlzbSB0byBkZXRlY3QgdGhlc2UgaW50ZXJydXB0cy4gSW4gdGhpcyBjYXNlLAorICogd2UgZG8gaXQgYnkgaG9nZ2luZyBhbGwgb2YgdGhlIENQVShzKSBmb3IgY29uZmlndXJhYmxlIHRpbWVyIGludGVydmFscywKKyAqIHNhbXBsaW5nIHRoZSBidWlsdC1pbiBDUFUgdGltZXIsIGxvb2tpbmcgZm9yIGRpc2NvbnRpZ3VvdXMgcmVhZGluZ3MuCisgKgorICogV0FSTklORzogVGhpcyBpbXBsZW1lbnRhdGlvbiBuZWNlc3NhcmlseSBpbnRyb2R1Y2VzIGxhdGVuY2llcy4gVGhlcmVmb3JlLAorICogICAgICAgICAgeW91IHNob3VsZCBORVZFUiB1c2UgdGhpcyB0cmFjZXIgd2hpbGUgcnVubmluZyBpbiBhIHByb2R1Y3Rpb24KKyAqICAgICAgICAgIGVudmlyb25tZW50IHJlcXVpcmluZyBhbnkga2luZCBvZiBsb3ctbGF0ZW5jeSBwZXJmb3JtYW5jZQorICogICAgICAgICAgZ3VhcmFudGVlKHMpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEpvbiBNYXN0ZXJzLCBSZWQgSGF0LCBJbmMuIDxqY21AcmVkaGF0LmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE2IFN0ZXZlbiBSb3N0ZWR0LCBSZWQgSGF0LCBJbmMuIDxzcm9zdGVkdEByZWRoYXQuY29tPgorICoKKyAqIEluY2x1ZGVzIHVzZWZ1bCBmZWVkYmFjayBmcm9tIENsYXJrIFdpbGxpYW1zIDxjbGFya0ByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJ0cmFjZS5oIgorCitzdGF0aWMgc3RydWN0IHRyYWNlX2FycmF5CSpod2xhdF90cmFjZTsKKworI2RlZmluZSBVNjRTVFJfU0laRQkJMjIJCQkvKiAyMCBkaWdpdHMgbWF4ICovCisKKyNkZWZpbmUgQkFOTkVSCQkJImh3bGF0X2RldGVjdG9yOiAiCisjZGVmaW5lIERFRkFVTFRfU0FNUExFX1dJTkRPVwkxMDAwMDAwCQkJLyogMXMgKi8KKyNkZWZpbmUgREVGQVVMVF9TQU1QTEVfV0lEVEgJNTAwMDAwCQkJLyogMC41cyAqLworI2RlZmluZSBERUZBVUxUX0xBVF9USFJFU0hPTEQJMTAJCQkvKiAxMHVzICovCisKKy8qIHNhbXBsaW5nIHRocmVhZCovCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpod2xhdF9rdGhyZWFkOworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqaHdsYXRfc2FtcGxlX3dpZHRoOwkvKiBzYW1wbGUgd2lkdGggdXMgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpod2xhdF9zYW1wbGVfd2luZG93OwkvKiBzYW1wbGUgd2luZG93IHVzICovCisKKy8qIFNhdmUgdGhlIHByZXZpb3VzIHRyYWNpbmdfdGhyZXNoIHZhbHVlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzYXZlX3RyYWNpbmdfdGhyZXNoOworCisvKiBOTUkgdGltZXN0YW1wIGNvdW50ZXJzICovCitzdGF0aWMgdTY0IG5taV90c19zdGFydDsKK3N0YXRpYyB1NjQgbm1pX3RvdGFsX3RzOworc3RhdGljIGludCBubWlfY291bnQ7CitzdGF0aWMgaW50IG5taV9jcHU7CisKKy8qIFRlbGxzIE5NSXMgdG8gY2FsbCBiYWNrIHRvIHRoZSBod2xhdCB0cmFjZXIgdG8gcmVjb3JkIHRpbWVzdGFtcHMgKi8KK2Jvb2wgdHJhY2VfaHdsYXRfY2FsbGJhY2tfZW5hYmxlZDsKKworLyogSWYgdGhlIHVzZXIgY2hhbmdlZCB0aHJlc2hvbGQsIHJlbWVtYmVyIGl0ICovCitzdGF0aWMgdTY0IGxhc3RfdHJhY2luZ190aHJlc2ggPSBERUZBVUxUX0xBVF9USFJFU0hPTEQgKiBOU0VDX1BFUl9VU0VDOworCisvKiBJbmRpdmlkdWFsIGxhdGVuY3kgc2FtcGxlcyBhcmUgc3RvcmVkIGhlcmUgd2hlbiBkZXRlY3RlZC4gKi8KK3N0cnVjdCBod2xhdF9zYW1wbGUgeworCXU2NAkJc2VxbnVtOwkJLyogdW5pcXVlIHNlcXVlbmNlICovCisJdTY0CQlkdXJhdGlvbjsJLyogZGVsdGEgKi8KKwl1NjQJCW91dGVyX2R1cmF0aW9uOwkvKiBkZWx0YSAob3V0ZXIgbG9vcCkgKi8KKwl1NjQJCW5taV90b3RhbF90czsJLyogVG90YWwgdGltZSBzcGVudCBpbiBOTUlzICovCisJc3RydWN0IHRpbWVzcGVjCXRpbWVzdGFtcDsJLyogd2FsbCB0aW1lICovCisJaW50CQlubWlfY291bnQ7CS8qICMgTk1JcyBkdXJpbmcgdGhpcyBzYW1wbGUgKi8KK307CisKKy8qIGtlZXAgdGhlIGdsb2JhbCBzdGF0ZSBzb21ld2hlcmUuICovCitzdGF0aWMgc3RydWN0IGh3bGF0X2RhdGEgeworCisJc3RydWN0IG11dGV4IGxvY2s7CQkvKiBwcm90ZWN0IGNoYW5nZXMgKi8KKworCXU2NAljb3VudDsJCQkvKiB0b3RhbCBzaW5jZSByZXNldCAqLworCisJdTY0CXNhbXBsZV93aW5kb3c7CQkvKiB0b3RhbCBzYW1wbGluZyB3aW5kb3cgKG9uK29mZikgKi8KKwl1NjQJc2FtcGxlX3dpZHRoOwkJLyogYWN0aXZlIHNhbXBsaW5nIHBvcnRpb24gb2Ygd2luZG93ICovCisKK30gaHdsYXRfZGF0YSA9IHsKKwkuc2FtcGxlX3dpbmRvdwkJPSBERUZBVUxUX1NBTVBMRV9XSU5ET1csCisJLnNhbXBsZV93aWR0aAkJPSBERUZBVUxUX1NBTVBMRV9XSURUSCwKK307CisKK3N0YXRpYyB2b2lkIHRyYWNlX2h3bGF0X3NhbXBsZShzdHJ1Y3QgaHdsYXRfc2FtcGxlICpzYW1wbGUpCit7CisJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9IGh3bGF0X3RyYWNlOworCXN0cnVjdCB0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X2h3bGF0OworCXN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyID0gdHItPnRyYWNlX2J1ZmZlci5idWZmZXI7CisJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKKwlzdHJ1Y3QgaHdsYXRfZW50cnkgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHBjOworCisJcGMgPSBwcmVlbXB0X2NvdW50KCk7CisJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7CisKKwlldmVudCA9IHRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoYnVmZmVyLCBUUkFDRV9IV0xBVCwgc2l6ZW9mKCplbnRyeSksCisJCQkJCSAgZmxhZ3MsIHBjKTsKKwlpZiAoIWV2ZW50KQorCQlyZXR1cm47CisJZW50cnkJPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKKwllbnRyeS0+c2VxbnVtCQkJPSBzYW1wbGUtPnNlcW51bTsKKwllbnRyeS0+ZHVyYXRpb24JCQk9IHNhbXBsZS0+ZHVyYXRpb247CisJZW50cnktPm91dGVyX2R1cmF0aW9uCQk9IHNhbXBsZS0+b3V0ZXJfZHVyYXRpb247CisJZW50cnktPnRpbWVzdGFtcAkJPSBzYW1wbGUtPnRpbWVzdGFtcDsKKwllbnRyeS0+bm1pX3RvdGFsX3RzCQk9IHNhbXBsZS0+bm1pX3RvdGFsX3RzOworCWVudHJ5LT5ubWlfY291bnQJCT0gc2FtcGxlLT5ubWlfY291bnQ7CisKKwlpZiAoIWNhbGxfZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIGJ1ZmZlciwgZXZlbnQpKQorCQlfX2J1ZmZlcl91bmxvY2tfY29tbWl0KGJ1ZmZlciwgZXZlbnQpOworfQorCisvKiBNYWNyb3MgdG8gZW5jYXBzdWxhdGUgdGhlIHRpbWUgY2FwdHVyaW5nIGluZnJhc3RydWN0dXJlICovCisjZGVmaW5lIHRpbWVfdHlwZQl1NjQKKyNkZWZpbmUgdGltZV9nZXQoKQl0cmFjZV9jbG9ja19sb2NhbCgpCisjZGVmaW5lIHRpbWVfdG9fdXMoeCkJZGl2X3U2NCh4LCAxMDAwKQorI2RlZmluZSB0aW1lX3N1YihhLCBiKQkoKGEpIC0gKGIpKQorI2RlZmluZSBpbml0X3RpbWUoYSwgYikJKGEgPSBiKQorI2RlZmluZSB0aW1lX3U2NChhKQlhCisKK3ZvaWQgdHJhY2VfaHdsYXRfY2FsbGJhY2soYm9vbCBlbnRlcikKK3sKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IG5taV9jcHUpCisJCXJldHVybjsKKworCS8qCisJICogQ3VycmVudGx5IHRyYWNlX2Nsb2NrX2xvY2FsKCkgY2FsbHMgc2NoZWRfY2xvY2soKSBhbmQgdGhlCisJICogZ2VuZXJpYyB2ZXJzaW9uIGlzIG5vdCBOTUkgc2FmZS4KKwkgKi8KKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0dFTkVSSUNfU0NIRURfQ0xPQ0spKSB7CisJCWlmIChlbnRlcikKKwkJCW5taV90c19zdGFydCA9IHRpbWVfZ2V0KCk7CisJCWVsc2UKKwkJCW5taV90b3RhbF90cyA9IHRpbWVfZ2V0KCkgLSBubWlfdHNfc3RhcnQ7CisJfQorCisJaWYgKGVudGVyKQorCQlubWlfY291bnQrKzsKK30KKworLyoqCisgKiBnZXRfc2FtcGxlIC0gc2FtcGxlIHRoZSBDUFUgVFNDIGFuZCBsb29rIGZvciBsaWtlbHkgaGFyZHdhcmUgbGF0ZW5jaWVzCisgKgorICogVXNlZCB0byByZXBlYXRlZGx5IGNhcHR1cmUgdGhlIENQVSBUU0MgKG9yIHNpbWlsYXIpLCBsb29raW5nIGZvciBwb3RlbnRpYWwKKyAqIGhhcmR3YXJlLWluZHVjZWQgbGF0ZW5jeS4gQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQgd2l0aAorICogaHdsYXRfZGF0YS5sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X3NhbXBsZSh2b2lkKQoreworCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSBod2xhdF90cmFjZTsKKwl0aW1lX3R5cGUgc3RhcnQsIHQxLCB0MiwgbGFzdF90MjsKKwlzNjQgZGlmZiwgdG90YWwsIGxhc3RfdG90YWwgPSAwOworCXU2NCBzYW1wbGUgPSAwOworCXU2NCB0aHJlc2ggPSB0cmFjaW5nX3RocmVzaDsKKwl1NjQgb3V0ZXJfc2FtcGxlID0gMDsKKwlpbnQgcmV0ID0gLTE7CisKKwlkb19kaXYodGhyZXNoLCBOU0VDX1BFUl9VU0VDKTsgLyogbW9kaWZpZXMgaW50ZXJ2YWwgdmFsdWUgKi8KKworCW5taV9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJbm1pX3RvdGFsX3RzID0gMDsKKwlubWlfY291bnQgPSAwOworCS8qIE1ha2Ugc3VyZSBOTUlzIHNlZSB0aGlzIGZpcnN0ICovCisJYmFycmllcigpOworCisJdHJhY2VfaHdsYXRfY2FsbGJhY2tfZW5hYmxlZCA9IHRydWU7CisKKwlpbml0X3RpbWUobGFzdF90MiwgMCk7CisJc3RhcnQgPSB0aW1lX2dldCgpOyAvKiBzdGFydCB0aW1lc3RhbXAgKi8KKworCWRvIHsKKworCQl0MSA9IHRpbWVfZ2V0KCk7CS8qIHdlJ2xsIGxvb2sgZm9yIGEgZGlzY29udGludWl0eSAqLworCQl0MiA9IHRpbWVfZ2V0KCk7CisKKwkJaWYgKHRpbWVfdTY0KGxhc3RfdDIpKSB7CisJCQkvKiBDaGVjayB0aGUgZGVsdGEgZnJvbSBvdXRlciBsb29wICh0MiB0byBuZXh0IHQxKSAqLworCQkJZGlmZiA9IHRpbWVfdG9fdXModGltZV9zdWIodDEsIGxhc3RfdDIpKTsKKwkJCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiAqLworCQkJaWYgKGRpZmYgPCAwKSB7CisJCQkJcHJfZXJyKEJBTk5FUiAidGltZSBydW5uaW5nIGJhY2t3YXJkc1xuIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAoZGlmZiA+IG91dGVyX3NhbXBsZSkKKwkJCQlvdXRlcl9zYW1wbGUgPSBkaWZmOworCQl9CisJCWxhc3RfdDIgPSB0MjsKKworCQl0b3RhbCA9IHRpbWVfdG9fdXModGltZV9zdWIodDIsIHN0YXJ0KSk7IC8qIHNhbXBsZSB3aWR0aCAqLworCisJCS8qIENoZWNrIGZvciBwb3NzaWJsZSBvdmVyZmxvd3MgKi8KKwkJaWYgKHRvdGFsIDwgbGFzdF90b3RhbCkgeworCQkJcHJfZXJyKCJUaW1lIHRvdGFsIG92ZXJmbG93ZWRcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJbGFzdF90b3RhbCA9IHRvdGFsOworCisJCS8qIFRoaXMgY2hlY2tzIHRoZSBpbm5lciBsb29wICh0MSB0byB0MikgKi8KKwkJZGlmZiA9IHRpbWVfdG9fdXModGltZV9zdWIodDIsIHQxKSk7ICAgICAvKiBjdXJyZW50IGRpZmYgKi8KKworCQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KKwkJaWYgKGRpZmYgPCAwKSB7CisJCQlwcl9lcnIoQkFOTkVSICJ0aW1lIHJ1bm5pbmcgYmFja3dhcmRzXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGRpZmYgPiBzYW1wbGUpCisJCQlzYW1wbGUgPSBkaWZmOyAvKiBvbmx5IHdhbnQgaGlnaGVzdCB2YWx1ZSAqLworCisJfSB3aGlsZSAodG90YWwgPD0gaHdsYXRfZGF0YS5zYW1wbGVfd2lkdGgpOworCisJYmFycmllcigpOyAvKiBmaW5pc2ggdGhlIGFib3ZlIGluIHRoZSB2aWV3IGZvciBOTUlzICovCisJdHJhY2VfaHdsYXRfY2FsbGJhY2tfZW5hYmxlZCA9IGZhbHNlOworCWJhcnJpZXIoKTsgLyogTWFrZSBzdXJlIG5taV90b3RhbF90cyBpcyBubyBsb25nZXIgdXBkYXRlZCAqLworCisJcmV0ID0gMDsKKworCS8qIElmIHdlIGV4Y2VlZCB0aGUgdGhyZXNob2xkIHZhbHVlLCB3ZSBoYXZlIGZvdW5kIGEgaGFyZHdhcmUgbGF0ZW5jeSAqLworCWlmIChzYW1wbGUgPiB0aHJlc2ggfHwgb3V0ZXJfc2FtcGxlID4gdGhyZXNoKSB7CisJCXN0cnVjdCBod2xhdF9zYW1wbGUgczsKKworCQlyZXQgPSAxOworCisJCS8qIFdlIHJlYWQgaW4gbWljcm9zZWNvbmRzICovCisJCWlmIChubWlfdG90YWxfdHMpCisJCQlkb19kaXYobm1pX3RvdGFsX3RzLCBOU0VDX1BFUl9VU0VDKTsKKworCQlod2xhdF9kYXRhLmNvdW50Kys7CisJCXMuc2VxbnVtID0gaHdsYXRfZGF0YS5jb3VudDsKKwkJcy5kdXJhdGlvbiA9IHNhbXBsZTsKKwkJcy5vdXRlcl9kdXJhdGlvbiA9IG91dGVyX3NhbXBsZTsKKwkJcy50aW1lc3RhbXAgPSBDVVJSRU5UX1RJTUU7CisJCXMubm1pX3RvdGFsX3RzID0gbm1pX3RvdGFsX3RzOworCQlzLm5taV9jb3VudCA9IG5taV9jb3VudDsKKwkJdHJhY2VfaHdsYXRfc2FtcGxlKCZzKTsKKworCQkvKiBLZWVwIGEgcnVubmluZyBtYXhpbXVtIGV2ZXIgcmVjb3JkZWQgaGFyZHdhcmUgbGF0ZW5jeSAqLworCQlpZiAoc2FtcGxlID4gdHItPm1heF9sYXRlbmN5KQorCQkJdHItPm1heF9sYXRlbmN5ID0gc2FtcGxlOworCX0KKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3B1bWFzayBzYXZlX2NwdW1hc2s7CitzdGF0aWMgYm9vbCBkaXNhYmxlX21pZ3JhdGU7CisKK3N0YXRpYyB2b2lkIG1vdmVfdG9fbmV4dF9jcHUodm9pZCkKK3sKKwlzdGF0aWMgc3RydWN0IGNwdW1hc2sgKmN1cnJlbnRfbWFzazsKKwlpbnQgbmV4dF9jcHU7CisKKwlpZiAoZGlzYWJsZV9taWdyYXRlKQorCQlyZXR1cm47CisKKwkvKiBKdXN0IHBpY2sgdGhlIGZpcnN0IENQVSBvbiBmaXJzdCBpdGVyYXRpb24gKi8KKwlpZiAoIWN1cnJlbnRfbWFzaykgeworCQljdXJyZW50X21hc2sgPSAmc2F2ZV9jcHVtYXNrOworCQlnZXRfb25saW5lX2NwdXMoKTsKKwkJY3B1bWFza19hbmQoY3VycmVudF9tYXNrLCBjcHVfb25saW5lX21hc2ssIHRyYWNpbmdfYnVmZmVyX21hc2spOworCQlwdXRfb25saW5lX2NwdXMoKTsKKwkJbmV4dF9jcHUgPSBjcHVtYXNrX2ZpcnN0KGN1cnJlbnRfbWFzayk7CisJCWdvdG8gc2V0X2FmZmluaXR5OworCX0KKworCS8qCisJICogSWYgZm9yIHNvbWUgcmVhc29uIHRoZSB1c2VyIG1vZGlmaWVzIHRoZSBDUFUgYWZmaW5pdHkKKwkgKiBvZiB0aGlzIHRocmVhZCwgdGhhbiBzdG9wIG1pZ3JhdGluZyBmb3IgdGhlIGR1cmF0aW9uCisJICogb2YgdGhlIGN1cnJlbnQgdGVzdC4KKwkgKi8KKwlpZiAoIWNwdW1hc2tfZXF1YWwoY3VycmVudF9tYXNrLCAmY3VycmVudC0+Y3B1c19hbGxvd2VkKSkKKwkJZ290byBkaXNhYmxlOworCisJZ2V0X29ubGluZV9jcHVzKCk7CisJY3B1bWFza19hbmQoY3VycmVudF9tYXNrLCBjcHVfb25saW5lX21hc2ssIHRyYWNpbmdfYnVmZmVyX21hc2spOworCW5leHRfY3B1ID0gY3B1bWFza19uZXh0KHNtcF9wcm9jZXNzb3JfaWQoKSwgY3VycmVudF9tYXNrKTsKKwlwdXRfb25saW5lX2NwdXMoKTsKKworCWlmIChuZXh0X2NwdSA+PSBucl9jcHVfaWRzKQorCQluZXh0X2NwdSA9IGNwdW1hc2tfZmlyc3QoY3VycmVudF9tYXNrKTsKKworIHNldF9hZmZpbml0eToKKwlpZiAobmV4dF9jcHUgPj0gbnJfY3B1X2lkcykgLyogU2hvdWxkbid0IGhhcHBlbiEgKi8KKwkJZ290byBkaXNhYmxlOworCisJY3B1bWFza19jbGVhcihjdXJyZW50X21hc2spOworCWNwdW1hc2tfc2V0X2NwdShuZXh0X2NwdSwgY3VycmVudF9tYXNrKTsKKworCXNjaGVkX3NldGFmZmluaXR5KDAsIGN1cnJlbnRfbWFzayk7CisJcmV0dXJuOworCisgZGlzYWJsZToKKwlkaXNhYmxlX21pZ3JhdGUgPSB0cnVlOworfQorCisvKgorICoga3RocmVhZF9mbiAtIFRoZSBDUFUgdGltZSBzYW1wbGluZy9oYXJkd2FyZSBsYXRlbmN5IGRldGVjdGlvbiBrZXJuZWwgdGhyZWFkCisgKgorICogVXNlZCB0byBwZXJpb2RpY2FsbHkgc2FtcGxlIHRoZSBDUFUgVFNDIHZpYSBhIGNhbGwgdG8gZ2V0X3NhbXBsZS4gV2UKKyAqIGRpc2FibGUgaW50ZXJydXB0cywgd2hpY2ggZG9lcyAoaW50ZW50aW9uYWxseSkgaW50cm9kdWNlIGxhdGVuY3kgc2luY2Ugd2UKKyAqIG5lZWQgdG8gZW5zdXJlIG5vdGhpbmcgZWxzZSBtaWdodCBiZSBydW5uaW5nIChhbmQgdGh1cyBwcmVlbXB0aW5nKS4KKyAqIE9idmlvdXNseSB0aGlzIHNob3VsZCBuZXZlciBiZSB1c2VkIGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzLgorICoKKyAqIEN1cnJlbnRseSB0aGlzIHJ1bnMgb24gd2hpY2ggZXZlciBDUFUgaXQgd2FzIHNjaGVkdWxlZCBvbiwgYnV0IG1vc3QKKyAqIHJlYWwtd29ybGQgaGFyZHdhcmUgbGF0ZW5jeSBzaXR1YXRpb25zIG9jY3VyIGFjcm9zcyBzZXZlcmFsIENQVXMsCisgKiBidXQgd2UgbWlnaHQgbGF0ZXIgZ2VuZXJhbGl6ZSB0aGlzIGlmIHdlIGZpbmQgdGhlcmUgYXJlIGFueSBhY3R1YWx5CisgKiBzeXN0ZW1zIHdpdGggYWx0ZXJuYXRlIFNNSSBkZWxpdmVyeSBvciBvdGhlciBoYXJkd2FyZSBsYXRlbmNpZXMuCisgKi8KK3N0YXRpYyBpbnQga3RocmVhZF9mbih2b2lkICpkYXRhKQoreworCXU2NCBpbnRlcnZhbDsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisKKwkJbW92ZV90b19uZXh0X2NwdSgpOworCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCWdldF9zYW1wbGUoKTsKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJCW11dGV4X2xvY2soJmh3bGF0X2RhdGEubG9jayk7CisJCWludGVydmFsID0gaHdsYXRfZGF0YS5zYW1wbGVfd2luZG93IC0gaHdsYXRfZGF0YS5zYW1wbGVfd2lkdGg7CisJCW11dGV4X3VubG9jaygmaHdsYXRfZGF0YS5sb2NrKTsKKworCQlkb19kaXYoaW50ZXJ2YWwsIFVTRUNfUEVSX01TRUMpOyAvKiBtb2RpZmllcyBpbnRlcnZhbCB2YWx1ZSAqLworCisJCS8qIEFsd2F5cyBzbGVlcCBmb3IgYXQgbGVhc3QgMW1zICovCisJCWlmIChpbnRlcnZhbCA8IDEpCisJCQlpbnRlcnZhbCA9IDE7CisKKwkJaWYgKG1zbGVlcF9pbnRlcnJ1cHRpYmxlKGludGVydmFsKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHN0YXJ0X2t0aHJlYWQgLSBLaWNrIG9mZiB0aGUgaGFyZHdhcmUgbGF0ZW5jeSBzYW1wbGluZy9kZXRlY3RvciBrdGhyZWFkCisgKgorICogVGhpcyBzdGFydHMgdGhlIGtlcm5lbCB0aHJlYWQgdGhhdCB3aWxsIHNpdCBhbmQgc2FtcGxlIHRoZSBDUFUgdGltZXN0YW1wCisgKiBjb3VudGVyIChUU0Mgb3Igc2ltaWxhcikgYW5kIGxvb2sgZm9yIHBvdGVudGlhbCBoYXJkd2FyZSBsYXRlbmNpZXMuCisgKi8KK3N0YXRpYyBpbnQgc3RhcnRfa3RocmVhZChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqa3RocmVhZDsKKworCWt0aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZShrdGhyZWFkX2ZuLCBOVUxMLCAiaHdsYXRkIik7CisJaWYgKElTX0VSUihrdGhyZWFkKSkgeworCQlwcl9lcnIoQkFOTkVSICJjb3VsZCBub3Qgc3RhcnQgc2FtcGxpbmcgdGhyZWFkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWh3bGF0X2t0aHJlYWQgPSBrdGhyZWFkOworCXdha2VfdXBfcHJvY2VzcyhrdGhyZWFkKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHN0b3Bfa3RocmVhZCAtIEluZm9ybSB0aGUgaGFyZHdhcmUgbGF0ZW5jeSBzYW1waW5nL2RldGVjdG9yIGt0aHJlYWQgdG8gc3RvcAorICoKKyAqIFRoaXMga2lja3MgdGhlIHJ1bm5pbmcgaGFyZHdhcmUgbGF0ZW5jeSBzYW1wbGluZy9kZXRlY3RvciBrZXJuZWwgdGhyZWFkIGFuZAorICogdGVsbHMgaXQgdG8gc3RvcCBzYW1wbGluZyBub3cuIFVzZSB0aGlzIG9uIHVubG9hZCBhbmQgYXQgc3lzdGVtIHNodXRkb3duLgorICovCitzdGF0aWMgdm9pZCBzdG9wX2t0aHJlYWQodm9pZCkKK3sKKwlpZiAoIWh3bGF0X2t0aHJlYWQpCisJCXJldHVybjsKKwlrdGhyZWFkX3N0b3AoaHdsYXRfa3RocmVhZCk7CisJaHdsYXRfa3RocmVhZCA9IE5VTEw7Cit9CisKKy8qCisgKiBod2xhdF9yZWFkIC0gV3JhcHBlciByZWFkIGZ1bmN0aW9uIGZvciByZWFkaW5nIGJvdGggd2luZG93IGFuZCB3aWR0aAorICogQGZpbHA6IFRoZSBhY3RpdmUgb3BlbiBmaWxlIHN0cnVjdHVyZQorICogQHVidWY6IFRoZSB1c2Vyc3BhY2UgcHJvdmlkZWQgYnVmZmVyIHRvIHJlYWQgdmFsdWUgaW50bworICogQGNudDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqIEBwcG9zOiBUaGUgY3VycmVudCAiZmlsZSIgcG9zaXRpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgZ2VuZXJpYyByZWFkIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZ2xvYmFsIHN0YXRlCisgKiAiaHdsYXRfZGF0YSIgc3RydWN0dXJlIGZpbGVzeXN0ZW0gZW50cmllcy4KKyAqLworc3RhdGljIHNzaXplX3QgaHdsYXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsCisJCQkgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZltVNjRTVFJfU0laRV07CisJdTY0ICplbnRyeSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwl1NjQgdmFsOworCWludCBsZW47CisKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjbnQgPiBzaXplb2YoYnVmKSkKKwkJY250ID0gc2l6ZW9mKGJ1Zik7CisKKwl2YWwgPSAqZW50cnk7CisKKwlsZW4gPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWxsdVxuIiwgdmFsKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjbnQsIHBwb3MsIGJ1ZiwgbGVuKTsKK30KKworLyoqCisgKiBod2xhdF93aWR0aF93cml0ZSAtIFdyaXRlIGZ1bmN0aW9uIGZvciAid2lkdGgiIGVudHJ5CisgKiBAZmlscDogVGhlIGFjdGl2ZSBvcGVuIGZpbGUgc3RydWN0dXJlCisgKiBAdWJ1ZjogVGhlIHVzZXIgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHZhbHVlIHRvIHdyaXRlCisgKiBAY250OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUgdG8gImZpbGUiCisgKiBAcHBvczogVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gQGZpbGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgd3JpdGUgaW1wbGVtZW50YXRpb24gZm9yIHRoZSAid2lkdGgiIGludGVyZmFjZQorICogdG8gdGhlIGhhcmR3YXJlIGxhdGVuY3kgZGV0ZWN0b3IuIEl0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZQorICogZm9yIGhvdyBtYW55IHVzIG9mIHRoZSB0b3RhbCB3aW5kb3cgdXMgd2Ugd2lsbCBhY3RpdmVseSBzYW1wbGUgZm9yIGFueQorICogaGFyZHdhcmUtaW5kdWNlZCBsYXRlbmN5IHBlcmlvZHMuIE9idmlvdXNseSwgaXQgaXMgbm90IHBvc3NpYmxlIHRvCisgKiBzYW1wbGUgY29uc3RhbnRseSBhbmQgaGF2ZSB0aGUgc3lzdGVtIHJlc3BvbmQgdG8gYSBzYW1wbGUgcmVhZGVyLCBvciwKKyAqIHdvcnNlLCB3aXRob3V0IGhhdmluZyB0aGUgc3lzdGVtIGFwcGVhciB0byBoYXZlIGdvbmUgb3V0IHRvIGx1bmNoLiBJdAorICogaXMgZW5mb3JjZWQgdGhhdCB3aWR0aCBpcyBsZXNzIHRoYXQgdGhlIHRvdGFsIHdpbmRvdyBzaXplLgorICovCitzdGF0aWMgc3NpemVfdAoraHdsYXRfd2lkdGhfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLAorCQkgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1NjQgdmFsOworCWludCBlcnI7CisKKwllcnIgPSBrc3RydG91bGxfZnJvbV91c2VyKHVidWYsIGNudCwgMTAsICZ2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltdXRleF9sb2NrKCZod2xhdF9kYXRhLmxvY2spOworCWlmICh2YWwgPCBod2xhdF9kYXRhLnNhbXBsZV93aW5kb3cpCisJCWh3bGF0X2RhdGEuc2FtcGxlX3dpZHRoID0gdmFsOworCWVsc2UKKwkJZXJyID0gLUVJTlZBTDsKKwltdXRleF91bmxvY2soJmh3bGF0X2RhdGEubG9jayk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIGNudDsKK30KKworLyoqCisgKiBod2xhdF93aW5kb3dfd3JpdGUgLSBXcml0ZSBmdW5jdGlvbiBmb3IgIndpbmRvdyIgZW50cnkKKyAqIEBmaWxwOiBUaGUgYWN0aXZlIG9wZW4gZmlsZSBzdHJ1Y3R1cmUKKyAqIEB1YnVmOiBUaGUgdXNlciBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgdmFsdWUgdG8gd3JpdGUKKyAqIEBjbnQ6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSB0byAiZmlsZSIKKyAqIEBwcG9zOiBUaGUgY3VycmVudCBwb3NpdGlvbiBpbiBAZmlsZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3cml0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlICJ3aW5kb3ciIGludGVyZmFjZQorICogdG8gdGhlIGhhcmR3YXJlIGxhdGVuY3kgZGV0ZXRlY3Rvci4gVGhlIHdpbmRvdyBpcyB0aGUgdG90YWwgdGltZQorICogaW4gdXMgdGhhdCB3aWxsIGJlIGNvbnNpZGVyZWQgb25lIHNhbXBsZSBwZXJpb2QuIENvbmNlcHR1YWxseSwgd2luZG93cworICogb2NjdXIgYmFjay10by1iYWNrIGFuZCBjb250YWluIGEgc2FtcGxlIHdpZHRoIHBlcmlvZCBkdXJpbmcgd2hpY2gKKyAqIGFjdHVhbCBzYW1wbGluZyBvY2N1cnMuIENhbiBiZSB1c2VkIHRvIHdyaXRlIGEgbmV3IHRvdGFsIHdpbmRvdyBzaXplLiBJdAorICogaXMgZW5mb2NlZCB0aGF0IGFueSB2YWx1ZSB3cml0dGVuIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBzYW1wbGUgd2lkdGgKKyAqIHNpemUsIG9yIGFuIGVycm9yIHJlc3VsdHMuCisgKi8KK3N0YXRpYyBzc2l6ZV90Citod2xhdF93aW5kb3dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLAorCQkgICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCit7CisJdTY0IHZhbDsKKwlpbnQgZXJyOworCisJZXJyID0ga3N0cnRvdWxsX2Zyb21fdXNlcih1YnVmLCBjbnQsIDEwLCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbXV0ZXhfbG9jaygmaHdsYXRfZGF0YS5sb2NrKTsKKwlpZiAoaHdsYXRfZGF0YS5zYW1wbGVfd2lkdGggPCB2YWwpCisJCWh3bGF0X2RhdGEuc2FtcGxlX3dpbmRvdyA9IHZhbDsKKwllbHNlCisJCWVyciA9IC1FSU5WQUw7CisJbXV0ZXhfdW5sb2NrKCZod2xhdF9kYXRhLmxvY2spOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdpZHRoX2ZvcHMgPSB7CisJLm9wZW4JCT0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCisJLnJlYWQJCT0gaHdsYXRfcmVhZCwKKwkud3JpdGUJCT0gaHdsYXRfd2lkdGhfd3JpdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3aW5kb3dfZm9wcyA9IHsKKwkub3BlbgkJPSB0cmFjaW5nX29wZW5fZ2VuZXJpYywKKwkucmVhZAkJPSBod2xhdF9yZWFkLAorCS53cml0ZQkJPSBod2xhdF93aW5kb3dfd3JpdGUsCit9OworCisvKioKKyAqIGluaXRfdHJhY2VmcyAtIEEgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSB0aGUgdHJhY2VmcyBpbnRlcmZhY2UgZmlsZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgZW50cmllcyBpbiB0cmFjZWZzIGZvciAiaHdsYXRfZGV0ZWN0b3IiLgorICogSXQgY3JlYXRlcyB0aGUgaHdsYXRfZGV0ZWN0b3IgZGlyZWN0b3J5IGluIHRoZSB0cmFjaW5nIGRpcmVjdG9yeSwKKyAqIGFuZCB3aXRoaW4gdGhhdCBkaXJlY3RvcnkgaXMgdGhlIGNvdW50LCB3aWR0aCBhbmQgd2luZG93IGZpbGVzIHRvCisgKiBjaGFuZ2UgYW5kIHZpZXcgdGhvc2UgdmFsdWVzLgorICovCitzdGF0aWMgaW50IGluaXRfdHJhY2Vmcyh2b2lkKQoreworCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOworCXN0cnVjdCBkZW50cnkgKnRvcF9kaXI7CisKKwlkX3RyYWNlciA9IHRyYWNpbmdfaW5pdF9kZW50cnkoKTsKKwlpZiAoSVNfRVJSKGRfdHJhY2VyKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0b3BfZGlyID0gdHJhY2Vmc19jcmVhdGVfZGlyKCJod2xhdF9kZXRlY3RvciIsIGRfdHJhY2VyKTsKKwlpZiAoIXRvcF9kaXIpCisJCXJldHVybiAtRU5PTUVNOworCisJaHdsYXRfc2FtcGxlX3dpbmRvdyA9IHRyYWNlZnNfY3JlYXRlX2ZpbGUoIndpbmRvdyIsIDA2NDAsCisJCQkJCQkgIHRvcF9kaXIsCisJCQkJCQkgICZod2xhdF9kYXRhLnNhbXBsZV93aW5kb3csCisJCQkJCQkgICZ3aW5kb3dfZm9wcyk7CisJaWYgKCFod2xhdF9zYW1wbGVfd2luZG93KQorCQlnb3RvIGVycjsKKworCWh3bGF0X3NhbXBsZV93aWR0aCA9IHRyYWNlZnNfY3JlYXRlX2ZpbGUoIndpZHRoIiwgMDY0NCwKKwkJCQkJCSB0b3BfZGlyLAorCQkJCQkJICZod2xhdF9kYXRhLnNhbXBsZV93aWR0aCwKKwkJCQkJCSAmd2lkdGhfZm9wcyk7CisJaWYgKCFod2xhdF9zYW1wbGVfd2lkdGgpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKKyBlcnI6CisJdHJhY2Vmc19yZW1vdmVfcmVjdXJzaXZlKHRvcF9kaXIpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBod2xhdF90cmFjZXJfc3RhcnQoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc3RhcnRfa3RocmVhZCh0cik7CisJaWYgKGVycikKKwkJcHJfZXJyKEJBTk5FUiAiQ2Fubm90IHN0YXJ0IGh3bGF0IGt0aHJlYWRcbiIpOworfQorCitzdGF0aWMgdm9pZCBod2xhdF90cmFjZXJfc3RvcChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQoreworCXN0b3Bfa3RocmVhZCgpOworfQorCitzdGF0aWMgYm9vbCBod2xhdF9idXN5OworCitzdGF0aWMgaW50IGh3bGF0X3RyYWNlcl9pbml0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCit7CisJLyogT25seSBhbGxvdyBvbmUgaW5zdGFuY2UgdG8gZW5hYmxlIHRoaXMgKi8KKwlpZiAoaHdsYXRfYnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWh3bGF0X3RyYWNlID0gdHI7CisKKwlkaXNhYmxlX21pZ3JhdGUgPSBmYWxzZTsKKwlod2xhdF9kYXRhLmNvdW50ID0gMDsKKwl0ci0+bWF4X2xhdGVuY3kgPSAwOworCXNhdmVfdHJhY2luZ190aHJlc2ggPSB0cmFjaW5nX3RocmVzaDsKKworCS8qIHRyYWNpbmdfdGhyZXNoIGlzIGluIG5zZWNzLCB3ZSBzcGVhayBpbiB1c2VjcyAqLworCWlmICghdHJhY2luZ190aHJlc2gpCisJCXRyYWNpbmdfdGhyZXNoID0gbGFzdF90cmFjaW5nX3RocmVzaDsKKworCWlmICh0cmFjZXJfdHJhY2luZ19pc19vbih0cikpCisJCWh3bGF0X3RyYWNlcl9zdGFydCh0cik7CisKKwlod2xhdF9idXN5ID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBod2xhdF90cmFjZXJfcmVzZXQoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKK3sKKwlzdG9wX2t0aHJlYWQoKTsKKworCS8qIHRoZSB0cmFjaW5nIHRocmVzaG9sZCBpcyBzdGF0aWMgYmV0d2VlbiBydW5zICovCisJbGFzdF90cmFjaW5nX3RocmVzaCA9IHRyYWNpbmdfdGhyZXNoOworCisJdHJhY2luZ190aHJlc2ggPSBzYXZlX3RyYWNpbmdfdGhyZXNoOworCWh3bGF0X2J1c3kgPSBmYWxzZTsKK30KKworc3RhdGljIHN0cnVjdCB0cmFjZXIgaHdsYXRfdHJhY2VyIF9fcmVhZF9tb3N0bHkgPQoreworCS5uYW1lCQk9ICJod2xhdCIsCisJLmluaXQJCT0gaHdsYXRfdHJhY2VyX2luaXQsCisJLnJlc2V0CQk9IGh3bGF0X3RyYWNlcl9yZXNldCwKKwkuc3RhcnQJCT0gaHdsYXRfdHJhY2VyX3N0YXJ0LAorCS5zdG9wCQk9IGh3bGF0X3RyYWNlcl9zdG9wLAorCS5hbGxvd19pbnN0YW5jZXMgPSB0cnVlLAorfTsKKworX19pbml0IHN0YXRpYyBpbnQgaW5pdF9od2xhdF90cmFjZXIodm9pZCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfaW5pdCgmaHdsYXRfZGF0YS5sb2NrKTsKKworCXJldCA9IHJlZ2lzdGVyX3RyYWNlcigmaHdsYXRfdHJhY2VyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaW5pdF90cmFjZWZzKCk7CisKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoaW5pdF9od2xhdF90cmFjZXIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCmluZGV4IDlhZWRiMGIuLmViNmM5ZjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKQEAgLTI1Myw2ICsyNTMsMTAgQEAKIAlBU1NJR05fRkVUQ0hfVFlQRShzMTYsIHUxNiwgMSksCiAJQVNTSUdOX0ZFVENIX1RZUEUoczMyLCB1MzIsIDEpLAogCUFTU0lHTl9GRVRDSF9UWVBFKHM2NCwgdTY0LCAxKSwKKwlBU1NJR05fRkVUQ0hfVFlQRV9BTElBUyh4OCwgIHU4LCAgdTgsICAwKSwKKwlBU1NJR05fRkVUQ0hfVFlQRV9BTElBUyh4MTYsIHUxNiwgdTE2LCAwKSwKKwlBU1NJR05fRkVUQ0hfVFlQRV9BTElBUyh4MzIsIHUzMiwgdTMyLCAwKSwKKwlBU1NJR05fRkVUQ0hfVFlQRV9BTElBUyh4NjQsIHU2NCwgdTY0LCAwKSwKIAogCUFTU0lHTl9GRVRDSF9UWVBFX0VORAogfTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYwppbmRleCAwYmI5Y2YyLi4zZmMyMDQyIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jCkBAIC0xMDk4LDYgKzEwOTgsNzEgQEAKIAkuZnVuY3MJCT0gJnRyYWNlX3VzZXJfc3RhY2tfZnVuY3MsCiB9OwogCisvKiBUUkFDRV9IV0xBVCAqLworc3RhdGljIGVudW0gcHJpbnRfbGluZV90Cit0cmFjZV9od2xhdF9wcmludChzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBmbGFncywKKwkJICBzdHJ1Y3QgdHJhY2VfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCB0cmFjZV9lbnRyeSAqZW50cnkgPSBpdGVyLT5lbnQ7CisJc3RydWN0IHRyYWNlX3NlcSAqcyA9ICZpdGVyLT5zZXE7CisJc3RydWN0IGh3bGF0X2VudHJ5ICpmaWVsZDsKKworCXRyYWNlX2Fzc2lnbl90eXBlKGZpZWxkLCBlbnRyeSk7CisKKwl0cmFjZV9zZXFfcHJpbnRmKHMsICIjJS01dSBpbm5lci9vdXRlcih1cyk6ICU0bGx1LyUtNWxsdSB0czolbGQuJTA5bGQiLAorCQkJIGZpZWxkLT5zZXFudW0sCisJCQkgZmllbGQtPmR1cmF0aW9uLAorCQkJIGZpZWxkLT5vdXRlcl9kdXJhdGlvbiwKKwkJCSBmaWVsZC0+dGltZXN0YW1wLnR2X3NlYywKKwkJCSBmaWVsZC0+dGltZXN0YW1wLnR2X25zZWMpOworCisJaWYgKGZpZWxkLT5ubWlfY291bnQpIHsKKwkJLyoKKwkJICogVGhlIGdlbmVyaWMgc2NoZWRfY2xvY2soKSBpcyBub3QgTk1JIHNhZmUsIHRodXMKKwkJICogd2Ugb25seSByZWNvcmQgdGhlIGNvdW50IGFuZCBub3QgdGhlIHRpbWUuCisJCSAqLworCQlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0dFTkVSSUNfU0NIRURfQ0xPQ0spKQorCQkJdHJhY2Vfc2VxX3ByaW50ZihzLCAiIG5taS10b3RhbDolbGx1IiwKKwkJCQkJIGZpZWxkLT5ubWlfdG90YWxfdHMpOworCQl0cmFjZV9zZXFfcHJpbnRmKHMsICIgbm1pLWNvdW50OiV1IiwKKwkJCQkgZmllbGQtPm5taV9jb3VudCk7CisJfQorCisJdHJhY2Vfc2VxX3B1dGMocywgJ1xuJyk7CisKKwlyZXR1cm4gdHJhY2VfaGFuZGxlX3JldHVybihzKTsKK30KKworCitzdGF0aWMgZW51bSBwcmludF9saW5lX3QKK3RyYWNlX2h3bGF0X3JhdyhzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBmbGFncywKKwkJc3RydWN0IHRyYWNlX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgaHdsYXRfZW50cnkgKmZpZWxkOworCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOworCisJdHJhY2VfYXNzaWduX3R5cGUoZmllbGQsIGl0ZXItPmVudCk7CisKKwl0cmFjZV9zZXFfcHJpbnRmKHMsICIlbGx1ICVsbGQgJWxkICUwOWxkICV1XG4iLAorCQkJIGZpZWxkLT5kdXJhdGlvbiwKKwkJCSBmaWVsZC0+b3V0ZXJfZHVyYXRpb24sCisJCQkgZmllbGQtPnRpbWVzdGFtcC50dl9zZWMsCisJCQkgZmllbGQtPnRpbWVzdGFtcC50dl9uc2VjLAorCQkJIGZpZWxkLT5zZXFudW0pOworCisJcmV0dXJuIHRyYWNlX2hhbmRsZV9yZXR1cm4ocyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJhY2VfZXZlbnRfZnVuY3Rpb25zIHRyYWNlX2h3bGF0X2Z1bmNzID0geworCS50cmFjZQkJPSB0cmFjZV9od2xhdF9wcmludCwKKwkucmF3CQk9IHRyYWNlX2h3bGF0X3JhdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHJhY2VfZXZlbnQgdHJhY2VfaHdsYXRfZXZlbnQgPSB7CisJLnR5cGUJCT0gVFJBQ0VfSFdMQVQsCisJLmZ1bmNzCQk9ICZ0cmFjZV9od2xhdF9mdW5jcywKK307CisKIC8qIFRSQUNFX0JQVVRTICovCiBzdGF0aWMgZW51bSBwcmludF9saW5lX3QKIHRyYWNlX2JwdXRzX3ByaW50KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwgaW50IGZsYWdzLApAQCAtMTIzMyw2ICsxMjk4LDcgQEAKIAkmdHJhY2VfYnB1dHNfZXZlbnQsCiAJJnRyYWNlX2JwcmludF9ldmVudCwKIAkmdHJhY2VfcHJpbnRfZXZlbnQsCisJJnRyYWNlX2h3bGF0X2V2ZW50LAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9wcm9iZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmMKaW5kZXggNzRlODBhNS4uOGMwNTUzZCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmMKQEAgLTM2LDI0ICszNiwyOCBAQAogfTsKIAogLyogUHJpbnRpbmcgIGluIGJhc2ljIHR5cGUgZnVuY3Rpb24gdGVtcGxhdGUgKi8KLSNkZWZpbmUgREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh0eXBlLCBmbXQpCQkJCVwKLWludCBQUklOVF9UWVBFX0ZVTkNfTkFNRSh0eXBlKShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpuYW1lLAlcCisjZGVmaW5lIERFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModG5hbWUsIHR5cGUsIGZtdCkJCQlcCitpbnQgUFJJTlRfVFlQRV9GVU5DX05BTUUodG5hbWUpKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IGNoYXIgKm5hbWUsCVwKIAkJCQl2b2lkICpkYXRhLCB2b2lkICplbnQpCQkJXAogewkJCQkJCQkJCVwKIAl0cmFjZV9zZXFfcHJpbnRmKHMsICIgJXM9IiBmbXQsIG5hbWUsICoodHlwZSAqKWRhdGEpOwkJXAogCXJldHVybiAhdHJhY2Vfc2VxX2hhc19vdmVyZmxvd2VkKHMpOwkJCQlcCiB9CQkJCQkJCQkJXAotY29uc3QgY2hhciBQUklOVF9UWVBFX0ZNVF9OQU1FKHR5cGUpW10gPSBmbXQ7CQkJCVwKLU5PS1BST0JFX1NZTUJPTChQUklOVF9UWVBFX0ZVTkNfTkFNRSh0eXBlKSk7Citjb25zdCBjaGFyIFBSSU5UX1RZUEVfRk1UX05BTUUodG5hbWUpW10gPSBmbXQ7CQkJCVwKK05PS1BST0JFX1NZTUJPTChQUklOVF9UWVBFX0ZVTkNfTkFNRSh0bmFtZSkpOwogCi1ERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHU4ICwgIjB4JXgiKQotREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh1MTYsICIweCV4IikKLURFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModTMyLCAiMHgleCIpCi1ERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHU2NCwgIjB4JUx4IikKLURFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoczgsICAiJWQiKQotREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzMTYsICIlZCIpCi1ERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHMzMiwgIiVkIikKLURFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoczY0LCAiJUxkIikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModTgsICB1OCwgICIldSIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHUxNiwgdTE2LCAiJXUiKQorREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh1MzIsIHUzMiwgIiV1IikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkModTY0LCB1NjQsICIlTHUiKQorREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzOCwgIHM4LCAgIiVkIikKK0RFRklORV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoczE2LCBzMTYsICIlZCIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHMzMiwgczMyLCAiJWQiKQorREVGSU5FX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzNjQsIHM2NCwgIiVMZCIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHg4LCAgdTgsICAiMHgleCIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHgxNiwgdTE2LCAiMHgleCIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHgzMiwgdTMyLCAiMHgleCIpCitERUZJTkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHg2NCwgdTY0LCAiMHglTHgiKQogCiAvKiBQcmludCB0eXBlIGZ1bmN0aW9uIGZvciBzdHJpbmcgdHlwZSAqLwogaW50IFBSSU5UX1RZUEVfRlVOQ19OQU1FKHN0cmluZykoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqbmFtZSwKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9wcm9iZS5oIGIva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmgKaW5kZXggNDU0MDBjYS4uMGMwYWU1NCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmgKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmgKQEAgLTE0OSw2ICsxNDksMTEgQEAKIERFQ0xBUkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHMxNik7CiBERUNMQVJFX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyhzMzIpOwogREVDTEFSRV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoczY0KTsKK0RFQ0xBUkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHg4KTsKK0RFQ0xBUkVfQkFTSUNfUFJJTlRfVFlQRV9GVU5DKHgxNik7CitERUNMQVJFX0JBU0lDX1BSSU5UX1RZUEVfRlVOQyh4MzIpOworREVDTEFSRV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoeDY0KTsKKwogREVDTEFSRV9CQVNJQ19QUklOVF9UWVBFX0ZVTkMoc3RyaW5nKTsKIAogI2RlZmluZSBGRVRDSF9GVU5DX05BTUUobWV0aG9kLCB0eXBlKQlmZXRjaF8jI21ldGhvZCMjXyMjdHlwZQpAQCAtMjAzLDcgKzIwOCw3IEBACiBERUZJTkVfRkVUQ0hfIyNtZXRob2QodTY0KQogCiAvKiBEZWZhdWx0ICh1bnNpZ25lZCBsb25nKSBmZXRjaCB0eXBlICovCi0jZGVmaW5lIF9fREVGQVVMVF9GRVRDSF9UWVBFKHQpIHUjI3QKKyNkZWZpbmUgX19ERUZBVUxUX0ZFVENIX1RZUEUodCkgeCMjdAogI2RlZmluZSBfREVGQVVMVF9GRVRDSF9UWVBFKHQpIF9fREVGQVVMVF9GRVRDSF9UWVBFKHQpCiAjZGVmaW5lIERFRkFVTFRfRkVUQ0hfVFlQRSBfREVGQVVMVF9GRVRDSF9UWVBFKEJJVFNfUEVSX0xPTkcpCiAjZGVmaW5lIERFRkFVTFRfRkVUQ0hfVFlQRV9TVFIgX19zdHJpbmdpZnkoREVGQVVMVF9GRVRDSF9UWVBFKQpAQCAtMjM0LDYgKzIzOSwxMCBAQAogI2RlZmluZSBBU1NJR05fRkVUQ0hfVFlQRShwdHlwZSwgZnR5cGUsIHNpZ24pCQkJXAogCV9fQVNTSUdOX0ZFVENIX1RZUEUoI3B0eXBlLCBwdHlwZSwgZnR5cGUsIHNpemVvZihmdHlwZSksIHNpZ24sICNwdHlwZSkKIAorLyogSWYgcHR5cGUgaXMgYW4gYWxpYXMgb2YgYXR5cGUsIHVzZSB0aGlzIG1hY3JvIChzaG93IGF0eXBlIGluIGZvcm1hdCkgKi8KKyNkZWZpbmUgQVNTSUdOX0ZFVENIX1RZUEVfQUxJQVMocHR5cGUsIGF0eXBlLCBmdHlwZSwgc2lnbikJCVwKKwlfX0FTU0lHTl9GRVRDSF9UWVBFKCNwdHlwZSwgcHR5cGUsIGZ0eXBlLCBzaXplb2YoZnR5cGUpLCBzaWduLCAjYXR5cGUpCisKICNkZWZpbmUgQVNTSUdOX0ZFVENIX1RZUEVfRU5EIHt9CiAKICNkZWZpbmUgRkVUQ0hfVFlQRV9TVFJJTkcJMApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3N5c2NhbGxzLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzY2FsbHMuYwppbmRleCBiMmI2ZWZjLi41ZTEwMzk1IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzY2FsbHMuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzY2FsbHMuYwpAQCAtNjEwLDggKzYxMCw3IEBACiAJaWYgKCFzeXNfcGVyZl9yZWZjb3VudF9lbnRlcikKIAkJcmV0ID0gcmVnaXN0ZXJfdHJhY2Vfc3lzX2VudGVyKHBlcmZfc3lzY2FsbF9lbnRlciwgTlVMTCk7CiAJaWYgKHJldCkgewotCQlwcl9pbmZvKCJldmVudCB0cmFjZTogQ291bGQgbm90IGFjdGl2YXRlIgotCQkJCSJzeXNjYWxsIGVudHJ5IHRyYWNlIHBvaW50Iik7CisJCXByX2luZm8oImV2ZW50IHRyYWNlOiBDb3VsZCBub3QgYWN0aXZhdGUgc3lzY2FsbCBlbnRyeSB0cmFjZSBwb2ludCIpOwogCX0gZWxzZSB7CiAJCXNldF9iaXQobnVtLCBlbmFibGVkX3BlcmZfZW50ZXJfc3lzY2FsbHMpOwogCQlzeXNfcGVyZl9yZWZjb3VudF9lbnRlcisrOwpAQCAtNjgyLDggKzY4MSw3IEBACiAJaWYgKCFzeXNfcGVyZl9yZWZjb3VudF9leGl0KQogCQlyZXQgPSByZWdpc3Rlcl90cmFjZV9zeXNfZXhpdChwZXJmX3N5c2NhbGxfZXhpdCwgTlVMTCk7CiAJaWYgKHJldCkgewotCQlwcl9pbmZvKCJldmVudCB0cmFjZTogQ291bGQgbm90IGFjdGl2YXRlIgotCQkJCSJzeXNjYWxsIGV4aXQgdHJhY2UgcG9pbnQiKTsKKwkJcHJfaW5mbygiZXZlbnQgdHJhY2U6IENvdWxkIG5vdCBhY3RpdmF0ZSBzeXNjYWxsIGV4aXQgdHJhY2UgcG9pbnQiKTsKIAl9IGVsc2UgewogCQlzZXRfYml0KG51bSwgZW5hYmxlZF9wZXJmX2V4aXRfc3lzY2FsbHMpOwogCQlzeXNfcGVyZl9yZWZjb3VudF9leGl0Kys7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfdXByb2JlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfdXByb2JlLmMKaW5kZXggYzUzNDg1NC4uMDkxMzY5MyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3Vwcm9iZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV91cHJvYmUuYwpAQCAtMjExLDYgKzIxMSwxMCBAQAogCUFTU0lHTl9GRVRDSF9UWVBFKHMxNiwgdTE2LCAxKSwKIAlBU1NJR05fRkVUQ0hfVFlQRShzMzIsIHUzMiwgMSksCiAJQVNTSUdOX0ZFVENIX1RZUEUoczY0LCB1NjQsIDEpLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHg4LCAgdTgsICB1OCwgIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHgxNiwgdTE2LCB1MTYsIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHgzMiwgdTMyLCB1MzIsIDApLAorCUFTU0lHTl9GRVRDSF9UWVBFX0FMSUFTKHg2NCwgdTY0LCB1NjQsIDApLAogCiAJQVNTSUdOX0ZFVENIX1RZUEVfRU5ECiB9OwpAQCAtNDI3LDEwICs0MzEsNiBAQAogCQlwcl9pbmZvKCJQcm9iZSBwb2ludCBpcyBub3Qgc3BlY2lmaWVkLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoaXNkaWdpdChhcmd2WzFdWzBdKSkgewotCQlwcl9pbmZvKCJwcm9iZSBwb2ludCBtdXN0IGJlIGhhdmUgYSBmaWxlbmFtZS5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAJYXJnID0gc3RyY2hyKGFyZ3ZbMV0sICc6Jyk7CiAJaWYgKCFhcmcpIHsKIAkJcmV0ID0gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2tlcm5lbC91Y291bnQuYyBiL2tlcm5lbC91Y291bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDIwZDVkCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3Vjb3VudC5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlCisgKiAgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+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+bnMpOwogCWtmcmVlKG5zKTsKQEAgLTEzMCwxMCArMTU0LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnV0c25zX293bmVyKHN0cnVjdCBuc19jb21tb24gKm5zKQoreworCXJldHVybiB0b191dHNfbnMobnMpLT51c2VyX25zOworfQorCiBjb25zdCBzdHJ1Y3QgcHJvY19uc19vcGVyYXRpb25zIHV0c25zX29wZXJhdGlvbnMgPSB7CiAJLm5hbWUJCT0gInV0cyIsCiAJLnR5cGUJCT0gQ0xPTkVfTkVXVVRTLAogCS5nZXQJCT0gdXRzbnNfZ2V0LAogCS5wdXQJCT0gdXRzbnNfcHV0LAogCS5pbnN0YWxsCT0gdXRzbnNfaW5zdGFsbCwKKwkub3duZXIJCT0gdXRzbnNfb3duZXIsCiB9OwpkaWZmIC0tZ2l0IGEva2VybmVsL3dvcmtxdWV1ZS5jIGIva2VybmVsL3dvcmtxdWV1ZS5jCmluZGV4IGVmMDcxY2EuLmJkODFmMDMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93b3JrcXVldWUuYworKysgYi9rZXJuZWwvd29ya3F1ZXVlLmMKQEAgLTI5NzQsNiArMjk3NCwzMSBAQAogfQogRVhQT1JUX1NZTUJPTChmbHVzaF9kZWxheWVkX3dvcmspOwogCitzdGF0aWMgYm9vbCBfX2NhbmNlbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywgYm9vbCBpc19kd29yaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlkbyB7CisJCXJldCA9IHRyeV90b19ncmFiX3BlbmRpbmcod29yaywgaXNfZHdvcmssICZmbGFncyk7CisJfSB3aGlsZSAodW5saWtlbHkocmV0ID09IC1FQUdBSU4pKTsKKworCWlmICh1bmxpa2VseShyZXQgPCAwKSkKKwkJcmV0dXJuIGZhbHNlOworCisJc2V0X3dvcmtfcG9vbF9hbmRfY2xlYXJfcGVuZGluZyh3b3JrLCBnZXRfd29ya19wb29sX2lkKHdvcmspKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFNlZSBjYW5jZWxfZGVsYXllZF93b3JrKCkKKyAqLworYm9vbCBjYW5jZWxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJcmV0dXJuIF9fY2FuY2VsX3dvcmsod29yaywgZmFsc2UpOworfQorCiAvKioKICAqIGNhbmNlbF9kZWxheWVkX3dvcmsgLSBjYW5jZWwgYSBkZWxheWVkIHdvcmsKICAqIEBkd29yazogZGVsYXllZF93b3JrIHRvIGNhbmNlbApAQCAtMjk5MiwyMCArMzAxNyw3IEBACiAgKi8KIGJvb2wgY2FuY2VsX2RlbGF5ZWRfd29yayhzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yaykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0KLQlkbyB7Ci0JCXJldCA9IHRyeV90b19ncmFiX3BlbmRpbmcoJmR3b3JrLT53b3JrLCB0cnVlLCAmZmxhZ3MpOwotCX0gd2hpbGUgKHVubGlrZWx5KHJldCA9PSAtRUFHQUlOKSk7Ci0KLQlpZiAodW5saWtlbHkocmV0IDwgMCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXNldF93b3JrX3Bvb2xfYW5kX2NsZWFyX3BlbmRpbmcoJmR3b3JrLT53b3JrLAotCQkJCQlnZXRfd29ya19wb29sX2lkKCZkd29yay0+d29yaykpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBfX2NhbmNlbF93b3JrKCZkd29yay0+d29yaywgdHJ1ZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGNhbmNlbF9kZWxheWVkX3dvcmspOwogCmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZyBiL2xpYi9LY29uZmlnCmluZGV4IGQ3OTkwOWQuLjk0MmZiODAgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnCisrKyBiL2xpYi9LY29uZmlnCkBAIC01NTAsNCArNTUwLDcgQEAKIAlib29sCiAJc2VsZWN0IFNUQUNLVFJBQ0UKIAorY29uZmlnIFNCSVRNQVAKKwlib29sCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggMjMwN2Q3Yy4uMzlkMDdlNyAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTMwNSw3ICszMDUsNyBAQAogCSAgICBhIGxhcmdlciBrZXJuZWwpLgogCSAgLSBSdW4gdGhlIHNlY3Rpb24gbWlzbWF0Y2ggYW5hbHlzaXMgZm9yIGVhY2ggbW9kdWxlL2J1aWx0LWluLm8gZmlsZS4KIAkgICAgV2hlbiB3ZSBydW4gdGhlIHNlY3Rpb24gbWlzbWF0Y2ggYW5hbHlzaXMgb24gdm1saW51eC5vLCB3ZQotCSAgICBsb3NlIHZhbHVlYmxlIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZSBtaXNtYXRjaCB3YXMKKwkgICAgbG9zZSB2YWx1YWJsZSBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGUgbWlzbWF0Y2ggd2FzCiAJICAgIGludHJvZHVjZWQuCiAJICAgIFJ1bm5pbmcgdGhlIGFuYWx5c2lzIGZvciBlYWNoIG1vZHVsZS9idWlsdC1pbi5vIGZpbGUKIAkgICAgdGVsbHMgd2hlcmUgdGhlIG1pc21hdGNoIGhhcHBlbnMgbXVjaCBjbG9zZXIgdG8gdGhlCkBAIC04MjEsNyArODIxLDcgQEAKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUga2VybmVsIHRvIGRldGVjdCAiaHVuZyB0YXNrcyIsCiAJICB3aGljaCBhcmUgYnVncyB0aGF0IGNhdXNlIHRoZSB0YXNrIHRvIGJlIHN0dWNrIGluCi0JICB1bmludGVycnVwdGlibGUgIkQiIHN0YXRlIGluZGVmaW5pdGlsZXkuCisJICB1bmludGVycnVwdGlibGUgIkQiIHN0YXRlIGluZGVmaW5pdGVseS4KIAogCSAgV2hlbiBhIGh1bmcgdGFzayBpcyBkZXRlY3RlZCwgdGhlIGtlcm5lbCB3aWxsIHByaW50IHRoZQogCSAgY3VycmVudCBzdGFjayB0cmFjZSAod2hpY2ggeW91IHNob3VsZCByZXBvcnQpLCBidXQgdGhlCkBAIC0xNjg2LDI0ICsxNjg2LDYgQEAKIAkgIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIExhdGVuY3lUT1AgdG9vbAogCSAgdG8gZmluZCBvdXQgd2hpY2ggdXNlcnNwYWNlIGlzIGJsb2NraW5nIG9uIHdoYXQga2VybmVsIG9wZXJhdGlvbnMuCiAKLWNvbmZpZyBBUkNIX0hBU19ERUJVR19TVFJJQ1RfVVNFUl9DT1BZX0NIRUNLUwotCWJvb2wKLQotY29uZmlnIERFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCi0JYm9vbCAiU3RyaWN0IHVzZXIgY29weSBzaXplIGNoZWNrcyIKLQlkZXBlbmRzIG9uIEFSQ0hfSEFTX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCi0JZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgIVRSQUNFX0JSQU5DSF9QUk9GSUxJTkcKLQloZWxwCi0JICBFbmFibGluZyB0aGlzIG9wdGlvbiB0dXJucyBhIGNlcnRhaW4gc2V0IG9mIHNhbml0eSBjaGVja3MgZm9yIHVzZXIKLQkgIGNvcHkgb3BlcmF0aW9ucyBpbnRvIGNvbXBpbGUgdGltZSBmYWlsdXJlcy4KLQotCSAgVGhlIGNvcHlfZnJvbV91c2VyKCkgZXRjIGNoZWNrcyBhcmUgdGhlcmUgdG8gaGVscCB0ZXN0IGlmIHRoZXJlCi0JICBhcmUgc3VmZmljaWVudCBzZWN1cml0eSBjaGVja3Mgb24gdGhlIGxlbmd0aCBhcmd1bWVudCBvZgotCSAgdGhlIGNvcHkgb3BlcmF0aW9uLCBieSBoYXZpbmcgZ2NjIHByb3ZlIHRoYXQgdGhlIGFyZ3VtZW50IGlzCi0JICB3aXRoaW4gYm91bmRzLgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCiBzb3VyY2Uga2VybmVsL3RyYWNlL0tjb25maWcKIAogbWVudSAiUnVudGltZSBUZXN0aW5nIgpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcudWJzYW4gYi9saWIvS2NvbmZpZy51YnNhbgppbmRleCAzOTQ5NGFmLi5iYzZlNjUxIDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy51YnNhbgorKysgYi9saWIvS2NvbmZpZy51YnNhbgpAQCAtMSw2ICsxLDkgQEAKIGNvbmZpZyBBUkNIX0hBU19VQlNBTl9TQU5JVElaRV9BTEwKIAlib29sCiAKK2NvbmZpZyBBUkNIX1dBTlRTX1VCU0FOX05PX05VTEwKKwlkZWZfYm9vbCBuCisKIGNvbmZpZyBVQlNBTgogCWJvb2wgIlVuZGVmaW5lZCBiZWhhdmlvdXIgc2FuaXR5IGNoZWNrZXIiCiAJaGVscApAQCAtMzQsMyArMzcsMTEgQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZGV0ZWN0aW9uIG9mIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMuCiAJICBFbmFibGluZyB0aGlzIG9wdGlvbiBvbiBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCB1bmFsaWduZWQKIAkgIGFjY2Vzc2VzIG1heSBwcm9kdWNlIGEgbG90IG9mIGZhbHNlIHBvc2l0aXZlcy4KKworY29uZmlnIFVCU0FOX05VTEwKKwlib29sICJFbmFibGUgY2hlY2tpbmcgb2YgbnVsbCBwb2ludGVycyIKKwlkZXBlbmRzIG9uIFVCU0FOCisJZGVmYXVsdCB5IGlmICFBUkNIX1dBTlRTX1VCU0FOX05PX05VTEwKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRldGVjdGlvbiBvZiBtZW1vcnkgYWNjZXNzZXMgdmlhIGEKKwkgIG51bGwgcG9pbnRlci4KZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCBjZmE2OGViLi5mM2NhOGMwIDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC0yMiw5ICsyMiw4IEBACiAJIHNoYTEubyBjaGFjaGEyMC5vIG1kNS5vIGlycV9yZWdzLm8gYXJndl9zcGxpdC5vIFwKIAkgZmxleF9wcm9wb3J0aW9ucy5vIHJhdGVsaW1pdC5vIHNob3dfbWVtLm8gXAogCSBpc19zaW5nbGVfdGhyZWFkZWQubyBwbGlzdC5vIGRlY29tcHJlc3MubyBrb2JqZWN0X3VldmVudC5vIFwKLQkgZWFybHljcGlvLm8gc2VxX2J1Zi5vIG5taV9iYWNrdHJhY2UubyBub2RlbWFzay5vCisJIGVhcmx5Y3Bpby5vIHNlcV9idWYubyBubWlfYmFja3RyYWNlLm8gbm9kZW1hc2subyB3aW5fbWlubWF4Lm8KIAotb2JqLSQoQ09ORklHX0FSQ0hfSEFTX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTKSArPSB1c2VyY29weS5vCiBsaWItJChDT05GSUdfTU1VKSArPSBpb3JlbWFwLm8KIGxpYi0kKENPTkZJR19TTVApICs9IGNwdW1hc2subwogbGliLSQoQ09ORklHX0hBU19ETUEpICs9IGRtYS1ub29wLm8KQEAgLTIyOCwzICsyMjcsNSBAQAogb2JqLSQoQ09ORklHX1VCU0FOKSArPSB1YnNhbi5vCiAKIFVCU0FOX1NBTklUSVpFX3Vic2FuLm8gOj0gbgorCitvYmotJChDT05GSUdfU0JJVE1BUCkgKz0gc2JpdG1hcC5vCmRpZmYgLS1naXQgYS9saWIvY3B1LW5vdGlmaWVyLWVycm9yLWluamVjdC5jIGIvbGliL2NwdS1ub3RpZmllci1lcnJvci1pbmplY3QuYwppbmRleCA3MDdjYTI0Li4wZTJjOWExIDEwMDY0NAotLS0gYS9saWIvY3B1LW5vdGlmaWVyLWVycm9yLWluamVjdC5jCisrKyBiL2xpYi9jcHUtbm90aWZpZXItZXJyb3ItaW5qZWN0LmMKQEAgLTgsMTYgKzgsNDcgQEAKIG1vZHVsZV9wYXJhbShwcmlvcml0eSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocHJpb3JpdHksICJzcGVjaWZ5IGNwdSBub3RpZmllciBwcmlvcml0eSIpOwogCisjZGVmaW5lIFVQX1BSRVBBUkUgMAorI2RlZmluZSBVUF9QUkVQQVJFX0ZST1pFTiAwCisjZGVmaW5lIERPV05fUFJFUEFSRSAwCisjZGVmaW5lIERPV05fUFJFUEFSRV9GUk9aRU4gMAorCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Vycl9pbmplY3QgY3B1X25vdGlmaWVyX2Vycl9pbmplY3QgPSB7CiAJLmFjdGlvbnMgPSB7Ci0JCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oQ1BVX1VQX1BSRVBBUkUpIH0sCi0JCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oQ1BVX1VQX1BSRVBBUkVfRlJPWkVOKSB9LAotCQl7IE5PVElGSUVSX0VSUl9JTkpFQ1RfQUNUSU9OKENQVV9ET1dOX1BSRVBBUkUpIH0sCi0JCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU4pIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oVVBfUFJFUEFSRSkgfSwKKwkJeyBOT1RJRklFUl9FUlJfSU5KRUNUX0FDVElPTihVUF9QUkVQQVJFX0ZST1pFTikgfSwKKwkJeyBOT1RJRklFUl9FUlJfSU5KRUNUX0FDVElPTihET1dOX1BSRVBBUkUpIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oRE9XTl9QUkVQQVJFX0ZST1pFTikgfSwKIAkJe30KIAl9CiB9OwogCitzdGF0aWMgaW50IG5vdGZfZXJyX2hhbmRsZShzdHJ1Y3Qgbm90aWZpZXJfZXJyX2luamVjdF9hY3Rpb24gKmFjdGlvbikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gYWN0aW9uLT5lcnJvcjsKKwlpZiAocmV0KQorCQlwcl9pbmZvKCJJbmplY3RpbmcgZXJyb3IgKCVkKSB0byAlc1xuIiwgcmV0LCBhY3Rpb24tPm5hbWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbm90Zl9lcnJfaW5qX3VwX3ByZXBhcmUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpZiAoIWNwdWhwX3Rhc2tzX2Zyb3plbikKKwkJcmV0dXJuIG5vdGZfZXJyX2hhbmRsZSgmY3B1X25vdGlmaWVyX2Vycl9pbmplY3QuYWN0aW9uc1swXSk7CisJZWxzZQorCQlyZXR1cm4gbm90Zl9lcnJfaGFuZGxlKCZjcHVfbm90aWZpZXJfZXJyX2luamVjdC5hY3Rpb25zWzFdKTsKK30KKworc3RhdGljIGludCBub3RmX2Vycl9pbmpfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWlmICghY3B1aHBfdGFza3NfZnJvemVuKQorCQlyZXR1cm4gbm90Zl9lcnJfaGFuZGxlKCZjcHVfbm90aWZpZXJfZXJyX2luamVjdC5hY3Rpb25zWzJdKTsKKwllbHNlCisJCXJldHVybiBub3RmX2Vycl9oYW5kbGUoJmNwdV9ub3RpZmllcl9lcnJfaW5qZWN0LmFjdGlvbnNbM10pOworfQorCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGlyOwogCiBzdGF0aWMgaW50IGVycl9pbmplY3RfaW5pdCh2b2lkKQpAQCAtMjksNyArNjAsMTAgQEAKIAlpZiAoSVNfRVJSKGRpcikpCiAJCXJldHVybiBQVFJfRVJSKGRpcik7CiAKLQllcnIgPSByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmNwdV9ub3RpZmllcl9lcnJfaW5qZWN0Lm5iKTsKKwllcnIgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX05PVEZfRVJSX0lOSl9QUkVQQVJFLAorCQkJCQkiY3B1LWVyci1ub3RpZjpwcmVwYXJlIiwKKwkJCQkJbm90Zl9lcnJfaW5qX3VwX3ByZXBhcmUsCisJCQkJCW5vdGZfZXJyX2lual9kZWFkKTsKIAlpZiAoZXJyKQogCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKIApAQCAtMzgsNyArNzIsNyBAQAogCiBzdGF0aWMgdm9pZCBlcnJfaW5qZWN0X2V4aXQodm9pZCkKIHsKLQl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmY3B1X25vdGlmaWVyX2Vycl9pbmplY3QubmIpOworCWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKENQVUhQX05PVEZfRVJSX0lOSl9QUkVQQVJFKTsKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL2RtYS1kZWJ1Zy5jIGIvbGliL2RtYS1kZWJ1Zy5jCmluZGV4IGZjZmExOTMuLjg5NzEzNzAgMTAwNjQ0Ci0tLSBhL2xpYi9kbWEtZGVidWcuYworKysgYi9saWIvZG1hLWRlYnVnLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLWRlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KQEAgLTQzLDYgKzQ0LDcgQEAKIAlkbWFfZGVidWdfcGFnZSwKIAlkbWFfZGVidWdfc2csCiAJZG1hX2RlYnVnX2NvaGVyZW50LAorCWRtYV9kZWJ1Z19yZXNvdXJjZSwKIH07CiAKIGVudW0gbWFwX2Vycl90eXBlcyB7CkBAIC0xNTAsOCArMTUyLDkgQEAKIAlbTUFQX0VSUl9DSEVDS0VEXSA9ICJkbWEgbWFwIGVycm9yIGNoZWNrZWQiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKnR5cGUybmFtZVs0XSA9IHsgInNpbmdsZSIsICJwYWdlIiwKLQkJCQkgICAgInNjYXRoZXItZ2F0aGVyIiwgImNvaGVyZW50IiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKnR5cGUybmFtZVs1XSA9IHsgInNpbmdsZSIsICJwYWdlIiwKKwkJCQkgICAgInNjYXRoZXItZ2F0aGVyIiwgImNvaGVyZW50IiwKKwkJCQkgICAgInJlc291cmNlIiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqZGlyMm5hbWVbNF0gPSB7ICJETUFfQklESVJFQ1RJT05BTCIsICJETUFfVE9fREVWSUNFIiwKIAkJCQkgICAiRE1BX0ZST01fREVWSUNFIiwgIkRNQV9OT05FIiB9OwpAQCAtMzk5LDYgKzQwMiw5IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgcGh5c19hZGRyKHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5KQogeworCWlmIChlbnRyeS0+dHlwZSA9PSBkbWFfZGVidWdfcmVzb3VyY2UpCisJCXJldHVybiBfX3Bmbl90b19waHlzKGVudHJ5LT5wZm4pICsgZW50cnktPm9mZnNldDsKKwogCXJldHVybiBwYWdlX3RvX3BoeXMocGZuX3RvX3BhZ2UoZW50cnktPnBmbikpICsgZW50cnktPm9mZnNldDsKIH0KIApAQCAtMTE2NCwxMSArMTE3MCwzMiBAQAogCXB1dF9oYXNoX2J1Y2tldChidWNrZXQsICZmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGNoZWNrX2Zvcl9zdGFjayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCitzdGF0aWMgdm9pZCBjaGVja19mb3Jfc3RhY2soc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0KQogewotCWlmIChvYmplY3RfaXNfb25fc3RhY2soYWRkcikpCi0JCWVycl9wcmludGsoZGV2LCBOVUxMLCAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciBtYXBzIG1lbW9yeSBmcm9tICIKLQkJCQkic3RhY2sgW2FkZHI9JXBdXG4iLCBhZGRyKTsKKwl2b2lkICphZGRyOworCXN0cnVjdCB2bV9zdHJ1Y3QgKnN0YWNrX3ZtX2FyZWEgPSB0YXNrX3N0YWNrX3ZtX2FyZWEoY3VycmVudCk7CisKKwlpZiAoIXN0YWNrX3ZtX2FyZWEpIHsKKwkJLyogU3RhY2sgaXMgZGlyZWN0LW1hcHBlZC4gKi8KKwkJaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpKQorCQkJcmV0dXJuOworCQlhZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0OworCQlpZiAob2JqZWN0X2lzX29uX3N0YWNrKGFkZHIpKQorCQkJZXJyX3ByaW50ayhkZXYsIE5VTEwsICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIG1hcHMgbWVtb3J5IGZyb20gc3RhY2sgW2FkZHI9JXBdXG4iLCBhZGRyKTsKKwl9IGVsc2UgeworCQkvKiBTdGFjayBpcyB2bWFsbG9jZWQuICovCisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBzdGFja192bV9hcmVhLT5ucl9wYWdlczsgaSsrKSB7CisJCQlpZiAocGFnZSAhPSBzdGFja192bV9hcmVhLT5wYWdlc1tpXSkKKwkJCQljb250aW51ZTsKKworCQkJYWRkciA9ICh1OCAqKWN1cnJlbnQtPnN0YWNrICsgaSAqIFBBR0VfU0laRSArIG9mZnNldDsKKwkJCWVycl9wcmludGsoZGV2LCBOVUxMLCAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciBtYXBzIG1lbW9yeSBmcm9tIHN0YWNrIFtwcm9iYWJsZSBhZGRyPSVwXVxuIiwgYWRkcik7CisJCQlicmVhazsKKwkJfQorCX0KIH0KIAogc3RhdGljIGlubGluZSBib29sIG92ZXJsYXAodm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpCkBAIC0xMjkxLDEwICsxMzE4LDExIEBACiAJaWYgKG1hcF9zaW5nbGUpCiAJCWVudHJ5LT50eXBlID0gZG1hX2RlYnVnX3NpbmdsZTsKIAorCWNoZWNrX2Zvcl9zdGFjayhkZXYsIHBhZ2UsIG9mZnNldCk7CisKIAlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CiAJCXZvaWQgKmFkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQ7CiAKLQkJY2hlY2tfZm9yX3N0YWNrKGRldiwgYWRkcik7CiAJCWNoZWNrX2Zvcl9pbGxlZ2FsX2FyZWEoZGV2LCBhZGRyLCBzaXplKTsKIAl9CiAKQEAgLTEzODYsOCArMTQxNCw5IEBACiAJCWVudHJ5LT5zZ19jYWxsX2VudHMgICA9IG5lbnRzOwogCQllbnRyeS0+c2dfbWFwcGVkX2VudHMgPSBtYXBwZWRfZW50czsKIAorCQljaGVja19mb3Jfc3RhY2soZGV2LCBzZ19wYWdlKHMpLCBzLT5vZmZzZXQpOworCiAJCWlmICghUGFnZUhpZ2hNZW0oc2dfcGFnZShzKSkpIHsKLQkJCWNoZWNrX2Zvcl9zdGFjayhkZXYsIHNnX3ZpcnQocykpOwogCQkJY2hlY2tfZm9yX2lsbGVnYWxfYXJlYShkZXYsIHNnX3ZpcnQocyksIHNnX2RtYV9sZW4ocykpOwogCQl9CiAKQEAgLTE0OTUsNiArMTUyNCw0OSBAQAogfQogRVhQT1JUX1NZTUJPTChkZWJ1Z19kbWFfZnJlZV9jb2hlcmVudCk7CiAKK3ZvaWQgZGVidWdfZG1hX21hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBoeXNfYWRkcl90IGFkZHIsIHNpemVfdCBzaXplLAorCQkJICAgIGludCBkaXJlY3Rpb24sIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnk7CisKKwlpZiAodW5saWtlbHkoZG1hX2RlYnVnX2Rpc2FibGVkKCkpKQorCQlyZXR1cm47CisKKwllbnRyeSA9IGRtYV9lbnRyeV9hbGxvYygpOworCWlmICghZW50cnkpCisJCXJldHVybjsKKworCWVudHJ5LT50eXBlCQk9IGRtYV9kZWJ1Z19yZXNvdXJjZTsKKwllbnRyeS0+ZGV2CQk9IGRldjsKKwllbnRyeS0+cGZuCQk9IFBIWVNfUEZOKGFkZHIpOworCWVudHJ5LT5vZmZzZXQJCT0gb2Zmc2V0X2luX3BhZ2UoYWRkcik7CisJZW50cnktPnNpemUJCT0gc2l6ZTsKKwllbnRyeS0+ZGV2X2FkZHIJCT0gZG1hX2FkZHI7CisJZW50cnktPmRpcmVjdGlvbgk9IGRpcmVjdGlvbjsKKwllbnRyeS0+bWFwX2Vycl90eXBlCT0gTUFQX0VSUl9OT1RfQ0hFQ0tFRDsKKworCWFkZF9kbWFfZW50cnkoZW50cnkpOworfQorRVhQT1JUX1NZTUJPTChkZWJ1Z19kbWFfbWFwX3Jlc291cmNlKTsKKwordm9pZCBkZWJ1Z19kbWFfdW5tYXBfcmVzb3VyY2Uoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJICAgICAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24pCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSByZWYgPSB7CisJCS50eXBlICAgICAgICAgICA9IGRtYV9kZWJ1Z19yZXNvdXJjZSwKKwkJLmRldiAgICAgICAgICAgID0gZGV2LAorCQkuZGV2X2FkZHIgICAgICAgPSBkbWFfYWRkciwKKwkJLnNpemUgICAgICAgICAgID0gc2l6ZSwKKwkJLmRpcmVjdGlvbiAgICAgID0gZGlyZWN0aW9uLAorCX07CisKKwlpZiAodW5saWtlbHkoZG1hX2RlYnVnX2Rpc2FibGVkKCkpKQorCQlyZXR1cm47CisKKwljaGVja191bm1hcCgmcmVmKTsKK30KK0VYUE9SVF9TWU1CT0woZGVidWdfZG1hX3VubWFwX3Jlc291cmNlKTsKKwogdm9pZCBkZWJ1Z19kbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwKIAkJCQkgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKIHsKZGlmZiAtLWdpdCBhL2xpYi9pb3ZfaXRlci5jIGIvbGliL2lvdl9pdGVyLmMKaW5kZXggOWU4YzczOC4uNDhiOGMyNyAxMDA2NDQKLS0tIGEvbGliL2lvdl9pdGVyLmMKKysrIGIvbGliL2lvdl9pdGVyLmMKQEAgLTMsOCArMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwbGljZS5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogCisjZGVmaW5lIFBJUEVfUEFSQU5PSUEgLyogZm9yIG5vdyAqLworCiAjZGVmaW5lIGl0ZXJhdGVfaW92ZWMoaSwgbiwgX192LCBfX3AsIHNraXAsIFNURVApIHsJXAogCXNpemVfdCBsZWZ0OwkJCQkJXAogCXNpemVfdCB3YW50ZWQgPSBuOwkJCQlcCkBAIC0yOTAsMjUgKzI5Myw5MiBAQAogCXJldHVybiB3YW50ZWQgLSBieXRlczsKIH0KIAotLyoKLSAqIEZhdWx0IGluIHRoZSBmaXJzdCBpb3ZlYyBvZiB0aGUgZ2l2ZW4gaW92X2l0ZXIsIHRvIGEgbWF4aW11bSBsZW5ndGgKLSAqIG9mIGJ5dGVzLiBSZXR1cm5zIDAgb24gc3VjY2Vzcywgb3Igbm9uLXplcm8gaWYgdGhlIG1lbW9yeSBjb3VsZCBub3QgYmUKLSAqIGFjY2Vzc2VkIChpZS4gYmVjYXVzZSBpdCBpcyBhbiBpbnZhbGlkIGFkZHJlc3MpLgotICoKLSAqIHdyaXRldi1pbnRlbnNpdmUgY29kZSBtYXkgd2FudCB0aGlzIHRvIHByZWZhdWx0IHNldmVyYWwgaW92ZWNzIC0tIHRoYXQKLSAqIHdvdWxkIGJlIHBvc3NpYmxlIChjYWxsZXJzIG11c3Qgbm90IHJlbHkgb24gdGhlIGZhY3QgdGhhdCBfb25seV8gdGhlCi0gKiBmaXJzdCBpb3ZlYyB3aWxsIGJlIGZhdWx0ZWQgd2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbikuCi0gKi8KLWludCBpb3ZfaXRlcl9mYXVsdF9pbl9yZWFkYWJsZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcykKKyNpZmRlZiBQSVBFX1BBUkFOT0lBCitzdGF0aWMgYm9vbCBzYW5pdHkoY29uc3Qgc3RydWN0IGlvdl9pdGVyICppKQogewotCWlmICghKGktPnR5cGUgJiAoSVRFUl9CVkVDfElURVJfS1ZFQykpKSB7Ci0JCWNoYXIgX191c2VyICpidWYgPSBpLT5pb3YtPmlvdl9iYXNlICsgaS0+aW92X29mZnNldDsKLQkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGktPmlvdi0+aW92X2xlbiAtIGktPmlvdl9vZmZzZXQpOwotCQlyZXR1cm4gZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBieXRlcyk7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGktPnBpcGU7CisJaW50IGlkeCA9IGktPmlkeDsKKwlpbnQgbmV4dCA9IHBpcGUtPmN1cmJ1ZiArIHBpcGUtPm5yYnVmczsKKwlpZiAoaS0+aW92X29mZnNldCkgeworCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKnA7CisJCWlmICh1bmxpa2VseSghcGlwZS0+bnJidWZzKSkKKwkJCWdvdG8gQmFkOwkvLyBwaXBlIG11c3QgYmUgbm9uLWVtcHR5CisJCWlmICh1bmxpa2VseShpZHggIT0gKChuZXh0IC0gMSkgJiAocGlwZS0+YnVmZmVycyAtIDEpKSkpCisJCQlnb3RvIEJhZDsJLy8gbXVzdCBiZSBhdCB0aGUgbGFzdCBidWZmZXIuLi4KKworCQlwID0gJnBpcGUtPmJ1ZnNbaWR4XTsKKwkJaWYgKHVubGlrZWx5KHAtPm9mZnNldCArIHAtPmxlbiAhPSBpLT5pb3Zfb2Zmc2V0KSkKKwkJCWdvdG8gQmFkOwkvLyAuLi4gYXQgdGhlIGVuZCBvZiBzZWdtZW50CisJfSBlbHNlIHsKKwkJaWYgKGlkeCAhPSAobmV4dCAmIChwaXBlLT5idWZmZXJzIC0gMSkpKQorCQkJZ290byBCYWQ7CS8vIG11c3QgYmUgcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgYnVmZmVyCiAJfQotCXJldHVybiAwOworCXJldHVybiB0cnVlOworQmFkOgorCXByaW50ayhLRVJOX0VSUiAiaWR4ID0gJWQsIG9mZnNldCA9ICV6ZFxuIiwgaS0+aWR4LCBpLT5pb3Zfb2Zmc2V0KTsKKwlwcmludGsoS0VSTl9FUlIgImN1cmJ1ZiA9ICVkLCBucmJ1ZnMgPSAlZCwgYnVmZmVycyA9ICVkXG4iLAorCQkJcGlwZS0+Y3VyYnVmLCBwaXBlLT5ucmJ1ZnMsIHBpcGUtPmJ1ZmZlcnMpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgcGlwZS0+YnVmZmVyczsgaWR4KyspCisJCXByaW50ayhLRVJOX0VSUiAiWyVwICVwICVkICVkXVxuIiwKKwkJCXBpcGUtPmJ1ZnNbaWR4XS5vcHMsCisJCQlwaXBlLT5idWZzW2lkeF0ucGFnZSwKKwkJCXBpcGUtPmJ1ZnNbaWR4XS5vZmZzZXQsCisJCQlwaXBlLT5idWZzW2lkeF0ubGVuKTsKKwlXQVJOX09OKDEpOworCXJldHVybiBmYWxzZTsKIH0KLUVYUE9SVF9TWU1CT0woaW92X2l0ZXJfZmF1bHRfaW5fcmVhZGFibGUpOworI2Vsc2UKKyNkZWZpbmUgc2FuaXR5KGkpIHRydWUKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBuZXh0X2lkeChpbnQgaWR4LCBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlKQoreworCXJldHVybiAoaWR4ICsgMSkgJiAocGlwZS0+YnVmZmVycyAtIDEpOworfQorCitzdGF0aWMgc2l6ZV90IGNvcHlfcGFnZV90b19pdGVyX3BpcGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBieXRlcywKKwkJCSBzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGktPnBpcGU7CisJc3RydWN0IHBpcGVfYnVmZmVyICpidWY7CisJc2l6ZV90IG9mZjsKKwlpbnQgaWR4OworCisJaWYgKHVubGlrZWx5KGJ5dGVzID4gaS0+Y291bnQpKQorCQlieXRlcyA9IGktPmNvdW50OworCisJaWYgKHVubGlrZWx5KCFieXRlcykpCisJCXJldHVybiAwOworCisJaWYgKCFzYW5pdHkoaSkpCisJCXJldHVybiAwOworCisJb2ZmID0gaS0+aW92X29mZnNldDsKKwlpZHggPSBpLT5pZHg7CisJYnVmID0gJnBpcGUtPmJ1ZnNbaWR4XTsKKwlpZiAob2ZmKSB7CisJCWlmIChvZmZzZXQgPT0gb2ZmICYmIGJ1Zi0+cGFnZSA9PSBwYWdlKSB7CisJCQkvKiBtZXJnZSB3aXRoIHRoZSBsYXN0IG9uZSAqLworCQkJYnVmLT5sZW4gKz0gYnl0ZXM7CisJCQlpLT5pb3Zfb2Zmc2V0ICs9IGJ5dGVzOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWR4ID0gbmV4dF9pZHgoaWR4LCBwaXBlKTsKKwkJYnVmID0gJnBpcGUtPmJ1ZnNbaWR4XTsKKwl9CisJaWYgKGlkeCA9PSBwaXBlLT5jdXJidWYgJiYgcGlwZS0+bnJidWZzKQorCQlyZXR1cm4gMDsKKwlwaXBlLT5ucmJ1ZnMrKzsKKwlidWYtPm9wcyA9ICZwYWdlX2NhY2hlX3BpcGVfYnVmX29wczsKKwlnZXRfcGFnZShidWYtPnBhZ2UgPSBwYWdlKTsKKwlidWYtPm9mZnNldCA9IG9mZnNldDsKKwlidWYtPmxlbiA9IGJ5dGVzOworCWktPmlvdl9vZmZzZXQgPSBvZmZzZXQgKyBieXRlczsKKwlpLT5pZHggPSBpZHg7CitvdXQ6CisJaS0+Y291bnQgLT0gYnl0ZXM7CisJcmV0dXJuIGJ5dGVzOworfQogCiAvKgogICogRmF1bHQgaW4gb25lIG9yIG1vcmUgaW92ZWNzIG9mIHRoZSBnaXZlbiBpb3ZfaXRlciwgdG8gYSBtYXhpbXVtIGxlbmd0aCBvZgpAQCAtMzE3LDcgKzM4Nyw3IEBACiAgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBvciBub24temVybyBpZiB0aGUgbWVtb3J5IGNvdWxkIG5vdCBiZSBhY2Nlc3NlZCAoaS5lLgogICogYmVjYXVzZSBpdCBpcyBhbiBpbnZhbGlkIGFkZHJlc3MpLgogICovCi1pbnQgaW92X2l0ZXJfZmF1bHRfaW5fbXVsdGlwYWdlc19yZWFkYWJsZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcykKK2ludCBpb3ZfaXRlcl9mYXVsdF9pbl9yZWFkYWJsZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcykKIHsKIAlzaXplX3Qgc2tpcCA9IGktPmlvdl9vZmZzZXQ7CiAJY29uc3Qgc3RydWN0IGlvdmVjICppb3Y7CkBAIC0zMzQsNyArNDA0LDcgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2ZhdWx0X2luX211bHRpcGFnZXNfcmVhZGFibGUpOworRVhQT1JUX1NZTUJPTChpb3ZfaXRlcl9mYXVsdF9pbl9yZWFkYWJsZSk7CiAKIHZvaWQgaW92X2l0ZXJfaW5pdChzdHJ1Y3QgaW92X2l0ZXIgKmksIGludCBkaXJlY3Rpb24sCiAJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgdW5zaWduZWQgbG9uZyBucl9zZWdzLApAQCAtMzc2LDkgKzQ0Niw5OCBAQAogCWt1bm1hcF9hdG9taWMoYWRkcik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBhbGxvY2F0ZWQoc3RydWN0IHBpcGVfYnVmZmVyICpidWYpCit7CisJcmV0dXJuIGJ1Zi0+b3BzID09ICZkZWZhdWx0X3BpcGVfYnVmX29wczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRhdGFfc3RhcnQoY29uc3Qgc3RydWN0IGlvdl9pdGVyICppLCBpbnQgKmlkeHAsIHNpemVfdCAqb2ZmcCkKK3sKKwlzaXplX3Qgb2ZmID0gaS0+aW92X29mZnNldDsKKwlpbnQgaWR4ID0gaS0+aWR4OworCWlmIChvZmYgJiYgKCFhbGxvY2F0ZWQoJmktPnBpcGUtPmJ1ZnNbaWR4XSkgfHwgb2ZmID09IFBBR0VfU0laRSkpIHsKKwkJaWR4ID0gbmV4dF9pZHgoaWR4LCBpLT5waXBlKTsKKwkJb2ZmID0gMDsKKwl9CisJKmlkeHAgPSBpZHg7CisJKm9mZnAgPSBvZmY7Cit9CisKK3N0YXRpYyBzaXplX3QgcHVzaF9waXBlKHN0cnVjdCBpb3ZfaXRlciAqaSwgc2l6ZV90IHNpemUsCisJCQlpbnQgKmlkeHAsIHNpemVfdCAqb2ZmcCkKK3sKKwlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlID0gaS0+cGlwZTsKKwlzaXplX3Qgb2ZmOworCWludCBpZHg7CisJc3NpemVfdCBsZWZ0OworCisJaWYgKHVubGlrZWx5KHNpemUgPiBpLT5jb3VudCkpCisJCXNpemUgPSBpLT5jb3VudDsKKwlpZiAodW5saWtlbHkoIXNpemUpKQorCQlyZXR1cm4gMDsKKworCWxlZnQgPSBzaXplOworCWRhdGFfc3RhcnQoaSwgJmlkeCwgJm9mZik7CisJKmlkeHAgPSBpZHg7CisJKm9mZnAgPSBvZmY7CisJaWYgKG9mZikgeworCQlsZWZ0IC09IFBBR0VfU0laRSAtIG9mZjsKKwkJaWYgKGxlZnQgPD0gMCkgeworCQkJcGlwZS0+YnVmc1tpZHhdLmxlbiArPSBzaXplOworCQkJcmV0dXJuIHNpemU7CisJCX0KKwkJcGlwZS0+YnVmc1tpZHhdLmxlbiA9IFBBR0VfU0laRTsKKwkJaWR4ID0gbmV4dF9pZHgoaWR4LCBwaXBlKTsKKwl9CisJd2hpbGUgKGlkeCAhPSBwaXBlLT5jdXJidWYgfHwgIXBpcGUtPm5yYnVmcykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX1VTRVIpOworCQlpZiAoIXBhZ2UpCisJCQlicmVhazsKKwkJcGlwZS0+bnJidWZzKys7CisJCXBpcGUtPmJ1ZnNbaWR4XS5vcHMgPSAmZGVmYXVsdF9waXBlX2J1Zl9vcHM7CisJCXBpcGUtPmJ1ZnNbaWR4XS5wYWdlID0gcGFnZTsKKwkJcGlwZS0+YnVmc1tpZHhdLm9mZnNldCA9IDA7CisJCWlmIChsZWZ0IDw9IFBBR0VfU0laRSkgeworCQkJcGlwZS0+YnVmc1tpZHhdLmxlbiA9IGxlZnQ7CisJCQlyZXR1cm4gc2l6ZTsKKwkJfQorCQlwaXBlLT5idWZzW2lkeF0ubGVuID0gUEFHRV9TSVpFOworCQlsZWZ0IC09IFBBR0VfU0laRTsKKwkJaWR4ID0gbmV4dF9pZHgoaWR4LCBwaXBlKTsKKwl9CisJcmV0dXJuIHNpemUgLSBsZWZ0OworfQorCitzdGF0aWMgc2l6ZV90IGNvcHlfcGlwZV90b19pdGVyKGNvbnN0IHZvaWQgKmFkZHIsIHNpemVfdCBieXRlcywKKwkJCQlzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGktPnBpcGU7CisJc2l6ZV90IG4sIG9mZjsKKwlpbnQgaWR4OworCisJaWYgKCFzYW5pdHkoaSkpCisJCXJldHVybiAwOworCisJYnl0ZXMgPSBuID0gcHVzaF9waXBlKGksIGJ5dGVzLCAmaWR4LCAmb2ZmKTsKKwlpZiAodW5saWtlbHkoIW4pKQorCQlyZXR1cm4gMDsKKwlmb3IgKCA7IG47IGlkeCA9IG5leHRfaWR4KGlkeCwgcGlwZSksIG9mZiA9IDApIHsKKwkJc2l6ZV90IGNodW5rID0gbWluX3Qoc2l6ZV90LCBuLCBQQUdFX1NJWkUgLSBvZmYpOworCQltZW1jcHlfdG9fcGFnZShwaXBlLT5idWZzW2lkeF0ucGFnZSwgb2ZmLCBhZGRyLCBjaHVuayk7CisJCWktPmlkeCA9IGlkeDsKKwkJaS0+aW92X29mZnNldCA9IG9mZiArIGNodW5rOworCQluIC09IGNodW5rOworCQlhZGRyICs9IGNodW5rOworCX0KKwlpLT5jb3VudCAtPSBieXRlczsKKwlyZXR1cm4gYnl0ZXM7Cit9CisKIHNpemVfdCBjb3B5X3RvX2l0ZXIoY29uc3Qgdm9pZCAqYWRkciwgc2l6ZV90IGJ5dGVzLCBzdHJ1Y3QgaW92X2l0ZXIgKmkpCiB7CiAJY29uc3QgY2hhciAqZnJvbSA9IGFkZHI7CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKQorCQlyZXR1cm4gY29weV9waXBlX3RvX2l0ZXIoYWRkciwgYnl0ZXMsIGkpOwogCWl0ZXJhdGVfYW5kX2FkdmFuY2UoaSwgYnl0ZXMsIHYsCiAJCV9fY29weV90b191c2VyKHYuaW92X2Jhc2UsIChmcm9tICs9IHYuaW92X2xlbikgLSB2Lmlvdl9sZW4sCiAJCQkgICAgICAgdi5pb3ZfbGVuKSwKQEAgLTM5NCw2ICs1NTMsMTAgQEAKIHNpemVfdCBjb3B5X2Zyb21faXRlcih2b2lkICphZGRyLCBzaXplX3QgYnl0ZXMsIHN0cnVjdCBpb3ZfaXRlciAqaSkKIHsKIAljaGFyICp0byA9IGFkZHI7CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KIAlpdGVyYXRlX2FuZF9hZHZhbmNlKGksIGJ5dGVzLCB2LAogCQlfX2NvcHlfZnJvbV91c2VyKCh0byArPSB2Lmlvdl9sZW4pIC0gdi5pb3ZfbGVuLCB2Lmlvdl9iYXNlLAogCQkJCSB2Lmlvdl9sZW4pLApAQCAtNDA5LDYgKzU3MiwxMCBAQAogc2l6ZV90IGNvcHlfZnJvbV9pdGVyX25vY2FjaGUodm9pZCAqYWRkciwgc2l6ZV90IGJ5dGVzLCBzdHJ1Y3QgaW92X2l0ZXIgKmkpCiB7CiAJY2hhciAqdG8gPSBhZGRyOworCWlmICh1bmxpa2VseShpLT50eXBlICYgSVRFUl9QSVBFKSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gMDsKKwl9CiAJaXRlcmF0ZV9hbmRfYWR2YW5jZShpLCBieXRlcywgdiwKIAkJX19jb3B5X2Zyb21fdXNlcl9ub2NhY2hlKCh0byArPSB2Lmlvdl9sZW4pIC0gdi5pb3ZfbGVuLAogCQkJCQkgdi5pb3ZfYmFzZSwgdi5pb3ZfbGVuKSwKQEAgLTQyOSwxNCArNTk2LDIwIEBACiAJCXNpemVfdCB3YW50ZWQgPSBjb3B5X3RvX2l0ZXIoa2FkZHIgKyBvZmZzZXQsIGJ5dGVzLCBpKTsKIAkJa3VubWFwX2F0b21pYyhrYWRkcik7CiAJCXJldHVybiB3YW50ZWQ7Ci0JfSBlbHNlCisJfSBlbHNlIGlmIChsaWtlbHkoIShpLT50eXBlICYgSVRFUl9QSVBFKSkpCiAJCXJldHVybiBjb3B5X3BhZ2VfdG9faXRlcl9pb3ZlYyhwYWdlLCBvZmZzZXQsIGJ5dGVzLCBpKTsKKwllbHNlCisJCXJldHVybiBjb3B5X3BhZ2VfdG9faXRlcl9waXBlKHBhZ2UsIG9mZnNldCwgYnl0ZXMsIGkpOwogfQogRVhQT1JUX1NZTUJPTChjb3B5X3BhZ2VfdG9faXRlcik7CiAKIHNpemVfdCBjb3B5X3BhZ2VfZnJvbV9pdGVyKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgYnl0ZXMsCiAJCQkgc3RydWN0IGlvdl9pdGVyICppKQogeworCWlmICh1bmxpa2VseShpLT50eXBlICYgSVRFUl9QSVBFKSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gMDsKKwl9CiAJaWYgKGktPnR5cGUgJiAoSVRFUl9CVkVDfElURVJfS1ZFQykpIHsKIAkJdm9pZCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKIAkJc2l6ZV90IHdhbnRlZCA9IGNvcHlfZnJvbV9pdGVyKGthZGRyICsgb2Zmc2V0LCBieXRlcywgaSk7CkBAIC00NDcsOCArNjIwLDM0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNvcHlfcGFnZV9mcm9tX2l0ZXIpOwogCitzdGF0aWMgc2l6ZV90IHBpcGVfemVybyhzaXplX3QgYnl0ZXMsIHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlID0gaS0+cGlwZTsKKwlzaXplX3Qgbiwgb2ZmOworCWludCBpZHg7CisKKwlpZiAoIXNhbml0eShpKSkKKwkJcmV0dXJuIDA7CisKKwlieXRlcyA9IG4gPSBwdXNoX3BpcGUoaSwgYnl0ZXMsICZpZHgsICZvZmYpOworCWlmICh1bmxpa2VseSghbikpCisJCXJldHVybiAwOworCisJZm9yICggOyBuOyBpZHggPSBuZXh0X2lkeChpZHgsIHBpcGUpLCBvZmYgPSAwKSB7CisJCXNpemVfdCBjaHVuayA9IG1pbl90KHNpemVfdCwgbiwgUEFHRV9TSVpFIC0gb2ZmKTsKKwkJbWVtemVyb19wYWdlKHBpcGUtPmJ1ZnNbaWR4XS5wYWdlLCBvZmYsIGNodW5rKTsKKwkJaS0+aWR4ID0gaWR4OworCQlpLT5pb3Zfb2Zmc2V0ID0gb2ZmICsgY2h1bms7CisJCW4gLT0gY2h1bms7CisJfQorCWktPmNvdW50IC09IGJ5dGVzOworCXJldHVybiBieXRlczsKK30KKwogc2l6ZV90IGlvdl9pdGVyX3plcm8oc2l6ZV90IGJ5dGVzLCBzdHJ1Y3QgaW92X2l0ZXIgKmkpCiB7CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKQorCQlyZXR1cm4gcGlwZV96ZXJvKGJ5dGVzLCBpKTsKIAlpdGVyYXRlX2FuZF9hZHZhbmNlKGksIGJ5dGVzLCB2LAogCQlfX2NsZWFyX3VzZXIodi5pb3ZfYmFzZSwgdi5pb3ZfbGVuKSwKIAkJbWVtemVyb19wYWdlKHYuYnZfcGFnZSwgdi5idl9vZmZzZXQsIHYuYnZfbGVuKSwKQEAgLTQ2Myw2ICs2NjIsMTEgQEAKIAkJc3RydWN0IGlvdl9pdGVyICppLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IGJ5dGVzKQogewogCWNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocGFnZSksICpwID0ga2FkZHIgKyBvZmZzZXQ7CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIpOworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gMDsKKwl9CiAJaXRlcmF0ZV9hbGxfa2luZHMoaSwgYnl0ZXMsIHYsCiAJCV9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoKHAgKz0gdi5pb3ZfbGVuKSAtIHYuaW92X2xlbiwKIAkJCQkJICB2Lmlvdl9iYXNlLCB2Lmlvdl9sZW4pLApAQCAtNDc1LDggKzY3OSw0OSBAQAogfQogRVhQT1JUX1NZTUJPTChpb3ZfaXRlcl9jb3B5X2Zyb21fdXNlcl9hdG9taWMpOwogCitzdGF0aWMgdm9pZCBwaXBlX2FkdmFuY2Uoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlID0gaS0+cGlwZTsKKwlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZjsKKwlpbnQgaWR4ID0gaS0+aWR4OworCXNpemVfdCBvZmYgPSBpLT5pb3Zfb2Zmc2V0OworCQorCWlmICh1bmxpa2VseShpLT5jb3VudCA8IHNpemUpKQorCQlzaXplID0gaS0+Y291bnQ7CisKKwlpZiAoc2l6ZSkgeworCQlpZiAob2ZmKSAvKiBtYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgYnVmZmVyICovCisJCQlzaXplICs9IG9mZiAtIHBpcGUtPmJ1ZnNbaWR4XS5vZmZzZXQ7CisJCXdoaWxlICgxKSB7CisJCQlidWYgPSAmcGlwZS0+YnVmc1tpZHhdOworCQkJaWYgKHNpemUgPD0gYnVmLT5sZW4pCisJCQkJYnJlYWs7CisJCQlzaXplIC09IGJ1Zi0+bGVuOworCQkJaWR4ID0gbmV4dF9pZHgoaWR4LCBwaXBlKTsKKwkJfQorCQlidWYtPmxlbiA9IHNpemU7CisJCWktPmlkeCA9IGlkeDsKKwkJb2ZmID0gaS0+aW92X29mZnNldCA9IGJ1Zi0+b2Zmc2V0ICsgc2l6ZTsKKwl9CisJaWYgKG9mZikKKwkJaWR4ID0gbmV4dF9pZHgoaWR4LCBwaXBlKTsKKwlpZiAocGlwZS0+bnJidWZzKSB7CisJCWludCB1bnVzZWQgPSAocGlwZS0+Y3VyYnVmICsgcGlwZS0+bnJidWZzKSAmIChwaXBlLT5idWZmZXJzIC0gMSk7CisJCS8qIFtjdXJidWYsdW51c2VkKSBpcyBpbiB1c2UuICBGcmVlIFtpZHgsdW51c2VkKSAqLworCQl3aGlsZSAoaWR4ICE9IHVudXNlZCkgeworCQkJcGlwZV9idWZfcmVsZWFzZShwaXBlLCAmcGlwZS0+YnVmc1tpZHhdKTsKKwkJCWlkeCA9IG5leHRfaWR4KGlkeCwgcGlwZSk7CisJCQlwaXBlLT5ucmJ1ZnMtLTsKKwkJfQorCX0KK30KKwogdm9pZCBpb3ZfaXRlcl9hZHZhbmNlKHN0cnVjdCBpb3ZfaXRlciAqaSwgc2l6ZV90IHNpemUpCiB7CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCXBpcGVfYWR2YW5jZShpLCBzaXplKTsKKwkJcmV0dXJuOworCX0KIAlpdGVyYXRlX2FuZF9hZHZhbmNlKGksIHNpemUsIHYsIDAsIDAsIDApCiB9CiBFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2FkdmFuY2UpOwpAQCAtNDg2LDYgKzczMSw4IEBACiAgKi8KIHNpemVfdCBpb3ZfaXRlcl9zaW5nbGVfc2VnX2NvdW50KGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaSkKIHsKKwlpZiAodW5saWtlbHkoaS0+dHlwZSAmIElURVJfUElQRSkpCisJCXJldHVybiBpLT5jb3VudDsJLy8gaXQgaXMgYSBzaWxseSBwbGFjZSwgYW55d2F5CiAJaWYgKGktPm5yX3NlZ3MgPT0gMSkKIAkJcmV0dXJuIGktPmNvdW50OwogCWVsc2UgaWYgKGktPnR5cGUgJiBJVEVSX0JWRUMpCkBAIC01MjEsNiArNzY4LDE5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2J2ZWMpOwogCit2b2lkIGlvdl9pdGVyX3BpcGUoc3RydWN0IGlvdl9pdGVyICppLCBpbnQgZGlyZWN0aW9uLAorCQkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKKwkJCXNpemVfdCBjb3VudCkKK3sKKwlCVUdfT04oZGlyZWN0aW9uICE9IElURVJfUElQRSk7CisJaS0+dHlwZSA9IGRpcmVjdGlvbjsKKwlpLT5waXBlID0gcGlwZTsKKwlpLT5pZHggPSAocGlwZS0+Y3VyYnVmICsgcGlwZS0+bnJidWZzKSAmIChwaXBlLT5idWZmZXJzIC0gMSk7CisJaS0+aW92X29mZnNldCA9IDA7CisJaS0+Y291bnQgPSBjb3VudDsKK30KK0VYUE9SVF9TWU1CT0woaW92X2l0ZXJfcGlwZSk7CisKIHVuc2lnbmVkIGxvbmcgaW92X2l0ZXJfYWxpZ25tZW50KGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaSkKIHsKIAl1bnNpZ25lZCBsb25nIHJlcyA9IDA7CkBAIC01MjksNiArNzg5LDExIEBACiAJaWYgKCFzaXplKQogCQlyZXR1cm4gMDsKIAorCWlmICh1bmxpa2VseShpLT50eXBlICYgSVRFUl9QSVBFKSkgeworCQlpZiAoaS0+aW92X29mZnNldCAmJiBhbGxvY2F0ZWQoJmktPnBpcGUtPmJ1ZnNbaS0+aWR4XSkpCisJCQlyZXR1cm4gc2l6ZSB8IGktPmlvdl9vZmZzZXQ7CisJCXJldHVybiBzaXplOworCX0KIAlpdGVyYXRlX2FsbF9raW5kcyhpLCBzaXplLCB2LAogCQkocmVzIHw9ICh1bnNpZ25lZCBsb25nKXYuaW92X2Jhc2UgfCB2Lmlvdl9sZW4sIDApLAogCQlyZXMgfD0gdi5idl9vZmZzZXQgfCB2LmJ2X2xlbiwKQEAgLTU0NSw2ICs4MTAsMTEgQEAKIAlpZiAoIXNpemUpCiAJCXJldHVybiAwOwogCisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiB+MFU7CisJfQorCiAJaXRlcmF0ZV9hbGxfa2luZHMoaSwgc2l6ZSwgdiwKIAkJKHJlcyB8PSAoIXJlcyA/IDAgOiAodW5zaWduZWQgbG9uZyl2Lmlvdl9iYXNlKSB8CiAJCQkoc2l6ZSAhPSB2Lmlvdl9sZW4gPyBzaXplIDogMCksIDApLApAQCAtNTU3LDYgKzgyNyw0NyBAQAogfQogRVhQT1JUX1NZTUJPTChpb3ZfaXRlcl9nYXBfYWxpZ25tZW50KTsKIAorc3RhdGljIGlubGluZSBzaXplX3QgX19waXBlX2dldF9wYWdlcyhzdHJ1Y3QgaW92X2l0ZXIgKmksCisJCQkJc2l6ZV90IG1heHNpemUsCisJCQkJc3RydWN0IHBhZ2UgKipwYWdlcywKKwkJCQlpbnQgaWR4LAorCQkJCXNpemVfdCAqc3RhcnQpCit7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGktPnBpcGU7CisJc2l6ZV90IG4gPSBwdXNoX3BpcGUoaSwgbWF4c2l6ZSwgJmlkeCwgc3RhcnQpOworCWlmICghbikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltYXhzaXplID0gbjsKKwluICs9ICpzdGFydDsKKwl3aGlsZSAobiA+PSBQQUdFX1NJWkUpIHsKKwkJZ2V0X3BhZ2UoKnBhZ2VzKysgPSBwaXBlLT5idWZzW2lkeF0ucGFnZSk7CisJCWlkeCA9IG5leHRfaWR4KGlkeCwgcGlwZSk7CisJCW4gLT0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBtYXhzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBwaXBlX2dldF9wYWdlcyhzdHJ1Y3QgaW92X2l0ZXIgKmksCisJCSAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHNpemVfdCBtYXhzaXplLCB1bnNpZ25lZCBtYXhwYWdlcywKKwkJICAgc2l6ZV90ICpzdGFydCkKK3sKKwl1bnNpZ25lZCBucGFnZXM7CisJc2l6ZV90IGNhcGFjaXR5OworCWludCBpZHg7CisKKwlpZiAoIXNhbml0eShpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkYXRhX3N0YXJ0KGksICZpZHgsIHN0YXJ0KTsKKwkvKiBzb21lIG9mIHRoaXMgb25lICsgYWxsIGFmdGVyIHRoaXMgb25lICovCisJbnBhZ2VzID0gKChpLT5waXBlLT5jdXJidWYgLSBpZHggLSAxKSAmIChpLT5waXBlLT5idWZmZXJzIC0gMSkpICsgMTsKKwljYXBhY2l0eSA9IG1pbihucGFnZXMsbWF4cGFnZXMpICogUEFHRV9TSVpFIC0gKnN0YXJ0OworCisJcmV0dXJuIF9fcGlwZV9nZXRfcGFnZXMoaSwgbWluKG1heHNpemUsIGNhcGFjaXR5KSwgcGFnZXMsIGlkeCwgc3RhcnQpOworfQorCiBzc2l6ZV90IGlvdl9pdGVyX2dldF9wYWdlcyhzdHJ1Y3QgaW92X2l0ZXIgKmksCiAJCSAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHNpemVfdCBtYXhzaXplLCB1bnNpZ25lZCBtYXhwYWdlcywKIAkJICAgc2l6ZV90ICpzdGFydCkKQEAgLTU2Nyw2ICs4NzgsOCBAQAogCWlmICghbWF4c2l6ZSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAodW5saWtlbHkoaS0+dHlwZSAmIElURVJfUElQRSkpCisJCXJldHVybiBwaXBlX2dldF9wYWdlcyhpLCBwYWdlcywgbWF4c2l6ZSwgbWF4cGFnZXMsIHN0YXJ0KTsKIAlpdGVyYXRlX2FsbF9raW5kcyhpLCBtYXhzaXplLCB2LCAoewogCQl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZyl2Lmlvdl9iYXNlOwogCQlzaXplX3QgbGVuID0gdi5pb3ZfbGVuICsgKCpzdGFydCA9IGFkZHIgJiAoUEFHRV9TSVpFIC0gMSkpOwpAQCAtNjAyLDYgKzkxNSwzNyBAQAogCXJldHVybiBwOwogfQogCitzdGF0aWMgc3NpemVfdCBwaXBlX2dldF9wYWdlc19hbGxvYyhzdHJ1Y3QgaW92X2l0ZXIgKmksCisJCSAgIHN0cnVjdCBwYWdlICoqKnBhZ2VzLCBzaXplX3QgbWF4c2l6ZSwKKwkJICAgc2l6ZV90ICpzdGFydCkKK3sKKwlzdHJ1Y3QgcGFnZSAqKnA7CisJc2l6ZV90IG47CisJaW50IGlkeDsKKwlpbnQgbnBhZ2VzOworCisJaWYgKCFzYW5pdHkoaSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZGF0YV9zdGFydChpLCAmaWR4LCBzdGFydCk7CisJLyogc29tZSBvZiB0aGlzIG9uZSArIGFsbCBhZnRlciB0aGlzIG9uZSAqLworCW5wYWdlcyA9ICgoaS0+cGlwZS0+Y3VyYnVmIC0gaWR4IC0gMSkgJiAoaS0+cGlwZS0+YnVmZmVycyAtIDEpKSArIDE7CisJbiA9IG5wYWdlcyAqIFBBR0VfU0laRSAtICpzdGFydDsKKwlpZiAobWF4c2l6ZSA+IG4pCisJCW1heHNpemUgPSBuOworCWVsc2UKKwkJbnBhZ2VzID0gRElWX1JPVU5EX1VQKG1heHNpemUgKyAqc3RhcnQsIFBBR0VfU0laRSk7CisJcCA9IGdldF9wYWdlc19hcnJheShucGFnZXMpOworCWlmICghcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbiA9IF9fcGlwZV9nZXRfcGFnZXMoaSwgbWF4c2l6ZSwgcCwgaWR4LCBzdGFydCk7CisJaWYgKG4gPiAwKQorCQkqcGFnZXMgPSBwOworCWVsc2UKKwkJa3ZmcmVlKHApOworCXJldHVybiBuOworfQorCiBzc2l6ZV90IGlvdl9pdGVyX2dldF9wYWdlc19hbGxvYyhzdHJ1Y3QgaW92X2l0ZXIgKmksCiAJCSAgIHN0cnVjdCBwYWdlICoqKnBhZ2VzLCBzaXplX3QgbWF4c2l6ZSwKIAkJICAgc2l6ZV90ICpzdGFydCkKQEAgLTYxNCw2ICs5NTgsOCBAQAogCWlmICghbWF4c2l6ZSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAodW5saWtlbHkoaS0+dHlwZSAmIElURVJfUElQRSkpCisJCXJldHVybiBwaXBlX2dldF9wYWdlc19hbGxvYyhpLCBwYWdlcywgbWF4c2l6ZSwgc3RhcnQpOwogCWl0ZXJhdGVfYWxsX2tpbmRzKGksIG1heHNpemUsIHYsICh7CiAJCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKXYuaW92X2Jhc2U7CiAJCXNpemVfdCBsZW4gPSB2Lmlvdl9sZW4gKyAoKnN0YXJ0ID0gYWRkciAmIChQQUdFX1NJWkUgLSAxKSk7CkBAIC02NTUsNiArMTAwMSwxMCBAQAogCV9fd3N1bSBzdW0sIG5leHQ7CiAJc2l6ZV90IG9mZiA9IDA7CiAJc3VtID0gKmNzdW07CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KIAlpdGVyYXRlX2FuZF9hZHZhbmNlKGksIGJ5dGVzLCB2LCAoewogCQlpbnQgZXJyID0gMDsKIAkJbmV4dCA9IGNzdW1fYW5kX2NvcHlfZnJvbV91c2VyKHYuaW92X2Jhc2UsIApAQCAtNjkzLDYgKzEwNDMsMTAgQEAKIAlfX3dzdW0gc3VtLCBuZXh0OwogCXNpemVfdCBvZmYgPSAwOwogCXN1bSA9ICpjc3VtOworCWlmICh1bmxpa2VseShpLT50eXBlICYgSVRFUl9QSVBFKSkgeworCQlXQVJOX09OKDEpOwkvKiBmb3Igbm93ICovCisJCXJldHVybiAwOworCX0KIAlpdGVyYXRlX2FuZF9hZHZhbmNlKGksIGJ5dGVzLCB2LCAoewogCQlpbnQgZXJyID0gMDsKIAkJbmV4dCA9IGNzdW1fYW5kX2NvcHlfdG9fdXNlcigoZnJvbSArPSB2Lmlvdl9sZW4pIC0gdi5pb3ZfbGVuLApAQCAtNzMyLDcgKzEwODYsMjAgQEAKIAlpZiAoIXNpemUpCiAJCXJldHVybiAwOwogCi0JaXRlcmF0ZV9hbGxfa2luZHMoaSwgc2l6ZSwgdiwgKHsKKwlpZiAodW5saWtlbHkoaS0+dHlwZSAmIElURVJfUElQRSkpIHsKKwkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGktPnBpcGU7CisJCXNpemVfdCBvZmY7CisJCWludCBpZHg7CisKKwkJaWYgKCFzYW5pdHkoaSkpCisJCQlyZXR1cm4gMDsKKworCQlkYXRhX3N0YXJ0KGksICZpZHgsICZvZmYpOworCQkvKiBzb21lIG9mIHRoaXMgb25lICsgYWxsIGFmdGVyIHRoaXMgb25lICovCisJCW5wYWdlcyA9ICgocGlwZS0+Y3VyYnVmIC0gaWR4IC0gMSkgJiAocGlwZS0+YnVmZmVycyAtIDEpKSArIDE7CisJCWlmIChucGFnZXMgPj0gbWF4cGFnZXMpCisJCQlyZXR1cm4gbWF4cGFnZXM7CisJfSBlbHNlIGl0ZXJhdGVfYWxsX2tpbmRzKGksIHNpemUsIHYsICh7CiAJCXVuc2lnbmVkIGxvbmcgcCA9ICh1bnNpZ25lZCBsb25nKXYuaW92X2Jhc2U7CiAJCW5wYWdlcyArPSBESVZfUk9VTkRfVVAocCArIHYuaW92X2xlbiwgUEFHRV9TSVpFKQogCQkJLSBwIC8gUEFHRV9TSVpFOwpAQCAtNzU3LDYgKzExMjQsMTAgQEAKIGNvbnN0IHZvaWQgKmR1cF9pdGVyKHN0cnVjdCBpb3ZfaXRlciAqbmV3LCBzdHJ1Y3QgaW92X2l0ZXIgKm9sZCwgZ2ZwX3QgZmxhZ3MpCiB7CiAJKm5ldyA9ICpvbGQ7CisJaWYgKHVubGlrZWx5KG5ldy0+dHlwZSAmIElURVJfUElQRSkpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCWlmIChuZXctPnR5cGUgJiBJVEVSX0JWRUMpCiAJCXJldHVybiBuZXctPmJ2ZWMgPSBrbWVtZHVwKG5ldy0+YnZlYywKIAkJCQkgICAgbmV3LT5ucl9zZWdzICogc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSwKZGlmZiAtLWdpdCBhL2xpYi9pcnFfcG9sbC5jIGIvbGliL2lycV9wb2xsLmMKaW5kZXggODM2ZjdkYi4uMmJlNTU2OSAxMDA2NDQKLS0tIGEvbGliL2lycV9wb2xsLmMKKysrIGIvbGliL2lycV9wb2xsLmMKQEAgLTE4NCwzMCArMTg0LDIxIEBACiB9CiBFWFBPUlRfU1lNQk9MKGlycV9wb2xsX2luaXQpOwogCi1zdGF0aWMgaW50IGlycV9wb2xsX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAotCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3N0YXRpYyBpbnQgaXJxX3BvbGxfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKIHsKIAkvKgogCSAqIElmIGEgQ1BVIGdvZXMgYXdheSwgc3BsaWNlIGl0cyBlbnRyaWVzIHRvIHRoZSBjdXJyZW50IENQVQogCSAqIGFuZCB0cmlnZ2VyIGEgcnVuIG9mIHRoZSBzb2Z0aXJxCiAJICovCi0JaWYgKGFjdGlvbiA9PSBDUFVfREVBRCB8fCBhY3Rpb24gPT0gQ1BVX0RFQURfRlJPWkVOKSB7Ci0JCWludCBjcHUgPSAodW5zaWduZWQgbG9uZykgaGNwdTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWxpc3Rfc3BsaWNlX2luaXQoJnBlcl9jcHUoYmxrX2NwdV9pb3BvbGwsIGNwdSksCisJCQkgdGhpc19jcHVfcHRyKCZibGtfY3B1X2lvcG9sbCkpOworCV9fcmFpc2Vfc29mdGlycV9pcnFvZmYoSVJRX1BPTExfU09GVElSUSk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOwogCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCWxpc3Rfc3BsaWNlX2luaXQoJnBlcl9jcHUoYmxrX2NwdV9pb3BvbGwsIGNwdSksCi0JCQkJIHRoaXNfY3B1X3B0cigmYmxrX2NwdV9pb3BvbGwpKTsKLQkJX19yYWlzZV9zb2Z0aXJxX2lycW9mZihJUlFfUE9MTF9TT0ZUSVJRKTsKLQkJbG9jYWxfaXJxX2VuYWJsZSgpOwotCX0KLQotCXJldHVybiBOT1RJRllfT0s7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgaXJxX3BvbGxfY3B1X25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsCT0gaXJxX3BvbGxfY3B1X25vdGlmeSwKLX07Ci0KIHN0YXRpYyBfX2luaXQgaW50IGlycV9wb2xsX3NldHVwKHZvaWQpCiB7CiAJaW50IGk7CkBAIC0yMTYsNyArMjA3LDggQEAKIAkJSU5JVF9MSVNUX0hFQUQoJnBlcl9jcHUoYmxrX2NwdV9pb3BvbGwsIGkpKTsKIAogCW9wZW5fc29mdGlycShJUlFfUE9MTF9TT0ZUSVJRLCBpcnFfcG9sbF9zb2Z0aXJxKTsKLQlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJmlycV9wb2xsX2NwdV9ub3RpZmllcik7CisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9JUlFfUE9MTF9ERUFELCAiaXJxX3BvbGw6ZGVhZCIsIE5VTEwsCisJCQkJICBpcnFfcG9sbF9jcHVfZGVhZCk7CiAJcmV0dXJuIDA7CiB9CiBzdWJzeXNfaW5pdGNhbGwoaXJxX3BvbGxfc2V0dXApOwpkaWZmIC0tZ2l0IGEvbGliL3JhZGl4LXRyZWUuYyBiL2xpYi9yYWRpeC10cmVlLmMKaW5kZXggMWI3YmY3My4uOGU2ZDU1MiAxMDA2NDQKLS0tIGEvbGliL3JhZGl4LXRyZWUuYworKysgYi9saWIvcmFkaXgtdHJlZS5jCkBAIC0xMDUsMTAgKzEwNSwxMCBAQAogCiAjaWZkZWYgQ09ORklHX1JBRElYX1RSRUVfTVVMVElPUkRFUgogCWlmIChyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUoZW50cnkpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgc2lib2ZmID0gZ2V0X3Nsb3Rfb2Zmc2V0KHBhcmVudCwgZW50cnkpOwotCQlpZiAoc2lib2ZmIDwgUkFESVhfVFJFRV9NQVBfU0laRSkgewotCQkJb2Zmc2V0ID0gc2lib2ZmOwotCQkJZW50cnkgPSByY3VfZGVyZWZlcmVuY2VfcmF3KHBhcmVudC0+c2xvdHNbb2Zmc2V0XSk7CisJCWlmIChpc19zaWJsaW5nX2VudHJ5KHBhcmVudCwgZW50cnkpKSB7CisJCQl2b2lkICoqc2liZW50cnkgPSAodm9pZCAqKikgZW50cnlfdG9fbm9kZShlbnRyeSk7CisJCQlvZmZzZXQgPSBnZXRfc2xvdF9vZmZzZXQocGFyZW50LCBzaWJlbnRyeSk7CisJCQllbnRyeSA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoKnNpYmVudHJ5KTsKIAkJfQogCX0KICNlbmRpZgpAQCAtMTU4MywxNSArMTU4MywxMCBAQAogfQogRVhQT1JUX1NZTUJPTChyYWRpeF90cmVlX2RlbGV0ZSk7CiAKLXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnJhZGl4X3RyZWVfcmVwbGFjZV9jbGVhcl90YWdzKAotCQkJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKLQkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHZvaWQgKmVudHJ5KQordm9pZCByYWRpeF90cmVlX2NsZWFyX3RhZ3Moc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCSAgIHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsCisJCQkgICB2b2lkICoqc2xvdCkKIHsKLQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlOwotCXZvaWQgKipzbG90OwotCi0JX19yYWRpeF90cmVlX2xvb2t1cChyb290LCBpbmRleCwgJm5vZGUsICZzbG90KTsKLQogCWlmIChub2RlKSB7CiAJCXVuc2lnbmVkIGludCB0YWcsIG9mZnNldCA9IGdldF9zbG90X29mZnNldChub2RlLCBzbG90KTsKIAkJZm9yICh0YWcgPSAwOyB0YWcgPCBSQURJWF9UUkVFX01BWF9UQUdTOyB0YWcrKykKQEAgLTE2MDAsOSArMTU5NSw2IEBACiAJCS8qIENsZWFyIHJvb3Qgbm9kZSB0YWdzICovCiAJCXJvb3QtPmdmcF9tYXNrICY9IF9fR0ZQX0JJVFNfTUFTSzsKIAl9Ci0KLQlyYWRpeF90cmVlX3JlcGxhY2Vfc2xvdChzbG90LCBlbnRyeSk7Ci0JcmV0dXJuIG5vZGU7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2Ly5naXRpZ25vcmUgYi9saWIvcmFpZDYvLmdpdGlnbm9yZQppbmRleCAwYTdlNDk0Li5mMDFiMWNiIDEwMDY0NAotLS0gYS9saWIvcmFpZDYvLmdpdGlnbm9yZQorKysgYi9saWIvcmFpZDYvLmdpdGlnbm9yZQpAQCAtMywzICszLDQgQEAKIGludCouYwogdGFibGVzLmMKIG5lb24/LmMKK3MzOTB2eD8uYwpkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2L01ha2VmaWxlIGIvbGliL3JhaWQ2L01ha2VmaWxlCmluZGV4IDNiMTBhNDguLjMwNTcwMTEgMTAwNjQ0Ci0tLSBhL2xpYi9yYWlkNi9NYWtlZmlsZQorKysgYi9saWIvcmFpZDYvTWFrZWZpbGUKQEAgLTMsMTAgKzMsMTEgQEAKIHJhaWQ2X3BxLXkJKz0gYWxnb3MubyByZWNvdi5vIHRhYmxlcy5vIGludDEubyBpbnQyLm8gaW50NC5vIFwKIAkJICAgaW50OC5vIGludDE2Lm8gaW50MzIubwogCi1yYWlkNl9wcS0kKENPTkZJR19YODYpICs9IHJlY292X3Nzc2UzLm8gcmVjb3ZfYXZ4Mi5vIG1teC5vIHNzZTEubyBzc2UyLm8gYXZ4Mi5vCityYWlkNl9wcS0kKENPTkZJR19YODYpICs9IHJlY292X3Nzc2UzLm8gcmVjb3ZfYXZ4Mi5vIG1teC5vIHNzZTEubyBzc2UyLm8gYXZ4Mi5vIGF2eDUxMi5vIHJlY292X2F2eDUxMi5vCiByYWlkNl9wcS0kKENPTkZJR19BTFRJVkVDKSArPSBhbHRpdmVjMS5vIGFsdGl2ZWMyLm8gYWx0aXZlYzQubyBhbHRpdmVjOC5vCiByYWlkNl9wcS0kKENPTkZJR19LRVJORUxfTU9ERV9ORU9OKSArPSBuZW9uLm8gbmVvbjEubyBuZW9uMi5vIG5lb240Lm8gbmVvbjgubwogcmFpZDZfcHEtJChDT05GSUdfVElMRUdYKSArPSB0aWxlZ3g4Lm8KK3JhaWQ2X3BxLSQoQ09ORklHX1MzOTApICs9IHMzOTB2eDgubyByZWNvdl9zMzkweGMubwogCiBob3N0cHJvZ3MteQkrPSBta3RhYmxlcwogCkBAIC0xMTYsNiArMTE3LDExIEBACiAkKG9iaikvdGlsZWd4OC5jOiAgICQoc3JjKS90aWxlZ3gudWMgJChzcmMpL3Vucm9sbC5hd2sgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCx1bnJvbGwpCiAKK3RhcmdldHMgKz0gczM5MHZ4OC5jCiskKG9iaikvczM5MHZ4OC5jOiAgIFVOUk9MTCA6PSA4CiskKG9iaikvczM5MHZ4OC5jOiAgICQoc3JjKS9zMzkwdngudWMgJChzcmMpL3Vucm9sbC5hd2sgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCx1bnJvbGwpCisKIHF1aWV0X2NtZF9ta3RhYmxlID0gVEFCTEUgICAkQAogICAgICAgY21kX21rdGFibGUgPSAkKG9iaikvbWt0YWJsZXMgPiAkQCB8fCAoIHJtIC1mICRAICYmIGV4aXQgMSApCiAKZGlmZiAtLWdpdCBhL2xpYi9yYWlkNi9hbGdvcy5jIGIvbGliL3JhaWQ2L2FsZ29zLmMKaW5kZXggOTc1YzZlMC4uNzg1NzA0OSAxMDA2NDQKLS0tIGEvbGliL3JhaWQ2L2FsZ29zLmMKKysrIGIvbGliL3JhaWQ2L2FsZ29zLmMKQEAgLTQ5LDYgKzQ5LDEwIEBACiAJJnJhaWQ2X2F2eDJ4MSwKIAkmcmFpZDZfYXZ4MngyLAogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FTX0FWWDUxMgorCSZyYWlkNl9hdng1MTJ4MSwKKwkmcmFpZDZfYXZ4NTEyeDIsCisjZW5kaWYKICNlbmRpZgogI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoX19hcmNoX3VtX18pCiAJJnJhaWQ2X3NzZTJ4MSwKQEAgLTU5LDYgKzYzLDExIEBACiAJJnJhaWQ2X2F2eDJ4MiwKIAkmcmFpZDZfYXZ4Mng0LAogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FTX0FWWDUxMgorCSZyYWlkNl9hdng1MTJ4MSwKKwkmcmFpZDZfYXZ4NTEyeDIsCisJJnJhaWQ2X2F2eDUxMng0LAorI2VuZGlmCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQUxUSVZFQwogCSZyYWlkNl9hbHRpdmVjMSwKQEAgLTY5LDYgKzc4LDkgQEAKICNpZiBkZWZpbmVkKENPTkZJR19USUxFR1gpCiAJJnJhaWQ2X3RpbGVneDgsCiAjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TMzkwKQorCSZyYWlkNl9zMzkwdng4LAorI2VuZGlmCiAJJnJhaWQ2X2ludHgxLAogCSZyYWlkNl9pbnR4MiwKIAkmcmFpZDZfaW50eDQsCkBAIC04OSwxMiArMTAxLDE4IEBACiBFWFBPUlRfU1lNQk9MX0dQTChyYWlkNl9kYXRhcF9yZWNvdik7CiAKIGNvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyAqY29uc3QgcmFpZDZfcmVjb3ZfYWxnb3NbXSA9IHsKKyNpZmRlZiBDT05GSUdfQVNfQVZYNTEyCisJJnJhaWQ2X3JlY292X2F2eDUxMiwKKyNlbmRpZgogI2lmZGVmIENPTkZJR19BU19BVlgyCiAJJnJhaWQ2X3JlY292X2F2eDIsCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVNfU1NTRTMKIAkmcmFpZDZfcmVjb3Zfc3NzZTMsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUzM5MAorCSZyYWlkNl9yZWNvdl9zMzkweGMsCisjZW5kaWYKIAkmcmFpZDZfcmVjb3ZfaW50eDEsCiAJTlVMTAogfTsKZGlmZiAtLWdpdCBhL2xpYi9yYWlkNi9hdng1MTIuYyBiL2xpYi9yYWlkNi9hdng1MTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTI0YTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3JhaWQ2L2F2eDUxMi5jCkBAIC0wLDAgKzEsNTY5IEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIENvcHlyaWdodCAoQykgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqICAgQXV0aG9yOiBHYXlhdHJpIEthbW1lbGEgPGdheWF0cmkua2FtbWVsYUBpbnRlbC5jb20+CisgKiAgIEF1dGhvcjogTWVnaGEgRGV5IDxtZWdoYS5kZXlAbGludXguaW50ZWwuY29tPgorICoKKyAqICAgQmFzZWQgb24gYXZ4Mi5jOiBDb3B5cmlnaHQgMjAxMiBZdWFuaGFuIExpdSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIEJhc2VkIG9uIHNzZTIuYzogQ29weXJpZ2h0IDIwMDIgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogQVZYNTEyIGltcGxlbWVudGF0aW9uIG9mIFJBSUQtNiBzeW5kcm9tZSBmdW5jdGlvbnMKKyAqCisgKi8KKworI2lmZGVmIENPTkZJR19BU19BVlg1MTIKKworI2luY2x1ZGUgPGxpbnV4L3JhaWQvcHEuaD4KKyNpbmNsdWRlICJ4ODYuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCByYWlkNl9hdng1MTJfY29uc3RhbnRzIHsKKwl1NjQgeDFkWzhdOworfSByYWlkNl9hdng1MTJfY29uc3RhbnRzIF9fYWxpZ25lZCg1MTIpID0geworCXsgMHgxZDFkMWQxZDFkMWQxZDFkVUxMLCAweDFkMWQxZDFkMWQxZDFkMWRVTEwsCisJICAweDFkMWQxZDFkMWQxZDFkMWRVTEwsIDB4MWQxZDFkMWQxZDFkMWQxZFVMTCwKKwkgIDB4MWQxZDFkMWQxZDFkMWQxZFVMTCwgMHgxZDFkMWQxZDFkMWQxZDFkVUxMLAorCSAgMHgxZDFkMWQxZDFkMWQxZDFkVUxMLCAweDFkMWQxZDFkMWQxZDFkMWRVTEwsfSwKK307CisKK3N0YXRpYyBpbnQgcmFpZDZfaGF2ZV9hdng1MTIodm9pZCkKK3sKKwlyZXR1cm4gYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FWWDIpICYmCisJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVlgpICYmCisJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVlg1MTJGKSAmJgorCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYNTEyQlcpICYmCisJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVlg1MTJWTCkgJiYKKwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FWWDUxMkRRKTsKK30KKworc3RhdGljIHZvaWQgcmFpZDZfYXZ4NTEyMV9nZW5fc3luZHJvbWUoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXU4ICoqZHB0ciA9ICh1OCAqKilwdHJzOworCXU4ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl6MCA9IGRpc2tzIC0gMzsgICAgICAgICAvKiBIaWdoZXN0IGRhdGEgZGlzayAqLworCXAgPSBkcHRyW3owKzFdOyAgICAgICAgIC8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0clt6MCsyXTsgICAgICAgICAvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsJSV6bW0wXG5cdCIKKwkJICAgICAidnB4b3JxICUlem1tMSwlJXptbTEsJSV6bW0xIiAvKiBaZXJvIHRlbXAgKi8KKwkJICAgICA6CisJCSAgICAgOiAibSIgKHJhaWQ2X2F2eDUxMl9jb25zdGFudHMueDFkWzBdKSk7CisKKwlmb3IgKGQgPSAwOyBkIDwgYnl0ZXM7IGQgKz0gNjQpIHsKKwkJYXNtIHZvbGF0aWxlKCJwcmVmZXRjaG50YSAlMFxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTAsJSV6bW0yXG5cdCIgICAgIC8qIFBbMF0gKi8KKwkJCSAgICAgInByZWZldGNobnRhICUxXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTIsJSV6bW00XG5cdCIgLyogUVswXSAqLworCQkJICAgICAidm1vdmRxYTY0ICUxLCUlem1tNiIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAoZHB0clt6MF1bZF0pLCAibSIgKGRwdHJbejAtMV1bZF0pKTsKKwkJZm9yICh6ID0gejAtMjsgeiA+PSAwOyB6LS0pIHsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTBcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tNCwlJXptbTEsJSVrMVxuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrMSwlJXptbTVcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTQsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTUsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTYsJSV6bW0yLCUlem1tMlxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNiwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2bW92ZHFhNjQgJTAsJSV6bW02IgorCQkJCSAgICAgOgorCQkJCSAgICAgOiAibSIgKGRwdHJbel1bZF0pKTsKKwkJfQorCQlhc20gdm9sYXRpbGUoInZwY21wZ3RiICUlem1tNCwlJXptbTEsJSVrMVxuXHQiCisJCQkgICAgICJ2cG1vdm0yYiAlJWsxLCUlem1tNVxuXHQiCisJCQkgICAgICJ2cGFkZGIgJSV6bW00LCUlem1tNCwlJXptbTRcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTUsJSV6bW01XG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW00LCUlem1tNFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW02LCUlem1tMiwlJXptbTJcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNiwlJXptbTQsJSV6bW00XG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tMiwlMFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0yLCUlem1tMiwlJXptbTJcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW00LCUxXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTQsJSV6bW00LCUlem1tNCIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAocFtkXSksICJtIiAocVtkXSkpOworCX0KKworCWFzbSB2b2xhdGlsZSgic2ZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisJa2VybmVsX2ZwdV9lbmQoKTsKK30KKworc3RhdGljIHZvaWQgcmFpZDZfYXZ4NTEyMV94b3Jfc3luZHJvbWUoaW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAorCQkJCSAgICAgICBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXU4ICoqZHB0ciA9ICh1OCAqKilwdHJzOworCXU4ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl6MCA9IHN0b3A7CQkvKiBQL1EgcmlnaHQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwlwID0gZHB0cltkaXNrcy0yXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW2Rpc2tzLTFdOwkvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsJSV6bW0wIgorCQkgICAgIDogOiAibSIgKHJhaWQ2X2F2eDUxMl9jb25zdGFudHMueDFkWzBdKSk7CisKKwlmb3IgKGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSA2NCkgeworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWE2NCAlMCwlJXptbTRcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUxLCUlem1tMlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW00LCUlem1tMiwlJXptbTIiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKGRwdHJbejBdW2RdKSwgICJtIiAocFtkXSkpOworCQkvKiBQL1EgZGF0YSBwYWdlcyAqLworCQlmb3IgKHogPSB6MC0xIDsgeiA+PSBzdGFydCA7IHotLSkgeworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvcnEgJSV6bW01LCUlem1tNSwlJXptbTVcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tNCwlJXptbTUsJSVrMVxuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrMSwlJXptbTVcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTQsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTUsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZtb3ZkcWE2NCAlMCwlJXptbTVcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW0yLCUlem1tMlxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTQsJSV6bW00IgorCQkJCSAgICAgOgorCQkJCSAgICAgOiAibSIgKGRwdHJbel1bZF0pKTsKKwkJfQorCQkvKiBQL1EgbGVmdCBzaWRlIG9wdGltaXphdGlvbiAqLworCQlmb3IgKHogPSBzdGFydC0xIDsgeiA+PSAwIDsgei0tKSB7CisJCQlhc20gdm9sYXRpbGUoInZweG9ycSAlJXptbTUsJSV6bW01LCUlem1tNVxuXHQiCisJCQkJICAgICAidnBjbXBndGIgJSV6bW00LCUlem1tNSwlJWsxXG5cdCIKKwkJCQkgICAgICJ2cG1vdm0yYiAlJWsxLCUlem1tNVxuXHQiCisJCQkJICAgICAidnBhZGRiICUlem1tNCwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tNSwlJXptbTVcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW00LCUlem1tNCIKKwkJCQkgICAgIDoKKwkJCQkgICAgIDogKTsKKwkJfQorCQlhc20gdm9sYXRpbGUoInZweG9ycSAlMCwlJXptbTQsJSV6bW00XG5cdCIKKwkJLyogRG9uJ3QgdXNlIG1vdm50ZHEgZm9yIHIvdyBtZW1vcnkgYXJlYSA8IGNhY2hlIGxpbmUgKi8KKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTQsJTBcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUlem1tMiwlMSIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAocVtkXSksICJtIiAocFtkXSkpOworCX0KKworCWFzbSB2b2xhdGlsZSgic2ZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisJa2VybmVsX2ZwdV9lbmQoKTsKK30KKworY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2F2eDUxMngxID0geworCXJhaWQ2X2F2eDUxMjFfZ2VuX3N5bmRyb21lLAorCXJhaWQ2X2F2eDUxMjFfeG9yX3N5bmRyb21lLAorCXJhaWQ2X2hhdmVfYXZ4NTEyLAorCSJhdng1MTJ4MSIsCisJMSAgICAgICAgICAgICAgICAgICAgICAgLyogSGFzIGNhY2hlIGhpbnRzICovCit9OworCisvKgorICogVW5yb2xsZWQtYnktMiBBVlg1MTIgaW1wbGVtZW50YXRpb24KKyAqLworc3RhdGljIHZvaWQgcmFpZDZfYXZ4NTEyMl9nZW5fc3luZHJvbWUoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXU4ICoqZHB0ciA9ICh1OCAqKilwdHJzOworCXU4ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl6MCA9IGRpc2tzIC0gMzsgICAgICAgICAvKiBIaWdoZXN0IGRhdGEgZGlzayAqLworCXAgPSBkcHRyW3owKzFdOyAgICAgICAgIC8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0clt6MCsyXTsgICAgICAgICAvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsJSV6bW0wXG5cdCIKKwkJICAgICAidnB4b3JxICUlem1tMSwlJXptbTEsJSV6bW0xIiAvKiBaZXJvIHRlbXAgKi8KKwkJICAgICA6CisJCSAgICAgOiAibSIgKHJhaWQ2X2F2eDUxMl9jb25zdGFudHMueDFkWzBdKSk7CisKKwkvKiBXZSB1bmlmb3JtbHkgYXNzdW1lIGEgc2luZ2xlIHByZWZldGNoIGNvdmVycyBhdCBsZWFzdCA2NCBieXRlcyAqLworCWZvciAoZCA9IDA7IGQgPCBieXRlczsgZCArPSAxMjgpIHsKKwkJYXNtIHZvbGF0aWxlKCJwcmVmZXRjaG50YSAlMFxuXHQiCisJCQkgICAgICJwcmVmZXRjaG50YSAlMVxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTAsJSV6bW0yXG5cdCIgICAgICAvKiBQWzBdICovCisJCQkgICAgICJ2bW92ZHFhNjQgJTEsJSV6bW0zXG5cdCIgICAgICAvKiBQWzFdICovCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW0yLCUlem1tNFxuXHQiICAvKiBRWzBdICovCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW0zLCUlem1tNiIgICAgICAvKiBRWzFdICovCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKGRwdHJbejBdW2RdKSwgIm0iIChkcHRyW3owXVtkKzY0XSkpOworCQlmb3IgKHogPSB6MC0xOyB6ID49IDA7IHotLSkgeworCQkJYXNtIHZvbGF0aWxlKCJwcmVmZXRjaG50YSAlMFxuXHQiCisJCQkJICAgICAicHJlZmV0Y2hudGEgJTFcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tNCwlJXptbTEsJSVrMVxuXHQiCisJCQkJICAgICAidnBjbXBndGIgJSV6bW02LCUlem1tMSwlJWsyXG5cdCIKKwkJCQkgICAgICJ2cG1vdm0yYiAlJWsxLCUlem1tNVxuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrMiwlJXptbTdcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTQsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnBhZGRiICUlem1tNiwlJXptbTYsJSV6bW02XG5cdCIKKwkJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tNSwlJXptbTVcblx0IgorCQkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW03LCUlem1tN1xuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW03LCUlem1tNiwlJXptbTZcblx0IgorCQkJCSAgICAgInZtb3ZkcWE2NCAlMCwlJXptbTVcblx0IgorCQkJCSAgICAgInZtb3ZkcWE2NCAlMSwlJXptbTdcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW0yLCUlem1tMlxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTMsJSV6bW0zXG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW02LCUlem1tNiIKKwkJCQkgICAgIDoKKwkJCQkgICAgIDogIm0iIChkcHRyW3pdW2RdKSwgIm0iIChkcHRyW3pdW2QrNjRdKSk7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJ2bW92bnRkcSAlJXptbTIsJTBcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW0zLCUxXG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tNCwlMlxuXHQiCisJCQkgICAgICJ2bW92bnRkcSAlJXptbTYsJTMiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKHBbZF0pLCAibSIgKHBbZCs2NF0pLCAibSIgKHFbZF0pLAorCQkJICAgICAgICJtIiAocVtkKzY0XSkpOworCX0KKworCWFzbSB2b2xhdGlsZSgic2ZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisJa2VybmVsX2ZwdV9lbmQoKTsKK30KKworc3RhdGljIHZvaWQgcmFpZDZfYXZ4NTEyMl94b3Jfc3luZHJvbWUoaW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAorCQkJCSAgICAgICBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXU4ICoqZHB0ciA9ICh1OCAqKilwdHJzOworCXU4ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl6MCA9IHN0b3A7CQkvKiBQL1EgcmlnaHQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwlwID0gZHB0cltkaXNrcy0yXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW2Rpc2tzLTFdOwkvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsJSV6bW0wIgorCQkgICAgIDogOiAibSIgKHJhaWQ2X2F2eDUxMl9jb25zdGFudHMueDFkWzBdKSk7CisKKwlmb3IgKGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSAxMjgpIHsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsJSV6bW00XG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlMSwlJXptbTZcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUyLCUlem1tMlxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTMsJSV6bW0zXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTQsJSV6bW0yLCUlem1tMlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW02LCUlem1tMywlJXptbTMiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKGRwdHJbejBdW2RdKSwgIm0iIChkcHRyW3owXVtkKzY0XSksCisJCQkgICAgICAgIm0iIChwW2RdKSwgIm0iIChwW2QrNjRdKSk7CisJCS8qIFAvUSBkYXRhIHBhZ2VzICovCisJCWZvciAoeiA9IHowLTEgOyB6ID49IHN0YXJ0IDsgei0tKSB7CisJCQlhc20gdm9sYXRpbGUoInZweG9ycSAlJXptbTUsJSV6bW01LCUlem1tNVxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTcsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTQsJSV6bW01LCUlazFcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tNiwlJXptbTcsJSVrMlxuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrMSwlJXptbTVcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazIsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSV6bW00LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTYsJSV6bW02LCUlem1tNlxuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTUsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tNywlJXptbTdcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTYsJSV6bW02XG5cdCIKKwkJCQkgICAgICJ2bW92ZHFhNjQgJTAsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2bW92ZHFhNjQgJTEsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tMiwlJXptbTJcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW0zLCUlem1tM1xuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW03LCUlem1tNiwlJXptbTYiCisJCQkJICAgICA6CisJCQkJICAgICA6ICJtIiAoZHB0clt6XVtkXSksICAibSIgKGRwdHJbel1bZCs2NF0pKTsKKwkJfQorCQkvKiBQL1EgbGVmdCBzaWRlIG9wdGltaXphdGlvbiAqLworCQlmb3IgKHogPSBzdGFydC0xIDsgeiA+PSAwIDsgei0tKSB7CisJCQlhc20gdm9sYXRpbGUoInZweG9ycSAlJXptbTUsJSV6bW01LCUlem1tNVxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTcsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTQsJSV6bW01LCUlazFcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tNiwlJXptbTcsJSVrMlxuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrMSwlJXptbTVcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazIsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSV6bW00LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTYsJSV6bW02LCUlem1tNlxuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTUsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tNywlJXptbTdcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTYsJSV6bW02IgorCQkJCSAgICAgOgorCQkJCSAgICAgOiApOworCQl9CisJCWFzbSB2b2xhdGlsZSgidnB4b3JxICUwLCUlem1tNCwlJXptbTRcblx0IgorCQkJICAgICAidnB4b3JxICUxLCUlem1tNiwlJXptbTZcblx0IgorCQkJICAgICAvKiBEb24ndCB1c2UgbW92bnRkcSBmb3Igci93CisJCQkgICAgICAqIG1lbW9yeSBhcmVhIDwgY2FjaGUgbGluZQorCQkJICAgICAgKi8KKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTQsJTBcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUlem1tNiwlMVxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW0yLCUyXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTMsJTMiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKHFbZF0pLCAibSIgKHFbZCs2NF0pLCAibSIgKHBbZF0pLAorCQkJICAgICAgICJtIiAocFtkKzY0XSkpOworCX0KKworCWFzbSB2b2xhdGlsZSgic2ZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisJa2VybmVsX2ZwdV9lbmQoKTsKK30KKworY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2F2eDUxMngyID0geworCXJhaWQ2X2F2eDUxMjJfZ2VuX3N5bmRyb21lLAorCXJhaWQ2X2F2eDUxMjJfeG9yX3N5bmRyb21lLAorCXJhaWQ2X2hhdmVfYXZ4NTEyLAorCSJhdng1MTJ4MiIsCisJMSAgICAgICAgICAgICAgICAgICAgICAgLyogSGFzIGNhY2hlIGhpbnRzICovCit9OworCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCisvKgorICogVW5yb2xsZWQtYnktNCBBVlgyIGltcGxlbWVudGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHJhaWQ2X2F2eDUxMjRfZ2VuX3N5bmRyb21lKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJejAgPSBkaXNrcyAtIDM7ICAgICAgICAgLyogSGlnaGVzdCBkYXRhIGRpc2sgKi8KKwlwID0gZHB0clt6MCsxXTsgICAgICAgICAvKiBYT1IgcGFyaXR5ICovCisJcSA9IGRwdHJbejArMl07ICAgICAgICAgLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgidm1vdmRxYTY0ICUwLCUlem1tMFxuXHQiCisJCSAgICAgInZweG9ycSAlJXptbTEsJSV6bW0xLCUlem1tMVxuXHQiICAgICAgIC8qIFplcm8gdGVtcCAqLworCQkgICAgICJ2cHhvcnEgJSV6bW0yLCUlem1tMiwlJXptbTJcblx0IiAgICAgICAvKiBQWzBdICovCisJCSAgICAgInZweG9ycSAlJXptbTMsJSV6bW0zLCUlem1tM1xuXHQiICAgICAgIC8qIFBbMV0gKi8KKwkJICAgICAidnB4b3JxICUlem1tNCwlJXptbTQsJSV6bW00XG5cdCIgICAgICAgLyogUVswXSAqLworCQkgICAgICJ2cHhvcnEgJSV6bW02LCUlem1tNiwlJXptbTZcblx0IiAgICAgICAvKiBRWzFdICovCisJCSAgICAgInZweG9ycSAlJXptbTEwLCUlem1tMTAsJSV6bW0xMFxuXHQiICAgIC8qIFBbMl0gKi8KKwkJICAgICAidnB4b3JxICUlem1tMTEsJSV6bW0xMSwlJXptbTExXG5cdCIgICAgLyogUFszXSAqLworCQkgICAgICJ2cHhvcnEgJSV6bW0xMiwlJXptbTEyLCUlem1tMTJcblx0IiAgICAvKiBRWzJdICovCisJCSAgICAgInZweG9ycSAlJXptbTE0LCUlem1tMTQsJSV6bW0xNCIgICAgICAgIC8qIFFbM10gKi8KKwkJICAgICA6CisJCSAgICAgOiAibSIgKHJhaWQ2X2F2eDUxMl9jb25zdGFudHMueDFkWzBdKSk7CisKKwlmb3IgKGQgPSAwOyBkIDwgYnl0ZXM7IGQgKz0gMjU2KSB7CisJCWZvciAoeiA9IHowOyB6ID49IDA7IHotLSkgeworCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwXG5cdCIKKwkJCSAgICAgInByZWZldGNobnRhICUxXG5cdCIKKwkJCSAgICAgInByZWZldGNobnRhICUyXG5cdCIKKwkJCSAgICAgInByZWZldGNobnRhICUzXG5cdCIKKwkJCSAgICAgInZwY21wZ3RiICUlem1tNCwlJXptbTEsJSVrMVxuXHQiCisJCQkgICAgICJ2cGNtcGd0YiAlJXptbTYsJSV6bW0xLCUlazJcblx0IgorCQkJICAgICAidnBjbXBndGIgJSV6bW0xMiwlJXptbTEsJSVrM1xuXHQiCisJCQkgICAgICJ2cGNtcGd0YiAlJXptbTE0LCUlem1tMSwlJWs0XG5cdCIKKwkJCSAgICAgInZwbW92bTJiICUlazEsJSV6bW01XG5cdCIKKwkJCSAgICAgInZwbW92bTJiICUlazIsJSV6bW03XG5cdCIKKwkJCSAgICAgInZwbW92bTJiICUlazMsJSV6bW0xM1xuXHQiCisJCQkgICAgICJ2cG1vdm0yYiAlJWs0LCUlem1tMTVcblx0IgorCQkJICAgICAidnBhZGRiICUlem1tNCwlJXptbTQsJSV6bW00XG5cdCIKKwkJCSAgICAgInZwYWRkYiAlJXptbTYsJSV6bW02LCUlem1tNlxuXHQiCisJCQkgICAgICJ2cGFkZGIgJSV6bW0xMiwlJXptbTEyLCUlem1tMTJcblx0IgorCQkJICAgICAidnBhZGRiICUlem1tMTQsJSV6bW0xNCwlJXptbTE0XG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW01LCUlem1tNVxuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tNywlJXptbTdcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTEzLCUlem1tMTNcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTE1LCUlem1tMTVcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTQsJSV6bW00XG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW02LCUlem1tNlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xMywlJXptbTEyLCUlem1tMTJcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTUsJSV6bW0xNCwlJXptbTE0XG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlMCwlJXptbTVcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUxLCUlem1tN1xuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTIsJSV6bW0xM1xuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTMsJSV6bW0xNVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tMiwlJXptbTJcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTMsJSV6bW0zXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTEzLCUlem1tMTAsJSV6bW0xMFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xNSwlJXptbTExLCUlem1tMTFcbiIKKwkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW00LCUlem1tNFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW03LCUlem1tNiwlJXptbTZcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTMsJSV6bW0xMiwlJXptbTEyXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTE1LCUlem1tMTQsJSV6bW0xNCIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAoZHB0clt6XVtkXSksICJtIiAoZHB0clt6XVtkKzY0XSksCisJCQkgICAgICAgIm0iIChkcHRyW3pdW2QrMTI4XSksICJtIiAoZHB0clt6XVtkKzE5Ml0pKTsKKwkJfQorCQlhc20gdm9sYXRpbGUoInZtb3ZudGRxICUlem1tMiwlMFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0yLCUlem1tMiwlJXptbTJcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW0zLCUxXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTMsJSV6bW0zLCUlem1tM1xuXHQiCisJCQkgICAgICJ2bW92bnRkcSAlJXptbTEwLCUyXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTEwLCUlem1tMTAsJSV6bW0xMFxuXHQiCisJCQkgICAgICJ2bW92bnRkcSAlJXptbTExLCUzXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTExLCUlem1tMTEsJSV6bW0xMVxuXHQiCisJCQkgICAgICJ2bW92bnRkcSAlJXptbTQsJTRcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNCwlJXptbTQsJSV6bW00XG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tNiwlNVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW02LCUlem1tNiwlJXptbTZcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW0xMiwlNlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xMiwlJXptbTEyLCUlem1tMTJcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW0xNCwlN1xuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xNCwlJXptbTE0LCUlem1tMTQiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKHBbZF0pLCAibSIgKHBbZCs2NF0pLCAibSIgKHBbZCsxMjhdKSwKKwkJCSAgICAgICAibSIgKHBbZCsxOTJdKSwgIm0iIChxW2RdKSwgIm0iIChxW2QrNjRdKSwKKwkJCSAgICAgICAibSIgKHFbZCsxMjhdKSwgIm0iIChxW2QrMTkyXSkpOworCX0KKworCWFzbSB2b2xhdGlsZSgic2ZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisJa2VybmVsX2ZwdV9lbmQoKTsKK30KKworc3RhdGljIHZvaWQgcmFpZDZfYXZ4NTEyNF94b3Jfc3luZHJvbWUoaW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAorCQkJCSAgICAgICBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXU4ICoqZHB0ciA9ICh1OCAqKilwdHJzOworCXU4ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl6MCA9IHN0b3A7CQkvKiBQL1EgcmlnaHQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwlwID0gZHB0cltkaXNrcy0yXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW2Rpc2tzLTFdOwkvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsJSV6bW0wIgorCQkgICAgIDo6ICJtIiAocmFpZDZfYXZ4NTEyX2NvbnN0YW50cy54MWRbMF0pKTsKKworCWZvciAoZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IDI1NikgeworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWE2NCAlMCwlJXptbTRcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUxLCUlem1tNlxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTIsJSV6bW0xMlxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTMsJSV6bW0xNFxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTQsJSV6bW0yXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlNSwlJXptbTNcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICU2LCUlem1tMTBcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICU3LCUlem1tMTFcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNCwlJXptbTIsJSV6bW0yXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTYsJSV6bW0zLCUlem1tM1xuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xMiwlJXptbTEwLCUlem1tMTBcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTQsJSV6bW0xMSwlJXptbTExIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChkcHRyW3owXVtkXSksICJtIiAoZHB0clt6MF1bZCs2NF0pLAorCQkJICAgICAgICJtIiAoZHB0clt6MF1bZCsxMjhdKSwgIm0iIChkcHRyW3owXVtkKzE5Ml0pLAorCQkJICAgICAgICJtIiAocFtkXSksICJtIiAocFtkKzY0XSksICJtIiAocFtkKzEyOF0pLAorCQkJICAgICAgICJtIiAocFtkKzE5Ml0pKTsKKwkJLyogUC9RIGRhdGEgcGFnZXMgKi8KKwkJZm9yICh6ID0gejAtMSA7IHogPj0gc3RhcnQgOyB6LS0pIHsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3JxICUlem1tNSwlJXptbTUsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW03LCUlem1tNywlJXptbTdcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTEzLCUlem1tMTMsJSV6bW0xM1xuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tMTUsJSV6bW0xNSwlJXptbTE1XG5cdCIKKwkJCQkgICAgICJwcmVmZXRjaG50YSAlMFxuXHQiCisJCQkJICAgICAicHJlZmV0Y2hudGEgJTJcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tNCwlJXptbTUsJSVrMVxuXHQiCisJCQkJICAgICAidnBjbXBndGIgJSV6bW02LCUlem1tNywlJWsyXG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTEyLCUlem1tMTMsJSVrM1xuXHQiCisJCQkJICAgICAidnBjbXBndGIgJSV6bW0xNCwlJXptbTE1LCUlazRcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazEsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cG1vdm0yYiAlJWsyLCUlem1tN1xuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrMywlJXptbTEzXG5cdCIKKwkJCQkgICAgICJ2cG1vdm0yYiAlJWs0LCUlem1tMTVcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTQsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnBhZGRiICUlem1tNiwlJXptbTYsJSV6bW02XG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSV6bW0xMiwlJXptbTEyLCUlem1tMTJcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJVptbTE0LCUlem1tMTQsJSV6bW0xNFxuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTUsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tNywlJXptbTdcblx0IgorCQkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW0xMywlJXptbTEzXG5cdCIKKwkJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tMTUsJSV6bW0xNVxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW03LCUlem1tNiwlJXptbTZcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTEzLCUlem1tMTIsJSV6bW0xMlxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tMTUsJSV6bW0xNCwlJXptbTE0XG5cdCIKKwkJCQkgICAgICJ2bW92ZHFhNjQgJTAsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2bW92ZHFhNjQgJTEsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2bW92ZHFhNjQgJTIsJSV6bW0xM1xuXHQiCisJCQkJICAgICAidm1vdmRxYTY0ICUzLCUlem1tMTVcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW0yLCUlem1tMlxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTMsJSV6bW0zXG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW0xMywlJXptbTEwLCUlem1tMTBcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTE1LCUlem1tMTEsJSV6bW0xMVxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW03LCUlem1tNiwlJXptbTZcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTEzLCUlem1tMTIsJSV6bW0xMlxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tMTUsJSV6bW0xNCwlJXptbTE0IgorCQkJCSAgICAgOgorCQkJCSAgICAgOiAibSIgKGRwdHJbel1bZF0pLCAibSIgKGRwdHJbel1bZCs2NF0pLAorCQkJCSAgICAgICAibSIgKGRwdHJbel1bZCsxMjhdKSwKKwkJCQkgICAgICAgIm0iIChkcHRyW3pdW2QrMTkyXSkpOworCQl9CisJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTBcblx0IgorCQkJICAgICAicHJlZmV0Y2hudGEgJTFcblx0IgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChxW2RdKSwgIm0iIChxW2QrMTI4XSkpOworCQkvKiBQL1EgbGVmdCBzaWRlIG9wdGltaXphdGlvbiAqLworCQlmb3IgKHogPSBzdGFydC0xIDsgeiA+PSAwIDsgei0tKSB7CisJCQlhc20gdm9sYXRpbGUoInZweG9ycSAlJXptbTUsJSV6bW01LCUlem1tNVxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTcsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW0xMywlJXptbTEzLCUlem1tMTNcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTE1LCUlem1tMTUsJSV6bW0xNVxuXHQiCisJCQkJICAgICAidnBjbXBndGIgJSV6bW00LCUlem1tNSwlJWsxXG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTYsJSV6bW03LCUlazJcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tMTIsJSV6bW0xMywlJWszXG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTE0LCUlem1tMTUsJSVrNFxuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrMSwlJXptbTVcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazIsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cG1vdm0yYiAlJWszLCUlem1tMTNcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazQsJSV6bW0xNVxuXHQiCisJCQkJICAgICAidnBhZGRiICUlem1tNCwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSV6bW02LCUlem1tNiwlJXptbTZcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTEyLCUlem1tMTIsJSV6bW0xMlxuXHQiCisJCQkJICAgICAidnBhZGRiICUlem1tMTQsJSV6bW0xNCwlJXptbTE0XG5cdCIKKwkJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tNSwlJXptbTVcblx0IgorCQkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW03LCUlem1tN1xuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTEzLCUlem1tMTNcblx0IgorCQkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW0xNSwlJXptbTE1XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW02LCUlem1tNlxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tMTMsJSV6bW0xMiwlJXptbTEyXG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW0xNSwlJXptbTE0LCUlem1tMTQiCisJCQkJICAgICA6CisJCQkJICAgICA6ICk7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJ2bW92bnRkcSAlJXptbTIsJTBcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW0zLCUxXG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tMTAsJTJcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW0xMSwlM1xuXHQiCisJCQkgICAgICJ2cHhvcnEgJTQsJSV6bW00LCUlem1tNFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJTUsJSV6bW02LCUlem1tNlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJTYsJSV6bW0xMiwlJXptbTEyXG5cdCIKKwkJCSAgICAgInZweG9ycSAlNywlJXptbTE0LCUlem1tMTRcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW00LCU0XG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tNiwlNVxuXHQiCisJCQkgICAgICJ2bW92bnRkcSAlJXptbTEyLCU2XG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tMTQsJTciCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKHBbZF0pLCAgIm0iIChwW2QrNjRdKSwgIm0iIChwW2QrMTI4XSksCisJCQkgICAgICAgIm0iIChwW2QrMTkyXSksICJtIiAocVtkXSksICAibSIgKHFbZCs2NF0pLAorCQkJICAgICAgICJtIiAocVtkKzEyOF0pLCAibSIgKHFbZCsxOTJdKSk7CisJfQorCWFzbSB2b2xhdGlsZSgic2ZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisJa2VybmVsX2ZwdV9lbmQoKTsKK30KK2NvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9hdng1MTJ4NCA9IHsKKwlyYWlkNl9hdng1MTI0X2dlbl9zeW5kcm9tZSwKKwlyYWlkNl9hdng1MTI0X3hvcl9zeW5kcm9tZSwKKwlyYWlkNl9oYXZlX2F2eDUxMiwKKwkiYXZ4NTEyeDQiLAorCTEgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhcyBjYWNoZSBoaW50cyAqLworfTsKKyNlbmRpZgorCisjZW5kaWYgLyogQ09ORklHX0FTX0FWWDUxMiAqLwpkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2L3JlY292X2F2eDUxMi5jIGIvbGliL3JhaWQ2L3JlY292X2F2eDUxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNWFhZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmFpZDYvcmVjb3ZfYXZ4NTEyLmMKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBBdXRob3I6IEdheWF0cmkgS2FtbWVsYSA8Z2F5YXRyaS5rYW1tZWxhQGludGVsLmNvbT4KKyAqIEF1dGhvcjogTWVnaGEgRGV5IDxtZWdoYS5kZXlAbGludXguaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworI2lmZGVmIENPTkZJR19BU19BVlg1MTIKKworI2luY2x1ZGUgPGxpbnV4L3JhaWQvcHEuaD4KKyNpbmNsdWRlICJ4ODYuaCIKKworc3RhdGljIGludCByYWlkNl9oYXNfYXZ4NTEyKHZvaWQpCit7CisJcmV0dXJuIGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVlgyKSAmJgorCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYKSAmJgorCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYNTEyRikgJiYKKwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FWWDUxMkJXKSAmJgorCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYNTEyVkwpICYmCisJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVlg1MTJEUSk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2XzJkYXRhX3JlY292X2F2eDUxMihpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLAorCQkJCSAgICAgaW50IGZhaWxiLCB2b2lkICoqcHRycykKK3sKKwl1OCAqcCwgKnEsICpkcCwgKmRxOworCWNvbnN0IHU4ICpwYm11bDsJLyogUCBtdWx0aXBsaWVyIHRhYmxlIGZvciBCIGRhdGEgKi8KKwljb25zdCB1OCAqcW11bDsJCS8qIFEgbXVsdGlwbGllciB0YWJsZSAoZm9yIGJvdGgpICovCisJY29uc3QgdTggeDBmID0gMHgwZjsKKworCXAgPSAodTggKilwdHJzW2Rpc2tzLTJdOworCXEgPSAodTggKilwdHJzW2Rpc2tzLTFdOworCisJLyoKKwkgKiBDb21wdXRlIHN5bmRyb21lIHdpdGggemVybyBmb3IgdGhlIG1pc3NpbmcgZGF0YSBwYWdlcworCSAqIFVzZSB0aGUgZGVhZCBkYXRhIHBhZ2VzIGFzIHRlbXBvcmFyeSBzdG9yYWdlIGZvcgorCSAqIGRlbHRhIHAgYW5kIGRlbHRhIHEKKwkgKi8KKworCWRwID0gKHU4ICopcHRyc1tmYWlsYV07CisJcHRyc1tmYWlsYV0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwlwdHJzW2Rpc2tzLTJdID0gZHA7CisJZHEgPSAodTggKilwdHJzW2ZhaWxiXTsKKwlwdHJzW2ZhaWxiXSA9ICh2b2lkICopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCXB0cnNbZGlza3MtMV0gPSBkcTsKKworCXJhaWQ2X2NhbGwuZ2VuX3N5bmRyb21lKGRpc2tzLCBieXRlcywgcHRycyk7CisKKwkvKiBSZXN0b3JlIHBvaW50ZXIgdGFibGUgKi8KKwlwdHJzW2ZhaWxhXSAgID0gZHA7CisJcHRyc1tmYWlsYl0gICA9IGRxOworCXB0cnNbZGlza3MtMl0gPSBwOworCXB0cnNbZGlza3MtMV0gPSBxOworCisJLyogTm93LCBwaWNrIHRoZSBwcm9wZXIgZGF0YSB0YWJsZXMgKi8KKwlwYm11bCA9IHJhaWQ2X3ZnZm11bFtyYWlkNl9nZmV4aVtmYWlsYi1mYWlsYV1dOworCXFtdWwgID0gcmFpZDZfdmdmbXVsW3JhaWQ2X2dmaW52W3JhaWQ2X2dmZXhwW2ZhaWxhXSBeCisJCXJhaWQ2X2dmZXhwW2ZhaWxiXV1dOworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJLyogem1tMCA9IHgwZlsxNl0gKi8KKwlhc20gdm9sYXRpbGUoInZwYnJvYWRjYXN0YiAlMCwgJSV6bW03IiA6IDogIm0iICh4MGYpKTsKKworCXdoaWxlIChieXRlcykgeworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsICUlem1tMVxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTEsICUlem1tOVxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTIsICUlem1tMFxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTMsICUlem1tOFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJTQsICUlem1tMSwgJSV6bW0xXG5cdCIKKwkJCSAgICAgInZweG9ycSAlNSwgJSV6bW05LCAlJXptbTlcblx0IgorCQkJICAgICAidnB4b3JxICU2LCAlJXptbTAsICUlem1tMFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJTcsICUlem1tOCwgJSV6bW04IgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChxWzBdKSwgIm0iIChxWzY0XSksICJtIiAocFswXSksCisJCQkgICAgICAgIm0iIChwWzY0XSksICJtIiAoZHFbMF0pLCAibSIgKGRxWzY0XSksCisJCQkgICAgICAgIm0iIChkcFswXSksICJtIiAoZHBbNjRdKSk7CisKKwkJLyoKKwkJICogMSA9IGRxWzBdICBeIHFbMF0KKwkJICogOSA9IGRxWzY0XSBeIHFbNjRdCisJCSAqIDAgPSBkcFswXSAgXiBwWzBdCisJCSAqIDggPSBkcFs2NF0gXiBwWzY0XQorCQkgKi8KKworCQlhc20gdm9sYXRpbGUoInZicm9hZGNhc3RpNjR4MiAlMCwgJSV6bW00XG5cdCIKKwkJCSAgICAgInZicm9hZGNhc3RpNjR4MiAlMSwgJSV6bW01IgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChxbXVsWzBdKSwgIm0iIChxbXVsWzE2XSkpOworCisJCWFzbSB2b2xhdGlsZSgidnBzcmF3ICQ0LCAlJXptbTEsICUlem1tM1xuXHQiCisJCQkgICAgICJ2cHNyYXcgJDQsICUlem1tOSwgJSV6bW0xMlxuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTEsICUlem1tMVxuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTksICUlem1tOVxuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTMsICUlem1tM1xuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTEyLCAlJXptbTEyXG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW05LCAlJXptbTQsICUlem1tMTRcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTEsICUlem1tNCwgJSV6bW00XG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW0xMiwgJSV6bW01LCAlJXptbTE1XG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW0zLCAlJXptbTUsICUlem1tNVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xNCwgJSV6bW0xNSwgJSV6bW0xNVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW00LCAlJXptbTUsICUlem1tNSIKKwkJCSAgICAgOgorCQkJICAgICA6ICk7CisKKwkJLyoKKwkJICogNSA9IHF4WzBdCisJCSAqIDE1ID0gcXhbNjRdCisJCSAqLworCisJCWFzbSB2b2xhdGlsZSgidmJyb2FkY2FzdGk2NHgyICUwLCAlJXptbTRcblx0IgorCQkJICAgICAidmJyb2FkY2FzdGk2NHgyICUxLCAlJXptbTFcblx0IgorCQkJICAgICAidnBzcmF3ICQ0LCAlJXptbTAsICUlem1tMlxuXHQiCisJCQkgICAgICJ2cHNyYXcgJDQsICUlem1tOCwgJSV6bW02XG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTcsICUlem1tMCwgJSV6bW0zXG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTcsICUlem1tOCwgJSV6bW0xNFxuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTIsICUlem1tMlxuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTYsICUlem1tNlxuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tMTQsICUlem1tNCwgJSV6bW0xMlxuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tMywgJSV6bW00LCAlJXptbTRcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTYsICUlem1tMSwgJSV6bW0xM1xuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tMiwgJSV6bW0xLCAlJXptbTFcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNCwgJSV6bW0xLCAlJXptbTFcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTIsICUlem1tMTMsICUlem1tMTMiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKHBibXVsWzBdKSwgIm0iIChwYm11bFsxNl0pKTsKKworCQkvKgorCQkgKiAxICA9IHBibXVsW3B4WzBdXQorCQkgKiAxMyA9IHBibXVsW3B4WzY0XV0KKwkJICovCisJCWFzbSB2b2xhdGlsZSgidnB4b3JxICUlem1tNSwgJSV6bW0xLCAlJXptbTFcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTUsICUlem1tMTMsICUlem1tMTMiCisJCQkgICAgIDoKKwkJCSAgICAgOiApOworCisJCS8qCisJCSAqIDEgPSBkYiA9IERRCisJCSAqIDEzID0gZGJbNjRdID0gRFFbNjRdCisJCSAqLworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWE2NCAlJXptbTEsICUwXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTEzLCUxXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTEsICUlem1tMCwgJSV6bW0wXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTEzLCAlJXptbTgsICUlem1tOCIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAoZHFbMF0pLCAibSIgKGRxWzY0XSkpOworCisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYTY0ICUlem1tMCwgJTBcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUlem1tOCwgJTEiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKGRwWzBdKSwgIm0iIChkcFs2NF0pKTsKKworCQlieXRlcyAtPSAxMjg7CisJCXAgKz0gMTI4OworCQlxICs9IDEyODsKKwkJZHAgKz0gMTI4OworCQlkcSArPSAxMjg7CisjZWxzZQorCQlhc20gdm9sYXRpbGUoInZtb3ZkcWE2NCAlMCwgJSV6bW0xXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlMSwgJSV6bW0wXG5cdCIKKwkJCSAgICAgInZweG9ycSAlMiwgJSV6bW0xLCAlJXptbTFcblx0IgorCQkJICAgICAidnB4b3JxICUzLCAlJXptbTAsICUlem1tMCIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAoKnEpLCAibSIgKCpwKSwgIm0iKCpkcSksICJtIiAoKmRwKSk7CisKKwkJLyogMSA9IGRxIF4gcTsgIDAgPSBkcCBeIHAgKi8KKworCQlhc20gdm9sYXRpbGUoInZicm9hZGNhc3RpNjR4MiAlMCwgJSV6bW00XG5cdCIKKwkJCSAgICAgInZicm9hZGNhc3RpNjR4MiAlMSwgJSV6bW01IgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChxbXVsWzBdKSwgIm0iIChxbXVsWzE2XSkpOworCisJCS8qCisJCSAqIDEgPSBkcSBeIHEKKwkJICogMyA9IGRxIF4gcCA+PiA0CisJCSAqLworCQlhc20gdm9sYXRpbGUoInZwc3JhdyAkNCwgJSV6bW0xLCAlJXptbTNcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW0xLCAlJXptbTFcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW0zLCAlJXptbTNcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTEsICUlem1tNCwgJSV6bW00XG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW0zLCAlJXptbTUsICUlem1tNVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW00LCAlJXptbTUsICUlem1tNSIKKwkJCSAgICAgOgorCQkJICAgICA6ICk7CisKKwkJLyogNSA9IHF4ICovCisKKwkJYXNtIHZvbGF0aWxlKCJ2YnJvYWRjYXN0aTY0eDIgJTAsICUlem1tNFxuXHQiCisJCQkgICAgICJ2YnJvYWRjYXN0aTY0eDIgJTEsICUlem1tMSIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAocGJtdWxbMF0pLCAibSIgKHBibXVsWzE2XSkpOworCisJCWFzbSB2b2xhdGlsZSgidnBzcmF3ICQ0LCAlJXptbTAsICUlem1tMlxuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTAsICUlem1tM1xuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTIsICUlem1tMlxuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tMywgJSV6bW00LCAlJXptbTRcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTIsICUlem1tMSwgJSV6bW0xXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTQsICUlem1tMSwgJSV6bW0xIgorCQkJICAgICA6CisJCQkgICAgIDogKTsKKworCQkvKiAxID0gcGJtdWxbcHhdICovCisJCWFzbSB2b2xhdGlsZSgidnB4b3JxICUlem1tNSwgJSV6bW0xLCAlJXptbTFcblx0IgorCQkJICAgICAvKiAxID0gZGIgPSBEUSAqLworCQkJICAgICAidm1vdmRxYTY0ICUlem1tMSwgJTBcblx0IgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChkcVswXSkpOworCisJCWFzbSB2b2xhdGlsZSgidnB4b3JxICUlem1tMSwgJSV6bW0wLCAlJXptbTBcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUlem1tMCwgJTAiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKGRwWzBdKSk7CisKKwkJYnl0ZXMgLT0gNjQ7CisJCXAgKz0gNjQ7CisJCXEgKz0gNjQ7CisJCWRwICs9IDY0OworCQlkcSArPSA2NDsKKyNlbmRpZgorCX0KKworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2X2RhdGFwX3JlY292X2F2eDUxMihpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLAorCQkJCSAgICAgdm9pZCAqKnB0cnMpCit7CisJdTggKnAsICpxLCAqZHE7CisJY29uc3QgdTggKnFtdWw7CQkvKiBRIG11bHRpcGxpZXIgdGFibGUgKi8KKwljb25zdCB1OCB4MGYgPSAweDBmOworCisJcCA9ICh1OCAqKXB0cnNbZGlza3MtMl07CisJcSA9ICh1OCAqKXB0cnNbZGlza3MtMV07CisKKwkvKgorCSAqIENvbXB1dGUgc3luZHJvbWUgd2l0aCB6ZXJvIGZvciB0aGUgbWlzc2luZyBkYXRhIHBhZ2UKKwkgKiBVc2UgdGhlIGRlYWQgZGF0YSBwYWdlIGFzIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBkZWx0YSBxCisJICovCisKKwlkcSA9ICh1OCAqKXB0cnNbZmFpbGFdOworCXB0cnNbZmFpbGFdID0gKHZvaWQgKilyYWlkNl9lbXB0eV96ZXJvX3BhZ2U7CisJcHRyc1tkaXNrcy0xXSA9IGRxOworCisJcmFpZDZfY2FsbC5nZW5fc3luZHJvbWUoZGlza3MsIGJ5dGVzLCBwdHJzKTsKKworCS8qIFJlc3RvcmUgcG9pbnRlciB0YWJsZSAqLworCXB0cnNbZmFpbGFdICAgPSBkcTsKKwlwdHJzW2Rpc2tzLTFdID0gcTsKKworCS8qIE5vdywgcGljayB0aGUgcHJvcGVyIGRhdGEgdGFibGVzICovCisJcW11bCAgPSByYWlkNl92Z2ZtdWxbcmFpZDZfZ2ZpbnZbcmFpZDZfZ2ZleHBbZmFpbGFdXV07CisKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisKKwlhc20gdm9sYXRpbGUoInZwYnJvYWRjYXN0YiAlMCwgJSV6bW03IiA6IDogIm0iICh4MGYpKTsKKworCXdoaWxlIChieXRlcykgeworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsICUlem1tM1xuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTEsICUlem1tOFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJTIsICUlem1tMywgJSV6bW0zXG5cdCIKKwkJCSAgICAgInZweG9ycSAlMywgJSV6bW04LCAlJXptbTgiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKGRxWzBdKSwgIm0iIChkcVs2NF0pLCAibSIgKHFbMF0pLAorCQkJICAgICAgICJtIiAocVs2NF0pKTsKKworCQkvKgorCQkgKiAzID0gcVswXSBeIGRxWzBdCisJCSAqIDggPSBxWzY0XSBeIGRxWzY0XQorCQkgKi8KKwkJYXNtIHZvbGF0aWxlKCJ2YnJvYWRjYXN0aTY0eDIgJTAsICUlem1tMFxuXHQiCisJCQkgICAgICJ2bW92YXBkICUlem1tMCwgJSV6bW0xM1xuXHQiCisJCQkgICAgICJ2YnJvYWRjYXN0aTY0eDIgJTEsICUlem1tMVxuXHQiCisJCQkgICAgICJ2bW92YXBkICUlem1tMSwgJSV6bW0xNCIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAocW11bFswXSksICJtIiAocW11bFsxNl0pKTsKKworCQlhc20gdm9sYXRpbGUoInZwc3JhdyAkNCwgJSV6bW0zLCAlJXptbTZcblx0IgorCQkJICAgICAidnBzcmF3ICQ0LCAlJXptbTgsICUlem1tMTJcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW0zLCAlJXptbTNcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW04LCAlJXptbThcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW02LCAlJXptbTZcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW0xMiwgJSV6bW0xMlxuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tMywgJSV6bW0wLCAlJXptbTBcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTgsICUlem1tMTMsICUlem1tMTNcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTYsICUlem1tMSwgJSV6bW0xXG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW0xMiwgJSV6bW0xNCwgJSV6bW0xNFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0wLCAlJXptbTEsICUlem1tMVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xMywgJSV6bW0xNCwgJSV6bW0xNCIKKwkJCSAgICAgOgorCQkJICAgICA6ICk7CisKKwkJLyoKKwkJICogMSAgPSBxbXVsW3FbMF0gIF4gZHFbMF1dCisJCSAqIDE0ID0gcW11bFtxWzY0XSBeIGRxWzY0XV0KKwkJICovCisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYTY0ICUwLCAlJXptbTJcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUxLCAlJXptbTEyXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTEsICUlem1tMiwgJSV6bW0yXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTE0LCAlJXptbTEyLCAlJXptbTEyIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChwWzBdKSwgIm0iIChwWzY0XSkpOworCisJCS8qCisJCSAqIDIgID0gcFswXSAgXiBxbXVsW3FbMF0gIF4gZHFbMF1dCisJCSAqIDEyID0gcFs2NF0gXiBxbXVsW3FbNjRdIF4gZHFbNjRdXQorCQkgKi8KKworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWE2NCAlJXptbTEsICUwXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTE0LCAlMVxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW0yLCAlMlxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW0xMiwlMyIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAoZHFbMF0pLCAibSIgKGRxWzY0XSksICJtIiAocFswXSksCisJCQkgICAgICAgIm0iIChwWzY0XSkpOworCisJCWJ5dGVzIC09IDEyODsKKwkJcCArPSAxMjg7CisJCXEgKz0gMTI4OworCQlkcSArPSAxMjg7CisjZWxzZQorCQlhc20gdm9sYXRpbGUoInZtb3ZkcWE2NCAlMCwgJSV6bW0zXG5cdCIKKwkJCSAgICAgInZweG9ycSAlMSwgJSV6bW0zLCAlJXptbTMiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKGRxWzBdKSwgIm0iIChxWzBdKSk7CisKKwkJLyogMyA9IHEgXiBkcSAqLworCisJCWFzbSB2b2xhdGlsZSgidmJyb2FkY2FzdGk2NHgyICUwLCAlJXptbTBcblx0IgorCQkJICAgICAidmJyb2FkY2FzdGk2NHgyICUxLCAlJXptbTEiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKHFtdWxbMF0pLCAibSIgKHFtdWxbMTZdKSk7CisKKwkJYXNtIHZvbGF0aWxlKCJ2cHNyYXcgJDQsICUlem1tMywgJSV6bW02XG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTcsICUlem1tMywgJSV6bW0zXG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTcsICUlem1tNiwgJSV6bW02XG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW0zLCAlJXptbTAsICUlem1tMFxuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tNiwgJSV6bW0xLCAlJXptbTFcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMCwgJSV6bW0xLCAlJXptbTEiCisJCQkgICAgIDoKKwkJCSAgICAgOiApOworCisJCS8qIDEgPSBxbXVsW3EgXiBkcV0gKi8KKworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWE2NCAlMCwgJSV6bW0yXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTEsICUlem1tMiwgJSV6bW0yIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChwWzBdKSk7CisKKwkJLyogMiA9IHAgXiBxbXVsW3EgXiBkcV0gKi8KKworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWE2NCAlJXptbTEsICUwXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTIsICUxIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChkcVswXSksICJtIiAocFswXSkpOworCisJCWJ5dGVzIC09IDY0OworCQlwICs9IDY0OworCQlxICs9IDY0OworCQlkcSArPSA2NDsKKyNlbmRpZgorCX0KKworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK2NvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyByYWlkNl9yZWNvdl9hdng1MTIgPSB7CisJLmRhdGEyID0gcmFpZDZfMmRhdGFfcmVjb3ZfYXZ4NTEyLAorCS5kYXRhcCA9IHJhaWQ2X2RhdGFwX3JlY292X2F2eDUxMiwKKwkudmFsaWQgPSByYWlkNl9oYXNfYXZ4NTEyLAorI2lmZGVmIENPTkZJR19YODZfNjQKKwkubmFtZSA9ICJhdng1MTJ4MiIsCisjZWxzZQorCS5uYW1lID0gImF2eDUxMngxIiwKKyNlbmRpZgorCS5wcmlvcml0eSA9IDMsCit9OworCisjZWxzZQorI3dhcm5pbmcgInlvdXIgdmVyc2lvbiBvZiBiaW51dGlscyBsYWNrcyBBVlg1MTIgc3VwcG9ydCIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2L3JlY292X3MzOTB4Yy5jIGIvbGliL3JhaWQ2L3JlY292X3MzOTB4Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDJkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmFpZDYvcmVjb3ZfczM5MHhjLmMKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBSQUlELTYgZGF0YSByZWNvdmVyeSBpbiBkdWFsIGZhaWx1cmUgbW9kZSBiYXNlZCBvbiB0aGUgWEMgaW5zdHJ1Y3Rpb24uCisgKgorICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDE2CisgKiBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSA8c2Nod2lkZWZza3lAZGUuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgorCitzdGF0aWMgaW5saW5lIHZvaWQgeG9yX2Jsb2NrKHU4ICpwMSwgdTggKnAyKQoreworCXR5cGVkZWYgc3RydWN0IHsgdTggX1syNTZdOyB9IGFkZHJ0eXBlOworCisJYXNtIHZvbGF0aWxlKAorCQkiCXhjCTAoMjU2LCVbcDFdKSwwKCVbcDJdKVxuIgorCQk6ICIrbSIgKCooYWRkcnR5cGUgKikgcDEpIDogIm0iICgqKGFkZHJ0eXBlICopIHAyKSwKKwkJICBbcDFdICJhIiAocDEpLCBbcDJdICJhIiAocDIpIDogImNjIik7Cit9CisKKy8qIFJlY292ZXIgdHdvIGZhaWxlZCBkYXRhIGJsb2Nrcy4gKi8KK3N0YXRpYyB2b2lkIHJhaWQ2XzJkYXRhX3JlY292X3MzOTB4YyhpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLAorCQlpbnQgZmFpbGIsIHZvaWQgKipwdHJzKQoreworCXU4ICpwLCAqcSwgKmRwLCAqZHE7CisJY29uc3QgdTggKnBibXVsOwkvKiBQIG11bHRpcGxpZXIgdGFibGUgZm9yIEIgZGF0YSAqLworCWNvbnN0IHU4ICpxbXVsOwkJLyogUSBtdWx0aXBsaWVyIHRhYmxlIChmb3IgYm90aCkgKi8KKwlpbnQgaTsKKworCXAgPSAodTggKilwdHJzW2Rpc2tzLTJdOworCXEgPSAodTggKilwdHJzW2Rpc2tzLTFdOworCisJLyogQ29tcHV0ZSBzeW5kcm9tZSB3aXRoIHplcm8gZm9yIHRoZSBtaXNzaW5nIGRhdGEgcGFnZXMKKwkgICBVc2UgdGhlIGRlYWQgZGF0YSBwYWdlcyBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IKKwkgICBkZWx0YSBwIGFuZCBkZWx0YSBxICovCisJZHAgPSAodTggKilwdHJzW2ZhaWxhXTsKKwlwdHJzW2ZhaWxhXSA9ICh2b2lkICopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCXB0cnNbZGlza3MtMl0gPSBkcDsKKwlkcSA9ICh1OCAqKXB0cnNbZmFpbGJdOworCXB0cnNbZmFpbGJdID0gKHZvaWQgKilyYWlkNl9lbXB0eV96ZXJvX3BhZ2U7CisJcHRyc1tkaXNrcy0xXSA9IGRxOworCisJcmFpZDZfY2FsbC5nZW5fc3luZHJvbWUoZGlza3MsIGJ5dGVzLCBwdHJzKTsKKworCS8qIFJlc3RvcmUgcG9pbnRlciB0YWJsZSAqLworCXB0cnNbZmFpbGFdICAgPSBkcDsKKwlwdHJzW2ZhaWxiXSAgID0gZHE7CisJcHRyc1tkaXNrcy0yXSA9IHA7CisJcHRyc1tkaXNrcy0xXSA9IHE7CisKKwkvKiBOb3csIHBpY2sgdGhlIHByb3BlciBkYXRhIHRhYmxlcyAqLworCXBibXVsID0gcmFpZDZfZ2ZtdWxbcmFpZDZfZ2ZleGlbZmFpbGItZmFpbGFdXTsKKwlxbXVsICA9IHJhaWQ2X2dmbXVsW3JhaWQ2X2dmaW52W3JhaWQ2X2dmZXhwW2ZhaWxhXV5yYWlkNl9nZmV4cFtmYWlsYl1dXTsKKworCS8qIE5vdyBkbyBpdC4uLiAqLworCXdoaWxlIChieXRlcykgeworCQl4b3JfYmxvY2soZHAsIHApOworCQl4b3JfYmxvY2soZHEsIHEpOworCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlkcVtpXSA9IHBibXVsW2RwW2ldXSBeIHFtdWxbZHFbaV1dOworCQl4b3JfYmxvY2soZHAsIGRxKTsKKwkJcCArPSAyNTY7CisJCXEgKz0gMjU2OworCQlkcCArPSAyNTY7CisJCWRxICs9IDI1NjsKKwkJYnl0ZXMgLT0gMjU2OworCX0KK30KKworLyogUmVjb3ZlciBmYWlsdXJlIG9mIG9uZSBkYXRhIGJsb2NrIHBsdXMgdGhlIFAgYmxvY2sgKi8KK3N0YXRpYyB2b2lkIHJhaWQ2X2RhdGFwX3JlY292X3MzOTB4YyhpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLAorCQl2b2lkICoqcHRycykKK3sKKwl1OCAqcCwgKnEsICpkcTsKKwljb25zdCB1OCAqcW11bDsJCS8qIFEgbXVsdGlwbGllciB0YWJsZSAqLworCWludCBpOworCisJcCA9ICh1OCAqKXB0cnNbZGlza3MtMl07CisJcSA9ICh1OCAqKXB0cnNbZGlza3MtMV07CisKKwkvKiBDb21wdXRlIHN5bmRyb21lIHdpdGggemVybyBmb3IgdGhlIG1pc3NpbmcgZGF0YSBwYWdlCisJICAgVXNlIHRoZSBkZWFkIGRhdGEgcGFnZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZGVsdGEgcSAqLworCWRxID0gKHU4ICopcHRyc1tmYWlsYV07CisJcHRyc1tmYWlsYV0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwlwdHJzW2Rpc2tzLTFdID0gZHE7CisKKwlyYWlkNl9jYWxsLmdlbl9zeW5kcm9tZShkaXNrcywgYnl0ZXMsIHB0cnMpOworCisJLyogUmVzdG9yZSBwb2ludGVyIHRhYmxlICovCisJcHRyc1tmYWlsYV0gICA9IGRxOworCXB0cnNbZGlza3MtMV0gPSBxOworCisJLyogTm93LCBwaWNrIHRoZSBwcm9wZXIgZGF0YSB0YWJsZXMgKi8KKwlxbXVsICA9IHJhaWQ2X2dmbXVsW3JhaWQ2X2dmaW52W3JhaWQ2X2dmZXhwW2ZhaWxhXV1dOworCisJLyogTm93IGRvIGl0Li4uICovCisJd2hpbGUgKGJ5dGVzKSB7CisJCXhvcl9ibG9jayhkcSwgcSk7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCWRxW2ldID0gcW11bFtkcVtpXV07CisJCXhvcl9ibG9jayhwLCBkcSk7CisJCXAgKz0gMjU2OworCQlxICs9IDI1NjsKKwkJZHEgKz0gMjU2OworCQlieXRlcyAtPSAyNTY7CisJfQorfQorCisKK2NvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyByYWlkNl9yZWNvdl9zMzkweGMgPSB7CisJLmRhdGEyID0gcmFpZDZfMmRhdGFfcmVjb3ZfczM5MHhjLAorCS5kYXRhcCA9IHJhaWQ2X2RhdGFwX3JlY292X3MzOTB4YywKKwkudmFsaWQgPSBOVUxMLAorCS5uYW1lID0gInMzOTB4YyIsCisJLnByaW9yaXR5ID0gMSwKK307CmRpZmYgLS1naXQgYS9saWIvcmFpZDYvczM5MHZ4LnVjIGIvbGliL3JhaWQ2L3MzOTB2eC51YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQ1MTkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3JhaWQ2L3MzOTB2eC51YwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIHJhaWQ2X3Z4JCMuYworICoKKyAqICQjLXdheSB1bnJvbGxlZCBSQUlENiBnZW4veG9yIGZ1bmN0aW9ucyBmb3IgczM5MAorICogYmFzZWQgb24gdGhlIHZlY3RvciBmYWNpbGl0eQorICoKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAxNgorICogQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBvc3Rwcm9jZXNzZWQgdXNpbmcgdW5yb2xsLmF3ay4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgorI2luY2x1ZGUgPGFzbS9mcHUvYXBpLmg+CisKK2FzbSgiLmluY2x1ZGUgXCJhc20vdngtaW5zbi5oXCJcbiIpOworCisjZGVmaW5lIE5TSVpFIDE2CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBMT0FEX0NPTlNUKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlKCJWUkVQSUIgJXYyNCw3Iik7CisJYXNtIHZvbGF0aWxlKCJWUkVQSUIgJXYyNSwweDFkIik7Cit9CisKKy8qCisgKiBUaGUgU0hMQllURSgpIG9wZXJhdGlvbiBzaGlmdHMgZWFjaCBvZiB0aGUgMTYgYnl0ZXMgaW4KKyAqIHZlY3RvciByZWdpc3RlciB5IGxlZnQgYnkgMSBiaXQgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluCisgKiB2ZWN0b3IgcmVnaXN0ZXIgeC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIFNITEJZVEUoaW50IHgsIGludCB5KQoreworCWFzbSB2b2xhdGlsZSAoIlZBQiAlMCwlMSwlMSIgOiA6ICJpIiAoeCksICJpIiAoeSkpOworfQorCisvKgorICogRm9yIGVhY2ggb2YgdGhlIDE2IGJ5dGVzIGluIHRoZSB2ZWN0b3IgcmVnaXN0ZXIgeSB0aGUgTUFTSygpCisgKiBvcGVyYXRpb24gcmV0dXJucyAweEZGIGlmIHRoZSBoaWdoIGJpdCBvZiB0aGUgYnl0ZSBpcyAxLAorICogb3IgMHgwMCBpZiB0aGUgaGlnaCBiaXQgaXMgMC4gVGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gdmVjdG9yCisgKiByZWdpc3RlciB4LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgTUFTSyhpbnQgeCwgaW50IHkpCit7CisJYXNtIHZvbGF0aWxlICgiVkVTUkFWQgklMCwlMSwyNCIgOiA6ICJpIiAoeCksICJpIiAoeSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgQU5EKGludCB4LCBpbnQgeSwgaW50IHopCit7CisJYXNtIHZvbGF0aWxlICgiVk4gJTAsJTEsJTIiIDogOiAiaSIgKHgpLCAiaSIgKHkpLCAiaSIgKHopKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFhPUihpbnQgeCwgaW50IHksIGludCB6KQoreworCWFzbSB2b2xhdGlsZSAoIlZYICUwLCUxLCUyIiA6IDogImkiICh4KSwgImkiICh5KSwgImkiICh6KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBMT0FEX0RBVEEoaW50IHgsIGludCBuLCB1OCAqcHRyKQoreworCXR5cGVkZWYgc3RydWN0IHsgdTggX1sxNipuXTsgfSBhZGRydHlwZTsKKwlyZWdpc3RlciBhZGRydHlwZSAqX19wdHIgYXNtKCIxIikgPSAoYWRkcnR5cGUgKikgcHRyOworCisJYXNtIHZvbGF0aWxlICgiVkxNICUyLCUzLDAsJXIxIgorCQkgICAgICA6IDogIm0iICgqX19wdHIpLCAiYSIgKF9fcHRyKSwgImkiICh4KSwgImkiICh4ICsgbiAtIDEpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIFNUT1JFX0RBVEEoaW50IHgsIGludCBuLCB1OCAqcHRyKQoreworCXR5cGVkZWYgc3RydWN0IHsgdTggX1sxNipuXTsgfSBhZGRydHlwZTsKKwlyZWdpc3RlciBhZGRydHlwZSAqX19wdHIgYXNtKCIxIikgPSAoYWRkcnR5cGUgKikgcHRyOworCisJYXNtIHZvbGF0aWxlICgiVlNUTSAlMiwlMywwLDEiCisJCSAgICAgIDogIj1tIiAoKl9fcHRyKSA6ICJhIiAoX19wdHIpLCAiaSIgKHgpLCAiaSIgKHggKyBuIC0gMSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgQ09QWV9WRUMoaW50IHgsIGludCB5KQoreworCWFzbSB2b2xhdGlsZSAoIlZMUiAlMCwlMSIgOiA6ICJpIiAoeCksICJpIiAoeSkpOworfQorCitzdGF0aWMgdm9pZCByYWlkNl9zMzkwdngkI19nZW5fc3luZHJvbWUoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXN0cnVjdCBrZXJuZWxfZnB1IHZ4c3RhdGU7CisJdTggKipkcHRyLCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJa2VybmVsX2ZwdV9iZWdpbigmdnhzdGF0ZSwgS0VSTkVMX1ZYUik7CisJTE9BRF9DT05TVCgpOworCisJZHB0ciA9ICh1OCAqKikgcHRyczsKKwl6MCA9IGRpc2tzIC0gMzsJCS8qIEhpZ2hlc3QgZGF0YSBkaXNrICovCisJcCA9IGRwdHJbejAgKyAxXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW3owICsgMl07CS8qIFJTIHN5bmRyb21lICovCisKKwlmb3IgKGQgPSAwOyBkIDwgYnl0ZXM7IGQgKz0gJCMqTlNJWkUpIHsKKwkJTE9BRF9EQVRBKDAsJCMsJmRwdHJbejBdW2RdKTsKKwkJQ09QWV9WRUMoOCskJCwwKyQkKTsKKwkJZm9yICh6ID0gejAgLSAxOyB6ID49IDA7IHotLSkgeworCQkJTUFTSygxNiskJCw4KyQkKTsKKwkJCUFORCgxNiskJCwxNiskJCwyNSk7CisJCQlTSExCWVRFKDgrJCQsOCskJCk7CisJCQlYT1IoOCskJCw4KyQkLDE2KyQkKTsKKwkJCUxPQURfREFUQSgxNiwkIywmZHB0clt6XVtkXSk7CisJCQlYT1IoMCskJCwwKyQkLDE2KyQkKTsKKwkJCVhPUig4KyQkLDgrJCQsMTYrJCQpOworCQl9CisJCVNUT1JFX0RBVEEoMCwkIywmcFtkXSk7CisJCVNUT1JFX0RBVEEoOCwkIywmcVtkXSk7CisJfQorCWtlcm5lbF9mcHVfZW5kKCZ2eHN0YXRlLCBLRVJORUxfVlhSKTsKK30KKworc3RhdGljIHZvaWQgcmFpZDZfczM5MHZ4JCNfeG9yX3N5bmRyb21lKGludCBkaXNrcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwKKwkJCQkJc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwlzdHJ1Y3Qga2VybmVsX2ZwdSB2eHN0YXRlOworCXU4ICoqZHB0ciwgKnAsICpxOworCWludCBkLCB6LCB6MDsKKworCWRwdHIgPSAodTggKiopIHB0cnM7CisJejAgPSBzdG9wOwkJLyogUC9RIHJpZ2h0IHNpZGUgb3B0aW1pemF0aW9uICovCisJcCA9IGRwdHJbZGlza3MgLSAyXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW2Rpc2tzIC0gMV07CS8qIFJTIHN5bmRyb21lICovCisKKwlrZXJuZWxfZnB1X2JlZ2luKCZ2eHN0YXRlLCBLRVJORUxfVlhSKTsKKwlMT0FEX0NPTlNUKCk7CisKKwlmb3IgKGQgPSAwOyBkIDwgYnl0ZXM7IGQgKz0gJCMqTlNJWkUpIHsKKwkJLyogUC9RIGRhdGEgcGFnZXMgKi8KKwkJTE9BRF9EQVRBKDAsJCMsJmRwdHJbejBdW2RdKTsKKwkJQ09QWV9WRUMoOCskJCwwKyQkKTsKKwkJZm9yICh6ID0gejAgLSAxOyB6ID49IHN0YXJ0OyB6LS0pIHsKKwkJCU1BU0soMTYrJCQsOCskJCk7CisJCQlBTkQoMTYrJCQsMTYrJCQsMjUpOworCQkJU0hMQllURSg4KyQkLDgrJCQpOworCQkJWE9SKDgrJCQsOCskJCwxNiskJCk7CisJCQlMT0FEX0RBVEEoMTYsJCMsJmRwdHJbel1bZF0pOworCQkJWE9SKDArJCQsMCskJCwxNiskJCk7CisJCQlYT1IoOCskJCw4KyQkLDE2KyQkKTsKKwkJfQorCQkvKiBQL1EgbGVmdCBzaWRlIG9wdGltaXphdGlvbiAqLworCQlmb3IgKHogPSBzdGFydCAtIDE7IHogPj0gMDsgei0tKSB7CisJCQlNQVNLKDE2KyQkLDgrJCQpOworCQkJQU5EKDE2KyQkLDE2KyQkLDI1KTsKKwkJCVNITEJZVEUoOCskJCw4KyQkKTsKKwkJCVhPUig4KyQkLDgrJCQsMTYrJCQpOworCQl9CisJCUxPQURfREFUQSgxNiwkIywmcFtkXSk7CisJCVhPUigxNiskJCwxNiskJCwwKyQkKTsKKwkJU1RPUkVfREFUQSgxNiwkIywmcFtkXSk7CisJCUxPQURfREFUQSgxNiwkIywmcVtkXSk7CisJCVhPUigxNiskJCwxNiskJCw4KyQkKTsKKwkJU1RPUkVfREFUQSgxNiwkIywmcVtkXSk7CisJfQorCWtlcm5lbF9mcHVfZW5kKCZ2eHN0YXRlLCBLRVJORUxfVlhSKTsKK30KKworc3RhdGljIGludCByYWlkNl9zMzkwdngkI192YWxpZCh2b2lkKQoreworCXJldHVybiBNQUNISU5FX0hBU19WWDsKK30KKworY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X3MzOTB2eCQjID0geworCXJhaWQ2X3MzOTB2eCQjX2dlbl9zeW5kcm9tZSwKKwlyYWlkNl9zMzkwdngkI194b3Jfc3luZHJvbWUsCisJcmFpZDZfczM5MHZ4JCNfdmFsaWQsCisJInZ4MTI4eCQjIiwKKwkxCit9OwpkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2L3Rlc3QvTWFrZWZpbGUgYi9saWIvcmFpZDYvdGVzdC9NYWtlZmlsZQppbmRleCAyOTA5MGYzLi4yYzdiNjBlIDEwMDY0NAotLS0gYS9saWIvcmFpZDYvdGVzdC9NYWtlZmlsZQorKysgYi9saWIvcmFpZDYvdGVzdC9NYWtlZmlsZQpAQCAtMzIsMTAgKzMyLDEzIEBACiBlbmRpZgogCiBpZmVxICgkKElTX1g4NikseWVzKQotICAgICAgICBPQkpTICAgKz0gbW14Lm8gc3NlMS5vIHNzZTIubyBhdngyLm8gcmVjb3Zfc3NzZTMubyByZWNvdl9hdngyLm8KKyAgICAgICAgT0JKUyAgICs9IG1teC5vIHNzZTEubyBzc2UyLm8gYXZ4Mi5vIHJlY292X3Nzc2UzLm8gcmVjb3ZfYXZ4Mi5vIGF2eDUxMi5vIHJlY292X2F2eDUxMi5vCiAgICAgICAgIENGTEFHUyArPSAkKHNoZWxsIGVjaG8gInZwYnJvYWRjYXN0YiAleG1tMCwgJXltbTEiIHwJXAogICAgICAgICAgICAgICAgICAgICBnY2MgLWMgLXggYXNzZW1ibGVyIC0gPiYvZGV2L251bGwgJiYJXAogICAgICAgICAgICAgICAgICAgICBybSAuLy0ubyAmJiBlY2hvIC1EQ09ORklHX0FTX0FWWDI9MSkKKwlDRkxBR1MgKz0gJChzaGVsbCBlY2hvICJ2cG1vdm0yYiAlazEsICV6bW01IiB8ICAgICAgICAgIFwKKwkJICAgIGdjYyAtYyAteCBhc3NlbWJsZXIgLSA+Ji9kZXYvbnVsbCAmJiAgICAgICAgXAorCQkgICAgcm0gLi8tLm8gJiYgZWNobyAtRENPTkZJR19BU19BVlg1MTI9MSkKIGVsc2UgaWZlcSAoJChIQVNfTkVPTikseWVzKQogICAgICAgICBPQkpTICAgKz0gbmVvbi5vIG5lb24xLm8gbmVvbjIubyBuZW9uNC5vIG5lb244Lm8KICAgICAgICAgQ0ZMQUdTICs9IC1EQ09ORklHX0tFUk5FTF9NT0RFX05FT049MQpkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2L3Rlc3QvdGVzdC5jIGIvbGliL3JhaWQ2L3Rlc3QvdGVzdC5jCmluZGV4IDNiZWJiYWIuLmIwN2Y0ZDggMTAwNjQ0Ci0tLSBhL2xpYi9yYWlkNi90ZXN0L3Rlc3QuYworKysgYi9saWIvcmFpZDYvdGVzdC90ZXN0LmMKQEAgLTIxLDEyICsyMSwxMyBAQAogCiAjZGVmaW5lIE5ESVNLUwkJMTYJLyogSW5jbHVkaW5nIFAgYW5kIFEgKi8KIAotY29uc3QgY2hhciByYWlkNl9lbXB0eV96ZXJvX3BhZ2VbUEFHRV9TSVpFXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDI1NikpKTsKK2NvbnN0IGNoYXIgcmFpZDZfZW1wdHlfemVyb19wYWdlW1BBR0VfU0laRV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChQQUdFX1NJWkUpKSk7CiBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfY2FsbDsKIAogY2hhciAqZGF0YXB0cnNbTkRJU0tTXTsKLWNoYXIgZGF0YVtORElTS1NdW1BBR0VfU0laRV07Ci1jaGFyIHJlY292aVtQQUdFX1NJWkVdLCByZWNvdmpbUEFHRV9TSVpFXTsKK2NoYXIgZGF0YVtORElTS1NdW1BBR0VfU0laRV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChQQUdFX1NJWkUpKSk7CitjaGFyIHJlY292aVtQQUdFX1NJWkVdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoUEFHRV9TSVpFKSkpOworY2hhciByZWNvdmpbUEFHRV9TSVpFXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKFBBR0VfU0laRSkpKTsKIAogc3RhdGljIHZvaWQgbWFrZWRhdGEoaW50IHN0YXJ0LCBpbnQgc3RvcCkKIHsKZGlmZiAtLWdpdCBhL2xpYi9yYWlkNi94ODYuaCBiL2xpYi9yYWlkNi94ODYuaAppbmRleCA4ZmU5ZDk2Li44MzRkMjY4IDEwMDY0NAotLS0gYS9saWIvcmFpZDYveDg2LmgKKysrIGIvbGliL3JhaWQ2L3g4Ni5oCkBAIC00Niw2ICs0NiwxNiBAQAogI2RlZmluZSBYODZfRkVBVFVSRV9TU1NFMwkoNCozMisgOSkgLyogU3VwcGxlbWVudGFsIFNTRS0zICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FWWAkoNCozMisyOCkgLyogQWR2YW5jZWQgVmVjdG9yIEV4dGVuc2lvbnMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQVZYMiAgICAgICAgKDkqMzIrIDUpIC8qIEFWWDIgaW5zdHJ1Y3Rpb25zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FWWDUxMkYgICAgICg5KjMyKzE2KSAvKiBBVlgtNTEyIEZvdW5kYXRpb24gKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQVZYNTEyRFEgICAgKDkqMzIrMTcpIC8qIEFWWC01MTIgRFEgKERvdWJsZS9RdWFkIGdyYW51bGFyKQorCQkJCQkgICAqIEluc3RydWN0aW9ucworCQkJCQkgICAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BVlg1MTJCVyAgICAoOSozMiszMCkgLyogQVZYLTUxMiBCVyAoQnl0ZS9Xb3JkIGdyYW51bGFyKQorCQkJCQkgICAqIEluc3RydWN0aW9ucworCQkJCQkgICAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BVlg1MTJWTCAgICAoOSozMiszMSkgLyogQVZYLTUxMiBWTCAoMTI4LzI1NiBWZWN0b3IgTGVuZ3RoKQorCQkJCQkgICAqIEV4dGVuc2lvbnMKKwkJCQkJICAgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfTU1YRVhUCSgxKjMyKzIyKSAvKiBBTUQgTU1YIGV4dGVuc2lvbnMgKi8KIAogLyogU2hvdWxkIHdvcmsgd2VsbCBlbm91Z2ggb24gbW9kZXJuIENQVXMgZm9yIHRlc3RpbmcgKi8KZGlmZiAtLWdpdCBhL2xpYi9yYW5kb20zMi5jIGIvbGliL3JhbmRvbTMyLmMKaW5kZXggNjllZDU5My4uOTE1OTgyYiAxMDA2NDQKLS0tIGEvbGliL3JhbmRvbTMyLmMKKysrIGIvbGliL3JhbmRvbTMyLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAl1MzIgcmVzOwogCiAJcmVzID0gcHJhbmRvbV91MzJfc3RhdGUoc3RhdGUpOwotCXB1dF9jcHVfdmFyKHN0YXRlKTsKKwlwdXRfY3B1X3ZhcihuZXRfcmFuZF9zdGF0ZSk7CiAKIAlyZXR1cm4gcmVzOwogfQpAQCAtMTI4LDcgKzEyOCw3IEBACiAJc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUgPSAmZ2V0X2NwdV92YXIobmV0X3JhbmRfc3RhdGUpOwogCiAJcHJhbmRvbV9ieXRlc19zdGF0ZShzdGF0ZSwgYnVmLCBieXRlcyk7Ci0JcHV0X2NwdV92YXIoc3RhdGUpOworCXB1dF9jcHVfdmFyKG5ldF9yYW5kX3N0YXRlKTsKIH0KIEVYUE9SVF9TWU1CT0wocHJhbmRvbV9ieXRlcyk7CiAKZGlmZiAtLWdpdCBhL2xpYi9yaGFzaHRhYmxlLmMgYi9saWIvcmhhc2h0YWJsZS5jCmluZGV4IDViYTUyMGIuLjMyZDBhZDAgMTAwNjQ0Ci0tLSBhL2xpYi9yaGFzaHRhYmxlLmMKKysrIGIvbGliL3JoYXNodGFibGUuYwpAQCAtNzcsMTcgKzc3LDE4IEBACiAJc2l6ZSA9IG1pbl90KHVuc2lnbmVkIGludCwgc2l6ZSwgdGJsLT5zaXplID4+IDEpOwogCiAJaWYgKHNpemVvZihzcGlubG9ja190KSAhPSAwKSB7CisJCXRibC0+bG9ja3MgPSBOVUxMOwogI2lmZGVmIENPTkZJR19OVU1BCiAJCWlmIChzaXplICogc2l6ZW9mKHNwaW5sb2NrX3QpID4gUEFHRV9TSVpFICYmCiAJCSAgICBnZnAgPT0gR0ZQX0tFUk5FTCkKIAkJCXRibC0+bG9ja3MgPSB2bWFsbG9jKHNpemUgKiBzaXplb2Yoc3BpbmxvY2tfdCkpOwotCQllbHNlCiAjZW5kaWYKIAkJaWYgKGdmcCAhPSBHRlBfS0VSTkVMKQogCQkJZ2ZwIHw9IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlk7CiAKLQkJdGJsLT5sb2NrcyA9IGttYWxsb2NfYXJyYXkoc2l6ZSwgc2l6ZW9mKHNwaW5sb2NrX3QpLAotCQkJCQkgICBnZnApOworCQlpZiAoIXRibC0+bG9ja3MpCisJCQl0YmwtPmxvY2tzID0ga21hbGxvY19hcnJheShzaXplLCBzaXplb2Yoc3BpbmxvY2tfdCksCisJCQkJCQkgICBnZnApOwogCQlpZiAoIXRibC0+bG9ja3MpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKQEAgLTM3NywyMiArMzc4LDggQEAKIAkJc2NoZWR1bGVfd29yaygmaHQtPnJ1bl93b3JrKTsKIH0KIAotc3RhdGljIGJvb2wgcmhhc2h0YWJsZV9jaGVja19lbGFzdGljaXR5KHN0cnVjdCByaGFzaHRhYmxlICpodCwKLQkJCQkJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLAotCQkJCQl1bnNpZ25lZCBpbnQgaGFzaCkKLXsKLQl1bnNpZ25lZCBpbnQgZWxhc3RpY2l0eSA9IGh0LT5lbGFzdGljaXR5OwotCXN0cnVjdCByaGFzaF9oZWFkICpoZWFkOwotCi0Jcmh0X2Zvcl9lYWNoKGhlYWQsIHRibCwgaGFzaCkKLQkJaWYgKCEtLWVsYXN0aWNpdHkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotaW50IHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCi0JCQkgICAgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCkKK3N0YXRpYyBpbnQgcmhhc2h0YWJsZV9pbnNlcnRfcmVoYXNoKHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJCQkgICAgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsKQogewogCXN0cnVjdCBidWNrZXRfdGFibGUgKm9sZF90Ymw7CiAJc3RydWN0IGJ1Y2tldF90YWJsZSAqbmV3X3RibDsKQEAgLTQzOCw2MSArNDI1LDE3MiBAQAogCiAJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaCk7CiAKLXN0cnVjdCBidWNrZXRfdGFibGUgKnJoYXNodGFibGVfaW5zZXJ0X3Nsb3coc3RydWN0IHJoYXNodGFibGUgKmh0LAotCQkJCQkgICAgY29uc3Qgdm9pZCAqa2V5LAotCQkJCQkgICAgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKLQkJCQkJICAgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCkKK3N0YXRpYyB2b2lkICpyaGFzaHRhYmxlX2xvb2t1cF9vbmUoc3RydWN0IHJoYXNodGFibGUgKmh0LAorCQkJCSAgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwgdW5zaWduZWQgaW50IGhhc2gsCisJCQkJICAgY29uc3Qgdm9pZCAqa2V5LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqKQogeworCXN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnIGFyZyA9IHsKKwkJLmh0ID0gaHQsCisJCS5rZXkgPSBrZXksCisJfTsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCBfX3JjdSAqKnBwcmV2OwogCXN0cnVjdCByaGFzaF9oZWFkICpoZWFkOwotCXVuc2lnbmVkIGludCBoYXNoOwotCWludCBlcnI7CisJaW50IGVsYXN0aWNpdHk7CiAKLQl0YmwgPSByaGFzaHRhYmxlX2xhc3RfdGFibGUoaHQsIHRibCk7Ci0JaGFzaCA9IGhlYWRfaGFzaGZuKGh0LCB0YmwsIG9iaik7Ci0Jc3Bpbl9sb2NrX25lc3RlZChyaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKSwgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCWVsYXN0aWNpdHkgPSBodC0+ZWxhc3RpY2l0eTsKKwlwcHJldiA9ICZ0YmwtPmJ1Y2tldHNbaGFzaF07CisJcmh0X2Zvcl9lYWNoKGhlYWQsIHRibCwgaGFzaCkgeworCQlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3Q7CisJCXN0cnVjdCByaGxpc3RfaGVhZCAqcGxpc3Q7CiAKLQllcnIgPSAtRUVYSVNUOwotCWlmIChrZXkgJiYgcmhhc2h0YWJsZV9sb29rdXBfZmFzdChodCwga2V5LCBodC0+cCkpCi0JCWdvdG8gZXhpdDsKKwkJZWxhc3RpY2l0eS0tOworCQlpZiAoIWtleSB8fAorCQkgICAgKGh0LT5wLm9ial9jbXBmbiA/CisJCSAgICAgaHQtPnAub2JqX2NtcGZuKCZhcmcsIHJodF9vYmooaHQsIGhlYWQpKSA6CisJCSAgICAgcmhhc2h0YWJsZV9jb21wYXJlKCZhcmcsIHJodF9vYmooaHQsIGhlYWQpKSkpCisJCQljb250aW51ZTsKIAotCWVyciA9IC1FMkJJRzsKKwkJaWYgKCFodC0+cmhsaXN0KQorCQkJcmV0dXJuIHJodF9vYmooaHQsIGhlYWQpOworCisJCWxpc3QgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsIHJoZWFkKTsKKwkJcGxpc3QgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCk7CisKKwkJUkNVX0lOSVRfUE9JTlRFUihsaXN0LT5uZXh0LCBwbGlzdCk7CisJCWhlYWQgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KGhlYWQtPm5leHQsIHRibCwgaGFzaCk7CisJCVJDVV9JTklUX1BPSU5URVIobGlzdC0+cmhlYWQubmV4dCwgaGVhZCk7CisJCXJjdV9hc3NpZ25fcG9pbnRlcigqcHByZXYsIG9iaik7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGVsYXN0aWNpdHkgPD0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisKKwlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKK30KKworc3RhdGljIHN0cnVjdCBidWNrZXRfdGFibGUgKnJoYXNodGFibGVfaW5zZXJ0X29uZShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJCQkgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwKKwkJCQkJCSAgdW5zaWduZWQgaW50IGhhc2gsCisJCQkJCQkgIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCisJCQkJCQkgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqbmV3X3RibDsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGVhZDsKKworCWlmICghSVNfRVJSX09SX05VTEwoZGF0YSkpCisJCXJldHVybiBFUlJfUFRSKC1FRVhJU1QpOworCisJaWYgKFBUUl9FUlIoZGF0YSkgIT0gLUVBR0FJTiAmJiBQVFJfRVJSKGRhdGEpICE9IC1FTk9FTlQpCisJCXJldHVybiBFUlJfQ0FTVChkYXRhKTsKKworCW5ld190YmwgPSByY3VfZGVyZWZlcmVuY2UodGJsLT5mdXR1cmVfdGJsKTsKKwlpZiAobmV3X3RibCkKKwkJcmV0dXJuIG5ld190Ymw7CisKKwlpZiAoUFRSX0VSUihkYXRhKSAhPSAtRU5PRU5UKQorCQlyZXR1cm4gRVJSX0NBU1QoZGF0YSk7CisKIAlpZiAodW5saWtlbHkocmh0X2dyb3dfYWJvdmVfbWF4KGh0LCB0YmwpKSkKLQkJZ290byBleGl0OworCQlyZXR1cm4gRVJSX1BUUigtRTJCSUcpOwogCi0JZXJyID0gLUVBR0FJTjsKLQlpZiAocmhhc2h0YWJsZV9jaGVja19lbGFzdGljaXR5KGh0LCB0YmwsIGhhc2gpIHx8Ci0JICAgIHJodF9ncm93X2Fib3ZlXzEwMChodCwgdGJsKSkKLQkJZ290byBleGl0OwotCi0JZXJyID0gMDsKKwlpZiAodW5saWtlbHkocmh0X2dyb3dfYWJvdmVfMTAwKGh0LCB0YmwpKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CiAKIAloZWFkID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldCh0YmwtPmJ1Y2tldHNbaGFzaF0sIHRibCwgaGFzaCk7CiAKIAlSQ1VfSU5JVF9QT0lOVEVSKG9iai0+bmV4dCwgaGVhZCk7CisJaWYgKGh0LT5yaGxpc3QpIHsKKwkJc3RydWN0IHJobGlzdF9oZWFkICpsaXN0OworCisJCWxpc3QgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsIHJoZWFkKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihsaXN0LT5uZXh0LCBOVUxMKTsKKwl9CiAKIAlyY3VfYXNzaWduX3BvaW50ZXIodGJsLT5idWNrZXRzW2hhc2hdLCBvYmopOwogCiAJYXRvbWljX2luYygmaHQtPm5lbGVtcyk7CisJaWYgKHJodF9ncm93X2Fib3ZlXzc1KGh0LCB0YmwpKQorCQlzY2hlZHVsZV93b3JrKCZodC0+cnVuX3dvcmspOwogCi1leGl0OgotCXNwaW5fdW5sb2NrKHJodF9idWNrZXRfbG9jayh0YmwsIGhhc2gpKTsKKwlyZXR1cm4gTlVMTDsKK30KIAotCWlmIChlcnIgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0JZWxzZSBpZiAoZXJyID09IC1FQUdBSU4pCi0JCXJldHVybiB0Ymw7Ci0JZWxzZQotCQlyZXR1cm4gRVJSX1BUUihlcnIpOworc3RhdGljIHZvaWQgKnJoYXNodGFibGVfdHJ5X2luc2VydChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwKKwkJCQkgICBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqKQoreworCXN0cnVjdCBidWNrZXRfdGFibGUgKm5ld190Ymw7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOworCXVuc2lnbmVkIGludCBoYXNoOworCXNwaW5sb2NrX3QgKmxvY2s7CisJdm9pZCAqZGF0YTsKKworCXRibCA9IHJjdV9kZXJlZmVyZW5jZShodC0+dGJsKTsKKworCS8qIEFsbCBpbnNlcnRpb25zIG11c3QgZ3JhYiB0aGUgb2xkZXN0IHRhYmxlIGNvbnRhaW5pbmcKKwkgKiB0aGUgaGFzaGVkIGJ1Y2tldCB0aGF0IGlzIHlldCB0byBiZSByZWhhc2hlZC4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWhhc2ggPSByaHRfaGVhZF9oYXNoZm4oaHQsIHRibCwgb2JqLCBodC0+cCk7CisJCWxvY2sgPSByaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKTsKKwkJc3Bpbl9sb2NrX2JoKGxvY2spOworCisJCWlmICh0YmwtPnJlaGFzaCA8PSBoYXNoKQorCQkJYnJlYWs7CisKKwkJc3Bpbl91bmxvY2tfYmgobG9jayk7CisJCXRibCA9IHJjdV9kZXJlZmVyZW5jZSh0YmwtPmZ1dHVyZV90YmwpOworCX0KKworCWRhdGEgPSByaGFzaHRhYmxlX2xvb2t1cF9vbmUoaHQsIHRibCwgaGFzaCwga2V5LCBvYmopOworCW5ld190YmwgPSByaGFzaHRhYmxlX2luc2VydF9vbmUoaHQsIHRibCwgaGFzaCwgb2JqLCBkYXRhKTsKKwlpZiAoUFRSX0VSUihuZXdfdGJsKSAhPSAtRUVYSVNUKQorCQlkYXRhID0gRVJSX0NBU1QobmV3X3RibCk7CisKKwl3aGlsZSAoIUlTX0VSUl9PUl9OVUxMKG5ld190YmwpKSB7CisJCXRibCA9IG5ld190Ymw7CisJCWhhc2ggPSByaHRfaGVhZF9oYXNoZm4oaHQsIHRibCwgb2JqLCBodC0+cCk7CisJCXNwaW5fbG9ja19uZXN0ZWQocmh0X2J1Y2tldF9sb2NrKHRibCwgaGFzaCksCisJCQkJIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKworCQlkYXRhID0gcmhhc2h0YWJsZV9sb29rdXBfb25lKGh0LCB0YmwsIGhhc2gsIGtleSwgb2JqKTsKKwkJbmV3X3RibCA9IHJoYXNodGFibGVfaW5zZXJ0X29uZShodCwgdGJsLCBoYXNoLCBvYmosIGRhdGEpOworCQlpZiAoUFRSX0VSUihuZXdfdGJsKSAhPSAtRUVYSVNUKQorCQkJZGF0YSA9IEVSUl9DQVNUKG5ld190YmwpOworCisJCXNwaW5fdW5sb2NrKHJodF9idWNrZXRfbG9jayh0YmwsIGhhc2gpKTsKKwl9CisKKwlzcGluX3VubG9ja19iaChsb2NrKTsKKworCWlmIChQVFJfRVJSKGRhdGEpID09IC1FQUdBSU4pCisJCWRhdGEgPSBFUlJfUFRSKHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaChodCwgdGJsKSA/OgorCQkJICAgICAgIC1FQUdBSU4pOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3ZvaWQgKnJoYXNodGFibGVfaW5zZXJ0X3Nsb3coc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksCisJCQkgICAgIHN0cnVjdCByaGFzaF9oZWFkICpvYmopCit7CisJdm9pZCAqZGF0YTsKKworCWRvIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlkYXRhID0gcmhhc2h0YWJsZV90cnlfaW5zZXJ0KGh0LCBrZXksIG9iaik7CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0gd2hpbGUgKFBUUl9FUlIoZGF0YSkgPT0gLUVBR0FJTik7CisKKwlyZXR1cm4gZGF0YTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfaW5zZXJ0X3Nsb3cpOwogCiAvKioKLSAqIHJoYXNodGFibGVfd2Fsa19pbml0IC0gSW5pdGlhbGlzZSBhbiBpdGVyYXRvcgorICogcmhhc2h0YWJsZV93YWxrX2VudGVyIC0gSW5pdGlhbGlzZSBhbiBpdGVyYXRvcgogICogQGh0OgkJVGFibGUgdG8gd2FsayBvdmVyCiAgKiBAaXRlcjoJSGFzaCB0YWJsZSBJdGVyYXRvcgotICogQGdmcDoJR0ZQIGZsYWdzIGZvciBhbGxvY2F0aW9ucwogICoKICAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgYSBoYXNoIHRhYmxlIHdhbGsuCiAgKgpAQCAtNTA3LDMwICs2MDUsMjIgQEAKICAqIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwIHNvIHlvdSBtdXN0IG5vdCBjYWxsIGl0IGZyb20gaW50ZXJydXB0CiAgKiBjb250ZXh0IG9yIHdpdGggc3BpbiBsb2NrcyBoZWxkLgogICoKLSAqIFlvdSBtdXN0IGNhbGwgcmhhc2h0YWJsZV93YWxrX2V4aXQgaWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zCi0gKiBzdWNjZXNzZnVsbHkuCisgKiBZb3UgbXVzdCBjYWxsIHJoYXNodGFibGVfd2Fsa19leGl0IGFmdGVyIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqLwotaW50IHJoYXNodGFibGVfd2Fsa19pbml0KHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlciwKLQkJCSBnZnBfdCBnZnApCit2b2lkIHJoYXNodGFibGVfd2Fsa19lbnRlcihzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpCiB7CiAJaXRlci0+aHQgPSBodDsKIAlpdGVyLT5wID0gTlVMTDsKIAlpdGVyLT5zbG90ID0gMDsKIAlpdGVyLT5za2lwID0gMDsKIAotCWl0ZXItPndhbGtlciA9IGttYWxsb2Moc2l6ZW9mKCppdGVyLT53YWxrZXIpLCBnZnApOwotCWlmICghaXRlci0+d2Fsa2VyKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCXNwaW5fbG9jaygmaHQtPmxvY2spOwotCWl0ZXItPndhbGtlci0+dGJsID0KKwlpdGVyLT53YWxrZXIudGJsID0KIAkJcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChodC0+dGJsLCBsb2NrZGVwX2lzX2hlbGQoJmh0LT5sb2NrKSk7Ci0JbGlzdF9hZGQoJml0ZXItPndhbGtlci0+bGlzdCwgJml0ZXItPndhbGtlci0+dGJsLT53YWxrZXJzKTsKKwlsaXN0X2FkZCgmaXRlci0+d2Fsa2VyLmxpc3QsICZpdGVyLT53YWxrZXIudGJsLT53YWxrZXJzKTsKIAlzcGluX3VubG9jaygmaHQtPmxvY2spOwotCi0JcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX3dhbGtfaW5pdCk7CitFWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX3dhbGtfZW50ZXIpOwogCiAvKioKICAqIHJoYXNodGFibGVfd2Fsa19leGl0IC0gRnJlZSBhbiBpdGVyYXRvcgpAQCAtNTQxLDEwICs2MzEsOSBAQAogdm9pZCByaGFzaHRhYmxlX3dhbGtfZXhpdChzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyKQogewogCXNwaW5fbG9jaygmaXRlci0+aHQtPmxvY2spOwotCWlmIChpdGVyLT53YWxrZXItPnRibCkKLQkJbGlzdF9kZWwoJml0ZXItPndhbGtlci0+bGlzdCk7CisJaWYgKGl0ZXItPndhbGtlci50YmwpCisJCWxpc3RfZGVsKCZpdGVyLT53YWxrZXIubGlzdCk7CiAJc3Bpbl91bmxvY2soJml0ZXItPmh0LT5sb2NrKTsKLQlrZnJlZShpdGVyLT53YWxrZXIpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV93YWxrX2V4aXQpOwogCkBAIC01NzAsMTIgKzY1OSwxMiBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAogCXNwaW5fbG9jaygmaHQtPmxvY2spOwotCWlmIChpdGVyLT53YWxrZXItPnRibCkKLQkJbGlzdF9kZWwoJml0ZXItPndhbGtlci0+bGlzdCk7CisJaWYgKGl0ZXItPndhbGtlci50YmwpCisJCWxpc3RfZGVsKCZpdGVyLT53YWxrZXIubGlzdCk7CiAJc3Bpbl91bmxvY2soJmh0LT5sb2NrKTsKIAotCWlmICghaXRlci0+d2Fsa2VyLT50YmwpIHsKLQkJaXRlci0+d2Fsa2VyLT50YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT50YmwsIGh0KTsKKwlpZiAoIWl0ZXItPndhbGtlci50YmwpIHsKKwkJaXRlci0+d2Fsa2VyLnRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKQEAgLTU5NywxMiArNjg2LDE3IEBACiAgKi8KIHZvaWQgKnJoYXNodGFibGVfd2Fsa19uZXh0KHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpCiB7Ci0Jc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsID0gaXRlci0+d2Fsa2VyLT50Ymw7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsID0gaXRlci0+d2Fsa2VyLnRibDsKKwlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3QgPSBpdGVyLT5saXN0OwogCXN0cnVjdCByaGFzaHRhYmxlICpodCA9IGl0ZXItPmh0OwogCXN0cnVjdCByaGFzaF9oZWFkICpwID0gaXRlci0+cDsKKwlib29sIHJobGlzdCA9IGh0LT5yaGxpc3Q7CiAKIAlpZiAocCkgewotCQlwID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldF9yY3UocC0+bmV4dCwgdGJsLCBpdGVyLT5zbG90KTsKKwkJaWYgKCFyaGxpc3QgfHwgIShsaXN0ID0gcmN1X2RlcmVmZXJlbmNlKGxpc3QtPm5leHQpKSkgeworCQkJcCA9IHJjdV9kZXJlZmVyZW5jZShwLT5uZXh0KTsKKwkJCWxpc3QgPSBjb250YWluZXJfb2YocCwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCk7CisJCX0KIAkJZ290byBuZXh0OwogCX0KIApAQCAtNjEwLDYgKzcwNCwxOCBAQAogCQlpbnQgc2tpcCA9IGl0ZXItPnNraXA7CiAKIAkJcmh0X2Zvcl9lYWNoX3JjdShwLCB0YmwsIGl0ZXItPnNsb3QpIHsKKwkJCWlmIChyaGxpc3QpIHsKKwkJCQlsaXN0ID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCByaGxpc3RfaGVhZCwKKwkJCQkJCSAgICByaGVhZCk7CisJCQkJZG8geworCQkJCQlpZiAoIXNraXApCisJCQkJCQlnb3RvIG5leHQ7CisJCQkJCXNraXAtLTsKKwkJCQkJbGlzdCA9IHJjdV9kZXJlZmVyZW5jZShsaXN0LT5uZXh0KTsKKwkJCQl9IHdoaWxlIChsaXN0KTsKKworCQkJCWNvbnRpbnVlOworCQkJfQogCQkJaWYgKCFza2lwKQogCQkJCWJyZWFrOwogCQkJc2tpcC0tOwpAQCAtNjE5LDcgKzcyNSw4IEBACiAJCWlmICghcmh0X2lzX2FfbnVsbHMocCkpIHsKIAkJCWl0ZXItPnNraXArKzsKIAkJCWl0ZXItPnAgPSBwOwotCQkJcmV0dXJuIHJodF9vYmooaHQsIHApOworCQkJaXRlci0+bGlzdCA9IGxpc3Q7CisJCQlyZXR1cm4gcmh0X29iaihodCwgcmhsaXN0ID8gJmxpc3QtPnJoZWFkIDogcCk7CiAJCX0KIAogCQlpdGVyLT5za2lwID0gMDsKQEAgLTYzMCw4ICs3MzcsOCBAQAogCS8qIEVuc3VyZSB3ZSBzZWUgYW55IG5ldyB0YWJsZXMuICovCiAJc21wX3JtYigpOwogCi0JaXRlci0+d2Fsa2VyLT50YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KHRibC0+ZnV0dXJlX3RibCwgaHQpOwotCWlmIChpdGVyLT53YWxrZXItPnRibCkgeworCWl0ZXItPndhbGtlci50YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KHRibC0+ZnV0dXJlX3RibCwgaHQpOworCWlmIChpdGVyLT53YWxrZXIudGJsKSB7CiAJCWl0ZXItPnNsb3QgPSAwOwogCQlpdGVyLT5za2lwID0gMDsKIAkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CkBAIC02NTEsNyArNzU4LDcgQEAKIAlfX3JlbGVhc2VzKFJDVSkKIHsKIAlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQ7Ci0Jc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsID0gaXRlci0+d2Fsa2VyLT50Ymw7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsID0gaXRlci0+d2Fsa2VyLnRibDsKIAogCWlmICghdGJsKQogCQlnb3RvIG91dDsKQEAgLTY2MCw5ICs3NjcsOSBAQAogCiAJc3Bpbl9sb2NrKCZodC0+bG9jayk7CiAJaWYgKHRibC0+cmVoYXNoIDwgdGJsLT5zaXplKQotCQlsaXN0X2FkZCgmaXRlci0+d2Fsa2VyLT5saXN0LCAmdGJsLT53YWxrZXJzKTsKKwkJbGlzdF9hZGQoJml0ZXItPndhbGtlci5saXN0LCAmdGJsLT53YWxrZXJzKTsKIAllbHNlCi0JCWl0ZXItPndhbGtlci0+dGJsID0gTlVMTDsKKwkJaXRlci0+d2Fsa2VyLnRibCA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmh0LT5sb2NrKTsKIAogCWl0ZXItPnAgPSBOVUxMOwpAQCAtODA4LDYgKzkxNSw0OCBAQAogRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV9pbml0KTsKIAogLyoqCisgKiByaGx0YWJsZV9pbml0IC0gaW5pdGlhbGl6ZSBhIG5ldyBoYXNoIGxpc3QgdGFibGUKKyAqIEBobHQ6CWhhc2ggbGlzdCB0YWJsZSB0byBiZSBpbml0aWFsaXplZAorICogQHBhcmFtczoJY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKgorICogSW5pdGlhbGl6ZXMgYSBuZXcgaGFzaCBsaXN0IHRhYmxlLgorICoKKyAqIFNlZSBkb2N1bWVudGF0aW9uIGZvciByaGFzaHRhYmxlX2luaXQuCisgKi8KK2ludCByaGx0YWJsZV9pbml0KHN0cnVjdCByaGx0YWJsZSAqaGx0LCBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgZXJyOworCisJLyogTm8gcmhsaXN0IE5VTExzIG1hcmtpbmcgZm9yIG5vdy4gKi8KKwlpZiAocGFyYW1zLT5udWxsc19iYXNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IHJoYXNodGFibGVfaW5pdCgmaGx0LT5odCwgcGFyYW1zKTsKKwlobHQtPmh0LnJobGlzdCA9IHRydWU7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJobHRhYmxlX2luaXQpOworCitzdGF0aWMgdm9pZCByaGFzaHRhYmxlX2ZyZWVfb25lKHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKKwkJCQl2b2lkICgqZnJlZV9mbikodm9pZCAqcHRyLCB2b2lkICphcmcpLAorCQkJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3Q7CisKKwlpZiAoIWh0LT5yaGxpc3QpIHsKKwkJZnJlZV9mbihyaHRfb2JqKGh0LCBvYmopLCBhcmcpOworCQlyZXR1cm47CisJfQorCisJbGlzdCA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpOworCWRvIHsKKwkJb2JqID0gJmxpc3QtPnJoZWFkOworCQlsaXN0ID0gcmh0X2RlcmVmZXJlbmNlKGxpc3QtPm5leHQsIGh0KTsKKwkJZnJlZV9mbihyaHRfb2JqKGh0LCBvYmopLCBhcmcpOworCX0gd2hpbGUgKGxpc3QpOworfQorCisvKioKICAqIHJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveSAtIGZyZWUgZWxlbWVudHMgYW5kIGRlc3Ryb3kgaGFzaCB0YWJsZQogICogQGh0OgkJdGhlIGhhc2ggdGFibGUgdG8gZGVzdHJveQogICogQGZyZWVfZm46CWNhbGxiYWNrIHRvIHJlbGVhc2UgcmVzb3VyY2VzIG9mIGVsZW1lbnQKQEAgLTg0NCw3ICs5OTMsNyBAQAogCQkJICAgICBwb3MgPSBuZXh0LAogCQkJICAgICBuZXh0ID0gIXJodF9pc19hX251bGxzKHBvcykgPwogCQkJCQlyaHRfZGVyZWZlcmVuY2UocG9zLT5uZXh0LCBodCkgOiBOVUxMKQotCQkJCWZyZWVfZm4ocmh0X29iaihodCwgcG9zKSwgYXJnKTsKKwkJCQlyaGFzaHRhYmxlX2ZyZWVfb25lKGh0LCBwb3MsIGZyZWVfZm4sIGFyZyk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2xpYi9zYml0bWFwLmMgYi9saWIvc2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZWNmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc2JpdG1hcC5jCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEZhY2Vib29rCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNCBKZW5zIEF4Ym9lCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2JpdG1hcC5oPgorCitpbnQgc2JpdG1hcF9pbml0X25vZGUoc3RydWN0IHNiaXRtYXAgKnNiLCB1bnNpZ25lZCBpbnQgZGVwdGgsIGludCBzaGlmdCwKKwkJICAgICAgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQoreworCXVuc2lnbmVkIGludCBiaXRzX3Blcl93b3JkOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKHNoaWZ0IDwgMCkgeworCQlzaGlmdCA9IGlsb2cyKEJJVFNfUEVSX0xPTkcpOworCQkvKgorCQkgKiBJZiB0aGUgYml0bWFwIGlzIHNtYWxsLCBzaHJpbmsgdGhlIG51bWJlciBvZiBiaXRzIHBlciB3b3JkIHNvCisJCSAqIHdlIHNwcmVhZCBvdmVyIGEgZmV3IGNhY2hlbGluZXMsIGF0IGxlYXN0LiBJZiBsZXNzIHRoYW4gNAorCQkgKiBiaXRzLCBqdXN0IGZvcmdldCBhYm91dCBpdCwgaXQncyBub3QgZ29pbmcgdG8gd29yayBvcHRpbWFsbHkKKwkJICogYW55d2F5LgorCQkgKi8KKwkJaWYgKGRlcHRoID49IDQpIHsKKwkJCXdoaWxlICgoNFUgPDwgc2hpZnQpID4gZGVwdGgpCisJCQkJc2hpZnQtLTsKKwkJfQorCX0KKwliaXRzX3Blcl93b3JkID0gMVUgPDwgc2hpZnQ7CisJaWYgKGJpdHNfcGVyX3dvcmQgPiBCSVRTX1BFUl9MT05HKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNiLT5zaGlmdCA9IHNoaWZ0OworCXNiLT5kZXB0aCA9IGRlcHRoOworCXNiLT5tYXBfbnIgPSBESVZfUk9VTkRfVVAoc2ItPmRlcHRoLCBiaXRzX3Blcl93b3JkKTsKKworCWlmIChkZXB0aCA9PSAwKSB7CisJCXNiLT5tYXAgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwlzYi0+bWFwID0ga3phbGxvY19ub2RlKHNiLT5tYXBfbnIgKiBzaXplb2YoKnNiLT5tYXApLCBmbGFncywgbm9kZSk7CisJaWYgKCFzYi0+bWFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBzYi0+bWFwX25yOyBpKyspIHsKKwkJc2ItPm1hcFtpXS5kZXB0aCA9IG1pbihkZXB0aCwgYml0c19wZXJfd29yZCk7CisJCWRlcHRoIC09IHNiLT5tYXBbaV0uZGVwdGg7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2JpdG1hcF9pbml0X25vZGUpOworCit2b2lkIHNiaXRtYXBfcmVzaXplKHN0cnVjdCBzYml0bWFwICpzYiwgdW5zaWduZWQgaW50IGRlcHRoKQoreworCXVuc2lnbmVkIGludCBiaXRzX3Blcl93b3JkID0gMVUgPDwgc2ItPnNoaWZ0OworCXVuc2lnbmVkIGludCBpOworCisJc2ItPmRlcHRoID0gZGVwdGg7CisJc2ItPm1hcF9uciA9IERJVl9ST1VORF9VUChzYi0+ZGVwdGgsIGJpdHNfcGVyX3dvcmQpOworCisJZm9yIChpID0gMDsgaSA8IHNiLT5tYXBfbnI7IGkrKykgeworCQlzYi0+bWFwW2ldLmRlcHRoID0gbWluKGRlcHRoLCBiaXRzX3Blcl93b3JkKTsKKwkJZGVwdGggLT0gc2ItPm1hcFtpXS5kZXB0aDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYml0bWFwX3Jlc2l6ZSk7CisKK3N0YXRpYyBpbnQgX19zYml0bWFwX2dldF93b3JkKHN0cnVjdCBzYml0bWFwX3dvcmQgKndvcmQsIHVuc2lnbmVkIGludCBoaW50LAorCQkJICAgICAgYm9vbCB3cmFwKQoreworCXVuc2lnbmVkIGludCBvcmlnX2hpbnQgPSBoaW50OworCWludCBucjsKKworCXdoaWxlICgxKSB7CisJCW5yID0gZmluZF9uZXh0X3plcm9fYml0KCZ3b3JkLT53b3JkLCB3b3JkLT5kZXB0aCwgaGludCk7CisJCWlmICh1bmxpa2VseShuciA+PSB3b3JkLT5kZXB0aCkpIHsKKwkJCS8qCisJCQkgKiBXZSBzdGFydGVkIHdpdGggYW4gb2Zmc2V0LCBhbmQgd2UgZGlkbid0IHJlc2V0IHRoZQorCQkJICogb2Zmc2V0IHRvIDAgaW4gYSBmYWlsdXJlIGNhc2UsIHNvIHN0YXJ0IGZyb20gMCB0bworCQkJICogZXhoYXVzdCB0aGUgbWFwLgorCQkJICovCisJCQlpZiAob3JpZ19oaW50ICYmIGhpbnQgJiYgd3JhcCkgeworCQkJCWhpbnQgPSBvcmlnX2hpbnQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KG5yLCAmd29yZC0+d29yZCkpCisJCQlicmVhazsKKworCQloaW50ID0gbnIgKyAxOworCQlpZiAoaGludCA+PSB3b3JkLT5kZXB0aCAtIDEpCisJCQloaW50ID0gMDsKKwl9CisKKwlyZXR1cm4gbnI7Cit9CisKK2ludCBzYml0bWFwX2dldChzdHJ1Y3Qgc2JpdG1hcCAqc2IsIHVuc2lnbmVkIGludCBhbGxvY19oaW50LCBib29sIHJvdW5kX3JvYmluKQoreworCXVuc2lnbmVkIGludCBpLCBpbmRleDsKKwlpbnQgbnIgPSAtMTsKKworCWluZGV4ID0gU0JfTlJfVE9fSU5ERVgoc2IsIGFsbG9jX2hpbnQpOworCisJZm9yIChpID0gMDsgaSA8IHNiLT5tYXBfbnI7IGkrKykgeworCQluciA9IF9fc2JpdG1hcF9nZXRfd29yZCgmc2ItPm1hcFtpbmRleF0sCisJCQkJCVNCX05SX1RPX0JJVChzYiwgYWxsb2NfaGludCksCisJCQkJCSFyb3VuZF9yb2Jpbik7CisJCWlmIChuciAhPSAtMSkgeworCQkJbnIgKz0gaW5kZXggPDwgc2ItPnNoaWZ0OworCQkJYnJlYWs7CisJCX0KKworCQkvKiBKdW1wIHRvIG5leHQgaW5kZXguICovCisJCWluZGV4Kys7CisJCWFsbG9jX2hpbnQgPSBpbmRleCA8PCBzYi0+c2hpZnQ7CisKKwkJaWYgKGluZGV4ID49IHNiLT5tYXBfbnIpIHsKKwkJCWluZGV4ID0gMDsKKwkJCWFsbG9jX2hpbnQgPSAwOworCQl9CisJfQorCisJcmV0dXJuIG5yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2JpdG1hcF9nZXQpOworCitib29sIHNiaXRtYXBfYW55X2JpdF9zZXQoY29uc3Qgc3RydWN0IHNiaXRtYXAgKnNiKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNiLT5tYXBfbnI7IGkrKykgeworCQlpZiAoc2ItPm1hcFtpXS53b3JkKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNiaXRtYXBfYW55X2JpdF9zZXQpOworCitib29sIHNiaXRtYXBfYW55X2JpdF9jbGVhcihjb25zdCBzdHJ1Y3Qgc2JpdG1hcCAqc2IpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2ItPm1hcF9ucjsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBzYml0bWFwX3dvcmQgKndvcmQgPSAmc2ItPm1hcFtpXTsKKwkJdW5zaWduZWQgbG9uZyByZXQ7CisKKwkJcmV0ID0gZmluZF9maXJzdF96ZXJvX2JpdCgmd29yZC0+d29yZCwgd29yZC0+ZGVwdGgpOworCQlpZiAocmV0IDwgd29yZC0+ZGVwdGgpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2JpdG1hcF9hbnlfYml0X2NsZWFyKTsKKwordW5zaWduZWQgaW50IHNiaXRtYXBfd2VpZ2h0KGNvbnN0IHN0cnVjdCBzYml0bWFwICpzYikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgd2VpZ2h0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBzYi0+bWFwX25yOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHNiaXRtYXBfd29yZCAqd29yZCA9ICZzYi0+bWFwW2ldOworCisJCXdlaWdodCArPSBiaXRtYXBfd2VpZ2h0KCZ3b3JkLT53b3JkLCB3b3JkLT5kZXB0aCk7CisJfQorCXJldHVybiB3ZWlnaHQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYml0bWFwX3dlaWdodCk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2JxX2NhbGNfd2FrZV9iYXRjaCh1bnNpZ25lZCBpbnQgZGVwdGgpCit7CisJdW5zaWduZWQgaW50IHdha2VfYmF0Y2g7CisKKwkvKgorCSAqIEZvciBlYWNoIGJhdGNoLCB3ZSB3YWtlIHVwIG9uZSBxdWV1ZS4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBvdXIKKwkgKiBiYXRjaCBzaXplIGlzIHNtYWxsIGVub3VnaCB0aGF0IHRoZSBmdWxsIGRlcHRoIG9mIHRoZSBiaXRtYXAgaXMKKwkgKiBlbm91Z2ggdG8gd2FrZSB1cCBhbGwgb2YgdGhlIHF1ZXVlcy4KKwkgKi8KKwl3YWtlX2JhdGNoID0gU0JRX1dBS0VfQkFUQ0g7CisJaWYgKHdha2VfYmF0Y2ggPiBkZXB0aCAvIFNCUV9XQUlUX1FVRVVFUykKKwkJd2FrZV9iYXRjaCA9IG1heCgxVSwgZGVwdGggLyBTQlFfV0FJVF9RVUVVRVMpOworCisJcmV0dXJuIHdha2VfYmF0Y2g7Cit9CisKK2ludCBzYml0bWFwX3F1ZXVlX2luaXRfbm9kZShzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAqc2JxLCB1bnNpZ25lZCBpbnQgZGVwdGgsCisJCQkgICAgaW50IHNoaWZ0LCBib29sIHJvdW5kX3JvYmluLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCXJldCA9IHNiaXRtYXBfaW5pdF9ub2RlKCZzYnEtPnNiLCBkZXB0aCwgc2hpZnQsIGZsYWdzLCBub2RlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2JxLT5hbGxvY19oaW50ID0gYWxsb2NfcGVyY3B1X2dmcCh1bnNpZ25lZCBpbnQsIGZsYWdzKTsKKwlpZiAoIXNicS0+YWxsb2NfaGludCkgeworCQlzYml0bWFwX2ZyZWUoJnNicS0+c2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoZGVwdGggJiYgIXJvdW5kX3JvYmluKSB7CisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQorCQkJKnBlcl9jcHVfcHRyKHNicS0+YWxsb2NfaGludCwgaSkgPSBwcmFuZG9tX3UzMigpICUgZGVwdGg7CisJfQorCisJc2JxLT53YWtlX2JhdGNoID0gc2JxX2NhbGNfd2FrZV9iYXRjaChkZXB0aCk7CisJYXRvbWljX3NldCgmc2JxLT53YWtlX2luZGV4LCAwKTsKKworCXNicS0+d3MgPSBremFsbG9jX25vZGUoU0JRX1dBSVRfUVVFVUVTICogc2l6ZW9mKCpzYnEtPndzKSwgZmxhZ3MsIG5vZGUpOworCWlmICghc2JxLT53cykgeworCQlmcmVlX3BlcmNwdShzYnEtPmFsbG9jX2hpbnQpOworCQlzYml0bWFwX2ZyZWUoJnNicS0+c2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0JRX1dBSVRfUVVFVUVTOyBpKyspIHsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmc2JxLT53c1tpXS53YWl0KTsKKwkJYXRvbWljX3NldCgmc2JxLT53c1tpXS53YWl0X2NudCwgc2JxLT53YWtlX2JhdGNoKTsKKwl9CisKKwlzYnEtPnJvdW5kX3JvYmluID0gcm91bmRfcm9iaW47CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYml0bWFwX3F1ZXVlX2luaXRfbm9kZSk7CisKK3ZvaWQgc2JpdG1hcF9xdWV1ZV9yZXNpemUoc3RydWN0IHNiaXRtYXBfcXVldWUgKnNicSwgdW5zaWduZWQgaW50IGRlcHRoKQoreworCXNicS0+d2FrZV9iYXRjaCA9IHNicV9jYWxjX3dha2VfYmF0Y2goZGVwdGgpOworCXNiaXRtYXBfcmVzaXplKCZzYnEtPnNiLCBkZXB0aCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYml0bWFwX3F1ZXVlX3Jlc2l6ZSk7CisKK2ludCBfX3NiaXRtYXBfcXVldWVfZ2V0KHN0cnVjdCBzYml0bWFwX3F1ZXVlICpzYnEpCit7CisJdW5zaWduZWQgaW50IGhpbnQsIGRlcHRoOworCWludCBucjsKKworCWhpbnQgPSB0aGlzX2NwdV9yZWFkKCpzYnEtPmFsbG9jX2hpbnQpOworCWRlcHRoID0gUkVBRF9PTkNFKHNicS0+c2IuZGVwdGgpOworCWlmICh1bmxpa2VseShoaW50ID49IGRlcHRoKSkgeworCQloaW50ID0gZGVwdGggPyBwcmFuZG9tX3UzMigpICUgZGVwdGggOiAwOworCQl0aGlzX2NwdV93cml0ZSgqc2JxLT5hbGxvY19oaW50LCBoaW50KTsKKwl9CisJbnIgPSBzYml0bWFwX2dldCgmc2JxLT5zYiwgaGludCwgc2JxLT5yb3VuZF9yb2Jpbik7CisKKwlpZiAobnIgPT0gLTEpIHsKKwkJLyogSWYgdGhlIG1hcCBpcyBmdWxsLCBhIGhpbnQgd29uJ3QgZG8gdXMgbXVjaCBnb29kLiAqLworCQl0aGlzX2NwdV93cml0ZSgqc2JxLT5hbGxvY19oaW50LCAwKTsKKwl9IGVsc2UgaWYgKG5yID09IGhpbnQgfHwgdW5saWtlbHkoc2JxLT5yb3VuZF9yb2JpbikpIHsKKwkJLyogT25seSB1cGRhdGUgdGhlIGhpbnQgaWYgd2UgdXNlZCBpdC4gKi8KKwkJaGludCA9IG5yICsgMTsKKwkJaWYgKGhpbnQgPj0gZGVwdGggLSAxKQorCQkJaGludCA9IDA7CisJCXRoaXNfY3B1X3dyaXRlKCpzYnEtPmFsbG9jX2hpbnQsIGhpbnQpOworCX0KKworCXJldHVybiBucjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fc2JpdG1hcF9xdWV1ZV9nZXQpOworCitzdGF0aWMgc3RydWN0IHNicV93YWl0X3N0YXRlICpzYnFfd2FrZV9wdHIoc3RydWN0IHNiaXRtYXBfcXVldWUgKnNicSkKK3sKKwlpbnQgaSwgd2FrZV9pbmRleDsKKworCXdha2VfaW5kZXggPSBhdG9taWNfcmVhZCgmc2JxLT53YWtlX2luZGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgU0JRX1dBSVRfUVVFVUVTOyBpKyspIHsKKwkJc3RydWN0IHNicV93YWl0X3N0YXRlICp3cyA9ICZzYnEtPndzW3dha2VfaW5kZXhdOworCisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ3cy0+d2FpdCkpIHsKKwkJCWludCBvID0gYXRvbWljX3JlYWQoJnNicS0+d2FrZV9pbmRleCk7CisKKwkJCWlmICh3YWtlX2luZGV4ICE9IG8pCisJCQkJYXRvbWljX2NtcHhjaGcoJnNicS0+d2FrZV9pbmRleCwgbywgd2FrZV9pbmRleCk7CisJCQlyZXR1cm4gd3M7CisJCX0KKworCQl3YWtlX2luZGV4ID0gc2JxX2luZGV4X2luYyh3YWtlX2luZGV4KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2JxX3dha2VfdXAoc3RydWN0IHNiaXRtYXBfcXVldWUgKnNicSkKK3sKKwlzdHJ1Y3Qgc2JxX3dhaXRfc3RhdGUgKndzOworCWludCB3YWl0X2NudDsKKworCS8qIEVuc3VyZSB0aGF0IHRoZSB3YWl0IGxpc3QgY2hlY2tzIG9jY3VyIGFmdGVyIGNsZWFyX2JpdCgpLiAqLworCXNtcF9tYigpOworCisJd3MgPSBzYnFfd2FrZV9wdHIoc2JxKTsKKwlpZiAoIXdzKQorCQlyZXR1cm47CisKKwl3YWl0X2NudCA9IGF0b21pY19kZWNfcmV0dXJuKCZ3cy0+d2FpdF9jbnQpOworCWlmICh1bmxpa2VseSh3YWl0X2NudCA8IDApKQorCQl3YWl0X2NudCA9IGF0b21pY19pbmNfcmV0dXJuKCZ3cy0+d2FpdF9jbnQpOworCWlmICh3YWl0X2NudCA9PSAwKSB7CisJCWF0b21pY19hZGQoc2JxLT53YWtlX2JhdGNoLCAmd3MtPndhaXRfY250KTsKKwkJc2JxX2luZGV4X2F0b21pY19pbmMoJnNicS0+d2FrZV9pbmRleCk7CisJCXdha2VfdXAoJndzLT53YWl0KTsKKwl9Cit9CisKK3ZvaWQgc2JpdG1hcF9xdWV1ZV9jbGVhcihzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAqc2JxLCB1bnNpZ25lZCBpbnQgbnIsCisJCQkgdW5zaWduZWQgaW50IGNwdSkKK3sKKwlzYml0bWFwX2NsZWFyX2JpdCgmc2JxLT5zYiwgbnIpOworCXNicV93YWtlX3VwKHNicSk7CisJaWYgKGxpa2VseSghc2JxLT5yb3VuZF9yb2JpbiAmJiBuciA8IHNicS0+c2IuZGVwdGgpKQorCQkqcGVyX2NwdV9wdHIoc2JxLT5hbGxvY19oaW50LCBjcHUpID0gbnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYml0bWFwX3F1ZXVlX2NsZWFyKTsKKwordm9pZCBzYml0bWFwX3F1ZXVlX3dha2VfYWxsKHN0cnVjdCBzYml0bWFwX3F1ZXVlICpzYnEpCit7CisJaW50IGksIHdha2VfaW5kZXg7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBhbGwgY2hhbmdlcyBwcmlvciB0byB0aGlzIGFyZSB2aXNpYmxlIGZyb20gb3RoZXIgQ1BVcy4KKwkgKi8KKwlzbXBfbWIoKTsKKwl3YWtlX2luZGV4ID0gYXRvbWljX3JlYWQoJnNicS0+d2FrZV9pbmRleCk7CisJZm9yIChpID0gMDsgaSA8IFNCUV9XQUlUX1FVRVVFUzsgaSsrKSB7CisJCXN0cnVjdCBzYnFfd2FpdF9zdGF0ZSAqd3MgPSAmc2JxLT53c1t3YWtlX2luZGV4XTsKKworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmd3MtPndhaXQpKQorCQkJd2FrZV91cCgmd3MtPndhaXQpOworCisJCXdha2VfaW5kZXggPSBzYnFfaW5kZXhfaW5jKHdha2VfaW5kZXgpOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNiaXRtYXBfcXVldWVfd2FrZV9hbGwpOwpkaWZmIC0tZ2l0IGEvbGliL3N5c2NhbGwuYyBiL2xpYi9zeXNjYWxsLmMKaW5kZXggZTMwZTAzOS4uNjMyMzllMCAxMDA2NDQKLS0tIGEvbGliL3N5c2NhbGwuYworKysgYi9saWIvc3lzY2FsbC5jCkBAIC03LDkgKzcsMTkgQEAKIAkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnc1s2XSwgdW5zaWduZWQgaW50IG1heGFyZ3MsCiAJCQkgICB1bnNpZ25lZCBsb25nICpzcCwgdW5zaWduZWQgbG9uZyAqcGMpCiB7Ci0Jc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFyZ2V0KTsKLQlpZiAodW5saWtlbHkoIXJlZ3MpKQorCXN0cnVjdCBwdF9yZWdzICpyZWdzOworCisJaWYgKCF0cnlfZ2V0X3Rhc2tfc3RhY2sodGFyZ2V0KSkgeworCQkvKiBUYXNrIGhhcyBubyBzdGFjaywgc28gdGhlIHRhc2sgaXNuJ3QgaW4gYSBzeXNjYWxsLiAqLworCQkqY2FsbG5vID0gLTE7CisJCXJldHVybiAwOworCX0KKworCXJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFyZ2V0KTsKKwlpZiAodW5saWtlbHkoIXJlZ3MpKSB7CisJCXB1dF90YXNrX3N0YWNrKHRhcmdldCk7CiAJCXJldHVybiAtRUFHQUlOOworCX0KIAogCSpzcCA9IHVzZXJfc3RhY2tfcG9pbnRlcihyZWdzKTsKIAkqcGMgPSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOwpAQCAtMTgsNiArMjgsNyBAQAogCWlmICgqY2FsbG5vICE9IC0xTCAmJiBtYXhhcmdzID4gMCkKIAkJc3lzY2FsbF9nZXRfYXJndW1lbnRzKHRhcmdldCwgcmVncywgMCwgbWF4YXJncywgYXJncyk7CiAKKwlwdXRfdGFza19zdGFjayh0YXJnZXQpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9saWIvdGVzdF9icGYuYyBiL2xpYi90ZXN0X2JwZi5jCmluZGV4IDkzZjQ1MDEuLjk0MzQ2YjQgMTAwNjQ0Ci0tLSBhL2xpYi90ZXN0X2JwZi5jCisrKyBiL2xpYi90ZXN0X2JwZi5jCkBAIC01NDg1LDYgKzU0ODUsNyBAQAogCXNrYi0+aGFzaCA9IFNLQl9IQVNIOwogCXNrYi0+cXVldWVfbWFwcGluZyA9IFNLQl9RVUVVRV9NQVA7CiAJc2tiLT52bGFuX3RjaSA9IFNLQl9WTEFOX1RDSTsKKwlza2ItPnZsYW5fcHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7CiAJc2tiLT5kZXYgPSAmZGV2OwogCXNrYi0+ZGV2LT5pZmluZGV4ID0gU0tCX0RFVl9JRklOREVYOwogCXNrYi0+ZGV2LT50eXBlID0gU0tCX0RFVl9UWVBFOwpkaWZmIC0tZ2l0IGEvbGliL3Rlc3RfaGFzaC5jIGIvbGliL3Rlc3RfaGFzaC5jCmluZGV4IDY2YzVmYzguLmNhYzIwYzUgMTAwNjQ0Ci0tLSBhL2xpYi90ZXN0X2hhc2guYworKysgYi9saWIvdGVzdF9oYXNoLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogdGVzdF9oYXNoX2luaXQodm9pZCkKIHsKIAljaGFyIGJ1ZltTSVpFKzFdOwotCXUzMiBzdHJpbmdfb3IgPSAwLCBoYXNoX29yWzJdWzMzXSA9IHsgMCB9OworCXUzMiBzdHJpbmdfb3IgPSAwLCBoYXNoX29yWzJdWzMzXSA9IHsgeyAwLCB9IH07CiAJdW5zaWduZWQgdGVzdHMgPSAwOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBoNjQgPSAwOwogCWludCBpLCBqOwpAQCAtMjE5LDIxICsyMTksMjcgQEAKIAl9CiAKIAkvKiBJc3N1ZSBub3RpY2VzIGFib3V0IHNraXBwZWQgdGVzdHMuICovCi0jaWZuZGVmIEhBVkVfQVJDSF9fSEFTSF8zMgotCXByX2luZm8oIl9faGFzaF8zMigpIGhhcyBubyBhcmNoIGltcGxlbWVudGF0aW9uIHRvIHRlc3QuIik7Ci0jZWxpZiBIQVZFX0FSQ0hfX0hBU0hfMzIgIT0gMQorI2lmZGVmIEhBVkVfQVJDSF9fSEFTSF8zMgorI2lmIEhBVkVfQVJDSF9fSEFTSF8zMiAhPSAxCiAJcHJfaW5mbygiX19oYXNoXzMyKCkgaXMgYXJjaC1zcGVjaWZpYzsgbm90IGNvbXBhcmVkIHRvIGdlbmVyaWMuIik7CiAjZW5kaWYKLSNpZm5kZWYgSEFWRV9BUkNIX0hBU0hfMzIKLQlwcl9pbmZvKCJoYXNoXzMyKCkgaGFzIG5vIGFyY2ggaW1wbGVtZW50YXRpb24gdG8gdGVzdC4iKTsKLSNlbGlmIEhBVkVfQVJDSF9IQVNIXzMyICE9IDEKKyNlbHNlCisJcHJfaW5mbygiX19oYXNoXzMyKCkgaGFzIG5vIGFyY2ggaW1wbGVtZW50YXRpb24gdG8gdGVzdC4iKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfQVJDSF9IQVNIXzMyCisjaWYgSEFWRV9BUkNIX0hBU0hfMzIgIT0gMQogCXByX2luZm8oImhhc2hfMzIoKSBpcyBhcmNoLXNwZWNpZmljOyBub3QgY29tcGFyZWQgdG8gZ2VuZXJpYy4iKTsKICNlbmRpZgotI2lmbmRlZiBIQVZFX0FSQ0hfSEFTSF82NAotCXByX2luZm8oImhhc2hfNjQoKSBoYXMgbm8gYXJjaCBpbXBsZW1lbnRhdGlvbiB0byB0ZXN0LiIpOwotI2VsaWYgSEFWRV9BUkNIX0hBU0hfNjQgIT0gMQorI2Vsc2UKKwlwcl9pbmZvKCJoYXNoXzMyKCkgaGFzIG5vIGFyY2ggaW1wbGVtZW50YXRpb24gdG8gdGVzdC4iKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfQVJDSF9IQVNIXzY0CisjaWYgSEFWRV9BUkNIX0hBU0hfNjQgIT0gMQogCXByX2luZm8oImhhc2hfNjQoKSBpcyBhcmNoLXNwZWNpZmljOyBub3QgY29tcGFyZWQgdG8gZ2VuZXJpYy4iKTsKICNlbmRpZgorI2Vsc2UKKwlwcl9pbmZvKCJoYXNoXzY0KCkgaGFzIG5vIGFyY2ggaW1wbGVtZW50YXRpb24gdG8gdGVzdC4iKTsKKyNlbmRpZgogCiAJcHJfbm90aWNlKCIldSB0ZXN0cyBwYXNzZWQuIiwgdGVzdHMpOwogCmRpZmYgLS1naXQgYS9saWIvdWNzMl9zdHJpbmcuYyBiL2xpYi91Y3MyX3N0cmluZy5jCmluZGV4IGYwYjMyM2EuLmFlOGQyNDkgMTAwNjQ0Ci0tLSBhL2xpYi91Y3MyX3N0cmluZy5jCisrKyBiL2xpYi91Y3MyX3N0cmluZy5jCkBAIC01Niw3ICs1Niw3IEBACiAJdW5zaWduZWQgbG9uZyBpOwogCXVuc2lnbmVkIGxvbmcgaiA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdWNzMl9zdHJsZW4oc3JjKTsgaSsrKSB7CisJZm9yIChpID0gMDsgc3JjW2ldOyBpKyspIHsKIAkJdTE2IGMgPSBzcmNbaV07CiAKIAkJaWYgKGMgPj0gMHg4MDApCmRpZmYgLS1naXQgYS9saWIvdXNlcmNvcHkuYyBiL2xpYi91c2VyY29weS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjViMWRkLi4wMDAwMDAwCi0tLSBhL2xpYi91c2VyY29weS5jCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYnVnLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotCi12b2lkIGNvcHlfZnJvbV91c2VyX292ZXJmbG93KHZvaWQpCi17Ci0JV0FSTigxLCAiQnVmZmVyIG92ZXJmbG93IGRldGVjdGVkIVxuIik7Ci19Ci1FWFBPUlRfU1lNQk9MKGNvcHlfZnJvbV91c2VyX292ZXJmbG93KTsKZGlmZiAtLWdpdCBhL2xpYi93aW5fbWlubWF4LmMgYi9saWIvd2luX21pbm1heC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDIwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvd2luX21pbm1heC5jCkBAIC0wLDAgKzEsOTggQEAKKy8qKgorICogbGliL21pbm1heC5jOiB3aW5kb3dlZCBtaW4vbWF4IHRyYWNrZXIKKyAqCisgKiBLYXRobGVlbiBOaWNob2xzJyBhbGdvcml0aG0gZm9yIHRyYWNraW5nIHRoZSBtaW5pbXVtIChvciBtYXhpbXVtKQorICogdmFsdWUgb2YgYSBkYXRhIHN0cmVhbSBvdmVyIHNvbWUgZml4ZWQgdGltZSBpbnRlcnZhbC4gIChFLmcuLAorICogdGhlIG1pbmltdW0gUlRUIG92ZXIgdGhlIHBhc3QgZml2ZSBtaW51dGVzLikgSXQgdXNlcyBjb25zdGFudAorICogc3BhY2UgYW5kIGNvbnN0YW50IHRpbWUgcGVyIHVwZGF0ZSB5ZXQgYWxtb3N0IGFsd2F5cyBkZWxpdmVycworICogdGhlIHNhbWUgbWluaW11bSBhcyBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhcyB0byBrZWVwIGFsbCB0aGUKKyAqIGRhdGEgaW4gdGhlIHdpbmRvdy4KKyAqCisgKiBUaGUgYWxnb3JpdGhtIGtlZXBzIHRyYWNrIG9mIHRoZSBiZXN0LCAybmQgYmVzdCAmIDNyZCBiZXN0IG1pbgorICogdmFsdWVzLCBtYWludGFpbmluZyBhbiBpbnZhcmlhbnQgdGhhdCB0aGUgbWVhc3VyZW1lbnQgdGltZSBvZgorICogdGhlIG4ndGggYmVzdCA+PSBuLTEndGggYmVzdC4gSXQgYWxzbyBtYWtlcyBzdXJlIHRoYXQgdGhlIHRocmVlCisgKiB2YWx1ZXMgYXJlIHdpZGVseSBzZXBhcmF0ZWQgaW4gdGhlIHRpbWUgd2luZG93IHNpbmNlIHRoYXQgYm91bmRzCisgKiB0aGUgd29yc2UgY2FzZSBlcnJvciB3aGVuIHRoYXQgZGF0YSBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcKKyAqIG92ZXIgdGhlIHdpbmRvdy4KKyAqCisgKiBVcG9uIGdldHRpbmcgYSBuZXcgbWluLCB3ZSBjYW4gZm9yZ2V0IGV2ZXJ5dGhpbmcgZWFybGllciBiZWNhdXNlCisgKiBpdCBoYXMgbm8gdmFsdWUgLSB0aGUgbmV3IG1pbiBpcyA8PSBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIHdpbmRvdworICogYnkgZGVmaW5pdGlvbiBhbmQgaXQncyB0aGUgbW9zdCByZWNlbnQuIFNvIHdlIHJlc3RhcnQgZnJlc2ggb24KKyAqIGV2ZXJ5IG5ldyBtaW4gYW5kIG92ZXJ3cml0ZXMgMm5kICYgM3JkIGNob2ljZXMuIFRoZSBzYW1lIHByb3BlcnR5CisgKiBob2xkcyBmb3IgMm5kICYgM3JkIGJlc3QuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC93aW5fbWlubWF4Lmg+CisKKy8qIEFzIHRpbWUgYWR2YW5jZXMsIHVwZGF0ZSB0aGUgMXN0LCAybmQsIGFuZCAzcmQgY2hvaWNlcy4gKi8KK3N0YXRpYyB1MzIgbWlubWF4X3N1Yndpbl91cGRhdGUoc3RydWN0IG1pbm1heCAqbSwgdTMyIHdpbiwKKwkJCQljb25zdCBzdHJ1Y3QgbWlubWF4X3NhbXBsZSAqdmFsKQoreworCXUzMiBkdCA9IHZhbC0+dCAtIG0tPnNbMF0udDsKKworCWlmICh1bmxpa2VseShkdCA+IHdpbikpIHsKKwkJLyoKKwkJICogUGFzc2VkIGVudGlyZSB3aW5kb3cgd2l0aG91dCBhIG5ldyB2YWwgc28gbWFrZSAybmQKKwkJICogY2hvaWNlIHRoZSBuZXcgdmFsICYgM3JkIGNob2ljZSB0aGUgbmV3IDJuZCBjaG9pY2UuCisJCSAqIHdlIG1heSBoYXZlIHRvIGl0ZXJhdGUgdGhpcyBzaW5jZSBvdXIgMm5kIGNob2ljZQorCQkgKiBtYXkgYWxzbyBiZSBvdXRzaWRlIHRoZSB3aW5kb3cgKHdlIGNoZWNrZWQgb24gZW50cnkKKwkJICogdGhhdCB0aGUgdGhpcmQgY2hvaWNlIHdhcyBpbiB0aGUgd2luZG93KS4KKwkJICovCisJCW0tPnNbMF0gPSBtLT5zWzFdOworCQltLT5zWzFdID0gbS0+c1syXTsKKwkJbS0+c1syXSA9ICp2YWw7CisJCWlmICh1bmxpa2VseSh2YWwtPnQgLSBtLT5zWzBdLnQgPiB3aW4pKSB7CisJCQltLT5zWzBdID0gbS0+c1sxXTsKKwkJCW0tPnNbMV0gPSBtLT5zWzJdOworCQkJbS0+c1syXSA9ICp2YWw7CisJCX0KKwl9IGVsc2UgaWYgKHVubGlrZWx5KG0tPnNbMV0udCA9PSBtLT5zWzBdLnQpICYmIGR0ID4gd2luLzQpIHsKKwkJLyoKKwkJICogV2UndmUgcGFzc2VkIGEgcXVhcnRlciBvZiB0aGUgd2luZG93IHdpdGhvdXQgYSBuZXcgdmFsCisJCSAqIHNvIHRha2UgYSAybmQgY2hvaWNlIGZyb20gdGhlIDJuZCBxdWFydGVyIG9mIHRoZSB3aW5kb3cuCisJCSAqLworCQltLT5zWzJdID0gbS0+c1sxXSA9ICp2YWw7CisJfSBlbHNlIGlmICh1bmxpa2VseShtLT5zWzJdLnQgPT0gbS0+c1sxXS50KSAmJiBkdCA+IHdpbi8yKSB7CisJCS8qCisJCSAqIFdlJ3ZlIHBhc3NlZCBoYWxmIHRoZSB3aW5kb3cgd2l0aG91dCBmaW5kaW5nIGEgbmV3IHZhbAorCQkgKiBzbyB0YWtlIGEgM3JkIGNob2ljZSBmcm9tIHRoZSBsYXN0IGhhbGYgb2YgdGhlIHdpbmRvdworCQkgKi8KKwkJbS0+c1syXSA9ICp2YWw7CisJfQorCXJldHVybiBtLT5zWzBdLnY7Cit9CisKKy8qIENoZWNrIGlmIG5ldyBtZWFzdXJlbWVudCB1cGRhdGVzIHRoZSAxc3QsIDJuZCBvciAzcmQgY2hvaWNlIG1heC4gKi8KK3UzMiBtaW5tYXhfcnVubmluZ19tYXgoc3RydWN0IG1pbm1heCAqbSwgdTMyIHdpbiwgdTMyIHQsIHUzMiBtZWFzKQoreworCXN0cnVjdCBtaW5tYXhfc2FtcGxlIHZhbCA9IHsgLnQgPSB0LCAudiA9IG1lYXMgfTsKKworCWlmICh1bmxpa2VseSh2YWwudiA+PSBtLT5zWzBdLnYpIHx8CSAgLyogZm91bmQgbmV3IG1heD8gKi8KKwkgICAgdW5saWtlbHkodmFsLnQgLSBtLT5zWzJdLnQgPiB3aW4pKQkgIC8qIG5vdGhpbmcgbGVmdCBpbiB3aW5kb3c/ICovCisJCXJldHVybiBtaW5tYXhfcmVzZXQobSwgdCwgbWVhcyk7ICAvKiBmb3JnZXQgZWFybGllciBzYW1wbGVzICovCisKKwlpZiAodW5saWtlbHkodmFsLnYgPj0gbS0+c1sxXS52KSkKKwkJbS0+c1syXSA9IG0tPnNbMV0gPSB2YWw7CisJZWxzZSBpZiAodW5saWtlbHkodmFsLnYgPj0gbS0+c1syXS52KSkKKwkJbS0+c1syXSA9IHZhbDsKKworCXJldHVybiBtaW5tYXhfc3Vid2luX3VwZGF0ZShtLCB3aW4sICZ2YWwpOworfQorRVhQT1JUX1NZTUJPTChtaW5tYXhfcnVubmluZ19tYXgpOworCisvKiBDaGVjayBpZiBuZXcgbWVhc3VyZW1lbnQgdXBkYXRlcyB0aGUgMXN0LCAybmQgb3IgM3JkIGNob2ljZSBtaW4uICovCit1MzIgbWlubWF4X3J1bm5pbmdfbWluKHN0cnVjdCBtaW5tYXggKm0sIHUzMiB3aW4sIHUzMiB0LCB1MzIgbWVhcykKK3sKKwlzdHJ1Y3QgbWlubWF4X3NhbXBsZSB2YWwgPSB7IC50ID0gdCwgLnYgPSBtZWFzIH07CisKKwlpZiAodW5saWtlbHkodmFsLnYgPD0gbS0+c1swXS52KSB8fAkgIC8qIGZvdW5kIG5ldyBtaW4/ICovCisJICAgIHVubGlrZWx5KHZhbC50IC0gbS0+c1syXS50ID4gd2luKSkJICAvKiBub3RoaW5nIGxlZnQgaW4gd2luZG93PyAqLworCQlyZXR1cm4gbWlubWF4X3Jlc2V0KG0sIHQsIG1lYXMpOyAgLyogZm9yZ2V0IGVhcmxpZXIgc2FtcGxlcyAqLworCisJaWYgKHVubGlrZWx5KHZhbC52IDw9IG0tPnNbMV0udikpCisJCW0tPnNbMl0gPSBtLT5zWzFdID0gdmFsOworCWVsc2UgaWYgKHVubGlrZWx5KHZhbC52IDw9IG0tPnNbMl0udikpCisJCW0tPnNbMl0gPSB2YWw7CisKKwlyZXR1cm4gbWlubWF4X3N1Yndpbl91cGRhdGUobSwgd2luLCAmdmFsKTsKK30KZGlmZiAtLWdpdCBhL21tL0tjb25maWcuZGVidWcgYi9tbS9LY29uZmlnLmRlYnVnCmluZGV4IDIyZjRjZDkuLmFmY2M1NTAgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcuZGVidWcKKysrIGIvbW0vS2NvbmZpZy5kZWJ1ZwpAQCAtNzYsOCArNzYsNiBAQAogCSAgIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gd3JpdGUgemVyb3Mgd2hlbiBHRlBfWkVSTyBpcyB1c2VkIG9uCiAJICAgYWxsb2NhdGlvbi4KIAotCSAgIEVuYWJsaW5nIHBhZ2UgcG9pc29uaW5nIHdpdGggdGhpcyBvcHRpb24gd2lsbCBkaXNhYmxlIGhpYmVybmF0aW9uCi0KIAkgICBJZiB1bnN1cmUsIHNheSBOCiAJYm9vbAogCmRpZmYgLS1naXQgYS9tbS9kZWJ1Zy5jIGIvbW0vZGVidWcuYwppbmRleCA4ODY1YmZiLi43NGM3Y2FlIDEwMDY0NAotLS0gYS9tbS9kZWJ1Zy5jCisrKyBiL21tL2RlYnVnLmMKQEAgLTQyLDkgKzQyLDExIEBACiAKIHZvaWQgX19kdW1wX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGNvbnN0IGNoYXIgKnJlYXNvbikKIHsKKwlpbnQgbWFwY291bnQgPSBQYWdlU2xhYihwYWdlKSA/IDAgOiBwYWdlX21hcGNvdW50KHBhZ2UpOworCiAJcHJfZW1lcmcoInBhZ2U6JXAgY291bnQ6JWQgbWFwY291bnQ6JWQgbWFwcGluZzolcCBpbmRleDolI2x4IiwKLQkJICBwYWdlLCBwYWdlX3JlZl9jb3VudChwYWdlKSwgcGFnZV9tYXBjb3VudChwYWdlKSwKLQkJICBwYWdlLT5tYXBwaW5nLCBwYWdlLT5pbmRleCk7CisJCSAgcGFnZSwgcGFnZV9yZWZfY291bnQocGFnZSksIG1hcGNvdW50LAorCQkgIHBhZ2UtPm1hcHBpbmcsIHBhZ2VfdG9fcGdvZmYocGFnZSkpOwogCWlmIChQYWdlQ29tcG91bmQocGFnZSkpCiAJCXByX2NvbnQoIiBjb21wb3VuZF9tYXBjb3VudDogJWQiLCBjb21wb3VuZF9tYXBjb3VudChwYWdlKSk7CiAJcHJfY29udCgiXG4iKTsKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCA4YTI4N2RmLi42OGYxODEzIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0xMTAsMzYgKzExMCw5NCBAQAogICogICAtPnRhc2tsaXN0X2xvY2sgICAgICAgICAgICAobWVtb3J5X2ZhaWx1cmUsIGNvbGxlY3RfcHJvY3NfYW8pCiAgKi8KIAorc3RhdGljIGludCBwYWdlX2NhY2hlX3RyZWVfaW5zZXJ0KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCSAgc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKipzaGFkb3dwKQoreworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7CisJdm9pZCAqKnNsb3Q7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBfX3JhZGl4X3RyZWVfY3JlYXRlKCZtYXBwaW5nLT5wYWdlX3RyZWUsIHBhZ2UtPmluZGV4LCAwLAorCQkJCSAgICAmbm9kZSwgJnNsb3QpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWlmICgqc2xvdCkgeworCQl2b2lkICpwOworCisJCXAgPSByYWRpeF90cmVlX2RlcmVmX3Nsb3RfcHJvdGVjdGVkKHNsb3QsICZtYXBwaW5nLT50cmVlX2xvY2spOworCQlpZiAoIXJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkocCkpCisJCQlyZXR1cm4gLUVFWElTVDsKKworCQltYXBwaW5nLT5ucmV4Y2VwdGlvbmFsLS07CisJCWlmICghZGF4X21hcHBpbmcobWFwcGluZykpIHsKKwkJCWlmIChzaGFkb3dwKQorCQkJCSpzaGFkb3dwID0gcDsKKwkJCWlmIChub2RlKQorCQkJCXdvcmtpbmdzZXRfbm9kZV9zaGFkb3dzX2RlYyhub2RlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIERBWCBjYW4gcmVwbGFjZSBlbXB0eSBsb2NrZWQgZW50cnkgd2l0aCBhIGhvbGUgKi8KKwkJCVdBUk5fT05fT05DRShwICE9CisJCQkJKHZvaWQgKikoUkFESVhfVFJFRV9FWENFUFRJT05BTF9FTlRSWSB8CisJCQkJCSBSQURJWF9EQVhfRU5UUllfTE9DSykpOworCQkJLyogREFYIGFjY291bnRzIGV4Y2VwdGlvbmFsIGVudHJpZXMgYXMgbm9ybWFsIHBhZ2VzICovCisJCQlpZiAobm9kZSkKKwkJCQl3b3JraW5nc2V0X25vZGVfcGFnZXNfZGVjKG5vZGUpOworCQkJLyogV2FrZXVwIHdhaXRlcnMgZm9yIGV4Y2VwdGlvbmFsIGVudHJ5IGxvY2sgKi8KKwkJCWRheF93YWtlX21hcHBpbmdfZW50cnlfd2FpdGVyKG1hcHBpbmcsIHBhZ2UtPmluZGV4LAorCQkJCQkJICAgICAgZmFsc2UpOworCQl9CisJfQorCXJhZGl4X3RyZWVfcmVwbGFjZV9zbG90KHNsb3QsIHBhZ2UpOworCW1hcHBpbmctPm5ycGFnZXMrKzsKKwlpZiAobm9kZSkgeworCQl3b3JraW5nc2V0X25vZGVfcGFnZXNfaW5jKG5vZGUpOworCQkvKgorCQkgKiBEb24ndCB0cmFjayBub2RlIHRoYXQgY29udGFpbnMgYWN0dWFsIHBhZ2VzLgorCQkgKgorCQkgKiBBdm9pZCBhY3F1aXJpbmcgdGhlIGxpc3RfbHJ1IGxvY2sgaWYgYWxyZWFkeQorCQkgKiB1bnRyYWNrZWQuICBUaGUgbGlzdF9lbXB0eSgpIHRlc3QgaXMgc2FmZSBhcworCQkgKiBub2RlLT5wcml2YXRlX2xpc3QgaXMgcHJvdGVjdGVkIGJ5CisJCSAqIG1hcHBpbmctPnRyZWVfbG9jay4KKwkJICovCisJCWlmICghbGlzdF9lbXB0eSgmbm9kZS0+cHJpdmF0ZV9saXN0KSkKKwkJCWxpc3RfbHJ1X2RlbCgmd29ya2luZ3NldF9zaGFkb3dfbm9kZXMsCisJCQkJICAgICAmbm9kZS0+cHJpdmF0ZV9saXN0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHBhZ2VfY2FjaGVfdHJlZV9kZWxldGUoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJICAgc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKnNoYWRvdykKIHsKLQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlOwogCWludCBpLCBuciA9IFBhZ2VIdWdlKHBhZ2UpID8gMSA6IGhwYWdlX25yX3BhZ2VzKHBhZ2UpOwogCiAJVk1fQlVHX09OX1BBR0UoIVBhZ2VMb2NrZWQocGFnZSksIHBhZ2UpOwogCVZNX0JVR19PTl9QQUdFKFBhZ2VUYWlsKHBhZ2UpLCBwYWdlKTsKIAlWTV9CVUdfT05fUEFHRShuciAhPSAxICYmIHNoYWRvdywgcGFnZSk7CiAKLQlpZiAoc2hhZG93KSB7Ci0JCW1hcHBpbmctPm5yZXhjZXB0aW9uYWwgKz0gbnI7Ci0JCS8qCi0JCSAqIE1ha2Ugc3VyZSB0aGUgbnJleGNlcHRpb25hbCB1cGRhdGUgaXMgY29tbWl0dGVkIGJlZm9yZQotCQkgKiB0aGUgbnJwYWdlcyB1cGRhdGUgc28gdGhhdCBmaW5hbCB0cnVuY2F0ZSByYWNpbmcKLQkJICogd2l0aCByZWNsYWltIGRvZXMgbm90IHNlZSBib3RoIGNvdW50ZXJzIDAgYXQgdGhlCi0JCSAqIHNhbWUgdGltZSBhbmQgbWlzcyBhIHNoYWRvdyBlbnRyeS4KLQkJICovCi0JCXNtcF93bWIoKTsKLQl9Ci0JbWFwcGluZy0+bnJwYWdlcyAtPSBucjsKLQogCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7Ci0JCW5vZGUgPSByYWRpeF90cmVlX3JlcGxhY2VfY2xlYXJfdGFncygmbWFwcGluZy0+cGFnZV90cmVlLAotCQkJCXBhZ2UtPmluZGV4ICsgaSwgc2hhZG93KTsKKwkJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKwkJdm9pZCAqKnNsb3Q7CisKKwkJX19yYWRpeF90cmVlX2xvb2t1cCgmbWFwcGluZy0+cGFnZV90cmVlLCBwYWdlLT5pbmRleCArIGksCisJCQkJICAgICZub2RlLCAmc2xvdCk7CisKKwkJcmFkaXhfdHJlZV9jbGVhcl90YWdzKCZtYXBwaW5nLT5wYWdlX3RyZWUsIG5vZGUsIHNsb3QpOworCiAJCWlmICghbm9kZSkgewogCQkJVk1fQlVHX09OX1BBR0UobnIgIT0gMSwgcGFnZSk7Ci0JCQlyZXR1cm47CisJCQkvKgorCQkJICogV2UgbmVlZCBhIG5vZGUgdG8gcHJvcGVybHkgYWNjb3VudCBzaGFkb3cKKwkJCSAqIGVudHJpZXMuIERvbid0IHBsYW50IGFueSB3aXRob3V0LiBYWFgKKwkJCSAqLworCQkJc2hhZG93ID0gTlVMTDsKIAkJfQogCisJCXJhZGl4X3RyZWVfcmVwbGFjZV9zbG90KHNsb3QsIHNoYWRvdyk7CisKKwkJaWYgKCFub2RlKQorCQkJYnJlYWs7CisKIAkJd29ya2luZ3NldF9ub2RlX3BhZ2VzX2RlYyhub2RlKTsKIAkJaWYgKHNoYWRvdykKIAkJCXdvcmtpbmdzZXRfbm9kZV9zaGFkb3dzX2luYyhub2RlKTsKQEAgLTE2Myw2ICsyMjEsMTggQEAKIAkJCQkJJm5vZGUtPnByaXZhdGVfbGlzdCk7CiAJCX0KIAl9CisKKwlpZiAoc2hhZG93KSB7CisJCW1hcHBpbmctPm5yZXhjZXB0aW9uYWwgKz0gbnI7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGUgbnJleGNlcHRpb25hbCB1cGRhdGUgaXMgY29tbWl0dGVkIGJlZm9yZQorCQkgKiB0aGUgbnJwYWdlcyB1cGRhdGUgc28gdGhhdCBmaW5hbCB0cnVuY2F0ZSByYWNpbmcKKwkJICogd2l0aCByZWNsYWltIGRvZXMgbm90IHNlZSBib3RoIGNvdW50ZXJzIDAgYXQgdGhlCisJCSAqIHNhbWUgdGltZSBhbmQgbWlzcyBhIHNoYWRvdyBlbnRyeS4KKwkJICovCisJCXNtcF93bWIoKTsKKwl9CisJbWFwcGluZy0+bnJwYWdlcyAtPSBucjsKIH0KIAogLyoKQEAgLTU2MSw5ICs2MzEsOCBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZtYXBwaW5nLT50cmVlX2xvY2ssIGZsYWdzKTsKIAkJX19kZWxldGVfZnJvbV9wYWdlX2NhY2hlKG9sZCwgTlVMTCk7Ci0JCWVycm9yID0gcmFkaXhfdHJlZV9pbnNlcnQoJm1hcHBpbmctPnBhZ2VfdHJlZSwgb2Zmc2V0LCBuZXcpOworCQllcnJvciA9IHBhZ2VfY2FjaGVfdHJlZV9pbnNlcnQobWFwcGluZywgbmV3LCBOVUxMKTsKIAkJQlVHX09OKGVycm9yKTsKLQkJbWFwcGluZy0+bnJwYWdlcysrOwogCiAJCS8qCiAJCSAqIGh1Z2V0bGIgcGFnZXMgZG8gbm90IHBhcnRpY2lwYXRlIGluIHBhZ2UgY2FjaGUgYWNjb3VudGluZy4KQEAgLTU4NCw2MiArNjUzLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlcGxhY2VfcGFnZV9jYWNoZV9wYWdlKTsKIAotc3RhdGljIGludCBwYWdlX2NhY2hlX3RyZWVfaW5zZXJ0KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAotCQkJCSAgc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKipzaGFkb3dwKQotewotCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7Ci0Jdm9pZCAqKnNsb3Q7Ci0JaW50IGVycm9yOwotCi0JZXJyb3IgPSBfX3JhZGl4X3RyZWVfY3JlYXRlKCZtYXBwaW5nLT5wYWdlX3RyZWUsIHBhZ2UtPmluZGV4LCAwLAotCQkJCSAgICAmbm9kZSwgJnNsb3QpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCWlmICgqc2xvdCkgewotCQl2b2lkICpwOwotCi0JCXAgPSByYWRpeF90cmVlX2RlcmVmX3Nsb3RfcHJvdGVjdGVkKHNsb3QsICZtYXBwaW5nLT50cmVlX2xvY2spOwotCQlpZiAoIXJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkocCkpCi0JCQlyZXR1cm4gLUVFWElTVDsKLQotCQltYXBwaW5nLT5ucmV4Y2VwdGlvbmFsLS07Ci0JCWlmICghZGF4X21hcHBpbmcobWFwcGluZykpIHsKLQkJCWlmIChzaGFkb3dwKQotCQkJCSpzaGFkb3dwID0gcDsKLQkJCWlmIChub2RlKQotCQkJCXdvcmtpbmdzZXRfbm9kZV9zaGFkb3dzX2RlYyhub2RlKTsKLQkJfSBlbHNlIHsKLQkJCS8qIERBWCBjYW4gcmVwbGFjZSBlbXB0eSBsb2NrZWQgZW50cnkgd2l0aCBhIGhvbGUgKi8KLQkJCVdBUk5fT05fT05DRShwICE9Ci0JCQkJKHZvaWQgKikoUkFESVhfVFJFRV9FWENFUFRJT05BTF9FTlRSWSB8Ci0JCQkJCSBSQURJWF9EQVhfRU5UUllfTE9DSykpOwotCQkJLyogREFYIGFjY291bnRzIGV4Y2VwdGlvbmFsIGVudHJpZXMgYXMgbm9ybWFsIHBhZ2VzICovCi0JCQlpZiAobm9kZSkKLQkJCQl3b3JraW5nc2V0X25vZGVfcGFnZXNfZGVjKG5vZGUpOwotCQkJLyogV2FrZXVwIHdhaXRlcnMgZm9yIGV4Y2VwdGlvbmFsIGVudHJ5IGxvY2sgKi8KLQkJCWRheF93YWtlX21hcHBpbmdfZW50cnlfd2FpdGVyKG1hcHBpbmcsIHBhZ2UtPmluZGV4LAotCQkJCQkJICAgICAgZmFsc2UpOwotCQl9Ci0JfQotCXJhZGl4X3RyZWVfcmVwbGFjZV9zbG90KHNsb3QsIHBhZ2UpOwotCW1hcHBpbmctPm5ycGFnZXMrKzsKLQlpZiAobm9kZSkgewotCQl3b3JraW5nc2V0X25vZGVfcGFnZXNfaW5jKG5vZGUpOwotCQkvKgotCQkgKiBEb24ndCB0cmFjayBub2RlIHRoYXQgY29udGFpbnMgYWN0dWFsIHBhZ2VzLgotCQkgKgotCQkgKiBBdm9pZCBhY3F1aXJpbmcgdGhlIGxpc3RfbHJ1IGxvY2sgaWYgYWxyZWFkeQotCQkgKiB1bnRyYWNrZWQuICBUaGUgbGlzdF9lbXB0eSgpIHRlc3QgaXMgc2FmZSBhcwotCQkgKiBub2RlLT5wcml2YXRlX2xpc3QgaXMgcHJvdGVjdGVkIGJ5Ci0JCSAqIG1hcHBpbmctPnRyZWVfbG9jay4KLQkJICovCi0JCWlmICghbGlzdF9lbXB0eSgmbm9kZS0+cHJpdmF0ZV9saXN0KSkKLQkJCWxpc3RfbHJ1X2RlbCgmd29ya2luZ3NldF9zaGFkb3dfbm9kZXMsCi0JCQkJICAgICAmbm9kZS0+cHJpdmF0ZV9saXN0KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgX19hZGRfdG9fcGFnZV9jYWNoZV9sb2NrZWQoc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJICAgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCQkJICAgICAgcGdvZmZfdCBvZmZzZXQsIGdmcF90IGdmcF9tYXNrLApAQCAtMTkxMCwxNiArMTkyMywxOCBAQAogCWlmIChpb2NiLT5raV9mbGFncyAmIElPQ0JfRElSRUNUKSB7CiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwkJc3RydWN0IGlvdl9pdGVyIGRhdGEgPSAqaXRlcjsKIAkJbG9mZl90IHNpemU7CiAKIAkJc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAkJcmV0dmFsID0gZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZShtYXBwaW5nLCBpb2NiLT5raV9wb3MsCiAJCQkJCWlvY2ItPmtpX3BvcyArIGNvdW50IC0gMSk7Ci0JCWlmICghcmV0dmFsKSB7Ci0JCQlzdHJ1Y3QgaW92X2l0ZXIgZGF0YSA9ICppdGVyOwotCQkJcmV0dmFsID0gbWFwcGluZy0+YV9vcHMtPmRpcmVjdF9JTyhpb2NiLCAmZGF0YSk7Ci0JCX0KKwkJaWYgKHJldHZhbCA8IDApCisJCQlnb3RvIG91dDsKIAorCQlmaWxlX2FjY2Vzc2VkKGZpbGUpOworCisJCXJldHZhbCA9IG1hcHBpbmctPmFfb3BzLT5kaXJlY3RfSU8oaW9jYiwgJmRhdGEpOwogCQlpZiAocmV0dmFsID4gMCkgewogCQkJaW9jYi0+a2lfcG9zICs9IHJldHZhbDsKIAkJCWlvdl9pdGVyX2FkdmFuY2UoaXRlciwgcmV0dmFsKTsKQEAgLTE5MzUsMTAgKzE5NTAsOCBAQAogCQkgKiBEQVggZmlsZXMsIHNvIGRvbid0IGJvdGhlciB0cnlpbmcuCiAJCSAqLwogCQlpZiAocmV0dmFsIDwgMCB8fCAhaW92X2l0ZXJfY291bnQoaXRlcikgfHwgaW9jYi0+a2lfcG9zID49IHNpemUgfHwKLQkJICAgIElTX0RBWChpbm9kZSkpIHsKLQkJCWZpbGVfYWNjZXNzZWQoZmlsZSk7CisJCSAgICBJU19EQVgoaW5vZGUpKQogCQkJZ290byBvdXQ7Ci0JCX0KIAl9CiAKIAlyZXR2YWwgPSBkb19nZW5lcmljX2ZpbGVfcmVhZChmaWxlLCAmaW9jYi0+a2lfcG9zLCBpdGVyLCByZXR2YWwpOwpkaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmMKaW5kZXggMmRiMjExMi4uMjgzNTgzZiAxMDA2NDQKLS0tIGEvbW0vaHVnZV9tZW1vcnkuYworKysgYi9tbS9odWdlX21lbW9yeS5jCkBAIC0xMDc4LDcgKzEwNzgsNyBAQAogCQlnb3RvIG91dDsKIAogCXBhZ2UgPSBwbWRfcGFnZSgqcG1kKTsKLQlWTV9CVUdfT05fUEFHRSghUGFnZUhlYWQocGFnZSksIHBhZ2UpOworCVZNX0JVR19PTl9QQUdFKCFQYWdlSGVhZChwYWdlKSAmJiAhaXNfem9uZV9kZXZpY2VfcGFnZShwYWdlKSwgcGFnZSk7CiAJaWYgKGZsYWdzICYgRk9MTF9UT1VDSCkKIAkJdG91Y2hfcG1kKHZtYSwgYWRkciwgcG1kKTsKIAlpZiAoKGZsYWdzICYgRk9MTF9NTE9DSykgJiYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpKSB7CkBAIC0xMTE2LDcgKzExMTYsNyBAQAogCX0KIHNraXBfbWxvY2s6CiAJcGFnZSArPSAoYWRkciAmIH5IUEFHRV9QTURfTUFTSykgPj4gUEFHRV9TSElGVDsKLQlWTV9CVUdfT05fUEFHRSghUGFnZUNvbXBvdW5kKHBhZ2UpLCBwYWdlKTsKKwlWTV9CVUdfT05fUEFHRSghUGFnZUNvbXBvdW5kKHBhZ2UpICYmICFpc196b25lX2RldmljZV9wYWdlKHBhZ2UpLCBwYWdlKTsKIAlpZiAoZmxhZ3MgJiBGT0xMX0dFVCkKIAkJZ2V0X3BhZ2UocGFnZSk7CiAKQEAgLTExMzgsOSArMTEzOCw2IEBACiAJYm9vbCB3YXNfd3JpdGFibGU7CiAJaW50IGZsYWdzID0gMDsKIAotCS8qIEEgUFJPVF9OT05FIGZhdWx0IHNob3VsZCBub3QgZW5kIHVwIGhlcmUgKi8KLQlCVUdfT04oISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9FWEVDIHwgVk1fV1JJVEUpKSk7Ci0KIAlmZS0+cHRsID0gcG1kX2xvY2sodm1hLT52bV9tbSwgZmUtPnBtZCk7CiAJaWYgKHVubGlrZWx5KCFwbWRfc2FtZShwbWQsICpmZS0+cG1kKSkpCiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTExNjgsNyArMTE2NSw3IEBACiAJfQogCiAJLyogU2VlIHNpbWlsYXIgY29tbWVudCBpbiBkb19udW1hX3BhZ2UgZm9yIGV4cGxhbmF0aW9uICovCi0JaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKKwlpZiAoIXBtZF93cml0ZShwbWQpKQogCQlmbGFncyB8PSBUTkZfTk9fR1JPVVA7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvbW0va2h1Z2VwYWdlZC5jIGIvbW0va2h1Z2VwYWdlZC5jCmluZGV4IDc5YzUyZDAuLjcyOGQ3NzkgMTAwNjQ0Ci0tLSBhL21tL2todWdlcGFnZWQuYworKysgYi9tbS9raHVnZXBhZ2VkLmMKQEAgLTgzOCw3ICs4MzgsOCBAQAogICogdmFsdWUgKHNjYW4gY29kZSkuCiAgKi8KIAotc3RhdGljIGludCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQorc3RhdGljIGludCBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFwKQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXVuc2lnbmVkIGxvbmcgaHN0YXJ0LCBoZW5kOwpAQCAtODQ2LDcgKzg0Nyw3IEBACiAJaWYgKHVubGlrZWx5KGtodWdlcGFnZWRfdGVzdF9leGl0KG1tKSkpCiAJCXJldHVybiBTQ0FOX0FOWV9QUk9DRVNTOwogCi0Jdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOworCSp2bWFwID0gdm1hID0gZmluZF92bWEobW0sIGFkZHJlc3MpOwogCWlmICghdm1hKQogCQlyZXR1cm4gU0NBTl9WTUFfTlVMTDsKIApAQCAtODgxLDYgKzg4MiwxMSBAQAogCQkucG1kID0gcG1kLAogCX07CiAKKwkvKiB3ZSBvbmx5IGRlY2lkZSB0byBzd2FwaW4sIGlmIHRoZXJlIGlzIGVub3VnaCB5b3VuZyBwdGVzICovCisJaWYgKHJlZmVyZW5jZWQgPCBIUEFHRV9QTURfTlIvMikgeworCQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCBzd2FwcGVkX2luLCByZWZlcmVuY2VkLCAwKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KIAlmZS5wdGUgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHJlc3MpOwogCWZvciAoOyBmZS5hZGRyZXNzIDwgYWRkcmVzcyArIEhQQUdFX1BNRF9OUipQQUdFX1NJWkU7CiAJCQlmZS5wdGUrKywgZmUuYWRkcmVzcyArPSBQQUdFX1NJWkUpIHsKQEAgLTg4OCwxNyArODk0LDEyIEBACiAJCWlmICghaXNfc3dhcF9wdGUocHRldmFsKSkKIAkJCWNvbnRpbnVlOwogCQlzd2FwcGVkX2luKys7Ci0JCS8qIHdlIG9ubHkgZGVjaWRlIHRvIHN3YXBpbiwgaWYgdGhlcmUgaXMgZW5vdWdoIHlvdW5nIHB0ZXMgKi8KLQkJaWYgKHJlZmVyZW5jZWQgPCBIUEFHRV9QTURfTlIvMikgewotCQkJdHJhY2VfbW1fY29sbGFwc2VfaHVnZV9wYWdlX3N3YXBpbihtbSwgc3dhcHBlZF9pbiwgcmVmZXJlbmNlZCwgMCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KIAkJcmV0ID0gZG9fc3dhcF9wYWdlKCZmZSwgcHRldmFsKTsKIAogCQkvKiBkb19zd2FwX3BhZ2UgcmV0dXJucyBWTV9GQVVMVF9SRVRSWSB3aXRoIHJlbGVhc2VkIG1tYXBfc2VtICovCiAJCWlmIChyZXQgJiBWTV9GQVVMVF9SRVRSWSkgewogCQkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCQkJaWYgKGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKG1tLCBhZGRyZXNzKSkgeworCQkJaWYgKGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKG1tLCBhZGRyZXNzLCAmZmUudm1hKSkgewogCQkJCS8qIHZtYSBpcyBubyBsb25nZXIgYXZhaWxhYmxlLCBkb24ndCBjb250aW51ZSB0byBzd2FwaW4gKi8KIAkJCQl0cmFjZV9tbV9jb2xsYXBzZV9odWdlX3BhZ2Vfc3dhcGluKG1tLCBzd2FwcGVkX2luLCByZWZlcmVuY2VkLCAwKTsKIAkJCQlyZXR1cm4gZmFsc2U7CkBAIC05MjMsNyArOTI0LDYgQEAKIHN0YXRpYyB2b2lkIGNvbGxhcHNlX2h1Z2VfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCQkJICAgc3RydWN0IHBhZ2UgKipocGFnZSwKLQkJCQkgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkgICBpbnQgbm9kZSwgaW50IHJlZmVyZW5jZWQpCiB7CiAJcG1kX3QgKnBtZCwgX3BtZDsKQEAgLTkzMyw2ICs5MzMsNyBAQAogCXNwaW5sb2NrX3QgKnBtZF9wdGwsICpwdGVfcHRsOwogCWludCBpc29sYXRlZCA9IDAsIHJlc3VsdCA9IDA7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXVuc2lnbmVkIGxvbmcgbW11bl9zdGFydDsJLyogRm9yIG1tdV9ub3RpZmllcnMgKi8KIAl1bnNpZ25lZCBsb25nIG1tdW5fZW5kOwkJLyogRm9yIG1tdV9ub3RpZmllcnMgKi8KIAlnZnBfdCBnZnA7CkBAIC05NjEsNyArOTYyLDcgQEAKIAl9CiAKIAlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JcmVzdWx0ID0gaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUobW0sIGFkZHJlc3MpOworCXJlc3VsdCA9IGh1Z2VwYWdlX3ZtYV9yZXZhbGlkYXRlKG1tLCBhZGRyZXNzLCAmdm1hKTsKIAlpZiAocmVzdWx0KSB7CiAJCW1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZShuZXdfcGFnZSwgbWVtY2csIHRydWUpOwogCQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwpAQCAtOTk0LDcgKzk5NSw3IEBACiAJICogaGFuZGxlZCBieSB0aGUgYW5vbl92bWEgbG9jayArIFBHX2xvY2suCiAJICovCiAJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQlyZXN1bHQgPSBodWdlcGFnZV92bWFfcmV2YWxpZGF0ZShtbSwgYWRkcmVzcyk7CisJcmVzdWx0ID0gaHVnZXBhZ2Vfdm1hX3JldmFsaWRhdGUobW0sIGFkZHJlc3MsICZ2bWEpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gb3V0OwogCS8qIGNoZWNrIGlmIHRoZSBwbWQgaXMgc3RpbGwgdmFsaWQgKi8KQEAgLTEyMDIsNyArMTIwMyw3IEBACiAJaWYgKHJldCkgewogCQlub2RlID0ga2h1Z2VwYWdlZF9maW5kX3RhcmdldF9ub2RlKCk7CiAJCS8qIGNvbGxhcHNlX2h1Z2VfcGFnZSB3aWxsIHJldHVybiB3aXRoIHRoZSBtbWFwX3NlbSByZWxlYXNlZCAqLwotCQljb2xsYXBzZV9odWdlX3BhZ2UobW0sIGFkZHJlc3MsIGhwYWdlLCB2bWEsIG5vZGUsIHJlZmVyZW5jZWQpOworCQljb2xsYXBzZV9odWdlX3BhZ2UobW0sIGFkZHJlc3MsIGhwYWdlLCBub2RlLCByZWZlcmVuY2VkKTsKIAl9CiBvdXQ6CiAJdHJhY2VfbW1fa2h1Z2VwYWdlZF9zY2FuX3BtZChtbSwgcGFnZSwgd3JpdGFibGUsIHJlZmVyZW5jZWQsCmRpZmYgLS1naXQgYS9tbS9rc20uYyBiL21tL2tzbS5jCmluZGV4IDczZDQzYmEuLjUwNDgwODMgMTAwNjQ0Ci0tLSBhL21tL2tzbS5jCisrKyBiL21tL2tzbS5jCkBAIC0yODMsNyArMjgzLDggQEAKIHsKIAlzdHJ1Y3Qgcm1hcF9pdGVtICpybWFwX2l0ZW07CiAKLQlybWFwX2l0ZW0gPSBrbWVtX2NhY2hlX3phbGxvYyhybWFwX2l0ZW1fY2FjaGUsIEdGUF9LRVJORUwpOworCXJtYXBfaXRlbSA9IGttZW1fY2FjaGVfemFsbG9jKHJtYXBfaXRlbV9jYWNoZSwgR0ZQX0tFUk5FTCB8CisJCQkJCQlfX0dGUF9OT1JFVFJZIHwgX19HRlBfTk9XQVJOKTsKIAlpZiAocm1hcF9pdGVtKQogCQlrc21fcm1hcF9pdGVtcysrOwogCXJldHVybiBybWFwX2l0ZW07CmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLmMgYi9tbS9tZW1jb250cm9sLmMKaW5kZXggOWE2YTUxYS4uNGJlNTE4ZCAxMDA2NDQKLS0tIGEvbW0vbWVtY29udHJvbC5jCisrKyBiL21tL21lbWNvbnRyb2wuYwpAQCAtMTc0MCwxNyArMTc0MCwyMiBAQAogc3RhdGljIGJvb2wgY29uc3VtZV9zdG9jayhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIHVuc2lnbmVkIGludCBucl9wYWdlcykKIHsKIAlzdHJ1Y3QgbWVtY2dfc3RvY2tfcGNwICpzdG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWJvb2wgcmV0ID0gZmFsc2U7CiAKIAlpZiAobnJfcGFnZXMgPiBDSEFSR0VfQkFUQ0gpCiAJCXJldHVybiByZXQ7CiAKLQlzdG9jayA9ICZnZXRfY3B1X3ZhcihtZW1jZ19zdG9jayk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3RvY2sgPSB0aGlzX2NwdV9wdHIoJm1lbWNnX3N0b2NrKTsKIAlpZiAobWVtY2cgPT0gc3RvY2stPmNhY2hlZCAmJiBzdG9jay0+bnJfcGFnZXMgPj0gbnJfcGFnZXMpIHsKIAkJc3RvY2stPm5yX3BhZ2VzIC09IG5yX3BhZ2VzOwogCQlyZXQgPSB0cnVlOwogCX0KLQlwdXRfY3B1X3ZhcihtZW1jZ19zdG9jayk7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNzcxLDE1ICsxNzc2LDE4IEBACiAJc3RvY2stPmNhY2hlZCA9IE5VTEw7CiB9CiAKLS8qCi0gKiBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIHByZWVtcHQgZGlzYWJsZWQgb3IgbXVzdCBiZSBjYWxsZWQgYnkKLSAqIGEgdGhyZWFkIHdoaWNoIGlzIHBpbm5lZCB0byBsb2NhbCBjcHUuCi0gKi8KIHN0YXRpYyB2b2lkIGRyYWluX2xvY2FsX3N0b2NrKHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCiB7Ci0Jc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2sgPSB0aGlzX2NwdV9wdHIoJm1lbWNnX3N0b2NrKTsKKwlzdHJ1Y3QgbWVtY2dfc3RvY2tfcGNwICpzdG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3RvY2sgPSB0aGlzX2NwdV9wdHIoJm1lbWNnX3N0b2NrKTsKIAlkcmFpbl9zdG9jayhzdG9jayk7CiAJY2xlYXJfYml0KEZMVVNISU5HX0NBQ0hFRF9DSEFSR0UsICZzdG9jay0+ZmxhZ3MpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiAvKgpAQCAtMTc4OCwxNCArMTc5NiwxOSBAQAogICovCiBzdGF0aWMgdm9pZCByZWZpbGxfc3RvY2soc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMpCiB7Ci0Jc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2sgPSAmZ2V0X2NwdV92YXIobWVtY2dfc3RvY2spOworCXN0cnVjdCBtZW1jZ19zdG9ja19wY3AgKnN0b2NrOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzdG9jayA9IHRoaXNfY3B1X3B0cigmbWVtY2dfc3RvY2spOwogCWlmIChzdG9jay0+Y2FjaGVkICE9IG1lbWNnKSB7IC8qIHJlc2V0IGlmIG5lY2Vzc2FyeSAqLwogCQlkcmFpbl9zdG9jayhzdG9jayk7CiAJCXN0b2NrLT5jYWNoZWQgPSBtZW1jZzsKIAl9CiAJc3RvY2stPm5yX3BhZ2VzICs9IG5yX3BhZ2VzOwotCXB1dF9jcHVfdmFyKG1lbWNnX3N0b2NrKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggODNiZTk5ZC4uZjFhNjgwNCAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTMzNTEsOSArMzM1MSw2IEBACiAJYm9vbCB3YXNfd3JpdGFibGUgPSBwdGVfd3JpdGUocHRlKTsKIAlpbnQgZmxhZ3MgPSAwOwogCi0JLyogQSBQUk9UX05PTkUgZmF1bHQgc2hvdWxkIG5vdCBlbmQgdXAgaGVyZSAqLwotCUJVR19PTighKHZtYS0+dm1fZmxhZ3MgJiAoVk1fUkVBRCB8IFZNX0VYRUMgfCBWTV9XUklURSkpKTsKLQogCS8qCiAJKiBUaGUgInB0ZSIgYXQgdGhpcyBwb2ludCBjYW5ub3QgYmUgdXNlZCBzYWZlbHkgd2l0aG91dAogCSogdmFsaWRhdGlvbiB0aHJvdWdoIHB0ZV91bm1hcF9zYW1lKCkuIEl0J3Mgb2YgTlVNQSB0eXBlIGJ1dApAQCAtMzM5OCw3ICszMzk1LDcgQEAKIAkgKiBwdGVfZGlydHkgaGFzIHVucHJlZGljdGFibGUgYmVoYXZpb3VyIGJldHdlZW4gUFRFIHNjYW4gdXBkYXRlcywKIAkgKiBiYWNrZ3JvdW5kIHdyaXRlYmFjaywgZGlydHkgYmFsYW5jaW5nIGFuZCBhcHBsaWNhdGlvbiBiZWhhdmlvdXIuCiAJICovCi0JaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKKwlpZiAoIXB0ZV93cml0ZShwdGUpKQogCQlmbGFncyB8PSBUTkZfTk9fR1JPVVA7CiAKIAkvKgpAQCAtMzQ1OCw2ICszNDU1LDExIEBACiAJcmV0dXJuIFZNX0ZBVUxUX0ZBTExCQUNLOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgdm1hX2lzX2FjY2Vzc2libGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJcmV0dXJuIHZtYS0+dm1fZmxhZ3MgJiAoVk1fUkVBRCB8IFZNX0VYRUMgfCBWTV9XUklURSk7Cit9CisKIC8qCiAgKiBUaGVzZSByb3V0aW5lcyBhbHNvIG5lZWQgdG8gaGFuZGxlIHN0dWZmIGxpa2UgbWFya2luZyBwYWdlcyBkaXJ0eQogICogYW5kL29yIGFjY2Vzc2VkIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgZG8gaXQgaW4gaGFyZHdhcmUgKG1vc3QKQEAgLTM1MjQsNyArMzUyNiw3IEBACiAJaWYgKCFwdGVfcHJlc2VudChlbnRyeSkpCiAJCXJldHVybiBkb19zd2FwX3BhZ2UoZmUsIGVudHJ5KTsKIAotCWlmIChwdGVfcHJvdG5vbmUoZW50cnkpKQorCWlmIChwdGVfcHJvdG5vbmUoZW50cnkpICYmIHZtYV9pc19hY2Nlc3NpYmxlKGZlLT52bWEpKQogCQlyZXR1cm4gZG9fbnVtYV9wYWdlKGZlLCBlbnRyeSk7CiAKIAlmZS0+cHRsID0gcHRlX2xvY2twdHIoZmUtPnZtYS0+dm1fbW0sIGZlLT5wbWQpOwpAQCAtMzU5MCw3ICszNTkyLDcgQEAKIAogCQliYXJyaWVyKCk7CiAJCWlmIChwbWRfdHJhbnNfaHVnZShvcmlnX3BtZCkgfHwgcG1kX2Rldm1hcChvcmlnX3BtZCkpIHsKLQkJCWlmIChwbWRfcHJvdG5vbmUob3JpZ19wbWQpKQorCQkJaWYgKHBtZF9wcm90bm9uZShvcmlnX3BtZCkgJiYgdm1hX2lzX2FjY2Vzc2libGUodm1hKSkKIAkJCQlyZXR1cm4gZG9faHVnZV9wbWRfbnVtYV9wYWdlKCZmZSwgb3JpZ19wbWQpOwogCiAJCQlpZiAoKGZlLmZsYWdzICYgRkFVTFRfRkxBR19XUklURSkgJiYKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDQxMjY2ZGMuLjlkMjliYTAgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMTU1NSw4ICsxNTU1LDggQEAKIHsKIAlnZnBfdCBnZnBfbWFzayA9IEdGUF9VU0VSIHwgX19HRlBfTU9WQUJMRTsKIAlpbnQgbmlkID0gcGFnZV90b19uaWQocGFnZSk7Ci0Jbm9kZW1hc2tfdCBubWFzayA9IG5vZGVfb25saW5lX21hcDsKLQlzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2U7CisJbm9kZW1hc2tfdCBubWFzayA9IG5vZGVfc3RhdGVzW05fTUVNT1JZXTsKKwlzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2UgPSBOVUxMOwogCiAJLyoKIAkgKiBUT0RPOiBhbGxvY2F0ZSBhIGRlc3RpbmF0aW9uIGh1Z2VwYWdlIGZyb20gYSBuZWFyZXN0IG5laWdoYm9yIG5vZGUsCkBAIC0xNTY4LDExICsxNTY4LDEzIEBACiAJCQkJCW5leHRfbm9kZV9pbihuaWQsIG5tYXNrKSk7CiAKIAlub2RlX2NsZWFyKG5pZCwgbm1hc2spOworCiAJaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpCiAJICAgIHx8ICh6b25lX2lkeChwYWdlX3pvbmUocGFnZSkpID09IFpPTkVfTU9WQUJMRSkpCiAJCWdmcF9tYXNrIHw9IF9fR0ZQX0hJR0hNRU07CiAKLQluZXdfcGFnZSA9IF9fYWxsb2NfcGFnZXNfbm9kZW1hc2soZ2ZwX21hc2ssIDAsCisJaWYgKCFub2Rlc19lbXB0eShubWFzaykpCisJCW5ld19wYWdlID0gX19hbGxvY19wYWdlc19ub2RlbWFzayhnZnBfbWFzaywgMCwKIAkJCQkJbm9kZV96b25lbGlzdChuaWQsIGdmcF9tYXNrKSwgJm5tYXNrKTsKIAlpZiAoIW5ld19wYWdlKQogCQluZXdfcGFnZSA9IF9fYWxsb2NfcGFnZXMoZ2ZwX21hc2ssIDAsCmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IGQ4YzRlMzguLjJkYTcyYTUgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCisrKyBiL21tL21lbXBvbGljeS5jCkBAIC0yMzM2LDYgKzIzMzYsMjMgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogRHJvcCB0aGUgKHBvc3NpYmx5IGZpbmFsKSByZWZlcmVuY2UgdG8gdGFzay0+bWVtcG9saWN5LiAgSXQgbmVlZHMgdG8gYmUKKyAqIGRyb3BwZWQgYWZ0ZXIgdGFzay0+bWVtcG9saWN5IGlzIHNldCB0byBOVUxMIHNvIHRoYXQgYW55IGFsbG9jYXRpb24gZG9uZSBhcworICogcGFydCBvZiBpdHMga21lbV9jYWNoZV9mcmVlKCksIHN1Y2ggYXMgYnkgS0FTQU4sIGRvZXNuJ3QgcmVmZXJlbmNlIGEgZnJlZWQKKyAqIHBvbGljeS4KKyAqLwordm9pZCBtcG9sX3B1dF90YXNrX3BvbGljeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IG1lbXBvbGljeSAqcG9sOworCisJdGFza19sb2NrKHRhc2spOworCXBvbCA9IHRhc2stPm1lbXBvbGljeTsKKwl0YXNrLT5tZW1wb2xpY3kgPSBOVUxMOworCXRhc2tfdW5sb2NrKHRhc2spOworCW1wb2xfcHV0KHBvbCk7Cit9CisKIHN0YXRpYyB2b2lkIHNwX2RlbGV0ZShzdHJ1Y3Qgc2hhcmVkX3BvbGljeSAqc3AsIHN0cnVjdCBzcF9ub2RlICpuKQogewogCXByX2RlYnVnKCJkZWxldGluZyAlbHgtbCVseFxuIiwgbi0+c3RhcnQsIG4tPmVuZCk7CmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggY2E5ZDkxYi4uN2EwNzA3YSAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtODgsNiArODgsMTEgQEAKICAqCQl3OiAobm8pIG5vCXc6IChubykgbm8JdzogKGNvcHkpIGNvcHkJdzogKG5vKSBubwogICoJCXg6IChubykgbm8JeDogKG5vKSB5ZXMJeDogKG5vKSB5ZXMJeDogKHllcykgeWVzCiAgKgorICogT24gYXJtNjQsIFBST1RfRVhFQyBoYXMgdGhlIGZvbGxvd2luZyBiZWhhdmlvdXIgZm9yIGJvdGggTUFQX1NIQVJFRCBhbmQKKyAqIE1BUF9QUklWQVRFOgorICoJCQkJCQkJCXI6IChubykgbm8KKyAqCQkJCQkJCQl3OiAobm8pIG5vCisgKgkJCQkJCQkJeDogKHllcykgeWVzCiAgKi8KIHBncHJvdF90IHByb3RlY3Rpb25fbWFwWzE2XSA9IHsKIAlfX1AwMDAsIF9fUDAwMSwgX19QMDEwLCBfX1AwMTEsIF9fUDEwMCwgX19QMTAxLCBfX1AxMTAsIF9fUDExMSwKQEAgLTMwNjMsNiArMzA2OCwxNCBAQAogCXJldHVybiBFUlJfUFRSKHJldCk7CiB9CiAKK2Jvb2wgdm1hX2lzX3NwZWNpYWxfbWFwcGluZyhjb25zdCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwljb25zdCBzdHJ1Y3Qgdm1fc3BlY2lhbF9tYXBwaW5nICpzbSkKK3sKKwlyZXR1cm4gdm1hLT52bV9wcml2YXRlX2RhdGEgPT0gc20gJiYKKwkJKHZtYS0+dm1fb3BzID09ICZzcGVjaWFsX21hcHBpbmdfdm1vcHMgfHwKKwkJIHZtYS0+dm1fb3BzID09ICZsZWdhY3lfc3BlY2lhbF9tYXBwaW5nX3Ztb3BzKTsKK30KKwogLyoKICAqIENhbGxlZCB3aXRoIG1tLT5tbWFwX3NlbSBoZWxkIGZvciB3cml0aW5nLgogICogSW5zZXJ0IGEgbmV3IHZtYSBjb3ZlcmluZyB0aGUgZ2l2ZW4gcmVnaW9uLCB3aXRoIHRoZSBnaXZlbiBmbGFncy4KZGlmZiAtLWdpdCBhL21tL3BhZ2Utd3JpdGViYWNrLmMgYi9tbS9wYWdlLXdyaXRlYmFjay5jCmluZGV4IGY0Y2Q3ZDguLjI4ZDZmMzYgMTAwNjQ0Ci0tLSBhL21tL3BhZ2Utd3JpdGViYWNrLmMKKysrIGIvbW0vcGFnZS13cml0ZWJhY2suYwpAQCAtMjA4MCwyNiArMjA4MCwxMiBAQAogCQlyYXRlbGltaXRfcGFnZXMgPSAxNjsKIH0KIAotc3RhdGljIGludAotcmF0ZWxpbWl0X2hhbmRsZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKLQkJICB2b2lkICpoY3B1KQorc3RhdGljIGludCBwYWdlX3dyaXRlYmFja19jcHVfb25saW5lKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0KLQlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX0RFQUQ6Ci0JCXdyaXRlYmFja19zZXRfcmF0ZWxpbWl0KCk7Ci0JCXJldHVybiBOT1RJRllfT0s7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5PVElGWV9ET05FOwotCX0KKwl3cml0ZWJhY2tfc2V0X3JhdGVsaW1pdCgpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJhdGVsaW1pdF9uYiA9IHsKLQkubm90aWZpZXJfY2FsbAk9IHJhdGVsaW1pdF9oYW5kbGVyLAotCS5uZXh0CQk9IE5VTEwsCi19OwotCiAvKgogICogQ2FsbGVkIGVhcmx5IG9uIHRvIHR1bmUgdGhlIHBhZ2Ugd3JpdGViYWNrIGRpcnR5IGxpbWl0cy4KICAqCkBAIC0yMTIyLDggKzIxMDgsMTAgQEAKIHsKIAlCVUdfT04od2JfZG9tYWluX2luaXQoJmdsb2JhbF93Yl9kb21haW4sIEdGUF9LRVJORUwpKTsKIAotCXdyaXRlYmFja19zZXRfcmF0ZWxpbWl0KCk7Ci0JcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZyYXRlbGltaXRfbmIpOworCWNwdWhwX3NldHVwX3N0YXRlKENQVUhQX0FQX09OTElORV9EWU4sICJtbS93cml0ZWJhY2s6b25saW5lIiwKKwkJCSAgcGFnZV93cml0ZWJhY2tfY3B1X29ubGluZSwgTlVMTCk7CisJY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfTU1fV1JJVEVCQUNLX0RFQUQsICJtbS93cml0ZWJhY2s6ZGVhZCIsIE5VTEwsCisJCQkgIHBhZ2Vfd3JpdGViYWNrX2NwdV9vbmxpbmUpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL21tL3BhZ2VfYWxsb2MuYyBiL21tL3BhZ2VfYWxsb2MuYwppbmRleCAzZmJlNzNhLi5hMjIxNGM2IDEwMDY0NAotLS0gYS9tbS9wYWdlX2FsbG9jLmMKKysrIGIvbW0vcGFnZV9hbGxvYy5jCkBAIC0zMTM3LDU0ICszMTM3LDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBib29sCi1zaG91bGRfY29tcGFjdF9yZXRyeShzdHJ1Y3QgYWxsb2NfY29udGV4dCAqYWMsIGludCBvcmRlciwgaW50IGFsbG9jX2ZsYWdzLAotCQkgICAgIGVudW0gY29tcGFjdF9yZXN1bHQgY29tcGFjdF9yZXN1bHQsCi0JCSAgICAgZW51bSBjb21wYWN0X3ByaW9yaXR5ICpjb21wYWN0X3ByaW9yaXR5LAotCQkgICAgIGludCBjb21wYWN0aW9uX3JldHJpZXMpCi17Ci0JaW50IG1heF9yZXRyaWVzID0gTUFYX0NPTVBBQ1RfUkVUUklFUzsKLQotCWlmICghb3JkZXIpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qCi0JICogY29tcGFjdGlvbiBjb25zaWRlcnMgYWxsIHRoZSB6b25lIGFzIGRlc3BlcmF0ZWx5IG91dCBvZiBtZW1vcnkKLQkgKiBzbyBpdCBkb2Vzbid0IHJlYWxseSBtYWtlIG11Y2ggc2Vuc2UgdG8gcmV0cnkgZXhjZXB0IHdoZW4gdGhlCi0JICogZmFpbHVyZSBjb3VsZCBiZSBjYXVzZWQgYnkgaW5zdWZmaWNpZW50IHByaW9yaXR5Ci0JICovCi0JaWYgKGNvbXBhY3Rpb25fZmFpbGVkKGNvbXBhY3RfcmVzdWx0KSkgewotCQlpZiAoKmNvbXBhY3RfcHJpb3JpdHkgPiBNSU5fQ09NUEFDVF9QUklPUklUWSkgewotCQkJKCpjb21wYWN0X3ByaW9yaXR5KS0tOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogbWFrZSBzdXJlIHRoZSBjb21wYWN0aW9uIHdhc24ndCBkZWZlcnJlZCBvciBkaWRuJ3QgYmFpbCBvdXQgZWFybHkKLQkgKiBkdWUgdG8gbG9ja3MgY29udGVudGlvbiBiZWZvcmUgd2UgZGVjbGFyZSB0aGF0IHdlIHNob3VsZCBnaXZlIHVwLgotCSAqIEJ1dCBkbyBub3QgcmV0cnkgaWYgdGhlIGdpdmVuIHpvbmVsaXN0IGlzIG5vdCBzdWl0YWJsZSBmb3IKLQkgKiBjb21wYWN0aW9uLgotCSAqLwotCWlmIChjb21wYWN0aW9uX3dpdGhkcmF3bihjb21wYWN0X3Jlc3VsdCkpCi0JCXJldHVybiBjb21wYWN0aW9uX3pvbmVsaXN0X3N1aXRhYmxlKGFjLCBvcmRlciwgYWxsb2NfZmxhZ3MpOwotCi0JLyoKLQkgKiAhY29zdGx5IHJlcXVlc3RzIGFyZSBtdWNoIG1vcmUgaW1wb3J0YW50IHRoYW4gX19HRlBfUkVQRUFUCi0JICogY29zdGx5IG9uZXMgYmVjYXVzZSB0aGV5IGFyZSBkZSBmYWN0byBub2ZhaWwgYW5kIGludm9rZSBPT00KLQkgKiBraWxsZXIgdG8gbW92ZSBvbiB3aGlsZSBjb3N0bHkgY2FuIGZhaWwgYW5kIHVzZXJzIGFyZSByZWFkeQotCSAqIHRvIGNvcGUgd2l0aCB0aGF0LiAxLzQgcmV0cmllcyBpcyByYXRoZXIgYXJiaXRyYXJ5IGJ1dCB3ZQotCSAqIHdvdWxkIG5lZWQgbXVjaCBtb3JlIGRldGFpbGVkIGZlZWRiYWNrIGZyb20gY29tcGFjdGlvbiB0bwotCSAqIG1ha2UgYSBiZXR0ZXIgZGVjaXNpb24uCi0JICovCi0JaWYgKG9yZGVyID4gUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpCi0JCW1heF9yZXRyaWVzIC89IDQ7Ci0JaWYgKGNvbXBhY3Rpb25fcmV0cmllcyA8PSBtYXhfcmV0cmllcykKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19CiAjZWxzZQogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqCiBfX2FsbG9jX3BhZ2VzX2RpcmVjdF9jb21wYWN0KGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBpbnQgb3JkZXIsCkBAIC0zMTk1LDYgKzMxNDcsOCBAQAogCXJldHVybiBOVUxMOwogfQogCisjZW5kaWYgLyogQ09ORklHX0NPTVBBQ1RJT04gKi8KKwogc3RhdGljIGlubGluZSBib29sCiBzaG91bGRfY29tcGFjdF9yZXRyeShzdHJ1Y3QgYWxsb2NfY29udGV4dCAqYWMsIHVuc2lnbmVkIGludCBvcmRlciwgaW50IGFsbG9jX2ZsYWdzLAogCQkgICAgIGVudW0gY29tcGFjdF9yZXN1bHQgY29tcGFjdF9yZXN1bHQsCkBAIC0zMjIxLDcgKzMxNzUsNiBAQAogCX0KIAlyZXR1cm4gZmFsc2U7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0NPTVBBQ1RJT04gKi8KIAogLyogUGVyZm9ybSBkaXJlY3Qgc3luY2hyb25vdXMgcGFnZSByZWNsYWltICovCiBzdGF0aWMgaW50CkBAIC00NDA3LDcgKzQzNjAsNyBAQAogCWRvIHsKIAkJem9uZV90eXBlLS07CiAJCXpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIHpvbmVfdHlwZTsKLQkJaWYgKHBvcHVsYXRlZF96b25lKHpvbmUpKSB7CisJCWlmIChtYW5hZ2VkX3pvbmUoem9uZSkpIHsKIAkJCXpvbmVyZWZfc2V0X3pvbmUoem9uZSwKIAkJCQkmem9uZWxpc3QtPl96b25lcmVmc1tucl96b25lcysrXSk7CiAJCQljaGVja19oaWdoZXN0X3pvbmUoem9uZV90eXBlKTsKQEAgLTQ2NDUsNyArNDU5OCw3IEBACiAJCWZvciAoaiA9IDA7IGogPCBucl9ub2RlczsgaisrKSB7CiAJCQlub2RlID0gbm9kZV9vcmRlcltqXTsKIAkJCXogPSAmTk9ERV9EQVRBKG5vZGUpLT5ub2RlX3pvbmVzW3pvbmVfdHlwZV07Ci0JCQlpZiAocG9wdWxhdGVkX3pvbmUoeikpIHsKKwkJCWlmIChtYW5hZ2VkX3pvbmUoeikpIHsKIAkJCQl6b25lcmVmX3NldF96b25lKHosCiAJCQkJCSZ6b25lbGlzdC0+X3pvbmVyZWZzW3BvcysrXSk7CiAJCQkJY2hlY2tfaGlnaGVzdF96b25lKHpvbmVfdHlwZSk7CmRpZmYgLS1naXQgYS9tbS9wYWdlX2lvLmMgYi9tbS9wYWdlX2lvLmMKaW5kZXggMTZiZDgyZmEuLmVhZmU1ZGQgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfaW8uYworKysgYi9tbS9wYWdlX2lvLmMKQEAgLTI2NCw2ICsyNjQsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHBhZ2Vfc3dhcF9pbmZvKHBhZ2UpOwogCisJQlVHX09OKCFQYWdlU3dhcENhY2hlKHBhZ2UpKTsKIAlpZiAoc2lzLT5mbGFncyAmIFNXUF9GSUxFKSB7CiAJCXN0cnVjdCBraW9jYiBraW9jYjsKIAkJc3RydWN0IGZpbGUgKnN3YXBfZmlsZSA9IHNpcy0+c3dhcF9maWxlOwpAQCAtMzM3LDYgKzMzOCw3IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpcyA9IHBhZ2Vfc3dhcF9pbmZvKHBhZ2UpOwogCisJQlVHX09OKCFQYWdlU3dhcENhY2hlKHBhZ2UpKTsKIAlWTV9CVUdfT05fUEFHRSghUGFnZUxvY2tlZChwYWdlKSwgcGFnZSk7CiAJVk1fQlVHX09OX1BBR0UoUGFnZVVwdG9kYXRlKHBhZ2UpLCBwYWdlKTsKIAlpZiAoZnJvbnRzd2FwX2xvYWQocGFnZSkgPT0gMCkgewpAQCAtMzg2LDYgKzM4OCw3IEBACiAKIAlpZiAoc2lzLT5mbGFncyAmIFNXUF9GSUxFKSB7CiAJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gc2lzLT5zd2FwX2ZpbGUtPmZfbWFwcGluZzsKKwkJQlVHX09OKCFQYWdlU3dhcENhY2hlKHBhZ2UpKTsKIAkJcmV0dXJuIG1hcHBpbmctPmFfb3BzLT5zZXRfcGFnZV9kaXJ0eShwYWdlKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gX19zZXRfcGFnZV9kaXJ0eV9ub193cml0ZWJhY2socGFnZSk7CmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCBmZDhiMmI1Li5kODZiNWU0IDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCisrKyBiL21tL3NobWVtLmMKQEAgLTI3MCw3ICsyNzAsNyBAQAogCQlpbmZvLT5hbGxvY2VkIC09IHBhZ2VzOwogCQlzaG1lbV9yZWNhbGNfaW5vZGUoaW5vZGUpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLCBmbGFncyk7Ci0KKwkJc2htZW1fdW5hY2N0X2Jsb2NrcyhpbmZvLT5mbGFncywgcGFnZXMpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpbmZvLT51c2VkX2Jsb2NrcywgcGFnZXMpOwpAQCAtMjkxLDYgKzI5MSw3IEBACiAKIAlpZiAoc2JpbmZvLT5tYXhfYmxvY2tzKQogCQlwZXJjcHVfY291bnRlcl9zdWIoJnNiaW5mby0+dXNlZF9ibG9ja3MsIHBhZ2VzKTsKKwlzaG1lbV91bmFjY3RfYmxvY2tzKGluZm8tPmZsYWdzLCBwYWdlcyk7CiB9CiAKIC8qCkBAIC0xOTgwLDcgKzE5ODEsNyBAQAogCQkJCXJldHVybiBhZGRyOwogCQkJc2IgPSBzaG1fbW50LT5tbnRfc2I7CiAJCX0KLQkJaWYgKFNITUVNX1NCKHNiKS0+aHVnZSAhPSBTSE1FTV9IVUdFX05FVkVSKQorCQlpZiAoU0hNRU1fU0Ioc2IpLT5odWdlID09IFNITUVNX0hVR0VfTkVWRVIpCiAJCQlyZXR1cm4gYWRkcjsKIAl9CiAKQEAgLTIzMTAsMTE5ICsyMzExLDYgQEAKIAlyZXR1cm4gcmV0dmFsID8gcmV0dmFsIDogZXJyb3I7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHNobWVtX2ZpbGVfc3BsaWNlX3JlYWQoc3RydWN0IGZpbGUgKmluLCBsb2ZmX3QgKnBwb3MsCi0JCQkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwKLQkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbi0+Zl9tYXBwaW5nOwotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwotCXVuc2lnbmVkIGludCBsb2ZmLCBucl9wYWdlcywgcmVxX3BhZ2VzOwotCXN0cnVjdCBwYWdlICpwYWdlc1tQSVBFX0RFRl9CVUZGRVJTXTsKLQlzdHJ1Y3QgcGFydGlhbF9wYWdlIHBhcnRpYWxbUElQRV9ERUZfQlVGRkVSU107Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JcGdvZmZfdCBpbmRleCwgZW5kX2luZGV4OwotCWxvZmZfdCBpc2l6ZSwgbGVmdDsKLQlpbnQgZXJyb3IsIHBhZ2VfbnI7Ci0Jc3RydWN0IHNwbGljZV9waXBlX2Rlc2Mgc3BkID0gewotCQkucGFnZXMgPSBwYWdlcywKLQkJLnBhcnRpYWwgPSBwYXJ0aWFsLAotCQkubnJfcGFnZXNfbWF4ID0gUElQRV9ERUZfQlVGRkVSUywKLQkJLmZsYWdzID0gZmxhZ3MsCi0JCS5vcHMgPSAmcGFnZV9jYWNoZV9waXBlX2J1Zl9vcHMsCi0JCS5zcGRfcmVsZWFzZSA9IHNwZF9yZWxlYXNlX3BhZ2UsCi0JfTsKLQotCWlzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCWlmICh1bmxpa2VseSgqcHBvcyA+PSBpc2l6ZSkpCi0JCXJldHVybiAwOwotCi0JbGVmdCA9IGlzaXplIC0gKnBwb3M7Ci0JaWYgKHVubGlrZWx5KGxlZnQgPCBsZW4pKQotCQlsZW4gPSBsZWZ0OwotCi0JaWYgKHNwbGljZV9ncm93X3NwZChwaXBlLCAmc3BkKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlpbmRleCA9ICpwcG9zID4+IFBBR0VfU0hJRlQ7Ci0JbG9mZiA9ICpwcG9zICYgflBBR0VfTUFTSzsKLQlyZXFfcGFnZXMgPSAobGVuICsgbG9mZiArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7Ci0JbnJfcGFnZXMgPSBtaW4ocmVxX3BhZ2VzLCBzcGQubnJfcGFnZXNfbWF4KTsKLQotCXNwZC5ucl9wYWdlcyA9IGZpbmRfZ2V0X3BhZ2VzX2NvbnRpZyhtYXBwaW5nLCBpbmRleCwKLQkJCQkJCW5yX3BhZ2VzLCBzcGQucGFnZXMpOwotCWluZGV4ICs9IHNwZC5ucl9wYWdlczsKLQllcnJvciA9IDA7Ci0KLQl3aGlsZSAoc3BkLm5yX3BhZ2VzIDwgbnJfcGFnZXMpIHsKLQkJZXJyb3IgPSBzaG1lbV9nZXRwYWdlKGlub2RlLCBpbmRleCwgJnBhZ2UsIFNHUF9DQUNIRSk7Ci0JCWlmIChlcnJvcikKLQkJCWJyZWFrOwotCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJc3BkLnBhZ2VzW3NwZC5ucl9wYWdlcysrXSA9IHBhZ2U7Ci0JCWluZGV4Kys7Ci0JfQotCi0JaW5kZXggPSAqcHBvcyA+PiBQQUdFX1NISUZUOwotCW5yX3BhZ2VzID0gc3BkLm5yX3BhZ2VzOwotCXNwZC5ucl9wYWdlcyA9IDA7Ci0KLQlmb3IgKHBhZ2VfbnIgPSAwOyBwYWdlX25yIDwgbnJfcGFnZXM7IHBhZ2VfbnIrKykgewotCQl1bnNpZ25lZCBpbnQgdGhpc19sZW47Ci0KLQkJaWYgKCFsZW4pCi0JCQlicmVhazsKLQotCQl0aGlzX2xlbiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGxlbiwgUEFHRV9TSVpFIC0gbG9mZik7Ci0JCXBhZ2UgPSBzcGQucGFnZXNbcGFnZV9ucl07Ci0KLQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgfHwgcGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nKSB7Ci0JCQllcnJvciA9IHNobWVtX2dldHBhZ2UoaW5vZGUsIGluZGV4LCAmcGFnZSwgU0dQX0NBQ0hFKTsKLQkJCWlmIChlcnJvcikKLQkJCQlicmVhazsKLQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJcHV0X3BhZ2Uoc3BkLnBhZ2VzW3BhZ2VfbnJdKTsKLQkJCXNwZC5wYWdlc1twYWdlX25yXSA9IHBhZ2U7Ci0JCX0KLQotCQlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQkJZW5kX2luZGV4ID0gKGlzaXplIC0gMSkgPj4gUEFHRV9TSElGVDsKLQkJaWYgKHVubGlrZWx5KCFpc2l6ZSB8fCBpbmRleCA+IGVuZF9pbmRleCkpCi0JCQlicmVhazsKLQotCQlpZiAoZW5kX2luZGV4ID09IGluZGV4KSB7Ci0JCQl1bnNpZ25lZCBpbnQgcGxlbjsKLQotCQkJcGxlbiA9ICgoaXNpemUgLSAxKSAmIH5QQUdFX01BU0spICsgMTsKLQkJCWlmIChwbGVuIDw9IGxvZmYpCi0JCQkJYnJlYWs7Ci0KLQkJCXRoaXNfbGVuID0gbWluKHRoaXNfbGVuLCBwbGVuIC0gbG9mZik7Ci0JCQlsZW4gPSB0aGlzX2xlbjsKLQkJfQotCi0JCXNwZC5wYXJ0aWFsW3BhZ2VfbnJdLm9mZnNldCA9IGxvZmY7Ci0JCXNwZC5wYXJ0aWFsW3BhZ2VfbnJdLmxlbiA9IHRoaXNfbGVuOwotCQlsZW4gLT0gdGhpc19sZW47Ci0JCWxvZmYgPSAwOwotCQlzcGQubnJfcGFnZXMrKzsKLQkJaW5kZXgrKzsKLQl9Ci0KLQl3aGlsZSAocGFnZV9uciA8IG5yX3BhZ2VzKQotCQlwdXRfcGFnZShzcGQucGFnZXNbcGFnZV9ucisrXSk7Ci0KLQlpZiAoc3BkLm5yX3BhZ2VzKQotCQllcnJvciA9IHNwbGljZV90b19waXBlKHBpcGUsICZzcGQpOwotCi0Jc3BsaWNlX3Nocmlua19zcGQoJnNwZCk7Ci0KLQlpZiAoZXJyb3IgPiAwKSB7Ci0JCSpwcG9zICs9IGVycm9yOwotCQlmaWxlX2FjY2Vzc2VkKGluKTsKLQl9Ci0JcmV0dXJuIGVycm9yOwotfQotCiAvKgogICogbGxzZWVrIFNFRUtfREFUQSBvciBTRUVLX0hPTEUgdGhyb3VnaCB0aGUgcmFkaXhfdHJlZS4KICAqLwpAQCAtMzc4NSw3ICszNjczLDcgQEAKIAkucmVhZF9pdGVyCT0gc2htZW1fZmlsZV9yZWFkX2l0ZXIsCiAJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkuZnN5bmMJCT0gbm9vcF9mc3luYywKLQkuc3BsaWNlX3JlYWQJPSBzaG1lbV9maWxlX3NwbGljZV9yZWFkLAorCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIAkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKIAkuZmFsbG9jYXRlCT0gc2htZW1fZmFsbG9jYXRlLAogI2VuZGlmCmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggYjY3MjcxMC4uMDkwZmIyNiAxMDA2NDQKLS0tIGEvbW0vc2xhYi5jCisrKyBiL21tL3NsYWIuYwpAQCAtODg2LDYgKzg4Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZiAoZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgZGVmaW5lZChDT05GSUdfTUVNT1JZX0hPVFBMVUcpKSB8fCBkZWZpbmVkKENPTkZJR19TTVApCiAvKgogICogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBub2RlIGZvciBhIG5vZGUgb24gZWFjaCBzbGFiIGNhY2hlLCB1c2VkIGZvcgogICogZWl0aGVyIG1lbW9yeSBvciBjcHUgaG90cGx1Zy4gIElmIG1lbW9yeSBpcyBiZWluZyBob3QtYWRkZWQsIHRoZSBrbWVtX2NhY2hlX25vZGUKQEAgLTkwOCw2ICs5MDksNyBAQAogCiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKIAogc3RhdGljIGludCBzZXR1cF9rbWVtX2NhY2hlX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKIAkJCQlpbnQgbm9kZSwgZ2ZwX3QgZ2ZwLCBib29sIGZvcmNlX2NoYW5nZSkKQEAgLTk3NSw2ICs5NzcsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfU01QCisKIHN0YXRpYyB2b2lkIGNwdXVwX2NhbmNlbGVkKGxvbmcgY3B1KQogewogCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7CkBAIC0xMDc1LDY1ICsxMDc5LDU0IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBpbnQgY3B1dXBfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoraW50IHNsYWJfcHJlcGFyZV9jcHUodW5zaWduZWQgaW50IGNwdSkKIHsKLQlsb25nIGNwdSA9IChsb25nKWhjcHU7Ci0JaW50IGVyciA9IDA7CisJaW50IGVycjsKIAotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfVVBfUFJFUEFSRToKLQljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKLQkJbXV0ZXhfbG9jaygmc2xhYl9tdXRleCk7Ci0JCWVyciA9IGNwdXVwX3ByZXBhcmUoY3B1KTsKLQkJbXV0ZXhfdW5sb2NrKCZzbGFiX211dGV4KTsKLQkJYnJlYWs7Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JCXN0YXJ0X2NwdV90aW1lcihjcHUpOwotCQlicmVhazsKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLSAgCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKLSAgCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46Ci0JCS8qCi0JCSAqIFNodXRkb3duIGNhY2hlIHJlYXBlci4gTm90ZSB0aGF0IHRoZSBzbGFiX211dGV4IGlzCi0JCSAqIGhlbGQgc28gdGhhdCBpZiBjYWNoZV9yZWFwKCkgaXMgaW52b2tlZCBpdCBjYW5ub3QgZG8KLQkJICogYW55dGhpbmcgZXhwZW5zaXZlIGJ1dCB3aWxsIG9ubHkgbW9kaWZ5IHJlYXBfd29yawotCQkgKiBhbmQgcmVzY2hlZHVsZSB0aGUgdGltZXIuCi0JCSovCi0JCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcGVyX2NwdShzbGFiX3JlYXBfd29yaywgY3B1KSk7Ci0JCS8qIE5vdyB0aGUgY2FjaGVfcmVhcGVyIGlzIGd1YXJhbnRlZWQgdG8gYmUgbm90IHJ1bm5pbmcuICovCi0JCXBlcl9jcHUoc2xhYl9yZWFwX3dvcmssIGNwdSkud29yay5mdW5jID0gTlVMTDsKLSAgCQlicmVhazsKLSAgCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgotICAJY2FzZSBDUFVfRE9XTl9GQUlMRURfRlJPWkVOOgotCQlzdGFydF9jcHVfdGltZXIoY3B1KTsKLSAgCQlicmVhazsKLQljYXNlIENQVV9ERUFEOgotCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQkvKgotCQkgKiBFdmVuIGlmIGFsbCB0aGUgY3B1cyBvZiBhIG5vZGUgYXJlIGRvd24sIHdlIGRvbid0IGZyZWUgdGhlCi0JCSAqIGttZW1fY2FjaGVfbm9kZSBvZiBhbnkgY2FjaGUuIFRoaXMgdG8gYXZvaWQgYSByYWNlIGJldHdlZW4KLQkJICogY3B1X2Rvd24sIGFuZCBhIGttYWxsb2MgYWxsb2NhdGlvbiBmcm9tIGFub3RoZXIgY3B1IGZvcgotCQkgKiBtZW1vcnkgZnJvbSB0aGUgbm9kZSBvZiB0aGUgY3B1IGdvaW5nIGRvd24uICBUaGUgbm9kZQotCQkgKiBzdHJ1Y3R1cmUgaXMgdXN1YWxseSBhbGxvY2F0ZWQgZnJvbSBrbWVtX2NhY2hlX2NyZWF0ZSgpIGFuZAotCQkgKiBnZXRzIGRlc3Ryb3llZCBhdCBrbWVtX2NhY2hlX2Rlc3Ryb3koKS4KLQkJICovCi0JCS8qIGZhbGwgdGhyb3VnaCAqLwotI2VuZGlmCi0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOOgotCQltdXRleF9sb2NrKCZzbGFiX211dGV4KTsKLQkJY3B1dXBfY2FuY2VsZWQoY3B1KTsKLQkJbXV0ZXhfdW5sb2NrKCZzbGFiX211dGV4KTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiBub3RpZmllcl9mcm9tX2Vycm5vKGVycik7CisJbXV0ZXhfbG9jaygmc2xhYl9tdXRleCk7CisJZXJyID0gY3B1dXBfcHJlcGFyZShjcHUpOworCW11dGV4X3VubG9jaygmc2xhYl9tdXRleCk7CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBjcHVjYWNoZV9ub3RpZmllciA9IHsKLQkmY3B1dXBfY2FsbGJhY2ssIE5VTEwsIDAKLX07CisvKgorICogVGhpcyBpcyBjYWxsZWQgZm9yIGEgZmFpbGVkIG9ubGluZSBhdHRlbXB0IGFuZCBmb3IgYSBzdWNjZXNzZnVsCisgKiBvZmZsaW5lLgorICoKKyAqIEV2ZW4gaWYgYWxsIHRoZSBjcHVzIG9mIGEgbm9kZSBhcmUgZG93biwgd2UgZG9uJ3QgZnJlZSB0aGUKKyAqIGttZW1fbGlzdDMgb2YgYW55IGNhY2hlLiBUaGlzIHRvIGF2b2lkIGEgcmFjZSBiZXR3ZWVuIGNwdV9kb3duLCBhbmQKKyAqIGEga21hbGxvYyBhbGxvY2F0aW9uIGZyb20gYW5vdGhlciBjcHUgZm9yIG1lbW9yeSBmcm9tIHRoZSBub2RlIG9mCisgKiB0aGUgY3B1IGdvaW5nIGRvd24uICBUaGUgbGlzdDMgc3RydWN0dXJlIGlzIHVzdWFsbHkgYWxsb2NhdGVkIGZyb20KKyAqIGttZW1fY2FjaGVfY3JlYXRlKCkgYW5kIGdldHMgZGVzdHJveWVkIGF0IGttZW1fY2FjaGVfZGVzdHJveSgpLgorICovCitpbnQgc2xhYl9kZWFkX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCW11dGV4X2xvY2soJnNsYWJfbXV0ZXgpOworCWNwdXVwX2NhbmNlbGVkKGNwdSk7CisJbXV0ZXhfdW5sb2NrKCZzbGFiX211dGV4KTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNsYWJfb25saW5lX2NwdSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0YXJ0X2NwdV90aW1lcihjcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNsYWJfb2ZmbGluZV9jcHUodW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKgorCSAqIFNodXRkb3duIGNhY2hlIHJlYXBlci4gTm90ZSB0aGF0IHRoZSBzbGFiX211dGV4IGlzIGhlbGQgc28KKwkgKiB0aGF0IGlmIGNhY2hlX3JlYXAoKSBpcyBpbnZva2VkIGl0IGNhbm5vdCBkbyBhbnl0aGluZworCSAqIGV4cGVuc2l2ZSBidXQgd2lsbCBvbmx5IG1vZGlmeSByZWFwX3dvcmsgYW5kIHJlc2NoZWR1bGUgdGhlCisJICogdGltZXIuCisJICovCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwZXJfY3B1KHNsYWJfcmVhcF93b3JrLCBjcHUpKTsKKwkvKiBOb3cgdGhlIGNhY2hlX3JlYXBlciBpcyBndWFyYW50ZWVkIHRvIGJlIG5vdCBydW5uaW5nLiAqLworCXBlcl9jcHUoc2xhYl9yZWFwX3dvcmssIGNwdSkud29yay5mdW5jID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KIAogI2lmIGRlZmluZWQoQ09ORklHX05VTUEpICYmIGRlZmluZWQoQ09ORklHX01FTU9SWV9IT1RQTFVHKQogLyoKQEAgLTEzMzYsMTIgKzEzMjksNiBAQAogCS8qIERvbmUhICovCiAJc2xhYl9zdGF0ZSA9IEZVTEw7CiAKLQkvKgotCSAqIFJlZ2lzdGVyIGEgY3B1IHN0YXJ0dXAgbm90aWZpZXIgY2FsbGJhY2sgdGhhdCBpbml0aWFsaXplcwotCSAqIGNwdV9jYWNoZV9nZXQgZm9yIGFsbCBuZXcgY3B1cwotCSAqLwotCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmY3B1Y2FjaGVfbm90aWZpZXIpOwotCiAjaWZkZWYgQ09ORklHX05VTUEKIAkvKgogCSAqIFJlZ2lzdGVyIGEgbWVtb3J5IGhvdHBsdWcgY2FsbGJhY2sgdGhhdCBpbml0aWFsaXplcyBhbmQgZnJlZXMKQEAgLTEzNTgsMTMgKzEzNDUsMTQgQEAKIAogc3RhdGljIGludCBfX2luaXQgY3B1Y2FjaGVfaW5pdCh2b2lkKQogewotCWludCBjcHU7CisJaW50IHJldDsKIAogCS8qCiAJICogUmVnaXN0ZXIgdGhlIHRpbWVycyB0aGF0IHJldHVybiB1bm5lZWRlZCBwYWdlcyB0byB0aGUgcGFnZSBhbGxvY2F0b3IKIAkgKi8KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJc3RhcnRfY3B1X3RpbWVyKGNwdSk7CisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfT05MSU5FX0RZTiwgIlNMQUIgb25saW5lIiwKKwkJCQlzbGFiX29ubGluZV9jcHUsIHNsYWJfb2ZmbGluZV9jcHUpOworCVdBUk5fT04ocmV0IDwgMCk7CiAKIAkvKiBEb25lISAqLwogCXNsYWJfc3RhdGUgPSBGVUxMOwpkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IDlhZGFlNTguLjJiM2U3NDAgMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTE5NCwxMCArMTk0LDYgQEAKICNkZWZpbmUgX19PQkpFQ1RfUE9JU09OCQkweDgwMDAwMDAwVUwgLyogUG9pc29uIG9iamVjdCAqLwogI2RlZmluZSBfX0NNUFhDSEdfRE9VQkxFCTB4NDAwMDAwMDBVTCAvKiBVc2UgY21weGNoZ19kb3VibGUgKi8KIAotI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgc2xhYl9ub3RpZmllcjsKLSNlbmRpZgotCiAvKgogICogVHJhY2tpbmcgdXNlciBvZiBhIHNsYWIuCiAgKi8KQEAgLTIzMDUsNiArMjMwMSwyNSBAQAogfQogCiAvKgorICogVXNlIHRoZSBjcHUgbm90aWZpZXIgdG8gaW5zdXJlIHRoYXQgdGhlIGNwdSBzbGFicyBhcmUgZmx1c2hlZCB3aGVuCisgKiBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBpbnQgc2x1Yl9jcHVfZGVhZCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBrbWVtX2NhY2hlICpzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltdXRleF9sb2NrKCZzbGFiX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZzbGFiX2NhY2hlcywgbGlzdCkgeworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCV9fZmx1c2hfY3B1X3NsYWIocywgY3B1KTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KKwltdXRleF91bmxvY2soJnNsYWJfbXV0ZXgpOworCXJldHVybiAwOworfQorCisvKgogICogQ2hlY2sgaWYgdGhlIG9iamVjdHMgaW4gYSBwZXIgY3B1IHN0cnVjdHVyZSBmaXQgbnVtYQogICogbG9jYWxpdHkgZXhwZWN0YXRpb25zLgogICovCkBAIC00MTQ0LDkgKzQxNTksOCBAQAogCS8qIFNldHVwIHJhbmRvbSBmcmVlbGlzdHMgZm9yIGVhY2ggY2FjaGUgKi8KIAlpbml0X2ZyZWVsaXN0X3JhbmRvbWl6YXRpb24oKTsKIAotI2lmZGVmIENPTkZJR19TTVAKLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNsYWJfbm90aWZpZXIpOwotI2VuZGlmCisJY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9TTFVCX0RFQUQsICJzbHViOmRlYWQiLCBOVUxMLAorCQkJCSAgc2x1Yl9jcHVfZGVhZCk7CiAKIAlwcl9pbmZvKCJTTFVCOiBIV2FsaWduPSVkLCBPcmRlcj0lZC0lZCwgTWluT2JqZWN0cz0lZCwgQ1BVcz0lZCwgTm9kZXM9JWRcbiIsCiAJCWNhY2hlX2xpbmVfc2l6ZSgpLApAQCAtNDIxMCw0MyArNDIyNCw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2lmZGVmIENPTkZJR19TTVAKLS8qCi0gKiBVc2UgdGhlIGNwdSBub3RpZmllciB0byBpbnN1cmUgdGhhdCB0aGUgY3B1IHNsYWJzIGFyZSBmbHVzaGVkIHdoZW4KLSAqIG5lY2Vzc2FyeS4KLSAqLwotc3RhdGljIGludCBzbGFiX2NwdXVwX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAotCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKLXsKLQlsb25nIGNwdSA9IChsb25nKWhjcHU7Ci0Jc3RydWN0IGttZW1fY2FjaGUgKnM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6Ci0JY2FzZSBDUFVfVVBfQ0FOQ0VMRURfRlJPWkVOOgotCWNhc2UgQ1BVX0RFQUQ6Ci0JY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCW11dGV4X2xvY2soJnNsYWJfbXV0ZXgpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZzbGFiX2NhY2hlcywgbGlzdCkgewotCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQkJX19mbHVzaF9jcHVfc2xhYihzLCBjcHUpOwotCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQl9Ci0JCW11dGV4X3VubG9jaygmc2xhYl9tdXRleCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gTk9USUZZX09LOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHNsYWJfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBzbGFiX2NwdXVwX2NhbGxiYWNrCi19OwotCi0jZW5kaWYKLQogdm9pZCAqX19rbWFsbG9jX3RyYWNrX2NhbGxlcihzaXplX3Qgc2l6ZSwgZ2ZwX3QgZ2ZwZmxhZ3MsIHVuc2lnbmVkIGxvbmcgY2FsbGVyKQogewogCXN0cnVjdCBrbWVtX2NhY2hlICpzOwpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggNzhjZmEyOS4uMjY1N2FjYyAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC0yNzI0LDcgKzI3MjQsNiBAQAogc3RydWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnBhZ2Vfc3dhcF9pbmZvKHN0cnVjdCBwYWdlICpwYWdlKQogewogCXN3cF9lbnRyeV90IHN3YXAgPSB7IC52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSkgfTsKLQlCVUdfT04oIVBhZ2VTd2FwQ2FjaGUocGFnZSkpOwogCXJldHVybiBzd2FwX2luZm9bc3dwX3R5cGUoc3dhcCldOwogfQogCmRpZmYgLS1naXQgYS9tbS91c2VyY29weS5jIGIvbW0vdXNlcmNvcHkuYwppbmRleCBhM2NjMzA1Li4zYzhkYTBhIDEwMDY0NAotLS0gYS9tbS91c2VyY29weS5jCisrKyBiL21tL3VzZXJjb3B5LmMKQEAgLTEzNCwzMSArMTM0LDE2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY2hlY2tfaGVhcF9vYmplY3QoY29uc3Qgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG4sCi0JCQkJCSAgICBib29sIHRvX3VzZXIpCisvKiBDaGVja3MgZm9yIGFsbG9jcyB0aGF0IGFyZSBtYXJrZWQgaW4gc29tZSB3YXkgYXMgc3Bhbm5pbmcgbXVsdGlwbGUgcGFnZXMuICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNoZWNrX3BhZ2Vfc3Bhbihjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgbiwKKwkJCQkJICBzdHJ1Y3QgcGFnZSAqcGFnZSwgYm9vbCB0b191c2VyKQogewotCXN0cnVjdCBwYWdlICpwYWdlLCAqZW5kcGFnZTsKKyNpZmRlZiBDT05GSUdfSEFSREVORURfVVNFUkNPUFlfUEFHRVNQQU4KIAljb25zdCB2b2lkICplbmQgPSBwdHIgKyBuIC0gMTsKKwlzdHJ1Y3QgcGFnZSAqZW5kcGFnZTsKIAlib29sIGlzX3Jlc2VydmVkLCBpc19jbWE7CiAKIAkvKgotCSAqIFNvbWUgYXJjaGl0ZWN0dXJlcyAoYXJtNjQpIHJldHVybiB0cnVlIGZvciB2aXJ0X2FkZHJfdmFsaWQoKSBvbgotCSAqIHZtYWxsb2NlZCBhZGRyZXNzZXMuIFdvcmsgYXJvdW5kIHRoaXMgYnkgY2hlY2tpbmcgZm9yIHZtYWxsb2MKLQkgKiBmaXJzdC4KLQkgKi8KLQlpZiAoaXNfdm1hbGxvY19hZGRyKHB0cikpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKCF2aXJ0X2FkZHJfdmFsaWQocHRyKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwYWdlID0gdmlydF90b19oZWFkX3BhZ2UocHRyKTsKLQotCS8qIENoZWNrIHNsYWIgYWxsb2NhdG9yIGZvciBmbGFncyBhbmQgc2l6ZS4gKi8KLQlpZiAoUGFnZVNsYWIocGFnZSkpCi0JCXJldHVybiBfX2NoZWNrX2hlYXBfb2JqZWN0KHB0ciwgbiwgcGFnZSk7Ci0KLQkvKgogCSAqIFNvbWV0aW1lcyB0aGUga2VybmVsIGRhdGEgcmVnaW9ucyBhcmUgbm90IG1hcmtlZCBSZXNlcnZlZCAoc2VlCiAJICogY2hlY2sgYmVsb3cpLiBBbmQgc29tZXRpbWVzIFtfc2RhdGEsX2VkYXRhKSBkb2VzIG5vdCBjb3ZlcgogCSAqIHJvZGF0YSBhbmQvb3IgYnNzLCBzbyBjaGVjayBlYWNoIHJhbmdlIGV4cGxpY2l0bHkuCkBAIC0xODYsNyArMTcxLDcgQEAKIAkJICAgKCh1bnNpZ25lZCBsb25nKWVuZCAmICh1bnNpZ25lZCBsb25nKVBBR0VfTUFTSykpKQogCQlyZXR1cm4gTlVMTDsKIAotCS8qIEFsbG93IGlmIHN0YXJ0IGFuZCBlbmQgYXJlIGluc2lkZSB0aGUgc2FtZSBjb21wb3VuZCBwYWdlLiAqLworCS8qIEFsbG93IGlmIGZ1bGx5IGluc2lkZSB0aGUgc2FtZSBjb21wb3VuZCAoX19HRlBfQ09NUCkgcGFnZS4gKi8KIAllbmRwYWdlID0gdmlydF90b19oZWFkX3BhZ2UoZW5kKTsKIAlpZiAobGlrZWx5KGVuZHBhZ2UgPT0gcGFnZSkpCiAJCXJldHVybiBOVUxMOwpAQCAtMTk5LDIwICsxODQsNDcgQEAKIAlpc19yZXNlcnZlZCA9IFBhZ2VSZXNlcnZlZChwYWdlKTsKIAlpc19jbWEgPSBpc19taWdyYXRlX2NtYV9wYWdlKHBhZ2UpOwogCWlmICghaXNfcmVzZXJ2ZWQgJiYgIWlzX2NtYSkKLQkJZ290byByZWplY3Q7CisJCXJldHVybiAiPHNwYW5zIG11bHRpcGxlIHBhZ2VzPiI7CiAKIAlmb3IgKHB0ciArPSBQQUdFX1NJWkU7IHB0ciA8PSBlbmQ7IHB0ciArPSBQQUdFX1NJWkUpIHsKIAkJcGFnZSA9IHZpcnRfdG9faGVhZF9wYWdlKHB0cik7CiAJCWlmIChpc19yZXNlcnZlZCAmJiAhUGFnZVJlc2VydmVkKHBhZ2UpKQotCQkJZ290byByZWplY3Q7CisJCQlyZXR1cm4gIjxzcGFucyBSZXNlcnZlZCBhbmQgbm9uLVJlc2VydmVkIHBhZ2VzPiI7CiAJCWlmIChpc19jbWEgJiYgIWlzX21pZ3JhdGVfY21hX3BhZ2UocGFnZSkpCi0JCQlnb3RvIHJlamVjdDsKKwkJCXJldHVybiAiPHNwYW5zIENNQSBhbmQgbm9uLUNNQSBwYWdlcz4iOwogCX0KKyNlbmRpZgogCiAJcmV0dXJuIE5VTEw7Cit9CiAKLXJlamVjdDoKLQlyZXR1cm4gIjxzcGFucyBtdWx0aXBsZSBwYWdlcz4iOworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjaGVja19oZWFwX29iamVjdChjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgbiwKKwkJCQkJICAgIGJvb2wgdG9fdXNlcikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCS8qCisJICogU29tZSBhcmNoaXRlY3R1cmVzIChhcm02NCkgcmV0dXJuIHRydWUgZm9yIHZpcnRfYWRkcl92YWxpZCgpIG9uCisJICogdm1hbGxvY2VkIGFkZHJlc3Nlcy4gV29yayBhcm91bmQgdGhpcyBieSBjaGVja2luZyBmb3Igdm1hbGxvYworCSAqIGZpcnN0LgorCSAqCisJICogV2UgYWxzbyBuZWVkIHRvIGNoZWNrIGZvciBtb2R1bGUgYWRkcmVzc2VzIGV4cGxpY2l0bHkgc2luY2Ugd2UKKwkgKiBtYXkgY29weSBzdGF0aWMgZGF0YSBmcm9tIG1vZHVsZXMgdG8gdXNlcnNwYWNlCisJICovCisJaWYgKGlzX3ZtYWxsb2Nfb3JfbW9kdWxlX2FkZHIocHRyKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXZpcnRfYWRkcl92YWxpZChwdHIpKQorCQlyZXR1cm4gTlVMTDsKKworCXBhZ2UgPSB2aXJ0X3RvX2hlYWRfcGFnZShwdHIpOworCisJLyogQ2hlY2sgc2xhYiBhbGxvY2F0b3IgZm9yIGZsYWdzIGFuZCBzaXplLiAqLworCWlmIChQYWdlU2xhYihwYWdlKSkKKwkJcmV0dXJuIF9fY2hlY2tfaGVhcF9vYmplY3QocHRyLCBuLCBwYWdlKTsKKworCS8qIFZlcmlmeSBvYmplY3QgZG9lcyBub3QgaW5jb3JyZWN0bHkgc3BhbiBtdWx0aXBsZSBwYWdlcy4gKi8KKwlyZXR1cm4gY2hlY2tfcGFnZV9zcGFuKHB0ciwgbiwgcGFnZSwgdG9fdXNlcik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jCmluZGV4IDM3NGQ5NWQuLjBmZThiNzEgMTAwNjQ0Ci0tLSBhL21tL3Ztc2Nhbi5jCisrKyBiL21tL3Ztc2Nhbi5jCkBAIC0xNjY1LDcgKzE2NjUsNyBAQAogCiAJZm9yICh6aWQgPSBzYy0+cmVjbGFpbV9pZHg7IHppZCA+PSAwOyB6aWQtLSkgewogCQl6b25lID0gJnBnZGF0LT5ub2RlX3pvbmVzW3ppZF07Ci0JCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCisJCWlmICghbWFuYWdlZF96b25lKHpvbmUpKQogCQkJY29udGludWU7CiAKIAkJaWYgKHpvbmVfcGFnZV9zdGF0ZV9zbmFwc2hvdCh6b25lLCBOUl9aT05FX0xSVV9CQVNFICsKQEAgLTIwMzYsNyArMjAzNiw3IEBACiAJCXN0cnVjdCB6b25lICp6b25lID0gJnBnZGF0LT5ub2RlX3pvbmVzW3ppZF07CiAJCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmVfem9uZSwgYWN0aXZlX3pvbmU7CiAKLQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQljb250aW51ZTsKIAogCQlpbmFjdGl2ZV96b25lID0gem9uZV9wYWdlX3N0YXRlKHpvbmUsCkBAIC0yMTcxLDcgKzIxNzEsNyBAQAogCiAJCWZvciAoeiA9IDA7IHogPCBNQVhfTlJfWk9ORVM7IHorKykgewogCQkJc3RydWN0IHpvbmUgKnpvbmUgPSAmcGdkYXQtPm5vZGVfem9uZXNbel07Ci0JCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQkJY29udGludWU7CiAKIAkJCXRvdGFsX2hpZ2hfd21hcmsgKz0gaGlnaF93bWFya19wYWdlcyh6b25lKTsKQEAgLTIzMDMsMjMgKzIzMDMsNiBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19BUkNIX1dBTlRfQkFUQ0hFRF9VTk1BUF9UTEJfRkxVU0gKLXN0YXRpYyB2b2lkIGluaXRfdGxiX3ViYyh2b2lkKQotewotCS8qCi0JICogVGhpcyBkZWxpYmVyYXRlbHkgZG9lcyBub3QgY2xlYXIgdGhlIGNwdW1hc2sgYXMgaXQncyBleHBlbnNpdmUKLQkgKiBhbmQgdW5uZWNlc3NhcnkuIElmIHRoZXJlIGhhcHBlbnMgdG8gYmUgZGF0YSBpbiB0aGVyZSB0aGVuIHRoZQotCSAqIGZpcnN0IFNXQVBfQ0xVU1RFUl9NQVggcGFnZXMgd2lsbCBzZW5kIGFuIHVubmVjZXNzYXJ5IElQSSBhbmQKLQkgKiB0aGVuIHdpbGwgYmUgY2xlYXJlZC4KLQkgKi8KLQljdXJyZW50LT50bGJfdWJjLmZsdXNoX3JlcXVpcmVkID0gZmFsc2U7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGluaXRfdGxiX3ViYyh2b2lkKQotewotfQotI2VuZGlmIC8qIENPTkZJR19BUkNIX1dBTlRfQkFUQ0hFRF9VTk1BUF9UTEJfRkxVU0ggKi8KLQogLyoKICAqIFRoaXMgaXMgYSBiYXNpYyBwZXItbm9kZSBwYWdlIGZyZWVyLiAgVXNlZCBieSBib3RoIGtzd2FwZCBhbmQgZGlyZWN0IHJlY2xhaW0uCiAgKi8KQEAgLTIzNTUsOCArMjMzOCw2IEBACiAJc2Nhbl9hZGp1c3RlZCA9IChnbG9iYWxfcmVjbGFpbShzYykgJiYgIWN1cnJlbnRfaXNfa3N3YXBkKCkgJiYKIAkJCSBzYy0+cHJpb3JpdHkgPT0gREVGX1BSSU9SSVRZKTsKIAotCWluaXRfdGxiX3ViYygpOwotCiAJYmxrX3N0YXJ0X3BsdWcoJnBsdWcpOwogCXdoaWxlIChucltMUlVfSU5BQ1RJVkVfQU5PTl0gfHwgbnJbTFJVX0FDVElWRV9GSUxFXSB8fAogCQkJCQlucltMUlVfSU5BQ1RJVkVfRklMRV0pIHsKQEAgLTI1MTAsNyArMjQ5MSw3IEBACiAJLyogSWYgY29tcGFjdGlvbiB3b3VsZCBnbyBhaGVhZCBvciB0aGUgYWxsb2NhdGlvbiB3b3VsZCBzdWNjZWVkLCBzdG9wICovCiAJZm9yICh6ID0gMDsgeiA8PSBzYy0+cmVjbGFpbV9pZHg7IHorKykgewogCQlzdHJ1Y3Qgem9uZSAqem9uZSA9ICZwZ2RhdC0+bm9kZV96b25lc1t6XTsKLQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQljb250aW51ZTsKIAogCQlzd2l0Y2ggKGNvbXBhY3Rpb25fc3VpdGFibGUoem9uZSwgc2MtPm9yZGVyLCAwLCBzYy0+cmVjbGFpbV9pZHgpKSB7CkBAIC0yODQwLDcgKzI4MjEsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8PSBaT05FX05PUk1BTDsgaSsrKSB7CiAJCXpvbmUgPSAmcGdkYXQtPm5vZGVfem9uZXNbaV07Ci0JCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkgfHwKKwkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkgfHwKIAkJICAgIHBnZGF0X3JlY2xhaW1hYmxlX3BhZ2VzKHBnZGF0KSA9PSAwKQogCQkJY29udGludWU7CiAKQEAgLTMxNDEsNyArMzEyMiw3IEBACiAJZm9yIChpID0gMDsgaSA8PSBjbGFzc3pvbmVfaWR4OyBpKyspIHsKIAkJc3RydWN0IHpvbmUgKnpvbmUgPSBwZ2RhdC0+bm9kZV96b25lcyArIGk7CiAKLQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQljb250aW51ZTsKIAogCQlpZiAoIXpvbmVfYmFsYW5jZWQoem9uZSwgb3JkZXIsIGNsYXNzem9uZV9pZHgpKQpAQCAtMzE2OSw3ICszMTUwLDcgQEAKIAlzYy0+bnJfdG9fcmVjbGFpbSA9IDA7CiAJZm9yICh6ID0gMDsgeiA8PSBzYy0+cmVjbGFpbV9pZHg7IHorKykgewogCQl6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyB6OwotCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSkKIAkJCWNvbnRpbnVlOwogCiAJCXNjLT5ucl90b19yZWNsYWltICs9IG1heChoaWdoX3dtYXJrX3BhZ2VzKHpvbmUpLCBTV0FQX0NMVVNURVJfTUFYKTsKQEAgLTMyNDIsNyArMzIyMyw3IEBACiAJCWlmIChidWZmZXJfaGVhZHNfb3Zlcl9saW1pdCkgewogCQkJZm9yIChpID0gTUFYX05SX1pPTkVTIC0gMTsgaSA+PSAwOyBpLS0pIHsKIAkJCQl6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyBpOwotCQkJCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCisJCQkJaWYgKCFtYW5hZ2VkX3pvbmUoem9uZSkpCiAJCQkJCWNvbnRpbnVlOwogCiAJCQkJc2MucmVjbGFpbV9pZHggPSBpOwpAQCAtMzI2Miw3ICszMjQzLDcgQEAKIAkJICovCiAJCWZvciAoaSA9IGNsYXNzem9uZV9pZHg7IGkgPj0gMDsgaS0tKSB7CiAJCQl6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyBpOwotCQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJCWlmICghbWFuYWdlZF96b25lKHpvbmUpKQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAoem9uZV9iYWxhbmNlZCh6b25lLCBzYy5vcmRlciwgY2xhc3N6b25lX2lkeCkpCkBAIC0zNTA4LDcgKzM0ODksNyBAQAogCXBnX2RhdGFfdCAqcGdkYXQ7CiAJaW50IHo7CiAKLQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCWlmICghbWFuYWdlZF96b25lKHpvbmUpKQogCQlyZXR1cm47CiAKIAlpZiAoIWNwdXNldF96b25lX2FsbG93ZWQoem9uZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hBUkRXQUxMKSkKQEAgLTM1MjIsNyArMzUwMyw3IEBACiAJLyogT25seSB3YWtlIGtzd2FwZCBpZiBhbGwgem9uZXMgYXJlIHVuYmFsYW5jZWQgKi8KIAlmb3IgKHogPSAwOyB6IDw9IGNsYXNzem9uZV9pZHg7IHorKykgewogCQl6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyB6OwotCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQlpZiAoIW1hbmFnZWRfem9uZSh6b25lKSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmICh6b25lX2JhbGFuY2VkKHpvbmUsIG9yZGVyLCBjbGFzc3pvbmVfaWR4KSkKZGlmZiAtLWdpdCBhL21tL3dvcmtpbmdzZXQuYyBiL21tL3dvcmtpbmdzZXQuYwppbmRleCA2OTU1MWNmLi42MTc0NzVmIDEwMDY0NAotLS0gYS9tbS93b3JraW5nc2V0LmMKKysrIGIvbW0vd29ya2luZ3NldC5jCkBAIC00MTgsMjEgKzQxOCwxOSBAQAogCSAqIG5vIHBhZ2VzLCBzbyB3ZSBleHBlY3QgdG8gYmUgYWJsZSB0byByZW1vdmUgdGhlbSBhbGwgYW5kCiAJICogZGVsZXRlIGFuZCBmcmVlIHRoZSBlbXB0eSBub2RlIGFmdGVyd2FyZHMuCiAJICovCi0KLQlCVUdfT04oIW5vZGUtPmNvdW50KTsKLQlCVUdfT04obm9kZS0+Y291bnQgJiBSQURJWF9UUkVFX0NPVU5UX01BU0spOworCUJVR19PTighd29ya2luZ3NldF9ub2RlX3NoYWRvd3Mobm9kZSkpOworCUJVR19PTih3b3JraW5nc2V0X25vZGVfcGFnZXMobm9kZSkpOwogCiAJZm9yIChpID0gMDsgaSA8IFJBRElYX1RSRUVfTUFQX1NJWkU7IGkrKykgewogCQlpZiAobm9kZS0+c2xvdHNbaV0pIHsKIAkJCUJVR19PTighcmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShub2RlLT5zbG90c1tpXSkpOwogCQkJbm9kZS0+c2xvdHNbaV0gPSBOVUxMOwotCQkJQlVHX09OKG5vZGUtPmNvdW50IDwgKDFVIDw8IFJBRElYX1RSRUVfQ09VTlRfU0hJRlQpKTsKLQkJCW5vZGUtPmNvdW50IC09IDFVIDw8IFJBRElYX1RSRUVfQ09VTlRfU0hJRlQ7CisJCQl3b3JraW5nc2V0X25vZGVfc2hhZG93c19kZWMobm9kZSk7CiAJCQlCVUdfT04oIW1hcHBpbmctPm5yZXhjZXB0aW9uYWwpOwogCQkJbWFwcGluZy0+bnJleGNlcHRpb25hbC0tOwogCQl9CiAJfQotCUJVR19PTihub2RlLT5jb3VudCk7CisJQlVHX09OKHdvcmtpbmdzZXRfbm9kZV9zaGFkb3dzKG5vZGUpKTsKIAlpbmNfbm9kZV9zdGF0ZShwYWdlX3BnZGF0KHZpcnRfdG9fcGFnZShub2RlKSksIFdPUktJTkdTRVRfTk9ERVJFQ0xBSU0pOwogCWlmICghX19yYWRpeF90cmVlX2RlbGV0ZV9ub2RlKCZtYXBwaW5nLT5wYWdlX3RyZWUsIG5vZGUpKQogCQlCVUcoKTsKZGlmZiAtLWdpdCBhL25ldC82bG93cGFuL25kaXNjLmMgYi9uZXQvNmxvd3Bhbi9uZGlzYy5jCmluZGV4IDg2NDUwYjcuLjk0MWRmMmYgMTAwNjQ0Ci0tLSBhL25ldC82bG93cGFuL25kaXNjLmMKKysrIGIvbmV0LzZsb3dwYW4vbmRpc2MuYwpAQCAtMTAxLDggKzEwMSw2IEBACiAJCWllZWU4MDIxNTRfYmUxNl90b19sZTE2KCZuZWlnaC0+c2hvcnRfYWRkciwgbGxhZGRyX3Nob3J0KTsKIAkJaWYgKCFsb3dwYW5fODAyMTU0X2lzX3ZhbGlkX3NyY19zaG9ydF9hZGRyKG5laWdoLT5zaG9ydF9hZGRyKSkKIAkJCW5laWdoLT5zaG9ydF9hZGRyID0gY3B1X3RvX2xlMTYoSUVFRTgwMjE1NF9BRERSX1NIT1JUX1VOU1BFQyk7Ci0JfSBlbHNlIHsKLQkJbmVpZ2gtPnNob3J0X2FkZHIgPSBjcHVfdG9fbGUxNihJRUVFODAyMTU0X0FERFJfU0hPUlRfVU5TUEVDKTsKIAl9CiAJd3JpdGVfdW5sb2NrX2JoKCZuLT5sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9LY29uZmlnIGIvbmV0L0tjb25maWcKaW5kZXggYzJjZGJjZS4uN2I2Y2QzNCAxMDA2NDQKLS0tIGEvbmV0L0tjb25maWcKKysrIGIvbmV0L0tjb25maWcKQEAgLTM2OSw2ICszNjksNyBAQAogc291cmNlICJuZXQvYmx1ZXRvb3RoL0tjb25maWciCiBzb3VyY2UgIm5ldC9yeHJwYy9LY29uZmlnIgogc291cmNlICJuZXQva2NtL0tjb25maWciCitzb3VyY2UgIm5ldC9zdHJwYXJzZXIvS2NvbmZpZyIKIAogY29uZmlnIEZJQl9SVUxFUwogCWJvb2wKZGlmZiAtLWdpdCBhL25ldC9NYWtlZmlsZSBiL25ldC9NYWtlZmlsZQppbmRleCA5YmQyMGJiLi40Y2FmYWEyIDEwMDY0NAotLS0gYS9uZXQvTWFrZWZpbGUKKysrIGIvbmV0L01ha2VmaWxlCkBAIC0zNSw2ICszNSw3IEBACiBvYmotJChDT05GSUdfU1VOUlBDKQkJKz0gc3VucnBjLwogb2JqLSQoQ09ORklHX0FGX1JYUlBDKQkJKz0gcnhycGMvCiBvYmotJChDT05GSUdfQUZfS0NNKQkJKz0ga2NtLworb2JqLSQoQ09ORklHX1NUUkVBTV9QQVJTRVIpCSs9IHN0cnBhcnNlci8KIG9iai0kKENPTkZJR19BVE0pCQkrPSBhdG0vCiBvYmotJChDT05GSUdfTDJUUCkJCSs9IGwydHAvCiBvYmotJChDT05GSUdfREVDTkVUKQkJKz0gZGVjbmV0LwpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9kZHAuYyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKaW5kZXggZjA2Njc4MS4uMTBkMmJkYyAxMDA2NDQKLS0tIGEvbmV0L2FwcGxldGFsay9kZHAuYworKysgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCkBAIC0xMjc4LDcgKzEyNzgsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUEREUCkgfHwgZGVmaW5lZChDT05GSUdfSVBERFBfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQRERQKQogc3RhdGljIF9faW5saW5lX18gaW50IGlzX2lwX292ZXJfZGRwKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIHNrYi0+ZGF0YVsxMl0gPT0gMjI7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2xlYy5jIGIvbmV0L2F0bS9sZWMuYwppbmRleCBlNTc0YTdlLi41ZDI2OTM4IDEwMDY0NAotLS0gYS9uZXQvYXRtL2xlYy5jCisrKyBiL25ldC9hdG0vbGVjLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdG1sZWMuaD4KIAogLyogUHJveHkgTEVDIGtub3dzIGFib3V0IGJyaWRnaW5nICovCi0jaWYgZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR19CUklER0VfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0JSSURHRSkKICNpbmNsdWRlICIuLi9icmlkZ2UvYnJfcHJpdmF0ZS5oIgogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBicmlkZ2VfdWxhX2xlY1tdID0geyAweDAxLCAweDgwLCAweGMyLCAweDAwLCAweDAwIH07CkBAIC0xMjEsNyArMTIxLDcgQEAKIC8qIERldmljZSBzdHJ1Y3R1cmVzICovCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9sZWNbTUFYX0xFQ19JVEZdOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR19CUklER0VfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0JSSURHRSkKIHN0YXRpYyB2b2lkIGxlY19oYW5kbGVfYnJpZGdlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJY2hhciAqYnVmZjsKQEAgLTE1NSw3ICsxNTUsNyBAQAogCQlzay0+c2tfZGF0YV9yZWFkeShzayk7CiAJfQogfQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfQlJJREdFX01PRFVMRSkgKi8KKyNlbmRpZiAvKiBJU19FTkFCTEVEKENPTkZJR19CUklER0UpICovCiAKIC8qCiAgKiBPcGVuL2luaXRpYWxpemUgdGhlIG5ldGRldmljZS4gVGhpcyBpcyBjYWxsZWQgKGluIHRoZSBjdXJyZW50IGtlcm5lbCkKQEAgLTIyMiw3ICsyMjIsNyBAQAogCXByX2RlYnVnKCJza2J1ZmYgaGVhZDolbHggZGF0YTolbHggdGFpbDolbHggZW5kOiVseFxuIiwKIAkJIChsb25nKXNrYi0+aGVhZCwgKGxvbmcpc2tiLT5kYXRhLCAobG9uZylza2JfdGFpbF9wb2ludGVyKHNrYiksCiAJCSAobG9uZylza2JfZW5kX3BvaW50ZXIoc2tiKSk7Ci0jaWYgZGVmaW5lZChDT05GSUdfQlJJREdFKSB8fCBkZWZpbmVkKENPTkZJR19CUklER0VfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0JSSURHRSkKIAlpZiAobWVtY21wKHNrYi0+ZGF0YSwgYnJpZGdlX3VsYV9sZWMsIHNpemVvZihicmlkZ2VfdWxhX2xlYykpID09IDApCiAJCWxlY19oYW5kbGVfYnJpZGdlKHNrYiwgZGV2KTsKICNlbmRpZgpAQCAtNDI2LDcgKzQyNiw3IEBACiAJCSAgICAodW5zaWduZWQgc2hvcnQpKDB4ZmZmZiAmIG1lc2ctPmNvbnRlbnQubm9ybWFsLmZsYWcpOwogCQlicmVhazsKIAljYXNlIGxfc2hvdWxkX2JyaWRnZToKLSNpZiBkZWZpbmVkKENPTkZJR19CUklER0UpIHx8IGRlZmluZWQoQ09ORklHX0JSSURHRV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQlJJREdFKQogCXsKIAkJcHJfZGVidWcoIiVzOiBicmlkZ2UgemVwcGVsaW4gYXNrcyBhYm91dCAlcE1cbiIsCiAJCQkgZGV2LT5uYW1lLCBtZXNnLT5jb250ZW50LnByb3h5Lm1hY19hZGRyKTsKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCQkJc2stPnNrX2RhdGFfcmVhZHkoc2spOwogCQl9CiAJfQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0JSSURHRSkgfHwgZGVmaW5lZChDT05GSUdfQlJJREdFX01PRFVMRSkgKi8KKyNlbmRpZiAvKiBJU19FTkFCTEVEKENPTkZJR19CUklER0UpICovCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2luZm8oIiVzOiBVbmtub3duIG1lc3NhZ2UgdHlwZSAlZFxuIiwgZGV2LT5uYW1lLCBtZXNnLT50eXBlKTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vbXBjLmMgYi9uZXQvYXRtL21wYy5jCmluZGV4IDBlOTgyMjIuLjNiM2IxYTIgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vbXBjLmMKKysrIGIvbmV0L2F0bS9tcGMuYwpAQCAtMTAwNyw3ICsxMDA3LDcgQEAKIAlpZiAoIW5ldF9lcShkZXZfbmV0KGRldiksICZpbml0X25ldCkpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAotCWlmIChkZXYtPm5hbWUgPT0gTlVMTCB8fCBzdHJuY21wKGRldi0+bmFtZSwgImxlYyIsIDMpKQorCWlmIChzdHJuY21wKGRldi0+bmFtZSwgImxlYyIsIDMpKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7IC8qIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gbGVjOnMgKi8KIAogCXN3aXRjaCAoZXZlbnQpIHsKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L0tjb25maWcgYi9uZXQvYmF0bWFuLWFkdi9LY29uZmlnCmluZGV4IDgzM2JiMTQuLmYyMDc0MmMgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L0tjb25maWcKKysrIGIvbmV0L2JhdG1hbi1hZHYvS2NvbmZpZwpAQCAtNzMsMTAgKzczLDIxIEBACiAJICByZWR1Y2UgdGhlIGFpciBvdmVyaGVhZCB3aGlsZSBpbXByb3ZpbmcgdGhlIHJlbGlhYmlsaXR5IG9mCiAJICBtdWx0aWNhc3QgbWVzc2FnZXMuCiAKLWNvbmZpZyBCQVRNQU5fQURWX0RFQlVHCi0JYm9vbCAiQi5BLlQuTS5BLk4uIGRlYnVnZ2luZyIKK2NvbmZpZyBCQVRNQU5fQURWX0RFQlVHRlMKKwlib29sICJiYXRtYW4tYWR2IGRlYnVnZnMgZW50cmllcyIKIAlkZXBlbmRzIG9uIEJBVE1BTl9BRFYKIAlkZXBlbmRzIG9uIERFQlVHX0ZTCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gZXhwb3J0IHJvdXRpbmcgcmVsYXRlZCBkZWJ1ZyB0YWJsZXMgdmlhIGRlYnVnZnMuCisJICBUaGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggc29mdC1pbnRlcmZhY2UgYW5kIHVzZWQgaGFyZC1pbnRlcmZhY2UgY2FuIGJlCisJICBmb3VuZCB1bmRlciBiYXRtYW5fYWR2LworCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgQkFUTUFOX0FEVl9ERUJVRworCWJvb2wgIkIuQS5ULk0uQS5OLiBkZWJ1Z2dpbmciCisJZGVwZW5kcyBvbiBCQVRNQU5fQURWX0RFQlVHRlMKIAloZWxwCiAJICBUaGlzIGlzIGFuIG9wdGlvbiBmb3IgdXNlIGJ5IGRldmVsb3BlcnM7IG1vc3QgcGVvcGxlIHNob3VsZAogCSAgc2F5IE4gaGVyZS4gVGhpcyBlbmFibGVzIGNvbXBpbGF0aW9uIG9mIHN1cHBvcnQgZm9yCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9NYWtlZmlsZSBiL25ldC9iYXRtYW4tYWR2L01ha2VmaWxlCmluZGV4IGE4M2ZjNmMuLmY3MjRkM2MgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L01ha2VmaWxlCisrKyBiL25ldC9iYXRtYW4tYWR2L01ha2VmaWxlCkBAIC0yNCwxNCArMjQsMTQgQEAKIGJhdG1hbi1hZHYtJChDT05GSUdfQkFUTUFOX0FEVl9CQVRNQU5fVikgKz0gYmF0X3Zfb2dtLm8KIGJhdG1hbi1hZHYteSArPSBiaXRhcnJheS5vCiBiYXRtYW4tYWR2LSQoQ09ORklHX0JBVE1BTl9BRFZfQkxBKSArPSBicmlkZ2VfbG9vcF9hdm9pZGFuY2UubwotYmF0bWFuLWFkdi0kKENPTkZJR19ERUJVR19GUykgKz0gZGVidWdmcy5vCitiYXRtYW4tYWR2LSQoQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUykgKz0gZGVidWdmcy5vCiBiYXRtYW4tYWR2LSQoQ09ORklHX0JBVE1BTl9BRFZfREFUKSArPSBkaXN0cmlidXRlZC1hcnAtdGFibGUubwogYmF0bWFuLWFkdi15ICs9IGZyYWdtZW50YXRpb24ubwogYmF0bWFuLWFkdi15ICs9IGdhdGV3YXlfY2xpZW50Lm8KIGJhdG1hbi1hZHYteSArPSBnYXRld2F5X2NvbW1vbi5vCiBiYXRtYW4tYWR2LXkgKz0gaGFyZC1pbnRlcmZhY2UubwogYmF0bWFuLWFkdi15ICs9IGhhc2gubwotYmF0bWFuLWFkdi15ICs9IGljbXBfc29ja2V0Lm8KK2JhdG1hbi1hZHYtJChDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTKSArPSBpY21wX3NvY2tldC5vCiBiYXRtYW4tYWR2LSQoQ09ORklHX0JBVE1BTl9BRFZfREVCVUcpICs9IGxvZy5vCiBiYXRtYW4tYWR2LXkgKz0gbWFpbi5vCiBiYXRtYW4tYWR2LSQoQ09ORklHX0JBVE1BTl9BRFZfTUNBU1QpICs9IG11bHRpY2FzdC5vCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9iYXRfYWxnby5jIGIvbmV0L2JhdG1hbi1hZHYvYmF0X2FsZ28uYwppbmRleCA4MWRiYmY1Li42MjNkMDQzIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9iYXRfYWxnby5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2JhdF9hbGdvLmMKQEAgLTIwLDEyICsyMCwxOCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9iYXRtYW5fYWR2Lmg+CiAKICNpbmNsdWRlICJiYXRfYWxnby5oIgorI2luY2x1ZGUgIm5ldGxpbmsuaCIKIAogY2hhciBiYXRhZHZfcm91dGluZ19hbGdvWzIwXSA9ICJCQVRNQU5fSVYiOwogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGJhdGFkdl9hbGdvX2xpc3Q7CkBAIC05NSw2ICsxMDEsNyBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogaW50IGJhdGFkdl9hbGdvX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7CiAJc3RydWN0IGJhdGFkdl9hbGdvX29wcyAqYmF0X2FsZ29fb3BzOwpAQCAtMTA3LDYgKzExNCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiBzdGF0aWMgaW50IGJhdGFkdl9wYXJhbV9zZXRfcmEoY29uc3QgY2hhciAqdmFsLCBjb25zdCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKIHsKQEAgLTEzOCwzICsxNDYsNjUgQEAKIAogbW9kdWxlX3BhcmFtX2NiKHJvdXRpbmdfYWxnbywgJmJhdGFkdl9wYXJhbV9vcHNfcmEsICZiYXRhZHZfcGFyYW1fc3RyaW5nX3JhLAogCQkwNjQ0KTsKKworLyoqCisgKiBiYXRhZHZfYWxnb19kdW1wX2VudHJ5IC0gZmlsbCBpbiBpbmZvcm1hdGlvbiBhYm91dCBvbmUgc3VwcG9ydGVkIHJvdXRpbmcKKyAqICBhbGdvcml0aG0KKyAqIEBtc2c6IG5ldGxpbmsgbWVzc2FnZSB0byBiZSBzZW50IGJhY2sKKyAqIEBwb3J0aWQ6IFBvcnQgdG8gcmVwbHkgdG8KKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBtZXNzYWdlCisgKiBAYmF0X2FsZ29fb3BzOiBBbGdvcml0aG0gdG8gYmUgZHVtcGVkCisgKgorICogUmV0dXJuOiBFcnJvciBudW1iZXIsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGJhdGFkdl9hbGdvX2R1bXBfZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCQkgIHN0cnVjdCBiYXRhZHZfYWxnb19vcHMgKmJhdF9hbGdvX29wcykKK3sKKwl2b2lkICpoZHI7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LAorCQkJICBOTE1fRl9NVUxUSSwgQkFUQURWX0NNRF9HRVRfUk9VVElOR19BTEdPUyk7CisJaWYgKCFoZHIpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlpZiAobmxhX3B1dF9zdHJpbmcobXNnLCBCQVRBRFZfQVRUUl9BTEdPX05BTUUsIGJhdF9hbGdvX29wcy0+bmFtZSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldHVybiAwOworCisgbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCisvKioKKyAqIGJhdGFkdl9hbGdvX2R1bXAgLSBmaWxsIGluIGluZm9ybWF0aW9uIGFib3V0IHN1cHBvcnRlZCByb3V0aW5nCisgKiAgYWxnb3JpdGhtcworICogQG1zZzogbmV0bGluayBtZXNzYWdlIHRvIGJlIHNlbnQgYmFjaworICogQGNiOiBQYXJhbWV0ZXJzIHRvIHRoZSBuZXRsaW5rIHJlcXVlc3QKKyAqCisgKiBSZXR1cm46IExlbmd0aCBvZiByZXBseSBtZXNzYWdlLgorICovCitpbnQgYmF0YWR2X2FsZ29fZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCXN0cnVjdCBiYXRhZHZfYWxnb19vcHMgKmJhdF9hbGdvX29wczsKKwlpbnQgc2tpcCA9IGNiLT5hcmdzWzBdOworCWludCBpID0gMDsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGJhdF9hbGdvX29wcywgJmJhdGFkdl9hbGdvX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGkrKyA8IHNraXApCisJCQljb250aW51ZTsKKworCQlpZiAoYmF0YWR2X2FsZ29fZHVtcF9lbnRyeShtc2csIHBvcnRpZCwgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkgICBiYXRfYWxnb19vcHMpKSB7CisJCQlpLS07CisJCQlicmVhazsKKwkJfQorCX0KKworCWNiLT5hcmdzWzBdID0gaTsKKworCXJldHVybiBtc2ctPmxlbjsKK30KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2JhdF9hbGdvLmggYi9uZXQvYmF0bWFuLWFkdi9iYXRfYWxnby5oCmluZGV4IDg2MGQ3NzMuLjNiNWI2OWMgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2JhdF9hbGdvLmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvYmF0X2FsZ28uaApAQCAtMjIsNyArMjIsOSBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAorc3RydWN0IG5ldGxpbmtfY2FsbGJhY2s7CiBzdHJ1Y3Qgc2VxX2ZpbGU7CitzdHJ1Y3Qgc2tfYnVmZjsKIAogZXh0ZXJuIGNoYXIgYmF0YWR2X3JvdXRpbmdfYWxnb1tdOwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYmF0YWR2X2hhcmRpZl9saXN0OwpAQCAtMzEsNSArMzMsNiBAQAogaW50IGJhdGFkdl9hbGdvX3JlZ2lzdGVyKHN0cnVjdCBiYXRhZHZfYWxnb19vcHMgKmJhdF9hbGdvX29wcyk7CiBpbnQgYmF0YWR2X2FsZ29fc2VsZWN0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsIGNoYXIgKm5hbWUpOwogaW50IGJhdGFkdl9hbGdvX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOworaW50IGJhdGFkdl9hbGdvX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIAogI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9CQVRfQUxHT19IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYmF0X2l2X29nbS5jIGIvbmV0L2JhdG1hbi1hZHYvYmF0X2l2X29nbS5jCmluZGV4IDE5YjBhYmQuLmUyZDE4ZDAgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2JhdF9pdl9vZ20uYworKysgYi9uZXQvYmF0bWFuLWFkdi9iYXRfaXZfb2dtLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9wa3Rfc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KQEAgLTQ4LDEyICs0OSwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9iYXRtYW5fYWR2Lmg+CiAKICNpbmNsdWRlICJiYXRfYWxnby5oIgogI2luY2x1ZGUgImJpdGFycmF5LmgiCisjaW5jbHVkZSAiZ2F0ZXdheV9jbGllbnQuaCIKICNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgogI2luY2x1ZGUgImhhc2guaCIKICNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJuZXRsaW5rLmgiCiAjaW5jbHVkZSAibmV0d29yay1jb2RpbmcuaCIKICNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCiAjaW5jbHVkZSAicGFja2V0LmgiCkBAIC0zMTgsMTcgKzMyNCwxOCBAQAogCWlmICghb3JpZ19ub2RlLT5iYXRfaXYuYmNhc3Rfb3duX3N1bSkKIAkJZ290byBmcmVlX29yaWdfbm9kZTsKIAorCWtyZWZfZ2V0KCZvcmlnX25vZGUtPnJlZmNvdW50KTsKIAloYXNoX2FkZGVkID0gYmF0YWR2X2hhc2hfYWRkKGJhdF9wcml2LT5vcmlnX2hhc2gsIGJhdGFkdl9jb21wYXJlX29yaWcsCiAJCQkJICAgICBiYXRhZHZfY2hvb3NlX29yaWcsIG9yaWdfbm9kZSwKIAkJCQkgICAgICZvcmlnX25vZGUtPmhhc2hfZW50cnkpOwogCWlmIChoYXNoX2FkZGVkICE9IDApCi0JCWdvdG8gZnJlZV9vcmlnX25vZGU7CisJCWdvdG8gZnJlZV9vcmlnX25vZGVfaGFzaDsKIAogCXJldHVybiBvcmlnX25vZGU7CiAKLWZyZWVfb3JpZ19ub2RlOgotCS8qIGZyZWUgdHdpY2UsIGFzIGJhdGFkdl9vcmlnX25vZGVfbmV3IHNldHMgcmVmY291bnQgdG8gMiAqLworZnJlZV9vcmlnX25vZGVfaGFzaDoKIAliYXRhZHZfb3JpZ19ub2RlX3B1dChvcmlnX25vZGUpOworZnJlZV9vcmlnX25vZGU6CiAJYmF0YWR2X29yaWdfbm9kZV9wdXQob3JpZ19ub2RlKTsKIAogCXJldHVybiBOVUxMOwpAQCAtNTI4LDM2ICs1MzUsMjUgQEAKIHN0YXRpYyB2b2lkIGJhdGFkdl9pdl9vZ21fZW1pdChzdHJ1Y3QgYmF0YWR2X2ZvcndfcGFja2V0ICpmb3J3X3BhY2tldCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKLQlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2OwotCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiA9IE5VTEw7CiAKIAlpZiAoIWZvcndfcGFja2V0LT5pZl9pbmNvbWluZykgewogCQlwcl9lcnIoIkVycm9yIC0gY2FuJ3QgZm9yd2FyZCBwYWNrZXQ6IGluY29taW5nIGlmYWNlIG5vdCBzcGVjaWZpZWRcbiIpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCX0KIAogCXNvZnRfaWZhY2UgPSBmb3J3X3BhY2tldC0+aWZfaW5jb21pbmctPnNvZnRfaWZhY2U7Ci0JYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKIAogCWlmIChXQVJOX09OKCFmb3J3X3BhY2tldC0+aWZfb3V0Z29pbmcpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJaWYgKFdBUk5fT04oZm9yd19wYWNrZXQtPmlmX291dGdvaW5nLT5zb2Z0X2lmYWNlICE9IHNvZnRfaWZhY2UpKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJaWYgKGZvcndfcGFja2V0LT5pZl9pbmNvbWluZy0+aWZfc3RhdHVzICE9IEJBVEFEVl9JRl9BQ1RJVkUpCi0JCWdvdG8gb3V0OwotCi0JcHJpbWFyeV9pZiA9IGJhdGFkdl9wcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7Ci0JaWYgKCFwcmltYXJ5X2lmKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJLyogb25seSBmb3Igb25lIHNwZWNpZmljIG91dGdvaW5nIGludGVyZmFjZSAqLwogCWJhdGFkdl9pdl9vZ21fc2VuZF90b19pZihmb3J3X3BhY2tldCwgZm9yd19wYWNrZXQtPmlmX291dGdvaW5nKTsKLQotb3V0OgotCWlmIChwcmltYXJ5X2lmKQotCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKIH0KIAogLyoqCkBAIC02ODUsMTkgKzY4MSwxMiBAQAogCXN0cnVjdCBiYXRhZHZfZm9yd19wYWNrZXQgKmZvcndfcGFja2V0X2FnZ3I7CiAJdW5zaWduZWQgY2hhciAqc2tiX2J1ZmY7CiAJdW5zaWduZWQgaW50IHNrYl9zaXplOworCWF0b21pY190ICpxdWV1ZV9sZWZ0ID0gb3duX3BhY2tldCA/IE5VTEwgOiAmYmF0X3ByaXYtPmJhdG1hbl9xdWV1ZV9sZWZ0OwogCi0JLyogb3duIHBhY2tldCBzaG91bGQgYWx3YXlzIGJlIHNjaGVkdWxlZCAqLwotCWlmICghb3duX3BhY2tldCkgewotCQlpZiAoIWJhdGFkdl9hdG9taWNfZGVjX25vdF96ZXJvKCZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQpKSB7Ci0JCQliYXRhZHZfZGJnKEJBVEFEVl9EQkdfQkFUTUFOLCBiYXRfcHJpdiwKLQkJCQkgICAiYmF0bWFuIHBhY2tldCBxdWV1ZSBmdWxsXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWZvcndfcGFja2V0X2FnZ3IgPSBrbWFsbG9jKHNpemVvZigqZm9yd19wYWNrZXRfYWdnciksIEdGUF9BVE9NSUMpOworCWZvcndfcGFja2V0X2FnZ3IgPSBiYXRhZHZfZm9yd19wYWNrZXRfYWxsb2MoaWZfaW5jb21pbmcsIGlmX291dGdvaW5nLAorCQkJCQkJICAgIHF1ZXVlX2xlZnQsIGJhdF9wcml2KTsKIAlpZiAoIWZvcndfcGFja2V0X2FnZ3IpCi0JCWdvdG8gb3V0X25vbWVtOworCQlyZXR1cm47CiAKIAlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5hZ2dyZWdhdGVkX29nbXMpICYmCiAJICAgIHBhY2tldF9sZW4gPCBCQVRBRFZfTUFYX0FHR1JFR0FUSU9OX0JZVEVTKQpAQCAtNzA4LDggKzY5NywxMSBAQAogCXNrYl9zaXplICs9IEVUSF9ITEVOOwogCiAJZm9yd19wYWNrZXRfYWdnci0+c2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihOVUxMLCBza2Jfc2l6ZSk7Ci0JaWYgKCFmb3J3X3BhY2tldF9hZ2dyLT5za2IpCi0JCWdvdG8gb3V0X2ZyZWVfZm9yd19wYWNrZXQ7CisJaWYgKCFmb3J3X3BhY2tldF9hZ2dyLT5za2IpIHsKKwkJYmF0YWR2X2ZvcndfcGFja2V0X2ZyZWUoZm9yd19wYWNrZXRfYWdncik7CisJCXJldHVybjsKKwl9CisKIAlmb3J3X3BhY2tldF9hZ2dyLT5za2ItPnByaW9yaXR5ID0gVENfUFJJT19DT05UUk9MOwogCXNrYl9yZXNlcnZlKGZvcndfcGFja2V0X2FnZ3ItPnNrYiwgRVRIX0hMRU4pOwogCkBAIC03MTcsMTIgKzcwOSw3IEBACiAJZm9yd19wYWNrZXRfYWdnci0+cGFja2V0X2xlbiA9IHBhY2tldF9sZW47CiAJbWVtY3B5KHNrYl9idWZmLCBwYWNrZXRfYnVmZiwgcGFja2V0X2xlbik7CiAKLQlrcmVmX2dldCgmaWZfaW5jb21pbmctPnJlZmNvdW50KTsKLQlrcmVmX2dldCgmaWZfb3V0Z29pbmctPnJlZmNvdW50KTsKIAlmb3J3X3BhY2tldF9hZ2dyLT5vd24gPSBvd25fcGFja2V0OwotCWZvcndfcGFja2V0X2FnZ3ItPmlmX2luY29taW5nID0gaWZfaW5jb21pbmc7Ci0JZm9yd19wYWNrZXRfYWdnci0+aWZfb3V0Z29pbmcgPSBpZl9vdXRnb2luZzsKLQlmb3J3X3BhY2tldF9hZ2dyLT5udW1fcGFja2V0cyA9IDA7CiAJZm9yd19wYWNrZXRfYWdnci0+ZGlyZWN0X2xpbmtfZmxhZ3MgPSBCQVRBRFZfTk9fRkxBR1M7CiAJZm9yd19wYWNrZXRfYWdnci0+c2VuZF90aW1lID0gc2VuZF90aW1lOwogCkBAIC03NDEsMTMgKzcyOCw2IEBACiAJcXVldWVfZGVsYXllZF93b3JrKGJhdGFkdl9ldmVudF93b3JrcXVldWUsCiAJCQkgICAmZm9yd19wYWNrZXRfYWdnci0+ZGVsYXllZF93b3JrLAogCQkJICAgc2VuZF90aW1lIC0gamlmZmllcyk7Ci0KLQlyZXR1cm47Ci1vdXRfZnJlZV9mb3J3X3BhY2tldDoKLQlrZnJlZShmb3J3X3BhY2tldF9hZ2dyKTsKLW91dF9ub21lbToKLQlpZiAoIW93bl9wYWNrZXQpCi0JCWF0b21pY19pbmMoJmJhdF9wcml2LT5iYXRtYW5fcXVldWVfbGVmdCk7CiB9CiAKIC8qIGFnZ3JlZ2F0ZSBhIG5ldyBwYWNrZXQgaW50byB0aGUgZXhpc3Rpbmcgb2dtIHBhY2tldCAqLwpAQCAtMTgzMCwxMCArMTgxMCw2IEBACiAJCWJhdGFkdl9pdl9vZ21fc2NoZWR1bGUoZm9yd19wYWNrZXQtPmlmX2luY29taW5nKTsKIAogb3V0OgotCS8qIGRvbid0IGNvdW50IG93biBwYWNrZXQgKi8KLQlpZiAoIWZvcndfcGFja2V0LT5vd24pCi0JCWF0b21pY19pbmMoJmJhdF9wcml2LT5iYXRtYW5fcXVldWVfbGVmdCk7Ci0KIAliYXRhZHZfZm9yd19wYWNrZXRfZnJlZShmb3J3X3BhY2tldCk7CiB9CiAKQEAgLTE4NzksNiArMTg1NSw3IEBACiAJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogLyoqCiAgKiBiYXRhZHZfaXZfb2dtX29yaWdfcHJpbnRfbmVpZ2ggLSBwcmludCBuZWlnaGJvcnMgZm9yIHRoZSBvcmlnaW5hdG9yIHRhYmxlCiAgKiBAb3JpZ19ub2RlOiB0aGUgb3JpZ19ub2RlIGZvciB3aGljaCB0aGUgbmVpZ2hib3JzIGFyZSBwcmludGVkCkBAIC0xOTc2LDggKzE5NTMsMjM5IEBACiAJaWYgKGJhdG1hbl9jb3VudCA9PSAwKQogCQlzZXFfcHV0cyhzZXEsICJObyBiYXRtYW4gbm9kZXMgaW4gcmFuZ2UgLi4uXG4iKTsKIH0KKyNlbmRpZgogCiAvKioKKyAqIGJhdGFkdl9pdl9vZ21fbmVpZ2hfZ2V0X3RxX2F2ZyAtIEdldCB0aGUgVFEgYXZlcmFnZSBmb3IgYSBuZWlnaGJvdXIgb24gYQorICogIGdpdmVuIG91dGdvaW5nIGludGVyZmFjZS4KKyAqIEBuZWlnaF9ub2RlOiBOZWlnaGJvdXIgb2YgaW50ZXJlc3QKKyAqIEBpZl9vdXRnb2luZzogT3V0Z29pbmcgaW50ZXJmYWNlIG9mIGludGVyZXN0CisgKiBAdHFfYXZnOiBQb2ludGVyIG9mIHdoZXJlIHRvIHN0b3JlIHRoZSBUUSBhdmVyYWdlCisgKgorICogUmV0dXJuOiBGYWxzZSBpZiBubyBhdmVyYWdlIFRRIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHRydWUuCisgKi8KK3N0YXRpYyBib29sCitiYXRhZHZfaXZfb2dtX25laWdoX2dldF90cV9hdmcoc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaF9ub2RlLAorCQkJICAgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcsCisJCQkgICAgICAgdTggKnRxX2F2ZykKK3sKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqbl9pZmluZm87CisKKwluX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KG5laWdoX25vZGUsIGlmX291dGdvaW5nKTsKKwlpZiAoIW5faWZpbmZvKQorCQlyZXR1cm4gZmFsc2U7CisKKwkqdHFfYXZnID0gbl9pZmluZm8tPmJhdF9pdi50cV9hdmc7CisJYmF0YWR2X25laWdoX2lmaW5mb19wdXQobl9pZmluZm8pOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogYmF0YWR2X2l2X29nbV9vcmlnX2R1bXBfc3ViZW50cnkgLSBEdW1wIGFuIG9yaWdpbmF0b3Igc3ViZW50cnkgaW50byBhCisgKiAgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBpZl9vdXRnb2luZzogTGltaXQgZHVtcCB0byBlbnRyaWVzIHdpdGggdGhpcyBvdXRnb2luZyBpbnRlcmZhY2UKKyAqIEBvcmlnX25vZGU6IE9yaWdpbmF0b3IgdG8gZHVtcAorICogQG5laWdoX25vZGU6IFNpbmdsZSBob3BzIG5laWdoYm91cgorICogQGJlc3Q6IElzIHRoZSBiZXN0IG9yaWdpbmF0b3IKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfaXZfb2dtX29yaWdfZHVtcF9zdWJlbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJCSBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJCSBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nLAorCQkJCSBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlLAorCQkJCSBzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoX25vZGUsCisJCQkJIGJvb2wgYmVzdCkKK3sKKwl2b2lkICpoZHI7CisJdTggdHFfYXZnOworCXVuc2lnbmVkIGludCBsYXN0X3NlZW5fbXNlY3M7CisKKwlsYXN0X3NlZW5fbXNlY3MgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBvcmlnX25vZGUtPmxhc3Rfc2Vlbik7CisKKwlpZiAoIWJhdGFkdl9pdl9vZ21fbmVpZ2hfZ2V0X3RxX2F2ZyhuZWlnaF9ub2RlLCBpZl9vdXRnb2luZywgJnRxX2F2ZykpCisJCXJldHVybiAwOworCisJaWYgKGlmX291dGdvaW5nICE9IEJBVEFEVl9JRl9ERUZBVUxUICYmCisJICAgIGlmX291dGdvaW5nICE9IG5laWdoX25vZGUtPmlmX2luY29taW5nKQorCQlyZXR1cm4gMDsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksCisJCQkgIE5MTV9GX01VTFRJLCBCQVRBRFZfQ01EX0dFVF9PUklHSU5BVE9SUyk7CisJaWYgKCFoZHIpCisJCXJldHVybiAtRU5PQlVGUzsKKworCWlmIChubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfT1JJR19BRERSRVNTLCBFVEhfQUxFTiwKKwkJICAgIG9yaWdfbm9kZS0+b3JpZykgfHwKKwkgICAgbmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX05FSUdIX0FERFJFU1MsIEVUSF9BTEVOLAorCQkgICAgbmVpZ2hfbm9kZS0+YWRkcikgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9IQVJEX0lGSU5ERVgsCisJCQluZWlnaF9ub2RlLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+aWZpbmRleCkgfHwKKwkgICAgbmxhX3B1dF91OChtc2csIEJBVEFEVl9BVFRSX1RRLCB0cV9hdmcpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfTEFTVF9TRUVOX01TRUNTLAorCQkJbGFzdF9zZWVuX21zZWNzKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAoYmVzdCAmJiBubGFfcHV0X2ZsYWcobXNnLCBCQVRBRFZfQVRUUl9GTEFHX0JFU1QpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gMDsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyoqCisgKiBiYXRhZHZfaXZfb2dtX29yaWdfZHVtcF9lbnRyeSAtIER1bXAgYW4gb3JpZ2luYXRvciBlbnRyeSBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBpZl9vdXRnb2luZzogTGltaXQgZHVtcCB0byBlbnRyaWVzIHdpdGggdGhpcyBvdXRnb2luZyBpbnRlcmZhY2UKKyAqIEBvcmlnX25vZGU6IE9yaWdpbmF0b3IgdG8gZHVtcAorICogQHN1Yl9zOiBOdW1iZXIgb2Ygc3ViIGVudHJpZXMgdG8gc2tpcAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgY2FsbGVyIGhvbGRzIHJjdV9yZWFkX2xvY2soKS4KKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfaXZfb2dtX29yaWdfZHVtcF9lbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcsCisJCQkgICAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlLCBpbnQgKnN1Yl9zKQoreworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZV9iZXN0OworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2hfbm9kZTsKKwlpbnQgc3ViID0gMDsKKwlib29sIGJlc3Q7CisJdTggdHFfYXZnX2Jlc3Q7CisKKwluZWlnaF9ub2RlX2Jlc3QgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KG9yaWdfbm9kZSwgaWZfb3V0Z29pbmcpOworCWlmICghbmVpZ2hfbm9kZV9iZXN0KQorCQlnb3RvIG91dDsKKworCWlmICghYmF0YWR2X2l2X29nbV9uZWlnaF9nZXRfdHFfYXZnKG5laWdoX25vZGVfYmVzdCwgaWZfb3V0Z29pbmcsCisJCQkJCSAgICAmdHFfYXZnX2Jlc3QpKQorCQlnb3RvIG91dDsKKworCWlmICh0cV9hdmdfYmVzdCA9PSAwKQorCQlnb3RvIG91dDsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShuZWlnaF9ub2RlLCAmb3JpZ19ub2RlLT5uZWlnaF9saXN0LCBsaXN0KSB7CisJCWlmIChzdWIrKyA8ICpzdWJfcykKKwkJCWNvbnRpbnVlOworCisJCWJlc3QgPSAobmVpZ2hfbm9kZSA9PSBuZWlnaF9ub2RlX2Jlc3QpOworCisJCWlmIChiYXRhZHZfaXZfb2dtX29yaWdfZHVtcF9zdWJlbnRyeShtc2csIHBvcnRpZCwgc2VxLAorCQkJCQkJICAgICBiYXRfcHJpdiwgaWZfb3V0Z29pbmcsCisJCQkJCQkgICAgIG9yaWdfbm9kZSwgbmVpZ2hfbm9kZSwKKwkJCQkJCSAgICAgYmVzdCkpIHsKKwkJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChuZWlnaF9ub2RlX2Jlc3QpOworCisJCQkqc3ViX3MgPSBzdWIgLSAxOworCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJfQorCX0KKworIG91dDoKKwlpZiAobmVpZ2hfbm9kZV9iZXN0KQorCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQobmVpZ2hfbm9kZV9iZXN0KTsKKworCSpzdWJfcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYmF0YWR2X2l2X29nbV9vcmlnX2R1bXBfYnVja2V0IC0gRHVtcCBhbiBvcmlnaW5hdG9yIGJ1Y2tldCBpbnRvIGEKKyAqICBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGlmX291dGdvaW5nOiBMaW1pdCBkdW1wIHRvIGVudHJpZXMgd2l0aCB0aGlzIG91dGdvaW5nIGludGVyZmFjZQorICogQGhlYWQ6IEJ1Y2tldCB0byBiZSBkdW1wZWQKKyAqIEBpZHhfczogTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgc2tpcHBlZAorICogQHN1YjogTnVtYmVyIG9mIHN1YiBlbnRyaWVzIHRvIGJlIHNraXBwZWQKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfaXZfb2dtX29yaWdfZHVtcF9idWNrZXQoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICAgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcsCisJCQkgICAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIGludCAqaWR4X3MsIGludCAqc3ViKQoreworCXN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGU7CisJaW50IGlkeCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG9yaWdfbm9kZSwgaGVhZCwgaGFzaF9lbnRyeSkgeworCQlpZiAoaWR4KysgPCAqaWR4X3MpCisJCQljb250aW51ZTsKKworCQlpZiAoYmF0YWR2X2l2X29nbV9vcmlnX2R1bXBfZW50cnkobXNnLCBwb3J0aWQsIHNlcSwgYmF0X3ByaXYsCisJCQkJCQkgIGlmX291dGdvaW5nLCBvcmlnX25vZGUsCisJCQkJCQkgIHN1YikpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJKmlkeF9zID0gaWR4IC0gMTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkqaWR4X3MgPSAwOworCSpzdWIgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhdGFkdl9pdl9vZ21fb3JpZ19kdW1wIC0gRHVtcCB0aGUgb3JpZ2luYXRvcnMgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogQ29udHJvbCBibG9jayBjb250YWluaW5nIGFkZGl0aW9uYWwgb3B0aW9ucworICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaWZfb3V0Z29pbmc6IExpbWl0IGR1bXAgdG8gZW50cmllcyB3aXRoIHRoaXMgb3V0Z29pbmcgaW50ZXJmYWNlCisgKi8KK3N0YXRpYyB2b2lkCitiYXRhZHZfaXZfb2dtX29yaWdfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZykKK3sKKwlzdHJ1Y3QgYmF0YWR2X2hhc2h0YWJsZSAqaGFzaCA9IGJhdF9wcml2LT5vcmlnX2hhc2g7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJaW50IGJ1Y2tldCA9IGNiLT5hcmdzWzBdOworCWludCBpZHggPSBjYi0+YXJnc1sxXTsKKwlpbnQgc3ViID0gY2ItPmFyZ3NbMl07CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCisJd2hpbGUgKGJ1Y2tldCA8IGhhc2gtPnNpemUpIHsKKwkJaGVhZCA9ICZoYXNoLT50YWJsZVtidWNrZXRdOworCisJCWlmIChiYXRhZHZfaXZfb2dtX29yaWdfZHVtcF9idWNrZXQobXNnLCBwb3J0aWQsCisJCQkJCQkgICBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCQkgICBiYXRfcHJpdiwgaWZfb3V0Z29pbmcsIGhlYWQsCisJCQkJCQkgICAmaWR4LCAmc3ViKSkKKwkJCWJyZWFrOworCisJCWJ1Y2tldCsrOworCX0KKworCWNiLT5hcmdzWzBdID0gYnVja2V0OworCWNiLT5hcmdzWzFdID0gaWR4OworCWNiLT5hcmdzWzJdID0gc3ViOworfQorCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUworLyoqCiAgKiBiYXRhZHZfaXZfaGFyZGlmX25laWdoX3ByaW50IC0gcHJpbnQgYSBzaW5nbGUgaG9wIG5laWdoYm91ciBub2RlCiAgKiBAc2VxOiBuZWlnaGJvdXIgdGFibGUgc2VxX2ZpbGUgc3RydWN0CiAgKiBAaGFyZGlmX25laWdoOiBoYXJkaWYgbmVpZ2hib3VyIGluZm9ybWF0aW9uCkBAIC0yMDI3LDYgKzIyMzUsMTgyIEBACiAJaWYgKGJhdG1hbl9jb3VudCA9PSAwKQogCQlzZXFfcHV0cyhzZXEsICJObyBiYXRtYW4gbm9kZXMgaW4gcmFuZ2UgLi4uXG4iKTsKIH0KKyNlbmRpZgorCisvKioKKyAqIGJhdGFkdl9pdl9vZ21fbmVpZ2hfZGlmZiAtIGNhbGN1bGF0ZSB0cSBkaWZmZXJlbmNlIG9mIHR3byBuZWlnaGJvcnMKKyAqIEBuZWlnaDE6IHRoZSBmaXJzdCBuZWlnaGJvciBvYmplY3Qgb2YgdGhlIGNvbXBhcmlzb24KKyAqIEBpZl9vdXRnb2luZzE6IG91dGdvaW5nIGludGVyZmFjZSBmb3IgdGhlIGZpcnN0IG5laWdoYm9yCisgKiBAbmVpZ2gyOiB0aGUgc2Vjb25kIG5laWdoYm9yIG9iamVjdCBvZiB0aGUgY29tcGFyaXNvbgorICogQGlmX291dGdvaW5nMjogb3V0Z29pbmcgaW50ZXJmYWNlIGZvciB0aGUgc2Vjb25kIG5laWdoYm9yCisgKiBAZGlmZjogcG9pbnRlciB0byBpbnRlZ2VyIHJlY2VpdmluZyB0aGUgY2FsY3VsYXRlZCBkaWZmZXJlbmNlCisgKgorICogVGhlIGNvbnRlbnQgb2YgKkBkaWZmIGlzIG9ubHkgdmFsaWQgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4KKyAqIEl0IGlzIGxlc3MsIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAwIGlmIHRoZSBtZXRyaWMgdmlhIG5laWdoMSBpcyBsb3dlciwKKyAqIHRoZSBzYW1lIGFzIG9yIGhpZ2hlciB0aGFuIHRoZSBtZXRyaWMgdmlhIG5laWdoMgorICoKKyAqIFJldHVybjogdHJ1ZSB3aGVuIHRoZSBkaWZmZXJlbmNlIGNvdWxkIGJlIGNhbGN1bGF0ZWQsIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgYm9vbCBiYXRhZHZfaXZfb2dtX25laWdoX2RpZmYoc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaDEsCisJCQkJICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nMSwKKwkJCQkgICAgIHN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2gyLAorCQkJCSAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZzIsCisJCQkJICAgICBpbnQgKmRpZmYpCit7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKm5laWdoMV9pZmluZm8sICpuZWlnaDJfaWZpbmZvOworCXU4IHRxMSwgdHEyOworCWJvb2wgcmV0ID0gdHJ1ZTsKKworCW5laWdoMV9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChuZWlnaDEsIGlmX291dGdvaW5nMSk7CisJbmVpZ2gyX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KG5laWdoMiwgaWZfb3V0Z29pbmcyKTsKKworCWlmICghbmVpZ2gxX2lmaW5mbyB8fCAhbmVpZ2gyX2lmaW5mbykgeworCQlyZXQgPSBmYWxzZTsKKwkJZ290byBvdXQ7CisJfQorCisJdHExID0gbmVpZ2gxX2lmaW5mby0+YmF0X2l2LnRxX2F2ZzsKKwl0cTIgPSBuZWlnaDJfaWZpbmZvLT5iYXRfaXYudHFfYXZnOworCSpkaWZmID0gKGludCl0cTEgLSAoaW50KXRxMjsKKworb3V0OgorCWlmIChuZWlnaDFfaWZpbmZvKQorCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChuZWlnaDFfaWZpbmZvKTsKKwlpZiAobmVpZ2gyX2lmaW5mbykKKwkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQobmVpZ2gyX2lmaW5mbyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGJhdGFkdl9pdl9vZ21fbmVpZ2hfZHVtcF9uZWlnaCAtIER1bXAgYSBuZWlnaGJvdXIgaW50byBhIG5ldGxpbmsgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAaGFyZGlmX25laWdoOiBOZWlnaGJvdXIgdG8gYmUgZHVtcGVkCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X2l2X29nbV9uZWlnaF9kdW1wX25laWdoKHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICAgICAgc3RydWN0IGJhdGFkdl9oYXJkaWZfbmVpZ2hfbm9kZSAqaGFyZGlmX25laWdoKQoreworCXZvaWQgKmhkcjsKKwl1bnNpZ25lZCBpbnQgbGFzdF9zZWVuX21zZWNzOworCisJbGFzdF9zZWVuX21zZWNzID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gaGFyZGlmX25laWdoLT5sYXN0X3NlZW4pOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwKKwkJCSAgTkxNX0ZfTVVMVEksIEJBVEFEVl9DTURfR0VUX05FSUdIQk9SUyk7CisJaWYgKCFoZHIpCisJCXJldHVybiAtRU5PQlVGUzsKKworCWlmIChubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfTkVJR0hfQUREUkVTUywgRVRIX0FMRU4sCisJCSAgICBoYXJkaWZfbmVpZ2gtPmFkZHIpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfSEFSRF9JRklOREVYLAorCQkJaGFyZGlmX25laWdoLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+aWZpbmRleCkgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9MQVNUX1NFRU5fTVNFQ1MsCisJCQlsYXN0X3NlZW5fbXNlY3MpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gMDsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyoqCisgKiBiYXRhZHZfaXZfb2dtX25laWdoX2R1bXBfaGFyZGlmIC0gRHVtcCB0aGUgbmVpZ2hib3VycyBvZiBhIGhhcmQgaW50ZXJmYWNlCisgKiAgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaGFyZF9pZmFjZTogSGFyZCBpbnRlcmZhY2UgdG8gZHVtcCB0aGUgbmVpZ2hib3VycyBmb3IKKyAqIEBpZHhfczogTnVtYmVyIG9mIGVudHJpZXMgdG8gc2tpcAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGUgY2FsbGVyIGhvbGRzIHJjdV9yZWFkX2xvY2soKS4KKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfaXZfb2dtX25laWdoX2R1bXBfaGFyZGlmKHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCQlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2UsCisJCQkJaW50ICppZHhfcykKK3sKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRpZl9uZWlnaF9ub2RlICpoYXJkaWZfbmVpZ2g7CisJaW50IGlkeCA9IDA7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaGFyZGlmX25laWdoLAorCQkJCSAmaGFyZF9pZmFjZS0+bmVpZ2hfbGlzdCwgbGlzdCkgeworCQlpZiAoaWR4KysgPCAqaWR4X3MpCisJCQljb250aW51ZTsKKworCQlpZiAoYmF0YWR2X2l2X29nbV9uZWlnaF9kdW1wX25laWdoKG1zZywgcG9ydGlkLCBzZXEsCisJCQkJCQkgICBoYXJkaWZfbmVpZ2gpKSB7CisJCQkqaWR4X3MgPSBpZHggLSAxOworCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJfQorCX0KKworCSppZHhfcyA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYmF0YWR2X2l2X29nbV9uZWlnaF9kdW1wIC0gRHVtcCB0aGUgbmVpZ2hib3VycyBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBDb250cm9sIGJsb2NrIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBvcHRpb25zCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBzaW5nbGVfaGFyZGlmOiBMaW1pdCBkdW1wIHRvIHRoaXMgaGFyZCBpbnRlcmZhYWNlCisgKi8KK3N0YXRpYyB2b2lkCitiYXRhZHZfaXZfb2dtX25laWdoX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkJIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpzaW5nbGVfaGFyZGlmKQoreworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZTsKKwlpbnQgaV9oYXJkaWYgPSAwOworCWludCBpX2hhcmRpZl9zID0gY2ItPmFyZ3NbMF07CisJaW50IGlkeCA9IGNiLT5hcmdzWzFdOworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAoc2luZ2xlX2hhcmRpZikgeworCQlpZiAoaV9oYXJkaWZfcyA9PSAwKSB7CisJCQlpZiAoYmF0YWR2X2l2X29nbV9uZWlnaF9kdW1wX2hhcmRpZihtc2csIHBvcnRpZCwKKwkJCQkJCQkgICAgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkJCSAgICBiYXRfcHJpdiwKKwkJCQkJCQkgICAgc2luZ2xlX2hhcmRpZiwKKwkJCQkJCQkgICAgJmlkeCkgPT0gMCkKKwkJCQlpX2hhcmRpZisrOworCQl9CisJfSBlbHNlIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaGFyZF9pZmFjZSwgJmJhdGFkdl9oYXJkaWZfbGlzdCwKKwkJCQkJbGlzdCkgeworCQkJaWYgKGhhcmRfaWZhY2UtPnNvZnRfaWZhY2UgIT0gYmF0X3ByaXYtPnNvZnRfaWZhY2UpCisJCQkJY29udGludWU7CisKKwkJCWlmIChpX2hhcmRpZisrIDwgaV9oYXJkaWZfcykKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGJhdGFkdl9pdl9vZ21fbmVpZ2hfZHVtcF9oYXJkaWYobXNnLCBwb3J0aWQsCisJCQkJCQkJICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJCQkgICAgYmF0X3ByaXYsCisJCQkJCQkJICAgIGhhcmRfaWZhY2UsICZpZHgpKSB7CisJCQkJaV9oYXJkaWYtLTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWNiLT5hcmdzWzBdID0gaV9oYXJkaWY7CisJY2ItPmFyZ3NbMV0gPSBpZHg7Cit9CiAKIC8qKgogICogYmF0YWR2X2l2X29nbV9uZWlnaF9jbXAgLSBjb21wYXJlIHRoZSBtZXRyaWNzIG9mIHR3byBuZWlnaGJvcnMKQEAgLTIwNDMsMjcgKzI0MjcsMTMgQEAKIAkJCQkgICBzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoMiwKIAkJCQkgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nMikKIHsKLQlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqbmVpZ2gxX2lmaW5mbywgKm5laWdoMl9pZmluZm87Ci0JdTggdHExLCB0cTI7CisJYm9vbCByZXQ7CiAJaW50IGRpZmY7CiAKLQluZWlnaDFfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQobmVpZ2gxLCBpZl9vdXRnb2luZzEpOwotCW5laWdoMl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChuZWlnaDIsIGlmX291dGdvaW5nMik7Ci0KLQlpZiAoIW5laWdoMV9pZmluZm8gfHwgIW5laWdoMl9pZmluZm8pIHsKLQkJZGlmZiA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXRxMSA9IG5laWdoMV9pZmluZm8tPmJhdF9pdi50cV9hdmc7Ci0JdHEyID0gbmVpZ2gyX2lmaW5mby0+YmF0X2l2LnRxX2F2ZzsKLQlkaWZmID0gdHExIC0gdHEyOwotCi1vdXQ6Ci0JaWYgKG5laWdoMV9pZmluZm8pCi0JCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KG5laWdoMV9pZmluZm8pOwotCWlmIChuZWlnaDJfaWZpbmZvKQotCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChuZWlnaDJfaWZpbmZvKTsKKwlyZXQgPSBiYXRhZHZfaXZfb2dtX25laWdoX2RpZmYobmVpZ2gxLCBpZl9vdXRnb2luZzEsIG5laWdoMiwKKwkJCQkgICAgICAgaWZfb3V0Z29pbmcyLCAmZGlmZik7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOwogCiAJcmV0dXJuIGRpZmY7CiB9CkBAIC0yMDg1LDI5ICsyNDU1LDE1IEBACiAJCQkgICBzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoMiwKIAkJCSAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcyKQogewotCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpuZWlnaDFfaWZpbmZvLCAqbmVpZ2gyX2lmaW5mbzsKLQl1OCB0cTEsIHRxMjsKIAlib29sIHJldDsKKwlpbnQgZGlmZjsKIAotCW5laWdoMV9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChuZWlnaDEsIGlmX291dGdvaW5nMSk7Ci0JbmVpZ2gyX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KG5laWdoMiwgaWZfb3V0Z29pbmcyKTsKKwlyZXQgPSBiYXRhZHZfaXZfb2dtX25laWdoX2RpZmYobmVpZ2gxLCBpZl9vdXRnb2luZzEsIG5laWdoMiwKKwkJCQkgICAgICAgaWZfb3V0Z29pbmcyLCAmZGlmZik7CisJaWYgKCFyZXQpCisJCXJldHVybiBmYWxzZTsKIAotCS8qIHdlIGNhbid0IHNheSB0aGF0IHRoZSBtZXRyaWMgaXMgYmV0dGVyICovCi0JaWYgKCFuZWlnaDFfaWZpbmZvIHx8ICFuZWlnaDJfaWZpbmZvKSB7Ci0JCXJldCA9IGZhbHNlOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl0cTEgPSBuZWlnaDFfaWZpbmZvLT5iYXRfaXYudHFfYXZnOwotCXRxMiA9IG5laWdoMl9pZmluZm8tPmJhdF9pdi50cV9hdmc7Ci0JcmV0ID0gKHRxMSAtIHRxMikgPiAtQkFUQURWX1RRX1NJTUlMQVJJVFlfVEhSRVNIT0xEOwotCi1vdXQ6Ci0JaWYgKG5laWdoMV9pZmluZm8pCi0JCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KG5laWdoMV9pZmluZm8pOwotCWlmIChuZWlnaDJfaWZpbmZvKQotCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChuZWlnaDJfaWZpbmZvKTsKLQorCXJldCA9IGRpZmYgPiAtQkFUQURWX1RRX1NJTUlMQVJJVFlfVEhSRVNIT0xEOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIxMTcsNiArMjQ3MywzMjUgQEAKIAliYXRhZHZfaXZfb2dtX3NjaGVkdWxlKGhhcmRfaWZhY2UpOwogfQogCitzdGF0aWMgc3RydWN0IGJhdGFkdl9nd19ub2RlICoKK2JhdGFkdl9pdl9nd19nZXRfYmVzdF9nd19ub2RlKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpCit7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXI7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9pZmluZm87CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlLCAqY3Vycl9ndyA9IE5VTEw7CisJdTY0IG1heF9nd19mYWN0b3IgPSAwOworCXU2NCB0bXBfZ3dfZmFjdG9yID0gMDsKKwl1OCBtYXhfdHEgPSAwOworCXU4IHRxX2F2ZzsKKwlzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlOworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShnd19ub2RlLCAmYmF0X3ByaXYtPmd3Lmxpc3QsIGxpc3QpIHsKKwkJb3JpZ19ub2RlID0gZ3dfbm9kZS0+b3JpZ19ub2RlOworCQlyb3V0ZXIgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KG9yaWdfbm9kZSwgQkFUQURWX0lGX0RFRkFVTFQpOworCQlpZiAoIXJvdXRlcikKKwkJCWNvbnRpbnVlOworCisJCXJvdXRlcl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXIsCisJCQkJCQkJQkFUQURWX0lGX0RFRkFVTFQpOworCQlpZiAoIXJvdXRlcl9pZmluZm8pCisJCQlnb3RvIG5leHQ7CisKKwkJaWYgKCFrcmVmX2dldF91bmxlc3NfemVybygmZ3dfbm9kZS0+cmVmY291bnQpKQorCQkJZ290byBuZXh0OworCisJCXRxX2F2ZyA9IHJvdXRlcl9pZmluZm8tPmJhdF9pdi50cV9hdmc7CisKKwkJc3dpdGNoIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcykpIHsKKwkJY2FzZSAxOiAvKiBmYXN0IGNvbm5lY3Rpb24gKi8KKwkJCXRtcF9nd19mYWN0b3IgPSB0cV9hdmcgKiB0cV9hdmc7CisJCQl0bXBfZ3dfZmFjdG9yICo9IGd3X25vZGUtPmJhbmR3aWR0aF9kb3duOworCQkJdG1wX2d3X2ZhY3RvciAqPSAxMDAgKiAxMDA7CisJCQl0bXBfZ3dfZmFjdG9yID4+PSAxODsKKworCQkJaWYgKCh0bXBfZ3dfZmFjdG9yID4gbWF4X2d3X2ZhY3RvcikgfHwKKwkJCSAgICAoKHRtcF9nd19mYWN0b3IgPT0gbWF4X2d3X2ZhY3RvcikgJiYKKwkJCSAgICAgKHRxX2F2ZyA+IG1heF90cSkpKSB7CisJCQkJaWYgKGN1cnJfZ3cpCisJCQkJCWJhdGFkdl9nd19ub2RlX3B1dChjdXJyX2d3KTsKKwkJCQljdXJyX2d3ID0gZ3dfbm9kZTsKKwkJCQlrcmVmX2dldCgmY3Vycl9ndy0+cmVmY291bnQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDogLyogMjogIHN0YWJsZSBjb25uZWN0aW9uICh1c2UgYmVzdCBzdGF0aXN0aWMpCisJCQkgICogMzogIGZhc3Qtc3dpdGNoICh1c2UgYmVzdCBzdGF0aXN0aWMgYnV0IGNoYW5nZSBhcworCQkJICAqICAgICBzb29uIGFzIGEgYmV0dGVyIGdhdGV3YXkgYXBwZWFycykKKwkJCSAgKiBYWDogbGF0ZS1zd2l0Y2ggKHVzZSBiZXN0IHN0YXRpc3RpYyBidXQgY2hhbmdlIGFzCisJCQkgICogICAgIHNvb24gYXMgYSBiZXR0ZXIgZ2F0ZXdheSBhcHBlYXJzIHdoaWNoIGhhcworCQkJICAqICAgICAkcm91dGluZ19jbGFzcyBtb3JlIHRxIHBvaW50cykKKwkJCSAgKi8KKwkJCWlmICh0cV9hdmcgPiBtYXhfdHEpIHsKKwkJCQlpZiAoY3Vycl9ndykKKwkJCQkJYmF0YWR2X2d3X25vZGVfcHV0KGN1cnJfZ3cpOworCQkJCWN1cnJfZ3cgPSBnd19ub2RlOworCQkJCWtyZWZfZ2V0KCZjdXJyX2d3LT5yZWZjb3VudCk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWlmICh0cV9hdmcgPiBtYXhfdHEpCisJCQltYXhfdHEgPSB0cV9hdmc7CisKKwkJaWYgKHRtcF9nd19mYWN0b3IgPiBtYXhfZ3dfZmFjdG9yKQorCQkJbWF4X2d3X2ZhY3RvciA9IHRtcF9nd19mYWN0b3I7CisKKwkJYmF0YWR2X2d3X25vZGVfcHV0KGd3X25vZGUpOworCituZXh0OgorCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyKTsKKwkJaWYgKHJvdXRlcl9pZmluZm8pCisJCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfaWZpbmZvKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gY3Vycl9ndzsKK30KKworc3RhdGljIGJvb2wgYmF0YWR2X2l2X2d3X2lzX2VsaWdpYmxlKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkJICAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqY3Vycl9nd19vcmlnLAorCQkJCSAgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX29yaWdfaWZpbmZvID0gTlVMTDsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX2d3X2lmaW5mbyA9IE5VTEw7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXJfZ3cgPSBOVUxMOworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyX29yaWcgPSBOVUxMOworCXU4IGd3X3RxX2F2Zywgb3JpZ190cV9hdmc7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCS8qIGR5bmFtaWMgcmUtZWxlY3Rpb24gaXMgcGVyZm9ybWVkIG9ubHkgb24gZmFzdCBvciBsYXRlIHN3aXRjaCAqLworCWlmIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcykgPD0gMikKKwkJcmV0dXJuIGZhbHNlOworCisJcm91dGVyX2d3ID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChjdXJyX2d3X29yaWcsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcl9ndykgeworCQlyZXQgPSB0cnVlOworCQlnb3RvIG91dDsKKwl9CisKKwlyb3V0ZXJfZ3dfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyX2d3LAorCQkJCQkJICAgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyX2d3X2lmaW5mbykgeworCQlyZXQgPSB0cnVlOworCQlnb3RvIG91dDsKKwl9CisKKwlyb3V0ZXJfb3JpZyA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQob3JpZ19ub2RlLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXJfb3JpZykKKwkJZ290byBvdXQ7CisKKwlyb3V0ZXJfb3JpZ19pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXJfb3JpZywKKwkJCQkJCSAgICAgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyX29yaWdfaWZpbmZvKQorCQlnb3RvIG91dDsKKworCWd3X3RxX2F2ZyA9IHJvdXRlcl9nd19pZmluZm8tPmJhdF9pdi50cV9hdmc7CisJb3JpZ190cV9hdmcgPSByb3V0ZXJfb3JpZ19pZmluZm8tPmJhdF9pdi50cV9hdmc7CisKKwkvKiB0aGUgVFEgdmFsdWUgaGFzIHRvIGJlIGJldHRlciAqLworCWlmIChvcmlnX3RxX2F2ZyA8IGd3X3RxX2F2ZykKKwkJZ290byBvdXQ7CisKKwkvKiBpZiB0aGUgcm91dGluZyBjbGFzcyBpcyBncmVhdGVyIHRoYW4gMyB0aGUgdmFsdWUgdGVsbHMgdXMgaG93IG11Y2gKKwkgKiBncmVhdGVyIHRoZSBUUSB2YWx1ZSBvZiB0aGUgbmV3IGdhdGV3YXkgbXVzdCBiZQorCSAqLworCWlmICgoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpID4gMykgJiYKKwkgICAgKG9yaWdfdHFfYXZnIC0gZ3dfdHFfYXZnIDwgYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpKSkKKwkJZ290byBvdXQ7CisKKwliYXRhZHZfZGJnKEJBVEFEVl9EQkdfQkFUTUFOLCBiYXRfcHJpdiwKKwkJICAgIlJlc3RhcnRpbmcgZ2F0ZXdheSBzZWxlY3Rpb246IGJldHRlciBnYXRld2F5IGZvdW5kICh0cSBjdXJyOiAlaSwgdHEgbmV3OiAlaSlcbiIsCisJCSAgIGd3X3RxX2F2Zywgb3JpZ190cV9hdmcpOworCisJcmV0ID0gdHJ1ZTsKK291dDoKKwlpZiAocm91dGVyX2d3X2lmaW5mbykKKwkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX2d3X2lmaW5mbyk7CisJaWYgKHJvdXRlcl9vcmlnX2lmaW5mbykKKwkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX29yaWdfaWZpbmZvKTsKKwlpZiAocm91dGVyX2d3KQorCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyX2d3KTsKKwlpZiAocm91dGVyX29yaWcpCisJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXJfb3JpZyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUworLyogZmFpbHMgaWYgb3JpZ19ub2RlIGhhcyBubyByb3V0ZXIgKi8KK3N0YXRpYyBpbnQgYmF0YWR2X2l2X2d3X3dyaXRlX2J1ZmZlcl90ZXh0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkJCSAgc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJCSAgY29uc3Qgc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlKQoreworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqY3Vycl9ndzsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcjsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX2lmaW5mbyA9IE5VTEw7CisJaW50IHJldCA9IC0xOworCisJcm91dGVyID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChnd19ub2RlLT5vcmlnX25vZGUsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcikKKwkJZ290byBvdXQ7CisKKwlyb3V0ZXJfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXJfaWZpbmZvKQorCQlnb3RvIG91dDsKKworCWN1cnJfZ3cgPSBiYXRhZHZfZ3dfZ2V0X3NlbGVjdGVkX2d3X25vZGUoYmF0X3ByaXYpOworCisJc2VxX3ByaW50ZihzZXEsICIlcyAlcE0gKCUzaSkgJXBNIFslMTBzXTogJXUuJXUvJXUuJXUgTUJpdFxuIiwKKwkJICAgKGN1cnJfZ3cgPT0gZ3dfbm9kZSA/ICI9PiIgOiAiICAiKSwKKwkJICAgZ3dfbm9kZS0+b3JpZ19ub2RlLT5vcmlnLAorCQkgICByb3V0ZXJfaWZpbmZvLT5iYXRfaXYudHFfYXZnLCByb3V0ZXItPmFkZHIsCisJCSAgIHJvdXRlci0+aWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUsCisJCSAgIGd3X25vZGUtPmJhbmR3aWR0aF9kb3duIC8gMTAsCisJCSAgIGd3X25vZGUtPmJhbmR3aWR0aF9kb3duICUgMTAsCisJCSAgIGd3X25vZGUtPmJhbmR3aWR0aF91cCAvIDEwLAorCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfdXAgJSAxMCk7CisJcmV0ID0gc2VxX2hhc19vdmVyZmxvd2VkKHNlcSkgPyAtMSA6IDA7CisKKwlpZiAoY3Vycl9ndykKKwkJYmF0YWR2X2d3X25vZGVfcHV0KGN1cnJfZ3cpOworb3V0OgorCWlmIChyb3V0ZXJfaWZpbmZvKQorCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfaWZpbmZvKTsKKwlpZiAocm91dGVyKQorCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBiYXRhZHZfaXZfZ3dfcHJpbnQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGU7CisJaW50IGd3X2NvdW50ID0gMDsKKworCXNlcV9wdXRzKHNlcSwKKwkJICIgICAgICBHYXRld2F5ICAgICAgKCMvMjU1KSAgICAgICAgICAgTmV4dGhvcCBbb3V0Z29pbmdJRl06IGFkdmVydGlzZWQgdXBsaW5rIGJhbmR3aWR0aFxuIik7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGd3X25vZGUsICZiYXRfcHJpdi0+Z3cubGlzdCwgbGlzdCkgeworCQkvKiBmYWlscyBpZiBvcmlnX25vZGUgaGFzIG5vIHJvdXRlciAqLworCQlpZiAoYmF0YWR2X2l2X2d3X3dyaXRlX2J1ZmZlcl90ZXh0KGJhdF9wcml2LCBzZXEsIGd3X25vZGUpIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWd3X2NvdW50Kys7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKGd3X2NvdW50ID09IDApCisJCXNlcV9wdXRzKHNlcSwgIk5vIGdhdGV3YXlzIGluIHJhbmdlIC4uLlxuIik7Cit9CisjZW5kaWYKKworLyoqCisgKiBiYXRhZHZfaXZfZ3dfZHVtcF9lbnRyeSAtIER1bXAgYSBnYXRld2F5IGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGd3X25vZGU6IEdhdGV3YXkgdG8gYmUgZHVtcGVkCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludCBiYXRhZHZfaXZfZ3dfZHVtcF9lbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJCSAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkJICAgc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlKQoreworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfaWZpbmZvID0gTlVMTDsKKwlzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKnJvdXRlcjsKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmN1cnJfZ3c7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdm9pZCAqaGRyOworCisJcm91dGVyID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChnd19ub2RlLT5vcmlnX25vZGUsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcikKKwkJZ290byBvdXQ7CisKKwlyb3V0ZXJfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXJfaWZpbmZvKQorCQlnb3RvIG91dDsKKworCWN1cnJfZ3cgPSBiYXRhZHZfZ3dfZ2V0X3NlbGVjdGVkX2d3X25vZGUoYmF0X3ByaXYpOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwKKwkJCSAgTkxNX0ZfTVVMVEksIEJBVEFEVl9DTURfR0VUX0dBVEVXQVlTKTsKKwlpZiAoIWhkcikgeworCQlyZXQgPSAtRU5PQlVGUzsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gLUVNU0dTSVpFOworCisJaWYgKGN1cnJfZ3cgPT0gZ3dfbm9kZSkKKwkJaWYgKG5sYV9wdXRfZmxhZyhtc2csIEJBVEFEVl9BVFRSX0ZMQUdfQkVTVCkpIHsKKwkJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwlpZiAobmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX09SSUdfQUREUkVTUywgRVRIX0FMRU4sCisJCSAgICBnd19ub2RlLT5vcmlnX25vZGUtPm9yaWcpIHx8CisJICAgIG5sYV9wdXRfdTgobXNnLCBCQVRBRFZfQVRUUl9UUSwgcm91dGVyX2lmaW5mby0+YmF0X2l2LnRxX2F2ZykgfHwKKwkgICAgbmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX1JPVVRFUiwgRVRIX0FMRU4sCisJCSAgICByb3V0ZXItPmFkZHIpIHx8CisJICAgIG5sYV9wdXRfc3RyaW5nKG1zZywgQkFUQURWX0FUVFJfSEFSRF9JRk5BTUUsCisJCQkgICByb3V0ZXItPmlmX2luY29taW5nLT5uZXRfZGV2LT5uYW1lKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0JBTkRXSURUSF9ET1dOLAorCQkJZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd24pIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfQkFORFdJRFRIX1VQLAorCQkJZ3dfbm9kZS0+YmFuZHdpZHRoX3VwKSkgeworCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCWdvdG8gb3V0OworCX0KKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXQgPSAwOworCitvdXQ6CisJaWYgKHJvdXRlcl9pZmluZm8pCisJCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9pZmluZm8pOworCWlmIChyb3V0ZXIpCisJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXIpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogYmF0YWR2X2l2X2d3X2R1bXAgLSBEdW1wIGdhdGV3YXlzIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IENvbnRyb2wgYmxvY2sgY29udGFpbmluZyBhZGRpdGlvbmFsIG9wdGlvbnMKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBiYXRhZHZfaXZfZ3dfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQkgICAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KQoreworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKwlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGU7CisJaW50IGlkeF9za2lwID0gY2ItPmFyZ3NbMF07CisJaW50IGlkeCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGd3X25vZGUsICZiYXRfcHJpdi0+Z3cubGlzdCwgbGlzdCkgeworCQlpZiAoaWR4KysgPCBpZHhfc2tpcCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXRhZHZfaXZfZ3dfZHVtcF9lbnRyeShtc2csIHBvcnRpZCwgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkgICAgYmF0X3ByaXYsIGd3X25vZGUpKSB7CisJCQlpZHhfc2tpcCA9IGlkeCAtIDE7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCX0KKworCWlkeF9za2lwID0gaWR4OwordW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCisJY2ItPmFyZ3NbMF0gPSBpZHhfc2tpcDsKK30KKwogc3RhdGljIHN0cnVjdCBiYXRhZHZfYWxnb19vcHMgYmF0YWR2X2JhdG1hbl9pdiBfX3JlYWRfbW9zdGx5ID0gewogCS5uYW1lID0gIkJBVE1BTl9JViIsCiAJLmlmYWNlID0gewpAQCAtMjEyOSwxNCArMjgwNCwyOCBAQAogCS5uZWlnaCA9IHsKIAkJLmNtcCA9IGJhdGFkdl9pdl9vZ21fbmVpZ2hfY21wLAogCQkuaXNfc2ltaWxhcl9vcl9iZXR0ZXIgPSBiYXRhZHZfaXZfb2dtX25laWdoX2lzX3NvYiwKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAJCS5wcmludCA9IGJhdGFkdl9pdl9uZWlnaF9wcmludCwKKyNlbmRpZgorCQkuZHVtcCA9IGJhdGFkdl9pdl9vZ21fbmVpZ2hfZHVtcCwKIAl9LAogCS5vcmlnID0geworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIAkJLnByaW50ID0gYmF0YWR2X2l2X29nbV9vcmlnX3ByaW50LAorI2VuZGlmCisJCS5kdW1wID0gYmF0YWR2X2l2X29nbV9vcmlnX2R1bXAsCiAJCS5mcmVlID0gYmF0YWR2X2l2X29nbV9vcmlnX2ZyZWUsCiAJCS5hZGRfaWYgPSBiYXRhZHZfaXZfb2dtX29yaWdfYWRkX2lmLAogCQkuZGVsX2lmID0gYmF0YWR2X2l2X29nbV9vcmlnX2RlbF9pZiwKIAl9LAorCS5ndyA9IHsKKwkJLmdldF9iZXN0X2d3X25vZGUgPSBiYXRhZHZfaXZfZ3dfZ2V0X2Jlc3RfZ3dfbm9kZSwKKwkJLmlzX2VsaWdpYmxlID0gYmF0YWR2X2l2X2d3X2lzX2VsaWdpYmxlLAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKKwkJLnByaW50ID0gYmF0YWR2X2l2X2d3X3ByaW50LAorI2VuZGlmCisJCS5kdW1wID0gYmF0YWR2X2l2X2d3X2R1bXAsCisJfSwKIH07CiAKIGludCBfX2luaXQgYmF0YWR2X2l2X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2JhdF92LmMgYi9uZXQvYmF0bWFuLWFkdi9iYXRfdi5jCmluZGV4IDAzNjZjYmYuLmU3OWY2ZjAgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2JhdF92LmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvYmF0X3YuYwpAQCAtMjEsMjQgKzIxLDM4IEBACiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JhdG1hbl9hZHYuaD4KIAogI2luY2x1ZGUgImJhdF9hbGdvLmgiCiAjaW5jbHVkZSAiYmF0X3ZfZWxwLmgiCiAjaW5jbHVkZSAiYmF0X3Zfb2dtLmgiCisjaW5jbHVkZSAiZ2F0ZXdheV9jbGllbnQuaCIKKyNpbmNsdWRlICJnYXRld2F5X2NvbW1vbi5oIgogI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiaGFzaC5oIgorI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm5ldGxpbmsuaCIKICNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCiAjaW5jbHVkZSAicGFja2V0LmgiCiAKK3N0cnVjdCBza19idWZmOworCiBzdGF0aWMgdm9pZCBiYXRhZHZfdl9pZmFjZV9hY3RpdmF0ZShzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2UpCiB7CiAJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGhhcmRfaWZhY2UtPnNvZnRfaWZhY2UpOwpAQCAtMTE1LDYgKzEyOSw3IEBACiAJCSAgYmF0YWR2X3ZfZWxwX3Rocm91Z2hwdXRfbWV0cmljX3VwZGF0ZSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAvKioKICAqIGJhdGFkdl92X29yaWdfcHJpbnRfbmVpZ2ggLSBwcmludCBuZWlnaGJvcnMgZm9yIHRoZSBvcmlnaW5hdG9yIHRhYmxlCiAgKiBAb3JpZ19ub2RlOiB0aGUgb3JpZ19ub2RlIGZvciB3aGljaCB0aGUgbmVpZ2hib3JzIGFyZSBwcmludGVkCkBAIC0xOTgsOCArMjEzLDE0MiBAQAogCWlmIChiYXRtYW5fY291bnQgPT0gMCkKIAkJc2VxX3B1dHMoc2VxLCAiTm8gYmF0bWFuIG5vZGVzIGluIHJhbmdlIC4uLlxuIik7CiB9CisjZW5kaWYKIAogLyoqCisgKiBiYXRhZHZfdl9uZWlnaF9kdW1wX25laWdoIC0gRHVtcCBhIG5laWdoYm91ciBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAaGFyZGlmX25laWdoOiBOZWlnaGJvdXIgdG8gZHVtcAorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl92X25laWdoX2R1bXBfbmVpZ2goc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgc3RydWN0IGJhdGFkdl9oYXJkaWZfbmVpZ2hfbm9kZSAqaGFyZGlmX25laWdoKQoreworCXZvaWQgKmhkcjsKKwl1bnNpZ25lZCBpbnQgbGFzdF9zZWVuX21zZWNzOworCXUzMiB0aHJvdWdocHV0OworCisJbGFzdF9zZWVuX21zZWNzID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gaGFyZGlmX25laWdoLT5sYXN0X3NlZW4pOworCXRocm91Z2hwdXQgPSBld21hX3Rocm91Z2hwdXRfcmVhZCgmaGFyZGlmX25laWdoLT5iYXRfdi50aHJvdWdocHV0KTsKKwl0aHJvdWdocHV0ID0gdGhyb3VnaHB1dCAqIDEwMDsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksIE5MTV9GX01VTFRJLAorCQkJICBCQVRBRFZfQ01EX0dFVF9ORUlHSEJPUlMpOworCWlmICghaGRyKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlpZiAobmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX05FSUdIX0FERFJFU1MsIEVUSF9BTEVOLAorCQkgICAgaGFyZGlmX25laWdoLT5hZGRyKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0hBUkRfSUZJTkRFWCwKKwkJCWhhcmRpZl9uZWlnaC0+aWZfaW5jb21pbmctPm5ldF9kZXYtPmlmaW5kZXgpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfTEFTVF9TRUVOX01TRUNTLAorCQkJbGFzdF9zZWVuX21zZWNzKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX1RIUk9VR0hQVVQsIHRocm91Z2hwdXQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gMDsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyoqCisgKiBiYXRhZHZfdl9uZWlnaF9kdW1wX2hhcmRpZiAtIER1bXAgdGhlICBuZWlnaGJvdXJzIG9mIGEgaGFyZCBpbnRlcmZhY2UgIGludG8KKyAqICBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaGFyZF9pZmFjZTogVGhlIGhhcmQgaW50ZXJmYWNlIHRvIGJlIGR1bXBlZAorICogQGlkeF9zOiBFbnRyaWVzIHRvIGJlIHNraXBwZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIGNhbGxlciBob2xkcyByY3VfcmVhZF9sb2NrKCkuCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X3ZfbmVpZ2hfZHVtcF9oYXJkaWYoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2UsCisJCQkgICBpbnQgKmlkeF9zKQoreworCXN0cnVjdCBiYXRhZHZfaGFyZGlmX25laWdoX25vZGUgKmhhcmRpZl9uZWlnaDsKKwlpbnQgaWR4ID0gMDsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShoYXJkaWZfbmVpZ2gsCisJCQkJICZoYXJkX2lmYWNlLT5uZWlnaF9saXN0LCBsaXN0KSB7CisJCWlmIChpZHgrKyA8ICppZHhfcykKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXRhZHZfdl9uZWlnaF9kdW1wX25laWdoKG1zZywgcG9ydGlkLCBzZXEsIGhhcmRpZl9uZWlnaCkpIHsKKwkJCSppZHhfcyA9IGlkeCAtIDE7CisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisJfQorCisJKmlkeF9zID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiYXRhZHZfdl9uZWlnaF9kdW1wIC0gRHVtcCB0aGUgbmVpZ2hib3VycyBvZiBhIGhhcmQgaW50ZXJmYWNlICBpbnRvIGEKKyAqICBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IENvbnRyb2wgYmxvY2sgY29udGFpbmluZyBhZGRpdGlvbmFsIG9wdGlvbnMKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQHNpbmdsZV9oYXJkaWY6IExpbWl0IGR1bXBpbmcgdG8gdGhpcyBoYXJkIGludGVyZmFjZQorICovCitzdGF0aWMgdm9pZAorYmF0YWR2X3ZfbmVpZ2hfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCSAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpzaW5nbGVfaGFyZGlmKQoreworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZTsKKwlpbnQgaV9oYXJkaWYgPSAwOworCWludCBpX2hhcmRpZl9zID0gY2ItPmFyZ3NbMF07CisJaW50IGlkeCA9IGNiLT5hcmdzWzFdOworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlpZiAoc2luZ2xlX2hhcmRpZikgeworCQlpZiAoaV9oYXJkaWZfcyA9PSAwKSB7CisJCQlpZiAoYmF0YWR2X3ZfbmVpZ2hfZHVtcF9oYXJkaWYobXNnLCBwb3J0aWQsCisJCQkJCQkgICAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkJICAgICAgIGJhdF9wcml2LCBzaW5nbGVfaGFyZGlmLAorCQkJCQkJICAgICAgICZpZHgpID09IDApCisJCQkJaV9oYXJkaWYrKzsKKwkJfQorCX0gZWxzZSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGhhcmRfaWZhY2UsICZiYXRhZHZfaGFyZGlmX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChoYXJkX2lmYWNlLT5zb2Z0X2lmYWNlICE9IGJhdF9wcml2LT5zb2Z0X2lmYWNlKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoaV9oYXJkaWYrKyA8IGlfaGFyZGlmX3MpCisJCQkJY29udGludWU7CisKKwkJCWlmIChiYXRhZHZfdl9uZWlnaF9kdW1wX2hhcmRpZihtc2csIHBvcnRpZCwKKwkJCQkJCSAgICAgICBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCQkgICAgICAgYmF0X3ByaXYsIGhhcmRfaWZhY2UsCisJCQkJCQkgICAgICAgJmlkeCkpIHsKKwkJCQlpX2hhcmRpZi0tOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJY2ItPmFyZ3NbMF0gPSBpX2hhcmRpZjsKKwljYi0+YXJnc1sxXSA9IGlkeDsKK30KKworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKKy8qKgogICogYmF0YWR2X3Zfb3JpZ19wcmludCAtIHByaW50IHRoZSBvcmlnaW5hdG9yIHRhYmxlCiAgKiBAYmF0X3ByaXY6IHRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KICAqIEBzZXE6IGRlYnVnZnMgdGFibGUgc2VxX2ZpbGUgc3RydWN0CkBAIC0yNjUsNiArNDE0LDIwNSBAQAogCWlmIChiYXRtYW5fY291bnQgPT0gMCkKIAkJc2VxX3B1dHMoc2VxLCAiTm8gYmF0bWFuIG5vZGVzIGluIHJhbmdlIC4uLlxuIik7CiB9CisjZW5kaWYKKworLyoqCisgKiBiYXRhZHZfdl9vcmlnX2R1bXBfc3ViZW50cnkgLSBEdW1wIGFuIG9yaWdpbmF0b3Igc3ViZW50cnkgaW50byBhCisgKiAgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBpZl9vdXRnb2luZzogTGltaXQgZHVtcCB0byBlbnRyaWVzIHdpdGggdGhpcyBvdXRnb2luZyBpbnRlcmZhY2UKKyAqIEBvcmlnX25vZGU6IE9yaWdpbmF0b3IgdG8gZHVtcAorICogQG5laWdoX25vZGU6IFNpbmdsZSBob3BzIG5laWdoYm91cgorICogQGJlc3Q6IElzIHRoZSBiZXN0IG9yaWdpbmF0b3IKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfdl9vcmlnX2R1bXBfc3ViZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcsCisJCQkgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSwKKwkJCSAgICBzdHJ1Y3QgYmF0YWR2X25laWdoX25vZGUgKm5laWdoX25vZGUsCisJCQkgICAgYm9vbCBiZXN0KQoreworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpuX2lmaW5mbzsKKwl1bnNpZ25lZCBpbnQgbGFzdF9zZWVuX21zZWNzOworCXUzMiB0aHJvdWdocHV0OworCXZvaWQgKmhkcjsKKworCW5faWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQobmVpZ2hfbm9kZSwgaWZfb3V0Z29pbmcpOworCWlmICghbl9pZmluZm8pCisJCXJldHVybiAwOworCisJdGhyb3VnaHB1dCA9IG5faWZpbmZvLT5iYXRfdi50aHJvdWdocHV0ICogMTAwOworCisJYmF0YWR2X25laWdoX2lmaW5mb19wdXQobl9pZmluZm8pOworCisJbGFzdF9zZWVuX21zZWNzID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gb3JpZ19ub2RlLT5sYXN0X3NlZW4pOworCisJaWYgKGlmX291dGdvaW5nICE9IEJBVEFEVl9JRl9ERUZBVUxUICYmCisJICAgIGlmX291dGdvaW5nICE9IG5laWdoX25vZGUtPmlmX2luY29taW5nKQorCQlyZXR1cm4gMDsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksIE5MTV9GX01VTFRJLAorCQkJICBCQVRBRFZfQ01EX0dFVF9PUklHSU5BVE9SUyk7CisJaWYgKCFoZHIpCisJCXJldHVybiAtRU5PQlVGUzsKKworCWlmIChubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfT1JJR19BRERSRVNTLCBFVEhfQUxFTiwgb3JpZ19ub2RlLT5vcmlnKSB8fAorCSAgICBubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfTkVJR0hfQUREUkVTUywgRVRIX0FMRU4sCisJCSAgICBuZWlnaF9ub2RlLT5hZGRyKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0hBUkRfSUZJTkRFWCwKKwkJCW5laWdoX25vZGUtPmlmX2luY29taW5nLT5uZXRfZGV2LT5pZmluZGV4KSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX1RIUk9VR0hQVVQsIHRocm91Z2hwdXQpIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfTEFTVF9TRUVOX01TRUNTLAorCQkJbGFzdF9zZWVuX21zZWNzKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAoYmVzdCAmJiBubGFfcHV0X2ZsYWcobXNnLCBCQVRBRFZfQVRUUl9GTEFHX0JFU1QpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gMDsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyoqCisgKiBiYXRhZHZfdl9vcmlnX2R1bXBfZW50cnkgLSBEdW1wIGFuIG9yaWdpbmF0b3IgZW50cnkgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaWZfb3V0Z29pbmc6IExpbWl0IGR1bXAgdG8gZW50cmllcyB3aXRoIHRoaXMgb3V0Z29pbmcgaW50ZXJmYWNlCisgKiBAb3JpZ19ub2RlOiBPcmlnaW5hdG9yIHRvIGR1bXAKKyAqIEBzdWJfczogTnVtYmVyIG9mIHN1YiBlbnRyaWVzIHRvIHNraXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhlIGNhbGxlciBob2xkcyByY3VfcmVhZF9sb2NrKCkuCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X3Zfb3JpZ19kdW1wX2VudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nLAorCQkJIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUsIGludCAqc3ViX3MpCit7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaF9ub2RlX2Jlc3Q7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpuZWlnaF9ub2RlOworCWludCBzdWIgPSAwOworCWJvb2wgYmVzdDsKKworCW5laWdoX25vZGVfYmVzdCA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQob3JpZ19ub2RlLCBpZl9vdXRnb2luZyk7CisJaWYgKCFuZWlnaF9ub2RlX2Jlc3QpCisJCWdvdG8gb3V0OworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG5laWdoX25vZGUsICZvcmlnX25vZGUtPm5laWdoX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHN1YisrIDwgKnN1Yl9zKQorCQkJY29udGludWU7CisKKwkJYmVzdCA9IChuZWlnaF9ub2RlID09IG5laWdoX25vZGVfYmVzdCk7CisKKwkJaWYgKGJhdGFkdl92X29yaWdfZHVtcF9zdWJlbnRyeShtc2csIHBvcnRpZCwgc2VxLCBiYXRfcHJpdiwKKwkJCQkJCWlmX291dGdvaW5nLCBvcmlnX25vZGUsCisJCQkJCQluZWlnaF9ub2RlLCBiZXN0KSkgeworCQkJYmF0YWR2X25laWdoX25vZGVfcHV0KG5laWdoX25vZGVfYmVzdCk7CisKKwkJCSpzdWJfcyA9IHN1YiAtIDE7CisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisJfQorCisgb3V0OgorCWlmIChuZWlnaF9ub2RlX2Jlc3QpCisJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChuZWlnaF9ub2RlX2Jlc3QpOworCisJKnN1Yl9zID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiYXRhZHZfdl9vcmlnX2R1bXBfYnVja2V0IC0gRHVtcCBhbiBvcmlnaW5hdG9yIGJ1Y2tldCBpbnRvIGEKKyAqICBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGlmX291dGdvaW5nOiBMaW1pdCBkdW1wIHRvIGVudHJpZXMgd2l0aCB0aGlzIG91dGdvaW5nIGludGVyZmFjZQorICogQGhlYWQ6IEJ1Y2tldCB0byBiZSBkdW1wZWQKKyAqIEBpZHhfczogTnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgc2tpcHBlZAorICogQHN1YjogTnVtYmVyIG9mIHN1YiBlbnRyaWVzIHRvIGJlIHNraXBwZWQKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfdl9vcmlnX2R1bXBfYnVja2V0KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcsCisJCQkgIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCBpbnQgKmlkeF9zLCBpbnQgKnN1YikKK3sKKwlzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlOworCWludCBpZHggPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShvcmlnX25vZGUsIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJaWYgKGlkeCsrIDwgKmlkeF9zKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhdGFkdl92X29yaWdfZHVtcF9lbnRyeShtc2csIHBvcnRpZCwgc2VxLCBiYXRfcHJpdiwKKwkJCQkJICAgICBpZl9vdXRnb2luZywgb3JpZ19ub2RlLCBzdWIpKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCSppZHhfcyA9IGlkeCAtIDE7CisJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJKmlkeF9zID0gMDsKKwkqc3ViID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiYXRhZHZfdl9vcmlnX2R1bXAgLSBEdW1wIHRoZSBvcmlnaW5hdG9ycyBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBDb250cm9sIGJsb2NrIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBvcHRpb25zCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBpZl9vdXRnb2luZzogTGltaXQgZHVtcCB0byBlbnRyaWVzIHdpdGggdGhpcyBvdXRnb2luZyBpbnRlcmZhY2UKKyAqLworc3RhdGljIHZvaWQKK2JhdGFkdl92X29yaWdfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCSAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCSAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcpCit7CisJc3RydWN0IGJhdGFkdl9oYXNodGFibGUgKmhhc2ggPSBiYXRfcHJpdi0+b3JpZ19oYXNoOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCWludCBidWNrZXQgPSBjYi0+YXJnc1swXTsKKwlpbnQgaWR4ID0gY2ItPmFyZ3NbMV07CisJaW50IHN1YiA9IGNiLT5hcmdzWzJdOworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKworCXdoaWxlIChidWNrZXQgPCBoYXNoLT5zaXplKSB7CisJCWhlYWQgPSAmaGFzaC0+dGFibGVbYnVja2V0XTsKKworCQlpZiAoYmF0YWR2X3Zfb3JpZ19kdW1wX2J1Y2tldChtc2csIHBvcnRpZCwKKwkJCQkJICAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkgICAgICBiYXRfcHJpdiwgaWZfb3V0Z29pbmcsIGhlYWQsICZpZHgsCisJCQkJCSAgICAgICZzdWIpKQorCQkJYnJlYWs7CisKKwkJYnVja2V0Kys7CisJfQorCisJY2ItPmFyZ3NbMF0gPSBidWNrZXQ7CisJY2ItPmFyZ3NbMV0gPSBpZHg7CisJY2ItPmFyZ3NbMl0gPSBzdWI7Cit9CiAKIHN0YXRpYyBpbnQgYmF0YWR2X3ZfbmVpZ2hfY21wKHN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2gxLAogCQkJICAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZzEsCkBAIC0zMjAsNiArNjY4LDM2NSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGJhdGFkdl92X3N0b3JlX3NlbF9jbGFzcyhzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJCQljaGFyICpidWZmLCBzaXplX3QgY291bnQpCit7CisJdTMyIG9sZF9jbGFzcywgY2xhc3M7CisKKwlpZiAoIWJhdGFkdl9wYXJzZV90aHJvdWdocHV0KGJhdF9wcml2LT5zb2Z0X2lmYWNlLCBidWZmLAorCQkJCSAgICAgIkIuQS5ULk0uQS5OLiBWIEdXIHNlbGVjdGlvbiBjbGFzcyIsCisJCQkJICAgICAmY2xhc3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9sZF9jbGFzcyA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKTsKKwlhdG9taWNfc2V0KCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzLCBjbGFzcyk7CisKKwlpZiAob2xkX2NsYXNzICE9IGNsYXNzKQorCQliYXRhZHZfZ3dfcmVzZWxlY3QoYmF0X3ByaXYpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBiYXRhZHZfdl9zaG93X3NlbF9jbGFzcyhzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LCBjaGFyICpidWZmKQoreworCXUzMiBjbGFzcyA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZmYsICIldS4ldSBNQml0XG4iLCBjbGFzcyAvIDEwLCBjbGFzcyAlIDEwKTsKK30KKworLyoqCisgKiBiYXRhZHZfdl9nd190aHJvdWdocHV0X2dldCAtIHJldHJpZXZlIHRoZSBHVy1iYW5kd2lkdGggZm9yIGEgZ2l2ZW4gR1cKKyAqIEBnd19ub2RlOiB0aGUgR1cgdG8gcmV0cmlldmUgdGhlIG1ldHJpYyBmb3IKKyAqIEBidzogdGhlIHBvaW50ZXIgd2hlcmUgdGhlIG1ldHJpYyB3aWxsIGJlIHN0b3JlZC4gVGhlIG1ldHJpYyBpcyBjb21wdXRlZCBhcworICogIHRoZSBtaW5pbXVtIGJldHdlZW4gdGhlIEdXIGFkdmVydGlzZWQgdGhyb3VnaHB1dCBhbmQgdGhlIHBhdGggdGhyb3VnaHB1dCB0bworICogIGl0IGluIHRoZSBtZXNoCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBiYXRhZHZfdl9nd190aHJvdWdocHV0X2dldChzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUsIHUzMiAqYncpCit7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9pZmluZm8gPSBOVUxMOworCXN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGU7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXI7CisJaW50IHJldCA9IC0xOworCisJb3JpZ19ub2RlID0gZ3dfbm9kZS0+b3JpZ19ub2RlOworCXJvdXRlciA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQob3JpZ19ub2RlLCBCQVRBRFZfSUZfREVGQVVMVCk7CisJaWYgKCFyb3V0ZXIpCisJCWdvdG8gb3V0OworCisJcm91dGVyX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlciwgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyX2lmaW5mbykKKwkJZ290byBvdXQ7CisKKwkvKiB0aGUgR1cgbWV0cmljIGlzIGNvbXB1dGVkIGFzIHRoZSBtaW5pbXVtIGJldHdlZW4gdGhlIHBhdGggdGhyb3VnaHB1dAorCSAqIHRvIHJlYWNoIHRoZSBHVyBpdHNlbGYgYW5kIHRoZSBhZHZlcnRpc2VkIGJhbmR3aWR0aC4KKwkgKiBUaGlzIGdpdmVzIHVzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGVmZmVjdGl2ZSB0aHJvdWdocHV0IHRoYXQgdGhlCisJICogY2xpZW50IGNhbiBleHBlY3QgdmlhIHRoaXMgcGFydGljdWxhciBHVyBub2RlCisJICovCisJKmJ3ID0gcm91dGVyX2lmaW5mby0+YmF0X3YudGhyb3VnaHB1dDsKKwkqYncgPSBtaW5fdCh1MzIsICpidywgZ3dfbm9kZS0+YmFuZHdpZHRoX2Rvd24pOworCisJcmV0ID0gMDsKK291dDoKKwlpZiAocm91dGVyKQorCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyKTsKKwlpZiAocm91dGVyX2lmaW5mbykKKwkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX2lmaW5mbyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGJhdGFkdl92X2d3X2dldF9iZXN0X2d3X25vZGUgLSByZXRyaWV2ZSB0aGUgYmVzdCBHVyBub2RlCisgKiBAYmF0X3ByaXY6IHRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqCisgKiBSZXR1cm46IHRoZSBHVyBub2RlIGhhdmluZyB0aGUgYmVzdCBHVy1tZXRyaWMsIE5VTEwgaWYgbm8gR1cgaXMga25vd24KKyAqLworc3RhdGljIHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqCitiYXRhZHZfdl9nd19nZXRfYmVzdF9nd19ub2RlKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpCit7CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlLCAqY3Vycl9ndyA9IE5VTEw7CisJdTMyIG1heF9idyA9IDAsIGJ3OworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShnd19ub2RlLCAmYmF0X3ByaXYtPmd3Lmxpc3QsIGxpc3QpIHsKKwkJaWYgKCFrcmVmX2dldF91bmxlc3NfemVybygmZ3dfbm9kZS0+cmVmY291bnQpKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhdGFkdl92X2d3X3Rocm91Z2hwdXRfZ2V0KGd3X25vZGUsICZidykgPCAwKQorCQkJZ290byBuZXh0OworCisJCWlmIChjdXJyX2d3ICYmIChidyA8PSBtYXhfYncpKQorCQkJZ290byBuZXh0OworCisJCWlmIChjdXJyX2d3KQorCQkJYmF0YWR2X2d3X25vZGVfcHV0KGN1cnJfZ3cpOworCisJCWN1cnJfZ3cgPSBnd19ub2RlOworCQlrcmVmX2dldCgmY3Vycl9ndy0+cmVmY291bnQpOworCQltYXhfYncgPSBidzsKKworbmV4dDoKKwkJYmF0YWR2X2d3X25vZGVfcHV0KGd3X25vZGUpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBjdXJyX2d3OworfQorCisvKioKKyAqIGJhdGFkdl92X2d3X2lzX2VsaWdpYmxlIC0gY2hlY2sgaWYgYSBvcmlnaW5hdG9yIHdvdWxkIGJlIHNlbGVjdGVkIGFzIEdXCisgKiBAYmF0X3ByaXY6IHRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBjdXJyX2d3X29yaWc6IG9yaWdpbmF0b3IgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgR1cKKyAqIEBvcmlnX25vZGU6IHRoZSBvcmlnaW5hdG9yIHJlcHJlc2VudGluZyB0aGUgbmV3IGNhbmRpZGF0ZQorICoKKyAqIFJldHVybjogdHJ1ZSBpZiBvcmlnX25vZGUgY2FuIGJlIHNlbGVjdGVkIGFzIGN1cnJlbnQgR1csIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgYm9vbCBiYXRhZHZfdl9nd19pc19lbGlnaWJsZShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJCSAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqY3Vycl9nd19vcmlnLAorCQkJCSAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlKQoreworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqY3Vycl9ndyA9IE5VTEwsICpvcmlnX2d3ID0gTlVMTDsKKwl1MzIgZ3dfdGhyb3VnaHB1dCwgb3JpZ190aHJvdWdocHV0LCB0aHJlc2hvbGQ7CisJYm9vbCByZXQgPSBmYWxzZTsKKworCXRocmVzaG9sZCA9IGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKTsKKworCWN1cnJfZ3cgPSBiYXRhZHZfZ3dfbm9kZV9nZXQoYmF0X3ByaXYsIGN1cnJfZ3dfb3JpZyk7CisJaWYgKCFjdXJyX2d3KSB7CisJCXJldCA9IHRydWU7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChiYXRhZHZfdl9nd190aHJvdWdocHV0X2dldChjdXJyX2d3LCAmZ3dfdGhyb3VnaHB1dCkgPCAwKSB7CisJCXJldCA9IHRydWU7CisJCWdvdG8gb3V0OworCX0KKworCW9yaWdfZ3cgPSBiYXRhZHZfZ3dfbm9kZV9nZXQoYmF0X3ByaXYsIG9yaWdfbm9kZSk7CisJaWYgKCFvcmlnX25vZGUpCisJCWdvdG8gb3V0OworCisJaWYgKGJhdGFkdl92X2d3X3Rocm91Z2hwdXRfZ2V0KG9yaWdfZ3csICZvcmlnX3Rocm91Z2hwdXQpIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAob3JpZ190aHJvdWdocHV0IDwgZ3dfdGhyb3VnaHB1dCkKKwkJZ290byBvdXQ7CisKKwlpZiAoKG9yaWdfdGhyb3VnaHB1dCAtIGd3X3Rocm91Z2hwdXQpIDwgdGhyZXNob2xkKQorCQlnb3RvIG91dDsKKworCWJhdGFkdl9kYmcoQkFUQURWX0RCR19CQVRNQU4sIGJhdF9wcml2LAorCQkgICAiUmVzdGFydGluZyBnYXRld2F5IHNlbGVjdGlvbjogYmV0dGVyIGdhdGV3YXkgZm91bmQgKHRocm91Z2hwdXQgY3VycjogJXUsIHRocm91Z2hwdXQgbmV3OiAldSlcbiIsCisJCSAgIGd3X3Rocm91Z2hwdXQsIG9yaWdfdGhyb3VnaHB1dCk7CisKKwlyZXQgPSB0cnVlOworb3V0OgorCWlmIChjdXJyX2d3KQorCQliYXRhZHZfZ3dfbm9kZV9wdXQoY3Vycl9ndyk7CisJaWYgKG9yaWdfZ3cpCisJCWJhdGFkdl9nd19ub2RlX3B1dChvcmlnX2d3KTsKKworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCisvKiBmYWlscyBpZiBvcmlnX25vZGUgaGFzIG5vIHJvdXRlciAqLworc3RhdGljIGludCBiYXRhZHZfdl9nd193cml0ZV9idWZmZXJfdGV4dChzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJCQkgc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJCSBjb25zdCBzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUpCit7CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICpjdXJyX2d3OworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyOworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfaWZpbmZvID0gTlVMTDsKKwlpbnQgcmV0ID0gLTE7CisKKwlyb3V0ZXIgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KGd3X25vZGUtPm9yaWdfbm9kZSwgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyKQorCQlnb3RvIG91dDsKKworCXJvdXRlcl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXIsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcl9pZmluZm8pCisJCWdvdG8gb3V0OworCisJY3Vycl9ndyA9IGJhdGFkdl9nd19nZXRfc2VsZWN0ZWRfZ3dfbm9kZShiYXRfcHJpdik7CisKKwlzZXFfcHJpbnRmKHNlcSwgIiVzICVwTSAoJTl1LiUxdSkgJXBNIFslMTBzXTogJXUuJXUvJXUuJXUgTUJpdFxuIiwKKwkJICAgKGN1cnJfZ3cgPT0gZ3dfbm9kZSA/ICI9PiIgOiAiICAiKSwKKwkJICAgZ3dfbm9kZS0+b3JpZ19ub2RlLT5vcmlnLAorCQkgICByb3V0ZXJfaWZpbmZvLT5iYXRfdi50aHJvdWdocHV0IC8gMTAsCisJCSAgIHJvdXRlcl9pZmluZm8tPmJhdF92LnRocm91Z2hwdXQgJSAxMCwgcm91dGVyLT5hZGRyLAorCQkgICByb3V0ZXItPmlmX2luY29taW5nLT5uZXRfZGV2LT5uYW1lLAorCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfZG93biAvIDEwLAorCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfZG93biAlIDEwLAorCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfdXAgLyAxMCwKKwkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX3VwICUgMTApOworCXJldCA9IHNlcV9oYXNfb3ZlcmZsb3dlZChzZXEpID8gLTEgOiAwOworCisJaWYgKGN1cnJfZ3cpCisJCWJhdGFkdl9nd19ub2RlX3B1dChjdXJyX2d3KTsKK291dDoKKwlpZiAocm91dGVyX2lmaW5mbykKKwkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX2lmaW5mbyk7CisJaWYgKHJvdXRlcikKKwkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBiYXRhZHZfdl9nd19wcmludCAtIHByaW50IHRoZSBnYXRld2F5IGxpc3QKKyAqIEBiYXRfcHJpdjogdGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQHNlcTogZ2F0ZXdheSB0YWJsZSBzZXFfZmlsZSBzdHJ1Y3QKKyAqLworc3RhdGljIHZvaWQgYmF0YWR2X3ZfZ3dfcHJpbnQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgICAgIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZTsKKwlpbnQgZ3dfY291bnQgPSAwOworCisJc2VxX3B1dHMoc2VxLAorCQkgIiAgICAgIEdhdGV3YXkgICAgICAgICggdGhyb3VnaHB1dCkgICAgICAgICAgIE5leHRob3AgW291dGdvaW5nSUZdOiBhZHZlcnRpc2VkIHVwbGluayBiYW5kd2lkdGhcbiIpOworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShnd19ub2RlLCAmYmF0X3ByaXYtPmd3Lmxpc3QsIGxpc3QpIHsKKwkJLyogZmFpbHMgaWYgb3JpZ19ub2RlIGhhcyBubyByb3V0ZXIgKi8KKwkJaWYgKGJhdGFkdl92X2d3X3dyaXRlX2J1ZmZlcl90ZXh0KGJhdF9wcml2LCBzZXEsIGd3X25vZGUpIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWd3X2NvdW50Kys7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKGd3X2NvdW50ID09IDApCisJCXNlcV9wdXRzKHNlcSwgIk5vIGdhdGV3YXlzIGluIHJhbmdlIC4uLlxuIik7Cit9CisjZW5kaWYKKworLyoqCisgKiBiYXRhZHZfdl9nd19kdW1wX2VudHJ5IC0gRHVtcCBhIGdhdGV3YXkgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAZ3dfbm9kZTogR2F0ZXdheSB0byBiZSBkdW1wZWQKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGJhdGFkdl92X2d3X2R1bXBfZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCQkgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkJICBzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGUpCit7CisJc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9pZmluZm8gPSBOVUxMOworCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyOworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqY3Vycl9ndzsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl2b2lkICpoZHI7CisKKwlyb3V0ZXIgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KGd3X25vZGUtPm9yaWdfbm9kZSwgQkFUQURWX0lGX0RFRkFVTFQpOworCWlmICghcm91dGVyKQorCQlnb3RvIG91dDsKKworCXJvdXRlcl9pZmluZm8gPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXIsIEJBVEFEVl9JRl9ERUZBVUxUKTsKKwlpZiAoIXJvdXRlcl9pZmluZm8pCisJCWdvdG8gb3V0OworCisJY3Vycl9ndyA9IGJhdGFkdl9nd19nZXRfc2VsZWN0ZWRfZ3dfbm9kZShiYXRfcHJpdik7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LAorCQkJICBOTE1fRl9NVUxUSSwgQkFUQURWX0NNRF9HRVRfR0FURVdBWVMpOworCWlmICghaGRyKSB7CisJCXJldCA9IC1FTk9CVUZTOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAtRU1TR1NJWkU7CisKKwlpZiAoY3Vycl9ndyA9PSBnd19ub2RlKSB7CisJCWlmIChubGFfcHV0X2ZsYWcobXNnLCBCQVRBRFZfQVRUUl9GTEFHX0JFU1QpKSB7CisJCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfT1JJR19BRERSRVNTLCBFVEhfQUxFTiwKKwkJICAgIGd3X25vZGUtPm9yaWdfbm9kZS0+b3JpZykpIHsKKwkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9USFJPVUdIUFVULAorCQkJcm91dGVyX2lmaW5mby0+YmF0X3YudGhyb3VnaHB1dCkpIHsKKwkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX1JPVVRFUiwgRVRIX0FMRU4sIHJvdXRlci0+YWRkcikpIHsKKwkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobmxhX3B1dF9zdHJpbmcobXNnLCBCQVRBRFZfQVRUUl9IQVJEX0lGTkFNRSwKKwkJCSAgIHJvdXRlci0+aWZfaW5jb21pbmctPm5ldF9kZXYtPm5hbWUpKSB7CisJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfQkFORFdJRFRIX0RPV04sCisJCQlnd19ub2RlLT5iYW5kd2lkdGhfZG93bikpIHsKKwkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9CQU5EV0lEVEhfVVAsIGd3X25vZGUtPmJhbmR3aWR0aF91cCkpIHsKKwkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQlnb3RvIG91dDsKKwl9CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0ID0gMDsKKworb3V0OgorCWlmIChyb3V0ZXJfaWZpbmZvKQorCQliYXRhZHZfbmVpZ2hfaWZpbmZvX3B1dChyb3V0ZXJfaWZpbmZvKTsKKwlpZiAocm91dGVyKQorCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGJhdGFkdl92X2d3X2R1bXAgLSBEdW1wIGdhdGV3YXlzIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IENvbnRyb2wgYmxvY2sgY29udGFpbmluZyBhZGRpdGlvbmFsIG9wdGlvbnMKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBiYXRhZHZfdl9nd19kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCSAgICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdikKK3sKKwlpbnQgcG9ydGlkID0gTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQ7CisJc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlOworCWludCBpZHhfc2tpcCA9IGNiLT5hcmdzWzBdOworCWludCBpZHggPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShnd19ub2RlLCAmYmF0X3ByaXYtPmd3Lmxpc3QsIGxpc3QpIHsKKwkJaWYgKGlkeCsrIDwgaWR4X3NraXApCisJCQljb250aW51ZTsKKworCQlpZiAoYmF0YWR2X3ZfZ3dfZHVtcF9lbnRyeShtc2csIHBvcnRpZCwgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkgICBiYXRfcHJpdiwgZ3dfbm9kZSkpIHsKKwkJCWlkeF9za2lwID0gaWR4IC0gMTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfQorCisJaWR4X3NraXAgPSBpZHg7Cit1bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwljYi0+YXJnc1swXSA9IGlkeF9za2lwOworfQorCiBzdGF0aWMgc3RydWN0IGJhdGFkdl9hbGdvX29wcyBiYXRhZHZfYmF0bWFuX3YgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZSA9ICJCQVRNQU5fViIsCiAJLmlmYWNlID0gewpAQCAtMzMzLDEwICsxMDQwLDI2IEBACiAJCS5oYXJkaWZfaW5pdCA9IGJhdGFkdl92X2hhcmRpZl9uZWlnaF9pbml0LAogCQkuY21wID0gYmF0YWR2X3ZfbmVpZ2hfY21wLAogCQkuaXNfc2ltaWxhcl9vcl9iZXR0ZXIgPSBiYXRhZHZfdl9uZWlnaF9pc19zb2IsCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogCQkucHJpbnQgPSBiYXRhZHZfdl9uZWlnaF9wcmludCwKKyNlbmRpZgorCQkuZHVtcCA9IGJhdGFkdl92X25laWdoX2R1bXAsCiAJfSwKIAkub3JpZyA9IHsKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAJCS5wcmludCA9IGJhdGFkdl92X29yaWdfcHJpbnQsCisjZW5kaWYKKwkJLmR1bXAgPSBiYXRhZHZfdl9vcmlnX2R1bXAsCisJfSwKKwkuZ3cgPSB7CisJCS5zdG9yZV9zZWxfY2xhc3MgPSBiYXRhZHZfdl9zdG9yZV9zZWxfY2xhc3MsCisJCS5zaG93X3NlbF9jbGFzcyA9IGJhdGFkdl92X3Nob3dfc2VsX2NsYXNzLAorCQkuZ2V0X2Jlc3RfZ3dfbm9kZSA9IGJhdGFkdl92X2d3X2dldF9iZXN0X2d3X25vZGUsCisJCS5pc19lbGlnaWJsZSA9IGJhdGFkdl92X2d3X2lzX2VsaWdpYmxlLAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKKwkJLnByaW50ID0gYmF0YWR2X3ZfZ3dfcHJpbnQsCisjZW5kaWYKKwkJLmR1bXAgPSBiYXRhZHZfdl9nd19kdW1wLAogCX0sCiB9OwogCkBAIC0zNjMsNyArMTA4NiwxNiBAQAogICovCiBpbnQgYmF0YWR2X3ZfbWVzaF9pbml0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpCiB7Ci0JcmV0dXJuIGJhdGFkdl92X29nbV9pbml0KGJhdF9wcml2KTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IGJhdGFkdl92X29nbV9pbml0KGJhdF9wcml2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNldCBkZWZhdWx0IHRocm91Z2hwdXQgZGlmZmVyZW5jZSB0aHJlc2hvbGQgdG8gNU1icHMgKi8KKwlhdG9taWNfc2V0KCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzLCA1MCk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9iYXRfdl9lbHAuYyBiL25ldC9iYXRtYW4tYWR2L2JhdF92X2VscC5jCmluZGV4IDdkMTcwMDEuLmVlMDg1NDAgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2JhdF92X2VscC5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2JhdF92X2VscC5jCkBAIC0zMzUsNyArMzM1LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlza2JfcmVzZXJ2ZShoYXJkX2lmYWNlLT5iYXRfdi5lbHBfc2tiLCBFVEhfSExFTiArIE5FVF9JUF9BTElHTik7Ci0JZWxwX2J1ZmYgPSBza2JfcHVzaChoYXJkX2lmYWNlLT5iYXRfdi5lbHBfc2tiLCBCQVRBRFZfRUxQX0hMRU4pOworCWVscF9idWZmID0gc2tiX3B1dChoYXJkX2lmYWNlLT5iYXRfdi5lbHBfc2tiLCBCQVRBRFZfRUxQX0hMRU4pOwogCWVscF9wYWNrZXQgPSAoc3RydWN0IGJhdGFkdl9lbHBfcGFja2V0ICopZWxwX2J1ZmY7CiAJbWVtc2V0KGVscF9wYWNrZXQsIDAsIEJBVEFEVl9FTFBfSExFTik7CiAKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2JhdF92X29nbS5jIGIvbmV0L2JhdG1hbi1hZHYvYmF0X3Zfb2dtLmMKaW5kZXggNmZiYmE0ZS4uMWFlZWFkYyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvYmF0X3Zfb2dtLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvYmF0X3Zfb2dtLmMKQEAgLTczLDEzICs3MywxMiBAQAogCWlmICghb3JpZ19ub2RlKQogCQlyZXR1cm4gTlVMTDsKIAorCWtyZWZfZ2V0KCZvcmlnX25vZGUtPnJlZmNvdW50KTsKIAloYXNoX2FkZGVkID0gYmF0YWR2X2hhc2hfYWRkKGJhdF9wcml2LT5vcmlnX2hhc2gsIGJhdGFkdl9jb21wYXJlX29yaWcsCiAJCQkJICAgICBiYXRhZHZfY2hvb3NlX29yaWcsIG9yaWdfbm9kZSwKIAkJCQkgICAgICZvcmlnX25vZGUtPmhhc2hfZW50cnkpOwogCWlmIChoYXNoX2FkZGVkICE9IDApIHsKLQkJLyogb3JpZ19ub2RlLT5yZWZjb3VudGVyIGlzIGluaXRpYWxpc2VkIHRvIDIgYnkKLQkJICogYmF0YWR2X29yaWdfbm9kZV9uZXcoKQotCQkgKi8KKwkJLyogcmVtb3ZlIHJlZmNudCBmb3IgbmV3bHkgY3JlYXRlZCBvcmlnX25vZGUgYW5kIGhhc2ggZW50cnkgKi8KIAkJYmF0YWR2X29yaWdfbm9kZV9wdXQob3JpZ19ub2RlKTsKIAkJYmF0YWR2X29yaWdfbm9kZV9wdXQob3JpZ19ub2RlKTsKIAkJb3JpZ19ub2RlID0gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2JyaWRnZV9sb29wX2F2b2lkYW5jZS5jIGIvbmV0L2JhdG1hbi1hZHYvYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmMKaW5kZXggYWQyZmZlMS4uZTdmNjkwYiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtNDUsMTIgKzQ2LDE4IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9iYXRtYW5fYWR2Lmg+CiAKICNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgogI2luY2x1ZGUgImhhc2guaCIKICNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJuZXRsaW5rLmgiCiAjaW5jbHVkZSAib3JpZ2luYXRvci5oIgogI2luY2x1ZGUgInBhY2tldC5oIgorI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAic3lzZnMuaCIKICNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgogCkBAIC01MTksMTEgKzUyNiw5IEBACiAJYXRvbWljX3NldCgmZW50cnktPndhaXRfcGVyaW9kcywgMCk7CiAJZXRoZXJfYWRkcl9jb3B5KGVudHJ5LT5vcmlnLCBvcmlnKTsKIAlJTklUX1dPUksoJmVudHJ5LT5yZXBvcnRfd29yaywgYmF0YWR2X2JsYV9sb29wZGV0ZWN0X3JlcG9ydCk7Ci0KLQkvKiBvbmUgZm9yIHRoZSBoYXNoLCBvbmUgZm9yIHJldHVybmluZyAqLwogCWtyZWZfaW5pdCgmZW50cnktPnJlZmNvdW50KTsKLQlrcmVmX2dldCgmZW50cnktPnJlZmNvdW50KTsKIAorCWtyZWZfZ2V0KCZlbnRyeS0+cmVmY291bnQpOwogCWhhc2hfYWRkZWQgPSBiYXRhZHZfaGFzaF9hZGQoYmF0X3ByaXYtPmJsYS5iYWNrYm9uZV9oYXNoLAogCQkJCSAgICAgYmF0YWR2X2NvbXBhcmVfYmFja2JvbmVfZ3csCiAJCQkJICAgICBiYXRhZHZfY2hvb3NlX2JhY2tib25lX2d3LCBlbnRyeSwKQEAgLTcxMSwxMiArNzE2LDEzIEBACiAJCWNsYWltLT5sYXN0dGltZSA9IGppZmZpZXM7CiAJCWtyZWZfZ2V0KCZiYWNrYm9uZV9ndy0+cmVmY291bnQpOwogCQljbGFpbS0+YmFja2JvbmVfZ3cgPSBiYWNrYm9uZV9ndzsKLQogCQlrcmVmX2luaXQoJmNsYWltLT5yZWZjb3VudCk7Ci0JCWtyZWZfZ2V0KCZjbGFpbS0+cmVmY291bnQpOworCiAJCWJhdGFkdl9kYmcoQkFUQURWX0RCR19CTEEsIGJhdF9wcml2LAogCQkJICAgImJsYV9hZGRfY2xhaW0oKTogYWRkaW5nIG5ldyBlbnRyeSAlcE0sIHZpZCAlZCB0byBoYXNoIC4uLlxuIiwKIAkJCSAgIG1hYywgQkFUQURWX1BSSU5UX1ZJRCh2aWQpKTsKKworCQlrcmVmX2dldCgmY2xhaW0tPnJlZmNvdW50KTsKIAkJaGFzaF9hZGRlZCA9IGJhdGFkdl9oYXNoX2FkZChiYXRfcHJpdi0+YmxhLmNsYWltX2hhc2gsCiAJCQkJCSAgICAgYmF0YWR2X2NvbXBhcmVfY2xhaW0sCiAJCQkJCSAgICAgYmF0YWR2X2Nob29zZV9jbGFpbSwgY2xhaW0sCkBAIC0xMTQ4LDcgKzExNTQsNyBAQAogCiAJLyogTGV0IHRoZSBsb29wZGV0ZWN0IGZyYW1lcyBvbiB0aGUgbWVzaCBpbiBhbnkgY2FzZS4gKi8KIAlpZiAoYmxhX2RzdC0+dHlwZSA9PSBCQVRBRFZfQ0xBSU1fVFlQRV9MT09QREVURUNUKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCiAJLyogY2hlY2sgaWYgaXQgaXMgYSBjbGFpbSBmcmFtZS4gKi8KIAlyZXQgPSBiYXRhZHZfY2hlY2tfY2xhaW1fZ3JvdXAoYmF0X3ByaXYsIHByaW1hcnlfaWYsIGh3X3NyYywgaHdfZHN0LApAQCAtMTk5MCw2ICsxOTk2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogLyoqCiAgKiBiYXRhZHZfYmxhX2NsYWltX3RhYmxlX3NlcV9wcmludF90ZXh0IC0gcHJpbnQgdGhlIGNsYWltIHRhYmxlIGluIGEgc2VxIGZpbGUKICAqIEBzZXE6IHNlcSBmaWxlIHRvIHByaW50IG9uCkBAIC0yMDUwLDggKzIwNTcsMTcyIEBACiAJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOwogCXJldHVybiAwOwogfQorI2VuZGlmCiAKIC8qKgorICogYmF0YWR2X2JsYV9jbGFpbV9kdW1wX2VudHJ5IC0gZHVtcCBvbmUgZW50cnkgb2YgdGhlIGNsYWltIHRhYmxlCisgKiB0byBhIG5ldGxpbmsgc29ja2V0CisgKiBAbXNnOiBidWZmZXIgZm9yIHRoZSBtZXNzYWdlCisgKiBAcG9ydGlkOiBuZXRsaW5rIHBvcnQKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBwcmltYXJ5X2lmOiBwcmltYXJ5IGludGVyZmFjZQorICogQGNsYWltOiBlbnRyeSB0byBkdW1wCisgKgorICogUmV0dXJuOiAwIG9yIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl9ibGFfY2xhaW1fZHVtcF9lbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiwKKwkJCSAgICBzdHJ1Y3QgYmF0YWR2X2JsYV9jbGFpbSAqY2xhaW0pCit7CisJdTggKnByaW1hcnlfYWRkciA9IHByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyOworCXUxNiBiYWNrYm9uZV9jcmM7CisJYm9vbCBpc19vd247CisJdm9pZCAqaGRyOworCWludCByZXQgPSAtRUlOVkFMOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwKKwkJCSAgTkxNX0ZfTVVMVEksIEJBVEFEVl9DTURfR0VUX0JMQV9DTEFJTSk7CisJaWYgKCFoZHIpIHsKKwkJcmV0ID0gLUVOT0JVRlM7CisJCWdvdG8gb3V0OworCX0KKworCWlzX293biA9IGJhdGFkdl9jb21wYXJlX2V0aChjbGFpbS0+YmFja2JvbmVfZ3ctPm9yaWcsCisJCQkJICAgIHByaW1hcnlfYWRkcik7CisKKwlzcGluX2xvY2tfYmgoJmNsYWltLT5iYWNrYm9uZV9ndy0+Y3JjX2xvY2spOworCWJhY2tib25lX2NyYyA9IGNsYWltLT5iYWNrYm9uZV9ndy0+Y3JjOworCXNwaW5fdW5sb2NrX2JoKCZjbGFpbS0+YmFja2JvbmVfZ3ctPmNyY19sb2NrKTsKKworCWlmIChpc19vd24pCisJCWlmIChubGFfcHV0X2ZsYWcobXNnLCBCQVRBRFZfQVRUUl9CTEFfT1dOKSkgeworCQkJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCQkJZ290byBvdXQ7CisJCX0KKworCWlmIChubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfQkxBX0FERFJFU1MsIEVUSF9BTEVOLCBjbGFpbS0+YWRkcikgfHwKKwkgICAgbmxhX3B1dF91MTYobXNnLCBCQVRBRFZfQVRUUl9CTEFfVklELCBjbGFpbS0+dmlkKSB8fAorCSAgICBubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfQkxBX0JBQ0tCT05FLCBFVEhfQUxFTiwKKwkJICAgIGNsYWltLT5iYWNrYm9uZV9ndy0+b3JpZykgfHwKKwkgICAgbmxhX3B1dF91MTYobXNnLCBCQVRBRFZfQVRUUl9CTEFfQ1JDLAorCQkJYmFja2JvbmVfY3JjKSkgeworCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCWdvdG8gb3V0OworCX0KKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXQgPSAwOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBiYXRhZHZfYmxhX2NsYWltX2R1bXBfYnVja2V0IC0gZHVtcCBvbmUgYnVja2V0IG9mIHRoZSBjbGFpbSB0YWJsZQorICogdG8gYSBuZXRsaW5rIHNvY2tldAorICogQG1zZzogYnVmZmVyIGZvciB0aGUgbWVzc2FnZQorICogQHBvcnRpZDogbmV0bGluayBwb3J0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAcHJpbWFyeV9pZjogcHJpbWFyeSBpbnRlcmZhY2UKKyAqIEBoZWFkOiBidWNrZXQgdG8gZHVtcAorICogQGlkeF9za2lwOiBIb3cgbWFueSBlbnRyaWVzIHRvIHNraXAKKyAqCisgKiBSZXR1cm46IGFsd2F5cyAwLgorICovCitzdGF0aWMgaW50CitiYXRhZHZfYmxhX2NsYWltX2R1bXBfYnVja2V0KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiwKKwkJCSAgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIGludCAqaWR4X3NraXApCit7CisJc3RydWN0IGJhdGFkdl9ibGFfY2xhaW0gKmNsYWltOworCWludCBpZHggPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjbGFpbSwgaGVhZCwgaGFzaF9lbnRyeSkgeworCQlpZiAoaWR4KysgPCAqaWR4X3NraXApCisJCQljb250aW51ZTsKKwkJaWYgKGJhdGFkdl9ibGFfY2xhaW1fZHVtcF9lbnRyeShtc2csIHBvcnRpZCwgc2VxLAorCQkJCQkJcHJpbWFyeV9pZiwgY2xhaW0pKSB7CisJCQkqaWR4X3NraXAgPSBpZHggLSAxOworCQkJZ290byB1bmxvY2s7CisJCX0KKwl9CisKKwkqaWR4X3NraXAgPSBpZHg7Cit1bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYmF0YWR2X2JsYV9jbGFpbV9kdW1wIC0gZHVtcCBjbGFpbSB0YWJsZSB0byBhIG5ldGxpbmsgc29ja2V0CisgKiBAbXNnOiBidWZmZXIgZm9yIHRoZSBtZXNzYWdlCisgKiBAY2I6IGNhbGxiYWNrIHN0cnVjdHVyZSBjb250YWluaW5nIGFyZ3VtZW50cworICoKKyAqIFJldHVybjogbWVzc2FnZSBsZW5ndGguCisgKi8KK2ludCBiYXRhZHZfYmxhX2NsYWltX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiA9IE5VTEw7CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KGNiLT5za2ItPnNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKKwlzdHJ1Y3QgYmF0YWR2X2hhc2h0YWJsZSAqaGFzaDsKKwlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2OworCWludCBidWNrZXQgPSBjYi0+YXJnc1swXTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlpbnQgaWR4ID0gY2ItPmFyZ3NbMV07CisJaW50IGlmaW5kZXg7CisJaW50IHJldCA9IDA7CisKKwlpZmluZGV4ID0gYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY2ItPm5saCwKKwkJCQkJICAgICBCQVRBRFZfQVRUUl9NRVNIX0lGSU5ERVgpOworCWlmICghaWZpbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzb2Z0X2lmYWNlID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGlmaW5kZXgpOworCWlmICghc29mdF9pZmFjZSB8fCAhYmF0YWR2X3NvZnRpZl9pc192YWxpZChzb2Z0X2lmYWNlKSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwliYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOworCWhhc2ggPSBiYXRfcHJpdi0+YmxhLmNsYWltX2hhc2g7CisKKwlwcmltYXJ5X2lmID0gYmF0YWR2X3ByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKKwlpZiAoIXByaW1hcnlfaWYgfHwgcHJpbWFyeV9pZi0+aWZfc3RhdHVzICE9IEJBVEFEVl9JRl9BQ1RJVkUpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKGJ1Y2tldCA8IGhhc2gtPnNpemUpIHsKKwkJaGVhZCA9ICZoYXNoLT50YWJsZVtidWNrZXRdOworCisJCWlmIChiYXRhZHZfYmxhX2NsYWltX2R1bXBfYnVja2V0KG1zZywgcG9ydGlkLAorCQkJCQkJIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJCSBwcmltYXJ5X2lmLCBoZWFkLCAmaWR4KSkKKwkJCWJyZWFrOworCQlidWNrZXQrKzsKKwl9CisKKwljYi0+YXJnc1swXSA9IGJ1Y2tldDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKKworCXJldCA9IG1zZy0+bGVuOworCitvdXQ6CisJaWYgKHByaW1hcnlfaWYpCisJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOworCisJaWYgKHNvZnRfaWZhY2UpCisJCWRldl9wdXQoc29mdF9pZmFjZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUworLyoqCiAgKiBiYXRhZHZfYmxhX2JhY2tib25lX3RhYmxlX3NlcV9wcmludF90ZXh0IC0gcHJpbnQgdGhlIGJhY2tib25lIHRhYmxlIGluIGEgc2VxCiAgKiAgZmlsZQogICogQHNlcTogc2VxIGZpbGUgdG8gcHJpbnQgb24KQEAgLTIxMTQsMyArMjI4NSwxNjggQEAKIAkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKKworLyoqCisgKiBiYXRhZHZfYmxhX2JhY2tib25lX2R1bXBfZW50cnkgLSBkdW1wIG9uZSBlbnRyeSBvZiB0aGUgYmFja2JvbmUgdGFibGUKKyAqIHRvIGEgbmV0bGluayBzb2NrZXQKKyAqIEBtc2c6IGJ1ZmZlciBmb3IgdGhlIG1lc3NhZ2UKKyAqIEBwb3J0aWQ6IG5ldGxpbmsgcG9ydAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQHByaW1hcnlfaWY6IHByaW1hcnkgaW50ZXJmYWNlCisgKiBAYmFja2JvbmVfZ3c6IGVudHJ5IHRvIGR1bXAKKyAqCisgKiBSZXR1cm46IDAgb3IgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludAorYmF0YWR2X2JsYV9iYWNrYm9uZV9kdW1wX2VudHJ5KHN0cnVjdCBza19idWZmICptc2csIHUzMiBwb3J0aWQsIHUzMiBzZXEsCisJCQkgICAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmLAorCQkJICAgICAgIHN0cnVjdCBiYXRhZHZfYmxhX2JhY2tib25lX2d3ICpiYWNrYm9uZV9ndykKK3sKKwl1OCAqcHJpbWFyeV9hZGRyID0gcHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHI7CisJdTE2IGJhY2tib25lX2NyYzsKKwlib29sIGlzX293bjsKKwlpbnQgbXNlY3M7CisJdm9pZCAqaGRyOworCWludCByZXQgPSAtRUlOVkFMOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwKKwkJCSAgTkxNX0ZfTVVMVEksIEJBVEFEVl9DTURfR0VUX0JMQV9CQUNLQk9ORSk7CisJaWYgKCFoZHIpIHsKKwkJcmV0ID0gLUVOT0JVRlM7CisJCWdvdG8gb3V0OworCX0KKworCWlzX293biA9IGJhdGFkdl9jb21wYXJlX2V0aChiYWNrYm9uZV9ndy0+b3JpZywgcHJpbWFyeV9hZGRyKTsKKworCXNwaW5fbG9ja19iaCgmYmFja2JvbmVfZ3ctPmNyY19sb2NrKTsKKwliYWNrYm9uZV9jcmMgPSBiYWNrYm9uZV9ndy0+Y3JjOworCXNwaW5fdW5sb2NrX2JoKCZiYWNrYm9uZV9ndy0+Y3JjX2xvY2spOworCisJbXNlY3MgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBiYWNrYm9uZV9ndy0+bGFzdHRpbWUpOworCisJaWYgKGlzX293bikKKwkJaWYgKG5sYV9wdXRfZmxhZyhtc2csIEJBVEFEVl9BVFRSX0JMQV9PV04pKSB7CisJCQlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJaWYgKG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9CTEFfQkFDS0JPTkUsIEVUSF9BTEVOLAorCQkgICAgYmFja2JvbmVfZ3ctPm9yaWcpIHx8CisJICAgIG5sYV9wdXRfdTE2KG1zZywgQkFUQURWX0FUVFJfQkxBX1ZJRCwgYmFja2JvbmVfZ3ctPnZpZCkgfHwKKwkgICAgbmxhX3B1dF91MTYobXNnLCBCQVRBRFZfQVRUUl9CTEFfQ1JDLAorCQkJYmFja2JvbmVfY3JjKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX0xBU1RfU0VFTl9NU0VDUywgbXNlY3MpKSB7CisJCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwkJZ290byBvdXQ7CisJfQorCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldCA9IDA7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGJhdGFkdl9ibGFfYmFja2JvbmVfZHVtcF9idWNrZXQgLSBkdW1wIG9uZSBidWNrZXQgb2YgdGhlIGJhY2tib25lIHRhYmxlCisgKiB0byBhIG5ldGxpbmsgc29ja2V0CisgKiBAbXNnOiBidWZmZXIgZm9yIHRoZSBtZXNzYWdlCisgKiBAcG9ydGlkOiBuZXRsaW5rIHBvcnQKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBwcmltYXJ5X2lmOiBwcmltYXJ5IGludGVyZmFjZQorICogQGhlYWQ6IGJ1Y2tldCB0byBkdW1wCisgKiBAaWR4X3NraXA6IEhvdyBtYW55IGVudHJpZXMgdG8gc2tpcAorICoKKyAqIFJldHVybjogYWx3YXlzIDAuCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl9ibGFfYmFja2JvbmVfZHVtcF9idWNrZXQoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCQlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYsCisJCQkJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIGludCAqaWR4X3NraXApCit7CisJc3RydWN0IGJhdGFkdl9ibGFfYmFja2JvbmVfZ3cgKmJhY2tib25lX2d3OworCWludCBpZHggPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiYWNrYm9uZV9ndywgaGVhZCwgaGFzaF9lbnRyeSkgeworCQlpZiAoaWR4KysgPCAqaWR4X3NraXApCisJCQljb250aW51ZTsKKwkJaWYgKGJhdGFkdl9ibGFfYmFja2JvbmVfZHVtcF9lbnRyeShtc2csIHBvcnRpZCwgc2VxLAorCQkJCQkJICAgcHJpbWFyeV9pZiwgYmFja2JvbmVfZ3cpKSB7CisJCQkqaWR4X3NraXAgPSBpZHggLSAxOworCQkJZ290byB1bmxvY2s7CisJCX0KKwl9CisKKwkqaWR4X3NraXAgPSBpZHg7Cit1bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogYmF0YWR2X2JsYV9iYWNrYm9uZV9kdW1wIC0gZHVtcCBiYWNrYm9uZSB0YWJsZSB0byBhIG5ldGxpbmsgc29ja2V0CisgKiBAbXNnOiBidWZmZXIgZm9yIHRoZSBtZXNzYWdlCisgKiBAY2I6IGNhbGxiYWNrIHN0cnVjdHVyZSBjb250YWluaW5nIGFyZ3VtZW50cworICoKKyAqIFJldHVybjogbWVzc2FnZSBsZW5ndGguCisgKi8KK2ludCBiYXRhZHZfYmxhX2JhY2tib25lX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiA9IE5VTEw7CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KGNiLT5za2ItPnNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKKwlzdHJ1Y3QgYmF0YWR2X2hhc2h0YWJsZSAqaGFzaDsKKwlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2OworCWludCBidWNrZXQgPSBjYi0+YXJnc1swXTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlpbnQgaWR4ID0gY2ItPmFyZ3NbMV07CisJaW50IGlmaW5kZXg7CisJaW50IHJldCA9IDA7CisKKwlpZmluZGV4ID0gYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY2ItPm5saCwKKwkJCQkJICAgICBCQVRBRFZfQVRUUl9NRVNIX0lGSU5ERVgpOworCWlmICghaWZpbmRleCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzb2Z0X2lmYWNlID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGlmaW5kZXgpOworCWlmICghc29mdF9pZmFjZSB8fCAhYmF0YWR2X3NvZnRpZl9pc192YWxpZChzb2Z0X2lmYWNlKSkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwliYXRfcHJpdiA9IG5ldGRldl9wcml2KHNvZnRfaWZhY2UpOworCWhhc2ggPSBiYXRfcHJpdi0+YmxhLmJhY2tib25lX2hhc2g7CisKKwlwcmltYXJ5X2lmID0gYmF0YWR2X3ByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKKwlpZiAoIXByaW1hcnlfaWYgfHwgcHJpbWFyeV9pZi0+aWZfc3RhdHVzICE9IEJBVEFEVl9JRl9BQ1RJVkUpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKGJ1Y2tldCA8IGhhc2gtPnNpemUpIHsKKwkJaGVhZCA9ICZoYXNoLT50YWJsZVtidWNrZXRdOworCisJCWlmIChiYXRhZHZfYmxhX2JhY2tib25lX2R1bXBfYnVja2V0KG1zZywgcG9ydGlkLAorCQkJCQkJICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJCSAgICBwcmltYXJ5X2lmLCBoZWFkLCAmaWR4KSkKKwkJCWJyZWFrOworCQlidWNrZXQrKzsKKwl9CisKKwljYi0+YXJnc1swXSA9IGJ1Y2tldDsKKwljYi0+YXJnc1sxXSA9IGlkeDsKKworCXJldCA9IG1zZy0+bGVuOworCitvdXQ6CisJaWYgKHByaW1hcnlfaWYpCisJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOworCisJaWYgKHNvZnRfaWZhY2UpCisJCWRldl9wdXQoc29mdF9pZmFjZSk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmggYi9uZXQvYmF0bWFuLWFkdi9icmlkZ2VfbG9vcF9hdm9pZGFuY2UuaAppbmRleCAwZjAxZGFlLi4xYWU5M2U0IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9icmlkZ2VfbG9vcF9hdm9pZGFuY2UuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9icmlkZ2VfbG9vcF9hdm9pZGFuY2UuaApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIHN0cnVjdCBuZXRfZGV2aWNlOworc3RydWN0IG5ldGxpbmtfY2FsbGJhY2s7CiBzdHJ1Y3Qgc2VxX2ZpbGU7CiBzdHJ1Y3Qgc2tfYnVmZjsKIApAQCAtMzUsOCArMzYsMTAgQEAKIAkJCSAgICAgICBzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlLAogCQkJICAgICAgIGludCBoZHJfc2l6ZSk7CiBpbnQgYmF0YWR2X2JsYV9jbGFpbV90YWJsZV9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKK2ludCBiYXRhZHZfYmxhX2NsYWltX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIGludCBiYXRhZHZfYmxhX2JhY2tib25lX3RhYmxlX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLAogCQkJCQkgICAgIHZvaWQgKm9mZnNldCk7CitpbnQgYmF0YWR2X2JsYV9iYWNrYm9uZV9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiBib29sIGJhdGFkdl9ibGFfaXNfYmFja2JvbmVfZ3dfb3JpZyhzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LCB1OCAqb3JpZywKIAkJCQkgICAgdW5zaWduZWQgc2hvcnQgdmlkKTsKIGJvb2wgYmF0YWR2X2JsYV9jaGVja19iY2FzdF9kdXBsaXN0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCkBAIC00Nyw3ICs1MCw3IEBACiB2b2lkIGJhdGFkdl9ibGFfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2Rldik7CiBpbnQgYmF0YWR2X2JsYV9pbml0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpOwogdm9pZCBiYXRhZHZfYmxhX2ZyZWUoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdik7Ci0KK2ludCBiYXRhZHZfYmxhX2NsYWltX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKICNkZWZpbmUgQkFUQURWX0JMQV9DUkNfSU5JVAkwCiAjZWxzZSAvKiBpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9CTEEgKi8KIApAQCAtMTEyLDYgKzExNSwxOCBAQAogewogfQogCitzdGF0aWMgaW5saW5lIGludCBiYXRhZHZfYmxhX2NsYWltX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywKKwkJCQkJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmF0YWR2X2JsYV9iYWNrYm9uZV9kdW1wKHN0cnVjdCBza19idWZmICptc2csCisJCQkJCSAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKICNlbmRpZiAvKiBpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9CTEEgKi8KIAogI2VuZGlmIC8qIGlmbmRlZiBfTkVUX0JBVE1BTl9BRFZfQkxBX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9kZWJ1Z2ZzLmMgYi9uZXQvYmF0bWFuLWFkdi9kZWJ1Z2ZzLmMKaW5kZXggMWQ2OGI2ZS4uYjRmZmJhN2RkIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9kZWJ1Z2ZzLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvZGVidWdmcy5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogCiAjaW5jbHVkZSAiYmF0X2FsZ28uaCIKICNpbmNsdWRlICJicmlkZ2VfbG9vcF9hdm9pZGFuY2UuaCIKQEAgLTMwNSwxMiArMzA2LDE2IEBACiAgKi8KIGludCBiYXRhZHZfZGVidWdmc19hZGRfaGFyZGlmKHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGhhcmRfaWZhY2UtPm5ldF9kZXYpOwogCXN0cnVjdCBiYXRhZHZfZGVidWdpbmZvICoqYmF0X2RlYnVnOwogCXN0cnVjdCBkZW50cnkgKmZpbGU7CiAKIAlpZiAoIWJhdGFkdl9kZWJ1Z2ZzKQogCQlnb3RvIG91dDsKIAorCWlmIChuZXQgIT0gJmluaXRfbmV0KQorCQlyZXR1cm4gMDsKKwogCWhhcmRfaWZhY2UtPmRlYnVnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihoYXJkX2lmYWNlLT5uZXRfZGV2LT5uYW1lLAogCQkJCQkJICAgYmF0YWR2X2RlYnVnZnMpOwogCWlmICghaGFyZF9pZmFjZS0+ZGVidWdfZGlyKQpAQCAtMzQxLDYgKzM0NiwxMSBAQAogICovCiB2b2lkIGJhdGFkdl9kZWJ1Z2ZzX2RlbF9oYXJkaWYoc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlKQogeworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoaGFyZF9pZmFjZS0+bmV0X2Rldik7CisKKwlpZiAobmV0ICE9ICZpbml0X25ldCkKKwkJcmV0dXJuOworCiAJaWYgKGJhdGFkdl9kZWJ1Z2ZzKSB7CiAJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShoYXJkX2lmYWNlLT5kZWJ1Z19kaXIpOwogCQloYXJkX2lmYWNlLT5kZWJ1Z19kaXIgPSBOVUxMOwpAQCAtMzUxLDExICszNjEsMTUgQEAKIHsKIAlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgYmF0YWR2X2RlYnVnaW5mbyAqKmJhdF9kZWJ1ZzsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7CiAJc3RydWN0IGRlbnRyeSAqZmlsZTsKIAogCWlmICghYmF0YWR2X2RlYnVnZnMpCiAJCWdvdG8gb3V0OwogCisJaWYgKG5ldCAhPSAmaW5pdF9uZXQpCisJCXJldHVybiAwOworCiAJYmF0X3ByaXYtPmRlYnVnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihkZXYtPm5hbWUsIGJhdGFkdl9kZWJ1Z2ZzKTsKIAlpZiAoIWJhdF9wcml2LT5kZWJ1Z19kaXIpCiAJCWdvdG8gb3V0OwpAQCAtMzkyLDYgKzQwNiwxMCBAQAogdm9pZCBiYXRhZHZfZGVidWdmc19kZWxfbWVzaGlmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOworCisJaWYgKG5ldCAhPSAmaW5pdF9uZXQpCisJCXJldHVybjsKIAogCWJhdGFkdl9kZWJ1Z19sb2dfY2xlYW51cChiYXRfcHJpdik7CiAKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2RlYnVnZnMuaCBiL25ldC9iYXRtYW4tYWR2L2RlYnVnZnMuaAppbmRleCAxYWI0ZTJlNi4uYzY4ZmYzZCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvZGVidWdmcy5oCisrKyBiL25ldC9iYXRtYW4tYWR2L2RlYnVnZnMuaApAQCAtMjYsNyArMjYsNyBAQAogCiAjZGVmaW5lIEJBVEFEVl9ERUJVR0ZTX1NVQkRJUiAiYmF0bWFuX2FkdiIKIAotI2lmIElTX0VOQUJMRUQoQ09ORklHX0RFQlVHX0ZTKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUykKIAogdm9pZCBiYXRhZHZfZGVidWdmc19pbml0KHZvaWQpOwogdm9pZCBiYXRhZHZfZGVidWdmc19kZXN0cm95KHZvaWQpOwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvZGlzdHJpYnV0ZWQtYXJwLXRhYmxlLmMgYi9uZXQvYmF0bWFuLWFkdi9kaXN0cmlidXRlZC1hcnAtdGFibGUuYwppbmRleCBiMWNjOGJmLi5lMjU3ZWZkIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9kaXN0cmlidXRlZC1hcnAtdGFibGUuYworKysgYi9uZXQvYmF0bWFuLWFkdi9kaXN0cmlidXRlZC1hcnAtdGFibGUuYwpAQCAtMzQzLDggKzM0Myw4IEBACiAJZXRoZXJfYWRkcl9jb3B5KGRhdF9lbnRyeS0+bWFjX2FkZHIsIG1hY19hZGRyKTsKIAlkYXRfZW50cnktPmxhc3RfdXBkYXRlID0gamlmZmllczsKIAlrcmVmX2luaXQoJmRhdF9lbnRyeS0+cmVmY291bnQpOwotCWtyZWZfZ2V0KCZkYXRfZW50cnktPnJlZmNvdW50KTsKIAorCWtyZWZfZ2V0KCZkYXRfZW50cnktPnJlZmNvdW50KTsKIAloYXNoX2FkZGVkID0gYmF0YWR2X2hhc2hfYWRkKGJhdF9wcml2LT5kYXQuaGFzaCwgYmF0YWR2X2NvbXBhcmVfZGF0LAogCQkJCSAgICAgYmF0YWR2X2hhc2hfZGF0LCBkYXRfZW50cnksCiAJCQkJICAgICAmZGF0X2VudHJ5LT5oYXNoX2VudHJ5KTsKQEAgLTc5NSw2ICs3OTUsNyBAQAogCWJhdGFkdl9kYXRfaGFzaF9mcmVlKGJhdF9wcml2KTsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIC8qKgogICogYmF0YWR2X2RhdF9jYWNoZV9zZXFfcHJpbnRfdGV4dCAtIHByaW50IHRoZSBsb2NhbCBEQVQgaGFzaCB0YWJsZQogICogQHNlcTogc2VxIGZpbGUgdG8gcHJpbnQgb24KQEAgLTg0Niw2ICs4NDcsNyBAQAogCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgogCiAvKioKICAqIGJhdGFkdl9hcnBfZ2V0X3R5cGUgLSBwYXJzZSBhbiBBUlAgcGFja2V0IGFuZCBnZXRzIHRoZSB0eXBlCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5jIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuYwppbmRleCA2M2E4MDVkLi5kZTA1NWQ2IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KQEAgLTMxLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtMzksMTMgKzQxLDE3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYmF0bWFuX2Fkdi5oPgogCiAjaW5jbHVkZSAiZ2F0ZXdheV9jb21tb24uaCIKICNpbmNsdWRlICJoYXJkLWludGVyZmFjZS5oIgogI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgIm5ldGxpbmsuaCIKICNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCiAjaW5jbHVkZSAicGFja2V0LmgiCiAjaW5jbHVkZSAicm91dGluZy5oIgorI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAic3lzZnMuaCIKICNpbmNsdWRlICJ0cmFuc2xhdGlvbi10YWJsZS5oIgogCkBAIC04MCwxMiArODYsMTIgQEAKICAqIGJhdGFkdl9nd19ub2RlX3B1dCAtIGRlY3JlbWVudCB0aGUgZ3dfbm9kZSByZWZjb3VudGVyIGFuZCBwb3NzaWJseSByZWxlYXNlIGl0CiAgKiBAZ3dfbm9kZTogZ2F0ZXdheSBub2RlIHRvIGZyZWUKICAqLwotc3RhdGljIHZvaWQgYmF0YWR2X2d3X25vZGVfcHV0KHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSkKK3ZvaWQgYmF0YWR2X2d3X25vZGVfcHV0KHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSkKIHsKIAlrcmVmX3B1dCgmZ3dfbm9kZS0+cmVmY291bnQsIGJhdGFkdl9nd19ub2RlX3JlbGVhc2UpOwogfQogCi1zdGF0aWMgc3RydWN0IGJhdGFkdl9nd19ub2RlICoKK3N0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqCiBiYXRhZHZfZ3dfZ2V0X3NlbGVjdGVkX2d3X25vZGUoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdikKIHsKIAlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGU7CkBAIC0xNjQsODYgKzE3MCw2IEBACiAJYXRvbWljX3NldCgmYmF0X3ByaXYtPmd3LnJlc2VsZWN0LCAxKTsKIH0KIAotc3RhdGljIHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqCi1iYXRhZHZfZ3dfZ2V0X2Jlc3RfZ3dfbm9kZShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KQotewotCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyOwotCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfaWZpbmZvOwotCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSwgKmN1cnJfZ3cgPSBOVUxMOwotCXU2NCBtYXhfZ3dfZmFjdG9yID0gMDsKLQl1NjQgdG1wX2d3X2ZhY3RvciA9IDA7Ci0JdTggbWF4X3RxID0gMDsKLQl1OCB0cV9hdmc7Ci0Jc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ3dfbm9kZSwgJmJhdF9wcml2LT5ndy5saXN0LCBsaXN0KSB7Ci0JCW9yaWdfbm9kZSA9IGd3X25vZGUtPm9yaWdfbm9kZTsKLQkJcm91dGVyID0gYmF0YWR2X29yaWdfcm91dGVyX2dldChvcmlnX25vZGUsIEJBVEFEVl9JRl9ERUZBVUxUKTsKLQkJaWYgKCFyb3V0ZXIpCi0JCQljb250aW51ZTsKLQotCQlyb3V0ZXJfaWZpbmZvID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyLAotCQkJCQkJCUJBVEFEVl9JRl9ERUZBVUxUKTsKLQkJaWYgKCFyb3V0ZXJfaWZpbmZvKQotCQkJZ290byBuZXh0OwotCi0JCWlmICgha3JlZl9nZXRfdW5sZXNzX3plcm8oJmd3X25vZGUtPnJlZmNvdW50KSkKLQkJCWdvdG8gbmV4dDsKLQotCQl0cV9hdmcgPSByb3V0ZXJfaWZpbmZvLT5iYXRfaXYudHFfYXZnOwotCi0JCXN3aXRjaCAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5zZWxfY2xhc3MpKSB7Ci0JCWNhc2UgMTogLyogZmFzdCBjb25uZWN0aW9uICovCi0JCQl0bXBfZ3dfZmFjdG9yID0gdHFfYXZnICogdHFfYXZnOwotCQkJdG1wX2d3X2ZhY3RvciAqPSBnd19ub2RlLT5iYW5kd2lkdGhfZG93bjsKLQkJCXRtcF9nd19mYWN0b3IgKj0gMTAwICogMTAwOwotCQkJdG1wX2d3X2ZhY3RvciA+Pj0gMTg7Ci0KLQkJCWlmICgodG1wX2d3X2ZhY3RvciA+IG1heF9nd19mYWN0b3IpIHx8Ci0JCQkgICAgKCh0bXBfZ3dfZmFjdG9yID09IG1heF9nd19mYWN0b3IpICYmCi0JCQkgICAgICh0cV9hdmcgPiBtYXhfdHEpKSkgewotCQkJCWlmIChjdXJyX2d3KQotCQkJCQliYXRhZHZfZ3dfbm9kZV9wdXQoY3Vycl9ndyk7Ci0JCQkJY3Vycl9ndyA9IGd3X25vZGU7Ci0JCQkJa3JlZl9nZXQoJmN1cnJfZ3ctPnJlZmNvdW50KTsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6IC8qIDI6ICBzdGFibGUgY29ubmVjdGlvbiAodXNlIGJlc3Qgc3RhdGlzdGljKQotCQkJICAqIDM6ICBmYXN0LXN3aXRjaCAodXNlIGJlc3Qgc3RhdGlzdGljIGJ1dCBjaGFuZ2UgYXMKLQkJCSAgKiAgICAgc29vbiBhcyBhIGJldHRlciBnYXRld2F5IGFwcGVhcnMpCi0JCQkgICogWFg6IGxhdGUtc3dpdGNoICh1c2UgYmVzdCBzdGF0aXN0aWMgYnV0IGNoYW5nZSBhcwotCQkJICAqICAgICBzb29uIGFzIGEgYmV0dGVyIGdhdGV3YXkgYXBwZWFycyB3aGljaCBoYXMKLQkJCSAgKiAgICAgJHJvdXRpbmdfY2xhc3MgbW9yZSB0cSBwb2ludHMpCi0JCQkgICovCi0JCQlpZiAodHFfYXZnID4gbWF4X3RxKSB7Ci0JCQkJaWYgKGN1cnJfZ3cpCi0JCQkJCWJhdGFkdl9nd19ub2RlX3B1dChjdXJyX2d3KTsKLQkJCQljdXJyX2d3ID0gZ3dfbm9kZTsKLQkJCQlrcmVmX2dldCgmY3Vycl9ndy0+cmVmY291bnQpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodHFfYXZnID4gbWF4X3RxKQotCQkJbWF4X3RxID0gdHFfYXZnOwotCi0JCWlmICh0bXBfZ3dfZmFjdG9yID4gbWF4X2d3X2ZhY3RvcikKLQkJCW1heF9nd19mYWN0b3IgPSB0bXBfZ3dfZmFjdG9yOwotCi0JCWJhdGFkdl9nd19ub2RlX3B1dChnd19ub2RlKTsKLQotbmV4dDoKLQkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcik7Ci0JCWlmIChyb3V0ZXJfaWZpbmZvKQotCQkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX2lmaW5mbyk7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIGN1cnJfZ3c7Ci19Ci0KIC8qKgogICogYmF0YWR2X2d3X2NoZWNrX2NsaWVudF9zdG9wIC0gY2hlY2sgaWYgY2xpZW50IG1vZGUgaGFzIGJlZW4gc3dpdGNoZWQgb2ZmCiAgKiBAYmF0X3ByaXY6IHRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KQEAgLTI4NywxMiArMjEzLDE5IEBACiAJaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cubW9kZSkgIT0gQkFUQURWX0dXX01PREVfQ0xJRU5UKQogCQlnb3RvIG91dDsKIAorCWlmICghYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5nZXRfYmVzdF9nd19ub2RlKQorCQlnb3RvIG91dDsKKwogCWN1cnJfZ3cgPSBiYXRhZHZfZ3dfZ2V0X3NlbGVjdGVkX2d3X25vZGUoYmF0X3ByaXYpOwogCiAJaWYgKCFiYXRhZHZfYXRvbWljX2RlY19ub3RfemVybygmYmF0X3ByaXYtPmd3LnJlc2VsZWN0KSAmJiBjdXJyX2d3KQogCQlnb3RvIG91dDsKIAotCW5leHRfZ3cgPSBiYXRhZHZfZ3dfZ2V0X2Jlc3RfZ3dfbm9kZShiYXRfcHJpdik7CisJLyogaWYgZ3cucmVzZWxlY3QgaXMgc2V0IHRvIDEgaXQgbWVhbnMgdGhhdCBhIHByZXZpb3VzIGNhbGwgdG8KKwkgKiBndy5pc19lbGlnaWJsZSgpIHNhaWQgdGhhdCB3ZSBoYXZlIGEgbmV3IGJlc3QgR1csIHRoZXJlZm9yZSBpdCBjYW4KKwkgKiBub3cgYmUgcGlja2VkIGZyb20gdGhlIGxpc3QgYW5kIHNlbGVjdGVkCisJICovCisJbmV4dF9ndyA9IGJhdF9wcml2LT5hbGdvX29wcy0+Z3cuZ2V0X2Jlc3RfZ3dfbm9kZShiYXRfcHJpdik7CiAKIAlpZiAoY3Vycl9ndyA9PSBuZXh0X2d3KQogCQlnb3RvIG91dDsKQEAgLTM2MCw3MCArMjkzLDMxIEBACiB2b2lkIGJhdGFkdl9nd19jaGVja19lbGVjdGlvbihzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAogCQkJICAgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSkKIHsKLQlzdHJ1Y3QgYmF0YWR2X25laWdoX2lmaW5mbyAqcm91dGVyX29yaWdfdHEgPSBOVUxMOwotCXN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpyb3V0ZXJfZ3dfdHEgPSBOVUxMOwogCXN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpjdXJyX2d3X29yaWc7Ci0Jc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXJfZ3cgPSBOVUxMOwotCXN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqcm91dGVyX29yaWcgPSBOVUxMOwotCXU4IGd3X3RxX2F2Zywgb3JpZ190cV9hdmc7CisKKwkvKiBhYm9ydCBpbW1lZGlhdGVseSBpZiB0aGUgcm91dGluZyBhbGdvcml0aG0gZG9lcyBub3Qgc3VwcG9ydCBnYXRld2F5CisJICogZWxlY3Rpb24KKwkgKi8KKwlpZiAoIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuaXNfZWxpZ2libGUpCisJCXJldHVybjsKIAogCWN1cnJfZ3dfb3JpZyA9IGJhdGFkdl9nd19nZXRfc2VsZWN0ZWRfb3JpZyhiYXRfcHJpdik7CiAJaWYgKCFjdXJyX2d3X29yaWcpCiAJCWdvdG8gcmVzZWxlY3Q7CiAKLQlyb3V0ZXJfZ3cgPSBiYXRhZHZfb3JpZ19yb3V0ZXJfZ2V0KGN1cnJfZ3dfb3JpZywgQkFUQURWX0lGX0RFRkFVTFQpOwotCWlmICghcm91dGVyX2d3KQotCQlnb3RvIHJlc2VsZWN0OwotCi0Jcm91dGVyX2d3X3RxID0gYmF0YWR2X25laWdoX2lmaW5mb19nZXQocm91dGVyX2d3LAotCQkJCQkgICAgICAgQkFUQURWX0lGX0RFRkFVTFQpOwotCWlmICghcm91dGVyX2d3X3RxKQotCQlnb3RvIHJlc2VsZWN0OwotCiAJLyogdGhpcyBub2RlIGFscmVhZHkgaXMgdGhlIGdhdGV3YXkgKi8KIAlpZiAoY3Vycl9nd19vcmlnID09IG9yaWdfbm9kZSkKIAkJZ290byBvdXQ7CiAKLQlyb3V0ZXJfb3JpZyA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQob3JpZ19ub2RlLCBCQVRBRFZfSUZfREVGQVVMVCk7Ci0JaWYgKCFyb3V0ZXJfb3JpZykKKwlpZiAoIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuaXNfZWxpZ2libGUoYmF0X3ByaXYsIGN1cnJfZ3dfb3JpZywKKwkJCQkJCW9yaWdfbm9kZSkpCiAJCWdvdG8gb3V0OwogCi0Jcm91dGVyX29yaWdfdHEgPSBiYXRhZHZfbmVpZ2hfaWZpbmZvX2dldChyb3V0ZXJfb3JpZywKLQkJCQkJCSBCQVRBRFZfSUZfREVGQVVMVCk7Ci0JaWYgKCFyb3V0ZXJfb3JpZ190cSkKLQkJZ290byBvdXQ7Ci0KLQlnd190cV9hdmcgPSByb3V0ZXJfZ3dfdHEtPmJhdF9pdi50cV9hdmc7Ci0Jb3JpZ190cV9hdmcgPSByb3V0ZXJfb3JpZ190cS0+YmF0X2l2LnRxX2F2ZzsKLQotCS8qIHRoZSBUUSB2YWx1ZSBoYXMgdG8gYmUgYmV0dGVyICovCi0JaWYgKG9yaWdfdHFfYXZnIDwgZ3dfdHFfYXZnKQotCQlnb3RvIG91dDsKLQotCS8qIGlmIHRoZSByb3V0aW5nIGNsYXNzIGlzIGdyZWF0ZXIgdGhhbiAzIHRoZSB2YWx1ZSB0ZWxscyB1cyBob3cgbXVjaAotCSAqIGdyZWF0ZXIgdGhlIFRRIHZhbHVlIG9mIHRoZSBuZXcgZ2F0ZXdheSBtdXN0IGJlCi0JICovCi0JaWYgKChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcykgPiAzKSAmJgotCSAgICAob3JpZ190cV9hdmcgLSBnd190cV9hdmcgPCBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcykpKQotCQlnb3RvIG91dDsKLQotCWJhdGFkdl9kYmcoQkFUQURWX0RCR19CQVRNQU4sIGJhdF9wcml2LAotCQkgICAiUmVzdGFydGluZyBnYXRld2F5IHNlbGVjdGlvbjogYmV0dGVyIGdhdGV3YXkgZm91bmQgKHRxIGN1cnI6ICVpLCB0cSBuZXc6ICVpKVxuIiwKLQkJICAgZ3dfdHFfYXZnLCBvcmlnX3RxX2F2Zyk7Ci0KIHJlc2VsZWN0OgogCWJhdGFkdl9nd19yZXNlbGVjdChiYXRfcHJpdik7CiBvdXQ6CiAJaWYgKGN1cnJfZ3dfb3JpZykKIAkJYmF0YWR2X29yaWdfbm9kZV9wdXQoY3Vycl9nd19vcmlnKTsKLQlpZiAocm91dGVyX2d3KQotCQliYXRhZHZfbmVpZ2hfbm9kZV9wdXQocm91dGVyX2d3KTsKLQlpZiAocm91dGVyX29yaWcpCi0JCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChyb3V0ZXJfb3JpZyk7Ci0JaWYgKHJvdXRlcl9nd190cSkKLQkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX2d3X3RxKTsKLQlpZiAocm91dGVyX29yaWdfdHEpCi0JCWJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHJvdXRlcl9vcmlnX3RxKTsKIH0KIAogLyoqCkBAIC00NDUsMTQgKzMzOSwxNSBAQAogCWlmICghZ3dfbm9kZSkKIAkJcmV0dXJuOwogCi0Ja3JlZl9nZXQoJm9yaWdfbm9kZS0+cmVmY291bnQpOworCWtyZWZfaW5pdCgmZ3dfbm9kZS0+cmVmY291bnQpOwogCUlOSVRfSExJU1RfTk9ERSgmZ3dfbm9kZS0+bGlzdCk7CisJa3JlZl9nZXQoJm9yaWdfbm9kZS0+cmVmY291bnQpOwogCWd3X25vZGUtPm9yaWdfbm9kZSA9IG9yaWdfbm9kZTsKIAlnd19ub2RlLT5iYW5kd2lkdGhfZG93biA9IG50b2hsKGdhdGV3YXktPmJhbmR3aWR0aF9kb3duKTsKIAlnd19ub2RlLT5iYW5kd2lkdGhfdXAgPSBudG9obChnYXRld2F5LT5iYW5kd2lkdGhfdXApOwotCWtyZWZfaW5pdCgmZ3dfbm9kZS0+cmVmY291bnQpOwogCiAJc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+Z3cubGlzdF9sb2NrKTsKKwlrcmVmX2dldCgmZ3dfbm9kZS0+cmVmY291bnQpOwogCWhsaXN0X2FkZF9oZWFkX3JjdSgmZ3dfbm9kZS0+bGlzdCwgJmJhdF9wcml2LT5ndy5saXN0KTsKIAlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPmd3Lmxpc3RfbG9jayk7CiAKQEAgLTQ2Myw2ICszNTgsOSBAQAogCQkgICBudG9obChnYXRld2F5LT5iYW5kd2lkdGhfZG93bikgJSAxMCwKIAkJICAgbnRvaGwoZ2F0ZXdheS0+YmFuZHdpZHRoX3VwKSAvIDEwLAogCQkgICBudG9obChnYXRld2F5LT5iYW5kd2lkdGhfdXApICUgMTApOworCisJLyogZG9uJ3QgcmV0dXJuIHJlZmVyZW5jZSB0byBuZXcgZ3dfbm9kZSAqLworCWJhdGFkdl9nd19ub2RlX3B1dChnd19ub2RlKTsKIH0KIAogLyoqCkBAIC00NzIsOSArMzcwLDggQEAKICAqCiAgKiBSZXR1cm46IGdhdGV3YXkgbm9kZSBpZiBmb3VuZCBvciBOVUxMIG90aGVyd2lzZS4KICAqLwotc3RhdGljIHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqCi1iYXRhZHZfZ3dfbm9kZV9nZXQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKLQkJICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSkKK3N0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqYmF0YWR2X2d3X25vZGVfZ2V0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkJCSAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSkKIHsKIAlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGVfdG1wLCAqZ3dfbm9kZSA9IE5VTEw7CiAKQEAgLTU4NSw4MSArNDgyLDg3IEBACiAJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT5ndy5saXN0X2xvY2spOwogfQogCi0vKiBmYWlscyBpZiBvcmlnX25vZGUgaGFzIG5vIHJvdXRlciAqLwotc3RhdGljIGludCBiYXRhZHZfd3JpdGVfYnVmZmVyX3RleHQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKLQkJCQkgICAgc3RydWN0IHNlcV9maWxlICpzZXEsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqZ3dfbm9kZSkKLXsKLQlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmN1cnJfZ3c7Ci0Jc3RydWN0IGJhdGFkdl9uZWlnaF9ub2RlICpyb3V0ZXI7Ci0Jc3RydWN0IGJhdGFkdl9uZWlnaF9pZmluZm8gKnJvdXRlcl9pZmluZm8gPSBOVUxMOwotCWludCByZXQgPSAtMTsKLQotCXJvdXRlciA9IGJhdGFkdl9vcmlnX3JvdXRlcl9nZXQoZ3dfbm9kZS0+b3JpZ19ub2RlLCBCQVRBRFZfSUZfREVGQVVMVCk7Ci0JaWYgKCFyb3V0ZXIpCi0JCWdvdG8gb3V0OwotCi0Jcm91dGVyX2lmaW5mbyA9IGJhdGFkdl9uZWlnaF9pZmluZm9fZ2V0KHJvdXRlciwgQkFUQURWX0lGX0RFRkFVTFQpOwotCWlmICghcm91dGVyX2lmaW5mbykKLQkJZ290byBvdXQ7Ci0KLQljdXJyX2d3ID0gYmF0YWR2X2d3X2dldF9zZWxlY3RlZF9nd19ub2RlKGJhdF9wcml2KTsKLQotCXNlcV9wcmludGYoc2VxLCAiJXMgJXBNICglM2kpICVwTSBbJTEwc106ICV1LiV1LyV1LiV1IE1CaXRcbiIsCi0JCSAgIChjdXJyX2d3ID09IGd3X25vZGUgPyAiPT4iIDogIiAgIiksCi0JCSAgIGd3X25vZGUtPm9yaWdfbm9kZS0+b3JpZywKLQkJICAgcm91dGVyX2lmaW5mby0+YmF0X2l2LnRxX2F2Zywgcm91dGVyLT5hZGRyLAotCQkgICByb3V0ZXItPmlmX2luY29taW5nLT5uZXRfZGV2LT5uYW1lLAotCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfZG93biAvIDEwLAotCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfZG93biAlIDEwLAotCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfdXAgLyAxMCwKLQkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX3VwICUgMTApOwotCXJldCA9IHNlcV9oYXNfb3ZlcmZsb3dlZChzZXEpID8gLTEgOiAwOwotCi0JaWYgKGN1cnJfZ3cpCi0JCWJhdGFkdl9nd19ub2RlX3B1dChjdXJyX2d3KTsKLW91dDoKLQlpZiAocm91dGVyX2lmaW5mbykKLQkJYmF0YWR2X25laWdoX2lmaW5mb19wdXQocm91dGVyX2lmaW5mbyk7Ci0JaWYgKHJvdXRlcikKLQkJYmF0YWR2X25laWdoX25vZGVfcHV0KHJvdXRlcik7Ci0JcmV0dXJuIHJldDsKLX0KLQorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIGludCBiYXRhZHZfZ3dfY2xpZW50X3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilzZXEtPnByaXZhdGU7CiAJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwogCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZjsKLQlzdHJ1Y3QgYmF0YWR2X2d3X25vZGUgKmd3X25vZGU7Ci0JaW50IGd3X2NvdW50ID0gMDsKIAogCXByaW1hcnlfaWYgPSBiYXRhZHZfc2VxX3ByaW50X3RleHRfcHJpbWFyeV9pZl9nZXQoc2VxKTsKIAlpZiAoIXByaW1hcnlfaWYpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gMDsKIAotCXNlcV9wcmludGYoc2VxLAotCQkgICAiICAgICAgR2F0ZXdheSAgICAgICgjLzI1NSkgICAgICAgICAgIE5leHRob3AgW291dGdvaW5nSUZdOiBhZHZlcnRpc2VkIHVwbGluayBiYW5kd2lkdGggLi4uIFtCLkEuVC5NLkEuTi4gYWR2ICVzLCBNYWluSUYvTUFDOiAlcy8lcE0gKCVzKV1cbiIsCisJc2VxX3ByaW50ZihzZXEsICJbQi5BLlQuTS5BLk4uIGFkdiAlcywgTWFpbklGL01BQzogJXMvJXBNICglcyAlcyldXG4iLAogCQkgICBCQVRBRFZfU09VUkNFX1ZFUlNJT04sIHByaW1hcnlfaWYtPm5ldF9kZXYtPm5hbWUsCi0JCSAgIHByaW1hcnlfaWYtPm5ldF9kZXYtPmRldl9hZGRyLCBuZXRfZGV2LT5uYW1lKTsKKwkJICAgcHJpbWFyeV9pZi0+bmV0X2Rldi0+ZGV2X2FkZHIsIG5ldF9kZXYtPm5hbWUsCisJCSAgIGJhdF9wcml2LT5hbGdvX29wcy0+bmFtZSk7CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGd3X25vZGUsICZiYXRfcHJpdi0+Z3cubGlzdCwgbGlzdCkgewotCQkvKiBmYWlscyBpZiBvcmlnX25vZGUgaGFzIG5vIHJvdXRlciAqLwotCQlpZiAoYmF0YWR2X3dyaXRlX2J1ZmZlcl90ZXh0KGJhdF9wcml2LCBzZXEsIGd3X25vZGUpIDwgMCkKLQkJCWNvbnRpbnVlOworCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOwogCi0JCWd3X2NvdW50Kys7CisJaWYgKCFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LnByaW50KSB7CisJCXNlcV9wdXRzKHNlcSwKKwkJCSAiTm8gcHJpbnRpbmcgZnVuY3Rpb24gZm9yIHRoaXMgcm91dGluZyBwcm90b2NvbFxuIik7CisJCXJldHVybiAwOwogCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKIAotCWlmIChnd19jb3VudCA9PSAwKQotCQlzZXFfcHV0cyhzZXEsICJObyBnYXRld2F5cyBpbiByYW5nZSAuLi5cbiIpOworCWJhdF9wcml2LT5hbGdvX29wcy0+Z3cucHJpbnQoYmF0X3ByaXYsIHNlcSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKioKKyAqIGJhdGFkdl9nd19kdW1wIC0gRHVtcCBnYXRld2F5cyBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBDb250cm9sIGJsb2NrIGNvbnRhaW5pbmcgYWRkaXRpb25hbCBvcHRpb25zCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciBsZW5ndGggb2YgbWVzc2FnZQorICovCitpbnQgYmF0YWR2X2d3X2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiA9IE5VTEw7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoY2ItPnNrYi0+c2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOworCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXY7CisJaW50IGlmaW5kZXg7CisJaW50IHJldDsKKworCWlmaW5kZXggPSBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjYi0+bmxoLAorCQkJCQkgICAgIEJBVEFEVl9BVFRSX01FU0hfSUZJTkRFWCk7CisJaWYgKCFpZmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNvZnRfaWZhY2UgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZpbmRleCk7CisJaWYgKCFzb2Z0X2lmYWNlIHx8ICFiYXRhZHZfc29mdGlmX2lzX3ZhbGlkKHNvZnRfaWZhY2UpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7CisKKwlwcmltYXJ5X2lmID0gYmF0YWR2X3ByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKKwlpZiAoIXByaW1hcnlfaWYgfHwgcHJpbWFyeV9pZi0+aWZfc3RhdHVzICE9IEJBVEFEVl9JRl9BQ1RJVkUpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmR1bXApIHsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKworCWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuZHVtcChtc2csIGNiLCBiYXRfcHJpdik7CisKKwlyZXQgPSBtc2ctPmxlbjsKIAogb3V0OgogCWlmIChwcmltYXJ5X2lmKQogCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKLQlyZXR1cm4gMDsKKwlpZiAoc29mdF9pZmFjZSkKKwkJZGV2X3B1dChzb2Z0X2lmYWNlKTsKKworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuaCBiL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmgKaW5kZXggNTgyZGQ4Yy4uODU5MTY2ZCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogc3RydWN0IGJhdGFkdl90dmx2X2dhdGV3YXlfZGF0YTsKK3N0cnVjdCBuZXRsaW5rX2NhbGxiYWNrOwogc3RydWN0IHNlcV9maWxlOwogc3RydWN0IHNrX2J1ZmY7CiAKQEAgLTM5LDEwICs0MCwxNiBAQAogdm9pZCBiYXRhZHZfZ3dfbm9kZV9kZWxldGUoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKIAkJCSAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUpOwogdm9pZCBiYXRhZHZfZ3dfbm9kZV9mcmVlKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpOwordm9pZCBiYXRhZHZfZ3dfbm9kZV9wdXQoc3RydWN0IGJhdGFkdl9nd19ub2RlICpnd19ub2RlKTsKK3N0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqCitiYXRhZHZfZ3dfZ2V0X3NlbGVjdGVkX2d3X25vZGUoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdik7CiBpbnQgYmF0YWR2X2d3X2NsaWVudF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKK2ludCBiYXRhZHZfZ3dfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogYm9vbCBiYXRhZHZfZ3dfb3V0X29mX3JhbmdlKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsIHN0cnVjdCBza19idWZmICpza2IpOwogZW51bSBiYXRhZHZfZGhjcF9yZWNpcGllbnQKIGJhdGFkdl9nd19kaGNwX3JlY2lwaWVudF9nZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50ICpoZWFkZXJfbGVuLAogCQkJICAgICB1OCAqY2hhZGRyKTsKK3N0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqYmF0YWR2X2d3X25vZGVfZ2V0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkJCSAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSk7CiAKICNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfR0FURVdBWV9DTElFTlRfSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY29tbW9uLmMgYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NvbW1vbi5jCmluZGV4IGQ3YmM2YTguLjIxMTg0ODEgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY29tbW9uLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jb21tb24uYwpAQCAtMjQxLDEwICsyNDEsOSBAQAogCiAJYmF0YWR2X2d3X25vZGVfdXBkYXRlKGJhdF9wcml2LCBvcmlnLCAmZ2F0ZXdheSk7CiAKLQkvKiByZXN0YXJ0IGdhdGV3YXkgc2VsZWN0aW9uIGlmIGZhc3Qgb3IgbGF0ZSBzd2l0Y2hpbmcgd2FzIGVuYWJsZWQgKi8KKwkvKiByZXN0YXJ0IGdhdGV3YXkgc2VsZWN0aW9uICovCiAJaWYgKChnYXRld2F5LmJhbmR3aWR0aF9kb3duICE9IDApICYmCi0JICAgIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3Lm1vZGUpID09IEJBVEFEVl9HV19NT0RFX0NMSUVOVCkgJiYKLQkgICAgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3cuc2VsX2NsYXNzKSA+IDIpKQorCSAgICAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5tb2RlKSA9PSBCQVRBRFZfR1dfTU9ERV9DTElFTlQpKQogCQliYXRhZHZfZ3dfY2hlY2tfZWxlY3Rpb24oYmF0X3ByaXYsIG9yaWcpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jIGIvbmV0L2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYwppbmRleCAxZjkwODA4Li4wOGNlMzYxIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMKQEAgLTM1LDcgKzM1LDggQEAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KIAogI2luY2x1ZGUgImJhdF92LmgiCiAjaW5jbHVkZSAiYnJpZGdlX2xvb3BfYXZvaWRhbmNlLmgiCkBAIC04NSwyNSArODYsNTUgQEAKIH0KIAogLyoqCisgKiBiYXRhZHZfZ2V0bGlua19uZXQgLSByZXR1cm4gbGluayBuZXQgbmFtZXNwYWNlIChvZiB1c2UgZmFsbGJhY2spCisgKiBAbmV0ZGV2OiBuZXRfZGV2aWNlIHRvIGNoZWNrCisgKiBAZmFsbGJhY2tfbmV0OiByZXR1cm4gaW4gY2FzZSBnZXRfbGlua19uZXQgaXMgbm90IGF2YWlsYWJsZSBmb3IgQG5ldGRldgorICoKKyAqIFJldHVybjogcmVzdWx0IG9mIHJ0bmxfbGlua19vcHMtPmdldF9saW5rX25ldCBvciBAZmFsbGJhY2tfbmV0CisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0ICpiYXRhZHZfZ2V0bGlua19uZXQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXQgKmZhbGxiYWNrX25ldCkKK3sKKwlpZiAoIW5ldGRldi0+cnRubF9saW5rX29wcykKKwkJcmV0dXJuIGZhbGxiYWNrX25ldDsKKworCWlmICghbmV0ZGV2LT5ydG5sX2xpbmtfb3BzLT5nZXRfbGlua19uZXQpCisJCXJldHVybiBmYWxsYmFja19uZXQ7CisKKwlyZXR1cm4gbmV0ZGV2LT5ydG5sX2xpbmtfb3BzLT5nZXRfbGlua19uZXQobmV0ZGV2KTsKK30KKworLyoqCiAgKiBiYXRhZHZfbXV0dWFsX3BhcmVudHMgLSBjaGVjayBpZiB0d28gZGV2aWNlcyBhcmUgZWFjaCBvdGhlcnMgcGFyZW50Ci0gKiBAZGV2MTogMXN0IG5ldF9kZXZpY2UKLSAqIEBkZXYyOiAybmQgbmV0X2RldmljZQorICogQGRldjE6IDFzdCBuZXQgZGV2CisgKiBAbmV0MTogMXN0IGRldmljZXMgbmV0bnMKKyAqIEBkZXYyOiAybmQgbmV0IGRldgorICogQG5ldDI6IDJuZCBkZXZpY2VzIG5ldG5zCiAgKgogICogdmV0aCBkZXZpY2VzIGNvbWUgaW4gcGFpcnMgYW5kIGVhY2ggaXMgdGhlIHBhcmVudCBvZiB0aGUgb3RoZXIhCiAgKgogICogUmV0dXJuOiB0cnVlIGlmIHRoZSBkZXZpY2VzIGFyZSBlYWNoIG90aGVycyBwYXJlbnQsIG90aGVyd2lzZSBmYWxzZQogICovCiBzdGF0aWMgYm9vbCBiYXRhZHZfbXV0dWFsX3BhcmVudHMoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldjEsCi0JCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2MikKKwkJCQkgIGNvbnN0IHN0cnVjdCBuZXQgKm5ldDEsCisJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2MiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBuZXQgKm5ldDIpCiB7CiAJaW50IGRldjFfcGFyZW50X2lmbGluayA9IGRldl9nZXRfaWZsaW5rKGRldjEpOwogCWludCBkZXYyX3BhcmVudF9pZmxpbmsgPSBkZXZfZ2V0X2lmbGluayhkZXYyKTsKKwljb25zdCBzdHJ1Y3QgbmV0ICpkZXYxX3BhcmVudF9uZXQ7CisJY29uc3Qgc3RydWN0IG5ldCAqZGV2Ml9wYXJlbnRfbmV0OworCisJZGV2MV9wYXJlbnRfbmV0ID0gYmF0YWR2X2dldGxpbmtfbmV0KGRldjEsIG5ldDEpOworCWRldjJfcGFyZW50X25ldCA9IGJhdGFkdl9nZXRsaW5rX25ldChkZXYyLCBuZXQyKTsKIAogCWlmICghZGV2MV9wYXJlbnRfaWZsaW5rIHx8ICFkZXYyX3BhcmVudF9pZmxpbmspCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiAoZGV2MV9wYXJlbnRfaWZsaW5rID09IGRldjItPmlmaW5kZXgpICYmCi0JICAgICAgIChkZXYyX3BhcmVudF9pZmxpbmsgPT0gZGV2MS0+aWZpbmRleCk7CisJICAgICAgIChkZXYyX3BhcmVudF9pZmxpbmsgPT0gZGV2MS0+aWZpbmRleCkgJiYKKwkgICAgICAgbmV0X2VxKGRldjFfcGFyZW50X25ldCwgbmV0MikgJiYKKwkgICAgICAgbmV0X2VxKGRldjJfcGFyZW50X25ldCwgbmV0MSk7CiB9CiAKIC8qKgpAQCAtMTIxLDggKzE1Miw5IEBACiAgKi8KIHN0YXRpYyBib29sIGJhdGFkdl9pc19vbl9iYXRtYW5faWZhY2UoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBhcmVudF9kZXY7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChuZXRfZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcGFyZW50X2RldjsKKwljb25zdCBzdHJ1Y3QgbmV0ICpwYXJlbnRfbmV0OwogCWJvb2wgcmV0OwogCiAJLyogY2hlY2sgaWYgdGhpcyBpcyBhIGJhdG1hbi1hZHYgbWVzaCBpbnRlcmZhY2UgKi8KQEAgLTEzNCwxMyArMTY2LDE2IEBACiAJICAgIGRldl9nZXRfaWZsaW5rKG5ldF9kZXYpID09IG5ldF9kZXYtPmlmaW5kZXgpCiAJCXJldHVybiBmYWxzZTsKIAorCXBhcmVudF9uZXQgPSBiYXRhZHZfZ2V0bGlua19uZXQobmV0X2RldiwgbmV0KTsKKwogCS8qIHJlY3Vyc2Ugb3ZlciB0aGUgcGFyZW50IGRldmljZSAqLwotCXBhcmVudF9kZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobmV0LCBkZXZfZ2V0X2lmbGluayhuZXRfZGV2KSk7CisJcGFyZW50X2RldiA9IF9fZGV2X2dldF9ieV9pbmRleCgoc3RydWN0IG5ldCAqKXBhcmVudF9uZXQsCisJCQkJCWRldl9nZXRfaWZsaW5rKG5ldF9kZXYpKTsKIAkvKiBpZiB3ZSBnb3QgYSBOVUxMIHBhcmVudF9kZXYgdGhlcmUgaXMgc29tZXRoaW5nIGJyb2tlbi4uICovCiAJaWYgKFdBUk4oIXBhcmVudF9kZXYsICJDYW5ub3QgZmluZCBwYXJlbnQgZGV2aWNlIikpCiAJCXJldHVybiBmYWxzZTsKIAotCWlmIChiYXRhZHZfbXV0dWFsX3BhcmVudHMobmV0X2RldiwgcGFyZW50X2RldikpCisJaWYgKGJhdGFkdl9tdXR1YWxfcGFyZW50cyhuZXRfZGV2LCBuZXQsIHBhcmVudF9kZXYsIHBhcmVudF9uZXQpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXQgPSBiYXRhZHZfaXNfb25fYmF0bWFuX2lmYWNlKHBhcmVudF9kZXYpOwpAQCAtNjI1LDI1ICs2NjAsNiBAQAogCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKIH0KIAotLyoqCi0gKiBiYXRhZHZfaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2VfZmluaXNoIC0gY2xlYW5zIHVwIHRoZSByZW1haW5zIG9mIGEgaGFyZGlmCi0gKiBAd29yazogd29yayBxdWV1ZSBpdGVtCi0gKgotICogRnJlZSB0aGUgcGFydHMgb2YgdGhlIGhhcmQgaW50ZXJmYWNlIHdoaWNoIGNhbiBub3QgYmUgcmVtb3ZlZCB1bmRlcgotICogcnRubCBsb2NrICh0byBwcmV2ZW50IGRlYWRsb2NrIHNpdHVhdGlvbnMpLgotICovCi1zdGF0aWMgdm9pZCBiYXRhZHZfaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2VfZmluaXNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2U7Ci0KLQloYXJkX2lmYWNlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSwKLQkJCQkgIGNsZWFudXBfd29yayk7Ci0KLQliYXRhZHZfZGVidWdmc19kZWxfaGFyZGlmKGhhcmRfaWZhY2UpOwotCWJhdGFkdl9zeXNmc19kZWxfaGFyZGlmKCZoYXJkX2lmYWNlLT5oYXJkaWZfb2JqKTsKLQliYXRhZHZfaGFyZGlmX3B1dChoYXJkX2lmYWNlKTsKLX0KLQogc3RhdGljIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqCiBiYXRhZHZfaGFyZGlmX2FkZF9pbnRlcmZhY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCiB7CkBAIC02NzYsMTAgKzY5Miw5IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmaGFyZF9pZmFjZS0+bGlzdCk7CiAJSU5JVF9ITElTVF9IRUFEKCZoYXJkX2lmYWNlLT5uZWlnaF9saXN0KTsKLQlJTklUX1dPUksoJmhhcmRfaWZhY2UtPmNsZWFudXBfd29yaywKLQkJICBiYXRhZHZfaGFyZGlmX3JlbW92ZV9pbnRlcmZhY2VfZmluaXNoKTsKIAogCXNwaW5fbG9ja19pbml0KCZoYXJkX2lmYWNlLT5uZWlnaF9saXN0X2xvY2spOworCWtyZWZfaW5pdCgmaGFyZF9pZmFjZS0+cmVmY291bnQpOwogCiAJaGFyZF9pZmFjZS0+bnVtX2JjYXN0cyA9IEJBVEFEVl9OVU1fQkNBU1RTX0RFRkFVTFQ7CiAJaWYgKGJhdGFkdl9pc193aWZpX25ldGRldihuZXRfZGV2KSkKQEAgLTY4NywxMSArNzAyLDggQEAKIAogCWJhdGFkdl92X2hhcmRpZl9pbml0KGhhcmRfaWZhY2UpOwogCi0JLyogZXh0cmEgcmVmZXJlbmNlIGZvciByZXR1cm4gKi8KLQlrcmVmX2luaXQoJmhhcmRfaWZhY2UtPnJlZmNvdW50KTsKLQlrcmVmX2dldCgmaGFyZF9pZmFjZS0+cmVmY291bnQpOwotCiAJYmF0YWR2X2NoZWNrX2tub3duX21hY19hZGRyKGhhcmRfaWZhY2UtPm5ldF9kZXYpOworCWtyZWZfZ2V0KCZoYXJkX2lmYWNlLT5yZWZjb3VudCk7CiAJbGlzdF9hZGRfdGFpbF9yY3UoJmhhcmRfaWZhY2UtPmxpc3QsICZiYXRhZHZfaGFyZGlmX2xpc3QpOwogCiAJcmV0dXJuIGhhcmRfaWZhY2U7CkBAIC03MTMsMTMgKzcyNSwxNSBAQAogCS8qIGZpcnN0IGRlYWN0aXZhdGUgaW50ZXJmYWNlICovCiAJaWYgKGhhcmRfaWZhY2UtPmlmX3N0YXR1cyAhPSBCQVRBRFZfSUZfTk9UX0lOX1VTRSkKIAkJYmF0YWR2X2hhcmRpZl9kaXNhYmxlX2ludGVyZmFjZShoYXJkX2lmYWNlLAotCQkJCQkJQkFUQURWX0lGX0NMRUFOVVBfQVVUTyk7CisJCQkJCQlCQVRBRFZfSUZfQ0xFQU5VUF9LRUVQKTsKIAogCWlmIChoYXJkX2lmYWNlLT5pZl9zdGF0dXMgIT0gQkFUQURWX0lGX05PVF9JTl9VU0UpCiAJCXJldHVybjsKIAogCWhhcmRfaWZhY2UtPmlmX3N0YXR1cyA9IEJBVEFEVl9JRl9UT19CRV9SRU1PVkVEOwotCXF1ZXVlX3dvcmsoYmF0YWR2X2V2ZW50X3dvcmtxdWV1ZSwgJmhhcmRfaWZhY2UtPmNsZWFudXBfd29yayk7CisJYmF0YWR2X2RlYnVnZnNfZGVsX2hhcmRpZihoYXJkX2lmYWNlKTsKKwliYXRhZHZfc3lzZnNfZGVsX2hhcmRpZigmaGFyZF9pZmFjZS0+aGFyZGlmX29iaik7CisJYmF0YWR2X2hhcmRpZl9wdXQoaGFyZF9pZmFjZSk7CiB9CiAKIHZvaWQgYmF0YWR2X2hhcmRpZl9yZW1vdmVfaW50ZXJmYWNlcyh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuaCBiL25ldC9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmgKaW5kZXggNjE4ZDVkZS4uZTQ0YTdkYSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9pY21wX3NvY2tldC5oCkBAIC0yNiw5ICsyNiwyNSBAQAogCiAjZGVmaW5lIEJBVEFEVl9JQ01QX1NPQ0tFVCAic29ja2V0IgogCi12b2lkIGJhdGFkdl9zb2NrZXRfaW5pdCh2b2lkKTsKIGludCBiYXRhZHZfc29ja2V0X3NldHVwKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpOworCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUworCit2b2lkIGJhdGFkdl9zb2NrZXRfaW5pdCh2b2lkKTsKIHZvaWQgYmF0YWR2X3NvY2tldF9yZWNlaXZlX3BhY2tldChzdHJ1Y3QgYmF0YWR2X2ljbXBfaGVhZGVyICppY21waCwKIAkJCQkgIHNpemVfdCBpY21wX2xlbik7CiAKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiYXRhZHZfc29ja2V0X2luaXQodm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkCitiYXRhZHZfc29ja2V0X3JlY2VpdmVfcGFja2V0KHN0cnVjdCBiYXRhZHZfaWNtcF9oZWFkZXIgKmljbXBoLCBzaXplX3QgaWNtcF9sZW4pCit7Cit9CisKKyNlbmRpZgorCiAjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX0lDTVBfU09DS0VUX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9tYWluLmMgYi9uZXQvYmF0bWFuLWFkdi9tYWluLmMKaW5kZXggZmU0YzVlMi4uMmMwMTdhYiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvbWFpbi5jCisrKyBiL25ldC9iYXRtYW4tYWR2L21haW4uYwpAQCAtODIsNiArODIsMTIgQEAKIAogc3RhdGljIGludCBfX2luaXQgYmF0YWR2X2luaXQodm9pZCkKIHsKKwlpbnQgcmV0OworCisJcmV0ID0gYmF0YWR2X3R0X2NhY2hlX2luaXQoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCUlOSVRfTElTVF9IRUFEKCZiYXRhZHZfaGFyZGlmX2xpc3QpOwogCWJhdGFkdl9hbGdvX2luaXQoKTsKIApAQCAtOTMsOSArOTksOCBAQAogCWJhdGFkdl90cF9tZXRlcl9pbml0KCk7CiAKIAliYXRhZHZfZXZlbnRfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImJhdF9ldmVudHMiKTsKLQogCWlmICghYmF0YWR2X2V2ZW50X3dvcmtxdWV1ZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gZXJyX2NyZWF0ZV93cTsKIAogCWJhdGFkdl9zb2NrZXRfaW5pdCgpOwogCWJhdGFkdl9kZWJ1Z2ZzX2luaXQoKTsKQEAgLTEwOCw2ICsxMTMsMTEgQEAKIAkJQkFUQURWX1NPVVJDRV9WRVJTSU9OLCBCQVRBRFZfQ09NUEFUX1ZFUlNJT04pOwogCiAJcmV0dXJuIDA7CisKK2Vycl9jcmVhdGVfd3E6CisJYmF0YWR2X3R0X2NhY2hlX2Rlc3Ryb3koKTsKKworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYmF0YWR2X2V4aXQodm9pZCkKQEAgLTEyMyw2ICsxMzMsOCBAQAogCWJhdGFkdl9ldmVudF93b3JrcXVldWUgPSBOVUxMOwogCiAJcmN1X2JhcnJpZXIoKTsKKworCWJhdGFkdl90dF9jYWNoZV9kZXN0cm95KCk7CiB9CiAKIGludCBiYXRhZHZfbWVzaF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQpAQCAtMjcwLDYgKzI4Miw3IEBACiAJcmV0dXJuIGlzX215X21hYzsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIC8qKgogICogYmF0YWR2X3NlcV9wcmludF90ZXh0X3ByaW1hcnlfaWZfZ2V0IC0gY2FsbGVkIGZyb20gZGVidWdmcyB0YWJsZSBwcmludGluZwogICogIGZ1bmN0aW9uIHRoYXQgcmVxdWlyZXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlCkBAIC0zMDUsNiArMzE4LDcgQEAKIG91dDoKIAlyZXR1cm4gcHJpbWFyeV9pZjsKIH0KKyNlbmRpZgogCiAvKioKICAqIGJhdGFkdl9tYXhfaGVhZGVyX2xlbiAtIGNhbGN1bGF0ZSBtYXhpbXVtIGVuY2Fwc3VsYXRpb24gb3ZlcmhlYWQgZm9yIGEKQEAgLTYzOCwzICs2NTIsNCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKEJBVEFEVl9EUklWRVJfREVTQyk7CiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRShCQVRBRFZfRFJJVkVSX0RFVklDRSk7CiBNT0RVTEVfVkVSU0lPTihCQVRBRFZfU09VUkNFX1ZFUlNJT04pOworTU9EVUxFX0FMSUFTX1JUTkxfTElOSygiYmF0YWR2Iik7CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9tYWluLmggYi9uZXQvYmF0bWFuLWFkdi9tYWluLmgKaW5kZXggMDZhODYwOC4uMDlhZjIxZSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvbWFpbi5oCisrKyBiL25ldC9iYXRtYW4tYWR2L21haW4uaApAQCAtMjQsNyArMjQsNyBAQAogI2RlZmluZSBCQVRBRFZfRFJJVkVSX0RFVklDRSAiYmF0bWFuLWFkdiIKIAogI2lmbmRlZiBCQVRBRFZfU09VUkNFX1ZFUlNJT04KLSNkZWZpbmUgQkFUQURWX1NPVVJDRV9WRVJTSU9OICIyMDE2LjMiCisjZGVmaW5lIEJBVEFEVl9TT1VSQ0VfVkVSU0lPTiAiMjAxNi40IgogI2VuZGlmCiAKIC8qIEIuQS5ULk0uQS5OLiBwYXJhbWV0ZXJzICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9tdWx0aWNhc3QuYyBiL25ldC9iYXRtYW4tYWR2L211bHRpY2FzdC5jCmluZGV4IGNjOTE1MDcuLjEzNjYxZjQgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L211bHRpY2FzdC5jCisrKyBiL25ldC9iYXRtYW4tYWR2L211bHRpY2FzdC5jCkBAIC01MjgsNyArNTI4LDcgQEAKIAl9CiAKIAlyZXR1cm4gIShtY2FzdF9kYXRhLmZsYWdzICYKLQkJIChCQVRBRFZfTUNBU1RfV0FOVF9BTExfSVBWNCArIEJBVEFEVl9NQ0FTVF9XQU5UX0FMTF9JUFY2KSk7CisJCSAoQkFUQURWX01DQVNUX1dBTlRfQUxMX0lQVjQgfCBCQVRBRFZfTUNBU1RfV0FOVF9BTExfSVBWNikpOwogfQogCiAvKioKQEAgLTExMzQsNiArMTEzNCw3IEBACiAJCQkJICAgICBCQVRBRFZfVFZMVl9IQU5ETEVSX09HTV9DSUZOT1RGTkQpOwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogLyoqCiAgKiBiYXRhZHZfbWNhc3RfZmxhZ3NfcHJpbnRfaGVhZGVyIC0gcHJpbnQgb3duIG1jYXN0IGZsYWdzIHRvIGRlYnVnZnMgdGFibGUKICAqIEBiYXRfcHJpdjogdGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgpAQCAtMTIzNCw2ICsxMjM1LDcgQEAKIAogCXJldHVybiAwOwogfQorI2VuZGlmCiAKIC8qKgogICogYmF0YWR2X21jYXN0X2ZyZWUgLSBmcmVlIHRoZSBtdWx0aWNhc3Qgb3B0aW1pemF0aW9ucyBzdHJ1Y3R1cmVzCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9uZXRsaW5rLmMgYi9uZXQvYmF0bWFuLWFkdi9uZXRsaW5rLmMKaW5kZXggMjMxZjhlYS4uNjRjYjZhYyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvbmV0bGluay5jCisrKyBiL25ldC9iYXRtYW4tYWR2L25ldGxpbmsuYwpAQCAtMTgsNiArMTgsOCBAQAogI2luY2x1ZGUgIm5ldGxpbmsuaCIKICNpbmNsdWRlICJtYWluLmgiCiAKKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9nZW5ldGxpbmsuaD4KQEAgLTI2LDI0ICsyOCwzMyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9iYXRtYW5fYWR2Lmg+CiAKKyNpbmNsdWRlICJiYXRfYWxnby5oIgorI2luY2x1ZGUgImJyaWRnZV9sb29wX2F2b2lkYW5jZS5oIgorI2luY2x1ZGUgImdhdGV3YXlfY2xpZW50LmgiCiAjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCisjaW5jbHVkZSAicGFja2V0LmgiCiAjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJ0cF9tZXRlci5oIgorI2luY2x1ZGUgInRyYW5zbGF0aW9uLXRhYmxlLmgiCiAKLXN0cnVjdCBza19idWZmOwotCi1zdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IGJhdGFkdl9uZXRsaW5rX2ZhbWlseSA9IHsKK3N0cnVjdCBnZW5sX2ZhbWlseSBiYXRhZHZfbmV0bGlua19mYW1pbHkgPSB7CiAJLmlkID0gR0VOTF9JRF9HRU5FUkFURSwKIAkuaGRyc2l6ZSA9IDAsCiAJLm5hbWUgPSBCQVRBRFZfTkxfTkFNRSwKIAkudmVyc2lvbiA9IDEsCiAJLm1heGF0dHIgPSBCQVRBRFZfQVRUUl9NQVgsCisJLm5ldG5zb2sgPSB0cnVlLAogfTsKIAogLyogbXVsdGljYXN0IGdyb3VwcyAqLwpAQCAtNTEsMTEgKzYyLDExIEBACiAJQkFUQURWX05MX01DR1JQX1RQTUVURVIsCiB9OwogCi1zdGF0aWMgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwIGJhdGFkdl9uZXRsaW5rX21jZ3Jwc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBiYXRhZHZfbmV0bGlua19tY2dycHNbXSA9IHsKIAlbQkFUQURWX05MX01DR1JQX1RQTUVURVJdID0geyAubmFtZSA9IEJBVEFEVl9OTF9NQ0FTVF9HUk9VUF9UUE1FVEVSIH0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgYmF0YWR2X25ldGxpbmtfcG9saWN5W05VTV9CQVRBRFZfQVRUUl0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgYmF0YWR2X25ldGxpbmtfcG9saWN5W05VTV9CQVRBRFZfQVRUUl0gPSB7CiAJW0JBVEFEVl9BVFRSX1ZFUlNJT05dCQk9IHsgLnR5cGUgPSBOTEFfU1RSSU5HIH0sCiAJW0JBVEFEVl9BVFRSX0FMR09fTkFNRV0JCT0geyAudHlwZSA9IE5MQV9TVFJJTkcgfSwKIAlbQkFUQURWX0FUVFJfTUVTSF9JRklOREVYXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCkBAIC02OSw5ICs4MCw0NCBAQAogCVtCQVRBRFZfQVRUUl9UUE1FVEVSX1RFU1RfVElNRV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtCQVRBRFZfQVRUUl9UUE1FVEVSX0JZVEVTXQk9IHsgLnR5cGUgPSBOTEFfVTY0IH0sCiAJW0JBVEFEVl9BVFRSX1RQTUVURVJfQ09PS0lFXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0JBVEFEVl9BVFRSX0FDVElWRV0JCT0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW0JBVEFEVl9BVFRSX1RUX0FERFJFU1NdCT0geyAubGVuID0gRVRIX0FMRU4gfSwKKwlbQkFUQURWX0FUVFJfVFRfVFRWTl0JCT0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtCQVRBRFZfQVRUUl9UVF9MQVNUX1RUVk5dCT0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtCQVRBRFZfQVRUUl9UVF9DUkMzMl0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbQkFUQURWX0FUVFJfVFRfVklEXQkJPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtCQVRBRFZfQVRUUl9UVF9GTEFHU10JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbQkFUQURWX0FUVFJfRkxBR19CRVNUXQkJPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKKwlbQkFUQURWX0FUVFJfTEFTVF9TRUVOX01TRUNTXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0JBVEFEVl9BVFRSX05FSUdIX0FERFJFU1NdCT0geyAubGVuID0gRVRIX0FMRU4gfSwKKwlbQkFUQURWX0FUVFJfVFFdCQk9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbQkFUQURWX0FUVFJfVEhST1VHSFBVVF0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtCQVRBRFZfQVRUUl9CQU5EV0lEVEhfVVBdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbQkFUQURWX0FUVFJfQkFORFdJRFRIX0RPV05dCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbQkFUQURWX0FUVFJfUk9VVEVSXQkJPSB7IC5sZW4gPSBFVEhfQUxFTiB9LAorCVtCQVRBRFZfQVRUUl9CTEFfT1dOXQkJPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKKwlbQkFUQURWX0FUVFJfQkxBX0FERFJFU1NdCT0geyAubGVuID0gRVRIX0FMRU4gfSwKKwlbQkFUQURWX0FUVFJfQkxBX1ZJRF0JCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbQkFUQURWX0FUVFJfQkxBX0JBQ0tCT05FXQk9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW0JBVEFEVl9BVFRSX0JMQV9DUkNdCQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiB9OwogCiAvKioKKyAqIGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4IC0gRXh0cmFjdCBhbiBpbnRlcmZhY2UgaW5kZXggZnJvbSBhIG1lc3NhZ2UKKyAqIEBubGg6IE1lc3NhZ2UgaGVhZGVyCisgKiBAYXR0cnR5cGU6IEF0dHJpYnV0ZSB3aGljaCBob2xkcyBhbiBpbnRlcmZhY2UgaW5kZXgKKyAqCisgKiBSZXR1cm46IGludGVyZmFjZSBpbmRleCwgb3IgMC4KKyAqLworaW50CitiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgaW50IGF0dHJ0eXBlKQoreworCXN0cnVjdCBubGF0dHIgKmF0dHIgPSBubG1zZ19maW5kX2F0dHIobmxoLCBHRU5MX0hEUkxFTiwgYXR0cnR5cGUpOworCisJcmV0dXJuIGF0dHIgPyBubGFfZ2V0X3UzMihhdHRyKSA6IDA7Cit9CisKKy8qKgogICogYmF0YWR2X25ldGxpbmtfbWVzaF9pbmZvX3B1dCAtIGZpbGwgaW4gZ2VuZXJpYyBpbmZvcm1hdGlvbiBhYm91dCBtZXNoCiAgKiAgaW50ZXJmYWNlCiAgKiBAbXNnOiBuZXRsaW5rIG1lc3NhZ2UgdG8gYmUgc2VudCBiYWNrCkBAIC05Myw5ICsxMzksMTcgQEAKIAkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9NRVNIX0lGSU5ERVgsIHNvZnRfaWZhY2UtPmlmaW5kZXgpIHx8CiAJICAgIG5sYV9wdXRfc3RyaW5nKG1zZywgQkFUQURWX0FUVFJfTUVTSF9JRk5BTUUsIHNvZnRfaWZhY2UtPm5hbWUpIHx8CiAJICAgIG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9NRVNIX0FERFJFU1MsIEVUSF9BTEVOLAotCQkgICAgc29mdF9pZmFjZS0+ZGV2X2FkZHIpKQorCQkgICAgc29mdF9pZmFjZS0+ZGV2X2FkZHIpIHx8CisJICAgIG5sYV9wdXRfdTgobXNnLCBCQVRBRFZfQVRUUl9UVF9UVFZOLAorCQkgICAgICAgKHU4KWF0b21pY19yZWFkKCZiYXRfcHJpdi0+dHQudm4pKSkKIAkJZ290byBvdXQ7CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9CTEEKKwlpZiAobmxhX3B1dF91MTYobXNnLCBCQVRBRFZfQVRUUl9CTEFfQ1JDLAorCQkJbnRvaHMoYmF0X3ByaXYtPmJsYS5jbGFpbV9kZXN0Lmdyb3VwKSkpCisJCWdvdG8gb3V0OworI2VuZGlmCisKIAlwcmltYXJ5X2lmID0gYmF0YWR2X3ByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKIAlpZiAocHJpbWFyeV9pZiAmJiBwcmltYXJ5X2lmLT5pZl9zdGF0dXMgPT0gQkFUQURWX0lGX0FDVElWRSkgewogCQloYXJkX2lmYWNlID0gcHJpbWFyeV9pZi0+bmV0X2RldjsKQEAgLTM4MCw2ICs0MzQsMTA2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBiYXRhZHZfbmV0bGlua19kdW1wX2hhcmRpZl9lbnRyeSAtIER1bXAgb25lIGhhcmQgaW50ZXJmYWNlIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBoYXJkX2lmYWNlOiBIYXJkIGludGVyZmFjZSB0byBkdW1wCisgKgorICogUmV0dXJuOiBlcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X25ldGxpbmtfZHVtcF9oYXJkaWZfZW50cnkoc3RydWN0IHNrX2J1ZmYgKm1zZywgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCQkgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gaGFyZF9pZmFjZS0+bmV0X2RldjsKKwl2b2lkICpoZHI7CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIHBvcnRpZCwgc2VxLCAmYmF0YWR2X25ldGxpbmtfZmFtaWx5LCBOTE1fRl9NVUxUSSwKKwkJCSAgQkFUQURWX0NNRF9HRVRfSEFSRElGUyk7CisJaWYgKCFoZHIpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlpZiAobmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9IQVJEX0lGSU5ERVgsCisJCQluZXRfZGV2LT5pZmluZGV4KSB8fAorCSAgICBubGFfcHV0X3N0cmluZyhtc2csIEJBVEFEVl9BVFRSX0hBUkRfSUZOQU1FLAorCQkJICAgbmV0X2Rldi0+bmFtZSkgfHwKKwkgICAgbmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX0hBUkRfQUREUkVTUywgRVRIX0FMRU4sCisJCSAgICBuZXRfZGV2LT5kZXZfYWRkcikpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKGhhcmRfaWZhY2UtPmlmX3N0YXR1cyA9PSBCQVRBRFZfSUZfQUNUSVZFKSB7CisJCWlmIChubGFfcHV0X2ZsYWcobXNnLCBCQVRBRFZfQVRUUl9BQ1RJVkUpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJfQorCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldHVybiAwOworCisgbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCisvKioKKyAqIGJhdGFkdl9uZXRsaW5rX2R1bXBfaGFyZGlmcyAtIER1bXAgYWxsIGhhcmQgaW50ZXJmYWNlIGludG8gYSBtZXNzYWdlcworICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQGNiOiBQYXJhbWV0ZXJzIGZyb20gcXVlcnkKKyAqCisgKiBSZXR1cm46IGVycm9yIGNvZGUsIG9yIGxlbmd0aCBvZiByZXBseSBtZXNzYWdlIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X25ldGxpbmtfZHVtcF9oYXJkaWZzKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChjYi0+c2tiLT5zayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlOworCWludCBpZmluZGV4OworCWludCBwb3J0aWQgPSBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZDsKKwlpbnQgc2VxID0gY2ItPm5saC0+bmxtc2dfc2VxOworCWludCBza2lwID0gY2ItPmFyZ3NbMF07CisJaW50IGkgPSAwOworCisJaWZpbmRleCA9IGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNiLT5ubGgsCisJCQkJCSAgICAgQkFUQURWX0FUVFJfTUVTSF9JRklOREVYKTsKKwlpZiAoIWlmaW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc29mdF9pZmFjZSA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBpZmluZGV4KTsKKwlpZiAoIXNvZnRfaWZhY2UpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKCFiYXRhZHZfc29mdGlmX2lzX3ZhbGlkKHNvZnRfaWZhY2UpKSB7CisJCWRldl9wdXQoc29mdF9pZmFjZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJjdV9yZWFkX2xvY2soKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGhhcmRfaWZhY2UsICZiYXRhZHZfaGFyZGlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGhhcmRfaWZhY2UtPnNvZnRfaWZhY2UgIT0gc29mdF9pZmFjZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChpKysgPCBza2lwKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhdGFkdl9uZXRsaW5rX2R1bXBfaGFyZGlmX2VudHJ5KG1zZywgcG9ydGlkLCBzZXEsCisJCQkJCQkgICAgIGhhcmRfaWZhY2UpKSB7CisJCQlpLS07CisJCQlicmVhazsKKwkJfQorCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCisJZGV2X3B1dChzb2Z0X2lmYWNlKTsKKworCWNiLT5hcmdzWzBdID0gaTsKKworCXJldHVybiBtc2ctPmxlbjsKK30KKwogc3RhdGljIHN0cnVjdCBnZW5sX29wcyBiYXRhZHZfbmV0bGlua19vcHNbXSA9IHsKIAl7CiAJCS5jbWQgPSBCQVRBRFZfQ01EX0dFVF9NRVNIX0lORk8sCkBAIC0zOTksNiArNTUzLDYxIEBACiAJCS5wb2xpY3kgPSBiYXRhZHZfbmV0bGlua19wb2xpY3ksCiAJCS5kb2l0ID0gYmF0YWR2X25ldGxpbmtfdHBfbWV0ZXJfY2FuY2VsLAogCX0sCisJeworCQkuY21kID0gQkFUQURWX0NNRF9HRVRfUk9VVElOR19BTEdPUywKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkucG9saWN5ID0gYmF0YWR2X25ldGxpbmtfcG9saWN5LAorCQkuZHVtcGl0ID0gYmF0YWR2X2FsZ29fZHVtcCwKKwl9LAorCXsKKwkJLmNtZCA9IEJBVEFEVl9DTURfR0VUX0hBUkRJRlMsCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeSA9IGJhdGFkdl9uZXRsaW5rX3BvbGljeSwKKwkJLmR1bXBpdCA9IGJhdGFkdl9uZXRsaW5rX2R1bXBfaGFyZGlmcywKKwl9LAorCXsKKwkJLmNtZCA9IEJBVEFEVl9DTURfR0VUX1RSQU5TVEFCTEVfTE9DQUwsCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeSA9IGJhdGFkdl9uZXRsaW5rX3BvbGljeSwKKwkJLmR1bXBpdCA9IGJhdGFkdl90dF9sb2NhbF9kdW1wLAorCX0sCisJeworCQkuY21kID0gQkFUQURWX0NNRF9HRVRfVFJBTlNUQUJMRV9HTE9CQUwsCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeSA9IGJhdGFkdl9uZXRsaW5rX3BvbGljeSwKKwkJLmR1bXBpdCA9IGJhdGFkdl90dF9nbG9iYWxfZHVtcCwKKwl9LAorCXsKKwkJLmNtZCA9IEJBVEFEVl9DTURfR0VUX09SSUdJTkFUT1JTLAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5wb2xpY3kgPSBiYXRhZHZfbmV0bGlua19wb2xpY3ksCisJCS5kdW1waXQgPSBiYXRhZHZfb3JpZ19kdW1wLAorCX0sCisJeworCQkuY21kID0gQkFUQURWX0NNRF9HRVRfTkVJR0hCT1JTLAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5wb2xpY3kgPSBiYXRhZHZfbmV0bGlua19wb2xpY3ksCisJCS5kdW1waXQgPSBiYXRhZHZfaGFyZGlmX25laWdoX2R1bXAsCisJfSwKKwl7CisJCS5jbWQgPSBCQVRBRFZfQ01EX0dFVF9HQVRFV0FZUywKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkucG9saWN5ID0gYmF0YWR2X25ldGxpbmtfcG9saWN5LAorCQkuZHVtcGl0ID0gYmF0YWR2X2d3X2R1bXAsCisJfSwKKwl7CisJCS5jbWQgPSBCQVRBRFZfQ01EX0dFVF9CTEFfQ0xBSU0sCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLnBvbGljeSA9IGJhdGFkdl9uZXRsaW5rX3BvbGljeSwKKwkJLmR1bXBpdCA9IGJhdGFkdl9ibGFfY2xhaW1fZHVtcCwKKwl9LAorCXsKKwkJLmNtZCA9IEJBVEFEVl9DTURfR0VUX0JMQV9CQUNLQk9ORSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkucG9saWN5ID0gYmF0YWR2X25ldGxpbmtfcG9saWN5LAorCQkuZHVtcGl0ID0gYmF0YWR2X2JsYV9iYWNrYm9uZV9kdW1wLAorCX0sCisKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvbmV0bGluay5oIGIvbmV0L2JhdG1hbi1hZHYvbmV0bGluay5oCmluZGV4IDk0NTY1M2EuLjUyZWIxNjIgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L25ldGxpbmsuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9uZXRsaW5rLmgKQEAgLTIxLDEyICsyMSwxOCBAQAogI2luY2x1ZGUgIm1haW4uaCIKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorCitzdHJ1Y3Qgbmxtc2doZHI7CiAKIHZvaWQgYmF0YWR2X25ldGxpbmtfcmVnaXN0ZXIodm9pZCk7CiB2b2lkIGJhdGFkdl9uZXRsaW5rX3VucmVnaXN0ZXIodm9pZCk7CitpbnQgYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIGludCBhdHRydHlwZSk7CiAKIGludCBiYXRhZHZfbmV0bGlua190cG1ldGVyX25vdGlmeShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LCBjb25zdCB1OCAqZHN0LAogCQkJCSAgdTggcmVzdWx0LCB1MzIgdGVzdF90aW1lLCB1NjQgdG90YWxfYnl0ZXMsCiAJCQkJICB1MzIgY29va2llKTsKIAorZXh0ZXJuIHN0cnVjdCBnZW5sX2ZhbWlseSBiYXRhZHZfbmV0bGlua19mYW1pbHk7CisKICNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfTkVUTElOS19IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvbmV0d29yay1jb2RpbmcuYyBiL25ldC9iYXRtYW4tYWR2L25ldHdvcmstY29kaW5nLmMKaW5kZXggMjkzZWY0Zi4uZTNiYWY2OSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvbmV0d29yay1jb2RpbmcuYworKysgYi9uZXQvYmF0bWFuLWFkdi9uZXR3b3JrLWNvZGluZy5jCkBAIC04NTYsMTQgKzg1NiwxMiBAQAogCWlmICghbmNfbm9kZSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlrcmVmX2dldCgmb3JpZ19uZWlnaF9ub2RlLT5yZWZjb3VudCk7Ci0KIAkvKiBJbml0aWFsaXplIG5jX25vZGUgKi8KIAlJTklUX0xJU1RfSEVBRCgmbmNfbm9kZS0+bGlzdCk7Ci0JZXRoZXJfYWRkcl9jb3B5KG5jX25vZGUtPmFkZHIsIG9yaWdfbm9kZS0+b3JpZyk7Ci0JbmNfbm9kZS0+b3JpZ19ub2RlID0gb3JpZ19uZWlnaF9ub2RlOwogCWtyZWZfaW5pdCgmbmNfbm9kZS0+cmVmY291bnQpOwotCWtyZWZfZ2V0KCZuY19ub2RlLT5yZWZjb3VudCk7CisJZXRoZXJfYWRkcl9jb3B5KG5jX25vZGUtPmFkZHIsIG9yaWdfbm9kZS0+b3JpZyk7CisJa3JlZl9nZXQoJm9yaWdfbmVpZ2hfbm9kZS0+cmVmY291bnQpOworCW5jX25vZGUtPm9yaWdfbm9kZSA9IG9yaWdfbmVpZ2hfbm9kZTsKIAogCS8qIFNlbGVjdCBpbmdvaW5nIG9yIG91dGdvaW5nIGNvZGluZyBub2RlICovCiAJaWYgKGluX2NvZGluZykgewpAQCAtODc5LDYgKzg3Nyw3IEBACiAKIAkvKiBBZGQgbmNfbm9kZSB0byBvcmlnX25vZGUgKi8KIAlzcGluX2xvY2tfYmgobG9jayk7CisJa3JlZl9nZXQoJm5jX25vZGUtPnJlZmNvdW50KTsKIAlsaXN0X2FkZF90YWlsX3JjdSgmbmNfbm9kZS0+bGlzdCwgbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgobG9jayk7CiAKQEAgLTk3OSw3ICs5NzgsNiBAQAogCUlOSVRfTElTVF9IRUFEKCZuY19wYXRoLT5wYWNrZXRfbGlzdCk7CiAJc3Bpbl9sb2NrX2luaXQoJm5jX3BhdGgtPnBhY2tldF9saXN0X2xvY2spOwogCWtyZWZfaW5pdCgmbmNfcGF0aC0+cmVmY291bnQpOwotCWtyZWZfZ2V0KCZuY19wYXRoLT5yZWZjb3VudCk7CiAJbmNfcGF0aC0+bGFzdF92YWxpZCA9IGppZmZpZXM7CiAJZXRoZXJfYWRkcl9jb3B5KG5jX3BhdGgtPm5leHRfaG9wLCBkc3QpOwogCWV0aGVyX2FkZHJfY29weShuY19wYXRoLT5wcmV2X2hvcCwgc3JjKTsKQEAgLTk4OSw2ICs5ODcsNyBAQAogCQkgICBuY19wYXRoLT5uZXh0X2hvcCk7CiAKIAkvKiBBZGQgbmNfcGF0aCB0byBoYXNoIHRhYmxlICovCisJa3JlZl9nZXQoJm5jX3BhdGgtPnJlZmNvdW50KTsKIAloYXNoX2FkZGVkID0gYmF0YWR2X2hhc2hfYWRkKGhhc2gsIGJhdGFkdl9uY19oYXNoX2NvbXBhcmUsCiAJCQkJICAgICBiYXRhZHZfbmNfaGFzaF9jaG9vc2UsICZuY19wYXRoX2tleSwKIAkJCQkgICAgICZuY19wYXRoLT5oYXNoX2VudHJ5KTsKQEAgLTE4ODIsNiArMTg4MSw3IEBACiAJYmF0YWR2X2hhc2hfZGVzdHJveShiYXRfcHJpdi0+bmMuZGVjb2RpbmdfaGFzaCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQkFUTUFOX0FEVl9ERUJVR0ZTCiAvKioKICAqIGJhdGFkdl9uY19ub2Rlc19zZXFfcHJpbnRfdGV4dCAtIHByaW50IHRoZSBuYyBub2RlIGluZm9ybWF0aW9uCiAgKiBAc2VxOiBzZXEgZmlsZSB0byBwcmludCBvbgpAQCAtMTk4MSwzICsxOTgxLDQgQEAKIG91dDoKIAlyZXR1cm4gLUVOT01FTTsKIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5jIGIvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5jCmluZGV4IDM5NDBiNWQuLjVmM2JmYzQgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuYworKysgYi9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMKQEAgLTI4LDExICsyOCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9iYXRtYW5fYWR2Lmg+CiAKICNpbmNsdWRlICJiYXRfYWxnby5oIgogI2luY2x1ZGUgImRpc3RyaWJ1dGVkLWFycC10YWJsZS5oIgpAQCAtNDIsOCArNDYsMTAgQEAKICNpbmNsdWRlICJoYXNoLmgiCiAjaW5jbHVkZSAibG9nLmgiCiAjaW5jbHVkZSAibXVsdGljYXN0LmgiCisjaW5jbHVkZSAibmV0bGluay5oIgogI2luY2x1ZGUgIm5ldHdvcmstY29kaW5nLmgiCiAjaW5jbHVkZSAicm91dGluZy5oIgorI2luY2x1ZGUgInNvZnQtaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKIAogLyogaGFzaCBjbGFzcyBrZXlzICovCkBAIC0xMjcsOSArMTMzLDkgQEAKIAkJZ290byBvdXQ7CiAKIAlrcmVmX2luaXQoJnZsYW4tPnJlZmNvdW50KTsKLQlrcmVmX2dldCgmdmxhbi0+cmVmY291bnQpOwogCXZsYW4tPnZpZCA9IHZpZDsKIAorCWtyZWZfZ2V0KCZ2bGFuLT5yZWZjb3VudCk7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZ2bGFuLT5saXN0LCAmb3JpZ19ub2RlLT52bGFuX2xpc3QpOwogCiBvdXQ6CkBAIC0zODAsNiArMzg2LDcgQEAKIAlvcmlnX2lmaW5mby0+aWZfb3V0Z29pbmcgPSBpZl9vdXRnb2luZzsKIAlJTklUX0hMSVNUX05PREUoJm9yaWdfaWZpbmZvLT5saXN0KTsKIAlrcmVmX2luaXQoJm9yaWdfaWZpbmZvLT5yZWZjb3VudCk7CisKIAlrcmVmX2dldCgmb3JpZ19pZmluZm8tPnJlZmNvdW50KTsKIAlobGlzdF9hZGRfaGVhZF9yY3UoJm9yaWdfaWZpbmZvLT5saXN0LAogCQkJICAgJm9yaWdfbm9kZS0+aWZpbmZvX2xpc3QpOwpAQCAtNDUzLDkgKzQ2MCw5IEBACiAKIAlJTklUX0hMSVNUX05PREUoJm5laWdoX2lmaW5mby0+bGlzdCk7CiAJa3JlZl9pbml0KCZuZWlnaF9pZmluZm8tPnJlZmNvdW50KTsKLQlrcmVmX2dldCgmbmVpZ2hfaWZpbmZvLT5yZWZjb3VudCk7CiAJbmVpZ2hfaWZpbmZvLT5pZl9vdXRnb2luZyA9IGlmX291dGdvaW5nOwogCisJa3JlZl9nZXQoJm5laWdoX2lmaW5mby0+cmVmY291bnQpOwogCWhsaXN0X2FkZF9oZWFkX3JjdSgmbmVpZ2hfaWZpbmZvLT5saXN0LCAmbmVpZ2gtPmlmaW5mb19saXN0KTsKIAogb3V0OgpAQCAtNjQ3LDggKzY1NCw4IEBACiAKIAkvKiBleHRyYSByZWZlcmVuY2UgZm9yIHJldHVybiAqLwogCWtyZWZfaW5pdCgmbmVpZ2hfbm9kZS0+cmVmY291bnQpOwotCWtyZWZfZ2V0KCZuZWlnaF9ub2RlLT5yZWZjb3VudCk7CiAKKwlrcmVmX2dldCgmbmVpZ2hfbm9kZS0+cmVmY291bnQpOwogCWhsaXN0X2FkZF9oZWFkX3JjdSgmbmVpZ2hfbm9kZS0+bGlzdCwgJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdCk7CiAKIAliYXRhZHZfZGJnKEJBVEFEVl9EQkdfQkFUTUFOLCBvcmlnX25vZGUtPmJhdF9wcml2LApAQCAtNjg2LDYgKzY5Myw3IEBACiAJcmV0dXJuIGJhdGFkdl9uZWlnaF9ub2RlX2NyZWF0ZShvcmlnX25vZGUsIGhhcmRfaWZhY2UsIG5laWdoX2FkZHIpOwogfQogCisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUwogLyoqCiAgKiBiYXRhZHZfaGFyZGlmX25laWdoX3NlcV9wcmludF90ZXh0IC0gcHJpbnQgdGhlIHNpbmdsZSBob3AgbmVpZ2hib3VyIGxpc3QKICAqIEBzZXE6IG5laWdoYm91ciB0YWJsZSBzZXFfZmlsZSBzdHJ1Y3QKQEAgLTcxOSw2ICs3MjcsODQgQEAKIAliYXRfcHJpdi0+YWxnb19vcHMtPm5laWdoLnByaW50KGJhdF9wcml2LCBzZXEpOwogCXJldHVybiAwOwogfQorI2VuZGlmCisKKy8qKgorICogYmF0YWR2X2hhcmRpZl9uZWlnaF9kdW1wIC0gRHVtcCB0byBuZXRsaW5rIHRoZSBuZWlnaGJvciBpbmZvcyBmb3IgYSBzcGVjaWZpYworICogIG91dGdvaW5nIGludGVyZmFjZQorICogQG1zZzogbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogcGFyYW1ldGVycyBmb3IgdGhlIGR1bXAKKyAqCisgKiBSZXR1cm46IDAgb3IgZXJyb3IgdmFsdWUKKyAqLworaW50IGJhdGFkdl9oYXJkaWZfbmVpZ2hfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoY2ItPnNrYi0+c2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOworCXN0cnVjdCBuZXRfZGV2aWNlICpoYXJkX2lmYWNlID0gTlVMTDsKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRpZiA9IEJBVEFEVl9JRl9ERUZBVUxUOworCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXY7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmID0gTlVMTDsKKwlpbnQgcmV0OworCWludCBpZmluZGV4LCBoYXJkX2lmaW5kZXg7CisKKwlpZmluZGV4ID0gYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY2ItPm5saCwgQkFUQURWX0FUVFJfTUVTSF9JRklOREVYKTsKKwlpZiAoIWlmaW5kZXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc29mdF9pZmFjZSA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBpZmluZGV4KTsKKwlpZiAoIXNvZnRfaWZhY2UgfHwgIWJhdGFkdl9zb2Z0aWZfaXNfdmFsaWQoc29mdF9pZmFjZSkpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKKworCXByaW1hcnlfaWYgPSBiYXRhZHZfcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOworCWlmICghcHJpbWFyeV9pZiB8fCBwcmltYXJ5X2lmLT5pZl9zdGF0dXMgIT0gQkFUQURWX0lGX0FDVElWRSkgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisKKwloYXJkX2lmaW5kZXggPSBiYXRhZHZfbmV0bGlua19nZXRfaWZpbmRleChjYi0+bmxoLAorCQkJCQkJICBCQVRBRFZfQVRUUl9IQVJEX0lGSU5ERVgpOworCWlmIChoYXJkX2lmaW5kZXgpIHsKKwkJaGFyZF9pZmFjZSA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBoYXJkX2lmaW5kZXgpOworCQlpZiAoaGFyZF9pZmFjZSkKKwkJCWhhcmRpZiA9IGJhdGFkdl9oYXJkaWZfZ2V0X2J5X25ldGRldihoYXJkX2lmYWNlKTsKKworCQlpZiAoIWhhcmRpZikgeworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGhhcmRpZi0+c29mdF9pZmFjZSAhPSBzb2Z0X2lmYWNlKSB7CisJCQlyZXQgPSAtRU5PRU5UOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoIWJhdF9wcml2LT5hbGdvX29wcy0+bmVpZ2guZHVtcCkgeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0X3ByaXYtPmFsZ29fb3BzLT5uZWlnaC5kdW1wKG1zZywgY2IsIGJhdF9wcml2LCBoYXJkaWYpOworCisJcmV0ID0gbXNnLT5sZW47CisKKyBvdXQ6CisJaWYgKGhhcmRpZikKKwkJYmF0YWR2X2hhcmRpZl9wdXQoaGFyZGlmKTsKKwlpZiAoaGFyZF9pZmFjZSkKKwkJZGV2X3B1dChoYXJkX2lmYWNlKTsKKwlpZiAocHJpbWFyeV9pZikKKwkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CisJaWYgKHNvZnRfaWZhY2UpCisJCWRldl9wdXQoc29mdF9pZmFjZSk7CisKKwlyZXR1cm4gcmV0OworfQogCiAvKioKICAqIGJhdGFkdl9vcmlnX2lmaW5mb19yZWxlYXNlIC0gcmVsZWFzZSBvcmlnX2lmaW5mbyBmcm9tIGxpc3RzIGFuZCBxdWV1ZSBmb3IKQEAgLTkwNSw3ICs5OTEsNiBAQAogCiAJLyogZXh0cmEgcmVmZXJlbmNlIGZvciByZXR1cm4gKi8KIAlrcmVmX2luaXQoJm9yaWdfbm9kZS0+cmVmY291bnQpOwotCWtyZWZfZ2V0KCZvcmlnX25vZGUtPnJlZmNvdW50KTsKIAogCW9yaWdfbm9kZS0+YmF0X3ByaXYgPSBiYXRfcHJpdjsKIAlldGhlcl9hZGRyX2NvcHkob3JpZ19ub2RlLT5vcmlnLCBhZGRyKTsKQEAgLTEyNTYsNiArMTM0MSw3IEBACiAJX2JhdGFkdl9wdXJnZV9vcmlnKGJhdF9wcml2KTsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIGludCBiYXRhZHZfb3JpZ19zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopc2VxLT5wcml2YXRlOwpAQCAtMTMyOSw2ICsxNDE1LDg0IEBACiAJCWJhdGFkdl9oYXJkaWZfcHV0KGhhcmRfaWZhY2UpOwogCXJldHVybiAwOwogfQorI2VuZGlmCisKKy8qKgorICogYmF0YWR2X29yaWdfZHVtcCAtIER1bXAgdG8gbmV0bGluayB0aGUgb3JpZ2luYXRvciBpbmZvcyBmb3IgYSBzcGVjaWZpYworICogIG91dGdvaW5nIGludGVyZmFjZQorICogQG1zZzogbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBjYjogcGFyYW1ldGVycyBmb3IgdGhlIGR1bXAKKyAqCisgKiBSZXR1cm46IDAgb3IgZXJyb3IgdmFsdWUKKyAqLworaW50IGJhdGFkdl9vcmlnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KGNiLT5za2ItPnNrKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqc29mdF9pZmFjZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqaGFyZF9pZmFjZSA9IE5VTEw7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkaWYgPSBCQVRBRFZfSUZfREVGQVVMVDsKKwlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2OworCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqcHJpbWFyeV9pZiA9IE5VTEw7CisJaW50IHJldDsKKwlpbnQgaWZpbmRleCwgaGFyZF9pZmluZGV4OworCisJaWZpbmRleCA9IGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNiLT5ubGgsIEJBVEFEVl9BVFRSX01FU0hfSUZJTkRFWCk7CisJaWYgKCFpZmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNvZnRfaWZhY2UgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZpbmRleCk7CisJaWYgKCFzb2Z0X2lmYWNlIHx8ICFiYXRhZHZfc29mdGlmX2lzX3ZhbGlkKHNvZnRfaWZhY2UpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7CisKKwlwcmltYXJ5X2lmID0gYmF0YWR2X3ByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKKwlpZiAoIXByaW1hcnlfaWYgfHwgcHJpbWFyeV9pZi0+aWZfc3RhdHVzICE9IEJBVEFEVl9JRl9BQ1RJVkUpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJaGFyZF9pZmluZGV4ID0gYmF0YWR2X25ldGxpbmtfZ2V0X2lmaW5kZXgoY2ItPm5saCwKKwkJCQkJCSAgQkFUQURWX0FUVFJfSEFSRF9JRklOREVYKTsKKwlpZiAoaGFyZF9pZmluZGV4KSB7CisJCWhhcmRfaWZhY2UgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaGFyZF9pZmluZGV4KTsKKwkJaWYgKGhhcmRfaWZhY2UpCisJCQloYXJkaWYgPSBiYXRhZHZfaGFyZGlmX2dldF9ieV9uZXRkZXYoaGFyZF9pZmFjZSk7CisKKwkJaWYgKCFoYXJkaWYpIHsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChoYXJkaWYtPnNvZnRfaWZhY2UgIT0gc29mdF9pZmFjZSkgeworCQkJcmV0ID0gLUVOT0VOVDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKCFiYXRfcHJpdi0+YWxnb19vcHMtPm9yaWcuZHVtcCkgeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCisJYmF0X3ByaXYtPmFsZ29fb3BzLT5vcmlnLmR1bXAobXNnLCBjYiwgYmF0X3ByaXYsIGhhcmRpZik7CisKKwlyZXQgPSBtc2ctPmxlbjsKKworIG91dDoKKwlpZiAoaGFyZGlmKQorCQliYXRhZHZfaGFyZGlmX3B1dChoYXJkaWYpOworCWlmIChoYXJkX2lmYWNlKQorCQlkZXZfcHV0KGhhcmRfaWZhY2UpOworCWlmIChwcmltYXJ5X2lmKQorCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKKwlpZiAoc29mdF9pZmFjZSkKKwkJZGV2X3B1dChzb2Z0X2lmYWNlKTsKKworCXJldHVybiByZXQ7Cit9CiAKIGludCBiYXRhZHZfb3JpZ19oYXNoX2FkZF9pZihzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2UsCiAJCQkgICAgaW50IG1heF9pZl9udW0pCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmggYi9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmgKaW5kZXggNTY2MzA2Yi4uZWJjNTYxOCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5oCisrKyBiL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuaApAQCAtMzEsNyArMzEsOSBAQAogCiAjaW5jbHVkZSAiaGFzaC5oIgogCitzdHJ1Y3QgbmV0bGlua19jYWxsYmFjazsKIHN0cnVjdCBzZXFfZmlsZTsKK3N0cnVjdCBza19idWZmOwogCiBib29sIGJhdGFkdl9jb21wYXJlX29yaWcoY29uc3Qgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsIGNvbnN0IHZvaWQgKmRhdGEyKTsKIGludCBiYXRhZHZfb3JpZ2luYXRvcl9pbml0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpOwpAQCAtNjEsNiArNjMsNyBAQAogCQkJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZyk7CiB2b2lkIGJhdGFkdl9uZWlnaF9pZmluZm9fcHV0KHN0cnVjdCBiYXRhZHZfbmVpZ2hfaWZpbmZvICpuZWlnaF9pZmluZm8pOwogCitpbnQgYmF0YWR2X2hhcmRpZl9uZWlnaF9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiBpbnQgYmF0YWR2X2hhcmRpZl9uZWlnaF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKIAogc3RydWN0IGJhdGFkdl9vcmlnX2lmaW5mbyAqCkBAIC03Miw2ICs3NSw3IEBACiB2b2lkIGJhdGFkdl9vcmlnX2lmaW5mb19wdXQoc3RydWN0IGJhdGFkdl9vcmlnX2lmaW5mbyAqb3JpZ19pZmluZm8pOwogCiBpbnQgYmF0YWR2X29yaWdfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CitpbnQgYmF0YWR2X29yaWdfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogaW50IGJhdGFkdl9vcmlnX2hhcmRpZl9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKIGludCBiYXRhZHZfb3JpZ19oYXNoX2FkZF9pZihzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2UsCiAJCQkgICAgaW50IG1heF9pZl9udW0pOwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvcGFja2V0LmggYi9uZXQvYmF0bWFuLWFkdi9wYWNrZXQuaAppbmRleCA2YjAxMWZmLi42YWZjMGI4IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9wYWNrZXQuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9wYWNrZXQuaApAQCAtMTI5LDQyICsxMjksNiBAQAogfTsKIAogLyoqCi0gKiBlbnVtIGJhdGFkdl90dF9jbGllbnRfZmxhZ3MgLSBUVCBjbGllbnQgc3BlY2lmaWMgZmxhZ3MKLSAqIEBCQVRBRFZfVFRfQ0xJRU5UX0RFTDogdGhlIGNsaWVudCBoYXMgdG8gYmUgZGVsZXRlZCBmcm9tIHRoZSB0YWJsZQotICogQEJBVEFEVl9UVF9DTElFTlRfUk9BTTogdGhlIGNsaWVudCByb2FtZWQgdG8vZnJvbSBhbm90aGVyIG5vZGUgYW5kIHRoZSBuZXcKLSAqICB1cGRhdGUgdGVsbGluZyBpdHMgbmV3IHJlYWwgbG9jYXRpb24gaGFzIG5vdCBiZWVuIHJlY2VpdmVkL3NlbnQgeWV0Ci0gKiBAQkFUQURWX1RUX0NMSUVOVF9XSUZJOiB0aGlzIGNsaWVudCBpcyBjb25uZWN0ZWQgdGhyb3VnaCBhIHdpZmkgaW50ZXJmYWNlLgotICogIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBieSB0aGUgIkFQIElzb2xhdGlvbiIgZmVhdHVyZQotICogQEJBVEFEVl9UVF9DTElFTlRfSVNPTEE6IHRoaXMgY2xpZW50IGlzIGNvbnNpZGVyZWQgImlzb2xhdGVkIi4gVGhpcwotICogIGluZm9ybWF0aW9uIGlzIHVzZWQgYnkgdGhlIEV4dGVuZGVkIElzb2xhdGlvbiBmZWF0dXJlCi0gKiBAQkFUQURWX1RUX0NMSUVOVF9OT1BVUkdFOiB0aGlzIGNsaWVudCBzaG91bGQgbmV2ZXIgYmUgcmVtb3ZlZCBmcm9tIHRoZSB0YWJsZQotICogQEJBVEFEVl9UVF9DTElFTlRfTkVXOiB0aGlzIGNsaWVudCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgbG9jYWwgdGFibGUgYnV0IGhhcwotICogIG5vdCBiZWVuIGFubm91bmNlZCB5ZXQKLSAqIEBCQVRBRFZfVFRfQ0xJRU5UX1BFTkRJTkc6IHRoaXMgY2xpZW50IGlzIG1hcmtlZCBmb3IgcmVtb3ZhbCBidXQgaXQgaXMga2VwdAotICogIGluIHRoZSB0YWJsZSBmb3Igb25lIG1vcmUgb3JpZ2luYXRvciBpbnRlcnZhbCBmb3IgY29uc2lzdGVuY3kgcHVycG9zZXMKLSAqIEBCQVRBRFZfVFRfQ0xJRU5UX1RFTVA6IHRoaXMgZ2xvYmFsIGNsaWVudCBoYXMgYmVlbiBkZXRlY3RlZCB0byBiZSBwYXJ0IG9mCi0gKiAgdGhlIG5ldHdvcmsgYnV0IG5vIG5ub2RlIGhhcyBhbHJlYWR5IGFubm91bmNlZCBpdAotICoKLSAqIEJpdHMgZnJvbSAwIHRvIDcgYXJlIGNhbGxlZCBfcmVtb3RlIGZsYWdzXyBiZWNhdXNlIHRoZXkgYXJlIHNlbnQgb24gdGhlIHdpcmUuCi0gKiBCaXRzIGZyb20gOCB0byAxNSBhcmUgY2FsbGVkIF9sb2NhbCBmbGFnc18gYmVjYXVzZSB0aGV5IGFyZSB1c2VkIGZvciBsb2NhbAotICogY29tcHV0YXRpb25zIG9ubHkuCi0gKgotICogQml0cyBmcm9tIDQgdG8gNyAtIGEgc3Vic2V0IG9mIHJlbW90ZSBmbGFncyAtIGFyZSBlbnN1cmVkIHRvIGJlIGluIHN5bmMgd2l0aAotICogdGhlIG90aGVyIG5vZGVzIGluIHRoZSBuZXR3b3JrLiBUbyBhY2hpZXZlIHRoaXMgZ29hbCB0aGVzZSBmbGFncyBhcmUgaW5jbHVkZWQKLSAqIGluIHRoZSBUVCBDUkMgY29tcHV0YXRpb24uCi0gKi8KLWVudW0gYmF0YWR2X3R0X2NsaWVudF9mbGFncyB7Ci0JQkFUQURWX1RUX0NMSUVOVF9ERUwgICAgID0gQklUKDApLAotCUJBVEFEVl9UVF9DTElFTlRfUk9BTSAgICA9IEJJVCgxKSwKLQlCQVRBRFZfVFRfQ0xJRU5UX1dJRkkgICAgPSBCSVQoNCksCi0JQkFUQURWX1RUX0NMSUVOVF9JU09MQQkgPSBCSVQoNSksCi0JQkFUQURWX1RUX0NMSUVOVF9OT1BVUkdFID0gQklUKDgpLAotCUJBVEFEVl9UVF9DTElFTlRfTkVXICAgICA9IEJJVCg5KSwKLQlCQVRBRFZfVFRfQ0xJRU5UX1BFTkRJTkcgPSBCSVQoMTApLAotCUJBVEFEVl9UVF9DTElFTlRfVEVNUAkgPSBCSVQoMTEpLAotfTsKLQotLyoqCiAgKiBlbnVtIGJhdGFkdl92bGFuX2ZsYWdzIC0gZmxhZ3MgZm9yIHRoZSBmb3VyIE1TQiBvZiBhbnkgdmxhbiBJRCBmaWVsZAogICogQEJBVEFEVl9WTEFOX0hBU19UQUc6IHdoZXRoZXIgdGhlIGZpZWxkIGNvbnRhaW5zIGEgdmFsaWQgdmxhbiB0YWcgb3Igbm90CiAgKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3JvdXRpbmcuYyBiL25ldC9iYXRtYW4tYWR2L3JvdXRpbmcuYwppbmRleCA3NjAyYzAwLi43ZThkYzY0IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9yb3V0aW5nLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvcm91dGluZy5jCkBAIC03NCwxMSArNzQsMjMgQEAKIAlpZiAoIW9yaWdfaWZpbmZvKQogCQlyZXR1cm47CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JY3Vycl9yb3V0ZXIgPSByY3VfZGVyZWZlcmVuY2Uob3JpZ19pZmluZm8tPnJvdXRlcik7Ci0JaWYgKGN1cnJfcm91dGVyICYmICFrcmVmX2dldF91bmxlc3NfemVybygmY3Vycl9yb3V0ZXItPnJlZmNvdW50KSkKLQkJY3Vycl9yb3V0ZXIgPSBOVUxMOwotCXJjdV9yZWFkX3VubG9jaygpOworCXNwaW5fbG9ja19iaCgmb3JpZ19ub2RlLT5uZWlnaF9saXN0X2xvY2spOworCS8qIGN1cnJfcm91dGVyIHVzZWQgZWFybGllciBtYXkgbm90IGJlIHRoZSBjdXJyZW50IG9yaWdfaWZpbmZvLT5yb3V0ZXIKKwkgKiBhbnltb3JlIGJlY2F1c2UgaXQgd2FzIGRlcmVmZXJlbmNlZCBvdXRzaWRlIG9mIHRoZSBuZWlnaF9saXN0X2xvY2sKKwkgKiBwcm90ZWN0ZWQgcmVnaW9uLiBBZnRlciB0aGUgbmV3IGJlc3QgbmVpZ2hib3IgaGFzIHJlcGxhY2UgdGhlIGN1cnJlbnQKKwkgKiBiZXN0IG5laWdoYm9yIHRoZSByZWZlcmVuY2UgY291bnRlciBuZWVkcyB0byBkZWNyZWFzZS4gQ29uc2VxdWVudGx5LAorCSAqIHRoZSBjb2RlIG5lZWRzIHRvIGVuc3VyZSB0aGUgY3Vycl9yb3V0ZXIgdmFyaWFibGUgY29udGFpbnMgYSBwb2ludGVyCisJICogdG8gdGhlIHJlcGxhY2VkIGJlc3QgbmVpZ2hib3IuCisJICovCisJY3Vycl9yb3V0ZXIgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG9yaWdfaWZpbmZvLT5yb3V0ZXIsIHRydWUpOworCisJLyogaW5jcmVhc2UgcmVmY291bnQgb2YgbmV3IGJlc3QgbmVpZ2hib3IgKi8KKwlpZiAobmVpZ2hfbm9kZSkKKwkJa3JlZl9nZXQoJm5laWdoX25vZGUtPnJlZmNvdW50KTsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihvcmlnX2lmaW5mby0+cm91dGVyLCBuZWlnaF9ub2RlKTsKKwlzcGluX3VubG9ja19iaCgmb3JpZ19ub2RlLT5uZWlnaF9saXN0X2xvY2spOworCWJhdGFkdl9vcmlnX2lmaW5mb19wdXQob3JpZ19pZmluZm8pOwogCiAJLyogcm91dGUgZGVsZXRlZCAqLwogCWlmICgoY3Vycl9yb3V0ZXIpICYmICghbmVpZ2hfbm9kZSkpIHsKQEAgLTEwMCwyNyArMTEyLDYgQEAKIAkJCSAgIGN1cnJfcm91dGVyLT5hZGRyKTsKIAl9CiAKLQlpZiAoY3Vycl9yb3V0ZXIpCi0JCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChjdXJyX3JvdXRlcik7Ci0KLQlzcGluX2xvY2tfYmgoJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdF9sb2NrKTsKLQkvKiBjdXJyX3JvdXRlciB1c2VkIGVhcmxpZXIgbWF5IG5vdCBiZSB0aGUgY3VycmVudCBvcmlnX2lmaW5mby0+cm91dGVyCi0JICogYW55bW9yZSBiZWNhdXNlIGl0IHdhcyBkZXJlZmVyZW5jZWQgb3V0c2lkZSBvZiB0aGUgbmVpZ2hfbGlzdF9sb2NrCi0JICogcHJvdGVjdGVkIHJlZ2lvbi4gQWZ0ZXIgdGhlIG5ldyBiZXN0IG5laWdoYm9yIGhhcyByZXBsYWNlIHRoZSBjdXJyZW50Ci0JICogYmVzdCBuZWlnaGJvciB0aGUgcmVmZXJlbmNlIGNvdW50ZXIgbmVlZHMgdG8gZGVjcmVhc2UuIENvbnNlcXVlbnRseSwKLQkgKiB0aGUgY29kZSBuZWVkcyB0byBlbnN1cmUgdGhlIGN1cnJfcm91dGVyIHZhcmlhYmxlIGNvbnRhaW5zIGEgcG9pbnRlcgotCSAqIHRvIHRoZSByZXBsYWNlZCBiZXN0IG5laWdoYm9yLgotCSAqLwotCWN1cnJfcm91dGVyID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChvcmlnX2lmaW5mby0+cm91dGVyLCB0cnVlKTsKLQotCS8qIGluY3JlYXNlIHJlZmNvdW50IG9mIG5ldyBiZXN0IG5laWdoYm9yICovCi0JaWYgKG5laWdoX25vZGUpCi0JCWtyZWZfZ2V0KCZuZWlnaF9ub2RlLT5yZWZjb3VudCk7Ci0KLQlyY3VfYXNzaWduX3BvaW50ZXIob3JpZ19pZmluZm8tPnJvdXRlciwgbmVpZ2hfbm9kZSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJm9yaWdfbm9kZS0+bmVpZ2hfbGlzdF9sb2NrKTsKLQliYXRhZHZfb3JpZ19pZmluZm9fcHV0KG9yaWdfaWZpbmZvKTsKLQogCS8qIGRlY3JlYXNlIHJlZmNvdW50IG9mIHByZXZpb3VzIGJlc3QgbmVpZ2hib3IgKi8KIAlpZiAoY3Vycl9yb3V0ZXIpCiAJCWJhdGFkdl9uZWlnaF9ub2RlX3B1dChjdXJyX3JvdXRlcik7CkBAIC00NzAsNiArNDYxLDI5IEBACiB9CiAKIC8qKgorICogYmF0YWR2X2xhc3RfYm9uZGluZ19nZXQgLSBHZXQgbGFzdF9ib25kaW5nX2NhbmRpZGF0ZSBvZiBvcmlnX25vZGUKKyAqIEBvcmlnX25vZGU6IG9yaWdpbmF0b3Igbm9kZSB3aG9zZSBsYXN0IGJvbmRpbmcgY2FuZGlkYXRlIHNob3VsZCBiZSByZXRyaWV2ZWQKKyAqCisgKiBSZXR1cm46IGxhc3QgYm9uZGluZyBjYW5kaWRhdGUgb2Ygcm91dGVyIG9yIE5VTEwgaWYgbm90IGZvdW5kCisgKgorICogVGhlIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHJlZmNvdW50ZXIgaW5jcmVhc2VkIGJ5IDEuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmF0YWR2X29yaWdfaWZpbmZvICoKK2JhdGFkdl9sYXN0X2JvbmRpbmdfZ2V0KHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUpCit7CisJc3RydWN0IGJhdGFkdl9vcmlnX2lmaW5mbyAqbGFzdF9ib25kaW5nX2NhbmRpZGF0ZTsKKworCXNwaW5fbG9ja19iaCgmb3JpZ19ub2RlLT5uZWlnaF9saXN0X2xvY2spOworCWxhc3RfYm9uZGluZ19jYW5kaWRhdGUgPSBvcmlnX25vZGUtPmxhc3RfYm9uZGluZ19jYW5kaWRhdGU7CisKKwlpZiAobGFzdF9ib25kaW5nX2NhbmRpZGF0ZSkKKwkJa3JlZl9nZXQoJmxhc3RfYm9uZGluZ19jYW5kaWRhdGUtPnJlZmNvdW50KTsKKwlzcGluX3VubG9ja19iaCgmb3JpZ19ub2RlLT5uZWlnaF9saXN0X2xvY2spOworCisJcmV0dXJuIGxhc3RfYm9uZGluZ19jYW5kaWRhdGU7Cit9CisKKy8qKgogICogYmF0YWR2X2xhc3RfYm9uZGluZ19yZXBsYWNlIC0gUmVwbGFjZSBsYXN0X2JvbmRpbmdfY2FuZGlkYXRlIG9mIG9yaWdfbm9kZQogICogQG9yaWdfbm9kZTogb3JpZ2luYXRvciBub2RlIHdob3NlIGJvbmRpbmcgY2FuZGlkYXRlcyBzaG91bGQgYmUgcmVwbGFjZWQKICAqIEBuZXdfY2FuZGlkYXRlOiBuZXcgYm9uZGluZyBjYW5kaWRhdGUgb3IgTlVMTApAQCAtNTM5LDcgKzU1Myw3IEBACiAJICogcm91dGVyIC0gb2J2aW91c2x5IHRoZXJlIGFyZSBubyBvdGhlciBjYW5kaWRhdGVzLgogCSAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQlsYXN0X2NhbmRpZGF0ZSA9IG9yaWdfbm9kZS0+bGFzdF9ib25kaW5nX2NhbmRpZGF0ZTsKKwlsYXN0X2NhbmRpZGF0ZSA9IGJhdGFkdl9sYXN0X2JvbmRpbmdfZ2V0KG9yaWdfbm9kZSk7CiAJaWYgKGxhc3RfY2FuZGlkYXRlKQogCQlsYXN0X2NhbmRfcm91dGVyID0gcmN1X2RlcmVmZXJlbmNlKGxhc3RfY2FuZGlkYXRlLT5yb3V0ZXIpOwogCkBAIC02MzEsNiArNjQ1LDkgQEAKIAkJYmF0YWR2X29yaWdfaWZpbmZvX3B1dChuZXh0X2NhbmRpZGF0ZSk7CiAJfQogCisJaWYgKGxhc3RfY2FuZGlkYXRlKQorCQliYXRhZHZfb3JpZ19pZmluZm9fcHV0KGxhc3RfY2FuZGlkYXRlKTsKKwogCXJldHVybiByb3V0ZXI7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3NlbmQuYyBiL25ldC9iYXRtYW4tYWR2L3NlbmQuYwppbmRleCA2MTkxMTU5Li44ZDRlMWY1IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9zZW5kLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvc2VuZC5jCkBAIC0zMTUsOCArMzE1LDcgQEAKICAqCiAgKiBXcmFwIHRoZSBnaXZlbiBza2IgaW50byBhIGJhdG1hbi1hZHYgdW5pY2FzdCBvciB1bmljYXN0LTRhZGRyIGhlYWRlcgogICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgQkFUQURWX1VOSUNBU1Qgb3IgQkFUQURWX1VOSUNBU1RfNEFERFIgd2FzIHN1cHBsaWVkCi0gKiBhcyBwYWNrZXRfdHlwZS4gVGhlbiBzZW5kIHRoaXMgZnJhbWUgdG8gdGhlIGdpdmVuIG9yaWdfbm9kZSBhbmQgcmVsZWFzZSBhCi0gKiByZWZlcmVuY2UgdG8gdGhpcyBvcmlnX25vZGUuCisgKiBhcyBwYWNrZXRfdHlwZS4gVGhlbiBzZW5kIHRoaXMgZnJhbWUgdG8gdGhlIGdpdmVuIG9yaWdfbm9kZS4KICAqCiAgKiBSZXR1cm46IE5FVF9YTUlUX0RST1AgaW4gY2FzZSBvZiBlcnJvciBvciBORVRfWE1JVF9TVUNDRVNTIG90aGVyd2lzZS4KICAqLwpAQCAtMzcwLDggKzM2OSw2IEBACiAJCXJldCA9IE5FVF9YTUlUX1NVQ0NFU1M7CiAKIG91dDoKLQlpZiAob3JpZ19ub2RlKQotCQliYXRhZHZfb3JpZ19ub2RlX3B1dChvcmlnX25vZGUpOwogCWlmIChyZXQgPT0gTkVUX1hNSVRfRFJPUCkKIAkJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIHJldDsKQEAgLTQwMyw2ICs0MDAsNyBAQAogCXN0cnVjdCBldGhoZHIgKmV0aGhkciA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOwogCXN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGU7CiAJdTggKnNyYywgKmRzdDsKKwlpbnQgcmV0OwogCiAJc3JjID0gZXRoaGRyLT5oX3NvdXJjZTsKIAlkc3QgPSBldGhoZHItPmhfZGVzdDsKQEAgLTQxNCw4ICs0MTIsMTMgQEAKIAl9CiAJb3JpZ19ub2RlID0gYmF0YWR2X3RyYW5zdGFibGVfc2VhcmNoKGJhdF9wcml2LCBzcmMsIGRzdCwgdmlkKTsKIAotCXJldHVybiBiYXRhZHZfc2VuZF9za2JfdW5pY2FzdChiYXRfcHJpdiwgc2tiLCBwYWNrZXRfdHlwZSwKLQkJCQkgICAgICAgcGFja2V0X3N1YnR5cGUsIG9yaWdfbm9kZSwgdmlkKTsKKwlyZXQgPSBiYXRhZHZfc2VuZF9za2JfdW5pY2FzdChiYXRfcHJpdiwgc2tiLCBwYWNrZXRfdHlwZSwKKwkJCQkgICAgICBwYWNrZXRfc3VidHlwZSwgb3JpZ19ub2RlLCB2aWQpOworCisJaWYgKG9yaWdfbm9kZSkKKwkJYmF0YWR2X29yaWdfbm9kZV9wdXQob3JpZ19ub2RlKTsKKworCXJldHVybiByZXQ7CiB9CiAKIC8qKgpAQCAtNDMzLDEyICs0MzYsMjUgQEAKIAkJCSAgIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlOworCWludCByZXQ7CiAKIAlvcmlnX25vZGUgPSBiYXRhZHZfZ3dfZ2V0X3NlbGVjdGVkX29yaWcoYmF0X3ByaXYpOwotCXJldHVybiBiYXRhZHZfc2VuZF9za2JfdW5pY2FzdChiYXRfcHJpdiwgc2tiLCBCQVRBRFZfVU5JQ0FTVF80QUREUiwKLQkJCQkgICAgICAgQkFUQURWX1BfREFUQSwgb3JpZ19ub2RlLCB2aWQpOworCXJldCA9IGJhdGFkdl9zZW5kX3NrYl91bmljYXN0KGJhdF9wcml2LCBza2IsIEJBVEFEVl9VTklDQVNUXzRBRERSLAorCQkJCSAgICAgIEJBVEFEVl9QX0RBVEEsIG9yaWdfbm9kZSwgdmlkKTsKKworCWlmIChvcmlnX25vZGUpCisJCWJhdGFkdl9vcmlnX25vZGVfcHV0KG9yaWdfbm9kZSk7CisKKwlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIGJhdGFkdl9mb3J3X3BhY2tldF9mcmVlIC0gZnJlZSBhIGZvcndhcmRpbmcgcGFja2V0CisgKiBAZm9yd19wYWNrZXQ6IFRoZSBwYWNrZXQgdG8gZnJlZQorICoKKyAqIFRoaXMgZnJlZXMgYSBmb3J3YXJkaW5nIHBhY2tldCBhbmQgcmVsZWFzZXMgYW55IHJlc291cmNlcyBpdCBtaWdodAorICogaGF2ZSBjbGFpbWVkLgorICovCiB2b2lkIGJhdGFkdl9mb3J3X3BhY2tldF9mcmVlKHN0cnVjdCBiYXRhZHZfZm9yd19wYWNrZXQgKmZvcndfcGFja2V0KQogewogCWtmcmVlX3NrYihmb3J3X3BhY2tldC0+c2tiKTsKQEAgLTQ0Niw5ICs0NjIsNzMgQEAKIAkJYmF0YWR2X2hhcmRpZl9wdXQoZm9yd19wYWNrZXQtPmlmX2luY29taW5nKTsKIAlpZiAoZm9yd19wYWNrZXQtPmlmX291dGdvaW5nKQogCQliYXRhZHZfaGFyZGlmX3B1dChmb3J3X3BhY2tldC0+aWZfb3V0Z29pbmcpOworCWlmIChmb3J3X3BhY2tldC0+cXVldWVfbGVmdCkKKwkJYXRvbWljX2luYyhmb3J3X3BhY2tldC0+cXVldWVfbGVmdCk7CiAJa2ZyZWUoZm9yd19wYWNrZXQpOwogfQogCisvKioKKyAqIGJhdGFkdl9mb3J3X3BhY2tldF9hbGxvYyAtIGFsbG9jYXRlIGEgZm9yd2FyZGluZyBwYWNrZXQKKyAqIEBpZl9pbmNvbWluZzogVGhlIChvcHRpb25hbCkgaWZfaW5jb21pbmcgdG8gYmUgZ3JhYmJlZAorICogQGlmX291dGdvaW5nOiBUaGUgKG9wdGlvbmFsKSBpZl9vdXRnb2luZyB0byBiZSBncmFiYmVkCisgKiBAcXVldWVfbGVmdDogVGhlIChvcHRpb25hbCkgcXVldWUgY291bnRlciB0byBkZWNyZWFzZQorICogQGJhdF9wcml2OiBUaGUgYmF0X3ByaXYgZm9yIHRoZSBtZXNoIG9mIHRoaXMgZm9yd19wYWNrZXQKKyAqCisgKiBBbGxvY2F0ZXMgYSBmb3J3YXJkaW5nIHBhY2tldCBhbmQgdHJpZXMgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZQorICogKG9wdGlvbmFsKSBpZl9pbmNvbWluZywgaWZfb3V0Z29pbmcgYW5kIHF1ZXVlX2xlZnQuIElmIHF1ZXVlX2xlZnQKKyAqIGlzIE5VTEwgdGhlbiBiYXRfcHJpdiBpcyBvcHRpb25hbCwgdG9vLgorICoKKyAqIFJldHVybjogQW4gYWxsb2NhdGVkIGZvcndhcmRpbmcgcGFja2V0IG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlLgorICovCitzdHJ1Y3QgYmF0YWR2X2ZvcndfcGFja2V0ICoKK2JhdGFkdl9mb3J3X3BhY2tldF9hbGxvYyhzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX2luY29taW5nLAorCQkJIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfb3V0Z29pbmcsCisJCQkgYXRvbWljX3QgKnF1ZXVlX2xlZnQsCisJCQkgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdikKK3sKKwlzdHJ1Y3QgYmF0YWR2X2ZvcndfcGFja2V0ICpmb3J3X3BhY2tldDsKKwljb25zdCBjaGFyICpxbmFtZTsKKworCWlmIChxdWV1ZV9sZWZ0ICYmICFiYXRhZHZfYXRvbWljX2RlY19ub3RfemVybyhxdWV1ZV9sZWZ0KSkgeworCQlxbmFtZSA9ICJ1bmtub3duIjsKKworCQlpZiAocXVldWVfbGVmdCA9PSAmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQpCisJCQlxbmFtZSA9ICJiY2FzdCI7CisKKwkJaWYgKHF1ZXVlX2xlZnQgPT0gJmJhdF9wcml2LT5iYXRtYW5fcXVldWVfbGVmdCkKKwkJCXFuYW1lID0gImJhdG1hbiI7CisKKwkJYmF0YWR2X2RiZyhCQVRBRFZfREJHX0JBVE1BTiwgYmF0X3ByaXYsCisJCQkgICAiJXMgcXVldWUgaXMgZnVsbFxuIiwgcW5hbWUpOworCisJCXJldHVybiBOVUxMOworCX0KKworCWZvcndfcGFja2V0ID0ga21hbGxvYyhzaXplb2YoKmZvcndfcGFja2V0KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFmb3J3X3BhY2tldCkKKwkJZ290byBlcnI7CisKKwlpZiAoaWZfaW5jb21pbmcpCisJCWtyZWZfZ2V0KCZpZl9pbmNvbWluZy0+cmVmY291bnQpOworCisJaWYgKGlmX291dGdvaW5nKQorCQlrcmVmX2dldCgmaWZfb3V0Z29pbmctPnJlZmNvdW50KTsKKworCWZvcndfcGFja2V0LT5za2IgPSBOVUxMOworCWZvcndfcGFja2V0LT5xdWV1ZV9sZWZ0ID0gcXVldWVfbGVmdDsKKwlmb3J3X3BhY2tldC0+aWZfaW5jb21pbmcgPSBpZl9pbmNvbWluZzsKKwlmb3J3X3BhY2tldC0+aWZfb3V0Z29pbmcgPSBpZl9vdXRnb2luZzsKKwlmb3J3X3BhY2tldC0+bnVtX3BhY2tldHMgPSAwOworCisJcmV0dXJuIGZvcndfcGFja2V0OworCitlcnI6CisJaWYgKHF1ZXVlX2xlZnQpCisJCWF0b21pY19pbmMocXVldWVfbGVmdCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHZvaWQKIF9iYXRhZHZfYWRkX2JjYXN0X3BhY2tldF90b19saXN0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCiAJCQkJIHN0cnVjdCBiYXRhZHZfZm9yd19wYWNrZXQgKmZvcndfcGFja2V0LApAQCAtNDg3LDI0ICs1NjcsMjAgQEAKIAlzdHJ1Y3QgYmF0YWR2X2JjYXN0X3BhY2tldCAqYmNhc3RfcGFja2V0OwogCXN0cnVjdCBza19idWZmICpuZXdza2I7CiAKLQlpZiAoIWJhdGFkdl9hdG9taWNfZGVjX25vdF96ZXJvKCZiYXRfcHJpdi0+YmNhc3RfcXVldWVfbGVmdCkpIHsKLQkJYmF0YWR2X2RiZyhCQVRBRFZfREJHX0JBVE1BTiwgYmF0X3ByaXYsCi0JCQkgICAiYmNhc3QgcGFja2V0IHF1ZXVlIGZ1bGxcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlwcmltYXJ5X2lmID0gYmF0YWR2X3ByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKIAlpZiAoIXByaW1hcnlfaWYpCi0JCWdvdG8gb3V0X2FuZF9pbmM7CisJCWdvdG8gZXJyOwogCi0JZm9yd19wYWNrZXQgPSBrbWFsbG9jKHNpemVvZigqZm9yd19wYWNrZXQpLCBHRlBfQVRPTUlDKTsKLQorCWZvcndfcGFja2V0ID0gYmF0YWR2X2ZvcndfcGFja2V0X2FsbG9jKHByaW1hcnlfaWYsIE5VTEwsCisJCQkJCSAgICAgICAmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQsCisJCQkJCSAgICAgICBiYXRfcHJpdik7CisJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CiAJaWYgKCFmb3J3X3BhY2tldCkKLQkJZ290byBvdXRfYW5kX2luYzsKKwkJZ290byBlcnI7CiAKIAluZXdza2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOwogCWlmICghbmV3c2tiKQotCQlnb3RvIHBhY2tldF9mcmVlOworCQlnb3RvIGVycl9wYWNrZXRfZnJlZTsKIAogCS8qIGFzIHdlIGhhdmUgYSBjb3B5IG5vdywgaXQgaXMgc2FmZSB0byBkZWNyZWFzZSB0aGUgVFRMICovCiAJYmNhc3RfcGFja2V0ID0gKHN0cnVjdCBiYXRhZHZfYmNhc3RfcGFja2V0ICopbmV3c2tiLT5kYXRhOwpAQCAtNTEzLDExICs1ODksNiBAQAogCXNrYl9yZXNldF9tYWNfaGVhZGVyKG5ld3NrYik7CiAKIAlmb3J3X3BhY2tldC0+c2tiID0gbmV3c2tiOwotCWZvcndfcGFja2V0LT5pZl9pbmNvbWluZyA9IHByaW1hcnlfaWY7Ci0JZm9yd19wYWNrZXQtPmlmX291dGdvaW5nID0gTlVMTDsKLQotCS8qIGhvdyBvZnRlbiBkaWQgd2Ugc2VuZCB0aGUgYmNhc3QgcGFja2V0ID8gKi8KLQlmb3J3X3BhY2tldC0+bnVtX3BhY2tldHMgPSAwOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmZvcndfcGFja2V0LT5kZWxheWVkX3dvcmssCiAJCQkgIGJhdGFkdl9zZW5kX291dHN0YW5kaW5nX2JjYXN0X3BhY2tldCk7CkBAIC01MjUsMTMgKzU5Niw5IEBACiAJX2JhdGFkdl9hZGRfYmNhc3RfcGFja2V0X3RvX2xpc3QoYmF0X3ByaXYsIGZvcndfcGFja2V0LCBkZWxheSk7CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAotcGFja2V0X2ZyZWU6Ci0Ja2ZyZWUoZm9yd19wYWNrZXQpOwotb3V0X2FuZF9pbmM6Ci0JYXRvbWljX2luYygmYmF0X3ByaXYtPmJjYXN0X3F1ZXVlX2xlZnQpOwotb3V0OgotCWlmIChwcmltYXJ5X2lmKQotCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKK2Vycl9wYWNrZXRfZnJlZToKKwliYXRhZHZfZm9yd19wYWNrZXRfZnJlZShmb3J3X3BhY2tldCk7CitlcnI6CiAJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogfQogCkBAIC01OTIsNyArNjU5LDYgQEAKIAogb3V0OgogCWJhdGFkdl9mb3J3X3BhY2tldF9mcmVlKGZvcndfcGFja2V0KTsKLQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmNhc3RfcXVldWVfbGVmdCk7CiB9CiAKIHZvaWQKQEAgLTYzMyw5ICs2OTksNiBAQAogCiAJCWlmIChwZW5kaW5nKSB7CiAJCQlobGlzdF9kZWwoJmZvcndfcGFja2V0LT5saXN0KTsKLQkJCWlmICghZm9yd19wYWNrZXQtPm93bikKLQkJCQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmNhc3RfcXVldWVfbGVmdCk7Ci0KIAkJCWJhdGFkdl9mb3J3X3BhY2tldF9mcmVlKGZvcndfcGFja2V0KTsKIAkJfQogCX0KQEAgLTY2Myw5ICs3MjYsNiBAQAogCiAJCWlmIChwZW5kaW5nKSB7CiAJCQlobGlzdF9kZWwoJmZvcndfcGFja2V0LT5saXN0KTsKLQkJCWlmICghZm9yd19wYWNrZXQtPm93bikKLQkJCQlhdG9taWNfaW5jKCZiYXRfcHJpdi0+YmF0bWFuX3F1ZXVlX2xlZnQpOwotCiAJCQliYXRhZHZfZm9yd19wYWNrZXRfZnJlZShmb3J3X3BhY2tldCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9zZW5kLmggYi9uZXQvYmF0bWFuLWFkdi9zZW5kLmgKaW5kZXggN2NlY2I3NS4uOTk5Zjc4NiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvc2VuZC5oCisrKyBiL25ldC9iYXRtYW4tYWR2L3NlbmQuaApAQCAtMjgsNiArMjgsMTIgQEAKIHN0cnVjdCBza19idWZmOwogCiB2b2lkIGJhdGFkdl9mb3J3X3BhY2tldF9mcmVlKHN0cnVjdCBiYXRhZHZfZm9yd19wYWNrZXQgKmZvcndfcGFja2V0KTsKK3N0cnVjdCBiYXRhZHZfZm9yd19wYWNrZXQgKgorYmF0YWR2X2ZvcndfcGFja2V0X2FsbG9jKHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaWZfaW5jb21pbmcsCisJCQkgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZywKKwkJCSBhdG9taWNfdCAqcXVldWVfbGVmdCwKKwkJCSBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2KTsKKwogaW50IGJhdGFkdl9zZW5kX3NrYl90b19vcmlnKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSwKIAkJCSAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnJlY3ZfaWYpOwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYyBiL25ldC9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMKaW5kZXggNzUyN2MwNi4uNDllMTZiNiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYworKysgYi9uZXQvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgpAQCAtNDYsNyArNDcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNsdWRlICJiYXRfYWxnby5oIgogI2luY2x1ZGUgImJyaWRnZV9sb29wX2F2b2lkYW5jZS5oIgpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAibXVsdGljYXN0LmgiCiAjaW5jbHVkZSAibmV0d29yay1jb2RpbmcuaCIKKyNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCiAjaW5jbHVkZSAicGFja2V0LmgiCiAjaW5jbHVkZSAic2VuZC5oIgogI2luY2x1ZGUgInN5c2ZzLmgiCkBAIC0zNzcsNiArMzc4LDggQEAKIGRyb3BwZWRfZnJlZWQ6CiAJYmF0YWR2X2luY19jb3VudGVyKGJhdF9wcml2LCBCQVRBRFZfQ05UX1RYX0RST1BQRUQpOwogZW5kOgorCWlmIChtY2FzdF9zaW5nbGVfb3JpZykKKwkJYmF0YWR2X29yaWdfbm9kZV9wdXQobWNhc3Rfc2luZ2xlX29yaWcpOwogCWlmIChwcmltYXJ5X2lmKQogCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwpAQCAtNTkxLDYgKzU5NCw3IEBACiAJfQogCiAJc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+c29mdGlmX3ZsYW5fbGlzdF9sb2NrKTsKKwlrcmVmX2dldCgmdmxhbi0+cmVmY291bnQpOwogCWhsaXN0X2FkZF9oZWFkX3JjdSgmdmxhbi0+bGlzdCwgJmJhdF9wcml2LT5zb2Z0aWZfdmxhbl9saXN0KTsKIAlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnNvZnRpZl92bGFuX2xpc3RfbG9jayk7CiAKQEAgLTYwMSw2ICs2MDUsOSBAQAogCQkJICAgIGJhdF9wcml2LT5zb2Z0X2lmYWNlLT5kZXZfYWRkciwgdmlkLAogCQkJICAgIEJBVEFEVl9OVUxMX0lGSU5ERVgsIEJBVEFEVl9OT19NQVJLKTsKIAorCS8qIGRvbid0IHJldHVybiByZWZlcmVuY2UgdG8gbmV3IHNvZnRpZl92bGFuICovCisJYmF0YWR2X3NvZnRpZl92bGFuX3B1dCh2bGFuKTsKKwogCXJldHVybiAwOwogfQogCkBAIC03NDcsMzQgKzc1NCw2IEBACiB9CiAKIC8qKgotICogYmF0YWR2X3NvZnRpZl9kZXN0cm95X2ZpbmlzaCAtIGNsZWFucyB1cCB0aGUgcmVtYWlucyBvZiBhIHNvZnRpZgotICogQHdvcms6IHdvcmsgcXVldWUgaXRlbQotICoKLSAqIEZyZWUgdGhlIHBhcnRzIG9mIHRoZSBzb2Z0IGludGVyZmFjZSB3aGljaCBjYW4gbm90IGJlIHJlbW92ZWQgdW5kZXIKLSAqIHJ0bmwgbG9jayAodG8gcHJldmVudCBkZWFkbG9jayBzaXR1YXRpb25zKS4KLSAqLwotc3RhdGljIHZvaWQgYmF0YWR2X3NvZnRpZl9kZXN0cm95X2ZpbmlzaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGJhdGFkdl9zb2Z0aWZfdmxhbiAqdmxhbjsKLQlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2OwotCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOwotCi0JYmF0X3ByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJhdGFkdl9wcml2LAotCQkJCWNsZWFudXBfd29yayk7Ci0Jc29mdF9pZmFjZSA9IGJhdF9wcml2LT5zb2Z0X2lmYWNlOwotCi0JLyogZGVzdHJveSB0aGUgInVudGFnZ2VkIiBWTEFOICovCi0JdmxhbiA9IGJhdGFkdl9zb2Z0aWZfdmxhbl9nZXQoYmF0X3ByaXYsIEJBVEFEVl9OT19GTEFHUyk7Ci0JaWYgKHZsYW4pIHsKLQkJYmF0YWR2X3NvZnRpZl9kZXN0cm95X3ZsYW4oYmF0X3ByaXYsIHZsYW4pOwotCQliYXRhZHZfc29mdGlmX3ZsYW5fcHV0KHZsYW4pOwotCX0KLQotCWJhdGFkdl9zeXNmc19kZWxfbWVzaGlmKHNvZnRfaWZhY2UpOwotCXVucmVnaXN0ZXJfbmV0ZGV2KHNvZnRfaWZhY2UpOwotfQotCi0vKioKICAqIGJhdGFkdl9zb2Z0aWZfaW5pdF9sYXRlIC0gbGF0ZSBzdGFnZSBpbml0aWFsaXphdGlvbiBvZiBzb2Z0IGludGVyZmFjZQogICogQGRldjogcmVnaXN0ZXJlZCBuZXR3b3JrIGRldmljZSB0byBtb2RpZnkKICAqCkBAIC03OTEsNyArNzcwLDYgQEAKIAogCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAliYXRfcHJpdi0+c29mdF9pZmFjZSA9IGRldjsKLQlJTklUX1dPUksoJmJhdF9wcml2LT5jbGVhbnVwX3dvcmssIGJhdGFkdl9zb2Z0aWZfZGVzdHJveV9maW5pc2gpOwogCiAJLyogYmF0YWR2X2ludGVyZmFjZV9zdGF0cygpIG5lZWRzIHRvIGJlIGF2YWlsYWJsZSBhcyBzb29uIGFzCiAJICogcmVnaXN0ZXJfbmV0ZGV2aWNlKCkgaGFzIGJlZW4gY2FsbGVkCkBAIC0xMDI4LDggKzEwMDYsMTkgQEAKIHZvaWQgYmF0YWR2X3NvZnRpZl9kZXN0cm95X3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlKQogewogCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihzb2Z0X2lmYWNlKTsKKwlzdHJ1Y3QgYmF0YWR2X3NvZnRpZl92bGFuICp2bGFuOwogCi0JcXVldWVfd29yayhiYXRhZHZfZXZlbnRfd29ya3F1ZXVlLCAmYmF0X3ByaXYtPmNsZWFudXBfd29yayk7CisJQVNTRVJUX1JUTkwoKTsKKworCS8qIGRlc3Ryb3kgdGhlICJ1bnRhZ2dlZCIgVkxBTiAqLworCXZsYW4gPSBiYXRhZHZfc29mdGlmX3ZsYW5fZ2V0KGJhdF9wcml2LCBCQVRBRFZfTk9fRkxBR1MpOworCWlmICh2bGFuKSB7CisJCWJhdGFkdl9zb2Z0aWZfZGVzdHJveV92bGFuKGJhdF9wcml2LCB2bGFuKTsKKwkJYmF0YWR2X3NvZnRpZl92bGFuX3B1dCh2bGFuKTsKKwl9CisKKwliYXRhZHZfc3lzZnNfZGVsX21lc2hpZihzb2Z0X2lmYWNlKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZShzb2Z0X2lmYWNlKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9zeXNmcy5jIGIvbmV0L2JhdG1hbi1hZHYvc3lzZnMuYwppbmRleCBmZTljYTk0Li4wMmQ5NmYyIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9zeXNmcy5jCisrKyBiL25ldC9iYXRtYW4tYWR2L3N5c2ZzLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2luY2x1ZGUgImJyaWRnZV9sb29wX2F2b2lkYW5jZS5oIgogI2luY2x1ZGUgImRpc3RyaWJ1dGVkLWFycC10YWJsZS5oIgpAQCAtNDI4LDYgKzQyOSwxMyBAQAogCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYgPSBiYXRhZHZfa29ial90b19iYXRwcml2KGtvYmopOwogCWludCBieXRlc193cml0dGVuOwogCisJLyogR1cgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGlmIHRoZSByb3V0aW5nIGFsZ29yaXRobSBpbiB1c2UgZG9lcyBub3QKKwkgKiBpbXBsZW1lbnQgdGhlIEdXIEFQSQorCSAqLworCWlmICghYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5nZXRfYmVzdF9nd19ub2RlIHx8CisJICAgICFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmlzX2VsaWdpYmxlKQorCQlyZXR1cm4gLUVOT0VOVDsKKwogCXN3aXRjaCAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5ndy5tb2RlKSkgewogCWNhc2UgQkFUQURWX0dXX01PREVfQ0xJRU5UOgogCQlieXRlc193cml0dGVuID0gc3ByaW50ZihidWZmLCAiJXNcbiIsCkBAIC00NTUsNiArNDYzLDEzIEBACiAJY2hhciAqY3Vycl9nd19tb2RlX3N0cjsKIAlpbnQgZ3dfbW9kZV90bXAgPSAtMTsKIAorCS8qIHRvZ2dsaW5nIEdXIG1vZGUgaXMgYWxsb3dlZCBvbmx5IGlmIHRoZSByb3V0aW5nIGFsZ29yaXRobSBpbiB1c2UKKwkgKiBwcm92aWRlcyB0aGUgR1cgQVBJCisJICovCisJaWYgKCFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmdldF9iZXN0X2d3X25vZGUgfHwKKwkgICAgIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuaXNfZWxpZ2libGUpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKGJ1ZmZbY291bnQgLSAxXSA9PSAnXG4nKQogCQlidWZmW2NvdW50IC0gMV0gPSAnXDAnOwogCkBAIC01MTQsNiArNTI5LDUwIEBACiAJcmV0dXJuIGNvdW50OwogfQogCitzdGF0aWMgc3NpemVfdCBiYXRhZHZfc2hvd19nd19zZWxfY2xhc3Moc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmYpCit7CisJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiA9IGJhdGFkdl9rb2JqX3RvX2JhdHByaXYoa29iaik7CisKKwkvKiBHVyBzZWxlY3Rpb24gY2xhc3MgaXMgbm90IGF2YWlsYWJsZSBpZiB0aGUgcm91dGluZyBhbGdvcml0aG0gaW4gdXNlCisJICogZG9lcyBub3QgaW1wbGVtZW50IHRoZSBHVyBBUEkKKwkgKi8KKwlpZiAoIWJhdF9wcml2LT5hbGdvX29wcy0+Z3cuZ2V0X2Jlc3RfZ3dfbm9kZSB8fAorCSAgICAhYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5pc19lbGlnaWJsZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAoYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5zaG93X3NlbF9jbGFzcykKKwkJcmV0dXJuIGJhdF9wcml2LT5hbGdvX29wcy0+Z3cuc2hvd19zZWxfY2xhc3MoYmF0X3ByaXYsIGJ1ZmYpOworCisJcmV0dXJuIHNwcmludGYoYnVmZiwgIiVpXG4iLCBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcykpOworfQorCitzdGF0aWMgc3NpemVfdCBiYXRhZHZfc3RvcmVfZ3dfc2VsX2NsYXNzKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCQkgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmZiwKKwkJCQkJIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2ID0gYmF0YWR2X2tvYmpfdG9fYmF0cHJpdihrb2JqKTsKKworCS8qIHNldHRpbmcgdGhlIEdXIHNlbGVjdGlvbiBjbGFzcyBpcyBhbGxvd2VkIG9ubHkgaWYgdGhlIHJvdXRpbmcKKwkgKiBhbGdvcml0aG0gaW4gdXNlIGltcGxlbWVudHMgdGhlIEdXIEFQSQorCSAqLworCWlmICghYmF0X3ByaXYtPmFsZ29fb3BzLT5ndy5nZXRfYmVzdF9nd19ub2RlIHx8CisJICAgICFiYXRfcHJpdi0+YWxnb19vcHMtPmd3LmlzX2VsaWdpYmxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChidWZmW2NvdW50IC0gMV0gPT0gJ1xuJykKKwkJYnVmZltjb3VudCAtIDFdID0gJ1wwJzsKKworCWlmIChiYXRfcHJpdi0+YWxnb19vcHMtPmd3LnN0b3JlX3NlbF9jbGFzcykKKwkJcmV0dXJuIGJhdF9wcml2LT5hbGdvX29wcy0+Z3cuc3RvcmVfc2VsX2NsYXNzKGJhdF9wcml2LCBidWZmLAorCQkJCQkJCSAgICAgIGNvdW50KTsKKworCXJldHVybiBfX2JhdGFkdl9zdG9yZV91aW50X2F0dHIoYnVmZiwgY291bnQsIDEsIEJBVEFEVl9UUV9NQVhfVkFMVUUsCisJCQkJCWJhdGFkdl9wb3N0X2d3X3Jlc2VsZWN0LCBhdHRyLAorCQkJCQkmYmF0X3ByaXYtPmd3LnNlbF9jbGFzcywKKwkJCQkJYmF0X3ByaXYtPnNvZnRfaWZhY2UpOworfQorCiBzdGF0aWMgc3NpemVfdCBiYXRhZHZfc2hvd19nd19id2lkdGgoc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmKQogewpAQCAtNjI1LDggKzY4NCw4IEBACiAJCSAgICAgMiAqIEJBVEFEVl9KSVRURVIsIElOVF9NQVgsIE5VTEwpOwogQkFUQURWX0FUVFJfU0lGX1VJTlQoaG9wX3BlbmFsdHksIGhvcF9wZW5hbHR5LCBTX0lSVUdPIHwgU19JV1VTUiwgMCwKIAkJICAgICBCQVRBRFZfVFFfTUFYX1ZBTFVFLCBOVUxMKTsKLUJBVEFEVl9BVFRSX1NJRl9VSU5UKGd3X3NlbF9jbGFzcywgZ3cuc2VsX2NsYXNzLCBTX0lSVUdPIHwgU19JV1VTUiwgMSwKLQkJICAgICBCQVRBRFZfVFFfTUFYX1ZBTFVFLCBiYXRhZHZfcG9zdF9nd19yZXNlbGVjdCk7CitzdGF0aWMgQkFUQURWX0FUVFIoZ3dfc2VsX2NsYXNzLCBTX0lSVUdPIHwgU19JV1VTUiwgYmF0YWR2X3Nob3dfZ3dfc2VsX2NsYXNzLAorCQkgICBiYXRhZHZfc3RvcmVfZ3dfc2VsX2NsYXNzKTsKIHN0YXRpYyBCQVRBRFZfQVRUUihnd19iYW5kd2lkdGgsIFNfSVJVR08gfCBTX0lXVVNSLCBiYXRhZHZfc2hvd19nd19id2lkdGgsCiAJCSAgIGJhdGFkdl9zdG9yZV9nd19id2lkdGgpOwogI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX01DQVNUCkBAIC03MTIsNiArNzcxLDggQEAKIAlmb3IgKGJhdF9hdHRyID0gYmF0YWR2X21lc2hfYXR0cnM7ICpiYXRfYXR0cjsgKytiYXRfYXR0cikKIAkJc3lzZnNfcmVtb3ZlX2ZpbGUoYmF0X3ByaXYtPm1lc2hfb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7CiAKKwlrb2JqZWN0X3VldmVudChiYXRfcHJpdi0+bWVzaF9vYmosIEtPQkpfUkVNT1ZFKTsKKwlrb2JqZWN0X2RlbChiYXRfcHJpdi0+bWVzaF9vYmopOwogCWtvYmplY3RfcHV0KGJhdF9wcml2LT5tZXNoX29iaik7CiAJYmF0X3ByaXYtPm1lc2hfb2JqID0gTlVMTDsKIG91dDoKQEAgLTcyNiw2ICs3ODcsOCBAQAogCWZvciAoYmF0X2F0dHIgPSBiYXRhZHZfbWVzaF9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKQogCQlzeXNmc19yZW1vdmVfZmlsZShiYXRfcHJpdi0+bWVzaF9vYmosICYoKCpiYXRfYXR0ciktPmF0dHIpKTsKIAorCWtvYmplY3RfdWV2ZW50KGJhdF9wcml2LT5tZXNoX29iaiwgS09CSl9SRU1PVkUpOworCWtvYmplY3RfZGVsKGJhdF9wcml2LT5tZXNoX29iaik7CiAJa29iamVjdF9wdXQoYmF0X3ByaXYtPm1lc2hfb2JqKTsKIAliYXRfcHJpdi0+bWVzaF9vYmogPSBOVUxMOwogfQpAQCAtNzgxLDYgKzg0NCwxMCBAQAogCWZvciAoYmF0X2F0dHIgPSBiYXRhZHZfdmxhbl9hdHRyczsgKmJhdF9hdHRyOyArK2JhdF9hdHRyKQogCQlzeXNmc19yZW1vdmVfZmlsZSh2bGFuLT5rb2JqLCAmKCgqYmF0X2F0dHIpLT5hdHRyKSk7CiAKKwlpZiAodmxhbi0+a29iaiAhPSBiYXRfcHJpdi0+bWVzaF9vYmopIHsKKwkJa29iamVjdF91ZXZlbnQodmxhbi0+a29iaiwgS09CSl9SRU1PVkUpOworCQlrb2JqZWN0X2RlbCh2bGFuLT5rb2JqKTsKKwl9CiAJa29iamVjdF9wdXQodmxhbi0+a29iaik7CiAJdmxhbi0+a29iaiA9IE5VTEw7CiBvdXQ6CkBAIC04MDAsNiArODY3LDEwIEBACiAJZm9yIChiYXRfYXR0ciA9IGJhdGFkdl92bGFuX2F0dHJzOyAqYmF0X2F0dHI7ICsrYmF0X2F0dHIpCiAJCXN5c2ZzX3JlbW92ZV9maWxlKHZsYW4tPmtvYmosICYoKCpiYXRfYXR0ciktPmF0dHIpKTsKIAorCWlmICh2bGFuLT5rb2JqICE9IGJhdF9wcml2LT5tZXNoX29iaikgeworCQlrb2JqZWN0X3VldmVudCh2bGFuLT5rb2JqLCBLT0JKX1JFTU9WRSk7CisJCWtvYmplY3RfZGVsKHZsYW4tPmtvYmopOworCX0KIAlrb2JqZWN0X3B1dCh2bGFuLT5rb2JqKTsKIAl2bGFuLT5rb2JqID0gTlVMTDsKIH0KQEAgLTgyOCwzMSArODk5LDMxIEBACiAJcmV0dXJuIGxlbmd0aDsKIH0KIAotc3RhdGljIHNzaXplX3QgYmF0YWR2X3N0b3JlX21lc2hfaWZhY2Uoc3RydWN0IGtvYmplY3QgKmtvYmosCi0JCQkJICAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmYsCi0JCQkJICAgICAgIHNpemVfdCBjb3VudCkKKy8qKgorICogYmF0YWR2X3N0b3JlX21lc2hfaWZhY2VfZmluaXNoIC0gc3RvcmUgbmV3IGhhcmRpZiBtZXNoX2lmYWNlIHN0YXRlCisgKiBAbmV0X2RldjogbmV0ZGV2aWNlIHRvIGFkZC9yZW1vdmUgdG8vZnJvbSBiYXRtYW4tYWR2IHNvZnQtaW50ZXJmYWNlCisgKiBAaWZuYW1lOiBuYW1lIG9mIHNvZnQtaW50ZXJmYWNlIHRvIG1vZGlmeQorICoKKyAqIENoYW5nZXMgdGhlIHBhcnRzIG9mIHRoZSBoYXJkK3NvZnQgaW50ZXJmYWNlIHdoaWNoIGNhbiBub3QgYmUgbW9kaWZpZWQgdW5kZXIKKyAqIHN5c2ZzIGxvY2sgKHRvIHByZXZlbnQgZGVhZGxvY2sgc2l0dWF0aW9ucykuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIDAgPCBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgYmF0YWR2X3N0b3JlX21lc2hfaWZhY2VfZmluaXNoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAorCQkJCQkgIGNoYXIgaWZuYW1lW0lGTkFNU0laXSkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGJhdGFkdl9rb2JqX3RvX25ldGRldihrb2JqKTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KG5ldF9kZXYpOwogCXN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZTsKLQlpbnQgc3RhdHVzX3RtcCA9IC0xOwotCWludCByZXQgPSBjb3VudDsKKwlpbnQgc3RhdHVzX3RtcDsKKwlpbnQgcmV0ID0gMDsKKworCUFTU0VSVF9SVE5MKCk7CiAKIAloYXJkX2lmYWNlID0gYmF0YWR2X2hhcmRpZl9nZXRfYnlfbmV0ZGV2KG5ldF9kZXYpOwogCWlmICghaGFyZF9pZmFjZSkKLQkJcmV0dXJuIGNvdW50OworCQlyZXR1cm4gMDsKIAotCWlmIChidWZmW2NvdW50IC0gMV0gPT0gJ1xuJykKLQkJYnVmZltjb3VudCAtIDFdID0gJ1wwJzsKLQotCWlmIChzdHJsZW4oYnVmZikgPj0gSUZOQU1TSVopIHsKLQkJcHJfZXJyKCJJbnZhbGlkIHBhcmFtZXRlciBmb3IgJ21lc2hfaWZhY2UnIHNldHRpbmcgcmVjZWl2ZWQ6IGludGVyZmFjZSBuYW1lIHRvbyBsb25nICclcydcbiIsCi0JCSAgICAgICBidWZmKTsKLQkJYmF0YWR2X2hhcmRpZl9wdXQoaGFyZF9pZmFjZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdHJuY21wKGJ1ZmYsICJub25lIiwgNCkgPT0gMCkKKwlpZiAoc3RybmNtcChpZm5hbWUsICJub25lIiwgNCkgPT0gMCkKIAkJc3RhdHVzX3RtcCA9IEJBVEFEVl9JRl9OT1RfSU5fVVNFOwogCWVsc2UKIAkJc3RhdHVzX3RtcCA9IEJBVEFEVl9JRl9JX1dBTlRfWU9VOwpAQCAtODYxLDE1ICs5MzIsMTMgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoKGhhcmRfaWZhY2UtPnNvZnRfaWZhY2UpICYmCi0JICAgIChzdHJuY21wKGhhcmRfaWZhY2UtPnNvZnRfaWZhY2UtPm5hbWUsIGJ1ZmYsIElGTkFNU0laKSA9PSAwKSkKKwkgICAgKHN0cm5jbXAoaGFyZF9pZmFjZS0+c29mdF9pZmFjZS0+bmFtZSwgaWZuYW1lLCBJRk5BTVNJWikgPT0gMCkpCiAJCWdvdG8gb3V0OwogCi0JcnRubF9sb2NrKCk7Ci0KIAlpZiAoc3RhdHVzX3RtcCA9PSBCQVRBRFZfSUZfTk9UX0lOX1VTRSkgewogCQliYXRhZHZfaGFyZGlmX2Rpc2FibGVfaW50ZXJmYWNlKGhhcmRfaWZhY2UsCiAJCQkJCQlCQVRBRFZfSUZfQ0xFQU5VUF9BVVRPKTsKLQkJZ290byB1bmxvY2s7CisJCWdvdG8gb3V0OwogCX0KIAogCS8qIGlmIHRoZSBpbnRlcmZhY2UgYWxyZWFkeSBpcyBpbiB1c2UgKi8KQEAgLTg3NywxNSArOTQ2LDcxIEBACiAJCWJhdGFkdl9oYXJkaWZfZGlzYWJsZV9pbnRlcmZhY2UoaGFyZF9pZmFjZSwKIAkJCQkJCUJBVEFEVl9JRl9DTEVBTlVQX0FVVE8pOwogCi0JcmV0ID0gYmF0YWR2X2hhcmRpZl9lbmFibGVfaW50ZXJmYWNlKGhhcmRfaWZhY2UsIG5ldCwgYnVmZik7Ci0KLXVubG9jazoKLQlydG5sX3VubG9jaygpOworCXJldCA9IGJhdGFkdl9oYXJkaWZfZW5hYmxlX2ludGVyZmFjZShoYXJkX2lmYWNlLCBuZXQsIGlmbmFtZSk7CiBvdXQ6CiAJYmF0YWR2X2hhcmRpZl9wdXQoaGFyZF9pZmFjZSk7CiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBiYXRhZHZfc3RvcmVfbWVzaF9pZmFjZV93b3JrIC0gc3RvcmUgbmV3IGhhcmRpZiBtZXNoX2lmYWNlIHN0YXRlCisgKiBAd29yazogd29yayBxdWV1ZSBpdGVtCisgKgorICogQ2hhbmdlcyB0aGUgcGFydHMgb2YgdGhlIGhhcmQrc29mdCBpbnRlcmZhY2Ugd2hpY2ggY2FuIG5vdCBiZSBtb2RpZmllZCB1bmRlcgorICogc3lzZnMgbG9jayAodG8gcHJldmVudCBkZWFkbG9jayBzaXR1YXRpb25zKS4KKyAqLworc3RhdGljIHZvaWQgYmF0YWR2X3N0b3JlX21lc2hfaWZhY2Vfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGJhdGFkdl9zdG9yZV9tZXNoX3dvcmsgKnN0b3JlX3dvcms7CisJaW50IHJldDsKKworCXN0b3JlX3dvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJhdGFkdl9zdG9yZV9tZXNoX3dvcmssIHdvcmspOworCisJcnRubF9sb2NrKCk7CisJcmV0ID0gYmF0YWR2X3N0b3JlX21lc2hfaWZhY2VfZmluaXNoKHN0b3JlX3dvcmstPm5ldF9kZXYsCisJCQkJCSAgICAgc3RvcmVfd29yay0+c29mdF9pZmFjZV9uYW1lKTsKKwlydG5sX3VubG9jaygpOworCisJaWYgKHJldCA8IDApCisJCXByX2VycigiRmFpbGVkIHRvIHN0b3JlIG5ldyBtZXNoX2lmYWNlIHN0YXRlICVzIGZvciAlczogJWRcbiIsCisJCSAgICAgICBzdG9yZV93b3JrLT5zb2Z0X2lmYWNlX25hbWUsIHN0b3JlX3dvcmstPm5ldF9kZXYtPm5hbWUsCisJCSAgICAgICByZXQpOworCisJZGV2X3B1dChzdG9yZV93b3JrLT5uZXRfZGV2KTsKKwlrZnJlZShzdG9yZV93b3JrKTsKK30KKworc3RhdGljIHNzaXplX3QgYmF0YWR2X3N0b3JlX21lc2hfaWZhY2Uoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmYsCisJCQkJICAgICAgIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGJhdGFkdl9rb2JqX3RvX25ldGRldihrb2JqKTsKKwlzdHJ1Y3QgYmF0YWR2X3N0b3JlX21lc2hfd29yayAqc3RvcmVfd29yazsKKworCWlmIChidWZmW2NvdW50IC0gMV0gPT0gJ1xuJykKKwkJYnVmZltjb3VudCAtIDFdID0gJ1wwJzsKKworCWlmIChzdHJsZW4oYnVmZikgPj0gSUZOQU1TSVopIHsKKwkJcHJfZXJyKCJJbnZhbGlkIHBhcmFtZXRlciBmb3IgJ21lc2hfaWZhY2UnIHNldHRpbmcgcmVjZWl2ZWQ6IGludGVyZmFjZSBuYW1lIHRvbyBsb25nICclcydcbiIsCisJCSAgICAgICBidWZmKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RvcmVfd29yayA9IGttYWxsb2Moc2l6ZW9mKCpzdG9yZV93b3JrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdG9yZV93b3JrKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9ob2xkKG5ldF9kZXYpOworCUlOSVRfV09SSygmc3RvcmVfd29yay0+d29yaywgYmF0YWR2X3N0b3JlX21lc2hfaWZhY2Vfd29yayk7CisJc3RvcmVfd29yay0+bmV0X2RldiA9IG5ldF9kZXY7CisJc3RybGNweShzdG9yZV93b3JrLT5zb2Z0X2lmYWNlX25hbWUsIGJ1ZmYsCisJCXNpemVvZihzdG9yZV93b3JrLT5zb2Z0X2lmYWNlX25hbWUpKTsKKworCXF1ZXVlX3dvcmsoYmF0YWR2X2V2ZW50X3dvcmtxdWV1ZSwgJnN0b3JlX3dvcmstPndvcmspOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBiYXRhZHZfc2hvd19pZmFjZV9zdGF0dXMoc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZmYpCiB7CkBAIC0xMDQ4LDYgKzExNzMsOCBAQAogCiB2b2lkIGJhdGFkdl9zeXNmc19kZWxfaGFyZGlmKHN0cnVjdCBrb2JqZWN0ICoqaGFyZGlmX29iaikKIHsKKwlrb2JqZWN0X3VldmVudCgqaGFyZGlmX29iaiwgS09CSl9SRU1PVkUpOworCWtvYmplY3RfZGVsKCpoYXJkaWZfb2JqKTsKIAlrb2JqZWN0X3B1dCgqaGFyZGlmX29iaik7CiAJKmhhcmRpZl9vYmogPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYyBiL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKaW5kZXggN2U2ZGY3YS4uN2Y2NjMwOSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYworKysgYi9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jCkBAIC0yMiwxMiArMjIsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KICNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMmMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM1LDI1ICszNywzOSBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JhdG1hbl9hZHYuaD4KIAogI2luY2x1ZGUgImJyaWRnZV9sb29wX2F2b2lkYW5jZS5oIgogI2luY2x1ZGUgImhhcmQtaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiaGFzaC5oIgogI2luY2x1ZGUgImxvZy5oIgogI2luY2x1ZGUgIm11bHRpY2FzdC5oIgorI2luY2x1ZGUgIm5ldGxpbmsuaCIKICNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCiAjaW5jbHVkZSAicGFja2V0LmgiCiAjaW5jbHVkZSAic29mdC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJ0dmx2LmgiCiAKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYmF0YWR2X3RsX2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJhdGFkdl90Z19jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpiYXRhZHZfdHRfb3JpZ19jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpiYXRhZHZfdHRfY2hhbmdlX2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmJhdGFkdl90dF9yZXFfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYmF0YWR2X3R0X3JvYW1fY2FjaGUgX19yZWFkX21vc3RseTsKKwogLyogaGFzaCBjbGFzcyBrZXlzICovCiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGJhdGFkdl90dF9sb2NhbF9oYXNoX2xvY2tfY2xhc3Nfa2V5Owogc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBiYXRhZHZfdHRfZ2xvYmFsX2hhc2hfbG9ja19jbGFzc19rZXk7CkBAIC0yMDUsNiArMjIxLDIwIEBACiB9CiAKIC8qKgorICogYmF0YWR2X3R0X2xvY2FsX2VudHJ5X2ZyZWVfcmN1IC0gZnJlZSB0aGUgdHRfbG9jYWxfZW50cnkKKyAqIEByY3U6IHJjdSBwb2ludGVyIG9mIHRoZSB0dF9sb2NhbF9lbnRyeQorICovCitzdGF0aWMgdm9pZCBiYXRhZHZfdHRfbG9jYWxfZW50cnlfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGJhdGFkdl90dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnk7CisKKwl0dF9sb2NhbF9lbnRyeSA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBiYXRhZHZfdHRfbG9jYWxfZW50cnksCisJCQkJICAgICAgY29tbW9uLnJjdSk7CisKKwlrbWVtX2NhY2hlX2ZyZWUoYmF0YWR2X3RsX2NhY2hlLCB0dF9sb2NhbF9lbnRyeSk7Cit9CisKKy8qKgogICogYmF0YWR2X3R0X2xvY2FsX2VudHJ5X3JlbGVhc2UgLSByZWxlYXNlIHR0X2xvY2FsX2VudHJ5IGZyb20gbGlzdHMgYW5kIHF1ZXVlCiAgKiAgZm9yIGZyZWUgYWZ0ZXIgcmN1IGdyYWNlIHBlcmlvZAogICogQHJlZjoga3JlZiBwb2ludGVyIG9mIHRoZSBuY19ub2RlCkBAIC0yMTgsNyArMjQ4LDcgQEAKIAogCWJhdGFkdl9zb2Z0aWZfdmxhbl9wdXQodHRfbG9jYWxfZW50cnktPnZsYW4pOwogCi0Ja2ZyZWVfcmN1KHR0X2xvY2FsX2VudHJ5LCBjb21tb24ucmN1KTsKKwljYWxsX3JjdSgmdHRfbG9jYWxfZW50cnktPmNvbW1vbi5yY3UsIGJhdGFkdl90dF9sb2NhbF9lbnRyeV9mcmVlX3JjdSk7CiB9CiAKIC8qKgpAQCAtMjM0LDYgKzI2NCwyMCBAQAogfQogCiAvKioKKyAqIGJhdGFkdl90dF9nbG9iYWxfZW50cnlfZnJlZV9yY3UgLSBmcmVlIHRoZSB0dF9nbG9iYWxfZW50cnkKKyAqIEByY3U6IHJjdSBwb2ludGVyIG9mIHRoZSB0dF9nbG9iYWxfZW50cnkKKyAqLworc3RhdGljIHZvaWQgYmF0YWR2X3R0X2dsb2JhbF9lbnRyeV9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X3R0X2dsb2JhbF9lbnRyeSAqdHRfZ2xvYmFsX2VudHJ5OworCisJdHRfZ2xvYmFsX2VudHJ5ID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IGJhdGFkdl90dF9nbG9iYWxfZW50cnksCisJCQkJICAgICAgIGNvbW1vbi5yY3UpOworCisJa21lbV9jYWNoZV9mcmVlKGJhdGFkdl90Z19jYWNoZSwgdHRfZ2xvYmFsX2VudHJ5KTsKK30KKworLyoqCiAgKiBiYXRhZHZfdHRfZ2xvYmFsX2VudHJ5X3JlbGVhc2UgLSByZWxlYXNlIHR0X2dsb2JhbF9lbnRyeSBmcm9tIGxpc3RzIGFuZCBxdWV1ZQogICogIGZvciBmcmVlIGFmdGVyIHJjdSBncmFjZSBwZXJpb2QKICAqIEByZWY6IGtyZWYgcG9pbnRlciBvZiB0aGUgbmNfbm9kZQpAQCAtMjQ2LDcgKzI5MCw4IEBACiAJCQkJICAgICAgIGNvbW1vbi5yZWZjb3VudCk7CiAKIAliYXRhZHZfdHRfZ2xvYmFsX2RlbF9vcmlnX2xpc3QodHRfZ2xvYmFsX2VudHJ5KTsKLQlrZnJlZV9yY3UodHRfZ2xvYmFsX2VudHJ5LCBjb21tb24ucmN1KTsKKworCWNhbGxfcmN1KCZ0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5yY3UsIGJhdGFkdl90dF9nbG9iYWxfZW50cnlfZnJlZV9yY3UpOwogfQogCiAvKioKQEAgLTM4NCw2ICs0MjksMTkgQEAKIH0KIAogLyoqCisgKiBiYXRhZHZfdHRfb3JpZ19saXN0X2VudHJ5X2ZyZWVfcmN1IC0gZnJlZSB0aGUgb3JpZ19lbnRyeQorICogQHJjdTogcmN1IHBvaW50ZXIgb2YgdGhlIG9yaWdfZW50cnkKKyAqLworc3RhdGljIHZvaWQgYmF0YWR2X3R0X29yaWdfbGlzdF9lbnRyeV9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3QgYmF0YWR2X3R0X29yaWdfbGlzdF9lbnRyeSAqb3JpZ19lbnRyeTsKKworCW9yaWdfZW50cnkgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgYmF0YWR2X3R0X29yaWdfbGlzdF9lbnRyeSwgcmN1KTsKKworCWttZW1fY2FjaGVfZnJlZShiYXRhZHZfdHRfb3JpZ19jYWNoZSwgb3JpZ19lbnRyeSk7Cit9CisKKy8qKgogICogYmF0YWR2X3R0X29yaWdfbGlzdF9lbnRyeV9yZWxlYXNlIC0gcmVsZWFzZSB0dCBvcmlnIGVudHJ5IGZyb20gbGlzdHMgYW5kCiAgKiAgcXVldWUgZm9yIGZyZWUgYWZ0ZXIgcmN1IGdyYWNlIHBlcmlvZAogICogQHJlZjoga3JlZiBwb2ludGVyIG9mIHRoZSB0dCBvcmlnIGVudHJ5CkBAIC0zOTYsNyArNDU0LDcgQEAKIAkJCQkgIHJlZmNvdW50KTsKIAogCWJhdGFkdl9vcmlnX25vZGVfcHV0KG9yaWdfZW50cnktPm9yaWdfbm9kZSk7Ci0Ja2ZyZWVfcmN1KG9yaWdfZW50cnksIHJjdSk7CisJY2FsbF9yY3UoJm9yaWdfZW50cnktPnJjdSwgYmF0YWR2X3R0X29yaWdfbGlzdF9lbnRyeV9mcmVlX3JjdSk7CiB9CiAKIC8qKgpAQCAtNDI2LDcgKzQ4NCw3IEBACiAJYm9vbCBldmVudF9yZW1vdmVkID0gZmFsc2U7CiAJYm9vbCBkZWxfb3BfcmVxdWVzdGVkLCBkZWxfb3BfZW50cnk7CiAKLQl0dF9jaGFuZ2Vfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKCp0dF9jaGFuZ2Vfbm9kZSksIEdGUF9BVE9NSUMpOworCXR0X2NoYW5nZV9ub2RlID0ga21lbV9jYWNoZV9hbGxvYyhiYXRhZHZfdHRfY2hhbmdlX2NhY2hlLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXR0X2NoYW5nZV9ub2RlKQogCQlyZXR1cm47CiAKQEAgLTQ2Nyw4ICs1MjUsOCBAQAogCQljb250aW51ZTsKIGRlbDoKIAkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKLQkJa2ZyZWUoZW50cnkpOwotCQlrZnJlZSh0dF9jaGFuZ2Vfbm9kZSk7CisJCWttZW1fY2FjaGVfZnJlZShiYXRhZHZfdHRfY2hhbmdlX2NhY2hlLCBlbnRyeSk7CisJCWttZW1fY2FjaGVfZnJlZShiYXRhZHZfdHRfY2hhbmdlX2NhY2hlLCB0dF9jaGFuZ2Vfbm9kZSk7CiAJCWV2ZW50X3JlbW92ZWQgPSB0cnVlOwogCQlnb3RvIHVubG9jazsKIAl9CkBAIC02NDYsNyArNzA0LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JdHRfbG9jYWwgPSBrbWFsbG9jKHNpemVvZigqdHRfbG9jYWwpLCBHRlBfQVRPTUlDKTsKKwl0dF9sb2NhbCA9IGttZW1fY2FjaGVfYWxsb2MoYmF0YWR2X3RsX2NhY2hlLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXR0X2xvY2FsKQogCQlnb3RvIG91dDsKIApAQCAtNjU2LDcgKzcxNCw3IEBACiAJCW5ldF9yYXRlbGltaXRlZF9mdW5jdGlvbihiYXRhZHZfaW5mbywgc29mdF9pZmFjZSwKIAkJCQkJICJhZGRpbmcgVFQgbG9jYWwgZW50cnkgJXBNIHRvIG5vbi1leGlzdGVudCBWTEFOICVkXG4iLAogCQkJCQkgYWRkciwgQkFUQURWX1BSSU5UX1ZJRCh2aWQpKTsKLQkJa2ZyZWUodHRfbG9jYWwpOworCQlrbWVtX2NhY2hlX2ZyZWUoYmF0YWR2X3RsX2NhY2hlLCB0dF9sb2NhbCk7CiAJCXR0X2xvY2FsID0gTlVMTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNjc2LDcgKzczNCw2IEBACiAJaWYgKGJhdGFkdl9pc193aWZpX25ldGRldihpbl9kZXYpKQogCQl0dF9sb2NhbC0+Y29tbW9uLmZsYWdzIHw9IEJBVEFEVl9UVF9DTElFTlRfV0lGSTsKIAlrcmVmX2luaXQoJnR0X2xvY2FsLT5jb21tb24ucmVmY291bnQpOwotCWtyZWZfZ2V0KCZ0dF9sb2NhbC0+Y29tbW9uLnJlZmNvdW50KTsKIAl0dF9sb2NhbC0+bGFzdF9zZWVuID0gamlmZmllczsKIAl0dF9sb2NhbC0+Y29tbW9uLmFkZGVkX2F0ID0gdHRfbG9jYWwtPmxhc3Rfc2VlbjsKIAl0dF9sb2NhbC0+dmxhbiA9IHZsYW47CkBAIC02ODgsNiArNzQ1LDcgQEAKIAkgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoYWRkcikpCiAJCXR0X2xvY2FsLT5jb21tb24uZmxhZ3MgfD0gQkFUQURWX1RUX0NMSUVOVF9OT1BVUkdFOwogCisJa3JlZl9nZXQoJnR0X2xvY2FsLT5jb21tb24ucmVmY291bnQpOwogCWhhc2hfYWRkZWQgPSBiYXRhZHZfaGFzaF9hZGQoYmF0X3ByaXYtPnR0LmxvY2FsX2hhc2gsIGJhdGFkdl9jb21wYXJlX3R0LAogCQkJCSAgICAgYmF0YWR2X2Nob29zZV90dCwgJnR0X2xvY2FsLT5jb21tb24sCiAJCQkJICAgICAmdHRfbG9jYWwtPmNvbW1vbi5oYXNoX2VudHJ5KTsKQEAgLTk1OSw3ICsxMDE3LDcgQEAKIAkJCXR0X2RpZmZfZW50cmllc19jb3VudCsrOwogCQl9CiAJCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0JCWtmcmVlKGVudHJ5KTsKKwkJa21lbV9jYWNoZV9mcmVlKGJhdGFkdl90dF9jaGFuZ2VfY2FjaGUsIGVudHJ5KTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dC5jaGFuZ2VzX2xpc3RfbG9jayk7CiAKQEAgLTk4OSw2ICsxMDQ3LDcgQEAKIAlrZnJlZSh0dF9kYXRhKTsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIGludCBiYXRhZHZfdHRfbG9jYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKQEAgLTEwNTYsNiArMTExNSwxNjUgQEAKIAkJYmF0YWR2X2hhcmRpZl9wdXQocHJpbWFyeV9pZik7CiAJcmV0dXJuIDA7CiB9CisjZW5kaWYKKworLyoqCisgKiBiYXRhZHZfdHRfbG9jYWxfZHVtcF9lbnRyeSAtIER1bXAgb25lIFRUIGxvY2FsIGVudHJ5IGludG8gYSBtZXNzYWdlCisgKiBAbXNnIDpOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAcG9ydGlkOiBQb3J0IG1ha2luZyBuZXRsaW5rIHJlcXVlc3QKKyAqIEBzZXE6IFNlcXVlbmNlIG51bWJlciBvZiBuZXRsaW5rIG1lc3NhZ2UKKyAqIEBiYXRfcHJpdjogVGhlIGJhdCBwcml2IHdpdGggYWxsIHRoZSBzb2Z0IGludGVyZmFjZSBpbmZvcm1hdGlvbgorICogQGNvbW1vbjogdHQgbG9jYWwgJiB0dCBnbG9iYWwgY29tbW9uIGRhdGEKKyAqCisgKiBSZXR1cm46IEVycm9yIGNvZGUsIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50CitiYXRhZHZfdHRfbG9jYWxfZHVtcF9lbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKKwkJCSAgIHN0cnVjdCBiYXRhZHZfdHRfY29tbW9uX2VudHJ5ICpjb21tb24pCit7CisJdm9pZCAqaGRyOworCXN0cnVjdCBiYXRhZHZfc29mdGlmX3ZsYW4gKnZsYW47CisJc3RydWN0IGJhdGFkdl90dF9sb2NhbF9lbnRyeSAqbG9jYWw7CisJdW5zaWduZWQgaW50IGxhc3Rfc2Vlbl9tc2VjczsKKwl1MzIgY3JjOworCisJbG9jYWwgPSBjb250YWluZXJfb2YoY29tbW9uLCBzdHJ1Y3QgYmF0YWR2X3R0X2xvY2FsX2VudHJ5LCBjb21tb24pOworCWxhc3Rfc2Vlbl9tc2VjcyA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGxvY2FsLT5sYXN0X3NlZW4pOworCisJdmxhbiA9IGJhdGFkdl9zb2Z0aWZfdmxhbl9nZXQoYmF0X3ByaXYsIGNvbW1vbi0+dmlkKTsKKwlpZiAoIXZsYW4pCisJCXJldHVybiAwOworCisJY3JjID0gdmxhbi0+dHQuY3JjOworCisJYmF0YWR2X3NvZnRpZl92bGFuX3B1dCh2bGFuKTsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcG9ydGlkLCBzZXEsICZiYXRhZHZfbmV0bGlua19mYW1pbHksCisJCQkgIE5MTV9GX01VTFRJLAorCQkJICBCQVRBRFZfQ01EX0dFVF9UUkFOU1RBQkxFX0xPQ0FMKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJaWYgKG5sYV9wdXQobXNnLCBCQVRBRFZfQVRUUl9UVF9BRERSRVNTLCBFVEhfQUxFTiwgY29tbW9uLT5hZGRyKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX1RUX0NSQzMyLCBjcmMpIHx8CisJICAgIG5sYV9wdXRfdTE2KG1zZywgQkFUQURWX0FUVFJfVFRfVklELCBjb21tb24tPnZpZCkgfHwKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9UVF9GTEFHUywgY29tbW9uLT5mbGFncykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKCEoY29tbW9uLT5mbGFncyAmIEJBVEFEVl9UVF9DTElFTlRfTk9QVVJHRSkgJiYKKwkgICAgbmxhX3B1dF91MzIobXNnLCBCQVRBRFZfQVRUUl9MQVNUX1NFRU5fTVNFQ1MsIGxhc3Rfc2Vlbl9tc2VjcykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCXJldHVybiAwOworCisgbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCisvKioKKyAqIGJhdGFkdl90dF9sb2NhbF9kdW1wX2J1Y2tldCAtIER1bXAgb25lIFRUIGxvY2FsIGJ1Y2tldCBpbnRvIGEgbWVzc2FnZQorICogQG1zZzogTmV0bGluayBtZXNzYWdlIHRvIGR1bXAgaW50bworICogQHBvcnRpZDogUG9ydCBtYWtpbmcgbmV0bGluayByZXF1ZXN0CisgKiBAc2VxOiBTZXF1ZW5jZSBudW1iZXIgb2YgbmV0bGluayBtZXNzYWdlCisgKiBAYmF0X3ByaXY6IFRoZSBiYXQgcHJpdiB3aXRoIGFsbCB0aGUgc29mdCBpbnRlcmZhY2UgaW5mb3JtYXRpb24KKyAqIEBoZWFkOiBQb2ludGVyIHRvIHRoZSBsaXN0IGNvbnRhaW5pbmcgdGhlIGxvY2FsIHR0IGVudHJpZXMKKyAqIEBpZHhfczogTnVtYmVyIG9mIGVudHJpZXMgdG8gc2tpcAorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl90dF9sb2NhbF9kdW1wX2J1Y2tldChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIGludCAqaWR4X3MpCit7CisJc3RydWN0IGJhdGFkdl90dF9jb21tb25fZW50cnkgKmNvbW1vbjsKKwlpbnQgaWR4ID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY29tbW9uLCBoZWFkLCBoYXNoX2VudHJ5KSB7CisJCWlmIChpZHgrKyA8ICppZHhfcykKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXRhZHZfdHRfbG9jYWxfZHVtcF9lbnRyeShtc2csIHBvcnRpZCwgc2VxLCBiYXRfcHJpdiwKKwkJCQkJICAgICAgIGNvbW1vbikpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJKmlkeF9zID0gaWR4IC0gMTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkqaWR4X3MgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhdGFkdl90dF9sb2NhbF9kdW1wIC0gRHVtcCBUVCBsb2NhbCBlbnRyaWVzIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IFBhcmFtZXRlcnMgZnJvbSBxdWVyeQorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK2ludCBiYXRhZHZfdHRfbG9jYWxfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoY2ItPnNrYi0+c2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlOworCXN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXY7CisJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpwcmltYXJ5X2lmID0gTlVMTDsKKwlzdHJ1Y3QgYmF0YWR2X2hhc2h0YWJsZSAqaGFzaDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlpbnQgcmV0OworCWludCBpZmluZGV4OworCWludCBidWNrZXQgPSBjYi0+YXJnc1swXTsKKwlpbnQgaWR4ID0gY2ItPmFyZ3NbMV07CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCisJaWZpbmRleCA9IGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNiLT5ubGgsIEJBVEFEVl9BVFRSX01FU0hfSUZJTkRFWCk7CisJaWYgKCFpZmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNvZnRfaWZhY2UgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZpbmRleCk7CisJaWYgKCFzb2Z0X2lmYWNlIHx8ICFiYXRhZHZfc29mdGlmX2lzX3ZhbGlkKHNvZnRfaWZhY2UpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7CisKKwlwcmltYXJ5X2lmID0gYmF0YWR2X3ByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKKwlpZiAoIXByaW1hcnlfaWYgfHwgcHJpbWFyeV9pZi0+aWZfc3RhdHVzICE9IEJBVEFEVl9JRl9BQ1RJVkUpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJaGFzaCA9IGJhdF9wcml2LT50dC5sb2NhbF9oYXNoOworCisJd2hpbGUgKGJ1Y2tldCA8IGhhc2gtPnNpemUpIHsKKwkJaGVhZCA9ICZoYXNoLT50YWJsZVtidWNrZXRdOworCisJCWlmIChiYXRhZHZfdHRfbG9jYWxfZHVtcF9idWNrZXQobXNnLCBwb3J0aWQsIGNiLT5ubGgtPm5sbXNnX3NlcSwKKwkJCQkJCWJhdF9wcml2LCBoZWFkLCAmaWR4KSkKKwkJCWJyZWFrOworCisJCWJ1Y2tldCsrOworCX0KKworCXJldCA9IG1zZy0+bGVuOworCisgb3V0OgorCWlmIChwcmltYXJ5X2lmKQorCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKKwlpZiAoc29mdF9pZmFjZSkKKwkJZGV2X3B1dChzb2Z0X2lmYWNlKTsKKworCWNiLT5hcmdzWzBdID0gYnVja2V0OworCWNiLT5hcmdzWzFdID0gaWR4OworCisJcmV0dXJuIHJldDsKK30KIAogc3RhdGljIHZvaWQKIGJhdGFkdl90dF9sb2NhbF9zZXRfcGVuZGluZyhzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LApAQCAtMTI1OSw3ICsxNDc3LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIHNhZmUsICZiYXRfcHJpdi0+dHQuY2hhbmdlc19saXN0LAogCQkJCSBsaXN0KSB7CiAJCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Ci0JCWtmcmVlKGVudHJ5KTsKKwkJa21lbV9jYWNoZV9mcmVlKGJhdGFkdl90dF9jaGFuZ2VfY2FjaGUsIGVudHJ5KTsKIAl9CiAKIAlhdG9taWNfc2V0KCZiYXRfcHJpdi0+dHQubG9jYWxfY2hhbmdlcywgMCk7CkBAIC0xMzQxLDcgKzE1NTksNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlvcmlnX2VudHJ5ID0ga3phbGxvYyhzaXplb2YoKm9yaWdfZW50cnkpLCBHRlBfQVRPTUlDKTsKKwlvcmlnX2VudHJ5ID0ga21lbV9jYWNoZV96YWxsb2MoYmF0YWR2X3R0X29yaWdfY2FjaGUsIEdGUF9BVE9NSUMpOwogCWlmICghb3JpZ19lbnRyeSkKIAkJZ290byBvdXQ7CiAKQEAgLTEzNTEsOSArMTU2OSw5IEBACiAJb3JpZ19lbnRyeS0+b3JpZ19ub2RlID0gb3JpZ19ub2RlOwogCW9yaWdfZW50cnktPnR0dm4gPSB0dHZuOwogCWtyZWZfaW5pdCgmb3JpZ19lbnRyeS0+cmVmY291bnQpOwotCWtyZWZfZ2V0KCZvcmlnX2VudHJ5LT5yZWZjb3VudCk7CiAKIAlzcGluX2xvY2tfYmgoJnR0X2dsb2JhbC0+bGlzdF9sb2NrKTsKKwlrcmVmX2dldCgmb3JpZ19lbnRyeS0+cmVmY291bnQpOwogCWhsaXN0X2FkZF9oZWFkX3JjdSgmb3JpZ19lbnRyeS0+bGlzdCwKIAkJCSAgICZ0dF9nbG9iYWwtPm9yaWdfbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJnR0X2dsb2JhbC0+bGlzdF9sb2NrKTsKQEAgLTE0MTEsNyArMTYyOSw4IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKCF0dF9nbG9iYWxfZW50cnkpIHsKLQkJdHRfZ2xvYmFsX2VudHJ5ID0ga3phbGxvYyhzaXplb2YoKnR0X2dsb2JhbF9lbnRyeSksIEdGUF9BVE9NSUMpOworCQl0dF9nbG9iYWxfZW50cnkgPSBrbWVtX2NhY2hlX3phbGxvYyhiYXRhZHZfdGdfY2FjaGUsCisJCQkJCQkgICAgR0ZQX0FUT01JQyk7CiAJCWlmICghdHRfZ2xvYmFsX2VudHJ5KQogCQkJZ290byBvdXQ7CiAKQEAgLTE0MjgsMTMgKzE2NDcsMTMgQEAKIAkJaWYgKGZsYWdzICYgQkFUQURWX1RUX0NMSUVOVF9ST0FNKQogCQkJdHRfZ2xvYmFsX2VudHJ5LT5yb2FtX2F0ID0gamlmZmllczsKIAkJa3JlZl9pbml0KCZjb21tb24tPnJlZmNvdW50KTsKLQkJa3JlZl9nZXQoJmNvbW1vbi0+cmVmY291bnQpOwogCQljb21tb24tPmFkZGVkX2F0ID0gamlmZmllczsKIAogCQlJTklUX0hMSVNUX0hFQUQoJnR0X2dsb2JhbF9lbnRyeS0+b3JpZ19saXN0KTsKIAkJYXRvbWljX3NldCgmdHRfZ2xvYmFsX2VudHJ5LT5vcmlnX2xpc3RfY291bnQsIDApOwogCQlzcGluX2xvY2tfaW5pdCgmdHRfZ2xvYmFsX2VudHJ5LT5saXN0X2xvY2spOwogCisJCWtyZWZfZ2V0KCZjb21tb24tPnJlZmNvdW50KTsKIAkJaGFzaF9hZGRlZCA9IGJhdGFkdl9oYXNoX2FkZChiYXRfcHJpdi0+dHQuZ2xvYmFsX2hhc2gsCiAJCQkJCSAgICAgYmF0YWR2X2NvbXBhcmVfdHQsCiAJCQkJCSAgICAgYmF0YWR2X2Nob29zZV90dCwgY29tbW9uLApAQCAtMTU3OSw2ICsxNzk4LDcgQEAKIAlyZXR1cm4gYmVzdF9lbnRyeTsKIH0KIAorI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIC8qKgogICogYmF0YWR2X3R0X2dsb2JhbF9wcmludF9lbnRyeSAtIHByaW50IGFsbCBvcmlnIG5vZGVzIHdobyBhbm5vdW5jZSB0aGUgYWRkcmVzcwogICogIGZvciB0aGlzIGdsb2JhbCBlbnRyeQpAQCAtMTcwMiw2ICsxOTIyLDIxOSBAQAogCQliYXRhZHZfaGFyZGlmX3B1dChwcmltYXJ5X2lmKTsKIAlyZXR1cm4gMDsKIH0KKyNlbmRpZgorCisvKioKKyAqIGJhdGFkdl90dF9nbG9iYWxfZHVtcF9zdWJlbnRyeSAtIER1bXAgYWxsIFRUIGxvY2FsIGVudHJpZXMgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGNvbW1vbjogdHQgbG9jYWwgJiB0dCBnbG9iYWwgY29tbW9uIGRhdGEKKyAqIEBvcmlnOiBPcmlnaW5hdG9yIG5vZGUgYW5ub3VuY2luZyBhIG5vbi1tZXNoIGNsaWVudAorICogQGJlc3Q6IElzIHRoZSBiZXN0IG9yaWdpbmF0b3IgZm9yIHRoZSBUVCBlbnRyeQorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl90dF9nbG9iYWxfZHVtcF9zdWJlbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgICAgIHN0cnVjdCBiYXRhZHZfdHRfY29tbW9uX2VudHJ5ICpjb21tb24sCisJCQkgICAgICAgc3RydWN0IGJhdGFkdl90dF9vcmlnX2xpc3RfZW50cnkgKm9yaWcsCisJCQkgICAgICAgYm9vbCBiZXN0KQoreworCXZvaWQgKmhkcjsKKwlzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZV92bGFuICp2bGFuOworCXU4IGxhc3RfdHR2bjsKKwl1MzIgY3JjOworCisJdmxhbiA9IGJhdGFkdl9vcmlnX25vZGVfdmxhbl9nZXQob3JpZy0+b3JpZ19ub2RlLAorCQkJCQkgY29tbW9uLT52aWQpOworCWlmICghdmxhbikKKwkJcmV0dXJuIDA7CisKKwljcmMgPSB2bGFuLT50dC5jcmM7CisKKwliYXRhZHZfb3JpZ19ub2RlX3ZsYW5fcHV0KHZsYW4pOworCisJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBwb3J0aWQsIHNlcSwgJmJhdGFkdl9uZXRsaW5rX2ZhbWlseSwKKwkJCSAgTkxNX0ZfTVVMVEksCisJCQkgIEJBVEFEVl9DTURfR0VUX1RSQU5TVEFCTEVfR0xPQkFMKTsKKwlpZiAoIWhkcikKKwkJcmV0dXJuIC1FTk9CVUZTOworCisJbGFzdF90dHZuID0gYXRvbWljX3JlYWQoJm9yaWctPm9yaWdfbm9kZS0+bGFzdF90dHZuKTsKKworCWlmIChubGFfcHV0KG1zZywgQkFUQURWX0FUVFJfVFRfQUREUkVTUywgRVRIX0FMRU4sIGNvbW1vbi0+YWRkcikgfHwKKwkgICAgbmxhX3B1dChtc2csIEJBVEFEVl9BVFRSX09SSUdfQUREUkVTUywgRVRIX0FMRU4sCisJCSAgICBvcmlnLT5vcmlnX25vZGUtPm9yaWcpIHx8CisJICAgIG5sYV9wdXRfdTgobXNnLCBCQVRBRFZfQVRUUl9UVF9UVFZOLCBvcmlnLT50dHZuKSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgQkFUQURWX0FUVFJfVFRfTEFTVF9UVFZOLCBsYXN0X3R0dm4pIHx8CisJICAgIG5sYV9wdXRfdTMyKG1zZywgQkFUQURWX0FUVFJfVFRfQ1JDMzIsIGNyYykgfHwKKwkgICAgbmxhX3B1dF91MTYobXNnLCBCQVRBRFZfQVRUUl9UVF9WSUQsIGNvbW1vbi0+dmlkKSB8fAorCSAgICBubGFfcHV0X3UzMihtc2csIEJBVEFEVl9BVFRSX1RUX0ZMQUdTLCBjb21tb24tPmZsYWdzKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAoYmVzdCAmJiBubGFfcHV0X2ZsYWcobXNnLCBCQVRBRFZfQVRUUl9GTEFHX0JFU1QpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKwlyZXR1cm4gMDsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyoqCisgKiBiYXRhZHZfdHRfZ2xvYmFsX2R1bXBfZW50cnkgLSBEdW1wIG9uZSBUVCBnbG9iYWwgZW50cnkgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAY29tbW9uOiB0dCBsb2NhbCAmIHR0IGdsb2JhbCBjb21tb24gZGF0YQorICogQHN1Yl9zOiBOdW1iZXIgb2YgZW50cmllcyB0byBza2lwCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoZSBjYWxsZXIgaG9sZHMgcmN1X3JlYWRfbG9jaygpLgorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgMCBvbiBzdWNjZXNzCisgKi8KK3N0YXRpYyBpbnQKK2JhdGFkdl90dF9nbG9iYWxfZHVtcF9lbnRyeShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsCisJCQkgICAgc3RydWN0IGJhdGFkdl90dF9jb21tb25fZW50cnkgKmNvbW1vbiwgaW50ICpzdWJfcykKK3sKKwlzdHJ1Y3QgYmF0YWR2X3R0X29yaWdfbGlzdF9lbnRyeSAqb3JpZ19lbnRyeSwgKmJlc3RfZW50cnk7CisJc3RydWN0IGJhdGFkdl90dF9nbG9iYWxfZW50cnkgKmdsb2JhbDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlpbnQgc3ViID0gMDsKKwlib29sIGJlc3Q7CisKKwlnbG9iYWwgPSBjb250YWluZXJfb2YoY29tbW9uLCBzdHJ1Y3QgYmF0YWR2X3R0X2dsb2JhbF9lbnRyeSwgY29tbW9uKTsKKwliZXN0X2VudHJ5ID0gYmF0YWR2X3RyYW5zdGFibGVfYmVzdF9vcmlnKGJhdF9wcml2LCBnbG9iYWwpOworCWhlYWQgPSAmZ2xvYmFsLT5vcmlnX2xpc3Q7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uob3JpZ19lbnRyeSwgaGVhZCwgbGlzdCkgeworCQlpZiAoc3ViKysgPCAqc3ViX3MpCisJCQljb250aW51ZTsKKworCQliZXN0ID0gKG9yaWdfZW50cnkgPT0gYmVzdF9lbnRyeSk7CisKKwkJaWYgKGJhdGFkdl90dF9nbG9iYWxfZHVtcF9zdWJlbnRyeShtc2csIHBvcnRpZCwgc2VxLCBjb21tb24sCisJCQkJCQkgICBvcmlnX2VudHJ5LCBiZXN0KSkgeworCQkJKnN1Yl9zID0gc3ViIC0gMTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKwl9CisKKwkqc3ViX3MgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhdGFkdl90dF9nbG9iYWxfZHVtcF9idWNrZXQgLSBEdW1wIG9uZSBUVCBsb2NhbCBidWNrZXQgaW50byBhIG1lc3NhZ2UKKyAqIEBtc2c6IE5ldGxpbmsgbWVzc2FnZSB0byBkdW1wIGludG8KKyAqIEBwb3J0aWQ6IFBvcnQgbWFraW5nIG5ldGxpbmsgcmVxdWVzdAorICogQHNlcTogU2VxdWVuY2UgbnVtYmVyIG9mIG5ldGxpbmsgbWVzc2FnZQorICogQGJhdF9wcml2OiBUaGUgYmF0IHByaXYgd2l0aCBhbGwgdGhlIHNvZnQgaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKiBAaGVhZDogUG9pbnRlciB0byB0aGUgbGlzdCBjb250YWluaW5nIHRoZSBnbG9iYWwgdHQgZW50cmllcworICogQGlkeF9zOiBOdW1iZXIgb2YgZW50cmllcyB0byBza2lwCisgKiBAc3ViOiBOdW1iZXIgb2YgZW50cmllcyB0byBza2lwCisgKgorICogUmV0dXJuOiBFcnJvciBjb2RlLCBvciAwIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGludAorYmF0YWR2X3R0X2dsb2JhbF9kdW1wX2J1Y2tldChzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLCB1MzIgc2VxLAorCQkJICAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICAgICBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgaW50ICppZHhfcywgaW50ICpzdWIpCit7CisJc3RydWN0IGJhdGFkdl90dF9jb21tb25fZW50cnkgKmNvbW1vbjsKKwlpbnQgaWR4ID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY29tbW9uLCBoZWFkLCBoYXNoX2VudHJ5KSB7CisJCWlmIChpZHgrKyA8ICppZHhfcykKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXRhZHZfdHRfZ2xvYmFsX2R1bXBfZW50cnkobXNnLCBwb3J0aWQsIHNlcSwgYmF0X3ByaXYsCisJCQkJCQljb21tb24sIHN1YikpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJKmlkeF9zID0gaWR4IC0gMTsKKwkJCXJldHVybiAtRU1TR1NJWkU7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkqaWR4X3MgPSAwOworCSpzdWIgPSAwOworCXJldHVybiAwOworfQorCisvKioKKyAqIGJhdGFkdl90dF9nbG9iYWxfZHVtcCAtICBEdW1wIFRUIGdsb2JhbCBlbnRyaWVzIGludG8gYSBtZXNzYWdlCisgKiBAbXNnOiBOZXRsaW5rIG1lc3NhZ2UgdG8gZHVtcCBpbnRvCisgKiBAY2I6IFBhcmFtZXRlcnMgZnJvbSBxdWVyeQorICoKKyAqIFJldHVybjogRXJyb3IgY29kZSwgb3IgbGVuZ3RoIG9mIG1lc3NhZ2Ugb24gc3VjY2VzcworICovCitpbnQgYmF0YWR2X3R0X2dsb2JhbF9kdW1wKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChjYi0+c2tiLT5zayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKnNvZnRfaWZhY2U7CisJc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdjsKKwlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKnByaW1hcnlfaWYgPSBOVUxMOworCXN0cnVjdCBiYXRhZHZfaGFzaHRhYmxlICpoYXNoOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCWludCByZXQ7CisJaW50IGlmaW5kZXg7CisJaW50IGJ1Y2tldCA9IGNiLT5hcmdzWzBdOworCWludCBpZHggPSBjYi0+YXJnc1sxXTsKKwlpbnQgc3ViID0gY2ItPmFyZ3NbMl07CisJaW50IHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCisJaWZpbmRleCA9IGJhdGFkdl9uZXRsaW5rX2dldF9pZmluZGV4KGNiLT5ubGgsIEJBVEFEVl9BVFRSX01FU0hfSUZJTkRFWCk7CisJaWYgKCFpZmluZGV4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNvZnRfaWZhY2UgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZpbmRleCk7CisJaWYgKCFzb2Z0X2lmYWNlIHx8ICFiYXRhZHZfc29mdGlmX2lzX3ZhbGlkKHNvZnRfaWZhY2UpKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0OworCX0KKworCWJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7CisKKwlwcmltYXJ5X2lmID0gYmF0YWR2X3ByaW1hcnlfaWZfZ2V0X3NlbGVjdGVkKGJhdF9wcml2KTsKKwlpZiAoIXByaW1hcnlfaWYgfHwgcHJpbWFyeV9pZi0+aWZfc3RhdHVzICE9IEJBVEFEVl9JRl9BQ1RJVkUpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJaGFzaCA9IGJhdF9wcml2LT50dC5nbG9iYWxfaGFzaDsKKworCXdoaWxlIChidWNrZXQgPCBoYXNoLT5zaXplKSB7CisJCWhlYWQgPSAmaGFzaC0+dGFibGVbYnVja2V0XTsKKworCQlpZiAoYmF0YWR2X3R0X2dsb2JhbF9kdW1wX2J1Y2tldChtc2csIHBvcnRpZCwKKwkJCQkJCSBjYi0+bmxoLT5ubG1zZ19zZXEsIGJhdF9wcml2LAorCQkJCQkJIGhlYWQsICZpZHgsICZzdWIpKQorCQkJYnJlYWs7CisKKwkJYnVja2V0Kys7CisJfQorCisJcmV0ID0gbXNnLT5sZW47CisKKyBvdXQ6CisJaWYgKHByaW1hcnlfaWYpCisJCWJhdGFkdl9oYXJkaWZfcHV0KHByaW1hcnlfaWYpOworCWlmIChzb2Z0X2lmYWNlKQorCQlkZXZfcHV0KHNvZnRfaWZhY2UpOworCisJY2ItPmFyZ3NbMF0gPSBidWNrZXQ7CisJY2ItPmFyZ3NbMV0gPSBpZHg7CisJY2ItPmFyZ3NbMl0gPSBzdWI7CisKKwlyZXR1cm4gcmV0OworfQogCiAvKioKICAqIF9iYXRhZHZfdHRfZ2xvYmFsX2RlbF9vcmlnX2VudHJ5IC0gcmVtb3ZlIGFuZCBmcmVlIGFuIG9yaWdfZW50cnkKQEAgLTIyODAsNyArMjcxMyw3IEBACiAKIAl0dF9yZXFfbm9kZSA9IGNvbnRhaW5lcl9vZihyZWYsIHN0cnVjdCBiYXRhZHZfdHRfcmVxX25vZGUsIHJlZmNvdW50KTsKIAotCWtmcmVlKHR0X3JlcV9ub2RlKTsKKwlrbWVtX2NhY2hlX2ZyZWUoYmF0YWR2X3R0X3JlcV9jYWNoZSwgdHRfcmVxX25vZGUpOwogfQogCiAvKioKQEAgLTIzNjcsNyArMjgwMCw3IEBACiAJCQlnb3RvIHVubG9jazsKIAl9CiAKLQl0dF9yZXFfbm9kZSA9IGttYWxsb2Moc2l6ZW9mKCp0dF9yZXFfbm9kZSksIEdGUF9BVE9NSUMpOworCXR0X3JlcV9ub2RlID0ga21lbV9jYWNoZV9hbGxvYyhiYXRhZHZfdHRfcmVxX2NhY2hlLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXR0X3JlcV9ub2RlKQogCQlnb3RvIHVubG9jazsKIApAQCAtMzEwNCw3ICszNTM3LDcgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCBzYWZlLCAmYmF0X3ByaXYtPnR0LnJvYW1fbGlzdCwgbGlzdCkgewogCQlsaXN0X2RlbCgmbm9kZS0+bGlzdCk7Ci0JCWtmcmVlKG5vZGUpOworCQlrbWVtX2NhY2hlX2ZyZWUoYmF0YWR2X3R0X3JvYW1fY2FjaGUsIG5vZGUpOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHQucm9hbV9saXN0X2xvY2spOwpAQCAtMzEyMSw3ICszNTU0LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWxpc3RfZGVsKCZub2RlLT5saXN0KTsKLQkJa2ZyZWUobm9kZSk7CisJCWttZW1fY2FjaGVfZnJlZShiYXRhZHZfdHRfcm9hbV9jYWNoZSwgbm9kZSk7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZiYXRfcHJpdi0+dHQucm9hbV9saXN0X2xvY2spOwogfQpAQCAtMzE2Miw3ICszNTk1LDggQEAKIAl9CiAKIAlpZiAoIXJldCkgewotCQl0dF9yb2FtX25vZGUgPSBrbWFsbG9jKHNpemVvZigqdHRfcm9hbV9ub2RlKSwgR0ZQX0FUT01JQyk7CisJCXR0X3JvYW1fbm9kZSA9IGttZW1fY2FjaGVfYWxsb2MoYmF0YWR2X3R0X3JvYW1fY2FjaGUsCisJCQkJCQlHRlBfQVRPTUlDKTsKIAkJaWYgKCF0dF9yb2FtX25vZGUpCiAJCQlnb3RvIHVubG9jazsKIApAQCAtMzg2NSwzICs0Mjk5LDg1IEBACiAKIAlyZXR1cm4gcmV0OwogfQorCisvKioKKyAqIGJhdGFkdl90dF9jYWNoZV9pbml0IC0gSW5pdGlhbGl6ZSB0dCBtZW1vcnkgb2JqZWN0IGNhY2hlCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworaW50IF9faW5pdCBiYXRhZHZfdHRfY2FjaGVfaW5pdCh2b2lkKQoreworCXNpemVfdCB0bF9zaXplID0gc2l6ZW9mKHN0cnVjdCBiYXRhZHZfdHRfbG9jYWxfZW50cnkpOworCXNpemVfdCB0Z19zaXplID0gc2l6ZW9mKHN0cnVjdCBiYXRhZHZfdHRfZ2xvYmFsX2VudHJ5KTsKKwlzaXplX3QgdHRfb3JpZ19zaXplID0gc2l6ZW9mKHN0cnVjdCBiYXRhZHZfdHRfb3JpZ19saXN0X2VudHJ5KTsKKwlzaXplX3QgdHRfY2hhbmdlX3NpemUgPSBzaXplb2Yoc3RydWN0IGJhdGFkdl90dF9jaGFuZ2Vfbm9kZSk7CisJc2l6ZV90IHR0X3JlcV9zaXplID0gc2l6ZW9mKHN0cnVjdCBiYXRhZHZfdHRfcmVxX25vZGUpOworCXNpemVfdCB0dF9yb2FtX3NpemUgPSBzaXplb2Yoc3RydWN0IGJhdGFkdl90dF9yb2FtX25vZGUpOworCisJYmF0YWR2X3RsX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImJhdGFkdl90bF9jYWNoZSIsIHRsX3NpemUsIDAsCisJCQkJCSAgICBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCWlmICghYmF0YWR2X3RsX2NhY2hlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJhdGFkdl90Z19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJiYXRhZHZfdGdfY2FjaGUiLCB0Z19zaXplLCAwLAorCQkJCQkgICAgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoIWJhdGFkdl90Z19jYWNoZSkKKwkJZ290byBlcnJfdHRfdGxfZGVzdHJveTsKKworCWJhdGFkdl90dF9vcmlnX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImJhdGFkdl90dF9vcmlnX2NhY2hlIiwKKwkJCQkJCSB0dF9vcmlnX3NpemUsIDAsCisJCQkJCQkgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoIWJhdGFkdl90dF9vcmlnX2NhY2hlKQorCQlnb3RvIGVycl90dF90Z19kZXN0cm95OworCisJYmF0YWR2X3R0X2NoYW5nZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJiYXRhZHZfdHRfY2hhbmdlX2NhY2hlIiwKKwkJCQkJCSAgIHR0X2NoYW5nZV9zaXplLCAwLAorCQkJCQkJICAgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoIWJhdGFkdl90dF9jaGFuZ2VfY2FjaGUpCisJCWdvdG8gZXJyX3R0X29yaWdfZGVzdHJveTsKKworCWJhdGFkdl90dF9yZXFfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYmF0YWR2X3R0X3JlcV9jYWNoZSIsCisJCQkJCQl0dF9yZXFfc2l6ZSwgMCwKKwkJCQkJCVNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CisJaWYgKCFiYXRhZHZfdHRfcmVxX2NhY2hlKQorCQlnb3RvIGVycl90dF9jaGFuZ2VfZGVzdHJveTsKKworCWJhdGFkdl90dF9yb2FtX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImJhdGFkdl90dF9yb2FtX2NhY2hlIiwKKwkJCQkJCSB0dF9yb2FtX3NpemUsIDAsCisJCQkJCQkgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwlpZiAoIWJhdGFkdl90dF9yb2FtX2NhY2hlKQorCQlnb3RvIGVycl90dF9yZXFfZGVzdHJveTsKKworCXJldHVybiAwOworCitlcnJfdHRfcmVxX2Rlc3Ryb3k6CisJa21lbV9jYWNoZV9kZXN0cm95KGJhdGFkdl90dF9yZXFfY2FjaGUpOworCWJhdGFkdl90dF9yZXFfY2FjaGUgPSBOVUxMOworZXJyX3R0X2NoYW5nZV9kZXN0cm95OgorCWttZW1fY2FjaGVfZGVzdHJveShiYXRhZHZfdHRfY2hhbmdlX2NhY2hlKTsKKwliYXRhZHZfdHRfY2hhbmdlX2NhY2hlID0gTlVMTDsKK2Vycl90dF9vcmlnX2Rlc3Ryb3k6CisJa21lbV9jYWNoZV9kZXN0cm95KGJhdGFkdl90dF9vcmlnX2NhY2hlKTsKKwliYXRhZHZfdHRfb3JpZ19jYWNoZSA9IE5VTEw7CitlcnJfdHRfdGdfZGVzdHJveToKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmF0YWR2X3RnX2NhY2hlKTsKKwliYXRhZHZfdGdfY2FjaGUgPSBOVUxMOworZXJyX3R0X3RsX2Rlc3Ryb3k6CisJa21lbV9jYWNoZV9kZXN0cm95KGJhdGFkdl90bF9jYWNoZSk7CisJYmF0YWR2X3RsX2NhY2hlID0gTlVMTDsKKworCXJldHVybiAtRU5PTUVNOworfQorCisvKioKKyAqIGJhdGFkdl90dF9jYWNoZV9kZXN0cm95IC0gRGVzdHJveSB0dCBtZW1vcnkgb2JqZWN0IGNhY2hlCisgKi8KK3ZvaWQgYmF0YWR2X3R0X2NhY2hlX2Rlc3Ryb3kodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmF0YWR2X3RsX2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmF0YWR2X3RnX2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmF0YWR2X3R0X29yaWdfY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShiYXRhZHZfdHRfY2hhbmdlX2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmF0YWR2X3R0X3JlcV9jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGJhdGFkdl90dF9yb2FtX2NhY2hlKTsKK30KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmggYi9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5oCmluZGV4IDdjN2UyYzAuLjc4M2ZkYmEgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuaApAQCAtMjIsOCArMjIsMTAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKK3N0cnVjdCBuZXRsaW5rX2NhbGxiYWNrOwogc3RydWN0IG5ldF9kZXZpY2U7CiBzdHJ1Y3Qgc2VxX2ZpbGU7CitzdHJ1Y3Qgc2tfYnVmZjsKIAogaW50IGJhdGFkdl90dF9pbml0KHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYpOwogYm9vbCBiYXRhZHZfdHRfbG9jYWxfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpzb2Z0X2lmYWNlLCBjb25zdCB1OCAqYWRkciwKQEAgLTMzLDYgKzM1LDggQEAKIAkJCSAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGJvb2wgcm9hbWluZyk7CiBpbnQgYmF0YWR2X3R0X2xvY2FsX3NlcV9wcmludF90ZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwogaW50IGJhdGFkdl90dF9nbG9iYWxfc2VxX3ByaW50X3RleHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7CitpbnQgYmF0YWR2X3R0X2xvY2FsX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKK2ludCBiYXRhZHZfdHRfZ2xvYmFsX2R1bXAoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIHZvaWQgYmF0YWR2X3R0X2dsb2JhbF9kZWxfb3JpZyhzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAogCQkJICAgICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpvcmlnX25vZGUsCiAJCQkgICAgICAgczMyIG1hdGNoX3ZpZCwgY29uc3QgY2hhciAqbWVzc2FnZSk7CkBAIC01OSw0ICs2Myw3IEBACiBib29sIGJhdGFkdl90dF9nbG9iYWxfaXNfaXNvbGF0ZWQoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwKIAkJCQkgIGNvbnN0IHU4ICphZGRyLCB1bnNpZ25lZCBzaG9ydCB2aWQpOwogCitpbnQgYmF0YWR2X3R0X2NhY2hlX2luaXQodm9pZCk7Cit2b2lkIGJhdGFkdl90dF9jYWNoZV9kZXN0cm95KHZvaWQpOworCiAjZW5kaWYgLyogX05FVF9CQVRNQU5fQURWX1RSQU5TTEFUSU9OX1RBQkxFX0hfICovCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi90dmx2LmMgYi9uZXQvYmF0bWFuLWFkdi90dmx2LmMKaW5kZXggM2QxY2YwZi4uNzc2NTRmMCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvdHZsdi5jCisrKyBiL25ldC9iYXRtYW4tYWR2L3R2bHYuYwpAQCAtMjU3LDggKzI1NywxMyBAQAogCXNwaW5fbG9ja19iaCgmYmF0X3ByaXYtPnR2bHYuY29udGFpbmVyX2xpc3RfbG9jayk7CiAJdHZsdl9vbGQgPSBiYXRhZHZfdHZsdl9jb250YWluZXJfZ2V0KGJhdF9wcml2LCB0eXBlLCB2ZXJzaW9uKTsKIAliYXRhZHZfdHZsdl9jb250YWluZXJfcmVtb3ZlKGJhdF9wcml2LCB0dmx2X29sZCk7CisKKwlrcmVmX2dldCgmdHZsdl9uZXctPnJlZmNvdW50KTsKIAlobGlzdF9hZGRfaGVhZCgmdHZsdl9uZXctPmxpc3QsICZiYXRfcHJpdi0+dHZsdi5jb250YWluZXJfbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJmJhdF9wcml2LT50dmx2LmNvbnRhaW5lcl9saXN0X2xvY2spOworCisJLyogZG9uJ3QgcmV0dXJuIHJlZmVyZW5jZSB0byBuZXcgdHZsdl9jb250YWluZXIgKi8KKwliYXRhZHZfdHZsdl9jb250YWluZXJfcHV0KHR2bHZfbmV3KTsKIH0KIAogLyoqCkBAIC01NDIsOCArNTQ3LDEyIEBACiAJSU5JVF9ITElTVF9OT0RFKCZ0dmx2X2hhbmRsZXItPmxpc3QpOwogCiAJc3Bpbl9sb2NrX2JoKCZiYXRfcHJpdi0+dHZsdi5oYW5kbGVyX2xpc3RfbG9jayk7CisJa3JlZl9nZXQoJnR2bHZfaGFuZGxlci0+cmVmY291bnQpOwogCWhsaXN0X2FkZF9oZWFkX3JjdSgmdHZsdl9oYW5kbGVyLT5saXN0LCAmYmF0X3ByaXYtPnR2bHYuaGFuZGxlcl9saXN0KTsKIAlzcGluX3VubG9ja19iaCgmYmF0X3ByaXYtPnR2bHYuaGFuZGxlcl9saXN0X2xvY2spOworCisJLyogZG9uJ3QgcmV0dXJuIHJlZmVyZW5jZSB0byBuZXcgdHZsdl9oYW5kbGVyICovCisJYmF0YWR2X3R2bHZfaGFuZGxlcl9wdXQodHZsdl9oYW5kbGVyKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi90eXBlcy5oIGIvbmV0L2JhdG1hbi1hZHYvdHlwZXMuaAppbmRleCBhNjQ1MjJjLi5iM2RkMWEzIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi90eXBlcy5oCisrKyBiL25ldC9iYXRtYW4tYWR2L3R5cGVzLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4gLyogZm9yIGxpbnV4L3dhaXQuaCAqLwogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTEzMiw3ICsxMzMsNiBAQAogICogQHJjdTogc3RydWN0IHVzZWQgZm9yIGZyZWVpbmcgaW4gYW4gUkNVLXNhZmUgbWFubmVyCiAgKiBAYmF0X2l2OiBwZXIgaGFyZC1pbnRlcmZhY2UgQi5BLlQuTS5BLk4uIElWIGRhdGEKICAqIEBiYXRfdjogcGVyIGhhcmQtaW50ZXJmYWNlIEIuQS5ULk0uQS5OLiBWIGRhdGEKLSAqIEBjbGVhbnVwX3dvcms6IHdvcmsgcXVldWUgY2FsbGJhY2sgaXRlbSBmb3IgaGFyZC1pbnRlcmZhY2UgZGVpbml0CiAgKiBAZGVidWdfZGlyOiBkZW50cnkgZm9yIG5jIHN1YmRpciBpbiBiYXRtYW4tYWR2IGRpcmVjdG9yeSBpbiBkZWJ1Z2ZzCiAgKiBAbmVpZ2hfbGlzdDogbGlzdCBvZiB1bmlxdWUgc2luZ2xlIGhvcCBuZWlnaGJvcnMgdmlhIHRoaXMgaW50ZXJmYWNlCiAgKiBAbmVpZ2hfbGlzdF9sb2NrOiBsb2NrIHByb3RlY3RpbmcgbmVpZ2hfbGlzdApAQCAtMTUyLDcgKzE1Miw2IEBACiAjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfQkFUTUFOX1YKIAlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2VfYmF0X3YgYmF0X3Y7CiAjZW5kaWYKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2xlYW51cF93b3JrOwogCXN0cnVjdCBkZW50cnkgKmRlYnVnX2RpcjsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCBuZWlnaF9saXN0OwogCS8qIG5laWdoX2xpc3RfbG9jayBwcm90ZWN0czogbmVpZ2hfbGlzdCAqLwpAQCAtMTAxNSw3ICsxMDE0LDYgQEAKICAqIEBmb3J3X2JjYXN0X2xpc3RfbG9jazogbG9jayBwcm90ZWN0aW5nIGZvcndfYmNhc3RfbGlzdAogICogQHRwX2xpc3RfbG9jazogc3BpbmxvY2sgcHJvdGVjdGluZyBAdHBfbGlzdAogICogQG9yaWdfd29yazogd29yayBxdWV1ZSBjYWxsYmFjayBpdGVtIGZvciBvcmlnIG5vZGUgcHVyZ2luZwotICogQGNsZWFudXBfd29yazogd29yayBxdWV1ZSBjYWxsYmFjayBpdGVtIGZvciBzb2Z0LWludGVyZmFjZSBkZWluaXQKICAqIEBwcmltYXJ5X2lmOiBvbmUgb2YgdGhlIGhhcmQtaW50ZXJmYWNlcyBhc3NpZ25lZCB0byB0aGlzIG1lc2ggaW50ZXJmYWNlCiAgKiAgYmVjb21lcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UKICAqIEBhbGdvX29wczogcm91dGluZyBhbGdvcml0aG0gdXNlZCBieSB0aGlzIG1lc2ggaW50ZXJmYWNlCkBAIC0xMDc0LDcgKzEwNzIsNiBAQAogCXNwaW5sb2NrX3QgdHBfbGlzdF9sb2NrOyAvKiBwcm90ZWN0cyB0cF9saXN0ICovCiAJYXRvbWljX3QgdHBfbnVtOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgb3JpZ193b3JrOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBjbGVhbnVwX3dvcms7CiAJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlIF9fcmN1ICpwcmltYXJ5X2lmOyAgLyogcmN1IHByb3RlY3RlZCBwb2ludGVyICovCiAJc3RydWN0IGJhdGFkdl9hbGdvX29wcyAqYWxnb19vcHM7CiAJc3RydWN0IGhsaXN0X2hlYWQgc29mdGlmX3ZsYW5fbGlzdDsKQEAgLTEzNzksNiArMTM3Niw3IEBACiAgKiAgbG9jYWxseSBnZW5lcmF0ZWQgcGFja2V0CiAgKiBAaWZfb3V0Z29pbmc6IHBhY2tldCB3aGVyZSB0aGUgcGFja2V0IHNob3VsZCBiZSBzZW50IHRvLCBvciBOVUxMIGlmCiAgKiAgdW5zcGVjaWZpZWQKKyAqIEBxdWV1ZV9sZWZ0OiBUaGUgcXVldWUgKGNvdW50ZXIpIHRoaXMgcGFja2V0IHdhcyBhcHBsaWVkIHRvCiAgKi8KIHN0cnVjdCBiYXRhZHZfZm9yd19wYWNrZXQgewogCXN0cnVjdCBobGlzdF9ub2RlIGxpc3Q7CkBAIC0xMzkxLDExICsxMzg5LDEzIEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayBkZWxheWVkX3dvcms7CiAJc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9pbmNvbWluZzsKIAlzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nOworCWF0b21pY190ICpxdWV1ZV9sZWZ0OwogfTsKIAogLyoqCiAgKiBzdHJ1Y3QgYmF0YWR2X2FsZ29faWZhY2Vfb3BzIC0gbWVzaCBhbGdvcml0aG0gY2FsbGJhY2tzIChpbnRlcmZhY2Ugc3BlY2lmaWMpCiAgKiBAYWN0aXZhdGU6IHN0YXJ0IHJvdXRpbmcgbWVjaGFuaXNtcyB3aGVuIGhhcmQtaW50ZXJmYWNlIGlzIGJyb3VnaHQgdXAKKyAqICAob3B0aW9uYWwpCiAgKiBAZW5hYmxlOiBpbml0IHJvdXRpbmcgaW5mbyB3aGVuIGhhcmQtaW50ZXJmYWNlIGlzIGVuYWJsZWQKICAqIEBkaXNhYmxlOiBkZS1pbml0IHJvdXRpbmcgaW5mbyB3aGVuIGhhcmQtaW50ZXJmYWNlIGlzIGRpc2FibGVkCiAgKiBAdXBkYXRlX21hYzogKHJlLSlpbml0IG1hYyBhZGRyZXNzZXMgb2YgdGhlIHByb3RvY29sIGluZm9ybWF0aW9uCkBAIC0xNDEzLDExICsxNDEzLDEzIEBACiAvKioKICAqIHN0cnVjdCBiYXRhZHZfYWxnb19uZWlnaF9vcHMgLSBtZXNoIGFsZ29yaXRobSBjYWxsYmFja3MgKG5laWdoYm91ciBzcGVjaWZpYykKICAqIEBoYXJkaWZfaW5pdDogY2FsbGVkIG9uIGNyZWF0aW9uIG9mIHNpbmdsZSBob3AgZW50cnkKKyAqICAob3B0aW9uYWwpCiAgKiBAY21wOiBjb21wYXJlIHRoZSBtZXRyaWNzIG9mIHR3byBuZWlnaGJvcnMgZm9yIHRoZWlyIHJlc3BlY3RpdmUgb3V0Z29pbmcKICAqICBpbnRlcmZhY2VzCiAgKiBAaXNfc2ltaWxhcl9vcl9iZXR0ZXI6IGNoZWNrIGlmIG5laWdoMSBpcyBlcXVhbGx5IHNpbWlsYXIgb3IgYmV0dGVyIHRoYW4KICAqICBuZWlnaDIgZm9yIHRoZWlyIHJlc3BlY3RpdmUgb3V0Z29pbmcgaW50ZXJmYWNlIGZyb20gdGhlIG1ldHJpYyBwcm9zcGVjdGl2ZQogICogQHByaW50OiBwcmludCB0aGUgc2luZ2xlIGhvcCBuZWlnaGJvciBsaXN0IChvcHRpb25hbCkKKyAqIEBkdW1wOiBkdW1wIG5laWdoYm9ycyB0byBhIG5ldGxpbmsgc29ja2V0IChvcHRpb25hbCkKICAqLwogc3RydWN0IGJhdGFkdl9hbGdvX25laWdoX29wcyB7CiAJdm9pZCAoKmhhcmRpZl9pbml0KShzdHJ1Y3QgYmF0YWR2X2hhcmRpZl9uZWlnaF9ub2RlICpuZWlnaCk7CkBAIC0xNDI5LDI2ICsxNDMxLDY0IEBACiAJCQkJICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmlmX291dGdvaW5nMSwKIAkJCQkgICAgIHN0cnVjdCBiYXRhZHZfbmVpZ2hfbm9kZSAqbmVpZ2gyLAogCQkJCSAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICppZl9vdXRnb2luZzIpOworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIAl2b2lkICgqcHJpbnQpKHN0cnVjdCBiYXRhZHZfcHJpdiAqcHJpdiwgc3RydWN0IHNlcV9maWxlICpzZXEpOworI2VuZGlmCisJdm9pZCAoKmR1bXApKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJICAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKnByaXYsCisJCSAgICAgc3RydWN0IGJhdGFkdl9oYXJkX2lmYWNlICpoYXJkX2lmYWNlKTsKIH07CiAKIC8qKgogICogc3RydWN0IGJhdGFkdl9hbGdvX29yaWdfb3BzIC0gbWVzaCBhbGdvcml0aG0gY2FsbGJhY2tzIChvcmlnaW5hdG9yIHNwZWNpZmljKQogICogQGZyZWU6IGZyZWUgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhlIHJvdXRpbmcgYWxnb3JpdGhtIGZvciBhbiBvcmlnX25vZGUKLSAqICBvYmplY3QKKyAqICBvYmplY3QgKG9wdGlvbmFsKQogICogQGFkZF9pZjogYXNrIHRoZSByb3V0aW5nIGFsZ29yaXRobSB0byBhcHBseSB0aGUgbmVlZGVkIGNoYW5nZXMgdG8gdGhlCi0gKiAgb3JpZ19ub2RlIGR1ZSB0byBhIG5ldyBoYXJkLWludGVyZmFjZSBiZWluZyBhZGRlZCBpbnRvIHRoZSBtZXNoCisgKiAgb3JpZ19ub2RlIGR1ZSB0byBhIG5ldyBoYXJkLWludGVyZmFjZSBiZWluZyBhZGRlZCBpbnRvIHRoZSBtZXNoIChvcHRpb25hbCkKICAqIEBkZWxfaWY6IGFzayB0aGUgcm91dGluZyBhbGdvcml0aG0gdG8gYXBwbHkgdGhlIG5lZWRlZCBjaGFuZ2VzIHRvIHRoZQotICogIG9yaWdfbm9kZSBkdWUgdG8gYW4gaGFyZC1pbnRlcmZhY2UgYmVpbmcgcmVtb3ZlZCBmcm9tIHRoZSBtZXNoCisgKiAgb3JpZ19ub2RlIGR1ZSB0byBhbiBoYXJkLWludGVyZmFjZSBiZWluZyByZW1vdmVkIGZyb20gdGhlIG1lc2ggKG9wdGlvbmFsKQogICogQHByaW50OiBwcmludCB0aGUgb3JpZ2luYXRvciB0YWJsZSAob3B0aW9uYWwpCisgKiBAZHVtcDogZHVtcCBvcmlnaW5hdG9ycyB0byBhIG5ldGxpbmsgc29ja2V0IChvcHRpb25hbCkKICAqLwogc3RydWN0IGJhdGFkdl9hbGdvX29yaWdfb3BzIHsKIAl2b2lkICgqZnJlZSkoc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSk7CiAJaW50ICgqYWRkX2lmKShzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlLCBpbnQgbWF4X2lmX251bSk7CiAJaW50ICgqZGVsX2lmKShzdHJ1Y3QgYmF0YWR2X29yaWdfbm9kZSAqb3JpZ19ub2RlLCBpbnQgbWF4X2lmX251bSwKIAkJICAgICAgaW50IGRlbF9pZl9udW0pOworI2lmZGVmIENPTkZJR19CQVRNQU5fQURWX0RFQlVHRlMKIAl2b2lkICgqcHJpbnQpKHN0cnVjdCBiYXRhZHZfcHJpdiAqcHJpdiwgc3RydWN0IHNlcV9maWxlICpzZXEsCiAJCSAgICAgIHN0cnVjdCBiYXRhZHZfaGFyZF9pZmFjZSAqaGFyZF9pZmFjZSk7CisjZW5kaWYKKwl2b2lkICgqZHVtcCkoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkgICAgIHN0cnVjdCBiYXRhZHZfcHJpdiAqcHJpdiwKKwkJICAgICBzdHJ1Y3QgYmF0YWR2X2hhcmRfaWZhY2UgKmhhcmRfaWZhY2UpOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYmF0YWR2X2FsZ29fZ3dfb3BzIC0gbWVzaCBhbGdvcml0aG0gY2FsbGJhY2tzIChHVyBzcGVjaWZpYykKKyAqIEBzdG9yZV9zZWxfY2xhc3M6IHBhcnNlIGFuZCBzdG9yZXMgYSBuZXcgR1cgc2VsZWN0aW9uIGNsYXNzIChvcHRpb25hbCkKKyAqIEBzaG93X3NlbF9jbGFzczogcHJpbnRzIHRoZSBjdXJyZW50IEdXIHNlbGVjdGlvbiBjbGFzcyAob3B0aW9uYWwpCisgKiBAZ2V0X2Jlc3RfZ3dfbm9kZTogc2VsZWN0IHRoZSBiZXN0IEdXIGZyb20gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG5vZGVzCisgKiAgKG9wdGlvbmFsKQorICogQGlzX2VsaWdpYmxlOiBjaGVjayBpZiBhIG5ld2x5IGRpc2NvdmVyZWQgR1cgaXMgYSBwb3RlbnRpYWwgY2FuZGlkYXRlIGZvcgorICogIHRoZSBlbGVjdGlvbiBhcyBiZXN0IEdXIChvcHRpb25hbCkKKyAqIEBwcmludDogcHJpbnQgdGhlIGdhdGV3YXkgdGFibGUgKG9wdGlvbmFsKQorICogQGR1bXA6IGR1bXAgZ2F0ZXdheXMgdG8gYSBuZXRsaW5rIHNvY2tldCAob3B0aW9uYWwpCisgKi8KK3N0cnVjdCBiYXRhZHZfYWxnb19nd19vcHMgeworCXNzaXplX3QgKCpzdG9yZV9zZWxfY2xhc3MpKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsIGNoYXIgKmJ1ZmYsCisJCQkJICAgc2l6ZV90IGNvdW50KTsKKwlzc2l6ZV90ICgqc2hvd19zZWxfY2xhc3MpKHN0cnVjdCBiYXRhZHZfcHJpdiAqYmF0X3ByaXYsIGNoYXIgKmJ1ZmYpOworCXN0cnVjdCBiYXRhZHZfZ3dfbm9kZSAqKCpnZXRfYmVzdF9nd19ub2RlKQorCQkoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdik7CisJYm9vbCAoKmlzX2VsaWdpYmxlKShzdHJ1Y3QgYmF0YWR2X3ByaXYgKmJhdF9wcml2LAorCQkJICAgIHN0cnVjdCBiYXRhZHZfb3JpZ19ub2RlICpjdXJyX2d3X29yaWcsCisJCQkgICAgc3RydWN0IGJhdGFkdl9vcmlnX25vZGUgKm9yaWdfbm9kZSk7CisjaWZkZWYgQ09ORklHX0JBVE1BTl9BRFZfREVCVUdGUworCXZvaWQgKCpwcmludCkoc3RydWN0IGJhdGFkdl9wcml2ICpiYXRfcHJpdiwgc3RydWN0IHNlcV9maWxlICpzZXEpOworI2VuZGlmCisJdm9pZCAoKmR1bXApKHN0cnVjdCBza19idWZmICptc2csIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJICAgICBzdHJ1Y3QgYmF0YWR2X3ByaXYgKnByaXYpOwogfTsKIAogLyoqCkBAIC0xNDU4LDYgKzE0OTgsNyBAQAogICogQGlmYWNlOiBjYWxsYmFja3MgcmVsYXRlZCB0byBpbnRlcmZhY2UgaGFuZGxpbmcKICAqIEBuZWlnaDogY2FsbGJhY2tzIHJlbGF0ZWQgdG8gbmVpZ2hib3JzIGhhbmRsaW5nCiAgKiBAb3JpZzogY2FsbGJhY2tzIHJlbGF0ZWQgdG8gb3JpZ2luYXRvcnMgaGFuZGxpbmcKKyAqIEBndzogY2FsbGJhY2tzIHJlbGF0ZWQgdG8gR1cgbW9kZQogICovCiBzdHJ1Y3QgYmF0YWR2X2FsZ29fb3BzIHsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSBsaXN0OwpAQCAtMTQ2NSw2ICsxNTA2LDcgQEAKIAlzdHJ1Y3QgYmF0YWR2X2FsZ29faWZhY2Vfb3BzIGlmYWNlOwogCXN0cnVjdCBiYXRhZHZfYWxnb19uZWlnaF9vcHMgbmVpZ2g7CiAJc3RydWN0IGJhdGFkdl9hbGdvX29yaWdfb3BzIG9yaWc7CisJc3RydWN0IGJhdGFkdl9hbGdvX2d3X29wcyBndzsKIH07CiAKIC8qKgpAQCAtMTU2NCw0ICsxNjA2LDE3IEBACiAJQkFUQURWX1RWTFZfSEFORExFUl9PR01fQ0FMTEVEID0gQklUKDIpLAogfTsKIAorLyoqCisgKiBzdHJ1Y3QgYmF0YWR2X3N0b3JlX21lc2hfd29yayAtIFdvcmsgcXVldWUgaXRlbSB0byBkZXRhY2ggYWRkL2RlbCBpbnRlcmZhY2UKKyAqICBmcm9tIHN5c2ZzIGxvY2tzCisgKiBAbmV0X2RldjogbmV0ZGV2aWNlIHRvIGFkZC9yZW1vdmUgdG8vZnJvbSBiYXRtYW4tYWR2IHNvZnQtaW50ZXJmYWNlCisgKiBAc29mdF9pZmFjZV9uYW1lOiBuYW1lIG9mIHNvZnQtaW50ZXJmYWNlIHRvIG1vZGlmeQorICogQHdvcms6IHdvcmsgcXVldWUgaXRlbQorICovCitzdHJ1Y3QgYmF0YWR2X3N0b3JlX21lc2hfd29yayB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CisJY2hhciBzb2Z0X2lmYWNlX25hbWVbSUZOQU1TSVpdOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworfTsKKwogI2VuZGlmIC8qIF9ORVRfQkFUTUFOX0FEVl9UWVBFU19IXyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYyBiL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKaW5kZXggZWNlNDVlMC4uMWFmZjJkYSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYworKysgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCkBAIC0yNiwxMSArMjYsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxhc20vaW9jdGxzLmg+CiAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KIAorI2luY2x1ZGUgImxlZHMuaCIKICNpbmNsdWRlICJzZWxmdGVzdC5oIgogCiAvKiBCbHVldG9vdGggc29ja2V0cyAqLwpAQCAtMjUwLDcgKzI1Miw3IEBACiAKIAlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKIAotCWlmIChtc2ctPm1zZ19mbGFncyAmIE1TR19UUlVOQykKKwlpZiAoZmxhZ3MgJiBNU0dfVFJVTkMpCiAJCWNvcGllZCA9IHNrYmxlbjsKIAogCXJldHVybiBlcnIgPyA6IGNvcGllZDsKQEAgLTcxMiwxMyArNzE0LDE2IEBACiBzdHJ1Y3QgZGVudHJ5ICpidF9kZWJ1Z2ZzOwogRVhQT1JUX1NZTUJPTF9HUEwoYnRfZGVidWdmcyk7CiAKKyNkZWZpbmUgVkVSU0lPTiBfX3N0cmluZ2lmeShCVF9TVUJTWVNfVkVSU0lPTikgIi4iIFwKKwkJX19zdHJpbmdpZnkoQlRfU1VCU1lTX1JFVklTSU9OKQorCiBzdGF0aWMgaW50IF9faW5pdCBidF9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIAogCXNvY2tfc2tiX2NiX2NoZWNrX3NpemUoc2l6ZW9mKHN0cnVjdCBidF9za2JfY2IpKTsKIAotCUJUX0lORk8oIkNvcmUgdmVyICVzIiwgQlRfU1VCU1lTX1ZFUlNJT04pOworCUJUX0lORk8oIkNvcmUgdmVyICVzIiwgVkVSU0lPTik7CiAKIAllcnIgPSBidF9zZWxmdGVzdCgpOwogCWlmIChlcnIgPCAwKQpAQCAtNzI2LDYgKzczMSw4IEBACiAKIAlidF9kZWJ1Z2ZzID0gZGVidWdmc19jcmVhdGVfZGlyKCJibHVldG9vdGgiLCBOVUxMKTsKIAorCWJ0X2xlZHNfaW5pdCgpOworCiAJZXJyID0gYnRfc3lzZnNfaW5pdCgpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtNzg1LDYgKzc5Miw4IEBACiAKIAlidF9zeXNmc19jbGVhbnVwKCk7CiAKKwlidF9sZWRzX2NsZWFudXAoKTsKKwogCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShidF9kZWJ1Z2ZzKTsKIH0KIApAQCAtNzkyLDcgKzgwMSw3IEBACiBtb2R1bGVfZXhpdChidF9leGl0KTsKIAogTU9EVUxFX0FVVEhPUigiTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCbHVldG9vdGggQ29yZSB2ZXIgIiBCVF9TVUJTWVNfVkVSU0lPTik7Ci1NT0RVTEVfVkVSU0lPTihCVF9TVUJTWVNfVkVSU0lPTik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJsdWV0b290aCBDb3JlIHZlciAiIFZFUlNJT04pOworTU9EVUxFX1ZFUlNJT04oVkVSU0lPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVNfTkVUUFJPVE8oUEZfQkxVRVRPT1RIKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYyBiL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYwppbmRleCBkZGY4NDMyLi4zYWM4OWU5IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCkBAIC0xNTYyLDYgKzE1NjIsNyBAQAogCWF1dG9fb2ZmID0gaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsIEhDSV9BVVRPX09GRik7CiAKIAlpZiAoIWF1dG9fb2ZmICYmIGhkZXYtPmRldl90eXBlID09IEhDSV9QUklNQVJZICYmCisJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVVNFUl9DSEFOTkVMKSAmJgogCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpCiAJCV9fbWdtdF9wb3dlcl9vZmYoaGRldik7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3JlcXVlc3QuYyBiL25ldC9ibHVldG9vdGgvaGNpX3JlcXVlc3QuYwppbmRleCBjMDQ1YjNjLi5jODEzNTY4IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9yZXF1ZXN0LmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfcmVxdWVzdC5jCkBAIC0yNjIsNiArMjYyLDggQEAKIAkJYnJlYWs7CiAJfQogCisJa2ZyZWVfc2tiKGhkZXYtPnJlcV9za2IpOworCWhkZXYtPnJlcV9za2IgPSBOVUxMOwogCWhkZXYtPnJlcV9zdGF0dXMgPSBoZGV2LT5yZXFfcmVzdWx0ID0gMDsKIAogCUJUX0RCRygiJXMgZW5kOiBlcnIgJWQiLCBoZGV2LT5uYW1lLCBlcnIpOwpAQCAtOTY5LDE0ICs5NzEsMTQgQEAKIAloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9MRV9TRVRfQURWX0VOQUJMRSwgc2l6ZW9mKGVuYWJsZSksICZlbmFibGUpOwogfQogCi1zdGF0aWMgdTggY3JlYXRlX2RlZmF1bHRfc2Nhbl9yc3BfZGF0YShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggKnB0cikKK3N0YXRpYyB1OCBhcHBlbmRfbG9jYWxfbmFtZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggKnB0ciwgdTggYWRfbGVuKQogewotCXU4IGFkX2xlbiA9IDA7CiAJc2l6ZV90IG5hbWVfbGVuOworCWludCBtYXhfbGVuOwogCisJbWF4X2xlbiA9IEhDSV9NQVhfQURfTEVOR1RIIC0gYWRfbGVuIC0gMjsKIAluYW1lX2xlbiA9IHN0cmxlbihoZGV2LT5kZXZfbmFtZSk7Ci0JaWYgKG5hbWVfbGVuID4gMCkgewotCQlzaXplX3QgbWF4X2xlbiA9IEhDSV9NQVhfQURfTEVOR1RIIC0gYWRfbGVuIC0gMjsKKwlpZiAobmFtZV9sZW4gPiAwICYmIG1heF9sZW4gPiAwKSB7CiAKIAkJaWYgKG5hbWVfbGVuID4gbWF4X2xlbikgewogCQkJbmFtZV9sZW4gPSBtYXhfbGVuOwpAQCAtOTk1LDIyICs5OTcsNDIgQEAKIAlyZXR1cm4gYWRfbGVuOwogfQogCitzdGF0aWMgdTggY3JlYXRlX2RlZmF1bHRfc2Nhbl9yc3BfZGF0YShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggKnB0cikKK3sKKwlyZXR1cm4gYXBwZW5kX2xvY2FsX25hbWUoaGRldiwgcHRyLCAwKTsKK30KKwogc3RhdGljIHU4IGNyZWF0ZV9pbnN0YW5jZV9zY2FuX3JzcF9kYXRhKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBpbnN0YW5jZSwKIAkJCQkJdTggKnB0cikKIHsKIAlzdHJ1Y3QgYWR2X2luZm8gKmFkdl9pbnN0YW5jZTsKKwl1MzIgaW5zdGFuY2VfZmxhZ3M7CisJdTggc2Nhbl9yc3BfbGVuID0gMDsKIAogCWFkdl9pbnN0YW5jZSA9IGhjaV9maW5kX2Fkdl9pbnN0YW5jZShoZGV2LCBpbnN0YW5jZSk7CiAJaWYgKCFhZHZfaW5zdGFuY2UpCiAJCXJldHVybiAwOwogCi0JLyogVE9ETzogU2V0IHRoZSBhcHByb3ByaWF0ZSBlbnRyaWVzIGJhc2VkIG9uIGFkdmVydGlzaW5nIGluc3RhbmNlIGZsYWdzCi0JICogaGVyZSBvbmNlIGZsYWdzIG90aGVyIHRoYW4gMCBhcmUgc3VwcG9ydGVkLgotCSAqLworCWluc3RhbmNlX2ZsYWdzID0gYWR2X2luc3RhbmNlLT5mbGFnczsKKworCWlmICgoaW5zdGFuY2VfZmxhZ3MgJiBNR01UX0FEVl9GTEFHX0FQUEVBUkFOQ0UpICYmIGhkZXYtPmFwcGVhcmFuY2UpIHsKKwkJcHRyWzBdID0gMzsKKwkJcHRyWzFdID0gRUlSX0FQUEVBUkFOQ0U7CisJCXB1dF91bmFsaWduZWRfbGUxNihoZGV2LT5hcHBlYXJhbmNlLCBwdHIgKyAyKTsKKwkJc2Nhbl9yc3BfbGVuICs9IDQ7CisJCXB0ciArPSA0OworCX0KKwogCW1lbWNweShwdHIsIGFkdl9pbnN0YW5jZS0+c2Nhbl9yc3BfZGF0YSwKIAkgICAgICAgYWR2X2luc3RhbmNlLT5zY2FuX3JzcF9sZW4pOwogCi0JcmV0dXJuIGFkdl9pbnN0YW5jZS0+c2Nhbl9yc3BfbGVuOworCXNjYW5fcnNwX2xlbiArPSBhZHZfaW5zdGFuY2UtPnNjYW5fcnNwX2xlbjsKKwlwdHIgKz0gYWR2X2luc3RhbmNlLT5zY2FuX3JzcF9sZW47CisKKwlpZiAoaW5zdGFuY2VfZmxhZ3MgJiBNR01UX0FEVl9GTEFHX0xPQ0FMX05BTUUpCisJCXNjYW5fcnNwX2xlbiA9IGFwcGVuZF9sb2NhbF9uYW1lKGhkZXYsIHB0ciwgc2Nhbl9yc3BfbGVuKTsKKworCXJldHVybiBzY2FuX3JzcF9sZW47CiB9CiAKIHZvaWQgX19oY2lfcmVxX3VwZGF0ZV9zY2FuX3JzcF9kYXRhKHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLCB1OCBpbnN0YW5jZSkKQEAgLTExOTIsNyArMTIxNCw3IEBACiAKIAloY2lfcmVxX2luaXQoJnJlcSwgaGRldik7CiAKLQloY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShoZGV2LCAmcmVxLCBpbnN0YW5jZSwgZmFsc2UpOworCWhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKGhkZXYsIE5VTEwsICZyZXEsIGluc3RhbmNlLCBmYWxzZSk7CiAKIAlpZiAobGlzdF9lbXB0eSgmaGRldi0+YWR2X2luc3RhbmNlcykpCiAJCV9faGNpX3JlcV9kaXNhYmxlX2FkdmVydGlzaW5nKCZyZXEpOwpAQCAtMTI4Miw4ICsxMzA0LDkgQEAKICAqICAgc2V0dGluZy4KICAqIC0gZm9yY2UgPT0gZmFsc2U6IE9ubHkgaW5zdGFuY2VzIHRoYXQgaGF2ZSBhIHRpbWVvdXQgd2lsbCBiZSByZW1vdmVkLgogICovCi12b2lkIGhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSwKLQkJCQl1OCBpbnN0YW5jZSwgYm9vbCBmb3JjZSkKK3ZvaWQgaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2Uoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBzb2NrICpzaywKKwkJCQlzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSwgdTggaW5zdGFuY2UsCisJCQkJYm9vbCBmb3JjZSkKIHsKIAlzdHJ1Y3QgYWR2X2luZm8gKmFkdl9pbnN0YW5jZSwgKm4sICpuZXh0X2luc3RhbmNlID0gTlVMTDsKIAlpbnQgZXJyOwpAQCAtMTMwOSw3ICsxMzMyLDcgQEAKIAkJCXJlbV9pbnN0ID0gYWR2X2luc3RhbmNlLT5pbnN0YW5jZTsKIAkJCWVyciA9IGhjaV9yZW1vdmVfYWR2X2luc3RhbmNlKGhkZXYsIHJlbV9pbnN0KTsKIAkJCWlmICghZXJyKQotCQkJCW1nbXRfYWR2ZXJ0aXNpbmdfcmVtb3ZlZChOVUxMLCBoZGV2LCByZW1faW5zdCk7CisJCQkJbWdtdF9hZHZlcnRpc2luZ19yZW1vdmVkKHNrLCBoZGV2LCByZW1faW5zdCk7CiAJCX0KIAl9IGVsc2UgewogCQlhZHZfaW5zdGFuY2UgPSBoY2lfZmluZF9hZHZfaW5zdGFuY2UoaGRldiwgaW5zdGFuY2UpOwpAQCAtMTMyMyw3ICsxMzQ2LDcgQEAKIAogCQkJZXJyID0gaGNpX3JlbW92ZV9hZHZfaW5zdGFuY2UoaGRldiwgaW5zdGFuY2UpOwogCQkJaWYgKCFlcnIpCi0JCQkJbWdtdF9hZHZlcnRpc2luZ19yZW1vdmVkKE5VTEwsIGhkZXYsIGluc3RhbmNlKTsKKwkJCQltZ210X2FkdmVydGlzaW5nX3JlbW92ZWQoc2ssIGhkZXYsIGluc3RhbmNlKTsKIAkJfQogCX0KIApAQCAtMTcxNCw3ICsxNzM3LDcgQEAKIAkJCSAqIGZ1bmN0aW9uLiBUbyBiZSBzYWZlIGhhcmQtY29kZSBvbmUgb2YgdGhlCiAJCQkgKiB2YWx1ZXMgdGhhdCdzIHN1aXRhYmxlIGZvciBTQ08uCiAJCQkgKi8KLQkJCXJlai5yZWFzb24gPSBIQ0lfRVJST1JfUkVNT1RFX0xPV19SRVNPVVJDRVM7CisJCQlyZWoucmVhc29uID0gSENJX0VSUk9SX1JFSl9MSU1JVEVEX1JFU09VUkNFUzsKIAogCQkJaGNpX3JlcV9hZGQocmVxLCBIQ0lfT1BfUkVKRUNUX1NZTkNfQ09OTl9SRVEsCiAJCQkJICAgIHNpemVvZihyZWopLCAmcmVqKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3JlcXVlc3QuaCBiL25ldC9ibHVldG9vdGgvaGNpX3JlcXVlc3QuaAppbmRleCBiMmQwNDRiLi5hYzFlMTEwIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9yZXF1ZXN0LmgKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfcmVxdWVzdC5oCkBAIC03Myw4ICs3Myw5IEBACiAKIGludCBfX2hjaV9yZXFfc2NoZWR1bGVfYWR2X2luc3RhbmNlKHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLCB1OCBpbnN0YW5jZSwKIAkJCQkgICAgYm9vbCBmb3JjZSk7Ci12b2lkIGhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSwKLQkJCQl1OCBpbnN0YW5jZSwgYm9vbCBmb3JjZSk7Cit2b2lkIGhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsIHU4IGluc3RhbmNlLAorCQkJCWJvb2wgZm9yY2UpOwogCiB2b2lkIF9faGNpX3JlcV91cGRhdGVfY2xhc3Moc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEpOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKaW5kZXggNmVmOGEwMS4uNDhmOTQ3MSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYwpAQCAtMjYsNiArMjYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KQEAgLTM4LDYgKzM5LDggQEAKIHN0YXRpYyBMSVNUX0hFQUQobWdtdF9jaGFuX2xpc3QpOwogc3RhdGljIERFRklORV9NVVRFWChtZ210X2NoYW5fbGlzdF9sb2NrKTsKIAorc3RhdGljIERFRklORV9JREEoc29ja19jb29raWVfaWRhKTsKKwogc3RhdGljIGF0b21pY190IG1vbml0b3JfcHJvbWlzYyA9IEFUT01JQ19JTklUKDApOwogCiAvKiAtLS0tLSBIQ0kgc29ja2V0IGludGVyZmFjZSAtLS0tLSAqLwpAQCAtNTIsNiArNTUsOCBAQAogCV9fdTMyICAgICAgICAgICAgIGNtc2dfbWFzazsKIAl1bnNpZ25lZCBzaG9ydCAgICBjaGFubmVsOwogCXVuc2lnbmVkIGxvbmcgICAgIGZsYWdzOworCV9fdTMyICAgICAgICAgICAgIGNvb2tpZTsKKwljaGFyICAgICAgICAgICAgICBjb21tW1RBU0tfQ09NTV9MRU5dOwogfTsKIAogdm9pZCBoY2lfc29ja19zZXRfZmxhZyhzdHJ1Y3Qgc29jayAqc2ssIGludCBucikKQEAgLTc0LDYgKzc5LDM4IEBACiAJcmV0dXJuIGhjaV9waShzayktPmNoYW5uZWw7CiB9CiAKK3UzMiBoY2lfc29ja19nZXRfY29va2llKHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gaGNpX3BpKHNrKS0+Y29va2llOworfQorCitzdGF0aWMgYm9vbCBoY2lfc29ja19nZW5fY29va2llKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpbnQgaWQgPSBoY2lfcGkoc2spLT5jb29raWU7CisKKwlpZiAoIWlkKSB7CisJCWlkID0gaWRhX3NpbXBsZV9nZXQoJnNvY2tfY29va2llX2lkYSwgMSwgMCwgR0ZQX0tFUk5FTCk7CisJCWlmIChpZCA8IDApCisJCQlpZCA9IDB4ZmZmZmZmZmY7CisKKwkJaGNpX3BpKHNrKS0+Y29va2llID0gaWQ7CisJCWdldF90YXNrX2NvbW0oaGNpX3BpKHNrKS0+Y29tbSwgY3VycmVudCk7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgaGNpX3NvY2tfZnJlZV9jb29raWUoc3RydWN0IHNvY2sgKnNrKQoreworCWludCBpZCA9IGhjaV9waShzayktPmNvb2tpZTsKKworCWlmIChpZCkgeworCQloY2lfcGkoc2spLT5jb29raWUgPSAweGZmZmZmZmZmOworCQlpZGFfc2ltcGxlX3JlbW92ZSgmc29ja19jb29raWVfaWRhLCBpZCk7CisJfQorfQorCiBzdGF0aWMgaW5saW5lIGludCBoY2lfdGVzdF9iaXQoaW50IG5yLCBjb25zdCB2b2lkICphZGRyKQogewogCXJldHVybiAqKChjb25zdCBfX3UzMiAqKSBhZGRyICsgKG5yID4+IDUpKSAmICgoX191MzIpIDEgPDwgKG5yICYgMzEpKTsKQEAgLTMwNSw2ICszNDIsNjAgQEAKIAlrZnJlZV9za2Ioc2tiX2NvcHkpOwogfQogCit2b2lkIGhjaV9zZW5kX21vbml0b3JfY3RybF9ldmVudChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTE2IGV2ZW50LAorCQkJCSB2b2lkICpkYXRhLCB1MTYgZGF0YV9sZW4sIGt0aW1lX3QgdHN0YW1wLAorCQkJCSBpbnQgZmxhZywgc3RydWN0IHNvY2sgKnNraXBfc2spCit7CisJc3RydWN0IHNvY2sgKnNrOworCV9fbGUxNiBpbmRleDsKKworCWlmIChoZGV2KQorCQlpbmRleCA9IGNwdV90b19sZTE2KGhkZXYtPmlkKTsKKwllbHNlCisJCWluZGV4ID0gY3B1X3RvX2xlMTYoTUdNVF9JTkRFWF9OT05FKTsKKworCXJlYWRfbG9jaygmaGNpX3NrX2xpc3QubG9jayk7CisKKwlza19mb3JfZWFjaChzaywgJmhjaV9za19saXN0LmhlYWQpIHsKKwkJc3RydWN0IGhjaV9tb25faGRyICpoZHI7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJaWYgKGhjaV9waShzayktPmNoYW5uZWwgIT0gSENJX0NIQU5ORUxfQ09OVFJPTCkKKwkJCWNvbnRpbnVlOworCisJCS8qIElnbm9yZSBzb2NrZXQgd2l0aG91dCB0aGUgZmxhZyBzZXQgKi8KKwkJaWYgKCFoY2lfc29ja190ZXN0X2ZsYWcoc2ssIGZsYWcpKQorCQkJY29udGludWU7CisKKwkJLyogU2tpcCB0aGUgb3JpZ2luYWwgc29ja2V0ICovCisJCWlmIChzayA9PSBza2lwX3NrKQorCQkJY29udGludWU7CisKKwkJc2tiID0gYnRfc2tiX2FsbG9jKDYgKyBkYXRhX2xlbiwgR0ZQX0FUT01JQyk7CisJCWlmICghc2tiKQorCQkJY29udGludWU7CisKKwkJcHV0X3VuYWxpZ25lZF9sZTMyKGhjaV9waShzayktPmNvb2tpZSwgc2tiX3B1dChza2IsIDQpKTsKKwkJcHV0X3VuYWxpZ25lZF9sZTE2KGV2ZW50LCBza2JfcHV0KHNrYiwgMikpOworCisJCWlmIChkYXRhKQorCQkJbWVtY3B5KHNrYl9wdXQoc2tiLCBkYXRhX2xlbiksIGRhdGEsIGRhdGFfbGVuKTsKKworCQlza2ItPnRzdGFtcCA9IHRzdGFtcDsKKworCQloZHIgPSAodm9pZCAqKXNrYl9wdXNoKHNrYiwgSENJX01PTl9IRFJfU0laRSk7CisJCWhkci0+b3Bjb2RlID0gY3B1X3RvX2xlMTYoSENJX01PTl9DVFJMX0VWRU5UKTsKKwkJaGRyLT5pbmRleCA9IGluZGV4OworCQloZHItPmxlbiA9IGNwdV90b19sZTE2KHNrYi0+bGVuIC0gSENJX01PTl9IRFJfU0laRSk7CisKKwkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBza2IsCisJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlyZWFkX3VubG9jaygmaGNpX3NrX2xpc3QubG9jayk7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY3JlYXRlX21vbml0b3JfZXZlbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCBldmVudCkKIHsKIAlzdHJ1Y3QgaGNpX21vbl9oZHIgKmhkcjsKQEAgLTM4NCw2ICs0NzUsMTI5IEBACiAJcmV0dXJuIHNrYjsKIH0KIAorc3RhdGljIHN0cnVjdCBza19idWZmICpjcmVhdGVfbW9uaXRvcl9jdHJsX29wZW4oc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBoY2lfbW9uX2hkciAqaGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTE2IGZvcm1hdDsKKwl1OCB2ZXJbM107CisJdTMyIGZsYWdzOworCisJLyogTm8gbWVzc2FnZSBuZWVkZWQgd2hlbiBjb29raWUgaXMgbm90IHByZXNlbnQgKi8KKwlpZiAoIWhjaV9waShzayktPmNvb2tpZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzd2l0Y2ggKGhjaV9waShzayktPmNoYW5uZWwpIHsKKwljYXNlIEhDSV9DSEFOTkVMX1JBVzoKKwkJZm9ybWF0ID0gMHgwMDAwOworCQl2ZXJbMF0gPSBCVF9TVUJTWVNfVkVSU0lPTjsKKwkJcHV0X3VuYWxpZ25lZF9sZTE2KEJUX1NVQlNZU19SRVZJU0lPTiwgdmVyICsgMSk7CisJCWJyZWFrOworCWNhc2UgSENJX0NIQU5ORUxfVVNFUjoKKwkJZm9ybWF0ID0gMHgwMDAxOworCQl2ZXJbMF0gPSBCVF9TVUJTWVNfVkVSU0lPTjsKKwkJcHV0X3VuYWxpZ25lZF9sZTE2KEJUX1NVQlNZU19SRVZJU0lPTiwgdmVyICsgMSk7CisJCWJyZWFrOworCWNhc2UgSENJX0NIQU5ORUxfQ09OVFJPTDoKKwkJZm9ybWF0ID0gMHgwMDAyOworCQltZ210X2ZpbGxfdmVyc2lvbl9pbmZvKHZlcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIE5vIG1lc3NhZ2UgZm9yIHVuc3VwcG9ydGVkIGZvcm1hdCAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlza2IgPSBidF9za2JfYWxsb2MoMTQgKyBUQVNLX0NPTU1fTEVOICwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJZmxhZ3MgPSBoY2lfc29ja190ZXN0X2ZsYWcoc2ssIEhDSV9TT0NLX1RSVVNURUQpID8gMHgxIDogMHgwOworCisJcHV0X3VuYWxpZ25lZF9sZTMyKGhjaV9waShzayktPmNvb2tpZSwgc2tiX3B1dChza2IsIDQpKTsKKwlwdXRfdW5hbGlnbmVkX2xlMTYoZm9ybWF0LCBza2JfcHV0KHNrYiwgMikpOworCW1lbWNweShza2JfcHV0KHNrYiwgc2l6ZW9mKHZlcikpLCB2ZXIsIHNpemVvZih2ZXIpKTsKKwlwdXRfdW5hbGlnbmVkX2xlMzIoZmxhZ3MsIHNrYl9wdXQoc2tiLCA0KSk7CisJKnNrYl9wdXQoc2tiLCAxKSA9IFRBU0tfQ09NTV9MRU47CisJbWVtY3B5KHNrYl9wdXQoc2tiLCBUQVNLX0NPTU1fTEVOKSwgaGNpX3BpKHNrKS0+Y29tbSwgVEFTS19DT01NX0xFTik7CisKKwlfX25ldF90aW1lc3RhbXAoc2tiKTsKKworCWhkciA9ICh2b2lkICopc2tiX3B1c2goc2tiLCBIQ0lfTU9OX0hEUl9TSVpFKTsKKwloZHItPm9wY29kZSA9IGNwdV90b19sZTE2KEhDSV9NT05fQ1RSTF9PUEVOKTsKKwlpZiAoaGNpX3BpKHNrKS0+aGRldikKKwkJaGRyLT5pbmRleCA9IGNwdV90b19sZTE2KGhjaV9waShzayktPmhkZXYtPmlkKTsKKwllbHNlCisJCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihIQ0lfREVWX05PTkUpOworCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4gLSBIQ0lfTU9OX0hEUl9TSVpFKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY3JlYXRlX21vbml0b3JfY3RybF9jbG9zZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGhjaV9tb25faGRyICpoZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCS8qIE5vIG1lc3NhZ2UgbmVlZGVkIHdoZW4gY29va2llIGlzIG5vdCBwcmVzZW50ICovCisJaWYgKCFoY2lfcGkoc2spLT5jb29raWUpCisJCXJldHVybiBOVUxMOworCisJc3dpdGNoIChoY2lfcGkoc2spLT5jaGFubmVsKSB7CisJY2FzZSBIQ0lfQ0hBTk5FTF9SQVc6CisJY2FzZSBIQ0lfQ0hBTk5FTF9VU0VSOgorCWNhc2UgSENJX0NIQU5ORUxfQ09OVFJPTDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogTm8gbWVzc2FnZSBmb3IgdW5zdXBwb3J0ZWQgZm9ybWF0ICovCisJCXJldHVybiBOVUxMOworCX0KKworCXNrYiA9IGJ0X3NrYl9hbGxvYyg0LCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlwdXRfdW5hbGlnbmVkX2xlMzIoaGNpX3BpKHNrKS0+Y29va2llLCBza2JfcHV0KHNrYiwgNCkpOworCisJX19uZXRfdGltZXN0YW1wKHNrYik7CisKKwloZHIgPSAodm9pZCAqKXNrYl9wdXNoKHNrYiwgSENJX01PTl9IRFJfU0laRSk7CisJaGRyLT5vcGNvZGUgPSBjcHVfdG9fbGUxNihIQ0lfTU9OX0NUUkxfQ0xPU0UpOworCWlmIChoY2lfcGkoc2spLT5oZGV2KQorCQloZHItPmluZGV4ID0gY3B1X3RvX2xlMTYoaGNpX3BpKHNrKS0+aGRldi0+aWQpOworCWVsc2UKKwkJaGRyLT5pbmRleCA9IGNwdV90b19sZTE2KEhDSV9ERVZfTk9ORSk7CisJaGRyLT5sZW4gPSBjcHVfdG9fbGUxNihza2ItPmxlbiAtIEhDSV9NT05fSERSX1NJWkUpOworCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpjcmVhdGVfbW9uaXRvcl9jdHJsX2NvbW1hbmQoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsCisJCQkJCQkgICB1MTYgb3Bjb2RlLCB1MTYgbGVuLAorCQkJCQkJICAgY29uc3Qgdm9pZCAqYnVmKQoreworCXN0cnVjdCBoY2lfbW9uX2hkciAqaGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBidF9za2JfYWxsb2MoNiArIGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJcHV0X3VuYWxpZ25lZF9sZTMyKGhjaV9waShzayktPmNvb2tpZSwgc2tiX3B1dChza2IsIDQpKTsKKwlwdXRfdW5hbGlnbmVkX2xlMTYob3Bjb2RlLCBza2JfcHV0KHNrYiwgMikpOworCisJaWYgKGJ1ZikKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBidWYsIGxlbik7CisKKwlfX25ldF90aW1lc3RhbXAoc2tiKTsKKworCWhkciA9ICh2b2lkICopc2tiX3B1c2goc2tiLCBIQ0lfTU9OX0hEUl9TSVpFKTsKKwloZHItPm9wY29kZSA9IGNwdV90b19sZTE2KEhDSV9NT05fQ1RSTF9DT01NQU5EKTsKKwloZHItPmluZGV4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOworCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4gLSBIQ0lfTU9OX0hEUl9TSVpFKTsKKworCXJldHVybiBza2I7Cit9CisKIHN0YXRpYyB2b2lkIF9fcHJpbnRmKDIsIDMpCiBzZW5kX21vbml0b3Jfbm90ZShzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewpAQCAtNDU4LDYgKzY3MiwyNiBAQAogCXJlYWRfdW5sb2NrKCZoY2lfZGV2X2xpc3RfbG9jayk7CiB9CiAKK3N0YXRpYyB2b2lkIHNlbmRfbW9uaXRvcl9jb250cm9sX3JlcGxheShzdHJ1Y3Qgc29jayAqbW9uX3NrKQoreworCXN0cnVjdCBzb2NrICpzazsKKworCXJlYWRfbG9jaygmaGNpX3NrX2xpc3QubG9jayk7CisKKwlza19mb3JfZWFjaChzaywgJmhjaV9za19saXN0LmhlYWQpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlza2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX29wZW4oc2spOworCQlpZiAoIXNrYikKKwkJCWNvbnRpbnVlOworCisJCWlmIChzb2NrX3F1ZXVlX3Jjdl9za2IobW9uX3NrLCBza2IpKQorCQkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJcmVhZF91bmxvY2soJmhjaV9za19saXN0LmxvY2spOworfQorCiAvKiBHZW5lcmF0ZSBpbnRlcm5hbCBzdGFjayBldmVudCAqLwogc3RhdGljIHZvaWQgaGNpX3NpX2V2ZW50KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgaW50IGRsZW4sIHZvaWQgKmRhdGEpCiB7CkBAIC01ODUsNiArODE5LDcgQEAKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJQlRfREJHKCJzb2NrICVwIHNrICVwIiwgc29jaywgc2spOwogCkBAIC01OTMsOCArODI4LDI0IEBACiAKIAloZGV2ID0gaGNpX3BpKHNrKS0+aGRldjsKIAotCWlmIChoY2lfcGkoc2spLT5jaGFubmVsID09IEhDSV9DSEFOTkVMX01PTklUT1IpCisJc3dpdGNoIChoY2lfcGkoc2spLT5jaGFubmVsKSB7CisJY2FzZSBIQ0lfQ0hBTk5FTF9NT05JVE9SOgogCQlhdG9taWNfZGVjKCZtb25pdG9yX3Byb21pc2MpOworCQlicmVhazsKKwljYXNlIEhDSV9DSEFOTkVMX1JBVzoKKwljYXNlIEhDSV9DSEFOTkVMX1VTRVI6CisJY2FzZSBIQ0lfQ0hBTk5FTF9DT05UUk9MOgorCQkvKiBTZW5kIGV2ZW50IHRvIG1vbml0b3IgKi8KKwkJc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9jbG9zZShzayk7CisJCWlmIChza2IpIHsKKwkJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgc2tiLAorCQkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQorCisJCWhjaV9zb2NrX2ZyZWVfY29va2llKHNrKTsKKwkJYnJlYWs7CisJfQogCiAJYnRfc29ja191bmxpbmsoJmhjaV9za19saXN0LCBzayk7CiAKQEAgLTcyMSw2ICs5NzIsMjcgQEAKIAkJZ290byBkb25lOwogCX0KIAorCS8qIFdoZW4gY2FsbGluZyBhbiBpb2N0bCBvbiBhbiB1bmJvdW5kIHJhdyBzb2NrZXQsIHRoZW4gZW5zdXJlCisJICogdGhhdCB0aGUgbW9uaXRvciBnZXRzIGluZm9ybWVkLiBFbnN1cmUgdGhhdCB0aGUgcmVzdWx0aW5nIGV2ZW50CisJICogaXMgb25seSBzZW5kIG9uY2UgYnkgY2hlY2tpbmcgaWYgdGhlIGNvb2tpZSBleGlzdHMgb3Igbm90LiBUaGUKKwkgKiBzb2NrZXQgY29va2llIHdpbGwgYmUgb25seSBldmVyIGdlbmVyYXRlZCBvbmNlIGZvciB0aGUgbGlmZXRpbWUKKwkgKiBvZiBhIGdpdmVuIHNvY2tldC4KKwkgKi8KKwlpZiAoaGNpX3NvY2tfZ2VuX2Nvb2tpZShzaykpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQlpZiAoY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKKwkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfU09DS19UUlVTVEVEKTsKKworCQkvKiBTZW5kIGV2ZW50IHRvIG1vbml0b3IgKi8KKwkJc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9vcGVuKHNrKTsKKwkJaWYgKHNrYikgeworCQkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBza2IsCisJCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisJfQorCiAJcmVsZWFzZV9zb2NrKHNrKTsKIAogCXN3aXRjaCAoY21kKSB7CkBAIC03ODQsNiArMTA1Niw3IEBACiAJc3RydWN0IHNvY2thZGRyX2hjaSBoYWRkcjsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgbGVuLCBlcnIgPSAwOwogCiAJQlRfREJHKCJzb2NrICVwIHNrICVwIiwgc29jaywgc2spOwpAQCAtODIyLDcgKzEwOTUsMzUgQEAKIAkJCWF0b21pY19pbmMoJmhkZXYtPnByb21pc2MpOwogCQl9CiAKKwkJaGNpX3BpKHNrKS0+Y2hhbm5lbCA9IGhhZGRyLmhjaV9jaGFubmVsOworCisJCWlmICghaGNpX3NvY2tfZ2VuX2Nvb2tpZShzaykpIHsKKwkJCS8qIEluIHRoZSBjYXNlIHdoZW4gYSBjb29raWUgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZCwKKwkJCSAqIHRoZW4gdGhlcmUgaGFzIGJlZW4gYWxyZWFkeSBhbiBpb2N0bCBpc3N1ZWQgYWdhaW5zdAorCQkJICogYW4gdW5ib3VuZCBzb2NrZXQgYW5kIHdpdGggdGhhdCB0cmlnZ2VyZCBhbiBvcGVuCisJCQkgKiBub3RpZmljYXRpb24uIFNlbmQgYSBjbG9zZSBub3RpZmljYXRpb24gZmlyc3QgdG8KKwkJCSAqIGFsbG93IHRoZSBzdGF0ZSB0cmFuc2l0aW9uIHRvIGJvdW5kZWQuCisJCQkgKi8KKwkJCXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfY2xvc2Uoc2spOworCQkJaWYgKHNrYikgeworCQkJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgc2tiLAorCQkJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQkJCWtmcmVlX3NrYihza2IpOworCQkJfQorCQl9CisKKwkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX1NPQ0tfVFJVU1RFRCk7CisKIAkJaGNpX3BpKHNrKS0+aGRldiA9IGhkZXY7CisKKwkJLyogU2VuZCBldmVudCB0byBtb25pdG9yICovCisJCXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfb3Blbihzayk7CisJCWlmIChza2IpIHsKKwkJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgc2tiLAorCQkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgSENJX0NIQU5ORUxfVVNFUjoKQEAgLTg4NCw5ICsxMTg1LDM4IEBACiAJCQl9CiAJCX0KIAotCQlhdG9taWNfaW5jKCZoZGV2LT5wcm9taXNjKTsKKwkJaGNpX3BpKHNrKS0+Y2hhbm5lbCA9IGhhZGRyLmhjaV9jaGFubmVsOworCisJCWlmICghaGNpX3NvY2tfZ2VuX2Nvb2tpZShzaykpIHsKKwkJCS8qIEluIHRoZSBjYXNlIHdoZW4gYSBjb29raWUgaGFzIGFscmVhZHkgYmVlbiBhc3NpZ25lZCwKKwkJCSAqIHRoaXMgc29ja2V0IHdpbGwgdHJhbnNpdGlvbiBmcm9tIGEgcmF3IHNvY2tldCBpbnRvCisJCQkgKiBhbiB1c2VyIGNoYW5uZWwgc29ja2V0LiBGb3IgYSBjbGVhbiB0cmFuc2l0aW9uLCBzZW5kCisJCQkgKiB0aGUgY2xvc2Ugbm90aWZpY2F0aW9uIGZpcnN0LgorCQkJICovCisJCQlza2IgPSBjcmVhdGVfbW9uaXRvcl9jdHJsX2Nsb3NlKHNrKTsKKwkJCWlmIChza2IpIHsKKwkJCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIHNrYiwKKwkJCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCX0KKwkJfQorCisJCS8qIFRoZSB1c2VyIGNoYW5uZWwgaXMgcmVzdHJpY3RlZCB0byBDQVBfTkVUX0FETUlOCisJCSAqIGNhcGFiaWxpdGllcyBhbmQgd2l0aCB0aGF0IGltcGxpY2l0bHkgdHJ1c3RlZC4KKwkJICovCisJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfU09DS19UUlVTVEVEKTsKIAogCQloY2lfcGkoc2spLT5oZGV2ID0gaGRldjsKKworCQkvKiBTZW5kIGV2ZW50IHRvIG1vbml0b3IgKi8KKwkJc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9vcGVuKHNrKTsKKwkJaWYgKHNrYikgeworCQkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBza2IsCisJCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQl9CisKKwkJYXRvbWljX2luYygmaGRldi0+cHJvbWlzYyk7CiAJCWJyZWFrOwogCiAJY2FzZSBIQ0lfQ0hBTk5FTF9NT05JVE9SOgpAQCAtOTAwLDYgKzEyMzAsOCBAQAogCQkJZ290byBkb25lOwogCQl9CiAKKwkJaGNpX3BpKHNrKS0+Y2hhbm5lbCA9IGhhZGRyLmhjaV9jaGFubmVsOworCiAJCS8qIFRoZSBtb25pdG9yIGludGVyZmFjZSBpcyByZXN0cmljdGVkIHRvIENBUF9ORVRfUkFXCiAJCSAqIGNhcGFiaWxpdGllcyBhbmQgd2l0aCB0aGF0IGltcGxpY2l0bHkgdHJ1c3RlZC4KIAkJICovCkBAIC05MDgsOSArMTI0MCwxMCBAQAogCQlzZW5kX21vbml0b3Jfbm90ZShzaywgIkxpbnV4IHZlcnNpb24gJXMgKCVzKSIsCiAJCQkJICBpbml0X3V0c25hbWUoKS0+cmVsZWFzZSwKIAkJCQkgIGluaXRfdXRzbmFtZSgpLT5tYWNoaW5lKTsKLQkJc2VuZF9tb25pdG9yX25vdGUoc2ssICJCbHVldG9vdGggc3Vic3lzdGVtIHZlcnNpb24gJXMiLAotCQkJCSAgQlRfU1VCU1lTX1ZFUlNJT04pOworCQlzZW5kX21vbml0b3Jfbm90ZShzaywgIkJsdWV0b290aCBzdWJzeXN0ZW0gdmVyc2lvbiAldS4ldSIsCisJCQkJICBCVF9TVUJTWVNfVkVSU0lPTiwgQlRfU1VCU1lTX1JFVklTSU9OKTsKIAkJc2VuZF9tb25pdG9yX3JlcGxheShzayk7CisJCXNlbmRfbW9uaXRvcl9jb250cm9sX3JlcGxheShzayk7CiAKIAkJYXRvbWljX2luYygmbW9uaXRvcl9wcm9taXNjKTsKIAkJYnJlYWs7CkBAIC05MjUsNiArMTI1OCw4IEBACiAJCQllcnIgPSAtRVBFUk07CiAJCQlnb3RvIGRvbmU7CiAJCX0KKworCQloY2lfcGkoc2spLT5jaGFubmVsID0gaGFkZHIuaGNpX2NoYW5uZWw7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTk0Niw2ICsxMjgxLDggQEAKIAkJaWYgKGNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX1NPQ0tfVFJVU1RFRCk7CiAKKwkJaGNpX3BpKHNrKS0+Y2hhbm5lbCA9IGhhZGRyLmhjaV9jaGFubmVsOworCiAJCS8qIEF0IHRoZSBtb21lbnQgdGhlIGluZGV4IGFuZCB1bmNvbmZpZ3VyZWQgaW5kZXggZXZlbnRzCiAJCSAqIGFyZSBlbmFibGVkIHVuY29uZGl0aW9uYWxseS4gU2V0dGluZyB0aGVtIG9uIGVhY2gKIAkJICogc29ja2V0IHdoZW4gYmluZGluZyBrZWVwcyB0aGlzIGZ1bmN0aW9uYWxpdHkuIFRoZXkKQEAgLTk1NiwxNiArMTI5Myw0MCBAQAogCQkgKiByZWNlaXZlZCBieSB1bnRydXN0ZWQgdXNlcnMuIEV4YW1wbGUgZm9yIHN1Y2ggZXZlbnRzCiAJCSAqIGFyZSBjaGFuZ2VzIHRvIHNldHRpbmdzLCBjbGFzcyBvZiBkZXZpY2UsIG5hbWUgZXRjLgogCQkgKi8KLQkJaWYgKGhhZGRyLmhjaV9jaGFubmVsID09IEhDSV9DSEFOTkVMX0NPTlRST0wpIHsKKwkJaWYgKGhjaV9waShzayktPmNoYW5uZWwgPT0gSENJX0NIQU5ORUxfQ09OVFJPTCkgeworCQkJaWYgKCFoY2lfc29ja19nZW5fY29va2llKHNrKSkgeworCQkJCS8qIEluIHRoZSBjYXNlIHdoZW4gYSBjb29raWUgaGFzIGFscmVhZHkgYmVlbgorCQkJCSAqIGFzc2lnbmVkLCB0aGlzIHNvY2tldCB3aWxsIHRyYW5zdGlvbiBmcm9tCisJCQkJICogYSByYXcgc29ja2V0IGludG8gYSBjb250cm9sIHNvY2tldC4gVG8KKwkJCQkgKiBhbGxvdyBmb3IgYSBjbGVhbiB0cmFuc3Rpb24sIHNlbmQgdGhlCisJCQkJICogY2xvc2Ugbm90aWZpY2F0aW9uIGZpcnN0LgorCQkJCSAqLworCQkJCXNrYiA9IGNyZWF0ZV9tb25pdG9yX2N0cmxfY2xvc2Uoc2spOworCQkJCWlmIChza2IpIHsKKwkJCQkJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBza2IsCisJCQkJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIFNlbmQgZXZlbnQgdG8gbW9uaXRvciAqLworCQkJc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9vcGVuKHNrKTsKKwkJCWlmIChza2IpIHsKKwkJCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIHNrYiwKKwkJCQkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCX0KKwogCQkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9NR01UX0lOREVYX0VWRU5UUyk7CiAJCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX01HTVRfVU5DT05GX0lOREVYX0VWRU5UUyk7Ci0JCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX01HTVRfR0VORVJJQ19FVkVOVFMpOworCQkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9NR01UX09QVElPTl9FVkVOVFMpOworCQkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9NR01UX1NFVFRJTkdfRVZFTlRTKTsKKwkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfTUdNVF9ERVZfQ0xBU1NfRVZFTlRTKTsKKwkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfTUdNVF9MT0NBTF9OQU1FX0VWRU5UUyk7CiAJCX0KIAkJYnJlYWs7CiAJfQogCi0KLQloY2lfcGkoc2spLT5jaGFubmVsID0gaGFkZHIuaGNpX2NoYW5uZWw7CiAJc2stPnNrX3N0YXRlID0gQlRfQk9VTkQ7CiAKIGRvbmU6CkBAIC0xMDkxLDcgKzE0NTIsNyBAQAogCiAJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CiAKLQlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfVFJVTkMpCisJaWYgKGZsYWdzICYgTVNHX1RSVU5DKQogCQljb3BpZWQgPSBza2JsZW47CiAKIAlyZXR1cm4gZXJyID8gOiBjb3BpZWQ7CkBAIC0xMTMzLDYgKzE0OTQsMTkgQEAKIAkJZ290byBkb25lOwogCX0KIAorCWlmIChjaGFuLT5jaGFubmVsID09IEhDSV9DSEFOTkVMX0NPTlRST0wpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCQkvKiBTZW5kIGV2ZW50IHRvIG1vbml0b3IgKi8KKwkJc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9jb21tYW5kKHNrLCBpbmRleCwgb3Bjb2RlLCBsZW4sCisJCQkJCQkgIGJ1ZiArIHNpemVvZigqaGRyKSk7CisJCWlmIChza2IpIHsKKwkJCWhjaV9zZW5kX3RvX2NoYW5uZWwoSENJX0NIQU5ORUxfTU9OSVRPUiwgc2tiLAorCQkJCQkgICAgSENJX1NPQ0tfVFJVU1RFRCwgTlVMTCk7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQorCX0KKwogCWlmIChvcGNvZGUgPj0gY2hhbi0+aGFuZGxlcl9jb3VudCB8fAogCSAgICBjaGFuLT5oYW5kbGVyc1tvcGNvZGVdLmZ1bmMgPT0gTlVMTCkgewogCQlCVF9EQkcoIlVua25vd24gb3AgJXUiLCBvcGNvZGUpOwpAQCAtMTQ0MCw2ICsxODE0LDkgQEAKIAogCUJUX0RCRygic2sgJXAsIG9wdCAlZCIsIHNrLCBvcHRuYW1lKTsKIAorCWlmIChsZXZlbCAhPSBTT0xfSENJKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCiAJbG9ja19zb2NrKHNrKTsKIAogCWlmIChoY2lfcGkoc2spLT5jaGFubmVsICE9IEhDSV9DSEFOTkVMX1JBVykgewpAQCAtMTUyMyw2ICsxOTAwLDkgQEAKIAogCUJUX0RCRygic2sgJXAsIG9wdCAlZCIsIHNrLCBvcHRuYW1lKTsKIAorCWlmIChsZXZlbCAhPSBTT0xfSENJKQorCQlyZXR1cm4gLUVOT1BST1RPT1BUOworCiAJaWYgKGdldF91c2VyKGxlbiwgb3B0bGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKaW5kZXggNTRjZWIxZi4uZDRjYWQyOWIwIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYwpAQCAtMzIsNiArMzIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYzE2Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CiAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KQEAgLTU4MzUsNiArNTgzNiw5IEBACiAJCWlmIChjaGFuLT5zZHUpCiAJCQlicmVhazsKIAorCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBMMkNBUF9TRFVMRU5fU0laRSkpCisJCQlicmVhazsKKwogCQljaGFuLT5zZHVfbGVuID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHNrYi0+ZGF0YSk7CiAJCXNrYl9wdWxsKHNrYiwgTDJDQVBfU0RVTEVOX1NJWkUpOwogCkBAIC02NjEwLDYgKzY2MTQsMTAgQEAKIAkJZ290byBkcm9wOwogCX0KIAorCWlmICgoY2hhbi0+bW9kZSA9PSBMMkNBUF9NT0RFX0VSVE0gfHwKKwkgICAgIGNoYW4tPm1vZGUgPT0gTDJDQVBfTU9ERV9TVFJFQU1JTkcpICYmIHNrX2ZpbHRlcihjaGFuLT5kYXRhLCBza2IpKQorCQlnb3RvIGRyb3A7CisKIAlpZiAoIWNvbnRyb2wtPnNmcmFtZSkgewogCQlpbnQgZXJyOwogCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCmluZGV4IDE4NDIxNDEuLmE4YmE3NTIgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jCkBAIC0xMDE5LDcgKzEwMTksNyBAQAogCQlnb3RvIGRvbmU7CiAKIAlpZiAocGktPnJ4X2J1c3lfc2tiKSB7Ci0JCWlmICghc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBwaS0+cnhfYnVzeV9za2IpKQorCQlpZiAoIV9fc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBwaS0+cnhfYnVzeV9za2IpKQogCQkJcGktPnJ4X2J1c3lfc2tiID0gTlVMTDsKIAkJZWxzZQogCQkJZ290byBkb25lOwpAQCAtMTI3MCw3ICsxMjcwLDE3IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQllcnIgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CisJaWYgKGNoYW4tPm1vZGUgIT0gTDJDQVBfTU9ERV9FUlRNICYmCisJICAgIGNoYW4tPm1vZGUgIT0gTDJDQVBfTU9ERV9TVFJFQU1JTkcpIHsKKwkJLyogRXZlbiBpZiBubyBmaWx0ZXIgaXMgYXR0YWNoZWQsIHdlIGNvdWxkIHBvdGVudGlhbGx5CisJCSAqIGdldCBlcnJvcnMgZnJvbSBzZWN1cml0eSBtb2R1bGVzLCBldGMuCisJCSAqLworCQllcnIgPSBza19maWx0ZXIoc2ssIHNrYik7CisJCWlmIChlcnIpCisJCQlnb3RvIGRvbmU7CisJfQorCisJZXJyID0gX19zb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CiAKIAkvKiBGb3IgRVJUTSwgaGFuZGxlIG9uZSBza2IgdGhhdCBkb2Vzbid0IGZpdCBpbnRvIHRoZSByZWN2CiAJICogYnVmZmVyLiAgVGhpcyBpcyBpbXBvcnRhbnQgdG8gZG8gYmVjYXVzZSB0aGUgZGF0YSBmcmFtZXMKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbGVkcy5jIGIvbmV0L2JsdWV0b290aC9sZWRzLmMKaW5kZXggODMxOWM4NC4uY2I2NzBiNSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sZWRzLmMKKysrIGIvbmV0L2JsdWV0b290aC9sZWRzLmMKQEAgLTExLDYgKzExLDggQEAKIAogI2luY2x1ZGUgImxlZHMuaCIKIAorREVGSU5FX0xFRF9UUklHR0VSKGJ0X3Bvd2VyX2xlZF90cmlnZ2VyKTsKKwogc3RydWN0IGhjaV9iYXNpY19sZWRfdHJpZ2dlciB7CiAJc3RydWN0IGxlZF90cmlnZ2VyCWxlZF90cmlnZ2VyOwogCXN0cnVjdCBoY2lfZGV2CQkqaGRldjsKQEAgLTI0LDYgKzI2LDIxIEBACiAJaWYgKGhkZXYtPnBvd2VyX2xlZCkKIAkJbGVkX3RyaWdnZXJfZXZlbnQoaGRldi0+cG93ZXJfbGVkLAogCQkJCSAgZW5hYmxlZCA/IExFRF9GVUxMIDogTEVEX09GRik7CisKKwlpZiAoIWVuYWJsZWQpIHsKKwkJc3RydWN0IGhjaV9kZXYgKmQ7CisKKwkJcmVhZF9sb2NrKCZoY2lfZGV2X2xpc3RfbG9jayk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmaGNpX2Rldl9saXN0LCBsaXN0KSB7CisJCQlpZiAodGVzdF9iaXQoSENJX1VQLCAmZC0+ZmxhZ3MpKQorCQkJCWVuYWJsZWQgPSB0cnVlOworCQl9CisKKwkJcmVhZF91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKKwl9CisKKwlsZWRfdHJpZ2dlcl9ldmVudChidF9wb3dlcl9sZWRfdHJpZ2dlciwgZW5hYmxlZCA/IExFRF9GVUxMIDogTEVEX09GRik7CiB9CiAKIHN0YXRpYyB2b2lkIHBvd2VyX2FjdGl2YXRlKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQpAQCAtNzIsMyArODksMTMgQEAKIAkvKiBpbml0aWFsaXplIHBvd2VyX2xlZCAqLwogCWhkZXYtPnBvd2VyX2xlZCA9IGxlZF9hbGxvY2F0ZV9iYXNpYyhoZGV2LCBwb3dlcl9hY3RpdmF0ZSwgInBvd2VyIik7CiB9CisKK3ZvaWQgYnRfbGVkc19pbml0KHZvaWQpCit7CisJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKCJibHVldG9vdGgtcG93ZXIiLCAmYnRfcG93ZXJfbGVkX3RyaWdnZXIpOworfQorCit2b2lkIGJ0X2xlZHNfY2xlYW51cCh2b2lkKQoreworCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKGJ0X3Bvd2VyX2xlZF90cmlnZ2VyKTsKK30KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbGVkcy5oIGIvbmV0L2JsdWV0b290aC9sZWRzLmgKaW5kZXggYTljNGQ2ZS4uMDg3MjVhMiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sZWRzLmgKKysrIGIvbmV0L2JsdWV0b290aC9sZWRzLmgKQEAgLTcsMTAgKzcsMjAgQEAKICAqLwogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQlRfTEVEUykKKwogdm9pZCBoY2lfbGVkc191cGRhdGVfcG93ZXJlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYm9vbCBlbmFibGVkKTsKIHZvaWQgaGNpX2xlZHNfaW5pdChzdHJ1Y3QgaGNpX2RldiAqaGRldik7CisKK3ZvaWQgYnRfbGVkc19pbml0KHZvaWQpOwordm9pZCBidF9sZWRzX2NsZWFudXAodm9pZCk7CisKICNlbHNlCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfbGVkc191cGRhdGVfcG93ZXJlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwKIAkJCQkJICAgYm9vbCBlbmFibGVkKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGhjaV9sZWRzX2luaXQoc3RydWN0IGhjaV9kZXYgKmhkZXYpIHt9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBidF9sZWRzX2luaXQodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBidF9sZWRzX2NsZWFudXAodm9pZCkge30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL21nbXQuYyBiL25ldC9ibHVldG9vdGgvbWdtdC5jCmluZGV4IDc2MzkyOTAuLjE5YjhhNWUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbWdtdC5jCisrKyBiL25ldC9ibHVldG9vdGgvbWdtdC5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSAibWdtdF91dGlsLmgiCiAKICNkZWZpbmUgTUdNVF9WRVJTSU9OCTEKLSNkZWZpbmUgTUdNVF9SRVZJU0lPTgkxMworI2RlZmluZSBNR01UX1JFVklTSU9OCTE0CiAKIHN0YXRpYyBjb25zdCB1MTYgbWdtdF9jb21tYW5kc1tdID0gewogCU1HTVRfT1BfUkVBRF9JTkRFWF9MSVNULApAQCAtMTA0LDYgKzEwNCw4IEBACiAJTUdNVF9PUF9SRU1PVkVfQURWRVJUSVNJTkcsCiAJTUdNVF9PUF9HRVRfQURWX1NJWkVfSU5GTywKIAlNR01UX09QX1NUQVJUX0xJTUlURURfRElTQ09WRVJZLAorCU1HTVRfT1BfUkVBRF9FWFRfSU5GTywKKwlNR01UX09QX1NFVF9BUFBFQVJBTkNFLAogfTsKIAogc3RhdGljIGNvbnN0IHUxNiBtZ210X2V2ZW50c1tdID0gewpAQCAtMTQxLDYgKzE0Myw3IEBACiAJTUdNVF9FVl9MT0NBTF9PT0JfREFUQV9VUERBVEVELAogCU1HTVRfRVZfQURWRVJUSVNJTkdfQURERUQsCiAJTUdNVF9FVl9BRFZFUlRJU0lOR19SRU1PVkVELAorCU1HTVRfRVZfRVhUX0lORk9fQ0hBTkdFRCwKIH07CiAKIHN0YXRpYyBjb25zdCB1MTYgbWdtdF91bnRydXN0ZWRfY29tbWFuZHNbXSA9IHsKQEAgLTE0OSw2ICsxNTIsNyBAQAogCU1HTVRfT1BfUkVBRF9VTkNPTkZfSU5ERVhfTElTVCwKIAlNR01UX09QX1JFQURfQ09ORklHX0lORk8sCiAJTUdNVF9PUF9SRUFEX0VYVF9JTkRFWF9MSVNULAorCU1HTVRfT1BfUkVBRF9FWFRfSU5GTywKIH07CiAKIHN0YXRpYyBjb25zdCB1MTYgbWdtdF91bnRydXN0ZWRfZXZlbnRzW10gPSB7CkBAIC0xNjIsNiArMTY2LDcgQEAKIAlNR01UX0VWX05FV19DT05GSUdfT1BUSU9OUywKIAlNR01UX0VWX0VYVF9JTkRFWF9BRERFRCwKIAlNR01UX0VWX0VYVF9JTkRFWF9SRU1PVkVELAorCU1HTVRfRVZfRVhUX0lORk9fQ0hBTkdFRCwKIH07CiAKICNkZWZpbmUgQ0FDSEVfVElNRU9VVAltc2Vjc190b19qaWZmaWVzKDIgKiAxMDAwKQpAQCAtMjU2LDEzICsyNjEsNiBAQAogCQkJICAgICAgIGZsYWcsIHNraXBfc2spOwogfQogCi1zdGF0aWMgaW50IG1nbXRfZ2VuZXJpY19ldmVudCh1MTYgZXZlbnQsIHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkICpkYXRhLAotCQkJICAgICAgdTE2IGxlbiwgc3RydWN0IHNvY2sgKnNraXBfc2spCi17Ci0JcmV0dXJuIG1nbXRfc2VuZF9ldmVudChldmVudCwgaGRldiwgSENJX0NIQU5ORUxfQ09OVFJPTCwgZGF0YSwgbGVuLAotCQkJICAgICAgIEhDSV9NR01UX0dFTkVSSUNfRVZFTlRTLCBza2lwX3NrKTsKLX0KLQogc3RhdGljIGludCBtZ210X2V2ZW50KHUxNiBldmVudCwgc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKmRhdGEsIHUxNiBsZW4sCiAJCSAgICAgIHN0cnVjdCBzb2NrICpza2lwX3NrKQogewpAQCAtMjc4LDYgKzI3NiwxNCBAQAogCQlyZXR1cm4gQUREUl9MRV9ERVZfUkFORE9NOwogfQogCit2b2lkIG1nbXRfZmlsbF92ZXJzaW9uX2luZm8odm9pZCAqdmVyKQoreworCXN0cnVjdCBtZ210X3JwX3JlYWRfdmVyc2lvbiAqcnAgPSB2ZXI7CisKKwlycC0+dmVyc2lvbiA9IE1HTVRfVkVSU0lPTjsKKwlycC0+cmV2aXNpb24gPSBjcHVfdG9fbGUxNihNR01UX1JFVklTSU9OKTsKK30KKwogc3RhdGljIGludCByZWFkX3ZlcnNpb24oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwKIAkJCXUxNiBkYXRhX2xlbikKIHsKQEAgLTI4NSw4ICsyOTEsNyBAQAogCiAJQlRfREJHKCJzb2NrICVwIiwgc2spOwogCi0JcnAudmVyc2lvbiA9IE1HTVRfVkVSU0lPTjsKLQlycC5yZXZpc2lvbiA9IGNwdV90b19sZTE2KE1HTVRfUkVWSVNJT04pOworCW1nbXRfZmlsbF92ZXJzaW9uX2luZm8oJnJwKTsKIAogCXJldHVybiBtZ210X2NtZF9jb21wbGV0ZShzaywgTUdNVF9JTkRFWF9OT05FLCBNR01UX09QX1JFQURfVkVSU0lPTiwgMCwKIAkJCQkgJnJwLCBzaXplb2YocnApKTsKQEAgLTU3Miw4ICs1NzcsOCBAQAogewogCV9fbGUzMiBvcHRpb25zID0gZ2V0X21pc3Npbmdfb3B0aW9ucyhoZGV2KTsKIAotCXJldHVybiBtZ210X2dlbmVyaWNfZXZlbnQoTUdNVF9FVl9ORVdfQ09ORklHX09QVElPTlMsIGhkZXYsICZvcHRpb25zLAotCQkJCSAgc2l6ZW9mKG9wdGlvbnMpLCBza2lwKTsKKwlyZXR1cm4gbWdtdF9saW1pdGVkX2V2ZW50KE1HTVRfRVZfTkVXX0NPTkZJR19PUFRJT05TLCBoZGV2LCAmb3B0aW9ucywKKwkJCQkgIHNpemVvZihvcHRpb25zKSwgSENJX01HTVRfT1BUSU9OX0VWRU5UUywgc2tpcCk7CiB9CiAKIHN0YXRpYyBpbnQgc2VuZF9vcHRpb25zX3JzcChzdHJ1Y3Qgc29jayAqc2ssIHUxNiBvcGNvZGUsIHN0cnVjdCBoY2lfZGV2ICpoZGV2KQpAQCAtODYyLDYgKzg2NywxMDcgQEAKIAkJCQkgc2l6ZW9mKHJwKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTE2IGVpcl9hcHBlbmRfZGF0YSh1OCAqZWlyLCB1MTYgZWlyX2xlbiwgdTggdHlwZSwgdTggKmRhdGEsCisJCQkJICB1OCBkYXRhX2xlbikKK3sKKwllaXJbZWlyX2xlbisrXSA9IHNpemVvZih0eXBlKSArIGRhdGFfbGVuOworCWVpcltlaXJfbGVuKytdID0gdHlwZTsKKwltZW1jcHkoJmVpcltlaXJfbGVuXSwgZGF0YSwgZGF0YV9sZW4pOworCWVpcl9sZW4gKz0gZGF0YV9sZW47CisKKwlyZXR1cm4gZWlyX2xlbjsKK30KKworc3RhdGljIGlubGluZSB1MTYgZWlyX2FwcGVuZF9sZTE2KHU4ICplaXIsIHUxNiBlaXJfbGVuLCB1OCB0eXBlLCB1MTYgZGF0YSkKK3sKKwllaXJbZWlyX2xlbisrXSA9IHNpemVvZih0eXBlKSArIHNpemVvZihkYXRhKTsKKwllaXJbZWlyX2xlbisrXSA9IHR5cGU7CisJcHV0X3VuYWxpZ25lZF9sZTE2KGRhdGEsICZlaXJbZWlyX2xlbl0pOworCWVpcl9sZW4gKz0gc2l6ZW9mKGRhdGEpOworCisJcmV0dXJuIGVpcl9sZW47Cit9CisKK3N0YXRpYyB1MTYgYXBwZW5kX2Vpcl9kYXRhX3RvX2J1ZihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggKmVpcikKK3sKKwl1MTYgZWlyX2xlbiA9IDA7CisJc2l6ZV90IG5hbWVfbGVuOworCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CUkVEUl9FTkFCTEVEKSkKKwkJZWlyX2xlbiA9IGVpcl9hcHBlbmRfZGF0YShlaXIsIGVpcl9sZW4sIEVJUl9DTEFTU19PRl9ERVYsCisJCQkJCSAgaGRldi0+ZGV2X2NsYXNzLCAzKTsKKworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTEVfRU5BQkxFRCkpCisJCWVpcl9sZW4gPSBlaXJfYXBwZW5kX2xlMTYoZWlyLCBlaXJfbGVuLCBFSVJfQVBQRUFSQU5DRSwKKwkJCQkJICBoZGV2LT5hcHBlYXJhbmNlKTsKKworCW5hbWVfbGVuID0gc3RybGVuKGhkZXYtPmRldl9uYW1lKTsKKwllaXJfbGVuID0gZWlyX2FwcGVuZF9kYXRhKGVpciwgZWlyX2xlbiwgRUlSX05BTUVfQ09NUExFVEUsCisJCQkJICBoZGV2LT5kZXZfbmFtZSwgbmFtZV9sZW4pOworCisJbmFtZV9sZW4gPSBzdHJsZW4oaGRldi0+c2hvcnRfbmFtZSk7CisJZWlyX2xlbiA9IGVpcl9hcHBlbmRfZGF0YShlaXIsIGVpcl9sZW4sIEVJUl9OQU1FX1NIT1JULAorCQkJCSAgaGRldi0+c2hvcnRfbmFtZSwgbmFtZV9sZW4pOworCisJcmV0dXJuIGVpcl9sZW47Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9leHRfY29udHJvbGxlcl9pbmZvKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkJICAgIHZvaWQgKmRhdGEsIHUxNiBkYXRhX2xlbikKK3sKKwljaGFyIGJ1Zls1MTJdOworCXN0cnVjdCBtZ210X3JwX3JlYWRfZXh0X2luZm8gKnJwID0gKHZvaWQgKilidWY7CisJdTE2IGVpcl9sZW47CisKKwlCVF9EQkcoInNvY2sgJXAgJXMiLCBzaywgaGRldi0+bmFtZSk7CisKKwltZW1zZXQoJmJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJYmFjcHkoJnJwLT5iZGFkZHIsICZoZGV2LT5iZGFkZHIpOworCisJcnAtPnZlcnNpb24gPSBoZGV2LT5oY2lfdmVyOworCXJwLT5tYW51ZmFjdHVyZXIgPSBjcHVfdG9fbGUxNihoZGV2LT5tYW51ZmFjdHVyZXIpOworCisJcnAtPnN1cHBvcnRlZF9zZXR0aW5ncyA9IGNwdV90b19sZTMyKGdldF9zdXBwb3J0ZWRfc2V0dGluZ3MoaGRldikpOworCXJwLT5jdXJyZW50X3NldHRpbmdzID0gY3B1X3RvX2xlMzIoZ2V0X2N1cnJlbnRfc2V0dGluZ3MoaGRldikpOworCisKKwllaXJfbGVuID0gYXBwZW5kX2Vpcl9kYXRhX3RvX2J1ZihoZGV2LCBycC0+ZWlyKTsKKwlycC0+ZWlyX2xlbiA9IGNwdV90b19sZTE2KGVpcl9sZW4pOworCisJaGNpX2Rldl91bmxvY2soaGRldik7CisKKwkvKiBJZiB0aGlzIGNvbW1hbmQgaXMgY2FsbGVkIGF0IGxlYXN0IG9uY2UsIHRoZW4gdGhlIGV2ZW50cworCSAqIGZvciBjbGFzcyBvZiBkZXZpY2UgYW5kIGxvY2FsIG5hbWUgY2hhbmdlcyBhcmUgZGlzYWJsZWQKKwkgKiBhbmQgb25seSB0aGUgbmV3IGV4dGVuZGVkIGNvbnRyb2xsZXIgaW5mb3JtYXRpb24gZXZlbnQKKwkgKiBpcyB1c2VkLgorCSAqLworCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfTUdNVF9FWFRfSU5GT19FVkVOVFMpOworCWhjaV9zb2NrX2NsZWFyX2ZsYWcoc2ssIEhDSV9NR01UX0RFVl9DTEFTU19FVkVOVFMpOworCWhjaV9zb2NrX2NsZWFyX2ZsYWcoc2ssIEhDSV9NR01UX0xPQ0FMX05BTUVfRVZFTlRTKTsKKworCXJldHVybiBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfUkVBRF9FWFRfSU5GTywgMCwgcnAsCisJCQkJIHNpemVvZigqcnApICsgZWlyX2xlbik7Cit9CisKK3N0YXRpYyBpbnQgZXh0X2luZm9fY2hhbmdlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNvY2sgKnNraXApCit7CisJY2hhciBidWZbNTEyXTsKKwlzdHJ1Y3QgbWdtdF9ldl9leHRfaW5mb19jaGFuZ2VkICpldiA9ICh2b2lkICopYnVmOworCXUxNiBlaXJfbGVuOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJZWlyX2xlbiA9IGFwcGVuZF9laXJfZGF0YV90b19idWYoaGRldiwgZXYtPmVpcik7CisJZXYtPmVpcl9sZW4gPSBjcHVfdG9fbGUxNihlaXJfbGVuKTsKKworCXJldHVybiBtZ210X2xpbWl0ZWRfZXZlbnQoTUdNVF9FVl9FWFRfSU5GT19DSEFOR0VELCBoZGV2LCBldiwKKwkJCQkgIHNpemVvZigqZXYpICsgZWlyX2xlbiwKKwkJCQkgIEhDSV9NR01UX0VYVF9JTkZPX0VWRU5UUywgc2tpcCk7Cit9CisKIHN0YXRpYyBpbnQgc2VuZF9zZXR0aW5nc19yc3Aoc3RydWN0IHNvY2sgKnNrLCB1MTYgb3Bjb2RlLCBzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlfX2xlMzIgc2V0dGluZ3MgPSBjcHVfdG9fbGUzMihnZXRfY3VycmVudF9zZXR0aW5ncyhoZGV2KSk7CkBAIC05MjIsNyArMTAyOCw3IEBACiAJCWhjaV9yZXFfYWRkKCZyZXEsIEhDSV9PUF9XUklURV9TQ0FOX0VOQUJMRSwgMSwgJnNjYW4pOwogCX0KIAotCWhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKGhkZXYsIE5VTEwsIDB4MDAsIGZhbHNlKTsKKwloY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShoZGV2LCBOVUxMLCBOVUxMLCAweDAwLCBmYWxzZSk7CiAKIAlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0FEVikpCiAJCV9faGNpX3JlcV9kaXNhYmxlX2FkdmVydGlzaW5nKCZyZXEpOwpAQCAtMTAwMCw4ICsxMTA2LDggQEAKIHsKIAlfX2xlMzIgZXYgPSBjcHVfdG9fbGUzMihnZXRfY3VycmVudF9zZXR0aW5ncyhoZGV2KSk7CiAKLQlyZXR1cm4gbWdtdF9nZW5lcmljX2V2ZW50KE1HTVRfRVZfTkVXX1NFVFRJTkdTLCBoZGV2LCAmZXYsCi0JCQkJICBzaXplb2YoZXYpLCBza2lwKTsKKwlyZXR1cm4gbWdtdF9saW1pdGVkX2V2ZW50KE1HTVRfRVZfTkVXX1NFVFRJTkdTLCBoZGV2LCAmZXYsCisJCQkJICBzaXplb2YoZXYpLCBIQ0lfTUdNVF9TRVRUSU5HX0VWRU5UUywgc2tpcCk7CiB9CiAKIGludCBtZ210X25ld19zZXR0aW5ncyhzdHJ1Y3QgaGNpX2RldiAqaGRldikKQEAgLTE2OTAsNyArMTc5Niw3IEBACiAJZW5hYmxlZCA9IGxtcF9ob3N0X2xlX2NhcGFibGUoaGRldik7CiAKIAlpZiAoIXZhbCkKLQkJaGNpX3JlcV9jbGVhcl9hZHZfaW5zdGFuY2UoaGRldiwgTlVMTCwgMHgwMCwgdHJ1ZSk7CisJCWhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKGhkZXYsIE5VTEwsIE5VTEwsIDB4MDAsIHRydWUpOwogCiAJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikgfHwgdmFsID09IGVuYWJsZWQpIHsKIAkJYm9vbCBjaGFuZ2VkID0gZmFsc2U7CkBAIC0yNDM1LDYgKzI1NDEsOCBAQAogCWlmICghY21kKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWNtZC0+Y21kX2NvbXBsZXRlID0gYWRkcl9jbWRfY29tcGxldGU7CisKIAllcnIgPSBoY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1BJTl9DT0RFX05FR19SRVBMWSwKIAkJCSAgIHNpemVvZihjcC0+YWRkci5iZGFkZHIpLCAmY3AtPmFkZHIuYmRhZGRyKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTI1MTMsOCArMjYyMSw4IEBACiAJQlRfREJHKCIiKTsKIAogCWlmIChjcC0+aW9fY2FwYWJpbGl0eSA+IFNNUF9JT19LRVlCT0FSRF9ESVNQTEFZKQotCQlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9JT19DQVBBQklMSVRZLAotCQkJCQkgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsIE5VTEwsIDApOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfSU9fQ0FQQUJJTElUWSwKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCkBAIC0yOTMyLDYgKzMwNDAsMzUgQEAKIAkJCQkgSENJX09QX1VTRVJfUEFTU0tFWV9ORUdfUkVQTFksIDApOwogfQogCitzdGF0aWMgdm9pZCBhZHZfZXhwaXJlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGFkdl9pbmZvICphZHZfaW5zdGFuY2U7CisJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKKwlpbnQgZXJyOworCisJYWR2X2luc3RhbmNlID0gaGNpX2ZpbmRfYWR2X2luc3RhbmNlKGhkZXYsIGhkZXYtPmN1cl9hZHZfaW5zdGFuY2UpOworCWlmICghYWR2X2luc3RhbmNlKQorCQlyZXR1cm47CisKKwkvKiBzdG9wIGlmIGN1cnJlbnQgaW5zdGFuY2UgZG9lc24ndCBuZWVkIHRvIGJlIGNoYW5nZWQgKi8KKwlpZiAoIShhZHZfaW5zdGFuY2UtPmZsYWdzICYgZmxhZ3MpKQorCQlyZXR1cm47CisKKwljYW5jZWxfYWR2X3RpbWVvdXQoaGRldik7CisKKwlhZHZfaW5zdGFuY2UgPSBoY2lfZ2V0X25leHRfaW5zdGFuY2UoaGRldiwgYWR2X2luc3RhbmNlLT5pbnN0YW5jZSk7CisJaWYgKCFhZHZfaW5zdGFuY2UpCisJCXJldHVybjsKKworCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKKwllcnIgPSBfX2hjaV9yZXFfc2NoZWR1bGVfYWR2X2luc3RhbmNlKCZyZXEsIGFkdl9pbnN0YW5jZS0+aW5zdGFuY2UsCisJCQkJCSAgICAgIHRydWUpOworCWlmIChlcnIpCisJCXJldHVybjsKKworCWhjaV9yZXFfcnVuKCZyZXEsIE5VTEwpOworfQorCiBzdGF0aWMgdm9pZCBzZXRfbmFtZV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzLCB1MTYgb3Bjb2RlKQogewogCXN0cnVjdCBtZ210X2NwX3NldF9sb2NhbF9uYW1lICpjcDsKQEAgLTI5NDcsMTMgKzMwODQsMTcgQEAKIAogCWNwID0gY21kLT5wYXJhbTsKIAotCWlmIChzdGF0dXMpCisJaWYgKHN0YXR1cykgewogCQltZ210X2NtZF9zdGF0dXMoY21kLT5zaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsCiAJCQkgICAgICAgIG1nbXRfc3RhdHVzKHN0YXR1cykpOwotCWVsc2UKKwl9IGVsc2UgewogCQltZ210X2NtZF9jb21wbGV0ZShjbWQtPnNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTE9DQUxfTkFNRSwgMCwKIAkJCQkgIGNwLCBzaXplb2YoKmNwKSk7CiAKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9BRFYpKQorCQkJYWR2X2V4cGlyZShoZGV2LCBNR01UX0FEVl9GTEFHX0xPQ0FMX05BTUUpOworCX0KKwogCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIAogdW5sb2NrOgpAQCAtMjk5Myw4ICszMTM0LDkgQEAKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIGZhaWxlZDsKIAotCQllcnIgPSBtZ210X2dlbmVyaWNfZXZlbnQoTUdNVF9FVl9MT0NBTF9OQU1FX0NIQU5HRUQsIGhkZXYsCi0JCQkJCSBkYXRhLCBsZW4sIHNrKTsKKwkJZXJyID0gbWdtdF9saW1pdGVkX2V2ZW50KE1HTVRfRVZfTE9DQUxfTkFNRV9DSEFOR0VELCBoZGV2LCBkYXRhLAorCQkJCQkgbGVuLCBIQ0lfTUdNVF9MT0NBTF9OQU1FX0VWRU5UUywgc2spOworCQlleHRfaW5mb19jaGFuZ2VkKGhkZXYsIHNrKTsKIAogCQlnb3RvIGZhaWxlZDsKIAl9CkBAIC0zMDE3LDcgKzMxNTksNyBAQAogCS8qIFRoZSBuYW1lIGlzIHN0b3JlZCBpbiB0aGUgc2NhbiByZXNwb25zZSBkYXRhIGFuZCBzbwogCSAqIG5vIG5lZWQgdG8gdWRwYXRlIHRoZSBhZHZlcnRpc2luZyBkYXRhIGhlcmUuCiAJICovCi0JaWYgKGxtcF9sZV9jYXBhYmxlKGhkZXYpKQorCWlmIChsbXBfbGVfY2FwYWJsZShoZGV2KSAmJiBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkcpKQogCQlfX2hjaV9yZXFfdXBkYXRlX3NjYW5fcnNwX2RhdGEoJnJlcSwgaGRldi0+Y3VyX2Fkdl9pbnN0YW5jZSk7CiAKIAllcnIgPSBoY2lfcmVxX3J1bigmcmVxLCBzZXRfbmFtZV9jb21wbGV0ZSk7CkBAIC0zMDI5LDYgKzMxNzEsNDAgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IHNldF9hcHBlYXJhbmNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKmRhdGEsCisJCQkgIHUxNiBsZW4pCit7CisJc3RydWN0IG1nbXRfY3Bfc2V0X2FwcGVhcmFuY2UgKmNwID0gZGF0YTsKKwl1MTYgYXBwZXJhbmNlOworCWludCBlcnI7CisKKwlCVF9EQkcoIiIpOworCisJaWYgKCFsbXBfbGVfY2FwYWJsZShoZGV2KSkKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0FQUEVBUkFOQ0UsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOworCisJYXBwZXJhbmNlID0gbGUxNl90b19jcHUoY3AtPmFwcGVhcmFuY2UpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJaWYgKGhkZXYtPmFwcGVhcmFuY2UgIT0gYXBwZXJhbmNlKSB7CisJCWhkZXYtPmFwcGVhcmFuY2UgPSBhcHBlcmFuY2U7CisKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9BRFYpKQorCQkJYWR2X2V4cGlyZShoZGV2LCBNR01UX0FEVl9GTEFHX0FQUEVBUkFOQ0UpOworCisJCWV4dF9pbmZvX2NoYW5nZWQoaGRldiwgc2spOworCX0KKworCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfQVBQRUFSQU5DRSwgMCwgTlVMTCwKKwkJCQkwKTsKKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIHZvaWQgcmVhZF9sb2NhbF9vb2JfZGF0YV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzLAogCQkJCSAgICAgICAgIHUxNiBvcGNvZGUsIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC00ODY5LDcgKzUwNDUsNyBAQAogCWludCBlcnI7CiAKIAltZW1zZXQoJnJwLCAwLCBzaXplb2YocnApKTsKLQltZW1jcHkoJnJwLmFkZHIsICZjbWQtPnBhcmFtLCBzaXplb2YocnAuYWRkcikpOworCW1lbWNweSgmcnAuYWRkciwgY21kLT5wYXJhbSwgc2l6ZW9mKHJwLmFkZHIpKTsKIAogCWlmIChzdGF0dXMpCiAJCWdvdG8gY29tcGxldGU7CkBAIC01NTAxLDE3ICs1Njc3LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIHUxNiBlaXJfYXBwZW5kX2RhdGEodTggKmVpciwgdTE2IGVpcl9sZW4sIHU4IHR5cGUsIHU4ICpkYXRhLAotCQkJCSAgdTggZGF0YV9sZW4pCi17Ci0JZWlyW2Vpcl9sZW4rK10gPSBzaXplb2YodHlwZSkgKyBkYXRhX2xlbjsKLQllaXJbZWlyX2xlbisrXSA9IHR5cGU7Ci0JbWVtY3B5KCZlaXJbZWlyX2xlbl0sIGRhdGEsIGRhdGFfbGVuKTsKLQllaXJfbGVuICs9IGRhdGFfbGVuOwotCi0JcmV0dXJuIGVpcl9sZW47Ci19Ci0KIHN0YXRpYyB2b2lkIHJlYWRfbG9jYWxfb29iX2V4dF9kYXRhX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMsCiAJCQkJCSAgICAgdTE2IG9wY29kZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTU4MTUsNiArNTk4MCw4IEBACiAJZmxhZ3MgfD0gTUdNVF9BRFZfRkxBR19ESVNDT1Y7CiAJZmxhZ3MgfD0gTUdNVF9BRFZfRkxBR19MSU1JVEVEX0RJU0NPVjsKIAlmbGFncyB8PSBNR01UX0FEVl9GTEFHX01BTkFHRURfRkxBR1M7CisJZmxhZ3MgfD0gTUdNVF9BRFZfRkxBR19BUFBFQVJBTkNFOworCWZsYWdzIHw9IE1HTVRfQURWX0ZMQUdfTE9DQUxfTkFNRTsKIAogCWlmIChoZGV2LT5hZHZfdHhfcG93ZXIgIT0gSENJX1RYX1BPV0VSX0lOVkFMSUQpCiAJCWZsYWdzIHw9IE1HTVRfQURWX0ZMQUdfVFhfUE9XRVI7CkBAIC01ODcxLDI4ICs2MDM4LDU5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGJvb2wgdGx2X2RhdGFfaXNfdmFsaWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHUzMiBhZHZfZmxhZ3MsIHU4ICpkYXRhLAotCQkJICAgICAgdTggbGVuLCBib29sIGlzX2Fkdl9kYXRhKQorc3RhdGljIHU4IHRsdl9kYXRhX21heF9sZW4odTMyIGFkdl9mbGFncywgYm9vbCBpc19hZHZfZGF0YSkKIHsKIAl1OCBtYXhfbGVuID0gSENJX01BWF9BRF9MRU5HVEg7Ci0JaW50IGksIGN1cl9sZW47Ci0JYm9vbCBmbGFnc19tYW5hZ2VkID0gZmFsc2U7Ci0JYm9vbCB0eF9wb3dlcl9tYW5hZ2VkID0gZmFsc2U7CiAKIAlpZiAoaXNfYWR2X2RhdGEpIHsKIAkJaWYgKGFkdl9mbGFncyAmIChNR01UX0FEVl9GTEFHX0RJU0NPViB8CiAJCQkJIE1HTVRfQURWX0ZMQUdfTElNSVRFRF9ESVNDT1YgfAotCQkJCSBNR01UX0FEVl9GTEFHX01BTkFHRURfRkxBR1MpKSB7Ci0JCQlmbGFnc19tYW5hZ2VkID0gdHJ1ZTsKKwkJCQkgTUdNVF9BRFZfRkxBR19NQU5BR0VEX0ZMQUdTKSkKIAkJCW1heF9sZW4gLT0gMzsKLQkJfQogCi0JCWlmIChhZHZfZmxhZ3MgJiBNR01UX0FEVl9GTEFHX1RYX1BPV0VSKSB7Ci0JCQl0eF9wb3dlcl9tYW5hZ2VkID0gdHJ1ZTsKKwkJaWYgKGFkdl9mbGFncyAmIE1HTVRfQURWX0ZMQUdfVFhfUE9XRVIpCiAJCQltYXhfbGVuIC09IDM7Ci0JCX0KKwl9IGVsc2UgeworCQkvKiBhdCBsZWFzdCAxIGJ5dGUgb2YgbmFtZSBzaG91bGQgZml0IGluICovCisJCWlmIChhZHZfZmxhZ3MgJiBNR01UX0FEVl9GTEFHX0xPQ0FMX05BTUUpCisJCQltYXhfbGVuIC09IDM7CisKKwkJaWYgKGFkdl9mbGFncyAmIChNR01UX0FEVl9GTEFHX0FQUEVBUkFOQ0UpKQorCQkJbWF4X2xlbiAtPSA0OwogCX0KIAorCXJldHVybiBtYXhfbGVuOworfQorCitzdGF0aWMgYm9vbCBmbGFnc19tYW5hZ2VkKHUzMiBhZHZfZmxhZ3MpCit7CisJcmV0dXJuIGFkdl9mbGFncyAmIChNR01UX0FEVl9GTEFHX0RJU0NPViB8CisJCQkgICAgTUdNVF9BRFZfRkxBR19MSU1JVEVEX0RJU0NPViB8CisJCQkgICAgTUdNVF9BRFZfRkxBR19NQU5BR0VEX0ZMQUdTKTsKK30KKworc3RhdGljIGJvb2wgdHhfcG93ZXJfbWFuYWdlZCh1MzIgYWR2X2ZsYWdzKQoreworCXJldHVybiBhZHZfZmxhZ3MgJiBNR01UX0FEVl9GTEFHX1RYX1BPV0VSOworfQorCitzdGF0aWMgYm9vbCBuYW1lX21hbmFnZWQodTMyIGFkdl9mbGFncykKK3sKKwlyZXR1cm4gYWR2X2ZsYWdzICYgTUdNVF9BRFZfRkxBR19MT0NBTF9OQU1FOworfQorCitzdGF0aWMgYm9vbCBhcHBlYXJhbmNlX21hbmFnZWQodTMyIGFkdl9mbGFncykKK3sKKwlyZXR1cm4gYWR2X2ZsYWdzICYgTUdNVF9BRFZfRkxBR19BUFBFQVJBTkNFOworfQorCitzdGF0aWMgYm9vbCB0bHZfZGF0YV9pc192YWxpZCh1MzIgYWR2X2ZsYWdzLCB1OCAqZGF0YSwgdTggbGVuLCBib29sIGlzX2Fkdl9kYXRhKQoreworCWludCBpLCBjdXJfbGVuOworCXU4IG1heF9sZW47CisKKwltYXhfbGVuID0gdGx2X2RhdGFfbWF4X2xlbihhZHZfZmxhZ3MsIGlzX2Fkdl9kYXRhKTsKKwogCWlmIChsZW4gPiBtYXhfbGVuKQogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTU5MDAsMTAgKzYwOTgsMjEgQEAKIAlmb3IgKGkgPSAwLCBjdXJfbGVuID0gMDsgaSA8IGxlbjsgaSArPSAoY3VyX2xlbiArIDEpKSB7CiAJCWN1cl9sZW4gPSBkYXRhW2ldOwogCi0JCWlmIChmbGFnc19tYW5hZ2VkICYmIGRhdGFbaSArIDFdID09IEVJUl9GTEFHUykKKwkJaWYgKGRhdGFbaSArIDFdID09IEVJUl9GTEFHUyAmJgorCQkgICAgKCFpc19hZHZfZGF0YSB8fCBmbGFnc19tYW5hZ2VkKGFkdl9mbGFncykpKQogCQkJcmV0dXJuIGZhbHNlOwogCi0JCWlmICh0eF9wb3dlcl9tYW5hZ2VkICYmIGRhdGFbaSArIDFdID09IEVJUl9UWF9QT1dFUikKKwkJaWYgKGRhdGFbaSArIDFdID09IEVJUl9UWF9QT1dFUiAmJiB0eF9wb3dlcl9tYW5hZ2VkKGFkdl9mbGFncykpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJaWYgKGRhdGFbaSArIDFdID09IEVJUl9OQU1FX0NPTVBMRVRFICYmIG5hbWVfbWFuYWdlZChhZHZfZmxhZ3MpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmIChkYXRhW2kgKyAxXSA9PSBFSVJfTkFNRV9TSE9SVCAmJiBuYW1lX21hbmFnZWQoYWR2X2ZsYWdzKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAoZGF0YVtpICsgMV0gPT0gRUlSX0FQUEVBUkFOQ0UgJiYKKwkJICAgIGFwcGVhcmFuY2VfbWFuYWdlZChhZHZfZmxhZ3MpKQogCQkJcmV0dXJuIGZhbHNlOwogCiAJCS8qIElmIHRoZSBjdXJyZW50IGZpZWxkIGxlbmd0aCB3b3VsZCBleGNlZWQgdGhlIHRvdGFsIGRhdGEKQEAgLTYwMjcsOCArNjIzNiw4IEBACiAJCWdvdG8gdW5sb2NrOwogCX0KIAotCWlmICghdGx2X2RhdGFfaXNfdmFsaWQoaGRldiwgZmxhZ3MsIGNwLT5kYXRhLCBjcC0+YWR2X2RhdGFfbGVuLCB0cnVlKSB8fAotCSAgICAhdGx2X2RhdGFfaXNfdmFsaWQoaGRldiwgZmxhZ3MsIGNwLT5kYXRhICsgY3AtPmFkdl9kYXRhX2xlbiwKKwlpZiAoIXRsdl9kYXRhX2lzX3ZhbGlkKGZsYWdzLCBjcC0+ZGF0YSwgY3AtPmFkdl9kYXRhX2xlbiwgdHJ1ZSkgfHwKKwkgICAgIXRsdl9kYXRhX2lzX3ZhbGlkKGZsYWdzLCBjcC0+ZGF0YSArIGNwLT5hZHZfZGF0YV9sZW4sCiAJCQkgICAgICAgY3AtPnNjYW5fcnNwX2xlbiwgZmFsc2UpKSB7CiAJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfQUREX0FEVkVSVElTSU5HLAogCQkJCSAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKQEAgLTYxNzUsNyArNjM4NCw3IEBACiAKIAloY2lfcmVxX2luaXQoJnJlcSwgaGRldik7CiAKLQloY2lfcmVxX2NsZWFyX2Fkdl9pbnN0YW5jZShoZGV2LCAmcmVxLCBjcC0+aW5zdGFuY2UsIHRydWUpOworCWhjaV9yZXFfY2xlYXJfYWR2X2luc3RhbmNlKGhkZXYsIHNrLCAmcmVxLCBjcC0+aW5zdGFuY2UsIHRydWUpOwogCiAJaWYgKGxpc3RfZW1wdHkoJmhkZXYtPmFkdl9pbnN0YW5jZXMpKQogCQlfX2hjaV9yZXFfZGlzYWJsZV9hZHZlcnRpc2luZygmcmVxKTsKQEAgLTYyMTEsMjMgKzY0MjAsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB1OCB0bHZfZGF0YV9tYXhfbGVuKHUzMiBhZHZfZmxhZ3MsIGJvb2wgaXNfYWR2X2RhdGEpCi17Ci0JdTggbWF4X2xlbiA9IEhDSV9NQVhfQURfTEVOR1RIOwotCi0JaWYgKGlzX2Fkdl9kYXRhKSB7Ci0JCWlmIChhZHZfZmxhZ3MgJiAoTUdNVF9BRFZfRkxBR19ESVNDT1YgfAotCQkJCSBNR01UX0FEVl9GTEFHX0xJTUlURURfRElTQ09WIHwKLQkJCQkgTUdNVF9BRFZfRkxBR19NQU5BR0VEX0ZMQUdTKSkKLQkJCW1heF9sZW4gLT0gMzsKLQotCQlpZiAoYWR2X2ZsYWdzICYgTUdNVF9BRFZfRkxBR19UWF9QT1dFUikKLQkJCW1heF9sZW4gLT0gMzsKLQl9Ci0KLQlyZXR1cm4gbWF4X2xlbjsKLX0KLQogc3RhdGljIGludCBnZXRfYWR2X3NpemVfaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LAogCQkJICAgICB2b2lkICpkYXRhLCB1MTYgZGF0YV9sZW4pCiB7CkBAIC02MzU2LDYgKzY1NDgsOSBAQAogCXsgcmVtb3ZlX2FkdmVydGlzaW5nLAkgICBNR01UX1JFTU9WRV9BRFZFUlRJU0lOR19TSVpFIH0sCiAJeyBnZXRfYWR2X3NpemVfaW5mbywgICAgICAgTUdNVF9HRVRfQURWX1NJWkVfSU5GT19TSVpFIH0sCiAJeyBzdGFydF9saW1pdGVkX2Rpc2NvdmVyeSwgTUdNVF9TVEFSVF9ESVNDT1ZFUllfU0laRSB9LAorCXsgcmVhZF9leHRfY29udHJvbGxlcl9pbmZvLE1HTVRfUkVBRF9FWFRfSU5GT19TSVpFLAorCQkJCQkJSENJX01HTVRfVU5UUlVTVEVEIH0sCisJeyBzZXRfYXBwZWFyYW5jZSwJICAgTUdNVF9TRVRfQVBQRUFSQU5DRV9TSVpFIH0sCiB9OwogCiB2b2lkIG1nbXRfaW5kZXhfYWRkZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYpCkBAIC02NDk0LDkgKzY2ODksMTIgQEAKIAogCW1nbXRfcGVuZGluZ19mb3JlYWNoKDAsIGhkZXYsIGNtZF9jb21wbGV0ZV9yc3AsICZzdGF0dXMpOwogCi0JaWYgKG1lbWNtcChoZGV2LT5kZXZfY2xhc3MsIHplcm9fY29kLCBzaXplb2YoemVyb19jb2QpKSAhPSAwKQotCQltZ210X2dlbmVyaWNfZXZlbnQoTUdNVF9FVl9DTEFTU19PRl9ERVZfQ0hBTkdFRCwgaGRldiwKLQkJCQkgICB6ZXJvX2NvZCwgc2l6ZW9mKHplcm9fY29kKSwgTlVMTCk7CisJaWYgKG1lbWNtcChoZGV2LT5kZXZfY2xhc3MsIHplcm9fY29kLCBzaXplb2YoemVyb19jb2QpKSAhPSAwKSB7CisJCW1nbXRfbGltaXRlZF9ldmVudChNR01UX0VWX0NMQVNTX09GX0RFVl9DSEFOR0VELCBoZGV2LAorCQkJCSAgIHplcm9fY29kLCBzaXplb2YoemVyb19jb2QpLAorCQkJCSAgIEhDSV9NR01UX0RFVl9DTEFTU19FVkVOVFMsIE5VTEwpOworCQlleHRfaW5mb19jaGFuZ2VkKGhkZXYsIE5VTEwpOworCX0KIAogCW5ld19zZXR0aW5ncyhoZGV2LCBtYXRjaC5zayk7CiAKQEAgLTcwOTIsOSArNzI5MCwxMSBAQAogCW1nbXRfcGVuZGluZ19mb3JlYWNoKE1HTVRfT1BfQUREX1VVSUQsIGhkZXYsIHNrX2xvb2t1cCwgJm1hdGNoKTsKIAltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX1JFTU9WRV9VVUlELCBoZGV2LCBza19sb29rdXAsICZtYXRjaCk7CiAKLQlpZiAoIXN0YXR1cykKLQkJbWdtdF9nZW5lcmljX2V2ZW50KE1HTVRfRVZfQ0xBU1NfT0ZfREVWX0NIQU5HRUQsIGhkZXYsCi0JCQkJICAgZGV2X2NsYXNzLCAzLCBOVUxMKTsKKwlpZiAoIXN0YXR1cykgeworCQltZ210X2xpbWl0ZWRfZXZlbnQoTUdNVF9FVl9DTEFTU19PRl9ERVZfQ0hBTkdFRCwgaGRldiwgZGV2X2NsYXNzLAorCQkJCSAgIDMsIEhDSV9NR01UX0RFVl9DTEFTU19FVkVOVFMsIE5VTEwpOworCQlleHRfaW5mb19jaGFuZ2VkKGhkZXYsIE5VTEwpOworCX0KIAogCWlmIChtYXRjaC5zaykKIAkJc29ja19wdXQobWF0Y2guc2spOwpAQCAtNzEyMyw4ICs3MzIzLDkgQEAKIAkJCXJldHVybjsKIAl9CiAKLQltZ210X2dlbmVyaWNfZXZlbnQoTUdNVF9FVl9MT0NBTF9OQU1FX0NIQU5HRUQsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwKLQkJCSAgIGNtZCA/IGNtZC0+c2sgOiBOVUxMKTsKKwltZ210X2xpbWl0ZWRfZXZlbnQoTUdNVF9FVl9MT0NBTF9OQU1FX0NIQU5HRUQsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwKKwkJCSAgIEhDSV9NR01UX0xPQ0FMX05BTUVfRVZFTlRTLCBjbWQgPyBjbWQtPnNrIDogTlVMTCk7CisJZXh0X2luZm9fY2hhbmdlZChoZGV2LCBjbWQgPyBjbWQtPnNrIDogTlVMTCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBoYXNfdXVpZCh1OCAqdXVpZCwgdTE2IHV1aWRfY291bnQsIHU4ICgqdXVpZHMpWzE2XSkKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbWdtdF91dGlsLmMgYi9uZXQvYmx1ZXRvb3RoL21nbXRfdXRpbC5jCmluZGV4IDhjMzBjN2UuLmM5MzNiZDAgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvbWdtdF91dGlsLmMKKysrIGIvbmV0L2JsdWV0b290aC9tZ210X3V0aWwuYwpAQCAtMjEsMTIgKzIxLDQxIEBACiAgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgogKi8KIAorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKwogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX21vbi5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvbWdtdC5oPgogCiAjaW5jbHVkZSAibWdtdF91dGlsLmgiCiAKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqY3JlYXRlX21vbml0b3JfY3RybF9ldmVudChfX2xlMTYgaW5kZXgsIHUzMiBjb29raWUsCisJCQkJCQkgdTE2IG9wY29kZSwgdTE2IGxlbiwgdm9pZCAqYnVmKQoreworCXN0cnVjdCBoY2lfbW9uX2hkciAqaGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBidF9za2JfYWxsb2MoNiArIGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJcHV0X3VuYWxpZ25lZF9sZTMyKGNvb2tpZSwgc2tiX3B1dChza2IsIDQpKTsKKwlwdXRfdW5hbGlnbmVkX2xlMTYob3Bjb2RlLCBza2JfcHV0KHNrYiwgMikpOworCisJaWYgKGJ1ZikKKwkJbWVtY3B5KHNrYl9wdXQoc2tiLCBsZW4pLCBidWYsIGxlbik7CisKKwlfX25ldF90aW1lc3RhbXAoc2tiKTsKKworCWhkciA9ICh2b2lkICopc2tiX3B1c2goc2tiLCBIQ0lfTU9OX0hEUl9TSVpFKTsKKwloZHItPm9wY29kZSA9IGNwdV90b19sZTE2KEhDSV9NT05fQ1RSTF9FVkVOVCk7CisJaGRyLT5pbmRleCA9IGluZGV4OworCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoc2tiLT5sZW4gLSBIQ0lfTU9OX0hEUl9TSVpFKTsKKworCXJldHVybiBza2I7Cit9CisKIGludCBtZ210X3NlbmRfZXZlbnQodTE2IGV2ZW50LCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgc2hvcnQgY2hhbm5lbCwKIAkJICAgIHZvaWQgKmRhdGEsIHUxNiBkYXRhX2xlbiwgaW50IGZsYWcsIHN0cnVjdCBzb2NrICpza2lwX3NrKQogewpAQCAtNTIsMTQgKzgxLDE4IEBACiAJX19uZXRfdGltZXN0YW1wKHNrYik7CiAKIAloY2lfc2VuZF90b19jaGFubmVsKGNoYW5uZWwsIHNrYiwgZmxhZywgc2tpcF9zayk7Ci0Ja2ZyZWVfc2tiKHNrYik7CiAKKwlpZiAoY2hhbm5lbCA9PSBIQ0lfQ0hBTk5FTF9DT05UUk9MKQorCQloY2lfc2VuZF9tb25pdG9yX2N0cmxfZXZlbnQoaGRldiwgZXZlbnQsIGRhdGEsIGRhdGFfbGVuLAorCQkJCQkgICAgc2tiX2dldF9rdGltZShza2IpLCBmbGFnLCBza2lwX3NrKTsKKworCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAwOwogfQogCiBpbnQgbWdtdF9jbWRfc3RhdHVzKHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB1MTYgY21kLCB1OCBzdGF0dXMpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbXNrYjsKIAlzdHJ1Y3QgbWdtdF9oZHIgKmhkcjsKIAlzdHJ1Y3QgbWdtdF9ldl9jbWRfc3RhdHVzICpldjsKIAlpbnQgZXJyOwpAQCAtODAsMTcgKzExMywzMCBAQAogCWV2LT5zdGF0dXMgPSBzdGF0dXM7CiAJZXYtPm9wY29kZSA9IGNwdV90b19sZTE2KGNtZCk7CiAKKwltc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9ldmVudChoZHItPmluZGV4LCBoY2lfc29ja19nZXRfY29va2llKHNrKSwKKwkJCQkJIE1HTVRfRVZfQ01EX1NUQVRVUywgc2l6ZW9mKCpldiksIGV2KTsKKwlpZiAobXNrYikKKwkJc2tiLT50c3RhbXAgPSBtc2tiLT50c3RhbXA7CisJZWxzZQorCQlfX25ldF90aW1lc3RhbXAoc2tiKTsKKwogCWVyciA9IHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKIAlpZiAoZXJyIDwgMCkKIAkJa2ZyZWVfc2tiKHNrYik7CiAKKwlpZiAobXNrYikgeworCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIG1za2IsCisJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQlrZnJlZV9za2IobXNrYik7CisJfQorCiAJcmV0dXJuIGVycjsKIH0KIAogaW50IG1nbXRfY21kX2NvbXBsZXRlKHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB1MTYgY21kLCB1OCBzdGF0dXMsCiAJCSAgICAgIHZvaWQgKnJwLCBzaXplX3QgcnBfbGVuKQogewotCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm1za2I7CiAJc3RydWN0IG1nbXRfaGRyICpoZHI7CiAJc3RydWN0IG1nbXRfZXZfY21kX2NvbXBsZXRlICpldjsKIAlpbnQgZXJyOwpAQCAtMTE0LDEwICsxNjAsMjQgQEAKIAlpZiAocnApCiAJCW1lbWNweShldi0+ZGF0YSwgcnAsIHJwX2xlbik7CiAKKwltc2tiID0gY3JlYXRlX21vbml0b3JfY3RybF9ldmVudChoZHItPmluZGV4LCBoY2lfc29ja19nZXRfY29va2llKHNrKSwKKwkJCQkJIE1HTVRfRVZfQ01EX0NPTVBMRVRFLAorCQkJCQkgc2l6ZW9mKCpldikgKyBycF9sZW4sIGV2KTsKKwlpZiAobXNrYikKKwkJc2tiLT50c3RhbXAgPSBtc2tiLT50c3RhbXA7CisJZWxzZQorCQlfX25ldF90aW1lc3RhbXAoc2tiKTsKKwogCWVyciA9IHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKIAlpZiAoZXJyIDwgMCkKIAkJa2ZyZWVfc2tiKHNrYik7CiAKKwlpZiAobXNrYikgeworCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIG1za2IsCisJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOworCQlrZnJlZV9za2IobXNrYik7CisJfQorCiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9zbXAuYyBiL25ldC9ibHVldG9vdGgvc21wLmMKaW5kZXggNGMxYTE2YS4uNDNmYWYyYSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9zbXAuYworKysgYi9uZXQvYmx1ZXRvb3RoL3NtcC5jCkBAIC0zMzg3LDcgKzMzODcsMTAgQEAKIAlpZiAoIWxtcF9zY19jYXBhYmxlKGhkZXYpKSB7CiAJCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImZvcmNlX2JyZWRyX3NtcCIsIDA2NDQsIGhkZXYtPmRlYnVnZnMsCiAJCQkJICAgIGhkZXYsICZmb3JjZV9icmVkcl9zbXBfZm9wcyk7Ci0JCXJldHVybiAwOworCisJCS8qIEZsYWcgY2FuIGJlIGFscmVhZHkgc2V0IGhlcmUgKGR1ZSB0byBwb3dlciB0b2dnbGUpICovCisJCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0ZPUkNFX0JSRURSX1NNUCkpCisJCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoV0FSTl9PTihoZGV2LT5zbXBfYnJlZHJfZGF0YSkpIHsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvTWFrZWZpbGUgYi9uZXQvYnJpZGdlL01ha2VmaWxlCmluZGV4IGExY2RhNWQuLjBhZWZjMDEgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvTWFrZWZpbGUKKysrIGIvbmV0L2JyaWRnZS9NYWtlZmlsZQpAQCAtMjAsNCArMjAsNiBAQAogCiBicmlkZ2UtJChDT05GSUdfQlJJREdFX1ZMQU5fRklMVEVSSU5HKSArPSBicl92bGFuLm8KIAorYnJpZGdlLSQoQ09ORklHX05FVF9TV0lUQ0hERVYpICs9IGJyX3N3aXRjaGRldi5vCisKIG9iai0kKENPTkZJR19ORVRGSUxURVIpICs9IG5ldGZpbHRlci8KZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnIuYyBiL25ldC9icmlkZ2UvYnIuYwppbmRleCAzYWRkYzA1Li44ODllNTY0IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyLmMKKysrIGIvbmV0L2JyaWRnZS9ici5jCkBAIC0yMjcsOSArMjI3LDExIEBACiAJYnJfZmRiX3Rlc3RfYWRkcl9ob29rID0gYnJfZmRiX3Rlc3RfYWRkcjsKICNlbmRpZgogCi0JcHJfaW5mbygiYnJpZGdlOiBhdXRvbWF0aWMgZmlsdGVyaW5nIHZpYSBhcnAvaXAvaXA2dGFibGVzIGhhcyBiZWVuICIKLQkJImRlcHJlY2F0ZWQuIFVwZGF0ZSB5b3VyIHNjcmlwdHMgdG8gbG9hZCBicl9uZXRmaWx0ZXIgaWYgeW91ICIKKyNpZiBJU19NT0RVTEUoQ09ORklHX0JSSURHRV9ORVRGSUxURVIpCisJcHJfaW5mbygiYnJpZGdlOiBmaWx0ZXJpbmcgdmlhIGFycC9pcC9pcDZ0YWJsZXMgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSAiCisJCSJieSBkZWZhdWx0LiBVcGRhdGUgeW91ciBzY3JpcHRzIHRvIGxvYWQgYnJfbmV0ZmlsdGVyIGlmIHlvdSAiCiAJCSJuZWVkIHRoaXMuXG4iKTsKKyNlbmRpZgogCiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCmluZGV4IDA5ZjI2OTQuLjg5YTY4N2YgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKKysrIGIvbmV0L2JyaWRnZS9icl9kZXZpY2UuYwpAQCAtNjIsMTAgKzYyLDEwIEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7Ci0JCWJyX2Zsb29kKGJyLCBza2IsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJCWJyX2Zsb29kKGJyLCBza2IsIEJSX1BLVF9CUk9BRENBU1QsIGZhbHNlLCB0cnVlKTsKIAl9IGVsc2UgaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRlc3QpKSB7CiAJCWlmICh1bmxpa2VseShuZXRwb2xsX3R4X3J1bm5pbmcoZGV2KSkpIHsKLQkJCWJyX2Zsb29kKGJyLCBza2IsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisJCQlicl9mbG9vZChiciwgc2tiLCBCUl9QS1RfTVVMVElDQVNULCBmYWxzZSwgdHJ1ZSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCQlpZiAoYnJfbXVsdGljYXN0X3JjdihiciwgTlVMTCwgc2tiLCB2aWQpKSB7CkBAIC03OCwxMSArNzgsMTEgQEAKIAkJICAgIGJyX211bHRpY2FzdF9xdWVyaWVyX2V4aXN0cyhiciwgZXRoX2hkcihza2IpKSkKIAkJCWJyX211bHRpY2FzdF9mbG9vZChtZHN0LCBza2IsIGZhbHNlLCB0cnVlKTsKIAkJZWxzZQotCQkJYnJfZmxvb2QoYnIsIHNrYiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKwkJCWJyX2Zsb29kKGJyLCBza2IsIEJSX1BLVF9NVUxUSUNBU1QsIGZhbHNlLCB0cnVlKTsKIAl9IGVsc2UgaWYgKChkc3QgPSBfX2JyX2ZkYl9nZXQoYnIsIGRlc3QsIHZpZCkpICE9IE5VTEwpIHsKIAkJYnJfZm9yd2FyZChkc3QtPmRzdCwgc2tiLCBmYWxzZSwgdHJ1ZSk7CiAJfSBlbHNlIHsKLQkJYnJfZmxvb2QoYnIsIHNrYiwgdHJ1ZSwgZmFsc2UsIHRydWUpOworCQlicl9mbG9vZChiciwgc2tiLCBCUl9QS1RfVU5JQ0FTVCwgZmFsc2UsIHRydWUpOwogCX0KIG91dDoKIAlyY3VfcmVhZF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZmRiLmMgYi9uZXQvYnJpZGdlL2JyX2ZkYi5jCmluZGV4IGNkNjIwZmEuLjZiNDNjOGMgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZmRiLmMKKysrIGIvbmV0L2JyaWRnZS9icl9mZGIuYwpAQCAtNzEwLDI0ICs3MTAsMjcgQEAKIAkJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwKLQkJaW50IGlkeCkKKwkJaW50ICppZHgpCiB7CiAJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyID0gMDsKIAlpbnQgaTsKIAogCWlmICghKGRldi0+cHJpdl9mbGFncyAmIElGRl9FQlJJREdFKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoIWZpbHRlcl9kZXYpCi0JCWlkeCA9IG5kb19kZmx0X2ZkYl9kdW1wKHNrYiwgY2IsIGRldiwgTlVMTCwgaWR4KTsKKwlpZiAoIWZpbHRlcl9kZXYpIHsKKwkJZXJyID0gbmRvX2RmbHRfZmRiX2R1bXAoc2tiLCBjYiwgZGV2LCBOVUxMLCBpZHgpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0OworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBCUl9IQVNIX1NJWkU7IGkrKykgewogCQlzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmY7CiAKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGYsICZici0+aGFzaFtpXSwgaGxpc3QpIHsKLQkJCWludCBlcnI7CiAKLQkJCWlmIChpZHggPCBjYi0+YXJnc1swXSkKKwkJCWlmICgqaWR4IDwgY2ItPmFyZ3NbMl0pCiAJCQkJZ290byBza2lwOwogCiAJCQlpZiAoZmlsdGVyX2RldiAmJgpAQCAtNzUwLDE3ICs3NTMsMTUgQEAKIAkJCQkJICAgIGNiLT5ubGgtPm5sbXNnX3NlcSwKIAkJCQkJICAgIFJUTV9ORVdORUlHSCwKIAkJCQkJICAgIE5MTV9GX01VTFRJKTsKLQkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJY2ItPmFyZ3NbMV0gPSBlcnI7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlnb3RvIG91dDsKIHNraXA6Ci0JCQkrK2lkeDsKKwkJCSppZHggKz0gMTsKIAkJfQogCX0KIAogb3V0OgotCXJldHVybiBpZHg7CisJcmV0dXJuIGVycjsKIH0KIAogLyogVXBkYXRlIChjcmVhdGUgb3IgcmVwbGFjZSkgZm9yd2FyZGluZyBkYXRhYmFzZSBlbnRyeSAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMgYi9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYwppbmRleCA2M2E4M2Q4Li43Y2I0MWFlIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYworKysgYi9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYwpAQCAtMjksNyArMjksOCBAQAogCiAJdmcgPSBuYnBfdmxhbl9ncm91cF9yY3UocCk7CiAJcmV0dXJuICgocC0+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+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KQEAgLTM3LDYgKzM2LDMwIEBACiAJc2tiX3B1bGwobnNrYiwgRVRIX0hMRU4pOwogfQogCitzdGF0aWMgaW50IG5mdF9icmlkZ2VfaXBoZHJfdmFsaWRhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaXBoZHIgKmlwaDsKKwl1MzIgbGVuOworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpKQorCQlyZXR1cm4gMDsKKworCWlwaCA9IGlwX2hkcihza2IpOworCWlmIChpcGgtPmlobCA8IDUgfHwgaXBoLT52ZXJzaW9uICE9IDQpCisJCXJldHVybiAwOworCisJbGVuID0gbnRvaHMoaXBoLT50b3RfbGVuKTsKKwlpZiAoc2tiLT5sZW4gPCBsZW4pCisJCXJldHVybiAwOworCWVsc2UgaWYgKGxlbiA8IChpcGgtPmlobCo0KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBpcGgtPmlobCo0KSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKwogLyogV2UgY2Fubm90IHVzZSBvbGRza2ItPmRldiwgaXQgY2FuIGJlIGVpdGhlciBicmlkZ2UgZGV2aWNlIChORl9CUklER0UgSU5QVVQpCiAgKiBvciB0aGUgYnJpZGdlIHBvcnQgKE5GX0JSSURHRSBQUkVST1VUSU5HKS4KICAqLwpAQCAtMTQzLDYgKzE2NiwyNSBAQAogCWJyX2ZvcndhcmQoYnJfcG9ydF9nZXRfcmN1KGRldiksIG5za2IsIGZhbHNlLCB0cnVlKTsKIH0KIAorc3RhdGljIGludCBuZnRfYnJpZGdlX2lwNmhkcl92YWxpZGF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcHY2aGRyICpoZHI7CisJdTMyIHBrdF9sZW47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKKwkJcmV0dXJuIDA7CisKKwloZHIgPSBpcHY2X2hkcihza2IpOworCWlmIChoZHItPnZlcnNpb24gIT0gNikKKwkJcmV0dXJuIDA7CisKKwlwa3RfbGVuID0gbnRvaHMoaGRyLT5wYXlsb2FkX2xlbik7CisJaWYgKHBrdF9sZW4gKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpID4gc2tiLT5sZW4pCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyB2b2lkIG5mdF9yZWplY3RfYnJfc2VuZF92Nl90Y3BfcmVzZXQoc3RydWN0IG5ldCAqbmV0LAogCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKm9sZHNrYiwKIAkJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IGRkNmNlNTkuLmYxZmUyNmYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0zMzU1LDE2ICszMzU1LDYgQEAKIAllbHNlCiAJCXNrYl9kc3RfZm9yY2Uoc2tiKTsKIAotI2lmZGVmIENPTkZJR19ORVRfU1dJVENIREVWCi0JLyogRG9uJ3QgZm9yd2FyZCBpZiBvZmZsb2FkIGRldmljZSBhbHJlYWR5IGZvcndhcmRlZCAqLwotCWlmIChza2ItPm9mZmxvYWRfZndkX21hcmsgJiYKLQkgICAgc2tiLT5vZmZsb2FkX2Z3ZF9tYXJrID09IGRldi0+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+cmVmX25yKTsKIAogCWNhbGxfbmV0ZGV2aWNlX25vdGlmaWVyc19pbmZvKE5FVERFVl9DSEFOR0VVUFBFUiwgZGV2LAogCQkJCSAgICAgICZjaGFuZ2V1cHBlcl9pbmZvLmluZm8pOwpAQCAtNjcwNyw4ICs2NzQwLDggQEAKIAkJdW5saXN0X25ldGRldmljZShkZXYpOwogCiAJCWRldi0+cmVnX3N0YXRlID0gTkVUUkVHX1VOUkVHSVNURVJJTkc7Ci0JCW9uX2VhY2hfY3B1KGZsdXNoX2JhY2tsb2csIGRldiwgMSk7CiAJfQorCWZsdXNoX2FsbF9iYWNrbG9ncygpOwogCiAJc3luY2hyb25pemVfbmV0KCk7CiAKQEAgLTc2MjUsNiArNzY1OCw5IEBACiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+YWxsX2Fkal9saXN0Lmxvd2VyKTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5wdHlwZV9hbGwpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPnB0eXBlX3NwZWNpZmljKTsKKyNpZmRlZiBDT05GSUdfTkVUX1NDSEVECisJaGFzaF9pbml0KGRldi0+cWRpc2NfaGFzaCk7CisjZW5kaWYKIAlkZXYtPnByaXZfZmxhZ3MgPSBJRkZfWE1JVF9EU1RfUkVMRUFTRSB8IElGRl9YTUlUX0RTVF9SRUxFQVNFX1BFUk07CiAJc2V0dXAoZGV2KTsKIApAQCAtODI3MCw4ICs4MzA2LDExIEBACiAJICovCiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmZsdXNoID0gcGVyX2NwdV9wdHIoJmZsdXNoX3dvcmtzLCBpKTsKIAkJc3RydWN0IHNvZnRuZXRfZGF0YSAqc2QgPSAmcGVyX2NwdShzb2Z0bmV0X2RhdGEsIGkpOwogCisJCUlOSVRfV09SSyhmbHVzaCwgZmx1c2hfYmFja2xvZyk7CisKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2QtPmlucHV0X3BrdF9xdWV1ZSk7CiAJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnNkLT5wcm9jZXNzX3F1ZXVlKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnNkLT5wb2xsX2xpc3QpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMgYi9uZXQvY29yZS9kcm9wX21vbml0b3IuYwppbmRleCBkNmIzYjU3Li43MmNmYjBjIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kcm9wX21vbml0b3IuYworKysgYi9uZXQvY29yZS9kcm9wX21vbml0b3IuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJcmV0dXJuIHNrYjsKIH0KIAotc3RhdGljIHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBkcm9wbW9uX21jZ3Jwc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBkcm9wbW9uX21jZ3Jwc1tdID0gewogCXsgLm5hbWUgPSAiZXZlbnRzIiwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpbHRlci5jIGIvbmV0L2NvcmUvZmlsdGVyLmMKaW5kZXggY2IwNmFjZS4uMDAzNTFjZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmlsdGVyLmMKKysrIGIvbmV0L2NvcmUvZmlsdGVyLmMKQEAgLTk0LDE0ICs5NCwxMyBAQAogfQogRVhQT1JUX1NZTUJPTChza19maWx0ZXJfdHJpbV9jYXApOwogCi1zdGF0aWMgdTY0IF9fc2tiX2dldF9wYXlfb2Zmc2V0KHU2NCBjdHgsIHU2NCBhLCB1NjQgeCwgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8xKF9fc2tiX2dldF9wYXlfb2Zmc2V0LCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IpCiB7Ci0JcmV0dXJuIHNrYl9nZXRfcG9mZigoc3RydWN0IHNrX2J1ZmYgKikodW5zaWduZWQgbG9uZykgY3R4KTsKKwlyZXR1cm4gc2tiX2dldF9wb2ZmKHNrYik7CiB9CiAKLXN0YXRpYyB1NjQgX19za2JfZ2V0X25sYXR0cih1NjQgY3R4LCB1NjQgYSwgdTY0IHgsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMyhfX3NrYl9nZXRfbmxhdHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgYSwgdTMyLCB4KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikodW5zaWduZWQgbG9uZykgY3R4OwogCXN0cnVjdCBubGF0dHIgKm5sYTsKIAogCWlmIChza2JfaXNfbm9ubGluZWFyKHNrYikpCkBAIC0xMjAsOSArMTE5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU2NCBfX3NrYl9nZXRfbmxhdHRyX25lc3QodTY0IGN0eCwgdTY0IGEsIHU2NCB4LCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoX19za2JfZ2V0X25sYXR0cl9uZXN0LCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgYSwgdTMyLCB4KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikodW5zaWduZWQgbG9uZykgY3R4OwogCXN0cnVjdCBubGF0dHIgKm5sYTsKIAogCWlmIChza2JfaXNfbm9ubGluZWFyKHNrYikpCkBAIC0xNDUsNyArMTQzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU2NCBfX2dldF9yYXdfY3B1X2lkKHU2NCBjdHgsIHU2NCBhLCB1NjQgeCwgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8wKF9fZ2V0X3Jhd19jcHVfaWQpCiB7CiAJcmV0dXJuIHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiB9CkBAIC0yMzMsOSArMjMxLDggQEAKIAljYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfSEFUWVBFOgogCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBuZXRfZGV2aWNlLCBpZmluZGV4KSAhPSA0KTsKIAkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmV0X2RldmljZSwgdHlwZSkgIT0gMik7Ci0JCUJVSUxEX0JVR19PTihieXRlc190b19icGZfc2l6ZShGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRldikpIDwgMCk7CiAKLQkJKmluc24rKyA9IEJQRl9MRFhfTUVNKGJ5dGVzX3RvX2JwZl9zaXplKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSksCisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBkZXYpLAogCQkJCSAgICAgIEJQRl9SRUdfVE1QLCBCUEZfUkVHX0NUWCwKIAkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSk7CiAJCS8qIGlmICh0bXAgIT0gMCkgZ290byBwYyArIDEgKi8KQEAgLTEzNTAsMTcgKzEzNDcsMjYgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBicGZfc2NyYXRjaHBhZCwgYnBmX3NwKTsKIAorc3RhdGljIGlubGluZSBpbnQgX19icGZfdHJ5X21ha2Vfd3JpdGFibGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICB1bnNpZ25lZCBpbnQgd3JpdGVfbGVuKQoreworCXJldHVybiBza2JfZW5zdXJlX3dyaXRhYmxlKHNrYiwgd3JpdGVfbGVuKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgYnBmX3RyeV9tYWtlX3dyaXRhYmxlKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCXVuc2lnbmVkIGludCB3cml0ZV9sZW4pCiB7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gX19icGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCB3cml0ZV9sZW4pOwogCi0JZXJyID0gc2tiX2Vuc3VyZV93cml0YWJsZShza2IsIHdyaXRlX2xlbik7CiAJYnBmX2NvbXB1dGVfZGF0YV9lbmQoc2tiKTsKLQogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgYnBmX3RyeV9tYWtlX2hlYWRfd3JpdGFibGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gYnBmX3RyeV9tYWtlX3dyaXRhYmxlKHNrYiwgc2tiX2hlYWRsZW4oc2tiKSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBicGZfcHVzaF9tYWNfcmNzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpZiAoc2tiX2F0X3RjX2luZ3Jlc3Moc2tiKSkKQEAgLTEzNzMsMTIgKzEzNzksOSBAQAogCQlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBza2JfbWFjX2hlYWRlcihza2IpLCBza2ItPm1hY19sZW4pOwogfQogCi1zdGF0aWMgdTY0IGJwZl9za2Jfc3RvcmVfYnl0ZXModTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgZmxhZ3MpCitCUEZfQ0FMTF81KGJwZl9za2Jfc3RvcmVfYnl0ZXMsIHN0cnVjdCBza19idWZmICosIHNrYiwgdTMyLCBvZmZzZXQsCisJICAgY29uc3Qgdm9pZCAqLCBmcm9tLCB1MzIsIGxlbiwgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgcjI7Ci0Jdm9pZCAqZnJvbSA9ICh2b2lkICopIChsb25nKSByMzsKLQl1bnNpZ25lZCBpbnQgbGVuID0gKHVuc2lnbmVkIGludCkgcjQ7CiAJdm9pZCAqcHRyOwogCiAJaWYgKHVubGlrZWx5KGZsYWdzICYgfihCUEZfRl9SRUNPTVBVVEVfQ1NVTSB8IEJQRl9GX0lOVkFMSURBVEVfSEFTSCkpKQpAQCAtMTQxMywxMiArMTQxNiw5IEBACiAJLmFyZzVfdHlwZQk9IEFSR19BTllUSElORywKIH07CiAKLXN0YXRpYyB1NjQgYnBmX3NrYl9sb2FkX2J5dGVzKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfNChicGZfc2tiX2xvYWRfYnl0ZXMsIGNvbnN0IHN0cnVjdCBza19idWZmICosIHNrYiwgdTMyLCBvZmZzZXQsCisJICAgdm9pZCAqLCB0bywgdTMyLCBsZW4pCiB7Ci0JY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqKSh1bnNpZ25lZCBsb25nKSByMTsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gKHVuc2lnbmVkIGludCkgcjI7Ci0Jdm9pZCAqdG8gPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKSByMzsKLQl1bnNpZ25lZCBpbnQgbGVuID0gKHVuc2lnbmVkIGludCkgcjQ7CiAJdm9pZCAqcHRyOwogCiAJaWYgKHVubGlrZWx5KG9mZnNldCA+IDB4ZmZmZikpCkBAIC0xNDQ2LDEwICsxNDQ2LDMxIEBACiAJLmFyZzRfdHlwZQk9IEFSR19DT05TVF9TVEFDS19TSVpFLAogfTsKIAotc3RhdGljIHU2NCBicGZfbDNfY3N1bV9yZXBsYWNlKHU2NCByMSwgdTY0IHIyLCB1NjQgZnJvbSwgdTY0IHRvLCB1NjQgZmxhZ3MpCitCUEZfQ0FMTF8yKGJwZl9za2JfcHVsbF9kYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgbGVuKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGxvbmcpIHIxOwotCXVuc2lnbmVkIGludCBvZmZzZXQgPSAodW5zaWduZWQgaW50KSByMjsKKwkvKiBJZGVhIGlzIHRoZSBmb2xsb3dpbmc6IHNob3VsZCB0aGUgbmVlZGVkIGRpcmVjdCByZWFkL3dyaXRlCisJICogdGVzdCBmYWlsIGR1cmluZyBydW50aW1lLCB3ZSBjYW4gcHVsbCBpbiBtb3JlIGRhdGEgYW5kIHJlZG8KKwkgKiBhZ2Fpbiwgc2luY2UgaW1wbGljaXRseSwgd2UgaW52YWxpZGF0ZSBwcmV2aW91cyBjaGVja3MgaGVyZS4KKwkgKgorCSAqIE9yLCBzaW5jZSB3ZSBrbm93IGhvdyBtdWNoIHdlIG5lZWQgdG8gbWFrZSByZWFkL3dyaXRlYWJsZSwKKwkgKiB0aGlzIGNhbiBiZSBkb25lIG9uY2UgYXQgdGhlIHByb2dyYW0gYmVnaW5uaW5nIGZvciBkaXJlY3QKKwkgKiBhY2Nlc3MgY2FzZS4gQnkgdGhpcyB3ZSBvdmVyY29tZSBsaW1pdGF0aW9ucyBvZiBvbmx5IGN1cnJlbnQKKwkgKiBoZWFkcm9vbSBiZWluZyBhY2Nlc3NpYmxlLgorCSAqLworCXJldHVybiBicGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCBsZW4gPyA6IHNrYl9oZWFkbGVuKHNrYikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9za2JfcHVsbF9kYXRhX3Byb3RvID0geworCS5mdW5jCQk9IGJwZl9za2JfcHVsbF9kYXRhLAorCS5ncGxfb25seQk9IGZhbHNlLAorCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAorCS5hcmcxX3R5cGUJPSBBUkdfUFRSX1RPX0NUWCwKKwkuYXJnMl90eXBlCT0gQVJHX0FOWVRISU5HLAorfTsKKworQlBGX0NBTExfNShicGZfbDNfY3N1bV9yZXBsYWNlLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgb2Zmc2V0LAorCSAgIHU2NCwgZnJvbSwgdTY0LCB0bywgdTY0LCBmbGFncykKK3sKIAlfX3N1bTE2ICpwdHI7CiAKIAlpZiAodW5saWtlbHkoZmxhZ3MgJiB+KEJQRl9GX0hEUl9GSUVMRF9NQVNLKSkpCkBAIC0xNDkxLDEyICsxNTEyLDExIEBACiAJLmFyZzVfdHlwZQk9IEFSR19BTllUSElORywKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2w0X2NzdW1fcmVwbGFjZSh1NjQgcjEsIHU2NCByMiwgdTY0IGZyb20sIHU2NCB0bywgdTY0IGZsYWdzKQorQlBGX0NBTExfNShicGZfbDRfY3N1bV9yZXBsYWNlLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgb2Zmc2V0LAorCSAgIHU2NCwgZnJvbSwgdTY0LCB0bywgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKIAlib29sIGlzX3BzZXVkbyA9IGZsYWdzICYgQlBGX0ZfUFNFVURPX0hEUjsKIAlib29sIGlzX21temVybyA9IGZsYWdzICYgQlBGX0ZfTUFSS19NQU5HTEVEXzA7Ci0JdW5zaWduZWQgaW50IG9mZnNldCA9ICh1bnNpZ25lZCBpbnQpIHIyOwogCV9fc3VtMTYgKnB0cjsKIAogCWlmICh1bmxpa2VseShmbGFncyAmIH4oQlBGX0ZfTUFSS19NQU5HTEVEXzAgfCBCUEZfRl9QU0VVRE9fSERSIHwKQEAgLTE1NDQsMTIgKzE1NjQsMTEgQEAKIAkuYXJnNV90eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKIAotc3RhdGljIHU2NCBicGZfY3N1bV9kaWZmKHU2NCByMSwgdTY0IGZyb21fc2l6ZSwgdTY0IHIzLCB1NjQgdG9fc2l6ZSwgdTY0IHNlZWQpCitCUEZfQ0FMTF81KGJwZl9jc3VtX2RpZmYsIF9fYmUzMiAqLCBmcm9tLCB1MzIsIGZyb21fc2l6ZSwKKwkgICBfX2JlMzIgKiwgdG8sIHUzMiwgdG9fc2l6ZSwgX193c3VtLCBzZWVkKQogewogCXN0cnVjdCBicGZfc2NyYXRjaHBhZCAqc3AgPSB0aGlzX2NwdV9wdHIoJmJwZl9zcCk7Ci0JdTY0IGRpZmZfc2l6ZSA9IGZyb21fc2l6ZSArIHRvX3NpemU7Ci0JX19iZTMyICpmcm9tID0gKF9fYmUzMiAqKSAobG9uZykgcjE7Ci0JX19iZTMyICp0byAgID0gKF9fYmUzMiAqKSAobG9uZykgcjM7CisJdTMyIGRpZmZfc2l6ZSA9IGZyb21fc2l6ZSArIHRvX3NpemU7CiAJaW50IGksIGogPSAwOwogCiAJLyogVGhpcyBpcyBxdWl0ZSBmbGV4aWJsZSwgc29tZSBleGFtcGxlczoKQEAgLTE1NzUsNiArMTU5NCw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9jc3VtX2RpZmZfcHJvdG8gPSB7CiAJLmZ1bmMJCT0gYnBmX2NzdW1fZGlmZiwKIAkuZ3BsX29ubHkJPSBmYWxzZSwKKwkucGt0X2FjY2Vzcwk9IHRydWUsCiAJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCiAJLmFyZzFfdHlwZQk9IEFSR19QVFJfVE9fU1RBQ0ssCiAJLmFyZzJfdHlwZQk9IEFSR19DT05TVF9TVEFDS19TSVpFX09SX1pFUk8sCkBAIC0xNTgzLDYgKzE2MDMsMjYgQEAKIAkuYXJnNV90eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKIAorQlBGX0NBTExfMihicGZfY3N1bV91cGRhdGUsIHN0cnVjdCBza19idWZmICosIHNrYiwgX193c3VtLCBjc3VtKQoreworCS8qIFRoZSBpbnRlcmZhY2UgaXMgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIGJwZl9jc3VtX2RpZmYoKQorCSAqIGZvciBkaXJlY3QgcGFja2V0IHdyaXRlcy4gY3N1bSByb3RhdGlvbiBmb3IgYWxpZ25tZW50IGFzIHdlbGwKKwkgKiBhcyBlbXVsYXRpbmcgY3N1bV9zdWIoKSBjYW4gYmUgZG9uZSBmcm9tIHRoZSBlQlBGIHByb2dyYW0uCisJICovCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCQlyZXR1cm4gKHNrYi0+Y3N1bSA9IGNzdW1fYWRkKHNrYi0+Y3N1bSwgY3N1bSkpOworCisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfY3N1bV91cGRhdGVfcHJvdG8gPSB7CisJLmZ1bmMJCT0gYnBmX2NzdW1fdXBkYXRlLAorCS5ncGxfb25seQk9IGZhbHNlLAorCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAorCS5hcmcxX3R5cGUJPSBBUkdfUFRSX1RPX0NUWCwKKwkuYXJnMl90eXBlCT0gQVJHX0FOWVRISU5HLAorfTsKKwogc3RhdGljIGlubGluZSBpbnQgX19icGZfcnhfc2tiKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIGRldl9mb3J3YXJkX3NrYihkZXYsIHNrYik7CkBAIC0xNjA3LDEwICsxNjQ3LDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHU2NCBicGZfY2xvbmVfcmVkaXJlY3QodTY0IHIxLCB1NjQgaWZpbmRleCwgdTY0IGZsYWdzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoYnBmX2Nsb25lX3JlZGlyZWN0LCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIHUzMiwgaWZpbmRleCwgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBza19idWZmICpjbG9uZTsKKwlpbnQgcmV0OwogCiAJaWYgKHVubGlrZWx5KGZsYWdzICYgfihCUEZfRl9JTkdSRVNTKSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTYxOSwxNCArMTY2MCwyNSBAQAogCWlmICh1bmxpa2VseSghZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQlpZiAodW5saWtlbHkoIXNrYikpCisJY2xvbmUgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAodW5saWtlbHkoIWNsb25lKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlicGZfcHVzaF9tYWNfcmNzdW0oc2tiKTsKKwkvKiBGb3IgZGlyZWN0IHdyaXRlLCB3ZSBuZWVkIHRvIGtlZXAgdGhlIGludmFyaWFudCB0aGF0IHRoZSBza2JzCisJICogd2UncmUgZGVhbGluZyB3aXRoIG5lZWQgdG8gYmUgdW5jbG9uZWQuIFNob3VsZCB1bmNsb25pbmcgZmFpbAorCSAqIGhlcmUsIHdlIG5lZWQgdG8gZnJlZSB0aGUganVzdCBnZW5lcmF0ZWQgY2xvbmUgdG8gdW5jbG9uZSBvbmNlCisJICogYWdhaW4uCisJICovCisJcmV0ID0gYnBmX3RyeV9tYWtlX2hlYWRfd3JpdGFibGUoc2tiKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlrZnJlZV9za2IoY2xvbmUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlicGZfcHVzaF9tYWNfcmNzdW0oY2xvbmUpOwogCiAJcmV0dXJuIGZsYWdzICYgQlBGX0ZfSU5HUkVTUyA/Ci0JICAgICAgIF9fYnBmX3J4X3NrYihkZXYsIHNrYikgOiBfX2JwZl90eF9za2IoZGV2LCBza2IpOworCSAgICAgICBfX2JwZl9yeF9za2IoZGV2LCBjbG9uZSkgOiBfX2JwZl90eF9za2IoZGV2LCBjbG9uZSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2Nsb25lX3JlZGlyZWN0X3Byb3RvID0gewpAQCAtMTY0NSw3ICsxNjk3LDcgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCByZWRpcmVjdF9pbmZvLCByZWRpcmVjdF9pbmZvKTsKIAotc3RhdGljIHU2NCBicGZfcmVkaXJlY3QodTY0IGlmaW5kZXgsIHU2NCBmbGFncywgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzIoYnBmX3JlZGlyZWN0LCB1MzIsIGlmaW5kZXgsIHU2NCwgZmxhZ3MpCiB7CiAJc3RydWN0IHJlZGlyZWN0X2luZm8gKnJpID0gdGhpc19jcHVfcHRyKCZyZWRpcmVjdF9pbmZvKTsKIApAQCAtMTY4NCw5ICsxNzM2LDkgQEAKIAkuYXJnMl90eXBlICAgICAgPSBBUkdfQU5ZVEhJTkcsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9nZXRfY2dyb3VwX2NsYXNzaWQodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8xKGJwZl9nZXRfY2dyb3VwX2NsYXNzaWQsIGNvbnN0IHN0cnVjdCBza19idWZmICosIHNrYikKIHsKLQlyZXR1cm4gdGFza19nZXRfY2xhc3NpZCgoc3RydWN0IHNrX2J1ZmYgKikgKHVuc2lnbmVkIGxvbmcpIHIxKTsKKwlyZXR1cm4gdGFza19nZXRfY2xhc3NpZChza2IpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9nZXRfY2dyb3VwX2NsYXNzaWRfcHJvdG8gPSB7CkBAIC0xNjk2LDkgKzE3NDgsOSBAQAogCS5hcmcxX3R5cGUgICAgICA9IEFSR19QVFJfVE9fQ1RYLAogfTsKIAotc3RhdGljIHU2NCBicGZfZ2V0X3JvdXRlX3JlYWxtKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQorQlBGX0NBTExfMShicGZfZ2V0X3JvdXRlX3JlYWxtLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IpCiB7Ci0JcmV0dXJuIGRzdF90Y2xhc3NpZCgoc3RydWN0IHNrX2J1ZmYgKikgKHVuc2lnbmVkIGxvbmcpIHIxKTsKKwlyZXR1cm4gZHN0X3RjbGFzc2lkKHNrYik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2dldF9yb3V0ZV9yZWFsbV9wcm90byA9IHsKQEAgLTE3MDgsMTQgKzE3NjAsMTQgQEAKIAkuYXJnMV90eXBlICAgICAgPSBBUkdfUFRSX1RPX0NUWCwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX2dldF9oYXNoX3JlY2FsYyh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzEoYnBmX2dldF9oYXNoX3JlY2FsYywgc3RydWN0IHNrX2J1ZmYgKiwgc2tiKQogewogCS8qIElmIHNrYl9jbGVhcl9oYXNoKCkgd2FzIGNhbGxlZCBkdWUgdG8gbWFuZ2xpbmcsIHdlIGNhbgogCSAqIHRyaWdnZXIgU1cgcmVjYWxjdWxhdGlvbiBoZXJlLiBMYXRlciBhY2Nlc3MgdG8gaGFzaAogCSAqIGNhbiB0aGVuIHVzZSB0aGUgaW5saW5lIHNrYi0+aGFzaCB2aWEgY29udGV4dCBkaXJlY3RseQogCSAqIGluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGhlbHBlciBhZ2Fpbi4KIAkgKi8KLQlyZXR1cm4gc2tiX2dldF9oYXNoKChzdHJ1Y3Qgc2tfYnVmZiAqKSAodW5zaWduZWQgbG9uZykgcjEpOworCXJldHVybiBza2JfZ2V0X2hhc2goc2tiKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfZ2V0X2hhc2hfcmVjYWxjX3Byb3RvID0gewpAQCAtMTcyNSwxMCArMTc3NywyNSBAQAogCS5hcmcxX3R5cGUJPSBBUkdfUFRSX1RPX0NUWCwKIH07CiAKLXN0YXRpYyB1NjQgYnBmX3NrYl92bGFuX3B1c2godTY0IHIxLCB1NjQgcjIsIHU2NCB2bGFuX3RjaSwgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8xKGJwZl9zZXRfaGFzaF9pbnZhbGlkLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7Ci0JX19iZTE2IHZsYW5fcHJvdG8gPSAoX19mb3JjZSBfX2JlMTYpIHIyOworCS8qIEFmdGVyIGFsbCBkaXJlY3QgcGFja2V0IHdyaXRlLCB0aGlzIGNhbiBiZSB1c2VkIG9uY2UgZm9yCisJICogdHJpZ2dlcmluZyBhIGxhenkgcmVjYWxjIG9uIG5leHQgc2tiX2dldF9oYXNoKCkgaW52b2NhdGlvbi4KKwkgKi8KKwlza2JfY2xlYXJfaGFzaChza2IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9zZXRfaGFzaF9pbnZhbGlkX3Byb3RvID0geworCS5mdW5jCQk9IGJwZl9zZXRfaGFzaF9pbnZhbGlkLAorCS5ncGxfb25seQk9IGZhbHNlLAorCS5yZXRfdHlwZQk9IFJFVF9JTlRFR0VSLAorCS5hcmcxX3R5cGUJPSBBUkdfUFRSX1RPX0NUWCwKK307CisKK0JQRl9DQUxMXzMoYnBmX3NrYl92bGFuX3B1c2gsIHN0cnVjdCBza19idWZmICosIHNrYiwgX19iZTE2LCB2bGFuX3Byb3RvLAorCSAgIHUxNiwgdmxhbl90Y2kpCit7CiAJaW50IHJldDsKIAogCWlmICh1bmxpa2VseSh2bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSAmJgpAQCAtMTc1Myw5ICsxODIwLDggQEAKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChicGZfc2tiX3ZsYW5fcHVzaF9wcm90byk7CiAKLXN0YXRpYyB1NjQgYnBmX3NrYl92bGFuX3BvcCh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzEoYnBmX3NrYl92bGFuX3BvcCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGxvbmcpIHIxOwogCWludCByZXQ7CiAKIAlicGZfcHVzaF9tYWNfcmNzdW0oc2tiKTsKQEAgLTE5MzAsMTAgKzE5OTYsOSBAQAogCXJldHVybiAtRU5PVFNVUFA7CiB9CiAKLXN0YXRpYyB1NjQgYnBmX3NrYl9jaGFuZ2VfcHJvdG8odTY0IHIxLCB1NjQgcjIsIHU2NCBmbGFncywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKGJwZl9za2JfY2hhbmdlX3Byb3RvLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBza2IsIF9fYmUxNiwgcHJvdG8sCisJICAgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQlfX2JlMTYgcHJvdG8gPSAoX19mb3JjZSBfX2JlMTYpIHIyOwogCWludCByZXQ7CiAKIAlpZiAodW5saWtlbHkoZmxhZ3MpKQpAQCAtMTk3MCwxNCArMjAzNSwxMSBAQAogCS5hcmczX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCi1zdGF0aWMgdTY0IGJwZl9za2JfY2hhbmdlX3R5cGUodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8yKGJwZl9za2JfY2hhbmdlX3R5cGUsIHN0cnVjdCBza19idWZmICosIHNrYiwgdTMyLCBwa3RfdHlwZSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQl1MzIgcGt0X3R5cGUgPSByMjsKLQogCS8qIFdlIG9ubHkgYWxsb3cgYSByZXN0cmljdGVkIHN1YnNldCB0byBiZSBjaGFuZ2VkIGZvciBub3cuICovCi0JaWYgKHVubGlrZWx5KHNrYi0+cGt0X3R5cGUgPiBQQUNLRVRfT1RIRVJIT1NUIHx8Ci0JCSAgICAgcGt0X3R5cGUgPiBQQUNLRVRfT1RIRVJIT1NUKSkKKwlpZiAodW5saWtlbHkoIXNrYl9wa3RfdHlwZV9vayhza2ItPnBrdF90eXBlKSB8fAorCQkgICAgICFza2JfcGt0X3R5cGVfb2socGt0X3R5cGUpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlza2ItPnBrdF90eXBlID0gcGt0X3R5cGU7CkBAIC0xOTkyLDE5ICsyMDU0LDEwMCBAQAogCS5hcmcyX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCiB9OwogCitzdGF0aWMgdTMyIF9fYnBmX3NrYl9taW5fbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTMyIG1pbl9sZW4gPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKKworCWlmIChza2JfdHJhbnNwb3J0X2hlYWRlcl93YXNfc2V0KHNrYikpCisJCW1pbl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQorCQltaW5fbGVuID0gc2tiX2NoZWNrc3VtX3N0YXJ0X29mZnNldChza2IpICsKKwkJCSAgc2tiLT5jc3VtX29mZnNldCArIHNpemVvZihfX3N1bTE2KTsKKwlyZXR1cm4gbWluX2xlbjsKK30KKworc3RhdGljIHUzMiBfX2JwZl9za2JfbWF4X2xlbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPmRldi0+bXR1ICsgc2tiLT5kZXYtPmhhcmRfaGVhZGVyX2xlbjsKK30KKworc3RhdGljIGludCBicGZfc2tiX2dyb3dfcmNzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IG5ld19sZW4pCit7CisJdW5zaWduZWQgaW50IG9sZF9sZW4gPSBza2ItPmxlbjsKKwlpbnQgcmV0OworCisJcmV0ID0gX19za2JfZ3Jvd19yY3N1bShza2IsIG5ld19sZW4pOworCWlmICghcmV0KQorCQltZW1zZXQoc2tiLT5kYXRhICsgb2xkX2xlbiwgMCwgbmV3X2xlbiAtIG9sZF9sZW4pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnBmX3NrYl90cmltX3Jjc3VtKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBuZXdfbGVuKQoreworCXJldHVybiBfX3NrYl90cmltX3Jjc3VtKHNrYiwgbmV3X2xlbik7Cit9CisKK0JQRl9DQUxMXzMoYnBmX3NrYl9jaGFuZ2VfdGFpbCwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLCB1MzIsIG5ld19sZW4sCisJICAgdTY0LCBmbGFncykKK3sKKwl1MzIgbWF4X2xlbiA9IF9fYnBmX3NrYl9tYXhfbGVuKHNrYik7CisJdTMyIG1pbl9sZW4gPSBfX2JwZl9za2JfbWluX2xlbihza2IpOworCWludCByZXQ7CisKKwlpZiAodW5saWtlbHkoZmxhZ3MgfHwgbmV3X2xlbiA+IG1heF9sZW4gfHwgbmV3X2xlbiA8IG1pbl9sZW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc2tiLT5lbmNhcHN1bGF0aW9uKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJLyogVGhlIGJhc2ljIGlkZWEgb2YgdGhpcyBoZWxwZXIgaXMgdGhhdCBpdCdzIHBlcmZvcm1pbmcgdGhlCisJICogbmVlZGVkIHdvcmsgdG8gZWl0aGVyIGdyb3cgb3IgdHJpbSBhbiBza2IsIGFuZCBlQlBGIHByb2dyYW0KKwkgKiByZXdyaXRlcyB0aGUgcmVzdCB2aWEgaGVscGVycyBsaWtlIGJwZl9za2Jfc3RvcmVfYnl0ZXMoKSwKKwkgKiBicGZfbFhfY3N1bV9yZXBsYWNlKCkgYW5kIG90aGVycyByYXRoZXIgdGhhbiBwYXNzaW5nIGEgcmF3CisJICogYnVmZmVyIGhlcmUuIFRoaXMgb25lIGlzIGEgc2xvdyBwYXRoIGhlbHBlciBhbmQgaW50ZW5kZWQKKwkgKiBmb3IgcmVwbGllcyB3aXRoIGNvbnRyb2wgbWVzc2FnZXMuCisJICoKKwkgKiBMaWtlIGluIGJwZl9za2JfY2hhbmdlX3Byb3RvKCksIHdlIHdhbnQgdG8ga2VlcCB0aGlzIHJhdGhlcgorCSAqIG1pbmltYWwgYW5kIHdpdGhvdXQgcHJvdG9jb2wgc3BlY2lmaWNzIHNvIHRoYXQgd2UgYXJlIGFibGUKKwkgKiB0byBzZXBhcmF0ZSBjb25jZXJucyBhcyBpbiBicGZfc2tiX3N0b3JlX2J5dGVzKCkgc2hvdWxkIG9ubHkKKwkgKiBiZSB0aGUgb25lIHJlc3BvbnNpYmxlIGZvciB3cml0aW5nIGJ1ZmZlcnMuCisJICoKKwkgKiBJdCdzIHJlYWxseSBleHBlY3RlZCB0byBiZSBhIHNsb3cgcGF0aCBvcGVyYXRpb24gaGVyZSBmb3IKKwkgKiBjb250cm9sIG1lc3NhZ2UgcmVwbGllcywgc28gd2UncmUgaW1wbGljaXRseSBsaW5lYXJpemluZywKKwkgKiB1bmNsb25pbmcgYW5kIGRyb3Agb2ZmbG9hZHMgZnJvbSB0aGUgc2tiIGJ5IHRoaXMuCisJICovCisJcmV0ID0gX19icGZfdHJ5X21ha2Vfd3JpdGFibGUoc2tiLCBza2ItPmxlbik7CisJaWYgKCFyZXQpIHsKKwkJaWYgKG5ld19sZW4gPiBza2ItPmxlbikKKwkJCXJldCA9IGJwZl9za2JfZ3Jvd19yY3N1bShza2IsIG5ld19sZW4pOworCQllbHNlIGlmIChuZXdfbGVuIDwgc2tiLT5sZW4pCisJCQlyZXQgPSBicGZfc2tiX3RyaW1fcmNzdW0oc2tiLCBuZXdfbGVuKTsKKwkJaWYgKCFyZXQgJiYgc2tiX2lzX2dzbyhza2IpKQorCQkJc2tiX2dzb19yZXNldChza2IpOworCX0KKworCWJwZl9jb21wdXRlX2RhdGFfZW5kKHNrYik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfc2tiX2NoYW5nZV90YWlsX3Byb3RvID0geworCS5mdW5jCQk9IGJwZl9za2JfY2hhbmdlX3RhaWwsCisJLmdwbF9vbmx5CT0gZmFsc2UsCisJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCisJLmFyZzFfdHlwZQk9IEFSR19QVFJfVE9fQ1RYLAorCS5hcmcyX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCisJLmFyZzNfdHlwZQk9IEFSR19BTllUSElORywKK307CisKIGJvb2wgYnBmX2hlbHBlcl9jaGFuZ2VzX3NrYl9kYXRhKHZvaWQgKmZ1bmMpCiB7Ci0JaWYgKGZ1bmMgPT0gYnBmX3NrYl92bGFuX3B1c2gpCi0JCXJldHVybiB0cnVlOwotCWlmIChmdW5jID09IGJwZl9za2Jfdmxhbl9wb3ApCi0JCXJldHVybiB0cnVlOwotCWlmIChmdW5jID09IGJwZl9za2Jfc3RvcmVfYnl0ZXMpCi0JCXJldHVybiB0cnVlOwotCWlmIChmdW5jID09IGJwZl9za2JfY2hhbmdlX3Byb3RvKQotCQlyZXR1cm4gdHJ1ZTsKLQlpZiAoZnVuYyA9PSBicGZfbDNfY3N1bV9yZXBsYWNlKQotCQlyZXR1cm4gdHJ1ZTsKLQlpZiAoZnVuYyA9PSBicGZfbDRfY3N1bV9yZXBsYWNlKQorCWlmIChmdW5jID09IGJwZl9za2Jfdmxhbl9wdXNoIHx8CisJICAgIGZ1bmMgPT0gYnBmX3NrYl92bGFuX3BvcCB8fAorCSAgICBmdW5jID09IGJwZl9za2Jfc3RvcmVfYnl0ZXMgfHwKKwkgICAgZnVuYyA9PSBicGZfc2tiX2NoYW5nZV9wcm90byB8fAorCSAgICBmdW5jID09IGJwZl9za2JfY2hhbmdlX3RhaWwgfHwKKwkgICAgZnVuYyA9PSBicGZfc2tiX3B1bGxfZGF0YSB8fAorCSAgICBmdW5jID09IGJwZl9sM19jc3VtX3JlcGxhY2UgfHwKKwkgICAgZnVuYyA9PSBicGZfbDRfY3N1bV9yZXBsYWNlKQogCQlyZXR1cm4gdHJ1ZTsKIAogCXJldHVybiBmYWxzZTsKQEAgLTIwMjMsMTMgKzIxNjYsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHU2NCBicGZfc2tiX2V2ZW50X291dHB1dCh1NjQgcjEsIHU2NCByMiwgdTY0IGZsYWdzLCB1NjQgcjQsCi0JCQkJdTY0IG1ldGFfc2l6ZSkKK0JQRl9DQUxMXzUoYnBmX3NrYl9ldmVudF9vdXRwdXQsIHN0cnVjdCBza19idWZmICosIHNrYiwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLAorCSAgIHU2NCwgZmxhZ3MsIHZvaWQgKiwgbWV0YSwgdTY0LCBtZXRhX3NpemUpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKShsb25nKSByMTsKLQlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gKHN0cnVjdCBicGZfbWFwICopKGxvbmcpIHIyOwogCXU2NCBza2Jfc2l6ZSA9IChmbGFncyAmIEJQRl9GX0NUWExFTl9NQVNLKSA+PiAzMjsKLQl2b2lkICptZXRhID0gKHZvaWQgKikobG9uZykgcjQ7CiAKIAlpZiAodW5saWtlbHkoZmxhZ3MgJiB+KEJQRl9GX0NUWExFTl9NQVNLIHwgQlBGX0ZfSU5ERVhfTUFTSykpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIwNTYsMTAgKzIxOTYsOSBAQAogCXJldHVybiBmbGFncyAmIEJQRl9GX1RVTklORk9fSVBWNiA/IEFGX0lORVQ2IDogQUZfSU5FVDsKIH0KIAotc3RhdGljIHU2NCBicGZfc2tiX2dldF90dW5uZWxfa2V5KHU2NCByMSwgdTY0IHIyLCB1NjQgc2l6ZSwgdTY0IGZsYWdzLCB1NjQgcjUpCitCUEZfQ0FMTF80KGJwZl9za2JfZ2V0X3R1bm5lbF9rZXksIHN0cnVjdCBza19idWZmICosIHNrYiwgc3RydWN0IGJwZl90dW5uZWxfa2V5ICosIHRvLAorCSAgIHUzMiwgc2l6ZSwgdTY0LCBmbGFncykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkgKnRvID0gKHN0cnVjdCBicGZfdHVubmVsX2tleSAqKSAobG9uZykgcjI7CiAJY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9pbmZvICppbmZvID0gc2tiX3R1bm5lbF9pbmZvKHNrYik7CiAJdTggY29tcGF0W3NpemVvZihzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkpXTsKIAl2b2lkICp0b19vcmlnID0gdG87CkBAIC0yMTI0LDEwICsyMjYzLDggQEAKIAkuYXJnNF90eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKIAotc3RhdGljIHU2NCBicGZfc2tiX2dldF90dW5uZWxfb3B0KHU2NCByMSwgdTY0IHIyLCB1NjQgc2l6ZSwgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKGJwZl9za2JfZ2V0X3R1bm5lbF9vcHQsIHN0cnVjdCBza19idWZmICosIHNrYiwgdTggKiwgdG8sIHUzMiwgc2l6ZSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gKHN0cnVjdCBza19idWZmICopIChsb25nKSByMTsKLQl1OCAqdG8gPSAodTggKikgKGxvbmcpIHIyOwogCWNvbnN0IHN0cnVjdCBpcF90dW5uZWxfaW5mbyAqaW5mbyA9IHNrYl90dW5uZWxfaW5mbyhza2IpOwogCWludCBlcnI7CiAKQEAgLTIxNjIsMTAgKzIyOTksOSBAQAogCiBzdGF0aWMgc3RydWN0IG1ldGFkYXRhX2RzdCBfX3BlcmNwdSAqbWRfZHN0OwogCi1zdGF0aWMgdTY0IGJwZl9za2Jfc2V0X3R1bm5lbF9rZXkodTY0IHIxLCB1NjQgcjIsIHU2NCBzaXplLCB1NjQgZmxhZ3MsIHU2NCByNSkKK0JQRl9DQUxMXzQoYnBmX3NrYl9zZXRfdHVubmVsX2tleSwgc3RydWN0IHNrX2J1ZmYgKiwgc2tiLAorCSAgIGNvbnN0IHN0cnVjdCBicGZfdHVubmVsX2tleSAqLCBmcm9tLCB1MzIsIHNpemUsIHU2NCwgZmxhZ3MpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7Ci0Jc3RydWN0IGJwZl90dW5uZWxfa2V5ICpmcm9tID0gKHN0cnVjdCBicGZfdHVubmVsX2tleSAqKSAobG9uZykgcjI7CiAJc3RydWN0IG1ldGFkYXRhX2RzdCAqbWQgPSB0aGlzX2NwdV9wdHIobWRfZHN0KTsKIAl1OCBjb21wYXRbc2l6ZW9mKHN0cnVjdCBicGZfdHVubmVsX2tleSldOwogCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqaW5mbzsKQEAgLTIxODMsNyArMjMxOSw3IEBACiAJCQkgKi8KIAkJCW1lbWNweShjb21wYXQsIGZyb20sIHNpemUpOwogCQkJbWVtc2V0KGNvbXBhdCArIHNpemUsIDAsIHNpemVvZihjb21wYXQpIC0gc2l6ZSk7Ci0JCQlmcm9tID0gKHN0cnVjdCBicGZfdHVubmVsX2tleSAqKWNvbXBhdDsKKwkJCWZyb20gPSAoY29uc3Qgc3RydWN0IGJwZl90dW5uZWxfa2V5ICopIGNvbXBhdDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjMzLDEwICsyMzY5LDkgQEAKIAkuYXJnNF90eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKIAotc3RhdGljIHU2NCBicGZfc2tiX3NldF90dW5uZWxfb3B0KHU2NCByMSwgdTY0IHIyLCB1NjQgc2l6ZSwgdTY0IHI0LCB1NjQgcjUpCitCUEZfQ0FMTF8zKGJwZl9za2Jfc2V0X3R1bm5lbF9vcHQsIHN0cnVjdCBza19idWZmICosIHNrYiwKKwkgICBjb25zdCB1OCAqLCBmcm9tLCB1MzIsIHNpemUpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7Ci0JdTggKmZyb20gPSAodTggKikgKGxvbmcpIHIyOwogCXN0cnVjdCBpcF90dW5uZWxfaW5mbyAqaW5mbyA9IHNrYl90dW5uZWxfaW5mbyhza2IpOwogCWNvbnN0IHN0cnVjdCBtZXRhZGF0YV9kc3QgKm1kID0gdGhpc19jcHVfcHRyKG1kX2RzdCk7CiAKQEAgLTIyODIsMjggKzI0MTcsMjQgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfU09DS19DR1JPVVBfREFUQQotc3RhdGljIHU2NCBicGZfc2tiX3VuZGVyX2Nncm91cCh1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK0JQRl9DQUxMXzMoYnBmX3NrYl91bmRlcl9jZ3JvdXAsIHN0cnVjdCBza19idWZmICosIHNrYiwgc3RydWN0IGJwZl9tYXAgKiwgbWFwLAorCSAgIHUzMiwgaWR4KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikobG9uZylyMTsKLQlzdHJ1Y3QgYnBmX21hcCAqbWFwID0gKHN0cnVjdCBicGZfbWFwICopKGxvbmcpcjI7CiAJc3RydWN0IGJwZl9hcnJheSAqYXJyYXkgPSBjb250YWluZXJfb2YobWFwLCBzdHJ1Y3QgYnBmX2FycmF5LCBtYXApOwogCXN0cnVjdCBjZ3JvdXAgKmNncnA7CiAJc3RydWN0IHNvY2sgKnNrOwotCXUzMiBpID0gKHUzMilyMzsKIAotCXNrID0gc2tiLT5zazsKKwlzayA9IHNrYl90b19mdWxsX3NrKHNrYik7CiAJaWYgKCFzayB8fCAhc2tfZnVsbHNvY2soc2spKQogCQlyZXR1cm4gLUVOT0VOVDsKLQotCWlmICh1bmxpa2VseShpID49IGFycmF5LT5tYXAubWF4X2VudHJpZXMpKQorCWlmICh1bmxpa2VseShpZHggPj0gYXJyYXktPm1hcC5tYXhfZW50cmllcykpCiAJCXJldHVybiAtRTJCSUc7CiAKLQljZ3JwID0gUkVBRF9PTkNFKGFycmF5LT5wdHJzW2ldKTsKKwljZ3JwID0gUkVBRF9PTkNFKGFycmF5LT5wdHJzW2lkeF0pOwogCWlmICh1bmxpa2VseSghY2dycCkpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JcmV0dXJuIGNncm91cF9pc19kZXNjZW5kYW50KHNvY2tfY2dyb3VwX3B0cigmc2stPnNrX2NncnBfZGF0YSksIGNncnApOworCXJldHVybiBza191bmRlcl9jZ3JvdXBfaGllcmFyY2h5KHNrLCBjZ3JwKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfc2tiX3VuZGVyX2Nncm91cF9wcm90byA9IHsKQEAgLTIzMTQsNyArMjQ0NSwzOCBAQAogCS5hcmcyX3R5cGUJPSBBUkdfQ09OU1RfTUFQX1BUUiwKIAkuYXJnM190eXBlCT0gQVJHX0FOWVRISU5HLAogfTsKLSNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBicGZfeGRwX2NvcHkodm9pZCAqZHN0X2J1ZmYsIGNvbnN0IHZvaWQgKnNyY19idWZmLAorCQkJCSAgdW5zaWduZWQgbG9uZyBvZmYsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCW1lbWNweShkc3RfYnVmZiwgc3JjX2J1ZmYgKyBvZmYsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK0JQRl9DQUxMXzUoYnBmX3hkcF9ldmVudF9vdXRwdXQsIHN0cnVjdCB4ZHBfYnVmZiAqLCB4ZHAsIHN0cnVjdCBicGZfbWFwICosIG1hcCwKKwkgICB1NjQsIGZsYWdzLCB2b2lkICosIG1ldGEsIHU2NCwgbWV0YV9zaXplKQoreworCXU2NCB4ZHBfc2l6ZSA9IChmbGFncyAmIEJQRl9GX0NUWExFTl9NQVNLKSA+PiAzMjsKKworCWlmICh1bmxpa2VseShmbGFncyAmIH4oQlBGX0ZfQ1RYTEVOX01BU0sgfCBCUEZfRl9JTkRFWF9NQVNLKSkpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseSh4ZHBfc2l6ZSA+ICh1bnNpZ25lZCBsb25nKSh4ZHAtPmRhdGFfZW5kIC0geGRwLT5kYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGJwZl9ldmVudF9vdXRwdXQobWFwLCBmbGFncywgbWV0YSwgbWV0YV9zaXplLCB4ZHAsIHhkcF9zaXplLAorCQkJCWJwZl94ZHBfY29weSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX3hkcF9ldmVudF9vdXRwdXRfcHJvdG8gPSB7CisJLmZ1bmMJCT0gYnBmX3hkcF9ldmVudF9vdXRwdXQsCisJLmdwbF9vbmx5CT0gdHJ1ZSwKKwkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKKwkuYXJnMV90eXBlCT0gQVJHX1BUUl9UT19DVFgsCisJLmFyZzJfdHlwZQk9IEFSR19DT05TVF9NQVBfUFRSLAorCS5hcmczX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCisJLmFyZzRfdHlwZQk9IEFSR19QVFJfVE9fU1RBQ0ssCisJLmFyZzVfdHlwZQk9IEFSR19DT05TVF9TVEFDS19TSVpFLAorfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqCiBza19maWx0ZXJfZnVuY19wcm90byhlbnVtIGJwZl9mdW5jX2lkIGZ1bmNfaWQpCkBAIC0yMzUwLDggKzI1MTIsMTIgQEAKIAkJcmV0dXJuICZicGZfc2tiX3N0b3JlX2J5dGVzX3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfc2tiX2xvYWRfYnl0ZXM6CiAJCXJldHVybiAmYnBmX3NrYl9sb2FkX2J5dGVzX3Byb3RvOworCWNhc2UgQlBGX0ZVTkNfc2tiX3B1bGxfZGF0YToKKwkJcmV0dXJuICZicGZfc2tiX3B1bGxfZGF0YV9wcm90bzsKIAljYXNlIEJQRl9GVU5DX2NzdW1fZGlmZjoKIAkJcmV0dXJuICZicGZfY3N1bV9kaWZmX3Byb3RvOworCWNhc2UgQlBGX0ZVTkNfY3N1bV91cGRhdGU6CisJCXJldHVybiAmYnBmX2NzdW1fdXBkYXRlX3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfbDNfY3N1bV9yZXBsYWNlOgogCQlyZXR1cm4gJmJwZl9sM19jc3VtX3JlcGxhY2VfcHJvdG87CiAJY2FzZSBCUEZfRlVOQ19sNF9jc3VtX3JlcGxhY2U6CkBAIC0yMzY4LDYgKzI1MzQsOCBAQAogCQlyZXR1cm4gJmJwZl9za2JfY2hhbmdlX3Byb3RvX3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfc2tiX2NoYW5nZV90eXBlOgogCQlyZXR1cm4gJmJwZl9za2JfY2hhbmdlX3R5cGVfcHJvdG87CisJY2FzZSBCUEZfRlVOQ19za2JfY2hhbmdlX3RhaWw6CisJCXJldHVybiAmYnBmX3NrYl9jaGFuZ2VfdGFpbF9wcm90bzsKIAljYXNlIEJQRl9GVU5DX3NrYl9nZXRfdHVubmVsX2tleToKIAkJcmV0dXJuICZicGZfc2tiX2dldF90dW5uZWxfa2V5X3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfc2tiX3NldF90dW5uZWxfa2V5OgpAQCAtMjM4MiwxNCArMjU1MCwxNCBAQAogCQlyZXR1cm4gJmJwZl9nZXRfcm91dGVfcmVhbG1fcHJvdG87CiAJY2FzZSBCUEZfRlVOQ19nZXRfaGFzaF9yZWNhbGM6CiAJCXJldHVybiAmYnBmX2dldF9oYXNoX3JlY2FsY19wcm90bzsKKwljYXNlIEJQRl9GVU5DX3NldF9oYXNoX2ludmFsaWQ6CisJCXJldHVybiAmYnBmX3NldF9oYXNoX2ludmFsaWRfcHJvdG87CiAJY2FzZSBCUEZfRlVOQ19wZXJmX2V2ZW50X291dHB1dDoKIAkJcmV0dXJuICZicGZfc2tiX2V2ZW50X291dHB1dF9wcm90bzsKIAljYXNlIEJQRl9GVU5DX2dldF9zbXBfcHJvY2Vzc29yX2lkOgogCQlyZXR1cm4gJmJwZl9nZXRfc21wX3Byb2Nlc3Nvcl9pZF9wcm90bzsKLSNpZmRlZiBDT05GSUdfU09DS19DR1JPVVBfREFUQQogCWNhc2UgQlBGX0ZVTkNfc2tiX3VuZGVyX2Nncm91cDoKIAkJcmV0dXJuICZicGZfc2tiX3VuZGVyX2Nncm91cF9wcm90bzsKLSNlbmRpZgogCWRlZmF1bHQ6CiAJCXJldHVybiBza19maWx0ZXJfZnVuY19wcm90byhmdW5jX2lkKTsKIAl9CkBAIC0yMzk4LDcgKzI1NjYsMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gKgogeGRwX2Z1bmNfcHJvdG8oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkKQogewotCXJldHVybiBza19maWx0ZXJfZnVuY19wcm90byhmdW5jX2lkKTsKKwlzd2l0Y2ggKGZ1bmNfaWQpIHsKKwljYXNlIEJQRl9GVU5DX3BlcmZfZXZlbnRfb3V0cHV0OgorCQlyZXR1cm4gJmJwZl94ZHBfZXZlbnRfb3V0cHV0X3Byb3RvOworCWNhc2UgQlBGX0ZVTkNfZ2V0X3NtcF9wcm9jZXNzb3JfaWQ6CisJCXJldHVybiAmYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkX3Byb3RvOworCWRlZmF1bHQ6CisJCXJldHVybiBza19maWx0ZXJfZnVuY19wcm90byhmdW5jX2lkKTsKKwl9CiB9CiAKIHN0YXRpYyBib29sIF9faXNfdmFsaWRfYWNjZXNzKGludCBvZmYsIGludCBzaXplLCBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlKQpAQCAtMjQzOCw2ICsyNjEzLDQ1IEBACiAJcmV0dXJuIF9faXNfdmFsaWRfYWNjZXNzKG9mZiwgc2l6ZSwgdHlwZSk7CiB9CiAKK3N0YXRpYyBpbnQgdGNfY2xzX2FjdF9wcm9sb2d1ZShzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmLCBib29sIGRpcmVjdF93cml0ZSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCit7CisJc3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7CisKKwlpZiAoIWRpcmVjdF93cml0ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBpZiAoIXNrYi0+Y2xvbmVkKQorCSAqICAgICAgIGdvdG8gc3RhcnQ7CisJICoKKwkgKiAoRmFzdC1wYXRoLCBvdGhlcndpc2UgYXBwcm94aW1hdGlvbiB0aGF0IHdlIG1pZ2h0IGJlCisJICogIGEgY2xvbmUsIGRvIHRoZSByZXN0IGluIGhlbHBlci4pCisJICovCisJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwgQ0xPTkVEX09GRlNFVCgpKTsKKwkqaW5zbisrID0gQlBGX0FMVTMyX0lNTShCUEZfQU5ELCBCUEZfUkVHXzYsIENMT05FRF9NQVNLKTsKKwkqaW5zbisrID0gQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR182LCAwLCA3KTsKKworCS8qIHJldCA9IGJwZl9za2JfcHVsbF9kYXRhKHNrYiwgMCk7ICovCisJKmluc24rKyA9IEJQRl9NT1Y2NF9SRUcoQlBGX1JFR182LCBCUEZfUkVHXzEpOworCSppbnNuKysgPSBCUEZfQUxVNjRfUkVHKEJQRl9YT1IsIEJQRl9SRUdfMiwgQlBGX1JFR18yKTsKKwkqaW5zbisrID0gQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwKKwkJCSAgICAgICBCUEZfRlVOQ19za2JfcHVsbF9kYXRhKTsKKwkvKiBpZiAoIXJldCkKKwkgKiAgICAgIGdvdG8gcmVzdG9yZTsKKwkgKiByZXR1cm4gVENfQUNUX1NIT1Q7CisJICovCisJKmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgMik7CisJKmluc24rKyA9IEJQRl9BTFUzMl9JTU0oQlBGX01PViwgQlBGX1JFR18wLCBUQ19BQ1RfU0hPVCk7CisJKmluc24rKyA9IEJQRl9FWElUX0lOU04oKTsKKworCS8qIHJlc3RvcmU6ICovCisJKmluc24rKyA9IEJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpOworCS8qIHN0YXJ0OiAqLworCSppbnNuKysgPSBwcm9nLT5pbnNuc2lbMF07CisKKwlyZXR1cm4gaW5zbiAtIGluc25fYnVmOworfQorCiBzdGF0aWMgYm9vbCB0Y19jbHNfYWN0X2lzX3ZhbGlkX2FjY2VzcyhpbnQgb2ZmLCBpbnQgc2l6ZSwKIAkJCQkgICAgICAgZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwKIAkJCQkgICAgICAgZW51bSBicGZfcmVnX3R5cGUgKnJlZ190eXBlKQpAQCAtMjQ3NSw3ICsyNjg5LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCWlmIChvZmYgJSBzaXplICE9IDApCiAJCXJldHVybiBmYWxzZTsKLQlpZiAoc2l6ZSAhPSA0KQorCWlmIChzaXplICE9IHNpemVvZihfX3UzMikpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiB0cnVlOwpAQCAtMjUwNiwxMCArMjcyMCwxMCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYnBmX3dhcm5faW52YWxpZF94ZHBfYWN0aW9uKTsKIAotc3RhdGljIHUzMiBicGZfbmV0X2NvbnZlcnRfY3R4X2FjY2VzcyhlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlLCBpbnQgZHN0X3JlZywKLQkJCQkgICAgICBpbnQgc3JjX3JlZywgaW50IGN0eF9vZmYsCi0JCQkJICAgICAgc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZiwKLQkJCQkgICAgICBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCitzdGF0aWMgdTMyIHNrX2ZpbHRlcl9jb252ZXJ0X2N0eF9hY2Nlc3MoZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwgaW50IGRzdF9yZWcsCisJCQkJCWludCBzcmNfcmVnLCBpbnQgY3R4X29mZiwKKwkJCQkJc3RydWN0IGJwZl9pbnNuICppbnNuX2J1ZiwKKwkJCQkJc3RydWN0IGJwZl9wcm9nICpwcm9nKQogewogCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGluc25fYnVmOwogCkBAIC0yNTU2LDcgKzI3NzAsNyBAQAogCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgaWZpbmRleCk6CiAJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IG5ldF9kZXZpY2UsIGlmaW5kZXgpICE9IDQpOwogCi0JCSppbnNuKysgPSBCUEZfTERYX01FTShieXRlc190b19icGZfc2l6ZShGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRldikpLAorCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0ZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSwKIAkJCQkgICAgICBkc3RfcmVnLCBzcmNfcmVnLAogCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBkZXYpKTsKIAkJKmluc24rKyA9IEJQRl9KTVBfSU1NKEJQRl9KRVEsIGRzdF9yZWcsIDAsIDEpOwpAQCAtMjU5Nyw3ICsyODExLDcgQEAKIAkJCQkJICBkc3RfcmVnLCBzcmNfcmVnLCBpbnNuKTsKIAogCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgY2JbMF0pIC4uLgotCQlvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBjYls0XSk6CisJICAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBjYls0XSk6CiAJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHFkaXNjX3NrYl9jYiwgZGF0YSkgPCAyMCk7CiAKIAkJcHJvZy0+Y2JfYWNjZXNzID0gMTsKQEAgLTI2MjEsNyArMjgzNSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKToKLQkJKmluc24rKyA9IEJQRl9MRFhfTUVNKGJ5dGVzX3RvX2JwZl9zaXplKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgZGF0YSkpLAorCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0ZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgZGF0YSksCiAJCQkJICAgICAgZHN0X3JlZywgc3JjX3JlZywKIAkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGF0YSkpOwogCQlicmVhazsKQEAgLTI2MzAsOCArMjg0NCw4IEBACiAJCWN0eF9vZmYgLT0gb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpOwogCQljdHhfb2ZmICs9IG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBjYik7CiAJCWN0eF9vZmYgKz0gb2Zmc2V0b2Yoc3RydWN0IGJwZl9za2JfZGF0YV9lbmQsIGRhdGFfZW5kKTsKLQkJKmluc24rKyA9IEJQRl9MRFhfTUVNKGJ5dGVzX3RvX2JwZl9zaXplKHNpemVvZih2b2lkICopKSwKLQkJCQkgICAgICBkc3RfcmVnLCBzcmNfcmVnLCBjdHhfb2ZmKTsKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9TSVpFT0Yodm9pZCAqKSwgZHN0X3JlZywgc3JjX3JlZywKKwkJCQkgICAgICBjdHhfb2ZmKTsKIAkJYnJlYWs7CiAKIAljYXNlIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIHRjX2luZGV4KToKQEAgLTI2NTcsNiArMjg3MSwzMSBAQAogCXJldHVybiBpbnNuIC0gaW5zbl9idWY7CiB9CiAKK3N0YXRpYyB1MzIgdGNfY2xzX2FjdF9jb252ZXJ0X2N0eF9hY2Nlc3MoZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwgaW50IGRzdF9yZWcsCisJCQkJCSBpbnQgc3JjX3JlZywgaW50IGN0eF9vZmYsCisJCQkJCSBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmLAorCQkJCQkgc3RydWN0IGJwZl9wcm9nICpwcm9nKQoreworCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IGluc25fYnVmOworCisJc3dpdGNoIChjdHhfb2ZmKSB7CisJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBpZmluZGV4KToKKwkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCkgIT0gNCk7CisKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9GSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGRldiksCisJCQkJICAgICAgZHN0X3JlZywgc3JjX3JlZywKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgZGV2KSk7CisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfVywgZHN0X3JlZywgZHN0X3JlZywKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3QgbmV0X2RldmljZSwgaWZpbmRleCkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc2tfZmlsdGVyX2NvbnZlcnRfY3R4X2FjY2Vzcyh0eXBlLCBkc3RfcmVnLCBzcmNfcmVnLAorCQkJCQkJICAgIGN0eF9vZmYsIGluc25fYnVmLCBwcm9nKTsKKwl9CisKKwlyZXR1cm4gaW5zbiAtIGluc25fYnVmOworfQorCiBzdGF0aWMgdTMyIHhkcF9jb252ZXJ0X2N0eF9hY2Nlc3MoZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSwgaW50IGRzdF9yZWcsCiAJCQkJICBpbnQgc3JjX3JlZywgaW50IGN0eF9vZmYsCiAJCQkJICBzdHJ1Y3QgYnBmX2luc24gKmluc25fYnVmLApAQCAtMjY2NiwxMiArMjkwNSwxMiBAQAogCiAJc3dpdGNoIChjdHhfb2ZmKSB7CiAJY2FzZSBvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhKToKLQkJKmluc24rKyA9IEJQRl9MRFhfTUVNKGJ5dGVzX3RvX2JwZl9zaXplKEZJRUxEX1NJWkVPRihzdHJ1Y3QgeGRwX2J1ZmYsIGRhdGEpKSwKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9GSUVMRF9TSVpFT0Yoc3RydWN0IHhkcF9idWZmLCBkYXRhKSwKIAkJCQkgICAgICBkc3RfcmVnLCBzcmNfcmVnLAogCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCB4ZHBfYnVmZiwgZGF0YSkpOwogCQlicmVhazsKIAljYXNlIG9mZnNldG9mKHN0cnVjdCB4ZHBfbWQsIGRhdGFfZW5kKToKLQkJKmluc24rKyA9IEJQRl9MRFhfTUVNKGJ5dGVzX3RvX2JwZl9zaXplKEZJRUxEX1NJWkVPRihzdHJ1Y3QgeGRwX2J1ZmYsIGRhdGFfZW5kKSksCisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfRklFTERfU0laRU9GKHN0cnVjdCB4ZHBfYnVmZiwgZGF0YV9lbmQpLAogCQkJCSAgICAgIGRzdF9yZWcsIHNyY19yZWcsCiAJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHhkcF9idWZmLCBkYXRhX2VuZCkpOwogCQlicmVhazsKQEAgLTI2ODMsMTMgKzI5MjIsMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX3ZlcmlmaWVyX29wcyBza19maWx0ZXJfb3BzID0gewogCS5nZXRfZnVuY19wcm90bwkJPSBza19maWx0ZXJfZnVuY19wcm90bywKIAkuaXNfdmFsaWRfYWNjZXNzCT0gc2tfZmlsdGVyX2lzX3ZhbGlkX2FjY2VzcywKLQkuY29udmVydF9jdHhfYWNjZXNzCT0gYnBmX25ldF9jb252ZXJ0X2N0eF9hY2Nlc3MsCisJLmNvbnZlcnRfY3R4X2FjY2Vzcwk9IHNrX2ZpbHRlcl9jb252ZXJ0X2N0eF9hY2Nlc3MsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgdGNfY2xzX2FjdF9vcHMgPSB7CiAJLmdldF9mdW5jX3Byb3RvCQk9IHRjX2Nsc19hY3RfZnVuY19wcm90bywKIAkuaXNfdmFsaWRfYWNjZXNzCT0gdGNfY2xzX2FjdF9pc192YWxpZF9hY2Nlc3MsCi0JLmNvbnZlcnRfY3R4X2FjY2Vzcwk9IGJwZl9uZXRfY29udmVydF9jdHhfYWNjZXNzLAorCS5jb252ZXJ0X2N0eF9hY2Nlc3MJPSB0Y19jbHNfYWN0X2NvbnZlcnRfY3R4X2FjY2VzcywKKwkuZ2VuX3Byb2xvZ3VlCQk9IHRjX2Nsc19hY3RfcHJvbG9ndWUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgeGRwX29wcyA9IHsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Zsb3dfZGlzc2VjdG9yLmMgYi9uZXQvY29yZS9mbG93X2Rpc3NlY3Rvci5jCmluZGV4IDYxYWQ0M2YuLjFhN2I4MGYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Zsb3dfZGlzc2VjdG9yLmMKKysrIGIvbmV0L2NvcmUvZmxvd19kaXNzZWN0b3IuYwpAQCAtNiw2ICs2LDggQEAKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvZ3JlLmg+CisjaW5jbHVkZSA8bmV0L3BwdHAuaD4KICNpbmNsdWRlIDxsaW51eC9pZ21wLmg+CiAjaW5jbHVkZSA8bGludXgvaWNtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjdHAuaD4KQEAgLTExNiwxMyArMTE4LDE2IEBACiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9hZGRycyAqa2V5X2FkZHJzOwogCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfcG9ydHMgKmtleV9wb3J0czsKIAlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3RhZ3MgKmtleV90YWdzOworCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdmxhbiAqa2V5X3ZsYW47CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9rZXlpZCAqa2V5X2tleWlkOworCWJvb2wgc2tpcF92bGFuID0gZmFsc2U7CiAJdTggaXBfcHJvdG8gPSAwOwogCWJvb2wgcmV0ID0gZmFsc2U7CiAKIAlpZiAoIWRhdGEpIHsKIAkJZGF0YSA9IHNrYi0+ZGF0YTsKLQkJcHJvdG8gPSBza2ItPnByb3RvY29sOworCQlwcm90byA9IHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikgPworCQkJIHNrYi0+dmxhbl9wcm90byA6IHNrYi0+cHJvdG9jb2w7CiAJCW5ob2ZmID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJCWhsZW4gPSBza2JfaGVhZGxlbihza2IpOwogCX0KQEAgLTI0MSwyMyArMjQ2LDQ1IEBACiAJY2FzZSBodG9ucyhFVEhfUF84MDIxQUQpOgogCWNhc2UgaHRvbnMoRVRIX1BfODAyMVEpOiB7CiAJCWNvbnN0IHN0cnVjdCB2bGFuX2hkciAqdmxhbjsKLQkJc3RydWN0IHZsYW5faGRyIF92bGFuOwogCi0JCXZsYW4gPSBfX3NrYl9oZWFkZXJfcG9pbnRlcihza2IsIG5ob2ZmLCBzaXplb2YoX3ZsYW4pLCBkYXRhLCBobGVuLCAmX3ZsYW4pOwotCQlpZiAoIXZsYW4pCi0JCQlnb3RvIG91dF9iYWQ7CisJCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKQorCQkJcHJvdG8gPSBza2ItPnByb3RvY29sOwogCi0JCWlmIChkaXNzZWN0b3JfdXNlc19rZXkoZmxvd19kaXNzZWN0b3IsCi0JCQkJICAgICAgIEZMT1dfRElTU0VDVE9SX0tFWV9WTEFOSUQpKSB7Ci0JCQlrZXlfdGFncyA9IHNrYl9mbG93X2Rpc3NlY3Rvcl90YXJnZXQoZmxvd19kaXNzZWN0b3IsCi0JCQkJCQkJICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTklELAotCQkJCQkJCSAgICAgdGFyZ2V0X2NvbnRhaW5lcik7CisJCWlmICghc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSB8fAorCQkgICAgcHJvdG8gPT0gY3B1X3RvX2JlMTYoRVRIX1BfODAyMVEpIHx8CisJCSAgICBwcm90byA9PSBjcHVfdG9fYmUxNihFVEhfUF84MDIxQUQpKSB7CisJCQlzdHJ1Y3Qgdmxhbl9oZHIgX3ZsYW47CiAKLQkJCWtleV90YWdzLT52bGFuX2lkID0gc2tiX3ZsYW5fdGFnX2dldF9pZChza2IpOworCQkJdmxhbiA9IF9fc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYsIHNpemVvZihfdmxhbiksCisJCQkJCQkgICAgZGF0YSwgaGxlbiwgJl92bGFuKTsKKwkJCWlmICghdmxhbikKKwkJCQlnb3RvIG91dF9iYWQ7CisJCQlwcm90byA9IHZsYW4tPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CisJCQluaG9mZiArPSBzaXplb2YoKnZsYW4pOworCQkJaWYgKHNraXBfdmxhbikKKwkJCQlnb3RvIGFnYWluOwogCQl9CiAKLQkJcHJvdG8gPSB2bGFuLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvOwotCQluaG9mZiArPSBzaXplb2YoKnZsYW4pOworCQlza2lwX3ZsYW4gPSB0cnVlOworCQlpZiAoZGlzc2VjdG9yX3VzZXNfa2V5KGZsb3dfZGlzc2VjdG9yLAorCQkJCSAgICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfVkxBTikpIHsKKwkJCWtleV92bGFuID0gc2tiX2Zsb3dfZGlzc2VjdG9yX3RhcmdldChmbG93X2Rpc3NlY3RvciwKKwkJCQkJCQkgICAgIEZMT1dfRElTU0VDVE9SX0tFWV9WTEFOLAorCQkJCQkJCSAgICAgdGFyZ2V0X2NvbnRhaW5lcik7CisKKwkJCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSB7CisJCQkJa2V5X3ZsYW4tPnZsYW5faWQgPSBza2Jfdmxhbl90YWdfZ2V0X2lkKHNrYik7CisJCQkJa2V5X3ZsYW4tPnZsYW5fcHJpb3JpdHkgPQorCQkJCQkoc2tiX3ZsYW5fdGFnX2dldF9wcmlvKHNrYikgPj4gVkxBTl9QUklPX1NISUZUKTsKKwkJCX0gZWxzZSB7CisJCQkJa2V5X3ZsYW4tPnZsYW5faWQgPSBudG9ocyh2bGFuLT5oX3ZsYW5fVENJKSAmCisJCQkJCVZMQU5fVklEX01BU0s7CisJCQkJa2V5X3ZsYW4tPnZsYW5fcHJpb3JpdHkgPQorCQkJCQkobnRvaHModmxhbi0+aF92bGFuX1RDSSkgJgorCQkJCQkgVkxBTl9QUklPX01BU0spID4+IFZMQU5fUFJJT19TSElGVDsKKwkJCX0KKwkJfQorCiAJCWdvdG8gYWdhaW47CiAJfQogCWNhc2UgaHRvbnMoRVRIX1BfUFBQX1NFUyk6IHsKQEAgLTMzOCwzMiArMzY1LDQyIEBACiBpcF9wcm90b19hZ2FpbjoKIAlzd2l0Y2ggKGlwX3Byb3RvKSB7CiAJY2FzZSBJUFBST1RPX0dSRTogewotCQlzdHJ1Y3QgZ3JlX2hkciB7Ci0JCQlfX2JlMTYgZmxhZ3M7Ci0JCQlfX2JlMTYgcHJvdG87Ci0JCX0gKmhkciwgX2hkcjsKKwkJc3RydWN0IGdyZV9iYXNlX2hkciAqaGRyLCBfaGRyOworCQl1MTYgZ3JlX3ZlcjsKKwkJaW50IG9mZnNldCA9IDA7CiAKIAkJaGRyID0gX19za2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiwgc2l6ZW9mKF9oZHIpLCBkYXRhLCBobGVuLCAmX2hkcik7CiAJCWlmICghaGRyKQogCQkJZ290byBvdXRfYmFkOwotCQkvKgotCQkgKiBPbmx5IGxvb2sgaW5zaWRlIEdSRSBpZiB2ZXJzaW9uIHplcm8gYW5kIG5vCi0JCSAqIHJvdXRpbmcKLQkJICovCi0JCWlmIChoZHItPmZsYWdzICYgKEdSRV9WRVJTSU9OIHwgR1JFX1JPVVRJTkcpKQorCisJCS8qIE9ubHkgbG9vayBpbnNpZGUgR1JFIHdpdGhvdXQgcm91dGluZyAqLworCQlpZiAoaGRyLT5mbGFncyAmIEdSRV9ST1VUSU5HKQogCQkJYnJlYWs7CiAKLQkJcHJvdG8gPSBoZHItPnByb3RvOwotCQluaG9mZiArPSA0OworCQkvKiBPbmx5IGxvb2sgaW5zaWRlIEdSRSBmb3IgdmVyc2lvbiAwIGFuZCAxICovCisJCWdyZV92ZXIgPSBudG9ocyhoZHItPmZsYWdzICYgR1JFX1ZFUlNJT04pOworCQlpZiAoZ3JlX3ZlciA+IDEpCisJCQlicmVhazsKKworCQlwcm90byA9IGhkci0+cHJvdG9jb2w7CisJCWlmIChncmVfdmVyKSB7CisJCQkvKiBWZXJzaW9uMSBtdXN0IGJlIFBQVFAsIGFuZCBjaGVjayB0aGUgZmxhZ3MgKi8KKwkJCWlmICghKHByb3RvID09IEdSRV9QUk9UT19QUFAgJiYgKGhkci0+ZmxhZ3MgJiBHUkVfS0VZKSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBncmVfYmFzZV9oZHIpOworCiAJCWlmIChoZHItPmZsYWdzICYgR1JFX0NTVU0pCi0JCQluaG9mZiArPSA0OworCQkJb2Zmc2V0ICs9IHNpemVvZigoKHN0cnVjdCBncmVfZnVsbF9oZHIgKikwKS0+Y3N1bSkgKworCQkJCSAgc2l6ZW9mKCgoc3RydWN0IGdyZV9mdWxsX2hkciAqKTApLT5yZXNlcnZlZDEpOworCiAJCWlmIChoZHItPmZsYWdzICYgR1JFX0tFWSkgewogCQkJY29uc3QgX19iZTMyICprZXlpZDsKIAkJCV9fYmUzMiBfa2V5aWQ7CiAKLQkJCWtleWlkID0gX19za2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiwgc2l6ZW9mKF9rZXlpZCksCisJCQlrZXlpZCA9IF9fc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYgKyBvZmZzZXQsIHNpemVvZihfa2V5aWQpLAogCQkJCQkJICAgICBkYXRhLCBobGVuLCAmX2tleWlkKTsKLQogCQkJaWYgKCFrZXlpZCkKIAkJCQlnb3RvIG91dF9iYWQ7CiAKQEAgLTM3MiwzMiArNDA5LDY1IEBACiAJCQkJa2V5X2tleWlkID0gc2tiX2Zsb3dfZGlzc2VjdG9yX3RhcmdldChmbG93X2Rpc3NlY3RvciwKIAkJCQkJCQkJICAgICAgRkxPV19ESVNTRUNUT1JfS0VZX0dSRV9LRVlJRCwKIAkJCQkJCQkJICAgICAgdGFyZ2V0X2NvbnRhaW5lcik7Ci0JCQkJa2V5X2tleWlkLT5rZXlpZCA9ICprZXlpZDsKKwkJCQlpZiAoZ3JlX3ZlciA9PSAwKQorCQkJCQlrZXlfa2V5aWQtPmtleWlkID0gKmtleWlkOworCQkJCWVsc2UKKwkJCQkJa2V5X2tleWlkLT5rZXlpZCA9ICprZXlpZCAmIEdSRV9QUFRQX0tFWV9NQVNLOwogCQkJfQotCQkJbmhvZmYgKz0gNDsKKwkJCW9mZnNldCArPSBzaXplb2YoKChzdHJ1Y3QgZ3JlX2Z1bGxfaGRyICopMCktPmtleSk7CiAJCX0KKwogCQlpZiAoaGRyLT5mbGFncyAmIEdSRV9TRVEpCi0JCQluaG9mZiArPSA0OwotCQlpZiAocHJvdG8gPT0gaHRvbnMoRVRIX1BfVEVCKSkgewotCQkJY29uc3Qgc3RydWN0IGV0aGhkciAqZXRoOwotCQkJc3RydWN0IGV0aGhkciBfZXRoOworCQkJb2Zmc2V0ICs9IHNpemVvZigoKHN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgKikwKS0+c2VxKTsKIAotCQkJZXRoID0gX19za2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiwKLQkJCQkJCSAgIHNpemVvZihfZXRoKSwKLQkJCQkJCSAgIGRhdGEsIGhsZW4sICZfZXRoKTsKLQkJCWlmICghZXRoKQorCQlpZiAoZ3JlX3ZlciA9PSAwKSB7CisJCQlpZiAocHJvdG8gPT0gaHRvbnMoRVRIX1BfVEVCKSkgeworCQkJCWNvbnN0IHN0cnVjdCBldGhoZHIgKmV0aDsKKwkJCQlzdHJ1Y3QgZXRoaGRyIF9ldGg7CisKKwkJCQlldGggPSBfX3NrYl9oZWFkZXJfcG9pbnRlcihza2IsIG5ob2ZmICsgb2Zmc2V0LAorCQkJCQkJCSAgIHNpemVvZihfZXRoKSwKKwkJCQkJCQkgICBkYXRhLCBobGVuLCAmX2V0aCk7CisJCQkJaWYgKCFldGgpCisJCQkJCWdvdG8gb3V0X2JhZDsKKwkJCQlwcm90byA9IGV0aC0+aF9wcm90bzsKKwkJCQlvZmZzZXQgKz0gc2l6ZW9mKCpldGgpOworCisJCQkJLyogQ2FwIGhlYWRlcnMgdGhhdCB3ZSBhY2Nlc3MgdmlhIHBvaW50ZXJzIGF0IHRoZQorCQkJCSAqIGVuZCBvZiB0aGUgRXRoZXJuZXQgaGVhZGVyIGFzIG91ciBtYXhpbXVtIGFsaWdubWVudAorCQkJCSAqIGF0IHRoYXQgcG9pbnQgaXMgb25seSAyIGJ5dGVzLgorCQkJCSAqLworCQkJCWlmIChORVRfSVBfQUxJR04pCisJCQkJCWhsZW4gPSAobmhvZmYgKyBvZmZzZXQpOworCQkJfQorCQl9IGVsc2UgeyAvKiB2ZXJzaW9uIDEsIG11c3QgYmUgUFBUUCAqLworCQkJdTggX3BwcF9oZHJbUFBQX0hEUkxFTl07CisJCQl1OCAqcHBwX2hkcjsKKworCQkJaWYgKGhkci0+ZmxhZ3MgJiBHUkVfQUNLKQorCQkJCW9mZnNldCArPSBzaXplb2YoKChzdHJ1Y3QgcHB0cF9ncmVfaGVhZGVyICopMCktPmFjayk7CisKKwkJCXBwcF9oZHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiArIG9mZnNldCwKKwkJCQkJCSAgICAgc2l6ZW9mKF9wcHBfaGRyKSwgX3BwcF9oZHIpOworCQkJaWYgKCFwcHBfaGRyKQogCQkJCWdvdG8gb3V0X2JhZDsKLQkJCXByb3RvID0gZXRoLT5oX3Byb3RvOwotCQkJbmhvZmYgKz0gc2l6ZW9mKCpldGgpOwogCi0JCQkvKiBDYXAgaGVhZGVycyB0aGF0IHdlIGFjY2VzcyB2aWEgcG9pbnRlcnMgYXQgdGhlCi0JCQkgKiBlbmQgb2YgdGhlIEV0aGVybmV0IGhlYWRlciBhcyBvdXIgbWF4aW11bSBhbGlnbm1lbnQKLQkJCSAqIGF0IHRoYXQgcG9pbnQgaXMgb25seSAyIGJ5dGVzLgotCQkJICovCi0JCQlpZiAoTkVUX0lQX0FMSUdOKQotCQkJCWhsZW4gPSBuaG9mZjsKKwkJCXN3aXRjaCAoUFBQX1BST1RPQ09MKHBwcF9oZHIpKSB7CisJCQljYXNlIFBQUF9JUDoKKwkJCQlwcm90byA9IGh0b25zKEVUSF9QX0lQKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUFBQX0lQVjY6CisJCQkJcHJvdG8gPSBodG9ucyhFVEhfUF9JUFY2KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogQ291bGQgcHJvYmFibHkgY2F0Y2ggc29tZSBtb3JlIGxpa2UgTVBMUyAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQlvZmZzZXQgKz0gUFBQX0hEUkxFTjsKIAkJfQogCisJCW5ob2ZmICs9IG9mZnNldDsKIAkJa2V5X2NvbnRyb2wtPmZsYWdzIHw9IEZMT1dfRElTX0VOQ0FQU1VMQVRJT047CiAJCWlmIChmbGFncyAmIEZMT1dfRElTU0VDVE9SX0ZfU1RPUF9BVF9FTkNBUCkKIAkJCWdvdG8gb3V0X2dvb2Q7CkBAIC02ODAsMTEgKzc1MCwxMyBAQAogdm9pZCBfX3NrYl9nZXRfaGFzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBmbG93X2tleXMga2V5czsKKwl1MzIgaGFzaDsKIAogCV9fZmxvd19oYXNoX3NlY3JldF9pbml0KCk7CiAKLQlfX3NrYl9zZXRfc3dfaGFzaChza2IsIF9fX3NrYl9nZXRfaGFzaChza2IsICZrZXlzLCBoYXNocm5kKSwKLQkJCSAgZmxvd19rZXlzX2hhdmVfbDQoJmtleXMpKTsKKwloYXNoID0gX19fc2tiX2dldF9oYXNoKHNrYiwgJmtleXMsIGhhc2hybmQpOworCisJX19za2Jfc2V0X3N3X2hhc2goc2tiLCBoYXNoLCBmbG93X2tleXNfaGF2ZV9sNCgma2V5cykpOwogfQogRVhQT1JUX1NZTUJPTChfX3NrYl9nZXRfaGFzaCk7CiAKQEAgLTg3Miw4ICs5NDQsOCBAQAogCQkub2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGZsb3dfa2V5cywgcG9ydHMpLAogCX0sCiAJewotCQkua2V5X2lkID0gRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU5JRCwKLQkJLm9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBmbG93X2tleXMsIHRhZ3MpLAorCQkua2V5X2lkID0gRkxPV19ESVNTRUNUT1JfS0VZX1ZMQU4sCisJCS5vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgZmxvd19rZXlzLCB2bGFuKSwKIAl9LAogCXsKIAkJLmtleV9pZCA9IEZMT1dfRElTU0VDVE9SX0tFWV9GTE9XX0xBQkVMLApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvbHd0dW5uZWwuYyBiL25ldC9jb3JlL2x3dHVubmVsLmMKaW5kZXggNjY5ZWNjOS4uZTVmODRjMiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbHd0dW5uZWwuYworKysgYi9uZXQvY29yZS9sd3R1bm5lbC5jCkBAIC0yNTEsNiArMjUxLDQxIEBACiB9CiBFWFBPUlRfU1lNQk9MKGx3dHVubmVsX291dHB1dCk7CiAKK2ludCBsd3R1bm5lbF94bWl0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOworCWNvbnN0IHN0cnVjdCBsd3R1bm5lbF9lbmNhcF9vcHMgKm9wczsKKwlzdHJ1Y3QgbHd0dW5uZWxfc3RhdGUgKmx3dHN0YXRlOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKCFkc3QpCisJCWdvdG8gZHJvcDsKKworCWx3dHN0YXRlID0gZHN0LT5sd3RzdGF0ZTsKKworCWlmIChsd3RzdGF0ZS0+dHlwZSA9PSBMV1RVTk5FTF9FTkNBUF9OT05FIHx8CisJICAgIGx3dHN0YXRlLT50eXBlID4gTFdUVU5ORUxfRU5DQVBfTUFYKQorCQlyZXR1cm4gMDsKKworCXJldCA9IC1FT1BOT1RTVVBQOworCXJjdV9yZWFkX2xvY2soKTsKKwlvcHMgPSByY3VfZGVyZWZlcmVuY2UobHd0dW5fZW5jYXBzW2x3dHN0YXRlLT50eXBlXSk7CisJaWYgKGxpa2VseShvcHMgJiYgb3BzLT54bWl0KSkKKwkJcmV0ID0gb3BzLT54bWl0KHNrYik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAocmV0ID09IC1FT1BOT1RTVVBQKQorCQlnb3RvIGRyb3A7CisKKwlyZXR1cm4gcmV0OworCitkcm9wOgorCWtmcmVlX3NrYihza2IpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobHd0dW5uZWxfeG1pdCk7CisKIGludCBsd3R1bm5lbF9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25laWdoYm91ci5jIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKaW5kZXggY2YyNmUwNGM0Li4yYWU5MjlmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZWlnaGJvdXIuYworKysgYi9uZXQvY29yZS9uZWlnaGJvdXIuYwpAQCAtMTE0OCw3ICsxMTQ4LDggQEAKIAkJCX0gZWxzZQogCQkJCWdvdG8gb3V0OwogCQl9IGVsc2UgewotCQkJaWYgKGxsYWRkciA9PSBuZWlnaC0+aGEgJiYgbmV3ID09IE5VRF9TVEFMRSkKKwkJCWlmIChsbGFkZHIgPT0gbmVpZ2gtPmhhICYmIG5ldyA9PSBOVURfU1RBTEUgJiYKKwkJCSAgICAhKGZsYWdzICYgTkVJR0hfVVBEQVRFX0ZfQURNSU4pKQogCQkJCW5ldyA9IG9sZDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYyBiL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYwppbmRleCAyYzJlYjFiLi45ODk0MzRmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKKysrIGIvbmV0L2NvcmUvbmV0X25hbWVzcGFjZS5jCkBAIC0zNyw2ICszNyw4IEBACiB9OwogRVhQT1JUX1NZTUJPTChpbml0X25ldCk7CiAKK3N0YXRpYyBib29sIGluaXRfbmV0X2luaXRpYWxpemVkOworCiAjZGVmaW5lIElOSVRJQUxfTkVUX0dFTl9QVFJTCTEzIC8qICsxIGZvciBsZW4gKzIgZm9yIHJjdV9oZWFkICovCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWF4X2dlbl9wdHJzID0gSU5JVElBTF9ORVRfR0VOX1BUUlM7CkBAIC0yMTMsMzEgKzIxNSwyOSBAQAogICovCiBpbnQgcGVlcm5ldDJpZF9hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZXQgKnBlZXIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIGFsbG9jOwogCWludCBpZDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCWFsbG9jID0gYXRvbWljX3JlYWQoJnBlZXItPmNvdW50KSA9PSAwID8gZmFsc2UgOiB0cnVlOwogCWlkID0gX19wZWVybmV0MmlkX2FsbG9jKG5ldCwgcGVlciwgJmFsbG9jKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAJaWYgKGFsbG9jICYmIGlkID49IDApCiAJCXJ0bmxfbmV0X25vdGlmeWlkKG5ldCwgUlRNX05FV05TSUQsIGlkKTsKIAlyZXR1cm4gaWQ7CiB9Ci1FWFBPUlRfU1lNQk9MKHBlZXJuZXQyaWRfYWxsb2MpOwogCiAvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMsIGlmIGFzc2lnbmVkLCB0aGUgaWQgb2YgYSBwZWVyIG5ldG5zLiAqLwogaW50IHBlZXJuZXQyaWQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmV0ICpwZWVyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGlkOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm5ldC0+bnNpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAJaWQgPSBfX3BlZXJuZXQyaWQobmV0LCBwZWVyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAJcmV0dXJuIGlkOwogfQorRVhQT1JUX1NZTUJPTChwZWVybmV0MmlkKTsKIAogLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaXMgdGhlIHBlZXIgbmV0bnMgaGFzIGFuIGlkIGFzc2lnbmVkIGludG8gdGhlCiAgKiBjdXJyZW50IG5ldG5zLgpAQCAtMjQ5LDE4ICsyNDksMTcgQEAKIAogc3RydWN0IG5ldCAqZ2V0X25ldF9uc19ieV9pZChzdHJ1Y3QgbmV0ICpuZXQsIGludCBpZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBuZXQgKnBlZXI7CiAKIAlpZiAoaWQgPCAwKQogCQlyZXR1cm4gTlVMTDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAlwZWVyID0gaWRyX2ZpbmQoJm5ldC0+bmV0bnNfaWRzLCBpZCk7CiAJaWYgKHBlZXIpCiAJCWdldF9uZXQocGVlcik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHBlZXI7CkBAIC0zMTAsNiArMzA5LDE2IEBACiAKIAogI2lmZGVmIENPTkZJR19ORVRfTlMKK3N0YXRpYyBzdHJ1Y3QgdWNvdW50cyAqaW5jX25ldF9uYW1lc3BhY2VzKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMpCit7CisJcmV0dXJuIGluY191Y291bnQobnMsIGN1cnJlbnRfZXVpZCgpLCBVQ09VTlRfTkVUX05BTUVTUEFDRVMpOworfQorCitzdGF0aWMgdm9pZCBkZWNfbmV0X25hbWVzcGFjZXMoc3RydWN0IHVjb3VudHMgKnVjb3VudHMpCit7CisJZGVjX3Vjb3VudCh1Y291bnRzLCBVQ09VTlRfTkVUX05BTUVTUEFDRVMpOworfQorCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm5ldF9jYWNoZXA7CiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKm5ldG5zX3dxOwogCkBAIC0zNTEsMTkgKzM2MCwyNyBAQAogc3RydWN0IG5ldCAqY29weV9uZXRfbnModW5zaWduZWQgbG9uZyBmbGFncywKIAkJCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywgc3RydWN0IG5ldCAqb2xkX25ldCkKIHsKKwlzdHJ1Y3QgdWNvdW50cyAqdWNvdW50czsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CiAJaW50IHJ2OwogCiAJaWYgKCEoZmxhZ3MgJiBDTE9ORV9ORVdORVQpKQogCQlyZXR1cm4gZ2V0X25ldChvbGRfbmV0KTsKIAorCXVjb3VudHMgPSBpbmNfbmV0X25hbWVzcGFjZXModXNlcl9ucyk7CisJaWYgKCF1Y291bnRzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKKwogCW5ldCA9IG5ldF9hbGxvYygpOwotCWlmICghbmV0KQorCWlmICghbmV0KSB7CisJCWRlY19uZXRfbmFtZXNwYWNlcyh1Y291bnRzKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQogCiAJZ2V0X3VzZXJfbnModXNlcl9ucyk7CiAKIAltdXRleF9sb2NrKCZuZXRfbXV0ZXgpOworCW5ldC0+dWNvdW50cyA9IHVjb3VudHM7CiAJcnYgPSBzZXR1cF9uZXQobmV0LCB1c2VyX25zKTsKIAlpZiAocnYgPT0gMCkgewogCQlydG5sX2xvY2soKTsKQEAgLTM3Miw2ICszODksNyBAQAogCX0KIAltdXRleF91bmxvY2soJm5ldF9tdXRleCk7CiAJaWYgKHJ2IDwgMCkgeworCQlkZWNfbmV0X25hbWVzcGFjZXModWNvdW50cyk7CiAJCXB1dF91c2VyX25zKHVzZXJfbnMpOwogCQluZXRfZHJvcF9ucyhuZXQpOwogCQlyZXR1cm4gRVJSX1BUUihydik7CkBAIC00MDQsMTcgKzQyMiwxNyBAQAogCQlmb3JfZWFjaF9uZXQodG1wKSB7CiAJCQlpbnQgaWQ7CiAKLQkJCXNwaW5fbG9ja19pcnEoJnRtcC0+bnNpZF9sb2NrKTsKKwkJCXNwaW5fbG9ja19iaCgmdG1wLT5uc2lkX2xvY2spOwogCQkJaWQgPSBfX3BlZXJuZXQyaWQodG1wLCBuZXQpOwogCQkJaWYgKGlkID49IDApCiAJCQkJaWRyX3JlbW92ZSgmdG1wLT5uZXRuc19pZHMsIGlkKTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmdG1wLT5uc2lkX2xvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJnRtcC0+bnNpZF9sb2NrKTsKIAkJCWlmIChpZCA+PSAwKQogCQkJCXJ0bmxfbmV0X25vdGlmeWlkKHRtcCwgUlRNX0RFTE5TSUQsIGlkKTsKIAkJfQotCQlzcGluX2xvY2tfaXJxKCZuZXQtPm5zaWRfbG9jayk7CisJCXNwaW5fbG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCQlpZHJfZGVzdHJveSgmbmV0LT5uZXRuc19pZHMpOwotCQlzcGluX3VubG9ja19pcnEoJm5ldC0+bnNpZF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAogCX0KIAlydG5sX3VubG9jaygpOwpAQCAtNDQ0LDYgKzQ2Miw3IEBACiAJLyogRmluYWxseSBpdCBpcyBzYWZlIHRvIGZyZWUgbXkgbmV0d29yayBuYW1lc3BhY2Ugc3RydWN0dXJlICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5ldCwgdG1wLCAmbmV0X2V4aXRfbGlzdCwgZXhpdF9saXN0KSB7CiAJCWxpc3RfZGVsX2luaXQoJm5ldC0+ZXhpdF9saXN0KTsKKwkJZGVjX25ldF9uYW1lc3BhY2VzKG5ldC0+dWNvdW50cyk7CiAJCXB1dF91c2VyX25zKG5ldC0+dXNlcl9ucyk7CiAJCW5ldF9kcm9wX25zKG5ldCk7CiAJfQpAQCAtNTMxLDcgKzU1MCw3IEBACiAJLmV4aXQgPSBuZXRfbnNfbmV0X2V4aXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgcnRubF9uZXRfcG9saWN5W05FVE5TQV9NQVggKyAxXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBydG5sX25ldF9wb2xpY3lbTkVUTlNBX01BWCArIDFdID0gewogCVtORVROU0FfTk9ORV0JCT0geyAudHlwZSA9IE5MQV9VTlNQRUMgfSwKIAlbTkVUTlNBX05TSURdCQk9IHsgLnR5cGUgPSBOTEFfUzMyIH0sCiAJW05FVE5TQV9QSURdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCkBAIC01NDIsNyArNTYxLDYgQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKIAlzdHJ1Y3QgbmxhdHRyICp0YltORVROU0FfTUFYICsgMV07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbmV0ICpwZWVyOwogCWludCBuc2lkLCBlcnI7CiAKQEAgLTU2MywxNSArNTgxLDE1IEBACiAJaWYgKElTX0VSUihwZWVyKSkKIAkJcmV0dXJuIFBUUl9FUlIocGVlcik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAlpZiAoX19wZWVybmV0MmlkKG5ldCwgcGVlcikgPj0gMCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19iaCgmbmV0LT5uc2lkX2xvY2spOwogCQllcnIgPSAtRUVYSVNUOwogCQlnb3RvIG91dDsKIAl9CiAKIAllcnIgPSBhbGxvY19uZXRpZChuZXQsIHBlZXIsIG5zaWQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5ldC0+bnNpZF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAlpZiAoZXJyID49IDApIHsKIAkJcnRubF9uZXRfbm90aWZ5aWQobmV0LCBSVE1fTkVXTlNJRCwgZXJyKTsKIAkJZXJyID0gMDsKQEAgLTY5MywxMSArNzExLDEwIEBACiAJCS5pZHggPSAwLAogCQkuc19pZHggPSBjYi0+YXJnc1swXSwKIAl9OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbmV0LT5uc2lkX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+bnNpZF9sb2NrKTsKIAlpZHJfZm9yX2VhY2goJm5ldC0+bmV0bnNfaWRzLCBydG5sX25ldF9kdW1waWRfb25lLCAmbmV0X2NiKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZXQtPm5zaWRfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPm5zaWRfbG9jayk7CiAKIAljYi0+YXJnc1swXSA9IG5ldF9jYi5pZHg7CiAJcmV0dXJuIHNrYi0+bGVuOwpAQCAtNzUwLDYgKzc2Nyw4IEBACiAJaWYgKHNldHVwX25ldCgmaW5pdF9uZXQsICZpbml0X3VzZXJfbnMpKQogCQlwYW5pYygiQ291bGQgbm90IHNldHVwIHRoZSBpbml0aWFsIG5ldHdvcmsgbmFtZXNwYWNlIik7CiAKKwlpbml0X25ldF9pbml0aWFsaXplZCA9IHRydWU7CisKIAlydG5sX2xvY2soKTsKIAlsaXN0X2FkZF90YWlsX3JjdSgmaW5pdF9uZXQubGlzdCwgJm5ldF9uYW1lc3BhY2VfbGlzdCk7CiAJcnRubF91bmxvY2soKTsKQEAgLTgxMSwxNSArODMwLDI0IEBACiBzdGF0aWMgaW50IF9fcmVnaXN0ZXJfcGVybmV0X29wZXJhdGlvbnMoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwKIAkJCQkJc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zICpvcHMpCiB7CisJaWYgKCFpbml0X25ldF9pbml0aWFsaXplZCkgeworCQlsaXN0X2FkZF90YWlsKCZvcHMtPmxpc3QsIGxpc3QpOworCQlyZXR1cm4gMDsKKwl9CisKIAlyZXR1cm4gb3BzX2luaXQob3BzLCAmaW5pdF9uZXQpOwogfQogCiBzdGF0aWMgdm9pZCBfX3VucmVnaXN0ZXJfcGVybmV0X29wZXJhdGlvbnMoc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zICpvcHMpCiB7Ci0JTElTVF9IRUFEKG5ldF9leGl0X2xpc3QpOwotCWxpc3RfYWRkKCZpbml0X25ldC5leGl0X2xpc3QsICZuZXRfZXhpdF9saXN0KTsKLQlvcHNfZXhpdF9saXN0KG9wcywgJm5ldF9leGl0X2xpc3QpOwotCW9wc19mcmVlX2xpc3Qob3BzLCAmbmV0X2V4aXRfbGlzdCk7CisJaWYgKCFpbml0X25ldF9pbml0aWFsaXplZCkgeworCQlsaXN0X2RlbCgmb3BzLT5saXN0KTsKKwl9IGVsc2UgeworCQlMSVNUX0hFQUQobmV0X2V4aXRfbGlzdCk7CisJCWxpc3RfYWRkKCZpbml0X25ldC5leGl0X2xpc3QsICZuZXRfZXhpdF9saXN0KTsKKwkJb3BzX2V4aXRfbGlzdChvcHMsICZuZXRfZXhpdF9saXN0KTsKKwkJb3BzX2ZyZWVfbGlzdChvcHMsICZuZXRfZXhpdF9saXN0KTsKKwl9CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfTkVUX05TICovCkBAIC05OTYsMTEgKzEwMjQsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbmV0bnNfb3duZXIoc3RydWN0IG5zX2NvbW1vbiAqbnMpCit7CisJcmV0dXJuIHRvX25ldF9ucyhucyktPnVzZXJfbnM7Cit9CisKIGNvbnN0IHN0cnVjdCBwcm9jX25zX29wZXJhdGlvbnMgbmV0bnNfb3BlcmF0aW9ucyA9IHsKIAkubmFtZQkJPSAibmV0IiwKIAkudHlwZQkJPSBDTE9ORV9ORVdORVQsCiAJLmdldAkJPSBuZXRuc19nZXQsCiAJLnB1dAkJPSBuZXRuc19wdXQsCiAJLmluc3RhbGwJPSBuZXRuc19pbnN0YWxsLAorCS5vd25lcgkJPSBuZXRuc19vd25lciwKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3BrdGdlbi5jIGIvbmV0L2NvcmUvcGt0Z2VuLmMKaW5kZXggYmJkMTE4Yi4uNTIxOWE5ZSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcGt0Z2VuLmMKKysrIGIvbmV0L2NvcmUvcGt0Z2VuLmMKQEAgLTIyODYsNyArMjI4Niw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGt0X292ZXJoZWFkKHN0cnVjdCBwa3RnZW5fZGV2ICpwa3RfZGV2KQogewotCXBrdF9kZXYtPnBrdF9vdmVyaGVhZCA9IExMX1JFU0VSVkVEX1NQQUNFKHBrdF9kZXYtPm9kZXYpOworCXBrdF9kZXYtPnBrdF9vdmVyaGVhZCA9IDA7CiAJcGt0X2Rldi0+cGt0X292ZXJoZWFkICs9IHBrdF9kZXYtPm5yX2xhYmVscypzaXplb2YodTMyKTsKIAlwa3RfZGV2LT5wa3Rfb3ZlcmhlYWQgKz0gVkxBTl9UQUdfU0laRShwa3RfZGV2KTsKIAlwa3RfZGV2LT5wa3Rfb3ZlcmhlYWQgKz0gU1ZMQU5fVEFHX1NJWkUocGt0X2Rldik7CkBAIC0yNzc3LDEzICsyNzc3LDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcGt0Z2VuX2FsbG9jX3NrYihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldiwKLQkJCQkJdW5zaWduZWQgaW50IGV4dHJhbGVuKQorCQkJCQlzdHJ1Y3QgcGt0Z2VuX2RldiAqcGt0X2RldikKIHsKKwl1bnNpZ25lZCBpbnQgZXh0cmFsZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXVuc2lnbmVkIGludCBzaXplID0gcGt0X2Rldi0+Y3VyX3BrdF9zaXplICsgNjQgKyBleHRyYWxlbiArCi0JCQkgICAgcGt0X2Rldi0+cGt0X292ZXJoZWFkOworCXVuc2lnbmVkIGludCBzaXplOwogCisJc2l6ZSA9IHBrdF9kZXYtPmN1cl9wa3Rfc2l6ZSArIDY0ICsgZXh0cmFsZW4gKyBwa3RfZGV2LT5wa3Rfb3ZlcmhlYWQ7CiAJaWYgKHBrdF9kZXYtPmZsYWdzICYgRl9OT0RFKSB7CiAJCWludCBub2RlID0gcGt0X2Rldi0+bm9kZSA+PSAwID8gcGt0X2Rldi0+bm9kZSA6IG51bWFfbm9kZV9pZCgpOwogCkBAIC0yNzk2LDggKzI3OTYsOSBAQAogCQkgc2tiID0gX19uZXRkZXZfYWxsb2Nfc2tiKGRldiwgc2l6ZSwgR0ZQX05PV0FJVCk7CiAJfQogCisJLyogdGhlIGNhbGxlciBwcmUtZmV0Y2hlcyBmcm9tIHNrYi0+ZGF0YSBhbmQgcmVzZXJ2ZXMgZm9yIHRoZSBtYWMgaGRyICovCiAJaWYgKGxpa2VseShza2IpKQotCQlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOworCQlza2JfcmVzZXJ2ZShza2IsIGV4dHJhbGVuIC0gMTYpOwogCiAJcmV0dXJuIHNrYjsKIH0KQEAgLTI4MzAsMTYgKzI4MzEsMTQgQEAKIAltb2RfY3VyX2hlYWRlcnMocGt0X2Rldik7CiAJcXVldWVfbWFwID0gcGt0X2Rldi0+Y3VyX3F1ZXVlX21hcDsKIAotCWRhdGFsZW4gPSAob2Rldi0+aGFyZF9oZWFkZXJfbGVuICsgMTYpICYgfjB4ZjsKLQotCXNrYiA9IHBrdGdlbl9hbGxvY19za2Iob2RldiwgcGt0X2RldiwgZGF0YWxlbik7CisJc2tiID0gcGt0Z2VuX2FsbG9jX3NrYihvZGV2LCBwa3RfZGV2KTsKIAlpZiAoIXNrYikgewogCQlzcHJpbnRmKHBrdF9kZXYtPnJlc3VsdCwgIk5vIG1lbW9yeSIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlwcmVmZXRjaHcoc2tiLT5kYXRhKTsKLQlza2JfcmVzZXJ2ZShza2IsIGRhdGFsZW4pOworCXNrYl9yZXNlcnZlKHNrYiwgMTYpOwogCiAJLyogIFJlc2VydmUgZm9yIGV0aGVybmV0IGFuZCBJUCBoZWFkZXIgICovCiAJZXRoID0gKF9fdTggKikgc2tiX3B1c2goc2tiLCAxNCk7CkBAIC0yOTU5LDcgKzI5NTgsNyBAQAogCW1vZF9jdXJfaGVhZGVycyhwa3RfZGV2KTsKIAlxdWV1ZV9tYXAgPSBwa3RfZGV2LT5jdXJfcXVldWVfbWFwOwogCi0Jc2tiID0gcGt0Z2VuX2FsbG9jX3NrYihvZGV2LCBwa3RfZGV2LCAxNik7CisJc2tiID0gcGt0Z2VuX2FsbG9jX3NrYihvZGV2LCBwa3RfZGV2KTsKIAlpZiAoIXNrYikgewogCQlzcHJpbnRmKHBrdF9kZXYtPnJlc3VsdCwgIk5vIG1lbW9yeSIpOwogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3J0bmV0bGluay5jIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKaW5kZXggMTg5Y2M3OC4uYjA2ZDJmNCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMKKysrIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKQEAgLTcwNCw2ICs3MDQsOCBAQAogCQkJfSBlbHNlIGlmIChpID09IFJUQVhfRkVBVFVSRVMgLSAxKSB7CiAJCQkJdTMyIHVzZXJfZmVhdHVyZXMgPSBtZXRyaWNzW2ldICYgUlRBWF9GRUFUVVJFX01BU0s7CiAKKwkJCQlpZiAoIXVzZXJfZmVhdHVyZXMpCisJCQkJCWNvbnRpbnVlOwogCQkJCUJVSUxEX0JVR19PTihSVEFYX0ZFQVRVUkVfTUFTSyAmIERTVF9GRUFUVVJFX01BU0spOwogCQkJCWlmIChubGFfcHV0X3UzMihza2IsIGkgKyAxLCB1c2VyX2ZlYXR1cmVzKSkKIAkJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CkBAIC04NDEsNyArODQzLDEwIEBACiAJCXNpemUgKz0gbmxhX3RvdGFsX3NpemUobnVtX3ZmcyAqIHNpemVvZihzdHJ1Y3QgbmxhdHRyKSk7CiAJCXNpemUgKz0gbnVtX3ZmcyAqCiAJCQkobmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX21hYykpICsKLQkJCSBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGlmbGFfdmZfdmxhbikpICsKKwkJCSBubGFfdG90YWxfc2l6ZShNQVhfVkxBTl9MSVNUX0xFTiAqCisJCQkJCXNpemVvZihzdHJ1Y3QgbmxhdHRyKSkgKworCQkJIG5sYV90b3RhbF9zaXplKE1BWF9WTEFOX0xJU1RfTEVOICoKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3ZsYW5faW5mbykpICsKIAkJCSBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGlmbGFfdmZfc3Bvb2ZjaGspKSArCiAJCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3JhdGUpKSArCiAJCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX2xpbmtfc3RhdGUpKSArCkBAIC0xMTA5LDE0ICsxMTE0LDE1IEBACiAJCQkJCSAgICAgICBzdHJ1Y3QgbmxhdHRyICp2ZmluZm8pCiB7CiAJc3RydWN0IGlmbGFfdmZfcnNzX3F1ZXJ5X2VuIHZmX3Jzc19xdWVyeV9lbjsKKwlzdHJ1Y3QgbmxhdHRyICp2ZiwgKnZmc3RhdHMsICp2ZnZsYW5saXN0OwogCXN0cnVjdCBpZmxhX3ZmX2xpbmtfc3RhdGUgdmZfbGlua3N0YXRlOworCXN0cnVjdCBpZmxhX3ZmX3ZsYW5faW5mbyB2Zl92bGFuX2luZm87CiAJc3RydWN0IGlmbGFfdmZfc3Bvb2ZjaGsgdmZfc3Bvb2ZjaGs7CiAJc3RydWN0IGlmbGFfdmZfdHhfcmF0ZSB2Zl90eF9yYXRlOwogCXN0cnVjdCBpZmxhX3ZmX3N0YXRzIHZmX3N0YXRzOwogCXN0cnVjdCBpZmxhX3ZmX3RydXN0IHZmX3RydXN0OwogCXN0cnVjdCBpZmxhX3ZmX3ZsYW4gdmZfdmxhbjsKIAlzdHJ1Y3QgaWZsYV92Zl9yYXRlIHZmX3JhdGU7Ci0Jc3RydWN0IG5sYXR0ciAqdmYsICp2ZnN0YXRzOwogCXN0cnVjdCBpZmxhX3ZmX21hYyB2Zl9tYWM7CiAJc3RydWN0IGlmbGFfdmZfaW5mbyBpdmk7CiAKQEAgLTExMzMsMTEgKzExMzksMTQgQEAKIAkgKiBJRkxBX1ZGX0xJTktfU1RBVEVfQVVUTyB3aGljaCBlcXVhbHMgemVybwogCSAqLwogCWl2aS5saW5rc3RhdGUgPSAwOworCS8qIFZMQU4gUHJvdG9jb2wgYnkgZGVmYXVsdCBpcyA4MDIuMVEgKi8KKwlpdmkudmxhbl9wcm90byA9IGh0b25zKEVUSF9QXzgwMjFRKTsKIAlpZiAoZGV2LT5uZXRkZXZfb3BzLT5uZG9fZ2V0X3ZmX2NvbmZpZyhkZXYsIHZmc19udW0sICZpdmkpKQogCQlyZXR1cm4gMDsKIAogCXZmX21hYy52ZiA9CiAJCXZmX3ZsYW4udmYgPQorCQl2Zl92bGFuX2luZm8udmYgPQogCQl2Zl9yYXRlLnZmID0KIAkJdmZfdHhfcmF0ZS52ZiA9CiAJCXZmX3Nwb29mY2hrLnZmID0KQEAgLTExNDgsNiArMTE1Nyw5IEBACiAJbWVtY3B5KHZmX21hYy5tYWMsIGl2aS5tYWMsIHNpemVvZihpdmkubWFjKSk7CiAJdmZfdmxhbi52bGFuID0gaXZpLnZsYW47CiAJdmZfdmxhbi5xb3MgPSBpdmkucW9zOworCXZmX3ZsYW5faW5mby52bGFuID0gaXZpLnZsYW47CisJdmZfdmxhbl9pbmZvLnFvcyA9IGl2aS5xb3M7CisJdmZfdmxhbl9pbmZvLnZsYW5fcHJvdG8gPSBpdmkudmxhbl9wcm90bzsKIAl2Zl90eF9yYXRlLnJhdGUgPSBpdmkubWF4X3R4X3JhdGU7CiAJdmZfcmF0ZS5taW5fdHhfcmF0ZSA9IGl2aS5taW5fdHhfcmF0ZTsKIAl2Zl9yYXRlLm1heF90eF9yYXRlID0gaXZpLm1heF90eF9yYXRlOwpAQCAtMTE1NiwxMCArMTE2OCw4IEBACiAJdmZfcnNzX3F1ZXJ5X2VuLnNldHRpbmcgPSBpdmkucnNzX3F1ZXJ5X2VuOwogCXZmX3RydXN0LnNldHRpbmcgPSBpdmkudHJ1c3RlZDsKIAl2ZiA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgSUZMQV9WRl9JTkZPKTsKLQlpZiAoIXZmKSB7Ci0JCW5sYV9uZXN0X2NhbmNlbChza2IsIHZmaW5mbyk7Ci0JCXJldHVybiAtRU1TR1NJWkU7Ci0JfQorCWlmICghdmYpCisJCWdvdG8gbmxhX3B1dF92ZmluZm9fZmFpbHVyZTsKIAlpZiAobmxhX3B1dChza2IsIElGTEFfVkZfTUFDLCBzaXplb2YodmZfbWFjKSwgJnZmX21hYykgfHwKIAkgICAgbmxhX3B1dChza2IsIElGTEFfVkZfVkxBTiwgc2l6ZW9mKHZmX3ZsYW4pLCAmdmZfdmxhbikgfHwKIAkgICAgbmxhX3B1dChza2IsIElGTEFfVkZfUkFURSwgc2l6ZW9mKHZmX3JhdGUpLApAQCAtMTE3NSwxNyArMTE4NSwyMyBAQAogCQkgICAgJnZmX3Jzc19xdWVyeV9lbikgfHwKIAkgICAgbmxhX3B1dChza2IsIElGTEFfVkZfVFJVU1QsCiAJCSAgICBzaXplb2YodmZfdHJ1c3QpLCAmdmZfdHJ1c3QpKQotCQlyZXR1cm4gLUVNU0dTSVpFOworCQlnb3RvIG5sYV9wdXRfdmZfZmFpbHVyZTsKKwl2ZnZsYW5saXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBJRkxBX1ZGX1ZMQU5fTElTVCk7CisJaWYgKCF2ZnZsYW5saXN0KQorCQlnb3RvIG5sYV9wdXRfdmZfZmFpbHVyZTsKKwlpZiAobmxhX3B1dChza2IsIElGTEFfVkZfVkxBTl9JTkZPLCBzaXplb2YodmZfdmxhbl9pbmZvKSwKKwkJICAgICZ2Zl92bGFuX2luZm8pKSB7CisJCW5sYV9uZXN0X2NhbmNlbChza2IsIHZmdmxhbmxpc3QpOworCQlnb3RvIG5sYV9wdXRfdmZfZmFpbHVyZTsKKwl9CisJbmxhX25lc3RfZW5kKHNrYiwgdmZ2bGFubGlzdCk7CiAJbWVtc2V0KCZ2Zl9zdGF0cywgMCwgc2l6ZW9mKHZmX3N0YXRzKSk7CiAJaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX2dldF92Zl9zdGF0cykKIAkJZGV2LT5uZXRkZXZfb3BzLT5uZG9fZ2V0X3ZmX3N0YXRzKGRldiwgdmZzX251bSwKIAkJCQkJCSZ2Zl9zdGF0cyk7CiAJdmZzdGF0cyA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgSUZMQV9WRl9TVEFUUyk7Ci0JaWYgKCF2ZnN0YXRzKSB7Ci0JCW5sYV9uZXN0X2NhbmNlbChza2IsIHZmKTsKLQkJbmxhX25lc3RfY2FuY2VsKHNrYiwgdmZpbmZvKTsKLQkJcmV0dXJuIC1FTVNHU0laRTsKLQl9CisJaWYgKCF2ZnN0YXRzKQorCQlnb3RvIG5sYV9wdXRfdmZfZmFpbHVyZTsKIAlpZiAobmxhX3B1dF91NjRfNjRiaXQoc2tiLCBJRkxBX1ZGX1NUQVRTX1JYX1BBQ0tFVFMsCiAJCQkgICAgICB2Zl9zdGF0cy5yeF9wYWNrZXRzLCBJRkxBX1ZGX1NUQVRTX1BBRCkgfHwKIAkgICAgbmxhX3B1dF91NjRfNjRiaXQoc2tiLCBJRkxBX1ZGX1NUQVRTX1RYX1BBQ0tFVFMsCkBAIC0xMTk3LDExICsxMjEzLDE5IEBACiAJICAgIG5sYV9wdXRfdTY0XzY0Yml0KHNrYiwgSUZMQV9WRl9TVEFUU19CUk9BRENBU1QsCiAJCQkgICAgICB2Zl9zdGF0cy5icm9hZGNhc3QsIElGTEFfVkZfU1RBVFNfUEFEKSB8fAogCSAgICBubGFfcHV0X3U2NF82NGJpdChza2IsIElGTEFfVkZfU1RBVFNfTVVMVElDQVNULAotCQkJICAgICAgdmZfc3RhdHMubXVsdGljYXN0LCBJRkxBX1ZGX1NUQVRTX1BBRCkpCi0JCXJldHVybiAtRU1TR1NJWkU7CisJCQkgICAgICB2Zl9zdGF0cy5tdWx0aWNhc3QsIElGTEFfVkZfU1RBVFNfUEFEKSkgeworCQlubGFfbmVzdF9jYW5jZWwoc2tiLCB2ZnN0YXRzKTsKKwkJZ290byBubGFfcHV0X3ZmX2ZhaWx1cmU7CisJfQogCW5sYV9uZXN0X2VuZChza2IsIHZmc3RhdHMpOwogCW5sYV9uZXN0X2VuZChza2IsIHZmKTsKIAlyZXR1cm4gMDsKKworbmxhX3B1dF92Zl9mYWlsdXJlOgorCW5sYV9uZXN0X2NhbmNlbChza2IsIHZmKTsKK25sYV9wdXRfdmZpbmZvX2ZhaWx1cmU6CisJbmxhX25lc3RfY2FuY2VsKHNrYiwgdmZpbmZvKTsKKwlyZXR1cm4gLUVNU0dTSVpFOwogfQogCiBzdGF0aWMgaW50IHJ0bmxfZmlsbF9saW5rX2lmbWFwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xNDQ2LDYgKzE0NzAsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGlmbGFfdmZfcG9saWN5W0lGTEFfVkZfTUFYKzFdID0gewogCVtJRkxBX1ZGX01BQ10JCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX21hYykgfSwKIAlbSUZMQV9WRl9WTEFOXQkJPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGlmbGFfdmZfdmxhbikgfSwKKwlbSUZMQV9WRl9WTEFOX0xJU1RdICAgICA9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCiAJW0lGTEFfVkZfVFhfUkFURV0JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGlmbGFfdmZfdHhfcmF0ZSkgfSwKIAlbSUZMQV9WRl9TUE9PRkNIS10JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGlmbGFfdmZfc3Bvb2ZjaGspIH0sCiAJW0lGTEFfVkZfUkFURV0JCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3JhdGUpIH0sCkBAIC0xNzAyLDcgKzE3MjcsMzcgQEAKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWlmIChvcHMtPm5kb19zZXRfdmZfdmxhbikKIAkJCWVyciA9IG9wcy0+bmRvX3NldF92Zl92bGFuKGRldiwgaXZ2LT52ZiwgaXZ2LT52bGFuLAotCQkJCQkJICAgaXZ2LT5xb3MpOworCQkJCQkJICAgaXZ2LT5xb3MsCisJCQkJCQkgICBodG9ucyhFVEhfUF84MDIxUSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHRiW0lGTEFfVkZfVkxBTl9MSVNUXSkgeworCQlzdHJ1Y3QgaWZsYV92Zl92bGFuX2luZm8gKml2dmxbTUFYX1ZMQU5fTElTVF9MRU5dOworCQlzdHJ1Y3QgbmxhdHRyICphdHRyOworCQlpbnQgcmVtLCBsZW4gPSAwOworCisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlpZiAoIW9wcy0+bmRvX3NldF92Zl92bGFuKQorCQkJcmV0dXJuIGVycjsKKworCQlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIHRiW0lGTEFfVkZfVkxBTl9MSVNUXSwgcmVtKSB7CisJCQlpZiAobmxhX3R5cGUoYXR0cikgIT0gSUZMQV9WRl9WTEFOX0lORk8gfHwKKwkJCSAgICBubGFfbGVuKGF0dHIpIDwgTkxBX0hEUkxFTikgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKGxlbiA+PSBNQVhfVkxBTl9MSVNUX0xFTikKKwkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQlpdnZsW2xlbl0gPSBubGFfZGF0YShhdHRyKTsKKworCQkJbGVuKys7CisJCX0KKwkJaWYgKGxlbiA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZXJyID0gb3BzLT5uZG9fc2V0X3ZmX3ZsYW4oZGV2LCBpdnZsWzBdLT52ZiwgaXZ2bFswXS0+dmxhbiwKKwkJCQkJICAgaXZ2bFswXS0+cW9zLCBpdnZsWzBdLT52bGFuX3Byb3RvKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwogCX0KQEAgLTMwNjYsNyArMzEyMSw3IEBACiAJc2VxID0gY2ItPm5saC0+bmxtc2dfc2VxOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShoYSwgJmxpc3QtPmxpc3QsIGxpc3QpIHsKLQkJaWYgKCppZHggPCBjYi0+YXJnc1swXSkKKwkJaWYgKCppZHggPCBjYi0+YXJnc1syXSkKIAkJCWdvdG8gc2tpcDsKIAogCQllcnIgPSBubG1zZ19wb3B1bGF0ZV9mZGJfZmlsbChza2IsIGRldiwgaGEtPmFkZHIsIDAsCkBAIC0zMDkzLDE5ICszMTQ4LDE4IEBACiAJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsCi0JCSAgICAgIGludCBpZHgpCisJCSAgICAgIGludCAqaWR4KQogewogCWludCBlcnI7CiAKIAluZXRpZl9hZGRyX2xvY2tfYmgoZGV2KTsKLQllcnIgPSBubG1zZ19wb3B1bGF0ZV9mZGIoc2tiLCBjYiwgZGV2LCAmaWR4LCAmZGV2LT51Yyk7CisJZXJyID0gbmxtc2dfcG9wdWxhdGVfZmRiKHNrYiwgY2IsIGRldiwgaWR4LCAmZGV2LT51Yyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7Ci0Jbmxtc2dfcG9wdWxhdGVfZmRiKHNrYiwgY2IsIGRldiwgJmlkeCwgJmRldi0+bWMpOworCW5sbXNnX3BvcHVsYXRlX2ZkYihza2IsIGNiLCBkZXYsIGlkeCwgJmRldi0+bWMpOwogb3V0OgogCW5ldGlmX2FkZHJfdW5sb2NrX2JoKGRldik7Ci0JY2ItPmFyZ3NbMV0gPSBlcnI7Ci0JcmV0dXJuIGlkeDsKKwlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChuZG9fZGZsdF9mZGJfZHVtcCk7CiAKQEAgLTMxMTgsOSArMzE3MiwxMyBAQAogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqY29wcyA9IE5VTEw7CiAJc3RydWN0IGlmaW5mb21zZyAqaWZtID0gbmxtc2dfZGF0YShjYi0+bmxoKTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKIAlpbnQgYnJwb3J0X2lkeCA9IDA7CiAJaW50IGJyX2lkeCA9IDA7Ci0JaW50IGlkeCA9IDA7CisJaW50IGgsIHNfaDsKKwlpbnQgaWR4ID0gMCwgc19pZHg7CisJaW50IGVyciA9IDA7CisJaW50IGZpZHggPSAwOwogCiAJaWYgKG5sbXNnX3BhcnNlKGNiLT5ubGgsIHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSwgdGIsIElGTEFfTUFYLAogCQkJaWZsYV9wb2xpY3kpID09IDApIHsKQEAgLTMxMzgsNDkgKzMxOTYsNzEgQEAKIAkJb3BzID0gYnJfZGV2LT5uZXRkZXZfb3BzOwogCX0KIAotCWNiLT5hcmdzWzFdID0gMDsKLQlmb3JfZWFjaF9uZXRkZXYobmV0LCBkZXYpIHsKLQkJaWYgKGJycG9ydF9pZHggJiYgKGRldi0+aWZpbmRleCAhPSBicnBvcnRfaWR4KSkKLQkJCWNvbnRpbnVlOworCXNfaCA9IGNiLT5hcmdzWzBdOworCXNfaWR4ID0gY2ItPmFyZ3NbMV07CiAKLQkJaWYgKCFicl9pZHgpIHsgLyogdXNlciBkaWQgbm90IHNwZWNpZnkgYSBzcGVjaWZpYyBicmlkZ2UgKi8KLQkJCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfQlJJREdFX1BPUlQpIHsKLQkJCQlicl9kZXYgPSBuZXRkZXZfbWFzdGVyX3VwcGVyX2Rldl9nZXQoZGV2KTsKLQkJCQljb3BzID0gYnJfZGV2LT5uZXRkZXZfb3BzOworCWZvciAoaCA9IHNfaDsgaCA8IE5FVERFVl9IQVNIRU5UUklFUzsgaCsrLCBzX2lkeCA9IDApIHsKKwkJaWR4ID0gMDsKKwkJaGVhZCA9ICZuZXQtPmRldl9pbmRleF9oZWFkW2hdOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsIGhlYWQsIGluZGV4X2hsaXN0KSB7CisKKwkJCWlmIChicnBvcnRfaWR4ICYmIChkZXYtPmlmaW5kZXggIT0gYnJwb3J0X2lkeCkpCisJCQkJY29udGludWU7CisKKwkJCWlmICghYnJfaWR4KSB7IC8qIHVzZXIgZGlkIG5vdCBzcGVjaWZ5IGEgc3BlY2lmaWMgYnJpZGdlICovCisJCQkJaWYgKGRldi0+cHJpdl9mbGFncyAmIElGRl9CUklER0VfUE9SVCkgeworCQkJCQlicl9kZXYgPSBuZXRkZXZfbWFzdGVyX3VwcGVyX2Rldl9nZXQoZGV2KTsKKwkJCQkJY29wcyA9IGJyX2Rldi0+bmV0ZGV2X29wczsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChkZXYgIT0gYnJfZGV2ICYmCisJCQkJICAgICEoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlpZiAoYnJfZGV2ICE9IG5ldGRldl9tYXN0ZXJfdXBwZXJfZGV2X2dldChkZXYpICYmCisJCQkJICAgICEoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0VCUklER0UpKQorCQkJCQljb250aW51ZTsKKwkJCQljb3BzID0gb3BzOwogCQkJfQogCi0JCX0gZWxzZSB7Ci0JCQlpZiAoZGV2ICE9IGJyX2RldiAmJgotCQkJICAgICEoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUKSkKLQkJCQljb250aW51ZTsKKwkJCWlmIChpZHggPCBzX2lkeCkKKwkJCQlnb3RvIGNvbnQ7CiAKLQkJCWlmIChicl9kZXYgIT0gbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0KGRldikgJiYKLQkJCSAgICAhKGRldi0+cHJpdl9mbGFncyAmIElGRl9FQlJJREdFKSkKLQkJCQljb250aW51ZTsKKwkJCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfQlJJREdFX1BPUlQpIHsKKwkJCQlpZiAoY29wcyAmJiBjb3BzLT5uZG9fZmRiX2R1bXApIHsKKwkJCQkJZXJyID0gY29wcy0+bmRvX2ZkYl9kdW1wKHNrYiwgY2IsCisJCQkJCQkJCWJyX2RldiwgZGV2LAorCQkJCQkJCQkmZmlkeCk7CisJCQkJCWlmIChlcnIgPT0gLUVNU0dTSVpFKQorCQkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQogCi0JCQljb3BzID0gb3BzOworCQkJaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX2ZkYl9kdW1wKQorCQkJCWVyciA9IGRldi0+bmV0ZGV2X29wcy0+bmRvX2ZkYl9kdW1wKHNrYiwgY2IsCisJCQkJCQkJCSAgICBkZXYsIE5VTEwsCisJCQkJCQkJCSAgICAmZmlkeCk7CisJCQllbHNlCisJCQkJZXJyID0gbmRvX2RmbHRfZmRiX2R1bXAoc2tiLCBjYiwgZGV2LCBOVUxMLAorCQkJCQkJCSZmaWR4KTsKKwkJCWlmIChlcnIgPT0gLUVNU0dTSVpFKQorCQkJCWdvdG8gb3V0OworCisJCQljb3BzID0gTlVMTDsKKworCQkJLyogcmVzZXQgZmRiIG9mZnNldCB0byAwIGZvciByZXN0IG9mIHRoZSBpbnRlcmZhY2VzICovCisJCQljYi0+YXJnc1syXSA9IDA7CisJCQlmaWR4ID0gMDsKK2NvbnQ6CisJCQlpZHgrKzsKIAkJfQotCi0JCWlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfQlJJREdFX1BPUlQpIHsKLQkJCWlmIChjb3BzICYmIGNvcHMtPm5kb19mZGJfZHVtcCkKLQkJCQlpZHggPSBjb3BzLT5uZG9fZmRiX2R1bXAoc2tiLCBjYiwgYnJfZGV2LCBkZXYsCi0JCQkJCQkJIGlkeCk7Ci0JCX0KLQkJaWYgKGNiLT5hcmdzWzFdID09IC1FTVNHU0laRSkKLQkJCWJyZWFrOwotCi0JCWlmIChkZXYtPm5ldGRldl9vcHMtPm5kb19mZGJfZHVtcCkKLQkJCWlkeCA9IGRldi0+bmV0ZGV2X29wcy0+bmRvX2ZkYl9kdW1wKHNrYiwgY2IsIGRldiwgTlVMTCwKLQkJCQkJCQkgICAgaWR4KTsKLQkJZWxzZQotCQkJaWR4ID0gbmRvX2RmbHRfZmRiX2R1bXAoc2tiLCBjYiwgZGV2LCBOVUxMLCBpZHgpOwotCQlpZiAoY2ItPmFyZ3NbMV0gPT0gLUVNU0dTSVpFKQotCQkJYnJlYWs7Ci0KLQkJY29wcyA9IE5VTEw7CiAJfQogCi0JY2ItPmFyZ3NbMF0gPSBpZHg7CitvdXQ6CisJY2ItPmFyZ3NbMF0gPSBoOworCWNiLT5hcmdzWzFdID0gaWR4OworCWNiLT5hcmdzWzJdID0gZmlkeDsKKwogCXJldHVybiBza2ItPmxlbjsKIH0KIApAQCAtMzU1MCw2ICszNjMwLDkxIEBACiAJICAgICAgICghaWR4YXR0ciB8fCBpZHhhdHRyID09IGF0dHJpZCk7CiB9CiAKKyNkZWZpbmUgSUZMQV9PRkZMT0FEX1hTVEFUU19GSVJTVCAoSUZMQV9PRkZMT0FEX1hTVEFUU19VTlNQRUMgKyAxKQorc3RhdGljIGludCBydG5sX2dldF9vZmZsb2FkX3N0YXRzX2F0dHJfc2l6ZShpbnQgYXR0cl9pZCkKK3sKKwlzd2l0Y2ggKGF0dHJfaWQpIHsKKwljYXNlIElGTEFfT0ZGTE9BRF9YU1RBVFNfQ1BVX0hJVDoKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bmxfZ2V0X29mZmxvYWRfc3RhdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIGludCAqcHJpdmlkeCkKK3sKKwlzdHJ1Y3QgbmxhdHRyICphdHRyID0gTlVMTDsKKwlpbnQgYXR0cl9pZCwgc2l6ZTsKKwl2b2lkICphdHRyX2RhdGE7CisJaW50IGVycjsKKworCWlmICghKGRldi0+bmV0ZGV2X29wcyAmJiBkZXYtPm5ldGRldl9vcHMtPm5kb19oYXNfb2ZmbG9hZF9zdGF0cyAmJgorCSAgICAgIGRldi0+bmV0ZGV2X29wcy0+bmRvX2dldF9vZmZsb2FkX3N0YXRzKSkKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJZm9yIChhdHRyX2lkID0gSUZMQV9PRkZMT0FEX1hTVEFUU19GSVJTVDsKKwkgICAgIGF0dHJfaWQgPD0gSUZMQV9PRkZMT0FEX1hTVEFUU19NQVg7IGF0dHJfaWQrKykgeworCQlpZiAoYXR0cl9pZCA8ICpwcml2aWR4KQorCQkJY29udGludWU7CisKKwkJc2l6ZSA9IHJ0bmxfZ2V0X29mZmxvYWRfc3RhdHNfYXR0cl9zaXplKGF0dHJfaWQpOworCQlpZiAoIXNpemUpCisJCQljb250aW51ZTsKKworCQlpZiAoIWRldi0+bmV0ZGV2X29wcy0+bmRvX2hhc19vZmZsb2FkX3N0YXRzKGF0dHJfaWQpKQorCQkJY29udGludWU7CisKKwkJYXR0ciA9IG5sYV9yZXNlcnZlXzY0Yml0KHNrYiwgYXR0cl9pZCwgc2l6ZSwKKwkJCQkJIElGTEFfT0ZGTE9BRF9YU1RBVFNfVU5TUEVDKTsKKwkJaWYgKCFhdHRyKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwkJYXR0cl9kYXRhID0gbmxhX2RhdGEoYXR0cik7CisJCW1lbXNldChhdHRyX2RhdGEsIDAsIHNpemUpOworCQllcnIgPSBkZXYtPm5ldGRldl9vcHMtPm5kb19nZXRfb2ZmbG9hZF9zdGF0cyhhdHRyX2lkLCBkZXYsCisJCQkJCQkJICAgICBhdHRyX2RhdGEpOworCQlpZiAoZXJyKQorCQkJZ290byBnZXRfb2ZmbG9hZF9zdGF0c19mYWlsdXJlOworCX0KKworCWlmICghYXR0cikKKwkJcmV0dXJuIC1FTk9EQVRBOworCisJKnByaXZpZHggPSAwOworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJZXJyID0gLUVNU0dTSVpFOworZ2V0X29mZmxvYWRfc3RhdHNfZmFpbHVyZToKKwkqcHJpdmlkeCA9IGF0dHJfaWQ7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBydG5sX2dldF9vZmZsb2FkX3N0YXRzX3NpemUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgbmxhX3NpemUgPSAwOworCWludCBhdHRyX2lkOworCWludCBzaXplOworCisJaWYgKCEoZGV2LT5uZXRkZXZfb3BzICYmIGRldi0+bmV0ZGV2X29wcy0+bmRvX2hhc19vZmZsb2FkX3N0YXRzICYmCisJICAgICAgZGV2LT5uZXRkZXZfb3BzLT5uZG9fZ2V0X29mZmxvYWRfc3RhdHMpKQorCQlyZXR1cm4gMDsKKworCWZvciAoYXR0cl9pZCA9IElGTEFfT0ZGTE9BRF9YU1RBVFNfRklSU1Q7CisJICAgICBhdHRyX2lkIDw9IElGTEFfT0ZGTE9BRF9YU1RBVFNfTUFYOyBhdHRyX2lkKyspIHsKKwkJaWYgKCFkZXYtPm5ldGRldl9vcHMtPm5kb19oYXNfb2ZmbG9hZF9zdGF0cyhhdHRyX2lkKSkKKwkJCWNvbnRpbnVlOworCQlzaXplID0gcnRubF9nZXRfb2ZmbG9hZF9zdGF0c19hdHRyX3NpemUoYXR0cl9pZCk7CisJCW5sYV9zaXplICs9IG5sYV90b3RhbF9zaXplXzY0Yml0KHNpemUpOworCX0KKworCWlmIChubGFfc2l6ZSAhPSAwKQorCQlubGFfc2l6ZSArPSBubGFfdG90YWxfc2l6ZSgwKTsKKworCXJldHVybiBubGFfc2l6ZTsKK30KKwogc3RhdGljIGludCBydG5sX2ZpbGxfc3RhdHNpbmZvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgaW50IHR5cGUsIHUzMiBwaWQsIHUzMiBzZXEsIHUzMiBjaGFuZ2UsCiAJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgZmlsdGVyX21hc2ssCkBAIC0zNTU5LDYgKzM3MjQsNyBAQAogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBubGF0dHIgKmF0dHI7CiAJaW50IHNfcHJpdmlkeCA9ICpwcml2aWR4OworCWludCBlcnI7CiAKIAlBU1NFUlRfUlROTCgpOwogCkBAIC0zNTg3LDggKzM3NTMsNiBAQAogCQljb25zdCBzdHJ1Y3QgcnRubF9saW5rX29wcyAqb3BzID0gZGV2LT5ydG5sX2xpbmtfb3BzOwogCiAJCWlmIChvcHMgJiYgb3BzLT5maWxsX2xpbmt4c3RhdHMpIHsKLQkJCWludCBlcnI7Ci0KIAkJCSppZHhhdHRyID0gSUZMQV9TVEFUU19MSU5LX1hTVEFUUzsKIAkJCWF0dHIgPSBubGFfbmVzdF9zdGFydChza2IsCiAJCQkJCSAgICAgIElGTEFfU1RBVFNfTElOS19YU1RBVFMpOwpAQCAtMzYxMiw4ICszNzc2LDYgQEAKIAkJaWYgKG1hc3RlcikKIAkJCW9wcyA9IG1hc3Rlci0+cnRubF9saW5rX29wczsKIAkJaWYgKG9wcyAmJiBvcHMtPmZpbGxfbGlua3hzdGF0cykgewotCQkJaW50IGVycjsKLQogCQkJKmlkeGF0dHIgPSBJRkxBX1NUQVRTX0xJTktfWFNUQVRTX1NMQVZFOwogCQkJYXR0ciA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwKIAkJCQkJICAgICAgSUZMQV9TVEFUU19MSU5LX1hTVEFUU19TTEFWRSk7CkBAIC0zNjI4LDYgKzM3OTAsMjQgQEAKIAkJfQogCX0KIAorCWlmIChzdGF0c19hdHRyX3ZhbGlkKGZpbHRlcl9tYXNrLCBJRkxBX1NUQVRTX0xJTktfT0ZGTE9BRF9YU1RBVFMsCisJCQkgICAgICppZHhhdHRyKSkgeworCQkqaWR4YXR0ciA9IElGTEFfU1RBVFNfTElOS19PRkZMT0FEX1hTVEFUUzsKKwkJYXR0ciA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgSUZMQV9TVEFUU19MSU5LX09GRkxPQURfWFNUQVRTKTsKKwkJaWYgKCFhdHRyKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwkJZXJyID0gcnRubF9nZXRfb2ZmbG9hZF9zdGF0cyhza2IsIGRldiwgcHJpdmlkeCk7CisJCWlmIChlcnIgPT0gLUVOT0RBVEEpCisJCQlubGFfbmVzdF9jYW5jZWwoc2tiLCBhdHRyKTsKKwkJZWxzZQorCQkJbmxhX25lc3RfZW5kKHNrYiwgYXR0cik7CisKKwkJaWYgKGVyciAmJiBlcnIgIT0gLUVOT0RBVEEpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJKmlkeGF0dHIgPSAwOworCX0KKwogCW5sbXNnX2VuZChza2IsIG5saCk7CiAKIAlyZXR1cm4gMDsKQEAgLTM2NDIsMTAgKzM4MjIsNiBAQAogCXJldHVybiAtRU1TR1NJWkU7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBpZmxhX3N0YXRzX3BvbGljeVtJRkxBX1NUQVRTX01BWCArIDFdID0gewotCVtJRkxBX1NUQVRTX0xJTktfNjRdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCkgfSwKLX07Ci0KIHN0YXRpYyBzaXplX3QgaWZfbmxtc2dfc3RhdHNfc2l6ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgdTMyIGZpbHRlcl9tYXNrKQogewpAQCAtMzY4NSw2ICszODYxLDkgQEAKIAkJfQogCX0KIAorCWlmIChzdGF0c19hdHRyX3ZhbGlkKGZpbHRlcl9tYXNrLCBJRkxBX1NUQVRTX0xJTktfT0ZGTE9BRF9YU1RBVFMsIDApKQorCQlzaXplICs9IHJ0bmxfZ2V0X29mZmxvYWRfc3RhdHNfc2l6ZShkZXYpOworCiAJcmV0dXJuIHNpemU7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKaW5kZXggMzg2NGI0YjYuLjFlM2UwMDggMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC0xOTYyLDM3ICsxOTYyLDEzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zc2l6ZV90IHNrYl9zb2NrZXRfc3BsaWNlKHN0cnVjdCBzb2NrICpzaywKLQkJCSAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKLQkJCSAgc3RydWN0IHNwbGljZV9waXBlX2Rlc2MgKnNwZCkKLXsKLQlpbnQgcmV0OwotCi0JLyogRHJvcCB0aGUgc29ja2V0IGxvY2ssIG90aGVyd2lzZSB3ZSBoYXZlIHJldmVyc2UKLQkgKiBsb2NraW5nIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHNrX2xvY2sgYW5kIGlfbXV0ZXgKLQkgKiBoZXJlIGFzIGNvbXBhcmVkIHRvIHNlbmRmaWxlKCkuIFdlIGVudGVyIGhlcmUKLQkgKiB3aXRoIHRoZSBzb2NrZXQgbG9jayBoZWxkLCBhbmQgc3BsaWNlX3RvX3BpcGUoKSB3aWxsCi0JICogZ3JhYiB0aGUgcGlwZSBpbm9kZSBsb2NrLiBGb3Igc2VuZGZpbGUoKSBlbXVsYXRpb24sCi0JICogd2UgY2FsbCBpbnRvIC0+c2VuZHBhZ2UoKSB3aXRoIHRoZSBpX211dGV4IGxvY2sgaGVsZAotCSAqIGFuZCBuZXR3b3JraW5nIHdpbGwgZ3JhYiB0aGUgc29ja2V0IGxvY2suCi0JICovCi0JcmVsZWFzZV9zb2NrKHNrKTsKLQlyZXQgPSBzcGxpY2VfdG9fcGlwZShwaXBlLCBzcGQpOwotCWxvY2tfc29jayhzayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCiAvKgogICogTWFwIGRhdGEgZnJvbSB0aGUgc2tiIHRvIGEgcGlwZS4gU2hvdWxkIGhhbmRsZSBib3RoIHRoZSBsaW5lYXIgcGFydCwKICAqIHRoZSBmcmFnbWVudHMsIGFuZCB0aGUgZnJhZyBsaXN0LgogICovCiBpbnQgc2tiX3NwbGljZV9iaXRzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IG9mZnNldCwKIAkJICAgIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHVuc2lnbmVkIGludCB0bGVuLAotCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLAotCQkgICAgc3NpemVfdCAoKnNwbGljZV9jYikoc3RydWN0IHNvY2sgKiwKLQkJCQkJIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwKLQkJCQkJIHN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjICopKQorCQkgICAgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBwYXJ0aWFsX3BhZ2UgcGFydGlhbFtNQVhfU0tCX0ZSQUdTXTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZXNbTUFYX1NLQl9GUkFHU107CkBAIC0yMDA5LDcgKzE5ODUsNyBAQAogCV9fc2tiX3NwbGljZV9iaXRzKHNrYiwgcGlwZSwgJm9mZnNldCwgJnRsZW4sICZzcGQsIHNrKTsKIAogCWlmIChzcGQubnJfcGFnZXMpCi0JCXJldCA9IHNwbGljZV9jYihzaywgcGlwZSwgJnNwZCk7CisJCXJldCA9IHNwbGljZV90b19waXBlKHBpcGUsICZzcGQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI0NDUsNiArMjQyMSwyNSBAQAogRVhQT1JUX1NZTUJPTChza2JfcXVldWVfcHVyZ2UpOwogCiAvKioKKyAqCXNrYl9yYnRyZWVfcHVyZ2UgLSBlbXB0eSBhIHNrYiByYnRyZWUKKyAqCUByb290OiByb290IG9mIHRoZSByYnRyZWUgdG8gZW1wdHkKKyAqCisgKglEZWxldGUgYWxsIGJ1ZmZlcnMgb24gYW4gJnNrX2J1ZmYgcmJ0cmVlLiBFYWNoIGJ1ZmZlciBpcyByZW1vdmVkIGZyb20KKyAqCXRoZSBsaXN0IGFuZCBvbmUgcmVmZXJlbmNlIGRyb3BwZWQuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdGFrZQorICoJYW55IGxvY2suIFN5bmNocm9uaXphdGlvbiBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgY2FsbGVyIChlLmcuLCBUQ1AKKyAqCW91dC1vZi1vcmRlciBxdWV1ZSBpcyBwcm90ZWN0ZWQgYnkgdGhlIHNvY2tldCBsb2NrKS4KKyAqLwordm9pZCBza2JfcmJ0cmVlX3B1cmdlKHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCBza19idWZmICpza2IsICpuZXh0OworCisJcmJ0cmVlX3Bvc3RvcmRlcl9mb3JfZWFjaF9lbnRyeV9zYWZlKHNrYiwgbmV4dCwgcm9vdCwgcmJub2RlKQorCQlrZnJlZV9za2Ioc2tiKTsKKworCSpyb290ID0gUkJfUk9PVDsKK30KKworLyoqCiAgKglza2JfcXVldWVfaGVhZCAtIHF1ZXVlIGEgYnVmZmVyIGF0IHRoZSBsaXN0IGhlYWQKICAqCUBsaXN0OiBsaXN0IHRvIHVzZQogICoJQG5ld3NrOiBidWZmZXIgdG8gcXVldWUKQEAgLTMwNzgsMTEgKzMwNzMsMzEgQEAKIAlzZyA9ICEhKGZlYXR1cmVzICYgTkVUSUZfRl9TRyk7CiAJY3N1bSA9ICEhY2FuX2NoZWNrc3VtX3Byb3RvY29sKGZlYXR1cmVzLCBwcm90byk7CiAKLQkvKiBHU08gcGFydGlhbCBvbmx5IHJlcXVpcmVzIHRoYXQgd2UgdHJpbSBvZmYgYW55IGV4Y2VzcyB0aGF0Ci0JICogZG9lc24ndCBmaXQgaW50byBhbiBNU1Mgc2l6ZWQgYmxvY2ssIHNvIHRha2UgY2FyZSBvZiB0aGF0Ci0JICogbm93LgotCSAqLwotCWlmIChzZyAmJiBjc3VtICYmIChmZWF0dXJlcyAmIE5FVElGX0ZfR1NPX1BBUlRJQUwpKSB7CisJaWYgKHNnICYmIGNzdW0gJiYgKG1zcyAhPSBHU09fQllfRlJBR1MpKSAgeworCQlpZiAoIShmZWF0dXJlcyAmIE5FVElGX0ZfR1NPX1BBUlRJQUwpKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqaXRlcjsKKworCQkJaWYgKCFsaXN0X3NrYiB8fAorCQkJICAgICFuZXRfZ3NvX29rKGZlYXR1cmVzLCBza2Jfc2hpbmZvKGhlYWRfc2tiKS0+Z3NvX3R5cGUpKQorCQkJCWdvdG8gbm9ybWFsOworCisJCQkvKiBTcGxpdCB0aGUgYnVmZmVyIGF0IHRoZSBmcmFnX2xpc3QgcG9pbnRlci4KKwkJCSAqIFRoaXMgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwKKwkJCSAqIGJ1ZmZlcnMgaW4gdGhlIGNoYWluIGV4Y2x1ZGluZyB0aGUgbGFzdAorCQkJICogY29udGFpbmluZyB0aGUgc2FtZSBhbW91bnQgb2YgZGF0YS4KKwkJCSAqLworCQkJc2tiX3dhbGtfZnJhZ3MoaGVhZF9za2IsIGl0ZXIpIHsKKwkJCQlpZiAoc2tiX2hlYWRsZW4oaXRlcikpCisJCQkJCWdvdG8gbm9ybWFsOworCisJCQkJbGVuIC09IGl0ZXItPmxlbjsKKwkJCX0KKwkJfQorCisJCS8qIEdTTyBwYXJ0aWFsIG9ubHkgcmVxdWlyZXMgdGhhdCB3ZSB0cmltIG9mZiBhbnkgZXhjZXNzIHRoYXQKKwkJICogZG9lc24ndCBmaXQgaW50byBhbiBNU1Mgc2l6ZWQgYmxvY2ssIHNvIHRha2UgY2FyZSBvZiB0aGF0CisJCSAqIG5vdy4KKwkJICovCiAJCXBhcnRpYWxfc2VncyA9IGxlbiAvIG1zczsKIAkJaWYgKHBhcnRpYWxfc2VncyA+IDEpCiAJCQltc3MgKj0gcGFydGlhbF9zZWdzOwpAQCAtMzA5MCw2ICszMTA1LDcgQEAKIAkJCXBhcnRpYWxfc2VncyA9IDA7CiAJfQogCitub3JtYWw6CiAJaGVhZHJvb20gPSBza2JfaGVhZHJvb20oaGVhZF9za2IpOwogCXBvcyA9IHNrYl9oZWFkbGVuKGhlYWRfc2tiKTsKIApAQCAtMzI4MSwyMSArMzI5NywyOSBAQAogCSAqLwogCXNlZ3MtPnByZXYgPSB0YWlsOwogCi0JLyogVXBkYXRlIEdTTyBpbmZvIG9uIGZpcnN0IHNrYiBpbiBwYXJ0aWFsIHNlcXVlbmNlLiAqLwogCWlmIChwYXJ0aWFsX3NlZ3MpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKml0ZXI7CiAJCWludCB0eXBlID0gc2tiX3NoaW5mbyhoZWFkX3NrYiktPmdzb190eXBlOworCQl1bnNpZ25lZCBzaG9ydCBnc29fc2l6ZSA9IHNrYl9zaGluZm8oaGVhZF9za2IpLT5nc29fc2l6ZTsKIAogCQkvKiBVcGRhdGUgdHlwZSB0byBhZGQgcGFydGlhbCBhbmQgdGhlbiByZW1vdmUgZG9kZ3kgaWYgc2V0ICovCi0JCXR5cGUgfD0gU0tCX0dTT19QQVJUSUFMOworCQl0eXBlIHw9IChmZWF0dXJlcyAmIE5FVElGX0ZfR1NPX1BBUlRJQUwpIC8gTkVUSUZfRl9HU09fUEFSVElBTCAqIFNLQl9HU09fUEFSVElBTDsKIAkJdHlwZSAmPSB+U0tCX0dTT19ET0RHWTsKIAogCQkvKiBVcGRhdGUgR1NPIGluZm8gYW5kIHByZXBhcmUgdG8gc3RhcnQgdXBkYXRpbmcgaGVhZGVycyBvbgogCQkgKiBvdXIgd2F5IGJhY2sgZG93biB0aGUgc3RhY2sgb2YgcHJvdG9jb2xzLgogCQkgKi8KLQkJc2tiX3NoaW5mbyhzZWdzKS0+Z3NvX3NpemUgPSBza2Jfc2hpbmZvKGhlYWRfc2tiKS0+Z3NvX3NpemU7Ci0JCXNrYl9zaGluZm8oc2VncyktPmdzb19zZWdzID0gcGFydGlhbF9zZWdzOwotCQlza2Jfc2hpbmZvKHNlZ3MpLT5nc29fdHlwZSA9IHR5cGU7Ci0JCVNLQl9HU09fQ0Ioc2VncyktPmRhdGFfb2Zmc2V0ID0gc2tiX2hlYWRyb29tKHNlZ3MpICsgZG9mZnNldDsKKwkJZm9yIChpdGVyID0gc2VnczsgaXRlcjsgaXRlciA9IGl0ZXItPm5leHQpIHsKKwkJCXNrYl9zaGluZm8oaXRlciktPmdzb19zaXplID0gZ3NvX3NpemU7CisJCQlza2Jfc2hpbmZvKGl0ZXIpLT5nc29fc2VncyA9IHBhcnRpYWxfc2VnczsKKwkJCXNrYl9zaGluZm8oaXRlciktPmdzb190eXBlID0gdHlwZTsKKwkJCVNLQl9HU09fQ0IoaXRlciktPmRhdGFfb2Zmc2V0ID0gc2tiX2hlYWRyb29tKGl0ZXIpICsgZG9mZnNldDsKKwkJfQorCisJCWlmICh0YWlsLT5sZW4gLSBkb2Zmc2V0IDw9IGdzb19zaXplKQorCQkJc2tiX3NoaW5mbyh0YWlsKS0+Z3NvX3NpemUgPSAwOworCQllbHNlIGlmICh0YWlsICE9IHNlZ3MpCisJCQlza2Jfc2hpbmZvKHRhaWwpLT5nc29fc2VncyA9IERJVl9ST1VORF9VUCh0YWlsLT5sZW4gLSBkb2Zmc2V0LCBnc29fc2l6ZSk7CiAJfQogCiAJLyogRm9sbG93aW5nIHBlcm1pdHMgY29ycmVjdCBiYWNrcHJlc3N1cmUsIGZvciBwcm90b2NvbHMKQEAgLTQ0NzQsMTcgKzQ0OTgsMjQgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2tiX2Vuc3VyZV93cml0YWJsZSk7CiAKLS8qIHJlbW92ZSBWTEFOIGhlYWRlciBmcm9tIHBhY2tldCBhbmQgdXBkYXRlIGNzdW0gYWNjb3JkaW5nbHkuICovCi1zdGF0aWMgaW50IF9fc2tiX3ZsYW5fcG9wKHN0cnVjdCBza19idWZmICpza2IsIHUxNiAqdmxhbl90Y2kpCisvKiByZW1vdmUgVkxBTiBoZWFkZXIgZnJvbSBwYWNrZXQgYW5kIHVwZGF0ZSBjc3VtIGFjY29yZGluZ2x5LgorICogZXhwZWN0cyBhIG5vbiBza2Jfdmxhbl90YWdfcHJlc2VudCBza2Igd2l0aCBhIHZsYW4gdGFnIHBheWxvYWQKKyAqLworaW50IF9fc2tiX3ZsYW5fcG9wKHN0cnVjdCBza19idWZmICpza2IsIHUxNiAqdmxhbl90Y2kpCiB7CiAJc3RydWN0IHZsYW5faGRyICp2aGRyOwotCXVuc2lnbmVkIGludCBvZmZzZXQgPSBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpOworCWludCBvZmZzZXQgPSBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpOwogCWludCBlcnI7CiAKLQlfX3NrYl9wdXNoKHNrYiwgb2Zmc2V0KTsKKwlpZiAoV0FSTl9PTkNFKG9mZnNldCwKKwkJICAgICAgIl9fc2tiX3ZsYW5fcG9wIGdvdCBza2Igd2l0aCBza2ItPmRhdGEgbm90IGF0IG1hYyBoZWFkZXIgKG9mZnNldCAlZClcbiIsCisJCSAgICAgIG9mZnNldCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJZXJyID0gc2tiX2Vuc3VyZV93cml0YWJsZShza2IsIFZMQU5fRVRIX0hMRU4pOwogCWlmICh1bmxpa2VseShlcnIpKQotCQlnb3RvIHB1bGw7CisJCXJldHVybiBlcnI7CiAKIAlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBza2ItPmRhdGEgKyAoMiAqIEVUSF9BTEVOKSwgVkxBTl9ITEVOKTsKIApAQCAtNDUwMSwxMiArNDUzMiwxNCBAQAogCQlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgRVRIX0hMRU4pOwogCiAJc2tiX3Jlc2V0X21hY19sZW4oc2tiKTsKLXB1bGw6Ci0JX19za2JfcHVsbChza2IsIG9mZnNldCk7CiAKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTChfX3NrYl92bGFuX3BvcCk7CiAKKy8qIFBvcCBhIHZsYW4gdGFnIGVpdGhlciBmcm9tIGh3YWNjZWwgb3IgZnJvbSBwYXlsb2FkLgorICogRXhwZWN0cyBza2ItPmRhdGEgYXQgbWFjIGhlYWRlci4KKyAqLwogaW50IHNrYl92bGFuX3BvcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXUxNiB2bGFuX3RjaTsKQEAgLTQ1MTYsOSArNDU0OSw3IEBACiAJaWYgKGxpa2VseShza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSkgewogCQlza2ItPnZsYW5fdGNpID0gMDsKIAl9IGVsc2UgewotCQlpZiAodW5saWtlbHkoKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMVEpICYmCi0JCQkgICAgICBza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpIHx8Ci0JCQkgICAgIHNrYi0+bGVuIDwgVkxBTl9FVEhfSExFTikpCisJCWlmICh1bmxpa2VseSghZXRoX3R5cGVfdmxhbihza2ItPnByb3RvY29sKSkpCiAJCQlyZXR1cm4gMDsKIAogCQllcnIgPSBfX3NrYl92bGFuX3BvcChza2IsICZ2bGFuX3RjaSk7CkBAIC00NTI2LDkgKzQ1NTcsNyBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAJLyogbW92ZSBuZXh0IHZsYW4gdGFnIHRvIGh3IGFjY2VsIHRhZyAqLwotCWlmIChsaWtlbHkoKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMVEpICYmCi0JCSAgICBza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpIHx8Ci0JCSAgIHNrYi0+bGVuIDwgVkxBTl9FVEhfSExFTikpCisJaWYgKGxpa2VseSghZXRoX3R5cGVfdmxhbihza2ItPnByb3RvY29sKSkpCiAJCXJldHVybiAwOwogCiAJdmxhbl9wcm90byA9IHNrYi0+cHJvdG9jb2w7CkBAIC00NTQxLDI5ICs0NTcwLDMwIEBACiB9CiBFWFBPUlRfU1lNQk9MKHNrYl92bGFuX3BvcCk7CiAKKy8qIFB1c2ggYSB2bGFuIHRhZyBlaXRoZXIgaW50byBod2FjY2VsIG9yIGludG8gcGF5bG9hZCAoaWYgaHdhY2NlbCB0YWcgcHJlc2VudCkuCisgKiBFeHBlY3RzIHNrYi0+ZGF0YSBhdCBtYWMgaGVhZGVyLgorICovCiBpbnQgc2tiX3ZsYW5fcHVzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX2JlMTYgdmxhbl9wcm90bywgdTE2IHZsYW5fdGNpKQogewogCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSB7Ci0JCXVuc2lnbmVkIGludCBvZmZzZXQgPSBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpOworCQlpbnQgb2Zmc2V0ID0gc2tiLT5kYXRhIC0gc2tiX21hY19oZWFkZXIoc2tiKTsKIAkJaW50IGVycjsKIAotCQkvKiBfX3ZsYW5faW5zZXJ0X3RhZyBleHBlY3Qgc2tiLT5kYXRhIHBvaW50aW5nIHRvIG1hYyBoZWFkZXIuCi0JCSAqIFNvIGNoYW5nZSBza2ItPmRhdGEgYmVmb3JlIGNhbGxpbmcgaXQgYW5kIGNoYW5nZSBiYWNrIHRvCi0JCSAqIG9yaWdpbmFsIHBvc2l0aW9uIGxhdGVyCi0JCSAqLwotCQlfX3NrYl9wdXNoKHNrYiwgb2Zmc2V0KTsKKwkJaWYgKFdBUk5fT05DRShvZmZzZXQsCisJCQkgICAgICAic2tiX3ZsYW5fcHVzaCBnb3Qgc2tiIHdpdGggc2tiLT5kYXRhIG5vdCBhdCBtYWMgaGVhZGVyIChvZmZzZXQgJWQpXG4iLAorCQkJICAgICAgb2Zmc2V0KSkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwogCQllcnIgPSBfX3ZsYW5faW5zZXJ0X3RhZyhza2IsIHNrYi0+dmxhbl9wcm90bywKIAkJCQkJc2tiX3ZsYW5fdGFnX2dldChza2IpKTsKLQkJaWYgKGVycikgewotCQkJX19za2JfcHVsbChza2IsIG9mZnNldCk7CisJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwotCQl9CiAKIAkJc2tiLT5wcm90b2NvbCA9IHNrYi0+dmxhbl9wcm90bzsKIAkJc2tiLT5tYWNfbGVuICs9IFZMQU5fSExFTjsKIAogCQlza2JfcG9zdHB1c2hfcmNzdW0oc2tiLCBza2ItPmRhdGEgKyAoMiAqIEVUSF9BTEVOKSwgVkxBTl9ITEVOKTsKLQkJX19za2JfcHVsbChza2IsIG9mZnNldCk7CiAJfQogCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGFuX3Byb3RvLCB2bGFuX3RjaSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9zb2NrLmMgYi9uZXQvY29yZS9zb2NrLmMKaW5kZXggMjVkYWI4Yi4uMDM4ZTY2MCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc29jay5jCisrKyBiL25ldC9jb3JlL3NvY2suYwpAQCAtMTMxNSwyNCArMTMxNSw2IEBACiAjZW5kaWYKIH0KIAotdm9pZCBza19wcm90X2NsZWFyX3BvcnRhZGRyX251bGxzKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBudWxsczEsIG51bGxzMjsKLQotCW51bGxzMSA9IG9mZnNldG9mKHN0cnVjdCBzb2NrLCBfX3NrX2NvbW1vbi5za2Nfbm9kZS5uZXh0KTsKLQludWxsczIgPSBvZmZzZXRvZihzdHJ1Y3Qgc29jaywgX19za19jb21tb24uc2tjX3BvcnRhZGRyX25vZGUubmV4dCk7Ci0JaWYgKG51bGxzMSA+IG51bGxzMikKLQkJc3dhcChudWxsczEsIG51bGxzMik7Ci0KLQlpZiAobnVsbHMxICE9IDApCi0JCW1lbXNldCgoY2hhciAqKXNrLCAwLCBudWxsczEpOwotCW1lbXNldCgoY2hhciAqKXNrICsgbnVsbHMxICsgc2l6ZW9mKHZvaWQgKiksIDAsCi0JICAgICAgIG51bGxzMiAtIG51bGxzMSAtIHNpemVvZih2b2lkICopKTsKLQltZW1zZXQoKGNoYXIgKilzayArIG51bGxzMiArIHNpemVvZih2b2lkICopLCAwLAotCSAgICAgICBzaXplIC0gbnVsbHMyIC0gc2l6ZW9mKHZvaWQgKikpOwotfQotRVhQT1JUX1NZTUJPTChza19wcm90X2NsZWFyX3BvcnRhZGRyX251bGxzKTsKLQogc3RhdGljIHN0cnVjdCBzb2NrICpza19wcm90X2FsbG9jKHN0cnVjdCBwcm90byAqcHJvdCwgZ2ZwX3QgcHJpb3JpdHksCiAJCWludCBmYW1pbHkpCiB7CkBAIC0xMzQ0LDEyICsxMzI2LDggQEAKIAkJc2sgPSBrbWVtX2NhY2hlX2FsbG9jKHNsYWIsIHByaW9yaXR5ICYgfl9fR0ZQX1pFUk8pOwogCQlpZiAoIXNrKQogCQkJcmV0dXJuIHNrOwotCQlpZiAocHJpb3JpdHkgJiBfX0dGUF9aRVJPKSB7Ci0JCQlpZiAocHJvdC0+Y2xlYXJfc2spCi0JCQkJcHJvdC0+Y2xlYXJfc2soc2ssIHByb3QtPm9ial9zaXplKTsKLQkJCWVsc2UKLQkJCQlza19wcm90X2NsZWFyX251bGxzKHNrLCBwcm90LT5vYmpfc2l6ZSk7Ci0JCX0KKwkJaWYgKHByaW9yaXR5ICYgX19HRlBfWkVSTykKKwkJCXNrX3Byb3RfY2xlYXJfbnVsbHMoc2ssIHByb3QtPm9ial9zaXplKTsKIAl9IGVsc2UKIAkJc2sgPSBrbWFsbG9jKHByb3QtPm9ial9zaXplLCBwcmlvcml0eSk7CiAKQEAgLTEzNjIsNyArMTM0MCw2IEBACiAJCWlmICghdHJ5X21vZHVsZV9nZXQocHJvdC0+b3duZXIpKQogCQkJZ290byBvdXRfZnJlZV9zZWM7CiAJCXNrX3R4X3F1ZXVlX2NsZWFyKHNrKTsKLQkJY2dyb3VwX3NrX2FsbG9jKCZzay0+c2tfY2dycF9kYXRhKTsKIAl9CiAKIAlyZXR1cm4gc2s7CkBAIC0xNDIyLDYgKzEzOTksNyBAQAogCQlzb2NrX25ldF9zZXQoc2ssIG5ldCk7CiAJCWF0b21pY19zZXQoJnNrLT5za193bWVtX2FsbG9jLCAxKTsKIAorCQljZ3JvdXBfc2tfYWxsb2MoJnNrLT5za19jZ3JwX2RhdGEpOwogCQlzb2NrX3VwZGF0ZV9jbGFzc2lkKCZzay0+c2tfY2dycF9kYXRhKTsKIAkJc29ja191cGRhdGVfbmV0cHJpb2lkeCgmc2stPnNrX2NncnBfZGF0YSk7CiAJfQpAQCAtMTU2Niw2ICsxNTQ0LDkgQEAKIAkJbmV3c2stPnNrX3ByaW9yaXR5ID0gMDsKIAkJbmV3c2stPnNrX2luY29taW5nX2NwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJCWF0b21pYzY0X3NldCgmbmV3c2stPnNrX2Nvb2tpZSwgMCk7CisKKwkJY2dyb3VwX3NrX2FsbG9jKCZuZXdzay0+c2tfY2dycF9kYXRhKTsKKwogCQkvKgogCQkgKiBCZWZvcmUgdXBkYXRpbmcgc2tfcmVmY250LCB3ZSBtdXN0IGNvbW1pdCBwcmlvciBjaGFuZ2VzIHRvIG1lbW9yeQogCQkgKiAoRG9jdW1lbnRhdGlvbi9SQ1UvcmN1bGlzdF9udWxscy50eHQgZm9yIGRldGFpbHMpCmRpZmYgLS1naXQgYS9uZXQvY29yZS9zdHJlYW0uYyBiL25ldC9jb3JlL3N0cmVhbS5jCmluZGV4IDE1OTUxNmEuLjEwODZjOGIgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3N0cmVhbS5jCisrKyBiL25ldC9jb3JlL3N0cmVhbS5jCkBAIC00Myw3ICs0Myw2IEBACiAJCXJjdV9yZWFkX3VubG9jaygpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0woc2tfc3RyZWFtX3dyaXRlX3NwYWNlKTsKIAogLyoqCiAgKiBza19zdHJlYW1fd2FpdF9jb25uZWN0IC0gV2FpdCBmb3IgYSBzb2NrZXQgdG8gZ2V0IGludG8gdGhlIGNvbm5lY3RlZCBzdGF0ZQpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9LY29uZmlnIGIvbmV0L2RzYS9LY29uZmlnCmluZGV4IGZmNzczNmYuLjk2ZTQ3YzUgMTAwNjQ0Ci0tLSBhL25ldC9kc2EvS2NvbmZpZworKysgYi9uZXQvZHNhL0tjb25maWcKQEAgLTM4LDQgKzM4LDcgQEAKIGNvbmZpZyBORVRfRFNBX1RBR19UUkFJTEVSCiAJYm9vbAogCitjb25maWcgTkVUX0RTQV9UQUdfUUNBCisJYm9vbAorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9NYWtlZmlsZSBiL25ldC9kc2EvTWFrZWZpbGUKaW5kZXggOGFmNGRlZC4uYTMzODBlZCAxMDA2NDQKLS0tIGEvbmV0L2RzYS9NYWtlZmlsZQorKysgYi9uZXQvZHNhL01ha2VmaWxlCkBAIC03LDMgKzcsNCBAQAogZHNhX2NvcmUtJChDT05GSUdfTkVUX0RTQV9UQUdfRFNBKSArPSB0YWdfZHNhLm8KIGRzYV9jb3JlLSQoQ09ORklHX05FVF9EU0FfVEFHX0VEU0EpICs9IHRhZ19lZHNhLm8KIGRzYV9jb3JlLSQoQ09ORklHX05FVF9EU0FfVEFHX1RSQUlMRVIpICs9IHRhZ190cmFpbGVyLm8KK2RzYV9jb3JlLSQoQ09ORklHX05FVF9EU0FfVEFHX1FDQSkgKz0gdGFnX3FjYS5vCmRpZmYgLS1naXQgYS9uZXQvZHNhL2RzYS5jIGIvbmV0L2RzYS9kc2EuYwppbmRleCA3ZTY4YmM2Li5hNjkwMmMxIDEwMDY0NAotLS0gYS9uZXQvZHNhL2RzYS5jCisrKyBiL25ldC9kc2EvZHNhLmMKQEAgLTU0LDYgKzU0LDkgQEAKICNpZmRlZiBDT05GSUdfTkVUX0RTQV9UQUdfQlJDTQogCVtEU0FfVEFHX1BST1RPX0JSQ01dID0gJmJyY21fbmV0ZGV2X29wcywKICNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19RQ0EKKwlbRFNBX1RBR19QUk9UT19RQ0FdID0gJnFjYV9uZXRkZXZfb3BzLAorI2VuZGlmCiAJW0RTQV9UQUdfUFJPVE9fTk9ORV0gPSAmbm9uZV9vcHMsCiB9OwogCkBAIC02MSwyNyArNjQsMjcgQEAKIHN0YXRpYyBERUZJTkVfTVVURVgoZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKIHN0YXRpYyBMSVNUX0hFQUQoZHNhX3N3aXRjaF9kcml2ZXJzKTsKIAotdm9pZCByZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqZHJ2KQordm9pZCByZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqb3BzKQogewogCW11dGV4X2xvY2soJmRzYV9zd2l0Y2hfZHJpdmVyc19tdXRleCk7Ci0JbGlzdF9hZGRfdGFpbCgmZHJ2LT5saXN0LCAmZHNhX3N3aXRjaF9kcml2ZXJzKTsKKwlsaXN0X2FkZF90YWlsKCZvcHMtPmxpc3QsICZkc2Ffc3dpdGNoX2RyaXZlcnMpOwogCW11dGV4X3VubG9jaygmZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIpOwogCi12b2lkIHVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcihzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKmRydikKK3ZvaWQgdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqb3BzKQogewogCW11dGV4X2xvY2soJmRzYV9zd2l0Y2hfZHJpdmVyc19tdXRleCk7Ci0JbGlzdF9kZWxfaW5pdCgmZHJ2LT5saXN0KTsKKwlsaXN0X2RlbF9pbml0KCZvcHMtPmxpc3QpOwogCW11dGV4X3VubG9jaygmZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcik7CiAKLXN0YXRpYyBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKgorc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqCiBkc2Ffc3dpdGNoX3Byb2JlKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgc3RydWN0IGRldmljZSAqaG9zdF9kZXYsIGludCBzd19hZGRyLAogCQkgY29uc3QgY2hhciAqKl9uYW1lLCB2b2lkICoqcHJpdikKIHsKLQlzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKnJldDsKKwlzdHJ1Y3QgZHNhX3N3aXRjaF9vcHMgKnJldDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwogCWNvbnN0IGNoYXIgKm5hbWU7CiAKQEAgLTkwLDEzICs5MywxMyBAQAogCiAJbXV0ZXhfbG9jaygmZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoKGxpc3QsICZkc2Ffc3dpdGNoX2RyaXZlcnMpIHsKLQkJc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICpkcnY7CisJCXN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqb3BzOwogCi0JCWRydiA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyLCBsaXN0KTsKKwkJb3BzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZHNhX3N3aXRjaF9vcHMsIGxpc3QpOwogCi0JCW5hbWUgPSBkcnYtPnByb2JlKHBhcmVudCwgaG9zdF9kZXYsIHN3X2FkZHIsIHByaXYpOworCQluYW1lID0gb3BzLT5wcm9iZShwYXJlbnQsIGhvc3RfZGV2LCBzd19hZGRyLCBwcml2KTsKIAkJaWYgKG5hbWUgIT0gTlVMTCkgewotCQkJcmV0ID0gZHJ2OworCQkJcmV0ID0gb3BzOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xMTcsNyArMTIwLDcgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgdGVtcCwgcmV0OwogCi0JcmV0ID0gZHMtPmRydi0+Z2V0X3RlbXAoZHMsICZ0ZW1wKTsKKwlyZXQgPSBkcy0+b3BzLT5nZXRfdGVtcChkcywgJnRlbXApOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMzEsNyArMTM0LDcgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgdGVtcCwgcmV0OwogCi0JcmV0ID0gZHMtPmRydi0+Z2V0X3RlbXBfbGltaXQoZHMsICZ0ZW1wKTsKKwlyZXQgPSBkcy0+b3BzLT5nZXRfdGVtcF9saW1pdChkcywgJnRlbXApOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xNDksNyArMTUyLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IGRzLT5kcnYtPnNldF90ZW1wX2xpbWl0KGRzLCBESVZfUk9VTkRfQ0xPU0VTVCh0ZW1wLCAxMDAwKSk7CisJcmV0ID0gZHMtPm9wcy0+c2V0X3RlbXBfbGltaXQoZHMsIERJVl9ST1VORF9DTE9TRVNUKHRlbXAsIDEwMDApKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTY0LDcgKzE2Nyw3IEBACiAJYm9vbCBhbGFybTsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZHMtPmRydi0+Z2V0X3RlbXBfYWxhcm0oZHMsICZhbGFybSk7CisJcmV0ID0gZHMtPm9wcy0+Z2V0X3RlbXBfYWxhcm0oZHMsICZhbGFybSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTE4NCwxNSArMTg3LDE1IEBACiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqZHJ2ID0gZHMtPmRydjsKKwlzdHJ1Y3QgZHNhX3N3aXRjaF9vcHMgKm9wcyA9IGRzLT5vcHM7CiAJdW1vZGVfdCBtb2RlID0gYXR0ci0+bW9kZTsKIAogCWlmIChpbmRleCA9PSAxKSB7Ci0JCWlmICghZHJ2LT5nZXRfdGVtcF9saW1pdCkKKwkJaWYgKCFvcHMtPmdldF90ZW1wX2xpbWl0KQogCQkJbW9kZSA9IDA7Ci0JCWVsc2UgaWYgKCFkcnYtPnNldF90ZW1wX2xpbWl0KQorCQllbHNlIGlmICghb3BzLT5zZXRfdGVtcF9saW1pdCkKIAkJCW1vZGUgJj0gflNfSVdVU1I7Ci0JfSBlbHNlIGlmIChpbmRleCA9PSAyICYmICFkcnYtPmdldF90ZW1wX2FsYXJtKSB7CisJfSBlbHNlIGlmIChpbmRleCA9PSAyICYmICFvcHMtPmdldF90ZW1wX2FsYXJtKSB7CiAJCW1vZGUgPSAwOwogCX0KIAlyZXR1cm4gbW9kZTsKQEAgLTIyOCw4ICsyMzEsOCBAQAogCiAJCWdlbnBoeV9jb25maWdfaW5pdChwaHlkZXYpOwogCQlnZW5waHlfcmVhZF9zdGF0dXMocGh5ZGV2KTsKLQkJaWYgKGRzLT5kcnYtPmFkanVzdF9saW5rKQotCQkJZHMtPmRydi0+YWRqdXN0X2xpbmsoZHMsIHBvcnQsIHBoeWRldik7CisJCWlmIChkcy0+b3BzLT5hZGp1c3RfbGluaykKKwkJCWRzLT5vcHMtPmFkanVzdF9saW5rKGRzLCBwb3J0LCBwaHlkZXYpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMzAzLDcgKzMwNiw3IEBACiAKIHN0YXRpYyBpbnQgZHNhX3N3aXRjaF9zZXR1cF9vbmUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQpCiB7Ci0Jc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICpkcnYgPSBkcy0+ZHJ2OworCXN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqb3BzID0gZHMtPm9wczsKIAlzdHJ1Y3QgZHNhX3N3aXRjaF90cmVlICpkc3QgPSBkcy0+ZHN0OwogCXN0cnVjdCBkc2FfY2hpcF9kYXRhICpjZCA9IGRzLT5jZDsKIAlib29sIHZhbGlkX25hbWVfZm91bmQgPSBmYWxzZTsKQEAgLTM1NCw3ICszNTcsMTAgQEAKIAkgKiBzd2l0Y2guCiAJICovCiAJaWYgKGRzdC0+Y3B1X3N3aXRjaCA9PSBpbmRleCkgewotCQlkc3QtPnRhZ19vcHMgPSBkc2FfcmVzb2x2ZV90YWdfcHJvdG9jb2woZHJ2LT50YWdfcHJvdG9jb2wpOworCQllbnVtIGRzYV90YWdfcHJvdG9jb2wgdGFnX3Byb3RvY29sOworCisJCXRhZ19wcm90b2NvbCA9IG9wcy0+Z2V0X3RhZ19wcm90b2NvbChkcyk7CisJCWRzdC0+dGFnX29wcyA9IGRzYV9yZXNvbHZlX3RhZ19wcm90b2NvbCh0YWdfcHJvdG9jb2wpOwogCQlpZiAoSVNfRVJSKGRzdC0+dGFnX29wcykpIHsKIAkJCXJldCA9IFBUUl9FUlIoZHN0LT50YWdfb3BzKTsKIAkJCWdvdG8gb3V0OwpAQCAtMzY4LDE1ICszNzQsMTcgQEAKIAkvKgogCSAqIERvIGJhc2ljIHJlZ2lzdGVyIHNldHVwLgogCSAqLwotCXJldCA9IGRydi0+c2V0dXAoZHMpOworCXJldCA9IG9wcy0+c2V0dXAoZHMpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXJldCA9IGRydi0+c2V0X2FkZHIoZHMsIGRzdC0+bWFzdGVyX25ldGRldi0+ZGV2X2FkZHIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dDsKKwlpZiAob3BzLT5zZXRfYWRkcikgeworCQlyZXQgPSBvcHMtPnNldF9hZGRyKGRzLCBkc3QtPm1hc3Rlcl9uZXRkZXYtPmRldl9hZGRyKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CiAKLQlpZiAoIWRzLT5zbGF2ZV9taWlfYnVzICYmIGRydi0+cGh5X3JlYWQpIHsKKwlpZiAoIWRzLT5zbGF2ZV9taWlfYnVzICYmIG9wcy0+cGh5X3JlYWQpIHsKIAkJZHMtPnNsYXZlX21paV9idXMgPSBkZXZtX21kaW9idXNfYWxsb2MocGFyZW50KTsKIAkJaWYgKCFkcy0+c2xhdmVfbWlpX2J1cykgewogCQkJcmV0ID0gLUVOT01FTTsKQEAgLTQyMyw3ICs0MzEsNyBAQAogCSAqIHJlZ2lzdGVyIHdpdGggaGFyZHdhcmUgbW9uaXRvcmluZyBzdWJzeXN0ZW0uCiAJICogVHJlYXQgcmVnaXN0cmF0aW9uIGVycm9yIGFzIG5vbi1mYXRhbCBhbmQgaWdub3JlIGl0LgogCSAqLwotCWlmIChkcnYtPmdldF90ZW1wKSB7CisJaWYgKG9wcy0+Z2V0X3RlbXApIHsKIAkJY29uc3QgY2hhciAqbmV0bmFtZSA9IG5ldGRldl9uYW1lKGRzdC0+bWFzdGVyX25ldGRldik7CiAJCWNoYXIgaG5hbWVbSUZOQU1TSVogKyAxXTsKIAkJaW50IGksIGo7CkBAIC00NTQsNyArNDYyLDcgQEAKIAkJIHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgc3RydWN0IGRldmljZSAqaG9zdF9kZXYpCiB7CiAJc3RydWN0IGRzYV9jaGlwX2RhdGEgKmNkID0gZHN0LT5wZC0+Y2hpcCArIGluZGV4OwotCXN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqZHJ2OworCXN0cnVjdCBkc2Ffc3dpdGNoX29wcyAqb3BzOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkczsKIAlpbnQgcmV0OwogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC00NjMsOCArNDcxLDggQEAKIAkvKgogCSAqIFByb2JlIGZvciBzd2l0Y2ggbW9kZWwuCiAJICovCi0JZHJ2ID0gZHNhX3N3aXRjaF9wcm9iZShwYXJlbnQsIGhvc3RfZGV2LCBjZC0+c3dfYWRkciwgJm5hbWUsICZwcml2KTsKLQlpZiAoZHJ2ID09IE5VTEwpIHsKKwlvcHMgPSBkc2Ffc3dpdGNoX3Byb2JlKHBhcmVudCwgaG9zdF9kZXYsIGNkLT5zd19hZGRyLCAmbmFtZSwgJnByaXYpOworCWlmICghb3BzKSB7CiAJCW5ldGRldl9lcnIoZHN0LT5tYXN0ZXJfbmV0ZGV2LCAiWyVkXTogY291bGQgbm90IGRldGVjdCBhdHRhY2hlZCBzd2l0Y2hcbiIsCiAJCQkgICBpbmRleCk7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtNDgzLDcgKzQ5MSw3IEBACiAJZHMtPmRzdCA9IGRzdDsKIAlkcy0+aW5kZXggPSBpbmRleDsKIAlkcy0+Y2QgPSBjZDsKLQlkcy0+ZHJ2ID0gZHJ2OworCWRzLT5vcHMgPSBvcHM7CiAJZHMtPnByaXYgPSBwcml2OwogCWRzLT5kZXYgPSBwYXJlbnQ7CiAKQEAgLTUzOCwxMiArNTQ2LDEyIEBACiAJCWRzLT5kc2FfcG9ydF9tYXNrIHw9IH4oMSA8PCBwb3J0KTsKIAl9CiAKLQlpZiAoZHMtPnNsYXZlX21paV9idXMgJiYgZHMtPmRydi0+cGh5X3JlYWQpCisJaWYgKGRzLT5zbGF2ZV9taWlfYnVzICYmIGRzLT5vcHMtPnBoeV9yZWFkKQogCQltZGlvYnVzX3VucmVnaXN0ZXIoZHMtPnNsYXZlX21paV9idXMpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IGRzYV9zd2l0Y2hfc3VzcGVuZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCitpbnQgZHNhX3N3aXRjaF9zdXNwZW5kKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIApAQCAtNTU3LDE4ICs1NjUsMTkgQEAKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKGRzLT5kcnYtPnN1c3BlbmQpCi0JCXJldCA9IGRzLT5kcnYtPnN1c3BlbmQoZHMpOworCWlmIChkcy0+b3BzLT5zdXNwZW5kKQorCQlyZXQgPSBkcy0+b3BzLT5zdXNwZW5kKGRzKTsKIAogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChkc2Ffc3dpdGNoX3N1c3BlbmQpOwogCi1zdGF0aWMgaW50IGRzYV9zd2l0Y2hfcmVzdW1lKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK2ludCBkc2Ffc3dpdGNoX3Jlc3VtZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7CiAJaW50IGksIHJldCA9IDA7CiAKLQlpZiAoZHMtPmRydi0+cmVzdW1lKQotCQlyZXQgPSBkcy0+ZHJ2LT5yZXN1bWUoZHMpOworCWlmIChkcy0+b3BzLT5yZXN1bWUpCisJCXJldCA9IGRzLT5vcHMtPnJlc3VtZShkcyk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNTg1LDYgKzU5NCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGRzYV9zd2l0Y2hfcmVzdW1lKTsKICNlbmRpZgogCiAvKiBwbGF0Zm9ybSBkcml2ZXIgaW5pdCBhbmQgY2xlYW51cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwODYsNyArMTA5Niw2IEBACiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoZHNhX3BtX29wcywgZHNhX3N1c3BlbmQsIGRzYV9yZXN1bWUpOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBkc2Ffb2ZfbWF0Y2hfdGFibGVbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtNzQ0NS1zd2l0Y2gtdjQuMCIgfSwKIAl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsZHNhIiwgfSwKIAl7fQogfTsKZGlmZiAtLWdpdCBhL25ldC9kc2EvZHNhMi5jIGIvbmV0L2RzYS9kc2EyLmMKaW5kZXggZjMwYmFkOS4uZjhhN2Q5YSAxMDA2NDQKLS0tIGEvbmV0L2RzYS9kc2EyLmMKKysrIGIvbmV0L2RzYS9kc2EyLmMKQEAgLTI5NCwyNSArMjk0LDIzIEBACiAJaW50IGVycjsKIAogCS8qIEluaXRpYWxpemUgZHMtPnBoeXNfbWlpX21hc2sgYmVmb3JlIHJlZ2lzdGVyaW5nIHRoZSBzbGF2ZSBNRElPIGJ1cwotCSAqIGRyaXZlciBhbmQgYmVmb3JlIGRydi0+c2V0dXAoKSBoYXMgcnVuLCBzaW5jZSB0aGUgc3dpdGNoIGRyaXZlcnMgYW5kCisJICogZHJpdmVyIGFuZCBiZWZvcmUgb3BzLT5zZXR1cCgpIGhhcyBydW4sIHNpbmNlIHRoZSBzd2l0Y2ggZHJpdmVycyBhbmQKIAkgKiB0aGUgc2xhdmUgTURJTyBidXMgZHJpdmVyIHJlbHkgb24gdGhlc2UgdmFsdWVzIGZvciBwcm9iaW5nIFBIWQogCSAqIGRldmljZXMgb3Igbm90CiAJICovCiAJZHMtPnBoeXNfbWlpX21hc2sgPSBkcy0+ZW5hYmxlZF9wb3J0X21hc2s7CiAKLQllcnIgPSBkcy0+ZHJ2LT5zZXR1cChkcyk7CisJZXJyID0gZHMtPm9wcy0+c2V0dXAoZHMpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gZHMtPmRydi0+c2V0X2FkZHIoZHMsIGRzdC0+bWFzdGVyX25ldGRldi0+ZGV2X2FkZHIpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCWlmIChkcy0+b3BzLT5zZXRfYWRkcikgeworCQllcnIgPSBkcy0+b3BzLT5zZXRfYWRkcihkcywgZHN0LT5tYXN0ZXJfbmV0ZGV2LT5kZXZfYWRkcik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CiAKLQllcnIgPSBkcy0+ZHJ2LT5zZXRfYWRkcihkcywgZHN0LT5tYXN0ZXJfbmV0ZGV2LT5kZXZfYWRkcik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAoIWRzLT5zbGF2ZV9taWlfYnVzICYmIGRzLT5kcnYtPnBoeV9yZWFkKSB7CisJaWYgKCFkcy0+c2xhdmVfbWlpX2J1cyAmJiBkcy0+b3BzLT5waHlfcmVhZCkgewogCQlkcy0+c2xhdmVfbWlpX2J1cyA9IGRldm1fbWRpb2J1c19hbGxvYyhkcy0+ZGV2KTsKIAkJaWYgKCFkcy0+c2xhdmVfbWlpX2J1cykKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtMzc0LDcgKzM3Miw3IEBACiAJCWRzYV91c2VyX3BvcnRfdW5hcHBseShwb3J0LCBpbmRleCwgZHMpOwogCX0KIAotCWlmIChkcy0+c2xhdmVfbWlpX2J1cyAmJiBkcy0+ZHJ2LT5waHlfcmVhZCkKKwlpZiAoZHMtPnNsYXZlX21paV9idXMgJiYgZHMtPm9wcy0+cGh5X3JlYWQpCiAJCW1kaW9idXNfdW5yZWdpc3Rlcihkcy0+c2xhdmVfbWlpX2J1cyk7CiB9CiAKQEAgLTQ0Myw2ICs0NDEsNyBAQAogCQkJIHN0cnVjdCBkc2Ffc3dpdGNoX3RyZWUgKmRzdCwKIAkJCSBzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7CisJZW51bSBkc2FfdGFnX3Byb3RvY29sIHRhZ19wcm90b2NvbDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZXRoZXJuZXRfZGV2OwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZXRoZXJuZXQ7CiAKQEAgLTQ2NSw3ICs0NjQsOCBAQAogCQlkc3QtPmNwdV9wb3J0ID0gaW5kZXg7CiAJfQogCi0JZHN0LT50YWdfb3BzID0gZHNhX3Jlc29sdmVfdGFnX3Byb3RvY29sKGRzLT5kcnYtPnRhZ19wcm90b2NvbCk7CisJdGFnX3Byb3RvY29sID0gZHMtPm9wcy0+Z2V0X3RhZ19wcm90b2NvbChkcyk7CisJZHN0LT50YWdfb3BzID0gZHNhX3Jlc29sdmVfdGFnX3Byb3RvY29sKHRhZ19wcm90b2NvbCk7CiAJaWYgKElTX0VSUihkc3QtPnRhZ19vcHMpKSB7CiAJCWRldl93YXJuKGRzLT5kZXYsICJObyB0YWdnZXIgZm9yIHRoaXMgc3dpdGNoXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIoZHN0LT50YWdfb3BzKTsKQEAgLTU0MSw3ICs1NDEsNyBAQAogCiAJCWRzLT5wb3J0c1tyZWddLmRuID0gcG9ydDsKIAotCQkvKiBJbml0aWFsaXplIGVuYWJsZWRfcG9ydF9tYXNrIG5vdyBmb3IgZHJ2LT5zZXR1cCgpCisJCS8qIEluaXRpYWxpemUgZW5hYmxlZF9wb3J0X21hc2sgbm93IGZvciBvcHMtPnNldHVwKCkKIAkJICogdG8gaGF2ZSBhY2Nlc3MgdG8gYSBjb3JyZWN0IHZhbHVlLCBqdXN0IGxpa2Ugd2hhdAogCQkgKiBuZXQvZHNhL2RzYS5jOjpkc2Ffc3dpdGNoX3NldHVwX29uZSBkb2VzLgogCQkgKi8KZGlmZiAtLWdpdCBhL25ldC9kc2EvZHNhX3ByaXYuaCBiL25ldC9kc2EvZHNhX3ByaXYuaAppbmRleCAwMDA3N2E5Li42Y2ZkNzM4IDEwMDY0NAotLS0gYS9uZXQvZHNhL2RzYV9wcml2LmgKKysrIGIvbmV0L2RzYS9kc2FfcHJpdi5oCkBAIC04MSw1ICs4MSw3IEBACiAvKiB0YWdfYnJjbS5jICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGRzYV9kZXZpY2Vfb3BzIGJyY21fbmV0ZGV2X29wczsKIAorLyogdGFnX3FjYS5jICovCitleHRlcm4gY29uc3Qgc3RydWN0IGRzYV9kZXZpY2Vfb3BzIHFjYV9uZXRkZXZfb3BzOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9kc2Evc2xhdmUuYyBiL25ldC9kc2Evc2xhdmUuYwppbmRleCBmYzkxOTY3Li42YjEyODJjIDEwMDY0NAotLS0gYS9uZXQvZHNhL3NsYXZlLmMKKysrIGIvbmV0L2RzYS9zbGF2ZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gYnVzLT5wcml2OwogCiAJaWYgKGRzLT5waHlzX21paV9tYXNrICYgKDEgPDwgYWRkcikpCi0JCXJldHVybiBkcy0+ZHJ2LT5waHlfcmVhZChkcywgYWRkciwgcmVnKTsKKwkJcmV0dXJuIGRzLT5vcHMtPnBoeV9yZWFkKGRzLCBhZGRyLCByZWcpOwogCiAJcmV0dXJuIDB4ZmZmZjsKIH0KQEAgLTM4LDcgKzM4LDcgQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBidXMtPnByaXY7CiAKIAlpZiAoZHMtPnBoeXNfbWlpX21hc2sgJiAoMSA8PCBhZGRyKSkKLQkJcmV0dXJuIGRzLT5kcnYtPnBoeV93cml0ZShkcywgYWRkciwgcmVnLCB2YWwpOworCQlyZXR1cm4gZHMtPm9wcy0+cGh5X3dyaXRlKGRzLCBhZGRyLCByZWcsIHZhbCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY5LDYgKzY5LDMwIEBACiAJcmV0dXJuICEhcC0+YnJpZGdlX2RldjsKIH0KIAorc3RhdGljIHZvaWQgZHNhX3BvcnRfc2V0X3N0cF9zdGF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1OCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHNhX3BvcnQgKmRwID0gJmRzLT5wb3J0c1twb3J0XTsKKworCWlmIChkcy0+b3BzLT5wb3J0X3N0cF9zdGF0ZV9zZXQpCisJCWRzLT5vcHMtPnBvcnRfc3RwX3N0YXRlX3NldChkcywgcG9ydCwgc3RhdGUpOworCisJaWYgKGRzLT5vcHMtPnBvcnRfZmFzdF9hZ2UpIHsKKwkJLyogRmFzdCBhZ2UgRkRCIGVudHJpZXMgb3IgZmx1c2ggYXBwcm9wcmlhdGUgZm9yd2FyZGluZyBkYXRhYmFzZQorCQkgKiBmb3IgdGhlIGdpdmVuIHBvcnQsIGlmIHdlIGFyZSBtb3ZpbmcgaXQgZnJvbSBMZWFybmluZyBvcgorCQkgKiBGb3J3YXJkaW5nIHN0YXRlLCB0byBEaXNhYmxlZCBvciBCbG9ja2luZyBvciBMaXN0ZW5pbmcgc3RhdGUuCisJCSAqLworCisJCWlmICgoZHAtPnN0cF9zdGF0ZSA9PSBCUl9TVEFURV9MRUFSTklORyB8fAorCQkgICAgIGRwLT5zdHBfc3RhdGUgPT0gQlJfU1RBVEVfRk9SV0FSRElORykgJiYKKwkJICAgIChzdGF0ZSA9PSBCUl9TVEFURV9ESVNBQkxFRCB8fAorCQkgICAgIHN0YXRlID09IEJSX1NUQVRFX0JMT0NLSU5HIHx8CisJCSAgICAgc3RhdGUgPT0gQlJfU1RBVEVfTElTVEVOSU5HKSkKKwkJCWRzLT5vcHMtPnBvcnRfZmFzdF9hZ2UoZHMsIHBvcnQpOworCX0KKworCWRwLT5zdHBfc3RhdGUgPSBzdGF0ZTsKK30KKwogc3RhdGljIGludCBkc2Ffc2xhdmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CkBAIC05OCwxNCArMTIyLDEzIEBACiAJCQlnb3RvIGNsZWFyX2FsbG11bHRpOwogCX0KIAotCWlmIChkcy0+ZHJ2LT5wb3J0X2VuYWJsZSkgewotCQllcnIgPSBkcy0+ZHJ2LT5wb3J0X2VuYWJsZShkcywgcC0+cG9ydCwgcC0+cGh5KTsKKwlpZiAoZHMtPm9wcy0+cG9ydF9lbmFibGUpIHsKKwkJZXJyID0gZHMtPm9wcy0+cG9ydF9lbmFibGUoZHMsIHAtPnBvcnQsIHAtPnBoeSk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGNsZWFyX3Byb21pc2M7CiAJfQogCi0JaWYgKGRzLT5kcnYtPnBvcnRfc3RwX3N0YXRlX3NldCkKLQkJZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0KGRzLCBwLT5wb3J0LCBzdHBfc3RhdGUpOworCWRzYV9wb3J0X3NldF9zdHBfc3RhdGUoZHMsIHAtPnBvcnQsIHN0cF9zdGF0ZSk7CiAKIAlpZiAocC0+cGh5KQogCQlwaHlfc3RhcnQocC0+cGh5KTsKQEAgLTE0NCwxMSArMTY3LDEwIEBACiAJaWYgKCFldGhlcl9hZGRyX2VxdWFsKGRldi0+ZGV2X2FkZHIsIG1hc3Rlci0+ZGV2X2FkZHIpKQogCQlkZXZfdWNfZGVsKG1hc3RlciwgZGV2LT5kZXZfYWRkcik7CiAKLQlpZiAoZHMtPmRydi0+cG9ydF9kaXNhYmxlKQotCQlkcy0+ZHJ2LT5wb3J0X2Rpc2FibGUoZHMsIHAtPnBvcnQsIHAtPnBoeSk7CisJaWYgKGRzLT5vcHMtPnBvcnRfZGlzYWJsZSkKKwkJZHMtPm9wcy0+cG9ydF9kaXNhYmxlKGRzLCBwLT5wb3J0LCBwLT5waHkpOwogCi0JaWYgKGRzLT5kcnYtPnBvcnRfc3RwX3N0YXRlX3NldCkKLQkJZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0KGRzLCBwLT5wb3J0LCBCUl9TVEFURV9ESVNBQkxFRCk7CisJZHNhX3BvcnRfc2V0X3N0cF9zdGF0ZShkcywgcC0+cG9ydCwgQlJfU1RBVEVfRElTQUJMRUQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMDksMTMgKzIzMSwxMyBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAogCWlmIChzd2l0Y2hkZXZfdHJhbnNfcGhfcHJlcGFyZSh0cmFucykpIHsKLQkJaWYgKCFkcy0+ZHJ2LT5wb3J0X3ZsYW5fcHJlcGFyZSB8fCAhZHMtPmRydi0+cG9ydF92bGFuX2FkZCkKKwkJaWYgKCFkcy0+b3BzLT5wb3J0X3ZsYW5fcHJlcGFyZSB8fCAhZHMtPm9wcy0+cG9ydF92bGFuX2FkZCkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCQlyZXR1cm4gZHMtPmRydi0+cG9ydF92bGFuX3ByZXBhcmUoZHMsIHAtPnBvcnQsIHZsYW4sIHRyYW5zKTsKKwkJcmV0dXJuIGRzLT5vcHMtPnBvcnRfdmxhbl9wcmVwYXJlKGRzLCBwLT5wb3J0LCB2bGFuLCB0cmFucyk7CiAJfQogCi0JZHMtPmRydi0+cG9ydF92bGFuX2FkZChkcywgcC0+cG9ydCwgdmxhbiwgdHJhbnMpOworCWRzLT5vcHMtPnBvcnRfdmxhbl9hZGQoZHMsIHAtPnBvcnQsIHZsYW4sIHRyYW5zKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjI2LDEwICsyNDgsMTAgQEAKIAlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAotCWlmICghZHMtPmRydi0+cG9ydF92bGFuX2RlbCkKKwlpZiAoIWRzLT5vcHMtPnBvcnRfdmxhbl9kZWwpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXJldHVybiBkcy0+ZHJ2LT5wb3J0X3ZsYW5fZGVsKGRzLCBwLT5wb3J0LCB2bGFuKTsKKwlyZXR1cm4gZHMtPm9wcy0+cG9ydF92bGFuX2RlbChkcywgcC0+cG9ydCwgdmxhbik7CiB9CiAKIHN0YXRpYyBpbnQgZHNhX3NsYXZlX3BvcnRfdmxhbl9kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0yMzksOCArMjYxLDggQEAKIAlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAotCWlmIChkcy0+ZHJ2LT5wb3J0X3ZsYW5fZHVtcCkKLQkJcmV0dXJuIGRzLT5kcnYtPnBvcnRfdmxhbl9kdW1wKGRzLCBwLT5wb3J0LCB2bGFuLCBjYik7CisJaWYgKGRzLT5vcHMtPnBvcnRfdmxhbl9kdW1wKQorCQlyZXR1cm4gZHMtPm9wcy0+cG9ydF92bGFuX2R1bXAoZHMsIHAtPnBvcnQsIHZsYW4sIGNiKTsKIAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTI1MywxMyArMjc1LDEzIEBACiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCiAJaWYgKHN3aXRjaGRldl90cmFuc19waF9wcmVwYXJlKHRyYW5zKSkgewotCQlpZiAoIWRzLT5kcnYtPnBvcnRfZmRiX3ByZXBhcmUgfHwgIWRzLT5kcnYtPnBvcnRfZmRiX2FkZCkKKwkJaWYgKCFkcy0+b3BzLT5wb3J0X2ZkYl9wcmVwYXJlIHx8ICFkcy0+b3BzLT5wb3J0X2ZkYl9hZGQpCiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQkJcmV0dXJuIGRzLT5kcnYtPnBvcnRfZmRiX3ByZXBhcmUoZHMsIHAtPnBvcnQsIGZkYiwgdHJhbnMpOworCQlyZXR1cm4gZHMtPm9wcy0+cG9ydF9mZGJfcHJlcGFyZShkcywgcC0+cG9ydCwgZmRiLCB0cmFucyk7CiAJfQogCi0JZHMtPmRydi0+cG9ydF9mZGJfYWRkKGRzLCBwLT5wb3J0LCBmZGIsIHRyYW5zKTsKKwlkcy0+b3BzLT5wb3J0X2ZkYl9hZGQoZHMsIHAtPnBvcnQsIGZkYiwgdHJhbnMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNzEsOCArMjkzLDggQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAJaW50IHJldCA9IC1FT1BOT1RTVVBQOwogCi0JaWYgKGRzLT5kcnYtPnBvcnRfZmRiX2RlbCkKLQkJcmV0ID0gZHMtPmRydi0+cG9ydF9mZGJfZGVsKGRzLCBwLT5wb3J0LCBmZGIpOworCWlmIChkcy0+b3BzLT5wb3J0X2ZkYl9kZWwpCisJCXJldCA9IGRzLT5vcHMtPnBvcnRfZmRiX2RlbChkcywgcC0+cG9ydCwgZmRiKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yODQsOCArMzA2LDUyIEBACiAJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAKLQlpZiAoZHMtPmRydi0+cG9ydF9mZGJfZHVtcCkKLQkJcmV0dXJuIGRzLT5kcnYtPnBvcnRfZmRiX2R1bXAoZHMsIHAtPnBvcnQsIGZkYiwgY2IpOworCWlmIChkcy0+b3BzLT5wb3J0X2ZkYl9kdW1wKQorCQlyZXR1cm4gZHMtPm9wcy0+cG9ydF9mZGJfZHVtcChkcywgcC0+cG9ydCwgZmRiLCBjYik7CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgZHNhX3NsYXZlX3BvcnRfbWRiX2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYiwKKwkJCQkgIHN0cnVjdCBzd2l0Y2hkZXZfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OworCisJaWYgKHN3aXRjaGRldl90cmFuc19waF9wcmVwYXJlKHRyYW5zKSkgeworCQlpZiAoIWRzLT5vcHMtPnBvcnRfbWRiX3ByZXBhcmUgfHwgIWRzLT5vcHMtPnBvcnRfbWRiX2FkZCkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCQlyZXR1cm4gZHMtPm9wcy0+cG9ydF9tZGJfcHJlcGFyZShkcywgcC0+cG9ydCwgbWRiLCB0cmFucyk7CisJfQorCisJZHMtPm9wcy0+cG9ydF9tZGJfYWRkKGRzLCBwLT5wb3J0LCBtZGIsIHRyYW5zKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzYV9zbGF2ZV9wb3J0X21kYl9kZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBzd2l0Y2hkZXZfb2JqX3BvcnRfbWRiICptZGIpCit7CisJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CisKKwlpZiAoZHMtPm9wcy0+cG9ydF9tZGJfZGVsKQorCQlyZXR1cm4gZHMtPm9wcy0+cG9ydF9tZGJfZGVsKGRzLCBwLT5wb3J0LCBtZGIpOworCisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW50IGRzYV9zbGF2ZV9wb3J0X21kYl9kdW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF9tZGIgKm1kYiwKKwkJCQkgICBzd2l0Y2hkZXZfb2JqX2R1bXBfY2JfdCAqY2IpCit7CisJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CisKKwlpZiAoZHMtPm9wcy0+cG9ydF9tZGJfZHVtcCkKKwkJcmV0dXJuIGRzLT5vcHMtPnBvcnRfbWRiX2R1bXAoZHMsIHAtPnBvcnQsIG1kYiwgY2IpOwogCiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQpAQCAtMzA4LDkgKzM3NCw5IEBACiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCiAJaWYgKHN3aXRjaGRldl90cmFuc19waF9wcmVwYXJlKHRyYW5zKSkKLQkJcmV0dXJuIGRzLT5kcnYtPnBvcnRfc3RwX3N0YXRlX3NldCA/IDAgOiAtRU9QTk9UU1VQUDsKKwkJcmV0dXJuIGRzLT5vcHMtPnBvcnRfc3RwX3N0YXRlX3NldCA/IDAgOiAtRU9QTk9UU1VQUDsKIAotCWRzLT5kcnYtPnBvcnRfc3RwX3N0YXRlX3NldChkcywgcC0+cG9ydCwgYXR0ci0+dS5zdHBfc3RhdGUpOworCWRzYV9wb3J0X3NldF9zdHBfc3RhdGUoZHMsIHAtPnBvcnQsIGF0dHItPnUuc3RwX3N0YXRlKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzI2LDggKzM5Miw4IEBACiAJaWYgKHN3aXRjaGRldl90cmFuc19waF9wcmVwYXJlKHRyYW5zKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoZHMtPmRydi0+cG9ydF92bGFuX2ZpbHRlcmluZykKLQkJcmV0dXJuIGRzLT5kcnYtPnBvcnRfdmxhbl9maWx0ZXJpbmcoZHMsIHAtPnBvcnQsCisJaWYgKGRzLT5vcHMtPnBvcnRfdmxhbl9maWx0ZXJpbmcpCisJCXJldHVybiBkcy0+b3BzLT5wb3J0X3ZsYW5fZmlsdGVyaW5nKGRzLCBwLT5wb3J0LAogCQkJCQkJICAgIGF0dHItPnUudmxhbl9maWx0ZXJpbmcpOwogCiAJcmV0dXJuIDA7CkBAIC0zNjUsOCArNDMxLDggQEAKIAlkcy0+cG9ydHNbcC0+cG9ydF0uYWdlaW5nX3RpbWUgPSBhZ2VpbmdfdGltZTsKIAlhZ2VpbmdfdGltZSA9IGRzYV9mYXN0ZXN0X2FnZWluZ190aW1lKGRzLCBhZ2VpbmdfdGltZSk7CiAKLQlpZiAoZHMtPmRydi0+c2V0X2FnZWluZ190aW1lKQotCQlyZXR1cm4gZHMtPmRydi0+c2V0X2FnZWluZ190aW1lKGRzLCBhZ2VpbmdfdGltZSk7CisJaWYgKGRzLT5vcHMtPnNldF9hZ2VpbmdfdGltZSkKKwkJcmV0dXJuIGRzLT5vcHMtPnNldF9hZ2VpbmdfdGltZShkcywgYWdlaW5nX3RpbWUpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MTIsNiArNDc4LDEwIEBACiAJCQkJCSAgICAgU1dJVENIREVWX09CSl9QT1JUX0ZEQihvYmopLAogCQkJCQkgICAgIHRyYW5zKTsKIAkJYnJlYWs7CisJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfTURCOgorCQllcnIgPSBkc2Ffc2xhdmVfcG9ydF9tZGJfYWRkKGRldiwgU1dJVENIREVWX09CSl9QT1JUX01EQihvYmopLAorCQkJCQkgICAgIHRyYW5zKTsKKwkJYnJlYWs7CiAJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfVkxBTjoKIAkJZXJyID0gZHNhX3NsYXZlX3BvcnRfdmxhbl9hZGQoZGV2LAogCQkJCQkgICAgICBTV0lUQ0hERVZfT0JKX1BPUlRfVkxBTihvYmopLApAQCAtNDM1LDYgKzUwNSw5IEBACiAJCWVyciA9IGRzYV9zbGF2ZV9wb3J0X2ZkYl9kZWwoZGV2LAogCQkJCQkgICAgIFNXSVRDSERFVl9PQkpfUE9SVF9GREIob2JqKSk7CiAJCWJyZWFrOworCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX01EQjoKKwkJZXJyID0gZHNhX3NsYXZlX3BvcnRfbWRiX2RlbChkZXYsIFNXSVRDSERFVl9PQkpfUE9SVF9NREIob2JqKSk7CisJCWJyZWFrOwogCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX1ZMQU46CiAJCWVyciA9IGRzYV9zbGF2ZV9wb3J0X3ZsYW5fZGVsKGRldiwKIAkJCQkJICAgICAgU1dJVENIREVWX09CSl9QT1JUX1ZMQU4ob2JqKSk7CkBAIC00NTksNiArNTMyLDEwIEBACiAJCQkJCSAgICAgIFNXSVRDSERFVl9PQkpfUE9SVF9GREIob2JqKSwKIAkJCQkJICAgICAgY2IpOwogCQlicmVhazsKKwljYXNlIFNXSVRDSERFVl9PQkpfSURfUE9SVF9NREI6CisJCWVyciA9IGRzYV9zbGF2ZV9wb3J0X21kYl9kdW1wKGRldiwgU1dJVENIREVWX09CSl9QT1JUX01EQihvYmopLAorCQkJCQkgICAgICBjYik7CisJCWJyZWFrOwogCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX1ZMQU46CiAJCWVyciA9IGRzYV9zbGF2ZV9wb3J0X3ZsYW5fZHVtcChkZXYsCiAJCQkJCSAgICAgICBTV0lUQ0hERVZfT0JKX1BPUlRfVkxBTihvYmopLApAQCAtNDgxLDggKzU1OCw4IEBACiAKIAlwLT5icmlkZ2VfZGV2ID0gYnI7CiAKLQlpZiAoZHMtPmRydi0+cG9ydF9icmlkZ2Vfam9pbikKLQkJcmV0ID0gZHMtPmRydi0+cG9ydF9icmlkZ2Vfam9pbihkcywgcC0+cG9ydCwgYnIpOworCWlmIChkcy0+b3BzLT5wb3J0X2JyaWRnZV9qb2luKQorCQlyZXQgPSBkcy0+b3BzLT5wb3J0X2JyaWRnZV9qb2luKGRzLCBwLT5wb3J0LCBicik7CiAKIAlyZXR1cm4gcmV0ID09IC1FT1BOT1RTVVBQID8gMCA6IHJldDsKIH0KQEAgLTQ5MywxNiArNTcwLDE1IEBACiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCiAKLQlpZiAoZHMtPmRydi0+cG9ydF9icmlkZ2VfbGVhdmUpCi0JCWRzLT5kcnYtPnBvcnRfYnJpZGdlX2xlYXZlKGRzLCBwLT5wb3J0KTsKKwlpZiAoZHMtPm9wcy0+cG9ydF9icmlkZ2VfbGVhdmUpCisJCWRzLT5vcHMtPnBvcnRfYnJpZGdlX2xlYXZlKGRzLCBwLT5wb3J0KTsKIAogCXAtPmJyaWRnZV9kZXYgPSBOVUxMOwogCiAJLyogUG9ydCBsZWZ0IHRoZSBicmlkZ2UsIHB1dCBpbiBCUl9TVEFURV9ESVNBQkxFRCBieSB0aGUgYnJpZGdlIGxheWVyLAogCSAqIHNvIGFsbG93IGl0IHRvIGJlIGluIEJSX1NUQVRFX0ZPUldBUkRJTkcgdG8gYmUga2VwdCBmdW5jdGlvbmFsCiAJICovCi0JaWYgKGRzLT5kcnYtPnBvcnRfc3RwX3N0YXRlX3NldCkKLQkJZHMtPmRydi0+cG9ydF9zdHBfc3RhdGVfc2V0KGRzLCBwLT5wb3J0LCBCUl9TVEFURV9GT1JXQVJESU5HKTsKKwlkc2FfcG9ydF9zZXRfc3RwX3N0YXRlKGRzLCBwLT5wb3J0LCBCUl9TVEFURV9GT1JXQVJESU5HKTsKIH0KIAogc3RhdGljIGludCBkc2Ffc2xhdmVfcG9ydF9hdHRyX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtNjA1LDggKzY4MSw4IEBACiAJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAKLQlpZiAoZHMtPmRydi0+Z2V0X3JlZ3NfbGVuKQotCQlyZXR1cm4gZHMtPmRydi0+Z2V0X3JlZ3NfbGVuKGRzLCBwLT5wb3J0KTsKKwlpZiAoZHMtPm9wcy0+Z2V0X3JlZ3NfbGVuKQorCQlyZXR1cm4gZHMtPm9wcy0+Z2V0X3JlZ3NfbGVuKGRzLCBwLT5wb3J0KTsKIAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTYxNyw4ICs2OTMsOCBAQAogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCi0JaWYgKGRzLT5kcnYtPmdldF9yZWdzKQotCQlkcy0+ZHJ2LT5nZXRfcmVncyhkcywgcC0+cG9ydCwgcmVncywgX3ApOworCWlmIChkcy0+b3BzLT5nZXRfcmVncykKKwkJZHMtPm9wcy0+Z2V0X3JlZ3MoZHMsIHAtPnBvcnQsIHJlZ3MsIF9wKTsKIH0KIAogc3RhdGljIGludCBkc2Ffc2xhdmVfbndheV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNjUxLDggKzcyNyw4IEBACiAJaWYgKGRzLT5jZCAmJiBkcy0+Y2QtPmVlcHJvbV9sZW4pCiAJCXJldHVybiBkcy0+Y2QtPmVlcHJvbV9sZW47CiAKLQlpZiAoZHMtPmRydi0+Z2V0X2VlcHJvbV9sZW4pCi0JCXJldHVybiBkcy0+ZHJ2LT5nZXRfZWVwcm9tX2xlbihkcyk7CisJaWYgKGRzLT5vcHMtPmdldF9lZXByb21fbGVuKQorCQlyZXR1cm4gZHMtPm9wcy0+Z2V0X2VlcHJvbV9sZW4oZHMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NjMsOCArNzM5LDggQEAKIAlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAotCWlmIChkcy0+ZHJ2LT5nZXRfZWVwcm9tKQotCQlyZXR1cm4gZHMtPmRydi0+Z2V0X2VlcHJvbShkcywgZWVwcm9tLCBkYXRhKTsKKwlpZiAoZHMtPm9wcy0+Z2V0X2VlcHJvbSkKKwkJcmV0dXJuIGRzLT5vcHMtPmdldF9lZXByb20oZHMsIGVlcHJvbSwgZGF0YSk7CiAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CkBAIC02NzUsOCArNzUxLDggQEAKIAlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAotCWlmIChkcy0+ZHJ2LT5zZXRfZWVwcm9tKQotCQlyZXR1cm4gZHMtPmRydi0+c2V0X2VlcHJvbShkcywgZWVwcm9tLCBkYXRhKTsKKwlpZiAoZHMtPm9wcy0+c2V0X2VlcHJvbSkKKwkJcmV0dXJuIGRzLT5vcHMtPnNldF9lZXByb20oZHMsIGVlcHJvbSwgZGF0YSk7CiAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CkBAIC02OTQsOCArNzcwLDggQEAKIAkJc3RybmNweShkYXRhICsgbGVuLCAidHhfYnl0ZXMiLCBsZW4pOwogCQlzdHJuY3B5KGRhdGEgKyAyICogbGVuLCAicnhfcGFja2V0cyIsIGxlbik7CiAJCXN0cm5jcHkoZGF0YSArIDMgKiBsZW4sICJyeF9ieXRlcyIsIGxlbik7Ci0JCWlmIChkcy0+ZHJ2LT5nZXRfc3RyaW5ncyAhPSBOVUxMKQotCQkJZHMtPmRydi0+Z2V0X3N0cmluZ3MoZHMsIHAtPnBvcnQsIGRhdGEgKyA0ICogbGVuKTsKKwkJaWYgKGRzLT5vcHMtPmdldF9zdHJpbmdzKQorCQkJZHMtPm9wcy0+Z2V0X3N0cmluZ3MoZHMsIHAtPnBvcnQsIGRhdGEgKyA0ICogbGVuKTsKIAl9CiB9CiAKQEAgLTcxNCw4ICs3OTAsOCBAQAogCQlkc3QtPm1hc3Rlcl9ldGh0b29sX29wcy5nZXRfZXRodG9vbF9zdGF0cyhkZXYsIHN0YXRzLCBkYXRhKTsKIAl9CiAKLQlpZiAoZHMtPmRydi0+Z2V0X2V0aHRvb2xfc3RhdHMpCi0JCWRzLT5kcnYtPmdldF9ldGh0b29sX3N0YXRzKGRzLCBjcHVfcG9ydCwgZGF0YSArIGNvdW50KTsKKwlpZiAoZHMtPm9wcy0+Z2V0X2V0aHRvb2xfc3RhdHMpCisJCWRzLT5vcHMtPmdldF9ldGh0b29sX3N0YXRzKGRzLCBjcHVfcG9ydCwgZGF0YSArIGNvdW50KTsKIH0KIAogc3RhdGljIGludCBkc2FfY3B1X3BvcnRfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNzZXQpCkBAIC03MjcsOCArODAzLDggQEAKIAlpZiAoZHN0LT5tYXN0ZXJfZXRodG9vbF9vcHMuZ2V0X3NzZXRfY291bnQpCiAJCWNvdW50ICs9IGRzdC0+bWFzdGVyX2V0aHRvb2xfb3BzLmdldF9zc2V0X2NvdW50KGRldiwgc3NldCk7CiAKLQlpZiAoc3NldCA9PSBFVEhfU1NfU1RBVFMgJiYgZHMtPmRydi0+Z2V0X3NzZXRfY291bnQpCi0JCWNvdW50ICs9IGRzLT5kcnYtPmdldF9zc2V0X2NvdW50KGRzKTsKKwlpZiAoc3NldCA9PSBFVEhfU1NfU1RBVFMgJiYgZHMtPm9wcy0+Z2V0X3NzZXRfY291bnQpCisJCWNvdW50ICs9IGRzLT5vcHMtPmdldF9zc2V0X2NvdW50KGRzKTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTc1NSwxNCArODMxLDE0IEBACiAJCWRzdC0+bWFzdGVyX2V0aHRvb2xfb3BzLmdldF9zdHJpbmdzKGRldiwgc3RyaW5nc2V0LCBkYXRhKTsKIAl9CiAKLQlpZiAoc3RyaW5nc2V0ID09IEVUSF9TU19TVEFUUyAmJiBkcy0+ZHJ2LT5nZXRfc3RyaW5ncykgeworCWlmIChzdHJpbmdzZXQgPT0gRVRIX1NTX1NUQVRTICYmIGRzLT5vcHMtPmdldF9zdHJpbmdzKSB7CiAJCW5kYXRhID0gZGF0YSArIG1jb3VudCAqIGxlbjsKIAkJLyogVGhpcyBmdW5jdGlvbiBjb3BpZXMgRVRIX0dTVFJJTkdTX0xFTiBieXRlcywgd2Ugd2lsbCBtYW5nbGUKIAkJICogdGhlIG91dHB1dCBhZnRlciB0byBwcmVwZW5kIG91ciBDUFUgcG9ydCBwcmVmaXggd2UKIAkJICogY29uc3RydWN0ZWQgZWFybGllcgogCQkgKi8KLQkJZHMtPmRydi0+Z2V0X3N0cmluZ3MoZHMsIGNwdV9wb3J0LCBuZGF0YSk7Ci0JCWNvdW50ID0gZHMtPmRydi0+Z2V0X3NzZXRfY291bnQoZHMpOworCQlkcy0+b3BzLT5nZXRfc3RyaW5ncyhkcywgY3B1X3BvcnQsIG5kYXRhKTsKKwkJY291bnQgPSBkcy0+b3BzLT5nZXRfc3NldF9jb3VudChkcyk7CiAJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCQltZW1tb3ZlKG5kYXRhICsgKGkgKiBsZW4gKyBzaXplb2YocGZ4KSksCiAJCQkJbmRhdGEgKyBpICogbGVuLCBsZW4gLSBzaXplb2YocGZ4KSk7CkBAIC03ODIsOCArODU4LDggQEAKIAlkYXRhWzFdID0gZGV2LT5zdGF0cy50eF9ieXRlczsKIAlkYXRhWzJdID0gZGV2LT5zdGF0cy5yeF9wYWNrZXRzOwogCWRhdGFbM10gPSBkZXYtPnN0YXRzLnJ4X2J5dGVzOwotCWlmIChkcy0+ZHJ2LT5nZXRfZXRodG9vbF9zdGF0cyAhPSBOVUxMKQotCQlkcy0+ZHJ2LT5nZXRfZXRodG9vbF9zdGF0cyhkcywgcC0+cG9ydCwgZGF0YSArIDQpOworCWlmIChkcy0+b3BzLT5nZXRfZXRodG9vbF9zdGF0cykKKwkJZHMtPm9wcy0+Z2V0X2V0aHRvb2xfc3RhdHMoZHMsIHAtPnBvcnQsIGRhdGEgKyA0KTsKIH0KIAogc3RhdGljIGludCBkc2Ffc2xhdmVfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNzZXQpCkBAIC03OTUsOCArODcxLDggQEAKIAkJaW50IGNvdW50OwogCiAJCWNvdW50ID0gNDsKLQkJaWYgKGRzLT5kcnYtPmdldF9zc2V0X2NvdW50ICE9IE5VTEwpCi0JCQljb3VudCArPSBkcy0+ZHJ2LT5nZXRfc3NldF9jb3VudChkcyk7CisJCWlmIChkcy0+b3BzLT5nZXRfc3NldF9jb3VudCkKKwkJCWNvdW50ICs9IGRzLT5vcHMtPmdldF9zc2V0X2NvdW50KGRzKTsKIAogCQlyZXR1cm4gY291bnQ7CiAJfQpAQCAtODA5LDggKzg4NSw4IEBACiAJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAKLQlpZiAoZHMtPmRydi0+Z2V0X3dvbCkKLQkJZHMtPmRydi0+Z2V0X3dvbChkcywgcC0+cG9ydCwgdyk7CisJaWYgKGRzLT5vcHMtPmdldF93b2wpCisJCWRzLT5vcHMtPmdldF93b2woZHMsIHAtPnBvcnQsIHcpOwogfQogCiBzdGF0aWMgaW50IGRzYV9zbGF2ZV9zZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKncpCkBAIC04MTksOCArODk1LDggQEAKIAlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CiAJaW50IHJldCA9IC1FT1BOT1RTVVBQOwogCi0JaWYgKGRzLT5kcnYtPnNldF93b2wpCi0JCXJldCA9IGRzLT5kcnYtPnNldF93b2woZHMsIHAtPnBvcnQsIHcpOworCWlmIChkcy0+b3BzLT5zZXRfd29sKQorCQlyZXQgPSBkcy0+b3BzLT5zZXRfd29sKGRzLCBwLT5wb3J0LCB3KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC04MzEsMTAgKzkwNywxMCBAQAogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKIAlpbnQgcmV0OwogCi0JaWYgKCFkcy0+ZHJ2LT5zZXRfZWVlKQorCWlmICghZHMtPm9wcy0+c2V0X2VlZSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JcmV0ID0gZHMtPmRydi0+c2V0X2VlZShkcywgcC0+cG9ydCwgcC0+cGh5LCBlKTsKKwlyZXQgPSBkcy0+b3BzLT5zZXRfZWVlKGRzLCBwLT5wb3J0LCBwLT5waHksIGUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTg1MCwxMCArOTI2LDEwIEBACiAJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OwogCWludCByZXQ7CiAKLQlpZiAoIWRzLT5kcnYtPmdldF9lZWUpCisJaWYgKCFkcy0+b3BzLT5nZXRfZWVlKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlyZXQgPSBkcy0+ZHJ2LT5nZXRfZWVlKGRzLCBwLT5wb3J0LCBlKTsKKwlyZXQgPSBkcy0+b3BzLT5nZXRfZWVlKGRzLCBwLT5wb3J0LCBlKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC05ODgsOCArMTA2NCw4IEBACiAJCXAtPm9sZF9wYXVzZSA9IHAtPnBoeS0+cGF1c2U7CiAJfQogCi0JaWYgKGRzLT5kcnYtPmFkanVzdF9saW5rICYmIHN0YXR1c19jaGFuZ2VkKQotCQlkcy0+ZHJ2LT5hZGp1c3RfbGluayhkcywgcC0+cG9ydCwgcC0+cGh5KTsKKwlpZiAoZHMtPm9wcy0+YWRqdXN0X2xpbmsgJiYgc3RhdHVzX2NoYW5nZWQpCisJCWRzLT5vcHMtPmFkanVzdF9saW5rKGRzLCBwLT5wb3J0LCBwLT5waHkpOwogCiAJaWYgKHN0YXR1c19jaGFuZ2VkKQogCQlwaHlfcHJpbnRfc3RhdHVzKHAtPnBoeSk7CkBAIC0xMDA0LDggKzEwODAsOCBAQAogCWlmIChkZXYpIHsKIAkJcCA9IG5ldGRldl9wcml2KGRldik7CiAJCWRzID0gcC0+cGFyZW50OwotCQlpZiAoZHMtPmRydi0+Zml4ZWRfbGlua191cGRhdGUpCi0JCQlkcy0+ZHJ2LT5maXhlZF9saW5rX3VwZGF0ZShkcywgcC0+cG9ydCwgc3RhdHVzKTsKKwkJaWYgKGRzLT5vcHMtPmZpeGVkX2xpbmtfdXBkYXRlKQorCQkJZHMtPm9wcy0+Zml4ZWRfbGlua191cGRhdGUoZHMsIHAtPnBvcnQsIHN0YXR1cyk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMDYyLDggKzExMzgsOCBAQAogCQlwaHlfZG4gPSBwb3J0X2RuOwogCX0KIAotCWlmIChkcy0+ZHJ2LT5nZXRfcGh5X2ZsYWdzKQotCQlwaHlfZmxhZ3MgPSBkcy0+ZHJ2LT5nZXRfcGh5X2ZsYWdzKGRzLCBwLT5wb3J0KTsKKwlpZiAoZHMtPm9wcy0+Z2V0X3BoeV9mbGFncykKKwkJcGh5X2ZsYWdzID0gZHMtPm9wcy0+Z2V0X3BoeV9mbGFncyhkcywgcC0+cG9ydCk7CiAKIAlpZiAocGh5X2RuKSB7CiAJCWludCBwaHlfaWQgPSBvZl9tZGlvX3BhcnNlX2FkZHIoJnNsYXZlX2Rldi0+ZGV2LCBwaHlfZG4pOwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS90YWdfcWNhLmMgYi9uZXQvZHNhL3RhZ19xY2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzkwY2FjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2RzYS90YWdfcWNhLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSAiZHNhX3ByaXYuaCIKKworI2RlZmluZSBRQ0FfSERSX0xFTgkyCisjZGVmaW5lIFFDQV9IRFJfVkVSU0lPTgkweDIKKworI2RlZmluZSBRQ0FfSERSX1JFQ1ZfVkVSU0lPTl9NQVNLCUdFTk1BU0soMTUsIDE0KQorI2RlZmluZSBRQ0FfSERSX1JFQ1ZfVkVSU0lPTl9TCQkxNAorI2RlZmluZSBRQ0FfSERSX1JFQ1ZfUFJJT1JJVFlfTUFTSwlHRU5NQVNLKDEzLCAxMSkKKyNkZWZpbmUgUUNBX0hEUl9SRUNWX1BSSU9SSVRZX1MJCTExCisjZGVmaW5lIFFDQV9IRFJfUkVDVl9UWVBFX01BU0sJCUdFTk1BU0soMTAsIDYpCisjZGVmaW5lIFFDQV9IRFJfUkVDVl9UWVBFX1MJCTYKKyNkZWZpbmUgUUNBX0hEUl9SRUNWX0ZSQU1FX0lTX1RBR0dFRAlCSVQoMykKKyNkZWZpbmUgUUNBX0hEUl9SRUNWX1NPVVJDRV9QT1JUX01BU0sJR0VOTUFTSygyLCAwKQorCisjZGVmaW5lIFFDQV9IRFJfWE1JVF9WRVJTSU9OX01BU0sJR0VOTUFTSygxNSwgMTQpCisjZGVmaW5lIFFDQV9IRFJfWE1JVF9WRVJTSU9OX1MJCTE0CisjZGVmaW5lIFFDQV9IRFJfWE1JVF9QUklPUklUWV9NQVNLCUdFTk1BU0soMTMsIDExKQorI2RlZmluZSBRQ0FfSERSX1hNSVRfUFJJT1JJVFlfUwkJMTEKKyNkZWZpbmUgUUNBX0hEUl9YTUlUX0NPTlRST0xfTUFTSwlHRU5NQVNLKDEwLCA4KQorI2RlZmluZSBRQ0FfSERSX1hNSVRfQ09OVFJPTF9TCQk4CisjZGVmaW5lIFFDQV9IRFJfWE1JVF9GUk9NX0NQVQkJQklUKDcpCisjZGVmaW5lIFFDQV9IRFJfWE1JVF9EUF9CSVRfTUFTSwlHRU5NQVNLKDYsIDApCisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcWNhX3RhZ194bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgKnBoZHIsIGhkcjsKKworCWRldi0+c3RhdHMudHhfcGFja2V0cysrOworCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CisKKwlpZiAoc2tiX2Nvd19oZWFkKHNrYiwgMCkgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJc2tiX3B1c2goc2tiLCBRQ0FfSERSX0xFTik7CisKKwltZW1tb3ZlKHNrYi0+ZGF0YSwgc2tiLT5kYXRhICsgUUNBX0hEUl9MRU4sIDIgKiBFVEhfQUxFTik7CisJcGhkciA9ICh1MTYgKikoc2tiLT5kYXRhICsgMiAqIEVUSF9BTEVOKTsKKworCS8qIFNldCB0aGUgdmVyc2lvbiBmaWVsZCwgYW5kIHNldCBkZXN0aW5hdGlvbiBwb3J0IGluZm9ybWF0aW9uICovCisJaGRyID0gUUNBX0hEUl9WRVJTSU9OIDw8IFFDQV9IRFJfWE1JVF9WRVJTSU9OX1MgfAorCQlRQ0FfSERSX1hNSVRfRlJPTV9DUFUgfAorCQlCSVQocC0+cG9ydCk7CisKKwkqcGhkciA9IGh0b25zKGhkcik7CisKKwlyZXR1cm4gc2tiOworCitvdXRfZnJlZToKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBxY2FfdGFnX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IHBhY2tldF90eXBlICpwdCwgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQoreworCXN0cnVjdCBkc2Ffc3dpdGNoX3RyZWUgKmRzdCA9IGRldi0+ZHNhX3B0cjsKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHM7CisJdTggdmVyOworCWludCBwb3J0OworCV9fYmUxNiAqcGhkciwgaGRyOworCisJaWYgKHVubGlrZWx5KCFkc3QpKQorCQlnb3RvIG91dF9kcm9wOworCisJc2tiID0gc2tiX3Vuc2hhcmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJZ290byBvdXQ7CisKKwlpZiAodW5saWtlbHkoIXBza2JfbWF5X3B1bGwoc2tiLCBRQ0FfSERSX0xFTikpKQorCQlnb3RvIG91dF9kcm9wOworCisJLyogVGhlIFFDQSBoZWFkZXIgaXMgYWRkZWQgYnkgdGhlIHN3aXRjaCBiZXR3ZWVuIHNyYyBhZGRyIGFuZCBFdGhlcnR5cGUKKwkgKiBBdCB0aGlzIHBvaW50LCBza2ItPmRhdGEgcG9pbnRzIHRvIGV0aGVydHlwZSBzbyBoZWFkZXIgc2hvdWxkIGJlCisJICogcmlnaHQgYmVmb3JlCisJICovCisJcGhkciA9IChfX2JlMTYgKikoc2tiLT5kYXRhIC0gMik7CisJaGRyID0gbnRvaHMoKnBoZHIpOworCisJLyogTWFrZSBzdXJlIHRoZSB2ZXJzaW9uIGlzIGNvcnJlY3QgKi8KKwl2ZXIgPSAoaGRyICYgUUNBX0hEUl9SRUNWX1ZFUlNJT05fTUFTSykgPj4gUUNBX0hEUl9SRUNWX1ZFUlNJT05fUzsKKwlpZiAodW5saWtlbHkodmVyICE9IFFDQV9IRFJfVkVSU0lPTikpCisJCWdvdG8gb3V0X2Ryb3A7CisKKwkvKiBSZW1vdmUgUUNBIHRhZyBhbmQgcmVjYWxjdWxhdGUgY2hlY2tzdW0gKi8KKwlza2JfcHVsbF9yY3N1bShza2IsIFFDQV9IRFJfTEVOKTsKKwltZW1tb3ZlKHNrYi0+ZGF0YSAtIEVUSF9ITEVOLCBza2ItPmRhdGEgLSBFVEhfSExFTiAtIFFDQV9IRFJfTEVOLAorCQlFVEhfSExFTiAtIFFDQV9IRFJfTEVOKTsKKworCS8qIFRoaXMgcHJvdG9jb2wgZG9lc24ndCBzdXBwb3J0IGNhc2NhZGluZyBtdWx0aXBsZSBzd2l0Y2hlcyBzbyBpdCdzCisJICogc2FmZSB0byBhc3N1bWUgdGhlIHN3aXRjaCBpcyBmaXJzdCBpbiB0aGUgdHJlZQorCSAqLworCWRzID0gZHN0LT5kc1swXTsKKwlpZiAoIWRzKQorCQlnb3RvIG91dF9kcm9wOworCisJLyogR2V0IHNvdXJjZSBwb3J0IGluZm9ybWF0aW9uICovCisJcG9ydCA9IChoZHIgJiBRQ0FfSERSX1JFQ1ZfU09VUkNFX1BPUlRfTUFTSyk7CisJaWYgKCFkcy0+cG9ydHNbcG9ydF0ubmV0ZGV2KQorCQlnb3RvIG91dF9kcm9wOworCisJLyogVXBkYXRlIHNrYiAmIGZvcndhcmQgdGhlIGZyYW1lIGFjY29yZGluZ2x5ICovCisJc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9IT1NUOworCXNrYi0+ZGV2ID0gZHMtPnBvcnRzW3BvcnRdLm5ldGRldjsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBza2ItPmRldik7CisKKwlza2ItPmRldi0+c3RhdHMucnhfcGFja2V0cysrOworCXNrYi0+ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKKworCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKKworb3V0X2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBkc2FfZGV2aWNlX29wcyBxY2FfbmV0ZGV2X29wcyA9IHsKKwkueG1pdAk9IHFjYV90YWdfeG1pdCwKKwkucmN2CT0gcWNhX3RhZ19yY3YsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvS2NvbmZpZyBiL25ldC9pcHY0L0tjb25maWcKaW5kZXggNTBkNmE5Yi4uMzAwYjA2OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvS2NvbmZpZworKysgYi9uZXQvaXB2NC9LY29uZmlnCkBAIC02NDAsNiArNjQwLDIxIEBACiAJICBELkEuIEhheWVzIGFuZCBHLiBBcm1pdGFnZS4gIlJldmlzaXRpbmcgVENQIGNvbmdlc3Rpb24gY29udHJvbCB1c2luZwogCSAgZGVsYXkgZ3JhZGllbnRzLiIgSW4gTmV0d29ya2luZyAyMDExLiBQcmVwcmludDogaHR0cDovL2dvby5nbC9ObzN2ZGcKIAorY29uZmlnIFRDUF9DT05HX0JCUgorCXRyaXN0YXRlICJCQlIgVENQIgorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKworCUJCUiAoQm90dGxlbmVjayBCYW5kd2lkdGggYW5kIFJUVCkgVENQIGNvbmdlc3Rpb24gY29udHJvbCBhaW1zIHRvCisJbWF4aW1pemUgbmV0d29yayB1dGlsaXphdGlvbiBhbmQgbWluaW1pemUgcXVldWVzLiBJdCBidWlsZHMgYW4gZXhwbGljaXQKKwltb2RlbCBvZiB0aGUgdGhlIGJvdHRsZW5lY2sgZGVsaXZlcnkgcmF0ZSBhbmQgcGF0aCByb3VuZC10cmlwCisJcHJvcGFnYXRpb24gZGVsYXkuIEl0IHRvbGVyYXRlcyBwYWNrZXQgbG9zcyBhbmQgZGVsYXkgdW5yZWxhdGVkIHRvCisJY29uZ2VzdGlvbi4gSXQgY2FuIG9wZXJhdGUgb3ZlciBMQU4sIFdBTiwgY2VsbHVsYXIsIHdpZmksIG9yIGNhYmxlCisJbW9kZW0gbGlua3MuIEl0IGNhbiBjb2V4aXN0IHdpdGggZmxvd3MgdGhhdCB1c2UgbG9zcy1iYXNlZCBjb25nZXN0aW9uCisJY29udHJvbCwgYW5kIGNhbiBvcGVyYXRlIHdpdGggc2hhbGxvdyBidWZmZXJzLCBkZWVwIGJ1ZmZlcnMsCisJYnVmZmVyYmxvYXQsIHBvbGljZXJzLCBvciBBUU0gc2NoZW1lcyB0aGF0IGRvIG5vdCBwcm92aWRlIGEgZGVsYXkKKwlzaWduYWwuIEl0IHJlcXVpcmVzIHRoZSBmcSAoIkZhaXIgUXVldWUiKSBwYWNpbmcgcGFja2V0IHNjaGVkdWxlci4KKwogY2hvaWNlCiAJcHJvbXB0ICJEZWZhdWx0IFRDUCBjb25nZXN0aW9uIGNvbnRyb2wiCiAJZGVmYXVsdCBERUZBVUxUX0NVQklDCkBAIC02NzQsNiArNjg5LDkgQEAKIAljb25maWcgREVGQVVMVF9DREcKIAkJYm9vbCAiQ0RHIiBpZiBUQ1BfQ09OR19DREc9eQogCisJY29uZmlnIERFRkFVTFRfQkJSCisJCWJvb2wgIkJCUiIgaWYgVENQX0NPTkdfQkJSPXkKKwogCWNvbmZpZyBERUZBVUxUX1JFTk8KIAkJYm9vbCAiUmVubyIKIGVuZGNob2ljZQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvTWFrZWZpbGUgYi9uZXQvaXB2NC9NYWtlZmlsZQppbmRleCAyNDYyOWI2Li5iYzZhNmM4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIAkgICAgIGluZXRfdGltZXdhaXRfc29jay5vIGluZXRfY29ubmVjdGlvbl9zb2NrLm8gXAogCSAgICAgdGNwLm8gdGNwX2lucHV0Lm8gdGNwX291dHB1dC5vIHRjcF90aW1lci5vIHRjcF9pcHY0Lm8gXAogCSAgICAgdGNwX21pbmlzb2Nrcy5vIHRjcF9jb25nLm8gdGNwX21ldHJpY3MubyB0Y3BfZmFzdG9wZW4ubyBcCi0JICAgICB0Y3BfcmVjb3ZlcnkubyBcCisJICAgICB0Y3BfcmF0ZS5vIHRjcF9yZWNvdmVyeS5vIFwKIAkgICAgIHRjcF9vZmZsb2FkLm8gZGF0YWdyYW0ubyByYXcubyB1ZHAubyB1ZHBsaXRlLm8gXAogCSAgICAgdWRwX29mZmxvYWQubyBhcnAubyBpY21wLm8gZGV2aW5ldC5vIGFmX2luZXQubyBpZ21wLm8gXAogCSAgICAgZmliX2Zyb250ZW5kLm8gZmliX3NlbWFudGljcy5vIGZpYl90cmllLm8gXApAQCAtNDEsNiArNDEsNyBAQAogb2JqLSQoQ09ORklHX0lORVRfVENQX0RJQUcpICs9IHRjcF9kaWFnLm8KIG9iai0kKENPTkZJR19JTkVUX1VEUF9ESUFHKSArPSB1ZHBfZGlhZy5vCiBvYmotJChDT05GSUdfTkVUX1RDUFBST0JFKSArPSB0Y3BfcHJvYmUubworb2JqLSQoQ09ORklHX1RDUF9DT05HX0JCUikgKz0gdGNwX2Jici5vCiBvYmotJChDT05GSUdfVENQX0NPTkdfQklDKSArPSB0Y3BfYmljLm8KIG9iai0kKENPTkZJR19UQ1BfQ09OR19DREcpICs9IHRjcF9jZGcubwogb2JqLSQoQ09ORklHX1RDUF9DT05HX0NVQklDKSArPSB0Y3BfY3ViaWMubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYWZfaW5ldC5jIGIvbmV0L2lwdjQvYWZfaW5ldC5jCmluZGV4IDU1NTEzZTYuLjFlZmZjOTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2FmX2luZXQuYworKysgYi9uZXQvaXB2NC9hZl9pbmV0LmMKQEAgLTIxMSwyNCArMjExLDE5IEBACiAJICogd2UgY2FuIG9ubHkgYWxsb3cgdGhlIGJhY2tsb2cgdG8gYmUgYWRqdXN0ZWQuCiAJICovCiAJaWYgKG9sZF9zdGF0ZSAhPSBUQ1BfTElTVEVOKSB7Ci0JCS8qIENoZWNrIHNwZWNpYWwgc2V0dXBzIGZvciB0ZXN0aW5nIHB1cnBvc2UgdG8gZW5hYmxlIFRGTyB3L28KLQkJICogcmVxdWlyaW5nIFRDUF9GQVNUT1BFTiBzb2Nrb3B0LgorCQkvKiBFbmFibGUgVEZPIHcvbyByZXF1aXJpbmcgVENQX0ZBU1RPUEVOIHNvY2tldCBvcHRpb24uCiAJCSAqIE5vdGUgdGhhdCBvbmx5IFRDUCBzb2NrZXRzIChTT0NLX1NUUkVBTSkgd2lsbCByZWFjaCBoZXJlLgotCQkgKiBBbHNvIGZhc3RvcGVucSBtYXkgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBiZWNhdXNlIHRoaXMKLQkJICogc29ja2V0IHdhcyBpbiBUQ1BfTElTVEVOIHN0YXRlIHByZXZpb3VzbHkgYnV0IHdhcwotCQkgKiBzaHV0ZG93bigpIChyYXRoZXIgdGhhbiBjbG9zZSgpKS4KKwkJICogQWxzbyBmYXN0b3BlbiBiYWNrbG9nIG1heSBhbHJlYWR5IGJlZW4gc2V0IHZpYSB0aGUgb3B0aW9uCisJCSAqIGJlY2F1c2UgdGhlIHNvY2tldCB3YXMgaW4gVENQX0xJU1RFTiBzdGF0ZSBwcmV2aW91c2x5IGJ1dAorCQkgKiB3YXMgc2h1dGRvd24oKSByYXRoZXIgdGhhbiBjbG9zZSgpLgogCQkgKi8KLQkJaWYgKChzeXNjdGxfdGNwX2Zhc3RvcGVuICYgVEZPX1NFUlZFUl9FTkFCTEUpICE9IDAgJiYKKwkJaWYgKChzeXNjdGxfdGNwX2Zhc3RvcGVuICYgVEZPX1NFUlZFUl9XT19TT0NLT1BUMSkgJiYKKwkJICAgIChzeXNjdGxfdGNwX2Zhc3RvcGVuICYgVEZPX1NFUlZFUl9FTkFCTEUpICYmCiAJCSAgICAhaW5ldF9jc2soc2spLT5pY3NrX2FjY2VwdF9xdWV1ZS5mYXN0b3BlbnEubWF4X3FsZW4pIHsKLQkJCWlmICgoc3lzY3RsX3RjcF9mYXN0b3BlbiAmIFRGT19TRVJWRVJfV09fU09DS09QVDEpICE9IDApCi0JCQkJZmFzdG9wZW5fcXVldWVfdHVuZShzaywgYmFja2xvZyk7Ci0JCQllbHNlIGlmICgoc3lzY3RsX3RjcF9mYXN0b3BlbiAmCi0JCQkJICBURk9fU0VSVkVSX1dPX1NPQ0tPUFQyKSAhPSAwKQotCQkJCWZhc3RvcGVuX3F1ZXVlX3R1bmUoc2ssCi0JCQkJICAgICgodWludClzeXNjdGxfdGNwX2Zhc3RvcGVuKSA+PiAxNik7Ci0KKwkJCWZhc3RvcGVuX3F1ZXVlX3R1bmUoc2ssIGJhY2tsb2cpOwogCQkJdGNwX2Zhc3RvcGVuX2luaXRfa2V5X29uY2UodHJ1ZSk7CiAJCX0KKwogCQllcnIgPSBpbmV0X2Nza19saXN0ZW5fc3RhcnQoc2ssIGJhY2tsb2cpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CkBAIC05MjEsNiArOTE2LDggQEAKIAkubW1hcAkJICAgPSBzb2NrX25vX21tYXAsCiAJLnNlbmRwYWdlCSAgID0gaW5ldF9zZW5kcGFnZSwKIAkuc3BsaWNlX3JlYWQJICAgPSB0Y3Bfc3BsaWNlX3JlYWQsCisJLnJlYWRfc29jawkgICA9IHRjcF9yZWFkX3NvY2ssCisJLnBlZWtfbGVuCSAgID0gdGNwX3BlZWtfbGVuLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X3NldHNvY2tvcHQgPSBjb21wYXRfc29ja19jb21tb25fc2V0c29ja29wdCwKIAkuY29tcGF0X2dldHNvY2tvcHQgPSBjb21wYXRfc29ja19jb21tb25fZ2V0c29ja29wdCwKQEAgLTExOTUsNyArMTE5Miw3IEBACiBzdHJ1Y3Qgc2tfYnVmZiAqaW5ldF9nc29fc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKLQlib29sIHVkcGZyYWcgPSBmYWxzZSwgZml4ZWRpZCA9IGZhbHNlLCBlbmNhcDsKKwlib29sIHVkcGZyYWcgPSBmYWxzZSwgZml4ZWRpZCA9IGZhbHNlLCBnc29fcGFydGlhbCwgZW5jYXA7CiAJc3RydWN0IHNrX2J1ZmYgKnNlZ3MgPSBFUlJfUFRSKC1FSU5WQUwpOwogCWNvbnN0IHN0cnVjdCBuZXRfb2ZmbG9hZCAqb3BzOwogCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwpAQCAtMTI0OCw2ICsxMjQ1LDggQEAKIAlpZiAoSVNfRVJSX09SX05VTEwoc2VncykpCiAJCWdvdG8gb3V0OwogCisJZ3NvX3BhcnRpYWwgPSAhIShza2Jfc2hpbmZvKHNlZ3MpLT5nc29fdHlwZSAmIFNLQl9HU09fUEFSVElBTCk7CisKIAlza2IgPSBzZWdzOwogCWRvIHsKIAkJaXBoID0gKHN0cnVjdCBpcGhkciAqKShza2JfbWFjX2hlYWRlcihza2IpICsgbmhvZmYpOwpAQCAtMTI2Miw5ICsxMjYxLDEzIEBACiAJCQkJaXBoLT5pZCA9IGh0b25zKGlkKTsKIAkJCQlpZCArPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzOwogCQkJfQotCQkJdG90X2xlbiA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgKwotCQkJCSAgU0tCX0dTT19DQihza2IpLT5kYXRhX29mZnNldCArCi0JCQkJICBza2ItPmhlYWQgLSAodW5zaWduZWQgY2hhciAqKWlwaDsKKworCQkJaWYgKGdzb19wYXJ0aWFsKQorCQkJCXRvdF9sZW4gPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplICsKKwkJCQkJICBTS0JfR1NPX0NCKHNrYiktPmRhdGFfb2Zmc2V0ICsKKwkJCQkJICBza2ItPmhlYWQgLSAodW5zaWduZWQgY2hhciAqKWlwaDsKKwkJCWVsc2UKKwkJCQl0b3RfbGVuID0gc2tiLT5sZW4gLSBuaG9mZjsKIAkJfSBlbHNlIHsKIAkJCWlmICghZml4ZWRpZCkKIAkJCQlpcGgtPmlkID0gaHRvbnMoaWQrKyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9kZXZpbmV0LmMgYi9uZXQvaXB2NC9kZXZpbmV0LmMKaW5kZXggNDE1ZTExNy4uMDYyYTY3YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZGV2aW5ldC5jCisrKyBiL25ldC9pcHY0L2RldmluZXQuYwpAQCAtMjIzMiw3ICsyMjMyLDcgQEAKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbmV0X3N5c2N0bF9yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQsIGNoYXIgKmRldl9uYW1lLAotCQkJCQlzdHJ1Y3QgaXB2NF9kZXZjb25mICpwKQorCQkJCSAgICAgaW50IGlmaW5kZXgsIHN0cnVjdCBpcHY0X2RldmNvbmYgKnApCiB7CiAJaW50IGk7CiAJc3RydWN0IGRldmluZXRfc3lzY3RsX3RhYmxlICp0OwpAQCAtMjI1NSw2ICsyMjU1LDggQEAKIAkJZ290byBmcmVlOwogCiAJcC0+c3lzY3RsID0gdDsKKworCWluZXRfbmV0Y29uZl9ub3RpZnlfZGV2Y29uZihuZXQsIE5FVENPTkZBX0FMTCwgaWZpbmRleCwgcCk7CiAJcmV0dXJuIDA7CiAKIGZyZWU6CkBAIC0yMjg2LDcgKzIyODgsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJZXJyID0gX19kZXZpbmV0X3N5c2N0bF9yZWdpc3RlcihkZXZfbmV0KGlkZXYtPmRldiksIGlkZXYtPmRldi0+bmFtZSwKLQkJCQkJJmlkZXYtPmNuZik7CisJCQkJCWlkZXYtPmRldi0+aWZpbmRleCwgJmlkZXYtPmNuZik7CiAJaWYgKGVycikKIAkJbmVpZ2hfc3lzY3RsX3VucmVnaXN0ZXIoaWRldi0+YXJwX3Bhcm1zKTsKIAlyZXR1cm4gZXJyOwpAQCAtMjM0NywxMSArMjM0OSwxMiBAQAogCX0KIAogI2lmZGVmIENPTkZJR19TWVNDVEwKLQllcnIgPSBfX2RldmluZXRfc3lzY3RsX3JlZ2lzdGVyKG5ldCwgImFsbCIsIGFsbCk7CisJZXJyID0gX19kZXZpbmV0X3N5c2N0bF9yZWdpc3RlcihuZXQsICJhbGwiLCBORVRDT05GQV9JRklOREVYX0FMTCwgYWxsKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJfcmVnX2FsbDsKIAotCWVyciA9IF9fZGV2aW5ldF9zeXNjdGxfcmVnaXN0ZXIobmV0LCAiZGVmYXVsdCIsIGRmbHQpOworCWVyciA9IF9fZGV2aW5ldF9zeXNjdGxfcmVnaXN0ZXIobmV0LCAiZGVmYXVsdCIsCisJCQkJCU5FVENPTkZBX0lGSU5ERVhfREVGQVVMVCwgZGZsdCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyX3JlZ19kZmx0OwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfZnJvbnRlbmQuYyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCmluZGV4IGVmMmViZWIuLmMzYjgwNDcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCisrKyBiL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jCkBAIC05Myw5ICs5Myw2IEBACiAJCXJldHVybiBOVUxMOwogCiAJc3dpdGNoIChpZCkgewotCWNhc2UgUlRfVEFCTEVfTE9DQUw6Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPmlwdjQuZmliX2xvY2FsLCB0Yik7Ci0JCWJyZWFrOwogCWNhc2UgUlRfVEFCTEVfTUFJTjoKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+aXB2NC5maWJfbWFpbiwgdGIpOwogCQlicmVhazsKQEAgLTEzNyw5ICsxMzQsNiBAQAogewogI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKIAlzd2l0Y2ggKG5ldy0+dGJfaWQpIHsKLQljYXNlIFJUX1RBQkxFX0xPQ0FMOgotCQlyY3VfYXNzaWduX3BvaW50ZXIobmV0LT5pcHY0LmZpYl9sb2NhbCwgbmV3KTsKLQkJYnJlYWs7CiAJY2FzZSBSVF9UQUJMRV9NQUlOOgogCQlyY3VfYXNzaWduX3BvaW50ZXIobmV0LT5pcHY0LmZpYl9tYWluLCBuZXcpOwogCQlicmVhazsKQEAgLTE4OCwyNiArMTgyLDEzIEBACiAJCXN0cnVjdCBmaWJfdGFibGUgKnRiOwogCiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGIsIHRtcCwgaGVhZCwgdGJfaGxpc3QpCi0JCQlmbHVzaGVkICs9IGZpYl90YWJsZV9mbHVzaCh0Yik7CisJCQlmbHVzaGVkICs9IGZpYl90YWJsZV9mbHVzaChuZXQsIHRiKTsKIAl9CiAKIAlpZiAoZmx1c2hlZCkKIAkJcnRfY2FjaGVfZmx1c2gobmV0KTsKIH0KIAotdm9pZCBmaWJfZmx1c2hfZXh0ZXJuYWwoc3RydWN0IG5ldCAqbmV0KQotewotCXN0cnVjdCBmaWJfdGFibGUgKnRiOwotCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCXVuc2lnbmVkIGludCBoOwotCi0JZm9yIChoID0gMDsgaCA8IEZJQl9UQUJMRV9IQVNIU1o7IGgrKykgewotCQloZWFkID0gJm5ldC0+aXB2NC5maWJfdGFibGVfaGFzaFtoXTsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkodGIsIGhlYWQsIHRiX2hsaXN0KQotCQkJZmliX3RhYmxlX2ZsdXNoX2V4dGVybmFsKHRiKTsKLQl9Ci19Ci0KIC8qCiAgKiBGaW5kIGFkZHJlc3MgdHlwZSBhcyBpZiBvbmx5ICJkZXYiIHdhcyBwcmVzZW50IGluIHRoZSBzeXN0ZW0uIElmCiAgKiBvbl9kZXYgaXMgTlVMTCB0aGVuIGFsbCBpbnRlcmZhY2VzIGFyZSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uCkBAIC01MDksNiArNDkwLDcgQEAKIAkJaWYgKCFkZXYpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJY2ZnLT5mY19vaWYgPSBkZXYtPmlmaW5kZXg7CisJCWNmZy0+ZmNfdGFibGUgPSBsM21kZXZfZmliX3RhYmxlKGRldik7CiAJCWlmIChjb2xvbikgewogCQkJc3RydWN0IGluX2lmYWRkciAqaWZhOwogCQkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3J0bmwoZGV2KTsKQEAgLTU5NSwxMyArNTc3LDEzIEBACiAJCQlpZiAoY21kID09IFNJT0NERUxSVCkgewogCQkJCXRiID0gZmliX2dldF90YWJsZShuZXQsIGNmZy5mY190YWJsZSk7CiAJCQkJaWYgKHRiKQotCQkJCQllcnIgPSBmaWJfdGFibGVfZGVsZXRlKHRiLCAmY2ZnKTsKKwkJCQkJZXJyID0gZmliX3RhYmxlX2RlbGV0ZShuZXQsIHRiLCAmY2ZnKTsKIAkJCQllbHNlCiAJCQkJCWVyciA9IC1FU1JDSDsKIAkJCX0gZWxzZSB7CiAJCQkJdGIgPSBmaWJfbmV3X3RhYmxlKG5ldCwgY2ZnLmZjX3RhYmxlKTsKIAkJCQlpZiAodGIpCi0JCQkJCWVyciA9IGZpYl90YWJsZV9pbnNlcnQodGIsICZjZmcpOworCQkJCQllcnIgPSBmaWJfdGFibGVfaW5zZXJ0KG5ldCwgdGIsICZjZmcpOwogCQkJCWVsc2UKIAkJCQkJZXJyID0gLUVOT0JVRlM7CiAJCQl9CkBAIC03MjQsNyArNzA2LDcgQEAKIAkJZ290byBlcnJvdXQ7CiAJfQogCi0JZXJyID0gZmliX3RhYmxlX2RlbGV0ZSh0YiwgJmNmZyk7CisJZXJyID0gZmliX3RhYmxlX2RlbGV0ZShuZXQsIHRiLCAmY2ZnKTsKIGVycm91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtNzQ2LDcgKzcyOCw3IEBACiAJCWdvdG8gZXJyb3V0OwogCX0KIAotCWVyciA9IGZpYl90YWJsZV9pbnNlcnQodGIsICZjZmcpOworCWVyciA9IGZpYl90YWJsZV9pbnNlcnQobmV0LCB0YiwgJmNmZyk7CiBlcnJvdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTgzMyw5ICs4MTUsOSBAQAogCQljZmcuZmNfc2NvcGUgPSBSVF9TQ09QRV9IT1NUOwogCiAJaWYgKGNtZCA9PSBSVE1fTkVXUk9VVEUpCi0JCWZpYl90YWJsZV9pbnNlcnQodGIsICZjZmcpOworCQlmaWJfdGFibGVfaW5zZXJ0KG5ldCwgdGIsICZjZmcpOwogCWVsc2UKLQkJZmliX3RhYmxlX2RlbGV0ZSh0YiwgJmNmZyk7CisJCWZpYl90YWJsZV9kZWxldGUobmV0LCB0YiwgJmNmZyk7CiB9CiAKIHZvaWQgZmliX2FkZF9pZmFkZHIoc3RydWN0IGluX2lmYWRkciAqaWZhKQpAQCAtMTAyNyw3ICsxMDA5LDcgQEAKIAkJCSAqIEZpcnN0IG9mIGFsbCwgd2Ugc2NhbiBmaWJfaW5mbyBsaXN0IHNlYXJjaGluZwogCQkJICogZm9yIHN0cmF5IG5leHRob3AgZW50cmllcywgdGhlbiBpZ25pdGUgZmliX2ZsdXNoLgogCQkJICovCi0JCQlpZiAoZmliX3N5bmNfZG93bl9hZGRyKGRldl9uZXQoZGV2KSwgaWZhLT5pZmFfbG9jYWwpKQorCQkJaWYgKGZpYl9zeW5jX2Rvd25fYWRkcihkZXYsIGlmYS0+aWZhX2xvY2FsKSkKIAkJCQlmaWJfZmx1c2goZGV2X25ldChkZXYpKTsKIAkJfQogCX0KQEAgLTEyNDksNyArMTIzMSw2IEBACiAKIAlydG5sX2xvY2soKTsKICNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCi0JUkNVX0lOSVRfUE9JTlRFUihuZXQtPmlwdjQuZmliX2xvY2FsLCBOVUxMKTsKIAlSQ1VfSU5JVF9QT0lOVEVSKG5ldC0+aXB2NC5maWJfbWFpbiwgTlVMTCk7CiAJUkNVX0lOSVRfUE9JTlRFUihuZXQtPmlwdjQuZmliX2RlZmF1bHQsIE5VTEwpOwogI2VuZGlmCkBAIC0xMjYwLDcgKzEyNDEsNyBAQAogCiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGIsIHRtcCwgaGVhZCwgdGJfaGxpc3QpIHsKIAkJCWhsaXN0X2RlbCgmdGItPnRiX2hsaXN0KTsKLQkJCWZpYl90YWJsZV9mbHVzaCh0Yik7CisJCQlmaWJfdGFibGVfZmx1c2gobmV0LCB0Yik7CiAJCQlmaWJfZnJlZV90YWJsZSh0Yik7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfcnVsZXMuYyBiL25ldC9pcHY0L2ZpYl9ydWxlcy5jCmluZGV4IDZlOWVhNjkuLjJlNTAwNjIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9ydWxlcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9ydWxlcy5jCkBAIC01Niw2ICs1Niw5IEBACiAJfTsKIAlpbnQgZXJyOwogCisJLyogdXBkYXRlIGZsb3cgaWYgb2lmIG9yIGlpZiBwb2ludCB0byBkZXZpY2UgZW5zbGF2ZWQgdG8gbDNtZGV2ICovCisJbDNtZGV2X3VwZGF0ZV9mbG93KG5ldCwgZmxvd2k0X3RvX2Zsb3dpKGZscCkpOworCiAJZXJyID0gZmliX3J1bGVzX2xvb2t1cChuZXQtPmlwdjQucnVsZXNfb3BzLCBmbG93aTRfdG9fZmxvd2koZmxwKSwgMCwgJmFyZyk7CiAjaWZkZWYgQ09ORklHX0lQX1JPVVRFX0NMQVNTSUQKIAlpZiAoYXJnLnJ1bGUpCkBAIC0xNjEsNiArMTY0LDE0IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbnQgY2FsbF9maWJfcnVsZV9ub3RpZmllcnMoc3RydWN0IG5ldCAqbmV0LAorCQkJCSAgIGVudW0gZmliX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSkKK3sKKwlzdHJ1Y3QgZmliX25vdGlmaWVyX2luZm8gaW5mbzsKKworCXJldHVybiBjYWxsX2ZpYl9ub3RpZmllcnMobmV0LCBldmVudF90eXBlLCAmaW5mbyk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBmaWI0X3J1bGVfcG9saWN5W0ZSQV9NQVgrMV0gPSB7CiAJRlJBX0dFTkVSSUNfUE9MSUNZLAogCVtGUkFfRkxPV10JPSB7IC50eXBlID0gTkxBX1UzMiB9LApAQCAtMjE3LDcgKzIyOCw3IEBACiAJcnVsZTQtPnRvcyA9IGZyaC0+dG9zOwogCiAJbmV0LT5pcHY0LmZpYl9oYXNfY3VzdG9tX3J1bGVzID0gdHJ1ZTsKLQlmaWJfZmx1c2hfZXh0ZXJuYWwocnVsZS0+ZnJfbmV0KTsKKwljYWxsX2ZpYl9ydWxlX25vdGlmaWVycyhuZXQsIEZJQl9FVkVOVF9SVUxFX0FERCk7CiAKIAllcnIgPSAwOwogZXJyb3V0OgpAQCAtMjM5LDcgKzI1MCw3IEBACiAJCW5ldC0+aXB2NC5maWJfbnVtX3RjbGFzc2lkX3VzZXJzLS07CiAjZW5kaWYKIAluZXQtPmlwdjQuZmliX2hhc19jdXN0b21fcnVsZXMgPSB0cnVlOwotCWZpYl9mbHVzaF9leHRlcm5hbChydWxlLT5mcl9uZXQpOworCWNhbGxfZmliX3J1bGVfbm90aWZpZXJzKG5ldCwgRklCX0VWRU5UX1JVTEVfREVMKTsKIGVycm91dDoKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jIGIvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCmluZGV4IDUzOWZhMjYuLjM4OGQzZTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYworKysgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKQEAgLTEwNTcsNiArMTA1Nyw3IEBACiAJZmktPmZpYl9wcmlvcml0eSA9IGNmZy0+ZmNfcHJpb3JpdHk7CiAJZmktPmZpYl9wcmVmc3JjID0gY2ZnLT5mY19wcmVmc3JjOwogCWZpLT5maWJfdHlwZSA9IGNmZy0+ZmNfdHlwZTsKKwlmaS0+ZmliX3RiX2lkID0gY2ZnLT5mY190YWJsZTsKIAogCWZpLT5maWJfbmhzID0gbmhzOwogCWNoYW5nZV9uZXh0aG9wcyhmaSkgewpAQCAtMTMzNywxOCArMTMzOCwyMSBAQAogICogICByZWZlcnJpbmcgdG8gaXQuCiAgKiAtIGRldmljZSB3ZW50IGRvd24gLT4gd2UgbXVzdCBzaHV0ZG93biBhbGwgbmV4dGhvcHMgZ29pbmcgdmlhIGl0LgogICovCi1pbnQgZmliX3N5bmNfZG93bl9hZGRyKHN0cnVjdCBuZXQgKm5ldCwgX19iZTMyIGxvY2FsKQoraW50IGZpYl9zeW5jX2Rvd25fYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX2JlMzIgbG9jYWwpCiB7CiAJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgaW50IGhhc2ggPSBmaWJfbGFkZHJfaGFzaGZuKGxvY2FsKTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9ICZmaWJfaW5mb19sYWRkcmhhc2hbaGFzaF07CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOworCWludCB0Yl9pZCA9IGwzbWRldl9maWJfdGFibGUoZGV2KTsKIAlzdHJ1Y3QgZmliX2luZm8gKmZpOwogCiAJaWYgKCFmaWJfaW5mb19sYWRkcmhhc2ggfHwgbG9jYWwgPT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShmaSwgaGVhZCwgZmliX2xoYXNoKSB7Ci0JCWlmICghbmV0X2VxKGZpLT5maWJfbmV0LCBuZXQpKQorCQlpZiAoIW5ldF9lcShmaS0+ZmliX25ldCwgbmV0KSB8fAorCQkgICAgZmktPmZpYl90Yl9pZCAhPSB0Yl9pZCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoZmktPmZpYl9wcmVmc3JjID09IGxvY2FsKSB7CiAJCQlmaS0+ZmliX2ZsYWdzIHw9IFJUTkhfRl9ERUFEOwpAQCAtMTU3Niw3ICsxNTgwLDggQEAKIAogCQlyY3VfcmVhZF9sb2NrX2JoKCk7CiAKLQkJbiA9IF9faXB2NF9uZWlnaF9sb29rdXBfbm9yZWYobmgtPm5oX2RldiwgbmgtPm5oX2d3KTsKKwkJbiA9IF9faXB2NF9uZWlnaF9sb29rdXBfbm9yZWYobmgtPm5oX2RldiwKKwkJCQkJICAgICAgKF9fZm9yY2UgdTMyKW5oLT5uaF9ndyk7CiAJCWlmIChuKQogCQkJc3RhdGUgPSBuLT5udWRfc3RhdGU7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl90cmllLmMgYi9uZXQvaXB2NC9maWJfdHJpZS5jCmluZGV4IGZlYmNhMGYuLjMxY2VmMzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl90cmllLmMKKysrIGIvbmV0L2lwdjQvZmliX3RyaWUuYwpAQCAtNzMsNiArNzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgpAQCAtODAsMTAgKzgxLDQ3IEBACiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgotI2luY2x1ZGUgPG5ldC9zd2l0Y2hkZXYuaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvZmliLmg+CiAjaW5jbHVkZSAiZmliX2xvb2t1cC5oIgogCitzdGF0aWMgQkxPQ0tJTkdfTk9USUZJRVJfSEVBRChmaWJfY2hhaW4pOworCitpbnQgcmVnaXN0ZXJfZmliX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZmaWJfY2hhaW4sIG5iKTsKK30KK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfZmliX25vdGlmaWVyKTsKKworaW50IHVucmVnaXN0ZXJfZmliX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJmZpYl9jaGFpbiwgbmIpOworfQorRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2ZpYl9ub3RpZmllcik7CisKK2ludCBjYWxsX2ZpYl9ub3RpZmllcnMoc3RydWN0IG5ldCAqbmV0LCBlbnVtIGZpYl9ldmVudF90eXBlIGV2ZW50X3R5cGUsCisJCSAgICAgICBzdHJ1Y3QgZmliX25vdGlmaWVyX2luZm8gKmluZm8pCit7CisJaW5mby0+bmV0ID0gbmV0OworCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZmaWJfY2hhaW4sIGV2ZW50X3R5cGUsIGluZm8pOworfQorCitzdGF0aWMgaW50IGNhbGxfZmliX2VudHJ5X25vdGlmaWVycyhzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJICAgIGVudW0gZmliX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSwgdTMyIGRzdCwKKwkJCQkgICAgaW50IGRzdF9sZW4sIHN0cnVjdCBmaWJfaW5mbyAqZmksCisJCQkJICAgIHU4IHRvcywgdTggdHlwZSwgdTMyIHRiX2lkLCB1MzIgbmxmbGFncykKK3sKKwlzdHJ1Y3QgZmliX2VudHJ5X25vdGlmaWVyX2luZm8gaW5mbyA9IHsKKwkJLmRzdCA9IGRzdCwKKwkJLmRzdF9sZW4gPSBkc3RfbGVuLAorCQkuZmkgPSBmaSwKKwkJLnRvcyA9IHRvcywKKwkJLnR5cGUgPSB0eXBlLAorCQkudGJfaWQgPSB0Yl9pZCwKKwkJLm5sZmxhZ3MgPSBubGZsYWdzLAorCX07CisJcmV0dXJuIGNhbGxfZmliX25vdGlmaWVycyhuZXQsIGV2ZW50X3R5cGUsICZpbmZvLmluZm8pOworfQorCiAjZGVmaW5lIE1BWF9TVEFUX0RFUFRIIDMyCiAKICNkZWZpbmUgS0VZTEVOR1RICSg4KnNpemVvZih0X2tleSkpCkBAIC0yNDksNyArMjg3LDcgQEAKICAqIGluZGV4IGludG8gdGhlIHBhcmVudCdzIGNoaWxkIGFycmF5LiBUaGF0IGlzLCB0aGV5IHdpbGwgYmUgdXNlZCB0byBmaW5kCiAgKiAnbicgYW1vbmcgdHAncyBjaGlsZHJlbi4KICAqCi0gKiBUaGUgYml0cyBmcm9tIChuLT5wb3MgKyBuLT5iaXRzKSB0byAodG4tPnBvcyAtIDEpIC0gIlMiIC0gYXJlIHNraXBwZWQgYml0cworICogVGhlIGJpdHMgZnJvbSAobi0+cG9zICsgbi0+Yml0cykgdG8gKHRwLT5wb3MgLSAxKSAtICJTIiAtIGFyZSBza2lwcGVkIGJpdHMKICAqIGZvciB0aGUgbm9kZSBuLgogICoKICAqIEFsbCB0aGUgYml0cyB3ZSBoYXZlIHNlZW4gc28gZmFyIGFyZSBzaWduaWZpY2FudCB0byB0aGUgbm9kZSBuLiBUaGUgcmVzdApAQCAtMjU4LDcgKzI5Niw3IEBACiAgKiBUaGUgYml0cyBmcm9tIChuLT5wb3MpIHRvIChuLT5wb3MgKyBuLT5iaXRzIC0gMSkgLSAiQyIgLSBhcmUgdGhlIGluZGV4IGludG8KICAqIG4ncyBjaGlsZCBhcnJheSwgYW5kIHdpbGwgb2YgY291cnNlIGJlIGRpZmZlcmVudCBmb3IgZWFjaCBjaGlsZC4KICAqCi0gKiBUaGUgcmVzdCBvZiB0aGUgYml0cywgZnJvbSAwIHRvIChuLT5wb3MgKyBuLT5iaXRzKSwgYXJlIGNvbXBsZXRlbHkgdW5rbm93bgorICogVGhlIHJlc3Qgb2YgdGhlIGJpdHMsIGZyb20gMCB0byAobi0+cG9zIC0xKSAtICJ1IiAtIGFyZSBjb21wbGV0ZWx5IHVua25vd24KICAqIGF0IHRoaXMgcG9pbnQuCiAgKi8KIApAQCAtMTA3NiwxMiArMTExNCwxMyBAQAogfQogCiAvKiBDYWxsZXIgbXVzdCBob2xkIFJUTkwuICovCi1pbnQgZmliX3RhYmxlX2luc2VydChzdHJ1Y3QgZmliX3RhYmxlICp0Yiwgc3RydWN0IGZpYl9jb25maWcgKmNmZykKK2ludCBmaWJfdGFibGVfaW5zZXJ0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZpYl90YWJsZSAqdGIsCisJCSAgICAgc3RydWN0IGZpYl9jb25maWcgKmNmZykKIHsKIAlzdHJ1Y3QgdHJpZSAqdCA9IChzdHJ1Y3QgdHJpZSAqKXRiLT50Yl9kYXRhOwogCXN0cnVjdCBmaWJfYWxpYXMgKmZhLCAqbmV3X2ZhOwogCXN0cnVjdCBrZXlfdmVjdG9yICpsLCAqdHA7Ci0JdW5zaWduZWQgaW50IG5sZmxhZ3MgPSAwOworCXUxNiBubGZsYWdzID0gTkxNX0ZfRVhDTDsKIAlzdHJ1Y3QgZmliX2luZm8gKmZpOwogCXU4IHBsZW4gPSBjZmctPmZjX2RzdF9sZW47CiAJdTggc2xlbiA9IEtFWUxFTkdUSCAtIHBsZW47CkBAIC0xMTI2LDYgKzExNjUsOCBAQAogCQlpZiAoY2ZnLT5mY19ubGZsYWdzICYgTkxNX0ZfRVhDTCkKIAkJCWdvdG8gb3V0OwogCisJCW5sZmxhZ3MgJj0gfk5MTV9GX0VYQ0w7CisKIAkJLyogV2UgaGF2ZSAyIGdvYWxzOgogCQkgKiAxLiBGaW5kIGV4YWN0IG1hdGNoIGZvciB0eXBlLCBzY29wZSwgZmliX2luZm8gdG8gYXZvaWQKIAkJICogZHVwbGljYXRlIHJvdXRlcwpAQCAtMTE1MSw2ICsxMTkyLDcgQEAKIAkJCXN0cnVjdCBmaWJfaW5mbyAqZmlfZHJvcDsKIAkJCXU4IHN0YXRlOwogCisJCQlubGZsYWdzIHw9IE5MTV9GX1JFUExBQ0U7CiAJCQlmYSA9IGZhX2ZpcnN0OwogCQkJaWYgKGZhX21hdGNoKSB7CiAJCQkJaWYgKGZhID09IGZhX21hdGNoKQpAQCAtMTE3MiwxNyArMTIxNCw2IEBACiAJCQluZXdfZmEtPnRiX2lkID0gdGItPnRiX2lkOwogCQkJbmV3X2ZhLT5mYV9kZWZhdWx0ID0gLTE7CiAKLQkJCWVyciA9IHN3aXRjaGRldl9maWJfaXB2NF9hZGQoa2V5LCBwbGVuLCBmaSwKLQkJCQkJCSAgICAgbmV3X2ZhLT5mYV90b3MsCi0JCQkJCQkgICAgIGNmZy0+ZmNfdHlwZSwKLQkJCQkJCSAgICAgY2ZnLT5mY19ubGZsYWdzLAotCQkJCQkJICAgICB0Yi0+dGJfaWQpOwotCQkJaWYgKGVycikgewotCQkJCXN3aXRjaGRldl9maWJfaXB2NF9hYm9ydChmaSk7Ci0JCQkJa21lbV9jYWNoZV9mcmVlKGZuX2FsaWFzX2ttZW0sIG5ld19mYSk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0KIAkJCWhsaXN0X3JlcGxhY2VfcmN1KCZmYS0+ZmFfbGlzdCwgJm5ld19mYS0+ZmFfbGlzdCk7CiAKIAkJCWFsaWFzX2ZyZWVfbWVtX3JjdShmYSk7CkBAIC0xMTkwLDggKzEyMjEsMTMgQEAKIAkJCWZpYl9yZWxlYXNlX2luZm8oZmlfZHJvcCk7CiAJCQlpZiAoc3RhdGUgJiBGQV9TX0FDQ0VTU0VEKQogCQkJCXJ0X2NhY2hlX2ZsdXNoKGNmZy0+ZmNfbmxpbmZvLm5sX25ldCk7CisKKwkJCWNhbGxfZmliX2VudHJ5X25vdGlmaWVycyhuZXQsIEZJQl9FVkVOVF9FTlRSWV9BREQsCisJCQkJCQkga2V5LCBwbGVuLCBmaSwKKwkJCQkJCSBuZXdfZmEtPmZhX3RvcywgY2ZnLT5mY190eXBlLAorCQkJCQkJIHRiLT50Yl9pZCwgY2ZnLT5mY19ubGZsYWdzKTsKIAkJCXJ0bXNnX2ZpYihSVE1fTkVXUk9VVEUsIGh0b25sKGtleSksIG5ld19mYSwgcGxlbiwKLQkJCQl0Yi0+dGJfaWQsICZjZmctPmZjX25saW5mbywgTkxNX0ZfUkVQTEFDRSk7CisJCQkJdGItPnRiX2lkLCAmY2ZnLT5mY19ubGluZm8sIG5sZmxhZ3MpOwogCiAJCQlnb3RvIHN1Y2NlZWRlZDsKIAkJfQpAQCAtMTIwMyw3ICsxMjM5LDcgQEAKIAkJCWdvdG8gb3V0OwogCiAJCWlmIChjZmctPmZjX25sZmxhZ3MgJiBOTE1fRl9BUFBFTkQpCi0JCQlubGZsYWdzID0gTkxNX0ZfQVBQRU5EOworCQkJbmxmbGFncyB8PSBOTE1fRl9BUFBFTkQ7CiAJCWVsc2UKIAkJCWZhID0gZmFfZmlyc3Q7CiAJfQpAQCAtMTIxMSw2ICsxMjQ3LDcgQEAKIAlpZiAoIShjZmctPmZjX25sZmxhZ3MgJiBOTE1fRl9DUkVBVEUpKQogCQlnb3RvIG91dDsKIAorCW5sZmxhZ3MgfD0gTkxNX0ZfQ1JFQVRFOwogCWVyciA9IC1FTk9CVUZTOwogCW5ld19mYSA9IGttZW1fY2FjaGVfYWxsb2MoZm5fYWxpYXNfa21lbSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfZmEpCkBAIC0xMjI0LDMwICsxMjYxLDIyIEBACiAJbmV3X2ZhLT50Yl9pZCA9IHRiLT50Yl9pZDsKIAluZXdfZmEtPmZhX2RlZmF1bHQgPSAtMTsKIAotCS8qIChPcHRpb25hbGx5KSBvZmZsb2FkIGZpYiBlbnRyeSB0byBzd2l0Y2ggaGFyZHdhcmUuICovCi0JZXJyID0gc3dpdGNoZGV2X2ZpYl9pcHY0X2FkZChrZXksIHBsZW4sIGZpLCB0b3MsIGNmZy0+ZmNfdHlwZSwKLQkJCQkgICAgIGNmZy0+ZmNfbmxmbGFncywgdGItPnRiX2lkKTsKLQlpZiAoZXJyKSB7Ci0JCXN3aXRjaGRldl9maWJfaXB2NF9hYm9ydChmaSk7Ci0JCWdvdG8gb3V0X2ZyZWVfbmV3X2ZhOwotCX0KLQogCS8qIEluc2VydCBuZXcgZW50cnkgdG8gdGhlIGxpc3QuICovCiAJZXJyID0gZmliX2luc2VydF9hbGlhcyh0LCB0cCwgbCwgbmV3X2ZhLCBmYSwga2V5KTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF9zd19maWJfZGVsOworCQlnb3RvIG91dF9mcmVlX25ld19mYTsKIAogCWlmICghcGxlbikKIAkJdGItPnRiX251bV9kZWZhdWx0Kys7CiAKIAlydF9jYWNoZV9mbHVzaChjZmctPmZjX25saW5mby5ubF9uZXQpOworCWNhbGxfZmliX2VudHJ5X25vdGlmaWVycyhuZXQsIEZJQl9FVkVOVF9FTlRSWV9BREQsIGtleSwgcGxlbiwgZmksIHRvcywKKwkJCQkgY2ZnLT5mY190eXBlLCB0Yi0+dGJfaWQsIGNmZy0+ZmNfbmxmbGFncyk7CiAJcnRtc2dfZmliKFJUTV9ORVdST1VURSwgaHRvbmwoa2V5KSwgbmV3X2ZhLCBwbGVuLCBuZXdfZmEtPnRiX2lkLAogCQkgICZjZmctPmZjX25saW5mbywgbmxmbGFncyk7CiBzdWNjZWVkZWQ6CiAJcmV0dXJuIDA7CiAKLW91dF9zd19maWJfZGVsOgotCXN3aXRjaGRldl9maWJfaXB2NF9kZWwoa2V5LCBwbGVuLCBmaSwgdG9zLCBjZmctPmZjX3R5cGUsIHRiLT50Yl9pZCk7CiBvdXRfZnJlZV9uZXdfZmE6CiAJa21lbV9jYWNoZV9mcmVlKGZuX2FsaWFzX2ttZW0sIG5ld19mYSk7CiBvdXQ6CkBAIC0xNDg2LDcgKzE1MTUsOCBAQAogfQogCiAvKiBDYWxsZXIgbXVzdCBob2xkIFJUTkwuICovCi1pbnQgZmliX3RhYmxlX2RlbGV0ZShzdHJ1Y3QgZmliX3RhYmxlICp0Yiwgc3RydWN0IGZpYl9jb25maWcgKmNmZykKK2ludCBmaWJfdGFibGVfZGVsZXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZpYl90YWJsZSAqdGIsCisJCSAgICAgc3RydWN0IGZpYl9jb25maWcgKmNmZykKIHsKIAlzdHJ1Y3QgdHJpZSAqdCA9IChzdHJ1Y3QgdHJpZSAqKSB0Yi0+dGJfZGF0YTsKIAlzdHJ1Y3QgZmliX2FsaWFzICpmYSwgKmZhX3RvX2RlbGV0ZTsKQEAgLTE1MzksOSArMTU2OSw5IEBACiAJaWYgKCFmYV90b19kZWxldGUpCiAJCXJldHVybiAtRVNSQ0g7CiAKLQlzd2l0Y2hkZXZfZmliX2lwdjRfZGVsKGtleSwgcGxlbiwgZmFfdG9fZGVsZXRlLT5mYV9pbmZvLCB0b3MsCi0JCQkgICAgICAgY2ZnLT5mY190eXBlLCB0Yi0+dGJfaWQpOwotCisJY2FsbF9maWJfZW50cnlfbm90aWZpZXJzKG5ldCwgRklCX0VWRU5UX0VOVFJZX0RFTCwga2V5LCBwbGVuLAorCQkJCSBmYV90b19kZWxldGUtPmZhX2luZm8sIHRvcywgY2ZnLT5mY190eXBlLAorCQkJCSB0Yi0+dGJfaWQsIDApOwogCXJ0bXNnX2ZpYihSVE1fREVMUk9VVEUsIGh0b25sKGtleSksIGZhX3RvX2RlbGV0ZSwgcGxlbiwgdGItPnRiX2lkLAogCQkgICZjZmctPmZjX25saW5mbywgMCk7CiAKQEAgLTE3MzAsODIgKzE3NjAsOCBAQAogCXJldHVybiBOVUxMOwogfQogCi0vKiBDYWxsZXIgbXVzdCBob2xkIFJUTkwgKi8KLXZvaWQgZmliX3RhYmxlX2ZsdXNoX2V4dGVybmFsKHN0cnVjdCBmaWJfdGFibGUgKnRiKQotewotCXN0cnVjdCB0cmllICp0ID0gKHN0cnVjdCB0cmllICopdGItPnRiX2RhdGE7Ci0Jc3RydWN0IGtleV92ZWN0b3IgKnBuID0gdC0+a3Y7Ci0JdW5zaWduZWQgbG9uZyBjaW5kZXggPSAxOwotCXN0cnVjdCBobGlzdF9ub2RlICp0bXA7Ci0Jc3RydWN0IGZpYl9hbGlhcyAqZmE7Ci0KLQkvKiB3YWxrIHRyaWUgaW4gcmV2ZXJzZSBvcmRlciAqLwotCWZvciAoOzspIHsKLQkJdW5zaWduZWQgY2hhciBzbGVuID0gMDsKLQkJc3RydWN0IGtleV92ZWN0b3IgKm47Ci0KLQkJaWYgKCEoY2luZGV4LS0pKSB7Ci0JCQl0X2tleSBwa2V5ID0gcG4tPmtleTsKLQotCQkJLyogY2Fubm90IHJlc2l6ZSB0aGUgdHJpZSB2ZWN0b3IgKi8KLQkJCWlmIChJU19UUklFKHBuKSkKLQkJCQlicmVhazsKLQotCQkJLyogcmVzaXplIGNvbXBsZXRlZCBub2RlICovCi0JCQlwbiA9IHJlc2l6ZSh0LCBwbik7Ci0JCQljaW5kZXggPSBnZXRfaW5kZXgocGtleSwgcG4pOwotCi0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIGdyYWIgdGhlIG5leHQgYXZhaWxhYmxlIG5vZGUgKi8KLQkJbiA9IGdldF9jaGlsZChwbiwgY2luZGV4KTsKLQkJaWYgKCFuKQotCQkJY29udGludWU7Ci0KLQkJaWYgKElTX1ROT0RFKG4pKSB7Ci0JCQkvKiByZWNvcmQgcG4gYW5kIGNpbmRleCBmb3IgbGVhZiB3YWxraW5nICovCi0JCQlwbiA9IG47Ci0JCQljaW5kZXggPSAxdWwgPDwgbi0+Yml0czsKLQotCQkJY29udGludWU7Ci0JCX0KLQotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZhLCB0bXAsICZuLT5sZWFmLCBmYV9saXN0KSB7Ci0JCQlzdHJ1Y3QgZmliX2luZm8gKmZpID0gZmEtPmZhX2luZm87Ci0KLQkJCS8qIGlmIGFsaWFzIHdhcyBjbG9uZWQgdG8gbG9jYWwgdGhlbiB3ZSBqdXN0Ci0JCQkgKiBuZWVkIHRvIHJlbW92ZSB0aGUgbG9jYWwgY29weSBmcm9tIG1haW4KLQkJCSAqLwotCQkJaWYgKHRiLT50Yl9pZCAhPSBmYS0+dGJfaWQpIHsKLQkJCQlobGlzdF9kZWxfcmN1KCZmYS0+ZmFfbGlzdCk7Ci0JCQkJYWxpYXNfZnJlZV9tZW1fcmN1KGZhKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogcmVjb3JkIGxvY2FsIHNsZW4gKi8KLQkJCXNsZW4gPSBmYS0+ZmFfc2xlbjsKLQotCQkJaWYgKCFmaSB8fCAhKGZpLT5maWJfZmxhZ3MgJiBSVE5IX0ZfT0ZGTE9BRCkpCi0JCQkJY29udGludWU7Ci0KLQkJCXN3aXRjaGRldl9maWJfaXB2NF9kZWwobi0+a2V5LCBLRVlMRU5HVEggLSBmYS0+ZmFfc2xlbiwKLQkJCQkJICAgICAgIGZpLCBmYS0+ZmFfdG9zLCBmYS0+ZmFfdHlwZSwKLQkJCQkJICAgICAgIHRiLT50Yl9pZCk7Ci0JCX0KLQotCQkvKiB1cGRhdGUgbGVhZiBzbGVuICovCi0JCW4tPnNsZW4gPSBzbGVuOwotCi0JCWlmIChobGlzdF9lbXB0eSgmbi0+bGVhZikpIHsKLQkJCXB1dF9jaGlsZF9yb290KHBuLCBuLT5rZXksIE5VTEwpOwotCQkJbm9kZV9mcmVlKG4pOwotCQl9Ci0JfQotfQotCiAvKiBDYWxsZXIgbXVzdCBob2xkIFJUTkwuICovCi1pbnQgZmliX3RhYmxlX2ZsdXNoKHN0cnVjdCBmaWJfdGFibGUgKnRiKQoraW50IGZpYl90YWJsZV9mbHVzaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmaWJfdGFibGUgKnRiKQogewogCXN0cnVjdCB0cmllICp0ID0gKHN0cnVjdCB0cmllICopdGItPnRiX2RhdGE7CiAJc3RydWN0IGtleV92ZWN0b3IgKnBuID0gdC0+a3Y7CkBAIC0xODU0LDkgKzE4MTAsMTEgQEAKIAkJCQljb250aW51ZTsKIAkJCX0KIAotCQkJc3dpdGNoZGV2X2ZpYl9pcHY0X2RlbChuLT5rZXksIEtFWUxFTkdUSCAtIGZhLT5mYV9zbGVuLAotCQkJCQkgICAgICAgZmksIGZhLT5mYV90b3MsIGZhLT5mYV90eXBlLAotCQkJCQkgICAgICAgdGItPnRiX2lkKTsKKwkJCWNhbGxfZmliX2VudHJ5X25vdGlmaWVycyhuZXQsIEZJQl9FVkVOVF9FTlRSWV9ERUwsCisJCQkJCQkgbi0+a2V5LAorCQkJCQkJIEtFWUxFTkdUSCAtIGZhLT5mYV9zbGVuLAorCQkJCQkJIGZpLCBmYS0+ZmFfdG9zLCBmYS0+ZmFfdHlwZSwKKwkJCQkJCSB0Yi0+dGJfaWQsIDApOwogCQkJaGxpc3RfZGVsX3JjdSgmZmEtPmZhX2xpc3QpOwogCQkJZmliX3JlbGVhc2VfaW5mbyhmYS0+ZmFfaW5mbyk7CiAJCQlhbGlhc19mcmVlX21lbV9yY3UoZmEpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZm91LmMgYi9uZXQvaXB2NC9mb3UuYwppbmRleCAzMjFkNTdmLi5jZjUwZjdlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9mb3UuYworKysgYi9uZXQvaXB2NC9mb3UuYwpAQCAtNjMxLDcgKzYzMSw3IEBACiAJLm5ldG5zb2sJPSB0cnVlLAogfTsKIAotc3RhdGljIHN0cnVjdCBubGFfcG9saWN5IGZvdV9ubF9wb2xpY3lbRk9VX0FUVFJfTUFYICsgMV0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgZm91X25sX3BvbGljeVtGT1VfQVRUUl9NQVggKyAxXSA9IHsKIAlbRk9VX0FUVFJfUE9SVF0gPSB7IC50eXBlID0gTkxBX1UxNiwgfSwKIAlbRk9VX0FUVFJfQUZdID0geyAudHlwZSA9IE5MQV9VOCwgfSwKIAlbRk9VX0FUVFJfSVBQUk9UT10gPSB7IC50eXBlID0gTkxBX1U4LCB9LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZ3JlX29mZmxvYWQuYyBiL25ldC9pcHY0L2dyZV9vZmZsb2FkLmMKaW5kZXggZWNkMWUwOS4uOTZlMGVmZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZ3JlX29mZmxvYWQuYworKysgYi9uZXQvaXB2NC9ncmVfb2ZmbG9hZC5jCkBAIC0yNCw3ICsyNCw3IEBACiAJX19iZTE2IHByb3RvY29sID0gc2tiLT5wcm90b2NvbDsKIAl1MTYgbWFjX2xlbiA9IHNrYi0+bWFjX2xlbjsKIAlpbnQgZ3JlX29mZnNldCwgb3V0ZXJfaGxlbjsKLQlib29sIG5lZWRfY3N1bSwgdWZvOworCWJvb2wgbmVlZF9jc3VtLCB1Zm8sIGdzb19wYXJ0aWFsOwogCiAJaWYgKCFza2ItPmVuY2Fwc3VsYXRpb24pCiAJCWdvdG8gb3V0OwpAQCAtNjksNiArNjksOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlnc29fcGFydGlhbCA9ICEhKHNrYl9zaGluZm8oc2VncyktPmdzb190eXBlICYgU0tCX0dTT19QQVJUSUFMKTsKKwogCW91dGVyX2hsZW4gPSBza2JfdG5sX2hlYWRlcl9sZW4oc2tiKTsKIAlncmVfb2Zmc2V0ID0gb3V0ZXJfaGxlbiAtIHRubF9obGVuOwogCXNrYiA9IHNlZ3M7CkBAIC05Niw3ICs5OCw3IEBACiAJCWdyZWggPSAoc3RydWN0IGdyZV9iYXNlX2hkciAqKXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCXBjc3VtID0gKF9fc3VtMTYgKikoZ3JlaCArIDEpOwogCi0JCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKKwkJaWYgKGdzb19wYXJ0aWFsKSB7CiAJCQl1bnNpZ25lZCBpbnQgcGFydGlhbF9hZGo7CiAKIAkJCS8qIEFkanVzdCBjaGVja3N1bSB0byBhY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pZ21wLmMgYi9uZXQvaXB2NC9pZ21wLmMKaW5kZXggOWI0Y2E4Ny4uNjA2Y2MzZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaWdtcC5jCisrKyBiL25ldC9pcHY0L2lnbXAuYwpAQCAtNDcyLDYgKzQ3MiwxNSBAQAogCQkJY29udGludWU7CiAJCX0KIAorCQkvKiBCYXNlZCBvbiBSRkMzMzc2IDUuMS4gU2hvdWxkIG5vdCBzZW5kIHNvdXJjZS1saXN0IGNoYW5nZQorCQkgKiByZWNvcmRzIHdoZW4gdGhlcmUgaXMgYSBmaWx0ZXIgbW9kZSBjaGFuZ2UuCisJCSAqLworCQlpZiAoKChnZGVsZXRlZCAmJiBwbWMtPnNmbW9kZSA9PSBNQ0FTVF9FWENMVURFKSB8fAorCQkgICAgICghZ2RlbGV0ZWQgJiYgcG1jLT5jcmNvdW50KSkgJiYKKwkJICAgICh0eXBlID09IElHTVBWM19BTExPV19ORVdfU09VUkNFUyB8fAorCQkgICAgIHR5cGUgPT0gSUdNUFYzX0JMT0NLX09MRF9TT1VSQ0VTKSAmJiBwc2YtPnNmX2NyY291bnQpCisJCQlnb3RvIGRlY3JlYXNlX3NmX2NyY291bnQ7CisKIAkJLyogY2xlYXIgbWFya3Mgb24gcXVlcnkgcmVzcG9uc2VzICovCiAJCWlmIChpc3F1ZXJ5KQogCQkJcHNmLT5zZl9nc3Jlc3AgPSAwOwpAQCAtNDk5LDYgKzUwOCw3IEBACiAJCXNjb3VudCsrOyBzdG90YWwrKzsKIAkJaWYgKCh0eXBlID09IElHTVBWM19BTExPV19ORVdfU09VUkNFUyB8fAogCQkgICAgIHR5cGUgPT0gSUdNUFYzX0JMT0NLX09MRF9TT1VSQ0VTKSAmJiBwc2YtPnNmX2NyY291bnQpIHsKK2RlY3JlYXNlX3NmX2NyY291bnQ6CiAJCQlwc2YtPnNmX2NyY291bnQtLTsKIAkJCWlmICgoc2RlbGV0ZWQgfHwgZ2RlbGV0ZWQpICYmIHBzZi0+c2ZfY3Jjb3VudCA9PSAwKSB7CiAJCQkJaWYgKHBzZl9wcmV2KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9kaWFnLmMgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwppbmRleCAzOGMyYzQ3Li5lNGQxNmZjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2RpYWcuYworKysgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwpAQCAtNDUsNiArNDUsNyBAQAogCXUxNiBmYW1pbHk7CiAJdTE2IHVzZXJsb2NrczsKIAl1MzIgaWZpbmRleDsKKwl1MzIgbWFyazsKIH07CiAKIHN0YXRpYyBERUZJTkVfTVVURVgoaW5ldF9kaWFnX3RhYmxlX211dGV4KTsKQEAgLTk4LDYgKzk5LDcgQEAKIAkJKyBubGFfdG90YWxfc2l6ZSgxKSAvKiBJTkVUX0RJQUdfU0hVVERPV04gKi8KIAkJKyBubGFfdG90YWxfc2l6ZSgxKSAvKiBJTkVUX0RJQUdfVE9TICovCiAJCSsgbmxhX3RvdGFsX3NpemUoMSkgLyogSU5FVF9ESUFHX1RDTEFTUyAqLworCQkrIG5sYV90b3RhbF9zaXplKDQpIC8qIElORVRfRElBR19NQVJLICovCiAJCSsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfbWVtaW5mbykpCiAJCSsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfbXNnKSkKIAkJKyBubGFfdG90YWxfc2l6ZShTS19NRU1JTkZPX1ZBUlMgKiBzaXplb2YodTMyKSkKQEAgLTEwOCw3ICsxMTAsOCBAQAogCiBpbnQgaW5ldF9kaWFnX21zZ19hdHRyc19maWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgc3RydWN0IGluZXRfZGlhZ19tc2cgKnIsIGludCBleHQsCi0JCQkgICAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucykKKwkJCSAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAorCQkJICAgICBib29sIG5ldF9hZG1pbikKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAKQEAgLTEzNSw2ICsxMzgsOSBAQAogCX0KICNlbmRpZgogCisJaWYgKG5ldF9hZG1pbiAmJiBubGFfcHV0X3UzMihza2IsIElORVRfRElBR19NQVJLLCBzay0+c2tfbWFyaykpCisJCWdvdG8gZXJyb3V0OworCiAJci0+aWRpYWdfdWlkID0gZnJvbV9rdWlkX211bmdlZCh1c2VyX25zLCBzb2NrX2lfdWlkKHNrKSk7CiAJci0+aWRpYWdfaW5vZGUgPSBzb2NrX2lfaW5vKHNrKTsKIApAQCAtMTQ4LDcgKzE1NCw4IEBACiAJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEsCiAJCSAgICAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywKIAkJICAgICAgdTMyIHBvcnRpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAotCQkgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgpCisJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCwKKwkJICAgICAgYm9vbCBuZXRfYWRtaW4pCiB7CiAJY29uc3Qgc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyAqY2Ffb3BzOwogCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciAqaGFuZGxlcjsKQEAgLTE3NCw3ICsxODEsNyBAQAogCXItPmlkaWFnX3RpbWVyID0gMDsKIAlyLT5pZGlhZ19yZXRyYW5zID0gMDsKIAotCWlmIChpbmV0X2RpYWdfbXNnX2F0dHJzX2ZpbGwoc2ssIHNrYiwgciwgZXh0LCB1c2VyX25zKSkKKwlpZiAoaW5ldF9kaWFnX21zZ19hdHRyc19maWxsKHNrLCBza2IsIHIsIGV4dCwgdXNlcl9ucywgbmV0X2FkbWluKSkKIAkJZ290byBlcnJvdXQ7CiAKIAlpZiAoZXh0ICYgKDEgPDwgKElORVRfRElBR19NRU1JTkZPIC0gMSkpKSB7CkBAIC0yNzMsMTAgKzI4MCwxMSBAQAogCQkJICAgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKIAkJCSAgICAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywKIAkJCSAgICAgIHUzMiBwb3J0aWQsIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCwKKwkJCSAgICAgIGJvb2wgbmV0X2FkbWluKQogewotCXJldHVybiBpbmV0X3NrX2RpYWdfZmlsbChzaywgaW5ldF9jc2soc2spLCBza2IsIHJlcSwKLQkJCQkgdXNlcl9ucywgcG9ydGlkLCBzZXEsIG5sbXNnX2ZsYWdzLCB1bmxoKTsKKwlyZXR1cm4gaW5ldF9za19kaWFnX2ZpbGwoc2ssIGluZXRfY3NrKHNrKSwgc2tiLCByZXEsIHVzZXJfbnMsCisJCQkJIHBvcnRpZCwgc2VxLCBubG1zZ19mbGFncywgdW5saCwgbmV0X2FkbWluKTsKIH0KIAogc3RhdGljIGludCBpbmV0X3R3c2tfZGlhZ19maWxsKHN0cnVjdCBzb2NrICpzaywKQEAgLTMxOCw4ICszMjYsOSBAQAogCiBzdGF0aWMgaW50IGluZXRfcmVxX2RpYWdfZmlsbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICB1MzIgcG9ydGlkLCB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgpCisJCQkgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgsIGJvb2wgbmV0X2FkbWluKQogeworCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcXNrID0gaW5ldF9yZXFzayhzayk7CiAJc3RydWN0IGluZXRfZGlhZ19tc2cgKnI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJbG9uZyB0bW87CkBAIC0zMzMsNyArMzQyLDcgQEAKIAlpbmV0X2RpYWdfbXNnX2NvbW1vbl9maWxsKHIsIHNrKTsKIAlyLT5pZGlhZ19zdGF0ZSA9IFRDUF9TWU5fUkVDVjsKIAlyLT5pZGlhZ190aW1lciA9IDE7Ci0Jci0+aWRpYWdfcmV0cmFucyA9IGluZXRfcmVxc2soc2spLT5udW1fcmV0cmFuczsKKwlyLT5pZGlhZ19yZXRyYW5zID0gcmVxc2stPm51bV9yZXRyYW5zOwogCiAJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jaywgaXJfY29va2llKSAhPQogCQkgICAgIG9mZnNldG9mKHN0cnVjdCBzb2NrLCBza19jb29raWUpKTsKQEAgLTM0NSw2ICszNTQsMTAgQEAKIAlyLT5pZGlhZ191aWQJPSAwOwogCXItPmlkaWFnX2lub2RlCT0gMDsKIAorCWlmIChuZXRfYWRtaW4gJiYgbmxhX3B1dF91MzIoc2tiLCBJTkVUX0RJQUdfTUFSSywKKwkJCQkgICAgIGluZXRfcnNrKHJlcXNrKS0+aXJfbWFyaykpCisJCXJldHVybiAtRU1TR1NJWkU7CisKIAlubG1zZ19lbmQoc2tiLCBubGgpOwogCXJldHVybiAwOwogfQpAQCAtMzUzLDcgKzM2Niw3IEBACiAJCQljb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwKIAkJCXN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywKIAkJCXUzMiBwb3J0aWQsIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKLQkJCWNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKKwkJCWNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCwgYm9vbCBuZXRfYWRtaW4pCiB7CiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfVElNRV9XQUlUKQogCQlyZXR1cm4gaW5ldF90d3NrX2RpYWdfZmlsbChzaywgc2tiLCBwb3J0aWQsIHNlcSwKQEAgLTM2MSwxMCArMzc0LDEwIEBACiAKIAlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9ORVdfU1lOX1JFQ1YpCiAJCXJldHVybiBpbmV0X3JlcV9kaWFnX2ZpbGwoc2ssIHNrYiwgcG9ydGlkLCBzZXEsCi0JCQkJCSAgbmxtc2dfZmxhZ3MsIHVubGgpOworCQkJCQkgIG5sbXNnX2ZsYWdzLCB1bmxoLCBuZXRfYWRtaW4pOwogCiAJcmV0dXJuIGluZXRfY3NrX2RpYWdfZmlsbChzaywgc2tiLCByLCB1c2VyX25zLCBwb3J0aWQsIHNlcSwKLQkJCQkgIG5sbXNnX2ZsYWdzLCB1bmxoKTsKKwkJCQkgIG5sbXNnX2ZsYWdzLCB1bmxoLCBuZXRfYWRtaW4pOwogfQogCiBzdHJ1Y3Qgc29jayAqaW5ldF9kaWFnX2ZpbmRfb25lX2ljc2soc3RydWN0IG5ldCAqbmV0LApAQCAtNDM0LDcgKzQ0Nyw4IEBACiAJZXJyID0gc2tfZGlhZ19maWxsKHNrLCByZXAsIHJlcSwKIAkJCSAgIHNrX3VzZXJfbnMoTkVUTElOS19DQihpbl9za2IpLnNrKSwKIAkJCSAgIE5FVExJTktfQ0IoaW5fc2tiKS5wb3J0aWQsCi0JCQkgICBubGgtPm5sbXNnX3NlcSwgMCwgbmxoKTsKKwkJCSAgIG5saC0+bmxtc2dfc2VxLCAwLCBubGgsCisJCQkgICBuZXRsaW5rX25ldF9jYXBhYmxlKGluX3NrYiwgQ0FQX05FVF9BRE1JTikpOwogCWlmIChlcnIgPCAwKSB7CiAJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CiAJCW5sbXNnX2ZyZWUocmVwKTsKQEAgLTU4MCw2ICs1OTQsMTQgQEAKIAkJCQl5ZXMgPSAwOwogCQkJYnJlYWs7CiAJCX0KKwkJY2FzZSBJTkVUX0RJQUdfQkNfTUFSS19DT05EOiB7CisJCQlzdHJ1Y3QgaW5ldF9kaWFnX21hcmtjb25kICpjb25kOworCisJCQljb25kID0gKHN0cnVjdCBpbmV0X2RpYWdfbWFya2NvbmQgKikob3AgKyAxKTsKKwkJCWlmICgoZW50cnktPm1hcmsgJiBjb25kLT5tYXNrKSAhPSBjb25kLT5tYXJrKQorCQkJCXllcyA9IDA7CisJCQlicmVhazsKKwkJfQogCQl9CiAKIAkJaWYgKHllcykgewpAQCAtNjI0LDYgKzY0NiwxMiBAQAogCWVudHJ5LmRwb3J0ID0gbnRvaHMoaW5ldC0+aW5ldF9kcG9ydCk7CiAJZW50cnkuaWZpbmRleCA9IHNrLT5za19ib3VuZF9kZXZfaWY7CiAJZW50cnkudXNlcmxvY2tzID0gc2tfZnVsbHNvY2soc2spID8gc2stPnNrX3VzZXJsb2NrcyA6IDA7CisJaWYgKHNrX2Z1bGxzb2NrKHNrKSkKKwkJZW50cnkubWFyayA9IHNrLT5za19tYXJrOworCWVsc2UgaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTkVXX1NZTl9SRUNWKQorCQllbnRyeS5tYXJrID0gaW5ldF9yc2soaW5ldF9yZXFzayhzaykpLT5pcl9tYXJrOworCWVsc2UKKwkJZW50cnkubWFyayA9IDA7CiAKIAlyZXR1cm4gaW5ldF9kaWFnX2JjX3J1bihiYywgJmVudHJ5KTsKIH0KQEAgLTcwNiwxMCArNzM0LDI1IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgaW5ldF9kaWFnX2JjX2F1ZGl0KGNvbnN0IHZvaWQgKmJ5dGVjb2RlLCBpbnQgYnl0ZWNvZGVfbGVuKQorc3RhdGljIGJvb2wgdmFsaWRfbWFya2NvbmQoY29uc3Qgc3RydWN0IGluZXRfZGlhZ19iY19vcCAqb3AsIGludCBsZW4sCisJCQkgICBpbnQgKm1pbl9sZW4pCiB7Ci0JY29uc3Qgdm9pZCAqYmMgPSBieXRlY29kZTsKLQlpbnQgIGxlbiA9IGJ5dGVjb2RlX2xlbjsKKwkqbWluX2xlbiArPSBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19tYXJrY29uZCk7CisJcmV0dXJuIGxlbiA+PSAqbWluX2xlbjsKK30KKworc3RhdGljIGludCBpbmV0X2RpYWdfYmNfYXVkaXQoY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0ciwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJYm9vbCBuZXRfYWRtaW4gPSBuZXRsaW5rX25ldF9jYXBhYmxlKHNrYiwgQ0FQX05FVF9BRE1JTik7CisJY29uc3Qgdm9pZCAqYnl0ZWNvZGUsICpiYzsKKwlpbnQgYnl0ZWNvZGVfbGVuLCBsZW47CisKKwlpZiAoIWF0dHIgfHwgbmxhX2xlbihhdHRyKSA8IHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlieXRlY29kZSA9IGJjID0gbmxhX2RhdGEoYXR0cik7CisJbGVuID0gYnl0ZWNvZGVfbGVuID0gbmxhX2xlbihhdHRyKTsKIAogCXdoaWxlIChsZW4gPiAwKSB7CiAJCWludCBtaW5fbGVuID0gc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApOwpAQCAtNzMyLDYgKzc3NSwxMiBAQAogCQkJaWYgKCF2YWxpZF9wb3J0X2NvbXBhcmlzb24oYmMsIGxlbiwgJm1pbl9sZW4pKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJYnJlYWs7CisJCWNhc2UgSU5FVF9ESUFHX0JDX01BUktfQ09ORDoKKwkJCWlmICghbmV0X2FkbWluKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlpZiAoIXZhbGlkX21hcmtjb25kKGJjLCBsZW4sICZtaW5fbGVuKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOwogCQljYXNlIElORVRfRElBR19CQ19BVVRPOgogCQljYXNlIElORVRfRElBR19CQ19KTVA6CiAJCWNhc2UgSU5FVF9ESUFHX0JDX05PUDoKQEAgLTc2MCw3ICs4MDksOCBAQAogCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLAotCQkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqYmMpCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICpiYywKKwkJCSAgICAgIGJvb2wgbmV0X2FkbWluKQogewogCWlmICghaW5ldF9kaWFnX2JjX3NrKGJjLCBzaykpCiAJCXJldHVybiAwOwpAQCAtNzY4LDcgKzgxOCw4IEBACiAJcmV0dXJuIGluZXRfY3NrX2RpYWdfZmlsbChzaywgc2tiLCByLAogCQkJCSAgc2tfdXNlcl9ucyhORVRMSU5LX0NCKGNiLT5za2IpLnNrKSwKIAkJCQkgIE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAotCQkJCSAgY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwgY2ItPm5saCk7CisJCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBjYi0+bmxoLAorCQkJCSAgbmV0X2FkbWluKTsKIH0KIAogc3RhdGljIHZvaWQgdHdza19idWlsZF9hc3NlcnQodm9pZCkKQEAgLTgwNCw2ICs4NTUsNyBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwogCWludCBpLCBudW0sIHNfaSwgc19udW07CiAJdTMyIGlkaWFnX3N0YXRlcyA9IHItPmlkaWFnX3N0YXRlczsKKwlib29sIG5ldF9hZG1pbiA9IG5ldGxpbmtfbmV0X2NhcGFibGUoY2ItPnNrYiwgQ0FQX05FVF9BRE1JTik7CiAKIAlpZiAoaWRpYWdfc3RhdGVzICYgVENQRl9TWU5fUkVDVikKIAkJaWRpYWdfc3RhdGVzIHw9IFRDUEZfTkVXX1NZTl9SRUNWOwpAQCAtODQ0LDcgKzg5Niw4IEBACiAJCQkJICAgIGNiLT5hcmdzWzNdID4gMCkKIAkJCQkJZ290byBuZXh0X2xpc3RlbjsKIAotCQkJCWlmIChpbmV0X2Nza19kaWFnX2R1bXAoc2ssIHNrYiwgY2IsIHIsIGJjKSA8IDApIHsKKwkJCQlpZiAoaW5ldF9jc2tfZGlhZ19kdW1wKHNrLCBza2IsIGNiLCByLAorCQkJCQkJICAgICAgIGJjLCBuZXRfYWRtaW4pIDwgMCkgewogCQkJCQlzcGluX3VubG9ja19iaCgmaWxiLT5sb2NrKTsKIAkJCQkJZ290byBkb25lOwogCQkJCX0KQEAgLTkxMiw3ICs5NjUsNyBAQAogCQkJCQkgICBza191c2VyX25zKE5FVExJTktfQ0IoY2ItPnNrYikuc2spLAogCQkJCQkgICBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQkJICAgY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwKLQkJCQkJICAgY2ItPm5saCk7CisJCQkJCSAgIGNiLT5ubGgsIG5ldF9hZG1pbik7CiAJCQlpZiAocmVzIDwgMCkgewogCQkJCXNwaW5fdW5sb2NrX2JoKGxvY2spOwogCQkJCWdvdG8gZG9uZTsKQEAgLTEwMjAsMTMgKzEwNzMsMTMgQEAKIAlpZiAobmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVApIHsKIAkJaWYgKG5sbXNnX2F0dHJsZW4obmxoLCBoZHJsZW4pKSB7CiAJCQlzdHJ1Y3QgbmxhdHRyICphdHRyOworCQkJaW50IGVycjsKIAogCQkJYXR0ciA9IG5sbXNnX2ZpbmRfYXR0cihubGgsIGhkcmxlbiwKIAkJCQkJICAgICAgIElORVRfRElBR19SRVFfQllURUNPREUpOwotCQkJaWYgKCFhdHRyIHx8Ci0JCQkgICAgbmxhX2xlbihhdHRyKSA8IHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKSB8fAotCQkJICAgIGluZXRfZGlhZ19iY19hdWRpdChubGFfZGF0YShhdHRyKSwgbmxhX2xlbihhdHRyKSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQllcnIgPSBpbmV0X2RpYWdfYmNfYXVkaXQoYXR0ciwgc2tiKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKIAkJfQogCQl7CiAJCQlzdHJ1Y3QgbmV0bGlua19kdW1wX2NvbnRyb2wgYyA9IHsKQEAgLTEwNTEsMTMgKzExMDQsMTMgQEAKIAkgICAgaC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKSB7CiAJCWlmIChubG1zZ19hdHRybGVuKGgsIGhkcmxlbikpIHsKIAkJCXN0cnVjdCBubGF0dHIgKmF0dHI7CisJCQlpbnQgZXJyOwogCiAJCQlhdHRyID0gbmxtc2dfZmluZF9hdHRyKGgsIGhkcmxlbiwKIAkJCQkJICAgICAgIElORVRfRElBR19SRVFfQllURUNPREUpOwotCQkJaWYgKCFhdHRyIHx8Ci0JCQkgICAgbmxhX2xlbihhdHRyKSA8IHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKSB8fAotCQkJICAgIGluZXRfZGlhZ19iY19hdWRpdChubGFfZGF0YShhdHRyKSwgbmxhX2xlbihhdHRyKSkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7CisJCQllcnIgPSBpbmV0X2RpYWdfYmNfYXVkaXQoYXR0ciwgc2tiKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKIAkJfQogCQl7CiAJCQlzdHJ1Y3QgbmV0bGlua19kdW1wX2NvbnRyb2wgYyA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2dyZS5jIGIvbmV0L2lwdjQvaXBfZ3JlLmMKaW5kZXggMTEzY2M0My4uNTc2ZjcwNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfZ3JlLmMKKysrIGIvbmV0L2lwdjQvaXBfZ3JlLmMKQEAgLTI0NiwyNSArMjQ2LDYgQEAKIAlpcGdyZV9lcnIoc2tiLCBpbmZvLCAmdHBpKTsKIH0KIAotc3RhdGljIF9fYmU2NCBrZXlfdG9fdHVubmVsX2lkKF9fYmUzMiBrZXkpCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmU2NCkoKF9fZm9yY2UgdTMyKWtleSk7Ci0jZWxzZQotCXJldHVybiAoX19mb3JjZSBfX2JlNjQpKChfX2ZvcmNlIHU2NClrZXkgPDwgMzIpOwotI2VuZGlmCi19Ci0KLS8qIFJldHVybnMgdGhlIGxlYXN0LXNpZ25pZmljYW50IDMyIGJpdHMgb2YgYSBfX2JlNjQuICovCi1zdGF0aWMgX19iZTMyIHR1bm5lbF9pZF90b19rZXkoX19iZTY0IHgpCi17Ci0jaWZkZWYgX19CSUdfRU5ESUFOCi0JcmV0dXJuIChfX2ZvcmNlIF9fYmUzMil4OwotI2Vsc2UKLQlyZXR1cm4gKF9fZm9yY2UgX19iZTMyKSgoX19mb3JjZSB1NjQpeCA+PiAzMik7Ci0jZW5kaWYKLX0KLQogc3RhdGljIGludCBfX2lwZ3JlX3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdG5sX3B0a19pbmZvICp0cGksCiAJCSAgICAgICBzdHJ1Y3QgaXBfdHVubmVsX25ldCAqaXRuLCBpbnQgaGRyX2xlbiwgYm9vbCByYXdfcHJvdG8pCiB7CkBAIC0yOTAsNyArMjcxLDcgQEAKIAkJCV9fYmU2NCB0dW5faWQ7CiAKIAkJCWZsYWdzID0gdHBpLT5mbGFncyAmIChUVU5ORUxfQ1NVTSB8IFRVTk5FTF9LRVkpOwotCQkJdHVuX2lkID0ga2V5X3RvX3R1bm5lbF9pZCh0cGktPmtleSk7CisJCQl0dW5faWQgPSBrZXkzMl90b190dW5uZWxfaWQodHBpLT5rZXkpOwogCQkJdHVuX2RzdCA9IGlwX3R1bl9yeF9kc3Qoc2tiLCBmbGFncywgdHVuX2lkLCAwKTsKIAkJCWlmICghdHVuX2RzdCkKIAkJCQlyZXR1cm4gUEFDS0VUX1JFSkVDVDsKQEAgLTQ0Niw3ICs0MjcsNyBAQAogCiAJZmxhZ3MgPSB0dW5faW5mby0+a2V5LnR1bl9mbGFncyAmIChUVU5ORUxfQ1NVTSB8IFRVTk5FTF9LRVkpOwogCWdyZV9idWlsZF9oZWFkZXIoc2tiLCB0dW5uZWxfaGxlbiwgZmxhZ3MsIHByb3RvLAotCQkJIHR1bm5lbF9pZF90b19rZXkodHVuX2luZm8tPmtleS50dW5faWQpLCAwKTsKKwkJCSB0dW5uZWxfaWRfdG9fa2V5MzIodHVuX2luZm8tPmtleS50dW5faWQpLCAwKTsKIAogCWRmID0ga2V5LT50dW5fZmxhZ3MgJiBUVU5ORUxfRE9OVF9GUkFHTUVOVCA/ICBodG9ucyhJUF9ERikgOiAwOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9pbnB1dC5jIGIvbmV0L2lwdjQvaXBfaW5wdXQuYwppbmRleCA0YjM1MWFmLi5kNmZlYWJiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L2lwX2lucHV0LmMKQEAgLTMxMiw2ICszMTIsNyBAQAogewogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwogCiAJLyogaWYgaW5ncmVzcyBkZXZpY2UgaXMgZW5zbGF2ZWQgdG8gYW4gTDMgbWFzdGVyIGRldmljZSBwYXNzIHRoZQogCSAqIHNrYiB0byBpdHMgaGFuZGxlciBmb3IgcHJvY2Vzc2luZwpAQCAtMzQxLDcgKzM0Miw3IEBACiAJICovCiAJaWYgKCFza2JfdmFsaWRfZHN0KHNrYikpIHsKIAkJaW50IGVyciA9IGlwX3JvdXRlX2lucHV0X25vcmVmKHNrYiwgaXBoLT5kYWRkciwgaXBoLT5zYWRkciwKLQkJCQkJICAgICAgIGlwaC0+dG9zLCBza2ItPmRldik7CisJCQkJCSAgICAgICBpcGgtPnRvcywgZGV2KTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJCWlmIChlcnIgPT0gLUVYREVWKQogCQkJCV9fTkVUX0lOQ19TVEFUUyhuZXQsIExJTlVYX01JQl9JUFJQRklMVEVSKTsKQEAgLTM3MCw3ICszNzEsNyBAQAogCQlfX0lQX1VQRF9QT19TVEFUUyhuZXQsIElQU1RBVFNfTUlCX0lOQkNBU1QsIHNrYi0+bGVuKTsKIAl9IGVsc2UgaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX0JST0FEQ0FTVCB8fAogCQkgICBza2ItPnBrdF90eXBlID09IFBBQ0tFVF9NVUxUSUNBU1QpIHsKLQkJc3RydWN0IGluX2RldmljZSAqaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShza2ItPmRldik7CisJCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IF9faW5fZGV2X2dldF9yY3UoZGV2KTsKIAogCQkvKiBSRkMgMTEyMiAzLjMuNjoKIAkJICoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX291dHB1dC5jIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKaW5kZXggZGRlMzdmYi4uMDVkMTA1OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvaXBfb3V0cHV0LmMKQEAgLTczLDYgKzczLDcgQEAKICNpbmNsdWRlIDxuZXQvaWNtcC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPG5ldC9pbmV0cGVlci5oPgorI2luY2x1ZGUgPG5ldC9sd3R1bm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lnbXAuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KQEAgLTk4LDYgKzk5LDE0IEBACiAKIAlpcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbik7CiAJaXBfc2VuZF9jaGVjayhpcGgpOworCisJLyogaWYgZWdyZXNzIGRldmljZSBpcyBlbnNsYXZlZCB0byBhbiBMMyBtYXN0ZXIgZGV2aWNlIHBhc3MgdGhlCisJICogc2tiIHRvIGl0cyBoYW5kbGVyIGZvciBwcm9jZXNzaW5nCisJICovCisJc2tiID0gbDNtZGV2X2lwX291dChzaywgc2tiKTsKKwlpZiAodW5saWtlbHkoIXNrYikpCisJCXJldHVybiAwOworCiAJcmV0dXJuIG5mX2hvb2soTkZQUk9UT19JUFY0LCBORl9JTkVUX0xPQ0FMX09VVCwKIAkJICAgICAgIG5ldCwgc2ssIHNrYiwgTlVMTCwgc2tiX2RzdChza2IpLT5kZXYsCiAJCSAgICAgICBkc3Rfb3V0cHV0KTsKQEAgLTE5Nyw2ICsyMDYsMTMgQEAKIAkJc2tiID0gc2tiMjsKIAl9CiAKKwlpZiAobHd0dW5uZWxfeG1pdF9yZWRpcmVjdChkc3QtPmx3dHN0YXRlKSkgeworCQlpbnQgcmVzID0gbHd0dW5uZWxfeG1pdChza2IpOworCisJCWlmIChyZXMgPCAwIHx8IHJlcyA9PSBMV1RVTk5FTF9YTUlUX0RPTkUpCisJCQlyZXR1cm4gcmVzOworCX0KKwogCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAluZXh0aG9wID0gKF9fZm9yY2UgdTMyKSBydF9uZXh0aG9wKHJ0LCBpcF9oZHIoc2tiKS0+ZGFkZHIpOwogCW5laWdoID0gX19pcHY0X25laWdoX2xvb2t1cF9ub3JlZihkZXYsIG5leHRob3ApOwpAQCAtNDgyLDcgKzQ5OCw3IEBACiAJdG8tPnRjX2luZGV4ID0gZnJvbS0+dGNfaW5kZXg7CiAjZW5kaWYKIAluZl9jb3B5KHRvLCBmcm9tKTsKLSNpZiBkZWZpbmVkKENPTkZJR19JUF9WUykgfHwgZGVmaW5lZChDT05GSUdfSVBfVlNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQX1ZTKQogCXRvLT5pcHZzX3Byb3BlcnR5ID0gZnJvbS0+aXB2c19wcm9wZXJ0eTsKICNlbmRpZgogCXNrYl9jb3B5X3NlY21hcmsodG8sIGZyb20pOwpAQCAtMTU2Niw4ICsxNTgyLDcgQEAKIAl9CiAKIAlvaWYgPSBhcmctPmJvdW5kX2Rldl9pZjsKLQlpZiAoIW9pZiAmJiBuZXRpZl9pbmRleF9pc19sM19tYXN0ZXIobmV0LCBza2ItPnNrYl9paWYpKQotCQlvaWYgPSBza2ItPnNrYl9paWY7CisJb2lmID0gb2lmID8gOiBza2ItPnNrYl9paWY7CiAKIAlmbG93aTRfaW5pdF9vdXRwdXQoJmZsNCwgb2lmLAogCQkJICAgSVA0X1JFUExZX01BUksobmV0LCBza2ItPm1hcmspLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfc29ja2dsdWUuYyBiL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKaW5kZXggNzFhNTJmNGQuLmFmNDkxOTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwpAQCAtMjg0LDkgKzI4NCwxMiBAQAogCQkJaXBjLT50dGwgPSB2YWw7CiAJCQlicmVhazsKIAkJY2FzZSBJUF9UT1M6Ci0JCQlpZiAoY21zZy0+Y21zZ19sZW4gIT0gQ01TR19MRU4oc2l6ZW9mKGludCkpKQorCQkJaWYgKGNtc2ctPmNtc2dfbGVuID09IENNU0dfTEVOKHNpemVvZihpbnQpKSkKKwkJCQl2YWwgPSAqKGludCAqKUNNU0dfREFUQShjbXNnKTsKKwkJCWVsc2UgaWYgKGNtc2ctPmNtc2dfbGVuID09IENNU0dfTEVOKHNpemVvZih1OCkpKQorCQkJCXZhbCA9ICoodTggKilDTVNHX0RBVEEoY21zZyk7CisJCQllbHNlCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl2YWwgPSAqKGludCAqKUNNU0dfREFUQShjbXNnKTsKIAkJCWlmICh2YWwgPCAwIHx8IHZhbCA+IDI1NSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWlwYy0+dG9zID0gdmFsOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfdHVubmVsLmMgYi9uZXQvaXB2NC9pcF90dW5uZWwuYwppbmRleCA5NTY0OWViLi41NzE5ZDZiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF90dW5uZWwuYworKysgYi9uZXQvaXB2NC9pcF90dW5uZWwuYwpAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRucy9nZW5lcmljLmg+CiAjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvZHN0X21ldGFkYXRhLmg+CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CkBAIC01NDYsNiArNTQ3LDgxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgaXBfbWRfdHVubmVsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggcHJvdG8pCit7CisJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgaGVhZHJvb20gPSBzaXplb2Yoc3RydWN0IGlwaGRyKTsKKwlzdHJ1Y3QgaXBfdHVubmVsX2luZm8gKnR1bl9pbmZvOworCWNvbnN0IHN0cnVjdCBpcF90dW5uZWxfa2V5ICprZXk7CisJY29uc3Qgc3RydWN0IGlwaGRyICppbm5lcl9pcGg7CisJc3RydWN0IHJ0YWJsZSAqcnQ7CisJc3RydWN0IGZsb3dpNCBmbDQ7CisJX19iZTE2IGRmID0gMDsKKwl1OCB0b3MsIHR0bDsKKworCXR1bl9pbmZvID0gc2tiX3R1bm5lbF9pbmZvKHNrYik7CisJaWYgKHVubGlrZWx5KCF0dW5faW5mbyB8fCAhKHR1bl9pbmZvLT5tb2RlICYgSVBfVFVOTkVMX0lORk9fVFgpIHx8CisJCSAgICAgaXBfdHVubmVsX2luZm9fYWYodHVuX2luZm8pICE9IEFGX0lORVQpKQorCQlnb3RvIHR4X2Vycm9yOworCWtleSA9ICZ0dW5faW5mby0+a2V5OworCW1lbXNldCgmKElQQ0Ioc2tiKS0+b3B0KSwgMCwgc2l6ZW9mKElQQ0Ioc2tiKS0+b3B0KSk7CisJaW5uZXJfaXBoID0gKGNvbnN0IHN0cnVjdCBpcGhkciAqKXNrYl9pbm5lcl9uZXR3b3JrX2hlYWRlcihza2IpOworCXRvcyA9IGtleS0+dG9zOworCWlmICh0b3MgPT0gMSkgeworCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCQl0b3MgPSBpbm5lcl9pcGgtPnRvczsKKwkJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUFY2KSkKKwkJCXRvcyA9IGlwdjZfZ2V0X2RzZmllbGQoKGNvbnN0IHN0cnVjdCBpcHY2aGRyICopaW5uZXJfaXBoKTsKKwl9CisJaW5pdF90dW5uZWxfZmxvdygmZmw0LCBwcm90bywga2V5LT51LmlwdjQuZHN0LCBrZXktPnUuaXB2NC5zcmMsIDAsCisJCQkgUlRfVE9TKHRvcyksIHR1bm5lbC0+cGFybXMubGluayk7CisJaWYgKHR1bm5lbC0+ZW5jYXAudHlwZSAhPSBUVU5ORUxfRU5DQVBfTk9ORSkKKwkJZ290byB0eF9lcnJvcjsKKwlydCA9IGlwX3JvdXRlX291dHB1dF9rZXkodHVubmVsLT5uZXQsICZmbDQpOworCWlmIChJU19FUlIocnQpKSB7CisJCWRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMrKzsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisJaWYgKHJ0LT5kc3QuZGV2ID09IGRldikgeworCQlpcF9ydF9wdXQocnQpOworCQlkZXYtPnN0YXRzLmNvbGxpc2lvbnMrKzsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisJdG9zID0gaXBfdHVubmVsX2Vjbl9lbmNhcCh0b3MsIGlubmVyX2lwaCwgc2tiKTsKKwl0dGwgPSBrZXktPnR0bDsKKwlpZiAodHRsID09IDApIHsKKwkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQkJdHRsID0gaW5uZXJfaXBoLT50dGw7CisJCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpCisJCQl0dGwgPSAoKGNvbnN0IHN0cnVjdCBpcHY2aGRyICopaW5uZXJfaXBoKS0+aG9wX2xpbWl0OworCQllbHNlCisJCQl0dGwgPSBpcDRfZHN0X2hvcGxpbWl0KCZydC0+ZHN0KTsKKwl9CisJaWYgKGtleS0+dHVuX2ZsYWdzICYgVFVOTkVMX0RPTlRfRlJBR01FTlQpCisJCWRmID0gaHRvbnMoSVBfREYpOworCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQlkZiA9IGlubmVyX2lwaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9ERik7CisJaGVhZHJvb20gKz0gTExfUkVTRVJWRURfU1BBQ0UocnQtPmRzdC5kZXYpICsgcnQtPmRzdC5oZWFkZXJfbGVuOworCWlmIChoZWFkcm9vbSA+IGRldi0+bmVlZGVkX2hlYWRyb29tKQorCQlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IGhlYWRyb29tOworCisJaWYgKHNrYl9jb3dfaGVhZChza2IsIGRldi0+bmVlZGVkX2hlYWRyb29tKSkgeworCQlpcF9ydF9wdXQocnQpOworCQlnb3RvIHR4X2Ryb3BwZWQ7CisJfQorCWlwdHVubmVsX3htaXQoTlVMTCwgcnQsIHNrYiwgZmw0LnNhZGRyLCBmbDQuZGFkZHIsIHByb3RvLCBrZXktPnRvcywKKwkJICAgICAga2V5LT50dGwsIGRmLCAhbmV0X2VxKHR1bm5lbC0+bmV0LCBkZXZfbmV0KGRldikpKTsKKwlyZXR1cm47Cit0eF9lcnJvcjoKKwlkZXYtPnN0YXRzLnR4X2Vycm9ycysrOworCWdvdG8ga2ZyZWU7Cit0eF9kcm9wcGVkOgorCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwora2ZyZWU6CisJa2ZyZWVfc2tiKHNrYik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpcF9tZF90dW5uZWxfeG1pdCk7CisKIHZvaWQgaXBfdHVubmVsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJICAgIGNvbnN0IHN0cnVjdCBpcGhkciAqdG5sX3BhcmFtcywgdTggcHJvdG9jb2wpCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF90dW5uZWxfY29yZS5jIGIvbmV0L2lwdjQvaXBfdHVubmVsX2NvcmUuYwppbmRleCA5ZDg0N2MzLi43NzdiYzE4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF90dW5uZWxfY29yZS5jCisrKyBiL25ldC9pcHY0L2lwX3R1bm5lbF9jb3JlLmMKQEAgLTY5LDEzICs2OSwxNSBAQAogCiAJc2tiX3NjcnViX3BhY2tldChza2IsIHhuZXQpOwogCi0Jc2tiX2NsZWFyX2hhc2goc2tiKTsKKwlza2JfY2xlYXJfaGFzaF9pZl9ub3RfbDQoc2tiKTsKIAlza2JfZHN0X3NldChza2IsICZydC0+ZHN0KTsKIAltZW1zZXQoSVBDQihza2IpLCAwLCBzaXplb2YoKklQQ0Ioc2tiKSkpOwogCi0JaWYgKHNrYl9paWYgJiYgcHJvdG8gPT0gSVBQUk9UT19VRFApIHsKLQkJLyogQXJyaXZlZCBmcm9tIGFuIGluZ3Jlc3MgaW50ZXJmYWNlIGFuZCBnb3QgdWRwIGVuY2FwdXNsYXRlZC4KLQkJICogVGhlIGVuY2Fwc3VsYXRlZCBuZXR3b3JrIHNlZ21lbnQgbGVuZ3RoIG1heSBleGNlZWQgZHN0IG10dS4KKwlpZiAoc2tiX2lpZiAmJiAhKGRmICYgaHRvbnMoSVBfREYpKSkgeworCQkvKiBBcnJpdmVkIGZyb20gYW4gaW5ncmVzcyBpbnRlcmZhY2UsIGdvdCBlbmNhcHN1bGF0ZWQsIHdpdGgKKwkJICogZnJhZ21lbnRhdGlvbiBvZiBlbmNhcHVsYXRpbmcgZnJhbWVzIGFsbG93ZWQuCisJCSAqIElmIHNrYiBpcyBnc28sIHRoZSByZXN1bHRpbmcgZW5jYXBzdWxhdGVkIG5ldHdvcmsgc2VnbWVudHMKKwkJICogbWF5IGV4Y2VlZCBkc3QgbXR1LgogCQkgKiBBbGxvdyBJUCBGcmFnbWVudGF0aW9uIG9mIHNlZ21lbnRzLgogCQkgKi8KIAkJSVBDQihza2IpLT5mbGFncyB8PSBJUFNLQl9GUkFHX1NFR1M7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF92dGkuYyBiL25ldC9pcHY0L2lwX3Z0aS5jCmluZGV4IGNjNzAxZmEuLjVkNzk0NGYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3Z0aS5jCisrKyBiL25ldC9pcHY0L2lwX3Z0aS5jCkBAIC04OCw2ICs4OCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcGNwdV9zd19uZXRzdGF0cyAqdHN0YXRzOwogCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCXN0cnVjdCB4ZnJtX21vZGUgKmlubmVyX21vZGU7CiAJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gWEZSTV9UVU5ORUxfU0tCX0NCKHNrYiktPnR1bm5lbC5pcDQ7CiAJdTMyIG9yaWdfbWFyayA9IHNrYi0+bWFyazsKIAlpbnQgcmV0OwpAQCAtMTA1LDcgKzEwNiwxOSBAQAogCX0KIAogCXggPSB4ZnJtX2lucHV0X3N0YXRlKHNrYik7Ci0JZmFtaWx5ID0geC0+aW5uZXJfbW9kZS0+YWZpbmZvLT5mYW1pbHk7CisKKwlpbm5lcl9tb2RlID0geC0+aW5uZXJfbW9kZTsKKworCWlmICh4LT5zZWwuZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQlpbm5lcl9tb2RlID0geGZybV9pcDJpbm5lcl9tb2RlKHgsIFhGUk1fTU9ERV9TS0JfQ0Ioc2tiKS0+cHJvdG9jb2wpOworCQlpZiAoaW5uZXJfbW9kZSA9PSBOVUxMKSB7CisJCQlYRlJNX0lOQ19TVEFUUyhkZXZfbmV0KHNrYi0+ZGV2KSwKKwkJCQkgICAgICAgTElOVVhfTUlCX1hGUk1JTlNUQVRFTU9ERUVSUk9SKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJZmFtaWx5ID0gaW5uZXJfbW9kZS0+YWZpbmZvLT5mYW1pbHk7CiAKIAlza2ItPm1hcmsgPSBiZTMyX3RvX2NwdSh0dW5uZWwtPnBhcm1zLmlfa2V5KTsKIAlyZXQgPSB4ZnJtX3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9JTiwgc2tiLCBmYW1pbHkpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBjb25maWcuYyBiL25ldC9pcHY0L2lwY29uZmlnLmMKaW5kZXggMWQ3MWM0MC4uMDcxYTc4NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBjb25maWcuYworKysgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCkBAIC04NSw3ICs4NSw2IEBACiAvKiBEZWZpbmUgdGhlIHRpbWVvdXQgZm9yIHdhaXRpbmcgZm9yIGEgREhDUC9CT09UUC9SQVJQIHJlcGx5ICovCiAjZGVmaW5lIENPTkZfT1BFTl9SRVRSSUVTIAkyCS8qIChSZSlvcGVuIGRldmljZXMgdHdpY2UgKi8KICNkZWZpbmUgQ09ORl9TRU5EX1JFVFJJRVMgCTYJLyogU2VuZCBzaXggcmVxdWVzdHMgcGVyIG9wZW4gKi8KLSNkZWZpbmUgQ09ORl9JTlRFUl9USU1FT1VUCShIWikJLyogSW50ZXItZGV2aWNlIHRpbWVvdXQ6IDEgc2Vjb25kICovCiAjZGVmaW5lIENPTkZfQkFTRV9USU1FT1VUCShIWioyKQkvKiBJbml0aWFsIHRpbWVvdXQ6IDIgc2Vjb25kcyAqLwogI2RlZmluZSBDT05GX1RJTUVPVVRfUkFORE9NCShIWikJLyogTWF4aW11bSBhbW91bnQgb2YgcmFuZG9taXphdGlvbiAqLwogI2RlZmluZSBDT05GX1RJTUVPVVRfTVVMVAkqNy80CS8qIFJhdGUgb2YgdGltZW91dCBncm93dGggKi8KQEAgLTE4OCw3ICsxODcsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBpY19kZXZpY2UgKmljX2ZpcnN0X2RldiBfX2luaXRkYXRhOwkvKiBMaXN0IG9mIG9wZW4gZGV2aWNlICovCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmljX2RldiBfX2luaXRkYXRhOwkJLyogU2VsZWN0ZWQgZGV2aWNlICovCitzdGF0aWMgc3RydWN0IGljX2RldmljZSAqaWNfZGV2IF9faW5pdGRhdGE7CQkvKiBTZWxlY3RlZCBkZXZpY2UgKi8KIAogc3RhdGljIGJvb2wgX19pbml0IGljX2lzX2luaXRfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0zMDcsNyArMzA2LDcgQEAKIAl3aGlsZSAoKGQgPSBuZXh0KSkgewogCQluZXh0ID0gZC0+bmV4dDsKIAkJZGV2ID0gZC0+ZGV2OwotCQlpZiAoZGV2ICE9IGljX2RldiAmJiAhbmV0ZGV2X3VzZXNfZHNhKGRldikpIHsKKwkJaWYgKCghaWNfZGV2IHx8IGRldiAhPSBpY19kZXYtPmRldikgJiYgIW5ldGRldl91c2VzX2RzYShkZXYpKSB7CiAJCQlwcl9kZWJ1ZygiSVAtQ29uZmlnOiBEb3duaW5nICVzXG4iLCBkZXYtPm5hbWUpOwogCQkJZGV2X2NoYW5nZV9mbGFncyhkZXYsIGQtPmZsYWdzKTsKIAkJfQpAQCAtMzcyLDcgKzM3MSw3IEBACiAJaW50IGVycjsKIAogCW1lbXNldCgmaXIsIDAsIHNpemVvZihpcikpOwotCXN0cmNweShpci5pZnJfaWZybi5pZnJuX25hbWUsIGljX2Rldi0+bmFtZSk7CisJc3RyY3B5KGlyLmlmcl9pZnJuLmlmcm5fbmFtZSwgaWNfZGV2LT5kZXYtPm5hbWUpOwogCXNldF9zb2NrYWRkcihzaW4sIGljX215YWRkciwgMCk7CiAJaWYgKChlcnIgPSBpY19kZXZpbmV0X2lvY3RsKFNJT0NTSUZBRERSLCAmaXIpKSA8IDApIHsKIAkJcHJfZXJyKCJJUC1Db25maWc6IFVuYWJsZSB0byBzZXQgaW50ZXJmYWNlIGFkZHJlc3MgKCVkKVxuIiwKQEAgLTM5Niw3ICszOTUsNyBAQAogCSAqIG91dCwgd2UnbGwgdHJ5IHRvIG11ZGRsZSBhbG9uZy4KIAkgKi8KIAlpZiAoaWNfZGV2X210dSAhPSAwKSB7Ci0JCXN0cmNweShpci5pZnJfbmFtZSwgaWNfZGV2LT5uYW1lKTsKKwkJc3RyY3B5KGlyLmlmcl9uYW1lLCBpY19kZXYtPmRldi0+bmFtZSk7CiAJCWlyLmlmcl9tdHUgPSBpY19kZXZfbXR1OwogCQlpZiAoKGVyciA9IGljX2Rldl9pb2N0bChTSU9DU0lGTVRVLCAmaXIpKSA8IDApCiAJCQlwcl9lcnIoIklQLUNvbmZpZzogVW5hYmxlIHRvIHNldCBpbnRlcmZhY2UgbXR1IHRvICVkICglZClcbiIsCkBAIC01NjgsNyArNTY3LDcgQEAKIAkJZ290byBkcm9wX3VubG9jazsKIAogCS8qIFdlIGhhdmUgYSB3aW5uZXIhICovCi0JaWNfZGV2ID0gZGV2OworCWljX2RldiA9IGQ7CiAJaWYgKGljX215YWRkciA9PSBOT05FKQogCQlpY19teWFkZHIgPSB0aXA7CiAJaWNfc2VydmFkZHIgPSBzaXA7CkBAIC02NTUsOCArNjU0LDYgQEAKIAkuZnVuYyA9CWljX2Jvb3RwX3JlY3YsCiB9OwogCi1zdGF0aWMgX19iZTMyIGljX2Rldl94aWQ7CQkvKiBEZXZpY2UgdW5kZXIgY29uZmlndXJhdGlvbiAqLwotCiAvKgogICogIEluaXRpYWxpemUgREhDUC9CT09UUCBleHRlbnNpb24gZmllbGRzIGluIHRoZSByZXF1ZXN0LgogICovCkBAIC02NjYsMTQgKzY2MywxNCBAQAogI2lmZGVmIElQQ09ORklHX0RIQ1AKIAogc3RhdGljIHZvaWQgX19pbml0Ci1pY19kaGNwX2luaXRfb3B0aW9ucyh1OCAqb3B0aW9ucykKK2ljX2RoY3BfaW5pdF9vcHRpb25zKHU4ICpvcHRpb25zLCBzdHJ1Y3QgaWNfZGV2aWNlICpkKQogewogCXU4IG10ID0gKChpY19zZXJ2YWRkciA9PSBOT05FKQogCQkgPyBESENQRElTQ09WRVIgOiBESENQUkVRVUVTVCk7CiAJdTggKmUgPSBvcHRpb25zOwogCWludCBsZW47CiAKLQlwcl9kZWJ1ZygiREhDUDogU2VuZGluZyBtZXNzYWdlIHR5cGUgJWRcbiIsIG10KTsKKwlwcl9kZWJ1ZygiREhDUDogU2VuZGluZyBtZXNzYWdlIHR5cGUgJWQgKCVzKVxuIiwgbXQsIGQtPmRldi0+bmFtZSk7CiAKIAltZW1jcHkoZSwgaWNfYm9vdHBfY29va2llLCA0KTsJLyogUkZDMTA0OCBNYWdpYyBDb29raWUgKi8KIAllICs9IDQ7CkBAIC04NTcsNyArODU0LDcgQEAKIAkvKiBhZGQgREhDUCBvcHRpb25zIG9yIEJPT1RQIGV4dGVuc2lvbnMgKi8KICNpZmRlZiBJUENPTkZJR19ESENQCiAJaWYgKGljX3Byb3RvX2VuYWJsZWQgJiBJQ19VU0VfREhDUCkKLQkJaWNfZGhjcF9pbml0X29wdGlvbnMoYi0+ZXh0ZW4pOworCQlpY19kaGNwX2luaXRfb3B0aW9ucyhiLT5leHRlbiwgZCk7CiAJZWxzZQogI2VuZGlmCiAJCWljX2Jvb3RwX2luaXRfZXh0KGItPmV4dGVuKTsKQEAgLTEwMzMsMTQgKzEwMzAsOCBAQAogCS8qIElzIGl0IGEgcmVwbHkgdG8gb3VyIEJPT1RQIHJlcXVlc3Q/ICovCiAJaWYgKGItPm9wICE9IEJPT1RQX1JFUExZIHx8CiAJICAgIGItPnhpZCAhPSBkLT54aWQpIHsKLQkJbmV0X2Vycl9yYXRlbGltaXRlZCgiREhDUC9CT09UUDogUmVwbHkgbm90IGZvciB1cywgb3BbJXhdIHhpZFsleF1cbiIsCi0JCQkJICAgIGItPm9wLCBiLT54aWQpOwotCQlnb3RvIGRyb3BfdW5sb2NrOwotCX0KLQotCS8qIElzIGl0IGEgcmVwbHkgZm9yIHRoZSBkZXZpY2Ugd2UgYXJlIGNvbmZpZ3VyaW5nPyAqLwotCWlmIChiLT54aWQgIT0gaWNfZGV2X3hpZCkgewotCQluZXRfZXJyX3JhdGVsaW1pdGVkKCJESENQL0JPT1RQOiBJZ25vcmluZyBkZWxheWVkIHBhY2tldFxuIik7CisJCW5ldF9lcnJfcmF0ZWxpbWl0ZWQoIkRIQ1AvQk9PVFA6IFJlcGx5IG5vdCBmb3IgdXMgb24gJXMsIG9wWyV4XSB4aWRbJXhdXG4iLAorCQkJCSAgICBkLT5kZXYtPm5hbWUsIGItPm9wLCBiLT54aWQpOwogCQlnb3RvIGRyb3BfdW5sb2NrOwogCX0KIApAQCAtMTA3NSw3ICsxMDY2LDcgQEAKIAkJCQl9CiAJCQl9CiAKLQkJCXByX2RlYnVnKCJESENQOiBHb3QgbWVzc2FnZSB0eXBlICVkXG4iLCBtdCk7CisJCQlwcl9kZWJ1ZygiREhDUDogR290IG1lc3NhZ2UgdHlwZSAlZCAoJXMpXG4iLCBtdCwgZC0+ZGV2LT5uYW1lKTsKIAogCQkJc3dpdGNoIChtdCkgewogCQkJY2FzZSBESENQT0ZGRVI6CkBAIC0xMTMwLDcgKzExMjEsNyBAQAogCX0KIAogCS8qIFdlIGhhdmUgYSB3aW5uZXIhICovCi0JaWNfZGV2ID0gZGV2OworCWljX2RldiA9IGQ7CiAJaWNfbXlhZGRyID0gYi0+eW91cl9pcDsKIAlpY19zZXJ2YWRkciA9IGItPnNlcnZlcl9pcDsKIAlpY19hZGRyc2VydmFkZHIgPSBiLT5pcGguc2FkZHI7CkBAIC0xMjI1LDkgKzEyMTYsNiBAQAogCXRpbWVvdXQgPSBDT05GX0JBU0VfVElNRU9VVCArICh0aW1lb3V0ICUgKHVuc2lnbmVkIGludCkgQ09ORl9USU1FT1VUX1JBTkRPTSk7CiAJZm9yICg7OykgewogI2lmZGVmIElQQ09ORklHX0JPT1RQCi0JCS8qIFRyYWNrIHRoZSBkZXZpY2Ugd2UgYXJlIGNvbmZpZ3VyaW5nICovCi0JCWljX2Rldl94aWQgPSBkLT54aWQ7Ci0KIAkJaWYgKGRvX2Jvb3RwICYmIChkLT5hYmxlICYgSUNfQk9PVFApKQogCQkJaWNfYm9vdHBfc2VuZF9pZihkLCBqaWZmaWVzIC0gc3RhcnRfamlmZmllcyk7CiAjZW5kaWYKQEAgLTEyMzYsMTUgKzEyMjQsMTkgQEAKIAkJCWljX3JhcnBfc2VuZF9pZihkKTsKICNlbmRpZgogCi0JCWppZmYgPSBqaWZmaWVzICsgKGQtPm5leHQgPyBDT05GX0lOVEVSX1RJTUVPVVQgOiB0aW1lb3V0KTsKLQkJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGppZmYpICYmICFpY19nb3RfcmVwbHkpCi0JCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJaWYgKCFkLT5uZXh0KSB7CisJCQlqaWZmID0gamlmZmllcyArIHRpbWVvdXQ7CisJCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgamlmZikgJiYgIWljX2dvdF9yZXBseSkKKwkJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKKwkJfQogI2lmZGVmIElQQ09ORklHX0RIQ1AKIAkJLyogREhDUCBpc24ndCBkb25lIHVudGlsIHdlIGdldCBhIERIQ1BBQ0suICovCiAJCWlmICgoaWNfZ290X3JlcGx5ICYgSUNfQk9PVFApICYmCiAJCSAgICAoaWNfcHJvdG9fZW5hYmxlZCAmIElDX1VTRV9ESENQKSAmJgogCQkgICAgaWNfZGhjcF9tc2d0eXBlICE9IERIQ1BBQ0spIHsKIAkJCWljX2dvdF9yZXBseSA9IDA7CisJCQkvKiBjb250aW51ZSBvbiBkZXZpY2UgdGhhdCBnb3QgdGhlIHJlcGx5ICovCisJCQlkID0gaWNfZGV2OwogCQkJcHJfY29udCgiLCIpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTE0ODcsNyArMTQ3OSw3IEBACiAjZW5kaWYgLyogSVBDT05GSUdfRFlOQU1JQyAqLwogCX0gZWxzZSB7CiAJCS8qIERldmljZSBzZWxlY3RlZCBtYW51YWxseSBvciBvbmx5IG9uZSBkZXZpY2UgLT4gdXNlIGl0ICovCi0JCWljX2RldiA9IGljX2ZpcnN0X2Rldi0+ZGV2OworCQlpY19kZXYgPSBpY19maXJzdF9kZXY7CiAJfQogCiAJYWRkciA9IHJvb3RfbmZzX3BhcnNlX2FkZHIocm9vdF9zZXJ2ZXJfcGF0aCk7CkBAIC0xNTAxLDE0ICsxNDkzLDYgQEAKIAkJcmV0dXJuIC0xOwogCiAJLyoKLQkgKiBDbG9zZSBhbGwgbmV0d29yayBkZXZpY2VzIGV4Y2VwdCB0aGUgZGV2aWNlIHdlJ3ZlCi0JICogYXV0b2NvbmZpZ3VyZWQgYW5kIHNldCB1cCByb3V0ZXMuCi0JICovCi0JaWNfY2xvc2VfZGV2cygpOwotCWlmIChpY19zZXR1cF9pZigpIDwgMCB8fCBpY19zZXR1cF9yb3V0ZXMoKSA8IDApCi0JCXJldHVybiAtMTsKLQotCS8qCiAJICogUmVjb3JkIHdoaWNoIHByb3RvY29sIHdhcyBhY3R1YWxseSB1c2VkLgogCSAqLwogI2lmZGVmIElQQ09ORklHX0RZTkFNSUMKQEAgLTE1MjIsNyArMTUwNiw3IEBACiAJcHJfaW5mbygiSVAtQ29uZmlnOiBDb21wbGV0ZTpcbiIpOwogCiAJcHJfaW5mbygiICAgICBkZXZpY2U9JXMsIGh3YWRkcj0lKnBoQywgaXBhZGRyPSVwSTQsIG1hc2s9JXBJNCwgZ3c9JXBJNFxuIiwKLQkJaWNfZGV2LT5uYW1lLCBpY19kZXYtPmFkZHJfbGVuLCBpY19kZXYtPmRldl9hZGRyLAorCQlpY19kZXYtPmRldi0+bmFtZSwgaWNfZGV2LT5kZXYtPmFkZHJfbGVuLCBpY19kZXYtPmRldi0+ZGV2X2FkZHIsCiAJCSZpY19teWFkZHIsICZpY19uZXRtYXNrLCAmaWNfZ2F0ZXdheSk7CiAJcHJfaW5mbygiICAgICBob3N0PSVzLCBkb21haW49JXMsIG5pcy1kb21haW49JXNcbiIsCiAJCXV0c25hbWUoKS0+bm9kZW5hbWUsIGljX2RvbWFpbiwgdXRzbmFtZSgpLT5kb21haW5uYW1lKTsKQEAgLTE1NDIsNyArMTUyNiwxOCBAQAogCXByX2NvbnQoIlxuIik7CiAjZW5kaWYgLyogIVNJTEVOVCAqLwogCi0JcmV0dXJuIDA7CisJLyoKKwkgKiBDbG9zZSBhbGwgbmV0d29yayBkZXZpY2VzIGV4Y2VwdCB0aGUgZGV2aWNlIHdlJ3ZlCisJICogYXV0b2NvbmZpZ3VyZWQgYW5kIHNldCB1cCByb3V0ZXMuCisJICovCisJaWYgKGljX3NldHVwX2lmKCkgPCAwIHx8IGljX3NldHVwX3JvdXRlcygpIDwgMCkKKwkJZXJyID0gLTE7CisJZWxzZQorCQllcnIgPSAwOworCisJaWNfY2xvc2VfZGV2cygpOworCisJcmV0dXJuIGVycjsKIH0KIAogbGF0ZV9pbml0Y2FsbChpcF9hdXRvX2NvbmZpZyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcGlwLmMgYi9uZXQvaXB2NC9pcGlwLmMKaW5kZXggNGFlM2Y4ZS4uYzkzOTI1OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBpcC5jCisrKyBiL25ldC9pcHY0L2lwaXAuYwpAQCAtMTE1LDYgKzExNSw3IEBACiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRucy9nZW5lcmljLmg+CisjaW5jbHVkZSA8bmV0L2RzdF9tZXRhZGF0YS5oPgogCiBzdGF0aWMgYm9vbCBsb2dfZWNuX2Vycm9yID0gdHJ1ZTsKIG1vZHVsZV9wYXJhbShsb2dfZWNuX2Vycm9yLCBib29sLCAwNjQ0KTsKQEAgLTE5Myw2ICsxOTQsNyBAQAogewogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiLT5kZXYpOwogCXN0cnVjdCBpcF90dW5uZWxfbmV0ICppdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIGlwaXBfbmV0X2lkKTsKKwlzdHJ1Y3QgbWV0YWRhdGFfZHN0ICp0dW5fZHN0ID0gTlVMTDsKIAlzdHJ1Y3QgaXBfdHVubmVsICp0dW5uZWw7CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGg7CiAKQEAgLTIxNiw3ICsyMTgsMTIgQEAKIAkJCXRwaSA9ICZpcGlwX3RwaTsKIAkJaWYgKGlwdHVubmVsX3B1bGxfaGVhZGVyKHNrYiwgMCwgdHBpLT5wcm90bywgZmFsc2UpKQogCQkJZ290byBkcm9wOwotCQlyZXR1cm4gaXBfdHVubmVsX3Jjdih0dW5uZWwsIHNrYiwgdHBpLCBOVUxMLCBsb2dfZWNuX2Vycm9yKTsKKwkJaWYgKHR1bm5lbC0+Y29sbGVjdF9tZCkgeworCQkJdHVuX2RzdCA9IGlwX3R1bl9yeF9kc3Qoc2tiLCAwLCAwLCAwKTsKKwkJCWlmICghdHVuX2RzdCkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gaXBfdHVubmVsX3Jjdih0dW5uZWwsIHNrYiwgdHBpLCB0dW5fZHN0LCBsb2dfZWNuX2Vycm9yKTsKIAl9CiAKIAlyZXR1cm4gLTE7CkBAIC0yNzAsNyArMjc3LDEwIEBACiAKIAlza2Jfc2V0X2lubmVyX2lwcHJvdG8oc2tiLCBpcHByb3RvKTsKIAotCWlwX3R1bm5lbF94bWl0KHNrYiwgZGV2LCB0aXBoLCBpcHByb3RvKTsKKwlpZiAodHVubmVsLT5jb2xsZWN0X21kKQorCQlpcF9tZF90dW5uZWxfeG1pdChza2IsIGRldiwgaXBwcm90byk7CisJZWxzZQorCQlpcF90dW5uZWxfeG1pdChza2IsIGRldiwgdGlwaCwgaXBwcm90byk7CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAogdHhfZXJyb3I6CkBAIC0zODAsMTMgKzM5MCwxNCBAQAogfQogCiBzdGF0aWMgdm9pZCBpcGlwX25ldGxpbmtfcGFybXMoc3RydWN0IG5sYXR0ciAqZGF0YVtdLAotCQkJICAgICAgIHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcGFybXMpCisJCQkgICAgICAgc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwYXJtcywgYm9vbCAqY29sbGVjdF9tZCkKIHsKIAltZW1zZXQocGFybXMsIDAsIHNpemVvZigqcGFybXMpKTsKIAogCXBhcm1zLT5pcGgudmVyc2lvbiA9IDQ7CiAJcGFybXMtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fSVBJUDsKIAlwYXJtcy0+aXBoLmlobCA9IDU7CisJKmNvbGxlY3RfbWQgPSBmYWxzZTsKIAogCWlmICghZGF0YSkKIAkJcmV0dXJuOwpAQCAtNDE0LDYgKzQyNSw5IEBACiAKIAlpZiAoIWRhdGFbSUZMQV9JUFRVTl9QTVRVRElTQ10gfHwgbmxhX2dldF91OChkYXRhW0lGTEFfSVBUVU5fUE1UVURJU0NdKSkKIAkJcGFybXMtPmlwaC5mcmFnX29mZiA9IGh0b25zKElQX0RGKTsKKworCWlmIChkYXRhW0lGTEFfSVBUVU5fQ09MTEVDVF9NRVRBREFUQV0pCisJCSpjb2xsZWN0X21kID0gdHJ1ZTsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiBFTkNBUCBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50IGluIHRoZSBubCBtc2cgKi8KQEAgLTQ1MywxOCArNDY3LDE4IEBACiBzdGF0aWMgaW50IGlwaXBfbmV3bGluayhzdHJ1Y3QgbmV0ICpzcmNfbmV0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJc3RydWN0IG5sYXR0ciAqdGJbXSwgc3RydWN0IG5sYXR0ciAqZGF0YVtdKQogeworCXN0cnVjdCBpcF90dW5uZWwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpcF90dW5uZWxfcGFybSBwOwogCXN0cnVjdCBpcF90dW5uZWxfZW5jYXAgaXBlbmNhcDsKIAogCWlmIChpcGlwX25ldGxpbmtfZW5jYXBfcGFybXMoZGF0YSwgJmlwZW5jYXApKSB7Ci0JCXN0cnVjdCBpcF90dW5uZWwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOwogCQlpbnQgZXJyID0gaXBfdHVubmVsX2VuY2FwX3NldHVwKHQsICZpcGVuY2FwKTsKIAogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQogCi0JaXBpcF9uZXRsaW5rX3Bhcm1zKGRhdGEsICZwKTsKKwlpcGlwX25ldGxpbmtfcGFybXMoZGF0YSwgJnAsICZ0LT5jb2xsZWN0X21kKTsKIAlyZXR1cm4gaXBfdHVubmVsX25ld2xpbmsoZGV2LCB0YiwgJnApOwogfQogCkBAIC00NzMsNiArNDg3LDcgQEAKIHsKIAlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gcDsKIAlzdHJ1Y3QgaXBfdHVubmVsX2VuY2FwIGlwZW5jYXA7CisJYm9vbCBjb2xsZWN0X21kOwogCiAJaWYgKGlwaXBfbmV0bGlua19lbmNhcF9wYXJtcyhkYXRhLCAmaXBlbmNhcCkpIHsKIAkJc3RydWN0IGlwX3R1bm5lbCAqdCA9IG5ldGRldl9wcml2KGRldik7CkBAIC00ODIsNyArNDk3LDkgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCi0JaXBpcF9uZXRsaW5rX3Bhcm1zKGRhdGEsICZwKTsKKwlpcGlwX25ldGxpbmtfcGFybXMoZGF0YSwgJnAsICZjb2xsZWN0X21kKTsKKwlpZiAoY29sbGVjdF9tZCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoKChkZXYtPmZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKSAmJiAhcC5pcGguZGFkZHIpIHx8CiAJICAgICghKGRldi0+ZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQpICYmIHAuaXBoLmRhZGRyKSkKQEAgLTUxNiw2ICs1MzMsOCBAQAogCQlubGFfdG90YWxfc2l6ZSgyKSArCiAJCS8qIElGTEFfSVBUVU5fRU5DQVBfRFBPUlQgKi8KIAkJbmxhX3RvdGFsX3NpemUoMikgKworCQkvKiBJRkxBX0lQVFVOX0NPTExFQ1RfTUVUQURBVEEgKi8KKwkJbmxhX3RvdGFsX3NpemUoMCkgKwogCQkwOwogfQogCkBAIC01NDQsNiArNTYzLDkgQEAKIAkJCXR1bm5lbC0+ZW5jYXAuZmxhZ3MpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAorCWlmICh0dW5uZWwtPmNvbGxlY3RfbWQpCisJCWlmIChubGFfcHV0X2ZsYWcoc2tiLCBJRkxBX0lQVFVOX0NPTExFQ1RfTUVUQURBVEEpKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJcmV0dXJuIDA7CiAKIG5sYV9wdXRfZmFpbHVyZToKQEAgLTU2Miw2ICs1ODQsNyBAQAogCVtJRkxBX0lQVFVOX0VOQ0FQX0ZMQUdTXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW0lGTEFfSVBUVU5fRU5DQVBfU1BPUlRdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbSUZMQV9JUFRVTl9FTkNBUF9EUE9SVF0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtJRkxBX0lQVFVOX0NPTExFQ1RfTUVUQURBVEFdCT0geyAudHlwZSA9IE5MQV9GTEFHIH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19vcHMgaXBpcF9saW5rX29wcyBfX3JlYWRfbW9zdGx5ID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBtci5jIGIvbmV0L2lwdjQvaXBtci5jCmluZGV4IDI2MjUzMzIuLjVmMDA2ZTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwbXIuYworKysgYi9uZXQvaXB2NC9pcG1yLmMKQEAgLTIwNzYsNiArMjA3Niw3IEBACiAJc3RydWN0IHJ0YV9tZmNfc3RhdHMgbWZjczsKIAlzdHJ1Y3QgbmxhdHRyICptcF9hdHRyOwogCXN0cnVjdCBydG5leHRob3AgKm5ocDsKKwl1bnNpZ25lZCBsb25nIGxhc3R1c2U7CiAJaW50IGN0OwogCiAJLyogSWYgY2FjaGUgaXMgdW5yZXNvbHZlZCwgZG9uJ3QgdHJ5IHRvIHBhcnNlIElJRiBhbmQgT0lGICovCkBAIC0yMTA1LDEyICsyMTA2LDE0IEBACiAKIAlubGFfbmVzdF9lbmQoc2tiLCBtcF9hdHRyKTsKIAorCWxhc3R1c2UgPSBSRUFEX09OQ0UoYy0+bWZjX3VuLnJlcy5sYXN0dXNlKTsKKwlsYXN0dXNlID0gdGltZV9hZnRlcl9lcShqaWZmaWVzLCBsYXN0dXNlKSA/IGppZmZpZXMgLSBsYXN0dXNlIDogMDsKKwogCW1mY3MubWZjc19wYWNrZXRzID0gYy0+bWZjX3VuLnJlcy5wa3Q7CiAJbWZjcy5tZmNzX2J5dGVzID0gYy0+bWZjX3VuLnJlcy5ieXRlczsKIAltZmNzLm1mY3Nfd3JvbmdfaWYgPSBjLT5tZmNfdW4ucmVzLndyb25nX2lmOwogCWlmIChubGFfcHV0XzY0Yml0KHNrYiwgUlRBX01GQ19TVEFUUywgc2l6ZW9mKG1mY3MpLCAmbWZjcywgUlRBX1BBRCkgfHwKLQkgICAgbmxhX3B1dF91NjRfNjRiaXQoc2tiLCBSVEFfRVhQSVJFUywKLQkJCSAgICAgIGppZmZpZXNfdG9fY2xvY2tfdChjLT5tZmNfdW4ucmVzLmxhc3R1c2UpLAorCSAgICBubGFfcHV0X3U2NF82NGJpdChza2IsIFJUQV9FWFBJUkVTLCBqaWZmaWVzX3RvX2Nsb2NrX3QobGFzdHVzZSksCiAJCQkgICAgICBSVEFfUEFEKSkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIApAQCAtMjEyMCw3ICsyMTIzLDcgQEAKIAogaW50IGlwbXJfZ2V0X3JvdXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIsCi0JCSAgIHN0cnVjdCBydG1zZyAqcnRtLCBpbnQgbm93YWl0KQorCQkgICBzdHJ1Y3QgcnRtc2cgKnJ0bSwgaW50IG5vd2FpdCwgdTMyIHBvcnRpZCkKIHsKIAlzdHJ1Y3QgbWZjX2NhY2hlICpjYWNoZTsKIAlzdHJ1Y3QgbXJfdGFibGUgKm1ydDsKQEAgLTIxNjUsNiArMjE2OCw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCisJCU5FVExJTktfQ0Ioc2tiMikucG9ydGlkID0gcG9ydGlkOwogCQlza2JfcHVzaChza2IyLCBzaXplb2Yoc3RydWN0IGlwaGRyKSk7CiAJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IyKTsKIAkJaXBoID0gaXBfaGRyKHNrYjIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCBjMTg3YzYwLi5kNjEzMzA5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMjUsMTcgKzI1LDYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKLWNvbmZpZyBORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKLQlib29sICJwcm9jL3N5c2N0bCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGNvbm5lY3Rpb24gdHJhY2tpbmciCi0JZGVwZW5kcyBvbiBORl9DT05OVFJBQ0tfUFJPQ0ZTICYmIE5GX0NPTk5UUkFDS19JUFY0Ci0JZGVmYXVsdCB5Ci0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyAvcHJvYyBhbmQgc3lzY3RsIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkCi0JICBsYXllciAzIGRlcGVuZGVudCBjb25uZWN0aW9uIHRyYWNraW5nLiBUaGlzIGlzIG5lZWRlZCB0byBrZWVwCi0JICBvbGQgcHJvZ3JhbXMgdGhhdCBoYXZlIG5vdCBiZWVuIGFkYXB0ZWQgdG8gdGhlIG5ldyBuYW1lcyB3b3JraW5nLgotCi0JICBJZiB1bnN1cmUsIHNheSBZLgotCiBpZiBORl9UQUJMRVMKIAogY29uZmlnIE5GX1RBQkxFU19JUFY0CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggODdiMDczZC4uODUzMzI4ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtNCwxMSArNCw2IEBACiAKICMgb2JqZWN0cyBmb3IgbDMgaW5kZXBlbmRlbnQgY29ubnRyYWNrCiBuZl9jb25udHJhY2tfaXB2NC15CTo9ICBuZl9jb25udHJhY2tfbDNwcm90b19pcHY0Lm8gbmZfY29ubnRyYWNrX3Byb3RvX2ljbXAubwotaWZlcSAoJChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKSx5KQotaWZlcSAoJChDT05GSUdfUFJPQ19GUykseSkKLW5mX2Nvbm50cmFja19pcHY0LW9ianMJKz0gbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NF9jb21wYXQubwotZW5kaWYKLWVuZGlmCiAKICMgY29ubmVjdGlvbiB0cmFja2luZwogb2JqLSQoQ09ORklHX05GX0NPTk5UUkFDS19JUFY0KSArPSBuZl9jb25udHJhY2tfaXB2NC5vCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKaW5kZXggZjk5MzU0NS4uN2MwMGNlOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAJLnUgPSB7CiAJCS5sb2cgPSB7CiAJCQkubGV2ZWwgPSA0LAotCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX01BU0ssCisJCQkubG9nZmxhZ3MgPSBORl9MT0dfREVGQVVMVF9NQVNLLAogCQl9LAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKaW5kZXggYWUxYTcxYS4uNzEzYzA5YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAlpZiAoIWhlbHApCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKLQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgKi8KKwkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3RocmVzaCAqLwogCWhlbHBlciA9IHJjdV9kZXJlZmVyZW5jZShoZWxwLT5oZWxwZXIpOwogCWlmICghaGVscGVyKQogCQlyZXR1cm4gTkZfQUNDRVBUOwpAQCAtMjAyLDQ3ICsyMDIsNiBAQAogCX0sCiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfU1lTQ1RMKSAmJiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQpCi1zdGF0aWMgaW50IGxvZ19pbnZhbGlkX3Byb3RvX21pbiA9IDA7Ci1zdGF0aWMgaW50IGxvZ19pbnZhbGlkX3Byb3RvX21heCA9IDI1NTsKLQotc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgaXBfY3Rfc3lzY3RsX3RhYmxlW10gPSB7Ci0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX21heCIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2NvdW50IiwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDQ0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfYnVja2V0cyIsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA0NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiaXBfY29ubnRyYWNrX2NoZWNrc3VtIiwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZQk9ICJpcF9jb25udHJhY2tfbG9nX2ludmFsaWQiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19taW5tYXgsCi0JCS5leHRyYTEJCT0gJmxvZ19pbnZhbGlkX3Byb3RvX21pbiwKLQkJLmV4dHJhMgkJPSAmbG9nX2ludmFsaWRfcHJvdG9fbWF4LAotCX0sCi0JeyB9Ci19OwotI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgJiYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DX0NPTVBBVCAqLwotCiAvKiBGYXN0IGZ1bmN0aW9uIGZvciB0aG9zZSB3aG8gZG9uJ3Qgd2FudCB0byBwYXJzZSAvcHJvYyAoYW5kIEkgZG9uJ3QKICAgIGJsYW1lIHRoZW0pLiAqLwogLyogUmV2ZXJzaW5nIHRoZSBzb2NrZXQncyBkc3Qvc3JjIHBvaW50IG9mIHZpZXcgZ2l2ZXMgdXMgdGhlIHJlcGx5CkBAIC0zNTAsMjAgKzMwOSw2IEBACiAKIHN0YXRpYyBpbnQgaXB2NF9pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfU1lTQ1RMKSAmJiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQpCi0Jc3RydWN0IG5mX2lwX25ldCAqaW4gPSAmbmV0LT5jdC5uZl9jdF9wcm90bzsKLQlpbi0+Y3RsX3RhYmxlID0ga21lbWR1cChpcF9jdF9zeXNjdGxfdGFibGUsCi0JCQkJc2l6ZW9mKGlwX2N0X3N5c2N0bF90YWJsZSksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpbi0+Y3RsX3RhYmxlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWluLT5jdGxfdGFibGVbMF0uZGF0YSA9ICZuZl9jb25udHJhY2tfbWF4OwotCWluLT5jdGxfdGFibGVbMV0uZGF0YSA9ICZuZXQtPmN0LmNvdW50OwotCWluLT5jdGxfdGFibGVbMl0uZGF0YSA9ICZuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7Ci0JaW4tPmN0bF90YWJsZVszXS5kYXRhID0gJm5ldC0+Y3Quc3lzY3RsX2NoZWNrc3VtOwotCWluLT5jdGxfdGFibGVbNF0uZGF0YSA9ICZuZXQtPmN0LnN5c2N0bF9sb2dfaW52YWxpZDsKLSNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC0zODAsOSArMzI1LDYgQEAKIAkubmxhdHRyX3RvX3R1cGxlID0gaXB2NF9ubGF0dHJfdG9fdHVwbGUsCiAJLm5sYV9wb2xpY3kJID0gaXB2NF9ubGFfcG9saWN5LAogI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfU1lTQ1RMKSAmJiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQpCi0JLmN0bF90YWJsZV9wYXRoICA9ICJuZXQvaXB2NC9uZXRmaWx0ZXIiLAotI2VuZGlmCiAJLmluaXRfbmV0CSA9IGlwdjRfaW5pdF9uZXQsCiAJLm1lCQkgPSBUSElTX01PRFVMRSwKIH07CkBAIC00OTIsMTYgKzQzNCw3IEBACiAJCWdvdG8gY2xlYW51cF9pY21wdjQ7CiAJfQogCi0jaWYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotCXJldCA9IG5mX2Nvbm50cmFja19pcHY0X2NvbXBhdF9pbml0KCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gY2xlYW51cF9wcm90bzsKLSNlbmRpZgogCXJldHVybiByZXQ7Ci0jaWYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotIGNsZWFudXBfcHJvdG86Ci0JbmZfY3RfbDNwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDNwcm90b19pcHY0KTsKLSNlbmRpZgogIGNsZWFudXBfaWNtcHY0OgogCW5mX2N0X2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9faWNtcCk7CiAgY2xlYW51cF91ZHA0OgpAQCAtNTIwLDkgKzQ1Myw2IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NF9maW5pKHZvaWQpCiB7CiAJc3luY2hyb25pemVfbmV0KCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykgJiYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUKQotCW5mX2Nvbm50cmFja19pcHY0X2NvbXBhdF9maW5pKCk7Ci0jZW5kaWYKIAluZl9jdF9sM3Byb3RvX3VucmVnaXN0ZXIoJm5mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQpOwogCW5mX2N0X2w0cHJvdG9fdW5yZWdpc3RlcigmbmZfY29ubnRyYWNrX2w0cHJvdG9faWNtcCk7CiAJbmZfY3RfbDRwcm90b191bnJlZ2lzdGVyKCZuZl9jb25udHJhY2tfbDRwcm90b191ZHA0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0X2NvbXBhdC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOTIzNzEuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTIgKzAsMCBAQAotLyogaXBfY29ubnRyYWNrIHByb2MgY29tcGF0IC0gYmFzZWQgb24gaXBfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwotICoKLSAqIChDKSAxOTk5LTIwMDEgUGF1bCBgUnVzdHknIFJ1c3NlbGwKLSAqIChDKSAyMDAyLTIwMDYgTmV0ZmlsdGVyIENvcmUgVGVhbSA8Y29yZXRlYW1AbmV0ZmlsdGVyLm9yZz4KLSAqIChDKSAyMDA2LTIwMTAgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KLSNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG8uaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sNHByb3RvLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0Lmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5oPgotI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3RfbnVsbHMuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLQotc3RydWN0IGN0X2l0ZXJfc3RhdGUgewotCXN0cnVjdCBzZXFfbmV0X3ByaXZhdGUgcDsKLQlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqaGFzaDsKLQl1bnNpZ25lZCBpbnQgaHRhYmxlX3NpemU7Ci0JdW5zaWduZWQgaW50IGJ1Y2tldDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqY3RfZ2V0X2ZpcnN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxKQotewotCXN0cnVjdCBjdF9pdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjsKLQotCWZvciAoc3QtPmJ1Y2tldCA9IDA7Ci0JICAgICBzdC0+YnVja2V0IDwgc3QtPmh0YWJsZV9zaXplOwotCSAgICAgc3QtPmJ1Y2tldCsrKSB7Ci0JCW4gPSByY3VfZGVyZWZlcmVuY2UoCi0JCQlobGlzdF9udWxsc19maXJzdF9yY3UoJnN0LT5oYXNoW3N0LT5idWNrZXRdKSk7Ci0JCWlmICghaXNfYV9udWxscyhuKSkKLQkJCXJldHVybiBuOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBobGlzdF9udWxsc19ub2RlICpjdF9nZXRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKLQkJCQkgICAgICBzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqaGVhZCkKLXsKLQlzdHJ1Y3QgY3RfaXRlcl9zdGF0ZSAqc3QgPSBzZXEtPnByaXZhdGU7Ci0KLQloZWFkID0gcmN1X2RlcmVmZXJlbmNlKGhsaXN0X251bGxzX25leHRfcmN1KGhlYWQpKTsKLQl3aGlsZSAoaXNfYV9udWxscyhoZWFkKSkgewotCQlpZiAobGlrZWx5KGdldF9udWxsc192YWx1ZShoZWFkKSA9PSBzdC0+YnVja2V0KSkgewotCQkJaWYgKCsrc3QtPmJ1Y2tldCA+PSBzdC0+aHRhYmxlX3NpemUpCi0JCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaGVhZCA9IHJjdV9kZXJlZmVyZW5jZSgKLQkJCWhsaXN0X251bGxzX2ZpcnN0X3JjdSgmc3QtPmhhc2hbc3QtPmJ1Y2tldF0pKTsKLQl9Ci0JcmV0dXJuIGhlYWQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqY3RfZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKLXsKLQlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqaGVhZCA9IGN0X2dldF9maXJzdChzZXEpOwotCi0JaWYgKGhlYWQpCi0JCXdoaWxlIChwb3MgJiYgKGhlYWQgPSBjdF9nZXRfbmV4dChzZXEsIGhlYWQpKSkKLQkJCXBvcy0tOwotCXJldHVybiBwb3MgPyBOVUxMIDogaGVhZDsKLX0KLQotc3RhdGljIHZvaWQgKmN0X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCi0JX19hY3F1aXJlcyhSQ1UpCi17Ci0Jc3RydWN0IGN0X2l0ZXJfc3RhdGUgKnN0ID0gc2VxLT5wcml2YXRlOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCi0JbmZfY29ubnRyYWNrX2dldF9odCgmc3QtPmhhc2gsICZzdC0+aHRhYmxlX3NpemUpOwotCXJldHVybiBjdF9nZXRfaWR4KHNlcSwgKnBvcyk7Ci19Ci0KLXN0YXRpYyB2b2lkICpjdF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQotewotCSgqcG9zKSsrOwotCXJldHVybiBjdF9nZXRfbmV4dChzLCB2KTsKLX0KLQotc3RhdGljIHZvaWQgY3Rfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQotCV9fcmVsZWFzZXMoUkNVKQotewotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19TRUNNQVJLCi1zdGF0aWMgdm9pZCBjdF9zaG93X3NlY2N0eChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKLXsKLQlpbnQgcmV0OwotCXUzMiBsZW47Ci0JY2hhciAqc2VjY3R4OwotCi0JcmV0ID0gc2VjdXJpdHlfc2VjaWRfdG9fc2VjY3R4KGN0LT5zZWNtYXJrLCAmc2VjY3R4LCAmbGVuKTsKLQlpZiAocmV0KQotCQlyZXR1cm47Ci0KLQlzZXFfcHJpbnRmKHMsICJzZWNjdHg9JXMgIiwgc2VjY3R4KTsKLQotCXNlY3VyaXR5X3JlbGVhc2Vfc2VjY3R4KHNlY2N0eCwgbGVuKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgY3Rfc2hvd19zZWNjdHgoc3RydWN0IHNlcV9maWxlICpzLCBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCi17Ci19Ci0jZW5kaWYKLQotc3RhdGljIGJvb2wgY3Rfc2VxX3Nob3VsZF9za2lwKGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoYXNoKQotewotCS8qIHdlIG9ubHkgd2FudCB0byBwcmludCBESVJfT1JJR0lOQUwgKi8KLQlpZiAoTkZfQ1RfRElSRUNUSU9OKGhhc2gpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWlmIChuZl9jdF9sM251bShjdCkgIT0gQUZfSU5FVCkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZiAoIW5ldF9lcShuZl9jdF9uZXQoY3QpLCBuZXQpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGludCBjdF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCi17Ci0Jc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoYXNoID0gdjsKLQlzdHJ1Y3QgbmZfY29ubiAqY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGhhc2gpOwotCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDNwcm90byAqbDNwcm90bzsKLQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87Ci0JaW50IHJldCA9IDA7Ci0KLQlORl9DVF9BU1NFUlQoY3QpOwotCWlmIChjdF9zZXFfc2hvdWxkX3NraXAoY3QsIHNlcV9maWxlX25ldChzKSwgaGFzaCkpCi0JCXJldHVybiAwOwotCi0JaWYgKHVubGlrZWx5KCFhdG9taWNfaW5jX25vdF96ZXJvKCZjdC0+Y3RfZ2VuZXJhbC51c2UpKSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBjaGVjayBpZiB3ZSByYWNlZCB3LiBvYmplY3QgcmV1c2UgKi8KLQlpZiAoIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkgfHwKLQkgICAgY3Rfc2VxX3Nob3VsZF9za2lwKGN0LCBzZXFfZmlsZV9uZXQocyksIGhhc2gpKQotCQlnb3RvIHJlbGVhc2U7Ci0KLQlsM3Byb3RvID0gX19uZl9jdF9sM3Byb3RvX2ZpbmQobmZfY3RfbDNudW0oY3QpKTsKLQlORl9DVF9BU1NFUlQobDNwcm90byk7Ci0JbDRwcm90byA9IF9fbmZfY3RfbDRwcm90b19maW5kKG5mX2N0X2wzbnVtKGN0KSwgbmZfY3RfcHJvdG9udW0oY3QpKTsKLQlORl9DVF9BU1NFUlQobDRwcm90byk7Ci0KLQlyZXQgPSAtRU5PU1BDOwotCXNlcV9wcmludGYocywgIiUtOHMgJXUgJWxkICIsCi0JCSAgIGw0cHJvdG8tPm5hbWUsIG5mX2N0X3Byb3RvbnVtKGN0KSwKLQkJICAgdGltZXJfcGVuZGluZygmY3QtPnRpbWVvdXQpCi0JCSAgID8gKGxvbmcpKGN0LT50aW1lb3V0LmV4cGlyZXMgLSBqaWZmaWVzKS9IWiA6IDApOwotCi0JaWYgKGw0cHJvdG8tPnByaW50X2Nvbm50cmFjaykKLQkJbDRwcm90by0+cHJpbnRfY29ubnRyYWNrKHMsIGN0KTsKLQotCWlmIChzZXFfaGFzX292ZXJmbG93ZWQocykpCi0JCWdvdG8gcmVsZWFzZTsKLQotCXByaW50X3R1cGxlKHMsICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9PUklHSU5BTF0udHVwbGUsCi0JCSAgICBsM3Byb3RvLCBsNHByb3RvKTsKLQotCWlmIChzZXFfaGFzX292ZXJmbG93ZWQocykpCi0JCWdvdG8gcmVsZWFzZTsKLQotCWlmIChzZXFfcHJpbnRfYWNjdChzLCBjdCwgSVBfQ1RfRElSX09SSUdJTkFMKSkKLQkJZ290byByZWxlYXNlOwotCi0JaWYgKCEodGVzdF9iaXQoSVBTX1NFRU5fUkVQTFlfQklULCAmY3QtPnN0YXR1cykpKQotCQlzZXFfcHJpbnRmKHMsICJbVU5SRVBMSUVEXSAiKTsKLQotCXByaW50X3R1cGxlKHMsICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUsCi0JCSAgICBsM3Byb3RvLCBsNHByb3RvKTsKLQotCWlmIChzZXFfaGFzX292ZXJmbG93ZWQocykpCi0JCWdvdG8gcmVsZWFzZTsKLQotCWlmIChzZXFfcHJpbnRfYWNjdChzLCBjdCwgSVBfQ1RfRElSX1JFUExZKSkKLQkJZ290byByZWxlYXNlOwotCi0JaWYgKHRlc3RfYml0KElQU19BU1NVUkVEX0JJVCwgJmN0LT5zdGF0dXMpKQotCQlzZXFfcHJpbnRmKHMsICJbQVNTVVJFRF0gIik7Ci0KLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX01BUksKLQlzZXFfcHJpbnRmKHMsICJtYXJrPSV1ICIsIGN0LT5tYXJrKTsKLSNlbmRpZgotCi0JY3Rfc2hvd19zZWNjdHgocywgY3QpOwotCi0Jc2VxX3ByaW50ZihzLCAidXNlPSV1XG4iLCBhdG9taWNfcmVhZCgmY3QtPmN0X2dlbmVyYWwudXNlKSk7Ci0KLQlpZiAoc2VxX2hhc19vdmVyZmxvd2VkKHMpKQotCQlnb3RvIHJlbGVhc2U7Ci0KLQlyZXQgPSAwOwotcmVsZWFzZToKLQluZl9jdF9wdXQoY3QpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3Rfc2VxX29wcyA9IHsKLQkuc3RhcnQgPSBjdF9zZXFfc3RhcnQsCi0JLm5leHQgID0gY3Rfc2VxX25leHQsCi0JLnN0b3AgID0gY3Rfc2VxX3N0b3AsCi0JLnNob3cgID0gY3Rfc2VxX3Nob3cKLX07Ci0KLXN0YXRpYyBpbnQgY3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2VxX29wZW5fbmV0KGlub2RlLCBmaWxlLCAmY3Rfc2VxX29wcywKLQkJCSAgICBzaXplb2Yoc3RydWN0IGN0X2l0ZXJfc3RhdGUpKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3RfZmlsZV9vcHMgPSB7Ci0JLm93bmVyICAgPSBUSElTX01PRFVMRSwKLQkub3BlbiAgICA9IGN0X29wZW4sCi0JLnJlYWQgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX25ldCwKLX07Ci0KLS8qIGV4cGVjdHMgKi8KLXN0cnVjdCBjdF9leHBlY3RfaXRlcl9zdGF0ZSB7Ci0Jc3RydWN0IHNlcV9uZXRfcHJpdmF0ZSBwOwotCXVuc2lnbmVkIGludCBidWNrZXQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IGhsaXN0X25vZGUgKmN0X2V4cGVjdF9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCi17Ci0Jc3RydWN0IGN0X2V4cGVjdF9pdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKLQotCWZvciAoc3QtPmJ1Y2tldCA9IDA7IHN0LT5idWNrZXQgPCBuZl9jdF9leHBlY3RfaHNpemU7IHN0LT5idWNrZXQrKykgewotCQluID0gcmN1X2RlcmVmZXJlbmNlKAotCQkJaGxpc3RfZmlyc3RfcmN1KCZuZl9jdF9leHBlY3RfaGFzaFtzdC0+YnVja2V0XSkpOwotCQlpZiAobikKLQkJCXJldHVybiBuOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHN0cnVjdCBobGlzdF9ub2RlICpjdF9leHBlY3RfZ2V0X25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsCi0JCQkJCSAgICAgc3RydWN0IGhsaXN0X25vZGUgKmhlYWQpCi17Ci0Jc3RydWN0IGN0X2V4cGVjdF9pdGVyX3N0YXRlICpzdCA9IHNlcS0+cHJpdmF0ZTsKLQotCWhlYWQgPSByY3VfZGVyZWZlcmVuY2UoaGxpc3RfbmV4dF9yY3UoaGVhZCkpOwotCXdoaWxlIChoZWFkID09IE5VTEwpIHsKLQkJaWYgKCsrc3QtPmJ1Y2tldCA+PSBuZl9jdF9leHBlY3RfaHNpemUpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaGVhZCA9IHJjdV9kZXJlZmVyZW5jZSgKLQkJCWhsaXN0X2ZpcnN0X3JjdSgmbmZfY3RfZXhwZWN0X2hhc2hbc3QtPmJ1Y2tldF0pKTsKLQl9Ci0JcmV0dXJuIGhlYWQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaGxpc3Rfbm9kZSAqY3RfZXhwZWN0X2dldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCi17Ci0Jc3RydWN0IGhsaXN0X25vZGUgKmhlYWQgPSBjdF9leHBlY3RfZ2V0X2ZpcnN0KHNlcSk7Ci0KLQlpZiAoaGVhZCkKLQkJd2hpbGUgKHBvcyAmJiAoaGVhZCA9IGN0X2V4cGVjdF9nZXRfbmV4dChzZXEsIGhlYWQpKSkKLQkJCXBvcy0tOwotCXJldHVybiBwb3MgPyBOVUxMIDogaGVhZDsKLX0KLQotc3RhdGljIHZvaWQgKmV4cF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQotCV9fYWNxdWlyZXMoUkNVKQotewotCXJjdV9yZWFkX2xvY2soKTsKLQlyZXR1cm4gY3RfZXhwZWN0X2dldF9pZHgoc2VxLCAqcG9zKTsKLX0KLQotc3RhdGljIHZvaWQgKmV4cF9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCi17Ci0JKCpwb3MpKys7Ci0JcmV0dXJuIGN0X2V4cGVjdF9nZXRfbmV4dChzZXEsIHYpOwotfQotCi1zdGF0aWMgdm9pZCBleHBfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi0JX19yZWxlYXNlcyhSQ1UpCi17Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci0KLXN0YXRpYyBpbnQgZXhwX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLXsKLQlzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwOwotCWNvbnN0IHN0cnVjdCBobGlzdF9ub2RlICpuID0gdjsKLQotCWV4cCA9IGhsaXN0X2VudHJ5KG4sIHN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0LCBobm9kZSk7Ci0KLQlpZiAoIW5ldF9lcShuZl9jdF9uZXQoZXhwLT5tYXN0ZXIpLCBzZXFfZmlsZV9uZXQocykpKQotCQlyZXR1cm4gMDsKLQotCWlmIChleHAtPnR1cGxlLnNyYy5sM251bSAhPSBBRl9JTkVUKQotCQlyZXR1cm4gMDsKLQotCWlmIChleHAtPnRpbWVvdXQuZnVuY3Rpb24pCi0JCXNlcV9wcmludGYocywgIiVsZCAiLCB0aW1lcl9wZW5kaW5nKCZleHAtPnRpbWVvdXQpCi0JCQkgICA/IChsb25nKShleHAtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpL0haIDogMCk7Ci0JZWxzZQotCQlzZXFfcHJpbnRmKHMsICItICIpOwotCi0Jc2VxX3ByaW50ZihzLCAicHJvdG89JXUgIiwgZXhwLT50dXBsZS5kc3QucHJvdG9udW0pOwotCi0JcHJpbnRfdHVwbGUocywgJmV4cC0+dHVwbGUsCi0JCSAgICBfX25mX2N0X2wzcHJvdG9fZmluZChleHAtPnR1cGxlLnNyYy5sM251bSksCi0JCSAgICBfX25mX2N0X2w0cHJvdG9fZmluZChleHAtPnR1cGxlLnNyYy5sM251bSwKLQkJCQkJIGV4cC0+dHVwbGUuZHN0LnByb3RvbnVtKSk7Ci0Jc2VxX3B1dGMocywgJ1xuJyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBleHBfc2VxX29wcyA9IHsKLQkuc3RhcnQgPSBleHBfc2VxX3N0YXJ0LAotCS5uZXh0ID0gZXhwX3NlcV9uZXh0LAotCS5zdG9wID0gZXhwX3NlcV9zdG9wLAotCS5zaG93ID0gZXhwX3NlcV9zaG93Ci19OwotCi1zdGF0aWMgaW50IGV4cF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzZXFfb3Blbl9uZXQoaW5vZGUsIGZpbGUsICZleHBfc2VxX29wcywKLQkJCSAgICBzaXplb2Yoc3RydWN0IGN0X2V4cGVjdF9pdGVyX3N0YXRlKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlwX2V4cF9maWxlX29wcyA9IHsKLQkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gZXhwX29wZW4sCi0JLnJlYWQgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX25ldCwKLX07Ci0KLXN0YXRpYyB2b2lkICpjdF9jcHVfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKLXsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQoc2VxKTsKLQlpbnQgY3B1OwotCi0JaWYgKCpwb3MgPT0gMCkKLQkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKLQotCWZvciAoY3B1ID0gKnBvcy0xOyBjcHUgPCBucl9jcHVfaWRzOyArK2NwdSkgewotCQlpZiAoIWNwdV9wb3NzaWJsZShjcHUpKQotCQkJY29udGludWU7Ci0JCSpwb3MgPSBjcHUrMTsKLQkJcmV0dXJuIHBlcl9jcHVfcHRyKG5ldC0+Y3Quc3RhdCwgY3B1KTsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgKmN0X2NwdV9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCi17Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7Ci0JaW50IGNwdTsKLQotCWZvciAoY3B1ID0gKnBvczsgY3B1IDwgbnJfY3B1X2lkczsgKytjcHUpIHsKLQkJaWYgKCFjcHVfcG9zc2libGUoY3B1KSkKLQkJCWNvbnRpbnVlOwotCQkqcG9zID0gY3B1KzE7Ci0JCXJldHVybiBwZXJfY3B1X3B0cihuZXQtPmN0LnN0YXQsIGNwdSk7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGN0X2NwdV9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKLXsKLX0KLQotc3RhdGljIGludCBjdF9jcHVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7Ci0JdW5zaWduZWQgaW50IG5yX2Nvbm50cmFja3MgPSBhdG9taWNfcmVhZCgmbmV0LT5jdC5jb3VudCk7Ci0JY29uc3Qgc3RydWN0IGlwX2Nvbm50cmFja19zdGF0ICpzdCA9IHY7Ci0KLQlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKLQkJc2VxX3ByaW50ZihzZXEsICJlbnRyaWVzICBzZWFyY2hlZCBmb3VuZCBuZXcgaW52YWxpZCBpZ25vcmUgZGVsZXRlIGRlbGV0ZV9saXN0IGluc2VydCBpbnNlcnRfZmFpbGVkIGRyb3AgZWFybHlfZHJvcCBpY21wX2Vycm9yICBleHBlY3RfbmV3IGV4cGVjdF9jcmVhdGUgZXhwZWN0X2RlbGV0ZSBzZWFyY2hfcmVzdGFydFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXNlcV9wcmludGYoc2VxLCAiJTA4eCAgJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAiCi0JCQkiJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAotCQkgICBucl9jb25udHJhY2tzLAotCQkgICBzdC0+c2VhcmNoZWQsCi0JCSAgIHN0LT5mb3VuZCwKLQkJICAgc3QtPm5ldywKLQkJICAgc3QtPmludmFsaWQsCi0JCSAgIHN0LT5pZ25vcmUsCi0JCSAgIHN0LT5kZWxldGUsCi0JCSAgIHN0LT5kZWxldGVfbGlzdCwKLQkJICAgc3QtPmluc2VydCwKLQkJICAgc3QtPmluc2VydF9mYWlsZWQsCi0JCSAgIHN0LT5kcm9wLAotCQkgICBzdC0+ZWFybHlfZHJvcCwKLQkJICAgc3QtPmVycm9yLAotCi0JCSAgIHN0LT5leHBlY3RfbmV3LAotCQkgICBzdC0+ZXhwZWN0X2NyZWF0ZSwKLQkJICAgc3QtPmV4cGVjdF9kZWxldGUsCi0JCSAgIHN0LT5zZWFyY2hfcmVzdGFydAotCQkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGN0X2NwdV9zZXFfb3BzID0gewotCS5zdGFydCAgPSBjdF9jcHVfc2VxX3N0YXJ0LAotCS5uZXh0ICAgPSBjdF9jcHVfc2VxX25leHQsCi0JLnN0b3AgICA9IGN0X2NwdV9zZXFfc3RvcCwKLQkuc2hvdyAgID0gY3RfY3B1X3NlcV9zaG93LAotfTsKLQotc3RhdGljIGludCBjdF9jcHVfc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNlcV9vcGVuX25ldChpbm9kZSwgZmlsZSwgJmN0X2NwdV9zZXFfb3BzLAotCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2VxX25ldF9wcml2YXRlKSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGN0X2NwdV9zZXFfZm9wcyA9IHsKLQkub3duZXIgICA9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgID0gY3RfY3B1X3NlcV9vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9uZXQsCi19OwotCi1zdGF0aWMgaW50IF9fbmV0X2luaXQgaXBfY29ubnRyYWNrX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKLXsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2MsICpwcm9jX2V4cCwgKnByb2Nfc3RhdDsKLQotCXByb2MgPSBwcm9jX2NyZWF0ZSgiaXBfY29ubnRyYWNrIiwgMDQ0MCwgbmV0LT5wcm9jX25ldCwgJmN0X2ZpbGVfb3BzKTsKLQlpZiAoIXByb2MpCi0JCWdvdG8gZXJyMTsKLQotCXByb2NfZXhwID0gcHJvY19jcmVhdGUoImlwX2Nvbm50cmFja19leHBlY3QiLCAwNDQwLCBuZXQtPnByb2NfbmV0LAotCQkJICAgICAgICZpcF9leHBfZmlsZV9vcHMpOwotCWlmICghcHJvY19leHApCi0JCWdvdG8gZXJyMjsKLQotCXByb2Nfc3RhdCA9IHByb2NfY3JlYXRlKCJpcF9jb25udHJhY2siLCBTX0lSVUdPLAotCQkJCW5ldC0+cHJvY19uZXRfc3RhdCwgJmN0X2NwdV9zZXFfZm9wcyk7Ci0JaWYgKCFwcm9jX3N0YXQpCi0JCWdvdG8gZXJyMzsKLQlyZXR1cm4gMDsKLQotZXJyMzoKLQlyZW1vdmVfcHJvY19lbnRyeSgiaXBfY29ubnRyYWNrX2V4cGVjdCIsIG5ldC0+cHJvY19uZXQpOwotZXJyMjoKLQlyZW1vdmVfcHJvY19lbnRyeSgiaXBfY29ubnRyYWNrIiwgbmV0LT5wcm9jX25ldCk7Ci1lcnIxOgotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgdm9pZCBfX25ldF9leGl0IGlwX2Nvbm50cmFja19uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFjayIsIG5ldC0+cHJvY19uZXRfc3RhdCk7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoImlwX2Nvbm50cmFja19leHBlY3QiLCBuZXQtPnByb2NfbmV0KTsKLQlyZW1vdmVfcHJvY19lbnRyeSgiaXBfY29ubnRyYWNrIiwgbmV0LT5wcm9jX25ldCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgaXBfY29ubnRyYWNrX25ldF9vcHMgPSB7Ci0JLmluaXQgPSBpcF9jb25udHJhY2tfbmV0X2luaXQsCi0JLmV4aXQgPSBpcF9jb25udHJhY2tfbmV0X2V4aXQsCi19OwotCi1pbnQgX19pbml0IG5mX2Nvbm50cmFja19pcHY0X2NvbXBhdF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmlwX2Nvbm50cmFja19uZXRfb3BzKTsKLX0KLQotdm9pZCBfX2V4aXQgbmZfY29ubnRyYWNrX2lwdjRfY29tcGF0X2Zpbmkodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmlwX2Nvbm50cmFja19uZXRfb3BzKTsKLX0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wLmMKaW5kZXggYzU2N2UxYi4uZDA3NWIzYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wLmMKQEAgLTE0OSw3ICsxNDksNyBAQAogCQlyZXR1cm4gLU5GX0FDQ0VQVDsKIAl9CiAKLQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgKi8KKwkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3RocmVzaCAqLwogCWlubmVycHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChQRl9JTkVULCBvcmlndHVwbGUuZHN0LnByb3RvbnVtKTsKIAogCS8qIE9yZGluYXJpbHksIHdlJ2QgZXhwZWN0IHRoZSBpbnZlcnRlZCB0dXBsZXByb3RvLCBidXQgaXQncwpAQCAtMzI3LDE3ICszMjcsNiBAQAogCX0sCiAJeyB9CiB9OwotI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQKLXN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGljbXBfY29tcGF0X3N5c2N0bF90YWJsZVtdID0gewotCXsKLQkJLnByb2NuYW1lCT0gImlwX2Nvbm50cmFja19pY21wX3RpbWVvdXQiLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCX0sCi0JeyB9Ci19OwotI2VuZGlmIC8qIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ19DT01QQVQgKi8KICNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCiAKIHN0YXRpYyBpbnQgaWNtcF9rbWVtZHVwX3N5c2N0bF90YWJsZShzdHJ1Y3QgbmZfcHJvdG9fbmV0ICpwbiwKQEAgLTM1NSw0MCArMzQ0LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaWNtcF9rbWVtZHVwX2NvbXBhdF9zeXNjdGxfdGFibGUoc3RydWN0IG5mX3Byb3RvX25ldCAqcG4sCi0JCQkJCSAgICBzdHJ1Y3QgbmZfaWNtcF9uZXQgKmluKQotewotI2lmZGVmIENPTkZJR19TWVNDVEwKLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCi0JcG4tPmN0bF9jb21wYXRfdGFibGUgPSBrbWVtZHVwKGljbXBfY29tcGF0X3N5c2N0bF90YWJsZSwKLQkJCQkgICAgICAgc2l6ZW9mKGljbXBfY29tcGF0X3N5c2N0bF90YWJsZSksCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghcG4tPmN0bF9jb21wYXRfdGFibGUpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcG4tPmN0bF9jb21wYXRfdGFibGVbMF0uZGF0YSA9ICZpbi0+dGltZW91dDsKLSNlbmRpZgotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgaWNtcF9pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQsIHVfaW50MTZfdCBwcm90bykKIHsKLQlpbnQgcmV0OwogCXN0cnVjdCBuZl9pY21wX25ldCAqaW4gPSBpY21wX3Blcm5ldChuZXQpOwogCXN0cnVjdCBuZl9wcm90b19uZXQgKnBuID0gJmluLT5wbjsKIAogCWluLT50aW1lb3V0ID0gbmZfY3RfaWNtcF90aW1lb3V0OwogCi0JcmV0ID0gaWNtcF9rbWVtZHVwX2NvbXBhdF9zeXNjdGxfdGFibGUocG4sIGluKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGljbXBfa21lbWR1cF9zeXNjdGxfdGFibGUocG4sIGluKTsKLQlpZiAocmV0IDwgMCkKLQkJbmZfY3Rfa2ZyZWVfY29tcGF0X3N5c2N0bF90YWJsZShwbik7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBpY21wX2ttZW1kdXBfc3lzY3RsX3RhYmxlKHBuLCBpbik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZfcHJvdG9fbmV0ICppY21wX2dldF9uZXRfcHJvdG8oc3RydWN0IG5ldCAqbmV0KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2R1cF9pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfZHVwX2lwdjQuYwppbmRleCBjZWIxODczLi5jZjk4NmUxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfZHVwX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfZHVwX2lwdjQuYwpAQCAtNzQsMjEgKzc0LDE5IEBACiAJbmZfY29ubnRyYWNrX2dldChza2ItPm5mY3QpOwogI2VuZGlmCiAJLyoKLQkgKiBJZiB3ZSBhcmUgaW4gUFJFUk9VVElORy9JTlBVVCwgdGhlIGNoZWNrc3VtIG11c3QgYmUgcmVjYWxjdWxhdGVkCi0JICogc2luY2UgdGhlIGxlbmd0aCBjb3VsZCBoYXZlIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgZGVmcmFnbWVudGF0aW9uLgotCSAqCi0JICogV2UgYWxzbyBkZWNyZWFzZSB0aGUgVFRMIHRvIG1pdGlnYXRlIHBvdGVudGlhbCBsb29wcyBiZXR3ZWVuIHR3bwotCSAqIGhvc3RzLgorCSAqIElmIHdlIGFyZSBpbiBQUkVST1VUSU5HL0lOUFVULCBkZWNyZWFzZSB0aGUgVFRMIHRvIG1pdGlnYXRlIHBvdGVudGlhbAorCSAqIGxvb3BzIGJldHdlZW4gdHdvIGhvc3RzLgogCSAqCiAJICogU2V0ICVJUF9ERiBzbyB0aGF0IHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgbm90aWZpZWQgb2YgYSBwb3RlbnRpYWxseQogCSAqIGRlY3JlYXNlZCBNVFUgb24gdGhlIGNsb25lIHJvdXRlLiBJUHY2IGRvZXMgdGhpcyB0b28uCisJICoKKwkgKiBJUCBoZWFkZXIgY2hlY2tzdW0gd2lsbCBiZSByZWNhbGN1bGF0ZWQgYXQgaXBfbG9jYWxfb3V0LgogCSAqLwogCWlwaCA9IGlwX2hkcihza2IpOwogCWlwaC0+ZnJhZ19vZmYgfD0gaHRvbnMoSVBfREYpOwogCWlmIChob29rbnVtID09IE5GX0lORVRfUFJFX1JPVVRJTkcgfHwKIAkgICAgaG9va251bSA9PSBORl9JTkVUX0xPQ0FMX0lOKQogCQktLWlwaC0+dHRsOwotCWlwX3NlbmRfY2hlY2soaXBoKTsKIAogCWlmIChuZl9kdXBfaXB2NF9yb3V0ZShuZXQsIHNrYiwgZ3csIG9pZikpIHsKIAkJX190aGlzX2NwdV93cml0ZShuZl9za2JfZHVwbGljYXRlZCwgdHJ1ZSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbG9nX2FycC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19hcnAuYwppbmRleCBlN2FkOTUwLi5iMjQ3OTVlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbG9nX2FycC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9sb2dfYXJwLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAkudSA9IHsKIAkJLmxvZyA9IHsKIAkJCS5sZXZlbAkgID0gTE9HTEVWRUxfTk9USUNFLAotCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX01BU0ssCisJCQkubG9nZmxhZ3MgPSBORl9MT0dfREVGQVVMVF9NQVNLLAogCQl9LAogCX0sCiB9OwpAQCAtNjIsNyArNjIsNyBAQAogCS8qIElmIGl0J3MgZm9yIEV0aGVybmV0IGFuZCB0aGUgbGVuZ3RocyBhcmUgT0ssIHRoZW4gbG9nIHRoZSBBUlAKIAkgKiBwYXlsb2FkLgogCSAqLwotCWlmIChhaC0+YXJfaHJkICE9IGh0b25zKDEpIHx8CisJaWYgKGFoLT5hcl9ocmQgIT0gaHRvbnMoQVJQSFJEX0VUSEVSKSB8fAogCSAgICBhaC0+YXJfaGxuICE9IEVUSF9BTEVOIHx8CiAJICAgIGFoLT5hcl9wbG4gIT0gc2l6ZW9mKF9fYmUzMikpCiAJCXJldHVybjsKQEAgLTExMSw4ICsxMTEsNyBAQAogCiBzdGF0aWMgaW50IF9fbmV0X2luaXQgbmZfbG9nX2FycF9uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0JbmZfbG9nX3NldChuZXQsIE5GUFJPVE9fQVJQLCAmbmZfYXJwX2xvZ2dlcik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIG5mX2xvZ19zZXQobmV0LCBORlBST1RPX0FSUCwgJm5mX2FycF9sb2dnZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX25ldF9leGl0IG5mX2xvZ19hcnBfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbG9nX2lwdjQuYwppbmRleCAwNzZhYWRkLi44NTY2NDg5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbG9nX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbG9nX2lwdjQuYwpAQCAtMjksNyArMjksNyBAQAogCS51ID0gewogCQkubG9nID0gewogCQkJLmxldmVsCSAgPSBMT0dMRVZFTF9OT1RJQ0UsCi0JCQkubG9nZmxhZ3MgPSBORl9MT0dfTUFTSywKKwkJCS5sb2dmbGFncyA9IE5GX0xPR19ERUZBVUxUX01BU0ssCiAJCX0sCiAJfSwKIH07CkBAIC00Niw3ICs0Niw3IEBACiAJaWYgKGluZm8tPnR5cGUgPT0gTkZfTE9HX1RZUEVfTE9HKQogCQlsb2dmbGFncyA9IGluZm8tPnUubG9nLmxvZ2ZsYWdzOwogCWVsc2UKLQkJbG9nZmxhZ3MgPSBORl9MT0dfTUFTSzsKKwkJbG9nZmxhZ3MgPSBORl9MT0dfREVGQVVMVF9NQVNLOwogCiAJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBpcGhvZmYsIHNpemVvZihfaXBoKSwgJl9pcGgpOwogCWlmIChpaCA9PSBOVUxMKSB7CkBAIC03Niw3ICs3Niw3IEBACiAJaWYgKG50b2hzKGloLT5mcmFnX29mZikgJiBJUF9PRkZTRVQpCiAJCW5mX2xvZ19idWZfYWRkKG0sICJGUkFHOiV1ICIsIG50b2hzKGloLT5mcmFnX29mZikgJiBJUF9PRkZTRVQpOwogCi0JaWYgKChsb2dmbGFncyAmIFhUX0xPR19JUE9QVCkgJiYKKwlpZiAoKGxvZ2ZsYWdzICYgTkZfTE9HX0lQT1BUKSAmJgogCSAgICBpaC0+aWhsICogNCA+IHNpemVvZihzdHJ1Y3QgaXBoZHIpKSB7CiAJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm9wOwogCQl1bnNpZ25lZCBjaGFyIF9vcHRbNCAqIDE1IC0gc2l6ZW9mKHN0cnVjdCBpcGhkcildOwpAQCAtMjUwLDcgKzI1MCw3IEBACiAJfQogCiAJLyogTWF4IGxlbmd0aDogMTUgIlVJRD00Mjk0OTY3Mjk1ICIgKi8KLQlpZiAoKGxvZ2ZsYWdzICYgWFRfTE9HX1VJRCkgJiYgIWlwaG9mZikKKwlpZiAoKGxvZ2ZsYWdzICYgTkZfTE9HX1VJRCkgJiYgIWlwaG9mZikKIAkJbmZfbG9nX2R1bXBfc2tfdWlkX2dpZChtLCBza2ItPnNrKTsKIAogCS8qIE1heCBsZW5ndGg6IDE2ICJNQVJLPTB4RkZGRkZGRkYgIiAqLwpAQCAtMjgyLDcgKzI4Miw3IEBACiAJaWYgKGluZm8tPnR5cGUgPT0gTkZfTE9HX1RZUEVfTE9HKQogCQlsb2dmbGFncyA9IGluZm8tPnUubG9nLmxvZ2ZsYWdzOwogCi0JaWYgKCEobG9nZmxhZ3MgJiBYVF9MT0dfTUFDREVDT0RFKSkKKwlpZiAoIShsb2dmbGFncyAmIE5GX0xPR19NQUNERUNPREUpKQogCQlnb3RvIGZhbGxiYWNrOwogCiAJc3dpdGNoIChkZXYtPnR5cGUpIHsKQEAgLTM0Nyw4ICszNDcsNyBAQAogCiBzdGF0aWMgaW50IF9fbmV0X2luaXQgbmZfbG9nX2lwdjRfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQogewotCW5mX2xvZ19zZXQobmV0LCBORlBST1RPX0lQVjQsICZuZl9pcF9sb2dnZXIpOwotCXJldHVybiAwOworCXJldHVybiBuZl9sb2dfc2V0KG5ldCwgTkZQUk9UT19JUFY0LCAmbmZfaXBfbG9nZ2VyKTsKIH0KIAogc3RhdGljIHZvaWQgX19uZXRfZXhpdCBuZl9sb2dfaXB2NF9uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2dyZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19ncmUuYwppbmRleCA5NDE0OTIzLi5lZGYwNTAwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2dyZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZ3JlLmMKQEAgLTg4LDggKzg4LDggQEAKIAkgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKIAkgICAgICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKIHsKLQljb25zdCBzdHJ1Y3QgZ3JlX2hkciAqZ3JlaDsKLQlzdHJ1Y3QgZ3JlX2hkcl9wcHRwICpwZ3JlaDsKKwljb25zdCBzdHJ1Y3QgZ3JlX2Jhc2VfaGRyICpncmVoOworCXN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgKnBncmVoOwogCiAJLyogcGdyZWggaW5jbHVkZXMgdHdvIG9wdGlvbmFsIDMyYml0IGZpZWxkcyB3aGljaCBhcmUgbm90IHJlcXVpcmVkCiAJICogdG8gYmUgdGhlcmUuICBUaGF0J3Mgd2hlcmUgdGhlIG1hZ2ljICc4JyBjb21lcyBmcm9tICovCkBAIC05NywxOCArOTcsMTkgQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJZ3JlaCA9ICh2b2lkICopc2tiLT5kYXRhICsgaGRyb2ZmOwotCXBncmVoID0gKHN0cnVjdCBncmVfaGRyX3BwdHAgKilncmVoOworCXBncmVoID0gKHN0cnVjdCBwcHRwX2dyZV9oZWFkZXIgKilncmVoOwogCiAJLyogd2Ugb25seSBoYXZlIGRlc3RpbmF0aW9uIG1hbmlwIG9mIGEgcGFja2V0LCBzaW5jZSAnc291cmNlIGtleScKIAkgKiBpcyBub3QgcHJlc2VudCBpbiB0aGUgcGFja2V0IGl0c2VsZiAqLwogCWlmIChtYW5pcHR5cGUgIT0gTkZfTkFUX01BTklQX0RTVCkKIAkJcmV0dXJuIHRydWU7Ci0Jc3dpdGNoIChncmVoLT52ZXJzaW9uKSB7Ci0JY2FzZSBHUkVfVkVSU0lPTl8xNzAxOgorCisJc3dpdGNoIChncmVoLT5mbGFncyAmIEdSRV9WRVJTSU9OKSB7CisJY2FzZSBHUkVfVkVSU0lPTl8wOgogCQkvKiBXZSBkbyBub3QgY3VycmVudGx5IE5BVCBhbnkgR1JFdjAgcGFja2V0cy4KIAkJICogVHJ5IHRvIGJlaGF2ZSBsaWtlICJuZl9uYXRfcHJvdG9fdW5rbm93biIgKi8KIAkJYnJlYWs7Ci0JY2FzZSBHUkVfVkVSU0lPTl9QUFRQOgorCWNhc2UgR1JFX1ZFUlNJT05fMToKIAkJcHJfZGVidWcoImNhbGxfaWQgLT4gMHglMDR4XG4iLCBudG9ocyh0dXBsZS0+ZHN0LnUuZ3JlLmtleSkpOwogCQlwZ3JlaC0+Y2FsbF9pZCA9IHR1cGxlLT5kc3QudS5ncmUua2V5OwogCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl90YWJsZXNfYXJwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FycC5jCmluZGV4IGNkODRkNDIuLjgwNWM4ZGQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl90YWJsZXNfYXJwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX3RhYmxlc19hcnAuYwpAQCAtMjEsNyArMjEsNyBAQAogewogCXN0cnVjdCBuZnRfcGt0aW5mbyBwa3Q7CiAKLQluZnRfc2V0X3BrdGluZm8oJnBrdCwgc2tiLCBzdGF0ZSk7CisJbmZ0X3NldF9wa3RpbmZvX3Vuc3BlYygmcGt0LCBza2IsIHN0YXRlKTsKIAogCXJldHVybiBuZnRfZG9fY2hhaW4oJnBrdCwgcHJpdik7CiB9CkBAIC04MCw3ICs4MCwxMCBAQAogewogCWludCByZXQ7CiAKLQluZnRfcmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2FycCk7CisJcmV0ID0gbmZ0X3JlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9hcnApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJcmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmbmZfdGFibGVzX2FycF9uZXRfb3BzKTsKIAlpZiAocmV0IDwgMCkKIAkJbmZ0X3VucmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2FycCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2NC5jCmluZGV4IGU0NGJhM2IuLjI4NDBhMjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2NC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2NC5jCkBAIC0xMDMsNyArMTAzLDEwIEBACiB7CiAJaW50IHJldDsKIAotCW5mdF9yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfaXB2NCk7CisJcmV0ID0gbmZ0X3JlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9pcHY0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mX3RhYmxlc19pcHY0X25ldF9vcHMpOwogCWlmIChyZXQgPCAwKQogCQluZnRfdW5yZWdpc3Rlcl9jaGFpbl90eXBlKCZmaWx0ZXJfaXB2NCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2NC5jCmluZGV4IDIzNzViMGEuLjMwNDkzYmUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2NC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2NC5jCkBAIC0zMSw2ICszMSw3IEBACiAJX19iZTMyIHNhZGRyLCBkYWRkcjsKIAl1X2ludDhfdCB0b3M7CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGg7CisJaW50IGVycjsKIAogCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLwogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpIHx8CkBAIC00NiwxNSArNDcsMTcgQEAKIAl0b3MgPSBpcGgtPnRvczsKIAogCXJldCA9IG5mdF9kb19jaGFpbigmcGt0LCBwcml2KTsKLQlpZiAocmV0ICE9IE5GX0RST1AgJiYgcmV0ICE9IE5GX1FVRVVFKSB7CisJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4pIHsKIAkJaXBoID0gaXBfaGRyKHNrYik7CiAKIAkJaWYgKGlwaC0+c2FkZHIgIT0gc2FkZHIgfHwKIAkJICAgIGlwaC0+ZGFkZHIgIT0gZGFkZHIgfHwKIAkJICAgIHNrYi0+bWFyayAhPSBtYXJrIHx8Ci0JCSAgICBpcGgtPnRvcyAhPSB0b3MpCi0JCQlpZiAoaXBfcm91dGVfbWVfaGFyZGVyKHN0YXRlLT5uZXQsIHNrYiwgUlROX1VOU1BFQykpCi0JCQkJcmV0ID0gTkZfRFJPUDsKKwkJICAgIGlwaC0+dG9zICE9IHRvcykgeworCQkJZXJyID0gaXBfcm91dGVfbWVfaGFyZGVyKHN0YXRlLT5uZXQsIHNrYiwgUlROX1VOU1BFQyk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXQgPSBORl9EUk9QX0VSUihlcnIpOworCQl9CiAJfQogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY0LmMKaW5kZXggYzI0ZjQxYy4uMmMyNTUzYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2NC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjQuYwpAQCAtNDYsNiArNDYsNyBAQAogCS5ldmFsCQk9IG5mdF9yZWplY3RfaXB2NF9ldmFsLAogCS5pbml0CQk9IG5mdF9yZWplY3RfaW5pdCwKIAkuZHVtcAkJPSBuZnRfcmVqZWN0X2R1bXAsCisJLnZhbGlkYXRlCT0gbmZ0X3JlamVjdF92YWxpZGF0ZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfcmVqZWN0X2lwdjRfdHlwZSBfX3JlYWRfbW9zdGx5ID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcHJvYy5jIGIvbmV0L2lwdjQvcHJvYy5jCmluZGV4IDlmNjY1YjYuLjcxNDNjYTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3Byb2MuYworKysgYi9uZXQvaXB2NC9wcm9jLmMKQEAgLTQ2LDYgKzQ2LDggQEAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9yYXcuaD4KIAorI2RlZmluZSBUQ1BVRFBfTUlCX01BWCBtYXhfdCh1MzIsIFVEUF9NSUJfTUFYLCBUQ1BfTUlCX01BWCkKKwogLyoKICAqCVJlcG9ydCBzb2NrZXQgYWxsb2NhdGlvbiBzdGF0aXN0aWNzIFttZWFAdXR1LmZpXQogICovCkBAIC0yNTcsNiArMjU5LDcgQEAKIAlTTk1QX01JQl9JVEVNKCJUQ1BTcHVyaW91c1JUT3MiLCBMSU5VWF9NSUJfVENQU1BVUklPVVNSVE9TKSwKIAlTTk1QX01JQl9JVEVNKCJUQ1BNRDVOb3RGb3VuZCIsIExJTlVYX01JQl9UQ1BNRDVOT1RGT1VORCksCiAJU05NUF9NSUJfSVRFTSgiVENQTUQ1VW5leHBlY3RlZCIsIExJTlVYX01JQl9UQ1BNRDVVTkVYUEVDVEVEKSwKKwlTTk1QX01JQl9JVEVNKCJUQ1BNRDVGYWlsdXJlIiwgTElOVVhfTUlCX1RDUE1ENUZBSUxVUkUpLAogCVNOTVBfTUlCX0lURU0oIlRDUFNhY2tTaGlmdGVkIiwgTElOVVhfTUlCX1NBQ0tTSElGVEVEKSwKIAlTTk1QX01JQl9JVEVNKCJUQ1BTYWNrTWVyZ2VkIiwgTElOVVhfTUlCX1NBQ0tNRVJHRUQpLAogCVNOTVBfTUlCX0lURU0oIlRDUFNhY2tTaGlmdEZhbGxiYWNrIiwgTElOVVhfTUlCX1NBQ0tTSElGVEZBTExCQUNLKSwKQEAgLTM1NSwyMiArMzU4LDIyIEBACiAJYXRvbWljX2xvbmdfdCAqcHRyID0gbmV0LT5taWIuaWNtcG1zZ19zdGF0aXN0aWNzLT5taWJzOwogCiAJc2VxX3B1dHMoc2VxLCAiXG5JY21wOiBJbk1zZ3MgSW5FcnJvcnMgSW5Dc3VtRXJyb3JzIik7Ci0JZm9yIChpID0gMDsgaWNtcG1pYm1hcFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwlmb3IgKGkgPSAwOyBpY21wbWlibWFwW2ldLm5hbWU7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgSW4lcyIsIGljbXBtaWJtYXBbaV0ubmFtZSk7CiAJc2VxX3B1dHMoc2VxLCAiIE91dE1zZ3MgT3V0RXJyb3JzIik7Ci0JZm9yIChpID0gMDsgaWNtcG1pYm1hcFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKwlmb3IgKGkgPSAwOyBpY21wbWlibWFwW2ldLm5hbWU7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgT3V0JXMiLCBpY21wbWlibWFwW2ldLm5hbWUpOwogCXNlcV9wcmludGYoc2VxLCAiXG5JY21wOiAlbHUgJWx1ICVsdSIsCiAJCXNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX0lOTVNHUyksCiAJCXNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX0lORVJST1JTKSwKIAkJc25tcF9mb2xkX2ZpZWxkKG5ldC0+bWliLmljbXBfc3RhdGlzdGljcywgSUNNUF9NSUJfQ1NVTUVSUk9SUykpOwotCWZvciAoaSA9IDA7IGljbXBtaWJtYXBbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJZm9yIChpID0gMDsgaWNtcG1pYm1hcFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCiAJCQkgICBhdG9taWNfbG9uZ19yZWFkKHB0ciArIGljbXBtaWJtYXBbaV0uaW5kZXgpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAlbHUgJWx1IiwKIAkJc25tcF9mb2xkX2ZpZWxkKG5ldC0+bWliLmljbXBfc3RhdGlzdGljcywgSUNNUF9NSUJfT1VUTVNHUyksCiAJCXNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX09VVEVSUk9SUykpOwotCWZvciAoaSA9IDA7IGljbXBtaWJtYXBbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJZm9yIChpID0gMDsgaWNtcG1pYm1hcFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCiAJCQkgICBhdG9taWNfbG9uZ19yZWFkKHB0ciArIChpY21wbWlibWFwW2ldLmluZGV4IHwgMHgxMDApKSk7CiB9CkBAIC0zNzgsMTQgKzM4MSwxNiBAQAogLyoKICAqCUNhbGxlZCBmcm9tIHRoZSBQUk9DZnMgbW9kdWxlLiBUaGlzIG91dHB1dHMgL3Byb2MvbmV0L3NubXAuCiAgKi8KLXN0YXRpYyBpbnQgc25tcF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3N0YXRpYyBpbnQgc25tcF9zZXFfc2hvd19pcHN0YXRzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewotCWludCBpOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcS0+cHJpdmF0ZTsKKwl1NjQgYnVmZjY0W0lQU1RBVFNfTUlCX01BWF07CisJaW50IGk7CisKKwltZW1zZXQoYnVmZjY0LCAwLCBJUFNUQVRTX01JQl9NQVggKiBzaXplb2YodTY0KSk7CiAKIAlzZXFfcHV0cyhzZXEsICJJcDogRm9yd2FyZGluZyBEZWZhdWx0VFRMIik7Ci0KLQlmb3IgKGkgPSAwOyBzbm1wNF9pcHN0YXRzX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJZm9yIChpID0gMDsgc25tcDRfaXBzdGF0c19saXN0W2ldLm5hbWU7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF9pcHN0YXRzX2xpc3RbaV0ubmFtZSk7CiAKIAlzZXFfcHJpbnRmKHNlcSwgIlxuSXA6ICVkICVkIiwKQEAgLTM5Myw1NCArMzk4LDc0IEBACiAJCSAgIG5ldC0+aXB2NC5zeXNjdGxfaXBfZGVmYXVsdF90dGwpOwogCiAJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpcHN0YXRzX21pYiwgbWlicykgIT0gMCk7Ci0JZm9yIChpID0gMDsgc25tcDRfaXBzdGF0c19saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotCQlzZXFfcHJpbnRmKHNlcSwgIiAlbGx1IiwKLQkJCSAgIHNubXBfZm9sZF9maWVsZDY0KG5ldC0+bWliLmlwX3N0YXRpc3RpY3MsCi0JCQkJCSAgICAgc25tcDRfaXBzdGF0c19saXN0W2ldLmVudHJ5LAotCQkJCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpcHN0YXRzX21pYiwgc3luY3ApKSk7CisJc25tcF9nZXRfY3B1X2ZpZWxkNjRfYmF0Y2goYnVmZjY0LCBzbm1wNF9pcHN0YXRzX2xpc3QsCisJCQkJICAgbmV0LT5taWIuaXBfc3RhdGlzdGljcywKKwkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgaXBzdGF0c19taWIsIHN5bmNwKSk7CisJZm9yIChpID0gMDsgc25tcDRfaXBzdGF0c19saXN0W2ldLm5hbWU7IGkrKykKKwkJc2VxX3ByaW50ZihzZXEsICIgJWxsdSIsIGJ1ZmY2NFtpXSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbm1wX3NlcV9zaG93X3RjcF91ZHAoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJdW5zaWduZWQgbG9uZyBidWZmW1RDUFVEUF9NSUJfTUFYXTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXEtPnByaXZhdGU7CisJaW50IGk7CisKKwltZW1zZXQoYnVmZiwgMCwgVENQVURQX01JQl9NQVggKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworCisJc2VxX3B1dHMoc2VxLCAiXG5UY3A6Iik7CisJZm9yIChpID0gMDsgc25tcDRfdGNwX2xpc3RbaV0ubmFtZTsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIHNubXA0X3RjcF9saXN0W2ldLm5hbWUpOworCisJc2VxX3B1dHMoc2VxLCAiXG5UY3A6Iik7CisJc25tcF9nZXRfY3B1X2ZpZWxkX2JhdGNoKGJ1ZmYsIHNubXA0X3RjcF9saXN0LAorCQkJCSBuZXQtPm1pYi50Y3Bfc3RhdGlzdGljcyk7CisJZm9yIChpID0gMDsgc25tcDRfdGNwX2xpc3RbaV0ubmFtZTsgaSsrKSB7CisJCS8qIE1heENvbm4gZmllbGQgaXMgc2lnbmVkLCBSRkMgMjAxMiAqLworCQlpZiAoc25tcDRfdGNwX2xpc3RbaV0uZW50cnkgPT0gVENQX01JQl9NQVhDT05OKQorCQkJc2VxX3ByaW50ZihzZXEsICIgJWxkIiwgYnVmZltpXSk7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsIGJ1ZmZbaV0pOworCX0KKworCW1lbXNldChidWZmLCAwLCBUQ1BVRFBfTUlCX01BWCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKwlzbm1wX2dldF9jcHVfZmllbGRfYmF0Y2goYnVmZiwgc25tcDRfdWRwX2xpc3QsCisJCQkJIG5ldC0+bWliLnVkcF9zdGF0aXN0aWNzKTsKKwlzZXFfcHV0cyhzZXEsICJcblVkcDoiKTsKKwlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lOyBpKyspCisJCXNlcV9wcmludGYoc2VxLCAiICVzIiwgc25tcDRfdWRwX2xpc3RbaV0ubmFtZSk7CisJc2VxX3B1dHMoc2VxLCAiXG5VZHA6Iik7CisJZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZTsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLCBidWZmW2ldKTsKKworCW1lbXNldChidWZmLCAwLCBUQ1BVRFBfTUlCX01BWCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKwkvKiB0aGUgVURQIGFuZCBVRFAtTGl0ZSBNSUJzIGFyZSB0aGUgc2FtZSAqLworCXNlcV9wdXRzKHNlcSwgIlxuVWRwTGl0ZToiKTsKKwlzbm1wX2dldF9jcHVfZmllbGRfYmF0Y2goYnVmZiwgc25tcDRfdWRwX2xpc3QsCisJCQkJIG5ldC0+bWliLnVkcGxpdGVfc3RhdGlzdGljcyk7CisJZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZTsgaSsrKQorCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIHNubXA0X3VkcF9saXN0W2ldLm5hbWUpOworCXNlcV9wdXRzKHNlcSwgIlxuVWRwTGl0ZToiKTsKKwlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lOyBpKyspCisJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsIGJ1ZmZbaV0pOworCisJc2VxX3B1dGMoc2VxLCAnXG4nKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbm1wX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXNubXBfc2VxX3Nob3dfaXBzdGF0cyhzZXEsIHYpOwogCiAJaWNtcF9wdXQoc2VxKTsJLyogUkZDIDIwMTEgY29tcGF0aWJpbGl0eSAqLwogCWljbXBtc2dfcHV0KHNlcSk7CiAKLQlzZXFfcHV0cyhzZXEsICJcblRjcDoiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF90Y3BfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKLQkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF90Y3BfbGlzdFtpXS5uYW1lKTsKKwlzbm1wX3NlcV9zaG93X3RjcF91ZHAoc2VxLCB2KTsKIAotCXNlcV9wdXRzKHNlcSwgIlxuVGNwOiIpOwotCWZvciAoaSA9IDA7IHNubXA0X3RjcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7Ci0JCS8qIE1heENvbm4gZmllbGQgaXMgc2lnbmVkLCBSRkMgMjAxMiAqLwotCQlpZiAoc25tcDRfdGNwX2xpc3RbaV0uZW50cnkgPT0gVENQX01JQl9NQVhDT05OKQotCQkJc2VxX3ByaW50ZihzZXEsICIgJWxkIiwKLQkJCQkgICBzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIudGNwX3N0YXRpc3RpY3MsCi0JCQkJCQkgICBzbm1wNF90Y3BfbGlzdFtpXS5lbnRyeSkpOwotCQllbHNlCi0JCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAotCQkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPm1pYi50Y3Bfc3RhdGlzdGljcywKLQkJCQkJCSAgIHNubXA0X3RjcF9saXN0W2ldLmVudHJ5KSk7Ci0JfQotCi0Jc2VxX3B1dHMoc2VxLCAiXG5VZHA6Iik7Ci0JZm9yIChpID0gMDsgc25tcDRfdWRwX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCi0JCXNlcV9wcmludGYoc2VxLCAiICVzIiwgc25tcDRfdWRwX2xpc3RbaV0ubmFtZSk7Ci0KLQlzZXFfcHV0cyhzZXEsICJcblVkcDoiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF91ZHBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKLQkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKLQkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPm1pYi51ZHBfc3RhdGlzdGljcywKLQkJCQkJICAgc25tcDRfdWRwX2xpc3RbaV0uZW50cnkpKTsKLQotCS8qIHRoZSBVRFAgYW5kIFVEUC1MaXRlIE1JQnMgYXJlIHRoZSBzYW1lICovCi0Jc2VxX3B1dHMoc2VxLCAiXG5VZHBMaXRlOiIpOwotCWZvciAoaSA9IDA7IHNubXA0X3VkcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotCQlzZXFfcHJpbnRmKHNlcSwgIiAlcyIsIHNubXA0X3VkcF9saXN0W2ldLm5hbWUpOwotCi0Jc2VxX3B1dHMoc2VxLCAiXG5VZHBMaXRlOiIpOwotCWZvciAoaSA9IDA7IHNubXA0X3VkcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQotCQlzZXFfcHJpbnRmKHNlcSwgIiAlbHUiLAotCQkJICAgc25tcF9mb2xkX2ZpZWxkKG5ldC0+bWliLnVkcGxpdGVfc3RhdGlzdGljcywKLQkJCQkJICAgc25tcDRfdWRwX2xpc3RbaV0uZW50cnkpKTsKLQotCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ2OCwyMSArNDkzLDIxIEBACiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxLT5wcml2YXRlOwogCiAJc2VxX3B1dHMoc2VxLCAiVGNwRXh0OiIpOwotCWZvciAoaSA9IDA7IHNubXA0X25ldF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCWZvciAoaSA9IDA7IHNubXA0X25ldF9saXN0W2ldLm5hbWU7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJXMiLCBzbm1wNF9uZXRfbGlzdFtpXS5uYW1lKTsKIAogCXNlcV9wdXRzKHNlcSwgIlxuVGNwRXh0OiIpOwotCWZvciAoaSA9IDA7IHNubXA0X25ldF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCWZvciAoaSA9IDA7IHNubXA0X25ldF9saXN0W2ldLm5hbWU7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJWx1IiwKIAkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPm1pYi5uZXRfc3RhdGlzdGljcywKIAkJCQkJICAgc25tcDRfbmV0X2xpc3RbaV0uZW50cnkpKTsKIAogCXNlcV9wdXRzKHNlcSwgIlxuSXBFeHQ6Iik7Ci0JZm9yIChpID0gMDsgc25tcDRfaXBleHRzdGF0c19saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCWZvciAoaSA9IDA7IHNubXA0X2lwZXh0c3RhdHNfbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVzIiwgc25tcDRfaXBleHRzdGF0c19saXN0W2ldLm5hbWUpOwogCiAJc2VxX3B1dHMoc2VxLCAiXG5JcEV4dDoiKTsKLQlmb3IgKGkgPSAwOyBzbm1wNF9pcGV4dHN0YXRzX2xpc3RbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisJZm9yIChpID0gMDsgc25tcDRfaXBleHRzdGF0c19saXN0W2ldLm5hbWU7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIgJWxsdSIsCiAJCQkgICBzbm1wX2ZvbGRfZmllbGQ2NChuZXQtPm1pYi5pcF9zdGF0aXN0aWNzLAogCQkJCQkgICAgIHNubXA0X2lwZXh0c3RhdHNfbGlzdFtpXS5lbnRyeSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Jhdy5jIGIvbmV0L2lwdjQvcmF3LmMKaW5kZXggNDM4ZjUwYy4uOTBhODVjOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcmF3LmMKKysrIGIvbmV0L2lwdjQvcmF3LmMKQEAgLTYwNiwxMiArNjA2LDYgQEAKIAkJCSAgICAoaW5ldC0+aGRyaW5jbCA/IEZMT1dJX0ZMQUdfS05PV05fTkggOiAwKSwKIAkJCSAgIGRhZGRyLCBzYWRkciwgMCwgMCk7CiAKLQlpZiAoIXNhZGRyICYmIGlwYy5vaWYpIHsKLQkJZXJyID0gbDNtZGV2X2dldF9zYWRkcihuZXQsIGlwYy5vaWYsICZmbDQpOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZG9uZTsKLQl9Ci0KIAlpZiAoIWluZXQtPmhkcmluY2wpIHsKIAkJcmZ2Lm1zZyA9IG1zZzsKIAkJcmZ2LmhsZW4gPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcm91dGUuYyBiL25ldC9pcHY0L3JvdXRlLmMKaW5kZXggYTFmMjgzMC4uZjJiZTY4OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcm91dGUuYworKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC00NzYsMTIgKzQ3NiwxOCBAQAogCWF0b21pY190ICpwX2lkID0gaXBfaWRlbnRzICsgaGFzaCAlIElQX0lERU5UU19TWjsKIAl1MzIgb2xkID0gQUNDRVNTX09OQ0UoKnBfdHN0YW1wKTsKIAl1MzIgbm93ID0gKHUzMilqaWZmaWVzOwotCXUzMiBkZWx0YSA9IDA7CisJdTMyIG5ldywgZGVsdGEgPSAwOwogCiAJaWYgKG9sZCAhPSBub3cgJiYgY21weGNoZyhwX3RzdGFtcCwgb2xkLCBub3cpID09IG9sZCkKIAkJZGVsdGEgPSBwcmFuZG9tX3UzMl9tYXgobm93IC0gb2xkKTsKIAotCXJldHVybiBhdG9taWNfYWRkX3JldHVybihzZWdzICsgZGVsdGEsIHBfaWQpIC0gc2VnczsKKwkvKiBEbyBub3QgdXNlIGF0b21pY19hZGRfcmV0dXJuKCkgYXMgaXQgbWFrZXMgVUJTQU4gdW5oYXBweSAqLworCWRvIHsKKwkJb2xkID0gKHUzMilhdG9taWNfcmVhZChwX2lkKTsKKwkJbmV3ID0gb2xkICsgZGVsdGEgKyBzZWdzOworCX0gd2hpbGUgKGF0b21pY19jbXB4Y2hnKHBfaWQsIG9sZCwgbmV3KSAhPSBvbGQpOworCisJcmV0dXJuIG5ldyAtIHNlZ3M7CiB9CiBFWFBPUlRfU1lNQk9MKGlwX2lkZW50c19yZXNlcnZlKTsKIApAQCAtMTI0Niw3ICsxMjUyLDkgQEAKIAkJCW10dSA9IDU3NjsKIAl9CiAKLQlyZXR1cm4gbWluX3QodW5zaWduZWQgaW50LCBtdHUsIElQX01BWF9NVFUpOworCW10dSA9IG1pbl90KHVuc2lnbmVkIGludCwgbXR1LCBJUF9NQVhfTVRVKTsKKworCXJldHVybiBtdHUgLSBsd3R1bm5lbF9oZWFkcm9vbShkc3QtPmx3dHN0YXRlLCBtdHUpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpYl9uaF9leGNlcHRpb24gKmZpbmRfZXhjZXB0aW9uKHN0cnVjdCBmaWJfbmggKm5oLCBfX2JlMzIgZGFkZHIpCkBAIC0xODI5LDcgKzE4MzcsNyBAQAogCSAqCU5vdyB3ZSBhcmUgcmVhZHkgdG8gcm91dGUgcGFja2V0LgogCSAqLwogCWZsNC5mbG93aTRfb2lmID0gMDsKLQlmbDQuZmxvd2k0X2lpZiA9IGwzbWRldl9maWJfb2lmX3JjdShkZXYpOworCWZsNC5mbG93aTRfaWlmID0gZGV2LT5pZmluZGV4OwogCWZsNC5mbG93aTRfbWFyayA9IHNrYi0+bWFyazsKIAlmbDQuZmxvd2k0X3RvcyA9IHRvczsKIAlmbDQuZmxvd2k0X3Njb3BlID0gUlRfU0NPUEVfVU5JVkVSU0U7CkBAIC0yMDE2LDcgKzIwMjQsOSBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCWlmIChsaWtlbHkoIUlOX0RFVl9ST1VURV9MT0NBTE5FVChpbl9kZXYpKSkKLQkJaWYgKGlwdjRfaXNfbG9vcGJhY2soZmw0LT5zYWRkcikgJiYgIShkZXZfb3V0LT5mbGFncyAmIElGRl9MT09QQkFDSykpCisJCWlmIChpcHY0X2lzX2xvb3BiYWNrKGZsNC0+c2FkZHIpICYmCisJCSAgICAhKGRldl9vdXQtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSAmJgorCQkgICAgIW5ldGlmX2lzX2wzX21hc3RlcihkZXZfb3V0KSkKIAkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJaWYgKGlwdjRfaXNfbGJjYXN0KGZsNC0+ZGFkZHIpKQpAQCAtMjE0Niw3ICsyMTU2LDYgQEAKIAl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwogCXN0cnVjdCBmaWJfcmVzdWx0IHJlczsKIAlzdHJ1Y3QgcnRhYmxlICpydGg7Ci0JaW50IG1hc3Rlcl9pZHg7CiAJaW50IG9yaWdfb2lmOwogCWludCBlcnIgPSAtRU5FVFVOUkVBQ0g7CiAKQEAgLTIxNTYsOSArMjE2NSw2IEBACiAKIAlvcmlnX29pZiA9IGZsNC0+Zmxvd2k0X29pZjsKIAotCW1hc3Rlcl9pZHggPSBsM21kZXZfbWFzdGVyX2lmaW5kZXhfYnlfaW5kZXgobmV0LCBmbDQtPmZsb3dpNF9vaWYpOwotCWlmIChtYXN0ZXJfaWR4KQotCQlmbDQtPmZsb3dpNF9vaWYgPSBtYXN0ZXJfaWR4OwogCWZsNC0+Zmxvd2k0X2lpZiA9IExPT1BCQUNLX0lGSU5ERVg7CiAJZmw0LT5mbG93aTRfdG9zID0gdG9zICYgSVBUT1NfUlRfTUFTSzsKIAlmbDQtPmZsb3dpNF9zY29wZSA9ICgodG9zICYgUlRPX09OTElOSykgPwpAQCAtMjI0MiwxMCArMjI0OCw2IEBACiAJCQkJZmw0LT5zYWRkciA9IGluZXRfc2VsZWN0X2FkZHIoZGV2X291dCwgMCwKIAkJCQkJCQkgICAgICBSVF9TQ09QRV9IT1NUKTsKIAkJfQotCi0JCXJ0aCA9IGwzbWRldl9nZXRfcnRhYmxlKGRldl9vdXQsIGZsNCk7Ci0JCWlmIChydGgpCi0JCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAoIWZsNC0+ZGFkZHIpIHsKQEAgLTIyNjMsOCArMjI2NSw3IEBACiAJaWYgKGVycikgewogCQlyZXMuZmkgPSBOVUxMOwogCQlyZXMudGFibGUgPSBOVUxMOwotCQlpZiAoZmw0LT5mbG93aTRfb2lmICYmCi0JCSAgICAhbmV0aWZfaW5kZXhfaXNfbDNfbWFzdGVyKG5ldCwgZmw0LT5mbG93aTRfb2lmKSkgeworCQlpZiAoZmw0LT5mbG93aTRfb2lmKSB7CiAJCQkvKiBBcHBhcmVudGx5LCByb3V0aW5nIHRhYmxlcyBhcmUgd3JvbmcuIEFzc3VtZSwKIAkJCSAgIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGlzIG9uIGxpbmsuCiAKQEAgLTIzMDAsNyArMjMwMSw5IEBACiAJCQllbHNlCiAJCQkJZmw0LT5zYWRkciA9IGZsNC0+ZGFkZHI7CiAJCX0KLQkJZGV2X291dCA9IG5ldC0+bG9vcGJhY2tfZGV2OworCisJCS8qIEwzIG1hc3RlciBkZXZpY2UgaXMgdGhlIGxvb3BiYWNrIGZvciB0aGF0IGRvbWFpbiAqLworCQlkZXZfb3V0ID0gbDNtZGV2X21hc3Rlcl9kZXZfcmN1KGRldl9vdXQpID8gOiBuZXQtPmxvb3BiYWNrX2RldjsKIAkJZmw0LT5mbG93aTRfb2lmID0gZGV2X291dC0+aWZpbmRleDsKIAkJZmxhZ3MgfD0gUlRDRl9MT0NBTDsKIAkJZ290byBtYWtlX3JvdXRlOwpAQCAtMjQ5Nyw3ICsyNTAwLDggQEAKIAkJICAgIElQVjRfREVWQ09ORl9BTEwobmV0LCBNQ19GT1JXQVJESU5HKSkgewogCQkJaW50IGVyciA9IGlwbXJfZ2V0X3JvdXRlKG5ldCwgc2tiLAogCQkJCQkJIGZsNC0+c2FkZHIsIGZsNC0+ZGFkZHIsCi0JCQkJCQkgciwgbm93YWl0KTsKKwkJCQkJCSByLCBub3dhaXQsIHBvcnRpZCk7CisKIAkJCWlmIChlcnIgPD0gMCkgewogCQkJCWlmICghbm93YWl0KSB7CiAJCQkJCWlmIChlcnIgPT0gMCkKQEAgLTI1NzUsOSArMjU3OSw2IEBACiAJZmw0LmZsb3dpNF9vaWYgPSB0YltSVEFfT0lGXSA/IG5sYV9nZXRfdTMyKHRiW1JUQV9PSUZdKSA6IDA7CiAJZmw0LmZsb3dpNF9tYXJrID0gbWFyazsKIAotCWlmIChuZXRpZl9pbmRleF9pc19sM19tYXN0ZXIobmV0LCBmbDQuZmxvd2k0X29pZikpCi0JCWZsNC5mbG93aTRfZmxhZ3MgPSBGTE9XSV9GTEFHX0wzTURFVl9TUkMgfCBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGOwotCiAJaWYgKGlpZikgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3AuYyBiL25ldC9pcHY0L3RjcC5jCmluZGV4IDAzMmE5NmQuLjI0MTRiN2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcC5jCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC0zODAsMTQgKzM4MCwxNCBAQAogCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAotCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSA9IFJCX1JPT1Q7CiAJdGNwX2luaXRfeG1pdF90aW1lcnMoc2spOwogCXRjcF9wcmVxdWV1ZV9pbml0KHRwKTsKIAlJTklUX0xJU1RfSEVBRCgmdHAtPnRzcV9ub2RlKTsKIAogCWljc2stPmljc2tfcnRvID0gVENQX1RJTUVPVVRfSU5JVDsKIAl0cC0+bWRldl91cyA9IGppZmZpZXNfdG9fdXNlY3MoVENQX1RJTUVPVVRfSU5JVCk7Ci0JdHAtPnJ0dF9taW5bMF0ucnR0ID0gfjBVOworCW1pbm1heF9yZXNldCgmdHAtPnJ0dF9taW4sIHRjcF90aW1lX3N0YW1wLCB+MFUpOwogCiAJLyogU28gbWFueSBUQ1AgaW1wbGVtZW50YXRpb25zIG91dCB0aGVyZSAoaW5jb3JyZWN0bHkpIGNvdW50IHRoZQogCSAqIGluaXRpYWwgU1lOIGZyYW1lIGluIHRoZWlyIGRlbGF5ZWQtQUNLIGFuZCBjb25nZXN0aW9uIGNvbnRyb2wKQEAgLTM5Niw2ICszOTYsOSBAQAogCSAqLwogCXRwLT5zbmRfY3duZCA9IFRDUF9JTklUX0NXTkQ7CiAKKwkvKiBUaGVyZSdzIGEgYnViYmxlIGluIHRoZSBwaXBlIHVudGlsIGF0IGxlYXN0IHRoZSBmaXJzdCBBQ0suICovCisJdHAtPmFwcF9saW1pdGVkID0gfjBVOworCiAJLyogU2VlIGRyYWZ0LXN0ZXZlbnMtdGNwY2Etc3BlYy0wMSBmb3IgZGlzY3Vzc2lvbiBvZiB0aGUKIAkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGVzZSB2YWx1ZXMuCiAJICovCkBAIC02ODgsOCArNjkxLDcgQEAKIAlpbnQgcmV0OwogCiAJcmV0ID0gc2tiX3NwbGljZV9iaXRzKHNrYiwgc2tiLT5zaywgb2Zmc2V0LCB0c3MtPnBpcGUsCi0JCQkgICAgICBtaW4ocmRfZGVzYy0+Y291bnQsIGxlbiksIHRzcy0+ZmxhZ3MsCi0JCQkgICAgICBza2Jfc29ja2V0X3NwbGljZSk7CisJCQkgICAgICBtaW4ocmRfZGVzYy0+Y291bnQsIGxlbiksIHRzcy0+ZmxhZ3MpOwogCWlmIChyZXQgPiAwKQogCQlyZF9kZXNjLT5jb3VudCAtPSByZXQ7CiAJcmV0dXJuIHJldDsKQEAgLTEwMTQsMjMgKzEwMTYsNDAgQEAKIAkJCQkJZmxhZ3MpOwogCiAJbG9ja19zb2NrKHNrKTsKKworCXRjcF9yYXRlX2NoZWNrX2FwcF9saW1pdGVkKHNrKTsgIC8qIGlzIHNlbmRpbmcgYXBwbGljYXRpb24tbGltaXRlZD8gKi8KKwogCXJlcyA9IGRvX3RjcF9zZW5kcGFnZXMoc2ssIHBhZ2UsIG9mZnNldCwgc2l6ZSwgZmxhZ3MpOwogCXJlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIHJlczsKIH0KIEVYUE9SVF9TWU1CT0wodGNwX3NlbmRwYWdlKTsKIAotc3RhdGljIGlubGluZSBpbnQgc2VsZWN0X3NpemUoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBib29sIHNnKQorLyogRG8gbm90IGJvdGhlciB1c2luZyBhIHBhZ2UgZnJhZyBmb3IgdmVyeSBzbWFsbCBmcmFtZXMuCisgKiBCdXQgdXNlIHRoaXMgaGV1cmlzdGljIG9ubHkgZm9yIHRoZSBmaXJzdCBza2IgaW4gd3JpdGUgcXVldWUuCisgKgorICogSGF2aW5nIG5vIHBheWxvYWQgaW4gc2tiLT5oZWFkIGFsbG93cyBiZXR0ZXIgU0FDSyBzaGlmdGluZworICogaW4gdGNwX3NoaWZ0X3NrYl9kYXRhKCksIHJlZHVjaW5nIHNhY2svcmFjayBvdmVyaGVhZCwgYmVjYXVzZQorICogd3JpdGUgcXVldWUgaGFzIGxlc3Mgc2ticy4KKyAqIEVhY2ggc2tiIGNhbiBob2xkIHVwIHRvIE1BWF9TS0JfRlJBR1MgKiAzMktieXRlcywgb3IgfjAuNSBNQi4KKyAqIFRoaXMgYWxzbyBzcGVlZHMgdXAgdHNvX2ZyYWdtZW50KCksIHNpbmNlIGl0IHdvbnQgZmFsbGJhY2sKKyAqIHRvIHRjcF9mcmFnbWVudCgpLgorICovCitzdGF0aWMgaW50IGxpbmVhcl9wYXlsb2FkX3N6KGJvb2wgZmlyc3Rfc2tiKQoreworCWlmIChmaXJzdF9za2IpCisJCXJldHVybiBTS0JfV0lUSF9PVkVSSEVBRCgyMDQ4IC0gTUFYX1RDUF9IRUFERVIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlbGVjdF9zaXplKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgYm9vbCBzZywgYm9vbCBmaXJzdF9za2IpCiB7CiAJY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJaW50IHRtcCA9IHRwLT5tc3NfY2FjaGU7CiAKIAlpZiAoc2cpIHsKIAkJaWYgKHNrX2Nhbl9nc28oc2spKSB7Ci0JCQkvKiBTbWFsbCBmcmFtZXMgd29udCB1c2UgYSBmdWxsIHBhZ2U6Ci0JCQkgKiBQYXlsb2FkIHdpbGwgaW1tZWRpYXRlbHkgZm9sbG93IHRjcCBoZWFkZXIuCi0JCQkgKi8KLQkJCXRtcCA9IFNLQl9XSVRIX09WRVJIRUFEKDIwNDggLSBNQVhfVENQX0hFQURFUik7CisJCQl0bXAgPSBsaW5lYXJfcGF5bG9hZF9zeihmaXJzdF9za2IpOwogCQl9IGVsc2UgewogCQkJaW50IHBnYnJlYWsgPSBTS0JfTUFYX0hFQUQoTUFYX1RDUF9IRUFERVIpOwogCkBAIC0xMTAxLDYgKzExMjAsOCBAQAogCiAJdGltZW8gPSBzb2NrX3NuZHRpbWVvKHNrLCBmbGFncyAmIE1TR19ET05UV0FJVCk7CiAKKwl0Y3BfcmF0ZV9jaGVja19hcHBfbGltaXRlZChzayk7ICAvKiBpcyBzZW5kaW5nIGFwcGxpY2F0aW9uLWxpbWl0ZWQ/ICovCisKIAkvKiBXYWl0IGZvciBhIGNvbm5lY3Rpb24gdG8gZmluaXNoLiBPbmUgZXhjZXB0aW9uIGlzIFRDUCBGYXN0IE9wZW4KIAkgKiAocGFzc2l2ZSBzaWRlKSB3aGVyZSBkYXRhIGlzIGFsbG93ZWQgdG8gYmUgc2VudCBiZWZvcmUgYSBjb25uZWN0aW9uCiAJICogaXMgZnVsbHkgZXN0YWJsaXNoZWQuCkBAIC0xMTYxLDYgKzExODIsOCBAQAogCQl9CiAKIAkJaWYgKGNvcHkgPD0gMCB8fCAhdGNwX3NrYl9jYW5fY29sbGFwc2VfdG8oc2tiKSkgeworCQkJYm9vbCBmaXJzdF9za2I7CisKIG5ld19zZWdtZW50OgogCQkJLyogQWxsb2NhdGUgbmV3IHNlZ21lbnQuIElmIHRoZSBpbnRlcmZhY2UgaXMgU0csCiAJCQkgKiBhbGxvY2F0ZSBza2IgZml0dGluZyB0byBzaW5nbGUgcGFnZS4KQEAgLTExNzIsMTAgKzExOTUsMTEgQEAKIAkJCQlwcm9jZXNzX2JhY2tsb2cgPSBmYWxzZTsKIAkJCQlnb3RvIHJlc3RhcnQ7CiAJCQl9CisJCQlmaXJzdF9za2IgPSBza2JfcXVldWVfZW1wdHkoJnNrLT5za193cml0ZV9xdWV1ZSk7CiAJCQlza2IgPSBza19zdHJlYW1fYWxsb2Nfc2tiKHNrLAotCQkJCQkJICBzZWxlY3Rfc2l6ZShzaywgc2cpLAorCQkJCQkJICBzZWxlY3Rfc2l6ZShzaywgc2csIGZpcnN0X3NrYiksCiAJCQkJCQkgIHNrLT5za19hbGxvY2F0aW9uLAotCQkJCQkJICBza2JfcXVldWVfZW1wdHkoJnNrLT5za193cml0ZV9xdWV1ZSkpOworCQkJCQkJICBmaXJzdF9za2IpOwogCQkJaWYgKCFza2IpCiAJCQkJZ290byB3YWl0X2Zvcl9tZW1vcnk7CiAKQEAgLTE1NzAsNiArMTU5NCwxMiBAQAogfQogRVhQT1JUX1NZTUJPTCh0Y3BfcmVhZF9zb2NrKTsKIAoraW50IHRjcF9wZWVrX2xlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXJldHVybiB0Y3BfaW5xKHNvY2stPnNrKTsKK30KK0VYUE9SVF9TWU1CT0wodGNwX3BlZWtfbGVuKTsKKwogLyoKICAqCVRoaXMgcm91dGluZSBjb3BpZXMgZnJvbSBhIHNvY2sgc3RydWN0IGludG8gdGhlIHVzZXIgYnVmZmVyLgogICoKQEAgLTIyMzcsNyArMjI2Nyw3IEBACiAJdGNwX2NsZWFyX3htaXRfdGltZXJzKHNrKTsKIAlfX3NrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOwogCXRjcF93cml0ZV9xdWV1ZV9wdXJnZShzayk7Ci0JX19za2JfcXVldWVfcHVyZ2UoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCXNrYl9yYnRyZWVfcHVyZ2UoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwogCiAJaW5ldC0+aW5ldF9kcG9ydCA9IDA7CiAKQEAgLTI2ODEsNyArMjcxMSw3IEBACiB7CiAJY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7IC8qIGlmZiBza190eXBlID09IFNPQ0tfU1RSRUFNICovCiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwotCXUzMiBub3cgPSB0Y3BfdGltZV9zdGFtcDsKKwl1MzIgbm93ID0gdGNwX3RpbWVfc3RhbXAsIGludHY7CiAJdW5zaWduZWQgaW50IHN0YXJ0OwogCWludCBub3RzZW50X2J5dGVzOwogCXU2NCByYXRlNjQ7CkBAIC0yNzcxLDYgKzI4MDEsMTUgQEAKIAlpbmZvLT50Y3BpX21pbl9ydHQgPSB0Y3BfbWluX3J0dCh0cCk7CiAJaW5mby0+dGNwaV9kYXRhX3NlZ3NfaW4gPSB0cC0+ZGF0YV9zZWdzX2luOwogCWluZm8tPnRjcGlfZGF0YV9zZWdzX291dCA9IHRwLT5kYXRhX3NlZ3Nfb3V0OworCisJaW5mby0+dGNwaV9kZWxpdmVyeV9yYXRlX2FwcF9saW1pdGVkID0gdHAtPnJhdGVfYXBwX2xpbWl0ZWQgPyAxIDogMDsKKwlyYXRlID0gUkVBRF9PTkNFKHRwLT5yYXRlX2RlbGl2ZXJlZCk7CisJaW50diA9IFJFQURfT05DRSh0cC0+cmF0ZV9pbnRlcnZhbF91cyk7CisJaWYgKHJhdGUgJiYgaW50dikgeworCQlyYXRlNjQgPSAodTY0KXJhdGUgKiB0cC0+bXNzX2NhY2hlICogVVNFQ19QRVJfU0VDOworCQlkb19kaXYocmF0ZTY0LCBpbnR2KTsKKwkJcHV0X3VuYWxpZ25lZChyYXRlNjQsICZpbmZvLT50Y3BpX2RlbGl2ZXJ5X3JhdGUpOworCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHRjcF9nZXRfaW5mbyk7CiAKQEAgLTMwOTIsMjMgKzMxMzEsNiBAQAogfQogRVhQT1JUX1NZTUJPTCh0Y3BfZ2V0X21kNXNpZ19wb29sKTsKIAotaW50IHRjcF9tZDVfaGFzaF9oZWFkZXIoc3RydWN0IHRjcF9tZDVzaWdfcG9vbCAqaHAsCi0JCQljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCkKLXsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2c7Ci0Jc3RydWN0IHRjcGhkciBoZHI7Ci0KLQkvKiBXZSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRjcGhkciwgbWFrZSBhIGxvY2FsIGNvcHkgKi8KLQltZW1jcHkoJmhkciwgdGgsIHNpemVvZihoZHIpKTsKLQloZHIuY2hlY2sgPSAwOwotCi0JLyogb3B0aW9ucyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIGhhc2ggKi8KLQlzZ19pbml0X29uZSgmc2csICZoZHIsIHNpemVvZihoZHIpKTsKLQlhaGFzaF9yZXF1ZXN0X3NldF9jcnlwdChocC0+bWQ1X3JlcSwgJnNnLCBOVUxMLCBzaXplb2YoaGRyKSk7Ci0JcmV0dXJuIGNyeXB0b19haGFzaF91cGRhdGUoaHAtPm1kNV9yZXEpOwotfQotRVhQT1JUX1NZTUJPTCh0Y3BfbWQ1X2hhc2hfaGVhZGVyKTsKLQogaW50IHRjcF9tZDVfaGFzaF9za2JfZGF0YShzdHJ1Y3QgdGNwX21kNXNpZ19wb29sICpocCwKIAkJCSAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGhlYWRlcl9sZW4pCiB7CkBAIC0zMTkzLDcgKzMyMTUsNiBAQAogCQkJbG9jYWxfYmhfZW5hYmxlKCk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlzb2NrX2dlbl9wdXQoc2spOwogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCkBAIC0zMjIyLDcgKzMyNDMsNiBAQAogCWJoX3VubG9ja19zb2NrKHNrKTsKIAlsb2NhbF9iaF9lbmFibGUoKTsKIAlyZWxlYXNlX3NvY2soc2spOwotCXNvY2tfcHV0KHNrKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHRjcF9hYm9ydCk7CkBAIC0zMjU3LDExICszMjc3LDEyIEBACiAKIHZvaWQgX19pbml0IHRjcF9pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBsaW1pdDsKIAlpbnQgbWF4X3JzaGFyZSwgbWF4X3dzaGFyZSwgY250OworCXVuc2lnbmVkIGxvbmcgbGltaXQ7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlzb2NrX3NrYl9jYl9jaGVja19zaXplKHNpemVvZihzdHJ1Y3QgdGNwX3NrYl9jYikpOworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHRjcF9za2JfY2IpID4KKwkJICAgICBGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGNiKSk7CiAKIAlwZXJjcHVfY291bnRlcl9pbml0KCZ0Y3Bfc29ja2V0c19hbGxvY2F0ZWQsIDAsIEdGUF9LRVJORUwpOwogCXBlcmNwdV9jb3VudGVyX2luaXQoJnRjcF9vcnBoYW5fY291bnQsIDAsIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2Jici5jIGIvbmV0L2lwdjQvdGNwX2Jici5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTY2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2NC90Y3BfYmJyLmMKQEAgLTAsMCArMSw4OTYgQEAKKy8qIEJvdHRsZW5lY2sgQmFuZHdpZHRoIGFuZCBSVFQgKEJCUikgY29uZ2VzdGlvbiBjb250cm9sCisgKgorICogQkJSIGNvbmdlc3Rpb24gY29udHJvbCBjb21wdXRlcyB0aGUgc2VuZGluZyByYXRlIGJhc2VkIG9uIHRoZSBkZWxpdmVyeQorICogcmF0ZSAodGhyb3VnaHB1dCkgZXN0aW1hdGVkIGZyb20gQUNLcy4gSW4gYSBudXRzaGVsbDoKKyAqCisgKiAgIE9uIGVhY2ggQUNLLCB1cGRhdGUgb3VyIG1vZGVsIG9mIHRoZSBuZXR3b3JrIHBhdGg6CisgKiAgICAgIGJvdHRsZW5lY2tfYmFuZHdpZHRoID0gd2luZG93ZWRfbWF4KGRlbGl2ZXJlZCAvIGVsYXBzZWQsIDEwIHJvdW5kIHRyaXBzKQorICogICAgICBtaW5fcnR0ID0gd2luZG93ZWRfbWluKHJ0dCwgMTAgc2Vjb25kcykKKyAqICAgcGFjaW5nX3JhdGUgPSBwYWNpbmdfZ2FpbiAqIGJvdHRsZW5lY2tfYmFuZHdpZHRoCisgKiAgIGN3bmQgPSBtYXgoY3duZF9nYWluICogYm90dGxlbmVja19iYW5kd2lkdGggKiBtaW5fcnR0LCA0KQorICoKKyAqIFRoZSBjb3JlIGFsZ29yaXRobSBkb2VzIG5vdCByZWFjdCBkaXJlY3RseSB0byBwYWNrZXQgbG9zc2VzIG9yIGRlbGF5cywKKyAqIGFsdGhvdWdoIEJCUiBtYXkgYWRqdXN0IHRoZSBzaXplIG9mIG5leHQgc2VuZCBwZXIgQUNLIHdoZW4gbG9zcyBpcworICogb2JzZXJ2ZWQsIG9yIGFkanVzdCB0aGUgc2VuZGluZyByYXRlIGlmIGl0IGVzdGltYXRlcyB0aGVyZSBpcyBhCisgKiB0cmFmZmljIHBvbGljZXIsIGluIG9yZGVyIHRvIGtlZXAgdGhlIGRyb3AgcmF0ZSByZWFzb25hYmxlLgorICoKKyAqIEJCUiBpcyBkZXNjcmliZWQgaW4gZGV0YWlsIGluOgorICogICAiQkJSOiBDb25nZXN0aW9uLUJhc2VkIENvbmdlc3Rpb24gQ29udHJvbCIsCisgKiAgIE5lYWwgQ2FyZHdlbGwsIFl1Y2h1bmcgQ2hlbmcsIEMuIFN0ZXBoZW4gR3VubiwgU29oZWlsIEhhc3NhcyBZZWdhbmVoLAorICogICBWYW4gSmFjb2Jzb24uIEFDTSBRdWV1ZSwgVm9sLiAxNCBOby4gNSwgU2VwdGVtYmVyLU9jdG9iZXIgMjAxNi4KKyAqCisgKiBUaGVyZSBpcyBhIHB1YmxpYyBlLW1haWwgbGlzdCBmb3IgZGlzY3Vzc2luZyBCQlIgZGV2ZWxvcG1lbnQgYW5kIHRlc3Rpbmc6CisgKiAgIGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vIyFmb3J1bS9iYnItZGV2CisgKgorICogTk9URTogQkJSICptdXN0KiBiZSB1c2VkIHdpdGggdGhlIGZxIHFkaXNjICgibWFuIHRjLWZxIikgd2l0aCBwYWNpbmcgZW5hYmxlZCwKKyAqIHNpbmNlIHBhY2luZyBpcyBpbnRlZ3JhbCB0byB0aGUgQkJSIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24uCisgKiBCQlIgd2l0aG91dCBwYWNpbmcgd291bGQgbm90IGZ1bmN0aW9uIHByb3Blcmx5LCBhbmQgbWF5IGluY3VyIHVubmVjZXNzYXJ5CisgKiBoaWdoIHBhY2tldCBsb3NzIHJhdGVzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRfZGlhZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC93aW5fbWlubWF4Lmg+CisKKy8qIFNjYWxlIGZhY3RvciBmb3IgcmF0ZSBpbiBwa3QvdVNlYyB1bml0IHRvIGF2b2lkIHRydW5jYXRpb24gaW4gYmFuZHdpZHRoCisgKiBlc3RpbWF0aW9uLiBUaGUgcmF0ZSB1bml0IH49ICgxNTAwIGJ5dGVzIC8gMSB1c2VjIC8gMl4yNCkgfj0gNzE1IGJwcy4KKyAqIFRoaXMgaGFuZGxlcyBiYW5kd2lkdGhzIGZyb20gMC4wNnBwcyAoNzE1YnBzKSB0byAyNTZNcHBzICgzVGJwcykgaW4gYSB1MzIuCisgKiBTaW5jZSB0aGUgbWluaW11bSB3aW5kb3cgaXMgPj00IHBhY2tldHMsIHRoZSBsb3dlciBib3VuZCBpc24ndAorICogYW4gaXNzdWUuIFRoZSB1cHBlciBib3VuZCBpc24ndCBhbiBpc3N1ZSB3aXRoIGV4aXN0aW5nIHRlY2hub2xvZ2llcy4KKyAqLworI2RlZmluZSBCV19TQ0FMRSAyNAorI2RlZmluZSBCV19VTklUICgxIDw8IEJXX1NDQUxFKQorCisjZGVmaW5lIEJCUl9TQ0FMRSA4CS8qIHNjYWxpbmcgZmFjdG9yIGZvciBmcmFjdGlvbnMgaW4gQkJSIChlLmcuIGdhaW5zKSAqLworI2RlZmluZSBCQlJfVU5JVCAoMSA8PCBCQlJfU0NBTEUpCisKKy8qIEJCUiBoYXMgdGhlIGZvbGxvd2luZyBtb2RlcyBmb3IgZGVjaWRpbmcgaG93IGZhc3QgdG8gc2VuZDogKi8KK2VudW0gYmJyX21vZGUgeworCUJCUl9TVEFSVFVQLAkvKiByYW1wIHVwIHNlbmRpbmcgcmF0ZSByYXBpZGx5IHRvIGZpbGwgcGlwZSAqLworCUJCUl9EUkFJTiwJLyogZHJhaW4gYW55IHF1ZXVlIGNyZWF0ZWQgZHVyaW5nIHN0YXJ0dXAgKi8KKwlCQlJfUFJPQkVfQlcsCS8qIGRpc2NvdmVyLCBzaGFyZSBidzogcGFjZSBhcm91bmQgZXN0aW1hdGVkIGJ3ICovCisJQkJSX1BST0JFX1JUVCwJLyogY3V0IGN3bmQgdG8gbWluIHRvIHByb2JlIG1pbl9ydHQgKi8KK307CisKKy8qIEJCUiBjb25nZXN0aW9uIGNvbnRyb2wgYmxvY2sgKi8KK3N0cnVjdCBiYnIgeworCXUzMgltaW5fcnR0X3VzOwkgICAgICAgIC8qIG1pbiBSVFQgaW4gbWluX3J0dF93aW5fc2VjIHdpbmRvdyAqLworCXUzMgltaW5fcnR0X3N0YW1wOwkgICAgICAgIC8qIHRpbWVzdGFtcCBvZiBtaW5fcnR0X3VzICovCisJdTMyCXByb2JlX3J0dF9kb25lX3N0YW1wOyAgIC8qIGVuZCB0aW1lIGZvciBCQlJfUFJPQkVfUlRUIG1vZGUgKi8KKwlzdHJ1Y3QgbWlubWF4IGJ3OwkvKiBNYXggcmVjZW50IGRlbGl2ZXJ5IHJhdGUgaW4gcGt0cy91UyA8PCAyNCAqLworCXUzMglydHRfY250OwkgICAgLyogY291bnQgb2YgcGFja2V0LXRpbWVkIHJvdW5kcyBlbGFwc2VkICovCisJdTMyICAgICBuZXh0X3J0dF9kZWxpdmVyZWQ7IC8qIHNjYi0+dHguZGVsaXZlcmVkIGF0IGVuZCBvZiByb3VuZCAqLworCXN0cnVjdCBza2JfbXN0YW1wIGN5Y2xlX21zdGFtcDsgIC8qIHRpbWUgb2YgdGhpcyBjeWNsZSBwaGFzZSBzdGFydCAqLworCXUzMiAgICAgbW9kZTozLAkJICAgICAvKiBjdXJyZW50IGJicl9tb2RlIGluIHN0YXRlIG1hY2hpbmUgKi8KKwkJcHJldl9jYV9zdGF0ZTozLCAgICAgLyogQ0Egc3RhdGUgb24gcHJldmlvdXMgQUNLICovCisJCXBhY2tldF9jb25zZXJ2YXRpb246MSwgIC8qIHVzZSBwYWNrZXQgY29uc2VydmF0aW9uPyAqLworCQlyZXN0b3JlX2N3bmQ6MSwJICAgICAvKiBkZWNpZGVkIHRvIHJldmVydCBjd25kIHRvIG9sZCB2YWx1ZSAqLworCQlyb3VuZF9zdGFydDoxLAkgICAgIC8qIHN0YXJ0IG9mIHBhY2tldC10aW1lZCB0eC0+YWNrIHJvdW5kPyAqLworCQl0c29fc2Vnc19nb2FsOjcsICAgICAvKiBzZWdtZW50cyB3ZSB3YW50IGluIGVhY2ggc2tiIHdlIHNlbmQgKi8KKwkJaWRsZV9yZXN0YXJ0OjEsCSAgICAgLyogcmVzdGFydGluZyBhZnRlciBpZGxlPyAqLworCQlwcm9iZV9ydHRfcm91bmRfZG9uZToxLCAgLyogYSBCQlJfUFJPQkVfUlRUIHJvdW5kIGF0IDQgcGt0cz8gKi8KKwkJdW51c2VkOjUsCisJCWx0X2lzX3NhbXBsaW5nOjEsICAgIC8qIHRha2luZyBsb25nLXRlcm0gKCJMVCIpIHNhbXBsZXMgbm93PyAqLworCQlsdF9ydHRfY250OjcsCSAgICAgLyogcm91bmQgdHJpcHMgaW4gbG9uZy10ZXJtIGludGVydmFsICovCisJCWx0X3VzZV9idzoxOwkgICAgIC8qIHVzZSBsdF9idyBhcyBvdXIgYncgZXN0aW1hdGU/ICovCisJdTMyCWx0X2J3OwkJICAgICAvKiBMVCBlc3QgZGVsaXZlcnkgcmF0ZSBpbiBwa3RzL3VTIDw8IDI0ICovCisJdTMyCWx0X2xhc3RfZGVsaXZlcmVkOyAgIC8qIExUIGludHZsIHN0YXJ0OiB0cC0+ZGVsaXZlcmVkICovCisJdTMyCWx0X2xhc3Rfc3RhbXA7CSAgICAgLyogTFQgaW50dmwgc3RhcnQ6IHRwLT5kZWxpdmVyZWRfbXN0YW1wICovCisJdTMyCWx0X2xhc3RfbG9zdDsJICAgICAvKiBMVCBpbnR2bCBzdGFydDogdHAtPmxvc3QgKi8KKwl1MzIJcGFjaW5nX2dhaW46MTAsCS8qIGN1cnJlbnQgZ2FpbiBmb3Igc2V0dGluZyBwYWNpbmcgcmF0ZSAqLworCQljd25kX2dhaW46MTAsCS8qIGN1cnJlbnQgZ2FpbiBmb3Igc2V0dGluZyBjd25kICovCisJCWZ1bGxfYndfY250OjMsCS8qIG51bWJlciBvZiByb3VuZHMgd2l0aG91dCBsYXJnZSBidyBnYWlucyAqLworCQljeWNsZV9pZHg6MywJLyogY3VycmVudCBpbmRleCBpbiBwYWNpbmdfZ2FpbiBjeWNsZSBhcnJheSAqLworCQl1bnVzZWRfYjo2OworCXUzMglwcmlvcl9jd25kOwkvKiBwcmlvciBjd25kIHVwb24gZW50ZXJpbmcgbG9zcyByZWNvdmVyeSAqLworCXUzMglmdWxsX2J3OwkvKiByZWNlbnQgYncsIHRvIGVzdGltYXRlIGlmIHBpcGUgaXMgZnVsbCAqLworfTsKKworI2RlZmluZSBDWUNMRV9MRU4JOAkvKiBudW1iZXIgb2YgcGhhc2VzIGluIGEgcGFjaW5nIGdhaW4gY3ljbGUgKi8KKworLyogV2luZG93IGxlbmd0aCBvZiBidyBmaWx0ZXIgKGluIHJvdW5kcyk6ICovCitzdGF0aWMgY29uc3QgaW50IGJicl9id19ydHRzID0gQ1lDTEVfTEVOICsgMjsKKy8qIFdpbmRvdyBsZW5ndGggb2YgbWluX3J0dCBmaWx0ZXIgKGluIHNlYyk6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9taW5fcnR0X3dpbl9zZWMgPSAxMDsKKy8qIE1pbmltdW0gdGltZSAoaW4gbXMpIHNwZW50IGF0IGJicl9jd25kX21pbl90YXJnZXQgaW4gQkJSX1BST0JFX1JUVCBtb2RlOiAqLworc3RhdGljIGNvbnN0IHUzMiBiYnJfcHJvYmVfcnR0X21vZGVfbXMgPSAyMDA7CisvKiBTa2lwIFRTTyBiZWxvdyB0aGUgZm9sbG93aW5nIGJhbmR3aWR0aCAoYml0cy9zZWMpOiAqLworc3RhdGljIGNvbnN0IGludCBiYnJfbWluX3Rzb19yYXRlID0gMTIwMDAwMDsKKworLyogV2UgdXNlIGEgaGlnaF9nYWluIHZhbHVlIG9mIDIvbG4oMikgYmVjYXVzZSBpdCdzIHRoZSBzbWFsbGVzdCBwYWNpbmcgZ2FpbgorICogdGhhdCB3aWxsIGFsbG93IGEgc21vb3RobHkgaW5jcmVhc2luZyBwYWNpbmcgcmF0ZSB0aGF0IHdpbGwgZG91YmxlIGVhY2ggUlRUCisgKiBhbmQgc2VuZCB0aGUgc2FtZSBudW1iZXIgb2YgcGFja2V0cyBwZXIgUlRUIHRoYXQgYW4gdW4tcGFjZWQsIHNsb3ctc3RhcnRpbmcKKyAqIFJlbm8gb3IgQ1VCSUMgZmxvdyB3b3VsZDoKKyAqLworc3RhdGljIGNvbnN0IGludCBiYnJfaGlnaF9nYWluICA9IEJCUl9VTklUICogMjg4NSAvIDEwMDAgKyAxOworLyogVGhlIHBhY2luZyBnYWluIG9mIDEvaGlnaF9nYWluIGluIEJCUl9EUkFJTiBpcyBjYWxjdWxhdGVkIHRvIHR5cGljYWxseSBkcmFpbgorICogdGhlIHF1ZXVlIGNyZWF0ZWQgaW4gQkJSX1NUQVJUVVAgaW4gYSBzaW5nbGUgcm91bmQ6CisgKi8KK3N0YXRpYyBjb25zdCBpbnQgYmJyX2RyYWluX2dhaW4gPSBCQlJfVU5JVCAqIDEwMDAgLyAyODg1OworLyogVGhlIGdhaW4gZm9yIGRlcml2aW5nIHN0ZWFkeS1zdGF0ZSBjd25kIHRvbGVyYXRlcyBkZWxheWVkL3N0cmV0Y2hlZCBBQ0tzOiAqLworc3RhdGljIGNvbnN0IGludCBiYnJfY3duZF9nYWluICA9IEJCUl9VTklUICogMjsKKy8qIFRoZSBwYWNpbmdfZ2FpbiB2YWx1ZXMgZm9yIHRoZSBQUk9CRV9CVyBnYWluIGN5Y2xlLCB0byBkaXNjb3Zlci9zaGFyZSBidzogKi8KK3N0YXRpYyBjb25zdCBpbnQgYmJyX3BhY2luZ19nYWluW10gPSB7CisJQkJSX1VOSVQgKiA1IC8gNCwJLyogcHJvYmUgZm9yIG1vcmUgYXZhaWxhYmxlIGJ3ICovCisJQkJSX1VOSVQgKiAzIC8gNCwJLyogZHJhaW4gcXVldWUgYW5kL29yIHlpZWxkIGJ3IHRvIG90aGVyIGZsb3dzICovCisJQkJSX1VOSVQsIEJCUl9VTklULCBCQlJfVU5JVCwJLyogY3J1aXNlIGF0IDEuMCpidyB0byB1dGlsaXplIHBpcGUsICovCisJQkJSX1VOSVQsIEJCUl9VTklULCBCQlJfVU5JVAkvKiB3aXRob3V0IGNyZWF0aW5nIGV4Y2VzcyBxdWV1ZS4uLiAqLworfTsKKy8qIFJhbmRvbWl6ZSB0aGUgc3RhcnRpbmcgZ2FpbiBjeWNsaW5nIHBoYXNlIG92ZXIgTiBwaGFzZXM6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9jeWNsZV9yYW5kID0gNzsKKworLyogVHJ5IHRvIGtlZXAgYXQgbGVhc3QgdGhpcyBtYW55IHBhY2tldHMgaW4gZmxpZ2h0LCBpZiB0aGluZ3MgZ28gc21vb3RobHkuIEZvcgorICogc21vb3RoIGZ1bmN0aW9uaW5nLCBhIHNsaWRpbmcgd2luZG93IHByb3RvY29sIEFDS2luZyBldmVyeSBvdGhlciBwYWNrZXQKKyAqIG5lZWRzIGF0IGxlYXN0IDQgcGFja2V0cyBpbiBmbGlnaHQ6CisgKi8KK3N0YXRpYyBjb25zdCB1MzIgYmJyX2N3bmRfbWluX3RhcmdldCA9IDQ7CisKKy8qIFRvIGVzdGltYXRlIGlmIEJCUl9TVEFSVFVQIG1vZGUgKGkuZS4gaGlnaF9nYWluKSBoYXMgZmlsbGVkIHBpcGUuLi4gKi8KKy8qIElmIGJ3IGhhcyBpbmNyZWFzZWQgc2lnbmlmaWNhbnRseSAoMS4yNXgpLCB0aGVyZSBtYXkgYmUgbW9yZSBidyBhdmFpbGFibGU6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9mdWxsX2J3X3RocmVzaCA9IEJCUl9VTklUICogNSAvIDQ7CisvKiBCdXQgYWZ0ZXIgMyByb3VuZHMgdy9vIHNpZ25pZmljYW50IGJ3IGdyb3d0aCwgZXN0aW1hdGUgcGlwZSBpcyBmdWxsOiAqLworc3RhdGljIGNvbnN0IHUzMiBiYnJfZnVsbF9id19jbnQgPSAzOworCisvKiAibG9uZy10ZXJtIiAoIkxUIikgYmFuZHdpZHRoIGVzdGltYXRvciBwYXJhbWV0ZXJzLi4uICovCisvKiBUaGUgbWluaW11bSBudW1iZXIgb2Ygcm91bmRzIGluIGFuIExUIGJ3IHNhbXBsaW5nIGludGVydmFsOiAqLworc3RhdGljIGNvbnN0IHUzMiBiYnJfbHRfaW50dmxfbWluX3J0dHMgPSA0OworLyogSWYgbG9zdC9kZWxpdmVyZWQgcmF0aW8gPiAyMCUsIGludGVydmFsIGlzICJsb3NzeSIgYW5kIHdlIG1heSBiZSBwb2xpY2VkOiAqLworc3RhdGljIGNvbnN0IHUzMiBiYnJfbHRfbG9zc190aHJlc2ggPSA1MDsKKy8qIElmIDIgaW50ZXJ2YWxzIGhhdmUgYSBidyByYXRpbyA8PSAxLzgsIHRoZWlyIGJ3IGlzICJjb25zaXN0ZW50IjogKi8KK3N0YXRpYyBjb25zdCB1MzIgYmJyX2x0X2J3X3JhdGlvID0gQkJSX1VOSVQgLyA4OworLyogSWYgMiBpbnRlcnZhbHMgaGF2ZSBhIGJ3IGRpZmYgPD0gNCBLYml0L3NlYyB0aGVpciBidyBpcyAiY29uc2lzdGVudCI6ICovCitzdGF0aWMgY29uc3QgdTMyIGJicl9sdF9id19kaWZmID0gNDAwMCAvIDg7CisvKiBJZiB3ZSBlc3RpbWF0ZSB3ZSdyZSBwb2xpY2VkLCB1c2UgbHRfYncgZm9yIHRoaXMgbWFueSByb3VuZCB0cmlwczogKi8KK3N0YXRpYyBjb25zdCB1MzIgYmJyX2x0X2J3X21heF9ydHRzID0gNDg7CisKKy8qIERvIHdlIGVzdGltYXRlIHRoYXQgU1RBUlRVUCBmaWxsZWQgdGhlIHBpcGU/ICovCitzdGF0aWMgYm9vbCBiYnJfZnVsbF9id19yZWFjaGVkKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwljb25zdCBzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwlyZXR1cm4gYmJyLT5mdWxsX2J3X2NudCA+PSBiYnJfZnVsbF9id19jbnQ7Cit9CisKKy8qIFJldHVybiB0aGUgd2luZG93ZWQgbWF4IHJlY2VudCBiYW5kd2lkdGggc2FtcGxlLCBpbiBwa3RzL3VTIDw8IEJXX1NDQUxFLiAqLworc3RhdGljIHUzMiBiYnJfbWF4X2J3KGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwlyZXR1cm4gbWlubWF4X2dldCgmYmJyLT5idyk7Cit9CisKKy8qIFJldHVybiB0aGUgZXN0aW1hdGVkIGJhbmR3aWR0aCBvZiB0aGUgcGF0aCwgaW4gcGt0cy91UyA8PCBCV19TQ0FMRS4gKi8KK3N0YXRpYyB1MzIgYmJyX2J3KGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwlyZXR1cm4gYmJyLT5sdF91c2VfYncgPyBiYnItPmx0X2J3IDogYmJyX21heF9idyhzayk7Cit9CisKKy8qIFJldHVybiByYXRlIGluIGJ5dGVzIHBlciBzZWNvbmQsIG9wdGlvbmFsbHkgd2l0aCBhIGdhaW4uCisgKiBUaGUgb3JkZXIgaGVyZSBpcyBjaG9zZW4gY2FyZWZ1bGx5IHRvIGF2b2lkIG92ZXJmbG93IG9mIHU2NC4gVGhpcyBzaG91bGQKKyAqIHdvcmsgZm9yIGlucHV0IHJhdGVzIG9mIHVwIHRvIDIuOVRiaXQvc2VjIGFuZCBnYWluIG9mIDIuODl4LgorICovCitzdGF0aWMgdTY0IGJicl9yYXRlX2J5dGVzX3Blcl9zZWMoc3RydWN0IHNvY2sgKnNrLCB1NjQgcmF0ZSwgaW50IGdhaW4pCit7CisJcmF0ZSAqPSB0Y3BfbXNzX3RvX210dShzaywgdGNwX3NrKHNrKS0+bXNzX2NhY2hlKTsKKwlyYXRlICo9IGdhaW47CisJcmF0ZSA+Pj0gQkJSX1NDQUxFOworCXJhdGUgKj0gVVNFQ19QRVJfU0VDOworCXJldHVybiByYXRlID4+IEJXX1NDQUxFOworfQorCisvKiBQYWNlIHVzaW5nIGN1cnJlbnQgYncgZXN0aW1hdGUgYW5kIGEgZ2FpbiBmYWN0b3IuIEluIG9yZGVyIHRvIGhlbHAgZHJpdmUgdGhlCisgKiBuZXR3b3JrIHRvd2FyZCBsb3dlciBxdWV1ZXMgd2hpbGUgbWFpbnRhaW5pbmcgaGlnaCB1dGlsaXphdGlvbiBhbmQgbG93CisgKiBsYXRlbmN5LCB0aGUgYXZlcmFnZSBwYWNpbmcgcmF0ZSBhaW1zIHRvIGJlIHNsaWdodGx5ICh+MSUpIGxvd2VyIHRoYW4gdGhlCisgKiBlc3RpbWF0ZWQgYmFuZHdpZHRoLiBUaGlzIGlzIGFuIGltcG9ydGFudCBhc3BlY3Qgb2YgdGhlIGRlc2lnbi4gSW4gdGhpcworICogaW1wbGVtZW50YXRpb24gdGhpcyBzbGlnaHRseSBsb3dlciBwYWNpbmcgcmF0ZSBpcyBhY2hpZXZlZCBpbXBsaWNpdGx5IGJ5IG5vdAorICogaW5jbHVkaW5nIGxpbmstbGF5ZXIgaGVhZGVycyBpbiB0aGUgcGFja2V0IHNpemUgdXNlZCBmb3IgdGhlIHBhY2luZyByYXRlLgorICovCitzdGF0aWMgdm9pZCBiYnJfc2V0X3BhY2luZ19yYXRlKHN0cnVjdCBzb2NrICpzaywgdTMyIGJ3LCBpbnQgZ2FpbikKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJdTY0IHJhdGUgPSBidzsKKworCXJhdGUgPSBiYnJfcmF0ZV9ieXRlc19wZXJfc2VjKHNrLCByYXRlLCBnYWluKTsKKwlyYXRlID0gbWluX3QodTY0LCByYXRlLCBzay0+c2tfbWF4X3BhY2luZ19yYXRlKTsKKwlpZiAoYmJyLT5tb2RlICE9IEJCUl9TVEFSVFVQIHx8IHJhdGUgPiBzay0+c2tfcGFjaW5nX3JhdGUpCisJCXNrLT5za19wYWNpbmdfcmF0ZSA9IHJhdGU7Cit9CisKKy8qIFJldHVybiBjb3VudCBvZiBzZWdtZW50cyB3ZSB3YW50IGluIHRoZSBza2JzIHdlIHNlbmQsIG9yIDAgZm9yIGRlZmF1bHQuICovCitzdGF0aWMgdTMyIGJicl90c29fc2Vnc19nb2FsKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwlyZXR1cm4gYmJyLT50c29fc2Vnc19nb2FsOworfQorCitzdGF0aWMgdm9pZCBiYnJfc2V0X3Rzb19zZWdzX2dvYWwoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1MzIgbWluX3NlZ3M7CisKKwltaW5fc2VncyA9IHNrLT5za19wYWNpbmdfcmF0ZSA8IChiYnJfbWluX3Rzb19yYXRlID4+IDMpID8gMSA6IDI7CisJYmJyLT50c29fc2Vnc19nb2FsID0gbWluKHRjcF90c29fYXV0b3NpemUoc2ssIHRwLT5tc3NfY2FjaGUsIG1pbl9zZWdzKSwKKwkJCQkgMHg3RlUpOworfQorCisvKiBTYXZlICJsYXN0IGtub3duIGdvb2QiIGN3bmQgc28gd2UgY2FuIHJlc3RvcmUgaXQgYWZ0ZXIgbG9zc2VzIG9yIFBST0JFX1JUVCAqLworc3RhdGljIHZvaWQgYmJyX3NhdmVfY3duZChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCisJaWYgKGJici0+cHJldl9jYV9zdGF0ZSA8IFRDUF9DQV9SZWNvdmVyeSAmJiBiYnItPm1vZGUgIT0gQkJSX1BST0JFX1JUVCkKKwkJYmJyLT5wcmlvcl9jd25kID0gdHAtPnNuZF9jd25kOyAgLyogdGhpcyBjd25kIGlzIGdvb2QgZW5vdWdoICovCisJZWxzZSAgLyogbG9zcyByZWNvdmVyeSBvciBCQlJfUFJPQkVfUlRUIGhhdmUgdGVtcG9yYXJpbHkgY3V0IGN3bmQgKi8KKwkJYmJyLT5wcmlvcl9jd25kID0gbWF4KGJici0+cHJpb3JfY3duZCwgdHAtPnNuZF9jd25kKTsKK30KKworc3RhdGljIHZvaWQgYmJyX2N3bmRfZXZlbnQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIHRjcF9jYV9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwlpZiAoZXZlbnQgPT0gQ0FfRVZFTlRfVFhfU1RBUlQgJiYgdHAtPmFwcF9saW1pdGVkKSB7CisJCWJici0+aWRsZV9yZXN0YXJ0ID0gMTsKKwkJLyogQXZvaWQgcG9pbnRsZXNzIGJ1ZmZlciBvdmVyZmxvd3M6IHBhY2UgYXQgZXN0LiBidyBpZiB3ZSBkb24ndAorCQkgKiBuZWVkIG1vcmUgc3BlZWQgKHdlJ3JlIHJlc3RhcnRpbmcgZnJvbSBpZGxlIGFuZCBhcHAtbGltaXRlZCkuCisJCSAqLworCQlpZiAoYmJyLT5tb2RlID09IEJCUl9QUk9CRV9CVykKKwkJCWJicl9zZXRfcGFjaW5nX3JhdGUoc2ssIGJicl9idyhzayksIEJCUl9VTklUKTsKKwl9Cit9CisKKy8qIEZpbmQgdGFyZ2V0IGN3bmQuIFJpZ2h0LXNpemUgdGhlIGN3bmQgYmFzZWQgb24gbWluIFJUVCBhbmQgdGhlCisgKiBlc3RpbWF0ZWQgYm90dGxlbmVjayBiYW5kd2lkdGg6CisgKgorICogY3duZCA9IGJ3ICogbWluX3J0dCAqIGdhaW4gPSBCRFAgKiBnYWluCisgKgorICogVGhlIGtleSBmYWN0b3IsIGdhaW4sIGNvbnRyb2xzIHRoZSBhbW91bnQgb2YgcXVldWUuIFdoaWxlIGEgc21hbGwgZ2FpbgorICogYnVpbGRzIGEgc21hbGxlciBxdWV1ZSwgaXQgYmVjb21lcyBtb3JlIHZ1bG5lcmFibGUgdG8gbm9pc2UgaW4gUlRUCisgKiBtZWFzdXJlbWVudHMgKGUuZy4sIGRlbGF5ZWQgQUNLcyBvciBvdGhlciBBQ0sgY29tcHJlc3Npb24gZWZmZWN0cykuIFRoaXMKKyAqIG5vaXNlIG1heSBjYXVzZSBCQlIgdG8gdW5kZXItZXN0aW1hdGUgdGhlIHJhdGUuCisgKgorICogVG8gYWNoaWV2ZSBmdWxsIHBlcmZvcm1hbmNlIGluIGhpZ2gtc3BlZWQgcGF0aHMsIHdlIGJ1ZGdldCBlbm91Z2ggY3duZCB0bworICogZml0IGZ1bGwtc2l6ZWQgc2ticyBpbi1mbGlnaHQgb24gYm90aCBlbmQgaG9zdHMgdG8gZnVsbHkgdXRpbGl6ZSB0aGUgcGF0aDoKKyAqICAgLSBvbmUgc2tiIGluIHNlbmRpbmcgaG9zdCBRZGlzYywKKyAqICAgLSBvbmUgc2tiIGluIHNlbmRpbmcgaG9zdCBUU08vR1NPIGVuZ2luZQorICogICAtIG9uZSBza2IgYmVpbmcgcmVjZWl2ZWQgYnkgcmVjZWl2ZXIgaG9zdCBMUk8vR1JPL2RlbGF5ZWQtQUNLIGVuZ2luZQorICogRG9uJ3Qgd29ycnksIGF0IGxvdyByYXRlcyAoYmJyX21pbl90c29fcmF0ZSkgdGhpcyB3b24ndCBibG9hdCBjd25kIGJlY2F1c2UKKyAqIGluIHN1Y2ggY2FzZXMgdHNvX3NlZ3NfZ29hbCBpcyAxLiBUaGUgbWluaW11bSBjd25kIGlzIDQgcGFja2V0cywKKyAqIHdoaWNoIGFsbG93cyAyIG91dHN0YW5kaW5nIDItcGFja2V0IHNlcXVlbmNlcywgdG8gdHJ5IHRvIGtlZXAgcGlwZQorICogZnVsbCBldmVuIHdpdGggQUNLLWV2ZXJ5LW90aGVyLXBhY2tldCBkZWxheWVkIEFDS3MuCisgKi8KK3N0YXRpYyB1MzIgYmJyX3RhcmdldF9jd25kKHN0cnVjdCBzb2NrICpzaywgdTMyIGJ3LCBpbnQgZ2FpbikKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJdTMyIGN3bmQ7CisJdTY0IHc7CisKKwkvKiBJZiB3ZSd2ZSBuZXZlciBoYWQgYSB2YWxpZCBSVFQgc2FtcGxlLCBjYXAgY3duZCBhdCB0aGUgaW5pdGlhbAorCSAqIGRlZmF1bHQuIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgbm90IHVzaW5nIFRDUAorCSAqIHRpbWVzdGFtcHMgYW5kIGhhcyByZXRyYW5zbWl0dGVkIGFsbCBvZiB0aGUgU1lOL1NZTkFDSy9kYXRhIHBhY2tldHMKKwkgKiBBQ0tlZCBzbyBmYXIuIEluIHRoaXMgY2FzZSwgYW4gUlRPIGNhbiBjdXQgY3duZCB0byAxLCBpbiB3aGljaAorCSAqIGNhc2Ugd2UgbmVlZCB0byBzbG93LXN0YXJ0IHVwIHRvd2FyZCBzb21ldGhpbmcgc2FmZTogVENQX0lOSVRfQ1dORC4KKwkgKi8KKwlpZiAodW5saWtlbHkoYmJyLT5taW5fcnR0X3VzID09IH4wVSkpCSAvKiBubyB2YWxpZCBSVFQgc2FtcGxlcyB5ZXQ/ICovCisJCXJldHVybiBUQ1BfSU5JVF9DV05EOyAgLyogYmUgc2FmZTogY2FwIGF0IGRlZmF1bHQgaW5pdGlhbCBjd25kKi8KKworCXcgPSAodTY0KWJ3ICogYmJyLT5taW5fcnR0X3VzOworCisJLyogQXBwbHkgYSBnYWluIHRvIHRoZSBnaXZlbiB2YWx1ZSwgdGhlbiByZW1vdmUgdGhlIEJXX1NDQUxFIHNoaWZ0LiAqLworCWN3bmQgPSAoKCh3ICogZ2FpbikgPj4gQkJSX1NDQUxFKSArIEJXX1VOSVQgLSAxKSAvIEJXX1VOSVQ7CisKKwkvKiBBbGxvdyBlbm91Z2ggZnVsbC1zaXplZCBza2JzIGluIGZsaWdodCB0byB1dGlsaXplIGVuZCBzeXN0ZW1zLiAqLworCWN3bmQgKz0gMyAqIGJici0+dHNvX3NlZ3NfZ29hbDsKKworCS8qIFJlZHVjZSBkZWxheWVkIEFDS3MgYnkgcm91bmRpbmcgdXAgY3duZCB0byB0aGUgbmV4dCBldmVuIG51bWJlci4gKi8KKwljd25kID0gKGN3bmQgKyAxKSAmIH4xVTsKKworCXJldHVybiBjd25kOworfQorCisvKiBBbiBvcHRpbWl6YXRpb24gaW4gQkJSIHRvIHJlZHVjZSBsb3NzZXM6IE9uIHRoZSBmaXJzdCByb3VuZCBvZiByZWNvdmVyeSwgd2UKKyAqIGZvbGxvdyB0aGUgcGFja2V0IGNvbnNlcnZhdGlvbiBwcmluY2lwbGU6IHNlbmQgUCBwYWNrZXRzIHBlciBQIHBhY2tldHMgYWNrZWQuCisgKiBBZnRlciB0aGF0LCB3ZSBzbG93LXN0YXJ0IGFuZCBzZW5kIGF0IG1vc3QgMipQIHBhY2tldHMgcGVyIFAgcGFja2V0cyBhY2tlZC4KKyAqIEFmdGVyIHJlY292ZXJ5IGZpbmlzaGVzLCBvciB1cG9uIHVuZG8sIHdlIHJlc3RvcmUgdGhlIGN3bmQgd2UgaGFkIHdoZW4KKyAqIHJlY292ZXJ5IHN0YXJ0ZWQgKGNhcHBlZCBieSB0aGUgdGFyZ2V0IGN3bmQgYmFzZWQgb24gZXN0aW1hdGVkIEJEUCkuCisgKgorICogVE9ETyh5Y2hlbmcvbmNhcmR3ZWxsKTogaW1wbGVtZW50IGEgcmF0ZS1iYXNlZCBhcHByb2FjaC4KKyAqLworc3RhdGljIGJvb2wgYmJyX3NldF9jd25kX3RvX3JlY292ZXJfb3JfcmVzdG9yZSgKKwlzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMsIHUzMiBhY2tlZCwgdTMyICpuZXdfY3duZCkKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJdTggcHJldl9zdGF0ZSA9IGJici0+cHJldl9jYV9zdGF0ZSwgc3RhdGUgPSBpbmV0X2NzayhzayktPmljc2tfY2Ffc3RhdGU7CisJdTMyIGN3bmQgPSB0cC0+c25kX2N3bmQ7CisKKwkvKiBBbiBBQ0sgZm9yIFAgcGt0cyBzaG91bGQgcmVsZWFzZSBhdCBtb3N0IDIqUCBwYWNrZXRzLiBXZSBkbyB0aGlzCisJICogaW4gdHdvIHN0ZXBzLiBGaXJzdCwgaGVyZSB3ZSBkZWR1Y3QgdGhlIG51bWJlciBvZiBsb3N0IHBhY2tldHMuCisJICogVGhlbiwgaW4gYmJyX3NldF9jd25kKCkgd2Ugc2xvdyBzdGFydCB1cCB0b3dhcmQgdGhlIHRhcmdldCBjd25kLgorCSAqLworCWlmIChycy0+bG9zc2VzID4gMCkKKwkJY3duZCA9IG1heF90KHMzMiwgY3duZCAtIHJzLT5sb3NzZXMsIDEpOworCisJaWYgKHN0YXRlID09IFRDUF9DQV9SZWNvdmVyeSAmJiBwcmV2X3N0YXRlICE9IFRDUF9DQV9SZWNvdmVyeSkgeworCQkvKiBTdGFydGluZyAxc3Qgcm91bmQgb2YgUmVjb3ZlcnksIHNvIGRvIHBhY2tldCBjb25zZXJ2YXRpb24uICovCisJCWJici0+cGFja2V0X2NvbnNlcnZhdGlvbiA9IDE7CisJCWJici0+bmV4dF9ydHRfZGVsaXZlcmVkID0gdHAtPmRlbGl2ZXJlZDsgIC8qIHN0YXJ0IHJvdW5kIG5vdyAqLworCQkvKiBDdXQgdW51c2VkIGN3bmQgZnJvbSBhcHAgYmVoYXZpb3IsIFRTUSwgb3IgVFNPIGRlZmVycmFsOiAqLworCQljd25kID0gdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSArIGFja2VkOworCX0gZWxzZSBpZiAocHJldl9zdGF0ZSA+PSBUQ1BfQ0FfUmVjb3ZlcnkgJiYgc3RhdGUgPCBUQ1BfQ0FfUmVjb3ZlcnkpIHsKKwkJLyogRXhpdGluZyBsb3NzIHJlY292ZXJ5OyByZXN0b3JlIGN3bmQgc2F2ZWQgYmVmb3JlIHJlY292ZXJ5LiAqLworCQliYnItPnJlc3RvcmVfY3duZCA9IDE7CisJCWJici0+cGFja2V0X2NvbnNlcnZhdGlvbiA9IDA7CisJfQorCWJici0+cHJldl9jYV9zdGF0ZSA9IHN0YXRlOworCisJaWYgKGJici0+cmVzdG9yZV9jd25kKSB7CisJCS8qIFJlc3RvcmUgY3duZCBhZnRlciBleGl0aW5nIGxvc3MgcmVjb3Zlcnkgb3IgUFJPQkVfUlRULiAqLworCQljd25kID0gbWF4KGN3bmQsIGJici0+cHJpb3JfY3duZCk7CisJCWJici0+cmVzdG9yZV9jd25kID0gMDsKKwl9CisKKwlpZiAoYmJyLT5wYWNrZXRfY29uc2VydmF0aW9uKSB7CisJCSpuZXdfY3duZCA9IG1heChjd25kLCB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApICsgYWNrZWQpOworCQlyZXR1cm4gdHJ1ZTsJLyogeWVzLCB1c2luZyBwYWNrZXQgY29uc2VydmF0aW9uICovCisJfQorCSpuZXdfY3duZCA9IGN3bmQ7CisJcmV0dXJuIGZhbHNlOworfQorCisvKiBTbG93LXN0YXJ0IHVwIHRvd2FyZCB0YXJnZXQgY3duZCAoaWYgYncgZXN0aW1hdGUgaXMgZ3Jvd2luZywgb3IgcGFja2V0IGxvc3MKKyAqIGhhcyBkcmF3biB1cyBkb3duIGJlbG93IHRhcmdldCksIG9yIHNuYXAgZG93biB0byB0YXJnZXQgaWYgd2UncmUgYWJvdmUgaXQuCisgKi8KK3N0YXRpYyB2b2lkIGJicl9zZXRfY3duZChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMsCisJCQkgdTMyIGFja2VkLCB1MzIgYncsIGludCBnYWluKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1MzIgY3duZCA9IDAsIHRhcmdldF9jd25kID0gMDsKKworCWlmICghYWNrZWQpCisJCXJldHVybjsKKworCWlmIChiYnJfc2V0X2N3bmRfdG9fcmVjb3Zlcl9vcl9yZXN0b3JlKHNrLCBycywgYWNrZWQsICZjd25kKSkKKwkJZ290byBkb25lOworCisJLyogSWYgd2UncmUgYmVsb3cgdGFyZ2V0IGN3bmQsIHNsb3cgc3RhcnQgY3duZCB0b3dhcmQgdGFyZ2V0IGN3bmQuICovCisJdGFyZ2V0X2N3bmQgPSBiYnJfdGFyZ2V0X2N3bmQoc2ssIGJ3LCBnYWluKTsKKwlpZiAoYmJyX2Z1bGxfYndfcmVhY2hlZChzaykpICAvKiBvbmx5IGN1dCBjd25kIGlmIHdlIGZpbGxlZCB0aGUgcGlwZSAqLworCQljd25kID0gbWluKGN3bmQgKyBhY2tlZCwgdGFyZ2V0X2N3bmQpOworCWVsc2UgaWYgKGN3bmQgPCB0YXJnZXRfY3duZCB8fCB0cC0+ZGVsaXZlcmVkIDwgVENQX0lOSVRfQ1dORCkKKwkJY3duZCA9IGN3bmQgKyBhY2tlZDsKKwljd25kID0gbWF4KGN3bmQsIGJicl9jd25kX21pbl90YXJnZXQpOworCitkb25lOgorCXRwLT5zbmRfY3duZCA9IG1pbihjd25kLCB0cC0+c25kX2N3bmRfY2xhbXApOwkvKiBhcHBseSBnbG9iYWwgY2FwICovCisJaWYgKGJici0+bW9kZSA9PSBCQlJfUFJPQkVfUlRUKSAgLyogZHJhaW4gcXVldWUsIHJlZnJlc2ggbWluX3J0dCAqLworCQl0cC0+c25kX2N3bmQgPSBtaW4odHAtPnNuZF9jd25kLCBiYnJfY3duZF9taW5fdGFyZ2V0KTsKK30KKworLyogRW5kIGN5Y2xlIHBoYXNlIGlmIGl0J3MgdGltZSBhbmQvb3Igd2UgaGl0IHRoZSBwaGFzZSdzIGluLWZsaWdodCB0YXJnZXQuICovCitzdGF0aWMgYm9vbCBiYnJfaXNfbmV4dF9jeWNsZV9waGFzZShzdHJ1Y3Qgc29jayAqc2ssCisJCQkJICAgIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCWJvb2wgaXNfZnVsbF9sZW5ndGggPQorCQlza2JfbXN0YW1wX3VzX2RlbHRhKCZ0cC0+ZGVsaXZlcmVkX21zdGFtcCwgJmJici0+Y3ljbGVfbXN0YW1wKSA+CisJCWJici0+bWluX3J0dF91czsKKwl1MzIgaW5mbGlnaHQsIGJ3OworCisJLyogVGhlIHBhY2luZ19nYWluIG9mIDEuMCBwYWNlcyBhdCB0aGUgZXN0aW1hdGVkIGJ3IHRvIHRyeSB0byBmdWxseQorCSAqIHVzZSB0aGUgcGlwZSB3aXRob3V0IGluY3JlYXNpbmcgdGhlIHF1ZXVlLgorCSAqLworCWlmIChiYnItPnBhY2luZ19nYWluID09IEJCUl9VTklUKQorCQlyZXR1cm4gaXNfZnVsbF9sZW5ndGg7CQkvKiBqdXN0IHVzZSB3YWxsIGNsb2NrIHRpbWUgKi8KKworCWluZmxpZ2h0ID0gcnMtPnByaW9yX2luX2ZsaWdodDsgIC8qIHdoYXQgd2FzIGluLWZsaWdodCBiZWZvcmUgQUNLPyAqLworCWJ3ID0gYmJyX21heF9idyhzayk7CisKKwkvKiBBIHBhY2luZ19nYWluID4gMS4wIHByb2JlcyBmb3IgYncgYnkgdHJ5aW5nIHRvIHJhaXNlIGluZmxpZ2h0IHRvIGF0CisJICogbGVhc3QgcGFjaW5nX2dhaW4qQkRQOyB0aGlzIG1heSB0YWtlIG1vcmUgdGhhbiBtaW5fcnR0IGlmIG1pbl9ydHQgaXMKKwkgKiBzbWFsbCAoZS5nLiBvbiBhIExBTikuIFdlIGRvIG5vdCBwZXJzaXN0IGlmIHBhY2tldHMgYXJlIGxvc3QsIHNpbmNlCisJICogYSBwYXRoIHdpdGggc21hbGwgYnVmZmVycyBtYXkgbm90IGhvbGQgdGhhdCBtdWNoLgorCSAqLworCWlmIChiYnItPnBhY2luZ19nYWluID4gQkJSX1VOSVQpCisJCXJldHVybiBpc19mdWxsX2xlbmd0aCAmJgorCQkJKHJzLT5sb3NzZXMgfHwgIC8qIHBlcmhhcHMgcGFjaW5nX2dhaW4qQkRQIHdvbid0IGZpdCAqLworCQkJIGluZmxpZ2h0ID49IGJicl90YXJnZXRfY3duZChzaywgYncsIGJici0+cGFjaW5nX2dhaW4pKTsKKworCS8qIEEgcGFjaW5nX2dhaW4gPCAxLjAgdHJpZXMgdG8gZHJhaW4gZXh0cmEgcXVldWUgd2UgYWRkZWQgaWYgYncKKwkgKiBwcm9iaW5nIGRpZG4ndCBmaW5kIG1vcmUgYncuIElmIGluZmxpZ2h0IGZhbGxzIHRvIG1hdGNoIEJEUCB0aGVuIHdlCisJICogZXN0aW1hdGUgcXVldWUgaXMgZHJhaW5lZDsgcGVyc2lzdGluZyB3b3VsZCB1bmRlcnV0aWxpemUgdGhlIHBpcGUuCisJICovCisJcmV0dXJuIGlzX2Z1bGxfbGVuZ3RoIHx8CisJCWluZmxpZ2h0IDw9IGJicl90YXJnZXRfY3duZChzaywgYncsIEJCUl9VTklUKTsKK30KKworc3RhdGljIHZvaWQgYmJyX2FkdmFuY2VfY3ljbGVfcGhhc2Uoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCWJici0+Y3ljbGVfaWR4ID0gKGJici0+Y3ljbGVfaWR4ICsgMSkgJiAoQ1lDTEVfTEVOIC0gMSk7CisJYmJyLT5jeWNsZV9tc3RhbXAgPSB0cC0+ZGVsaXZlcmVkX21zdGFtcDsKKwliYnItPnBhY2luZ19nYWluID0gYmJyX3BhY2luZ19nYWluW2Jici0+Y3ljbGVfaWR4XTsKK30KKworLyogR2FpbiBjeWNsaW5nOiBjeWNsZSBwYWNpbmcgZ2FpbiB0byBjb252ZXJnZSB0byBmYWlyIHNoYXJlIG9mIGF2YWlsYWJsZSBidy4gKi8KK3N0YXRpYyB2b2lkIGJicl91cGRhdGVfY3ljbGVfcGhhc2Uoc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpCit7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCisJaWYgKChiYnItPm1vZGUgPT0gQkJSX1BST0JFX0JXKSAmJiAhYmJyLT5sdF91c2VfYncgJiYKKwkgICAgYmJyX2lzX25leHRfY3ljbGVfcGhhc2Uoc2ssIHJzKSkKKwkJYmJyX2FkdmFuY2VfY3ljbGVfcGhhc2Uoc2spOworfQorCitzdGF0aWMgdm9pZCBiYnJfcmVzZXRfc3RhcnR1cF9tb2RlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwliYnItPm1vZGUgPSBCQlJfU1RBUlRVUDsKKwliYnItPnBhY2luZ19nYWluID0gYmJyX2hpZ2hfZ2FpbjsKKwliYnItPmN3bmRfZ2FpbgkgPSBiYnJfaGlnaF9nYWluOworfQorCitzdGF0aWMgdm9pZCBiYnJfcmVzZXRfcHJvYmVfYndfbW9kZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCisJYmJyLT5tb2RlID0gQkJSX1BST0JFX0JXOworCWJici0+cGFjaW5nX2dhaW4gPSBCQlJfVU5JVDsKKwliYnItPmN3bmRfZ2FpbiA9IGJicl9jd25kX2dhaW47CisJYmJyLT5jeWNsZV9pZHggPSBDWUNMRV9MRU4gLSAxIC0gcHJhbmRvbV91MzJfbWF4KGJicl9jeWNsZV9yYW5kKTsKKwliYnJfYWR2YW5jZV9jeWNsZV9waGFzZShzayk7CS8qIGZsaXAgdG8gbmV4dCBwaGFzZSBvZiBnYWluIGN5Y2xlICovCit9CisKK3N0YXRpYyB2b2lkIGJicl9yZXNldF9tb2RlKHN0cnVjdCBzb2NrICpzaykKK3sKKwlpZiAoIWJicl9mdWxsX2J3X3JlYWNoZWQoc2spKQorCQliYnJfcmVzZXRfc3RhcnR1cF9tb2RlKHNrKTsKKwllbHNlCisJCWJicl9yZXNldF9wcm9iZV9id19tb2RlKHNrKTsKK30KKworLyogU3RhcnQgYSBuZXcgbG9uZy10ZXJtIHNhbXBsaW5nIGludGVydmFsLiAqLworc3RhdGljIHZvaWQgYmJyX3Jlc2V0X2x0X2J3X3NhbXBsaW5nX2ludGVydmFsKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwliYnItPmx0X2xhc3Rfc3RhbXAgPSB0cC0+ZGVsaXZlcmVkX21zdGFtcC5zdGFtcF9qaWZmaWVzOworCWJici0+bHRfbGFzdF9kZWxpdmVyZWQgPSB0cC0+ZGVsaXZlcmVkOworCWJici0+bHRfbGFzdF9sb3N0ID0gdHAtPmxvc3Q7CisJYmJyLT5sdF9ydHRfY250ID0gMDsKK30KKworLyogQ29tcGxldGVseSByZXNldCBsb25nLXRlcm0gYmFuZHdpZHRoIHNhbXBsaW5nLiAqLworc3RhdGljIHZvaWQgYmJyX3Jlc2V0X2x0X2J3X3NhbXBsaW5nKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisKKwliYnItPmx0X2J3ID0gMDsKKwliYnItPmx0X3VzZV9idyA9IDA7CisJYmJyLT5sdF9pc19zYW1wbGluZyA9IGZhbHNlOworCWJicl9yZXNldF9sdF9id19zYW1wbGluZ19pbnRlcnZhbChzayk7Cit9CisKKy8qIExvbmctdGVybSBidyBzYW1wbGluZyBpbnRlcnZhbCBpcyBkb25lLiBFc3RpbWF0ZSB3aGV0aGVyIHdlJ3JlIHBvbGljZWQuICovCitzdGF0aWMgdm9pZCBiYnJfbHRfYndfaW50ZXJ2YWxfZG9uZShzdHJ1Y3Qgc29jayAqc2ssIHUzMiBidykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJdTMyIGRpZmY7CisKKwlpZiAoYmJyLT5sdF9idykgeyAgLyogZG8gd2UgaGF2ZSBidyBmcm9tIGEgcHJldmlvdXMgaW50ZXJ2YWw/ICovCisJCS8qIElzIG5ldyBidyBjbG9zZSB0byB0aGUgbHRfYncgZnJvbSB0aGUgcHJldmlvdXMgaW50ZXJ2YWw/ICovCisJCWRpZmYgPSBhYnMoYncgLSBiYnItPmx0X2J3KTsKKwkJaWYgKChkaWZmICogQkJSX1VOSVQgPD0gYmJyX2x0X2J3X3JhdGlvICogYmJyLT5sdF9idykgfHwKKwkJICAgIChiYnJfcmF0ZV9ieXRlc19wZXJfc2VjKHNrLCBkaWZmLCBCQlJfVU5JVCkgPD0KKwkJICAgICBiYnJfbHRfYndfZGlmZikpIHsKKwkJCS8qIEFsbCBjcml0ZXJpYSBhcmUgbWV0OyBlc3RpbWF0ZSB3ZSdyZSBwb2xpY2VkLiAqLworCQkJYmJyLT5sdF9idyA9IChidyArIGJici0+bHRfYncpID4+IDE7ICAvKiBhdmcgMiBpbnR2bHMgKi8KKwkJCWJici0+bHRfdXNlX2J3ID0gMTsKKwkJCWJici0+cGFjaW5nX2dhaW4gPSBCQlJfVU5JVDsgIC8qIHRyeSB0byBhdm9pZCBkcm9wcyAqLworCQkJYmJyLT5sdF9ydHRfY250ID0gMDsKKwkJCXJldHVybjsKKwkJfQorCX0KKwliYnItPmx0X2J3ID0gYnc7CisJYmJyX3Jlc2V0X2x0X2J3X3NhbXBsaW5nX2ludGVydmFsKHNrKTsKK30KKworLyogVG9rZW4tYnVja2V0IHRyYWZmaWMgcG9saWNlcnMgYXJlIGNvbW1vbiAoc2VlICJBbiBJbnRlcm5ldC1XaWRlIEFuYWx5c2lzIG9mCisgKiBUcmFmZmljIFBvbGljaW5nIiwgU0lHQ09NTSAyMDE2KS4gQkJSIGRldGVjdHMgdG9rZW4tYnVja2V0IHBvbGljZXJzIGFuZAorICogZXhwbGljaXRseSBtb2RlbHMgdGhlaXIgcG9saWNlZCByYXRlLCB0byByZWR1Y2UgdW5uZWNlc3NhcnkgbG9zc2VzLiBXZQorICogZXN0aW1hdGUgdGhhdCB3ZSdyZSBwb2xpY2VkIGlmIHdlIHNlZSAyIGNvbnNlY3V0aXZlIHNhbXBsaW5nIGludGVydmFscyB3aXRoCisgKiBjb25zaXN0ZW50IHRocm91Z2hwdXQgYW5kIGhpZ2ggcGFja2V0IGxvc3MuIElmIHdlIHRoaW5rIHdlJ3JlIGJlaW5nIHBvbGljZWQsCisgKiBzZXQgbHRfYncgdG8gdGhlICJsb25nLXRlcm0iIGF2ZXJhZ2UgZGVsaXZlcnkgcmF0ZSBmcm9tIHRob3NlIDIgaW50ZXJ2YWxzLgorICovCitzdGF0aWMgdm9pZCBiYnJfbHRfYndfc2FtcGxpbmcoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1MzIgbG9zdCwgZGVsaXZlcmVkOworCXU2NCBidzsKKwlzMzIgdDsKKworCWlmIChiYnItPmx0X3VzZV9idykgewkvKiBhbHJlYWR5IHVzaW5nIGxvbmctdGVybSByYXRlLCBsdF9idz8gKi8KKwkJaWYgKGJici0+bW9kZSA9PSBCQlJfUFJPQkVfQlcgJiYgYmJyLT5yb3VuZF9zdGFydCAmJgorCQkgICAgKytiYnItPmx0X3J0dF9jbnQgPj0gYmJyX2x0X2J3X21heF9ydHRzKSB7CisJCQliYnJfcmVzZXRfbHRfYndfc2FtcGxpbmcoc2spOyAgICAvKiBzdG9wIHVzaW5nIGx0X2J3ICovCisJCQliYnJfcmVzZXRfcHJvYmVfYndfbW9kZShzayk7ICAvKiByZXN0YXJ0IGdhaW4gY3ljbGluZyAqLworCQl9CisJCXJldHVybjsKKwl9CisKKwkvKiBXYWl0IGZvciB0aGUgZmlyc3QgbG9zcyBiZWZvcmUgc2FtcGxpbmcsIHRvIGxldCB0aGUgcG9saWNlciBleGhhdXN0CisJICogaXRzIHRva2VucyBhbmQgZXN0aW1hdGUgdGhlIHN0ZWFkeS1zdGF0ZSByYXRlIGFsbG93ZWQgYnkgdGhlIHBvbGljZXIuCisJICogU3RhcnRpbmcgc2FtcGxlcyBlYXJsaWVyIGluY2x1ZGVzIGJ1cnN0cyB0aGF0IG92ZXItZXN0aW1hdGUgdGhlIGJ3LgorCSAqLworCWlmICghYmJyLT5sdF9pc19zYW1wbGluZykgeworCQlpZiAoIXJzLT5sb3NzZXMpCisJCQlyZXR1cm47CisJCWJicl9yZXNldF9sdF9id19zYW1wbGluZ19pbnRlcnZhbChzayk7CisJCWJici0+bHRfaXNfc2FtcGxpbmcgPSB0cnVlOworCX0KKworCS8qIFRvIGF2b2lkIHVuZGVyZXN0aW1hdGVzLCByZXNldCBzYW1wbGluZyBpZiB3ZSBydW4gb3V0IG9mIGRhdGEuICovCisJaWYgKHJzLT5pc19hcHBfbGltaXRlZCkgeworCQliYnJfcmVzZXRfbHRfYndfc2FtcGxpbmcoc2spOworCQlyZXR1cm47CisJfQorCisJaWYgKGJici0+cm91bmRfc3RhcnQpCisJCWJici0+bHRfcnR0X2NudCsrOwkvKiBjb3VudCByb3VuZCB0cmlwcyBpbiB0aGlzIGludGVydmFsICovCisJaWYgKGJici0+bHRfcnR0X2NudCA8IGJicl9sdF9pbnR2bF9taW5fcnR0cykKKwkJcmV0dXJuOwkJLyogc2FtcGxpbmcgaW50ZXJ2YWwgbmVlZHMgdG8gYmUgbG9uZ2VyICovCisJaWYgKGJici0+bHRfcnR0X2NudCA+IDQgKiBiYnJfbHRfaW50dmxfbWluX3J0dHMpIHsKKwkJYmJyX3Jlc2V0X2x0X2J3X3NhbXBsaW5nKHNrKTsgIC8qIGludGVydmFsIGlzIHRvbyBsb25nICovCisJCXJldHVybjsKKwl9CisKKwkvKiBFbmQgc2FtcGxpbmcgaW50ZXJ2YWwgd2hlbiBhIHBhY2tldCBpcyBsb3N0LCBzbyB3ZSBlc3RpbWF0ZSB0aGUKKwkgKiBwb2xpY2VyIHRva2VucyB3ZXJlIGV4aGF1c3RlZC4gU3RvcHBpbmcgdGhlIHNhbXBsaW5nIGJlZm9yZSB0aGUKKwkgKiB0b2tlbnMgYXJlIGV4aGF1c3RlZCB1bmRlci1lc3RpbWF0ZXMgdGhlIHBvbGljZWQgcmF0ZS4KKwkgKi8KKwlpZiAoIXJzLT5sb3NzZXMpCisJCXJldHVybjsKKworCS8qIENhbGN1bGF0ZSBwYWNrZXRzIGxvc3QgYW5kIGRlbGl2ZXJlZCBpbiBzYW1wbGluZyBpbnRlcnZhbC4gKi8KKwlsb3N0ID0gdHAtPmxvc3QgLSBiYnItPmx0X2xhc3RfbG9zdDsKKwlkZWxpdmVyZWQgPSB0cC0+ZGVsaXZlcmVkIC0gYmJyLT5sdF9sYXN0X2RlbGl2ZXJlZDsKKwkvKiBJcyBsb3NzIHJhdGUgKGxvc3QvZGVsaXZlcmVkKSA+PSBsdF9sb3NzX3RocmVzaD8gSWYgbm90LCB3YWl0LiAqLworCWlmICghZGVsaXZlcmVkIHx8IChsb3N0IDw8IEJCUl9TQ0FMRSkgPCBiYnJfbHRfbG9zc190aHJlc2ggKiBkZWxpdmVyZWQpCisJCXJldHVybjsKKworCS8qIEZpbmQgYXZlcmFnZSBkZWxpdmVyeSByYXRlIGluIHRoaXMgc2FtcGxpbmcgaW50ZXJ2YWwuICovCisJdCA9IChzMzIpKHRwLT5kZWxpdmVyZWRfbXN0YW1wLnN0YW1wX2ppZmZpZXMgLSBiYnItPmx0X2xhc3Rfc3RhbXApOworCWlmICh0IDwgMSkKKwkJcmV0dXJuOwkJLyogaW50ZXJ2YWwgaXMgbGVzcyB0aGFuIG9uZSBqaWZmeSwgc28gd2FpdCAqLworCXQgPSBqaWZmaWVzX3RvX3VzZWNzKHQpOworCS8qIEludGVydmFsIGxvbmcgZW5vdWdoIGZvciBqaWZmaWVzX3RvX3VzZWNzKCkgdG8gcmV0dXJuIGEgYm9ndXMgMD8gKi8KKwlpZiAodCA8IDEpIHsKKwkJYmJyX3Jlc2V0X2x0X2J3X3NhbXBsaW5nKHNrKTsgIC8qIGludGVydmFsIHRvbyBsb25nOyByZXNldCAqLworCQlyZXR1cm47CisJfQorCWJ3ID0gKHU2NClkZWxpdmVyZWQgKiBCV19VTklUOworCWRvX2RpdihidywgdCk7CisJYmJyX2x0X2J3X2ludGVydmFsX2RvbmUoc2ssIGJ3KTsKK30KKworLyogRXN0aW1hdGUgdGhlIGJhbmR3aWR0aCBiYXNlZCBvbiBob3cgZmFzdCBwYWNrZXRzIGFyZSBkZWxpdmVyZWQgKi8KK3N0YXRpYyB2b2lkIGJicl91cGRhdGVfYncoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKQoreworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKwl1NjQgYnc7CisKKwliYnItPnJvdW5kX3N0YXJ0ID0gMDsKKwlpZiAocnMtPmRlbGl2ZXJlZCA8IDAgfHwgcnMtPmludGVydmFsX3VzIDw9IDApCisJCXJldHVybjsgLyogTm90IGEgdmFsaWQgb2JzZXJ2YXRpb24gKi8KKworCS8qIFNlZSBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBuZXh0IFJUVCAqLworCWlmICghYmVmb3JlKHJzLT5wcmlvcl9kZWxpdmVyZWQsIGJici0+bmV4dF9ydHRfZGVsaXZlcmVkKSkgeworCQliYnItPm5leHRfcnR0X2RlbGl2ZXJlZCA9IHRwLT5kZWxpdmVyZWQ7CisJCWJici0+cnR0X2NudCsrOworCQliYnItPnJvdW5kX3N0YXJ0ID0gMTsKKwkJYmJyLT5wYWNrZXRfY29uc2VydmF0aW9uID0gMDsKKwl9CisKKwliYnJfbHRfYndfc2FtcGxpbmcoc2ssIHJzKTsKKworCS8qIERpdmlkZSBkZWxpdmVyZWQgYnkgdGhlIGludGVydmFsIHRvIGZpbmQgYSAobG93ZXIgYm91bmQpIGJvdHRsZW5lY2sKKwkgKiBiYW5kd2lkdGggc2FtcGxlLiBEZWxpdmVyZWQgaXMgaW4gcGFja2V0cyBhbmQgaW50ZXJ2YWxfdXMgaW4gdVMgYW5kCisJICogcmF0aW8gd2lsbCBiZSA8PDEgZm9yIG1vc3QgY29ubmVjdGlvbnMuIFNvIGRlbGl2ZXJlZCBpcyBmaXJzdCBzY2FsZWQuCisJICovCisJYncgPSAodTY0KXJzLT5kZWxpdmVyZWQgKiBCV19VTklUOworCWRvX2RpdihidywgcnMtPmludGVydmFsX3VzKTsKKworCS8qIElmIHRoaXMgc2FtcGxlIGlzIGFwcGxpY2F0aW9uLWxpbWl0ZWQsIGl0IGlzIGxpa2VseSB0byBoYXZlIGEgdmVyeQorCSAqIGxvdyBkZWxpdmVyZWQgY291bnQgdGhhdCByZXByZXNlbnRzIGFwcGxpY2F0aW9uIGJlaGF2aW9yIHJhdGhlciB0aGFuCisJICogdGhlIGF2YWlsYWJsZSBuZXR3b3JrIHJhdGUuIFN1Y2ggYSBzYW1wbGUgY291bGQgZHJhZyBkb3duIGVzdGltYXRlZAorCSAqIGJ3LCBjYXVzaW5nIG5lZWRsZXNzIHNsb3ctZG93bi4gVGh1cywgdG8gY29udGludWUgdG8gc2VuZCBhdCB0aGUKKwkgKiBsYXN0IG1lYXN1cmVkIG5ldHdvcmsgcmF0ZSwgd2UgZmlsdGVyIG91dCBhcHAtbGltaXRlZCBzYW1wbGVzIHVubGVzcworCSAqIHRoZXkgZGVzY3JpYmUgdGhlIHBhdGggYncgYXQgbGVhc3QgYXMgd2VsbCBhcyBvdXIgYncgbW9kZWwuCisJICoKKwkgKiBTbyB0aGUgZ29hbCBkdXJpbmcgYXBwLWxpbWl0ZWQgcGhhc2UgaXMgdG8gcHJvY2VlZCB3aXRoIHRoZSBiZXN0CisJICogbmV0d29yayByYXRlIG5vIG1hdHRlciBob3cgbG9uZy4gV2UgYXV0b21hdGljYWxseSBsZWF2ZSB0aGlzCisJICogcGhhc2Ugd2hlbiBhcHAgd3JpdGVzIGZhc3RlciB0aGFuIHRoZSBuZXR3b3JrIGNhbiBkZWxpdmVyIDopCisJICovCisJaWYgKCFycy0+aXNfYXBwX2xpbWl0ZWQgfHwgYncgPj0gYmJyX21heF9idyhzaykpIHsKKwkJLyogSW5jb3Jwb3JhdGUgbmV3IHNhbXBsZSBpbnRvIG91ciBtYXggYncgZmlsdGVyLiAqLworCQltaW5tYXhfcnVubmluZ19tYXgoJmJici0+YncsIGJicl9id19ydHRzLCBiYnItPnJ0dF9jbnQsIGJ3KTsKKwl9Cit9CisKKy8qIEVzdGltYXRlIHdoZW4gdGhlIHBpcGUgaXMgZnVsbCwgdXNpbmcgdGhlIGNoYW5nZSBpbiBkZWxpdmVyeSByYXRlOiBCQlIKKyAqIGVzdGltYXRlcyB0aGF0IFNUQVJUVVAgZmlsbGVkIHRoZSBwaXBlIGlmIHRoZSBlc3RpbWF0ZWQgYncgaGFzbid0IGNoYW5nZWQgYnkKKyAqIGF0IGxlYXN0IGJicl9mdWxsX2J3X3RocmVzaCAoMjUlKSBhZnRlciBiYnJfZnVsbF9id19jbnQgKDMpIG5vbi1hcHAtbGltaXRlZAorICogcm91bmRzLiBXaHkgMyByb3VuZHM6IDE6IHJ3aW4gYXV0b3R1bmluZyBncm93cyB0aGUgcndpbiwgMjogd2UgZmlsbCB0aGUKKyAqIGhpZ2hlciByd2luLCAzOiB3ZSBnZXQgaGlnaGVyIGRlbGl2ZXJ5IHJhdGUgc2FtcGxlcy4gT3IgdHJhbnNpZW50CisgKiBjcm9zcy10cmFmZmljIG9yIHJhZGlvIG5vaXNlIGNhbiBnbyBhd2F5LiBDVUJJQyBIeXN0YXJ0IHNoYXJlcyBhIHNpbWlsYXIKKyAqIGRlc2lnbiBnb2FsLCBidXQgdXNlcyBkZWxheSBhbmQgaW50ZXItQUNLIHNwYWNpbmcgaW5zdGVhZCBvZiBiYW5kd2lkdGguCisgKi8KK3N0YXRpYyB2b2lkIGJicl9jaGVja19mdWxsX2J3X3JlYWNoZWQoc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpCit7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCXUzMiBid190aHJlc2g7CisKKwlpZiAoYmJyX2Z1bGxfYndfcmVhY2hlZChzaykgfHwgIWJici0+cm91bmRfc3RhcnQgfHwgcnMtPmlzX2FwcF9saW1pdGVkKQorCQlyZXR1cm47CisKKwlid190aHJlc2ggPSAodTY0KWJici0+ZnVsbF9idyAqIGJicl9mdWxsX2J3X3RocmVzaCA+PiBCQlJfU0NBTEU7CisJaWYgKGJicl9tYXhfYncoc2spID49IGJ3X3RocmVzaCkgeworCQliYnItPmZ1bGxfYncgPSBiYnJfbWF4X2J3KHNrKTsKKwkJYmJyLT5mdWxsX2J3X2NudCA9IDA7CisJCXJldHVybjsKKwl9CisJKytiYnItPmZ1bGxfYndfY250OworfQorCisvKiBJZiBwaXBlIGlzIHByb2JhYmx5IGZ1bGwsIGRyYWluIHRoZSBxdWV1ZSBhbmQgdGhlbiBlbnRlciBzdGVhZHktc3RhdGUuICovCitzdGF0aWMgdm9pZCBiYnJfY2hlY2tfZHJhaW4oc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3QgcmF0ZV9zYW1wbGUgKnJzKQoreworCXN0cnVjdCBiYnIgKmJiciA9IGluZXRfY3NrX2NhKHNrKTsKKworCWlmIChiYnItPm1vZGUgPT0gQkJSX1NUQVJUVVAgJiYgYmJyX2Z1bGxfYndfcmVhY2hlZChzaykpIHsKKwkJYmJyLT5tb2RlID0gQkJSX0RSQUlOOwkvKiBkcmFpbiBxdWV1ZSB3ZSBjcmVhdGVkICovCisJCWJici0+cGFjaW5nX2dhaW4gPSBiYnJfZHJhaW5fZ2FpbjsJLyogcGFjZSBzbG93IHRvIGRyYWluICovCisJCWJici0+Y3duZF9nYWluID0gYmJyX2hpZ2hfZ2FpbjsJLyogbWFpbnRhaW4gY3duZCAqLworCX0JLyogZmFsbCB0aHJvdWdoIHRvIGNoZWNrIGlmIGluLWZsaWdodCBpcyBhbHJlYWR5IHNtYWxsOiAqLworCWlmIChiYnItPm1vZGUgPT0gQkJSX0RSQUlOICYmCisJICAgIHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0Y3Bfc2soc2spKSA8PQorCSAgICBiYnJfdGFyZ2V0X2N3bmQoc2ssIGJicl9tYXhfYncoc2spLCBCQlJfVU5JVCkpCisJCWJicl9yZXNldF9wcm9iZV9id19tb2RlKHNrKTsgIC8qIHdlIGVzdGltYXRlIHF1ZXVlIGlzIGRyYWluZWQgKi8KK30KKworLyogVGhlIGdvYWwgb2YgUFJPQkVfUlRUIG1vZGUgaXMgdG8gaGF2ZSBCQlIgZmxvd3MgY29vcGVyYXRpdmVseSBhbmQKKyAqIHBlcmlvZGljYWxseSBkcmFpbiB0aGUgYm90dGxlbmVjayBxdWV1ZSwgdG8gY29udmVyZ2UgdG8gbWVhc3VyZSB0aGUgdHJ1ZQorICogbWluX3J0dCAodW5sb2FkZWQgcHJvcGFnYXRpb24gZGVsYXkpLiBUaGlzIGFsbG93cyB0aGUgZmxvd3MgdG8ga2VlcCBxdWV1ZXMKKyAqIHNtYWxsIChyZWR1Y2luZyBxdWV1aW5nIGRlbGF5IGFuZCBwYWNrZXQgbG9zcykgYW5kIGFjaGlldmUgZmFpcm5lc3MgYW1vbmcKKyAqIEJCUiBmbG93cy4KKyAqCisgKiBUaGUgbWluX3J0dCBmaWx0ZXIgd2luZG93IGlzIDEwIHNlY29uZHMuIFdoZW4gdGhlIG1pbl9ydHQgZXN0aW1hdGUgZXhwaXJlcywKKyAqIHdlIGVudGVyIFBST0JFX1JUVCBtb2RlIGFuZCBjYXAgdGhlIGN3bmQgYXQgYmJyX2N3bmRfbWluX3RhcmdldD00IHBhY2tldHMuCisgKiBBZnRlciBhdCBsZWFzdCBiYnJfcHJvYmVfcnR0X21vZGVfbXM9MjAwbXMgYW5kIGF0IGxlYXN0IG9uZSBwYWNrZXQtdGltZWQKKyAqIHJvdW5kIHRyaXAgZWxhcHNlZCB3aXRoIHRoYXQgZmxpZ2h0IHNpemUgPD0gNCwgd2UgbGVhdmUgUFJPQkVfUlRUIG1vZGUgYW5kCisgKiByZS1lbnRlciB0aGUgcHJldmlvdXMgbW9kZS4gQkJSIHVzZXMgMjAwbXMgdG8gYXBwcm94aW1hdGVseSBib3VuZCB0aGUKKyAqIHBlcmZvcm1hbmNlIHBlbmFsdHkgb2YgUFJPQkVfUlRUJ3MgY3duZCBjYXBwaW5nIHRvIHJvdWdobHkgMiUgKDIwMG1zLzEwcykuCisgKgorICogTm90ZSB0aGF0IGZsb3dzIG5lZWQgb25seSBwYXkgMiUgaWYgdGhleSBhcmUgYnVzeSBzZW5kaW5nIG92ZXIgdGhlIGxhc3QgMTAKKyAqIHNlY29uZHMuIEludGVyYWN0aXZlIGFwcGxpY2F0aW9ucyAoZS5nLiwgV2ViLCBSUENzLCB2aWRlbyBjaHVua3MpIG9mdGVuIGhhdmUKKyAqIG5hdHVyYWwgc2lsZW5jZXMgb3IgbG93LXJhdGUgcGVyaW9kcyB3aXRoaW4gMTAgc2Vjb25kcyB3aGVyZSB0aGUgcmF0ZSBpcyBsb3cKKyAqIGVub3VnaCBmb3IgbG9uZyBlbm91Z2ggdG8gZHJhaW4gaXRzIHF1ZXVlIGluIHRoZSBib3R0bGVuZWNrLiBXZSBwaWNrIHVwCisgKiB0aGVzZSBtaW4gUlRUIG1lYXN1cmVtZW50cyBvcHBvcnR1bmlzdGljYWxseSB3aXRoIG91ciBtaW5fcnR0IGZpbHRlci4gOi0pCisgKi8KK3N0YXRpYyB2b2lkIGJicl91cGRhdGVfbWluX3J0dChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCWJvb2wgZmlsdGVyX2V4cGlyZWQ7CisKKwkvKiBUcmFjayBtaW4gUlRUIHNlZW4gaW4gdGhlIG1pbl9ydHRfd2luX3NlYyBmaWx0ZXIgd2luZG93OiAqLworCWZpbHRlcl9leHBpcmVkID0gYWZ0ZXIodGNwX3RpbWVfc3RhbXAsCisJCQkgICAgICAgYmJyLT5taW5fcnR0X3N0YW1wICsgYmJyX21pbl9ydHRfd2luX3NlYyAqIEhaKTsKKwlpZiAocnMtPnJ0dF91cyA+PSAwICYmCisJICAgIChycy0+cnR0X3VzIDw9IGJici0+bWluX3J0dF91cyB8fCBmaWx0ZXJfZXhwaXJlZCkpIHsKKwkJYmJyLT5taW5fcnR0X3VzID0gcnMtPnJ0dF91czsKKwkJYmJyLT5taW5fcnR0X3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CisJfQorCisJaWYgKGJicl9wcm9iZV9ydHRfbW9kZV9tcyA+IDAgJiYgZmlsdGVyX2V4cGlyZWQgJiYKKwkgICAgIWJici0+aWRsZV9yZXN0YXJ0ICYmIGJici0+bW9kZSAhPSBCQlJfUFJPQkVfUlRUKSB7CisJCWJici0+bW9kZSA9IEJCUl9QUk9CRV9SVFQ7ICAvKiBkaXAsIGRyYWluIHF1ZXVlICovCisJCWJici0+cGFjaW5nX2dhaW4gPSBCQlJfVU5JVDsKKwkJYmJyLT5jd25kX2dhaW4gPSBCQlJfVU5JVDsKKwkJYmJyX3NhdmVfY3duZChzayk7ICAvKiBub3RlIGN3bmQgc28gd2UgY2FuIHJlc3RvcmUgaXQgKi8KKwkJYmJyLT5wcm9iZV9ydHRfZG9uZV9zdGFtcCA9IDA7CisJfQorCisJaWYgKGJici0+bW9kZSA9PSBCQlJfUFJPQkVfUlRUKSB7CisJCS8qIElnbm9yZSBsb3cgcmF0ZSBzYW1wbGVzIGR1cmluZyB0aGlzIG1vZGUuICovCisJCXRwLT5hcHBfbGltaXRlZCA9CisJCQkodHAtPmRlbGl2ZXJlZCArIHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkpID8gOiAxOworCQkvKiBNYWludGFpbiBtaW4gcGFja2V0cyBpbiBmbGlnaHQgZm9yIG1heCgyMDAgbXMsIDEgcm91bmQpLiAqLworCQlpZiAoIWJici0+cHJvYmVfcnR0X2RvbmVfc3RhbXAgJiYKKwkJICAgIHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkgPD0gYmJyX2N3bmRfbWluX3RhcmdldCkgeworCQkJYmJyLT5wcm9iZV9ydHRfZG9uZV9zdGFtcCA9IHRjcF90aW1lX3N0YW1wICsKKwkJCQltc2Vjc190b19qaWZmaWVzKGJicl9wcm9iZV9ydHRfbW9kZV9tcyk7CisJCQliYnItPnByb2JlX3J0dF9yb3VuZF9kb25lID0gMDsKKwkJCWJici0+bmV4dF9ydHRfZGVsaXZlcmVkID0gdHAtPmRlbGl2ZXJlZDsKKwkJfSBlbHNlIGlmIChiYnItPnByb2JlX3J0dF9kb25lX3N0YW1wKSB7CisJCQlpZiAoYmJyLT5yb3VuZF9zdGFydCkKKwkJCQliYnItPnByb2JlX3J0dF9yb3VuZF9kb25lID0gMTsKKwkJCWlmIChiYnItPnByb2JlX3J0dF9yb3VuZF9kb25lICYmCisJCQkgICAgYWZ0ZXIodGNwX3RpbWVfc3RhbXAsIGJici0+cHJvYmVfcnR0X2RvbmVfc3RhbXApKSB7CisJCQkJYmJyLT5taW5fcnR0X3N0YW1wID0gdGNwX3RpbWVfc3RhbXA7CisJCQkJYmJyLT5yZXN0b3JlX2N3bmQgPSAxOyAgLyogc25hcCB0byBwcmlvcl9jd25kICovCisJCQkJYmJyX3Jlc2V0X21vZGUoc2spOworCQkJfQorCQl9CisJfQorCWJici0+aWRsZV9yZXN0YXJ0ID0gMDsKK30KKworc3RhdGljIHZvaWQgYmJyX3VwZGF0ZV9tb2RlbChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByYXRlX3NhbXBsZSAqcnMpCit7CisJYmJyX3VwZGF0ZV9idyhzaywgcnMpOworCWJicl91cGRhdGVfY3ljbGVfcGhhc2Uoc2ssIHJzKTsKKwliYnJfY2hlY2tfZnVsbF9id19yZWFjaGVkKHNrLCBycyk7CisJYmJyX2NoZWNrX2RyYWluKHNrLCBycyk7CisJYmJyX3VwZGF0ZV9taW5fcnR0KHNrLCBycyk7Cit9CisKK3N0YXRpYyB2b2lkIGJicl9tYWluKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJdTMyIGJ3OworCisJYmJyX3VwZGF0ZV9tb2RlbChzaywgcnMpOworCisJYncgPSBiYnJfYncoc2spOworCWJicl9zZXRfcGFjaW5nX3JhdGUoc2ssIGJ3LCBiYnItPnBhY2luZ19nYWluKTsKKwliYnJfc2V0X3Rzb19zZWdzX2dvYWwoc2spOworCWJicl9zZXRfY3duZChzaywgcnMsIHJzLT5hY2tlZF9zYWNrZWQsIGJ3LCBiYnItPmN3bmRfZ2Fpbik7Cit9CisKK3N0YXRpYyB2b2lkIGJicl9pbml0KHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgYmJyICpiYnIgPSBpbmV0X2Nza19jYShzayk7CisJdTY0IGJ3OworCisJYmJyLT5wcmlvcl9jd25kID0gMDsKKwliYnItPnRzb19zZWdzX2dvYWwgPSAwOwkgLyogZGVmYXVsdCBzZWdzIHBlciBza2IgdW50aWwgZmlyc3QgQUNLICovCisJYmJyLT5ydHRfY250ID0gMDsKKwliYnItPm5leHRfcnR0X2RlbGl2ZXJlZCA9IDA7CisJYmJyLT5wcmV2X2NhX3N0YXRlID0gVENQX0NBX09wZW47CisJYmJyLT5wYWNrZXRfY29uc2VydmF0aW9uID0gMDsKKworCWJici0+cHJvYmVfcnR0X2RvbmVfc3RhbXAgPSAwOworCWJici0+cHJvYmVfcnR0X3JvdW5kX2RvbmUgPSAwOworCWJici0+bWluX3J0dF91cyA9IHRjcF9taW5fcnR0KHRwKTsKKwliYnItPm1pbl9ydHRfc3RhbXAgPSB0Y3BfdGltZV9zdGFtcDsKKworCW1pbm1heF9yZXNldCgmYmJyLT5idywgYmJyLT5ydHRfY250LCAwKTsgIC8qIGluaXQgbWF4IGJ3IHRvIDAgKi8KKworCS8qIEluaXRpYWxpemUgcGFjaW5nIHJhdGUgdG86IGhpZ2hfZ2FpbiAqIGluaXRfY3duZCAvIFJUVC4gKi8KKwlidyA9ICh1NjQpdHAtPnNuZF9jd25kICogQldfVU5JVDsKKwlkb19kaXYoYncsICh0cC0+c3J0dF91cyA+PiAzKSA/IDogVVNFQ19QRVJfTVNFQyk7CisJc2stPnNrX3BhY2luZ19yYXRlID0gMDsJCS8qIGZvcmNlIGFuIHVwZGF0ZSBvZiBza19wYWNpbmdfcmF0ZSAqLworCWJicl9zZXRfcGFjaW5nX3JhdGUoc2ssIGJ3LCBiYnJfaGlnaF9nYWluKTsKKworCWJici0+cmVzdG9yZV9jd25kID0gMDsKKwliYnItPnJvdW5kX3N0YXJ0ID0gMDsKKwliYnItPmlkbGVfcmVzdGFydCA9IDA7CisJYmJyLT5mdWxsX2J3ID0gMDsKKwliYnItPmZ1bGxfYndfY250ID0gMDsKKwliYnItPmN5Y2xlX21zdGFtcC52NjQgPSAwOworCWJici0+Y3ljbGVfaWR4ID0gMDsKKwliYnJfcmVzZXRfbHRfYndfc2FtcGxpbmcoc2spOworCWJicl9yZXNldF9zdGFydHVwX21vZGUoc2spOworfQorCitzdGF0aWMgdTMyIGJicl9zbmRidWZfZXhwYW5kKHN0cnVjdCBzb2NrICpzaykKK3sKKwkvKiBQcm92aXNpb24gMyAqIGN3bmQgc2luY2UgQkJSIG1heSBzbG93LXN0YXJ0IGV2ZW4gZHVyaW5nIHJlY292ZXJ5LiAqLworCXJldHVybiAzOworfQorCisvKiBJbiB0aGVvcnkgQkJSIGRvZXMgbm90IG5lZWQgdG8gdW5kbyB0aGUgY3duZCBzaW5jZSBpdCBkb2VzIG5vdAorICogYWx3YXlzIHJlZHVjZSBjd25kIG9uIGxvc3NlcyAoc2VlIGJicl9tYWluKCkpLiBLZWVwIGl0IGZvciBub3cuCisgKi8KK3N0YXRpYyB1MzIgYmJyX3VuZG9fY3duZChzdHJ1Y3Qgc29jayAqc2spCit7CisJcmV0dXJuIHRjcF9zayhzayktPnNuZF9jd25kOworfQorCisvKiBFbnRlcmluZyBsb3NzIHJlY292ZXJ5LCBzbyBzYXZlIGN3bmQgZm9yIHdoZW4gd2UgZXhpdCBvciB1bmRvIHJlY292ZXJ5LiAqLworc3RhdGljIHUzMiBiYnJfc3N0aHJlc2goc3RydWN0IHNvY2sgKnNrKQoreworCWJicl9zYXZlX2N3bmQoc2spOworCXJldHVybiBUQ1BfSU5GSU5JVEVfU1NUSFJFU0g7CSAvKiBCQlIgZG9lcyBub3QgdXNlIHNzdGhyZXNoICovCit9CisKK3N0YXRpYyBzaXplX3QgYmJyX2dldF9pbmZvKHN0cnVjdCBzb2NrICpzaywgdTMyIGV4dCwgaW50ICphdHRyLAorCQkJICAgdW5pb24gdGNwX2NjX2luZm8gKmluZm8pCit7CisJaWYgKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfQkJSSU5GTyAtIDEpKSB8fAorCSAgICBleHQgJiAoMSA8PCAoSU5FVF9ESUFHX1ZFR0FTSU5GTyAtIDEpKSkgeworCQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwkJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCQl1NjQgYncgPSBiYnJfYncoc2spOworCisJCWJ3ID0gYncgKiB0cC0+bXNzX2NhY2hlICogVVNFQ19QRVJfU0VDID4+IEJXX1NDQUxFOworCQltZW1zZXQoJmluZm8tPmJiciwgMCwgc2l6ZW9mKGluZm8tPmJicikpOworCQlpbmZvLT5iYnIuYmJyX2J3X2xvCQk9ICh1MzIpYnc7CisJCWluZm8tPmJici5iYnJfYndfaGkJCT0gKHUzMikoYncgPj4gMzIpOworCQlpbmZvLT5iYnIuYmJyX21pbl9ydHQJCT0gYmJyLT5taW5fcnR0X3VzOworCQlpbmZvLT5iYnIuYmJyX3BhY2luZ19nYWluCT0gYmJyLT5wYWNpbmdfZ2FpbjsKKwkJaW5mby0+YmJyLmJicl9jd25kX2dhaW4JCT0gYmJyLT5jd25kX2dhaW47CisJCSphdHRyID0gSU5FVF9ESUFHX0JCUklORk87CisJCXJldHVybiBzaXplb2YoaW5mby0+YmJyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJicl9zZXRfc3RhdGUoc3RydWN0IHNvY2sgKnNrLCB1OCBuZXdfc3RhdGUpCit7CisJc3RydWN0IGJiciAqYmJyID0gaW5ldF9jc2tfY2Eoc2spOworCisJaWYgKG5ld19zdGF0ZSA9PSBUQ1BfQ0FfTG9zcykgeworCQlzdHJ1Y3QgcmF0ZV9zYW1wbGUgcnMgPSB7IC5sb3NzZXMgPSAxIH07CisKKwkJYmJyLT5wcmV2X2NhX3N0YXRlID0gVENQX0NBX0xvc3M7CisJCWJici0+ZnVsbF9idyA9IDA7CisJCWJici0+cm91bmRfc3RhcnQgPSAxOwkvKiB0cmVhdCBSVE8gbGlrZSBlbmQgb2YgYSByb3VuZCAqLworCQliYnJfbHRfYndfc2FtcGxpbmcoc2ssICZycyk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB0Y3BfYmJyX2Nvbmdfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CisJLmZsYWdzCQk9IFRDUF9DT05HX05PTl9SRVNUUklDVEVELAorCS5uYW1lCQk9ICJiYnIiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5pdAkJPSBiYnJfaW5pdCwKKwkuY29uZ19jb250cm9sCT0gYmJyX21haW4sCisJLnNuZGJ1Zl9leHBhbmQJPSBiYnJfc25kYnVmX2V4cGFuZCwKKwkudW5kb19jd25kCT0gYmJyX3VuZG9fY3duZCwKKwkuY3duZF9ldmVudAk9IGJicl9jd25kX2V2ZW50LAorCS5zc3RocmVzaAk9IGJicl9zc3RocmVzaCwKKwkudHNvX3NlZ3NfZ29hbAk9IGJicl90c29fc2Vnc19nb2FsLAorCS5nZXRfaW5mbwk9IGJicl9nZXRfaW5mbywKKwkuc2V0X3N0YXRlCT0gYmJyX3NldF9zdGF0ZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJicl9yZWdpc3Rlcih2b2lkKQoreworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGJicikgPiBJQ1NLX0NBX1BSSVZfU0laRSk7CisJcmV0dXJuIHRjcF9yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJnRjcF9iYnJfY29uZ19vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYmJyX3VucmVnaXN0ZXIodm9pZCkKK3sKKwl0Y3BfdW5yZWdpc3Rlcl9jb25nZXN0aW9uX2NvbnRyb2woJnRjcF9iYnJfY29uZ19vcHMpOworfQorCittb2R1bGVfaW5pdChiYnJfcmVnaXN0ZXIpOworbW9kdWxlX2V4aXQoYmJyX3VucmVnaXN0ZXIpOworCitNT0RVTEVfQVVUSE9SKCJWYW4gSmFjb2Jzb24gPHZhbmpAZ29vZ2xlLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIk5lYWwgQ2FyZHdlbGwgPG5jYXJkd2VsbEBnb29nbGUuY29tPiIpOworTU9EVUxFX0FVVEhPUigiWXVjaHVuZyBDaGVuZyA8eWNoZW5nQGdvb2dsZS5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJTb2hlaWwgSGFzc2FzIFllZ2FuZWggPHNvaGVpbEBnb29nbGUuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUQ1AgQkJSIChCb3R0bGVuZWNrIEJhbmR3aWR0aCBhbmQgUlRUKSIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2NkZy5jIGIvbmV0L2lwdjQvdGNwX2NkZy5jCmluZGV4IDAzNzI1YjIuLjM1YjI4MDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9jZGcuYworKysgYi9uZXQvaXB2NC90Y3BfY2RnLmMKQEAgLTU2LDcgKzU2LDcgQEAKIG1vZHVsZV9wYXJhbSh1c2VfdG9sZXJhbmNlLCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModXNlX3RvbGVyYW5jZSwgInVzZSBsb3NzIHRvbGVyYW5jZSBoZXVyaXN0aWMiKTsKIAotc3RydWN0IG1pbm1heCB7CitzdHJ1Y3QgY2RnX21pbm1heCB7CiAJdW5pb24gewogCQlzdHJ1Y3QgewogCQkJczMyIG1pbjsKQEAgLTc0LDEwICs3NCwxMCBAQAogfTsKIAogc3RydWN0IGNkZyB7Ci0Jc3RydWN0IG1pbm1heCBydHQ7Ci0Jc3RydWN0IG1pbm1heCBydHRfcHJldjsKLQlzdHJ1Y3QgbWlubWF4ICpncmFkaWVudHM7Ci0Jc3RydWN0IG1pbm1heCBnc3VtOworCXN0cnVjdCBjZGdfbWlubWF4IHJ0dDsKKwlzdHJ1Y3QgY2RnX21pbm1heCBydHRfcHJldjsKKwlzdHJ1Y3QgY2RnX21pbm1heCAqZ3JhZGllbnRzOworCXN0cnVjdCBjZGdfbWlubWF4IGdzdW07CiAJYm9vbCBnZmlsbGVkOwogCXU4ICB0YWlsOwogCXU4ICBzdGF0ZTsKQEAgLTM1Myw3ICszNTMsNyBAQAogewogCXN0cnVjdCBjZGcgKmNhID0gaW5ldF9jc2tfY2Eoc2spOwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCXN0cnVjdCBtaW5tYXggKmdyYWRpZW50czsKKwlzdHJ1Y3QgY2RnX21pbm1heCAqZ3JhZGllbnRzOwogCiAJc3dpdGNoIChldikgewogCWNhc2UgQ0FfRVZFTlRfQ1dORF9SRVNUQVJUOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2NvbmcuYyBiL25ldC9pcHY0L3RjcF9jb25nLmMKaW5kZXggODgyY2FhNC4uMTI5NGFmNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2NvbmcuYworKysgYi9uZXQvaXB2NC90Y3BfY29uZy5jCkBAIC02OSw3ICs2OSw3IEBACiAJaW50IHJldCA9IDA7CiAKIAkvKiBhbGwgYWxnb3JpdGhtcyBtdXN0IGltcGxlbWVudCBzc3RocmVzaCBhbmQgY29uZ19hdm9pZCBvcHMgKi8KLQlpZiAoIWNhLT5zc3RocmVzaCB8fCAhY2EtPmNvbmdfYXZvaWQpIHsKKwlpZiAoIWNhLT5zc3RocmVzaCB8fCAhKGNhLT5jb25nX2F2b2lkIHx8IGNhLT5jb25nX2NvbnRyb2wpKSB7CiAJCXByX2VycigiJXMgZG9lcyBub3QgaW1wbGVtZW50IHJlcXVpcmVkIG9wc1xuIiwgY2EtPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfZGlhZy5jIGIvbmV0L2lwdjQvdGNwX2RpYWcuYwppbmRleCA0ZDYxMDkzLi5hNzQ4Yzc0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfZGlhZy5jCisrKyBiL25ldC9pcHY0L3RjcF9kaWFnLmMKQEAgLTU0LDExICs1NCwxNiBAQAogewogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KGluX3NrYi0+c2spOwogCXN0cnVjdCBzb2NrICpzayA9IGluZXRfZGlhZ19maW5kX29uZV9pY3NrKG5ldCwgJnRjcF9oYXNoaW5mbywgcmVxKTsKKwlpbnQgZXJyOwogCiAJaWYgKElTX0VSUihzaykpCiAJCXJldHVybiBQVFJfRVJSKHNrKTsKIAotCXJldHVybiBzb2NrX2RpYWdfZGVzdHJveShzaywgRUNPTk5BQk9SVEVEKTsKKwllcnIgPSBzb2NrX2RpYWdfZGVzdHJveShzaywgRUNPTk5BQk9SVEVEKTsKKworCXNvY2tfZ2VuX3B1dChzayk7CisKKwlyZXR1cm4gZXJyOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9mYXN0b3Blbi5jIGIvbmV0L2lwdjQvdGNwX2Zhc3RvcGVuLmMKaW5kZXggNTRkOWY5Yi4uNGU3NzdhMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2Zhc3RvcGVuLmMKKysrIGIvbmV0L2lwdjQvdGNwX2Zhc3RvcGVuLmMKQEAgLTE1MCw2ICsxNTAsNyBAQAogCXRwLT5zZWdzX2luID0gMDsKIAl0Y3Bfc2Vnc19pbih0cCwgc2tiKTsKIAlfX3NrYl9wdWxsKHNrYiwgdGNwX2hkcmxlbihza2IpKTsKKwlza19mb3JjZWRfbWVtX3NjaGVkdWxlKHNrLCBza2ItPnRydWVzaXplKTsKIAlza2Jfc2V0X293bmVyX3Ioc2tiLCBzayk7CiAKIAlUQ1BfU0tCX0NCKHNrYiktPnNlcSsrOwpAQCAtMjI2LDYgKzIyNyw3IEBACiAJdGNwX2Zhc3RvcGVuX2FkZF9za2IoY2hpbGQsIHNrYik7CiAKIAl0Y3BfcnNrKHJlcSktPnJjdl9ueHQgPSB0cC0+cmN2X254dDsKKwl0cC0+cmN2X3d1cCA9IHRwLT5yY3Zfbnh0OwogCS8qIHRjcF9jb25uX3JlcXVlc3QoKSBpcyBzZW5kaW5nIHRoZSBTWU5BQ0ssCiAJICogYW5kIHF1ZXVlcyB0aGUgY2hpbGQgaW50byBsaXN0ZW5lciBhY2NlcHQgcXVldWUuCiAJICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaW5wdXQuYyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCmluZGV4IDNlYmY0NWIuLmEyN2I5YzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCkBAIC0yODksNiArMjg5LDcgQEAKIHN0YXRpYyB2b2lkIHRjcF9zbmRidWZfZXhwYW5kKHN0cnVjdCBzb2NrICpzaykKIHsKIAljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwljb25zdCBzdHJ1Y3QgdGNwX2Nvbmdlc3Rpb25fb3BzICpjYV9vcHMgPSBpbmV0X2NzayhzayktPmljc2tfY2Ffb3BzOwogCWludCBzbmRtZW0sIHBlcl9tc3M7CiAJdTMyIG5yX3NlZ3M7CiAKQEAgLTMwOSw3ICszMTAsOCBAQAogCSAqIEN1YmljIG5lZWRzIDEuNyBmYWN0b3IsIHJvdW5kZWQgdG8gMiB0byBpbmNsdWRlCiAJICogZXh0cmEgY3VzaGlvbiAoYXBwbGljYXRpb24gbWlnaHQgcmVhY3Qgc2xvd2x5IHRvIFBPTExPVVQpCiAJICovCi0Jc25kbWVtID0gMiAqIG5yX3NlZ3MgKiBwZXJfbXNzOworCXNuZG1lbSA9IGNhX29wcy0+c25kYnVmX2V4cGFuZCA/IGNhX29wcy0+c25kYnVmX2V4cGFuZChzaykgOiAyOworCXNuZG1lbSAqPSBucl9zZWdzICogcGVyX21zczsKIAogCWlmIChzay0+c2tfc25kYnVmIDwgc25kbWVtKQogCQlzay0+c2tfc25kYnVmID0gbWluKHNuZG1lbSwgc3lzY3RsX3RjcF93bWVtWzJdKTsKQEAgLTg5OSwxMiArOTAxLDI5IEBACiAJCXRwLT5yZXRyYW5zbWl0X2hpZ2ggPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CiB9CiAKKy8qIFN1bSB0aGUgbnVtYmVyIG9mIHBhY2tldHMgb24gdGhlIHdpcmUgd2UgaGF2ZSBtYXJrZWQgYXMgbG9zdC4KKyAqIFRoZXJlIGFyZSB0d28gY2FzZXMgd2UgY2FyZSBhYm91dCBoZXJlOgorICogYSkgUGFja2V0IGhhc24ndCBiZWVuIG1hcmtlZCBsb3N0IChub3IgcmV0cmFuc21pdHRlZCksCisgKiAgICBhbmQgdGhpcyBpcyB0aGUgZmlyc3QgbG9zcy4KKyAqIGIpIFBhY2tldCBoYXMgYmVlbiBtYXJrZWQgYm90aCBsb3N0IGFuZCByZXRyYW5zbWl0dGVkLAorICogICAgYW5kIHRoaXMgbWVhbnMgd2UgdGhpbmsgaXQgd2FzIGxvc3QgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIHRjcF9zdW1fbG9zdChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggc2Fja2VkID0gVENQX1NLQl9DQihza2IpLT5zYWNrZWQ7CisKKwlpZiAoIShzYWNrZWQgJiBUQ1BDQl9MT1NUKSB8fAorCSAgICAoKHNhY2tlZCAmIFRDUENCX0xPU1QpICYmIChzYWNrZWQgJiBUQ1BDQl9TQUNLRURfUkVUUkFOUykpKQorCQl0cC0+bG9zdCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOworfQorCiBzdGF0aWMgdm9pZCB0Y3Bfc2tiX21hcmtfbG9zdChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWlmICghKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkICYgKFRDUENCX0xPU1R8VENQQ0JfU0FDS0VEX0FDS0VEKSkpIHsKIAkJdGNwX3ZlcmlmeV9yZXRyYW5zbWl0X2hpbnQodHAsIHNrYik7CiAKIAkJdHAtPmxvc3Rfb3V0ICs9IHRjcF9za2JfcGNvdW50KHNrYik7CisJCXRjcF9zdW1fbG9zdCh0cCwgc2tiKTsKIAkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgfD0gVENQQ0JfTE9TVDsKIAl9CiB9CkBAIC05MTMsNiArOTMyLDcgQEAKIHsKIAl0Y3BfdmVyaWZ5X3JldHJhbnNtaXRfaGludCh0cCwgc2tiKTsKIAorCXRjcF9zdW1fbG9zdCh0cCwgc2tiKTsKIAlpZiAoIShUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCAmIChUQ1BDQl9MT1NUfFRDUENCX1NBQ0tFRF9BQ0tFRCkpKSB7CiAJCXRwLT5sb3N0X291dCArPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwogCQlUQ1BfU0tCX0NCKHNrYiktPnNhY2tlZCB8PSBUQ1BDQl9MT1NUOwpAQCAtMTA5NCw2ICsxMTE0LDcgQEAKIAkgKi8KIAlzdHJ1Y3Qgc2tiX21zdGFtcCBmaXJzdF9zYWNrdDsKIAlzdHJ1Y3Qgc2tiX21zdGFtcCBsYXN0X3NhY2t0OworCXN0cnVjdCByYXRlX3NhbXBsZSAqcmF0ZTsKIAlpbnQJZmxhZzsKIH07CiAKQEAgLTEyNjEsNiArMTI4Miw3IEBACiAJdGNwX3NhY2t0YWdfb25lKHNrLCBzdGF0ZSwgVENQX1NLQl9DQihza2IpLT5zYWNrZWQsCiAJCQlzdGFydF9zZXEsIGVuZF9zZXEsIGR1cF9zYWNrLCBwY291bnQsCiAJCQkmc2tiLT5za2JfbXN0YW1wKTsKKwl0Y3BfcmF0ZV9za2JfZGVsaXZlcmVkKHNrLCBza2IsIHN0YXRlLT5yYXRlKTsKIAogCWlmIChza2IgPT0gdHAtPmxvc3Rfc2tiX2hpbnQpCiAJCXRwLT5sb3N0X2NudF9oaW50ICs9IHBjb3VudDsKQEAgLTEzMTEsNiArMTMzMyw5IEBACiAJCXRjcF9hZHZhbmNlX2hpZ2hlc3Rfc2Fjayhzaywgc2tiKTsKIAogCXRjcF9za2JfY29sbGFwc2VfdHN0YW1wKHByZXYsIHNrYik7CisJaWYgKHVubGlrZWx5KFRDUF9TS0JfQ0IocHJldiktPnR4LmRlbGl2ZXJlZF9tc3RhbXAudjY0KSkKKwkJVENQX1NLQl9DQihwcmV2KS0+dHguZGVsaXZlcmVkX21zdGFtcC52NjQgPSAwOworCiAJdGNwX3VubGlua193cml0ZV9xdWV1ZShza2IsIHNrKTsKIAlza193bWVtX2ZyZWVfc2tiKHNrLCBza2IpOwogCkBAIC0xNTQwLDYgKzE1NjUsNyBAQAogCQkJCQkJZHVwX3NhY2ssCiAJCQkJCQl0Y3Bfc2tiX3Bjb3VudChza2IpLAogCQkJCQkJJnNrYi0+c2tiX21zdGFtcCk7CisJCQl0Y3BfcmF0ZV9za2JfZGVsaXZlcmVkKHNrLCBza2IsIHN0YXRlLT5yYXRlKTsKIAogCQkJaWYgKCFiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsCiAJCQkJICAgIHRjcF9oaWdoZXN0X3NhY2tfc2VxKHRwKSkpCkBAIC0xNjIyLDggKzE2NDgsMTAgQEAKIAogCWZvdW5kX2R1cF9zYWNrID0gdGNwX2NoZWNrX2RzYWNrKHNrLCBhY2tfc2tiLCBzcF93aXJlLAogCQkJCQkgbnVtX3NhY2tzLCBwcmlvcl9zbmRfdW5hKTsKLQlpZiAoZm91bmRfZHVwX3NhY2spCisJaWYgKGZvdW5kX2R1cF9zYWNrKSB7CiAJCXN0YXRlLT5mbGFnIHw9IEZMQUdfRFNBQ0tJTkdfQUNLOworCQl0cC0+ZGVsaXZlcmVkKys7IC8qIEEgc3B1cmlvdXMgcmV0cmFuc21pc3Npb24gaXMgZGVsaXZlcmVkICovCisJfQogCiAJLyogRWxpbWluYXRlIHRvbyBvbGQgQUNLcywgYnV0IHRha2UgaW50bwogCSAqIGFjY291bnQgbW9yZSBvciBsZXNzIGZyZXNoIG9uZXMsIHRoZXkgY2FuCkBAIC0xODkwLDYgKzE5MTgsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJYm9vbCBuZXdfcmVjb3ZlcnkgPSBpY3NrLT5pY3NrX2NhX3N0YXRlIDwgVENQX0NBX1JlY292ZXJ5OwogCWJvb2wgaXNfcmVuZWc7CQkJLyogaXMgcmVjZWl2ZXIgcmVuZWdpbmcgb24gU0FDS3M/ICovCisJYm9vbCBtYXJrX2xvc3Q7CiAKIAkvKiBSZWR1Y2Ugc3N0aHJlc2ggaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGluc2lkZSB0aGlzIHdpbmRvdy4gKi8KIAlpZiAoaWNzay0+aWNza19jYV9zdGF0ZSA8PSBUQ1BfQ0FfRGlzb3JkZXIgfHwKQEAgLTE5MjMsOCArMTk1MiwxMiBAQAogCQlpZiAoc2tiID09IHRjcF9zZW5kX2hlYWQoc2spKQogCQkJYnJlYWs7CiAKKwkJbWFya19sb3N0ID0gKCEoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiBUQ1BDQl9TQUNLRURfQUNLRUQpIHx8CisJCQkgICAgIGlzX3JlbmVnKTsKKwkJaWYgKG1hcmtfbG9zdCkKKwkJCXRjcF9zdW1fbG9zdCh0cCwgc2tiKTsKIAkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJj0gKH5UQ1BDQl9UQUdCSVRTKXxUQ1BDQl9TQUNLRURfQUNLRUQ7Ci0JCWlmICghKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkJlRDUENCX1NBQ0tFRF9BQ0tFRCkgfHwgaXNfcmVuZWcpIHsKKwkJaWYgKG1hcmtfbG9zdCkgewogCQkJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJj0gflRDUENCX1NBQ0tFRF9BQ0tFRDsKIAkJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkIHw9IFRDUENCX0xPU1Q7CiAJCQl0cC0+bG9zdF9vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKQEAgLTIzMjksMTAgKzIzNjIsOSBAQAogCX0KICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWVsc2UgaWYgKHNrLT5za19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLQkJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCQlwcl9kZWJ1ZygiVW5kbyAlcyAlcEk2LyV1IGMldSBsJXUgc3MldS8ldSBwJXVcbiIsCiAJCQkgbXNnLAotCQkJICZucC0+ZGFkZHIsIG50b2hzKGluZXQtPmluZXRfZHBvcnQpLAorCQkJICZzay0+c2tfdjZfZGFkZHIsIG50b2hzKGluZXQtPmluZXRfZHBvcnQpLAogCQkJIHRwLT5zbmRfY3duZCwgdGNwX2xlZnRfb3V0KHRwKSwKIAkJCSB0cC0+c25kX3NzdGhyZXNoLCB0cC0+cHJpb3Jfc3N0aHJlc2gsCiAJCQkgdHAtPnBhY2tldHNfb3V0KTsKQEAgLTI1MDMsNiArMjUzNSw5IEBACiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAKKwlpZiAoaW5ldF9jc2soc2spLT5pY3NrX2NhX29wcy0+Y29uZ19jb250cm9sKQorCQlyZXR1cm47CisKIAkvKiBSZXNldCBjd25kIHRvIHNzdGhyZXNoIGluIENXUiBvciBSZWNvdmVyeSAodW5sZXNzIGl0J3MgdW5kb25lKSAqLwogCWlmIChpbmV0X2NzayhzayktPmljc2tfY2Ffc3RhdGUgPT0gVENQX0NBX0NXUiB8fAogCSAgICAodHAtPnVuZG9fbWFya2VyICYmIHRwLT5zbmRfc3N0aHJlc2ggPCBUQ1BfSU5GSU5JVEVfU1NUSFJFU0gpKSB7CkBAIC0yODc5LDY3ICsyOTE0LDEzIEBACiAJKnJleG1pdCA9IFJFWE1JVF9MT1NUOwogfQogCi0vKiBLYXRobGVlbiBOaWNob2xzJyBhbGdvcml0aG0gZm9yIHRyYWNraW5nIHRoZSBtaW5pbXVtIHZhbHVlIG9mCi0gKiBhIGRhdGEgc3RyZWFtIG92ZXIgc29tZSBmaXhlZCB0aW1lIGludGVydmFsLiAoRS5nLiwgdGhlIG1pbmltdW0KLSAqIFJUVCBvdmVyIHRoZSBwYXN0IGZpdmUgbWludXRlcy4pIEl0IHVzZXMgY29uc3RhbnQgc3BhY2UgYW5kIGNvbnN0YW50Ci0gKiB0aW1lIHBlciB1cGRhdGUgeWV0IGFsbW9zdCBhbHdheXMgZGVsaXZlcnMgdGhlIHNhbWUgbWluaW11bSBhcyBhbgotICogaW1wbGVtZW50YXRpb24gdGhhdCBoYXMgdG8ga2VlcCBhbGwgdGhlIGRhdGEgaW4gdGhlIHdpbmRvdy4KLSAqCi0gKiBUaGUgYWxnb3JpdGhtIGtlZXBzIHRyYWNrIG9mIHRoZSBiZXN0LCAybmQgYmVzdCAmIDNyZCBiZXN0IG1pbgotICogdmFsdWVzLCBtYWludGFpbmluZyBhbiBpbnZhcmlhbnQgdGhhdCB0aGUgbWVhc3VyZW1lbnQgdGltZSBvZiB0aGUKLSAqIG4ndGggYmVzdCA+PSBuLTEndGggYmVzdC4gSXQgYWxzbyBtYWtlcyBzdXJlIHRoYXQgdGhlIHRocmVlIHZhbHVlcwotICogYXJlIHdpZGVseSBzZXBhcmF0ZWQgaW4gdGhlIHRpbWUgd2luZG93IHNpbmNlIHRoYXQgYm91bmRzIHRoZSB3b3JzZQotICogY2FzZSBlcnJvciB3aGVuIHRoYXQgZGF0YSBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgb3ZlciB0aGUgd2luZG93LgotICoKLSAqIFVwb24gZ2V0dGluZyBhIG5ldyBtaW4sIHdlIGNhbiBmb3JnZXQgZXZlcnl0aGluZyBlYXJsaWVyIGJlY2F1c2UgaXQKLSAqIGhhcyBubyB2YWx1ZSAtIHRoZSBuZXcgbWluIGlzIDw9IGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgd2luZG93IGJ5Ci0gKiBkZWZpbml0aW9uIGFuZCBpdCdzIHRoZSBtb3N0IHJlY2VudC4gU28gd2UgcmVzdGFydCBmcmVzaCBvbiBldmVyeSBuZXcgbWluCi0gKiBhbmQgb3ZlcndyaXRlcyAybmQgJiAzcmQgY2hvaWNlcy4gVGhlIHNhbWUgcHJvcGVydHkgaG9sZHMgZm9yIDJuZCAmIDNyZAotICogYmVzdC4KLSAqLwogc3RhdGljIHZvaWQgdGNwX3VwZGF0ZV9ydHRfbWluKHN0cnVjdCBzb2NrICpzaywgdTMyIHJ0dF91cykKIHsKLQljb25zdCB1MzIgbm93ID0gdGNwX3RpbWVfc3RhbXAsIHdsZW4gPSBzeXNjdGxfdGNwX21pbl9ydHRfd2xlbiAqIEhaOwotCXN0cnVjdCBydHRfbWVhcyAqbSA9IHRjcF9zayhzayktPnJ0dF9taW47Ci0Jc3RydWN0IHJ0dF9tZWFzIHJ0dG0gPSB7Ci0JCS5ydHQgPSBsaWtlbHkocnR0X3VzKSA/IHJ0dF91cyA6IGppZmZpZXNfdG9fdXNlY3MoMSksCi0JCS50cyA9IG5vdywKLQl9OwotCXUzMiBlbGFwc2VkOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXUzMiB3bGVuID0gc3lzY3RsX3RjcF9taW5fcnR0X3dsZW4gKiBIWjsKIAotCS8qIENoZWNrIGlmIHRoZSBuZXcgbWVhc3VyZW1lbnQgdXBkYXRlcyB0aGUgMXN0LCAybmQsIG9yIDNyZCBjaG9pY2VzICovCi0JaWYgKHVubGlrZWx5KHJ0dG0ucnR0IDw9IG1bMF0ucnR0KSkKLQkJbVswXSA9IG1bMV0gPSBtWzJdID0gcnR0bTsKLQllbHNlIGlmIChydHRtLnJ0dCA8PSBtWzFdLnJ0dCkKLQkJbVsxXSA9IG1bMl0gPSBydHRtOwotCWVsc2UgaWYgKHJ0dG0ucnR0IDw9IG1bMl0ucnR0KQotCQltWzJdID0gcnR0bTsKLQotCWVsYXBzZWQgPSBub3cgLSBtWzBdLnRzOwotCWlmICh1bmxpa2VseShlbGFwc2VkID4gd2xlbikpIHsKLQkJLyogUGFzc2VkIGVudGlyZSB3aW5kb3cgd2l0aG91dCBhIG5ldyBtaW4gc28gbWFrZSAybmQgY2hvaWNlCi0JCSAqIHRoZSBuZXcgbWluICYgM3JkIGNob2ljZSB0aGUgbmV3IDJuZC4gU28gZm9ydGggYW5kIHNvIG9uLgotCQkgKi8KLQkJbVswXSA9IG1bMV07Ci0JCW1bMV0gPSBtWzJdOwotCQltWzJdID0gcnR0bTsKLQkJaWYgKG5vdyAtIG1bMF0udHMgPiB3bGVuKSB7Ci0JCQltWzBdID0gbVsxXTsKLQkJCW1bMV0gPSBydHRtOwotCQkJaWYgKG5vdyAtIG1bMF0udHMgPiB3bGVuKQotCQkJCW1bMF0gPSBydHRtOwotCQl9Ci0JfSBlbHNlIGlmIChtWzFdLnRzID09IG1bMF0udHMgJiYgZWxhcHNlZCA+IHdsZW4gLyA0KSB7Ci0JCS8qIFBhc3NlZCBhIHF1YXJ0ZXIgb2YgdGhlIHdpbmRvdyB3aXRob3V0IGEgbmV3IG1pbiBzbwotCQkgKiB0YWtlIDJuZCBjaG9pY2UgZnJvbSB0aGUgMm5kIHF1YXJ0ZXIgb2YgdGhlIHdpbmRvdy4KLQkJICovCi0JCW1bMl0gPSBtWzFdID0gcnR0bTsKLQl9IGVsc2UgaWYgKG1bMl0udHMgPT0gbVsxXS50cyAmJiBlbGFwc2VkID4gd2xlbiAvIDIpIHsKLQkJLyogUGFzc2VkIGhhbGYgdGhlIHdpbmRvdyB3aXRob3V0IGEgbmV3IG1pbiBzbyB0YWtlIHRoZSAzcmQKLQkJICogY2hvaWNlIGZyb20gdGhlIGxhc3QgaGFsZiBvZiB0aGUgd2luZG93LgotCQkgKi8KLQkJbVsyXSA9IHJ0dG07Ci0JfQorCW1pbm1heF9ydW5uaW5nX21pbigmdHAtPnJ0dF9taW4sIHdsZW4sIHRjcF90aW1lX3N0YW1wLAorCQkJICAgcnR0X3VzID8gOiBqaWZmaWVzX3RvX3VzZWNzKDEpKTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIHRjcF9hY2tfdXBkYXRlX3J0dChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IGludCBmbGFnLApAQCAtMzEwMiwxMCArMzA4MywxMSBAQAogICovCiBzdGF0aWMgaW50IHRjcF9jbGVhbl9ydHhfcXVldWUoc3RydWN0IHNvY2sgKnNrLCBpbnQgcHJpb3JfZmFja2V0cywKIAkJCSAgICAgICB1MzIgcHJpb3Jfc25kX3VuYSwgaW50ICphY2tlZCwKLQkJCSAgICAgICBzdHJ1Y3QgdGNwX3NhY2t0YWdfc3RhdGUgKnNhY2spCisJCQkgICAgICAgc3RydWN0IHRjcF9zYWNrdGFnX3N0YXRlICpzYWNrLAorCQkJICAgICAgIHN0cnVjdCBza2JfbXN0YW1wICpub3cpCiB7CiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwotCXN0cnVjdCBza2JfbXN0YW1wIGZpcnN0X2Fja3QsIGxhc3RfYWNrdCwgbm93OworCXN0cnVjdCBza2JfbXN0YW1wIGZpcnN0X2Fja3QsIGxhc3RfYWNrdDsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAl1MzIgcHJpb3Jfc2Fja2VkID0gdHAtPnNhY2tlZF9vdXQ7CiAJdTMyIHJlb3JkID0gdHAtPnBhY2tldHNfb3V0OwpAQCAtMzEzNyw3ICszMTE5LDYgQEAKIAkJCWFja2VkX3Bjb3VudCA9IHRjcF90c29fYWNrZWQoc2ssIHNrYik7CiAJCQlpZiAoIWFja2VkX3Bjb3VudCkKIAkJCQlicmVhazsKLQogCQkJZnVsbHlfYWNrZWQgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCS8qIFNwZWVkdXAgdGNwX3VubGlua193cml0ZV9xdWV1ZSgpIGFuZCBuZXh0IGxvb3AgKi8KQEAgLTMxNzMsNiArMzE1NCw3IEBACiAKIAkJdHAtPnBhY2tldHNfb3V0IC09IGFja2VkX3Bjb3VudDsKIAkJcGt0c19hY2tlZCArPSBhY2tlZF9wY291bnQ7CisJCXRjcF9yYXRlX3NrYl9kZWxpdmVyZWQoc2ssIHNrYiwgc2Fjay0+cmF0ZSk7CiAKIAkJLyogSW5pdGlhbCBvdXRnb2luZyBTWU4ncyBnZXQgcHV0IG9udG8gdGhlIHdyaXRlX3F1ZXVlCiAJCSAqIGp1c3QgbGlrZSBhbnl0aGluZyBlbHNlIHdlIHRyYW5zbWl0LiAgSXQgaXMgbm90CkBAIC0zMjA1LDE2ICszMTg3LDE1IEBACiAJaWYgKHNrYiAmJiAoVENQX1NLQl9DQihza2IpLT5zYWNrZWQgJiBUQ1BDQl9TQUNLRURfQUNLRUQpKQogCQlmbGFnIHw9IEZMQUdfU0FDS19SRU5FR0lORzsKIAotCXNrYl9tc3RhbXBfZ2V0KCZub3cpOwogCWlmIChsaWtlbHkoZmlyc3RfYWNrdC52NjQpICYmICEoZmxhZyAmIEZMQUdfUkVUUkFOU19EQVRBX0FDS0VEKSkgewotCQlzZXFfcnR0X3VzID0gc2tiX21zdGFtcF91c19kZWx0YSgmbm93LCAmZmlyc3RfYWNrdCk7Ci0JCWNhX3J0dF91cyA9IHNrYl9tc3RhbXBfdXNfZGVsdGEoJm5vdywgJmxhc3RfYWNrdCk7CisJCXNlcV9ydHRfdXMgPSBza2JfbXN0YW1wX3VzX2RlbHRhKG5vdywgJmZpcnN0X2Fja3QpOworCQljYV9ydHRfdXMgPSBza2JfbXN0YW1wX3VzX2RlbHRhKG5vdywgJmxhc3RfYWNrdCk7CiAJfQogCWlmIChzYWNrLT5maXJzdF9zYWNrdC52NjQpIHsKLQkJc2Fja19ydHRfdXMgPSBza2JfbXN0YW1wX3VzX2RlbHRhKCZub3csICZzYWNrLT5maXJzdF9zYWNrdCk7Ci0JCWNhX3J0dF91cyA9IHNrYl9tc3RhbXBfdXNfZGVsdGEoJm5vdywgJnNhY2stPmxhc3Rfc2Fja3QpOworCQlzYWNrX3J0dF91cyA9IHNrYl9tc3RhbXBfdXNfZGVsdGEobm93LCAmc2Fjay0+Zmlyc3Rfc2Fja3QpOworCQljYV9ydHRfdXMgPSBza2JfbXN0YW1wX3VzX2RlbHRhKG5vdywgJnNhY2stPmxhc3Rfc2Fja3QpOwogCX0KLQorCXNhY2stPnJhdGUtPnJ0dF91cyA9IGNhX3J0dF91czsgLyogUlRUIG9mIGxhc3QgKFMpQUNLZWQgcGFja2V0LCBvciAtMSAqLwogCXJ0dF91cGRhdGUgPSB0Y3BfYWNrX3VwZGF0ZV9ydHQoc2ssIGZsYWcsIHNlcV9ydHRfdXMsIHNhY2tfcnR0X3VzLAogCQkJCQljYV9ydHRfdXMpOwogCkBAIC0zMjQyLDcgKzMyMjMsNyBAQAogCQl0cC0+ZmFja2V0c19vdXQgLT0gbWluKHBrdHNfYWNrZWQsIHRwLT5mYWNrZXRzX291dCk7CiAKIAl9IGVsc2UgaWYgKHNrYiAmJiBydHRfdXBkYXRlICYmIHNhY2tfcnR0X3VzID49IDAgJiYKLQkJICAgc2Fja19ydHRfdXMgPiBza2JfbXN0YW1wX3VzX2RlbHRhKCZub3csICZza2ItPnNrYl9tc3RhbXApKSB7CisJCSAgIHNhY2tfcnR0X3VzID4gc2tiX21zdGFtcF91c19kZWx0YShub3csICZza2ItPnNrYl9tc3RhbXApKSB7CiAJCS8qIERvIG5vdCByZS1hcm0gUlRPIGlmIHRoZSBzYWNrIFJUVCBpcyBtZWFzdXJlZCBmcm9tIGRhdGEgc2VudAogCQkgKiBhZnRlciB3aGVuIHRoZSBoZWFkIHdhcyBsYXN0IChyZSl0cmFuc21pdHRlZC4gT3RoZXJ3aXNlIHRoZQogCQkgKiB0aW1lb3V0IG1heSBjb250aW51ZSB0byBleHRlbmQgaW4gbG9zcyByZWNvdmVyeS4KQEAgLTMzMzMsOCArMzMxNCwxNSBAQAogICogaW5mb3JtYXRpb24uIEFsbCB0cmFuc21pc3Npb24gb3IgcmV0cmFuc21pc3Npb24gYXJlIGRlbGF5ZWQgYWZ0ZXJ3YXJkcy4KICAqLwogc3RhdGljIHZvaWQgdGNwX2NvbmdfY29udHJvbChzdHJ1Y3Qgc29jayAqc2ssIHUzMiBhY2ssIHUzMiBhY2tlZF9zYWNrZWQsCi0JCQkgICAgIGludCBmbGFnKQorCQkJICAgICBpbnQgZmxhZywgY29uc3Qgc3RydWN0IHJhdGVfc2FtcGxlICpycykKIHsKKwljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CisKKwlpZiAoaWNzay0+aWNza19jYV9vcHMtPmNvbmdfY29udHJvbCkgeworCQlpY3NrLT5pY3NrX2NhX29wcy0+Y29uZ19jb250cm9sKHNrLCBycyk7CisJCXJldHVybjsKKwl9CisKIAlpZiAodGNwX2luX2N3bmRfcmVkdWN0aW9uKHNrKSkgewogCQkvKiBSZWR1Y2UgY3duZCBpZiBzdGF0ZSBtYW5kYXRlcyAqLwogCQl0Y3BfY3duZF9yZWR1Y3Rpb24oc2ssIGFja2VkX3NhY2tlZCwgZmxhZyk7CkBAIC0zNTc5LDE3ICszNTY3LDIxIEBACiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCB0Y3Bfc2Fja3RhZ19zdGF0ZSBzYWNrX3N0YXRlOworCXN0cnVjdCByYXRlX3NhbXBsZSBycyA9IHsgLnByaW9yX2RlbGl2ZXJlZCA9IDAgfTsKIAl1MzIgcHJpb3Jfc25kX3VuYSA9IHRwLT5zbmRfdW5hOwogCXUzMiBhY2tfc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXE7CiAJdTMyIGFjayA9IFRDUF9TS0JfQ0Ioc2tiKS0+YWNrX3NlcTsKIAlib29sIGlzX2R1cGFjayA9IGZhbHNlOwogCXUzMiBwcmlvcl9mYWNrZXRzOwogCWludCBwcmlvcl9wYWNrZXRzID0gdHAtPnBhY2tldHNfb3V0OwotCXUzMiBwcmlvcl9kZWxpdmVyZWQgPSB0cC0+ZGVsaXZlcmVkOworCXUzMiBkZWxpdmVyZWQgPSB0cC0+ZGVsaXZlcmVkOworCXUzMiBsb3N0ID0gdHAtPmxvc3Q7CiAJaW50IGFja2VkID0gMDsgLyogTnVtYmVyIG9mIHBhY2tldHMgbmV3bHkgYWNrZWQgKi8KIAlpbnQgcmV4bWl0ID0gUkVYTUlUX05PTkU7IC8qIEZsYWcgdG8gKHJlKXRyYW5zbWl0IHRvIHJlY292ZXIgbG9zc2VzICovCisJc3RydWN0IHNrYl9tc3RhbXAgbm93OwogCiAJc2Fja19zdGF0ZS5maXJzdF9zYWNrdC52NjQgPSAwOworCXNhY2tfc3RhdGUucmF0ZSA9ICZyczsKIAogCS8qIFdlIHZlcnkgbGlrZWx5IHdpbGwgbmVlZCB0byBhY2Nlc3Mgd3JpdGUgcXVldWUgaGVhZC4gKi8KIAlwcmVmZXRjaHcoc2stPnNrX3dyaXRlX3F1ZXVlLm5leHQpOwpAQCAtMzYxMiw2ICszNjA0LDggQEAKIAlpZiAoYWZ0ZXIoYWNrLCB0cC0+c25kX254dCkpCiAJCWdvdG8gaW52YWxpZF9hY2s7CiAKKwlza2JfbXN0YW1wX2dldCgmbm93KTsKKwogCWlmIChpY3NrLT5pY3NrX3BlbmRpbmcgPT0gSUNTS19USU1FX0VBUkxZX1JFVFJBTlMgfHwKIAkgICAgaWNzay0+aWNza19wZW5kaW5nID09IElDU0tfVElNRV9MT1NTX1BST0JFKQogCQl0Y3BfcmVhcm1fcnRvKHNrKTsKQEAgLTM2MjIsNiArMzYxNiw3IEBACiAJfQogCiAJcHJpb3JfZmFja2V0cyA9IHRwLT5mYWNrZXRzX291dDsKKwlycy5wcmlvcl9pbl9mbGlnaHQgPSB0Y3BfcGFja2V0c19pbl9mbGlnaHQodHApOwogCiAJLyogdHNfcmVjZW50IHVwZGF0ZSBtdXN0IGJlIG1hZGUgYWZ0ZXIgd2UgYXJlIHN1cmUgdGhhdCB0aGUgcGFja2V0CiAJICogaXMgaW4gd2luZG93LgpAQCAtMzY3Nyw3ICszNjcyLDcgQEAKIAogCS8qIFNlZSBpZiB3ZSBjYW4gdGFrZSBhbnl0aGluZyBvZmYgb2YgdGhlIHJldHJhbnNtaXQgcXVldWUuICovCiAJZmxhZyB8PSB0Y3BfY2xlYW5fcnR4X3F1ZXVlKHNrLCBwcmlvcl9mYWNrZXRzLCBwcmlvcl9zbmRfdW5hLCAmYWNrZWQsCi0JCQkJICAgICZzYWNrX3N0YXRlKTsKKwkJCQkgICAgJnNhY2tfc3RhdGUsICZub3cpOwogCiAJaWYgKHRjcF9hY2tfaXNfZHViaW91cyhzaywgZmxhZykpIHsKIAkJaXNfZHVwYWNrID0gIShmbGFnICYgKEZMQUdfU05EX1VOQV9BRFZBTkNFRCB8IEZMQUdfTk9UX0RVUCkpOwpAQCAtMzY5NCw3ICszNjg5LDEwIEBACiAKIAlpZiAoaWNzay0+aWNza19wZW5kaW5nID09IElDU0tfVElNRV9SRVRSQU5TKQogCQl0Y3Bfc2NoZWR1bGVfbG9zc19wcm9iZShzayk7Ci0JdGNwX2NvbmdfY29udHJvbChzaywgYWNrLCB0cC0+ZGVsaXZlcmVkIC0gcHJpb3JfZGVsaXZlcmVkLCBmbGFnKTsKKwlkZWxpdmVyZWQgPSB0cC0+ZGVsaXZlcmVkIC0gZGVsaXZlcmVkOwkvKiBmcmVzaGx5IEFDS2VkIG9yIFNBQ0tlZCAqLworCWxvc3QgPSB0cC0+bG9zdCAtIGxvc3Q7CQkJLyogZnJlc2hseSBtYXJrZWQgbG9zdCAqLworCXRjcF9yYXRlX2dlbihzaywgZGVsaXZlcmVkLCBsb3N0LCAmbm93LCAmcnMpOworCXRjcF9jb25nX2NvbnRyb2woc2ssIGFjaywgZGVsaXZlcmVkLCBmbGFnLCAmcnMpOwogCXRjcF94bWl0X3JlY292ZXJ5KHNrLCByZXhtaXQpOwogCXJldHVybiAxOwogCkBAIC00MTA4LDcgKzQxMDYsNyBAQAogCS8qIEl0IF9pc18gcG9zc2libGUsIHRoYXQgd2UgaGF2ZSBzb21ldGhpbmcgb3V0LW9mLW9yZGVyIF9hZnRlcl8gRklOLgogCSAqIFByb2JhYmx5LCB3ZSBzaG91bGQgcmVzZXQgaW4gdGhpcyBjYXNlLiBGb3Igbm93IGRyb3AgdGhlbS4KIAkgKi8KLQlfX3NrYl9xdWV1ZV9wdXJnZSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJc2tiX3JidHJlZV9wdXJnZSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CiAJaWYgKHRjcF9pc19zYWNrKHRwKSkKIAkJdGNwX3NhY2tfcmVzZXQoJnRwLT5yeF9vcHQpOwogCXNrX21lbV9yZWNsYWltKHNrKTsKQEAgLTQyNjgsNyArNDI2Niw3IEBACiAJaW50IHRoaXNfc2FjazsKIAogCS8qIEVtcHR5IG9mbyBxdWV1ZSwgaGVuY2UsIGFsbCB0aGUgU0FDS3MgYXJlIGVhdGVuLiBDbGVhci4gKi8KLQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgeworCWlmIChSQl9FTVBUWV9ST09UKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgewogCQl0cC0+cnhfb3B0Lm51bV9zYWNrcyA9IDA7CiAJCXJldHVybjsKIAl9CkBAIC00MzQ0LDEwICs0MzQyLDEzIEBACiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJX191MzIgZHNhY2tfaGlnaCA9IHRwLT5yY3Zfbnh0OworCWJvb2wgZmluLCBmcmFnc3RvbGVuLCBlYXRlbjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdGFpbDsKLQlib29sIGZyYWdzdG9sZW4sIGVhdGVuOworCXN0cnVjdCByYl9ub2RlICpwOwogCi0Jd2hpbGUgKChza2IgPSBza2JfcGVlaygmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpICE9IE5VTEwpIHsKKwlwID0gcmJfZmlyc3QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCXdoaWxlIChwKSB7CisJCXNrYiA9IHJiX2VudHJ5KHAsIHN0cnVjdCBza19idWZmLCByYm5vZGUpOwogCQlpZiAoYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5zZXEsIHRwLT5yY3Zfbnh0KSkKIAkJCWJyZWFrOwogCkBAIC00MzU3LDkgKzQzNTgsMTAgQEAKIAkJCQlkc2Fja19oaWdoID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwogCQkJdGNwX2RzYWNrX2V4dGVuZChzaywgVENQX1NLQl9DQihza2IpLT5zZXEsIGRzYWNrKTsKIAkJfQorCQlwID0gcmJfbmV4dChwKTsKKwkJcmJfZXJhc2UoJnNrYi0+cmJub2RlLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CiAKLQkJX19za2JfdW5saW5rKHNrYiwgJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwotCQlpZiAoIWFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgdHAtPnJjdl9ueHQpKSB7CisJCWlmICh1bmxpa2VseSghYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxLCB0cC0+cmN2X254dCkpKSB7CiAJCQlTT0NLX0RFQlVHKHNrLCAib2ZvIHBhY2tldCB3YXMgYWxyZWFkeSByZWNlaXZlZFxuIik7CiAJCQl0Y3BfZHJvcChzaywgc2tiKTsKIAkJCWNvbnRpbnVlOwpAQCAtNDM3MSwxMiArNDM3MywxOSBAQAogCQl0YWlsID0gc2tiX3BlZWtfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUpOwogCQllYXRlbiA9IHRhaWwgJiYgdGNwX3RyeV9jb2FsZXNjZShzaywgdGFpbCwgc2tiLCAmZnJhZ3N0b2xlbik7CiAJCXRjcF9yY3Zfbnh0X3VwZGF0ZSh0cCwgVENQX1NLQl9DQihza2IpLT5lbmRfc2VxKTsKKwkJZmluID0gVENQX1NLQl9DQihza2IpLT50Y3BfZmxhZ3MgJiBUQ1BIRFJfRklOOwogCQlpZiAoIWVhdGVuKQogCQkJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7Ci0JCWlmIChUQ1BfU0tCX0NCKHNrYiktPnRjcF9mbGFncyAmIFRDUEhEUl9GSU4pCi0JCQl0Y3BfZmluKHNrKTsKLQkJaWYgKGVhdGVuKQorCQllbHNlCiAJCQlrZnJlZV9za2JfcGFydGlhbChza2IsIGZyYWdzdG9sZW4pOworCisJCWlmICh1bmxpa2VseShmaW4pKSB7CisJCQl0Y3BfZmluKHNrKTsKKwkJCS8qIHRjcF9maW4oKSBwdXJnZXMgdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwKKwkJCSAqIHNvIHdlIG11c3QgZW5kIHRoaXMgbG9vcCByaWdodCBub3cuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CiAJfQogfQogCkBAIC00MzkyLDEyICs0NDAxLDkgQEAKIAkJaWYgKHRjcF9wcnVuZV9xdWV1ZShzaykgPCAwKQogCQkJcmV0dXJuIC0xOwogCi0JCWlmICghc2tfcm1lbV9zY2hlZHVsZShzaywgc2tiLCBzaXplKSkgeworCQl3aGlsZSAoIXNrX3JtZW1fc2NoZWR1bGUoc2ssIHNrYiwgc2l6ZSkpIHsKIAkJCWlmICghdGNwX3BydW5lX29mb19xdWV1ZShzaykpCiAJCQkJcmV0dXJuIC0xOwotCi0JCQlpZiAoIXNrX3JtZW1fc2NoZWR1bGUoc2ssIHNrYiwgc2l6ZSkpCi0JCQkJcmV0dXJuIC0xOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtNDQwNiw4ICs0NDEyLDEwIEBACiBzdGF0aWMgdm9pZCB0Y3BfZGF0YV9xdWV1ZV9vZm8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCByYl9ub2RlICoqcCwgKnEsICpwYXJlbnQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjE7CiAJdTMyIHNlcSwgZW5kX3NlcTsKKwlib29sIGZyYWdzdG9sZW47CiAKIAl0Y3BfZWNuX2NoZWNrX2NlKHRwLCBza2IpOwogCkBAIC00NDIyLDg4ICs0NDMwLDkyIEBACiAJaW5ldF9jc2tfc2NoZWR1bGVfYWNrKHNrKTsKIAogCU5FVF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfVENQT0ZPUVVFVUUpOworCXNlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOworCWVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CiAJU09DS19ERUJVRyhzaywgIm91dCBvZiBvcmRlciBzZWdtZW50OiByY3ZfbmV4dCAlWCBzZXEgJVggLSAlWFxuIiwKLQkJICAgdHAtPnJjdl9ueHQsIFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpOworCQkgICB0cC0+cmN2X254dCwgc2VxLCBlbmRfc2VxKTsKIAotCXNrYjEgPSBza2JfcGVla190YWlsKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKLQlpZiAoIXNrYjEpIHsKKwlwID0gJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUucmJfbm9kZTsKKwlpZiAoUkJfRU1QVFlfUk9PVCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpIHsKIAkJLyogSW5pdGlhbCBvdXQgb2Ygb3JkZXIgc2VnbWVudCwgYnVpbGQgMSBTQUNLLiAqLwogCQlpZiAodGNwX2lzX3NhY2sodHApKSB7CiAJCQl0cC0+cnhfb3B0Lm51bV9zYWNrcyA9IDE7Ci0JCQl0cC0+c2VsZWN0aXZlX2Fja3NbMF0uc3RhcnRfc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXE7Ci0JCQl0cC0+c2VsZWN0aXZlX2Fja3NbMF0uZW5kX3NlcSA9Ci0JCQkJCQlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7CisJCQl0cC0+c2VsZWN0aXZlX2Fja3NbMF0uc3RhcnRfc2VxID0gc2VxOworCQkJdHAtPnNlbGVjdGl2ZV9hY2tzWzBdLmVuZF9zZXEgPSBlbmRfc2VxOwogCQl9Ci0JCV9fc2tiX3F1ZXVlX2hlYWQoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYik7CisJCXJiX2xpbmtfbm9kZSgmc2tiLT5yYm5vZGUsIE5VTEwsIHApOworCQlyYl9pbnNlcnRfY29sb3IoJnNrYi0+cmJub2RlLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJCXRwLT5vb29fbGFzdF9za2IgPSBza2I7CiAJCWdvdG8gZW5kOwogCX0KIAotCXNlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOwotCWVuZF9zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7Ci0KLQlpZiAoc2VxID09IFRDUF9TS0JfQ0Ioc2tiMSktPmVuZF9zZXEpIHsKLQkJYm9vbCBmcmFnc3RvbGVuOwotCi0JCWlmICghdGNwX3RyeV9jb2FsZXNjZShzaywgc2tiMSwgc2tiLCAmZnJhZ3N0b2xlbikpIHsKLQkJCV9fc2tiX3F1ZXVlX2FmdGVyKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlLCBza2IxLCBza2IpOwotCQl9IGVsc2UgewotCQkJdGNwX2dyb3dfd2luZG93KHNrLCBza2IpOwotCQkJa2ZyZWVfc2tiX3BhcnRpYWwoc2tiLCBmcmFnc3RvbGVuKTsKLQkJCXNrYiA9IE5VTEw7Ci0JCX0KLQotCQlpZiAoIXRwLT5yeF9vcHQubnVtX3NhY2tzIHx8Ci0JCSAgICB0cC0+c2VsZWN0aXZlX2Fja3NbMF0uZW5kX3NlcSAhPSBzZXEpCi0JCQlnb3RvIGFkZF9zYWNrOwotCi0JCS8qIENvbW1vbiBjYXNlOiBkYXRhIGFycml2ZSBpbiBvcmRlciBhZnRlciBob2xlLiAqLwotCQl0cC0+c2VsZWN0aXZlX2Fja3NbMF0uZW5kX3NlcSA9IGVuZF9zZXE7Ci0JCWdvdG8gZW5kOworCS8qIEluIHRoZSB0eXBpY2FsIGNhc2UsIHdlIGFyZSBhZGRpbmcgYW4gc2tiIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisJICogVXNlIG9mIG9vb19sYXN0X3NrYiBhdm9pZHMgdGhlIE8oTG9nKE4pKSByYnRyZWUgbG9va3VwLgorCSAqLworCWlmICh0Y3BfdHJ5X2NvYWxlc2NlKHNrLCB0cC0+b29vX2xhc3Rfc2tiLCBza2IsICZmcmFnc3RvbGVuKSkgeworY29hbGVzY2VfZG9uZToKKwkJdGNwX2dyb3dfd2luZG93KHNrLCBza2IpOworCQlrZnJlZV9za2JfcGFydGlhbChza2IsIGZyYWdzdG9sZW4pOworCQlza2IgPSBOVUxMOworCQlnb3RvIGFkZF9zYWNrOworCX0KKwkvKiBDYW4gYXZvaWQgYW4gcmJ0cmVlIGxvb2t1cCBpZiB3ZSBhcmUgYWRkaW5nIHNrYiBhZnRlciBvb29fbGFzdF9za2IgKi8KKwlpZiAoIWJlZm9yZShzZXEsIFRDUF9TS0JfQ0IodHAtPm9vb19sYXN0X3NrYiktPmVuZF9zZXEpKSB7CisJCXBhcmVudCA9ICZ0cC0+b29vX2xhc3Rfc2tiLT5yYm5vZGU7CisJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJZ290byBpbnNlcnQ7CiAJfQogCi0JLyogRmluZCBwbGFjZSB0byBpbnNlcnQgdGhpcyBzZWdtZW50LiAqLwotCXdoaWxlICgxKSB7Ci0JCWlmICghYWZ0ZXIoVENQX1NLQl9DQihza2IxKS0+c2VxLCBzZXEpKQotCQkJYnJlYWs7Ci0JCWlmIChza2JfcXVldWVfaXNfZmlyc3QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYjEpKSB7Ci0JCQlza2IxID0gTlVMTDsKLQkJCWJyZWFrOworCS8qIEZpbmQgcGxhY2UgdG8gaW5zZXJ0IHRoaXMgc2VnbWVudC4gSGFuZGxlIG92ZXJsYXBzIG9uIHRoZSB3YXkuICovCisJcGFyZW50ID0gTlVMTDsKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCXNrYjEgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBza19idWZmLCByYm5vZGUpOworCQlpZiAoYmVmb3JlKHNlcSwgVENQX1NLQl9DQihza2IxKS0+c2VxKSkgeworCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCQljb250aW51ZTsKIAkJfQotCQlza2IxID0gc2tiX3F1ZXVlX3ByZXYoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYjEpOworCQlpZiAoYmVmb3JlKHNlcSwgVENQX1NLQl9DQihza2IxKS0+ZW5kX3NlcSkpIHsKKwkJCWlmICghYWZ0ZXIoZW5kX3NlcSwgVENQX1NLQl9DQihza2IxKS0+ZW5kX3NlcSkpIHsKKwkJCQkvKiBBbGwgdGhlIGJpdHMgYXJlIHByZXNlbnQuIERyb3AuICovCisJCQkJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksCisJCQkJCSAgICAgIExJTlVYX01JQl9UQ1BPRk9NRVJHRSk7CisJCQkJX19rZnJlZV9za2Ioc2tiKTsKKwkJCQlza2IgPSBOVUxMOworCQkJCXRjcF9kc2Fja19zZXQoc2ssIHNlcSwgZW5kX3NlcSk7CisJCQkJZ290byBhZGRfc2FjazsKKwkJCX0KKwkJCWlmIChhZnRlcihzZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPnNlcSkpIHsKKwkJCQkvKiBQYXJ0aWFsIG92ZXJsYXAuICovCisJCQkJdGNwX2RzYWNrX3NldChzaywgc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogc2tiJ3Mgc2VxID09IHNrYjEncyBzZXEgYW5kIHNrYiBjb3ZlcnMgc2tiMS4KKwkJCQkgKiBSZXBsYWNlIHNrYjEgd2l0aCBza2IuCisJCQkJICovCisJCQkJcmJfcmVwbGFjZV9ub2RlKCZza2IxLT5yYm5vZGUsICZza2ItPnJibm9kZSwKKwkJCQkJCSZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwkJCQl0Y3BfZHNhY2tfZXh0ZW5kKHNrLAorCQkJCQkJIFRDUF9TS0JfQ0Ioc2tiMSktPnNlcSwKKwkJCQkJCSBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKTsKKwkJCQlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwKKwkJCQkJICAgICAgTElOVVhfTUlCX1RDUE9GT01FUkdFKTsKKwkJCQlfX2tmcmVlX3NrYihza2IxKTsKKwkJCQlnb3RvIG1lcmdlX3JpZ2h0OworCQkJfQorCQl9IGVsc2UgaWYgKHRjcF90cnlfY29hbGVzY2Uoc2ssIHNrYjEsIHNrYiwgJmZyYWdzdG9sZW4pKSB7CisJCQlnb3RvIGNvYWxlc2NlX2RvbmU7CisJCX0KKwkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OwogCX0KK2luc2VydDoKKwkvKiBJbnNlcnQgc2VnbWVudCBpbnRvIFJCIHRyZWUuICovCisJcmJfbGlua19ub2RlKCZza2ItPnJibm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnNrYi0+cmJub2RlLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CiAKLQkvKiBEbyBza2Igb3ZlcmxhcCB0byBwcmV2aW91cyBvbmU/ICovCi0JaWYgKHNrYjEgJiYgYmVmb3JlKHNlcSwgVENQX1NLQl9DQihza2IxKS0+ZW5kX3NlcSkpIHsKLQkJaWYgKCFhZnRlcihlbmRfc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKSkgewotCQkJLyogQWxsIHRoZSBiaXRzIGFyZSBwcmVzZW50LiBEcm9wLiAqLwotCQkJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BPRk9NRVJHRSk7Ci0JCQl0Y3BfZHJvcChzaywgc2tiKTsKLQkJCXNrYiA9IE5VTEw7Ci0JCQl0Y3BfZHNhY2tfc2V0KHNrLCBzZXEsIGVuZF9zZXEpOwotCQkJZ290byBhZGRfc2FjazsKLQkJfQotCQlpZiAoYWZ0ZXIoc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5zZXEpKSB7Ci0JCQkvKiBQYXJ0aWFsIG92ZXJsYXAuICovCi0JCQl0Y3BfZHNhY2tfc2V0KHNrLCBzZXEsCi0JCQkJICAgICAgVENQX1NLQl9DQihza2IxKS0+ZW5kX3NlcSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2tiX3F1ZXVlX2lzX2ZpcnN0KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlLAotCQkJCQkgICAgICAgc2tiMSkpCi0JCQkJc2tiMSA9IE5VTEw7Ci0JCQllbHNlCi0JCQkJc2tiMSA9IHNrYl9xdWV1ZV9wcmV2KAotCQkJCQkmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwKLQkJCQkJc2tiMSk7Ci0JCX0KLQl9Ci0JaWYgKCFza2IxKQotCQlfX3NrYl9xdWV1ZV9oZWFkKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlLCBza2IpOwotCWVsc2UKLQkJX19za2JfcXVldWVfYWZ0ZXIoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYjEsIHNrYik7Ci0KLQkvKiBBbmQgY2xlYW4gc2VnbWVudHMgY292ZXJlZCBieSBuZXcgb25lIGFzIHdob2xlLiAqLwotCXdoaWxlICghc2tiX3F1ZXVlX2lzX2xhc3QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsIHNrYikpIHsKLQkJc2tiMSA9IHNrYl9xdWV1ZV9uZXh0KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlLCBza2IpOworbWVyZ2VfcmlnaHQ6CisJLyogUmVtb3ZlIG90aGVyIHNlZ21lbnRzIGNvdmVyZWQgYnkgc2tiLiAqLworCXdoaWxlICgocSA9IHJiX25leHQoJnNrYi0+cmJub2RlKSkgIT0gTlVMTCkgeworCQlza2IxID0gcmJfZW50cnkocSwgc3RydWN0IHNrX2J1ZmYsIHJibm9kZSk7CiAKIAkJaWYgKCFhZnRlcihlbmRfc2VxLCBUQ1BfU0tCX0NCKHNrYjEpLT5zZXEpKQogCQkJYnJlYWs7CkBAIC00NTEyLDEyICs0NTI0LDE1IEBACiAJCQkJCSBlbmRfc2VxKTsKIAkJCWJyZWFrOwogCQl9Ci0JCV9fc2tiX3VubGluayhza2IxLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJCXJiX2VyYXNlKCZza2IxLT5yYm5vZGUsICZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKIAkJdGNwX2RzYWNrX2V4dGVuZChzaywgVENQX1NLQl9DQihza2IxKS0+c2VxLAogCQkJCSBUQ1BfU0tCX0NCKHNrYjEpLT5lbmRfc2VxKTsKIAkJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BPRk9NRVJHRSk7CiAJCXRjcF9kcm9wKHNrLCBza2IxKTsKIAl9CisJLyogSWYgdGhlcmUgaXMgbm8gc2tiIGFmdGVyIHVzLCB3ZSBhcmUgdGhlIGxhc3Rfc2tiICEgKi8KKwlpZiAoIXEpCisJCXRwLT5vb29fbGFzdF9za2IgPSBza2I7CiAKIGFkZF9zYWNrOgogCWlmICh0Y3BfaXNfc2Fjayh0cCkpCkBAIC00NjU0LDEzICs0NjY5LDEzIEBACiAJCWlmIChUQ1BfU0tCX0NCKHNrYiktPnRjcF9mbGFncyAmIFRDUEhEUl9GSU4pCiAJCQl0Y3BfZmluKHNrKTsKIAotCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpIHsKKwkJaWYgKCFSQl9FTVBUWV9ST09UKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKSkgewogCQkJdGNwX29mb19xdWV1ZShzayk7CiAKIAkJCS8qIFJGQzI1ODEuIDQuMi4gU0hPVUxEIHNlbmQgaW1tZWRpYXRlIEFDSywgd2hlbgogCQkJICogZ2FwIGluIHF1ZXVlIGlzIGZpbGxlZC4KIAkJCSAqLwotCQkJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpCisJCQlpZiAoUkJfRU1QVFlfUk9PVCgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpCiAJCQkJaW5ldF9jc2soc2spLT5pY3NrX2Fjay5waW5ncG9uZyA9IDA7CiAJCX0KIApAQCAtNDcxNCw0OCArNDcyOSw3NiBAQAogCXRjcF9kYXRhX3F1ZXVlX29mbyhzaywgc2tiKTsKIH0KIAotc3RhdGljIHN0cnVjdCBza19idWZmICp0Y3BfY29sbGFwc2Vfb25lKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCkKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdGNwX3NrYl9uZXh0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKm5leHQgPSBOVUxMOworCWlmIChsaXN0KQorCQlyZXR1cm4gIXNrYl9xdWV1ZV9pc19sYXN0KGxpc3QsIHNrYikgPyBza2ItPm5leHQgOiBOVUxMOwogCi0JaWYgKCFza2JfcXVldWVfaXNfbGFzdChsaXN0LCBza2IpKQotCQluZXh0ID0gc2tiX3F1ZXVlX25leHQobGlzdCwgc2tiKTsKKwlyZXR1cm4gcmJfZW50cnlfc2FmZShyYl9uZXh0KCZza2ItPnJibm9kZSksIHN0cnVjdCBza19idWZmLCByYm5vZGUpOworfQogCi0JX19za2JfdW5saW5rKHNrYiwgbGlzdCk7CitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnRjcF9jb2xsYXBzZV9vbmUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0LAorCQkJCQlzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IHRjcF9za2JfbmV4dChza2IsIGxpc3QpOworCisJaWYgKGxpc3QpCisJCV9fc2tiX3VubGluayhza2IsIGxpc3QpOworCWVsc2UKKwkJcmJfZXJhc2UoJnNrYi0+cmJub2RlLCByb290KTsKKwogCV9fa2ZyZWVfc2tiKHNrYik7CiAJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BSQ1ZDT0xMQVBTRUQpOwogCiAJcmV0dXJuIG5leHQ7CiB9CiAKKy8qIEluc2VydCBza2IgaW50byByYiB0cmVlLCBvcmRlcmVkIGJ5IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICovCitzdGF0aWMgdm9pZCB0Y3BfcmJ0cmVlX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcm9vdC0+cmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMTsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJc2tiMSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHNrX2J1ZmYsIHJibm9kZSk7CisJCWlmIChiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIFRDUF9TS0JfQ0Ioc2tiMSktPnNlcSkpCisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCX0KKwlyYl9saW5rX25vZGUoJnNrYi0+cmJub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmc2tiLT5yYm5vZGUsIHJvb3QpOworfQorCiAvKiBDb2xsYXBzZSBjb250aWd1b3VzIHNlcXVlbmNlIG9mIHNrYnMgaGVhZC4udGFpbCB3aXRoCiAgKiBzZXF1ZW5jZSBudW1iZXJzIHN0YXJ0Li5lbmQuCiAgKgotICogSWYgdGFpbCBpcyBOVUxMLCB0aGlzIG1lYW5zIHVudGlsIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisgKiBJZiB0YWlsIGlzIE5VTEwsIHRoaXMgbWVhbnMgdW50aWwgdGhlIGVuZCBvZiB0aGUgcXVldWUuCiAgKgogICogU2VnbWVudHMgd2l0aCBGSU4vU1lOIGFyZSBub3QgY29sbGFwc2VkIChvbmx5IGJlY2F1c2UgdGhpcwogICogc2ltcGxpZmllcyBjb2RlKQogICovCiBzdGF0aWMgdm9pZAotdGNwX2NvbGxhcHNlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCwKLQkgICAgIHN0cnVjdCBza19idWZmICpoZWFkLCBzdHJ1Y3Qgc2tfYnVmZiAqdGFpbCwKLQkgICAgIHUzMiBzdGFydCwgdTMyIGVuZCkKK3RjcF9jb2xsYXBzZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QsIHN0cnVjdCByYl9yb290ICpyb290LAorCSAgICAgc3RydWN0IHNrX2J1ZmYgKmhlYWQsIHN0cnVjdCBza19idWZmICp0YWlsLCB1MzIgc3RhcnQsIHUzMiBlbmQpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiwgKm47CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGhlYWQsICpuOworCXN0cnVjdCBza19idWZmX2hlYWQgdG1wOwogCWJvb2wgZW5kX29mX3NrYnM7CiAKIAkvKiBGaXJzdCwgY2hlY2sgdGhhdCBxdWV1ZSBpcyBjb2xsYXBzaWJsZSBhbmQgZmluZAotCSAqIHRoZSBwb2ludCB3aGVyZSBjb2xsYXBzaW5nIGNhbiBiZSB1c2VmdWwuICovCi0Jc2tiID0gaGVhZDsKKwkgKiB0aGUgcG9pbnQgd2hlcmUgY29sbGFwc2luZyBjYW4gYmUgdXNlZnVsLgorCSAqLwogcmVzdGFydDoKLQllbmRfb2Zfc2ticyA9IHRydWU7Ci0Jc2tiX3F1ZXVlX3dhbGtfZnJvbV9zYWZlKGxpc3QsIHNrYiwgbikgewotCQlpZiAoc2tiID09IHRhaWwpCi0JCQlicmVhazsKKwlmb3IgKGVuZF9vZl9za2JzID0gdHJ1ZTsgc2tiICE9IE5VTEwgJiYgc2tiICE9IHRhaWw7IHNrYiA9IG4pIHsKKwkJbiA9IHRjcF9za2JfbmV4dChza2IsIGxpc3QpOworCiAJCS8qIE5vIG5ldyBiaXRzPyBJdCBpcyBwb3NzaWJsZSBvbiBvZm8gcXVldWUuICovCiAJCWlmICghYmVmb3JlKHN0YXJ0LCBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEpKSB7Ci0JCQlza2IgPSB0Y3BfY29sbGFwc2Vfb25lKHNrLCBza2IsIGxpc3QpOworCQkJc2tiID0gdGNwX2NvbGxhcHNlX29uZShzaywgc2tiLCBsaXN0LCByb290KTsKIAkJCWlmICghc2tiKQogCQkJCWJyZWFrOwogCQkJZ290byByZXN0YXJ0OwpAQCAtNDc3MywxMyArNDgxNiwxMCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoIXNrYl9xdWV1ZV9pc19sYXN0KGxpc3QsIHNrYikpIHsKLQkJCXN0cnVjdCBza19idWZmICpuZXh0ID0gc2tiX3F1ZXVlX25leHQobGlzdCwgc2tiKTsKLQkJCWlmIChuZXh0ICE9IHRhaWwgJiYKLQkJCSAgICBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgIT0gVENQX1NLQl9DQihuZXh0KS0+c2VxKSB7Ci0JCQkJZW5kX29mX3NrYnMgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KKwkJaWYgKG4gJiYgbiAhPSB0YWlsICYmCisJCSAgICBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgIT0gVENQX1NLQl9DQihuKS0+c2VxKSB7CisJCQllbmRfb2Zfc2ticyA9IGZhbHNlOworCQkJYnJlYWs7CiAJCX0KIAogCQkvKiBEZWNpZGVkIHRvIHNraXAgdGhpcywgYWR2YW5jZSBzdGFydCBzZXEuICovCkBAIC00Nzg5LDE3ICs0ODI5LDIyIEBACiAJICAgIChUQ1BfU0tCX0NCKHNrYiktPnRjcF9mbGFncyAmIChUQ1BIRFJfU1lOIHwgVENQSERSX0ZJTikpKQogCQlyZXR1cm47CiAKKwlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnRtcCk7CisKIAl3aGlsZSAoYmVmb3JlKHN0YXJ0LCBlbmQpKSB7CiAJCWludCBjb3B5ID0gbWluX3QoaW50LCBTS0JfTUFYX09SREVSKDAsIDApLCBlbmQgLSBzdGFydCk7CiAJCXN0cnVjdCBza19idWZmICpuc2tiOwogCiAJCW5za2IgPSBhbGxvY19za2IoY29weSwgR0ZQX0FUT01JQyk7CiAJCWlmICghbnNrYikKLQkJCXJldHVybjsKKwkJCWJyZWFrOwogCiAJCW1lbWNweShuc2tiLT5jYiwgc2tiLT5jYiwgc2l6ZW9mKHNrYi0+Y2IpKTsKIAkJVENQX1NLQl9DQihuc2tiKS0+c2VxID0gVENQX1NLQl9DQihuc2tiKS0+ZW5kX3NlcSA9IHN0YXJ0OwotCQlfX3NrYl9xdWV1ZV9iZWZvcmUobGlzdCwgc2tiLCBuc2tiKTsKKwkJaWYgKGxpc3QpCisJCQlfX3NrYl9xdWV1ZV9iZWZvcmUobGlzdCwgc2tiLCBuc2tiKTsKKwkJZWxzZQorCQkJX19za2JfcXVldWVfdGFpbCgmdG1wLCBuc2tiKTsgLyogZGVmZXIgcmJ0cmVlIGluc2VydGlvbiAqLwogCQlza2Jfc2V0X293bmVyX3IobnNrYiwgc2spOwogCiAJCS8qIENvcHkgZGF0YSwgcmVsZWFzaW5nIGNvbGxhcHNlZCBza2JzLiAqLwpAQCAtNDgxNywxNCArNDg2MiwxNyBAQAogCQkJCXN0YXJ0ICs9IHNpemU7CiAJCQl9CiAJCQlpZiAoIWJlZm9yZShzdGFydCwgVENQX1NLQl9DQihza2IpLT5lbmRfc2VxKSkgewotCQkJCXNrYiA9IHRjcF9jb2xsYXBzZV9vbmUoc2ssIHNrYiwgbGlzdCk7CisJCQkJc2tiID0gdGNwX2NvbGxhcHNlX29uZShzaywgc2tiLCBsaXN0LCByb290KTsKIAkJCQlpZiAoIXNrYiB8fAogCQkJCSAgICBza2IgPT0gdGFpbCB8fAogCQkJCSAgICAoVENQX1NLQl9DQihza2IpLT50Y3BfZmxhZ3MgJiAoVENQSERSX1NZTiB8IFRDUEhEUl9GSU4pKSkKLQkJCQkJcmV0dXJuOworCQkJCQlnb3RvIGVuZDsKIAkJCX0KIAkJfQogCX0KK2VuZDoKKwlza2JfcXVldWVfd2Fsa19zYWZlKCZ0bXAsIHNrYiwgbikKKwkJdGNwX3JidHJlZV9pbnNlcnQocm9vdCwgc2tiKTsKIH0KIAogLyogQ29sbGFwc2Ugb2ZvIHF1ZXVlLiBBbGdvcml0aG06IHNlbGVjdCBjb250aWd1b3VzIHNlcXVlbmNlIG9mIHNrYnMKQEAgLTQ4MzMsNzAgKzQ4ODEsODYgQEAKIHN0YXRpYyB2b2lkIHRjcF9jb2xsYXBzZV9vZm9fcXVldWUoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfcGVlaygmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7Ci0Jc3RydWN0IHNrX2J1ZmYgKmhlYWQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKmhlYWQ7CisJc3RydWN0IHJiX25vZGUgKnA7CiAJdTMyIHN0YXJ0LCBlbmQ7CiAKLQlpZiAoIXNrYikKKwlwID0gcmJfZmlyc3QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCXNrYiA9IHJiX2VudHJ5X3NhZmUocCwgc3RydWN0IHNrX2J1ZmYsIHJibm9kZSk7CituZXdfcmFuZ2U6CisJaWYgKCFza2IpIHsKKwkJcCA9IHJiX2xhc3QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCQkvKiBOb3RlOiBUaGlzIGlzIHBvc3NpYmxlIHAgaXMgTlVMTCBoZXJlLiBXZSBkbyBub3QKKwkJICogdXNlIHJiX2VudHJ5X3NhZmUoKSwgYXMgb29vX2xhc3Rfc2tiIGlzIHZhbGlkIG9ubHkKKwkJICogaWYgcmJ0cmVlIGlzIG5vdCBlbXB0eS4KKwkJICovCisJCXRwLT5vb29fbGFzdF9za2IgPSByYl9lbnRyeShwLCBzdHJ1Y3Qgc2tfYnVmZiwgcmJub2RlKTsKIAkJcmV0dXJuOwotCisJfQogCXN0YXJ0ID0gVENQX1NLQl9DQihza2IpLT5zZXE7CiAJZW5kID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOwotCWhlYWQgPSBza2I7CiAKLQlmb3IgKDs7KSB7Ci0JCXN0cnVjdCBza19idWZmICpuZXh0ID0gTlVMTDsKKwlmb3IgKGhlYWQgPSBza2I7OykgeworCQlza2IgPSB0Y3Bfc2tiX25leHQoc2tiLCBOVUxMKTsKIAotCQlpZiAoIXNrYl9xdWV1ZV9pc19sYXN0KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlLCBza2IpKQotCQkJbmV4dCA9IHNrYl9xdWV1ZV9uZXh0KCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlLCBza2IpOwotCQlza2IgPSBuZXh0OwotCi0JCS8qIFNlZ21lbnQgaXMgdGVybWluYXRlZCB3aGVuIHdlIHNlZSBnYXAgb3Igd2hlbgotCQkgKiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiBhbGwgdGhlIHF1ZXVlLiAqLworCQkvKiBSYW5nZSBpcyB0ZXJtaW5hdGVkIHdoZW4gd2Ugc2VlIGEgZ2FwIG9yIHdoZW4KKwkJICogd2UgYXJlIGF0IHRoZSBxdWV1ZSBlbmQuCisJCSAqLwogCQlpZiAoIXNrYiB8fAogCQkgICAgYWZ0ZXIoVENQX1NLQl9DQihza2IpLT5zZXEsIGVuZCkgfHwKIAkJICAgIGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIHN0YXJ0KSkgewotCQkJdGNwX2NvbGxhcHNlKHNrLCAmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSwKKwkJCXRjcF9jb2xsYXBzZShzaywgTlVMTCwgJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUsCiAJCQkJICAgICBoZWFkLCBza2IsIHN0YXJ0LCBlbmQpOwotCQkJaGVhZCA9IHNrYjsKLQkJCWlmICghc2tiKQotCQkJCWJyZWFrOwotCQkJLyogU3RhcnQgbmV3IHNlZ21lbnQgKi8KLQkJCXN0YXJ0ID0gVENQX1NLQl9DQihza2IpLT5zZXE7Ci0JCQllbmQgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXE7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCBzdGFydCkpCi0JCQkJc3RhcnQgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKLQkJCWlmIChhZnRlcihUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEsIGVuZCkpCi0JCQkJZW5kID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxOworCQkJZ290byBuZXdfcmFuZ2U7CiAJCX0KKworCQlpZiAodW5saWtlbHkoYmVmb3JlKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxLCBzdGFydCkpKQorCQkJc3RhcnQgPSBUQ1BfU0tCX0NCKHNrYiktPnNlcTsKKwkJaWYgKGFmdGVyKFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSwgZW5kKSkKKwkJCWVuZCA9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcTsKIAl9CiB9CiAKIC8qCi0gKiBQdXJnZSB0aGUgb3V0LW9mLW9yZGVyIHF1ZXVlLgotICogUmV0dXJuIHRydWUgaWYgcXVldWUgd2FzIHBydW5lZC4KKyAqIENsZWFuIHRoZSBvdXQtb2Ytb3JkZXIgcXVldWUgdG8gbWFrZSByb29tLgorICogV2UgZHJvcCBoaWdoIHNlcXVlbmNlcyBwYWNrZXRzIHRvIDoKKyAqIDEpIExldCBhIGNoYW5jZSBmb3IgaG9sZXMgdG8gYmUgZmlsbGVkLgorICogMikgbm90IGFkZCB0b28gYmlnIGxhdGVuY2llcyBpZiB0aG91c2FuZHMgb2YgcGFja2V0cyBzaXQgdGhlcmUuCisgKiAgICAoQnV0IGlmIGFwcGxpY2F0aW9uIHNocmlua3MgU09fUkNWQlVGLCB3ZSBjb3VsZCBzdGlsbCBlbmQgdXAKKyAqICAgICBmcmVlaW5nIHdob2xlIHF1ZXVlIGhlcmUpCisgKgorICogUmV0dXJuIHRydWUgaWYgcXVldWUgaGFzIHNocnVuay4KICAqLwogc3RhdGljIGJvb2wgdGNwX3BydW5lX29mb19xdWV1ZShzdHJ1Y3Qgc29jayAqc2spCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7Ci0JYm9vbCByZXMgPSBmYWxzZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSwgKnByZXY7CiAKLQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpIHsKLQkJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksIExJTlVYX01JQl9PRk9QUlVORUQpOwotCQlfX3NrYl9xdWV1ZV9wdXJnZSgmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSk7CisJaWYgKFJCX0VNUFRZX1JPT1QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKQorCQlyZXR1cm4gZmFsc2U7CiAKLQkJLyogUmVzZXQgU0FDSyBzdGF0ZS4gIEEgY29uZm9ybWluZyBTQUNLIGltcGxlbWVudGF0aW9uIHdpbGwKLQkJICogZG8gdGhlIHNhbWUgYXQgYSB0aW1lb3V0IGJhc2VkIHJldHJhbnNtaXQuICBXaGVuIGEgY29ubmVjdGlvbgotCQkgKiBpcyBpbiBhIHNhZCBzdGF0ZSBsaWtlIHRoaXMsIHdlIGNhcmUgb25seSBhYm91dCBpbnRlZ3JpdHkKLQkJICogb2YgdGhlIGNvbm5lY3Rpb24gbm90IHBlcmZvcm1hbmNlLgotCQkgKi8KLQkJaWYgKHRwLT5yeF9vcHQuc2Fja19vaykKLQkJCXRjcF9zYWNrX3Jlc2V0KCZ0cC0+cnhfb3B0KTsKKwlORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX09GT1BSVU5FRCk7CisJbm9kZSA9ICZ0cC0+b29vX2xhc3Rfc2tiLT5yYm5vZGU7CisJZG8geworCQlwcmV2ID0gcmJfcHJldihub2RlKTsKKwkJcmJfZXJhc2Uobm9kZSwgJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOworCQl0Y3BfZHJvcChzaywgcmJfZW50cnkobm9kZSwgc3RydWN0IHNrX2J1ZmYsIHJibm9kZSkpOwogCQlza19tZW1fcmVjbGFpbShzayk7Ci0JCXJlcyA9IHRydWU7Ci0JfQotCXJldHVybiByZXM7CisJCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDw9IHNrLT5za19yY3ZidWYgJiYKKwkJICAgICF0Y3BfdW5kZXJfbWVtb3J5X3ByZXNzdXJlKHNrKSkKKwkJCWJyZWFrOworCQlub2RlID0gcHJldjsKKwl9IHdoaWxlIChub2RlKTsKKwl0cC0+b29vX2xhc3Rfc2tiID0gcmJfZW50cnkocHJldiwgc3RydWN0IHNrX2J1ZmYsIHJibm9kZSk7CisKKwkvKiBSZXNldCBTQUNLIHN0YXRlLiAgQSBjb25mb3JtaW5nIFNBQ0sgaW1wbGVtZW50YXRpb24gd2lsbAorCSAqIGRvIHRoZSBzYW1lIGF0IGEgdGltZW91dCBiYXNlZCByZXRyYW5zbWl0LiAgV2hlbiBhIGNvbm5lY3Rpb24KKwkgKiBpcyBpbiBhIHNhZCBzdGF0ZSBsaWtlIHRoaXMsIHdlIGNhcmUgb25seSBhYm91dCBpbnRlZ3JpdHkKKwkgKiBvZiB0aGUgY29ubmVjdGlvbiBub3QgcGVyZm9ybWFuY2UuCisJICovCisJaWYgKHRwLT5yeF9vcHQuc2Fja19vaykKKwkJdGNwX3NhY2tfcmVzZXQoJnRwLT5yeF9vcHQpOworCXJldHVybiB0cnVlOwogfQogCiAvKiBSZWR1Y2UgYWxsb2NhdGVkIG1lbW9yeSBpZiB3ZSBjYW4sIHRyeWluZyB0byBnZXQKQEAgLTQ5MjEsNyArNDk4NSw3IEBACiAKIAl0Y3BfY29sbGFwc2Vfb2ZvX3F1ZXVlKHNrKTsKIAlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKQotCQl0Y3BfY29sbGFwc2Uoc2ssICZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwKKwkJdGNwX2NvbGxhcHNlKHNrLCAmc2stPnNrX3JlY2VpdmVfcXVldWUsIE5VTEwsCiAJCQkgICAgIHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSksCiAJCQkgICAgIE5VTEwsCiAJCQkgICAgIHRwLT5jb3BpZWRfc2VxLCB0cC0+cmN2X254dCk7CkBAIC01MDI2LDcgKzUwOTAsNyBAQAogCSAgICAvKiBXZSBBQ0sgZWFjaCBmcmFtZSBvci4uLiAqLwogCSAgICB0Y3BfaW5fcXVpY2thY2tfbW9kZShzaykgfHwKIAkgICAgLyogV2UgaGF2ZSBvdXQgb2Ygb3JkZXIgZGF0YS4gKi8KLQkgICAgKG9mb19wb3NzaWJsZSAmJiBza2JfcGVlaygmdHAtPm91dF9vZl9vcmRlcl9xdWV1ZSkpKSB7CisJICAgIChvZm9fcG9zc2libGUgJiYgIVJCX0VNUFRZX1JPT1QoJnRwLT5vdXRfb2Zfb3JkZXJfcXVldWUpKSkgewogCQkvKiBUaGVuIGFjayBpdCBub3cgKi8KIAkJdGNwX3NlbmRfYWNrKHNrKTsKIAl9IGVsc2UgewpAQCAtNTg4NSw3ICs1OTQ5LDcgQEAKIAkJICogc28gcmVsZWFzZSBpdC4KIAkJICovCiAJCWlmIChyZXEpIHsKLQkJCXRwLT50b3RhbF9yZXRyYW5zID0gcmVxLT5udW1fcmV0cmFuczsKKwkJCWluZXRfY3NrKHNrKS0+aWNza19yZXRyYW5zbWl0cyA9IDA7CiAJCQlyZXFza19mYXN0b3Blbl9yZW1vdmUoc2ssIHJlcSwgZmFsc2UpOwogCQl9IGVsc2UgewogCQkJLyogTWFrZSBzdXJlIHNvY2tldCBpcyByb3V0ZWQsIGZvciBjb3JyZWN0IG1ldHJpY3MuICovCkBAIC01OTI3LDcgKzU5OTEsOCBAQAogCQl9IGVsc2UKIAkJCXRjcF9pbml0X21ldHJpY3Moc2spOwogCi0JCXRjcF91cGRhdGVfcGFjaW5nX3JhdGUoc2spOworCQlpZiAoIWluZXRfY3NrKHNrKS0+aWNza19jYV9vcHMtPmNvbmdfY29udHJvbCkKKwkJCXRjcF91cGRhdGVfcGFjaW5nX3JhdGUoc2spOwogCiAJCS8qIFByZXZlbnQgc3B1cmlvdXMgdGNwX2N3bmRfcmVzdGFydCgpIG9uIGZpcnN0IGRhdGEgcGFja2V0ICovCiAJCXRwLT5sc25kdGltZSA9IHRjcF90aW1lX3N0YW1wOwpAQCAtNjI2MCw2ICs2MzI1LDcgQEAKIAogCXRtcF9vcHQudHN0YW1wX29rID0gdG1wX29wdC5zYXdfdHN0YW1wOwogCXRjcF9vcGVucmVxX2luaXQocmVxLCAmdG1wX29wdCwgc2tiLCBzayk7CisJaW5ldF9yc2socmVxKS0+bm9fc3JjY2hlY2sgPSBpbmV0X3NrKHNrKS0+dHJhbnNwYXJlbnQ7CiAKIAkvKiBOb3RlOiB0Y3BfdjZfaW5pdF9yZXEoKSBtaWdodCBvdmVycmlkZSBpcl9paWYgZm9yIGxpbmsgbG9jYWxzICovCiAJaW5ldF9yc2socmVxKS0+aXJfaWlmID0gaW5ldF9yZXF1ZXN0X2JvdW5kX2Rldl9pZihzaywgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9pcHY0LmMgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCmluZGV4IDMyYjA0OGUuLjdhYzM3YzMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pcHY0LmMKKysrIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwpAQCAtODE0LDggKzgxNCwxNCBAQAogCXUzMiBzZXEgPSAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pID8gdGNwX3JzayhyZXEpLT5zbnRfaXNuICsgMSA6CiAJCQkJCSAgICAgdGNwX3NrKHNrKS0+c25kX254dDsKIAorCS8qIFJGQyA3MzIzIDIuMworCSAqIFRoZSB3aW5kb3cgZmllbGQgKFNFRy5XTkQpIG9mIGV2ZXJ5IG91dGdvaW5nIHNlZ21lbnQsIHdpdGggdGhlCisJICogZXhjZXB0aW9uIG9mIDxTWU4+IHNlZ21lbnRzLCBNVVNUIGJlIHJpZ2h0LXNoaWZ0ZWQgYnkKKwkgKiBSY3YuV2luZC5TaGlmdCBiaXRzOgorCSAqLwogCXRjcF92NF9zZW5kX2Fjayhzb2NrX25ldChzayksIHNrYiwgc2VxLAotCQkJdGNwX3JzayhyZXEpLT5yY3Zfbnh0LCByZXEtPnJza19yY3Zfd25kLAorCQkJdGNwX3JzayhyZXEpLT5yY3Zfbnh0LAorCQkJcmVxLT5yc2tfcmN2X3duZCA+PiBpbmV0X3JzayhyZXEpLT5yY3Zfd3NjYWxlLAogCQkJdGNwX3RpbWVfc3RhbXAsCiAJCQlyZXEtPnRzX3JlY2VudCwKIAkJCTAsCkBAIC0xMTY5LDYgKzExNzUsNyBAQAogCQkJCSAgICAgIE5VTEwsIHNrYik7CiAKIAlpZiAoZ2VuaGFzaCB8fCBtZW1jbXAoaGFzaF9sb2NhdGlvbiwgbmV3aGFzaCwgMTYpICE9IDApIHsKKwkJTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BNRDVGQUlMVVJFKTsKIAkJbmV0X2luZm9fcmF0ZWxpbWl0ZWQoIk1ENSBIYXNoIGZhaWxlZCBmb3IgKCVwSTQsICVkKS0+KCVwSTQsICVkKSVzXG4iLAogCQkJCSAgICAgJmlwaC0+c2FkZHIsIG50b2hzKHRoLT5zb3VyY2UpLAogCQkJCSAgICAgJmlwaC0+ZGFkZHIsIG50b2hzKHRoLT5kZXN0KSwKQEAgLTExODksNyArMTE5Niw2IEBACiAKIAlza19yY3Zfc2FkZHJfc2V0KHJlcV90b19zayhyZXEpLCBpcF9oZHIoc2tiKS0+ZGFkZHIpOwogCXNrX2RhZGRyX3NldChyZXFfdG9fc2socmVxKSwgaXBfaGRyKHNrYiktPnNhZGRyKTsKLQlpcmVxLT5ub19zcmNjaGVjayA9IGluZXRfc2soc2tfbGlzdGVuZXIpLT50cmFuc3BhcmVudDsKIAlpcmVxLT5vcHQgPSB0Y3BfdjRfc2F2ZV9vcHRpb25zKHNrYik7CiB9CiAKQEAgLTE1MzEsNiArMTUzNywzNCBAQAogfQogRVhQT1JUX1NZTUJPTCh0Y3BfcHJlcXVldWUpOwogCitib29sIHRjcF9hZGRfYmFja2xvZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTMyIGxpbWl0ID0gc2stPnNrX3JjdmJ1ZiArIHNrLT5za19zbmRidWY7CisKKwkvKiBPbmx5IHNvY2tldCBvd25lciBjYW4gdHJ5IHRvIGNvbGxhcHNlL3BydW5lIHJ4IHF1ZXVlcworCSAqIHRvIHJlZHVjZSBtZW1vcnkgb3ZlcmhlYWQsIHNvIGFkZCBhIGxpdHRsZSBoZWFkcm9vbSBoZXJlLgorCSAqIEZldyBzb2NrZXRzIGJhY2tsb2cgYXJlIHBvc3NpYmx5IGNvbmN1cnJlbnRseSBub24gZW1wdHkuCisJICovCisJbGltaXQgKz0gNjQqMTAyNDsKKworCS8qIEluIGNhc2UgYWxsIGRhdGEgd2FzIHB1bGxlZCBmcm9tIHNrYiBmcmFncyAoaW4gX19wc2tiX3B1bGxfdGFpbCgpKSwKKwkgKiB3ZSBjYW4gZml4IHNrYi0+dHJ1ZXNpemUgdG8gaXRzIHJlYWwgdmFsdWUgdG8gYXZvaWQgZnV0dXJlIGRyb3BzLgorCSAqIFRoaXMgaXMgdmFsaWQgYmVjYXVzZSBza2IgaXMgbm90IHlldCBjaGFyZ2VkIHRvIHRoZSBzb2NrZXQuCisJICogSXQgaGFzIGJlZW4gbm90aWNlZCBwdXJlIFNBQ0sgcGFja2V0cyB3ZXJlIHNvbWV0aW1lcyBkcm9wcGVkCisJICogKGlmIGNvb2tlZCBieSBkcml2ZXJzIHdpdGhvdXQgY29weWJyZWFrIGZlYXR1cmUpLgorCSAqLworCWlmICghc2tiLT5kYXRhX2xlbikKKwkJc2tiLT50cnVlc2l6ZSA9IFNLQl9UUlVFU0laRShza2JfZW5kX29mZnNldChza2IpKTsKKworCWlmICh1bmxpa2VseShza19hZGRfYmFja2xvZyhzaywgc2tiLCBsaW1pdCkpKSB7CisJCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJX19ORVRfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUEJBQ0tMT0dEUk9QKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0wodGNwX2FkZF9iYWNrbG9nKTsKKwogLyoKICAqCUZyb20gdGNwX2lucHV0LmMKICAqLwpAQCAtMTYwMiw2ICsxNjM2LDcgQEAKIAogCQlzayA9IHJlcS0+cnNrX2xpc3RlbmVyOwogCQlpZiAodW5saWtlbHkodGNwX3Y0X2luYm91bmRfbWQ1X2hhc2goc2ssIHNrYikpKSB7CisJCQlza19kcm9wc19hZGQoc2ssIHNrYik7CiAJCQlyZXFza19wdXQocmVxKTsKIAkJCWdvdG8gZGlzY2FyZF9pdDsKIAkJfQpAQCAtMTY2MCwxMCArMTY5NSw3IEBACiAJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CiAJCWlmICghdGNwX3ByZXF1ZXVlKHNrLCBza2IpKQogCQkJcmV0ID0gdGNwX3Y0X2RvX3Jjdihzaywgc2tiKTsKLQl9IGVsc2UgaWYgKHVubGlrZWx5KHNrX2FkZF9iYWNrbG9nKHNrLCBza2IsCi0JCQkJCSAgIHNrLT5za19yY3ZidWYgKyBzay0+c2tfc25kYnVmKSkpIHsKLQkJYmhfdW5sb2NrX3NvY2soc2spOwotCQlfX05FVF9JTkNfU1RBVFMobmV0LCBMSU5VWF9NSUJfVENQQkFDS0xPR0RST1ApOworCX0gZWxzZSBpZiAodGNwX2FkZF9iYWNrbG9nKHNrLCBza2IpKSB7CiAJCWdvdG8gZGlzY2FyZF9hbmRfcmVsc2U7CiAJfQogCWJoX3VubG9ja19zb2NrKHNrKTsKQEAgLTE4MTIsNyArMTg0NCw3IEBACiAJdGNwX3dyaXRlX3F1ZXVlX3B1cmdlKHNrKTsKIAogCS8qIENsZWFucyB1cCBvdXIsIGhvcGVmdWxseSBlbXB0eSwgb3V0X29mX29yZGVyX3F1ZXVlLiAqLwotCV9fc2tiX3F1ZXVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKKwlza2JfcmJ0cmVlX3B1cmdlKCZ0cC0+b3V0X29mX29yZGVyX3F1ZXVlKTsKIAogI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCiAJLyogQ2xlYW4gdXAgdGhlIE1ENSBrZXkgbGlzdCwgaWYgYW55ICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfbWV0cmljcy5jIGIvbmV0L2lwdjQvdGNwX21ldHJpY3MuYwppbmRleCBiNjE3ODI2Li5iZjFmM2IyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfbWV0cmljcy5jCisrKyBiL25ldC9pcHY0L3RjcF9tZXRyaWNzLmMKQEAgLTc1MSw3ICs3NTEsNyBAQAogCS5uZXRuc29rCT0gdHJ1ZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbmxhX3BvbGljeSB0Y3BfbWV0cmljc19ubF9wb2xpY3lbVENQX01FVFJJQ1NfQVRUUl9NQVggKyAxXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSB0Y3BfbWV0cmljc19ubF9wb2xpY3lbVENQX01FVFJJQ1NfQVRUUl9NQVggKyAxXSA9IHsKIAlbVENQX01FVFJJQ1NfQVRUUl9BRERSX0lQVjRdCT0geyAudHlwZSA9IE5MQV9VMzIsIH0sCiAJW1RDUF9NRVRSSUNTX0FUVFJfQUREUl9JUFY2XQk9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAogCQkJCQkgICAgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLCB9LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jIGIvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCmluZGV4IDRiOTVlYzQuLjYyMzRlYmEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYworKysgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCiAJCW5ld3RwLT5zcnR0X3VzID0gMDsKIAkJbmV3dHAtPm1kZXZfdXMgPSBqaWZmaWVzX3RvX3VzZWNzKFRDUF9USU1FT1VUX0lOSVQpOwotCQluZXd0cC0+cnR0X21pblswXS5ydHQgPSB+MFU7CisJCW1pbm1heF9yZXNldCgmbmV3dHAtPnJ0dF9taW4sIHRjcF90aW1lX3N0YW1wLCB+MFUpOwogCQluZXdpY3NrLT5pY3NrX3J0byA9IFRDUF9USU1FT1VUX0lOSVQ7CiAKIAkJbmV3dHAtPnBhY2tldHNfb3V0ID0gMDsKQEAgLTQ4Nyw4ICs0ODcsMTAgQEAKIAkJbmV3dHAtPnNuZF9jd25kID0gVENQX0lOSVRfQ1dORDsKIAkJbmV3dHAtPnNuZF9jd25kX2NudCA9IDA7CiAKKwkJLyogVGhlcmUncyBhIGJ1YmJsZSBpbiB0aGUgcGlwZSB1bnRpbCBhdCBsZWFzdCB0aGUgZmlyc3QgQUNLLiAqLworCQluZXd0cC0+YXBwX2xpbWl0ZWQgPSB+MFU7CisKIAkJdGNwX2luaXRfeG1pdF90aW1lcnMobmV3c2spOwotCQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJm5ld3RwLT5vdXRfb2Zfb3JkZXJfcXVldWUpOwogCQluZXd0cC0+d3JpdGVfc2VxID0gbmV3dHAtPnB1c2hlZF9zZXEgPSB0cmVxLT5zbnRfaXNuICsgMTsKIAogCQluZXd0cC0+cnhfb3B0LnNhd190c3RhbXAgPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX29mZmxvYWQuYyBiL25ldC9pcHY0L3RjcF9vZmZsb2FkLmMKaW5kZXggNWM1OTY0OS4uYmM2OGRhMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX29mZmxvYWQuYworKysgYi9uZXQvaXB2NC90Y3Bfb2ZmbG9hZC5jCkBAIC05MCwxMiArOTAsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQkvKiBHU08gcGFydGlhbCBvbmx5IHJlcXVpcmVzIHNwbGl0dGluZyB0aGUgZnJhbWUgaW50byBhbiBNU1MKLQkgKiBtdWx0aXBsZSBhbmQgcG9zc2libHkgYSByZW1haW5kZXIuICBTbyB1cGRhdGUgdGhlIG1zcyBub3cuCi0JICovCi0JaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9HU09fUEFSVElBTCkKLQkJbXNzID0gc2tiLT5sZW4gLSAoc2tiLT5sZW4gJSBtc3MpOwotCiAJY29weV9kZXN0cnVjdG9yID0gZ3NvX3NrYi0+ZGVzdHJ1Y3RvciA9PSB0Y3Bfd2ZyZWU7CiAJb29vX29rYXkgPSBnc29fc2tiLT5vb29fb2theTsKIAkvKiBBbGwgc2VnbWVudHMgYnV0IHRoZSBmaXJzdCBzaG91bGQgaGF2ZSBvb29fb2theSBjbGVhcmVkICovCkBAIC0xMDgsNiArMTAyLDEzIEBACiAJLyogT25seSBmaXJzdCBzZWdtZW50IG1pZ2h0IGhhdmUgb29vX29rYXkgc2V0ICovCiAJc2Vncy0+b29vX29rYXkgPSBvb29fb2theTsKIAorCS8qIEdTTyBwYXJ0aWFsIGFuZCBmcmFnX2xpc3Qgc2VnbWVudGF0aW9uIG9ubHkgcmVxdWlyZXMgc3BsaXR0aW5nCisJICogdGhlIGZyYW1lIGludG8gYW4gTVNTIG11bHRpcGxlIGFuZCBwb3NzaWJseSBhIHJlbWFpbmRlciwgYm90aAorCSAqIGNhc2VzIHJldHVybiBhIEdTTyBza2IuIFNvIHVwZGF0ZSB0aGUgbXNzIG5vdy4KKwkgKi8KKwlpZiAoc2tiX2lzX2dzbyhzZWdzKSkKKwkJbXNzICo9IHNrYl9zaGluZm8oc2VncyktPmdzb19zZWdzOworCiAJZGVsdGEgPSBodG9ubChvbGRsZW4gKyAodGhsZW4gKyBtc3MpKTsKIAogCXNrYiA9IHNlZ3M7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKaW5kZXggYmRhZWY3Zi4uODk2ZTlkZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwpAQCAtNzM0LDkgKzczNCwxNiBAQAogewogCWlmICgoMSA8PCBzay0+c2tfc3RhdGUpICYKIAkgICAgKFRDUEZfRVNUQUJMSVNIRUQgfCBUQ1BGX0ZJTl9XQUlUMSB8IFRDUEZfQ0xPU0lORyB8Ci0JICAgICBUQ1BGX0NMT1NFX1dBSVQgIHwgVENQRl9MQVNUX0FDSykpCi0JCXRjcF93cml0ZV94bWl0KHNrLCB0Y3BfY3VycmVudF9tc3Moc2spLCB0Y3Bfc2soc2spLT5ub25hZ2xlLAorCSAgICAgVENQRl9DTE9TRV9XQUlUICB8IFRDUEZfTEFTVF9BQ0spKSB7CisJCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCisJCWlmICh0cC0+bG9zdF9vdXQgPiB0cC0+cmV0cmFuc19vdXQgJiYKKwkJICAgIHRwLT5zbmRfY3duZCA+IHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkpCisJCQl0Y3BfeG1pdF9yZXRyYW5zbWl0X3F1ZXVlKHNrKTsKKworCQl0Y3Bfd3JpdGVfeG1pdChzaywgdGNwX2N1cnJlbnRfbXNzKHNrKSwgdHAtPm5vbmFnbGUsCiAJCQkgICAgICAgMCwgR0ZQX0FUT01JQyk7CisJfQogfQogLyoKICAqIE9uZSB0YXNrbGV0IHBlciBjcHUgdHJpZXMgdG8gc2VuZCBtb3JlIHNrYnMuCkBAIC05MTgsNiArOTI1LDcgQEAKIAkJc2tiX21zdGFtcF9nZXQoJnNrYi0+c2tiX21zdGFtcCk7CiAJCVRDUF9TS0JfQ0Ioc2tiKS0+dHguaW5fZmxpZ2h0ID0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxCiAJCQktIHRwLT5zbmRfdW5hOworCQl0Y3BfcmF0ZV9za2Jfc2VudChzaywgc2tiKTsKIAogCQlpZiAodW5saWtlbHkoc2tiX2Nsb25lZChza2IpKSkKIAkJCXNrYiA9IHBza2JfY29weShza2IsIGdmcF9tYXNrKTsKQEAgLTEyMTMsNiArMTIyMSw5IEBACiAJdGNwX3NldF9za2JfdHNvX3NlZ3Moc2tiLCBtc3Nfbm93KTsKIAl0Y3Bfc2V0X3NrYl90c29fc2VncyhidWZmLCBtc3Nfbm93KTsKIAorCS8qIFVwZGF0ZSBkZWxpdmVyZWQgaW5mbyBmb3IgdGhlIG5ldyBzZWdtZW50ICovCisJVENQX1NLQl9DQihidWZmKS0+dHggPSBUQ1BfU0tCX0NCKHNrYiktPnR4OworCiAJLyogSWYgdGhpcyBwYWNrZXQgaGFzIGJlZW4gc2VudCBvdXQgYWxyZWFkeSwgd2UgbXVzdAogCSAqIGFkanVzdCB0aGUgdmFyaW91cyBwYWNrZXQgY291bnRlcnMuCiAJICovCkBAIC0xMzU4LDYgKzEzNjksNyBAQAogCX0KIAlyZXR1cm4gbXR1OwogfQorRVhQT1JUX1NZTUJPTCh0Y3BfbXNzX3RvX210dSk7CiAKIC8qIE1UVSBwcm9iaW5nIGluaXQgcGVyIHNvY2tldCAqLwogdm9pZCB0Y3BfbXR1cF9pbml0KHN0cnVjdCBzb2NrICpzaykKQEAgLTE1NDUsNyArMTU1Nyw4IEBACiAvKiBSZXR1cm4gaG93IG1hbnkgc2VncyB3ZSdkIGxpa2Ugb24gYSBUU08gcGFja2V0LAogICogdG8gc2VuZCBvbmUgVFNPIHBhY2tldCBwZXIgbXMKICAqLwotc3RhdGljIHUzMiB0Y3BfdHNvX2F1dG9zaXplKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgaW50IG1zc19ub3cpCit1MzIgdGNwX3Rzb19hdXRvc2l6ZShjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBtc3Nfbm93LAorCQkgICAgIGludCBtaW5fdHNvX3NlZ3MpCiB7CiAJdTMyIGJ5dGVzLCBzZWdzOwogCkBAIC0xNTU3LDEwICsxNTcwLDIzIEBACiAJICogVGhpcyBwcmVzZXJ2ZXMgQUNLIGNsb2NraW5nIGFuZCBpcyBjb25zaXN0ZW50CiAJICogd2l0aCB0Y3BfdHNvX3Nob3VsZF9kZWZlcigpIGhldXJpc3RpYy4KIAkgKi8KLQlzZWdzID0gbWF4X3QodTMyLCBieXRlcyAvIG1zc19ub3csIHN5c2N0bF90Y3BfbWluX3Rzb19zZWdzKTsKKwlzZWdzID0gbWF4X3QodTMyLCBieXRlcyAvIG1zc19ub3csIG1pbl90c29fc2Vncyk7CiAKIAlyZXR1cm4gbWluX3QodTMyLCBzZWdzLCBzay0+c2tfZ3NvX21heF9zZWdzKTsKIH0KK0VYUE9SVF9TWU1CT0wodGNwX3Rzb19hdXRvc2l6ZSk7CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzIHdlIHdhbnQgaW4gdGhlIHNrYiB3ZSBhcmUgdHJhbnNtaXR0aW5nLgorICogU2VlIGlmIGNvbmdlc3Rpb24gY29udHJvbCBtb2R1bGUgd2FudHMgdG8gZGVjaWRlOyBvdGhlcndpc2UsIGF1dG9zaXplLgorICovCitzdGF0aWMgdTMyIHRjcF90c29fc2VncyhzdHJ1Y3Qgc29jayAqc2ssIHVuc2lnbmVkIGludCBtc3Nfbm93KQoreworCWNvbnN0IHN0cnVjdCB0Y3BfY29uZ2VzdGlvbl9vcHMgKmNhX29wcyA9IGluZXRfY3NrKHNrKS0+aWNza19jYV9vcHM7CisJdTMyIHRzb19zZWdzID0gY2Ffb3BzLT50c29fc2Vnc19nb2FsID8gY2Ffb3BzLT50c29fc2Vnc19nb2FsKHNrKSA6IDA7CisKKwlyZXR1cm4gdHNvX3NlZ3MgPyA6CisJCXRjcF90c29fYXV0b3NpemUoc2ssIG1zc19ub3csIHN5c2N0bF90Y3BfbWluX3Rzb19zZWdzKTsKK30KIAogLyogUmV0dXJucyB0aGUgcG9ydGlvbiBvZiBza2Igd2hpY2ggY2FuIGJlIHNlbnQgcmlnaHQgYXdheSAqLwogc3RhdGljIHVuc2lnbmVkIGludCB0Y3BfbXNzX3NwbGl0X3BvaW50KGNvbnN0IHN0cnVjdCBzb2NrICpzaywKQEAgLTE5NjYsMTIgKzE5OTIsMTQgQEAKIAlsZW4gPSAwOwogCXRjcF9mb3Jfd3JpdGVfcXVldWVfZnJvbV9zYWZlKHNrYiwgbmV4dCwgc2spIHsKIAkJY29weSA9IG1pbl90KGludCwgc2tiLT5sZW4sIHByb2JlX3NpemUgLSBsZW4pOwotCQlpZiAobnNrYi0+aXBfc3VtbWVkKQorCQlpZiAobnNrYi0+aXBfc3VtbWVkKSB7CiAJCQlza2JfY29weV9iaXRzKHNrYiwgMCwgc2tiX3B1dChuc2tiLCBjb3B5KSwgY29weSk7Ci0JCWVsc2UKLQkJCW5za2ItPmNzdW0gPSBza2JfY29weV9hbmRfY3N1bV9iaXRzKHNrYiwgMCwKLQkJCQkJCQkgICAgc2tiX3B1dChuc2tiLCBjb3B5KSwKLQkJCQkJCQkgICAgY29weSwgbnNrYi0+Y3N1bSk7CisJCX0gZWxzZSB7CisJCQlfX3dzdW0gY3N1bSA9IHNrYl9jb3B5X2FuZF9jc3VtX2JpdHMoc2tiLCAwLAorCQkJCQkJCSAgICAgc2tiX3B1dChuc2tiLCBjb3B5KSwKKwkJCQkJCQkgICAgIGNvcHksIDApOworCQkJbnNrYi0+Y3N1bSA9IGNzdW1fYmxvY2tfYWRkKG5za2ItPmNzdW0sIGNzdW0sIGxlbik7CisJCX0KIAogCQlpZiAoc2tiLT5sZW4gPD0gY29weSkgewogCQkJLyogV2UndmUgZWF0ZW4gYWxsIHRoZSBkYXRhIGZyb20gdGhpcyBza2IuCkBAIC0yMDIwLDYgKzIwNDgsMzkgQEAKIAlyZXR1cm4gLTE7CiB9CiAKKy8qIFRDUCBTbWFsbCBRdWV1ZXMgOgorICogQ29udHJvbCBudW1iZXIgb2YgcGFja2V0cyBpbiBxZGlzYy9kZXZpY2VzIHRvIHR3byBwYWNrZXRzIC8gb3IgfjEgbXMuCisgKiAoVGhlc2UgbGltaXRzIGFyZSBkb3VibGVkIGZvciByZXRyYW5zbWl0cykKKyAqIFRoaXMgYWxsb3dzIGZvciA6CisgKiAgLSBiZXR0ZXIgUlRUIGVzdGltYXRpb24gYW5kIEFDSyBzY2hlZHVsaW5nCisgKiAgLSBmYXN0ZXIgcmVjb3ZlcnkKKyAqICAtIGhpZ2ggcmF0ZXMKKyAqIEFsYXMsIHNvbWUgZHJpdmVycyAvIHN1YnN5c3RlbXMgcmVxdWlyZSBhIGZhaXIgYW1vdW50CisgKiBvZiBxdWV1ZWQgYnl0ZXMgdG8gZW5zdXJlIGxpbmUgcmF0ZS4KKyAqIE9uZSBleGFtcGxlIGlzIHdpZmkgYWdncmVnYXRpb24gKDgwMi4xMSBBTVBEVSkKKyAqLworc3RhdGljIGJvb2wgdGNwX3NtYWxsX3F1ZXVlX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHVuc2lnbmVkIGludCBmYWN0b3IpCit7CisJdW5zaWduZWQgaW50IGxpbWl0OworCisJbGltaXQgPSBtYXgoMiAqIHNrYi0+dHJ1ZXNpemUsIHNrLT5za19wYWNpbmdfcmF0ZSA+PiAxMCk7CisJbGltaXQgPSBtaW5fdCh1MzIsIGxpbWl0LCBzeXNjdGxfdGNwX2xpbWl0X291dHB1dF9ieXRlcyk7CisJbGltaXQgPDw9IGZhY3RvcjsKKworCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3dtZW1fYWxsb2MpID4gbGltaXQpIHsKKwkJc2V0X2JpdChUU1FfVEhST1RUTEVELCAmdGNwX3NrKHNrKS0+dHNxX2ZsYWdzKTsKKwkJLyogSXQgaXMgcG9zc2libGUgVFggY29tcGxldGlvbiBhbHJlYWR5IGhhcHBlbmVkCisJCSAqIGJlZm9yZSB3ZSBzZXQgVFNRX1RIUk9UVExFRCwgc28gd2UgbXVzdAorCQkgKiB0ZXN0IGFnYWluIHRoZSBjb25kaXRpb24uCisJCSAqLworCQlzbXBfbWJfX2FmdGVyX2F0b21pYygpOworCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSA+IGxpbWl0KQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKwogLyogVGhpcyByb3V0aW5lIHdyaXRlcyBwYWNrZXRzIHRvIHRoZSBuZXR3b3JrLiAgSXQgYWR2YW5jZXMgdGhlCiAgKiBzZW5kX2hlYWQuICBUaGlzIGhhcHBlbnMgYXMgaW5jb21pbmcgYWNrcyBvcGVuIHVwIHRoZSByZW1vdGUKICAqIHdpbmRvdyBmb3IgdXMuCkBAIC0yMDU3LDcgKzIxMTgsNyBAQAogCQl9CiAJfQogCi0JbWF4X3NlZ3MgPSB0Y3BfdHNvX2F1dG9zaXplKHNrLCBtc3Nfbm93KTsKKwltYXhfc2VncyA9IHRjcF90c29fc2VncyhzaywgbXNzX25vdyk7CiAJd2hpbGUgKChza2IgPSB0Y3Bfc2VuZF9oZWFkKHNrKSkpIHsKIAkJdW5zaWduZWQgaW50IGxpbWl0OwogCkBAIC0yMTA2LDI5ICsyMTY3LDggQEAKIAkJICAgIHVubGlrZWx5KHRzb19mcmFnbWVudChzaywgc2tiLCBsaW1pdCwgbXNzX25vdywgZ2ZwKSkpCiAJCQlicmVhazsKIAotCQkvKiBUQ1AgU21hbGwgUXVldWVzIDoKLQkJICogQ29udHJvbCBudW1iZXIgb2YgcGFja2V0cyBpbiBxZGlzYy9kZXZpY2VzIHRvIHR3byBwYWNrZXRzIC8gb3IgfjEgbXMuCi0JCSAqIFRoaXMgYWxsb3dzIGZvciA6Ci0JCSAqICAtIGJldHRlciBSVFQgZXN0aW1hdGlvbiBhbmQgQUNLIHNjaGVkdWxpbmcKLQkJICogIC0gZmFzdGVyIHJlY292ZXJ5Ci0JCSAqICAtIGhpZ2ggcmF0ZXMKLQkJICogQWxhcywgc29tZSBkcml2ZXJzIC8gc3Vic3lzdGVtcyByZXF1aXJlIGEgZmFpciBhbW91bnQKLQkJICogb2YgcXVldWVkIGJ5dGVzIHRvIGVuc3VyZSBsaW5lIHJhdGUuCi0JCSAqIE9uZSBleGFtcGxlIGlzIHdpZmkgYWdncmVnYXRpb24gKDgwMi4xMSBBTVBEVSkKLQkJICovCi0JCWxpbWl0ID0gbWF4KDIgKiBza2ItPnRydWVzaXplLCBzay0+c2tfcGFjaW5nX3JhdGUgPj4gMTApOwotCQlsaW1pdCA9IG1pbl90KHUzMiwgbGltaXQsIHN5c2N0bF90Y3BfbGltaXRfb3V0cHV0X2J5dGVzKTsKLQotCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSA+IGxpbWl0KSB7Ci0JCQlzZXRfYml0KFRTUV9USFJPVFRMRUQsICZ0cC0+dHNxX2ZsYWdzKTsKLQkJCS8qIEl0IGlzIHBvc3NpYmxlIFRYIGNvbXBsZXRpb24gYWxyZWFkeSBoYXBwZW5lZAotCQkJICogYmVmb3JlIHdlIHNldCBUU1FfVEhST1RUTEVELCBzbyB3ZSBtdXN0Ci0JCQkgKiB0ZXN0IGFnYWluIHRoZSBjb25kaXRpb24uCi0JCQkgKi8KLQkJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSA+IGxpbWl0KQotCQkJCWJyZWFrOwotCQl9CisJCWlmICh0Y3Bfc21hbGxfcXVldWVfY2hlY2soc2ssIHNrYiwgMCkpCisJCQlicmVhazsKIAogCQlpZiAodW5saWtlbHkodGNwX3RyYW5zbWl0X3NrYihzaywgc2tiLCAxLCBnZnApKSkKIAkJCWJyZWFrOwpAQCAtMjYwNSw3ICsyNjQ1LDggQEAKIAkgKiBjb3B5aW5nIG92ZXJoZWFkOiBmcmFnbWVudGF0aW9uLCB0dW5uZWxpbmcsIG1hbmdsaW5nIGV0Yy4KIAkgKi8KIAlpZiAoYXRvbWljX3JlYWQoJnNrLT5za193bWVtX2FsbG9jKSA+Ci0JICAgIG1pbihzay0+c2tfd21lbV9xdWV1ZWQgKyAoc2stPnNrX3dtZW1fcXVldWVkID4+IDIpLCBzay0+c2tfc25kYnVmKSkKKwkgICAgbWluX3QodTMyLCBzay0+c2tfd21lbV9xdWV1ZWQgKyAoc2stPnNrX3dtZW1fcXVldWVkID4+IDIpLAorCQkgIHNrLT5za19zbmRidWYpKQogCQlyZXR1cm4gLUVBR0FJTjsKIAogCWlmIChza2Jfc3RpbGxfaW5faG9zdF9xdWV1ZShzaywgc2tiKSkKQEAgLTI3NzQsOSArMjgxNSw5IEBACiAJCWxhc3RfbG9zdCA9IHRwLT5zbmRfdW5hOwogCX0KIAotCW1heF9zZWdzID0gdGNwX3Rzb19hdXRvc2l6ZShzaywgdGNwX2N1cnJlbnRfbXNzKHNrKSk7CisJbWF4X3NlZ3MgPSB0Y3BfdHNvX3NlZ3Moc2ssIHRjcF9jdXJyZW50X21zcyhzaykpOwogCXRjcF9mb3Jfd3JpdGVfcXVldWVfZnJvbShza2IsIHNrKSB7Ci0JCV9fdTggc2Fja2VkID0gVENQX1NLQl9DQihza2IpLT5zYWNrZWQ7CisJCV9fdTggc2Fja2VkOwogCQlpbnQgc2VnczsKIAogCQlpZiAoc2tiID09IHRjcF9zZW5kX2hlYWQoc2spKQpAQCAtMjc4OCw2ICsyODI5LDcgQEAKIAkJc2VncyA9IHRwLT5zbmRfY3duZCAtIHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCk7CiAJCWlmIChzZWdzIDw9IDApCiAJCQlyZXR1cm47CisJCXNhY2tlZCA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkOwogCQkvKiBJbiBjYXNlIHRjcF9zaGlmdF9za2JfZGF0YSgpIGhhdmUgYWdncmVnYXRlZCBsYXJnZSBza2JzLAogCQkgKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBub3Qgc2VuZGluZyB0b28gYmlncyBUU08gcGFja2V0cwogCQkgKi8KQEAgLTI4MjcsMTAgKzI4NjksMTMgQEAKIAkJaWYgKHNhY2tlZCAmIChUQ1BDQl9TQUNLRURfQUNLRUR8VENQQ0JfU0FDS0VEX1JFVFJBTlMpKQogCQkJY29udGludWU7CiAKKwkJaWYgKHRjcF9zbWFsbF9xdWV1ZV9jaGVjayhzaywgc2tiLCAxKSkKKwkJCXJldHVybjsKKwogCQlpZiAodGNwX3JldHJhbnNtaXRfc2tiKHNrLCBza2IsIHNlZ3MpKQogCQkJcmV0dXJuOwogCi0JCU5FVF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBtaWJfaWR4KTsKKwkJTkVUX0FERF9TVEFUUyhzb2NrX25ldChzayksIG1pYl9pZHgsIHRjcF9za2JfcGNvdW50KHNrYikpOwogCiAJCWlmICh0Y3BfaW5fY3duZF9yZWR1Y3Rpb24oc2spKQogCQkJdHAtPnBycl9vdXQgKz0gdGNwX3NrYl9wY291bnQoc2tiKTsKQEAgLTM1NjcsNiArMzYxMiw4IEBACiAJaWYgKCFyZXMpIHsKIAkJX19UQ1BfSU5DX1NUQVRTKHNvY2tfbmV0KHNrKSwgVENQX01JQl9SRVRSQU5TU0VHUyk7CiAJCV9fTkVUX0lOQ19TVEFUUyhzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BTWU5SRVRSQU5TKTsKKwkJaWYgKHVubGlrZWx5KHRjcF9wYXNzaXZlX2Zhc3RvcGVuKHNrKSkpCisJCQl0Y3Bfc2soc2spLT50b3RhbF9yZXRyYW5zKys7CiAJfQogCXJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfcmF0ZS5jIGIvbmV0L2lwdjQvdGNwX3JhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmUxNTgxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2lwdjQvdGNwX3JhdGUuYwpAQCAtMCwwICsxLDE4NiBAQAorI2luY2x1ZGUgPG5ldC90Y3AuaD4KKworLyogVGhlIGJhbmR3aWR0aCBlc3RpbWF0b3IgZXN0aW1hdGVzIHRoZSByYXRlIGF0IHdoaWNoIHRoZSBuZXR3b3JrCisgKiBjYW4gY3VycmVudGx5IGRlbGl2ZXIgb3V0Ym91bmQgZGF0YSBwYWNrZXRzIGZvciB0aGlzIGZsb3cuIEF0IGEgaGlnaAorICogbGV2ZWwsIGl0IG9wZXJhdGVzIGJ5IHRha2luZyBhIGRlbGl2ZXJ5IHJhdGUgc2FtcGxlIGZvciBlYWNoIEFDSy4KKyAqCisgKiBBIHJhdGUgc2FtcGxlIHJlY29yZHMgdGhlIHJhdGUgYXQgd2hpY2ggdGhlIG5ldHdvcmsgZGVsaXZlcmVkIHBhY2tldHMKKyAqIGZvciB0aGlzIGZsb3csIGNhbGN1bGF0ZWQgb3ZlciB0aGUgdGltZSBpbnRlcnZhbCBiZXR3ZWVuIHRoZSB0cmFuc21pc3Npb24KKyAqIG9mIGEgZGF0YSBwYWNrZXQgYW5kIHRoZSBhY2tub3dsZWRnbWVudCBvZiB0aGF0IHBhY2tldC4KKyAqCisgKiBTcGVjaWZpY2FsbHksIG92ZXIgdGhlIGludGVydmFsIGJldHdlZW4gZWFjaCB0cmFuc21pdCBhbmQgY29ycmVzcG9uZGluZyBBQ0ssCisgKiB0aGUgZXN0aW1hdG9yIGdlbmVyYXRlcyBhIGRlbGl2ZXJ5IHJhdGUgc2FtcGxlLiBUeXBpY2FsbHkgaXQgdXNlcyB0aGUgcmF0ZQorICogYXQgd2hpY2ggcGFja2V0cyB3ZXJlIGFja25vd2xlZGdlZC4gSG93ZXZlciwgdGhlIGFwcHJvYWNoIG9mIHVzaW5nIG9ubHkgdGhlCisgKiBhY2tub3dsZWRnbWVudCByYXRlIGZhY2VzIGEgY2hhbGxlbmdlIHVuZGVyIHRoZSBwcmV2YWxlbnQgQUNLIGRlY2ltYXRpb24gb3IKKyAqIGNvbXByZXNzaW9uOiBwYWNrZXRzIGNhbiB0ZW1wb3JhcmlseSBhcHBlYXIgdG8gYmUgZGVsaXZlcmVkIG11Y2ggcXVpY2tlcgorICogdGhhbiB0aGUgYm90dGxlbmVjayByYXRlLiBTaW5jZSBpdCBpcyBwaHlzaWNhbGx5IGltcG9zc2libGUgdG8gZG8gdGhhdCBpbiBhCisgKiBzdXN0YWluZWQgZmFzaGlvbiwgd2hlbiB0aGUgZXN0aW1hdG9yIG5vdGljZXMgdGhhdCB0aGUgQUNLIHJhdGUgaXMgZmFzdGVyCisgKiB0aGFuIHRoZSB0cmFuc21pdCByYXRlLCBpdCB1c2VzIHRoZSBsYXR0ZXI6CisgKgorICogICAgc2VuZF9yYXRlID0gI3BrdHNfZGVsaXZlcmVkLyhsYXN0X3NuZF90aW1lIC0gZmlyc3Rfc25kX3RpbWUpCisgKiAgICBhY2tfcmF0ZSAgPSAjcGt0c19kZWxpdmVyZWQvKGxhc3RfYWNrX3RpbWUgLSBmaXJzdF9hY2tfdGltZSkKKyAqICAgIGJ3ID0gbWluKHNlbmRfcmF0ZSwgYWNrX3JhdGUpCisgKgorICogTm90aWNlIHRoZSBlc3RpbWF0b3IgZXNzZW50aWFsbHkgZXN0aW1hdGVzIHRoZSBnb29kcHV0LCBub3QgYWx3YXlzIHRoZQorICogbmV0d29yayBib3R0bGVuZWNrIGxpbmsgcmF0ZSB3aGVuIHRoZSBzZW5kaW5nIG9yIHJlY2VpdmluZyBpcyBsaW1pdGVkIGJ5CisgKiBvdGhlciBmYWN0b3JzIGxpa2UgYXBwbGljYXRpb25zIG9yIHJlY2VpdmVyIHdpbmRvdyBsaW1pdHMuICBUaGUgZXN0aW1hdG9yCisgKiBkZWxpYmVyYXRlbHkgYXZvaWRzIHVzaW5nIHRoZSBpbnRlci1wYWNrZXQgc3BhY2luZyBhcHByb2FjaCBiZWNhdXNlIHRoYXQKKyAqIGFwcHJvYWNoIHJlcXVpcmVzIGEgbGFyZ2UgbnVtYmVyIG9mIHNhbXBsZXMgYW5kIHNvcGhpc3RpY2F0ZWQgZmlsdGVyaW5nLgorICoKKyAqIFRDUCBmbG93cyBjYW4gb2Z0ZW4gYmUgYXBwbGljYXRpb24tbGltaXRlZCBpbiByZXF1ZXN0L3Jlc3BvbnNlIHdvcmtsb2Fkcy4KKyAqIFRoZSBlc3RpbWF0b3IgbWFya3MgYSBiYW5kd2lkdGggc2FtcGxlIGFzIGFwcGxpY2F0aW9uLWxpbWl0ZWQgaWYgdGhlcmUKKyAqIHdhcyBzb21lIG1vbWVudCBkdXJpbmcgdGhlIHNhbXBsZWQgd2luZG93IG9mIHBhY2tldHMgd2hlbiB0aGVyZSB3YXMgbm8gZGF0YQorICogcmVhZHkgdG8gc2VuZCBpbiB0aGUgd3JpdGUgcXVldWUuCisgKi8KKworLyogU25hcHNob3QgdGhlIGN1cnJlbnQgZGVsaXZlcnkgaW5mb3JtYXRpb24gaW4gdGhlIHNrYiwgdG8gZ2VuZXJhdGUKKyAqIGEgcmF0ZSBzYW1wbGUgbGF0ZXIgd2hlbiB0aGUgc2tiIGlzIChzKWFja2VkIGluIHRjcF9yYXRlX3NrYl9kZWxpdmVyZWQoKS4KKyAqLwordm9pZCB0Y3BfcmF0ZV9za2Jfc2VudChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CisKKwkgLyogSW4gZ2VuZXJhbCB3ZSBuZWVkIHRvIHN0YXJ0IGRlbGl2ZXJ5IHJhdGUgc2FtcGxlcyBmcm9tIHRoZQorCSAgKiB0aW1lIHdlIHJlY2VpdmVkIHRoZSBtb3N0IHJlY2VudCBBQ0ssIHRvIGVuc3VyZSB3ZSBpbmNsdWRlCisJICAqIHRoZSBmdWxsIHRpbWUgdGhlIG5ldHdvcmsgbmVlZHMgdG8gZGVsaXZlciBhbGwgaW4tZmxpZ2h0CisJICAqIHBhY2tldHMuIElmIHRoZXJlIGFyZSBubyBwYWNrZXRzIGluIGZsaWdodCB5ZXQsIHRoZW4gd2UKKwkgICoga25vdyB0aGF0IGFueSBBQ0tzIGFmdGVyIG5vdyBpbmRpY2F0ZSB0aGF0IHRoZSBuZXR3b3JrIHdhcworCSAgKiBhYmxlIHRvIGRlbGl2ZXIgdGhvc2UgcGFja2V0cyBjb21wbGV0ZWx5IGluIHRoZSBzYW1wbGluZworCSAgKiBpbnRlcnZhbCBiZXR3ZWVuIG5vdyBhbmQgdGhlIG5leHQgQUNLLgorCSAgKgorCSAgKiBOb3RlIHRoYXQgd2UgdXNlIHBhY2tldHNfb3V0IGluc3RlYWQgb2YgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKQorCSAgKiBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMgYSBndWVzcyBiYXNlZCBvbiBSVE8gYW5kIGxvc3MtbWFya2luZworCSAgKiBoZXVyaXN0aWNzLiBXZSBkb24ndCB3YW50IHNwdXJpb3VzIFJUT3Mgb3IgbG9zcyBtYXJraW5ncyB0byBjYXVzZQorCSAgKiBhIHNwdXJpb3VzbHkgc21hbGwgdGltZSBpbnRlcnZhbCwgY2F1c2luZyBhIHNwdXJpb3VzbHkgaGlnaAorCSAgKiBiYW5kd2lkdGggZXN0aW1hdGUuCisJICAqLworCWlmICghdHAtPnBhY2tldHNfb3V0KSB7CisJCXRwLT5maXJzdF90eF9tc3RhbXAgID0gc2tiLT5za2JfbXN0YW1wOworCQl0cC0+ZGVsaXZlcmVkX21zdGFtcCA9IHNrYi0+c2tiX21zdGFtcDsKKwl9CisKKwlUQ1BfU0tCX0NCKHNrYiktPnR4LmZpcnN0X3R4X21zdGFtcAk9IHRwLT5maXJzdF90eF9tc3RhbXA7CisJVENQX1NLQl9DQihza2IpLT50eC5kZWxpdmVyZWRfbXN0YW1wCT0gdHAtPmRlbGl2ZXJlZF9tc3RhbXA7CisJVENQX1NLQl9DQihza2IpLT50eC5kZWxpdmVyZWQJCT0gdHAtPmRlbGl2ZXJlZDsKKwlUQ1BfU0tCX0NCKHNrYiktPnR4LmlzX2FwcF9saW1pdGVkCT0gdHAtPmFwcF9saW1pdGVkID8gMSA6IDA7Cit9CisKKy8qIFdoZW4gYW4gc2tiIGlzIHNhY2tlZCBvciBhY2tlZCwgd2UgZmlsbCBpbiB0aGUgcmF0ZSBzYW1wbGUgd2l0aCB0aGUgKHByaW9yKQorICogZGVsaXZlcnkgaW5mb3JtYXRpb24gd2hlbiB0aGUgc2tiIHdhcyBsYXN0IHRyYW5zbWl0dGVkLgorICoKKyAqIElmIGFuIEFDSyAocylhY2tzIG11bHRpcGxlIHNrYnMgKGUuZy4sIHN0cmV0Y2hlZC1hY2tzKSwgdGhpcyBmdW5jdGlvbiBpcworICogY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBXZSBmYXZvciB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbW9zdCByZWNlbnRseQorICogc2VudCBza2IsIGkuZS4sIHRoZSBza2Igd2l0aCB0aGUgaGlnaGVzdCBwcmlvcl9kZWxpdmVyZWQgY291bnQuCisgKi8KK3ZvaWQgdGNwX3JhdGVfc2tiX2RlbGl2ZXJlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgdGNwX3NrYl9jYiAqc2NiID0gVENQX1NLQl9DQihza2IpOworCisJaWYgKCFzY2ItPnR4LmRlbGl2ZXJlZF9tc3RhbXAudjY0KQorCQlyZXR1cm47CisKKwlpZiAoIXJzLT5wcmlvcl9kZWxpdmVyZWQgfHwKKwkgICAgYWZ0ZXIoc2NiLT50eC5kZWxpdmVyZWQsIHJzLT5wcmlvcl9kZWxpdmVyZWQpKSB7CisJCXJzLT5wcmlvcl9kZWxpdmVyZWQgID0gc2NiLT50eC5kZWxpdmVyZWQ7CisJCXJzLT5wcmlvcl9tc3RhbXAgICAgID0gc2NiLT50eC5kZWxpdmVyZWRfbXN0YW1wOworCQlycy0+aXNfYXBwX2xpbWl0ZWQgICA9IHNjYi0+dHguaXNfYXBwX2xpbWl0ZWQ7CisJCXJzLT5pc19yZXRyYW5zCSAgICAgPSBzY2ItPnNhY2tlZCAmIFRDUENCX1JFVFJBTlM7CisKKwkJLyogRmluZCB0aGUgZHVyYXRpb24gb2YgdGhlICJzZW5kIHBoYXNlIiBvZiB0aGlzIHdpbmRvdzogKi8KKwkJcnMtPmludGVydmFsX3VzICAgICAgPSBza2JfbXN0YW1wX3VzX2RlbHRhKAorCQkJCQkJJnNrYi0+c2tiX21zdGFtcCwKKwkJCQkJCSZzY2ItPnR4LmZpcnN0X3R4X21zdGFtcCk7CisKKwkJLyogUmVjb3JkIHNlbmQgdGltZSBvZiBtb3N0IHJlY2VudGx5IEFDS2VkIHBhY2tldDogKi8KKwkJdHAtPmZpcnN0X3R4X21zdGFtcCAgPSBza2ItPnNrYl9tc3RhbXA7CisJfQorCS8qIE1hcmsgb2ZmIHRoZSBza2IgZGVsaXZlcmVkIG9uY2UgaXQncyBzYWNrZWQgdG8gYXZvaWQgYmVpbmcKKwkgKiB1c2VkIGFnYWluIHdoZW4gaXQncyBjdW11bGF0aXZlbHkgYWNrZWQuIEZvciBhY2tlZCBwYWNrZXRzCisJICogd2UgZG9uJ3QgbmVlZCB0byByZXNldCBzaW5jZSBpdCdsbCBiZSBmcmVlZCBzb29uLgorCSAqLworCWlmIChzY2ItPnNhY2tlZCAmIFRDUENCX1NBQ0tFRF9BQ0tFRCkKKwkJc2NiLT50eC5kZWxpdmVyZWRfbXN0YW1wLnY2NCA9IDA7Cit9CisKKy8qIFVwZGF0ZSB0aGUgY29ubmVjdGlvbiBkZWxpdmVyeSBpbmZvcm1hdGlvbiBhbmQgZ2VuZXJhdGUgYSByYXRlIHNhbXBsZS4gKi8KK3ZvaWQgdGNwX3JhdGVfZ2VuKHN0cnVjdCBzb2NrICpzaywgdTMyIGRlbGl2ZXJlZCwgdTMyIGxvc3QsCisJCSAgc3RydWN0IHNrYl9tc3RhbXAgKm5vdywgc3RydWN0IHJhdGVfc2FtcGxlICpycykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwl1MzIgc25kX3VzLCBhY2tfdXM7CisKKwkvKiBDbGVhciBhcHAgbGltaXRlZCBpZiBidWJibGUgaXMgYWNrZWQgYW5kIGdvbmUuICovCisJaWYgKHRwLT5hcHBfbGltaXRlZCAmJiBhZnRlcih0cC0+ZGVsaXZlcmVkLCB0cC0+YXBwX2xpbWl0ZWQpKQorCQl0cC0+YXBwX2xpbWl0ZWQgPSAwOworCisJLyogVE9ETzogdGhlcmUgYXJlIG11bHRpcGxlIHBsYWNlcyB0aHJvdWdob3V0IHRjcF9hY2soKSB0byBnZXQKKwkgKiBjdXJyZW50IHRpbWUuIFJlZmFjdG9yIHRoZSBjb2RlIHVzaW5nIGEgbmV3ICJ0Y3BfYWNrdGFnX3N0YXRlIgorCSAqIHRvIGNhcnJ5IGN1cnJlbnQgdGltZSwgZmxhZ3MsIHN0YXRzIGxpa2UgInRjcF9zYWNrdGFnX3N0YXRlIi4KKwkgKi8KKwlpZiAoZGVsaXZlcmVkKQorCQl0cC0+ZGVsaXZlcmVkX21zdGFtcCA9ICpub3c7CisKKwlycy0+YWNrZWRfc2Fja2VkID0gZGVsaXZlcmVkOwkvKiBmcmVzaGx5IEFDS2VkIG9yIFNBQ0tlZCAqLworCXJzLT5sb3NzZXMgPSBsb3N0OwkJLyogZnJlc2hseSBtYXJrZWQgbG9zdCAqLworCS8qIFJldHVybiBhbiBpbnZhbGlkIHNhbXBsZSBpZiBubyB0aW1pbmcgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLiAqLworCWlmICghcnMtPnByaW9yX21zdGFtcC52NjQpIHsKKwkJcnMtPmRlbGl2ZXJlZCA9IC0xOworCQlycy0+aW50ZXJ2YWxfdXMgPSAtMTsKKwkJcmV0dXJuOworCX0KKwlycy0+ZGVsaXZlcmVkICAgPSB0cC0+ZGVsaXZlcmVkIC0gcnMtPnByaW9yX2RlbGl2ZXJlZDsKKworCS8qIE1vZGVsIHNlbmRpbmcgZGF0YSBhbmQgcmVjZWl2aW5nIEFDS3MgYXMgc2VwYXJhdGUgcGlwZWxpbmUgcGhhc2VzCisJICogZm9yIGEgd2luZG93LiBVc3VhbGx5IHRoZSBBQ0sgcGhhc2UgaXMgbG9uZ2VyLCBidXQgd2l0aCBBQ0sKKwkgKiBjb21wcmVzc2lvbiB0aGUgc2VuZCBwaGFzZSBjYW4gYmUgbG9uZ2VyLiBUbyBiZSBzYWZlIHdlIHVzZSB0aGUKKwkgKiBsb25nZXIgcGhhc2UuCisJICovCisJc25kX3VzID0gcnMtPmludGVydmFsX3VzOwkJCQkvKiBzZW5kIHBoYXNlICovCisJYWNrX3VzID0gc2tiX21zdGFtcF91c19kZWx0YShub3csICZycy0+cHJpb3JfbXN0YW1wKTsJLyogYWNrIHBoYXNlICovCisJcnMtPmludGVydmFsX3VzID0gbWF4KHNuZF91cywgYWNrX3VzKTsKKworCS8qIE5vcm1hbGx5IHdlIGV4cGVjdCBpbnRlcnZhbF91cyA+PSBtaW4tcnR0LgorCSAqIE5vdGUgdGhhdCByYXRlIG1heSBzdGlsbCBiZSBvdmVyLWVzdGltYXRlZCB3aGVuIGEgc3B1cmlvdXNseQorCSAqIHJldHJhbnNtaXN0dGVkIHNrYiB3YXMgZmlyc3QgKHMpYWNrZWQgYmVjYXVzZSAiaW50ZXJ2YWxfdXMiCisJICogaXMgdW5kZXItZXN0aW1hdGVkICh1cCB0byBhbiBSVFQpLiBIb3dldmVyIGNvbnRpbnVvdXNseQorCSAqIG1lYXN1cmluZyB0aGUgZGVsaXZlcnkgcmF0ZSBkdXJpbmcgbG9zcyByZWNvdmVyeSBpcyBjcnVjaWFsCisJICogZm9yIGNvbm5lY3Rpb25zIHN1ZmZlciBoZWF2eSBvciBwcm9sb25nZWQgbG9zc2VzLgorCSAqLworCWlmICh1bmxpa2VseShycy0+aW50ZXJ2YWxfdXMgPCB0Y3BfbWluX3J0dCh0cCkpKSB7CisJCWlmICghcnMtPmlzX3JldHJhbnMpCisJCQlwcl9kZWJ1ZygidGNwIHJhdGU6ICVsZCAlZCAldSAldSAldVxuIiwKKwkJCQkgcnMtPmludGVydmFsX3VzLCBycy0+ZGVsaXZlcmVkLAorCQkJCSBpbmV0X2NzayhzayktPmljc2tfY2Ffc3RhdGUsCisJCQkJIHRwLT5yeF9vcHQuc2Fja19vaywgdGNwX21pbl9ydHQodHApKTsKKwkJcnMtPmludGVydmFsX3VzID0gLTE7CisJCXJldHVybjsKKwl9CisKKwkvKiBSZWNvcmQgdGhlIGxhc3Qgbm9uLWFwcC1saW1pdGVkIG9yIHRoZSBoaWdoZXN0IGFwcC1saW1pdGVkIGJ3ICovCisJaWYgKCFycy0+aXNfYXBwX2xpbWl0ZWQgfHwKKwkgICAgKCh1NjQpcnMtPmRlbGl2ZXJlZCAqIHRwLT5yYXRlX2ludGVydmFsX3VzID49CisJICAgICAodTY0KXRwLT5yYXRlX2RlbGl2ZXJlZCAqIHJzLT5pbnRlcnZhbF91cykpIHsKKwkJdHAtPnJhdGVfZGVsaXZlcmVkID0gcnMtPmRlbGl2ZXJlZDsKKwkJdHAtPnJhdGVfaW50ZXJ2YWxfdXMgPSBycy0+aW50ZXJ2YWxfdXM7CisJCXRwLT5yYXRlX2FwcF9saW1pdGVkID0gcnMtPmlzX2FwcF9saW1pdGVkOworCX0KK30KKworLyogSWYgYSBnYXAgaXMgZGV0ZWN0ZWQgYmV0d2VlbiBzZW5kcywgbWFyayB0aGUgc29ja2V0IGFwcGxpY2F0aW9uLWxpbWl0ZWQuICovCit2b2lkIHRjcF9yYXRlX2NoZWNrX2FwcF9saW1pdGVkKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKworCWlmICgvKiBXZSBoYXZlIGxlc3MgdGhhbiBvbmUgcGFja2V0IHRvIHNlbmQuICovCisJICAgIHRwLT53cml0ZV9zZXEgLSB0cC0+c25kX254dCA8IHRwLT5tc3NfY2FjaGUgJiYKKwkgICAgLyogTm90aGluZyBpbiBzZW5kaW5nIGhvc3QncyBxZGlzYyBxdWV1ZXMgb3IgTklDIHR4IHF1ZXVlLiAqLworCSAgICBza193bWVtX2FsbG9jX2dldChzaykgPCBTS0JfVFJVRVNJWkUoMSkgJiYKKwkgICAgLyogV2UgYXJlIG5vdCBsaW1pdGVkIGJ5IENXTkQuICovCisJICAgIHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCkgPCB0cC0+c25kX2N3bmQgJiYKKwkgICAgLyogQWxsIGxvc3QgcGFja2V0cyBoYXZlIGJlZW4gcmV0cmFuc21pdHRlZC4gKi8KKwkgICAgdHAtPmxvc3Rfb3V0IDw9IHRwLT5yZXRyYW5zX291dCkKKwkJdHAtPmFwcF9saW1pdGVkID0KKwkJCSh0cC0+ZGVsaXZlcmVkICsgdGNwX3BhY2tldHNfaW5fZmxpZ2h0KHRwKSkgPyA6IDE7Cit9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfdGltZXIuYyBiL25ldC9pcHY0L3RjcF90aW1lci5jCmluZGV4IGQ4NDkzMGIuLjNlYTFjZjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF90aW1lci5jCisrKyBiL25ldC9pcHY0L3RjcF90aW1lci5jCkBAIC0xOTIsNiArMTkyLDggQEAKIAkJCWlmICh0cC0+c3luX2RhdGEgJiYgaWNzay0+aWNza19yZXRyYW5zbWl0cyA9PSAxKQogCQkJCU5FVF9JTkNfU1RBVFMoc29ja19uZXQoc2spLAogCQkJCQkgICAgICBMSU5VWF9NSUJfVENQRkFTVE9QRU5BQ1RJVkVGQUlMKTsKKwkJfSBlbHNlIGlmICghdHAtPnN5bl9kYXRhICYmICF0cC0+c3luX2Zhc3RvcGVuKSB7CisJCQlza19yZXRoaW5rX3R4aGFzaChzayk7CiAJCX0KIAkJcmV0cnlfdW50aWwgPSBpY3NrLT5pY3NrX3N5bl9yZXRyaWVzID8gOiBuZXQtPmlwdjQuc3lzY3RsX3RjcF9zeW5fcmV0cmllczsKIAkJc3luX3NldCA9IHRydWU7CkBAIC0yMTMsNiArMjE1LDggQEAKIAkJCXRjcF9tdHVfcHJvYmluZyhpY3NrLCBzayk7CiAKIAkJCWRzdF9uZWdhdGl2ZV9hZHZpY2Uoc2spOworCQl9IGVsc2UgeworCQkJc2tfcmV0aGlua190eGhhc2goc2spOwogCQl9CiAKIAkJcmV0cnlfdW50aWwgPSBuZXQtPmlwdjQuc3lzY3RsX3RjcF9yZXRyaWVzMjsKQEAgLTM4NCw2ICszODgsNyBAQAogCSAqLwogCWluZXRfcnR4X3N5bl9hY2soc2ssIHJlcSk7CiAJcmVxLT5udW1fdGltZW91dCsrOworCWljc2stPmljc2tfcmV0cmFuc21pdHMrKzsKIAlpbmV0X2Nza19yZXNldF94bWl0X3RpbWVyKHNrLCBJQ1NLX1RJTUVfUkVUUkFOUywKIAkJCSAgVENQX1RJTUVPVVRfSU5JVCA8PCByZXEtPm51bV90aW1lb3V0LCBUQ1BfUlRPX01BWCk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfeWVhaC5jIGIvbmV0L2lwdjQvdGNwX3llYWguYwppbmRleCAwMjhlYjA0Li45YzVmYzk3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfeWVhaC5jCisrKyBiL25ldC9pcHY0L3RjcF95ZWFoLmMKQEAgLTc2LDcgKzc2LDcgQEAKIAlpZiAoIXRjcF9pc19jd25kX2xpbWl0ZWQoc2spKQogCQlyZXR1cm47CiAKLQlpZiAodHAtPnNuZF9jd25kIDw9IHRwLT5zbmRfc3N0aHJlc2gpCisJaWYgKHRjcF9pbl9zbG93X3N0YXJ0KHRwKSkKIAkJdGNwX3Nsb3dfc3RhcnQodHAsIGFja2VkKTsKIAogCWVsc2UgaWYgKCF5ZWFoLT5kb2luZ19yZW5vX25vdykgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwppbmRleCBlNjFmN2NkLi43ZDk2ZGMyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHAuYworKysgYi9uZXQvaXB2NC91ZHAuYwpAQCAtMTE0LDYgKzExNCw3IEBACiAjaW5jbHVkZSA8bmV0L2J1c3lfcG9sbC5oPgogI2luY2x1ZGUgInVkcF9pbXBsLmgiCiAjaW5jbHVkZSA8bmV0L3NvY2tfcmV1c2Vwb3J0Lmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CiAKIHN0cnVjdCB1ZHBfdGFibGUgdWRwX3RhYmxlIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKHVkcF90YWJsZSk7CkBAIC0xMDIwLDEyICsxMDIxLDYgQEAKIAkJCQkgICBmbG93X2ZsYWdzLAogCQkJCSAgIGZhZGRyLCBzYWRkciwgZHBvcnQsIGluZXQtPmluZXRfc3BvcnQpOwogCi0JCWlmICghc2FkZHIgJiYgaXBjLm9pZikgewotCQkJZXJyID0gbDNtZGV2X2dldF9zYWRkcihuZXQsIGlwYy5vaWYsIGZsNCk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlnb3RvIG91dDsKLQkJfQotCiAJCXNlY3VyaXR5X3NrX2NsYXNzaWZ5X2Zsb3coc2ssIGZsb3dpNF90b19mbG93aShmbDQpKTsKIAkJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfZmxvdyhuZXQsIGZsNCwgc2spOwogCQlpZiAoSVNfRVJSKHJ0KSkgewpAQCAtMTE4MiwxMyArMTE3NywxMyBAQAogICoJQHNrOiBzb2NrZXQKICAqCiAgKglEcm9wcyBhbGwgYmFkIGNoZWNrc3VtIGZyYW1lcywgdW50aWwgYSB2YWxpZCBvbmUgaXMgZm91bmQuCi0gKglSZXR1cm5zIHRoZSBsZW5ndGggb2YgZm91bmQgc2tiLCBvciAwIGlmIG5vbmUgaXMgZm91bmQuCisgKglSZXR1cm5zIHRoZSBsZW5ndGggb2YgZm91bmQgc2tiLCBvciAtMSBpZiBub25lIGlzIGZvdW5kLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGZpcnN0X3BhY2tldF9sZW5ndGgoc3RydWN0IHNvY2sgKnNrKQorc3RhdGljIGludCBmaXJzdF9wYWNrZXRfbGVuZ3RoKHN0cnVjdCBzb2NrICpzaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGxpc3Rfa2lsbCwgKnJjdnEgPSAmc2stPnNrX3JlY2VpdmVfcXVldWU7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBpbnQgcmVzOworCWludCByZXM7CiAKIAlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJmxpc3Rfa2lsbCk7CiAKQEAgLTEyMDMsNyArMTE5OCw3IEBACiAJCV9fc2tiX3VubGluayhza2IsIHJjdnEpOwogCQlfX3NrYl9xdWV1ZV90YWlsKCZsaXN0X2tpbGwsIHNrYik7CiAJfQotCXJlcyA9IHNrYiA/IHNrYi0+bGVuIDogMDsKKwlyZXMgPSBza2IgPyBza2ItPmxlbiA6IC0xOwogCXNwaW5fdW5sb2NrX2JoKCZyY3ZxLT5sb2NrKTsKIAogCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZsaXN0X2tpbGwpKSB7CkBAIC0xMjMyLDcgKzEyMjcsNyBAQAogCiAJY2FzZSBTSU9DSU5ROgogCXsKLQkJdW5zaWduZWQgaW50IGFtb3VudCA9IGZpcnN0X3BhY2tldF9sZW5ndGgoc2spOworCQlpbnQgYW1vdW50ID0gbWF4X3QoaW50LCAwLCBmaXJzdF9wYWNrZXRfbGVuZ3RoKHNrKSk7CiAKIAkJcmV0dXJuIHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOwogCX0KQEAgLTIxODQsNyArMjE3OSw3IEBACiAKIAkvKiBDaGVjayBmb3IgZmFsc2UgcG9zaXRpdmVzIGR1ZSB0byBjaGVja3N1bSBlcnJvcnMgKi8KIAlpZiAoKG1hc2sgJiBQT0xMUkROT1JNKSAmJiAhKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJgotCSAgICAhKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikgJiYgIWZpcnN0X3BhY2tldF9sZW5ndGgoc2spKQorCSAgICAhKHNrLT5za19zaHV0ZG93biAmIFJDVl9TSFVURE9XTikgJiYgZmlyc3RfcGFja2V0X2xlbmd0aChzaykgPT0gLTEpCiAJCW1hc2sgJj0gfihQT0xMSU4gfCBQT0xMUkROT1JNKTsKIAogCXJldHVybiBtYXNrOwpAQCAtMjE5Miw2ICsyMTg3LDIwIEBACiB9CiBFWFBPUlRfU1lNQk9MKHVkcF9wb2xsKTsKIAoraW50IHVkcF9hYm9ydChzdHJ1Y3Qgc29jayAqc2ssIGludCBlcnIpCit7CisJbG9ja19zb2NrKHNrKTsKKworCXNrLT5za19lcnIgPSBlcnI7CisJc2stPnNrX2Vycm9yX3JlcG9ydChzayk7CisJdWRwX2Rpc2Nvbm5lY3Qoc2ssIDApOworCisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodWRwX2Fib3J0KTsKKwogc3RydWN0IHByb3RvIHVkcF9wcm90ID0gewogCS5uYW1lCQkgICA9ICJVRFAiLAogCS5vd25lcgkJICAgPSBUSElTX01PRFVMRSwKQEAgLTIyMTYsMTMgKzIyMjUsMTIgQEAKIAkuc3lzY3RsX3dtZW0JICAgPSAmc3lzY3RsX3VkcF93bWVtX21pbiwKIAkuc3lzY3RsX3JtZW0JICAgPSAmc3lzY3RsX3VkcF9ybWVtX21pbiwKIAkub2JqX3NpemUJICAgPSBzaXplb2Yoc3RydWN0IHVkcF9zb2NrKSwKLQkuc2xhYl9mbGFncwkgICA9IFNMQUJfREVTVFJPWV9CWV9SQ1UsCiAJLmgudWRwX3RhYmxlCSAgID0gJnVkcF90YWJsZSwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9zZXRzb2Nrb3B0ID0gY29tcGF0X3VkcF9zZXRzb2Nrb3B0LAogCS5jb21wYXRfZ2V0c29ja29wdCA9IGNvbXBhdF91ZHBfZ2V0c29ja29wdCwKICNlbmRpZgotCS5jbGVhcl9zawkgICA9IHNrX3Byb3RfY2xlYXJfcG9ydGFkZHJfbnVsbHMsCisJLmRpYWdfZGVzdHJveQkgICA9IHVkcF9hYm9ydCwKIH07CiBFWFBPUlRfU1lNQk9MKHVkcF9wcm90KTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwX2RpYWcuYyBiL25ldC9pcHY0L3VkcF9kaWFnLmMKaW5kZXggM2Q1Y2NmNC4uOWE4OWMxMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwX2RpYWcuYworKysgYi9uZXQvaXB2NC91ZHBfZGlhZy5jCkBAIC0yMCw3ICsyMCw3IEBACiBzdGF0aWMgaW50IHNrX2RpYWdfZHVtcChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCiAJCQljb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxLAotCQkJc3RydWN0IG5sYXR0ciAqYmMpCisJCQlzdHJ1Y3QgbmxhdHRyICpiYywgYm9vbCBuZXRfYWRtaW4pCiB7CiAJaWYgKCFpbmV0X2RpYWdfYmNfc2soYmMsIHNrKSkKIAkJcmV0dXJuIDA7CkBAIC0yOCw3ICsyOCw3IEBACiAJcmV0dXJuIGluZXRfc2tfZGlhZ19maWxsKHNrLCBOVUxMLCBza2IsIHJlcSwKIAkJCXNrX3VzZXJfbnMoTkVUTElOS19DQihjYi0+c2tiKS5zayksCiAJCQlORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKLQkJCWNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIGNiLT5ubGgpOworCQkJY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwgY2ItPm5saCwgbmV0X2FkbWluKTsKIH0KIAogc3RhdGljIGludCB1ZHBfZHVtcF9vbmUoc3RydWN0IHVkcF90YWJsZSAqdGJsLCBzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLApAQCAtNzYsNyArNzYsOCBAQAogCWVyciA9IGluZXRfc2tfZGlhZ19maWxsKHNrLCBOVUxMLCByZXAsIHJlcSwKIAkJCSAgIHNrX3VzZXJfbnMoTkVUTElOS19DQihpbl9za2IpLnNrKSwKIAkJCSAgIE5FVExJTktfQ0IoaW5fc2tiKS5wb3J0aWQsCi0JCQkgICBubGgtPm5sbXNnX3NlcSwgMCwgbmxoKTsKKwkJCSAgIG5saC0+bmxtc2dfc2VxLCAwLCBubGgsCisJCQkgICBuZXRsaW5rX25ldF9jYXBhYmxlKGluX3NrYiwgQ0FQX05FVF9BRE1JTikpOwogCWlmIChlcnIgPCAwKSB7CiAJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CiAJCWtmcmVlX3NrYihyZXApOwpAQCAtOTcsNiArOTgsNyBAQAogCQkgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJICAgICBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwgc3RydWN0IG5sYXR0ciAqYmMpCiB7CisJYm9vbCBuZXRfYWRtaW4gPSBuZXRsaW5rX25ldF9jYXBhYmxlKGNiLT5za2IsIENBUF9ORVRfQURNSU4pOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwogCWludCBudW0sIHNfbnVtLCBzbG90LCBzX3Nsb3Q7CiAKQEAgLTEzMiw3ICsxMzQsNyBAQAogCQkJICAgIHItPmlkLmlkaWFnX2Rwb3J0KQogCQkJCWdvdG8gbmV4dDsKIAotCQkJaWYgKHNrX2RpYWdfZHVtcChzaywgc2tiLCBjYiwgciwgYmMpIDwgMCkgeworCQkJaWYgKHNrX2RpYWdfZHVtcChzaywgc2tiLCBjYiwgciwgYmMsIG5ldF9hZG1pbikgPCAwKSB7CiAJCQkJc3Bpbl91bmxvY2tfYmgoJmhzbG90LT5sb2NrKTsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CkBAIC0xNjUsMTIgKzE2Nyw4OCBAQAogCXItPmlkaWFnX3dxdWV1ZSA9IHNrX3dtZW1fYWxsb2NfZ2V0KHNrKTsKIH0KIAorI2lmZGVmIENPTkZJR19JTkVUX0RJQUdfREVTVFJPWQorc3RhdGljIGludCBfX3VkcF9kaWFnX2Rlc3Ryb3koc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEsCisJCQkgICAgICBzdHJ1Y3QgdWRwX3RhYmxlICp0YmwpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoaW5fc2tiLT5zayk7CisJc3RydWN0IHNvY2sgKnNrOworCWludCBlcnI7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlpZiAocmVxLT5zZGlhZ19mYW1pbHkgPT0gQUZfSU5FVCkKKwkJc2sgPSBfX3VkcDRfbGliX2xvb2t1cChuZXQsCisJCQkJcmVxLT5pZC5pZGlhZ19kc3RbMF0sIHJlcS0+aWQuaWRpYWdfZHBvcnQsCisJCQkJcmVxLT5pZC5pZGlhZ19zcmNbMF0sIHJlcS0+aWQuaWRpYWdfc3BvcnQsCisJCQkJcmVxLT5pZC5pZGlhZ19pZiwgdGJsLCBOVUxMKTsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorCWVsc2UgaWYgKHJlcS0+c2RpYWdfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCWlmIChpcHY2X2FkZHJfdjRtYXBwZWQoKHN0cnVjdCBpbjZfYWRkciAqKXJlcS0+aWQuaWRpYWdfZHN0KSAmJgorCQkgICAgaXB2Nl9hZGRyX3Y0bWFwcGVkKChzdHJ1Y3QgaW42X2FkZHIgKilyZXEtPmlkLmlkaWFnX3NyYykpCisJCQlzayA9IF9fdWRwNF9saWJfbG9va3VwKG5ldCwKKwkJCQkJcmVxLT5pZC5pZGlhZ19kc3RbM10sIHJlcS0+aWQuaWRpYWdfZHBvcnQsCisJCQkJCXJlcS0+aWQuaWRpYWdfc3JjWzNdLCByZXEtPmlkLmlkaWFnX3Nwb3J0LAorCQkJCQlyZXEtPmlkLmlkaWFnX2lmLCB0YmwsIE5VTEwpOworCisJCWVsc2UKKwkJCXNrID0gX191ZHA2X2xpYl9sb29rdXAobmV0LAorCQkJCQkoc3RydWN0IGluNl9hZGRyICopcmVxLT5pZC5pZGlhZ19kc3QsCisJCQkJCXJlcS0+aWQuaWRpYWdfZHBvcnQsCisJCQkJCShzdHJ1Y3QgaW42X2FkZHIgKilyZXEtPmlkLmlkaWFnX3NyYywKKwkJCQkJcmVxLT5pZC5pZGlhZ19zcG9ydCwKKwkJCQkJcmVxLT5pZC5pZGlhZ19pZiwgdGJsLCBOVUxMKTsKKwl9CisjZW5kaWYKKwllbHNlIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzayAmJiAhYXRvbWljX2luY19ub3RfemVybygmc2stPnNrX3JlZmNudCkpCisJCXNrID0gTlVMTDsKKworCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKCFzaykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAoc29ja19kaWFnX2NoZWNrX2Nvb2tpZShzaywgcmVxLT5pZC5pZGlhZ19jb29raWUpKSB7CisJCXNvY2tfcHV0KHNrKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJZXJyID0gc29ja19kaWFnX2Rlc3Ryb3koc2ssIEVDT05OQUJPUlRFRCk7CisKKwlzb2NrX3B1dChzayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVkcF9kaWFnX2Rlc3Ryb3koc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxKQoreworCXJldHVybiBfX3VkcF9kaWFnX2Rlc3Ryb3koaW5fc2tiLCByZXEsICZ1ZHBfdGFibGUpOworfQorCitzdGF0aWMgaW50IHVkcGxpdGVfZGlhZ19kZXN0cm95KHN0cnVjdCBza19idWZmICppbl9za2IsCisJCQkJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSkKK3sKKwlyZXR1cm4gX191ZHBfZGlhZ19kZXN0cm95KGluX3NrYiwgcmVxLCAmdWRwbGl0ZV90YWJsZSk7Cit9CisKKyNlbmRpZgorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyIHVkcF9kaWFnX2hhbmRsZXIgPSB7CiAJLmR1bXAJCSA9IHVkcF9kaWFnX2R1bXAsCiAJLmR1bXBfb25lCSA9IHVkcF9kaWFnX2R1bXBfb25lLAogCS5pZGlhZ19nZXRfaW5mbyAgPSB1ZHBfZGlhZ19nZXRfaW5mbywKIAkuaWRpYWdfdHlwZQkgPSBJUFBST1RPX1VEUCwKIAkuaWRpYWdfaW5mb19zaXplID0gMCwKKyNpZmRlZiBDT05GSUdfSU5FVF9ESUFHX0RFU1RST1kKKwkuZGVzdHJveQkgPSB1ZHBfZGlhZ19kZXN0cm95LAorI2VuZGlmCiB9OwogCiBzdGF0aWMgdm9pZCB1ZHBsaXRlX2RpYWdfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCkBAIC0xOTIsNiArMjcwLDkgQEAKIAkuaWRpYWdfZ2V0X2luZm8gID0gdWRwX2RpYWdfZ2V0X2luZm8sCiAJLmlkaWFnX3R5cGUJID0gSVBQUk9UT19VRFBMSVRFLAogCS5pZGlhZ19pbmZvX3NpemUgPSAwLAorI2lmZGVmIENPTkZJR19JTkVUX0RJQUdfREVTVFJPWQorCS5kZXN0cm95CSA9IHVkcGxpdGVfZGlhZ19kZXN0cm95LAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCB1ZHBfZGlhZ19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHBfb2ZmbG9hZC5jIGIvbmV0L2lwdjQvdWRwX29mZmxvYWQuYwppbmRleCA4MWYyNTNiLi5mOTMzM2M5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHBfb2ZmbG9hZC5jCisrKyBiL25ldC9pcHY0L3VkcF9vZmZsb2FkLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAlfX2JlMTYgbmV3X3Byb3RvY29sLCBib29sIGlzX2lwdjYpCiB7CiAJaW50IHRubF9obGVuID0gc2tiX2lubmVyX21hY19oZWFkZXIoc2tiKSAtIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7Ci0JYm9vbCByZW1jc3VtLCBuZWVkX2NzdW0sIG9mZmxvYWRfY3N1bSwgdWZvOworCWJvb2wgcmVtY3N1bSwgbmVlZF9jc3VtLCBvZmZsb2FkX2NzdW0sIHVmbywgZ3NvX3BhcnRpYWw7CiAJc3RydWN0IHNrX2J1ZmYgKnNlZ3MgPSBFUlJfUFRSKC1FSU5WQUwpOwogCXN0cnVjdCB1ZHBoZHIgKnVoID0gdWRwX2hkcihza2IpOwogCXUxNiBtYWNfb2Zmc2V0ID0gc2tiLT5tYWNfaGVhZGVyOwpAQCAtODgsNiArODgsOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlnc29fcGFydGlhbCA9ICEhKHNrYl9zaGluZm8oc2VncyktPmdzb190eXBlICYgU0tCX0dTT19QQVJUSUFMKTsKKwogCW91dGVyX2hsZW4gPSBza2JfdG5sX2hlYWRlcl9sZW4oc2tiKTsKIAl1ZHBfb2Zmc2V0ID0gb3V0ZXJfaGxlbiAtIHRubF9obGVuOwogCXNrYiA9IHNlZ3M7CkBAIC0xMTcsNyArMTE5LDcgQEAKIAkJICogd2lsbCBiZSB1c2luZyBhIGxlbmd0aCB2YWx1ZSBlcXVhbCB0byBvbmx5IG9uZSBNU1Mgc2l6ZWQKIAkJICogc2VnbWVudCBpbnN0ZWFkIG9mIHRoZSBlbnRpcmUgZnJhbWUuCiAJCSAqLwotCQlpZiAoc2tiX2lzX2dzbyhza2IpKSB7CisJCWlmIChnc29fcGFydGlhbCkgewogCQkJdWgtPmxlbiA9IGh0b25zKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgKwogCQkJCQlTS0JfR1NPX0NCKHNrYiktPmRhdGFfb2Zmc2V0ICsKIAkJCQkJc2tiLT5oZWFkIC0gKHVuc2lnbmVkIGNoYXIgKil1aCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHBsaXRlLmMgYi9uZXQvaXB2NC91ZHBsaXRlLmMKaW5kZXggM2IzZWZiZC4uYWY4MTcxNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwbGl0ZS5jCisrKyBiL25ldC9pcHY0L3VkcGxpdGUuYwpAQCAtNTUsMTMgKzU1LDExIEBACiAJLnVuaGFzaAkJICAgPSB1ZHBfbGliX3VuaGFzaCwKIAkuZ2V0X3BvcnQJICAgPSB1ZHBfdjRfZ2V0X3BvcnQsCiAJLm9ial9zaXplCSAgID0gc2l6ZW9mKHN0cnVjdCB1ZHBfc29jayksCi0JLnNsYWJfZmxhZ3MJICAgPSBTTEFCX0RFU1RST1lfQllfUkNVLAogCS5oLnVkcF90YWJsZQkgICA9ICZ1ZHBsaXRlX3RhYmxlLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X3NldHNvY2tvcHQgPSBjb21wYXRfdWRwX3NldHNvY2tvcHQsCiAJLmNvbXBhdF9nZXRzb2Nrb3B0ID0gY29tcGF0X3VkcF9nZXRzb2Nrb3B0LAogI2VuZGlmCi0JLmNsZWFyX3NrCSAgID0gc2tfcHJvdF9jbGVhcl9wb3J0YWRkcl9udWxscywKIH07CiBFWFBPUlRfU1lNQk9MKHVkcGxpdGVfcHJvdCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X3BvbGljeS5jIGIvbmV0L2lwdjQveGZybTRfcG9saWN5LmMKaW5kZXggYjY0NGEyMy4uNmE3ZmY2OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfcG9saWN5LmMKKysrIGIvbmV0L2lwdjQveGZybTRfcG9saWN5LmMKQEAgLTI5LDcgKzI5LDcgQEAKIAltZW1zZXQoZmw0LCAwLCBzaXplb2YoKmZsNCkpOwogCWZsNC0+ZGFkZHIgPSBkYWRkci0+YTQ7CiAJZmw0LT5mbG93aTRfdG9zID0gdG9zOwotCWZsNC0+Zmxvd2k0X29pZiA9IG9pZjsKKwlmbDQtPmZsb3dpNF9vaWYgPSBsM21kZXZfbWFzdGVyX2lmaW5kZXhfYnlfaW5kZXgobmV0LCBvaWYpOwogCWlmIChzYWRkcikKIAkJZmw0LT5zYWRkciA9IHNhZGRyLT5hNDsKIApAQCAtMTEyLDcgKzExMiw3IEBACiAJaW50IG9pZiA9IDA7CiAKIAlpZiAoc2tiX2RzdChza2IpKQotCQlvaWYgPSBsM21kZXZfZmliX29pZihza2JfZHN0KHNrYiktPmRldik7CisJCW9pZiA9IHNrYl9kc3Qoc2tiKS0+ZGV2LT5pZmluZGV4OwogCiAJbWVtc2V0KGZsNCwgMCwgc2l6ZW9mKHN0cnVjdCBmbG93aTQpKTsKIAlmbDQtPmZsb3dpNF9tYXJrID0gc2tiLT5tYXJrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggZGY4NDI1Zi4uY2JkOTM0MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC0xMTIsNiArMTEyLDI3IEBACiAJcmV0dXJuIChjc3RhbXAgLSBJTklUSUFMX0pJRkZJRVMpICogMTAwVUwgLyBIWjsKIH0KIAorc3RhdGljIGlubGluZSBzMzIgcmZjMzMxNV9zMTRfYmFja29mZl9pbml0KHMzMiBpcnQpCit7CisJLyogbXVsdGlwbHkgJ2luaXRpYWwgcmV0cmFuc21pc3Npb24gdGltZScgYnkgMC45IC4uIDEuMSAqLworCXU2NCB0bXAgPSAoOTAwMDAwICsgcHJhbmRvbV91MzIoKSAlIDIwMDAwMSkgKiAodTY0KWlydDsKKwlkb19kaXYodG1wLCAxMDAwMDAwKTsKKwlyZXR1cm4gKHMzMil0bXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgczMyIHJmYzMzMTVfczE0X2JhY2tvZmZfdXBkYXRlKHMzMiBydCwgczMyIG1ydCkKK3sKKwkvKiBtdWx0aXBseSAncmV0cmFuc21pc3Npb24gdGltZW91dCcgYnkgMS45IC4uIDIuMSAqLworCXU2NCB0bXAgPSAoMTkwMDAwMCArIHByYW5kb21fdTMyKCkgJSAyMDAwMDEpICogKHU2NClydDsKKwlkb19kaXYodG1wLCAxMDAwMDAwKTsKKwlpZiAoKHMzMil0bXAgPiBtcnQpIHsKKwkJLyogbXVsdGlwbHkgJ21heGltdW0gcmV0cmFuc21pc3Npb24gdGltZScgYnkgMC45IC4uIDEuMSAqLworCQl0bXAgPSAoOTAwMDAwICsgcHJhbmRvbV91MzIoKSAlIDIwMDAwMSkgKiAodTY0KW1ydDsKKwkJZG9fZGl2KHRtcCwgMTAwMDAwMCk7CisJfQorCXJldHVybiAoczMyKXRtcDsKK30KKwogI2lmZGVmIENPTkZJR19TWVNDVEwKIHN0YXRpYyBpbnQgYWRkcmNvbmZfc3lzY3RsX3JlZ2lzdGVyKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpOwogc3RhdGljIHZvaWQgYWRkcmNvbmZfc3lzY3RsX3VucmVnaXN0ZXIoc3RydWN0IGluZXQ2X2RldiAqaWRldik7CkBAIC0xODcsNiArMjA4LDcgQEAKIAkuZGFkX3RyYW5zbWl0cwkJPSAxLAogCS5ydHJfc29saWNpdHMJCT0gTUFYX1JUUl9TT0xJQ0lUQVRJT05TLAogCS5ydHJfc29saWNpdF9pbnRlcnZhbAk9IFJUUl9TT0xJQ0lUQVRJT05fSU5URVJWQUwsCisJLnJ0cl9zb2xpY2l0X21heF9pbnRlcnZhbCA9IFJUUl9TT0xJQ0lUQVRJT05fTUFYX0lOVEVSVkFMLAogCS5ydHJfc29saWNpdF9kZWxheQk9IE1BWF9SVFJfU09MSUNJVEFUSU9OX0RFTEFZLAogCS51c2VfdGVtcGFkZHIJCT0gMCwKIAkudGVtcF92YWxpZF9sZnQJCT0gVEVNUF9WQUxJRF9MSUZFVElNRSwKQEAgLTIzMiw2ICsyNTQsNyBAQAogCS5kYWRfdHJhbnNtaXRzCQk9IDEsCiAJLnJ0cl9zb2xpY2l0cwkJPSBNQVhfUlRSX1NPTElDSVRBVElPTlMsCiAJLnJ0cl9zb2xpY2l0X2ludGVydmFsCT0gUlRSX1NPTElDSVRBVElPTl9JTlRFUlZBTCwKKwkucnRyX3NvbGljaXRfbWF4X2ludGVydmFsID0gUlRSX1NPTElDSVRBVElPTl9NQVhfSU5URVJWQUwsCiAJLnJ0cl9zb2xpY2l0X2RlbGF5CT0gTUFYX1JUUl9TT0xJQ0lUQVRJT05fREVMQVksCiAJLnVzZV90ZW1wYWRkcgkJPSAwLAogCS50ZW1wX3ZhbGlkX2xmdAkJPSBURU1QX1ZBTElEX0xJRkVUSU1FLApAQCAtNzc4LDcgKzgwMSwxNCBAQAogCX0KIAogCWlmIChwID09ICZuZXQtPmlwdjYuZGV2Y29uZl9hbGwtPmZvcndhcmRpbmcpIHsKKwkJaW50IG9sZF9kZmx0ID0gbmV0LT5pcHY2LmRldmNvbmZfZGZsdC0+Zm9yd2FyZGluZzsKKwogCQluZXQtPmlwdjYuZGV2Y29uZl9kZmx0LT5mb3J3YXJkaW5nID0gbmV3ZjsKKwkJaWYgKCghbmV3ZikgXiAoIW9sZF9kZmx0KSkKKwkJCWluZXQ2X25ldGNvbmZfbm90aWZ5X2RldmNvbmYobmV0LCBORVRDT05GQV9GT1JXQVJESU5HLAorCQkJCQkJICAgICBORVRDT05GQV9JRklOREVYX0RFRkFVTFQsCisJCQkJCQkgICAgIG5ldC0+aXB2Ni5kZXZjb25mX2RmbHQpOworCiAJCWFkZHJjb25mX2ZvcndhcmRfY2hhbmdlKG5ldCwgbmV3Zik7CiAJCWlmICgoIW5ld2YpIF4gKCFvbGQpKQogCQkJaW5ldDZfbmV0Y29uZl9ub3RpZnlfZGV2Y29uZihuZXQsIE5FVENPTkZBX0ZPUldBUkRJTkcsCkBAIC0xODcyLDcgKzE5MDIsNiBAQAogCiB2b2lkIGFkZHJjb25mX2RhZF9mYWlsdXJlKHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcCkKIHsKLQlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaWZwLT5pZGV2OwogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoaWZwLT5pZGV2LT5kZXYpOwogCkBAIC0xOTM0LDE4ICsxOTYzLDYgQEAKIAkJaW42X2lmYV9wdXQoaWZwMik7CiBsb2NrX2VycmRhZDoKIAkJc3Bpbl9sb2NrX2JoKCZpZnAtPmxvY2spOwotCX0gZWxzZSBpZiAoaWRldi0+Y25mLmFjY2VwdF9kYWQgPiAxICYmICFpZGV2LT5jbmYuZGlzYWJsZV9pcHY2KSB7Ci0JCWFkZHIuczZfYWRkcjMyWzBdID0gaHRvbmwoMHhmZTgwMDAwMCk7Ci0JCWFkZHIuczZfYWRkcjMyWzFdID0gMDsKLQotCQlpZiAoIWlwdjZfZ2VuZXJhdGVfZXVpNjQoYWRkci5zNl9hZGRyICsgOCwgaWRldi0+ZGV2KSAmJgotCQkgICAgaXB2Nl9hZGRyX2VxdWFsKCZpZnAtPmFkZHIsICZhZGRyKSkgewotCQkJLyogREFEIGZhaWxlZCBmb3IgbGluay1sb2NhbCBiYXNlZCBvbiBNQUMgYWRkcmVzcyAqLwotCQkJaWRldi0+Y25mLmRpc2FibGVfaXB2NiA9IDE7Ci0KLQkJCXByX2luZm8oIiVzOiBJUHY2IGJlaW5nIGRpc2FibGVkIVxuIiwKLQkJCQlpZnAtPmlkZXYtPmRldi0+bmFtZSk7Ci0JCX0KIAl9CiAKIGVycmRhZDoKQEAgLTE5NTQsNiArMTk3MSw3IEBACiAJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CiAKIAlhZGRyY29uZl9tb2RfZGFkX3dvcmsoaWZwLCAwKTsKKwlpbjZfaWZhX3B1dChpZnApOwogfQogCiAvKiBKb2luIHRvIHNvbGljaXRlZCBhZGRyIG11bHRpY2FzdCBncm91cC4KQEAgLTM2OTIsNyArMzcxMCw3IEBACiAJaWYgKGlkZXYtPmlmX2ZsYWdzICYgSUZfUkFfUkNWRCkKIAkJZ290byBvdXQ7CiAKLQlpZiAoaWRldi0+cnNfcHJvYmVzKysgPCBpZGV2LT5jbmYucnRyX3NvbGljaXRzKSB7CisJaWYgKGlkZXYtPnJzX3Byb2JlcysrIDwgaWRldi0+Y25mLnJ0cl9zb2xpY2l0cyB8fCBpZGV2LT5jbmYucnRyX3NvbGljaXRzIDwgMCkgewogCQl3cml0ZV91bmxvY2soJmlkZXYtPmxvY2spOwogCQlpZiAoIWlwdjZfZ2V0X2xsYWRkcihkZXYsICZsbGFkZHIsIElGQV9GX1RFTlRBVElWRSkpCiAJCQluZGlzY19zZW5kX3JzKGRldiwgJmxsYWRkciwKQEAgLTM3MDEsMTEgKzM3MTksMTMgQEAKIAkJCWdvdG8gcHV0OwogCiAJCXdyaXRlX2xvY2soJmlkZXYtPmxvY2spOworCQlpZGV2LT5yc19pbnRlcnZhbCA9IHJmYzMzMTVfczE0X2JhY2tvZmZfdXBkYXRlKAorCQkJaWRldi0+cnNfaW50ZXJ2YWwsIGlkZXYtPmNuZi5ydHJfc29saWNpdF9tYXhfaW50ZXJ2YWwpOwogCQkvKiBUaGUgd2FpdCBhZnRlciB0aGUgbGFzdCBwcm9iZSBjYW4gYmUgc2hvcnRlciAqLwogCQlhZGRyY29uZl9tb2RfcnNfdGltZXIoaWRldiwgKGlkZXYtPnJzX3Byb2JlcyA9PQogCQkJCQkgICAgIGlkZXYtPmNuZi5ydHJfc29saWNpdHMpID8KIAkJCQkgICAgICBpZGV2LT5jbmYucnRyX3NvbGljaXRfZGVsYXkgOgotCQkJCSAgICAgIGlkZXYtPmNuZi5ydHJfc29saWNpdF9pbnRlcnZhbCk7CisJCQkJICAgICAgaWRldi0+cnNfaW50ZXJ2YWwpOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIE5vdGU6IHdlIGRvIG5vdCBzdXBwb3J0IGRlcHJlY2F0ZWQgImFsbCBvbi1saW5rIgpAQCAtMzgyMSw2ICszODQxLDcgQEAKIAkJCQkJCWRhZF93b3JrKTsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaWZwLT5pZGV2OwogCXN0cnVjdCBpbjZfYWRkciBtY2FkZHI7CisJYm9vbCBkaXNhYmxlX2lwdjYgPSBmYWxzZTsKIAogCWVudW0gewogCQlEQURfUFJPQ0VTUywKQEAgLTM4MzcsNiArMzg1OCwyNCBAQAogCX0gZWxzZSBpZiAoaWZwLT5zdGF0ZSA9PSBJTkVUNl9JRkFERFJfU1RBVEVfRVJSREFEKSB7CiAJCWFjdGlvbiA9IERBRF9BQk9SVDsKIAkJaWZwLT5zdGF0ZSA9IElORVQ2X0lGQUREUl9TVEFURV9QT1NUREFEOworCisJCWlmIChpZGV2LT5jbmYuYWNjZXB0X2RhZCA+IDEgJiYgIWlkZXYtPmNuZi5kaXNhYmxlX2lwdjYgJiYKKwkJICAgICEoaWZwLT5mbGFncyAmIElGQV9GX1NUQUJMRV9QUklWQUNZKSkgeworCQkJc3RydWN0IGluNl9hZGRyIGFkZHI7CisKKwkJCWFkZHIuczZfYWRkcjMyWzBdID0gaHRvbmwoMHhmZTgwMDAwMCk7CisJCQlhZGRyLnM2X2FkZHIzMlsxXSA9IDA7CisKKwkJCWlmICghaXB2Nl9nZW5lcmF0ZV9ldWk2NChhZGRyLnM2X2FkZHIgKyA4LCBpZGV2LT5kZXYpICYmCisJCQkgICAgaXB2Nl9hZGRyX2VxdWFsKCZpZnAtPmFkZHIsICZhZGRyKSkgeworCQkJCS8qIERBRCBmYWlsZWQgZm9yIGxpbmstbG9jYWwgYmFzZWQgb24gTUFDICovCisJCQkJaWRldi0+Y25mLmRpc2FibGVfaXB2NiA9IDE7CisKKwkJCQlwcl9pbmZvKCIlczogSVB2NiBiZWluZyBkaXNhYmxlZCFcbiIsCisJCQkJCWlmcC0+aWRldi0+ZGV2LT5uYW1lKTsKKwkJCQlkaXNhYmxlX2lwdjYgPSB0cnVlOworCQkJfQorCQl9CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZpZnAtPmxvY2spOwogCkBAIC0zODQ0LDcgKzM4ODMsMTAgQEAKIAkJYWRkcmNvbmZfZGFkX2JlZ2luKGlmcCk7CiAJCWdvdG8gb3V0OwogCX0gZWxzZSBpZiAoYWN0aW9uID09IERBRF9BQk9SVCkgeworCQlpbjZfaWZhX2hvbGQoaWZwKTsKIAkJYWRkcmNvbmZfZGFkX3N0b3AoaWZwLCAxKTsKKwkJaWYgKGRpc2FibGVfaXB2NikKKwkJCWFkZHJjb25mX2lmZG93bihpZGV2LT5kZXYsIDApOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTM5MzIsNyArMzk3NCw3IEBACiAJc2VuZF9tbGQgPSBpZnAtPnNjb3BlID09IElGQV9MSU5LICYmIGlwdjZfbG9uZWx5X2xsYWRkcihpZnApOwogCXNlbmRfcnMgPSBzZW5kX21sZCAmJgogCQkgIGlwdjZfYWNjZXB0X3JhKGlmcC0+aWRldikgJiYKLQkJICBpZnAtPmlkZXYtPmNuZi5ydHJfc29saWNpdHMgPiAwICYmCisJCSAgaWZwLT5pZGV2LT5jbmYucnRyX3NvbGljaXRzICE9IDAgJiYKIAkJICAoZGV2LT5mbGFncyZJRkZfTE9PUEJBQ0spID09IDA7CiAJcmVhZF91bmxvY2tfYmgoJmlmcC0+aWRldi0+bG9jayk7CiAKQEAgLTM5NTQsMTAgKzM5OTYsMTEgQEAKIAogCQl3cml0ZV9sb2NrX2JoKCZpZnAtPmlkZXYtPmxvY2spOwogCQlzcGluX2xvY2soJmlmcC0+bG9jayk7CisJCWlmcC0+aWRldi0+cnNfaW50ZXJ2YWwgPSByZmMzMzE1X3MxNF9iYWNrb2ZmX2luaXQoCisJCQlpZnAtPmlkZXYtPmNuZi5ydHJfc29saWNpdF9pbnRlcnZhbCk7CiAJCWlmcC0+aWRldi0+cnNfcHJvYmVzID0gMTsKIAkJaWZwLT5pZGV2LT5pZl9mbGFncyB8PSBJRl9SU19TRU5UOwotCQlhZGRyY29uZl9tb2RfcnNfdGltZXIoaWZwLT5pZGV2LAotCQkJCSAgICAgIGlmcC0+aWRldi0+Y25mLnJ0cl9zb2xpY2l0X2ludGVydmFsKTsKKwkJYWRkcmNvbmZfbW9kX3JzX3RpbWVyKGlmcC0+aWRldiwgaWZwLT5pZGV2LT5yc19pbnRlcnZhbCk7CiAJCXNwaW5fdW5sb2NrKCZpZnAtPmxvY2spOwogCQl3cml0ZV91bmxvY2tfYmgoJmlmcC0+aWRldi0+bG9jayk7CiAJfQpAQCAtNDg3NCw2ICs0OTE3LDggQEAKIAlhcnJheVtERVZDT05GX1JUUl9TT0xJQ0lUU10gPSBjbmYtPnJ0cl9zb2xpY2l0czsKIAlhcnJheVtERVZDT05GX1JUUl9TT0xJQ0lUX0lOVEVSVkFMXSA9CiAJCWppZmZpZXNfdG9fbXNlY3MoY25mLT5ydHJfc29saWNpdF9pbnRlcnZhbCk7CisJYXJyYXlbREVWQ09ORl9SVFJfU09MSUNJVF9NQVhfSU5URVJWQUxdID0KKwkJamlmZmllc190b19tc2VjcyhjbmYtPnJ0cl9zb2xpY2l0X21heF9pbnRlcnZhbCk7CiAJYXJyYXlbREVWQ09ORl9SVFJfU09MSUNJVF9ERUxBWV0gPQogCQlqaWZmaWVzX3RvX21zZWNzKGNuZi0+cnRyX3NvbGljaXRfZGVsYXkpOwogCWFycmF5W0RFVkNPTkZfRk9SQ0VfTUxEX1ZFUlNJT05dID0gY25mLT5mb3JjZV9tbGRfdmVyc2lvbjsKQEAgLTQ5NDQsMTggKzQ5ODksMTggQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9fc25tcDZfZmlsbF9zdGF0c2Rldih1NjQgKnN0YXRzLCBhdG9taWNfbG9uZ190ICptaWIsCi0JCQkJICAgICAgaW50IGl0ZW1zLCBpbnQgYnl0ZXMpCisJCQkJCWludCBieXRlcykKIHsKIAlpbnQgaTsKLQlpbnQgcGFkID0gYnl0ZXMgLSBzaXplb2YodTY0KSAqIGl0ZW1zOworCWludCBwYWQgPSBieXRlcyAtIHNpemVvZih1NjQpICogSUNNUDZfTUlCX01BWDsKIAlCVUdfT04ocGFkIDwgMCk7CiAKIAkvKiBVc2UgcHV0X3VuYWxpZ25lZCgpIGJlY2F1c2Ugc3RhdHMgbWF5IG5vdCBiZSBhbGlnbmVkIGZvciB1NjQuICovCi0JcHV0X3VuYWxpZ25lZChpdGVtcywgJnN0YXRzWzBdKTsKLQlmb3IgKGkgPSAxOyBpIDwgaXRlbXM7IGkrKykKKwlwdXRfdW5hbGlnbmVkKElDTVA2X01JQl9NQVgsICZzdGF0c1swXSk7CisJZm9yIChpID0gMTsgaSA8IElDTVA2X01JQl9NQVg7IGkrKykKIAkJcHV0X3VuYWxpZ25lZChhdG9taWNfbG9uZ19yZWFkKCZtaWJbaV0pLCAmc3RhdHNbaV0pOwogCi0JbWVtc2V0KCZzdGF0c1tpdGVtc10sIDAsIHBhZCk7CisJbWVtc2V0KCZzdGF0c1tJQ01QNl9NSUJfTUFYXSwgMCwgcGFkKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9fc25tcDZfZmlsbF9zdGF0czY0KHU2NCAqc3RhdHMsIHZvaWQgX19wZXJjcHUgKm1pYiwKQEAgLTQ5ODgsNyArNTAzMyw3IEBACiAJCQkJICAgICBvZmZzZXRvZihzdHJ1Y3QgaXBzdGF0c19taWIsIHN5bmNwKSk7CiAJCWJyZWFrOwogCWNhc2UgSUZMQV9JTkVUNl9JQ01QNlNUQVRTOgotCQlfX3NubXA2X2ZpbGxfc3RhdHNkZXYoc3RhdHMsIGlkZXYtPnN0YXRzLmljbXB2NmRldi0+bWlicywgSUNNUDZfTUlCX01BWCwgYnl0ZXMpOworCQlfX3NubXA2X2ZpbGxfc3RhdHNkZXYoc3RhdHMsIGlkZXYtPnN0YXRzLmljbXB2NmRldi0+bWlicywgYnl0ZXMpOwogCQlicmVhazsKIAl9CiB9CkBAIC01MDgyLDcgKzUxMjcsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIWlwdjZfYWNjZXB0X3JhKGlkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoaWRldi0+Y25mLnJ0cl9zb2xpY2l0cyA8PSAwKQorCWlmIChpZGV2LT5jbmYucnRyX3NvbGljaXRzID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJd3JpdGVfbG9ja19iaCgmaWRldi0+bG9jayk7CkBAIC01MTExLDggKzUxNTYsMTAgQEAKIAogCWlmICh1cGRhdGVfcnMpIHsKIAkJaWRldi0+aWZfZmxhZ3MgfD0gSUZfUlNfU0VOVDsKKwkJaWRldi0+cnNfaW50ZXJ2YWwgPSByZmMzMzE1X3MxNF9iYWNrb2ZmX2luaXQoCisJCQlpZGV2LT5jbmYucnRyX3NvbGljaXRfaW50ZXJ2YWwpOwogCQlpZGV2LT5yc19wcm9iZXMgPSAxOwotCQlhZGRyY29uZl9tb2RfcnNfdGltZXIoaWRldiwgaWRldi0+Y25mLnJ0cl9zb2xpY2l0X2ludGVydmFsKTsKKwkJYWRkcmNvbmZfbW9kX3JzX3RpbWVyKGlkZXYsIGlkZXYtPnJzX2ludGVydmFsKTsKIAl9CiAKIAkvKiBXZWxsLCB0aGF0J3Mga2luZGEgbmFzdHkgLi4uICovCkBAIC01NDUwLDIwICs1NDk3LDYgQEAKIH0KIAogc3RhdGljCi1pbnQgYWRkcmNvbmZfc3lzY3RsX2hvcF9saW1pdChzdHJ1Y3QgY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBjdGxfdGFibGUgbGN0bDsKLQlpbnQgbWluX2hsID0gMSwgbWF4X2hsID0gMjU1OwotCi0JbGN0bCA9ICpjdGw7Ci0JbGN0bC5leHRyYTEgPSAmbWluX2hsOwotCWxjdGwuZXh0cmEyID0gJm1heF9obDsKLQotCXJldHVybiBwcm9jX2RvaW50dmVjX21pbm1heCgmbGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Ci19Ci0KLXN0YXRpYwogaW50IGFkZHJjb25mX3N5c2N0bF9tdHUoc3RydWN0IGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsCiAJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTU2OTYsNiArNTcyOSw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGNvbnN0IGludCBvbmUgPSAxOworc3RhdGljIGNvbnN0IGludCB0d29fZml2ZV9maXZlID0gMjU1OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGN0bF90YWJsZSBhZGRyY29uZl9zeXNjdGxbXSA9IHsKIAl7CiAJCS5wcm9jbmFtZQk9ICJmb3J3YXJkaW5nIiwKQEAgLTU3MDksNyArNTc0NSw5IEBACiAJCS5kYXRhCQk9ICZpcHY2X2RldmNvbmYuaG9wX2xpbWl0LAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gYWRkcmNvbmZfc3lzY3RsX2hvcF9saW1pdCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuZXh0cmExCQk9ICh2b2lkICopJm9uZSwKKwkJLmV4dHJhMgkJPSAodm9pZCAqKSZ0d29fZml2ZV9maXZlLAogCX0sCiAJewogCQkucHJvY25hbWUJPSAibXR1IiwKQEAgLTU3NjEsNiArNTc5OSwxMyBAQAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAogCX0sCiAJeworCQkucHJvY25hbWUJPSAicm91dGVyX3NvbGljaXRhdGlvbl9tYXhfaW50ZXJ2YWwiLAorCQkuZGF0YQkJPSAmaXB2Nl9kZXZjb25mLnJ0cl9zb2xpY2l0X21heF9pbnRlcnZhbCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAorCXsKIAkJLnByb2NuYW1lCT0gInJvdXRlcl9zb2xpY2l0YXRpb25fZGVsYXkiLAogCQkuZGF0YQkJPSAmaXB2Nl9kZXZjb25mLnJ0cl9zb2xpY2l0X2RlbGF5LAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLApAQCAtNjAxNyw3ICs2MDYyLDcgQEAKIHN0YXRpYyBpbnQgX19hZGRyY29uZl9zeXNjdGxfcmVnaXN0ZXIoc3RydWN0IG5ldCAqbmV0LCBjaGFyICpkZXZfbmFtZSwKIAkJc3RydWN0IGluZXQ2X2RldiAqaWRldiwgc3RydWN0IGlwdjZfZGV2Y29uZiAqcCkKIHsKLQlpbnQgaTsKKwlpbnQgaSwgaWZpbmRleDsKIAlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZTsKIAljaGFyIHBhdGhbc2l6ZW9mKCJuZXQvaXB2Ni9jb25mLyIpICsgSUZOQU1TSVpdOwogCkBAIC02MDI3LDggKzYwNzIsMTQgQEAKIAogCWZvciAoaSA9IDA7IHRhYmxlW2ldLmRhdGE7IGkrKykgewogCQl0YWJsZVtpXS5kYXRhICs9IChjaGFyICopcCAtIChjaGFyICopJmlwdjZfZGV2Y29uZjsKLQkJdGFibGVbaV0uZXh0cmExID0gaWRldjsgLyogZW1iZWRkZWQ7IG5vIHJlZiAqLwotCQl0YWJsZVtpXS5leHRyYTIgPSBuZXQ7CisJCS8qIElmIG9uZSBvZiB0aGVzZSBpcyBhbHJlYWR5IHNldCwgdGhlbiBpdCBpcyBub3Qgc2FmZSB0bworCQkgKiBvdmVyd3JpdGUgZWl0aGVyIG9mIHRoZW06IHRoaXMgbWFrZXMgcHJvY19kb2ludHZlY19taW5tYXgKKwkJICogdXNhYmxlLgorCQkgKi8KKwkJaWYgKCF0YWJsZVtpXS5leHRyYTEgJiYgIXRhYmxlW2ldLmV4dHJhMikgeworCQkJdGFibGVbaV0uZXh0cmExID0gaWRldjsgLyogZW1iZWRkZWQ7IG5vIHJlZiAqLworCQkJdGFibGVbaV0uZXh0cmEyID0gbmV0OworCQl9CiAJfQogCiAJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAibmV0L2lwdjYvY29uZi8lcyIsIGRldl9uYW1lKTsKQEAgLTYwMzcsNiArNjA4OCwxMyBAQAogCWlmICghcC0+c3lzY3RsX2hlYWRlcikKIAkJZ290byBmcmVlOwogCisJaWYgKCFzdHJjbXAoZGV2X25hbWUsICJhbGwiKSkKKwkJaWZpbmRleCA9IE5FVENPTkZBX0lGSU5ERVhfQUxMOworCWVsc2UgaWYgKCFzdHJjbXAoZGV2X25hbWUsICJkZWZhdWx0IikpCisJCWlmaW5kZXggPSBORVRDT05GQV9JRklOREVYX0RFRkFVTFQ7CisJZWxzZQorCQlpZmluZGV4ID0gaWRldi0+ZGV2LT5pZmluZGV4OworCWluZXQ2X25ldGNvbmZfbm90aWZ5X2RldmNvbmYobmV0LCBORVRDT05GQV9BTEwsIGlmaW5kZXgsIHApOwogCXJldHVybiAwOwogCiBmcmVlOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWZfaW5ldDYuYyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKaW5kZXggYjQ1NDA1NS4uNDZhZDY5OSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWZfaW5ldDYuYworKysgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCkBAIC01NDUsNiArNTQ1LDggQEAKIAkubW1hcAkJICAgPSBzb2NrX25vX21tYXAsCiAJLnNlbmRwYWdlCSAgID0gaW5ldF9zZW5kcGFnZSwKIAkuc3BsaWNlX3JlYWQJICAgPSB0Y3Bfc3BsaWNlX3JlYWQsCisJLnJlYWRfc29jawkgICA9IHRjcF9yZWFkX3NvY2ssCisJLnBlZWtfbGVuCSAgID0gdGNwX3BlZWtfbGVuLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X3NldHNvY2tvcHQgPSBjb21wYXRfc29ja19jb21tb25fc2V0c29ja29wdCwKIAkuY29tcGF0X2dldHNvY2tvcHQgPSBjb21wYXRfc29ja19jb21tb25fZ2V0c29ja29wdCwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2ZpYjZfcnVsZXMuYyBiL25ldC9pcHY2L2ZpYjZfcnVsZXMuYwppbmRleCA1ODU3YzFmLi5lZWEyM2I1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKKysrIGIvbmV0L2lwdjYvZmliNl9ydWxlcy5jCkBAIC0zOCw2ICszOCw5IEBACiAJCS5mbGFncyA9IEZJQl9MT09LVVBfTk9SRUYsCiAJfTsKIAorCS8qIHVwZGF0ZSBmbG93IGlmIG9pZiBvciBpaWYgcG9pbnQgdG8gZGV2aWNlIGVuc2xhdmVkIHRvIGwzbWRldiAqLworCWwzbWRldl91cGRhdGVfZmxvdyhuZXQsIGZsb3dpNl90b19mbG93aShmbDYpKTsKKwogCWZpYl9ydWxlc19sb29rdXAobmV0LT5pcHY2LmZpYjZfcnVsZXNfb3BzLAogCQkJIGZsb3dpNl90b19mbG93aShmbDYpLCBmbGFncywgJmFyZyk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lsYS9pbGFfY29tbW9uLmMgYi9uZXQvaXB2Ni9pbGEvaWxhX2NvbW1vbi5jCmluZGV4IGVjOWVmYmMuLmFiYTA5OTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lsYS9pbGFfY29tbW9uLmMKKysrIGIvbmV0L2lwdjYvaWxhL2lsYV9jb21tb24uYwpAQCAtMTcyLDYgKzE3Miw1IEBACiAKIG1vZHVsZV9pbml0KGlsYV9pbml0KTsKIG1vZHVsZV9leGl0KGlsYV9maW5pKTsKLU1PRFVMRV9BTElBU19SVE5MX0xXVChJTEEpOwogTU9EVUxFX0FVVEhPUigiVG9tIEhlcmJlcnQgPHRvbUBoZXJiZXJ0bGFuZC5jb20+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pbGEvaWxhX2x3dC5jIGIvbmV0L2lwdjYvaWxhL2lsYV9sd3QuYwppbmRleCBjODMxNGM2Li5lNTBjMjdhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pbGEvaWxhX2x3dC5jCisrKyBiL25ldC9pcHY2L2lsYS9pbGFfbHd0LmMKQEAgLTUxLDcgKzUxLDcgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCBubGFfcG9saWN5IGlsYV9ubF9wb2xpY3lbSUxBX0FUVFJfTUFYICsgMV0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgaWxhX25sX3BvbGljeVtJTEFfQVRUUl9NQVggKyAxXSA9IHsKIAlbSUxBX0FUVFJfTE9DQVRPUl0gPSB7IC50eXBlID0gTkxBX1U2NCwgfSwKIAlbSUxBX0FUVFJfQ1NVTV9NT0RFXSA9IHsgLnR5cGUgPSBOTEFfVTgsIH0sCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaWxhL2lsYV94bGF0LmMgYi9uZXQvaXB2Ni9pbGEvaWxhX3hsYXQuYwppbmRleCBlNmVjYTVmLi5lNjA0MDEzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pbGEvaWxhX3hsYXQuYworKysgYi9uZXQvaXB2Ni9pbGEvaWxhX3hsYXQuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJLnBhcmFsbGVsX29wcwk9IHRydWUsCiB9OwogCi1zdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgaWxhX25sX3BvbGljeVtJTEFfQVRUUl9NQVggKyAxXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBpbGFfbmxfcG9saWN5W0lMQV9BVFRSX01BWCArIDFdID0gewogCVtJTEFfQVRUUl9MT0NBVE9SXSA9IHsgLnR5cGUgPSBOTEFfVTY0LCB9LAogCVtJTEFfQVRUUl9MT0NBVE9SX01BVENIXSA9IHsgLnR5cGUgPSBOTEFfVTY0LCB9LAogCVtJTEFfQVRUUl9JRklOREVYXSA9IHsgLnR5cGUgPSBOTEFfVTMyLCB9LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2ZpYi5jIGIvbmV0L2lwdjYvaXA2X2ZpYi5jCmluZGV4IDc3MWJlMWYuLmVmNTQ4NTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9maWIuYworKysgYi9uZXQvaXB2Ni9pcDZfZmliLmMKQEAgLTc0Myw2ICs3NDMsNyBAQAogCQkgICAoaW5mby0+bmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0NSRUFURSkpOwogCWludCBmb3VuZCA9IDA7CiAJYm9vbCBydF9jYW5fZWNtcCA9IHJ0Nl9xdWFsaWZ5X2Zvcl9lY21wKHJ0KTsKKwl1MTYgbmxmbGFncyA9IE5MTV9GX0VYQ0w7CiAJaW50IGVycjsKIAogCWlucyA9ICZmbi0+bGVhZjsKQEAgLTc1OSw2ICs3NjAsOCBAQAogCQkJaWYgKGluZm8tPm5saCAmJgogCQkJICAgIChpbmZvLT5ubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRVhDTCkpCiAJCQkJcmV0dXJuIC1FRVhJU1Q7CisKKwkJCW5sZmxhZ3MgJj0gfk5MTV9GX0VYQ0w7CiAJCQlpZiAocmVwbGFjZSkgewogCQkJCWlmIChydF9jYW5fZWNtcCA9PSBydDZfcXVhbGlmeV9mb3JfZWNtcChpdGVyKSkgewogCQkJCQlmb3VuZCsrOwpAQCAtODU2LDYgKzg1OSw3IEBACiAJCQlwcl93YXJuKCJOTE1fRl9DUkVBVEUgc2hvdWxkIGJlIHNldCB3aGVuIGNyZWF0aW5nIG5ldyByb3V0ZVxuIik7CiAKIGFkZDoKKwkJbmxmbGFncyB8PSBOTE1fRl9DUkVBVEU7CiAJCWVyciA9IGZpYjZfY29tbWl0X21ldHJpY3MoJnJ0LT5kc3QsIG14Yyk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtODY0LDcgKzg2OCw3IEBACiAJCSppbnMgPSBydDsKIAkJcnQtPnJ0Nmlfbm9kZSA9IGZuOwogCQlhdG9taWNfaW5jKCZydC0+cnQ2aV9yZWYpOwotCQlpbmV0Nl9ydF9ub3RpZnkoUlRNX05FV1JPVVRFLCBydCwgaW5mbywgMCk7CisJCWluZXQ2X3J0X25vdGlmeShSVE1fTkVXUk9VVEUsIHJ0LCBpbmZvLCBubGZsYWdzKTsKIAkJaW5mby0+bmxfbmV0LT5pcHY2LnJ0Nl9zdGF0cy0+ZmliX3J0X2VudHJpZXMrKzsKIAogCQlpZiAoIShmbi0+Zm5fZmxhZ3MgJiBSVE5fUlRJTkZPKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2dyZS5jIGIvbmV0L2lwdjYvaXA2X2dyZS5jCmluZGV4IDcwNDI3NGMuLmQ3ZDZkM2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9ncmUuYworKysgYi9uZXQvaXB2Ni9pcDZfZ3JlLmMKQEAgLTYxLDEyICs2MSwxMiBAQAogbW9kdWxlX3BhcmFtKGxvZ19lY25fZXJyb3IsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhsb2dfZWNuX2Vycm9yLCAiTG9nIHBhY2tldHMgcmVjZWl2ZWQgd2l0aCBjb3JydXB0ZWQgRUNOIik7CiAKLSNkZWZpbmUgSEFTSF9TSVpFX1NISUZUICA1Ci0jZGVmaW5lIEhBU0hfU0laRSAoMSA8PCBIQVNIX1NJWkVfU0hJRlQpCisjZGVmaW5lIElQNl9HUkVfSEFTSF9TSVpFX1NISUZUICA1CisjZGVmaW5lIElQNl9HUkVfSEFTSF9TSVpFICgxIDw8IElQNl9HUkVfSEFTSF9TSVpFX1NISUZUKQogCiBzdGF0aWMgaW50IGlwNmdyZV9uZXRfaWQgX19yZWFkX21vc3RseTsKIHN0cnVjdCBpcDZncmVfbmV0IHsKLQlzdHJ1Y3QgaXA2X3RubCBfX3JjdSAqdHVubmVsc1s0XVtIQVNIX1NJWkVdOworCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICp0dW5uZWxzWzRdW0lQNl9HUkVfSEFTSF9TSVpFXTsKIAogCXN0cnVjdCBuZXRfZGV2aWNlICpmYl90dW5uZWxfZGV2OwogfTsKQEAgLTk2LDEyICs5NiwxMiBAQAogICAgd2lsbCBtYXRjaCBmYWxsYmFjayB0dW5uZWwuCiAgKi8KIAotI2RlZmluZSBIQVNIX0tFWShrZXkpICgoKF9fZm9yY2UgdTMyKWtleV4oKF9fZm9yY2UgdTMyKWtleT4+NCkpJihIQVNIX1NJWkUgLSAxKSkKKyNkZWZpbmUgSEFTSF9LRVkoa2V5KSAoKChfX2ZvcmNlIHUzMilrZXleKChfX2ZvcmNlIHUzMilrZXk+PjQpKSYoSVA2X0dSRV9IQVNIX1NJWkUgLSAxKSkKIHN0YXRpYyB1MzIgSEFTSF9BRERSKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcikKIHsKIAl1MzIgaGFzaCA9IGlwdjZfYWRkcl9oYXNoKGFkZHIpOwogCi0JcmV0dXJuIGhhc2hfMzIoaGFzaCwgSEFTSF9TSVpFX1NISUZUKTsKKwlyZXR1cm4gaGFzaF8zMihoYXNoLCBJUDZfR1JFX0hBU0hfU0laRV9TSElGVCk7CiB9CiAKICNkZWZpbmUgdHVubmVsc19yX2wJdHVubmVsc1szXQpAQCAtNjQ4LDcgKzY0OCw2IEBACiAJCWVuY2FwX2xpbWl0ID0gdC0+cGFybXMuZW5jYXBfbGltaXQ7CiAKIAltZW1jcHkoJmZsNiwgJnQtPmZsLnUuaXA2LCBzaXplb2YoZmw2KSk7Ci0JZmw2LmZsb3dpNl9wcm90byA9IHNrYi0+cHJvdG9jb2w7CiAKIAllcnIgPSBncmVfaGFuZGxlX29mZmxvYWRzKHNrYiwgISEodC0+cGFybXMub19mbGFncyAmIFRVTk5FTF9DU1VNKSk7CiAJaWYgKGVycikKQEAgLTEwODcsNyArMTA4Niw3IEBACiAKIAlmb3IgKHByaW8gPSAwOyBwcmlvIDwgNDsgcHJpbysrKSB7CiAJCWludCBoOwotCQlmb3IgKGggPSAwOyBoIDwgSEFTSF9TSVpFOyBoKyspIHsKKwkJZm9yIChoID0gMDsgaCA8IElQNl9HUkVfSEFTSF9TSVpFOyBoKyspIHsKIAkJCXN0cnVjdCBpcDZfdG5sICp0OwogCiAJCQl0ID0gcnRubF9kZXJlZmVyZW5jZShpZ24tPnR1bm5lbHNbcHJpb11baF0pOwpAQCAtMTIzOSw3ICsxMjM4LDcgQEAKIAkJcGFybXMtPmVuY2FwX2xpbWl0ID0gbmxhX2dldF91OChkYXRhW0lGTEFfR1JFX0VOQ0FQX0xJTUlUXSk7CiAKIAlpZiAoZGF0YVtJRkxBX0dSRV9GTE9XSU5GT10pCi0JCXBhcm1zLT5mbG93aW5mbyA9IG5sYV9nZXRfdTMyKGRhdGFbSUZMQV9HUkVfRkxPV0lORk9dKTsKKwkJcGFybXMtPmZsb3dpbmZvID0gbmxhX2dldF9iZTMyKGRhdGFbSUZMQV9HUkVfRkxPV0lORk9dKTsKIAogCWlmIChkYXRhW0lGTEFfR1JFX0ZMQUdTXSkKIAkJcGFybXMtPmZsYWdzID0gbmxhX2dldF91MzIoZGF0YVtJRkxBX0dSRV9GTEFHU10pOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X29mZmxvYWQuYyBiL25ldC9pcHY2L2lwNl9vZmZsb2FkLmMKaW5kZXggMjJlOTBlNS4uZTdiZmQ1NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X29mZmxvYWQuYworKysgYi9uZXQvaXB2Ni9pcDZfb2ZmbG9hZC5jCkBAIC02OSw2ICs2OSw3IEBACiAJaW50IG9mZnNldCA9IDA7CiAJYm9vbCBlbmNhcCwgdWRwZnJhZzsKIAlpbnQgbmhvZmY7CisJYm9vbCBnc29fcGFydGlhbDsKIAogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCW5ob2ZmID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgLSBza2JfbWFjX2hlYWRlcihza2IpOwpAQCAtMTAxLDkgKzEwMiwxMSBAQAogCWlmIChJU19FUlIoc2VncykpCiAJCWdvdG8gb3V0OwogCisJZ3NvX3BhcnRpYWwgPSAhIShza2Jfc2hpbmZvKHNlZ3MpLT5nc29fdHlwZSAmIFNLQl9HU09fUEFSVElBTCk7CisKIAlmb3IgKHNrYiA9IHNlZ3M7IHNrYjsgc2tiID0gc2tiLT5uZXh0KSB7CiAJCWlwdjZoID0gKHN0cnVjdCBpcHY2aGRyICopKHNrYl9tYWNfaGVhZGVyKHNrYikgKyBuaG9mZik7Ci0JCWlmIChza2JfaXNfZ3NvKHNrYikpCisJCWlmIChnc29fcGFydGlhbCkKIAkJCXBheWxvYWRfbGVuID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSArCiAJCQkJICAgICAgU0tCX0dTT19DQihza2IpLT5kYXRhX29mZnNldCArCiAJCQkJICAgICAgc2tiLT5oZWFkIC0gKHVuc2lnbmVkIGNoYXIgKikoaXB2NmggKyAxKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwppbmRleCAxZGZjNDAyLi42MDAxZTc4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bGludXgvbXJvdXRlNi5oPgogI2luY2x1ZGUgPG5ldC9sM21kZXYuaD4KKyNpbmNsdWRlIDxuZXQvbHd0dW5uZWwuaD4KIAogc3RhdGljIGludCBpcDZfZmluaXNoX291dHB1dDIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0xMDQsNiArMTA1LDEzIEBACiAJCX0KIAl9CiAKKwlpZiAobHd0dW5uZWxfeG1pdF9yZWRpcmVjdChkc3QtPmx3dHN0YXRlKSkgeworCQlpbnQgcmVzID0gbHd0dW5uZWxfeG1pdChza2IpOworCisJCWlmIChyZXMgPCAwIHx8IHJlcyA9PSBMV1RVTk5FTF9YTUlUX0RPTkUpCisJCQlyZXR1cm4gcmVzOworCX0KKwogCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAluZXh0aG9wID0gcnQ2X25leHRob3AoKHN0cnVjdCBydDZfaW5mbyAqKWRzdCwgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKIAluZWlnaCA9IF9faXB2Nl9uZWlnaF9sb29rdXBfbm9yZWYoZHN0LT5kZXYsIG5leHRob3ApOwpAQCAtMjI4LDYgKzIzNiwxNCBAQAogCWlmICgoc2tiLT5sZW4gPD0gbXR1KSB8fCBza2ItPmlnbm9yZV9kZiB8fCBza2JfaXNfZ3NvKHNrYikpIHsKIAkJSVA2X1VQRF9QT19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldihza2JfZHN0KHNrYikpLAogCQkJICAgICAgSVBTVEFUU19NSUJfT1VULCBza2ItPmxlbik7CisKKwkJLyogaWYgZWdyZXNzIGRldmljZSBpcyBlbnNsYXZlZCB0byBhbiBMMyBtYXN0ZXIgZGV2aWNlIHBhc3MgdGhlCisJCSAqIHNrYiB0byBpdHMgaGFuZGxlciBmb3IgcHJvY2Vzc2luZworCQkgKi8KKwkJc2tiID0gbDNtZGV2X2lwNl9vdXQoKHN0cnVjdCBzb2NrICopc2ssIHNrYik7CisJCWlmICh1bmxpa2VseSghc2tiKSkKKwkJCXJldHVybiAwOworCiAJCS8qIGhvb2tzIHNob3VsZCBuZXZlciBhc3N1bWUgc29ja2V0IGxvY2sgaXMgaGVsZC4KIAkJICogd2UgcHJvbW90ZSBvdXIgc29ja2V0IHRvIG5vbiBjb25zdAogCQkgKi8KQEAgLTkxMCwxMyArOTI2LDYgQEAKIAlpbnQgZXJyOwogCWludCBmbGFncyA9IDA7CiAKLQlpZiAoaXB2Nl9hZGRyX2FueSgmZmw2LT5zYWRkcikgJiYgZmw2LT5mbG93aTZfb2lmICYmCi0JICAgICghKmRzdCB8fCAhKCpkc3QpLT5lcnJvcikpIHsKLQkJZXJyID0gbDNtZGV2X2dldF9zYWRkcjYobmV0LCBzaywgZmw2KTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0X2VycjsKLQl9Ci0KIAkvKiBUaGUgY29ycmVjdCB3YXkgdG8gaGFuZGxlIHRoaXMgd291bGQgYmUgdG8gZG8KIAkgKiBpcDZfcm91dGVfZ2V0X3NhZGRyLCBhbmQgdGhlbiBpcDZfcm91dGVfb3V0cHV0OyBob3dldmVyLAogCSAqIHRoZSByb3V0ZS1zcGVjaWZpYyBwcmVmZXJyZWQgc291cmNlIGZvcmNlcyB0aGUKQEAgLTEwMDgsNyArMTAxNyw3IEBACiBvdXRfZXJyX3JlbGVhc2U6CiAJZHN0X3JlbGVhc2UoKmRzdCk7CiAJKmRzdCA9IE5VTEw7Ci1vdXRfZXJyOgorCiAJaWYgKGVyciA9PSAtRU5FVFVOUkVBQ0gpCiAJCUlQNl9JTkNfU1RBVFMobmV0LCBOVUxMLCBJUFNUQVRTX01JQl9PVVROT1JPVVRFUyk7CiAJcmV0dXJuIGVycjsKQEAgLTEwNTQsOCArMTA2Myw2IEBACiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAJaWYgKGZpbmFsX2RzdCkKIAkJZmw2LT5kYWRkciA9ICpmaW5hbF9kc3Q7Ci0JaWYgKCFmbDYtPmZsb3dpNl9vaWYpCi0JCWZsNi0+Zmxvd2k2X29pZiA9IGwzbWRldl9maWJfb2lmKGRzdC0+ZGV2KTsKIAogCXJldHVybiB4ZnJtX2xvb2t1cF9yb3V0ZShzb2NrX25ldChzayksIGRzdCwgZmxvd2k2X3RvX2Zsb3dpKGZsNiksIHNrLCAwKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl90dW5uZWwuYyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwppbmRleCA3YjA0ODFlLi42YTY2YWRiIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSA8bmV0L2luZXRfZWNuLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPG5ldC9kc3RfbWV0YWRhdGEuaD4KIAogTU9EVUxFX0FVVEhPUigiVmlsbGUgTnVvcnZhbGEiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSVB2NiB0dW5uZWxpbmcgZGV2aWNlIik7CkBAIC02NCw4ICs2NSw4IEBACiBNT0RVTEVfQUxJQVNfUlROTF9MSU5LKCJpcDZ0bmwiKTsKIE1PRFVMRV9BTElBU19ORVRERVYoImlwNnRubDAiKTsKIAotI2RlZmluZSBIQVNIX1NJWkVfU0hJRlQgIDUKLSNkZWZpbmUgSEFTSF9TSVpFICgxIDw8IEhBU0hfU0laRV9TSElGVCkKKyNkZWZpbmUgSVA2X1RVTk5FTF9IQVNIX1NJWkVfU0hJRlQgIDUKKyNkZWZpbmUgSVA2X1RVTk5FTF9IQVNIX1NJWkUgKDEgPDwgSVA2X1RVTk5FTF9IQVNIX1NJWkVfU0hJRlQpCiAKIHN0YXRpYyBib29sIGxvZ19lY25fZXJyb3IgPSB0cnVlOwogbW9kdWxlX3BhcmFtKGxvZ19lY25fZXJyb3IsIGJvb2wsIDA2NDQpOwpAQCAtNzUsNyArNzYsNyBAQAogewogCXUzMiBoYXNoID0gaXB2Nl9hZGRyX2hhc2goYWRkcjEpIF4gaXB2Nl9hZGRyX2hhc2goYWRkcjIpOwogCi0JcmV0dXJuIGhhc2hfMzIoaGFzaCwgSEFTSF9TSVpFX1NISUZUKTsKKwlyZXR1cm4gaGFzaF8zMihoYXNoLCBJUDZfVFVOTkVMX0hBU0hfU0laRV9TSElGVCk7CiB9CiAKIHN0YXRpYyBpbnQgaXA2X3RubF9kZXZfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTg3LDkgKzg4LDEwIEBACiAJLyogdGhlIElQdjYgdHVubmVsIGZhbGxiYWNrIGRldmljZSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpmYl90bmxfZGV2OwogCS8qIGxpc3RzIGZvciBzdG9yaW5nIHR1bm5lbHMgaW4gdXNlICovCi0Jc3RydWN0IGlwNl90bmwgX19yY3UgKnRubHNfcl9sW0hBU0hfU0laRV07CisJc3RydWN0IGlwNl90bmwgX19yY3UgKnRubHNfcl9sW0lQNl9UVU5ORUxfSEFTSF9TSVpFXTsKIAlzdHJ1Y3QgaXA2X3RubCBfX3JjdSAqdG5sc193Y1sxXTsKIAlzdHJ1Y3QgaXA2X3RubCBfX3JjdSAqKnRubHNbMl07CisJc3RydWN0IGlwNl90bmwgX19yY3UgKmNvbGxlY3RfbWRfdHVuOwogfTsKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICppcDZfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xNjYsNiArMTY4LDEwIEBACiAJCQlyZXR1cm4gdDsKIAl9CiAKKwl0ID0gcmN1X2RlcmVmZXJlbmNlKGlwNm4tPmNvbGxlY3RfbWRfdHVuKTsKKwlpZiAodCkKKwkJcmV0dXJuIHQ7CisKIAl0ID0gcmN1X2RlcmVmZXJlbmNlKGlwNm4tPnRubHNfd2NbMF0pOwogCWlmICh0ICYmICh0LT5kZXYtPmZsYWdzICYgSUZGX1VQKSkKIAkJcmV0dXJuIHQ7CkBAIC0yMDksNiArMjE1LDggQEAKIHsKIAlzdHJ1Y3QgaXA2X3RubCBfX3JjdSAqKnRwID0gaXA2X3RubF9idWNrZXQoaXA2biwgJnQtPnBhcm1zKTsKIAorCWlmICh0LT5wYXJtcy5jb2xsZWN0X21kKQorCQlyY3VfYXNzaWduX3BvaW50ZXIoaXA2bi0+Y29sbGVjdF9tZF90dW4sIHQpOwogCXJjdV9hc3NpZ25fcG9pbnRlcih0LT5uZXh0ICwgcnRubF9kZXJlZmVyZW5jZSgqdHApKTsKIAlyY3VfYXNzaWduX3BvaW50ZXIoKnRwLCB0KTsKIH0KQEAgLTIyNCw2ICsyMzIsOSBAQAogCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICoqdHA7CiAJc3RydWN0IGlwNl90bmwgKml0ZXI7CiAKKwlpZiAodC0+cGFybXMuY29sbGVjdF9tZCkKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGlwNm4tPmNvbGxlY3RfbWRfdHVuLCBOVUxMKTsKKwogCWZvciAodHAgPSBpcDZfdG5sX2J1Y2tldChpcDZuLCAmdC0+cGFybXMpOwogCSAgICAgKGl0ZXIgPSBydG5sX2RlcmVmZXJlbmNlKCp0cCkpICE9IE5VTEw7CiAJICAgICB0cCA9ICZpdGVyLT5uZXh0KSB7CkBAIC04MjksNiArODQwLDkgQEAKIAogCXNrYl9zY3J1Yl9wYWNrZXQoc2tiLCAhbmV0X2VxKHR1bm5lbC0+bmV0LCBkZXZfbmV0KHR1bm5lbC0+ZGV2KSkpOwogCisJaWYgKHR1bl9kc3QpCisJCXNrYl9kc3Rfc2V0KHNrYiwgKHN0cnVjdCBkc3RfZW50cnkgKil0dW5fZHN0KTsKKwogCWdyb19jZWxsc19yZWNlaXZlKCZ0dW5uZWwtPmdyb19jZWxscywgc2tiKTsKIAlyZXR1cm4gMDsKIApAQCAtODY1LDYgKzg3OSw3IEBACiB7CiAJc3RydWN0IGlwNl90bmwgKnQ7CiAJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKKwlzdHJ1Y3QgbWV0YWRhdGFfZHN0ICp0dW5fZHN0ID0gTlVMTDsKIAlpbnQgcmV0ID0gLTE7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC04ODEsNyArODk2LDEyIEBACiAJCQlnb3RvIGRyb3A7CiAJCWlmIChpcHR1bm5lbF9wdWxsX2hlYWRlcihza2IsIDAsIHRwaS0+cHJvdG8sIGZhbHNlKSkKIAkJCWdvdG8gZHJvcDsKLQkJcmV0ID0gX19pcDZfdG5sX3Jjdih0LCBza2IsIHRwaSwgTlVMTCwgZHNjcF9lY25fZGVjYXBzdWxhdGUsCisJCWlmICh0LT5wYXJtcy5jb2xsZWN0X21kKSB7CisJCQl0dW5fZHN0ID0gaXB2Nl90dW5fcnhfZHN0KHNrYiwgMCwgMCwgMCk7CisJCQlpZiAoIXR1bl9kc3QpCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0ID0gX19pcDZfdG5sX3Jjdih0LCBza2IsIHRwaSwgdHVuX2RzdCwgZHNjcF9lY25fZGVjYXBzdWxhdGUsCiAJCQkJICAgIGxvZ19lY25fZXJyb3IpOwogCX0KIApAQCAtMTAxMiw4ICsxMDMyLDE2IEBACiAJaW50IG10dTsKIAl1bnNpZ25lZCBpbnQgcHNoX2hsZW4gPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgdC0+ZW5jYXBfaGxlbjsKIAl1bnNpZ25lZCBpbnQgbWF4X2hlYWRyb29tID0gcHNoX2hsZW47CisJdTggaG9wX2xpbWl0OwogCWludCBlcnIgPSAtMTsKIAorCWlmICh0LT5wYXJtcy5jb2xsZWN0X21kKSB7CisJCWhvcF9saW1pdCA9IHNrYl90dW5uZWxfaW5mbyhza2IpLT5rZXkudHRsOworCQlnb3RvIHJvdXRlX2xvb2t1cDsKKwl9IGVsc2UgeworCQlob3BfbGltaXQgPSB0LT5wYXJtcy5ob3BfbGltaXQ7CisJfQorCiAJLyogTkJNQSB0dW5uZWwgKi8KIAlpZiAoaXB2Nl9hZGRyX2FueSgmdC0+cGFybXMucmFkZHIpKSB7CiAJCXN0cnVjdCBpbjZfYWRkciAqYWRkcjY7CkBAIC0xMDQzLDYgKzEwNzEsNyBAQAogCQlnb3RvIHR4X2Vycl9saW5rX2ZhaWx1cmU7CiAKIAlpZiAoIWRzdCkgeworcm91dGVfbG9va3VwOgogCQlkc3QgPSBpcDZfcm91dGVfb3V0cHV0KG5ldCwgTlVMTCwgZmw2KTsKIAogCQlpZiAoZHN0LT5lcnJvcikKQEAgLTEwNTMsNiArMTA4MiwxMCBAQAogCQkJZHN0ID0gTlVMTDsKIAkJCWdvdG8gdHhfZXJyX2xpbmtfZmFpbHVyZTsKIAkJfQorCQlpZiAodC0+cGFybXMuY29sbGVjdF9tZCAmJgorCQkgICAgaXB2Nl9kZXZfZ2V0X3NhZGRyKG5ldCwgaXA2X2RzdF9pZGV2KGRzdCktPmRldiwKKwkJCQkgICAgICAgJmZsNi0+ZGFkZHIsIDAsICZmbDYtPnNhZGRyKSkKKwkJCWdvdG8gdHhfZXJyX2xpbmtfZmFpbHVyZTsKIAkJbmRzdCA9IGRzdDsKIAl9CiAKQEAgLTEwNzEsNyArMTEwNCw3IEBACiAJfQogCWlmIChtdHUgPCBJUFY2X01JTl9NVFUpCiAJCW10dSA9IElQVjZfTUlOX01UVTsKLQlpZiAoc2tiX2RzdChza2IpKQorCWlmIChza2JfZHN0KHNrYikgJiYgIXQtPnBhcm1zLmNvbGxlY3RfbWQpCiAJCXNrYl9kc3Qoc2tiKS0+b3BzLT51cGRhdGVfcG10dShza2JfZHN0KHNrYiksIE5VTEwsIHNrYiwgbXR1KTsKIAlpZiAoc2tiLT5sZW4gPiBtdHUgJiYgIXNrYl9pc19nc28oc2tiKSkgewogCQkqcG10dSA9IG10dTsKQEAgLTExMTEsOCArMTE0NCwxMyBAQAogCQlza2IgPSBuZXdfc2tiOwogCX0KIAotCWlmICghZmw2LT5mbG93aTZfbWFyayAmJiBuZHN0KQotCQlkc3RfY2FjaGVfc2V0X2lwNigmdC0+ZHN0X2NhY2hlLCBuZHN0LCAmZmw2LT5zYWRkcik7CisJaWYgKHQtPnBhcm1zLmNvbGxlY3RfbWQpIHsKKwkJaWYgKHQtPmVuY2FwLnR5cGUgIT0gVFVOTkVMX0VOQ0FQX05PTkUpCisJCQlnb3RvIHR4X2Vycl9kc3RfcmVsZWFzZTsKKwl9IGVsc2UgeworCQlpZiAoIWZsNi0+Zmxvd2k2X21hcmsgJiYgbmRzdCkKKwkJCWRzdF9jYWNoZV9zZXRfaXA2KCZ0LT5kc3RfY2FjaGUsIG5kc3QsICZmbDYtPnNhZGRyKTsKKwl9CiAJc2tiX2RzdF9zZXQoc2tiLCBkc3QpOwogCiAJaWYgKGVuY2FwX2xpbWl0ID49IDApIHsKQEAgLTExMzcsNyArMTE3NSw3IEBACiAJaXB2NmggPSBpcHY2X2hkcihza2IpOwogCWlwNl9mbG93X2hkcihpcHY2aCwgSU5FVF9FQ05fZW5jYXBzdWxhdGUoMCwgZHNmaWVsZCksCiAJCSAgICAgaXA2X21ha2VfZmxvd2xhYmVsKG5ldCwgc2tiLCBmbDYtPmZsb3dsYWJlbCwgdHJ1ZSwgZmw2KSk7Ci0JaXB2NmgtPmhvcF9saW1pdCA9IHQtPnBhcm1zLmhvcF9saW1pdDsKKwlpcHY2aC0+aG9wX2xpbWl0ID0gaG9wX2xpbWl0OwogCWlwdjZoLT5uZXh0aGRyID0gcHJvdG87CiAJaXB2NmgtPnNhZGRyID0gZmw2LT5zYWRkcjsKIAlpcHY2aC0+ZGFkZHIgPSBmbDYtPmRhZGRyOwpAQCAtMTE3MCwxOCArMTIwOCwzNCBAQAogCWlmICh0cHJvdG8gIT0gSVBQUk9UT19JUElQICYmIHRwcm90byAhPSAwKQogCQlyZXR1cm4gLTE7CiAKLQlpZiAoISh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9JR05fRU5DQVBfTElNSVQpKQotCQllbmNhcF9saW1pdCA9IHQtPnBhcm1zLmVuY2FwX2xpbWl0OwotCi0JbWVtY3B5KCZmbDYsICZ0LT5mbC51LmlwNiwgc2l6ZW9mKGZsNikpOwotCiAJZHNmaWVsZCA9IGlwdjRfZ2V0X2RzZmllbGQoaXBoKTsKIAotCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpCi0JCWZsNi5mbG93bGFiZWwgfD0gaHRvbmwoKF9fdTMyKWlwaC0+dG9zIDw8IElQVjZfVENMQVNTX1NISUZUKQotCQkJCQkgICYgSVBWNl9UQ0xBU1NfTUFTSzsKLQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfRldNQVJLKQotCQlmbDYuZmxvd2k2X21hcmsgPSBza2ItPm1hcms7CisJaWYgKHQtPnBhcm1zLmNvbGxlY3RfbWQpIHsKKwkJc3RydWN0IGlwX3R1bm5lbF9pbmZvICp0dW5faW5mbzsKKwkJY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9rZXkgKmtleTsKKworCQl0dW5faW5mbyA9IHNrYl90dW5uZWxfaW5mbyhza2IpOworCQlpZiAodW5saWtlbHkoIXR1bl9pbmZvIHx8ICEodHVuX2luZm8tPm1vZGUgJiBJUF9UVU5ORUxfSU5GT19UWCkgfHwKKwkJCSAgICAgaXBfdHVubmVsX2luZm9fYWYodHVuX2luZm8pICE9IEFGX0lORVQ2KSkKKwkJCXJldHVybiAtMTsKKwkJa2V5ID0gJnR1bl9pbmZvLT5rZXk7CisJCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7CisJCWZsNi5mbG93aTZfcHJvdG8gPSBJUFBST1RPX0lQSVA7CisJCWZsNi5kYWRkciA9IGtleS0+dS5pcHY2LmRzdDsKKwkJZmw2LmZsb3dsYWJlbCA9IGtleS0+bGFiZWw7CisJfSBlbHNlIHsKKwkJaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUKSkKKwkJCWVuY2FwX2xpbWl0ID0gdC0+cGFybXMuZW5jYXBfbGltaXQ7CisKKwkJbWVtY3B5KCZmbDYsICZ0LT5mbC51LmlwNiwgc2l6ZW9mKGZsNikpOworCQlmbDYuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19JUElQOworCisJCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpCisJCQlmbDYuZmxvd2xhYmVsIHw9IGh0b25sKChfX3UzMilpcGgtPnRvcyA8PCBJUFY2X1RDTEFTU19TSElGVCkKKwkJCQkJICYgSVBWNl9UQ0xBU1NfTUFTSzsKKwkJaWYgKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX0ZXTUFSSykKKwkJCWZsNi5mbG93aTZfbWFyayA9IHNrYi0+bWFyazsKKwl9CiAKIAlpZiAoaXB0dW5uZWxfaGFuZGxlX29mZmxvYWRzKHNrYiwgU0tCX0dTT19JUFhJUDYpKQogCQlyZXR1cm4gLTE7CkBAIC0xMjE5LDI4ICsxMjczLDQ3IEBACiAJICAgIGlwNl90bmxfYWRkcl9jb25mbGljdCh0LCBpcHY2aCkpCiAJCXJldHVybiAtMTsKIAotCW9mZnNldCA9IGlwNl90bmxfcGFyc2VfdGx2X2VuY19saW0oc2tiLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSk7Ci0JaWYgKG9mZnNldCA+IDApIHsKLQkJc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICp0ZWw7Ci0JCXRlbCA9IChzdHJ1Y3QgaXB2Nl90bHZfdG5sX2VuY19saW0gKikmc2tiX25ldHdvcmtfaGVhZGVyKHNrYilbb2Zmc2V0XTsKLQkJaWYgKHRlbC0+ZW5jYXBfbGltaXQgPT0gMCkgewotCQkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEFSQU1QUk9CLAotCQkJCSAgICBJQ01QVjZfSERSX0ZJRUxELCBvZmZzZXQgKyAyKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQllbmNhcF9saW1pdCA9IHRlbC0+ZW5jYXBfbGltaXQgLSAxOwotCX0gZWxzZSBpZiAoISh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9JR05fRU5DQVBfTElNSVQpKQotCQllbmNhcF9saW1pdCA9IHQtPnBhcm1zLmVuY2FwX2xpbWl0OwotCi0JbWVtY3B5KCZmbDYsICZ0LT5mbC51LmlwNiwgc2l6ZW9mKGZsNikpOwotCiAJZHNmaWVsZCA9IGlwdjZfZ2V0X2RzZmllbGQoaXB2NmgpOwotCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19UQ0xBU1MpCi0JCWZsNi5mbG93bGFiZWwgfD0gKCooX19iZTMyICopIGlwdjZoICYgSVBWNl9UQ0xBU1NfTUFTSyk7Ci0JaWYgKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX0ZMT1dMQUJFTCkKLQkJZmw2LmZsb3dsYWJlbCB8PSBpcDZfZmxvd2xhYmVsKGlwdjZoKTsKLQlpZiAodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfVVNFX09SSUdfRldNQVJLKQotCQlmbDYuZmxvd2k2X21hcmsgPSBza2ItPm1hcms7CisKKwlpZiAodC0+cGFybXMuY29sbGVjdF9tZCkgeworCQlzdHJ1Y3QgaXBfdHVubmVsX2luZm8gKnR1bl9pbmZvOworCQljb25zdCBzdHJ1Y3QgaXBfdHVubmVsX2tleSAqa2V5OworCisJCXR1bl9pbmZvID0gc2tiX3R1bm5lbF9pbmZvKHNrYik7CisJCWlmICh1bmxpa2VseSghdHVuX2luZm8gfHwgISh0dW5faW5mby0+bW9kZSAmIElQX1RVTk5FTF9JTkZPX1RYKSB8fAorCQkJICAgICBpcF90dW5uZWxfaW5mb19hZih0dW5faW5mbykgIT0gQUZfSU5FVDYpKQorCQkJcmV0dXJuIC0xOworCQlrZXkgPSAmdHVuX2luZm8tPmtleTsKKwkJbWVtc2V0KCZmbDYsIDAsIHNpemVvZihmbDYpKTsKKwkJZmw2LmZsb3dpNl9wcm90byA9IElQUFJPVE9fSVBWNjsKKwkJZmw2LmRhZGRyID0ga2V5LT51LmlwdjYuZHN0OworCQlmbDYuZmxvd2xhYmVsID0ga2V5LT5sYWJlbDsKKwl9IGVsc2UgeworCQlvZmZzZXQgPSBpcDZfdG5sX3BhcnNlX3Rsdl9lbmNfbGltKHNrYiwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOworCQlpZiAob2Zmc2V0ID4gMCkgeworCQkJc3RydWN0IGlwdjZfdGx2X3RubF9lbmNfbGltICp0ZWw7CisKKwkJCXRlbCA9ICh2b2lkICopJnNrYl9uZXR3b3JrX2hlYWRlcihza2IpW29mZnNldF07CisJCQlpZiAodGVsLT5lbmNhcF9saW1pdCA9PSAwKSB7CisJCQkJaWNtcHY2X3NlbmQoc2tiLCBJQ01QVjZfUEFSQU1QUk9CLAorCQkJCQkgICAgSUNNUFY2X0hEUl9GSUVMRCwgb2Zmc2V0ICsgMik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJZW5jYXBfbGltaXQgPSB0ZWwtPmVuY2FwX2xpbWl0IC0gMTsKKwkJfSBlbHNlIGlmICghKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVCkpIHsKKwkJCWVuY2FwX2xpbWl0ID0gdC0+cGFybXMuZW5jYXBfbGltaXQ7CisJCX0KKworCQltZW1jcHkoJmZsNiwgJnQtPmZsLnUuaXA2LCBzaXplb2YoZmw2KSk7CisJCWZsNi5mbG93aTZfcHJvdG8gPSBJUFBST1RPX0lQVjY7CisKKwkJaWYgKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX1RDTEFTUykKKwkJCWZsNi5mbG93bGFiZWwgfD0gKCooX19iZTMyICopaXB2NmggJiBJUFY2X1RDTEFTU19NQVNLKTsKKwkJaWYgKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX1VTRV9PUklHX0ZMT1dMQUJFTCkKKwkJCWZsNi5mbG93bGFiZWwgfD0gaXA2X2Zsb3dsYWJlbChpcHY2aCk7CisJCWlmICh0LT5wYXJtcy5mbGFncyAmIElQNl9UTkxfRl9VU0VfT1JJR19GV01BUkspCisJCQlmbDYuZmxvd2k2X21hcmsgPSBza2ItPm1hcms7CisJfQogCiAJaWYgKGlwdHVubmVsX2hhbmRsZV9vZmZsb2Fkcyhza2IsIFNLQl9HU09fSVBYSVA2KSkKIAkJcmV0dXJuIC0xOwpAQCAtMTczOSw2ICsxODEyLDEwIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAlpcDZfdG5sX2xpbmtfY29uZmlnKHQpOworCWlmICh0LT5wYXJtcy5jb2xsZWN0X21kKSB7CisJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ORVROU19MT0NBTDsKKwkJbmV0aWZfa2VlcF9kc3QoZGV2KTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4MDksNiArMTg4Niw5IEBACiAKIAlpZiAoZGF0YVtJRkxBX0lQVFVOX1BST1RPXSkKIAkJcGFybXMtPnByb3RvID0gbmxhX2dldF91OChkYXRhW0lGTEFfSVBUVU5fUFJPVE9dKTsKKworCWlmIChkYXRhW0lGTEFfSVBUVU5fQ09MTEVDVF9NRVRBREFUQV0pCisJCXBhcm1zLT5jb2xsZWN0X21kID0gdHJ1ZTsKIH0KIAogc3RhdGljIGJvb2wgaXA2X3RubF9uZXRsaW5rX2VuY2FwX3Bhcm1zKHN0cnVjdCBubGF0dHIgKmRhdGFbXSwKQEAgLTE4NDgsNiArMTkyOCw3IEBACiAJCQkgICBzdHJ1Y3QgbmxhdHRyICp0YltdLCBzdHJ1Y3QgbmxhdHRyICpkYXRhW10pCiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOworCXN0cnVjdCBpcDZfdG5sX25ldCAqaXA2biA9IG5ldF9nZW5lcmljKG5ldCwgaXA2X3RubF9uZXRfaWQpOwogCXN0cnVjdCBpcDZfdG5sICpudCwgKnQ7CiAJc3RydWN0IGlwX3R1bm5lbF9lbmNhcCBpcGVuY2FwOwogCkBAIC0xODYyLDkgKzE5NDMsMTQgQEAKIAogCWlwNl90bmxfbmV0bGlua19wYXJtcyhkYXRhLCAmbnQtPnBhcm1zKTsKIAotCXQgPSBpcDZfdG5sX2xvY2F0ZShuZXQsICZudC0+cGFybXMsIDApOwotCWlmICghSVNfRVJSKHQpKQotCQlyZXR1cm4gLUVFWElTVDsKKwlpZiAobnQtPnBhcm1zLmNvbGxlY3RfbWQpIHsKKwkJaWYgKHJ0bmxfZGVyZWZlcmVuY2UoaXA2bi0+Y29sbGVjdF9tZF90dW4pKQorCQkJcmV0dXJuIC1FRVhJU1Q7CisJfSBlbHNlIHsKKwkJdCA9IGlwNl90bmxfbG9jYXRlKG5ldCwgJm50LT5wYXJtcywgMCk7CisJCWlmICghSVNfRVJSKHQpKQorCQkJcmV0dXJuIC1FRVhJU1Q7CisJfQogCiAJcmV0dXJuIGlwNl90bmxfY3JlYXRlMihkZXYpOwogfQpAQCAtMTg4OCw2ICsxOTc0LDggQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCWlwNl90bmxfbmV0bGlua19wYXJtcyhkYXRhLCAmcCk7CisJaWYgKHAuY29sbGVjdF9tZCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAl0ID0gaXA2X3RubF9sb2NhdGUobmV0LCAmcCwgMCk7CiAJaWYgKCFJU19FUlIodCkpIHsKQEAgLTE5MzUsNiArMjAyMyw4IEBACiAJCW5sYV90b3RhbF9zaXplKDIpICsKIAkJLyogSUZMQV9JUFRVTl9FTkNBUF9EUE9SVCAqLwogCQlubGFfdG90YWxfc2l6ZSgyKSArCisJCS8qIElGTEFfSVBUVU5fQ09MTEVDVF9NRVRBREFUQSAqLworCQlubGFfdG90YWxfc2l6ZSgwKSArCiAJCTA7CiB9CiAKQEAgLTE5NTMsMTYgKzIwNDMsMTUgQEAKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfSVBUVU5fUFJPVE8sIHBhcm0tPnByb3RvKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlpZiAobmxhX3B1dF91MTYoc2tiLCBJRkxBX0lQVFVOX0VOQ0FQX1RZUEUsCi0JCQl0dW5uZWwtPmVuY2FwLnR5cGUpIHx8Ci0JbmxhX3B1dF9iZTE2KHNrYiwgSUZMQV9JUFRVTl9FTkNBUF9TUE9SVCwKLQkJICAgICB0dW5uZWwtPmVuY2FwLnNwb3J0KSB8fAotCW5sYV9wdXRfYmUxNihza2IsIElGTEFfSVBUVU5fRU5DQVBfRFBPUlQsCi0JCSAgICAgdHVubmVsLT5lbmNhcC5kcG9ydCkgfHwKLQlubGFfcHV0X3UxNihza2IsIElGTEFfSVBUVU5fRU5DQVBfRkxBR1MsCi0JCSAgICB0dW5uZWwtPmVuY2FwLmZsYWdzKSkKKwlpZiAobmxhX3B1dF91MTYoc2tiLCBJRkxBX0lQVFVOX0VOQ0FQX1RZUEUsIHR1bm5lbC0+ZW5jYXAudHlwZSkgfHwKKwkgICAgbmxhX3B1dF9iZTE2KHNrYiwgSUZMQV9JUFRVTl9FTkNBUF9TUE9SVCwgdHVubmVsLT5lbmNhcC5zcG9ydCkgfHwKKwkgICAgbmxhX3B1dF9iZTE2KHNrYiwgSUZMQV9JUFRVTl9FTkNBUF9EUE9SVCwgdHVubmVsLT5lbmNhcC5kcG9ydCkgfHwKKwkgICAgbmxhX3B1dF91MTYoc2tiLCBJRkxBX0lQVFVOX0VOQ0FQX0ZMQUdTLCB0dW5uZWwtPmVuY2FwLmZsYWdzKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKKwlpZiAocGFybS0+Y29sbGVjdF9tZCkKKwkJaWYgKG5sYV9wdXRfZmxhZyhza2IsIElGTEFfSVBUVU5fQ09MTEVDVF9NRVRBREFUQSkpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlyZXR1cm4gMDsKIAogbmxhX3B1dF9mYWlsdXJlOgpAQCAtMTk5MCw2ICsyMDc5LDcgQEAKIAlbSUZMQV9JUFRVTl9FTkNBUF9GTEFHU10JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtJRkxBX0lQVFVOX0VOQ0FQX1NQT1JUXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW0lGTEFfSVBUVU5fRU5DQVBfRFBPUlRdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbSUZMQV9JUFRVTl9DT0xMRUNUX01FVEFEQVRBXQk9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBydG5sX2xpbmtfb3BzIGlwNl9saW5rX29wcyBfX3JlYWRfbW9zdGx5ID0gewpAQCAtMjAzMSw3ICsyMTIxLDcgQEAKIAkJaWYgKGRldi0+cnRubF9saW5rX29wcyA9PSAmaXA2X2xpbmtfb3BzKQogCQkJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfcXVldWUoZGV2LCAmbGlzdCk7CiAKLQlmb3IgKGggPSAwOyBoIDwgSEFTSF9TSVpFOyBoKyspIHsKKwlmb3IgKGggPSAwOyBoIDwgSVA2X1RVTk5FTF9IQVNIX1NJWkU7IGgrKykgewogCQl0ID0gcnRubF9kZXJlZmVyZW5jZShpcDZuLT50bmxzX3JfbFtoXSk7CiAJCXdoaWxlICh0KSB7CiAJCQkvKiBJZiBkZXYgaXMgaW4gdGhlIHNhbWUgbmV0bnMsIGl0IGhhcyBhbHJlYWR5CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdnRpLmMgYi9uZXQvaXB2Ni9pcDZfdnRpLmMKaW5kZXggZDkwYTExZi4uOGEwMmNhOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3Z0aS5jCisrKyBiL25ldC9pcHY2L2lwNl92dGkuYwpAQCAtNTAsMTQgKzUwLDE0IEBACiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgogCi0jZGVmaW5lIEhBU0hfU0laRV9TSElGVCAgNQotI2RlZmluZSBIQVNIX1NJWkUgKDEgPDwgSEFTSF9TSVpFX1NISUZUKQorI2RlZmluZSBJUDZfVlRJX0hBU0hfU0laRV9TSElGVCAgNQorI2RlZmluZSBJUDZfVlRJX0hBU0hfU0laRSAoMSA8PCBJUDZfVlRJX0hBU0hfU0laRV9TSElGVCkKIAogc3RhdGljIHUzMiBIQVNIKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcjEsIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcjIpCiB7CiAJdTMyIGhhc2ggPSBpcHY2X2FkZHJfaGFzaChhZGRyMSkgXiBpcHY2X2FkZHJfaGFzaChhZGRyMik7CiAKLQlyZXR1cm4gaGFzaF8zMihoYXNoLCBIQVNIX1NJWkVfU0hJRlQpOworCXJldHVybiBoYXNoXzMyKGhhc2gsIElQNl9WVElfSEFTSF9TSVpFX1NISUZUKTsKIH0KIAogc3RhdGljIGludCB2dGk2X2Rldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtNjksNyArNjksNyBAQAogCS8qIHRoZSB2dGk2IHR1bm5lbCBmYWxsYmFjayBkZXZpY2UgKi8KIAlzdHJ1Y3QgbmV0X2RldmljZSAqZmJfdG5sX2RldjsKIAkvKiBsaXN0cyBmb3Igc3RvcmluZyB0dW5uZWxzIGluIHVzZSAqLwotCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICp0bmxzX3JfbFtIQVNIX1NJWkVdOworCXN0cnVjdCBpcDZfdG5sIF9fcmN1ICp0bmxzX3JfbFtJUDZfVlRJX0hBU0hfU0laRV07CiAJc3RydWN0IGlwNl90bmwgX19yY3UgKnRubHNfd2NbMV07CiAJc3RydWN0IGlwNl90bmwgX19yY3UgKip0bmxzWzJdOwogfTsKQEAgLTMyMSwxMSArMzIxLDkgQEAKIAkJCWdvdG8gZGlzY2FyZDsKIAkJfQogCi0JCVhGUk1fVFVOTkVMX1NLQl9DQihza2IpLT50dW5uZWwuaXA2ID0gdDsKLQogCQlyY3VfcmVhZF91bmxvY2soKTsKIAotCQlyZXR1cm4geGZybTZfcmN2KHNrYik7CisJCXJldHVybiB4ZnJtNl9yY3ZfdG5sKHNrYiwgdCk7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiAtRUlOVkFMOwpAQCAtMzQwLDYgKzMzOCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcGNwdV9zd19uZXRzdGF0cyAqdHN0YXRzOwogCXN0cnVjdCB4ZnJtX3N0YXRlICp4OworCXN0cnVjdCB4ZnJtX21vZGUgKmlubmVyX21vZGU7CiAJc3RydWN0IGlwNl90bmwgKnQgPSBYRlJNX1RVTk5FTF9TS0JfQ0Ioc2tiKS0+dHVubmVsLmlwNjsKIAl1MzIgb3JpZ19tYXJrID0gc2tiLT5tYXJrOwogCWludCByZXQ7CkBAIC0zNTcsNyArMzU2LDE5IEBACiAJfQogCiAJeCA9IHhmcm1faW5wdXRfc3RhdGUoc2tiKTsKLQlmYW1pbHkgPSB4LT5pbm5lcl9tb2RlLT5hZmluZm8tPmZhbWlseTsKKworCWlubmVyX21vZGUgPSB4LT5pbm5lcl9tb2RlOworCisJaWYgKHgtPnNlbC5mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCWlubmVyX21vZGUgPSB4ZnJtX2lwMmlubmVyX21vZGUoeCwgWEZSTV9NT0RFX1NLQl9DQihza2IpLT5wcm90b2NvbCk7CisJCWlmIChpbm5lcl9tb2RlID09IE5VTEwpIHsKKwkJCVhGUk1fSU5DX1NUQVRTKGRldl9uZXQoc2tiLT5kZXYpLAorCQkJCSAgICAgICBMSU5VWF9NSUJfWEZSTUlOU1RBVEVNT0RFRVJST1IpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlmYW1pbHkgPSBpbm5lcl9tb2RlLT5hZmluZm8tPmZhbWlseTsKIAogCXNrYi0+bWFyayA9IGJlMzJfdG9fY3B1KHQtPnBhcm1zLmlfa2V5KTsKIAlyZXQgPSB4ZnJtX3BvbGljeV9jaGVjayhOVUxMLCBYRlJNX1BPTElDWV9JTiwgc2tiLCBmYW1pbHkpOwpAQCAtMTA0MCw3ICsxMDUxLDcgQEAKIAlzdHJ1Y3QgaXA2X3RubCAqdDsKIAlMSVNUX0hFQUQobGlzdCk7CiAKLQlmb3IgKGggPSAwOyBoIDwgSEFTSF9TSVpFOyBoKyspIHsKKwlmb3IgKGggPSAwOyBoIDwgSVA2X1ZUSV9IQVNIX1NJWkU7IGgrKykgewogCQl0ID0gcnRubF9kZXJlZmVyZW5jZShpcDZuLT50bmxzX3JfbFtoXSk7CiAJCXdoaWxlICh0KSB7CiAJCQl1bnJlZ2lzdGVyX25ldGRldmljZV9xdWV1ZSh0LT5kZXYsICZsaXN0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNm1yLmMgYi9uZXQvaXB2Ni9pcDZtci5jCmluZGV4IDYxMjJmOWMuLjdmNDI2NWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNm1yLmMKKysrIGIvbmV0L2lwdjYvaXA2bXIuYwpAQCAtMjIzOSw2ICsyMjM5LDcgQEAKIAlzdHJ1Y3QgcnRhX21mY19zdGF0cyBtZmNzOwogCXN0cnVjdCBubGF0dHIgKm1wX2F0dHI7CiAJc3RydWN0IHJ0bmV4dGhvcCAqbmhwOworCXVuc2lnbmVkIGxvbmcgbGFzdHVzZTsKIAlpbnQgY3Q7CiAKIAkvKiBJZiBjYWNoZSBpcyB1bnJlc29sdmVkLCBkb24ndCB0cnkgdG8gcGFyc2UgSUlGIGFuZCBPSUYgKi8KQEAgLTIyNjksMTIgKzIyNzAsMTQgQEAKIAogCW5sYV9uZXN0X2VuZChza2IsIG1wX2F0dHIpOwogCisJbGFzdHVzZSA9IFJFQURfT05DRShjLT5tZmNfdW4ucmVzLmxhc3R1c2UpOworCWxhc3R1c2UgPSB0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGxhc3R1c2UpID8gamlmZmllcyAtIGxhc3R1c2UgOiAwOworCiAJbWZjcy5tZmNzX3BhY2tldHMgPSBjLT5tZmNfdW4ucmVzLnBrdDsKIAltZmNzLm1mY3NfYnl0ZXMgPSBjLT5tZmNfdW4ucmVzLmJ5dGVzOwogCW1mY3MubWZjc193cm9uZ19pZiA9IGMtPm1mY191bi5yZXMud3JvbmdfaWY7CiAJaWYgKG5sYV9wdXRfNjRiaXQoc2tiLCBSVEFfTUZDX1NUQVRTLCBzaXplb2YobWZjcyksICZtZmNzLCBSVEFfUEFEKSB8fAotCSAgICBubGFfcHV0X3U2NF82NGJpdChza2IsIFJUQV9FWFBJUkVTLAotCQkJICAgICAgamlmZmllc190b19jbG9ja190KGMtPm1mY191bi5yZXMubGFzdHVzZSksCisJICAgIG5sYV9wdXRfdTY0XzY0Yml0KHNrYiwgUlRBX0VYUElSRVMsIGppZmZpZXNfdG9fY2xvY2tfdChsYXN0dXNlKSwKIAkJCSAgICAgIFJUQV9QQUQpKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCkBAIC0yMjgyLDggKzIyODUsOCBAQAogCXJldHVybiAxOwogfQogCi1pbnQgaXA2bXJfZ2V0X3JvdXRlKHN0cnVjdCBuZXQgKm5ldCwKLQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBydG1zZyAqcnRtLCBpbnQgbm93YWl0KQoraW50IGlwNm1yX2dldF9yb3V0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBydG1zZyAqcnRtLAorCQkgICAgaW50IG5vd2FpdCwgdTMyIHBvcnRpZCkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBtcjZfdGFibGUgKm1ydDsKQEAgLTIzMjgsNiArMjMzMSw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCisJCU5FVExJTktfQ0Ioc2tiMikucG9ydGlkID0gcG9ydGlkOwogCQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IyKTsKIAogCQlza2JfcHV0KHNrYjIsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbWNhc3QuYyBiL25ldC9pcHY2L21jYXN0LmMKaW5kZXggZDY0ZWU3ZS4uNzVjMWZjNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbWNhc3QuYworKysgYi9uZXQvaXB2Ni9tY2FzdC5jCkBAIC0xNzM5LDYgKzE3MzksMTUgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJLyogQmFzZWQgb24gUkZDMzgxMCA2LjEuIFNob3VsZCBub3Qgc2VuZCBzb3VyY2UtbGlzdCBjaGFuZ2UKKwkJICogcmVjb3JkcyB3aGVuIHRoZXJlIGlzIGEgZmlsdGVyIG1vZGUgY2hhbmdlLgorCQkgKi8KKwkJaWYgKCgoZ2RlbGV0ZWQgJiYgcG1jLT5tY2Ffc2Ztb2RlID09IE1DQVNUX0VYQ0xVREUpIHx8CisJCSAgICAgKCFnZGVsZXRlZCAmJiBwbWMtPm1jYV9jcmNvdW50KSkgJiYKKwkJICAgICh0eXBlID09IE1MRDJfQUxMT1dfTkVXX1NPVVJDRVMgfHwKKwkJICAgICB0eXBlID09IE1MRDJfQkxPQ0tfT0xEX1NPVVJDRVMpICYmIHBzZi0+c2ZfY3Jjb3VudCkKKwkJCWdvdG8gZGVjcmVhc2Vfc2ZfY3Jjb3VudDsKKwogCQkvKiBjbGVhciBtYXJrcyBvbiBxdWVyeSByZXNwb25zZXMgKi8KIAkJaWYgKGlzcXVlcnkpCiAJCQlwc2YtPnNmX2dzcmVzcCA9IDA7CkBAIC0xNzY2LDYgKzE3NzUsNyBAQAogCQlzY291bnQrKzsgc3RvdGFsKys7CiAJCWlmICgodHlwZSA9PSBNTEQyX0FMTE9XX05FV19TT1VSQ0VTIHx8CiAJCSAgICAgdHlwZSA9PSBNTEQyX0JMT0NLX09MRF9TT1VSQ0VTKSAmJiBwc2YtPnNmX2NyY291bnQpIHsKK2RlY3JlYXNlX3NmX2NyY291bnQ6CiAJCQlwc2YtPnNmX2NyY291bnQtLTsKIAkJCWlmICgoc2RlbGV0ZWQgfHwgZ2RlbGV0ZWQpICYmIHBzZi0+c2ZfY3Jjb3VudCA9PSAwKSB7CiAJCQkJaWYgKHBzZl9wcmV2KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmRpc2MuYyBiL25ldC9pcHY2L25kaXNjLmMKaW5kZXggZmU2NWNkYy4uZDhlNjcxNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmRpc2MuYworKysgYi9uZXQvaXB2Ni9uZGlzYy5jCkBAIC02Nyw3ICs2Nyw2IEBACiAjaW5jbHVkZSA8bmV0L2Zsb3cuaD4KICNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfY29tbW9uLmg+Ci0jaW5jbHVkZSA8bmV0L2wzbWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgpAQCAtNDU3LDExICs0NTYsOSBAQAogCiAJaWYgKCFkc3QpIHsKIAkJc3RydWN0IGZsb3dpNiBmbDY7Ci0JCWludCBvaWYgPSBsM21kZXZfZmliX29pZihza2ItPmRldik7CisJCWludCBvaWYgPSBza2ItPmRldi0+aWZpbmRleDsKIAogCQlpY21wdjZfZmxvd19pbml0KHNrLCAmZmw2LCB0eXBlLCBzYWRkciwgZGFkZHIsIG9pZik7Ci0JCWlmIChvaWYgIT0gc2tiLT5kZXYtPmlmaW5kZXgpCi0JCQlmbDYuZmxvd2k2X2ZsYWdzIHw9IEZMT1dJX0ZMQUdfTDNNREVWX1NSQzsKIAkJZHN0ID0gaWNtcDZfZHN0X2FsbG9jKHNrYi0+ZGV2LCAmZmw2KTsKIAkJaWYgKElTX0VSUihkc3QpKSB7CiAJCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTE1MzgsNyArMTUzNSw2IEBACiAJaW50IHJkX2xlbjsKIAl1OCBoYV9idWZbTUFYX0FERFJfTEVOXSwgKmhhID0gTlVMTCwKIAkgICBvcHNfZGF0YV9idWZbTkRJU0NfT1BTX1JFRElSRUNUX0RBVEFfU1BBQ0VdLCAqb3BzX2RhdGEgPSBOVUxMOwotCWludCBvaWYgPSBsM21kZXZfZmliX29pZihkZXYpOwogCWJvb2wgcmV0OwogCiAJaWYgKGlwdjZfZ2V0X2xsYWRkcihkZXYsICZzYWRkcl9idWYsIElGQV9GX1RFTlRBVElWRSkpIHsKQEAgLTE1NTUsMTAgKzE1NTEsNyBAQAogCX0KIAogCWljbXB2Nl9mbG93X2luaXQoc2ssICZmbDYsIE5ESVNDX1JFRElSRUNULAotCQkJICZzYWRkcl9idWYsICZpcHY2X2hkcihza2IpLT5zYWRkciwgb2lmKTsKLQotCWlmIChvaWYgIT0gc2tiLT5kZXYtPmlmaW5kZXgpCi0JCWZsNi5mbG93aTZfZmxhZ3MgfD0gRkxPV0lfRkxBR19MM01ERVZfU1JDOworCQkJICZzYWRkcl9idWYsICZpcHY2X2hkcihza2IpLT5zYWRkciwgZGV2LT5pZmluZGV4KTsKIAogCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQobmV0LCBOVUxMLCAmZmw2KTsKIAlpZiAoZHN0LT5lcnJvcikgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKaW5kZXggNTUyZmFjMi4uNTVhYWNlYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIAkudSA9IHsKIAkJLmxvZyA9IHsKIAkJCS5sZXZlbCA9IExPR0xFVkVMX1dBUk5JTkcsCi0JCQkubG9nZmxhZ3MgPSBORl9MT0dfTUFTSywKKwkJCS5sb2dmbGFncyA9IE5GX0xPR19ERUZBVUxUX01BU0ssCiAJCX0sCiAJfSwKIH07CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwppbmRleCAxYWE1ODQ4Li45NjNlZTM4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCWhlbHAgPSBuZmN0X2hlbHAoY3QpOwogCWlmICghaGVscCkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKLQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3cgKi8KKwkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3RocmVzaCAqLwogCWhlbHBlciA9IHJjdV9kZXJlZmVyZW5jZShoZWxwLT5oZWxwZXIpOwogCWlmICghaGVscGVyKQogCQlyZXR1cm4gTkZfQUNDRVBUOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9faWNtcHY2LmMKaW5kZXggNjYwYmMxMC4uZjVhNjFiYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19pY21wdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2ljbXB2Ni5jCkBAIC0xNjUsNyArMTY1LDcgQEAKIAkJcmV0dXJuIC1ORl9BQ0NFUFQ7CiAJfQogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAlpbnByb3RvID0gX19uZl9jdF9sNHByb3RvX2ZpbmQoUEZfSU5FVDYsIG9yaWd0dXBsZS5kc3QucHJvdG9udW0pOwogCiAJLyogT3JkaW5hcmlseSwgd2UnZCBleHBlY3QgdGhlIGludmVydGVkIHR1cGxlcHJvdG8sIGJ1dCBpdCdzCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfbG9nX2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9sb2dfaXB2Ni5jCmluZGV4IDhkZDg2OTYuLjU3ZDg2MDYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9sb2dfaXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9sb2dfaXB2Ni5jCkBAIC0zMCw3ICszMCw3IEBACiAJLnUgPSB7CiAJCS5sb2cgPSB7CiAJCQkubGV2ZWwJICA9IExPR0xFVkVMX05PVElDRSwKLQkJCS5sb2dmbGFncyA9IE5GX0xPR19NQVNLLAorCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX0RFRkFVTFRfTUFTSywKIAkJfSwKIAl9LAogfTsKQEAgLTUyLDcgKzUyLDcgQEAKIAlpZiAoaW5mby0+dHlwZSA9PSBORl9MT0dfVFlQRV9MT0cpCiAJCWxvZ2ZsYWdzID0gaW5mby0+dS5sb2cubG9nZmxhZ3M7CiAJZWxzZQotCQlsb2dmbGFncyA9IE5GX0xPR19NQVNLOworCQlsb2dmbGFncyA9IE5GX0xPR19ERUZBVUxUX01BU0s7CiAKIAlpaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwNmhvZmYsIHNpemVvZihfaXA2aCksICZfaXA2aCk7CiAJaWYgKGloID09IE5VTEwpIHsKQEAgLTg0LDcgKzg0LDcgQEAKIAkJfQogCiAJCS8qIE1heCBsZW5ndGg6IDQ4ICJPUFQgKC4uLikgIiAqLwotCQlpZiAobG9nZmxhZ3MgJiBYVF9MT0dfSVBPUFQpCisJCWlmIChsb2dmbGFncyAmIE5GX0xPR19JUE9QVCkKIAkJCW5mX2xvZ19idWZfYWRkKG0sICJPUFQgKCAiKTsKIAogCQlzd2l0Y2ggKGN1cnJlbnRoZHIpIHsKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQljYXNlIElQUFJPVE9fUk9VVElORzoKIAkJY2FzZSBJUFBST1RPX0hPUE9QVFM6CiAJCQlpZiAoZnJhZ21lbnQpIHsKLQkJCQlpZiAobG9nZmxhZ3MgJiBYVF9MT0dfSVBPUFQpCisJCQkJaWYgKGxvZ2ZsYWdzICYgTkZfTE9HX0lQT1BUKQogCQkJCQluZl9sb2dfYnVmX2FkZChtLCAiKSIpOwogCQkJCXJldHVybjsKIAkJCX0KQEAgLTEyOSw3ICsxMjksNyBAQAogCQkJYnJlYWs7CiAJCS8qIE1heCBMZW5ndGggKi8KIAkJY2FzZSBJUFBST1RPX0FIOgotCQkJaWYgKGxvZ2ZsYWdzICYgWFRfTE9HX0lQT1BUKSB7CisJCQlpZiAobG9nZmxhZ3MgJiBORl9MT0dfSVBPUFQpIHsKIAkJCQlzdHJ1Y3QgaXBfYXV0aF9oZHIgX2FoZHI7CiAJCQkJY29uc3Qgc3RydWN0IGlwX2F1dGhfaGRyICphaDsKIApAQCAtMTYxLDcgKzE2MSw3IEBACiAJCQloZHJsZW4gPSAoaHAtPmhkcmxlbisyKTw8MjsKIAkJCWJyZWFrOwogCQljYXNlIElQUFJPVE9fRVNQOgotCQkJaWYgKGxvZ2ZsYWdzICYgWFRfTE9HX0lQT1BUKSB7CisJCQlpZiAobG9nZmxhZ3MgJiBORl9MT0dfSVBPUFQpIHsKIAkJCQlzdHJ1Y3QgaXBfZXNwX2hkciBfZXNwaDsKIAkJCQljb25zdCBzdHJ1Y3QgaXBfZXNwX2hkciAqZWg7CiAKQEAgLTE5NCw3ICsxOTQsNyBAQAogCQkJbmZfbG9nX2J1Zl9hZGQobSwgIlVua25vd24gRXh0IEhkciAldSIsIGN1cnJlbnRoZHIpOwogCQkJcmV0dXJuOwogCQl9Ci0JCWlmIChsb2dmbGFncyAmIFhUX0xPR19JUE9QVCkKKwkJaWYgKGxvZ2ZsYWdzICYgTkZfTE9HX0lQT1BUKQogCQkJbmZfbG9nX2J1Zl9hZGQobSwgIikgIik7CiAKIAkJY3VycmVudGhkciA9IGhwLT5uZXh0aGRyOwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAJfQogCiAJLyogTWF4IGxlbmd0aDogMTUgIlVJRD00Mjk0OTY3Mjk1ICIgKi8KLQlpZiAoKGxvZ2ZsYWdzICYgWFRfTE9HX1VJRCkgJiYgcmVjdXJzZSkKKwlpZiAoKGxvZ2ZsYWdzICYgTkZfTE9HX1VJRCkgJiYgcmVjdXJzZSkKIAkJbmZfbG9nX2R1bXBfc2tfdWlkX2dpZChtLCBza2ItPnNrKTsKIAogCS8qIE1heCBsZW5ndGg6IDE2ICJNQVJLPTB4RkZGRkZGRkYgIiAqLwpAQCAtMjk1LDcgKzI5NSw3IEBACiAJaWYgKGluZm8tPnR5cGUgPT0gTkZfTE9HX1RZUEVfTE9HKQogCQlsb2dmbGFncyA9IGluZm8tPnUubG9nLmxvZ2ZsYWdzOwogCi0JaWYgKCEobG9nZmxhZ3MgJiBYVF9MT0dfTUFDREVDT0RFKSkKKwlpZiAoIShsb2dmbGFncyAmIE5GX0xPR19NQUNERUNPREUpKQogCQlnb3RvIGZhbGxiYWNrOwogCiAJc3dpdGNoIChkZXYtPnR5cGUpIHsKQEAgLTM3OSw4ICszNzksNyBAQAogCiBzdGF0aWMgaW50IF9fbmV0X2luaXQgbmZfbG9nX2lwdjZfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQogewotCW5mX2xvZ19zZXQobmV0LCBORlBST1RPX0lQVjYsICZuZl9pcDZfbG9nZ2VyKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gbmZfbG9nX3NldChuZXQsIE5GUFJPVE9fSVBWNiwgJm5mX2lwNl9sb2dnZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX25ldF9leGl0IG5mX2xvZ19pcHY2X25ldF9leGl0KHN0cnVjdCBuZXQgKm5ldCkKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY2LmMKaW5kZXggMzBiMjJmNC4uZDZlNGJhNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY2LmMKQEAgLTIyLDkgKzIyLDcgQEAKIHsKIAlzdHJ1Y3QgbmZ0X3BrdGluZm8gcGt0OwogCi0JLyogbWFsZm9ybWVkIHBhY2tldCwgZHJvcCBpdCAqLwotCWlmIChuZnRfc2V0X3BrdGluZm9faXB2NigmcGt0LCBza2IsIHN0YXRlKSA8IDApCi0JCXJldHVybiBORl9EUk9QOworCW5mdF9zZXRfcGt0aW5mb19pcHY2KCZwa3QsIHNrYiwgc3RhdGUpOwogCiAJcmV0dXJuIG5mdF9kb19jaGFpbigmcGt0LCBwcml2KTsKIH0KQEAgLTEwMiw3ICsxMDAsMTAgQEAKIHsKIAlpbnQgcmV0OwogCi0JbmZ0X3JlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9pcHY2KTsKKwlyZXQgPSBuZnRfcmVnaXN0ZXJfY2hhaW5fdHlwZSgmZmlsdGVyX2lwdjYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJcmV0ID0gcmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmbmZfdGFibGVzX2lwdjZfbmV0X29wcyk7CiAJaWYgKHJldCA8IDApCiAJCW5mdF91bnJlZ2lzdGVyX2NoYWluX3R5cGUoJmZpbHRlcl9pcHY2KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9jaGFpbl9yb3V0ZV9pcHY2LmMKaW5kZXggNzFkOTk1Zi4uZjI3Mjc0NyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9jaGFpbl9yb3V0ZV9pcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9jaGFpbl9yb3V0ZV9pcHY2LmMKQEAgLTMxLDEwICszMSw5IEBACiAJc3RydWN0IGluNl9hZGRyIHNhZGRyLCBkYWRkcjsKIAl1X2ludDhfdCBob3BfbGltaXQ7CiAJdTMyIG1hcmssIGZsb3dsYWJlbDsKKwlpbnQgZXJyOwogCi0JLyogbWFsZm9ybWVkIHBhY2tldCwgZHJvcCBpdCAqLwotCWlmIChuZnRfc2V0X3BrdGluZm9faXB2NigmcGt0LCBza2IsIHN0YXRlKSA8IDApCi0JCXJldHVybiBORl9EUk9QOworCW5mdF9zZXRfcGt0aW5mb19pcHY2KCZwa3QsIHNrYiwgc3RhdGUpOwogCiAJLyogc2F2ZSBzb3VyY2UvZGVzdCBhZGRyZXNzLCBtYXJrLCBob3BsaW1pdCwgZmxvd2xhYmVsLCBwcmlvcml0eSAqLwogCW1lbWNweSgmc2FkZHIsICZpcHY2X2hkcihza2IpLT5zYWRkciwgc2l6ZW9mKHNhZGRyKSk7CkBAIC00NiwxMyArNDUsMTYgQEAKIAlmbG93bGFiZWwgPSAqKCh1MzIgKilpcHY2X2hkcihza2IpKTsKIAogCXJldCA9IG5mdF9kb19jaGFpbigmcGt0LCBwcml2KTsKLQlpZiAocmV0ICE9IE5GX0RST1AgJiYgcmV0ICE9IE5GX1FVRVVFICYmCisJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4gJiYKIAkgICAgKG1lbWNtcCgmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsICZzYWRkciwgc2l6ZW9mKHNhZGRyKSkgfHwKIAkgICAgIG1lbWNtcCgmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsICZkYWRkciwgc2l6ZW9mKGRhZGRyKSkgfHwKIAkgICAgIHNrYi0+bWFyayAhPSBtYXJrIHx8CiAJICAgICBpcHY2X2hkcihza2IpLT5ob3BfbGltaXQgIT0gaG9wX2xpbWl0IHx8Ci0JICAgICBmbG93bGFiZWwgIT0gKigodV9pbnQzMl90ICopaXB2Nl9oZHIoc2tiKSkpKQotCQlyZXR1cm4gaXA2X3JvdXRlX21lX2hhcmRlcihzdGF0ZS0+bmV0LCBza2IpID09IDAgPyByZXQgOiBORl9EUk9QOworCSAgICAgZmxvd2xhYmVsICE9ICooKHVfaW50MzJfdCAqKWlwdjZfaGRyKHNrYikpKSkgeworCQllcnIgPSBpcDZfcm91dGVfbWVfaGFyZGVyKHN0YXRlLT5uZXQsIHNrYik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0ID0gTkZfRFJPUF9FUlIoZXJyKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2Ni5jCmluZGV4IDUzM2NkNTcuLjkyYmRhOTkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY2LmMKQEAgLTQ3LDYgKzQ3LDcgQEAKIAkuZXZhbAkJPSBuZnRfcmVqZWN0X2lwdjZfZXZhbCwKIAkuaW5pdAkJPSBuZnRfcmVqZWN0X2luaXQsCiAJLmR1bXAJCT0gbmZ0X3JlamVjdF9kdW1wLAorCS52YWxpZGF0ZQk9IG5mdF9yZWplY3RfdmFsaWRhdGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3JlamVjdF9pcHY2X3R5cGUgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L291dHB1dF9jb3JlLmMgYi9uZXQvaXB2Ni9vdXRwdXRfY29yZS5jCmluZGV4IDQ2MmYyYTc2Yi4uN2NjYThhYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvb3V0cHV0X2NvcmUuYworKysgYi9uZXQvaXB2Ni9vdXRwdXRfY29yZS5jCkBAIC0xNDgsNiArMTQ4LDEzIEBACiAJaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4gPSBodG9ucyhsZW4pOwogCUlQNkNCKHNrYiktPm5ob2ZmID0gb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIG5leHRoZHIpOwogCisJLyogaWYgZWdyZXNzIGRldmljZSBpcyBlbnNsYXZlZCB0byBhbiBMMyBtYXN0ZXIgZGV2aWNlIHBhc3MgdGhlCisJICogc2tiIHRvIGl0cyBoYW5kbGVyIGZvciBwcm9jZXNzaW5nCisJICovCisJc2tiID0gbDNtZGV2X2lwNl9vdXQoc2ssIHNrYik7CisJaWYgKHVubGlrZWx5KCFza2IpKQorCQlyZXR1cm4gMDsKKwogCXJldHVybiBuZl9ob29rKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9MT0NBTF9PVVQsCiAJCSAgICAgICBuZXQsIHNrLCBza2IsIE5VTEwsIHNrYl9kc3Qoc2tiKS0+ZGV2LAogCQkgICAgICAgZHN0X291dHB1dCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9waW5nLmMgYi9uZXQvaXB2Ni9waW5nLmMKaW5kZXggMDkwMDM1Mi4uMGU5ODNiNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcGluZy5jCisrKyBiL25ldC9pcHY2L3BpbmcuYwpAQCAtMTI2LDggKzEyNiwxMCBAQAogCXJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKSBkc3Q7CiAKIAlucCA9IGluZXQ2X3NrKHNrKTsKLQlpZiAoIW5wKQotCQlyZXR1cm4gLUVCQURGOworCWlmICghbnApIHsKKwkJZXJyID0gLUVCQURGOworCQlnb3RvIGRzdF9lcnJfb3V0OworCX0KIAogCWlmICghZmw2LmZsb3dpNl9vaWYgJiYgaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmZmw2LmRhZGRyKSkKIAkJZmw2LmZsb3dpNl9vaWYgPSBucC0+bWNhc3Rfb2lmOwpAQCAtMTYzLDYgKzE2NSw5IEBACiAJfQogCXJlbGVhc2Vfc29jayhzayk7CiAKK2RzdF9lcnJfb3V0OgorCWRzdF9yZWxlYXNlKGRzdCk7CisKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9wcm9jLmMgYi9uZXQvaXB2Ni9wcm9jLmMKaW5kZXggNjc5MjUzZDAuLmNjOGUzYWUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Byb2MuYworKysgYi9uZXQvaXB2Ni9wcm9jLmMKQEAgLTMwLDYgKzMwLDExIEBACiAjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAKKyNkZWZpbmUgTUFYNChhLCBiLCBjLCBkKSBcCisJbWF4X3QodTMyLCBtYXhfdCh1MzIsIGEsIGIpLCBtYXhfdCh1MzIsIGMsIGQpKQorI2RlZmluZSBTTk1QX01JQl9NQVggTUFYNChVRFBfTUlCX01BWCwgVENQX01JQl9NQVgsIFwKKwkJCUlQU1RBVFNfTUlCX01BWCwgSUNNUF9NSUJfTUFYKQorCiBzdGF0aWMgaW50IHNvY2tzdGF0Nl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXEtPnByaXZhdGU7CkBAIC0xOTEsMjUgKzE5NiwzNCBAQAogCQkJCWF0b21pY19sb25nX3QgKnNtaWIsCiAJCQkJY29uc3Qgc3RydWN0IHNubXBfbWliICppdGVtbGlzdCkKIHsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZbU05NUF9NSUJfTUFYXTsKIAlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKIAotCWZvciAoaSA9IDA7IGl0ZW1saXN0W2ldLm5hbWU7IGkrKykgewotCQl2YWwgPSBwY3B1bWliID8KLQkJCXNubXBfZm9sZF9maWVsZChwY3B1bWliLCBpdGVtbGlzdFtpXS5lbnRyeSkgOgotCQkJYXRvbWljX2xvbmdfcmVhZChzbWliICsgaXRlbWxpc3RbaV0uZW50cnkpOwotCQlzZXFfcHJpbnRmKHNlcSwgIiUtMzJzXHQlbHVcbiIsIGl0ZW1saXN0W2ldLm5hbWUsIHZhbCk7CisJaWYgKHBjcHVtaWIpIHsKKwkJbWVtc2V0KGJ1ZmYsIDAsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIFNOTVBfTUlCX01BWCk7CisKKwkJc25tcF9nZXRfY3B1X2ZpZWxkX2JhdGNoKGJ1ZmYsIGl0ZW1saXN0LCBwY3B1bWliKTsKKwkJZm9yIChpID0gMDsgaXRlbWxpc3RbaV0ubmFtZTsgaSsrKQorCQkJc2VxX3ByaW50ZihzZXEsICIlLTMyc1x0JWx1XG4iLAorCQkJCSAgIGl0ZW1saXN0W2ldLm5hbWUsIGJ1ZmZbaV0pOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGl0ZW1saXN0W2ldLm5hbWU7IGkrKykKKwkJCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCVsdVxuIiwgaXRlbWxpc3RbaV0ubmFtZSwKKwkJCQkgICBhdG9taWNfbG9uZ19yZWFkKHNtaWIgKyBpdGVtbGlzdFtpXS5lbnRyeSkpOwogCX0KIH0KIAogc3RhdGljIHZvaWQgc25tcDZfc2VxX3Nob3dfaXRlbTY0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkIF9fcGVyY3B1ICptaWIsCiAJCQkJICBjb25zdCBzdHJ1Y3Qgc25tcF9taWIgKml0ZW1saXN0LCBzaXplX3Qgc3luY3BvZmYpCiB7CisJdTY0IGJ1ZmY2NFtTTk1QX01JQl9NQVhdOwogCWludCBpOwogCisJbWVtc2V0KGJ1ZmY2NCwgMCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogU05NUF9NSUJfTUFYKTsKKworCXNubXBfZ2V0X2NwdV9maWVsZDY0X2JhdGNoKGJ1ZmY2NCwgaXRlbWxpc3QsIG1pYiwgc3luY3BvZmYpOwogCWZvciAoaSA9IDA7IGl0ZW1saXN0W2ldLm5hbWU7IGkrKykKLQkJc2VxX3ByaW50ZihzZXEsICIlLTMyc1x0JWxsdVxuIiwgaXRlbWxpc3RbaV0ubmFtZSwKLQkJCSAgIHNubXBfZm9sZF9maWVsZDY0KG1pYiwgaXRlbWxpc3RbaV0uZW50cnksIHN5bmNwb2ZmKSk7CisJCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCVsbHVcbiIsIGl0ZW1saXN0W2ldLm5hbWUsIGJ1ZmY2NFtpXSk7CiB9CiAKIHN0YXRpYyBpbnQgc25tcDZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yYXcuYyBiL25ldC9pcHY2L3Jhdy5jCmluZGV4IDU5MGRkMWYuLjU0NDA0ZjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Jhdy5jCisrKyBiL25ldC9pcHY2L3Jhdy5jCkBAIC02NTMsNiArNjUzLDEzIEBACiAJaWYgKGVycikKIAkJZ290byBlcnJvcl9mYXVsdDsKIAorCS8qIGlmIGVncmVzcyBkZXZpY2UgaXMgZW5zbGF2ZWQgdG8gYW4gTDMgbWFzdGVyIGRldmljZSBwYXNzIHRoZQorCSAqIHNrYiB0byBpdHMgaGFuZGxlciBmb3IgcHJvY2Vzc2luZworCSAqLworCXNrYiA9IGwzbWRldl9pcDZfb3V0KHNrLCBza2IpOworCWlmICh1bmxpa2VseSghc2tiKSkKKwkJcmV0dXJuIDA7CisKIAlJUDZfVVBEX1BPX1NUQVRTKG5ldCwgcnQtPnJ0NmlfaWRldiwgSVBTVEFUU19NSUJfT1VULCBza2ItPmxlbik7CiAJZXJyID0gTkZfSE9PSyhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfT1VULCBuZXQsIHNrLCBza2IsCiAJCSAgICAgIE5VTEwsIHJ0LT5kc3QuZGV2LCBkc3Rfb3V0cHV0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JvdXRlLmMgYi9uZXQvaXB2Ni9yb3V0ZS5jCmluZGV4IDQ5ODE3NTUuLmJkYmMzOGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JvdXRlLmMKKysrIGIvbmV0L2lwdjYvcm91dGUuYwpAQCAtMTE0NywxNSArMTE0NywxNiBAQAogCXJldHVybiBpcDZfcG9sX3JvdXRlKG5ldCwgdGFibGUsIGZsNi0+Zmxvd2k2X2lpZiwgZmw2LCBmbGFncyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfcm91dGVfaW5wdXRfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwKLQkJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQlzdHJ1Y3QgZmxvd2k2ICpmbDYsIGludCBmbGFncykKK3N0cnVjdCBkc3RfZW50cnkgKmlwNl9yb3V0ZV9pbnB1dF9sb29rdXAoc3RydWN0IG5ldCAqbmV0LAorCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBmbG93aTYgKmZsNiwgaW50IGZsYWdzKQogewogCWlmIChydDZfbmVlZF9zdHJpY3QoJmZsNi0+ZGFkZHIpICYmIGRldi0+dHlwZSAhPSBBUlBIUkRfUElNUkVHKQogCQlmbGFncyB8PSBSVDZfTE9PS1VQX0ZfSUZBQ0U7CiAKIAlyZXR1cm4gZmliNl9ydWxlX2xvb2t1cChuZXQsIGZsNiwgZmxhZ3MsIGlwNl9wb2xfcm91dGVfaW5wdXQpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoaXA2X3JvdXRlX2lucHV0X2xvb2t1cCk7CiAKIHZvaWQgaXA2X3JvdXRlX2lucHV0KHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0xMTY0LDcgKzExNjUsNyBAQAogCWludCBmbGFncyA9IFJUNl9MT09LVVBfRl9IQVNfU0FERFI7CiAJc3RydWN0IGlwX3R1bm5lbF9pbmZvICp0dW5faW5mbzsKIAlzdHJ1Y3QgZmxvd2k2IGZsNiA9IHsKLQkJLmZsb3dpNl9paWYgPSBsM21kZXZfZmliX29pZihza2ItPmRldiksCisJCS5mbG93aTZfaWlmID0gc2tiLT5kZXYtPmlmaW5kZXgsCiAJCS5kYWRkciA9IGlwaC0+ZGFkZHIsCiAJCS5zYWRkciA9IGlwaC0+c2FkZHIsCiAJCS5mbG93bGFiZWwgPSBpcDZfZmxvd2luZm8oaXBoKSwKQEAgLTExODgsMTIgKzExODksMTUgQEAKIHN0cnVjdCBkc3RfZW50cnkgKmlwNl9yb3V0ZV9vdXRwdXRfZmxhZ3Moc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSBzdHJ1Y3QgZmxvd2k2ICpmbDYsIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAJYm9vbCBhbnlfc3JjOwogCi0JZHN0ID0gbDNtZGV2X2dldF9ydDZfZHN0KG5ldCwgZmw2KTsKLQlpZiAoZHN0KQotCQlyZXR1cm4gZHN0OworCWlmIChydDZfbmVlZF9zdHJpY3QoJmZsNi0+ZGFkZHIpKSB7CisJCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKKworCQlkc3QgPSBsM21kZXZfbGlua19zY29wZV9sb29rdXAobmV0LCBmbDYpOworCQlpZiAoZHN0KQorCQkJcmV0dXJuIGRzdDsKKwl9CiAKIAlmbDYtPmZsb3dpNl9paWYgPSBMT09QQkFDS19JRklOREVYOwogCkBAIC0xNjA0LDcgKzE2MDgsOSBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogCiBvdXQ6Ci0JcmV0dXJuIG1pbl90KHVuc2lnbmVkIGludCwgbXR1LCBJUDZfTUFYX01UVSk7CisJbXR1ID0gbWluX3QodW5zaWduZWQgaW50LCBtdHUsIElQNl9NQVhfTVRVKTsKKworCXJldHVybiBtdHUgLSBsd3R1bm5lbF9oZWFkcm9vbShkc3QtPmx3dHN0YXRlLCBtdHUpOwogfQogCiBzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqaWNtcDZfZHN0X2djX2xpc3Q7CkBAIC0xOTg2LDkgKzE5OTIsMTggQEAKIAkJCWlmICghKGd3YV90eXBlICYgSVBWNl9BRERSX1VOSUNBU1QpKQogCQkJCWdvdG8gb3V0OwogCi0JCQlpZiAoY2ZnLT5mY190YWJsZSkKKwkJCWlmIChjZmctPmZjX3RhYmxlKSB7CiAJCQkJZ3J0ID0gaXA2X25oX2xvb2t1cF90YWJsZShuZXQsIGNmZywgZ3dfYWRkcik7CiAKKwkJCQlpZiAoZ3J0KSB7CisJCQkJCWlmIChncnQtPnJ0NmlfZmxhZ3MgJiBSVEZfR0FURVdBWSB8fAorCQkJCQkgICAgKGRldiAmJiBkZXYgIT0gZ3J0LT5kc3QuZGV2KSkgeworCQkJCQkJaXA2X3J0X3B1dChncnQpOworCQkJCQkJZ3J0ID0gTlVMTDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwogCQkJaWYgKCFncnQpCiAJCQkJZ3J0ID0gcnQ2X2xvb2t1cChuZXQsIGd3X2FkZHIsIE5VTEwsCiAJCQkJCQkgY2ZnLT5mY19pZmluZGV4LCAxKTsKQEAgLTI1NTYsOCArMjU3MSwxNiBAQAogewogCXUzMiB0Yl9pZDsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGlkZXYtPmRldik7Ci0Jc3RydWN0IHJ0Nl9pbmZvICpydCA9IGlwNl9kc3RfYWxsb2MobmV0LCBuZXQtPmxvb3BiYWNrX2RldiwKLQkJCQkJICAgIERTVF9OT0NPVU5UKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmV0LT5sb29wYmFja19kZXY7CisJc3RydWN0IHJ0Nl9pbmZvICpydDsKKworCS8qIHVzZSBMMyBNYXN0ZXIgZGV2aWNlIGFzIGxvb3BiYWNrIGZvciBob3N0IHJvdXRlcyBpZiBkZXZpY2UKKwkgKiBpcyBlbnNsYXZlZCBhbmQgYWRkcmVzcyBpcyBub3QgbGluayBsb2NhbCBvciBtdWx0aWNhc3QKKwkgKi8KKwlpZiAoIXJ0Nl9uZWVkX3N0cmljdChhZGRyKSkKKwkJZGV2ID0gbDNtZGV2X21hc3Rlcl9kZXZfcmN1KGlkZXYtPmRldikgPyA6IGRldjsKKworCXJ0ID0gaXA2X2RzdF9hbGxvYyhuZXQsIGRldiwgRFNUX05PQ09VTlQpOwogCWlmICghcnQpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCkBAIC0zMTkzLDcgKzMyMTYsOSBAQAogCWlmIChpaWYpIHsKICNpZmRlZiBDT05GSUdfSVBWNl9NUk9VVEUKIAkJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJnJ0LT5ydDZpX2RzdC5hZGRyKSkgewotCQkJaW50IGVyciA9IGlwNm1yX2dldF9yb3V0ZShuZXQsIHNrYiwgcnRtLCBub3dhaXQpOworCQkJaW50IGVyciA9IGlwNm1yX2dldF9yb3V0ZShuZXQsIHNrYiwgcnRtLCBub3dhaXQsCisJCQkJCQkgIHBvcnRpZCk7CisKIAkJCWlmIChlcnIgPD0gMCkgewogCQkJCWlmICghbm93YWl0KSB7CiAJCQkJCWlmIChlcnIgPT0gMCkKQEAgLTMzMzYsMTEgKzMzNjEsNiBAQAogCX0gZWxzZSB7CiAJCWZsNi5mbG93aTZfb2lmID0gb2lmOwogCi0JCWlmIChuZXRpZl9pbmRleF9pc19sM19tYXN0ZXIobmV0LCBvaWYpKSB7Ci0JCQlmbDYuZmxvd2k2X2ZsYWdzID0gRkxPV0lfRkxBR19MM01ERVZfU1JDIHwKLQkJCQkJICAgRkxPV0lfRkxBR19TS0lQX05IX09JRjsKLQkJfQotCiAJCXJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKWlwNl9yb3V0ZV9vdXRwdXQobmV0LCBOVUxMLCAmZmw2KTsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3NpdC5jIGIvbmV0L2lwdjYvc2l0LmMKaW5kZXggMTgyYjZhOS4uYjFjZGY4MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvc2l0LmMKKysrIGIvbmV0L2lwdjYvc2l0LmMKQEAgLTYyLDcgKzYyLDcgQEAKICAgIEZvciBjb21tZW50cyBsb29rIGF0IG5ldC9pcHY0L2lwX2dyZS5jIC0tQU5LCiAgKi8KIAotI2RlZmluZSBIQVNIX1NJWkUgIDE2CisjZGVmaW5lIElQNl9TSVRfSEFTSF9TSVpFICAxNgogI2RlZmluZSBIQVNIKGFkZHIpICgoKF9fZm9yY2UgdTMyKWFkZHJeKChfX2ZvcmNlIHUzMilhZGRyPj40KSkmMHhGKQogCiBzdGF0aWMgYm9vbCBsb2dfZWNuX2Vycm9yID0gdHJ1ZTsKQEAgLTc4LDkgKzc4LDkgQEAKIAogc3RhdGljIGludCBzaXRfbmV0X2lkIF9fcmVhZF9tb3N0bHk7CiBzdHJ1Y3Qgc2l0X25ldCB7Ci0Jc3RydWN0IGlwX3R1bm5lbCBfX3JjdSAqdHVubmVsc19yX2xbSEFTSF9TSVpFXTsKLQlzdHJ1Y3QgaXBfdHVubmVsIF9fcmN1ICp0dW5uZWxzX3JbSEFTSF9TSVpFXTsKLQlzdHJ1Y3QgaXBfdHVubmVsIF9fcmN1ICp0dW5uZWxzX2xbSEFTSF9TSVpFXTsKKwlzdHJ1Y3QgaXBfdHVubmVsIF9fcmN1ICp0dW5uZWxzX3JfbFtJUDZfU0lUX0hBU0hfU0laRV07CisJc3RydWN0IGlwX3R1bm5lbCBfX3JjdSAqdHVubmVsc19yW0lQNl9TSVRfSEFTSF9TSVpFXTsKKwlzdHJ1Y3QgaXBfdHVubmVsIF9fcmN1ICp0dW5uZWxzX2xbSVA2X1NJVF9IQVNIX1NJWkVdOwogCXN0cnVjdCBpcF90dW5uZWwgX19yY3UgKnR1bm5lbHNfd2NbMV07CiAJc3RydWN0IGlwX3R1bm5lbCBfX3JjdSAqKnR1bm5lbHNbNF07CiAKQEAgLTExMjYsNyArMTEyNiw3IEBACiB9CiAjZW5kaWYKIAotYm9vbCBpcGlwNl92YWxpZF9pcF9wcm90byh1OCBpcHByb3RvKQorc3RhdGljIGJvb2wgaXBpcDZfdmFsaWRfaXBfcHJvdG8odTggaXBwcm90bykKIHsKIAlyZXR1cm4gaXBwcm90byA9PSBJUFBST1RPX0lQVjYgfHwKIAkJaXBwcm90byA9PSBJUFBST1RPX0lQSVAgfHwKQEAgLTE3ODMsNyArMTc4Myw3IEBACiAKIAlmb3IgKHByaW8gPSAxOyBwcmlvIDwgNDsgcHJpbysrKSB7CiAJCWludCBoOwotCQlmb3IgKGggPSAwOyBoIDwgSEFTSF9TSVpFOyBoKyspIHsKKwkJZm9yIChoID0gMDsgaCA8IElQNl9TSVRfSEFTSF9TSVpFOyBoKyspIHsKIAkJCXN0cnVjdCBpcF90dW5uZWwgKnQ7CiAKIAkJCXQgPSBydG5sX2RlcmVmZXJlbmNlKHNpdG4tPnR1bm5lbHNbcHJpb11baF0pOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwX2lwdjYuYyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKaW5kZXggMzNkZjhiOC4uNTRjZjcxOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdGNwX2lwdjYuYworKysgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCkBAIC02NzEsNiArNjcxLDcgQEAKIAkJCQkgICAgICBOVUxMLCBza2IpOwogCiAJaWYgKGdlbmhhc2ggfHwgbWVtY21wKGhhc2hfbG9jYXRpb24sIG5ld2hhc2gsIDE2KSAhPSAwKSB7CisJCU5FVF9JTkNfU1RBVFMoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfVENQTUQ1RkFJTFVSRSk7CiAJCW5ldF9pbmZvX3JhdGVsaW1pdGVkKCJNRDUgSGFzaCAlcyBmb3IgWyVwSTZjXToldS0+WyVwSTZjXToldVxuIiwKIAkJCQkgICAgIGdlbmhhc2ggPyAiZmFpbGVkIiA6ICJtaXNtYXRjaCIsCiAJCQkJICAgICAmaXA2aC0+c2FkZHIsIG50b2hzKHRoLT5zb3VyY2UpLApAQCAtODE3LDEyICs4MTgsOCBAQAogCWZsNi5mbG93aTZfcHJvdG8gPSBJUFBST1RPX1RDUDsKIAlpZiAocnQ2X25lZWRfc3RyaWN0KCZmbDYuZGFkZHIpICYmICFvaWYpCiAJCWZsNi5mbG93aTZfb2lmID0gdGNwX3Y2X2lpZihza2IpOwotCWVsc2UgewotCQlpZiAoIW9pZiAmJiBuZXRpZl9pbmRleF9pc19sM19tYXN0ZXIobmV0LCBza2ItPnNrYl9paWYpKQotCQkJb2lmID0gc2tiLT5za2JfaWlmOwotCi0JCWZsNi5mbG93aTZfb2lmID0gb2lmOwotCX0KKwllbHNlCisJCWZsNi5mbG93aTZfb2lmID0gb2lmID8gOiBza2ItPnNrYl9paWY7CiAKIAlmbDYuZmxvd2k2X21hcmsgPSBJUDZfUkVQTFlfTUFSSyhuZXQsIHNrYi0+bWFyayk7CiAJZmw2LmZsNl9kcG9ydCA9IHQxLT5kZXN0OwpAQCAtOTQ0LDkgKzk0MSwxNSBAQAogCS8qIHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOIC0+IGZvciByZWd1bGFyIFRDUF9TWU5fUkVDVgogCSAqIHNrLT5za19zdGF0ZSA9PSBUQ1BfU1lOX1JFQ1YgLT4gZm9yIEZhc3QgT3Blbi4KIAkgKi8KKwkvKiBSRkMgNzMyMyAyLjMKKwkgKiBUaGUgd2luZG93IGZpZWxkIChTRUcuV05EKSBvZiBldmVyeSBvdXRnb2luZyBzZWdtZW50LCB3aXRoIHRoZQorCSAqIGV4Y2VwdGlvbiBvZiA8U1lOPiBzZWdtZW50cywgTVVTVCBiZSByaWdodC1zaGlmdGVkIGJ5CisJICogUmN2LldpbmQuU2hpZnQgYml0czoKKwkgKi8KIAl0Y3BfdjZfc2VuZF9hY2soc2ssIHNrYiwgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKSA/CiAJCQl0Y3BfcnNrKHJlcSktPnNudF9pc24gKyAxIDogdGNwX3NrKHNrKS0+c25kX254dCwKLQkJCXRjcF9yc2socmVxKS0+cmN2X254dCwgcmVxLT5yc2tfcmN2X3duZCwKKwkJCXRjcF9yc2socmVxKS0+cmN2X254dCwKKwkJCXJlcS0+cnNrX3Jjdl93bmQgPj4gaW5ldF9yc2socmVxKS0+cmN2X3dzY2FsZSwKIAkJCXRjcF90aW1lX3N0YW1wLCByZXEtPnRzX3JlY2VudCwgc2stPnNrX2JvdW5kX2Rldl9pZiwKIAkJCXRjcF92Nl9tZDVfZG9fbG9va3VwKHNrLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpLAogCQkJMCwgMCk7CkBAIC0xNDA5LDYgKzE0MTIsNyBAQAogCQlzayA9IHJlcS0+cnNrX2xpc3RlbmVyOwogCQl0Y3BfdjZfZmlsbF9jYihza2IsIGhkciwgdGgpOwogCQlpZiAodGNwX3Y2X2luYm91bmRfbWQ1X2hhc2goc2ssIHNrYikpIHsKKwkJCXNrX2Ryb3BzX2FkZChzaywgc2tiKTsKIAkJCXJlcXNrX3B1dChyZXEpOwogCQkJZ290byBkaXNjYXJkX2l0OwogCQl9CkBAIC0xNDY1LDEwICsxNDY5LDcgQEAKIAlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKIAkJaWYgKCF0Y3BfcHJlcXVldWUoc2ssIHNrYikpCiAJCQlyZXQgPSB0Y3BfdjZfZG9fcmN2KHNrLCBza2IpOwotCX0gZWxzZSBpZiAodW5saWtlbHkoc2tfYWRkX2JhY2tsb2coc2ssIHNrYiwKLQkJCQkJICAgc2stPnNrX3JjdmJ1ZiArIHNrLT5za19zbmRidWYpKSkgewotCQliaF91bmxvY2tfc29jayhzayk7Ci0JCV9fTkVUX0lOQ19TVEFUUyhuZXQsIExJTlVYX01JQl9UQ1BCQUNLTE9HRFJPUCk7CisJfSBlbHNlIGlmICh0Y3BfYWRkX2JhY2tsb2coc2ssIHNrYikpIHsKIAkJZ290byBkaXNjYXJkX2FuZF9yZWxzZTsKIAl9CiAJYmhfdW5sb2NrX3NvY2soc2spOwpAQCAtMTg2MiwxNyArMTg2Myw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgdGNwX3Y2X2NsZWFyX3NrKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUpCi17Ci0Jc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwotCi0JLyogd2UgZG8gbm90IHdhbnQgdG8gY2xlYXIgcGluZXQ2IGZpZWxkLCBiZWNhdXNlIG9mIFJDVSBsb29rdXBzICovCi0Jc2tfcHJvdF9jbGVhcl9udWxscyhzaywgb2Zmc2V0b2Yoc3RydWN0IGluZXRfc29jaywgcGluZXQ2KSk7Ci0KLQlzaXplIC09IG9mZnNldG9mKHN0cnVjdCBpbmV0X3NvY2ssIHBpbmV0NikgKyBzaXplb2YoaW5ldC0+cGluZXQ2KTsKLQltZW1zZXQoJmluZXQtPnBpbmV0NiArIDEsIDAsIHNpemUpOwotfQotCiBzdHJ1Y3QgcHJvdG8gdGNwdjZfcHJvdCA9IHsKIAkubmFtZQkJCT0gIlRDUHY2IiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLApAQCAtMTkxNCw3ICsxOTA0LDYgQEAKIAkuY29tcGF0X3NldHNvY2tvcHQJPSBjb21wYXRfdGNwX3NldHNvY2tvcHQsCiAJLmNvbXBhdF9nZXRzb2Nrb3B0CT0gY29tcGF0X3RjcF9nZXRzb2Nrb3B0LAogI2VuZGlmCi0JLmNsZWFyX3NrCQk9IHRjcF92Nl9jbGVhcl9zaywKIAkuZGlhZ19kZXN0cm95CQk9IHRjcF9hYm9ydCwKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKaW5kZXggODFlMmY5OC4uOWFhN2MxYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwLmMKKysrIGIvbmV0L2lwdjYvdWRwLmMKQEAgLTE0MjQsMTcgKzE0MjQsNiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAKLXZvaWQgdWRwX3Y2X2NsZWFyX3NrKHN0cnVjdCBzb2NrICpzaywgaW50IHNpemUpCi17Ci0Jc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwotCi0JLyogd2UgZG8gbm90IHdhbnQgdG8gY2xlYXIgcGluZXQ2IGZpZWxkLCBiZWNhdXNlIG9mIFJDVSBsb29rdXBzICovCi0Jc2tfcHJvdF9jbGVhcl9wb3J0YWRkcl9udWxscyhzaywgb2Zmc2V0b2Yoc3RydWN0IGluZXRfc29jaywgcGluZXQ2KSk7Ci0KLQlzaXplIC09IG9mZnNldG9mKHN0cnVjdCBpbmV0X3NvY2ssIHBpbmV0NikgKyBzaXplb2YoaW5ldC0+cGluZXQ2KTsKLQltZW1zZXQoJmluZXQtPnBpbmV0NiArIDEsIDAsIHNpemUpOwotfQotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RydWN0IHByb3RvIHVkcHY2X3Byb3QgPSB7CkBAIC0xNDYwLDEzICsxNDQ5LDEyIEBACiAJLnN5c2N0bF93bWVtCSAgID0gJnN5c2N0bF91ZHBfd21lbV9taW4sCiAJLnN5c2N0bF9ybWVtCSAgID0gJnN5c2N0bF91ZHBfcm1lbV9taW4sCiAJLm9ial9zaXplCSAgID0gc2l6ZW9mKHN0cnVjdCB1ZHA2X3NvY2spLAotCS5zbGFiX2ZsYWdzCSAgID0gU0xBQl9ERVNUUk9ZX0JZX1JDVSwKIAkuaC51ZHBfdGFibGUJICAgPSAmdWRwX3RhYmxlLAogI2lmZGVmIENPTkZJR19DT01QQVQKIAkuY29tcGF0X3NldHNvY2tvcHQgPSBjb21wYXRfdWRwdjZfc2V0c29ja29wdCwKIAkuY29tcGF0X2dldHNvY2tvcHQgPSBjb21wYXRfdWRwdjZfZ2V0c29ja29wdCwKICNlbmRpZgotCS5jbGVhcl9zawkgICA9IHVkcF92Nl9jbGVhcl9zaywKKwkuZGlhZ19kZXN0cm95ICAgICAgPSB1ZHBfYWJvcnQsCiB9OwogCiBzdGF0aWMgc3RydWN0IGluZXRfcHJvdG9zdyB1ZHB2Nl9wcm90b3N3ID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwX2ltcGwuaCBiL25ldC9pcHY2L3VkcF9pbXBsLmgKaW5kZXggMDY4MmMwMy4uZjZlYjFhYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwX2ltcGwuaAorKysgYi9uZXQvaXB2Ni91ZHBfaW1wbC5oCkBAIC0yOSw4ICsyOSw2IEBACiBpbnQgdWRwdjZfcXVldWVfcmN2X3NrYihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCB1ZHB2Nl9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKTsKIAotdm9pZCB1ZHBfdjZfY2xlYXJfc2soc3RydWN0IHNvY2sgKnNrLCBpbnQgc2l6ZSk7Ci0KICNpZmRlZiBDT05GSUdfUFJPQ19GUwogaW50IHVkcDZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHBsaXRlLmMgYi9uZXQvaXB2Ni91ZHBsaXRlLmMKaW5kZXggOWNmMDk3ZS4uNDdkMGQyYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwbGl0ZS5jCisrKyBiL25ldC9pcHY2L3VkcGxpdGUuYwpAQCAtNTAsMTMgKzUwLDExIEBACiAJLnVuaGFzaAkJICAgPSB1ZHBfbGliX3VuaGFzaCwKIAkuZ2V0X3BvcnQJICAgPSB1ZHBfdjZfZ2V0X3BvcnQsCiAJLm9ial9zaXplCSAgID0gc2l6ZW9mKHN0cnVjdCB1ZHA2X3NvY2spLAotCS5zbGFiX2ZsYWdzCSAgID0gU0xBQl9ERVNUUk9ZX0JZX1JDVSwKIAkuaC51ZHBfdGFibGUJICAgPSAmdWRwbGl0ZV90YWJsZSwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9zZXRzb2Nrb3B0ID0gY29tcGF0X3VkcHY2X3NldHNvY2tvcHQsCiAJLmNvbXBhdF9nZXRzb2Nrb3B0ID0gY29tcGF0X3VkcHY2X2dldHNvY2tvcHQsCiAjZW5kaWYKLQkuY2xlYXJfc2sJICAgPSB1ZHBfdjZfY2xlYXJfc2ssCiB9OwogCiBzdGF0aWMgc3RydWN0IGluZXRfcHJvdG9zdyB1ZHBsaXRlNl9wcm90b3N3ID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfaW5wdXQuYyBiL25ldC9pcHY2L3hmcm02X2lucHV0LmMKaW5kZXggMGVhYWIxZi4uYjU3ODk1NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfaW5wdXQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9pbnB1dC5jCkBAIC0yMSw4ICsyMSwxMCBAQAogCXJldHVybiB4ZnJtNl9leHRyYWN0X2hlYWRlcihza2IpOwogfQogCi1pbnQgeGZybTZfcmN2X3NwaShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmV4dGhkciwgX19iZTMyIHNwaSkKK2ludCB4ZnJtNl9yY3Zfc3BpKHN0cnVjdCBza19idWZmICpza2IsIGludCBuZXh0aGRyLCBfX2JlMzIgc3BpLAorCQkgIHN0cnVjdCBpcDZfdG5sICp0KQogeworCVhGUk1fVFVOTkVMX1NLQl9DQihza2IpLT50dW5uZWwuaXA2ID0gdDsKIAlYRlJNX1NQSV9TS0JfQ0Ioc2tiKS0+ZmFtaWx5ID0gQUZfSU5FVDY7CiAJWEZSTV9TUElfU0tCX0NCKHNrYiktPmRhZGRyb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIGRhZGRyKTsKIAlyZXR1cm4geGZybV9pbnB1dChza2IsIG5leHRoZHIsIHNwaSwgMCk7CkBAIC00OCwxMyArNTAsMTggQEAKIAlyZXR1cm4gLTE7CiB9CiAKLWludCB4ZnJtNl9yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCB4ZnJtNl9yY3ZfdG5sKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcDZfdG5sICp0KQogewogCXJldHVybiB4ZnJtNl9yY3Zfc3BpKHNrYiwgc2tiX25ldHdvcmtfaGVhZGVyKHNrYilbSVA2Q0Ioc2tiKS0+bmhvZmZdLAotCQkJICAgICAwKTsKKwkJCSAgICAgMCwgdCk7Cit9CitFWFBPUlRfU1lNQk9MKHhmcm02X3Jjdl90bmwpOworCitpbnQgeGZybTZfcmN2KHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHhmcm02X3Jjdl90bmwoc2tiLCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0woeGZybTZfcmN2KTsKLQogaW50IHhmcm02X2lucHV0X2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgeGZybV9hZGRyZXNzX3QgKmRhZGRyLAogCQkgICAgIHhmcm1fYWRkcmVzc190ICpzYWRkciwgdTggcHJvdG8pCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYyBiL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCmluZGV4IDZjYzk3MDAuLmUwZjcxYzAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCisrKyBiL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCkBAIC0zNiw3ICszNiw3IEBACiAJaW50IGVycjsKIAogCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7Ci0JZmw2LmZsb3dpNl9vaWYgPSBvaWY7CisJZmw2LmZsb3dpNl9vaWYgPSBsM21kZXZfbWFzdGVyX2lmaW5kZXhfYnlfaW5kZXgobmV0LCBvaWYpOwogCWZsNi5mbG93aTZfZmxhZ3MgPSBGTE9XSV9GTEFHX1NLSVBfTkhfT0lGOwogCW1lbWNweSgmZmw2LmRhZGRyLCBkYWRkciwgc2l6ZW9mKGZsNi5kYWRkcikpOwogCWlmIChzYWRkcikKQEAgLTEzNCw3ICsxMzQsNyBAQAogCW5leHRoZHIgPSBuaFtuaG9mZl07CiAKIAlpZiAoc2tiX2RzdChza2IpKQotCQlvaWYgPSBsM21kZXZfZmliX29pZihza2JfZHN0KHNrYiktPmRldik7CisJCW9pZiA9IHNrYl9kc3Qoc2tiKS0+ZGV2LT5pZmluZGV4OwogCiAJbWVtc2V0KGZsNiwgMCwgc2l6ZW9mKHN0cnVjdCBmbG93aTYpKTsKIAlmbDYtPmZsb3dpNl9tYXJrID0gc2tiLT5tYXJrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfdHVubmVsLmMgYi9uZXQvaXB2Ni94ZnJtNl90dW5uZWwuYwppbmRleCA1NzQzMDQ0Li5lMWMwYmJlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl90dW5uZWwuYworKysgYi9uZXQvaXB2Ni94ZnJtNl90dW5uZWwuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJX19iZTMyIHNwaTsKIAogCXNwaSA9IHhmcm02X3R1bm5lbF9zcGlfbG9va3VwKG5ldCwgKGNvbnN0IHhmcm1fYWRkcmVzc190ICopJmlwaC0+c2FkZHIpOwotCXJldHVybiB4ZnJtNl9yY3Zfc3BpKHNrYiwgSVBQUk9UT19JUFY2LCBzcGkpOworCXJldHVybiB4ZnJtNl9yY3Zfc3BpKHNrYiwgSVBQUk9UT19JUFY2LCBzcGksIE5VTEwpOwogfQogCiBzdGF0aWMgaW50IHhmcm02X3R1bm5lbF9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXQ2X3NrYl9wYXJtICpvcHQsCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9hZl9pcmRhLmMgYi9uZXQvaXJkYS9hZl9pcmRhLmMKaW5kZXggOGQyZjdjOS4uMzkxYzNjYiAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvYWZfaXJkYS5jCisrKyBiL25ldC9pcmRhL2FmX2lyZGEuYwpAQCAtODMyLDcgKzgzMiw3IEBACiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGlyZGFfc29jayAqbmV3LCAqc2VsZiA9IGlyZGFfc2soc2spOwogCXN0cnVjdCBzb2NrICpuZXdzazsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwogCWludCBlcnI7CiAKIAllcnIgPSBpcmRhX2NyZWF0ZShzb2NrX25ldChzayksIG5ld3NvY2ssIHNrLT5za19wcm90b2NvbCwgMCk7CkBAIC04NDUsOSArODQ1LDYgQEAKIAlpZiAoc29jay0+c3RhdGUgIT0gU1NfVU5DT05ORUNURUQpCiAJCWdvdG8gb3V0OwogCi0JaWYgKChzayA9IHNvY2stPnNrKSA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQogCWVyciA9IC1FT1BOT1RTVVBQOwogCWlmICgoc2stPnNrX3R5cGUgIT0gU09DS19TVFJFQU0pICYmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NFUVBBQ0tFVCkgJiYKIAkgICAgKHNrLT5za190eXBlICE9IFNPQ0tfREdSQU0pKQpAQCAtOTAwLDcgKzg5Nyw2IEBACiAJZXJyID0gLUVQRVJNOyAvKiB2YWx1ZSBkb2VzIG5vdCBzZWVtIHRvIG1ha2Ugc2Vuc2UuIC1hcm5kICovCiAJaWYgKCFuZXctPnRzYXApIHsKIAkJcHJfZGVidWcoIiVzKCksIGR1cCBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7Ci0JCWtmcmVlX3NrYihza2IpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTkxOSw3ICs5MTUsNiBAQAogCS8qIENsZWFuIHVwIHRoZSBvcmlnaW5hbCBvbmUgdG8ga2VlcCBpdCBpbiBsaXN0ZW4gc3RhdGUgKi8KIAlpcnR0cF9saXN0ZW4oc2VsZi0+dHNhcCk7CiAKLQlrZnJlZV9za2Ioc2tiKTsKIAlzay0+c2tfYWNrX2JhY2tsb2ctLTsKIAogCW5ld3NvY2stPnN0YXRlID0gU1NfQ09OTkVDVEVEOwpAQCAtOTI3LDYgKzkyMiw3IEBACiAJaXJkYV9jb25uZWN0X3Jlc3BvbnNlKG5ldyk7CiAJZXJyID0gMDsKIG91dDoKKwlrZnJlZV9za2Ioc2tiKTsKIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9uZXQva2NtL0tjb25maWcgYi9uZXQva2NtL0tjb25maWcKaW5kZXggNWRiOTRkOS4uODdmY2EzNiAxMDA2NDQKLS0tIGEvbmV0L2tjbS9LY29uZmlnCisrKyBiL25ldC9rY20vS2NvbmZpZwpAQCAtMyw2ICszLDcgQEAKIAl0cmlzdGF0ZSAiS0NNIHNvY2tldHMiCiAJZGVwZW5kcyBvbiBJTkVUCiAJc2VsZWN0IEJQRl9TWVNDQUxMCisJc2VsZWN0IFNUUkVBTV9QQVJTRVIKIAktLS1oZWxwLS0tCiAJICBLQ00gKEtlcm5lbCBDb25uZWN0aW9uIE11bHRpcGxleG9yKSBzb2NrZXRzIHByb3ZpZGUgYSBtZXRob2QKIAkgIGZvciBtdWx0aXBsZXhpbmcgbWVzc2FnZXMgb2YgYSBtZXNzYWdlIGJhc2VkIGFwcGxpY2F0aW9uCmRpZmYgLS1naXQgYS9uZXQva2NtL2tjbXByb2MuYyBiL25ldC9rY20va2NtcHJvYy5jCmluZGV4IDE2YzJlMDMuLmJmNzVjOTIgMTAwNjQ0Ci0tLSBhL25ldC9rY20va2NtcHJvYy5jCisrKyBiL25ldC9rY20va2NtcHJvYy5jCkBAIC0xNTUsOCArMTU1LDggQEAKIAlzZXFfcHJpbnRmKHNlcSwKIAkJICAgIiAgIHBzb2NrLSUtNXUgJS0xMGxsdSAlLTE2bGx1ICUtMTBsbHUgJS0xNmxsdSAlLThkICUtOGQgJS04ZCAlLThkICIsCiAJCSAgIHBzb2NrLT5pbmRleCwKLQkJICAgcHNvY2stPnN0YXRzLnJ4X21zZ3MsCi0JCSAgIHBzb2NrLT5zdGF0cy5yeF9ieXRlcywKKwkJICAgcHNvY2stPnN0cnAuc3RhdHMucnhfbXNncywKKwkJICAgcHNvY2stPnN0cnAuc3RhdHMucnhfYnl0ZXMsCiAJCSAgIHBzb2NrLT5zdGF0cy50eF9tc2dzLAogCQkgICBwc29jay0+c3RhdHMudHhfYnl0ZXMsCiAJCSAgIHBzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZS5xbGVuLApAQCAtMTcwLDE0ICsxNzAsMjcgQEAKIAlpZiAocHNvY2stPnR4X3N0b3BwZWQpCiAJCXNlcV9wdXRzKHNlcSwgIlR4U3RvcCAiKTsKIAotCWlmIChwc29jay0+cnhfc3RvcHBlZCkKKwlpZiAocHNvY2stPnN0cnAucnhfc3RvcHBlZCkKIAkJc2VxX3B1dHMoc2VxLCAiUnhTdG9wICIpOwogCiAJaWYgKHBzb2NrLT50eF9rY20pCiAJCXNlcV9wcmludGYoc2VxLCAiUnN2ZC0lZCAiLCBwc29jay0+dHhfa2NtLT5pbmRleCk7CiAKLQlpZiAocHNvY2stPnJlYWR5X3J4X21zZykKLQkJc2VxX3B1dHMoc2VxLCAiUmR5UnggIik7CisJaWYgKCFwc29jay0+c3RycC5yeF9wYXVzZWQgJiYgIXBzb2NrLT5yZWFkeV9yeF9tc2cpIHsKKwkJaWYgKHBzb2NrLT5zay0+c2tfcmVjZWl2ZV9xdWV1ZS5xbGVuKSB7CisJCQlpZiAocHNvY2stPnN0cnAucnhfbmVlZF9ieXRlcykKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIlJ4V2FpdD0ldSAiLAorCQkJCQkgICBwc29jay0+c3RycC5yeF9uZWVkX2J5dGVzKTsKKwkJCWVsc2UKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIlJ4V2FpdCAiKTsKKwkJfQorCX0gZWxzZSAgeworCQlpZiAocHNvY2stPnN0cnAucnhfcGF1c2VkKQorCQkJc2VxX3B1dHMoc2VxLCAiUnhQYXVzZSAiKTsKKworCQlpZiAocHNvY2stPnJlYWR5X3J4X21zZykKKwkJCXNlcV9wdXRzKHNlcSwgIlJkeVJ4ICIpOworCX0KIAogCXNlcV9wdXRzKHNlcSwgIlxuIik7CiB9CkBAIC0yNzUsNiArMjg4LDcgQEAKIHsKIAlzdHJ1Y3Qga2NtX3Bzb2NrX3N0YXRzIHBzb2NrX3N0YXRzOwogCXN0cnVjdCBrY21fbXV4X3N0YXRzIG11eF9zdGF0czsKKwlzdHJ1Y3Qgc3RycF9hZ2dyX3N0YXRzIHN0cnBfc3RhdHM7CiAJc3RydWN0IGtjbV9tdXggKm11eDsKIAlzdHJ1Y3Qga2NtX3Bzb2NrICpwc29jazsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXEtPnByaXZhdGU7CkBAIC0yODIsMjAgKzI5NiwyOCBAQAogCiAJbWVtc2V0KCZtdXhfc3RhdHMsIDAsIHNpemVvZihtdXhfc3RhdHMpKTsKIAltZW1zZXQoJnBzb2NrX3N0YXRzLCAwLCBzaXplb2YocHNvY2tfc3RhdHMpKTsKKwltZW1zZXQoJnN0cnBfc3RhdHMsIDAsIHNpemVvZihzdHJwX3N0YXRzKSk7CiAKIAltdXRleF9sb2NrKCZrbmV0LT5tdXRleCk7CiAKIAlhZ2dyZWdhdGVfbXV4X3N0YXRzKCZrbmV0LT5hZ2dyZWdhdGVfbXV4X3N0YXRzLCAmbXV4X3N0YXRzKTsKIAlhZ2dyZWdhdGVfcHNvY2tfc3RhdHMoJmtuZXQtPmFnZ3JlZ2F0ZV9wc29ja19zdGF0cywKIAkJCSAgICAgICZwc29ja19zdGF0cyk7CisJYWdncmVnYXRlX3N0cnBfc3RhdHMoJmtuZXQtPmFnZ3JlZ2F0ZV9zdHJwX3N0YXRzLAorCQkJICAgICAmc3RycF9zdGF0cyk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShtdXgsICZrbmV0LT5tdXhfbGlzdCwga2NtX211eF9saXN0KSB7CiAJCXNwaW5fbG9ja19iaCgmbXV4LT5sb2NrKTsKIAkJYWdncmVnYXRlX211eF9zdGF0cygmbXV4LT5zdGF0cywgJm11eF9zdGF0cyk7CiAJCWFnZ3JlZ2F0ZV9wc29ja19zdGF0cygmbXV4LT5hZ2dyZWdhdGVfcHNvY2tfc3RhdHMsCiAJCQkJICAgICAgJnBzb2NrX3N0YXRzKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwc29jaywgJm11eC0+cHNvY2tzLCBwc29ja19saXN0KQorCQlhZ2dyZWdhdGVfc3RycF9zdGF0cygmbXV4LT5hZ2dyZWdhdGVfc3RycF9zdGF0cywKKwkJCQkgICAgICZzdHJwX3N0YXRzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShwc29jaywgJm11eC0+cHNvY2tzLCBwc29ja19saXN0KSB7CiAJCQlhZ2dyZWdhdGVfcHNvY2tfc3RhdHMoJnBzb2NrLT5zdGF0cywgJnBzb2NrX3N0YXRzKTsKKwkJCXNhdmVfc3RycF9zdGF0cygmcHNvY2stPnN0cnAsICZzdHJwX3N0YXRzKTsKKwkJfQorCiAJCXNwaW5fdW5sb2NrX2JoKCZtdXgtPmxvY2spOwogCX0KIApAQCAtMzI4LDcgKzM1MCw3IEBACiAJCSAgIG11eF9zdGF0cy5yeF9yZWFkeV9kcm9wcyk7CiAKIAlzZXFfcHJpbnRmKHNlcSwKLQkJICAgIiUtOHMgJS0xMHMgJS0xNnMgJS0xMHMgJS0xNnMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCisJCSAgICIlLThzICUtMTBzICUtMTZzICUtMTBzICUtMTZzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAogCQkgICAiUHNvY2siLAogCQkgICAiUlgtTXNncyIsCiAJCSAgICJSWC1CeXRlcyIsCkBAIC0zMzcsNiArMzU5LDggQEAKIAkJICAgIlJlc2VydmVkIiwKIAkJICAgIlVucmVzZXJ2ZWQiLAogCQkgICAiUlgtQWJvcnRzIiwKKwkJICAgIlJYLUludHIiLAorCQkgICAiUlgtVW5yZWNvdiIsCiAJCSAgICJSWC1NZW1GYWlsIiwKIAkJICAgIlJYLU5lZWRNb3IiLAogCQkgICAiUlgtQmFkTGVuIiwKQEAgLTM0NSwyMCArMzY5LDIyIEBACiAJCSAgICJUWC1BYm9ydHMiKTsKIAogCXNlcV9wcmludGYoc2VxLAotCQkgICAiJS04cyAlLTEwbGx1ICUtMTZsbHUgJS0xMGxsdSAlLTE2bGx1ICUtMTBsbHUgJS0xMGxsdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdSAlLTEwdVxuIiwKKwkJICAgIiUtOHMgJS0xMGxsdSAlLTE2bGx1ICUtMTBsbHUgJS0xNmxsdSAlLTEwbGx1ICUtMTBsbHUgJS0xMHUgJS0xMHUgJS0xMHUgJS0xMHUgJS0xMHUgJS0xMHUgJS0xMHUgJS0xMHUgJS0xMHVcbiIsCiAJCSAgICIiLAotCQkgICBwc29ja19zdGF0cy5yeF9tc2dzLAotCQkgICBwc29ja19zdGF0cy5yeF9ieXRlcywKKwkJICAgc3RycF9zdGF0cy5yeF9tc2dzLAorCQkgICBzdHJwX3N0YXRzLnJ4X2J5dGVzLAogCQkgICBwc29ja19zdGF0cy50eF9tc2dzLAogCQkgICBwc29ja19zdGF0cy50eF9ieXRlcywKIAkJICAgcHNvY2tfc3RhdHMucmVzZXJ2ZWQsCiAJCSAgIHBzb2NrX3N0YXRzLnVucmVzZXJ2ZWQsCi0JCSAgIHBzb2NrX3N0YXRzLnJ4X2Fib3J0cywKLQkJICAgcHNvY2tfc3RhdHMucnhfbWVtX2ZhaWwsCi0JCSAgIHBzb2NrX3N0YXRzLnJ4X25lZWRfbW9yZV9oZHIsCi0JCSAgIHBzb2NrX3N0YXRzLnJ4X2JhZF9oZHJfbGVuLAotCQkgICBwc29ja19zdGF0cy5yeF9tc2dfdG9vX2JpZywKLQkJICAgcHNvY2tfc3RhdHMucnhfbXNnX3RpbWVvdXRzLAorCQkgICBzdHJwX3N0YXRzLnJ4X2Fib3J0cywKKwkJICAgc3RycF9zdGF0cy5yeF9pbnRlcnJ1cHRlZCwKKwkJICAgc3RycF9zdGF0cy5yeF91bnJlY292X2ludHIsCisJCSAgIHN0cnBfc3RhdHMucnhfbWVtX2ZhaWwsCisJCSAgIHN0cnBfc3RhdHMucnhfbmVlZF9tb3JlX2hkciwKKwkJICAgc3RycF9zdGF0cy5yeF9iYWRfaGRyX2xlbiwKKwkJICAgc3RycF9zdGF0cy5yeF9tc2dfdG9vX2JpZywKKwkJICAgc3RycF9zdGF0cy5yeF9tc2dfdGltZW91dHMsCiAJCSAgIHBzb2NrX3N0YXRzLnR4X2Fib3J0cyk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9rY20va2Ntc29jay5jIGIvbmV0L2tjbS9rY21zb2NrLmMKaW5kZXggY2IzOWUwNS4uN2UwOGE0ZCAxMDA2NDQKLS0tIGEvbmV0L2tjbS9rY21zb2NrLmMKKysrIGIvbmV0L2tjbS9rY21zb2NrLmMKQEAgLTEsMyArMSwxMyBAQAorLyoKKyAqIEtlcm5lbCBDb25uZWN0aW9uIE11bHRpcGxleG9yCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFRvbSBIZXJiZXJ0IDx0b21AaGVyYmVydGxhbmQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKwogI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+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+ZnVsbF9sZW47CkBAIC0xNDYxLDE5ICsxMTYwLDYgQEAKIAlyZXR1cm4gY29waWVkID8gOiBlcnI7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGtjbV9zb2NrX3NwbGljZShzdHJ1Y3Qgc29jayAqc2ssCi0JCQkgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKLQkJCSAgICAgICBzdHJ1Y3Qgc3BsaWNlX3BpcGVfZGVzYyAqc3BkKQotewotCWludCByZXQ7Ci0KLQlyZWxlYXNlX3NvY2soc2spOwotCXJldCA9IHNwbGljZV90b19waXBlKHBpcGUsIHNwZCk7Ci0JbG9ja19zb2NrKHNrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IGtjbV9zcGxpY2VfcmVhZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBsb2ZmX3QgKnBwb3MsCiAJCQkgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwKIAkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCkBAIC0xNDgxLDcgKzExNjcsNyBAQAogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBrY21fc29jayAqa2NtID0ga2NtX3NrKHNrKTsKIAlsb25nIHRpbWVvOwotCXN0cnVjdCBrY21fcnhfbXNnICpyeG07CisJc3RydWN0IHN0cnBfcnhfbXNnICpyeG07CiAJaW50IGVyciA9IDA7CiAJc3NpemVfdCBjb3BpZWQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTE0OTgsMTMgKzExODQsMTIgQEAKIAogCS8qIE9rYXksIGhhdmUgYSBtZXNzYWdlIG9uIHRoZSByZWNlaXZlIHF1ZXVlICovCiAKLQlyeG0gPSBrY21fcnhfbXNnKHNrYik7CisJcnhtID0gc3RycF9yeF9tc2coc2tiKTsKIAogCWlmIChsZW4gPiByeG0tPmZ1bGxfbGVuKQogCQlsZW4gPSByeG0tPmZ1bGxfbGVuOwogCi0JY29waWVkID0gc2tiX3NwbGljZV9iaXRzKHNrYiwgc2ssIHJ4bS0+b2Zmc2V0LCBwaXBlLCBsZW4sIGZsYWdzLAotCQkJCSBrY21fc29ja19zcGxpY2UpOworCWNvcGllZCA9IHNrYl9zcGxpY2VfYml0cyhza2IsIHNrLCByeG0tPm9mZnNldCwgcGlwZSwgbGVuLCBmbGFncyk7CiAJaWYgKGNvcGllZCA8IDApIHsKIAkJZXJyID0gY29waWVkOwogCQlnb3RvIGVycl9vdXQ7CkBAIC0xNjc0LDE1ICsxMzU5LDYgQEAKIAlzcGluX3VubG9ja19iaCgmbXV4LT5yeF9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQga2NtX3J4X21zZ190aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBrY21fcHNvY2sgKnBzb2NrID0gKHN0cnVjdCBrY21fcHNvY2sgKilhcmc7Ci0KLQkvKiBNZXNzYWdlIGFzc2VtYmx5IHRpbWVkIG91dCAqLwotCUtDTV9TVEFUU19JTkNSKHBzb2NrLT5zdGF0cy5yeF9tc2dfdGltZW91dHMpOwotCWtjbV9hYm9ydF9yeF9wc29jayhwc29jaywgRVRJTUVET1VULCBOVUxMKTsKLX0KLQogc3RhdGljIGludCBrY21fYXR0YWNoKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKmNzb2NrLAogCQkgICAgICBzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCiB7CkBAIC0xNjkyLDE5ICsxMzY4LDEzIEBACiAJc3RydWN0IGtjbV9wc29jayAqcHNvY2sgPSBOVUxMLCAqdHBzb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CiAJaW50IGluZGV4ID0gMDsKLQotCWlmIChjc29jay0+b3BzLT5mYW1pbHkgIT0gUEZfSU5FVCAmJgotCSAgICBjc29jay0+b3BzLT5mYW1pbHkgIT0gUEZfSU5FVDYpCi0JCXJldHVybiAtRUlOVkFMOworCXN0cnVjdCBzdHJwX2NhbGxiYWNrcyBjYjsKKwlpbnQgZXJyOwogCiAJY3NrID0gY3NvY2stPnNrOwogCWlmICghY3NrKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIE9ubHkgc3VwcG9ydCBUQ1AgZm9yIG5vdyAqLwotCWlmIChjc2stPnNrX3Byb3RvY29sICE9IElQUFJPVE9fVENQKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXBzb2NrID0ga21lbV9jYWNoZV96YWxsb2Moa2NtX3Bzb2NrcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwc29jaykKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNzEzLDExICsxMzgzLDE2IEBACiAJcHNvY2stPnNrID0gY3NrOwogCXBzb2NrLT5icGZfcHJvZyA9IHByb2c7CiAKLQlzZXR1cF90aW1lcigmcHNvY2stPnJ4X21zZ190aW1lciwga2NtX3J4X21zZ190aW1lb3V0LAotCQkgICAgKHVuc2lnbmVkIGxvbmcpcHNvY2spOworCWNiLnJjdl9tc2cgPSBrY21fcmN2X3N0cnBhcnNlcjsKKwljYi5hYm9ydF9wYXJzZXIgPSBOVUxMOworCWNiLnBhcnNlX21zZyA9IGtjbV9wYXJzZV9mdW5jX3N0cnBhcnNlcjsKKwljYi5yZWFkX3NvY2tfZG9uZSA9IGtjbV9yZWFkX3NvY2tfZG9uZTsKIAotCUlOSVRfV09SSygmcHNvY2stPnJ4X3dvcmssIHBzb2NrX3J4X3dvcmspOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwc29jay0+cnhfZGVsYXllZF93b3JrLCBwc29ja19yeF9kZWxheWVkX3dvcmspOworCWVyciA9IHN0cnBfaW5pdCgmcHNvY2stPnN0cnAsIGNzaywgJmNiKTsKKwlpZiAoZXJyKSB7CisJCWttZW1fY2FjaGVfZnJlZShrY21fcHNvY2twLCBwc29jayk7CisJCXJldHVybiBlcnI7CisJfQogCiAJc29ja19ob2xkKGNzayk7CiAKQEAgLTE3MjYsOSArMTQwMSw5IEBACiAJcHNvY2stPnNhdmVfd3JpdGVfc3BhY2UgPSBjc2stPnNrX3dyaXRlX3NwYWNlOwogCXBzb2NrLT5zYXZlX3N0YXRlX2NoYW5nZSA9IGNzay0+c2tfc3RhdGVfY2hhbmdlOwogCWNzay0+c2tfdXNlcl9kYXRhID0gcHNvY2s7Ci0JY3NrLT5za19kYXRhX3JlYWR5ID0gcHNvY2tfdGNwX2RhdGFfcmVhZHk7Ci0JY3NrLT5za193cml0ZV9zcGFjZSA9IHBzb2NrX3RjcF93cml0ZV9zcGFjZTsKLQljc2stPnNrX3N0YXRlX2NoYW5nZSA9IHBzb2NrX3RjcF9zdGF0ZV9jaGFuZ2U7CisJY3NrLT5za19kYXRhX3JlYWR5ID0gcHNvY2tfZGF0YV9yZWFkeTsKKwljc2stPnNrX3dyaXRlX3NwYWNlID0gcHNvY2tfd3JpdGVfc3BhY2U7CisJY3NrLT5za19zdGF0ZV9jaGFuZ2UgPSBwc29ja19zdGF0ZV9jaGFuZ2U7CiAJd3JpdGVfdW5sb2NrX2JoKCZjc2stPnNrX2NhbGxiYWNrX2xvY2spOwogCiAJLyogRmluaXNoZWQgaW5pdGlhbGl6YXRpb24sIG5vdyBhZGQgdGhlIHBzb2NrIHRvIHRoZSBNVVguICovCkBAIC0xNzUwLDcgKzE0MjUsNyBAQAogCXNwaW5fdW5sb2NrX2JoKCZtdXgtPmxvY2spOwogCiAJLyogU2NoZWR1bGUgUlggd29yayBpbiBjYXNlIHRoZXJlIGFyZSBhbHJlYWR5IGJ5dGVzIHF1ZXVlZCAqLwotCXF1ZXVlX3dvcmsoa2NtX3dxLCAmcHNvY2stPnJ4X3dvcmspOworCXN0cnBfY2hlY2tfcmN2KCZwc29jay0+c3RycCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3OTAsNiArMTQ2NSw4IEBACiAJc3RydWN0IHNvY2sgKmNzayA9IHBzb2NrLT5zazsKIAlzdHJ1Y3Qga2NtX211eCAqbXV4ID0gcHNvY2stPm11eDsKIAorCWxvY2tfc29jayhjc2spOworCiAJLyogU3RvcCBnZXR0aW5nIGNhbGxiYWNrcyBmcm9tIFRDUCBzb2NrZXQuIEFmdGVyIHRoaXMgdGhlcmUgc2hvdWxkCiAJICogYmUgbm8gd2F5IHRvIHJlc2VydmUgYSBrY20gZm9yIHRoaXMgcHNvY2suCiAJICovCkBAIC0xNzk4LDcgKzE0NzUsNyBAQAogCWNzay0+c2tfZGF0YV9yZWFkeSA9IHBzb2NrLT5zYXZlX2RhdGFfcmVhZHk7CiAJY3NrLT5za193cml0ZV9zcGFjZSA9IHBzb2NrLT5zYXZlX3dyaXRlX3NwYWNlOwogCWNzay0+c2tfc3RhdGVfY2hhbmdlID0gcHNvY2stPnNhdmVfc3RhdGVfY2hhbmdlOwotCXBzb2NrLT5yeF9zdG9wcGVkID0gMTsKKwlzdHJwX3N0b3AoJnBzb2NrLT5zdHJwKTsKIAogCWlmIChXQVJOX09OKHBzb2NrLT5yeF9rY20pKSB7CiAJCXdyaXRlX3VubG9ja19iaCgmY3NrLT5za19jYWxsYmFja19sb2NrKTsKQEAgLTE4MjEsMTggKzE0OTgsMTcgQEAKIAogCXdyaXRlX3VubG9ja19iaCgmY3NrLT5za19jYWxsYmFja19sb2NrKTsKIAotCWRlbF90aW1lcl9zeW5jKCZwc29jay0+cnhfbXNnX3RpbWVyKTsKLQljYW5jZWxfd29ya19zeW5jKCZwc29jay0+cnhfd29yayk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwc29jay0+cnhfZGVsYXllZF93b3JrKTsKKwkvKiBDYWxsIHN0cnBfZG9uZSB3aXRob3V0IHNvY2sgbG9jayAqLworCXJlbGVhc2Vfc29jayhjc2spOworCXN0cnBfZG9uZSgmcHNvY2stPnN0cnApOworCWxvY2tfc29jayhjc2spOwogCiAJYnBmX3Byb2dfcHV0KHBzb2NrLT5icGZfcHJvZyk7CiAKLQlrZnJlZV9za2IocHNvY2stPnJ4X3NrYl9oZWFkKTsKLQlwc29jay0+cnhfc2tiX2hlYWQgPSBOVUxMOwotCiAJc3Bpbl9sb2NrX2JoKCZtdXgtPmxvY2spOwogCiAJYWdncmVnYXRlX3Bzb2NrX3N0YXRzKCZwc29jay0+c3RhdHMsICZtdXgtPmFnZ3JlZ2F0ZV9wc29ja19zdGF0cyk7CisJc2F2ZV9zdHJwX3N0YXRzKCZwc29jay0+c3RycCwgJm11eC0+YWdncmVnYXRlX3N0cnBfc3RhdHMpOwogCiAJS0NNX1NUQVRTX0lOQ1IobXV4LT5zdGF0cy5wc29ja191bmF0dGFjaCk7CiAKQEAgLTE4NzUsNiArMTU1MSw4IEBACiAJCWZwdXQoY3NrLT5za19zb2NrZXQtPmZpbGUpOwogCQlrbWVtX2NhY2hlX2ZyZWUoa2NtX3Bzb2NrcCwgcHNvY2spOwogCX0KKworCXJlbGVhc2Vfc29jayhjc2spOwogfQogCiBzdGF0aWMgaW50IGtjbV91bmF0dGFjaF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qga2NtX3VuYXR0YWNoICppbmZvKQpAQCAtMTkxNSw2ICsxNTkzLDcgQEAKIAogCQlzcGluX3VubG9ja19iaCgmbXV4LT5sb2NrKTsKIAorCQkvKiBMb3dlciBzb2NrZXQgbG9jayBzaG91bGQgYWxyZWFkeSBiZSBoZWxkICovCiAJCWtjbV91bmF0dGFjaChwc29jayk7CiAKIAkJZXJyID0gMDsKQEAgLTIwMjksNyArMTcwOCw3IEBACiAJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sCiAJCQkJCSBzaXplb2YoaW5mbykpKSB7CiAJCQkJZXJyID0gLUVGQVVMVDsKLQkJCQlzb2NrX3JlbGVhc2UobmV3c29jayk7CisJCQkJc3lzX2Nsb3NlKGluZm8uZmQpOwogCQkJfQogCQl9CiAKQEAgLTIwNzIsNiArMTc1MSw4IEBACiAJYWdncmVnYXRlX211eF9zdGF0cygmbXV4LT5zdGF0cywgJmtuZXQtPmFnZ3JlZ2F0ZV9tdXhfc3RhdHMpOwogCWFnZ3JlZ2F0ZV9wc29ja19zdGF0cygmbXV4LT5hZ2dyZWdhdGVfcHNvY2tfc3RhdHMsCiAJCQkgICAgICAma25ldC0+YWdncmVnYXRlX3Bzb2NrX3N0YXRzKTsKKwlhZ2dyZWdhdGVfc3RycF9zdGF0cygmbXV4LT5hZ2dyZWdhdGVfc3RycF9zdGF0cywKKwkJCSAgICAgJmtuZXQtPmFnZ3JlZ2F0ZV9zdHJwX3N0YXRzKTsKIAlsaXN0X2RlbF9yY3UoJm11eC0+a2NtX211eF9saXN0KTsKIAlrbmV0LT5jb3VudC0tOwogCW11dGV4X3VubG9jaygma25ldC0+bXV0ZXgpOwpAQCAtMjE1MSw2ICsxODMyLDEzIEBACiAJICogaXQgd2lsbCBqdXN0IHJldHVybi4KIAkgKi8KIAlfX3NrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKworCS8qIFNldCB0eF9zdG9wcGVkLiBUaGlzIGlzIGNoZWNrZWQgd2hlbiBwc29jayBpcyBib3VuZCB0byBhIGtjbSBhbmQgd2UKKwkgKiBnZXQgYSB3cml0ZXNwYWNlIGNhbGxiYWNrLiBUaGlzIHByZXZlbnRzIGZ1cnRoZXIgd29yayBiZWluZyBxdWV1ZWQKKwkgKiBmcm9tIHRoZSBjYWxsYmFjayAodW5iaW5kaW5nIHRoZSBwc29jayBvY2N1cnMgYWZ0ZXIgY2FuY2VsaW5nIHdvcmsuCisJICovCisJa2NtLT50eF9zdG9wcGVkID0gMTsKKwogCXJlbGVhc2Vfc29jayhzayk7CiAKIAlzcGluX2xvY2tfYmgoJm11eC0+bG9jayk7CmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2NvcmUuYyBiL25ldC9sMnRwL2wydHBfY29yZS5jCmluZGV4IDFlNDBkYWMuLmEyZWQzYmQgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfY29yZS5jCisrKyBiL25ldC9sMnRwL2wydHBfY29yZS5jCkBAIC0xODU1LDYgKzE4NTUsOSBAQAogCQkodm9pZClsMnRwX3R1bm5lbF9kZWxldGUodHVubmVsKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CisKKwlmbHVzaF93b3JrcXVldWUobDJ0cF93cSk7CisJcmN1X2JhcnJpZXIoKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBsMnRwX25ldF9vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX2NvcmUuaCBiL25ldC9sMnRwL2wydHBfY29yZS5oCmluZGV4IDU4NzE1MzcuLjI1OTlhZjYgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfY29yZS5oCisrKyBiL25ldC9sMnRwL2wydHBfY29yZS5oCkBAIC0xMzksNyArMTM5LDcgQEAKIAl2b2lkICgqc2Vzc2lvbl9jbG9zZSkoc3RydWN0IGwydHBfc2Vzc2lvbiAqc2Vzc2lvbik7CiAJdm9pZCAoKnJlZikoc3RydWN0IGwydHBfc2Vzc2lvbiAqc2Vzc2lvbik7CiAJdm9pZCAoKmRlcmVmKShzdHJ1Y3QgbDJ0cF9zZXNzaW9uICpzZXNzaW9uKTsKLSNpZiBkZWZpbmVkKENPTkZJR19MMlRQX0RFQlVHRlMpIHx8IGRlZmluZWQoQ09ORklHX0wyVFBfREVCVUdGU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTDJUUF9ERUJVR0ZTKQogCXZvaWQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnByaXYpOwogI2VuZGlmCiAJdWludDhfdAkJCXByaXZbMF07CS8qIHByaXZhdGUgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvbmV0L2wydHAvbDJ0cF9ldGguYyBiL25ldC9sMnRwL2wydHBfZXRoLmMKaW5kZXggNTdmYzVhNC4uOTY1ZjdlMyAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9ldGguYworKysgYi9uZXQvbDJ0cC9sMnRwX2V0aC5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGwydHBfZXRoX25ldGRldl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGwydHBfZXRoX25ldGRldl9vcHMgPSB7CiAJLm5kb19pbml0CQk9IGwydHBfZXRoX2Rldl9pbml0LAogCS5uZG9fdW5pbml0CQk9IGwydHBfZXRoX2Rldl91bmluaXQsCiAJLm5kb19zdGFydF94bWl0CQk9IGwydHBfZXRoX2Rldl94bWl0LApAQCAtMTk1LDcgKzE5NSw3IEBACiAJfQogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfTDJUUF9ERUJVR0ZTKSB8fCBkZWZpbmVkKENPTkZJR19MMlRQX0RFQlVHRlNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0wyVFBfREVCVUdGUykKIHN0YXRpYyB2b2lkIGwydHBfZXRoX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGwydHBfc2Vzc2lvbiAqc2Vzc2lvbiA9IGFyZzsKQEAgLTI2OCw3ICsyNjgsNyBAQAogCXByaXYtPnR1bm5lbF9zb2NrID0gdHVubmVsLT5zb2NrOwogCXNlc3Npb24tPnJlY3Zfc2tiID0gbDJ0cF9ldGhfZGV2X3JlY3Y7CiAJc2Vzc2lvbi0+c2Vzc2lvbl9jbG9zZSA9IGwydHBfZXRoX2RlbGV0ZTsKLSNpZiBkZWZpbmVkKENPTkZJR19MMlRQX0RFQlVHRlMpIHx8IGRlZmluZWQoQ09ORklHX0wyVFBfREVCVUdGU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTDJUUF9ERUJVR0ZTKQogCXNlc3Npb24tPnNob3cgPSBsMnRwX2V0aF9zaG93OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfbmV0bGluay5jIGIvbmV0L2wydHAvbDJ0cF9uZXRsaW5rLmMKaW5kZXggMWQwMmU4ZC4uYmYzMTE3NyAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9uZXRsaW5rLmMKKysrIGIvbmV0L2wydHAvbDJ0cF9uZXRsaW5rLmMKQEAgLTg2Nyw3ICs4NjcsNyBAQAogCXJldHVybiBza2ItPmxlbjsKIH0KIAotc3RhdGljIHN0cnVjdCBubGFfcG9saWN5IGwydHBfbmxfcG9saWN5W0wyVFBfQVRUUl9NQVggKyAxXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBsMnRwX25sX3BvbGljeVtMMlRQX0FUVFJfTUFYICsgMV0gPSB7CiAJW0wyVFBfQVRUUl9OT05FXQkJPSB7IC50eXBlID0gTkxBX1VOU1BFQywgfSwKIAlbTDJUUF9BVFRSX1BXX1RZUEVdCQk9IHsgLnR5cGUgPSBOTEFfVTE2LCB9LAogCVtMMlRQX0FUVFJfRU5DQVBfVFlQRV0JCT0geyAudHlwZSA9IE5MQV9VMTYsIH0sCmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX3BwcC5jIGIvbmV0L2wydHAvbDJ0cF9wcHAuYwppbmRleCBkOTU2MGFhLi40MWQ0N2JmIDEwMDY0NAotLS0gYS9uZXQvbDJ0cC9sMnRwX3BwcC5jCisrKyBiL25ldC9sMnRwL2wydHBfcHBwLmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIDIpKQogCQlyZXR1cm4gMTsKIAotCWlmICgoc2tiLT5kYXRhWzBdID09IDB4ZmYpICYmIChza2ItPmRhdGFbMV0gPT0gMHgwMykpCisJaWYgKChza2ItPmRhdGFbMF0gPT0gUFBQX0FMTFNUQVRJT05TKSAmJiAoc2tiLT5kYXRhWzFdID09IFBQUF9VSSkpCiAJCXNrYl9wdWxsKHNrYiwgMik7CiAKIAlyZXR1cm4gMDsKQEAgLTI4Miw3ICsyODIsNiBAQAogc3RhdGljIGludCBwcHBvbDJ0cF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sCiAJCQkgICAgc2l6ZV90IHRvdGFsX2xlbikKIHsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwcHBoWzJdID0geyAweGZmLCAweDAzIH07CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgZXJyb3I7CkBAIC0zMTIsNyArMzExLDcgQEAKIAllcnJvciA9IC1FTk9NRU07CiAJc2tiID0gc29ja193bWFsbG9jKHNrLCBORVRfU0tCX1BBRCArIHNpemVvZihzdHJ1Y3QgaXBoZHIpICsKIAkJCSAgIHVobGVuICsgc2Vzc2lvbi0+aGRyX2xlbiArCi0JCQkgICBzaXplb2YocHBwaCkgKyB0b3RhbF9sZW4sCisJCQkgICAyICsgdG90YWxfbGVuLCAvKiAyIGJ5dGVzIGZvciBQUFBfQUxMU1RBVElPTlMgJiBQUFBfVUkgKi8KIAkJCSAgIDAsIEdGUF9LRVJORUwpOwogCWlmICghc2tiKQogCQlnb3RvIGVycm9yX3B1dF9zZXNzX3R1bjsKQEAgLTMyNSw4ICszMjQsOCBAQAogCXNrYl9yZXNlcnZlKHNrYiwgdWhsZW4pOwogCiAJLyogQWRkIFBQUCBoZWFkZXIgKi8KLQlza2ItPmRhdGFbMF0gPSBwcHBoWzBdOwotCXNrYi0+ZGF0YVsxXSA9IHBwcGhbMV07CisJc2tiLT5kYXRhWzBdID0gUFBQX0FMTFNUQVRJT05TOworCXNrYi0+ZGF0YVsxXSA9IFBQUF9VSTsKIAlza2JfcHV0KHNrYiwgMik7CiAKIAkvKiBDb3B5IHVzZXIgZGF0YSBpbnRvIHNrYiAqLwpAQCAtMzY5LDcgKzM2OCw2IEBACiAgKi8KIHN0YXRpYyBpbnQgcHBwb2wydHBfeG1pdChzdHJ1Y3QgcHBwX2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RhdGljIGNvbnN0IHU4IHBwcGhbMl0gPSB7IDB4ZmYsIDB4MDMgfTsKIAlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKikgY2hhbi0+cHJpdmF0ZTsKIAlzdHJ1Y3Qgc29jayAqc2tfdHVuOwogCXN0cnVjdCBsMnRwX3Nlc3Npb24gKnNlc3Npb247CkBAIC0zOTgsMTQgKzM5NiwxNCBAQAogCQkgICBzaXplb2Yoc3RydWN0IGlwaGRyKSArIC8qIElQIGhlYWRlciAqLwogCQkgICB1aGxlbiArCQkvKiBVRFAgaGVhZGVyIChpZiBMMlRQX0VOQ0FQVFlQRV9VRFApICovCiAJCSAgIHNlc3Npb24tPmhkcl9sZW4gKwkvKiBMMlRQIGhlYWRlciAqLwotCQkgICBzaXplb2YocHBwaCk7CS8qIFBQUCBoZWFkZXIgKi8KKwkJICAgMjsJCQkvKiAyIGJ5dGVzIGZvciBQUFBfQUxMU1RBVElPTlMgJiBQUFBfVUkgKi8KIAlpZiAoc2tiX2Nvd19oZWFkKHNrYiwgaGVhZHJvb20pKQogCQlnb3RvIGFib3J0X3B1dF9zZXNzX3R1bjsKIAogCS8qIFNldHVwIFBQUCBoZWFkZXIgKi8KLQlfX3NrYl9wdXNoKHNrYiwgc2l6ZW9mKHBwcGgpKTsKLQlza2ItPmRhdGFbMF0gPSBwcHBoWzBdOwotCXNrYi0+ZGF0YVsxXSA9IHBwcGhbMV07CisJX19za2JfcHVzaChza2IsIDIpOworCXNrYi0+ZGF0YVswXSA9IFBQUF9BTExTVEFUSU9OUzsKKwlza2ItPmRhdGFbMV0gPSBQUFBfVUk7CiAKIAlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJbDJ0cF94bWl0X3NrYihzZXNzaW9uLCBza2IsIHNlc3Npb24tPmhkcl9sZW4pOwpAQCAtNDQwLDcgKzQzOCw3IEBACiAJQlVHX09OKHNlc3Npb24tPm1hZ2ljICE9IEwyVFBfU0VTU0lPTl9NQUdJQyk7CiAKIAlpZiAoc29jaykgewotCQlpbmV0X3NodXRkb3duKHNvY2ssIDIpOworCQlpbmV0X3NodXRkb3duKHNvY2ssIFNFTkRfU0hVVERPV04pOwogCQkvKiBEb24ndCBsZXQgdGhlIHNlc3Npb24gZ28gYXdheSBiZWZvcmUgb3VyIHNvY2tldCBkb2VzICovCiAJCWwydHBfc2Vzc2lvbl9pbmNfcmVmY291bnQoc2Vzc2lvbik7CiAJfQpAQCAtNTU0LDcgKzU1Miw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfTDJUUF9ERUJVR0ZTKSB8fCBkZWZpbmVkKENPTkZJR19MMlRQX0RFQlVHRlNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0wyVFBfREVCVUdGUykKIHN0YXRpYyB2b2lkIHBwcG9sMnRwX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGwydHBfc2Vzc2lvbiAqc2Vzc2lvbiA9IGFyZzsKQEAgLTcyNSw3ICs3MjMsNyBAQAogCiAJc2Vzc2lvbi0+cmVjdl9za2IJPSBwcHBvbDJ0cF9yZWN2OwogCXNlc3Npb24tPnNlc3Npb25fY2xvc2UJPSBwcHBvbDJ0cF9zZXNzaW9uX2Nsb3NlOwotI2lmIGRlZmluZWQoQ09ORklHX0wyVFBfREVCVUdGUykgfHwgZGVmaW5lZChDT05GSUdfTDJUUF9ERUJVR0ZTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19MMlRQX0RFQlVHRlMpCiAJc2Vzc2lvbi0+c2hvdwkJPSBwcHBvbDJ0cF9zaG93OwogI2VuZGlmCiAKQEAgLTg1Niw3ICs4NTQsNyBAQAogCWVycm9yID0gLUVOT1RDT05OOwogCWlmIChzayA9PSBOVUxMKQogCQlnb3RvIGVuZDsKLQlpZiAoc2stPnNrX3N0YXRlICE9IFBQUE9YX0NPTk5FQ1RFRCkKKwlpZiAoIShzay0+c2tfc3RhdGUgJiBQUFBPWF9DT05ORUNURUQpKQogCQlnb3RvIGVuZDsKIAogCWVycm9yID0gLUVCQURGOwpkaWZmIC0tZ2l0IGEvbmV0L2wzbWRldi9sM21kZXYuYyBiL25ldC9sM21kZXYvbDNtZGV2LmMKaW5kZXggYzRhMWMzZS4uOGRhODZjZSAxMDA2NDQKLS0tIGEvbmV0L2wzbWRldi9sM21kZXYuYworKysgYi9uZXQvbDNtZGV2L2wzbWRldi5jCkBAIC0xMDAsMTUgKzEwMCwxNCBAQAogRVhQT1JUX1NZTUJPTF9HUEwobDNtZGV2X2ZpYl90YWJsZV9ieV9pbmRleCk7CiAKIC8qKgotICoJbDNtZGV2X2dldF9ydDZfZHN0IC0gSVB2NiByb3V0ZSBsb29rdXAgYmFzZWQgb24gZmxvdy4gUmV0dXJucwotICoJCQkgICAgIGNhY2hlZCByb3V0ZSBmb3IgTDMgbWFzdGVyIGRldmljZSBpZiByZWxldmFudAotICoJCQkgICAgIHRvIGZsb3cKKyAqCWwzbWRldl9saW5rX3Njb3BlX2xvb2t1cCAtIElQdjYgcm91dGUgbG9va3VwIGJhc2VkIG9uIGZsb3cgZm9yIGxpbmsKKyAqCQkJICAgICBsb2NhbCBhbmQgbXVsdGljYXN0IGFkZHJlc3NlcwogICoJQG5ldDogbmV0d29yayBuYW1lc3BhY2UgZm9yIGRldmljZSBpbmRleCBsb29rdXAKICAqCUBmbDY6IElQdjYgZmxvdyBzdHJ1Y3QgZm9yIGxvb2t1cAogICovCiAKLXN0cnVjdCBkc3RfZW50cnkgKmwzbWRldl9nZXRfcnQ2X2RzdChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJICAgICBzdHJ1Y3QgZmxvd2k2ICpmbDYpCitzdHJ1Y3QgZHN0X2VudHJ5ICpsM21kZXZfbGlua19zY29wZV9sb29rdXAoc3RydWN0IG5ldCAqbmV0LAorCQkJCQkgICBzdHJ1Y3QgZmxvd2k2ICpmbDYpCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gTlVMTDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMTIxLDcwICsxMjAsMTUgQEAKIAkJCWRldiA9IG5ldGRldl9tYXN0ZXJfdXBwZXJfZGV2X2dldF9yY3UoZGV2KTsKIAogCQlpZiAoZGV2ICYmIG5ldGlmX2lzX2wzX21hc3RlcihkZXYpICYmCi0JCSAgICBkZXYtPmwzbWRldl9vcHMtPmwzbWRldl9nZXRfcnQ2X2RzdCkKLQkJCWRzdCA9IGRldi0+bDNtZGV2X29wcy0+bDNtZGV2X2dldF9ydDZfZHN0KGRldiwgZmw2KTsKKwkJICAgIGRldi0+bDNtZGV2X29wcy0+bDNtZGV2X2xpbmtfc2NvcGVfbG9va3VwKQorCQkJZHN0ID0gZGV2LT5sM21kZXZfb3BzLT5sM21kZXZfbGlua19zY29wZV9sb29rdXAoZGV2LCBmbDYpOwogCiAJCXJjdV9yZWFkX3VubG9jaygpOwogCX0KIAogCXJldHVybiBkc3Q7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChsM21kZXZfZ2V0X3J0Nl9kc3QpOwotCi0vKioKLSAqCWwzbWRldl9nZXRfc2FkZHIgLSBnZXQgc291cmNlIGFkZHJlc3MgZm9yIGEgZmxvdyBiYXNlZCBvbiBhbiBpbnRlcmZhY2UKLSAqCQkJICAgZW5zbGF2ZWQgdG8gYW4gTDMgbWFzdGVyIGRldmljZQotICoJQG5ldDogbmV0d29yayBuYW1lc3BhY2UgZm9yIGRldmljZSBpbmRleCBsb29rdXAKLSAqCUBpZmluZGV4OiBJbnRlcmZhY2UgaW5kZXgKLSAqCUBmbDQ6IElQdjQgZmxvdyBzdHJ1Y3QKLSAqLwotCi1pbnQgbDNtZGV2X2dldF9zYWRkcihzdHJ1Y3QgbmV0ICpuZXQsIGludCBpZmluZGV4LCBzdHJ1Y3QgZmxvd2k0ICpmbDQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKGlmaW5kZXgpIHsKLQkJcmN1X3JlYWRfbG9jaygpOwotCi0JCWRldiA9IGRldl9nZXRfYnlfaW5kZXhfcmN1KG5ldCwgaWZpbmRleCk7Ci0JCWlmIChkZXYgJiYgbmV0aWZfaXNfbDNfc2xhdmUoZGV2KSkKLQkJCWRldiA9IG5ldGRldl9tYXN0ZXJfdXBwZXJfZGV2X2dldF9yY3UoZGV2KTsKLQotCQlpZiAoZGV2ICYmIG5ldGlmX2lzX2wzX21hc3RlcihkZXYpICYmCi0JCSAgICBkZXYtPmwzbWRldl9vcHMtPmwzbWRldl9nZXRfc2FkZHIpCi0JCQlyYyA9IGRldi0+bDNtZGV2X29wcy0+bDNtZGV2X2dldF9zYWRkcihkZXYsIGZsNCk7Ci0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobDNtZGV2X2dldF9zYWRkcik7Ci0KLWludCBsM21kZXZfZ2V0X3NhZGRyNihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJICAgICAgc3RydWN0IGZsb3dpNiAqZmw2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IHJjID0gMDsKLQotCWlmIChmbDYtPmZsb3dpNl9vaWYpIHsKLQkJcmN1X3JlYWRfbG9jaygpOwotCi0JCWRldiA9IGRldl9nZXRfYnlfaW5kZXhfcmN1KG5ldCwgZmw2LT5mbG93aTZfb2lmKTsKLQkJaWYgKGRldiAmJiBuZXRpZl9pc19sM19zbGF2ZShkZXYpKQotCQkJZGV2ID0gbmV0ZGV2X21hc3Rlcl91cHBlcl9kZXZfZ2V0X3JjdShkZXYpOwotCi0JCWlmIChkZXYgJiYgbmV0aWZfaXNfbDNfbWFzdGVyKGRldikgJiYKLQkJICAgIGRldi0+bDNtZGV2X29wcy0+bDNtZGV2X2dldF9zYWRkcjYpCi0JCQlyYyA9IGRldi0+bDNtZGV2X29wcy0+bDNtZGV2X2dldF9zYWRkcjYoZGV2LCBzaywgZmw2KTsKLQotCQlyY3VfcmVhZF91bmxvY2soKTsKLQl9Ci0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChsM21kZXZfZ2V0X3NhZGRyNik7CitFWFBPUlRfU1lNQk9MX0dQTChsM21kZXZfbGlua19zY29wZV9sb29rdXApOwogCiAvKioKICAqCWwzbWRldl9maWJfcnVsZV9tYXRjaCAtIERldGVybWluZSBpZiBmbG93aSByZWZlcmVuY2VzIGFuCkBAIC0yMjIsMyArMTY2LDM4IEBACiAKIAlyZXR1cm4gcmM7CiB9CisKK3ZvaWQgbDNtZGV2X3VwZGF0ZV9mbG93KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZsb3dpICpmbCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBpZmluZGV4OworCisJcmN1X3JlYWRfbG9jaygpOworCisJaWYgKGZsLT5mbG93aV9vaWYpIHsKKwkJZGV2ID0gZGV2X2dldF9ieV9pbmRleF9yY3UobmV0LCBmbC0+Zmxvd2lfb2lmKTsKKwkJaWYgKGRldikgeworCQkJaWZpbmRleCA9IGwzbWRldl9tYXN0ZXJfaWZpbmRleF9yY3UoZGV2KTsKKwkJCWlmIChpZmluZGV4KSB7CisJCQkJZmwtPmZsb3dpX29pZiA9IGlmaW5kZXg7CisJCQkJZmwtPmZsb3dpX2ZsYWdzIHw9IEZMT1dJX0ZMQUdfU0tJUF9OSF9PSUY7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZmwtPmZsb3dpX2lpZikgeworCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4X3JjdShuZXQsIGZsLT5mbG93aV9paWYpOworCQlpZiAoZGV2KSB7CisJCQlpZmluZGV4ID0gbDNtZGV2X21hc3Rlcl9pZmluZGV4X3JjdShkZXYpOworCQkJaWYgKGlmaW5kZXgpIHsKKwkJCQlmbC0+Zmxvd2lfaWlmID0gaWZpbmRleDsKKwkJCQlmbC0+Zmxvd2lfZmxhZ3MgfD0gRkxPV0lfRkxBR19TS0lQX05IX09JRjsKKwkJCX0KKwkJfQorCX0KKworb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobDNtZGV2X3VwZGF0ZV9mbG93KTsKZGlmZiAtLWdpdCBhL25ldC9sbGMvYWZfbGxjLmMgYi9uZXQvbGxjL2FmX2xsYy5jCmluZGV4IDhhZTNlZDkuLmRiOTE2Y2YgMTAwNjQ0Ci0tLSBhL25ldC9sbGMvYWZfbGxjLmMKKysrIGIvbmV0L2xsYy9hZl9sbGMuYwpAQCAtMzgsNyArMzgsNyBAQAogc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9sbGMgbGxjX3VpX2FkZHJudWxsOwogc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgbGxjX3VpX29wczsKIAotc3RhdGljIGxvbmcgbGxjX3VpX3dhaXRfZm9yX2Nvbm4oc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpOworc3RhdGljIGJvb2wgbGxjX3VpX3dhaXRfZm9yX2Nvbm4oc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpOwogc3RhdGljIGludCBsbGNfdWlfd2FpdF9mb3JfZGlzYyhzdHJ1Y3Qgc29jayAqc2ssIGxvbmcgdGltZW91dCk7CiBzdGF0aWMgaW50IGxsY191aV93YWl0X2Zvcl9idXN5X2NvcmUoc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpOwogCkBAIC01NTEsNyArNTUxLDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBsb25nIGxsY191aV93YWl0X2Zvcl9jb25uKHN0cnVjdCBzb2NrICpzaywgbG9uZyB0aW1lb3V0KQorc3RhdGljIGJvb2wgbGxjX3VpX3dhaXRfZm9yX2Nvbm4oc3RydWN0IHNvY2sgKnNrLCBsb25nIHRpbWVvdXQpCiB7CiAJREVGSU5FX1dBSVQod2FpdCk7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9hZ2ctcnguYyBiL25ldC9tYWM4MDIxMS9hZ2ctcnguYwppbmRleCBhOWFmZjYwLi5mNjc0OWRjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvYWdnLXJ4LmMKKysrIGIvbmV0L21hYzgwMjExL2FnZy1yeC5jCkBAIC0yNjEsMTAgKzI2MSwxNiBAQAogCQkudGltZW91dCA9IHRpbWVvdXQsCiAJCS5zc24gPSBzdGFydF9zZXFfbnVtLAogCX07Ci0KIAlpbnQgaSwgcmV0ID0gLUVPUE5PVFNVUFA7CiAJdTE2IHN0YXR1cyA9IFdMQU5fU1RBVFVTX1JFUVVFU1RfREVDTElORUQ7CiAKKwlpZiAodGlkID49IElFRUU4MDIxMV9GSVJTVF9UU1BFQ19UU0lEKSB7CisJCWh0X2RiZyhzdGEtPnNkYXRhLAorCQkgICAgICAgIlNUQSAlcE0gcmVxdWVzdHMgQkEgc2Vzc2lvbiBvbiB1bnN1cHBvcnRlZCB0aWQgJWRcbiIsCisJCSAgICAgICBzdGEtPnN0YS5hZGRyLCB0aWQpOworCQlnb3RvIGVuZF9ub19sb2NrOworCX0KKwogCWlmICghc3RhLT5zdGEuaHRfY2FwLmh0X3N1cHBvcnRlZCkgewogCQlodF9kYmcoc3RhLT5zZGF0YSwKIAkJICAgICAgICJTVEEgJXBNIGVycm9uZW91c2x5IHJlcXVlc3RzIEJBIHNlc3Npb24gb24gdGlkICVkIHcvbyBRb1NcbiIsCkBAIC0yOTgsMTAgKzMwNCwxMyBAQAogCQlidWZfc2l6ZSA9IElFRUU4MDIxMV9NQVhfQU1QRFVfQlVGOwogCiAJLyogbWFrZSBzdXJlIHRoZSBzaXplIGRvZXNuJ3QgZXhjZWVkIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBieSB0aGUgaHcgKi8KLQlpZiAoYnVmX3NpemUgPiBsb2NhbC0+aHcubWF4X3J4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lcykKLQkJYnVmX3NpemUgPSBsb2NhbC0+aHcubWF4X3J4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lczsKKwlpZiAoYnVmX3NpemUgPiBzdGEtPnN0YS5tYXhfcnhfYWdncmVnYXRpb25fc3ViZnJhbWVzKQorCQlidWZfc2l6ZSA9IHN0YS0+c3RhLm1heF9yeF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXM7CiAJcGFyYW1zLmJ1Zl9zaXplID0gYnVmX3NpemU7CiAKKwlodF9kYmcoc3RhLT5zZGF0YSwgIkFkZEJBIFJlcSBidWZfc2l6ZT0lZCBmb3IgJXBNXG4iLAorCSAgICAgICBidWZfc2l6ZSwgc3RhLT5zdGEuYWRkcik7CisKIAkvKiBleGFtaW5lIHN0YXRlIG1hY2hpbmUgKi8KIAltdXRleF9sb2NrKCZzdGEtPmFtcGR1X21sbWUubXR4KTsKIApAQCAtNDA2LDggKzQxNSwxMCBAQAogCX0KIAogZW5kOgotCWlmIChzdGF0dXMgPT0gV0xBTl9TVEFUVVNfU1VDQ0VTUykKKwlpZiAoc3RhdHVzID09IFdMQU5fU1RBVFVTX1NVQ0NFU1MpIHsKIAkJX19zZXRfYml0KHRpZCwgc3RhLT5hbXBkdV9tbG1lLmFnZ19zZXNzaW9uX3ZhbGlkKTsKKwkJX19jbGVhcl9iaXQodGlkLCBzdGEtPmFtcGR1X21sbWUudW5leHBlY3RlZF9hZ2cpOworCX0KIAltdXRleF91bmxvY2soJnN0YS0+YW1wZHVfbWxtZS5tdHgpOwogCiBlbmRfbm9fbG9jazoKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9hZ2ctdHguYyBiL25ldC9tYWM4MDIxMS9hZ2ctdHguYwppbmRleCA1NjUwYzQ2Li40NTMxOWNjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvYWdnLXR4LmMKKysrIGIvbmV0L21hYzgwMjExL2FnZy10eC5jCkBAIC01ODQsNiArNTg0LDkgQEAKIAkgICAgaWVlZTgwMjExX2h3X2NoZWNrKCZsb2NhbC0+aHcsIFRYX0FNUERVX1NFVFVQX0lOX0hXKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoV0FSTl9PTih0aWQgPj0gSUVFRTgwMjExX0ZJUlNUX1RTUEVDX1RTSUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWh0X2RiZyhzZGF0YSwgIk9wZW4gQkEgc2Vzc2lvbiByZXF1ZXN0ZWQgZm9yICVwTSB0aWQgJXVcbiIsCiAJICAgICAgIHB1YnN0YS0+YWRkciwgdGlkKTsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2NmZy5jIGIvbmV0L21hYzgwMjExL2NmZy5jCmluZGV4IDU0M2IxZDQuLmZkNjU0MWYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9jZmcuYworKysgYi9uZXQvbWFjODAyMTEvY2ZnLmMKQEAgLTMsNiArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IDIwMDYtMjAxMAlKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgogICogQ29weXJpZ2h0IDIwMTMtMjAxNSAgSW50ZWwgTW9iaWxlIENvbW11bmljYXRpb25zIEdtYkgKKyAqIENvcHlyaWdodCAoQykgMjAxNS0yMDE2IEludGVsIERldXRzY2hsYW5kIEdtYkgKICAqCiAgKiBUaGlzIGZpbGUgaXMgR1BMdjIgYXMgZm91bmQgaW4gQ09QWUlORy4KICAqLwpAQCAtMzksNyArNDAsNyBAQAogCiAJaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJiBmbGFncykgewogCQlzZGF0YSA9IElFRUU4MDIxMV9XREVWX1RPX1NVQl9JRih3ZGV2KTsKLQkJc2RhdGEtPnUubW50cl9mbGFncyA9ICpmbGFnczsKKwkJc2RhdGEtPnUubW50ci5mbGFncyA9ICpmbGFnczsKIAl9CiAKIAlyZXR1cm4gd2RldjsKQEAgLTczLDggKzc0LDI5IEBACiAJCXNkYXRhLT51Lm1nZC51c2VfNGFkZHIgPSBwYXJhbXMtPnVzZV80YWRkcjsKIAl9CiAKLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYgZmxhZ3MpIHsKKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpIHsKIAkJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKm1vbml0b3Jfc2RhdGE7CisJCXUzMiBtdV9tbnRyX2NhcF9mbGFnID0gTkw4MDIxMV9FWFRfRkVBVFVSRV9NVV9NSU1PX0FJUl9TTklGRkVSOworCisJCW1vbml0b3Jfc2RhdGEgPSBydG5sX2RlcmVmZXJlbmNlKGxvY2FsLT5tb25pdG9yX3NkYXRhKTsKKwkJaWYgKG1vbml0b3Jfc2RhdGEgJiYKKwkJICAgIHdpcGh5X2V4dF9mZWF0dXJlX2lzc2V0KHdpcGh5LCBtdV9tbnRyX2NhcF9mbGFnKSkgeworCQkJbWVtY3B5KG1vbml0b3Jfc2RhdGEtPnZpZi5ic3NfY29uZi5tdV9ncm91cC5tZW1iZXJzaGlwLAorCQkJICAgICAgIHBhcmFtcy0+dmh0X211bWltb19ncm91cHMsIFdMQU5fTUVNQkVSU0hJUF9MRU4pOworCQkJbWVtY3B5KG1vbml0b3Jfc2RhdGEtPnZpZi5ic3NfY29uZi5tdV9ncm91cC5wb3NpdGlvbiwKKwkJCSAgICAgICBwYXJhbXMtPnZodF9tdW1pbW9fZ3JvdXBzICsgV0xBTl9NRU1CRVJTSElQX0xFTiwKKwkJCSAgICAgICBXTEFOX1VTRVJfUE9TSVRJT05fTEVOKTsKKwkJCW1vbml0b3Jfc2RhdGEtPnZpZi5tdV9taW1vX293bmVyID0gdHJ1ZTsKKwkJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KG1vbml0b3Jfc2RhdGEsCisJCQkJCQkJIEJTU19DSEFOR0VEX01VX0dST1VQUyk7CisKKwkJCWV0aGVyX2FkZHJfY29weShtb25pdG9yX3NkYXRhLT51Lm1udHIubXVfZm9sbG93X2FkZHIsCisJCQkJCXBhcmFtcy0+bWFjYWRkcik7CisJCX0KKworCQlpZiAoIWZsYWdzKQorCQkJcmV0dXJuIDA7CiAKIAkJaWYgKGllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkgewogCQkJdTMyIG1hc2sgPSBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMgfApAQCAtODksMTEgKzExMSwxMSBAQAogCQkJICoJY29va2VkX21udHJzLCBtb25pdG9yIGFuZCBhbGwgZmlmXyogY291bnRlcnMKIAkJCSAqCXJlY29uZmlndXJlIGhhcmR3YXJlCiAJCQkgKi8KLQkJCWlmICgoKmZsYWdzICYgbWFzaykgIT0gKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBtYXNrKSkKKwkJCWlmICgoKmZsYWdzICYgbWFzaykgIT0gKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBtYXNrKSkKIAkJCQlyZXR1cm4gLUVCVVNZOwogCiAJCQlpZWVlODAyMTFfYWRqdXN0X21vbml0b3JfZmxhZ3Moc2RhdGEsIC0xKTsKLQkJCXNkYXRhLT51Lm1udHJfZmxhZ3MgPSAqZmxhZ3M7CisJCQlzZGF0YS0+dS5tbnRyLmZsYWdzID0gKmZsYWdzOwogCQkJaWVlZTgwMjExX2FkanVzdF9tb25pdG9yX2ZsYWdzKHNkYXRhLCAxKTsKIAogCQkJaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIobG9jYWwpOwpAQCAtMTAzLDcgKzEyNSw3IEBACiAJCQkgKiBhbmQgaWVlZTgwMjExX2RvX29wZW4gdGFrZSBjYXJlIG9mICJldmVyeXRoaW5nIgogCQkJICogbWVudGlvbmVkIGluIHRoZSBjb21tZW50IGFib3ZlLgogCQkJICovCi0JCQlzZGF0YS0+dS5tbnRyX2ZsYWdzID0gKmZsYWdzOworCQkJc2RhdGEtPnUubW50ci5mbGFncyA9ICpmbGFnczsKIAkJfQogCX0KIApAQCAtMTMxLDYgKzE1MywxNDkgQEAKIAlpZWVlODAyMTFfc2RhdGFfc3RvcChJRUVFODAyMTFfV0RFVl9UT19TVUJfSUYod2RldikpOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9zdGFydF9uYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCSAgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9XREVWX1RPX1NVQl9JRih3ZGV2KTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmc2RhdGEtPmxvY2FsLT5jaGFuY3R4X210eCk7CisJcmV0ID0gaWVlZTgwMjExX2NoZWNrX2NvbWJpbmF0aW9ucyhzZGF0YSwgTlVMTCwgMCwgMCk7CisJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+bG9jYWwtPmNoYW5jdHhfbXR4KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGllZWU4MDIxMV9kb19vcGVuKHdkZXYsIHRydWUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBkcnZfc3RhcnRfbmFuKHNkYXRhLT5sb2NhbCwgc2RhdGEsIGNvbmYpOworCWlmIChyZXQpCisJCWllZWU4MDIxMV9zZGF0YV9zdG9wKHNkYXRhKTsKKworCXNkYXRhLT51Lm5hbi5jb25mID0gKmNvbmY7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc3RvcF9uYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCSAgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX1dERVZfVE9fU1VCX0lGKHdkZXYpOworCisJZHJ2X3N0b3BfbmFuKHNkYXRhLT5sb2NhbCwgc2RhdGEpOworCWllZWU4MDIxMV9zZGF0YV9zdG9wKHNkYXRhKTsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfbmFuX2NoYW5nZV9jb25mKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgICAgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mLAorCQkJCSAgICAgdTMyIGNoYW5nZXMpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfV0RFVl9UT19TVUJfSUYod2Rldik7CisJc3RydWN0IGNmZzgwMjExX25hbl9jb25mIG5ld19jb25mOworCWludCByZXQgPSAwOworCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQorCQlyZXR1cm4gLUVORVRET1dOOworCisJbmV3X2NvbmYgPSBzZGF0YS0+dS5uYW4uY29uZjsKKworCWlmIChjaGFuZ2VzICYgQ0ZHODAyMTFfTkFOX0NPTkZfQ0hBTkdFRF9QUkVGKQorCQluZXdfY29uZi5tYXN0ZXJfcHJlZiA9IGNvbmYtPm1hc3Rlcl9wcmVmOworCisJaWYgKGNoYW5nZXMgJiBDRkc4MDIxMV9OQU5fQ09ORl9DSEFOR0VEX0RVQUwpCisJCW5ld19jb25mLmR1YWwgPSBjb25mLT5kdWFsOworCisJcmV0ID0gZHJ2X25hbl9jaGFuZ2VfY29uZihzZGF0YS0+bG9jYWwsIHNkYXRhLCAmbmV3X2NvbmYsIGNoYW5nZXMpOworCWlmICghcmV0KQorCQlzZGF0YS0+dS5uYW4uY29uZiA9IG5ld19jb25mOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfYWRkX25hbl9mdW5jKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJCSAgc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpuYW5fZnVuYykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9XREVWX1RPX1NVQl9JRih3ZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQorCQlyZXR1cm4gLUVORVRET1dOOworCisJc3Bpbl9sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCXJldCA9IGlkcl9hbGxvYygmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzLAorCQkJbmFuX2Z1bmMsIDEsIHNkYXRhLT5sb2NhbC0+aHcubWF4X25hbl9kZV9lbnRyaWVzICsgMSwKKwkJCUdGUF9BVE9NSUMpOworCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbmFuX2Z1bmMtPmluc3RhbmNlX2lkID0gcmV0OworCisJV0FSTl9PTihuYW5fZnVuYy0+aW5zdGFuY2VfaWQgPT0gMCk7CisKKwlyZXQgPSBkcnZfYWRkX25hbl9mdW5jKHNkYXRhLT5sb2NhbCwgc2RhdGEsIG5hbl9mdW5jKTsKKwlpZiAocmV0KSB7CisJCXNwaW5fbG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisJCWlkcl9yZW1vdmUoJnNkYXRhLT51Lm5hbi5mdW5jdGlvbl9pbnN0X2lkcywKKwkJCSAgIG5hbl9mdW5jLT5pbnN0YW5jZV9pZCk7CisJCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICoKK2llZWU4MDIxMV9maW5kX25hbl9mdW5jX2J5X2Nvb2tpZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgIHU2NCBjb29raWUpCit7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jOworCWludCBpZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJaWRyX2Zvcl9lYWNoX2VudHJ5KCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMsIGZ1bmMsIGlkKSB7CisJCWlmIChmdW5jLT5jb29raWUgPT0gY29va2llKQorCQkJcmV0dXJuIGZ1bmM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9kZWxfbmFuX2Z1bmMoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsIHU2NCBjb29raWUpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfV0RFVl9UT19TVUJfSUYod2Rldik7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jOworCXU4IGluc3RhbmNlX2lkID0gMDsKKworCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOIHx8CisJICAgICFpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisKKwlmdW5jID0gaWVlZTgwMjExX2ZpbmRfbmFuX2Z1bmNfYnlfY29va2llKHNkYXRhLCBjb29raWUpOworCWlmIChmdW5jKQorCQlpbnN0YW5jZV9pZCA9IGZ1bmMtPmluc3RhbmNlX2lkOworCisJc3Bpbl91bmxvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJaWYgKGluc3RhbmNlX2lkKQorCQlkcnZfZGVsX25hbl9mdW5jKHNkYXRhLT5sb2NhbCwgc2RhdGEsIGluc3RhbmNlX2lkKTsKK30KKwogc3RhdGljIGludCBpZWVlODAyMTFfc2V0X25vYWNrX21hcChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgIHUxNiBub2Fja19tYXApCkBAIC0yMzYsNiArNDAxLDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKIAljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6CiAJY2FzZSBOVU1fTkw4MDIxMV9JRlRZUEVTOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKQEAgLTIwMTUsNiArMjE4MSw3IEBACiAJCSAgICAgIShyZXEtPmZsYWdzICYgTkw4MDIxMV9TQ0FOX0ZMQUdfQVApKSkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KQEAgLTI5NDAsMTAgKzMxMDcsNiBAQAogCX0KIAogCWNoYW5jdHggPSBjb250YWluZXJfb2YoY29uZiwgc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4LCBjb25mKTsKLQlpZiAoIWNoYW5jdHgpIHsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9CiAKIAljaF9zd2l0Y2gudGltZXN0YW1wID0gMDsKIAljaF9zd2l0Y2guZGV2aWNlX3RpbWVzdGFtcCA9IDA7CkBAIC0zMzYwLDYgKzM1MjMsNjMgQEAKIAlyZXR1cm4gLUVOT0VOVDsKIH0KIAordm9pZCBpZWVlODAyMTFfbmFuX2Z1bmNfdGVybWluYXRlZChzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgIHU4IGluc3RfaWQsCisJCQkJICAgZW51bSBubDgwMjExX25hbl9mdW5jX3Rlcm1fcmVhc29uIHJlYXNvbiwKKwkJCQkgICBnZnBfdCBnZnApCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKKwlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmZ1bmM7CisJdTY0IGNvb2tpZTsKKworCWlmIChXQVJOX09OKHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJZnVuYyA9IGlkcl9maW5kKCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMsIGluc3RfaWQpOworCWlmIChXQVJOX09OKCFmdW5jKSkgeworCQlzcGluX3VubG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwljb29raWUgPSBmdW5jLT5jb29raWU7CisJaWRyX3JlbW92ZSgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzLCBpbnN0X2lkKTsKKworCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWNmZzgwMjExX2ZyZWVfbmFuX2Z1bmMoZnVuYyk7CisKKwljZmc4MDIxMV9uYW5fZnVuY190ZXJtaW5hdGVkKGllZWU4MDIxMV92aWZfdG9fd2Rldih2aWYpLCBpbnN0X2lkLAorCQkJCSAgICAgcmVhc29uLCBjb29raWUsIGdmcCk7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9uYW5fZnVuY190ZXJtaW5hdGVkKTsKKwordm9pZCBpZWVlODAyMTFfbmFuX2Z1bmNfbWF0Y2goc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9uYW5fbWF0Y2hfcGFyYW1zICptYXRjaCwKKwkJCSAgICAgIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHZpZl90b19zZGF0YSh2aWYpOworCXN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqZnVuYzsKKworCWlmIChXQVJOX09OKHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJZnVuYyA9IGlkcl9maW5kKCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMsICBtYXRjaC0+aW5zdF9pZCk7CisJaWYgKFdBUk5fT04oIWZ1bmMpKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKwkJcmV0dXJuOworCX0KKwltYXRjaC0+Y29va2llID0gZnVuYy0+Y29va2llOworCisJc3Bpbl91bmxvY2tfYmgoJnNkYXRhLT51Lm5hbi5mdW5jX2xvY2spOworCisJY2ZnODAyMTFfbmFuX21hdGNoKGllZWU4MDIxMV92aWZfdG9fd2Rldih2aWYpLCBtYXRjaCwgZ2ZwKTsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX25hbl9mdW5jX21hdGNoKTsKKwogY29uc3Qgc3RydWN0IGNmZzgwMjExX29wcyBtYWM4MDIxMV9jb25maWdfb3BzID0gewogCS5hZGRfdmlydHVhbF9pbnRmID0gaWVlZTgwMjExX2FkZF9pZmFjZSwKIAkuZGVsX3ZpcnR1YWxfaW50ZiA9IGllZWU4MDIxMV9kZWxfaWZhY2UsCkBAIC0zNDQ1LDQgKzM2NjUsOSBAQAogCS5zZXRfYXBfY2hhbndpZHRoID0gaWVlZTgwMjExX3NldF9hcF9jaGFud2lkdGgsCiAJLmFkZF90eF90cyA9IGllZWU4MDIxMV9hZGRfdHhfdHMsCiAJLmRlbF90eF90cyA9IGllZWU4MDIxMV9kZWxfdHhfdHMsCisJLnN0YXJ0X25hbiA9IGllZWU4MDIxMV9zdGFydF9uYW4sCisJLnN0b3BfbmFuID0gaWVlZTgwMjExX3N0b3BfbmFuLAorCS5uYW5fY2hhbmdlX2NvbmYgPSBpZWVlODAyMTFfbmFuX2NoYW5nZV9jb25mLAorCS5hZGRfbmFuX2Z1bmMgPSBpZWVlODAyMTFfYWRkX25hbl9mdW5jLAorCS5kZWxfbmFuX2Z1bmMgPSBpZWVlODAyMTFfZGVsX25hbl9mdW5jLAogfTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9jaGFuLmMgYi9uZXQvbWFjODAyMTEvY2hhbi5jCmluZGV4IDc0MTQyZDAuLmU3NWNiZjYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9jaGFuLmMKKysrIGIvbmV0L21hYzgwMjExL2NoYW4uYwpAQCAtMjc0LDYgKzI3NCw3IEBACiAJCQkJICAgIGllZWU4MDIxMV9nZXRfbWF4X3JlcXVpcmVkX2J3KHNkYXRhKSk7CiAJCQlicmVhazsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgorCQljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJCWNvbnRpbnVlOwogCQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgogCQljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKQEAgLTY0Niw2ICs2NDcsOSBAQAogCXN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eCAqY3Vycl9jdHggPSBOVUxMOwogCWludCByZXQgPSAwOwogCisJaWYgKFdBUk5fT04oc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX05BTikpCisJCXJldHVybiAtRU5PVFNVUFA7CisKIAljb25mID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzZGF0YS0+dmlmLmNoYW5jdHhfY29uZiwKIAkJCQkJIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPmNoYW5jdHhfbXR4KSk7CiAKQEAgLTcxOCw2ICs3MjIsNyBAQAogCiAJCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7CiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJCQljb250aW51ZTsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgogCQkJaWYgKCFzZGF0YS0+dS5tZ2QuYXNzb2NpYXRlZCkKQEAgLTk4MCw2ICs5ODUsNyBAQAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJY2FzZSBOVU1fTkw4MDIxMV9JRlRZUEVTOgogCQlXQVJOX09OKDEpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMgYi9uZXQvbWFjODAyMTEvZGVidWdmcy5jCmluZGV4IDI5MDZjMTAuLmY1NmUyZjQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnMuYwpAQCAtNzEsMTM4ICs3MSw0NSBAQAogREVCVUdGU19SRUFET05MWV9GSUxFKHJhdGVfY3RybF9hbGcsICIlcyIsCiAJbG9jYWwtPnJhdGVfY3RybCA/IGxvY2FsLT5yYXRlX2N0cmwtPm9wcy0+bmFtZSA6ICJody9kcml2ZXIiKTsKIAotc3RydWN0IGFxbV9pbmZvIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbDsKLQlzaXplX3Qgc2l6ZTsKLQlzaXplX3QgbGVuOwotCXVuc2lnbmVkIGNoYXIgYnVmWzBdOwotfTsKLQotI2RlZmluZSBBUU1fSERSX0xFTiAyMDAKLSNkZWZpbmUgQVFNX0hXX0VOVFJZX0xFTiA0MAotI2RlZmluZSBBUU1fVFhRX0VOVFJZX0xFTiAxMTAKLQotc3RhdGljIGludCBhcW1fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGlub2RlLT5pX3ByaXZhdGU7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IHR4cV9pbmZvICp0eHFpOwotCXN0cnVjdCBmcSAqZnEgPSAmbG9jYWwtPmZxOwotCXN0cnVjdCBhcW1faW5mbyAqaW5mbyA9IE5VTEw7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IGk7Ci0KLQlpZiAoIWxvY2FsLT5vcHMtPndha2VfdHhfcXVldWUpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCWxlbiArPSBBUU1fSERSX0xFTjsKLQlsZW4gKz0gNiAqIEFRTV9IV19FTlRSWV9MRU47Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkKLQkJbGVuICs9IEFRTV9UWFFfRU5UUllfTEVOOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHN0YSwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkKLQkJbGVuICs9IEFRTV9UWFFfRU5UUllfTEVOICogQVJSQVlfU0laRShzdGEtPnN0YS50eHEpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JaW5mbyA9IHZtYWxsb2MobGVuKTsKLQlpZiAoIWluZm8pCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3Bpbl9sb2NrX2JoKCZsb2NhbC0+ZnEubG9jayk7Ci0JcmN1X3JlYWRfbG9jaygpOwotCi0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5mbzsKLQlpbmZvLT5sb2NhbCA9IGxvY2FsOwotCWluZm8tPnNpemUgPSBsZW47Ci0JbGVuID0gMDsKLQotCWxlbiArPSBzY25wcmludGYoaW5mby0+YnVmICsgbGVuLCBpbmZvLT5zaXplIC0gbGVuLAotCQkJICIqIGh3XG4iCi0JCQkgImFjY2VzcyBuYW1lIHZhbHVlXG4iCi0JCQkgIlIgZnFfZmxvd3NfY250ICV1XG4iCi0JCQkgIlIgZnFfYmFja2xvZyAldVxuIgotCQkJICJSIGZxX292ZXJsaW1pdCAldVxuIgotCQkJICJSIGZxX2NvbGxpc2lvbnMgJXVcbiIKLQkJCSAiUlcgZnFfbGltaXQgJXVcbiIKLQkJCSAiUlcgZnFfcXVhbnR1bSAldVxuIiwKLQkJCSBmcS0+Zmxvd3NfY250LAotCQkJIGZxLT5iYWNrbG9nLAotCQkJIGZxLT5vdmVybGltaXQsCi0JCQkgZnEtPmNvbGxpc2lvbnMsCi0JCQkgZnEtPmxpbWl0LAotCQkJIGZxLT5xdWFudHVtKTsKLQotCWxlbiArPSBzY25wcmludGYoaW5mby0+YnVmICsgbGVuLAotCQkJIGluZm8tPnNpemUgLSBsZW4sCi0JCQkgIiogdmlmXG4iCi0JCQkgImlmbmFtZSBhZGRyIGFjIGJhY2tsb2ctYnl0ZXMgYmFja2xvZy1wYWNrZXRzIGZsb3dzIG92ZXJsaW1pdCBjb2xsaXNpb25zIHR4LWJ5dGVzIHR4LXBhY2tldHNcbiIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgewotCQl0eHFpID0gdG9fdHhxX2luZm8oc2RhdGEtPnZpZi50eHEpOwotCQlsZW4gKz0gc2NucHJpbnRmKGluZm8tPmJ1ZiArIGxlbiwgaW5mby0+c2l6ZSAtIGxlbiwKLQkJCQkgIiVzICVwTSAldSAldSAldSAldSAldSAldSAldSAldVxuIiwKLQkJCQkgc2RhdGEtPm5hbWUsCi0JCQkJIHNkYXRhLT52aWYuYWRkciwKLQkJCQkgdHhxaS0+dHhxLmFjLAotCQkJCSB0eHFpLT50aW4uYmFja2xvZ19ieXRlcywKLQkJCQkgdHhxaS0+dGluLmJhY2tsb2dfcGFja2V0cywKLQkJCQkgdHhxaS0+dGluLmZsb3dzLAotCQkJCSB0eHFpLT50aW4ub3ZlcmxpbWl0LAotCQkJCSB0eHFpLT50aW4uY29sbGlzaW9ucywKLQkJCQkgdHhxaS0+dGluLnR4X2J5dGVzLAotCQkJCSB0eHFpLT50aW4udHhfcGFja2V0cyk7Ci0JfQotCi0JbGVuICs9IHNjbnByaW50ZihpbmZvLT5idWYgKyBsZW4sCi0JCQkgaW5mby0+c2l6ZSAtIGxlbiwKLQkJCSAiKiBzdGFcbiIKLQkJCSAiaWZuYW1lIGFkZHIgdGlkIGFjIGJhY2tsb2ctYnl0ZXMgYmFja2xvZy1wYWNrZXRzIGZsb3dzIG92ZXJsaW1pdCBjb2xsaXNpb25zIHR4LWJ5dGVzIHR4LXBhY2tldHNcbiIpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc3RhLCAmbG9jYWwtPnN0YV9saXN0LCBsaXN0KSB7Ci0JCXNkYXRhID0gc3RhLT5zZGF0YTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhLT5zdGEudHhxKTsgaSsrKSB7Ci0JCQl0eHFpID0gdG9fdHhxX2luZm8oc3RhLT5zdGEudHhxW2ldKTsKLQkJCWxlbiArPSBzY25wcmludGYoaW5mby0+YnVmICsgbGVuLCBpbmZvLT5zaXplIC0gbGVuLAotCQkJCQkgIiVzICVwTSAlZCAlZCAldSAldSAldSAldSAldSAldSAldVxuIiwKLQkJCQkJIHNkYXRhLT5uYW1lLAotCQkJCQkgc3RhLT5zdGEuYWRkciwKLQkJCQkJIHR4cWktPnR4cS50aWQsCi0JCQkJCSB0eHFpLT50eHEuYWMsCi0JCQkJCSB0eHFpLT50aW4uYmFja2xvZ19ieXRlcywKLQkJCQkJIHR4cWktPnRpbi5iYWNrbG9nX3BhY2tldHMsCi0JCQkJCSB0eHFpLT50aW4uZmxvd3MsCi0JCQkJCSB0eHFpLT50aW4ub3ZlcmxpbWl0LAotCQkJCQkgdHhxaS0+dGluLmNvbGxpc2lvbnMsCi0JCQkJCSB0eHFpLT50aW4udHhfYnl0ZXMsCi0JCQkJCSB0eHFpLT50aW4udHhfcGFja2V0cyk7Ci0JCX0KLQl9Ci0KLQlpbmZvLT5sZW4gPSBsZW47Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQlzcGluX3VubG9ja19iaCgmbG9jYWwtPmZxLmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXFtX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JdmZyZWUoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHNzaXplX3QgYXFtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQlzaXplX3QgY291bnQsCiAJCQlsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGFxbV9pbmZvICppbmZvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmcSAqZnEgPSAmbG9jYWwtPmZxOworCWNoYXIgYnVmWzIwMF07CisJaW50IGxlbiA9IDA7CisKKwlzcGluX2xvY2tfYmgoJmxvY2FsLT5mcS5sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlsZW4gPSBzY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJCSJhY2Nlc3MgbmFtZSB2YWx1ZVxuIgorCQkJIlIgZnFfZmxvd3NfY250ICV1XG4iCisJCQkiUiBmcV9iYWNrbG9nICV1XG4iCisJCQkiUiBmcV9vdmVybGltaXQgJXVcbiIKKwkJCSJSIGZxX292ZXJtZW1vcnkgJXVcbiIKKwkJCSJSIGZxX2NvbGxpc2lvbnMgJXVcbiIKKwkJCSJSIGZxX21lbW9yeV91c2FnZSAldVxuIgorCQkJIlJXIGZxX21lbW9yeV9saW1pdCAldVxuIgorCQkJIlJXIGZxX2xpbWl0ICV1XG4iCisJCQkiUlcgZnFfcXVhbnR1bSAldVxuIiwKKwkJCWZxLT5mbG93c19jbnQsCisJCQlmcS0+YmFja2xvZywKKwkJCWZxLT5vdmVybWVtb3J5LAorCQkJZnEtPm92ZXJsaW1pdCwKKwkJCWZxLT5jb2xsaXNpb25zLAorCQkJZnEtPm1lbW9yeV91c2FnZSwKKwkJCWZxLT5tZW1vcnlfbGltaXQsCisJCQlmcS0+bGltaXQsCisJCQlmcS0+cXVhbnR1bSk7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlzcGluX3VubG9ja19iaCgmbG9jYWwtPmZxLmxvY2spOwogCiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywKLQkJCQkgICAgICAgaW5mby0+YnVmLCBpbmZvLT5sZW4pOworCQkJCSAgICAgICBidWYsIGxlbik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFxbV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTIxMCw4ICsxMTcsNyBAQAogCQkJIHNpemVfdCBjb3VudCwKIAkJCSBsb2ZmX3QgKnBwb3MpCiB7Ci0Jc3RydWN0IGFxbV9pbmZvICppbmZvID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaW5mby0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJY2hhciBidWZbMTAwXTsKIAlzaXplX3QgbGVuOwogCkBAIC0yMjgsNiArMTM0LDggQEAKIAogCWlmIChzc2NhbmYoYnVmLCAiZnFfbGltaXQgJXUiLCAmbG9jYWwtPmZxLmxpbWl0KSA9PSAxKQogCQlyZXR1cm4gY291bnQ7CisJZWxzZSBpZiAoc3NjYW5mKGJ1ZiwgImZxX21lbW9yeV9saW1pdCAldSIsICZsb2NhbC0+ZnEubWVtb3J5X2xpbWl0KSA9PSAxKQorCQlyZXR1cm4gY291bnQ7CiAJZWxzZSBpZiAoc3NjYW5mKGJ1ZiwgImZxX3F1YW50dW0gJXUiLCAmbG9jYWwtPmZxLnF1YW50dW0pID09IDEpCiAJCXJldHVybiBjb3VudDsKIApAQCAtMjM3LDggKzE0NSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhcW1fb3BzID0gewogCS53cml0ZSA9IGFxbV93cml0ZSwKIAkucmVhZCA9IGFxbV9yZWFkLAotCS5vcGVuID0gYXFtX29wZW4sCi0JLnJlbGVhc2UgPSBhcW1fcmVsZWFzZSwKKwkub3BlbiA9IHNpbXBsZV9vcGVuLAogCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKIH07CiAKQEAgLTMwMiw2ICsyMDksNyBAQAogCUZMQUcoVVNFU19SU1MpLAogCUZMQUcoVFhfQU1TRFUpLAogCUZMQUcoVFhfRlJBR19MSVNUKSwKKwlGTEFHKFJFUE9SVFNfTE9XX0FDSyksCiAjdW5kZWYgRkxBRwogfTsKIApAQCAtNDI4LDcgKzMzNiw5IEBACiAJREVCVUdGU19BREQoaHdmbGFncyk7CiAJREVCVUdGU19BREQodXNlcl9wb3dlcik7CiAJREVCVUdGU19BREQocG93ZXIpOwotCURFQlVHRlNfQUREX01PREUoYXFtLCAwNjAwKTsKKworCWlmIChsb2NhbC0+b3BzLT53YWtlX3R4X3F1ZXVlKQorCQlERUJVR0ZTX0FERF9NT0RFKGFxbSwgMDYwMCk7CiAKIAlzdGF0c2QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInN0YXRpc3RpY3MiLCBwaHlkKTsKIApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMgYi9uZXQvbWFjODAyMTEvZGVidWdmc19uZXRkZXYuYwppbmRleCBhNWJhNzM5Li5iY2VjMTI0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvZGVidWdmc19uZXRkZXYuYworKysgYi9uZXQvbWFjODAyMTEvZGVidWdmc19uZXRkZXYuYwpAQCAtMzAsNyArMzAsNyBAQAogCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zLAogCXNzaXplX3QgKCpmb3JtYXQpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKiwgY2hhciAqLCBpbnQpKQogewotCWNoYXIgYnVmWzcwXTsKKwljaGFyIGJ1ZlsyMDBdOwogCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKIAogCXJlYWRfbG9jaygmZGV2X2Jhc2VfbG9jayk7CkBAIC00ODYsNiArNDg2LDM4IEBACiB9CiBJRUVFODAyMTFfSUZfRklMRV9SKG51bV9idWZmZXJlZF9tdWx0aWNhc3QpOwogCitzdGF0aWMgc3NpemVfdCBpZWVlODAyMTFfaWZfZm10X2FxbSgKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCB0eHFfaW5mbyAqdHhxaSA9IHRvX3R4cV9pbmZvKHNkYXRhLT52aWYudHhxKTsKKwlpbnQgbGVuOworCisJc3Bpbl9sb2NrX2JoKCZsb2NhbC0+ZnEubG9jayk7CisJcmN1X3JlYWRfbG9jaygpOworCisJbGVuID0gc2NucHJpbnRmKGJ1ZiwKKwkJCWJ1ZmxlbiwKKwkJCSJhYyBiYWNrbG9nLWJ5dGVzIGJhY2tsb2ctcGFja2V0cyBuZXctZmxvd3MgZHJvcHMgbWFya3Mgb3ZlcmxpbWl0IGNvbGxpc2lvbnMgdHgtYnl0ZXMgdHgtcGFja2V0c1xuIgorCQkJIiV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1XG4iLAorCQkJdHhxaS0+dHhxLmFjLAorCQkJdHhxaS0+dGluLmJhY2tsb2dfYnl0ZXMsCisJCQl0eHFpLT50aW4uYmFja2xvZ19wYWNrZXRzLAorCQkJdHhxaS0+dGluLmZsb3dzLAorCQkJdHhxaS0+Y3N0YXRzLmRyb3BfY291bnQsCisJCQl0eHFpLT5jc3RhdHMuZWNuX21hcmssCisJCQl0eHFpLT50aW4ub3ZlcmxpbWl0LAorCQkJdHhxaS0+dGluLmNvbGxpc2lvbnMsCisJCQl0eHFpLT50aW4udHhfYnl0ZXMsCisJCQl0eHFpLT50aW4udHhfcGFja2V0cyk7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlzcGluX3VubG9ja19iaCgmbG9jYWwtPmZxLmxvY2spOworCisJcmV0dXJuIGxlbjsKK30KK0lFRUU4MDIxMV9JRl9GSUxFX1IoYXFtKTsKKwogLyogSUJTUyBhdHRyaWJ1dGVzICovCiBzdGF0aWMgc3NpemVfdCBpZWVlODAyMTFfaWZfZm10X3RzZigKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQpAQCAtNTI0LDkgKzU1NiwxNSBAQAogCQlyZXQgPSBrc3RydG91bGwoYnVmLCAxMCwgJnRzZik7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKLQkJaWYgKHRzZl9pc19kZWx0YSkKLQkJCXRzZiA9IGRydl9nZXRfdHNmKGxvY2FsLCBzZGF0YSkgKyB0c2ZfaXNfZGVsdGEgKiB0c2Y7Ci0JCWlmIChsb2NhbC0+b3BzLT5zZXRfdHNmKSB7CisJCWlmICh0c2ZfaXNfZGVsdGEgJiYgbG9jYWwtPm9wcy0+b2Zmc2V0X3RzZikgeworCQkJZHJ2X29mZnNldF90c2YobG9jYWwsIHNkYXRhLCB0c2ZfaXNfZGVsdGEgKiB0c2YpOworCQkJd2lwaHlfaW5mbyhsb2NhbC0+aHcud2lwaHksCisJCQkJICAgImRlYnVnZnMgb2Zmc2V0IFRTRiBieSAlMDE4bGxkXG4iLAorCQkJCSAgIHRzZl9pc19kZWx0YSAqIHRzZik7CisJCX0gZWxzZSBpZiAobG9jYWwtPm9wcy0+c2V0X3RzZikgeworCQkJaWYgKHRzZl9pc19kZWx0YSkKKwkJCQl0c2YgPSBkcnZfZ2V0X3RzZihsb2NhbCwgc2RhdGEpICsKKwkJCQkgICAgICB0c2ZfaXNfZGVsdGEgKiB0c2Y7CiAJCQlkcnZfc2V0X3RzZihsb2NhbCwgc2RhdGEsIHRzZik7CiAJCQl3aXBoeV9pbmZvKGxvY2FsLT5ody53aXBoeSwKIAkJCQkgICAiZGVidWdmcyBzZXQgVFNGIHRvICUjMDE4bGx4XG4iLCB0c2YpOwpAQCAtNjE4LDYgKzY1Niw5IEBACiAJREVCVUdGU19BREQocmNfcmF0ZWlkeF92aHRfbWNzX21hc2tfMmdoeik7CiAJREVCVUdGU19BREQocmNfcmF0ZWlkeF92aHRfbWNzX21hc2tfNWdoeik7CiAJREVCVUdGU19BREQoaHdfcXVldWVzKTsKKworCWlmIChzZGF0YS0+bG9jYWwtPm9wcy0+d2FrZV90eF9xdWV1ZSkKKwkJREVCVUdGU19BREQoYXFtKTsKIH0KIAogc3RhdGljIHZvaWQgYWRkX3N0YV9maWxlcyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKaW5kZXggZmQzMzQxMy4uYTJmY2RiNCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKQEAgLTEzMyw2ICsxMzMsNTUgQEAKIH0KIFNUQV9PUFMobGFzdF9zZXFfY3RybCk7CiAKKyNkZWZpbmUgQVFNX1RYUV9FTlRSWV9MRU4gMTMwCisKK3N0YXRpYyBzc2l6ZV90IHN0YV9hcW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHN0YS0+bG9jYWw7CisJc2l6ZV90IGJ1ZnN6ID0gQVFNX1RYUV9FTlRSWV9MRU4qKElFRUU4MDIxMV9OVU1fVElEUysxKTsKKwljaGFyICpidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKSwgKnAgPSBidWY7CisJc3RydWN0IHR4cV9pbmZvICp0eHFpOworCXNzaXplX3QgcnY7CisJaW50IGk7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfYmgoJmxvY2FsLT5mcS5sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlwICs9IHNjbnByaW50ZihwLAorCQkgICAgICAgYnVmc3orYnVmLXAsCisJCSAgICAgICAidGlkIGFjIGJhY2tsb2ctYnl0ZXMgYmFja2xvZy1wYWNrZXRzIG5ldy1mbG93cyBkcm9wcyBtYXJrcyBvdmVybGltaXQgY29sbGlzaW9ucyB0eC1ieXRlcyB0eC1wYWNrZXRzXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTlVNX1RJRFM7IGkrKykgeworCQl0eHFpID0gdG9fdHhxX2luZm8oc3RhLT5zdGEudHhxW2ldKTsKKwkJcCArPSBzY25wcmludGYocCwgYnVmc3orYnVmLXAsCisJCQkgICAgICAgIiVkICVkICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1XG4iLAorCQkJICAgICAgIHR4cWktPnR4cS50aWQsCisJCQkgICAgICAgdHhxaS0+dHhxLmFjLAorCQkJICAgICAgIHR4cWktPnRpbi5iYWNrbG9nX2J5dGVzLAorCQkJICAgICAgIHR4cWktPnRpbi5iYWNrbG9nX3BhY2tldHMsCisJCQkgICAgICAgdHhxaS0+dGluLmZsb3dzLAorCQkJICAgICAgIHR4cWktPmNzdGF0cy5kcm9wX2NvdW50LAorCQkJICAgICAgIHR4cWktPmNzdGF0cy5lY25fbWFyaywKKwkJCSAgICAgICB0eHFpLT50aW4ub3ZlcmxpbWl0LAorCQkJICAgICAgIHR4cWktPnRpbi5jb2xsaXNpb25zLAorCQkJICAgICAgIHR4cWktPnRpbi50eF9ieXRlcywKKwkJCSAgICAgICB0eHFpLT50aW4udHhfcGFja2V0cyk7CisJfQorCisJcmN1X3JlYWRfdW5sb2NrKCk7CisJc3Bpbl91bmxvY2tfYmgoJmxvY2FsLT5mcS5sb2NrKTsKKworCXJ2ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcmJ1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcCAtIGJ1Zik7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcnY7Cit9CitTVEFfT1BTKGFxbSk7CisKIHN0YXRpYyBzc2l6ZV90IHN0YV9hZ2dfc3RhdHVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyYnVmLAogCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTQ3OCw2ICs1MjcsOSBAQAogCURFQlVHRlNfQUREX0NPVU5URVIocnhfZnJhZ21lbnRzLCByeF9zdGF0cy5mcmFnbWVudHMpOwogCURFQlVHRlNfQUREX0NPVU5URVIodHhfZmlsdGVyZWQsIHN0YXR1c19zdGF0cy5maWx0ZXJlZCk7CiAKKwlpZiAobG9jYWwtPm9wcy0+d2FrZV90eF9xdWV1ZSkKKwkJREVCVUdGU19BREQoYXFtKTsKKwogCWlmIChzaXplb2Yoc3RhLT5kcml2ZXJfYnVmZmVyZWRfdGlkcykgPT0gc2l6ZW9mKHUzMikpCiAJCWRlYnVnZnNfY3JlYXRlX3gzMigiZHJpdmVyX2J1ZmZlcmVkX3RpZHMiLCAwNDAwLAogCQkJCSAgIHN0YS0+ZGVidWdmc19kaXIsCkBAIC00OTIsMTAgKzU0NCw2IEBACiAKIHZvaWQgaWVlZTgwMjExX3N0YV9kZWJ1Z2ZzX3JlbW92ZShzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHN0YS0+bG9jYWw7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBzdGEtPnNkYXRhOwotCi0JZHJ2X3N0YV9yZW1vdmVfZGVidWdmcyhsb2NhbCwgc2RhdGEsICZzdGEtPnN0YSwgc3RhLT5kZWJ1Z2ZzX2Rpcik7CiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHN0YS0+ZGVidWdmc19kaXIpOwogCXN0YS0+ZGVidWdmc19kaXIgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuYyBiL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmMKaW5kZXggYzI1OGYxMC4uYmI4ODZlNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuYworKysgYi9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5jCkBAIC02Miw3ICs2Miw3IEBACiAJaWYgKFdBUk5fT04oc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gfHwKIAkJICAgIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJgogCQkgICAgICFpZWVlODAyMTFfaHdfY2hlY2soJmxvY2FsLT5odywgV0FOVF9NT05JVE9SX1ZJRikgJiYKLQkJICAgICAhKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSkpKQorCQkgICAgICEoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJdHJhY2VfZHJ2X2FkZF9pbnRlcmZhY2UobG9jYWwsIHNkYXRhKTsKQEAgLTIxNSw2ICsyMTUsMjEgQEAKIAl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOwogfQogCit2b2lkIGRydl9vZmZzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSAgICBzNjQgb2Zmc2V0KQoreworCW1pZ2h0X3NsZWVwKCk7CisKKwlpZiAoIWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSkpCisJCXJldHVybjsKKworCXRyYWNlX2Rydl9vZmZzZXRfdHNmKGxvY2FsLCBzZGF0YSwgb2Zmc2V0KTsKKwlpZiAobG9jYWwtPm9wcy0+b2Zmc2V0X3RzZikKKwkJbG9jYWwtPm9wcy0+b2Zmc2V0X3RzZigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgb2Zmc2V0KTsKKwl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOworfQorCiB2b2lkIGRydl9yZXNldF90c2Yoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaCBiL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmgKaW5kZXggYmE1ZmMxZi4uMDlmNzdlNCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaAorKysgYi9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oCkBAIC0xNjIsNyArMTYyLDkgQEAKIAkJcmV0dXJuOwogCiAJaWYgKFdBUk5fT05fT05DRShzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSB8fAotCQkJIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKSkKKwkJCSBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOIHx8CisJCQkgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SICYmCisJCQkgICFzZGF0YS0+dmlmLm11X21pbW9fb3duZXIpKSkKIAkJcmV0dXJuOwogCiAJaWYgKCFjaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpKQpAQCAtNDk4LDIxICs1MDAsNiBAQAogCQlsb2NhbC0+b3BzLT5zdGFfYWRkX2RlYnVnZnMoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsCiAJCQkJCSAgICBzdGEsIGRpcik7CiB9Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkcnZfc3RhX3JlbW92ZV9kZWJ1Z2ZzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkJCSAgc3RydWN0IGRlbnRyeSAqZGlyKQotewotCW1pZ2h0X3NsZWVwKCk7Ci0KLQlzZGF0YSA9IGdldF9ic3Nfc2RhdGEoc2RhdGEpOwotCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7Ci0KLQlpZiAobG9jYWwtPm9wcy0+c3RhX3JlbW92ZV9kZWJ1Z2ZzKQotCQlsb2NhbC0+b3BzLT5zdGFfcmVtb3ZlX2RlYnVnZnMoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsCi0JCQkJCSAgICAgICBzdGEsIGRpcik7Ci19CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSB2b2lkIGRydl9zdGFfcHJlX3JjdV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCkBAIC01ODIsNiArNTY5LDkgQEAKIHZvaWQgZHJ2X3NldF90c2Yoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJIHU2NCB0c2YpOwordm9pZCBkcnZfb2Zmc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkgICAgczY0IG9mZnNldCk7CiB2b2lkIGRydl9yZXNldF90c2Yoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIApAQCAtMTA4OCwxMyArMTA3OCwxMyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBkcnZfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCisJCQkJCSAgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewogCXUzMiByZXQgPSAwOwogCi0JdHJhY2VfZHJ2X2dldF9leHBlY3RlZF90aHJvdWdocHV0KHN0YSk7Ci0JaWYgKGxvY2FsLT5vcHMtPmdldF9leHBlY3RlZF90aHJvdWdocHV0KQotCQlyZXQgPSBsb2NhbC0+b3BzLT5nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCgmbG9jYWwtPmh3LCBzdGEpOworCXRyYWNlX2Rydl9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCgmc3RhLT5zdGEpOworCWlmIChsb2NhbC0+b3BzLT5nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCAmJiBzdGEtPnVwbG9hZGVkKQorCQlyZXQgPSBsb2NhbC0+b3BzLT5nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCgmbG9jYWwtPmh3LCAmc3RhLT5zdGEpOwogCXRyYWNlX2Rydl9yZXR1cm5fdTMyKGxvY2FsLCByZXQpOwogCiAJcmV0dXJuIHJldDsKQEAgLTExNzksNCArMTE2OSw4MyBAQAogCWxvY2FsLT5vcHMtPndha2VfdHhfcXVldWUoJmxvY2FsLT5odywgJnR4cS0+dHhxKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgZHJ2X3N0YXJ0X25hbihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgKmNvbmYpCit7CisJaW50IHJldDsKKworCW1pZ2h0X3NsZWVwKCk7CisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKworCXRyYWNlX2Rydl9zdGFydF9uYW4obG9jYWwsIHNkYXRhLCBjb25mKTsKKwlyZXQgPSBsb2NhbC0+b3BzLT5zdGFydF9uYW4oJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIGNvbmYpOworCXRyYWNlX2Rydl9yZXR1cm5faW50KGxvY2FsLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcnZfc3RvcF9uYW4oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCit7CisJbWlnaHRfc2xlZXAoKTsKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCisJdHJhY2VfZHJ2X3N0b3BfbmFuKGxvY2FsLCBzZGF0YSk7CisJbG9jYWwtPm9wcy0+c3RvcF9uYW4oJmxvY2FsLT5odywgJnNkYXRhLT52aWYpOworCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRydl9uYW5fY2hhbmdlX2NvbmYoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgKmNvbmYsCisJCQkJICAgICAgIHUzMiBjaGFuZ2VzKQoreworCWludCByZXQ7CisKKwltaWdodF9zbGVlcCgpOworCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKKwlpZiAoIWxvY2FsLT5vcHMtPm5hbl9jaGFuZ2VfY29uZikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJdHJhY2VfZHJ2X25hbl9jaGFuZ2VfY29uZihsb2NhbCwgc2RhdGEsIGNvbmYsIGNoYW5nZXMpOworCXJldCA9IGxvY2FsLT5vcHMtPm5hbl9jaGFuZ2VfY29uZigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgY29uZiwKKwkJCQkJICBjaGFuZ2VzKTsKKwl0cmFjZV9kcnZfcmV0dXJuX2ludChsb2NhbCwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRydl9hZGRfbmFuX2Z1bmMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgY29uc3Qgc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpuYW5fZnVuYykKK3sKKwlpbnQgcmV0OworCisJbWlnaHRfc2xlZXAoKTsKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCisJaWYgKCFsb2NhbC0+b3BzLT5hZGRfbmFuX2Z1bmMpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXRyYWNlX2Rydl9hZGRfbmFuX2Z1bmMobG9jYWwsIHNkYXRhLCBuYW5fZnVuYyk7CisJcmV0ID0gbG9jYWwtPm9wcy0+YWRkX25hbl9mdW5jKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCBuYW5fZnVuYyk7CisJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X2RlbF9uYW5fZnVuYyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICB1OCBpbnN0YW5jZV9pZCkKK3sKKwltaWdodF9zbGVlcCgpOworCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKKwl0cmFjZV9kcnZfZGVsX25hbl9mdW5jKGxvY2FsLCBzZGF0YSwgaW5zdGFuY2VfaWQpOworCWlmIChsb2NhbC0+b3BzLT5kZWxfbmFuX2Z1bmMpCisJCWxvY2FsLT5vcHMtPmRlbF9uYW5fZnVuYygmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgaW5zdGFuY2VfaWQpOworCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7Cit9CisKICNlbmRpZiAvKiBfX01BQzgwMjExX0RSSVZFUl9PUFMgKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oIGIvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKaW5kZXggZjU2ZDM0Mi4uMzRjMmFkZCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKKysrIGIvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKQEAgLTMsNyArMyw3IEBACiAgKiBDb3B5cmlnaHQgMjAwNSwgRGV2aWNlc2NhcGUgU29mdHdhcmUsIEluYy4KICAqIENvcHlyaWdodCAyMDA2LTIwMDcJSmlyaSBCZW5jIDxqYmVuY0BzdXNlLmN6PgogICogQ29weXJpZ2h0IDIwMDctMjAxMAlKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgotICogQ29weXJpZ2h0IDIwMTMtMjAxNCAgSW50ZWwgTW9iaWxlIENvbW11bmljYXRpb25zIEdtYkgKKyAqIENvcHlyaWdodCAyMDEzLTIwMTUgIEludGVsIE1vYmlsZSBDb21tdW5pY2F0aW9ucyBHbWJICiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCkBAIC04Niw2ICs4Niw4IEBACiAKICNkZWZpbmUgSUVFRTgwMjExX0RFQVVUSF9GUkFNRV9MRU4JKDI0IC8qIGhkciAqLyArIDIgLyogcmVhc29uICovKQogCisjZGVmaW5lIElFRUU4MDIxMV9NQVhfTkFOX0lOU1RBTkNFX0lEIDI1NQorCiBzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdtZW50X2VudHJ5IHsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHNrYl9saXN0OwogCXVuc2lnbmVkIGxvbmcgZmlyc3RfZnJhZ190aW1lOwpAQCAtODEzLDE3ICs4MTUsMzkgQEAKICAqIEBkZWZfZmxvdzogdXNlZCBhcyBhIGZhbGxiYWNrIGZsb3cgd2hlbiBhIHBhY2tldCBkZXN0aW5lZCB0byBAdGluIGhhc2hlcyB0bwogICoJYSBmcV9mbG93IHdoaWNoIGlzIGFscmVhZHkgb3duZWQgYnkgYSBkaWZmZXJlbnQgdGluCiAgKiBAZGVmX2N2YXJzOiBjb2RlbCB2YXJzIGZvciBAZGVmX2Zsb3cKKyAqIEBmcmFnczogdXNlZCB0byBrZWVwIGZyYWdtZW50cyBjcmVhdGVkIGFmdGVyIGRlcXVldWUKICAqLwogc3RydWN0IHR4cV9pbmZvIHsKIAlzdHJ1Y3QgZnFfdGluIHRpbjsKIAlzdHJ1Y3QgZnFfZmxvdyBkZWZfZmxvdzsKIAlzdHJ1Y3QgY29kZWxfdmFycyBkZWZfY3ZhcnM7CisJc3RydWN0IGNvZGVsX3N0YXRzIGNzdGF0czsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGZyYWdzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBrZWVwIGxhc3QhICovCiAJc3RydWN0IGllZWU4MDIxMV90eHEgdHhxOwogfTsKIAorc3RydWN0IGllZWU4MDIxMV9pZl9tbnRyIHsKKwl1MzIgZmxhZ3M7CisJdTggbXVfZm9sbG93X2FkZHJbRVRIX0FMRU5dIF9fYWxpZ25lZCgyKTsKK307CisKKy8qKgorICogc3RydWN0IGllZWU4MDIxMV9pZl9uYW4gLSBOQU4gc3RhdGUKKyAqCisgKiBAY29uZjogY3VycmVudCBOQU4gY29uZmlndXJhdGlvbgorICogQGZ1bmNfaWRzOiBhIGJpdG1hcCBvZiBhdmFpbGFibGUgaW5zdGFuY2VfaWQncworICovCitzdHJ1Y3QgaWVlZTgwMjExX2lmX25hbiB7CisJc3RydWN0IGNmZzgwMjExX25hbl9jb25mIGNvbmY7CisKKwkvKiBwcm90ZWN0cyBmdW5jdGlvbl9pbnN0X2lkcyAqLworCXNwaW5sb2NrX3QgZnVuY19sb2NrOworCXN0cnVjdCBpZHIgZnVuY3Rpb25faW5zdF9pZHM7Cit9OworCiBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKQEAgLTkyMiw3ICs5NDYsOCBAQAogCQlzdHJ1Y3QgaWVlZTgwMjExX2lmX2lic3MgaWJzczsKIAkJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoIG1lc2g7CiAJCXN0cnVjdCBpZWVlODAyMTFfaWZfb2NiIG9jYjsKLQkJdTMyIG1udHJfZmxhZ3M7CisJCXN0cnVjdCBpZWVlODAyMTFfaWZfbW50ciBtbnRyOworCQlzdHJ1Y3QgaWVlZTgwMjExX2lmX25hbiBuYW47CiAJfSB1OwogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKQEAgLTExMTIsNyArMTEzNyw2IEBACiAJc3RydWN0IGZxIGZxOwogCXN0cnVjdCBjb2RlbF92YXJzICpjdmFyczsKIAlzdHJ1Y3QgY29kZWxfcGFyYW1zIGNwYXJhbXM7Ci0Jc3RydWN0IGNvZGVsX3N0YXRzIGNzdGF0czsKIAogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzICpvcHM7CiAKQEAgLTEyMDgsNyArMTIzMiw3IEBACiAJc3BpbmxvY2tfdCB0aW1fbG9jazsKIAl1bnNpZ25lZCBsb25nIG51bV9zdGE7CiAJc3RydWN0IGxpc3RfaGVhZCBzdGFfbGlzdDsKLQlzdHJ1Y3Qgcmhhc2h0YWJsZSBzdGFfaGFzaDsKKwlzdHJ1Y3QgcmhsdGFibGUgc3RhX2hhc2g7CiAJc3RydWN0IHRpbWVyX2xpc3Qgc3RhX2NsZWFudXA7CiAJaW50IHN0YV9nZW5lcmF0aW9uOwogCkBAIC0xNDc2LDYgKzE1MDAsMTMgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKHR4cSwgc3RydWN0IHR4cV9pbmZvLCB0eHEpOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgdHhxX2hhc19xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqdHhxKQoreworCXN0cnVjdCB0eHFfaW5mbyAqdHhxaSA9IHRvX3R4cV9pbmZvKHR4cSk7CisKKwlyZXR1cm4gIShza2JfcXVldWVfZW1wdHkoJnR4cWktPmZyYWdzKSAmJiAhdHhxaS0+dGluLmJhY2tsb2dfcGFja2V0cyk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9ic3NpZF9tYXRjaChjb25zdCB1OCAqcmFkZHIsIGNvbnN0IHU4ICphZGRyKQogewogCXJldHVybiBldGhlcl9hZGRyX2VxdWFsKHJhZGRyLCBhZGRyKSB8fApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2lmYWNlLmMgYi9uZXQvbWFjODAyMTEvaWZhY2UuYwppbmRleCBiMTIzYTllLi42MzhlYzA3IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvaWZhY2UuYworKysgYi9uZXQvbWFjODAyMTEvaWZhY2UuYwpAQCAtNDMsNiArNDMsOCBAQAogICogYnkgZWl0aGVyIHRoZSBSVE5MLCB0aGUgaWZsaXN0X210eCBvciBSQ1UuCiAgKi8KIAorc3RhdGljIHZvaWQgaWVlZTgwMjExX2lmYWNlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKwogYm9vbCBfX2llZWU4MDIxMV9yZWNhbGNfdHhwb3dlcihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY2hhbmN0eF9jb25mOwpAQCAtMTg4LDcgKzE5MCw3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoaXRlci0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJgotCQkgICAgIShpdGVyLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSkKKwkJICAgICEoaXRlci0+dS5tbnRyLmZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkpCiAJCQljb250aW51ZTsKIAogCQltID0gaXRlci0+dmlmLmFkZHI7CkBAIC0yMTcsNyArMjE5LDcgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJgotCSAgICAhKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSkKKwkgICAgIShzZGF0YS0+dS5tbnRyLmZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkpCiAJCWNoZWNrX2R1cCA9IGZhbHNlOwogCiAJcmV0ID0gaWVlZTgwMjExX3ZlcmlmeV9tYWMoc2RhdGEsIHNhLT5zYV9kYXRhLCBjaGVja19kdXApOwpAQCAtMzI1LDYgKzMyNyw5IEBACiAJaW50IG5fcXVldWVzID0gc2RhdGEtPmxvY2FsLT5ody5xdWV1ZXM7CiAJaW50IGk7CiAKKwlpZiAoaWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTikKKwkJcmV0dXJuIDA7CisKIAlpZiAoaWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpIHsKIAkJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9OVU1fQUNTOyBpKyspIHsKIAkJCWlmIChXQVJOX09OX09OQ0Uoc2RhdGEtPnZpZi5od19xdWV1ZVtpXSA9PQpAQCAtMzU3LDcgKzM2Miw3IEBACiAJCQkJICAgIGNvbnN0IGludCBvZmZzZXQpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7Ci0JdTMyIGZsYWdzID0gc2RhdGEtPnUubW50cl9mbGFnczsKKwl1MzIgZmxhZ3MgPSBzZGF0YS0+dS5tbnRyLmZsYWdzOwogCiAjZGVmaW5lIEFESlVTVChfZiwgX3MpCWRvIHsJCQkJCVwKIAlpZiAoZmxhZ3MgJiBNT05JVE9SX0ZMQUdfIyNfZikJCQkJXApAQCAtNDQ4LDYgKzQ1Myw5IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2RhdGEtPnNrYl9xdWV1ZSk7CisJSU5JVF9XT1JLKCZzZGF0YS0+d29yaywgaWVlZTgwMjExX2lmYWNlX3dvcmspOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTU0MCw2ICs1NDgsNyBAQAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfT0NCOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCQkvKiBubyBzcGVjaWFsIHRyZWF0bWVudCAqLwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOgpAQCAtNTg5LDEyICs1OTgsMTIgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6Ci0JCWlmIChzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0NPT0tfRlJBTUVTKSB7CisJCWlmIChzZGF0YS0+dS5tbnRyLmZsYWdzICYgTU9OSVRPUl9GTEFHX0NPT0tfRlJBTUVTKSB7CiAJCQlsb2NhbC0+Y29va2VkX21udHJzKys7CiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkgeworCQlpZiAoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpIHsKIAkJCXJlcyA9IGRydl9hZGRfaW50ZXJmYWNlKGxvY2FsLCBzZGF0YSk7CiAJCQlpZiAocmVzKQogCQkJCWdvdG8gZXJyX3N0b3A7CkBAIC02NDEsNyArNjUwLDggQEAKIAkJCWxvY2FsLT5maWZfcHJvYmVfcmVxKys7CiAJCX0KIAotCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpCisJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSAmJgorCQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX05BTikKIAkJCWNoYW5nZWQgfD0gaWVlZTgwMjExX3Jlc2V0X2VycF9pbmZvKHNkYXRhKTsKIAkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIGNoYW5nZWQpOwogCkBAIC02NTUsNiArNjY1LDcgQEAKIAkJCWJyZWFrOwogCQljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgorCQljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJLyogbm90IHJlYWNoZWQgKi8KQEAgLTc4Nyw2ICs3OTgsNyBAQAogCXN0cnVjdCBwc19kYXRhICpwczsKIAlzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgY2hhbmRlZjsKIAlib29sIGNhbmNlbF9zY2FuOworCXN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqZnVuYzsKIAogCWNsZWFyX2JpdChTREFUQV9TVEFURV9SVU5OSU5HLCAmc2RhdGEtPnN0YXRlKTsKIApAQCAtOTI2LDcgKzkzOCw3IEBACiAJCS8qIG5vIG5lZWQgdG8gdGVsbCBkcml2ZXIgKi8KIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgotCQlpZiAoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykgeworCQlpZiAoc2RhdGEtPnUubW50ci5mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykgewogCQkJbG9jYWwtPmNvb2tlZF9tbnRycy0tOwogCQkJYnJlYWs7CiAJCX0KQEAgLTkzOSw2ICs5NTEsMTggQEAKIAogCQlpZWVlODAyMTFfYWRqdXN0X21vbml0b3JfZmxhZ3Moc2RhdGEsIC0xKTsKIAkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CisJCS8qIGNsZWFuIGFsbCB0aGUgZnVuY3Rpb25zICovCisJCXNwaW5fbG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisKKwkJaWRyX2Zvcl9lYWNoX2VudHJ5KCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMsIGZ1bmMsIGkpIHsKKwkJCWlkcl9yZW1vdmUoJnNkYXRhLT51Lm5hbi5mdW5jdGlvbl9pbnN0X2lkcywgaSk7CisJCQljZmc4MDIxMV9mcmVlX25hbl9mdW5jKGZ1bmMpOworCQl9CisJCWlkcl9kZXN0cm95KCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMpOworCisJCXNwaW5fdW5sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKwkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgogCQkvKiByZWxpZXMgb24gc3luY2hyb25pemVfcmN1KCkgYmVsb3cgKi8KIAkJUkNVX0lOSVRfUE9JTlRFUihsb2NhbC0+cDJwX3NkYXRhLCBOVUxMKTsKQEAgLTEwMTIsNyArMTAzNiw3IEBACiAJCWllZWU4MDIxMV9yZWNhbGNfaWRsZShsb2NhbCk7CiAJCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CiAKLQkJaWYgKCEoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpKQorCQlpZiAoIShzZGF0YS0+dS5tbnRyLmZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkpCiAJCQlicmVhazsKIAogCQkvKiBmYWxsIHRocm91Z2ggKi8KQEAgLTE0NDQsMTIgKzE0NjgsMTcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CiAJCXNkYXRhLT5kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExX1JBRElPVEFQOwogCQlzZGF0YS0+ZGV2LT5uZXRkZXZfb3BzID0gJmllZWU4MDIxMV9tb25pdG9yaWZfb3BzOwotCQlzZGF0YS0+dS5tbnRyX2ZsYWdzID0gTU9OSVRPUl9GTEFHX0NPTlRST0wgfAorCQlzZGF0YS0+dS5tbnRyLmZsYWdzID0gTU9OSVRPUl9GTEFHX0NPTlRST0wgfAogCQkJCSAgICAgIE1PTklUT1JfRkxBR19PVEhFUl9CU1M7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgogCQlzZGF0YS0+dmlmLmJzc19jb25mLmJzc2lkID0gTlVMTDsKIAkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CisJCWlkcl9pbml0KCZzZGF0YS0+dS5uYW4uZnVuY3Rpb25faW5zdF9pZHMpOworCQlzcGluX2xvY2tfaW5pdCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisJCXNkYXRhLT52aWYuYnNzX2NvbmYuYnNzaWQgPSBzZGF0YS0+dmlmLmFkZHI7CisJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CiAJCXNkYXRhLT52aWYuYnNzX2NvbmYuYnNzaWQgPSBzZGF0YS0+dmlmLmFkZHI7CkBAIC0xNzE3LDcgKzE3NDYsNyBAQAogCiAJQVNTRVJUX1JUTkwoKTsKIAotCWlmICh0eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpIHsKKwlpZiAodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFIHx8IHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOKSB7CiAJCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CiAKIAkJc2RhdGEgPSBremFsbG9jKHNpemVvZigqc2RhdGEpICsgbG9jYWwtPmh3LnZpZl9kYXRhX3NpemUsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWFpbi5jIGIvbmV0L21hYzgwMjExL21haW4uYwppbmRleCBkMDBlYTliLi4xMDc1YWMyIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWFpbi5jCisrKyBiL25ldC9tYWM4MDIxMS9tYWluLmMKQEAgLTY2MCw2ICs2NjAsOSBAQAogCiAJaWVlZTgwMjExX3JvY19zZXR1cChsb2NhbCk7CiAKKwlsb2NhbC0+aHcucmFkaW90YXBfdGltZXN0YW1wLnVuaXRzX3BvcyA9IC0xOworCWxvY2FsLT5ody5yYWRpb3RhcF90aW1lc3RhbXAuYWNjdXJhY3kgPSAtMTsKKwogCXJldHVybiAmbG9jYWwtPmh3OwogIGVycl9mcmVlOgogCXdpcGh5X2ZyZWUod2lwaHkpOwpAQCAtODE4LDYgKzgyMSwxMSBAQAogCSAgICAgIWxvY2FsLT5vcHMtPnRkbHNfcmVjdl9jaGFubmVsX3N3aXRjaCkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAorCWlmIChXQVJOX09OKGxvY2FsLT5ody53aXBoeS0+aW50ZXJmYWNlX21vZGVzICYKKwkJCUJJVChOTDgwMjExX0lGVFlQRV9OQU4pICYmCisJCSAgICAoIWxvY2FsLT5vcHMtPnN0YXJ0X25hbiB8fCAhbG9jYWwtPm9wcy0+c3RvcF9uYW4pKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKICNpZmRlZiBDT05GSUdfUE0KIAlpZiAoaHctPndpcGh5LT53b3dsYW4gJiYgKCFsb2NhbC0+b3BzLT5zdXNwZW5kIHx8ICFsb2NhbC0+b3BzLT5yZXN1bWUpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwNTUsNiArMTA2Myw5IEBACiAKIAlsb2NhbC0+ZHluYW1pY19wc19mb3JjZWRfdGltZW91dCA9IC0xOwogCisJaWYgKCFsb2NhbC0+aHcubWF4X25hbl9kZV9lbnRyaWVzKQorCQlsb2NhbC0+aHcubWF4X25hbl9kZV9lbnRyaWVzID0gSUVFRTgwMjExX01BWF9OQU5fSU5TVEFOQ0VfSUQ7CisKIAlyZXN1bHQgPSBpZWVlODAyMTFfd2VwX2luaXQobG9jYWwpOwogCWlmIChyZXN1bHQgPCAwKQogCQl3aXBoeV9kZWJ1Zyhsb2NhbC0+aHcud2lwaHksICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB3ZXA6ICVkXG4iLApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jIGIvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCmluZGV4IDhmOWMzYmQuLmI3NDdjOTYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKQEAgLTMyNiwyMiArMzI2LDMzIEBACiAJdTMyIHR4X3RpbWUsIGVzdGltYXRlZF9yZXR4OwogCXU2NCByZXN1bHQ7CiAKLQlpZiAoc3RhLT5tZXNoLT5mYWlsX2F2ZyA+PSAxMDApCi0JCXJldHVybiBNQVhfTUVUUklDOworCS8qIFRyeSB0byBnZXQgcmF0ZSBiYXNlZCBvbiBIVy9TVyBSQyBhbGdvcml0aG0uCisJICogUmF0ZSBpcyByZXR1cm5lZCBpbiB1bml0cyBvZiBLYnBzLCBjb3JyZWN0IHRoaXMKKwkgKiB0byBjb21wbHkgd2l0aCBhaXJ0aW1lIGNhbGN1bGF0aW9uIHVuaXRzCisJICogUm91bmQgdXAgaW4gY2FzZSB3ZSBnZXQgcmF0ZSA8IDEwMEticHMKKwkgKi8KKwlyYXRlID0gRElWX1JPVU5EX1VQKHN0YV9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdGEpLCAxMDApOwogCi0Jc3RhX3NldF9yYXRlX2luZm9fdHgoc3RhLCAmc3RhLT50eF9zdGF0cy5sYXN0X3JhdGUsICZyaW5mbyk7Ci0JcmF0ZSA9IGNmZzgwMjExX2NhbGN1bGF0ZV9iaXRyYXRlKCZyaW5mbyk7Ci0JaWYgKFdBUk5fT04oIXJhdGUpKQotCQlyZXR1cm4gTUFYX01FVFJJQzsKKwlpZiAocmF0ZSkgeworCQllcnIgPSAwOworCX0gZWxzZSB7CisJCWlmIChzdGEtPm1lc2gtPmZhaWxfYXZnID49IDEwMCkKKwkJCXJldHVybiBNQVhfTUVUUklDOwogCi0JZXJyID0gKHN0YS0+bWVzaC0+ZmFpbF9hdmcgPDwgQVJJVEhfU0hJRlQpIC8gMTAwOworCQlzdGFfc2V0X3JhdGVfaW5mb190eChzdGEsICZzdGEtPnR4X3N0YXRzLmxhc3RfcmF0ZSwgJnJpbmZvKTsKKwkJcmF0ZSA9IGNmZzgwMjExX2NhbGN1bGF0ZV9iaXRyYXRlKCZyaW5mbyk7CisJCWlmIChXQVJOX09OKCFyYXRlKSkKKwkJCXJldHVybiBNQVhfTUVUUklDOworCisJCWVyciA9IChzdGEtPm1lc2gtPmZhaWxfYXZnIDw8IEFSSVRIX1NISUZUKSAvIDEwMDsKKwl9CiAKIAkvKiBiaXRyYXRlIGlzIGluIHVuaXRzIG9mIDEwMCBLYnBzLCB3aGlsZSB3ZSBuZWVkIHJhdGUgaW4gdW5pdHMgb2YKIAkgKiAxTWJwcy4gVGhpcyB3aWxsIGJlIGNvcnJlY3RlZCBvbiB0eF90aW1lIGNvbXB1dGF0aW9uLgogCSAqLwogCXR4X3RpbWUgPSAoZGV2aWNlX2NvbnN0YW50ICsgMTAgKiB0ZXN0X2ZyYW1lX2xlbiAvIHJhdGUpOwogCWVzdGltYXRlZF9yZXR4ID0gKCgxIDw8ICgyICogQVJJVEhfU0hJRlQpKSAvIChzX3VuaXQgLSBlcnIpKTsKLQlyZXN1bHQgPSAodHhfdGltZSAqIGVzdGltYXRlZF9yZXR4KSA+PiAoMiAqIEFSSVRIX1NISUZUKSA7CisJcmVzdWx0ID0gKHR4X3RpbWUgKiBlc3RpbWF0ZWRfcmV0eCkgPj4gKDIgKiBBUklUSF9TSElGVCk7CiAJcmV0dXJuICh1MzIpcmVzdWx0OwogfQogCkBAIC03NDYsNiArNzU3LDcgQEAKIAkJc3RhID0gbmV4dF9ob3BfZGVyZWZfcHJvdGVjdGVkKG1wYXRoKTsKIAkJaWYgKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9BQ1RJVkUgJiYKIAkJICAgIGV0aGVyX2FkZHJfZXF1YWwodGEsIHN0YS0+c3RhLmFkZHIpICYmCisJCSAgICAhKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9GSVhFRCkgJiYKIAkJICAgICghKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9TTl9WQUxJRCkgfHwKIAkJICAgIFNOX0dUKHRhcmdldF9zbiwgbXBhdGgtPnNuKSAgfHwgdGFyZ2V0X3NuID09IDApKSB7CiAJCQltcGF0aC0+ZmxhZ3MgJj0gfk1FU0hfUEFUSF9BQ1RJVkU7CkBAIC0xMDEyLDcgKzEwMjQsNyBAQAogCQlnb3RvIGVuZGRpc2NvdmVyeTsKIAogCXNwaW5fbG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwotCWlmIChtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfREVMRVRFRCkgeworCWlmIChtcGF0aC0+ZmxhZ3MgJiAoTUVTSF9QQVRIX0RFTEVURUQgfCBNRVNIX1BBVEhfRklYRUQpKSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJCWdvdG8gZW5kZGlzY292ZXJ5OwogCX0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYyBiL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYwppbmRleCA2ZGIyZGRmLi5mMGU2MTc1IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jCkBAIC04MjYsNyArODI2LDcgQEAKIAltcGF0aC0+bWV0cmljID0gMDsKIAltcGF0aC0+aG9wX2NvdW50ID0gMDsKIAltcGF0aC0+ZXhwX3RpbWUgPSAwOwotCW1wYXRoLT5mbGFncyB8PSBNRVNIX1BBVEhfRklYRUQ7CisJbXBhdGgtPmZsYWdzID0gTUVTSF9QQVRIX0ZJWEVEIHwgTUVTSF9QQVRIX1NOX1ZBTElEOwogCW1lc2hfcGF0aF9hY3RpdmF0ZShtcGF0aCk7CiAJc3Bpbl91bmxvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKIAltZXNoX3BhdGhfdHhfcGVuZGluZyhtcGF0aCk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaF9zeW5jLmMgYi9uZXQvbWFjODAyMTEvbWVzaF9zeW5jLmMKaW5kZXggNjRiYzIyYS4uZmFjYTIyYyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2hfc3luYy5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoX3N5bmMuYwpAQCAtMjgsNyArMjgsNyBAQAogICogY291bGQgYmUsIGZvciBpbnN0YW5jZSwgaW4gY2FzZSBhIG5laWdoYm9yIGlzIHJlc3RhcnRlZCBhbmQgaXRzIFRTRiBjb3VudGVyCiAgKiByZXNldC4KICAqLwotI2RlZmluZSBUT0ZGU0VUX01BWElNVU1fQURKVVNUTUVOVCAzMDAwMAkJLyogMzAgbXMgKi8KKyNkZWZpbmUgVE9GRlNFVF9NQVhJTVVNX0FESlVTVE1FTlQgODAwCQkvKiAwLjggbXMgKi8KIAogc3RydWN0IHN5bmNfbWV0aG9kIHsKIAl1OCBtZXRob2Q7CkBAIC03MCw5ICs3MCwxMyBAQAogCX0KIAlzcGluX3VubG9ja19iaCgmaWZtc2gtPnN5bmNfb2Zmc2V0X2xvY2spOwogCi0JdHNmID0gZHJ2X2dldF90c2YobG9jYWwsIHNkYXRhKTsKLQlpZiAodHNmICE9IC0xVUxMKQotCQlkcnZfc2V0X3RzZihsb2NhbCwgc2RhdGEsIHRzZiArIHRzZmRlbHRhKTsKKwlpZiAobG9jYWwtPm9wcy0+b2Zmc2V0X3RzZikgeworCQlkcnZfb2Zmc2V0X3RzZihsb2NhbCwgc2RhdGEsIHRzZmRlbHRhKTsKKwl9IGVsc2UgeworCQl0c2YgPSBkcnZfZ2V0X3RzZihsb2NhbCwgc2RhdGEpOworCQlpZiAodHNmICE9IC0xVUxMKQorCQkJZHJ2X3NldF90c2YobG9jYWwsIHNkYXRhLCB0c2YgKyB0c2ZkZWx0YSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBtZXNoX3N5bmNfb2Zmc2V0X3J4X2Jjbl9wcmVzcChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tbG1lLmMgYi9uZXQvbWFjODAyMTEvbWxtZS5jCmluZGV4IDhkNDI2ZjYuLjc0ODZmMmQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tbG1lLmMKKysrIGIvbmV0L21hYzgwMjExL21sbWUuYwpAQCAtMTY3MiwxMSArMTY3MiwxNSBAQAogCQkJICAgICBub25fYWNtX2FjKyspCiAJCQkJaWYgKCEoc2RhdGEtPndtbV9hY20gJiBCSVQoNyAtIDIgKiBub25fYWNtX2FjKSkpCiAJCQkJCWJyZWFrOwotCQkJLyogVGhlIGxvb3Agd2lsbCByZXN1bHQgaW4gdXNpbmcgQksgZXZlbiBpZiBpdCByZXF1aXJlcwotCQkJICogYWRtaXNzaW9uIGNvbnRyb2wsIHN1Y2ggY29uZmlndXJhdGlvbiBtYWtlcyBubyBzZW5zZQotCQkJICogYW5kIHdlIGhhdmUgdG8gdHJhbnNtaXQgc29tZWhvdyAtIHRoZSBBQyBzZWxlY3Rpb24KLQkJCSAqIGRvZXMgdGhlIHNhbWUgdGhpbmcuCisJCQkvKiBVc3VhbGx5IHRoZSBsb29wIHdpbGwgcmVzdWx0IGluIHVzaW5nIEJLIGV2ZW4gaWYgaXQKKwkJCSAqIHJlcXVpcmVzIGFkbWlzc2lvbiBjb250cm9sLCBidXQgc3VjaCBhIGNvbmZpZ3VyYXRpb24KKwkJCSAqIG1ha2VzIG5vIHNlbnNlIGFuZCB3ZSBoYXZlIHRvIHRyYW5zbWl0IHNvbWVob3cgLSB0aGUKKwkJCSAqIEFDIHNlbGVjdGlvbiBkb2VzIHRoZSBzYW1lIHRoaW5nLgorCQkJICogSWYgd2Ugc3RhcnRlZCBvdXQgdHJ5aW5nIHRvIGRvd25ncmFkZSBmcm9tIEJLLCB0aGVuCisJCQkgKiB0aGUgZXh0cmEgY29uZGl0aW9uIGhlcmUgbWlnaHQgYmUgbmVlZGVkLgogCQkJICovCisJCQlpZiAobm9uX2FjbV9hYyA+PSBJRUVFODAyMTFfTlVNX0FDUykKKwkJCQlub25fYWNtX2FjID0gSUVFRTgwMjExX0FDX0JLOwogCQkJaWYgKGRydl9jb25mX3R4KGxvY2FsLCBzZGF0YSwgYWMsCiAJCQkJCSZzZGF0YS0+dHhfY29uZltub25fYWNtX2FjXSkpCiAJCQkJc2RhdGFfZXJyKHNkYXRhLApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL29mZmNoYW5uZWwuYyBiL25ldC9tYWM4MDIxMS9vZmZjaGFubmVsLmMKaW5kZXggNTVhOWM1Yi4uYzNmNjEwYiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL29mZmNoYW5uZWwuYworKysgYi9uZXQvbWFjODAyMTEvb2ZmY2hhbm5lbC5jCkBAIC0xMjgsNyArMTI4LDggQEAKIAkJaWYgKCFpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCiAJCQljb250aW51ZTsKIAotCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpCisJCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSB8fAorCQkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX05BTikKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikKQEAgLTgzOCw2ICs4MzksNyBAQAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKIAkJbmVlZF9vZmZjaGFuID0gdHJ1ZTsKIAkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9wbS5jIGIvbmV0L21hYzgwMjExL3BtLmMKaW5kZXggMDBhNDNhNy4uMjhhM2EwOSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3BtLmMKKysrIGIvbmV0L21hYzgwMjExL3BtLmMKQEAgLTE3OCw4ICsxNzgsNyBAQAogCVdBUk5fT04oIWxpc3RfZW1wdHkoJmxvY2FsLT5jaGFuY3R4X2xpc3QpKTsKIAogCS8qIHN0b3AgaGFyZHdhcmUgLSB0aGlzIG11c3Qgc3RvcCBSWCAqLwotCWlmIChsb2NhbC0+b3Blbl9jb3VudCkKLQkJaWVlZTgwMjExX3N0b3BfZGV2aWNlKGxvY2FsKTsKKwlpZWVlODAyMTFfc3RvcF9kZXZpY2UobG9jYWwpOwogCiAgc3VzcGVuZDoKIAlsb2NhbC0+c3VzcGVuZGVkID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yeC5jIGIvbmV0L21hYzgwMjExL3J4LmMKaW5kZXggOWRjZTNiMS4uNjE3NWRiMyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3J4LmMKKysrIGIvbmV0L21hYzgwMjExL3J4LmMKQEAgLTE4MCw2ICsxODAsMTEgQEAKIAkJbGVuICs9IDEyOwogCX0KIAorCWlmIChsb2NhbC0+aHcucmFkaW90YXBfdGltZXN0YW1wLnVuaXRzX3BvcyA+PSAwKSB7CisJCWxlbiA9IEFMSUdOKGxlbiwgOCk7CisJCWxlbiArPSAxMjsKKwl9CisKIAlpZiAoc3RhdHVzLT5jaGFpbnMpIHsKIAkJLyogYW50ZW5uYSBhbmQgYW50ZW5uYSBzaWduYWwgZmllbGRzICovCiAJCWxlbiArPSAyICogaHdlaWdodDgoc3RhdHVzLT5jaGFpbnMpOwpAQCAtNDQ3LDYgKzQ1MiwzMSBAQAogCQlwb3MgKz0gMjsKIAl9CiAKKwlpZiAobG9jYWwtPmh3LnJhZGlvdGFwX3RpbWVzdGFtcC51bml0c19wb3MgPj0gMCkgeworCQl1MTYgYWNjdXJhY3kgPSAwOworCQl1OCBmbGFncyA9IElFRUU4MDIxMV9SQURJT1RBUF9USU1FU1RBTVBfRkxBR18zMkJJVDsKKworCQlydGhkci0+aXRfcHJlc2VudCB8PQorCQkJY3B1X3RvX2xlMzIoMSA8PCBJRUVFODAyMTFfUkFESU9UQVBfVElNRVNUQU1QKTsKKworCQkvKiBlbnN1cmUgOCBieXRlIGFsaWdubWVudCAqLworCQl3aGlsZSAoKHBvcyAtICh1OCAqKXJ0aGRyKSAmIDcpCisJCQlwb3MrKzsKKworCQlwdXRfdW5hbGlnbmVkX2xlNjQoc3RhdHVzLT5kZXZpY2VfdGltZXN0YW1wLCBwb3MpOworCQlwb3MgKz0gc2l6ZW9mKHU2NCk7CisKKwkJaWYgKGxvY2FsLT5ody5yYWRpb3RhcF90aW1lc3RhbXAuYWNjdXJhY3kgPj0gMCkgeworCQkJYWNjdXJhY3kgPSBsb2NhbC0+aHcucmFkaW90YXBfdGltZXN0YW1wLmFjY3VyYWN5OworCQkJZmxhZ3MgfD0gSUVFRTgwMjExX1JBRElPVEFQX1RJTUVTVEFNUF9GTEFHX0FDQ1VSQUNZOworCQl9CisJCXB1dF91bmFsaWduZWRfbGUxNihhY2N1cmFjeSwgcG9zKTsKKwkJcG9zICs9IHNpemVvZih1MTYpOworCisJCSpwb3MrKyA9IGxvY2FsLT5ody5yYWRpb3RhcF90aW1lc3RhbXAudW5pdHNfcG9zOworCQkqcG9zKysgPSBmbGFnczsKKwl9CisKIAlmb3JfZWFjaF9zZXRfYml0KGNoYWluLCAmY2hhaW5zLCBJRUVFODAyMTFfTUFYX0NIQUlOUykgewogCQkqcG9zKysgPSBzdGF0dXMtPmNoYWluX3NpZ25hbFtjaGFpbl07CiAJCSpwb3MrKyA9IGNoYWluOwpAQCAtNDg1LDYgKzUxNSw5IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKnByZXZfZGV2ID0gTlVMTDsKIAlpbnQgcHJlc2VudF9mY3NfbGVuID0gMDsKIAl1bnNpZ25lZCBpbnQgcnRhcF92ZW5kb3Jfc3BhY2UgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICptb25pdG9yX3NkYXRhID0KKwkJcmN1X2RlcmVmZXJlbmNlKGxvY2FsLT5tb25pdG9yX3NkYXRhKTsKIAogCWlmICh1bmxpa2VseShzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX1JBRElPVEFQX1ZFTkRPUl9EQVRBKSkgewogCQlzdHJ1Y3QgaWVlZTgwMjExX3ZlbmRvcl9yYWRpb3RhcCAqcnRhcCA9ICh2b2lkICopb3JpZ3NrYi0+ZGF0YTsKQEAgLTU2Nyw3ICs2MDAsNyBAQAogCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCiAJCQljb250aW51ZTsKIAotCQlpZiAoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykKKwkJaWYgKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpCiAJCQljb250aW51ZTsKIAogCQlpZiAoIWllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkKQEAgLTU4NSw2ICs2MTgsMjMgQEAKIAkJaWVlZTgwMjExX3J4X3N0YXRzKHNkYXRhLT5kZXYsIHNrYi0+bGVuKTsKIAl9CiAKKwltZ210ID0gKHZvaWQgKilza2ItPmRhdGE7CisJaWYgKG1vbml0b3Jfc2RhdGEgJiYKKwkgICAgc2tiLT5sZW4gPj0gSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSArIDEgKyBWSFRfTVVNSU1PX0dST1VQU19EQVRBX0xFTiAmJgorCSAgICBpZWVlODAyMTFfaXNfYWN0aW9uKG1nbXQtPmZyYW1lX2NvbnRyb2wpICYmCisJICAgIG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID09IFdMQU5fQ0FURUdPUllfVkhUICYmCisJICAgIG1nbXQtPnUuYWN0aW9uLnUudmh0X2dyb3VwX25vdGlmLmFjdGlvbl9jb2RlID09IFdMQU5fVkhUX0FDVElPTl9HUk9VUElEX01HTVQgJiYKKwkgICAgaXNfdmFsaWRfZXRoZXJfYWRkcihtb25pdG9yX3NkYXRhLT51Lm1udHIubXVfZm9sbG93X2FkZHIpICYmCisJICAgIGV0aGVyX2FkZHJfZXF1YWwobWdtdC0+ZGEsIG1vbml0b3Jfc2RhdGEtPnUubW50ci5tdV9mb2xsb3dfYWRkcikpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm11X3NrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKG11X3NrYikgeworCQkJbXVfc2tiLT5wa3RfdHlwZSA9IElFRUU4MDIxMV9TREFUQV9RVUVVRV9UWVBFX0ZSQU1FOworCQkJc2tiX3F1ZXVlX3RhaWwoJm1vbml0b3Jfc2RhdGEtPnNrYl9xdWV1ZSwgbXVfc2tiKTsKKwkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZtb25pdG9yX3NkYXRhLT53b3JrKTsKKwkJfQorCX0KKwogCWlmIChwcmV2X2RldikgewogCQlza2ItPmRldiA9IHByZXZfZGV2OwogCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOwpAQCAtMTA3Miw4ICsxMTIyLDE1IEBACiAJdGlkID0gKmllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0s7CiAKIAl0aWRfYWdnX3J4ID0gcmN1X2RlcmVmZXJlbmNlKHN0YS0+YW1wZHVfbWxtZS50aWRfcnhbdGlkXSk7Ci0JaWYgKCF0aWRfYWdnX3J4KQorCWlmICghdGlkX2FnZ19yeCkgeworCQlpZiAoYWNrX3BvbGljeSA9PSBJRUVFODAyMTFfUU9TX0NUTF9BQ0tfUE9MSUNZX0JMT0NLQUNLICYmCisJCSAgICAhdGVzdF9iaXQodGlkLCByeC0+c3RhLT5hbXBkdV9tbG1lLmFnZ19zZXNzaW9uX3ZhbGlkKSAmJgorCQkgICAgIXRlc3RfYW5kX3NldF9iaXQodGlkLCByeC0+c3RhLT5hbXBkdV9tbG1lLnVuZXhwZWN0ZWRfYWdnKSkKKwkJCWllZWU4MDIxMV9zZW5kX2RlbGJhKHJ4LT5zZGF0YSwgcngtPnN0YS0+c3RhLmFkZHIsIHRpZCwKKwkJCQkJICAgICBXTEFOX0JBQ0tfUkVDSVBJRU5ULAorCQkJCQkgICAgIFdMQU5fUkVBU09OX1FTVEFfUkVRVUlSRV9TRVRVUCk7CiAJCWdvdG8gZG9udF9yZW9yZGVyOworCX0KIAogCS8qIHFvcyBudWxsIGRhdGEgZnJhbWVzIGFyZSBleGNsdWRlZCAqLwogCWlmICh1bmxpa2VseShoZHItPmZyYW1lX2NvbnRyb2wgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMpKSkKQEAgLTEyNjYsOSArMTMyMyw3IEBACiAJCXJldHVybjsKIAogCWZvciAodGlkID0gMDsgdGlkIDwgQVJSQVlfU0laRShzdGEtPnN0YS50eHEpOyB0aWQrKykgewotCQlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSB0b190eHFfaW5mbyhzdGEtPnN0YS50eHFbdGlkXSk7Ci0KLQkJaWYgKHR4cWktPnRpbi5iYWNrbG9nX3BhY2tldHMpCisJCWlmICh0eHFfaGFzX3F1ZXVlKHN0YS0+c3RhLnR4cVt0aWRdKSkKIAkJCXNldF9iaXQodGlkLCAmc3RhLT50eHFfYnVmZmVyZWRfdGlkcyk7CiAJCWVsc2UKIAkJCWNsZWFyX2JpdCh0aWQsICZzdGEtPnR4cV9idWZmZXJlZF90aWRzKTsKQEAgLTI1MzUsNiArMjU5MCwxMiBAQAogCiAJCXRpZCA9IGxlMTZfdG9fY3B1KGJhcl9kYXRhLmNvbnRyb2wpID4+IDEyOwogCisJCWlmICghdGVzdF9iaXQodGlkLCByeC0+c3RhLT5hbXBkdV9tbG1lLmFnZ19zZXNzaW9uX3ZhbGlkKSAmJgorCQkgICAgIXRlc3RfYW5kX3NldF9iaXQodGlkLCByeC0+c3RhLT5hbXBkdV9tbG1lLnVuZXhwZWN0ZWRfYWdnKSkKKwkJCWllZWU4MDIxMV9zZW5kX2RlbGJhKHJ4LT5zZGF0YSwgcngtPnN0YS0+c3RhLmFkZHIsIHRpZCwKKwkJCQkJICAgICBXTEFOX0JBQ0tfUkVDSVBJRU5ULAorCQkJCQkgICAgIFdMQU5fUkVBU09OX1FTVEFfUkVRVUlSRV9TRVRVUCk7CisKIAkJdGlkX2FnZ19yeCA9IHJjdV9kZXJlZmVyZW5jZShyeC0+c3RhLT5hbXBkdV9tbG1lLnRpZF9yeFt0aWRdKTsKIAkJaWYgKCF0aWRfYWdnX3J4KQogCQkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKQEAgLTMxNDcsNyArMzIwOCw3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IgfHwKLQkJICAgICEoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19DT09LX0ZSQU1FUykpCisJCSAgICAhKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpKQogCQkJY29udGludWU7CiAKIAkJaWYgKHByZXZfZGV2KSB7CkBAIC0zNTIzLDYgKzM1ODQsOSBAQAogCQkgICAgICAgaWVlZTgwMjExX2lzX3Byb2JlX3JlcShoZHItPmZyYW1lX2NvbnRyb2wpIHx8CiAJCSAgICAgICBpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChoZHItPmZyYW1lX2NvbnRyb2wpIHx8CiAJCSAgICAgICBpZWVlODAyMTFfaXNfYmVhY29uKGhkci0+ZnJhbWVfY29udHJvbCk7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CisJCS8qIEN1cnJlbnRseSBubyBmcmFtZXMgb24gTkFOIGludGVyZmFjZSBhcmUgYWxsb3dlZCAqLworCQlyZXR1cm4gZmFsc2U7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtMzk0MCw3ICs0MDA0LDcgQEAKIAlfX2xlMTYgZmM7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9kYXRhIHJ4OwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnByZXY7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgKnRtcDsKKwlzdHJ1Y3QgcmhsaXN0X2hlYWQgKnRtcDsKIAlpbnQgZXJyID0gMDsKIAogCWZjID0gKChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YSktPmZyYW1lX2NvbnRyb2w7CkBAIC0zOTgzLDEzICs0MDQ3LDEwIEBACiAJCWdvdG8gb3V0OwogCX0gZWxzZSBpZiAoaWVlZTgwMjExX2lzX2RhdGEoZmMpKSB7CiAJCXN0cnVjdCBzdGFfaW5mbyAqc3RhLCAqcHJldl9zdGE7Ci0JCWNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKIAogCQlwcmV2X3N0YSA9IE5VTEw7CiAKLQkJdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShsb2NhbC0+c3RhX2hhc2gudGJsLCAmbG9jYWwtPnN0YV9oYXNoKTsKLQotCQlmb3JfZWFjaF9zdGFfaW5mbyhsb2NhbCwgdGJsLCBoZHItPmFkZHIyLCBzdGEsIHRtcCkgeworCQlmb3JfZWFjaF9zdGFfaW5mbyhsb2NhbCwgaGRyLT5hZGRyMiwgc3RhLCB0bXApIHsKIAkJCWlmICghcHJldl9zdGEpIHsKIAkJCQlwcmV2X3N0YSA9IHN0YTsKIAkJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zY2FuLmMgYi9uZXQvbWFjODAyMTEvc2Nhbi5jCmluZGV4IDA3MGI0MGYuLjIzZDhhYzggMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zY2FuLmMKKysrIGIvbmV0L21hYzgwMjExL3NjYW4uYwpAQCAtNDIwLDcgKzQyMCw3IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CiAKLQl0cmFjZV9hcGlfc2Nhbl9jb21wbGV0ZWQobG9jYWwsIGluZm8pOworCXRyYWNlX2FwaV9zY2FuX2NvbXBsZXRlZChsb2NhbCwgaW5mby0+YWJvcnRlZCk7CiAKIAlzZXRfYml0KFNDQU5fQ09NUExFVEVELCAmbG9jYWwtPnNjYW5uaW5nKTsKIAlpZiAoaW5mby0+YWJvcnRlZCkKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5jIGIvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMKaW5kZXggNzZiNzM3ZC4uNzhlOWVjYiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMKKysrIGIvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMKQEAgLTY3LDEyICs2NywxMCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHN0YV9yaHRfcGFyYW1zID0gewogCS5uZWxlbV9oaW50ID0gMywgLyogc3RhcnQgc21hbGwgKi8KLQkuaW5zZWN1cmVfZWxhc3RpY2l0eSA9IHRydWUsIC8qIERpc2FibGUgY2hhaW4tbGVuZ3RoIGNoZWNrcy4gKi8KIAkuYXV0b21hdGljX3Nocmlua2luZyA9IHRydWUsCiAJLmhlYWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHN0YV9pbmZvLCBoYXNoX25vZGUpLAogCS5rZXlfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHN0YV9pbmZvLCBhZGRyKSwKIAkua2V5X2xlbiA9IEVUSF9BTEVOLAotCS5oYXNoZm4gPSBzdGFfYWRkcl9oYXNoLAogCS5tYXhfc2l6ZSA9IENPTkZJR19NQUM4MDIxMV9TVEFfSEFTSF9NQVhfU0laRSwKIH07CiAKQEAgLTgwLDggKzc4LDggQEAKIHN0YXRpYyBpbnQgc3RhX2luZm9faGFzaF9kZWwoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewotCXJldHVybiByaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCZsb2NhbC0+c3RhX2hhc2gsICZzdGEtPmhhc2hfbm9kZSwKLQkJCQkgICAgICBzdGFfcmh0X3BhcmFtcyk7CisJcmV0dXJuIHJobHRhYmxlX3JlbW92ZSgmbG9jYWwtPnN0YV9oYXNoLCAmc3RhLT5oYXNoX25vZGUsCisJCQkgICAgICAgc3RhX3JodF9wYXJhbXMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2NsZWFudXBfc2luZ2xlX3N0YShzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKQEAgLTE1NywxOSArMTU1LDIyIEBACiAJc3RhX2luZm9fZnJlZShsb2NhbCwgc3RhKTsKIH0KIAorc3RydWN0IHJobGlzdF9oZWFkICpzdGFfaW5mb19oYXNoX2xvb2t1cChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkJIGNvbnN0IHU4ICphZGRyKQoreworCXJldHVybiByaGx0YWJsZV9sb29rdXAoJmxvY2FsLT5zdGFfaGFzaCwgYWRkciwgc3RhX3JodF9wYXJhbXMpOworfQorCiAvKiBwcm90ZWN0ZWQgYnkgUkNVICovCiBzdHJ1Y3Qgc3RhX2luZm8gKnN0YV9pbmZvX2dldChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCSAgICAgIGNvbnN0IHU4ICphZGRyKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCByaGxpc3RfaGVhZCAqdG1wOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCXN0cnVjdCByaGFzaF9oZWFkICp0bXA7Ci0JY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UobG9jYWwtPnN0YV9oYXNoLnRibCwgJmxvY2FsLT5zdGFfaGFzaCk7Ci0KLQlmb3JfZWFjaF9zdGFfaW5mbyhsb2NhbCwgdGJsLCBhZGRyLCBzdGEsIHRtcCkgeworCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBhZGRyLCBzdGEsIHRtcCkgewogCQlpZiAoc3RhLT5zZGF0YSA9PSBzZGF0YSkgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQkvKiB0aGlzIGlzIHNhZmUgYXMgdGhlIGNhbGxlciBtdXN0IGFscmVhZHkgaG9sZApAQCAtMTkwLDE0ICsxOTEsMTEgQEAKIAkJCQkgIGNvbnN0IHU4ICphZGRyKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCByaGxpc3RfaGVhZCAqdG1wOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCXN0cnVjdCByaGFzaF9oZWFkICp0bXA7Ci0JY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UobG9jYWwtPnN0YV9oYXNoLnRibCwgJmxvY2FsLT5zdGFfaGFzaCk7Ci0KLQlmb3JfZWFjaF9zdGFfaW5mbyhsb2NhbCwgdGJsLCBhZGRyLCBzdGEsIHRtcCkgeworCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBhZGRyLCBzdGEsIHRtcCkgewogCQlpZiAoc3RhLT5zZGF0YSA9PSBzZGF0YSB8fAogCQkgICAgKHN0YS0+c2RhdGEtPmJzcyAmJiBzdGEtPnNkYXRhLT5ic3MgPT0gc2RhdGEtPmJzcykpIHsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMjYzLDggKzI2MSw4IEBACiBzdGF0aWMgaW50IHN0YV9pbmZvX2hhc2hfYWRkKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAogCQkJICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKLQlyZXR1cm4gcmhhc2h0YWJsZV9pbnNlcnRfZmFzdCgmbG9jYWwtPnN0YV9oYXNoLCAmc3RhLT5oYXNoX25vZGUsCi0JCQkJICAgICAgc3RhX3JodF9wYXJhbXMpOworCXJldHVybiByaGx0YWJsZV9pbnNlcnQoJmxvY2FsLT5zdGFfaGFzaCwgJnN0YS0+aGFzaF9ub2RlLAorCQkJICAgICAgIHN0YV9yaHRfcGFyYW1zKTsKIH0KIAogc3RhdGljIHZvaWQgc3RhX2RlbGl2ZXJfcHNfZnJhbWVzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd2spCkBAIC0zNDAsNiArMzM4LDkgQEAKIAogCW1lbWNweShzdGEtPmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKIAltZW1jcHkoc3RhLT5zdGEuYWRkciwgYWRkciwgRVRIX0FMRU4pOworCXN0YS0+c3RhLm1heF9yeF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXMgPQorCQlsb2NhbC0+aHcubWF4X3J4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lczsKKwogCXN0YS0+bG9jYWwgPSBsb2NhbDsKIAlzdGEtPnNkYXRhID0gc2RhdGE7CiAJc3RhLT5yeF9zdGF0cy5sYXN0X3J4ID0gamlmZmllczsKQEAgLTQ1MCw5ICs0NTEsOSBAQAogCQkgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoc3RhLT5zdGEuYWRkcikpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIFN0cmljdGx5IHNwZWFraW5nIHRoaXMgaXNuJ3QgbmVjZXNzYXJ5IGFzIHdlIGhvbGQgdGhlIG11dGV4LCBidXQKLQkgKiB0aGUgcmhhc2h0YWJsZSBjb2RlIGNhbid0IHJlYWxseSBkZWFsIHdpdGggdGhhdCBkaXN0aW5jdGlvbi4gV2UKLQkgKiBkbyByZXF1aXJlIHRoZSBtdXRleCBmb3IgY29ycmVjdG5lc3MgdGhvdWdoLgorCS8qIFRoZSBSQ1UgcmVhZCBsb2NrIGlzIHJlcXVpcmVkIGJ5IHJoYXNodGFibGUgZHVlIHRvCisJICogYXN5bmNocm9ub3VzIHJlc2l6ZS9yZWhhc2guICBXZSBhbHNvIHJlcXVpcmUgdGhlIG11dGV4CisJICogZm9yIGNvcnJlY3RuZXNzLgogCSAqLwogCXJjdV9yZWFkX2xvY2soKTsKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZzZGF0YS0+bG9jYWwtPnN0YV9tdHgpOwpAQCAtNjg3LDcgKzY4OCw3IEBACiAJfQogCiAJLyogTm8gbmVlZCB0byBkbyBhbnl0aGluZyBpZiB0aGUgZHJpdmVyIGRvZXMgYWxsICovCi0JaWYgKGllZWU4MDIxMV9od19jaGVjaygmbG9jYWwtPmh3LCBBUF9MSU5LX1BTKSkKKwlpZiAoIWxvY2FsLT5vcHMtPnNldF90aW0pCiAJCXJldHVybjsKIAogCWlmIChzdGEtPmRlYWQpCkBAIC0xMDQwLDE2ICsxMDQxLDExIEBACiAJCSAgcm91bmRfamlmZmllcyhqaWZmaWVzICsgU1RBX0lORk9fQ0xFQU5VUF9JTlRFUlZBTCkpOwogfQogCi11MzIgc3RhX2FkZHJfaGFzaChjb25zdCB2b2lkICprZXksIHUzMiBsZW5ndGgsIHUzMiBzZWVkKQotewotCXJldHVybiBqaGFzaChrZXksIEVUSF9BTEVOLCBzZWVkKTsKLX0KLQogaW50IHN0YV9pbmZvX2luaXQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IHJoYXNodGFibGVfaW5pdCgmbG9jYWwtPnN0YV9oYXNoLCAmc3RhX3JodF9wYXJhbXMpOworCWVyciA9IHJobHRhYmxlX2luaXQoJmxvY2FsLT5zdGFfaGFzaCwgJnN0YV9yaHRfcGFyYW1zKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCkBAIC0xMDY1LDcgKzEwNjEsNyBAQAogdm9pZCBzdGFfaW5mb19zdG9wKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQogewogCWRlbF90aW1lcl9zeW5jKCZsb2NhbC0+c3RhX2NsZWFudXApOwotCXJoYXNodGFibGVfZGVzdHJveSgmbG9jYWwtPnN0YV9oYXNoKTsKKwlyaGx0YWJsZV9kZXN0cm95KCZsb2NhbC0+c3RhX2hhc2gpOwogfQogCiAKQEAgLTExMzUsMTcgKzExMzEsMTQgQEAKIAkJCQkJCSAgIGNvbnN0IHU4ICpsb2NhbGFkZHIpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CisJc3RydWN0IHJobGlzdF9oZWFkICp0bXA7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgKnRtcDsKLQljb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7Ci0KLQl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGxvY2FsLT5zdGFfaGFzaC50YmwsICZsb2NhbC0+c3RhX2hhc2gpOwogCiAJLyoKIAkgKiBKdXN0IHJldHVybiBhIHJhbmRvbSBzdGF0aW9uIGlmIGxvY2FsYWRkciBpcyBOVUxMCiAJICogLi4uIGZpcnN0IGluIGxpc3QuCiAJICovCi0JZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIHRibCwgYWRkciwgc3RhLCB0bXApIHsKKwlmb3JfZWFjaF9zdGFfaW5mbyhsb2NhbCwgYWRkciwgc3RhLCB0bXApIHsKIAkJaWYgKGxvY2FsYWRkciAmJgogCQkgICAgIWV0aGVyX2FkZHJfZXF1YWwoc3RhLT5zZGF0YS0+dmlmLmFkZHIsIGxvY2FsYWRkcikpCiAJCQljb250aW51ZTsKQEAgLTEyMDksMTIgKzEyMDIsMTAgQEAKIAogCWlmIChzdGEtPnN0YS50eHFbMF0pIHsKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhLT5zdGEudHhxKTsgaSsrKSB7Ci0JCQlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSB0b190eHFfaW5mbyhzdGEtPnN0YS50eHFbaV0pOwotCi0JCQlpZiAoIXR4cWktPnRpbi5iYWNrbG9nX3BhY2tldHMpCisJCQlpZiAoIXR4cV9oYXNfcXVldWUoc3RhLT5zdGEudHhxW2ldKSkKIAkJCQljb250aW51ZTsKIAotCQkJZHJ2X3dha2VfdHhfcXVldWUobG9jYWwsIHR4cWkpOworCQkJZHJ2X3dha2VfdHhfcXVldWUobG9jYWwsIHRvX3R4cV9pbmZvKHN0YS0+c3RhLnR4cVtpXSkpOwogCQl9CiAJfQogCkBAIC0xNjE2LDcgKzE2MDcsNiBAQAogCiAJCXN0YV9pbmZvX3JlY2FsY190aW0oc3RhKTsKIAl9IGVsc2UgewotCQl1bnNpZ25lZCBsb25nIHRpZHMgPSBzdGEtPnR4cV9idWZmZXJlZF90aWRzICYgZHJpdmVyX3JlbGVhc2VfdGlkczsKIAkJaW50IHRpZDsKIAogCQkvKgpAQCAtMTY0Niw5ICsxNjM2LDggQEAKIAkJCXJldHVybjsKIAogCQlmb3IgKHRpZCA9IDA7IHRpZCA8IEFSUkFZX1NJWkUoc3RhLT5zdGEudHhxKTsgdGlkKyspIHsKLQkJCXN0cnVjdCB0eHFfaW5mbyAqdHhxaSA9IHRvX3R4cV9pbmZvKHN0YS0+c3RhLnR4cVt0aWRdKTsKLQotCQkJaWYgKCEodGlkcyAmIEJJVCh0aWQpKSB8fCB0eHFpLT50aW4uYmFja2xvZ19wYWNrZXRzKQorCQkJaWYgKCEoZHJpdmVyX3JlbGVhc2VfdGlkcyAmIEJJVCh0aWQpKSB8fAorCQkJICAgIHR4cV9oYXNfcXVldWUoc3RhLT5zdGEudHhxW3RpZF0pKQogCQkJCWNvbnRpbnVlOwogCiAJCQlzdGFfaW5mb19yZWNhbGNfdGltKHN0YSk7CkBAIC0yMjc5LDExICsyMjY4LDcgQEAKIAlpZiAodGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUikpCiAJCXNpbmZvLT5zdGFfZmxhZ3Muc2V0IHw9IEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUik7CiAKLQkvKiBjaGVjayBpZiB0aGUgZHJpdmVyIGhhcyBhIFNXIFJDIGltcGxlbWVudGF0aW9uICovCi0JaWYgKHJlZiAmJiByZWYtPm9wcy0+Z2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQpCi0JCXRociA9IHJlZi0+b3BzLT5nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChzdGEtPnJhdGVfY3RybF9wcml2KTsKLQllbHNlCi0JCXRociA9IGRydl9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dChsb2NhbCwgJnN0YS0+c3RhKTsKKwl0aHIgPSBzdGFfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RhKTsKIAogCWlmICh0aHIgIT0gMCkgewogCQlzaW5mby0+ZmlsbGVkIHw9IEJJVChOTDgwMjExX1NUQV9JTkZPX0VYUEVDVEVEX1RIUk9VR0hQVVQpOwpAQCAtMjI5MSw2ICsyMjc2LDI1IEBACiAJfQogfQogCit1MzIgc3RhX2dldF9leHBlY3RlZF90aHJvdWdocHV0KHN0cnVjdCBzdGFfaW5mbyAqc3RhKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgcmF0ZV9jb250cm9sX3JlZiAqcmVmID0gTlVMTDsKKwl1MzIgdGhyID0gMDsKKworCWlmICh0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfUkFURV9DT05UUk9MKSkKKwkJcmVmID0gbG9jYWwtPnJhdGVfY3RybDsKKworCS8qIGNoZWNrIGlmIHRoZSBkcml2ZXIgaGFzIGEgU1cgUkMgaW1wbGVtZW50YXRpb24gKi8KKwlpZiAocmVmICYmIHJlZi0+b3BzLT5nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCkKKwkJdGhyID0gcmVmLT5vcHMtPmdldF9leHBlY3RlZF90aHJvdWdocHV0KHN0YS0+cmF0ZV9jdHJsX3ByaXYpOworCWVsc2UKKwkJdGhyID0gZHJ2X2dldF9leHBlY3RlZF90aHJvdWdocHV0KGxvY2FsLCBzdGEpOworCisJcmV0dXJuIHRocjsKK30KKwogdW5zaWduZWQgbG9uZyBpZWVlODAyMTFfc3RhX2xhc3RfYWN0aXZlKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogewogCXN0cnVjdCBpZWVlODAyMTFfc3RhX3J4X3N0YXRzICpzdGF0cyA9IHN0YV9nZXRfbGFzdF9yeF9zdGF0cyhzdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmggYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uaAppbmRleCA3OGIwZWYzLi5lZDVmY2I5IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uaAorKysgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uaApAQCAtMjMwLDYgKzIzMCw4IEBACiAgKiBAdGlkX3J4X3N0b3BfcmVxdWVzdGVkOiAgYml0bWFwIGluZGljYXRpbmcgd2hpY2ggQkEgc2Vzc2lvbnMgcGVyIFRJRCB0aGUKICAqCWRyaXZlciByZXF1ZXN0ZWQgdG8gY2xvc2UgdW50aWwgdGhlIHdvcmsgZm9yIGl0IHJ1bnMKICAqIEBhZ2dfc2Vzc2lvbl92YWxpZDogYml0bWFwIGluZGljYXRpbmcgd2hpY2ggVElEIGhhcyBhIHJ4IEJBIHNlc3Npb24gb3BlbiBvbgorICogQHVuZXhwZWN0ZWRfYWdnOiBiaXRtYXAgaW5kaWNhdGluZyB3aGljaCBUSUQgYWxyZWFkeSBzZW50IGEgZGVsQkEgZHVlIHRvCisgKgl1bmV4cGVjdGVkIGFnZ3JlZ2F0aW9uIHJlbGF0ZWQgZnJhbWVzIG91dHNpZGUgYSBzZXNzaW9uCiAgKiBAd29yazogd29yayBzdHJ1Y3QgZm9yIHN0YXJ0aW5nL3N0b3BwaW5nIGFnZ3JlZ2F0aW9uCiAgKiBAdGlkX3R4OiBhZ2dyZWdhdGlvbiBpbmZvIGZvciBUeCBwZXIgVElECiAgKiBAdGlkX3N0YXJ0X3R4OiBzZXNzaW9ucyB3aGVyZSBzdGFydCB3YXMgcmVxdWVzdGVkCkBAIC0yNDQsNiArMjQ2LDcgQEAKIAl1bnNpZ25lZCBsb25nIHRpZF9yeF90aW1lcl9leHBpcmVkW0JJVFNfVE9fTE9OR1MoSUVFRTgwMjExX05VTV9USURTKV07CiAJdW5zaWduZWQgbG9uZyB0aWRfcnhfc3RvcF9yZXF1ZXN0ZWRbQklUU19UT19MT05HUyhJRUVFODAyMTFfTlVNX1RJRFMpXTsKIAl1bnNpZ25lZCBsb25nIGFnZ19zZXNzaW9uX3ZhbGlkW0JJVFNfVE9fTE9OR1MoSUVFRTgwMjExX05VTV9USURTKV07CisJdW5zaWduZWQgbG9uZyB1bmV4cGVjdGVkX2FnZ1tCSVRTX1RPX0xPTkdTKElFRUU4MDIxMV9OVU1fVElEUyldOwogCS8qIHR4ICovCiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJc3RydWN0IHRpZF9hbXBkdV90eCBfX3JjdSAqdGlkX3R4W0lFRUU4MDIxMV9OVU1fVElEU107CkBAIC00NTIsNyArNDU1LDcgQEAKIAkvKiBHZW5lcmFsIGluZm9ybWF0aW9uLCBtb3N0bHkgc3RhdGljICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0LCBmcmVlX2xpc3Q7CiAJc3RydWN0IHJjdV9oZWFkIHJjdV9oZWFkOwotCXN0cnVjdCByaGFzaF9oZWFkIGhhc2hfbm9kZTsKKwlzdHJ1Y3QgcmhsaXN0X2hlYWQgaGFzaF9ub2RlOwogCXU4IGFkZHJbRVRIX0FMRU5dOwogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwpAQCAtNjM1LDYgKzYzOCw5IEBACiAgKi8KICNkZWZpbmUgU1RBX0lORk9fQ0xFQU5VUF9JTlRFUlZBTCAoMTAgKiBIWikKIAorc3RydWN0IHJobGlzdF9oZWFkICpzdGFfaW5mb19oYXNoX2xvb2t1cChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkJIGNvbnN0IHU4ICphZGRyKTsKKwogLyoKICAqIEdldCBhIFNUQSBpbmZvLCBtdXN0IGJlIHVuZGVyIFJDVSByZWFkIGxvY2suCiAgKi8KQEAgLTY0NCwxNyArNjUwLDkgQEAKIHN0cnVjdCBzdGFfaW5mbyAqc3RhX2luZm9fZ2V0X2JzcyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQkgIGNvbnN0IHU4ICphZGRyKTsKIAotdTMyIHN0YV9hZGRyX2hhc2goY29uc3Qgdm9pZCAqa2V5LCB1MzIgbGVuZ3RoLCB1MzIgc2VlZCk7Ci0KLSNkZWZpbmUgX3N0YV9idWNrZXRfaWR4KF90YmwsIF9hKQkJCQkJXAotCXJodF9idWNrZXRfaW5kZXgoX3RibCwgc3RhX2FkZHJfaGFzaChfYSwgRVRIX0FMRU4sIChfdGJsKS0+aGFzaF9ybmQpKQotCi0jZGVmaW5lIGZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCB0YmwsIF9hZGRyLCBfc3RhLCBfdG1wKQkJXAotCXJodF9mb3JfZWFjaF9lbnRyeV9yY3UoX3N0YSwgX3RtcCwgdGJsLCAJCQlcCi0JCQkgICAgICAgX3N0YV9idWNrZXRfaWR4KHRibCwgX2FkZHIpLAkJXAotCQkJICAgICAgIGhhc2hfbm9kZSkJCQkJXAotCS8qIGNvbXBhcmUgYWRkcmVzcyBhbmQgcnVuIGNvZGUgb25seSBpZiBpdCBtYXRjaGVzICovCQlcCi0JaWYgKGV0aGVyX2FkZHJfZXF1YWwoX3N0YS0+YWRkciwgKF9hZGRyKSkpCisjZGVmaW5lIGZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBfYWRkciwgX3N0YSwgX3RtcCkJCQlcCisJcmhsX2Zvcl9lYWNoX2VudHJ5X3JjdShfc3RhLCBfdG1wLAkJCQlcCisJCQkgICAgICAgc3RhX2luZm9faGFzaF9sb29rdXAobG9jYWwsIF9hZGRyKSwgaGFzaF9ub2RlKQogCiAvKgogICogR2V0IFNUQSBpbmZvIGJ5IGluZGV4LCBCUk9LRU4hCkBAIC03MTIsNiArNzEwLDggQEAKIAkJCSAgc3RydWN0IHJhdGVfaW5mbyAqcmluZm8pOwogdm9pZCBzdGFfc2V0X3NpbmZvKHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbyk7CiAKK3UzMiBzdGFfZ2V0X2V4cGVjdGVkX3Rocm91Z2hwdXQoc3RydWN0IHN0YV9pbmZvICpzdGEpOworCiB2b2lkIGllZWU4MDIxMV9zdGFfZXhwaXJlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJICB1bnNpZ25lZCBsb25nIGV4cF90aW1lKTsKIHU4IHN0YV9pbmZvX3R4X3N0cmVhbXMoc3RydWN0IHN0YV9pbmZvICpzdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YXR1cy5jIGIvbmV0L21hYzgwMjExL3N0YXR1cy5jCmluZGV4IGEyYTY4MjYuLmRkZjcxYzYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zdGF0dXMuYworKysgYi9uZXQvbWFjODAyMTEvc3RhdHVzLmMKQEAgLTU1Nyw2ICs1NTcsMTIgQEAKIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9sb3N0X3BhY2tldChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKIAkJCQkgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbykKIHsKKwkvKiBJZiBkcml2ZXIgcmVsaWVzIG9uIGl0cyBvd24gYWxnb3JpdGhtIGZvciBzdGF0aW9uIGtpY2tvdXQsIHNraXAKKwkgKiBtYWM4MDIxMSBwYWNrZXQgbG9zcyBtZWNoYW5pc20uCisJICovCisJaWYgKGllZWU4MDIxMV9od19jaGVjaygmc3RhLT5sb2NhbC0+aHcsIFJFUE9SVFNfTE9XX0FDSykpCisJCXJldHVybjsKKwogCS8qIFRoaXMgcGFja2V0IHdhcyBhZ2dyZWdhdGVkIGJ1dCBkb2Vzbid0IGNhcnJ5IHN0YXR1cyBpbmZvICovCiAJaWYgKChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpICYmCiAJICAgICEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVSkpCkBAIC03MDksNyArNzE1LDcgQEAKIAkJCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAoKHNkYXRhLT51Lm1udHJfZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpICYmCisJCQlpZiAoKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQ09PS19GUkFNRVMpICYmCiAJCQkgICAgIXNlbmRfdG9fY29va2VkKQogCQkJCWNvbnRpbnVlOwogCkBAIC03NDAsOCArNzQ2LDggQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJX19sZTE2IGZjOwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCXN0cnVjdCByaGxpc3RfaGVhZCAqdG1wOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwotCXN0cnVjdCByaGFzaF9oZWFkICp0bXA7CiAJaW50IHJldHJ5X2NvdW50OwogCWludCByYXRlc19pZHg7CiAJYm9vbCBzZW5kX3RvX2Nvb2tlZDsKQEAgLTc0OSw3ICs3NTUsNiBAQAogCXN0cnVjdCBpZWVlODAyMTFfYmFyICpiYXI7CiAJaW50IHNoaWZ0ID0gMDsKIAlpbnQgdGlkID0gSUVFRTgwMjExX05VTV9USURTOwotCWNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKIAogCXJhdGVzX2lkeCA9IGllZWU4MDIxMV90eF9nZXRfcmF0ZXMoaHcsIGluZm8sICZyZXRyeV9jb3VudCk7CiAKQEAgLTc1OCw5ICs3NjMsNyBAQAogCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tpbmZvLT5iYW5kXTsKIAlmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKIAotCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UobG9jYWwtPnN0YV9oYXNoLnRibCwgJmxvY2FsLT5zdGFfaGFzaCk7Ci0KLQlmb3JfZWFjaF9zdGFfaW5mbyhsb2NhbCwgdGJsLCBoZHItPmFkZHIxLCBzdGEsIHRtcCkgeworCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBoZHItPmFkZHIxLCBzdGEsIHRtcCkgewogCQkvKiBza2lwIHdyb25nIHZpcnR1YWwgaW50ZXJmYWNlICovCiAJCWlmICghZXRoZXJfYWRkcl9lcXVhbChoZHItPmFkZHIyLCBzdGEtPnNkYXRhLT52aWYuYWRkcikpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90ZGxzLmMgYi9uZXQvbWFjODAyMTEvdGRscy5jCmluZGV4IGI1ZDI4ZjEuLmFmY2E3ZDEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90ZGxzLmMKKysrIGIvbmV0L21hYzgwMjExL3RkbHMuYwpAQCAtMzMzLDEwICszMzMsMTEgQEAKIAlpZiAoIXVjLmNlbnRlcl9mcmVxMSkKIAkJcmV0dXJuOwogCi0JLyogcHJvY2VlZCB0byBkb3duZ3JhZGUgdGhlIGNoYW5kZWYgdW50aWwgdXNhYmxlIG9yIHRoZSBzYW1lICovCisJLyogcHJvY2VlZCB0byBkb3duZ3JhZGUgdGhlIGNoYW5kZWYgdW50aWwgdXNhYmxlIG9yIHRoZSBzYW1lIGFzIEFQIEJXICovCiAJd2hpbGUgKHVjLndpZHRoID4gbWF4X3dpZHRoIHx8Ci0JICAgICAgICFjZmc4MDIxMV9yZWdfY2FuX2JlYWNvbl9yZWxheChzZGF0YS0+bG9jYWwtPmh3LndpcGh5LCAmdWMsCi0JCQkJCSAgICAgIHNkYXRhLT53ZGV2LmlmdHlwZSkpCisJICAgICAgICh1Yy53aWR0aCA+IHN0YS0+dGRsc19jaGFuZGVmLndpZHRoICYmCisJCSFjZmc4MDIxMV9yZWdfY2FuX2JlYWNvbl9yZWxheChzZGF0YS0+bG9jYWwtPmh3LndpcGh5LCAmdWMsCisJCQkJCSAgICAgICBzZGF0YS0+d2Rldi5pZnR5cGUpKSkKIAkJaWVlZTgwMjExX2NoYW5kZWZfZG93bmdyYWRlKCZ1Yyk7CiAKIAlpZiAoIWNmZzgwMjExX2NoYW5kZWZfaWRlbnRpY2FsKCZ1YywgJnN0YS0+dGRsc19jaGFuZGVmKSkgewpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3RyYWNlLmggYi9uZXQvbWFjODAyMTEvdHJhY2UuaAppbmRleCA3N2U0YzUzLi45MmE0N2FmIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvdHJhY2UuaAorKysgYi9uZXQvbWFjODAyMTEvdHJhY2UuaApAQCAtOTg0LDYgKzk4NCwzMiBAQAogCSkKICk7CiAKK1RSQUNFX0VWRU5UKGRydl9vZmZzZXRfdHNmLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSBzNjQgb2Zmc2V0KSwKKworCVRQX0FSR1MobG9jYWwsIHNkYXRhLCBvZmZzZXQpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJTE9DQUxfRU5UUlkKKwkJVklGX0VOVFJZCisJCV9fZmllbGQoczY0LCB0c2Zfb2Zmc2V0KQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJTE9DQUxfQVNTSUdOOworCQlWSUZfQVNTSUdOOworCQlfX2VudHJ5LT50c2Zfb2Zmc2V0ID0gb2Zmc2V0OworCSksCisKKwlUUF9wcmludGsoCisJCUxPQ0FMX1BSX0ZNVCAgVklGX1BSX0ZNVCAgIiB0c2Ygb2Zmc2V0OiVsbGQiLAorCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+dHNmX29mZnNldAorCSkKKyk7CisKIERFRklORV9FVkVOVChsb2NhbF9zZGF0YV9ldnQsIGRydl9yZXNldF90c2YsCiAJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSksCkBAIC0xNzAwLDYgKzE3MjYsMTM5IEBACiAJKQogKTsKIAorVFJBQ0VfRVZFTlQoZHJ2X3N0YXJ0X25hbiwKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mKSwKKworCVRQX0FSR1MobG9jYWwsIHNkYXRhLCBjb25mKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlMT0NBTF9FTlRSWQorCQlWSUZfRU5UUlkKKwkJX19maWVsZCh1OCwgbWFzdGVyX3ByZWYpCisJCV9fZmllbGQodTgsIGR1YWwpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlMT0NBTF9BU1NJR047CisJCVZJRl9BU1NJR047CisJCV9fZW50cnktPm1hc3Rlcl9wcmVmID0gY29uZi0+bWFzdGVyX3ByZWY7CisJCV9fZW50cnktPmR1YWwgPSBjb25mLT5kdWFsOworCSksCisKKwlUUF9wcmludGsoCisJCUxPQ0FMX1BSX0ZNVCAgVklGX1BSX0ZNVAorCQkiLCBtYXN0ZXIgcHJlZmVyZW5jZTogJXUsIGR1YWw6ICVkIiwKKwkJTE9DQUxfUFJfQVJHLCBWSUZfUFJfQVJHLCBfX2VudHJ5LT5tYXN0ZXJfcHJlZiwKKwkJX19lbnRyeS0+ZHVhbAorCSkKKyk7CisKK1RSQUNFX0VWRU5UKGRydl9zdG9wX25hbiwKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKSwKKworCVRQX0FSR1MobG9jYWwsIHNkYXRhKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCUxPQ0FMX0VOVFJZCisJCVZJRl9FTlRSWQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJTE9DQUxfQVNTSUdOOworCQlWSUZfQVNTSUdOOworCSksCisKKwlUUF9wcmludGsoCisJCUxPQ0FMX1BSX0ZNVCAgVklGX1BSX0ZNVCwKKwkJTE9DQUxfUFJfQVJHLCBWSUZfUFJfQVJHCisJKQorKTsKKworVFJBQ0VfRVZFTlQoZHJ2X25hbl9jaGFuZ2VfY29uZiwKKwlUUF9QUk9UTyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mLAorCQkgdTMyIGNoYW5nZXMpLAorCisJVFBfQVJHUyhsb2NhbCwgc2RhdGEsIGNvbmYsIGNoYW5nZXMpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCUxPQ0FMX0VOVFJZCisJCVZJRl9FTlRSWQorCQlfX2ZpZWxkKHU4LCBtYXN0ZXJfcHJlZikKKwkJX19maWVsZCh1OCwgZHVhbCkKKwkJX19maWVsZCh1MzIsIGNoYW5nZXMpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlMT0NBTF9BU1NJR047CisJCVZJRl9BU1NJR047CisJCV9fZW50cnktPm1hc3Rlcl9wcmVmID0gY29uZi0+bWFzdGVyX3ByZWY7CisJCV9fZW50cnktPmR1YWwgPSBjb25mLT5kdWFsOworCQlfX2VudHJ5LT5jaGFuZ2VzID0gY2hhbmdlczsKKwkpLAorCisJVFBfcHJpbnRrKAorCQlMT0NBTF9QUl9GTVQgIFZJRl9QUl9GTVQKKwkJIiwgbWFzdGVyIHByZWZlcmVuY2U6ICV1LCBkdWFsOiAlZCwgY2hhbmdlczogMHgleCIsCisJCUxPQ0FMX1BSX0FSRywgVklGX1BSX0FSRywgX19lbnRyeS0+bWFzdGVyX3ByZWYsCisJCV9fZW50cnktPmR1YWwsIF9fZW50cnktPmNoYW5nZXMKKwkpCispOworCitUUkFDRV9FVkVOVChkcnZfYWRkX25hbl9mdW5jLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmZ1bmMpLAorCisJVFBfQVJHUyhsb2NhbCwgc2RhdGEsIGZ1bmMpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCUxPQ0FMX0VOVFJZCisJCVZJRl9FTlRSWQorCQlfX2ZpZWxkKHU4LCB0eXBlKQorCQlfX2ZpZWxkKHU4LCBpbnN0X2lkKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJTE9DQUxfQVNTSUdOOworCQlWSUZfQVNTSUdOOworCQlfX2VudHJ5LT50eXBlID0gZnVuYy0+dHlwZTsKKwkJX19lbnRyeS0+aW5zdF9pZCA9IGZ1bmMtPmluc3RhbmNlX2lkOworCSksCisKKwlUUF9wcmludGsoCisJCUxPQ0FMX1BSX0ZNVCAgVklGX1BSX0ZNVAorCQkiLCB0eXBlOiAldSwgaW5zdF9pZDogJXUiLAorCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcsIF9fZW50cnktPnR5cGUsIF9fZW50cnktPmluc3RfaWQKKwkpCispOworCitUUkFDRV9FVkVOVChkcnZfZGVsX25hbl9mdW5jLAorCVRQX1BST1RPKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSB1OCBpbnN0YW5jZV9pZCksCisKKwlUUF9BUkdTKGxvY2FsLCBzZGF0YSwgaW5zdGFuY2VfaWQpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCUxPQ0FMX0VOVFJZCisJCVZJRl9FTlRSWQorCQlfX2ZpZWxkKHU4LCBpbnN0YW5jZV9pZCkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCUxPQ0FMX0FTU0lHTjsKKwkJVklGX0FTU0lHTjsKKwkJX19lbnRyeS0+aW5zdGFuY2VfaWQgPSBpbnN0YW5jZV9pZDsKKwkpLAorCisJVFBfcHJpbnRrKAorCQlMT0NBTF9QUl9GTVQgIFZJRl9QUl9GTVQKKwkJIiwgaW5zdGFuY2VfaWQ6ICV1IiwKKwkJTE9DQUxfUFJfQVJHLCBWSUZfUFJfQVJHLCBfX2VudHJ5LT5pbnN0YW5jZV9pZAorCSkKKyk7CisKIC8qCiAgKiBUcmFjaW5nIGZvciBBUEkgY2FsbHMgdGhhdCBkcml2ZXJzIGNhbGwuCiAgKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90eC5jIGIvbmV0L21hYzgwMjExL3R4LmMKaW5kZXggNTAyMzk2Ni4uMWM1NmFiYyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3R4LmMKKysrIGIvbmV0L21hYzgwMjExL3R4LmMKQEAgLTg1Myw4ICs4NTMsNyBAQAogCXRpZCA9ICpxYyAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOwogCXR4LT5zdGEtPnR4X3N0YXRzLm1zZHVbdGlkXSsrOwogCi0JaWYgKCF0eC0+c3RhLT5zdGEudHhxWzBdKQotCQloZHItPnNlcV9jdHJsID0gaWVlZTgwMjExX3R4X25leHRfc2VxKHR4LT5zdGEsIHRpZCk7CisJaGRyLT5zZXFfY3RybCA9IGllZWU4MDIxMV90eF9uZXh0X3NlcSh0eC0+c3RhLCB0aWQpOwogCiAJcmV0dXJuIFRYX0NPTlRJTlVFOwogfQpAQCAtMTM0Myw3ICsxMzQyLDcgQEAKIAlsb2NhbCA9IGNvbnRhaW5lcl9vZihmcSwgc3RydWN0IGllZWU4MDIxMV9sb2NhbCwgZnEpOwogCXR4cWkgPSBjb250YWluZXJfb2YodGluLCBzdHJ1Y3QgdHhxX2luZm8sIHRpbik7CiAJY3BhcmFtcyA9ICZsb2NhbC0+Y3BhcmFtczsKLQljc3RhdHMgPSAmbG9jYWwtPmNzdGF0czsKKwljc3RhdHMgPSAmdHhxaS0+Y3N0YXRzOwogCiAJaWYgKGZsb3cgPT0gJnR4cWktPmRlZl9mbG93KQogCQljdmFycyA9ICZ0eHFpLT5kZWZfY3ZhcnM7CkBAIC0xNDAzLDYgKzE0MDIsOCBAQAogCWZxX3Rpbl9pbml0KCZ0eHFpLT50aW4pOwogCWZxX2Zsb3dfaW5pdCgmdHhxaS0+ZGVmX2Zsb3cpOwogCWNvZGVsX3ZhcnNfaW5pdCgmdHhxaS0+ZGVmX2N2YXJzKTsKKwljb2RlbF9zdGF0c19pbml0KCZ0eHFpLT5jc3RhdHMpOworCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHhxaS0+ZnJhZ3MpOwogCiAJdHhxaS0+dHhxLnZpZiA9ICZzZGF0YS0+dmlmOwogCkBAIC0xNDI1LDYgKzE0MjYsNyBAQAogCXN0cnVjdCBmcV90aW4gKnRpbiA9ICZ0eHFpLT50aW47CiAKIAlmcV90aW5fcmVzZXQoZnEsIHRpbiwgZnFfc2tiX2ZyZWVfZnVuYyk7CisJaWVlZTgwMjExX3B1cmdlX3R4X3F1ZXVlKCZsb2NhbC0+aHcsICZ0eHFpLT5mcmFncyk7CiB9CiAKIGludCBpZWVlODAyMTFfdHhxX3NldHVwX2Zsb3dzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQpAQCAtMTQzMiw2ICsxNDM0LDggQEAKIAlzdHJ1Y3QgZnEgKmZxID0gJmxvY2FsLT5mcTsKIAlpbnQgcmV0OwogCWludCBpOworCWJvb2wgc3VwcF92aHQgPSBmYWxzZTsKKwllbnVtIG5sODAyMTFfYmFuZCBiYW5kOwogCiAJaWYgKCFsb2NhbC0+b3BzLT53YWtlX3R4X3F1ZXVlKQogCQlyZXR1cm4gMDsKQEAgLTE0NDAsOCArMTQ0NCwyNCBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwkvKgorCSAqIElmIHRoZSBoYXJkd2FyZSBkb2Vzbid0IHN1cHBvcnQgVkhULCBpdCBpcyBzYWZlIHRvIGxpbWl0IHRoZSBtYXhpbXVtCisJICogcXVldWUgc2l6ZS4gNCBNYnl0ZXMgaXMgNjQgbWF4LXNpemUgYWdncmVnYXRlcyBpbiA4MDIuMTFuLgorCSAqLworCWZvciAoYmFuZCA9IDA7IGJhbmQgPCBOVU1fTkw4MDIxMV9CQU5EUzsgYmFuZCsrKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCisJCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tiYW5kXTsKKwkJaWYgKCFzYmFuZCkKKwkJCWNvbnRpbnVlOworCisJCXN1cHBfdmh0ID0gc3VwcF92aHQgfHwgc2JhbmQtPnZodF9jYXAudmh0X3N1cHBvcnRlZDsKKwl9CisKKwlpZiAoIXN1cHBfdmh0KQorCQlmcS0+bWVtb3J5X2xpbWl0ID0gNCA8PCAyMDsgLyogNCBNYnl0ZXMgKi8KKwogCWNvZGVsX3BhcmFtc19pbml0KCZsb2NhbC0+Y3BhcmFtcyk7Ci0JY29kZWxfc3RhdHNfaW5pdCgmbG9jYWwtPmNzdGF0cyk7CiAJbG9jYWwtPmNwYXJhbXMuaW50ZXJ2YWwgPSBNUzJUSU1FKDEwMCk7CiAJbG9jYWwtPmNwYXJhbXMudGFyZ2V0ID0gTVMyVElNRSgyMCk7CiAJbG9jYWwtPmNwYXJhbXMuZWNuID0gdHJ1ZTsKQEAgLTE0NzYsNTAgKzE0OTYsNDYgQEAKIAlzcGluX3VubG9ja19iaCgmZnEtPmxvY2spOwogfQogCi1zdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3R4X2RlcXVldWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqdHhxKQorc3RhdGljIGJvb2wgaWVlZTgwMjExX3F1ZXVlX3NrYihzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOwotCXN0cnVjdCB0eHFfaW5mbyAqdHhxaSA9IGNvbnRhaW5lcl9vZih0eHEsIHN0cnVjdCB0eHFfaW5mbywgdHhxKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlzdHJ1Y3QgZnEgKmZxID0gJmxvY2FsLT5mcTsKLQlzdHJ1Y3QgZnFfdGluICp0aW4gPSAmdHhxaS0+dGluOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7CisJc3RydWN0IHR4cV9pbmZvICp0eHFpOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpwdWJzdGE7CisKKwlpZiAoIWxvY2FsLT5vcHMtPndha2VfdHhfcXVldWUgfHwKKwkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChzdGEgJiYgc3RhLT51cGxvYWRlZCkKKwkJcHVic3RhID0gJnN0YS0+c3RhOworCWVsc2UKKwkJcHVic3RhID0gTlVMTDsKKworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKKwkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHUuYXApOworCisJdmlmID0gJnNkYXRhLT52aWY7CisJdHhxaSA9IGllZWU4MDIxMV9nZXRfdHhxKGxvY2FsLCB2aWYsIHB1YnN0YSwgc2tiKTsKKworCWlmICghdHhxaSkKKwkJcmV0dXJuIGZhbHNlOworCisJaW5mby0+Y29udHJvbC52aWYgPSB2aWY7CiAKIAlzcGluX2xvY2tfYmgoJmZxLT5sb2NrKTsKLQotCWlmICh0ZXN0X2JpdChJRUVFODAyMTFfVFhRX1NUT1AsICZ0eHFpLT5mbGFncykpCi0JCWdvdG8gb3V0OwotCi0Jc2tiID0gZnFfdGluX2RlcXVldWUoZnEsIHRpbiwgZnFfdGluX2RlcXVldWVfZnVuYyk7Ci0JaWYgKCFza2IpCi0JCWdvdG8gb3V0OwotCi0JaWVlZTgwMjExX3NldF9za2JfdmlmKHNrYiwgdHhxaSk7Ci0KLQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7Ci0JaWYgKHR4cS0+c3RhICYmIGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gY29udGFpbmVyX29mKHR4cS0+c3RhLCBzdHJ1Y3Qgc3RhX2luZm8sCi0JCQkJCQkgICAgc3RhKTsKLQkJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwotCi0JCWhkci0+c2VxX2N0cmwgPSBpZWVlODAyMTFfdHhfbmV4dF9zZXEoc3RhLCB0eHEtPnRpZCk7Ci0JCWlmICh0ZXN0X2JpdChJRUVFODAyMTFfVFhRX0FNUERVLCAmdHhxaS0+ZmxhZ3MpKQotCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9BTVBEVTsKLQkJZWxzZQotCQkJaW5mby0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9UWF9DVExfQU1QRFU7Ci0JfQotCi1vdXQ6CisJaWVlZTgwMjExX3R4cV9lbnF1ZXVlKGxvY2FsLCB0eHFpLCBza2IpOwogCXNwaW5fdW5sb2NrX2JoKCZmcS0+bG9jayk7CiAKLQlpZiAoc2tiICYmIHNrYl9oYXNfZnJhZ19saXN0KHNrYikgJiYKLQkgICAgIWllZWU4MDIxMV9od19jaGVjaygmbG9jYWwtPmh3LCBUWF9GUkFHX0xJU1QpKQotCQlza2JfbGluZWFyaXplKHNrYik7CisJZHJ2X3dha2VfdHhfcXVldWUobG9jYWwsIHR4cWkpOwogCi0JcmV0dXJuIHNrYjsKKwlyZXR1cm4gdHJ1ZTsKIH0KLUVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3R4X2RlcXVldWUpOwogCiBzdGF0aWMgYm9vbCBpZWVlODAyMTFfdHhfZnJhZ3Moc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKQEAgLTE1MjgsOSArMTU0NCw3IEBACiAJCQkgICAgICAgYm9vbCB0eHBlbmRpbmcpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90eF9jb250cm9sIGNvbnRyb2wgPSB7fTsKLQlzdHJ1Y3QgZnEgKmZxID0gJmxvY2FsLT5mcTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOwotCXN0cnVjdCB0eHFfaW5mbyAqdHhxaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc2tiX3F1ZXVlX3dhbGtfc2FmZShza2JzLCBza2IsIHRtcCkgewpAQCAtMTU0NSwyMSArMTU1OSw2IEBACiAJCX0KICNlbmRpZgogCi0JCXR4cWkgPSBpZWVlODAyMTFfZ2V0X3R4cShsb2NhbCwgdmlmLCBzdGEsIHNrYik7Ci0JCWlmICh0eHFpKSB7Ci0JCQlpbmZvLT5jb250cm9sLnZpZiA9IHZpZjsKLQotCQkJX19za2JfdW5saW5rKHNrYiwgc2ticyk7Ci0KLQkJCXNwaW5fbG9ja19iaCgmZnEtPmxvY2spOwotCQkJaWVlZTgwMjExX3R4cV9lbnF1ZXVlKGxvY2FsLCB0eHFpLCBza2IpOwotCQkJc3Bpbl91bmxvY2tfYmgoJmZxLT5sb2NrKTsKLQotCQkJZHJ2X3dha2VfdHhfcXVldWUobG9jYWwsIHR4cWkpOwotCi0JCQljb250aW51ZTsKLQkJfQotCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+cXVldWVfc3RvcF9yZWFzb25fbG9jaywgZmxhZ3MpOwogCQlpZiAobG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uc1txXSB8fAogCQkgICAgKCF0eHBlbmRpbmcgJiYgIXNrYl9xdWV1ZV9lbXB0eSgmbG9jYWwtPnBlbmRpbmdbcV0pKSkgewpAQCAtMTY0Myw3ICsxNjQyLDcgQEAKIAogCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgotCQlpZiAoc2RhdGEtPnUubW50cl9mbGFncyAmIE1PTklUT1JfRkxBR19BQ1RJVkUpIHsKKwkJaWYgKHNkYXRhLT51Lm1udHIuZmxhZ3MgJiBNT05JVE9SX0ZMQUdfQUNUSVZFKSB7CiAJCQl2aWYgPSAmc2RhdGEtPnZpZjsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNjgwLDEwICsxNjc5LDEzIEBACiAvKgogICogSW52b2tlIFRYIGhhbmRsZXJzLCByZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCBub24temVybyBpZiB0aGUKICAqIGZyYW1lIHdhcyBkcm9wcGVkIG9yIHF1ZXVlZC4KKyAqCisgKiBUaGUgaGFuZGxlcnMgYXJlIHNwbGl0IGludG8gYW4gZWFybHkgYW5kIGxhdGUgcGFydC4gVGhlIGxhdHRlciBpcyBldmVyeXRoaW5nCisgKiB0aGF0IGNhbiBiZSBzZW5zaXRpdmUgdG8gcmVvcmRlcmluZywgYW5kIHdpbGwgYmUgZGVmZXJyZWQgdG8gYWZ0ZXIgcGFja2V0cworICogYXJlIGRlcXVldWVkIGZyb20gdGhlIGludGVybWVkaWF0ZSBxdWV1ZXMgKHdoZW4gdGhleSBhcmUgZW5hYmxlZCkuCiAgKi8KLXN0YXRpYyBpbnQgaW52b2tlX3R4X2hhbmRsZXJzKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCitzdGF0aWMgaW50IGludm9rZV90eF9oYW5kbGVyc19lYXJseShzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4KQogewotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHgtPnNrYik7CiAJaWVlZTgwMjExX3R4X3Jlc3VsdCByZXMgPSBUWF9EUk9QOwogCiAjZGVmaW5lIENBTExfVFhIKHR4aCkgXApAQCAtMTcwMSw2ICsxNzAzLDMxIEBACiAJaWYgKCFpZWVlODAyMTFfaHdfY2hlY2soJnR4LT5sb2NhbC0+aHcsIEhBU19SQVRFX0NPTlRST0wpKQogCQlDQUxMX1RYSChpZWVlODAyMTFfdHhfaF9yYXRlX2N0cmwpOwogCisgdHhoX2RvbmU6CisJaWYgKHVubGlrZWx5KHJlcyA9PSBUWF9EUk9QKSkgeworCQlJODAyX0RFQlVHX0lOQyh0eC0+bG9jYWwtPnR4X2hhbmRsZXJzX2Ryb3ApOworCQlpZiAodHgtPnNrYikKKwkJCWllZWU4MDIxMV9mcmVlX3R4c2tiKCZ0eC0+bG9jYWwtPmh3LCB0eC0+c2tiKTsKKwkJZWxzZQorCQkJaWVlZTgwMjExX3B1cmdlX3R4X3F1ZXVlKCZ0eC0+bG9jYWwtPmh3LCAmdHgtPnNrYnMpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmICh1bmxpa2VseShyZXMgPT0gVFhfUVVFVUVEKSkgeworCQlJODAyX0RFQlVHX0lOQyh0eC0+bG9jYWwtPnR4X2hhbmRsZXJzX3F1ZXVlZCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExhdGUgaGFuZGxlcnMgY2FuIGJlIGNhbGxlZCB3aGlsZSB0aGUgc3RhIGxvY2sgaXMgaGVsZC4gSGFuZGxlcnMgdGhhdCBjYW4KKyAqIGNhdXNlIHBhY2tldHMgdG8gYmUgZ2VuZXJhdGVkIHdpbGwgY2F1c2UgZGVhZGxvY2shCisgKi8KK3N0YXRpYyBpbnQgaW52b2tlX3R4X2hhbmRsZXJzX2xhdGUoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4LT5za2IpOworCWllZWU4MDIxMV90eF9yZXN1bHQgcmVzID0gVFhfQ09OVElOVUU7CisKIAlpZiAodW5saWtlbHkoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfSU5URkxfUkVUUkFOU01JU1NJT04pKSB7CiAJCV9fc2tiX3F1ZXVlX3RhaWwoJnR4LT5za2JzLCB0eC0+c2tiKTsKIAkJdHgtPnNrYiA9IE5VTEw7CkBAIC0xNzMzLDYgKzE3NjAsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBpbnZva2VfdHhfaGFuZGxlcnMoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKK3sKKwlpbnQgciA9IGludm9rZV90eF9oYW5kbGVyc19lYXJseSh0eCk7CisKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJcmV0dXJuIGludm9rZV90eF9oYW5kbGVyc19sYXRlKHR4KTsKK30KKwogYm9vbCBpZWVlODAyMTFfdHhfcHJlcGFyZV9za2Ioc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgaW50IGJhbmQsIHN0cnVjdCBpZWVlODAyMTFfc3RhICoqc3RhKQpAQCAtMTgwNyw3ICsxODQzLDEzIEBACiAJCWluZm8tPmh3X3F1ZXVlID0KIAkJCXNkYXRhLT52aWYuaHdfcXVldWVbc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYildOwogCi0JaWYgKCFpbnZva2VfdHhfaGFuZGxlcnMoJnR4KSkKKwlpZiAoaW52b2tlX3R4X2hhbmRsZXJzX2Vhcmx5KCZ0eCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChpZWVlODAyMTFfcXVldWVfc2tiKGxvY2FsLCBzZGF0YSwgdHguc3RhLCB0eC5za2IpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmICghaW52b2tlX3R4X2hhbmRsZXJzX2xhdGUoJnR4KSkKIAkJcmVzdWx0ID0gX19pZWVlODAyMTFfdHgobG9jYWwsICZ0eC5za2JzLCBsZWRfbGVuLAogCQkJCQl0eC5zdGEsIHR4cGVuZGluZyk7CiAKQEAgLTIyNjMsMTUgKzIzMDUsOSBAQAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKIAkJaWYgKHNkYXRhLT53ZGV2LndpcGh5LT5mbGFncyAmIFdJUEhZX0ZMQUdfU1VQUE9SVFNfVERMUykgewogCQkJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBza2ItPmRhdGEpOwotCQkJaWYgKHN0YSkgewotCQkJCWJvb2wgdGRsc19wZWVyLCB0ZGxzX2F1dGg7Ci0KLQkJCQl0ZGxzX3BlZXIgPSB0ZXN0X3N0YV9mbGFnKHN0YSwKLQkJCQkJCQkgIFdMQU5fU1RBX1RETFNfUEVFUik7Ci0JCQkJdGRsc19hdXRoID0gdGVzdF9zdGFfZmxhZyhzdGEsCi0JCQkJCQlXTEFOX1NUQV9URExTX1BFRVJfQVVUSCk7Ci0KLQkJCQlpZiAodGRsc19wZWVyICYmIHRkbHNfYXV0aCkgeworCQkJaWYgKHN0YSAmJiB0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfVERMU19QRUVSKSkgeworCQkJCWlmICh0ZXN0X3N0YV9mbGFnKHN0YSwKKwkJCQkJCSAgV0xBTl9TVEFfVERMU19QRUVSX0FVVEgpKSB7CiAJCQkJCSpzdGFfb3V0ID0gc3RhOwogCQkJCQlyZXR1cm4gMDsKIAkJCQl9CkBAIC0yMjgzLDggKzIzMTksNyBAQAogCQkJCSAqIGFmdGVyIGEgVERMUyBzdGEgaXMgcmVtb3ZlZCBkdWUgdG8gYmVpbmcKIAkJCQkgKiB1bnJlYWNoYWJsZS4KIAkJCQkgKi8KLQkJCQlpZiAodGRsc19wZWVyICYmICF0ZGxzX2F1dGggJiYKLQkJCQkgICAgIWllZWU4MDIxMV9pc190ZGxzX3NldHVwKHNrYikpCisJCQkJaWYgKCFpZWVlODAyMTFfaXNfdGRsc19zZXR1cChza2IpKQogCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIApAQCAtMjMzNCw3ICsyMzY5LDYgQEAKIAlzdHJ1Y3QgbWVzaF9wYXRoIF9fbWF5YmVfdW51c2VkICptcHBhdGggPSBOVUxMLCAqbXBhdGggPSBOVUxMOwogCWNvbnN0IHU4ICplbmNhcHNfZGF0YTsKIAlpbnQgZW5jYXBzX2xlbiwgc2tpcF9oZWFkZXJfYnl0ZXM7Ci0JaW50IG5oX3BvcywgaF9wb3M7CiAJYm9vbCB3bWVfc3RhID0gZmFsc2UsIGF1dGhvcml6ZWQgPSBmYWxzZTsKIAlib29sIHRkbHNfcGVlcjsKIAlib29sIG11bHRpY2FzdDsKQEAgLTI2NDAsMTMgKzI2NzQsNyBAQAogCQllbmNhcHNfbGVuID0gMDsKIAl9CiAKLQluaF9wb3MgPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSAtIHNrYi0+ZGF0YTsKLQloX3BvcyA9IHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2ItPmRhdGE7Ci0KIAlza2JfcHVsbChza2IsIHNraXBfaGVhZGVyX2J5dGVzKTsKLQluaF9wb3MgLT0gc2tpcF9oZWFkZXJfYnl0ZXM7Ci0JaF9wb3MgLT0gc2tpcF9oZWFkZXJfYnl0ZXM7Ci0KIAloZWFkX25lZWQgPSBoZHJsZW4gKyBlbmNhcHNfbGVuICsgbWVzaGhkcmxlbiAtIHNrYl9oZWFkcm9vbShza2IpOwogCiAJLyoKQEAgLTI2NzIsMTggKzI3MDAsMTIgQEAKIAkJfQogCX0KIAotCWlmIChlbmNhcHNfZGF0YSkgeworCWlmIChlbmNhcHNfZGF0YSkKIAkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgZW5jYXBzX2xlbiksIGVuY2Fwc19kYXRhLCBlbmNhcHNfbGVuKTsKLQkJbmhfcG9zICs9IGVuY2Fwc19sZW47Ci0JCWhfcG9zICs9IGVuY2Fwc19sZW47Ci0JfQogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKLQlpZiAobWVzaGhkcmxlbiA+IDApIHsKKwlpZiAobWVzaGhkcmxlbiA+IDApCiAJCW1lbWNweShza2JfcHVzaChza2IsIG1lc2hoZHJsZW4pLCAmbWVzaF9oZHIsIG1lc2hoZHJsZW4pOwotCQluaF9wb3MgKz0gbWVzaGhkcmxlbjsKLQkJaF9wb3MgKz0gbWVzaGhkcmxlbjsKLQl9CiAjZW5kaWYKIAogCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CkBAIC0yNjk5LDE1ICsyNzIxLDcgQEAKIAl9IGVsc2UKIAkJbWVtY3B5KHNrYl9wdXNoKHNrYiwgaGRybGVuKSwgJmhkciwgaGRybGVuKTsKIAotCW5oX3BvcyArPSBoZHJsZW47Ci0JaF9wb3MgKz0gaGRybGVuOwotCi0JLyogVXBkYXRlIHNrYiBwb2ludGVycyB0byB2YXJpb3VzIGhlYWRlcnMgc2luY2UgdGhpcyBtb2RpZmllZCBmcmFtZQotCSAqIGlzIGdvaW5nIHRvIGdvIHRocm91Z2ggTGludXggbmV0d29ya2luZyBjb2RlIHRoYXQgbWF5IHBvdGVudGlhbGx5Ci0JICogbmVlZCB0aGluZ3MgbGlrZSBwb2ludGVyIHRvIElQIGhlYWRlci4gKi8KIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwotCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBuaF9wb3MpOwotCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIGhfcG9zKTsKIAogCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwpAQCAtMzE3OSw4ICszMTkzLDcxIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIENhbiBiZSBjYWxsZWQgd2hpbGUgdGhlIHN0YSBsb2NrIGlzIGhlbGQuIEFueXRoaW5nIHRoYXQgY2FuIGNhdXNlIHBhY2tldHMgdG8KKyAqIGJlIGdlbmVyYXRlZCB3aWxsIGNhdXNlIGRlYWRsb2NrIQorICovCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfeG1pdF9mYXN0X2ZpbmlzaChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEsIHU4IHBuX29mZnMsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXksCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAodm9pZCAqKXNrYi0+ZGF0YTsKKwl1OCB0aWQgPSBJRUVFODAyMTFfTlVNX1RJRFM7CisKKwlpZiAoa2V5KQorCQlpbmZvLT5jb250cm9sLmh3X2tleSA9ICZrZXktPmNvbmY7CisKKwlpZWVlODAyMTFfdHhfc3RhdHMoc2tiLT5kZXYsIHNrYi0+bGVuKTsKKworCWlmIChoZHItPmZyYW1lX2NvbnRyb2wgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEpKSB7CisJCXRpZCA9IHNrYi0+cHJpb3JpdHkgJiBJRUVFODAyMTFfUU9TX0NUTF9UQUcxRF9NQVNLOworCQkqaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcikgPSB0aWQ7CisJCWhkci0+c2VxX2N0cmwgPSBpZWVlODAyMTFfdHhfbmV4dF9zZXEoc3RhLCB0aWQpOworCX0gZWxzZSB7CisJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfQVNTSUdOX1NFUTsKKwkJaGRyLT5zZXFfY3RybCA9IGNwdV90b19sZTE2KHNkYXRhLT5zZXF1ZW5jZV9udW1iZXIpOworCQlzZGF0YS0+c2VxdWVuY2VfbnVtYmVyICs9IDB4MTA7CisJfQorCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpCisJCXN0YS0+dHhfc3RhdHMubXNkdVt0aWRdICs9CisJCQlESVZfUk9VTkRfVVAoc2tiLT5sZW4sIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpOworCWVsc2UKKwkJc3RhLT50eF9zdGF0cy5tc2R1W3RpZF0rKzsKKworCWluZm8tPmh3X3F1ZXVlID0gc2RhdGEtPnZpZi5od19xdWV1ZVtza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKV07CisKKwkvKiBzdGF0aXN0aWNzIG5vcm1hbGx5IGRvbmUgYnkgaWVlZTgwMjExX3R4X2hfc3RhdHMgKGJ1dCB0aGF0CisJICogaGFzIHRvIGNvbnNpZGVyIGZyYWdtZW50YXRpb24sIHNvIGlzIG1vcmUgY29tcGxleCkKKwkgKi8KKwlzdGEtPnR4X3N0YXRzLmJ5dGVzW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXSArPSBza2ItPmxlbjsKKwlzdGEtPnR4X3N0YXRzLnBhY2tldHNbc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYildKys7CisKKwlpZiAocG5fb2ZmcykgeworCQl1NjQgcG47CisJCXU4ICpjcnlwdG9faGRyID0gc2tiLT5kYXRhICsgcG5fb2ZmczsKKworCQlzd2l0Y2ggKGtleS0+Y29uZi5jaXBoZXIpIHsKKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgorCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVBfMjU2OgorCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0dDTVA6CisJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfR0NNUF8yNTY6CisJCQlwbiA9IGF0b21pYzY0X2luY19yZXR1cm4oJmtleS0+Y29uZi50eF9wbik7CisJCQljcnlwdG9faGRyWzBdID0gcG47CisJCQljcnlwdG9faGRyWzFdID0gcG4gPj4gODsKKwkJCWNyeXB0b19oZHJbNF0gPSBwbiA+PiAxNjsKKwkJCWNyeXB0b19oZHJbNV0gPSBwbiA+PiAyNDsKKwkJCWNyeXB0b19oZHJbNl0gPSBwbiA+PiAzMjsKKwkJCWNyeXB0b19oZHJbN10gPSBwbiA+PiA0MDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCiBzdGF0aWMgYm9vbCBpZWVlODAyMTFfeG1pdF9mYXN0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJCXN0cnVjdCBzdGFfaW5mbyAqc3RhLAogCQkJCXN0cnVjdCBpZWVlODAyMTFfZmFzdF90eCAqZmFzdF90eCwKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMzIzMSw4ICszMzA4LDYgQEAKIAkJCXJldHVybiB0cnVlOwogCX0KIAotCWllZWU4MDIxMV90eF9zdGF0cyhkZXYsIHNrYi0+bGVuICsgZXh0cmFfaGVhZCk7Ci0KIAlpZiAoKGhkci0+ZnJhbWVfY29udHJvbCAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQSkpICYmCiAJICAgIGllZWU4MDIxMV9hbXNkdV9hZ2dyZWdhdGUoc2RhdGEsIHN0YSwgZmFzdF90eCwgc2tiKSkKIAkJcmV0dXJuIHRydWU7CkBAIC0zMjYxLDI0ICszMzM2LDcgQEAKIAlpbmZvLT5mbGFncyA9IElFRUU4MDIxMV9UWF9DVExfRklSU1RfRlJBR01FTlQgfAogCQkgICAgICBJRUVFODAyMTFfVFhfQ1RMX0RPTlRGUkFHIHwKIAkJICAgICAgKHRpZF90eCA/IElFRUU4MDIxMV9UWF9DVExfQU1QRFUgOiAwKTsKLQotCWlmIChoZHItPmZyYW1lX2NvbnRyb2wgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEpKSB7Ci0JCSppZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSA9IHRpZDsKLQkJaWYgKCFzdGEtPnN0YS50eHFbMF0pCi0JCQloZHItPnNlcV9jdHJsID0gaWVlZTgwMjExX3R4X25leHRfc2VxKHN0YSwgdGlkKTsKLQl9IGVsc2UgewotCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX0FTU0lHTl9TRVE7Ci0JCWhkci0+c2VxX2N0cmwgPSBjcHVfdG9fbGUxNihzZGF0YS0+c2VxdWVuY2VfbnVtYmVyKTsKLQkJc2RhdGEtPnNlcXVlbmNlX251bWJlciArPSAweDEwOwotCX0KLQotCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKQotCQlzdGEtPnR4X3N0YXRzLm1zZHVbdGlkXSArPQotCQkJRElWX1JPVU5EX1VQKHNrYi0+bGVuLCBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKTsKLQllbHNlCi0JCXN0YS0+dHhfc3RhdHMubXNkdVt0aWRdKys7Ci0KLQlpbmZvLT5od19xdWV1ZSA9IHNkYXRhLT52aWYuaHdfcXVldWVbc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYildOworCWluZm8tPmNvbnRyb2wuZmxhZ3MgPSBJRUVFODAyMTFfVFhfQ1RSTF9GQVNUX1hNSVQ7CiAKIAlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnR4LnNrYnMpOwogCkBAIC0zMjg4LDkgKzMzNDYsNiBAQAogCXR4LnN0YSA9IHN0YTsKIAl0eC5rZXkgPSBmYXN0X3R4LT5rZXk7CiAKLQlpZiAoZmFzdF90eC0+a2V5KQotCQlpbmZvLT5jb250cm9sLmh3X2tleSA9ICZmYXN0X3R4LT5rZXktPmNvbmY7Ci0KIAlpZiAoIWllZWU4MDIxMV9od19jaGVjaygmbG9jYWwtPmh3LCBIQVNfUkFURV9DT05UUk9MKSkgewogCQl0eC5za2IgPSBza2I7CiAJCXIgPSBpZWVlODAyMTFfdHhfaF9yYXRlX2N0cmwoJnR4KTsKQEAgLTMzMDQsMzEgKzMzNTksMTEgQEAKIAkJfQogCX0KIAotCS8qIHN0YXRpc3RpY3Mgbm9ybWFsbHkgZG9uZSBieSBpZWVlODAyMTFfdHhfaF9zdGF0cyAoYnV0IHRoYXQKLQkgKiBoYXMgdG8gY29uc2lkZXIgZnJhZ21lbnRhdGlvbiwgc28gaXMgbW9yZSBjb21wbGV4KQotCSAqLwotCXN0YS0+dHhfc3RhdHMuYnl0ZXNbc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYildICs9IHNrYi0+bGVuOwotCXN0YS0+dHhfc3RhdHMucGFja2V0c1tza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKV0rKzsKKwlpZiAoaWVlZTgwMjExX3F1ZXVlX3NrYihsb2NhbCwgc2RhdGEsIHN0YSwgc2tiKSkKKwkJcmV0dXJuIHRydWU7CiAKLQlpZiAoZmFzdF90eC0+cG5fb2ZmcykgewotCQl1NjQgcG47Ci0JCXU4ICpjcnlwdG9faGRyID0gc2tiLT5kYXRhICsgZmFzdF90eC0+cG5fb2ZmczsKLQotCQlzd2l0Y2ggKGZhc3RfdHgtPmtleS0+Y29uZi5jaXBoZXIpIHsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVBfMjU2OgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0dDTVA6Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfR0NNUF8yNTY6Ci0JCQlwbiA9IGF0b21pYzY0X2luY19yZXR1cm4oJmZhc3RfdHgtPmtleS0+Y29uZi50eF9wbik7Ci0JCQljcnlwdG9faGRyWzBdID0gcG47Ci0JCQljcnlwdG9faGRyWzFdID0gcG4gPj4gODsKLQkJCWNyeXB0b19oZHJbNF0gPSBwbiA+PiAxNjsKLQkJCWNyeXB0b19oZHJbNV0gPSBwbiA+PiAyNDsKLQkJCWNyeXB0b19oZHJbNl0gPSBwbiA+PiAzMjsKLQkJCWNyeXB0b19oZHJbN10gPSBwbiA+PiA0MDsKLQkJCWJyZWFrOwotCQl9Ci0JfQorCWllZWU4MDIxMV94bWl0X2Zhc3RfZmluaXNoKHNkYXRhLCBzdGEsIGZhc3RfdHgtPnBuX29mZnMsCisJCQkJICAgZmFzdF90eC0+a2V5LCBza2IpOwogCiAJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKQogCQlzZGF0YSA9IGNvbnRhaW5lcl9vZihzZGF0YS0+YnNzLApAQCAtMzMzOSw2ICszMzc0LDk0IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0cnVjdCBza19idWZmICppZWVlODAyMTFfdHhfZGVxdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhxICp0eHEpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CisJc3RydWN0IHR4cV9pbmZvICp0eHFpID0gY29udGFpbmVyX29mKHR4cSwgc3RydWN0IHR4cV9pbmZvLCB0eHEpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IGZxICpmcSA9ICZsb2NhbC0+ZnE7CisJc3RydWN0IGZxX3RpbiAqdGluID0gJnR4cWktPnRpbjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJc3RydWN0IGllZWU4MDIxMV90eF9kYXRhIHR4OworCWllZWU4MDIxMV90eF9yZXN1bHQgcjsKKworCXNwaW5fbG9ja19iaCgmZnEtPmxvY2spOworCisJaWYgKHRlc3RfYml0KElFRUU4MDIxMV9UWFFfU1RPUCwgJnR4cWktPmZsYWdzKSkKKwkJZ290byBvdXQ7CisKKwkvKiBNYWtlIHN1cmUgZnJhZ21lbnRzIHN0YXkgdG9nZXRoZXIuICovCisJc2tiID0gX19za2JfZGVxdWV1ZSgmdHhxaS0+ZnJhZ3MpOworCWlmIChza2IpCisJCWdvdG8gb3V0OworCitiZWdpbjoKKwlza2IgPSBmcV90aW5fZGVxdWV1ZShmcSwgdGluLCBmcV90aW5fZGVxdWV1ZV9mdW5jKTsKKwlpZiAoIXNrYikKKwkJZ290byBvdXQ7CisKKwlpZWVlODAyMTFfc2V0X3NrYl92aWYoc2tiLCB0eHFpKTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCisJbWVtc2V0KCZ0eCwgMCwgc2l6ZW9mKHR4KSk7CisJX19za2JfcXVldWVfaGVhZF9pbml0KCZ0eC5za2JzKTsKKwl0eC5sb2NhbCA9IGxvY2FsOworCXR4LnNrYiA9IHNrYjsKKwl0eC5zZGF0YSA9IHZpZl90b19zZGF0YShpbmZvLT5jb250cm9sLnZpZik7CisKKwlpZiAodHhxLT5zdGEpCisJCXR4LnN0YSA9IGNvbnRhaW5lcl9vZih0eHEtPnN0YSwgc3RydWN0IHN0YV9pbmZvLCBzdGEpOworCisJLyoKKwkgKiBUaGUga2V5IGNhbiBiZSByZW1vdmVkIHdoaWxlIHRoZSBwYWNrZXQgd2FzIHF1ZXVlZCwgc28gbmVlZCB0byBjYWxsCisJICogdGhpcyBoZXJlIHRvIGdldCB0aGUgY3VycmVudCBrZXkuCisJICovCisJciA9IGllZWU4MDIxMV90eF9oX3NlbGVjdF9rZXkoJnR4KTsKKwlpZiAociAhPSBUWF9DT05USU5VRSkgeworCQlpZWVlODAyMTFfZnJlZV90eHNrYigmbG9jYWwtPmh3LCBza2IpOworCQlnb3RvIGJlZ2luOworCX0KKworCWlmIChpbmZvLT5jb250cm9sLmZsYWdzICYgSUVFRTgwMjExX1RYX0NUUkxfRkFTVF9YTUlUKSB7CisJCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gY29udGFpbmVyX29mKHR4cS0+c3RhLCBzdHJ1Y3Qgc3RhX2luZm8sCisJCQkJCQkgICAgc3RhKTsKKwkJdTggcG5fb2ZmcyA9IDA7CisKKwkJaWYgKHR4LmtleSAmJgorCQkgICAgKHR4LmtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVikpCisJCQlwbl9vZmZzID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOworCisJCWllZWU4MDIxMV94bWl0X2Zhc3RfZmluaXNoKHN0YS0+c2RhdGEsIHN0YSwgcG5fb2ZmcywKKwkJCQkJICAgdHgua2V5LCBza2IpOworCX0gZWxzZSB7CisJCWlmIChpbnZva2VfdHhfaGFuZGxlcnNfbGF0ZSgmdHgpKQorCQkJZ290byBiZWdpbjsKKworCQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZ0eC5za2JzKTsKKworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdHguc2ticykpCisJCQlza2JfcXVldWVfc3BsaWNlX3RhaWwoJnR4LnNrYnMsICZ0eHFpLT5mcmFncyk7CisJfQorCisJaWYgKHNrYiAmJiBza2JfaGFzX2ZyYWdfbGlzdChza2IpICYmCisJICAgICFpZWVlODAyMTFfaHdfY2hlY2soJmxvY2FsLT5odywgVFhfRlJBR19MSVNUKSkgeworCQlpZiAoc2tiX2xpbmVhcml6ZShza2IpKSB7CisJCQlpZWVlODAyMTFfZnJlZV90eHNrYigmbG9jYWwtPmh3LCBza2IpOworCQkJZ290byBiZWdpbjsKKwkJfQorCX0KKworb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZmcS0+bG9jayk7CisKKwlyZXR1cm4gc2tiOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfdHhfZGVxdWV1ZSk7CisKIHZvaWQgX19pZWVlODAyMTFfc3ViaWZfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgIHUzMiBpbmZvX2ZsYWdzKQpAQCAtMzM2Myw3ICszNDg2LDcgQEAKIAkJZmFzdF90eCA9IHJjdV9kZXJlZmVyZW5jZShzdGEtPmZhc3RfdHgpOwogCiAJCWlmIChmYXN0X3R4ICYmCi0JCSAgICBpZWVlODAyMTFfeG1pdF9mYXN0KHNkYXRhLCBkZXYsIHN0YSwgZmFzdF90eCwgc2tiKSkKKwkJICAgIGllZWU4MDIxMV94bWl0X2Zhc3Qoc2RhdGEsIHN0YSwgZmFzdF90eCwgc2tiKSkKIAkJCWdvdG8gb3V0OwogCX0KIApAQCAtNDM5MCw5ICs0NTEzLDYgQEAKIAlpbnQgYWMgPSBpZWVlODAyXzFkX3RvX2FjW3RpZCAmIDddOwogCiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKLQlza2JfcmVzZXRfdHJhbnNwb3J0X2hlYWRlcihza2IpOwotCiAJc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgYWMpOwogCXNrYi0+cHJpb3JpdHkgPSB0aWQ7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS91dGlsLmMgYi9uZXQvbWFjODAyMTEvdXRpbC5jCmluZGV4IDQyYmYwYjYuLjU0NWM3OWEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS91dGlsLmMKKysrIGIvbmV0L21hYzgwMjExL3V0aWwuYwpAQCAtNTk4LDcgKzU5OCw3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgewogCQlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgewogCQljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6Ci0JCQlpZiAoIShzZGF0YS0+dS5tbnRyX2ZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkpCisJCQlpZiAoIShzZGF0YS0+dS5tbnRyLmZsYWdzICYgTU9OSVRPUl9GTEFHX0FDVElWRSkpCiAJCQkJY29udGludWU7CiAJCQlicmVhazsKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgpAQCAtMTIwOSw3ICsxMjA5LDggQEAKIAl9CiAKIAlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYKLQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpIHsKKwkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UgJiYKKwkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX05BTikgewogCQlzZGF0YS0+dmlmLmJzc19jb25mLnFvcyA9IGVuYWJsZV9xb3M7CiAJCWlmIChic3Nfbm90aWZ5KQogCQkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsCkBAIC0xNzQ4LDYgKzE3NDksNDYgQEAKIAltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKIH0KIAorc3RhdGljIGludCBpZWVlODAyMTFfcmVjb25maWdfbmFuKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCXN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuYyAqZnVuYywgKipmdW5jczsKKwlpbnQgcmVzLCBpZCwgaSA9IDA7CisKKwlyZXMgPSBkcnZfc3RhcnRfbmFuKHNkYXRhLT5sb2NhbCwgc2RhdGEsCisJCQkgICAgJnNkYXRhLT51Lm5hbi5jb25mKTsKKwlpZiAoV0FSTl9PTihyZXMpKQorCQlyZXR1cm4gcmVzOworCisJZnVuY3MgPSBremFsbG9jKChzZGF0YS0+bG9jYWwtPmh3Lm1heF9uYW5fZGVfZW50cmllcyArIDEpICoKKwkJCXNpemVvZigqZnVuY3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ1bmNzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEFkZCBhbGwgdGhlIGZ1bmN0aW9uczoKKwkgKiBUaGlzIGlzIGEgbGl0dGxlIGJpdCB1Z2x5LiBXZSBuZWVkIHRvIGNhbGwgYSBwb3RlbnRpYWxseSBzbGVlcGluZworCSAqIGNhbGxiYWNrIGZvciBlYWNoIE5BTiBmdW5jdGlvbiwgc28gd2UgY2FuJ3QgaG9sZCB0aGUgc3BpbmxvY2suCisJICovCisJc3Bpbl9sb2NrX2JoKCZzZGF0YS0+dS5uYW4uZnVuY19sb2NrKTsKKworCWlkcl9mb3JfZWFjaF9lbnRyeSgmc2RhdGEtPnUubmFuLmZ1bmN0aW9uX2luc3RfaWRzLCBmdW5jLCBpZCkKKwkJZnVuY3NbaSsrXSA9IGZ1bmM7CisKKwlzcGluX3VubG9ja19iaCgmc2RhdGEtPnUubmFuLmZ1bmNfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBmdW5jc1tpXTsgaSsrKSB7CisJCXJlcyA9IGRydl9hZGRfbmFuX2Z1bmMoc2RhdGEtPmxvY2FsLCBzZGF0YSwgZnVuY3NbaV0pOworCQlpZiAoV0FSTl9PTihyZXMpKQorCQkJaWVlZTgwMjExX25hbl9mdW5jX3Rlcm1pbmF0ZWQoJnNkYXRhLT52aWYsCisJCQkJCQkgICAgICBmdW5jc1tpXS0+aW5zdGFuY2VfaWQsCisJCQkJCQkgICAgICBOTDgwMjExX05BTl9GVU5DX1RFUk1fUkVBU09OX0VSUk9SLAorCQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJfQorCisJa2ZyZWUoZnVuY3MpOworCisJcmV0dXJuIDA7Cit9CisKIGludCBpZWVlODAyMTFfcmVjb25maWcoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSAmbG9jYWwtPmh3OwpAQCAtMTk3MSw2ICsyMDEyLDEzIEBACiAJCQkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIGNoYW5nZWQpOwogCQkJfQogCQkJYnJlYWs7CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgorCQkJcmVzID0gaWVlZTgwMjExX3JlY29uZmlnX25hbihzZGF0YSk7CisJCQlpZiAocmVzIDwgMCkgeworCQkJCWllZWU4MDIxMV9oYW5kbGVfcmVjb25maWdfZmFpbHVyZShsb2NhbCk7CisJCQkJcmV0dXJuIHJlczsKKwkJCX0KKwkJCWJyZWFrOwogCQljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgogCQljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CkBAIC0yNTU1LDcgKzI2MDMsNiBAQAogCiAJCWlmIChuZWVkX2Jhc2ljICYmIGJhc2ljX3JhdGVzICYgQklUKGkpKQogCQkJYmFzaWMgPSAweDgwOwotCQlyYXRlID0gc2JhbmQtPmJpdHJhdGVzW2ldLmJpdHJhdGU7CiAJCXJhdGUgPSBESVZfUk9VTkRfVVAoc2JhbmQtPmJpdHJhdGVzW2ldLmJpdHJhdGUsCiAJCQkJICAgIDUgKiAoMSA8PCBzaGlmdCkpOwogCQkqcG9zKysgPSBiYXNpYyB8ICh1OCkgcmF0ZTsKQEAgLTMzOTQsMTEgKzM0NDEsMTggQEAKIAkJCSAgICAgdW5zaWduZWQgbG9uZyAqYnl0ZV9jbnQpCiB7CiAJc3RydWN0IHR4cV9pbmZvICp0eHFpID0gdG9fdHhxX2luZm8odHhxKTsKKwl1MzIgZnJhZ19jbnQgPSAwLCBmcmFnX2J5dGVzID0gMDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiX3F1ZXVlX3dhbGsoJnR4cWktPmZyYWdzLCBza2IpIHsKKwkJZnJhZ19jbnQrKzsKKwkJZnJhZ19ieXRlcyArPSBza2ItPmxlbjsKKwl9CiAKIAlpZiAoZnJhbWVfY250KQotCQkqZnJhbWVfY250ID0gdHhxaS0+dGluLmJhY2tsb2dfcGFja2V0czsKKwkJKmZyYW1lX2NudCA9IHR4cWktPnRpbi5iYWNrbG9nX3BhY2tldHMgKyBmcmFnX2NudDsKIAogCWlmIChieXRlX2NudCkKLQkJKmJ5dGVfY250ID0gdHhxaS0+dGluLmJhY2tsb2dfYnl0ZXM7CisJCSpieXRlX2NudCA9IHR4cWktPnRpbi5iYWNrbG9nX2J5dGVzICsgZnJhZ19ieXRlczsKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3R4cV9nZXRfZGVwdGgpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjE1NC9pZmFjZS5jIGIvbmV0L21hYzgwMjE1NC9pZmFjZS5jCmluZGV4IDcwNzljZDMuLjA2MDE5ZGIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxNTQvaWZhY2UuYworKysgYi9uZXQvbWFjODAyMTU0L2lmYWNlLmMKQEAgLTY2Myw2ICs2NjMsNyBAQAogCiAJLyogVE9ETyBjaGVjayB0aGlzICovCiAJU0VUX05FVERFVl9ERVYobmRldiwgJmxvY2FsLT5waHktPmRldik7CisJZGV2X25ldF9zZXQobmRldiwgd3Bhbl9waHlfbmV0KGxvY2FsLT5ody5waHkpKTsKIAlzZGF0YSA9IG5ldGRldl9wcml2KG5kZXYpOwogCW5kZXYtPmllZWU4MDIxNTRfcHRyID0gJnNkYXRhLT53cGFuX2RldjsKIAltZW1jcHkoc2RhdGEtPm5hbWUsIG5kZXYtPm5hbWUsIElGTkFNU0laKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxNTQvcnguYyBiL25ldC9tYWM4MDIxNTQvcnguYwppbmRleCA0NDZlMTMwLi40ZGNmNmUxIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTU0L3J4LmMKKysrIGIvbmV0L21hYzgwMjE1NC9yeC5jCkBAIC0xMDEsMTEgKzEwMSwxNiBAQAogCXNkYXRhLT5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwogCiAJc3dpdGNoIChtYWNfY2Ioc2tiKS0+dHlwZSkgeworCWNhc2UgSUVFRTgwMjE1NF9GQ19UWVBFX0JFQUNPTjoKKwljYXNlIElFRUU4MDIxNTRfRkNfVFlQRV9BQ0s6CisJY2FzZSBJRUVFODAyMTU0X0ZDX1RZUEVfTUFDX0NNRDoKKwkJZ290byBmYWlsOworCiAJY2FzZSBJRUVFODAyMTU0X0ZDX1RZUEVfREFUQToKIAkJcmV0dXJuIGllZWU4MDIxNTRfZGVsaXZlcl9za2Ioc2tiKTsKIAlkZWZhdWx0OgotCQlwcl93YXJuKCJpZWVlODAyMTU0OiBiYWQgZnJhbWUgcmVjZWl2ZWQgKHR5cGUgPSAlZClcbiIsCi0JCQltYWNfY2Ioc2tiKS0+dHlwZSk7CisJCXByX3dhcm5fcmF0ZWxpbWl0ZWQoImllZWU4MDIxNTQ6IGJhZCBmcmFtZSByZWNlaXZlZCAiCisJCQkJICAgICIodHlwZSA9ICVkKVxuIiwgbWFjX2NiKHNrYiktPnR5cGUpOwogCQlnb3RvIGZhaWw7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvbXBscy9hZl9tcGxzLmMgYi9uZXQvbXBscy9hZl9tcGxzLmMKaW5kZXggNWMxNjFlNy4uMGU0MzM0YyAxMDA2NDQKLS0tIGEvbmV0L21wbHMvYWZfbXBscy5jCisrKyBiL25ldC9tcGxzL2FmX21wbHMuYwpAQCAtOTYxLDkgKzk2MSw2IEBACiAJCQkJUkNVX0lOSVRfUE9JTlRFUihuaC0+bmhfZGV2LCBOVUxMKTsKIAkJfSBlbmRmb3JfbmV4dGhvcHMocnQpOwogCX0KLQotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCBtcGxzX2lmdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG5oX2ZsYWdzKQpAQCAtOTk3LDggKzk5NCw2IEBACiAKIAkJQUNDRVNTX09OQ0UocnQtPnJ0X25obl9hbGl2ZSkgPSBhbGl2ZTsKIAl9Ci0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQgbXBsc19kZXZfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwKZGlmZiAtLWdpdCBhL25ldC9tcGxzL2ludGVybmFsLmggYi9uZXQvbXBscy9pbnRlcm5hbC5oCmluZGV4IDczMmE1YzEuLmJkZmVmNmMgMTAwNjQ0Ci0tLSBhL25ldC9tcGxzL2ludGVybmFsLmgKKysrIGIvbmV0L21wbHMvaW50ZXJuYWwuaApAQCAtMSw5ICsxLDYgQEAKICNpZm5kZWYgTVBMU19JTlRFUk5BTF9ICiAjZGVmaW5lIE1QTFNfSU5URVJOQUxfSAotCi1zdHJ1Y3QgbXBsc19zaGltX2hkciB7Ci0JX19iZTMyIGxhYmVsX3N0YWNrX2VudHJ5OwotfTsKKyNpbmNsdWRlIDxuZXQvbXBscy5oPgogCiBzdHJ1Y3QgbXBsc19lbnRyeV9kZWNvZGVkIHsKIAl1MzIgbGFiZWw7CkBAIC05MywxMSArOTAsNiBAQAogCiAjZGVmaW5lIGVuZGZvcl9uZXh0aG9wcyhydCkgfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtcGxzX3NoaW1faGRyICptcGxzX2hkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXJldHVybiAoc3RydWN0IG1wbHNfc2hpbV9oZHIgKilza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbXBsc19zaGltX2hkciBtcGxzX2VudHJ5X2VuY29kZSh1MzIgbGFiZWwsIHVuc2lnbmVkIHR0bCwgdW5zaWduZWQgdGMsIGJvb2wgYm9zKQogewogCXN0cnVjdCBtcGxzX3NoaW1faGRyIHJlc3VsdDsKZGlmZiAtLWdpdCBhL25ldC9tcGxzL21wbHNfZ3NvLmMgYi9uZXQvbXBscy9tcGxzX2dzby5jCmluZGV4IDIwNTVlNTcuLmI0ZGE2ZDggMTAwNjQ0Ci0tLSBhL25ldC9tcGxzL21wbHNfZ3NvLmMKKysrIGIvbmV0L21wbHMvbXBsc19nc28uYwpAQCAtMjMsMzIgKzIzLDUwIEBACiAJCQkJICAgICAgIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBza19idWZmICpzZWdzID0gRVJSX1BUUigtRUlOVkFMKTsKKwl1MTYgbWFjX29mZnNldCA9IHNrYi0+bWFjX2hlYWRlcjsKIAluZXRkZXZfZmVhdHVyZXNfdCBtcGxzX2ZlYXR1cmVzOworCXUxNiBtYWNfbGVuID0gc2tiLT5tYWNfbGVuOwogCV9fYmUxNiBtcGxzX3Byb3RvY29sOworCXVuc2lnbmVkIGludCBtcGxzX2hsZW47CisKKwlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKKwltcGxzX2hsZW4gPSBza2JfaW5uZXJfbmV0d29ya19oZWFkZXIoc2tiKSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIG1wbHNfaGxlbikpKQorCQlnb3RvIG91dDsKIAogCS8qIFNldHVwIGlubmVyIFNLQi4gKi8KIAltcGxzX3Byb3RvY29sID0gc2tiLT5wcm90b2NvbDsKIAlza2ItPnByb3RvY29sID0gc2tiLT5pbm5lcl9wcm90b2NvbDsKIAotCS8qIFB1c2ggYmFjayB0aGUgbWFjIGhlYWRlciB0aGF0IHNrYl9tYWNfZ3NvX3NlZ21lbnQoKSBoYXMgcHVsbGVkLgotCSAqIEl0IHdpbGwgYmUgcmUtcHVsbGVkIGJ5IHRoZSBjYWxsIHRvIHNrYl9tYWNfZ3NvX3NlZ21lbnQoKSBiZWxvdwotCSAqLwotCV9fc2tiX3B1c2goc2tiLCBza2ItPm1hY19sZW4pOworCV9fc2tiX3B1bGwoc2tiLCBtcGxzX2hsZW4pOworCisJc2tiLT5tYWNfbGVuID0gMDsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCiAJLyogU2VnbWVudCBpbm5lciBwYWNrZXQuICovCiAJbXBsc19mZWF0dXJlcyA9IHNrYi0+ZGV2LT5tcGxzX2ZlYXR1cmVzICYgZmVhdHVyZXM7CiAJc2VncyA9IHNrYl9tYWNfZ3NvX3NlZ21lbnQoc2tiLCBtcGxzX2ZlYXR1cmVzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoc2VncykpIHsKKwkJc2tiX2dzb19lcnJvcl91bndpbmQoc2tiLCBtcGxzX3Byb3RvY29sLCBtcGxzX2hsZW4sIG1hY19vZmZzZXQsCisJCQkJICAgICBtYWNfbGVuKTsKKwkJZ290byBvdXQ7CisJfQorCXNrYiA9IHNlZ3M7CiAKKwltcGxzX2hsZW4gKz0gbWFjX2xlbjsKKwlkbyB7CisJCXNrYi0+bWFjX2xlbiA9IG1hY19sZW47CisJCXNrYi0+cHJvdG9jb2wgPSBtcGxzX3Byb3RvY29sOwogCi0JLyogUmVzdG9yZSBvdXRlciBwcm90b2NvbC4gKi8KLQlza2ItPnByb3RvY29sID0gbXBsc19wcm90b2NvbDsKKwkJc2tiX3Jlc2V0X2lubmVyX25ldHdvcmtfaGVhZGVyKHNrYik7CiAKLQkvKiBSZS1wdWxsIHRoZSBtYWMgaGVhZGVyIHRoYXQgdGhlIGNhbGwgdG8gc2tiX21hY19nc29fc2VnbWVudCgpCi0JICogYWJvdmUgcHVsbGVkLiAgSXQgd2lsbCBiZSByZS1wdXNoZWQgYWZ0ZXIgcmV0dXJuaW5nCi0JICogc2tiX21hY19nc29fc2VnbWVudCgpLCBhbiBpbmRpcmVjdCBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbi4KLQkgKi8KLQlfX3NrYl9wdWxsKHNrYiwgc2tiLT5kYXRhIC0gc2tiX21hY19oZWFkZXIoc2tiKSk7CisJCV9fc2tiX3B1c2goc2tiLCBtcGxzX2hsZW4pOwogCisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBtYWNfbGVuKTsKKwl9IHdoaWxlICgoc2tiID0gc2tiLT5uZXh0KSk7CisKK291dDoKIAlyZXR1cm4gc2VnczsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L21wbHMvbXBsc19pcHR1bm5lbC5jIGIvbmV0L21wbHMvbXBsc19pcHR1bm5lbC5jCmluZGV4IDY0NGE4ZGEuLmNmNTJjZjMgMTAwNjQ0Ci0tLSBhL25ldC9tcGxzL21wbHNfaXB0dW5uZWwuYworKysgYi9uZXQvbXBscy9tcGxzX2lwdHVubmVsLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlyZXR1cm4gZW4tPmxhYmVscyAqIHNpemVvZihzdHJ1Y3QgbXBsc19zaGltX2hkcik7CiB9CiAKLXN0YXRpYyBpbnQgbXBsc19vdXRwdXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IG1wbHNfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBtcGxzX2lwdHVubmVsX2VuY2FwICp0dW5fZW5jYXBfaW5mbzsKIAlzdHJ1Y3QgbXBsc19zaGltX2hkciAqaGRyOwpAQCAtOTAsNyArOTAsMTEgQEAKIAlpZiAoc2tiX2Nvdyhza2IsIGhoX2xlbiArIG5ld19oZWFkZXJfc2l6ZSkpCiAJCWdvdG8gZHJvcDsKIAorCXNrYl9zZXRfaW5uZXJfcHJvdG9jb2woc2tiLCBza2ItPnByb3RvY29sKTsKKwlza2JfcmVzZXRfaW5uZXJfbmV0d29ya19oZWFkZXIoc2tiKTsKKwogCXNrYl9wdXNoKHNrYiwgbmV3X2hlYWRlcl9zaXplKTsKKwogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCiAJc2tiLT5kZXYgPSBvdXRfZGV2OwpAQCAtMTE1LDcgKzExOSw3IEBACiAJCW5ldF9kYmdfcmF0ZWxpbWl0ZWQoIiVzOiBwYWNrZXQgdHJhbnNtaXNzaW9uIGZhaWxlZDogJWRcbiIsCiAJCQkJICAgIF9fZnVuY19fLCBlcnIpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIExXVFVOTkVMX1hNSVRfRE9ORTsKIAogZHJvcDoKIAlrZnJlZV9za2Ioc2tiKTsKQEAgLTE1Myw3ICsxNTcsOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3V0OwogCW5ld3RzLT50eXBlID0gTFdUVU5ORUxfRU5DQVBfTVBMUzsKLQluZXd0cy0+ZmxhZ3MgfD0gTFdUVU5ORUxfU1RBVEVfT1VUUFVUX1JFRElSRUNUOworCW5ld3RzLT5mbGFncyB8PSBMV1RVTk5FTF9TVEFURV9YTUlUX1JFRElSRUNUOworCW5ld3RzLT5oZWFkcm9vbSA9IG1wbHNfZW5jYXBfc2l6ZSh0dW5fZW5jYXBfaW5mbyk7CiAKIAkqdHMgPSBuZXd0czsKIApAQCAtMjA5LDcgKzIxNCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbHd0dW5uZWxfZW5jYXBfb3BzIG1wbHNfaXB0dW5fb3BzID0gewogCS5idWlsZF9zdGF0ZSA9IG1wbHNfYnVpbGRfc3RhdGUsCi0JLm91dHB1dCA9IG1wbHNfb3V0cHV0LAorCS54bWl0ID0gbXBsc194bWl0LAogCS5maWxsX2VuY2FwID0gbXBsc19maWxsX2VuY2FwX2luZm8sCiAJLmdldF9lbmNhcF9zaXplID0gbXBsc19lbmNhcF9ubHNpemUsCiAJLmNtcF9lbmNhcCA9IG1wbHNfZW5jYXBfY21wLApkaWZmIC0tZ2l0IGEvbmV0L25jc2kvaW50ZXJuYWwuaCBiL25ldC9uY3NpL2ludGVybmFsLmgKaW5kZXggMzM3MzhjMC4uMTMyOTBhNyAxMDA2NDQKLS0tIGEvbmV0L25jc2kvaW50ZXJuYWwuaAorKysgYi9uZXQvbmNzaS9pbnRlcm5hbC5oCkBAIC0xNzAsNiArMTcwLDcgQEAKIAogI2RlZmluZSBOQ1NJX1BBQ0tBR0VfU0hJRlQJNQogI2RlZmluZSBOQ1NJX1BBQ0tBR0VfSU5ERVgoYykJKCgoYykgPj4gTkNTSV9QQUNLQUdFX1NISUZUKSAmIDB4NykKKyNkZWZpbmUgTkNTSV9SRVNFUlZFRF9DSEFOTkVMCTB4MWYKICNkZWZpbmUgTkNTSV9DSEFOTkVMX0lOREVYKGMpCSgoYykgJiAoKDEgPDwgTkNTSV9QQUNLQUdFX1NISUZUKSAtIDEpKQogI2RlZmluZSBOQ1NJX1RPX0NIQU5ORUwocCwgYykJKCgocCkgPDwgTkNTSV9QQUNLQUdFX1NISUZUKSB8IChjKSkKIApAQCAtMTg2LDkgKzE4NywxNSBAQAogCXN0cnVjdCBuY3NpX2NoYW5uZWxfbW9kZSAgICBtb2Rlc1tOQ1NJX01PREVfTUFYXTsKIAlzdHJ1Y3QgbmNzaV9jaGFubmVsX2ZpbHRlciAgKmZpbHRlcnNbTkNTSV9GSUxURVJfTUFYXTsKIAlzdHJ1Y3QgbmNzaV9jaGFubmVsX3N0YXRzICAgc3RhdHM7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgICAgICAgICAgIHRpbWVyOwkvKiBMaW5rIG1vbml0b3IgdGltZXIgICovCi0JYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ7CS8qIFRpbWVyIGlzIGVuYWJsZWQgICAgKi8KLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgdGltZW91dDsJLyogVGltZXMgb2YgdGltZW91dCAgICAqLworCXN0cnVjdCB7CisJCXN0cnVjdCB0aW1lcl9saXN0ICAgdGltZXI7CisJCWJvb2wgICAgICAgICAgICAgICAgZW5hYmxlZDsKKwkJdW5zaWduZWQgaW50ICAgICAgICBzdGF0ZTsKKyNkZWZpbmUgTkNTSV9DSEFOTkVMX01PTklUT1JfU1RBUlQJMAorI2RlZmluZSBOQ1NJX0NIQU5ORUxfTU9OSVRPUl9SRVRSWQkxCisjZGVmaW5lIE5DU0lfQ0hBTk5FTF9NT05JVE9SX1dBSVQJMgorI2RlZmluZSBOQ1NJX0NIQU5ORUxfTU9OSVRPUl9XQUlUX01BWAk1CisJfSBtb25pdG9yOwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICBub2RlOwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgICAgICBsaW5rOwogfTsKQEAgLTIwNiw3ICsyMTMsOCBAQAogc3RydWN0IG5jc2lfcmVxdWVzdCB7CiAJdW5zaWduZWQgY2hhciAgICAgICAgaWQ7ICAgICAgLyogUmVxdWVzdCBJRCAtIDAgdG8gMjU1ICAgICAgICAgICAqLwogCWJvb2wgICAgICAgICAgICAgICAgIHVzZWQ7ICAgIC8qIFJlcXVlc3QgdGhhdCBoYXMgYmVlbiBhc3NpZ25lZCAgKi8KLQlib29sICAgICAgICAgICAgICAgICBkcml2ZW47ICAvKiBEcml2ZSBzdGF0ZSBtYWNoaW5lICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50ICAgICAgICAgZmxhZ3M7ICAgLyogTkNTSSByZXF1ZXN0IHByb3BlcnR5ICAgICAgICAgICAqLworI2RlZmluZSBOQ1NJX1JFUV9GTEFHX0VWRU5UX0RSSVZFTgkxCiAJc3RydWN0IG5jc2lfZGV2X3ByaXYgKm5kcDsgICAgLyogQXNzb2NpYXRlZCBOQ1NJIGRldmljZSAgICAgICAgICAqLwogCXN0cnVjdCBza19idWZmICAgICAgICpjbWQ7ICAgIC8qIEFzc29jaWF0ZWQgTkNTSSBjb21tYW5kIHBhY2tldCAgKi8KIAlzdHJ1Y3Qgc2tfYnVmZiAgICAgICAqcnNwOyAgICAvKiBBc3NvY2lhdGVkIE5DU0kgcmVzcG9uc2UgcGFja2V0ICovCkBAIC0yNTgsNiArMjY2LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgIHBhY2thZ2VzOyAgICAgICAgLyogTGlzdCBvZiBwYWNrYWdlcyAgICAgICAgICAgKi8KIAlzdHJ1Y3QgbmNzaV9yZXF1ZXN0IHJlcXVlc3RzWzI1Nl07ICAgLyogUmVxdWVzdCB0YWJsZSAgICAgICAgICAgICAgKi8KIAl1bnNpZ25lZCBpbnQgICAgICAgIHJlcXVlc3RfaWQ7ICAgICAgLyogTGFzdCB1c2VkIHJlcXVlc3QgSUQgICAgICAgKi8KKyNkZWZpbmUgTkNTSV9SRVFfU1RBUlRfSURYCTEKIAl1bnNpZ25lZCBpbnQgICAgICAgIHBlbmRpbmdfcmVxX251bTsgLyogTnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdHMgKi8KIAlzdHJ1Y3QgbmNzaV9wYWNrYWdlICphY3RpdmVfcGFja2FnZTsgLyogQ3VycmVudGx5IGhhbmRsZWQgcGFja2FnZSAgKi8KIAlzdHJ1Y3QgbmNzaV9jaGFubmVsICphY3RpdmVfY2hhbm5lbDsgLyogQ3VycmVudGx5IGhhbmRsZWQgY2hhbm5lbCAgKi8KQEAgLTI3NCw3ICsyODMsNyBAQAogCXVuc2lnbmVkIGNoYXIgICAgICAgIHBhY2thZ2U7ICAgICAvKiBEZXN0aW5hdGlvbiBwYWNrYWdlIElEICAgICAgICAqLwogCXVuc2lnbmVkIGNoYXIgICAgICAgIGNoYW5uZWw7ICAgICAvKiBEZXRpbmF0aW9uIGNoYW5uZWwgSUQgb3IgMHgxZiAqLwogCXVuc2lnbmVkIHNob3J0ICAgICAgIHBheWxvYWQ7ICAgICAvKiBDb21tYW5kIHBhY2tldCBwYXlsb2FkIGxlbmd0aCAqLwotCWJvb2wgICAgICAgICAgICAgICAgIGRyaXZlbjsgICAgICAvKiBEcml2ZSB0aGUgc3RhdGUgbWFjaGluZT8gICAgICAqLworCXVuc2lnbmVkIGludCAgICAgICAgIHJlcV9mbGFnczsgICAvKiBOQ1NJIHJlcXVlc3QgcHJvcGVydGllcyAgICAgICAqLwogCXVuaW9uIHsKIAkJdW5zaWduZWQgY2hhciAgYnl0ZXNbMTZdOyAvKiBDb21tYW5kIHBhY2tldCBzcGVjaWZpYyBkYXRhICAqLwogCQl1bnNpZ25lZCBzaG9ydCB3b3Jkc1s4XTsKQEAgLTMxMyw3ICszMjIsOCBAQAogCQkJCSAgIHVuc2lnbmVkIGNoYXIgaWQsCiAJCQkJICAgc3RydWN0IG5jc2lfcGFja2FnZSAqKm5wLAogCQkJCSAgIHN0cnVjdCBuY3NpX2NoYW5uZWwgKipuYyk7Ci1zdHJ1Y3QgbmNzaV9yZXF1ZXN0ICpuY3NpX2FsbG9jX3JlcXVlc3Qoc3RydWN0IG5jc2lfZGV2X3ByaXYgKm5kcCwgYm9vbCBkcml2ZW4pOworc3RydWN0IG5jc2lfcmVxdWVzdCAqbmNzaV9hbGxvY19yZXF1ZXN0KHN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHAsCisJCQkJCXVuc2lnbmVkIGludCByZXFfZmxhZ3MpOwogdm9pZCBuY3NpX2ZyZWVfcmVxdWVzdChzdHJ1Y3QgbmNzaV9yZXF1ZXN0ICpucik7CiBzdHJ1Y3QgbmNzaV9kZXYgKm5jc2lfZmluZF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBpbnQgbmNzaV9wcm9jZXNzX25leHRfY2hhbm5lbChzdHJ1Y3QgbmNzaV9kZXZfcHJpdiAqbmRwKTsKZGlmZiAtLWdpdCBhL25ldC9uY3NpL25jc2ktYWVuLmMgYi9uZXQvbmNzaS9uY3NpLWFlbi5jCmluZGV4IGQ0NjM0NjguLmI0MWE2NjEgMTAwNjQ0Ci0tLSBhL25ldC9uY3NpL25jc2ktYWVuLmMKKysrIGIvbmV0L25jc2kvbmNzaS1hZW4uYwpAQCAtNTMsNyArNTMsOSBAQAogCXN0cnVjdCBuY3NpX2Flbl9sc2NfcGt0ICpsc2M7CiAJc3RydWN0IG5jc2lfY2hhbm5lbCAqbmM7CiAJc3RydWN0IG5jc2lfY2hhbm5lbF9tb2RlICpuY207Ci0JdW5zaWduZWQgbG9uZyBvbGRfZGF0YTsKKwlib29sIGNoYWluZWQ7CisJaW50IHN0YXRlOworCXVuc2lnbmVkIGxvbmcgb2xkX2RhdGEsIGRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIEZpbmQgdGhlIE5DU0kgY2hhbm5lbCAqLwpAQCAtNjIsMjAgKzY0LDI3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJLyogVXBkYXRlIHRoZSBsaW5rIHN0YXR1cyAqLwotCW5jbSA9ICZuYy0+bW9kZXNbTkNTSV9NT0RFX0xJTktdOwogCWxzYyA9IChzdHJ1Y3QgbmNzaV9hZW5fbHNjX3BrdCAqKWg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbmMtPmxvY2ssIGZsYWdzKTsKKwluY20gPSAmbmMtPm1vZGVzW05DU0lfTU9ERV9MSU5LXTsKIAlvbGRfZGF0YSA9IG5jbS0+ZGF0YVsyXTsKLQluY20tPmRhdGFbMl0gPSBudG9obChsc2MtPnN0YXR1cyk7CisJZGF0YSA9IG50b2hsKGxzYy0+c3RhdHVzKTsKKwluY20tPmRhdGFbMl0gPSBkYXRhOwogCW5jbS0+ZGF0YVs0XSA9IG50b2hsKGxzYy0+b2VtX3N0YXR1cyk7Ci0JaWYgKCEoKG9sZF9kYXRhIF4gbmNtLT5kYXRhWzJdKSAmIDB4MSkgfHwKLQkgICAgIWxpc3RfZW1wdHkoJm5jLT5saW5rKSkKKworCWNoYWluZWQgPSAhbGlzdF9lbXB0eSgmbmMtPmxpbmspOworCXN0YXRlID0gbmMtPnN0YXRlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoISgob2xkX2RhdGEgXiBkYXRhKSAmIDB4MSkgfHwgY2hhaW5lZCkKIAkJcmV0dXJuIDA7Ci0JaWYgKCEobmMtPnN0YXRlID09IE5DU0lfQ0hBTk5FTF9JTkFDVElWRSAmJiAobmNtLT5kYXRhWzJdICYgMHgxKSkgJiYKLQkgICAgIShuYy0+c3RhdGUgPT0gTkNTSV9DSEFOTkVMX0FDVElWRSAmJiAhKG5jbS0+ZGF0YVsyXSAmIDB4MSkpKQorCWlmICghKHN0YXRlID09IE5DU0lfQ0hBTk5FTF9JTkFDVElWRSAmJiAoZGF0YSAmIDB4MSkpICYmCisJICAgICEoc3RhdGUgPT0gTkNTSV9DSEFOTkVMX0FDVElWRSAmJiAhKGRhdGEgJiAweDEpKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIShuZHAtPmZsYWdzICYgTkNTSV9ERVZfSFdBKSAmJgotCSAgICBuYy0+c3RhdGUgPT0gTkNTSV9DSEFOTkVMX0FDVElWRSkKKwkgICAgc3RhdGUgPT0gTkNTSV9DSEFOTkVMX0FDVElWRSkKIAkJbmRwLT5mbGFncyB8PSBOQ1NJX0RFVl9SRVNIVUZGTEU7CiAKIAluY3NpX3N0b3BfY2hhbm5lbF9tb25pdG9yKG5jKTsKQEAgLTk3LDEzICsxMDYsMjEgQEAKIAlpZiAoIW5jKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOwogCWlmICghbGlzdF9lbXB0eSgmbmMtPmxpbmspIHx8Ci0JICAgIG5jLT5zdGF0ZSAhPSBOQ1NJX0NIQU5ORUxfQUNUSVZFKQorCSAgICBuYy0+c3RhdGUgIT0gTkNTSV9DSEFOTkVMX0FDVElWRSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAogCW5jc2lfc3RvcF9jaGFubmVsX21vbml0b3IobmMpOworCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOworCW5jLT5zdGF0ZSA9IE5DU0lfQ0hBTk5FTF9JTlZJU0lCTEU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZuZHAtPmxvY2ssIGZsYWdzKTsKLQl4Y2hnKCZuYy0+c3RhdGUsIE5DU0lfQ0hBTk5FTF9JTkFDVElWRSk7CisJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFOwogCWxpc3RfYWRkX3RhaWxfcmN1KCZuYy0+bGluaywgJm5kcC0+Y2hhbm5lbF9xdWV1ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmRwLT5sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL25ldC9uY3NpL25jc2ktY21kLmMgYi9uZXQvbmNzaS9uY3NpLWNtZC5jCmluZGV4IDIxMDU3YTguLmRiNzA4M2IgMTAwNjQ0Ci0tLSBhL25ldC9uY3NpL25jc2ktY21kLmMKKysrIGIvbmV0L25jc2kvbmNzaS1jbWQuYwpAQCAtMjcyLDcgKzI3Miw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgbmNzaV9yZXF1ZXN0ICpucjsKIAotCW5yID0gbmNzaV9hbGxvY19yZXF1ZXN0KG5kcCwgbmNhLT5kcml2ZW4pOworCW5yID0gbmNzaV9hbGxvY19yZXF1ZXN0KG5kcCwgbmNhLT5yZXFfZmxhZ3MpOwogCWlmICghbnIpCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9uZXQvbmNzaS9uY3NpLW1hbmFnZS5jIGIvbmV0L25jc2kvbmNzaS1tYW5hZ2UuYwppbmRleCBlZjAxN2I4Li41ZTUwOWU1IDEwMDY0NAotLS0gYS9uZXQvbmNzaS9uY3NpLW1hbmFnZS5jCisrKyBiL25ldC9uY3NpL25jc2ktbWFuYWdlLmMKQEAgLTEzMiw2ICsxMzIsNyBAQAogCXN0cnVjdCBuY3NpX2RldiAqbmQgPSAmbmRwLT5uZGV2OwogCXN0cnVjdCBuY3NpX3BhY2thZ2UgKm5wOwogCXN0cnVjdCBuY3NpX2NoYW5uZWwgKm5jOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAluZC0+c3RhdGUgPSBuY3NpX2Rldl9zdGF0ZV9mdW5jdGlvbmFsOwogCWlmIChmb3JjZV9kb3duKSB7CkBAIC0xNDIsMTQgKzE0MywyMSBAQAogCW5kLT5saW5rX3VwID0gMDsKIAlOQ1NJX0ZPUl9FQUNIX1BBQ0tBR0UobmRwLCBucCkgewogCQlOQ1NJX0ZPUl9FQUNIX0NIQU5ORUwobnAsIG5jKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmMtPmxvY2ssIGZsYWdzKTsKKwogCQkJaWYgKCFsaXN0X2VtcHR5KCZuYy0+bGluaykgfHwKLQkJCSAgICBuYy0+c3RhdGUgIT0gTkNTSV9DSEFOTkVMX0FDVElWRSkKKwkJCSAgICBuYy0+c3RhdGUgIT0gTkNTSV9DSEFOTkVMX0FDVElWRSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCQkJY29udGludWU7CisJCQl9CiAKIAkJCWlmIChuYy0+bW9kZXNbTkNTSV9NT0RFX0xJTktdLmRhdGFbMl0gJiAweDEpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCQkJCW5kLT5saW5rX3VwID0gMTsKIAkJCQlnb3RvIHJlcG9ydDsKIAkJCX0KKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAkJfQogCX0KIApAQCAtMTYzLDQzICsxNzEsNTUgQEAKIAlzdHJ1Y3QgbmNzaV9wYWNrYWdlICpucCA9IG5jLT5wYWNrYWdlOwogCXN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHAgPSBucC0+bmRwOwogCXN0cnVjdCBuY3NpX2NtZF9hcmcgbmNhOwotCWJvb2wgZW5hYmxlZDsKLQl1bnNpZ25lZCBpbnQgdGltZW91dDsKKwlib29sIGVuYWJsZWQsIGNoYWluZWQ7CisJdW5zaWduZWQgaW50IG1vbml0b3Jfc3RhdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OworCWludCBzdGF0ZSwgcmV0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7Ci0JdGltZW91dCA9IG5jLT50aW1lb3V0OwotCWVuYWJsZWQgPSBuYy0+ZW5hYmxlZDsKKwlzdGF0ZSA9IG5jLT5zdGF0ZTsKKwljaGFpbmVkID0gIWxpc3RfZW1wdHkoJm5jLT5saW5rKTsKKwllbmFibGVkID0gbmMtPm1vbml0b3IuZW5hYmxlZDsKKwltb25pdG9yX3N0YXRlID0gbmMtPm1vbml0b3Iuc3RhdGU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAotCWlmICghZW5hYmxlZCB8fCAhbGlzdF9lbXB0eSgmbmMtPmxpbmspKQorCWlmICghZW5hYmxlZCB8fCBjaGFpbmVkKQogCQlyZXR1cm47Ci0JaWYgKG5jLT5zdGF0ZSAhPSBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkUgJiYKLQkgICAgbmMtPnN0YXRlICE9IE5DU0lfQ0hBTk5FTF9BQ1RJVkUpCisJaWYgKHN0YXRlICE9IE5DU0lfQ0hBTk5FTF9JTkFDVElWRSAmJgorCSAgICBzdGF0ZSAhPSBOQ1NJX0NIQU5ORUxfQUNUSVZFKQogCQlyZXR1cm47CiAKLQlpZiAoISh0aW1lb3V0ICUgMikpIHsKKwlzd2l0Y2ggKG1vbml0b3Jfc3RhdGUpIHsKKwljYXNlIE5DU0lfQ0hBTk5FTF9NT05JVE9SX1NUQVJUOgorCWNhc2UgTkNTSV9DSEFOTkVMX01PTklUT1JfUkVUUlk6CiAJCW5jYS5uZHAgPSBuZHA7CiAJCW5jYS5wYWNrYWdlID0gbnAtPmlkOwogCQluY2EuY2hhbm5lbCA9IG5jLT5pZDsKIAkJbmNhLnR5cGUgPSBOQ1NJX1BLVF9DTURfR0xTOwotCQluY2EuZHJpdmVuID0gZmFsc2U7CisJCW5jYS5yZXFfZmxhZ3MgPSAwOwogCQlyZXQgPSBuY3NpX3htaXRfY21kKCZuY2EpOwogCQlpZiAocmV0KSB7CiAJCQluZXRkZXZfZXJyKG5kcC0+bmRldi5kZXYsICJFcnJvciAlZCBzZW5kaW5nIEdMU1xuIiwKIAkJCQkgICByZXQpOwogCQkJcmV0dXJuOwogCQl9Ci0JfQogCi0JaWYgKHRpbWVvdXQgKyAxID49IDMpIHsKKwkJYnJlYWs7CisJY2FzZSBOQ1NJX0NIQU5ORUxfTU9OSVRPUl9XQUlUIC4uLiBOQ1NJX0NIQU5ORUxfTU9OSVRPUl9XQUlUX01BWDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJaWYgKCEobmRwLT5mbGFncyAmIE5DU0lfREVWX0hXQSkgJiYKLQkJICAgIG5jLT5zdGF0ZSA9PSBOQ1NJX0NIQU5ORUxfQUNUSVZFKQorCQkgICAgc3RhdGUgPT0gTkNTSV9DSEFOTkVMX0FDVElWRSkgewogCQkJbmNzaV9yZXBvcnRfbGluayhuZHAsIHRydWUpOworCQkJbmRwLT5mbGFncyB8PSBOQ1NJX0RFVl9SRVNIVUZGTEU7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmMtPmxvY2ssIGZsYWdzKTsKKwkJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0lOVklTSUJMRTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmRwLT5sb2NrLCBmbGFncyk7Ci0JCXhjaGcoJm5jLT5zdGF0ZSwgTkNTSV9DSEFOTkVMX0lOQUNUSVZFKTsKKwkJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFOwogCQlsaXN0X2FkZF90YWlsX3JjdSgmbmMtPmxpbmssICZuZHAtPmNoYW5uZWxfcXVldWUpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZHAtPmxvY2ssIGZsYWdzKTsKIAkJbmNzaV9wcm9jZXNzX25leHRfY2hhbm5lbChuZHApOwpAQCAtMjA3LDEwICsyMjcsOSBAQAogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOwotCW5jLT50aW1lb3V0ID0gdGltZW91dCArIDE7Ci0JbmMtPmVuYWJsZWQgPSB0cnVlOworCW5jLT5tb25pdG9yLnN0YXRlKys7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKLQltb2RfdGltZXIoJm5jLT50aW1lciwgamlmZmllcyArIEhaICogKDEgPDwgKG5jLT50aW1lb3V0IC8gMikpKTsKKwltb2RfdGltZXIoJm5jLT5tb25pdG9yLnRpbWVyLCBqaWZmaWVzICsgSFopOwogfQogCiB2b2lkIG5jc2lfc3RhcnRfY2hhbm5lbF9tb25pdG9yKHN0cnVjdCBuY3NpX2NoYW5uZWwgKm5jKQpAQCAtMjE4LDEyICsyMzcsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7Ci0JV0FSTl9PTl9PTkNFKG5jLT5lbmFibGVkKTsKLQluYy0+dGltZW91dCA9IDA7Ci0JbmMtPmVuYWJsZWQgPSB0cnVlOworCVdBUk5fT05fT05DRShuYy0+bW9uaXRvci5lbmFibGVkKTsKKwluYy0+bW9uaXRvci5lbmFibGVkID0gdHJ1ZTsKKwluYy0+bW9uaXRvci5zdGF0ZSA9IE5DU0lfQ0hBTk5FTF9NT05JVE9SX1NUQVJUOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAKLQltb2RfdGltZXIoJm5jLT50aW1lciwgamlmZmllcyArIEhaICogKDEgPDwgKG5jLT50aW1lb3V0IC8gMikpKTsKKwltb2RfdGltZXIoJm5jLT5tb25pdG9yLnRpbWVyLCBqaWZmaWVzICsgSFopOwogfQogCiB2b2lkIG5jc2lfc3RvcF9jaGFubmVsX21vbml0b3Ioc3RydWN0IG5jc2lfY2hhbm5lbCAqbmMpCkBAIC0yMzEsMTQgKzI1MCwxNCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbmMtPmxvY2ssIGZsYWdzKTsKLQlpZiAoIW5jLT5lbmFibGVkKSB7CisJaWYgKCFuYy0+bW9uaXRvci5lbmFibGVkKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9Ci0JbmMtPmVuYWJsZWQgPSBmYWxzZTsKKwluYy0+bW9uaXRvci5lbmFibGVkID0gZmFsc2U7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAotCWRlbF90aW1lcl9zeW5jKCZuYy0+dGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZuYy0+bW9uaXRvci50aW1lcik7CiB9CiAKIHN0cnVjdCBuY3NpX2NoYW5uZWwgKm5jc2lfZmluZF9jaGFubmVsKHN0cnVjdCBuY3NpX3BhY2thZ2UgKm5wLApAQCAtMjY3LDggKzI4Niw5IEBACiAJbmMtPmlkID0gaWQ7CiAJbmMtPnBhY2thZ2UgPSBucDsKIAluYy0+c3RhdGUgPSBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkU7Ci0JbmMtPmVuYWJsZWQgPSBmYWxzZTsKLQlzZXR1cF90aW1lcigmbmMtPnRpbWVyLCBuY3NpX2NoYW5uZWxfbW9uaXRvciwgKHVuc2lnbmVkIGxvbmcpbmMpOworCW5jLT5tb25pdG9yLmVuYWJsZWQgPSBmYWxzZTsKKwlzZXR1cF90aW1lcigmbmMtPm1vbml0b3IudGltZXIsCisJCSAgICBuY3NpX2NoYW5uZWxfbW9uaXRvciwgKHVuc2lnbmVkIGxvbmcpbmMpOwogCXNwaW5fbG9ja19pbml0KCZuYy0+bG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJm5jLT5saW5rKTsKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBOQ1NJX0NBUF9NQVg7IGluZGV4KyspCkBAIC00MDUsNyArNDI1LDggQEAKICAqIGJlIHNhbWUuIE90aGVyd2lzZSwgdGhlIGJvZ3VzIHJlc3BvbnNlIG1pZ2h0IGJlIHJlcGxpZWQuIFNvCiAgKiB0aGUgYXZhaWxhYmxlIElEcyBhcmUgYWxsb2NhdGVkIGluIHJvdW5kLXJvYmluIGZhc2hpb24uCiAgKi8KLXN0cnVjdCBuY3NpX3JlcXVlc3QgKm5jc2lfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgbmNzaV9kZXZfcHJpdiAqbmRwLCBib29sIGRyaXZlbikKK3N0cnVjdCBuY3NpX3JlcXVlc3QgKm5jc2lfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgbmNzaV9kZXZfcHJpdiAqbmRwLAorCQkJCQl1bnNpZ25lZCBpbnQgcmVxX2ZsYWdzKQogewogCXN0cnVjdCBuY3NpX3JlcXVlc3QgKm5yID0gTlVMTDsKIAlpbnQgaSwgbGltaXQgPSBBUlJBWV9TSVpFKG5kcC0+cmVxdWVzdHMpOwpAQCAtNDEzLDMwICs0MzQsMzEgQEAKIAogCS8qIENoZWNrIGlmIHRoZXJlIGlzIG9uZSBhdmFpbGFibGUgcmVxdWVzdCB1bnRpbCB0aGUgY2VpbGluZyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZuZHAtPmxvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSBuZHAtPnJlcXVlc3RfaWQ7ICFuciAmJiBpIDwgbGltaXQ7IGkrKykgeworCWZvciAoaSA9IG5kcC0+cmVxdWVzdF9pZDsgaSA8IGxpbWl0OyBpKyspIHsKIAkJaWYgKG5kcC0+cmVxdWVzdHNbaV0udXNlZCkKIAkJCWNvbnRpbnVlOwogCiAJCW5yID0gJm5kcC0+cmVxdWVzdHNbaV07CiAJCW5yLT51c2VkID0gdHJ1ZTsKLQkJbnItPmRyaXZlbiA9IGRyaXZlbjsKLQkJaWYgKCsrbmRwLT5yZXF1ZXN0X2lkID49IGxpbWl0KQotCQkJbmRwLT5yZXF1ZXN0X2lkID0gMDsKKwkJbnItPmZsYWdzID0gcmVxX2ZsYWdzOworCQluZHAtPnJlcXVlc3RfaWQgPSBpICsgMTsKKwkJZ290byBmb3VuZDsKIAl9CiAKIAkvKiBGYWlsIGJhY2sgdG8gY2hlY2sgZnJvbSB0aGUgc3RhcnRpbmcgY3Vyc29yICovCi0JZm9yIChpID0gMDsgIW5yICYmIGkgPCBuZHAtPnJlcXVlc3RfaWQ7IGkrKykgeworCWZvciAoaSA9IE5DU0lfUkVRX1NUQVJUX0lEWDsgaSA8IG5kcC0+cmVxdWVzdF9pZDsgaSsrKSB7CiAJCWlmIChuZHAtPnJlcXVlc3RzW2ldLnVzZWQpCiAJCQljb250aW51ZTsKIAogCQluciA9ICZuZHAtPnJlcXVlc3RzW2ldOwogCQluci0+dXNlZCA9IHRydWU7Ci0JCW5yLT5kcml2ZW4gPSBkcml2ZW47Ci0JCWlmICgrK25kcC0+cmVxdWVzdF9pZCA+PSBsaW1pdCkKLQkJCW5kcC0+cmVxdWVzdF9pZCA9IDA7CisJCW5yLT5mbGFncyA9IHJlcV9mbGFnczsKKwkJbmRwLT5yZXF1ZXN0X2lkID0gaSArIDE7CisJCWdvdG8gZm91bmQ7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5kcC0+bG9jaywgZmxhZ3MpOwogCitmb3VuZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuZHAtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gbnI7CiB9CiAKQEAgLTQ1OCw3ICs0ODAsNyBAQAogCW5yLT5jbWQgPSBOVUxMOwogCW5yLT5yc3AgPSBOVUxMOwogCW5yLT51c2VkID0gZmFsc2U7Ci0JZHJpdmVuID0gbnItPmRyaXZlbjsKKwlkcml2ZW4gPSAhIShuci0+ZmxhZ3MgJiBOQ1NJX1JFUV9GTEFHX0VWRU5UX0RSSVZFTik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmRwLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoZHJpdmVuICYmIGNtZCAmJiAtLW5kcC0+cGVuZGluZ19yZXFfbnVtID09IDApCkBAIC01MDgsMTAgKzUzMCwxMSBAQAogCXN0cnVjdCBuY3NpX3BhY2thZ2UgKm5wID0gbmRwLT5hY3RpdmVfcGFja2FnZTsKIAlzdHJ1Y3QgbmNzaV9jaGFubmVsICpuYyA9IG5kcC0+YWN0aXZlX2NoYW5uZWw7CiAJc3RydWN0IG5jc2lfY21kX2FyZyBuY2E7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJbmNhLm5kcCA9IG5kcDsKLQluY2EuZHJpdmVuID0gdHJ1ZTsKKwluY2EucmVxX2ZsYWdzID0gTkNTSV9SRVFfRkxBR19FVkVOVF9EUklWRU47CiAJc3dpdGNoIChuZC0+c3RhdGUpIHsKIAljYXNlIG5jc2lfZGV2X3N0YXRlX3N1c3BlbmQ6CiAJCW5kLT5zdGF0ZSA9IG5jc2lfZGV2X3N0YXRlX3N1c3BlbmRfc2VsZWN0OwpAQCAtNTI3LDcgKzU1MCw3IEBACiAJCW5jYS5wYWNrYWdlID0gbnAtPmlkOwogCQlpZiAobmQtPnN0YXRlID09IG5jc2lfZGV2X3N0YXRlX3N1c3BlbmRfc2VsZWN0KSB7CiAJCQluY2EudHlwZSA9IE5DU0lfUEtUX0NNRF9TUDsKLQkJCW5jYS5jaGFubmVsID0gMHgxZjsKKwkJCW5jYS5jaGFubmVsID0gTkNTSV9SRVNFUlZFRF9DSEFOTkVMOwogCQkJaWYgKG5kcC0+ZmxhZ3MgJiBOQ1NJX0RFVl9IV0EpCiAJCQkJbmNhLmJ5dGVzWzBdID0gMDsKIAkJCWVsc2UKQEAgLTU0NCw3ICs1NjcsNyBAQAogCQkJbmQtPnN0YXRlID0gbmNzaV9kZXZfc3RhdGVfc3VzcGVuZF9kZXNlbGVjdDsKIAkJfSBlbHNlIGlmIChuZC0+c3RhdGUgPT0gbmNzaV9kZXZfc3RhdGVfc3VzcGVuZF9kZXNlbGVjdCkgewogCQkJbmNhLnR5cGUgPSBOQ1NJX1BLVF9DTURfRFA7Ci0JCQluY2EuY2hhbm5lbCA9IDB4MWY7CisJCQluY2EuY2hhbm5lbCA9IE5DU0lfUkVTRVJWRURfQ0hBTk5FTDsKIAkJCW5kLT5zdGF0ZSA9IG5jc2lfZGV2X3N0YXRlX3N1c3BlbmRfZG9uZTsKIAkJfQogCkBAIC01NTYsNyArNTc5LDkgQEAKIAogCQlicmVhazsKIAljYXNlIG5jc2lfZGV2X3N0YXRlX3N1c3BlbmRfZG9uZToKLQkJeGNoZygmbmMtPnN0YXRlLCBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbmMtPmxvY2ssIGZsYWdzKTsKKwkJbmMtPnN0YXRlID0gTkNTSV9DSEFOTkVMX0lOQUNUSVZFOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCQluY3NpX3Byb2Nlc3NfbmV4dF9jaGFubmVsKG5kcCk7CiAKIAkJYnJlYWs7CkBAIC01NzQsMTAgKzU5OSwxMSBAQAogCXN0cnVjdCBuY3NpX2NoYW5uZWwgKm5jID0gbmRwLT5hY3RpdmVfY2hhbm5lbDsKIAlzdHJ1Y3QgbmNzaV9jbWRfYXJnIG5jYTsKIAl1bnNpZ25lZCBjaGFyIGluZGV4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAogCW5jYS5uZHAgPSBuZHA7Ci0JbmNhLmRyaXZlbiA9IHRydWU7CisJbmNhLnJlcV9mbGFncyA9IE5DU0lfUkVRX0ZMQUdfRVZFTlRfRFJJVkVOOwogCXN3aXRjaCAobmQtPnN0YXRlKSB7CiAJY2FzZSBuY3NpX2Rldl9zdGF0ZV9jb25maWc6CiAJY2FzZSBuY3NpX2Rldl9zdGF0ZV9jb25maWdfc3A6CkBAIC01OTAsNyArNjE2LDcgQEAKIAkJZWxzZQogCQkJbmNhLmJ5dGVzWzBdID0gMTsKIAkJbmNhLnBhY2thZ2UgPSBucC0+aWQ7Ci0JCW5jYS5jaGFubmVsID0gMHgxZjsKKwkJbmNhLmNoYW5uZWwgPSBOQ1NJX1JFU0VSVkVEX0NIQU5ORUw7CiAJCXJldCA9IG5jc2lfeG1pdF9jbWQoJm5jYSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yOwpAQCAtNjc1LDEwICs3MDEsMTIgQEAKIAkJCWdvdG8gZXJyb3I7CiAJCWJyZWFrOwogCWNhc2UgbmNzaV9kZXZfc3RhdGVfY29uZmlnX2RvbmU6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOwogCQlpZiAobmMtPm1vZGVzW05DU0lfTU9ERV9MSU5LXS5kYXRhWzJdICYgMHgxKQotCQkJeGNoZygmbmMtPnN0YXRlLCBOQ1NJX0NIQU5ORUxfQUNUSVZFKTsKKwkJCW5jLT5zdGF0ZSA9IE5DU0lfQ0hBTk5FTF9BQ1RJVkU7CiAJCWVsc2UKLQkJCXhjaGcoJm5jLT5zdGF0ZSwgTkNTSV9DSEFOTkVMX0lOQUNUSVZFKTsKKwkJCW5jLT5zdGF0ZSA9IE5DU0lfQ0hBTk5FTF9JTkFDVElWRTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAogCQluY3NpX3N0YXJ0X2NoYW5uZWxfbW9uaXRvcihuYyk7CiAJCW5jc2lfcHJvY2Vzc19uZXh0X2NoYW5uZWwobmRwKTsKQEAgLTcwNywxOCArNzM1LDI1IEBACiAJZm91bmQgPSBOVUxMOwogCU5DU0lfRk9SX0VBQ0hfUEFDS0FHRShuZHAsIG5wKSB7CiAJCU5DU0lfRk9SX0VBQ0hfQ0hBTk5FTChucCwgbmMpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOworCiAJCQlpZiAoIWxpc3RfZW1wdHkoJm5jLT5saW5rKSB8fAotCQkJICAgIG5jLT5zdGF0ZSAhPSBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkUpCisJCQkgICAgbmMtPnN0YXRlICE9IE5DU0lfQ0hBTk5FTF9JTkFDVElWRSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAJCQkJY29udGludWU7CisJCQl9CiAKIAkJCWlmICghZm91bmQpCiAJCQkJZm91bmQgPSBuYzsKIAogCQkJbmNtID0gJm5jLT5tb2Rlc1tOQ1NJX01PREVfTElOS107CiAJCQlpZiAobmNtLT5kYXRhWzJdICYgMHgxKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKIAkJCQlmb3VuZCA9IG5jOwogCQkJCWdvdG8gb3V0OwogCQkJfQorCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOwogCQl9CiAJfQogCkBAIC03OTcsNyArODMyLDcgQEAKIAlpbnQgcmV0OwogCiAJbmNhLm5kcCA9IG5kcDsKLQluY2EuZHJpdmVuID0gdHJ1ZTsKKwluY2EucmVxX2ZsYWdzID0gTkNTSV9SRVFfRkxBR19FVkVOVF9EUklWRU47CiAJc3dpdGNoIChuZC0+c3RhdGUpIHsKIAljYXNlIG5jc2lfZGV2X3N0YXRlX3Byb2JlOgogCQluZC0+c3RhdGUgPSBuY3NpX2Rldl9zdGF0ZV9wcm9iZV9kZXNlbGVjdDsKQEAgLTgwNyw3ICs4NDIsNyBAQAogCiAJCS8qIERlc2VsZWN0IGFsbCBwb3NzaWJsZSBwYWNrYWdlcyAqLwogCQluY2EudHlwZSA9IE5DU0lfUEtUX0NNRF9EUDsKLQkJbmNhLmNoYW5uZWwgPSAweDFmOworCQluY2EuY2hhbm5lbCA9IE5DU0lfUkVTRVJWRURfQ0hBTk5FTDsKIAkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgODsgaW5kZXgrKykgewogCQkJbmNhLnBhY2thZ2UgPSBpbmRleDsKIAkJCXJldCA9IG5jc2lfeG1pdF9jbWQoJm5jYSk7CkBAIC04MjMsNyArODU4LDcgQEAKIAkJLyogU2VsZWN0IGFsbCBwb3NzaWJsZSBwYWNrYWdlcyAqLwogCQluY2EudHlwZSA9IE5DU0lfUEtUX0NNRF9TUDsKIAkJbmNhLmJ5dGVzWzBdID0gMTsKLQkJbmNhLmNoYW5uZWwgPSAweDFmOworCQluY2EuY2hhbm5lbCA9IE5DU0lfUkVTRVJWRURfQ0hBTk5FTDsKIAkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgODsgaW5kZXgrKykgewogCQkJbmNhLnBhY2thZ2UgPSBpbmRleDsKIAkJCXJldCA9IG5jc2lfeG1pdF9jbWQoJm5jYSk7CkBAIC04NzYsNyArOTExLDcgQEAKIAkJbmNhLnR5cGUgPSBOQ1NJX1BLVF9DTURfU1A7CiAJCW5jYS5ieXRlc1swXSA9IDE7CiAJCW5jYS5wYWNrYWdlID0gbmRwLT5hY3RpdmVfcGFja2FnZS0+aWQ7Ci0JCW5jYS5jaGFubmVsID0gMHgxZjsKKwkJbmNhLmNoYW5uZWwgPSBOQ1NJX1JFU0VSVkVEX0NIQU5ORUw7CiAJCXJldCA9IG5jc2lfeG1pdF9jbWQoJm5jYSk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yOwpAQCAtODg0LDEyICs5MTksMTIgQEAKIAkJbmQtPnN0YXRlID0gbmNzaV9kZXZfc3RhdGVfcHJvYmVfY2lzOwogCQlicmVhazsKIAljYXNlIG5jc2lfZGV2X3N0YXRlX3Byb2JlX2NpczoKLQkJbmRwLT5wZW5kaW5nX3JlcV9udW0gPSAzMjsKKwkJbmRwLT5wZW5kaW5nX3JlcV9udW0gPSBOQ1NJX1JFU0VSVkVEX0NIQU5ORUw7CiAKIAkJLyogQ2xlYXIgaW5pdGlhbCBzdGF0ZSAqLwogCQluY2EudHlwZSA9IE5DU0lfUEtUX0NNRF9DSVM7CiAJCW5jYS5wYWNrYWdlID0gbmRwLT5hY3RpdmVfcGFja2FnZS0+aWQ7Ci0JCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IDB4MjA7IGluZGV4KyspIHsKKwkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTkNTSV9SRVNFUlZFRF9DSEFOTkVMOyBpbmRleCsrKSB7CiAJCQluY2EuY2hhbm5lbCA9IGluZGV4OwogCQkJcmV0ID0gbmNzaV94bWl0X2NtZCgmbmNhKTsKIAkJCWlmIChyZXQpCkBAIC05MzMsNyArOTY4LDcgQEAKIAkJLyogRGVzZWxlY3QgdGhlIGFjdGl2ZSBwYWNrYWdlICovCiAJCW5jYS50eXBlID0gTkNTSV9QS1RfQ01EX0RQOwogCQluY2EucGFja2FnZSA9IG5kcC0+YWN0aXZlX3BhY2thZ2UtPmlkOwotCQluY2EuY2hhbm5lbCA9IDB4MWY7CisJCW5jYS5jaGFubmVsID0gTkNTSV9SRVNFUlZFRF9DSEFOTkVMOwogCQlyZXQgPSBuY3NpX3htaXRfY21kKCZuY2EpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJvcjsKQEAgLTk4NywxMSArMTAyMiwxNCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlvbGRfc3RhdGUgPSB4Y2hnKCZuYy0+c3RhdGUsIE5DU0lfQ0hBTk5FTF9JTlZJU0lCTEUpOwogCWxpc3RfZGVsX2luaXQoJm5jLT5saW5rKTsKLQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5kcC0+bG9jaywgZmxhZ3MpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5jLT5sb2NrLCBmbGFncyk7CisJb2xkX3N0YXRlID0gbmMtPnN0YXRlOworCW5jLT5zdGF0ZSA9IE5DU0lfQ0hBTk5FTF9JTlZJU0lCTEU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmMtPmxvY2ssIGZsYWdzKTsKKwogCW5kcC0+YWN0aXZlX2NoYW5uZWwgPSBuYzsKIAluZHAtPmFjdGl2ZV9wYWNrYWdlID0gbmMtPnBhY2thZ2U7CiAKQEAgLTEwMDYsNyArMTA0NCw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCW5ldGRldl9lcnIobmRwLT5uZGV2LmRldiwgIkludmFsaWQgc3RhdGUgMHgleCBvbiAlZDolZFxuIiwKLQkJCSAgIG5jLT5zdGF0ZSwgbmMtPnBhY2thZ2UtPmlkLCBuYy0+aWQpOworCQkJICAgb2xkX3N0YXRlLCBuYy0+cGFja2FnZS0+aWQsIG5jLT5pZCk7CiAJCW5jc2lfcmVwb3J0X2xpbmsobmRwLCBmYWxzZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEwNzAsNyArMTEwOCw3IEBACiAJCXJldHVybiBOT1RJRllfT0s7CiAKIAluY2EubmRwID0gbmRwOwotCW5jYS5kcml2ZW4gPSBmYWxzZTsKKwluY2EucmVxX2ZsYWdzID0gMDsKIAluY2EucGFja2FnZSA9IG5wLT5pZDsKIAluY2EuY2hhbm5lbCA9IG5jLT5pZDsKIAluY2EuZHdvcmRzWzBdID0gbmMtPmNhcHNbTkNTSV9DQVBfTUNdLmNhcDsKQEAgLTExMTgsNyArMTE1Niw3IEBACiAJLyogSW5pdGlhbGl6ZSBwcml2YXRlIE5DU0kgZGV2aWNlICovCiAJc3Bpbl9sb2NrX2luaXQoJm5kcC0+bG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJm5kcC0+cGFja2FnZXMpOwotCW5kcC0+cmVxdWVzdF9pZCA9IDA7CisJbmRwLT5yZXF1ZXN0X2lkID0gTkNTSV9SRVFfU1RBUlRfSURYOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5kcC0+cmVxdWVzdHMpOyBpKyspIHsKIAkJbmRwLT5yZXF1ZXN0c1tpXS5pZCA9IGk7CiAJCW5kcC0+cmVxdWVzdHNbaV0ubmRwID0gbmRwOwpAQCAtMTE0OSw5ICsxMTg3LDcgQEAKIGludCBuY3NpX3N0YXJ0X2RldihzdHJ1Y3QgbmNzaV9kZXYgKm5kKQogewogCXN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHAgPSBUT19OQ1NJX0RFVl9QUklWKG5kKTsKLQlzdHJ1Y3QgbmNzaV9wYWNrYWdlICpucDsKLQlzdHJ1Y3QgbmNzaV9jaGFubmVsICpuYzsKLQlpbnQgb2xkX3N0YXRlLCByZXQ7CisJaW50IHJldDsKIAogCWlmIChuZC0+c3RhdGUgIT0gbmNzaV9kZXZfc3RhdGVfcmVnaXN0ZXJlZCAmJgogCSAgICBuZC0+c3RhdGUgIT0gbmNzaV9kZXZfc3RhdGVfZnVuY3Rpb25hbCkKQEAgLTExNjMsMTUgKzExOTksNiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBSZXNldCBjaGFubmVsJ3Mgc3RhdGUgYW5kIHN0YXJ0IG92ZXIgKi8KLQlOQ1NJX0ZPUl9FQUNIX1BBQ0tBR0UobmRwLCBucCkgewotCQlOQ1NJX0ZPUl9FQUNIX0NIQU5ORUwobnAsIG5jKSB7Ci0JCQlvbGRfc3RhdGUgPSB4Y2hnKCZuYy0+c3RhdGUsIE5DU0lfQ0hBTk5FTF9JTkFDVElWRSk7Ci0JCQlXQVJOX09OX09OQ0UoIWxpc3RfZW1wdHkoJm5jLT5saW5rKSB8fAotCQkJCSAgICAgb2xkX3N0YXRlID09IE5DU0lfQ0hBTk5FTF9JTlZJU0lCTEUpOwotCQl9Ci0JfQotCiAJaWYgKG5kcC0+ZmxhZ3MgJiBOQ1NJX0RFVl9IV0EpCiAJCXJldCA9IG5jc2lfZW5hYmxlX2h3YShuZHApOwogCWVsc2UKQEAgLTExODEsNiArMTIwOCwzNSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmNzaV9zdGFydF9kZXYpOwogCit2b2lkIG5jc2lfc3RvcF9kZXYoc3RydWN0IG5jc2lfZGV2ICpuZCkKK3sKKwlzdHJ1Y3QgbmNzaV9kZXZfcHJpdiAqbmRwID0gVE9fTkNTSV9ERVZfUFJJVihuZCk7CisJc3RydWN0IG5jc2lfcGFja2FnZSAqbnA7CisJc3RydWN0IG5jc2lfY2hhbm5lbCAqbmM7CisJYm9vbCBjaGFpbmVkOworCWludCBvbGRfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFN0b3AgdGhlIGNoYW5uZWwgbW9uaXRvciBhbmQgcmVzZXQgY2hhbm5lbCdzIHN0YXRlICovCisJTkNTSV9GT1JfRUFDSF9QQUNLQUdFKG5kcCwgbnApIHsKKwkJTkNTSV9GT1JfRUFDSF9DSEFOTkVMKG5wLCBuYykgeworCQkJbmNzaV9zdG9wX2NoYW5uZWxfbW9uaXRvcihuYyk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOworCQkJY2hhaW5lZCA9ICFsaXN0X2VtcHR5KCZuYy0+bGluayk7CisJCQlvbGRfc3RhdGUgPSBuYy0+c3RhdGU7CisJCQluYy0+c3RhdGUgPSBOQ1NJX0NIQU5ORUxfSU5BQ1RJVkU7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYy0+bG9jaywgZmxhZ3MpOworCisJCQlXQVJOX09OX09OQ0UoY2hhaW5lZCB8fAorCQkJCSAgICAgb2xkX3N0YXRlID09IE5DU0lfQ0hBTk5FTF9JTlZJU0lCTEUpOworCQl9CisJfQorCisJbmNzaV9yZXBvcnRfbGluayhuZHAsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmNzaV9zdG9wX2Rldik7CisKIHZvaWQgbmNzaV91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgbmNzaV9kZXYgKm5kKQogewogCXN0cnVjdCBuY3NpX2Rldl9wcml2ICpuZHAgPSBUT19OQ1NJX0RFVl9QUklWKG5kKTsKZGlmZiAtLWdpdCBhL25ldC9uY3NpL25jc2ktcnNwLmMgYi9uZXQvbmNzaS9uY3NpLXJzcC5jCmluZGV4IGFmODQzODkuLjA4N2RiNzcgMTAwNjQ0Ci0tLSBhL25ldC9uY3NpL25jc2ktcnNwLmMKKysrIGIvbmV0L25jc2kvbmNzaS1yc3AuYwpAQCAtMzE3LDEyICszMTcsMTIgQEAKIAluY20tPmRhdGFbM10gPSBudG9obChyc3AtPm90aGVyKTsKIAluY20tPmRhdGFbNF0gPSBudG9obChyc3AtPm9lbV9zdGF0dXMpOwogCi0JaWYgKG5yLT5kcml2ZW4pCisJaWYgKG5yLT5mbGFncyAmIE5DU0lfUkVRX0ZMQUdfRVZFTlRfRFJJVkVOKQogCQlyZXR1cm4gMDsKIAogCS8qIFJlc2V0IHRoZSBjaGFubmVsIG1vbml0b3IgaWYgaXQgaGFzIGJlZW4gZW5hYmxlZCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZuYy0+bG9jaywgZmxhZ3MpOwotCW5jLT50aW1lb3V0ID0gMDsKKwluYy0+bW9uaXRvci5zdGF0ZSA9IE5DU0lfQ0hBTk5FTF9NT05JVE9SX1NUQVJUOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5jLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCA5MjY2Y2VlLi5lOGQ1NmQ5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCkBAIC00NzQsNiArNDc0LDEyIEBACiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAibWV0YSIgZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIG1hdGNoIGFuZAogCSAgdG8gc2V0IHBhY2tldCBtZXRhaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcGFja2V0IG1hcmsuCiAKK2NvbmZpZyBORlRfTlVNR0VOCisJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgbnVtYmVyIGdlbmVyYXRvciBtb2R1bGUiCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgbnVtYmVyIGdlbmVyYXRvciBleHByZXNzaW9uIHVzZWQgdG8gcGVyZm9ybQorCSAgaW5jcmVtZW50YWwgY291bnRpbmcgYW5kIHJhbmRvbSBudW1iZXJzIGJvdW5kIHRvIGEgdXBwZXIgbGltaXQuCisKIGNvbmZpZyBORlRfQ1QKIAlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDSwogCXRyaXN0YXRlICJOZXRmaWx0ZXIgbmZfdGFibGVzIGNvbm50cmFjayBtb2R1bGUiCkBAIC00ODEsMTMgKzQ4NywxMyBAQAogCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgIm1ldGEiIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIHVzZSB0byBtYXRjaAogCSAgY29ubmVjdGlvbiB0cmFja2luZyBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBmbG93IHN0YXRlLgogCi1jb25maWcgTkZUX1JCVFJFRQorY29uZmlnIE5GVF9TRVRfUkJUUkVFCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgcmJ0cmVlIHNldCBtb2R1bGUiCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgInJidHJlZSIgc2V0IHR5cGUgKFJlZCBCbGFjayB0cmVlKSB0aGF0IGlzIHVzZWQKIAkgIHRvIGJ1aWxkIGludGVydmFsLWJhc2VkIHNldHMuCiAKLWNvbmZpZyBORlRfSEFTSAorY29uZmlnIE5GVF9TRVRfSEFTSAogCXRyaXN0YXRlICJOZXRmaWx0ZXIgbmZfdGFibGVzIGhhc2ggc2V0IG1vZHVsZSIKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAiaGFzaCIgc2V0IHR5cGUgdGhhdCBpcyB1c2VkIHRvIGJ1aWxkIG9uZS13YXkKQEAgLTU0Miw2ICs1NDgsMTIgQEAKIAkgIFRoaXMgaXMgcmVxdWlyZWQgaWYgeW91IGludGVuZCB0byB1c2UgdGhlIHVzZXJzcGFjZSBxdWV1ZWluZwogCSAgaW5mcmFzdHJ1Y3R1cmUgKGFsc28ga25vd24gYXMgTkZRVUVVRSkgZnJvbSBuZnRhYmxlcy4KIAorY29uZmlnIE5GVF9RVU9UQQorCXRyaXN0YXRlICJOZXRmaWx0ZXIgbmZfdGFibGVzIHF1b3RhIG1vZHVsZSIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAicXVvdGEiIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIHVzZSB0byBtYXRjaAorCSAgZW5mb3JjZSBieXRlcyBxdW90YXMuCisKIGNvbmZpZyBORlRfUkVKRUNUCiAJZGVmYXVsdCBtIGlmIE5FVEZJTFRFUl9BRFZBTkNFRD1uCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgcmVqZWN0IHN1cHBvcnQiCkBAIC01NjMsNiArNTc1LDEyIEBACiAJICB4X3RhYmxlcyBtYXRjaC90YXJnZXQgZXh0ZW5zaW9ucyBvdmVyIHRoZSBuZl90YWJsZXMKIAkgIGZyYW1ld29yay4KIAorY29uZmlnIE5GVF9IQVNICisJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgaGFzaCBtb2R1bGUiCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgImhhc2giIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIHVzZSB0byBwZXJmb3JtCisJICBhIGhhc2ggb3BlcmF0aW9uIG9uIHJlZ2lzdGVycy4KKwogaWYgTkZfVEFCTEVTX05FVERFVgogCiBjb25maWcgTkZfRFVQX05FVERFVgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9NYWtlZmlsZSBiL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggNjkxMzQ1NC4uYzIzYzNjOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCkBAIC03MSw4ICs3MSw5IEBACiAKICMgbmZfdGFibGVzCiBuZl90YWJsZXMtb2JqcyArPSBuZl90YWJsZXNfY29yZS5vIG5mX3RhYmxlc19hcGkubyBuZl90YWJsZXNfdHJhY2UubwotbmZfdGFibGVzLW9ianMgKz0gbmZ0X2ltbWVkaWF0ZS5vIG5mdF9jbXAubyBuZnRfbG9va3VwLm8gbmZ0X2R5bnNldC5vCituZl90YWJsZXMtb2JqcyArPSBuZnRfaW1tZWRpYXRlLm8gbmZ0X2NtcC5vIG5mdF9yYW5nZS5vCiBuZl90YWJsZXMtb2JqcyArPSBuZnRfYml0d2lzZS5vIG5mdF9ieXRlb3JkZXIubyBuZnRfcGF5bG9hZC5vCituZl90YWJsZXMtb2JqcyArPSBuZnRfbG9va3VwLm8gbmZ0X2R5bnNldC5vCiAKIG9iai0kKENPTkZJR19ORl9UQUJMRVMpCQkrPSBuZl90YWJsZXMubwogb2JqLSQoQ09ORklHX05GX1RBQkxFU19JTkVUKQkrPSBuZl90YWJsZXNfaW5ldC5vCkBAIC04MCwxOCArODEsMjEgQEAKIG9iai0kKENPTkZJR19ORlRfQ09NUEFUKQkrPSBuZnRfY29tcGF0Lm8KIG9iai0kKENPTkZJR19ORlRfRVhUSERSKQkrPSBuZnRfZXh0aGRyLm8KIG9iai0kKENPTkZJR19ORlRfTUVUQSkJCSs9IG5mdF9tZXRhLm8KK29iai0kKENPTkZJR19ORlRfTlVNR0VOKQkrPSBuZnRfbnVtZ2VuLm8KIG9iai0kKENPTkZJR19ORlRfQ1QpCQkrPSBuZnRfY3Qubwogb2JqLSQoQ09ORklHX05GVF9MSU1JVCkJCSs9IG5mdF9saW1pdC5vCiBvYmotJChDT05GSUdfTkZUX05BVCkJCSs9IG5mdF9uYXQubwogb2JqLSQoQ09ORklHX05GVF9RVUVVRSkJCSs9IG5mdF9xdWV1ZS5vCitvYmotJChDT05GSUdfTkZUX1FVT1RBKQkJKz0gbmZ0X3F1b3RhLm8KIG9iai0kKENPTkZJR19ORlRfUkVKRUNUKSAJKz0gbmZ0X3JlamVjdC5vCiBvYmotJChDT05GSUdfTkZUX1JFSkVDVF9JTkVUKQkrPSBuZnRfcmVqZWN0X2luZXQubwotb2JqLSQoQ09ORklHX05GVF9SQlRSRUUpCSs9IG5mdF9yYnRyZWUubwotb2JqLSQoQ09ORklHX05GVF9IQVNIKQkJKz0gbmZ0X2hhc2gubworb2JqLSQoQ09ORklHX05GVF9TRVRfUkJUUkVFKQkrPSBuZnRfc2V0X3JidHJlZS5vCitvYmotJChDT05GSUdfTkZUX1NFVF9IQVNIKQkrPSBuZnRfc2V0X2hhc2gubwogb2JqLSQoQ09ORklHX05GVF9DT1VOVEVSKQkrPSBuZnRfY291bnRlci5vCiBvYmotJChDT05GSUdfTkZUX0xPRykJCSs9IG5mdF9sb2cubwogb2JqLSQoQ09ORklHX05GVF9NQVNRKQkJKz0gbmZ0X21hc3Eubwogb2JqLSQoQ09ORklHX05GVF9SRURJUikJCSs9IG5mdF9yZWRpci5vCitvYmotJChDT05GSUdfTkZUX0hBU0gpCQkrPSBuZnRfaGFzaC5vCiAKICMgbmZfdGFibGVzIG5ldGRldgogb2JqLSQoQ09ORklHX05GVF9EVVBfTkVUREVWKQkrPSBuZnRfZHVwX25ldGRldi5vCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvY29yZS5jCmluZGV4IGYzOTI3NmQuLmM5ZDkwZWIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvY29yZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvY29yZS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogCkBAIC02MSwzMyArNjIsNjIgQEAKICNlbmRpZgogCiBzdGF0aWMgREVGSU5FX01VVEVYKG5mX2hvb2tfbXV0ZXgpOworI2RlZmluZSBuZl9lbnRyeV9kZXJlZmVyZW5jZShlKSBcCisJcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChlLCBsb2NrZGVwX2lzX2hlbGQoJm5mX2hvb2tfbXV0ZXgpKQogCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqbmZfZmluZF9ob29rX2xpc3Qoc3RydWN0IG5ldCAqbmV0LAotCQkJCQkgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZykKK3N0YXRpYyBzdHJ1Y3QgbmZfaG9va19lbnRyeSAqbmZfaG9va19lbnRyeV9oZWFkKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkJCWNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhvb2tfbGlzdCA9IE5VTEw7CisJc3RydWN0IG5mX2hvb2tfZW50cnkgKmhvb2tfaGVhZCA9IE5VTEw7CiAKIAlpZiAocmVnLT5wZiAhPSBORlBST1RPX05FVERFVikKLQkJaG9va19saXN0ID0gJm5ldC0+bmYuaG9va3NbcmVnLT5wZl1bcmVnLT5ob29rbnVtXTsKKwkJaG9va19oZWFkID0gbmZfZW50cnlfZGVyZWZlcmVuY2UobmV0LT5uZi5ob29rc1tyZWctPnBmXQorCQkJCQkJIFtyZWctPmhvb2tudW1dKTsKIAllbHNlIGlmIChyZWctPmhvb2tudW0gPT0gTkZfTkVUREVWX0lOR1JFU1MpIHsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSX0lOR1JFU1MKIAkJaWYgKHJlZy0+ZGV2ICYmIGRldl9uZXQocmVnLT5kZXYpID09IG5ldCkKLQkJCWhvb2tfbGlzdCA9ICZyZWctPmRldi0+bmZfaG9va3NfaW5ncmVzczsKKwkJCWhvb2tfaGVhZCA9CisJCQkJbmZfZW50cnlfZGVyZWZlcmVuY2UoCisJCQkJCXJlZy0+ZGV2LT5uZl9ob29rc19pbmdyZXNzKTsKICNlbmRpZgogCX0KLQlyZXR1cm4gaG9va19saXN0OworCXJldHVybiBob29rX2hlYWQ7CiB9CiAKLXN0cnVjdCBuZl9ob29rX2VudHJ5IHsKLQljb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMJKm9yaWdfb3BzOwotCXN0cnVjdCBuZl9ob29rX29wcwkJb3BzOwotfTsKKy8qIG11c3QgaG9sZCBuZl9ob29rX211dGV4ICovCitzdGF0aWMgdm9pZCBuZl9zZXRfaG9va3NfaGVhZChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqcmVnLAorCQkJICAgICAgc3RydWN0IG5mX2hvb2tfZW50cnkgKmVudHJ5KQoreworCXN3aXRjaCAocmVnLT5wZikgeworCWNhc2UgTkZQUk9UT19ORVRERVY6CisjaWZkZWYgQ09ORklHX05FVEZJTFRFUl9JTkdSRVNTCisJCS8qIFdlIGFscmVhZHkgY2hlY2tlZCBpbiBuZl9yZWdpc3Rlcl9uZXRfaG9vaygpIHRoYXQgdGhpcyBpcworCQkgKiB1c2VkIGZyb20gaW5ncmVzcy4KKwkJICovCisJCXJjdV9hc3NpZ25fcG9pbnRlcihyZWctPmRldi0+bmZfaG9va3NfaW5ncmVzcywgZW50cnkpOworI2VuZGlmCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPm5mLmhvb2tzW3JlZy0+cGZdW3JlZy0+aG9va251bV0sCisJCQkJICAgZW50cnkpOworCQlicmVhazsKKwl9Cit9CiAKIGludCBuZl9yZWdpc3Rlcl9uZXRfaG9vayhzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKmhvb2tfbGlzdDsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqaG9va3NfZW50cnk7CiAJc3RydWN0IG5mX2hvb2tfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBuZl9ob29rX29wcyAqZWxlbTsKKworCWlmIChyZWctPnBmID09IE5GUFJPVE9fTkVUREVWKSB7CisjaWZuZGVmIENPTkZJR19ORVRGSUxURVJfSU5HUkVTUworCQlpZiAocmVnLT5ob29rbnVtID09IE5GX05FVERFVl9JTkdSRVNTKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworI2VuZGlmCisJCWlmIChyZWctPmhvb2tudW0gIT0gTkZfTkVUREVWX0lOR1JFU1MgfHwKKwkJICAgICFyZWctPmRldiB8fCBkZXZfbmV0KHJlZy0+ZGV2KSAhPSBuZXQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9LRVJORUwpOwogCWlmICghZW50cnkpCkBAIC05NSwxOSArMTI1LDMwIEBACiAKIAllbnRyeS0+b3JpZ19vcHMJPSByZWc7CiAJZW50cnktPm9wcwk9ICpyZWc7Ci0KLQlob29rX2xpc3QgPSBuZl9maW5kX2hvb2tfbGlzdChuZXQsIHJlZyk7Ci0JaWYgKCFob29rX2xpc3QpIHsKLQkJa2ZyZWUoZW50cnkpOwotCQlyZXR1cm4gLUVOT0VOVDsKLQl9CisJZW50cnktPm5leHQJPSBOVUxMOwogCiAJbXV0ZXhfbG9jaygmbmZfaG9va19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShlbGVtLCBob29rX2xpc3QsIGxpc3QpIHsKLQkJaWYgKHJlZy0+cHJpb3JpdHkgPCBlbGVtLT5wcmlvcml0eSkKLQkJCWJyZWFrOworCWhvb2tzX2VudHJ5ID0gbmZfaG9va19lbnRyeV9oZWFkKG5ldCwgcmVnKTsKKworCWlmIChob29rc19lbnRyeSAmJiBob29rc19lbnRyeS0+b3JpZ19vcHMtPnByaW9yaXR5ID4gcmVnLT5wcmlvcml0eSkgeworCQkvKiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gaW5zZXJ0IGF0IHRoZSBoZWFkICovCisJCWVudHJ5LT5uZXh0ID0gaG9va3NfZW50cnk7CisJCWhvb2tzX2VudHJ5ID0gTlVMTDsKIAl9Ci0JbGlzdF9hZGRfcmN1KCZlbnRyeS0+b3BzLmxpc3QsIGVsZW0tPmxpc3QucHJldik7CisKKwl3aGlsZSAoaG9va3NfZW50cnkgJiYKKwkJcmVnLT5wcmlvcml0eSA+PSBob29rc19lbnRyeS0+b3JpZ19vcHMtPnByaW9yaXR5ICYmCisJCW5mX2VudHJ5X2RlcmVmZXJlbmNlKGhvb2tzX2VudHJ5LT5uZXh0KSkgeworCQlob29rc19lbnRyeSA9IG5mX2VudHJ5X2RlcmVmZXJlbmNlKGhvb2tzX2VudHJ5LT5uZXh0KTsKKwl9CisKKwlpZiAoaG9va3NfZW50cnkpIHsKKwkJZW50cnktPm5leHQgPSBuZl9lbnRyeV9kZXJlZmVyZW5jZShob29rc19lbnRyeS0+bmV4dCk7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihob29rc19lbnRyeS0+bmV4dCwgZW50cnkpOworCX0gZWxzZSB7CisJCW5mX3NldF9ob29rc19oZWFkKG5ldCwgcmVnLCBlbnRyeSk7CisJfQorCiAJbXV0ZXhfdW5sb2NrKCZuZl9ob29rX211dGV4KTsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSX0lOR1JFU1MKIAlpZiAocmVnLT5wZiA9PSBORlBST1RPX05FVERFViAmJiByZWctPmhvb2tudW0gPT0gTkZfTkVUREVWX0lOR1JFU1MpCkBAIC0xMjIsMjQgKzE2MywzMyBAQAogCiB2b2lkIG5mX3VucmVnaXN0ZXJfbmV0X2hvb2soc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZykKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpob29rX2xpc3Q7Ci0Jc3RydWN0IG5mX2hvb2tfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBuZl9ob29rX29wcyAqZWxlbTsKLQotCWhvb2tfbGlzdCA9IG5mX2ZpbmRfaG9va19saXN0KG5ldCwgcmVnKTsKLQlpZiAoIWhvb2tfbGlzdCkKLQkJcmV0dXJuOworCXN0cnVjdCBuZl9ob29rX2VudHJ5ICpob29rc19lbnRyeTsKIAogCW11dGV4X2xvY2soJm5mX2hvb2tfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZWxlbSwgaG9va19saXN0LCBsaXN0KSB7Ci0JCWVudHJ5ID0gY29udGFpbmVyX29mKGVsZW0sIHN0cnVjdCBuZl9ob29rX2VudHJ5LCBvcHMpOwotCQlpZiAoZW50cnktPm9yaWdfb3BzID09IHJlZykgewotCQkJbGlzdF9kZWxfcmN1KCZlbnRyeS0+b3BzLmxpc3QpOwotCQkJYnJlYWs7Ci0JCX0KKwlob29rc19lbnRyeSA9IG5mX2hvb2tfZW50cnlfaGVhZChuZXQsIHJlZyk7CisJaWYgKGhvb2tzX2VudHJ5ICYmIGhvb2tzX2VudHJ5LT5vcmlnX29wcyA9PSByZWcpIHsKKwkJbmZfc2V0X2hvb2tzX2hlYWQobmV0LCByZWcsCisJCQkJICBuZl9lbnRyeV9kZXJlZmVyZW5jZShob29rc19lbnRyeS0+bmV4dCkpOworCQlnb3RvIHVubG9jazsKIAl9CisJd2hpbGUgKGhvb2tzX2VudHJ5ICYmIG5mX2VudHJ5X2RlcmVmZXJlbmNlKGhvb2tzX2VudHJ5LT5uZXh0KSkgeworCQlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqbmV4dCA9CisJCQluZl9lbnRyeV9kZXJlZmVyZW5jZShob29rc19lbnRyeS0+bmV4dCk7CisJCXN0cnVjdCBuZl9ob29rX2VudHJ5ICpubmV4dDsKKworCQlpZiAobmV4dC0+b3JpZ19vcHMgIT0gcmVnKSB7CisJCQlob29rc19lbnRyeSA9IG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlubmV4dCA9IG5mX2VudHJ5X2RlcmVmZXJlbmNlKG5leHQtPm5leHQpOworCQlyY3VfYXNzaWduX3BvaW50ZXIoaG9va3NfZW50cnktPm5leHQsIG5uZXh0KTsKKwkJaG9va3NfZW50cnkgPSBuZXh0OworCQlicmVhazsKKwl9CisKK3VubG9jazoKIAltdXRleF91bmxvY2soJm5mX2hvb2tfbXV0ZXgpOwotCWlmICgmZWxlbS0+bGlzdCA9PSBob29rX2xpc3QpIHsKKwlpZiAoIWhvb2tzX2VudHJ5KSB7CiAJCVdBUk4oMSwgIm5mX3VucmVnaXN0ZXJfbmV0X2hvb2s6IGhvb2sgbm90IGZvdW5kIVxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0xNTEsMTAgKzIwMSwxMCBAQAogCXN0YXRpY19rZXlfc2xvd19kZWMoJm5mX2hvb2tzX25lZWRlZFtyZWctPnBmXVtyZWctPmhvb2tudW1dKTsKICNlbmRpZgogCXN5bmNocm9uaXplX25ldCgpOwotCW5mX3F1ZXVlX25mX2hvb2tfZHJvcChuZXQsICZlbnRyeS0+b3BzKTsKKwluZl9xdWV1ZV9uZl9ob29rX2Ryb3AobmV0LCBob29rc19lbnRyeSk7CiAJLyogb3RoZXIgY3B1IG1pZ2h0IHN0aWxsIHByb2Nlc3MgbmZxdWV1ZSB2ZXJkaWN0IHRoYXQgdXNlZCByZWcgKi8KIAlzeW5jaHJvbml6ZV9uZXQoKTsKLQlrZnJlZShlbnRyeSk7CisJa2ZyZWUoaG9va3NfZW50cnkpOwogfQogRVhQT1JUX1NZTUJPTChuZl91bnJlZ2lzdGVyX25ldF9ob29rKTsKIApAQCAtMTg4LDE5ICsyMzgsMTcgQEAKIAogc3RhdGljIExJU1RfSEVBRChuZl9ob29rX2xpc3QpOwogCi1pbnQgbmZfcmVnaXN0ZXJfaG9vayhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZykKK3N0YXRpYyBpbnQgX25mX3JlZ2lzdGVyX2hvb2soc3RydWN0IG5mX2hvb2tfb3BzICpyZWcpCiB7CiAJc3RydWN0IG5ldCAqbmV0LCAqbGFzdDsKIAlpbnQgcmV0OwogCi0JcnRubF9sb2NrKCk7CiAJZm9yX2VhY2hfbmV0KG5ldCkgewogCQlyZXQgPSBuZl9yZWdpc3Rlcl9uZXRfaG9vayhuZXQsIHJlZyk7CiAJCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9FTlQpCiAJCQlnb3RvIHJvbGxiYWNrOwogCX0KIAlsaXN0X2FkZF90YWlsKCZyZWctPmxpc3QsICZuZl9ob29rX2xpc3QpOwotCXJ0bmxfdW5sb2NrKCk7CiAKIAlyZXR1cm4gMDsKIHJvbGxiYWNrOgpAQCAtMjEwLDE5ICsyNTgsMzQgQEAKIAkJCWJyZWFrOwogCQluZl91bnJlZ2lzdGVyX25ldF9ob29rKG5ldCwgcmVnKTsKIAl9CisJcmV0dXJuIHJldDsKK30KKworaW50IG5mX3JlZ2lzdGVyX2hvb2soc3RydWN0IG5mX2hvb2tfb3BzICpyZWcpCit7CisJaW50IHJldDsKKworCXJ0bmxfbG9jaygpOworCXJldCA9IF9uZl9yZWdpc3Rlcl9ob29rKHJlZyk7CiAJcnRubF91bmxvY2soKTsKKwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX3JlZ2lzdGVyX2hvb2spOwogCi12b2lkIG5mX3VucmVnaXN0ZXJfaG9vayhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZykKK3N0YXRpYyB2b2lkIF9uZl91bnJlZ2lzdGVyX2hvb2soc3RydWN0IG5mX2hvb2tfb3BzICpyZWcpCiB7CiAJc3RydWN0IG5ldCAqbmV0OwogCi0JcnRubF9sb2NrKCk7CiAJbGlzdF9kZWwoJnJlZy0+bGlzdCk7CiAJZm9yX2VhY2hfbmV0KG5ldCkKIAkJbmZfdW5yZWdpc3Rlcl9uZXRfaG9vayhuZXQsIHJlZyk7Cit9CisKK3ZvaWQgbmZfdW5yZWdpc3Rlcl9ob29rKHN0cnVjdCBuZl9ob29rX29wcyAqcmVnKQoreworCXJ0bmxfbG9jaygpOworCV9uZl91bnJlZ2lzdGVyX2hvb2socmVnKTsKIAlydG5sX3VubG9jaygpOwogfQogRVhQT1JUX1NZTUJPTChuZl91bnJlZ2lzdGVyX2hvb2spOwpAQCAtMjQ2LDYgKzMwOSwyNiBAQAogfQogRVhQT1JUX1NZTUJPTChuZl9yZWdpc3Rlcl9ob29rcyk7CiAKKy8qIENhbGxlciBNVVNUIHRha2UgcnRubF9sb2NrKCkgKi8KK2ludCBfbmZfcmVnaXN0ZXJfaG9va3Moc3RydWN0IG5mX2hvb2tfb3BzICpyZWcsIHVuc2lnbmVkIGludCBuKQoreworCXVuc2lnbmVkIGludCBpOworCWludCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQllcnIgPSBfbmZfcmVnaXN0ZXJfaG9vaygmcmVnW2ldKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyOworCX0KKwlyZXR1cm4gZXJyOworCitlcnI6CisJaWYgKGkgPiAwKQorCQlfbmZfdW5yZWdpc3Rlcl9ob29rcyhyZWcsIGkpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKF9uZl9yZWdpc3Rlcl9ob29rcyk7CisKIHZvaWQgbmZfdW5yZWdpc3Rlcl9ob29rcyhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZywgdW5zaWduZWQgaW50IG4pCiB7CiAJd2hpbGUgKG4tLSA+IDApCkBAIC0yNTMsMTAgKzMzNiwxNyBAQAogfQogRVhQT1JUX1NZTUJPTChuZl91bnJlZ2lzdGVyX2hvb2tzKTsKIAotdW5zaWduZWQgaW50IG5mX2l0ZXJhdGUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKLQkJCXN0cnVjdCBza19idWZmICpza2IsCisvKiBDYWxsZXIgTVVTVCB0YWtlIHJ0bmxfbG9jayAqLwordm9pZCBfbmZfdW5yZWdpc3Rlcl9ob29rcyhzdHJ1Y3QgbmZfaG9va19vcHMgKnJlZywgdW5zaWduZWQgaW50IG4pCit7CisJd2hpbGUgKG4tLSA+IDApCisJCV9uZl91bnJlZ2lzdGVyX2hvb2soJnJlZ1tuXSk7Cit9CitFWFBPUlRfU1lNQk9MKF9uZl91bnJlZ2lzdGVyX2hvb2tzKTsKKwordW5zaWduZWQgaW50IG5mX2l0ZXJhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCXN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKLQkJCXN0cnVjdCBuZl9ob29rX29wcyAqKmVsZW1wKQorCQkJc3RydWN0IG5mX2hvb2tfZW50cnkgKiplbnRyeXApCiB7CiAJdW5zaWduZWQgaW50IHZlcmRpY3Q7CiAKQEAgLTI2NCwyMCArMzU0LDIzIEBACiAJICogVGhlIGNhbGxlciBtdXN0IG5vdCBibG9jayBiZXR3ZWVuIGNhbGxzIHRvIHRoaXMKIAkgKiBmdW5jdGlvbiBiZWNhdXNlIG9mIHJpc2sgb2YgY29udGludWluZyBmcm9tIGRlbGV0ZWQgZWxlbWVudC4KIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JjdSgoKmVsZW1wKSwgaGVhZCwgbGlzdCkgewotCQlpZiAoc3RhdGUtPnRocmVzaCA+ICgqZWxlbXApLT5wcmlvcml0eSkKKwl3aGlsZSAoKmVudHJ5cCkgeworCQlpZiAoc3RhdGUtPnRocmVzaCA+ICgqZW50cnlwKS0+b3BzLnByaW9yaXR5KSB7CisJCQkqZW50cnlwID0gcmN1X2RlcmVmZXJlbmNlKCgqZW50cnlwKS0+bmV4dCk7CiAJCQljb250aW51ZTsKKwkJfQogCiAJCS8qIE9wdGltaXphdGlvbjogd2UgZG9uJ3QgbmVlZCB0byBob2xkIG1vZHVsZQogCQkgICByZWZlcmVuY2UgaGVyZSwgc2luY2UgZnVuY3Rpb24gY2FuJ3Qgc2xlZXAuIC0tUlIgKi8KIHJlcGVhdDoKLQkJdmVyZGljdCA9ICgqZWxlbXApLT5ob29rKCgqZWxlbXApLT5wcml2LCBza2IsIHN0YXRlKTsKKwkJdmVyZGljdCA9ICgqZW50cnlwKS0+b3BzLmhvb2soKCplbnRyeXApLT5vcHMucHJpdiwgc2tiLCBzdGF0ZSk7CiAJCWlmICh2ZXJkaWN0ICE9IE5GX0FDQ0VQVCkgewogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKIAkJCWlmICh1bmxpa2VseSgodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykKIAkJCQkJCQk+IE5GX01BWF9WRVJESUNUKSkgewogCQkJCU5GREVCVUcoIkV2aWwgcmV0dXJuIGZyb20gJXAoJXUpLlxuIiwKLQkJCQkJKCplbGVtcCktPmhvb2ssIHN0YXRlLT5ob29rKTsKKwkJCQkJKCplbnRyeXApLT5vcHMuaG9vaywgc3RhdGUtPmhvb2spOworCQkJCSplbnRyeXAgPSByY3VfZGVyZWZlcmVuY2UoKCplbnRyeXApLT5uZXh0KTsKIAkJCQljb250aW51ZTsKIAkJCX0KICNlbmRpZgpAQCAtMjg1LDI1ICszNzgsMjMgQEAKIAkJCQlyZXR1cm4gdmVyZGljdDsKIAkJCWdvdG8gcmVwZWF0OwogCQl9CisJCSplbnRyeXAgPSByY3VfZGVyZWZlcmVuY2UoKCplbnRyeXApLT5uZXh0KTsKIAl9CiAJcmV0dXJuIE5GX0FDQ0VQVDsKIH0KIAogCiAvKiBSZXR1cm5zIDEgaWYgb2tmbigpIG5lZWRzIHRvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjYWxsZXIsCi0gKiAtRVBFUk0gZm9yIE5GX0RST1AsIDAgb3RoZXJ3aXNlLiAqLworICogLUVQRVJNIGZvciBORl9EUk9QLCAwIG90aGVyd2lzZS4gIENhbGxlciBtdXN0IGhvbGQgcmN1X3JlYWRfbG9jay4gKi8KIGludCBuZl9ob29rX3Nsb3coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewotCXN0cnVjdCBuZl9ob29rX29wcyAqZWxlbTsKKwlzdHJ1Y3QgbmZfaG9va19lbnRyeSAqZW50cnk7CiAJdW5zaWduZWQgaW50IHZlcmRpY3Q7CiAJaW50IHJldCA9IDA7CiAKLQkvKiBXZSBtYXkgYWxyZWFkeSBoYXZlIHRoaXMsIGJ1dCByZWFkLWxvY2tzIG5lc3QgYW55d2F5ICovCi0JcmN1X3JlYWRfbG9jaygpOwotCi0JZWxlbSA9IGxpc3RfZW50cnlfcmN1KHN0YXRlLT5ob29rX2xpc3QsIHN0cnVjdCBuZl9ob29rX29wcywgbGlzdCk7CisJZW50cnkgPSByY3VfZGVyZWZlcmVuY2Uoc3RhdGUtPmhvb2tfZW50cmllcyk7CiBuZXh0X2hvb2s6Ci0JdmVyZGljdCA9IG5mX2l0ZXJhdGUoc3RhdGUtPmhvb2tfbGlzdCwgc2tiLCBzdGF0ZSwgJmVsZW0pOworCXZlcmRpY3QgPSBuZl9pdGVyYXRlKHNrYiwgc3RhdGUsICZlbnRyeSk7CiAJaWYgKHZlcmRpY3QgPT0gTkZfQUNDRVBUIHx8IHZlcmRpY3QgPT0gTkZfU1RPUCkgewogCQlyZXQgPSAxOwogCX0gZWxzZSBpZiAoKHZlcmRpY3QgJiBORl9WRVJESUNUX01BU0spID09IE5GX0RST1ApIHsKQEAgLTMxMiw4ICs0MDMsMTAgQEAKIAkJaWYgKHJldCA9PSAwKQogCQkJcmV0ID0gLUVQRVJNOwogCX0gZWxzZSBpZiAoKHZlcmRpY3QgJiBORl9WRVJESUNUX01BU0spID09IE5GX1FVRVVFKSB7Ci0JCWludCBlcnIgPSBuZl9xdWV1ZShza2IsIGVsZW0sIHN0YXRlLAotCQkJCSAgIHZlcmRpY3QgPj4gTkZfVkVSRElDVF9RQklUUyk7CisJCWludCBlcnI7CisKKwkJUkNVX0lOSVRfUE9JTlRFUihzdGF0ZS0+aG9va19lbnRyaWVzLCBlbnRyeSk7CisJCWVyciA9IG5mX3F1ZXVlKHNrYiwgc3RhdGUsIHZlcmRpY3QgPj4gTkZfVkVSRElDVF9RQklUUyk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlpZiAoZXJyID09IC1FU1JDSCAmJgogCQkJICAgKHZlcmRpY3QgJiBORl9WRVJESUNUX0ZMQUdfUVVFVUVfQllQQVNTKSkKQEAgLTMyMSw3ICs0MTQsNiBAQAogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCX0KIAl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wobmZfaG9va19zbG93KTsKQEAgLTQ0MSw3ICs1MzMsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmV0LT5uZi5ob29rcyk7IGkrKykgewogCQlmb3IgKGggPSAwOyBoIDwgTkZfTUFYX0hPT0tTOyBoKyspCi0JCQlJTklUX0xJU1RfSEVBRCgmbmV0LT5uZi5ob29rc1tpXVtoXSk7CisJCQlSQ1VfSU5JVF9QT0lOVEVSKG5ldC0+bmYuaG9va3NbaV1baF0sIE5VTEwpOwogCX0KIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbmZjdC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX25mY3QuYwppbmRleCBmMDRmZDhkLi5mYzIzMGQ5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfbmZjdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19uZmN0LmMKQEAgLTI4MSwxMyArMjgxLDEwIEBACiAJaCA9IG5mX2Nvbm50cmFja19maW5kX2dldChjcC0+aXB2cy0+bmV0LCAmbmZfY3Rfem9uZV9kZmx0LCAmdHVwbGUpOwogCWlmIChoKSB7CiAJCWN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQkJLyogU2hvdyB3aGF0IGhhcHBlbnMgaW5zdGVhZCBvZiBjYWxsaW5nIG5mX2N0X2tpbGwoKSAqLwotCQlpZiAoZGVsX3RpbWVyKCZjdC0+dGltZW91dCkpIHsKLQkJCUlQX1ZTX0RCRyg3LCAiJXM6IGN0PSVwLCBkZWxldGVkIGNvbm50cmFjayB0aW1lciBmb3IgdHVwbGU9IgorCQlpZiAobmZfY3Rfa2lsbChjdCkpIHsKKwkJCUlQX1ZTX0RCRyg3LCAiJXM6IGN0PSVwLCBkZWxldGVkIGNvbm50cmFjayBmb3IgdHVwbGU9IgogCQkJCUZNVF9UVVBMRSAiXG4iLAogCQkJCV9fZnVuY19fLCBjdCwgQVJHX1RVUExFKCZ0dXBsZSkpOwotCQkJaWYgKGN0LT50aW1lb3V0LmZ1bmN0aW9uKQotCQkJCWN0LT50aW1lb3V0LmZ1bmN0aW9uKGN0LT50aW1lb3V0LmRhdGEpOwogCQl9IGVsc2UgewogCQkJSVBfVlNfREJHKDcsICIlczogY3Q9JXAsIG5vIGNvbm50cmFjayB0aW1lciBmb3IgdHVwbGU9IgogCQkJCUZNVF9UVVBMRSAiXG4iLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCmluZGV4IGRkMmM0M2EuLmJhNmExZDQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKQEAgLTcyLDEyICs3MiwyNCBAQAogc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKm5mX2Nvbm50cmFja19oYXNoIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfaGFzaCk7CiAKK3N0cnVjdCBjb25udHJhY2tfZ2Nfd29yayB7CisJc3RydWN0IGRlbGF5ZWRfd29yawlkd29yazsKKwl1MzIJCQlsYXN0X2J1Y2tldDsKKwlib29sCQkJZXhpdGluZzsKK307CisKIHN0YXRpYyBfX3JlYWRfbW9zdGx5IHN0cnVjdCBrbWVtX2NhY2hlICpuZl9jb25udHJhY2tfY2FjaGVwOwogc3RhdGljIF9fcmVhZF9tb3N0bHkgc3BpbmxvY2tfdCBuZl9jb25udHJhY2tfbG9ja3NfYWxsX2xvY2s7Ci1zdGF0aWMgX19yZWFkX21vc3RseSBzZXFjb3VudF90IG5mX2Nvbm50cmFja19nZW5lcmF0aW9uOwogc3RhdGljIF9fcmVhZF9tb3N0bHkgREVGSU5FX1NQSU5MT0NLKG5mX2Nvbm50cmFja19sb2Nrc19hbGxfbG9jayk7CiBzdGF0aWMgX19yZWFkX21vc3RseSBib29sIG5mX2Nvbm50cmFja19sb2Nrc19hbGw7CiAKKyNkZWZpbmUgR0NfTUFYX0JVQ0tFVFNfRElWCTY0dQorI2RlZmluZSBHQ19NQVhfQlVDS0VUUwkJODE5MnUKKyNkZWZpbmUgR0NfSU5URVJWQUwJCSg1ICogSFopCisjZGVmaW5lIEdDX01BWF9FVklDVFMJCTI1NnUKKworc3RhdGljIHN0cnVjdCBjb25udHJhY2tfZ2Nfd29yayBjb25udHJhY2tfZ2Nfd29yazsKKwogdm9pZCBuZl9jb25udHJhY2tfbG9jayhzcGlubG9ja190ICpsb2NrKSBfX2FjcXVpcmVzKGxvY2spCiB7CiAJc3Bpbl9sb2NrKGxvY2spOwpAQCAtMTY0LDcgKzE3Niw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChuZl9jb25udHJhY2tfaHRhYmxlX3NpemUpOwogCiB1bnNpZ25lZCBpbnQgbmZfY29ubnRyYWNrX21heCBfX3JlYWRfbW9zdGx5OwotRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX21heCk7CitzZXFjb3VudF90IG5mX2Nvbm50cmFja19nZW5lcmF0aW9uIF9fcmVhZF9tb3N0bHk7CiAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBuZl9jb25uLCBuZl9jb25udHJhY2tfdW50cmFja2VkKTsKIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTChuZl9jb25udHJhY2tfdW50cmFja2VkKTsKQEAgLTM2NywxMiArMzc5LDEwIEBACiBkZXN0cm95X2Nvbm50cmFjayhzdHJ1Y3QgbmZfY29ubnRyYWNrICpuZmN0KQogewogCXN0cnVjdCBuZl9jb25uICpjdCA9IChzdHJ1Y3QgbmZfY29ubiAqKW5mY3Q7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2w0cHJvdG8gKmw0cHJvdG87CiAKIAlwcl9kZWJ1ZygiZGVzdHJveV9jb25udHJhY2soJXApXG4iLCBjdCk7CiAJTkZfQ1RfQVNTRVJUKGF0b21pY19yZWFkKCZuZmN0LT51c2UpID09IDApOwotCU5GX0NUX0FTU0VSVCghdGltZXJfcGVuZGluZygmY3QtPnRpbWVvdXQpKTsKIAogCWlmICh1bmxpa2VseShuZl9jdF9pc190ZW1wbGF0ZShjdCkpKSB7CiAJCW5mX2N0X3RtcGxfZnJlZShjdCk7CkBAIC0zOTUsNyArNDA1LDYgQEAKIAogCW5mX2N0X2RlbF9mcm9tX2R5aW5nX29yX3VuY29uZmlybWVkX2xpc3QoY3QpOwogCi0JTkZfQ1RfU1RBVF9JTkMobmV0LCBkZWxldGUpOwogCWxvY2FsX2JoX2VuYWJsZSgpOwogCiAJaWYgKGN0LT5tYXN0ZXIpCkBAIC00MjcsNyArNDM2LDYgQEAKIAogCW5mX2N0X2FkZF90b19keWluZ19saXN0KGN0KTsKIAotCU5GX0NUX1NUQVRfSU5DKG5ldCwgZGVsZXRlX2xpc3QpOwogCWxvY2FsX2JoX2VuYWJsZSgpOwogfQogCkBAIC00MzUsMzUgKzQ0MywzMCBAQAogewogCXN0cnVjdCBuZl9jb25uX3RzdGFtcCAqdHN0YW1wOwogCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoSVBTX0RZSU5HX0JJVCwgJmN0LT5zdGF0dXMpKQorCQlyZXR1cm4gZmFsc2U7CisKIAl0c3RhbXAgPSBuZl9jb25uX3RzdGFtcF9maW5kKGN0KTsKIAlpZiAodHN0YW1wICYmIHRzdGFtcC0+c3RvcCA9PSAwKQogCQl0c3RhbXAtPnN0b3AgPSBrdGltZV9nZXRfcmVhbF9ucygpOwogCi0JaWYgKG5mX2N0X2lzX2R5aW5nKGN0KSkKLQkJZ290byBkZWxldGU7Ci0KIAlpZiAobmZfY29ubnRyYWNrX2V2ZW50X3JlcG9ydChJUENUX0RFU1RST1ksIGN0LAogCQkJCSAgICBwb3J0aWQsIHJlcG9ydCkgPCAwKSB7Ci0JCS8qIGRlc3Ryb3kgZXZlbnQgd2FzIG5vdCBkZWxpdmVyZWQgKi8KKwkJLyogZGVzdHJveSBldmVudCB3YXMgbm90IGRlbGl2ZXJlZC4gbmZfY3RfcHV0IHdpbGwKKwkJICogYmUgZG9uZSBieSBldmVudCBjYWNoZSB3b3JrZXIgb24gcmVkZWxpdmVyeS4KKwkJICovCiAJCW5mX2N0X2RlbGV0ZV9mcm9tX2xpc3RzKGN0KTsKIAkJbmZfY29ubnRyYWNrX2VjYWNoZV9kZWxheWVkX3dvcmsobmZfY3RfbmV0KGN0KSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAluZl9jb25udHJhY2tfZWNhY2hlX3dvcmsobmZfY3RfbmV0KGN0KSk7Ci0Jc2V0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cyk7Ci0gZGVsZXRlOgogCW5mX2N0X2RlbGV0ZV9mcm9tX2xpc3RzKGN0KTsKIAluZl9jdF9wdXQoY3QpOwogCXJldHVybiB0cnVlOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfZGVsZXRlKTsKIAotc3RhdGljIHZvaWQgZGVhdGhfYnlfdGltZW91dCh1bnNpZ25lZCBsb25nIHVsX2Nvbm50cmFjaykKLXsKLQluZl9jdF9kZWxldGUoKHN0cnVjdCBuZl9jb25uICopdWxfY29ubnRyYWNrLCAwLCAwKTsKLX0KLQogc3RhdGljIGlubGluZSBib29sCiBuZl9jdF9rZXlfZXF1YWwoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoLAogCQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKQEAgLTQ4MSwyMiArNDg0LDE3IEBACiAJICAgICAgIG5ldF9lcShuZXQsIG5mX2N0X25ldChjdCkpOwogfQogCi0vKiBtdXN0IGJlIGNhbGxlZCB3aXRoIHJjdSByZWFkIGxvY2sgaGVsZCAqLwotdm9pZCBuZl9jb25udHJhY2tfZ2V0X2h0KHN0cnVjdCBobGlzdF9udWxsc19oZWFkICoqaGFzaCwgdW5zaWduZWQgaW50ICpoc2l6ZSkKKy8qIGNhbGxlciBtdXN0IGhvbGQgcmN1IHJlYWRsb2NrIGFuZCBub25lIG9mIHRoZSBuZl9jb25udHJhY2tfbG9ja3MgKi8KK3N0YXRpYyB2b2lkIG5mX2N0X2djX2V4cGlyZWQoc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpocHRyOwotCXVuc2lnbmVkIGludCBzZXF1ZW5jZSwgaHN6OworCWlmICghYXRvbWljX2luY19ub3RfemVybygmY3QtPmN0X2dlbmVyYWwudXNlKSkKKwkJcmV0dXJuOwogCi0JZG8gewotCQlzZXF1ZW5jZSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJm5mX2Nvbm50cmFja19nZW5lcmF0aW9uKTsKLQkJaHN6ID0gbmZfY29ubnRyYWNrX2h0YWJsZV9zaXplOwotCQlocHRyID0gbmZfY29ubnRyYWNrX2hhc2g7Ci0JfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24sIHNlcXVlbmNlKSk7CisJaWYgKG5mX2N0X3Nob3VsZF9nYyhjdCkpCisJCW5mX2N0X2tpbGwoY3QpOwogCi0JKmhhc2ggPSBocHRyOwotCSpoc2l6ZSA9IGhzejsKKwluZl9jdF9wdXQoY3QpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2dldF9odCk7CiAKIC8qCiAgKiBXYXJuaW5nIDoKQEAgLTUxMCwyMSArNTA4LDI2IEBACiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZV9oYXNoICpoOwogCXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpjdF9oYXNoOwogCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOwotCXVuc2lnbmVkIGludCBidWNrZXQsIHNlcXVlbmNlOworCXVuc2lnbmVkIGludCBidWNrZXQsIGhzaXplOwogCiBiZWdpbjoKLQlkbyB7Ci0JCXNlcXVlbmNlID0gcmVhZF9zZXFjb3VudF9iZWdpbigmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24pOwotCQlidWNrZXQgPSBzY2FsZV9oYXNoKGhhc2gpOwotCQljdF9oYXNoID0gbmZfY29ubnRyYWNrX2hhc2g7Ci0JfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24sIHNlcXVlbmNlKSk7CisJbmZfY29ubnRyYWNrX2dldF9odCgmY3RfaGFzaCwgJmhzaXplKTsKKwlidWNrZXQgPSByZWNpcHJvY2FsX3NjYWxlKGhhc2gsIGhzaXplKTsKIAogCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShoLCBuLCAmY3RfaGFzaFtidWNrZXRdLCBobm5vZGUpIHsKLQkJaWYgKG5mX2N0X2tleV9lcXVhbChoLCB0dXBsZSwgem9uZSwgbmV0KSkgewotCQkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKG5ldCwgZm91bmQpOwotCQkJcmV0dXJuIGg7CisJCXN0cnVjdCBuZl9jb25uICpjdDsKKworCQljdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CisJCWlmIChuZl9jdF9pc19leHBpcmVkKGN0KSkgeworCQkJbmZfY3RfZ2NfZXhwaXJlZChjdCk7CisJCQljb250aW51ZTsKIAkJfQotCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBzZWFyY2hlZCk7CisKKwkJaWYgKG5mX2N0X2lzX2R5aW5nKGN0KSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChuZl9jdF9rZXlfZXF1YWwoaCwgdHVwbGUsIHpvbmUsIG5ldCkpCisJCQlyZXR1cm4gaDsKIAl9CiAJLyoKIAkgKiBpZiB0aGUgbnVsbHMgdmFsdWUgd2UgZ290IGF0IHRoZSBlbmQgb2YgdGhpcyBsb29rdXAgaXMKQEAgLTYxOCw3ICs2MjEsNiBAQAogCQkJCSAgICB6b25lLCBuZXQpKQogCQkJZ290byBvdXQ7CiAKLQlhZGRfdGltZXIoJmN0LT50aW1lb3V0KTsKIAlzbXBfd21iKCk7CiAJLyogVGhlIGNhbGxlciBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCAqLwogCWF0b21pY19zZXQoJmN0LT5jdF9nZW5lcmFsLnVzZSwgMik7CkBAIC03NzEsOCArNzczLDcgQEAKIAkvKiBUaW1lciByZWxhdGl2ZSB0byBjb25maXJtYXRpb24gdGltZSwgbm90IG9yaWdpbmFsCiAJICAgc2V0dGluZyB0aW1lLCBvdGhlcndpc2Ugd2UnZCBnZXQgdGltZXIgd3JhcCBpbgogCSAgIHdlaXJkIGRlbGF5IGNhc2VzLiAqLwotCWN0LT50aW1lb3V0LmV4cGlyZXMgKz0gamlmZmllczsKLQlhZGRfdGltZXIoJmN0LT50aW1lb3V0KTsKKwljdC0+dGltZW91dCArPSBuZmN0X3RpbWVfc3RhbXA7CiAJYXRvbWljX2luYygmY3QtPmN0X2dlbmVyYWwudXNlKTsKIAljdC0+c3RhdHVzIHw9IElQU19DT05GSVJNRUQ7CiAKQEAgLTc5MSw3ICs3OTIsNiBAQAogCSAqLwogCV9fbmZfY29ubnRyYWNrX2hhc2hfaW5zZXJ0KGN0LCBoYXNoLCByZXBseV9oYXNoKTsKIAluZl9jb25udHJhY2tfZG91YmxlX3VubG9jayhoYXNoLCByZXBseV9oYXNoKTsKLQlORl9DVF9TVEFUX0lOQyhuZXQsIGluc2VydCk7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CiAKIAloZWxwID0gbmZjdF9oZWxwKGN0KTsKQEAgLTgyMywyOSArODIzLDQwIEBACiAJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja196b25lICp6b25lOwogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqaDsKIAlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZCAqY3RfaGFzaDsKLQl1bnNpZ25lZCBpbnQgaGFzaCwgc2VxdWVuY2U7CisJdW5zaWduZWQgaW50IGhhc2gsIGhzaXplOwogCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpuOwogCXN0cnVjdCBuZl9jb25uICpjdDsKIAogCXpvbmUgPSBuZl9jdF96b25lKGlnbm9yZWRfY29ubnRyYWNrKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlkbyB7Ci0JCXNlcXVlbmNlID0gcmVhZF9zZXFjb3VudF9iZWdpbigmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24pOwotCQloYXNoID0gaGFzaF9jb25udHJhY2sobmV0LCB0dXBsZSk7Ci0JCWN0X2hhc2ggPSBuZl9jb25udHJhY2tfaGFzaDsKLQl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZuZl9jb25udHJhY2tfZ2VuZXJhdGlvbiwgc2VxdWVuY2UpKTsKKyBiZWdpbjoKKwluZl9jb25udHJhY2tfZ2V0X2h0KCZjdF9oYXNoLCAmaHNpemUpOworCWhhc2ggPSBfX2hhc2hfY29ubnRyYWNrKG5ldCwgdHVwbGUsIGhzaXplKTsKIAogCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5X3JjdShoLCBuLCAmY3RfaGFzaFtoYXNoXSwgaG5ub2RlKSB7CiAJCWN0ID0gbmZfY3RfdHVwbGVoYXNoX3RvX2N0cmFjayhoKTsKLQkJaWYgKGN0ICE9IGlnbm9yZWRfY29ubnRyYWNrICYmCi0JCSAgICBuZl9jdF9rZXlfZXF1YWwoaCwgdHVwbGUsIHpvbmUsIG5ldCkpIHsKKworCQlpZiAoY3QgPT0gaWdub3JlZF9jb25udHJhY2spCisJCQljb250aW51ZTsKKworCQlpZiAobmZfY3RfaXNfZXhwaXJlZChjdCkpIHsKKwkJCW5mX2N0X2djX2V4cGlyZWQoY3QpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobmZfY3Rfa2V5X2VxdWFsKGgsIHR1cGxlLCB6b25lLCBuZXQpKSB7CiAJCQlORl9DVF9TVEFUX0lOQ19BVE9NSUMobmV0LCBmb3VuZCk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiAxOwogCQl9Ci0JCU5GX0NUX1NUQVRfSU5DX0FUT01JQyhuZXQsIHNlYXJjaGVkKTsKIAl9CisKKwlpZiAoZ2V0X251bGxzX3ZhbHVlKG4pICE9IGhhc2gpIHsKKwkJTkZfQ1RfU1RBVF9JTkNfQVRPTUlDKG5ldCwgc2VhcmNoX3Jlc3RhcnQpOworCQlnb3RvIGJlZ2luOworCX0KKwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIDA7CkBAIC04NjcsNiArODc4LDExIEBACiAJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGgsIG4sIGhlYWQsIGhubm9kZSkgewogCQl0bXAgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOwogCisJCWlmIChuZl9jdF9pc19leHBpcmVkKHRtcCkpIHsKKwkJCW5mX2N0X2djX2V4cGlyZWQodG1wKTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJaWYgKHRlc3RfYml0KElQU19BU1NVUkVEX0JJVCwgJnRtcC0+c3RhdHVzKSB8fAogCQkgICAgIW5ldF9lcShuZl9jdF9uZXQodG1wKSwgbmV0KSB8fAogCQkgICAgbmZfY3RfaXNfZHlpbmcodG1wKSkKQEAgLTg4NCw3ICs5MDAsNiBAQAogCQkgKi8KIAkJaWYgKG5ldF9lcShuZl9jdF9uZXQodG1wKSwgbmV0KSAmJgogCQkgICAgbmZfY3RfaXNfY29uZmlybWVkKHRtcCkgJiYKLQkJICAgIGRlbF90aW1lcigmdG1wLT50aW1lb3V0KSAmJgogCQkgICAgbmZfY3RfZGVsZXRlKHRtcCwgMCwgMCkpCiAJCQlkcm9wcysrOwogCkBAIC05MDAsMTQgKzkxNSwxMSBAQAogCiAJZm9yIChpID0gMDsgaSA8IE5GX0NUX0VWSUNUSU9OX1JBTkdFOyBpKyspIHsKIAkJc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmN0X2hhc2g7Ci0JCXVuc2lnbmVkIGhhc2gsIHNlcXVlbmNlLCBkcm9wczsKKwkJdW5zaWduZWQgaW50IGhhc2gsIGhzaXplLCBkcm9wczsKIAogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCWRvIHsKLQkJCXNlcXVlbmNlID0gcmVhZF9zZXFjb3VudF9iZWdpbigmbmZfY29ubnRyYWNrX2dlbmVyYXRpb24pOwotCQkJaGFzaCA9IHNjYWxlX2hhc2goX2hhc2grKyk7Ci0JCQljdF9oYXNoID0gbmZfY29ubnRyYWNrX2hhc2g7Ci0JCX0gd2hpbGUgKHJlYWRfc2VxY291bnRfcmV0cnkoJm5mX2Nvbm50cmFja19nZW5lcmF0aW9uLCBzZXF1ZW5jZSkpOworCQluZl9jb25udHJhY2tfZ2V0X2h0KCZjdF9oYXNoLCAmaHNpemUpOworCQloYXNoID0gcmVjaXByb2NhbF9zY2FsZShfaGFzaCsrLCBoc2l6ZSk7CiAKIAkJZHJvcHMgPSBlYXJseV9kcm9wX2xpc3QobmV0LCAmY3RfaGFzaFtoYXNoXSk7CiAJCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtOTIxLDYgKzkzMyw2OSBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIHZvaWQgZ2Nfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl1bnNpZ25lZCBpbnQgaSwgZ29hbCwgYnVja2V0cyA9IDAsIGV4cGlyZWRfY291bnQgPSAwOworCXVuc2lnbmVkIGxvbmcgbmV4dF9ydW4gPSBHQ19JTlRFUlZBTDsKKwl1bnNpZ25lZCBpbnQgcmF0aW8sIHNjYW5uZWQgPSAwOworCXN0cnVjdCBjb25udHJhY2tfZ2Nfd29yayAqZ2Nfd29yazsKKworCWdjX3dvcmsgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNvbm50cmFja19nY193b3JrLCBkd29yay53b3JrKTsKKworCWdvYWwgPSBtaW4obmZfY29ubnRyYWNrX2h0YWJsZV9zaXplIC8gR0NfTUFYX0JVQ0tFVFNfRElWLCBHQ19NQVhfQlVDS0VUUyk7CisJaSA9IGdjX3dvcmstPmxhc3RfYnVja2V0OworCisJZG8geworCQlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlX2hhc2ggKmg7CisJCXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpjdF9oYXNoOworCQlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbjsKKwkJdW5zaWduZWQgaW50IGhhc2hzejsKKwkJc3RydWN0IG5mX2Nvbm4gKnRtcDsKKworCQlpKys7CisJCXJjdV9yZWFkX2xvY2soKTsKKworCQluZl9jb25udHJhY2tfZ2V0X2h0KCZjdF9oYXNoLCAmaGFzaHN6KTsKKwkJaWYgKGkgPj0gaGFzaHN6KQorCQkJaSA9IDA7CisKKwkJaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnlfcmN1KGgsIG4sICZjdF9oYXNoW2ldLCBobm5vZGUpIHsKKwkJCXRtcCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CisKKwkJCXNjYW5uZWQrKzsKKwkJCWlmIChuZl9jdF9pc19leHBpcmVkKHRtcCkpIHsKKwkJCQluZl9jdF9nY19leHBpcmVkKHRtcCk7CisJCQkJZXhwaXJlZF9jb3VudCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogY291bGQgY2hlY2sgZ2V0X251bGxzX3ZhbHVlKCkgaGVyZSBhbmQgcmVzdGFydCBpZiBjdAorCQkgKiB3YXMgbW92ZWQgdG8gYW5vdGhlciBjaGFpbi4gIEJ1dCBnaXZlbiBnYyBpcyBiZXN0LWVmZm9ydAorCQkgKiB3ZSB3aWxsIGp1c3QgY29udGludWUgd2l0aCBuZXh0IGhhc2ggc2xvdC4KKwkJICovCisJCXJjdV9yZWFkX3VubG9jaygpOworCQljb25kX3Jlc2NoZWRfcmN1X3FzKCk7CisJfSB3aGlsZSAoKytidWNrZXRzIDwgZ29hbCAmJgorCQkgZXhwaXJlZF9jb3VudCA8IEdDX01BWF9FVklDVFMpOworCisJaWYgKGdjX3dvcmstPmV4aXRpbmcpCisJCXJldHVybjsKKworCXJhdGlvID0gc2Nhbm5lZCA/IGV4cGlyZWRfY291bnQgKiAxMDAgLyBzY2FubmVkIDogMDsKKwlpZiAocmF0aW8gPj0gOTApCisJCW5leHRfcnVuID0gMDsKKworCWdjX3dvcmstPmxhc3RfYnVja2V0ID0gaTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmdjX3dvcmstPmR3b3JrLCBuZXh0X3J1bik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbm50cmFja19nY193b3JrX2luaXQoc3RydWN0IGNvbm50cmFja19nY193b3JrICpnY193b3JrKQoreworCUlOSVRfREVMQVlFRF9XT1JLKCZnY193b3JrLT5kd29yaywgZ2Nfd29ya2VyKTsKKwlnY193b3JrLT5leGl0aW5nID0gZmFsc2U7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgbmZfY29ubiAqCiBfX25mX2Nvbm50cmFja19hbGxvYyhzdHJ1Y3QgbmV0ICpuZXQsCiAJCSAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja196b25lICp6b25lLApAQCAtOTU3LDggKzEwMzIsNiBAQAogCS8qIHNhdmUgaGFzaCBmb3IgcmV1c2luZyB3aGVuIGNvbmZpcm1pbmcgKi8KIAkqKHVuc2lnbmVkIGxvbmcgKikoJmN0LT50dXBsZWhhc2hbSVBfQ1RfRElSX1JFUExZXS5obm5vZGUucHByZXYpID0gaGFzaDsKIAljdC0+c3RhdHVzID0gMDsKLQkvKiBEb24ndCBzZXQgdGltZXIgeWV0OiB3YWl0IGZvciBjb25maXJtYXRpb24gKi8KLQlzZXR1cF90aW1lcigmY3QtPnRpbWVvdXQsIGRlYXRoX2J5X3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKWN0KTsKIAl3cml0ZV9wbmV0KCZjdC0+Y3RfbmV0LCBuZXQpOwogCW1lbXNldCgmY3QtPl9fbmZjdF9pbml0X29mZnNldFswXSwgMCwKIAkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IG5mX2Nvbm4sIHByb3RvKSAtCkBAIC0xMDM1LDkgKzExMDgsOSBAQAogCWlmIChJU19FUlIoY3QpKQogCQlyZXR1cm4gKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGVfaGFzaCAqKWN0OwogCi0JaWYgKHRtcGwgJiYgbmZjdF9zeW5wcm94eSh0bXBsKSkgewotCQluZmN0X3NlcWFkal9leHRfYWRkKGN0KTsKLQkJbmZjdF9zeW5wcm94eV9leHRfYWRkKGN0KTsKKwlpZiAoIW5mX2N0X2FkZF9zeW5wcm94eShjdCwgdG1wbCkpIHsKKwkJbmZfY29ubnRyYWNrX2ZyZWUoY3QpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKIAl0aW1lb3V0X2V4dCA9IHRtcGwgPyBuZl9jdF90aW1lb3V0X2ZpbmQodG1wbCkgOiBOVUxMOwpAQCAtMTA5NiwxMCArMTE2OSw4IEBACiAJCX0KIAkJc3Bpbl91bmxvY2soJm5mX2Nvbm50cmFja19leHBlY3RfbG9jayk7CiAJfQotCWlmICghZXhwKSB7CisJaWYgKCFleHApCiAJCV9fbmZfY3RfdHJ5X2Fzc2lnbl9oZWxwZXIoY3QsIHRtcGwsIEdGUF9BVE9NSUMpOwotCQlORl9DVF9TVEFUX0lOQyhuZXQsIG5ldyk7Ci0JfQogCiAJLyogTm93IGl0IGlzIGluc2VydGVkIGludG8gdGhlIHVuY29uZmlybWVkIGxpc3QsIGJ1bXAgcmVmY291bnQgKi8KIAluZl9jb25udHJhY2tfZ2V0KCZjdC0+Y3RfZ2VuZXJhbCk7CkBAIC0xMjA0LDcgKzEyNzUsNyBAQAogCQlza2ItPm5mY3QgPSBOVUxMOwogCX0KIAotCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdyAqLworCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoICovCiAJbDNwcm90byA9IF9fbmZfY3RfbDNwcm90b19maW5kKHBmKTsKIAlyZXQgPSBsM3Byb3RvLT5nZXRfbDRwcm90byhza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpLAogCQkJCSAgICZkYXRhb2ZmLCAmcHJvdG9udW0pOwpAQCAtMTMzMiw3ICsxNDAzLDYgQEAKIAkJCSAgdW5zaWduZWQgbG9uZyBleHRyYV9qaWZmaWVzLAogCQkJICBpbnQgZG9fYWNjdCkKIHsKLQlORl9DVF9BU1NFUlQoY3QtPnRpbWVvdXQuZGF0YSA9PSAodW5zaWduZWQgbG9uZyljdCk7CiAJTkZfQ1RfQVNTRVJUKHNrYik7CiAKIAkvKiBPbmx5IHVwZGF0ZSBpZiB0aGlzIGlzIG5vdCBhIGZpeGVkIHRpbWVvdXQgKi8KQEAgLTEzNDAsMzkgKzE0MTAsMjUgQEAKIAkJZ290byBhY2N0OwogCiAJLyogSWYgbm90IGluIGhhc2ggdGFibGUsIHRpbWVyIHdpbGwgbm90IGJlIGFjdGl2ZSB5ZXQgKi8KLQlpZiAoIW5mX2N0X2lzX2NvbmZpcm1lZChjdCkpIHsKLQkJY3QtPnRpbWVvdXQuZXhwaXJlcyA9IGV4dHJhX2ppZmZpZXM7Ci0JfSBlbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBuZXd0aW1lID0gamlmZmllcyArIGV4dHJhX2ppZmZpZXM7CisJaWYgKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkpCisJCWV4dHJhX2ppZmZpZXMgKz0gbmZjdF90aW1lX3N0YW1wOwogCi0JCS8qIE9ubHkgdXBkYXRlIHRoZSB0aW1lb3V0IGlmIHRoZSBuZXcgdGltZW91dCBpcyBhdCBsZWFzdAotCQkgICBIWiBqaWZmaWVzIGZyb20gdGhlIG9sZCB0aW1lb3V0LiBOZWVkIGRlbF90aW1lciBmb3IgcmFjZQotCQkgICBhdm9pZGFuY2UgKG1heSBhbHJlYWR5IGJlIGR5aW5nKS4gKi8KLQkJaWYgKG5ld3RpbWUgLSBjdC0+dGltZW91dC5leHBpcmVzID49IEhaKQotCQkJbW9kX3RpbWVyX3BlbmRpbmcoJmN0LT50aW1lb3V0LCBuZXd0aW1lKTsKLQl9Ci0KKwljdC0+dGltZW91dCA9IGV4dHJhX2ppZmZpZXM7CiBhY2N0OgogCWlmIChkb19hY2N0KQogCQluZl9jdF9hY2N0X3VwZGF0ZShjdCwgY3RpbmZvLCBza2ItPmxlbik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX25mX2N0X3JlZnJlc2hfYWNjdCk7CiAKLWJvb2wgX19uZl9jdF9raWxsX2FjY3Qoc3RydWN0IG5mX2Nvbm4gKmN0LAotCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCi0JCSAgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICAgaW50IGRvX2FjY3QpCitib29sIG5mX2N0X2tpbGxfYWNjdChzdHJ1Y3QgbmZfY29ubiAqY3QsCisJCSAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8sCisJCSAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpZiAoZG9fYWNjdCkKLQkJbmZfY3RfYWNjdF91cGRhdGUoY3QsIGN0aW5mbywgc2tiLT5sZW4pOworCW5mX2N0X2FjY3RfdXBkYXRlKGN0LCBjdGluZm8sIHNrYi0+bGVuKTsKIAotCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkgewotCQljdC0+dGltZW91dC5mdW5jdGlvbigodW5zaWduZWQgbG9uZyljdCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIG5mX2N0X2RlbGV0ZShjdCwgMCwgMCk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChfX25mX2N0X2tpbGxfYWNjdCk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9raWxsX2FjY3QpOwogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ1RfTkVUTElOSykKIApAQCAtMTUwNSwxMSArMTU2MSw4IEBACiAKIAl3aGlsZSAoKGN0ID0gZ2V0X25leHRfY29ycHNlKG5ldCwgaXRlciwgZGF0YSwgJmJ1Y2tldCkpICE9IE5VTEwpIHsKIAkJLyogVGltZSB0byBwdXNoIHVwIGRhaXNlcy4uLiAqLwotCQlpZiAoZGVsX3RpbWVyKCZjdC0+dGltZW91dCkpCi0JCQluZl9jdF9kZWxldGUoY3QsIHBvcnRpZCwgcmVwb3J0KTsKIAotCQkvKiAuLi4gZWxzZSB0aGUgdGltZXIgd2lsbCBnZXQgaGltIHNvb24uICovCi0KKwkJbmZfY3RfZGVsZXRlKGN0LCBwb3J0aWQsIHJlcG9ydCk7CiAJCW5mX2N0X3B1dChjdCk7CiAJCWNvbmRfcmVzY2hlZCgpOwogCX0KQEAgLTE1NDUsNiArMTU5OCw3IEBACiAKIHZvaWQgbmZfY29ubnRyYWNrX2NsZWFudXBfc3RhcnQodm9pZCkKIHsKKwljb25udHJhY2tfZ2Nfd29yay5leGl0aW5nID0gdHJ1ZTsKIAlSQ1VfSU5JVF9QT0lOVEVSKGlwX2N0X2F0dGFjaCwgTlVMTCk7CiB9CiAKQEAgLTE1NTQsNiArMTYwOCw3IEBACiAJd2hpbGUgKHVudHJhY2tfcmVmcygpID4gMCkKIAkJc2NoZWR1bGUoKTsKIAorCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29ubnRyYWNrX2djX3dvcmsuZHdvcmspOwogCW5mX2N0X2ZyZWVfaGFzaHRhYmxlKG5mX2Nvbm50cmFja19oYXNoLCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemUpOwogCiAJbmZfY29ubnRyYWNrX3Byb3RvX2ZpbmkoKTsKQEAgLTE4MjgsNiArMTg4MywxMCBAQAogCX0KIAkvKiAgLSBhbmQgbG9vayBpdCBsaWtlIGFzIGEgY29uZmlybWVkIGNvbm5lY3Rpb24gKi8KIAluZl9jdF91bnRyYWNrZWRfc3RhdHVzX29yKElQU19DT05GSVJNRUQgfCBJUFNfVU5UUkFDS0VEKTsKKworCWNvbm50cmFja19nY193b3JrX2luaXQoJmNvbm50cmFja19nY193b3JrKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvbm50cmFja19nY193b3JrLmR3b3JrLCBHQ19JTlRFUlZBTCk7CisKIAlyZXR1cm4gMDsKIAogZXJyX3Byb3RvOgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYwppbmRleCBkMjgwMTFiLi5kYTlkZjJkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYwpAQCAtNDksOCArNDksMTMgQEAKIAogCWhsaXN0X251bGxzX2Zvcl9lYWNoX2VudHJ5KGgsIG4sICZwY3B1LT5keWluZywgaG5ub2RlKSB7CiAJCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaCk7CisJCXN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplOwogCi0JCWlmIChuZl9jdF9pc19keWluZyhjdCkpCisJCWlmICghbmZfY3RfaXNfY29uZmlybWVkKGN0KSkKKwkJCWNvbnRpbnVlOworCisJCWUgPSBuZl9jdF9lY2FjaGVfZmluZChjdCk7CisJCWlmICghZSB8fCBlLT5zdGF0ZSAhPSBORkNUX0VDQUNIRV9ERVNUUk9ZX0ZBSUwpCiAJCQljb250aW51ZTsKIAogCQlpZiAobmZfY29ubnRyYWNrX2V2ZW50KElQQ1RfREVTVFJPWSwgY3QpKSB7CkBAIC01OCw4ICs2Myw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCS8qIHdlJ3ZlIGdvdCB0aGUgZXZlbnQgZGVsaXZlcmVkLCBub3cgaXQncyBkeWluZyAqLwotCQlzZXRfYml0KElQU19EWUlOR19CSVQsICZjdC0+c3RhdHVzKTsKKwkJZS0+c3RhdGUgPSBORkNUX0VDQUNIRV9ERVNUUk9ZX1NFTlQ7CiAJCXJlZnNbZXZpY3RlZF0gPSBjdDsKIAogCQlpZiAoKytldmljdGVkID49IEFSUkFZX1NJWkUocmVmcykpIHsKQEAgLTEzMCw3ICsxMzQsNyBAQAogCWlmICghZSkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JaWYgKG5mX2N0X2lzX2NvbmZpcm1lZChjdCkgJiYgIW5mX2N0X2lzX2R5aW5nKGN0KSkgeworCWlmIChuZl9jdF9pc19jb25maXJtZWQoY3QpKSB7CiAJCXN0cnVjdCBuZl9jdF9ldmVudCBpdGVtID0gewogCQkJLmN0CT0gY3QsCiAJCQkucG9ydGlkCT0gZS0+cG9ydGlkID8gZS0+cG9ydGlkIDogcG9ydGlkLApAQCAtMTUwLDExICsxNTQsMTMgQEAKIAkJCQkgKiB0cmlnZ2VyZWQgYnkgYSBwcm9jZXNzLCB3ZSBzdG9yZSB0aGUgUE9SVElECiAJCQkJICogdG8gaW5jbHVkZSBpdCBpbiB0aGUgcmV0cmFuc21pc3Npb24uCiAJCQkJICovCi0JCQkJaWYgKGV2ZW50bWFzayAmICgxIDw8IElQQ1RfREVTVFJPWSkgJiYKLQkJCQkgICAgZS0+cG9ydGlkID09IDAgJiYgcG9ydGlkICE9IDApCi0JCQkJCWUtPnBvcnRpZCA9IHBvcnRpZDsKLQkJCQllbHNlCisJCQkJaWYgKGV2ZW50bWFzayAmICgxIDw8IElQQ1RfREVTVFJPWSkpIHsKKwkJCQkJaWYgKGUtPnBvcnRpZCA9PSAwICYmIHBvcnRpZCAhPSAwKQorCQkJCQkJZS0+cG9ydGlkID0gcG9ydGlkOworCQkJCQllLT5zdGF0ZSA9IE5GQ1RfRUNBQ0hFX0RFU1RST1lfRkFJTDsKKwkJCQl9IGVsc2UgewogCQkJCQllLT5taXNzZWQgfD0gZXZlbnRtYXNrOworCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJZS0+bWlzc2VkICY9IH5taXNzZWQ7CiAJCQl9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19mdHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCmluZGV4IDQzMTQ3MDAuLmUzZWQyMDAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jCkBAIC0yMzcsNyArMjM3LDcgQEAKIAl9CiAJZGVsaW0gPSBkYXRhWzBdOwogCWlmIChpc2RpZ2l0KGRlbGltKSB8fCBkZWxpbSA8IDMzIHx8IGRlbGltID4gMTI2IHx8IGRhdGFbMl0gIT0gZGVsaW0pIHsKLQkJcHJfZGVidWcoInRyeV9lcHJ0OiBpbnZhbGlkIGRlbGltaXR0ZXIuXG4iKTsKKwkJcHJfZGVidWcoInRyeV9lcHJ0OiBpbnZhbGlkIGRlbGltaXRlci5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMwMSw4ICszMDEsNiBAQAogCXNpemVfdCBpID0gcGxlbjsKIAogCXByX2RlYnVnKCJmaW5kX3BhdHRlcm4gYCVzJzogZGxlbiA9ICVadVxuIiwgcGF0dGVybiwgZGxlbik7Ci0JaWYgKGRsZW4gPT0gMCkKLQkJcmV0dXJuIDA7CiAKIAlpZiAoZGxlbiA8PSBwbGVuKSB7CiAJCS8qIFNob3J0IHBhY2tldDogdHJ5IGZvciBwYXJ0aWFsPyAqLwpAQCAtMzExLDE5ICszMDksOCBAQAogCQllbHNlIHJldHVybiAwOwogCX0KIAotCWlmIChzdHJuY2FzZWNtcChkYXRhLCBwYXR0ZXJuLCBwbGVuKSAhPSAwKSB7Ci0jaWYgMAotCQlzaXplX3QgaTsKLQotCQlwcl9kZWJ1ZygiZnRwOiBzdHJpbmcgbWlzbWF0Y2hcbiIpOwotCQlmb3IgKGkgPSAwOyBpIDwgcGxlbjsgaSsrKSB7Ci0JCQlwcl9kZWJ1ZygiZnRwOmNoYXIgJXUgYCVjJygldSkgdnMgYCVjJygldSlcbiIsCi0JCQkJIGksIGRhdGFbaV0sIGRhdGFbaV0sCi0JCQkJIHBhdHRlcm5baV0sIHBhdHRlcm5baV0pOwotCQl9Ci0jZW5kaWYKKwlpZiAoc3RybmNhc2VjbXAoZGF0YSwgcGF0dGVybiwgcGxlbikgIT0gMCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcHJfZGVidWcoIlBhdHRlcm4gbWF0Y2hlcyFcbiIpOwogCS8qIE5vdyB3ZSd2ZSBmb3VuZCB0aGUgY29uc3RhbnQgc3RyaW5nLCB0cnkgdG8gc2tpcApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oMzIzX21haW4uYwppbmRleCA1YzBkYjVjLi5mNjVkOTM2MyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKQEAgLTczNiw3ICs3MzYsNyBAQAogCWNvbnN0IHN0cnVjdCBuZl9hZmluZm8gKmFmaW5mbzsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdygpICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAlhZmluZm8gPSBuZl9nZXRfYWZpbmZvKGZhbWlseSk7CiAJaWYgKCFhZmluZm8pCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuYwppbmRleCBiOTg5YjgxLi4zMzZlMjE1IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19oZWxwZXIuYwpAQCAtMTg5LDcgKzE4OSw2IEBACiAJc3RydWN0IG5mX2Nvbm50cmFja19oZWxwZXIgKmhlbHBlciA9IE5VTEw7CiAJc3RydWN0IG5mX2Nvbm5faGVscCAqaGVscDsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwotCWludCByZXQgPSAwOwogCiAJLyogV2UgYWxyZWFkeSBnb3QgYSBoZWxwZXIgZXhwbGljaXRseSBhdHRhY2hlZC4gVGhlIGZ1bmN0aW9uCiAJICogbmZfY29ubnRyYWNrX2FsdGVyX3JlcGx5IC0gaW4gY2FzZSBOQVQgaXMgaW4gdXNlIC0gYXNrcyBmb3IgbG9va2luZwpAQCAtMjIzLDE1ICsyMjIsMTMgQEAKIAlpZiAoaGVscGVyID09IE5VTEwpIHsKIAkJaWYgKGhlbHApCiAJCQlSQ1VfSU5JVF9QT0lOVEVSKGhlbHAtPmhlbHBlciwgTlVMTCk7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoaGVscCA9PSBOVUxMKSB7CiAJCWhlbHAgPSBuZl9jdF9oZWxwZXJfZXh0X2FkZChjdCwgaGVscGVyLCBmbGFncyk7Ci0JCWlmIChoZWxwID09IE5VTEwpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlpZiAoaGVscCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CiAJfSBlbHNlIHsKIAkJLyogV2Ugb25seSBhbGxvdyBoZWxwZXIgcmUtYXNzaWdubWVudCBvZiB0aGUgc2FtZSBzb3J0IHNpbmNlCiAJCSAqIHdlIGNhbm5vdCByZWFsbG9jYXRlIHRoZSBoZWxwZXIgZXh0ZW5zaW9uIGFyZWEuCkBAIC0yNDAsMTMgKzIzNywxMyBAQAogCiAJCWlmICh0bXAgJiYgdG1wLT5oZWxwICE9IGhlbHBlci0+aGVscCkgewogCQkJUkNVX0lOSVRfUE9JTlRFUihoZWxwLT5oZWxwZXIsIE5VTEwpOwotCQkJZ290byBvdXQ7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAogCXJjdV9hc3NpZ25fcG9pbnRlcihoZWxwLT5oZWxwZXIsIGhlbHBlcik7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19uZl9jdF90cnlfYXNzaWduX2hlbHBlcik7CiAKQEAgLTM0OSw3ICszNDYsNyBAQAogCS8qIENhbGxlZCBmcm9tIHRoZSBoZWxwZXIgZnVuY3Rpb24sIHRoaXMgY2FsbCBuZXZlciBmYWlscyAqLwogCWhlbHAgPSBuZmN0X2hlbHAoY3QpOwogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAloZWxwZXIgPSByY3VfZGVyZWZlcmVuY2UoaGVscC0+aGVscGVyKTsKIAogCW5mX2xvZ19wYWNrZXQobmZfY3RfbmV0KGN0KSwgbmZfY3RfbDNudW0oY3QpLCAwLCBza2IsIE5VTEwsIE5VTEwsIE5VTEwsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKaW5kZXggZmRmYzcxZi4uMjc1NDA0NSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYwpAQCAtMTQ5LDEwICsxNDksNyBAQAogCiBzdGF0aWMgaW50IGN0bmV0bGlua19kdW1wX3RpbWVvdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQogewotCWxvbmcgdGltZW91dCA9ICgobG9uZyljdC0+dGltZW91dC5leHBpcmVzIC0gKGxvbmcpamlmZmllcykgLyBIWjsKLQotCWlmICh0aW1lb3V0IDwgMCkKLQkJdGltZW91dCA9IDA7CisJbG9uZyB0aW1lb3V0ID0gbmZfY3RfZXhwaXJlcyhjdCkgLyBIWjsKIAogCWlmIChubGFfcHV0X2JlMzIoc2tiLCBDVEFfVElNRU9VVCwgaHRvbmwodGltZW91dCkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKQEAgLTgxOCwxNCArODE1LDIzIEBACiAJc3RydWN0IGhsaXN0X251bGxzX25vZGUgKm47CiAJc3RydWN0IG5mZ2VubXNnICpuZm1zZyA9IG5sbXNnX2RhdGEoY2ItPm5saCk7CiAJdV9pbnQ4X3QgbDNwcm90byA9IG5mbXNnLT5uZmdlbl9mYW1pbHk7Ci0JaW50IHJlczsKKwlzdHJ1Y3QgbmZfY29ubiAqbmZfY3RfZXZpY3RbOF07CisJaW50IHJlcywgaTsKIAlzcGlubG9ja190ICpsb2NrcDsKIAogCWxhc3QgPSAoc3RydWN0IG5mX2Nvbm4gKiljYi0+YXJnc1sxXTsKKwlpID0gMDsKIAogCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAlmb3IgKDsgY2ItPmFyZ3NbMF0gPCBuZl9jb25udHJhY2tfaHRhYmxlX3NpemU7IGNiLT5hcmdzWzBdKyspIHsKIHJlc3RhcnQ6CisJCXdoaWxlIChpKSB7CisJCQlpLS07CisJCQlpZiAobmZfY3Rfc2hvdWxkX2djKG5mX2N0X2V2aWN0W2ldKSkKKwkJCQluZl9jdF9raWxsKG5mX2N0X2V2aWN0W2ldKTsKKwkJCW5mX2N0X3B1dChuZl9jdF9ldmljdFtpXSk7CisJCX0KKwogCQlsb2NrcCA9ICZuZl9jb25udHJhY2tfbG9ja3NbY2ItPmFyZ3NbMF0gJSBDT05OVFJBQ0tfTE9DS1NdOwogCQluZl9jb25udHJhY2tfbG9jayhsb2NrcCk7CiAJCWlmIChjYi0+YXJnc1swXSA+PSBuZl9jb25udHJhY2tfaHRhYmxlX3NpemUpIHsKQEAgLTgzNyw2ICs4NDMsMTMgQEAKIAkJCWlmIChORl9DVF9ESVJFQ1RJT04oaCkgIT0gSVBfQ1RfRElSX09SSUdJTkFMKQogCQkJCWNvbnRpbnVlOwogCQkJY3QgPSBuZl9jdF90dXBsZWhhc2hfdG9fY3RyYWNrKGgpOworCQkJaWYgKG5mX2N0X2lzX2V4cGlyZWQoY3QpKSB7CisJCQkJaWYgKGkgPCBBUlJBWV9TSVpFKG5mX2N0X2V2aWN0KSAmJgorCQkJCSAgICBhdG9taWNfaW5jX25vdF96ZXJvKCZjdC0+Y3RfZ2VuZXJhbC51c2UpKQorCQkJCQluZl9jdF9ldmljdFtpKytdID0gY3Q7CisJCQkJY29udGludWU7CisJCQl9CisKIAkJCWlmICghbmV0X2VxKG5ldCwgbmZfY3RfbmV0KGN0KSkpCiAJCQkJY29udGludWU7CiAKQEAgLTg3OCw2ICs4OTEsMTMgQEAKIAlpZiAobGFzdCkKIAkJbmZfY3RfcHV0KGxhc3QpOwogCisJd2hpbGUgKGkpIHsKKwkJaS0tOworCQlpZiAobmZfY3Rfc2hvdWxkX2djKG5mX2N0X2V2aWN0W2ldKSkKKwkJCW5mX2N0X2tpbGwobmZfY3RfZXZpY3RbaV0pOworCQluZl9jdF9wdXQobmZfY3RfZXZpY3RbaV0pOworCX0KKwogCXJldHVybiBza2ItPmxlbjsKIH0KIApAQCAtMTE0Nyw5ICsxMTY3LDcgQEAKIAkJfQogCX0KIAotCWlmIChkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkKLQkJbmZfY3RfZGVsZXRlKGN0LCBORVRMSU5LX0NCKHNrYikucG9ydGlkLCBubG1zZ19yZXBvcnQobmxoKSk7Ci0KKwluZl9jdF9kZWxldGUoY3QsIE5FVExJTktfQ0Ioc2tiKS5wb3J0aWQsIG5sbXNnX3JlcG9ydChubGgpKTsKIAluZl9jdF9wdXQoY3QpOwogCiAJcmV0dXJuIDA7CkBAIC0xNTE3LDExICsxNTM1LDEwIEBACiB7CiAJdV9pbnQzMl90IHRpbWVvdXQgPSBudG9obChubGFfZ2V0X2JlMzIoY2RhW0NUQV9USU1FT1VUXSkpOwogCi0JaWYgKCFkZWxfdGltZXIoJmN0LT50aW1lb3V0KSkKLQkJcmV0dXJuIC1FVElNRTsKKwljdC0+dGltZW91dCA9IG5mY3RfdGltZV9zdGFtcCArIHRpbWVvdXQgKiBIWjsKIAotCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dCAqIEhaOwotCWFkZF90aW1lcigmY3QtPnRpbWVvdXQpOworCWlmICh0ZXN0X2JpdChJUFNfRFlJTkdfQklULCAmY3QtPnN0YXR1cykpCisJCXJldHVybiAtRVRJTUU7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3MTksOSArMTczNiw4IEBACiAKIAlpZiAoIWNkYVtDVEFfVElNRU9VVF0pCiAJCWdvdG8gZXJyMTsKLQljdC0+dGltZW91dC5leHBpcmVzID0gbnRvaGwobmxhX2dldF9iZTMyKGNkYVtDVEFfVElNRU9VVF0pKTsKIAotCWN0LT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgY3QtPnRpbWVvdXQuZXhwaXJlcyAqIEhaOworCWN0LT50aW1lb3V0ID0gbmZjdF90aW1lX3N0YW1wICsgbnRvaGwobmxhX2dldF9iZTMyKGNkYVtDVEFfVElNRU9VVF0pKSAqIEhaOwogCiAJcmN1X3JlYWRfbG9jaygpOwogIAlpZiAoY2RhW0NUQV9IRUxQXSkgewpAQCAtMTk2OCwxMyArMTk4NCw5IEBACiAJbmZtc2ctPnZlcnNpb24gICAgICA9IE5GTkVUTElOS19WMDsKIAluZm1zZy0+cmVzX2lkCSAgICA9IGh0b25zKGNwdSk7CiAKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgQ1RBX1NUQVRTX1NFQVJDSEVELCBodG9ubChzdC0+c2VhcmNoZWQpKSB8fAotCSAgICBubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfRk9VTkQsIGh0b25sKHN0LT5mb3VuZCkpIHx8Ci0JICAgIG5sYV9wdXRfYmUzMihza2IsIENUQV9TVEFUU19ORVcsIGh0b25sKHN0LT5uZXcpKSB8fAorCWlmIChubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfRk9VTkQsIGh0b25sKHN0LT5mb3VuZCkpIHx8CiAJICAgIG5sYV9wdXRfYmUzMihza2IsIENUQV9TVEFUU19JTlZBTElELCBodG9ubChzdC0+aW52YWxpZCkpIHx8CiAJICAgIG5sYV9wdXRfYmUzMihza2IsIENUQV9TVEFUU19JR05PUkUsIGh0b25sKHN0LT5pZ25vcmUpKSB8fAotCSAgICBubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfREVMRVRFLCBodG9ubChzdC0+ZGVsZXRlKSkgfHwKLQkgICAgbmxhX3B1dF9iZTMyKHNrYiwgQ1RBX1NUQVRTX0RFTEVURV9MSVNULCBodG9ubChzdC0+ZGVsZXRlX2xpc3QpKSB8fAogCSAgICBubGFfcHV0X2JlMzIoc2tiLCBDVEFfU1RBVFNfSU5TRVJULCBodG9ubChzdC0+aW5zZXJ0KSkgfHwKIAkgICAgbmxhX3B1dF9iZTMyKHNrYiwgQ1RBX1NUQVRTX0lOU0VSVF9GQUlMRUQsCiAJCQkJaHRvbmwoc3QtPmluc2VydF9mYWlsZWQpKSB8fApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHB0cC5jCmluZGV4IDU1ODhjN2EuLmY2MGE0NzUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3BwdHAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcHRwLmMKQEAgLTE1Nyw4ICsxNTcsNyBAQAogCQlwcl9kZWJ1Zygic2V0dGluZyB0aW1lb3V0IG9mIGNvbm50cmFjayAlcCB0byAwXG4iLCBzaWJsaW5nKTsKIAkJc2libGluZy0+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+YWNrX3NlcSA9IG5ld2FjazsKIAogCXJlcyA9IG5mX2N0X3NhY2tfYWRqdXN0KHNrYiwgcHJvdG9mZiwgdGNwaCwgY3QsIGN0aW5mbyk7CitvdXQ6CiAJc3Bpbl91bmxvY2tfYmgoJmN0LT5sb2NrKTsKIAogCXJldHVybiByZXM7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zaXAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCmluZGV4IDdkNzcyMTcuLjYyMWI4MWMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3NpcC5jCkBAIC04Myw5ICs4MywxMCBAQAogc3RhdGljIGludCBpc3dvcmRjKGNvbnN0IGNoYXIgYykKIHsKIAlpZiAoaXNhbG51bShjKSB8fCBjID09ICchJyB8fCBjID09ICciJyB8fCBjID09ICclJyB8fAotCSAgICAoYyA+PSAnKCcgJiYgYyA8PSAnLycpIHx8IGMgPT0gJzonIHx8IGMgPT0gJzwnIHx8IGMgPT0gJz4nIHx8CisJICAgIChjID49ICcoJyAmJiBjIDw9ICcrJykgfHwgYyA9PSAnOicgfHwgYyA9PSAnPCcgfHwgYyA9PSAnPicgfHwKIAkgICAgYyA9PSAnPycgfHwgKGMgPj0gJ1snICYmIGMgPD0gJ10nKSB8fCBjID09ICdfJyB8fCBjID09ICdgJyB8fAotCSAgICBjID09ICd7JyB8fCBjID09ICd9JyB8fCBjID09ICd+JykKKwkgICAgYyA9PSAneycgfHwgYyA9PSAnfScgfHwgYyA9PSAnficgfHwgKGMgPj0gJy0nICYmIGMgPD0gJy8nKSB8fAorCSAgICBjID09ICdcJycpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpAQCAtMzI5LDEzICszMzAsMTIgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpzaXBfc2tpcF93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKmRwdHIsIGNvbnN0IGNoYXIgKmxpbWl0KQogewogCWZvciAoOyBkcHRyIDwgbGltaXQ7IGRwdHIrKykgewotCQlpZiAoKmRwdHIgPT0gJyAnKQorCQlpZiAoKmRwdHIgPT0gJyAnIHx8ICpkcHRyID09ICdcdCcpCiAJCQljb250aW51ZTsKIAkJaWYgKCpkcHRyICE9ICdccicgJiYgKmRwdHIgIT0gJ1xuJykKIAkJCWJyZWFrOwogCQlkcHRyID0gc2lwX2ZvbGxvd19jb250aW51YXRpb24oZHB0ciwgbGltaXQpOwotCQlpZiAoZHB0ciA9PSBOVUxMKQotCQkJcmV0dXJuIE5VTEw7CisJCWJyZWFrOwogCX0KIAlyZXR1cm4gZHB0cjsKIH0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYwppbmRleCA5NThhMTQ1Li41ZjQ0NmNkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCkBAIC0yMDUsMTYgKzIwNSwyNSBAQAogCXN0cnVjdCBuZl9jb25uICpjdCA9IG5mX2N0X3R1cGxlaGFzaF90b19jdHJhY2soaGFzaCk7CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvOwogCWNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfbDRwcm90byAqbDRwcm90bzsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQocyk7CiAJaW50IHJldCA9IDA7CiAKIAlORl9DVF9BU1NFUlQoY3QpOwogCWlmICh1bmxpa2VseSghYXRvbWljX2luY19ub3RfemVybygmY3QtPmN0X2dlbmVyYWwudXNlKSkpCiAJCXJldHVybiAwOwogCisJaWYgKG5mX2N0X3Nob3VsZF9nYyhjdCkpIHsKKwkJbmZfY3Rfa2lsbChjdCk7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKIAkvKiB3ZSBvbmx5IHdhbnQgdG8gcHJpbnQgRElSX09SSUdJTkFMICovCiAJaWYgKE5GX0NUX0RJUkVDVElPTihoYXNoKSkKIAkJZ290byByZWxlYXNlOwogCisJaWYgKCFuZXRfZXEobmZfY3RfbmV0KGN0KSwgbmV0KSkKKwkJZ290byByZWxlYXNlOworCiAJbDNwcm90byA9IF9fbmZfY3RfbDNwcm90b19maW5kKG5mX2N0X2wzbnVtKGN0KSk7CiAJTkZfQ1RfQVNTRVJUKGwzcHJvdG8pOwogCWw0cHJvdG8gPSBfX25mX2N0X2w0cHJvdG9fZmluZChuZl9jdF9sM251bShjdCksIG5mX2N0X3Byb3RvbnVtKGN0KSk7CkBAIC0yMjQsOCArMjMzLDcgQEAKIAlzZXFfcHJpbnRmKHMsICIlLThzICV1ICUtOHMgJXUgJWxkICIsCiAJCSAgIGwzcHJvdG8tPm5hbWUsIG5mX2N0X2wzbnVtKGN0KSwKIAkJICAgbDRwcm90by0+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+aWZpbmRleCkpKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtMTE0Nyw2ICsxMTUxLDcgQEAKIE1PRFVMRV9BTElBU19ORl9MT0dHRVIoQUZfSU5FVCwgMSk7CiBNT0RVTEVfQUxJQVNfTkZfTE9HR0VSKEFGX0lORVQ2LCAxKTsKIE1PRFVMRV9BTElBU19ORl9MT0dHRVIoQUZfQlJJREdFLCAxKTsKK01PRFVMRV9BTElBU19ORl9MT0dHRVIoMywgMSk7IC8qIE5GUFJPVE9fQVJQICovCiAKIG1vZHVsZV9pbml0KG5mbmV0bGlua19sb2dfaW5pdCk7CiBtb2R1bGVfZXhpdChuZm5ldGxpbmtfbG9nX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlLmMKaW5kZXggZjQ5ZjQ1MC4uYWY4MzJjNSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZS5jCkBAIC03NDAsNyArNzQwLDcgQEAKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBlbnRyeS0+c3RhdGUubmV0OwogCXN0cnVjdCBuZm5sX3F1ZXVlX25ldCAqcSA9IG5mbmxfcXVldWVfcGVybmV0KG5ldCk7CiAKLQkvKiByY3VfcmVhZF9sb2NrKCllZCBieSBuZl9ob29rX3Nsb3coKSAqLworCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfdGhyZXNoICovCiAJcXVldWUgPSBpbnN0YW5jZV9sb29rdXAocSwgcXVldWVudW0pOwogCWlmICghcXVldWUpCiAJCXJldHVybiAtRVNSQ0g7CkBAIC05MTcsMTIgKzkxNywxNCBAQAogCS5ub3RpZmllcl9jYWxsCT0gbmZxbmxfcmN2X2Rldl9ldmVudCwKIH07CiAKLXN0YXRpYyBpbnQgbmZfaG9va19jbXAoc3RydWN0IG5mX3F1ZXVlX2VudHJ5ICplbnRyeSwgdW5zaWduZWQgbG9uZyBvcHNfcHRyKQorc3RhdGljIGludCBuZl9ob29rX2NtcChzdHJ1Y3QgbmZfcXVldWVfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBsb25nIGVudHJ5X3B0cikKIHsKLQlyZXR1cm4gZW50cnktPmVsZW0gPT0gKHN0cnVjdCBuZl9ob29rX29wcyAqKW9wc19wdHI7CisJcmV0dXJuIHJjdV9hY2Nlc3NfcG9pbnRlcihlbnRyeS0+c3RhdGUuaG9va19lbnRyaWVzKSA9PQorCQkoc3RydWN0IG5mX2hvb2tfZW50cnkgKillbnRyeV9wdHI7CiB9CiAKLXN0YXRpYyB2b2lkIG5mcW5sX25mX2hvb2tfZHJvcChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9ob29rX29wcyAqaG9vaykKK3N0YXRpYyB2b2lkIG5mcW5sX25mX2hvb2tfZHJvcChzdHJ1Y3QgbmV0ICpuZXQsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfZW50cnkgKmhvb2spCiB7CiAJc3RydWN0IG5mbmxfcXVldWVfbmV0ICpxID0gbmZubF9xdWV1ZV9wZXJuZXQobmV0KTsKIAlpbnQgaTsKQEAgLTE1MjIsOSArMTUyNCwxNiBAQAogCQlnb3RvIGNsZWFudXBfbmV0bGlua19ub3RpZmllcjsKIAl9CiAKLQlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm5mcW5sX2Rldl9ub3RpZmllcik7CisJc3RhdHVzID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZuZnFubF9kZXZfbm90aWZpZXIpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByX2VycigibmZfcXVldWU6IGZhaWxlZCB0byByZWdpc3RlciBuZXRkZXZpY2Ugbm90aWZpZXJcbiIpOworCQlnb3RvIGNsZWFudXBfbmV0bGlua19zdWJzeXM7CisJfQorCiAJcmV0dXJuIHN0YXR1czsKIAorY2xlYW51cF9uZXRsaW5rX3N1YnN5czoKKwluZm5ldGxpbmtfc3Vic3lzX3VucmVnaXN0ZXIoJm5mcW5sX3N1YnN5cyk7CiBjbGVhbnVwX25ldGxpbmtfbm90aWZpZXI6CiAJbmV0bGlua191bnJlZ2lzdGVyX25vdGlmaWVyKCZuZnFubF9ydG5sX25vdGlmaWVyKTsKIAl1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5mbmxfcXVldWVfbmV0X29wcyk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9iaXR3aXNlLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9iaXR3aXNlLmMKaW5kZXggZDcxY2MxOC4uMzFjMTVlZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfYml0d2lzZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2JpdHdpc2UuYwpAQCAtNTIsNiArNTIsNyBAQAogewogCXN0cnVjdCBuZnRfYml0d2lzZSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAJc3RydWN0IG5mdF9kYXRhX2Rlc2MgZDEsIGQyOworCXUzMiBsZW47CiAJaW50IGVycjsKIAogCWlmICh0YltORlRBX0JJVFdJU0VfU1JFR10gPT0gTlVMTCB8fApAQCAtNjEsNyArNjIsMTIgQEAKIAkgICAgdGJbTkZUQV9CSVRXSVNFX1hPUl0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcml2LT5sZW4gID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQklUV0lTRV9MRU5dKSk7CisJZXJyID0gbmZ0X3BhcnNlX3UzMl9jaGVjayh0YltORlRBX0JJVFdJU0VfTEVOXSwgVThfTUFYLCAmbGVuKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXByaXYtPmxlbiA9IGxlbjsKKwogCXByaXYtPnNyZWcgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9CSVRXSVNFX1NSRUddKTsKIAllcnIgPSBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZChwcml2LT5zcmVnLCBwcml2LT5sZW4pOwogCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfYnl0ZW9yZGVyLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9ieXRlb3JkZXIuYwppbmRleCBiNzhjMjhiLi5lZTYzZDk4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9ieXRlb3JkZXIuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9ieXRlb3JkZXIuYwpAQCAtOTksNiArOTksNyBAQAogCQkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7CiAJc3RydWN0IG5mdF9ieXRlb3JkZXIgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCXUzMiBzaXplLCBsZW47CiAJaW50IGVycjsKIAogCWlmICh0YltORlRBX0JZVEVPUkRFUl9TUkVHXSA9PSBOVUxMIHx8CkBAIC0xMTcsNyArMTE4LDEyIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXByaXYtPnNpemUgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9CWVRFT1JERVJfU0laRV0pKTsKKwllcnIgPSBuZnRfcGFyc2VfdTMyX2NoZWNrKHRiW05GVEFfQllURU9SREVSX1NJWkVdLCBVOF9NQVgsICZzaXplKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXByaXYtPnNpemUgPSBzaXplOworCiAJc3dpdGNoIChwcml2LT5zaXplKSB7CiAJY2FzZSAyOgogCWNhc2UgNDoKQEAgLTEyOCw3ICsxMzQsMTIgQEAKIAl9CiAKIAlwcml2LT5zcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfQllURU9SREVSX1NSRUddKTsKLQlwcml2LT5sZW4gID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQllURU9SREVSX0xFTl0pKTsKKwllcnIgPSBuZnRfcGFyc2VfdTMyX2NoZWNrKHRiW05GVEFfQllURU9SREVSX0xFTl0sIFU4X01BWCwgJmxlbik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlwcml2LT5sZW4gPSBsZW47CisKIAllcnIgPSBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZChwcml2LT5zcmVnLCBwcml2LT5sZW4pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfY21wLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9jbXAuYwppbmRleCBlMjViMzVkLi4yZTUzNzM5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9jbXAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9jbXAuYwpAQCAtODQsNiArODQsOSBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJaWYgKGRlc2MubGVuID4gVThfTUFYKQorCQlyZXR1cm4gLUVSQU5HRTsKKwogCXByaXYtPm9wICA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0NNUF9PUF0pKTsKIAlwcml2LT5sZW4gPSBkZXNjLmxlbjsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2N0LmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9jdC5jCmluZGV4IDUxZTE4MGYuLmQ3YjBkMTcxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9jdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2N0LmMKQEAgLTEyOCwxNSArMTI4LDE4IEBACiAJCW1lbWNweShkZXN0LCAmY291bnQsIHNpemVvZihjb3VudCkpOwogCQlyZXR1cm47CiAJfQorCWNhc2UgTkZUX0NUX0wzUFJPVE9DT0w6CisJCSpkZXN0ID0gbmZfY3RfbDNudW0oY3QpOworCQlyZXR1cm47CisJY2FzZSBORlRfQ1RfUFJPVE9DT0w6CisJCSpkZXN0ID0gbmZfY3RfcHJvdG9udW0oY3QpOworCQlyZXR1cm47CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCiAJdHVwbGUgPSAmY3QtPnR1cGxlaGFzaFtwcml2LT5kaXJdLnR1cGxlOwogCXN3aXRjaCAocHJpdi0+a2V5KSB7Ci0JY2FzZSBORlRfQ1RfTDNQUk9UT0NPTDoKLQkJKmRlc3QgPSBuZl9jdF9sM251bShjdCk7Ci0JCXJldHVybjsKIAljYXNlIE5GVF9DVF9TUkM6CiAJCW1lbWNweShkZXN0LCB0dXBsZS0+c3JjLnUzLmFsbCwKIAkJICAgICAgIG5mX2N0X2wzbnVtKGN0KSA9PSBORlBST1RPX0lQVjQgPyA0IDogMTYpOwpAQCAtMTQ1LDkgKzE0OCw2IEBACiAJCW1lbWNweShkZXN0LCB0dXBsZS0+ZHN0LnUzLmFsbCwKIAkJICAgICAgIG5mX2N0X2wzbnVtKGN0KSA9PSBORlBST1RPX0lQVjQgPyA0IDogMTYpOwogCQlyZXR1cm47Ci0JY2FzZSBORlRfQ1RfUFJPVE9DT0w6Ci0JCSpkZXN0ID0gbmZfY3RfcHJvdG9udW0oY3QpOwotCQlyZXR1cm47CiAJY2FzZSBORlRfQ1RfUFJPVE9fU1JDOgogCQkqZGVzdCA9IChfX2ZvcmNlIF9fdTE2KXR1cGxlLT5zcmMudS5hbGw7CiAJCXJldHVybjsKQEAgLTI4Myw4ICsyODMsOSBAQAogCiAJY2FzZSBORlRfQ1RfTDNQUk9UT0NPTDoKIAljYXNlIE5GVF9DVF9QUk9UT0NPTDoKLQkJaWYgKHRiW05GVEFfQ1RfRElSRUNUSU9OXSA9PSBOVUxMKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIEZvciBjb21wYXRpYmlsaXR5LCBkbyBub3QgcmVwb3J0IGVycm9yIGlmIE5GVEFfQ1RfRElSRUNUSU9OCisJCSAqIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQuCisJCSAqLwogCQlsZW4gPSBzaXplb2YodTgpOwogCQlicmVhazsKIAljYXNlIE5GVF9DVF9TUkM6CkBAIC0zNjMsNiArMzY0LDggQEAKIAlzd2l0Y2ggKHByaXYtPmtleSkgewogI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfTUFSSwogCWNhc2UgTkZUX0NUX01BUks6CisJCWlmICh0YltORlRBX0NUX0RJUkVDVElPTl0pCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJbGVuID0gRklFTERfU0laRU9GKHN0cnVjdCBuZl9jb25uLCBtYXJrKTsKIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTQzMiw4ICs0MzUsNiBAQAogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCXN3aXRjaCAocHJpdi0+a2V5KSB7Ci0JY2FzZSBORlRfQ1RfTDNQUk9UT0NPTDoKLQljYXNlIE5GVF9DVF9QUk9UT0NPTDoKIAljYXNlIE5GVF9DVF9TUkM6CiAJY2FzZSBORlRfQ1RfRFNUOgogCWNhc2UgTkZUX0NUX1BST1RPX1NSQzoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2R5bnNldC5jIGIvbmV0L25ldGZpbHRlci9uZnRfZHluc2V0LmMKaW5kZXggMGFmMjY2OS4uZTNiODNjMyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfZHluc2V0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfZHluc2V0LmMKQEAgLTIyLDYgKzIyLDcgQEAKIAllbnVtIG5mdF9keW5zZXRfb3BzCQlvcDo4OwogCWVudW0gbmZ0X3JlZ2lzdGVycwkJc3JlZ19rZXk6ODsKIAllbnVtIG5mdF9yZWdpc3RlcnMJCXNyZWdfZGF0YTo4OworCWJvb2wJCQkJaW52ZXJ0OwogCXU2NAkJCQl0aW1lb3V0OwogCXN0cnVjdCBuZnRfZXhwcgkJCSpleHByOwogCXN0cnVjdCBuZnRfc2V0X2JpbmRpbmcJCWJpbmRpbmc7CkBAIC04MiwxMCArODMsMTQgQEAKIAogCQlpZiAoc2V4cHIgIT0gTlVMTCkKIAkJCXNleHByLT5vcHMtPmV2YWwoc2V4cHIsIHJlZ3MsIHBrdCk7CisKKwkJaWYgKHByaXYtPmludmVydCkKKwkJCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKIAkJcmV0dXJuOwogCX0KIG91dDoKLQlyZWdzLT52ZXJkaWN0LmNvZGUgPSBORlRfQlJFQUs7CisJaWYgKCFwcml2LT5pbnZlcnQpCisJCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9keW5zZXRfcG9saWN5W05GVEFfRFlOU0VUX01BWCArIDFdID0gewpAQCAtOTYsNiArMTAxLDcgQEAKIAlbTkZUQV9EWU5TRVRfU1JFR19EQVRBXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW05GVEFfRFlOU0VUX1RJTUVPVVRdCT0geyAudHlwZSA9IE5MQV9VNjQgfSwKIAlbTkZUQV9EWU5TRVRfRVhQUl0JPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtORlRBX0RZTlNFVF9GTEFHU10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAogc3RhdGljIGludCBuZnRfZHluc2V0X2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKQEAgLTExMyw2ICsxMTksMTUgQEAKIAkgICAgdGJbTkZUQV9EWU5TRVRfU1JFR19LRVldID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKHRiW05GVEFfRFlOU0VUX0ZMQUdTXSkgeworCQl1MzIgZmxhZ3MgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9EWU5TRVRfRkxBR1NdKSk7CisKKwkJaWYgKGZsYWdzICYgfk5GVF9EWU5TRVRfRl9JTlYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZsYWdzICYgTkZUX0RZTlNFVF9GX0lOVikKKwkJCXByaXYtPmludmVydCA9IHRydWU7CisJfQorCiAJc2V0ID0gbmZfdGFibGVzX3NldF9sb29rdXAoY3R4LT50YWJsZSwgdGJbTkZUQV9EWU5TRVRfU0VUX05BTUVdLAogCQkJCSAgIGdlbm1hc2spOwogCWlmIChJU19FUlIoc2V0KSkgewpAQCAtMjIwLDYgKzIzNSw3IEBACiBzdGF0aWMgaW50IG5mdF9keW5zZXRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9keW5zZXQgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCXUzMiBmbGFncyA9IHByaXYtPmludmVydCA/IE5GVF9EWU5TRVRfRl9JTlYgOiAwOwogCiAJaWYgKG5mdF9kdW1wX3JlZ2lzdGVyKHNrYiwgTkZUQV9EWU5TRVRfU1JFR19LRVksIHByaXYtPnNyZWdfa2V5KSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CkBAIC0yMzUsNiArMjUxLDggQEAKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJaWYgKHByaXYtPmV4cHIgJiYgbmZ0X2V4cHJfZHVtcChza2IsIE5GVEFfRFlOU0VUX0VYUFIsIHByaXYtPmV4cHIpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9EWU5TRVRfRkxBR1MsIGh0b25sKGZsYWdzKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCXJldHVybiAwOwogCiBubGFfcHV0X2ZhaWx1cmU6CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9leHRoZHIuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2V4dGhkci5jCmluZGV4IDgyYzI2NGUuLmE4NGNmM2QgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2V4dGhkci5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2V4dGhkci5jCkBAIC01OSw3ICs1OSw3IEBACiAJCQkgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKIAlzdHJ1Y3QgbmZ0X2V4dGhkciAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7Ci0JdTMyIG9mZnNldCwgbGVuOworCXUzMiBvZmZzZXQsIGxlbiwgZXJyOwogCiAJaWYgKHRiW05GVEFfRVhUSERSX0RSRUddID09IE5VTEwgfHwKIAkgICAgdGJbTkZUQV9FWFRIRFJfVFlQRV0gPT0gTlVMTCB8fApAQCAtNjcsMTEgKzY3LDEzIEBACiAJICAgIHRiW05GVEFfRVhUSERSX0xFTl0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlvZmZzZXQgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9FWFRIRFJfT0ZGU0VUXSkpOwotCWxlbiA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0VYVEhEUl9MRU5dKSk7CisJZXJyID0gbmZ0X3BhcnNlX3UzMl9jaGVjayh0YltORlRBX0VYVEhEUl9PRkZTRVRdLCBVOF9NQVgsICZvZmZzZXQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCi0JaWYgKG9mZnNldCA+IFU4X01BWCB8fCBsZW4gPiBVOF9NQVgpCi0JCXJldHVybiAtRVJBTkdFOworCWVyciA9IG5mdF9wYXJzZV91MzJfY2hlY2sodGJbTkZUQV9FWFRIRFJfTEVOXSwgVThfTUFYLCAmbGVuKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAogCXByaXYtPnR5cGUgICA9IG5sYV9nZXRfdTgodGJbTkZUQV9FWFRIRFJfVFlQRV0pOwogCXByaXYtPm9mZnNldCA9IG9mZnNldDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2hhc2guYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2hhc2guYwppbmRleCA1NjRmYTc5Li4wOTQ3M2I0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9oYXNoLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfaGFzaC5jCkBAIC0xLDM5NSArMSwxNDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNCBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKyAqIENvcHlyaWdodCAoYykgMjAxNiBMYXVyYSBHYXJjaWEgPG5ldm9sYUBnbWFpbC5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBEZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgZnVuZGVkIGJ5IEFzdGFybyBBRyAoaHR0cDovL3d3dy5hc3Rhcm8uY29tLykKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9sb2cyLmg+Ci0jaW5jbHVkZSA8bGludXgvamhhc2guaD4KICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmhhc2h0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgotCi0vKiBXZSB0YXJnZXQgYSBoYXNoIHRhYmxlIHNpemUgb2YgNCwgZWxlbWVudCBoaW50IGlzIDc1JSBvZiBmaW5hbCBzaXplICovCi0jZGVmaW5lIE5GVF9IQVNIX0VMRU1FTlRfSElOVCAzCisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CiAKIHN0cnVjdCBuZnRfaGFzaCB7Ci0Jc3RydWN0IHJoYXNodGFibGUJCWh0OwotCXN0cnVjdCBkZWxheWVkX3dvcmsJCWdjX3dvcms7CisJZW51bSBuZnRfcmVnaXN0ZXJzICAgICAgc3JlZzo4OworCWVudW0gbmZ0X3JlZ2lzdGVycyAgICAgIGRyZWc6ODsKKwl1OAkJCWxlbjsKKwl1MzIJCQltb2R1bHVzOworCXUzMgkJCXNlZWQ7CisJdTMyCQkJb2Zmc2V0OwogfTsKIAotc3RydWN0IG5mdF9oYXNoX2VsZW0gewotCXN0cnVjdCByaGFzaF9oZWFkCQlub2RlOwotCXN0cnVjdCBuZnRfc2V0X2V4dAkJZXh0Oworc3RhdGljIHZvaWQgbmZ0X2hhc2hfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgIHN0cnVjdCBuZnRfcmVncyAqcmVncywKKwkJCSAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwljb25zdCB2b2lkICpkYXRhID0gJnJlZ3MtPmRhdGFbcHJpdi0+c3JlZ107CisJdTMyIGg7CisKKwloID0gcmVjaXByb2NhbF9zY2FsZShqaGFzaChkYXRhLCBwcml2LT5sZW4sIHByaXYtPnNlZWQpLCBwcml2LT5tb2R1bHVzKTsKKwlyZWdzLT5kYXRhW3ByaXYtPmRyZWddID0gaCArIHByaXYtPm9mZnNldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9oYXNoX3BvbGljeVtORlRBX0hBU0hfTUFYICsgMV0gPSB7CisJW05GVEFfSEFTSF9TUkVHXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfSEFTSF9EUkVHXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfSEFTSF9MRU5dCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfSEFTSF9NT0RVTFVTXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfSEFTSF9TRUVEXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiB9OwogCi1zdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyB7Ci0JY29uc3Qgc3RydWN0IG5mdF9zZXQJCSpzZXQ7Ci0JY29uc3QgdTMyCQkJKmtleTsKLQl1OAkJCQlnZW5tYXNrOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBuZnRfaGFzaF9wYXJhbXM7Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIG5mdF9oYXNoX2tleShjb25zdCB2b2lkICpkYXRhLCB1MzIgbGVuLCB1MzIgc2VlZCkKLXsKLQljb25zdCBzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyAqYXJnID0gZGF0YTsKLQotCXJldHVybiBqaGFzaChhcmctPmtleSwgbGVuLCBzZWVkKTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgbmZ0X2hhc2hfb2JqKGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBsZW4sIHUzMiBzZWVkKQotewotCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGRhdGE7Ci0KLQlyZXR1cm4gamhhc2gobmZ0X3NldF9leHRfa2V5KCZoZS0+ZXh0KSwgbGVuLCBzZWVkKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbmZ0X2hhc2hfY21wKHN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnICphcmcsCi0JCQkgICAgICAgY29uc3Qgdm9pZCAqcHRyKQotewotCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnICp4ID0gYXJnLT5rZXk7Ci0JY29uc3Qgc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlID0gcHRyOwotCi0JaWYgKG1lbWNtcChuZnRfc2V0X2V4dF9rZXkoJmhlLT5leHQpLCB4LT5rZXksIHgtPnNldC0+a2xlbikpCi0JCXJldHVybiAxOwotCWlmIChuZnRfc2V0X2VsZW1fZXhwaXJlZCgmaGUtPmV4dCkpCi0JCXJldHVybiAxOwotCWlmICghbmZ0X3NldF9lbGVtX2FjdGl2ZSgmaGUtPmV4dCwgeC0+Z2VubWFzaykpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBuZnRfaGFzaF9sb29rdXAoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJICAgIGNvbnN0IHUzMiAqa2V5LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCi17Ci0Jc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0JY29uc3Qgc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOwotCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKLQkJLmdlbm1hc2sgPSBuZnRfZ2VubWFza19jdXIobmV0KSwKLQkJLnNldAkgPSBzZXQsCi0JCS5rZXkJID0ga2V5LAotCX07Ci0KLQloZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJnByaXYtPmh0LCAmYXJnLCBuZnRfaGFzaF9wYXJhbXMpOwotCWlmIChoZSAhPSBOVUxMKQotCQkqZXh0ID0gJmhlLT5leHQ7Ci0KLQlyZXR1cm4gISFoZTsKLX0KLQotc3RhdGljIGJvb2wgbmZ0X2hhc2hfdXBkYXRlKHN0cnVjdCBuZnRfc2V0ICpzZXQsIGNvbnN0IHUzMiAqa2V5LAotCQkJICAgIHZvaWQgKigqbmV3KShzdHJ1Y3QgbmZ0X3NldCAqLAotCQkJCQkgY29uc3Qgc3RydWN0IG5mdF9leHByICosCi0JCQkJCSBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MpLAotCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKLQkJCSAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCi0JCQkgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQotewotCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKLQlzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyBhcmcgPSB7Ci0JCS5nZW5tYXNrID0gTkZUX0dFTk1BU0tfQU5ZLAotCQkuc2V0CSA9IHNldCwKLQkJLmtleQkgPSBrZXksCi0JfTsKLQotCWhlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmcHJpdi0+aHQsICZhcmcsIG5mdF9oYXNoX3BhcmFtcyk7Ci0JaWYgKGhlICE9IE5VTEwpCi0JCWdvdG8gb3V0OwotCi0JaGUgPSBuZXcoc2V0LCBleHByLCByZWdzKTsKLQlpZiAoaGUgPT0gTlVMTCkKLQkJZ290byBlcnIxOwotCWlmIChyaGFzaHRhYmxlX2xvb2t1cF9pbnNlcnRfa2V5KCZwcml2LT5odCwgJmFyZywgJmhlLT5ub2RlLAotCQkJCQkgbmZ0X2hhc2hfcGFyYW1zKSkKLQkJZ290byBlcnIyOwotb3V0OgotCSpleHQgPSAmaGUtPmV4dDsKLQlyZXR1cm4gdHJ1ZTsKLQotZXJyMjoKLQluZnRfc2V0X2VsZW1fZGVzdHJveShzZXQsIGhlKTsKLWVycjE6Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IG5mdF9oYXNoX2luc2VydChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGVsZW0tPnByaXY7Ci0Jc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgYXJnID0gewotCQkuZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KSwKLQkJLnNldAkgPSBzZXQsCi0JCS5rZXkJID0gZWxlbS0+a2V5LnZhbC5kYXRhLAotCX07Ci0KLQlyZXR1cm4gcmhhc2h0YWJsZV9sb29rdXBfaW5zZXJ0X2tleSgmcHJpdi0+aHQsICZhcmcsICZoZS0+bm9kZSwKLQkJCQkJICAgIG5mdF9oYXNoX3BhcmFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5mdF9oYXNoX2FjdGl2YXRlKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCi17Ci0Jc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlID0gZWxlbS0+cHJpdjsKLQotCW5mdF9zZXRfZWxlbV9jaGFuZ2VfYWN0aXZlKG5ldCwgc2V0LCAmaGUtPmV4dCk7Ci0JbmZ0X3NldF9lbGVtX2NsZWFyX2J1c3koJmhlLT5leHQpOwotfQotCi1zdGF0aWMgdm9pZCAqbmZ0X2hhc2hfZGVhY3RpdmF0ZShjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkJIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCi17Ci0Jc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0Jc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOwotCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKLQkJLmdlbm1hc2sgPSBuZnRfZ2VubWFza19uZXh0KG5ldCksCi0JCS5zZXQJID0gc2V0LAotCQkua2V5CSA9IGVsZW0tPmtleS52YWwuZGF0YSwKLQl9OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWhlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmcHJpdi0+aHQsICZhcmcsIG5mdF9oYXNoX3BhcmFtcyk7Ci0JaWYgKGhlICE9IE5VTEwpIHsKLQkJaWYgKCFuZnRfc2V0X2VsZW1fbWFya19idXN5KCZoZS0+ZXh0KSB8fAotCQkgICAgIW5mdF9pc19hY3RpdmUobmV0LCAmaGUtPmV4dCkpCi0JCQluZnRfc2V0X2VsZW1fY2hhbmdlX2FjdGl2ZShuZXQsIHNldCwgJmhlLT5leHQpOwotCQllbHNlCi0JCQloZSA9IE5VTEw7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIGhlOwotfQotCi1zdGF0aWMgdm9pZCBuZnRfaGFzaF9yZW1vdmUoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGVsZW0tPnByaXY7Ci0KLQlyaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCZwcml2LT5odCwgJmhlLT5ub2RlLCBuZnRfaGFzaF9wYXJhbXMpOwotfQotCi1zdGF0aWMgdm9pZCBuZnRfaGFzaF93YWxrKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgIHN0cnVjdCBuZnRfc2V0X2l0ZXIgKml0ZXIpCi17Ci0Jc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0Jc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOwotCXN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgaHRpOwotCXN0cnVjdCBuZnRfc2V0X2VsZW0gZWxlbTsKLQlpbnQgZXJyOwotCi0JZXJyID0gcmhhc2h0YWJsZV93YWxrX2luaXQoJnByaXYtPmh0LCAmaHRpLCBHRlBfS0VSTkVMKTsKLQlpdGVyLT5lcnIgPSBlcnI7Ci0JaWYgKGVycikKLQkJcmV0dXJuOwotCi0JZXJyID0gcmhhc2h0YWJsZV93YWxrX3N0YXJ0KCZodGkpOwotCWlmIChlcnIgJiYgZXJyICE9IC1FQUdBSU4pIHsKLQkJaXRlci0+ZXJyID0gZXJyOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl3aGlsZSAoKGhlID0gcmhhc2h0YWJsZV93YWxrX25leHQoJmh0aSkpKSB7Ci0JCWlmIChJU19FUlIoaGUpKSB7Ci0JCQllcnIgPSBQVFJfRVJSKGhlKTsKLQkJCWlmIChlcnIgIT0gLUVBR0FJTikgewotCQkJCWl0ZXItPmVyciA9IGVycjsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoaXRlci0+Y291bnQgPCBpdGVyLT5za2lwKQotCQkJZ290byBjb250OwotCQlpZiAobmZ0X3NldF9lbGVtX2V4cGlyZWQoJmhlLT5leHQpKQotCQkJZ290byBjb250OwotCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJmhlLT5leHQsIGl0ZXItPmdlbm1hc2spKQotCQkJZ290byBjb250OwotCi0JCWVsZW0ucHJpdiA9IGhlOwotCi0JCWl0ZXItPmVyciA9IGl0ZXItPmZuKGN0eCwgc2V0LCBpdGVyLCAmZWxlbSk7Ci0JCWlmIChpdGVyLT5lcnIgPCAwKQotCQkJZ290byBvdXQ7Ci0KLWNvbnQ6Ci0JCWl0ZXItPmNvdW50Kys7Ci0JfQotCi1vdXQ6Ci0Jcmhhc2h0YWJsZV93YWxrX3N0b3AoJmh0aSk7Ci0Jcmhhc2h0YWJsZV93YWxrX2V4aXQoJmh0aSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5mdF9oYXNoX2djKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgbmZ0X3NldCAqc2V0OwotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKLQlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXY7Ci0Jc3RydWN0IG5mdF9zZXRfZ2NfYmF0Y2ggKmdjYiA9IE5VTEw7Ci0Jc3RydWN0IHJoYXNodGFibGVfaXRlciBodGk7Ci0JaW50IGVycjsKLQotCXByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5mdF9oYXNoLCBnY193b3JrLndvcmspOwotCXNldCAgPSBuZnRfc2V0X2NvbnRhaW5lcl9vZihwcml2KTsKLQotCWVyciA9IHJoYXNodGFibGVfd2Fsa19pbml0KCZwcml2LT5odCwgJmh0aSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGVycikKLQkJZ290byBzY2hlZHVsZTsKLQotCWVyciA9IHJoYXNodGFibGVfd2Fsa19zdGFydCgmaHRpKTsKLQlpZiAoZXJyICYmIGVyciAhPSAtRUFHQUlOKQotCQlnb3RvIG91dDsKLQotCXdoaWxlICgoaGUgPSByaGFzaHRhYmxlX3dhbGtfbmV4dCgmaHRpKSkpIHsKLQkJaWYgKElTX0VSUihoZSkpIHsKLQkJCWlmIChQVFJfRVJSKGhlKSAhPSAtRUFHQUlOKQotCQkJCWdvdG8gb3V0OwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIW5mdF9zZXRfZWxlbV9leHBpcmVkKCZoZS0+ZXh0KSkKLQkJCWNvbnRpbnVlOwotCQlpZiAobmZ0X3NldF9lbGVtX21hcmtfYnVzeSgmaGUtPmV4dCkpCi0JCQljb250aW51ZTsKLQotCQlnY2IgPSBuZnRfc2V0X2djX2JhdGNoX2NoZWNrKHNldCwgZ2NiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKGdjYiA9PSBOVUxMKQotCQkJZ290byBvdXQ7Ci0JCXJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJnByaXYtPmh0LCAmaGUtPm5vZGUsIG5mdF9oYXNoX3BhcmFtcyk7Ci0JCWF0b21pY19kZWMoJnNldC0+bmVsZW1zKTsKLQkJbmZ0X3NldF9nY19iYXRjaF9hZGQoZ2NiLCBoZSk7Ci0JfQotb3V0OgotCXJoYXNodGFibGVfd2Fsa19zdG9wKCZodGkpOwotCXJoYXNodGFibGVfd2Fsa19leGl0KCZodGkpOwotCi0JbmZ0X3NldF9nY19iYXRjaF9jb21wbGV0ZShnY2IpOwotc2NoZWR1bGU6Ci0JcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsICZwcml2LT5nY193b3JrLAotCQkJICAgbmZ0X3NldF9nY19pbnRlcnZhbChzZXQpKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBuZnRfaGFzaF9wcml2c2l6ZShjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCi17Ci0JcmV0dXJuIHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2gpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIG5mdF9oYXNoX3BhcmFtcyA9IHsKLQkuaGVhZF9vZmZzZXQJCT0gb2Zmc2V0b2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0sIG5vZGUpLAotCS5oYXNoZm4JCQk9IG5mdF9oYXNoX2tleSwKLQkub2JqX2hhc2hmbgkJPSBuZnRfaGFzaF9vYmosCi0JLm9ial9jbXBmbgkJPSBuZnRfaGFzaF9jbXAsCi0JLmF1dG9tYXRpY19zaHJpbmtpbmcJPSB0cnVlLAotfTsKLQotc3RhdGljIGludCBuZnRfaGFzaF9pbml0KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgY29uc3Qgc3RydWN0IG5mdF9zZXRfZGVzYyAqZGVzYywKK3N0YXRpYyBpbnQgbmZ0X2hhc2hfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKIAkJCSBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKLQlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQlzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zID0gbmZ0X2hhc2hfcGFyYW1zOwotCWludCBlcnI7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1MzIgbGVuOwogCi0JcGFyYW1zLm5lbGVtX2hpbnQgPSBkZXNjLT5zaXplID86IE5GVF9IQVNIX0VMRU1FTlRfSElOVDsKLQlwYXJhbXMua2V5X2xlbgkgID0gc2V0LT5rbGVuOworCWlmICghdGJbTkZUQV9IQVNIX1NSRUddIHx8CisJICAgICF0YltORlRBX0hBU0hfRFJFR10gfHwKKwkgICAgIXRiW05GVEFfSEFTSF9MRU5dICB8fAorCSAgICAhdGJbTkZUQV9IQVNIX1NFRURdIHx8CisJICAgICF0YltORlRBX0hBU0hfTU9EVUxVU10pCisJCXJldHVybiAtRUlOVkFMOwogCi0JZXJyID0gcmhhc2h0YWJsZV9pbml0KCZwcml2LT5odCwgJnBhcmFtcyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7CisJaWYgKHRiW05GVEFfSEFTSF9PRkZTRVRdKQorCQlwcml2LT5vZmZzZXQgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9IQVNIX09GRlNFVF0pKTsKIAotCUlOSVRfREVGRVJSQUJMRV9XT1JLKCZwcml2LT5nY193b3JrLCBuZnRfaGFzaF9nYyk7Ci0JaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX1RJTUVPVVQpCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmcHJpdi0+Z2Nfd29yaywKLQkJCQkgICBuZnRfc2V0X2djX2ludGVydmFsKHNldCkpOworCXByaXYtPnNyZWcgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9IQVNIX1NSRUddKTsKKwlwcml2LT5kcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfSEFTSF9EUkVHXSk7CisKKwlsZW4gPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9IQVNIX0xFTl0pKTsKKwlpZiAobGVuID09IDAgfHwgbGVuID4gVThfTUFYKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCXByaXYtPmxlbiA9IGxlbjsKKworCXByaXYtPm1vZHVsdXMgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9IQVNIX01PRFVMVVNdKSk7CisJaWYgKHByaXYtPm1vZHVsdXMgPD0gMSkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlpZiAocHJpdi0+b2Zmc2V0ICsgcHJpdi0+bW9kdWx1cyAtIDEgPCBwcml2LT5vZmZzZXQpCisJCXJldHVybiAtRU9WRVJGTE9XOworCisJcHJpdi0+c2VlZCA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0hBU0hfU0VFRF0pKTsKKworCXJldHVybiBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZChwcml2LT5zcmVnLCBsZW4pICYmCisJICAgICAgIG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9zdG9yZShjdHgsIHByaXYtPmRyZWcsIE5VTEwsCisJCQkJCSAgIE5GVF9EQVRBX1ZBTFVFLCBzaXplb2YodTMyKSk7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X2hhc2hfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCisJaWYgKG5mdF9kdW1wX3JlZ2lzdGVyKHNrYiwgTkZUQV9IQVNIX1NSRUcsIHByaXYtPnNyZWcpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX0hBU0hfRFJFRywgcHJpdi0+ZHJlZykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX0hBU0hfTEVOLCBodG9ubChwcml2LT5sZW4pKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfSEFTSF9NT0RVTFVTLCBodG9ubChwcml2LT5tb2R1bHVzKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX0hBU0hfU0VFRCwgaHRvbmwocHJpdi0+c2VlZCkpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAocHJpdi0+b2Zmc2V0ICE9IDApCisJCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX0hBU0hfT0ZGU0VULCBodG9ubChwcml2LT5vZmZzZXQpKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgdm9pZCBuZnRfaGFzaF9lbGVtX2Rlc3Ryb3kodm9pZCAqcHRyLCB2b2lkICphcmcpCi17Ci0JbmZ0X3NldF9lbGVtX2Rlc3Ryb3koKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICopYXJnLCBwdHIpOwotfQotCi1zdGF0aWMgdm9pZCBuZnRfaGFzaF9kZXN0cm95KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQpCi17Ci0Jc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPmdjX3dvcmspOwotCXJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveSgmcHJpdi0+aHQsIG5mdF9oYXNoX2VsZW1fZGVzdHJveSwKLQkJCQkgICAgKHZvaWQgKilzZXQpOwotfQotCi1zdGF0aWMgYm9vbCBuZnRfaGFzaF9lc3RpbWF0ZShjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLCB1MzIgZmVhdHVyZXMsCi0JCQkgICAgICBzdHJ1Y3QgbmZ0X3NldF9lc3RpbWF0ZSAqZXN0KQotewotCXVuc2lnbmVkIGludCBlc2l6ZTsKLQotCWVzaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtKTsKLQlpZiAoZGVzYy0+c2l6ZSkgewotCQllc3QtPnNpemUgPSBzaXplb2Yoc3RydWN0IG5mdF9oYXNoKSArCi0JCQkgICAgcm91bmR1cF9wb3dfb2ZfdHdvKGRlc2MtPnNpemUgKiA0IC8gMykgKgotCQkJICAgIHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqKSArCi0JCQkgICAgZGVzYy0+c2l6ZSAqIGVzaXplOwotCX0gZWxzZSB7Ci0JCS8qIFJlc2l6aW5nIGhhcHBlbnMgd2hlbiB0aGUgbG9hZCBkcm9wcyBiZWxvdyAzMCUgb3IgZ29lcwotCQkgKiBhYm92ZSA3NSUuIFRoZSBhdmVyYWdlIG9mIDUyLjUlIGxvYWQgKGFwcHJveGltYXRlZCBieSA1MCUpCi0JCSAqIGlzIHVzZWQgZm9yIHRoZSBzaXplIGVzdGltYXRpb24gb2YgdGhlIGhhc2ggYnVja2V0cywKLQkJICogbWVhbmluZyB3ZSBjYWxjdWxhdGUgdHdvIGJ1Y2tldHMgcGVyIGVsZW1lbnQuCi0JCSAqLwotCQllc3QtPnNpemUgPSBlc2l6ZSArIDIgKiBzaXplb2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0gKik7Ci0JfQotCi0JZXN0LT5jbGFzcyA9IE5GVF9TRVRfQ0xBU1NfT18xOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmZ0X3NldF9vcHMgbmZ0X2hhc2hfb3BzIF9fcmVhZF9tb3N0bHkgPSB7Ci0JLnByaXZzaXplICAgICAgID0gbmZ0X2hhc2hfcHJpdnNpemUsCi0JLmVsZW1zaXplCT0gb2Zmc2V0b2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0sIGV4dCksCi0JLmVzdGltYXRlCT0gbmZ0X2hhc2hfZXN0aW1hdGUsCitzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X2hhc2hfdHlwZTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzIG5mdF9oYXNoX29wcyA9IHsKKwkudHlwZQkJPSAmbmZ0X2hhc2hfdHlwZSwKKwkuc2l6ZQkJPSBORlRfRVhQUl9TSVpFKHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2gpKSwKKwkuZXZhbAkJPSBuZnRfaGFzaF9ldmFsLAogCS5pbml0CQk9IG5mdF9oYXNoX2luaXQsCi0JLmRlc3Ryb3kJPSBuZnRfaGFzaF9kZXN0cm95LAotCS5pbnNlcnQJCT0gbmZ0X2hhc2hfaW5zZXJ0LAotCS5hY3RpdmF0ZQk9IG5mdF9oYXNoX2FjdGl2YXRlLAotCS5kZWFjdGl2YXRlCT0gbmZ0X2hhc2hfZGVhY3RpdmF0ZSwKLQkucmVtb3ZlCQk9IG5mdF9oYXNoX3JlbW92ZSwKLQkubG9va3VwCQk9IG5mdF9oYXNoX2xvb2t1cCwKLQkudXBkYXRlCQk9IG5mdF9oYXNoX3VwZGF0ZSwKLQkud2FsawkJPSBuZnRfaGFzaF93YWxrLAotCS5mZWF0dXJlcwk9IE5GVF9TRVRfTUFQIHwgTkZUX1NFVF9USU1FT1VULAorCS5kdW1wCQk9IG5mdF9oYXNoX2R1bXAsCit9OworCitzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X2hhc2hfdHlwZSBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJoYXNoIiwKKwkub3BzCQk9ICZuZnRfaGFzaF9vcHMsCisJLnBvbGljeQkJPSBuZnRfaGFzaF9wb2xpY3ksCisJLm1heGF0dHIJPSBORlRBX0hBU0hfTUFYLAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG5mdF9oYXNoX21vZHVsZV9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIG5mdF9yZWdpc3Rlcl9zZXQoJm5mdF9oYXNoX29wcyk7CisJcmV0dXJuIG5mdF9yZWdpc3Rlcl9leHByKCZuZnRfaGFzaF90eXBlKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IG5mdF9oYXNoX21vZHVsZV9leGl0KHZvaWQpCiB7Ci0JbmZ0X3VucmVnaXN0ZXJfc2V0KCZuZnRfaGFzaF9vcHMpOworCW5mdF91bnJlZ2lzdGVyX2V4cHIoJm5mdF9oYXNoX3R5cGUpOwogfQogCiBtb2R1bGVfaW5pdChuZnRfaGFzaF9tb2R1bGVfaW5pdCk7CiBtb2R1bGVfZXhpdChuZnRfaGFzaF9tb2R1bGVfZXhpdCk7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOwotTU9EVUxFX0FMSUFTX05GVF9TRVQoKTsKK01PRFVMRV9BVVRIT1IoIkxhdXJhIEdhcmNpYSA8bmV2b2xhQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9BTElBU19ORlRfRVhQUigiaGFzaCIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfaW1tZWRpYXRlLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9pbW1lZGlhdGUuYwppbmRleCBkYjNiNzQ2Li5kMTcwMThmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9pbW1lZGlhdGUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9pbW1lZGlhdGUuYwpAQCAtNTMsNiArNTMsMTAgQEAKIAkJCSAgICB0YltORlRBX0lNTUVESUFURV9EQVRBXSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CisKKwlpZiAoZGVzYy5sZW4gPiBVOF9NQVgpCisJCXJldHVybiAtRVJBTkdFOworCiAJcHJpdi0+ZGxlbiA9IGRlc2MubGVuOwogCiAJcHJpdi0+ZHJlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX0lNTUVESUFURV9EUkVHXSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9saW1pdC5jIGIvbmV0L25ldGZpbHRlci9uZnRfbGltaXQuYwppbmRleCAwNzBiOTg5Li5jNmJhZjQxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9saW1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2xpbWl0LmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JcHJpdi0+Y29zdCA9IGRpdl91NjQocHJpdi0+bGltaXQubnNlY3MsIHByaXYtPmxpbWl0LnJhdGUpOworCXByaXYtPmNvc3QgPSBkaXY2NF91NjQocHJpdi0+bGltaXQubnNlY3MsIHByaXYtPmxpbWl0LnJhdGUpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzAsNyArMTcwLDcgQEAKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCXN0cnVjdCBuZnRfbGltaXQgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwotCXU2NCBjb3N0ID0gZGl2X3U2NChwcml2LT5uc2VjcyAqIHBrdC0+c2tiLT5sZW4sIHByaXYtPnJhdGUpOworCXU2NCBjb3N0ID0gZGl2NjRfdTY0KHByaXYtPm5zZWNzICogcGt0LT5za2ItPmxlbiwgcHJpdi0+cmF0ZSk7CiAKIAlpZiAobmZ0X2xpbWl0X2V2YWwocHJpdiwgY29zdCkpCiAJCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2xvZy5jIGIvbmV0L25ldGZpbHRlci9uZnRfbG9nLmMKaW5kZXggMjRhNzNiYi4uMWIwMTQwNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfbG9nLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfbG9nLmMKQEAgLTU4LDggKzU4LDExIEBACiAJaWYgKHRiW05GVEFfTE9HX0xFVkVMXSAhPSBOVUxMICYmCiAJICAgIHRiW05GVEFfTE9HX0dST1VQXSAhPSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAodGJbTkZUQV9MT0dfR1JPVVBdICE9IE5VTEwpCisJaWYgKHRiW05GVEFfTE9HX0dST1VQXSAhPSBOVUxMKSB7CiAJCWxpLT50eXBlID0gTkZfTE9HX1RZUEVfVUxPRzsKKwkJaWYgKHRiW05GVEFfTE9HX0ZMQUdTXSAhPSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJbmxhID0gdGJbTkZUQV9MT0dfUFJFRklYXTsKIAlpZiAobmxhICE9IE5VTEwpIHsKQEAgLTg3LDYgKzkwLDEwIEBACiAJCWlmICh0YltORlRBX0xPR19GTEFHU10gIT0gTlVMTCkgewogCQkJbGktPnUubG9nLmxvZ2ZsYWdzID0KIAkJCQludG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9MT0dfRkxBR1NdKSk7CisJCQlpZiAobGktPnUubG9nLmxvZ2ZsYWdzICYgfk5GX0xPR19NQVNLKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycjE7CisJCQl9CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBORl9MT0dfVFlQRV9VTE9HOgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9sb29rdXAuYwppbmRleCBlMTY0MzI1Li44MTY2YjY5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9sb29rdXAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9sb29rdXAuYwpAQCAtNDMsNyArNDMsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGZvdW5kICYmIHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCkKKwlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQKQogCQluZnRfZGF0YV9jb3B5KCZyZWdzLT5kYXRhW3ByaXYtPmRyZWddLAogCQkJICAgICAgbmZ0X3NldF9leHRfZGF0YShleHQpLCBzZXQtPmRsZW4pOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmMKaW5kZXggMjg2M2YzNC4uNmMxZTAyNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X21ldGEuYwpAQCAtNTIsNiArNTIsOCBAQAogCQkqZGVzdCA9IHBrdC0+cGY7CiAJCWJyZWFrOwogCWNhc2UgTkZUX01FVEFfTDRQUk9UTzoKKwkJaWYgKCFwa3QtPnRwcm90X3NldCkKKwkJCWdvdG8gZXJyOwogCQkqZGVzdCA9IHBrdC0+dHByb3Q7CiAJCWJyZWFrOwogCWNhc2UgTkZUX01FVEFfUFJJT1JJVFk6CkBAIC0yOTEsMTAgKzI5MywxNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZ0X21ldGFfZ2V0X2luaXQpOwogCi1zdGF0aWMgaW50IG5mdF9tZXRhX3NldF9pbml0X3BrdHR5cGUoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCkKK2ludCBuZnRfbWV0YV9zZXRfdmFsaWRhdGUoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCSAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X2RhdGEgKipkYXRhKQogeworCXN0cnVjdCBuZnRfbWV0YSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAJdW5zaWduZWQgaW50IGhvb2tzOwogCisJaWYgKHByaXYtPmtleSAhPSBORlRfTUVUQV9QS1RUWVBFKQorCQlyZXR1cm4gMDsKKwogCXN3aXRjaCAoY3R4LT5hZmktPmZhbWlseSkgewogCWNhc2UgTkZQUk9UT19CUklER0U6CiAJCWhvb2tzID0gMSA8PCBORl9CUl9QUkVfUk9VVElORzsKQEAgLTMwOCw2ICszMTYsNyBAQAogCiAJcmV0dXJuIG5mdF9jaGFpbl92YWxpZGF0ZV9ob29rcyhjdHgtPmNoYWluLCBob29rcyk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChuZnRfbWV0YV9zZXRfdmFsaWRhdGUpOwogCiBpbnQgbmZ0X21ldGFfc2V0X2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKIAkJICAgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLApAQCAtMzI3LDE1ICszMzYsMTYgQEAKIAkJbGVuID0gc2l6ZW9mKHU4KTsKIAkJYnJlYWs7CiAJY2FzZSBORlRfTUVUQV9QS1RUWVBFOgotCQllcnIgPSBuZnRfbWV0YV9zZXRfaW5pdF9wa3R0eXBlKGN0eCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwogCQlsZW4gPSBzaXplb2YodTgpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCisJZXJyID0gbmZ0X21ldGFfc2V0X3ZhbGlkYXRlKGN0eCwgZXhwciwgTlVMTCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKIAlwcml2LT5zcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfTUVUQV9TUkVHXSk7CiAJZXJyID0gbmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX2xvYWQocHJpdi0+c3JlZywgbGVuKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTQwNyw2ICs0MTcsNyBAQAogCS5pbml0CQk9IG5mdF9tZXRhX3NldF9pbml0LAogCS5kZXN0cm95CT0gbmZ0X21ldGFfc2V0X2Rlc3Ryb3ksCiAJLmR1bXAJCT0gbmZ0X21ldGFfc2V0X2R1bXAsCisJLnZhbGlkYXRlCT0gbmZ0X21ldGFfc2V0X3ZhbGlkYXRlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgKgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfbnVtZ2VuLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9udW1nZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWJjNWFiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfbnVtZ2VuLmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTGF1cmEgR2FyY2lhIDxuZXZvbGFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0aWNfa2V5Lmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19jb3JlLmg+CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgcm5kX3N0YXRlLCBuZnRfbnVtZ2VuX3ByYW5kb21fc3RhdGUpOworCitzdHJ1Y3QgbmZ0X25nX2luYyB7CisJZW51bSBuZnRfcmVnaXN0ZXJzICAgICAgZHJlZzo4OworCXUzMgkJCW1vZHVsdXM7CisJYXRvbWljX3QJCWNvdW50ZXI7CisJdTMyCQkJb2Zmc2V0OworfTsKKworc3RhdGljIHZvaWQgbmZ0X25nX2luY19ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJc3RydWN0IG5mdF9uZ19pbmMgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCXUzMiBudmFsLCBvdmFsOworCisJZG8geworCQlvdmFsID0gYXRvbWljX3JlYWQoJnByaXYtPmNvdW50ZXIpOworCQludmFsID0gKG92YWwgKyAxIDwgcHJpdi0+bW9kdWx1cykgPyBvdmFsICsgMSA6IDA7CisJfSB3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnByaXYtPmNvdW50ZXIsIG92YWwsIG52YWwpICE9IG92YWwpOworCisJcmVncy0+ZGF0YVtwcml2LT5kcmVnXSA9IG52YWwgKyBwcml2LT5vZmZzZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfbmdfcG9saWN5W05GVEFfTkdfTUFYICsgMV0gPSB7CisJW05GVEFfTkdfRFJFR10JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkZUQV9OR19NT0RVTFVTXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfTkdfVFlQRV0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkZUQV9OR19PRkZTRVRdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKK307CisKK3N0YXRpYyBpbnQgbmZ0X25nX2luY19pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwlzdHJ1Y3QgbmZ0X25nX2luYyAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisKKwlpZiAodGJbTkZUQV9OR19PRkZTRVRdKQorCQlwcml2LT5vZmZzZXQgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9OR19PRkZTRVRdKSk7CisKKwlwcml2LT5tb2R1bHVzID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTkdfTU9EVUxVU10pKTsKKwlpZiAocHJpdi0+bW9kdWx1cyA9PSAwKQorCQlyZXR1cm4gLUVSQU5HRTsKKworCWlmIChwcml2LT5vZmZzZXQgKyBwcml2LT5tb2R1bHVzIC0gMSA8IHByaXYtPm9mZnNldCkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisKKwlwcml2LT5kcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfTkdfRFJFR10pOworCWF0b21pY19zZXQoJnByaXYtPmNvdW50ZXIsIDApOworCisJcmV0dXJuIG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9zdG9yZShjdHgsIHByaXYtPmRyZWcsIE5VTEwsCisJCQkJCSAgIE5GVF9EQVRBX1ZBTFVFLCBzaXplb2YodTMyKSk7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X25nX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSBuZnRfcmVnaXN0ZXJzIGRyZWcsCisJCSAgICAgICB1MzIgbW9kdWx1cywgZW51bSBuZnRfbmdfdHlwZXMgdHlwZSwgdTMyIG9mZnNldCkKK3sKKwlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX05HX0RSRUcsIGRyZWcpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9OR19NT0RVTFVTLCBodG9ubChtb2R1bHVzKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX05HX1RZUEUsIGh0b25sKHR5cGUpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfTkdfT0ZGU0VULCBodG9ubChvZmZzZXQpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBuZnRfbmdfaW5jX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKQoreworCWNvbnN0IHN0cnVjdCBuZnRfbmdfaW5jICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKworCXJldHVybiBuZnRfbmdfZHVtcChza2IsIHByaXYtPmRyZWcsIHByaXYtPm1vZHVsdXMsIE5GVF9OR19JTkNSRU1FTlRBTCwKKwkJCSAgIHByaXYtPm9mZnNldCk7Cit9CisKK3N0cnVjdCBuZnRfbmdfcmFuZG9tIHsKKwllbnVtIG5mdF9yZWdpc3RlcnMgICAgICBkcmVnOjg7CisJdTMyCQkJbW9kdWx1czsKKwl1MzIJCQlvZmZzZXQ7Cit9OworCitzdGF0aWMgdm9pZCBuZnRfbmdfcmFuZG9tX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICAgICAgIHN0cnVjdCBuZnRfcmVncyAqcmVncywKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKK3sKKwlzdHJ1Y3QgbmZ0X25nX3JhbmRvbSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUgPSB0aGlzX2NwdV9wdHIoJm5mdF9udW1nZW5fcHJhbmRvbV9zdGF0ZSk7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlY2lwcm9jYWxfc2NhbGUocHJhbmRvbV91MzJfc3RhdGUoc3RhdGUpLCBwcml2LT5tb2R1bHVzKTsKKwlyZWdzLT5kYXRhW3ByaXYtPmRyZWddID0gdmFsICsgcHJpdi0+b2Zmc2V0OworfQorCitzdGF0aWMgaW50IG5mdF9uZ19yYW5kb21faW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCit7CisJc3RydWN0IG5mdF9uZ19yYW5kb20gKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCisJaWYgKHRiW05GVEFfTkdfT0ZGU0VUXSkKKwkJcHJpdi0+b2Zmc2V0ID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTkdfT0ZGU0VUXSkpOworCisJcHJpdi0+bW9kdWx1cyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX05HX01PRFVMVVNdKSk7CisJaWYgKHByaXYtPm1vZHVsdXMgPT0gMCkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlpZiAocHJpdi0+b2Zmc2V0ICsgcHJpdi0+bW9kdWx1cyAtIDEgPCBwcml2LT5vZmZzZXQpCisJCXJldHVybiAtRU9WRVJGTE9XOworCisJcHJhbmRvbV9pbml0X29uY2UoJm5mdF9udW1nZW5fcHJhbmRvbV9zdGF0ZSk7CisKKwlwcml2LT5kcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfTkdfRFJFR10pOworCisJcmV0dXJuIG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9zdG9yZShjdHgsIHByaXYtPmRyZWcsIE5VTEwsCisJCQkJCSAgIE5GVF9EQVRBX1ZBTFVFLCBzaXplb2YodTMyKSk7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X25nX3JhbmRvbV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X25nX3JhbmRvbSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisKKwlyZXR1cm4gbmZ0X25nX2R1bXAoc2tiLCBwcml2LT5kcmVnLCBwcml2LT5tb2R1bHVzLCBORlRfTkdfUkFORE9NLAorCQkJICAgcHJpdi0+b2Zmc2V0KTsKK30KKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9uZ190eXBlOworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgbmZ0X25nX2luY19vcHMgPSB7CisJLnR5cGUJCT0gJm5mdF9uZ190eXBlLAorCS5zaXplCQk9IE5GVF9FWFBSX1NJWkUoc2l6ZW9mKHN0cnVjdCBuZnRfbmdfaW5jKSksCisJLmV2YWwJCT0gbmZ0X25nX2luY19ldmFsLAorCS5pbml0CQk9IG5mdF9uZ19pbmNfaW5pdCwKKwkuZHVtcAkJPSBuZnRfbmdfaW5jX2R1bXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyBuZnRfbmdfcmFuZG9tX29wcyA9IHsKKwkudHlwZQkJPSAmbmZ0X25nX3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9uZ19yYW5kb20pKSwKKwkuZXZhbAkJPSBuZnRfbmdfcmFuZG9tX2V2YWwsCisJLmluaXQJCT0gbmZ0X25nX3JhbmRvbV9pbml0LAorCS5kdW1wCQk9IG5mdF9uZ19yYW5kb21fZHVtcCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzICoKK25mdF9uZ19zZWxlY3Rfb3BzKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQoreworCXUzMiB0eXBlOworCisJaWYgKCF0YltORlRBX05HX0RSRUddCSB8fAorCSAgICAhdGJbTkZUQV9OR19NT0RVTFVTXSB8fAorCSAgICAhdGJbTkZUQV9OR19UWVBFXSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwl0eXBlID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTkdfVFlQRV0pKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTkZUX05HX0lOQ1JFTUVOVEFMOgorCQlyZXR1cm4gJm5mdF9uZ19pbmNfb3BzOworCWNhc2UgTkZUX05HX1JBTkRPTToKKwkJcmV0dXJuICZuZnRfbmdfcmFuZG9tX29wczsKKwl9CisKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9uZ190eXBlIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gIm51bWdlbiIsCisJLnNlbGVjdF9vcHMJPSAmbmZ0X25nX3NlbGVjdF9vcHMsCisJLnBvbGljeQkJPSBuZnRfbmdfcG9saWN5LAorCS5tYXhhdHRyCT0gTkZUQV9OR19NQVgsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbmZ0X25nX21vZHVsZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG5mdF9yZWdpc3Rlcl9leHByKCZuZnRfbmdfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZnRfbmdfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwluZnRfdW5yZWdpc3Rlcl9leHByKCZuZnRfbmdfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KG5mdF9uZ19tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChuZnRfbmdfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJMYXVyYSBHYXJjaWEgPG5ldm9sYUBnbWFpbC5jb20+Iik7CitNT0RVTEVfQUxJQVNfTkZUX0VYUFIoIm51bWdlbiIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfcGF5bG9hZC5jIGIvbmV0L25ldGZpbHRlci9uZnRfcGF5bG9hZC5jCmluZGV4IDEyY2Q0YmYuLmIyZjg4NjEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X3BheWxvYWQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9wYXlsb2FkLmMKQEAgLTkyLDYgKzkyLDggQEAKIAkJb2Zmc2V0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJCWJyZWFrOwogCWNhc2UgTkZUX1BBWUxPQURfVFJBTlNQT1JUX0hFQURFUjoKKwkJaWYgKCFwa3QtPnRwcm90X3NldCkKKwkJCWdvdG8gZXJyOwogCQlvZmZzZXQgPSBwa3QtPnh0LnRob2ZmOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTg0LDYgKzE4Niw4IEBACiAJCW9mZnNldCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwogCQlicmVhazsKIAljYXNlIE5GVF9QQVlMT0FEX1RSQU5TUE9SVF9IRUFERVI6CisJCWlmICghcGt0LT50cHJvdF9zZXQpCisJCQlnb3RvIGVycjsKIAkJb2Zmc2V0ID0gcGt0LT54dC50aG9mZjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3F1ZXVlLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9xdWV1ZS5jCmluZGV4IDYxZDIxNmUuLjM5M2QzNTkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X3F1ZXVlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfcXVldWUuYwpAQCAtMjIsOSArMjIsMTAgQEAKIHN0YXRpYyB1MzIgamhhc2hfaW5pdHZhbCBfX3JlYWRfbW9zdGx5OwogCiBzdHJ1Y3QgbmZ0X3F1ZXVlIHsKLQl1MTYJcXVldWVudW07Ci0JdTE2CXF1ZXVlc190b3RhbDsKLQl1MTYJZmxhZ3M7CisJZW51bSBuZnRfcmVnaXN0ZXJzCXNyZWdfcW51bTo4OworCXUxNgkJCXF1ZXVlbnVtOworCXUxNgkJCXF1ZXVlc190b3RhbDsKKwl1MTYJCQlmbGFnczsKIH07CiAKIHN0YXRpYyB2b2lkIG5mdF9xdWV1ZV9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKQEAgLTU0LDI3ICs1NSw1MSBAQAogCXJlZ3MtPnZlcmRpY3QuY29kZSA9IHJldDsKIH0KIAorc3RhdGljIHZvaWQgbmZ0X3F1ZXVlX3NyZWdfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkJc3RydWN0IG5mdF9yZWdzICpyZWdzLAorCQkJCWNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQoreworCXN0cnVjdCBuZnRfcXVldWUgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCXUzMiBxdWV1ZSwgcmV0OworCisJcXVldWUgPSByZWdzLT5kYXRhW3ByaXYtPnNyZWdfcW51bV07CisKKwlyZXQgPSBORl9RVUVVRV9OUihxdWV1ZSk7CisJaWYgKHByaXYtPmZsYWdzICYgTkZUX1FVRVVFX0ZMQUdfQllQQVNTKQorCQlyZXQgfD0gTkZfVkVSRElDVF9GTEFHX1FVRVVFX0JZUEFTUzsKKworCXJlZ3MtPnZlcmRpY3QuY29kZSA9IHJldDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9xdWV1ZV9wb2xpY3lbTkZUQV9RVUVVRV9NQVggKyAxXSA9IHsKIAlbTkZUQV9RVUVVRV9OVU1dCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbTkZUQV9RVUVVRV9UT1RBTF0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtORlRBX1FVRVVFX0ZMQUdTXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW05GVEFfUVVFVUVfU1JFR19RTlVNXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiB9OwogCiBzdGF0aWMgaW50IG5mdF9xdWV1ZV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCi0JCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKKwkJCSAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKIAlzdHJ1Y3QgbmZ0X3F1ZXVlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1MzIgbWF4aWQ7CiAKLQlpZiAodGJbTkZUQV9RVUVVRV9OVU1dID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaW5pdF9oYXNocmFuZG9tKCZqaGFzaF9pbml0dmFsKTsKIAlwcml2LT5xdWV1ZW51bSA9IG50b2hzKG5sYV9nZXRfYmUxNih0YltORlRBX1FVRVVFX05VTV0pKTsKIAotCWlmICh0YltORlRBX1FVRVVFX1RPVEFMXSAhPSBOVUxMKQorCWlmICh0YltORlRBX1FVRVVFX1RPVEFMXSkKIAkJcHJpdi0+cXVldWVzX3RvdGFsID0gbnRvaHMobmxhX2dldF9iZTE2KHRiW05GVEFfUVVFVUVfVE9UQUxdKSk7Ci0JaWYgKHRiW05GVEFfUVVFVUVfRkxBR1NdICE9IE5VTEwpIHsKKwllbHNlCisJCXByaXYtPnF1ZXVlc190b3RhbCA9IDE7CisKKwlpZiAocHJpdi0+cXVldWVzX3RvdGFsID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbWF4aWQgPSBwcml2LT5xdWV1ZXNfdG90YWwgLSAxICsgcHJpdi0+cXVldWVudW07CisJaWYgKG1heGlkID4gVTE2X01BWCkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlpZiAodGJbTkZUQV9RVUVVRV9GTEFHU10pIHsKIAkJcHJpdi0+ZmxhZ3MgPSBudG9ocyhubGFfZ2V0X2JlMTYodGJbTkZUQV9RVUVVRV9GTEFHU10pKTsKIAkJaWYgKHByaXYtPmZsYWdzICYgfk5GVF9RVUVVRV9GTEFHX01BU0spCiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTgyLDYgKzEwNywyOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG5mdF9xdWV1ZV9zcmVnX2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCit7CisJc3RydWN0IG5mdF9xdWV1ZSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJaW50IGVycjsKKworCXByaXYtPnNyZWdfcW51bSA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX1FVRVVFX1NSRUdfUU5VTV0pOworCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWdfcW51bSwgc2l6ZW9mKHUzMikpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHRiW05GVEFfUVVFVUVfRkxBR1NdKSB7CisJCXByaXYtPmZsYWdzID0gbnRvaHMobmxhX2dldF9iZTE2KHRiW05GVEFfUVVFVUVfRkxBR1NdKSk7CisJCWlmIChwcml2LT5mbGFncyAmIH5ORlRfUVVFVUVfRkxBR19NQVNLKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChwcml2LT5mbGFncyAmIE5GVF9RVUVVRV9GTEFHX0NQVV9GQU5PVVQpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbmZ0X3F1ZXVlX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKQogewogCWNvbnN0IHN0cnVjdCBuZnRfcXVldWUgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwpAQCAtOTcsNiArMTQ1LDIxIEBACiAJcmV0dXJuIC0xOwogfQogCitzdGF0aWMgaW50CituZnRfcXVldWVfc3JlZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X3F1ZXVlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKworCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfUVVFVUVfU1JFR19RTlVNLCBwcml2LT5zcmVnX3FudW0pIHx8CisJICAgIG5sYV9wdXRfYmUxNihza2IsIE5GVEFfUVVFVUVfRkxBR1MsIGh0b25zKHByaXYtPmZsYWdzKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlyZXR1cm4gLTE7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfcXVldWVfdHlwZTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzIG5mdF9xdWV1ZV9vcHMgPSB7CiAJLnR5cGUJCT0gJm5mdF9xdWV1ZV90eXBlLApAQCAtMTA2LDkgKzE2OSwzNSBAQAogCS5kdW1wCQk9IG5mdF9xdWV1ZV9kdW1wLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMgbmZ0X3F1ZXVlX3NyZWdfb3BzID0geworCS50eXBlCQk9ICZuZnRfcXVldWVfdHlwZSwKKwkuc2l6ZQkJPSBORlRfRVhQUl9TSVpFKHNpemVvZihzdHJ1Y3QgbmZ0X3F1ZXVlKSksCisJLmV2YWwJCT0gbmZ0X3F1ZXVlX3NyZWdfZXZhbCwKKwkuaW5pdAkJPSBuZnRfcXVldWVfc3JlZ19pbml0LAorCS5kdW1wCQk9IG5mdF9xdWV1ZV9zcmVnX2R1bXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyAqCituZnRfcXVldWVfc2VsZWN0X29wcyhjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQoreworCWlmICh0YltORlRBX1FVRVVFX05VTV0gJiYgdGJbTkZUQV9RVUVVRV9TUkVHX1FOVU1dKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWluaXRfaGFzaHJhbmRvbSgmamhhc2hfaW5pdHZhbCk7CisKKwlpZiAodGJbTkZUQV9RVUVVRV9OVU1dKQorCQlyZXR1cm4gJm5mdF9xdWV1ZV9vcHM7CisKKwlpZiAodGJbTkZUQV9RVUVVRV9TUkVHX1FOVU1dKQorCQlyZXR1cm4gJm5mdF9xdWV1ZV9zcmVnX29wczsKKworCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworfQorCiBzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3F1ZXVlX3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZQkJPSAicXVldWUiLAotCS5vcHMJCT0gJm5mdF9xdWV1ZV9vcHMsCisJLnNlbGVjdF9vcHMJPSAmbmZ0X3F1ZXVlX3NlbGVjdF9vcHMsCiAJLnBvbGljeQkJPSBuZnRfcXVldWVfcG9saWN5LAogCS5tYXhhdHRyCT0gTkZUQV9RVUVVRV9NQVgsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfcXVvdGEuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3F1b3RhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwMTA0YwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3F1b3RhLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQG5ldGZpbHRlci5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKworc3RydWN0IG5mdF9xdW90YSB7CisJdTY0CQlxdW90YTsKKwlib29sCQlpbnZlcnQ7CisJYXRvbWljNjRfdAlyZW1haW47Cit9OworCitzdGF0aWMgaW5saW5lIGJvb2wgbmZ0X292ZXJxdW90YShzdHJ1Y3QgbmZ0X3F1b3RhICpwcml2LAorCQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKK3sKKwlyZXR1cm4gYXRvbWljNjRfc3ViX3JldHVybihwa3QtPnNrYi0+bGVuLCAmcHJpdi0+cmVtYWluKSA8IDA7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9xdW90YV9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgIHN0cnVjdCBuZnRfcmVncyAqcmVncywKKwkJCSAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQoreworCXN0cnVjdCBuZnRfcXVvdGEgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCisJaWYgKG5mdF9vdmVycXVvdGEocHJpdiwgcGt0KSBeIHByaXYtPmludmVydCkKKwkJcmVncy0+dmVyZGljdC5jb2RlID0gTkZUX0JSRUFLOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZ0X3F1b3RhX3BvbGljeVtORlRBX1FVT1RBX01BWCArIDFdID0geworCVtORlRBX1FVT1RBX0JZVEVTXQk9IHsgLnR5cGUgPSBOTEFfVTY0IH0sCisJW05GVEFfUVVPVEFfRkxBR1NdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKK307CisKK3N0YXRpYyBpbnQgbmZ0X3F1b3RhX2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCSAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwlzdHJ1Y3QgbmZ0X3F1b3RhICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1MzIgZmxhZ3MgPSAwOworCXU2NCBxdW90YTsKKworCWlmICghdGJbTkZUQV9RVU9UQV9CWVRFU10pCisJCXJldHVybiAtRUlOVkFMOworCisJcXVvdGEgPSBiZTY0X3RvX2NwdShubGFfZ2V0X2JlNjQodGJbTkZUQV9RVU9UQV9CWVRFU10pKTsKKwlpZiAocXVvdGEgPiBTNjRfTUFYKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKworCWlmICh0YltORlRBX1FVT1RBX0ZMQUdTXSkgeworCQlmbGFncyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX1FVT1RBX0ZMQUdTXSkpOworCQlpZiAoZmxhZ3MgJiB+TkZUX1FVT1RBX0ZfSU5WKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpdi0+cXVvdGEgPSBxdW90YTsKKwlwcml2LT5pbnZlcnQgPSAoZmxhZ3MgJiBORlRfUVVPVEFfRl9JTlYpID8gdHJ1ZSA6IGZhbHNlOworCWF0b21pYzY0X3NldCgmcHJpdi0+cmVtYWluLCBxdW90YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZnRfcXVvdGFfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9xdW90YSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdTMyIGZsYWdzID0gcHJpdi0+aW52ZXJ0ID8gTkZUX1FVT1RBX0ZfSU5WIDogMDsKKworCWlmIChubGFfcHV0X2JlNjQoc2tiLCBORlRBX1FVT1RBX0JZVEVTLCBjcHVfdG9fYmU2NChwcml2LT5xdW90YSksCisJCQkgTkZUQV9RVU9UQV9QQUQpIHx8CisJICAgIG5sYV9wdXRfYmUzMihza2IsIE5GVEFfUVVPVEFfRkxBR1MsIGh0b25sKGZsYWdzKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3F1b3RhX3R5cGU7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyBuZnRfcXVvdGFfb3BzID0geworCS50eXBlCQk9ICZuZnRfcXVvdGFfdHlwZSwKKwkuc2l6ZQkJPSBORlRfRVhQUl9TSVpFKHNpemVvZihzdHJ1Y3QgbmZ0X3F1b3RhKSksCisJLmV2YWwJCT0gbmZ0X3F1b3RhX2V2YWwsCisJLmluaXQJCT0gbmZ0X3F1b3RhX2luaXQsCisJLmR1bXAJCT0gbmZ0X3F1b3RhX2R1bXAsCit9OworCitzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3F1b3RhX3R5cGUgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAicXVvdGEiLAorCS5vcHMJCT0gJm5mdF9xdW90YV9vcHMsCisJLnBvbGljeQkJPSBuZnRfcXVvdGFfcG9saWN5LAorCS5tYXhhdHRyCT0gTkZUQV9RVU9UQV9NQVgsCisJLmZsYWdzCQk9IE5GVF9FWFBSX1NUQVRFRlVMLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mdF9xdW90YV9tb2R1bGVfaW5pdCh2b2lkKQoreworICAgICAgICByZXR1cm4gbmZ0X3JlZ2lzdGVyX2V4cHIoJm5mdF9xdW90YV90eXBlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mdF9xdW90YV9tb2R1bGVfZXhpdCh2b2lkKQoreworICAgICAgICBuZnRfdW5yZWdpc3Rlcl9leHByKCZuZnRfcXVvdGFfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KG5mdF9xdW90YV9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChuZnRfcXVvdGFfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJQYWJsbyBOZWlyYSBBeXVzbyA8cGFibG9AbmV0ZmlsdGVyLm9yZz4iKTsKK01PRFVMRV9BTElBU19ORlRfRVhQUigicXVvdGEiKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3JhbmdlLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9yYW5nZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZDUzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9yYW5nZS5jCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BuZXRmaWx0ZXIub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorCitzdHJ1Y3QgbmZ0X3JhbmdlX2V4cHIgeworCXN0cnVjdCBuZnRfZGF0YQkJZGF0YV9mcm9tOworCXN0cnVjdCBuZnRfZGF0YQkJZGF0YV90bzsKKwllbnVtIG5mdF9yZWdpc3RlcnMJc3JlZzo4OworCXU4CQkJbGVuOworCWVudW0gbmZ0X3JhbmdlX29wcwlvcDo4OworfTsKKworc3RhdGljIHZvaWQgbmZ0X3JhbmdlX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJIHN0cnVjdCBuZnRfcmVncyAqcmVncywKKwkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X3JhbmdlX2V4cHIgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCWJvb2wgbWlzbWF0Y2g7CisJaW50IGQxLCBkMjsKKworCWQxID0gbWVtY21wKCZyZWdzLT5kYXRhW3ByaXYtPnNyZWddLCAmcHJpdi0+ZGF0YV9mcm9tLCBwcml2LT5sZW4pOworCWQyID0gbWVtY21wKCZyZWdzLT5kYXRhW3ByaXYtPnNyZWddLCAmcHJpdi0+ZGF0YV90bywgcHJpdi0+bGVuKTsKKwlzd2l0Y2ggKHByaXYtPm9wKSB7CisJY2FzZSBORlRfUkFOR0VfRVE6CisJCW1pc21hdGNoID0gKGQxIDwgMCB8fCBkMiA+IDApOworCQlicmVhazsKKwljYXNlIE5GVF9SQU5HRV9ORVE6CisJCW1pc21hdGNoID0gKGQxID49IDAgJiYgZDIgPD0gMCk7CisJCWJyZWFrOworCX0KKworCWlmIChtaXNtYXRjaCkKKwkJcmVncy0+dmVyZGljdC5jb2RlID0gTkZUX0JSRUFLOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZ0X3JhbmdlX3BvbGljeVtORlRBX1JBTkdFX01BWCArIDFdID0geworCVtORlRBX1JBTkdFX1NSRUddCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfUkFOR0VfT1BdCQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX1JBTkdFX0ZST01fREFUQV0JCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKKwlbTkZUQV9SQU5HRV9UT19EQVRBXQkJPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorfTsKKworc3RhdGljIGludCBuZnRfcmFuZ2VfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQljb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwlzdHJ1Y3QgbmZ0X3JhbmdlX2V4cHIgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCXN0cnVjdCBuZnRfZGF0YV9kZXNjIGRlc2NfZnJvbSwgZGVzY190bzsKKwlpbnQgZXJyOworCisJZXJyID0gbmZ0X2RhdGFfaW5pdChOVUxMLCAmcHJpdi0+ZGF0YV9mcm9tLCBzaXplb2YocHJpdi0+ZGF0YV9mcm9tKSwKKwkJCSAgICAmZGVzY19mcm9tLCB0YltORlRBX1JBTkdFX0ZST01fREFUQV0pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbmZ0X2RhdGFfaW5pdChOVUxMLCAmcHJpdi0+ZGF0YV90bywgc2l6ZW9mKHByaXYtPmRhdGFfdG8pLAorCQkJICAgICZkZXNjX3RvLCB0YltORlRBX1JBTkdFX1RPX0RBVEFdKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnIxOworCisJaWYgKGRlc2NfZnJvbS5sZW4gIT0gZGVzY190by5sZW4pIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnIyOworCX0KKworCXByaXYtPnNyZWcgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9SQU5HRV9TUkVHXSk7CisJZXJyID0gbmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX2xvYWQocHJpdi0+c3JlZywgZGVzY19mcm9tLmxlbik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMjsKKworCXByaXYtPm9wICA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX1JBTkdFX09QXSkpOworCXByaXYtPmxlbiA9IGRlc2NfZnJvbS5sZW47CisJcmV0dXJuIDA7CitlcnIyOgorCW5mdF9kYXRhX3VuaW5pdCgmcHJpdi0+ZGF0YV90bywgZGVzY190by50eXBlKTsKK2VycjE6CisJbmZ0X2RhdGFfdW5pbml0KCZwcml2LT5kYXRhX2Zyb20sIGRlc2NfZnJvbS50eXBlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG5mdF9yYW5nZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X3JhbmdlX2V4cHIgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCisJaWYgKG5mdF9kdW1wX3JlZ2lzdGVyKHNrYiwgTkZUQV9SQU5HRV9TUkVHLCBwcml2LT5zcmVnKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfUkFOR0VfT1AsIGh0b25sKHByaXYtPm9wKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKG5mdF9kYXRhX2R1bXAoc2tiLCBORlRBX1JBTkdFX0ZST01fREFUQSwgJnByaXYtPmRhdGFfZnJvbSwKKwkJCSAgTkZUX0RBVEFfVkFMVUUsIHByaXYtPmxlbikgPCAwIHx8CisJICAgIG5mdF9kYXRhX2R1bXAoc2tiLCBORlRBX1JBTkdFX1RPX0RBVEEsICZwcml2LT5kYXRhX3RvLAorCQkJICBORlRfREFUQV9WQUxVRSwgcHJpdi0+bGVuKSA8IDApCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3JhbmdlX3R5cGU7CitzdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyBuZnRfcmFuZ2Vfb3BzID0geworCS50eXBlCQk9ICZuZnRfcmFuZ2VfdHlwZSwKKwkuc2l6ZQkJPSBORlRfRVhQUl9TSVpFKHNpemVvZihzdHJ1Y3QgbmZ0X3JhbmdlX2V4cHIpKSwKKwkuZXZhbAkJPSBuZnRfcmFuZ2VfZXZhbCwKKwkuaW5pdAkJPSBuZnRfcmFuZ2VfaW5pdCwKKwkuZHVtcAkJPSBuZnRfcmFuZ2VfZHVtcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfcmFuZ2VfdHlwZSBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJyYW5nZSIsCisJLm9wcwkJPSAmbmZ0X3JhbmdlX29wcywKKwkucG9saWN5CQk9IG5mdF9yYW5nZV9wb2xpY3ksCisJLm1heGF0dHIJPSBORlRBX1JBTkdFX01BWCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitpbnQgX19pbml0IG5mdF9yYW5nZV9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBuZnRfcmVnaXN0ZXJfZXhwcigmbmZ0X3JhbmdlX3R5cGUpOworfQorCit2b2lkIG5mdF9yYW5nZV9tb2R1bGVfZXhpdCh2b2lkKQoreworCW5mdF91bnJlZ2lzdGVyX2V4cHIoJm5mdF9yYW5nZV90eXBlKTsKK30KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3JidHJlZS5jIGIvbmV0L25ldGZpbHRlci9uZnRfcmJ0cmVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZTlhZTAuLjAwMDAwMDAKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfcmJ0cmVlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IFBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8pCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaD4KLSNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5mdF9yYnRyZWVfbG9jayk7Ci0KLXN0cnVjdCBuZnRfcmJ0cmVlIHsKLQlzdHJ1Y3QgcmJfcm9vdAkJcm9vdDsKLX07Ci0KLXN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gewotCXN0cnVjdCByYl9ub2RlCQlub2RlOwotCXN0cnVjdCBuZnRfc2V0X2V4dAlleHQ7Ci19OwotCi1zdGF0aWMgYm9vbCBuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChjb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUpCi17Ci0JcmV0dXJuIG5mdF9zZXRfZXh0X2V4aXN0cygmcmJlLT5leHQsIE5GVF9TRVRfRVhUX0ZMQUdTKSAmJgotCSAgICAgICAoKm5mdF9zZXRfZXh0X2ZsYWdzKCZyYmUtPmV4dCkgJiBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKTsKLX0KLQotc3RhdGljIGJvb2wgbmZ0X3JidHJlZV9lcXVhbChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LCBjb25zdCB2b2lkICp0aGlzLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICppbnRlcnZhbCkKLXsKLQlyZXR1cm4gbWVtY21wKHRoaXMsIG5mdF9zZXRfZXh0X2tleSgmaW50ZXJ2YWwtPmV4dCksIHNldC0+a2xlbikgPT0gMDsKLX0KLQotc3RhdGljIGJvb2wgbmZ0X3JidHJlZV9sb29rdXAoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJICAgICAgY29uc3QgdTMyICprZXksIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2V4dCAqKmV4dCkKLXsKLQljb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCWNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZSwgKmludGVydmFsID0gTlVMTDsKLQl1OCBnZW5tYXNrID0gbmZ0X2dlbm1hc2tfY3VyKG5ldCk7Ci0JY29uc3Qgc3RydWN0IHJiX25vZGUgKnBhcmVudDsKLQljb25zdCB2b2lkICp0aGlzOwotCWludCBkOwotCi0Jc3Bpbl9sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwotCXBhcmVudCA9IHByaXYtPnJvb3QucmJfbm9kZTsKLQl3aGlsZSAocGFyZW50ICE9IE5VTEwpIHsKLQkJcmJlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKLQotCQl0aGlzID0gbmZ0X3NldF9leHRfa2V5KCZyYmUtPmV4dCk7Ci0JCWQgPSBtZW1jbXAodGhpcywga2V5LCBzZXQtPmtsZW4pOwotCQlpZiAoZCA8IDApIHsKLQkJCXBhcmVudCA9IHBhcmVudC0+cmJfbGVmdDsKLQkJCS8qIEluIGNhc2Ugb2YgYWRqYWNlbnQgcmFuZ2VzLCB3ZSBhbHdheXMgc2VlIHRoZSBoaWdoCi0JCQkgKiBwYXJ0IG9mIHRoZSByYW5nZSBpbiBmaXJzdCBwbGFjZSwgYmVmb3JlIHRoZSBsb3cgb25lLgotCQkJICogU28gZG9uJ3QgdXBkYXRlIGludGVydmFsIGlmIHRoZSBrZXlzIGFyZSBlcXVhbC4KLQkJCSAqLwotCQkJaWYgKGludGVydmFsICYmIG5mdF9yYnRyZWVfZXF1YWwoc2V0LCB0aGlzLCBpbnRlcnZhbCkpCi0JCQkJY29udGludWU7Ci0JCQlpbnRlcnZhbCA9IHJiZTsKLQkJfSBlbHNlIGlmIChkID4gMCkKLQkJCXBhcmVudCA9IHBhcmVudC0+cmJfcmlnaHQ7Ci0JCWVsc2UgewotCQkJaWYgKCFuZnRfc2V0X2VsZW1fYWN0aXZlKCZyYmUtPmV4dCwgZ2VubWFzaykpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQocmJlKSkKLQkJCQlnb3RvIG91dDsKLQkJCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwotCi0JCQkqZXh0ID0gJnJiZS0+ZXh0OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfSU5URVJWQUwgJiYgaW50ZXJ2YWwgIT0gTlVMTCAmJgotCSAgICBuZnRfc2V0X2VsZW1fYWN0aXZlKCZpbnRlcnZhbC0+ZXh0LCBnZW5tYXNrKSAmJgotCSAgICAhbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQoaW50ZXJ2YWwpKSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwotCQkqZXh0ID0gJmludGVydmFsLT5leHQ7Ci0JCXJldHVybiB0cnVlOwotCX0KLW91dDoKLQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgX19uZnRfcmJ0cmVlX2luc2VydChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgICAgICAgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqbmV3KQotewotCXN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0JdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KTsKLQlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7Ci0Jc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwOwotCWludCBkOwotCi0JcGFyZW50ID0gTlVMTDsKLQlwID0gJnByaXYtPnJvb3QucmJfbm9kZTsKLQl3aGlsZSAoKnAgIT0gTlVMTCkgewotCQlwYXJlbnQgPSAqcDsKLQkJcmJlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKLQkJZCA9IG1lbWNtcChuZnRfc2V0X2V4dF9rZXkoJnJiZS0+ZXh0KSwKLQkJCSAgIG5mdF9zZXRfZXh0X2tleSgmbmV3LT5leHQpLAotCQkJICAgc2V0LT5rbGVuKTsKLQkJaWYgKGQgPCAwKQotCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKGQgPiAwKQotCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OwotCQllbHNlIHsKLQkJCWlmIChuZnRfc2V0X2VsZW1fYWN0aXZlKCZyYmUtPmV4dCwgZ2VubWFzaykpIHsKLQkJCQlpZiAobmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQocmJlKSAmJgotCQkJCSAgICAhbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQobmV3KSkKLQkJCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7Ci0JCQkJZWxzZSBpZiAoIW5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHJiZSkgJiYKLQkJCQkJIG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKG5ldykpCi0JCQkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKLQkJCQllbHNlCi0JCQkJCXJldHVybiAtRUVYSVNUOwotCQkJfQotCQl9Ci0JfQotCXJiX2xpbmtfbm9kZSgmbmV3LT5ub2RlLCBwYXJlbnQsIHApOwotCXJiX2luc2VydF9jb2xvcigmbmV3LT5ub2RlLCAmcHJpdi0+cm9vdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbmZ0X3JidHJlZV9pbnNlcnQoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCXN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZSA9IGVsZW0tPnByaXY7Ci0JaW50IGVycjsKLQotCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQllcnIgPSBfX25mdF9yYnRyZWVfaW5zZXJ0KG5ldCwgc2V0LCByYmUpOwotCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X3JidHJlZV9yZW1vdmUoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCi17Ci0Jc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OwotCi0Jc3Bpbl9sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwotCXJiX2VyYXNlKCZyYmUtPm5vZGUsICZwcml2LT5yb290KTsKLQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgbmZ0X3JidHJlZV9hY3RpdmF0ZShjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCQljb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCXN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZSA9IGVsZW0tPnByaXY7Ci0KLQluZnRfc2V0X2VsZW1fY2hhbmdlX2FjdGl2ZShuZXQsIHNldCwgJnJiZS0+ZXh0KTsKLX0KLQotc3RhdGljIHZvaWQgKm5mdF9yYnRyZWVfZGVhY3RpdmF0ZShjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJICAgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCWNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0JY29uc3Qgc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IHByaXYtPnJvb3QucmJfbm9kZTsKLQlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUsICp0aGlzID0gZWxlbS0+cHJpdjsKLQl1OCBnZW5tYXNrID0gbmZ0X2dlbm1hc2tfbmV4dChuZXQpOwotCWludCBkOwotCi0Jd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7Ci0JCXJiZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7Ci0KLQkJZCA9IG1lbWNtcChuZnRfc2V0X2V4dF9rZXkoJnJiZS0+ZXh0KSwgJmVsZW0tPmtleS52YWwsCi0JCQkJCSAgIHNldC0+a2xlbik7Ci0JCWlmIChkIDwgMCkKLQkJCXBhcmVudCA9IHBhcmVudC0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoZCA+IDApCi0JCQlwYXJlbnQgPSBwYXJlbnQtPnJiX3JpZ2h0OwotCQllbHNlIHsKLQkJCWlmICghbmZ0X3NldF9lbGVtX2FjdGl2ZSgmcmJlLT5leHQsIGdlbm1hc2spKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LT5yYl9sZWZ0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHJiZSkgJiYKLQkJCSAgICAhbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQodGhpcykpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKCFuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChyYmUpICYmCi0JCQkJICAgbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQodGhpcykpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX3JpZ2h0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbmZ0X3NldF9lbGVtX2NoYW5nZV9hY3RpdmUobmV0LCBzZXQsICZyYmUtPmV4dCk7Ci0JCQlyZXR1cm4gcmJlOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBuZnRfcmJ0cmVlX3dhbGsoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJICAgIHN0cnVjdCBuZnRfc2V0X2l0ZXIgKml0ZXIpCi17Ci0JY29uc3Qgc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7Ci0Jc3RydWN0IG5mdF9zZXRfZWxlbSBlbGVtOwotCXN0cnVjdCByYl9ub2RlICpub2RlOwotCi0Jc3Bpbl9sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwotCWZvciAobm9kZSA9IHJiX2ZpcnN0KCZwcml2LT5yb290KTsgbm9kZSAhPSBOVUxMOyBub2RlID0gcmJfbmV4dChub2RlKSkgewotCQlyYmUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKLQotCQlpZiAoaXRlci0+Y291bnQgPCBpdGVyLT5za2lwKQotCQkJZ290byBjb250OwotCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJnJiZS0+ZXh0LCBpdGVyLT5nZW5tYXNrKSkKLQkJCWdvdG8gY29udDsKLQotCQllbGVtLnByaXYgPSByYmU7Ci0KLQkJaXRlci0+ZXJyID0gaXRlci0+Zm4oY3R4LCBzZXQsIGl0ZXIsICZlbGVtKTsKLQkJaWYgKGl0ZXItPmVyciA8IDApIHsKLQkJCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwotCQkJcmV0dXJuOwotCQl9Ci1jb250OgotCQlpdGVyLT5jb3VudCsrOwotCX0KLQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBuZnRfcmJ0cmVlX3ByaXZzaXplKGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKLXsKLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBuZnRfcmJ0cmVlKTsKLX0KLQotc3RhdGljIGludCBuZnRfcmJ0cmVlX2luaXQoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCSAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2Rlc2MgKmRlc2MsCi0JCQkgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCi17Ci0Jc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQotCXByaXYtPnJvb3QgPSBSQl9ST09UOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBuZnRfcmJ0cmVlX2Rlc3Ryb3koY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCkKLXsKLQlzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKLQotCXdoaWxlICgobm9kZSA9IHByaXYtPnJvb3QucmJfbm9kZSkgIT0gTlVMTCkgewotCQlyYl9lcmFzZShub2RlLCAmcHJpdi0+cm9vdCk7Ci0JCXJiZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOwotCQluZnRfc2V0X2VsZW1fZGVzdHJveShzZXQsIHJiZSk7Ci0JfQotfQotCi1zdGF0aWMgYm9vbCBuZnRfcmJ0cmVlX2VzdGltYXRlKGNvbnN0IHN0cnVjdCBuZnRfc2V0X2Rlc2MgKmRlc2MsIHUzMiBmZWF0dXJlcywKLQkJCQlzdHJ1Y3QgbmZ0X3NldF9lc3RpbWF0ZSAqZXN0KQotewotCXVuc2lnbmVkIGludCBuc2l6ZTsKLQotCW5zaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0pOwotCWlmIChkZXNjLT5zaXplKQotCQllc3QtPnNpemUgPSBzaXplb2Yoc3RydWN0IG5mdF9yYnRyZWUpICsgZGVzYy0+c2l6ZSAqIG5zaXplOwotCWVsc2UKLQkJZXN0LT5zaXplID0gbnNpemU7Ci0KLQllc3QtPmNsYXNzID0gTkZUX1NFVF9DTEFTU19PX0xPR19OOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmZ0X3NldF9vcHMgbmZ0X3JidHJlZV9vcHMgX19yZWFkX21vc3RseSA9IHsKLQkucHJpdnNpemUJPSBuZnRfcmJ0cmVlX3ByaXZzaXplLAotCS5lbGVtc2l6ZQk9IG9mZnNldG9mKHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIGV4dCksCi0JLmVzdGltYXRlCT0gbmZ0X3JidHJlZV9lc3RpbWF0ZSwKLQkuaW5pdAkJPSBuZnRfcmJ0cmVlX2luaXQsCi0JLmRlc3Ryb3kJPSBuZnRfcmJ0cmVlX2Rlc3Ryb3ksCi0JLmluc2VydAkJPSBuZnRfcmJ0cmVlX2luc2VydCwKLQkucmVtb3ZlCQk9IG5mdF9yYnRyZWVfcmVtb3ZlLAotCS5kZWFjdGl2YXRlCT0gbmZ0X3JidHJlZV9kZWFjdGl2YXRlLAotCS5hY3RpdmF0ZQk9IG5mdF9yYnRyZWVfYWN0aXZhdGUsCi0JLmxvb2t1cAkJPSBuZnRfcmJ0cmVlX2xvb2t1cCwKLQkud2FsawkJPSBuZnRfcmJ0cmVlX3dhbGssCi0JLmZlYXR1cmVzCT0gTkZUX1NFVF9JTlRFUlZBTCB8IE5GVF9TRVRfTUFQLAotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG5mdF9yYnRyZWVfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbmZ0X3JlZ2lzdGVyX3NldCgmbmZ0X3JidHJlZV9vcHMpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbmZ0X3JidHJlZV9tb2R1bGVfZXhpdCh2b2lkKQotewotCW5mdF91bnJlZ2lzdGVyX3NldCgmbmZ0X3JidHJlZV9vcHMpOwotfQotCi1tb2R1bGVfaW5pdChuZnRfcmJ0cmVlX21vZHVsZV9pbml0KTsKLW1vZHVsZV9leGl0KG5mdF9yYnRyZWVfbW9kdWxlX2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKLU1PRFVMRV9BTElBU19ORlRfU0VUKCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdC5jCmluZGV4IDA1MjJmYzkuLmM2NGRlM2Y3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuYwpAQCAtMjYsMTEgKzI2LDI3IEBACiB9OwogRVhQT1JUX1NZTUJPTF9HUEwobmZ0X3JlamVjdF9wb2xpY3kpOwogCitpbnQgbmZ0X3JlamVjdF92YWxpZGF0ZShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJY29uc3Qgc3RydWN0IG5mdF9kYXRhICoqZGF0YSkKK3sKKwlyZXR1cm4gbmZ0X2NoYWluX3ZhbGlkYXRlX2hvb2tzKGN0eC0+Y2hhaW4sCisJCQkJCSgxIDw8IE5GX0lORVRfTE9DQUxfSU4pIHwKKwkJCQkJKDEgPDwgTkZfSU5FVF9GT1JXQVJEKSB8CisJCQkJCSgxIDw8IE5GX0lORVRfTE9DQUxfT1VUKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZnRfcmVqZWN0X3ZhbGlkYXRlKTsKKwogaW50IG5mdF9yZWplY3RfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAogCQkgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAogCQkgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7CiAJc3RydWN0IG5mdF9yZWplY3QgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCWludCBlcnI7CisKKwllcnIgPSBuZnRfcmVqZWN0X3ZhbGlkYXRlKGN0eCwgZXhwciwgTlVMTCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CiAKIAlpZiAodGJbTkZUQV9SRUpFQ1RfVFlQRV0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaW5ldC5jIGIvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0X2luZXQuYwppbmRleCA3NTljYTUyLi5lNzlkOWNhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaW5ldC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pbmV0LmMKQEAgLTY2LDcgKzY2LDExIEBACiAJCQkJY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7CiAJc3RydWN0IG5mdF9yZWplY3QgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwotCWludCBpY21wX2NvZGU7CisJaW50IGljbXBfY29kZSwgZXJyOworCisJZXJyID0gbmZ0X3JlamVjdF92YWxpZGF0ZShjdHgsIGV4cHIsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKHRiW05GVEFfUkVKRUNUX1RZUEVdID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTI0LDYgKzEyOCw3IEBACiAJLmV2YWwJCT0gbmZ0X3JlamVjdF9pbmV0X2V2YWwsCiAJLmluaXQJCT0gbmZ0X3JlamVjdF9pbmV0X2luaXQsCiAJLmR1bXAJCT0gbmZ0X3JlamVjdF9pbmV0X2R1bXAsCisJLnZhbGlkYXRlCT0gbmZ0X3JlamVjdF92YWxpZGF0ZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfcmVqZWN0X2luZXRfdHlwZSBfX3JlYWRfbW9zdGx5ID0gewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfc2V0X2hhc2guYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3NldF9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5NGNiMgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3NldF9oYXNoLmMKQEAgLTAsMCArMSw0MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNCBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSBmdW5kZWQgYnkgQXN0YXJvIEFHIChodHRwOi8vd3d3LmFzdGFyby5jb20vKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yaGFzaHRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisKKy8qIFdlIHRhcmdldCBhIGhhc2ggdGFibGUgc2l6ZSBvZiA0LCBlbGVtZW50IGhpbnQgaXMgNzUlIG9mIGZpbmFsIHNpemUgKi8KKyNkZWZpbmUgTkZUX0hBU0hfRUxFTUVOVF9ISU5UIDMKKworc3RydWN0IG5mdF9oYXNoIHsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZQkJaHQ7CisJc3RydWN0IGRlbGF5ZWRfd29yawkJZ2Nfd29yazsKK307CisKK3N0cnVjdCBuZnRfaGFzaF9lbGVtIHsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZAkJbm9kZTsKKwlzdHJ1Y3QgbmZ0X3NldF9leHQJCWV4dDsKK307CisKK3N0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIHsKKwljb25zdCBzdHJ1Y3QgbmZ0X3NldAkJKnNldDsKKwljb25zdCB1MzIJCQkqa2V5OworCXU4CQkJCWdlbm1hc2s7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIG5mdF9oYXNoX3BhcmFtczsKKworc3RhdGljIGlubGluZSB1MzIgbmZ0X2hhc2hfa2V5KGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBsZW4sIHUzMiBzZWVkKQoreworCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnICphcmcgPSBkYXRhOworCisJcmV0dXJuIGpoYXNoKGFyZy0+a2V5LCBsZW4sIHNlZWQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBuZnRfaGFzaF9vYmooY29uc3Qgdm9pZCAqZGF0YSwgdTMyIGxlbiwgdTMyIHNlZWQpCit7CisJY29uc3Qgc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlID0gZGF0YTsKKworCXJldHVybiBqaGFzaChuZnRfc2V0X2V4dF9rZXkoJmhlLT5leHQpLCBsZW4sIHNlZWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZnRfaGFzaF9jbXAoc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgKmFyZywKKwkJCSAgICAgICBjb25zdCB2b2lkICpwdHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgKnggPSBhcmctPmtleTsKKwljb25zdCBzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGUgPSBwdHI7CisKKwlpZiAobWVtY21wKG5mdF9zZXRfZXh0X2tleSgmaGUtPmV4dCksIHgtPmtleSwgeC0+c2V0LT5rbGVuKSkKKwkJcmV0dXJuIDE7CisJaWYgKG5mdF9zZXRfZWxlbV9leHBpcmVkKCZoZS0+ZXh0KSkKKwkJcmV0dXJuIDE7CisJaWYgKCFuZnRfc2V0X2VsZW1fYWN0aXZlKCZoZS0+ZXh0LCB4LT5nZW5tYXNrKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIG5mdF9oYXNoX2xvb2t1cChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgICAgY29uc3QgdTMyICprZXksIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2V4dCAqKmV4dCkKK3sKKwlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwljb25zdCBzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGU7CisJc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgYXJnID0geworCQkuZ2VubWFzayA9IG5mdF9nZW5tYXNrX2N1cihuZXQpLAorCQkuc2V0CSA9IHNldCwKKwkJLmtleQkgPSBrZXksCisJfTsKKworCWhlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmcHJpdi0+aHQsICZhcmcsIG5mdF9oYXNoX3BhcmFtcyk7CisJaWYgKGhlICE9IE5VTEwpCisJCSpleHQgPSAmaGUtPmV4dDsKKworCXJldHVybiAhIWhlOworfQorCitzdGF0aWMgYm9vbCBuZnRfaGFzaF91cGRhdGUoc3RydWN0IG5mdF9zZXQgKnNldCwgY29uc3QgdTMyICprZXksCisJCQkgICAgdm9pZCAqKCpuZXcpKHN0cnVjdCBuZnRfc2V0ICosCisJCQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKiwKKwkJCQkJIHN0cnVjdCBuZnRfcmVncyAqcmVncyksCisJCQkgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICAgIHN0cnVjdCBuZnRfcmVncyAqcmVncywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKKwkJLmdlbm1hc2sgPSBORlRfR0VOTUFTS19BTlksCisJCS5zZXQJID0gc2V0LAorCQkua2V5CSA9IGtleSwKKwl9OworCisJaGUgPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZwcml2LT5odCwgJmFyZywgbmZ0X2hhc2hfcGFyYW1zKTsKKwlpZiAoaGUgIT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwloZSA9IG5ldyhzZXQsIGV4cHIsIHJlZ3MpOworCWlmIChoZSA9PSBOVUxMKQorCQlnb3RvIGVycjE7CisJaWYgKHJoYXNodGFibGVfbG9va3VwX2luc2VydF9rZXkoJnByaXYtPmh0LCAmYXJnLCAmaGUtPm5vZGUsCisJCQkJCSBuZnRfaGFzaF9wYXJhbXMpKQorCQlnb3RvIGVycjI7CitvdXQ6CisJKmV4dCA9ICZoZS0+ZXh0OworCXJldHVybiB0cnVlOworCitlcnIyOgorCW5mdF9zZXRfZWxlbV9kZXN0cm95KHNldCwgaGUpOworZXJyMToKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgbmZ0X2hhc2hfaW5zZXJ0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0sCisJCQkgICBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlID0gZWxlbS0+cHJpdjsKKwlzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyBhcmcgPSB7CisJCS5nZW5tYXNrID0gbmZ0X2dlbm1hc2tfbmV4dChuZXQpLAorCQkuc2V0CSA9IHNldCwKKwkJLmtleQkgPSBlbGVtLT5rZXkudmFsLmRhdGEsCisJfTsKKwlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqcHJldjsKKworCXByZXYgPSByaGFzaHRhYmxlX2xvb2t1cF9nZXRfaW5zZXJ0X2tleSgmcHJpdi0+aHQsICZhcmcsICZoZS0+bm9kZSwKKwkJCQkJICAgICAgIG5mdF9oYXNoX3BhcmFtcyk7CisJaWYgKElTX0VSUihwcmV2KSkKKwkJcmV0dXJuIFBUUl9FUlIocHJldik7CisJaWYgKHByZXYpIHsKKwkJKmV4dCA9ICZwcmV2LT5leHQ7CisJCXJldHVybiAtRUVYSVNUOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmZ0X2hhc2hfYWN0aXZhdGUoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKK3sKKwlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGUgPSBlbGVtLT5wcml2OworCisJbmZ0X3NldF9lbGVtX2NoYW5nZV9hY3RpdmUobmV0LCBzZXQsICZoZS0+ZXh0KTsKKwluZnRfc2V0X2VsZW1fY2xlYXJfYnVzeSgmaGUtPmV4dCk7Cit9CisKK3N0YXRpYyB2b2lkICpuZnRfaGFzaF9kZWFjdGl2YXRlKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCQkgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKK3sKKwlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGU7CisJc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgYXJnID0geworCQkuZ2VubWFzayA9IG5mdF9nZW5tYXNrX25leHQobmV0KSwKKwkJLnNldAkgPSBzZXQsCisJCS5rZXkJID0gZWxlbS0+a2V5LnZhbC5kYXRhLAorCX07CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaGUgPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZwcml2LT5odCwgJmFyZywgbmZ0X2hhc2hfcGFyYW1zKTsKKwlpZiAoaGUgIT0gTlVMTCkgeworCQlpZiAoIW5mdF9zZXRfZWxlbV9tYXJrX2J1c3koJmhlLT5leHQpIHx8CisJCSAgICAhbmZ0X2lzX2FjdGl2ZShuZXQsICZoZS0+ZXh0KSkKKwkJCW5mdF9zZXRfZWxlbV9jaGFuZ2VfYWN0aXZlKG5ldCwgc2V0LCAmaGUtPmV4dCk7CisJCWVsc2UKKwkJCWhlID0gTlVMTDsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gaGU7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9oYXNoX3JlbW92ZShjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlID0gZWxlbS0+cHJpdjsKKworCXJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoJnByaXYtPmh0LCAmaGUtPm5vZGUsIG5mdF9oYXNoX3BhcmFtcyk7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9oYXNoX3dhbGsoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgc3RydWN0IG5mdF9zZXRfaXRlciAqaXRlcikKK3sKKwlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGU7CisJc3RydWN0IHJoYXNodGFibGVfaXRlciBodGk7CisJc3RydWN0IG5mdF9zZXRfZWxlbSBlbGVtOworCWludCBlcnI7CisKKwllcnIgPSByaGFzaHRhYmxlX3dhbGtfaW5pdCgmcHJpdi0+aHQsICZodGksIEdGUF9LRVJORUwpOworCWl0ZXItPmVyciA9IGVycjsKKwlpZiAoZXJyKQorCQlyZXR1cm47CisKKwllcnIgPSByaGFzaHRhYmxlX3dhbGtfc3RhcnQoJmh0aSk7CisJaWYgKGVyciAmJiBlcnIgIT0gLUVBR0FJTikgeworCQlpdGVyLT5lcnIgPSBlcnI7CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlICgoaGUgPSByaGFzaHRhYmxlX3dhbGtfbmV4dCgmaHRpKSkpIHsKKwkJaWYgKElTX0VSUihoZSkpIHsKKwkJCWVyciA9IFBUUl9FUlIoaGUpOworCQkJaWYgKGVyciAhPSAtRUFHQUlOKSB7CisJCQkJaXRlci0+ZXJyID0gZXJyOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpdGVyLT5jb3VudCA8IGl0ZXItPnNraXApCisJCQlnb3RvIGNvbnQ7CisJCWlmIChuZnRfc2V0X2VsZW1fZXhwaXJlZCgmaGUtPmV4dCkpCisJCQlnb3RvIGNvbnQ7CisJCWlmICghbmZ0X3NldF9lbGVtX2FjdGl2ZSgmaGUtPmV4dCwgaXRlci0+Z2VubWFzaykpCisJCQlnb3RvIGNvbnQ7CisKKwkJZWxlbS5wcml2ID0gaGU7CisKKwkJaXRlci0+ZXJyID0gaXRlci0+Zm4oY3R4LCBzZXQsIGl0ZXIsICZlbGVtKTsKKwkJaWYgKGl0ZXItPmVyciA8IDApCisJCQlnb3RvIG91dDsKKworY29udDoKKwkJaXRlci0+Y291bnQrKzsKKwl9CisKK291dDoKKwlyaGFzaHRhYmxlX3dhbGtfc3RvcCgmaHRpKTsKKwlyaGFzaHRhYmxlX3dhbGtfZXhpdCgmaHRpKTsKK30KKworc3RhdGljIHZvaWQgbmZ0X2hhc2hfZ2Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBuZnRfc2V0ICpzZXQ7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdjsKKwlzdHJ1Y3QgbmZ0X3NldF9nY19iYXRjaCAqZ2NiID0gTlVMTDsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyIGh0aTsKKwlpbnQgZXJyOworCisJcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmZ0X2hhc2gsIGdjX3dvcmsud29yayk7CisJc2V0ICA9IG5mdF9zZXRfY29udGFpbmVyX29mKHByaXYpOworCisJZXJyID0gcmhhc2h0YWJsZV93YWxrX2luaXQoJnByaXYtPmh0LCAmaHRpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZXJyKQorCQlnb3RvIHNjaGVkdWxlOworCisJZXJyID0gcmhhc2h0YWJsZV93YWxrX3N0YXJ0KCZodGkpOworCWlmIChlcnIgJiYgZXJyICE9IC1FQUdBSU4pCisJCWdvdG8gb3V0OworCisJd2hpbGUgKChoZSA9IHJoYXNodGFibGVfd2Fsa19uZXh0KCZodGkpKSkgeworCQlpZiAoSVNfRVJSKGhlKSkgeworCQkJaWYgKFBUUl9FUlIoaGUpICE9IC1FQUdBSU4pCisJCQkJZ290byBvdXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghbmZ0X3NldF9lbGVtX2V4cGlyZWQoJmhlLT5leHQpKQorCQkJY29udGludWU7CisJCWlmIChuZnRfc2V0X2VsZW1fbWFya19idXN5KCZoZS0+ZXh0KSkKKwkJCWNvbnRpbnVlOworCisJCWdjYiA9IG5mdF9zZXRfZ2NfYmF0Y2hfY2hlY2soc2V0LCBnY2IsIEdGUF9BVE9NSUMpOworCQlpZiAoZ2NiID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmcHJpdi0+aHQsICZoZS0+bm9kZSwgbmZ0X2hhc2hfcGFyYW1zKTsKKwkJYXRvbWljX2RlYygmc2V0LT5uZWxlbXMpOworCQluZnRfc2V0X2djX2JhdGNoX2FkZChnY2IsIGhlKTsKKwl9CitvdXQ6CisJcmhhc2h0YWJsZV93YWxrX3N0b3AoJmh0aSk7CisJcmhhc2h0YWJsZV93YWxrX2V4aXQoJmh0aSk7CisKKwluZnRfc2V0X2djX2JhdGNoX2NvbXBsZXRlKGdjYik7CitzY2hlZHVsZToKKwlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwgJnByaXYtPmdjX3dvcmssCisJCQkgICBuZnRfc2V0X2djX2ludGVydmFsKHNldCkpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG5mdF9oYXNoX3ByaXZzaXplKGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgbmZ0X2hhc2hfcGFyYW1zID0geworCS5oZWFkX29mZnNldAkJPSBvZmZzZXRvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSwgbm9kZSksCisJLmhhc2hmbgkJCT0gbmZ0X2hhc2hfa2V5LAorCS5vYmpfaGFzaGZuCQk9IG5mdF9oYXNoX29iaiwKKwkub2JqX2NtcGZuCQk9IG5mdF9oYXNoX2NtcCwKKwkuYXV0b21hdGljX3Nocmlua2luZwk9IHRydWUsCit9OworCitzdGF0aWMgaW50IG5mdF9oYXNoX2luaXQoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLAorCQkJIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQoreworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCXN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMgPSBuZnRfaGFzaF9wYXJhbXM7CisJaW50IGVycjsKKworCXBhcmFtcy5uZWxlbV9oaW50ID0gZGVzYy0+c2l6ZSA/OiBORlRfSEFTSF9FTEVNRU5UX0hJTlQ7CisJcGFyYW1zLmtleV9sZW4JICA9IHNldC0+a2xlbjsKKworCWVyciA9IHJoYXNodGFibGVfaW5pdCgmcHJpdi0+aHQsICZwYXJhbXMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJSU5JVF9ERUZFUlJBQkxFX1dPUksoJnByaXYtPmdjX3dvcmssIG5mdF9oYXNoX2djKTsKKwlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfVElNRU9VVCkKKwkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsICZwcml2LT5nY193b3JrLAorCQkJCSAgIG5mdF9zZXRfZ2NfaW50ZXJ2YWwoc2V0KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9oYXNoX2VsZW1fZGVzdHJveSh2b2lkICpwdHIsIHZvaWQgKmFyZykKK3sKKwluZnRfc2V0X2VsZW1fZGVzdHJveSgoY29uc3Qgc3RydWN0IG5mdF9zZXQgKilhcmcsIHB0cik7Cit9CisKK3N0YXRpYyB2b2lkIG5mdF9oYXNoX2Rlc3Ryb3koY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCkKK3sKKwlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+Z2Nfd29yayk7CisJcmhhc2h0YWJsZV9mcmVlX2FuZF9kZXN0cm95KCZwcml2LT5odCwgbmZ0X2hhc2hfZWxlbV9kZXN0cm95LAorCQkJCSAgICAodm9pZCAqKXNldCk7Cit9CisKK3N0YXRpYyBib29sIG5mdF9oYXNoX2VzdGltYXRlKGNvbnN0IHN0cnVjdCBuZnRfc2V0X2Rlc2MgKmRlc2MsIHUzMiBmZWF0dXJlcywKKwkJCSAgICAgIHN0cnVjdCBuZnRfc2V0X2VzdGltYXRlICplc3QpCit7CisJdW5zaWduZWQgaW50IGVzaXplOworCisJZXNpemUgPSBzaXplb2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0pOworCWlmIChkZXNjLT5zaXplKSB7CisJCWVzdC0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2gpICsKKwkJCSAgICByb3VuZHVwX3Bvd19vZl90d28oZGVzYy0+c2l6ZSAqIDQgLyAzKSAqCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtICopICsKKwkJCSAgICBkZXNjLT5zaXplICogZXNpemU7CisJfSBlbHNlIHsKKwkJLyogUmVzaXppbmcgaGFwcGVucyB3aGVuIHRoZSBsb2FkIGRyb3BzIGJlbG93IDMwJSBvciBnb2VzCisJCSAqIGFib3ZlIDc1JS4gVGhlIGF2ZXJhZ2Ugb2YgNTIuNSUgbG9hZCAoYXBwcm94aW1hdGVkIGJ5IDUwJSkKKwkJICogaXMgdXNlZCBmb3IgdGhlIHNpemUgZXN0aW1hdGlvbiBvZiB0aGUgaGFzaCBidWNrZXRzLAorCQkgKiBtZWFuaW5nIHdlIGNhbGN1bGF0ZSB0d28gYnVja2V0cyBwZXIgZWxlbWVudC4KKwkJICovCisJCWVzdC0+c2l6ZSA9IGVzaXplICsgMiAqIHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqKTsKKwl9CisKKwllc3QtPmNsYXNzID0gTkZUX1NFVF9DTEFTU19PXzE7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHN0cnVjdCBuZnRfc2V0X29wcyBuZnRfaGFzaF9vcHMgX19yZWFkX21vc3RseSA9IHsKKwkucHJpdnNpemUgICAgICAgPSBuZnRfaGFzaF9wcml2c2l6ZSwKKwkuZWxlbXNpemUJPSBvZmZzZXRvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSwgZXh0KSwKKwkuZXN0aW1hdGUJPSBuZnRfaGFzaF9lc3RpbWF0ZSwKKwkuaW5pdAkJPSBuZnRfaGFzaF9pbml0LAorCS5kZXN0cm95CT0gbmZ0X2hhc2hfZGVzdHJveSwKKwkuaW5zZXJ0CQk9IG5mdF9oYXNoX2luc2VydCwKKwkuYWN0aXZhdGUJPSBuZnRfaGFzaF9hY3RpdmF0ZSwKKwkuZGVhY3RpdmF0ZQk9IG5mdF9oYXNoX2RlYWN0aXZhdGUsCisJLnJlbW92ZQkJPSBuZnRfaGFzaF9yZW1vdmUsCisJLmxvb2t1cAkJPSBuZnRfaGFzaF9sb29rdXAsCisJLnVwZGF0ZQkJPSBuZnRfaGFzaF91cGRhdGUsCisJLndhbGsJCT0gbmZ0X2hhc2hfd2FsaywKKwkuZmVhdHVyZXMJPSBORlRfU0VUX01BUCB8IE5GVF9TRVRfVElNRU9VVCwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZnRfaGFzaF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBuZnRfcmVnaXN0ZXJfc2V0KCZuZnRfaGFzaF9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZ0X2hhc2hfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwluZnRfdW5yZWdpc3Rlcl9zZXQoJm5mdF9oYXNoX29wcyk7Cit9CisKK21vZHVsZV9pbml0KG5mdF9oYXNoX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KG5mdF9oYXNoX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Iik7CitNT0RVTEVfQUxJQVNfTkZUX1NFVCgpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfc2V0X3JidHJlZS5jIGIvbmV0L25ldGZpbHRlci9uZnRfc2V0X3JidHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjViZGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9zZXRfcmJ0cmVlLmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAwOSBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERldmVsb3BtZW50IG9mIHRoaXMgY29kZSBmdW5kZWQgYnkgQXN0YXJvIEFHIChodHRwOi8vd3d3LmFzdGFyby5jb20vKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KKworc3RhdGljIERFRklORV9TUElOTE9DSyhuZnRfcmJ0cmVlX2xvY2spOworCitzdHJ1Y3QgbmZ0X3JidHJlZSB7CisJc3RydWN0IHJiX3Jvb3QJCXJvb3Q7Cit9OworCitzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtIHsKKwlzdHJ1Y3QgcmJfbm9kZQkJbm9kZTsKKwlzdHJ1Y3QgbmZ0X3NldF9leHQJZXh0OworfTsKKworc3RhdGljIGJvb2wgbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQoY29uc3Qgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlKQoreworCXJldHVybiBuZnRfc2V0X2V4dF9leGlzdHMoJnJiZS0+ZXh0LCBORlRfU0VUX0VYVF9GTEFHUykgJiYKKwkgICAgICAgKCpuZnRfc2V0X2V4dF9mbGFncygmcmJlLT5leHQpICYgTkZUX1NFVF9FTEVNX0lOVEVSVkFMX0VORCk7Cit9CisKK3N0YXRpYyBib29sIG5mdF9yYnRyZWVfZXF1YWwoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwgY29uc3Qgdm9pZCAqdGhpcywKKwkJCSAgICAgY29uc3Qgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqaW50ZXJ2YWwpCit7CisJcmV0dXJuIG1lbWNtcCh0aGlzLCBuZnRfc2V0X2V4dF9rZXkoJmludGVydmFsLT5leHQpLCBzZXQtPmtsZW4pID09IDA7Cit9CisKK3N0YXRpYyBib29sIG5mdF9yYnRyZWVfbG9va3VwKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgICAgIGNvbnN0IHUzMiAqa2V5LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCit7CisJY29uc3Qgc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwljb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUsICppbnRlcnZhbCA9IE5VTEw7CisJdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX2N1cihuZXQpOworCWNvbnN0IHN0cnVjdCByYl9ub2RlICpwYXJlbnQ7CisJY29uc3Qgdm9pZCAqdGhpczsKKwlpbnQgZDsKKworCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKKwlwYXJlbnQgPSBwcml2LT5yb290LnJiX25vZGU7CisJd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7CisJCXJiZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7CisKKwkJdGhpcyA9IG5mdF9zZXRfZXh0X2tleSgmcmJlLT5leHQpOworCQlkID0gbWVtY21wKHRoaXMsIGtleSwgc2V0LT5rbGVuKTsKKwkJaWYgKGQgPCAwKSB7CisJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7CisJCQkvKiBJbiBjYXNlIG9mIGFkamFjZW50IHJhbmdlcywgd2UgYWx3YXlzIHNlZSB0aGUgaGlnaAorCQkJICogcGFydCBvZiB0aGUgcmFuZ2UgaW4gZmlyc3QgcGxhY2UsIGJlZm9yZSB0aGUgbG93IG9uZS4KKwkJCSAqIFNvIGRvbid0IHVwZGF0ZSBpbnRlcnZhbCBpZiB0aGUga2V5cyBhcmUgZXF1YWwuCisJCQkgKi8KKwkJCWlmIChpbnRlcnZhbCAmJiBuZnRfcmJ0cmVlX2VxdWFsKHNldCwgdGhpcywgaW50ZXJ2YWwpKQorCQkJCWNvbnRpbnVlOworCQkJaW50ZXJ2YWwgPSByYmU7CisJCX0gZWxzZSBpZiAoZCA+IDApCisJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX3JpZ2h0OworCQllbHNlIHsKKwkJCWlmICghbmZ0X3NldF9lbGVtX2FjdGl2ZSgmcmJlLT5leHQsIGdlbm1hc2spKSB7CisJCQkJcGFyZW50ID0gcGFyZW50LT5yYl9sZWZ0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHJiZSkpCisJCQkJZ290byBvdXQ7CisJCQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKKworCQkJKmV4dCA9ICZyYmUtPmV4dDsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCisJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX0lOVEVSVkFMICYmIGludGVydmFsICE9IE5VTEwgJiYKKwkgICAgbmZ0X3NldF9lbGVtX2FjdGl2ZSgmaW50ZXJ2YWwtPmV4dCwgZ2VubWFzaykgJiYKKwkgICAgIW5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKGludGVydmFsKSkgeworCQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKKwkJKmV4dCA9ICZpbnRlcnZhbC0+ZXh0OworCQlyZXR1cm4gdHJ1ZTsKKwl9CitvdXQ6CisJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IF9fbmZ0X3JidHJlZV9pbnNlcnQoY29uc3Qgc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJICAgICAgIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKm5ldywKKwkJCSAgICAgICBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCit7CisJc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwl1OCBnZW5tYXNrID0gbmZ0X2dlbm1hc2tfbmV4dChuZXQpOworCXN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50LCAqKnA7CisJaW50IGQ7CisKKwlwYXJlbnQgPSBOVUxMOworCXAgPSAmcHJpdi0+cm9vdC5yYl9ub2RlOworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCXBhcmVudCA9ICpwOworCQlyYmUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOworCQlkID0gbWVtY21wKG5mdF9zZXRfZXh0X2tleSgmcmJlLT5leHQpLAorCQkJICAgbmZ0X3NldF9leHRfa2V5KCZuZXctPmV4dCksCisJCQkgICBzZXQtPmtsZW4pOworCQlpZiAoZCA8IDApCisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoZCA+IDApCisJCQlwID0gJnBhcmVudC0+cmJfcmlnaHQ7CisJCWVsc2UgeworCQkJaWYgKG5mdF9zZXRfZWxlbV9hY3RpdmUoJnJiZS0+ZXh0LCBnZW5tYXNrKSkgeworCQkJCWlmIChuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChyYmUpICYmCisJCQkJICAgICFuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChuZXcpKQorCQkJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJCQllbHNlIGlmICghbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQocmJlKSAmJgorCQkJCQkgbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQobmV3KSkKKwkJCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQkJCWVsc2UgeworCQkJCQkqZXh0ID0gJnJiZS0+ZXh0OworCQkJCQlyZXR1cm4gLUVFWElTVDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmJfbGlua19ub2RlKCZuZXctPm5vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZuZXctPm5vZGUsICZwcml2LT5yb290KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZnRfcmJ0cmVlX2luc2VydChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0sCisJCQkgICAgIHN0cnVjdCBuZnRfc2V0X2V4dCAqKmV4dCkKK3sKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OworCWludCBlcnI7CisKKwlzcGluX2xvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CisJZXJyID0gX19uZnRfcmJ0cmVlX2luc2VydChuZXQsIHNldCwgcmJlLCBleHQpOworCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbmZ0X3JidHJlZV9yZW1vdmUoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCit7CisJc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OworCisJc3Bpbl9sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOworCXJiX2VyYXNlKCZyYmUtPm5vZGUsICZwcml2LT5yb290KTsKKwlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmZ0X3JidHJlZV9hY3RpdmF0ZShjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCQljb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQoreworCXN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZSA9IGVsZW0tPnByaXY7CisKKwluZnRfc2V0X2VsZW1fY2hhbmdlX2FjdGl2ZShuZXQsIHNldCwgJnJiZS0+ZXh0KTsKK30KKworc3RhdGljIHZvaWQgKm5mdF9yYnRyZWVfZGVhY3RpdmF0ZShjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJICAgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQoreworCWNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJY29uc3Qgc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IHByaXYtPnJvb3QucmJfbm9kZTsKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUsICp0aGlzID0gZWxlbS0+cHJpdjsKKwl1OCBnZW5tYXNrID0gbmZ0X2dlbm1hc2tfbmV4dChuZXQpOworCWludCBkOworCisJd2hpbGUgKHBhcmVudCAhPSBOVUxMKSB7CisJCXJiZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7CisKKwkJZCA9IG1lbWNtcChuZnRfc2V0X2V4dF9rZXkoJnJiZS0+ZXh0KSwgJmVsZW0tPmtleS52YWwsCisJCQkJCSAgIHNldC0+a2xlbik7CisJCWlmIChkIDwgMCkKKwkJCXBhcmVudCA9IHBhcmVudC0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoZCA+IDApCisJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX3JpZ2h0OworCQllbHNlIHsKKwkJCWlmICghbmZ0X3NldF9lbGVtX2FjdGl2ZSgmcmJlLT5leHQsIGdlbm1hc2spKSB7CisJCQkJcGFyZW50ID0gcGFyZW50LT5yYl9sZWZ0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKG5mdF9yYnRyZWVfaW50ZXJ2YWxfZW5kKHJiZSkgJiYKKwkJCSAgICAhbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQodGhpcykpIHsKKwkJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKCFuZnRfcmJ0cmVlX2ludGVydmFsX2VuZChyYmUpICYmCisJCQkJICAgbmZ0X3JidHJlZV9pbnRlcnZhbF9lbmQodGhpcykpIHsKKwkJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX3JpZ2h0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbmZ0X3NldF9lbGVtX2NoYW5nZV9hY3RpdmUobmV0LCBzZXQsICZyYmUtPmV4dCk7CisJCQlyZXR1cm4gcmJlOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBuZnRfcmJ0cmVlX3dhbGsoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJICAgIHN0cnVjdCBuZnRfc2V0X2l0ZXIgKml0ZXIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7CisJc3RydWN0IG5mdF9zZXRfZWxlbSBlbGVtOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCisJc3Bpbl9sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOworCWZvciAobm9kZSA9IHJiX2ZpcnN0KCZwcml2LT5yb290KTsgbm9kZSAhPSBOVUxMOyBub2RlID0gcmJfbmV4dChub2RlKSkgeworCQlyYmUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKKworCQlpZiAoaXRlci0+Y291bnQgPCBpdGVyLT5za2lwKQorCQkJZ290byBjb250OworCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJnJiZS0+ZXh0LCBpdGVyLT5nZW5tYXNrKSkKKwkJCWdvdG8gY29udDsKKworCQllbGVtLnByaXYgPSByYmU7CisKKwkJaXRlci0+ZXJyID0gaXRlci0+Zm4oY3R4LCBzZXQsIGl0ZXIsICZlbGVtKTsKKwkJaWYgKGl0ZXItPmVyciA8IDApIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOworCQkJcmV0dXJuOworCQl9Citjb250OgorCQlpdGVyLT5jb3VudCsrOworCX0KKwlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBuZnRfcmJ0cmVlX3ByaXZzaXplKGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKK3sKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBuZnRfcmJ0cmVlKTsKK30KKworc3RhdGljIGludCBuZnRfcmJ0cmVlX2luaXQoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCSAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2Rlc2MgKmRlc2MsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgbmxhW10pCit7CisJc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKworCXByaXYtPnJvb3QgPSBSQl9ST09UOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZnRfcmJ0cmVlX2Rlc3Ryb3koY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCkKK3sKKwlzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCXN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKworCXdoaWxlICgobm9kZSA9IHByaXYtPnJvb3QucmJfbm9kZSkgIT0gTlVMTCkgeworCQlyYl9lcmFzZShub2RlLCAmcHJpdi0+cm9vdCk7CisJCXJiZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOworCQluZnRfc2V0X2VsZW1fZGVzdHJveShzZXQsIHJiZSk7CisJfQorfQorCitzdGF0aWMgYm9vbCBuZnRfcmJ0cmVlX2VzdGltYXRlKGNvbnN0IHN0cnVjdCBuZnRfc2V0X2Rlc2MgKmRlc2MsIHUzMiBmZWF0dXJlcywKKwkJCQlzdHJ1Y3QgbmZ0X3NldF9lc3RpbWF0ZSAqZXN0KQoreworCXVuc2lnbmVkIGludCBuc2l6ZTsKKworCW5zaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0pOworCWlmIChkZXNjLT5zaXplKQorCQllc3QtPnNpemUgPSBzaXplb2Yoc3RydWN0IG5mdF9yYnRyZWUpICsgZGVzYy0+c2l6ZSAqIG5zaXplOworCWVsc2UKKwkJZXN0LT5zaXplID0gbnNpemU7CisKKwllc3QtPmNsYXNzID0gTkZUX1NFVF9DTEFTU19PX0xPR19OOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X3NldF9vcHMgbmZ0X3JidHJlZV9vcHMgX19yZWFkX21vc3RseSA9IHsKKwkucHJpdnNpemUJPSBuZnRfcmJ0cmVlX3ByaXZzaXplLAorCS5lbGVtc2l6ZQk9IG9mZnNldG9mKHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIGV4dCksCisJLmVzdGltYXRlCT0gbmZ0X3JidHJlZV9lc3RpbWF0ZSwKKwkuaW5pdAkJPSBuZnRfcmJ0cmVlX2luaXQsCisJLmRlc3Ryb3kJPSBuZnRfcmJ0cmVlX2Rlc3Ryb3ksCisJLmluc2VydAkJPSBuZnRfcmJ0cmVlX2luc2VydCwKKwkucmVtb3ZlCQk9IG5mdF9yYnRyZWVfcmVtb3ZlLAorCS5kZWFjdGl2YXRlCT0gbmZ0X3JidHJlZV9kZWFjdGl2YXRlLAorCS5hY3RpdmF0ZQk9IG5mdF9yYnRyZWVfYWN0aXZhdGUsCisJLmxvb2t1cAkJPSBuZnRfcmJ0cmVlX2xvb2t1cCwKKwkud2FsawkJPSBuZnRfcmJ0cmVlX3dhbGssCisJLmZlYXR1cmVzCT0gTkZUX1NFVF9JTlRFUlZBTCB8IE5GVF9TRVRfTUFQLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mdF9yYnRyZWVfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbmZ0X3JlZ2lzdGVyX3NldCgmbmZ0X3JidHJlZV9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZ0X3JidHJlZV9tb2R1bGVfZXhpdCh2b2lkKQoreworCW5mdF91bnJlZ2lzdGVyX3NldCgmbmZ0X3JidHJlZV9vcHMpOworfQorCittb2R1bGVfaW5pdChuZnRfcmJ0cmVlX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KG5mdF9yYnRyZWVfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4iKTsKK01PRFVMRV9BTElBU19ORlRfU0VUKCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1JBVEVFU1QuYyBiL25ldC9uZXRmaWx0ZXIveHRfUkFURUVTVC5jCmluZGV4IDUxNTEzMWYuLmRiZDZjNGEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfUkFURUVTVC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfUkFURUVTVC5jCkBAIC0yNCw3ICsyNCw2IEBACiAjZGVmaW5lIFJBVEVFU1RfSFNJWkUJMTYKIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCByYXRlZXN0X2hhc2hbUkFURUVTVF9IU0laRV0gX19yZWFkX21vc3RseTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgamhhc2hfcm5kIF9fcmVhZF9tb3N0bHk7Ci1zdGF0aWMgYm9vbCBybmRfaW5pdGVkIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgeHRfcmF0ZWVzdF9oYXNoKGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC05OSwxMCArOTgsNyBAQAogCX0gY2ZnOwogCWludCByZXQ7CiAKLQlpZiAodW5saWtlbHkoIXJuZF9pbml0ZWQpKSB7Ci0JCWdldF9yYW5kb21fYnl0ZXMoJmpoYXNoX3JuZCwgc2l6ZW9mKGpoYXNoX3JuZCkpOwotCQlybmRfaW5pdGVkID0gdHJ1ZTsKLQl9CisJbmV0X2dldF9yYW5kb21fb25jZSgmamhhc2hfcm5kLCBzaXplb2Yoamhhc2hfcm5kKSk7CiAKIAllc3QgPSB4dF9yYXRlZXN0X2xvb2t1cChpbmZvLT5uYW1lKTsKIAlpZiAoZXN0KSB7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jIGIvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYwppbmRleCBlMTE4Mzk3Li44NzJkYjJkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMKQEAgLTExMCwxOCArMTEwLDE0IEBACiAJaWYgKGluZm8tPm1zcyA9PSBYVF9UQ1BNU1NfQ0xBTVBfUE1UVSkgewogCQlzdHJ1Y3QgbmV0ICpuZXQgPSBwYXItPm5ldDsKIAkJdW5zaWduZWQgaW50IGluX210dSA9IHRjcG1zc19yZXZlcnNlX210dShuZXQsIHNrYiwgZmFtaWx5KTsKKwkJdW5zaWduZWQgaW50IG1pbl9tdHUgPSBtaW4oZHN0X210dShza2JfZHN0KHNrYikpLCBpbl9tdHUpOwogCi0JCWlmIChkc3RfbXR1KHNrYl9kc3Qoc2tiKSkgPD0gbWlubGVuKSB7CisJCWlmIChtaW5fbXR1IDw9IG1pbmxlbikgewogCQkJbmV0X2Vycl9yYXRlbGltaXRlZCgidW5rbm93biBvciBpbnZhbGlkIHBhdGgtTVRVICgldSlcbiIsCi0JCQkJCSAgICBkc3RfbXR1KHNrYl9kc3Qoc2tiKSkpOworCQkJCQkgICAgbWluX210dSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQkJaWYgKGluX210dSA8PSBtaW5sZW4pIHsKLQkJCW5ldF9lcnJfcmF0ZWxpbWl0ZWQoInVua25vd24gb3IgaW52YWxpZCBwYXRoLU1UVSAoJXUpXG4iLAotCQkJCQkgICAgaW5fbXR1KTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQluZXdtc3MgPSBtaW4oZHN0X210dShza2JfZHN0KHNrYikpLCBpbl9tdHUpIC0gbWlubGVuOworCQluZXdtc3MgPSBtaW5fbXR1IC0gbWlubGVuOwogCX0gZWxzZQogCQluZXdtc3MgPSBpbmZvLT5tc3M7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfVEVFLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1RFRS5jCmluZGV4IDZlNTdhMzkuLjA0NzFkYjQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfVEVFLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9URUUuYwpAQCAtODksNiArODksOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChpbmZvLT5vaWZbMF0pIHsKKwkJaW50IHJldDsKKwogCQlpZiAoaW5mby0+b2lmW3NpemVvZihpbmZvLT5vaWYpLTFdICE9ICdcMCcpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTAxLDcgKzEwMywxMSBAQAogCQlwcml2LT5ub3RpZmllci5ub3RpZmllcl9jYWxsID0gdGVlX25ldGRldl9ldmVudDsKIAkJaW5mby0+cHJpdiAgICA9IHByaXY7CiAKLQkJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZwcml2LT5ub3RpZmllcik7CisJCXJldCA9IHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmcHJpdi0+bm90aWZpZXIpOworCQlpZiAocmV0KSB7CisJCQlrZnJlZShwcml2KTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9IGVsc2UKIAkJaW5mby0+cHJpdiA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfVFBST1hZLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1RQUk9YWS5jCmluZGV4IDdmNDQxNGQuLjY2M2M0YzMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfVFBST1hZLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9UUFJPWFkuYwpAQCAtMTI3LDYgKzEyNyw4IEBACiAJCQkJCQkgICAgZGFkZHIsIGRwb3J0LAogCQkJCQkJICAgIGluLT5pZmluZGV4KTsKIAorCQkJaWYgKHNrICYmICFhdG9taWNfaW5jX25vdF96ZXJvKCZzay0+c2tfcmVmY250KSkKKwkJCQlzayA9IE5VTEw7CiAJCQkvKiBOT1RFOiB3ZSByZXR1cm4gbGlzdGVuZXJzIGV2ZW4gaWYgYm91bmQgdG8KIAkJCSAqIDAuMC4wLjAsIHRob3NlIGFyZSBmaWx0ZXJlZCBvdXQgaW4KIAkJCSAqIHh0X3NvY2tldCwgc2luY2UgeHRfVFBST1hZIG5lZWRzIDAgYm91bmQKQEAgLTE5NSw2ICsxOTcsOCBAQAogCQkJCQkJICAgZGFkZHIsIG50b2hzKGRwb3J0KSwKIAkJCQkJCSAgIGluLT5pZmluZGV4KTsKIAorCQkJaWYgKHNrICYmICFhdG9taWNfaW5jX25vdF96ZXJvKCZzay0+c2tfcmVmY250KSkKKwkJCQlzayA9IE5VTEw7CiAJCQkvKiBOT1RFOiB3ZSByZXR1cm4gbGlzdGVuZXJzIGV2ZW4gaWYgYm91bmQgdG8KIAkJCSAqIDAuMC4wLjAsIHRob3NlIGFyZSBmaWx0ZXJlZCBvdXQgaW4KIAkJCSAqIHh0X3NvY2tldCwgc2luY2UgeHRfVFBST1hZIG5lZWRzIDAgYm91bmQKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY29ubmxpbWl0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5saW1pdC5jCmluZGV4IDk5YmJjODIuLmI2ZGMzMjIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfY29ubmxpbWl0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9jb25ubGltaXQuYwpAQCAtMzY2LDE0ICszNjYsOCBAQAogCXVuc2lnbmVkIGludCBpOwogCWludCByZXQ7CiAKLQlpZiAodW5saWtlbHkoIWNvbm5saW1pdF9ybmQpKSB7Ci0JCXVfaW50MzJfdCByYW5kOworCW5ldF9nZXRfcmFuZG9tX29uY2UoJmNvbm5saW1pdF9ybmQsIHNpemVvZihjb25ubGltaXRfcm5kKSk7CiAKLQkJZG8gewotCQkJZ2V0X3JhbmRvbV9ieXRlcygmcmFuZCwgc2l6ZW9mKHJhbmQpKTsKLQkJfSB3aGlsZSAoIXJhbmQpOwotCQljbXB4Y2hnKCZjb25ubGltaXRfcm5kLCAwLCByYW5kKTsKLQl9CiAJcmV0ID0gbmZfY3RfbDNwcm90b190cnlfbW9kdWxlX2dldChwYXItPmZhbWlseSk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfaW5mbygiY2Fubm90IGxvYWQgY29ubnRyYWNrIHN1cHBvcnQgZm9yICIKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCmluZGV4IDE4ODQwNGI5Li5hM2I4ZjY5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm50cmFjay5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubnRyYWNrLmMKQEAgLTIzMywxMCArMjMzLDggQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGluZm8tPm1hdGNoX2ZsYWdzICYgWFRfQ09OTlRSQUNLX0VYUElSRVMpIHsKLQkJdW5zaWduZWQgbG9uZyBleHBpcmVzID0gMDsKKwkJdW5zaWduZWQgbG9uZyBleHBpcmVzID0gbmZfY3RfZXhwaXJlcyhjdCkgLyBIWjsKIAotCQlpZiAodGltZXJfcGVuZGluZygmY3QtPnRpbWVvdXQpKQotCQkJZXhwaXJlcyA9IChjdC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykgLyBIWjsKIAkJaWYgKChleHBpcmVzID49IGluZm8tPmV4cGlyZXNfbWluICYmCiAJCSAgICBleHBpcmVzIDw9IGluZm8tPmV4cGlyZXNfbWF4KSBeCiAJCSAgICAhKGluZm8tPmludmVydF9mbGFncyAmIFhUX0NPTk5UUkFDS19FWFBJUkVTKSkKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jCmluZGV4IDE3ODY5NjguLjJmYWIwYzYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYwpAQCAtNTYsNiArNTYsNyBAQAogfQogCiAvKiBuZWVkIHRvIGRlY2xhcmUgdGhpcyBhdCB0aGUgdG9wICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkbF9maWxlX29wc192MTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRsX2ZpbGVfb3BzOwogCiAvKiBoYXNoIHRhYmxlIGNyYXAgKi8KQEAgLTg2LDggKzg3LDggQEAKIAl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CQkvKiBwcmVjYWxjdWxhdGVkIGV4cGlyeSB0aW1lICovCiAJc3RydWN0IHsKIAkJdW5zaWduZWQgbG9uZyBwcmV2OwkvKiBsYXN0IG1vZGlmaWNhdGlvbiAqLwotCQl1X2ludDMyX3QgY3JlZGl0OwotCQl1X2ludDMyX3QgY3JlZGl0X2NhcCwgY29zdDsKKwkJdV9pbnQ2NF90IGNyZWRpdDsKKwkJdV9pbnQ2NF90IGNyZWRpdF9jYXAsIGNvc3Q7CiAJfSByYXRlaW5mbzsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogfTsKQEAgLTk4LDcgKzk5LDcgQEAKIAl1X2ludDhfdCBmYW1pbHk7CiAJYm9vbCBybmRfaW5pdGlhbGl6ZWQ7CiAKLQlzdHJ1Y3QgaGFzaGxpbWl0X2NmZzEgY2ZnOwkvKiBjb25maWcgKi8KKwlzdHJ1Y3QgaGFzaGxpbWl0X2NmZzIgY2ZnOwkvKiBjb25maWcgKi8KIAogCS8qIHVzZWQgaW50ZXJuYWxseSAqLwogCXNwaW5sb2NrX3QgbG9jazsJCS8qIGxvY2sgZm9yIGxpc3RfaGVhZCAqLwpAQCAtMTE0LDYgKzExNSwzMCBAQAogCXN0cnVjdCBobGlzdF9oZWFkIGhhc2hbMF07CS8qIGhhc2h0YWJsZSBpdHNlbGYgKi8KIH07CiAKK3N0YXRpYyBpbnQKK2NmZ19jb3B5KHN0cnVjdCBoYXNobGltaXRfY2ZnMiAqdG8sIHZvaWQgKmZyb20sIGludCByZXZpc2lvbikKK3sKKwlpZiAocmV2aXNpb24gPT0gMSkgeworCQlzdHJ1Y3QgaGFzaGxpbWl0X2NmZzEgKmNmZyA9IChzdHJ1Y3QgaGFzaGxpbWl0X2NmZzEgKilmcm9tOworCisJCXRvLT5tb2RlID0gY2ZnLT5tb2RlOworCQl0by0+YXZnID0gY2ZnLT5hdmc7CisJCXRvLT5idXJzdCA9IGNmZy0+YnVyc3Q7CisJCXRvLT5zaXplID0gY2ZnLT5zaXplOworCQl0by0+bWF4ID0gY2ZnLT5tYXg7CisJCXRvLT5nY19pbnRlcnZhbCA9IGNmZy0+Z2NfaW50ZXJ2YWw7CisJCXRvLT5leHBpcmUgPSBjZmctPmV4cGlyZTsKKwkJdG8tPnNyY21hc2sgPSBjZmctPnNyY21hc2s7CisJCXRvLT5kc3RtYXNrID0gY2ZnLT5kc3RtYXNrOworCX0gZWxzZSBpZiAocmV2aXNpb24gPT0gMikgeworCQltZW1jcHkodG8sIGZyb20sIHNpemVvZihzdHJ1Y3QgaGFzaGxpbWl0X2NmZzIpKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIERFRklORV9NVVRFWChoYXNobGltaXRfbXV0ZXgpOwkvKiBwcm90ZWN0cyBodGFibGVzIGxpc3QgKi8KIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaGFzaGxpbWl0X2NhY2hlcCBfX3JlYWRfbW9zdGx5OwogCkBAIC0yMTUsMTYgKzI0MCwxOCBAQAogfQogc3RhdGljIHZvaWQgaHRhYmxlX2djKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKLXN0YXRpYyBpbnQgaHRhYmxlX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqbWluZm8sCi0JCQkgdV9pbnQ4X3QgZmFtaWx5KQorc3RhdGljIGludCBodGFibGVfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGhhc2hsaW1pdF9jZmcyICpjZmcsCisJCQkgY29uc3QgY2hhciAqbmFtZSwgdV9pbnQ4X3QgZmFtaWx5LAorCQkJIHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICoqb3V0X2hpbmZvLAorCQkJIGludCByZXZpc2lvbikKIHsKIAlzdHJ1Y3QgaGFzaGxpbWl0X25ldCAqaGFzaGxpbWl0X25ldCA9IGhhc2hsaW1pdF9wZXJuZXQobmV0KTsKIAlzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm87Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0JdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IHNpemUsIGk7CisJaW50IHJldDsKIAotCWlmIChtaW5mby0+Y2ZnLnNpemUpIHsKLQkJc2l6ZSA9IG1pbmZvLT5jZmcuc2l6ZTsKKwlpZiAoY2ZnLT5zaXplKSB7CisJCXNpemUgPSBjZmctPnNpemU7CiAJfSBlbHNlIHsKIAkJc2l6ZSA9ICh0b3RhbHJhbV9wYWdlcyA8PCBQQUdFX1NISUZUKSAvIDE2Mzg0IC8KIAkJICAgICAgIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKTsKQEAgLTIzOCwxMCArMjY1LDE0IEBACiAJICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSAqIHNpemUpOwogCWlmIChoaW5mbyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQltaW5mby0+aGluZm8gPSBoaW5mbzsKKwkqb3V0X2hpbmZvID0gaGluZm87CiAKIAkvKiBjb3B5IG1hdGNoIGNvbmZpZyBpbnRvIGhhc2h0YWJsZSBjb25maWcgKi8KLQltZW1jcHkoJmhpbmZvLT5jZmcsICZtaW5mby0+Y2ZnLCBzaXplb2YoaGluZm8tPmNmZykpOworCXJldCA9IGNmZ19jb3B5KCZoaW5mby0+Y2ZnLCAodm9pZCAqKWNmZywgMik7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJaGluZm8tPmNmZy5zaXplID0gc2l6ZTsKIAlpZiAoaGluZm8tPmNmZy5tYXggPT0gMCkKIAkJaGluZm8tPmNmZy5tYXggPSA4ICogaGluZm8tPmNmZy5zaXplOwpAQCAtMjU1LDE3ICsyODYsMTggQEAKIAloaW5mby0+Y291bnQgPSAwOwogCWhpbmZvLT5mYW1pbHkgPSBmYW1pbHk7CiAJaGluZm8tPnJuZF9pbml0aWFsaXplZCA9IGZhbHNlOwotCWhpbmZvLT5uYW1lID0ga3N0cmR1cChtaW5mby0+bmFtZSwgR0ZQX0tFUk5FTCk7CisJaGluZm8tPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOwogCWlmICghaGluZm8tPm5hbWUpIHsKIAkJdmZyZWUoaGluZm8pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJc3Bpbl9sb2NrX2luaXQoJmhpbmZvLT5sb2NrKTsKIAotCWhpbmZvLT5wZGUgPSBwcm9jX2NyZWF0ZV9kYXRhKG1pbmZvLT5uYW1lLCAwLAorCWhpbmZvLT5wZGUgPSBwcm9jX2NyZWF0ZV9kYXRhKG5hbWUsIDAsCiAJCShmYW1pbHkgPT0gTkZQUk9UT19JUFY0KSA/CiAJCWhhc2hsaW1pdF9uZXQtPmlwdF9oYXNobGltaXQgOiBoYXNobGltaXRfbmV0LT5pcDZ0X2hhc2hsaW1pdCwKLQkJJmRsX2ZpbGVfb3BzLCBoaW5mbyk7CisJCShyZXZpc2lvbiA9PSAxKSA/ICZkbF9maWxlX29wc192MSA6ICZkbF9maWxlX29wcywKKwkJaGluZm8pOwogCWlmIChoaW5mby0+cGRlID09IE5VTEwpIHsKIAkJa2ZyZWUoaGluZm8tPm5hbWUpOwogCQl2ZnJlZShoaW5mbyk7CkBAIC0zOTgsNyArNDMwLDggQEAKICAgIChzbG93ZXN0IHVzZXJzcGFjZSB0b29sIGFsbG93cyksIHdoaWNoIG1lYW5zCiAgICBDUkVESVRTX1BFUl9KSUZGWSpIWio2MCo2MCoyNCA8IDJeMzIgaWUuCiAqLwotI2RlZmluZSBNQVhfQ1BKICgweEZGRkZGRkZGIC8gKEhaKjYwKjYwKjI0KSkKKyNkZWZpbmUgTUFYX0NQSl92MSAoMHhGRkZGRkZGRiAvIChIWio2MCo2MCoyNCkpCisjZGVmaW5lIE1BWF9DUEogKDB4RkZGRkZGRkZGRkZGRkZGRiAvIChIWio2MCo2MCoyNCkpCiAKIC8qIFJlcGVhdGVkIHNoaWZ0IGFuZCBvciBnaXZlcyB1cyBhbGwgMXMsIGZpbmFsIHNoaWZ0IGFuZCBhZGQgMSBnaXZlcwogICogdXMgdGhlIHBvd2VyIG9mIDIgYmVsb3cgdGhlIHRoZW9yZXRpY2FsIG1heCwgc28gR0NDIHNpbXBseSBkb2VzIGEKQEAgLTQwOCw5ICs0NDEsMTIgQEAKICNkZWZpbmUgX1BPVzJfQkVMT1c4KHgpIChfUE9XMl9CRUxPVzQoeCl8X1BPVzJfQkVMT1c0KCh4KT4+NCkpCiAjZGVmaW5lIF9QT1cyX0JFTE9XMTYoeCkgKF9QT1cyX0JFTE9XOCh4KXxfUE9XMl9CRUxPVzgoKHgpPj44KSkKICNkZWZpbmUgX1BPVzJfQkVMT1czMih4KSAoX1BPVzJfQkVMT1cxNih4KXxfUE9XMl9CRUxPVzE2KCh4KT4+MTYpKQorI2RlZmluZSBfUE9XMl9CRUxPVzY0KHgpIChfUE9XMl9CRUxPVzMyKHgpfF9QT1cyX0JFTE9XMzIoKHgpPj4zMikpCiAjZGVmaW5lIFBPVzJfQkVMT1czMih4KSAoKF9QT1cyX0JFTE9XMzIoeCk+PjEpICsgMSkKKyNkZWZpbmUgUE9XMl9CRUxPVzY0KHgpICgoX1BPVzJfQkVMT1c2NCh4KT4+MSkgKyAxKQogCi0jZGVmaW5lIENSRURJVFNfUEVSX0pJRkZZIFBPVzJfQkVMT1czMihNQVhfQ1BKKQorI2RlZmluZSBDUkVESVRTX1BFUl9KSUZGWSBQT1cyX0JFTE9XNjQoTUFYX0NQSikKKyNkZWZpbmUgQ1JFRElUU19QRVJfSklGRllfdjEgUE9XMl9CRUxPVzMyKE1BWF9DUEpfdjEpCiAKIC8qIGluIGJ5dGUgbW9kZSwgdGhlIGxvd2VzdCBwb3NzaWJsZSByYXRlIGlzIG9uZSBwYWNrZXQvc2Vjb25kLgogICogY3JlZGl0X2NhcCBpcyB1c2VkIGFzIGEgY291bnRlciB0aGF0IHRlbGxzIHVzIGhvdyBtYW55IHRpbWVzIHdlIGNhbgpAQCAtNDI1LDE0ICs0NjEsMjUgQEAKIH0KIAogLyogUHJlY2lzaW9uIHNhdmVyLiAqLwotc3RhdGljIHUzMiB1c2VyMmNyZWRpdHModTMyIHVzZXIpCitzdGF0aWMgdTY0IHVzZXIyY3JlZGl0cyh1NjQgdXNlciwgaW50IHJldmlzaW9uKQogewotCS8qIElmIG11bHRpcGx5aW5nIHdvdWxkIG92ZXJmbG93Li4uICovCi0JaWYgKHVzZXIgPiAweEZGRkZGRkZGIC8gKEhaKkNSRURJVFNfUEVSX0pJRkZZKSkKLQkJLyogRGl2aWRlIGZpcnN0LiAqLwotCQlyZXR1cm4gKHVzZXIgLyBYVF9IQVNITElNSVRfU0NBTEUpICogSFogKiBDUkVESVRTX1BFUl9KSUZGWTsKKwlpZiAocmV2aXNpb24gPT0gMSkgeworCQkvKiBJZiBtdWx0aXBseWluZyB3b3VsZCBvdmVyZmxvdy4uLiAqLworCQlpZiAodXNlciA+IDB4RkZGRkZGRkYgLyAoSFoqQ1JFRElUU19QRVJfSklGRllfdjEpKQorCQkJLyogRGl2aWRlIGZpcnN0LiAqLworCQkJcmV0dXJuIGRpdjY0X3U2NCh1c2VyLCBYVF9IQVNITElNSVRfU0NBTEUpCisJCQkJKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZX3YxOwogCi0JcmV0dXJuICh1c2VyICogSFogKiBDUkVESVRTX1BFUl9KSUZGWSkgLyBYVF9IQVNITElNSVRfU0NBTEU7CisJCXJldHVybiBkaXY2NF91NjQodXNlciAqIEhaICogQ1JFRElUU19QRVJfSklGRllfdjEsCisJCQkJIFhUX0hBU0hMSU1JVF9TQ0FMRSk7CisJfSBlbHNlIHsKKwkJaWYgKHVzZXIgPiAweEZGRkZGRkZGRkZGRkZGRkYgLyAoSFoqQ1JFRElUU19QRVJfSklGRlkpKQorCQkJcmV0dXJuIGRpdjY0X3U2NCh1c2VyLCBYVF9IQVNITElNSVRfU0NBTEVfdjIpCisJCQkJKiBIWiAqIENSRURJVFNfUEVSX0pJRkZZOworCisJCXJldHVybiBkaXY2NF91NjQodXNlciAqIEhaICogQ1JFRElUU19QRVJfSklGRlksCisJCQkJIFhUX0hBU0hMSU1JVF9TQ0FMRV92Mik7CisJfQogfQogCiBzdGF0aWMgdTMyIHVzZXIyY3JlZGl0c19ieXRlKHUzMiB1c2VyKQpAQCAtNDQyLDEwICs0ODksMTEgQEAKIAlyZXR1cm4gKHUzMikgKHVzID4+IDMyKTsKIH0KIAotc3RhdGljIHZvaWQgcmF0ZWluZm9fcmVjYWxjKHN0cnVjdCBkc3RoYXNoX2VudCAqZGgsIHVuc2lnbmVkIGxvbmcgbm93LCB1MzIgbW9kZSkKK3N0YXRpYyB2b2lkIHJhdGVpbmZvX3JlY2FsYyhzdHJ1Y3QgZHN0aGFzaF9lbnQgKmRoLCB1bnNpZ25lZCBsb25nIG5vdywKKwkJCSAgICB1MzIgbW9kZSwgaW50IHJldmlzaW9uKQogewogCXVuc2lnbmVkIGxvbmcgZGVsdGEgPSBub3cgLSBkaC0+cmF0ZWluZm8ucHJldjsKLQl1MzIgY2FwOworCXU2NCBjYXAsIGNwajsKIAogCWlmIChkZWx0YSA9PSAwKQogCQlyZXR1cm47CkBAIC00NTMsNyArNTAxLDcgQEAKIAlkaC0+cmF0ZWluZm8ucHJldiA9IG5vdzsKIAogCWlmIChtb2RlICYgWFRfSEFTSExJTUlUX0JZVEVTKSB7Ci0JCXUzMiB0bXAgPSBkaC0+cmF0ZWluZm8uY3JlZGl0OworCQl1NjQgdG1wID0gZGgtPnJhdGVpbmZvLmNyZWRpdDsKIAkJZGgtPnJhdGVpbmZvLmNyZWRpdCArPSBDUkVESVRTX1BFUl9KSUZGWV9CWVRFUyAqIGRlbHRhOwogCQljYXAgPSBDUkVESVRTX1BFUl9KSUZGWV9CWVRFUyAqIEhaOwogCQlpZiAodG1wID49IGRoLT5yYXRlaW5mby5jcmVkaXQpIHsvKiBvdmVyZmxvdyAqLwpAQCAtNDYxLDcgKzUwOSw5IEBACiAJCQlyZXR1cm47CiAJCX0KIAl9IGVsc2UgewotCQlkaC0+cmF0ZWluZm8uY3JlZGl0ICs9IGRlbHRhICogQ1JFRElUU19QRVJfSklGRlk7CisJCWNwaiA9IChyZXZpc2lvbiA9PSAxKSA/CisJCQlDUkVESVRTX1BFUl9KSUZGWV92MSA6IENSRURJVFNfUEVSX0pJRkZZOworCQlkaC0+cmF0ZWluZm8uY3JlZGl0ICs9IGRlbHRhICogY3BqOwogCQljYXAgPSBkaC0+cmF0ZWluZm8uY3JlZGl0X2NhcDsKIAl9CiAJaWYgKGRoLT5yYXRlaW5mby5jcmVkaXQgPiBjYXApCkBAIC00NjksNyArNTE5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgcmF0ZWluZm9faW5pdChzdHJ1Y3QgZHN0aGFzaF9lbnQgKmRoLAotCQkJICBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8pCisJCQkgIHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbywgaW50IHJldmlzaW9uKQogewogCWRoLT5yYXRlaW5mby5wcmV2ID0gamlmZmllczsKIAlpZiAoaGluZm8tPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0JZVEVTKSB7CkBAIC00NzgsOCArNTI4LDggQEAKIAkJZGgtPnJhdGVpbmZvLmNyZWRpdF9jYXAgPSBoaW5mby0+Y2ZnLmJ1cnN0OwogCX0gZWxzZSB7CiAJCWRoLT5yYXRlaW5mby5jcmVkaXQgPSB1c2VyMmNyZWRpdHMoaGluZm8tPmNmZy5hdmcgKgotCQkJCQkJICAgaGluZm8tPmNmZy5idXJzdCk7Ci0JCWRoLT5yYXRlaW5mby5jb3N0ID0gdXNlcjJjcmVkaXRzKGhpbmZvLT5jZmcuYXZnKTsKKwkJCQkJCSAgIGhpbmZvLT5jZmcuYnVyc3QsIHJldmlzaW9uKTsKKwkJZGgtPnJhdGVpbmZvLmNvc3QgPSB1c2VyMmNyZWRpdHMoaGluZm8tPmNmZy5hdmcsIHJldmlzaW9uKTsKIAkJZGgtPnJhdGVpbmZvLmNyZWRpdF9jYXAgPSBkaC0+cmF0ZWluZm8uY3JlZGl0OwogCX0KIH0KQEAgLTYwMywxNSArNjUzLDE1IEBACiB9CiAKIHN0YXRpYyBib29sCi1oYXNobGltaXRfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoraGFzaGxpbWl0X210X2NvbW1vbihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIsCisJCSAgICBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaGluZm8sCisJCSAgICBjb25zdCBzdHJ1Y3QgaGFzaGxpbWl0X2NmZzIgKmNmZywgaW50IHJldmlzaW9uKQogewotCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwotCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbyA9IGluZm8tPmhpbmZvOwogCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAlzdHJ1Y3QgZHN0aGFzaF9lbnQgKmRoOwogCXN0cnVjdCBkc3RoYXNoX2RzdCBkc3Q7CiAJYm9vbCByYWNlID0gZmFsc2U7Ci0JdTMyIGNvc3Q7CisJdTY0IGNvc3Q7CiAKIAlpZiAoaGFzaGxpbWl0X2luaXRfZHN0KGhpbmZvLCAmZHN0LCBza2IsIHBhci0+dGhvZmYpIDwgMCkKIAkJZ290byBob3Rkcm9wOwpAQCAtNjI2LDE4ICs2NzYsMTggQEAKIAkJfSBlbHNlIGlmIChyYWNlKSB7CiAJCQkvKiBBbHJlYWR5IGdvdCBhbiBlbnRyeSwgdXBkYXRlIGV4cGlyYXRpb24gdGltZW91dCAqLwogCQkJZGgtPmV4cGlyZXMgPSBub3cgKyBtc2Vjc190b19qaWZmaWVzKGhpbmZvLT5jZmcuZXhwaXJlKTsKLQkJCXJhdGVpbmZvX3JlY2FsYyhkaCwgbm93LCBoaW5mby0+Y2ZnLm1vZGUpOworCQkJcmF0ZWluZm9fcmVjYWxjKGRoLCBub3csIGhpbmZvLT5jZmcubW9kZSwgcmV2aXNpb24pOwogCQl9IGVsc2UgewogCQkJZGgtPmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhoaW5mby0+Y2ZnLmV4cGlyZSk7Ci0JCQlyYXRlaW5mb19pbml0KGRoLCBoaW5mbyk7CisJCQlyYXRlaW5mb19pbml0KGRoLCBoaW5mbywgcmV2aXNpb24pOwogCQl9CiAJfSBlbHNlIHsKIAkJLyogdXBkYXRlIGV4cGlyYXRpb24gdGltZW91dCAqLwogCQlkaC0+ZXhwaXJlcyA9IG5vdyArIG1zZWNzX3RvX2ppZmZpZXMoaGluZm8tPmNmZy5leHBpcmUpOwotCQlyYXRlaW5mb19yZWNhbGMoZGgsIG5vdywgaGluZm8tPmNmZy5tb2RlKTsKKwkJcmF0ZWluZm9fcmVjYWxjKGRoLCBub3csIGhpbmZvLT5jZmcubW9kZSwgcmV2aXNpb24pOwogCX0KIAotCWlmIChpbmZvLT5jZmcubW9kZSAmIFhUX0hBU0hMSU1JVF9CWVRFUykKKwlpZiAoY2ZnLT5tb2RlICYgWFRfSEFTSExJTUlUX0JZVEVTKQogCQljb3N0ID0gaGFzaGxpbWl0X2J5dGVfY29zdChza2ItPmxlbiwgZGgpOwogCWVsc2UKIAkJY29zdCA9IGRoLT5yYXRlaW5mby5jb3N0OwpAQCAtNjQ3LDczICs2OTcsMTM2IEBACiAJCWRoLT5yYXRlaW5mby5jcmVkaXQgLT0gY29zdDsKIAkJc3Bpbl91bmxvY2soJmRoLT5sb2NrKTsKIAkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7Ci0JCXJldHVybiAhKGluZm8tPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0lOVkVSVCk7CisJCXJldHVybiAhKGNmZy0+bW9kZSAmIFhUX0hBU0hMSU1JVF9JTlZFUlQpOwogCX0KIAogCXNwaW5fdW5sb2NrKCZkaC0+bG9jayk7CiAJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CiAJLyogZGVmYXVsdCBtYXRjaCBpcyB1bmRlcmxpbWl0IC0gc28gb3ZlciB0aGUgbGltaXQsIHdlIG5lZWQgdG8gaW52ZXJ0ICovCi0JcmV0dXJuIGluZm8tPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0lOVkVSVDsKKwlyZXR1cm4gY2ZnLT5tb2RlICYgWFRfSEFTSExJTUlUX0lOVkVSVDsKIAogIGhvdGRyb3A6CiAJcGFyLT5ob3Rkcm9wID0gdHJ1ZTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbnQgaGFzaGxpbWl0X210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQorc3RhdGljIGJvb2wKK2hhc2hsaW1pdF9tdF92MShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIpCiB7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gcGFyLT5uZXQ7Ci0Jc3RydWN0IHh0X2hhc2hsaW1pdF9tdGluZm8xICppbmZvID0gcGFyLT5tYXRjaGluZm87CisJY29uc3Qgc3RydWN0IHh0X2hhc2hsaW1pdF9tdGluZm8xICppbmZvID0gcGFyLT5tYXRjaGluZm87CisJc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmhpbmZvID0gaW5mby0+aGluZm87CisJc3RydWN0IGhhc2hsaW1pdF9jZmcyIGNmZyA9IHt9OwogCWludCByZXQ7CiAKLQlpZiAoaW5mby0+Y2ZnLmdjX2ludGVydmFsID09IDAgfHwgaW5mby0+Y2ZnLmV4cGlyZSA9PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoaW5mby0+bmFtZVtzaXplb2YoaW5mby0+bmFtZSktMV0gIT0gJ1wwJykKKwlyZXQgPSBjZmdfY29weSgmY2ZnLCAodm9pZCAqKSZpbmZvLT5jZmcsIDEpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBoYXNobGltaXRfbXRfY29tbW9uKHNrYiwgcGFyLCBoaW5mbywgJmNmZywgMSk7Cit9CisKK3N0YXRpYyBib29sCitoYXNobGltaXRfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMiAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpoaW5mbyA9IGluZm8tPmhpbmZvOworCisJcmV0dXJuIGhhc2hsaW1pdF9tdF9jb21tb24oc2tiLCBwYXIsIGhpbmZvLCAmaW5mby0+Y2ZnLCAyKTsKK30KKworc3RhdGljIGludCBoYXNobGltaXRfbXRfY2hlY2tfY29tbW9uKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyLAorCQkJCSAgICAgc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKipoaW5mbywKKwkJCQkgICAgIHN0cnVjdCBoYXNobGltaXRfY2ZnMiAqY2ZnLAorCQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IHJldmlzaW9uKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IHBhci0+bmV0OworCWludCByZXQ7CisKKwlpZiAoY2ZnLT5nY19pbnRlcnZhbCA9PSAwIHx8IGNmZy0+ZXhwaXJlID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCWlmIChwYXItPmZhbWlseSA9PSBORlBST1RPX0lQVjQpIHsKLQkJaWYgKGluZm8tPmNmZy5zcmNtYXNrID4gMzIgfHwgaW5mby0+Y2ZnLmRzdG1hc2sgPiAzMikKKwkJaWYgKGNmZy0+c3JjbWFzayA+IDMyIHx8IGNmZy0+ZHN0bWFzayA+IDMyKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKLQkJaWYgKGluZm8tPmNmZy5zcmNtYXNrID4gMTI4IHx8IGluZm8tPmNmZy5kc3RtYXNrID4gMTI4KQorCQlpZiAoY2ZnLT5zcmNtYXNrID4gMTI4IHx8IGNmZy0+ZHN0bWFzayA+IDEyOCkKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChpbmZvLT5jZmcubW9kZSAmIH5YVF9IQVNITElNSVRfQUxMKSB7CisJaWYgKGNmZy0+bW9kZSAmIH5YVF9IQVNITElNSVRfQUxMKSB7CiAJCXByX2luZm8oIlVua25vd24gbW9kZSBtYXNrICVYLCBrZXJuZWwgdG9vIG9sZD9cbiIsCi0JCQkJCQlpbmZvLT5jZmcubW9kZSk7CisJCQkJCQljZmctPm1vZGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBDaGVjayBmb3Igb3ZlcmZsb3cuICovCi0JaWYgKGluZm8tPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0JZVEVTKSB7Ci0JCWlmICh1c2VyMmNyZWRpdHNfYnl0ZShpbmZvLT5jZmcuYXZnKSA9PSAwKSB7Ci0JCQlwcl9pbmZvKCJvdmVyZmxvdywgcmF0ZSB0b28gaGlnaDogJXVcbiIsIGluZm8tPmNmZy5hdmcpOworCWlmIChjZmctPm1vZGUgJiBYVF9IQVNITElNSVRfQllURVMpIHsKKwkJaWYgKHVzZXIyY3JlZGl0c19ieXRlKGNmZy0+YXZnKSA9PSAwKSB7CisJCQlwcl9pbmZvKCJvdmVyZmxvdywgcmF0ZSB0b28gaGlnaDogJWxsdVxuIiwgY2ZnLT5hdmcpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQl9IGVsc2UgaWYgKGluZm8tPmNmZy5idXJzdCA9PSAwIHx8Ci0JCSAgICB1c2VyMmNyZWRpdHMoaW5mby0+Y2ZnLmF2ZyAqIGluZm8tPmNmZy5idXJzdCkgPAotCQkgICAgdXNlcjJjcmVkaXRzKGluZm8tPmNmZy5hdmcpKSB7Ci0JCQlwcl9pbmZvKCJvdmVyZmxvdywgdHJ5IGxvd2VyOiAldS8ldVxuIiwKLQkJCQlpbmZvLT5jZmcuYXZnLCBpbmZvLT5jZmcuYnVyc3QpOworCX0gZWxzZSBpZiAoY2ZnLT5idXJzdCA9PSAwIHx8CisJCSAgICB1c2VyMmNyZWRpdHMoY2ZnLT5hdmcgKiBjZmctPmJ1cnN0LCByZXZpc2lvbikgPAorCQkgICAgdXNlcjJjcmVkaXRzKGNmZy0+YXZnLCByZXZpc2lvbikpIHsKKwkJCXByX2luZm8oIm92ZXJmbG93LCB0cnkgbG93ZXI6ICVsbHUvJWxsdVxuIiwKKwkJCQljZmctPmF2ZywgY2ZnLT5idXJzdCk7CiAJCQlyZXR1cm4gLUVSQU5HRTsKIAl9CiAKIAltdXRleF9sb2NrKCZoYXNobGltaXRfbXV0ZXgpOwotCWluZm8tPmhpbmZvID0gaHRhYmxlX2ZpbmRfZ2V0KG5ldCwgaW5mby0+bmFtZSwgcGFyLT5mYW1pbHkpOwotCWlmIChpbmZvLT5oaW5mbyA9PSBOVUxMKSB7Ci0JCXJldCA9IGh0YWJsZV9jcmVhdGUobmV0LCBpbmZvLCBwYXItPmZhbWlseSk7CisJKmhpbmZvID0gaHRhYmxlX2ZpbmRfZ2V0KG5ldCwgbmFtZSwgcGFyLT5mYW1pbHkpOworCWlmICgqaGluZm8gPT0gTlVMTCkgeworCQlyZXQgPSBodGFibGVfY3JlYXRlKG5ldCwgY2ZnLCBuYW1lLCBwYXItPmZhbWlseSwKKwkJCQkgICAgaGluZm8sIHJldmlzaW9uKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCW11dGV4X3VubG9jaygmaGFzaGxpbWl0X211dGV4KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZoYXNobGltaXRfbXV0ZXgpOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaGFzaGxpbWl0X210X2NoZWNrX3YxKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQoreworCXN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCXN0cnVjdCBoYXNobGltaXRfY2ZnMiBjZmcgPSB7fTsKKwlpbnQgcmV0OworCisJaWYgKGluZm8tPm5hbWVbc2l6ZW9mKGluZm8tPm5hbWUpIC0gMV0gIT0gJ1wwJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBjZmdfY29weSgmY2ZnLCAodm9pZCAqKSZpbmZvLT5jZmcsIDEpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBoYXNobGltaXRfbXRfY2hlY2tfY29tbW9uKHBhciwgJmluZm8tPmhpbmZvLAorCQkJCQkgJmNmZywgaW5mby0+bmFtZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgaGFzaGxpbWl0X210X2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQoreworCXN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMiAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCisJaWYgKGluZm8tPm5hbWVbc2l6ZW9mKGluZm8tPm5hbWUpIC0gMV0gIT0gJ1wwJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaGFzaGxpbWl0X210X2NoZWNrX2NvbW1vbihwYXIsICZpbmZvLT5oaW5mbywgJmluZm8tPmNmZywKKwkJCQkJIGluZm8tPm5hbWUsIDIpOworfQorCitzdGF0aWMgdm9pZCBoYXNobGltaXRfbXRfZGVzdHJveV92MShjb25zdCBzdHJ1Y3QgeHRfbXRkdG9yX3BhcmFtICpwYXIpCit7CisJY29uc3Qgc3RydWN0IHh0X2hhc2hsaW1pdF9tdGluZm8xICppbmZvID0gcGFyLT5tYXRjaGluZm87CisKKwlodGFibGVfcHV0KGluZm8tPmhpbmZvKTsKK30KKwogc3RhdGljIHZvaWQgaGFzaGxpbWl0X210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMiAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwogCiAJaHRhYmxlX3B1dChpbmZvLT5oaW5mbyk7CiB9CkBAIC03MjMsOCArODM2LDE4IEBACiAJCS5uYW1lICAgICAgICAgICA9ICJoYXNobGltaXQiLAogCQkucmV2aXNpb24gICAgICAgPSAxLAogCQkuZmFtaWx5ICAgICAgICAgPSBORlBST1RPX0lQVjQsCi0JCS5tYXRjaCAgICAgICAgICA9IGhhc2hsaW1pdF9tdCwKKwkJLm1hdGNoICAgICAgICAgID0gaGFzaGxpbWl0X210X3YxLAogCQkubWF0Y2hzaXplICAgICAgPSBzaXplb2Yoc3RydWN0IHh0X2hhc2hsaW1pdF9tdGluZm8xKSwKKwkJLmNoZWNrZW50cnkgICAgID0gaGFzaGxpbWl0X210X2NoZWNrX3YxLAorCQkuZGVzdHJveSAgICAgICAgPSBoYXNobGltaXRfbXRfZGVzdHJveV92MSwKKwkJLm1lICAgICAgICAgICAgID0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lICAgICAgICAgICA9ICJoYXNobGltaXQiLAorCQkucmV2aXNpb24gICAgICAgPSAyLAorCQkuZmFtaWx5ICAgICAgICAgPSBORlBST1RPX0lQVjQsCisJCS5tYXRjaCAgICAgICAgICA9IGhhc2hsaW1pdF9tdCwKKwkJLm1hdGNoc2l6ZSAgICAgID0gc2l6ZW9mKHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMiksCiAJCS5jaGVja2VudHJ5ICAgICA9IGhhc2hsaW1pdF9tdF9jaGVjaywKIAkJLmRlc3Ryb3kgICAgICAgID0gaGFzaGxpbWl0X210X2Rlc3Ryb3ksCiAJCS5tZSAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLApAQCAtNzM0LDggKzg1NywxOCBAQAogCQkubmFtZSAgICAgICAgICAgPSAiaGFzaGxpbWl0IiwKIAkJLnJldmlzaW9uICAgICAgID0gMSwKIAkJLmZhbWlseSAgICAgICAgID0gTkZQUk9UT19JUFY2LAotCQkubWF0Y2ggICAgICAgICAgPSBoYXNobGltaXRfbXQsCisJCS5tYXRjaCAgICAgICAgICA9IGhhc2hsaW1pdF9tdF92MSwKIAkJLm1hdGNoc2l6ZSAgICAgID0gc2l6ZW9mKHN0cnVjdCB4dF9oYXNobGltaXRfbXRpbmZvMSksCisJCS5jaGVja2VudHJ5ICAgICA9IGhhc2hsaW1pdF9tdF9jaGVja192MSwKKwkJLmRlc3Ryb3kgICAgICAgID0gaGFzaGxpbWl0X210X2Rlc3Ryb3lfdjEsCisJCS5tZSAgICAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCX0sCisJeworCQkubmFtZSAgICAgICAgICAgPSAiaGFzaGxpbWl0IiwKKwkJLnJldmlzaW9uICAgICAgID0gMiwKKwkJLmZhbWlseSAgICAgICAgID0gTkZQUk9UT19JUFY2LAorCQkubWF0Y2ggICAgICAgICAgPSBoYXNobGltaXRfbXQsCisJCS5tYXRjaHNpemUgICAgICA9IHNpemVvZihzdHJ1Y3QgeHRfaGFzaGxpbWl0X210aW5mbzIpLAogCQkuY2hlY2tlbnRyeSAgICAgPSBoYXNobGltaXRfbXRfY2hlY2ssCiAJCS5kZXN0cm95ICAgICAgICA9IGhhc2hsaW1pdF9tdF9kZXN0cm95LAogCQkubWUgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKQEAgLTc4NiwxOCArOTE5LDEyIEBACiAJc3Bpbl91bmxvY2tfYmgoJmh0YWJsZS0+bG9jayk7CiB9CiAKLXN0YXRpYyBpbnQgZGxfc2VxX3JlYWxfc2hvdyhzdHJ1Y3QgZHN0aGFzaF9lbnQgKmVudCwgdV9pbnQ4X3QgZmFtaWx5LAotCQkJCSAgIHN0cnVjdCBzZXFfZmlsZSAqcykKK3N0YXRpYyB2b2lkIGRsX3NlcV9wcmludChzdHJ1Y3QgZHN0aGFzaF9lbnQgKmVudCwgdV9pbnQ4X3QgZmFtaWx5LAorCQkJIHN0cnVjdCBzZXFfZmlsZSAqcykKIHsKLQljb25zdCBzdHJ1Y3QgeHRfaGFzaGxpbWl0X2h0YWJsZSAqaHQgPSBzLT5wcml2YXRlOwotCi0Jc3Bpbl9sb2NrKCZlbnQtPmxvY2spOwotCS8qIHJlY2FsY3VsYXRlIHRvIHNob3cgYWNjdXJhdGUgbnVtYmVycyAqLwotCXJhdGVpbmZvX3JlY2FsYyhlbnQsIGppZmZpZXMsIGh0LT5jZmcubW9kZSk7Ci0KIAlzd2l0Y2ggKGZhbWlseSkgewogCWNhc2UgTkZQUk9UT19JUFY0OgotCQlzZXFfcHJpbnRmKHMsICIlbGQgJXBJNDoldS0+JXBJNDoldSAldSAldSAldVxuIiwKKwkJc2VxX3ByaW50ZihzLCAiJWxkICVwSTQ6JXUtPiVwSTQ6JXUgJWxsdSAlbGx1ICVsbHVcbiIsCiAJCQkgICAobG9uZykoZW50LT5leHBpcmVzIC0gamlmZmllcykvSFosCiAJCQkgICAmZW50LT5kc3QuaXAuc3JjLAogCQkJICAgbnRvaHMoZW50LT5kc3Quc3JjX3BvcnQpLApAQCAtODA4LDcgKzkzNSw3IEBACiAJCWJyZWFrOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykKIAljYXNlIE5GUFJPVE9fSVBWNjoKLQkJc2VxX3ByaW50ZihzLCAiJWxkICVwSTY6JXUtPiVwSTY6JXUgJXUgJXUgJXVcbiIsCisJCXNlcV9wcmludGYocywgIiVsZCAlcEk2OiV1LT4lcEk2OiV1ICVsbHUgJWxsdSAlbGx1XG4iLAogCQkJICAgKGxvbmcpKGVudC0+ZXhwaXJlcyAtIGppZmZpZXMpL0haLAogCQkJICAgJmVudC0+ZHN0LmlwNi5zcmMsCiAJCQkgICBudG9ocyhlbnQtPmRzdC5zcmNfcG9ydCksCkBAIC04MjEsMTAgKzk0OCw1MiBAQAogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KK30KKworc3RhdGljIGludCBkbF9zZXFfcmVhbF9zaG93X3YxKHN0cnVjdCBkc3RoYXNoX2VudCAqZW50LCB1X2ludDhfdCBmYW1pbHksCisJCQkgICAgICAgc3RydWN0IHNlcV9maWxlICpzKQoreworCWNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpodCA9IHMtPnByaXZhdGU7CisKKwlzcGluX2xvY2soJmVudC0+bG9jayk7CisJLyogcmVjYWxjdWxhdGUgdG8gc2hvdyBhY2N1cmF0ZSBudW1iZXJzICovCisJcmF0ZWluZm9fcmVjYWxjKGVudCwgamlmZmllcywgaHQtPmNmZy5tb2RlLCAxKTsKKworCWRsX3NlcV9wcmludChlbnQsIGZhbWlseSwgcyk7CisKIAlzcGluX3VubG9jaygmZW50LT5sb2NrKTsKIAlyZXR1cm4gc2VxX2hhc19vdmVyZmxvd2VkKHMpOwogfQogCitzdGF0aWMgaW50IGRsX3NlcV9yZWFsX3Nob3coc3RydWN0IGRzdGhhc2hfZW50ICplbnQsIHVfaW50OF90IGZhbWlseSwKKwkJCSAgICBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisJY29uc3Qgc3RydWN0IHh0X2hhc2hsaW1pdF9odGFibGUgKmh0ID0gcy0+cHJpdmF0ZTsKKworCXNwaW5fbG9jaygmZW50LT5sb2NrKTsKKwkvKiByZWNhbGN1bGF0ZSB0byBzaG93IGFjY3VyYXRlIG51bWJlcnMgKi8KKwlyYXRlaW5mb19yZWNhbGMoZW50LCBqaWZmaWVzLCBodC0+Y2ZnLm1vZGUsIDIpOworCisJZGxfc2VxX3ByaW50KGVudCwgZmFtaWx5LCBzKTsKKworCXNwaW5fdW5sb2NrKCZlbnQtPmxvY2spOworCXJldHVybiBzZXFfaGFzX292ZXJmbG93ZWQocyk7Cit9CisKK3N0YXRpYyBpbnQgZGxfc2VxX3Nob3dfdjEoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQoreworCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpodGFibGUgPSBzLT5wcml2YXRlOworCXVuc2lnbmVkIGludCAqYnVja2V0ID0gKHVuc2lnbmVkIGludCAqKXY7CisJc3RydWN0IGRzdGhhc2hfZW50ICplbnQ7CisKKwlpZiAoIWhsaXN0X2VtcHR5KCZodGFibGUtPmhhc2hbKmJ1Y2tldF0pKSB7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudCwgJmh0YWJsZS0+aGFzaFsqYnVja2V0XSwgbm9kZSkKKwkJCWlmIChkbF9zZXFfcmVhbF9zaG93X3YxKGVudCwgaHRhYmxlLT5mYW1pbHksIHMpKQorCQkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZGxfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQogewogCXN0cnVjdCB4dF9oYXNobGltaXRfaHRhYmxlICpodGFibGUgPSBzLT5wcml2YXRlOwpAQCAtODM5LDYgKzEwMDgsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkbF9zZXFfb3BzX3YxID0geworCS5zdGFydCA9IGRsX3NlcV9zdGFydCwKKwkubmV4dCAgPSBkbF9zZXFfbmV4dCwKKwkuc3RvcCAgPSBkbF9zZXFfc3RvcCwKKwkuc2hvdyAgPSBkbF9zZXFfc2hvd192MQorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBkbF9zZXFfb3BzID0gewogCS5zdGFydCA9IGRsX3NlcV9zdGFydCwKIAkubmV4dCAgPSBkbF9zZXFfbmV4dCwKQEAgLTg0Niw5ICsxMDIyLDkgQEAKIAkuc2hvdyAgPSBkbF9zZXFfc2hvdwogfTsKIAotc3RhdGljIGludCBkbF9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGRsX3Byb2Nfb3Blbl92MShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJmRsX3NlcV9vcHMpOworCWludCByZXQgPSBzZXFfb3BlbihmaWxlLCAmZGxfc2VxX29wc192MSk7CiAKIAlpZiAoIXJldCkgewogCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtODU3LDYgKzEwMzMsMjYgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGRsX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0ID0gc2VxX29wZW4oZmlsZSwgJmRsX3NlcV9vcHMpOworCisJaWYgKCFyZXQpIHsKKwkJc3RydWN0IHNlcV9maWxlICpzZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCQlzZi0+cHJpdmF0ZSA9IFBERV9EQVRBKGlub2RlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGxfZmlsZV9vcHNfdjEgPSB7CisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKKwkub3BlbiAgICA9IGRsX3Byb2Nfb3Blbl92MSwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2VxX3JlbGVhc2UKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRsX2ZpbGVfb3BzID0gewogCS5vd25lciAgID0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgPSBkbF9wcm9jX29wZW4sCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jIGIvbmV0L25ldGZpbHRlci94dF9oZWxwZXIuYwppbmRleCA5ZjRhYjAwLi5mNjc5ZGQ0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2hlbHBlci5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfaGVscGVyLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAlpZiAoIW1hc3Rlcl9oZWxwKQogCQlyZXR1cm4gcmV0OwogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCisJLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va190aHJlc2ggKi8KIAloZWxwZXIgPSByY3VfZGVyZWZlcmVuY2UobWFzdGVyX2hlbHAtPmhlbHBlcik7CiAJaWYgKCFoZWxwZXIpCiAJCXJldHVybiByZXQ7CkBAIC02NSw3ICs2NSw3IEBACiAJCQlwYXItPmZhbWlseSk7CiAJCXJldHVybiByZXQ7CiAJfQotCWluZm8tPm5hbWVbMjldID0gJ1wwJzsKKwlpbmZvLT5uYW1lW3NpemVvZihpbmZvLT5uYW1lKSAtIDFdID0gJ1wwJzsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9uZmFjY3QuYyBiL25ldC9uZXRmaWx0ZXIveHRfbmZhY2N0LmMKaW5kZXggMzA0OGE3ZS4uY2YzMjc1OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9uZmFjY3QuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X25mYWNjdC5jCkBAIC0yNiw3ICsyNiw3IEBACiAKIAluZm5sX2FjY3RfdXBkYXRlKHNrYiwgaW5mby0+bmZhY2N0KTsKIAotCW92ZXJxdW90YSA9IG5mbmxfYWNjdF9vdmVycXVvdGEoc2tiLCBpbmZvLT5uZmFjY3QpOworCW92ZXJxdW90YSA9IG5mbmxfYWNjdF9vdmVycXVvdGEocGFyLT5uZXQsIHNrYiwgaW5mby0+bmZhY2N0KTsKIAogCXJldHVybiBvdmVycXVvdGEgPT0gTkZBQ0NUX1VOREVSUVVPVEEgPyBmYWxzZSA6IHRydWU7CiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCmluZGV4IGU1ZjE4OTguLmJiMzM1OTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCkBAIC0xMDcsOCArMTA3LDggQEAKIAkgICAgIGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfQlJJREdFRCkgJiYKIAkgICAgcGFyLT5ob29rX21hc2sgJiAoKDEgPDwgTkZfSU5FVF9MT0NBTF9PVVQpIHwKIAkgICAgKDEgPDwgTkZfSU5FVF9GT1JXQVJEKSB8ICgxIDw8IE5GX0lORVRfUE9TVF9ST1VUSU5HKSkpIHsKLQkJcHJfaW5mbygidXNpbmcgLS1waHlzZGV2LW91dCBhbmQgLS1waHlzZGV2LWlzLW91dCBhcmUgb25seSIKLQkJCSJzdXBwb3J0ZWQgaW4gdGhlIEZPUldBUkQgYW5kIFBPU1RST1VUSU5HIGNoYWlucyB3aXRoIgorCQlwcl9pbmZvKCJ1c2luZyAtLXBoeXNkZXYtb3V0IGFuZCAtLXBoeXNkZXYtaXMtb3V0IGFyZSBvbmx5ICIKKwkJCSJzdXBwb3J0ZWQgaW4gdGhlIEZPUldBUkQgYW5kIFBPU1RST1VUSU5HIGNoYWlucyB3aXRoICIKIAkJCSJicmlkZ2VkIHRyYWZmaWMuXG4iKTsKIAkJaWYgKHBhci0+aG9va19tYXNrICYgKDEgPDwgTkZfSU5FVF9MT0NBTF9PVVQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3JlY2VudC5jIGIvbmV0L25ldGZpbHRlci94dF9yZWNlbnQuYwppbmRleCBkNzI1YTI3Li5lM2I3YTA5IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X3JlY2VudC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcmVjZW50LmMKQEAgLTExMCw3ICsxMTAsNiBAQAogI2VuZGlmCiAKIHN0YXRpYyB1X2ludDMyX3QgaGFzaF9ybmQgX19yZWFkX21vc3RseTsKLXN0YXRpYyBib29sIGhhc2hfcm5kX2luaXRlZCBfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWNlbnRfZW50cnlfaGFzaDQoY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICphZGRyKQogewpAQCAtMzQwLDEwICszMzksOCBAQAogCWludCByZXQgPSAtRUlOVkFMOwogCXNpemVfdCBzejsKIAotCWlmICh1bmxpa2VseSghaGFzaF9ybmRfaW5pdGVkKSkgewotCQlnZXRfcmFuZG9tX2J5dGVzKCZoYXNoX3JuZCwgc2l6ZW9mKGhhc2hfcm5kKSk7Ci0JCWhhc2hfcm5kX2luaXRlZCA9IHRydWU7Ci0JfQorCW5ldF9nZXRfcmFuZG9tX29uY2UoJmhhc2hfcm5kLCBzaXplb2YoaGFzaF9ybmQpKTsKKwogCWlmIChpbmZvLT5jaGVja19zZXQgJiB+WFRfUkVDRU5UX1ZBTElEX0ZMQUdTKSB7CiAJCXByX2luZm8oIlVuc3VwcG9ydGVkIHVzZXIgc3BhY2UgZmxhZ3MgKCUwOHgpXG4iLAogCQkJaW5mby0+Y2hlY2tfc2V0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc2N0cC5jIGIvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKaW5kZXggZWYzNmE1Ni4uNGRlZGI5NiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zY3RwLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAkJCSArK2ksIG9mZnNldCwgc2NoLT50eXBlLCBodG9ucyhzY2gtPmxlbmd0aCksCiAJCQkgc2NoLT5mbGFncyk7CiAjZW5kaWYKLQkJb2Zmc2V0ICs9IFdPUkRfUk9VTkQobnRvaHMoc2NoLT5sZW5ndGgpKTsKKwkJb2Zmc2V0ICs9IFNDVFBfUEFENChudG9ocyhzY2gtPmxlbmd0aCkpOwogCiAJCXByX2RlYnVnKCJza2ItPmxlbjogJWRcdG9mZnNldDogJWRcbiIsIHNrYi0+bGVuLCBvZmZzZXQpOwogCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9kaWFnLmMgYi9uZXQvbmV0bGluay9kaWFnLmMKaW5kZXggOGRkODM2YS4uYjJmMGU5OCAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvZGlhZy5jCisrKyBiL25ldC9uZXRsaW5rL2RpYWcuYwpAQCAtNjMsNDMgKzYzLDc0IEBACiBzdGF0aWMgaW50IF9fbmV0bGlua19kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJCWludCBwcm90b2NvbCwgaW50IHNfbnVtKQogeworCXN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKmh0aSA9ICh2b2lkICopY2ItPmFyZ3NbMl07CiAJc3RydWN0IG5ldGxpbmtfdGFibGUgKnRibCA9ICZubF90YWJsZVtwcm90b2NvbF07Ci0Jc3RydWN0IHJoYXNodGFibGUgKmh0ID0gJnRibC0+aGFzaDsKLQljb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICpodGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+dGJsLCBodCk7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CiAJc3RydWN0IG5ldGxpbmtfZGlhZ19yZXEgKnJlcTsKIAlzdHJ1Y3QgbmV0bGlua19zb2NrICpubHNrOwogCXN0cnVjdCBzb2NrICpzazsKLQlpbnQgcmV0ID0gMCwgbnVtID0gMCwgaTsKKwlpbnQgbnVtID0gMjsKKwlpbnQgcmV0ID0gMDsKIAogCXJlcSA9IG5sbXNnX2RhdGEoY2ItPm5saCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaHRibC0+c2l6ZTsgaSsrKSB7Ci0JCXN0cnVjdCByaGFzaF9oZWFkICpwb3M7CisJaWYgKHNfbnVtID4gMSkKKwkJZ290byBtY19saXN0OwogCi0JCXJodF9mb3JfZWFjaF9lbnRyeV9yY3UobmxzaywgcG9zLCBodGJsLCBpLCBub2RlKSB7Ci0JCQlzayA9IChzdHJ1Y3Qgc29jayAqKW5sc2s7CisJbnVtLS07CiAKLQkJCWlmICghbmV0X2VxKHNvY2tfbmV0KHNrKSwgbmV0KSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChudW0gPCBzX251bSkgewotCQkJCW51bSsrOworCWlmICghaHRpKSB7CisJCWh0aSA9IGttYWxsb2Moc2l6ZW9mKCpodGkpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFodGkpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQljYi0+YXJnc1syXSA9IChsb25nKWh0aTsKKwl9CisKKwlpZiAoIXNfbnVtKQorCQlyaGFzaHRhYmxlX3dhbGtfZW50ZXIoJnRibC0+aGFzaCwgaHRpKTsKKworCXJldCA9IHJoYXNodGFibGVfd2Fsa19zdGFydChodGkpOworCWlmIChyZXQgPT0gLUVBR0FJTikKKwkJcmV0ID0gMDsKKwlpZiAocmV0KQorCQlnb3RvIHN0b3A7CisKKwl3aGlsZSAoKG5sc2sgPSByaGFzaHRhYmxlX3dhbGtfbmV4dChodGkpKSkgeworCQlpZiAoSVNfRVJSKG5sc2spKSB7CisJCQlyZXQgPSBQVFJfRVJSKG5sc2spOworCQkJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCQkJcmV0ID0gMDsKIAkJCQljb250aW51ZTsKIAkJCX0KKwkJCWJyZWFrOworCQl9CiAKLQkJCWlmIChza19kaWFnX2ZpbGwoc2ssIHNrYiwgcmVxLAotCQkJCQkgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJCSBjYi0+bmxoLT5ubG1zZ19zZXEsCi0JCQkJCSBOTE1fRl9NVUxUSSwKLQkJCQkJIHNvY2tfaV9pbm8oc2spKSA8IDApIHsKLQkJCQlyZXQgPSAxOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KKwkJc2sgPSAoc3RydWN0IHNvY2sgKilubHNrOwogCi0JCQludW0rKzsKKwkJaWYgKCFuZXRfZXEoc29ja19uZXQoc2spLCBuZXQpKQorCQkJY29udGludWU7CisKKwkJaWYgKHNrX2RpYWdfZmlsbChzaywgc2tiLCByZXEsCisJCQkJIE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAorCQkJCSBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJIE5MTV9GX01VTFRJLAorCQkJCSBzb2NrX2lfaW5vKHNrKSkgPCAwKSB7CisJCQlyZXQgPSAxOworCQkJYnJlYWs7CiAJCX0KIAl9CiAKK3N0b3A6CisJcmhhc2h0YWJsZV93YWxrX3N0b3AoaHRpKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwlyaGFzaHRhYmxlX3dhbGtfZXhpdChodGkpOworCW51bSsrOworCittY19saXN0OgorCXJlYWRfbG9jaygmbmxfdGFibGVfbG9jayk7CiAJc2tfZm9yX2VhY2hfYm91bmQoc2ssICZ0YmwtPm1jX2xpc3QpIHsKIAkJaWYgKHNrX2hhc2hlZChzaykpCiAJCQljb250aW51ZTsKQEAgLTExNiwxMyArMTQ3LDE0IEBACiAJCQkJIE5MTV9GX01VTFRJLAogCQkJCSBzb2NrX2lfaW5vKHNrKSkgPCAwKSB7CiAJCQlyZXQgPSAxOwotCQkJZ290byBkb25lOworCQkJYnJlYWs7CiAJCX0KIAkJbnVtKys7CiAJfQorCXJlYWRfdW5sb2NrKCZubF90YWJsZV9sb2NrKTsKKwogZG9uZToKIAljYi0+YXJnc1swXSA9IG51bTsKLQljYi0+YXJnc1sxXSA9IHByb3RvY29sOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzMSwyMCArMTYzLDIwIEBACiB7CiAJc3RydWN0IG5ldGxpbmtfZGlhZ19yZXEgKnJlcTsKIAlpbnQgc19udW0gPSBjYi0+YXJnc1swXTsKKwlpbnQgZXJyID0gMDsKIAogCXJlcSA9IG5sbXNnX2RhdGEoY2ItPm5saCk7CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcmVhZF9sb2NrKCZubF90YWJsZV9sb2NrKTsKLQogCWlmIChyZXEtPnNkaWFnX3Byb3RvY29sID09IE5ESUFHX1BST1RPX0FMTCkgewogCQlpbnQgaTsKIAogCQlmb3IgKGkgPSBjYi0+YXJnc1sxXTsgaSA8IE1BWF9MSU5LUzsgaSsrKSB7Ci0JCQlpZiAoX19uZXRsaW5rX2RpYWdfZHVtcChza2IsIGNiLCBpLCBzX251bSkpCisJCQllcnIgPSBfX25ldGxpbmtfZGlhZ19kdW1wKHNrYiwgY2IsIGksIHNfbnVtKTsKKwkJCWlmIChlcnIpCiAJCQkJYnJlYWs7CiAJCQlzX251bSA9IDA7CiAJCX0KKwkJY2ItPmFyZ3NbMV0gPSBpOwogCX0gZWxzZSB7CiAJCWlmIChyZXEtPnNkaWFnX3Byb3RvY29sID49IE1BWF9MSU5LUykgewogCQkJcmVhZF91bmxvY2soJm5sX3RhYmxlX2xvY2spOwpAQCAtMTUyLDEzICsxODQsMjIgQEAKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9CiAKLQkJX19uZXRsaW5rX2RpYWdfZHVtcChza2IsIGNiLCByZXEtPnNkaWFnX3Byb3RvY29sLCBzX251bSk7CisJCWVyciA9IF9fbmV0bGlua19kaWFnX2R1bXAoc2tiLCBjYiwgcmVxLT5zZGlhZ19wcm90b2NvbCwgc19udW0pOwogCX0KIAotCXJlYWRfdW5sb2NrKCZubF90YWJsZV9sb2NrKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IHNrYi0+bGVuOworfQogCi0JcmV0dXJuIHNrYi0+bGVuOworc3RhdGljIGludCBuZXRsaW5rX2RpYWdfZHVtcF9kb25lKHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICpodGkgPSAodm9pZCAqKWNiLT5hcmdzWzJdOworCisJaWYgKGNiLT5hcmdzWzBdID09IDEpCisJCXJoYXNodGFibGVfd2Fsa19leGl0KGh0aSk7CisKKwlrZnJlZShodGkpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbmV0bGlua19kaWFnX2hhbmRsZXJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKmgpCkBAIC0xNzIsNiArMjEzLDcgQEAKIAlpZiAoaC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKSB7CiAJCXN0cnVjdCBuZXRsaW5rX2R1bXBfY29udHJvbCBjID0gewogCQkJLmR1bXAgPSBuZXRsaW5rX2RpYWdfZHVtcCwKKwkJCS5kb25lID0gbmV0bGlua19kaWFnX2R1bXBfZG9uZSwKIAkJfTsKIAkJcmV0dXJuIG5ldGxpbmtfZHVtcF9zdGFydChuZXQtPmRpYWdfbmxzaywgc2tiLCBoLCAmYyk7CiAJfSBlbHNlCmRpZmYgLS1naXQgYS9uZXQvbmV0bGluay9nZW5ldGxpbmsuYyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCmluZGV4IGEwOTEzMmEuLjIzY2MxMjYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCisrKyBiL25ldC9uZXRsaW5rL2dlbmV0bGluay5jCkBAIC05NzcsNyArOTc3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBnZW5sX29wcyBnZW5sX2N0cmxfb3BzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdlbmxfb3BzIGdlbmxfY3RybF9vcHNbXSA9IHsKIAl7CiAJCS5jbWQJCT0gQ1RSTF9DTURfR0VURkFNSUxZLAogCQkuZG9pdAkJPSBjdHJsX2dldGZhbWlseSwKQEAgLTk4Niw3ICs5ODYsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwIGdlbmxfY3RybF9ncm91cHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgZ2VubF9jdHJsX2dyb3Vwc1tdID0gewogCXsgLm5hbWUgPSAibm90aWZ5IiwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9hY3Rpb25zLmMgYi9uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jCmluZGV4IDFlY2JkNzcuLjRlMDNmNjQgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9hY3Rpb25zLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL2FjdGlvbnMuYwpAQCAtNzEsNiArNzEsOCBAQAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBvdnNfZnJhZ19kYXRhLCBvdnNfZnJhZ19kYXRhX3N0b3JhZ2UpOwogCiAjZGVmaW5lIERFRkVSUkVEX0FDVElPTl9GSUZPX1NJWkUgMTAKKyNkZWZpbmUgT1ZTX1JFQ1VSU0lPTl9MSU1JVCA1CisjZGVmaW5lIE9WU19ERUZFUlJFRF9BQ1RJT05fVEhSRVNIT0xEIChPVlNfUkVDVVJTSU9OX0xJTUlUIC0gMikKIHN0cnVjdCBhY3Rpb25fZmlmbyB7CiAJaW50IGhlYWQ7CiAJaW50IHRhaWw7CkBAIC03OCw3ICs4MCwxMiBAQAogCXN0cnVjdCBkZWZlcnJlZF9hY3Rpb24gZmlmb1tERUZFUlJFRF9BQ1RJT05fRklGT19TSVpFXTsKIH07CiAKK3N0cnVjdCByZWNpcmNfa2V5cyB7CisJc3RydWN0IHN3X2Zsb3dfa2V5IGtleVtPVlNfREVGRVJSRURfQUNUSU9OX1RIUkVTSE9MRF07Cit9OworCiBzdGF0aWMgc3RydWN0IGFjdGlvbl9maWZvIF9fcGVyY3B1ICphY3Rpb25fZmlmb3M7CitzdGF0aWMgc3RydWN0IHJlY2lyY19rZXlzIF9fcGVyY3B1ICpyZWNpcmNfa2V5czsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGV4ZWNfYWN0aW9uc19sZXZlbCk7CiAKIHN0YXRpYyB2b2lkIGFjdGlvbl9maWZvX2luaXQoc3RydWN0IGFjdGlvbl9maWZvICpmaWZvKQpAQCAtMTUzLDcgKzE2MCw3IEBACiBzdGF0aWMgaW50IHB1c2hfbXBscyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSwKIAkJICAgICBjb25zdCBzdHJ1Y3Qgb3ZzX2FjdGlvbl9wdXNoX21wbHMgKm1wbHMpCiB7Ci0JX19iZTMyICpuZXdfbXBsc19sc2U7CisJc3RydWN0IG1wbHNfc2hpbV9oZHIgKm5ld19tcGxzX2xzZTsKIAogCS8qIE5ldHdvcmtpbmcgc3RhY2sgZG8gbm90IGFsbG93IHNpbXVsdGFuZW91cyBUdW5uZWwgYW5kIE1QTFMgR1NPLiAqLwogCWlmIChza2ItPmVuY2Fwc3VsYXRpb24pCkBAIC0xNjIsMTkgKzE2OSwyMyBAQAogCWlmIChza2JfY293X2hlYWQoc2tiLCBNUExTX0hMRU4pIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlpZiAoIXNrYi0+aW5uZXJfcHJvdG9jb2wpIHsKKwkJc2tiX3NldF9pbm5lcl9uZXR3b3JrX2hlYWRlcihza2IsIHNrYi0+bWFjX2xlbik7CisJCXNrYl9zZXRfaW5uZXJfcHJvdG9jb2woc2tiLCBza2ItPnByb3RvY29sKTsKKwl9CisKIAlza2JfcHVzaChza2IsIE1QTFNfSExFTik7CiAJbWVtbW92ZShza2JfbWFjX2hlYWRlcihza2IpIC0gTVBMU19ITEVOLCBza2JfbWFjX2hlYWRlcihza2IpLAogCQlza2ItPm1hY19sZW4pOwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIHNrYi0+bWFjX2xlbik7CiAKLQluZXdfbXBsc19sc2UgPSAoX19iZTMyICopc2tiX21wbHNfaGVhZGVyKHNrYik7Ci0JKm5ld19tcGxzX2xzZSA9IG1wbHMtPm1wbHNfbHNlOworCW5ld19tcGxzX2xzZSA9IG1wbHNfaGRyKHNrYik7CisJbmV3X21wbHNfbHNlLT5sYWJlbF9zdGFja19lbnRyeSA9IG1wbHMtPm1wbHNfbHNlOwogCiAJc2tiX3Bvc3RwdXNoX3Jjc3VtKHNrYiwgbmV3X21wbHNfbHNlLCBNUExTX0hMRU4pOwogCiAJdXBkYXRlX2V0aGVydHlwZShza2IsIGV0aF9oZHIoc2tiKSwgbXBscy0+bXBsc19ldGhlcnR5cGUpOwotCWlmICghc2tiLT5pbm5lcl9wcm90b2NvbCkKLQkJc2tiX3NldF9pbm5lcl9wcm90b2NvbChza2IsIHNrYi0+cHJvdG9jb2wpOwogCXNrYi0+cHJvdG9jb2wgPSBtcGxzLT5tcGxzX2V0aGVydHlwZTsKIAogCWludmFsaWRhdGVfZmxvd19rZXkoa2V5KTsKQEAgLTE5MSwxOCArMjAyLDE5IEBACiAJaWYgKHVubGlrZWx5KGVycikpCiAJCXJldHVybiBlcnI7CiAKLQlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBza2JfbXBsc19oZWFkZXIoc2tiKSwgTVBMU19ITEVOKTsKKwlza2JfcG9zdHB1bGxfcmNzdW0oc2tiLCBtcGxzX2hkcihza2IpLCBNUExTX0hMRU4pOwogCiAJbWVtbW92ZShza2JfbWFjX2hlYWRlcihza2IpICsgTVBMU19ITEVOLCBza2JfbWFjX2hlYWRlcihza2IpLAogCQlza2ItPm1hY19sZW4pOwogCiAJX19za2JfcHVsbChza2IsIE1QTFNfSExFTik7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgc2tiLT5tYWNfbGVuKTsKIAotCS8qIHNrYl9tcGxzX2hlYWRlcigpIGlzIHVzZWQgdG8gbG9jYXRlIHRoZSBldGhlcnR5cGUKLQkgKiBmaWVsZCBjb3JyZWN0bHkgaW4gdGhlIHByZXNlbmNlIG9mIFZMQU4gdGFncy4KKwkvKiBtcGxzX2hkcigpIGlzIHVzZWQgdG8gbG9jYXRlIHRoZSBldGhlcnR5cGUgZmllbGQgY29ycmVjdGx5IGluIHRoZQorCSAqIHByZXNlbmNlIG9mIFZMQU4gdGFncy4KIAkgKi8KLQloZHIgPSAoc3RydWN0IGV0aGhkciAqKShza2JfbXBsc19oZWFkZXIoc2tiKSAtIEVUSF9ITEVOKTsKKwloZHIgPSAoc3RydWN0IGV0aGhkciAqKSgodm9pZCAqKW1wbHNfaGRyKHNrYikgLSBFVEhfSExFTik7CiAJdXBkYXRlX2V0aGVydHlwZShza2IsIGhkciwgZXRoZXJ0eXBlKTsKIAlpZiAoZXRoX3BfbXBscyhza2ItPnByb3RvY29sKSkKIAkJc2tiLT5wcm90b2NvbCA9IGV0aGVydHlwZTsKQEAgLTIxNCw3ICsyMjYsNyBAQAogc3RhdGljIGludCBzZXRfbXBscyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmZsb3dfa2V5LAogCQkgICAgY29uc3QgX19iZTMyICptcGxzX2xzZSwgY29uc3QgX19iZTMyICptYXNrKQogewotCV9fYmUzMiAqc3RhY2s7CisJc3RydWN0IG1wbHNfc2hpbV9oZHIgKnN0YWNrOwogCV9fYmUzMiBsc2U7CiAJaW50IGVycjsKIApAQCAtMjIyLDE2ICsyMzQsMTYgQEAKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJcmV0dXJuIGVycjsKIAotCXN0YWNrID0gKF9fYmUzMiAqKXNrYl9tcGxzX2hlYWRlcihza2IpOwotCWxzZSA9IE9WU19NQVNLRUQoKnN0YWNrLCAqbXBsc19sc2UsICptYXNrKTsKKwlzdGFjayA9IG1wbHNfaGRyKHNrYik7CisJbHNlID0gT1ZTX01BU0tFRChzdGFjay0+bGFiZWxfc3RhY2tfZW50cnksICptcGxzX2xzZSwgKm1hc2spOwogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkgewotCQlfX2JlMzIgZGlmZltdID0geyB+KCpzdGFjayksIGxzZSB9OworCQlfX2JlMzIgZGlmZltdID0geyB+KHN0YWNrLT5sYWJlbF9zdGFja19lbnRyeSksIGxzZSB9OwogCiAJCXNrYi0+Y3N1bSA9IH5jc3VtX3BhcnRpYWwoKGNoYXIgKilkaWZmLCBzaXplb2YoZGlmZiksCiAJCQkJCSAgfnNrYi0+Y3N1bSk7CiAJfQogCi0JKnN0YWNrID0gbHNlOworCXN0YWNrLT5sYWJlbF9zdGFja19lbnRyeSA9IGxzZTsKIAlmbG93X2tleS0+bXBscy50b3BfbHNlID0gbHNlOwogCXJldHVybiAwOwogfQpAQCAtMjQxLDIwICsyNTMsMjQgQEAKIAlpbnQgZXJyOwogCiAJZXJyID0gc2tiX3ZsYW5fcG9wKHNrYik7Ci0JaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpCisJaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKIAkJaW52YWxpZGF0ZV9mbG93X2tleShrZXkpOwotCWVsc2UKLQkJa2V5LT5ldGgudGNpID0gMDsKKwl9IGVsc2UgeworCQlrZXktPmV0aC52bGFuLnRjaSA9IDA7CisJCWtleS0+ZXRoLnZsYW4udHBpZCA9IDA7CisJfQogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgcHVzaF92bGFuKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LAogCQkgICAgIGNvbnN0IHN0cnVjdCBvdnNfYWN0aW9uX3B1c2hfdmxhbiAqdmxhbikKIHsKLQlpZiAoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkKKwlpZiAoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkgewogCQlpbnZhbGlkYXRlX2Zsb3dfa2V5KGtleSk7Ci0JZWxzZQotCQlrZXktPmV0aC50Y2kgPSB2bGFuLT52bGFuX3RjaTsKKwl9IGVsc2UgeworCQlrZXktPmV0aC52bGFuLnRjaSA9IHZsYW4tPnZsYW5fdGNpOworCQlrZXktPmV0aC52bGFuLnRwaWQgPSB2bGFuLT52bGFuX3RwaWQ7CisJfQogCXJldHVybiBza2Jfdmxhbl9wdXNoKHNrYiwgdmxhbi0+dmxhbl90cGlkLAogCQkJICAgICBudG9ocyh2bGFuLT52bGFuX3RjaSkgJiB+VkxBTl9UQUdfUFJFU0VOVCk7CiB9CkBAIC0xMDExLDYgKzEwMjcsNyBAQAogCQkJICBjb25zdCBzdHJ1Y3QgbmxhdHRyICphLCBpbnQgcmVtKQogewogCXN0cnVjdCBkZWZlcnJlZF9hY3Rpb24gKmRhOworCWludCBsZXZlbDsKIAogCWlmICghaXNfZmxvd19rZXlfdmFsaWQoa2V5KSkgewogCQlpbnQgZXJyOwpAQCAtMTAzNCw2ICsxMDUxLDE4IEBACiAJCQlyZXR1cm4gMDsKIAl9CiAKKwlsZXZlbCA9IHRoaXNfY3B1X3JlYWQoZXhlY19hY3Rpb25zX2xldmVsKTsKKwlpZiAobGV2ZWwgPD0gT1ZTX0RFRkVSUkVEX0FDVElPTl9USFJFU0hPTEQpIHsKKwkJc3RydWN0IHJlY2lyY19rZXlzICpya3MgPSB0aGlzX2NwdV9wdHIocmVjaXJjX2tleXMpOworCQlzdHJ1Y3Qgc3dfZmxvd19rZXkgKnJlY2lyY19rZXkgPSAmcmtzLT5rZXlbbGV2ZWwgLSAxXTsKKworCQkqcmVjaXJjX2tleSA9ICprZXk7CisJCXJlY2lyY19rZXktPnJlY2lyY19pZCA9IG5sYV9nZXRfdTMyKGEpOworCQlvdnNfZHBfcHJvY2Vzc19wYWNrZXQoc2tiLCByZWNpcmNfa2V5KTsKKworCQlyZXR1cm4gMDsKKwl9CisKIAlkYSA9IGFkZF9kZWZlcnJlZF9hY3Rpb25zKHNrYiwga2V5LCBOVUxMKTsKIAlpZiAoZGEpIHsKIAkJZGEtPnBrdF9rZXkucmVjaXJjX2lkID0gbmxhX2dldF91MzIoYSk7CkBAIC0xMjAwLDExICsxMjI5LDEwIEBACiAJCQljb25zdCBzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zICphY3RzLAogCQkJc3RydWN0IHN3X2Zsb3dfa2V5ICprZXkpCiB7Ci0Jc3RhdGljIGNvbnN0IGludCBvdnNfcmVjdXJzaW9uX2xpbWl0ID0gNTsKIAlpbnQgZXJyLCBsZXZlbDsKIAogCWxldmVsID0gX190aGlzX2NwdV9pbmNfcmV0dXJuKGV4ZWNfYWN0aW9uc19sZXZlbCk7Ci0JaWYgKHVubGlrZWx5KGxldmVsID4gb3ZzX3JlY3Vyc2lvbl9saW1pdCkpIHsKKwlpZiAodW5saWtlbHkobGV2ZWwgPiBPVlNfUkVDVVJTSU9OX0xJTUlUKSkgewogCQluZXRfY3JpdF9yYXRlbGltaXRlZCgib3ZzOiByZWN1cnNpb24gbGltaXQgcmVhY2hlZCBvbiBkYXRhcGF0aCAlcywgcHJvYmFibGUgY29uZmlndXJhdGlvbiBlcnJvclxuIiwKIAkJCQkgICAgIG92c19kcF9uYW1lKGRwKSk7CiAJCWtmcmVlX3NrYihza2IpOwpAQCAtMTIyOSwxMCArMTI1NywxNyBAQAogCWlmICghYWN0aW9uX2ZpZm9zKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXJlY2lyY19rZXlzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCByZWNpcmNfa2V5cyk7CisJaWYgKCFyZWNpcmNfa2V5cykgeworCQlmcmVlX3BlcmNwdShhY3Rpb25fZmlmb3MpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBhY3Rpb25fZmlmb3NfZXhpdCh2b2lkKQogewogCWZyZWVfcGVyY3B1KGFjdGlvbl9maWZvcyk7CisJZnJlZV9wZXJjcHUocmVjaXJjX2tleXMpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jIGIvbmV0L29wZW52c3dpdGNoL2Nvbm50cmFjay5jCmluZGV4IGUwNTRhNzQuLjMxMDQ1ZWYgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9jb25udHJhY2suYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvY29ubnRyYWNrLmMKQEAgLTEzNjcsNyArMTM2Nyw3IEBACiAJaWYgKGN0X2luZm8tPmhlbHBlcikKIAkJbW9kdWxlX3B1dChjdF9pbmZvLT5oZWxwZXItPm1lKTsKIAlpZiAoY3RfaW5mby0+Y3QpCi0JCW5mX2N0X3B1dChjdF9pbmZvLT5jdCk7CisJCW5mX2N0X3RtcGxfZnJlZShjdF9pbmZvLT5jdCk7CiB9CiAKIHZvaWQgb3ZzX2N0X2luaXQoc3RydWN0IG5ldCAqbmV0KQpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMgYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYwppbmRleCA1MjRjMGZkLi40ZDY3ZWE4IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYwpAQCAtOTI4LDcgKzkyOCw2IEBACiAJc3RydWN0IHN3X2Zsb3dfbWFzayBtYXNrOwogCXN0cnVjdCBza19idWZmICpyZXBseTsKIAlzdHJ1Y3QgZGF0YXBhdGggKmRwOwotCXN0cnVjdCBzd19mbG93X2tleSBrZXk7CiAJc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqYWN0czsKIAlzdHJ1Y3Qgc3dfZmxvd19tYXRjaCBtYXRjaDsKIAl1MzIgdWZpZF9mbGFncyA9IG92c19ubGFfZ2V0X3VmaWRfZmxhZ3MoYVtPVlNfRkxPV19BVFRSX1VGSURfRkxBR1NdKTsKQEAgLTk1NiwyMCArOTU1LDI0IEBACiAJfQogCiAJLyogRXh0cmFjdCBrZXkuICovCi0Jb3ZzX21hdGNoX2luaXQoJm1hdGNoLCAma2V5LCAmbWFzayk7CisJb3ZzX21hdGNoX2luaXQoJm1hdGNoLCAmbmV3X2Zsb3ctPmtleSwgZmFsc2UsICZtYXNrKTsKIAllcnJvciA9IG92c19ubGFfZ2V0X21hdGNoKG5ldCwgJm1hdGNoLCBhW09WU19GTE9XX0FUVFJfS0VZXSwKIAkJCQkgIGFbT1ZTX0ZMT1dfQVRUUl9NQVNLXSwgbG9nKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZXJyX2tmcmVlX2Zsb3c7CiAKLQlvdnNfZmxvd19tYXNrX2tleSgmbmV3X2Zsb3ctPmtleSwgJmtleSwgdHJ1ZSwgJm1hc2spOwotCiAJLyogRXh0cmFjdCBmbG93IGlkZW50aWZpZXIuICovCiAJZXJyb3IgPSBvdnNfbmxhX2dldF9pZGVudGlmaWVyKCZuZXdfZmxvdy0+aWQsIGFbT1ZTX0ZMT1dfQVRUUl9VRklEXSwKLQkJCQkgICAgICAgJmtleSwgbG9nKTsKKwkJCQkgICAgICAgJm5ld19mbG93LT5rZXksIGxvZyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGVycl9rZnJlZV9mbG93OwogCisJLyogdW5tYXNrZWQga2V5IGlzIG5lZWRlZCB0byBtYXRjaCB3aGVuIHVmaWQgaXMgbm90IHVzZWQuICovCisJaWYgKG92c19pZGVudGlmaWVyX2lzX2tleSgmbmV3X2Zsb3ctPmlkKSkKKwkJbWF0Y2gua2V5ID0gbmV3X2Zsb3ctPmlkLnVubWFza2VkX2tleTsKKworCW92c19mbG93X21hc2tfa2V5KCZuZXdfZmxvdy0+a2V5LCAmbmV3X2Zsb3ctPmtleSwgdHJ1ZSwgJm1hc2spOworCiAJLyogVmFsaWRhdGUgYWN0aW9ucy4gKi8KIAllcnJvciA9IG92c19ubGFfY29weV9hY3Rpb25zKG5ldCwgYVtPVlNfRkxPV19BVFRSX0FDVElPTlNdLAogCQkJCSAgICAgJm5ld19mbG93LT5rZXksICZhY3RzLCBsb2cpOwpAQCAtOTk2LDcgKzk5OSw3IEBACiAJaWYgKG92c19pZGVudGlmaWVyX2lzX3VmaWQoJm5ld19mbG93LT5pZCkpCiAJCWZsb3cgPSBvdnNfZmxvd190YmxfbG9va3VwX3VmaWQoJmRwLT50YWJsZSwgJm5ld19mbG93LT5pZCk7CiAJaWYgKCFmbG93KQotCQlmbG93ID0gb3ZzX2Zsb3dfdGJsX2xvb2t1cCgmZHAtPnRhYmxlLCAma2V5KTsKKwkJZmxvdyA9IG92c19mbG93X3RibF9sb29rdXAoJmRwLT50YWJsZSwgJm5ld19mbG93LT5rZXkpOwogCWlmIChsaWtlbHkoIWZsb3cpKSB7CiAJCXJjdV9hc3NpZ25fcG9pbnRlcihuZXdfZmxvdy0+c2ZfYWN0cywgYWN0cyk7CiAKQEAgLTExMjEsNyArMTEyNCw3IEBACiAKIAl1ZmlkX3ByZXNlbnQgPSBvdnNfbmxhX2dldF91ZmlkKCZzZmlkLCBhW09WU19GTE9XX0FUVFJfVUZJRF0sIGxvZyk7CiAJaWYgKGFbT1ZTX0ZMT1dfQVRUUl9LRVldKSB7Ci0JCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgJm1hc2spOworCQlvdnNfbWF0Y2hfaW5pdCgmbWF0Y2gsICZrZXksIHRydWUsICZtYXNrKTsKIAkJZXJyb3IgPSBvdnNfbmxhX2dldF9tYXRjaChuZXQsICZtYXRjaCwgYVtPVlNfRkxPV19BVFRSX0tFWV0sCiAJCQkJCSAgYVtPVlNfRkxPV19BVFRSX01BU0tdLCBsb2cpOwogCX0gZWxzZSBpZiAoIXVmaWRfcHJlc2VudCkgewpAQCAtMTIzOCw3ICsxMjQxLDcgQEAKIAogCXVmaWRfcHJlc2VudCA9IG92c19ubGFfZ2V0X3VmaWQoJnVmaWQsIGFbT1ZTX0ZMT1dfQVRUUl9VRklEXSwgbG9nKTsKIAlpZiAoYVtPVlNfRkxPV19BVFRSX0tFWV0pIHsKLQkJb3ZzX21hdGNoX2luaXQoJm1hdGNoLCAma2V5LCBOVUxMKTsKKwkJb3ZzX21hdGNoX2luaXQoJm1hdGNoLCAma2V5LCB0cnVlLCBOVUxMKTsKIAkJZXJyID0gb3ZzX25sYV9nZXRfbWF0Y2gobmV0LCAmbWF0Y2gsIGFbT1ZTX0ZMT1dfQVRUUl9LRVldLCBOVUxMLAogCQkJCQlsb2cpOwogCX0gZWxzZSBpZiAoIXVmaWRfcHJlc2VudCkgewpAQCAtMTI5Nyw3ICsxMzAwLDcgQEAKIAogCXVmaWRfcHJlc2VudCA9IG92c19ubGFfZ2V0X3VmaWQoJnVmaWQsIGFbT1ZTX0ZMT1dfQVRUUl9VRklEXSwgbG9nKTsKIAlpZiAoYVtPVlNfRkxPV19BVFRSX0tFWV0pIHsKLQkJb3ZzX21hdGNoX2luaXQoJm1hdGNoLCAma2V5LCBOVUxMKTsKKwkJb3ZzX21hdGNoX2luaXQoJm1hdGNoLCAma2V5LCB0cnVlLCBOVUxMKTsKIAkJZXJyID0gb3ZzX25sYV9nZXRfbWF0Y2gobmV0LCAmbWF0Y2gsIGFbT1ZTX0ZMT1dfQVRUUl9LRVldLAogCQkJCQlOVUxMLCBsb2cpOwogCQlpZiAodW5saWtlbHkoZXJyKSkKQEAgLTI0MzcsMyArMjQ0MCw3IEBACiAKIE1PRFVMRV9ERVNDUklQVElPTigiT3BlbiB2U3dpdGNoIHN3aXRjaGluZyBkYXRhcGF0aCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX0dFTkxfRkFNSUxZKE9WU19EQVRBUEFUSF9GQU1JTFkpOworTU9EVUxFX0FMSUFTX0dFTkxfRkFNSUxZKE9WU19WUE9SVF9GQU1JTFkpOworTU9EVUxFX0FMSUFTX0dFTkxfRkFNSUxZKE9WU19GTE9XX0ZBTUlMWSk7CitNT0RVTEVfQUxJQVNfR0VOTF9GQU1JTFkoT1ZTX1BBQ0tFVF9GQU1JTFkpOwpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Zsb3cuYyBiL25ldC9vcGVudnN3aXRjaC9mbG93LmMKaW5kZXggMGVhMTI4ZS4uYzhjODJlMSAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2Zsb3cuYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KQEAgLTcyLDMyICs3MywzMyBAQAogewogCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0czsKIAlpbnQgbm9kZSA9IG51bWFfbm9kZV9pZCgpOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJaW50IGxlbiA9IHNrYi0+bGVuICsgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikgPyBWTEFOX0hMRU4gOiAwKTsKIAotCXN0YXRzID0gcmN1X2RlcmVmZXJlbmNlKGZsb3ctPnN0YXRzW25vZGVdKTsKKwlzdGF0cyA9IHJjdV9kZXJlZmVyZW5jZShmbG93LT5zdGF0c1tjcHVdKTsKIAotCS8qIENoZWNrIGlmIGFscmVhZHkgaGF2ZSBub2RlLXNwZWNpZmljIHN0YXRzLiAqLworCS8qIENoZWNrIGlmIGFscmVhZHkgaGF2ZSBDUFUtc3BlY2lmaWMgc3RhdHMuICovCiAJaWYgKGxpa2VseShzdGF0cykpIHsKIAkJc3Bpbl9sb2NrKCZzdGF0cy0+bG9jayk7CiAJCS8qIE1hcmsgaWYgd2Ugd3JpdGUgb24gdGhlIHByZS1hbGxvY2F0ZWQgc3RhdHMuICovCi0JCWlmIChub2RlID09IDAgJiYgdW5saWtlbHkoZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgIT0gbm9kZSkpCi0JCQlmbG93LT5zdGF0c19sYXN0X3dyaXRlciA9IG5vZGU7CisJCWlmIChjcHUgPT0gMCAmJiB1bmxpa2VseShmbG93LT5zdGF0c19sYXN0X3dyaXRlciAhPSBjcHUpKQorCQkJZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgPSBjcHU7CiAJfSBlbHNlIHsKIAkJc3RhdHMgPSByY3VfZGVyZWZlcmVuY2UoZmxvdy0+c3RhdHNbMF0pOyAvKiBQcmUtYWxsb2NhdGVkLiAqLwogCQlzcGluX2xvY2soJnN0YXRzLT5sb2NrKTsKIAotCQkvKiBJZiB0aGUgY3VycmVudCBOVU1BLW5vZGUgaXMgdGhlIG9ubHkgd3JpdGVyIG9uIHRoZQorCQkvKiBJZiB0aGUgY3VycmVudCBDUFUgaXMgdGhlIG9ubHkgd3JpdGVyIG9uIHRoZQogCQkgKiBwcmUtYWxsb2NhdGVkIHN0YXRzIGtlZXAgdXNpbmcgdGhlbS4KIAkJICovCi0JCWlmICh1bmxpa2VseShmbG93LT5zdGF0c19sYXN0X3dyaXRlciAhPSBub2RlKSkgeworCQlpZiAodW5saWtlbHkoZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgIT0gY3B1KSkgewogCQkJLyogQSBwcmV2aW91cyBsb2NrZXIgbWF5IGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgdGhlCi0JCQkgKiBzdGF0cywgc28gd2UgbmVlZCB0byBjaGVjayBhZ2Fpbi4gIElmIG5vZGUtc3BlY2lmaWMKKwkJCSAqIHN0YXRzLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGFnYWluLiAgSWYgQ1BVLXNwZWNpZmljCiAJCQkgKiBzdGF0cyB3ZXJlIGFscmVhZHkgYWxsb2NhdGVkLCB3ZSB1cGRhdGUgdGhlIHByZS0KIAkJCSAqIGFsbG9jYXRlZCBzdGF0cyBhcyB3ZSBoYXZlIGFscmVhZHkgbG9ja2VkIHRoZW0uCiAJCQkgKi8KLQkJCWlmIChsaWtlbHkoZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgIT0gTlVNQV9OT19OT0RFKQotCQkJICAgICYmIGxpa2VseSghcmN1X2FjY2Vzc19wb2ludGVyKGZsb3ctPnN0YXRzW25vZGVdKSkpIHsKLQkJCQkvKiBUcnkgdG8gYWxsb2NhdGUgbm9kZS1zcGVjaWZpYyBzdGF0cy4gKi8KKwkJCWlmIChsaWtlbHkoZmxvdy0+c3RhdHNfbGFzdF93cml0ZXIgIT0gLTEpICYmCisJCQkgICAgbGlrZWx5KCFyY3VfYWNjZXNzX3BvaW50ZXIoZmxvdy0+c3RhdHNbY3B1XSkpKSB7CisJCQkJLyogVHJ5IHRvIGFsbG9jYXRlIENQVS1zcGVjaWZpYyBzdGF0cy4gKi8KIAkJCQlzdHJ1Y3QgZmxvd19zdGF0cyAqbmV3X3N0YXRzOwogCiAJCQkJbmV3X3N0YXRzID0KQEAgLTExNCwxMiArMTE2LDEyIEBACiAJCQkJCW5ld19zdGF0cy0+dGNwX2ZsYWdzID0gdGNwX2ZsYWdzOwogCQkJCQlzcGluX2xvY2tfaW5pdCgmbmV3X3N0YXRzLT5sb2NrKTsKIAotCQkJCQlyY3VfYXNzaWduX3BvaW50ZXIoZmxvdy0+c3RhdHNbbm9kZV0sCisJCQkJCXJjdV9hc3NpZ25fcG9pbnRlcihmbG93LT5zdGF0c1tjcHVdLAogCQkJCQkJCSAgIG5ld19zdGF0cyk7CiAJCQkJCWdvdG8gdW5sb2NrOwogCQkJCX0KIAkJCX0KLQkJCWZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyID0gbm9kZTsKKwkJCWZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyID0gY3B1OwogCQl9CiAJfQogCkBAIC0xMzYsMTQgKzEzOCwxNSBAQAogCQkJc3RydWN0IG92c19mbG93X3N0YXRzICpvdnNfc3RhdHMsCiAJCQl1bnNpZ25lZCBsb25nICp1c2VkLCBfX2JlMTYgKnRjcF9mbGFncykKIHsKLQlpbnQgbm9kZTsKKwlpbnQgY3B1OwogCiAJKnVzZWQgPSAwOwogCSp0Y3BfZmxhZ3MgPSAwOwogCW1lbXNldChvdnNfc3RhdHMsIDAsIHNpemVvZigqb3ZzX3N0YXRzKSk7CiAKLQlmb3JfZWFjaF9ub2RlKG5vZGUpIHsKLQkJc3RydWN0IGZsb3dfc3RhdHMgKnN0YXRzID0gcmN1X2RlcmVmZXJlbmNlX292c2woZmxvdy0+c3RhdHNbbm9kZV0pOworCS8qIFdlIG9wZW4gY29kZSB0aGlzIHRvIG1ha2Ugc3VyZSBjcHUgMCBpcyBhbHdheXMgY29uc2lkZXJlZCAqLworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnJfY3B1X2lkczsgY3B1ID0gY3B1bWFza19uZXh0KGNwdSwgY3B1X3Bvc3NpYmxlX21hc2spKSB7CisJCXN0cnVjdCBmbG93X3N0YXRzICpzdGF0cyA9IHJjdV9kZXJlZmVyZW5jZV9vdnNsKGZsb3ctPnN0YXRzW2NwdV0pOwogCiAJCWlmIChzdGF0cykgewogCQkJLyogTG9jYWwgQ1BVIG1heSB3cml0ZSBvbiBub24tbG9jYWwgc3RhdHMsIHNvIHdlIG11c3QKQEAgLTE2MywxMCArMTY2LDExIEBACiAvKiBDYWxsZWQgd2l0aCBvdnNfbXV0ZXguICovCiB2b2lkIG92c19mbG93X3N0YXRzX2NsZWFyKHN0cnVjdCBzd19mbG93ICpmbG93KQogewotCWludCBub2RlOworCWludCBjcHU7CiAKLQlmb3JfZWFjaF9ub2RlKG5vZGUpIHsKLQkJc3RydWN0IGZsb3dfc3RhdHMgKnN0YXRzID0gb3ZzbF9kZXJlZmVyZW5jZShmbG93LT5zdGF0c1tub2RlXSk7CisJLyogV2Ugb3BlbiBjb2RlIHRoaXMgdG8gbWFrZSBzdXJlIGNwdSAwIGlzIGFsd2F5cyBjb25zaWRlcmVkICovCisJZm9yIChjcHUgPSAwOyBjcHUgPCBucl9jcHVfaWRzOyBjcHUgPSBjcHVtYXNrX25leHQoY3B1LCBjcHVfcG9zc2libGVfbWFzaykpIHsKKwkJc3RydWN0IGZsb3dfc3RhdHMgKnN0YXRzID0gb3ZzbF9kZXJlZmVyZW5jZShmbG93LT5zdGF0c1tjcHVdKTsKIAogCQlpZiAoc3RhdHMpIHsKIAkJCXNwaW5fbG9ja19iaCgmc3RhdHMtPmxvY2spOwpAQCAtMzAyLDI0ICszMDYsNTcgQEAKIAkJCQkgIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKTsKIH0KIAotc3RhdGljIGludCBwYXJzZV92bGFuKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5KQorLyoqCisgKiBQYXJzZSB2bGFuIHRhZyBmcm9tIHZsYW4gaGVhZGVyLgorICogUmV0dXJucyBFUlJPUiBvbiBtZW1vcnkgZXJyb3IuCisgKiBSZXR1cm5zIDAgaWYgaXQgZW5jb3VudGVycyBhIG5vbi12bGFuIG9yIGluY29tcGxldGUgcGFja2V0LgorICogUmV0dXJucyAxIGFmdGVyIHN1Y2Nlc3NmdWxseSBwYXJzaW5nIHZsYW4gdGFnLgorICovCitzdGF0aWMgaW50IHBhcnNlX3ZsYW5fdGFnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB2bGFuX2hlYWQgKmtleV92aCkKIHsKLQlzdHJ1Y3QgcXRhZ19wcmVmaXggewotCQlfX2JlMTYgZXRoX3R5cGU7IC8qIEVUSF9QXzgwMjFRICovCi0JCV9fYmUxNiB0Y2k7Ci0JfTsKLQlzdHJ1Y3QgcXRhZ19wcmVmaXggKnFwOworCXN0cnVjdCB2bGFuX2hlYWQgKnZoID0gKHN0cnVjdCB2bGFuX2hlYWQgKilza2ItPmRhdGE7CiAKLQlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHF0YWdfcHJlZml4KSArIHNpemVvZihfX2JlMTYpKSkKKwlpZiAobGlrZWx5KCFldGhfdHlwZV92bGFuKHZoLT50cGlkKSkpCiAJCXJldHVybiAwOwogCi0JaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBxdGFnX3ByZWZpeCkgKwotCQkJCQkgc2l6ZW9mKF9fYmUxNikpKSkKKwlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHZsYW5faGVhZCkgKyBzaXplb2YoX19iZTE2KSkpCisJCXJldHVybiAwOworCisJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB2bGFuX2hlYWQpICsKKwkJCQkgc2l6ZW9mKF9fYmUxNikpKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlxcCA9IChzdHJ1Y3QgcXRhZ19wcmVmaXggKikgc2tiLT5kYXRhOwotCWtleS0+ZXRoLnRjaSA9IHFwLT50Y2kgfCBodG9ucyhWTEFOX1RBR19QUkVTRU5UKTsKLQlfX3NrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBxdGFnX3ByZWZpeCkpOworCXZoID0gKHN0cnVjdCB2bGFuX2hlYWQgKilza2ItPmRhdGE7CisJa2V5X3ZoLT50Y2kgPSB2aC0+dGNpIHwgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCk7CisJa2V5X3ZoLT50cGlkID0gdmgtPnRwaWQ7CisKKwlfX3NrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB2bGFuX2hlYWQpKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXJzZV92bGFuKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5KQoreworCWludCByZXM7CisKKwlrZXktPmV0aC52bGFuLnRjaSA9IDA7CisJa2V5LT5ldGgudmxhbi50cGlkID0gMDsKKwlrZXktPmV0aC5jdmxhbi50Y2kgPSAwOworCWtleS0+ZXRoLmN2bGFuLnRwaWQgPSAwOworCisJaWYgKGxpa2VseShza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSkgeworCQlrZXktPmV0aC52bGFuLnRjaSA9IGh0b25zKHNrYi0+dmxhbl90Y2kpOworCQlrZXktPmV0aC52bGFuLnRwaWQgPSBza2ItPnZsYW5fcHJvdG87CisJfSBlbHNlIHsKKwkJLyogUGFyc2Ugb3V0ZXIgdmxhbiB0YWcgaW4gdGhlIG5vbi1hY2NlbGVyYXRlZCBjYXNlLiAqLworCQlyZXMgPSBwYXJzZV92bGFuX3RhZyhza2IsICZrZXktPmV0aC52bGFuKTsKKwkJaWYgKHJlcyA8PSAwKQorCQkJcmV0dXJuIHJlczsKKwl9CisKKwkvKiBQYXJzZSBpbm5lciB2bGFuIHRhZy4gKi8KKwlyZXMgPSBwYXJzZV92bGFuX3RhZyhza2IsICZrZXktPmV0aC5jdmxhbik7CisJaWYgKHJlcyA8PSAwKQorCQlyZXR1cm4gcmVzOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00ODAsMTIgKzUxNyw4IEBACiAJICogdXBkYXRlIHNrYi0+Y3N1bSBoZXJlLgogCSAqLwogCi0Ja2V5LT5ldGgudGNpID0gMDsKLQlpZiAoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkKLQkJa2V5LT5ldGgudGNpID0gaHRvbnMoc2tiLT52bGFuX3RjaSk7Ci0JZWxzZSBpZiAoZXRoLT5oX3Byb3RvID09IGh0b25zKEVUSF9QXzgwMjFRKSkKLQkJaWYgKHVubGlrZWx5KHBhcnNlX3ZsYW4oc2tiLCBrZXkpKSkKLQkJCXJldHVybiAtRU5PTUVNOworCWlmICh1bmxpa2VseShwYXJzZV92bGFuKHNrYiwga2V5KSkpCisJCXJldHVybiAtRU5PTUVNOwogCiAJa2V5LT5ldGgudHlwZSA9IHBhcnNlX2V0aGVydHlwZShza2IpOwogCWlmICh1bmxpa2VseShrZXktPmV0aC50eXBlID09IGh0b25zKDApKSkKQEAgLTYwMCwxMiArNjMzLDcgQEAKIAl9IGVsc2UgaWYgKGV0aF9wX21wbHMoa2V5LT5ldGgudHlwZSkpIHsKIAkJc2l6ZV90IHN0YWNrX2xlbiA9IE1QTFNfSExFTjsKIAotCQkvKiBJbiB0aGUgcHJlc2VuY2Ugb2YgYW4gTVBMUyBsYWJlbCBzdGFjayB0aGUgZW5kIG9mIHRoZSBMMgotCQkgKiBoZWFkZXIgYW5kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIEwzIGhlYWRlciBkaWZmZXIuCi0JCSAqCi0JCSAqIEFkdmFuY2UgbmV0d29ya19oZWFkZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgTDMKLQkJICogaGVhZGVyLiBtYWNfbGVuIGNvcnJlc3BvbmRzIHRvIHRoZSBlbmQgb2YgdGhlIEwyIGhlYWRlci4KLQkJICovCisJCXNrYl9zZXRfaW5uZXJfbmV0d29ya19oZWFkZXIoc2tiLCBza2ItPm1hY19sZW4pOwogCQl3aGlsZSAoMSkgewogCQkJX19iZTMyIGxzZTsKIApAQCAtNjEzLDEyICs2NDEsMTIgQEAKIAkJCWlmICh1bmxpa2VseShlcnJvcikpCiAJCQkJcmV0dXJuIDA7CiAKLQkJCW1lbWNweSgmbHNlLCBza2JfbmV0d29ya19oZWFkZXIoc2tiKSwgTVBMU19ITEVOKTsKKwkJCW1lbWNweSgmbHNlLCBza2JfaW5uZXJfbmV0d29ya19oZWFkZXIoc2tiKSwgTVBMU19ITEVOKTsKIAogCQkJaWYgKHN0YWNrX2xlbiA9PSBNUExTX0hMRU4pCiAJCQkJbWVtY3B5KCZrZXktPm1wbHMudG9wX2xzZSwgJmxzZSwgTVBMU19ITEVOKTsKIAotCQkJc2tiX3NldF9uZXR3b3JrX2hlYWRlcihza2IsIHNrYi0+bWFjX2xlbiArIHN0YWNrX2xlbik7CisJCQlza2Jfc2V0X2lubmVyX25ldHdvcmtfaGVhZGVyKHNrYiwgc2tiLT5tYWNfbGVuICsgc3RhY2tfbGVuKTsKIAkJCWlmIChsc2UgJiBodG9ubChNUExTX0xTX1NfTUFTSykpCiAJCQkJYnJlYWs7CiAKQEAgLTczNCw4ICs3NjIsNiBAQAogewogCWludCBlcnI7CiAKLQltZW1zZXQoa2V5LCAwLCBPVlNfU1dfRkxPV19LRVlfTUVUQURBVEFfU0laRSk7Ci0KIAkvKiBFeHRyYWN0IG1ldGFkYXRhIGZyb20gbmV0bGluayBhdHRyaWJ1dGVzLiAqLwogCWVyciA9IG92c19ubGFfZ2V0X2Zsb3dfbWV0YWRhdGEobmV0LCBhdHRyLCBrZXksIGxvZyk7CiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9mbG93LmggYi9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5oCmluZGV4IDAzMzc4ZTcuLmFlNzgzZjUgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93LmgKKysrIGIvbmV0L29wZW52c3dpdGNoL2Zsb3cuaApAQCAtNTAsNiArNTAsMTEgQEAKIAlzdHJ1Y3QgbWV0YWRhdGFfZHN0CSp0dW5fZHN0OwogfTsKIAorc3RydWN0IHZsYW5faGVhZCB7CisJX19iZTE2IHRwaWQ7IC8qIFZsYW4gdHlwZS4gR2VuZXJhbGx5IDgwMi4xcSBvciA4MDIuMWFkLiovCisJX19iZTE2IHRjaTsgIC8qIDAgaWYgbm8gVkxBTiwgVkxBTl9UQUdfUFJFU0VOVCBzZXQgb3RoZXJ3aXNlLiAqLworfTsKKwogI2RlZmluZSBPVlNfU1dfRkxPV19LRVlfTUVUQURBVEFfU0laRQkJCVwKIAkob2Zmc2V0b2Yoc3RydWN0IHN3X2Zsb3dfa2V5LCByZWNpcmNfaWQpICsJXAogCUZJRUxEX1NJWkVPRihzdHJ1Y3Qgc3dfZmxvd19rZXksIHJlY2lyY19pZCkpCkBAIC02OSw3ICs3NCw4IEBACiAJc3RydWN0IHsKIAkJdTggICAgIHNyY1tFVEhfQUxFTl07CS8qIEV0aGVybmV0IHNvdXJjZSBhZGRyZXNzLiAqLwogCQl1OCAgICAgZHN0W0VUSF9BTEVOXTsJLyogRXRoZXJuZXQgZGVzdGluYXRpb24gYWRkcmVzcy4gKi8KLQkJX19iZTE2IHRjaTsJCS8qIDAgaWYgbm8gVkxBTiwgVkxBTl9UQUdfUFJFU0VOVCBzZXQgb3RoZXJ3aXNlLiAqLworCQlzdHJ1Y3Qgdmxhbl9oZWFkIHZsYW47CisJCXN0cnVjdCB2bGFuX2hlYWQgY3ZsYW47CiAJCV9fYmUxNiB0eXBlOwkJLyogRXRoZXJuZXQgZnJhbWUgdHlwZS4gKi8KIAl9IGV0aDsKIAl1bmlvbiB7CkBAIC0xNzIsMTQgKzE3OCwxNCBAQAogCQlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlWzJdOwogCQl1MzIgaGFzaDsKIAl9IGZsb3dfdGFibGUsIHVmaWRfdGFibGU7Ci0JaW50IHN0YXRzX2xhc3Rfd3JpdGVyOwkJLyogTlVNQS1ub2RlIGlkIG9mIHRoZSBsYXN0IHdyaXRlciBvbgorCWludCBzdGF0c19sYXN0X3dyaXRlcjsJCS8qIENQVSBpZCBvZiB0aGUgbGFzdCB3cml0ZXIgb24KIAkJCQkJICogJ3N0YXRzWzBdJy4KIAkJCQkJICovCiAJc3RydWN0IHN3X2Zsb3dfa2V5IGtleTsKIAlzdHJ1Y3Qgc3dfZmxvd19pZCBpZDsKIAlzdHJ1Y3Qgc3dfZmxvd19tYXNrICptYXNrOwogCXN0cnVjdCBzd19mbG93X2FjdGlvbnMgX19yY3UgKnNmX2FjdHM7Ci0Jc3RydWN0IGZsb3dfc3RhdHMgX19yY3UgKnN0YXRzW107IC8qIE9uZSBmb3IgZWFjaCBOVU1BIG5vZGUuICBGaXJzdCBvbmUKKwlzdHJ1Y3QgZmxvd19zdGF0cyBfX3JjdSAqc3RhdHNbXTsgLyogT25lIGZvciBlYWNoIENQVS4gIEZpcnN0IG9uZQogCQkJCQkgICAqIGlzIGFsbG9jYXRlZCBhdCBmbG93IGNyZWF0aW9uIHRpbWUsCiAJCQkJCSAgICogdGhlIHJlc3QgYXJlIGFsbG9jYXRlZCBvbiBkZW1hbmQKIAkJCQkJICAgKiB3aGlsZSBob2xkaW5nIHRoZSAnc3RhdHNbMF0ubG9jaycuCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmMgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmMKaW5kZXggYzc4YTZhMS4uYWUyNWRlZCAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuYwpAQCAtODA4LDYgKzgwOCwxNjcgQEAKIAkJCQkgIGlwX3R1bm5lbF9pbmZvX2FmKHR1bl9pbmZvKSk7CiB9CiAKK3N0YXRpYyBpbnQgZW5jb2RlX3ZsYW5fZnJvbV9ubGF0dHJzKHN0cnVjdCBzd19mbG93X21hdGNoICptYXRjaCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqYVtdLAorCQkJCSAgICBib29sIGlzX21hc2ssIGJvb2wgaW5uZXIpCit7CisJX19iZTE2IHRjaSA9IDA7CisJX19iZTE2IHRwaWQgPSAwOworCisJaWYgKGFbT1ZTX0tFWV9BVFRSX1ZMQU5dKQorCQl0Y2kgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfVkxBTl0pOworCisJaWYgKGFbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0pCisJCXRwaWQgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfRVRIRVJUWVBFXSk7CisKKwlpZiAobGlrZWx5KCFpbm5lcikpIHsKKwkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBldGgudmxhbi50cGlkLCB0cGlkLCBpc19tYXNrKTsKKwkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBldGgudmxhbi50Y2ksIHRjaSwgaXNfbWFzayk7CisJfSBlbHNlIHsKKwkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBldGguY3ZsYW4udHBpZCwgdHBpZCwgaXNfbWFzayk7CisJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLmN2bGFuLnRjaSwgdGNpLCBpc19tYXNrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfdmxhbl9mcm9tX25sYXR0cnMoY29uc3Qgc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAorCQkJCSAgICAgIHU2NCBrZXlfYXR0cnMsIGJvb2wgaW5uZXIsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqKmEsIGJvb2wgbG9nKQoreworCV9fYmUxNiB0Y2kgPSAwOworCisJaWYgKCEoKGtleV9hdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9FVEhFUk5FVCkpICYmCisJICAgICAgKGtleV9hdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9FVEhFUlRZUEUpKSAmJgorCSAgICAgICBldGhfdHlwZV92bGFuKG5sYV9nZXRfYmUxNihhW09WU19LRVlfQVRUUl9FVEhFUlRZUEVdKSkpKSB7CisJCS8qIE5vdCBhIFZMQU4uICovCisJCXJldHVybiAwOworCX0KKworCWlmICghKChrZXlfYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfVkxBTikpICYmCisJICAgICAgKGtleV9hdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9FTkNBUCkpKSkgeworCQlPVlNfTkxFUlIobG9nLCAiSW52YWxpZCAlcyBmcmFtZSIsIChpbm5lcikgPyAiQy1WTEFOIiA6ICJWTEFOIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChhW09WU19LRVlfQVRUUl9WTEFOXSkKKwkJdGNpID0gbmxhX2dldF9iZTE2KGFbT1ZTX0tFWV9BVFRSX1ZMQU5dKTsKKworCWlmICghKHRjaSAmIGh0b25zKFZMQU5fVEFHX1BSRVNFTlQpKSkgeworCQlpZiAodGNpKSB7CisJCQlPVlNfTkxFUlIobG9nLCAiJXMgVENJIGRvZXMgbm90IGhhdmUgVkxBTl9UQUdfUFJFU0VOVCBiaXQgc2V0LiIsCisJCQkJICAoaW5uZXIpID8gIkMtVkxBTiIgOiAiVkxBTiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSBpZiAobmxhX2xlbihhW09WU19LRVlfQVRUUl9FTkNBUF0pKSB7CisJCQkvKiBDb3JuZXIgY2FzZSBmb3IgdHJ1bmNhdGVkIFZMQU4gaGVhZGVyLiAqLworCQkJT1ZTX05MRVJSKGxvZywgIlRydW5jYXRlZCAlcyBoZWFkZXIgaGFzIG5vbi16ZXJvIGVuY2FwIGF0dHJpYnV0ZS4iLAorCQkJCSAgKGlubmVyKSA/ICJDLVZMQU4iIDogIlZMQU4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfdmxhbl9tYXNrX2Zyb21fbmxhdHRycyhjb25zdCBzdHJ1Y3Qgc3dfZmxvd19tYXRjaCAqbWF0Y2gsCisJCQkJCSAgIHU2NCBrZXlfYXR0cnMsIGJvb2wgaW5uZXIsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiphLCBib29sIGxvZykKK3sKKwlfX2JlMTYgdGNpID0gMDsKKwlfX2JlMTYgdHBpZCA9IDA7CisJYm9vbCBlbmNhcF92YWxpZCA9ICEhKG1hdGNoLT5rZXktPmV0aC52bGFuLnRjaSAmCisJCQkgICAgICBodG9ucyhWTEFOX1RBR19QUkVTRU5UKSk7CisJYm9vbCBpX2VuY2FwX3ZhbGlkID0gISEobWF0Y2gtPmtleS0+ZXRoLmN2bGFuLnRjaSAmCisJCQkJaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCkpOworCisJaWYgKCEoa2V5X2F0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0VOQ0FQKSkpIHsKKwkJLyogTm90IGEgVkxBTi4gKi8KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCghaW5uZXIgJiYgIWVuY2FwX3ZhbGlkKSB8fCAoaW5uZXIgJiYgIWlfZW5jYXBfdmFsaWQpKSB7CisJCU9WU19OTEVSUihsb2csICJFbmNhcCBtYXNrIGF0dHJpYnV0ZSBpcyBzZXQgZm9yIG5vbi0lcyBmcmFtZS4iLAorCQkJICAoaW5uZXIpID8gIkMtVkxBTiIgOiAiVkxBTiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoYVtPVlNfS0VZX0FUVFJfVkxBTl0pCisJCXRjaSA9IG5sYV9nZXRfYmUxNihhW09WU19LRVlfQVRUUl9WTEFOXSk7CisKKwlpZiAoYVtPVlNfS0VZX0FUVFJfRVRIRVJUWVBFXSkKKwkJdHBpZCA9IG5sYV9nZXRfYmUxNihhW09WU19LRVlfQVRUUl9FVEhFUlRZUEVdKTsKKworCWlmICh0cGlkICE9IGh0b25zKDB4ZmZmZikpIHsKKwkJT1ZTX05MRVJSKGxvZywgIk11c3QgaGF2ZSBhbiBleGFjdCBtYXRjaCBvbiAlcyBUUElEIChtYXNrPSV4KS4iLAorCQkJICAoaW5uZXIpID8gIkMtVkxBTiIgOiAiVkxBTiIsIG50b2hzKHRwaWQpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghKHRjaSAmIGh0b25zKFZMQU5fVEFHX1BSRVNFTlQpKSkgeworCQlPVlNfTkxFUlIobG9nLCAiJXMgVENJIG1hc2sgZG9lcyBub3QgaGF2ZSBleGFjdCBtYXRjaCBmb3IgVkxBTl9UQUdfUFJFU0VOVCBiaXQuIiwKKwkJCSAgKGlubmVyKSA/ICJDLVZMQU4iIDogIlZMQU4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19wYXJzZV92bGFuX2Zyb21fbmxhdHRycyhzdHJ1Y3Qgc3dfZmxvd19tYXRjaCAqbWF0Y2gsCisJCQkJICAgICB1NjQgKmtleV9hdHRycywgYm9vbCBpbm5lciwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiphLCBib29sIGlzX21hc2ssCisJCQkJICAgICBib29sIGxvZykKK3sKKwlpbnQgZXJyOworCWNvbnN0IHN0cnVjdCBubGF0dHIgKmVuY2FwOworCisJaWYgKCFpc19tYXNrKQorCQllcnIgPSB2YWxpZGF0ZV92bGFuX2Zyb21fbmxhdHRycyhtYXRjaCwgKmtleV9hdHRycywgaW5uZXIsCisJCQkJCQkgYSwgbG9nKTsKKwllbHNlCisJCWVyciA9IHZhbGlkYXRlX3ZsYW5fbWFza19mcm9tX25sYXR0cnMobWF0Y2gsICprZXlfYXR0cnMsIGlubmVyLAorCQkJCQkJICAgICAgYSwgbG9nKTsKKwlpZiAoZXJyIDw9IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBlbmNvZGVfdmxhbl9mcm9tX25sYXR0cnMobWF0Y2gsIGEsIGlzX21hc2ssIGlubmVyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJKmtleV9hdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX0VOQ0FQKTsKKwkqa2V5X2F0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfVkxBTik7CisJKmtleV9hdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSk7CisKKwllbmNhcCA9IGFbT1ZTX0tFWV9BVFRSX0VOQ0FQXTsKKworCWlmICghaXNfbWFzaykKKwkJZXJyID0gcGFyc2VfZmxvd19ubGF0dHJzKGVuY2FwLCBhLCBrZXlfYXR0cnMsIGxvZyk7CisJZWxzZQorCQllcnIgPSBwYXJzZV9mbG93X21hc2tfbmxhdHRycyhlbmNhcCwgYSwga2V5X2F0dHJzLCBsb2cpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwYXJzZV92bGFuX2Zyb21fbmxhdHRycyhzdHJ1Y3Qgc3dfZmxvd19tYXRjaCAqbWF0Y2gsCisJCQkJICAgdTY0ICprZXlfYXR0cnMsIGNvbnN0IHN0cnVjdCBubGF0dHIgKiphLAorCQkJCSAgIGJvb2wgaXNfbWFzaywgYm9vbCBsb2cpCit7CisJaW50IGVycjsKKwlib29sIGVuY2FwX3ZhbGlkID0gZmFsc2U7CisKKwllcnIgPSBfX3BhcnNlX3ZsYW5fZnJvbV9ubGF0dHJzKG1hdGNoLCBrZXlfYXR0cnMsIGZhbHNlLCBhLAorCQkJCQlpc19tYXNrLCBsb2cpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllbmNhcF92YWxpZCA9ICEhKG1hdGNoLT5rZXktPmV0aC52bGFuLnRjaSAmIGh0b25zKFZMQU5fVEFHX1BSRVNFTlQpKTsKKwlpZiAoZW5jYXBfdmFsaWQpIHsKKwkJZXJyID0gX19wYXJzZV92bGFuX2Zyb21fbmxhdHRycyhtYXRjaCwga2V5X2F0dHJzLCB0cnVlLCBhLAorCQkJCQkJaXNfbWFzaywgbG9nKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbWV0YWRhdGFfZnJvbV9ubGF0dHJzKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHN3X2Zsb3dfbWF0Y2ggKm1hdGNoLAogCQkJCSB1NjQgKmF0dHJzLCBjb25zdCBzdHJ1Y3QgbmxhdHRyICoqYSwKIAkJCQkgYm9vbCBpc19tYXNrLCBib29sIGxvZykKQEAgLTkyMywyMCArMTA4NCwxMSBAQAogCX0KIAogCWlmIChhdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9WTEFOKSkgewotCQlfX2JlMTYgdGNpOwotCi0JCXRjaSA9IG5sYV9nZXRfYmUxNihhW09WU19LRVlfQVRUUl9WTEFOXSk7Ci0JCWlmICghKHRjaSAmIGh0b25zKFZMQU5fVEFHX1BSRVNFTlQpKSkgewotCQkJaWYgKGlzX21hc2spCi0JCQkJT1ZTX05MRVJSKGxvZywgIlZMQU4gVENJIG1hc2sgZG9lcyBub3QgaGF2ZSBleGFjdCBtYXRjaCBmb3IgVkxBTl9UQUdfUFJFU0VOVCBiaXQuIik7Ci0JCQllbHNlCi0JCQkJT1ZTX05MRVJSKGxvZywgIlZMQU4gVENJIGRvZXMgbm90IGhhdmUgVkxBTl9UQUdfUFJFU0VOVCBiaXQgc2V0LiIpOwotCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLnRjaSwgdGNpLCBpc19tYXNrKTsKLQkJYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9WTEFOKTsKKwkJLyogVkxBTiBhdHRyaWJ1dGUgaXMgYWx3YXlzIHBhcnNlZCBiZWZvcmUgZ2V0dGluZyBoZXJlIHNpbmNlIGl0CisJCSAqIG1heSBvY2N1ciBtdWx0aXBsZSB0aW1lcy4KKwkJICovCisJCU9WU19OTEVSUihsb2csICJWTEFOIGF0dHJpYnV0ZSB1bmV4cGVjdGVkLiIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfRVRIRVJUWVBFKSkgewpAQCAtMTE4Miw0OSArMTMzNCwxOCBAQAogCQkgICAgICBib29sIGxvZykKIHsKIAljb25zdCBzdHJ1Y3QgbmxhdHRyICphW09WU19LRVlfQVRUUl9NQVggKyAxXTsKLQljb25zdCBzdHJ1Y3QgbmxhdHRyICplbmNhcDsKIAlzdHJ1Y3QgbmxhdHRyICpuZXdtYXNrID0gTlVMTDsKIAl1NjQga2V5X2F0dHJzID0gMDsKIAl1NjQgbWFza19hdHRycyA9IDA7Ci0JYm9vbCBlbmNhcF92YWxpZCA9IGZhbHNlOwogCWludCBlcnI7CiAKIAllcnIgPSBwYXJzZV9mbG93X25sYXR0cnMobmxhX2tleSwgYSwgJmtleV9hdHRycywgbG9nKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKChrZXlfYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfRVRIRVJORVQpKSAmJgotCSAgICAoa2V5X2F0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSkpICYmCi0JICAgIChubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfRVRIRVJUWVBFXSkgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSkgewotCQlfX2JlMTYgdGNpOwotCi0JCWlmICghKChrZXlfYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfVkxBTikpICYmCi0JCSAgICAgIChrZXlfYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfRU5DQVApKSkpIHsKLQkJCU9WU19OTEVSUihsb2csICJJbnZhbGlkIFZsYW4gZnJhbWUuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWtleV9hdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSk7Ci0JCXRjaSA9IG5sYV9nZXRfYmUxNihhW09WU19LRVlfQVRUUl9WTEFOXSk7Ci0JCWVuY2FwID0gYVtPVlNfS0VZX0FUVFJfRU5DQVBdOwotCQlrZXlfYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9FTkNBUCk7Ci0JCWVuY2FwX3ZhbGlkID0gdHJ1ZTsKLQotCQlpZiAodGNpICYgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCkpIHsKLQkJCWVyciA9IHBhcnNlX2Zsb3dfbmxhdHRycyhlbmNhcCwgYSwgJmtleV9hdHRycywgbG9nKTsKLQkJCWlmIChlcnIpCi0JCQkJcmV0dXJuIGVycjsKLQkJfSBlbHNlIGlmICghdGNpKSB7Ci0JCQkvKiBDb3JuZXIgY2FzZSBmb3IgdHJ1bmNhdGVkIDgwMi4xUSBoZWFkZXIuICovCi0JCQlpZiAobmxhX2xlbihlbmNhcCkpIHsKLQkJCQlPVlNfTkxFUlIobG9nLCAiVHJ1bmNhdGVkIDgwMi4xUSBoZWFkZXIgaGFzIG5vbi16ZXJvIGVuY2FwIGF0dHJpYnV0ZS4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCU9WU19OTEVSUihsb2csICJFbmNhcCBhdHRyIGlzIHNldCBmb3Igbm9uLVZMQU4gZnJhbWUiKTsKLQkJCXJldHVybiAgLUVJTlZBTDsKLQkJfQotCX0KKwllcnIgPSBwYXJzZV92bGFuX2Zyb21fbmxhdHRycyhtYXRjaCwgJmtleV9hdHRycywgYSwgZmFsc2UsIGxvZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWVyciA9IG92c19rZXlfZnJvbV9ubGF0dHJzKG5ldCwgbWF0Y2gsIGtleV9hdHRycywgYSwgZmFsc2UsIGxvZyk7CiAJaWYgKGVycikKQEAgLTEyNjUsNDYgKzEzODYsMTIgQEAKIAkJCWdvdG8gZnJlZV9uZXdtYXNrOwogCiAJCS8qIEFsd2F5cyBtYXRjaCBvbiB0Y2kuICovCi0JCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLnRjaSwgaHRvbnMoMHhmZmZmKSwgdHJ1ZSk7CisJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgZXRoLnZsYW4udGNpLCBodG9ucygweGZmZmYpLCB0cnVlKTsKKwkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCBldGguY3ZsYW4udGNpLCBodG9ucygweGZmZmYpLCB0cnVlKTsKIAotCQlpZiAobWFza19hdHRycyAmIDEgPDwgT1ZTX0tFWV9BVFRSX0VOQ0FQKSB7Ci0JCQlfX2JlMTYgZXRoX3R5cGUgPSAwOwotCQkJX19iZTE2IHRjaSA9IDA7Ci0KLQkJCWlmICghZW5jYXBfdmFsaWQpIHsKLQkJCQlPVlNfTkxFUlIobG9nLCAiRW5jYXAgbWFzayBhdHRyaWJ1dGUgaXMgc2V0IGZvciBub24tVkxBTiBmcmFtZS4iKTsKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWdvdG8gZnJlZV9uZXdtYXNrOwotCQkJfQotCi0JCQltYXNrX2F0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfRU5DQVApOwotCQkJaWYgKGFbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0pCi0JCQkJZXRoX3R5cGUgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfRVRIRVJUWVBFXSk7Ci0KLQkJCWlmIChldGhfdHlwZSA9PSBodG9ucygweGZmZmYpKSB7Ci0JCQkJbWFza19hdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSk7Ci0JCQkJZW5jYXAgPSBhW09WU19LRVlfQVRUUl9FTkNBUF07Ci0JCQkJZXJyID0gcGFyc2VfZmxvd19tYXNrX25sYXR0cnMoZW5jYXAsIGEsCi0JCQkJCQkJICAgICAgJm1hc2tfYXR0cnMsIGxvZyk7Ci0JCQkJaWYgKGVycikKLQkJCQkJZ290byBmcmVlX25ld21hc2s7Ci0JCQl9IGVsc2UgewotCQkJCU9WU19OTEVSUihsb2csICJWTEFOIGZyYW1lcyBtdXN0IGhhdmUgYW4gZXhhY3QgbWF0Y2ggb24gdGhlIFRQSUQgKG1hc2s9JXgpLiIsCi0JCQkJCSAgbnRvaHMoZXRoX3R5cGUpKTsKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWdvdG8gZnJlZV9uZXdtYXNrOwotCQkJfQotCi0JCQlpZiAoYVtPVlNfS0VZX0FUVFJfVkxBTl0pCi0JCQkJdGNpID0gbmxhX2dldF9iZTE2KGFbT1ZTX0tFWV9BVFRSX1ZMQU5dKTsKLQotCQkJaWYgKCEodGNpICYgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCkpKSB7Ci0JCQkJT1ZTX05MRVJSKGxvZywgIlZMQU4gdGFnIHByZXNlbnQgYml0IG11c3QgaGF2ZSBhbiBleGFjdCBtYXRjaCAodGNpX21hc2s9JXgpLiIsCi0JCQkJCSAgbnRvaHModGNpKSk7Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCQlnb3RvIGZyZWVfbmV3bWFzazsKLQkJCX0KLQkJfQorCQllcnIgPSBwYXJzZV92bGFuX2Zyb21fbmxhdHRycyhtYXRjaCwgJm1hc2tfYXR0cnMsIGEsIHRydWUsIGxvZyk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZyZWVfbmV3bWFzazsKIAogCQllcnIgPSBvdnNfa2V5X2Zyb21fbmxhdHRycyhuZXQsIG1hdGNoLCBtYXNrX2F0dHJzLCBhLCB0cnVlLAogCQkJCQkgICBsb2cpOwpAQCAtMTQxMCwxMiArMTQ5NywyNSBAQAogCXJldHVybiBtZXRhZGF0YV9mcm9tX25sYXR0cnMobmV0LCAmbWF0Y2gsICZhdHRycywgYSwgZmFsc2UsIGxvZyk7CiB9CiAKK3N0YXRpYyBpbnQgb3ZzX25sYV9wdXRfdmxhbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3Qgdmxhbl9oZWFkICp2aCwKKwkJCSAgICBib29sIGlzX21hc2spCit7CisJX19iZTE2IGV0aF90eXBlID0gIWlzX21hc2sgPyB2aC0+dHBpZCA6IGh0b25zKDB4ZmZmZik7CisKKwlpZiAobmxhX3B1dF9iZTE2KHNrYiwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSwgZXRoX3R5cGUpIHx8CisJICAgIG5sYV9wdXRfYmUxNihza2IsIE9WU19LRVlfQVRUUl9WTEFOLCB2aC0+dGNpKSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX292c19ubGFfcHV0X2tleShjb25zdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKnN3a2V5LAogCQkJICAgICBjb25zdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKm91dHB1dCwgYm9vbCBpc19tYXNrLAogCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBvdnNfa2V5X2V0aGVybmV0ICpldGhfa2V5OwotCXN0cnVjdCBubGF0dHIgKm5sYSwgKmVuY2FwOworCXN0cnVjdCBubGF0dHIgKm5sYTsKKwlzdHJ1Y3QgbmxhdHRyICplbmNhcCA9IE5VTEw7CisJc3RydWN0IG5sYXR0ciAqaW5fZW5jYXAgPSBOVUxMOwogCiAJaWYgKG5sYV9wdXRfdTMyKHNrYiwgT1ZTX0tFWV9BVFRSX1JFQ0lSQ19JRCwgb3V0cHV0LT5yZWNpcmNfaWQpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKQEAgLTE0NjQsMTcgKzE1NjQsMjEgQEAKIAlldGhlcl9hZGRyX2NvcHkoZXRoX2tleS0+ZXRoX3NyYywgb3V0cHV0LT5ldGguc3JjKTsKIAlldGhlcl9hZGRyX2NvcHkoZXRoX2tleS0+ZXRoX2RzdCwgb3V0cHV0LT5ldGguZHN0KTsKIAotCWlmIChzd2tleS0+ZXRoLnRjaSB8fCBzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7Ci0JCV9fYmUxNiBldGhfdHlwZTsKLQkJZXRoX3R5cGUgPSAhaXNfbWFzayA/IGh0b25zKEVUSF9QXzgwMjFRKSA6IGh0b25zKDB4ZmZmZik7Ci0JCWlmIChubGFfcHV0X2JlMTYoc2tiLCBPVlNfS0VZX0FUVFJfRVRIRVJUWVBFLCBldGhfdHlwZSkgfHwKLQkJICAgIG5sYV9wdXRfYmUxNihza2IsIE9WU19LRVlfQVRUUl9WTEFOLCBvdXRwdXQtPmV0aC50Y2kpKQorCWlmIChzd2tleS0+ZXRoLnZsYW4udGNpIHx8IGV0aF90eXBlX3ZsYW4oc3drZXktPmV0aC50eXBlKSkgeworCQlpZiAob3ZzX25sYV9wdXRfdmxhbihza2IsICZvdXRwdXQtPmV0aC52bGFuLCBpc19tYXNrKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQllbmNhcCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgT1ZTX0tFWV9BVFRSX0VOQ0FQKTsKLQkJaWYgKCFzd2tleS0+ZXRoLnRjaSkKKwkJaWYgKCFzd2tleS0+ZXRoLnZsYW4udGNpKQogCQkJZ290byB1bmVuY2FwOwotCX0gZWxzZQotCQllbmNhcCA9IE5VTEw7CisKKwkJaWYgKHN3a2V5LT5ldGguY3ZsYW4udGNpIHx8IGV0aF90eXBlX3ZsYW4oc3drZXktPmV0aC50eXBlKSkgeworCQkJaWYgKG92c19ubGFfcHV0X3ZsYW4oc2tiLCAmb3V0cHV0LT5ldGguY3ZsYW4sIGlzX21hc2spKQorCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCQkJaW5fZW5jYXAgPSBubGFfbmVzdF9zdGFydChza2IsIE9WU19LRVlfQVRUUl9FTkNBUCk7CisJCQlpZiAoIXN3a2V5LT5ldGguY3ZsYW4udGNpKQorCQkJCWdvdG8gdW5lbmNhcDsKKwkJfQorCX0KIAogCWlmIChzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfODAyXzIpKSB7CiAJCS8qCkBAIC0xNDkzLDYgKzE1OTcsMTQgQEAKIAlpZiAobmxhX3B1dF9iZTE2KHNrYiwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSwgb3V0cHV0LT5ldGgudHlwZSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCisJaWYgKGV0aF90eXBlX3ZsYW4oc3drZXktPmV0aC50eXBlKSkgeworCQkvKiBUaGVyZSBhcmUgMyBWTEFOIHRhZ3MsIHdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIHJlc3QKKwkJICogb2YgdGhlIHBhY2tldCwgc28gdHJ1bmNhdGUgaGVyZS4KKwkJICovCisJCVdBUk5fT05fT05DRSghKGVuY2FwICYmIGluX2VuY2FwKSk7CisJCWdvdG8gdW5lbmNhcDsKKwl9CisKIAlpZiAoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQKSkgewogCQlzdHJ1Y3Qgb3ZzX2tleV9pcHY0ICppcHY0X2tleTsKIApAQCAtMTYxOSw2ICsxNzMxLDggQEAKIAl9CiAKIHVuZW5jYXA6CisJaWYgKGluX2VuY2FwKQorCQlubGFfbmVzdF9lbmQoc2tiLCBpbl9lbmNhcCk7CiAJaWYgKGVuY2FwKQogCQlubGFfbmVzdF9lbmQoc2tiLCBlbmNhcCk7CiAKQEAgLTE4ODIsMTMgKzE5OTYsMTUgQEAKIAogdm9pZCBvdnNfbWF0Y2hfaW5pdChzdHJ1Y3Qgc3dfZmxvd19tYXRjaCAqbWF0Y2gsCiAJCSAgICBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSwKKwkJICAgIGJvb2wgcmVzZXRfa2V5LAogCQkgICAgc3RydWN0IHN3X2Zsb3dfbWFzayAqbWFzaykKIHsKIAltZW1zZXQobWF0Y2gsIDAsIHNpemVvZigqbWF0Y2gpKTsKIAltYXRjaC0+a2V5ID0ga2V5OwogCW1hdGNoLT5tYXNrID0gbWFzazsKIAotCW1lbXNldChrZXksIDAsIHNpemVvZigqa2V5KSk7CisJaWYgKHJlc2V0X2tleSkKKwkJbWVtc2V0KGtleSwgMCwgc2l6ZW9mKCprZXkpKTsKIAogCWlmIChtYXNrKSB7CiAJCW1lbXNldCgmbWFzay0+a2V5LCAwLCBzaXplb2YobWFzay0+a2V5KSk7CkBAIC0xOTM1LDcgKzIwNTEsNyBAQAogCXN0cnVjdCBubGF0dHIgKmE7CiAJaW50IGVyciA9IDAsIHN0YXJ0LCBvcHRzX3R5cGU7CiAKLQlvdnNfbWF0Y2hfaW5pdCgmbWF0Y2gsICZrZXksIE5VTEwpOworCW92c19tYXRjaF9pbml0KCZtYXRjaCwgJmtleSwgdHJ1ZSwgTlVMTCk7CiAJb3B0c190eXBlID0gaXBfdHVuX2Zyb21fbmxhdHRyKG5sYV9kYXRhKGF0dHIpLCAmbWF0Y2gsIGZhbHNlLCBsb2cpOwogCWlmIChvcHRzX3R5cGUgPCAwKQogCQlyZXR1cm4gb3B0c190eXBlOwpAQCAtMjI4Myw3ICsyMzk5LDcgQEAKIAogCQljYXNlIE9WU19BQ1RJT05fQVRUUl9QVVNIX1ZMQU46CiAJCQl2bGFuID0gbmxhX2RhdGEoYSk7Ci0JCQlpZiAodmxhbi0+dmxhbl90cGlkICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJCWlmICghZXRoX3R5cGVfdmxhbih2bGFuLT52bGFuX3RwaWQpKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJaWYgKCEodmxhbi0+dmxhbl90Y2kgJiBodG9ucyhWTEFOX1RBR19QUkVTRU5UKSkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMzg4LDcgKzI1MDQsNyBAQAogCiAJKCpzZmEpLT5vcmlnX2xlbiA9IG5sYV9sZW4oYXR0cik7CiAJZXJyID0gX19vdnNfbmxhX2NvcHlfYWN0aW9ucyhuZXQsIGF0dHIsIGtleSwgMCwgc2ZhLCBrZXktPmV0aC50eXBlLAotCQkJCSAgICAga2V5LT5ldGgudGNpLCBsb2cpOworCQkJCSAgICAga2V5LT5ldGgudmxhbi50Y2ksIGxvZyk7CiAJaWYgKGVycikKIAkJb3ZzX25sYV9mcmVlX2Zsb3dfYWN0aW9ucygqc2ZhKTsKIApkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5oIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5oCmluZGV4IDQ3ZGQxNDIuLjQ1Zjk3NjkgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuaAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmgKQEAgLTQxLDcgKzQxLDggQEAKIHNpemVfdCBvdnNfa2V5X2F0dHJfc2l6ZSh2b2lkKTsKIAogdm9pZCBvdnNfbWF0Y2hfaW5pdChzdHJ1Y3Qgc3dfZmxvd19tYXRjaCAqbWF0Y2gsCi0JCSAgICBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSwgc3RydWN0IHN3X2Zsb3dfbWFzayAqbWFzayk7CisJCSAgICBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSwgYm9vbCByZXNldF9rZXksCisJCSAgICBzdHJ1Y3Qgc3dfZmxvd19tYXNrICptYXNrKTsKIAogaW50IG92c19ubGFfcHV0X2tleShjb25zdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKiwgY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICosCiAJCSAgICBpbnQgYXR0ciwgYm9vbCBpc19tYXNrLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9mbG93X3RhYmxlLmMgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd190YWJsZS5jCmluZGV4IGQwNzNmZmYuLmVhN2E4MDcgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93X3RhYmxlLmMKKysrIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfdGFibGUuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CkBAIC03OSwxNyArODAsMTIgQEAKIHsKIAlzdHJ1Y3Qgc3dfZmxvdyAqZmxvdzsKIAlzdHJ1Y3QgZmxvd19zdGF0cyAqc3RhdHM7Ci0JaW50IG5vZGU7CiAKLQlmbG93ID0ga21lbV9jYWNoZV9hbGxvYyhmbG93X2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlmbG93ID0ga21lbV9jYWNoZV96YWxsb2MoZmxvd19jYWNoZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmbG93KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCWZsb3ctPnNmX2FjdHMgPSBOVUxMOwotCWZsb3ctPm1hc2sgPSBOVUxMOwotCWZsb3ctPmlkLnVubWFza2VkX2tleSA9IE5VTEw7Ci0JZmxvdy0+aWQudWZpZF9sZW4gPSAwOwotCWZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyID0gTlVNQV9OT19OT0RFOworCWZsb3ctPnN0YXRzX2xhc3Rfd3JpdGVyID0gLTE7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IHN0YXQgbm9kZS4gKi8KIAlzdGF0cyA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShmbG93X3N0YXRzX2NhY2hlLApAQCAtMTAyLDEwICs5OCw2IEBACiAKIAlSQ1VfSU5JVF9QT0lOVEVSKGZsb3ctPnN0YXRzWzBdLCBzdGF0cyk7CiAKLQlmb3JfZWFjaF9ub2RlKG5vZGUpCi0JCWlmIChub2RlICE9IDApCi0JCQlSQ1VfSU5JVF9QT0lOVEVSKGZsb3ctPnN0YXRzW25vZGVdLCBOVUxMKTsKLQogCXJldHVybiBmbG93OwogZXJyOgogCWttZW1fY2FjaGVfZnJlZShmbG93X2NhY2hlLCBmbG93KTsKQEAgLTE0MiwxNiArMTM0LDE3IEBACiAKIHN0YXRpYyB2b2lkIGZsb3dfZnJlZShzdHJ1Y3Qgc3dfZmxvdyAqZmxvdykKIHsKLQlpbnQgbm9kZTsKKwlpbnQgY3B1OwogCiAJaWYgKG92c19pZGVudGlmaWVyX2lzX2tleSgmZmxvdy0+aWQpKQogCQlrZnJlZShmbG93LT5pZC51bm1hc2tlZF9rZXkpOwogCWlmIChmbG93LT5zZl9hY3RzKQogCQlvdnNfbmxhX2ZyZWVfZmxvd19hY3Rpb25zKChzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zIF9fZm9yY2UgKilmbG93LT5zZl9hY3RzKTsKLQlmb3JfZWFjaF9ub2RlKG5vZGUpCi0JCWlmIChmbG93LT5zdGF0c1tub2RlXSkKKwkvKiBXZSBvcGVuIGNvZGUgdGhpcyB0byBtYWtlIHN1cmUgY3B1IDAgaXMgYWx3YXlzIGNvbnNpZGVyZWQgKi8KKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG5yX2NwdV9pZHM7IGNwdSA9IGNwdW1hc2tfbmV4dChjcHUsIGNwdV9wb3NzaWJsZV9tYXNrKSkKKwkJaWYgKGZsb3ctPnN0YXRzW2NwdV0pCiAJCQlrbWVtX2NhY2hlX2ZyZWUoZmxvd19zdGF0c19jYWNoZSwKLQkJCQkJKHN0cnVjdCBmbG93X3N0YXRzIF9fZm9yY2UgKilmbG93LT5zdGF0c1tub2RlXSk7CisJCQkJCShzdHJ1Y3QgZmxvd19zdGF0cyBfX2ZvcmNlICopZmxvdy0+c3RhdHNbY3B1XSk7CiAJa21lbV9jYWNoZV9mcmVlKGZsb3dfY2FjaGUsIGZsb3cpOwogfQogCkBAIC03NTYsNyArNzQ5LDcgQEAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBzd19mbG93X2tleSkgJSBzaXplb2YobG9uZykpOwogCiAJZmxvd19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzd19mbG93Iiwgc2l6ZW9mKHN0cnVjdCBzd19mbG93KQotCQkJCSAgICAgICArIChucl9ub2RlX2lkcworCQkJCSAgICAgICArIChucl9jcHVfaWRzCiAJCQkJCSAgKiBzaXplb2Yoc3RydWN0IGZsb3dfc3RhdHMgKikpLAogCQkJCSAgICAgICAwLCAwLCBOVUxMKTsKIAlpZiAoZmxvd19jYWNoZSA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LmMgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQuYwppbmRleCA2YjIxZmQwLi44ZjE5ODQzIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQuYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQuYwpAQCAtNDg1LDkgKzQ4NSwxNCBAQAogewogCXVuc2lnbmVkIGludCBsZW5ndGggPSBza2ItPmxlbiAtIEVUSF9ITEVOOwogCi0JaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCWlmIChza2Jfdmxhbl90YWdnZWQoc2tiKSkKIAkJbGVuZ3RoIC09IFZMQU5fSExFTjsKIAorCS8qIERvbid0IHN1YnRyYWN0IGZvciBtdWx0aXBsZSBWTEFOIHRhZ3MuIE1vc3QgKGFsbD8pIGRyaXZlcnMgYWxsb3cKKwkgKiAoRVRIX0xFTiArIFZMQU5fSExFTikgaW4gYWRkaXRpb24gdG8gdGhlIG10dSB2YWx1ZSwgYnV0IGFsbW9zdCBub25lCisJICogYWNjb3VudCBmb3IgODAyLjFhZC4gZS5nLiBpc19za2JfZm9yd2FyZGFibGUoKS4KKwkgKi8KKwogCXJldHVybiBsZW5ndGg7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9yZHMvaWIuaCBiL25ldC9yZHMvaWIuaAppbmRleCAwNDZmNzUwLi40NWFjOGU4IDEwMDY0NAotLS0gYS9uZXQvcmRzL2liLmgKKysrIGIvbmV0L3Jkcy9pYi5oCkBAIC0zMzMsNiArMzMzLDcgQEAKIHZvaWQgcmRzX2liX3N0YXRlX2NoYW5nZShzdHJ1Y3Qgc29jayAqc2spOwogaW50IHJkc19pYl9saXN0ZW5faW5pdCh2b2lkKTsKIHZvaWQgcmRzX2liX2xpc3Rlbl9zdG9wKHZvaWQpOworX19wcmludGYoMiwgMykKIHZvaWQgX19yZHNfaWJfY29ubl9lcnJvcihzdHJ1Y3QgcmRzX2Nvbm5lY3Rpb24gKmNvbm4sIGNvbnN0IGNoYXIgKiwgLi4uKTsKIGludCByZHNfaWJfY21faGFuZGxlX2Nvbm5lY3Qoc3RydWN0IHJkbWFfY21faWQgKmNtX2lkLAogCQkJICAgICBzdHJ1Y3QgcmRtYV9jbV9ldmVudCAqZXZlbnQpOwpkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9yZHMuaCBiL25ldC9yZHMvcmRzLmgKaW5kZXggYjJkMTdmMC4uZmQwYmNjYiAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9yZHMuaAorKysgYi9uZXQvcmRzL3Jkcy5oCkBAIC02ODgsNiArNjg4LDcgQEAKICNkZWZpbmUgcmRzX2Nvbm5fZXJyb3IoY29ubiwgZm10Li4uKSBcCiAJX19yZHNfY29ubl9lcnJvcihjb25uLCBLRVJOX1dBUk5JTkcgIlJEUzogIiBmbXQpCiAKK19fcHJpbnRmKDIsIDMpCiB2b2lkIF9fcmRzX2Nvbm5fcGF0aF9lcnJvcihzdHJ1Y3QgcmRzX2Nvbm5fcGF0aCAqY3AsIGNvbnN0IGNoYXIgKiwgLi4uKTsKICNkZWZpbmUgcmRzX2Nvbm5fcGF0aF9lcnJvcihjcCwgZm10Li4uKSBcCiAJX19yZHNfY29ubl9wYXRoX2Vycm9yKGNwLCBLRVJOX1dBUk5JTkcgIlJEUzogIiBmbXQpCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvS2NvbmZpZyBiL25ldC9yeHJwYy9LY29uZmlnCmluZGV4IDc4NGM1MzEuLjg2Zjg4NTMgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9LY29uZmlnCisrKyBiL25ldC9yeHJwYy9LY29uZmlnCkBAIC0xOSw2ICsxOSwyMCBAQAogCiAJICBTZWUgRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3J4cnBjLnR4dC4KIAorY29uZmlnIEFGX1JYUlBDX0lQVjYKKwlib29sICJJUHY2IHN1cHBvcnQgZm9yIFJ4UlBDIgorCWRlcGVuZHMgb24gKElQVjYgPSBtICYmIEFGX1JYUlBDID0gbSkgfHwgKElQVjYgPSB5ICYmIEFGX1JYUlBDKQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gYWxsb3cgQUZfUlhSUEMgdG8gdXNlIElQVjYgVURQIGFzIHdlbGwgYXMgSVBWNCBVRFAgYXMKKwkgIGl0cyBuZXR3b3JrIHRyYW5zcG9ydC4KKworY29uZmlnIEFGX1JYUlBDX0lOSkVDVF9MT1NTCisJYm9vbCAiSW5qZWN0IHBhY2tldCBsb3NzIGludG8gUnhSUEMgcGFja2V0IHN0cmVhbSIKKwlkZXBlbmRzIG9uIEFGX1JYUlBDCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmplY3QgcGFja2V0IGxvc3MgYnkgZGlzY2FyZGluZyBzb21lIHJlY2VpdmVkIGFuZCBzb21lCisJICB0cmFuc21pdHRlZCBwYWNrZXRzLgorCiAKIGNvbmZpZyBBRl9SWFJQQ19ERUJVRwogCWJvb2wgIlJ4UlBDIGR5bmFtaWMgZGVidWdnaW5nIgpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL01ha2VmaWxlIGIvbmV0L3J4cnBjL01ha2VmaWxlCmluZGV4IDEwZjNmNDguLjhmYzZlYTMgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9NYWtlZmlsZQorKysgYi9uZXQvcnhycGMvTWFrZWZpbGUKQEAgLTIyLDYgKzIyLDcgQEAKIAlwZWVyX29iamVjdC5vIFwKIAlyZWN2bXNnLm8gXAogCXNlY3VyaXR5Lm8gXAorCXNlbmRtc2cubyBcCiAJc2tidWZmLm8gXAogCXV0aWxzLm8KIApkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FmX3J4cnBjLmMgYi9uZXQvcnhycGMvYWZfcnhycGMuYwppbmRleCA4OGVmZmFkLi40NGM5YzJiIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvYWZfcnhycGMuYworKysgYi9uZXQvcnhycGMvYWZfcnhycGMuYwpAQCAtMTYsMTIgKzE2LDE0IEBACiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgva2V5LXR5cGUuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlJ4UlBDIG5ldHdvcmsgcHJvdG9jb2wiKTsKQEAgLTQzLDcgKzQ1LDcgQEAKIGF0b21pY190IHJ4cnBjX2RlYnVnX2lkOwogCiAvKiBjb3VudCBvZiBza2JzIGN1cnJlbnRseSBpbiB1c2UgKi8KLWF0b21pY190IHJ4cnBjX25fc2ticzsKK2F0b21pY190IHJ4cnBjX25fdHhfc2ticywgcnhycGNfbl9yeF9za2JzOwogCiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcnhycGNfd29ya3F1ZXVlOwogCkBAIC0xMDQsMTkgKzEwNiwyNSBAQAogCWNhc2UgQUZfSU5FVDoKIAkJaWYgKHNyeC0+dHJhbnNwb3J0X2xlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCV9kZWJ1ZygiSU5FVDogJXggQCAlcEk0IiwKLQkJICAgICAgIG50b2hzKHNyeC0+dHJhbnNwb3J0LnNpbi5zaW5fcG9ydCksCi0JCSAgICAgICAmc3J4LT50cmFuc3BvcnQuc2luLnNpbl9hZGRyKTsKIAkJdGFpbCA9IG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9yeHJwYywgdHJhbnNwb3J0LnNpbi5fX3BhZCk7CiAJCWJyZWFrOwogCisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKIAljYXNlIEFGX0lORVQ2OgorCQlpZiAoc3J4LT50cmFuc3BvcnRfbGVuIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXRhaWwgPSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfcnhycGMsIHRyYW5zcG9ydCkgKworCQkJc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQlicmVhazsKKyNlbmRpZgorCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CiAJfQogCiAJaWYgKHRhaWwgPCBsZW4pCiAJCW1lbXNldCgodm9pZCAqKXNyeCArIHRhaWwsIDAsIGxlbiAtIHRhaWwpOworCV9kZWJ1ZygiSU5FVDogJXBJU3AiLCAmc3J4LT50cmFuc3BvcnQpOwogCXJldHVybiAwOwogfQogCkBAIC0xMjgsNyArMTM2LDggQEAKIAlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCA9IChzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKilzYWRkcjsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsOwotCXN0cnVjdCByeHJwY19zb2NrICpyeCA9IHJ4cnBjX3NrKHNrKSwgKnByeDsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzayk7CisJdTE2IHNlcnZpY2VfaWQgPSBzcngtPnNyeF9zZXJ2aWNlOwogCWludCByZXQ7CiAKIAlfZW50ZXIoIiVwLCVwLCVkIiwgcngsIHNhZGRyLCBsZW4pOwpAQCAtMTUyLDE2ICsxNjEsMTMgQEAKIAkJZ290byBlcnJvcl91bmxvY2s7CiAJfQogCi0JaWYgKHJ4LT5zcnguc3J4X3NlcnZpY2UpIHsKLQkJd3JpdGVfbG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByeCwgJmxvY2FsLT5zZXJ2aWNlcywgbGlzdGVuX2xpbmspIHsKLQkJCWlmIChwcngtPnNyeC5zcnhfc2VydmljZSA9PSByeC0+c3J4LnNyeF9zZXJ2aWNlKQotCQkJCWdvdG8gc2VydmljZV9pbl91c2U7Ci0JCX0KLQorCWlmIChzZXJ2aWNlX2lkKSB7CisJCXdyaXRlX2xvY2soJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwkJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihsb2NhbC0+c2VydmljZSkpCisJCQlnb3RvIHNlcnZpY2VfaW5fdXNlOwogCQlyeC0+bG9jYWwgPSBsb2NhbDsKLQkJbGlzdF9hZGRfdGFpbCgmcngtPmxpc3Rlbl9saW5rLCAmbG9jYWwtPnNlcnZpY2VzKTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihsb2NhbC0+c2VydmljZSwgcngpOworCQl3cml0ZV91bmxvY2soJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKIAogCQlyeC0+c2suc2tfc3RhdGUgPSBSWFJQQ19TRVJWRVJfQk9VTkQ7CiAJfSBlbHNlIHsKQEAgLTE3NCw3ICsxODAsNyBAQAogCXJldHVybiAwOwogCiBzZXJ2aWNlX2luX3VzZToKLQl3cml0ZV91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwl3cml0ZV91bmxvY2soJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKIAlyeHJwY19wdXRfbG9jYWwobG9jYWwpOwogCXJldCA9IC1FQUREUklOVVNFOwogZXJyb3JfdW5sb2NrOgpAQCAtMTkxLDcgKzE5Nyw3IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gcnhycGNfc2soc2spOwotCXVuc2lnbmVkIGludCBtYXg7CisJdW5zaWduZWQgaW50IG1heCwgb2xkOwogCWludCByZXQ7CiAKIAlfZW50ZXIoIiVwLCVkIiwgcngsIGJhY2tsb2cpOwpAQCAtMjEwLDkgKzIxNiwxMyBAQAogCQkJYmFja2xvZyA9IG1heDsKIAkJZWxzZSBpZiAoYmFja2xvZyA8IDAgfHwgYmFja2xvZyA+IG1heCkKIAkJCWJyZWFrOworCQlvbGQgPSBzay0+c2tfbWF4X2Fja19iYWNrbG9nOwogCQlzay0+c2tfbWF4X2Fja19iYWNrbG9nID0gYmFja2xvZzsKLQkJcngtPnNrLnNrX3N0YXRlID0gUlhSUENfU0VSVkVSX0xJU1RFTklORzsKLQkJcmV0ID0gMDsKKwkJcmV0ID0gcnhycGNfc2VydmljZV9wcmVhbGxvYyhyeCwgR0ZQX0tFUk5FTCk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJ4LT5zay5za19zdGF0ZSA9IFJYUlBDX1NFUlZFUl9MSVNURU5JTkc7CisJCWVsc2UKKwkJCXNrLT5za19tYXhfYWNrX2JhY2tsb2cgPSBvbGQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FQlVTWTsKQEAgLTIzMCw2ICsyNDAsOCBAQAogICogQHNyeDogVGhlIGFkZHJlc3Mgb2YgdGhlIHBlZXIgdG8gY29udGFjdAogICogQGtleTogVGhlIHNlY3VyaXR5IGNvbnRleHQgdG8gdXNlIChkZWZhdWx0cyB0byBzb2NrZXQgc2V0dGluZykKICAqIEB1c2VyX2NhbGxfSUQ6IFRoZSBJRCB0byB1c2UKKyAqIEBnZnA6IFRoZSBhbGxvY2F0aW9uIGNvbnN0cmFpbnRzCisgKiBAbm90aWZ5X3J4OiBXaGVyZSB0byBzZW5kIG5vdGlmaWNhdGlvbnMgaW5zdGVhZCBvZiBzb2NrZXQgcXVldWUKICAqCiAgKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGJlZ2luIGEgY2FsbCBvbiB0aGUgbm9taW5hdGVkIHNvY2tldC4gIFRoaXMganVzdAogICogc2V0cyB1cCBhbGwgdGhlIGludGVybmFsIHRyYWNraW5nIHN0cnVjdHVyZXMgYW5kIGFsbG9jYXRlcyBjb25uZWN0aW9uIGFuZApAQCAtMjQyLDcgKzI1NCw4IEBACiAJCQkJCSAgIHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqc3J4LAogCQkJCQkgICBzdHJ1Y3Qga2V5ICprZXksCiAJCQkJCSAgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lELAotCQkJCQkgICBnZnBfdCBnZnApCisJCQkJCSAgIGdmcF90IGdmcCwKKwkJCQkJICAgcnhycGNfbm90aWZ5X3J4X3Qgbm90aWZ5X3J4KQogewogCXN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgY3A7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CkBAIC0yNjksNiArMjgyLDggQEAKIAljcC5leGNsdXNpdmUJCT0gZmFsc2U7CiAJY3Auc2VydmljZV9pZAkJPSBzcngtPnNyeF9zZXJ2aWNlOwogCWNhbGwgPSByeHJwY19uZXdfY2xpZW50X2NhbGwocngsICZjcCwgc3J4LCB1c2VyX2NhbGxfSUQsIGdmcCk7CisJaWYgKCFJU19FUlIoY2FsbCkpCisJCWNhbGwtPm5vdGlmeV9yeCA9IG5vdGlmeV9yeDsKIAogCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKIAlfbGVhdmUoIiA9ICVwIiwgY2FsbCk7CkBAIC0yNzgsNDAgKzI5MywzOSBAQAogCiAvKioKICAqIHJ4cnBjX2tlcm5lbF9lbmRfY2FsbCAtIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gZW5kIGEgY2FsbCBpdCB3YXMgdXNpbmcKKyAqIEBzb2NrOiBUaGUgc29ja2V0IHRoZSBjYWxsIGlzIG9uCiAgKiBAY2FsbDogVGhlIGNhbGwgdG8gZW5kCiAgKgogICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBlbmQgYSBjYWxsIGl0IHdhcyB1c2luZy4gIFRoZSBjYWxsIG11c3QgYmUKICAqIGNvbXBsZXRlIGJlZm9yZSB0aGlzIGlzIGNhbGxlZCAodGhlIGNhbGwgc2hvdWxkIGJlIGFib3J0ZWQgaWYgbmVjZXNzYXJ5KS4KICAqLwotdm9pZCByeHJwY19rZXJuZWxfZW5kX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit2b2lkIHJ4cnBjX2tlcm5lbF9lbmRfY2FsbChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKIHsKIAlfZW50ZXIoIiVkeyVkfSIsIGNhbGwtPmRlYnVnX2lkLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpKTsKLQlyeHJwY19yZW1vdmVfdXNlcl9JRChjYWxsLT5zb2NrZXQsIGNhbGwpOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCXJ4cnBjX3JlbGVhc2VfY2FsbChyeHJwY19zayhzb2NrLT5zayksIGNhbGwpOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0X2tlcm5lbCk7CiB9CiBFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9lbmRfY2FsbCk7CiAKIC8qKgotICogcnhycGNfa2VybmVsX2ludGVyY2VwdF9yeF9tZXNzYWdlcyAtIEludGVyY2VwdCByZWNlaXZlZCBSeFJQQyBtZXNzYWdlcworICogcnhycGNfa2VybmVsX25ld19jYWxsX25vdGlmaWNhdGlvbiAtIEdldCBub3RpZmljYXRpb25zIG9mIG5ldyBjYWxscwogICogQHNvY2s6IFRoZSBzb2NrZXQgdG8gaW50ZXJjZXB0IHJlY2VpdmVkIG1lc3NhZ2VzIG9uCi0gKiBAaW50ZXJjZXB0b3I6IFRoZSBmdW5jdGlvbiB0byBwYXNzIHRoZSBtZXNzYWdlcyB0bworICogQG5vdGlmeV9uZXdfY2FsbDogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gbmV3IGNhbGxzIGFwcGVhcgorICogQGRpc2NhcmRfbmV3X2NhbGw6IEZ1bmN0aW9uIHRvIGRpc2NhcmQgcHJlYWxsb2NhdGVkIGNhbGxzCiAgKgotICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBpbnRlcmNlcHQgbWVzc2FnZXMgaGVhZGluZyBmb3IgdGhlIFJ4IHF1ZXVlIG9uIGFuCi0gKiBSeFJQQyBzb2NrZXQuICBUaGV5IGdldCBwYXNzZWQgdG8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBpbnN0ZWFkLgotICogQGludGVyY2VwdG9yIHNob3VsZCBmcmVlIHRoZSBzb2NrZXQgYnVmZmVycyBpdCBpcyBnaXZlbi4gIEBpbnRlcmNlcHRvciBpcwotICogY2FsbGVkIHdpdGggdGhlIHNvY2tldCByZWNlaXZlIHF1ZXVlIHNwaW5sb2NrIGhlbGQgYW5kIHNvZnRpcnFzIGRpc2FibGVkIC0KLSAqIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBtZXNzYWdlcyB3aWxsIGJlIGRlbGl2ZXJlZCBpbiB0aGUgcmlnaHQgb3JkZXIuCisgKiBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGJlIGdpdmVuIG5vdGlmaWNhdGlvbnMgYWJvdXQgbmV3IGNhbGxzLgogICovCi12b2lkIHJ4cnBjX2tlcm5lbF9pbnRlcmNlcHRfcnhfbWVzc2FnZXMoc3RydWN0IHNvY2tldCAqc29jaywKLQkJCQkJcnhycGNfaW50ZXJjZXB0b3JfdCBpbnRlcmNlcHRvcikKK3ZvaWQgcnhycGNfa2VybmVsX25ld19jYWxsX25vdGlmaWNhdGlvbigKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCXJ4cnBjX25vdGlmeV9uZXdfY2FsbF90IG5vdGlmeV9uZXdfY2FsbCwKKwlyeHJwY19kaXNjYXJkX25ld19jYWxsX3QgZGlzY2FyZF9uZXdfY2FsbCkKIHsKIAlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzb2NrLT5zayk7CiAKLQlfZW50ZXIoIiIpOwotCXJ4LT5pbnRlcmNlcHRvciA9IGludGVyY2VwdG9yOworCXJ4LT5ub3RpZnlfbmV3X2NhbGwgPSBub3RpZnlfbmV3X2NhbGw7CisJcngtPmRpc2NhcmRfbmV3X2NhbGwgPSBkaXNjYXJkX25ld19jYWxsOwogfQotCi1FWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9pbnRlcmNlcHRfcnhfbWVzc2FnZXMpOworRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfbmV3X2NhbGxfbm90aWZpY2F0aW9uKTsKIAogLyoKICAqIGNvbm5lY3QgYW4gUnhSUEMgc29ja2V0CkBAIC0zOTEsNiArNDA1LDIzIEBACiAKIAlzd2l0Y2ggKHJ4LT5zay5za19zdGF0ZSkgewogCWNhc2UgUlhSUENfVU5CT1VORDoKKwkJcngtPnNyeC5zcnhfZmFtaWx5ID0gQUZfUlhSUEM7CisJCXJ4LT5zcnguc3J4X3NlcnZpY2UgPSAwOworCQlyeC0+c3J4LnRyYW5zcG9ydF90eXBlID0gU09DS19ER1JBTTsKKwkJcngtPnNyeC50cmFuc3BvcnQuZmFtaWx5ID0gcngtPmZhbWlseTsKKwkJc3dpdGNoIChyeC0+ZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCXJ4LT5zcngudHJhbnNwb3J0X2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCXJ4LT5zcngudHJhbnNwb3J0X2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUFGTk9TVVBQT1JUOworCQkJZ290byBlcnJvcl91bmxvY2s7CisJCX0KIAkJbG9jYWwgPSByeHJwY19sb29rdXBfbG9jYWwoJnJ4LT5zcngpOwogCQlpZiAoSVNfRVJSKGxvY2FsKSkgewogCQkJcmV0ID0gUFRSX0VSUihsb2NhbCk7CkBAIC01MDUsMTUgKzUzNiwxNiBAQAogc3RhdGljIHVuc2lnbmVkIGludCByeHJwY19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAogCQkJICAgICAgIHBvbGxfdGFibGUgKndhaXQpCiB7Ci0JdW5zaWduZWQgaW50IG1hc2s7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gcnhycGNfc2soc2spOworCXVuc2lnbmVkIGludCBtYXNrOwogCiAJc29ja19wb2xsX3dhaXQoZmlsZSwgc2tfc2xlZXAoc2spLCB3YWl0KTsKIAltYXNrID0gMDsKIAogCS8qIHRoZSBzb2NrZXQgaXMgcmVhZGFibGUgaWYgdGhlcmUgYXJlIGFueSBtZXNzYWdlcyB3YWl0aW5nIG9uIHRoZSBSeAogCSAqIHF1ZXVlICovCi0JaWYgKCFza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkKKwlpZiAoIWxpc3RfZW1wdHkoJnJ4LT5yZWN2bXNnX3EpKQogCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CiAKIAkvKiB0aGUgc29ja2V0IGlzIHdyaXRhYmxlIGlmIHRoZXJlIGlzIHNwYWNlIHRvIGFkZCBuZXcgZGF0YSB0byB0aGUKQEAgLTU0MCw3ICs1NzIsOCBAQAogCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKIAogCS8qIHdlIHN1cHBvcnQgdHJhbnNwb3J0IHByb3RvY29sIFVEUC9VRFA2IG9ubHkgKi8KLQlpZiAocHJvdG9jb2wgIT0gUEZfSU5FVCkKKwlpZiAocHJvdG9jb2wgIT0gUEZfSU5FVCAmJgorCSAgICBJU19FTkFCTEVEKENPTkZJR19BRl9SWFJQQ19JUFY2KSAmJiBwcm90b2NvbCAhPSBQRl9JTkVUNikKIAkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CiAKIAlpZiAoc29jay0+dHlwZSAhPSBTT0NLX0RHUkFNKQpAQCAtNTU0LDYgKzU4Nyw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCXNvY2tfc2V0X2ZsYWcoc2ssIFNPQ0tfUkNVX0ZSRUUpOwogCXNrLT5za19zdGF0ZQkJPSBSWFJQQ19VTkJPVU5EOwogCXNrLT5za193cml0ZV9zcGFjZQk9IHJ4cnBjX3dyaXRlX3NwYWNlOwogCXNrLT5za19tYXhfYWNrX2JhY2tsb2cJPSAwOwpAQCAtNTYzLDkgKzU5NywxMSBAQAogCXJ4LT5mYW1pbHkgPSBwcm90b2NvbDsKIAlyeC0+Y2FsbHMgPSBSQl9ST09UOwogCi0JSU5JVF9MSVNUX0hFQUQoJnJ4LT5saXN0ZW5fbGluayk7Ci0JSU5JVF9MSVNUX0hFQUQoJnJ4LT5zZWN1cmVxKTsKLQlJTklUX0xJU1RfSEVBRCgmcngtPmFjY2VwdHEpOworCXNwaW5fbG9ja19pbml0KCZyeC0+aW5jb21pbmdfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4LT5zb2NrX2NhbGxzKTsKKwlJTklUX0xJU1RfSEVBRCgmcngtPnRvX2JlX2FjY2VwdGVkKTsKKwlJTklUX0xJU1RfSEVBRCgmcngtPnJlY3Ztc2dfcSk7CisJcndsb2NrX2luaXQoJnJ4LT5yZWN2bXNnX2xvY2spOwogCXJ3bG9ja19pbml0KCZyeC0+Y2FsbF9sb2NrKTsKIAltZW1zZXQoJnJ4LT5zcngsIDAsIHNpemVvZihyeC0+c3J4KSk7CiAKQEAgLTU3NCw2ICs2MTAsMzkgQEAKIH0KIAogLyoKKyAqIEtpbGwgYWxsIHRoZSBjYWxscyBvbiBhIHNvY2tldCBhbmQgc2h1dCBpdCBkb3duLgorICovCitzdGF0aWMgaW50IHJ4cnBjX3NodXRkb3duKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzayk7CisJaW50IHJldCA9IDA7CisKKwlfZW50ZXIoIiVwLCVkIiwgc2ssIGZsYWdzKTsKKworCWlmIChmbGFncyAhPSBTSFVUX1JEV1IpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoc2stPnNrX3N0YXRlID09IFJYUlBDX0NMT1NFKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCWxvY2tfc29jayhzayk7CisKKwlzcGluX2xvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCWlmIChzay0+c2tfc3RhdGUgPCBSWFJQQ19DTE9TRSkgeworCQlzay0+c2tfc3RhdGUgPSBSWFJQQ19DTE9TRTsKKwkJc2stPnNrX3NodXRkb3duID0gU0hVVERPV05fTUFTSzsKKwl9IGVsc2UgeworCQlyZXQgPSAtRVNIVVRET1dOOworCX0KKwlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisKKwlyeHJwY19kaXNjYXJkX3ByZWFsbG9jKHJ4KTsKKworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIFJ4UlBDIHNvY2tldCBkZXN0cnVjdG9yCiAgKi8KIHN0YXRpYyB2b2lkIHJ4cnBjX3NvY2tfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc29jayAqc2spCkBAIC02MDksMTUgKzY3OCwxNCBAQAogCXNrLT5za19zdGF0ZSA9IFJYUlBDX0NMT1NFOwogCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKIAotCUFTU0VSVENNUChyeC0+bGlzdGVuX2xpbmsubmV4dCwgIT0sIExJU1RfUE9JU09OMSk7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJnJ4LT5saXN0ZW5fbGluaykpIHsKLQkJd3JpdGVfbG9ja19iaCgmcngtPmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKLQkJbGlzdF9kZWwoJnJ4LT5saXN0ZW5fbGluayk7Ci0JCXdyaXRlX3VubG9ja19iaCgmcngtPmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwlpZiAocngtPmxvY2FsICYmIHJ4LT5sb2NhbC0+c2VydmljZSA9PSByeCkgeworCQl3cml0ZV9sb2NrKCZyeC0+bG9jYWwtPnNlcnZpY2VzX2xvY2spOworCQlyeC0+bG9jYWwtPnNlcnZpY2UgPSBOVUxMOworCQl3cml0ZV91bmxvY2soJnJ4LT5sb2NhbC0+c2VydmljZXNfbG9jayk7CiAJfQogCiAJLyogdHJ5IHRvIGZsdXNoIG91dCB0aGlzIHNvY2tldCAqLworCXJ4cnBjX2Rpc2NhcmRfcHJlYWxsb2MocngpOwogCXJ4cnBjX3JlbGVhc2VfY2FsbHNfb25fc29ja2V0KHJ4KTsKIAlmbHVzaF93b3JrcXVldWUocnhycGNfd29ya3F1ZXVlKTsKIAlyeHJwY19wdXJnZV9xdWV1ZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOwpAQCAtNjY2LDcgKzczNCw3IEBACiAJLnBvbGwJCT0gcnhycGNfcG9sbCwKIAkuaW9jdGwJCT0gc29ja19ub19pb2N0bCwKIAkubGlzdGVuCQk9IHJ4cnBjX2xpc3RlbiwKLQkuc2h1dGRvd24JPSBzb2NrX25vX3NodXRkb3duLAorCS5zaHV0ZG93bgk9IHJ4cnBjX3NodXRkb3duLAogCS5zZXRzb2Nrb3B0CT0gcnhycGNfc2V0c29ja29wdCwKIAkuZ2V0c29ja29wdAk9IHNvY2tfbm9fZ2V0c29ja29wdCwKIAkuc2VuZG1zZwk9IHJ4cnBjX3NlbmRtc2csCkBAIC02OTcsNyArNzY1LDEzIEBACiAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCByeHJwY19za2JfcHJpdikgPiBGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGNiKSk7CiAKLQlyeHJwY19lcG9jaCA9IGdldF9zZWNvbmRzKCk7CisJZ2V0X3JhbmRvbV9ieXRlcygmcnhycGNfZXBvY2gsIHNpemVvZihyeHJwY19lcG9jaCkpOworCXJ4cnBjX2Vwb2NoIHw9IFJYUlBDX1JBTkRPTV9FUE9DSDsKKwlnZXRfcmFuZG9tX2J5dGVzKCZyeHJwY19jbGllbnRfY29ubl9pZHMuY3VyLAorCQkJIHNpemVvZihyeHJwY19jbGllbnRfY29ubl9pZHMuY3VyKSk7CisJcnhycGNfY2xpZW50X2Nvbm5faWRzLmN1ciAmPSAweDNmZmZmZmZmOworCWlmIChyeHJwY19jbGllbnRfY29ubl9pZHMuY3VyID09IDApCisJCXJ4cnBjX2NsaWVudF9jb25uX2lkcy5jdXIgPSAxOwogCiAJcmV0ID0gLUVOT01FTTsKIAlyeHJwY19jYWxsX2phciA9IGttZW1fY2FjaGVfY3JlYXRlKApAQCAtNzg4LDcgKzg2Miw4IEBACiAJcHJvdG9fdW5yZWdpc3RlcigmcnhycGNfcHJvdG8pOwogCXJ4cnBjX2Rlc3Ryb3lfYWxsX2NhbGxzKCk7CiAJcnhycGNfZGVzdHJveV9hbGxfY29ubmVjdGlvbnMoKTsKLQlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJnJ4cnBjX25fc2ticyksID09LCAwKTsKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJnJ4cnBjX25fdHhfc2ticyksID09LCAwKTsKKwlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJnJ4cnBjX25fcnhfc2ticyksID09LCAwKTsKIAlyeHJwY19kZXN0cm95X2FsbF9sb2NhbHMoKTsKIAogCXJlbW92ZV9wcm9jX2VudHJ5KCJyeHJwY19jb25ucyIsIGluaXRfbmV0LnByb2NfbmV0KTsKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hci1pbnRlcm5hbC5oIGIvbmV0L3J4cnBjL2FyLWludGVybmFsLmgKaW5kZXggZmY4M2ZiMS4uZDM4ZGZmZCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2FyLWludGVybmFsLmgKKysrIGIvbmV0L3J4cnBjL2FyLWludGVybmFsLmgKQEAgLTM1LDExICszNSwyMyBAQAogI2RlZmluZSByeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoV1MsRCkJXAogCXF1ZXVlX2RlbGF5ZWRfd29yayhyeHJwY193b3JrcXVldWUsIChXUyksIChEKSkKIAotI2RlZmluZSByeHJwY19xdWV1ZV9jYWxsKENBTEwpCXJ4cnBjX3F1ZXVlX3dvcmsoJihDQUxMKS0+cHJvY2Vzc29yKQotCiBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbjsKIAogLyoKKyAqIE1hcmsgYXBwbGllZCB0byBzb2NrZXQgYnVmZmVycy4KKyAqLworZW51bSByeHJwY19za2JfbWFyayB7CisJUlhSUENfU0tCX01BUktfREFUQSwJCS8qIGRhdGEgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX0ZJTkFMX0FDSywJLyogZmluYWwgQUNLIHJlY2VpdmVkIG1lc3NhZ2UgKi8KKwlSWFJQQ19TS0JfTUFSS19CVVNZLAkJLyogc2VydmVyIGJ1c3kgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX1JFTU9URV9BQk9SVCwJLyogcmVtb3RlIGFib3J0IG1lc3NhZ2UgKi8KKwlSWFJQQ19TS0JfTUFSS19MT0NBTF9BQk9SVCwJLyogbG9jYWwgYWJvcnQgbWVzc2FnZSAqLworCVJYUlBDX1NLQl9NQVJLX05FVF9FUlJPUiwJLyogbmV0d29yayBlcnJvciBtZXNzYWdlICovCisJUlhSUENfU0tCX01BUktfTE9DQUxfRVJST1IsCS8qIGxvY2FsIGVycm9yIG1lc3NhZ2UgKi8KKwlSWFJQQ19TS0JfTUFSS19ORVdfQ0FMTCwJLyogbG9jYWwgZXJyb3IgbWVzc2FnZSAqLworfTsKKworLyoKICAqIHNrX3N0YXRlIGZvciBSeFJQQyBzb2NrZXRzCiAgKi8KIGVudW0gewpAQCAtNTIsMTkgKzY0LDQ0IEBACiB9OwogCiAvKgorICogU2VydmljZSBiYWNrbG9nIHByZWFsbG9jYXRpb24uCisgKgorICogVGhpcyBjb250YWlucyBjaXJjdWxhciBidWZmZXJzIG9mIHByZWFsbG9jYXRlZCBwZWVycywgY29ubmVjdGlvbnMgYW5kIGNhbGxzCisgKiBmb3IgaW5jb21pbmcgc2VydmljZSBjYWxscyBhbmQgdGhlaXIgaGVhZCBhbmQgdGFpbCBwb2ludGVycy4gIFRoaXMgYWxsb3dzCisgKiBjYWxscyB0byBiZSBzZXQgdXAgaW4gdGhlIGRhdGFfcmVhZHkgaGFuZGxlciwgdGhlcmVieSBhdm9pZGluZyB0aGUgbmVlZCB0bworICogc2h1ZmZsZSBwYWNrZXRzIGFyb3VuZCBzbyBtdWNoLgorICovCitzdHJ1Y3QgcnhycGNfYmFja2xvZyB7CisJdW5zaWduZWQgc2hvcnQJCXBlZXJfYmFja2xvZ19oZWFkOworCXVuc2lnbmVkIHNob3J0CQlwZWVyX2JhY2tsb2dfdGFpbDsKKwl1bnNpZ25lZCBzaG9ydAkJY29ubl9iYWNrbG9nX2hlYWQ7CisJdW5zaWduZWQgc2hvcnQJCWNvbm5fYmFja2xvZ190YWlsOworCXVuc2lnbmVkIHNob3J0CQljYWxsX2JhY2tsb2dfaGVhZDsKKwl1bnNpZ25lZCBzaG9ydAkJY2FsbF9iYWNrbG9nX3RhaWw7CisjZGVmaW5lIFJYUlBDX0JBQ0tMT0dfTUFYCTMyCisJc3RydWN0IHJ4cnBjX3BlZXIJKnBlZXJfYmFja2xvZ1tSWFJQQ19CQUNLTE9HX01BWF07CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24JKmNvbm5fYmFja2xvZ1tSWFJQQ19CQUNLTE9HX01BWF07CisJc3RydWN0IHJ4cnBjX2NhbGwJKmNhbGxfYmFja2xvZ1tSWFJQQ19CQUNLTE9HX01BWF07Cit9OworCisvKgogICogUnhSUEMgc29ja2V0IGRlZmluaXRpb24KICAqLwogc3RydWN0IHJ4cnBjX3NvY2sgewogCS8qIFdBUk5JTkc6IHNrIGhhcyB0byBiZSB0aGUgZmlyc3QgbWVtYmVyICovCiAJc3RydWN0IHNvY2sJCXNrOwotCXJ4cnBjX2ludGVyY2VwdG9yX3QJaW50ZXJjZXB0b3I7CS8qIGtlcm5lbCBzZXJ2aWNlIFJ4IGludGVyY2VwdG9yIGZ1bmN0aW9uICovCisJcnhycGNfbm90aWZ5X25ld19jYWxsX3QJbm90aWZ5X25ld19jYWxsOyAvKiBGdW5jIHRvIG5vdGlmeSBvZiBuZXcgY2FsbCAqLworCXJ4cnBjX2Rpc2NhcmRfbmV3X2NhbGxfdCBkaXNjYXJkX25ld19jYWxsOyAvKiBGdW5jIHRvIGRpc2NhcmQgYSBuZXcgY2FsbCAqLwogCXN0cnVjdCByeHJwY19sb2NhbAkqbG9jYWw7CQkvKiBsb2NhbCBlbmRwb2ludCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdGVuX2xpbms7CS8qIGxpbmsgaW4gdGhlIGxvY2FsIGVuZHBvaW50J3MgbGlzdGVuIGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXNlY3VyZXE7CS8qIGNhbGxzIGF3YWl0aW5nIGNvbm5lY3Rpb24gc2VjdXJpdHkgY2xlYXJhbmNlICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhY2NlcHRxOwkvKiBjYWxscyBhd2FpdGluZyBhY2NlcHRhbmNlICovCisJc3RydWN0IHJ4cnBjX2JhY2tsb2cJKmJhY2tsb2c7CS8qIFByZWFsbG9jYXRpb24gZm9yIHNlcnZpY2VzICovCisJc3BpbmxvY2tfdAkJaW5jb21pbmdfbG9jazsJLyogSW5jb21pbmcgY2FsbCB2cyBzZXJ2aWNlIHNodXRkb3duIGxvY2sgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXNvY2tfY2FsbHM7CS8qIExpc3Qgb2YgY2FsbHMgb3duZWQgYnkgdGhpcyBzb2NrZXQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXRvX2JlX2FjY2VwdGVkOwkvKiBjYWxscyBhd2FpdGluZyBhY2NlcHRhbmNlICovCisJc3RydWN0IGxpc3RfaGVhZAlyZWN2bXNnX3E7CS8qIENhbGxzIGF3YWl0aW5nIHJlY3Ztc2cncyBhdHRlbnRpb24gICovCisJcndsb2NrX3QJCXJlY3Ztc2dfbG9jazsJLyogTG9jayBmb3IgcmVjdm1zZ19xICovCiAJc3RydWN0IGtleQkJKmtleTsJCS8qIHNlY3VyaXR5IGZvciB0aGlzIHNvY2tldCAqLwogCXN0cnVjdCBrZXkJCSpzZWN1cml0aWVzOwkvKiBsaXN0IG9mIHNlcnZlciBzZWN1cml0eSBkZXNjcmlwdG9ycyAqLwotCXN0cnVjdCByYl9yb290CQljYWxsczsJCS8qIG91dHN0YW5kaW5nIGNhbGxzIG9uIHRoaXMgc29ja2V0ICovCisJc3RydWN0IHJiX3Jvb3QJCWNhbGxzOwkJLyogVXNlciBJRCAtPiBjYWxsIG1hcHBpbmcgKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKICNkZWZpbmUgUlhSUENfU09DS19DT05ORUNURUQJCTAJLyogY29ubmVjdF9zcnggaXMgc2V0ICovCiAJcndsb2NrX3QJCWNhbGxfbG9jazsJLyogbG9jayBmb3IgY2FsbHMgKi8KQEAgLTEwMywxMyArMTQwLDExIEBACiAgKiAtIG1heCA0OCBieXRlcyAoc3RydWN0IHNrX2J1ZmY6OmNiKQogICovCiBzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgewotCXN0cnVjdCByeHJwY19jYWxsCSpjYWxsOwkJLyogY2FsbCB3aXRoIHdoaWNoIGFzc29jaWF0ZWQgKi8KLQl1bnNpZ25lZCBsb25nCQlyZXNlbmRfYXQ7CS8qIHRpbWUgaW4gamlmZmllcyBhdCB3aGljaCB0byByZXNlbmQgKi8KIAl1bmlvbiB7Ci0JCXVuc2lnbmVkIGludAlvZmZzZXQ7CQkvKiBvZmZzZXQgaW50byBidWZmZXIgb2YgbmV4dCByZWFkICovCisJCXU4CQlucl9qdW1ibzsJLyogTnVtYmVyIG9mIGp1bWJvIHN1YnBhY2tldHMgKi8KKwl9OworCXVuaW9uIHsKIAkJaW50CQlyZW1haW47CQkvKiBhbW91bnQgb2Ygc3BhY2UgcmVtYWluaW5nIGZvciBuZXh0IHdyaXRlICovCi0JCXUzMgkJZXJyb3I7CQkvKiBuZXR3b3JrIGVycm9yIGNvZGUgKi8KLQkJYm9vbAkJbmVlZF9yZXNlbmQ7CS8qIFQgaWYgbmVlZHMgcmVzZW5kaW5nICovCiAJfTsKIAogCXN0cnVjdCByeHJwY19ob3N0X2hlYWRlciBoZHI7CQkvKiBSeFJQQyBwYWNrZXQgaGVhZGVyIGZyb20gdGhpcyBwYWNrZXQgKi8KQEAgLTExNywxMyArMTUyLDYgQEAKIAogI2RlZmluZSByeHJwY19za2IoX19za2IpICgoc3RydWN0IHJ4cnBjX3NrYl9wcml2ICopICYoX19za2IpLT5jYikKIAotZW51bSByeHJwY19jb21tYW5kIHsKLQlSWFJQQ19DTURfU0VORF9EQVRBLAkJLyogc2VuZCBkYXRhIG1lc3NhZ2UgKi8KLQlSWFJQQ19DTURfU0VORF9BQk9SVCwJCS8qIHJlcXVlc3QgYWJvcnQgZ2VuZXJhdGlvbiAqLwotCVJYUlBDX0NNRF9BQ0NFUFQsCQkvKiBbc2VydmVyXSBhY2NlcHQgaW5jb21pbmcgY2FsbCAqLwotCVJYUlBDX0NNRF9SRUpFQ1RfQlVTWSwJCS8qIFtzZXJ2ZXJdIHJlamVjdCBhIGNhbGwgYXMgYnVzeSAqLwotfTsKLQogLyoKICAqIFJ4UlBDIHNlY3VyaXR5IG1vZHVsZSBpbnRlcmZhY2UKICAqLwpAQCAtMTUwLDcgKzE3OCwxMiBAQAogCQkJICAgICB2b2lkICopOwogCiAJLyogdmVyaWZ5IHRoZSBzZWN1cml0eSBvbiBhIHJlY2VpdmVkIHBhY2tldCAqLwotCWludCAoKnZlcmlmeV9wYWNrZXQpKHN0cnVjdCByeHJwY19jYWxsICosIHN0cnVjdCBza19idWZmICosIHUzMiAqKTsKKwlpbnQgKCp2ZXJpZnlfcGFja2V0KShzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLAorCQkJICAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCwgcnhycGNfc2VxX3QsIHUxNik7CisKKwkvKiBMb2NhdGUgdGhlIGRhdGEgaW4gYSByZWNlaXZlZCBwYWNrZXQgdGhhdCBoYXMgYmVlbiB2ZXJpZmllZC4gKi8KKwl2b2lkICgqbG9jYXRlX2RhdGEpKHN0cnVjdCByeHJwY19jYWxsICosIHN0cnVjdCBza19idWZmICosCisJCQkgICAgdW5zaWduZWQgaW50ICosIHVuc2lnbmVkIGludCAqKTsKIAogCS8qIGlzc3VlIGEgY2hhbGxlbmdlICovCiAJaW50ICgqaXNzdWVfY2hhbGxlbmdlKShzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKTsKQEAgLTE4MCw5ICsyMTMsOCBAQAogCXN0cnVjdCBsaXN0X2hlYWQJbGluazsKIAlzdHJ1Y3Qgc29ja2V0CQkqc29ja2V0OwkvKiBteSBVRFAgc29ja2V0ICovCiAJc3RydWN0IHdvcmtfc3RydWN0CXByb2Nlc3NvcjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXNlcnZpY2VzOwkvKiBzZXJ2aWNlcyBsaXN0ZW5pbmcgb24gdGhpcyBlbmRwb2ludCAqLworCXN0cnVjdCByeHJwY19zb2NrIF9fcmN1CSpzZXJ2aWNlOwkvKiBTZXJ2aWNlKHMpIGxpc3RlbmluZyBvbiB0aGlzIGVuZHBvaW50ICovCiAJc3RydWN0IHJ3X3NlbWFwaG9yZQlkZWZyYWdfc2VtOwkvKiBjb250cm9sIHJlLWVuYWJsZW1lbnQgb2YgSVAgREYgYml0ICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZAlhY2NlcHRfcXVldWU7CS8qIGluY29taW5nIGNhbGxzIGF3YWl0aW5nIGFjY2VwdGFuY2UgKi8KIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCXJlamVjdF9xdWV1ZTsJLyogcGFja2V0cyBhd2FpdGluZyByZWplY3Rpb24gKi8KIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCWV2ZW50X3F1ZXVlOwkvKiBlbmRwb2ludCBldmVudCBwYWNrZXRzIGF3YWl0aW5nIHByb2Nlc3NpbmcgKi8KIAlzdHJ1Y3QgcmJfcm9vdAkJY2xpZW50X2Nvbm5zOwkvKiBDbGllbnQgY29ubmVjdGlvbnMgYnkgc29ja2V0IHBhcmFtcyAqLwpAQCAtMjIwLDEwICsyNTIsMTIgQEAKIAogCS8qIGNhbGN1bGF0ZWQgUlRUIGNhY2hlICovCiAjZGVmaW5lIFJYUlBDX1JUVF9DQUNIRV9TSVpFIDMyCi0Jc3VzZWNvbmRzX3QJCXJ0dDsJCS8qIGN1cnJlbnQgUlRUIGVzdGltYXRlIChpbiB1UykgKi8KLQl1bnNpZ25lZCBpbnQJCXJ0dF9wb2ludDsJLyogbmV4dCBlbnRyeSBhdCB3aGljaCB0byBpbnNlcnQgKi8KLQl1bnNpZ25lZCBpbnQJCXJ0dF91c2FnZTsJLyogYW1vdW50IG9mIGNhY2hlIGFjdHVhbGx5IHVzZWQgKi8KLQlzdXNlY29uZHNfdAkJcnR0X2NhY2hlW1JYUlBDX1JUVF9DQUNIRV9TSVpFXTsgLyogY2FsY3VsYXRlZCBSVFQgY2FjaGUgKi8KKwlrdGltZV90CQkJcnR0X2xhc3RfcmVxOwkvKiBUaW1lIG9mIGxhc3QgUlRUIHJlcXVlc3QgKi8KKwl1NjQJCQlydHQ7CQkvKiBDdXJyZW50IFJUVCBlc3RpbWF0ZSAoaW4gblMpICovCisJdTY0CQkJcnR0X3N1bTsJLyogU3VtIG9mIGNhY2hlIGNvbnRlbnRzICovCisJdTY0CQkJcnR0X2NhY2hlW1JYUlBDX1JUVF9DQUNIRV9TSVpFXTsgLyogRGV0ZXJtaW5lZCBSVFQgY2FjaGUgKi8KKwl1OAkJCXJ0dF9jdXJzb3I7CS8qIG5leHQgZW50cnkgYXQgd2hpY2ggdG8gaW5zZXJ0ICovCisJdTgJCQlydHRfdXNhZ2U7CS8qIGFtb3VudCBvZiBjYWNoZSBhY3R1YWxseSB1c2VkICovCiB9OwogCiAvKgpAQCAtMjU1LDYgKzI4OSw5IEBACiAJUlhSUENfQ09OTl9IQVNfSURSLAkJLyogSGFzIGEgY2xpZW50IGNvbm4gSUQgYXNzaWduZWQgKi8KIAlSWFJQQ19DT05OX0lOX1NFUlZJQ0VfQ09OTlMsCS8qIENvbm4gaXMgaW4gcGVlci0+c2VydmljZV9jb25ucyAqLwogCVJYUlBDX0NPTk5fSU5fQ0xJRU5UX0NPTk5TLAkvKiBDb25uIGlzIGluIGxvY2FsLT5jbGllbnRfY29ubnMgKi8KKwlSWFJQQ19DT05OX0VYUE9TRUQsCQkvKiBDb25uIGhhcyBleHRyYSByZWYgZm9yIGV4cG9zdXJlICovCisJUlhSUENfQ09OTl9ET05UX1JFVVNFLAkJLyogRG9uJ3QgcmV1c2UgdGhpcyBjb25uZWN0aW9uICovCisJUlhSUENfQ09OTl9DT1VOVEVELAkJLyogQ291bnRlZCBieSByeHJwY19ucl9jbGllbnRfY29ubnMgKi8KIH07CiAKIC8qCkBAIC0yNjUsMTcgKzMwMiwyOSBAQAogfTsKIAogLyoKKyAqIFRoZSBjb25uZWN0aW9uIGNhY2hlIHN0YXRlLgorICovCitlbnVtIHJ4cnBjX2Nvbm5fY2FjaGVfc3RhdGUgeworCVJYUlBDX0NPTk5fQ0xJRU5UX0lOQUNUSVZFLAkvKiBDb25uIGlzIG5vdCB5ZXQgbGlzdGVkICovCisJUlhSUENfQ09OTl9DTElFTlRfV0FJVElORywJLyogQ29ubiBpcyBvbiB3YWl0IGxpc3QsIHdhaXRpbmcgZm9yIGNhcGFjaXR5ICovCisJUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFLAkvKiBDb25uIGlzIG9uIGFjdGl2ZSBsaXN0LCBkb2luZyBjYWxscyAqLworCVJYUlBDX0NPTk5fQ0xJRU5UX0NVTExFRCwJLyogQ29ubiBpcyBjdWxsZWQgYW5kIGRlbGlzdGVkLCBkb2luZyBjYWxscyAqLworCVJYUlBDX0NPTk5fQ0xJRU5UX0lETEUsCQkvKiBDb25uIGlzIG9uIGlkbGUgbGlzdCwgZG9pbmcgbW9zdGx5IG5vdGhpbmcgKi8KKwlSWFJQQ19DT05OX19OUl9DQUNIRV9TVEFURVMKK307CisKKy8qCiAgKiBUaGUgY29ubmVjdGlvbiBwcm90b2NvbCBzdGF0ZS4KICAqLwogZW51bSByeHJwY19jb25uX3Byb3RvX3N0YXRlIHsKIAlSWFJQQ19DT05OX1VOVVNFRCwJCS8qIENvbm5lY3Rpb24gbm90IHlldCBhdHRlbXB0ZWQgKi8KIAlSWFJQQ19DT05OX0NMSUVOVCwJCS8qIENsaWVudCBjb25uZWN0aW9uICovCisJUlhSUENfQ09OTl9TRVJWSUNFX1BSRUFMTE9DLAkvKiBTZXJ2aWNlIGNvbm5lY3Rpb24gcHJlYWxsb2NhdGlvbiAqLwogCVJYUlBDX0NPTk5fU0VSVklDRV9VTlNFQ1VSRUQsCS8qIFNlcnZpY2UgdW5zZWN1cmVkIGNvbm5lY3Rpb24gKi8KIAlSWFJQQ19DT05OX1NFUlZJQ0VfQ0hBTExFTkdJTkcsCS8qIFNlcnZpY2UgY2hhbGxlbmdpbmcgZm9yIHNlY3VyaXR5ICovCiAJUlhSUENfQ09OTl9TRVJWSUNFLAkJLyogU2VydmljZSBzZWN1cmVkIGNvbm5lY3Rpb24gKi8KIAlSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURUQsCS8qIENvbm4gYWJvcnRlZCBieSBwZWVyICovCiAJUlhSUENfQ09OTl9MT0NBTExZX0FCT1JURUQsCS8qIENvbm4gYWJvcnRlZCBsb2NhbGx5ICovCi0JUlhSUENfQ09OTl9ORVRXT1JLX0VSUk9SLAkvKiBDb25uIHRlcm1pbmF0ZWQgYnkgbmV0d29yayBlcnJvciAqLwogCVJYUlBDX0NPTk5fX05SX1NUQVRFUwogfTsKIApAQCAtMjg4LDIzICszMzcsMzMgQEAKIAlzdHJ1Y3QgcnhycGNfY29ubl9wcm90bwlwcm90bzsKIAlzdHJ1Y3QgcnhycGNfY29ubl9wYXJhbWV0ZXJzIHBhcmFtczsKIAotCXNwaW5sb2NrX3QJCWNoYW5uZWxfbG9jazsKKwlhdG9taWNfdAkJdXNhZ2U7CisJc3RydWN0IHJjdV9oZWFkCQlyY3U7CisJc3RydWN0IGxpc3RfaGVhZAljYWNoZV9saW5rOwogCisJc3BpbmxvY2tfdAkJY2hhbm5lbF9sb2NrOworCXVuc2lnbmVkIGNoYXIJCWFjdGl2ZV9jaGFuczsJLyogTWFzayBvZiBhY3RpdmUgY2hhbm5lbHMgKi8KKyNkZWZpbmUgUlhSUENfQUNUSVZFX0NIQU5TX01BU0sJKCgxIDw8IFJYUlBDX01BWENBTExTKSAtIDEpCisJc3RydWN0IGxpc3RfaGVhZAl3YWl0aW5nX2NhbGxzOwkvKiBDYWxscyB3YWl0aW5nIGZvciBjaGFubmVscyAqLwogCXN0cnVjdCByeHJwY19jaGFubmVsIHsKIAkJc3RydWN0IHJ4cnBjX2NhbGwgX19yY3UJKmNhbGw7CQkvKiBBY3RpdmUgY2FsbCAqLwogCQl1MzIJCQljYWxsX2lkOwkvKiBJRCBvZiBjdXJyZW50IGNhbGwgKi8KIAkJdTMyCQkJY2FsbF9jb3VudGVyOwkvKiBDYWxsIElEIGNvdW50ZXIgKi8KIAkJdTMyCQkJbGFzdF9jYWxsOwkvKiBJRCBvZiBsYXN0IGNhbGwgKi8KLQkJdTMyCQkJbGFzdF9yZXN1bHQ7CS8qIFJlc3VsdCBvZiBsYXN0IGNhbGwgKDAvYWJvcnQpICovCisJCXU4CQkJbGFzdF90eXBlOwkvKiBUeXBlIG9mIGxhc3QgcGFja2V0ICovCisJCXUxNgkJCWxhc3Rfc2VydmljZV9pZDsKKwkJdW5pb24geworCQkJdTMyCQlsYXN0X3NlcTsKKwkJCXUzMgkJbGFzdF9hYm9ydDsKKwkJfTsKIAl9IGNoYW5uZWxzW1JYUlBDX01BWENBTExTXTsKLQl3YWl0X3F1ZXVlX2hlYWRfdAljaGFubmVsX3dxOwkvKiBxdWV1ZSB0byB3YWl0IGZvciBjaGFubmVsIHRvIGJlY29tZSBhdmFpbGFibGUgKi8KIAotCXN0cnVjdCByY3VfaGVhZAkJcmN1OwogCXN0cnVjdCB3b3JrX3N0cnVjdAlwcm9jZXNzb3I7CS8qIGNvbm5lY3Rpb24gZXZlbnQgcHJvY2Vzc29yICovCiAJdW5pb24gewogCQlzdHJ1Y3QgcmJfbm9kZQljbGllbnRfbm9kZTsJLyogTm9kZSBpbiBsb2NhbC0+Y2xpZW50X2Nvbm5zICovCiAJCXN0cnVjdCByYl9ub2RlCXNlcnZpY2Vfbm9kZTsJLyogTm9kZSBpbiBwZWVyLT5zZXJ2aWNlX2Nvbm5zICovCiAJfTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXByb2NfbGluazsJLyogbGluayBpbiBwcm9jZnMgbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIGxpbmsgaW4gbWFzdGVyIGNvbm5lY3Rpb24gbGlzdCAqLwogCXN0cnVjdCBza19idWZmX2hlYWQJcnhfcXVldWU7CS8qIHJlY2VpdmVkIGNvbm4tbGV2ZWwgcGFja2V0cyAqLwogCWNvbnN0IHN0cnVjdCByeHJwY19zZWN1cml0eSAqc2VjdXJpdHk7CS8qIGFwcGxpZWQgc2VjdXJpdHkgbW9kdWxlICovCkBAIC0zMTMsMjEgKzM3MiwxOCBAQAogCXN0cnVjdCByeHJwY19jcnlwdAljc3VtX2l2OwkvKiBwYWNrZXQgY2hlY2tzdW0gYmFzZSAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCXVuc2lnbmVkIGxvbmcJCWV2ZW50czsKLQl1bnNpZ25lZCBsb25nCQlwdXRfdGltZTsJLyogVGltZSBhdCB3aGljaCBsYXN0IHB1dCAqLworCXVuc2lnbmVkIGxvbmcJCWlkbGVfdGltZXN0YW1wOwkvKiBUaW1lIGF0IHdoaWNoIGxhc3QgYmVjYW1lIGlkbGUgKi8KIAlzcGlubG9ja190CQlzdGF0ZV9sb2NrOwkvKiBzdGF0ZS1jaGFuZ2UgbG9jayAqLwotCWF0b21pY190CQl1c2FnZTsKLQllbnVtIHJ4cnBjX2Nvbm5fcHJvdG9fc3RhdGUgc3RhdGUgOiA4OwkvKiBjdXJyZW50IHN0YXRlIG9mIGNvbm5lY3Rpb24gKi8KKwllbnVtIHJ4cnBjX2Nvbm5fY2FjaGVfc3RhdGUgY2FjaGVfc3RhdGU7CisJZW51bSByeHJwY19jb25uX3Byb3RvX3N0YXRlIHN0YXRlOwkvKiBjdXJyZW50IHN0YXRlIG9mIGNvbm5lY3Rpb24gKi8KIAl1MzIJCQlsb2NhbF9hYm9ydDsJLyogbG9jYWwgYWJvcnQgY29kZSAqLwogCXUzMgkJCXJlbW90ZV9hYm9ydDsJLyogcmVtb3RlIGFib3J0IGNvZGUgKi8KLQlpbnQJCQllcnJvcjsJCS8qIGxvY2FsIGVycm9yIGluY3VycmVkICovCiAJaW50CQkJZGVidWdfaWQ7CS8qIGRlYnVnIElEIGZvciBwcmludGtzICovCiAJYXRvbWljX3QJCXNlcmlhbDsJCS8qIHBhY2tldCBzZXJpYWwgbnVtYmVyIGNvdW50ZXIgKi8KLQlhdG9taWNfdAkJaGlfc2VyaWFsOwkvKiBoaWdoZXN0IHNlcmlhbCBudW1iZXIgcmVjZWl2ZWQgKi8KLQlhdG9taWNfdAkJYXZhaWxfY2hhbnM7CS8qIG51bWJlciBvZiBjaGFubmVscyBhdmFpbGFibGUgKi8KLQl1OAkJCXNpemVfYWxpZ247CS8qIGRhdGEgc2l6ZSBhbGlnbm1lbnQgKGZvciBzZWN1cml0eSkgKi8KLQl1OAkJCWhlYWRlcl9zaXplOwkvKiByeHJwYyArIHNlY3VyaXR5IGhlYWRlciBzaXplICovCi0JdTgJCQlzZWN1cml0eV9zaXplOwkvKiBzZWN1cml0eSBoZWFkZXIgc2l6ZSAqLworCXVuc2lnbmVkIGludAkJaGlfc2VyaWFsOwkvKiBoaWdoZXN0IHNlcmlhbCBudW1iZXIgcmVjZWl2ZWQgKi8KIAl1MzIJCQlzZWN1cml0eV9ub25jZTsJLyogcmVzcG9uc2UgcmUtdXNlIHByZXZlbnRlciAqLworCXU4CQkJc2l6ZV9hbGlnbjsJLyogZGF0YSBzaXplIGFsaWdubWVudCAoZm9yIHNlY3VyaXR5KSAqLworCXU4CQkJc2VjdXJpdHlfc2l6ZTsJLyogc2VjdXJpdHkgaGVhZGVyIHNpemUgKi8KIAl1OAkJCXNlY3VyaXR5X2l4OwkvKiBzZWN1cml0eSB0eXBlICovCiAJdTgJCQlvdXRfY2xpZW50ZmxhZzsJLyogUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCBpZiB3ZSBhcmUgY2xpZW50ICovCiB9OwpAQCAtMzM3LDM3ICszOTMsMjMgQEAKICAqLwogZW51bSByeHJwY19jYWxsX2ZsYWcgewogCVJYUlBDX0NBTExfUkVMRUFTRUQsCQkvKiBjYWxsIGhhcyBiZWVuIHJlbGVhc2VkIC0gbm8gbW9yZSBtZXNzYWdlIHRvIHVzZXJzcGFjZSAqLwotCVJYUlBDX0NBTExfVEVSTUlOQUxfTVNHLAkvKiBjYWxsIGhhcyBnaXZlbiB0aGUgc29ja2V0IGl0cyBmaW5hbCBtZXNzYWdlICovCi0JUlhSUENfQ0FMTF9SQ1ZEX0xBU1QsCQkvKiBhbGwgcGFja2V0cyByZWNlaXZlZCAqLwotCVJYUlBDX0NBTExfUlVOX1JUSU1FUiwJCS8qIFR4IHJlc2VuZCB0aW1lciBzdGFydGVkICovCi0JUlhSUENfQ0FMTF9UWF9TT0ZUX0FDSywJCS8qIHNlbnQgc29tZSBzb2Z0IEFDS3MgKi8KLQlSWFJQQ19DQUxMX1BST0NfQlVTWSwJCS8qIHRoZSBwcm9jZXNzb3IgaXMgYnVzeSAqLwotCVJYUlBDX0NBTExfSU5JVF9BQ0NFUFQsCQkvKiBhY2NlcHRhbmNlIHdhcyBpbml0aWF0ZWQgKi8KIAlSWFJQQ19DQUxMX0hBU19VU0VSSUQsCQkvKiBoYXMgYSB1c2VyIElEIGF0dGFjaGVkICovCi0JUlhSUENfQ0FMTF9FWFBFQ1RfT09TLAkJLyogZXhwZWN0IG91dCBvZiBzZXF1ZW5jZSBwYWNrZXRzICovCisJUlhSUENfQ0FMTF9JU19TRVJWSUNFLAkJLyogQ2FsbCBpcyBzZXJ2aWNlIGNhbGwgKi8KKwlSWFJQQ19DQUxMX0VYUE9TRUQsCQkvKiBUaGUgY2FsbCB3YXMgZXhwb3NlZCB0byB0aGUgd29ybGQgKi8KKwlSWFJQQ19DQUxMX1JYX0xBU1QsCQkvKiBSZWNlaXZlZCB0aGUgbGFzdCBwYWNrZXQgKGF0IHJ4dHhfdG9wKSAqLworCVJYUlBDX0NBTExfVFhfTEFTVCwJCS8qIExhc3QgcGFja2V0IGluIFR4IGJ1ZmZlciAoYXQgcnh0eF90b3ApICovCisJUlhSUENfQ0FMTF9QSU5HSU5HLAkJLyogUGluZyBpbiBwcm9jZXNzICovCisJUlhSUENfQ0FMTF9SRVRSQU5TX1RJTUVPVVQsCS8qIFJldHJhbnNtaXNzaW9uIGR1ZSB0byB0aW1lb3V0IG9jY3VycmVkICovCiB9OwogCiAvKgogICogRXZlbnRzIHRoYXQgY2FuIGJlIHJhaXNlZCBvbiBhIGNhbGwuCiAgKi8KIGVudW0gcnhycGNfY2FsbF9ldmVudCB7Ci0JUlhSUENfQ0FMTF9FVl9SQ1ZEX0FDS0FMTCwJLyogQUNLQUxMIG9yIHJlcGx5IHJlY2VpdmVkICovCi0JUlhSUENfQ0FMTF9FVl9SQ1ZEX0JVU1ksCS8qIGJ1c3kgcGFja2V0IHJlY2VpdmVkICovCi0JUlhSUENfQ0FMTF9FVl9SQ1ZEX0FCT1JULAkvKiBhYm9ydCBwYWNrZXQgcmVjZWl2ZWQgKi8KLQlSWFJQQ19DQUxMX0VWX1JDVkRfRVJST1IsCS8qIG5ldHdvcmsgZXJyb3IgcmVjZWl2ZWQgKi8KLQlSWFJQQ19DQUxMX0VWX0FDS19GSU5BTCwJLyogbmVlZCB0byBnZW5lcmF0ZSBmaW5hbCBBQ0sgKGFuZCByZWxlYXNlIGNhbGwpICovCiAJUlhSUENfQ0FMTF9FVl9BQ0ssCQkvKiBuZWVkIHRvIGdlbmVyYXRlIEFDSyAqLwotCVJYUlBDX0NBTExfRVZfUkVKRUNUX0JVU1ksCS8qIG5lZWQgdG8gZ2VuZXJhdGUgYnVzeSBtZXNzYWdlICovCiAJUlhSUENfQ0FMTF9FVl9BQk9SVCwJCS8qIG5lZWQgdG8gZ2VuZXJhdGUgYWJvcnQgKi8KLQlSWFJQQ19DQUxMX0VWX0NPTk5fQUJPUlQsCS8qIGxvY2FsIGNvbm5lY3Rpb24gYWJvcnQgZ2VuZXJhdGVkICovCi0JUlhSUENfQ0FMTF9FVl9SRVNFTkRfVElNRVIsCS8qIFR4IHJlc2VuZCB0aW1lciBleHBpcmVkICovCisJUlhSUENfQ0FMTF9FVl9USU1FUiwJCS8qIFRpbWVyIGV4cGlyZWQgKi8KIAlSWFJQQ19DQUxMX0VWX1JFU0VORCwJCS8qIFR4IHJlc2VuZCByZXF1aXJlZCAqLwotCVJYUlBDX0NBTExfRVZfRFJBSU5fUlhfT09TLAkvKiBkcmFpbiB0aGUgUnggb3V0IG9mIHNlcXVlbmNlIHF1ZXVlICovCi0JUlhSUENfQ0FMTF9FVl9MSUZFX1RJTUVSLAkvKiBjYWxsJ3MgbGlmZXRpbWVyIHJhbiBvdXQgKi8KLQlSWFJQQ19DQUxMX0VWX0FDQ0VQVEVELAkJLyogaW5jb21pbmcgY2FsbCBhY2NlcHRlZCBieSB1c2Vyc3BhY2UgYXBwICovCi0JUlhSUENfQ0FMTF9FVl9TRUNVUkVELAkJLyogaW5jb21pbmcgY2FsbCdzIGNvbm5lY3Rpb24gaXMgbm93IHNlY3VyZSAqLwotCVJYUlBDX0NBTExfRVZfUE9TVF9BQ0NFUFQsCS8qIG5lZWQgdG8gcG9zdCBhbiAiYWNjZXB0PyIgbWVzc2FnZSB0byB0aGUgYXBwICovCi0JUlhSUENfQ0FMTF9FVl9SRUxFQVNFLAkJLyogbmVlZCB0byByZWxlYXNlIHRoZSBjYWxsJ3MgcmVzb3VyY2VzICovCiB9OwogCiAvKgpAQCAtMzc5LDIwICs0MjEsMzggQEAKIAlSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1QsCS8qIC0gY2xpZW50IHNlbmRpbmcgcmVxdWVzdCBwaGFzZSAqLwogCVJYUlBDX0NBTExfQ0xJRU5UX0FXQUlUX1JFUExZLAkvKiAtIGNsaWVudCBhd2FpdGluZyByZXBseSAqLwogCVJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFksCS8qIC0gY2xpZW50IHJlY2VpdmluZyByZXBseSBwaGFzZSAqLwotCVJYUlBDX0NBTExfQ0xJRU5UX0ZJTkFMX0FDSywJLyogLSBjbGllbnQgc2VuZGluZyBmaW5hbCBBQ0sgcGhhc2UgKi8KKwlSWFJQQ19DQUxMX1NFUlZFUl9QUkVBTExPQywJLyogLSBzZXJ2aWNlIHByZWFsbG9jYXRpb24gKi8KIAlSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklORywJLyogLSBzZXJ2ZXIgc2VjdXJpbmcgcmVxdWVzdCBjb25uZWN0aW9uICovCiAJUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HLAkvKiAtIHNlcnZlciBhY2NlcHRpbmcgcmVxdWVzdCAqLwogCVJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVCwJLyogLSBzZXJ2ZXIgcmVjZWl2aW5nIHJlcXVlc3QgKi8KIAlSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVCwJLyogLSBzZXJ2ZXIgcGVuZGluZyBBQ0sgb2YgcmVxdWVzdCAqLwogCVJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFksCS8qIC0gc2VydmVyIHNlbmRpbmcgcmVwbHkgKi8KIAlSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0ssCS8qIC0gc2VydmVyIGF3YWl0aW5nIGZpbmFsIEFDSyAqLwotCVJYUlBDX0NBTExfQ09NUExFVEUsCQkvKiAtIGNhbGwgY29tcGxldGVkICovCi0JUlhSUENfQ0FMTF9TRVJWRVJfQlVTWSwJCS8qIC0gY2FsbCByZWplY3RlZCBieSBidXN5IHNlcnZlciAqLworCVJYUlBDX0NBTExfQ09NUExFVEUsCQkvKiAtIGNhbGwgY29tcGxldGUgKi8KKwlOUl9fUlhSUENfQ0FMTF9TVEFURVMKK307CisKKy8qCisgKiBDYWxsIGNvbXBsZXRpb24gY29uZGl0aW9uIChzdGF0ZSA9PSBSWFJQQ19DQUxMX0NPTVBMRVRFKS4KKyAqLworZW51bSByeHJwY19jYWxsX2NvbXBsZXRpb24geworCVJYUlBDX0NBTExfU1VDQ0VFREVELAkJLyogLSBOb3JtYWwgdGVybWluYXRpb24gKi8KIAlSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQsCS8qIC0gY2FsbCBhYm9ydGVkIGJ5IHBlZXIgKi8KIAlSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRCwJLyogLSBjYWxsIGFib3J0ZWQgbG9jYWxseSBvbiBlcnJvciBvciBjbG9zZSAqLworCVJYUlBDX0NBTExfTE9DQUxfRVJST1IsCQkvKiAtIGNhbGwgZmFpbGVkIGR1ZSB0byBsb2NhbCBlcnJvciAqLwogCVJYUlBDX0NBTExfTkVUV09SS19FUlJPUiwJLyogLSBjYWxsIHRlcm1pbmF0ZWQgYnkgbmV0d29yayBlcnJvciAqLwotCVJYUlBDX0NBTExfREVBRCwJCS8qIC0gY2FsbCBpcyBkZWFkICovCi0JTlJfX1JYUlBDX0NBTExfU1RBVEVTCisJTlJfX1JYUlBDX0NBTExfQ09NUExFVElPTlMKK307CisKKy8qCisgKiBDYWxsIFR4IGNvbmdlc3Rpb24gbWFuYWdlbWVudCBtb2Rlcy4KKyAqLworZW51bSByeHJwY19jb25nZXN0X21vZGUgeworCVJYUlBDX0NBTExfU0xPV19TVEFSVCwKKwlSWFJQQ19DQUxMX0NPTkdFU1RfQVZPSURBTkNFLAorCVJYUlBDX0NBTExfUEFDS0VUX0xPU1MsCisJUlhSUENfQ0FMTF9GQVNUX1JFVFJBTlNNSVQsCisJTlJfX1JYUlBDX0NPTkdFU1RfTU9ERVMKIH07CiAKIC8qCkBAIC00MDIsOTIgKzQ2MiwzMjkgQEAKIHN0cnVjdCByeHJwY19jYWxsIHsKIAlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKIAlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbgkqY29ubjsJCS8qIGNvbm5lY3Rpb24gY2FycnlpbmcgY2FsbCAqLwotCXN0cnVjdCByeHJwY19zb2NrCSpzb2NrZXQ7CS8qIHNvY2tldCByZXNwb25zaWJsZSAqLwotCXN0cnVjdCB0aW1lcl9saXN0CWxpZmV0aW1lcjsJLyogbGlmZXRpbWUgcmVtYWluaW5nIG9uIGNhbGwgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdAlkZWFkc3BhbjsJLyogcmVhcCB0aW1lciBmb3IgcmUtQUNLJ2luZywgZXRjICAqLwotCXN0cnVjdCB0aW1lcl9saXN0CWFja190aW1lcjsJLyogQUNLIGdlbmVyYXRpb24gdGltZXIgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdAlyZXNlbmRfdGltZXI7CS8qIFR4IHJlc2VuZCB0aW1lciAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdAlkZXN0cm95ZXI7CS8qIGNhbGwgZGVzdHJveWVyICovCi0Jc3RydWN0IHdvcmtfc3RydWN0CXByb2Nlc3NvcjsJLyogcGFja2V0IHByb2Nlc3NvciBhbmQgQUNLIGdlbmVyYXRvciAqLworCXN0cnVjdCByeHJwY19wZWVyCSpwZWVyOwkJLyogUGVlciByZWNvcmQgZm9yIHJlbW90ZSBhZGRyZXNzICovCisJc3RydWN0IHJ4cnBjX3NvY2sgX19yY3UJKnNvY2tldDsJLyogc29ja2V0IHJlc3BvbnNpYmxlICovCisJa3RpbWVfdAkJCWFja19hdDsJCS8qIFdoZW4gZGVmZXJyZWQgQUNLIG5lZWRzIHRvIGhhcHBlbiAqLworCWt0aW1lX3QJCQlyZXNlbmRfYXQ7CS8qIFdoZW4gbmV4dCByZXNlbmQgbmVlZHMgdG8gaGFwcGVuICovCisJa3RpbWVfdAkJCWV4cGlyZV9hdDsJLyogV2hlbiB0aGUgY2FsbCB0aW1lcyBvdXQgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsJCS8qIENvbWJpbmVkIGV2ZW50IHRpbWVyICovCisJc3RydWN0IHdvcmtfc3RydWN0CXByb2Nlc3NvcjsJLyogRXZlbnQgcHJvY2Vzc29yICovCisJcnhycGNfbm90aWZ5X3J4X3QJbm90aWZ5X3J4OwkvKiBrZXJuZWwgc2VydmljZSBSeCBub3RpZmljYXRpb24gZnVuY3Rpb24gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIG1hc3RlciBjYWxsIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWNoYW5fd2FpdF9saW5rOwkvKiBMaW5rIGluIGNvbm4tPndhaXRpbmdfY2FsbHMgKi8KIAlzdHJ1Y3QgaGxpc3Rfbm9kZQllcnJvcl9saW5rOwkvKiBsaW5rIGluIGVycm9yIGRpc3RyaWJ1dGlvbiBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZAlhY2NlcHRfbGluazsJLyogY2FsbHMgYXdhaXRpbmcgYWNjZXB0YW5jZSAqLwotCXN0cnVjdCByYl9ub2RlCQlzb2NrX25vZGU7CS8qIG5vZGUgaW4gc29ja2V0IGNhbGwgdHJlZSAqLwotCXN0cnVjdCBza19idWZmX2hlYWQJcnhfcXVldWU7CS8qIHJlY2VpdmVkIHBhY2tldHMgKi8KLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCXJ4X29vc19xdWV1ZTsJLyogcGFja2V0cyByZWNlaXZlZCBvdXQgb2Ygc2VxdWVuY2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWFjY2VwdF9saW5rOwkvKiBMaW5rIGluIHJ4LT5hY2NlcHRxICovCisJc3RydWN0IGxpc3RfaGVhZAlyZWN2bXNnX2xpbms7CS8qIExpbmsgaW4gcngtPnJlY3Ztc2dfcSAqLworCXN0cnVjdCBsaXN0X2hlYWQJc29ja19saW5rOwkvKiBMaW5rIGluIHJ4LT5zb2NrX2NhbGxzICovCisJc3RydWN0IHJiX25vZGUJCXNvY2tfbm9kZTsJLyogTm9kZSBpbiByeC0+Y2FsbHMgKi8KIAlzdHJ1Y3Qgc2tfYnVmZgkJKnR4X3BlbmRpbmc7CS8qIFR4IHNvY2tldCBidWZmZXIgYmVpbmcgZmlsbGVkICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QJdHhfd2FpdHE7CS8qIHdhaXQgZm9yIFR4IHdpbmRvdyBzcGFjZSB0byBiZWNvbWUgYXZhaWxhYmxlICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdHE7CQkvKiBXYWl0IHF1ZXVlIGZvciBjaGFubmVsIG9yIFR4ICovCiAJX19iZTMyCQkJY3J5cHRvX2J1ZlsyXTsJLyogVGVtcG9yYXJ5IHBhY2tldCBjcnlwdG8gYnVmZmVyICovCiAJdW5zaWduZWQgbG9uZwkJdXNlcl9jYWxsX0lEOwkvKiB1c2VyLWRlZmluZWQgY2FsbCBJRCAqLwotCXVuc2lnbmVkIGxvbmcJCWNyZWF0aW9uX2ppZjsJLyogdGltZSBvZiBjYWxsIGNyZWF0aW9uICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJdW5zaWduZWQgbG9uZwkJZXZlbnRzOwogCXNwaW5sb2NrX3QJCWxvY2s7CiAJcndsb2NrX3QJCXN0YXRlX2xvY2s7CS8qIGxvY2sgZm9yIHN0YXRlIHRyYW5zaXRpb24gKi8KLQlhdG9taWNfdAkJdXNhZ2U7Ci0JYXRvbWljX3QJCXNrYl9jb3VudDsJLyogT3V0c3RhbmRpbmcgcGFja2V0cyBvbiB0aGlzIGNhbGwgKi8KLQlhdG9taWNfdAkJc2VxdWVuY2U7CS8qIFR4IGRhdGEgcGFja2V0IHNlcXVlbmNlIGNvdW50ZXIgKi8KLQl1MzIJCQlsb2NhbF9hYm9ydDsJLyogbG9jYWwgYWJvcnQgY29kZSAqLwotCXUzMgkJCXJlbW90ZV9hYm9ydDsJLyogcmVtb3RlIGFib3J0IGNvZGUgKi8KLQlpbnQJCQllcnJvcl9yZXBvcnQ7CS8qIE5ldHdvcmsgZXJyb3IgKElDTVAvbG9jYWwgdHJhbnNwb3J0KSAqLworCXUzMgkJCWFib3J0X2NvZGU7CS8qIExvY2FsL3JlbW90ZSBhYm9ydCBjb2RlICovCiAJaW50CQkJZXJyb3I7CQkvKiBMb2NhbCBlcnJvciBpbmN1cnJlZCAqLwotCWVudW0gcnhycGNfY2FsbF9zdGF0ZQlzdGF0ZSA6IDg7CS8qIGN1cnJlbnQgc3RhdGUgb2YgY2FsbCAqLwotCWludAkJCWRlYnVnX2lkOwkvKiBkZWJ1ZyBJRCBmb3IgcHJpbnRrcyAqLwotCXU4CQkJY2hhbm5lbDsJLyogY29ubmVjdGlvbiBjaGFubmVsIG9jY3VwaWVkIGJ5IHRoaXMgY2FsbCAqLwotCi0JLyogdHJhbnNtaXNzaW9uLXBoYXNlIEFDSyBtYW5hZ2VtZW50ICovCi0JdTgJCQlhY2tzX2hlYWQ7CS8qIG9mZnNldCBpbnRvIHdpbmRvdyBvZiBmaXJzdCBlbnRyeSAqLwotCXU4CQkJYWNrc190YWlsOwkvKiBvZmZzZXQgaW50byB3aW5kb3cgb2YgbGFzdCBlbnRyeSAqLwotCXU4CQkJYWNrc193aW5zejsJLyogc2l6ZSBvZiB1bi1BQ0snZCB3aW5kb3cgKi8KLQl1OAkJCWFja3NfdW5hY2tlZDsJLyogbG93ZXN0IHVuYWNrZWQgcGFja2V0IGluIGxhc3QgQUNLIHJlY2VpdmVkICovCi0JaW50CQkJYWNrc19sYXRlc3Q7CS8qIHNlcmlhbCBudW1iZXIgb2YgbGF0ZXN0IEFDSyByZWNlaXZlZCAqLwotCXJ4cnBjX3NlcV90CQlhY2tzX2hhcmQ7CS8qIGhpZ2hlc3QgZGVmaW5pdGl2ZWx5IEFDSydkIG1zZyBzZXEgKi8KLQl1bnNpZ25lZCBsb25nCQkqYWNrc193aW5kb3c7CS8qIHNlbnQgcGFja2V0IHdpbmRvdwotCQkJCQkJICogLSBlbGVtZW50cyBhcmUgcG9pbnRlcnMgd2l0aCBMU0Igc2V0IGlmIEFDSydkCi0JCQkJCQkgKi8KLQotCS8qIHJlY2VpdmUtcGhhc2UgQUNLIG1hbmFnZW1lbnQgKi8KLQlyeHJwY19zZXFfdAkJcnhfZGF0YV9leHBlY3Q7CS8qIG5leHQgZGF0YSBzZXEgSUQgZXhwZWN0ZWQgdG8gYmUgcmVjZWl2ZWQgKi8KLQlyeHJwY19zZXFfdAkJcnhfZGF0YV9wb3N0OwkvKiBuZXh0IGRhdGEgc2VxIElEIGV4cGVjdGVkIHRvIGJlIHBvc3RlZCAqLwotCXJ4cnBjX3NlcV90CQlyeF9kYXRhX3JlY3Y7CS8qIGxhc3QgZGF0YSBzZXEgSUQgZW5jb3VudGVyZWQgYnkgcmVjdm1zZyAqLwotCXJ4cnBjX3NlcV90CQlyeF9kYXRhX2VhdGVuOwkvKiBsYXN0IGRhdGEgc2VxIElEIGNvbnN1bWVkIGJ5IHJlY3Ztc2cgKi8KLQlyeHJwY19zZXFfdAkJcnhfZmlyc3Rfb29zOwkvKiBmaXJzdCBwYWNrZXQgaW4gcnhfb29zX3F1ZXVlIChvciAwKSAqLwotCXJ4cnBjX3NlcV90CQlhY2tyX3dpbl90b3A7CS8qIHRvcCBvZiBBQ0sgd2luZG93IChyeF9kYXRhX2VhdGVuIGlzIGJvdHRvbSkgKi8KLQlyeHJwY19zZXFfdAkJYWNrcl9wcmV2X3NlcTsJLyogcHJldmlvdXMgc2VxdWVuY2UgbnVtYmVyIHJlY2VpdmVkICovCi0JdTgJCQlhY2tyX3JlYXNvbjsJLyogcmVhc29uIHRvIEFDSyAqLwotCXJ4cnBjX3NlcmlhbF90CQlhY2tyX3NlcmlhbDsJLyogc2VyaWFsIG9mIHBhY2tldCBiZWluZyBBQ0snZCAqLwotCWF0b21pY190CQlhY2tyX25vdF9pZGxlOwkvKiBudW1iZXIgb2YgcGFja2V0cyBpbiBSeCBxdWV1ZSAqLwotCi0JLyogcmVjZWl2ZWQgcGFja2V0IHJlY29yZHMsIDEgYml0IHBlciByZWNvcmQgKi8KLSNkZWZpbmUgUlhSUENfQUNLUl9XSU5ET1dfQVNaIERJVl9ST1VORF9VUChSWFJQQ19NQVhBQ0tTLCBCSVRTX1BFUl9MT05HKQotCXVuc2lnbmVkIGxvbmcJCWFja3Jfd2luZG93W1JYUlBDX0FDS1JfV0lORE9XX0FTWiArIDFdOwotCi0JdTgJCQlpbl9jbGllbnRmbGFnOwkvKiBDb3B5IG9mIGNvbm4tPmluX2NsaWVudGZsYWcgKi8KLQlzdHJ1Y3QgcnhycGNfbG9jYWwJKmxvY2FsOwkJLyogTG9jYWwgZW5kcG9pbnQuICovCisJZW51bSByeHJwY19jYWxsX3N0YXRlCXN0YXRlOwkJLyogY3VycmVudCBzdGF0ZSBvZiBjYWxsICovCisJZW51bSByeHJwY19jYWxsX2NvbXBsZXRpb24gY29tcGxldGlvbjsJLyogQ2FsbCBjb21wbGV0aW9uIGNvbmRpdGlvbiAqLworCWF0b21pY190CQl1c2FnZTsKKwl1MTYJCQlzZXJ2aWNlX2lkOwkvKiBzZXJ2aWNlIElEICovCisJdTgJCQlzZWN1cml0eV9peDsJLyogU2VjdXJpdHkgdHlwZSAqLwogCXUzMgkJCWNhbGxfaWQ7CS8qIGNhbGwgSUQgb24gY29ubmVjdGlvbiAgKi8KIAl1MzIJCQljaWQ7CQkvKiBjb25uZWN0aW9uIElEIHBsdXMgY2hhbm5lbCBpbmRleCAqLwotCXUzMgkJCWVwb2NoOwkJLyogZXBvY2ggb2YgdGhpcyBjb25uZWN0aW9uICovCi0JdTE2CQkJc2VydmljZV9pZDsJLyogc2VydmljZSBJRCAqLworCWludAkJCWRlYnVnX2lkOwkvKiBkZWJ1ZyBJRCBmb3IgcHJpbnRrcyAqLworCXVuc2lnbmVkIHNob3J0CQlyeF9wa3Rfb2Zmc2V0OwkvKiBDdXJyZW50IHJlY3Ztc2cgcGFja2V0IG9mZnNldCAqLworCXVuc2lnbmVkIHNob3J0CQlyeF9wa3RfbGVuOwkvKiBDdXJyZW50IHJlY3Ztc2cgcGFja2V0IGxlbiAqLworCisJLyogUngvVHggY2lyY3VsYXIgYnVmZmVyLCBkZXBlbmRpbmcgb24gcGhhc2UuCisJICoKKwkgKiBJbiB0aGUgUnggcGhhc2UsIHBhY2tldHMgYXJlIGFubm90YXRlZCB3aXRoIDAgb3IgdGhlIG51bWJlciBvZiB0aGUKKwkgKiBzZWdtZW50IG9mIGEganVtYm8gcGFja2V0IGVhY2ggYnVmZmVyIHJlZmVycyB0by4gIFRoZXJlIGNhbiBiZSB1cCB0bworCSAqIDQ3IHNlZ21lbnRzIGluIGEgbWF4aW11bS1zaXplIFVEUCBwYWNrZXQuCisJICoKKwkgKiBJbiB0aGUgVHggcGhhc2UsIHBhY2tldHMgYXJlIGFubm90YXRlZCB3aXRoIHdoaWNoIGJ1ZmZlcnMgaGF2ZSBiZWVuCisJICogYWNrZWQuCisJICovCisjZGVmaW5lIFJYUlBDX1JYVFhfQlVGRl9TSVpFCTY0CisjZGVmaW5lIFJYUlBDX1JYVFhfQlVGRl9NQVNLCShSWFJQQ19SWFRYX0JVRkZfU0laRSAtIDEpCisjZGVmaW5lIFJYUlBDX0lOSVRfUlhfV0lORE9XX1NJWkUgMzIKKwlzdHJ1Y3Qgc2tfYnVmZgkJKipyeHR4X2J1ZmZlcjsKKwl1OAkJCSpyeHR4X2Fubm90YXRpb25zOworI2RlZmluZSBSWFJQQ19UWF9BTk5PX0FDSwkwCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fVU5BQ0sJMQorI2RlZmluZSBSWFJQQ19UWF9BTk5PX05BSwkyCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fUkVUUkFOUwkzCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fTUFTSwkweDAzCisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fTEFTVAkweDA0CisjZGVmaW5lIFJYUlBDX1RYX0FOTk9fUkVTRU5UCTB4MDgKKworI2RlZmluZSBSWFJQQ19SWF9BTk5PX0pVTUJPCTB4M2YJCS8qIEp1bWJvIHN1YnBhY2tldCBudW1iZXIgKyAxIGlmIG5vdCB6ZXJvICovCisjZGVmaW5lIFJYUlBDX1JYX0FOTk9fSkxBU1QJMHg0MAkJLyogU2V0IGlmIGxhc3QgZWxlbWVudCBvZiBhIGp1bWJvIHBhY2tldCAqLworI2RlZmluZSBSWFJQQ19SWF9BTk5PX1ZFUklGSUVECTB4ODAJCS8qIFNldCBpZiB2ZXJpZmllZCBhbmQgZGVjcnlwdGVkICovCisJcnhycGNfc2VxX3QJCXR4X2hhcmRfYWNrOwkvKiBEZWFkIHNsb3QgaW4gYnVmZmVyOyB0aGUgZmlyc3QgdHJhbnNtaXR0ZWQgYnV0CisJCQkJCQkgKiBub3QgaGFyZC1BQ0snZCBwYWNrZXQgZm9sbG93cyB0aGlzLgorCQkJCQkJICovCisJcnhycGNfc2VxX3QJCXR4X3RvcDsJCS8qIEhpZ2hlc3QgVHggc2xvdCBhbGxvY2F0ZWQuICovCisKKwkvKiBUQ1Atc3R5bGUgc2xvdy1zdGFydCBjb25nZXN0aW9uIGNvbnRyb2wgW1JGQzU2ODFdLiAgU2luY2UgdGhlIFNNU1MKKwkgKiBpcyBmaXhlZCwgd2Uga2VlcCB0aGVzZSBudW1iZXJzIGluIHRlcm1zIG9mIHNlZ21lbnRzIChpZS4gREFUQQorCSAqIHBhY2tldHMpIHJhdGhlciB0aGFuIGJ5dGVzLgorCSAqLworI2RlZmluZSBSWFJQQ19UWF9TTVNTCQlSWFJQQ19KVU1CT19EQVRBTEVOCisJdTgJCQljb25nX2N3bmQ7CS8qIENvbmdlc3Rpb24gd2luZG93IHNpemUgKi8KKwl1OAkJCWNvbmdfZXh0cmE7CS8qIEV4dHJhIHRvIHNlbmQgZm9yIGNvbmdlc3Rpb24gbWFuYWdlbWVudCAqLworCXU4CQkJY29uZ19zc3RocmVzaDsJLyogU2xvdy1zdGFydCB0aHJlc2hvbGQgKi8KKwllbnVtIHJ4cnBjX2Nvbmdlc3RfbW9kZQljb25nX21vZGU6ODsJLyogQ29uZ2VzdGlvbiBtYW5hZ2VtZW50IG1vZGUgKi8KKwl1OAkJCWNvbmdfZHVwX2Fja3M7CS8qIENvdW50IG9mIEFDS3Mgc2hvd2luZyBtaXNzaW5nIHBhY2tldHMgKi8KKwl1OAkJCWNvbmdfY3VtdWxfYWNrczsgLyogQ3VtdWxhdGl2ZSBBQ0sgY291bnQgKi8KKwlrdGltZV90CQkJY29uZ190c3RhbXA7CS8qIExhc3QgdGltZSBjd25kIHdhcyBjaGFuZ2VkICovCisKKwlyeHJwY19zZXFfdAkJcnhfaGFyZF9hY2s7CS8qIERlYWQgc2xvdCBpbiBidWZmZXI7IHRoZSBmaXJzdCByZWNlaXZlZCBidXQgbm90CisJCQkJCQkgKiBjb25zdW1lZCBwYWNrZXQgZm9sbG93cyB0aGlzLgorCQkJCQkJICovCisJcnhycGNfc2VxX3QJCXJ4X3RvcDsJCS8qIEhpZ2hlc3QgUnggc2xvdCBhbGxvY2F0ZWQuICovCisJcnhycGNfc2VxX3QJCXJ4X2V4cGVjdF9uZXh0OwkvKiBFeHBlY3RlZCBuZXh0IHBhY2tldCBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1OAkJCXJ4X3dpbnNpemU7CS8qIFNpemUgb2YgUnggd2luZG93ICovCisJdTgJCQl0eF93aW5zaXplOwkvKiBNYXhpbXVtIHNpemUgb2YgVHggd2luZG93ICovCisJYm9vbAkJCXR4X3BoYXNlOwkvKiBUIGlmIHRyYW5zbWlzc2lvbiBwaGFzZSwgRiBpZiByZWNlaXZlIHBoYXNlICovCisJdTgJCQlucl9qdW1ib19iYWQ7CS8qIE51bWJlciBvZiBqdW1ibyBkdXBzL2V4Y2VlZHMtd2luZG93cyAqLworCisJLyogcmVjZWl2ZS1waGFzZSBBQ0sgbWFuYWdlbWVudCAqLworCXU4CQkJYWNrcl9yZWFzb247CS8qIHJlYXNvbiB0byBBQ0sgKi8KKwl1MTYJCQlhY2tyX3NrZXc7CS8qIHNrZXcgb24gcGFja2V0IGJlaW5nIEFDSydkICovCisJcnhycGNfc2VyaWFsX3QJCWFja3Jfc2VyaWFsOwkvKiBzZXJpYWwgb2YgcGFja2V0IGJlaW5nIEFDSydkICovCisJcnhycGNfc2VxX3QJCWFja3JfcHJldl9zZXE7CS8qIHByZXZpb3VzIHNlcXVlbmNlIG51bWJlciByZWNlaXZlZCAqLworCXJ4cnBjX3NlcV90CQlhY2tyX2NvbnN1bWVkOwkvKiBIaWdoZXN0IHBhY2tldCBzaG93biBjb25zdW1lZCAqLworCXJ4cnBjX3NlcV90CQlhY2tyX3NlZW47CS8qIEhpZ2hlc3QgcGFja2V0IHNob3duIHNlZW4gKi8KKwlyeHJwY19zZXJpYWxfdAkJYWNrcl9waW5nOwkvKiBMYXN0IHBpbmcgc2VudCAqLworCWt0aW1lX3QJCQlhY2tyX3BpbmdfdGltZTsJLyogVGltZSBsYXN0IHBpbmcgc2VudCAqLworCisJLyogdHJhbnNtaXNzaW9uLXBoYXNlIEFDSyBtYW5hZ2VtZW50ICovCisJa3RpbWVfdAkJCWFja3NfbGF0ZXN0X3RzOwkvKiBUaW1lc3RhbXAgb2YgbGF0ZXN0IEFDSyByZWNlaXZlZCAqLworCXJ4cnBjX3NlcmlhbF90CQlhY2tzX2xhdGVzdDsJLyogc2VyaWFsIG51bWJlciBvZiBsYXRlc3QgQUNLIHJlY2VpdmVkICovCisJcnhycGNfc2VxX3QJCWFja3NfbG93ZXN0X25hazsgLyogTG93ZXN0IE5BQ0sgaW4gdGhlIGJ1ZmZlciAob3IgPT10eF9oYXJkX2FjaykgKi8KIH07CiAKIC8qCi0gKiBsb2NhbGx5IGFib3J0IGFuIFJ4UlBDIGNhbGwKKyAqIFN1bW1hcnkgb2YgYSBuZXcgQUNLIGFuZCB0aGUgY2hhbmdlcyBpdCBtYWRlIHRvIHRoZSBUeCBidWZmZXIgcGFja2V0IHN0YXRlcy4KICAqLwotc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX2Fib3J0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHUzMiBhYm9ydF9jb2RlKQotewotCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJY2FsbC0+bG9jYWxfYWJvcnQgPSBhYm9ydF9jb2RlOwotCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfTE9DQUxMWV9BQk9SVEVEOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCX0KLQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotfQorc3RydWN0IHJ4cnBjX2Fja19zdW1tYXJ5IHsKKwl1OAkJCWFja19yZWFzb247CisJdTgJCQlucl9hY2tzOwkJLyogTnVtYmVyIG9mIEFDS3MgaW4gcGFja2V0ICovCisJdTgJCQlucl9uYWNrczsJCS8qIE51bWJlciBvZiBOQUNLcyBpbiBwYWNrZXQgKi8KKwl1OAkJCW5yX25ld19hY2tzOwkJLyogTnVtYmVyIG9mIG5ldyBBQ0tzIGluIHBhY2tldCAqLworCXU4CQkJbnJfbmV3X25hY2tzOwkJLyogTnVtYmVyIG9mIG5ldyBOQUNLcyBpbiBwYWNrZXQgKi8KKwl1OAkJCW5yX3JvdF9uZXdfYWNrczsJLyogTnVtYmVyIG9mIHJvdGF0ZWQgbmV3IEFDS3MgKi8KKwlib29sCQkJbmV3X2xvd19uYWNrOwkJLyogVCBpZiBuZXcgbG93IE5BQ0sgZm91bmQgKi8KKwlib29sCQkJcmV0cmFuc190aW1lbzsJCS8qIFQgaWYgcmVUeCBkdWUgdG8gdGltZW91dCBoYXBwZW5lZCAqLworCXU4CQkJZmxpZ2h0X3NpemU7CQkvKiBOdW1iZXIgb2YgdW5yZWNlaXZlZCB0cmFuc21pc3Npb25zICovCisJLyogUGxhY2UgdG8gc3Rhc2ggdmFsdWVzIGZvciB0cmFjaW5nICovCisJZW51bSByeHJwY19jb25nZXN0X21vZGUJbW9kZTo4OworCXU4CQkJY3duZDsKKwl1OAkJCXNzdGhyZXNoOworCXU4CQkJZHVwX2Fja3M7CisJdTgJCQljdW11bGF0aXZlX2Fja3M7Cit9OworCitlbnVtIHJ4cnBjX3NrYl90cmFjZSB7CisJcnhycGNfc2tiX3J4X2NsZWFuZWQsCisJcnhycGNfc2tiX3J4X2ZyZWVkLAorCXJ4cnBjX3NrYl9yeF9nb3QsCisJcnhycGNfc2tiX3J4X2xvc3QsCisJcnhycGNfc2tiX3J4X3JlY2VpdmVkLAorCXJ4cnBjX3NrYl9yeF9yb3RhdGVkLAorCXJ4cnBjX3NrYl9yeF9wdXJnZWQsCisJcnhycGNfc2tiX3J4X3NlZW4sCisJcnhycGNfc2tiX3R4X2NsZWFuZWQsCisJcnhycGNfc2tiX3R4X2ZyZWVkLAorCXJ4cnBjX3NrYl90eF9nb3QsCisJcnhycGNfc2tiX3R4X25ldywKKwlyeHJwY19za2JfdHhfcm90YXRlZCwKKwlyeHJwY19za2JfdHhfc2VlbiwKKwlyeHJwY19za2JfX25yX3RyYWNlCit9OworCitleHRlcm4gY29uc3QgY2hhciByeHJwY19za2JfdHJhY2VzW3J4cnBjX3NrYl9fbnJfdHJhY2VdWzddOworCitlbnVtIHJ4cnBjX2Nvbm5fdHJhY2UgeworCXJ4cnBjX2Nvbm5fbmV3X2NsaWVudCwKKwlyeHJwY19jb25uX25ld19zZXJ2aWNlLAorCXJ4cnBjX2Nvbm5fcXVldWVkLAorCXJ4cnBjX2Nvbm5fc2VlbiwKKwlyeHJwY19jb25uX2dvdCwKKwlyeHJwY19jb25uX3B1dF9jbGllbnQsCisJcnhycGNfY29ubl9wdXRfc2VydmljZSwKKwlyeHJwY19jb25uX19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfY29ubl90cmFjZXNbcnhycGNfY29ubl9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX2NsaWVudF90cmFjZSB7CisJcnhycGNfY2xpZW50X2FjdGl2YXRlX2NoYW5zLAorCXJ4cnBjX2NsaWVudF9hbGxvYywKKwlyeHJwY19jbGllbnRfY2hhbl9hY3RpdmF0ZSwKKwlyeHJwY19jbGllbnRfY2hhbl9kaXNjb25uZWN0LAorCXJ4cnBjX2NsaWVudF9jaGFuX3Bhc3MsCisJcnhycGNfY2xpZW50X2NoYW5fdW5zdGFydGVkLAorCXJ4cnBjX2NsaWVudF9jbGVhbnVwLAorCXJ4cnBjX2NsaWVudF9jb3VudCwKKwlyeHJwY19jbGllbnRfZGlzY2FyZCwKKwlyeHJwY19jbGllbnRfZHVwbGljYXRlLAorCXJ4cnBjX2NsaWVudF9leHBvc2VkLAorCXJ4cnBjX2NsaWVudF9yZXBsYWNlLAorCXJ4cnBjX2NsaWVudF90b19hY3RpdmUsCisJcnhycGNfY2xpZW50X3RvX2N1bGxlZCwKKwlyeHJwY19jbGllbnRfdG9faWRsZSwKKwlyeHJwY19jbGllbnRfdG9faW5hY3RpdmUsCisJcnhycGNfY2xpZW50X3RvX3dhaXRpbmcsCisJcnhycGNfY2xpZW50X3VuY291bnQsCisJcnhycGNfY2xpZW50X19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfY2xpZW50X3RyYWNlc1tyeHJwY19jbGllbnRfX25yX3RyYWNlXVs3XTsKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX2Nvbm5fY2FjaGVfc3RhdGVzW1JYUlBDX0NPTk5fX05SX0NBQ0hFX1NUQVRFU11bNV07CisKK2VudW0gcnhycGNfY2FsbF90cmFjZSB7CisJcnhycGNfY2FsbF9uZXdfY2xpZW50LAorCXJ4cnBjX2NhbGxfbmV3X3NlcnZpY2UsCisJcnhycGNfY2FsbF9xdWV1ZWQsCisJcnhycGNfY2FsbF9xdWV1ZWRfcmVmLAorCXJ4cnBjX2NhbGxfc2VlbiwKKwlyeHJwY19jYWxsX2Nvbm5lY3RlZCwKKwlyeHJwY19jYWxsX3JlbGVhc2UsCisJcnhycGNfY2FsbF9nb3QsCisJcnhycGNfY2FsbF9nb3RfdXNlcmlkLAorCXJ4cnBjX2NhbGxfZ290X2tlcm5lbCwKKwlyeHJwY19jYWxsX3B1dCwKKwlyeHJwY19jYWxsX3B1dF91c2VyaWQsCisJcnhycGNfY2FsbF9wdXRfa2VybmVsLAorCXJ4cnBjX2NhbGxfcHV0X25vcXVldWUsCisJcnhycGNfY2FsbF9lcnJvciwKKwlyeHJwY19jYWxsX19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfY2FsbF90cmFjZXNbcnhycGNfY2FsbF9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX3RyYW5zbWl0X3RyYWNlIHsKKwlyeHJwY190cmFuc21pdF93YWl0LAorCXJ4cnBjX3RyYW5zbWl0X3F1ZXVlLAorCXJ4cnBjX3RyYW5zbWl0X3F1ZXVlX2xhc3QsCisJcnhycGNfdHJhbnNtaXRfcm90YXRlLAorCXJ4cnBjX3RyYW5zbWl0X3JvdGF0ZV9sYXN0LAorCXJ4cnBjX3RyYW5zbWl0X2F3YWl0X3JlcGx5LAorCXJ4cnBjX3RyYW5zbWl0X2VuZCwKKwlyeHJwY190cmFuc21pdF9fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3RyYW5zbWl0X3RyYWNlc1tyeHJwY190cmFuc21pdF9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX3JlY2VpdmVfdHJhY2UgeworCXJ4cnBjX3JlY2VpdmVfaW5jb21pbmcsCisJcnhycGNfcmVjZWl2ZV9xdWV1ZSwKKwlyeHJwY19yZWNlaXZlX3F1ZXVlX2xhc3QsCisJcnhycGNfcmVjZWl2ZV9mcm9udCwKKwlyeHJwY19yZWNlaXZlX3JvdGF0ZSwKKwlyeHJwY19yZWNlaXZlX2VuZCwKKwlyeHJwY19yZWNlaXZlX19ucl90cmFjZQorfTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgcnhycGNfcmVjZWl2ZV90cmFjZXNbcnhycGNfcmVjZWl2ZV9fbnJfdHJhY2VdWzRdOworCitlbnVtIHJ4cnBjX3JlY3Ztc2dfdHJhY2UgeworCXJ4cnBjX3JlY3Ztc2dfZW50ZXIsCisJcnhycGNfcmVjdm1zZ193YWl0LAorCXJ4cnBjX3JlY3Ztc2dfZGVxdWV1ZSwKKwlyeHJwY19yZWN2bXNnX2hvbGUsCisJcnhycGNfcmVjdm1zZ19uZXh0LAorCXJ4cnBjX3JlY3Ztc2dfY29udCwKKwlyeHJwY19yZWN2bXNnX2Z1bGwsCisJcnhycGNfcmVjdm1zZ19kYXRhX3JldHVybiwKKwlyeHJwY19yZWN2bXNnX3Rlcm1pbmFsLAorCXJ4cnBjX3JlY3Ztc2dfdG9fYmVfYWNjZXB0ZWQsCisJcnhycGNfcmVjdm1zZ19yZXR1cm4sCisJcnhycGNfcmVjdm1zZ19fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3JlY3Ztc2dfdHJhY2VzW3J4cnBjX3JlY3Ztc2dfX25yX3RyYWNlXVs1XTsKKworZW51bSByeHJwY19ydHRfdHhfdHJhY2UgeworCXJ4cnBjX3J0dF90eF9waW5nLAorCXJ4cnBjX3J0dF90eF9kYXRhLAorCXJ4cnBjX3J0dF90eF9fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3J0dF90eF90cmFjZXNbcnhycGNfcnR0X3R4X19ucl90cmFjZV1bNV07CisKK2VudW0gcnhycGNfcnR0X3J4X3RyYWNlIHsKKwlyeHJwY19ydHRfcnhfcGluZ19yZXNwb25zZSwKKwlyeHJwY19ydHRfcnhfcmVxdWVzdGVkX2FjaywKKwlyeHJwY19ydHRfcnhfX25yX3RyYWNlCit9OworCitleHRlcm4gY29uc3QgY2hhciByeHJwY19ydHRfcnhfdHJhY2VzW3J4cnBjX3J0dF9yeF9fbnJfdHJhY2VdWzVdOworCitlbnVtIHJ4cnBjX3RpbWVyX3RyYWNlIHsKKwlyeHJwY190aW1lcl9iZWdpbiwKKwlyeHJwY190aW1lcl9pbml0X2Zvcl9yZXBseSwKKwlyeHJwY190aW1lcl9leHBpcmVkLAorCXJ4cnBjX3RpbWVyX3NldF9mb3JfYWNrLAorCXJ4cnBjX3RpbWVyX3NldF9mb3JfcmVzZW5kLAorCXJ4cnBjX3RpbWVyX3NldF9mb3Jfc2VuZCwKKwlyeHJwY190aW1lcl9fbnJfdHJhY2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3RpbWVyX3RyYWNlc1tyeHJwY190aW1lcl9fbnJfdHJhY2VdWzhdOworCitlbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlIHsKKwlyeHJwY19wcm9wb3NlX2Fja19jbGllbnRfdHhfZW5kLAorCXJ4cnBjX3Byb3Bvc2VfYWNrX2lucHV0X2RhdGEsCisJcnhycGNfcHJvcG9zZV9hY2tfcGluZ19mb3JfbG9zdF9hY2ssCisJcnhycGNfcHJvcG9zZV9hY2tfcGluZ19mb3JfbG9zdF9yZXBseSwKKwlyeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9wYXJhbXMsCisJcnhycGNfcHJvcG9zZV9hY2tfcmVzcG9uZF90b19hY2ssCisJcnhycGNfcHJvcG9zZV9hY2tfcmVzcG9uZF90b19waW5nLAorCXJ4cnBjX3Byb3Bvc2VfYWNrX3JldHJ5X3R4LAorCXJ4cnBjX3Byb3Bvc2VfYWNrX3JvdGF0ZV9yeCwKKwlyeHJwY19wcm9wb3NlX2Fja190ZXJtaW5hbF9hY2ssCisJcnhycGNfcHJvcG9zZV9hY2tfX25yX3RyYWNlCit9OworCitlbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX291dGNvbWUgeworCXJ4cnBjX3Byb3Bvc2VfYWNrX3VzZSwKKwlyeHJwY19wcm9wb3NlX2Fja191cGRhdGUsCisJcnhycGNfcHJvcG9zZV9hY2tfc3Vic3VtZSwKKwlyeHJwY19wcm9wb3NlX2Fja19fbnJfb3V0Y29tZXMKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlc1tyeHJwY19wcm9wb3NlX2Fja19fbnJfdHJhY2VdWzhdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHJ4cnBjX3Byb3Bvc2VfYWNrX291dGNvbWVzW3J4cnBjX3Byb3Bvc2VfYWNrX19ucl9vdXRjb21lc107CisKK2VudW0gcnhycGNfY29uZ2VzdF9jaGFuZ2UgeworCXJ4cnBjX2NvbmdfYmVnaW5fcmV0cmFuc21pc3Npb24sCisJcnhycGNfY29uZ19jbGVhcmVkX25hY2tzLAorCXJ4cnBjX2NvbmdfbmV3X2xvd19uYWNrLAorCXJ4cnBjX2Nvbmdfbm9fY2hhbmdlLAorCXJ4cnBjX2NvbmdfcHJvZ3Jlc3MsCisJcnhycGNfY29uZ19yZXRyYW5zbWl0X2FnYWluLAorCXJ4cnBjX2NvbmdfcnR0X3dpbmRvd19lbmQsCisJcnhycGNfY29uZ19zYXdfbmFjaywKKwlyeHJwY19jb25nZXN0X19ucl9jaGFuZ2UKK307CisKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX2Nvbmdlc3RfbW9kZXNbTlJfX1JYUlBDX0NPTkdFU1RfTU9ERVNdWzEwXTsKK2V4dGVybiBjb25zdCBjaGFyIHJ4cnBjX2Nvbmdlc3RfY2hhbmdlc1tyeHJwY19jb25nZXN0X19ucl9jaGFuZ2VdWzldOworCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfcGt0c1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgY29uc3QgcnhycGNfYWNrX25hbWVzW1JYUlBDX0FDS19fSU5WQUxJRCArIDFdWzRdOworCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3J4cnBjLmg+CiAKIC8qCiAgKiBhZl9yeHJwYy5jCiAgKi8KLWV4dGVybiBhdG9taWNfdCByeHJwY19uX3NrYnM7CitleHRlcm4gYXRvbWljX3QgcnhycGNfbl90eF9za2JzLCByeHJwY19uX3J4X3NrYnM7CiBleHRlcm4gdTMyIHJ4cnBjX2Vwb2NoOwogZXh0ZXJuIGF0b21pY190IHJ4cnBjX2RlYnVnX2lkOwogZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpyeHJwY193b3JrcXVldWU7CkBAIC00OTUsNzAgKzc5MiwxNzggQEAKIC8qCiAgKiBjYWxsX2FjY2VwdC5jCiAgKi8KK2ludCByeHJwY19zZXJ2aWNlX3ByZWFsbG9jKHN0cnVjdCByeHJwY19zb2NrICosIGdmcF90KTsKK3ZvaWQgcnhycGNfZGlzY2FyZF9wcmVhbGxvYyhzdHJ1Y3QgcnhycGNfc29jayAqKTsKK3N0cnVjdCByeHJwY19jYWxsICpyeHJwY19uZXdfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfbG9jYWwgKiwKKwkJCQkJICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKiwKKwkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKik7CiB2b2lkIHJ4cnBjX2FjY2VwdF9pbmNvbWluZ19jYWxscyhzdHJ1Y3QgcnhycGNfbG9jYWwgKik7Ci1zdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWNjZXB0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKiwgdW5zaWduZWQgbG9uZyk7CitzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWNjZXB0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKiwgdW5zaWduZWQgbG9uZywKKwkJCQkgICAgIHJ4cnBjX25vdGlmeV9yeF90KTsKIGludCByeHJwY19yZWplY3RfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqKTsKIAogLyoKICAqIGNhbGxfZXZlbnQuYwogICovCi12b2lkIF9fcnhycGNfcHJvcG9zZV9BQ0soc3RydWN0IHJ4cnBjX2NhbGwgKiwgdTgsIHUzMiwgYm9vbCk7Ci12b2lkIHJ4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICosIHU4LCB1MzIsIGJvb2wpOwordm9pZCByeHJwY19zZXRfdGltZXIoc3RydWN0IHJ4cnBjX2NhbGwgKiwgZW51bSByeHJwY190aW1lcl90cmFjZSwga3RpbWVfdCk7Cit2b2lkIHJ4cnBjX3Byb3Bvc2VfQUNLKHN0cnVjdCByeHJwY19jYWxsICosIHU4LCB1MTYsIHUzMiwgYm9vbCwgYm9vbCwKKwkJICAgICAgIGVudW0gcnhycGNfcHJvcG9zZV9hY2tfdHJhY2UpOwogdm9pZCByeHJwY19wcm9jZXNzX2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICopOwogCiAvKgogICogY2FsbF9vYmplY3QuYwogICovCitleHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfY2FsbF9zdGF0ZXNbXTsKK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCByeHJwY19jYWxsX2NvbXBsZXRpb25zW107CiBleHRlcm4gdW5zaWduZWQgaW50IHJ4cnBjX21heF9jYWxsX2xpZmV0aW1lOwotZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19kZWFkX2NhbGxfZXhwaXJ5OwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpyeHJwY19jYWxsX2phcjsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX2NhbGxzOwogZXh0ZXJuIHJ3bG9ja190IHJ4cnBjX2NhbGxfbG9jazsKIAogc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2ZpbmRfY2FsbF9ieV91c2VyX0lEKHN0cnVjdCByeHJwY19zb2NrICosIHVuc2lnbmVkIGxvbmcpOworc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2FsbG9jX2NhbGwoZ2ZwX3QpOwogc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX25ld19jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAogCQkJCQkgc3RydWN0IHJ4cnBjX2Nvbm5fcGFyYW1ldGVycyAqLAogCQkJCQkgc3RydWN0IHNvY2thZGRyX3J4cnBjICosCiAJCQkJCSB1bnNpZ25lZCBsb25nLCBnZnBfdCk7Ci1zdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLAotCQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLAotCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLXZvaWQgcnhycGNfcmVsZWFzZV9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOwordm9pZCByeHJwY19pbmNvbWluZ19jYWxsKHN0cnVjdCByeHJwY19zb2NrICosIHN0cnVjdCByeHJwY19jYWxsICosCisJCQkgc3RydWN0IHNrX2J1ZmYgKik7Cit2b2lkIHJ4cnBjX3JlbGVhc2VfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKIHZvaWQgcnhycGNfcmVsZWFzZV9jYWxsc19vbl9zb2NrZXQoc3RydWN0IHJ4cnBjX3NvY2sgKik7Ci12b2lkIF9fcnhycGNfcHV0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKik7Citib29sIF9fcnhycGNfcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK2Jvb2wgcnhycGNfcXVldWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK3ZvaWQgcnhycGNfc2VlX2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKik7Cit2b2lkIHJ4cnBjX2dldF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICosIGVudW0gcnhycGNfY2FsbF90cmFjZSk7Cit2b2lkIHJ4cnBjX3B1dF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICosIGVudW0gcnhycGNfY2FsbF90cmFjZSk7Cit2b2lkIHJ4cnBjX2NsZWFudXBfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKIHZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX2NhbGxzKHZvaWQpOwogCitzdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfaXNfc2VydmljZV9jYWxsKGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXJldHVybiB0ZXN0X2JpdChSWFJQQ19DQUxMX0lTX1NFUlZJQ0UsICZjYWxsLT5mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCByeHJwY19pc19jbGllbnRfY2FsbChjb25zdCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlyZXR1cm4gIXJ4cnBjX2lzX3NlcnZpY2VfY2FsbChjYWxsKTsKK30KKworLyoKKyAqIFRyYW5zaXRpb24gYSBjYWxsIHRvIHRoZSBjb21wbGV0ZSBzdGF0ZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIF9fcnhycGNfc2V0X2NhbGxfY29tcGxldGlvbihzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJICAgICAgIGVudW0gcnhycGNfY2FsbF9jb21wbGV0aW9uIGNvbXBsLAorCQkJCQkgICAgICAgdTMyIGFib3J0X2NvZGUsCisJCQkJCSAgICAgICBpbnQgZXJyb3IpCit7CisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQljYWxsLT5hYm9ydF9jb2RlID0gYWJvcnRfY29kZTsKKwkJY2FsbC0+ZXJyb3IgPSBlcnJvcjsKKwkJY2FsbC0+Y29tcGxldGlvbiA9IGNvbXBsLAorCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ09NUExFVEU7CisJCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHJ4cnBjX3NldF9jYWxsX2NvbXBsZXRpb24oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkJCSAgICAgZW51bSByeHJwY19jYWxsX2NvbXBsZXRpb24gY29tcGwsCisJCQkJCSAgICAgdTMyIGFib3J0X2NvZGUsCisJCQkJCSAgICAgaW50IGVycm9yKQoreworCWJvb2wgcmV0OworCisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJcmV0ID0gX19yeHJwY19zZXRfY2FsbF9jb21wbGV0aW9uKGNhbGwsIGNvbXBsLCBhYm9ydF9jb2RlLCBlcnJvcik7CisJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVjb3JkIHRoYXQgYSBjYWxsIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX3J4cnBjX2NhbGxfY29tcGxldGVkKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCXJldHVybiBfX3J4cnBjX3NldF9jYWxsX2NvbXBsZXRpb24oY2FsbCwgUlhSUENfQ0FMTF9TVUNDRUVERUQsIDAsIDApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfY2FsbF9jb21wbGV0ZWQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJYm9vbCByZXQ7CisKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlyZXQgPSBfX3J4cnBjX2NhbGxfY29tcGxldGVkKGNhbGwpOworCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlY29yZCB0aGF0IGEgY2FsbCBpcyBsb2NhbGx5IGFib3J0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBfX3J4cnBjX2Fib3J0X2NhbGwoY29uc3QgY2hhciAqd2h5LCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkgICAgICByeHJwY19zZXFfdCBzZXEsCisJCQkJICAgICAgdTMyIGFib3J0X2NvZGUsIGludCBlcnJvcikKK3sKKwl0cmFjZV9yeHJwY19hYm9ydCh3aHksIGNhbGwtPmNpZCwgY2FsbC0+Y2FsbF9pZCwgc2VxLAorCQkJICBhYm9ydF9jb2RlLCBlcnJvcik7CisJcmV0dXJuIF9fcnhycGNfc2V0X2NhbGxfY29tcGxldGlvbihjYWxsLCBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRCwKKwkJCQkJICAgYWJvcnRfY29kZSwgZXJyb3IpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfYWJvcnRfY2FsbChjb25zdCBjaGFyICp3aHksIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICByeHJwY19zZXFfdCBzZXEsIHUzMiBhYm9ydF9jb2RlLCBpbnQgZXJyb3IpCit7CisJYm9vbCByZXQ7CisKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlyZXQgPSBfX3J4cnBjX2Fib3J0X2NhbGwod2h5LCBjYWxsLCBzZXEsIGFib3J0X2NvZGUsIGVycm9yKTsKKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBjb25uX2NsaWVudC5jCiAgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9uczsKK2V4dGVybiB1bnNpZ25lZCBpbnQgcnhycGNfcmVhcF9jbGllbnRfY29ubmVjdGlvbnM7CitleHRlcm4gdW5zaWduZWQgaW50IHJ4cnBjX2Nvbm5faWRsZV9jbGllbnRfZXhwaXJ5OworZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19jb25uX2lkbGVfY2xpZW50X2Zhc3RfZXhwaXJ5OwogZXh0ZXJuIHN0cnVjdCBpZHIgcnhycGNfY2xpZW50X2Nvbm5faWRzOwogCiB2b2lkIHJ4cnBjX2Rlc3Ryb3lfY2xpZW50X2Nvbm5faWRzKHZvaWQpOwogaW50IHJ4cnBjX2Nvbm5lY3RfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3QgcnhycGNfY29ubl9wYXJhbWV0ZXJzICosCiAJCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKiwgZ2ZwX3QpOwotdm9pZCByeHJwY191bnB1Ymxpc2hfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7Cit2b2lkIHJ4cnBjX2V4cG9zZV9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK3ZvaWQgcnhycGNfZGlzY29ubmVjdF9jbGllbnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKK3ZvaWQgcnhycGNfcHV0X2NsaWVudF9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwordm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfY2xpZW50X2Nvbm5lY3Rpb25zKHZvaWQpOwogCiAvKgogICogY29ubl9ldmVudC5jCiAgKi8KIHZvaWQgcnhycGNfcHJvY2Vzc19jb25uZWN0aW9uKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKLXZvaWQgcnhycGNfcmVqZWN0X3BhY2tldChzdHJ1Y3QgcnhycGNfbG9jYWwgKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci12b2lkIHJ4cnBjX3JlamVjdF9wYWNrZXRzKHN0cnVjdCByeHJwY19sb2NhbCAqKTsKIAogLyoKICAqIGNvbm5fb2JqZWN0LmMKICAqLwogZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19jb25uZWN0aW9uX2V4cGlyeTsKIGV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHJ4cnBjX2Nvbm5lY3Rpb25zOworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcnhycGNfY29ubmVjdGlvbl9wcm9jX2xpc3Q7CiBleHRlcm4gcndsb2NrX3QgcnhycGNfY29ubmVjdGlvbl9sb2NrOwogCiBpbnQgcnhycGNfZXh0cmFjdF9hZGRyX2Zyb21fc2tiKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpyeHJwY19hbGxvY19jb25uZWN0aW9uKGdmcF90KTsKIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpyeHJwY19maW5kX2Nvbm5lY3Rpb25fcmN1KHN0cnVjdCByeHJwY19sb2NhbCAqLAogCQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKik7Ci12b2lkIF9fcnhycGNfZGlzY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOwordm9pZCBfX3J4cnBjX2Rpc2Nvbm5lY3RfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqLCBzdHJ1Y3QgcnhycGNfY2FsbCAqKTsKIHZvaWQgcnhycGNfZGlzY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICopOwotdm9pZCByeHJwY19wdXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKTsKK3ZvaWQgcnhycGNfa2lsbF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOworYm9vbCByeHJwY19xdWV1ZV9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwordm9pZCByeHJwY19zZWVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKTsKK3ZvaWQgcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7CitzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfZ2V0X2Nvbm5lY3Rpb25fbWF5YmUoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7Cit2b2lkIHJ4cnBjX3B1dF9zZXJ2aWNlX2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKik7CiB2b2lkIF9fZXhpdCByeHJwY19kZXN0cm95X2FsbF9jb25uZWN0aW9ucyh2b2lkKTsKIAogc3RhdGljIGlubGluZSBib29sIHJ4cnBjX2Nvbm5faXNfY2xpZW50KGNvbnN0IHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQpAQCAtNTcxLDI0ICs5NzYsMTUgQEAKIAlyZXR1cm4gIXJ4cnBjX2Nvbm5faXNfY2xpZW50KGNvbm4pOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCitzdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfcHV0X2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCiB7Ci0JYXRvbWljX2luYygmY29ubi0+dXNhZ2UpOwotfQorCWlmICghY29ubikKKwkJcmV0dXJuOwogCi1zdGF0aWMgaW5saW5lCi1zdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfZ2V0X2Nvbm5lY3Rpb25fbWF5YmUoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCi17Ci0JcmV0dXJuIGF0b21pY19pbmNfbm90X3plcm8oJmNvbm4tPnVzYWdlKSA/IGNvbm4gOiBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgcnhycGNfcXVldWVfY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKLXsKLQlpZiAoIXJ4cnBjX2dldF9jb25uZWN0aW9uX21heWJlKGNvbm4pKQotCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKCFyeHJwY19xdWV1ZV93b3JrKCZjb25uLT5wcm9jZXNzb3IpKQotCQlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKLQlyZXR1cm4gdHJ1ZTsKKwlpZiAocnhycGNfY29ubl9pc19jbGllbnQoY29ubikpCisJCXJ4cnBjX3B1dF9jbGllbnRfY29ubihjb25uKTsKKwllbHNlCisJCXJ4cnBjX3B1dF9zZXJ2aWNlX2Nvbm4oY29ubik7CiB9CiAKIC8qCkBAIC01OTYsMTcgKzk5MiwxNCBAQAogICovCiBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfZmluZF9zZXJ2aWNlX2Nvbm5fcmN1KHN0cnVjdCByeHJwY19wZWVyICosCiAJCQkJCQkgICAgIHN0cnVjdCBza19idWZmICopOwotc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKnJ4cnBjX2luY29taW5nX2Nvbm5lY3Rpb24oc3RydWN0IHJ4cnBjX2xvY2FsICosCi0JCQkJCQkgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKiwKLQkJCQkJCSAgIHN0cnVjdCBza19idWZmICopOworc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKnJ4cnBjX3ByZWFsbG9jX3NlcnZpY2VfY29ubmVjdGlvbihnZnBfdCk7Cit2b2lkIHJ4cnBjX25ld19pbmNvbWluZ19jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICosIHN0cnVjdCBza19idWZmICopOwogdm9pZCByeHJwY191bnB1Ymxpc2hfc2VydmljZV9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwogCiAvKgogICogaW5wdXQuYwogICovCiB2b2lkIHJ4cnBjX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKik7Ci1pbnQgcnhycGNfcXVldWVfcmN2X3NrYihzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sLCBib29sKTsKLXZvaWQgcnhycGNfZmFzdF9wcm9jZXNzX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIAogLyoKICAqIGluc2VjdXJlLmMKQEAgLTY2OCwyNSArMTA2MSwyNCBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19yeF93aW5kb3dfc2l6ZTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgcnhycGNfcnhfbXR1OwogZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19yeF9qdW1ib19tYXg7CitleHRlcm4gdW5zaWduZWQgaW50IHJ4cnBjX3Jlc2VuZF90aW1lb3V0OwogCi1leHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfcGt0c1tdOwogZXh0ZXJuIGNvbnN0IHM4IHJ4cnBjX2Fja19wcmlvcml0eVtdOwogCi1leHRlcm4gY29uc3QgY2hhciAqcnhycGNfYWNrcyh1OCByZWFzb24pOwotCiAvKgogICogb3V0cHV0LmMKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCByeHJwY19yZXNlbmRfdGltZW91dDsKLQotaW50IHJ4cnBjX3NlbmRfZGF0YV9wYWNrZXQoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci1pbnQgcnhycGNfZG9fc2VuZG1zZyhzdHJ1Y3QgcnhycGNfc29jayAqLCBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7CitpbnQgcnhycGNfc2VuZF9jYWxsX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqLCB1OCk7CitpbnQgcnhycGNfc2VuZF9kYXRhX3BhY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqLCBib29sKTsKK3ZvaWQgcnhycGNfcmVqZWN0X3BhY2tldHMoc3RydWN0IHJ4cnBjX2xvY2FsICopOwogCiAvKgogICogcGVlcl9ldmVudC5jCiAgKi8KIHZvaWQgcnhycGNfZXJyb3JfcmVwb3J0KHN0cnVjdCBzb2NrICopOwogdm9pZCByeHJwY19wZWVyX2Vycm9yX2Rpc3RyaWJ1dG9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqKTsKK3ZvaWQgcnhycGNfcGVlcl9hZGRfcnR0KHN0cnVjdCByeHJwY19jYWxsICosIGVudW0gcnhycGNfcnR0X3J4X3RyYWNlLAorCQkJcnhycGNfc2VyaWFsX3QsIHJ4cnBjX3NlcmlhbF90LCBrdGltZV90LCBrdGltZV90KTsKIAogLyoKICAqIHBlZXJfb2JqZWN0LmMKQEAgLTY5NiwxMCArMTA4OCwxMyBAQAogc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2xvb2t1cF9wZWVyKHN0cnVjdCByeHJwY19sb2NhbCAqLAogCQkJCSAgICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICosIGdmcF90KTsKIHN0cnVjdCByeHJwY19wZWVyICpyeHJwY19hbGxvY19wZWVyKHN0cnVjdCByeHJwY19sb2NhbCAqLCBnZnBfdCk7CitzdHJ1Y3QgcnhycGNfcGVlciAqcnhycGNfbG9va3VwX2luY29taW5nX3BlZXIoc3RydWN0IHJ4cnBjX2xvY2FsICosCisJCQkJCSAgICAgIHN0cnVjdCByeHJwY19wZWVyICopOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcnhycGNfZ2V0X3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCitzdGF0aWMgaW5saW5lIHN0cnVjdCByeHJwY19wZWVyICpyeHJwY19nZXRfcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKIHsKIAlhdG9taWNfaW5jKCZwZWVyLT51c2FnZSk7CisJcmV0dXJuIHBlZXI7CiB9CiAKIHN0YXRpYyBpbmxpbmUKQEAgLTcxOCwxNCArMTExMywxMyBAQAogLyoKICAqIHByb2MuYwogICovCi1leHRlcm4gY29uc3QgY2hhciAqY29uc3QgcnhycGNfY2FsbF9zdGF0ZXNbXTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJ4cnBjX2NhbGxfc2VxX2ZvcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByeHJwY19jb25uZWN0aW9uX3NlcV9mb3BzOwogCiAvKgogICogcmVjdm1zZy5jCiAgKi8KLXZvaWQgcnhycGNfcmVtb3ZlX3VzZXJfSUQoc3RydWN0IHJ4cnBjX3NvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKik7Cit2b2lkIHJ4cnBjX25vdGlmeV9zb2NrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKik7CiBpbnQgcnhycGNfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90LCBpbnQpOwogCiAvKgpAQCAtNzQ0LDkgKzExMzgsMjEgQEAKIGludCByeHJwY19pbml0X3NlcnZlcl9jb25uX3NlY3VyaXR5KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICopOwogCiAvKgorICogc2VuZG1zZy5jCisgKi8KK2ludCByeHJwY19kb19zZW5kbXNnKHN0cnVjdCByeHJwY19zb2NrICosIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90KTsKKworLyoKICAqIHNrYnVmZi5jCiAgKi8KK3ZvaWQgcnhycGNfa2VybmVsX2RhdGFfY29uc3VtZWQoc3RydWN0IHJ4cnBjX2NhbGwgKiwgc3RydWN0IHNrX2J1ZmYgKik7CiB2b2lkIHJ4cnBjX3BhY2tldF9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICopOwordm9pZCByeHJwY19uZXdfc2tiKHN0cnVjdCBza19idWZmICosIGVudW0gcnhycGNfc2tiX3RyYWNlKTsKK3ZvaWQgcnhycGNfc2VlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqLCBlbnVtIHJ4cnBjX3NrYl90cmFjZSk7Cit2b2lkIHJ4cnBjX2dldF9za2Ioc3RydWN0IHNrX2J1ZmYgKiwgZW51bSByeHJwY19za2JfdHJhY2UpOwordm9pZCByeHJwY19mcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqLCBlbnVtIHJ4cnBjX3NrYl90cmFjZSk7Cit2b2lkIHJ4cnBjX2xvc2Vfc2tiKHN0cnVjdCBza19idWZmICosIGVudW0gcnhycGNfc2tiX3RyYWNlKTsKK3ZvaWQgcnhycGNfcHVyZ2VfcXVldWUoc3RydWN0IHNrX2J1ZmZfaGVhZCAqKTsKIAogLyoKICAqIHN5c2N0bC5jCkBAIC03NjQsNiArMTE3MCwyMyBAQAogICovCiBpbnQgcnhycGNfZXh0cmFjdF9hZGRyX2Zyb21fc2tiKHN0cnVjdCBzb2NrYWRkcl9yeHJwYyAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIAorc3RhdGljIGlubGluZSBib29sIGJlZm9yZSh1MzIgc2VxMSwgdTMyIHNlcTIpCit7CisgICAgICAgIHJldHVybiAoczMyKShzZXExIC0gc2VxMikgPCAwOworfQorc3RhdGljIGlubGluZSBib29sIGJlZm9yZV9lcSh1MzIgc2VxMSwgdTMyIHNlcTIpCit7CisgICAgICAgIHJldHVybiAoczMyKShzZXExIC0gc2VxMikgPD0gMDsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBhZnRlcih1MzIgc2VxMSwgdTMyIHNlcTIpCit7CisgICAgICAgIHJldHVybiAoczMyKShzZXExIC0gc2VxMikgPiAwOworfQorc3RhdGljIGlubGluZSBib29sIGFmdGVyX2VxKHUzMiBzZXExLCB1MzIgc2VxMikKK3sKKyAgICAgICAgcmV0dXJuIChzMzIpKHNlcTEgLSBzZXEyKSA+PSAwOworfQorCiAvKgogICogZGVidWcgdHJhY2luZwogICovCkBAIC04NDYsMTEgKzEyNjksMTIgQEAKIAogI2RlZmluZSBBU1NFUlRDTVAoWCwgT1AsIFkpCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQl1bnNpZ25lZCBsb25nIF94ID0gKHVuc2lnbmVkIGxvbmcpKFgpOwkJCQlcCi0JdW5zaWduZWQgbG9uZyBfeSA9ICh1bnNpZ25lZCBsb25nKShZKTsJCQkJXAorCV9fdHlwZW9mX18oWCkgX3ggPSAoWCk7CQkJCQkJXAorCV9fdHlwZW9mX18oWSkgX3kgPSAoX190eXBlb2ZfXyhYKSkoWSk7CQkJCVwKIAlpZiAodW5saWtlbHkoIShfeCBPUCBfeSkpKSB7CQkJCQlcCi0JCXByX2VycigiQXNzZXJ0aW9uIGZhaWxlZCAtICVsdSgweCVseCkgJXMgJWx1KDB4JWx4KSBpcyBmYWxzZVxuIiwJCQlcCi0JCSAgICAgICBfeCwgX3gsICNPUCwgX3ksIF95KTsJCQkJXAorCQlwcl9lcnIoIkFzc2VydGlvbiBmYWlsZWQgLSAlbHUoMHglbHgpICVzICVsdSgweCVseCkgaXMgZmFsc2VcbiIsIFwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKV94LCAodW5zaWduZWQgbG9uZylfeCwgI09QLAlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZylfeSwgKHVuc2lnbmVkIGxvbmcpX3kpOwkJXAogCQlCVUcoKTsJCQkJCQkJXAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCkBAIC04NjUsMTEgKzEyODksMTIgQEAKIAogI2RlZmluZSBBU1NFUlRJRkNNUChDLCBYLCBPUCwgWSkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBfeCA9ICh1bnNpZ25lZCBsb25nKShYKTsJCQkJXAotCXVuc2lnbmVkIGxvbmcgX3kgPSAodW5zaWduZWQgbG9uZykoWSk7CQkJCVwKKwlfX3R5cGVvZl9fKFgpIF94ID0gKFgpOwkJCQkJCVwKKwlfX3R5cGVvZl9fKFkpIF95ID0gKF9fdHlwZW9mX18oWCkpKFkpOwkJCQlcCiAJaWYgKHVubGlrZWx5KChDKSAmJiAhKF94IE9QIF95KSkpIHsJCQkJXAogCQlwcl9lcnIoIkFzc2VydGlvbiBmYWlsZWQgLSAlbHUoMHglbHgpICVzICVsdSgweCVseCkgaXMgZmFsc2VcbiIsIFwKLQkJICAgICAgIF94LCBfeCwgI09QLCBfeSwgX3kpOwkJCQlcCisJCSAgICAgICAodW5zaWduZWQgbG9uZylfeCwgKHVuc2lnbmVkIGxvbmcpX3gsICNPUCwJXAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpX3ksICh1bnNpZ25lZCBsb25nKV95KTsJCVwKIAkJQlVHKCk7CQkJCQkJCVwKIAl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQpAQCAtODkzLDU0ICsxMzE4LDMgQEAKIH0gd2hpbGUgKDApCiAKICNlbmRpZiAvKiBfX0tERUJVR0FMTCAqLwotCi0vKgotICogc29ja2V0IGJ1ZmZlciBhY2NvdW50aW5nIC8gbGVhayBmaW5kaW5nCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3J4cnBjX25ld19za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgY2hhciAqZm4pCi17Ci0JLy9fbmV0KCJuZXcgc2tiICVwICVzIFslZF0iLCBza2IsIGZuLCBhdG9taWNfcmVhZCgmcnhycGNfbl9za2JzKSk7Ci0JLy9hdG9taWNfaW5jKCZyeHJwY19uX3NrYnMpOwotfQotCi0jZGVmaW5lIHJ4cnBjX25ld19za2Ioc2tiKSBfX3J4cnBjX25ld19za2IoKHNrYiksIF9fZnVuY19fKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19yeHJwY19raWxsX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBjaGFyICpmbikKLXsKLQkvL19uZXQoImtpbGwgc2tiICVwICVzIFslZF0iLCBza2IsIGZuLCBhdG9taWNfcmVhZCgmcnhycGNfbl9za2JzKSk7Ci0JLy9hdG9taWNfZGVjKCZyeHJwY19uX3NrYnMpOwotfQotCi0jZGVmaW5lIHJ4cnBjX2tpbGxfc2tiKHNrYikgX19yeHJwY19raWxsX3NrYigoc2tiKSwgX19mdW5jX18pCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3J4cnBjX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IGNoYXIgKmZuKQotewotCWlmIChza2IpIHsKLQkJQ0hFQ0tfU0xBQl9PS0FZKCZza2ItPnVzZXJzKTsKLQkJLy9fbmV0KCJmcmVlIHNrYiAlcCAlcyBbJWRdIiwKLQkJLy8gICAgIHNrYiwgZm4sIGF0b21pY19yZWFkKCZyeHJwY19uX3NrYnMpKTsKLQkJLy9hdG9taWNfZGVjKCZyeHJwY19uX3NrYnMpOwotCQlrZnJlZV9za2Ioc2tiKTsKLQl9Ci19Ci0KLSNkZWZpbmUgcnhycGNfZnJlZV9za2Ioc2tiKSBfX3J4cnBjX2ZyZWVfc2tiKChza2IpLCBfX2Z1bmNfXykKLQotc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX3B1cmdlX3F1ZXVlKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKChsaXN0KSkpICE9IE5VTEwpCi0JCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci19Ci0KLSNkZWZpbmUgcnhycGNfZ2V0X2NhbGwoQ0FMTCkJCQkJXAotZG8gewkJCQkJCQlcCi0JQ0hFQ0tfU0xBQl9PS0FZKCYoQ0FMTCktPnVzYWdlKTsJCVwKLQlpZiAoYXRvbWljX2luY19yZXR1cm4oJihDQUxMKS0+dXNhZ2UpID09IDEpCVwKLQkJQlVHKCk7CQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIHJ4cnBjX3B1dF9jYWxsKENBTEwpCQkJCVwKLWRvIHsJCQkJCQkJXAotCV9fcnhycGNfcHV0X2NhbGwoQ0FMTCk7CQkJCVwKLX0gd2hpbGUgKDApCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY2FsbF9hY2NlcHQuYyBiL25ldC9yeHJwYy9jYWxsX2FjY2VwdC5jCmluZGV4IDliYWUyMWUuLjNjYWMyMzEgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jYWxsX2FjY2VwdC5jCisrKyBiL25ldC9yeHJwYy9jYWxsX2FjY2VwdC5jCkBAIC0yMCwyNjUgKzIwLDQwOSBAQAogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+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+YWNjZXB0cSk7Ci0JCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQkJCWF0b21pY19pbmMoJmNhbGwtPnNrYl9jb3VudCk7Ci0JCQluc3AgPSByeHJwY19za2Iobm90aWZpY2F0aW9uKTsKLQkJCW5zcC0+Y2FsbCA9IGNhbGw7Ci0KLQkJCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLCA+PSwgMyk7Ci0KLQkJCV9kZWJ1Zygibm90aWZ5Iik7Ci0JCQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCQkJcmV0ID0gcnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBub3RpZmljYXRpb24sIHRydWUsCi0JCQkJCQkgIGZhbHNlKTsKLQkJCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQkJCW5vdGlmaWNhdGlvbiA9IE5VTEw7Ci0JCQlCVUdfT04ocmV0IDwgMCk7Ci0JCX0KLQkJc3Bpbl91bmxvY2soJmNhbGwtPmNvbm4tPnN0YXRlX2xvY2spOwotCi0JCV9kZWJ1ZygicXVldWVkIik7Ci0JfQotCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7Ci0KLQlfZGVidWcoInByb2Nlc3MiKTsKLQlyeHJwY19mYXN0X3Byb2Nlc3NfcGFja2V0KGNhbGwsIHNrYik7Ci0KLQlfZGVidWcoImRvbmUiKTsKLQlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwotCXJ4cnBjX2ZyZWVfc2tiKG5vdGlmaWNhdGlvbik7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JX2xlYXZlKCIgPSAwIik7Ci0JcmV0dXJuIDA7Ci0KLWludmFsaWRfc2VydmljZToKLQlfZGVidWcoImludmFsaWQiKTsKLQlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwotCi0JcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAoIXRlc3RfYml0KFJYUlBDX0NBTExfUkVMRUFTRUQsICZjYWxsLT5mbGFncykgJiYKLQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRUxFQVNFLCAmY2FsbC0+ZXZlbnRzKSkgewotCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQl9Ci0JcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCXJldCA9IC1FQ09OTlJFRlVTRUQ7Ci1lcnJvcjoKLQlyeHJwY19mcmVlX3NrYihub3RpZmljYXRpb24pOwotZXJyb3Jfbm9mcmVlOgotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBhY2NlcHQgaW5jb21pbmcgY2FsbHMgdGhhdCBuZWVkIHBlZXIsIHRyYW5zcG9ydCBhbmQvb3IgY29ubmVjdGlvbiBzZXR0aW5nIHVwCi0gKiAtIHRoZSBwYWNrZXRzIHdlIGdldCBhcmUgYWxsIGluY29taW5nIGNsaWVudCBEQVRBIHBhY2tldHMgdGhhdCBoYXZlIHNlcSA9PSAxCi0gKi8KLXZvaWQgcnhycGNfYWNjZXB0X2luY29taW5nX2NhbGxzKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgc3J4OwotCXN0cnVjdCByeHJwY19zb2NrICpyeDsKLQlzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIgd2hkcjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiVkIiwgbG9jYWwtPmRlYnVnX2lkKTsKLQotCXNrYiA9IHNrYl9kZXF1ZXVlKCZsb2NhbC0+YWNjZXB0X3F1ZXVlKTsKLQlpZiAoIXNrYikgewotCQlfbGVhdmUoIlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlfbmV0KCJpbmNvbWluZyBjYWxsIHNrYiAlcCIsIHNrYik7Ci0KLQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCi0JLyogU2V0IHVwIGEgcmVzcG9uc2UgcGFja2V0IGhlYWRlciBpbiBjYXNlIHdlIG5lZWQgaXQgKi8KLQl3aGRyLmVwb2NoCT0gaHRvbmwoc3AtPmhkci5lcG9jaCk7Ci0Jd2hkci5jaWQJPSBodG9ubChzcC0+aGRyLmNpZCk7Ci0Jd2hkci5jYWxsTnVtYmVyCT0gaHRvbmwoc3AtPmhkci5jYWxsTnVtYmVyKTsKLQl3aGRyLnNlcQk9IGh0b25sKHNwLT5oZHIuc2VxKTsKLQl3aGRyLnNlcmlhbAk9IDA7Ci0Jd2hkci5mbGFncwk9IDA7Ci0Jd2hkci50eXBlCT0gMDsKLQl3aGRyLnVzZXJTdGF0dXMJPSAwOwotCXdoZHIuc2VjdXJpdHlJbmRleCA9IHNwLT5oZHIuc2VjdXJpdHlJbmRleDsKLQl3aGRyLl9yc3ZkCT0gMDsKLQl3aGRyLnNlcnZpY2VJZAk9IGh0b25zKHNwLT5oZHIuc2VydmljZUlkKTsKLQotCWlmIChyeHJwY19leHRyYWN0X2FkZHJfZnJvbV9za2IoJnNyeCwgc2tiKSA8IDApCi0JCWdvdG8gZHJvcDsKLQotCS8qIGdldCB0aGUgc29ja2V0IHByb3ZpZGluZyB0aGUgc2VydmljZSAqLwotCXJlYWRfbG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocngsICZsb2NhbC0+c2VydmljZXMsIGxpc3Rlbl9saW5rKSB7Ci0JCWlmIChyeC0+c3J4LnNyeF9zZXJ2aWNlID09IHNwLT5oZHIuc2VydmljZUlkICYmCi0JCSAgICByeC0+c2suc2tfc3RhdGUgIT0gUlhSUENfQ0xPU0UpCi0JCQlnb3RvIGZvdW5kX3NlcnZpY2U7Ci0JfQotCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci0JZ290byBpbnZhbGlkX3NlcnZpY2U7CisJdHJhY2VfcnhycGNfYWJvcnQoIklOViIsIHNwLT5oZHIuY2lkLCBzcC0+aGRyLmNhbGxOdW1iZXIsIHNwLT5oZHIuc2VxLAorCQkJICBSWF9JTlZBTElEX09QRVJBVElPTiwgRU9QTk9UU1VQUCk7CisJc2tiLT5tYXJrID0gUlhSUENfU0tCX01BUktfTE9DQUxfQUJPUlQ7CisJc2tiLT5wcmlvcml0eSA9IFJYX0lOVkFMSURfT1BFUkFUSU9OOworCV9sZWF2ZSgiID0gTlVMTCBbc2VydmljZV0iKTsKKwlyZXR1cm4gTlVMTDsKIAogZm91bmRfc2VydmljZToKLQlfZGVidWcoImZvdW5kIHNlcnZpY2UgJWhkIiwgcngtPnNyeC5zcnhfc2VydmljZSk7Ci0JaWYgKHNrX2FjY2VwdHFfaXNfZnVsbCgmcngtPnNrKSkKLQkJZ290byBiYWNrbG9nX2Z1bGw7Ci0Jc2tfYWNjZXB0cV9hZGRlZCgmcngtPnNrKTsKLQlzb2NrX2hvbGQoJnJ4LT5zayk7Ci0JcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwlzcGluX2xvY2soJnJ4LT5pbmNvbWluZ19sb2NrKTsKKwlpZiAocngtPnNrLnNrX3N0YXRlID09IFJYUlBDX0NMT1NFKSB7CisJCXRyYWNlX3J4cnBjX2Fib3J0KCJDTFMiLCBzcC0+aGRyLmNpZCwgc3AtPmhkci5jYWxsTnVtYmVyLAorCQkJCSAgc3AtPmhkci5zZXEsIFJYX0lOVkFMSURfT1BFUkFUSU9OLCBFU0hVVERPV04pOworCQlza2ItPm1hcmsgPSBSWFJQQ19TS0JfTUFSS19MT0NBTF9BQk9SVDsKKwkJc2tiLT5wcmlvcml0eSA9IFJYX0lOVkFMSURfT1BFUkFUSU9OOworCQlfbGVhdmUoIiA9IE5VTEwgW2Nsb3NlXSIpOworCQljYWxsID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQogCi0JcmV0ID0gcnhycGNfYWNjZXB0X2luY29taW5nX2NhbGwobG9jYWwsIHJ4LCBza2IsICZzcngpOwotCWlmIChyZXQgPCAwKQotCQlza19hY2NlcHRxX3JlbW92ZWQoJnJ4LT5zayk7Ci0Jc29ja19wdXQoJnJ4LT5zayk7Ci0Jc3dpdGNoIChyZXQpIHsKLQljYXNlIC1FQ09OTlJFU0VUOiAvKiBvbGQgY2FsbHMgYXJlIGlnbm9yZWQgKi8KLQljYXNlIC1FQ09OTkFCT1JURUQ6IC8qIGFib3J0ZWQgY2FsbHMgYXJlIHJlYWJvcnRlZCBvciBpZ25vcmVkICovCi0JY2FzZSAwOgotCQlyZXR1cm47Ci0JY2FzZSAtRUNPTk5SRUZVU0VEOgotCQlnb3RvIGludmFsaWRfc2VydmljZTsKLQljYXNlIC1FQlVTWToKLQkJZ290byBidXN5OwotCWNhc2UgLUVLRVlSRUpFQ1RFRDoKLQkJZ290byBzZWN1cml0eV9taXNtYXRjaDsKKwljYWxsID0gcnhycGNfYWxsb2NfaW5jb21pbmdfY2FsbChyeCwgbG9jYWwsIGNvbm4sIHNrYik7CisJaWYgKCFjYWxsKSB7CisJCXNrYi0+bWFyayA9IFJYUlBDX1NLQl9NQVJLX0JVU1k7CisJCV9sZWF2ZSgiID0gTlVMTCBbYnVzeV0iKTsKKwkJY2FsbCA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKworCXRyYWNlX3J4cnBjX3JlY2VpdmUoY2FsbCwgcnhycGNfcmVjZWl2ZV9pbmNvbWluZywKKwkJCSAgICBzcC0+aGRyLnNlcmlhbCwgc3AtPmhkci5zZXEpOworCisJLyogTWFrZSB0aGUgY2FsbCBsaXZlLiAqLworCXJ4cnBjX2luY29taW5nX2NhbGwocngsIGNhbGwsIHNrYik7CisJY29ubiA9IGNhbGwtPmNvbm47CisKKwlpZiAocngtPm5vdGlmeV9uZXdfY2FsbCkKKwkJcngtPm5vdGlmeV9uZXdfY2FsbCgmcngtPnNrLCBjYWxsLCBjYWxsLT51c2VyX2NhbGxfSUQpOworCWVsc2UKKwkJc2tfYWNjZXB0cV9hZGRlZCgmcngtPnNrKTsKKworCXNwaW5fbG9jaygmY29ubi0+c3RhdGVfbG9jayk7CisJc3dpdGNoIChjb25uLT5zdGF0ZSkgeworCWNhc2UgUlhSUENfQ09OTl9TRVJWSUNFX1VOU0VDVVJFRDoKKwkJY29ubi0+c3RhdGUgPSBSWFJQQ19DT05OX1NFUlZJQ0VfQ0hBTExFTkdJTkc7CisJCXNldF9iaXQoUlhSUENfQ09OTl9FVl9DSEFMTEVOR0UsICZjYWxsLT5jb25uLT5ldmVudHMpOworCQlyeHJwY19xdWV1ZV9jb25uKGNhbGwtPmNvbm4pOworCQlicmVhazsKKworCWNhc2UgUlhSUENfQ09OTl9TRVJWSUNFOgorCQl3cml0ZV9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJaWYgKHJ4LT5kaXNjYXJkX25ld19jYWxsKQorCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q7CisJCWVsc2UKKwkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOworCQl3cml0ZV91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlicmVhazsKKworCWNhc2UgUlhSUENfQ09OTl9SRU1PVEVMWV9BQk9SVEVEOgorCQlyeHJwY19zZXRfY2FsbF9jb21wbGV0aW9uKGNhbGwsIFJYUlBDX0NBTExfUkVNT1RFTFlfQUJPUlRFRCwKKwkJCQkJICBjb25uLT5yZW1vdGVfYWJvcnQsIEVDT05OQUJPUlRFRCk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfQ09OTl9MT0NBTExZX0FCT1JURUQ6CisJCXJ4cnBjX2Fib3J0X2NhbGwoIkNPTiIsIGNhbGwsIHNwLT5oZHIuc2VxLAorCQkJCSBjb25uLT5sb2NhbF9hYm9ydCwgRUNPTk5BQk9SVEVEKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQorCXNwaW5fdW5sb2NrKCZjb25uLT5zdGF0ZV9sb2NrKTsKIAotYmFja2xvZ19mdWxsOgotCXJlYWRfdW5sb2NrX2JoKCZsb2NhbC0+c2VydmljZXNfbG9jayk7Ci1idXN5OgotCXJ4cnBjX2J1c3kobG9jYWwsICZzcngsICZ3aGRyKTsKLQlyeHJwY19mcmVlX3NrYihza2IpOwotCXJldHVybjsKKwlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HKQorCQlyeHJwY19ub3RpZnlfc29ja2V0KGNhbGwpOwogCi1kcm9wOgotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JcmV0dXJuOworCS8qIFdlIGhhdmUgdG8gZGlzY2FyZCB0aGUgcHJlYWxsb2MgcXVldWUncyByZWYgaGVyZSBhbmQgcmVseSBvbiBhCisJICogY29tYmluYXRpb24gb2YgdGhlIFJDVSByZWFkIGxvY2sgYW5kIHJlZnMgaGVsZCBlaXRoZXIgYnkgdGhlIHNvY2tldAorCSAqIChyZWN2bXNnIHF1ZXVlLCB0by1iZS1hY2NlcHRlZCBxdWV1ZSBvciB1c2VyIElEIHRyZWUpIG9yIHRoZSBrZXJuZWwKKwkgKiBzZXJ2aWNlIHRvIHByZXZlbnQgdGhlIGNhbGwgZnJvbSBiZWluZyBkZWFsbG9jYXRlZCB0b28gZWFybHkuCisJICovCisJcnhycGNfcHV0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9wdXQpOwogCi1pbnZhbGlkX3NlcnZpY2U6Ci0Jc2tiLT5wcmlvcml0eSA9IFJYX0lOVkFMSURfT1BFUkFUSU9OOwotCXJ4cnBjX3JlamVjdF9wYWNrZXQobG9jYWwsIHNrYik7Ci0JcmV0dXJuOwotCi0JLyogY2FuJ3QgY2hhbmdlIGNvbm5lY3Rpb24gc2VjdXJpdHkgdHlwZSBtaWQtZmxvdyAqLwotc2VjdXJpdHlfbWlzbWF0Y2g6Ci0Jc2tiLT5wcmlvcml0eSA9IFJYX1BST1RPQ09MX0VSUk9SOwotCXJ4cnBjX3JlamVjdF9wYWNrZXQobG9jYWwsIHNrYik7Ci0JcmV0dXJuOworCV9sZWF2ZSgiID0gJXB7JWR9IiwgY2FsbCwgY2FsbC0+ZGVidWdfaWQpOworb3V0OgorCXNwaW5fdW5sb2NrKCZyeC0+aW5jb21pbmdfbG9jayk7CisJcmV0dXJuIGNhbGw7CiB9CiAKIC8qCkBAIC0yODYsNyArNDMwLDggQEAKICAqIC0gYXNzaWduIHRoZSB1c2VyIGNhbGwgSUQgdG8gdGhlIGNhbGwgYXQgdGhlIGZyb250IG9mIHRoZSBxdWV1ZQogICovCiBzdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfYWNjZXB0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQpCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwKKwkJCQkgICAgIHJ4cnBjX25vdGlmeV9yeF90IG5vdGlmeV9yeCkKIHsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50LCAqKnBwOwpAQCAtMjk4LDEyICs0NDMsMTMgQEAKIAogCXdyaXRlX2xvY2soJnJ4LT5jYWxsX2xvY2spOwogCi0JcmV0ID0gLUVOT0RBVEE7Ci0JaWYgKGxpc3RfZW1wdHkoJnJ4LT5hY2NlcHRxKSkKLQkJZ290byBvdXQ7CisJaWYgKGxpc3RfZW1wdHkoJnJ4LT50b19iZV9hY2NlcHRlZCkpIHsKKwkJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwkJa2xlYXZlKCIgPSAtRU5PREFUQSBbZW1wdHldIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9EQVRBKTsKKwl9CiAKIAkvKiBjaGVjayB0aGUgdXNlciBJRCBpc24ndCBhbHJlYWR5IGluIHVzZSAqLwotCXJldCA9IC1FQkFEU0xUOwogCXBwID0gJnJ4LT5jYWxscy5yYl9ub2RlOwogCXBhcmVudCA9IE5VTEw7CiAJd2hpbGUgKCpwcCkgewpAQCAtMzE1LDYyICs0NjEsNTkgQEAKIAkJZWxzZSBpZiAodXNlcl9jYWxsX0lEID4gY2FsbC0+dXNlcl9jYWxsX0lEKQogCQkJcHAgPSAmKCpwcCktPnJiX3JpZ2h0OwogCQllbHNlCi0JCQlnb3RvIG91dDsKKwkJCWdvdG8gaWRfaW5fdXNlOwogCX0KIAotCS8qIGRlcXVldWUgdGhlIGZpcnN0IGNhbGwgYW5kIGNoZWNrIGl0J3Mgc3RpbGwgdmFsaWQgKi8KLQljYWxsID0gbGlzdF9lbnRyeShyeC0+YWNjZXB0cS5uZXh0LCBzdHJ1Y3QgcnhycGNfY2FsbCwgYWNjZXB0X2xpbmspOworCS8qIERlcXVldWUgdGhlIGZpcnN0IGNhbGwgYW5kIGNoZWNrIGl0J3Mgc3RpbGwgdmFsaWQuICBXZSBnYWluCisJICogcmVzcG9uc2liaWxpdHkgZm9yIHRoZSBxdWV1ZSdzIHJlZmVyZW5jZS4KKwkgKi8KKwljYWxsID0gbGlzdF9lbnRyeShyeC0+dG9fYmVfYWNjZXB0ZWQubmV4dCwKKwkJCSAgc3RydWN0IHJ4cnBjX2NhbGwsIGFjY2VwdF9saW5rKTsKIAlsaXN0X2RlbF9pbml0KCZjYWxsLT5hY2NlcHRfbGluayk7CiAJc2tfYWNjZXB0cV9yZW1vdmVkKCZyeC0+c2spOworCXJ4cnBjX3NlZV9jYWxsKGNhbGwpOwogCiAJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CiAJc3dpdGNoIChjYWxsLT5zdGF0ZSkgewogCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOgogCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX1JFQ1ZfUkVRVUVTVDsKIAkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQ6Ci0JY2FzZSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDoKLQkJcmV0ID0gLUVDT05OQUJPUlRFRDsKKwljYXNlIFJYUlBDX0NBTExfQ09NUExFVEU6CisJCXJldCA9IGNhbGwtPmVycm9yOwogCQlnb3RvIG91dF9yZWxlYXNlOwotCWNhc2UgUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SOgotCQlyZXQgPSBjYWxsLT5jb25uLT5lcnJvcjsKLQkJZ290byBvdXRfcmVsZWFzZTsKLQljYXNlIFJYUlBDX0NBTExfREVBRDoKLQkJcmV0ID0gLUVUSU1FOwotCQlnb3RvIG91dF9kaXNjYXJkOwogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KIAogCS8qIGZvcm1hbGlzZSB0aGUgYWNjZXB0YW5jZSAqLworCWNhbGwtPm5vdGlmeV9yeCA9IG5vdGlmeV9yeDsKIAljYWxsLT51c2VyX2NhbGxfSUQgPSB1c2VyX2NhbGxfSUQ7CisJcnhycGNfZ2V0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9nb3RfdXNlcmlkKTsKIAlyYl9saW5rX25vZGUoJmNhbGwtPnNvY2tfbm9kZSwgcGFyZW50LCBwcCk7CiAJcmJfaW5zZXJ0X2NvbG9yKCZjYWxsLT5zb2NrX25vZGUsICZyeC0+Y2FsbHMpOwogCWlmICh0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSkKIAkJQlVHKCk7Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9BQ0NFUFRFRCwgJmNhbGwtPmV2ZW50cykpCi0JCUJVRygpOwotCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CiAKLQlyeHJwY19nZXRfY2FsbChjYWxsKTsKIAl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwogCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisJcnhycGNfbm90aWZ5X3NvY2tldChjYWxsKTsKKwlyeHJwY19zZXJ2aWNlX3ByZWFsbG9jKHJ4LCBHRlBfS0VSTkVMKTsKIAlfbGVhdmUoIiA9ICVweyVkfSIsIGNhbGwsIGNhbGwtPmRlYnVnX2lkKTsKIAlyZXR1cm4gY2FsbDsKIAotCS8qIGlmIHRoZSBjYWxsIGlzIGFscmVhZHkgZHlpbmcgb3IgZGVhZCwgdGhlbiB3ZSBsZWF2ZSB0aGUgc29ja2V0J3MgcmVmCi0JICogb24gaXQgdG8gYmUgcmVsZWFzZWQgYnkgcnhycGNfZGVhZF9jYWxsX2V4cGlyZWQoKSBhcyBpbmR1Y2VkIGJ5Ci0JICogcnhycGNfcmVsZWFzZV9jYWxsKCkgKi8KIG91dF9yZWxlYXNlOgogCV9kZWJ1ZygicmVsZWFzZSAlcCIsIGNhbGwpOwotCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgotCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JFTEVBU0UsICZjYWxsLT5ldmVudHMpKQotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotb3V0X2Rpc2NhcmQ6CiAJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlfZGVidWcoImRpc2NhcmQgJXAiLCBjYWxsKTsKLW91dDoKIAl3cml0ZV91bmxvY2soJnJ4LT5jYWxsX2xvY2spOworCXJ4cnBjX3JlbGVhc2VfY2FsbChyeCwgY2FsbCk7CisJcnhycGNfcHV0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9wdXQpOworCWdvdG8gb3V0OworCitpZF9pbl91c2U6CisJcmV0ID0gLUVCQURTTFQ7CisJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKK291dDoKKwlyeHJwY19zZXJ2aWNlX3ByZWFsbG9jKHJ4LCBHRlBfS0VSTkVMKTsKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQpAQCAtMzgyLDYgKzUyNSw3IEBACiBpbnQgcnhycGNfcmVqZWN0X2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4KQogewogCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCWJvb2wgYWJvcnQgPSBmYWxzZTsKIAlpbnQgcmV0OwogCiAJX2VudGVyKCIiKTsKQEAgLTM5MCw4OCArNTM0LDczIEBACiAKIAl3cml0ZV9sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKIAotCXJldCA9IC1FTk9EQVRBOwotCWlmIChsaXN0X2VtcHR5KCZyeC0+YWNjZXB0cSkpCi0JCWdvdG8gb3V0OworCWlmIChsaXN0X2VtcHR5KCZyeC0+dG9fYmVfYWNjZXB0ZWQpKSB7CisJCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisJCXJldHVybiAtRU5PREFUQTsKKwl9CiAKLQkvKiBkZXF1ZXVlIHRoZSBmaXJzdCBjYWxsIGFuZCBjaGVjayBpdCdzIHN0aWxsIHZhbGlkICovCi0JY2FsbCA9IGxpc3RfZW50cnkocngtPmFjY2VwdHEubmV4dCwgc3RydWN0IHJ4cnBjX2NhbGwsIGFjY2VwdF9saW5rKTsKKwkvKiBEZXF1ZXVlIHRoZSBmaXJzdCBjYWxsIGFuZCBjaGVjayBpdCdzIHN0aWxsIHZhbGlkLiAgV2UgZ2FpbgorCSAqIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgcXVldWUncyByZWZlcmVuY2UuCisJICovCisJY2FsbCA9IGxpc3RfZW50cnkocngtPnRvX2JlX2FjY2VwdGVkLm5leHQsCisJCQkgIHN0cnVjdCByeHJwY19jYWxsLCBhY2NlcHRfbGluayk7CiAJbGlzdF9kZWxfaW5pdCgmY2FsbC0+YWNjZXB0X2xpbmspOwogCXNrX2FjY2VwdHFfcmVtb3ZlZCgmcngtPnNrKTsKKwlyeHJwY19zZWVfY2FsbChjYWxsKTsKIAogCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwogCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKIAljYXNlIFJYUlBDX0NBTExfU0VSVkVSX0FDQ0VQVElORzoKLQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9CVVNZOwotCQlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JFSkVDVF9CVVNZLCAmY2FsbC0+ZXZlbnRzKSkKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCXJldCA9IDA7Ci0JCWdvdG8gb3V0X3JlbGVhc2U7Ci0JY2FzZSBSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQ6Ci0JY2FzZSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDoKLQkJcmV0ID0gLUVDT05OQUJPUlRFRDsKLQkJZ290byBvdXRfcmVsZWFzZTsKLQljYXNlIFJYUlBDX0NBTExfTkVUV09SS19FUlJPUjoKLQkJcmV0ID0gY2FsbC0+Y29ubi0+ZXJyb3I7Ci0JCWdvdG8gb3V0X3JlbGVhc2U7Ci0JY2FzZSBSWFJQQ19DQUxMX0RFQUQ6Ci0JCXJldCA9IC1FVElNRTsKKwkJX19yeHJwY19hYm9ydF9jYWxsKCJSRUoiLCBjYWxsLCAxLCBSWF9VU0VSX0FCT1JULCBFQ09OTkFCT1JURUQpOworCQlhYm9ydCA9IHRydWU7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgUlhSUENfQ0FMTF9DT01QTEVURToKKwkJcmV0ID0gY2FsbC0+ZXJyb3I7CiAJCWdvdG8gb3V0X2Rpc2NhcmQ7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQogCi0JLyogaWYgdGhlIGNhbGwgaXMgYWxyZWFkeSBkeWluZyBvciBkZWFkLCB0aGVuIHdlIGxlYXZlIHRoZSBzb2NrZXQncyByZWYKLQkgKiBvbiBpdCB0byBiZSByZWxlYXNlZCBieSByeHJwY19kZWFkX2NhbGxfZXhwaXJlZCgpIGFzIGluZHVjZWQgYnkKLQkgKiByeHJwY19yZWxlYXNlX2NhbGwoKSAqLwotb3V0X3JlbGVhc2U6Ci0JX2RlYnVnKCJyZWxlYXNlICVwIiwgY2FsbCk7Ci0JaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCi0JICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpCi0JCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CiBvdXRfZGlzY2FyZDoKIAl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCV9kZWJ1ZygiZGlzY2FyZCAlcCIsIGNhbGwpOwotb3V0OgogCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CisJaWYgKGFib3J0KSB7CisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOworCQlyeHJwY19yZWxlYXNlX2NhbGwocngsIGNhbGwpOworCQlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CisJfQorCXJ4cnBjX3NlcnZpY2VfcHJlYWxsb2MocngsIEdGUF9LRVJORUwpOwogCV9sZWF2ZSgiID0gJWQiLCByZXQpOwogCXJldHVybiByZXQ7CiB9CiAKLS8qKgotICogcnhycGNfa2VybmVsX2FjY2VwdF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhY2NlcHQgYW4gaW5jb21pbmcgY2FsbAotICogQHNvY2s6IFRoZSBzb2NrZXQgb24gd2hpY2ggdGhlIGltcGVuZGluZyBjYWxsIGlzIHdhaXRpbmcKLSAqIEB1c2VyX2NhbGxfSUQ6IFRoZSB0YWcgdG8gYXR0YWNoIHRvIHRoZSBjYWxsCisvKgorICogcnhycGNfa2VybmVsX2NoYXJnZV9hY2NlcHQgLSBDaGFyZ2UgdXAgc29ja2V0IHdpdGggcHJlYWxsb2NhdGVkIGNhbGxzCisgKiBAc29jazogVGhlIHNvY2tldCBvbiB3aGljaCB0byBwcmVhbGxvY2F0ZQorICogQG5vdGlmeV9yeDogRXZlbnQgbm90aWZpY2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgY2FsbAorICogQHVzZXJfYXR0YWNoX2NhbGw6IEZ1bmMgdG8gYXR0YWNoIGNhbGwgdG8gdXNlcl9jYWxsX0lECisgKiBAdXNlcl9jYWxsX0lEOiBUaGUgdGFnIHRvIGF0dGFjaCB0byB0aGUgcHJlYWxsb2NhdGVkIGNhbGwKKyAqIEBnZnA6IFRoZSBhbGxvY2F0aW9uIGNvbmRpdGlvbnMuCiAgKgotICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBhY2NlcHQgYW4gaW5jb21pbmcgY2FsbCwgYXNzdW1pbmcgdGhlIGluY29taW5nCi0gKiBjYWxsIGlzIHN0aWxsIHZhbGlkLgotICovCi1zdHJ1Y3QgcnhycGNfY2FsbCAqcnhycGNfa2VybmVsX2FjY2VwdF9jYWxsKHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkJCSAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCkKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQotCV9lbnRlcigiLCVseCIsIHVzZXJfY2FsbF9JRCk7Ci0JY2FsbCA9IHJ4cnBjX2FjY2VwdF9jYWxsKHJ4cnBjX3NrKHNvY2stPnNrKSwgdXNlcl9jYWxsX0lEKTsKLQlfbGVhdmUoIiA9ICVwIiwgY2FsbCk7Ci0JcmV0dXJuIGNhbGw7Ci19Ci1FWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9hY2NlcHRfY2FsbCk7Ci0KLS8qKgotICogcnhycGNfa2VybmVsX3JlamVjdF9jYWxsIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byByZWplY3QgYW4gaW5jb21pbmcgY2FsbAotICogQHNvY2s6IFRoZSBzb2NrZXQgb24gd2hpY2ggdGhlIGltcGVuZGluZyBjYWxsIGlzIHdhaXRpbmcKKyAqIENoYXJnZSB1cCB0aGUgc29ja2V0IHdpdGggcHJlYWxsb2NhdGVkIGNhbGxzLCBlYWNoIHdpdGggYSB1c2VyIElELiAgQQorICogZnVuY3Rpb24gc2hvdWxkIGJlIHByb3ZpZGVkIHRvIGVmZmVjdCB0aGUgYXR0YWNobWVudCBmcm9tIHRoZSB1c2VyJ3Mgc2lkZS4KKyAqIFRoZSB1c2VyIGlzIGdpdmVuIGEgcmVmIHRvIGhvbGQgb24gdGhlIGNhbGwuCiAgKgotICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byByZWplY3QgYW4gaW5jb21pbmcgY2FsbCB3aXRoIGEgQlVTWSBtZXNzYWdlLAotICogYXNzdW1pbmcgdGhlIGluY29taW5nIGNhbGwgaXMgc3RpbGwgdmFsaWQuCisgKiBOb3RlIHRoYXQgdGhlIGNhbGwgbWF5IGJlIGNvbWUgY29ubmVjdGVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCiAgKi8KLWludCByeHJwY19rZXJuZWxfcmVqZWN0X2NhbGwoc3RydWN0IHNvY2tldCAqc29jaykKK2ludCByeHJwY19rZXJuZWxfY2hhcmdlX2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICAgICAgIHJ4cnBjX25vdGlmeV9yeF90IG5vdGlmeV9yeCwKKwkJCSAgICAgICByeHJwY191c2VyX2F0dGFjaF9jYWxsX3QgdXNlcl9hdHRhY2hfY2FsbCwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCwgZ2ZwX3QgZ2ZwKQogewotCWludCByZXQ7CisJc3RydWN0IHJ4cnBjX3NvY2sgKnJ4ID0gcnhycGNfc2soc29jay0+c2spOworCXN0cnVjdCByeHJwY19iYWNrbG9nICpiID0gcngtPmJhY2tsb2c7CiAKLQlfZW50ZXIoIiIpOwotCXJldCA9IHJ4cnBjX3JlamVjdF9jYWxsKHJ4cnBjX3NrKHNvY2stPnNrKSk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKKwlpZiAoc29jay0+c2stPnNrX3N0YXRlID09IFJYUlBDX0NMT1NFKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCXJldHVybiByeHJwY19zZXJ2aWNlX3ByZWFsbG9jX29uZShyeCwgYiwgbm90aWZ5X3J4LAorCQkJCQkgIHVzZXJfYXR0YWNoX2NhbGwsIHVzZXJfY2FsbF9JRCwKKwkJCQkJICBnZnApOwogfQotRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfcmVqZWN0X2NhbGwpOworRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfY2hhcmdlX2FjY2VwdCk7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY2FsbF9ldmVudC5jIGIvbmV0L3J4cnBjL2NhbGxfZXZlbnQuYwppbmRleCBlNjBjZjY1Li40ZjAwNDc2IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvY2FsbF9ldmVudC5jCisrKyBiL25ldC9yeHJwYy9jYWxsX2V2ZW50LmMKQEAgLTIyLDEyODEgKzIyLDM1MSBAQAogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKIC8qCisgKiBTZXQgdGhlIHRpbWVyCisgKi8KK3ZvaWQgcnhycGNfc2V0X3RpbWVyKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBlbnVtIHJ4cnBjX3RpbWVyX3RyYWNlIHdoeSwKKwkJICAgICBrdGltZV90IG5vdykKK3sKKwl1bnNpZ25lZCBsb25nIHRfaiwgbm93X2ogPSBqaWZmaWVzOworCWt0aW1lX3QgdDsKKwlib29sIHF1ZXVlID0gZmFsc2U7CisKKwlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCisJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQl0ID0gY2FsbC0+ZXhwaXJlX2F0OworCQlpZiAoIWt0aW1lX2FmdGVyKHQsIG5vdykpCisJCQlnb3RvIG91dDsKKworCQlpZiAoIWt0aW1lX2FmdGVyKGNhbGwtPnJlc2VuZF9hdCwgbm93KSkgeworCQkJY2FsbC0+cmVzZW5kX2F0ID0gY2FsbC0+ZXhwaXJlX2F0OworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5ELCAmY2FsbC0+ZXZlbnRzKSkKKwkJCQlxdWV1ZSA9IHRydWU7CisJCX0gZWxzZSBpZiAoa3RpbWVfYmVmb3JlKGNhbGwtPnJlc2VuZF9hdCwgdCkpIHsKKwkJCXQgPSBjYWxsLT5yZXNlbmRfYXQ7CisJCX0KKworCQlpZiAoIWt0aW1lX2FmdGVyKGNhbGwtPmFja19hdCwgbm93KSkgeworCQkJY2FsbC0+YWNrX2F0ID0gY2FsbC0+ZXhwaXJlX2F0OworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfQUNLLCAmY2FsbC0+ZXZlbnRzKSkKKwkJCQlxdWV1ZSA9IHRydWU7CisJCX0gZWxzZSBpZiAoa3RpbWVfYmVmb3JlKGNhbGwtPmFja19hdCwgdCkpIHsKKwkJCXQgPSBjYWxsLT5hY2tfYXQ7CisJCX0KKworCQl0X2ogPSBuc2Vjc190b19qaWZmaWVzKGt0aW1lX3RvX25zKGt0aW1lX3N1Yih0LCBub3cpKSk7CisJCXRfaiArPSBqaWZmaWVzOworCisJCS8qIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNhbGN1bGF0ZWQgamlmZmllcyB2YWx1ZSBmYWxscworCQkgKiBhdCBvciBhZnRlciB0aGUgbnNlYyB2YWx1ZSwgb3Igd2UgbWF5IGxvb3AgY2Vhc2VsZXNzbHkKKwkJICogYmVjYXVzZSB0aGUgdGltZXIgdGltZXMgb3V0LCBidXQgd2UgaGF2ZW4ndCByZWFjaGVkIHRoZSBuc2VjCisJCSAqIHRpbWVvdXQgeWV0LgorCQkgKi8KKwkJdF9qKys7CisKKwkJaWYgKGNhbGwtPnRpbWVyLmV4cGlyZXMgIT0gdF9qIHx8ICF0aW1lcl9wZW5kaW5nKCZjYWxsLT50aW1lcikpIHsKKwkJCW1vZF90aW1lcigmY2FsbC0+dGltZXIsIHRfaik7CisJCQl0cmFjZV9yeHJwY190aW1lcihjYWxsLCB3aHksIG5vdywgbm93X2opOworCQl9CisKKwkJaWYgKHF1ZXVlKQorCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKKwl9CisKK291dDoKKwlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Cit9CisKKy8qCiAgKiBwcm9wb3NlIGFuIEFDSyBiZSBzZW50CiAgKi8KLXZvaWQgX19yeHJwY19wcm9wb3NlX0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTggYWNrX3JlYXNvbiwKLQkJCSB1MzIgc2VyaWFsLCBib29sIGltbWVkaWF0ZSkKK3N0YXRpYyB2b2lkIF9fcnhycGNfcHJvcG9zZV9BQ0soc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHU4IGFja19yZWFzb24sCisJCQkJdTE2IHNrZXcsIHUzMiBzZXJpYWwsIGJvb2wgaW1tZWRpYXRlLAorCQkJCWJvb2wgYmFja2dyb3VuZCwKKwkJCQllbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlIHdoeSkKIHsKLQl1bnNpZ25lZCBsb25nIGV4cGlyeTsKKwllbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX291dGNvbWUgb3V0Y29tZSA9IHJ4cnBjX3Byb3Bvc2VfYWNrX3VzZTsKKwl1bnNpZ25lZCBpbnQgZXhwaXJ5ID0gcnhycGNfc29mdF9hY2tfZGVsYXk7CisJa3RpbWVfdCBub3csIGFja19hdDsKIAlzOCBwcmlvciA9IHJ4cnBjX2Fja19wcmlvcml0eVthY2tfcmVhc29uXTsKIAotCUFTU0VSVENNUChwcmlvciwgPiwgMCk7Ci0KLQlfZW50ZXIoInslZH0sJXMsJSUleCwldSIsCi0JICAgICAgIGNhbGwtPmRlYnVnX2lkLCByeHJwY19hY2tzKGFja19yZWFzb24pLCBzZXJpYWwsIGltbWVkaWF0ZSk7Ci0KLQlpZiAocHJpb3IgPCByeHJwY19hY2tfcHJpb3JpdHlbY2FsbC0+YWNrcl9yZWFzb25dKSB7Ci0JCWlmIChpbW1lZGlhdGUpCi0JCQlnb3RvIGNhbmNlbF90aW1lcjsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHVwZGF0ZSBERUxBWSwgSURMRSwgUkVRVUVTVEVEIGFuZCBQSU5HX1JFU1BPTlNFIEFDSyBzZXJpYWwKLQkgKiBudW1iZXJzICovCi0JaWYgKHByaW9yID09IHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pIHsKLQkJaWYgKHByaW9yIDw9IDQpCisJLyogVXBkYXRlIERFTEFZLCBJRExFLCBSRVFVRVNURUQgYW5kIFBJTkdfUkVTUE9OU0UgQUNLIHNlcmlhbAorCSAqIG51bWJlcnMsIGJ1dCB3ZSBkb24ndCBhbHRlciB0aGUgdGltZW91dC4KKwkgKi8KKwlfZGVidWcoInByaW9yICV1ICV1IHZzICV1ICV1IiwKKwkgICAgICAgYWNrX3JlYXNvbiwgcHJpb3IsCisJICAgICAgIGNhbGwtPmFja3JfcmVhc29uLCByeHJwY19hY2tfcHJpb3JpdHlbY2FsbC0+YWNrcl9yZWFzb25dKTsKKwlpZiAoYWNrX3JlYXNvbiA9PSBjYWxsLT5hY2tyX3JlYXNvbikgeworCQlpZiAoUlhSUENfQUNLX1VQREFURUFCTEUgJiAoMSA8PCBhY2tfcmVhc29uKSkgeworCQkJb3V0Y29tZSA9IHJ4cnBjX3Byb3Bvc2VfYWNrX3VwZGF0ZTsKIAkJCWNhbGwtPmFja3Jfc2VyaWFsID0gc2VyaWFsOwotCQlpZiAoaW1tZWRpYXRlKQotCQkJZ290byBjYW5jZWxfdGltZXI7Ci0JCXJldHVybjsKKwkJCWNhbGwtPmFja3Jfc2tldyA9IHNrZXc7CisJCX0KKwkJaWYgKCFpbW1lZGlhdGUpCisJCQlnb3RvIHRyYWNlOworCX0gZWxzZSBpZiAocHJpb3IgPiByeHJwY19hY2tfcHJpb3JpdHlbY2FsbC0+YWNrcl9yZWFzb25dKSB7CisJCWNhbGwtPmFja3JfcmVhc29uID0gYWNrX3JlYXNvbjsKKwkJY2FsbC0+YWNrcl9zZXJpYWwgPSBzZXJpYWw7CisJCWNhbGwtPmFja3Jfc2tldyA9IHNrZXc7CisJfSBlbHNlIHsKKwkJb3V0Y29tZSA9IHJ4cnBjX3Byb3Bvc2VfYWNrX3N1YnN1bWU7CiAJfQogCi0JY2FsbC0+YWNrcl9yZWFzb24gPSBhY2tfcmVhc29uOwotCWNhbGwtPmFja3Jfc2VyaWFsID0gc2VyaWFsOwotCiAJc3dpdGNoIChhY2tfcmVhc29uKSB7Ci0JY2FzZSBSWFJQQ19BQ0tfREVMQVk6Ci0JCV9kZWJ1ZygicnVuIGRlbGF5IHRpbWVyIik7Ci0JCWV4cGlyeSA9IHJ4cnBjX3NvZnRfYWNrX2RlbGF5OwotCQlnb3RvIHJ1bl90aW1lcjsKLQotCWNhc2UgUlhSUENfQUNLX0lETEU6Ci0JCWlmICghaW1tZWRpYXRlKSB7Ci0JCQlfZGVidWcoInJ1biBkZWZlciB0aW1lciIpOwotCQkJZXhwaXJ5ID0gcnhycGNfaWRsZV9hY2tfZGVsYXk7Ci0JCQlnb3RvIHJ1bl90aW1lcjsKLQkJfQotCQlnb3RvIGNhbmNlbF90aW1lcjsKLQogCWNhc2UgUlhSUENfQUNLX1JFUVVFU1RFRDoKLQkJZXhwaXJ5ID0gcnhycGNfcmVxdWVzdGVkX2Fja19kZWxheTsKLQkJaWYgKCFleHBpcnkpCi0JCQlnb3RvIGNhbmNlbF90aW1lcjsKLQkJaWYgKCFpbW1lZGlhdGUgfHwgc2VyaWFsID09IDEpIHsKLQkJCV9kZWJ1ZygicnVuIGRlZmVyIHRpbWVyIik7Ci0JCQlnb3RvIHJ1bl90aW1lcjsKLQkJfQorCQlpZiAocnhycGNfcmVxdWVzdGVkX2Fja19kZWxheSA8IGV4cGlyeSkKKwkJCWV4cGlyeSA9IHJ4cnBjX3JlcXVlc3RlZF9hY2tfZGVsYXk7CisJCWlmIChzZXJpYWwgPT0gMSkKKwkJCWltbWVkaWF0ZSA9IGZhbHNlOworCQlicmVhazsKKworCWNhc2UgUlhSUENfQUNLX0RFTEFZOgorCQlpZiAocnhycGNfc29mdF9hY2tfZGVsYXkgPCBleHBpcnkpCisJCQlleHBpcnkgPSByeHJwY19zb2Z0X2Fja19kZWxheTsKKwkJYnJlYWs7CisKKwljYXNlIFJYUlBDX0FDS19QSU5HOgorCWNhc2UgUlhSUENfQUNLX0lETEU6CisJCWlmIChyeHJwY19pZGxlX2Fja19kZWxheSA8IGV4cGlyeSkKKwkJCWV4cGlyeSA9IHJ4cnBjX2lkbGVfYWNrX2RlbGF5OworCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCV9kZWJ1ZygiaW1tZWRpYXRlIEFDSyIpOwotCQlnb3RvIGNhbmNlbF90aW1lcjsKKwkJaW1tZWRpYXRlID0gdHJ1ZTsKKwkJYnJlYWs7CiAJfQogCi1ydW5fdGltZXI6Ci0JZXhwaXJ5ICs9IGppZmZpZXM7Ci0JaWYgKCF0aW1lcl9wZW5kaW5nKCZjYWxsLT5hY2tfdGltZXIpIHx8Ci0JICAgIHRpbWVfYWZ0ZXIoY2FsbC0+YWNrX3RpbWVyLmV4cGlyZXMsIGV4cGlyeSkpCi0JCW1vZF90aW1lcigmY2FsbC0+YWNrX3RpbWVyLCBleHBpcnkpOwotCXJldHVybjsKKwlpZiAodGVzdF9iaXQoUlhSUENfQ0FMTF9FVl9BQ0ssICZjYWxsLT5ldmVudHMpKSB7CisJCV9kZWJ1ZygiYWxyZWFkeSBzY2hlZHVsZWQiKTsKKwl9IGVsc2UgaWYgKGltbWVkaWF0ZSB8fCBleHBpcnkgPT0gMCkgeworCQlfZGVidWcoImltbWVkaWF0ZSBBQ0sgJWx4IiwgY2FsbC0+ZXZlbnRzKTsKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfQUNLLCAmY2FsbC0+ZXZlbnRzKSAmJgorCQkgICAgYmFja2dyb3VuZCkKKwkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJfSBlbHNlIHsKKwkJbm93ID0ga3RpbWVfZ2V0X3JlYWwoKTsKKwkJYWNrX2F0ID0ga3RpbWVfYWRkX21zKG5vdywgZXhwaXJ5KTsKKwkJaWYgKGt0aW1lX2JlZm9yZShhY2tfYXQsIGNhbGwtPmFja19hdCkpIHsKKwkJCWNhbGwtPmFja19hdCA9IGFja19hdDsKKwkJCXJ4cnBjX3NldF90aW1lcihjYWxsLCByeHJwY190aW1lcl9zZXRfZm9yX2Fjaywgbm93KTsKKwkJfQorCX0KIAotY2FuY2VsX3RpbWVyOgotCV9kZWJ1ZygiY2FuY2VsIHRpbWVyICUlJXUiLCBzZXJpYWwpOwotCXRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKLQlyZWFkX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA8PSBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCi0JICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfQUNLLCAmY2FsbC0+ZXZlbnRzKSkKLQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQlyZWFkX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Cit0cmFjZToKKwl0cmFjZV9yeHJwY19wcm9wb3NlX2FjayhjYWxsLCB3aHksIGFja19yZWFzb24sIHNlcmlhbCwgaW1tZWRpYXRlLAorCQkJCWJhY2tncm91bmQsIG91dGNvbWUpOwogfQogCiAvKgogICogcHJvcG9zZSBhbiBBQ0sgYmUgc2VudCwgbG9ja2luZyB0aGUgY2FsbCBzdHJ1Y3R1cmUKICAqLwogdm9pZCByeHJwY19wcm9wb3NlX0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTggYWNrX3JlYXNvbiwKLQkJICAgICAgIHUzMiBzZXJpYWwsIGJvb2wgaW1tZWRpYXRlKQorCQkgICAgICAgdTE2IHNrZXcsIHUzMiBzZXJpYWwsIGJvb2wgaW1tZWRpYXRlLCBib29sIGJhY2tncm91bmQsCisJCSAgICAgICBlbnVtIHJ4cnBjX3Byb3Bvc2VfYWNrX3RyYWNlIHdoeSkKIHsKLQlzOCBwcmlvciA9IHJ4cnBjX2Fja19wcmlvcml0eVthY2tfcmVhc29uXTsKLQotCWlmIChwcmlvciA+IHJ4cnBjX2Fja19wcmlvcml0eVtjYWxsLT5hY2tyX3JlYXNvbl0pIHsKLQkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQkJX19yeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBhY2tfcmVhc29uLCBzZXJpYWwsIGltbWVkaWF0ZSk7Ci0JCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQl9CisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwlfX3J4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIGFja19yZWFzb24sIHNrZXcsIHNlcmlhbCwKKwkJCSAgICBpbW1lZGlhdGUsIGJhY2tncm91bmQsIHdoeSk7CisJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwogfQogCiAvKgotICogc2V0IHRoZSByZXNlbmQgdGltZXIKKyAqIEhhbmRsZSBjb25nZXN0aW9uIGJlaW5nIGRldGVjdGVkIGJ5IHRoZSByZXRyYW5zbWl0IHRpbWVvdXQuCiAgKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3NldF9yZXNlbmQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHU4IHJlc2VuZCwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyByZXNlbmRfYXQpCitzdGF0aWMgdm9pZCByeHJwY19jb25nZXN0aW9uX3RpbWVvdXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCiB7Ci0JcmVhZF9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJcmVzZW5kID0gMDsKLQotCWlmIChyZXNlbmQgJiAxKSB7Ci0JCV9kZWJ1ZygiU0VUIFJFU0VORCIpOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5ELCAmY2FsbC0+ZXZlbnRzKTsKLQl9Ci0KLQlpZiAocmVzZW5kICYgMikgewotCQlfZGVidWcoIk1PRElGWSBSRVNFTkQgVElNRVIiKTsKLQkJc2V0X2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7Ci0JCW1vZF90aW1lcigmY2FsbC0+cmVzZW5kX3RpbWVyLCByZXNlbmRfYXQpOwotCX0gZWxzZSB7Ci0JCV9kZWJ1ZygiS0lMTCBSRVNFTkQgVElNRVIiKTsKLQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPnJlc2VuZF90aW1lcik7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7Ci0JfQotCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwlzZXRfYml0KFJYUlBDX0NBTExfUkVUUkFOU19USU1FT1VULCAmY2FsbC0+ZmxhZ3MpOwogfQogCiAvKgotICogcmVzZW5kIHBhY2tldHMKKyAqIFBlcmZvcm0gcmV0cmFuc21pc3Npb24gb2YgTkFLJ2QgYW5kIHVuYWNrJ2QgcGFja2V0cy4KICAqLwotc3RhdGljIHZvaWQgcnhycGNfcmVzZW5kKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQorc3RhdGljIHZvaWQgcnhycGNfcmVzZW5kKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBrdGltZV90IG5vdykKIHsKLQlzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIgKndoZHI7CiAJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqdHhiOwotCXVuc2lnbmVkIGxvbmcgKnBfdHhiLCByZXNlbmRfYXQ7Ci0JYm9vbCBzdG9wOwotCWludCBsb29wOwotCXU4IHJlc2VuZDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXJ4cnBjX3NlcV90IGN1cnNvciwgc2VxLCB0b3A7CisJa3RpbWVfdCBtYXhfYWdlLCBvbGRlc3QsIGFja190czsKKwlpbnQgaXg7CisJdTggYW5ub3RhdGlvbiwgYW5ub190eXBlLCByZXRyYW5zID0gMCwgdW5hY2tlZCA9IDA7CiAKLQlfZW50ZXIoInslZCwlZCwlZCwlZH0sIiwKLQkgICAgICAgY2FsbC0+YWNrc19oYXJkLCBjYWxsLT5hY2tzX3VuYWNrZWQsCi0JICAgICAgIGF0b21pY19yZWFkKCZjYWxsLT5zZXF1ZW5jZSksCi0JICAgICAgIENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLCBjYWxsLT5hY2tzX3dpbnN6KSk7CisJX2VudGVyKCJ7JWQsJWR9IiwgY2FsbC0+dHhfaGFyZF9hY2ssIGNhbGwtPnR4X3RvcCk7CiAKLQlzdG9wID0gZmFsc2U7Ci0JcmVzZW5kID0gMDsKLQlyZXNlbmRfYXQgPSAwOworCW1heF9hZ2UgPSBrdGltZV9zdWJfbXMobm93LCByeHJwY19yZXNlbmRfdGltZW91dCk7CiAKLQlmb3IgKGxvb3AgPSBjYWxsLT5hY2tzX3RhaWw7Ci0JICAgICBsb29wICE9IGNhbGwtPmFja3NfaGVhZCB8fCBzdG9wOwotCSAgICAgbG9vcCA9IChsb29wICsgMSkgJiAgKGNhbGwtPmFja3Nfd2luc3ogLSAxKQotCSAgICAgKSB7Ci0JCXBfdHhiID0gY2FsbC0+YWNrc193aW5kb3cgKyBsb29wOwotCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKLQkJaWYgKCpwX3R4YiAmIDEpCisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCWN1cnNvciA9IGNhbGwtPnR4X2hhcmRfYWNrOworCXRvcCA9IGNhbGwtPnR4X3RvcDsKKwlBU1NFUlQoYmVmb3JlX2VxKGN1cnNvciwgdG9wKSk7CisJaWYgKGN1cnNvciA9PSB0b3ApCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qIFNjYW4gdGhlIHBhY2tldCBsaXN0IHdpdGhvdXQgZHJvcHBpbmcgdGhlIGxvY2sgYW5kIGRlY2lkZSB3aGljaCBvZgorCSAqIHRoZSBwYWNrZXRzIGluIHRoZSBUeCBidWZmZXIgd2UncmUgZ29pbmcgdG8gcmVzZW5kIGFuZCB3aGF0IHRoZSBuZXcKKwkgKiByZXNlbmQgdGltZW91dCB3aWxsIGJlLgorCSAqLworCW9sZGVzdCA9IG5vdzsKKwlmb3IgKHNlcSA9IGN1cnNvciArIDE7IGJlZm9yZV9lcShzZXEsIHRvcCk7IHNlcSsrKSB7CisJCWl4ID0gc2VxICYgUlhSUENfUlhUWF9CVUZGX01BU0s7CisJCWFubm90YXRpb24gPSBjYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XTsKKwkJYW5ub190eXBlID0gYW5ub3RhdGlvbiAmIFJYUlBDX1RYX0FOTk9fTUFTSzsKKwkJYW5ub3RhdGlvbiAmPSB+UlhSUENfVFhfQU5OT19NQVNLOworCQlpZiAoYW5ub190eXBlID09IFJYUlBDX1RYX0FOTk9fQUNLKQogCQkJY29udGludWU7CiAKLQkJdHhiID0gKHN0cnVjdCBza19idWZmICopICpwX3R4YjsKLQkJc3AgPSByeHJwY19za2IodHhiKTsKKwkJc2tiID0gY2FsbC0+cnh0eF9idWZmZXJbaXhdOworCQlyeHJwY19zZWVfc2tiKHNrYiwgcnhycGNfc2tiX3R4X3NlZW4pOworCQlzcCA9IHJ4cnBjX3NrYihza2IpOwogCi0JCWlmIChzcC0+bmVlZF9yZXNlbmQpIHsKLQkJCXNwLT5uZWVkX3Jlc2VuZCA9IGZhbHNlOwotCi0JCQkvKiBlYWNoIFR4IHBhY2tldCBoYXMgYSBuZXcgc2VyaWFsIG51bWJlciAqLwotCQkJc3AtPmhkci5zZXJpYWwgPSBhdG9taWNfaW5jX3JldHVybigmY2FsbC0+Y29ubi0+c2VyaWFsKTsKLQotCQkJd2hkciA9IChzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIgKil0eGItPmhlYWQ7Ci0JCQl3aGRyLT5zZXJpYWwgPSBodG9ubChzcC0+aGRyLnNlcmlhbCk7Ci0KLQkJCV9wcm90bygiVHggREFUQSAlJSV1IHsgIyVkIH0iLAotCQkJICAgICAgIHNwLT5oZHIuc2VyaWFsLCBzcC0+aGRyLnNlcSk7Ci0JCQlpZiAocnhycGNfc2VuZF9kYXRhX3BhY2tldChjYWxsLT5jb25uLCB0eGIpIDwgMCkgewotCQkJCXN0b3AgPSB0cnVlOwotCQkJCXNwLT5yZXNlbmRfYXQgPSBqaWZmaWVzICsgMzsKLQkJCX0gZWxzZSB7Ci0JCQkJc3AtPnJlc2VuZF9hdCA9Ci0JCQkJCWppZmZpZXMgKyByeHJwY19yZXNlbmRfdGltZW91dDsKKwkJaWYgKGFubm9fdHlwZSA9PSBSWFJQQ19UWF9BTk5PX1VOQUNLKSB7CisJCQlpZiAoa3RpbWVfYWZ0ZXIoc2tiLT50c3RhbXAsIG1heF9hZ2UpKSB7CisJCQkJaWYgKGt0aW1lX2JlZm9yZShza2ItPnRzdGFtcCwgb2xkZXN0KSkKKwkJCQkJb2xkZXN0ID0gc2tiLT50c3RhbXA7CisJCQkJY29udGludWU7CiAJCQl9CisJCQlpZiAoIShhbm5vdGF0aW9uICYgUlhSUENfVFhfQU5OT19SRVNFTlQpKQorCQkJCXVuYWNrZWQrKzsKIAkJfQogCi0JCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMgKyAxLCBzcC0+cmVzZW5kX2F0KSkgewotCQkJc3AtPm5lZWRfcmVzZW5kID0gdHJ1ZTsKLQkJCXJlc2VuZCB8PSAxOwotCQl9IGVsc2UgaWYgKHJlc2VuZCAmIDIpIHsKLQkJCWlmICh0aW1lX2JlZm9yZShzcC0+cmVzZW5kX2F0LCByZXNlbmRfYXQpKQotCQkJCXJlc2VuZF9hdCA9IHNwLT5yZXNlbmRfYXQ7Ci0JCX0gZWxzZSB7Ci0JCQlyZXNlbmRfYXQgPSBzcC0+cmVzZW5kX2F0OwotCQkJcmVzZW5kIHw9IDI7Ci0JCX0KKwkJLyogT2theSwgd2UgbmVlZCB0byByZXRyYW5zbWl0IGEgcGFja2V0LiAqLworCQljYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSA9IFJYUlBDX1RYX0FOTk9fUkVUUkFOUyB8IGFubm90YXRpb247CisJCXJldHJhbnMrKzsKKwkJdHJhY2VfcnhycGNfcmV0cmFuc21pdChjYWxsLCBzZXEsIGFubm90YXRpb24gfCBhbm5vX3R5cGUsCisJCQkJICAgICAgIGt0aW1lX3RvX25zKGt0aW1lX3N1Yihza2ItPnRzdGFtcCwgbWF4X2FnZSkpKTsKIAl9CiAKLQlyeHJwY19zZXRfcmVzZW5kKGNhbGwsIHJlc2VuZCwgcmVzZW5kX2F0KTsKKwljYWxsLT5yZXNlbmRfYXQgPSBrdGltZV9hZGRfbXMob2xkZXN0LCByeHJwY19yZXNlbmRfdGltZW91dCk7CisKKwlpZiAodW5hY2tlZCkKKwkJcnhycGNfY29uZ2VzdGlvbl90aW1lb3V0KGNhbGwpOworCisJLyogSWYgdGhlcmUgd2FzIG5vdGhpbmcgdGhhdCBuZWVkZWQgcmV0cmFuc21pc3Npb24gdGhlbiBpdCdzIGxpa2VseQorCSAqIHRoYXQgYW4gQUNLIGdvdCBsb3N0IHNvbWV3aGVyZS4gIFNlbmQgYSBwaW5nIHRvIGZpbmQgb3V0IGluc3RlYWQgb2YKKwkgKiByZXRyYW5zbWl0dGluZyBkYXRhLgorCSAqLworCWlmICghcmV0cmFucykgeworCQlyeHJwY19zZXRfdGltZXIoY2FsbCwgcnhycGNfdGltZXJfc2V0X2Zvcl9yZXNlbmQsIG5vdyk7CisJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJYWNrX3RzID0ga3RpbWVfc3ViKG5vdywgY2FsbC0+YWNrc19sYXRlc3RfdHMpOworCQlpZiAoa3RpbWVfdG9fbnMoYWNrX3RzKSA8IGNhbGwtPnBlZXItPnJ0dCkKKwkJCWdvdG8gb3V0OworCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfUElORywgMCwgMCwgdHJ1ZSwgZmFsc2UsCisJCQkJICByeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9sb3N0X2Fjayk7CisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUNLKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogTm93IGdvIHRocm91Z2ggdGhlIFR4IHdpbmRvdyBhbmQgcGVyZm9ybSB0aGUgcmV0cmFuc21pc3Npb25zLiAgV2UKKwkgKiBoYXZlIHRvIGRyb3AgdGhlIGxvY2sgZm9yIGVhY2ggc2VuZC4gIElmIGFuIEFDSyBjb21lcyBpbiB3aGlsc3QgdGhlCisJICogbG9jayBpcyBkcm9wcGVkLCBpdCBtYXkgY2xlYXIgc29tZSBvZiB0aGUgcmV0cmFuc21pc3Npb24gbWFya2VycyBmb3IKKwkgKiBwYWNrZXRzIHRoYXQgaXQgc29mdC1BQ0tzLgorCSAqLworCWZvciAoc2VxID0gY3Vyc29yICsgMTsgYmVmb3JlX2VxKHNlcSwgdG9wKTsgc2VxKyspIHsKKwkJaXggPSBzZXEgJiBSWFJQQ19SWFRYX0JVRkZfTUFTSzsKKwkJYW5ub3RhdGlvbiA9IGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdOworCQlhbm5vX3R5cGUgPSBhbm5vdGF0aW9uICYgUlhSUENfVFhfQU5OT19NQVNLOworCQlpZiAoYW5ub190eXBlICE9IFJYUlBDX1RYX0FOTk9fUkVUUkFOUykKKwkJCWNvbnRpbnVlOworCisJCXNrYiA9IGNhbGwtPnJ4dHhfYnVmZmVyW2l4XTsKKwkJcnhycGNfZ2V0X3NrYihza2IsIHJ4cnBjX3NrYl90eF9nb3QpOworCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwkJaWYgKHJ4cnBjX3NlbmRfZGF0YV9wYWNrZXQoY2FsbCwgc2tiLCB0cnVlKSA8IDApIHsKKwkJCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3R4X2ZyZWVkKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChyeHJwY19pc19jbGllbnRfY2FsbChjYWxsKSkKKwkJCXJ4cnBjX2V4cG9zZV9jbGllbnRfY2FsbChjYWxsKTsKKworCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl90eF9mcmVlZCk7CisJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisKKwkJLyogV2UgbmVlZCB0byBjbGVhciB0aGUgcmV0cmFuc21pdCBzdGF0ZSwgYnV0IHRoZXJlIGFyZSB0d28KKwkJICogdGhpbmdzIHdlIG5lZWQgdG8gYmUgYXdhcmUgb2Y6IEEgbmV3IEFDSy9OQUsgbWlnaHQgaGF2ZSBiZWVuCisJCSAqIHJlY2VpdmVkIGFuZCB0aGUgcGFja2V0IG1pZ2h0IGhhdmUgYmVlbiBoYXJkLUFDSydkIChpbiB3aGljaAorCQkgKiBjYXNlIGl0IHdpbGwgbm8gbG9uZ2VyIGJlIGluIHRoZSBidWZmZXIpLgorCQkgKi8KKwkJaWYgKGFmdGVyKHNlcSwgY2FsbC0+dHhfaGFyZF9hY2spKSB7CisJCQlhbm5vdGF0aW9uID0gY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF07CisJCQlhbm5vX3R5cGUgPSBhbm5vdGF0aW9uICYgUlhSUENfVFhfQU5OT19NQVNLOworCQkJaWYgKGFubm9fdHlwZSA9PSBSWFJQQ19UWF9BTk5PX1JFVFJBTlMgfHwKKwkJCSAgICBhbm5vX3R5cGUgPT0gUlhSUENfVFhfQU5OT19OQUspIHsKKwkJCQlhbm5vdGF0aW9uICY9IH5SWFJQQ19UWF9BTk5PX01BU0s7CisJCQkJYW5ub3RhdGlvbiB8PSBSWFJQQ19UWF9BTk5PX1VOQUNLOworCQkJfQorCQkJYW5ub3RhdGlvbiB8PSBSWFJQQ19UWF9BTk5PX1JFU0VOVDsKKwkJCWNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdID0gYW5ub3RhdGlvbjsKKwkJfQorCisJCWlmIChhZnRlcihjYWxsLT50eF9oYXJkX2Fjaywgc2VxKSkKKwkJCXNlcSA9IGNhbGwtPnR4X2hhcmRfYWNrOworCX0KKworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CitvdXQ6CiAJX2xlYXZlKCIiKTsKIH0KIAogLyoKLSAqIGhhbmRsZSByZXNlbmQgdGltZXIgZXhwaXJ5Ci0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3Jlc2VuZF90aW1lcihzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCBza19idWZmICp0eGI7Ci0JdW5zaWduZWQgbG9uZyAqcF90eGIsIHJlc2VuZF9hdDsKLQlpbnQgbG9vcDsKLQl1OCByZXNlbmQ7Ci0KLQlfZW50ZXIoIiVkLCVkLCVkIiwKLQkgICAgICAgY2FsbC0+YWNrc190YWlsLCBjYWxsLT5hY2tzX3VuYWNrZWQsIGNhbGwtPmFja3NfaGVhZCk7Ci0KLQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJcmV0dXJuOwotCi0JcmVzZW5kID0gMDsKLQlyZXNlbmRfYXQgPSAwOwotCi0JZm9yIChsb29wID0gY2FsbC0+YWNrc191bmFja2VkOwotCSAgICAgbG9vcCAhPSBjYWxsLT5hY2tzX2hlYWQ7Ci0JICAgICBsb29wID0gKGxvb3AgKyAxKSAmICAoY2FsbC0+YWNrc193aW5zeiAtIDEpCi0JICAgICApIHsKLQkJcF90eGIgPSBjYWxsLT5hY2tzX3dpbmRvdyArIGxvb3A7Ci0JCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotCQl0eGIgPSAoc3RydWN0IHNrX2J1ZmYgKikgKCpwX3R4YiAmIH4xKTsKLQkJc3AgPSByeHJwY19za2IodHhiKTsKLQotCQlBU1NFUlQoISgqcF90eGIgJiAxKSk7Ci0KLQkJaWYgKHNwLT5uZWVkX3Jlc2VuZCkgewotCQkJOwotCQl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcyArIDEsIHNwLT5yZXNlbmRfYXQpKSB7Ci0JCQlzcC0+bmVlZF9yZXNlbmQgPSB0cnVlOwotCQkJcmVzZW5kIHw9IDE7Ci0JCX0gZWxzZSBpZiAocmVzZW5kICYgMikgewotCQkJaWYgKHRpbWVfYmVmb3JlKHNwLT5yZXNlbmRfYXQsIHJlc2VuZF9hdCkpCi0JCQkJcmVzZW5kX2F0ID0gc3AtPnJlc2VuZF9hdDsKLQkJfSBlbHNlIHsKLQkJCXJlc2VuZF9hdCA9IHNwLT5yZXNlbmRfYXQ7Ci0JCQlyZXNlbmQgfD0gMjsKLQkJfQotCX0KLQotCXJ4cnBjX3NldF9yZXNlbmQoY2FsbCwgcmVzZW5kLCByZXNlbmRfYXQpOwotCV9sZWF2ZSgiIik7Ci19Ci0KLS8qCi0gKiBwcm9jZXNzIHNvZnQgQUNLcyBvZiBvdXIgdHJhbnNtaXR0ZWQgcGFja2V0cwotICogLSB0aGVzZSBpbmRpY2F0ZSBwYWNrZXRzIHRoZSBwZWVyIGhhcyBvciBoYXMgbm90IHJlY2VpdmVkLCBidXQgaGFzbid0IHlldAotICogICBnaXZlbiB0byB0aGUgY29uc3VtZXIsIGFuZCBzbyBjYW4gc3RpbGwgYmUgZGlzY2FyZGVkIGFuZCByZS1yZXF1ZXN0ZWQKLSAqLwotc3RhdGljIGludCByeHJwY19wcm9jZXNzX3NvZnRfQUNLcyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJCQkgICBzdHJ1Y3QgcnhycGNfYWNrcGFja2V0ICphY2ssCi0JCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwotCXN0cnVjdCBza19idWZmICp0eGI7Ci0JdW5zaWduZWQgbG9uZyAqcF90eGIsIHJlc2VuZF9hdDsKLQlpbnQgbG9vcDsKLQl1OCBzYWNrc1tSWFJQQ19NQVhBQ0tTXSwgcmVzZW5kOwotCi0JX2VudGVyKCJ7JWQsJWR9LHslZH0sIiwKLQkgICAgICAgY2FsbC0+YWNrc19oYXJkLAotCSAgICAgICBDSVJDX0NOVChjYWxsLT5hY2tzX2hlYWQsIGNhbGwtPmFja3NfdGFpbCwgY2FsbC0+YWNrc193aW5zeiksCi0JICAgICAgIGFjay0+bkFja3MpOwotCi0JaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCBzYWNrcywgYWNrLT5uQWNrcykgPCAwKQotCQlnb3RvIHByb3RvY29sX2Vycm9yOwotCi0JcmVzZW5kID0gMDsKLQlyZXNlbmRfYXQgPSAwOwotCWZvciAobG9vcCA9IDA7IGxvb3AgPCBhY2stPm5BY2tzOyBsb29wKyspIHsKLQkJcF90eGIgPSBjYWxsLT5hY2tzX3dpbmRvdzsKLQkJcF90eGIgKz0gKGNhbGwtPmFja3NfdGFpbCArIGxvb3ApICYgKGNhbGwtPmFja3Nfd2luc3ogLSAxKTsKLQkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7Ci0JCXR4YiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAoKnBfdHhiICYgfjEpOwotCQlzcCA9IHJ4cnBjX3NrYih0eGIpOwotCi0JCXN3aXRjaCAoc2Fja3NbbG9vcF0pIHsKLQkJY2FzZSBSWFJQQ19BQ0tfVFlQRV9BQ0s6Ci0JCQlzcC0+bmVlZF9yZXNlbmQgPSBmYWxzZTsKLQkJCSpwX3R4YiB8PSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlhSUENfQUNLX1RZUEVfTkFDSzoKLQkJCXNwLT5uZWVkX3Jlc2VuZCA9IHRydWU7Ci0JCQkqcF90eGIgJj0gfjE7Ci0JCQlyZXNlbmQgPSAxOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlfZGVidWcoIlVuc3VwcG9ydGVkIEFDSyB0eXBlICVkIiwgc2Fja3NbbG9vcF0pOwotCQkJZ290byBwcm90b2NvbF9lcnJvcjsKLQkJfQotCX0KLQotCXNtcF9tYigpOwotCWNhbGwtPmFja3NfdW5hY2tlZCA9IChjYWxsLT5hY2tzX3RhaWwgKyBsb29wKSAmIChjYWxsLT5hY2tzX3dpbnN6IC0gMSk7Ci0KLQkvKiBhbnl0aGluZyBub3QgZXhwbGljaXRseSBBQ0snZCBpcyBpbXBsaWNpdGx5IE5BQ0snZCwgYnV0IG1heSBqdXN0IG5vdAotCSAqIGhhdmUgYmVlbiByZWNlaXZlZCBvciBwcm9jZXNzZWQgeWV0IGJ5IHRoZSBmYXIgZW5kICovCi0JZm9yIChsb29wID0gY2FsbC0+YWNrc191bmFja2VkOwotCSAgICAgbG9vcCAhPSBjYWxsLT5hY2tzX2hlYWQ7Ci0JICAgICBsb29wID0gKGxvb3AgKyAxKSAmICAoY2FsbC0+YWNrc193aW5zeiAtIDEpCi0JICAgICApIHsKLQkJcF90eGIgPSBjYWxsLT5hY2tzX3dpbmRvdyArIGxvb3A7Ci0JCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOwotCQl0eGIgPSAoc3RydWN0IHNrX2J1ZmYgKikgKCpwX3R4YiAmIH4xKTsKLQkJc3AgPSByeHJwY19za2IodHhiKTsKLQotCQlpZiAoKnBfdHhiICYgMSkgewotCQkJLyogcGFja2V0IG11c3QgaGF2ZSBiZWVuIGRpc2NhcmRlZCAqLwotCQkJc3AtPm5lZWRfcmVzZW5kID0gdHJ1ZTsKLQkJCSpwX3R4YiAmPSB+MTsKLQkJCXJlc2VuZCB8PSAxOwotCQl9IGVsc2UgaWYgKHNwLT5uZWVkX3Jlc2VuZCkgewotCQkJOwotCQl9IGVsc2UgaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcyArIDEsIHNwLT5yZXNlbmRfYXQpKSB7Ci0JCQlzcC0+bmVlZF9yZXNlbmQgPSB0cnVlOwotCQkJcmVzZW5kIHw9IDE7Ci0JCX0gZWxzZSBpZiAocmVzZW5kICYgMikgewotCQkJaWYgKHRpbWVfYmVmb3JlKHNwLT5yZXNlbmRfYXQsIHJlc2VuZF9hdCkpCi0JCQkJcmVzZW5kX2F0ID0gc3AtPnJlc2VuZF9hdDsKLQkJfSBlbHNlIHsKLQkJCXJlc2VuZF9hdCA9IHNwLT5yZXNlbmRfYXQ7Ci0JCQlyZXNlbmQgfD0gMjsKLQkJfQotCX0KLQotCXJ4cnBjX3NldF9yZXNlbmQoY2FsbCwgcmVzZW5kLCByZXNlbmRfYXQpOwotCV9sZWF2ZSgiID0gMCIpOwotCXJldHVybiAwOwotCi1wcm90b2NvbF9lcnJvcjoKLQlfbGVhdmUoIiA9IC1FUFJPVE8iKTsKLQlyZXR1cm4gLUVQUk9UTzsKLX0KLQotLyoKLSAqIGRpc2NhcmQgaGFyZC1BQ0snZCBwYWNrZXRzIGZyb20gdGhlIFR4IHdpbmRvdwotICovCi1zdGF0aWMgdm9pZCByeHJwY19yb3RhdGVfdHhfd2luZG93KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCB1MzIgaGFyZCkKLXsKLQl1bnNpZ25lZCBsb25nIF9za2I7Ci0JaW50IHRhaWwgPSBjYWxsLT5hY2tzX3RhaWwsIG9sZF90YWlsOwotCWludCB3aW4gPSBDSVJDX0NOVChjYWxsLT5hY2tzX2hlYWQsIHRhaWwsIGNhbGwtPmFja3Nfd2luc3opOwotCi0JX2VudGVyKCJ7JXUsJXV9LCV1IiwgY2FsbC0+YWNrc19oYXJkLCB3aW4sIGhhcmQpOwotCi0JQVNTRVJUQ01QKGhhcmQgLSBjYWxsLT5hY2tzX2hhcmQsIDw9LCB3aW4pOwotCi0Jd2hpbGUgKGNhbGwtPmFja3NfaGFyZCA8IGhhcmQpIHsKLQkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7Ci0JCV9za2IgPSBjYWxsLT5hY2tzX3dpbmRvd1t0YWlsXSAmIH4xOwotCQlyeHJwY19mcmVlX3NrYigoc3RydWN0IHNrX2J1ZmYgKikgX3NrYik7Ci0JCW9sZF90YWlsID0gdGFpbDsKLQkJdGFpbCA9ICh0YWlsICsgMSkgJiAoY2FsbC0+YWNrc193aW5zeiAtIDEpOwotCQljYWxsLT5hY2tzX3RhaWwgPSB0YWlsOwotCQlpZiAoY2FsbC0+YWNrc191bmFja2VkID09IG9sZF90YWlsKQotCQkJY2FsbC0+YWNrc191bmFja2VkID0gdGFpbDsKLQkJY2FsbC0+YWNrc19oYXJkKys7Ci0JfQotCi0Jd2FrZV91cCgmY2FsbC0+dHhfd2FpdHEpOwotfQotCi0vKgotICogY2xlYXIgdGhlIFR4IHdpbmRvdyBpbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2NsZWFyX3R4X3dpbmRvdyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKLXsKLQlyeHJwY19yb3RhdGVfdHhfd2luZG93KGNhbGwsIGF0b21pY19yZWFkKCZjYWxsLT5zZXF1ZW5jZSkpOwotfQotCi0vKgotICogZHJhaW4gdGhlIG91dCBvZiBzZXF1ZW5jZSByZWNlaXZlZCBwYWNrZXQgcXVldWUgaW50byB0aGUgcGFja2V0IFJ4IHF1ZXVlCi0gKi8KLXN0YXRpYyBpbnQgcnhycGNfZHJhaW5fcnhfb29zX3F1ZXVlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlib29sIHRlcm1pbmFsOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoInslZCwlZH0iLCBjYWxsLT5yeF9kYXRhX3Bvc3QsIGNhbGwtPnJ4X2ZpcnN0X29vcyk7Ci0KLQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCi0JcmV0ID0gLUVDT05OUkVTRVQ7Ci0JaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfUkVMRUFTRUQsICZjYWxsLT5mbGFncykpCi0JCWdvdG8gc29ja2V0X3VuYXZhaWxhYmxlOwotCi0Jc2tiID0gc2tiX2RlcXVldWUoJmNhbGwtPnJ4X29vc19xdWV1ZSk7Ci0JaWYgKHNrYikgewotCQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCi0JCV9kZWJ1ZygiZHJhaW4gT09TIHBhY2tldCAlZCBbJWRdIiwKLQkJICAgICAgIHNwLT5oZHIuc2VxLCBjYWxsLT5yeF9maXJzdF9vb3MpOwotCi0JCWlmIChzcC0+aGRyLnNlcSAhPSBjYWxsLT5yeF9maXJzdF9vb3MpIHsKLQkJCXNrYl9xdWV1ZV9oZWFkKCZjYWxsLT5yeF9vb3NfcXVldWUsIHNrYik7Ci0JCQljYWxsLT5yeF9maXJzdF9vb3MgPSByeHJwY19za2Ioc2tiKS0+aGRyLnNlcTsKLQkJCV9kZWJ1ZygicmVxdWV1ZSAlcCB7JXV9Iiwgc2tiLCBjYWxsLT5yeF9maXJzdF9vb3MpOwotCQl9IGVsc2UgewotCQkJc2tiLT5tYXJrID0gUlhSUENfU0tCX01BUktfREFUQTsKLQkJCXRlcm1pbmFsID0gKChzcC0+aGRyLmZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQpICYmCi0JCQkJIShzcC0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCkpOwotCQkJcmV0ID0gcnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBza2IsIHRydWUsIHRlcm1pbmFsKTsKLQkJCUJVR19PTihyZXQgPCAwKTsKLQkJCV9kZWJ1ZygiZHJhaW4gIyV1IiwgY2FsbC0+cnhfZGF0YV9wb3N0KTsKLQkJCWNhbGwtPnJ4X2RhdGFfcG9zdCsrOwotCi0JCQkvKiBmaW5kIG91dCB3aGF0IHRoZSBuZXh0IHBhY2tldCBpcyAqLwotCQkJc2tiID0gc2tiX3BlZWsoJmNhbGwtPnJ4X29vc19xdWV1ZSk7Ci0JCQlpZiAoc2tiKQotCQkJCWNhbGwtPnJ4X2ZpcnN0X29vcyA9IHJ4cnBjX3NrYihza2IpLT5oZHIuc2VxOwotCQkJZWxzZQotCQkJCWNhbGwtPnJ4X2ZpcnN0X29vcyA9IDA7Ci0JCQlfZGVidWcoInBlZWsgJXAgeyV1fSIsIHNrYiwgY2FsbC0+cnhfZmlyc3Rfb29zKTsKLQkJfQotCX0KLQotCXJldCA9IDA7Ci1zb2NrZXRfdW5hdmFpbGFibGU6Ci0Jc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBpbnNlcnQgYW4gb3V0IG9mIHNlcXVlbmNlIHBhY2tldCBpbnRvIHRoZSBidWZmZXIKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfaW5zZXJ0X29vc19wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCwgKnBzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcDsKLQl1MzIgc2VxOwotCi0Jc3AgPSByeHJwY19za2Ioc2tiKTsKLQlzZXEgPSBzcC0+aGRyLnNlcTsKLQlfZW50ZXIoIiwseyV1fSIsIHNlcSk7Ci0KLQlza2ItPmRlc3RydWN0b3IgPSByeHJwY19wYWNrZXRfZGVzdHJ1Y3RvcjsKLQlBU1NFUlRDTVAoc3AtPmNhbGwsID09LCBOVUxMKTsKLQlzcC0+Y2FsbCA9IGNhbGw7Ci0JcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0JYXRvbWljX2luYygmY2FsbC0+c2tiX2NvdW50KTsKLQotCS8qIGluc2VydCBpbnRvIHRoZSBidWZmZXIgaW4gc2VxdWVuY2Ugb3JkZXIgKi8KLQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCi0Jc2tiX3F1ZXVlX3dhbGsoJmNhbGwtPnJ4X29vc19xdWV1ZSwgcCkgewotCQlwc3AgPSByeHJwY19za2IocCk7Ci0JCWlmIChwc3AtPmhkci5zZXEgPiBzZXEpIHsKLQkJCV9kZWJ1ZygiaW5zZXJ0IG9vcyAjJXUgYmVmb3JlICMldSIsIHNlcSwgcHNwLT5oZHIuc2VxKTsKLQkJCXNrYl9pbnNlcnQocCwgc2tiLCAmY2FsbC0+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+Y2FsbCA9IGNhbGw7Ci0JCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQlhdG9taWNfaW5jKCZjYWxsLT5za2JfY291bnQpOwotCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCQlpZiAocnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBza2IsIHRydWUsIHRydWUpIDwgMCkKLQkJCUJVRygpOwotCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7Ci0JCWdvdG8gcHJvY2Vzc19mdXJ0aGVyOwotCX0KLQotZGlzY2FyZDoKLQlyeHJwY19mcmVlX3NrYihza2IpOwotCWdvdG8gcHJvY2Vzc19mdXJ0aGVyOwotCi1wcm90b2NvbF9lcnJvcl91bmxvY2s6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLXByb3RvY29sX2Vycm9yOgotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JX2xlYXZlKCIgPSAtRVBST1RPIik7Ci0JcmV0dXJuIC1FUFJPVE87Ci19Ci0KLS8qCi0gKiBwb3N0IGEgbWVzc2FnZSB0byB0aGUgc29ja2V0IFJ4IHF1ZXVlIGZvciByZWN2bXNnKCkgdG8gcGljayB1cAotICovCi1zdGF0aWMgaW50IHJ4cnBjX3Bvc3RfbWVzc2FnZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIG1hcmssIHUzMiBlcnJvciwKLQkJCSAgICAgIGJvb2wgZmF0YWwpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoInslZCwlbHh9LCV1LCV1LCVkIiwKLQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPmZsYWdzLCBtYXJrLCBlcnJvciwgZmF0YWwpOwotCi0JLyogcmVtb3ZlIHRpbWVycyBhbmQgdGhpbmdzIGZvciBmYXRhbCBtZXNzYWdlcyAqLwotCWlmIChmYXRhbCkgewotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKLQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7Ci0JfQotCi0JaWYgKG1hcmsgIT0gUlhSUENfU0tCX01BUktfTkVXX0NBTEwgJiYKLQkgICAgIXRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSkgewotCQlfbGVhdmUoIltubyB1c2VyaWRdIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghdGVzdF9iaXQoUlhSUENfQ0FMTF9URVJNSU5BTF9NU0csICZjYWxsLT5mbGFncykpIHsKLQkJc2tiID0gYWxsb2Nfc2tiKDAsIEdGUF9OT0ZTKTsKLQkJaWYgKCFza2IpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlyeHJwY19uZXdfc2tiKHNrYik7Ci0KLQkJc2tiLT5tYXJrID0gbWFyazsKLQotCQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCQltZW1zZXQoc3AsIDAsIHNpemVvZigqc3ApKTsKLQkJc3AtPmVycm9yID0gZXJyb3I7Ci0JCXNwLT5jYWxsID0gY2FsbDsKLQkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0JCWF0b21pY19pbmMoJmNhbGwtPnNrYl9jb3VudCk7Ci0KLQkJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQkJcmV0ID0gcnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBza2IsIHRydWUsIGZhdGFsKTsKLQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwotCQlCVUdfT04ocmV0IDwgMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBoYW5kbGUgYmFja2dyb3VuZCBwcm9jZXNzaW5nIG9mIGluY29taW5nIGNhbGwgcGFja2V0cyBhbmQgQUNLIC8gYWJvcnQKLSAqIGdlbmVyYXRpb24KKyAqIEhhbmRsZSByZXRyYW5zbWlzc2lvbiBhbmQgZGVmZXJyZWQgQUNLL2Fib3J0IGdlbmVyYXRpb24uCiAgKi8KIHZvaWQgcnhycGNfcHJvY2Vzc19jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfY2FsbCwgcHJvY2Vzc29yKTsKLQlzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIgd2hkcjsKLQlzdHJ1Y3QgcnhycGNfYWNrcGFja2V0IGFjazsKLQlzdHJ1Y3QgcnhycGNfYWNraW5mbyBhY2tpbmZvOwotCXN0cnVjdCBtc2doZHIgbXNnOwotCXN0cnVjdCBrdmVjIGlvdls1XTsKLQllbnVtIHJ4cnBjX2NhbGxfZXZlbnQgZ2VuYml0OwotCXVuc2lnbmVkIGxvbmcgYml0czsKLQlfX2JlMzIgZGF0YSwgcGFkOwotCXNpemVfdCBsZW47Ci0JaW50IGxvb3AsIG5iaXQsIGlvYywgcmV0LCBtdHU7Ci0JdTMyIHNlcmlhbCwgYWJvcnRfY29kZSA9IFJYX1BST1RPQ09MX0VSUk9SOwotCXU4ICphY2tzID0gTlVMTDsKKwlrdGltZV90IG5vdzsKKworCXJ4cnBjX3NlZV9jYWxsKGNhbGwpOwogCiAJLy9wcmludGsoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCV9lbnRlcigieyVkLCVzLCVseH0gWyVsdV0iLAotCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdLCBjYWxsLT5ldmVudHMsCi0JICAgICAgIChqaWZmaWVzIC0gY2FsbC0+Y3JlYXRpb25famlmKSAvIChIWiAvIDEwKSk7CisJX2VudGVyKCJ7JWQsJXMsJWx4fSIsCisJICAgICAgIGNhbGwtPmRlYnVnX2lkLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0sIGNhbGwtPmV2ZW50cyk7CiAKLQlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX1BST0NfQlVTWSwgJmNhbGwtPmZsYWdzKSkgewotCQlfZGVidWcoIlhYWFhYWFhYWFhYWFggUlVOTklORyBPTiBNVUxUSVBMRSBDUFVTIFhYWFhYWFhYWFhYWFgiKTsKLQkJcmV0dXJuOworcmVjaGVja19zdGF0ZToKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpKSB7CisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOworCQlnb3RvIHJlY2hlY2tfc3RhdGU7CiAJfQogCi0JaWYgKCFjYWxsLT5jb25uKQotCQlnb3RvIHNraXBfbXNnX2luaXQ7Ci0KLQkvKiB0aGVyZSdzIGEgZ29vZCBjaGFuY2Ugd2UncmUgZ29pbmcgdG8gaGF2ZSB0byBzZW5kIGEgbWVzc2FnZSwgc28gc2V0Ci0JICogb25lIHVwIGluIGFkdmFuY2UgKi8KLQltc2cubXNnX25hbWUJPSAmY2FsbC0+Y29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQ7Ci0JbXNnLm1zZ19uYW1lbGVuCT0gY2FsbC0+Y29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnRfbGVuOwotCW1zZy5tc2dfY29udHJvbAk9IE5VTEw7Ci0JbXNnLm1zZ19jb250cm9sbGVuID0gMDsKLQltc2cubXNnX2ZsYWdzCT0gMDsKLQotCXdoZHIuZXBvY2gJPSBodG9ubChjYWxsLT5jb25uLT5wcm90by5lcG9jaCk7Ci0Jd2hkci5jaWQJPSBodG9ubChjYWxsLT5jaWQpOwotCXdoZHIuY2FsbE51bWJlcgk9IGh0b25sKGNhbGwtPmNhbGxfaWQpOwotCXdoZHIuc2VxCT0gMDsKLQl3aGRyLnR5cGUJPSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s7Ci0Jd2hkci5mbGFncwk9IGNhbGwtPmNvbm4tPm91dF9jbGllbnRmbGFnOwotCXdoZHIudXNlclN0YXR1cwk9IDA7Ci0Jd2hkci5zZWN1cml0eUluZGV4ID0gY2FsbC0+Y29ubi0+c2VjdXJpdHlfaXg7Ci0Jd2hkci5fcnN2ZAk9IDA7Ci0Jd2hkci5zZXJ2aWNlSWQJPSBodG9ucyhjYWxsLT5zZXJ2aWNlX2lkKTsKLQotCW1lbXNldChpb3YsIDAsIHNpemVvZihpb3YpKTsKLQlpb3ZbMF0uaW92X2Jhc2UJPSAmd2hkcjsKLQlpb3ZbMF0uaW92X2xlbgk9IHNpemVvZih3aGRyKTsKLXNraXBfbXNnX2luaXQ6Ci0KLQkvKiBkZWFsIHdpdGggZXZlbnRzIG9mIGEgZmluYWwgbmF0dXJlICovCi0JaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfRVZfUkNWRF9FUlJPUiwgJmNhbGwtPmV2ZW50cykpIHsKLQkJZW51bSByeHJwY19za2JfbWFyayBtYXJrOwotCQlpbnQgZXJyb3I7Ci0KLQkJY2xlYXJfYml0KFJYUlBDX0NBTExfRVZfQ09OTl9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFSkVDVF9CVVNZLCAmY2FsbC0+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+ZXZlbnRzICYmICF3b3JrX3BlbmRpbmcoJmNhbGwtPnByb2Nlc3NvcikpIHsKLQkJX2RlYnVnKCJqdW1wc3RhcnQgJXgiLCBjYWxsLT5jb25uLT5wcm90by5jaWQpOwotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotCX0KLQorb3V0X3B1dDoKKwlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CitvdXQ6CiAJX2xlYXZlKCIiKTsKLQlyZXR1cm47Ci0KLW5vX21lbToKLQlfZGVidWcoIm91dCBvZiBtZW1vcnkiKTsKLQlnb3RvIG1heWJlX3Jlc2NoZWR1bGU7CiB9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY2FsbF9vYmplY3QuYyBiL25ldC9yeHJwYy9jYWxsX29iamVjdC5jCmluZGV4IGFlMDU3ZTAuLjM2NGI0MmQgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jYWxsX29iamVjdC5jCisrKyBiL25ldC9yeHJwYy9jYWxsX29iamVjdC5jCkBAIC0xOSwyMyArMTksMTMgQEAKICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KICNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgogCi0vKgotICogTWF4aW11bSBsaWZldGltZSBvZiBhIGNhbGwgKGluIGppZmZpZXMpLgotICovCi11bnNpZ25lZCBpbnQgcnhycGNfbWF4X2NhbGxfbGlmZXRpbWUgPSA2MCAqIEhaOwotCi0vKgotICogVGltZSB0aWxsIGRlYWQgY2FsbCBleHBpcmVzIGFmdGVyIGxhc3QgdXNlIChpbiBqaWZmaWVzKS4KLSAqLwotdW5zaWduZWQgaW50IHJ4cnBjX2RlYWRfY2FsbF9leHBpcnkgPSAyICogSFo7Ci0KIGNvbnN0IGNoYXIgKmNvbnN0IHJ4cnBjX2NhbGxfc3RhdGVzW05SX19SWFJQQ19DQUxMX1NUQVRFU10gPSB7Ci0JW1JYUlBDX0NBTExfVU5JTklUSUFMSVNFRF0JCT0gIlVuaW5pdCIsCisJW1JYUlBDX0NBTExfVU5JTklUSUFMSVNFRF0JCT0gIlVuaW5pdCAgIiwKIAlbUlhSUENfQ0FMTF9DTElFTlRfQVdBSVRfQ09OTl0JCT0gIkNsV3RDb25uIiwKIAlbUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUXQk9ICJDbFNuZFJlcSIsCiAJW1JYUlBDX0NBTExfQ0xJRU5UX0FXQUlUX1JFUExZXQkJPSAiQ2xBd3RScGwiLAogCVtSWFJQQ19DQUxMX0NMSUVOVF9SRUNWX1JFUExZXQkJPSAiQ2xSY3ZScGwiLAotCVtSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0tdCQk9ICJDbEZubEFDSyIsCisJW1JYUlBDX0NBTExfU0VSVkVSX1BSRUFMTE9DXQkJPSAiU3ZQcmVhbGMiLAogCVtSWFJQQ19DQUxMX1NFUlZFUl9TRUNVUklOR10JCT0gIlN2U2VjdXJlIiwKIAlbUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HXQkJPSAiU3ZBY2NlcHQiLAogCVtSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1RdCT0gIlN2UmN2UmVxIiwKQEAgLTQzLDIyICszMyw0NyBAQAogCVtSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZXQkJPSAiU3ZTbmRScGwiLAogCVtSWFJQQ19DQUxMX1NFUlZFUl9BV0FJVF9BQ0tdCQk9ICJTdkF3dEFDSyIsCiAJW1JYUlBDX0NBTExfQ09NUExFVEVdCQkJPSAiQ29tcGxldGUiLAotCVtSWFJQQ19DQUxMX1NFUlZFUl9CVVNZXQkJPSAiU3ZCdXN5ICAiLAorfTsKKworY29uc3QgY2hhciAqY29uc3QgcnhycGNfY2FsbF9jb21wbGV0aW9uc1tOUl9fUlhSUENfQ0FMTF9DT01QTEVUSU9OU10gPSB7CisJW1JYUlBDX0NBTExfU1VDQ0VFREVEXQkJCT0gIkNvbXBsZXRlIiwKIAlbUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVEXQkJPSAiUm10QWJvcnQiLAogCVtSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRF0JCT0gIkxvY0Fib3J0IiwKKwlbUlhSUENfQ0FMTF9MT0NBTF9FUlJPUl0JCT0gIkxvY0Vycm9yIiwKIAlbUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SXQkJPSAiTmV0RXJyb3IiLAotCVtSWFJQQ19DQUxMX0RFQURdCQkJPSAiRGVhZCAgICAiLAorfTsKKworY29uc3QgY2hhciByeHJwY19jYWxsX3RyYWNlc1tyeHJwY19jYWxsX19ucl90cmFjZV1bNF0gPSB7CisJW3J4cnBjX2NhbGxfbmV3X2NsaWVudF0JCT0gIk5XYyIsCisJW3J4cnBjX2NhbGxfbmV3X3NlcnZpY2VdCT0gIk5XcyIsCisJW3J4cnBjX2NhbGxfcXVldWVkXQkJPSAiUVVFIiwKKwlbcnhycGNfY2FsbF9xdWV1ZWRfcmVmXQkJPSAiUVVSIiwKKwlbcnhycGNfY2FsbF9jb25uZWN0ZWRdCQk9ICJDT04iLAorCVtyeHJwY19jYWxsX3JlbGVhc2VdCQk9ICJSTFMiLAorCVtyeHJwY19jYWxsX3NlZW5dCQk9ICJTRUUiLAorCVtyeHJwY19jYWxsX2dvdF0JCT0gIkdPVCIsCisJW3J4cnBjX2NhbGxfZ290X3VzZXJpZF0JCT0gIkd1cyIsCisJW3J4cnBjX2NhbGxfZ290X2tlcm5lbF0JCT0gIkdrZSIsCisJW3J4cnBjX2NhbGxfcHV0XQkJPSAiUFVUIiwKKwlbcnhycGNfY2FsbF9wdXRfdXNlcmlkXQkJPSAiUHVzIiwKKwlbcnhycGNfY2FsbF9wdXRfa2VybmVsXQkJPSAiUGtlIiwKKwlbcnhycGNfY2FsbF9wdXRfbm9xdWV1ZV0JPSAiUE5RIiwKKwlbcnhycGNfY2FsbF9lcnJvcl0JCT0gIipFKiIsCiB9OwogCiBzdHJ1Y3Qga21lbV9jYWNoZSAqcnhycGNfY2FsbF9qYXI7CiBMSVNUX0hFQUQocnhycGNfY2FsbHMpOwogREVGSU5FX1JXTE9DSyhyeHJwY19jYWxsX2xvY2spOwogCi1zdGF0aWMgdm9pZCByeHJwY19kZXN0cm95X2NhbGwoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfbGlmZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpOwotc3RhdGljIHZvaWQgcnhycGNfZGVhZF9jYWxsX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCk7Ci1zdGF0aWMgdm9pZCByeHJwY19hY2tfdGltZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpOwotc3RhdGljIHZvaWQgcnhycGNfcmVzZW5kX3RpbWVfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKTsKK3N0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfdGltZXJfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKQoreworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gKHN0cnVjdCByeHJwY19jYWxsICopX2NhbGw7CisKKwlfZW50ZXIoIiVkIiwgY2FsbC0+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+Y2FsbHMucmJfbm9kZTsKQEAgLTI0MywzNjkgKzI1MCwyODUgQEAKIAkJZWxzZSBpZiAodXNlcl9jYWxsX0lEID4geGNhbGwtPnVzZXJfY2FsbF9JRCkKIAkJCXBwID0gJigqcHApLT5yYl9yaWdodDsKIAkJZWxzZQotCQkJZ290byBmb3VuZF91c2VyX0lEX25vd19wcmVzZW50OworCQkJZ290byBlcnJvcl9kdXBfdXNlcl9JRDsKIAl9CiAKLQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQorCXJjdV9hc3NpZ25fcG9pbnRlcihjYWxsLT5zb2NrZXQsIHJ4KTsKKwljYWxsLT51c2VyX2NhbGxfSUQgPSB1c2VyX2NhbGxfSUQ7CisJX19zZXRfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKTsKKwlyeHJwY19nZXRfY2FsbChjYWxsLCByeHJwY19jYWxsX2dvdF91c2VyaWQpOwogCXJiX2xpbmtfbm9kZSgmY2FsbC0+c29ja19ub2RlLCBwYXJlbnQsIHBwKTsKIAlyYl9pbnNlcnRfY29sb3IoJmNhbGwtPnNvY2tfbm9kZSwgJnJ4LT5jYWxscyk7CisJbGlzdF9hZGQoJmNhbGwtPnNvY2tfbGluaywgJnJ4LT5zb2NrX2NhbGxzKTsKKwogCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7CiAKLQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOworCXdyaXRlX2xvY2soJnJ4cnBjX2NhbGxfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmY2FsbC0+bGluaywgJnJ4cnBjX2NhbGxzKTsKLQl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7CisJd3JpdGVfdW5sb2NrKCZyeHJwY19jYWxsX2xvY2spOwogCi0JcmV0ID0gcnhycGNfYmVnaW5fY2xpZW50X2NhbGwoY2FsbCwgY3AsIHNyeCwgZ2ZwKTsKKwkvKiBTZXQgdXAgb3IgZ2V0IGEgY29ubmVjdGlvbiByZWNvcmQgYW5kIHNldCB0aGUgcHJvdG9jb2wgcGFyYW1ldGVycywKKwkgKiBpbmNsdWRpbmcgY2hhbm5lbCBudW1iZXIgYW5kIGNhbGwgSUQuCisJICovCisJcmV0ID0gcnhycGNfY29ubmVjdF9jYWxsKGNhbGwsIGNwLCBzcngsIGdmcCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKKwl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfY29ubmVjdGVkLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAorCQkJIGhlcmUsIEVSUl9QVFIocmV0KSk7CisKKwlzcGluX2xvY2tfYmgoJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5sb2NrKTsKKwlobGlzdF9hZGRfaGVhZCgmY2FsbC0+ZXJyb3JfbGluaywKKwkJICAgICAgICZjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+ZXJyb3JfdGFyZ2V0cyk7CisJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5sb2NrKTsKKworCXJ4cnBjX3N0YXJ0X2NhbGxfdGltZXIoY2FsbCk7CisKIAlfbmV0KCJDQUxMIG5ldyAlZCBvbiBDT05OICVkIiwgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPmNvbm4tPmRlYnVnX2lkKTsKIAogCV9sZWF2ZSgiID0gJXAgW25ld10iLCBjYWxsKTsKIAlyZXR1cm4gY2FsbDsKIAotZXJyb3I6Ci0Jd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7Ci0JcmJfZXJhc2UoJmNhbGwtPnNvY2tfbm9kZSwgJnJ4LT5jYWxscyk7Ci0Jd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQotCXdyaXRlX2xvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7Ci0JbGlzdF9kZWxfaW5pdCgmY2FsbC0+bGluayk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOwotCi0Jc2V0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpOwotCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9ERUFEOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiBFUlJfUFRSKHJldCk7Ci0KIAkvKiBXZSB1bmV4cGVjdGVkbHkgZm91bmQgdGhlIHVzZXIgSUQgaW4gdGhlIGxpc3QgYWZ0ZXIgdGFraW5nCiAJICogdGhlIGNhbGxfbG9jay4gIFRoaXMgc2hvdWxkbid0IGhhcHBlbiB1bmxlc3MgdGhlIHVzZXIgcmFjZXMKIAkgKiB3aXRoIGl0c2VsZiBhbmQgdHJpZXMgdG8gYWRkIHRoZSBzYW1lIHVzZXIgSUQgdHdpY2UgYXQgdGhlCiAJICogc2FtZSB0aW1lIGluIGRpZmZlcmVudCB0aHJlYWRzLgogCSAqLwotZm91bmRfdXNlcl9JRF9ub3dfcHJlc2VudDoKK2Vycm9yX2R1cF91c2VyX0lEOgogCXdyaXRlX3VubG9jaygmcngtPmNhbGxfbG9jayk7Ci0Jc2V0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpOwotCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9ERUFEOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCV9sZWF2ZSgiID0gLUVFWElTVCBbJXBdIiwgY2FsbCk7Ci0JcmV0dXJuIEVSUl9QVFIoLUVFWElTVCk7CisJcmV0ID0gLUVFWElTVDsKKworZXJyb3I6CisJX19yeHJwY19zZXRfY2FsbF9jb21wbGV0aW9uKGNhbGwsIFJYUlBDX0NBTExfTE9DQUxfRVJST1IsCisJCQkJICAgIFJYX0NBTExfREVBRCwgcmV0KTsKKwl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfZXJyb3IsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksCisJCQkgaGVyZSwgRVJSX1BUUihyZXQpKTsKKwlyeHJwY19yZWxlYXNlX2NhbGwocngsIGNhbGwpOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCiAvKgotICogc2V0IHVwIGFuIGluY29taW5nIGNhbGwKLSAqIC0gY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dCB3aXRoIElSUXMgZW5hYmxlZAorICogU2V0IHVwIGFuIGluY29taW5nIGNhbGwuICBjYWxsLT5jb25uIHBvaW50cyB0byB0aGUgY29ubmVjdGlvbi4KKyAqIFRoaXMgaXMgY2FsbGVkIGluIEJIIGNvbnRleHQgYW5kIGlzbid0IGFsbG93ZWQgdG8gZmFpbC4KICAqLwotc3RydWN0IHJ4cnBjX2NhbGwgKnJ4cnBjX2luY29taW5nX2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAotCQkJCSAgICAgICBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKLQkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3ZvaWQgcnhycGNfaW5jb21pbmdfY2FsbChzdHJ1Y3QgcnhycGNfc29jayAqcngsCisJCQkgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IGNhbGwtPmNvbm47CiAJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsLCAqY2FuZGlkYXRlOwotCXUzMiBjYWxsX2lkLCBjaGFuOworCXUzMiBjaGFuOwogCi0JX2VudGVyKCIsJWQiLCBjb25uLT5kZWJ1Z19pZCk7CisJX2VudGVyKCIsJWQiLCBjYWxsLT5jb25uLT5kZWJ1Z19pZCk7CiAKLQlBU1NFUlQocnggIT0gTlVMTCk7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGNhbGwtPnNvY2tldCwgcngpOworCWNhbGwtPmNhbGxfaWQJCT0gc3AtPmhkci5jYWxsTnVtYmVyOworCWNhbGwtPnNlcnZpY2VfaWQJPSBzcC0+aGRyLnNlcnZpY2VJZDsKKwljYWxsLT5jaWQJCT0gc3AtPmhkci5jaWQ7CisJY2FsbC0+c3RhdGUJCT0gUlhSUENfQ0FMTF9TRVJWRVJfQUNDRVBUSU5HOworCWlmIChzcC0+aGRyLnNlY3VyaXR5SW5kZXggPiAwKQorCQljYWxsLT5zdGF0ZQk9IFJYUlBDX0NBTExfU0VSVkVSX1NFQ1VSSU5HOworCWNhbGwtPmNvbmdfdHN0YW1wCT0gc2tiLT50c3RhbXA7CiAKLQljYW5kaWRhdGUgPSByeHJwY19hbGxvY19jYWxsKEdGUF9OT0lPKTsKLQlpZiAoIWNhbmRpZGF0ZSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKLQotCWNoYW4gPSBzcC0+aGRyLmNpZCAmIFJYUlBDX0NIQU5ORUxNQVNLOwotCWNhbmRpZGF0ZS0+c29ja2V0CT0gcng7Ci0JY2FuZGlkYXRlLT5jb25uCQk9IGNvbm47Ci0JY2FuZGlkYXRlLT5jaWQJCT0gc3AtPmhkci5jaWQ7Ci0JY2FuZGlkYXRlLT5jYWxsX2lkCT0gc3AtPmhkci5jYWxsTnVtYmVyOwotCWNhbmRpZGF0ZS0+Y2hhbm5lbAk9IGNoYW47Ci0JY2FuZGlkYXRlLT5yeF9kYXRhX3Bvc3QJPSAwOwotCWNhbmRpZGF0ZS0+c3RhdGUJPSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0NFUFRJTkc7Ci0JaWYgKGNvbm4tPnNlY3VyaXR5X2l4ID4gMCkKLQkJY2FuZGlkYXRlLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX1NFQ1VSSU5HOwotCi0Jc3Bpbl9sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwotCi0JLyogc2V0IHRoZSBjaGFubmVsIGZvciB0aGlzIGNhbGwgKi8KLQljYWxsID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChjb25uLT5jaGFubmVsc1tjaGFuXS5jYWxsLAotCQkJCQkgbG9ja2RlcF9pc19oZWxkKCZjb25uLT5jaGFubmVsX2xvY2spKTsKLQotCV9kZWJ1ZygiY2hhbm5lbFsldV0gaXMgJXAiLCBjYW5kaWRhdGUtPmNoYW5uZWwsIGNhbGwpOwotCWlmIChjYWxsICYmIGNhbGwtPmNhbGxfaWQgPT0gc3AtPmhkci5jYWxsTnVtYmVyKSB7Ci0JCS8qIGFscmVhZHkgc2V0OyBtdXN0J3ZlIGJlZW4gYSBkdXBsaWNhdGUgcGFja2V0ICovCi0JCV9kZWJ1ZygiZXh0YW50IGNhbGwgWyVkXSIsIGNhbGwtPnN0YXRlKTsKLQkJQVNTRVJUQ01QKGNhbGwtPmNvbm4sID09LCBjb25uKTsKLQotCQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCQlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7Ci0JCWNhc2UgUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ6Ci0JCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9BQk9SVCwgJmNhbGwtPmV2ZW50cykpCi0JCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJY2FzZSBSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQ6Ci0JCQlyZWFkX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCQlnb3RvIGFib3J0ZWRfY2FsbDsKLQkJZGVmYXVsdDoKLQkJCXJ4cnBjX2dldF9jYWxsKGNhbGwpOwotCQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCQkJZ290byBleHRhbnRfY2FsbDsKLQkJfQotCX0KLQotCWlmIChjYWxsKSB7Ci0JCS8qIGl0IHNlZW1zIHRoZSBjaGFubmVsIGlzIHN0aWxsIGluIHVzZSBmcm9tIHRoZSBwcmV2aW91cyBjYWxsCi0JCSAqIC0gZGl0Y2ggdGhlIG9sZCBiaW5kaW5nIGlmIGl0cyBjYWxsIGlzIG5vdyBjb21wbGV0ZSAqLwotCQlfZGVidWcoIkNBTEw6ICV1IHsgJXMgfSIsCi0JCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdKTsKLQotCQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQkJX19yeHJwY19kaXNjb25uZWN0X2NhbGwoY2FsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlzcGluX3VubG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKLQkJCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKLQkJCV9sZWF2ZSgiID0gLUVCVVNZIik7Ci0JCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOwotCQl9Ci0JfQotCi0JLyogY2hlY2sgdGhlIGNhbGwgbnVtYmVyIGlzbid0IGR1cGxpY2F0ZSAqLwotCV9kZWJ1ZygiY2hlY2sgZHVwIik7Ci0JY2FsbF9pZCA9IHNwLT5oZHIuY2FsbE51bWJlcjsKLQotCS8qIFdlIGp1c3QgaWdub3JlIGNhbGxzIHByaW9yIHRvIHRoZSBjdXJyZW50IGNhbGwgSUQuICBUZXJtaW5hdGVkIGNhbGxzCi0JICogYXJlIGhhbmRsZWQgdmlhIHRoZSBjb25uZWN0aW9uLgorCS8qIFNldCB0aGUgY2hhbm5lbCBmb3IgdGhpcyBjYWxsLiAgV2UgZG9uJ3QgZ2V0IGNoYW5uZWxfbG9jayBhcyB3ZSdyZQorCSAqIG9ubHkgZGVmZW5kaW5nIGFnYWluc3QgdGhlIGRhdGFfcmVhZHkgaGFuZGxlciAod2hpY2ggd2UncmUgY2FsbGVkCisJICogZnJvbSkgYW5kIHRoZSBSRVNQT05TRSBwYWNrZXQgcGFyc2VyICh3aGljaCBpcyBvbmx5IHJlYWxseQorCSAqIGludGVyZXN0ZWQgaW4gY2FsbF9jb3VudGVyIGFuZCBjYW4gY29wZSB3aXRoIGEgZGlzYWdyZWVtZW50IHdpdGggdGhlCisJICogY2FsbCBwb2ludGVyKS4KIAkgKi8KLQlpZiAoY2FsbF9pZCA8PSBjb25uLT5jaGFubmVsc1tjaGFuXS5jYWxsX2NvdW50ZXIpCi0JCWdvdG8gb2xkX2NhbGw7IC8qIFRPRE86IEp1c3QgZHJvcCBwYWNrZXQgKi8KLQotCS8qIG1ha2UgdGhlIGNhbGwgYXZhaWxhYmxlICovCi0JX2RlYnVnKCJuZXcgY2FsbCIpOwotCWNhbGwgPSBjYW5kaWRhdGU7Ci0JY2FuZGlkYXRlID0gTlVMTDsKLQljb25uLT5jaGFubmVsc1tjaGFuXS5jYWxsX2NvdW50ZXIgPSBjYWxsX2lkOworCWNoYW4gPSBzcC0+aGRyLmNpZCAmIFJYUlBDX0NIQU5ORUxNQVNLOworCWNvbm4tPmNoYW5uZWxzW2NoYW5dLmNhbGxfY291bnRlciA9IGNhbGwtPmNhbGxfaWQ7CisJY29ubi0+Y2hhbm5lbHNbY2hhbl0uY2FsbF9pZCA9IGNhbGwtPmNhbGxfaWQ7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKGNvbm4tPmNoYW5uZWxzW2NoYW5dLmNhbGwsIGNhbGwpOwotCXNvY2tfaG9sZCgmcngtPnNrKTsKLQlyeHJwY19nZXRfY29ubmVjdGlvbihjb25uKTsKLQlzcGluX3VubG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKIAogCXNwaW5fbG9jaygmY29ubi0+cGFyYW1zLnBlZXItPmxvY2spOwogCWhsaXN0X2FkZF9oZWFkKCZjYWxsLT5lcnJvcl9saW5rLCAmY29ubi0+cGFyYW1zLnBlZXItPmVycm9yX3RhcmdldHMpOwogCXNwaW5fdW5sb2NrKCZjb25uLT5wYXJhbXMucGVlci0+bG9jayk7CiAKLQl3cml0ZV9sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmxpbmssICZyeHJwY19jYWxscyk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZyeHJwY19jYWxsX2xvY2spOwotCi0JY2FsbC0+bG9jYWwgPSBjb25uLT5wYXJhbXMubG9jYWw7Ci0JY2FsbC0+ZXBvY2ggPSBjb25uLT5wcm90by5lcG9jaDsKLQljYWxsLT5zZXJ2aWNlX2lkID0gY29ubi0+cGFyYW1zLnNlcnZpY2VfaWQ7Ci0JY2FsbC0+aW5fY2xpZW50ZmxhZyA9IFJYUlBDX0NMSUVOVF9JTklUSUFURUQ7Ci0KIAlfbmV0KCJDQUxMIGluY29taW5nICVkIG9uIENPTk4gJWQiLCBjYWxsLT5kZWJ1Z19pZCwgY2FsbC0+Y29ubi0+ZGVidWdfaWQpOwogCi0JY2FsbC0+bGlmZXRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgcnhycGNfbWF4X2NhbGxfbGlmZXRpbWU7Ci0JYWRkX3RpbWVyKCZjYWxsLT5saWZldGltZXIpOwotCV9sZWF2ZSgiID0gJXAgeyVkfSBbbmV3XSIsIGNhbGwsIGNhbGwtPmRlYnVnX2lkKTsKLQlyZXR1cm4gY2FsbDsKLQotZXh0YW50X2NhbGw6Ci0Jc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7Ci0Ja21lbV9jYWNoZV9mcmVlKHJ4cnBjX2NhbGxfamFyLCBjYW5kaWRhdGUpOwotCV9sZWF2ZSgiID0gJXAgeyVkfSBbZXh0YW50XSIsIGNhbGwsIGNhbGwgPyBjYWxsLT5kZWJ1Z19pZCA6IC0xKTsKLQlyZXR1cm4gY2FsbDsKLQotYWJvcnRlZF9jYWxsOgotCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwotCWttZW1fY2FjaGVfZnJlZShyeHJwY19jYWxsX2phciwgY2FuZGlkYXRlKTsKLQlfbGVhdmUoIiA9IC1FQ09OTkFCT1JURUQiKTsKLQlyZXR1cm4gRVJSX1BUUigtRUNPTk5BQk9SVEVEKTsKLQotb2xkX2NhbGw6Ci0Jc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7Ci0Ja21lbV9jYWNoZV9mcmVlKHJ4cnBjX2NhbGxfamFyLCBjYW5kaWRhdGUpOwotCV9sZWF2ZSgiID0gLUVDT05OUkVTRVQgW29sZF0iKTsKLQlyZXR1cm4gRVJSX1BUUigtRUNPTk5SRVNFVCk7CisJcnhycGNfc3RhcnRfY2FsbF90aW1lcihjYWxsKTsKKwlfbGVhdmUoIiIpOwogfQogCiAvKgotICogZGV0YWNoIGEgY2FsbCBmcm9tIGEgc29ja2V0IGFuZCBzZXQgdXAgZm9yIHJlbGVhc2UKKyAqIFF1ZXVlIGEgY2FsbCdzIHdvcmsgcHJvY2Vzc29yLCBnZXR0aW5nIGEgcmVmIHRvIHBhc3MgdG8gdGhlIHdvcmsgcXVldWUuCiAgKi8KLXZvaWQgcnhycGNfcmVsZWFzZV9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQorYm9vbCByeHJwY19xdWV1ZV9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQogewotCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKLQlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSBjYWxsLT5zb2NrZXQ7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpbnQgbiA9IF9fYXRvbWljX2FkZF91bmxlc3MoJmNhbGwtPnVzYWdlLCAxLCAwKTsKKwlpZiAobiA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHJ4cnBjX3F1ZXVlX3dvcmsoJmNhbGwtPnByb2Nlc3NvcikpCisJCXRyYWNlX3J4cnBjX2NhbGwoY2FsbCwgcnhycGNfY2FsbF9xdWV1ZWQsIG4gKyAxLCBoZXJlLCBOVUxMKTsKKwllbHNlCisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0X25vcXVldWUpOworCXJldHVybiB0cnVlOworfQogCi0JX2VudGVyKCJ7JWQsJWQsJWQsJWR9IiwKLQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksCi0JICAgICAgIGF0b21pY19yZWFkKCZjYWxsLT5hY2tyX25vdF9pZGxlKSwKLQkgICAgICAgY2FsbC0+cnhfZmlyc3Rfb29zKTsKKy8qCisgKiBRdWV1ZSBhIGNhbGwncyB3b3JrIHByb2Nlc3NvciwgcGFzc2luZyB0aGUgY2FsbGVycyByZWYgdG8gdGhlIHdvcmsgcXVldWUuCisgKi8KK2Jvb2wgX19yeHJwY19xdWV1ZV9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG4gPSBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpOworCUFTU0VSVENNUChuLCA+PSwgMSk7CisJaWYgKHJ4cnBjX3F1ZXVlX3dvcmsoJmNhbGwtPnByb2Nlc3NvcikpCisJCXRyYWNlX3J4cnBjX2NhbGwoY2FsbCwgcnhycGNfY2FsbF9xdWV1ZWRfcmVmLCBuLCBoZXJlLCBOVUxMKTsKKwllbHNlCisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0X25vcXVldWUpOworCXJldHVybiB0cnVlOworfQorCisvKgorICogTm90ZSB0aGUgcmUtZW1lcmdlbmNlIG9mIGEgY2FsbC4KKyAqLwordm9pZCByeHJwY19zZWVfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCWlmIChjYWxsKSB7CisJCWludCBuID0gYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKTsKKworCQl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfc2VlbiwgbiwgaGVyZSwgTlVMTCk7CisJfQorfQorCisvKgorICogTm90ZSB0aGUgYWRkaXRpb24gb2YgYSByZWYgb24gYSBjYWxsLgorICovCit2b2lkIHJ4cnBjX2dldF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBlbnVtIHJ4cnBjX2NhbGxfdHJhY2Ugb3ApCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpbnQgbiA9IGF0b21pY19pbmNfcmV0dXJuKCZjYWxsLT51c2FnZSk7CisKKwl0cmFjZV9yeHJwY19jYWxsKGNhbGwsIG9wLCBuLCBoZXJlLCBOVUxMKTsKK30KKworLyoKKyAqIERldGFjaCBhIGNhbGwgZnJvbSBpdHMgb3duaW5nIHNvY2tldC4KKyAqLwordm9pZCByeHJwY19yZWxlYXNlX2NhbGwoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwlib29sIHB1dCA9IGZhbHNlOworCWludCBpOworCisJX2VudGVyKCJ7JWQsJWR9IiwgY2FsbC0+ZGVidWdfaWQsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworCisJdHJhY2VfcnhycGNfY2FsbChjYWxsLCByeHJwY19jYWxsX3JlbGVhc2UsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSksCisJCQkgaGVyZSwgKGNvbnN0IHZvaWQgKiljYWxsLT5mbGFncyk7CisKKwlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID09LCBSWFJQQ19DQUxMX0NPTVBMRVRFKTsKIAogCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CiAJaWYgKHRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSkKIAkJQlVHKCk7CiAJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwogCi0JLyogZGlzc29jaWF0ZSBmcm9tIHRoZSBzb2NrZXQKLQkgKiAtIHRoZSBzb2NrZXQncyByZWYgb24gdGhlIGNhbGwgaXMgcGFzc2VkIHRvIHRoZSBkZWF0aCB0aW1lcgotCSAqLwotCV9kZWJ1ZygiUkVMRUFTRSBDQUxMICVwICglZCBDT05OICVwKSIsIGNhbGwsIGNhbGwtPmRlYnVnX2lkLCBjb25uKTsKKwlkZWxfdGltZXJfc3luYygmY2FsbC0+dGltZXIpOwogCi0Jc3Bpbl9sb2NrKCZjb25uLT5wYXJhbXMucGVlci0+bG9jayk7Ci0JaGxpc3RfZGVsX2luaXQoJmNhbGwtPmVycm9yX2xpbmspOwotCXNwaW5fdW5sb2NrKCZjb25uLT5wYXJhbXMucGVlci0+bG9jayk7CisJLyogTWFrZSBzdXJlIHdlIGRvbid0IGdldCBhbnkgbW9yZSBub3RpZmljYXRpb25zICovCisJd3JpdGVfbG9ja19iaCgmcngtPnJlY3Ztc2dfbG9jayk7CiAKLQl3cml0ZV9sb2NrX2JoKCZyeC0+Y2FsbF9sb2NrKTsKLQlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPmFjY2VwdF9saW5rKSkgeworCWlmICghbGlzdF9lbXB0eSgmY2FsbC0+cmVjdm1zZ19saW5rKSkgewogCQlfZGVidWcoInVubGlua2luZyBvbmNlLXBlbmRpbmcgY2FsbCAlcCB7IGU9JWx4IGY9JWx4IH0iLAogCQkgICAgICAgY2FsbCwgY2FsbC0+ZXZlbnRzLCBjYWxsLT5mbGFncyk7Ci0JCUFTU0VSVCghdGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKTsKLQkJbGlzdF9kZWxfaW5pdCgmY2FsbC0+YWNjZXB0X2xpbmspOwotCQlza19hY2NlcHRxX3JlbW92ZWQoJnJ4LT5zayk7Ci0JfSBlbHNlIGlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpIHsKKwkJbGlzdF9kZWwoJmNhbGwtPnJlY3Ztc2dfbGluayk7CisJCXB1dCA9IHRydWU7CisJfQorCisJLyogbGlzdF9lbXB0eSgpIG11c3QgcmV0dXJuIGZhbHNlIGluIHJ4cnBjX25vdGlmeV9zb2NrZXQoKSAqLworCWNhbGwtPnJlY3Ztc2dfbGluay5uZXh0ID0gTlVMTDsKKwljYWxsLT5yZWN2bXNnX2xpbmsucHJldiA9IE5VTEw7CisKKwl3cml0ZV91bmxvY2tfYmgoJnJ4LT5yZWN2bXNnX2xvY2spOworCWlmIChwdXQpCisJCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKKworCXdyaXRlX2xvY2soJnJ4LT5jYWxsX2xvY2spOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncykpIHsKIAkJcmJfZXJhc2UoJmNhbGwtPnNvY2tfbm9kZSwgJnJ4LT5jYWxscyk7CiAJCW1lbXNldCgmY2FsbC0+c29ja19ub2RlLCAweGRkLCBzaXplb2YoY2FsbC0+c29ja19ub2RlKSk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0hBU19VU0VSSUQsICZjYWxsLT5mbGFncyk7Ci0JfQotCXdyaXRlX3VubG9ja19iaCgmcngtPmNhbGxfbG9jayk7Ci0KLQkvKiBmcmVlIHVwIHRoZSBjaGFubmVsIGZvciByZXVzZSAqLwotCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCi0JaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgotCSAgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9GSU5BTF9BQ0spIHsKLQkJX2RlYnVnKCIrKysgQUJPUlRJTkcgU1RBVEUgJWQgKysrXG4iLCBjYWxsLT5zdGF0ZSk7Ci0JCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ7Ci0JCWNhbGwtPmxvY2FsX2Fib3J0ID0gUlhfQ0FMTF9ERUFEOwotCX0KLQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCi0JcnhycGNfZGlzY29ubmVjdF9jYWxsKGNhbGwpOwotCi0JLyogY2xlYW4gdXAgdGhlIFJ4IHF1ZXVlICovCi0JaWYgKCFza2JfcXVldWVfZW1wdHkoJmNhbGwtPnJ4X3F1ZXVlKSB8fAotCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZjYWxsLT5yeF9vb3NfcXVldWUpKSB7Ci0JCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQkJX2RlYnVnKCJwdXJnZSBSeCBxdWV1ZXMiKTsKLQotCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZjYWxsLT5yeF9xdWV1ZSkpIHx8Ci0JCSAgICAgICAoc2tiID0gc2tiX2RlcXVldWUoJmNhbGwtPnJ4X29vc19xdWV1ZSkpKSB7Ci0JCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7Ci0KLQkJCXNwID0gcnhycGNfc2tiKHNrYik7Ci0JCQlfZGVidWcoIi0gemFwICVzICUlJXUgIyV1IiwKLQkJCSAgICAgICByeHJwY19wa3RzW3NwLT5oZHIudHlwZV0sCi0JCQkgICAgICAgc3AtPmhkci5zZXJpYWwsIHNwLT5oZHIuc2VxKTsKLQkJCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQotCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsICE9LCBSWFJQQ19DQUxMX0NPTVBMRVRFKTsKKwkJcnhycGNfcHV0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9wdXRfdXNlcmlkKTsKIAl9CiAKLQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKLQlkZWxfdGltZXJfc3luYygmY2FsbC0+YWNrX3RpbWVyKTsKLQlkZWxfdGltZXJfc3luYygmY2FsbC0+bGlmZXRpbWVyKTsKLQljYWxsLT5kZWFkc3Bhbi5leHBpcmVzID0gamlmZmllcyArIHJ4cnBjX2RlYWRfY2FsbF9leHBpcnk7Ci0JYWRkX3RpbWVyKCZjYWxsLT5kZWFkc3Bhbik7CisJbGlzdF9kZWwoJmNhbGwtPnNvY2tfbGluayk7CisJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKworCV9kZWJ1ZygiUkVMRUFTRSBDQUxMICVwICglZCBDT05OICVwKSIsIGNhbGwsIGNhbGwtPmRlYnVnX2lkLCBjb25uKTsKKworCWlmIChjb25uKQorCQlyeHJwY19kaXNjb25uZWN0X2NhbGwoY2FsbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhSUENfUlhUWF9CVUZGX1NJWkU7IGkrKykgeworCQlyeHJwY19mcmVlX3NrYihjYWxsLT5yeHR4X2J1ZmZlcltpXSwKKwkJCSAgICAgICAoY2FsbC0+dHhfcGhhc2UgPyByeHJwY19za2JfdHhfY2xlYW5lZCA6CisJCQkJcnhycGNfc2tiX3J4X2NsZWFuZWQpKTsKKwkJY2FsbC0+cnh0eF9idWZmZXJbaV0gPSBOVUxMOworCX0KIAogCV9sZWF2ZSgiIik7CiB9CiAKIC8qCi0gKiBoYW5kbGUgYSBkZWFkIGNhbGwgYmVpbmcgcmVhZHkgZm9yIHJlYXBpbmcKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfZGVhZF9jYWxsX2V4cGlyZWQodW5zaWduZWQgbG9uZyBfY2FsbCkKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IChzdHJ1Y3QgcnhycGNfY2FsbCAqKSBfY2FsbDsKLQotCV9lbnRlcigieyVkfSIsIGNhbGwtPmRlYnVnX2lkKTsKLQotCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9ERUFEOwotCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci19Ci0KLS8qCi0gKiBtYXJrIGEgY2FsbCBhcyB0byBiZSByZWxlYXNlZCwgYWJvcnRpbmcgaXQgaWYgaXQncyBzdGlsbCBpbiBwcm9ncmVzcwotICogLSBjYWxsZWQgd2l0aCBzb2Z0aXJxcyBkaXNhYmxlZAotICovCi1zdGF0aWMgdm9pZCByeHJwY19tYXJrX2NhbGxfcmVsZWFzZWQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCi17Ci0JYm9vbCBzY2hlZDsKLQotCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfREVBRCkgewotCQlzY2hlZCA9IGZhbHNlOwotCQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7Ci0JCQlfZGVidWcoImFib3J0IGNhbGwgJXAiLCBjYWxsKTsKLQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ7Ci0JCQljYWxsLT5sb2NhbF9hYm9ydCA9IFJYX0NBTExfREVBRDsKLQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX0FCT1JULCAmY2FsbC0+ZXZlbnRzKSkKLQkJCQlzY2hlZCA9IHRydWU7Ci0JCX0KLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpCi0JCQlzY2hlZCA9IHRydWU7Ci0JCWlmIChzY2hlZCkKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JfQotCXdyaXRlX3VubG9jaygmY2FsbC0+c3RhdGVfbG9jayk7Ci19Ci0KLS8qCiAgKiByZWxlYXNlIGFsbCB0aGUgY2FsbHMgYXNzb2NpYXRlZCB3aXRoIGEgc29ja2V0CiAgKi8KIHZvaWQgcnhycGNfcmVsZWFzZV9jYWxsc19vbl9zb2NrZXQoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4KQogewogCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCXN0cnVjdCByYl9ub2RlICpwOwogCiAJX2VudGVyKCIlcCIsIHJ4KTsKIAotCXJlYWRfbG9ja19iaCgmcngtPmNhbGxfbG9jayk7Ci0KLQkvKiBtYXJrIGFsbCB0aGUgY2FsbHMgYXMgbm8gbG9uZ2VyIHdhbnRpbmcgaW5jb21pbmcgcGFja2V0cyAqLwotCWZvciAocCA9IHJiX2ZpcnN0KCZyeC0+Y2FsbHMpOyBwOyBwID0gcmJfbmV4dChwKSkgewotCQljYWxsID0gcmJfZW50cnkocCwgc3RydWN0IHJ4cnBjX2NhbGwsIHNvY2tfbm9kZSk7Ci0JCXJ4cnBjX21hcmtfY2FsbF9yZWxlYXNlZChjYWxsKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJ4LT50b19iZV9hY2NlcHRlZCkpIHsKKwkJY2FsbCA9IGxpc3RfZW50cnkocngtPnRvX2JlX2FjY2VwdGVkLm5leHQsCisJCQkJICBzdHJ1Y3QgcnhycGNfY2FsbCwgYWNjZXB0X2xpbmspOworCQlsaXN0X2RlbCgmY2FsbC0+YWNjZXB0X2xpbmspOworCQlyeHJwY19hYm9ydF9jYWxsKCJTS1IiLCBjYWxsLCAwLCBSWF9DQUxMX0RFQUQsIEVDT05OUkVTRVQpOworCQlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CiAJfQogCi0JLyoga2lsbCB0aGUgbm90LXlldC1hY2NlcHRlZCBpbmNvbWluZyBjYWxscyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbCwgJnJ4LT5zZWN1cmVxLCBhY2NlcHRfbGluaykgewotCQlyeHJwY19tYXJrX2NhbGxfcmVsZWFzZWQoY2FsbCk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZyeC0+c29ja19jYWxscykpIHsKKwkJY2FsbCA9IGxpc3RfZW50cnkocngtPnNvY2tfY2FsbHMubmV4dCwKKwkJCQkgIHN0cnVjdCByeHJwY19jYWxsLCBzb2NrX2xpbmspOworCQlyeHJwY19nZXRfY2FsbChjYWxsLCByeHJwY19jYWxsX2dvdCk7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlNLVCIsIGNhbGwsIDAsIFJYX0NBTExfREVBRCwgRUNPTk5SRVNFVCk7CisJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpOworCQlyeHJwY19yZWxlYXNlX2NhbGwocngsIGNhbGwpOworCQlyeHJwY19wdXRfY2FsbChjYWxsLCByeHJwY19jYWxsX3B1dCk7CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjYWxsLCAmcngtPmFjY2VwdHEsIGFjY2VwdF9saW5rKSB7Ci0JCXJ4cnBjX21hcmtfY2FsbF9yZWxlYXNlZChjYWxsKTsKLQl9Ci0KLQlyZWFkX3VubG9ja19iaCgmcngtPmNhbGxfbG9jayk7CiAJX2xlYXZlKCIiKTsKIH0KIAogLyoKICAqIHJlbGVhc2UgYSBjYWxsCiAgKi8KLXZvaWQgX19yeHJwY19wdXRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3ZvaWQgcnhycGNfcHV0X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfY2FsbF90cmFjZSBvcCkKIHsKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCWludCBuOworCiAJQVNTRVJUKGNhbGwgIT0gTlVMTCk7CiAKLQlfZW50ZXIoIiVwe3U9JWR9IiwgY2FsbCwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSk7Ci0KLQlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSwgPiwgMCk7Ci0KLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2FsbC0+dXNhZ2UpKSB7CisJbiA9IGF0b21pY19kZWNfcmV0dXJuKCZjYWxsLT51c2FnZSk7CisJdHJhY2VfcnhycGNfY2FsbChjYWxsLCBvcCwgbiwgaGVyZSwgTlVMTCk7CisJQVNTRVJUQ01QKG4sID49LCAwKTsKKwlpZiAobiA9PSAwKSB7CiAJCV9kZWJ1ZygiY2FsbCAlZCBkZWFkIiwgY2FsbC0+ZGVidWdfaWQpOwotCQlXQVJOX09OKGF0b21pY19yZWFkKCZjYWxsLT5za2JfY291bnQpICE9IDApOwotCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID09LCBSWFJQQ19DQUxMX0RFQUQpOwotCQlyeHJwY19xdWV1ZV93b3JrKCZjYWxsLT5kZXN0cm95ZXIpOworCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID09LCBSWFJQQ19DQUxMX0NPTVBMRVRFKTsKKworCQl3cml0ZV9sb2NrKCZyeHJwY19jYWxsX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5saW5rKTsKKwkJd3JpdGVfdW5sb2NrKCZyeHJwY19jYWxsX2xvY2spOworCisJCXJ4cnBjX2NsZWFudXBfY2FsbChjYWxsKTsKIAl9Ci0JX2xlYXZlKCIiKTsKIH0KIAogLyoKQEAgLTYxNSwxODcgKzUzOCw3MCBAQAogewogCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHJ4cnBjX2NhbGwsIHJjdSk7CiAKLQlyeHJwY19wdXJnZV9xdWV1ZSgmY2FsbC0+cnhfcXVldWUpOworCXJ4cnBjX3B1dF9wZWVyKGNhbGwtPnBlZXIpOworCWtmcmVlKGNhbGwtPnJ4dHhfYnVmZmVyKTsKKwlrZnJlZShjYWxsLT5yeHR4X2Fubm90YXRpb25zKTsKIAlrbWVtX2NhY2hlX2ZyZWUocnhycGNfY2FsbF9qYXIsIGNhbGwpOwogfQogCiAvKgogICogY2xlYW4gdXAgYSBjYWxsCiAgKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2NsZWFudXBfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3ZvaWQgcnhycGNfY2xlYW51cF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQogewotCV9uZXQoIkRFU1RST1kgQ0FMTCAlZCIsIGNhbGwtPmRlYnVnX2lkKTsKKwlpbnQgaTsKIAotCUFTU0VSVChjYWxsLT5zb2NrZXQpOworCV9uZXQoIkRFU1RST1kgQ0FMTCAlZCIsIGNhbGwtPmRlYnVnX2lkKTsKIAogCW1lbXNldCgmY2FsbC0+c29ja19ub2RlLCAweGNkLCBzaXplb2YoY2FsbC0+c29ja19ub2RlKSk7CiAKLQlkZWxfdGltZXJfc3luYygmY2FsbC0+bGlmZXRpbWVyKTsKLQlkZWxfdGltZXJfc3luYygmY2FsbC0+ZGVhZHNwYW4pOwotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5hY2tfdGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZjYWxsLT5yZXNlbmRfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZjYWxsLT50aW1lcik7CiAKKwlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID09LCBSWFJQQ19DQUxMX0NPTVBMRVRFKTsKIAlBU1NFUlQodGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSk7Ci0JQVNTRVJUQ01QKGNhbGwtPmV2ZW50cywgPT0sIDApOwotCWlmICh3b3JrX3BlbmRpbmcoJmNhbGwtPnByb2Nlc3NvcikpIHsKLQkJX2RlYnVnKCJkZWZlciBkZXN0cm95Iik7Ci0JCXJ4cnBjX3F1ZXVlX3dvcmsoJmNhbGwtPmRlc3Ryb3llcik7Ci0JCXJldHVybjsKLQl9Ci0KIAlBU1NFUlRDTVAoY2FsbC0+Y29ubiwgPT0sIE5VTEwpOwogCi0JaWYgKGNhbGwtPmFja3Nfd2luZG93KSB7Ci0JCV9kZWJ1Zygia2lsbCBUeCB3aW5kb3cgJWQiLAotCQkgICAgICAgQ0lSQ19DTlQoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsCi0JCQkJY2FsbC0+YWNrc193aW5zeikpOwotCQlzbXBfbWIoKTsKLQkJd2hpbGUgKENJUkNfQ05UKGNhbGwtPmFja3NfaGVhZCwgY2FsbC0+YWNrc190YWlsLAotCQkJCWNhbGwtPmFja3Nfd2luc3opID4gMCkgewotCQkJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQkJCXVuc2lnbmVkIGxvbmcgX3NrYjsKKwkvKiBDbGVhbiB1cCB0aGUgUngvVHggYnVmZmVyICovCisJZm9yIChpID0gMDsgaSA8IFJYUlBDX1JYVFhfQlVGRl9TSVpFOyBpKyspCisJCXJ4cnBjX2ZyZWVfc2tiKGNhbGwtPnJ4dHhfYnVmZmVyW2ldLAorCQkJICAgICAgIChjYWxsLT50eF9waGFzZSA/IHJ4cnBjX3NrYl90eF9jbGVhbmVkIDoKKwkJCQlyeHJwY19za2JfcnhfY2xlYW5lZCkpOwogCi0JCQlfc2tiID0gY2FsbC0+YWNrc193aW5kb3dbY2FsbC0+YWNrc190YWlsXSAmIH4xOwotCQkJc3AgPSByeHJwY19za2IoKHN0cnVjdCBza19idWZmICopX3NrYik7Ci0JCQlfZGVidWcoIisrKyBjbGVhciBUeCAldSIsIHNwLT5oZHIuc2VxKTsKLQkJCXJ4cnBjX2ZyZWVfc2tiKChzdHJ1Y3Qgc2tfYnVmZiAqKV9za2IpOwotCQkJY2FsbC0+YWNrc190YWlsID0KLQkJCQkoY2FsbC0+YWNrc190YWlsICsgMSkgJiAoY2FsbC0+YWNrc193aW5zeiAtIDEpOwotCQl9CisJcnhycGNfZnJlZV9za2IoY2FsbC0+dHhfcGVuZGluZywgcnhycGNfc2tiX3R4X2NsZWFuZWQpOwogCi0JCWtmcmVlKGNhbGwtPmFja3Nfd2luZG93KTsKLQl9Ci0KLQlyeHJwY19mcmVlX3NrYihjYWxsLT50eF9wZW5kaW5nKTsKLQotCXJ4cnBjX3B1cmdlX3F1ZXVlKCZjYWxsLT5yeF9xdWV1ZSk7Ci0JQVNTRVJUKHNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfb29zX3F1ZXVlKSk7Ci0Jc29ja19wdXQoJmNhbGwtPnNvY2tldC0+c2spOwogCWNhbGxfcmN1KCZjYWxsLT5yY3UsIHJ4cnBjX3JjdV9kZXN0cm95X2NhbGwpOwogfQogCiAvKgotICogZGVzdHJveSBhIGNhbGwKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfZGVzdHJveV9jYWxsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfY2FsbCwgZGVzdHJveWVyKTsKLQotCV9lbnRlcigiJXB7JWQsJWQsJXB9IiwKLQkgICAgICAgY2FsbCwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSwgY2FsbC0+Y2hhbm5lbCwgY2FsbC0+Y29ubik7Ci0KLQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID09LCBSWFJQQ19DQUxMX0RFQUQpOwotCi0Jd3JpdGVfbG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKLQlsaXN0X2RlbF9pbml0KCZjYWxsLT5saW5rKTsKLQl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7Ci0KLQlyeHJwY19jbGVhbnVwX2NhbGwoY2FsbCk7Ci0JX2xlYXZlKCIiKTsKLX0KLQotLyoKLSAqIHByZWVtcHRpdmVseSBkZXN0cm95IGFsbCB0aGUgY2FsbCByZWNvcmRzIGZyb20gYSB0cmFuc3BvcnQgZW5kcG9pbnQgcmF0aGVyCi0gKiB0aGFuIHdhaXRpbmcgZm9yIHRoZW0gdG8gdGltZSBvdXQKKyAqIE1ha2Ugc3VyZSB0aGF0IGFsbCBjYWxscyBhcmUgZ29uZS4KICAqLwogdm9pZCBfX2V4aXQgcnhycGNfZGVzdHJveV9hbGxfY2FsbHModm9pZCkKIHsKIAlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKIAogCV9lbnRlcigiIik7Ci0Jd3JpdGVfbG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZyeHJwY19jYWxscykpCisJCXJldHVybjsKKworCXdyaXRlX2xvY2soJnJ4cnBjX2NhbGxfbG9jayk7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnJ4cnBjX2NhbGxzKSkgewogCQljYWxsID0gbGlzdF9lbnRyeShyeHJwY19jYWxscy5uZXh0LCBzdHJ1Y3QgcnhycGNfY2FsbCwgbGluayk7CiAJCV9kZWJ1ZygiWmFwcGluZyBjYWxsICVwIiwgY2FsbCk7CiAKKwkJcnhycGNfc2VlX2NhbGwoY2FsbCk7CiAJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmxpbmspOwogCi0JCXN3aXRjaCAoYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSkgewotCQljYXNlIDA6Ci0JCQlBU1NFUlRDTVAoY2FsbC0+c3RhdGUsID09LCBSWFJQQ19DQUxMX0RFQUQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWlmIChkZWxfdGltZXJfc3luYygmY2FsbC0+ZGVhZHNwYW4pICE9IDAgJiYKLQkJCSAgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0RFQUQpCi0JCQkJcnhycGNfZGVhZF9jYWxsX2V4cGlyZWQoKHVuc2lnbmVkIGxvbmcpIGNhbGwpOwotCQkJaWYgKGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfREVBRCkKLQkJCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2VycigiQ2FsbCAlcCBzdGlsbCBpbiB1c2UgKCVkLCVkLCVzLCVseCwlbHgpIVxuIiwKLQkJCSAgICAgICBjYWxsLCBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAotCQkJICAgICAgIGF0b21pY19yZWFkKCZjYWxsLT5hY2tyX25vdF9pZGxlKSwKLQkJCSAgICAgICByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0sCi0JCQkgICAgICAgY2FsbC0+ZmxhZ3MsIGNhbGwtPmV2ZW50cyk7Ci0JCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmY2FsbC0+cnhfcXVldWUpKQotCQkJCXByX2VycigiUnggcXVldWUgb2NjdXBpZWRcbiIpOwotCQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJmNhbGwtPnJ4X29vc19xdWV1ZSkpCi0JCQkJcHJfZXJyKCJPT1MgcXVldWUgb2NjdXBpZWRcbiIpOwotCQkJYnJlYWs7Ci0JCX0KKwkJcHJfZXJyKCJDYWxsICVwIHN0aWxsIGluIHVzZSAoJWQsJXMsJWx4LCVseCkhXG4iLAorCQkgICAgICAgY2FsbCwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSwKKwkJICAgICAgIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPnN0YXRlXSwKKwkJICAgICAgIGNhbGwtPmZsYWdzLCBjYWxsLT5ldmVudHMpOwogCi0JCXdyaXRlX3VubG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKKwkJd3JpdGVfdW5sb2NrKCZyeHJwY19jYWxsX2xvY2spOwogCQljb25kX3Jlc2NoZWQoKTsKLQkJd3JpdGVfbG9ja19iaCgmcnhycGNfY2FsbF9sb2NrKTsKKwkJd3JpdGVfbG9jaygmcnhycGNfY2FsbF9sb2NrKTsKIAl9CiAKLQl3cml0ZV91bmxvY2tfYmgoJnJ4cnBjX2NhbGxfbG9jayk7Ci0JX2xlYXZlKCIiKTsKLX0KLQotLyoKLSAqIGhhbmRsZSBjYWxsIGxpZmV0aW1lIGJlaW5nIGV4Y2VlZGVkCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfbGlmZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7Ci0KLQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJcmV0dXJuOwotCi0JX2VudGVyKCJ7JWR9IiwgY2FsbC0+ZGVidWdfaWQpOwotCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSkgewotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfTElGRV9USU1FUiwgJmNhbGwtPmV2ZW50cyk7Ci0JCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JfQotCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLX0KLQotLyoKLSAqIGhhbmRsZSByZXNlbmQgdGltZXIgZXhwaXJ5Ci0gKiAtIG1heSBub3QgdGFrZSBjYWxsLT5zdGF0ZV9sb2NrIGFzIHRoaXMgY2FuIGRlYWRsb2NrIGFnYWluc3QgZGVsX3RpbWVyX3N5bmMoKQotICovCi1zdGF0aWMgdm9pZCByeHJwY19yZXNlbmRfdGltZV9leHBpcmVkKHVuc2lnbmVkIGxvbmcgX2NhbGwpCi17Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSAoc3RydWN0IHJ4cnBjX2NhbGwgKikgX2NhbGw7Ci0KLQlfZW50ZXIoInslZH0iLCBjYWxsLT5kZWJ1Z19pZCk7Ci0KLQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJcmV0dXJuOwotCi0JY2xlYXJfYml0KFJYUlBDX0NBTExfUlVOX1JUSU1FUiwgJmNhbGwtPmZsYWdzKTsKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9SRVNFTkRfVElNRVIsICZjYWxsLT5ldmVudHMpKQotCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOwotfQotCi0vKgotICogaGFuZGxlIEFDSyB0aW1lciBleHBpcnkKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfYWNrX3RpbWVfZXhwaXJlZCh1bnNpZ25lZCBsb25nIF9jYWxsKQotewotCXN0cnVjdCByeHJwY19jYWxsICpjYWxsID0gKHN0cnVjdCByeHJwY19jYWxsICopIF9jYWxsOwotCi0JX2VudGVyKCJ7JWR9IiwgY2FsbC0+ZGVidWdfaWQpOwotCi0JaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpCi0JCXJldHVybjsKLQotCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgotCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX0FDSywgJmNhbGwtPmV2ZW50cykpCi0JCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCXdyaXRlX3VubG9jaygmcnhycGNfY2FsbF9sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9jb25uX2NsaWVudC5jIGIvbmV0L3J4cnBjL2Nvbm5fY2xpZW50LmMKaW5kZXggOWU5MWYyNy4uNjBlZjk2MCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2Nvbm5fY2xpZW50LmMKKysrIGIvbmV0L3J4cnBjL2Nvbm5fY2xpZW50LmMKQEAgLTcsNiArNyw2OCBAQAogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKICAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogQ2xpZW50IGNvbm5lY3Rpb25zIG5lZWQgdG8gYmUgY2FjaGVkIGZvciBhIGxpdHRsZSB3aGlsZSBhZnRlciB0aGV5J3ZlIG1hZGUgYQorICogY2FsbCBzbyBhcyB0byBoYW5kbGUgcmV0cmFuc21pdHRlZCBEQVRBIHBhY2tldHMgaW4gY2FzZSB0aGUgc2VydmVyIGRpZG4ndAorICogcmVjZWl2ZSB0aGUgZmluYWwgQUNLIG9yIHRlcm1pbmF0aW5nIEFCT1JUIHdlIHNlbnQgaXQuCisgKgorICogQ2xpZW50IGNvbm5lY3Rpb25zIGNhbiBiZSBpbiBvbmUgb2YgYSBudW1iZXIgb2YgY2FjaGUgc3RhdGVzOgorICoKKyAqICAoMSkgSU5BQ1RJVkUgLSBUaGUgY29ubmVjdGlvbiBpcyBub3QgaGVsZCBpbiBhbnkgbGlzdCBhbmQgbWF5IG5vdCBoYXZlIGJlZW4KKyAqICAgICAgZXhwb3NlZCB0byB0aGUgd29ybGQuICBJZiBpdCBoYXMgYmVlbiBwcmV2aW91c2x5IGV4cG9zZWQsIGl0IHdhcworICogICAgICBkaXNjYXJkZWQgZnJvbSB0aGUgaWRsZSBsaXN0IGFmdGVyIGV4cGlyaW5nLgorICoKKyAqICAoMikgV0FJVElORyAtIFRoZSBjb25uZWN0aW9uIGlzIHdhaXRpbmcgZm9yIHRoZSBudW1iZXIgb2YgY2xpZW50IGNvbm5zIHRvCisgKiAgICAgIGRyb3AgYmVsb3cgdGhlIG1heGltdW0gY2FwYWNpdHkuICBDYWxscyBtYXkgYmUgaW4gcHJvZ3Jlc3MgdXBvbiBpdCBmcm9tCisgKiAgICAgIHdoZW4gaXQgd2FzIGFjdGl2ZSBhbmQgZ290IGN1bGxlZC4KKyAqCisgKglUaGUgY29ubmVjdGlvbiBpcyBvbiB0aGUgcnhycGNfd2FpdGluZ19jbGllbnRfY29ubnMgbGlzdCB3aGljaCBpcyBrZXB0CisgKglpbiB0by1iZS1ncmFudGVkIG9yZGVyLiAgQ3VsbGVkIGNvbm5zIHdpdGggd2FpdGVycyBnbyB0byB0aGUgYmFjayBvZgorICoJdGhlIHF1ZXVlIGp1c3QgbGlrZSBuZXcgY29ubnMuCisgKgorICogICgzKSBBQ1RJVkUgLSBUaGUgY29ubmVjdGlvbiBoYXMgYXQgbGVhc3Qgb25lIGNhbGwgaW4gcHJvZ3Jlc3MgdXBvbiBpdCwgaXQKKyAqICAgICAgbWF5IGZyZWVseSBncmFudCBhdmFpbGFibGUgY2hhbm5lbHMgdG8gbmV3IGNhbGxzIGFuZCBjYWxscyBtYXkgYmUKKyAqICAgICAgd2FpdGluZyBvbiBpdCBmb3IgY2hhbm5lbHMgdG8gYmVjb21lIGF2YWlsYWJsZS4KKyAqCisgKglUaGUgY29ubmVjdGlvbiBpcyBvbiB0aGUgcnhycGNfYWN0aXZlX2NsaWVudF9jb25ucyBsaXN0IHdoaWNoIGlzIGtlcHQKKyAqCWluIGFjdGl2YXRpb24gb3JkZXIgZm9yIGN1bGxpbmcgcHVycG9zZXMuCisgKgorICoJcnhycGNfbnJfYWN0aXZlX2NsaWVudF9jb25ucyBpcyBoZWxkIGluY3JlbWVudGVkIGFsc28uCisgKgorICogICg0KSBDVUxMRUQgLSBUaGUgY29ubmVjdGlvbiBnb3Qgc3VtbWFyaWx5IGN1bGxlZCB0byB0cnkgYW5kIGZyZWUgdXAKKyAqICAgICAgY2FwYWNpdHkuICBDYWxscyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3Mgb24gdGhlIGNvbm5lY3Rpb24gYXJlIGFsbG93ZWQgdG8KKyAqICAgICAgY29udGludWUsIGJ1dCBuZXcgY2FsbHMgd2lsbCBoYXZlIHRvIHdhaXQuICBUaGVyZSBjYW4gYmUgbm8gd2FpdGVycyBpbgorICogICAgICB0aGlzIHN0YXRlIC0gdGhlIGNvbm4gd291bGQgaGF2ZSB0byBnbyB0byB0aGUgV0FJVElORyBzdGF0ZSBpbnN0ZWFkLgorICoKKyAqICAoNSkgSURMRSAtIFRoZSBjb25uZWN0aW9uIGhhcyBubyBjYWxscyBpbiBwcm9ncmVzcyB1cG9uIGl0IGFuZCBtdXN0IGhhdmUKKyAqICAgICAgYmVlbiBleHBvc2VkIHRvIHRoZSB3b3JsZCAoaWUuIHRoZSBFWFBPU0VEIGZsYWcgbXVzdCBiZSBzZXQpLiAgV2hlbiBpdAorICogICAgICBleHBpcmVzLCB0aGUgRVhQT1NFRCBmbGFnIGlzIGNsZWFyZWQgYW5kIHRoZSBjb25uZWN0aW9uIHRyYW5zaXRpb25zIHRvCisgKiAgICAgIHRoZSBJTkFDVElWRSBzdGF0ZS4KKyAqCisgKglUaGUgY29ubmVjdGlvbiBpcyBvbiB0aGUgcnhycGNfaWRsZV9jbGllbnRfY29ubnMgbGlzdCB3aGljaCBpcyBrZXB0IGluCisgKglvcmRlciBvZiBob3cgc29vbiB0aGV5J2xsIGV4cGlyZS4KKyAqCisgKiBUaGVyZSBhcmUgZmxhZ3Mgb2YgcmVsZXZhbmNlIHRvIHRoZSBjYWNoZToKKyAqCisgKiAgKDEpIEVYUE9TRUQgLSBUaGUgY29ubmVjdGlvbiBJRCBnb3QgZXhwb3NlZCB0byB0aGUgd29ybGQuICBJZiB0aGlzIGZsYWcgaXMKKyAqICAgICAgc2V0LCBhbiBleHRyYSByZWYgaXMgYWRkZWQgdG8gdGhlIGNvbm5lY3Rpb24gcHJldmVudGluZyBpdCBmcm9tIGJlaW5nCisgKiAgICAgIHJlYXBlZCB3aGVuIGl0IGhhcyBubyBjYWxscyBvdXRzdGFuZGluZy4gIFRoaXMgZmxhZyBpcyBjbGVhcmVkIGFuZCB0aGUKKyAqICAgICAgcmVmIGRyb3BwZWQgd2hlbiBhIGNvbm4gaXMgZGlzY2FyZGVkIGZyb20gdGhlIGlkbGUgbGlzdC4KKyAqCisgKiAgICAgIFRoaXMgYWxsb3dzIHVzIHRvIG1vdmUgdGVybWluYWwgY2FsbCBzdGF0ZSByZXRyYW5zbWlzc2lvbiB0byB0aGUKKyAqICAgICAgY29ubmVjdGlvbiBhbmQgdG8gZGlzY2FyZCB0aGUgY2FsbCBpbW1lZGlhdGVseSB3ZSB0aGluayBpdCBpcyBkb25lCisgKiAgICAgIHdpdGguICBJdCBhbHNvIGdpdmUgdXMgYSBjaGFuY2UgdG8gcmV1c2UgdGhlIGNvbm5lY3Rpb24uCisgKgorICogICgyKSBET05UX1JFVVNFIC0gVGhlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGRpc2NhcmRlZCBhcyBzb29uIGFzIHBvc3NpYmxlIGFuZAorICogICAgICBzaG91bGQgbm90IGJlIHJldXNlZC4gIFRoaXMgaXMgc2V0IHdoZW4gYW4gZXhjbHVzaXZlIGNvbm5lY3Rpb24gaXMgdXNlZAorICogICAgICBvciBhIGNhbGwgSUQgY291bnRlciBvdmVyZmxvd3MuCisgKgorICogVGhlIGNhY2hpbmcgc3RhdGUgbWF5IG9ubHkgYmUgY2hhbmdlZCBpZiB0aGUgY2FjaGUgbG9jayBpcyBoZWxkLgorICoKKyAqIFRoZXJlIGFyZSB0d28gaWRsZSBjbGllbnQgY29ubmVjdGlvbiBleHBpcnkgZHVyYXRpb25zLiAgSWYgdGhlIHRvdGFsIG51bWJlcgorICogb2YgY29ubmVjdGlvbnMgaXMgYmVsb3cgdGhlIHJlYXAgdGhyZXNob2xkLCB3ZSB1c2UgdGhlIG5vcm1hbCBkdXJhdGlvbjsgaWYKKyAqIGl0J3MgYWJvdmUsIHdlIHVzZSB0aGUgZmFzdCBkdXJhdGlvbi4KICAqLwogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CkBAIC0xNiwyNyArNzgsNTAgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKK19fcmVhZF9tb3N0bHkgdW5zaWduZWQgaW50IHJ4cnBjX21heF9jbGllbnRfY29ubmVjdGlvbnMgPSAxMDAwOworX19yZWFkX21vc3RseSB1bnNpZ25lZCBpbnQgcnhycGNfcmVhcF9jbGllbnRfY29ubmVjdGlvbnMgPSA5MDA7CitfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCByeHJwY19jb25uX2lkbGVfY2xpZW50X2V4cGlyeSA9IDIgKiA2MCAqIEhaOworX19yZWFkX21vc3RseSB1bnNpZ25lZCBpbnQgcnhycGNfY29ubl9pZGxlX2NsaWVudF9mYXN0X2V4cGlyeSA9IDIgKiBIWjsKKworc3RhdGljIHVuc2lnbmVkIGludCByeHJwY19ucl9jbGllbnRfY29ubnM7CitzdGF0aWMgdW5zaWduZWQgaW50IHJ4cnBjX25yX2FjdGl2ZV9jbGllbnRfY29ubnM7CitzdGF0aWMgX19yZWFkX21vc3RseSBib29sIHJ4cnBjX2tpbGxfYWxsX2NsaWVudF9jb25uczsKKworc3RhdGljIERFRklORV9TUElOTE9DSyhyeHJwY19jbGllbnRfY29ubl9jYWNoZV9sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socnhycGNfY2xpZW50X2Nvbm5fZGlzY2FyZF9tdXRleCk7CitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX3dhaXRpbmdfY2xpZW50X2Nvbm5zKTsKK3N0YXRpYyBMSVNUX0hFQUQocnhycGNfYWN0aXZlX2NsaWVudF9jb25ucyk7CitzdGF0aWMgTElTVF9IRUFEKHJ4cnBjX2lkbGVfY2xpZW50X2Nvbm5zKTsKKwogLyoKICAqIFdlIHVzZSBtYWNoaW5lLXVuaXF1ZSBJRHMgZm9yIG91ciBjbGllbnQgY29ubmVjdGlvbnMuCiAgKi8KIERFRklORV9JRFIocnhycGNfY2xpZW50X2Nvbm5faWRzKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socnhycGNfY29ubl9pZF9sb2NrKTsKIAorc3RhdGljIHZvaWQgcnhycGNfY3VsbF9hY3RpdmVfY2xpZW50X2Nvbm5zKHZvaWQpOworc3RhdGljIHZvaWQgcnhycGNfZGlzY2FyZF9leHBpcmVkX2NsaWVudF9jb25ucyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7CisKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhyeHJwY19jbGllbnRfY29ubl9yZWFwLAorCQkJICAgIHJ4cnBjX2Rpc2NhcmRfZXhwaXJlZF9jbGllbnRfY29ubnMpOworCitjb25zdCBjaGFyIHJ4cnBjX2Nvbm5fY2FjaGVfc3RhdGVzW1JYUlBDX0NPTk5fX05SX0NBQ0hFX1NUQVRFU11bNV0gPSB7CisJW1JYUlBDX0NPTk5fQ0xJRU5UX0lOQUNUSVZFXQk9ICJJbmFjIiwKKwlbUlhSUENfQ09OTl9DTElFTlRfV0FJVElOR10JPSAiV2FpdCIsCisJW1JYUlBDX0NPTk5fQ0xJRU5UX0FDVElWRV0JPSAiQWN0diIsCisJW1JYUlBDX0NPTk5fQ0xJRU5UX0NVTExFRF0JPSAiQ3VsbCIsCisJW1JYUlBDX0NPTk5fQ0xJRU5UX0lETEVdCT0gIklkbGUiLAorfTsKKwogLyoKICAqIEdldCBhIGNvbm5lY3Rpb24gSUQgYW5kIGVwb2NoIGZvciBhIGNsaWVudCBjb25uZWN0aW9uIGZyb20gdGhlIGdsb2JhbCBwb29sLgogICogVGhlIGNvbm5lY3Rpb24gc3RydWN0IHBvaW50ZXIgaXMgdGhlbiByZWNvcmRlZCBpbiB0aGUgaWRyIHJhZGl4IHRyZWUuICBUaGUKLSAqIGVwb2NoIGlzIGNoYW5nZWQgaWYgdGhpcyB3cmFwcy4KLSAqCi0gKiBUT0RPOiBUaGUgSURSIHRyZWUgZ2V0cyB2ZXJ5IGV4cGVuc2l2ZSBvbiBtZW1vcnkgaWYgdGhlIGNvbm5lY3Rpb24gSURzIGFyZQotICogd2lkZWx5IHNjYXR0ZXJlZCB0aHJvdWdob3V0IHRoZSBudW1iZXIgc3BhY2UsIHNvIHdlIHNoYWxsIG5lZWQgdG8gcmV0aXJlCi0gKiBjb25uZWN0aW9ucyB0aGF0IGhhdmUsIHNheSwgYW4gSUQgbW9yZSB0aGFuIGZvdXIgdGltZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCi0gKiBjbGllbnQgY29ubnMgYXdheSBmcm9tIHRoZSBjdXJyZW50IGFsbG9jYXRpb24gcG9pbnQgdG8gdHJ5IGFuZCBrZWVwIHRoZSBJRHMKLSAqIGNvbmNlbnRyYXRlZC4gIFdlIHdpbGwgYWxzbyBuZWVkIHRvIHJldGlyZSBjb25uZWN0aW9ucyBmcm9tIGFuIG9sZCBlcG9jaC4KKyAqIGVwb2NoIGRvZXNuJ3QgY2hhbmdlIHVudGlsIHRoZSBjbGllbnQgaXMgcmVib290ZWQgKG9yLCBhdCBsZWFzdCwgdW5sZXNzIHRoZQorICogbW9kdWxlIGlzIHVubG9hZGVkKS4KICAqLwogc3RhdGljIGludCByeHJwY19nZXRfY2xpZW50X2Nvbm5lY3Rpb25faWQoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCiAJCQkJCSAgZ2ZwX3QgZ2ZwKQogewotCXUzMiBlcG9jaDsKIAlpbnQgaWQ7CiAKIAlfZW50ZXIoIiIpOwpAQCAtNDQsMzQgKzEyOSwxOCBAQAogCWlkcl9wcmVsb2FkKGdmcCk7CiAJc3Bpbl9sb2NrKCZyeHJwY19jb25uX2lkX2xvY2spOwogCi0JZXBvY2ggPSByeHJwY19lcG9jaDsKLQotCS8qIFdlIGNvdWxkIHVzZSBpZHJfYWxsb2NfY3ljbGljKCkgaGVyZSwgYnV0IHdlIHJlYWxseSBuZWVkIHRvIGtub3cKLQkgKiB3aGVuIHRoZSB0aGluZyB3cmFwcyBzbyB0aGF0IHdlIGNhbiBhZHZhbmNlIHRoZSBlcG9jaC4KLQkgKi8KLQlpZiAocnhycGNfY2xpZW50X2Nvbm5faWRzLmN1ciA9PSAwKQotCQlyeHJwY19jbGllbnRfY29ubl9pZHMuY3VyID0gMTsKLQlpZCA9IGlkcl9hbGxvYygmcnhycGNfY2xpZW50X2Nvbm5faWRzLCBjb25uLAotCQkgICAgICAgcnhycGNfY2xpZW50X2Nvbm5faWRzLmN1ciwgMHg0MDAwMDAwMCwgR0ZQX05PV0FJVCk7Ci0JaWYgKGlkIDwgMCkgewotCQlpZiAoaWQgIT0gLUVOT1NQQykKLQkJCWdvdG8gZXJyb3I7Ci0JCWlkID0gaWRyX2FsbG9jKCZyeHJwY19jbGllbnRfY29ubl9pZHMsIGNvbm4sCi0JCQkgICAgICAgMSwgMHg0MDAwMDAwMCwgR0ZQX05PV0FJVCk7Ci0JCWlmIChpZCA8IDApCi0JCQlnb3RvIGVycm9yOwotCQllcG9jaCsrOwotCQlyeHJwY19lcG9jaCA9IGVwb2NoOwotCX0KLQlyeHJwY19jbGllbnRfY29ubl9pZHMuY3VyID0gaWQgKyAxOworCWlkID0gaWRyX2FsbG9jX2N5Y2xpYygmcnhycGNfY2xpZW50X2Nvbm5faWRzLCBjb25uLAorCQkJICAgICAgMSwgMHg0MDAwMDAwMCwgR0ZQX05PV0FJVCk7CisJaWYgKGlkIDwgMCkKKwkJZ290byBlcnJvcjsKIAogCXNwaW5fdW5sb2NrKCZyeHJwY19jb25uX2lkX2xvY2spOwogCWlkcl9wcmVsb2FkX2VuZCgpOwogCi0JY29ubi0+cHJvdG8uZXBvY2ggPSBlcG9jaDsKKwljb25uLT5wcm90by5lcG9jaCA9IHJ4cnBjX2Vwb2NoOwogCWNvbm4tPnByb3RvLmNpZCA9IGlkIDw8IFJYUlBDX0NJRFNISUZUOwogCXNldF9iaXQoUlhSUENfQ09OTl9IQVNfSURSLCAmY29ubi0+ZmxhZ3MpOwotCV9sZWF2ZSgiIFtDSUQgJXg6JXhdIiwgZXBvY2gsIGNvbm4tPnByb3RvLmNpZCk7CisJX2xlYXZlKCIgW0NJRCAleF0iLCBjb25uLT5wcm90by5jaWQpOwogCXJldHVybiAwOwogCiBlcnJvcjoKQEAgLTExNCw4ICsxODMsNyBAQAogfQogCiAvKgotICogQWxsb2NhdGUgYSBjbGllbnQgY29ubmVjdGlvbi4gIFRoZSBjYWxsZXIgbXVzdCB0YWtlIGNhcmUgdG8gY2xlYXIgYW55Ci0gKiBwYWRkaW5nIGJ5dGVzIGluICpjcC4KKyAqIEFsbG9jYXRlIGEgY2xpZW50IGNvbm5lY3Rpb24uCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqCiByeHJwY19hbGxvY19jbGllbnRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubl9wYXJhbWV0ZXJzICpjcCwgZ2ZwX3QgZ2ZwKQpAQCAtMTMxLDYgKzE5OSwxMCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKKwlhdG9taWNfc2V0KCZjb25uLT51c2FnZSwgMSk7CisJaWYgKGNwLT5leGNsdXNpdmUpCisJCV9fc2V0X2JpdChSWFJQQ19DT05OX0RPTlRfUkVVU0UsICZjb25uLT5mbGFncyk7CisKIAljb25uLT5wYXJhbXMJCT0gKmNwOwogCWNvbm4tPm91dF9jbGllbnRmbGFnCT0gUlhSUENfQ0xJRU5UX0lOSVRJQVRFRDsKIAljb25uLT5zdGF0ZQkJPSBSWFJQQ19DT05OX0NMSUVOVDsKQEAgLTE0OCw3ICsyMjAsNyBAQAogCQlnb3RvIGVycm9yXzI7CiAKIAl3cml0ZV9sb2NrKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJmNvbm4tPmxpbmssICZyeHJwY19jb25uZWN0aW9ucyk7CisJbGlzdF9hZGRfdGFpbCgmY29ubi0+cHJvY19saW5rLCAmcnhycGNfY29ubmVjdGlvbl9wcm9jX2xpc3QpOwogCXdyaXRlX3VubG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKIAogCS8qIFdlIHN0ZWFsIHRoZSBjYWxsZXIncyBwZWVyIHJlZi4gKi8KQEAgLTE1Niw2ICsyMjgsOSBAQAogCXJ4cnBjX2dldF9sb2NhbChjb25uLT5wYXJhbXMubG9jYWwpOwogCWtleV9nZXQoY29ubi0+cGFyYW1zLmtleSk7CiAKKwl0cmFjZV9yeHJwY19jb25uKGNvbm4sIHJ4cnBjX2Nvbm5fbmV3X2NsaWVudCwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwKKwkJCSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X2FsbG9jKTsKIAlfbGVhdmUoIiA9ICVwIiwgY29ubik7CiAJcmV0dXJuIGNvbm47CiAKQEAgLTE3MCwzMiArMjQ1LDY4IEBACiB9CiAKIC8qCi0gKiBmaW5kIGEgY29ubmVjdGlvbiBmb3IgYSBjYWxsCi0gKiAtIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBJUlFzIGVuYWJsZWQKKyAqIERldGVybWluZSBpZiBhIGNvbm5lY3Rpb24gbWF5IGJlIHJldXNlZC4KICAqLwotaW50IHJ4cnBjX2Nvbm5lY3RfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKLQkJICAgICAgIHN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgKmNwLAotCQkgICAgICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngsCi0JCSAgICAgICBnZnBfdCBnZnApCitzdGF0aWMgYm9vbCByeHJwY19tYXlfcmV1c2VfY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwlpbnQgaWRfY3Vyc29yLCBpZCwgZGlzdGFuY2UsIGxpbWl0OworCisJaWYgKHRlc3RfYml0KFJYUlBDX0NPTk5fRE9OVF9SRVVTRSwgJmNvbm4tPmZsYWdzKSkKKwkJZ290byBkb250X3JldXNlOworCisJaWYgKGNvbm4tPnByb3RvLmVwb2NoICE9IHJ4cnBjX2Vwb2NoKQorCQlnb3RvIG1hcmtfZG9udF9yZXVzZTsKKworCS8qIFRoZSBJRFIgdHJlZSBnZXRzIHZlcnkgZXhwZW5zaXZlIG9uIG1lbW9yeSBpZiB0aGUgY29ubmVjdGlvbiBJRHMgYXJlCisJICogd2lkZWx5IHNjYXR0ZXJlZCB0aHJvdWdob3V0IHRoZSBudW1iZXIgc3BhY2UsIHNvIHdlIHNoYWxsIHdhbnQgdG8KKwkgKiBraWxsIG9mZiBjb25uZWN0aW9ucyB0aGF0LCBzYXksIGhhdmUgYW4gSUQgbW9yZSB0aGFuIGFib3V0IGZvdXIKKwkgKiB0aW1lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2xpZW50IGNvbm5zIGF3YXkgZnJvbSB0aGUgY3VycmVudAorCSAqIGFsbG9jYXRpb24gcG9pbnQgdG8gdHJ5IGFuZCBrZWVwIHRoZSBJRHMgY29uY2VudHJhdGVkLgorCSAqLworCWlkX2N1cnNvciA9IFJFQURfT05DRShyeHJwY19jbGllbnRfY29ubl9pZHMuY3VyKTsKKwlpZCA9IGNvbm4tPnByb3RvLmNpZCA+PiBSWFJQQ19DSURTSElGVDsKKwlkaXN0YW5jZSA9IGlkIC0gaWRfY3Vyc29yOworCWlmIChkaXN0YW5jZSA8IDApCisJCWRpc3RhbmNlID0gLWRpc3RhbmNlOworCWxpbWl0ID0gcm91bmRfdXAocnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucywgSURSX1NJWkUpICogNDsKKwlpZiAoZGlzdGFuY2UgPiBsaW1pdCkKKwkJZ290byBtYXJrX2RvbnRfcmV1c2U7CisKKwlyZXR1cm4gdHJ1ZTsKKworbWFya19kb250X3JldXNlOgorCXNldF9iaXQoUlhSUENfQ09OTl9ET05UX1JFVVNFLCAmY29ubi0+ZmxhZ3MpOworZG9udF9yZXVzZToKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBDcmVhdGUgb3IgZmluZCBhIGNsaWVudCBjb25uZWN0aW9uIHRvIHVzZSBmb3IgYSBjYWxsLgorICoKKyAqIElmIHdlIHJldHVybiB3aXRoIGEgY29ubmVjdGlvbiwgdGhlIGNhbGwgd2lsbCBiZSBvbiBpdHMgd2FpdGluZyBsaXN0LiAgSXQncworICogbGVmdCB0byB0aGUgY2FsbGVyIHRvIGFzc2lnbiBhIGNoYW5uZWwgYW5kIHdha2UgdXAgdGhlIGNhbGwuCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfZ2V0X2NsaWVudF9jb25uKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSBzdHJ1Y3QgcnhycGNfY29ubl9wYXJhbWV0ZXJzICpjcCwKKwkJCQkgc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngsCisJCQkJIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwgKmNhbmRpZGF0ZSA9IE5VTEw7CiAJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9IGNwLT5sb2NhbDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcCwgKipwcCwgKnBhcmVudDsKIAlsb25nIGRpZmY7Ci0JaW50IGNoYW47Ci0KLQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCWludCByZXQgPSAtRU5PTUVNOwogCiAJX2VudGVyKCJ7JWQsJWx4fSwiLCBjYWxsLT5kZWJ1Z19pZCwgY2FsbC0+dXNlcl9jYWxsX0lEKTsKIAogCWNwLT5wZWVyID0gcnhycGNfbG9va3VwX3BlZXIoY3AtPmxvY2FsLCBzcngsIGdmcCk7CiAJaWYgKCFjcC0+cGVlcikKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CiAKKwkvKiBJZiB0aGUgY29ubmVjdGlvbiBpcyBub3QgbWVhbnQgdG8gYmUgZXhjbHVzaXZlLCBzZWFyY2ggdGhlIGF2YWlsYWJsZQorCSAqIGNvbm5lY3Rpb25zIHRvIHNlZSBpZiB0aGUgY29ubmVjdGlvbiB3ZSB3YW50IHRvIHVzZSBhbHJlYWR5IGV4aXN0cy4KKwkgKi8KIAlpZiAoIWNwLT5leGNsdXNpdmUpIHsKLQkJLyogU2VhcmNoIGZvciBhIGV4aXN0aW5nIGNsaWVudCBjb25uZWN0aW9uIHVubGVzcyB0aGlzIGlzIGdvaW5nCi0JCSAqIHRvIGJlIGEgY29ubmVjdGlvbiB0aGF0J3MgdXNlZCBleGNsdXNpdmVseSBmb3IgYSBzaW5nbGUgY2FsbC4KLQkJICovCiAJCV9kZWJ1Zygic2VhcmNoIDEiKTsKIAkJc3Bpbl9sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOwogCQlwID0gbG9jYWwtPmNsaWVudF9jb25ucy5yYl9ub2RlOwpAQCAtMjA2LDM5ICszMTcsNTYgQEAKIAkJCWRpZmYgPSAoY21wKHBlZXIpID86CiAJCQkJY21wKGtleSkgPzoKIAkJCQljbXAoc2VjdXJpdHlfbGV2ZWwpKTsKLQkJCWlmIChkaWZmIDwgMCkKKyN1bmRlZiBjbXAKKwkJCWlmIChkaWZmIDwgMCkgewogCQkJCXAgPSBwLT5yYl9sZWZ0OwotCQkJZWxzZSBpZiAoZGlmZiA+IDApCisJCQl9IGVsc2UgaWYgKGRpZmYgPiAwKSB7CiAJCQkJcCA9IHAtPnJiX3JpZ2h0OwotCQkJZWxzZQotCQkJCWdvdG8gZm91bmRfZXh0YW50X2Nvbm47CisJCQl9IGVsc2UgeworCQkJCWlmIChyeHJwY19tYXlfcmV1c2VfY29ubihjb25uKSAmJgorCQkJCSAgICByeHJwY19nZXRfY29ubmVjdGlvbl9tYXliZShjb25uKSkKKwkJCQkJZ290byBmb3VuZF9leHRhbnRfY29ubjsKKwkJCQkvKiBUaGUgY29ubmVjdGlvbiBuZWVkcyByZXBsYWNpbmcuICBJdCdzIGJldHRlcgorCQkJCSAqIHRvIGVmZmVjdCB0aGF0IHdoZW4gd2UgaGF2ZSBzb21ldGhpbmcgdG8KKwkJCQkgKiByZXBsYWNlIGl0IHdpdGggc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvCisJCQkJICogcmViYWxhbmNlIHRoZSB0cmVlIHR3aWNlLgorCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQogCQl9CiAJCXNwaW5fdW5sb2NrKCZsb2NhbC0+Y2xpZW50X2Nvbm5zX2xvY2spOwogCX0KIAotCS8qIFdlIGRpZG4ndCBmaW5kIGEgY29ubmVjdGlvbiBvciB3ZSB3YW50IGFuIGV4Y2x1c2l2ZSBvbmUuICovCi0JX2RlYnVnKCJnZXQgbmV3IGNvbm4iKTsKKwkvKiBUaGVyZSB3YXNuJ3QgYSBjb25uZWN0aW9uIHlldCBvciB3ZSBuZWVkIGFuIGV4Y2x1c2l2ZSBjb25uZWN0aW9uLgorCSAqIFdlIG5lZWQgdG8gY3JlYXRlIGEgY2FuZGlkYXRlIGFuZCB0aGVuIHBvdGVudGlhbGx5IHJlZG8gdGhlIHNlYXJjaAorCSAqIGluIGNhc2Ugd2UncmUgcmFjaW5nIHdpdGggYW5vdGhlciB0aHJlYWQgYWxzbyB0cnlpbmcgdG8gY29ubmVjdCBvbiBhCisJICogc2hhcmVhYmxlIGNvbm5lY3Rpb24uCisJICovCisJX2RlYnVnKCJuZXcgY29ubiIpOwogCWNhbmRpZGF0ZSA9IHJ4cnBjX2FsbG9jX2NsaWVudF9jb25uZWN0aW9uKGNwLCBnZnApOwotCWlmICghY2FuZGlkYXRlKSB7Ci0JCV9sZWF2ZSgiID0gLUVOT01FTSIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoSVNfRVJSKGNhbmRpZGF0ZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihjYW5kaWRhdGUpOworCQlnb3RvIGVycm9yX3BlZXI7CiAJfQogCisJLyogQWRkIHRoZSBjYWxsIHRvIHRoZSBuZXcgY29ubmVjdGlvbidzIHdhaXRpbmcgbGlzdCBpbiBjYXNlIHdlJ3JlCisJICogZ29pbmcgdG8gaGF2ZSB0byB3YWl0IGZvciB0aGUgY29ubmVjdGlvbiB0byBjb21lIGxpdmUuICBJdCdzIG91cgorCSAqIGNvbm5lY3Rpb24sIHNvIHdlIHdhbnQgZmlyc3QgZGlicyBvbiB0aGUgY2hhbm5lbCBzbG90cy4gIFdlIHdvdWxkCisJICogbm9ybWFsbHkgaGF2ZSB0byB0YWtlIGNoYW5uZWxfbG9jayBidXQgd2UgZG8gdGhpcyBiZWZvcmUgYW55b25lIGVsc2UKKwkgKiBjYW4gc2VlIHRoZSBjb25uZWN0aW9uLgorCSAqLworCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmNoYW5fd2FpdF9saW5rLCAmY2FuZGlkYXRlLT53YWl0aW5nX2NhbGxzKTsKKwogCWlmIChjcC0+ZXhjbHVzaXZlKSB7Ci0JCS8qIEFzc2lnbiB0aGUgY2FsbCBvbiBhbiBleGNsdXNpdmUgY29ubmVjdGlvbiB0byBjaGFubmVsIDAgYW5kCi0JCSAqIGRvbid0IGFkZCB0aGUgY29ubmVjdGlvbiB0byB0aGUgZW5kcG9pbnQncyBzaGFyZWFibGUgY29ubgotCQkgKiBsb29rdXAgdHJlZS4KLQkJICovCi0JCV9kZWJ1ZygiZXhjbHVzaXZlIGNoYW4gMCIpOwotCQljb25uID0gY2FuZGlkYXRlOwotCQlhdG9taWNfc2V0KCZjb25uLT5hdmFpbF9jaGFucywgUlhSUENfTUFYQ0FMTFMgLSAxKTsKLQkJc3Bpbl9sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwotCQljaGFuID0gMDsKLQkJZ290byBmb3VuZF9jaGFubmVsOworCQljYWxsLT5jb25uID0gY2FuZGlkYXRlOworCQljYWxsLT5zZWN1cml0eV9peCA9IGNhbmRpZGF0ZS0+c2VjdXJpdHlfaXg7CisJCV9sZWF2ZSgiID0gMCBbZXhjbHVzaXZlICVkXSIsIGNhbmRpZGF0ZS0+ZGVidWdfaWQpOworCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBXZSBuZWVkIHRvIHJlZG8gdGhlIHNlYXJjaCBiZWZvcmUgYXR0ZW1wdGluZyB0byBhZGQgYSBuZXcgY29ubmVjdGlvbgotCSAqIGxlc3Qgd2UgcmFjZSB3aXRoIHNvbWVvbmUgZWxzZSBhZGRpbmcgYSBjb25mbGljdGluZyBpbnN0YW5jZS4KKwkvKiBQdWJsaXNoIHRoZSBuZXcgY29ubmVjdGlvbiBmb3IgdXNlcnNwYWNlIHRvIGZpbmQuICBXZSBuZWVkIHRvIHJlZG8KKwkgKiB0aGUgc2VhcmNoIGJlZm9yZSBkb2luZyB0aGlzIGxlc3Qgd2UgcmFjZSB3aXRoIHNvbWVvbmUgZWxzZSBhZGRpbmcgYQorCSAqIGNvbmZsaWN0aW5nIGluc3RhbmNlLgogCSAqLwogCV9kZWJ1Zygic2VhcmNoIDIiKTsKIAlzcGluX2xvY2soJmxvY2FsLT5jbGllbnRfY29ubnNfbG9jayk7CkBAIC0yNDksMTI0ICszNzcsNzExIEBACiAJCXBhcmVudCA9ICpwcDsKIAkJY29ubiA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sIGNsaWVudF9ub2RlKTsKIAorI2RlZmluZSBjbXAoWCkgKChsb25nKWNvbm4tPnBhcmFtcy5YIC0gKGxvbmcpY2FuZGlkYXRlLT5wYXJhbXMuWCkKIAkJZGlmZiA9IChjbXAocGVlcikgPzoKIAkJCWNtcChrZXkpID86CiAJCQljbXAoc2VjdXJpdHlfbGV2ZWwpKTsKLQkJaWYgKGRpZmYgPCAwKQorI3VuZGVmIGNtcAorCQlpZiAoZGlmZiA8IDApIHsKIAkJCXBwID0gJigqcHApLT5yYl9sZWZ0OwotCQllbHNlIGlmIChkaWZmID4gMCkKKwkJfSBlbHNlIGlmIChkaWZmID4gMCkgewogCQkJcHAgPSAmKCpwcCktPnJiX3JpZ2h0OwotCQllbHNlCi0JCQlnb3RvIGZvdW5kX2V4dGFudF9jb25uOworCQl9IGVsc2UgeworCQkJaWYgKHJ4cnBjX21heV9yZXVzZV9jb25uKGNvbm4pICYmCisJCQkgICAgcnhycGNfZ2V0X2Nvbm5lY3Rpb25fbWF5YmUoY29ubikpCisJCQkJZ290byBmb3VuZF9leHRhbnRfY29ubjsKKwkJCS8qIFRoZSBvbGQgY29ubmVjdGlvbiBpcyBmcm9tIGFuIG91dGRhdGVkIGVwb2NoLiAqLworCQkJX2RlYnVnKCJyZXBsYWNlIGNvbm4iKTsKKwkJCWNsZWFyX2JpdChSWFJQQ19DT05OX0lOX0NMSUVOVF9DT05OUywgJmNvbm4tPmZsYWdzKTsKKwkJCXJiX3JlcGxhY2Vfbm9kZSgmY29ubi0+Y2xpZW50X25vZGUsCisJCQkJCSZjYW5kaWRhdGUtPmNsaWVudF9ub2RlLAorCQkJCQkmbG9jYWwtPmNsaWVudF9jb25ucyk7CisJCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgLTEsIHJ4cnBjX2NsaWVudF9yZXBsYWNlKTsKKwkJCWdvdG8gY2FuZGlkYXRlX3B1Ymxpc2hlZDsKKwkJfQogCX0KIAotCS8qIFRoZSBzZWNvbmQgc2VhcmNoIGFsc28gZmFpbGVkOyBzaW1wbHkgYWRkIHRoZSBuZXcgY29ubmVjdGlvbiB3aXRoCi0JICogdGhlIG5ldyBjYWxsIGluIGNoYW5uZWwgMC4gIE5vdGUgdGhhdCB3ZSBuZWVkIHRvIHRha2UgdGhlIGNoYW5uZWwKLQkgKiBsb2NrIGJlZm9yZSBkcm9wcGluZyB0aGUgY2xpZW50IGNvbm4gbG9jay4KLQkgKi8KIAlfZGVidWcoIm5ldyBjb25uIik7Ci0Jc2V0X2JpdChSWFJQQ19DT05OX0lOX0NMSUVOVF9DT05OUywgJmNhbmRpZGF0ZS0+ZmxhZ3MpOwogCXJiX2xpbmtfbm9kZSgmY2FuZGlkYXRlLT5jbGllbnRfbm9kZSwgcGFyZW50LCBwcCk7CiAJcmJfaW5zZXJ0X2NvbG9yKCZjYW5kaWRhdGUtPmNsaWVudF9ub2RlLCAmbG9jYWwtPmNsaWVudF9jb25ucyk7Ci1hdHRhY2hlZDoKLQljb25uID0gY2FuZGlkYXRlOwotCWNhbmRpZGF0ZSA9IE5VTEw7CiAKLQlhdG9taWNfc2V0KCZjb25uLT5hdmFpbF9jaGFucywgUlhSUENfTUFYQ0FMTFMgLSAxKTsKLQlzcGluX2xvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7CitjYW5kaWRhdGVfcHVibGlzaGVkOgorCXNldF9iaXQoUlhSUENfQ09OTl9JTl9DTElFTlRfQ09OTlMsICZjYW5kaWRhdGUtPmZsYWdzKTsKKwljYWxsLT5jb25uID0gY2FuZGlkYXRlOworCWNhbGwtPnNlY3VyaXR5X2l4ID0gY2FuZGlkYXRlLT5zZWN1cml0eV9peDsKIAlzcGluX3VubG9jaygmbG9jYWwtPmNsaWVudF9jb25uc19sb2NrKTsKLQljaGFuID0gMDsKLQotZm91bmRfY2hhbm5lbDoKLQlfZGVidWcoImZvdW5kIGNoYW4iKTsKLQljYWxsLT5jb25uCT0gY29ubjsKLQljYWxsLT5jaGFubmVsCT0gY2hhbjsKLQljYWxsLT5lcG9jaAk9IGNvbm4tPnByb3RvLmVwb2NoOwotCWNhbGwtPmNpZAk9IGNvbm4tPnByb3RvLmNpZCB8IGNoYW47Ci0JY2FsbC0+Y2FsbF9pZAk9ICsrY29ubi0+Y2hhbm5lbHNbY2hhbl0uY2FsbF9jb3VudGVyOwotCWNvbm4tPmNoYW5uZWxzW2NoYW5dLmNhbGxfaWQgPSBjYWxsLT5jYWxsX2lkOwotCXJjdV9hc3NpZ25fcG9pbnRlcihjb25uLT5jaGFubmVsc1tjaGFuXS5jYWxsLCBjYWxsKTsKLQotCV9uZXQoIkNPTk5FQ1QgY2FsbCAlZCBvbiBjb25uICVkIiwgY2FsbC0+ZGVidWdfaWQsIGNvbm4tPmRlYnVnX2lkKTsKLQotCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwotCXJ4cnBjX3B1dF9wZWVyKGNwLT5wZWVyKTsKLQljcC0+cGVlciA9IE5VTEw7Ci0JX2xlYXZlKCIgPSAlcCB7dT0lZH0iLCBjb25uLCBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpKTsKKwlfbGVhdmUoIiA9IDAgW25ldyAlZF0iLCBjYW5kaWRhdGUtPmRlYnVnX2lkKTsKIAlyZXR1cm4gMDsKIAotCS8qIFdlIGZvdW5kIGEgcG90ZW50aWFsbHkgc3VpdGFibGUgY29ubmVjdGlvbiBhbHJlYWR5IGluIGV4aXN0ZW5jZS4gIElmCi0JICogd2UgY2FuIHJldXNlIGl0IChpZS4gaXRzIHVzYWdlIGNvdW50IGhhc24ndCBiZWVuIHJlZHVjZWQgdG8gMCBieSB0aGUKLQkgKiByZWFwZXIpLCBkaXNjYXJkIGFueSBjYW5kaWRhdGUgd2UgbWF5IGhhdmUgYWxsb2NhdGVkLCBhbmQgdHJ5IHRvIGdldAotCSAqIGEgY2hhbm5lbCBvbiB0aGlzIG9uZSwgb3RoZXJ3aXNlIHdlIGhhdmUgdG8gcmVwbGFjZSBpdC4KKwkvKiBXZSBjb21lIGhlcmUgaWYgd2UgZm91bmQgYSBzdWl0YWJsZSBjb25uZWN0aW9uIGFscmVhZHkgaW4gZXhpc3RlbmNlLgorCSAqIERpc2NhcmQgYW55IGNhbmRpZGF0ZSB3ZSBtYXkgaGF2ZSBhbGxvY2F0ZWQsIGFuZCB0cnkgdG8gZ2V0IGEKKwkgKiBjaGFubmVsIG9uIHRoaXMgb25lLgogCSAqLwogZm91bmRfZXh0YW50X2Nvbm46CiAJX2RlYnVnKCJmb3VuZCBjb25uIik7Ci0JaWYgKCFyeHJwY19nZXRfY29ubmVjdGlvbl9tYXliZShjb25uKSkgewotCQlzZXRfYml0KFJYUlBDX0NPTk5fSU5fQ0xJRU5UX0NPTk5TLCAmY2FuZGlkYXRlLT5mbGFncyk7Ci0JCXJiX3JlcGxhY2Vfbm9kZSgmY29ubi0+Y2xpZW50X25vZGUsCi0JCQkJJmNhbmRpZGF0ZS0+Y2xpZW50X25vZGUsCi0JCQkJJmxvY2FsLT5jbGllbnRfY29ubnMpOwotCQljbGVhcl9iaXQoUlhSUENfQ09OTl9JTl9DTElFTlRfQ09OTlMsICZjb25uLT5mbGFncyk7Ci0JCWdvdG8gYXR0YWNoZWQ7Ci0JfQotCiAJc3Bpbl91bmxvY2soJmxvY2FsLT5jbGllbnRfY29ubnNfbG9jayk7CiAKLQlyeHJwY19wdXRfY29ubmVjdGlvbihjYW5kaWRhdGUpOwotCi0JaWYgKCFhdG9taWNfYWRkX3VubGVzcygmY29ubi0+YXZhaWxfY2hhbnMsIC0xLCAwKSkgewotCQlpZiAoIWdmcGZsYWdzX2FsbG93X2Jsb2NraW5nKGdmcCkpIHsKLQkJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOwotCQkJX2xlYXZlKCIgPSAtRUFHQUlOIik7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCi0JCWFkZF93YWl0X3F1ZXVlKCZjb25uLT5jaGFubmVsX3dxLCAmbXlzZWxmKTsKLQkJZm9yICg7OykgewotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCWlmIChhdG9taWNfYWRkX3VubGVzcygmY29ubi0+YXZhaWxfY2hhbnMsIC0xLCAwKSkKLQkJCQlicmVhazsKLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlnb3RvIGludGVycnVwdGVkOwotCQkJc2NoZWR1bGUoKTsKLQkJfQotCQlyZW1vdmVfd2FpdF9xdWV1ZSgmY29ubi0+Y2hhbm5lbF93cSwgJm15c2VsZik7Ci0JCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlpZiAoY2FuZGlkYXRlKSB7CisJCXRyYWNlX3J4cnBjX2NsaWVudChjYW5kaWRhdGUsIC0xLCByeHJwY19jbGllbnRfZHVwbGljYXRlKTsKKwkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY2FuZGlkYXRlKTsKKwkJY2FuZGlkYXRlID0gTlVMTDsKIAl9CiAKLQkvKiBUaGUgY29ubmVjdGlvbiBhbGxlZ2VkbHkgbm93IGhhcyBhIGZyZWUgY2hhbm5lbCBhbmQgd2UgY2FuIG5vdwotCSAqIGF0dGFjaCB0aGUgY2FsbCB0byBpdC4KLQkgKi8KIAlzcGluX2xvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7CisJY2FsbC0+Y29ubiA9IGNvbm47CisJY2FsbC0+c2VjdXJpdHlfaXggPSBjb25uLT5zZWN1cml0eV9peDsKKwlsaXN0X2FkZCgmY2FsbC0+Y2hhbl93YWl0X2xpbmssICZjb25uLT53YWl0aW5nX2NhbGxzKTsKKwlzcGluX3VubG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKKwlfbGVhdmUoIiA9IDAgW2V4dGFudCAlZF0iLCBjb25uLT5kZWJ1Z19pZCk7CisJcmV0dXJuIDA7CiAKLQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgUlhSUENfTUFYQ0FMTFM7IGNoYW4rKykKLQkJaWYgKCFjb25uLT5jaGFubmVsc1tjaGFuXS5jYWxsKQotCQkJZ290byBmb3VuZF9jaGFubmVsOwotCUJVRygpOwotCi1pbnRlcnJ1cHRlZDoKLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY29ubi0+Y2hhbm5lbF93cSwgJm15c2VsZik7Ci0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworZXJyb3JfcGVlcjoKIAlyeHJwY19wdXRfcGVlcihjcC0+cGVlcik7CiAJY3AtPnBlZXIgPSBOVUxMOwotCV9sZWF2ZSgiID0gLUVSRVNUQVJUU1lTIik7Ci0JcmV0dXJuIC1FUkVTVEFSVFNZUzsKK2Vycm9yOgorCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CiB9CiAKIC8qCi0gKiBSZW1vdmUgYSBjbGllbnQgY29ubmVjdGlvbiBmcm9tIHRoZSBsb2NhbCBlbmRwb2ludCdzIHRyZWUsIHRoZXJlYnkgcmVtb3ZpbmcKLSAqIGl0IGFzIGEgdGFyZ2V0IGZvciByZXVzZSBmb3IgbmV3IGNsaWVudCBjYWxscy4KKyAqIEFjdGl2YXRlIGEgY29ubmVjdGlvbi4KICAqLwotdm9pZCByeHJwY191bnB1Ymxpc2hfY2xpZW50X2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCitzdGF0aWMgdm9pZCByeHJwY19hY3RpdmF0ZV9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQogewotCXN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwgPSBjb25uLT5wYXJhbXMubG9jYWw7CisJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIC0xLCByeHJwY19jbGllbnRfdG9fYWN0aXZlKTsKKwljb25uLT5jYWNoZV9zdGF0ZSA9IFJYUlBDX0NPTk5fQ0xJRU5UX0FDVElWRTsKKwlyeHJwY19ucl9hY3RpdmVfY2xpZW50X2Nvbm5zKys7CisJbGlzdF9tb3ZlX3RhaWwoJmNvbm4tPmNhY2hlX2xpbmssICZyeHJwY19hY3RpdmVfY2xpZW50X2Nvbm5zKTsKK30KIAotCXNwaW5fbG9jaygmbG9jYWwtPmNsaWVudF9jb25uc19sb2NrKTsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NPTk5fSU5fQ0xJRU5UX0NPTk5TLCAmY29ubi0+ZmxhZ3MpKQotCQlyYl9lcmFzZSgmY29ubi0+Y2xpZW50X25vZGUsICZsb2NhbC0+Y2xpZW50X2Nvbm5zKTsKLQlzcGluX3VubG9jaygmbG9jYWwtPmNsaWVudF9jb25uc19sb2NrKTsKKy8qCisgKiBBdHRlbXB0IHRvIGFuaW1hdGUgYSBjb25uZWN0aW9uIGZvciBhIG5ldyBjYWxsLgorICoKKyAqIElmIGl0J3Mgbm90IGV4Y2x1c2l2ZSwgdGhlIGNvbm5lY3Rpb24gaXMgaW4gdGhlIGVuZHBvaW50IHRyZWUsIGFuZCB3ZSdyZSBpbgorICogdGhlIGNvbm4ncyBsaXN0IG9mIHRob3NlIHdhaXRpbmcgdG8gZ3JhYiBhIGNoYW5uZWwuICBUaGVyZSBpcywgaG93ZXZlciwgYQorICogbGltaXQgb24gdGhlIG51bWJlciBvZiBsaXZlIGNvbm5lY3Rpb25zIGFsbG93ZWQgYXQgYW55IG9uZSB0aW1lLCBzbyB3ZSBtYXkKKyAqIGhhdmUgdG8gd2FpdCBmb3IgY2FwYWNpdHkgdG8gYmVjb21lIGF2YWlsYWJsZS4KKyAqCisgKiBOb3RlIHRoYXQgYSBjb25uZWN0aW9uIG9uIHRoZSB3YWl0aW5nIHF1ZXVlIG1pZ2h0ICphbHNvKiBoYXZlIGFjdGl2ZQorICogY2hhbm5lbHMgaWYgaXQgaGFzIGJlZW4gY3VsbGVkIHRvIG1ha2Ugc3BhY2UgYW5kIHRoZW4gcmUtcmVxdWVzdGVkIGJ5IGEgbmV3CisgKiBjYWxsLgorICovCitzdGF0aWMgdm9pZCByeHJwY19hbmltYXRlX2NsaWVudF9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCXVuc2lnbmVkIGludCBucl9jb25uczsKKworCV9lbnRlcigiJWQsJWQiLCBjb25uLT5kZWJ1Z19pZCwgY29ubi0+Y2FjaGVfc3RhdGUpOworCisJaWYgKGNvbm4tPmNhY2hlX3N0YXRlID09IFJYUlBDX0NPTk5fQ0xJRU5UX0FDVElWRSkKKwkJZ290byBvdXQ7CisKKwlzcGluX2xvY2soJnJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworCisJbnJfY29ubnMgPSByeHJwY19ucl9jbGllbnRfY29ubnM7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NPTk5fQ09VTlRFRCwgJmNvbm4tPmZsYWdzKSkgeworCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgLTEsIHJ4cnBjX2NsaWVudF9jb3VudCk7CisJCXJ4cnBjX25yX2NsaWVudF9jb25ucyA9IG5yX2Nvbm5zICsgMTsKKwl9CisKKwlzd2l0Y2ggKGNvbm4tPmNhY2hlX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19DT05OX0NMSUVOVF9BQ1RJVkU6CisJY2FzZSBSWFJQQ19DT05OX0NMSUVOVF9XQUlUSU5HOgorCQlicmVhazsKKworCWNhc2UgUlhSUENfQ09OTl9DTElFTlRfSU5BQ1RJVkU6CisJY2FzZSBSWFJQQ19DT05OX0NMSUVOVF9DVUxMRUQ6CisJY2FzZSBSWFJQQ19DT05OX0NMSUVOVF9JRExFOgorCQlpZiAobnJfY29ubnMgPj0gcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucykKKwkJCWdvdG8gd2FpdF9mb3JfY2FwYWNpdHk7CisJCWdvdG8gYWN0aXZhdGVfY29ubjsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CitvdXQ6CisJX2xlYXZlKCIgWyVkXSIsIGNvbm4tPmNhY2hlX3N0YXRlKTsKKwlyZXR1cm47CisKK2FjdGl2YXRlX2Nvbm46CisJX2RlYnVnKCJhY3RpdmF0ZSIpOworCXJ4cnBjX2FjdGl2YXRlX2Nvbm4oY29ubik7CisJZ290byBvdXRfdW5sb2NrOworCit3YWl0X2Zvcl9jYXBhY2l0eToKKwlfZGVidWcoIndhaXQiKTsKKwl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgLTEsIHJ4cnBjX2NsaWVudF90b193YWl0aW5nKTsKKwljb25uLT5jYWNoZV9zdGF0ZSA9IFJYUlBDX0NPTk5fQ0xJRU5UX1dBSVRJTkc7CisJbGlzdF9tb3ZlX3RhaWwoJmNvbm4tPmNhY2hlX2xpbmssICZyeHJwY193YWl0aW5nX2NsaWVudF9jb25ucyk7CisJZ290byBvdXRfdW5sb2NrOworfQorCisvKgorICogRGVhY3RpdmF0ZSBhIGNoYW5uZWwuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2RlYWN0aXZhdGVfb25lX2NoYW5uZWwoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkJCSB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcnhycGNfY2hhbm5lbCAqY2hhbiA9ICZjb25uLT5jaGFubmVsc1tjaGFubmVsXTsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihjaGFuLT5jYWxsLCBOVUxMKTsKKwljb25uLT5hY3RpdmVfY2hhbnMgJj0gfigxIDw8IGNoYW5uZWwpOworfQorCisvKgorICogQXNzaWduIGEgY2hhbm5lbCB0byB0aGUgY2FsbCBhdCB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlIGFuZCB3YWtlIHRoZSBjYWxsIHVwLgorICogV2UgZG9uJ3QgaW5jcmVtZW50IHRoZSBjYWxsTnVtYmVyIGNvdW50ZXIgdW50aWwgdGhpcyBudW1iZXIgaGFzIGJlZW4gZXhwb3NlZAorICogdG8gdGhlIHdvcmxkLgorICovCitzdGF0aWMgdm9pZCByeHJwY19hY3RpdmF0ZV9vbmVfY2hhbm5lbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJc3RydWN0IHJ4cnBjX2NoYW5uZWwgKmNoYW4gPSAmY29ubi0+Y2hhbm5lbHNbY2hhbm5lbF07CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSBsaXN0X2VudHJ5KGNvbm4tPndhaXRpbmdfY2FsbHMubmV4dCwKKwkJCQkJICAgICBzdHJ1Y3QgcnhycGNfY2FsbCwgY2hhbl93YWl0X2xpbmspOworCXUzMiBjYWxsX2lkID0gY2hhbi0+Y2FsbF9jb3VudGVyICsgMTsKKworCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCBjaGFubmVsLCByeHJwY19jbGllbnRfY2hhbl9hY3RpdmF0ZSk7CisKKwl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVDsKKwl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCisJcnhycGNfc2VlX2NhbGwoY2FsbCk7CisJbGlzdF9kZWxfaW5pdCgmY2FsbC0+Y2hhbl93YWl0X2xpbmspOworCWNvbm4tPmFjdGl2ZV9jaGFucyB8PSAxIDw8IGNoYW5uZWw7CisJY2FsbC0+cGVlcgk9IHJ4cnBjX2dldF9wZWVyKGNvbm4tPnBhcmFtcy5wZWVyKTsKKwljYWxsLT5jaWQJPSBjb25uLT5wcm90by5jaWQgfCBjaGFubmVsOworCWNhbGwtPmNhbGxfaWQJPSBjYWxsX2lkOworCisJX25ldCgiQ09OTkVDVCBjYWxsICUwOHg6JTA4eCBhcyBjYWxsICVkIG9uIGNvbm4gJWQiLAorCSAgICAgY2FsbC0+Y2lkLCBjYWxsLT5jYWxsX2lkLCBjYWxsLT5kZWJ1Z19pZCwgY29ubi0+ZGVidWdfaWQpOworCisJLyogUGFpcmVkIHdpdGggdGhlIHJlYWQgYmFycmllciBpbiByeHJwY193YWl0X2Zvcl9jaGFubmVsKCkuICBUaGlzCisJICogb3JkZXJzIGNpZCBhbmQgZXBvY2ggaW4gdGhlIGNvbm5lY3Rpb24gd3J0IHRvIGNhbGxfaWQgd2l0aG91dCB0aGUKKwkgKiBuZWVkIHRvIHRha2UgdGhlIGNoYW5uZWxfbG9jay4KKwkgKgorCSAqIFdlIHByb3Zpc2lvbmFsbHkgYXNzaWduIGEgY2FsbE51bWJlciBhdCB0aGlzIHBvaW50LCBidXQgd2UgZG9uJ3QKKwkgKiBjb25maXJtIGl0IHVudGlsIHRoZSBjYWxsIGlzIGFib3V0IHRvIGJlIGV4cG9zZWQuCisJICoKKwkgKiBUT0RPOiBQYWlyIHdpdGggYSBiYXJyaWVyIGluIHRoZSBkYXRhX3JlYWR5IGhhbmRsZXIgd2hlbiB0aGF0IGxvb2tzCisJICogYXQgdGhlIGNhbGwgSUQgdGhyb3VnaCBhIGNvbm5lY3Rpb24gY2hhbm5lbC4KKwkgKi8KKwlzbXBfd21iKCk7CisJY2hhbi0+Y2FsbF9pZAk9IGNhbGxfaWQ7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGNoYW4tPmNhbGwsIGNhbGwpOworCXdha2VfdXAoJmNhbGwtPndhaXRxKTsKK30KKworLyoKKyAqIEFzc2lnbiBjaGFubmVscyBhbmQgY2FsbE51bWJlcnMgdG8gd2FpdGluZyBjYWxscyB3aXRoIGNoYW5uZWxfbG9jaworICogaGVsZCBieSBjYWxsZXIuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX2FjdGl2YXRlX2NoYW5uZWxzX2xvY2tlZChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwl1OCBhdmFpbCwgbWFzazsKKworCXN3aXRjaCAoY29ubi0+Y2FjaGVfc3RhdGUpIHsKKwljYXNlIFJYUlBDX0NPTk5fQ0xJRU5UX0FDVElWRToKKwkJbWFzayA9IFJYUlBDX0FDVElWRV9DSEFOU19NQVNLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjb25uLT53YWl0aW5nX2NhbGxzKSAmJgorCSAgICAgICAoYXZhaWwgPSB+Y29ubi0+YWN0aXZlX2NoYW5zLAorCQlhdmFpbCAmPSBtYXNrLAorCQlhdmFpbCAhPSAwKSkKKwkJcnhycGNfYWN0aXZhdGVfb25lX2NoYW5uZWwoY29ubiwgX19mZnMoYXZhaWwpKTsKK30KKworLyoKKyAqIEFzc2lnbiBjaGFubmVscyBhbmQgY2FsbE51bWJlcnMgdG8gd2FpdGluZyBjYWxscy4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfYWN0aXZhdGVfY2hhbm5lbHMoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJX2VudGVyKCIlZCIsIGNvbm4tPmRlYnVnX2lkKTsKKworCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X2FjdGl2YXRlX2NoYW5zKTsKKworCWlmIChjb25uLT5hY3RpdmVfY2hhbnMgPT0gUlhSUENfQUNUSVZFX0NIQU5TX01BU0spCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKKwlyeHJwY19hY3RpdmF0ZV9jaGFubmVsc19sb2NrZWQoY29ubik7CisJc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7CisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIFdhaXQgZm9yIGEgY2FsbE51bWJlciBhbmQgYSBjaGFubmVsIHRvIGJlIGdyYW50ZWQgdG8gYSBjYWxsLgorICovCitzdGF0aWMgaW50IHJ4cnBjX3dhaXRfZm9yX2NoYW5uZWwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGdmcF90IGdmcCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCV9lbnRlcigiJWQiLCBjYWxsLT5kZWJ1Z19pZCk7CisKKwlpZiAoIWNhbGwtPmNhbGxfaWQpIHsKKwkJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCQlpZiAoIWdmcGZsYWdzX2FsbG93X2Jsb2NraW5nKGdmcCkpIHsKKwkJCXJldCA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCQlmb3IgKDs7KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJaWYgKGNhbGwtPmNhbGxfaWQpCisJCQkJYnJlYWs7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9CisKKwkvKiBQYWlyZWQgd2l0aCB0aGUgd3JpdGUgYmFycmllciBpbiByeHJwY19hY3RpdmF0ZV9vbmVfY2hhbm5lbCgpLiAqLworCXNtcF9ybWIoKTsKKworb3V0OgorCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBmaW5kIGEgY29ubmVjdGlvbiBmb3IgYSBjYWxsCisgKiAtIGNhbGxlZCBpbiBwcm9jZXNzIGNvbnRleHQgd2l0aCBJUlFzIGVuYWJsZWQKKyAqLworaW50IHJ4cnBjX2Nvbm5lY3RfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJICAgICAgIHN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgKmNwLAorCQkgICAgICAgc3RydWN0IHNvY2thZGRyX3J4cnBjICpzcngsCisJCSAgICAgICBnZnBfdCBnZnApCit7CisJaW50IHJldDsKKworCV9lbnRlcigieyVkLCVseH0sIiwgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPnVzZXJfY2FsbF9JRCk7CisKKwlyeHJwY19kaXNjYXJkX2V4cGlyZWRfY2xpZW50X2Nvbm5zKE5VTEwpOworCXJ4cnBjX2N1bGxfYWN0aXZlX2NsaWVudF9jb25ucygpOworCisJcmV0ID0gcnhycGNfZ2V0X2NsaWVudF9jb25uKGNhbGwsIGNwLCBzcngsIGdmcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyeHJwY19hbmltYXRlX2NsaWVudF9jb25uKGNhbGwtPmNvbm4pOworCXJ4cnBjX2FjdGl2YXRlX2NoYW5uZWxzKGNhbGwtPmNvbm4pOworCisJcmV0ID0gcnhycGNfd2FpdF9mb3JfY2hhbm5lbChjYWxsLCBnZnApOworCWlmIChyZXQgPCAwKQorCQlyeHJwY19kaXNjb25uZWN0X2NsaWVudF9jYWxsKGNhbGwpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIE5vdGUgdGhhdCBhIGNvbm5lY3Rpb24gaXMgYWJvdXQgdG8gYmUgZXhwb3NlZCB0byB0aGUgd29ybGQuICBPbmNlIGl0IGlzCisgKiBleHBvc2VkLCB3ZSBtYWludGFpbiBhbiBleHRyYSByZWYgb24gaXQgdGhhdCBzdG9wcyBpdCBmcm9tIGJlaW5nIHN1bW1hcmlseQorICogZGlzY2FyZGVkIGJlZm9yZSBpdCdzIChhKSBoYWQgYSBjaGFuY2UgdG8gZGVhbCB3aXRoIHJldHJhbnNtaXNzaW9uIGFuZCAoYikKKyAqIGhhZCBhIGNoYW5jZSBhdCByZS11c2UgKHRoZSBwZXItY29ubmVjdGlvbiBzZWN1cml0eSBuZWdvdGlhdGlvbiBpcworICogZXhwZW5zaXZlKS4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfZXhwb3NlX2NsaWVudF9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NPTk5fRVhQT1NFRCwgJmNvbm4tPmZsYWdzKSkgeworCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgY2hhbm5lbCwgcnhycGNfY2xpZW50X2V4cG9zZWQpOworCQlyeHJwY19nZXRfY29ubmVjdGlvbihjb25uKTsKKwl9Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgYSBjYWxsLCBhbmQgdGh1cyBhIGNvbm5lY3Rpb24sIGlzIGFib3V0IHRvIGJlIGV4cG9zZWQgdG8gdGhlCisgKiB3b3JsZC4KKyAqLwordm9pZCByeHJwY19leHBvc2VfY2xpZW50X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJdW5zaWduZWQgaW50IGNoYW5uZWwgPSBjYWxsLT5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTSzsKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IGNhbGwtPmNvbm47CisJc3RydWN0IHJ4cnBjX2NoYW5uZWwgKmNoYW4gPSAmY29ubi0+Y2hhbm5lbHNbY2hhbm5lbF07CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FWFBPU0VELCAmY2FsbC0+ZmxhZ3MpKSB7CisJCS8qIE1hcmsgdGhlIGNhbGwgSUQgYXMgYmVpbmcgdXNlZC4gIElmIHRoZSBjYWxsTnVtYmVyIGNvdW50ZXIKKwkJICogZXhjZWVkcyB+MiBiaWxsaW9uLCB3ZSBraWxsIHRoZSBjb25uZWN0aW9uIGFmdGVyIGl0cworCQkgKiBvdXRzdGFuZGluZyBjYWxscyBoYXZlIGZpbmlzaGVkIHNvIHRoYXQgdGhlIGNvdW50ZXIgZG9lc24ndAorCQkgKiB3cmFwLgorCQkgKi8KKwkJY2hhbi0+Y2FsbF9jb3VudGVyKys7CisJCWlmIChjaGFuLT5jYWxsX2NvdW50ZXIgPj0gSU5UX01BWCkKKwkJCXNldF9iaXQoUlhSUENfQ09OTl9ET05UX1JFVVNFLCAmY29ubi0+ZmxhZ3MpOworCQlyeHJwY19leHBvc2VfY2xpZW50X2Nvbm4oY29ubiwgY2hhbm5lbCk7CisJfQorfQorCisvKgorICogRGlzY29ubmVjdCBhIGNsaWVudCBjYWxsLgorICovCit2b2lkIHJ4cnBjX2Rpc2Nvbm5lY3RfY2xpZW50X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJdW5zaWduZWQgaW50IGNoYW5uZWwgPSBjYWxsLT5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTSzsKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IGNhbGwtPmNvbm47CisJc3RydWN0IHJ4cnBjX2NoYW5uZWwgKmNoYW4gPSAmY29ubi0+Y2hhbm5lbHNbY2hhbm5lbF07CisKKwl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgY2hhbm5lbCwgcnhycGNfY2xpZW50X2NoYW5fZGlzY29ubmVjdCk7CisJY2FsbC0+Y29ubiA9IE5VTEw7CisKKwlzcGluX2xvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7CisKKwkvKiBDYWxscyB0aGF0IGhhdmUgbmV2ZXIgYWN0dWFsbHkgYmVlbiBhc3NpZ25lZCBhIGNoYW5uZWwgY2FuIHNpbXBseSBiZQorCSAqIGRpc2NhcmRlZC4gIElmIHRoZSBjb25uIGRpZG4ndCBnZXQgdXNlZCBlaXRoZXIsIGl0IHdpbGwgZm9sbG93CisJICogaW1tZWRpYXRlbHkgdW5sZXNzIHNvbWVvbmUgZWxzZSBncmFicyBpdCBpbiB0aGUgbWVhbnRpbWUuCisJICovCisJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5jaGFuX3dhaXRfbGluaykpIHsKKwkJX2RlYnVnKCJjYWxsIGlzIHdhaXRpbmciKTsKKwkJQVNTRVJUQ01QKGNhbGwtPmNhbGxfaWQsID09LCAwKTsKKwkJQVNTRVJUKCF0ZXN0X2JpdChSWFJQQ19DQUxMX0VYUE9TRUQsICZjYWxsLT5mbGFncykpOworCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5jaGFuX3dhaXRfbGluayk7CisKKwkJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIGNoYW5uZWwsIHJ4cnBjX2NsaWVudF9jaGFuX3Vuc3RhcnRlZCk7CisKKwkJLyogV2UgbXVzdCBkZWFjdGl2YXRlIG9yIGlkbGUgdGhlIGNvbm5lY3Rpb24gaWYgaXQncyBub3cKKwkJICogd2FpdGluZyBmb3Igbm90aGluZy4KKwkJICovCisJCXNwaW5fbG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisJCWlmIChjb25uLT5jYWNoZV9zdGF0ZSA9PSBSWFJQQ19DT05OX0NMSUVOVF9XQUlUSU5HICYmCisJCSAgICBsaXN0X2VtcHR5KCZjb25uLT53YWl0aW5nX2NhbGxzKSAmJgorCQkgICAgIWNvbm4tPmFjdGl2ZV9jaGFucykKKwkJCWdvdG8gaWRsZV9jb25uZWN0aW9uOworCQlnb3RvIG91dDsKKwl9CisKKwlBU1NFUlRDTVAocmN1X2FjY2Vzc19wb2ludGVyKGNoYW4tPmNhbGwpLCA9PSwgY2FsbCk7CisKKwkvKiBJZiBhIGNsaWVudCBjYWxsIHdhcyBleHBvc2VkIHRvIHRoZSB3b3JsZCwgd2Ugc2F2ZSB0aGUgcmVzdWx0IGZvcgorCSAqIHJldHJhbnNtaXNzaW9uLgorCSAqCisJICogV2UgdXNlIGEgYmFycmllciBoZXJlIHNvIHRoYXQgdGhlIGNhbGwgbnVtYmVyIGFuZCBhYm9ydCBjb2RlIGNhbiBiZQorCSAqIHJlYWQgd2l0aG91dCBuZWVkaW5nIHRvIHRha2UgYSBsb2NrLgorCSAqCisJICogVE9ETzogTWFrZSB0aGUgaW5jb21pbmcgcGFja2V0IGhhbmRsZXIgY2hlY2sgdGhpcyBhbmQgaGFuZGxlCisJICogdGVybWluYWwgcmV0cmFuc21pc3Npb24gd2l0aG91dCByZXF1aXJpbmcgYWNjZXNzIHRvIHRoZSBjYWxsLgorCSAqLworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX0VYUE9TRUQsICZjYWxsLT5mbGFncykpIHsKKwkJX2RlYnVnKCJleHBvc2VkICV1LCV1IiwgY2FsbC0+Y2FsbF9pZCwgY2FsbC0+YWJvcnRfY29kZSk7CisJCV9fcnhycGNfZGlzY29ubmVjdF9jYWxsKGNvbm4sIGNhbGwpOworCX0KKworCS8qIFNlZSBpZiB3ZSBjYW4gcGFzcyB0aGUgY2hhbm5lbCBkaXJlY3RseSB0byBhbm90aGVyIGNhbGwuICovCisJaWYgKGNvbm4tPmNhY2hlX3N0YXRlID09IFJYUlBDX0NPTk5fQ0xJRU5UX0FDVElWRSAmJgorCSAgICAhbGlzdF9lbXB0eSgmY29ubi0+d2FpdGluZ19jYWxscykpIHsKKwkJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIGNoYW5uZWwsIHJ4cnBjX2NsaWVudF9jaGFuX3Bhc3MpOworCQlyeHJwY19hY3RpdmF0ZV9vbmVfY2hhbm5lbChjb25uLCBjaGFubmVsKTsKKwkJZ290byBvdXRfMjsKKwl9CisKKwkvKiBUaGluZ3MgYXJlIG1vcmUgY29tcGxleCBhbmQgd2UgbmVlZCB0aGUgY2FjaGUgbG9jay4gIFdlIG1pZ2h0IGJlCisJICogYWJsZSB0byBzaW1wbHkgaWRsZSB0aGUgY29ubiBvciBpdCBtaWdodCBub3cgYmUgbHVya2luZyBvbiB0aGUgd2FpdAorCSAqIGxpc3QuICBJdCBtaWdodCBldmVuIGdldCBtb3ZlZCBiYWNrIHRvIHRoZSBhY3RpdmUgbGlzdCB3aGlsc3Qgd2UncmUKKwkgKiB3YWl0aW5nIGZvciB0aGUgbG9jay4KKwkgKi8KKwlzcGluX2xvY2soJnJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworCisJc3dpdGNoIChjb25uLT5jYWNoZV9zdGF0ZSkgeworCWNhc2UgUlhSUENfQ09OTl9DTElFTlRfQUNUSVZFOgorCQlpZiAobGlzdF9lbXB0eSgmY29ubi0+d2FpdGluZ19jYWxscykpIHsKKwkJCXJ4cnBjX2RlYWN0aXZhdGVfb25lX2NoYW5uZWwoY29ubiwgY2hhbm5lbCk7CisJCQlpZiAoIWNvbm4tPmFjdGl2ZV9jaGFucykgeworCQkJCXJ4cnBjX25yX2FjdGl2ZV9jbGllbnRfY29ubnMtLTsKKwkJCQlnb3RvIGlkbGVfY29ubmVjdGlvbjsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisKKwkJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIGNoYW5uZWwsIHJ4cnBjX2NsaWVudF9jaGFuX3Bhc3MpOworCQlyeHJwY19hY3RpdmF0ZV9vbmVfY2hhbm5lbChjb25uLCBjaGFubmVsKTsKKwkJZ290byBvdXQ7CisKKwljYXNlIFJYUlBDX0NPTk5fQ0xJRU5UX0NVTExFRDoKKwkJcnhycGNfZGVhY3RpdmF0ZV9vbmVfY2hhbm5lbChjb25uLCBjaGFubmVsKTsKKwkJQVNTRVJUKGxpc3RfZW1wdHkoJmNvbm4tPndhaXRpbmdfY2FsbHMpKTsKKwkJaWYgKCFjb25uLT5hY3RpdmVfY2hhbnMpCisJCQlnb3RvIGlkbGVfY29ubmVjdGlvbjsKKwkJZ290byBvdXQ7CisKKwljYXNlIFJYUlBDX0NPTk5fQ0xJRU5UX1dBSVRJTkc6CisJCXJ4cnBjX2RlYWN0aXZhdGVfb25lX2NoYW5uZWwoY29ubiwgY2hhbm5lbCk7CisJCWdvdG8gb3V0OworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2soJnJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworb3V0XzI6CisJc3Bpbl91bmxvY2soJmNvbm4tPmNoYW5uZWxfbG9jayk7CisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJX2xlYXZlKCIiKTsKKwlyZXR1cm47CisKK2lkbGVfY29ubmVjdGlvbjoKKwkvKiBBcyBubyBjaGFubmVscyByZW1haW4gYWN0aXZlLCB0aGUgY29ubmVjdGlvbiBnZXRzIGRlYWN0aXZhdGVkCisJICogaW1tZWRpYXRlbHkgb3IgbW92ZWQgdG8gdGhlIGlkbGUgbGlzdCBmb3IgYSBzaG9ydCB3aGlsZS4KKwkgKi8KKwlpZiAodGVzdF9iaXQoUlhSUENfQ09OTl9FWFBPU0VELCAmY29ubi0+ZmxhZ3MpKSB7CisJCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCBjaGFubmVsLCByeHJwY19jbGllbnRfdG9faWRsZSk7CisJCWNvbm4tPmlkbGVfdGltZXN0YW1wID0gamlmZmllczsKKwkJY29ubi0+Y2FjaGVfc3RhdGUgPSBSWFJQQ19DT05OX0NMSUVOVF9JRExFOworCQlsaXN0X21vdmVfdGFpbCgmY29ubi0+Y2FjaGVfbGluaywgJnJ4cnBjX2lkbGVfY2xpZW50X2Nvbm5zKTsKKwkJaWYgKHJ4cnBjX2lkbGVfY2xpZW50X2Nvbm5zLm5leHQgPT0gJmNvbm4tPmNhY2hlX2xpbmsgJiYKKwkJICAgICFyeHJwY19raWxsX2FsbF9jbGllbnRfY29ubnMpCisJCQlxdWV1ZV9kZWxheWVkX3dvcmsocnhycGNfd29ya3F1ZXVlLAorCQkJCQkgICAmcnhycGNfY2xpZW50X2Nvbm5fcmVhcCwKKwkJCQkJICAgcnhycGNfY29ubl9pZGxlX2NsaWVudF9leHBpcnkpOworCX0gZWxzZSB7CisJCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCBjaGFubmVsLCByeHJwY19jbGllbnRfdG9faW5hY3RpdmUpOworCQljb25uLT5jYWNoZV9zdGF0ZSA9IFJYUlBDX0NPTk5fQ0xJRU5UX0lOQUNUSVZFOworCQlsaXN0X2RlbF9pbml0KCZjb25uLT5jYWNoZV9saW5rKTsKKwl9CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBDbGVhbiB1cCBhIGRlYWQgY2xpZW50IGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqCityeHJwY19wdXRfb25lX2NsaWVudF9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsID0gY29ubi0+cGFyYW1zLmxvY2FsOworCXVuc2lnbmVkIGludCBucl9jb25uczsKKworCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X2NsZWFudXApOworCisJaWYgKHRlc3RfYml0KFJYUlBDX0NPTk5fSU5fQ0xJRU5UX0NPTk5TLCAmY29ubi0+ZmxhZ3MpKSB7CisJCXNwaW5fbG9jaygmbG9jYWwtPmNsaWVudF9jb25uc19sb2NrKTsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DT05OX0lOX0NMSUVOVF9DT05OUywKKwkJCQkgICAgICAgJmNvbm4tPmZsYWdzKSkKKwkJCXJiX2VyYXNlKCZjb25uLT5jbGllbnRfbm9kZSwgJmxvY2FsLT5jbGllbnRfY29ubnMpOworCQlzcGluX3VubG9jaygmbG9jYWwtPmNsaWVudF9jb25uc19sb2NrKTsKKwl9CiAKIAlyeHJwY19wdXRfY2xpZW50X2Nvbm5lY3Rpb25faWQoY29ubik7CisKKwlBU1NFUlRDTVAoY29ubi0+Y2FjaGVfc3RhdGUsID09LCBSWFJQQ19DT05OX0NMSUVOVF9JTkFDVElWRSk7CisKKwlpZiAodGVzdF9iaXQoUlhSUENfQ09OTl9DT1VOVEVELCAmY29ubi0+ZmxhZ3MpKSB7CisJCXRyYWNlX3J4cnBjX2NsaWVudChjb25uLCAtMSwgcnhycGNfY2xpZW50X3VuY291bnQpOworCQlzcGluX2xvY2soJnJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworCQlucl9jb25ucyA9IC0tcnhycGNfbnJfY2xpZW50X2Nvbm5zOworCisJCWlmIChucl9jb25ucyA8IHJ4cnBjX21heF9jbGllbnRfY29ubmVjdGlvbnMgJiYKKwkJICAgICFsaXN0X2VtcHR5KCZyeHJwY193YWl0aW5nX2NsaWVudF9jb25ucykpIHsKKwkJCW5leHQgPSBsaXN0X2VudHJ5KHJ4cnBjX3dhaXRpbmdfY2xpZW50X2Nvbm5zLm5leHQsCisJCQkJCSAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sIGNhY2hlX2xpbmspOworCQkJcnhycGNfZ2V0X2Nvbm5lY3Rpb24obmV4dCk7CisJCQlyeHJwY19hY3RpdmF0ZV9jb25uKG5leHQpOworCQl9CisKKwkJc3Bpbl91bmxvY2soJnJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworCX0KKworCXJ4cnBjX2tpbGxfY29ubmVjdGlvbihjb25uKTsKKwlpZiAobmV4dCkKKwkJcnhycGNfYWN0aXZhdGVfY2hhbm5lbHMobmV4dCk7CisKKwkvKiBXZSBuZWVkIHRvIGdldCByaWQgb2YgdGhlIHRlbXBvcmFyeSByZWYgd2UgdG9vayB1cG9uIG5leHQsIGJ1dCB3ZQorCSAqIGNhbid0IGNhbGwgcnhycGNfcHV0X2Nvbm5lY3Rpb24oKSByZWN1cnNpdmVseS4KKwkgKi8KKwlyZXR1cm4gbmV4dDsKK30KKworLyoKKyAqIENsZWFuIHVwIGEgZGVhZCBjbGllbnQgY29ubmVjdGlvbnMuCisgKi8KK3ZvaWQgcnhycGNfcHV0X2NsaWVudF9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG47CisKKwlkbyB7CisJCW4gPSBhdG9taWNfZGVjX3JldHVybigmY29ubi0+dXNhZ2UpOworCQl0cmFjZV9yeHJwY19jb25uKGNvbm4sIHJ4cnBjX2Nvbm5fcHV0X2NsaWVudCwgbiwgaGVyZSk7CisJCWlmIChuID4gMCkKKwkJCXJldHVybjsKKwkJQVNTRVJUQ01QKG4sID49LCAwKTsKKworCQljb25uID0gcnhycGNfcHV0X29uZV9jbGllbnRfY29ubihjb25uKTsKKwl9IHdoaWxlIChjb25uKTsKK30KKworLyoKKyAqIEtpbGwgdGhlIGxvbmdlc3QtYWN0aXZlIGNsaWVudCBjb25uZWN0aW9ucyB0byBtYWtlIHJvb20gZm9yIG5ldyBvbmVzLgorICovCitzdGF0aWMgdm9pZCByeHJwY19jdWxsX2FjdGl2ZV9jbGllbnRfY29ubnModm9pZCkKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwl1bnNpZ25lZCBpbnQgbnJfY29ubnMgPSByeHJwY19ucl9jbGllbnRfY29ubnM7CisJdW5zaWduZWQgaW50IG5yX2FjdGl2ZSwgbGltaXQ7CisKKwlfZW50ZXIoIiIpOworCisJQVNTRVJUQ01QKG5yX2Nvbm5zLCA+PSwgMCk7CisJaWYgKG5yX2Nvbm5zIDwgcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucykgeworCQlfbGVhdmUoIiBbb2tdIik7CisJCXJldHVybjsKKwl9CisJbGltaXQgPSByeHJwY19yZWFwX2NsaWVudF9jb25uZWN0aW9uczsKKworCXNwaW5fbG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisJbnJfYWN0aXZlID0gcnhycGNfbnJfYWN0aXZlX2NsaWVudF9jb25uczsKKworCXdoaWxlIChucl9hY3RpdmUgPiBsaW1pdCkgeworCQlBU1NFUlQoIWxpc3RfZW1wdHkoJnJ4cnBjX2FjdGl2ZV9jbGllbnRfY29ubnMpKTsKKwkJY29ubiA9IGxpc3RfZW50cnkocnhycGNfYWN0aXZlX2NsaWVudF9jb25ucy5uZXh0LAorCQkJCSAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sIGNhY2hlX2xpbmspOworCQlBU1NFUlRDTVAoY29ubi0+Y2FjaGVfc3RhdGUsID09LCBSWFJQQ19DT05OX0NMSUVOVF9BQ1RJVkUpOworCisJCWlmIChsaXN0X2VtcHR5KCZjb25uLT53YWl0aW5nX2NhbGxzKSkgeworCQkJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIC0xLCByeHJwY19jbGllbnRfdG9fY3VsbGVkKTsKKwkJCWNvbm4tPmNhY2hlX3N0YXRlID0gUlhSUENfQ09OTl9DTElFTlRfQ1VMTEVEOworCQkJbGlzdF9kZWxfaW5pdCgmY29ubi0+Y2FjaGVfbGluayk7CisJCX0gZWxzZSB7CisJCQl0cmFjZV9yeHJwY19jbGllbnQoY29ubiwgLTEsIHJ4cnBjX2NsaWVudF90b193YWl0aW5nKTsKKwkJCWNvbm4tPmNhY2hlX3N0YXRlID0gUlhSUENfQ09OTl9DTElFTlRfV0FJVElORzsKKwkJCWxpc3RfbW92ZV90YWlsKCZjb25uLT5jYWNoZV9saW5rLAorCQkJCSAgICAgICAmcnhycGNfd2FpdGluZ19jbGllbnRfY29ubnMpOworCQl9CisKKwkJbnJfYWN0aXZlLS07CisJfQorCisJcnhycGNfbnJfYWN0aXZlX2NsaWVudF9jb25ucyA9IG5yX2FjdGl2ZTsKKwlzcGluX3VubG9jaygmcnhycGNfY2xpZW50X2Nvbm5fY2FjaGVfbG9jayk7CisJQVNTRVJUQ01QKG5yX2FjdGl2ZSwgPj0sIDApOworCV9sZWF2ZSgiIFtjdWxsZWRdIik7Cit9CisKKy8qCisgKiBEaXNjYXJkIGV4cGlyZWQgY2xpZW50IGNvbm5lY3Rpb25zIGZyb20gdGhlIGlkbGUgbGlzdC4gIEVhY2ggY29ubiBpbiB0aGUKKyAqIGlkbGUgbGlzdCBoYXMgYmVlbiBleHBvc2VkIGFuZCBob2xkcyBhbiBleHRyYSByZWYgYmVjYXVzZSBvZiB0aGF0LgorICoKKyAqIFRoaXMgbWF5IGJlIGNhbGxlZCBmcm9tIGNvbm4gc2V0dXAgb3IgZnJvbSBhIHdvcmsgaXRlbSBzbyBjYW5ub3QgYmUKKyAqIGNvbnNpZGVyZWQgbm9uLXJlZW50cmFudC4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfZGlzY2FyZF9leHBpcmVkX2NsaWVudF9jb25ucyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisJdW5zaWduZWQgbG9uZyBleHBpcnksIGNvbm5fZXhwaXJlc19hdCwgbm93OworCXVuc2lnbmVkIGludCBucl9jb25uczsKKwlib29sIGRpZF9kaXNjYXJkID0gZmFsc2U7CisKKwlfZW50ZXIoIiVjIiwgd29yayA/ICd3JyA6ICduJyk7CisKKwlpZiAobGlzdF9lbXB0eSgmcnhycGNfaWRsZV9jbGllbnRfY29ubnMpKSB7CisJCV9sZWF2ZSgiIFtlbXB0eV0iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIERvbid0IGRvdWJsZSB1cCBvbiB0aGUgZGlzY2FyZGluZyAqLworCWlmICghc3Bpbl90cnlsb2NrKCZyeHJwY19jbGllbnRfY29ubl9kaXNjYXJkX211dGV4KSkgeworCQlfbGVhdmUoIiBbYWxyZWFkeV0iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIGtlZXAgYW4gZXN0aW1hdGUgb2Ygd2hhdCB0aGUgbnVtYmVyIG9mIGNvbm5zIG91Z2h0IHRvIGJlIGFmdGVyCisJICogd2UndmUgZGlzY2FyZGVkIHNvbWUgc28gdGhhdCB3ZSBkb24ndCBvdmVyZG8gdGhlIGRpc2NhcmRpbmcuCisJICovCisJbnJfY29ubnMgPSByeHJwY19ucl9jbGllbnRfY29ubnM7CisKK25leHQ6CisJc3Bpbl9sb2NrKCZyeHJwY19jbGllbnRfY29ubl9jYWNoZV9sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZyeHJwY19pZGxlX2NsaWVudF9jb25ucykpCisJCWdvdG8gb3V0OworCisJY29ubiA9IGxpc3RfZW50cnkocnhycGNfaWRsZV9jbGllbnRfY29ubnMubmV4dCwKKwkJCSAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24sIGNhY2hlX2xpbmspOworCUFTU0VSVCh0ZXN0X2JpdChSWFJQQ19DT05OX0VYUE9TRUQsICZjb25uLT5mbGFncykpOworCisJaWYgKCFyeHJwY19raWxsX2FsbF9jbGllbnRfY29ubnMpIHsKKwkJLyogSWYgdGhlIG51bWJlciBvZiBjb25uZWN0aW9ucyBpcyBvdmVyIHRoZSByZWFwIGxpbWl0LCB3ZQorCQkgKiBleHBlZGl0ZSBkaXNjYXJkIGJ5IHJlZHVjaW5nIHRoZSBleHBpcnkgdGltZW91dC4gIFdlIG11c3QsCisJCSAqIGhvd2V2ZXIsIGhhdmUgYXQgbGVhc3QgYSBzaG9ydCBncmFjZSBwZXJpb2QgdG8gYmUgYWJsZSB0byBkbworCQkgKiBmaW5hbC1BQ0sgb3IgQUJPUlQgcmV0cmFuc21pc3Npb24uCisJCSAqLworCQlleHBpcnkgPSByeHJwY19jb25uX2lkbGVfY2xpZW50X2V4cGlyeTsKKwkJaWYgKG5yX2Nvbm5zID4gcnhycGNfcmVhcF9jbGllbnRfY29ubmVjdGlvbnMpCisJCQlleHBpcnkgPSByeHJwY19jb25uX2lkbGVfY2xpZW50X2Zhc3RfZXhwaXJ5OworCisJCWNvbm5fZXhwaXJlc19hdCA9IGNvbm4tPmlkbGVfdGltZXN0YW1wICsgZXhwaXJ5OworCisJCW5vdyA9IFJFQURfT05DRShqaWZmaWVzKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoY29ubl9leHBpcmVzX2F0LCBub3cpKQorCQkJZ290byBub3RfeWV0X2V4cGlyZWQ7CisJfQorCisJdHJhY2VfcnhycGNfY2xpZW50KGNvbm4sIC0xLCByeHJwY19jbGllbnRfZGlzY2FyZCk7CisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ09OTl9FWFBPU0VELCAmY29ubi0+ZmxhZ3MpKQorCQlCVUcoKTsKKwljb25uLT5jYWNoZV9zdGF0ZSA9IFJYUlBDX0NPTk5fQ0xJRU5UX0lOQUNUSVZFOworCWxpc3RfZGVsX2luaXQoJmNvbm4tPmNhY2hlX2xpbmspOworCisJc3Bpbl91bmxvY2soJnJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworCisJLyogV2hlbiB3ZSBjbGVhcmVkIHRoZSBFWFBPU0VEIGZsYWcsIHdlIHRvb2sgb24gcmVzcG9uc2liaWxpdHkgZm9yIHRoZQorCSAqIHJlZmVyZW5jZSB0aGF0IHRoYXQgaGFkIG9uIHRoZSB1c2FnZSBjb3VudC4gIFdlIGRlYWwgd2l0aCB0aGF0IGhlcmUuCisJICogSWYgc29tZW9uZSByZS1zZXRzIHRoZSBmbGFnIGFuZCByZS1nZXRzIHRoZSByZWYsIHRoYXQncyBmaW5lLgorCSAqLworCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworCWRpZF9kaXNjYXJkID0gdHJ1ZTsKKwlucl9jb25ucy0tOworCWdvdG8gbmV4dDsKKworbm90X3lldF9leHBpcmVkOgorCS8qIFRoZSBjb25uZWN0aW9uIGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUgaGFzbid0IHlldCBleHBpcmVkLCBzbworCSAqIHNjaGVkdWxlIHRoZSB3b3JrIGl0ZW0gZm9yIHRoYXQgcG9pbnQgaWYgd2UgZGlzY2FyZGVkIHNvbWV0aGluZy4KKwkgKgorCSAqIFdlIGRvbid0IHdvcnJ5IGlmIHRoZSB3b3JrIGl0ZW0gaXMgYWxyZWFkeSBzY2hlZHVsZWQgLSBpdCBjYW4gbG9vaworCSAqIGFmdGVyIHJlc2NoZWR1bGluZyBpdHNlbGYgYXQgYSBsYXRlciB0aW1lLiAgV2UgY291bGQgY2FuY2VsIGl0LCBidXQKKwkgKiB0aGVuIHRoaW5ncyBnZXQgbWVzc2llci4KKwkgKi8KKwlfZGVidWcoIm5vdCB5ZXQiKTsKKwlpZiAoIXJ4cnBjX2tpbGxfYWxsX2NsaWVudF9jb25ucykKKwkJcXVldWVfZGVsYXllZF93b3JrKHJ4cnBjX3dvcmtxdWV1ZSwKKwkJCQkgICAmcnhycGNfY2xpZW50X2Nvbm5fcmVhcCwKKwkJCQkgICBjb25uX2V4cGlyZXNfYXQgLSBub3cpOworCitvdXQ6CisJc3Bpbl91bmxvY2soJnJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworCXNwaW5fdW5sb2NrKCZyeHJwY19jbGllbnRfY29ubl9kaXNjYXJkX211dGV4KTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogUHJlZW1wdGl2ZWx5IGRlc3Ryb3kgYWxsIHRoZSBjbGllbnQgY29ubmVjdGlvbiByZWNvcmRzIHJhdGhlciB0aGFuIHdhaXRpbmcKKyAqIGZvciB0aGVtIHRvIHRpbWUgb3V0CisgKi8KK3ZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX2NsaWVudF9jb25uZWN0aW9ucyh2b2lkKQoreworCV9lbnRlcigiIik7CisKKwlzcGluX2xvY2soJnJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworCXJ4cnBjX2tpbGxfYWxsX2NsaWVudF9jb25ucyA9IHRydWU7CisJc3Bpbl91bmxvY2soJnJ4cnBjX2NsaWVudF9jb25uX2NhY2hlX2xvY2spOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnhycGNfY2xpZW50X2Nvbm5fcmVhcCk7CisKKwlpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayhyeHJwY193b3JrcXVldWUsICZyeHJwY19jbGllbnRfY29ubl9yZWFwLCAwKSkKKwkJX2RlYnVnKCJkZXN0cm95OiBxdWV1ZSBmYWlsZWQiKTsKKworCV9sZWF2ZSgiIik7CiB9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvY29ubl9ldmVudC5jIGIvbmV0L3J4cnBjL2Nvbm5fZXZlbnQuYwppbmRleCBjZWUwZjM1Li4zZjlkOGQ3IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvY29ubl9ldmVudC5jCisrKyBiL25ldC9yeHJwYy9jb25uX2V2ZW50LmMKQEAgLTE1LDIwICsxNSwxMjggQEAKICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaW42Lmg+Ci0jaW5jbHVkZSA8bGludXgvaWNtcC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSAiYXItaW50ZXJuYWwuaCIKIAogLyoKKyAqIFJldHJhbnNtaXQgdGVybWluYWwgQUNLIG9yIEFCT1JUIG9mIHRoZSBwcmV2aW91cyBjYWxsLgorICovCitzdGF0aWMgdm9pZCByeHJwY19jb25uX3JldHJhbnNtaXRfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJc3RydWN0IHJ4cnBjX2NoYW5uZWwgKmNoYW47CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92OworCXN0cnVjdCB7CisJCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOworCQl1bmlvbiB7CisJCQlzdHJ1Y3QgeworCQkJCV9fYmUzMiBjb2RlOworCQkJfSBhYm9ydDsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IHJ4cnBjX2Fja3BhY2tldCBhY2s7CisJCQkJdTggcGFkZGluZ1szXTsKKwkJCQlzdHJ1Y3QgcnhycGNfYWNraW5mbyBpbmZvOworCQkJfTsKKwkJfTsKKwl9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHBrdDsKKwlzaXplX3QgbGVuOworCXUzMiBzZXJpYWwsIG10dSwgY2FsbF9pZDsKKworCV9lbnRlcigiJWQiLCBjb25uLT5kZWJ1Z19pZCk7CisKKwljaGFuID0gJmNvbm4tPmNoYW5uZWxzW3NwLT5oZHIuY2lkICYgUlhSUENfQ0hBTk5FTE1BU0tdOworCisJLyogSWYgdGhlIGxhc3QgY2FsbCBnb3QgbW92ZWQgb24gd2hpbHN0IHdlIHdlcmUgd2FpdGluZyB0byBydW4sIGp1c3QKKwkgKiBpZ25vcmUgdGhpcyBwYWNrZXQuCisJICovCisJY2FsbF9pZCA9IFJFQURfT05DRShjaGFuLT5sYXN0X2NhbGwpOworCS8qIFN5bmMgd2l0aCBfX3J4cnBjX2Rpc2Nvbm5lY3RfY2FsbCgpICovCisJc21wX3JtYigpOworCWlmIChjYWxsX2lkICE9IHNwLT5oZHIuY2FsbE51bWJlcikKKwkJcmV0dXJuOworCisJbXNnLm1zZ19uYW1lCT0gJmNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0OworCW1zZy5tc2dfbmFtZWxlbgk9IGNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0X2xlbjsKKwltc2cubXNnX2NvbnRyb2wJPSBOVUxMOworCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJbXNnLm1zZ19mbGFncwk9IDA7CisKKwlwa3Qud2hkci5lcG9jaAkJPSBodG9ubChzcC0+aGRyLmVwb2NoKTsKKwlwa3Qud2hkci5jaWQJCT0gaHRvbmwoc3AtPmhkci5jaWQpOworCXBrdC53aGRyLmNhbGxOdW1iZXIJPSBodG9ubChzcC0+aGRyLmNhbGxOdW1iZXIpOworCXBrdC53aGRyLnNlcQkJPSAwOworCXBrdC53aGRyLnR5cGUJCT0gY2hhbi0+bGFzdF90eXBlOworCXBrdC53aGRyLmZsYWdzCQk9IGNvbm4tPm91dF9jbGllbnRmbGFnOworCXBrdC53aGRyLnVzZXJTdGF0dXMJPSAwOworCXBrdC53aGRyLnNlY3VyaXR5SW5kZXgJPSBjb25uLT5zZWN1cml0eV9peDsKKwlwa3Qud2hkci5fcnN2ZAkJPSAwOworCXBrdC53aGRyLnNlcnZpY2VJZAk9IGh0b25zKGNoYW4tPmxhc3Rfc2VydmljZV9pZCk7CisKKwlsZW4gPSBzaXplb2YocGt0LndoZHIpOworCXN3aXRjaCAoY2hhbi0+bGFzdF90eXBlKSB7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDoKKwkJcGt0LmFib3J0LmNvZGUJPSBodG9ubChjaGFuLT5sYXN0X2Fib3J0KTsKKwkJbGVuICs9IHNpemVvZihwa3QuYWJvcnQpOworCQlicmVhazsKKworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLOgorCQltdHUgPSBjb25uLT5wYXJhbXMucGVlci0+aWZfbXR1OworCQltdHUgLT0gY29ubi0+cGFyYW1zLnBlZXItPmhkcnNpemU7CisJCXBrdC5hY2suYnVmZmVyU3BhY2UJPSAwOworCQlwa3QuYWNrLm1heFNrZXcJCT0gaHRvbnMoc2tiLT5wcmlvcml0eSk7CisJCXBrdC5hY2suZmlyc3RQYWNrZXQJPSBodG9ubChjaGFuLT5sYXN0X3NlcSk7CisJCXBrdC5hY2sucHJldmlvdXNQYWNrZXQJPSBodG9ubChjaGFuLT5sYXN0X3NlcSAtIDEpOworCQlwa3QuYWNrLnNlcmlhbAkJPSBodG9ubChzcC0+aGRyLnNlcmlhbCk7CisJCXBrdC5hY2sucmVhc29uCQk9IFJYUlBDX0FDS19EVVBMSUNBVEU7CisJCXBrdC5hY2subkFja3MJCT0gMDsKKwkJcGt0LmluZm8ucnhNVFUJCT0gaHRvbmwocnhycGNfcnhfbXR1KTsKKwkJcGt0LmluZm8ubWF4TVRVCQk9IGh0b25sKG10dSk7CisJCXBrdC5pbmZvLnJ3aW5kCQk9IGh0b25sKHJ4cnBjX3J4X3dpbmRvd19zaXplKTsKKwkJcGt0LmluZm8uanVtYm9fbWF4CT0gaHRvbmwocnhycGNfcnhfanVtYm9fbWF4KTsKKwkJcGt0LndoZHIuZmxhZ3MJCXw9IFJYUlBDX1NMT1dfU1RBUlRfT0s7CisJCWxlbiArPSBzaXplb2YocGt0LmFjaykgKyBzaXplb2YocGt0LmluZm8pOworCQlicmVhazsKKwl9CisKKwkvKiBSZXN5bmMgd2l0aCBfX3J4cnBjX2Rpc2Nvbm5lY3RfY2FsbCgpIGFuZCBjaGVjayB0aGF0IHRoZSBsYXN0IGNhbGwKKwkgKiBkaWRuJ3QgZ2V0IGFkdmFuY2VkIHdoaWxzdCB3ZSB3ZXJlIGZpbGxpbmcgb3V0IHRoZSBwYWNrZXRzLgorCSAqLworCXNtcF9ybWIoKTsKKwlpZiAoUkVBRF9PTkNFKGNoYW4tPmxhc3RfY2FsbCkgIT0gY2FsbF9pZCkKKwkJcmV0dXJuOworCisJaW92Lmlvdl9iYXNlCT0gJnBrdDsKKwlpb3YuaW92X2xlbgk9IGxlbjsKKworCXNlcmlhbCA9IGF0b21pY19pbmNfcmV0dXJuKCZjb25uLT5zZXJpYWwpOworCXBrdC53aGRyLnNlcmlhbCA9IGh0b25sKHNlcmlhbCk7CisKKwlzd2l0Y2ggKGNoYW4tPmxhc3RfdHlwZSkgeworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQ6CisJCV9wcm90bygiVHggQUJPUlQgJSUldSB7ICVkIH0gW3JlXSIsIHNlcmlhbCwgY29ubi0+bG9jYWxfYWJvcnQpOworCQlicmVhazsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSzoKKwkJdHJhY2VfcnhycGNfdHhfYWNrKE5VTEwsIHNlcmlhbCwgY2hhbi0+bGFzdF9zZXEsIDAsCisJCQkJICAgUlhSUENfQUNLX0RVUExJQ0FURSwgMCk7CisJCV9wcm90bygiVHggQUNLICUlJXUgW3JlXSIsIHNlcmlhbCk7CisJCWJyZWFrOworCX0KKworCWtlcm5lbF9zZW5kbXNnKGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LCAmbXNnLCAmaW92LCAxLCBsZW4pOworCV9sZWF2ZSgiIik7CisJcmV0dXJuOworfQorCisvKgogICogcGFzcyBhIGNvbm5lY3Rpb24tbGV2ZWwgYWJvcnQgb250byBhbGwgY2FsbHMgb24gdGhhdCBjb25uZWN0aW9uCiAgKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2Fib3J0X2NhbGxzKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCBpbnQgc3RhdGUsCi0JCQkgICAgICB1MzIgYWJvcnRfY29kZSkKK3N0YXRpYyB2b2lkIHJ4cnBjX2Fib3J0X2NhbGxzKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJICAgICAgZW51bSByeHJwY19jYWxsX2NvbXBsZXRpb24gY29tcGwsCisJCQkgICAgICB1MzIgYWJvcnRfY29kZSwgaW50IGVycm9yKQogewogCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwogCWludCBpOwpAQCAtNDEsMTkgKzE0OSwxNSBAQAogCQljYWxsID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZCgKIAkJCWNvbm4tPmNoYW5uZWxzW2ldLmNhbGwsCiAJCQlsb2NrZGVwX2lzX2hlbGQoJmNvbm4tPmNoYW5uZWxfbG9jaykpOwotCQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJaWYgKGNhbGwtPnN0YXRlIDw9IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJCWNhbGwtPnN0YXRlID0gc3RhdGU7Ci0JCQlpZiAoc3RhdGUgPT0gUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQpIHsKLQkJCQljYWxsLT5sb2NhbF9hYm9ydCA9IGNvbm4tPmxvY2FsX2Fib3J0OwotCQkJCXNldF9iaXQoUlhSUENfQ0FMTF9FVl9DT05OX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FsbC0+cmVtb3RlX2Fib3J0ID0gY29ubi0+cmVtb3RlX2Fib3J0OwotCQkJCXNldF9iaXQoUlhSUENfQ0FMTF9FVl9SQ1ZEX0FCT1JULCAmY2FsbC0+ZXZlbnRzKTsKLQkJCX0KLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CisJCWlmIChjYWxsKSB7CisJCQlpZiAoY29tcGwgPT0gUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQpCisJCQkJdHJhY2VfcnhycGNfYWJvcnQoIkNPTiIsIGNhbGwtPmNpZCwKKwkJCQkJCSAgY2FsbC0+Y2FsbF9pZCwgMCwKKwkJCQkJCSAgYWJvcnRfY29kZSwgZXJyb3IpOworCQkJaWYgKHJ4cnBjX3NldF9jYWxsX2NvbXBsZXRpb24oY2FsbCwgY29tcGwsCisJCQkJCQkgICAgICBhYm9ydF9jb2RlLCBlcnJvcikpCisJCQkJcnhycGNfbm90aWZ5X3NvY2tldChjYWxsKTsKIAkJfQotCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwogCX0KIAogCXNwaW5fdW5sb2NrKCZjb25uLT5jaGFubmVsX2xvY2spOwpAQCAtNzgsMTcgKzE4MiwxNiBAQAogCiAJLyogZ2VuZXJhdGUgYSBjb25uZWN0aW9uLWxldmVsIGFib3J0ICovCiAJc3Bpbl9sb2NrX2JoKCZjb25uLT5zdGF0ZV9sb2NrKTsKLQlpZiAoY29ubi0+c3RhdGUgPCBSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURUQpIHsKLQkJY29ubi0+c3RhdGUgPSBSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRDsKLQkJY29ubi0+ZXJyb3IgPSBlcnJvcjsKLQkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnN0YXRlX2xvY2spOwotCX0gZWxzZSB7CisJaWYgKGNvbm4tPnN0YXRlID49IFJYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRCkgewogCQlzcGluX3VubG9ja19iaCgmY29ubi0+c3RhdGVfbG9jayk7CiAJCV9sZWF2ZSgiID0gMCBbYWxyZWFkeSBkZWFkXSIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlyeHJwY19hYm9ydF9jYWxscyhjb25uLCBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRCwgYWJvcnRfY29kZSk7CisJY29ubi0+c3RhdGUgPSBSWFJQQ19DT05OX0xPQ0FMTFlfQUJPUlRFRDsKKwlzcGluX3VubG9ja19iaCgmY29ubi0+c3RhdGVfbG9jayk7CisKKwlyeHJwY19hYm9ydF9jYWxscyhjb25uLCBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRCwgYWJvcnRfY29kZSwgZXJyb3IpOwogCiAJbXNnLm1zZ19uYW1lCT0gJmNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0OwogCW1zZy5tc2dfbmFtZWxlbgk9IGNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0X2xlbjsKQEAgLTEzMiwxNyArMjM1LDE4IEBACiAKIC8qCiAgKiBtYXJrIGEgY2FsbCBhcyBiZWluZyBvbiBhIG5vdy1zZWN1cmVkIGNoYW5uZWwKLSAqIC0gbXVzdCBiZSBjYWxsZWQgd2l0aCBzb2Z0aXJxcyBkaXNhYmxlZAorICogLSBtdXN0IGJlIGNhbGxlZCB3aXRoIEJIJ3MgZGlzYWJsZWQuCiAgKi8KIHN0YXRpYyB2b2lkIHJ4cnBjX2NhbGxfaXNfc2VjdXJlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQogewogCV9lbnRlcigiJXAiLCBjYWxsKTsKIAlpZiAoY2FsbCkgewotCQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFICYmCi0JCSAgICAhdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX1NFQ1VSRUQsICZjYWxsLT5ldmVudHMpKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQl3cml0ZV9sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwkJaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfU0VSVkVSX1NFQ1VSSU5HKSB7CisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0FDQ0VQVElORzsKKwkJCXJ4cnBjX25vdGlmeV9zb2NrZXQoY2FsbCk7CisJCX0KKwkJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKIAl9CiB9CiAKQEAgLTE1OSwyMiArMjYzLDI4IEBACiAJaW50IGxvb3AsIHJldDsKIAogCWlmIChjb25uLT5zdGF0ZSA+PSBSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURUQpIHsKLQkJa2xlYXZlKCIgPSAtRUNPTk5BQk9SVEVEIFsldV0iLCBjb25uLT5zdGF0ZSk7CisJCV9sZWF2ZSgiID0gLUVDT05OQUJPUlRFRCBbJXVdIiwgY29ubi0+c3RhdGUpOwogCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKIAl9CiAKIAlfZW50ZXIoInslZH0seyV1LCUlJXV9LCIsIGNvbm4tPmRlYnVnX2lkLCBzcC0+aGRyLnR5cGUsIHNwLT5oZHIuc2VyaWFsKTsKIAogCXN3aXRjaCAoc3AtPmhkci50eXBlKSB7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOgorCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUNLOgorCQlyeHJwY19jb25uX3JldHJhbnNtaXRfY2FsbChjb25uLCBza2IpOworCQlyZXR1cm4gMDsKKwogCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQ6Ci0JCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJnd0bXAsIHNpemVvZih3dG1wKSkgPCAwKQorCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpLAorCQkJCSAgJnd0bXAsIHNpemVvZih3dG1wKSkgPCAwKQogCQkJcmV0dXJuIC1FUFJPVE87CiAJCWFib3J0X2NvZGUgPSBudG9obCh3dG1wKTsKIAkJX3Byb3RvKCJSeCBBQk9SVCAlJSV1IHsgYWM9JWQgfSIsIHNwLT5oZHIuc2VyaWFsLCBhYm9ydF9jb2RlKTsKIAogCQljb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fUkVNT1RFTFlfQUJPUlRFRDsKIAkJcnhycGNfYWJvcnRfY2FsbHMoY29ubiwgUlhSUENfQ0FMTF9SRU1PVEVMWV9BQk9SVEVELAotCQkJCSAgYWJvcnRfY29kZSk7CisJCQkJICBhYm9ydF9jb2RlLCBFQ09OTkFCT1JURUQpOwogCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKIAogCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfQ0hBTExFTkdFOgpAQCAtMTk5LDE0ICszMDksMTYgQEAKIAogCQlpZiAoY29ubi0+c3RhdGUgPT0gUlhSUENfQ09OTl9TRVJWSUNFX0NIQUxMRU5HSU5HKSB7CiAJCQljb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fU0VSVklDRTsKKwkJCXNwaW5fdW5sb2NrKCZjb25uLT5zdGF0ZV9sb2NrKTsKIAkJCWZvciAobG9vcCA9IDA7IGxvb3AgPCBSWFJQQ19NQVhDQUxMUzsgbG9vcCsrKQogCQkJCXJ4cnBjX2NhbGxfaXNfc2VjdXJlKAogCQkJCQlyY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKAogCQkJCQkJY29ubi0+Y2hhbm5lbHNbbG9vcF0uY2FsbCwKIAkJCQkJCWxvY2tkZXBfaXNfaGVsZCgmY29ubi0+Y2hhbm5lbF9sb2NrKSkpOworCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2soJmNvbm4tPnN0YXRlX2xvY2spOwogCQl9CiAKLQkJc3Bpbl91bmxvY2soJmNvbm4tPnN0YXRlX2xvY2spOwogCQlzcGluX3VubG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKIAkJcmV0dXJuIDA7CiAKQEAgLTI2OSw3ICszODEsNyBAQAogCXUzMiBhYm9ydF9jb2RlID0gUlhfUFJPVE9DT0xfRVJST1I7CiAJaW50IHJldDsKIAotCV9lbnRlcigieyVkfSIsIGNvbm4tPmRlYnVnX2lkKTsKKwlyeHJwY19zZWVfY29ubmVjdGlvbihjb25uKTsKIAogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoUlhSUENfQ09OTl9FVl9DSEFMTEVOR0UsICZjb25uLT5ldmVudHMpKQogCQlyeHJwY19zZWN1cmVfY29ubmVjdGlvbihjb25uKTsKQEAgLTI3Nyw2ICszODksNyBAQAogCS8qIGdvIHRocm91Z2ggdGhlIGNvbm4tbGV2ZWwgZXZlbnQgcGFja2V0cywgcmVsZWFzaW5nIHRoZSByZWYgb24gdGhpcwogCSAqIGNvbm5lY3Rpb24gdGhhdCBlYWNoIG9uZSBoYXMgd2hlbiB3ZSd2ZSBmaW5pc2hlZCB3aXRoIGl0ICovCiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY29ubi0+cnhfcXVldWUpKSkgeworCQlyeHJwY19zZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X3NlZW4pOwogCQlyZXQgPSByeHJwY19wcm9jZXNzX2V2ZW50KGNvbm4sIHNrYiwgJmFib3J0X2NvZGUpOwogCQlzd2l0Y2ggKHJldCkgewogCQljYXNlIC1FUFJPVE86CkBAIC0yODcsNyArNDAwLDcgQEAKIAkJCWdvdG8gcmVxdWV1ZV9hbmRfbGVhdmU7CiAJCWNhc2UgLUVDT05OQUJPUlRFRDoKIAkJZGVmYXVsdDoKLQkJCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9mcmVlZCk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTMwNCw5MSArNDE3LDcgQEAKIHByb3RvY29sX2Vycm9yOgogCWlmIChyeHJwY19hYm9ydF9jb25uZWN0aW9uKGNvbm4sIC1yZXQsIGFib3J0X2NvZGUpIDwgMCkKIAkJZ290byByZXF1ZXVlX2FuZF9sZWF2ZTsKLQlyeHJwY19mcmVlX3NrYihza2IpOworCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKIAlfbGVhdmUoIiBbRVBST1RPXSIpOwogCWdvdG8gb3V0OwogfQotCi0vKgotICogcHV0IGEgcGFja2V0IHVwIGZvciB0cmFuc3BvcnQtbGV2ZWwgYWJvcnQKLSAqLwotdm9pZCByeHJwY19yZWplY3RfcGFja2V0KHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JQ0hFQ0tfU0xBQl9PS0FZKCZsb2NhbC0+dXNhZ2UpOwotCi0Jc2tiX3F1ZXVlX3RhaWwoJmxvY2FsLT5yZWplY3RfcXVldWUsIHNrYik7Ci0JcnhycGNfcXVldWVfbG9jYWwobG9jYWwpOwotfQotCi0vKgotICogcmVqZWN0IHBhY2tldHMgdGhyb3VnaCB0aGUgbG9jYWwgZW5kcG9pbnQKLSAqLwotdm9pZCByeHJwY19yZWplY3RfcGFja2V0cyhzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsKQotewotCXVuaW9uIHsKLQkJc3RydWN0IHNvY2thZGRyIHNhOwotCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOwotCX0gc2E7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIgd2hkcjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBtc2doZHIgbXNnOwotCXN0cnVjdCBrdmVjIGlvdlsyXTsKLQlzaXplX3Qgc2l6ZTsKLQlfX2JlMzIgY29kZTsKLQotCV9lbnRlcigiJWQiLCBsb2NhbC0+ZGVidWdfaWQpOwotCi0JaW92WzBdLmlvdl9iYXNlID0gJndoZHI7Ci0JaW92WzBdLmlvdl9sZW4gPSBzaXplb2Yod2hkcik7Ci0JaW92WzFdLmlvdl9iYXNlID0gJmNvZGU7Ci0JaW92WzFdLmlvdl9sZW4gPSBzaXplb2YoY29kZSk7Ci0Jc2l6ZSA9IHNpemVvZih3aGRyKSArIHNpemVvZihjb2RlKTsKLQotCW1zZy5tc2dfbmFtZSA9ICZzYTsKLQltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwotCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JbXNnLm1zZ19mbGFncyA9IDA7Ci0KLQltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKLQlzYS5zYS5zYV9mYW1pbHkgPSBsb2NhbC0+c3J4LnRyYW5zcG9ydC5mYW1pbHk7Ci0Jc3dpdGNoIChzYS5zYS5zYV9mYW1pbHkpIHsKLQljYXNlIEFGX0lORVQ6Ci0JCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihzYS5zaW4pOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltc2cubXNnX25hbWVsZW4gPSAwOwotCQlicmVhazsKLQl9Ci0KLQltZW1zZXQoJndoZHIsIDAsIHNpemVvZih3aGRyKSk7Ci0Jd2hkci50eXBlID0gUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQ7Ci0KLQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZsb2NhbC0+cmVqZWN0X3F1ZXVlKSkpIHsKLQkJc3AgPSByeHJwY19za2Ioc2tiKTsKLQkJc3dpdGNoIChzYS5zYS5zYV9mYW1pbHkpIHsKLQkJY2FzZSBBRl9JTkVUOgotCQkJc2Euc2luLnNpbl9wb3J0ID0gdWRwX2hkcihza2IpLT5zb3VyY2U7Ci0JCQlzYS5zaW4uc2luX2FkZHIuc19hZGRyID0gaXBfaGRyKHNrYiktPnNhZGRyOwotCQkJY29kZSA9IGh0b25sKHNrYi0+cHJpb3JpdHkpOwotCi0JCQl3aGRyLmVwb2NoCT0gaHRvbmwoc3AtPmhkci5lcG9jaCk7Ci0JCQl3aGRyLmNpZAk9IGh0b25sKHNwLT5oZHIuY2lkKTsKLQkJCXdoZHIuY2FsbE51bWJlcgk9IGh0b25sKHNwLT5oZHIuY2FsbE51bWJlcik7Ci0JCQl3aGRyLnNlcnZpY2VJZAk9IGh0b25zKHNwLT5oZHIuc2VydmljZUlkKTsKLQkJCXdoZHIuZmxhZ3MJPSBzcC0+aGRyLmZsYWdzOwotCQkJd2hkci5mbGFncwlePSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOwotCQkJd2hkci5mbGFncwkmPSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOwotCi0JCQlrZXJuZWxfc2VuZG1zZyhsb2NhbC0+c29ja2V0LCAmbXNnLCBpb3YsIDIsIHNpemUpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKLQl9Ci0KLQlfbGVhdmUoIiIpOwotfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2Nvbm5fb2JqZWN0LmMgYi9uZXQvcnhycGMvY29ubl9vYmplY3QuYwppbmRleCA4OTZkODQ0Li5lMWU4M2FmIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvY29ubl9vYmplY3QuYworKysgYi9uZXQvcnhycGMvY29ubl9vYmplY3QuYwpAQCAtMSw2ICsxLDYgQEAKLS8qIFJ4UlBDIHZpcnR1YWwgY29ubmVjdGlvbiBoYW5kbGVyCisvKiBSeFJQQyB2aXJ0dWFsIGNvbm5lY3Rpb24gaGFuZGxlciwgY29tbW9uIGJpdHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTUsOCArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxuZXQvc29jay5oPgotI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKIC8qCkBAIC0yNyw5ICsyNSwxMiBAQAogc3RhdGljIHZvaWQgcnhycGNfY29ubmVjdGlvbl9yZWFwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogTElTVF9IRUFEKHJ4cnBjX2Nvbm5lY3Rpb25zKTsKK0xJU1RfSEVBRChyeHJwY19jb25uZWN0aW9uX3Byb2NfbGlzdCk7CiBERUZJTkVfUldMT0NLKHJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CiBzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksocnhycGNfY29ubmVjdGlvbl9yZWFwLCByeHJwY19jb25uZWN0aW9uX3JlYXBlcik7CiAKK3N0YXRpYyB2b2lkIHJ4cnBjX2Rlc3Ryb3lfY29ubmVjdGlvbihzdHJ1Y3QgcmN1X2hlYWQgKik7CisKIC8qCiAgKiBhbGxvY2F0ZSBhIG5ldyBjb25uZWN0aW9uCiAgKi8KQEAgLTQxLDIxICs0MiwxOCBAQAogCiAJY29ubiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByeHJwY19jb25uZWN0aW9uKSwgZ2ZwKTsKIAlpZiAoY29ubikgeworCQlJTklUX0xJU1RfSEVBRCgmY29ubi0+Y2FjaGVfbGluayk7CiAJCXNwaW5fbG9ja19pbml0KCZjb25uLT5jaGFubmVsX2xvY2spOwotCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb25uLT5jaGFubmVsX3dxKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNvbm4tPndhaXRpbmdfY2FsbHMpOwogCQlJTklUX1dPUksoJmNvbm4tPnByb2Nlc3NvciwgJnJ4cnBjX3Byb2Nlc3NfY29ubmVjdGlvbik7CisJCUlOSVRfTElTVF9IRUFEKCZjb25uLT5wcm9jX2xpbmspOwogCQlJTklUX0xJU1RfSEVBRCgmY29ubi0+bGluayk7CiAJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNvbm4tPnJ4X3F1ZXVlKTsKIAkJY29ubi0+c2VjdXJpdHkgPSAmcnhycGNfbm9fc2VjdXJpdHk7CiAJCXNwaW5fbG9ja19pbml0KCZjb25uLT5zdGF0ZV9sb2NrKTsKLQkJLyogV2UgbWFpbnRhaW4gYW4gZXh0cmEgcmVmIG9uIHRoZSBjb25uZWN0aW9uIHdoaWxzdCBpdCBpcwotCQkgKiBvbiB0aGUgcnhycGNfY29ubmVjdGlvbnMgbGlzdC4KLQkJICovCi0JCWF0b21pY19zZXQoJmNvbm4tPnVzYWdlLCAyKTsKIAkJY29ubi0+ZGVidWdfaWQgPSBhdG9taWNfaW5jX3JldHVybigmcnhycGNfZGVidWdfaWQpOwotCQlhdG9taWNfc2V0KCZjb25uLT5hdmFpbF9jaGFucywgUlhSUENfTUFYQ0FMTFMpOwogCQljb25uLT5zaXplX2FsaWduID0gNDsKLQkJY29ubi0+aGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyKTsKKwkJY29ubi0+aWRsZV90aW1lc3RhbXAgPSBqaWZmaWVzOwogCX0KIAogCV9sZWF2ZSgiID0gJXB7JWR9IiwgY29ubiwgY29ubiA/IGNvbm4tPmRlYnVnX2lkIDogMCk7CkBAIC0xMzUsNiArMTMzLDE2IEBACiAJCQkgICAgc3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIuc19hZGRyKQogCQkJCWdvdG8gbm90X2ZvdW5kOwogCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCWlmIChwZWVyLT5zcngudHJhbnNwb3J0LnNpbjYuc2luNl9wb3J0ICE9CisJCQkgICAgc3J4LnRyYW5zcG9ydC5zaW42LnNpbjZfcG9ydCB8fAorCQkJICAgIG1lbWNtcCgmcGVlci0+c3J4LnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkciwKKwkJCQkgICAmc3J4LnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkciwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSkgIT0gMCkKKwkJCQlnb3RvIG5vdF9mb3VuZDsKKwkJCWJyZWFrOworI2VuZGlmCiAJCWRlZmF1bHQ6CiAJCQlCVUcoKTsKIAkJfQpAQCAtMTUzLDI1ICsxNjEsMzIgQEAKICAqIHRlcm1pbmF0ZXMuICBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgY2hhbm5lbF9sb2NrIGFuZCBtdXN0IHJlbGVhc2UgdGhlCiAgKiBjYWxsJ3MgcmVmIG9uIHRoZSBjb25uZWN0aW9uLgogICovCi12b2lkIF9fcnhycGNfZGlzY29ubmVjdF9jYWxsKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQordm9pZCBfX3J4cnBjX2Rpc2Nvbm5lY3RfY2FsbChzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKKwkJCSAgICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCiB7Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOwotCXN0cnVjdCByeHJwY19jaGFubmVsICpjaGFuID0gJmNvbm4tPmNoYW5uZWxzW2NhbGwtPmNoYW5uZWxdOworCXN0cnVjdCByeHJwY19jaGFubmVsICpjaGFuID0KKwkJJmNvbm4tPmNoYW5uZWxzW2NhbGwtPmNpZCAmIFJYUlBDX0NIQU5ORUxNQVNLXTsKIAotCV9lbnRlcigiJWQsJWQiLCBjb25uLT5kZWJ1Z19pZCwgY2FsbC0+Y2hhbm5lbCk7CisJX2VudGVyKCIlZCwleCIsIGNvbm4tPmRlYnVnX2lkLCBjYWxsLT5jaWQpOwogCiAJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihjaGFuLT5jYWxsKSA9PSBjYWxsKSB7CiAJCS8qIFNhdmUgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBzbyB0aGF0IHdlIGNhbiByZXBlYXQgaXQgaWYgbmVjZXNzYXJ5CiAJCSAqIHRocm91Z2ggdGhlIGNoYW5uZWwsIHdoaWxzdCBkaXNwb3Npbmcgb2YgdGhlIGFjdHVhbCBjYWxsIHJlY29yZC4KIAkJICovCi0JCWNoYW4tPmxhc3RfcmVzdWx0ID0gY2FsbC0+bG9jYWxfYWJvcnQ7CisJCWNoYW4tPmxhc3Rfc2VydmljZV9pZCA9IGNhbGwtPnNlcnZpY2VfaWQ7CisJCWlmIChjYWxsLT5hYm9ydF9jb2RlKSB7CisJCQljaGFuLT5sYXN0X2Fib3J0ID0gY2FsbC0+YWJvcnRfY29kZTsKKwkJCWNoYW4tPmxhc3RfdHlwZSA9IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUOworCQl9IGVsc2UgeworCQkJY2hhbi0+bGFzdF9zZXEgPSBjYWxsLT5yeF9oYXJkX2FjazsKKwkJCWNoYW4tPmxhc3RfdHlwZSA9IFJYUlBDX1BBQ0tFVF9UWVBFX0FDSzsKKwkJfQorCQkvKiBTeW5jIHdpdGggcnhycGNfY29ubl9yZXRyYW5zbWl0KCkuICovCiAJCXNtcF93bWIoKTsKIAkJY2hhbi0+bGFzdF9jYWxsID0gY2hhbi0+Y2FsbF9pZDsKIAkJY2hhbi0+Y2FsbF9pZCA9IGNoYW4tPmNhbGxfY291bnRlcjsKIAogCQlyY3VfYXNzaWduX3BvaW50ZXIoY2hhbi0+Y2FsbCwgTlVMTCk7Ci0JCWF0b21pY19pbmMoJmNvbm4tPmF2YWlsX2NoYW5zKTsKLQkJd2FrZV91cCgmY29ubi0+Y2hhbm5lbF93cSk7CiAJfQogCiAJX2xlYXZlKCIiKTsKQEAgLTE4NSwzNCArMjAwLDEyMiBAQAogewogCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKIAorCXNwaW5fbG9ja19iaCgmY29ubi0+cGFyYW1zLnBlZXItPmxvY2spOworCWhsaXN0X2RlbF9pbml0KCZjYWxsLT5lcnJvcl9saW5rKTsKKwlzcGluX3VubG9ja19iaCgmY29ubi0+cGFyYW1zLnBlZXItPmxvY2spOworCisJaWYgKHJ4cnBjX2lzX2NsaWVudF9jYWxsKGNhbGwpKQorCQlyZXR1cm4gcnhycGNfZGlzY29ubmVjdF9jbGllbnRfY2FsbChjYWxsKTsKKwogCXNwaW5fbG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKLQlfX3J4cnBjX2Rpc2Nvbm5lY3RfY2FsbChjYWxsKTsKKwlfX3J4cnBjX2Rpc2Nvbm5lY3RfY2FsbChjb25uLCBjYWxsKTsKIAlzcGluX3VubG9jaygmY29ubi0+Y2hhbm5lbF9sb2NrKTsKIAogCWNhbGwtPmNvbm4gPSBOVUxMOworCWNvbm4tPmlkbGVfdGltZXN0YW1wID0gamlmZmllczsKIAlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKIH0KIAogLyoKLSAqIHJlbGVhc2UgYSB2aXJ0dWFsIGNvbm5lY3Rpb24KKyAqIEtpbGwgb2ZmIGEgY29ubmVjdGlvbi4KICAqLwotdm9pZCByeHJwY19wdXRfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3ZvaWQgcnhycGNfa2lsbF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQogewotCWlmICghY29ubikKLQkJcmV0dXJuOworCUFTU0VSVCghcmN1X2FjY2Vzc19wb2ludGVyKGNvbm4tPmNoYW5uZWxzWzBdLmNhbGwpICYmCisJICAgICAgICFyY3VfYWNjZXNzX3BvaW50ZXIoY29ubi0+Y2hhbm5lbHNbMV0uY2FsbCkgJiYKKwkgICAgICAgIXJjdV9hY2Nlc3NfcG9pbnRlcihjb25uLT5jaGFubmVsc1syXS5jYWxsKSAmJgorCSAgICAgICAhcmN1X2FjY2Vzc19wb2ludGVyKGNvbm4tPmNoYW5uZWxzWzNdLmNhbGwpKTsKKwlBU1NFUlQobGlzdF9lbXB0eSgmY29ubi0+Y2FjaGVfbGluaykpOwogCi0JX2VudGVyKCIlcHt1PSVkLGQ9JWR9IiwKLQkgICAgICAgY29ubiwgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwgY29ubi0+ZGVidWdfaWQpOworCXdyaXRlX2xvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmY29ubi0+cHJvY19saW5rKTsKKwl3cml0ZV91bmxvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CiAKLQlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwgPiwgMSk7CisJLyogRHJhaW4gdGhlIFJ4IHF1ZXVlLiAgTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHdlJ3ZlIHVucHVibGlzaGVkLCBhbgorCSAqIGluY29taW5nIHBhY2tldCBjb3VsZCBzdGlsbCBiZSBiZWluZyBhZGRlZCB0byBvdXIgUnggcXVldWUsIHNvIHdlCisJICogd2lsbCBuZWVkIHRvIGRyYWluIGl0IGFnYWluIGluIHRoZSBSQ1UgY2xlYW51cCBoYW5kbGVyLgorCSAqLworCXJ4cnBjX3B1cmdlX3F1ZXVlKCZjb25uLT5yeF9xdWV1ZSk7CiAKLQljb25uLT5wdXRfdGltZSA9IGt0aW1lX2dldF9zZWNvbmRzKCk7Ci0JaWYgKGF0b21pY19kZWNfcmV0dXJuKCZjb25uLT51c2FnZSkgPT0gMSkgewotCQlfZGVidWcoInpvbWJpZSIpOwotCQlyeHJwY19xdWV1ZV9kZWxheWVkX3dvcmsoJnJ4cnBjX2Nvbm5lY3Rpb25fcmVhcCwgMCk7CisJLyogTGVhdmUgZmluYWwgZGVzdHJ1Y3Rpb24gdG8gUkNVLiAgVGhlIGNvbm5lY3Rpb24gcHJvY2Vzc29yIHdvcmsgaXRlbQorCSAqIG11c3QgY2FycnkgYSByZWYgb24gdGhlIGNvbm5lY3Rpb24gdG8gcHJldmVudCB1cyBnZXR0aW5nIGhlcmUgd2hpbHN0CisJICogaXQgaXMgcXVldWVkIG9yIHJ1bm5pbmcuCisJICovCisJY2FsbF9yY3UoJmNvbm4tPnJjdSwgcnhycGNfZGVzdHJveV9jb25uZWN0aW9uKTsKK30KKworLyoKKyAqIFF1ZXVlIGEgY29ubmVjdGlvbidzIHdvcmsgcHJvY2Vzc29yLCBnZXR0aW5nIGEgcmVmIHRvIHBhc3MgdG8gdGhlIHdvcmsKKyAqIHF1ZXVlLgorICovCitib29sIHJ4cnBjX3F1ZXVlX2Nvbm4oc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpbnQgbiA9IF9fYXRvbWljX2FkZF91bmxlc3MoJmNvbm4tPnVzYWdlLCAxLCAwKTsKKwlpZiAobiA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHJ4cnBjX3F1ZXVlX3dvcmsoJmNvbm4tPnByb2Nlc3NvcikpCisJCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9xdWV1ZWQsIG4gKyAxLCBoZXJlKTsKKwllbHNlCisJCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworCXJldHVybiB0cnVlOworfQorCisvKgorICogTm90ZSB0aGUgcmUtZW1lcmdlbmNlIG9mIGEgY29ubmVjdGlvbi4KKyAqLwordm9pZCByeHJwY19zZWVfY29ubmVjdGlvbihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubikKK3sKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCWlmIChjb25uKSB7CisJCWludCBuID0gYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKTsKKworCQl0cmFjZV9yeHJwY19jb25uKGNvbm4sIHJ4cnBjX2Nvbm5fc2VlbiwgbiwgaGVyZSk7CiAJfQorfQogCi0JX2xlYXZlKCIiKTsKKy8qCisgKiBHZXQgYSByZWYgb24gYSBjb25uZWN0aW9uLgorICovCit2b2lkIHJ4cnBjX2dldF9jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG4gPSBhdG9taWNfaW5jX3JldHVybigmY29ubi0+dXNhZ2UpOworCisJdHJhY2VfcnhycGNfY29ubihjb25uLCByeHJwY19jb25uX2dvdCwgbiwgaGVyZSk7Cit9CisKKy8qCisgKiBUcnkgdG8gZ2V0IGEgcmVmIG9uIGEgY29ubmVjdGlvbi4KKyAqLworc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKgorcnhycGNfZ2V0X2Nvbm5lY3Rpb25fbWF5YmUoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKworCWlmIChjb25uKSB7CisJCWludCBuID0gX19hdG9taWNfYWRkX3VubGVzcygmY29ubi0+dXNhZ2UsIDEsIDApOworCQlpZiAobiA+IDApCisJCQl0cmFjZV9yeHJwY19jb25uKGNvbm4sIHJ4cnBjX2Nvbm5fZ290LCBuICsgMSwgaGVyZSk7CisJCWVsc2UKKwkJCWNvbm4gPSBOVUxMOworCX0KKwlyZXR1cm4gY29ubjsKK30KKworLyoKKyAqIFJlbGVhc2UgYSBzZXJ2aWNlIGNvbm5lY3Rpb24KKyAqLwordm9pZCByeHJwY19wdXRfc2VydmljZV9jb25uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uKQoreworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJaW50IG47CisKKwluID0gYXRvbWljX2RlY19yZXR1cm4oJmNvbm4tPnVzYWdlKTsKKwl0cmFjZV9yeHJwY19jb25uKGNvbm4sIHJ4cnBjX2Nvbm5fcHV0X3NlcnZpY2UsIG4sIGhlcmUpOworCUFTU0VSVENNUChuLCA+PSwgMCk7CisJaWYgKG4gPT0gMCkKKwkJcnhycGNfcXVldWVfZGVsYXllZF93b3JrKCZyeHJwY19jb25uZWN0aW9uX3JlYXAsIDApOwogfQogCiAvKgpAQCAtMjQyLDE5ICszNDUsMTkgQEAKIH0KIAogLyoKLSAqIHJlYXAgZGVhZCBjb25uZWN0aW9ucworICogcmVhcCBkZWFkIHNlcnZpY2UgY29ubmVjdGlvbnMKICAqLwogc3RhdGljIHZvaWQgcnhycGNfY29ubmVjdGlvbl9yZWFwZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCAqX3A7Ci0JdW5zaWduZWQgbG9uZyByZWFwX29sZGVyX3RoYW4sIGVhcmxpZXN0LCBwdXRfdGltZSwgbm93OworCXVuc2lnbmVkIGxvbmcgcmVhcF9vbGRlcl90aGFuLCBlYXJsaWVzdCwgaWRsZV90aW1lc3RhbXAsIG5vdzsKIAogCUxJU1RfSEVBRChncmF2ZXlhcmQpOwogCiAJX2VudGVyKCIiKTsKIAotCW5vdyA9IGt0aW1lX2dldF9zZWNvbmRzKCk7Ci0JcmVhcF9vbGRlcl90aGFuID0gIG5vdyAtIHJ4cnBjX2Nvbm5lY3Rpb25fZXhwaXJ5OworCW5vdyA9IGppZmZpZXM7CisJcmVhcF9vbGRlcl90aGFuID0gbm93IC0gcnhycGNfY29ubmVjdGlvbl9leHBpcnkgKiBIWjsKIAllYXJsaWVzdCA9IFVMT05HX01BWDsKIAogCXdyaXRlX2xvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CkBAIC0yNjIsMTEgKzM2NSwxNyBAQAogCQlBU1NFUlRDTVAoYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwgPiwgMCk7CiAJCWlmIChsaWtlbHkoYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSA+IDEpKQogCQkJY29udGludWU7CisJCWlmIChjb25uLT5zdGF0ZSA9PSBSWFJQQ19DT05OX1NFUlZJQ0VfUFJFQUxMT0MpCisJCQljb250aW51ZTsKIAotCQlwdXRfdGltZSA9IFJFQURfT05DRShjb25uLT5wdXRfdGltZSk7Ci0JCWlmICh0aW1lX2FmdGVyKHB1dF90aW1lLCByZWFwX29sZGVyX3RoYW4pKSB7Ci0JCQlpZiAodGltZV9iZWZvcmUocHV0X3RpbWUsIGVhcmxpZXN0KSkKLQkJCQllYXJsaWVzdCA9IHB1dF90aW1lOworCQlpZGxlX3RpbWVzdGFtcCA9IFJFQURfT05DRShjb25uLT5pZGxlX3RpbWVzdGFtcCk7CisJCV9kZWJ1ZygicmVhcCBDT05OICVkIHsgdT0lZCx0PSVsZCB9IiwKKwkJICAgICAgIGNvbm4tPmRlYnVnX2lkLCBhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLAorCQkgICAgICAgKGxvbmcpcmVhcF9vbGRlcl90aGFuIC0gKGxvbmcpaWRsZV90aW1lc3RhbXApOworCisJCWlmICh0aW1lX2FmdGVyKGlkbGVfdGltZXN0YW1wLCByZWFwX29sZGVyX3RoYW4pKSB7CisJCQlpZiAodGltZV9iZWZvcmUoaWRsZV90aW1lc3RhbXAsIGVhcmxpZXN0KSkKKwkJCQllYXJsaWVzdCA9IGlkbGVfdGltZXN0YW1wOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMjc3LDcgKzM4Niw3IEBACiAJCQljb250aW51ZTsKIAogCQlpZiAocnhycGNfY29ubl9pc19jbGllbnQoY29ubikpCi0JCQlyeHJwY191bnB1Ymxpc2hfY2xpZW50X2Nvbm4oY29ubik7CisJCQlCVUcoKTsKIAkJZWxzZQogCQkJcnhycGNfdW5wdWJsaXNoX3NlcnZpY2VfY29ubihjb25uKTsKIApAQCAtMjg3LDkgKzM5Niw5IEBACiAKIAlpZiAoZWFybGllc3QgIT0gVUxPTkdfTUFYKSB7CiAJCV9kZWJ1ZygicmVzY2hlZHVsZSByZWFwZXIgJWxkIiwgKGxvbmcpIGVhcmxpZXN0IC0gbm93KTsKLQkJQVNTRVJUQ01QKGVhcmxpZXN0LCA+LCBub3cpOworCQlBU1NFUlQodGltZV9hZnRlcihlYXJsaWVzdCwgbm93KSk7CiAJCXJ4cnBjX3F1ZXVlX2RlbGF5ZWRfd29yaygmcnhycGNfY29ubmVjdGlvbl9yZWFwLAotCQkJCQkgKGVhcmxpZXN0IC0gbm93KSAqIEhaKTsKKwkJCQkJIGVhcmxpZXN0IC0gbm93KTsKIAl9CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmdyYXZleWFyZCkpIHsKQEAgLTI5OCwxNiArNDA3LDE1IEBACiAJCWxpc3RfZGVsX2luaXQoJmNvbm4tPmxpbmspOwogCiAJCUFTU0VSVENNUChhdG9taWNfcmVhZCgmY29ubi0+dXNhZ2UpLCA9PSwgMCk7Ci0JCXNrYl9xdWV1ZV9wdXJnZSgmY29ubi0+cnhfcXVldWUpOwotCQljYWxsX3JjdSgmY29ubi0+cmN1LCByeHJwY19kZXN0cm95X2Nvbm5lY3Rpb24pOworCQlyeHJwY19raWxsX2Nvbm5lY3Rpb24oY29ubik7CiAJfQogCiAJX2xlYXZlKCIiKTsKIH0KIAogLyoKLSAqIHByZWVtcHRpdmVseSBkZXN0cm95IGFsbCB0aGUgY29ubmVjdGlvbiByZWNvcmRzIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZW0KLSAqIHRvIHRpbWUgb3V0CisgKiBwcmVlbXB0aXZlbHkgZGVzdHJveSBhbGwgdGhlIHNlcnZpY2UgY29ubmVjdGlvbiByZWNvcmRzIHJhdGhlciB0aGFuCisgKiB3YWl0aW5nIGZvciB0aGVtIHRvIHRpbWUgb3V0CiAgKi8KIHZvaWQgX19leGl0IHJ4cnBjX2Rlc3Ryb3lfYWxsX2Nvbm5lY3Rpb25zKHZvaWQpCiB7CkBAIC0zMTYsNiArNDI0LDggQEAKIAogCV9lbnRlcigiIik7CiAKKwlyeHJwY19kZXN0cm95X2FsbF9jbGllbnRfY29ubmVjdGlvbnMoKTsKKwogCXJ4cnBjX2Nvbm5lY3Rpb25fZXhwaXJ5ID0gMDsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZyeHJwY19jb25uZWN0aW9uX3JlYXApOwogCXJ4cnBjX3F1ZXVlX2RlbGF5ZWRfd29yaygmcnhycGNfY29ubmVjdGlvbl9yZWFwLCAwKTsKQEAgLTMzMCw2ICs0NDAsOCBAQAogCXdyaXRlX3VubG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKIAlCVUdfT04obGVhayk7CiAKKwlBU1NFUlQobGlzdF9lbXB0eSgmcnhycGNfY29ubmVjdGlvbl9wcm9jX2xpc3QpKTsKKwogCS8qIE1ha2Ugc3VyZSB0aGUgbG9jYWwgYW5kIHBlZXIgcmVjb3JkcyBwaW5uZWQgYnkgYW55IGR5aW5nIGNvbm5lY3Rpb25zCiAJICogYXJlIHJlbGVhc2VkLgogCSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2Nvbm5fc2VydmljZS5jIGIvbmV0L3J4cnBjL2Nvbm5fc2VydmljZS5jCmluZGV4IGZkOTAyN2MuLmVlZjU1MWYgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9jb25uX3NlcnZpY2UuYworKysgYi9uZXQvcnhycGMvY29ubl9zZXJ2aWNlLmMKQEAgLTY1LDkgKzY1LDggQEAKICAqIEluc2VydCBhIHNlcnZpY2UgY29ubmVjdGlvbiBpbnRvIGEgcGVlcidzIHRyZWUsIHRoZXJlYnkgbWFraW5nIGl0IGEgdGFyZ2V0CiAgKiBmb3IgaW5jb21pbmcgcGFja2V0cy4KICAqLwotc3RhdGljIHN0cnVjdCByeHJwY19jb25uZWN0aW9uICoKLXJ4cnBjX3B1Ymxpc2hfc2VydmljZV9jb25uKHN0cnVjdCByeHJwY19wZWVyICpwZWVyLAotCQkJICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCitzdGF0aWMgdm9pZCByeHJwY19wdWJsaXNoX3NlcnZpY2VfY29ubihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwKKwkJCQkgICAgICAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4pCiB7CiAJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmN1cnNvciA9IE5VTEw7CiAJc3RydWN0IHJ4cnBjX2Nvbm5fcHJvdG8gayA9IGNvbm4tPnByb3RvOwpAQCAtOTYsNyArOTUsNyBAQAogCXNldF9iaXQoUlhSUENfQ09OTl9JTl9TRVJWSUNFX0NPTk5TLCAmY29ubi0+ZmxhZ3MpOwogCXdyaXRlX3NlcXVubG9ja19iaCgmcGVlci0+c2VydmljZV9jb25uX2xvY2spOwogCV9sZWF2ZSgiID0gJWQgW25ld10iLCBjb25uLT5kZWJ1Z19pZCk7Ci0JcmV0dXJuIGNvbm47CisJcmV0dXJuOwogCiBmb3VuZF9leHRhbnRfY29ubjoKIAlpZiAoYXRvbWljX3JlYWQoJmN1cnNvci0+dXNhZ2UpID09IDApCkBAIC0xMTksMTAwICsxMTgsNTggQEAKIH0KIAogLyoKLSAqIGdldCBhIHJlY29yZCBvZiBhbiBpbmNvbWluZyBjb25uZWN0aW9uCisgKiBQcmVhbGxvY2F0ZSBhIHNlcnZpY2UgY29ubmVjdGlvbi4gIFRoZSBjb25uZWN0aW9uIGlzIHBsYWNlZCBvbiB0aGUgcHJvYyBhbmQKKyAqIHJlYXAgbGlzdHMgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGdldCB0aGUgbG9jayBmcm9tIEJIIGNvbnRleHQuCiAgKi8KLXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpyeHJwY19pbmNvbWluZ19jb25uZWN0aW9uKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsCi0JCQkJCQkgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKnNyeCwKLQkJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCitzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfcHJlYWxsb2Nfc2VydmljZV9jb25uZWN0aW9uKGdmcF90IGdmcCkKIHsKLQlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiA9IHJ4cnBjX2FsbG9jX2Nvbm5lY3Rpb24oZ2ZwKTsKKworCWlmIChjb25uKSB7CisJCS8qIFdlIG1haW50YWluIGFuIGV4dHJhIHJlZiBvbiB0aGUgY29ubmVjdGlvbiB3aGlsc3QgaXQgaXMgb24KKwkJICogdGhlIHJ4cnBjX2Nvbm5lY3Rpb25zIGxpc3QuCisJCSAqLworCQljb25uLT5zdGF0ZSA9IFJYUlBDX0NPTk5fU0VSVklDRV9QUkVBTExPQzsKKwkJYXRvbWljX3NldCgmY29ubi0+dXNhZ2UsIDIpOworCisJCXdyaXRlX2xvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisJCWxpc3RfYWRkX3RhaWwoJmNvbm4tPmxpbmssICZyeHJwY19jb25uZWN0aW9ucyk7CisJCWxpc3RfYWRkX3RhaWwoJmNvbm4tPnByb2NfbGluaywgJnJ4cnBjX2Nvbm5lY3Rpb25fcHJvY19saXN0KTsKKwkJd3JpdGVfdW5sb2NrKCZyeHJwY19jb25uZWN0aW9uX2xvY2spOworCisJCXRyYWNlX3J4cnBjX2Nvbm4oY29ubiwgcnhycGNfY29ubl9uZXdfc2VydmljZSwKKwkJCQkgYXRvbWljX3JlYWQoJmNvbm4tPnVzYWdlKSwKKwkJCQkgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwl9CisKKwlyZXR1cm4gY29ubjsKK30KKworLyoKKyAqIFNldCB1cCBhbiBpbmNvbWluZyBjb25uZWN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgaW4gQkggY29udGV4dCB3aXRoIHRoZSBSQ1UKKyAqIHJlYWQgbG9jayBoZWxkLgorICovCit2b2lkIHJ4cnBjX25ld19pbmNvbWluZ19jb25uZWN0aW9uKHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLAorCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCit7CiAJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwotCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOwotCWNvbnN0IGNoYXIgKm5ldyA9ICJvbGQiOwogCiAJX2VudGVyKCIiKTsKIAotCXBlZXIgPSByeHJwY19sb29rdXBfcGVlcihsb2NhbCwgc3J4LCBHRlBfTk9JTyk7Ci0JaWYgKCFwZWVyKSB7Ci0JCV9kZWJ1Zygibm8gcGVlciIpOwotCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOwotCX0KLQotCUFTU0VSVChzcC0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCk7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcGVlciA9IHJ4cnBjX2xvb2t1cF9wZWVyX3JjdShsb2NhbCwgc3J4KTsKLQlpZiAocGVlcikgewotCQljb25uID0gcnhycGNfZmluZF9zZXJ2aWNlX2Nvbm5fcmN1KHBlZXIsIHNrYik7Ci0JCWlmIChjb25uKSB7Ci0JCQlpZiAoc3AtPmhkci5zZWN1cml0eUluZGV4ICE9IGNvbm4tPnNlY3VyaXR5X2l4KQotCQkJCWdvdG8gc2VjdXJpdHlfbWlzbWF0Y2hfcmN1OwotCQkJaWYgKHJ4cnBjX2dldF9jb25uZWN0aW9uX21heWJlKGNvbm4pKQotCQkJCWdvdG8gZm91bmRfZXh0YW50X2Nvbm5lY3Rpb25fcmN1OwotCi0JCQkvKiBUaGUgY29ubiBoYXMgZXhwaXJlZCBidXQgd2UgY2FuJ3QgcmVtb3ZlIGl0IHdpdGhvdXQKLQkJCSAqIHRoZSBhcHByb3ByaWF0ZSBsb2NrLCBzbyB3ZSBhdHRlbXB0IHRvIHJlcGxhY2UgaXQKLQkJCSAqIHdoZW4gd2UgaGF2ZSBhIG5ldyBjYW5kaWRhdGUuCi0JCQkgKi8KLQkJfQotCi0JCWlmICghcnhycGNfZ2V0X3BlZXJfbWF5YmUocGVlcikpCi0JCQlwZWVyID0gTlVMTDsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlpZiAoIXBlZXIpIHsKLQkJcGVlciA9IHJ4cnBjX2xvb2t1cF9wZWVyKGxvY2FsLCBzcngsIEdGUF9OT0lPKTsKLQkJaWYgKCFwZWVyKQotCQkJZ290byBlbm9tZW07Ci0JfQotCi0JLyogV2UgZG9uJ3QgaGF2ZSBhIG1hdGNoaW5nIHJlY29yZCB5ZXQuICovCi0JY29ubiA9IHJ4cnBjX2FsbG9jX2Nvbm5lY3Rpb24oR0ZQX05PSU8pOwotCWlmICghY29ubikKLQkJZ290byBlbm9tZW1fcGVlcjsKLQogCWNvbm4tPnByb3RvLmVwb2NoCT0gc3AtPmhkci5lcG9jaDsKIAljb25uLT5wcm90by5jaWQJCT0gc3AtPmhkci5jaWQgJiBSWFJQQ19DSURNQVNLOwotCWNvbm4tPnBhcmFtcy5sb2NhbAk9IGxvY2FsOwotCWNvbm4tPnBhcmFtcy5wZWVyCT0gcGVlcjsKIAljb25uLT5wYXJhbXMuc2VydmljZV9pZAk9IHNwLT5oZHIuc2VydmljZUlkOwogCWNvbm4tPnNlY3VyaXR5X2l4CT0gc3AtPmhkci5zZWN1cml0eUluZGV4OwogCWNvbm4tPm91dF9jbGllbnRmbGFnCT0gMDsKLQljb25uLT5zdGF0ZQkJPSBSWFJQQ19DT05OX1NFUlZJQ0U7Ci0JaWYgKGNvbm4tPnBhcmFtcy5zZXJ2aWNlX2lkKQorCWlmIChjb25uLT5zZWN1cml0eV9peCkKIAkJY29ubi0+c3RhdGUJPSBSWFJQQ19DT05OX1NFUlZJQ0VfVU5TRUNVUkVEOwotCi0JcnhycGNfZ2V0X2xvY2FsKGxvY2FsKTsKLQotCXdyaXRlX2xvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmY29ubi0+bGluaywgJnJ4cnBjX2Nvbm5lY3Rpb25zKTsKLQl3cml0ZV91bmxvY2soJnJ4cnBjX2Nvbm5lY3Rpb25fbG9jayk7CisJZWxzZQorCQljb25uLT5zdGF0ZQk9IFJYUlBDX0NPTk5fU0VSVklDRTsKIAogCS8qIE1ha2UgdGhlIGNvbm5lY3Rpb24gYSB0YXJnZXQgZm9yIGluY29taW5nIHBhY2tldHMuICovCi0JcnhycGNfcHVibGlzaF9zZXJ2aWNlX2Nvbm4ocGVlciwgY29ubik7CisJcnhycGNfcHVibGlzaF9zZXJ2aWNlX2Nvbm4oY29ubi0+cGFyYW1zLnBlZXIsIGNvbm4pOwogCi0JbmV3ID0gIm5ldyI7Ci0KLXN1Y2Nlc3M6Ci0JX25ldCgiQ09OTkVDVElPTiAlcyAlZCB7JXh9IiwgbmV3LCBjb25uLT5kZWJ1Z19pZCwgY29ubi0+cHJvdG8uY2lkKTsKLQlfbGVhdmUoIiA9ICVwIHt1PSVkfSIsIGNvbm4sIGF0b21pY19yZWFkKCZjb25uLT51c2FnZSkpOwotCXJldHVybiBjb25uOwotCi1mb3VuZF9leHRhbnRfY29ubmVjdGlvbl9yY3U6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JZ290byBzdWNjZXNzOwotCi1zZWN1cml0eV9taXNtYXRjaF9yY3U6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JX2xlYXZlKCIgPSAtRUtFWVJFSkVDVEVEIik7Ci0JcmV0dXJuIEVSUl9QVFIoLUVLRVlSRUpFQ1RFRCk7Ci0KLWVub21lbV9wZWVyOgotCXJ4cnBjX3B1dF9wZWVyKHBlZXIpOwotZW5vbWVtOgotCV9sZWF2ZSgiID0gLUVOT01FTSIpOwotCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCV9uZXQoIkNPTk5FQ1RJT04gbmV3ICVkIHsleH0iLCBjb25uLT5kZWJ1Z19pZCwgY29ubi0+cHJvdG8uY2lkKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9pbnB1dC5jIGIvbmV0L3J4cnBjL2lucHV0LmMKaW5kZXggNzBiYjc3OC4uM2FkOWY3NSAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2lucHV0LmMKKysrIGIvbmV0L3J4cnBjL2lucHV0LmMKQEAgLTEsNiArMSw2IEBACiAvKiBSeFJQQyBwYWNrZXQgcmVjZXB0aW9uCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNywgMjAxNiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMjcsNTUwICsyNyw5MjAgQEAKICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKLS8qCi0gKiBxdWV1ZSBhIHBhY2tldCBmb3IgcmVjdm1zZyB0byBwYXNzIHRvIHVzZXJzcGFjZQotICogLSB0aGUgY2FsbGVyIG11c3QgaG9sZCBhIGxvY2sgb24gY2FsbC0+bG9jawotICogLSBtdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIChza19maWx0ZXIoKSBkaXNhYmxlcyBCSCdzKQotICogLSBlYXRzIHRoZSBwYWNrZXQgd2hldGhlciBzdWNjZXNzZnVsIG9yIG5vdAotICogLSB0aGVyZSBtdXN0IGJlIGp1c3Qgb25lIHJlZmVyZW5jZSB0byB0aGUgcGFja2V0LCB3aGljaCB0aGUgY2FsbGVyIHBhc3NlcyB0bwotICogICB0aGlzIGZ1bmN0aW9uCi0gKi8KLWludCByeHJwY19xdWV1ZV9yY3Zfc2tiKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJYm9vbCBmb3JjZSwgYm9vbCB0ZXJtaW5hbCkKK3N0YXRpYyB2b2lkIHJ4cnBjX3Byb3RvX2Fib3J0KGNvbnN0IGNoYXIgKndoeSwKKwkJCSAgICAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCByeHJwY19zZXFfdCBzZXEpCiB7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSBjYWxsLT5zb2NrZXQ7Ci0Jc3RydWN0IHNvY2sgKnNrOwotCWludCByZXQ7Ci0KLQlfZW50ZXIoIiwsJWQsJWQiLCBmb3JjZSwgdGVybWluYWwpOwotCi0JQVNTRVJUKCFpcnFzX2Rpc2FibGVkKCkpOwotCi0Jc3AgPSByeHJwY19za2Ioc2tiKTsKLQlBU1NFUlRDTVAoc3AtPmNhbGwsID09LCBjYWxsKTsKLQotCS8qIGlmIHdlJ3ZlIGFscmVhZHkgcG9zdGVkIHRoZSB0ZXJtaW5hbCBtZXNzYWdlIGZvciBhIGNhbGwsIHRoZW4gd2UKLQkgKiBkb24ndCBwb3N0IGFueSBtb3JlICovCi0JaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfVEVSTUlOQUxfTVNHLCAmY2FsbC0+ZmxhZ3MpKSB7Ci0JCV9kZWJ1ZygiYWxyZWFkeSB0ZXJtaW5hdGVkIik7Ci0JCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgPj0sIFJYUlBDX0NBTExfQ09NUExFVEUpOwotCQlyeHJwY19mcmVlX3NrYihza2IpOwotCQlyZXR1cm4gMDsKKwlpZiAocnhycGNfYWJvcnRfY2FsbCh3aHksIGNhbGwsIHNlcSwgUlhfUFJPVE9DT0xfRVJST1IsIEVCQURNU0cpKSB7CisJCXNldF9iaXQoUlhSUENfQ0FMTF9FVl9BQk9SVCwgJmNhbGwtPmV2ZW50cyk7CisJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7CiAJfQotCi0Jc2sgPSAmcngtPnNrOwotCi0JaWYgKCFmb3JjZSkgewotCQkvKiBjYXN0IHNrYi0+cmN2YnVmIHRvIHVuc2lnbmVkLi4uICBJdCdzIHBvaW50bGVzcywgYnV0Ci0JCSAqIHJlZHVjZXMgbnVtYmVyIG9mIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggLVcKLQkJICogLS1BTksgKi8KLS8vCQlyZXQgPSAtRU5PQlVGUzsKLS8vCQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSArIHNrYi0+dHJ1ZXNpemUgPj0KLS8vCQkgICAgKHVuc2lnbmVkIGludCkgc2stPnNrX3JjdmJ1ZikKLS8vCQkJZ290byBvdXQ7Ci0KLQkJcmV0ID0gc2tfZmlsdGVyKHNrLCBza2IpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0OwotCX0KLQotCXNwaW5fbG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7Ci0JaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1RFUk1JTkFMX01TRywgJmNhbGwtPmZsYWdzKSAmJgotCSAgICAhdGVzdF9iaXQoUlhSUENfQ0FMTF9SRUxFQVNFRCwgJmNhbGwtPmZsYWdzKSAmJgotCSAgICBjYWxsLT5zb2NrZXQtPnNrLnNrX3N0YXRlICE9IFJYUlBDX0NMT1NFKSB7Ci0JCXNrYi0+ZGVzdHJ1Y3RvciA9IHJ4cnBjX3BhY2tldF9kZXN0cnVjdG9yOwotCQlza2ItPmRldiA9IE5VTEw7Ci0JCXNrYi0+c2sgPSBzazsKLQkJYXRvbWljX2FkZChza2ItPnRydWVzaXplLCAmc2stPnNrX3JtZW1fYWxsb2MpOwotCi0JCWlmICh0ZXJtaW5hbCkgewotCQkJX2RlYnVnKCI8PDw8IFRFUk1JTkFMIE1FU1NBR0UgPj4+PiIpOwotCQkJc2V0X2JpdChSWFJQQ19DQUxMX1RFUk1JTkFMX01TRywgJmNhbGwtPmZsYWdzKTsKLQkJfQotCi0JCS8qIGFsbG93IGludGVyY2VwdGlvbiBieSBhIGtlcm5lbCBzZXJ2aWNlICovCi0JCWlmIChyeC0+aW50ZXJjZXB0b3IpIHsKLQkJCXJ4LT5pbnRlcmNlcHRvcihzaywgY2FsbC0+dXNlcl9jYWxsX0lELCBza2IpOwotCQkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwotCQl9IGVsc2UgewotCQkJX25ldCgicG9zdCBza2IgJXAiLCBza2IpOwotCQkJX19za2JfcXVldWVfdGFpbCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7Ci0JCQlzcGluX3VubG9ja19iaCgmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7Ci0KLQkJCWlmICghc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpKQotCQkJCXNrLT5za19kYXRhX3JlYWR5KHNrKTsKLQkJfQotCQlza2IgPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKLQl9Ci0JcmV0ID0gMDsKLQotb3V0OgotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0KLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwogfQogCiAvKgotICogcHJvY2VzcyBhIERBVEEgcGFja2V0LCBwb3N0aW5nIHRoZSBwYWNrZXQgdG8gdGhlIGFwcHJvcHJpYXRlIHF1ZXVlCi0gKiAtIGVhdHMgdGhlIHBhY2tldCBpZiBzdWNjZXNzZnVsCisgKiBEbyBUQ1Atc3R5bGUgY29uZ2VzdGlvbiBtYW5hZ2VtZW50IFtSRkMgNTY4MV0uCiAgKi8KLXN0YXRpYyBpbnQgcnhycGNfZmFzdF9wcm9jZXNzX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHNlcSkKK3N0YXRpYyB2b2lkIHJ4cnBjX2Nvbmdlc3Rpb25fbWFuYWdlbWVudChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJc3RydWN0IHJ4cnBjX2Fja19zdW1tYXJ5ICpzdW1tYXJ5LAorCQkJCQlyeHJwY19zZXJpYWxfdCBhY2tlZF9zZXJpYWwpCiB7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlib29sIHRlcm1pbmFsOwotCWludCByZXQsIGFja2JpdCwgYWNrOwotCXUzMiBzZXJpYWw7Ci0JdTggZmxhZ3M7CisJZW51bSByeHJwY19jb25nZXN0X2NoYW5nZSBjaGFuZ2UgPSByeHJwY19jb25nX25vX2NoYW5nZTsKKwl1bnNpZ25lZCBpbnQgY3VtdWxhdGl2ZV9hY2tzID0gY2FsbC0+Y29uZ19jdW11bF9hY2tzOworCXVuc2lnbmVkIGludCBjd25kID0gY2FsbC0+Y29uZ19jd25kOworCWJvb2wgcmVzZW5kID0gZmFsc2U7CiAKLQlfZW50ZXIoInsldSwldX0sLHsldX0iLCBjYWxsLT5yeF9kYXRhX3Bvc3QsIGNhbGwtPnJ4X2ZpcnN0X29vcywgc2VxKTsKKwlzdW1tYXJ5LT5mbGlnaHRfc2l6ZSA9CisJCShjYWxsLT50eF90b3AgLSBjYWxsLT50eF9oYXJkX2FjaykgLSBzdW1tYXJ5LT5ucl9hY2tzOwogCi0Jc3AgPSByeHJwY19za2Ioc2tiKTsKLQlBU1NFUlRDTVAoc3AtPmNhbGwsID09LCBOVUxMKTsKLQlmbGFncyA9IHNwLT5oZHIuZmxhZ3M7Ci0Jc2VyaWFsID0gc3AtPmhkci5zZXJpYWw7Ci0KLQlzcGluX2xvY2soJmNhbGwtPmxvY2spOwotCi0JaWYgKGNhbGwtPnN0YXRlID4gUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJZ290byBkaXNjYXJkOwotCi0JQVNTRVJUQ01QKGNhbGwtPnJ4X2RhdGFfZXhwZWN0LCA+PSwgY2FsbC0+cnhfZGF0YV9wb3N0KTsKLQlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9wb3N0LCA+PSwgY2FsbC0+cnhfZGF0YV9yZWN2KTsKLQlBU1NFUlRDTVAoY2FsbC0+cnhfZGF0YV9yZWN2LCA+PSwgY2FsbC0+cnhfZGF0YV9lYXRlbik7Ci0KLQlpZiAoc2VxIDwgY2FsbC0+cnhfZGF0YV9wb3N0KSB7Ci0JCV9kZWJ1ZygiZHVwICMldSBbLSV1XSIsIHNlcSwgY2FsbC0+cnhfZGF0YV9wb3N0KTsKLQkJYWNrID0gUlhSUENfQUNLX0RVUExJQ0FURTsKLQkJcmV0ID0gLUVOT0JVRlM7Ci0JCWdvdG8gZGlzY2FyZF9hbmRfYWNrOwotCX0KLQotCS8qIHdlIG1heSBhbHJlYWR5IGhhdmUgdGhlIHBhY2tldCBpbiB0aGUgb3V0IG9mIHNlcXVlbmNlIHF1ZXVlICovCi0JYWNrYml0ID0gc2VxIC0gKGNhbGwtPnJ4X2RhdGFfZWF0ZW4gKyAxKTsKLQlBU1NFUlRDTVAoYWNrYml0LCA+PSwgMCk7Ci0JaWYgKF9fdGVzdF9hbmRfc2V0X2JpdChhY2tiaXQsIGNhbGwtPmFja3Jfd2luZG93KSkgewotCQlfZGVidWcoImR1cCBvb3MgIyV1IFsldSwldV0iLAotCQkgICAgICAgc2VxLCBjYWxsLT5yeF9kYXRhX2VhdGVuLCBjYWxsLT5yeF9kYXRhX3Bvc3QpOwotCQlhY2sgPSBSWFJQQ19BQ0tfRFVQTElDQVRFOwotCQlnb3RvIGRpc2NhcmRfYW5kX2FjazsKLQl9Ci0KLQlpZiAoc2VxID49IGNhbGwtPmFja3Jfd2luX3RvcCkgewotCQlfZGVidWcoImV4Y2VlZCAjJXUgWyV1XSIsIHNlcSwgY2FsbC0+YWNrcl93aW5fdG9wKTsKLQkJX19jbGVhcl9iaXQoYWNrYml0LCBjYWxsLT5hY2tyX3dpbmRvdyk7Ci0JCWFjayA9IFJYUlBDX0FDS19FWENFRURTX1dJTkRPVzsKLQkJZ290byBkaXNjYXJkX2FuZF9hY2s7Ci0JfQotCi0JaWYgKHNlcSA9PSBjYWxsLT5yeF9kYXRhX2V4cGVjdCkgewotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9FWFBFQ1RfT09TLCAmY2FsbC0+ZmxhZ3MpOwotCQljYWxsLT5yeF9kYXRhX2V4cGVjdCsrOwotCX0gZWxzZSBpZiAoc2VxID4gY2FsbC0+cnhfZGF0YV9leHBlY3QpIHsKLQkJX2RlYnVnKCJvb3MgIyV1IFsldV0iLCBzZXEsIGNhbGwtPnJ4X2RhdGFfZXhwZWN0KTsKLQkJY2FsbC0+cnhfZGF0YV9leHBlY3QgPSBzZXEgKyAxOwotCQlpZiAodGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VYUEVDVF9PT1MsICZjYWxsLT5mbGFncykpIHsKLQkJCWFjayA9IFJYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0U7Ci0JCQlnb3RvIGVucXVldWVfYW5kX2FjazsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYUlBDX0NBTExfUkVUUkFOU19USU1FT1VULCAmY2FsbC0+ZmxhZ3MpKSB7CisJCXN1bW1hcnktPnJldHJhbnNfdGltZW8gPSB0cnVlOworCQljYWxsLT5jb25nX3NzdGhyZXNoID0gbWF4X3QodW5zaWduZWQgaW50LAorCQkJCQkgICAgc3VtbWFyeS0+ZmxpZ2h0X3NpemUgLyAyLCAyKTsKKwkJY3duZCA9IDE7CisJCWlmIChjd25kID49IGNhbGwtPmNvbmdfc3N0aHJlc2ggJiYKKwkJICAgIGNhbGwtPmNvbmdfbW9kZSA9PSBSWFJQQ19DQUxMX1NMT1dfU1RBUlQpIHsKKwkJCWNhbGwtPmNvbmdfbW9kZSA9IFJYUlBDX0NBTExfQ09OR0VTVF9BVk9JREFOQ0U7CisJCQljYWxsLT5jb25nX3RzdGFtcCA9IHNrYi0+dHN0YW1wOworCQkJY3VtdWxhdGl2ZV9hY2tzID0gMDsKIAkJfQotCQlnb3RvIGVucXVldWVfcGFja2V0OwogCX0KIAotCWlmIChzZXEgIT0gY2FsbC0+cnhfZGF0YV9wb3N0KSB7Ci0JCV9kZWJ1ZygiYWhlYWQgIyV1IFsldV0iLCBzZXEsIGNhbGwtPnJ4X2RhdGFfcG9zdCk7Ci0JCWdvdG8gZW5xdWV1ZV9wYWNrZXQ7Ci0JfQorCWN1bXVsYXRpdmVfYWNrcyArPSBzdW1tYXJ5LT5ucl9uZXdfYWNrczsKKwljdW11bGF0aXZlX2Fja3MgKz0gc3VtbWFyeS0+bnJfcm90X25ld19hY2tzOworCWlmIChjdW11bGF0aXZlX2Fja3MgPiAyNTUpCisJCWN1bXVsYXRpdmVfYWNrcyA9IDI1NTsKIAotCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JDVkRfTEFTVCwgJmNhbGwtPmZsYWdzKSkKLQkJZ290byBwcm90b2NvbF9lcnJvcjsKKwlzdW1tYXJ5LT5tb2RlID0gY2FsbC0+Y29uZ19tb2RlOworCXN1bW1hcnktPmN3bmQgPSBjYWxsLT5jb25nX2N3bmQ7CisJc3VtbWFyeS0+c3N0aHJlc2ggPSBjYWxsLT5jb25nX3NzdGhyZXNoOworCXN1bW1hcnktPmN1bXVsYXRpdmVfYWNrcyA9IGN1bXVsYXRpdmVfYWNrczsKKwlzdW1tYXJ5LT5kdXBfYWNrcyA9IGNhbGwtPmNvbmdfZHVwX2Fja3M7CiAKLQkvKiBpZiB0aGUgcGFja2V0IG5lZWQgc2VjdXJpdHkgdGhpbmdzIGRvaW5nIHRvIGl0LCB0aGVuIGl0IGdvZXMgZG93bgotCSAqIHRoZSBzbG93IHBhdGggKi8KLQlpZiAoY2FsbC0+Y29ubi0+c2VjdXJpdHlfaXgpCi0JCWdvdG8gZW5xdWV1ZV9wYWNrZXQ7Ci0KLQlzcC0+Y2FsbCA9IGNhbGw7Ci0JcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0JYXRvbWljX2luYygmY2FsbC0+c2tiX2NvdW50KTsKLQl0ZXJtaW5hbCA9ICgoZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgJiYKLQkJICAgICEoZmxhZ3MgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKSk7Ci0JcmV0ID0gcnhycGNfcXVldWVfcmN2X3NrYihjYWxsLCBza2IsIGZhbHNlLCB0ZXJtaW5hbCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJaWYgKHJldCA9PSAtRU5PTUVNIHx8IHJldCA9PSAtRU5PQlVGUykgewotCQkJX19jbGVhcl9iaXQoYWNrYml0LCBjYWxsLT5hY2tyX3dpbmRvdyk7Ci0JCQlhY2sgPSBSWFJQQ19BQ0tfTk9TUEFDRTsKLQkJCWdvdG8gZGlzY2FyZF9hbmRfYWNrOworCXN3aXRjaCAoY2FsbC0+Y29uZ19tb2RlKSB7CisJY2FzZSBSWFJQQ19DQUxMX1NMT1dfU1RBUlQ6CisJCWlmIChzdW1tYXJ5LT5ucl9uYWNrcyA+IDApCisJCQlnb3RvIHBhY2tldF9sb3NzX2RldGVjdGVkOworCQlpZiAoc3VtbWFyeS0+Y3VtdWxhdGl2ZV9hY2tzID4gMCkKKwkJCWN3bmQgKz0gMTsKKwkJaWYgKGN3bmQgPj0gY2FsbC0+Y29uZ19zc3RocmVzaCkgeworCQkJY2FsbC0+Y29uZ19tb2RlID0gUlhSUENfQ0FMTF9DT05HRVNUX0FWT0lEQU5DRTsKKwkJCWNhbGwtPmNvbmdfdHN0YW1wID0gc2tiLT50c3RhbXA7CiAJCX0KIAkJZ290byBvdXQ7CisKKwljYXNlIFJYUlBDX0NBTExfQ09OR0VTVF9BVk9JREFOQ0U6CisJCWlmIChzdW1tYXJ5LT5ucl9uYWNrcyA+IDApCisJCQlnb3RvIHBhY2tldF9sb3NzX2RldGVjdGVkOworCisJCS8qIFdlIGFuYWx5c2UgdGhlIG51bWJlciBvZiBwYWNrZXRzIHRoYXQgZ2V0IEFDSydkIHBlciBSVFQKKwkJICogcGVyaW9kIGFuZCBpbmNyZWFzZSB0aGUgd2luZG93IGlmIHdlIG1hbmFnZWQgdG8gZmlsbCBpdC4KKwkJICovCisJCWlmIChjYWxsLT5wZWVyLT5ydHRfdXNhZ2UgPT0gMCkKKwkJCWdvdG8gb3V0OworCQlpZiAoa3RpbWVfYmVmb3JlKHNrYi0+dHN0YW1wLAorCQkJCSBrdGltZV9hZGRfbnMoY2FsbC0+Y29uZ190c3RhbXAsCisJCQkJCSAgICAgIGNhbGwtPnBlZXItPnJ0dCkpKQorCQkJZ290byBvdXRfbm9fY2xlYXJfY2E7CisJCWNoYW5nZSA9IHJ4cnBjX2NvbmdfcnR0X3dpbmRvd19lbmQ7CisJCWNhbGwtPmNvbmdfdHN0YW1wID0gc2tiLT50c3RhbXA7CisJCWlmIChjdW11bGF0aXZlX2Fja3MgPj0gY3duZCkKKwkJCWN3bmQrKzsKKwkJZ290byBvdXQ7CisKKwljYXNlIFJYUlBDX0NBTExfUEFDS0VUX0xPU1M6CisJCWlmIChzdW1tYXJ5LT5ucl9uYWNrcyA9PSAwKQorCQkJZ290byByZXN1bWVfbm9ybWFsaXR5OworCisJCWlmIChzdW1tYXJ5LT5uZXdfbG93X25hY2spIHsKKwkJCWNoYW5nZSA9IHJ4cnBjX2NvbmdfbmV3X2xvd19uYWNrOworCQkJY2FsbC0+Y29uZ19kdXBfYWNrcyA9IDE7CisJCQlpZiAoY2FsbC0+Y29uZ19leHRyYSA+IDEpCisJCQkJY2FsbC0+Y29uZ19leHRyYSA9IDE7CisJCQlnb3RvIHNlbmRfZXh0cmFfZGF0YTsKKwkJfQorCisJCWNhbGwtPmNvbmdfZHVwX2Fja3MrKzsKKwkJaWYgKGNhbGwtPmNvbmdfZHVwX2Fja3MgPCAzKQorCQkJZ290byBzZW5kX2V4dHJhX2RhdGE7CisKKwkJY2hhbmdlID0gcnhycGNfY29uZ19iZWdpbl9yZXRyYW5zbWlzc2lvbjsKKwkJY2FsbC0+Y29uZ19tb2RlID0gUlhSUENfQ0FMTF9GQVNUX1JFVFJBTlNNSVQ7CisJCWNhbGwtPmNvbmdfc3N0aHJlc2ggPSBtYXhfdCh1bnNpZ25lZCBpbnQsCisJCQkJCSAgICBzdW1tYXJ5LT5mbGlnaHRfc2l6ZSAvIDIsIDIpOworCQljd25kID0gY2FsbC0+Y29uZ19zc3RocmVzaCArIDM7CisJCWNhbGwtPmNvbmdfZXh0cmEgPSAwOworCQljYWxsLT5jb25nX2R1cF9hY2tzID0gMDsKKwkJcmVzZW5kID0gdHJ1ZTsKKwkJZ290byBvdXQ7CisKKwljYXNlIFJYUlBDX0NBTExfRkFTVF9SRVRSQU5TTUlUOgorCQlpZiAoIXN1bW1hcnktPm5ld19sb3dfbmFjaykgeworCQkJaWYgKHN1bW1hcnktPm5yX25ld19hY2tzID09IDApCisJCQkJY3duZCArPSAxOworCQkJY2FsbC0+Y29uZ19kdXBfYWNrcysrOworCQkJaWYgKGNhbGwtPmNvbmdfZHVwX2Fja3MgPT0gMikgeworCQkJCWNoYW5nZSA9IHJ4cnBjX2NvbmdfcmV0cmFuc21pdF9hZ2FpbjsKKwkJCQljYWxsLT5jb25nX2R1cF9hY2tzID0gMDsKKwkJCQlyZXNlbmQgPSB0cnVlOworCQkJfQorCQl9IGVsc2UgeworCQkJY2hhbmdlID0gcnhycGNfY29uZ19wcm9ncmVzczsKKwkJCWN3bmQgPSBjYWxsLT5jb25nX3NzdGhyZXNoOworCQkJaWYgKHN1bW1hcnktPm5yX25hY2tzID09IDApCisJCQkJZ290byByZXN1bWVfbm9ybWFsaXR5OworCQl9CisJCWdvdG8gb3V0OworCisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCWdvdG8gb3V0OwogCX0KIAotCXNrYiA9IE5VTEw7Ci0Jc3AgPSBOVUxMOwotCi0JX2RlYnVnKCJwb3N0ICMldSIsIHNlcSk7Ci0JQVNTRVJUQ01QKGNhbGwtPnJ4X2RhdGFfcG9zdCwgPT0sIHNlcSk7Ci0JY2FsbC0+cnhfZGF0YV9wb3N0Kys7Ci0KLQlpZiAoZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkKLQkJc2V0X2JpdChSWFJQQ19DQUxMX1JDVkRfTEFTVCwgJmNhbGwtPmZsYWdzKTsKLQotCS8qIGlmIHdlJ3ZlIHJlYWNoZWQgYW4gb3V0IG9mIHNlcXVlbmNlIHBhY2tldCB0aGVuIHdlIG5lZWQgdG8gZHJhaW4KLQkgKiB0aGF0IHF1ZXVlIGludG8gdGhlIHNvY2tldCBSeCBxdWV1ZSBub3cgKi8KLQlpZiAoY2FsbC0+cnhfZGF0YV9wb3N0ID09IGNhbGwtPnJ4X2ZpcnN0X29vcykgewotCQlfZGVidWcoImRyYWluIHJ4IG9vcyBub3ciKTsKLQkJcmVhZF9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQkJaWYgKGNhbGwtPnN0YXRlIDwgUlhSUENfQ0FMTF9DT01QTEVURSAmJgotCQkgICAgIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9FVl9EUkFJTl9SWF9PT1MsICZjYWxsLT5ldmVudHMpKQotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCX0KLQotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQlhdG9taWNfaW5jKCZjYWxsLT5hY2tyX25vdF9pZGxlKTsKLQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBSWFJQQ19BQ0tfREVMQVksIHNlcmlhbCwgZmFsc2UpOwotCV9sZWF2ZSgiID0gMCBbcG9zdGVkXSIpOwotCXJldHVybiAwOwotCi1wcm90b2NvbF9lcnJvcjoKLQlyZXQgPSAtRUJBRE1TRzsKK3Jlc3VtZV9ub3JtYWxpdHk6CisJY2hhbmdlID0gcnhycGNfY29uZ19jbGVhcmVkX25hY2tzOworCWNhbGwtPmNvbmdfZHVwX2Fja3MgPSAwOworCWNhbGwtPmNvbmdfZXh0cmEgPSAwOworCWNhbGwtPmNvbmdfdHN0YW1wID0gc2tiLT50c3RhbXA7CisJaWYgKGN3bmQgPCBjYWxsLT5jb25nX3NzdGhyZXNoKQorCQljYWxsLT5jb25nX21vZGUgPSBSWFJQQ19DQUxMX1NMT1dfU1RBUlQ7CisJZWxzZQorCQljYWxsLT5jb25nX21vZGUgPSBSWFJQQ19DQUxMX0NPTkdFU1RfQVZPSURBTkNFOwogb3V0OgotCXNwaW5fdW5sb2NrKCZjYWxsLT5sb2NrKTsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotCi1kaXNjYXJkX2FuZF9hY2s6Ci0JX2RlYnVnKCJkaXNjYXJkIGFuZCBBQ0sgcGFja2V0ICVwIiwgc2tiKTsKLQlfX3J4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIGFjaywgc2VyaWFsLCB0cnVlKTsKLWRpc2NhcmQ6Ci0Jc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci0JX2xlYXZlKCIgPSAwIFtkaXNjYXJkZWRdIik7Ci0JcmV0dXJuIDA7Ci0KLWVucXVldWVfYW5kX2FjazoKLQlfX3J4cnBjX3Byb3Bvc2VfQUNLKGNhbGwsIGFjaywgc2VyaWFsLCB0cnVlKTsKLWVucXVldWVfcGFja2V0OgotCV9uZXQoImRlZmVyIHNrYiAlcCIsIHNrYik7Ci0Jc3Bpbl91bmxvY2soJmNhbGwtPmxvY2spOwotCXNrYl9xdWV1ZV90YWlsKCZjYWxsLT5yeF9xdWV1ZSwgc2tiKTsKLQlhdG9taWNfaW5jKCZjYWxsLT5hY2tyX25vdF9pZGxlKTsKLQlyZWFkX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfREVBRCkKKwljdW11bGF0aXZlX2Fja3MgPSAwOworb3V0X25vX2NsZWFyX2NhOgorCWlmIChjd25kID49IFJYUlBDX1JYVFhfQlVGRl9TSVpFIC0gMSkKKwkJY3duZCA9IFJYUlBDX1JYVFhfQlVGRl9TSVpFIC0gMTsKKwljYWxsLT5jb25nX2N3bmQgPSBjd25kOworCWNhbGwtPmNvbmdfY3VtdWxfYWNrcyA9IGN1bXVsYXRpdmVfYWNrczsKKwl0cmFjZV9yeHJwY19jb25nZXN0KGNhbGwsIHN1bW1hcnksIGFja2VkX3NlcmlhbCwgY2hhbmdlKTsKKwlpZiAocmVzZW5kICYmICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5ELCAmY2FsbC0+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+aGRyLnR5cGUgIT0gUlhSUENfUEFDS0VUX1RZUEVfQUJPUlQpIHsKLQkJc2tiLT5wcmlvcml0eSA9IFJYX0NBTExfREVBRDsKLQkJcnhycGNfcmVqZWN0X3BhY2tldChjYWxsLT5jb25uLT5wYXJhbXMubG9jYWwsIHNrYik7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLWZyZWVfdW5sb2NrOgotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7Ci11bmxvY2s6Ci0JcmVhZF91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotZG9uZToKIAlfbGVhdmUoIiIpOwogfQogCiAvKgogICogcG9zdCBjb25uZWN0aW9uLWxldmVsIGV2ZW50cyB0byB0aGUgY29ubmVjdGlvbgotICogLSB0aGlzIGluY2x1ZGVzIGNoYWxsZW5nZXMsIHJlc3BvbnNlcyBhbmQgc29tZSBhYm9ydHMKKyAqIC0gdGhpcyBpbmNsdWRlcyBjaGFsbGVuZ2VzLCByZXNwb25zZXMsIHNvbWUgYWJvcnRzIGFuZCBjYWxsIHRlcm1pbmFsIHBhY2tldAorICogICByZXRyYW5zbWlzc2lvbi4KICAqLwogc3RhdGljIHZvaWQgcnhycGNfcG9zdF9wYWNrZXRfdG9fY29ubihzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubiwKIAkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtNTk1LDYgKzk2NSwxNyBAQAogfQogCiAvKgorICogcHV0IGEgcGFja2V0IHVwIGZvciB0cmFuc3BvcnQtbGV2ZWwgYWJvcnQKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcmVqZWN0X3BhY2tldChzdHJ1Y3QgcnhycGNfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCUNIRUNLX1NMQUJfT0tBWSgmbG9jYWwtPnVzYWdlKTsKKworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+cmVqZWN0X3F1ZXVlLCBza2IpOworCXJ4cnBjX3F1ZXVlX2xvY2FsKGxvY2FsKTsKK30KKworLyoKICAqIEV4dHJhY3QgdGhlIHdpcmUgaGVhZGVyIGZyb20gYSBwYWNrZXQgYW5kIHRyYW5zbGF0ZSB0aGUgYnl0ZSBvcmRlci4KICAqLwogc3RhdGljIG5vaW5saW5lCkBAIC02MDUsOCArOTg2LDYgQEAKIAkvKiBkaWcgb3V0IHRoZSBSeFJQQyBjb25uZWN0aW9uIGRldGFpbHMgKi8KIAlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZ3aGRyLCBzaXplb2Yod2hkcikpIDwgMCkKIAkJcmV0dXJuIC1FQkFETVNHOwotCWlmICghcHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHdoZHIpKSkKLQkJQlVHKCk7CiAKIAltZW1zZXQoc3AsIDAsIHNpemVvZigqc3ApKTsKIAlzcC0+aGRyLmVwb2NoCQk9IG50b2hsKHdoZHIuZXBvY2gpOwpAQCAtNjMxLDE5ICsxMDEwLDIyIEBACiAgKiBzaHV0IGRvd24gYW5kIHRoZSBsb2NhbCBlbmRwb2ludCBmcm9tIGdvaW5nIGF3YXksIHRodXMgc2tfdXNlcl9kYXRhIHdpbGwgbm90CiAgKiBiZSBjbGVhcmVkIHVudGlsIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KICAqLwotdm9pZCByeHJwY19kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaykKK3ZvaWQgcnhycGNfZGF0YV9yZWFkeShzdHJ1Y3Qgc29jayAqdWRwX3NrKQogewogCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY19jaGFubmVsICpjaGFuOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwogCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7Ci0Jc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9IHNrLT5za191c2VyX2RhdGE7CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCA9IHVkcF9zay0+c2tfdXNlcl9kYXRhOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKwlpbnQgcmV0LCBza2V3OwogCi0JX2VudGVyKCIlcCIsIHNrKTsKKwlfZW50ZXIoIiVwIiwgdWRwX3NrKTsKIAogCUFTU0VSVCghaXJxc19kaXNhYmxlZCgpKTsKIAotCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCAwLCAxLCAmcmV0KTsKKwlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbSh1ZHBfc2ssIDAsIDEsICZyZXQpOwogCWlmICghc2tiKSB7CiAJCWlmIChyZXQgPT0gLUVBR0FJTikKIAkJCXJldHVybjsKQEAgLTY1MSwxMyArMTAzMywxMyBAQAogCQlyZXR1cm47CiAJfQogCi0JcnhycGNfbmV3X3NrYihza2IpOworCXJ4cnBjX25ld19za2Ioc2tiLCByeHJwY19za2JfcnhfcmVjZWl2ZWQpOwogCiAJX25ldCgicmVjdiBza2IgJXAiLCBza2IpOwogCiAJLyogd2UnbGwgcHJvYmFibHkgbmVlZCB0byBjaGVja3N1bSBpdCAoZGlkbid0IGNhbGwgc29ja19yZWN2bXNnKSAqLwogCWlmIChza2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkgewotCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9mcmVlZCk7CiAJCV9fVURQX0lOQ19TVEFUUygmaW5pdF9uZXQsIFVEUF9NSUJfSU5FUlJPUlMsIDApOwogCQlfbGVhdmUoIiBbQ1NVTSBmYWlsZWRdIik7CiAJCXJldHVybjsKQEAgLTY3MSwxMyArMTA1MywyMSBAQAogCXNrYl9vcnBoYW4oc2tiKTsKIAlzcCA9IHJ4cnBjX3NrYihza2IpOwogCi0JX25ldCgiUnggVURQIHBhY2tldCBmcm9tICUwOHg6JTA0aHUiLAotCSAgICAgbnRvaGwoaXBfaGRyKHNrYiktPnNhZGRyKSwgbnRvaHModWRwX2hkcihza2IpLT5zb3VyY2UpKTsKLQogCS8qIGRpZyBvdXQgdGhlIFJ4UlBDIGNvbm5lY3Rpb24gZGV0YWlscyAqLwogCWlmIChyeHJwY19leHRyYWN0X2hlYWRlcihzcCwgc2tiKSA8IDApCiAJCWdvdG8gYmFkX21lc3NhZ2U7CiAKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfQUZfUlhSUENfSU5KRUNUX0xPU1MpKSB7CisJCXN0YXRpYyBpbnQgbG9zZTsKKwkJaWYgKChsb3NlKysgJiA3KSA9PSA3KSB7CisJCQl0cmFjZV9yeHJwY19yeF9sb3NlKHNwKTsKKwkJCXJ4cnBjX2xvc2Vfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2xvc3QpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJdHJhY2VfcnhycGNfcnhfcGFja2V0KHNwKTsKKwogCV9uZXQoIlJ4IFJ4UlBDICVzIGVwPSV4IGNhbGw9JXg6JXgiLAogCSAgICAgc3AtPmhkci5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQgPyAiVG9TZXJ2ZXIiIDogIlRvQ2xpZW50IiwKIAkgICAgIHNwLT5oZHIuZXBvY2gsIHNwLT5oZHIuY2lkLCBzcC0+aGRyLmNhbGxOdW1iZXIpOwpAQCAtNjg4LDcwICsxMDc4LDEyNSBAQAogCQlnb3RvIGJhZF9tZXNzYWdlOwogCX0KIAotCWlmIChzcC0+aGRyLnR5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfVkVSU0lPTikgeworCXN3aXRjaCAoc3AtPmhkci50eXBlKSB7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9WRVJTSU9OOgogCQlyeHJwY19wb3N0X3BhY2tldF90b19sb2NhbChsb2NhbCwgc2tiKTsKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKHNwLT5oZHIudHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBICYmCi0JICAgIChzcC0+aGRyLmNhbGxOdW1iZXIgPT0gMCB8fCBzcC0+aGRyLnNlcSA9PSAwKSkKLQkJZ290byBiYWRfbWVzc2FnZTsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0JVU1k6CisJCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCkKKwkJCWdvdG8gZGlzY2FyZDsKKworCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfREFUQToKKwkJaWYgKHNwLT5oZHIuY2FsbE51bWJlciA9PSAwKQorCQkJZ290byBiYWRfbWVzc2FnZTsKKwkJaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19KVU1CT19QQUNLRVQgJiYKKwkJICAgICFyeHJwY192YWxpZGF0ZV9qdW1ibyhza2IpKQorCQkJZ290byBiYWRfbWVzc2FnZTsKKwkJYnJlYWs7CisJfQogCiAJcmN1X3JlYWRfbG9jaygpOwogCiAJY29ubiA9IHJ4cnBjX2ZpbmRfY29ubmVjdGlvbl9yY3UobG9jYWwsIHNrYik7Ci0JaWYgKCFjb25uKQotCQlnb3RvIGNhbnRfcm91dGVfY2FsbDsKKwlpZiAoY29ubikgeworCQlpZiAoc3AtPmhkci5zZWN1cml0eUluZGV4ICE9IGNvbm4tPnNlY3VyaXR5X2l4KQorCQkJZ290byB3cm9uZ19zZWN1cml0eTsKIAotCWlmIChzcC0+aGRyLmNhbGxOdW1iZXIgPT0gMCkgewotCQkvKiBDb25uZWN0aW9uLWxldmVsIHBhY2tldCAqLwotCQlfZGVidWcoIkNPTk4gJXAgeyVkfSIsIGNvbm4sIGNvbm4tPmRlYnVnX2lkKTsKLQkJcnhycGNfcG9zdF9wYWNrZXRfdG9fY29ubihjb25uLCBza2IpOwotCX0gZWxzZSB7Ci0JCS8qIENhbGwtYm91bmQgcGFja2V0cyBhcmUgcm91dGVkIGJ5IGNvbm5lY3Rpb24gY2hhbm5lbC4gKi8KLQkJdW5zaWduZWQgaW50IGNoYW5uZWwgPSBzcC0+aGRyLmNpZCAmIFJYUlBDX0NIQU5ORUxNQVNLOwotCQlzdHJ1Y3QgcnhycGNfY2hhbm5lbCAqY2hhbiA9ICZjb25uLT5jaGFubmVsc1tjaGFubmVsXTsKLQkJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSByY3VfZGVyZWZlcmVuY2UoY2hhbi0+Y2FsbCk7Ci0KLQkJaWYgKCFjYWxsIHx8IGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkgPT0gMCkKLQkJCWdvdG8gY2FudF9yb3V0ZV9jYWxsOwotCi0JCXJ4cnBjX3Bvc3RfcGFja2V0X3RvX2NhbGwoY2FsbCwgc2tiKTsKLQl9Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLW91dDoKLQlyZXR1cm47Ci0KLWNhbnRfcm91dGVfY2FsbDoKLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCV9kZWJ1ZygiY2FuJ3Qgcm91dGUgY2FsbCIpOwotCWlmIChzcC0+aGRyLmZsYWdzICYgUlhSUENfQ0xJRU5UX0lOSVRJQVRFRCAmJgotCSAgICBzcC0+aGRyLnR5cGUgPT0gUlhSUENfUEFDS0VUX1RZUEVfREFUQSkgewotCQlpZiAoc3AtPmhkci5zZXEgPT0gMSkgewotCQkJX2RlYnVnKCJmaXJzdCBwYWNrZXQiKTsKLQkJCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+YWNjZXB0X3F1ZXVlLCBza2IpOwotCQkJcnhycGNfcXVldWVfd29yaygmbG9jYWwtPnByb2Nlc3Nvcik7Ci0JCQlfbGVhdmUoIiBbaW5jb21pbmddIik7Ci0JCQlyZXR1cm47CisJCWlmIChzcC0+aGRyLmNhbGxOdW1iZXIgPT0gMCkgeworCQkJLyogQ29ubmVjdGlvbi1sZXZlbCBwYWNrZXQgKi8KKwkJCV9kZWJ1ZygiQ09OTiAlcCB7JWR9IiwgY29ubiwgY29ubi0+ZGVidWdfaWQpOworCQkJcnhycGNfcG9zdF9wYWNrZXRfdG9fY29ubihjb25uLCBza2IpOworCQkJZ290byBvdXRfdW5sb2NrOwogCQl9Ci0JCXNrYi0+cHJpb3JpdHkgPSBSWF9JTlZBTElEX09QRVJBVElPTjsKKworCQkvKiBOb3RlIHRoZSBzZXJpYWwgbnVtYmVyIHNrZXcgaGVyZSAqLworCQlza2V3ID0gKGludClzcC0+aGRyLnNlcmlhbCAtIChpbnQpY29ubi0+aGlfc2VyaWFsOworCQlpZiAoc2tldyA+PSAwKSB7CisJCQlpZiAoc2tldyA+IDApCisJCQkJY29ubi0+aGlfc2VyaWFsID0gc3AtPmhkci5zZXJpYWw7CisJCX0gZWxzZSB7CisJCQlza2V3ID0gLXNrZXc7CisJCQlza2V3ID0gbWluKHNrZXcsIDY1NTM1KTsKKwkJfQorCisJCS8qIENhbGwtYm91bmQgcGFja2V0cyBhcmUgcm91dGVkIGJ5IGNvbm5lY3Rpb24gY2hhbm5lbC4gKi8KKwkJY2hhbm5lbCA9IHNwLT5oZHIuY2lkICYgUlhSUENfQ0hBTk5FTE1BU0s7CisJCWNoYW4gPSAmY29ubi0+Y2hhbm5lbHNbY2hhbm5lbF07CisKKwkJLyogSWdub3JlIHJlYWxseSBvbGQgY2FsbHMgKi8KKwkJaWYgKHNwLT5oZHIuY2FsbE51bWJlciA8IGNoYW4tPmxhc3RfY2FsbCkKKwkJCWdvdG8gZGlzY2FyZF91bmxvY2s7CisKKwkJaWYgKHNwLT5oZHIuY2FsbE51bWJlciA9PSBjaGFuLT5sYXN0X2NhbGwpIHsKKwkJCS8qIEZvciB0aGUgcHJldmlvdXMgc2VydmljZSBjYWxsLCBpZiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCB3ZQorCQkJICogZGlzY2FyZCBhbGwgZnVydGhlciBwYWNrZXRzLgorCQkJICovCisJCQlpZiAocnhycGNfY29ubl9pc19zZXJ2aWNlKGNvbm4pICYmCisJCQkgICAgKGNoYW4tPmxhc3RfdHlwZSA9PSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0sgfHwKKwkJCSAgICAgc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUKSkKKwkJCQlnb3RvIGRpc2NhcmRfdW5sb2NrOworCisJCQkvKiBCdXQgb3RoZXJ3aXNlIHdlIG5lZWQgdG8gcmV0cmFuc21pdCB0aGUgZmluYWwgcGFja2V0IGZyb20KKwkJCSAqIGRhdGEgY2FjaGVkIGluIHRoZSBjb25uZWN0aW9uIHJlY29yZC4KKwkJCSAqLworCQkJcnhycGNfcG9zdF9wYWNrZXRfdG9fY29ubihjb25uLCBza2IpOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJY2FsbCA9IHJjdV9kZXJlZmVyZW5jZShjaGFuLT5jYWxsKTsKIAl9IGVsc2UgewotCQlza2ItPnByaW9yaXR5ID0gUlhfQ0FMTF9ERUFEOworCQlza2V3ID0gMDsKKwkJY2FsbCA9IE5VTEw7CiAJfQogCi0JaWYgKHNwLT5oZHIudHlwZSAhPSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCkgewotCQlfZGVidWcoInJlamVjdCB0eXBlICVkIixzcC0+aGRyLnR5cGUpOwotCQlyeHJwY19yZWplY3RfcGFja2V0KGxvY2FsLCBza2IpOwotCX0gZWxzZSB7Ci0JCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJaWYgKCFjYWxsIHx8IGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkgPT0gMCkgeworCQlpZiAoIShzcC0+aGRyLnR5cGUgJiBSWFJQQ19DTElFTlRfSU5JVElBVEVEKSB8fAorCQkgICAgc3AtPmhkci5jYWxsTnVtYmVyID09IDAgfHwKKwkJICAgIHNwLT5oZHIudHlwZSAhPSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBKQorCQkJZ290byBiYWRfbWVzc2FnZV91bmxvY2s7CisJCWlmIChzcC0+aGRyLnNlcSAhPSAxKQorCQkJZ290byBkaXNjYXJkX3VubG9jazsKKwkJY2FsbCA9IHJ4cnBjX25ld19pbmNvbWluZ19jYWxsKGxvY2FsLCBjb25uLCBza2IpOworCQlpZiAoIWNhbGwpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJZ290byByZWplY3RfcGFja2V0OworCQl9CisJCXJ4cnBjX3NlbmRfcGluZyhjYWxsLCBza2IsIHNrZXcpOwogCX0KLQlfbGVhdmUoIiBbbm8gY2FsbF0iKTsKKworCXJ4cnBjX2lucHV0X2NhbGxfcGFja2V0KGNhbGwsIHNrYiwgc2tldyk7CisJZ290byBkaXNjYXJkX3VubG9jazsKKworZGlzY2FyZF91bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CitkaXNjYXJkOgorCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKK291dDoKKwl0cmFjZV9yeHJwY19yeF9kb25lKDAsIDApOwogCXJldHVybjsKIAorb3V0X3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlnb3RvIG91dDsKKword3Jvbmdfc2VjdXJpdHk6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJdHJhY2VfcnhycGNfYWJvcnQoIlNFQyIsIHNwLT5oZHIuY2lkLCBzcC0+aGRyLmNhbGxOdW1iZXIsIHNwLT5oZHIuc2VxLAorCQkJICBSWEtBRElOQ09OU0lTVEVOQ1ksIEVCQURNU0cpOworCXNrYi0+cHJpb3JpdHkgPSBSWEtBRElOQ09OU0lTVEVOQ1k7CisJZ290byBwb3N0X2Fib3J0OworCitiYWRfbWVzc2FnZV91bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CiBiYWRfbWVzc2FnZToKKwl0cmFjZV9yeHJwY19hYm9ydCgiQkFEIiwgc3AtPmhkci5jaWQsIHNwLT5oZHIuY2FsbE51bWJlciwgc3AtPmhkci5zZXEsCisJCQkgIFJYX1BST1RPQ09MX0VSUk9SLCBFQkFETVNHKTsKIAlza2ItPnByaW9yaXR5ID0gUlhfUFJPVE9DT0xfRVJST1I7Citwb3N0X2Fib3J0OgorCXNrYi0+bWFyayA9IFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0FCT1JUOworcmVqZWN0X3BhY2tldDoKKwl0cmFjZV9yeHJwY19yeF9kb25lKHNrYi0+bWFyaywgc2tiLT5wcmlvcml0eSk7CiAJcnhycGNfcmVqZWN0X3BhY2tldChsb2NhbCwgc2tiKTsKIAlfbGVhdmUoIiBbYmFkbXNnXSIpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2luc2VjdXJlLmMgYi9uZXQvcnhycGMvaW5zZWN1cmUuYwppbmRleCBjMjFhZDIxLi43ZDQzNzVlIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvaW5zZWN1cmUuYworKysgYi9uZXQvcnhycGMvaW5zZWN1cmUuYwpAQCAtMjMsMzEgKzIzLDM2IEBACiB9CiAKIHN0YXRpYyBpbnQgbm9uZV9zZWN1cmVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwKLQkJCSAgICAgICB2b2lkICpzZWNoZHIpCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwKKwkJCSAgICAgIHZvaWQgKnNlY2hkcikKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBub25lX3ZlcmlmeV9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICB1MzIgKl9hYm9ydF9jb2RlKQorc3RhdGljIGludCBub25lX3ZlcmlmeV9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJICAgICAgcnhycGNfc2VxX3Qgc2VxLCB1MTYgZXhwZWN0ZWRfY2tzdW0pCiB7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG5vbmVfbG9jYXRlX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHVuc2lnbmVkIGludCAqX29mZnNldCwgdW5zaWduZWQgaW50ICpfbGVuKQoreworfQorCiBzdGF0aWMgaW50IG5vbmVfcmVzcG9uZF90b19jaGFsbGVuZ2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCi0JCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICB1MzIgKl9hYm9ydF9jb2RlKQorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgIHUzMiAqX2Fib3J0X2NvZGUpCiB7CiAJKl9hYm9ydF9jb2RlID0gUlhfUFJPVE9DT0xfRVJST1I7CiAJcmV0dXJuIC1FUFJPVE87CiB9CiAKIHN0YXRpYyBpbnQgbm9uZV92ZXJpZnlfcmVzcG9uc2Uoc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4sCi0JCQkJIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJIHUzMiAqX2Fib3J0X2NvZGUpCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQl1MzIgKl9hYm9ydF9jb2RlKQogewogCSpfYWJvcnRfY29kZSA9IFJYX1BST1RPQ09MX0VSUk9SOwogCXJldHVybiAtRVBST1RPOwpAQCAtNzgsNiArODMsNyBAQAogCS5wcmltZV9wYWNrZXRfc2VjdXJpdHkJCT0gbm9uZV9wcmltZV9wYWNrZXRfc2VjdXJpdHksCiAJLnNlY3VyZV9wYWNrZXQJCQk9IG5vbmVfc2VjdXJlX3BhY2tldCwKIAkudmVyaWZ5X3BhY2tldAkJCT0gbm9uZV92ZXJpZnlfcGFja2V0LAorCS5sb2NhdGVfZGF0YQkJCT0gbm9uZV9sb2NhdGVfZGF0YSwKIAkucmVzcG9uZF90b19jaGFsbGVuZ2UJCT0gbm9uZV9yZXNwb25kX3RvX2NoYWxsZW5nZSwKIAkudmVyaWZ5X3Jlc3BvbnNlCQk9IG5vbmVfdmVyaWZ5X3Jlc3BvbnNlLAogCS5jbGVhcgkJCQk9IG5vbmVfY2xlYXIsCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvbG9jYWxfZXZlbnQuYyBiL25ldC9yeHJwYy9sb2NhbF9ldmVudC5jCmluZGV4IDMxYTNmODYuLjU0MGQzOTUgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9sb2NhbF9ldmVudC5jCisrKyBiL25ldC9yeHJwYy9sb2NhbF9ldmVudC5jCkBAIC0xNSw4ICsxNSw2IEBACiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KICNpbmNsdWRlIDxnZW5lcmF0ZWQvdXRzcmVsZWFzZS5oPgpAQCAtMzMsNyArMzEsNyBAQAogewogCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOwogCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCXN0cnVjdCBzb2NrYWRkcl9yeHJwYyBzcng7CiAJc3RydWN0IG1zZ2hkciBtc2c7CiAJc3RydWN0IGt2ZWMgaW92WzJdOwogCXNpemVfdCBsZW47CkBAIC00MSwxMiArMzksMTEgQEAKIAogCV9lbnRlcigiIik7CiAKLQlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0Jc2luLnNpbl9wb3J0ID0gdWRwX2hkcihza2IpLT5zb3VyY2U7Ci0Jc2luLnNpbl9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKKwlpZiAocnhycGNfZXh0cmFjdF9hZGRyX2Zyb21fc2tiKCZzcngsIHNrYikgPCAwKQorCQlyZXR1cm47CiAKLQltc2cubXNnX25hbWUJPSAmc2luOwotCW1zZy5tc2dfbmFtZWxlbgk9IHNpemVvZihzaW4pOworCW1zZy5tc2dfbmFtZQk9ICZzcngudHJhbnNwb3J0OworCW1zZy5tc2dfbmFtZWxlbgk9IHNyeC50cmFuc3BvcnRfbGVuOwogCW1zZy5tc2dfY29udHJvbAk9IE5VTEw7CiAJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKIAltc2cubXNnX2ZsYWdzCT0gMDsKQEAgLTkzLDExICs5MCwxMyBAQAogCWlmIChza2IpIHsKIAkJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwogCisJCXJ4cnBjX3NlZV9za2Ioc2tiLCByeHJwY19za2Jfcnhfc2Vlbik7CiAJCV9kZWJ1ZygieyVkfSx7JXV9IiwgbG9jYWwtPmRlYnVnX2lkLCBzcC0+aGRyLnR5cGUpOwogCiAJCXN3aXRjaCAoc3AtPmhkci50eXBlKSB7CiAJCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfVkVSU0lPTjoKLQkJCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJnYsIDEpIDwgMCkKKwkJCWlmIChza2JfY29weV9iaXRzKHNrYiwgc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlciksCisJCQkJCSAgJnYsIDEpIDwgMCkKIAkJCQlyZXR1cm47CiAJCQlfcHJvdG8oIlJ4IFZFUlNJT04geyAlMDJ4IH0iLCB2KTsKIAkJCWlmICh2ID09IDApCkBAIC0xMDksNyArMTA4LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwkJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfcnhfZnJlZWQpOwogCX0KIAogCV9sZWF2ZSgiIik7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvbG9jYWxfb2JqZWN0LmMgYi9uZXQvcnhycGMvbG9jYWxfb2JqZWN0LmMKaW5kZXggYTc1Mzc5Ni4uZmY0ODY0ZDUgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9sb2NhbF9vYmplY3QuYworKysgYi9uZXQvcnhycGMvbG9jYWxfb2JqZWN0LmMKQEAgLTU4LDYgKzU4LDE3IEBACiAJCQltZW1jbXAoJmxvY2FsLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciwKIAkJCSAgICAgICAmc3J4LT50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworI2lmZGVmIENPTkZJR19BRl9SWFJQQ19JUFY2CisJY2FzZSBBRl9JTkVUNjoKKwkJLyogSWYgdGhlIGNob2ljZSBvZiBVRFA2IHBvcnQgaXMgbGVmdCB1cCB0byB0aGUgdHJhbnNwb3J0LCB0aGVuCisJCSAqIHRoZSBlbmRwb2ludCByZWNvcmQgZG9lc24ndCBtYXRjaC4KKwkJICovCisJCXJldHVybiAoKHUxNiBfX2ZvcmNlKWxvY2FsLT5zcngudHJhbnNwb3J0LnNpbjYuc2luNl9wb3J0IC0KKwkJCSh1MTYgX19mb3JjZSlzcngtPnRyYW5zcG9ydC5zaW42LnNpbjZfcG9ydCkgPzoKKwkJCW1lbWNtcCgmbG9jYWwtPnNyeC50cmFuc3BvcnQuc2luNi5zaW42X2FkZHIsCisJCQkgICAgICAgJnNyeC0+dHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTc1LDkgKzg2LDcgQEAKIAkJYXRvbWljX3NldCgmbG9jYWwtPnVzYWdlLCAxKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5saW5rKTsKIAkJSU5JVF9XT1JLKCZsb2NhbC0+cHJvY2Vzc29yLCByeHJwY19sb2NhbF9wcm9jZXNzb3IpOwotCQlJTklUX0xJU1RfSEVBRCgmbG9jYWwtPnNlcnZpY2VzKTsKIAkJaW5pdF9yd3NlbSgmbG9jYWwtPmRlZnJhZ19zZW0pOwotCQlza2JfcXVldWVfaGVhZF9pbml0KCZsb2NhbC0+YWNjZXB0X3F1ZXVlKTsKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbG9jYWwtPnJlamVjdF9xdWV1ZSk7CiAJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxvY2FsLT5ldmVudF9xdWV1ZSk7CiAJCWxvY2FsLT5jbGllbnRfY29ubnMgPSBSQl9ST09UOwpAQCAtMTAxLDExICsxMTAsMTIgQEAKIAlzdHJ1Y3Qgc29jayAqc29jazsKIAlpbnQgcmV0LCBvcHQ7CiAKLQlfZW50ZXIoIiVweyVkfSIsIGxvY2FsLCBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlKTsKKwlfZW50ZXIoIiVweyVkLCVkfSIsCisJICAgICAgIGxvY2FsLCBsb2NhbC0+c3J4LnRyYW5zcG9ydF90eXBlLCBsb2NhbC0+c3J4LnRyYW5zcG9ydC5mYW1pbHkpOwogCiAJLyogY3JlYXRlIGEgc29ja2V0IHRvIHJlcHJlc2VudCB0aGUgbG9jYWwgZW5kcG9pbnQgKi8KLQlyZXQgPSBzb2NrX2NyZWF0ZV9rZXJuKCZpbml0X25ldCwgUEZfSU5FVCwgbG9jYWwtPnNyeC50cmFuc3BvcnRfdHlwZSwKLQkJCSAgICAgICBJUFBST1RPX1VEUCwgJmxvY2FsLT5zb2NrZXQpOworCXJldCA9IHNvY2tfY3JlYXRlX2tlcm4oJmluaXRfbmV0LCBsb2NhbC0+c3J4LnRyYW5zcG9ydC5mYW1pbHksCisJCQkgICAgICAgbG9jYWwtPnNyeC50cmFuc3BvcnRfdHlwZSwgMCwgJmxvY2FsLT5zb2NrZXQpOwogCWlmIChyZXQgPCAwKSB7CiAJCV9sZWF2ZSgiID0gJWQgW3NvY2tldF0iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTcwLDE4ICsxODAsOCBAQAogCWxvbmcgZGlmZjsKIAlpbnQgcmV0OwogCi0JaWYgKHNyeC0+dHJhbnNwb3J0LmZhbWlseSA9PSBBRl9JTkVUKSB7Ci0JCV9lbnRlcigieyVkLCV1LCVwSTQrJWh1fSIsCi0JCSAgICAgICBzcngtPnRyYW5zcG9ydF90eXBlLAotCQkgICAgICAgc3J4LT50cmFuc3BvcnQuZmFtaWx5LAotCQkgICAgICAgJnNyeC0+dHJhbnNwb3J0LnNpbi5zaW5fYWRkciwKLQkJICAgICAgIG50b2hzKHNyeC0+dHJhbnNwb3J0LnNpbi5zaW5fcG9ydCkpOwotCX0gZWxzZSB7Ci0JCV9lbnRlcigieyVkLCV1fSIsCi0JCSAgICAgICBzcngtPnRyYW5zcG9ydF90eXBlLAotCQkgICAgICAgc3J4LT50cmFuc3BvcnQuZmFtaWx5KTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVBRk5PU1VQUE9SVCk7Ci0JfQorCV9lbnRlcigieyVkLCVkLCVwSVNwfSIsCisJICAgICAgIHNyeC0+dHJhbnNwb3J0X3R5cGUsIHNyeC0+dHJhbnNwb3J0LmZhbWlseSwgJnNyeC0+dHJhbnNwb3J0KTsKIAogCW11dGV4X2xvY2soJnJ4cnBjX2xvY2FsX211dGV4KTsKIApAQCAtMjM0LDEzICsyMzQsOCBAQAogZm91bmQ6CiAJbXV0ZXhfdW5sb2NrKCZyeHJwY19sb2NhbF9tdXRleCk7CiAKLQlfbmV0KCJMT0NBTCAlcyAlZCB7JWQsJXUsJXBJNCslaHV9IiwKLQkgICAgIGFnZSwKLQkgICAgIGxvY2FsLT5kZWJ1Z19pZCwKLQkgICAgIGxvY2FsLT5zcngudHJhbnNwb3J0X3R5cGUsCi0JICAgICBsb2NhbC0+c3J4LnRyYW5zcG9ydC5mYW1pbHksCi0JICAgICAmbG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCSAgICAgbnRvaHMobG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisJX25ldCgiTE9DQUwgJXMgJWQgeyVwSVNwfSIsCisJICAgICBhZ2UsIGxvY2FsLT5kZWJ1Z19pZCwgJmxvY2FsLT5zcngudHJhbnNwb3J0KTsKIAogCV9sZWF2ZSgiID0gJXAiLCBsb2NhbCk7CiAJcmV0dXJuIGxvY2FsOwpAQCAtMjk2LDcgKzI5MSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZyeHJwY19sb2NhbF9tdXRleCk7CiAKIAlBU1NFUlQoUkJfRU1QVFlfUk9PVCgmbG9jYWwtPmNsaWVudF9jb25ucykpOwotCUFTU0VSVChsaXN0X2VtcHR5KCZsb2NhbC0+c2VydmljZXMpKTsKKwlBU1NFUlQoIWxvY2FsLT5zZXJ2aWNlKTsKIAogCWlmIChzb2NrZXQpIHsKIAkJbG9jYWwtPnNvY2tldCA9IE5VTEw7CkBAIC0zMDgsNyArMzAzLDYgQEAKIAkvKiBBdCB0aGlzIHBvaW50LCB0aGVyZSBzaG91bGQgYmUgbm8gbW9yZSBwYWNrZXRzIGNvbWluZyBpbiB0byB0aGUKIAkgKiBsb2NhbCBlbmRwb2ludC4KIAkgKi8KLQlyeHJwY19wdXJnZV9xdWV1ZSgmbG9jYWwtPmFjY2VwdF9xdWV1ZSk7CiAJcnhycGNfcHVyZ2VfcXVldWUoJmxvY2FsLT5yZWplY3RfcXVldWUpOwogCXJ4cnBjX3B1cmdlX3F1ZXVlKCZsb2NhbC0+ZXZlbnRfcXVldWUpOwogCkBAIC0zMzIsMTEgKzMyNiw2IEBACiAJCWlmIChhdG9taWNfcmVhZCgmbG9jYWwtPnVzYWdlKSA9PSAwKQogCQkJcmV0dXJuIHJ4cnBjX2xvY2FsX2Rlc3Ryb3llcihsb2NhbCk7CiAKLQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJmxvY2FsLT5hY2NlcHRfcXVldWUpKSB7Ci0JCQlyeHJwY19hY2NlcHRfaW5jb21pbmdfY2FsbHMobG9jYWwpOwotCQkJYWdhaW4gPSB0cnVlOwotCQl9Ci0KIAkJaWYgKCFza2JfcXVldWVfZW1wdHkoJmxvY2FsLT5yZWplY3RfcXVldWUpKSB7CiAJCQlyeHJwY19yZWplY3RfcGFja2V0cyhsb2NhbCk7CiAJCQlhZ2FpbiA9IHRydWU7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvbWlzYy5jIGIvbmV0L3J4cnBjL21pc2MuYwppbmRleCBiZGM1ZTQyLi45ZDFjNzIxIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvbWlzYy5jCisrKyBiL25ldC9yeHJwYy9taXNjLmMKQEAgLTIxLDI4ICsyMSwzMyBAQAogdW5zaWduZWQgaW50IHJ4cnBjX21heF9iYWNrbG9nIF9fcmVhZF9tb3N0bHkgPSAxMDsKIAogLyoKKyAqIE1heGltdW0gbGlmZXRpbWUgb2YgYSBjYWxsIChpbiBteCkuCisgKi8KK3Vuc2lnbmVkIGludCByeHJwY19tYXhfY2FsbF9saWZldGltZSA9IDYwICogMTAwMDsKKworLyoKICAqIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHNjaGVkdWxpbmcgQUNLIGdlbmVyYXRpb24gYWZ0ZXIgc2VlaW5nIGEKLSAqIHBhY2tldCB3aXRoIFJYUlBDX1JFUVVFU1RfQUNLIHNldCAoaW4gamlmZmllcykuCisgKiBwYWNrZXQgd2l0aCBSWFJQQ19SRVFVRVNUX0FDSyBzZXQgKGluIG1zKS4KICAqLwogdW5zaWduZWQgaW50IHJ4cnBjX3JlcXVlc3RlZF9hY2tfZGVsYXkgPSAxOwogCiAvKgotICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgc2NoZWR1bGluZyBhbiBBQ0sgd2l0aCBzdWJ0eXBlIERFTEFZIChpbiBqaWZmaWVzKS4KKyAqIEhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHNjaGVkdWxpbmcgYW4gQUNLIHdpdGggc3VidHlwZSBERUxBWSAoaW4gbXMpLgogICoKICAqIFdlIHVzZSB0aGlzIHdoZW4gd2UndmUgcmVjZWl2ZWQgbmV3IGRhdGEgcGFja2V0cy4gIElmIHRob3NlIHBhY2tldHMgYXJlbid0CiAgKiBhbGwgY29uc3VtZWQgd2l0aGluIHRoaXMgdGltZSB3ZSB3aWxsIHNlbmQgYSBERUxBWSBBQ0sgaWYgYW4gQUNLIHdhcyBub3QKICAqIHJlcXVlc3RlZCB0byBsZXQgdGhlIHNlbmRlciBrbm93IGl0IGRvZXNuJ3QgbmVlZCB0byByZXNlbmQuCiAgKi8KLXVuc2lnbmVkIGludCByeHJwY19zb2Z0X2Fja19kZWxheSA9IDEgKiBIWjsKK3Vuc2lnbmVkIGludCByeHJwY19zb2Z0X2Fja19kZWxheSA9IDEgKiAxMDAwOwogCiAvKgotICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgc2NoZWR1bGluZyBhbiBBQ0sgd2l0aCBzdWJ0eXBlIElETEUgKGluIGppZmZpZXMpLgorICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgc2NoZWR1bGluZyBhbiBBQ0sgd2l0aCBzdWJ0eXBlIElETEUgKGluIG1zKS4KICAqCiAgKiBXZSB1c2UgdGhpcyB3aGVuIHdlJ3ZlIGNvbnN1bWVkIHNvbWUgcHJldmlvdXNseSBzb2Z0LUFDSydkIHBhY2tldHMgd2hlbgogICogZnVydGhlciBwYWNrZXRzIGFyZW4ndCBpbW1lZGlhdGVseSByZWNlaXZlZCB0byBkZWNpZGUgd2hlbiB0byBzZW5kIGFuIElETEUKICAqIEFDSyBsZXQgdGhlIG90aGVyIGVuZCBrbm93IHRoYXQgaXQgY2FuIGZyZWUgdXAgaXRzIFR4IGJ1ZmZlciBzcGFjZS4KICAqLwotdW5zaWduZWQgaW50IHJ4cnBjX2lkbGVfYWNrX2RlbGF5ID0gMC41ICogSFo7Cit1bnNpZ25lZCBpbnQgcnhycGNfaWRsZV9hY2tfZGVsYXkgPSAwLjUgKiAxMDAwOwogCiAvKgogICogUmVjZWl2ZSB3aW5kb3cgc2l6ZSBpbiBwYWNrZXRzLiAgVGhpcyBpbmRpY2F0ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mCkBAIC01MCw3ICs1NSwxMCBAQAogICogbGltaXQgaXMgaGl0LCB3ZSBzaG91bGQgZ2VuZXJhdGUgYW4gRVhDRUVEU19XSU5ET1cgQUNLIGFuZCBkaXNjYXJkIGZ1cnRoZXIKICAqIHBhY2tldHMuCiAgKi8KLXVuc2lnbmVkIGludCByeHJwY19yeF93aW5kb3dfc2l6ZSA9IDMyOwordW5zaWduZWQgaW50IHJ4cnBjX3J4X3dpbmRvd19zaXplID0gUlhSUENfSU5JVF9SWF9XSU5ET1dfU0laRTsKKyNpZiAoUlhSUENfUlhUWF9CVUZGX1NJWkUgLSAxKSA8IFJYUlBDX0lOSVRfUlhfV0lORE9XX1NJWkUKKyNlcnJvciBOZWVkIHRvIHJlZHVjZSBSWFJQQ19JTklUX1JYX1dJTkRPV19TSVpFCisjZW5kaWYKIAogLyoKICAqIE1heGltdW0gUnggTVRVIHNpemUuICBUaGlzIGluZGljYXRlcyB0byB0aGUgc2VuZGVyIHRoZSBzaXplIG9mIGp1bWJvIHBhY2tldApAQCAtNjQsNiArNzIsMTEgQEAKICAqLwogdW5zaWduZWQgaW50IHJ4cnBjX3J4X2p1bWJvX21heCA9IDQ7CiAKKy8qCisgKiBUaW1lIHRpbGwgcGFja2V0IHJlc2VuZCAoaW4gbWlsbGlzZWNvbmRzKS4KKyAqLwordW5zaWduZWQgaW50IHJ4cnBjX3Jlc2VuZF90aW1lb3V0ID0gNCAqIDEwMDA7CisKIGNvbnN0IGNoYXIgKmNvbnN0IHJ4cnBjX3BrdHNbXSA9IHsKIAkiPzAwIiwKIAkiREFUQSIsICJBQ0siLCAiQlVTWSIsICJBQk9SVCIsICJBQ0tBTEwiLCAiQ0hBTEwiLCAiUkVTUCIsICJERUJVRyIsCkBAIC03NSwyMSArODgsMTUyIEBACiAJW1JYUlBDX0FDS19ERUxBWV0JCT0gMSwKIAlbUlhSUENfQUNLX1JFUVVFU1RFRF0JCT0gMiwKIAlbUlhSUENfQUNLX0lETEVdCQk9IDMsCi0JW1JYUlBDX0FDS19QSU5HX1JFU1BPTlNFXQk9IDQsCi0JW1JYUlBDX0FDS19EVVBMSUNBVEVdCQk9IDUsCi0JW1JYUlBDX0FDS19PVVRfT0ZfU0VRVUVOQ0VdCT0gNiwKLQlbUlhSUENfQUNLX0VYQ0VFRFNfV0lORE9XXQk9IDcsCi0JW1JYUlBDX0FDS19OT1NQQUNFXQkJPSA4LAorCVtSWFJQQ19BQ0tfRFVQTElDQVRFXQkJPSA0LAorCVtSWFJQQ19BQ0tfT1VUX09GX1NFUVVFTkNFXQk9IDUsCisJW1JYUlBDX0FDS19FWENFRURTX1dJTkRPV10JPSA2LAorCVtSWFJQQ19BQ0tfTk9TUEFDRV0JCT0gNywKKwlbUlhSUENfQUNLX1BJTkdfUkVTUE9OU0VdCT0gOCwKKwlbUlhSUENfQUNLX1BJTkddCQk9IDksCiB9OwogCi1jb25zdCBjaGFyICpyeHJwY19hY2tzKHU4IHJlYXNvbikKLXsKLQlzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3RyW10gPSB7Ci0JCSItLS0iLCAiUkVRIiwgIkRVUCIsICJPT1MiLCAiV0lOIiwgIk1FTSIsICJQTkciLCAiUE5SIiwgIkRMWSIsCi0JCSJJREwiLCAiLT8tIgotCX07Citjb25zdCBjaGFyIGNvbnN0IHJ4cnBjX2Fja19uYW1lc1tSWFJQQ19BQ0tfX0lOVkFMSUQgKyAxXVs0XSA9IHsKKwkiLS0tIiwgIlJFUSIsICJEVVAiLCAiT09TIiwgIldJTiIsICJNRU0iLCAiUE5HIiwgIlBOUiIsICJETFkiLAorCSJJREwiLCAiLT8tIgorfTsKIAotCWlmIChyZWFzb24gPj0gQVJSQVlfU0laRShzdHIpKQotCQlyZWFzb24gPSBBUlJBWV9TSVpFKHN0cikgLSAxOwotCXJldHVybiBzdHJbcmVhc29uXTsKLX0KK2NvbnN0IGNoYXIgcnhycGNfc2tiX3RyYWNlc1tyeHJwY19za2JfX25yX3RyYWNlXVs3XSA9IHsKKwlbcnhycGNfc2tiX3J4X2NsZWFuZWRdCQk9ICJSeCBDTE4iLAorCVtyeHJwY19za2JfcnhfZnJlZWRdCQk9ICJSeCBGUkUiLAorCVtyeHJwY19za2JfcnhfZ290XQkJPSAiUnggR09UIiwKKwlbcnhycGNfc2tiX3J4X2xvc3RdCQk9ICJSeCAqTCoiLAorCVtyeHJwY19za2JfcnhfcmVjZWl2ZWRdCQk9ICJSeCBSQ1YiLAorCVtyeHJwY19za2JfcnhfcHVyZ2VkXQkJPSAiUnggUFVSIiwKKwlbcnhycGNfc2tiX3J4X3JvdGF0ZWRdCQk9ICJSeCBST1QiLAorCVtyeHJwY19za2Jfcnhfc2Vlbl0JCT0gIlJ4IFNFRSIsCisJW3J4cnBjX3NrYl90eF9jbGVhbmVkXQkJPSAiVHggQ0xOIiwKKwlbcnhycGNfc2tiX3R4X2ZyZWVkXQkJPSAiVHggRlJFIiwKKwlbcnhycGNfc2tiX3R4X2dvdF0JCT0gIlR4IEdPVCIsCisJW3J4cnBjX3NrYl90eF9uZXddCQk9ICJUeCBORVciLAorCVtyeHJwY19za2JfdHhfcm90YXRlZF0JCT0gIlR4IFJPVCIsCisJW3J4cnBjX3NrYl90eF9zZWVuXQkJPSAiVHggU0VFIiwKK307CisKK2NvbnN0IGNoYXIgcnhycGNfY29ubl90cmFjZXNbcnhycGNfY29ubl9fbnJfdHJhY2VdWzRdID0geworCVtyeHJwY19jb25uX25ld19jbGllbnRdCQk9ICJOV2MiLAorCVtyeHJwY19jb25uX25ld19zZXJ2aWNlXQk9ICJOV3MiLAorCVtyeHJwY19jb25uX3F1ZXVlZF0JCT0gIlFVRSIsCisJW3J4cnBjX2Nvbm5fc2Vlbl0JCT0gIlNFRSIsCisJW3J4cnBjX2Nvbm5fZ290XQkJPSAiR09UIiwKKwlbcnhycGNfY29ubl9wdXRfY2xpZW50XQkJPSAiUFRjIiwKKwlbcnhycGNfY29ubl9wdXRfc2VydmljZV0JPSAiUFRzIiwKK307CisKK2NvbnN0IGNoYXIgcnhycGNfY2xpZW50X3RyYWNlc1tyeHJwY19jbGllbnRfX25yX3RyYWNlXVs3XSA9IHsKKwlbcnhycGNfY2xpZW50X2FjdGl2YXRlX2NoYW5zXQk9ICJBY3RpdmEiLAorCVtyeHJwY19jbGllbnRfYWxsb2NdCQk9ICJBbGxvYyAiLAorCVtyeHJwY19jbGllbnRfY2hhbl9hY3RpdmF0ZV0JPSAiQ2hBY3R2IiwKKwlbcnhycGNfY2xpZW50X2NoYW5fZGlzY29ubmVjdF0JPSAiQ2hEaXNjIiwKKwlbcnhycGNfY2xpZW50X2NoYW5fcGFzc10JPSAiQ2hQYXNzIiwKKwlbcnhycGNfY2xpZW50X2NoYW5fdW5zdGFydGVkXQk9ICJDaFVuc3QiLAorCVtyeHJwY19jbGllbnRfY2xlYW51cF0JCT0gIkNsZWFuICIsCisJW3J4cnBjX2NsaWVudF9jb3VudF0JCT0gIkNvdW50ICIsCisJW3J4cnBjX2NsaWVudF9kaXNjYXJkXQkJPSAiRGlzY2FyIiwKKwlbcnhycGNfY2xpZW50X2R1cGxpY2F0ZV0JPSAiRHVwbGljIiwKKwlbcnhycGNfY2xpZW50X2V4cG9zZWRdCQk9ICJFeHBvc2UiLAorCVtyeHJwY19jbGllbnRfcmVwbGFjZV0JCT0gIlJlcGxhYyIsCisJW3J4cnBjX2NsaWVudF90b19hY3RpdmVdCT0gIi0+QWN0diIsCisJW3J4cnBjX2NsaWVudF90b19jdWxsZWRdCT0gIi0+Q3VsbCIsCisJW3J4cnBjX2NsaWVudF90b19pZGxlXQkJPSAiLT5JZGxlIiwKKwlbcnhycGNfY2xpZW50X3RvX2luYWN0aXZlXQk9ICItPkluYWMiLAorCVtyeHJwY19jbGllbnRfdG9fd2FpdGluZ10JPSAiLT5XYWl0IiwKKwlbcnhycGNfY2xpZW50X3VuY291bnRdCQk9ICJVbmNvdW4iLAorfTsKKworY29uc3QgY2hhciByeHJwY190cmFuc21pdF90cmFjZXNbcnhycGNfdHJhbnNtaXRfX25yX3RyYWNlXVs0XSA9IHsKKwlbcnhycGNfdHJhbnNtaXRfd2FpdF0JCT0gIldBSSIsCisJW3J4cnBjX3RyYW5zbWl0X3F1ZXVlXQkJPSAiUVVFIiwKKwlbcnhycGNfdHJhbnNtaXRfcXVldWVfbGFzdF0JPSAiUUxTIiwKKwlbcnhycGNfdHJhbnNtaXRfcm90YXRlXQkJPSAiUk9UIiwKKwlbcnhycGNfdHJhbnNtaXRfcm90YXRlX2xhc3RdCT0gIlJMUyIsCisJW3J4cnBjX3RyYW5zbWl0X2F3YWl0X3JlcGx5XQk9ICJBV1IiLAorCVtyeHJwY190cmFuc21pdF9lbmRdCQk9ICJFTkQiLAorfTsKKworY29uc3QgY2hhciByeHJwY19yZWNlaXZlX3RyYWNlc1tyeHJwY19yZWNlaXZlX19ucl90cmFjZV1bNF0gPSB7CisJW3J4cnBjX3JlY2VpdmVfaW5jb21pbmddCT0gIklOQyIsCisJW3J4cnBjX3JlY2VpdmVfcXVldWVdCQk9ICJRVUUiLAorCVtyeHJwY19yZWNlaXZlX3F1ZXVlX2xhc3RdCT0gIlFMUyIsCisJW3J4cnBjX3JlY2VpdmVfZnJvbnRdCQk9ICJGUk4iLAorCVtyeHJwY19yZWNlaXZlX3JvdGF0ZV0JCT0gIlJPVCIsCisJW3J4cnBjX3JlY2VpdmVfZW5kXQkJPSAiRU5EIiwKK307CisKK2NvbnN0IGNoYXIgcnhycGNfcmVjdm1zZ190cmFjZXNbcnhycGNfcmVjdm1zZ19fbnJfdHJhY2VdWzVdID0geworCVtyeHJwY19yZWN2bXNnX2VudGVyXQkJPSAiRU5UUiIsCisJW3J4cnBjX3JlY3Ztc2dfd2FpdF0JCT0gIldBSVQiLAorCVtyeHJwY19yZWN2bXNnX2RlcXVldWVdCQk9ICJERVFVIiwKKwlbcnhycGNfcmVjdm1zZ19ob2xlXQkJPSAiSE9MRSIsCisJW3J4cnBjX3JlY3Ztc2dfbmV4dF0JCT0gIk5FWFQiLAorCVtyeHJwY19yZWN2bXNnX2NvbnRdCQk9ICJDT05UIiwKKwlbcnhycGNfcmVjdm1zZ19mdWxsXQkJPSAiRlVMTCIsCisJW3J4cnBjX3JlY3Ztc2dfZGF0YV9yZXR1cm5dCT0gIkRBVEEiLAorCVtyeHJwY19yZWN2bXNnX3Rlcm1pbmFsXQk9ICJURVJNIiwKKwlbcnhycGNfcmVjdm1zZ190b19iZV9hY2NlcHRlZF0JPSAiVEJBQyIsCisJW3J4cnBjX3JlY3Ztc2dfcmV0dXJuXQkJPSAiUkVUTiIsCit9OworCitjb25zdCBjaGFyIHJ4cnBjX3J0dF90eF90cmFjZXNbcnhycGNfcnR0X3R4X19ucl90cmFjZV1bNV0gPSB7CisJW3J4cnBjX3J0dF90eF9waW5nXQkJPSAiUElORyIsCisJW3J4cnBjX3J0dF90eF9kYXRhXQkJPSAiREFUQSIsCit9OworCitjb25zdCBjaGFyIHJ4cnBjX3J0dF9yeF90cmFjZXNbcnhycGNfcnR0X3J4X19ucl90cmFjZV1bNV0gPSB7CisJW3J4cnBjX3J0dF9yeF9waW5nX3Jlc3BvbnNlXQk9ICJQT05HIiwKKwlbcnhycGNfcnR0X3J4X3JlcXVlc3RlZF9hY2tdCT0gIlJBQ0siLAorfTsKKworY29uc3QgY2hhciByeHJwY190aW1lcl90cmFjZXNbcnhycGNfdGltZXJfX25yX3RyYWNlXVs4XSA9IHsKKwlbcnhycGNfdGltZXJfYmVnaW5dCQkJPSAiQmVnaW4gIiwKKwlbcnhycGNfdGltZXJfZXhwaXJlZF0JCQk9ICIqRVhQUioiLAorCVtyeHJwY190aW1lcl9pbml0X2Zvcl9yZXBseV0JCT0gIkluaVJwbCIsCisJW3J4cnBjX3RpbWVyX3NldF9mb3JfYWNrXQkJPSAiU2V0QWNrIiwKKwlbcnhycGNfdGltZXJfc2V0X2Zvcl9zZW5kXQkJPSAiU2V0VHggIiwKKwlbcnhycGNfdGltZXJfc2V0X2Zvcl9yZXNlbmRdCQk9ICJTZXRSVHgiLAorfTsKKworY29uc3QgY2hhciByeHJwY19wcm9wb3NlX2Fja190cmFjZXNbcnhycGNfcHJvcG9zZV9hY2tfX25yX3RyYWNlXVs4XSA9IHsKKwlbcnhycGNfcHJvcG9zZV9hY2tfY2xpZW50X3R4X2VuZF0JPSAiQ2xUeEVuZCIsCisJW3J4cnBjX3Byb3Bvc2VfYWNrX2lucHV0X2RhdGFdCQk9ICJEYXRhSW4gIiwKKwlbcnhycGNfcHJvcG9zZV9hY2tfcGluZ19mb3JfbG9zdF9hY2tdCT0gIkxvc3RBY2siLAorCVtyeHJwY19wcm9wb3NlX2Fja19waW5nX2Zvcl9sb3N0X3JlcGx5XQk9ICJMb3N0UnBsIiwKKwlbcnhycGNfcHJvcG9zZV9hY2tfcGluZ19mb3JfcGFyYW1zXQk9ICJQYXJhbXMgIiwKKwlbcnhycGNfcHJvcG9zZV9hY2tfcmVzcG9uZF90b19hY2tdCT0gIlJzcDJBY2siLAorCVtyeHJwY19wcm9wb3NlX2Fja19yZXNwb25kX3RvX3BpbmddCT0gIlJzcDJQbmciLAorCVtyeHJwY19wcm9wb3NlX2Fja19yZXRyeV90eF0JCT0gIlJldHJ5VHgiLAorCVtyeHJwY19wcm9wb3NlX2Fja19yb3RhdGVfcnhdCQk9ICJSeEFjayAgIiwKKwlbcnhycGNfcHJvcG9zZV9hY2tfdGVybWluYWxfYWNrXQk9ICJDbFRlcm0gIiwKK307CisKK2NvbnN0IGNoYXIgKmNvbnN0IHJ4cnBjX3Byb3Bvc2VfYWNrX291dGNvbWVzW3J4cnBjX3Byb3Bvc2VfYWNrX19ucl9vdXRjb21lc10gPSB7CisJW3J4cnBjX3Byb3Bvc2VfYWNrX3VzZV0JCQk9ICIiLAorCVtyeHJwY19wcm9wb3NlX2Fja191cGRhdGVdCQk9ICIgVXBkYXRlIiwKKwlbcnhycGNfcHJvcG9zZV9hY2tfc3Vic3VtZV0JCT0gIiBTdWJzdW1lIiwKK307CisKK2NvbnN0IGNoYXIgcnhycGNfY29uZ2VzdF9tb2Rlc1tOUl9fUlhSUENfQ09OR0VTVF9NT0RFU11bMTBdID0geworCVtSWFJQQ19DQUxMX1NMT1dfU1RBUlRdCQk9ICJTbG93U3RhcnQiLAorCVtSWFJQQ19DQUxMX0NPTkdFU1RfQVZPSURBTkNFXQk9ICJDb25nQXZvaWQiLAorCVtSWFJQQ19DQUxMX1BBQ0tFVF9MT1NTXQk9ICJQa3RMb3NzICAiLAorCVtSWFJQQ19DQUxMX0ZBU1RfUkVUUkFOU01JVF0JPSAiRmFzdFJlVHggIiwKK307CisKK2NvbnN0IGNoYXIgcnhycGNfY29uZ2VzdF9jaGFuZ2VzW3J4cnBjX2Nvbmdlc3RfX25yX2NoYW5nZV1bOV0gPSB7CisJW3J4cnBjX2NvbmdfYmVnaW5fcmV0cmFuc21pc3Npb25dCT0gIiBSZXRyYW5zIiwKKwlbcnhycGNfY29uZ19jbGVhcmVkX25hY2tzXQkJPSAiIENsZWFyZWQiLAorCVtyeHJwY19jb25nX25ld19sb3dfbmFja10JCT0gIiBOZXdMb3dOIiwKKwlbcnhycGNfY29uZ19ub19jaGFuZ2VdCQkJPSAiIiwKKwlbcnhycGNfY29uZ19wcm9ncmVzc10JCQk9ICIgUHJvZ3JlcyIsCisJW3J4cnBjX2NvbmdfcmV0cmFuc21pdF9hZ2Fpbl0JCT0gIiBSZVR4QWduIiwKKwlbcnhycGNfY29uZ19ydHRfd2luZG93X2VuZF0JCT0gIiBSdHRXaW5FIiwKKwlbcnhycGNfY29uZ19zYXdfbmFja10JCQk9ICIgU2F3TmFjayIsCit9OwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL291dHB1dC5jIGIvbmV0L3J4cnBjL291dHB1dC5jCmluZGV4IGY0YmRhMDYuLjBkNDdkYjggMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9vdXRwdXQuYworKysgYi9uZXQvcnhycGMvb3V0cHV0LmMKQEAgLTE0LDMzNiArMTQsMzI2IEBACiAjaW5jbHVkZSA8bGludXgvbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9hZl9yeHJwYy5oPgogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKLS8qCi0gKiBUaW1lIHRpbGwgcGFja2V0IHJlc2VuZCAoaW4gamlmZmllcykuCi0gKi8KLXVuc2lnbmVkIGludCByeHJwY19yZXNlbmRfdGltZW91dCA9IDQgKiBIWjsKLQotc3RhdGljIGludCByeHJwY19zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAotCQkJICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pOworc3RydWN0IHJ4cnBjX3BrdF9idWZmZXIgeworCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCByeHJwY19hY2twYWNrZXQgYWNrOworCQkJdTggYWNrc1syNTVdOworCQkJdTggcGFkWzNdOworCQl9OworCQlfX2JlMzIgYWJvcnRfY29kZTsKKwl9OworCXN0cnVjdCByeHJwY19hY2tpbmZvIGFja2luZm87Cit9OwogCiAvKgotICogZXh0cmFjdCBjb250cm9sIG1lc3NhZ2VzIGZyb20gdGhlIHNlbmRtc2coKSBjb250cm9sIGJ1ZmZlcgorICogRmlsbCBvdXQgYW4gQUNLIHBhY2tldC4KICAqLwotc3RhdGljIGludCByeHJwY19zZW5kbXNnX2Ntc2coc3RydWN0IG1zZ2hkciAqbXNnLAotCQkJICAgICAgdW5zaWduZWQgbG9uZyAqdXNlcl9jYWxsX0lELAotCQkJICAgICAgZW51bSByeHJwY19jb21tYW5kICpjb21tYW5kLAotCQkJICAgICAgdTMyICphYm9ydF9jb2RlLAotCQkJICAgICAgYm9vbCAqX2V4Y2x1c2l2ZSkKK3N0YXRpYyBzaXplX3QgcnhycGNfZmlsbF9vdXRfYWNrKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSBzdHJ1Y3QgcnhycGNfcGt0X2J1ZmZlciAqcGt0LAorCQkJCSByeHJwY19zZXFfdCAqX2hhcmRfYWNrLAorCQkJCSByeHJwY19zZXFfdCAqX3RvcCkKIHsKLQlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKLQlib29sIGdvdF91c2VyX0lEID0gZmFsc2U7Ci0JaW50IGxlbjsKKwlyeHJwY19zZXJpYWxfdCBzZXJpYWw7CisJcnhycGNfc2VxX3QgaGFyZF9hY2ssIHRvcCwgc2VxOworCWludCBpeDsKKwl1MzIgbXR1LCBqbWF4OworCXU4ICphY2twID0gcGt0LT5hY2tzOwogCi0JKmNvbW1hbmQgPSBSWFJQQ19DTURfU0VORF9EQVRBOworCS8qIEJhcnJpZXIgYWdhaW5zdCByeHJwY19pbnB1dF9kYXRhKCkuICovCisJc2VyaWFsID0gY2FsbC0+YWNrcl9zZXJpYWw7CisJaGFyZF9hY2sgPSBSRUFEX09OQ0UoY2FsbC0+cnhfaGFyZF9hY2spOworCXRvcCA9IHNtcF9sb2FkX2FjcXVpcmUoJmNhbGwtPnJ4X3RvcCk7CisJKl9oYXJkX2FjayA9IGhhcmRfYWNrOworCSpfdG9wID0gdG9wOwogCi0JaWYgKG1zZy0+bXNnX2NvbnRyb2xsZW4gPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJcGt0LT5hY2suYnVmZmVyU3BhY2UJPSBodG9ucyg4KTsKKwlwa3QtPmFjay5tYXhTa2V3CT0gaHRvbnMoY2FsbC0+YWNrcl9za2V3KTsKKwlwa3QtPmFjay5maXJzdFBhY2tldAk9IGh0b25sKGhhcmRfYWNrICsgMSk7CisJcGt0LT5hY2sucHJldmlvdXNQYWNrZXQJPSBodG9ubChjYWxsLT5hY2tyX3ByZXZfc2VxKTsKKwlwa3QtPmFjay5zZXJpYWwJCT0gaHRvbmwoc2VyaWFsKTsKKwlwa3QtPmFjay5yZWFzb24JCT0gY2FsbC0+YWNrcl9yZWFzb247CisJcGt0LT5hY2subkFja3MJCT0gdG9wIC0gaGFyZF9hY2s7CiAKLQlmb3JfZWFjaF9jbXNnaGRyKGNtc2csIG1zZykgewotCQlpZiAoIUNNU0dfT0sobXNnLCBjbXNnKSkKLQkJCXJldHVybiAtRUlOVkFMOworCWlmIChwa3QtPmFjay5yZWFzb24gPT0gUlhSUENfQUNLX1BJTkcpCisJCXBrdC0+d2hkci5mbGFncyB8PSBSWFJQQ19SRVFVRVNUX0FDSzsKIAotCQlsZW4gPSBjbXNnLT5jbXNnX2xlbiAtIENNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSk7Ci0JCV9kZWJ1ZygiQ01TRyAlZCwgJWQsICVkIiwKLQkJICAgICAgIGNtc2ctPmNtc2dfbGV2ZWwsIGNtc2ctPmNtc2dfdHlwZSwgbGVuKTsKKwlpZiAoYWZ0ZXIodG9wLCBoYXJkX2FjaykpIHsKKwkJc2VxID0gaGFyZF9hY2sgKyAxOworCQlkbyB7CisJCQlpeCA9IHNlcSAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLOworCQkJaWYgKGNhbGwtPnJ4dHhfYnVmZmVyW2l4XSkKKwkJCQkqYWNrcCsrID0gUlhSUENfQUNLX1RZUEVfQUNLOworCQkJZWxzZQorCQkJCSphY2twKysgPSBSWFJQQ19BQ0tfVFlQRV9OQUNLOworCQkJc2VxKys7CisJCX0gd2hpbGUgKGJlZm9yZV9lcShzZXEsIHRvcCkpOworCX0KIAotCQlpZiAoY21zZy0+Y21zZ19sZXZlbCAhPSBTT0xfUlhSUEMpCi0JCQljb250aW51ZTsKKwltdHUgPSBjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+aWZfbXR1OworCW10dSAtPSBjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+aGRyc2l6ZTsKKwlqbWF4ID0gKGNhbGwtPm5yX2p1bWJvX2JhZCA+IDMpID8gMSA6IHJ4cnBjX3J4X2p1bWJvX21heDsKKwlwa3QtPmFja2luZm8ucnhNVFUJPSBodG9ubChyeHJwY19yeF9tdHUpOworCXBrdC0+YWNraW5mby5tYXhNVFUJPSBodG9ubChtdHUpOworCXBrdC0+YWNraW5mby5yd2luZAk9IGh0b25sKGNhbGwtPnJ4X3dpbnNpemUpOworCXBrdC0+YWNraW5mby5qdW1ib19tYXgJPSBodG9ubChqbWF4KTsKIAotCQlzd2l0Y2ggKGNtc2ctPmNtc2dfdHlwZSkgewotCQljYXNlIFJYUlBDX1VTRVJfQ0FMTF9JRDoKLQkJCWlmIChtc2ctPm1zZ19mbGFncyAmIE1TR19DTVNHX0NPTVBBVCkgewotCQkJCWlmIChsZW4gIT0gc2l6ZW9mKHUzMikpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCSp1c2VyX2NhbGxfSUQgPSAqKHUzMiAqKSBDTVNHX0RBVEEoY21zZyk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChsZW4gIT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQkqdXNlcl9jYWxsX0lEID0gKih1bnNpZ25lZCBsb25nICopCi0JCQkJCUNNU0dfREFUQShjbXNnKTsKLQkJCX0KLQkJCV9kZWJ1ZygiVXNlciBDYWxsIElEICVseCIsICp1c2VyX2NhbGxfSUQpOwotCQkJZ290X3VzZXJfSUQgPSB0cnVlOwotCQkJYnJlYWs7CisJKmFja3ArKyA9IDA7CisJKmFja3ArKyA9IDA7CisJKmFja3ArKyA9IDA7CisJcmV0dXJuIHRvcCAtIGhhcmRfYWNrICsgMzsKK30KIAotCQljYXNlIFJYUlBDX0FCT1JUOgotCQkJaWYgKCpjb21tYW5kICE9IFJYUlBDX0NNRF9TRU5EX0RBVEEpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkqY29tbWFuZCA9IFJYUlBDX0NNRF9TRU5EX0FCT1JUOwotCQkJaWYgKGxlbiAhPSBzaXplb2YoKmFib3J0X2NvZGUpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJKmFib3J0X2NvZGUgPSAqKHVuc2lnbmVkIGludCAqKSBDTVNHX0RBVEEoY21zZyk7Ci0JCQlfZGVidWcoIkFib3J0ICV4IiwgKmFib3J0X2NvZGUpOwotCQkJaWYgKCphYm9ydF9jb2RlID09IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlicmVhazsKKy8qCisgKiBTZW5kIGFuIEFDSyBvciBBQk9SVCBjYWxsIHBhY2tldC4KKyAqLworaW50IHJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHU4IHR5cGUpCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBOVUxMOworCXN0cnVjdCByeHJwY19wa3RfYnVmZmVyICpwa3Q7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92WzJdOworCXJ4cnBjX3NlcmlhbF90IHNlcmlhbDsKKwlyeHJwY19zZXFfdCBoYXJkX2FjaywgdG9wOworCXNpemVfdCBsZW4sIG47CisJYm9vbCBwaW5nID0gZmFsc2U7CisJaW50IGlvYywgcmV0OworCXUzMiBhYm9ydF9jb2RlOwogCi0JCWNhc2UgUlhSUENfQUNDRVBUOgotCQkJaWYgKCpjb21tYW5kICE9IFJYUlBDX0NNRF9TRU5EX0RBVEEpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkqY29tbWFuZCA9IFJYUlBDX0NNRF9BQ0NFUFQ7Ci0JCQlpZiAobGVuICE9IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlicmVhazsKKwlfZW50ZXIoIiV1LCVzIiwgY2FsbC0+ZGVidWdfaWQsIHJ4cnBjX3BrdHNbdHlwZV0pOwogCi0JCWNhc2UgUlhSUENfRVhDTFVTSVZFX0NBTEw6Ci0JCQkqX2V4Y2x1c2l2ZSA9IHRydWU7Ci0JCQlpZiAobGVuICE9IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRUlOVkFMOworCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisJaWYgKGNhbGwtPmNvbm4pCisJCWNvbm4gPSByeHJwY19nZXRfY29ubmVjdGlvbl9tYXliZShjYWxsLT5jb25uKTsKKwlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisJaWYgKCFjb25uKQorCQlyZXR1cm4gLUVDT05OUkVTRVQ7CisKKwlwa3QgPSBremFsbG9jKHNpemVvZigqcGt0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwa3QpIHsKKwkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1zZy5tc2dfbmFtZQk9ICZjYWxsLT5wZWVyLT5zcngudHJhbnNwb3J0OworCW1zZy5tc2dfbmFtZWxlbgk9IGNhbGwtPnBlZXItPnNyeC50cmFuc3BvcnRfbGVuOworCW1zZy5tc2dfY29udHJvbAk9IE5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwltc2cubXNnX2ZsYWdzCT0gMDsKKworCXBrdC0+d2hkci5lcG9jaAkJPSBodG9ubChjb25uLT5wcm90by5lcG9jaCk7CisJcGt0LT53aGRyLmNpZAkJPSBodG9ubChjYWxsLT5jaWQpOworCXBrdC0+d2hkci5jYWxsTnVtYmVyCT0gaHRvbmwoY2FsbC0+Y2FsbF9pZCk7CisJcGt0LT53aGRyLnNlcQkJPSAwOworCXBrdC0+d2hkci50eXBlCQk9IHR5cGU7CisJcGt0LT53aGRyLmZsYWdzCQk9IGNvbm4tPm91dF9jbGllbnRmbGFnOworCXBrdC0+d2hkci51c2VyU3RhdHVzCT0gMDsKKwlwa3QtPndoZHIuc2VjdXJpdHlJbmRleAk9IGNhbGwtPnNlY3VyaXR5X2l4OworCXBrdC0+d2hkci5fcnN2ZAkJPSAwOworCXBrdC0+d2hkci5zZXJ2aWNlSWQJPSBodG9ucyhjYWxsLT5zZXJ2aWNlX2lkKTsKKworCWlvdlswXS5pb3ZfYmFzZQk9IHBrdDsKKwlpb3ZbMF0uaW92X2xlbgk9IHNpemVvZihwa3QtPndoZHIpOworCWxlbiA9IHNpemVvZihwa3QtPndoZHIpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQ0s6CisJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisJCWlmICghY2FsbC0+YWNrcl9yZWFzb24pIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwaW5nID0gKGNhbGwtPmFja3JfcmVhc29uID09IFJYUlBDX0FDS19QSU5HKTsKKwkJbiA9IHJ4cnBjX2ZpbGxfb3V0X2FjayhjYWxsLCBwa3QsICZoYXJkX2FjaywgJnRvcCk7CisJCWNhbGwtPmFja3JfcmVhc29uID0gMDsKKworCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7CisKKworCQlwa3QtPndoZHIuZmxhZ3MgfD0gUlhSUENfU0xPV19TVEFSVF9PSzsKKworCQlpb3ZbMF0uaW92X2xlbiArPSBzaXplb2YocGt0LT5hY2spICsgbjsKKwkJaW92WzFdLmlvdl9iYXNlID0gJnBrdC0+YWNraW5mbzsKKwkJaW92WzFdLmlvdl9sZW4JPSBzaXplb2YocGt0LT5hY2tpbmZvKTsKKwkJbGVuICs9IHNpemVvZihwa3QtPmFjaykgKyBuICsgc2l6ZW9mKHBrdC0+YWNraW5mbyk7CisJCWlvYyA9IDI7CisJCWJyZWFrOworCisJY2FzZSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDoKKwkJYWJvcnRfY29kZSA9IGNhbGwtPmFib3J0X2NvZGU7CisJCXBrdC0+YWJvcnRfY29kZSA9IGh0b25sKGFib3J0X2NvZGUpOworCQlpb3ZbMF0uaW92X2xlbiArPSBzaXplb2YocGt0LT5hYm9ydF9jb2RlKTsKKwkJbGVuICs9IHNpemVvZihwa3QtPmFib3J0X2NvZGUpOworCQlpb2MgPSAxOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXQgPSAtRU5PQU5POworCQlnb3RvIG91dDsKKwl9CisKKwlzZXJpYWwgPSBhdG9taWNfaW5jX3JldHVybigmY29ubi0+c2VyaWFsKTsKKwlwa3QtPndoZHIuc2VyaWFsID0gaHRvbmwoc2VyaWFsKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSzoKKwkJdHJhY2VfcnhycGNfdHhfYWNrKGNhbGwsIHNlcmlhbCwKKwkJCQkgICBudG9obChwa3QtPmFjay5maXJzdFBhY2tldCksCisJCQkJICAgbnRvaGwocGt0LT5hY2suc2VyaWFsKSwKKwkJCQkgICBwa3QtPmFjay5yZWFzb24sIHBrdC0+YWNrLm5BY2tzKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHBpbmcpIHsKKwkJY2FsbC0+YWNrcl9waW5nID0gc2VyaWFsOworCQlzbXBfd21iKCk7CisJCS8qIFdlIG5lZWQgdG8gc3RpY2sgYSB0aW1lIGluIGJlZm9yZSB3ZSBzZW5kIHRoZSBwYWNrZXQgaW4gY2FzZQorCQkgKiB0aGUgcmVwbHkgZ2V0cyBiYWNrIGJlZm9yZSBrZXJuZWxfc2VuZG1zZygpIGNvbXBsZXRlcyAtIGJ1dAorCQkgKiBhc2tpbmcgVURQIHRvIHNlbmQgdGhlIHBhY2tldCBjYW4gdGFrZSBhIHJlbGF0aXZlbHkgbG9uZworCQkgKiB0aW1lLCBzbyB3ZSB1cGRhdGUgdGhlIHRpbWUgYWZ0ZXIsIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQKKwkJICogdGhlIHBhY2tldCB0cmFuc21pc3Npb24gaXMgbW9yZSBsaWtlbHkgdG8gaGFwcGVuIHRvd2FyZHMgdGhlCisJCSAqIGVuZCBvZiB0aGUga2VybmVsX3NlbmRtc2coKSBjYWxsLgorCQkgKi8KKwkJY2FsbC0+YWNrcl9waW5nX3RpbWUgPSBrdGltZV9nZXRfcmVhbCgpOworCQlzZXRfYml0KFJYUlBDX0NBTExfUElOR0lORywgJmNhbGwtPmZsYWdzKTsKKwkJdHJhY2VfcnhycGNfcnR0X3R4KGNhbGwsIHJ4cnBjX3J0dF90eF9waW5nLCBzZXJpYWwpOworCX0KKwlyZXQgPSBrZXJuZWxfc2VuZG1zZyhjb25uLT5wYXJhbXMubG9jYWwtPnNvY2tldCwKKwkJCSAgICAgJm1zZywgaW92LCBpb2MsIGxlbik7CisJaWYgKHBpbmcpCisJCWNhbGwtPmFja3JfcGluZ190aW1lID0ga3RpbWVfZ2V0X3JlYWwoKTsKKworCWlmICh0eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0FDSyAmJgorCSAgICBjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWNsZWFyX2JpdChSWFJQQ19DQUxMX1BJTkdJTkcsICZjYWxsLT5mbGFncyk7CisJCQlyeHJwY19wcm9wb3NlX0FDSyhjYWxsLCBwa3QtPmFjay5yZWFzb24sCisJCQkJCSAgbnRvaHMocGt0LT5hY2subWF4U2tldyksCisJCQkJCSAgbnRvaGwocGt0LT5hY2suc2VyaWFsKSwKKwkJCQkJICB0cnVlLCB0cnVlLAorCQkJCQkgIHJ4cnBjX3Byb3Bvc2VfYWNrX3JldHJ5X3R4KTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fbG9ja19iaCgmY2FsbC0+bG9jayk7CisJCQlpZiAoYWZ0ZXIoaGFyZF9hY2ssIGNhbGwtPmFja3JfY29uc3VtZWQpKQorCQkJCWNhbGwtPmFja3JfY29uc3VtZWQgPSBoYXJkX2FjazsKKwkJCWlmIChhZnRlcih0b3AsIGNhbGwtPmFja3Jfc2VlbikpCisJCQkJY2FsbC0+YWNrcl9zZWVuID0gdG9wOworCQkJc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwogCQl9CiAJfQogCi0JaWYgKCFnb3RfdXNlcl9JRCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JX2xlYXZlKCIgPSAwIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBhYm9ydCBhIGNhbGwsIHNlbmRpbmcgYW4gQUJPUlQgcGFja2V0IHRvIHRoZSBwZWVyCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX3NlbmRfYWJvcnQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHUzMiBhYm9ydF9jb2RlKQotewotCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCi0JaWYgKGNhbGwtPnN0YXRlIDw9IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0xPQ0FMTFlfQUJPUlRFRDsKLQkJY2FsbC0+bG9jYWxfYWJvcnQgPSBhYm9ydF9jb2RlOwotCQlzZXRfYml0KFJYUlBDX0NBTExfRVZfQUJPUlQsICZjYWxsLT5ldmVudHMpOwotCQlkZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKTsKLQkJZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcik7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORF9USU1FUiwgJmNhbGwtPmV2ZW50cyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX0VWX0FDSywgJmNhbGwtPmV2ZW50cyk7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7Ci0JCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JfQotCi0Jd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLX0KLQotLyoKLSAqIENyZWF0ZSBhIG5ldyBjbGllbnQgY2FsbCBmb3Igc2VuZG1zZygpLgotICovCi1zdGF0aWMgc3RydWN0IHJ4cnBjX2NhbGwgKgotcnhycGNfbmV3X2NsaWVudF9jYWxsX2Zvcl9zZW5kbXNnKHN0cnVjdCByeHJwY19zb2NrICpyeCwgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkJCSAgdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQsIGJvb2wgZXhjbHVzaXZlKQotewotCXN0cnVjdCByeHJwY19jb25uX3BhcmFtZXRlcnMgY3A7Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0Jc3RydWN0IGtleSAqa2V5OwotCi0JREVDTEFSRV9TT0NLQUREUihzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKiwgc3J4LCBtc2ctPm1zZ19uYW1lKTsKLQotCV9lbnRlcigiIik7Ci0KLQlpZiAoIW1zZy0+bXNnX25hbWUpCi0JCXJldHVybiBFUlJfUFRSKC1FREVTVEFERFJSRVEpOwotCi0Ja2V5ID0gcngtPmtleTsKLQlpZiAoa2V5ICYmICFyeC0+a2V5LT5wYXlsb2FkLmRhdGFbMF0pCi0JCWtleSA9IE5VTEw7Ci0KLQltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKLQljcC5sb2NhbAkJPSByeC0+bG9jYWw7Ci0JY3Aua2V5CQkJPSByeC0+a2V5OwotCWNwLnNlY3VyaXR5X2xldmVsCT0gcngtPm1pbl9zZWNfbGV2ZWw7Ci0JY3AuZXhjbHVzaXZlCQk9IHJ4LT5leGNsdXNpdmUgfCBleGNsdXNpdmU7Ci0JY3Auc2VydmljZV9pZAkJPSBzcngtPnNyeF9zZXJ2aWNlOwotCWNhbGwgPSByeHJwY19uZXdfY2xpZW50X2NhbGwocngsICZjcCwgc3J4LCB1c2VyX2NhbGxfSUQsIEdGUF9LRVJORUwpOwotCi0JX2xlYXZlKCIgPSAlcFxuIiwgY2FsbCk7Ci0JcmV0dXJuIGNhbGw7Ci19Ci0KLS8qCi0gKiBzZW5kIGEgbWVzc2FnZSBmb3JtaW5nIHBhcnQgb2YgYSBjbGllbnQgY2FsbCB0aHJvdWdoIGFuIFJ4UlBDIHNvY2tldAotICogLSBjYWxsZXIgaG9sZHMgdGhlIHNvY2tldCBsb2NrZWQKLSAqIC0gdGhlIHNvY2tldCBtYXkgYmUgZWl0aGVyIGEgY2xpZW50IHNvY2tldCBvciBhIHNlcnZlciBzb2NrZXQKLSAqLwotaW50IHJ4cnBjX2RvX3NlbmRtc2coc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCi17Ci0JZW51bSByeHJwY19jb21tYW5kIGNtZDsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKLQl1bnNpZ25lZCBsb25nIHVzZXJfY2FsbF9JRCA9IDA7Ci0JYm9vbCBleGNsdXNpdmUgPSBmYWxzZTsKLQl1MzIgYWJvcnRfY29kZSA9IDA7Ci0JaW50IHJldDsKLQotCV9lbnRlcigiIik7Ci0KLQlyZXQgPSByeHJwY19zZW5kbXNnX2Ntc2cobXNnLCAmdXNlcl9jYWxsX0lELCAmY21kLCAmYWJvcnRfY29kZSwKLQkJCQkgJmV4Y2x1c2l2ZSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoY21kID09IFJYUlBDX0NNRF9BQ0NFUFQpIHsKLQkJaWYgKHJ4LT5zay5za19zdGF0ZSAhPSBSWFJQQ19TRVJWRVJfTElTVEVOSU5HKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWNhbGwgPSByeHJwY19hY2NlcHRfY2FsbChyeCwgdXNlcl9jYWxsX0lEKTsKLQkJaWYgKElTX0VSUihjYWxsKSkKLQkJCXJldHVybiBQVFJfRVJSKGNhbGwpOwotCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY2FsbCA9IHJ4cnBjX2ZpbmRfY2FsbF9ieV91c2VyX0lEKHJ4LCB1c2VyX2NhbGxfSUQpOwotCWlmICghY2FsbCkgewotCQlpZiAoY21kICE9IFJYUlBDX0NNRF9TRU5EX0RBVEEpCi0JCQlyZXR1cm4gLUVCQURTTFQ7Ci0JCWNhbGwgPSByeHJwY19uZXdfY2xpZW50X2NhbGxfZm9yX3NlbmRtc2cocngsIG1zZywgdXNlcl9jYWxsX0lELAotCQkJCQkJCSBleGNsdXNpdmUpOwotCQlpZiAoSVNfRVJSKGNhbGwpKQotCQkJcmV0dXJuIFBUUl9FUlIoY2FsbCk7Ci0JfQotCi0JX2RlYnVnKCJDQUxMICVkIFVTUiAlbHggU1QgJWQgb24gQ09OTiAlcCIsCi0JICAgICAgIGNhbGwtPmRlYnVnX2lkLCBjYWxsLT51c2VyX2NhbGxfSUQsIGNhbGwtPnN0YXRlLCBjYWxsLT5jb25uKTsKLQotCWlmIChjYWxsLT5zdGF0ZSA+PSBSWFJQQ19DQUxMX0NPTVBMRVRFKSB7Ci0JCS8qIGl0J3MgdG9vIGxhdGUgZm9yIHRoaXMgY2FsbCAqLwotCQlyZXQgPSAtRUNPTk5SRVNFVDsKLQl9IGVsc2UgaWYgKGNtZCA9PSBSWFJQQ19DTURfU0VORF9BQk9SVCkgewotCQlyeHJwY19zZW5kX2Fib3J0KGNhbGwsIGFib3J0X2NvZGUpOwotCQlyZXQgPSAwOwotCX0gZWxzZSBpZiAoY21kICE9IFJYUlBDX0NNRF9TRU5EX0RBVEEpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9IGVsc2UgaWYgKCFjYWxsLT5pbl9jbGllbnRmbGFnICYmCi0JCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfQ0xJRU5UX1NFTkRfUkVRVUVTVCkgewotCQkvKiByZXF1ZXN0IHBoYXNlIGNvbXBsZXRlIGZvciB0aGlzIGNsaWVudCBjYWxsICovCi0JCXJldCA9IC1FUFJPVE87Ci0JfSBlbHNlIGlmIChjYWxsLT5pbl9jbGllbnRmbGFnICYmCi0JCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNUICYmCi0JCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFkpIHsKLQkJLyogUmVwbHkgcGhhc2Ugbm90IGJlZ3VuIG9yIG5vdCBjb21wbGV0ZSBmb3Igc2VydmljZSBjYWxsLiAqLwotCQlyZXQgPSAtRVBST1RPOwotCX0gZWxzZSB7Ci0JCXJldCA9IHJ4cnBjX3NlbmRfZGF0YShyeCwgY2FsbCwgbXNnLCBsZW4pOwotCX0KLQotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOworb3V0OgorCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworCWtmcmVlKHBrdCk7CiAJcmV0dXJuIHJldDsKIH0KIAotLyoqCi0gKiByeHJwY19rZXJuZWxfc2VuZF9kYXRhIC0gQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBzZW5kIGRhdGEgb24gYSBjYWxsCi0gKiBAY2FsbDogVGhlIGNhbGwgdG8gc2VuZCBkYXRhIHRocm91Z2gKLSAqIEBtc2c6IFRoZSBkYXRhIHRvIHNlbmQKLSAqIEBsZW46IFRoZSBhbW91bnQgb2YgZGF0YSB0byBzZW5kCi0gKgotICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBzZW5kIGRhdGEgb24gYSBjYWxsLiAgVGhlIGNhbGwgbXVzdCBiZSBpbiBhbiBzdGF0ZQotICogYXBwcm9wcmlhdGUgdG8gc2VuZGluZyBkYXRhLiAgTm8gY29udHJvbCBkYXRhIHNob3VsZCBiZSBzdXBwbGllZCBpbiBAbXNnLAotICogbm9yIHNob3VsZCBhbiBhZGRyZXNzIGJlIHN1cHBsaWVkLiAgTVNHX01PUkUgc2hvdWxkIGJlIGZsYWdnZWQgaWYgdGhlcmUncwotICogbW9yZSBkYXRhIHRvIGNvbWUsIG90aGVyd2lzZSB0aGlzIGRhdGEgd2lsbCBlbmQgdGhlIHRyYW5zbWlzc2lvbiBwaGFzZS4KLSAqLwotaW50IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJCSAgIHNpemVfdCBsZW4pCi17Ci0JaW50IHJldDsKLQotCV9lbnRlcigieyVkLCVzfSwiLCBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdKTsKLQotCUFTU0VSVENNUChtc2ctPm1zZ19uYW1lLCA9PSwgTlVMTCk7Ci0JQVNTRVJUQ01QKG1zZy0+bXNnX2NvbnRyb2wsID09LCBOVUxMKTsKLQotCWxvY2tfc29jaygmY2FsbC0+c29ja2V0LT5zayk7Ci0KLQlfZGVidWcoIkNBTEwgJWQgVVNSICVseCBTVCAlZCBvbiBDT05OICVwIiwKLQkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPnVzZXJfY2FsbF9JRCwgY2FsbC0+c3RhdGUsIGNhbGwtPmNvbm4pOwotCi0JaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKLQkJcmV0ID0gLUVTSFVURE9XTjsgLyogaXQncyB0b28gbGF0ZSBmb3IgdGhpcyBjYWxsICovCi0JfSBlbHNlIGlmIChjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1QgJiYKLQkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1QgJiYKLQkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWSkgewotCQlyZXQgPSAtRVBST1RPOyAvKiByZXF1ZXN0IHBoYXNlIGNvbXBsZXRlIGZvciB0aGlzIGNsaWVudCBjYWxsICovCi0JfSBlbHNlIHsKLQkJcmV0ID0gcnhycGNfc2VuZF9kYXRhKGNhbGwtPnNvY2tldCwgY2FsbCwgbXNnLCBsZW4pOwotCX0KLQotCXJlbGVhc2Vfc29jaygmY2FsbC0+c29ja2V0LT5zayk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfc2VuZF9kYXRhKTsKLQotLyoqCi0gKiByeHJwY19rZXJuZWxfYWJvcnRfY2FsbCAtIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gYWJvcnQgYSBjYWxsCi0gKiBAY2FsbDogVGhlIGNhbGwgdG8gYmUgYWJvcnRlZAotICogQGFib3J0X2NvZGU6IFRoZSBhYm9ydCBjb2RlIHRvIHN0aWNrIGludG8gdGhlIEFCT1JUIHBhY2tldAotICoKLSAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gYWJvcnQgYSBjYWxsLCBpZiBpdCdzIHN0aWxsIGluIGFuIGFib3J0YWJsZSBzdGF0ZS4KLSAqLwotdm9pZCByeHJwY19rZXJuZWxfYWJvcnRfY2FsbChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgdTMyIGFib3J0X2NvZGUpCi17Ci0JX2VudGVyKCJ7JWR9LCVkIiwgY2FsbC0+ZGVidWdfaWQsIGFib3J0X2NvZGUpOwotCi0JbG9ja19zb2NrKCZjYWxsLT5zb2NrZXQtPnNrKTsKLQotCV9kZWJ1ZygiQ0FMTCAlZCBVU1IgJWx4IFNUICVkIG9uIENPTk4gJXAiLAotCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgY2FsbC0+dXNlcl9jYWxsX0lELCBjYWxsLT5zdGF0ZSwgY2FsbC0+Y29ubik7Ci0KLQlpZiAoY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX0NPTVBMRVRFKQotCQlyeHJwY19zZW5kX2Fib3J0KGNhbGwsIGFib3J0X2NvZGUpOwotCi0JcmVsZWFzZV9zb2NrKCZjYWxsLT5zb2NrZXQtPnNrKTsKLQlfbGVhdmUoIiIpOwotfQotCi1FWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9hYm9ydF9jYWxsKTsKLQogLyoKICAqIHNlbmQgYSBwYWNrZXQgdGhyb3VnaCB0aGUgdHJhbnNwb3J0IGVuZHBvaW50CiAgKi8KLWludCByeHJwY19zZW5kX2RhdGFfcGFja2V0KHN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IHJ4cnBjX3NlbmRfZGF0YV9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICBib29sIHJldHJhbnMpCiB7Ci0Jc3RydWN0IGt2ZWMgaW92WzFdOworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uID0gY2FsbC0+Y29ubjsKKwlzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIgd2hkcjsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CiAJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92WzJdOworCXJ4cnBjX3NlcmlhbF90IHNlcmlhbDsKKwlzaXplX3QgbGVuOworCWJvb2wgbG9zdCA9IGZhbHNlOwogCWludCByZXQsIG9wdDsKIAogCV9lbnRlcigiLHslZH0iLCBza2ItPmxlbik7CiAKLQlpb3ZbMF0uaW92X2Jhc2UgPSBza2ItPmhlYWQ7Ci0JaW92WzBdLmlvdl9sZW4gPSBza2ItPmxlbjsKKwkvKiBFYWNoIHRyYW5zbWlzc2lvbiBvZiBhIFR4IHBhY2tldCBuZWVkcyBhIG5ldyBzZXJpYWwgbnVtYmVyICovCisJc2VyaWFsID0gYXRvbWljX2luY19yZXR1cm4oJmNvbm4tPnNlcmlhbCk7CiAKLQltc2cubXNnX25hbWUgPSAmY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQ7Ci0JbXNnLm1zZ19uYW1lbGVuID0gY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnRfbGVuOworCXdoZHIuZXBvY2gJPSBodG9ubChjb25uLT5wcm90by5lcG9jaCk7CisJd2hkci5jaWQJPSBodG9ubChjYWxsLT5jaWQpOworCXdoZHIuY2FsbE51bWJlcgk9IGh0b25sKGNhbGwtPmNhbGxfaWQpOworCXdoZHIuc2VxCT0gaHRvbmwoc3AtPmhkci5zZXEpOworCXdoZHIuc2VyaWFsCT0gaHRvbmwoc2VyaWFsKTsKKwl3aGRyLnR5cGUJPSBSWFJQQ19QQUNLRVRfVFlQRV9EQVRBOworCXdoZHIuZmxhZ3MJPSBzcC0+aGRyLmZsYWdzOworCXdoZHIudXNlclN0YXR1cwk9IDA7CisJd2hkci5zZWN1cml0eUluZGV4ID0gY2FsbC0+c2VjdXJpdHlfaXg7CisJd2hkci5fcnN2ZAk9IGh0b25zKHNwLT5oZHIuX3JzdmQpOworCXdoZHIuc2VydmljZUlkCT0gaHRvbnMoY2FsbC0+c2VydmljZV9pZCk7CisKKwlpb3ZbMF0uaW92X2Jhc2UgPSAmd2hkcjsKKwlpb3ZbMF0uaW92X2xlbiA9IHNpemVvZih3aGRyKTsKKwlpb3ZbMV0uaW92X2Jhc2UgPSBza2ItPmhlYWQ7CisJaW92WzFdLmlvdl9sZW4gPSBza2ItPmxlbjsKKwlsZW4gPSBpb3ZbMF0uaW92X2xlbiArIGlvdlsxXS5pb3ZfbGVuOworCisJbXNnLm1zZ19uYW1lID0gJmNhbGwtPnBlZXItPnNyeC50cmFuc3BvcnQ7CisJbXNnLm1zZ19uYW1lbGVuID0gY2FsbC0+cGVlci0+c3J4LnRyYW5zcG9ydF9sZW47CiAJbXNnLm1zZ19jb250cm9sID0gTlVMTDsKIAltc2cubXNnX2NvbnRyb2xsZW4gPSAwOwogCW1zZy5tc2dfZmxhZ3MgPSAwOwogCisJLyogSWYgb3VyIFJUVCBjYWNoZSBuZWVkcyB3b3JraW5nIG9uLCByZXF1ZXN0IGFuIEFDSy4gIEFsc28gcmVxdWVzdAorCSAqIEFDS3MgaWYgYSBEQVRBIHBhY2tldCBhcHBlYXJzIHRvIGhhdmUgYmVlbiBsb3N0LgorCSAqLworCWlmIChyZXRyYW5zIHx8CisJICAgIGNhbGwtPmNvbmdfbW9kZSA9PSBSWFJQQ19DQUxMX1NMT1dfU1RBUlQgfHwKKwkgICAgKGNhbGwtPnBlZXItPnJ0dF91c2FnZSA8IDMgJiYgc3AtPmhkci5zZXEgJiAxKSB8fAorCSAgICBrdGltZV9iZWZvcmUoa3RpbWVfYWRkX21zKGNhbGwtPnBlZXItPnJ0dF9sYXN0X3JlcSwgMTAwMCksCisJCQkga3RpbWVfZ2V0X3JlYWwoKSkpCisJCXdoZHIuZmxhZ3MgfD0gUlhSUENfUkVRVUVTVF9BQ0s7CisKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfQUZfUlhSUENfSU5KRUNUX0xPU1MpKSB7CisJCXN0YXRpYyBpbnQgbG9zZTsKKwkJaWYgKChsb3NlKysgJiA3KSA9PSA3KSB7CisJCQlyZXQgPSAwOworCQkJbG9zdCA9IHRydWU7CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisKKwlfcHJvdG8oIlR4IERBVEEgJSUldSB7ICMldSB9Iiwgc2VyaWFsLCBzcC0+aGRyLnNlcSk7CisKIAkvKiBzZW5kIHRoZSBwYWNrZXQgd2l0aCB0aGUgZG9uJ3QgZnJhZ21lbnQgYml0IHNldCBpZiB3ZSBjdXJyZW50bHkKIAkgKiB0aGluayBpdCdzIHNtYWxsIGVub3VnaCAqLwotCWlmIChza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpIDwgY29ubi0+cGFyYW1zLnBlZXItPm1heGRhdGEpIHsKLQkJZG93bl9yZWFkKCZjb25uLT5wYXJhbXMubG9jYWwtPmRlZnJhZ19zZW0pOwotCQkvKiBzZW5kIHRoZSBwYWNrZXQgYnkgVURQCi0JCSAqIC0gcmV0dXJucyAtRU1TR1NJWkUgaWYgVURQIHdvdWxkIGhhdmUgdG8gZnJhZ21lbnQgdGhlIHBhY2tldAotCQkgKiAgIHRvIGdvIG91dCBvZiB0aGUgaW50ZXJmYWNlCi0JCSAqICAgLSBpbiB3aGljaCBjYXNlLCB3ZSdsbCBoYXZlIHByb2Nlc3NlZCB0aGUgSUNNUCBlcnJvcgotCQkgKiAgICAgbWVzc2FnZSBhbmQgdXBkYXRlIHRoZSBwZWVyIHJlY29yZAotCQkgKi8KLQkJcmV0ID0ga2VybmVsX3NlbmRtc2coY29ubi0+cGFyYW1zLmxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMSwKLQkJCQkgICAgIGlvdlswXS5pb3ZfbGVuKTsKKwlpZiAoaW92WzFdLmlvdl9sZW4gPj0gY2FsbC0+cGVlci0+bWF4ZGF0YSkKKwkJZ290byBzZW5kX2ZyYWdtZW50YWJsZTsKIAotCQl1cF9yZWFkKCZjb25uLT5wYXJhbXMubG9jYWwtPmRlZnJhZ19zZW0pOwotCQlpZiAocmV0ID09IC1FTVNHU0laRSkKLQkJCWdvdG8gc2VuZF9mcmFnbWVudGFibGU7CisJZG93bl9yZWFkKCZjb25uLT5wYXJhbXMubG9jYWwtPmRlZnJhZ19zZW0pOworCS8qIHNlbmQgdGhlIHBhY2tldCBieSBVRFAKKwkgKiAtIHJldHVybnMgLUVNU0dTSVpFIGlmIFVEUCB3b3VsZCBoYXZlIHRvIGZyYWdtZW50IHRoZSBwYWNrZXQKKwkgKiAgIHRvIGdvIG91dCBvZiB0aGUgaW50ZXJmYWNlCisJICogICAtIGluIHdoaWNoIGNhc2UsIHdlJ2xsIGhhdmUgcHJvY2Vzc2VkIHRoZSBJQ01QIGVycm9yCisJICogICAgIG1lc3NhZ2UgYW5kIHVwZGF0ZSB0aGUgcGVlciByZWNvcmQKKwkgKi8KKwlyZXQgPSBrZXJuZWxfc2VuZG1zZyhjb25uLT5wYXJhbXMubG9jYWwtPnNvY2tldCwgJm1zZywgaW92LCAyLCBsZW4pOwogCi0JCV9sZWF2ZSgiID0gJWQgWyV1XSIsIHJldCwgY29ubi0+cGFyYW1zLnBlZXItPm1heGRhdGEpOwotCQlyZXR1cm4gcmV0OworCXVwX3JlYWQoJmNvbm4tPnBhcmFtcy5sb2NhbC0+ZGVmcmFnX3NlbSk7CisJaWYgKHJldCA9PSAtRU1TR1NJWkUpCisJCWdvdG8gc2VuZF9mcmFnbWVudGFibGU7CisKK2RvbmU6CisJdHJhY2VfcnhycGNfdHhfZGF0YShjYWxsLCBzcC0+aGRyLnNlcSwgc2VyaWFsLCB3aGRyLmZsYWdzLAorCQkJICAgIHJldHJhbnMsIGxvc3QpOworCWlmIChyZXQgPj0gMCkgeworCQlrdGltZV90IG5vdyA9IGt0aW1lX2dldF9yZWFsKCk7CisJCXNrYi0+dHN0YW1wID0gbm93OworCQlzbXBfd21iKCk7CisJCXNwLT5oZHIuc2VyaWFsID0gc2VyaWFsOworCQlpZiAod2hkci5mbGFncyAmIFJYUlBDX1JFUVVFU1RfQUNLKSB7CisJCQljYWxsLT5wZWVyLT5ydHRfbGFzdF9yZXEgPSBub3c7CisJCQl0cmFjZV9yeHJwY19ydHRfdHgoY2FsbCwgcnhycGNfcnR0X3R4X2RhdGEsIHNlcmlhbCk7CisJCX0KIAl9CisJX2xlYXZlKCIgPSAlZCBbJXVdIiwgcmV0LCBjYWxsLT5wZWVyLT5tYXhkYXRhKTsKKwlyZXR1cm4gcmV0OwogCiBzZW5kX2ZyYWdtZW50YWJsZToKIAkvKiBhdHRlbXB0IHRvIHNlbmQgdGhpcyBtZXNzYWdlIHdpdGggZnJhZ21lbnRhdGlvbiBlbmFibGVkICovCkBAIC0zNTgsOCArMzQ4LDggQEAKIAkJCQkJU09MX0lQLCBJUF9NVFVfRElTQ09WRVIsCiAJCQkJCShjaGFyICopJm9wdCwgc2l6ZW9mKG9wdCkpOwogCQlpZiAocmV0ID09IDApIHsKLQkJCXJldCA9IGtlcm5lbF9zZW5kbXNnKGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LCAmbXNnLCBpb3YsIDEsCi0JCQkJCSAgICAgaW92WzBdLmlvdl9sZW4pOworCQkJcmV0ID0ga2VybmVsX3NlbmRtc2coY29ubi0+cGFyYW1zLmxvY2FsLT5zb2NrZXQsICZtc2csCisJCQkJCSAgICAgaW92LCAyLCBsZW4pOwogCiAJCQlvcHQgPSBJUF9QTVRVRElTQ19ETzsKIAkJCWtlcm5lbF9zZXRzb2Nrb3B0KGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LCBTT0xfSVAsCkBAIC0zNjcsMzU1ICszNTcsODIgQEAKIAkJCQkJICAoY2hhciAqKSZvcHQsIHNpemVvZihvcHQpKTsKIAkJfQogCQlicmVhazsKKworI2lmZGVmIENPTkZJR19BRl9SWFJQQ19JUFY2CisJY2FzZSBBRl9JTkVUNjoKKwkJb3B0ID0gSVBWNl9QTVRVRElTQ19ET05UOworCQlyZXQgPSBrZXJuZWxfc2V0c29ja29wdChjb25uLT5wYXJhbXMubG9jYWwtPnNvY2tldCwKKwkJCQkJU09MX0lQVjYsIElQVjZfTVRVX0RJU0NPVkVSLAorCQkJCQkoY2hhciAqKSZvcHQsIHNpemVvZihvcHQpKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlyZXQgPSBrZXJuZWxfc2VuZG1zZyhjb25uLT5wYXJhbXMubG9jYWwtPnNvY2tldCwgJm1zZywKKwkJCQkJICAgICBpb3YsIDEsIGlvdlswXS5pb3ZfbGVuKTsKKworCQkJb3B0ID0gSVBWNl9QTVRVRElTQ19ETzsKKwkJCWtlcm5lbF9zZXRzb2Nrb3B0KGNvbm4tPnBhcmFtcy5sb2NhbC0+c29ja2V0LAorCQkJCQkgIFNPTF9JUFY2LCBJUFY2X01UVV9ESVNDT1ZFUiwKKwkJCQkJICAoY2hhciAqKSZvcHQsIHNpemVvZihvcHQpKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgogCX0KIAogCXVwX3dyaXRlKCZjb25uLT5wYXJhbXMubG9jYWwtPmRlZnJhZ19zZW0pOwotCV9sZWF2ZSgiID0gJWQgW2ZyYWcgJXVdIiwgcmV0LCBjb25uLT5wYXJhbXMucGVlci0+bWF4ZGF0YSk7Ci0JcmV0dXJuIHJldDsKKwlnb3RvIGRvbmU7CiB9CiAKIC8qCi0gKiB3YWl0IGZvciBzcGFjZSB0byBhcHBlYXIgaW4gdGhlIHRyYW5zbWl0L0FDSyB3aW5kb3cKLSAqIC0gY2FsbGVyIGhvbGRzIHRoZSBzb2NrZXQgbG9ja2VkCisgKiByZWplY3QgcGFja2V0cyB0aHJvdWdoIHRoZSBsb2NhbCBlbmRwb2ludAogICovCi1zdGF0aWMgaW50IHJ4cnBjX3dhaXRfZm9yX3R4X3dpbmRvdyhzdHJ1Y3QgcnhycGNfc29jayAqcngsCi0JCQkJICAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgICBsb25nICp0aW1lbykKK3ZvaWQgcnhycGNfcmVqZWN0X3BhY2tldHMoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCkKIHsKLQlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOwotCWludCByZXQ7CisJc3RydWN0IHNvY2thZGRyX3J4cnBjIHNyeDsKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCByeHJwY193aXJlX2hlYWRlciB3aGRyOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92WzJdOworCXNpemVfdCBzaXplOworCV9fYmUzMiBjb2RlOwogCi0JX2VudGVyKCIseyVkfSwlbGQiLAotCSAgICAgICBDSVJDX1NQQUNFKGNhbGwtPmFja3NfaGVhZCwgQUNDRVNTX09OQ0UoY2FsbC0+YWNrc190YWlsKSwKLQkJCSAgY2FsbC0+YWNrc193aW5zeiksCi0JICAgICAgICp0aW1lbyk7CisJX2VudGVyKCIlZCIsIGxvY2FsLT5kZWJ1Z19pZCk7CiAKLQlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+dHhfd2FpdHEsICZteXNlbGYpOworCWlvdlswXS5pb3ZfYmFzZSA9ICZ3aGRyOworCWlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHdoZHIpOworCWlvdlsxXS5pb3ZfYmFzZSA9ICZjb2RlOworCWlvdlsxXS5pb3ZfbGVuID0gc2l6ZW9mKGNvZGUpOworCXNpemUgPSBzaXplb2Yod2hkcikgKyBzaXplb2YoY29kZSk7CiAKLQlmb3IgKDs7KSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXJldCA9IDA7Ci0JCWlmIChDSVJDX1NQQUNFKGNhbGwtPmFja3NfaGVhZCwgQUNDRVNTX09OQ0UoY2FsbC0+YWNrc190YWlsKSwKLQkJCSAgICAgICBjYWxsLT5hY2tzX3dpbnN6KSA+IDApCi0JCQlicmVhazsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQlyZXQgPSBzb2NrX2ludHJfZXJybm8oKnRpbWVvKTsKLQkJCWJyZWFrOworCW1zZy5tc2dfbmFtZSA9ICZzcngudHJhbnNwb3J0OworCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwltc2cubXNnX2ZsYWdzID0gMDsKKworCW1lbXNldCgmd2hkciwgMCwgc2l6ZW9mKHdoZHIpKTsKKwl3aGRyLnR5cGUgPSBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVDsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmxvY2FsLT5yZWplY3RfcXVldWUpKSkgeworCQlyeHJwY19zZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X3NlZW4pOworCQlzcCA9IHJ4cnBjX3NrYihza2IpOworCisJCWlmIChyeHJwY19leHRyYWN0X2FkZHJfZnJvbV9za2IoJnNyeCwgc2tiKSA9PSAwKSB7CisJCQltc2cubXNnX25hbWVsZW4gPSBzcngudHJhbnNwb3J0X2xlbjsKKworCQkJY29kZSA9IGh0b25sKHNrYi0+cHJpb3JpdHkpOworCisJCQl3aGRyLmVwb2NoCT0gaHRvbmwoc3AtPmhkci5lcG9jaCk7CisJCQl3aGRyLmNpZAk9IGh0b25sKHNwLT5oZHIuY2lkKTsKKwkJCXdoZHIuY2FsbE51bWJlcgk9IGh0b25sKHNwLT5oZHIuY2FsbE51bWJlcik7CisJCQl3aGRyLnNlcnZpY2VJZAk9IGh0b25zKHNwLT5oZHIuc2VydmljZUlkKTsKKwkJCXdoZHIuZmxhZ3MJPSBzcC0+aGRyLmZsYWdzOworCQkJd2hkci5mbGFncwlePSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOworCQkJd2hkci5mbGFncwkmPSBSWFJQQ19DTElFTlRfSU5JVElBVEVEOworCisJCQlrZXJuZWxfc2VuZG1zZyhsb2NhbC0+c29ja2V0LCAmbXNnLCBpb3YsIDIsIHNpemUpOwogCQl9CiAKLQkJcmVsZWFzZV9zb2NrKCZyeC0+c2spOwotCQkqdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KCp0aW1lbyk7Ci0JCWxvY2tfc29jaygmcngtPnNrKTsKLQl9Ci0KLQlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+dHhfd2FpdHEsICZteXNlbGYpOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIGF0dGVtcHQgdG8gc2NoZWR1bGUgYW4gaW5zdGFudCBUeCByZXNlbmQKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX2luc3RhbnRfcmVzZW5kKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQotewotCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JaWYgKHRyeV90b19kZWxfdGltZXJfc3luYygmY2FsbC0+cmVzZW5kX3RpbWVyKSA+PSAwKSB7Ci0JCWNsZWFyX2JpdChSWFJQQ19DQUxMX1JVTl9SVElNRVIsICZjYWxsLT5mbGFncyk7Ci0JCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUgJiYKLQkJICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVTRU5EX1RJTUVSLCAmY2FsbC0+ZXZlbnRzKSkKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JfQotCXJlYWRfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLX0KLQotLyoKLSAqIHF1ZXVlIGEgcGFja2V0IGZvciB0cmFuc21pc3Npb24sIHNldCB0aGUgcmVzZW5kIHRpbWVyIGFuZCBhdHRlbXB0Ci0gKiB0byBzZW5kIHRoZSBwYWNrZXQgaW1tZWRpYXRlbHkKLSAqLwotc3RhdGljIHZvaWQgcnhycGNfcXVldWVfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIGJvb2wgbGFzdCkKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7Ci0JaW50IHJldDsKLQotCV9uZXQoInF1ZXVlIHNrYiAlcCBbJWRdIiwgc2tiLCBjYWxsLT5hY2tzX2hlYWQpOwotCi0JQVNTRVJUKGNhbGwtPmFja3Nfd2luZG93ICE9IE5VTEwpOwotCWNhbGwtPmFja3Nfd2luZG93W2NhbGwtPmFja3NfaGVhZF0gPSAodW5zaWduZWQgbG9uZykgc2tiOwotCXNtcF93bWIoKTsKLQljYWxsLT5hY2tzX2hlYWQgPSAoY2FsbC0+YWNrc19oZWFkICsgMSkgJiAoY2FsbC0+YWNrc193aW5zeiAtIDEpOwotCi0JaWYgKGxhc3QgfHwgY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1QpIHsKLQkJX2RlYnVnKCJfX19fX19fX2F3YWl0aW5nIHJlcGx5L0FDS19fX19fX19fX18iKTsKLQkJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKLQkJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1Q6Ci0JCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfQ0xJRU5UX0FXQUlUX1JFUExZOwotCQkJYnJlYWs7Ci0JCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q6Ci0JCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFk7Ci0JCQlpZiAoIWxhc3QpCi0JCQkJYnJlYWs7Ci0JCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWToKLQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQVdBSVRfQUNLOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQl3cml0ZV91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOwotCX0KLQotCV9wcm90bygiVHggREFUQSAlJSV1IHsgIyV1IH0iLCBzcC0+aGRyLnNlcmlhbCwgc3AtPmhkci5zZXEpOwotCi0Jc3AtPm5lZWRfcmVzZW5kID0gZmFsc2U7Ci0Jc3AtPnJlc2VuZF9hdCA9IGppZmZpZXMgKyByeHJwY19yZXNlbmRfdGltZW91dDsKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpKSB7Ci0JCV9kZWJ1ZygicnVuIHRpbWVyIik7Ci0JCWNhbGwtPnJlc2VuZF90aW1lci5leHBpcmVzID0gc3AtPnJlc2VuZF9hdDsKLQkJYWRkX3RpbWVyKCZjYWxsLT5yZXNlbmRfdGltZXIpOwotCX0KLQotCS8qIGF0dGVtcHQgdG8gY2FuY2VsIHRoZSByeC1BQ0sgdGltZXIsIGRlZmVycmluZyByZXBseSB0cmFuc21pc3Npb24gaWYKLQkgKiB3ZSdyZSBBQ0snaW5nIHRoZSByZXF1ZXN0IHBoYXNlIG9mIGFuIGluY29taW5nIGNhbGwgKi8KLQlyZXQgPSAtRUFHQUlOOwotCWlmICh0cnlfdG9fZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcikgPj0gMCkgewotCQkvKiB0aGUgcGFja2V0IG1heSBiZSBmcmVlZCBieSByeHJwY19wcm9jZXNzX2NhbGwoKSBiZWZvcmUgdGhpcwotCQkgKiByZXR1cm5zICovCi0JCXJldCA9IHJ4cnBjX3NlbmRfZGF0YV9wYWNrZXQoY2FsbC0+Y29ubiwgc2tiKTsKLQkJX25ldCgic2VudCBza2IgJXAiLCBza2IpOwotCX0gZWxzZSB7Ci0JCV9kZWJ1ZygiZmFpbGVkIHRvIGRlbGV0ZSBBQ0sgdGltZXIiKTsKLQl9Ci0KLQlpZiAocmV0IDwgMCkgewotCQlfZGVidWcoIm5lZWQgaW5zdGFudCByZXNlbmQgJWQiLCByZXQpOwotCQlzcC0+bmVlZF9yZXNlbmQgPSB0cnVlOwotCQlyeHJwY19pbnN0YW50X3Jlc2VuZChjYWxsKTsKKwkJcnhycGNfZnJlZV9za2Ioc2tiLCByeHJwY19za2JfcnhfZnJlZWQpOwogCX0KIAogCV9sZWF2ZSgiIik7CiB9Ci0KLS8qCi0gKiBDb252ZXJ0IGEgaG9zdC1lbmRpYW4gaGVhZGVyIGludG8gYSBuZXR3b3JrLWVuZGlhbiBoZWFkZXIuCi0gKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2luc2VydF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIgd2hkcjsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7Ci0KLQl3aGRyLmVwb2NoCT0gaHRvbmwoc3AtPmhkci5lcG9jaCk7Ci0Jd2hkci5jaWQJPSBodG9ubChzcC0+aGRyLmNpZCk7Ci0Jd2hkci5jYWxsTnVtYmVyCT0gaHRvbmwoc3AtPmhkci5jYWxsTnVtYmVyKTsKLQl3aGRyLnNlcQk9IGh0b25sKHNwLT5oZHIuc2VxKTsKLQl3aGRyLnNlcmlhbAk9IGh0b25sKHNwLT5oZHIuc2VyaWFsKTsKLQl3aGRyLnR5cGUJPSBzcC0+aGRyLnR5cGU7Ci0Jd2hkci5mbGFncwk9IHNwLT5oZHIuZmxhZ3M7Ci0Jd2hkci51c2VyU3RhdHVzCT0gc3AtPmhkci51c2VyU3RhdHVzOwotCXdoZHIuc2VjdXJpdHlJbmRleCA9IHNwLT5oZHIuc2VjdXJpdHlJbmRleDsKLQl3aGRyLl9yc3ZkCT0gaHRvbnMoc3AtPmhkci5fcnN2ZCk7Ci0Jd2hkci5zZXJ2aWNlSWQJPSBodG9ucyhzcC0+aGRyLnNlcnZpY2VJZCk7Ci0KLQltZW1jcHkoc2tiLT5oZWFkLCAmd2hkciwgc2l6ZW9mKHdoZHIpKTsKLX0KLQotLyoKLSAqIHNlbmQgZGF0YSB0aHJvdWdoIGEgc29ja2V0Ci0gKiAtIG11c3QgYmUgY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dAotICogLSBjYWxsZXIgaG9sZHMgdGhlIHNvY2tldCBsb2NrZWQKLSAqLwotc3RhdGljIGludCByeHJwY19zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAotCQkJICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBzb2NrICpzayA9ICZyeC0+c2s7Ci0JbG9uZyB0aW1lbzsKLQlib29sIG1vcmU7Ci0JaW50IHJldCwgY29waWVkOwotCi0JdGltZW8gPSBzb2NrX3NuZHRpbWVvKHNrLCBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCk7Ci0KLQkvKiB0aGlzIHNob3VsZCBiZSBpbiBwb2xsICovCi0Jc2tfY2xlYXJfYml0KFNPQ0tXUV9BU1lOQ19OT1NQQUNFLCBzayk7Ci0KLQlpZiAoc2stPnNrX2VyciB8fCAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikpCi0JCXJldHVybiAtRVBJUEU7Ci0KLQltb3JlID0gbXNnLT5tc2dfZmxhZ3MgJiBNU0dfTU9SRTsKLQotCXNrYiA9IGNhbGwtPnR4X3BlbmRpbmc7Ci0JY2FsbC0+dHhfcGVuZGluZyA9IE5VTEw7Ci0KLQljb3BpZWQgPSAwOwotCWRvIHsKLQkJaWYgKCFza2IpIHsKLQkJCXNpemVfdCBzaXplLCBjaHVuaywgbWF4LCBzcGFjZTsKLQotCQkJX2RlYnVnKCJhbGxvYyIpOwotCi0JCQlpZiAoQ0lSQ19TUEFDRShjYWxsLT5hY2tzX2hlYWQsCi0JCQkJICAgICAgIEFDQ0VTU19PTkNFKGNhbGwtPmFja3NfdGFpbCksCi0JCQkJICAgICAgIGNhbGwtPmFja3Nfd2luc3opIDw9IDApIHsKLQkJCQlyZXQgPSAtRUFHQUlOOwotCQkJCWlmIChtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCkKLQkJCQkJZ290byBtYXliZV9lcnJvcjsKLQkJCQlyZXQgPSByeHJwY193YWl0X2Zvcl90eF93aW5kb3cocngsIGNhbGwsCi0JCQkJCQkJICAgICAgICZ0aW1lbyk7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWdvdG8gbWF5YmVfZXJyb3I7Ci0JCQl9Ci0KLQkJCW1heCA9IGNhbGwtPmNvbm4tPnBhcmFtcy5wZWVyLT5tYXhkYXRhOwotCQkJbWF4IC09IGNhbGwtPmNvbm4tPnNlY3VyaXR5X3NpemU7Ci0JCQltYXggJj0gfihjYWxsLT5jb25uLT5zaXplX2FsaWduIC0gMVVMKTsKLQotCQkJY2h1bmsgPSBtYXg7Ci0JCQlpZiAoY2h1bmsgPiBtc2dfZGF0YV9sZWZ0KG1zZykgJiYgIW1vcmUpCi0JCQkJY2h1bmsgPSBtc2dfZGF0YV9sZWZ0KG1zZyk7Ci0KLQkJCXNwYWNlID0gY2h1bmsgKyBjYWxsLT5jb25uLT5zaXplX2FsaWduOwotCQkJc3BhY2UgJj0gfihjYWxsLT5jb25uLT5zaXplX2FsaWduIC0gMVVMKTsKLQotCQkJc2l6ZSA9IHNwYWNlICsgY2FsbC0+Y29ubi0+aGVhZGVyX3NpemU7Ci0KLQkJCV9kZWJ1ZygiU0laRTogJXp1LyV6dS8lenUiLCBjaHVuaywgc3BhY2UsIHNpemUpOwotCi0JCQkvKiBjcmVhdGUgYSBidWZmZXIgdGhhdCB3ZSBjYW4gcmV0YWluIHVudGlsIGl0J3MgQUNLJ2QgKi8KLQkJCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2IoCi0JCQkJc2ssIHNpemUsIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULCAmcmV0KTsKLQkJCWlmICghc2tiKQotCQkJCWdvdG8gbWF5YmVfZXJyb3I7Ci0KLQkJCXJ4cnBjX25ld19za2Ioc2tiKTsKLQotCQkJX2RlYnVnKCJBTExPQyBTRU5EICVwIiwgc2tiKTsKLQotCQkJQVNTRVJUQ01QKHNrYi0+bWFyaywgPT0sIDApOwotCi0JCQlfZGVidWcoIkhTOiAldSIsIGNhbGwtPmNvbm4tPmhlYWRlcl9zaXplKTsKLQkJCXNrYl9yZXNlcnZlKHNrYiwgY2FsbC0+Y29ubi0+aGVhZGVyX3NpemUpOwotCQkJc2tiLT5sZW4gKz0gY2FsbC0+Y29ubi0+aGVhZGVyX3NpemU7Ci0KLQkJCXNwID0gcnhycGNfc2tiKHNrYik7Ci0JCQlzcC0+cmVtYWluID0gY2h1bms7Ci0JCQlpZiAoc3AtPnJlbWFpbiA+IHNrYl90YWlscm9vbShza2IpKQotCQkJCXNwLT5yZW1haW4gPSBza2JfdGFpbHJvb20oc2tiKTsKLQotCQkJX25ldCgic2tiOiBociAlZCwgdHIgJWQsIGhsICVkLCBybSAlZCIsCi0JCQkgICAgICAgc2tiX2hlYWRyb29tKHNrYiksCi0JCQkgICAgICAgc2tiX3RhaWxyb29tKHNrYiksCi0JCQkgICAgICAgc2tiX2hlYWRsZW4oc2tiKSwKLQkJCSAgICAgICBzcC0+cmVtYWluKTsKLQotCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLQkJfQotCi0JCV9kZWJ1ZygiYXBwZW5kIik7Ci0JCXNwID0gcnhycGNfc2tiKHNrYik7Ci0KLQkJLyogYXBwZW5kIG5leHQgc2VnbWVudCBvZiBkYXRhIHRvIHRoZSBjdXJyZW50IGJ1ZmZlciAqLwotCQlpZiAobXNnX2RhdGFfbGVmdChtc2cpID4gMCkgewotCQkJaW50IGNvcHkgPSBza2JfdGFpbHJvb20oc2tiKTsKLQkJCUFTU0VSVENNUChjb3B5LCA+LCAwKTsKLQkJCWlmIChjb3B5ID4gbXNnX2RhdGFfbGVmdChtc2cpKQotCQkJCWNvcHkgPSBtc2dfZGF0YV9sZWZ0KG1zZyk7Ci0JCQlpZiAoY29weSA+IHNwLT5yZW1haW4pCi0JCQkJY29weSA9IHNwLT5yZW1haW47Ci0KLQkJCV9kZWJ1ZygiYWRkIik7Ci0JCQlyZXQgPSBza2JfYWRkX2RhdGEoc2tiLCAmbXNnLT5tc2dfaXRlciwgY29weSk7Ci0JCQlfZGVidWcoImFkZGVkIik7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIGVmYXVsdDsKLQkJCXNwLT5yZW1haW4gLT0gY29weTsKLQkJCXNrYi0+bWFyayArPSBjb3B5OwotCQkJY29waWVkICs9IGNvcHk7Ci0JCX0KLQotCQkvKiBjaGVjayBmb3IgdGhlIGZhciBzaWRlIGFib3J0aW5nIHRoZSBjYWxsIG9yIGEgbmV0d29yayBlcnJvcgotCQkgKiBvY2N1cnJpbmcgKi8KLQkJaWYgKGNhbGwtPnN0YXRlID4gUlhSUENfQ0FMTF9DT01QTEVURSkKLQkJCWdvdG8gY2FsbF9hYm9ydGVkOwotCi0JCS8qIGFkZCB0aGUgcGFja2V0IHRvIHRoZSBzZW5kIHF1ZXVlIGlmIGl0J3Mgbm93IGZ1bGwgKi8KLQkJaWYgKHNwLT5yZW1haW4gPD0gMCB8fAotCQkgICAgKG1zZ19kYXRhX2xlZnQobXNnKSA9PSAwICYmICFtb3JlKSkgewotCQkJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOwotCQkJdWludDMyX3Qgc2VxOwotCQkJc2l6ZV90IHBhZDsKLQotCQkJLyogcGFkIG91dCBpZiB3ZSdyZSB1c2luZyBzZWN1cml0eSAqLwotCQkJaWYgKGNvbm4tPnNlY3VyaXR5X2l4KSB7Ci0JCQkJcGFkID0gY29ubi0+c2VjdXJpdHlfc2l6ZSArIHNrYi0+bWFyazsKLQkJCQlwYWQgPSBjb25uLT5zaXplX2FsaWduIC0gcGFkOwotCQkJCXBhZCAmPSBjb25uLT5zaXplX2FsaWduIC0gMTsKLQkJCQlfZGVidWcoInBhZCAlenUiLCBwYWQpOwotCQkJCWlmIChwYWQpCi0JCQkJCW1lbXNldChza2JfcHV0KHNrYiwgcGFkKSwgMCwgcGFkKTsKLQkJCX0KLQotCQkJc2VxID0gYXRvbWljX2luY19yZXR1cm4oJmNhbGwtPnNlcXVlbmNlKTsKLQotCQkJc3AtPmhkci5lcG9jaAk9IGNvbm4tPnByb3RvLmVwb2NoOwotCQkJc3AtPmhkci5jaWQJPSBjYWxsLT5jaWQ7Ci0JCQlzcC0+aGRyLmNhbGxOdW1iZXIgPSBjYWxsLT5jYWxsX2lkOwotCQkJc3AtPmhkci5zZXEJPSBzZXE7Ci0JCQlzcC0+aGRyLnNlcmlhbAk9IGF0b21pY19pbmNfcmV0dXJuKCZjb25uLT5zZXJpYWwpOwotCQkJc3AtPmhkci50eXBlCT0gUlhSUENfUEFDS0VUX1RZUEVfREFUQTsKLQkJCXNwLT5oZHIudXNlclN0YXR1cyA9IDA7Ci0JCQlzcC0+aGRyLnNlY3VyaXR5SW5kZXggPSBjb25uLT5zZWN1cml0eV9peDsKLQkJCXNwLT5oZHIuX3JzdmQJPSAwOwotCQkJc3AtPmhkci5zZXJ2aWNlSWQgPSBjYWxsLT5zZXJ2aWNlX2lkOwotCi0JCQlzcC0+aGRyLmZsYWdzID0gY29ubi0+b3V0X2NsaWVudGZsYWc7Ci0JCQlpZiAobXNnX2RhdGFfbGVmdChtc2cpID09IDAgJiYgIW1vcmUpCi0JCQkJc3AtPmhkci5mbGFncyB8PSBSWFJQQ19MQVNUX1BBQ0tFVDsKLQkJCWVsc2UgaWYgKENJUkNfU1BBQ0UoY2FsbC0+YWNrc19oZWFkLAotCQkJCQkgICAgQUNDRVNTX09OQ0UoY2FsbC0+YWNrc190YWlsKSwKLQkJCQkJICAgIGNhbGwtPmFja3Nfd2luc3opID4gMSkKLQkJCQlzcC0+aGRyLmZsYWdzIHw9IFJYUlBDX01PUkVfUEFDS0VUUzsKLQkJCWlmIChtb3JlICYmIHNlcSAmIDEpCi0JCQkJc3AtPmhkci5mbGFncyB8PSBSWFJQQ19SRVFVRVNUX0FDSzsKLQotCQkJcmV0ID0gY29ubi0+c2VjdXJpdHktPnNlY3VyZV9wYWNrZXQoCi0JCQkJY2FsbCwgc2tiLCBza2ItPm1hcmssCi0JCQkJc2tiLT5oZWFkICsgc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlcikpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBvdXQ7Ci0KLQkJCXJ4cnBjX2luc2VydF9oZWFkZXIoc2tiKTsKLQkJCXJ4cnBjX3F1ZXVlX3BhY2tldChjYWxsLCBza2IsICFtc2dfZGF0YV9sZWZ0KG1zZykgJiYgIW1vcmUpOwotCQkJc2tiID0gTlVMTDsKLQkJfQotCX0gd2hpbGUgKG1zZ19kYXRhX2xlZnQobXNnKSA+IDApOwotCi1zdWNjZXNzOgotCXJldCA9IGNvcGllZDsKLW91dDoKLQljYWxsLT50eF9wZW5kaW5nID0gc2tiOwotCV9sZWF2ZSgiID0gJWQiLCByZXQpOwotCXJldHVybiByZXQ7Ci0KLWNhbGxfYWJvcnRlZDoKLQlyeHJwY19mcmVlX3NrYihza2IpOwotCWlmIChjYWxsLT5zdGF0ZSA9PSBSWFJQQ19DQUxMX05FVFdPUktfRVJST1IpCi0JCXJldCA9IGNhbGwtPmVycm9yX3JlcG9ydCA8IFJYUlBDX0xPQ0FMX0VSUk9SX09GRlNFVCA/Ci0JCQljYWxsLT5lcnJvcl9yZXBvcnQgOgotCQkJY2FsbC0+ZXJyb3JfcmVwb3J0IC0gUlhSUENfTE9DQUxfRVJST1JfT0ZGU0VUOwotCWVsc2UKLQkJcmV0ID0gLUVDT05OQUJPUlRFRDsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotCi1tYXliZV9lcnJvcjoKLQlpZiAoY29waWVkKQotCQlnb3RvIHN1Y2Nlc3M7Ci0JZ290byBvdXQ7Ci0KLWVmYXVsdDoKLQlyZXQgPSAtRUZBVUxUOwotCWdvdG8gb3V0OwotfQpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3BlZXJfZXZlbnQuYyBiL25ldC9yeHJwYy9wZWVyX2V2ZW50LmMKaW5kZXggODk0MDY3NC4uYmYxM2I4NCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3BlZXJfZXZlbnQuYworKysgYi9uZXQvcnhycGMvcGVlcl9ldmVudC5jCkBAIC02Niw2ICs2NiwzMiBAQAogCQl9CiAJCWJyZWFrOwogCisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwljYXNlIEFGX0lORVQ2OgorCQlzcngudHJhbnNwb3J0LnNpbjYuc2luNl9wb3J0ID0gc2Vyci0+cG9ydDsKKwkJc3J4LnRyYW5zcG9ydF9sZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCXN3aXRjaCAoc2Vyci0+ZWUuZWVfb3JpZ2luKSB7CisJCWNhc2UgU09fRUVfT1JJR0lOX0lDTVA2OgorCQkJX25ldCgiUnggSUNNUDYiKTsKKwkJCW1lbWNweSgmc3J4LnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkciwKKwkJCSAgICAgICBza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIHNlcnItPmFkZHJfb2Zmc2V0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPX0VFX09SSUdJTl9JQ01QOgorCQkJX25ldCgiUnggSUNNUCBvbiB2NiBzb2NrIik7CisJCQltZW1jcHkoc3J4LnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkci5zNl9hZGRyICsgMTIsCisJCQkgICAgICAgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyBzZXJyLT5hZGRyX29mZnNldCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbWVtY3B5KCZzcngudHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLAorCQkJICAgICAgICZpcHY2X2hkcihza2IpLT5zYWRkciwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCiAJZGVmYXVsdDoKIAkJQlVHKCk7CiAJfQpAQCAtMTI5LDIyICsxNTUsMjEgQEAKIAkJX2xlYXZlKCJVRFAgc29ja2V0IGVycnF1ZXVlIGVtcHR5Iik7CiAJCXJldHVybjsKIAl9CisJcnhycGNfbmV3X3NrYihza2IsIHJ4cnBjX3NrYl9yeF9yZWNlaXZlZCk7CiAJc2VyciA9IFNLQl9FWFRfRVJSKHNrYik7CiAJaWYgKCFza2ItPmxlbiAmJiBzZXJyLT5lZS5lZV9vcmlnaW4gPT0gU09fRUVfT1JJR0lOX1RJTUVTVEFNUElORykgewogCQlfbGVhdmUoIlVEUCBlbXB0eSBtZXNzYWdlIik7Ci0JCWtmcmVlX3NrYihza2IpOworCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9mcmVlZCk7CiAJCXJldHVybjsKIAl9CiAKLQlyeHJwY19uZXdfc2tiKHNrYik7Ci0KIAlyY3VfcmVhZF9sb2NrKCk7CiAJcGVlciA9IHJ4cnBjX2xvb2t1cF9wZWVyX2ljbXBfcmN1KGxvY2FsLCBza2IpOwogCWlmIChwZWVyICYmICFyeHJwY19nZXRfcGVlcl9tYXliZShwZWVyKSkKIAkJcGVlciA9IE5VTEw7CiAJaWYgKCFwZWVyKSB7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9mcmVlZCk7CiAJCV9sZWF2ZSgiIFtubyBwZWVyXSIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTU0LDcgKzE3OSw3IEBACiAJICAgICBzZXJyLT5lZS5lZV9jb2RlID09IElDTVBfRlJBR19ORUVERUQpKSB7CiAJCXJ4cnBjX2FkanVzdF9tdHUocGVlciwgc2Vycik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlyeHJwY19mcmVlX3NrYihza2IpOworCQlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9mcmVlZCk7CiAJCXJ4cnBjX3B1dF9wZWVyKHBlZXIpOwogCQlfbGVhdmUoIiBbTVRVIHVwZGF0ZV0iKTsKIAkJcmV0dXJuOwpAQCAtMTYyLDcgKzE4Nyw3IEBACiAKIAlyeHJwY19zdG9yZV9lcnJvcihwZWVyLCBzZXJyKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlyeHJwY19mcmVlX3NrYihza2IpOworCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKIAogCS8qIFRoZSByZWYgd2Ugb2J0YWluZWQgaXMgcGFzc2VkIG9mZiB0byB0aGUgd29yayBpdGVtICovCiAJcnhycGNfcXVldWVfd29yaygmcGVlci0+ZXJyb3JfZGlzdHJpYnV0b3IpOwpAQCAtMjQ4LDEzICsyNzMsMjAgQEAKIAlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnhycGNfcGVlciwgZXJyb3JfZGlzdHJpYnV0b3IpOwogCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOwotCWludCBlcnJvcl9yZXBvcnQ7CisJZW51bSByeHJwY19jYWxsX2NvbXBsZXRpb24gY29tcGw7CisJaW50IGVycm9yOwogCiAJX2VudGVyKCIiKTsKIAotCWVycm9yX3JlcG9ydCA9IFJFQURfT05DRShwZWVyLT5lcnJvcl9yZXBvcnQpOworCWVycm9yID0gUkVBRF9PTkNFKHBlZXItPmVycm9yX3JlcG9ydCk7CisJaWYgKGVycm9yIDwgUlhSUENfTE9DQUxfRVJST1JfT0ZGU0VUKSB7CisJCWNvbXBsID0gUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SOworCX0gZWxzZSB7CisJCWNvbXBsID0gUlhSUENfQ0FMTF9MT0NBTF9FUlJPUjsKKwkJZXJyb3IgLT0gUlhSUENfTE9DQUxfRVJST1JfT0ZGU0VUOworCX0KIAotCV9kZWJ1ZygiSVNTVUUgRVJST1IgJWQiLCBlcnJvcl9yZXBvcnQpOworCV9kZWJ1ZygiSVNTVUUgRVJST1IgJXMgJWQiLCByeHJwY19jYWxsX2NvbXBsZXRpb25zW2NvbXBsXSwgZXJyb3IpOwogCiAJc3Bpbl9sb2NrX2JoKCZwZWVyLT5sb2NrKTsKIApAQCAtMjYyLDE2ICsyOTQsMTAgQEAKIAkJY2FsbCA9IGhsaXN0X2VudHJ5KHBlZXItPmVycm9yX3RhcmdldHMuZmlyc3QsCiAJCQkJICAgc3RydWN0IHJ4cnBjX2NhbGwsIGVycm9yX2xpbmspOwogCQlobGlzdF9kZWxfaW5pdCgmY2FsbC0+ZXJyb3JfbGluayk7CisJCXJ4cnBjX3NlZV9jYWxsKGNhbGwpOwogCi0JCXdyaXRlX2xvY2soJmNhbGwtPnN0YXRlX2xvY2spOwotCQlpZiAoY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9DT01QTEVURSAmJgotCQkgICAgY2FsbC0+c3RhdGUgPCBSWFJQQ19DQUxMX05FVFdPUktfRVJST1IpIHsKLQkJCWNhbGwtPmVycm9yX3JlcG9ydCA9IGVycm9yX3JlcG9ydDsKLQkJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SOwotCQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JDVkRfRVJST1IsICZjYWxsLT5ldmVudHMpOwotCQkJcnhycGNfcXVldWVfY2FsbChjYWxsKTsKLQkJfQotCQl3cml0ZV91bmxvY2soJmNhbGwtPnN0YXRlX2xvY2spOworCQlpZiAocnhycGNfc2V0X2NhbGxfY29tcGxldGlvbihjYWxsLCBjb21wbCwgMCwgZXJyb3IpKQorCQkJcnhycGNfbm90aWZ5X3NvY2tldChjYWxsKTsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcGVlci0+bG9jayk7CkBAIC0yNzksMyArMzA1LDQ0IEBACiAJcnhycGNfcHV0X3BlZXIocGVlcik7CiAJX2xlYXZlKCIiKTsKIH0KKworLyoKKyAqIEFkZCBSVFQgaW5mb3JtYXRpb24gdG8gY2FjaGUuICBUaGlzIGlzIGNhbGxlZCBpbiBzb2Z0aXJxIG1vZGUgYW5kIGhhcworICogZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgcGVlciBSVFQgZGF0YS4KKyAqLwordm9pZCByeHJwY19wZWVyX2FkZF9ydHQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIGVudW0gcnhycGNfcnR0X3J4X3RyYWNlIHdoeSwKKwkJCXJ4cnBjX3NlcmlhbF90IHNlbmRfc2VyaWFsLCByeHJwY19zZXJpYWxfdCByZXNwX3NlcmlhbCwKKwkJCWt0aW1lX3Qgc2VuZF90aW1lLCBrdGltZV90IHJlc3BfdGltZSkKK3sKKwlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciA9IGNhbGwtPnBlZXI7CisJczY0IHJ0dDsKKwl1NjQgc3VtID0gcGVlci0+cnR0X3N1bSwgYXZnOworCXU4IGN1cnNvciA9IHBlZXItPnJ0dF9jdXJzb3IsIHVzYWdlID0gcGVlci0+cnR0X3VzYWdlOworCisJcnR0ID0ga3RpbWVfdG9fbnMoa3RpbWVfc3ViKHJlc3BfdGltZSwgc2VuZF90aW1lKSk7CisJaWYgKHJ0dCA8IDApCisJCXJldHVybjsKKworCS8qIFJlcGxhY2UgdGhlIG9sZGVzdCBkYXR1bSBpbiB0aGUgUlRUIGJ1ZmZlciAqLworCXN1bSAtPSBwZWVyLT5ydHRfY2FjaGVbY3Vyc29yXTsKKwlzdW0gKz0gcnR0OworCXBlZXItPnJ0dF9jYWNoZVtjdXJzb3JdID0gcnR0OworCXBlZXItPnJ0dF9jdXJzb3IgPSAoY3Vyc29yICsgMSkgJiAoUlhSUENfUlRUX0NBQ0hFX1NJWkUgLSAxKTsKKwlwZWVyLT5ydHRfc3VtID0gc3VtOworCWlmICh1c2FnZSA8IFJYUlBDX1JUVF9DQUNIRV9TSVpFKSB7CisJCXVzYWdlKys7CisJCXBlZXItPnJ0dF91c2FnZSA9IHVzYWdlOworCX0KKworCS8qIE5vdyByZWNhbGN1bGF0ZSB0aGUgYXZlcmFnZSAqLworCWlmICh1c2FnZSA9PSBSWFJQQ19SVFRfQ0FDSEVfU0laRSkgeworCQlhdmcgPSBzdW0gLyBSWFJQQ19SVFRfQ0FDSEVfU0laRTsKKwl9IGVsc2UgeworCQlhdmcgPSBzdW07CisJCWRvX2RpdihhdmcsIHVzYWdlKTsKKwl9CisKKwlwZWVyLT5ydHQgPSBhdmc7CisJdHJhY2VfcnhycGNfcnR0X3J4KGNhbGwsIHdoeSwgc2VuZF9zZXJpYWwsIHJlc3Bfc2VyaWFsLCBydHQsCisJCQkgICB1c2FnZSwgYXZnKTsKK30KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9wZWVyX29iamVjdC5jIGIvbmV0L3J4cnBjL3BlZXJfb2JqZWN0LmMKaW5kZXggNTM4ZTk4My4uOTQxYjcyNCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3BlZXJfb2JqZWN0LmMKKysrIGIvbmV0L3J4cnBjL3BlZXJfb2JqZWN0LmMKQEAgLTE2LDEyICsxNiwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2h0YWJsZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgogI2luY2x1ZGUgImFyLWludGVybmFsLmgiCiAKIHN0YXRpYyBERUZJTkVfSEFTSFRBQkxFKHJ4cnBjX3BlZXJfaGFzaCwgMTApOwpAQCAtNTAsNiArNTIsMTMgQEAKIAkJc2l6ZSA9IHNpemVvZihzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIpOwogCQlwID0gKHUxNiAqKSZzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHI7CiAJCWJyZWFrOworI2lmZGVmIENPTkZJR19BRl9SWFJQQ19JUFY2CisJY2FzZSBBRl9JTkVUNjoKKwkJaGFzaF9rZXkgKz0gKHUxNiBfX2ZvcmNlKXNyeC0+dHJhbnNwb3J0LnNpbi5zaW5fcG9ydDsKKwkJc2l6ZSA9IHNpemVvZihzcngtPnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkcik7CisJCXAgPSAodTE2ICopJnNyeC0+dHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyOworCQlicmVhazsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCVdBUk4oMSwgIkFGX1JYUlBDOiBVbnN1cHBvcnRlZCB0cmFuc3BvcnQgYWRkcmVzcyBmYW1pbHlcbiIpOwogCQlyZXR1cm4gMDsKQEAgLTkzLDYgKzEwMiwxNCBAQAogCQkJbWVtY21wKCZwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciwKIAkJCSAgICAgICAmc3J4LT50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworI2lmZGVmIENPTkZJR19BRl9SWFJQQ19JUFY2CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuICgodTE2IF9fZm9yY2UpcGVlci0+c3J4LnRyYW5zcG9ydC5zaW42LnNpbjZfcG9ydCAtCisJCQkodTE2IF9fZm9yY2Upc3J4LT50cmFuc3BvcnQuc2luNi5zaW42X3BvcnQpID86CisJCQltZW1jbXAoJnBlZXItPnNyeC50cmFuc3BvcnQuc2luNi5zaW42X2FkZHIsCisJCQkgICAgICAgJnNyeC0+dHJhbnNwb3J0LnNpbjYuc2luNl9hZGRyLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKyNlbmRpZgogCWRlZmF1bHQ6CiAJCUJVRygpOwogCX0KQEAgLTEzMCwxNyArMTQ3LDcgQEAKIAogCXBlZXIgPSBfX3J4cnBjX2xvb2t1cF9wZWVyX3JjdShsb2NhbCwgc3J4LCBoYXNoX2tleSk7CiAJaWYgKHBlZXIpIHsKLQkJc3dpdGNoIChzcngtPnRyYW5zcG9ydC5mYW1pbHkpIHsKLQkJY2FzZSBBRl9JTkVUOgotCQkJX25ldCgiUEVFUiAlZCB7JWQsJXUsJXBJNCslaHV9IiwKLQkJCSAgICAgcGVlci0+ZGVidWdfaWQsCi0JCQkgICAgIHBlZXItPnNyeC50cmFuc3BvcnRfdHlwZSwKLQkJCSAgICAgcGVlci0+c3J4LnRyYW5zcG9ydC5mYW1pbHksCi0JCQkgICAgICZwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciwKLQkJCSAgICAgbnRvaHMocGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKLQkJCWJyZWFrOwotCQl9Ci0KKwkJX25ldCgiUEVFUiAlZCB7JXBJU3B9IiwgcGVlci0+ZGVidWdfaWQsICZwZWVyLT5zcngudHJhbnNwb3J0KTsKIAkJX2xlYXZlKCIgPSAlcCB7dT0lZH0iLCBwZWVyLCBhdG9taWNfcmVhZCgmcGVlci0+dXNhZ2UpKTsKIAl9CiAJcmV0dXJuIHBlZXI7CkBAIC0xNTIsMjIgKzE1OSw1MyBAQAogICovCiBzdGF0aWMgdm9pZCByeHJwY19hc3Nlc3NfTVRVX3NpemUoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCiB7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCXN0cnVjdCBydGFibGUgKnJ0OwotCXN0cnVjdCBmbG93aTQgZmw0OworCXN0cnVjdCBmbG93aSBmbDsKKwlzdHJ1Y3QgZmxvd2k0ICpmbDQgPSAmZmwudS5pcDQ7CisjaWZkZWYgQ09ORklHX0FGX1JYUlBDX0lQVjYKKwlzdHJ1Y3QgZmxvd2k2ICpmbDYgPSAmZmwudS5pcDY7CisjZW5kaWYKIAogCXBlZXItPmlmX210dSA9IDE1MDA7CiAKLQlydCA9IGlwX3JvdXRlX291dHB1dF9wb3J0cygmaW5pdF9uZXQsICZmbDQsIE5VTEwsCi0JCQkJICAgcGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX2FkZHIuc19hZGRyLCAwLAotCQkJCSAgIGh0b25zKDcwMDApLCBodG9ucyg3MDAxKSwKLQkJCQkgICBJUFBST1RPX1VEUCwgMCwgMCk7Ci0JaWYgKElTX0VSUihydCkpIHsKLQkJX2xlYXZlKCIgW3JvdXRlIGVyciAlbGRdIiwgUFRSX0VSUihydCkpOwotCQlyZXR1cm47CisJbWVtc2V0KCZmbCwgMCwgc2l6ZW9mKGZsKSk7CisJc3dpdGNoIChwZWVyLT5zcngudHJhbnNwb3J0LmZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfcG9ydHMoCisJCQkmaW5pdF9uZXQsIGZsNCwgTlVMTCwKKwkJCXBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLnNfYWRkciwgMCwKKwkJCWh0b25zKDcwMDApLCBodG9ucyg3MDAxKSwgSVBQUk9UT19VRFAsIDAsIDApOworCQlpZiAoSVNfRVJSKHJ0KSkgeworCQkJX2xlYXZlKCIgW3JvdXRlIGVyciAlbGRdIiwgUFRSX0VSUihydCkpOworCQkJcmV0dXJuOworCQl9CisJCWRzdCA9ICZydC0+ZHN0OworCQlicmVhazsKKworI2lmZGVmIENPTkZJR19BRl9SWFJQQ19JUFY2CisJY2FzZSBBRl9JTkVUNjoKKwkJZmw2LT5mbG93aTZfaWlmID0gTE9PUEJBQ0tfSUZJTkRFWDsKKwkJZmw2LT5mbG93aTZfc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRTsKKwkJZmw2LT5mbG93aTZfcHJvdG8gPSBJUFBST1RPX1VEUDsKKwkJbWVtY3B5KCZmbDYtPmRhZGRyLCAmcGVlci0+c3J4LnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkciwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJZmw2LT5mbDZfZHBvcnQgPSBodG9ucyg3MDAxKTsKKwkJZmw2LT5mbDZfc3BvcnQgPSBodG9ucyg3MDAwKTsKKwkJZHN0ID0gaXA2X3JvdXRlX291dHB1dCgmaW5pdF9uZXQsIE5VTEwsIGZsNik7CisJCWlmIChJU19FUlIoZHN0KSkgeworCQkJX2xlYXZlKCIgW3JvdXRlIGVyciAlbGRdIiwgUFRSX0VSUihkc3QpKTsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJQlVHKCk7CiAJfQogCi0JcGVlci0+aWZfbXR1ID0gZHN0X210dSgmcnQtPmRzdCk7Ci0JZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOworCXBlZXItPmlmX210dSA9IGRzdF9tdHUoZHN0KTsKKwlkc3RfcmVsZWFzZShkc3QpOwogCiAJX2xlYXZlKCIgW2lmX210dSAldV0iLCBwZWVyLT5pZl9tdHUpOwogfQpAQCAtMTk5LDYgKzIzNyw0MSBAQAogfQogCiAvKgorICogSW5pdGlhbGlzZSBwZWVyIHJlY29yZC4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfaW5pdF9wZWVyKHN0cnVjdCByeHJwY19wZWVyICpwZWVyLCB1bnNpZ25lZCBsb25nIGhhc2hfa2V5KQoreworCXBlZXItPmhhc2hfa2V5ID0gaGFzaF9rZXk7CisJcnhycGNfYXNzZXNzX01UVV9zaXplKHBlZXIpOworCXBlZXItPm10dSA9IHBlZXItPmlmX210dTsKKwlwZWVyLT5ydHRfbGFzdF9yZXEgPSBrdGltZV9nZXRfcmVhbCgpOworCisJc3dpdGNoIChwZWVyLT5zcngudHJhbnNwb3J0LmZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJcGVlci0+aGRyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpOworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfQUZfUlhSUENfSVBWNgorCWNhc2UgQUZfSU5FVDY6CisJCXBlZXItPmhkcnNpemUgPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworCXN3aXRjaCAocGVlci0+c3J4LnRyYW5zcG9ydF90eXBlKSB7CisJY2FzZSBTT0NLX0RHUkFNOgorCQlwZWVyLT5oZHJzaXplICs9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJcGVlci0+aGRyc2l6ZSArPSBzaXplb2Yoc3RydWN0IHJ4cnBjX3dpcmVfaGVhZGVyKTsKKwlwZWVyLT5tYXhkYXRhID0gcGVlci0+bXR1IC0gcGVlci0+aGRyc2l6ZTsKK30KKworLyoKICAqIFNldCB1cCBhIG5ldyBwZWVyLgogICovCiBzdGF0aWMgc3RydWN0IHJ4cnBjX3BlZXIgKnJ4cnBjX2NyZWF0ZV9wZWVyKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsCkBAIC0yMTIsMjggKzI4NSw4IEBACiAKIAlwZWVyID0gcnhycGNfYWxsb2NfcGVlcihsb2NhbCwgZ2ZwKTsKIAlpZiAocGVlcikgewotCQlwZWVyLT5oYXNoX2tleSA9IGhhc2hfa2V5OwogCQltZW1jcHkoJnBlZXItPnNyeCwgc3J4LCBzaXplb2YoKnNyeCkpOwotCi0JCXJ4cnBjX2Fzc2Vzc19NVFVfc2l6ZShwZWVyKTsKLQkJcGVlci0+bXR1ID0gcGVlci0+aWZfbXR1OwotCi0JCWlmIChzcngtPnRyYW5zcG9ydC5mYW1pbHkgPT0gQUZfSU5FVCkgewotCQkJcGVlci0+aGRyc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXBoZHIpOwotCQkJc3dpdGNoIChzcngtPnRyYW5zcG9ydF90eXBlKSB7Ci0JCQljYXNlIFNPQ0tfREdSQU06Ci0JCQkJcGVlci0+aGRyc2l6ZSArPSBzaXplb2Yoc3RydWN0IHVkcGhkcik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCUJVRygpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJQlVHKCk7Ci0JCX0KLQotCQlwZWVyLT5oZHJzaXplICs9IHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpOwotCQlwZWVyLT5tYXhkYXRhID0gcGVlci0+bXR1IC0gcGVlci0+aGRyc2l6ZTsKKwkJcnhycGNfaW5pdF9wZWVyKHBlZXIsIGhhc2hfa2V5KTsKIAl9CiAKIAlfbGVhdmUoIiA9ICVwIiwgcGVlcik7CkBAIC0yNDEsNiArMjk0LDM1IEBACiB9CiAKIC8qCisgKiBTZXQgdXAgYSBuZXcgaW5jb21pbmcgcGVlci4gIFRoZSBhZGRyZXNzIGlzIHByZXN0b3JlZCBpbiB0aGUgcHJlYWxsb2NhdGVkCisgKiBwZWVyLgorICovCitzdHJ1Y3QgcnhycGNfcGVlciAqcnhycGNfbG9va3VwX2luY29taW5nX3BlZXIoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKKwkJCQkJICAgICAgc3RydWN0IHJ4cnBjX3BlZXIgKnByZWFsbG9jKQoreworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCXVuc2lnbmVkIGxvbmcgaGFzaF9rZXk7CisKKwloYXNoX2tleSA9IHJ4cnBjX3BlZXJfaGFzaF9rZXkobG9jYWwsICZwcmVhbGxvYy0+c3J4KTsKKwlwcmVhbGxvYy0+bG9jYWwgPSBsb2NhbDsKKwlyeHJwY19pbml0X3BlZXIocHJlYWxsb2MsIGhhc2hfa2V5KTsKKworCXNwaW5fbG9jaygmcnhycGNfcGVlcl9oYXNoX2xvY2spOworCisJLyogTmVlZCB0byBjaGVjayB0aGF0IHdlIGFyZW4ndCByYWNpbmcgd2l0aCBzb21lb25lIGVsc2UgKi8KKwlwZWVyID0gX19yeHJwY19sb29rdXBfcGVlcl9yY3UobG9jYWwsICZwcmVhbGxvYy0+c3J4LCBoYXNoX2tleSk7CisJaWYgKHBlZXIgJiYgIXJ4cnBjX2dldF9wZWVyX21heWJlKHBlZXIpKQorCQlwZWVyID0gTlVMTDsKKwlpZiAoIXBlZXIpIHsKKwkJcGVlciA9IHByZWFsbG9jOworCQloYXNoX2FkZF9yY3UocnhycGNfcGVlcl9oYXNoLCAmcGVlci0+aGFzaF9saW5rLCBoYXNoX2tleSk7CisJfQorCisJc3Bpbl91bmxvY2soJnJ4cnBjX3BlZXJfaGFzaF9sb2NrKTsKKwlyZXR1cm4gcGVlcjsKK30KKworLyoKICAqIG9idGFpbiBhIHJlbW90ZSB0cmFuc3BvcnQgZW5kcG9pbnQgZm9yIHRoZSBzcGVjaWZpZWQgYWRkcmVzcwogICovCiBzdHJ1Y3QgcnhycGNfcGVlciAqcnhycGNfbG9va3VwX3BlZXIoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKQEAgLTI0OSwxMSArMzMxLDcgQEAKIAlzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwgKmNhbmRpZGF0ZTsKIAl1bnNpZ25lZCBsb25nIGhhc2hfa2V5ID0gcnhycGNfcGVlcl9oYXNoX2tleShsb2NhbCwgc3J4KTsKIAotCV9lbnRlcigieyVkLCVkLCVwSTQrJWh1fSIsCi0JICAgICAgIHNyeC0+dHJhbnNwb3J0X3R5cGUsCi0JICAgICAgIHNyeC0+dHJhbnNwb3J0X2xlbiwKLQkgICAgICAgJnNyeC0+dHJhbnNwb3J0LnNpbi5zaW5fYWRkciwKLQkgICAgICAgbnRvaHMoc3J4LT50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisJX2VudGVyKCJ7JXBJU3B9IiwgJnNyeC0+dHJhbnNwb3J0KTsKIAogCS8qIHNlYXJjaCB0aGUgcGVlciBsaXN0IGZpcnN0ICovCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMjcyLDcgKzM1MCw3IEBACiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCi0JCXNwaW5fbG9jaygmcnhycGNfcGVlcl9oYXNoX2xvY2spOworCQlzcGluX2xvY2tfYmgoJnJ4cnBjX3BlZXJfaGFzaF9sb2NrKTsKIAogCQkvKiBOZWVkIHRvIGNoZWNrIHRoYXQgd2UgYXJlbid0IHJhY2luZyB3aXRoIHNvbWVvbmUgZWxzZSAqLwogCQlwZWVyID0gX19yeHJwY19sb29rdXBfcGVlcl9yY3UobG9jYWwsIHNyeCwgaGFzaF9rZXkpOwpAQCAtMjgyLDcgKzM2MCw3IEBACiAJCQloYXNoX2FkZF9yY3UocnhycGNfcGVlcl9oYXNoLAogCQkJCSAgICAgJmNhbmRpZGF0ZS0+aGFzaF9saW5rLCBoYXNoX2tleSk7CiAKLQkJc3Bpbl91bmxvY2soJnJ4cnBjX3BlZXJfaGFzaF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnJ4cnBjX3BlZXJfaGFzaF9sb2NrKTsKIAogCQlpZiAocGVlcikKIAkJCWtmcmVlKGNhbmRpZGF0ZSk7CkBAIC0yOTAsMTEgKzM2OCw3IEBACiAJCQlwZWVyID0gY2FuZGlkYXRlOwogCX0KIAotCV9uZXQoIlBFRVIgJWQgeyVkLCVwSTQrJWh1fSIsCi0JICAgICBwZWVyLT5kZWJ1Z19pZCwKLQkgICAgIHBlZXItPnNyeC50cmFuc3BvcnRfdHlwZSwKLQkgICAgICZwZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciwKLQkgICAgIG50b2hzKHBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisJX25ldCgiUEVFUiAlZCB7JXBJU3B9IiwgcGVlci0+ZGVidWdfaWQsICZwZWVyLT5zcngudHJhbnNwb3J0KTsKIAogCV9sZWF2ZSgiID0gJXAge3U9JWR9IiwgcGVlciwgYXRvbWljX3JlYWQoJnBlZXItPnVzYWdlKSk7CiAJcmV0dXJuIHBlZXI7CkBAIC0zMDcsOSArMzgxLDI0IEBACiB7CiAJQVNTRVJUKGhsaXN0X2VtcHR5KCZwZWVyLT5lcnJvcl90YXJnZXRzKSk7CiAKLQlzcGluX2xvY2soJnJ4cnBjX3BlZXJfaGFzaF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnJ4cnBjX3BlZXJfaGFzaF9sb2NrKTsKIAloYXNoX2RlbF9yY3UoJnBlZXItPmhhc2hfbGluayk7Ci0Jc3Bpbl91bmxvY2soJnJ4cnBjX3BlZXJfaGFzaF9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmcnhycGNfcGVlcl9oYXNoX2xvY2spOwogCiAJa2ZyZWVfcmN1KHBlZXIsIHJjdSk7CiB9CisKKy8qKgorICogcnhycGNfa2VybmVsX2dldF9wZWVyIC0gR2V0IHRoZSBwZWVyIGFkZHJlc3Mgb2YgYSBjYWxsCisgKiBAc29jazogVGhlIHNvY2tldCBvbiB3aGljaCB0aGUgY2FsbCBpcyBpbiBwcm9ncmVzcy4KKyAqIEBjYWxsOiBUaGUgY2FsbCB0byBxdWVyeQorICogQF9zcng6IFdoZXJlIHRvIHBsYWNlIHRoZSByZXN1bHQKKyAqCisgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBwZWVyIGluIGEgY2FsbC4KKyAqLwordm9pZCByeHJwY19rZXJuZWxfZ2V0X3BlZXIoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkgICBzdHJ1Y3Qgc29ja2FkZHJfcnhycGMgKl9zcngpCit7CisJKl9zcnggPSBjYWxsLT5wZWVyLT5zcng7Cit9CitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9nZXRfcGVlcik7CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvcHJvYy5jIGIvbmV0L3J4cnBjL3Byb2MuYwppbmRleCBjZWQ1ZjA3Li42NWNkOTgwIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvcHJvYy5jCisrKyBiL25ldC9yeHJwYy9wcm9jLmMKQEAgLTE3LDEyICsxNywxMiBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHJ4cnBjX2Nvbm5fc3RhdGVzW1JYUlBDX0NPTk5fX05SX1NUQVRFU10gPSB7CiAJW1JYUlBDX0NPTk5fVU5VU0VEXQkJCT0gIlVudXNlZCAgIiwKIAlbUlhSUENfQ09OTl9DTElFTlRdCQkJPSAiQ2xpZW50ICAiLAorCVtSWFJQQ19DT05OX1NFUlZJQ0VfUFJFQUxMT0NdCQk9ICJTdlByZWFsYyIsCiAJW1JYUlBDX0NPTk5fU0VSVklDRV9VTlNFQ1VSRURdCQk9ICJTdlVuc2VjICIsCiAJW1JYUlBDX0NPTk5fU0VSVklDRV9DSEFMTEVOR0lOR10JPSAiU3ZDaGFsbCAiLAogCVtSWFJQQ19DT05OX1NFUlZJQ0VdCQkJPSAiU3ZTZWN1cmUiLAogCVtSWFJQQ19DT05OX1JFTU9URUxZX0FCT1JURURdCQk9ICJSbXRBYm9ydCIsCiAJW1JYUlBDX0NPTk5fTE9DQUxMWV9BQk9SVEVEXQkJPSAiTG9jQWJvcnQiLAotCVtSWFJQQ19DT05OX05FVFdPUktfRVJST1JdCQk9ICJOZXRFcnJvciIsCiB9OwogCiAvKgpAQCAtMzAsNiArMzAsNyBAQAogICovCiBzdGF0aWMgdm9pZCAqcnhycGNfY2FsbF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqX3BvcykKIHsKKwlyY3VfcmVhZF9sb2NrKCk7CiAJcmVhZF9sb2NrKCZyeHJwY19jYWxsX2xvY2spOwogCXJldHVybiBzZXFfbGlzdF9zdGFydF9oZWFkKCZyeHJwY19jYWxscywgKl9wb3MpOwogfQpAQCAtNDIsMTcgKzQzLDIxIEBACiBzdGF0aWMgdm9pZCByeHJwY19jYWxsX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCXJlYWRfdW5sb2NrKCZyeHJwY19jYWxsX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgaW50IHJ4cnBjX2NhbGxfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbDsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcng7CisJc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXI7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7Ci0JY2hhciBsYnVmZls0ICsgNCArIDQgKyA0ICsgNSArIDFdLCByYnVmZls0ICsgNCArIDQgKyA0ICsgNSArIDFdOworCWNoYXIgbGJ1ZmZbNTBdLCByYnVmZls1MF07CiAKIAlpZiAodiA9PSAmcnhycGNfY2FsbHMpIHsKIAkJc2VxX3B1dHMoc2VxLAotCQkJICJQcm90byBMb2NhbCAgICAgICAgICAgICAgICAgIFJlbW90ZSAgICAgICAgICAgICAgICAiCisJCQkgIlByb3RvIExvY2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkJICIgUmVtb3RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiCiAJCQkgIiBTdklEIENvbm5JRCAgIENhbGxJRCAgIEVuZCBVc2UgU3RhdGUgICAgQWJvcnQgICAiCiAJCQkgIiBVc2VySURcbiIpOwogCQlyZXR1cm4gMDsKQEAgLTYwLDMwICs2NSwzNSBAQAogCiAJY2FsbCA9IGxpc3RfZW50cnkodiwgc3RydWN0IHJ4cnBjX2NhbGwsIGxpbmspOwogCi0Jc3ByaW50ZihsYnVmZiwgIiVwSTQ6JXUiLAotCQkmY2FsbC0+bG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCQludG9ocyhjYWxsLT5sb2NhbC0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKKwlyeCA9IHJjdV9kZXJlZmVyZW5jZShjYWxsLT5zb2NrZXQpOworCWlmIChyeCkgeworCQlsb2NhbCA9IFJFQURfT05DRShyeC0+bG9jYWwpOworCQlpZiAobG9jYWwpCisJCQlzcHJpbnRmKGxidWZmLCAiJXBJU3BjIiwgJmxvY2FsLT5zcngudHJhbnNwb3J0KTsKKwkJZWxzZQorCQkJc3RyY3B5KGxidWZmLCAibm9fbG9jYWwiKTsKKwl9IGVsc2UgeworCQlzdHJjcHkobGJ1ZmYsICJub19zb2NrZXQiKTsKKwl9CiAKLQljb25uID0gY2FsbC0+Y29ubjsKLQlpZiAoY29ubikKLQkJc3ByaW50ZihyYnVmZiwgIiVwSTQ6JXUiLAotCQkJJmNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fYWRkciwKLQkJCW50b2hzKGNvbm4tPnBhcmFtcy5wZWVyLT5zcngudHJhbnNwb3J0LnNpbi5zaW5fcG9ydCkpOworCXBlZXIgPSBjYWxsLT5wZWVyOworCWlmIChwZWVyKQorCQlzcHJpbnRmKHJidWZmLCAiJXBJU3BjIiwgJnBlZXItPnNyeC50cmFuc3BvcnQpOwogCWVsc2UKIAkJc3RyY3B5KHJidWZmLCAibm9fY29ubmVjdGlvbiIpOwogCiAJc2VxX3ByaW50ZihzZXEsCi0JCSAgICJVRFAgICAlLTIyLjIycyAlLTIyLjIycyAlNHggJTA4eCAlMDh4ICVzICUzdSIKKwkJICAgIlVEUCAgICUtNDcuNDdzICUtNDcuNDdzICU0eCAlMDh4ICUwOHggJXMgJTN1IgogCQkgICAiICUtOC44cyAlMDh4ICVseFxuIiwKIAkJICAgbGJ1ZmYsCiAJCSAgIHJidWZmLAogCQkgICBjYWxsLT5zZXJ2aWNlX2lkLAogCQkgICBjYWxsLT5jaWQsCiAJCSAgIGNhbGwtPmNhbGxfaWQsCi0JCSAgIGNhbGwtPmluX2NsaWVudGZsYWcgPyAiU3ZjIiA6ICJDbHQiLAorCQkgICByeHJwY19pc19zZXJ2aWNlX2NhbGwoY2FsbCkgPyAiU3ZjIiA6ICJDbHQiLAogCQkgICBhdG9taWNfcmVhZCgmY2FsbC0+dXNhZ2UpLAogCQkgICByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0sCi0JCSAgIGNhbGwtPnJlbW90ZV9hYm9ydCA/OiBjYWxsLT5sb2NhbF9hYm9ydCwKKwkJICAgY2FsbC0+YWJvcnRfY29kZSwKIAkJICAgY2FsbC0+dXNlcl9jYWxsX0lEKTsKIAogCXJldHVybiAwOwpAQCAtMTE1LDEzICsxMjUsMTMgQEAKIHN0YXRpYyB2b2lkICpyeHJwY19jb25uZWN0aW9uX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpfcG9zKQogewogCXJlYWRfbG9jaygmcnhycGNfY29ubmVjdGlvbl9sb2NrKTsKLQlyZXR1cm4gc2VxX2xpc3Rfc3RhcnRfaGVhZCgmcnhycGNfY29ubmVjdGlvbnMsICpfcG9zKTsKKwlyZXR1cm4gc2VxX2xpc3Rfc3RhcnRfaGVhZCgmcnhycGNfY29ubmVjdGlvbl9wcm9jX2xpc3QsICpfcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKnJ4cnBjX2Nvbm5lY3Rpb25fc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsCiAJCQkJICAgICAgIGxvZmZfdCAqcG9zKQogewotCXJldHVybiBzZXFfbGlzdF9uZXh0KHYsICZyeHJwY19jb25uZWN0aW9ucywgcG9zKTsKKwlyZXR1cm4gc2VxX2xpc3RfbmV4dCh2LCAmcnhycGNfY29ubmVjdGlvbl9wcm9jX2xpc3QsIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkIHJ4cnBjX2Nvbm5lY3Rpb25fc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCkBAIC0xMzIsMjkgKzE0MiwzMSBAQAogc3RhdGljIGludCByeHJwY19jb25uZWN0aW9uX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogewogCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOwotCWNoYXIgbGJ1ZmZbNCArIDQgKyA0ICsgNCArIDUgKyAxXSwgcmJ1ZmZbNCArIDQgKyA0ICsgNCArIDUgKyAxXTsKKwljaGFyIGxidWZmWzUwXSwgcmJ1ZmZbNTBdOwogCi0JaWYgKHYgPT0gJnJ4cnBjX2Nvbm5lY3Rpb25zKSB7CisJaWYgKHYgPT0gJnJ4cnBjX2Nvbm5lY3Rpb25fcHJvY19saXN0KSB7CiAJCXNlcV9wdXRzKHNlcSwKLQkJCSAiUHJvdG8gTG9jYWwgICAgICAgICAgICAgICAgICBSZW1vdGUgICAgICAgICAgICAgICAgIgorCQkJICJQcm90byBMb2NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKwkJCSAiIFJlbW90ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgogCQkJICIgU3ZJRCBDb25uSUQgICBFbmQgVXNlIFN0YXRlICAgIEtleSAgICAgIgogCQkJICIgU2VyaWFsICAgSVNlcmlhbFxuIgogCQkJICk7CiAJCXJldHVybiAwOwogCX0KIAotCWNvbm4gPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCByeHJwY19jb25uZWN0aW9uLCBsaW5rKTsKKwljb25uID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiwgcHJvY19saW5rKTsKKwlpZiAoY29ubi0+c3RhdGUgPT0gUlhSUENfQ09OTl9TRVJWSUNFX1BSRUFMTE9DKSB7CisJCXN0cmNweShsYnVmZiwgIm5vX2xvY2FsIik7CisJCXN0cmNweShyYnVmZiwgIm5vX2Nvbm5lY3Rpb24iKTsKKwkJZ290byBwcmludDsKKwl9CiAKLQlzcHJpbnRmKGxidWZmLCAiJXBJNDoldSIsCi0JCSZjb25uLT5wYXJhbXMubG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCQludG9ocyhjb25uLT5wYXJhbXMubG9jYWwtPnNyeC50cmFuc3BvcnQuc2luLnNpbl9wb3J0KSk7CisJc3ByaW50ZihsYnVmZiwgIiVwSVNwYyIsICZjb25uLT5wYXJhbXMubG9jYWwtPnNyeC50cmFuc3BvcnQpOwogCi0Jc3ByaW50ZihyYnVmZiwgIiVwSTQ6JXUiLAotCQkmY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQuc2luLnNpbl9hZGRyLAotCQludG9ocyhjb25uLT5wYXJhbXMucGVlci0+c3J4LnRyYW5zcG9ydC5zaW4uc2luX3BvcnQpKTsKLQorCXNwcmludGYocmJ1ZmYsICIlcElTcGMiLCAmY29ubi0+cGFyYW1zLnBlZXItPnNyeC50cmFuc3BvcnQpOworcHJpbnQ6CiAJc2VxX3ByaW50ZihzZXEsCi0JCSAgICJVRFAgICAlLTIyLjIycyAlLTIyLjIycyAlNHggJTA4eCAlcyAlM3UiCisJCSAgICJVRFAgICAlLTQ3LjQ3cyAlLTQ3LjQ3cyAlNHggJTA4eCAlcyAlM3UiCiAJCSAgICIgJXMgJTA4eCAlMDh4ICUwOHhcbiIsCiAJCSAgIGxidWZmLAogCQkgICByYnVmZiwKQEAgLTE2NSw3ICsxNzcsNyBAQAogCQkgICByeHJwY19jb25uX3N0YXRlc1tjb25uLT5zdGF0ZV0sCiAJCSAgIGtleV9zZXJpYWwoY29ubi0+cGFyYW1zLmtleSksCiAJCSAgIGF0b21pY19yZWFkKCZjb25uLT5zZXJpYWwpLAotCQkgICBhdG9taWNfcmVhZCgmY29ubi0+aGlfc2VyaWFsKSk7CisJCSAgIGNvbm4tPmhpX3NlcmlhbCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9yZWN2bXNnLmMgYi9uZXQvcnhycGMvcmVjdm1zZy5jCmluZGV4IDllZDY2ZDUuLmYwNWVhMGEgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9yZWN2bXNnLmMKKysrIGIvbmV0L3J4cnBjL3JlY3Ztc2cuYwpAQCAtMTksMzk5ICsxOSw2NDUgQEAKICNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgogCiAvKgotICogcmVtb3ZhbCBhIGNhbGwncyB1c2VyIElEIGZyb20gdGhlIHNvY2tldCB0cmVlIHRvIG1ha2UgdGhlIHVzZXIgSUQgYXZhaWxhYmxlCi0gKiBhZ2FpbiBhbmQgc28gdGhhdCBpdCB3b24ndCBiZSBzZWVuIGFnYWluIGluIGFzc29jaWF0aW9uIHdpdGggdGhhdCBjYWxsCisgKiBQb3N0IGEgY2FsbCBmb3IgYXR0ZW50aW9uIGJ5IHRoZSBzb2NrZXQgb3Iga2VybmVsIHNlcnZpY2UuICBGdXJ0aGVyCisgKiBub3RpZmljYXRpb25zIGFyZSBzdXBwcmVzc2VkIGJ5IHB1dHRpbmcgcmVjdm1zZ19saW5rIG9uIGEgZHVtbXkgcXVldWUuCiAgKi8KLXZvaWQgcnhycGNfcmVtb3ZlX3VzZXJfSUQoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3ZvaWQgcnhycGNfbm90aWZ5X3NvY2tldChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKIHsKLQlfZGVidWcoIlJFTEVBU0UgQ0FMTCAlZCIsIGNhbGwtPmRlYnVnX2lkKTsKKwlzdHJ1Y3QgcnhycGNfc29jayAqcng7CisJc3RydWN0IHNvY2sgKnNrOwogCi0JaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSkgewotCQl3cml0ZV9sb2NrX2JoKCZyeC0+Y2FsbF9sb2NrKTsKLQkJcmJfZXJhc2UoJmNhbGwtPnNvY2tfbm9kZSwgJmNhbGwtPnNvY2tldC0+Y2FsbHMpOwotCQljbGVhcl9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpOwotCQl3cml0ZV91bmxvY2tfYmgoJnJ4LT5jYWxsX2xvY2spOworCV9lbnRlcigiJWQiLCBjYWxsLT5kZWJ1Z19pZCk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPnJlY3Ztc2dfbGluaykpCisJCXJldHVybjsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXJ4ID0gcmN1X2RlcmVmZXJlbmNlKGNhbGwtPnNvY2tldCk7CisJc2sgPSAmcngtPnNrOworCWlmIChyeCAmJiBzay0+c2tfc3RhdGUgPCBSWFJQQ19DTE9TRSkgeworCQlpZiAoY2FsbC0+bm90aWZ5X3J4KSB7CisJCQljYWxsLT5ub3RpZnlfcngoc2ssIGNhbGwsIGNhbGwtPnVzZXJfY2FsbF9JRCk7CisJCX0gZWxzZSB7CisJCQl3cml0ZV9sb2NrX2JoKCZyeC0+cmVjdm1zZ19sb2NrKTsKKwkJCWlmIChsaXN0X2VtcHR5KCZjYWxsLT5yZWN2bXNnX2xpbmspKSB7CisJCQkJcnhycGNfZ2V0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9nb3QpOworCQkJCWxpc3RfYWRkX3RhaWwoJmNhbGwtPnJlY3Ztc2dfbGluaywgJnJ4LT5yZWN2bXNnX3EpOworCQkJfQorCQkJd3JpdGVfdW5sb2NrX2JoKCZyeC0+cmVjdm1zZ19sb2NrKTsKKworCQkJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpIHsKKwkJCQlfZGVidWcoImNhbGwgJXBzIiwgc2stPnNrX2RhdGFfcmVhZHkpOworCQkJCXNrLT5za19kYXRhX3JlYWR5KHNrKTsKKwkJCX0KKwkJfQogCX0KIAotCXJlYWRfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Ci0JaWYgKCF0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpICYmCi0JICAgICF0ZXN0X2FuZF9zZXRfYml0KFJYUlBDX0NBTExfRVZfUkVMRUFTRSwgJmNhbGwtPmV2ZW50cykpCi0JCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JcmVhZF91bmxvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOworCV9sZWF2ZSgiIik7CiB9CiAKIC8qCi0gKiByZWNlaXZlIGEgbWVzc2FnZSBmcm9tIGFuIFJ4UlBDIHNvY2tldAorICogUGFzcyBhIGNhbGwgdGVybWluYXRpbmcgbWVzc2FnZSB0byB1c2Vyc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcmVjdm1zZ190ZXJtKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3QgbXNnaGRyICptc2cpCit7CisJdTMyIHRtcCA9IDA7CisJaW50IHJldDsKKworCXN3aXRjaCAoY2FsbC0+Y29tcGxldGlvbikgeworCWNhc2UgUlhSUENfQ0FMTF9TVUNDRUVERUQ6CisJCXJldCA9IDA7CisJCWlmIChyeHJwY19pc19zZXJ2aWNlX2NhbGwoY2FsbCkpCisJCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfQUNLLCAwLCAmdG1wKTsKKwkJYnJlYWs7CisJY2FzZSBSWFJQQ19DQUxMX1JFTU9URUxZX0FCT1JURUQ6CisJCXRtcCA9IGNhbGwtPmFib3J0X2NvZGU7CisJCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19BQk9SVCwgNCwgJnRtcCk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfQ0FMTF9MT0NBTExZX0FCT1JURUQ6CisJCXRtcCA9IGNhbGwtPmFib3J0X2NvZGU7CisJCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19BQk9SVCwgNCwgJnRtcCk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfQ0FMTF9ORVRXT1JLX0VSUk9SOgorCQl0bXAgPSBjYWxsLT5lcnJvcjsKKwkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX05FVF9FUlJPUiwgNCwgJnRtcCk7CisJCWJyZWFrOworCWNhc2UgUlhSUENfQ0FMTF9MT0NBTF9FUlJPUjoKKwkJdG1wID0gY2FsbC0+ZXJyb3I7CisJCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19MT0NBTF9FUlJPUiwgNCwgJnRtcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiSW52YWxpZCB0ZXJtaW5hbCBjYWxsIHN0YXRlICV1XG4iLCBjYWxsLT5zdGF0ZSk7CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfdGVybWluYWwsIGNhbGwtPnJ4X2hhcmRfYWNrLAorCQkJICAgIGNhbGwtPnJ4X3BrdF9vZmZzZXQsIGNhbGwtPnJ4X3BrdF9sZW4sIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBhc3MgYmFjayBub3RpZmljYXRpb24gb2YgYSBuZXcgY2FsbC4gIFRoZSBjYWxsIGlzIGFkZGVkIHRvIHRoZQorICogdG8tYmUtYWNjZXB0ZWQgbGlzdC4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgbmV4dCBjYWxsIHRvIGJlIGFjY2VwdGVkIG1pZ2h0IG5vdAorICogYmUgdGhlIGxhc3QgY2FsbCBzZWVuIGF3YWl0aW5nIGFjY2VwdGFuY2UsIGJ1dCB1bmxlc3Mgd2UgbGVhdmUgdGhpcyBvbiB0aGUKKyAqIGZyb250IG9mIHRoZSBxdWV1ZSBhbmQgYmxvY2sgYWxsIG90aGVyIG1lc3NhZ2VzIHVudGlsIHNvbWVvbmUgZ2l2ZXMgdXMgYQorICogdXNlcl9JRCBmb3IgaXQsIHRoZXJlJ3Mgbm90IGEgbG90IHdlIGNhbiBkby4KKyAqLworc3RhdGljIGludCByeHJwY19yZWN2bXNnX25ld19jYWxsKHN0cnVjdCByeHJwY19zb2NrICpyeCwKKwkJCQkgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgZmxhZ3MpCit7CisJaW50IHRtcCA9IDAsIHJldDsKKworCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19ORVdfQ0FMTCwgMCwgJnRtcCk7CisKKwlpZiAocmV0ID09IDAgJiYgIShmbGFncyAmIE1TR19QRUVLKSkgeworCQlfZGVidWcoInRvIGJlIGFjY2VwdGVkIik7CisJCXdyaXRlX2xvY2tfYmgoJnJ4LT5yZWN2bXNnX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5yZWN2bXNnX2xpbmspOworCQl3cml0ZV91bmxvY2tfYmgoJnJ4LT5yZWN2bXNnX2xvY2spOworCisJCXJ4cnBjX2dldF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfZ290KTsKKwkJd3JpdGVfbG9jaygmcngtPmNhbGxfbG9jayk7CisJCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmFjY2VwdF9saW5rLCAmcngtPnRvX2JlX2FjY2VwdGVkKTsKKwkJd3JpdGVfdW5sb2NrKCZyeC0+Y2FsbF9sb2NrKTsKKwl9CisKKwl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfdG9fYmVfYWNjZXB0ZWQsIDEsIDAsIDAsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEVuZCB0aGUgcGFja2V0IHJlY2VwdGlvbiBwaGFzZS4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfZW5kX3J4X3BoYXNlKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCByeHJwY19zZXJpYWxfdCBzZXJpYWwpCit7CisJX2VudGVyKCIlZCwlcyIsIGNhbGwtPmRlYnVnX2lkLCByeHJwY19jYWxsX3N0YXRlc1tjYWxsLT5zdGF0ZV0pOworCisJdHJhY2VfcnhycGNfcmVjZWl2ZShjYWxsLCByeHJwY19yZWNlaXZlX2VuZCwgMCwgY2FsbC0+cnhfdG9wKTsKKwlBU1NFUlRDTVAoY2FsbC0+cnhfaGFyZF9hY2ssID09LCBjYWxsLT5yeF90b3ApOworCisJaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFkpIHsKKwkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX0lETEUsIDAsIHNlcmlhbCwgdHJ1ZSwgZmFsc2UsCisJCQkJICByeHJwY19wcm9wb3NlX2Fja190ZXJtaW5hbF9hY2spOworCQlyeHJwY19zZW5kX2NhbGxfcGFja2V0KGNhbGwsIFJYUlBDX1BBQ0tFVF9UWVBFX0FDSyk7CisJfQorCisJd3JpdGVfbG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7CisKKwlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJY2FzZSBSWFJQQ19DQUxMX0NMSUVOVF9SRUNWX1JFUExZOgorCQlfX3J4cnBjX2NhbGxfY29tcGxldGVkKGNhbGwpOworCQlicmVhazsKKworCWNhc2UgUlhSUENfQ0FMTF9TRVJWRVJfUkVDVl9SRVFVRVNUOgorCQljYWxsLT50eF9waGFzZSA9IHRydWU7CisJCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXdyaXRlX3VubG9ja19iaCgmY2FsbC0+c3RhdGVfbG9jayk7Cit9CisKKy8qCisgKiBEaXNjYXJkIGEgcGFja2V0IHdlJ3ZlIHVzZWQgdXAgYW5kIGFkdmFuY2UgdGhlIFJ4IHdpbmRvdyBieSBvbmUuCisgKi8KK3N0YXRpYyB2b2lkIHJ4cnBjX3JvdGF0ZV9yeF93aW5kb3coc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXJ4cnBjX3NlcmlhbF90IHNlcmlhbDsKKwlyeHJwY19zZXFfdCBoYXJkX2FjaywgdG9wOworCXU4IGZsYWdzOworCWludCBpeDsKKworCV9lbnRlcigiJWQiLCBjYWxsLT5kZWJ1Z19pZCk7CisKKwloYXJkX2FjayA9IGNhbGwtPnJ4X2hhcmRfYWNrOworCXRvcCA9IHNtcF9sb2FkX2FjcXVpcmUoJmNhbGwtPnJ4X3RvcCk7CisJQVNTRVJUKGJlZm9yZShoYXJkX2FjaywgdG9wKSk7CisKKwloYXJkX2FjaysrOworCWl4ID0gaGFyZF9hY2sgJiBSWFJQQ19SWFRYX0JVRkZfTUFTSzsKKwlza2IgPSBjYWxsLT5yeHR4X2J1ZmZlcltpeF07CisJcnhycGNfc2VlX3NrYihza2IsIHJ4cnBjX3NrYl9yeF9yb3RhdGVkKTsKKwlzcCA9IHJ4cnBjX3NrYihza2IpOworCWZsYWdzID0gc3AtPmhkci5mbGFnczsKKwlzZXJpYWwgPSBzcC0+aGRyLnNlcmlhbDsKKwlpZiAoY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF0gJiBSWFJQQ19SWF9BTk5PX0pVTUJPKQorCQlzZXJpYWwgKz0gKGNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdICYgUlhSUENfUlhfQU5OT19KVU1CTykgLSAxOworCisJY2FsbC0+cnh0eF9idWZmZXJbaXhdID0gTlVMTDsKKwljYWxsLT5yeHR4X2Fubm90YXRpb25zW2l4XSA9IDA7CisJLyogQmFycmllciBhZ2FpbnN0IHJ4cnBjX2lucHV0X2RhdGEoKS4gKi8KKwlzbXBfc3RvcmVfcmVsZWFzZSgmY2FsbC0+cnhfaGFyZF9hY2ssIGhhcmRfYWNrKTsKKworCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3J4X2ZyZWVkKTsKKworCV9kZWJ1ZygiJXUsJXUsJTAyeCIsIGhhcmRfYWNrLCB0b3AsIGZsYWdzKTsKKwl0cmFjZV9yeHJwY19yZWNlaXZlKGNhbGwsIHJ4cnBjX3JlY2VpdmVfcm90YXRlLCBzZXJpYWwsIGhhcmRfYWNrKTsKKwlpZiAoZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgeworCQlyeHJwY19lbmRfcnhfcGhhc2UoY2FsbCwgc2VyaWFsKTsKKwl9IGVsc2UgeworCQkvKiBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbiBBQ0sgdGhhdCBuZWVkcyBzZW5kaW5nLiAqLworCQlpZiAoYWZ0ZXJfZXEoaGFyZF9hY2ssIGNhbGwtPmFja3JfY29uc3VtZWQgKyAyKSB8fAorCQkgICAgYWZ0ZXJfZXEodG9wLCBjYWxsLT5hY2tyX3NlZW4gKyAyKSB8fAorCQkgICAgKGhhcmRfYWNrID09IHRvcCAmJiBhZnRlcihoYXJkX2FjaywgY2FsbC0+YWNrcl9jb25zdW1lZCkpKQorCQkJcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX0RFTEFZLCAwLCBzZXJpYWwsCisJCQkJCSAgdHJ1ZSwgZmFsc2UsCisJCQkJCSAgcnhycGNfcHJvcG9zZV9hY2tfcm90YXRlX3J4KTsKKwkJaWYgKGNhbGwtPmFja3JfcmVhc29uKQorCQkJcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQ0spOworCX0KK30KKworLyoKKyAqIERlY3J5cHQgYW5kIHZlcmlmeSBhIChzdWIpcGFja2V0LiAgVGhlIHBhY2tldCdzIGxlbmd0aCBtYXkgYmUgY2hhbmdlZCBkdWUgdG8KKyAqIHBhZGRpbmcsIGJ1dCBpZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgcGFja2V0IGxlbmd0aCB3aWxsIGJlIHJlc2lkZW50IGluIHRoZQorICogc29ja2V0IGJ1ZmZlci4gIE5vdGUgdGhhdCB3ZSBjYW4ndCBtb2RpZnkgdGhlIG1hc3RlciBza2IgaW5mbyBhcyB0aGUgc2tiIG1heQorICogYmUgdGhlIGhvbWUgdG8gbXVsdGlwbGUgc3VicGFja2V0cy4KKyAqLworc3RhdGljIGludCByeHJwY192ZXJpZnlfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHU4IGFubm90YXRpb24sCisJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7CisJcnhycGNfc2VxX3Qgc2VxID0gc3AtPmhkci5zZXE7CisJdTE2IGNrc3VtID0gc3AtPmhkci5ja3N1bTsKKworCV9lbnRlcigiIik7CisKKwkvKiBGb3IgYWxsIGJ1dCB0aGUgaGVhZCBqdW1ibyBzdWJwYWNrZXQsIHRoZSBzZWN1cml0eSBjaGVja3N1bSBpcyBpbiBhCisJICoganVtYm8gaGVhZGVyIGltbWVkaWF0ZWx5IHByaW9yIHRvIHRoZSBkYXRhLgorCSAqLworCWlmICgoYW5ub3RhdGlvbiAmIFJYUlBDX1JYX0FOTk9fSlVNQk8pID4gMSkgeworCQlfX2JlMTYgdG1wOworCQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG9mZnNldCAtIDIsICZ0bXAsIDIpIDwgMCkKKwkJCUJVRygpOworCQlja3N1bSA9IG50b2hzKHRtcCk7CisJCXNlcSArPSAoYW5ub3RhdGlvbiAmIFJYUlBDX1JYX0FOTk9fSlVNQk8pIC0gMTsKKwl9CisKKwlyZXR1cm4gY2FsbC0+Y29ubi0+c2VjdXJpdHktPnZlcmlmeV9wYWNrZXQoY2FsbCwgc2tiLCBvZmZzZXQsIGxlbiwKKwkJCQkJCSAgIHNlcSwgY2tzdW0pOworfQorCisvKgorICogTG9jYXRlIHRoZSBkYXRhIHdpdGhpbiBhIHBhY2tldC4gIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnk6CisgKgorICogKDEpIEFuIHNrYiBtYXkgY29udGFpbiBhIGp1bWJvIHBhY2tldCAtIHNvIHdlIGhhdmUgdG8gZmluZCB0aGUgYXBwcm9wcmlhdGUKKyAqICAgICBzdWJwYWNrZXQuCisgKgorICogKDIpIFRoZSAoc3ViKXBhY2tldHMgbWF5IGJlIGVuY3J5cHRlZCBhbmQsIGlmIHNvLCB0aGUgZW5jcnlwdGVkIHBvcnRpb24KKyAqICAgICBjb250YWlucyBhbiBleHRyYSBoZWFkZXIgd2hpY2ggaW5jbHVkZXMgdGhlIHRydWUgbGVuZ3RoIG9mIHRoZSBkYXRhLAorICogICAgIGV4Y2x1ZGluZyBhbnkgZW5jcnlwdGVkIHBhZGRpbmcuCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfbG9jYXRlX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHU4ICpfYW5ub3RhdGlvbiwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKl9sZW4pCit7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpOworCXVuc2lnbmVkIGludCBsZW4gPSAqX2xlbjsKKwlpbnQgcmV0OworCXU4IGFubm90YXRpb24gPSAqX2Fubm90YXRpb247CisKKwkvKiBMb2NhdGUgdGhlIHN1YnBhY2tldCAqLworCWxlbiA9IHNrYi0+bGVuIC0gb2Zmc2V0OworCWlmICgoYW5ub3RhdGlvbiAmIFJYUlBDX1JYX0FOTk9fSlVNQk8pID4gMCkgeworCQlvZmZzZXQgKz0gKCgoYW5ub3RhdGlvbiAmIFJYUlBDX1JYX0FOTk9fSlVNQk8pIC0gMSkgKgorCQkJICAgUlhSUENfSlVNQk9fU1VCUEtUTEVOKTsKKwkJbGVuID0gKGFubm90YXRpb24gJiBSWFJQQ19SWF9BTk5PX0pMQVNUKSA/CisJCQlza2ItPmxlbiAtIG9mZnNldCA6IFJYUlBDX0pVTUJPX1NVQlBLVExFTjsKKwl9CisKKwlpZiAoIShhbm5vdGF0aW9uICYgUlhSUENfUlhfQU5OT19WRVJJRklFRCkpIHsKKwkJcmV0ID0gcnhycGNfdmVyaWZ5X3BhY2tldChjYWxsLCBza2IsIGFubm90YXRpb24sIG9mZnNldCwgbGVuKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqX2Fubm90YXRpb24gfD0gUlhSUENfUlhfQU5OT19WRVJJRklFRDsKKwl9CisKKwkqX29mZnNldCA9IG9mZnNldDsKKwkqX2xlbiA9IGxlbjsKKwljYWxsLT5jb25uLT5zZWN1cml0eS0+bG9jYXRlX2RhdGEoY2FsbCwgc2tiLCBfb2Zmc2V0LCBfbGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlbGl2ZXIgbWVzc2FnZXMgdG8gYSBjYWxsLiAgVGhpcyBrZWVwcyBwcm9jZXNzaW5nIHBhY2tldHMgdW50aWwgdGhlIGJ1ZmZlcgorICogaXMgZmlsbGVkIGFuZCB3ZSBmaW5kIGVpdGhlciBtb3JlIERBVEEgKHJldHVybnMgMCkgb3IgdGhlIGVuZCBvZiB0aGUgREFUQQorICogKHJldHVybnMgMSkuICBJZiBtb3JlIHBhY2tldHMgYXJlIHJlcXVpcmVkLCBpdCByZXR1cm5zIC1FQUdBSU4uCisgKi8KK3N0YXRpYyBpbnQgcnhycGNfcmVjdm1zZ19kYXRhKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsCisJCQkgICAgICBzaXplX3QgbGVuLCBpbnQgZmxhZ3MsIHNpemVfdCAqX29mZnNldCkKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJcnhycGNfc2VxX3QgaGFyZF9hY2ssIHRvcCwgc2VxOworCXNpemVfdCByZW1haW47CisJYm9vbCBsYXN0OworCXVuc2lnbmVkIGludCByeF9wa3Rfb2Zmc2V0LCByeF9wa3RfbGVuOworCWludCBpeCwgY29weSwgcmV0ID0gLUVBR0FJTiwgcmV0MjsKKworCXJ4X3BrdF9vZmZzZXQgPSBjYWxsLT5yeF9wa3Rfb2Zmc2V0OworCXJ4X3BrdF9sZW4gPSBjYWxsLT5yeF9wa3RfbGVuOworCisJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNUKSB7CisJCXNlcSA9IGNhbGwtPnJ4X2hhcmRfYWNrOworCQlyZXQgPSAxOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogQmFycmllcnMgYWdhaW5zdCByeHJwY19pbnB1dF9kYXRhKCkuICovCisJaGFyZF9hY2sgPSBjYWxsLT5yeF9oYXJkX2FjazsKKwl0b3AgPSBzbXBfbG9hZF9hY3F1aXJlKCZjYWxsLT5yeF90b3ApOworCWZvciAoc2VxID0gaGFyZF9hY2sgKyAxOyBiZWZvcmVfZXEoc2VxLCB0b3ApOyBzZXErKykgeworCQlpeCA9IHNlcSAmIFJYUlBDX1JYVFhfQlVGRl9NQVNLOworCQlza2IgPSBjYWxsLT5yeHR4X2J1ZmZlcltpeF07CisJCWlmICghc2tiKSB7CisJCQl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfaG9sZSwgc2VxLAorCQkJCQkgICAgcnhfcGt0X29mZnNldCwgcnhfcGt0X2xlbiwgMCk7CisJCQlicmVhazsKKwkJfQorCQlzbXBfcm1iKCk7CisJCXJ4cnBjX3NlZV9za2Ioc2tiLCByeHJwY19za2Jfcnhfc2Vlbik7CisJCXNwID0gcnhycGNfc2tiKHNrYik7CisKKwkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpCisJCQl0cmFjZV9yeHJwY19yZWNlaXZlKGNhbGwsIHJ4cnBjX3JlY2VpdmVfZnJvbnQsCisJCQkJCSAgICBzcC0+aGRyLnNlcmlhbCwgc2VxKTsKKworCQlpZiAobXNnKQorCQkJc29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNvY2stPnNrLCBza2IpOworCisJCWlmIChyeF9wa3Rfb2Zmc2V0ID09IDApIHsKKwkJCXJldDIgPSByeHJwY19sb2NhdGVfZGF0YShjYWxsLCBza2IsCisJCQkJCQkgJmNhbGwtPnJ4dHhfYW5ub3RhdGlvbnNbaXhdLAorCQkJCQkJICZyeF9wa3Rfb2Zmc2V0LCAmcnhfcGt0X2xlbik7CisJCQl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfbmV4dCwgc2VxLAorCQkJCQkgICAgcnhfcGt0X29mZnNldCwgcnhfcGt0X2xlbiwgcmV0Mik7CisJCQlpZiAocmV0MiA8IDApIHsKKwkJCQlyZXQgPSByZXQyOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgeworCQkJdHJhY2VfcnhycGNfcmVjdm1zZyhjYWxsLCByeHJwY19yZWN2bXNnX2NvbnQsIHNlcSwKKwkJCQkJICAgIHJ4X3BrdF9vZmZzZXQsIHJ4X3BrdF9sZW4sIDApOworCQl9CisKKwkJLyogV2UgaGF2ZSB0byBoYW5kbGUgc2hvcnQsIGVtcHR5IGFuZCB1c2VkLXVwIERBVEEgcGFja2V0cy4gKi8KKwkJcmVtYWluID0gbGVuIC0gKl9vZmZzZXQ7CisJCWNvcHkgPSByeF9wa3RfbGVuOworCQlpZiAoY29weSA+IHJlbWFpbikKKwkJCWNvcHkgPSByZW1haW47CisJCWlmIChjb3B5ID4gMCkgeworCQkJcmV0MiA9IHNrYl9jb3B5X2RhdGFncmFtX2l0ZXIoc2tiLCByeF9wa3Rfb2Zmc2V0LCBpdGVyLAorCQkJCQkJICAgICAgY29weSk7CisJCQlpZiAocmV0MiA8IDApIHsKKwkJCQlyZXQgPSByZXQyOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQkvKiBoYW5kbGUgcGllY2VtZWFsIGNvbnN1bXB0aW9uIG9mIGRhdGEgcGFja2V0cyAqLworCQkJcnhfcGt0X29mZnNldCArPSBjb3B5OworCQkJcnhfcGt0X2xlbiAtPSBjb3B5OworCQkJKl9vZmZzZXQgKz0gY29weTsKKwkJfQorCisJCWlmIChyeF9wa3RfbGVuID4gMCkgeworCQkJdHJhY2VfcnhycGNfcmVjdm1zZyhjYWxsLCByeHJwY19yZWN2bXNnX2Z1bGwsIHNlcSwKKwkJCQkJICAgIHJ4X3BrdF9vZmZzZXQsIHJ4X3BrdF9sZW4sIDApOworCQkJQVNTRVJUQ01QKCpfb2Zmc2V0LCA9PSwgbGVuKTsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFRoZSB3aG9sZSBwYWNrZXQgaGFzIGJlZW4gdHJhbnNmZXJyZWQuICovCisJCWxhc3QgPSBzcC0+aGRyLmZsYWdzICYgUlhSUENfTEFTVF9QQUNLRVQ7CisJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQorCQkJcnhycGNfcm90YXRlX3J4X3dpbmRvdyhjYWxsKTsKKwkJcnhfcGt0X29mZnNldCA9IDA7CisJCXJ4X3BrdF9sZW4gPSAwOworCisJCWlmIChsYXN0KSB7CisJCQlBU1NFUlRDTVAoc2VxLCA9PSwgUkVBRF9PTkNFKGNhbGwtPnJ4X3RvcCkpOworCQkJcmV0ID0gMTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXQ6CisJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKKwkJY2FsbC0+cnhfcGt0X29mZnNldCA9IHJ4X3BrdF9vZmZzZXQ7CisJCWNhbGwtPnJ4X3BrdF9sZW4gPSByeF9wa3RfbGVuOworCX0KK2RvbmU6CisJdHJhY2VfcnhycGNfcmVjdm1zZyhjYWxsLCByeHJwY19yZWN2bXNnX2RhdGFfcmV0dXJuLCBzZXEsCisJCQkgICAgcnhfcGt0X29mZnNldCwgcnhfcGt0X2xlbiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSBhbiBSeFJQQyBzb2NrZXQKICAqIC0gd2UgbmVlZCB0byBiZSBjYXJlZnVsIGFib3V0IHR3byBvciBtb3JlIHRocmVhZHMgY2FsbGluZyByZWN2bXNnCiAgKiAgIHNpbXVsdGFuZW91c2x5CiAgKi8KIGludCByeHJwY19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKIAkJICBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKLQlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCA9IE5VTEwsICpjb250aW51ZV9jYWxsID0gTlVMTDsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKIAlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzb2NrLT5zayk7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXNpemVfdCBjb3BpZWQgPSAwOwogCWxvbmcgdGltZW87Ci0JaW50IGNvcHksIHJldCwgdWxsZW4sIG9mZnNldCwgY29waWVkID0gMDsKLQl1MzIgYWJvcnRfY29kZTsKKwlpbnQgcmV0OwogCiAJREVGSU5FX1dBSVQod2FpdCk7CiAKLQlfZW50ZXIoIiwsLCV6dSwlZCIsIGxlbiwgZmxhZ3MpOworCXRyYWNlX3J4cnBjX3JlY3Ztc2coTlVMTCwgcnhycGNfcmVjdm1zZ19lbnRlciwgMCwgMCwgMCwgMCk7CiAKIAlpZiAoZmxhZ3MgJiAoTVNHX09PQiB8IE1TR19UUlVOQykpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCXVsbGVuID0gbXNnLT5tc2dfZmxhZ3MgJiBNU0dfQ01TR19DT01QQVQgPyA0IDogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotCiAJdGltZW8gPSBzb2NrX3JjdnRpbWVvKCZyeC0+c2ssIGZsYWdzICYgTVNHX0RPTlRXQUlUKTsKLQltc2ctPm1zZ19mbGFncyB8PSBNU0dfTU9SRTsKIAordHJ5X2FnYWluOgogCWxvY2tfc29jaygmcngtPnNrKTsKIAotCWZvciAoOzspIHsKLQkJLyogcmV0dXJuIGltbWVkaWF0ZWx5IGlmIGEgY2xpZW50IHNvY2tldCBoYXMgbm8gb3V0c3RhbmRpbmcKLQkJICogY2FsbHMgKi8KLQkJaWYgKFJCX0VNUFRZX1JPT1QoJnJ4LT5jYWxscykpIHsKLQkJCWlmIChjb3BpZWQpCi0JCQkJZ290byBvdXQ7Ci0JCQlpZiAocngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1NFUlZFUl9MSVNURU5JTkcpIHsKLQkJCQlyZWxlYXNlX3NvY2soJnJ4LT5zayk7Ci0JCQkJaWYgKGNvbnRpbnVlX2NhbGwpCi0JCQkJCXJ4cnBjX3B1dF9jYWxsKGNvbnRpbnVlX2NhbGwpOwotCQkJCXJldHVybiAtRU5PREFUQTsKLQkJCX0KLQkJfQotCi0JCS8qIGdldCB0aGUgbmV4dCBtZXNzYWdlIG9uIHRoZSBSeCBxdWV1ZSAqLwotCQlza2IgPSBza2JfcGVlaygmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpOwotCQlpZiAoIXNrYikgewotCQkJLyogbm90aGluZyByZW1haW5zIG9uIHRoZSBxdWV1ZSAqLwotCQkJaWYgKGNvcGllZCAmJgotCQkJICAgIChmbGFncyAmIE1TR19QRUVLIHx8IHRpbWVvID09IDApKQotCQkJCWdvdG8gb3V0OwotCi0JCQkvKiB3YWl0IGZvciBhIG1lc3NhZ2UgdG8gdHVybiB1cCAqLwotCQkJcmVsZWFzZV9zb2NrKCZyeC0+c2spOwotCQkJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZShza19zbGVlcCgmcngtPnNrKSwgJndhaXQsCi0JCQkJCQkgIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlyZXQgPSBzb2NrX2Vycm9yKCZyeC0+c2spOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIHdhaXRfZXJyb3I7Ci0KLQkJCWlmIChza2JfcXVldWVfZW1wdHkoJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKSkgewotCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQkJZ290byB3YWl0X2ludGVycnVwdGVkOwotCQkJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7Ci0JCQl9Ci0JCQlmaW5pc2hfd2FpdChza19zbGVlcCgmcngtPnNrKSwgJndhaXQpOwotCQkJbG9ja19zb2NrKCZyeC0+c2spOwotCQkJY29udGludWU7Ci0JCX0KLQotCXBlZWtfbmV4dF9wYWNrZXQ6Ci0JCXNwID0gcnhycGNfc2tiKHNrYik7Ci0JCWNhbGwgPSBzcC0+Y2FsbDsKLQkJQVNTRVJUKGNhbGwgIT0gTlVMTCk7Ci0KLQkJX2RlYnVnKCJuZXh0IHBrdCAlcyIsIHJ4cnBjX3BrdHNbc3AtPmhkci50eXBlXSk7Ci0KLQkJLyogbWFrZSBzdXJlIHdlIHdhaXQgZm9yIHRoZSBzdGF0ZSB0byBiZSB1cGRhdGVkIGluIHRoaXMgY2FsbCAqLwotCQlzcGluX2xvY2tfYmgoJmNhbGwtPmxvY2spOwotCQlzcGluX3VubG9ja19iaCgmY2FsbC0+bG9jayk7Ci0KLQkJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfUkVMRUFTRUQsICZjYWxsLT5mbGFncykpIHsKLQkJCV9kZWJ1ZygicGFja2V0IGZyb20gcmVsZWFzZWQgY2FsbCIpOwotCQkJaWYgKHNrYl9kZXF1ZXVlKCZyeC0+c2suc2tfcmVjZWl2ZV9xdWV1ZSkgIT0gc2tiKQotCQkJCUJVRygpOwotCQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogZGV0ZXJtaW5lIHdoZXRoZXIgdG8gY29udGludWUgbGFzdCBkYXRhIHJlY2VpdmUgKi8KLQkJaWYgKGNvbnRpbnVlX2NhbGwpIHsKLQkJCV9kZWJ1ZygibWF5YmUgY29udCIpOwotCQkJaWYgKGNhbGwgIT0gY29udGludWVfY2FsbCB8fAotCQkJICAgIHNrYi0+bWFyayAhPSBSWFJQQ19TS0JfTUFSS19EQVRBKSB7Ci0JCQkJcmVsZWFzZV9zb2NrKCZyeC0+c2spOwotCQkJCXJ4cnBjX3B1dF9jYWxsKGNvbnRpbnVlX2NhbGwpOwotCQkJCV9sZWF2ZSgiID0gJWQgW25vbmNvbnRdIiwgY29waWVkKTsKLQkJCQlyZXR1cm4gY29waWVkOwotCQkJfQotCQl9Ci0KLQkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7Ci0KLQkJLyogY29weSB0aGUgcGVlciBhZGRyZXNzIGFuZCB0aW1lc3RhbXAgKi8KLQkJaWYgKCFjb250aW51ZV9jYWxsKSB7Ci0JCQlpZiAobXNnLT5tc2dfbmFtZSkgewotCQkJCXNpemVfdCBsZW4gPQotCQkJCQlzaXplb2YoY2FsbC0+Y29ubi0+cGFyYW1zLnBlZXItPnNyeCk7Ci0JCQkJbWVtY3B5KG1zZy0+bXNnX25hbWUsCi0JCQkJICAgICAgICZjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+c3J4LCBsZW4pOwotCQkJCW1zZy0+bXNnX25hbWVsZW4gPSBsZW47Ci0JCQl9Ci0JCQlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgJnJ4LT5zaywgc2tiKTsKLQkJfQotCi0JCS8qIHJlY2VpdmUgdGhlIG1lc3NhZ2UgKi8KLQkJaWYgKHNrYi0+bWFyayAhPSBSWFJQQ19TS0JfTUFSS19EQVRBKQotCQkJZ290byByZWNlaXZlX25vbl9kYXRhX21lc3NhZ2U7Ci0KLQkJX2RlYnVnKCJyZWN2bXNnIERBVEEgIyV1IHsgJWQsICVkIH0iLAotCQkgICAgICAgc3AtPmhkci5zZXEsIHNrYi0+bGVuLCBzcC0+b2Zmc2V0KTsKLQotCQlpZiAoIWNvbnRpbnVlX2NhbGwpIHsKLQkJCS8qIG9ubHkgc2V0IHRoZSBjb250cm9sIGRhdGEgb25jZSBwZXIgcmVjdm1zZygpICovCi0JCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfVVNFUl9DQUxMX0lELAotCQkJCSAgICAgICB1bGxlbiwgJmNhbGwtPnVzZXJfY2FsbF9JRCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIGNvcHlfZXJyb3I7Ci0JCQlBU1NFUlQodGVzdF9iaXQoUlhSUENfQ0FMTF9IQVNfVVNFUklELCAmY2FsbC0+ZmxhZ3MpKTsKLQkJfQotCi0JCUFTU0VSVENNUChzcC0+aGRyLnNlcSwgPj0sIGNhbGwtPnJ4X2RhdGFfcmVjdik7Ci0JCUFTU0VSVENNUChzcC0+aGRyLnNlcSwgPD0sIGNhbGwtPnJ4X2RhdGFfcmVjdiArIDEpOwotCQljYWxsLT5yeF9kYXRhX3JlY3YgPSBzcC0+aGRyLnNlcTsKLQotCQlBU1NFUlRDTVAoc3AtPmhkci5zZXEsID4sIGNhbGwtPnJ4X2RhdGFfZWF0ZW4pOwotCi0JCW9mZnNldCA9IHNwLT5vZmZzZXQ7Ci0JCWNvcHkgPSBza2ItPmxlbiAtIG9mZnNldDsKLQkJaWYgKGNvcHkgPiBsZW4gLSBjb3BpZWQpCi0JCQljb3B5ID0gbGVuIC0gY29waWVkOwotCi0JCXJldCA9IHNrYl9jb3B5X2RhdGFncmFtX21zZyhza2IsIG9mZnNldCwgbXNnLCBjb3B5KTsKLQotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gY29weV9lcnJvcjsKLQotCQkvKiBoYW5kbGUgcGllY2VtZWFsIGNvbnN1bXB0aW9uIG9mIGRhdGEgcGFja2V0cyAqLwotCQlfZGVidWcoImNvcGllZCAlZCslZCIsIGNvcHksIGNvcGllZCk7Ci0KLQkJb2Zmc2V0ICs9IGNvcHk7Ci0JCWNvcGllZCArPSBjb3B5OwotCi0JCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQotCQkJc3AtPm9mZnNldCA9IG9mZnNldDsKLQotCQlpZiAoc3AtPm9mZnNldCA8IHNrYi0+bGVuKSB7Ci0JCQlfZGVidWcoImJ1ZmZlciBmdWxsIik7Ci0JCQlBU1NFUlRDTVAoY29waWVkLCA9PSwgbGVuKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogd2UgdHJhbnNmZXJyZWQgdGhlIHdob2xlIGRhdGEgcGFja2V0ICovCi0JCWlmICghKGZsYWdzICYgTVNHX1BFRUspKQotCQkJcnhycGNfa2VybmVsX2RhdGFfY29uc3VtZWQoY2FsbCwgc2tiKTsKLQotCQlpZiAoc3AtPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUKSB7Ci0JCQlfZGVidWcoImxhc3QiKTsKLQkJCWlmIChyeHJwY19jb25uX2lzX2NsaWVudChjYWxsLT5jb25uKSkgewotCQkJCSAvKiBsYXN0IGJ5dGUgb2YgcmVwbHkgcmVjZWl2ZWQgKi8KLQkJCQlyZXQgPSBjb3BpZWQ7Ci0JCQkJZ290byB0ZXJtaW5hbF9tZXNzYWdlOwotCQkJfQotCi0JCQkvKiBsYXN0IGJpdCBvZiByZXF1ZXN0IHJlY2VpdmVkICovCi0JCQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgewotCQkJCV9kZWJ1ZygiZWF0IHBhY2tldCIpOwotCQkJCWlmIChza2JfZGVxdWV1ZSgmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpICE9Ci0JCQkJICAgIHNrYikKLQkJCQkJQlVHKCk7Ci0JCQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKLQkJCX0KLQkJCW1zZy0+bXNnX2ZsYWdzICY9IH5NU0dfTU9SRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogbW92ZSBvbiB0byB0aGUgbmV4dCBkYXRhIG1lc3NhZ2UgKi8KLQkJX2RlYnVnKCJuZXh0Iik7Ci0JCWlmICghY29udGludWVfY2FsbCkKLQkJCWNvbnRpbnVlX2NhbGwgPSBzcC0+Y2FsbDsKLQkJZWxzZQotCQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JCWNhbGwgPSBOVUxMOwotCi0JCWlmIChmbGFncyAmIE1TR19QRUVLKSB7Ci0JCQlfZGVidWcoInBlZWsgbmV4dCIpOwotCQkJc2tiID0gc2tiLT5uZXh0OwotCQkJaWYgKHNrYiA9PSAoc3RydWN0IHNrX2J1ZmYgKikgJnJ4LT5zay5za19yZWNlaXZlX3F1ZXVlKQotCQkJCWJyZWFrOwotCQkJZ290byBwZWVrX25leHRfcGFja2V0OwotCQl9Ci0KLQkJX2RlYnVnKCJlYXQgcGFja2V0Iik7Ci0JCWlmIChza2JfZGVxdWV1ZSgmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpICE9IHNrYikKLQkJCUJVRygpOwotCQlyeHJwY19mcmVlX3NrYihza2IpOworCS8qIFJldHVybiBpbW1lZGlhdGVseSBpZiBhIGNsaWVudCBzb2NrZXQgaGFzIG5vIG91dHN0YW5kaW5nIGNhbGxzICovCisJaWYgKFJCX0VNUFRZX1JPT1QoJnJ4LT5jYWxscykgJiYKKwkgICAgbGlzdF9lbXB0eSgmcngtPnJlY3Ztc2dfcSkgJiYKKwkgICAgcngtPnNrLnNrX3N0YXRlICE9IFJYUlBDX1NFUlZFUl9MSVNURU5JTkcpIHsKKwkJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCQlyZXR1cm4gLUVOT0RBVEE7CiAJfQogCi0JLyogZW5kIG9mIG5vbi10ZXJtaW5hbCBkYXRhIHBhY2tldCByZWNlcHRpb24gZm9yIHRoZSBtb21lbnQgKi8KLQlfZGVidWcoImVuZCByY3YgZGF0YSIpOwotb3V0OgotCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKLQlpZiAoY2FsbCkKLQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JaWYgKGNvbnRpbnVlX2NhbGwpCi0JCXJ4cnBjX3B1dF9jYWxsKGNvbnRpbnVlX2NhbGwpOwotCV9sZWF2ZSgiID0gJWQgW2RhdGFdIiwgY29waWVkKTsKLQlyZXR1cm4gY29waWVkOwotCi0JLyogaGFuZGxlIG5vbi1EQVRBIG1lc3NhZ2VzIHN1Y2ggYXMgYWJvcnRzLCBpbmNvbWluZyBjb25uZWN0aW9ucyBhbmQKLQkgKiBmaW5hbCBBQ0tzICovCi1yZWNlaXZlX25vbl9kYXRhX21lc3NhZ2U6Ci0JX2RlYnVnKCJub24tZGF0YSIpOwotCi0JaWYgKHNrYi0+bWFyayA9PSBSWFJQQ19TS0JfTUFSS19ORVdfQ0FMTCkgewotCQlfZGVidWcoIlJFQ1YgTkVXIENBTEwiKTsKLQkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX05FV19DQUxMLCAwLCAmYWJvcnRfY29kZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBjb3B5X2Vycm9yOwotCQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgewotCQkJaWYgKHNrYl9kZXF1ZXVlKCZyeC0+c2suc2tfcmVjZWl2ZV9xdWV1ZSkgIT0gc2tiKQotCQkJCUJVRygpOwotCQkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwlpZiAobGlzdF9lbXB0eSgmcngtPnJlY3Ztc2dfcSkpIHsKKwkJcmV0ID0gLUVXT1VMREJMT0NLOworCQlpZiAodGltZW8gPT0gMCkgeworCQkJY2FsbCA9IE5VTEw7CisJCQlnb3RvIGVycm9yX25vX2NhbGw7CiAJCX0KLQkJZ290byBvdXQ7CisKKwkJcmVsZWFzZV9zb2NrKCZyeC0+c2spOworCisJCS8qIFdhaXQgZm9yIHNvbWV0aGluZyB0byBoYXBwZW4gKi8KKwkJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZShza19zbGVlcCgmcngtPnNrKSwgJndhaXQsCisJCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJcmV0ID0gc29ja19lcnJvcigmcngtPnNrKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gd2FpdF9lcnJvcjsKKworCQlpZiAobGlzdF9lbXB0eSgmcngtPnJlY3Ztc2dfcSkpIHsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlnb3RvIHdhaXRfaW50ZXJydXB0ZWQ7CisJCQl0cmFjZV9yeHJwY19yZWN2bXNnKE5VTEwsIHJ4cnBjX3JlY3Ztc2dfd2FpdCwKKwkJCQkJICAgIDAsIDAsIDAsIDApOworCQkJdGltZW8gPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvKTsKKwkJfQorCQlmaW5pc2hfd2FpdChza19zbGVlcCgmcngtPnNrKSwgJndhaXQpOworCQlnb3RvIHRyeV9hZ2FpbjsKIAl9CiAKLQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfVVNFUl9DQUxMX0lELAotCQkgICAgICAgdWxsZW4sICZjYWxsLT51c2VyX2NhbGxfSUQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGNvcHlfZXJyb3I7Ci0JQVNTRVJUKHRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSk7CisJLyogRmluZCB0aGUgbmV4dCBjYWxsIGFuZCBkZXF1ZXVlIGl0IGlmIHdlJ3JlIG5vdCBqdXN0IHBlZWtpbmcuICBJZiB3ZQorCSAqIGRvIGRlcXVldWUgaXQsIHRoYXQgY29tZXMgd2l0aCBhIHJlZiB0aGF0IHdlIHdpbGwgbmVlZCB0byByZWxlYXNlLgorCSAqLworCXdyaXRlX2xvY2tfYmgoJnJ4LT5yZWN2bXNnX2xvY2spOworCWwgPSByeC0+cmVjdm1zZ19xLm5leHQ7CisJY2FsbCA9IGxpc3RfZW50cnkobCwgc3RydWN0IHJ4cnBjX2NhbGwsIHJlY3Ztc2dfbGluayk7CisJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpCisJCWxpc3RfZGVsX2luaXQoJmNhbGwtPnJlY3Ztc2dfbGluayk7CisJZWxzZQorCQlyeHJwY19nZXRfY2FsbChjYWxsLCByeHJwY19jYWxsX2dvdCk7CisJd3JpdGVfdW5sb2NrX2JoKCZyeC0+cmVjdm1zZ19sb2NrKTsKIAotCXN3aXRjaCAoc2tiLT5tYXJrKSB7Ci0JY2FzZSBSWFJQQ19TS0JfTUFSS19EQVRBOgorCXRyYWNlX3J4cnBjX3JlY3Ztc2coY2FsbCwgcnhycGNfcmVjdm1zZ19kZXF1ZXVlLCAwLCAwLCAwLCAwKTsKKworCWlmICh0ZXN0X2JpdChSWFJQQ19DQUxMX1JFTEVBU0VELCAmY2FsbC0+ZmxhZ3MpKQogCQlCVUcoKTsKLQljYXNlIFJYUlBDX1NLQl9NQVJLX0ZJTkFMX0FDSzoKLQkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0FDSywgMCwgJmFib3J0X2NvZGUpOworCisJaWYgKHRlc3RfYml0KFJYUlBDX0NBTExfSEFTX1VTRVJJRCwgJmNhbGwtPmZsYWdzKSkgeworCQlpZiAoZmxhZ3MgJiBNU0dfQ01TR19DT01QQVQpIHsKKwkJCXVuc2lnbmVkIGludCBpZDMyID0gY2FsbC0+dXNlcl9jYWxsX0lEOworCisJCQlyZXQgPSBwdXRfY21zZyhtc2csIFNPTF9SWFJQQywgUlhSUENfVVNFUl9DQUxMX0lELAorCQkJCSAgICAgICBzaXplb2YodW5zaWduZWQgaW50KSwgJmlkMzIpOworCQl9IGVsc2UgeworCQkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX1VTRVJfQ0FMTF9JRCwKKwkJCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCQkJCSAgICAgICAmY2FsbC0+dXNlcl9jYWxsX0lEKTsKKwkJfQorCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCisJaWYgKG1zZy0+bXNnX25hbWUpIHsKKwkJc2l6ZV90IGxlbiA9IHNpemVvZihjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+c3J4KTsKKwkJbWVtY3B5KG1zZy0+bXNnX25hbWUsICZjYWxsLT5jb25uLT5wYXJhbXMucGVlci0+c3J4LCBsZW4pOworCQltc2ctPm1zZ19uYW1lbGVuID0gbGVuOworCX0KKworCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKKwljYXNlIFJYUlBDX0NBTExfU0VSVkVSX0FDQ0VQVElORzoKKwkJcmV0ID0gcnhycGNfcmVjdm1zZ19uZXdfY2FsbChyeCwgY2FsbCwgbXNnLCBmbGFncyk7CiAJCWJyZWFrOwotCWNhc2UgUlhSUENfU0tCX01BUktfQlVTWToKLQkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0JVU1ksIDAsICZhYm9ydF9jb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19TS0JfTUFSS19SRU1PVEVfQUJPUlQ6Ci0JCWFib3J0X2NvZGUgPSBjYWxsLT5yZW1vdGVfYWJvcnQ7Ci0JCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19BQk9SVCwgNCwgJmFib3J0X2NvZGUpOwotCQlicmVhazsKLQljYXNlIFJYUlBDX1NLQl9NQVJLX0xPQ0FMX0FCT1JUOgotCQlhYm9ydF9jb2RlID0gY2FsbC0+bG9jYWxfYWJvcnQ7Ci0JCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19BQk9SVCwgNCwgJmFib3J0X2NvZGUpOwotCQlicmVhazsKLQljYXNlIFJYUlBDX1NLQl9NQVJLX05FVF9FUlJPUjoKLQkJX2RlYnVnKCJSRUNWIE5FVCBFUlJPUiAlZCIsIHNwLT5lcnJvcik7Ci0JCWFib3J0X2NvZGUgPSBzcC0+ZXJyb3I7Ci0JCXJldCA9IHB1dF9jbXNnKG1zZywgU09MX1JYUlBDLCBSWFJQQ19ORVRfRVJST1IsIDQsICZhYm9ydF9jb2RlKTsKLQkJYnJlYWs7Ci0JY2FzZSBSWFJQQ19TS0JfTUFSS19MT0NBTF9FUlJPUjoKLQkJX2RlYnVnKCJSRUNWIExPQ0FMIEVSUk9SICVkIiwgc3AtPmVycm9yKTsKLQkJYWJvcnRfY29kZSA9IHNwLT5lcnJvcjsKLQkJcmV0ID0gcHV0X2Ntc2cobXNnLCBTT0xfUlhSUEMsIFJYUlBDX0xPQ0FMX0VSUk9SLCA0LAotCQkJICAgICAgICZhYm9ydF9jb2RlKTsKKwljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFk6CisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q6CisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDoKKwkJcmV0ID0gcnhycGNfcmVjdm1zZ19kYXRhKHNvY2ssIGNhbGwsIG1zZywgJm1zZy0+bXNnX2l0ZXIsIGxlbiwKKwkJCQkJIGZsYWdzLCAmY29waWVkKTsKKwkJaWYgKHJldCA9PSAtRUFHQUlOKQorCQkJcmV0ID0gMDsKKworCQlpZiAoYWZ0ZXIoY2FsbC0+cnhfdG9wLCBjYWxsLT5yeF9oYXJkX2FjaykgJiYKKwkJICAgIGNhbGwtPnJ4dHhfYnVmZmVyWyhjYWxsLT5yeF9oYXJkX2FjayArIDEpICYgUlhSUENfUlhUWF9CVUZGX01BU0tdKQorCQkJcnhycGNfbm90aWZ5X3NvY2tldChjYWxsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJfZXJyKCJVbmtub3duIHBhY2tldCBtYXJrICV1XG4iLCBza2ItPm1hcmspOwotCQlCVUcoKTsKKwkJcmV0ID0gMDsKIAkJYnJlYWs7CiAJfQogCiAJaWYgKHJldCA8IDApCi0JCWdvdG8gY29weV9lcnJvcjsKKwkJZ290byBlcnJvcjsKIAotdGVybWluYWxfbWVzc2FnZToKLQlfZGVidWcoInRlcm1pbmFsIik7Ci0JbXNnLT5tc2dfZmxhZ3MgJj0gfk1TR19NT1JFOwotCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19FT1I7Ci0KLQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgewotCQlfbmV0KCJmcmVlIHRlcm1pbmFsIHNrYiAlcCIsIHNrYik7Ci0JCWlmIChza2JfZGVxdWV1ZSgmcngtPnNrLnNrX3JlY2VpdmVfcXVldWUpICE9IHNrYikKLQkJCUJVRygpOwotCQlyeHJwY19mcmVlX3NrYihza2IpOwotCQlyeHJwY19yZW1vdmVfdXNlcl9JRChyeCwgY2FsbCk7CisJaWYgKGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJcmV0ID0gcnhycGNfcmVjdm1zZ190ZXJtKGNhbGwsIG1zZyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpCisJCQlyeHJwY19yZWxlYXNlX2NhbGwocngsIGNhbGwpOworCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfRU9SOworCQlyZXQgPSAxOwogCX0KIAotCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKLQlyeHJwY19wdXRfY2FsbChjYWxsKTsKLQlpZiAoY29udGludWVfY2FsbCkKLQkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7Ci0JX2xlYXZlKCIgPSAlZCIsIHJldCk7Ci0JcmV0dXJuIHJldDsKKwlpZiAocmV0ID09IDApCisJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19NT1JFOworCWVsc2UKKwkJbXNnLT5tc2dfZmxhZ3MgJj0gfk1TR19NT1JFOworCXJldCA9IGNvcGllZDsKIAotY29weV9lcnJvcjoKLQlfZGVidWcoImNvcHkgZXJyb3IiKTsKK2Vycm9yOgorCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKK2Vycm9yX25vX2NhbGw6CiAJcmVsZWFzZV9zb2NrKCZyeC0+c2spOwotCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwotCWlmIChjb250aW51ZV9jYWxsKQotCQlyeHJwY19wdXRfY2FsbChjb250aW51ZV9jYWxsKTsKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwl0cmFjZV9yeHJwY19yZWN2bXNnKGNhbGwsIHJ4cnBjX3JlY3Ztc2dfcmV0dXJuLCAwLCAwLCAwLCByZXQpOwogCXJldHVybiByZXQ7CiAKIHdhaXRfaW50ZXJydXB0ZWQ6CiAJcmV0ID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKIHdhaXRfZXJyb3I6CiAJZmluaXNoX3dhaXQoc2tfc2xlZXAoJnJ4LT5zayksICZ3YWl0KTsKLQlpZiAoY29udGludWVfY2FsbCkKLQkJcnhycGNfcHV0X2NhbGwoY29udGludWVfY2FsbCk7Ci0JaWYgKGNvcGllZCkKLQkJY29waWVkID0gcmV0OwotCV9sZWF2ZSgiID0gJWQgW3dhaXRmYWlsICVkXSIsIGNvcGllZCwgcmV0KTsKLQlyZXR1cm4gY29waWVkOwotCisJY2FsbCA9IE5VTEw7CisJZ290byBlcnJvcl9ub19jYWxsOwogfQogCiAvKioKLSAqIHJ4cnBjX2tlcm5lbF9pc19kYXRhX2xhc3QgLSBEZXRlcm1pbmUgaWYgZGF0YSBtZXNzYWdlIGlzIGxhc3Qgb25lCi0gKiBAc2tiOiBNZXNzYWdlIGhvbGRpbmcgZGF0YQorICogcnhycGNfa2VybmVsX3JlY3ZfZGF0YSAtIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gcmVjZWl2ZSBkYXRhL2luZm8KKyAqIEBzb2NrOiBUaGUgc29ja2V0IHRoYXQgdGhlIGNhbGwgZXhpc3RzIG9uCisgKiBAY2FsbDogVGhlIGNhbGwgdG8gc2VuZCBkYXRhIHRocm91Z2gKKyAqIEBidWY6IFRoZSBidWZmZXIgdG8gcmVjZWl2ZSBpbnRvCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgaW5jbHVkaW5nIGRhdGEgYWxyZWFkeSByZWFkCisgKiBAX29mZnNldDogVGhlIHJ1bm5pbmcgb2Zmc2V0IGludG8gdGhlIGJ1ZmZlci4KKyAqIEB3YW50X21vcmU6IFRydWUgaWYgbW9yZSBkYXRhIGlzIGV4cGVjdGVkIHRvIGJlIHJlYWQKKyAqIEBfYWJvcnQ6IFdoZXJlIHRoZSBhYm9ydCBjb2RlIGlzIHN0b3JlZCBpZiAtRUNPTk5BQk9SVEVEIGlzIHJldHVybmVkCiAgKgotICogRGV0ZXJtaW5lIGlmIGRhdGEgbWVzc2FnZSBpcyBsYXN0IG9uZSBmb3IgdGhlIHBhcmVudCBjYWxsLgotICovCi1ib29sIHJ4cnBjX2tlcm5lbF9pc19kYXRhX2xhc3Qoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7Ci0KLQlBU1NFUlRDTVAoc2tiLT5tYXJrLCA9PSwgUlhSUENfU0tCX01BUktfREFUQSk7Ci0KLQlyZXR1cm4gc3AtPmhkci5mbGFncyAmIFJYUlBDX0xBU1RfUEFDS0VUOwotfQotCi1FWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9pc19kYXRhX2xhc3QpOwotCi0vKioKLSAqIHJ4cnBjX2tlcm5lbF9nZXRfYWJvcnRfY29kZSAtIEdldCB0aGUgYWJvcnQgY29kZSBmcm9tIGFuIFJ4UlBDIGFib3J0IG1lc3NhZ2UKLSAqIEBza2I6IE1lc3NhZ2UgaW5kaWNhdGluZyBhbiBhYm9ydAorICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byByZWNlaXZlIGRhdGEgYW5kIHBpY2sgdXAgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgKiBzdGF0ZSBvZiBhIGNhbGwuICBSZXR1cm5zIDAgaWYgZ290IHdoYXQgd2FzIGFza2VkIGZvciBhbmQgdGhlcmUncyBtb3JlCisgKiBhdmFpbGFibGUsIDEgaWYgd2UgZ290IHdoYXQgd2FzIGFza2VkIGZvciBhbmQgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YQorICogYW5kIC1FQUdBSU4gaWYgd2UgbmVlZCBtb3JlIGRhdGEuCiAgKgotICogR2V0IHRoZSBhYm9ydCBjb2RlIGZyb20gYW4gUnhSUEMgYWJvcnQgbWVzc2FnZS4KKyAqIE5vdGUgdGhhdCB3ZSBtYXkgcmV0dXJuIC1FQUdBSU4gdG8gZHJhaW4gZW1wdHkgcGFja2V0cyBhdCB0aGUgZW5kIG9mIHRoZQorICogZGF0YSwgZXZlbiBpZiB3ZSd2ZSBhbHJlYWR5IGNvcGllZCBvdmVyIHRoZSByZXF1ZXN0ZWQgZGF0YS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgdGhlIGFtb3VudCBpdCB0cmFuc2ZlcnMgdG8gKl9vZmZzZXQsIHNvIHRoaXMgc2hvdWxkIGJlCisgKiBwcmVjbGVhcmVkIGFzIGFwcHJvcHJpYXRlLiAgTm90ZSB0aGF0IHRoZSBhbW91bnQgcmVtYWluaW5nIGluIHRoZSBidWZmZXIgaXMKKyAqIHRha2VuIHRvIGJlIHNpemUgLSAqX29mZnNldC4KKyAqCisgKiAqX2Fib3J0IHNob3VsZCBhbHNvIGJlIGluaXRpYWxpc2VkIHRvIDAuCiAgKi8KLXUzMiByeHJwY19rZXJuZWxfZ2V0X2Fib3J0X2NvZGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCByeHJwY19rZXJuZWxfcmVjdl9kYXRhKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJICAgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSwgc2l6ZV90ICpfb2Zmc2V0LAorCQkJICAgYm9vbCB3YW50X21vcmUsIHUzMiAqX2Fib3J0KQogewotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlzdHJ1Y3QgaW92X2l0ZXIgaXRlcjsKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisJaW50IHJldDsKIAotCXN3aXRjaCAoc2tiLT5tYXJrKSB7Ci0JY2FzZSBSWFJQQ19TS0JfTUFSS19SRU1PVEVfQUJPUlQ6Ci0JCXJldHVybiBzcC0+Y2FsbC0+cmVtb3RlX2Fib3J0OwotCWNhc2UgUlhSUENfU0tCX01BUktfTE9DQUxfQUJPUlQ6Ci0JCXJldHVybiBzcC0+Y2FsbC0+bG9jYWxfYWJvcnQ7CisJX2VudGVyKCJ7JWQsJXN9LCV6dS8lenUsJWQiLAorCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdLAorCSAgICAgICAqX29mZnNldCwgc2l6ZSwgd2FudF9tb3JlKTsKKworCUFTU0VSVENNUCgqX29mZnNldCwgPD0sIHNpemUpOworCUFTU0VSVENNUChjYWxsLT5zdGF0ZSwgIT0sIFJYUlBDX0NBTExfU0VSVkVSX0FDQ0VQVElORyk7CisKKwlpb3YuaW92X2Jhc2UgPSBidWYgKyAqX29mZnNldDsKKwlpb3YuaW92X2xlbiA9IHNpemUgLSAqX29mZnNldDsKKwlpb3ZfaXRlcl9rdmVjKCZpdGVyLCBJVEVSX0tWRUMgfCBSRUFELCAmaW92LCAxLCBzaXplIC0gKl9vZmZzZXQpOworCisJbG9ja19zb2NrKHNvY2stPnNrKTsKKworCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKKwljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFk6CisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q6CisJY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9BQ0tfUkVRVUVTVDoKKwkJcmV0ID0gcnhycGNfcmVjdm1zZ19kYXRhKHNvY2ssIGNhbGwsIE5VTEwsICZpdGVyLCBzaXplLCAwLAorCQkJCQkgX29mZnNldCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJLyogV2UgY2FuIG9ubHkgcmVhY2ggaGVyZSB3aXRoIGEgcGFydGlhbGx5IGZ1bGwgYnVmZmVyIGlmIHdlCisJCSAqIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBkYXRhLiAgV2UgbXVzdCBvdGhlcndpc2UgaGF2ZSBhCisJCSAqIGZ1bGwgYnVmZmVyIG9yIGhhdmUgYmVlbiBnaXZlbiAtRUFHQUlOLgorCQkgKi8KKwkJaWYgKHJldCA9PSAxKSB7CisJCQlpZiAoKl9vZmZzZXQgPCBzaXplKQorCQkJCWdvdG8gc2hvcnRfZGF0YTsKKwkJCWlmICghd2FudF9tb3JlKQorCQkJCWdvdG8gcmVhZF9waGFzZV9jb21wbGV0ZTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmICghd2FudF9tb3JlKQorCQkJZ290byBleGNlc3NfZGF0YTsKKwkJZ290byBvdXQ7CisKKwljYXNlIFJYUlBDX0NBTExfQ09NUExFVEU6CisJCWdvdG8gY2FsbF9jb21wbGV0ZTsKKwogCWRlZmF1bHQ6Ci0JCUJVRygpOworCQlyZXQgPSAtRUlOUFJPR1JFU1M7CisJCWdvdG8gb3V0OwogCX0KKworcmVhZF9waGFzZV9jb21wbGV0ZToKKwlyZXQgPSAxOworb3V0OgorCXJlbGVhc2Vfc29jayhzb2NrLT5zayk7CisJX2xlYXZlKCIgPSAlZCBbJXp1LCVkXSIsIHJldCwgKl9vZmZzZXQsICpfYWJvcnQpOworCXJldHVybiByZXQ7CisKK3Nob3J0X2RhdGE6CisJcmV0ID0gLUVCQURNU0c7CisJZ290byBvdXQ7CitleGNlc3NfZGF0YToKKwlyZXQgPSAtRU1TR1NJWkU7CisJZ290byBvdXQ7CitjYWxsX2NvbXBsZXRlOgorCSpfYWJvcnQgPSBjYWxsLT5hYm9ydF9jb2RlOworCXJldCA9IGNhbGwtPmVycm9yOworCWlmIChjYWxsLT5jb21wbGV0aW9uID09IFJYUlBDX0NBTExfU1VDQ0VFREVEKSB7CisJCXJldCA9IDE7CisJCWlmIChzaXplID4gMCkKKwkJCXJldCA9IC1FQ09OTlJFU0VUOworCX0KKwlnb3RvIG91dDsKIH0KLQotRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfZ2V0X2Fib3J0X2NvZGUpOwotCi0vKioKLSAqIHJ4cnBjX2tlcm5lbF9nZXRfZXJyb3IgLSBHZXQgdGhlIGVycm9yIG51bWJlciBmcm9tIGFuIFJ4UlBDIGVycm9yIG1lc3NhZ2UKLSAqIEBza2I6IE1lc3NhZ2UgaW5kaWNhdGluZyBhbiBlcnJvcgotICoKLSAqIEdldCB0aGUgZXJyb3IgbnVtYmVyIGZyb20gYW4gUnhSUEMgZXJyb3IgbWVzc2FnZS4KLSAqLwotaW50IHJ4cnBjX2tlcm5lbF9nZXRfZXJyb3JfbnVtYmVyKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwotCi0JcmV0dXJuIHNwLT5lcnJvcjsKLX0KLQotRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfZ2V0X2Vycm9yX251bWJlcik7CitFWFBPUlRfU1lNQk9MKHJ4cnBjX2tlcm5lbF9yZWN2X2RhdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3J4a2FkLmMgYi9uZXQvcnhycGMvcnhrYWQuYwppbmRleCA2M2FmYTllLi42MjdhYmVkIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvcnhrYWQuYworKysgYi9uZXQvcnhycGMvcnhrYWQuYwpAQCAtODAsMTIgKzgwLDEwIEBACiAJY2FzZSBSWFJQQ19TRUNVUklUWV9BVVRIOgogCQljb25uLT5zaXplX2FsaWduID0gODsKIAkJY29ubi0+c2VjdXJpdHlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnhrYWRfbGV2ZWwxX2hkcik7Ci0JCWNvbm4tPmhlYWRlcl9zaXplICs9IHNpemVvZihzdHJ1Y3QgcnhrYWRfbGV2ZWwxX2hkcik7CiAJCWJyZWFrOwogCWNhc2UgUlhSUENfU0VDVVJJVFlfRU5DUllQVDoKIAkJY29ubi0+c2l6ZV9hbGlnbiA9IDg7CiAJCWNvbm4tPnNlY3VyaXR5X3NpemUgPSBzaXplb2Yoc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIpOwotCQljb25uLT5oZWFkZXJfc2l6ZSArPSBzaXplb2Yoc3RydWN0IHJ4a2FkX2xldmVsMl9oZHIpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUtFWVJFSkVDVEVEOwpAQCAtMTYxLDcgKzE1OSw3IEBACiAKIAlfZW50ZXIoIiIpOwogCi0JY2hlY2sgPSBzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcjsKKwljaGVjayA9IHNwLT5oZHIuc2VxIF4gY2FsbC0+Y2FsbF9pZDsKIAlkYXRhX3NpemUgfD0gKHUzMiljaGVjayA8PCAxNjsKIAogCWhkci5kYXRhX3NpemUgPSBodG9ubChkYXRhX3NpemUpOwpAQCAtMjA1LDcgKzIwMyw3IEBACiAKIAlfZW50ZXIoIiIpOwogCi0JY2hlY2sgPSBzcC0+aGRyLnNlcSBeIHNwLT5oZHIuY2FsbE51bWJlcjsKKwljaGVjayA9IHNwLT5oZHIuc2VxIF4gY2FsbC0+Y2FsbF9pZDsKIAogCXJ4a2hkci5kYXRhX3NpemUgPSBodG9ubChkYXRhX3NpemUgfCAodTMyKWNoZWNrIDw8IDE2KTsKIAlyeGtoZHIuY2hlY2tzdW0gPSAwOwpAQCAtMjc1LDkgKzI3Myw5IEBACiAJbWVtY3B5KCZpdiwgY2FsbC0+Y29ubi0+Y3N1bV9pdi54LCBzaXplb2YoaXYpKTsKIAogCS8qIGNhbGN1bGF0ZSB0aGUgc2VjdXJpdHkgY2hlY2tzdW0gKi8KLQl4ID0gY2FsbC0+Y2hhbm5lbCA8PCAoMzIgLSBSWFJQQ19DSURTSElGVCk7CisJeCA9IChjYWxsLT5jaWQgJiBSWFJQQ19DSEFOTkVMTUFTSykgPDwgKDMyIC0gUlhSUENfQ0lEU0hJRlQpOwogCXggfD0gc3AtPmhkci5zZXEgJiAweDNmZmZmZmZmOwotCWNhbGwtPmNyeXB0b19idWZbMF0gPSBodG9ubChzcC0+aGRyLmNhbGxOdW1iZXIpOworCWNhbGwtPmNyeXB0b19idWZbMF0gPSBodG9ubChjYWxsLT5jYWxsX2lkKTsKIAljYWxsLT5jcnlwdG9fYnVmWzFdID0gaHRvbmwoeCk7CiAKIAlzZ19pbml0X29uZSgmc2csIGNhbGwtPmNyeXB0b19idWYsIDgpOwpAQCAtMzE2LDEyICszMTQsMTEgQEAKIC8qCiAgKiBkZWNyeXB0IHBhcnRpYWwgZW5jcnlwdGlvbiBvbiBhIHBhY2tldCAobGV2ZWwgMSBzZWN1cml0eSkKICAqLwotc3RhdGljIGludCByeGthZF92ZXJpZnlfcGFja2V0X2F1dGgoY29uc3Qgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIHUzMiAqX2Fib3J0X2NvZGUpCitzdGF0aWMgaW50IHJ4a2FkX3ZlcmlmeV9wYWNrZXRfMShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbiwKKwkJCQkgcnhycGNfc2VxX3Qgc2VxKQogewogCXN0cnVjdCByeGthZF9sZXZlbDFfaGRyIHNlY2hkcjsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOwogCVNLQ0lQSEVSX1JFUVVFU1RfT05fU1RBQ0socmVxLCBjYWxsLT5jb25uLT5jaXBoZXIpOwogCXN0cnVjdCByeHJwY19jcnlwdCBpdjsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMTZdOwpAQCAtMzMyLDE1ICszMjksMjAgQEAKIAogCV9lbnRlcigiIik7CiAKLQlzcCA9IHJ4cnBjX3NrYihza2IpOworCWlmIChsZW4gPCA4KSB7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlYxSCIsIGNhbGwsIHNlcSwgUlhLQURTRUFMRURJTkNPTiwgRVBST1RPKTsKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKwl9CiAKLQkvKiB3ZSB3YW50IHRvIGRlY3J5cHQgdGhlIHNrYnVmZiBpbi1wbGFjZSAqLworCS8qIERlY3J5cHQgdGhlIHNrYnVmZiBpbi1wbGFjZS4gIFRPRE86IFdlIHJlYWxseSB3YW50IHRvIGRlY3J5cHQKKwkgKiBkaXJlY3RseSBpbnRvIHRoZSB0YXJnZXQgYnVmZmVyLgorCSAqLwogCW5zZyA9IHNrYl9jb3dfZGF0YShza2IsIDAsICZ0cmFpbGVyKTsKIAlpZiAobnNnIDwgMCB8fCBuc2cgPiAxNikKIAkJZ290byBub21lbTsKIAogCXNnX2luaXRfdGFibGUoc2csIG5zZyk7Ci0Jc2tiX3RvX3NndmVjKHNrYiwgc2csIDAsIDgpOworCXNrYl90b19zZ3ZlYyhza2IsIHNnLCBvZmZzZXQsIDgpOwogCiAJLyogc3RhcnQgdGhlIGRlY3J5cHRpb24gYWZyZXNoICovCiAJbWVtc2V0KCZpdiwgMCwgc2l6ZW9mKGl2KSk7CkBAIC0zNTEsMzUgKzM1MywzNSBAQAogCWNyeXB0b19za2NpcGhlcl9kZWNyeXB0KHJlcSk7CiAJc2tjaXBoZXJfcmVxdWVzdF96ZXJvKHJlcSk7CiAKLQkvKiByZW1vdmUgdGhlIGRlY3J5cHRlZCBwYWNrZXQgbGVuZ3RoICovCi0JaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmc2VjaGRyLCBzaXplb2Yoc2VjaGRyKSkgPCAwKQotCQlnb3RvIGRhdGFsZW5fZXJyb3I7Ci0JaWYgKCFza2JfcHVsbChza2IsIHNpemVvZihzZWNoZHIpKSkKLQkJQlVHKCk7CisJLyogRXh0cmFjdCB0aGUgZGVjcnlwdGVkIHBhY2tldCBsZW5ndGggKi8KKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG9mZnNldCwgJnNlY2hkciwgc2l6ZW9mKHNlY2hkcikpIDwgMCkgeworCQlyeHJwY19hYm9ydF9jYWxsKCJYVjEiLCBjYWxsLCBzZXEsIFJYS0FEREFUQUxFTiwgRVBST1RPKTsKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKwl9CisJb2Zmc2V0ICs9IHNpemVvZihzZWNoZHIpOworCWxlbiAtPSBzaXplb2Yoc2VjaGRyKTsKIAogCWJ1ZiA9IG50b2hsKHNlY2hkci5kYXRhX3NpemUpOwogCWRhdGFfc2l6ZSA9IGJ1ZiAmIDB4ZmZmZjsKIAogCWNoZWNrID0gYnVmID4+IDE2OwotCWNoZWNrIF49IHNwLT5oZHIuc2VxIF4gc3AtPmhkci5jYWxsTnVtYmVyOworCWNoZWNrIF49IHNlcSBeIGNhbGwtPmNhbGxfaWQ7CiAJY2hlY2sgJj0gMHhmZmZmOwogCWlmIChjaGVjayAhPSAwKSB7Ci0JCSpfYWJvcnRfY29kZSA9IFJYS0FEU0VBTEVESU5DT047CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlYxQyIsIGNhbGwsIHNlcSwgUlhLQURTRUFMRURJTkNPTiwgRVBST1RPKTsKIAkJZ290byBwcm90b2NvbF9lcnJvcjsKIAl9CiAKLQkvKiBzaG9ydGVuIHRoZSBwYWNrZXQgdG8gcmVtb3ZlIHRoZSBwYWRkaW5nICovCi0JaWYgKGRhdGFfc2l6ZSA+IHNrYi0+bGVuKQotCQlnb3RvIGRhdGFsZW5fZXJyb3I7Ci0JZWxzZSBpZiAoZGF0YV9zaXplIDwgc2tiLT5sZW4pCi0JCXNrYi0+bGVuID0gZGF0YV9zaXplOworCWlmIChkYXRhX3NpemUgPiBsZW4pIHsKKwkJcnhycGNfYWJvcnRfY2FsbCgiVjFMIiwgY2FsbCwgc2VxLCBSWEtBRERBVEFMRU4sIEVQUk9UTyk7CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQogCiAJX2xlYXZlKCIgPSAwIFtkbGVuPSV4XSIsIGRhdGFfc2l6ZSk7CiAJcmV0dXJuIDA7CiAKLWRhdGFsZW5fZXJyb3I6Ci0JKl9hYm9ydF9jb2RlID0gUlhLQUREQVRBTEVOOwogcHJvdG9jb2xfZXJyb3I6CisJcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCk7CiAJX2xlYXZlKCIgPSAtRVBST1RPIik7CiAJcmV0dXJuIC1FUFJPVE87CiAKQEAgLTM5MSwxMyArMzkzLDEyIEBACiAvKgogICogd2hvbGx5IGRlY3J5cHQgYSBwYWNrZXQgKGxldmVsIDIgc2VjdXJpdHkpCiAgKi8KLXN0YXRpYyBpbnQgcnhrYWRfdmVyaWZ5X3BhY2tldF9lbmNyeXB0KGNvbnN0IHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAotCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgICB1MzIgKl9hYm9ydF9jb2RlKQorc3RhdGljIGludCByeGthZF92ZXJpZnlfcGFja2V0XzIoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sCisJCQkJIHJ4cnBjX3NlcV90IHNlcSkKIHsKIAljb25zdCBzdHJ1Y3QgcnhycGNfa2V5X3Rva2VuICp0b2tlbjsKIAlzdHJ1Y3QgcnhrYWRfbGV2ZWwyX2hkciBzZWNoZHI7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKIAlTS0NJUEhFUl9SRVFVRVNUX09OX1NUQUNLKHJlcSwgY2FsbC0+Y29ubi0+Y2lwaGVyKTsKIAlzdHJ1Y3QgcnhycGNfY3J5cHQgaXY7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IF9zZ1s0XSwgKnNnOwpAQCAtNDA4LDkgKzQwOSwxNCBAQAogCiAJX2VudGVyKCIseyVkfSIsIHNrYi0+bGVuKTsKIAotCXNwID0gcnhycGNfc2tiKHNrYik7CisJaWYgKGxlbiA8IDgpIHsKKwkJcnhycGNfYWJvcnRfY2FsbCgiVjJIIiwgY2FsbCwgc2VxLCBSWEtBRFNFQUxFRElOQ09OLCBFUFJPVE8pOworCQlnb3RvIHByb3RvY29sX2Vycm9yOworCX0KIAotCS8qIHdlIHdhbnQgdG8gZGVjcnlwdCB0aGUgc2tidWZmIGluLXBsYWNlICovCisJLyogRGVjcnlwdCB0aGUgc2tidWZmIGluLXBsYWNlLiAgVE9ETzogV2UgcmVhbGx5IHdhbnQgdG8gZGVjcnlwdAorCSAqIGRpcmVjdGx5IGludG8gdGhlIHRhcmdldCBidWZmZXIuCisJICovCiAJbnNnID0gc2tiX2Nvd19kYXRhKHNrYiwgMCwgJnRyYWlsZXIpOwogCWlmIChuc2cgPCAwKQogCQlnb3RvIG5vbWVtOwpAQCAtNDIzLDcgKzQyOSw3IEBACiAJfQogCiAJc2dfaW5pdF90YWJsZShzZywgbnNnKTsKLQlza2JfdG9fc2d2ZWMoc2tiLCBzZywgMCwgc2tiLT5sZW4pOworCXNrYl90b19zZ3ZlYyhza2IsIHNnLCBvZmZzZXQsIGxlbik7CiAKIAkvKiBkZWNyeXB0IGZyb20gdGhlIHNlc3Npb24ga2V5ICovCiAJdG9rZW4gPSBjYWxsLT5jb25uLT5wYXJhbXMua2V5LT5wYXlsb2FkLmRhdGFbMF07CkBAIC00MzEsNDEgKzQzNyw0MSBAQAogCiAJc2tjaXBoZXJfcmVxdWVzdF9zZXRfdGZtKHJlcSwgY2FsbC0+Y29ubi0+Y2lwaGVyKTsKIAlza2NpcGhlcl9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIDAsIE5VTEwsIE5VTEwpOwotCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2csIHNnLCBza2ItPmxlbiwgaXYueCk7CisJc2tjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBzZywgc2csIGxlbiwgaXYueCk7CiAJY3J5cHRvX3NrY2lwaGVyX2RlY3J5cHQocmVxKTsKIAlza2NpcGhlcl9yZXF1ZXN0X3plcm8ocmVxKTsKIAlpZiAoc2cgIT0gX3NnKQogCQlrZnJlZShzZyk7CiAKLQkvKiByZW1vdmUgdGhlIGRlY3J5cHRlZCBwYWNrZXQgbGVuZ3RoICovCi0JaWYgKHNrYl9jb3B5X2JpdHMoc2tiLCAwLCAmc2VjaGRyLCBzaXplb2Yoc2VjaGRyKSkgPCAwKQotCQlnb3RvIGRhdGFsZW5fZXJyb3I7Ci0JaWYgKCFza2JfcHVsbChza2IsIHNpemVvZihzZWNoZHIpKSkKLQkJQlVHKCk7CisJLyogRXh0cmFjdCB0aGUgZGVjcnlwdGVkIHBhY2tldCBsZW5ndGggKi8KKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG9mZnNldCwgJnNlY2hkciwgc2l6ZW9mKHNlY2hkcikpIDwgMCkgeworCQlyeHJwY19hYm9ydF9jYWxsKCJYVjIiLCBjYWxsLCBzZXEsIFJYS0FEREFUQUxFTiwgRVBST1RPKTsKKwkJZ290byBwcm90b2NvbF9lcnJvcjsKKwl9CisJb2Zmc2V0ICs9IHNpemVvZihzZWNoZHIpOworCWxlbiAtPSBzaXplb2Yoc2VjaGRyKTsKIAogCWJ1ZiA9IG50b2hsKHNlY2hkci5kYXRhX3NpemUpOwogCWRhdGFfc2l6ZSA9IGJ1ZiAmIDB4ZmZmZjsKIAogCWNoZWNrID0gYnVmID4+IDE2OwotCWNoZWNrIF49IHNwLT5oZHIuc2VxIF4gc3AtPmhkci5jYWxsTnVtYmVyOworCWNoZWNrIF49IHNlcSBeIGNhbGwtPmNhbGxfaWQ7CiAJY2hlY2sgJj0gMHhmZmZmOwogCWlmIChjaGVjayAhPSAwKSB7Ci0JCSpfYWJvcnRfY29kZSA9IFJYS0FEU0VBTEVESU5DT047CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlYyQyIsIGNhbGwsIHNlcSwgUlhLQURTRUFMRURJTkNPTiwgRVBST1RPKTsKIAkJZ290byBwcm90b2NvbF9lcnJvcjsKIAl9CiAKLQkvKiBzaG9ydGVuIHRoZSBwYWNrZXQgdG8gcmVtb3ZlIHRoZSBwYWRkaW5nICovCi0JaWYgKGRhdGFfc2l6ZSA+IHNrYi0+bGVuKQotCQlnb3RvIGRhdGFsZW5fZXJyb3I7Ci0JZWxzZSBpZiAoZGF0YV9zaXplIDwgc2tiLT5sZW4pCi0JCXNrYi0+bGVuID0gZGF0YV9zaXplOworCWlmIChkYXRhX3NpemUgPiBsZW4pIHsKKwkJcnhycGNfYWJvcnRfY2FsbCgiVjJMIiwgY2FsbCwgc2VxLCBSWEtBRERBVEFMRU4sIEVQUk9UTyk7CisJCWdvdG8gcHJvdG9jb2xfZXJyb3I7CisJfQogCiAJX2xlYXZlKCIgPSAwIFtkbGVuPSV4XSIsIGRhdGFfc2l6ZSk7CiAJcmV0dXJuIDA7CiAKLWRhdGFsZW5fZXJyb3I6Ci0JKl9hYm9ydF9jb2RlID0gUlhLQUREQVRBTEVOOwogcHJvdG9jb2xfZXJyb3I6CisJcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCk7CiAJX2xlYXZlKCIgPSAtRVBST1RPIik7CiAJcmV0dXJuIC1FUFJPVE87CiAKQEAgLTQ3NSw0MCArNDgxLDMxIEBACiB9CiAKIC8qCi0gKiB2ZXJpZnkgdGhlIHNlY3VyaXR5IG9uIGEgcmVjZWl2ZWQgcGFja2V0CisgKiBWZXJpZnkgdGhlIHNlY3VyaXR5IG9uIGEgcmVjZWl2ZWQgcGFja2V0IG9yIHN1YnBhY2tldCAoaWYgcGFydCBvZiBhCisgKiBqdW1ibyBwYWNrZXQpLgogICovCi1zdGF0aWMgaW50IHJ4a2FkX3ZlcmlmeV9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICB1MzIgKl9hYm9ydF9jb2RlKQorc3RhdGljIGludCByeGthZF92ZXJpZnlfcGFja2V0KHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4sCisJCQkgICAgICAgcnhycGNfc2VxX3Qgc2VxLCB1MTYgZXhwZWN0ZWRfY2tzdW0pCiB7CiAJU0tDSVBIRVJfUkVRVUVTVF9PTl9TVEFDSyhyZXEsIGNhbGwtPmNvbm4tPmNpcGhlcik7Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcDsKIAlzdHJ1Y3QgcnhycGNfY3J5cHQgaXY7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwogCXUxNiBja3N1bTsKIAl1MzIgeCwgeTsKLQlpbnQgcmV0OwotCi0Jc3AgPSByeHJwY19za2Ioc2tiKTsKIAogCV9lbnRlcigieyVkeyV4fX0seyMldX0iLAotCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwga2V5X3NlcmlhbChjYWxsLT5jb25uLT5wYXJhbXMua2V5KSwgc3AtPmhkci5zZXEpOworCSAgICAgICBjYWxsLT5kZWJ1Z19pZCwga2V5X3NlcmlhbChjYWxsLT5jb25uLT5wYXJhbXMua2V5KSwgc2VxKTsKIAogCWlmICghY2FsbC0+Y29ubi0+Y2lwaGVyKQogCQlyZXR1cm4gMDsKIAotCWlmIChzcC0+aGRyLnNlY3VyaXR5SW5kZXggIT0gUlhSUENfU0VDVVJJVFlfUlhLQUQpIHsKLQkJKl9hYm9ydF9jb2RlID0gUlhLQURJTkNPTlNJU1RFTkNZOwotCQlfbGVhdmUoIiA9IC1FUFJPVE8gW25vdCByeGthZF0iKTsKLQkJcmV0dXJuIC1FUFJPVE87Ci0JfQotCiAJLyogY29udGludWUgZW5jcnlwdGluZyBmcm9tIHdoZXJlIHdlIGxlZnQgb2ZmICovCiAJbWVtY3B5KCZpdiwgY2FsbC0+Y29ubi0+Y3N1bV9pdi54LCBzaXplb2YoaXYpKTsKIAogCS8qIHZhbGlkYXRlIHRoZSBzZWN1cml0eSBjaGVja3N1bSAqLwotCXggPSBjYWxsLT5jaGFubmVsIDw8ICgzMiAtIFJYUlBDX0NJRFNISUZUKTsKLQl4IHw9IHNwLT5oZHIuc2VxICYgMHgzZmZmZmZmZjsKKwl4ID0gKGNhbGwtPmNpZCAmIFJYUlBDX0NIQU5ORUxNQVNLKSA8PCAoMzIgLSBSWFJQQ19DSURTSElGVCk7CisJeCB8PSBzZXEgJiAweDNmZmZmZmZmOwogCWNhbGwtPmNyeXB0b19idWZbMF0gPSBodG9ubChjYWxsLT5jYWxsX2lkKTsKIAljYWxsLT5jcnlwdG9fYnVmWzFdID0gaHRvbmwoeCk7CiAKQEAgLTUyNCwyOSArNTIxLDY5IEBACiAJaWYgKGNrc3VtID09IDApCiAJCWNrc3VtID0gMTsgLyogemVybyBjaGVja3N1bXMgYXJlIG5vdCBwZXJtaXR0ZWQgKi8KIAotCWlmIChzcC0+aGRyLmNrc3VtICE9IGNrc3VtKSB7Ci0JCSpfYWJvcnRfY29kZSA9IFJYS0FEU0VBTEVESU5DT047CisJaWYgKGNrc3VtICE9IGV4cGVjdGVkX2Nrc3VtKSB7CisJCXJ4cnBjX2Fib3J0X2NhbGwoIlZDSyIsIGNhbGwsIHNlcSwgUlhLQURTRUFMRURJTkNPTiwgRVBST1RPKTsKKwkJcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCk7CiAJCV9sZWF2ZSgiID0gLUVQUk9UTyBbY3N1bSBmYWlsZWRdIik7CiAJCXJldHVybiAtRVBST1RPOwogCX0KIAogCXN3aXRjaCAoY2FsbC0+Y29ubi0+cGFyYW1zLnNlY3VyaXR5X2xldmVsKSB7CiAJY2FzZSBSWFJQQ19TRUNVUklUWV9QTEFJTjoKLQkJcmV0ID0gMDsKLQkJYnJlYWs7CisJCXJldHVybiAwOwogCWNhc2UgUlhSUENfU0VDVVJJVFlfQVVUSDoKLQkJcmV0ID0gcnhrYWRfdmVyaWZ5X3BhY2tldF9hdXRoKGNhbGwsIHNrYiwgX2Fib3J0X2NvZGUpOwotCQlicmVhazsKKwkJcmV0dXJuIHJ4a2FkX3ZlcmlmeV9wYWNrZXRfMShjYWxsLCBza2IsIG9mZnNldCwgbGVuLCBzZXEpOwogCWNhc2UgUlhSUENfU0VDVVJJVFlfRU5DUllQVDoKLQkJcmV0ID0gcnhrYWRfdmVyaWZ5X3BhY2tldF9lbmNyeXB0KGNhbGwsIHNrYiwgX2Fib3J0X2NvZGUpOwotCQlicmVhazsKKwkJcmV0dXJuIHJ4a2FkX3ZlcmlmeV9wYWNrZXRfMihjYWxsLCBza2IsIG9mZnNldCwgbGVuLCBzZXEpOwogCWRlZmF1bHQ6Ci0JCXJldCA9IC1FTk9BTk87Ci0JCWJyZWFrOworCQlyZXR1cm4gLUVOT0FOTzsKIAl9Cit9CiAKLQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gcmV0OworLyoKKyAqIExvY2F0ZSB0aGUgZGF0YSBjb250YWluZWQgaW4gYSBwYWNrZXQgdGhhdCB3YXMgcGFydGlhbGx5IGVuY3J5cHRlZC4KKyAqLworc3RhdGljIHZvaWQgcnhrYWRfbG9jYXRlX2RhdGFfMShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQl1bnNpZ25lZCBpbnQgKl9vZmZzZXQsIHVuc2lnbmVkIGludCAqX2xlbikKK3sKKwlzdHJ1Y3QgcnhrYWRfbGV2ZWwxX2hkciBzZWNoZHI7CisKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsICpfb2Zmc2V0LCAmc2VjaGRyLCBzaXplb2Yoc2VjaGRyKSkgPCAwKQorCQlCVUcoKTsKKwkqX29mZnNldCArPSBzaXplb2Yoc2VjaGRyKTsKKwkqX2xlbiA9IG50b2hsKHNlY2hkci5kYXRhX3NpemUpICYgMHhmZmZmOworfQorCisvKgorICogTG9jYXRlIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiBhIHBhY2tldCB0aGF0IHdhcyBjb21wbGV0ZWx5IGVuY3J5cHRlZC4KKyAqLworc3RhdGljIHZvaWQgcnhrYWRfbG9jYXRlX2RhdGFfMihzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQl1bnNpZ25lZCBpbnQgKl9vZmZzZXQsIHVuc2lnbmVkIGludCAqX2xlbikKK3sKKwlzdHJ1Y3QgcnhrYWRfbGV2ZWwyX2hkciBzZWNoZHI7CisKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsICpfb2Zmc2V0LCAmc2VjaGRyLCBzaXplb2Yoc2VjaGRyKSkgPCAwKQorCQlCVUcoKTsKKwkqX29mZnNldCArPSBzaXplb2Yoc2VjaGRyKTsKKwkqX2xlbiA9IG50b2hsKHNlY2hkci5kYXRhX3NpemUpICYgMHhmZmZmOworfQorCisvKgorICogTG9jYXRlIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiBhbiBhbHJlYWR5IGRlY3J5cHRlZCBwYWNrZXQuCisgKi8KK3N0YXRpYyB2b2lkIHJ4a2FkX2xvY2F0ZV9kYXRhKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpfb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKl9sZW4pCit7CisJc3dpdGNoIChjYWxsLT5jb25uLT5wYXJhbXMuc2VjdXJpdHlfbGV2ZWwpIHsKKwljYXNlIFJYUlBDX1NFQ1VSSVRZX0FVVEg6CisJCXJ4a2FkX2xvY2F0ZV9kYXRhXzEoY2FsbCwgc2tiLCBfb2Zmc2V0LCBfbGVuKTsKKwkJcmV0dXJuOworCWNhc2UgUlhSUENfU0VDVVJJVFlfRU5DUllQVDoKKwkJcnhrYWRfbG9jYXRlX2RhdGFfMihjYWxsLCBza2IsIF9vZmZzZXQsIF9sZW4pOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KIH0KIAogLyoKQEAgLTcxNiw3ICs3NTMsNyBAQAogCXN0cnVjdCByeGthZF9jaGFsbGVuZ2UgY2hhbGxlbmdlOwogCXN0cnVjdCByeGthZF9yZXNwb25zZSByZXNwCiAJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsgLyogbXVzdCBiZSBhbGlnbmVkIGZvciBjcnlwdG8gKi8KLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKIAl1MzIgdmVyc2lvbiwgbm9uY2UsIG1pbl9sZXZlbCwgYWJvcnRfY29kZTsKIAlpbnQgcmV0OwogCkBAIC03MzQsOCArNzcxLDggQEAKIAl9CiAKIAlhYm9ydF9jb2RlID0gUlhLQURQQUNLRVRTSE9SVDsKLQlzcCA9IHJ4cnBjX3NrYihza2IpOwotCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJmNoYWxsZW5nZSwgc2l6ZW9mKGNoYWxsZW5nZSkpIDwgMCkKKwlpZiAoc2tiX2NvcHlfYml0cyhza2IsIHNpemVvZihzdHJ1Y3QgcnhycGNfd2lyZV9oZWFkZXIpLAorCQkJICAmY2hhbGxlbmdlLCBzaXplb2YoY2hhbGxlbmdlKSkgPCAwKQogCQlnb3RvIHByb3RvY29sX2Vycm9yOwogCiAJdmVyc2lvbiA9IG50b2hsKGNoYWxsZW5nZS52ZXJzaW9uKTsKQEAgLTk4MSw3ICsxMDE4LDcgQEAKIHsKIAlzdHJ1Y3QgcnhrYWRfcmVzcG9uc2UgcmVzcG9uc2UKIAkJX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOyAvKiBtdXN0IGJlIGFsaWduZWQgZm9yIGNyeXB0byAqLwotCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CisJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwogCXN0cnVjdCByeHJwY19jcnlwdCBzZXNzaW9uX2tleTsKIAl0aW1lX3QgZXhwaXJ5OwogCXZvaWQgKnRpY2tldDsKQEAgLTk5Miw3ICsxMDI5LDggQEAKIAlfZW50ZXIoInslZCwleH0iLCBjb25uLT5kZWJ1Z19pZCwga2V5X3NlcmlhbChjb25uLT5zZXJ2ZXJfa2V5KSk7CiAKIAlhYm9ydF9jb2RlID0gUlhLQURQQUNLRVRTSE9SVDsKLQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSkgPCAwKQorCWlmIChza2JfY29weV9iaXRzKHNrYiwgc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlciksCisJCQkgICZyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSkgPCAwKQogCQlnb3RvIHByb3RvY29sX2Vycm9yOwogCWlmICghcHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHJlc3BvbnNlKSkpCiAJCUJVRygpOwpAQCAtMTAwMCw3ICsxMDM4LDYgQEAKIAl2ZXJzaW9uID0gbnRvaGwocmVzcG9uc2UudmVyc2lvbik7CiAJdGlja2V0X2xlbiA9IG50b2hsKHJlc3BvbnNlLnRpY2tldF9sZW4pOwogCWt2bm8gPSBudG9obChyZXNwb25zZS5rdm5vKTsKLQlzcCA9IHJ4cnBjX3NrYihza2IpOwogCV9wcm90bygiUnggUkVTUE9OU0UgJSUldSB7IHY9JXUga3Y9JXUgdGw9JXUgfSIsCiAJICAgICAgIHNwLT5oZHIuc2VyaWFsLCB2ZXJzaW9uLCBrdm5vLCB0aWNrZXRfbGVuKTsKIApAQCAtMTAyMiw3ICsxMDU5LDggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlhYm9ydF9jb2RlID0gUlhLQURQQUNLRVRTSE9SVDsKLQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIDAsIHRpY2tldCwgdGlja2V0X2xlbikgPCAwKQorCWlmIChza2JfY29weV9iaXRzKHNrYiwgc2l6ZW9mKHN0cnVjdCByeHJwY193aXJlX2hlYWRlciksCisJCQkgIHRpY2tldCwgdGlja2V0X2xlbikgPCAwKQogCQlnb3RvIHByb3RvY29sX2Vycm9yX2ZyZWU7CiAKIAlyZXQgPSByeGthZF9kZWNyeXB0X3RpY2tldChjb25uLCB0aWNrZXQsIHRpY2tldF9sZW4sICZzZXNzaW9uX2tleSwKQEAgLTExNDcsNiArMTE4NSw3IEBACiAJLnByaW1lX3BhY2tldF9zZWN1cml0eQkJPSByeGthZF9wcmltZV9wYWNrZXRfc2VjdXJpdHksCiAJLnNlY3VyZV9wYWNrZXQJCQk9IHJ4a2FkX3NlY3VyZV9wYWNrZXQsCiAJLnZlcmlmeV9wYWNrZXQJCQk9IHJ4a2FkX3ZlcmlmeV9wYWNrZXQsCisJLmxvY2F0ZV9kYXRhCQkJPSByeGthZF9sb2NhdGVfZGF0YSwKIAkuaXNzdWVfY2hhbGxlbmdlCQk9IHJ4a2FkX2lzc3VlX2NoYWxsZW5nZSwKIAkucmVzcG9uZF90b19jaGFsbGVuZ2UJCT0gcnhrYWRfcmVzcG9uZF90b19jaGFsbGVuZ2UsCiAJLnZlcmlmeV9yZXNwb25zZQkJPSByeGthZF92ZXJpZnlfcmVzcG9uc2UsCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvc2VjdXJpdHkuYyBiL25ldC9yeHJwYy9zZWN1cml0eS5jCmluZGV4IDgxNGQyODUuLjdkOTIxZTUgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9zZWN1cml0eS5jCisrKyBiL25ldC9yeHJwYy9zZWN1cml0eS5jCkBAIC0xMzAsMjAgKzEzMCwyMCBAQAogCX0KIAogCS8qIGZpbmQgdGhlIHNlcnZpY2UgKi8KLQlyZWFkX2xvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ4LCAmbG9jYWwtPnNlcnZpY2VzLCBsaXN0ZW5fbGluaykgewotCQlpZiAocngtPnNyeC5zcnhfc2VydmljZSA9PSBjb25uLT5wYXJhbXMuc2VydmljZV9pZCkKLQkJCWdvdG8gZm91bmRfc2VydmljZTsKLQl9CisJcmVhZF9sb2NrKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CisJcnggPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKGxvY2FsLT5zZXJ2aWNlLAorCQkJCSAgICAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKSk7CisJaWYgKHJ4ICYmIHJ4LT5zcnguc3J4X3NlcnZpY2UgPT0gY29ubi0+cGFyYW1zLnNlcnZpY2VfaWQpCisJCWdvdG8gZm91bmRfc2VydmljZTsKIAogCS8qIHRoZSBzZXJ2aWNlIGFwcGVhcnMgdG8gaGF2ZSBkaWVkICovCi0JcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwlyZWFkX3VubG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwogCV9sZWF2ZSgiID0gLUVOT0VOVCIpOwogCXJldHVybiAtRU5PRU5UOwogCiBmb3VuZF9zZXJ2aWNlOgogCWlmICghcngtPnNlY3VyaXRpZXMpIHsKLQkJcmVhZF91bmxvY2tfYmgoJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKKwkJcmVhZF91bmxvY2soJmxvY2FsLT5zZXJ2aWNlc19sb2NrKTsKIAkJX2xlYXZlKCIgPSAtRU5PS0VZIik7CiAJCXJldHVybiAtRU5PS0VZOwogCX0KQEAgLTE1MiwxMyArMTUyLDEzIEBACiAJa3JlZiA9IGtleXJpbmdfc2VhcmNoKG1ha2Vfa2V5X3JlZihyeC0+c2VjdXJpdGllcywgMVVMKSwKIAkJCSAgICAgICZrZXlfdHlwZV9yeHJwY19zLCBrZGVzYyk7CiAJaWYgKElTX0VSUihrcmVmKSkgewotCQlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCQlyZWFkX3VubG9jaygmbG9jYWwtPnNlcnZpY2VzX2xvY2spOwogCQlfbGVhdmUoIiA9ICVsZCBbc2VhcmNoXSIsIFBUUl9FUlIoa3JlZikpOwogCQlyZXR1cm4gUFRSX0VSUihrcmVmKTsKIAl9CiAKIAlrZXkgPSBrZXlfcmVmX3RvX3B0cihrcmVmKTsKLQlyZWFkX3VubG9ja19iaCgmbG9jYWwtPnNlcnZpY2VzX2xvY2spOworCXJlYWRfdW5sb2NrKCZsb2NhbC0+c2VydmljZXNfbG9jayk7CiAKIAljb25uLT5zZXJ2ZXJfa2V5ID0ga2V5OwogCWNvbm4tPnNlY3VyaXR5ID0gc2VjOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3NlbmRtc2cuYyBiL25ldC9yeHJwYy9zZW5kbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyMjU0MwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9yeHJwYy9zZW5kbXNnLmMKQEAgLTAsMCArMSw2MDYgQEAKKy8qIEFGX1JYUlBDIHNlbmRtc2coKSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMTYgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KKyNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgorCitlbnVtIHJ4cnBjX2NvbW1hbmQgeworCVJYUlBDX0NNRF9TRU5EX0RBVEEsCQkvKiBzZW5kIGRhdGEgbWVzc2FnZSAqLworCVJYUlBDX0NNRF9TRU5EX0FCT1JULAkJLyogcmVxdWVzdCBhYm9ydCBnZW5lcmF0aW9uICovCisJUlhSUENfQ01EX0FDQ0VQVCwJCS8qIFtzZXJ2ZXJdIGFjY2VwdCBpbmNvbWluZyBjYWxsICovCisJUlhSUENfQ01EX1JFSkVDVF9CVVNZLAkJLyogW3NlcnZlcl0gcmVqZWN0IGEgY2FsbCBhcyBidXN5ICovCit9OworCisvKgorICogd2FpdCBmb3Igc3BhY2UgdG8gYXBwZWFyIGluIHRoZSB0cmFuc21pdC9BQ0sgd2luZG93CisgKiAtIGNhbGxlciBob2xkcyB0aGUgc29ja2V0IGxvY2tlZAorICovCitzdGF0aWMgaW50IHJ4cnBjX3dhaXRfZm9yX3R4X3dpbmRvdyhzdHJ1Y3QgcnhycGNfc29jayAqcngsCisJCQkJICAgIHN0cnVjdCByeHJwY19jYWxsICpjYWxsLAorCQkJCSAgICBsb25nICp0aW1lbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCWludCByZXQ7CisKKwlfZW50ZXIoIix7JXUsJXUsJXV9IiwKKwkgICAgICAgY2FsbC0+dHhfaGFyZF9hY2ssIGNhbGwtPnR4X3RvcCwgY2FsbC0+dHhfd2luc2l6ZSk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlyZXQgPSAwOworCQlpZiAoY2FsbC0+dHhfdG9wIC0gY2FsbC0+dHhfaGFyZF9hY2sgPAorCQkgICAgbWluX3QodW5zaWduZWQgaW50LCBjYWxsLT50eF93aW5zaXplLAorCQkJICBjYWxsLT5jb25nX2N3bmQgKyBjYWxsLT5jb25nX2V4dHJhKSkKKwkJCWJyZWFrOworCQlpZiAoY2FsbC0+c3RhdGUgPj0gUlhSUENfQ0FMTF9DT01QTEVURSkgeworCQkJcmV0ID0gLWNhbGwtPmVycm9yOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXQgPSBzb2NrX2ludHJfZXJybm8oKnRpbWVvKTsKKwkJCWJyZWFrOworCQl9CisKKwkJdHJhY2VfcnhycGNfdHJhbnNtaXQoY2FsbCwgcnhycGNfdHJhbnNtaXRfd2FpdCk7CisJCXJlbGVhc2Vfc29jaygmcngtPnNrKTsKKwkJKnRpbWVvID0gc2NoZWR1bGVfdGltZW91dCgqdGltZW8pOworCQlsb2NrX3NvY2soJnJ4LT5zayk7CisJfQorCisJcmVtb3ZlX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTY2hlZHVsZSBhbiBpbnN0YW50IFR4IHJlc2VuZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHJ4cnBjX2luc3RhbnRfcmVzZW5kKHN0cnVjdCByeHJwY19jYWxsICpjYWxsLCBpbnQgaXgpCit7CisJc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKKworCWlmIChjYWxsLT5zdGF0ZSA8IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF0gPSBSWFJQQ19UWF9BTk5PX1JFVFJBTlM7CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChSWFJQQ19DQUxMX0VWX1JFU0VORCwgJmNhbGwtPmV2ZW50cykpCisJCQlyeHJwY19xdWV1ZV9jYWxsKGNhbGwpOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZjYWxsLT5sb2NrKTsKK30KKworLyoKKyAqIFF1ZXVlIGEgREFUQSBwYWNrZXQgZm9yIHRyYW5zbWlzc2lvbiwgc2V0IHRoZSByZXNlbmQgdGltZW91dCBhbmQgc2VuZCB0aGUKKyAqIHBhY2tldCBpbW1lZGlhdGVseQorICovCitzdGF0aWMgdm9pZCByeHJwY19xdWV1ZV9wYWNrZXQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgYm9vbCBsYXN0KQoreworCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3AgPSByeHJwY19za2Ioc2tiKTsKKwlyeHJwY19zZXFfdCBzZXEgPSBzcC0+aGRyLnNlcTsKKwlpbnQgcmV0LCBpeDsKKwl1OCBhbm5vdGF0aW9uID0gUlhSUENfVFhfQU5OT19VTkFDSzsKKworCV9uZXQoInF1ZXVlIHNrYiAlcCBbJWRdIiwgc2tiLCBzZXEpOworCisJQVNTRVJUQ01QKHNlcSwgPT0sIGNhbGwtPnR4X3RvcCArIDEpOworCisJaWYgKGxhc3QpCisJCWFubm90YXRpb24gfD0gUlhSUENfVFhfQU5OT19MQVNUOworCisJLyogV2UgaGF2ZSB0byBzZXQgdGhlIHRpbWVzdGFtcCBiZWZvcmUgcXVldWVpbmcgYXMgdGhlIHJldHJhbnNtaXQKKwkgKiBhbGdvcml0aG0gY2FuIHNlZSB0aGUgcGFja2V0IGFzIHNvb24gYXMgd2UgcXVldWUgaXQuCisJICovCisJc2tiLT50c3RhbXAgPSBrdGltZV9nZXRfcmVhbCgpOworCisJaXggPSBzZXEgJiBSWFJQQ19SWFRYX0JVRkZfTUFTSzsKKwlyeHJwY19nZXRfc2tiKHNrYiwgcnhycGNfc2tiX3R4X2dvdCk7CisJY2FsbC0+cnh0eF9hbm5vdGF0aW9uc1tpeF0gPSBhbm5vdGF0aW9uOworCXNtcF93bWIoKTsKKwljYWxsLT5yeHR4X2J1ZmZlcltpeF0gPSBza2I7CisJY2FsbC0+dHhfdG9wID0gc2VxOworCWlmIChsYXN0KQorCQl0cmFjZV9yeHJwY190cmFuc21pdChjYWxsLCByeHJwY190cmFuc21pdF9xdWV1ZV9sYXN0KTsKKwllbHNlCisJCXRyYWNlX3J4cnBjX3RyYW5zbWl0KGNhbGwsIHJ4cnBjX3RyYW5zbWl0X3F1ZXVlKTsKKworCWlmIChsYXN0IHx8IGNhbGwtPnN0YXRlID09IFJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNUKSB7CisJCV9kZWJ1ZygiX19fX19fX19hd2FpdGluZyByZXBseS9BQ0tfX19fX19fX19fIik7CisJCXdyaXRlX2xvY2tfYmgoJmNhbGwtPnN0YXRlX2xvY2spOworCQlzd2l0Y2ggKGNhbGwtPnN0YXRlKSB7CisJCWNhc2UgUlhSUENfQ0FMTF9DTElFTlRfU0VORF9SRVFVRVNUOgorCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX0NMSUVOVF9BV0FJVF9SRVBMWTsKKwkJCWJyZWFrOworCQljYXNlIFJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNUOgorCQkJY2FsbC0+c3RhdGUgPSBSWFJQQ19DQUxMX1NFUlZFUl9TRU5EX1JFUExZOworCQkJaWYgKCFsYXN0KQorCQkJCWJyZWFrOworCQljYXNlIFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFk6CisJCQljYWxsLT5zdGF0ZSA9IFJYUlBDX0NBTExfU0VSVkVSX0FXQUlUX0FDSzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJd3JpdGVfdW5sb2NrX2JoKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwl9CisKKwlpZiAoc2VxID09IDEgJiYgcnhycGNfaXNfY2xpZW50X2NhbGwoY2FsbCkpCisJCXJ4cnBjX2V4cG9zZV9jbGllbnRfY2FsbChjYWxsKTsKKworCXJldCA9IHJ4cnBjX3NlbmRfZGF0YV9wYWNrZXQoY2FsbCwgc2tiLCBmYWxzZSk7CisJaWYgKHJldCA8IDApIHsKKwkJX2RlYnVnKCJuZWVkIGluc3RhbnQgcmVzZW5kICVkIiwgcmV0KTsKKwkJcnhycGNfaW5zdGFudF9yZXNlbmQoY2FsbCwgaXgpOworCX0gZWxzZSB7CisJCWt0aW1lX3Qgbm93ID0ga3RpbWVfZ2V0X3JlYWwoKSwgcmVzZW5kX2F0OworCisJCXJlc2VuZF9hdCA9IGt0aW1lX2FkZF9tcyhub3csIHJ4cnBjX3Jlc2VuZF90aW1lb3V0KTsKKworCQlpZiAoa3RpbWVfYmVmb3JlKHJlc2VuZF9hdCwgY2FsbC0+cmVzZW5kX2F0KSkgeworCQkJY2FsbC0+cmVzZW5kX2F0ID0gcmVzZW5kX2F0OworCQkJcnhycGNfc2V0X3RpbWVyKGNhbGwsIHJ4cnBjX3RpbWVyX3NldF9mb3Jfc2VuZCwgbm93KTsKKwkJfQorCX0KKworCXJ4cnBjX2ZyZWVfc2tiKHNrYiwgcnhycGNfc2tiX3R4X2ZyZWVkKTsKKwlfbGVhdmUoIiIpOworfQorCisvKgorICogc2VuZCBkYXRhIHRocm91Z2ggYSBzb2NrZXQKKyAqIC0gbXVzdCBiZSBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0CisgKiAtIGNhbGxlciBob2xkcyB0aGUgc29ja2V0IGxvY2tlZAorICovCitzdGF0aWMgaW50IHJ4cnBjX3NlbmRfZGF0YShzdHJ1Y3QgcnhycGNfc29jayAqcngsCisJCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCSAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNvY2sgKnNrID0gJnJ4LT5zazsKKwlsb25nIHRpbWVvOworCWJvb2wgbW9yZTsKKwlpbnQgcmV0LCBjb3BpZWQ7CisKKwl0aW1lbyA9IHNvY2tfc25kdGltZW8oc2ssIG1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKTsKKworCS8qIHRoaXMgc2hvdWxkIGJlIGluIHBvbGwgKi8KKwlza19jbGVhcl9iaXQoU09DS1dRX0FTWU5DX05PU1BBQ0UsIHNrKTsKKworCWlmIChzay0+c2tfZXJyIHx8IChzay0+c2tfc2h1dGRvd24gJiBTRU5EX1NIVVRET1dOKSkKKwkJcmV0dXJuIC1FUElQRTsKKworCW1vcmUgPSBtc2ctPm1zZ19mbGFncyAmIE1TR19NT1JFOworCisJc2tiID0gY2FsbC0+dHhfcGVuZGluZzsKKwljYWxsLT50eF9wZW5kaW5nID0gTlVMTDsKKwlyeHJwY19zZWVfc2tiKHNrYiwgcnhycGNfc2tiX3R4X3NlZW4pOworCisJY29waWVkID0gMDsKKwlkbyB7CisJCS8qIENoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGEgcGluZyBBQ0sgdG8gcmVwbHkgdG8uICovCisJCWlmIChjYWxsLT5hY2tyX3JlYXNvbiA9PSBSWFJQQ19BQ0tfUElOR19SRVNQT05TRSkKKwkJCXJ4cnBjX3NlbmRfY2FsbF9wYWNrZXQoY2FsbCwgUlhSUENfUEFDS0VUX1RZUEVfQUNLKTsKKworCQlpZiAoIXNrYikgeworCQkJc2l6ZV90IHNpemUsIGNodW5rLCBtYXgsIHNwYWNlOworCisJCQlfZGVidWcoImFsbG9jIik7CisKKwkJCWlmIChjYWxsLT50eF90b3AgLSBjYWxsLT50eF9oYXJkX2FjayA+PQorCQkJICAgIG1pbl90KHVuc2lnbmVkIGludCwgY2FsbC0+dHhfd2luc2l6ZSwKKwkJCQkgIGNhbGwtPmNvbmdfY3duZCArIGNhbGwtPmNvbmdfZXh0cmEpKSB7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQpCisJCQkJCWdvdG8gbWF5YmVfZXJyb3I7CisJCQkJcmV0ID0gcnhycGNfd2FpdF9mb3JfdHhfd2luZG93KHJ4LCBjYWxsLAorCQkJCQkJCSAgICAgICAmdGltZW8pOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlnb3RvIG1heWJlX2Vycm9yOworCQkJfQorCisJCQltYXggPSBSWFJQQ19KVU1CT19EQVRBTEVOOworCQkJbWF4IC09IGNhbGwtPmNvbm4tPnNlY3VyaXR5X3NpemU7CisJCQltYXggJj0gfihjYWxsLT5jb25uLT5zaXplX2FsaWduIC0gMVVMKTsKKworCQkJY2h1bmsgPSBtYXg7CisJCQlpZiAoY2h1bmsgPiBtc2dfZGF0YV9sZWZ0KG1zZykgJiYgIW1vcmUpCisJCQkJY2h1bmsgPSBtc2dfZGF0YV9sZWZ0KG1zZyk7CisKKwkJCXNwYWNlID0gY2h1bmsgKyBjYWxsLT5jb25uLT5zaXplX2FsaWduOworCQkJc3BhY2UgJj0gfihjYWxsLT5jb25uLT5zaXplX2FsaWduIC0gMVVMKTsKKworCQkJc2l6ZSA9IHNwYWNlICsgY2FsbC0+Y29ubi0+c2VjdXJpdHlfc2l6ZTsKKworCQkJX2RlYnVnKCJTSVpFOiAlenUvJXp1LyV6dSIsIGNodW5rLCBzcGFjZSwgc2l6ZSk7CisKKwkJCS8qIGNyZWF0ZSBhIGJ1ZmZlciB0aGF0IHdlIGNhbiByZXRhaW4gdW50aWwgaXQncyBBQ0snZCAqLworCQkJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYigKKwkJCQlzaywgc2l6ZSwgbXNnLT5tc2dfZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZyZXQpOworCQkJaWYgKCFza2IpCisJCQkJZ290byBtYXliZV9lcnJvcjsKKworCQkJcnhycGNfbmV3X3NrYihza2IsIHJ4cnBjX3NrYl90eF9uZXcpOworCisJCQlfZGVidWcoIkFMTE9DIFNFTkQgJXAiLCBza2IpOworCisJCQlBU1NFUlRDTVAoc2tiLT5tYXJrLCA9PSwgMCk7CisKKwkJCV9kZWJ1ZygiSFM6ICV1IiwgY2FsbC0+Y29ubi0+c2VjdXJpdHlfc2l6ZSk7CisJCQlza2JfcmVzZXJ2ZShza2IsIGNhbGwtPmNvbm4tPnNlY3VyaXR5X3NpemUpOworCQkJc2tiLT5sZW4gKz0gY2FsbC0+Y29ubi0+c2VjdXJpdHlfc2l6ZTsKKworCQkJc3AgPSByeHJwY19za2Ioc2tiKTsKKwkJCXNwLT5yZW1haW4gPSBjaHVuazsKKwkJCWlmIChzcC0+cmVtYWluID4gc2tiX3RhaWxyb29tKHNrYikpCisJCQkJc3AtPnJlbWFpbiA9IHNrYl90YWlscm9vbShza2IpOworCisJCQlfbmV0KCJza2I6IGhyICVkLCB0ciAlZCwgaGwgJWQsIHJtICVkIiwKKwkJCSAgICAgICBza2JfaGVhZHJvb20oc2tiKSwKKwkJCSAgICAgICBza2JfdGFpbHJvb20oc2tiKSwKKwkJCSAgICAgICBza2JfaGVhZGxlbihza2IpLAorCQkJICAgICAgIHNwLT5yZW1haW4pOworCisJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOworCQl9CisKKwkJX2RlYnVnKCJhcHBlbmQiKTsKKwkJc3AgPSByeHJwY19za2Ioc2tiKTsKKworCQkvKiBhcHBlbmQgbmV4dCBzZWdtZW50IG9mIGRhdGEgdG8gdGhlIGN1cnJlbnQgYnVmZmVyICovCisJCWlmIChtc2dfZGF0YV9sZWZ0KG1zZykgPiAwKSB7CisJCQlpbnQgY29weSA9IHNrYl90YWlscm9vbShza2IpOworCQkJQVNTRVJUQ01QKGNvcHksID4sIDApOworCQkJaWYgKGNvcHkgPiBtc2dfZGF0YV9sZWZ0KG1zZykpCisJCQkJY29weSA9IG1zZ19kYXRhX2xlZnQobXNnKTsKKwkJCWlmIChjb3B5ID4gc3AtPnJlbWFpbikKKwkJCQljb3B5ID0gc3AtPnJlbWFpbjsKKworCQkJX2RlYnVnKCJhZGQiKTsKKwkJCXJldCA9IHNrYl9hZGRfZGF0YShza2IsICZtc2ctPm1zZ19pdGVyLCBjb3B5KTsKKwkJCV9kZWJ1ZygiYWRkZWQiKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gZWZhdWx0OworCQkJc3AtPnJlbWFpbiAtPSBjb3B5OworCQkJc2tiLT5tYXJrICs9IGNvcHk7CisJCQljb3BpZWQgKz0gY29weTsKKwkJfQorCisJCS8qIGNoZWNrIGZvciB0aGUgZmFyIHNpZGUgYWJvcnRpbmcgdGhlIGNhbGwgb3IgYSBuZXR3b3JrIGVycm9yCisJCSAqIG9jY3VycmluZyAqLworCQlpZiAoY2FsbC0+c3RhdGUgPT0gUlhSUENfQ0FMTF9DT01QTEVURSkKKwkJCWdvdG8gY2FsbF90ZXJtaW5hdGVkOworCisJCS8qIGFkZCB0aGUgcGFja2V0IHRvIHRoZSBzZW5kIHF1ZXVlIGlmIGl0J3Mgbm93IGZ1bGwgKi8KKwkJaWYgKHNwLT5yZW1haW4gPD0gMCB8fAorCQkgICAgKG1zZ19kYXRhX2xlZnQobXNnKSA9PSAwICYmICFtb3JlKSkgeworCQkJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOworCQkJdWludDMyX3Qgc2VxOworCQkJc2l6ZV90IHBhZDsKKworCQkJLyogcGFkIG91dCBpZiB3ZSdyZSB1c2luZyBzZWN1cml0eSAqLworCQkJaWYgKGNvbm4tPnNlY3VyaXR5X2l4KSB7CisJCQkJcGFkID0gY29ubi0+c2VjdXJpdHlfc2l6ZSArIHNrYi0+bWFyazsKKwkJCQlwYWQgPSBjb25uLT5zaXplX2FsaWduIC0gcGFkOworCQkJCXBhZCAmPSBjb25uLT5zaXplX2FsaWduIC0gMTsKKwkJCQlfZGVidWcoInBhZCAlenUiLCBwYWQpOworCQkJCWlmIChwYWQpCisJCQkJCW1lbXNldChza2JfcHV0KHNrYiwgcGFkKSwgMCwgcGFkKTsKKwkJCX0KKworCQkJc2VxID0gY2FsbC0+dHhfdG9wICsgMTsKKworCQkJc3AtPmhkci5zZXEJPSBzZXE7CisJCQlzcC0+aGRyLl9yc3ZkCT0gMDsKKwkJCXNwLT5oZHIuZmxhZ3MJPSBjb25uLT5vdXRfY2xpZW50ZmxhZzsKKworCQkJaWYgKG1zZ19kYXRhX2xlZnQobXNnKSA9PSAwICYmICFtb3JlKQorCQkJCXNwLT5oZHIuZmxhZ3MgfD0gUlhSUENfTEFTVF9QQUNLRVQ7CisJCQllbHNlIGlmIChjYWxsLT50eF90b3AgLSBjYWxsLT50eF9oYXJkX2FjayA8CisJCQkJIGNhbGwtPnR4X3dpbnNpemUpCisJCQkJc3AtPmhkci5mbGFncyB8PSBSWFJQQ19NT1JFX1BBQ0tFVFM7CisKKwkJCXJldCA9IGNvbm4tPnNlY3VyaXR5LT5zZWN1cmVfcGFja2V0KAorCQkJCWNhbGwsIHNrYiwgc2tiLT5tYXJrLCBza2ItPmhlYWQpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisKKwkJCXJ4cnBjX3F1ZXVlX3BhY2tldChjYWxsLCBza2IsICFtc2dfZGF0YV9sZWZ0KG1zZykgJiYgIW1vcmUpOworCQkJc2tiID0gTlVMTDsKKwkJfQorCX0gd2hpbGUgKG1zZ19kYXRhX2xlZnQobXNnKSA+IDApOworCitzdWNjZXNzOgorCXJldCA9IGNvcGllZDsKK291dDoKKwljYWxsLT50eF9wZW5kaW5nID0gc2tiOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKK2NhbGxfdGVybWluYXRlZDoKKwlyeHJwY19mcmVlX3NrYihza2IsIHJ4cnBjX3NrYl90eF9mcmVlZCk7CisJX2xlYXZlKCIgPSAlZCIsIC1jYWxsLT5lcnJvcik7CisJcmV0dXJuIC1jYWxsLT5lcnJvcjsKKworbWF5YmVfZXJyb3I6CisJaWYgKGNvcGllZCkKKwkJZ290byBzdWNjZXNzOworCWdvdG8gb3V0OworCitlZmF1bHQ6CisJcmV0ID0gLUVGQVVMVDsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIGV4dHJhY3QgY29udHJvbCBtZXNzYWdlcyBmcm9tIHRoZSBzZW5kbXNnKCkgY29udHJvbCBidWZmZXIKKyAqLworc3RhdGljIGludCByeHJwY19zZW5kbXNnX2Ntc2coc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqdXNlcl9jYWxsX0lELAorCQkJICAgICAgZW51bSByeHJwY19jb21tYW5kICpjb21tYW5kLAorCQkJICAgICAgdTMyICphYm9ydF9jb2RlLAorCQkJICAgICAgYm9vbCAqX2V4Y2x1c2l2ZSkKK3sKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlib29sIGdvdF91c2VyX0lEID0gZmFsc2U7CisJaW50IGxlbjsKKworCSpjb21tYW5kID0gUlhSUENfQ01EX1NFTkRfREFUQTsKKworCWlmIChtc2ctPm1zZ19jb250cm9sbGVuID09IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yX2VhY2hfY21zZ2hkcihjbXNnLCBtc2cpIHsKKwkJaWYgKCFDTVNHX09LKG1zZywgY21zZykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlsZW4gPSBjbXNnLT5jbXNnX2xlbiAtIENNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBjbXNnaGRyKSk7CisJCV9kZWJ1ZygiQ01TRyAlZCwgJWQsICVkIiwKKwkJICAgICAgIGNtc2ctPmNtc2dfbGV2ZWwsIGNtc2ctPmNtc2dfdHlwZSwgbGVuKTsKKworCQlpZiAoY21zZy0+Y21zZ19sZXZlbCAhPSBTT0xfUlhSUEMpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKGNtc2ctPmNtc2dfdHlwZSkgeworCQljYXNlIFJYUlBDX1VTRVJfQ0FMTF9JRDoKKwkJCWlmIChtc2ctPm1zZ19mbGFncyAmIE1TR19DTVNHX0NPTVBBVCkgeworCQkJCWlmIChsZW4gIT0gc2l6ZW9mKHUzMikpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCSp1c2VyX2NhbGxfSUQgPSAqKHUzMiAqKSBDTVNHX0RBVEEoY21zZyk7CisJCQl9IGVsc2UgeworCQkJCWlmIChsZW4gIT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkqdXNlcl9jYWxsX0lEID0gKih1bnNpZ25lZCBsb25nICopCisJCQkJCUNNU0dfREFUQShjbXNnKTsKKwkJCX0KKwkJCV9kZWJ1ZygiVXNlciBDYWxsIElEICVseCIsICp1c2VyX2NhbGxfSUQpOworCQkJZ290X3VzZXJfSUQgPSB0cnVlOworCQkJYnJlYWs7CisKKwkJY2FzZSBSWFJQQ19BQk9SVDoKKwkJCWlmICgqY29tbWFuZCAhPSBSWFJQQ19DTURfU0VORF9EQVRBKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJKmNvbW1hbmQgPSBSWFJQQ19DTURfU0VORF9BQk9SVDsKKwkJCWlmIChsZW4gIT0gc2l6ZW9mKCphYm9ydF9jb2RlKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCSphYm9ydF9jb2RlID0gKih1bnNpZ25lZCBpbnQgKikgQ01TR19EQVRBKGNtc2cpOworCQkJX2RlYnVnKCJBYm9ydCAleCIsICphYm9ydF9jb2RlKTsKKwkJCWlmICgqYWJvcnRfY29kZSA9PSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBSWFJQQ19BQ0NFUFQ6CisJCQlpZiAoKmNvbW1hbmQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCSpjb21tYW5kID0gUlhSUENfQ01EX0FDQ0VQVDsKKwkJCWlmIChsZW4gIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgUlhSUENfRVhDTFVTSVZFX0NBTEw6CisJCQkqX2V4Y2x1c2l2ZSA9IHRydWU7CisJCQlpZiAobGVuICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKCFnb3RfdXNlcl9JRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBuZXcgY2xpZW50IGNhbGwgZm9yIHNlbmRtc2coKS4KKyAqLworc3RhdGljIHN0cnVjdCByeHJwY19jYWxsICoKK3J4cnBjX25ld19jbGllbnRfY2FsbF9mb3Jfc2VuZG1zZyhzdHJ1Y3QgcnhycGNfc29jayAqcngsIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgdXNlcl9jYWxsX0lELCBib29sIGV4Y2x1c2l2ZSkKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubl9wYXJhbWV0ZXJzIGNwOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrZXkgKmtleTsKKworCURFQ0xBUkVfU09DS0FERFIoc3RydWN0IHNvY2thZGRyX3J4cnBjICosIHNyeCwgbXNnLT5tc2dfbmFtZSk7CisKKwlfZW50ZXIoIiIpOworCisJaWYgKCFtc2ctPm1zZ19uYW1lKQorCQlyZXR1cm4gRVJSX1BUUigtRURFU1RBRERSUkVRKTsKKworCWtleSA9IHJ4LT5rZXk7CisJaWYgKGtleSAmJiAhcngtPmtleS0+cGF5bG9hZC5kYXRhWzBdKQorCQlrZXkgPSBOVUxMOworCisJbWVtc2V0KCZjcCwgMCwgc2l6ZW9mKGNwKSk7CisJY3AubG9jYWwJCT0gcngtPmxvY2FsOworCWNwLmtleQkJCT0gcngtPmtleTsKKwljcC5zZWN1cml0eV9sZXZlbAk9IHJ4LT5taW5fc2VjX2xldmVsOworCWNwLmV4Y2x1c2l2ZQkJPSByeC0+ZXhjbHVzaXZlIHwgZXhjbHVzaXZlOworCWNwLnNlcnZpY2VfaWQJCT0gc3J4LT5zcnhfc2VydmljZTsKKwljYWxsID0gcnhycGNfbmV3X2NsaWVudF9jYWxsKHJ4LCAmY3AsIHNyeCwgdXNlcl9jYWxsX0lELCBHRlBfS0VSTkVMKTsKKworCV9sZWF2ZSgiID0gJXBcbiIsIGNhbGwpOworCXJldHVybiBjYWxsOworfQorCisvKgorICogc2VuZCBhIG1lc3NhZ2UgZm9ybWluZyBwYXJ0IG9mIGEgY2xpZW50IGNhbGwgdGhyb3VnaCBhbiBSeFJQQyBzb2NrZXQKKyAqIC0gY2FsbGVyIGhvbGRzIHRoZSBzb2NrZXQgbG9ja2VkCisgKiAtIHRoZSBzb2NrZXQgbWF5IGJlIGVpdGhlciBhIGNsaWVudCBzb2NrZXQgb3IgYSBzZXJ2ZXIgc29ja2V0CisgKi8KK2ludCByeHJwY19kb19zZW5kbXNnKHN0cnVjdCByeHJwY19zb2NrICpyeCwgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoreworCWVudW0gcnhycGNfY29tbWFuZCBjbWQ7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisJdW5zaWduZWQgbG9uZyB1c2VyX2NhbGxfSUQgPSAwOworCWJvb2wgZXhjbHVzaXZlID0gZmFsc2U7CisJdTMyIGFib3J0X2NvZGUgPSAwOworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCisJcmV0ID0gcnhycGNfc2VuZG1zZ19jbXNnKG1zZywgJnVzZXJfY2FsbF9JRCwgJmNtZCwgJmFib3J0X2NvZGUsCisJCQkJICZleGNsdXNpdmUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNtZCA9PSBSWFJQQ19DTURfQUNDRVBUKSB7CisJCWlmIChyeC0+c2suc2tfc3RhdGUgIT0gUlhSUENfU0VSVkVSX0xJU1RFTklORykKKwkJCXJldHVybiAtRUlOVkFMOworCQljYWxsID0gcnhycGNfYWNjZXB0X2NhbGwocngsIHVzZXJfY2FsbF9JRCwgTlVMTCk7CisJCWlmIChJU19FUlIoY2FsbCkpCisJCQlyZXR1cm4gUFRSX0VSUihjYWxsKTsKKwkJcnhycGNfcHV0X2NhbGwoY2FsbCwgcnhycGNfY2FsbF9wdXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYWxsID0gcnhycGNfZmluZF9jYWxsX2J5X3VzZXJfSUQocngsIHVzZXJfY2FsbF9JRCk7CisJaWYgKCFjYWxsKSB7CisJCWlmIChjbWQgIT0gUlhSUENfQ01EX1NFTkRfREFUQSkKKwkJCXJldHVybiAtRUJBRFNMVDsKKwkJY2FsbCA9IHJ4cnBjX25ld19jbGllbnRfY2FsbF9mb3Jfc2VuZG1zZyhyeCwgbXNnLCB1c2VyX2NhbGxfSUQsCisJCQkJCQkJIGV4Y2x1c2l2ZSk7CisJCWlmIChJU19FUlIoY2FsbCkpCisJCQlyZXR1cm4gUFRSX0VSUihjYWxsKTsKKwl9CisKKwlfZGVidWcoIkNBTEwgJWQgVVNSICVseCBTVCAlZCBvbiBDT05OICVwIiwKKwkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPnVzZXJfY2FsbF9JRCwgY2FsbC0+c3RhdGUsIGNhbGwtPmNvbm4pOworCisJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJLyogaXQncyB0b28gbGF0ZSBmb3IgdGhpcyBjYWxsICovCisJCXJldCA9IC1FU0hVVERPV047CisJfSBlbHNlIGlmIChjbWQgPT0gUlhSUENfQ01EX1NFTkRfQUJPUlQpIHsKKwkJcmV0ID0gMDsKKwkJaWYgKHJ4cnBjX2Fib3J0X2NhbGwoIkNNRCIsIGNhbGwsIDAsIGFib3J0X2NvZGUsIEVDT05OQUJPUlRFRCkpCisJCQlyZXQgPSByeHJwY19zZW5kX2NhbGxfcGFja2V0KGNhbGwsCisJCQkJCQkgICAgIFJYUlBDX1BBQ0tFVF9UWVBFX0FCT1JUKTsKKwl9IGVsc2UgaWYgKGNtZCAhPSBSWFJQQ19DTURfU0VORF9EQVRBKSB7CisJCXJldCA9IC1FSU5WQUw7CisJfSBlbHNlIGlmIChyeHJwY19pc19jbGllbnRfY2FsbChjYWxsKSAmJgorCQkgICBjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1QpIHsKKwkJLyogcmVxdWVzdCBwaGFzZSBjb21wbGV0ZSBmb3IgdGhpcyBjbGllbnQgY2FsbCAqLworCQlyZXQgPSAtRVBST1RPOworCX0gZWxzZSBpZiAocnhycGNfaXNfc2VydmljZV9jYWxsKGNhbGwpICYmCisJCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX0FDS19SRVFVRVNUICYmCisJCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFkpIHsKKwkJLyogUmVwbHkgcGhhc2Ugbm90IGJlZ3VuIG9yIG5vdCBjb21wbGV0ZSBmb3Igc2VydmljZSBjYWxsLiAqLworCQlyZXQgPSAtRVBST1RPOworCX0gZWxzZSB7CisJCXJldCA9IHJ4cnBjX3NlbmRfZGF0YShyeCwgY2FsbCwgbXNnLCBsZW4pOworCX0KKworCXJ4cnBjX3B1dF9jYWxsKGNhbGwsIHJ4cnBjX2NhbGxfcHV0KTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEgLSBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIHNlbmQgZGF0YSBvbiBhIGNhbGwKKyAqIEBzb2NrOiBUaGUgc29ja2V0IHRoZSBjYWxsIGlzIG9uCisgKiBAY2FsbDogVGhlIGNhbGwgdG8gc2VuZCBkYXRhIHRocm91Z2gKKyAqIEBtc2c6IFRoZSBkYXRhIHRvIHNlbmQKKyAqIEBsZW46IFRoZSBhbW91bnQgb2YgZGF0YSB0byBzZW5kCisgKgorICogQWxsb3cgYSBrZXJuZWwgc2VydmljZSB0byBzZW5kIGRhdGEgb24gYSBjYWxsLiAgVGhlIGNhbGwgbXVzdCBiZSBpbiBhbiBzdGF0ZQorICogYXBwcm9wcmlhdGUgdG8gc2VuZGluZyBkYXRhLiAgTm8gY29udHJvbCBkYXRhIHNob3VsZCBiZSBzdXBwbGllZCBpbiBAbXNnLAorICogbm9yIHNob3VsZCBhbiBhZGRyZXNzIGJlIHN1cHBsaWVkLiAgTVNHX01PUkUgc2hvdWxkIGJlIGZsYWdnZWQgaWYgdGhlcmUncworICogbW9yZSBkYXRhIHRvIGNvbWUsIG90aGVyd2lzZSB0aGlzIGRhdGEgd2lsbCBlbmQgdGhlIHRyYW5zbWlzc2lvbiBwaGFzZS4KKyAqLworaW50IHJ4cnBjX2tlcm5lbF9zZW5kX2RhdGEoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCisJCQkgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCit7CisJaW50IHJldDsKKworCV9lbnRlcigieyVkLCVzfSwiLCBjYWxsLT5kZWJ1Z19pZCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+c3RhdGVdKTsKKworCUFTU0VSVENNUChtc2ctPm1zZ19uYW1lLCA9PSwgTlVMTCk7CisJQVNTRVJUQ01QKG1zZy0+bXNnX2NvbnRyb2wsID09LCBOVUxMKTsKKworCWxvY2tfc29jayhzb2NrLT5zayk7CisKKwlfZGVidWcoIkNBTEwgJWQgVVNSICVseCBTVCAlZCBvbiBDT05OICVwIiwKKwkgICAgICAgY2FsbC0+ZGVidWdfaWQsIGNhbGwtPnVzZXJfY2FsbF9JRCwgY2FsbC0+c3RhdGUsIGNhbGwtPmNvbm4pOworCisJaWYgKGNhbGwtPnN0YXRlID49IFJYUlBDX0NBTExfQ09NUExFVEUpIHsKKwkJcmV0ID0gLUVTSFVURE9XTjsgLyogaXQncyB0b28gbGF0ZSBmb3IgdGhpcyBjYWxsICovCisJfSBlbHNlIGlmIChjYWxsLT5zdGF0ZSAhPSBSWFJQQ19DQUxMX0NMSUVOVF9TRU5EX1JFUVVFU1QgJiYKKwkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1QgJiYKKwkJICAgY2FsbC0+c3RhdGUgIT0gUlhSUENfQ0FMTF9TRVJWRVJfU0VORF9SRVBMWSkgeworCQlyZXQgPSAtRVBST1RPOyAvKiByZXF1ZXN0IHBoYXNlIGNvbXBsZXRlIGZvciB0aGlzIGNsaWVudCBjYWxsICovCisJfSBlbHNlIHsKKwkJcmV0ID0gcnhycGNfc2VuZF9kYXRhKHJ4cnBjX3NrKHNvY2stPnNrKSwgY2FsbCwgbXNnLCBsZW4pOworCX0KKworCXJlbGVhc2Vfc29jayhzb2NrLT5zayk7CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX3NlbmRfZGF0YSk7CisKKy8qKgorICogcnhycGNfa2VybmVsX2Fib3J0X2NhbGwgLSBBbGxvdyBhIGtlcm5lbCBzZXJ2aWNlIHRvIGFib3J0IGEgY2FsbAorICogQHNvY2s6IFRoZSBzb2NrZXQgdGhlIGNhbGwgaXMgb24KKyAqIEBjYWxsOiBUaGUgY2FsbCB0byBiZSBhYm9ydGVkCisgKiBAYWJvcnRfY29kZTogVGhlIGFib3J0IGNvZGUgdG8gc3RpY2sgaW50byB0aGUgQUJPUlQgcGFja2V0CisgKiBAZXJyb3I6IExvY2FsIGVycm9yIHZhbHVlCisgKiBAd2h5OiAzLWNoYXIgc3RyaW5nIGluZGljYXRpbmcgd2h5LgorICoKKyAqIEFsbG93IGEga2VybmVsIHNlcnZpY2UgdG8gYWJvcnQgYSBjYWxsLCBpZiBpdCdzIHN0aWxsIGluIGFuIGFib3J0YWJsZSBzdGF0ZS4KKyAqLwordm9pZCByeHJwY19rZXJuZWxfYWJvcnRfY2FsbChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKKwkJCSAgICAgdTMyIGFib3J0X2NvZGUsIGludCBlcnJvciwgY29uc3QgY2hhciAqd2h5KQoreworCV9lbnRlcigieyVkfSwlZCwlZCwlcyIsIGNhbGwtPmRlYnVnX2lkLCBhYm9ydF9jb2RlLCBlcnJvciwgd2h5KTsKKworCWxvY2tfc29jayhzb2NrLT5zayk7CisKKwlpZiAocnhycGNfYWJvcnRfY2FsbCh3aHksIGNhbGwsIDAsIGFib3J0X2NvZGUsIGVycm9yKSkKKwkJcnhycGNfc2VuZF9jYWxsX3BhY2tldChjYWxsLCBSWFJQQ19QQUNLRVRfVFlQRV9BQk9SVCk7CisKKwlyZWxlYXNlX3NvY2soc29jay0+c2spOworCV9sZWF2ZSgiIik7Cit9CisKK0VYUE9SVF9TWU1CT0wocnhycGNfa2VybmVsX2Fib3J0X2NhbGwpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3NrYnVmZi5jIGIvbmV0L3J4cnBjL3NrYnVmZi5jCmluZGV4IDA2YzUxZDQuLjY3YjAyYzQgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9za2J1ZmYuYworKysgYi9uZXQvcnhycGMvc2tidWZmLmMKQEAgLTE4LDE0OCArMTgsODIgQEAKICNpbmNsdWRlIDxuZXQvYWZfcnhycGMuaD4KICNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgogCisjZGVmaW5lIHNlbGVjdF9za2JfY291bnQob3ApIChvcCA+PSByeHJwY19za2JfdHhfY2xlYW5lZCA/ICZyeHJwY19uX3R4X3NrYnMgOiAmcnhycGNfbl9yeF9za2JzKQorCiAvKgotICogc2V0IHVwIGZvciB0aGUgQUNLIGF0IHRoZSBlbmQgb2YgdGhlIHJlY2VpdmUgcGhhc2Ugd2hlbiB3ZSBkaXNjYXJkIHRoZSBmaW5hbAotICogcmVjZWl2ZSBwaGFzZSBkYXRhIHBhY2tldAotICogLSBjYWxsZWQgd2l0aCBzb2Z0aXJxcyBkaXNhYmxlZAorICogTm90ZSB0aGUgYWxsb2NhdGlvbiBvciByZWNlcHRpb24gb2YgYSBzb2NrZXQgYnVmZmVyLgogICovCi1zdGF0aWMgdm9pZCByeHJwY19yZXF1ZXN0X2ZpbmFsX0FDSyhzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3ZvaWQgcnhycGNfbmV3X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHJ4cnBjX3NrYl90cmFjZSBvcCkKIHsKLQkvKiB0aGUgY2FsbCBtYXkgYmUgYWJvcnRlZCBiZWZvcmUgd2UgaGF2ZSBhIGNoYW5jZSB0byBBQ0sgaXQgKi8KLQl3cml0ZV9sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKLQotCXN3aXRjaCAoY2FsbC0+c3RhdGUpIHsKLQljYXNlIFJYUlBDX0NBTExfQ0xJRU5UX1JFQ1ZfUkVQTFk6Ci0JCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9DTElFTlRfRklOQUxfQUNLOwotCQlfZGVidWcoInJlcXVlc3QgZmluYWwgQUNLIik7Ci0KLQkJLyogZ2V0IGFuIGV4dHJhIHJlZiBvbiB0aGUgY2FsbCBmb3IgdGhlIGZpbmFsLUFDSyBnZW5lcmF0b3IgdG8KLQkJICogcmVsZWFzZSAqLwotCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKLQkJc2V0X2JpdChSWFJQQ19DQUxMX0VWX0FDS19GSU5BTCwgJmNhbGwtPmV2ZW50cyk7Ci0JCWlmICh0cnlfdG9fZGVsX3RpbWVyX3N5bmMoJmNhbGwtPmFja190aW1lcikgPj0gMCkKLQkJCXJ4cnBjX3F1ZXVlX2NhbGwoY2FsbCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBSWFJQQ19DQUxMX1NFUlZFUl9SRUNWX1JFUVVFU1Q6Ci0JCWNhbGwtPnN0YXRlID0gUlhSUENfQ0FMTF9TRVJWRVJfQUNLX1JFUVVFU1Q7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0Jd3JpdGVfdW5sb2NrKCZjYWxsLT5zdGF0ZV9sb2NrKTsKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCWludCBuID0gYXRvbWljX2luY19yZXR1cm4oc2VsZWN0X3NrYl9jb3VudChvcCkpOworCXRyYWNlX3J4cnBjX3NrYihza2IsIG9wLCBhdG9taWNfcmVhZCgmc2tiLT51c2VycyksIG4sIGhlcmUpOwogfQogCiAvKgotICogZHJvcCB0aGUgYm90dG9tIEFDSyBvZmYgb2YgdGhlIGNhbGwgQUNLIHdpbmRvdyBhbmQgYWR2YW5jZSB0aGUgd2luZG93CisgKiBOb3RlIHRoZSByZS1lbWVyZ2VuY2Ugb2YgYSBzb2NrZXQgYnVmZmVyIGZyb20gYSBxdWV1ZSBvciBidWZmZXIuCiAgKi8KLXN0YXRpYyB2b2lkIHJ4cnBjX2hhcmRfQUNLX2RhdGEoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCi0JCQkJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCkKK3ZvaWQgcnhycGNfc2VlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHJ4cnBjX3NrYl90cmFjZSBvcCkKIHsKLQlpbnQgbG9vcDsKLQl1MzIgc2VxOwotCi0Jc3Bpbl9sb2NrX2JoKCZjYWxsLT5sb2NrKTsKLQotCV9kZWJ1ZygiaGFyZCBBQ0sgIyV1Iiwgc3AtPmhkci5zZXEpOwotCi0JZm9yIChsb29wID0gMDsgbG9vcCA8IFJYUlBDX0FDS1JfV0lORE9XX0FTWjsgbG9vcCsrKSB7Ci0JCWNhbGwtPmFja3Jfd2luZG93W2xvb3BdID4+PSAxOwotCQljYWxsLT5hY2tyX3dpbmRvd1tsb29wXSB8PQotCQkJY2FsbC0+YWNrcl93aW5kb3dbbG9vcCArIDFdIDw8IChCSVRTX1BFUl9MT05HIC0gMSk7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpZiAoc2tiKSB7CisJCWludCBuID0gYXRvbWljX3JlYWQoc2VsZWN0X3NrYl9jb3VudChvcCkpOworCQl0cmFjZV9yeHJwY19za2Ioc2tiLCBvcCwgYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpLCBuLCBoZXJlKTsKIAl9Ci0KLQlzZXEgPSBzcC0+aGRyLnNlcTsKLQlBU1NFUlRDTVAoc2VxLCA9PSwgY2FsbC0+cnhfZGF0YV9lYXRlbiArIDEpOwotCWNhbGwtPnJ4X2RhdGFfZWF0ZW4gPSBzZXE7Ci0KLQlpZiAoY2FsbC0+YWNrcl93aW5fdG9wIDwgVUlOVF9NQVgpCi0JCWNhbGwtPmFja3Jfd2luX3RvcCsrOwotCi0JQVNTRVJUSUZDTVAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSwKLQkJICAgIGNhbGwtPnJ4X2RhdGFfcG9zdCwgPj0sIGNhbGwtPnJ4X2RhdGFfcmVjdik7Ci0JQVNTRVJUSUZDTVAoY2FsbC0+c3RhdGUgPD0gUlhSUENfQ0FMTF9DT01QTEVURSwKLQkJICAgIGNhbGwtPnJ4X2RhdGFfcmVjdiwgPj0sIGNhbGwtPnJ4X2RhdGFfZWF0ZW4pOwotCi0JaWYgKHNwLT5oZHIuZmxhZ3MgJiBSWFJQQ19MQVNUX1BBQ0tFVCkgewotCQlyeHJwY19yZXF1ZXN0X2ZpbmFsX0FDSyhjYWxsKTsKLQl9IGVsc2UgaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmNhbGwtPmFja3Jfbm90X2lkbGUpICYmCi0JCSAgIHRlc3RfYW5kX2NsZWFyX2JpdChSWFJQQ19DQUxMX1RYX1NPRlRfQUNLLCAmY2FsbC0+ZmxhZ3MpKSB7Ci0JCS8qIFdlIHByZXZpb3VzbHkgc29mdC1BQ0snZCBzb21lIHJlY2VpdmVkIHBhY2tldHMgdGhhdCBoYXZlIG5vdwotCQkgKiBiZWVuIGNvbnN1bWVkLCBzbyBzZW5kIGEgaGFyZC1BQ0sgaWYgbm8gbW9yZSBwYWNrZXRzIGFyZQotCQkgKiBpbW1lZGlhdGVseSBmb3J0aGNvbWluZyB0byBhbGxvdyB0aGUgdHJhbnNtaXR0ZXIgdG8gZnJlZSB1cAotCQkgKiBpdHMgVHggYnVmZmVyYWdlLgotCQkgKi8KLQkJX2RlYnVnKCJzZW5kIFJ4IGlkbGUgQUNLIik7Ci0JCV9fcnhycGNfcHJvcG9zZV9BQ0soY2FsbCwgUlhSUENfQUNLX0lETEUsIHNwLT5oZHIuc2VyaWFsLAotCQkJCSAgICBmYWxzZSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfYmgoJmNhbGwtPmxvY2spOwogfQogCi0vKioKLSAqIHJ4cnBjX2tlcm5lbF9kYXRhX2NvbnN1bWVkIC0gUmVjb3JkIGNvbnN1bXB0aW9uIG9mIGRhdGEgbWVzc2FnZQotICogQGNhbGw6IFRoZSBjYWxsIHRvIHdoaWNoIHRoZSBtZXNzYWdlIHBlcnRhaW5zLgotICogQHNrYjogTWVzc2FnZSBob2xkaW5nIGRhdGEKLSAqCi0gKiBSZWNvcmQgdGhlIGNvbnN1bXB0aW9uIG9mIGEgZGF0YSBtZXNzYWdlIGFuZCBnZW5lcmF0ZSBhbiBBQ0sgaWYgYXBwcm9wcmlhdGUuCi0gKiBUaGUgY2FsbCBzdGF0ZSBpcyBzaGlmdGVkIGlmIHRoaXMgd2FzIHRoZSBmaW5hbCBwYWNrZXQuICBUaGUgY2FsbGVyIG11c3QgYmUKLSAqIGluIHByb2Nlc3MgY29udGV4dCB3aXRoIG5vIHNwaW5sb2NrcyBoZWxkLgotICoKLSAqIFRPRE86IEFjdHVhbGx5IGdlbmVyYXRlIHRoZSBBQ0sgaGVyZSByYXRoZXIgdGhhbiBwdW50aW5nIHRoaXMgdG8gdGhlCi0gKiB3b3JrcXVldWUuCi0gKi8KLXZvaWQgcnhycGNfa2VybmVsX2RhdGFfY29uc3VtZWQoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOwotCi0JX2VudGVyKCIlZCwlcHsldX0iLCBjYWxsLT5kZWJ1Z19pZCwgc2tiLCBzcC0+aGRyLnNlcSk7Ci0KLQlBU1NFUlRDTVAoc3AtPmNhbGwsID09LCBjYWxsKTsKLQlBU1NFUlRDTVAoc3AtPmhkci50eXBlLCA9PSwgUlhSUENfUEFDS0VUX1RZUEVfREFUQSk7Ci0KLQkvKiBUT0RPOiBGaXggdGhlIHNlcXVlbmNlIG51bWJlciB0cmFja2luZyAqLwotCUFTU0VSVENNUChzcC0+aGRyLnNlcSwgPj0sIGNhbGwtPnJ4X2RhdGFfcmVjdik7Ci0JQVNTRVJUQ01QKHNwLT5oZHIuc2VxLCA8PSwgY2FsbC0+cnhfZGF0YV9yZWN2ICsgMSk7Ci0JQVNTRVJUQ01QKHNwLT5oZHIuc2VxLCA+LCBjYWxsLT5yeF9kYXRhX2VhdGVuKTsKLQotCWNhbGwtPnJ4X2RhdGFfcmVjdiA9IHNwLT5oZHIuc2VxOwotCXJ4cnBjX2hhcmRfQUNLX2RhdGEoY2FsbCwgc3ApOwotfQotRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfZGF0YV9jb25zdW1lZCk7Ci0KIC8qCi0gKiBEZXN0cm95IGEgcGFja2V0IHRoYXQgaGFzIGFuIFJ4UlBDIGNvbnRyb2wgYnVmZmVyCisgKiBOb3RlIHRoZSBhZGRpdGlvbiBvZiBhIHJlZiBvbiBhIHNvY2tldCBidWZmZXIuCiAgKi8KLXZvaWQgcnhycGNfcGFja2V0X2Rlc3RydWN0b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3ZvaWQgcnhycGNfZ2V0X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBlbnVtIHJ4cnBjX3NrYl90cmFjZSBvcCkKIHsKLQlzdHJ1Y3QgcnhycGNfc2tiX3ByaXYgKnNwID0gcnhycGNfc2tiKHNrYik7Ci0Jc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSBzcC0+Y2FsbDsKKwljb25zdCB2b2lkICpoZXJlID0gX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApOworCWludCBuID0gYXRvbWljX2luY19yZXR1cm4oc2VsZWN0X3NrYl9jb3VudChvcCkpOworCXRyYWNlX3J4cnBjX3NrYihza2IsIG9wLCBhdG9taWNfcmVhZCgmc2tiLT51c2VycyksIG4sIGhlcmUpOworCXNrYl9nZXQoc2tiKTsKK30KIAotCV9lbnRlcigiJXB7JXB9Iiwgc2tiLCBjYWxsKTsKLQotCWlmIChjYWxsKSB7Ci0JCWlmIChhdG9taWNfZGVjX3JldHVybigmY2FsbC0+c2tiX2NvdW50KSA8IDApCi0JCQlCVUcoKTsKLQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7Ci0JCXNwLT5jYWxsID0gTlVMTDsKKy8qCisgKiBOb3RlIHRoZSBkZXN0cnVjdGlvbiBvZiBhIHNvY2tldCBidWZmZXIuCisgKi8KK3ZvaWQgcnhycGNfZnJlZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgZW51bSByeHJwY19za2JfdHJhY2Ugb3ApCit7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpZiAoc2tiKSB7CisJCWludCBuOworCQlDSEVDS19TTEFCX09LQVkoJnNrYi0+dXNlcnMpOworCQluID0gYXRvbWljX2RlY19yZXR1cm4oc2VsZWN0X3NrYl9jb3VudChvcCkpOworCQl0cmFjZV9yeHJwY19za2Ioc2tiLCBvcCwgYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpLCBuLCBoZXJlKTsKKwkJa2ZyZWVfc2tiKHNrYik7CiAJfQotCi0JaWYgKHNrYi0+c2spCi0JCXNvY2tfcmZyZWUoc2tiKTsKLQlfbGVhdmUoIiIpOwogfQogCi0vKioKLSAqIHJ4cnBjX2tlcm5lbF9mcmVlX3NrYiAtIEZyZWUgYW4gUnhSUEMgc29ja2V0IGJ1ZmZlcgotICogQHNrYjogVGhlIHNvY2tldCBidWZmZXIgdG8gYmUgZnJlZWQKLSAqCi0gKiBMZXQgUnhSUEMgZnJlZSBpdHMgb3duIHNvY2tldCBidWZmZXIsIHBlcm1pdHRpbmcgaXQgdG8gbWFpbnRhaW4gZGVidWcKLSAqIGFjY291bnRpbmcuCisvKgorICogTm90ZSB0aGUgaW5qZWN0ZWQgbG9zcyBvZiBhIHNvY2tldCBidWZmZXIuCiAgKi8KLXZvaWQgcnhycGNfa2VybmVsX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit2b2lkIHJ4cnBjX2xvc2Vfc2tiKHN0cnVjdCBza19idWZmICpza2IsIGVudW0gcnhycGNfc2tiX3RyYWNlIG9wKQogewotCXJ4cnBjX2ZyZWVfc2tiKHNrYik7CisJY29uc3Qgdm9pZCAqaGVyZSA9IF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKTsKKwlpZiAoc2tiKSB7CisJCWludCBuOworCQlDSEVDS19TTEFCX09LQVkoJnNrYi0+dXNlcnMpOworCQluID0gYXRvbWljX2RlY19yZXR1cm4oc2VsZWN0X3NrYl9jb3VudChvcCkpOworCQl0cmFjZV9yeHJwY19za2Ioc2tiLCBvcCwgYXRvbWljX3JlYWQoJnNrYi0+dXNlcnMpLCBuLCBoZXJlKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfQogfQotRVhQT1JUX1NZTUJPTChyeHJwY19rZXJuZWxfZnJlZV9za2IpOworCisvKgorICogQ2xlYXIgYSBxdWV1ZSBvZiBzb2NrZXQgYnVmZmVycy4KKyAqLwordm9pZCByeHJwY19wdXJnZV9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQoreworCWNvbnN0IHZvaWQgKmhlcmUgPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKChsaXN0KSkpICE9IE5VTEwpIHsKKwkJaW50IG4gPSBhdG9taWNfZGVjX3JldHVybihzZWxlY3Rfc2tiX2NvdW50KHJ4cnBjX3NrYl9yeF9wdXJnZWQpKTsKKwkJdHJhY2VfcnhycGNfc2tiKHNrYiwgcnhycGNfc2tiX3J4X3B1cmdlZCwKKwkJCQlhdG9taWNfcmVhZCgmc2tiLT51c2VycyksIG4sIGhlcmUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvc3lzY3RsLmMgYi9uZXQvcnhycGMvc3lzY3RsLmMKaW5kZXggMDNhZDA4Ny4uMzRjNzA2ZCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL3N5c2N0bC5jCisrKyBiL25ldC9yeHJwYy9zeXNjdGwuYwpAQCAtMjAsNyArMjAsNyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBmb3VyID0gNDsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdGhpcnR5dHdvID0gMzI7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5fNjU1MzUgPSA2NTUzNTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbl9tYXhfYWNrcyA9IFJYUlBDX01BWEFDS1M7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5fbWF4X2Fja3MgPSBSWFJQQ19SWFRYX0JVRkZfU0laRSAtIDE7CiAKIC8qCiAgKiBSeFJQQyBvcGVyYXRpbmcgcGFyYW1ldGVycy4KQEAgLTM1LDcgKzM1LDcgQEAKIAkJLmRhdGEJCT0gJnJ4cnBjX3JlcXVlc3RlZF9hY2tfZGVsYXksCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCQkuZXh0cmExCQk9ICh2b2lkICopJnplcm8sCiAJfSwKIAl7CkBAIC00Myw3ICs0Myw3IEBACiAJCS5kYXRhCQk9ICZyeHJwY19zb2Z0X2Fja19kZWxheSwKIAkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcywKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJCS5leHRyYTEJCT0gKHZvaWQgKikmb25lLAogCX0sCiAJewpAQCAtNTEsNyArNTEsNyBAQAogCQkuZGF0YQkJPSAmcnhycGNfaWRsZV9hY2tfZGVsYXksCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCQkuZXh0cmExCQk9ICh2b2lkICopJm9uZSwKIAl9LAogCXsKQEAgLTU5LDYgKzU5LDIyIEBACiAJCS5kYXRhCQk9ICZyeHJwY19yZXNlbmRfdGltZW91dCwKIAkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCisJCS5leHRyYTEJCT0gKHZvaWQgKikmb25lLAorCX0sCisJeworCQkucHJvY25hbWUJPSAiaWRsZV9jb25uX2V4cGlyeSIsCisJCS5kYXRhCQk9ICZyeHJwY19jb25uX2lkbGVfY2xpZW50X2V4cGlyeSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcywKKwkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJpZGxlX2Nvbm5fZmFzdF9leHBpcnkiLAorCQkuZGF0YQkJPSAmcnhycGNfY29ubl9pZGxlX2NsaWVudF9mYXN0X2V4cGlyeSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbXNfamlmZmllcywKIAkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCiAJfSwKQEAgLTY5LDMwICs4NSwyOSBAQAogCQkuZGF0YQkJPSAmcnhycGNfbWF4X2NhbGxfbGlmZXRpbWUsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX2ppZmZpZXMsCi0JCS5leHRyYTEJCT0gKHZvaWQgKikmb25lLAotCX0sCi0JewotCQkucHJvY25hbWUJPSAiZGVhZF9jYWxsX2V4cGlyeSIsCi0JCS5kYXRhCQk9ICZyeHJwY19kZWFkX2NhbGxfZXhwaXJ5LAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAotCQkuZXh0cmExCQk9ICh2b2lkICopJm9uZSwKLQl9LAotCi0JLyogVmFsdWVzIG1lYXN1cmVkIGluIHNlY29uZHMgKi8KLQl7Ci0JCS5wcm9jbmFtZQk9ICJjb25uZWN0aW9uX2V4cGlyeSIsCi0JCS5kYXRhCQk9ICZyeHJwY19jb25uZWN0aW9uX2V4cGlyeSwKLQkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCiAJfSwKIAogCS8qIE5vbi10aW1lIHZhbHVlcyAqLwogCXsKKwkJLnByb2NuYW1lCT0gIm1heF9jbGllbnRfY29ubnMiLAorCQkuZGF0YQkJPSAmcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucywKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuZXh0cmExCQk9ICh2b2lkICopJnJ4cnBjX3JlYXBfY2xpZW50X2Nvbm5lY3Rpb25zLAorCX0sCisJeworCQkucHJvY25hbWUJPSAicmVhcF9jbGllbnRfY29ubnMiLAorCQkuZGF0YQkJPSAmcnhycGNfcmVhcF9jbGllbnRfY29ubmVjdGlvbnMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLmV4dHJhMQkJPSAodm9pZCAqKSZvbmUsCisJCS5leHRyYTIJCT0gKHZvaWQgKikmcnhycGNfbWF4X2NsaWVudF9jb25uZWN0aW9ucywKKwl9LAorCXsKIAkJLnByb2NuYW1lCT0gIm1heF9iYWNrbG9nIiwKIAkJLmRhdGEJCT0gJnJ4cnBjX21heF9iYWNrbG9nLAogCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLApkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL3V0aWxzLmMgYi9uZXQvcnhycGMvdXRpbHMuYwppbmRleCBiODg5MTRkLi5mZjdhZjcxIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvdXRpbHMuYworKysgYi9uZXQvcnhycGMvdXRpbHMuYwpAQCAtMzAsNiArMzAsNyBAQAogCQlzcngtPnRyYW5zcG9ydC5zaW4uc2luX2FkZHIuc19hZGRyID0gaXBfaGRyKHNrYiktPnNhZGRyOwogCQlyZXR1cm4gMDsKIAorI2lmZGVmIENPTkZJR19BRl9SWFJQQ19JUFY2CiAJY2FzZSBFVEhfUF9JUFY2OgogCQlzcngtPnRyYW5zcG9ydF90eXBlID0gU09DS19ER1JBTTsKIAkJc3J4LT50cmFuc3BvcnRfbGVuID0gc2l6ZW9mKHNyeC0+dHJhbnNwb3J0LnNpbjYpOwpAQCAtMzcsNiArMzgsNyBAQAogCQlzcngtPnRyYW5zcG9ydC5zaW42LnNpbjZfcG9ydCA9IHVkcF9oZHIoc2tiKS0+c291cmNlOwogCQlzcngtPnRyYW5zcG9ydC5zaW42LnNpbjZfYWRkciA9IGlwdjZfaGRyKHNrYiktPnNhZGRyOwogCQlyZXR1cm4gMDsKKyNlbmRpZgogCiAJZGVmYXVsdDoKIAkJcHJfd2Fybl9yYXRlbGltaXRlZCgiQUZfUlhSUEM6IFVua25vd24gZXRoIHByb3RvY29sICV1XG4iLApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL0tjb25maWcgYi9uZXQvc2NoZWQvS2NvbmZpZwppbmRleCBjY2Y5MzFiLi44Nzk1NmE3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvS2NvbmZpZworKysgYi9uZXQvc2NoZWQvS2NvbmZpZwpAQCAtNzQ5LDYgKzc0OSwxNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFjdF9jb25ubWFyay4KIAorY29uZmlnIE5FVF9BQ1RfU0tCTU9ECisgICAgICAgIHRyaXN0YXRlICJza2IgZGF0YSBtb2RpZmljYXRpb24gYWN0aW9uIgorICAgICAgICBkZXBlbmRzIG9uIE5FVF9DTFNfQUNUCisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgIFNheSBZIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIHNrYiBkYXRhCisKKyAgICAgICAgIElmIHVuc3VyZSwgc2F5IE4uCisKKyAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKyAgICAgICAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhY3Rfc2tibW9kLgorCiBjb25maWcgTkVUX0FDVF9JRkUKICAgICAgICAgdHJpc3RhdGUgIkludGVyLUZFIGFjdGlvbiBiYXNlZCBvbiBJRVRGIEZvckNFUyBJbnRlckZFIExGQiIKICAgICAgICAgZGVwZW5kcyBvbiBORVRfQ0xTX0FDVApAQCAtNzYxLDYgKzc3MiwxNyBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFjdF9pZmUuCiAKK2NvbmZpZyBORVRfQUNUX1RVTk5FTF9LRVkKKyAgICAgICAgdHJpc3RhdGUgIklQIHR1bm5lbCBtZXRhZGF0YSBtYW5pcHVsYXRpb24iCisgICAgICAgIGRlcGVuZHMgb24gTkVUX0NMU19BQ1QKKyAgICAgICAgLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBzZXQvcmVsZWFzZSBpcCB0dW5uZWwgbWV0YWRhdGEuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhY3RfdHVubmVsX2tleS4KKwogY29uZmlnIE5FVF9JRkVfU0tCTUFSSwogICAgICAgICB0cmlzdGF0ZSAiU3VwcG9ydCB0byBlbmNvZGluZyBkZWNvZGluZyBza2IgbWFyayBvbiBJRkUgYWN0aW9uIgogICAgICAgICBkZXBlbmRzIG9uIE5FVF9BQ1RfSUZFCkBAIC03NzEsNiArNzkzLDExIEBACiAgICAgICAgIGRlcGVuZHMgb24gTkVUX0FDVF9JRkUKICAgICAgICAgLS0taGVscC0tLQogCitjb25maWcgTkVUX0lGRV9TS0JUQ0lOREVYCisgICAgICAgIHRyaXN0YXRlICJTdXBwb3J0IHRvIGVuY29kaW5nIGRlY29kaW5nIHNrYiB0Y2luZGV4IG9uIElGRSBhY3Rpb24iCisgICAgICAgIGRlcGVuZHMgb24gTkVUX0FDVF9JRkUKKyAgICAgICAgLS0taGVscC0tLQorCiBjb25maWcgTkVUX0NMU19JTkQKIAlib29sICJJbmNvbWluZyBkZXZpY2UgY2xhc3NpZmljYXRpb24iCiAJZGVwZW5kcyBvbiBORVRfQ0xTX1UzMiB8fCBORVRfQ0xTX0ZXCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvTWFrZWZpbGUgYi9uZXQvc2NoZWQvTWFrZWZpbGUKaW5kZXggYWUwODhhNS4uNGJkZGEzNiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL01ha2VmaWxlCisrKyBiL25ldC9zY2hlZC9NYWtlZmlsZQpAQCAtMTksOSArMTksMTIgQEAKIG9iai0kKENPTkZJR19ORVRfQUNUX1ZMQU4pCSs9IGFjdF92bGFuLm8KIG9iai0kKENPTkZJR19ORVRfQUNUX0JQRikJKz0gYWN0X2JwZi5vCiBvYmotJChDT05GSUdfTkVUX0FDVF9DT05OTUFSSykJKz0gYWN0X2Nvbm5tYXJrLm8KK29iai0kKENPTkZJR19ORVRfQUNUX1NLQk1PRCkJKz0gYWN0X3NrYm1vZC5vCiBvYmotJChDT05GSUdfTkVUX0FDVF9JRkUpCSs9IGFjdF9pZmUubwogb2JqLSQoQ09ORklHX05FVF9JRkVfU0tCTUFSSykJKz0gYWN0X21ldGFfbWFyay5vCiBvYmotJChDT05GSUdfTkVUX0lGRV9TS0JQUklPKQkrPSBhY3RfbWV0YV9za2JwcmlvLm8KK29iai0kKENPTkZJR19ORVRfSUZFX1NLQlRDSU5ERVgpCSs9IGFjdF9tZXRhX3NrYnRjaW5kZXgubworb2JqLSQoQ09ORklHX05FVF9BQ1RfVFVOTkVMX0tFWSkrPSBhY3RfdHVubmVsX2tleS5vCiBvYmotJChDT05GSUdfTkVUX1NDSF9GSUZPKQkrPSBzY2hfZmlmby5vCiBvYmotJChDT05GSUdfTkVUX1NDSF9DQlEpCSs9IHNjaF9jYnEubwogb2JqLSQoQ09ORklHX05FVF9TQ0hfSFRCKQkrPSBzY2hfaHRiLm8KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfYXBpLmMgYi9uZXQvc2NoZWQvYWN0X2FwaS5jCmluZGV4IGQwOWQwNjguLmM5MTAyMTcgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfYXBpLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9hcGkuYwpAQCAtNTkyLDkgKzU5MiwxOSBAQAogCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKLWludCB0Y2ZfYWN0aW9uX2luaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsCi0JCQkJICBzdHJ1Y3QgbmxhdHRyICplc3QsIGNoYXIgKm5hbWUsIGludCBvdnIsCi0JCQkJICBpbnQgYmluZCwgc3RydWN0IGxpc3RfaGVhZCAqYWN0aW9ucykKK3N0YXRpYyB2b2lkIGNsZWFudXBfYShzdHJ1Y3QgbGlzdF9oZWFkICphY3Rpb25zLCBpbnQgb3ZyKQoreworCXN0cnVjdCB0Y19hY3Rpb24gKmE7CisKKwlpZiAoIW92cikKKwkJcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhLCBhY3Rpb25zLCBsaXN0KQorCQlhLT50Y2ZhX3JlZmNudC0tOworfQorCitpbnQgdGNmX2FjdGlvbl9pbml0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5sYXR0ciAqbmxhLCBzdHJ1Y3QgbmxhdHRyICplc3QsCisJCSAgICBjaGFyICpuYW1lLCBpbnQgb3ZyLCBpbnQgYmluZCwgc3RydWN0IGxpc3RfaGVhZCAqYWN0aW9ucykKIHsKIAlzdHJ1Y3QgbmxhdHRyICp0YltUQ0FfQUNUX01BWF9QUklPICsgMV07CiAJc3RydWN0IHRjX2FjdGlvbiAqYWN0OwpAQCAtNjEyLDggKzYyMiwxNSBAQAogCQkJZ290byBlcnI7CiAJCX0KIAkJYWN0LT5vcmRlciA9IGk7CisJCWlmIChvdnIpCisJCQlhY3QtPnRjZmFfcmVmY250Kys7CiAJCWxpc3RfYWRkX3RhaWwoJmFjdC0+bGlzdCwgYWN0aW9ucyk7CiAJfQorCisJLyogUmVtb3ZlIHRoZSB0ZW1wIHJlZmNudCB3aGljaCB3YXMgbmVjZXNzYXJ5IHRvIHByb3RlY3QgYWdhaW5zdAorCSAqIGRlc3Ryb3lpbmcgYW4gZXhpc3RpbmcgYWN0aW9uIHdoaWNoIHdhcyBiZWluZyByZXBsYWNlZAorCSAqLworCWNsZWFudXBfYShhY3Rpb25zLCBvdnIpOwogCXJldHVybiAwOwogCiBlcnI6CkBAIC04ODMsNiArOTAwLDggQEAKIAkJCWdvdG8gZXJyOwogCQl9CiAJCWFjdC0+b3JkZXIgPSBpOworCQlpZiAoZXZlbnQgPT0gUlRNX0dFVEFDVElPTikKKwkJCWFjdC0+dGNmYV9yZWZjbnQrKzsKIAkJbGlzdF9hZGRfdGFpbCgmYWN0LT5saXN0LCAmYWN0aW9ucyk7CiAJfQogCkBAIC05MjMsOSArOTQyLDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50Ci10Y2ZfYWN0aW9uX2FkZChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKm5sYSwgc3RydWN0IG5sbXNnaGRyICpuLAotCSAgICAgICB1MzIgcG9ydGlkLCBpbnQgb3ZyKQorc3RhdGljIGludCB0Y2ZfYWN0aW9uX2FkZChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKm5sYSwKKwkJCSAgc3RydWN0IG5sbXNnaGRyICpuLCB1MzIgcG9ydGlkLCBpbnQgb3ZyKQogewogCWludCByZXQgPSAwOwogCUxJU1RfSEVBRChhY3Rpb25zKTsKQEAgLTk4OCw4ICsxMDA2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IG5sYXR0ciAqCi1maW5kX2R1bXBfa2luZChjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm4pCitzdGF0aWMgc3RydWN0IG5sYXR0ciAqZmluZF9kdW1wX2tpbmQoY29uc3Qgc3RydWN0IG5sbXNnaGRyICpuKQogewogCXN0cnVjdCBubGF0dHIgKnRiMSwgKnRiMltUQ0FfQUNUX01BWCArIDFdOwogCXN0cnVjdCBubGF0dHIgKnRiW1RDQV9BQ1RfTUFYX1BSSU8gKyAxXTsKQEAgLTEwMTYsOCArMTAzMyw3IEBACiAJcmV0dXJuIGtpbmQ7CiB9CiAKLXN0YXRpYyBpbnQKLXRjX2R1bXBfYWN0aW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3N0YXRpYyBpbnQgdGNfZHVtcF9hY3Rpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9icGYuYyBiL25ldC9zY2hlZC9hY3RfYnBmLmMKaW5kZXggYmZhODcwNy4uMWQzOTYwMCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9icGYuYworKysgYi9uZXQvc2NoZWQvYWN0X2JwZi5jCkBAIC0zOSwxMyArMzksMTAgQEAKIHN0YXRpYyBpbnQgdGNmX2JwZihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphY3QsCiAJCSAgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCiB7CisJYm9vbCBhdF9pbmdyZXNzID0gc2tiX2F0X3RjX2luZ3Jlc3Moc2tiKTsKIAlzdHJ1Y3QgdGNmX2JwZiAqcHJvZyA9IHRvX2JwZihhY3QpOwogCXN0cnVjdCBicGZfcHJvZyAqZmlsdGVyOwogCWludCBhY3Rpb24sIGZpbHRlcl9yZXM7Ci0JYm9vbCBhdF9pbmdyZXNzID0gR19UQ19BVChza2ItPnRjX3ZlcmQpICYgQVRfSU5HUkVTUzsKLQotCWlmICh1bmxpa2VseSghc2tiX21hY19oZWFkZXJfd2FzX3NldChza2IpKSkKLQkJcmV0dXJuIFRDX0FDVF9VTlNQRUM7CiAKIAl0Y2ZfbGFzdHVzZV91cGRhdGUoJnByb2ctPnRjZl90bSk7CiAJYnN0YXRzX2NwdV91cGRhdGUodGhpc19jcHVfcHRyKHByb2ctPmNvbW1vbi5jcHVfYnN0YXRzKSwgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfY3N1bS5jIGIvbmV0L3NjaGVkL2FjdF9jc3VtLmMKaW5kZXggYjVkYmY2My4uZTBkZWZjZSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9jc3VtLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9jc3VtLmMKQEAgLTExNiw4ICsxMTYsOCBAQAogCQlyZXR1cm4gKHZvaWQgKikoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyBpaGwpOwogfQogCi1zdGF0aWMgaW50IHRjZl9jc3VtX2lwdjRfaWNtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgdW5zaWduZWQgaW50IGlobCwgdW5zaWduZWQgaW50IGlwbCkKK3N0YXRpYyBpbnQgdGNmX2NzdW1faXB2NF9pY21wKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBpaGwsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaXBsKQogewogCXN0cnVjdCBpY21waGRyICppY21waDsKIApAQCAtMTUyLDggKzE1Miw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW1faXB2Nl9pY21wKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgaWhsLCB1bnNpZ25lZCBpbnQgaXBsKQorc3RhdGljIGludCB0Y2ZfY3N1bV9pcHY2X2ljbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGlobCwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBpcGwpCiB7CiAJc3RydWN0IGljbXA2aGRyICppY21wNmg7CiAJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmg7CkBAIC0xNzQsOCArMTc0LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCB0Y2ZfY3N1bV9pcHY0X3RjcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICB1bnNpZ25lZCBpbnQgaWhsLCB1bnNpZ25lZCBpbnQgaXBsKQorc3RhdGljIGludCB0Y2ZfY3N1bV9pcHY0X3RjcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaWhsLAorCQkJICAgICB1bnNpZ25lZCBpbnQgaXBsKQogewogCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGg7CkBAIC0xOTUsOCArMTk1LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCB0Y2ZfY3N1bV9pcHY2X3RjcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICB1bnNpZ25lZCBpbnQgaWhsLCB1bnNpZ25lZCBpbnQgaXBsKQorc3RhdGljIGludCB0Y2ZfY3N1bV9pcHY2X3RjcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaWhsLAorCQkJICAgICB1bnNpZ25lZCBpbnQgaXBsKQogewogCXN0cnVjdCB0Y3BoZHIgKnRjcGg7CiAJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmg7CkBAIC0yMTcsOCArMjE3LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCB0Y2ZfY3N1bV9pcHY0X3VkcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICB1bnNpZ25lZCBpbnQgaWhsLCB1bnNpZ25lZCBpbnQgaXBsLCBpbnQgdWRwbGl0ZSkKK3N0YXRpYyBpbnQgdGNmX2NzdW1faXB2NF91ZHAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGlobCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGlwbCwgaW50IHVkcGxpdGUpCiB7CiAJc3RydWN0IHVkcGhkciAqdWRwaDsKIAljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaDsKQEAgLTI3MCw4ICsyNzAsOCBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IHRjZl9jc3VtX2lwdjZfdWRwKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIHVuc2lnbmVkIGludCBpaGwsIHVuc2lnbmVkIGludCBpcGwsIGludCB1ZHBsaXRlKQorc3RhdGljIGludCB0Y2ZfY3N1bV9pcHY2X3VkcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgaWhsLAorCQkJICAgICB1bnNpZ25lZCBpbnQgaXBsLCBpbnQgdWRwbGl0ZSkKIHsKIAlzdHJ1Y3QgdWRwaGRyICp1ZHBoOwogCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoOwpAQCAtMzgwLDggKzM4MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2NzdW1faXB2Nl9ob3BvcHRzKHN0cnVjdCBpcHY2X29wdF9oZHIgKmlwNnhoLAotCQkJCSB1bnNpZ25lZCBpbnQgaXhobCwgdW5zaWduZWQgaW50ICpwbCkKK3N0YXRpYyBpbnQgdGNmX2NzdW1faXB2Nl9ob3BvcHRzKHN0cnVjdCBpcHY2X29wdF9oZHIgKmlwNnhoLCB1bnNpZ25lZCBpbnQgaXhobCwKKwkJCQkgdW5zaWduZWQgaW50ICpwbCkKIHsKIAlpbnQgb2ZmLCBsZW4sIG9wdGxlbjsKIAl1bnNpZ25lZCBjaGFyICp4aCA9ICh2b2lkICopaXA2eGg7CkBAIC00OTQsOCArNDk0LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0Y2ZfY3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYSwgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKK3N0YXRpYyBpbnQgdGNmX2NzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYSwKKwkJICAgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCiB7CiAJc3RydWN0IHRjZl9jc3VtICpwID0gdG9fdGNmX2NzdW0oYSk7CiAJaW50IGFjdGlvbjsKQEAgLTUzMSw4ICs1MzEsOCBAQAogCXJldHVybiBUQ19BQ1RfU0hPVDsKIH0KIAotc3RhdGljIGludCB0Y2ZfY3N1bV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQsIGludCByZWYpCitzdGF0aWMgaW50IHRjZl9jc3VtX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQsCisJCQkgaW50IHJlZikKIHsKIAl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCB0Y2ZfY3N1bSAqcCA9IHRvX3RjZl9jc3VtKGEpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9nYWN0LmMgYi9uZXQvc2NoZWQvYWN0X2dhY3QuYwppbmRleCBlMjRhNDA5Li5lMGFhMzBmIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2dhY3QuYworKysgYi9uZXQvc2NoZWQvYWN0X2dhY3QuYwpAQCAtMTU2LDcgKzE1Niw4IEBACiAJaW50IGFjdGlvbiA9IFJFQURfT05DRShnYWN0LT50Y2ZfYWN0aW9uKTsKIAlzdHJ1Y3QgdGNmX3QgKnRtID0gJmdhY3QtPnRjZl90bTsKIAotCV9ic3RhdHNfY3B1X3VwZGF0ZSh0aGlzX2NwdV9wdHIoZ2FjdC0+Y29tbW9uLmNwdV9ic3RhdHMpLCBieXRlcywgcGFja2V0cyk7CisJX2JzdGF0c19jcHVfdXBkYXRlKHRoaXNfY3B1X3B0cihnYWN0LT5jb21tb24uY3B1X2JzdGF0cyksIGJ5dGVzLAorCQkJICAgcGFja2V0cyk7CiAJaWYgKGFjdGlvbiA9PSBUQ19BQ1RfU0hPVCkKIAkJdGhpc19jcHVfcHRyKGdhY3QtPmNvbW1vbi5jcHVfcXN0YXRzKS0+ZHJvcHMgKz0gcGFja2V0czsKIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF9pZmUuYyBiL25ldC9zY2hlZC9hY3RfaWZlLmMKaW5kZXggMTQxYTA2ZS4uOTVjNDYzYyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2FjdF9pZmUuYworKysgYi9uZXQvc2NoZWQvYWN0X2lmZS5jCkBAIC01Myw3ICs1Myw3IEBACiAJdTMyICp0bHYgPSAodTMyICopKHNrYmRhdGEpOwogCXUxNiB0b3RsZW4gPSBubGFfdG90YWxfc2l6ZShkbGVuKTsJLyphbGlnbm1lbnQgKyBoZHIgKi8KIAljaGFyICpkcHRyID0gKGNoYXIgKil0bHYgKyBOTEFfSERSTEVOOwotCXUzMiBodGx2ID0gYXR0cnR5cGUgPDwgMTYgfCB0b3RsZW47CisJdTMyIGh0bHYgPSBhdHRydHlwZSA8PCAxNiB8IChkbGVuICsgTkxBX0hEUkxFTik7CiAKIAkqdGx2ID0gaHRvbmwoaHRsdik7CiAJbWVtc2V0KGRwdHIsIDAsIHRvdGxlbiAtIE5MQV9IRFJMRU4pOwpAQCAtNjMsNiArNjMsMjMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlmZV90bHZfbWV0YV9lbmNvZGUpOwogCitpbnQgaWZlX2VuY29kZV9tZXRhX3UxNih1MTYgbWV0YXZhbCwgdm9pZCAqc2tiZGF0YSwgc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pKQoreworCXUxNiBlZGF0YSA9IDA7CisKKwlpZiAobWktPm1ldGF2YWwpCisJCWVkYXRhID0gKih1MTYgKiltaS0+bWV0YXZhbDsKKwllbHNlIGlmIChtZXRhdmFsKQorCQllZGF0YSA9IG1ldGF2YWw7CisKKwlpZiAoIWVkYXRhKSAvKiB3aWxsIG5vdCBlbmNvZGUgKi8KKwkJcmV0dXJuIDA7CisKKwllZGF0YSA9IGh0b25zKGVkYXRhKTsKKwlyZXR1cm4gaWZlX3Rsdl9tZXRhX2VuY29kZShza2JkYXRhLCBtaS0+bWV0YWlkLCAyLCAmZWRhdGEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWZlX2VuY29kZV9tZXRhX3UxNik7CisKIGludCBpZmVfZ2V0X21ldGFfdTMyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICptaSkKIHsKIAlpZiAobWktPm1ldGF2YWwpCkBAIC04MSw2ICs5OCwxNSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWZlX2NoZWNrX21ldGFfdTMyKTsKIAoraW50IGlmZV9jaGVja19tZXRhX3UxNih1MTYgbWV0YXZhbCwgc3RydWN0IHRjZl9tZXRhX2luZm8gKm1pKQoreworCWlmIChtZXRhdmFsIHx8IG1pLT5tZXRhdmFsKQorCQlyZXR1cm4gODsgLyogVCtMKyhWKSA9PSAyKzIrKDIrMmJ5dGVwYWQpICovCisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlmZV9jaGVja19tZXRhX3UxNik7CisKIGludCBpZmVfZW5jb2RlX21ldGFfdTMyKHUzMiBtZXRhdmFsLCB2b2lkICpza2JkYXRhLCBzdHJ1Y3QgdGNmX21ldGFfaW5mbyAqbWkpCiB7CiAJdTMyIGVkYXRhID0gbWV0YXZhbDsKQEAgLTEzNSw3ICsxNjEsNyBAQAogCiBpbnQgaWZlX3ZhbGlkYXRlX21ldGFfdTMyKHZvaWQgKnZhbCwgaW50IGxlbikKIHsKLQlpZiAobGVuID09IDQpCisJaWYgKGxlbiA9PSBzaXplb2YodTMyKSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0NCw4ICsxNzAsOCBAQAogCiBpbnQgaWZlX3ZhbGlkYXRlX21ldGFfdTE2KHZvaWQgKnZhbCwgaW50IGxlbikKIHsKLQkvKiBsZW5ndGggd2lsbCBpbmNsdWRlIHBhZGRpbmcgKi8KLQlpZiAobGVuID09IE5MQV9BTElHTigyKSkKKwkvKiBsZW5ndGggd2lsbCBub3QgaW5jbHVkZSBwYWRkaW5nICovCisJaWYgKGxlbiA9PSBzaXplb2YodTE2KSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTYyNyw3ICs2NTMsNyBAQAogCXN0cnVjdCB0Y2ZfaWZlX2luZm8gKmlmZSA9IHRvX2lmZShhKTsKIAlpbnQgYWN0aW9uID0gaWZlLT50Y2ZfYWN0aW9uOwogCXN0cnVjdCBpZmVoZWFkciAqaWZlaGRyID0gKHN0cnVjdCBpZmVoZWFkciAqKXNrYi0+ZGF0YTsKLQl1MTYgaWZlaGRybG4gPSBpZmVoZHItPm1ldGFsZW47CisJaW50IGlmZWhkcmxuID0gKGludClpZmVoZHItPm1ldGFsZW47CiAJc3RydWN0IG1ldGFfdGx2aGRyICp0bHYgPSAoc3RydWN0IG1ldGFfdGx2aGRyICopKGlmZWhkci0+dGx2X2RhdGEpOwogCiAJc3Bpbl9sb2NrKCZpZmUtPnRjZl9sb2NrKTsKQEAgLTY1MiwxMiArNjc4LDE0IEBACiAJCXU4ICp0bHZkYXRhID0gKHU4ICopdGx2OwogCQl1MTYgbXR5cGUgPSB0bHYtPnR5cGU7CiAJCXUxNiBtbGVuID0gdGx2LT5sZW47CisJCXUxNiBhbGVuOwogCiAJCW10eXBlID0gbnRvaHMobXR5cGUpOwogCQltbGVuID0gbnRvaHMobWxlbik7CisJCWFsZW4gPSBOTEFfQUxJR04obWxlbik7CiAKLQkJaWYgKGZpbmRfZGVjb2RlX21ldGFpZChza2IsIGlmZSwgbXR5cGUsIChtbGVuIC0gNCksCi0JCQkJICAgICAgICh2b2lkICopKHRsdmRhdGEgKyA0KSkpIHsKKwkJaWYgKGZpbmRfZGVjb2RlX21ldGFpZChza2IsIGlmZSwgbXR5cGUsIChtbGVuIC0gTkxBX0hEUkxFTiksCisJCQkJICAgICAgICh2b2lkICopKHRsdmRhdGEgKyBOTEFfSERSTEVOKSkpIHsKIAkJCS8qIGFidXNlIG92ZXJsaW1pdHMgdG8gY291bnQgd2hlbiB3ZSByZWNlaXZlIG1ldGFkYXRhCiAJCQkgKiBidXQgZG9udCBoYXZlIGFuIG9wcyBmb3IgaXQKIAkJCSAqLwpAQCAtNjY2LDggKzY5NCw4IEBACiAJCQlpZmUtPnRjZl9xc3RhdHMub3ZlcmxpbWl0cysrOwogCQl9CiAKLQkJdGx2ZGF0YSArPSBtbGVuOwotCQlpZmVoZHJsbiAtPSBtbGVuOworCQl0bHZkYXRhICs9IGFsZW47CisJCWlmZWhkcmxuIC09IGFsZW47CiAJCXRsdiA9IChzdHJ1Y3QgbWV0YV90bHZoZHIgKil0bHZkYXRhOwogCX0KIApAQCAtNzM4LDggKzc2Niw2IEBACiAJCXJldHVybiBUQ19BQ1RfU0hPVDsKIAl9CiAKLQlpZXRoaCA9IGV0aF9oZHIoc2tiKTsKLQogCWVyciA9IHNrYl9jb3dfaGVhZChza2IsIGhkcm0pOwogCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCWlmZS0+dGNmX3FzdGF0cy5kcm9wcysrOwpAQCAtNzUwLDYgKzc3Niw3IEBACiAJaWYgKCEoYXQgJiBBVF9FR1JFU1MpKQogCQlza2JfcHVzaChza2IsIHNrYi0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4pOwogCisJaWV0aGggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKIAlfX3NrYl9wdXNoKHNrYiwgaGRybSk7CiAJbWVtY3B5KHNrYi0+ZGF0YSwgaWV0aGgsIHNrYi0+bWFjX2xlbik7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfbWV0YV9za2J0Y2luZGV4LmMgYi9uZXQvc2NoZWQvYWN0X21ldGFfc2tidGNpbmRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzU3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvYWN0X21ldGFfc2tidGNpbmRleC5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBuZXQvc2NoZWQvYWN0X21ldGFfdGNfaW5kZXguYyBJRkUgc2tiLT50Y19pbmRleCBtZXRhZGF0YSBtb2R1bGUKKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBjb3B5cmlnaHQgSmFtYWwgSGFkaSBTYWxpbSAoMjAxNikKKyAqCisqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RjX2FjdC90Y19pZmUuaD4KKyNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX2lmZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorCitzdGF0aWMgaW50IHNrYnRjaW5kZXhfZW5jb2RlKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKnNrYmRhdGEsCisJCQkgICAgIHN0cnVjdCB0Y2ZfbWV0YV9pbmZvICplKQoreworCXUzMiBpZmV0Y19pbmRleCA9IHNrYi0+dGNfaW5kZXg7CisKKwlyZXR1cm4gaWZlX2VuY29kZV9tZXRhX3UxNihpZmV0Y19pbmRleCwgc2tiZGF0YSwgZSk7Cit9CisKK3N0YXRpYyBpbnQgc2tidGNpbmRleF9kZWNvZGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdm9pZCAqZGF0YSwgdTE2IGxlbikKK3sKKwl1MTYgaWZldGNfaW5kZXggPSAqKHUxNiAqKWRhdGE7CisKKwlza2ItPnRjX2luZGV4ID0gbnRvaHMoaWZldGNfaW5kZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNrYnRjaW5kZXhfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjZl9tZXRhX2luZm8gKmUpCit7CisJcmV0dXJuIGlmZV9jaGVja19tZXRhX3UxNihza2ItPnRjX2luZGV4LCBlKTsKK30KKworc3RhdGljIHN0cnVjdCB0Y2ZfbWV0YV9vcHMgaWZlX3NrYnRjaW5kZXhfb3BzID0geworCS5tZXRhaWQgPSBJRkVfTUVUQV9UQ0lOREVYLAorCS5tZXRhdHlwZSA9IE5MQV9VMTYsCisJLm5hbWUgPSAidGNfaW5kZXgiLAorCS5zeW5vcHNpcyA9ICJza2IgdGNfaW5kZXggMTYgYml0IG1ldGFkYXRhIiwKKwkuY2hlY2tfcHJlc2VuY2UgPSBza2J0Y2luZGV4X2NoZWNrLAorCS5lbmNvZGUgPSBza2J0Y2luZGV4X2VuY29kZSwKKwkuZGVjb2RlID0gc2tidGNpbmRleF9kZWNvZGUsCisJLmdldCA9IGlmZV9nZXRfbWV0YV91MTYsCisJLmFsbG9jID0gaWZlX2FsbG9jX21ldGFfdTE2LAorCS5yZWxlYXNlID0gaWZlX3JlbGVhc2VfbWV0YV9nZW4sCisJLnZhbGlkYXRlID0gaWZlX3ZhbGlkYXRlX21ldGFfdTE2LAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaWZldGNfaW5kZXhfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfaWZlX29wKCZpZmVfc2tidGNpbmRleF9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaWZldGNfaW5kZXhfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2lmZV9vcCgmaWZlX3NrYnRjaW5kZXhfb3BzKTsKK30KKworbW9kdWxlX2luaXQoaWZldGNfaW5kZXhfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoaWZldGNfaW5kZXhfY2xlYW51cF9tb2R1bGUpOworCitNT0RVTEVfQVVUSE9SKCJKYW1hbCBIYWRpIFNhbGltKDIwMTYpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVyLUZFIHNrYiB0Y19pbmRleCBtZXRhZGF0YSBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19JRkVfTUVUQShJRkVfTUVUQV9TS0JUQ0lOREVYKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9hY3RfbWlycmVkLmMgYi9uZXQvc2NoZWQvYWN0X21pcnJlZC5jCmluZGV4IDYwMzhjODUuLjY2N2RjMzggMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9hY3RfbWlycmVkLmMKKysrIGIvbmV0L3NjaGVkL2FjdF9taXJyZWQuYwpAQCAtMjA0LDcgKzIwNCwxNSBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbnQgdGNmX21pcnJlZF9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kLCBpbnQgcmVmKQorc3RhdGljIHZvaWQgdGNmX3N0YXRzX3VwZGF0ZShzdHJ1Y3QgdGNfYWN0aW9uICphLCB1NjQgYnl0ZXMsIHUzMiBwYWNrZXRzLAorCQkJICAgICB1NjQgbGFzdHVzZSkKK3sKKwl0Y2ZfbGFzdHVzZV91cGRhdGUoJmEtPnRjZmFfdG0pOworCV9ic3RhdHNfY3B1X3VwZGF0ZSh0aGlzX2NwdV9wdHIoYS0+Y3B1X2JzdGF0cyksIGJ5dGVzLCBwYWNrZXRzKTsKK30KKworc3RhdGljIGludCB0Y2ZfbWlycmVkX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQsCisJCQkgICBpbnQgcmVmKQogewogCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjZl9taXJyZWQgKm0gPSB0b19taXJyZWQoYSk7CkBAIC0yODAsNiArMjg4LDcgQEAKIAkudHlwZQkJPQlUQ0FfQUNUX01JUlJFRCwKIAkub3duZXIJCT0JVEhJU19NT0RVTEUsCiAJLmFjdAkJPQl0Y2ZfbWlycmVkLAorCS5zdGF0c191cGRhdGUJPQl0Y2Zfc3RhdHNfdXBkYXRlLAogCS5kdW1wCQk9CXRjZl9taXJyZWRfZHVtcCwKIAkuY2xlYW51cAk9CXRjZl9taXJyZWRfcmVsZWFzZSwKIAkuaW5pdAkJPQl0Y2ZfbWlycmVkX2luaXQsCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3BvbGljZS5jIGIvbmV0L3NjaGVkL2FjdF9wb2xpY2UuYwppbmRleCA4YTNiZTFkLi5kMWJkMjQ4IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X3BvbGljZS5jCisrKyBiL25ldC9zY2hlZC9hY3RfcG9saWNlLmMKQEAgLTI0OSw2ICsyNDksOCBAQAogCQkJcG9saWNlLT50Y2ZwX3RfYyA9IG5vdzsKIAkJCXBvbGljZS0+dGNmcF90b2tzID0gdG9rczsKIAkJCXBvbGljZS0+dGNmcF9wdG9rcyA9IHB0b2tzOworCQkJaWYgKHBvbGljZS0+dGNmcF9yZXN1bHQgPT0gVENfQUNUX1NIT1QpCisJCQkJcG9saWNlLT50Y2ZfcXN0YXRzLmRyb3BzKys7CiAJCQlzcGluX3VubG9jaygmcG9saWNlLT50Y2ZfbG9jayk7CiAJCQlyZXR1cm4gcG9saWNlLT50Y2ZwX3Jlc3VsdDsKIAkJfQpAQCAtMjYxLDggKzI2Myw4IEBACiAJcmV0dXJuIHBvbGljZS0+dGNmX2FjdGlvbjsKIH0KIAotc3RhdGljIGludAotdGNmX2FjdF9wb2xpY2VfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCwgaW50IHJlZikKK3N0YXRpYyBpbnQgdGNmX2FjdF9wb2xpY2VfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorCQkJICAgICAgIGludCBiaW5kLCBpbnQgcmVmKQogewogCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CiAJc3RydWN0IHRjZl9wb2xpY2UgKnBvbGljZSA9IHRvX3BvbGljZShhKTsKQEAgLTM0NywxNCArMzQ5LDEyIEBACiAJLnNpemUgPSBzaXplb2Yoc3RydWN0IHRjX2FjdGlvbl9uZXQpLAogfTsKIAotc3RhdGljIGludCBfX2luaXQKLXBvbGljZV9pbml0X21vZHVsZSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcG9saWNlX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJcmV0dXJuIHRjZl9yZWdpc3Rlcl9hY3Rpb24oJmFjdF9wb2xpY2Vfb3BzLCAmcG9saWNlX25ldF9vcHMpOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQKLXBvbGljZV9jbGVhbnVwX21vZHVsZSh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IHBvbGljZV9jbGVhbnVwX21vZHVsZSh2b2lkKQogewogCXRjZl91bnJlZ2lzdGVyX2FjdGlvbigmYWN0X3BvbGljZV9vcHMsICZwb2xpY2VfbmV0X29wcyk7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3NrYm1vZC5jIGIvbmV0L3NjaGVkL2FjdF9za2Jtb2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Q5NjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L3NjaGVkL2FjdF9za2Jtb2QuYwpAQCAtMCwwICsxLDMwMSBAQAorLyoKKyAqIG5ldC9zY2hlZC9hY3Rfc2tibW9kLmMgIHNrYiBkYXRhIG1vZGlmaWVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEphbWFsIEhhZGkgU2FsaW0gPGpoc0Btb2phdGF0dS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CisKKyNpbmNsdWRlIDxsaW51eC90Y19hY3QvdGNfc2tibW9kLmg+CisjaW5jbHVkZSA8bmV0L3RjX2FjdC90Y19za2Jtb2QuaD4KKworI2RlZmluZSBTS0JNT0RfVEFCX01BU0sgICAgIDE1CisKK3N0YXRpYyBpbnQgc2tibW9kX25ldF9pZDsKK3N0YXRpYyBzdHJ1Y3QgdGNfYWN0aW9uX29wcyBhY3Rfc2tibW9kX29wczsKKworI2RlZmluZSBNQVhfRURJVF9MRU4gRVRIX0hMRU4KK3N0YXRpYyBpbnQgdGNmX3NrYm1vZF9ydW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYSwKKwkJCSAgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKK3sKKwlzdHJ1Y3QgdGNmX3NrYm1vZCAqZCA9IHRvX3NrYm1vZChhKTsKKwlpbnQgYWN0aW9uOworCXN0cnVjdCB0Y2Zfc2tibW9kX3BhcmFtcyAqcDsKKwl1NjQgZmxhZ3M7CisJaW50IGVycjsKKworCXRjZl9sYXN0dXNlX3VwZGF0ZSgmZC0+dGNmX3RtKTsKKwlic3RhdHNfY3B1X3VwZGF0ZSh0aGlzX2NwdV9wdHIoZC0+Y29tbW9uLmNwdV9ic3RhdHMpLCBza2IpOworCisJLyogWFhYOiBpZiB5b3UgYXJlIGdvaW5nIHRvIGVkaXQgbW9yZSBmaWVsZHMgYmV5b25kIGV0aGVybmV0IGhlYWRlcgorCSAqIChleGFtcGxlIHdoZW4geW91IGFkZCBJUCBoZWFkZXIgcmVwbGFjZW1lbnQgb3IgdmxhbiBzd2FwKQorCSAqIHRoZW4gTUFYX0VESVRfTEVOIG5lZWRzIHRvIGNoYW5nZSBhcHByb3ByaWF0ZWx5CisJKi8KKwllcnIgPSBza2JfZW5zdXJlX3dyaXRhYmxlKHNrYiwgTUFYX0VESVRfTEVOKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeyAvKiBiZXN0IHBvbGljeSBpcyB0byBkcm9wIG9uIHRoZSBmbG9vciAqLworCQlxc3RhdHNfb3ZlcmxpbWl0X2luYyh0aGlzX2NwdV9wdHIoZC0+Y29tbW9uLmNwdV9xc3RhdHMpKTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJjdV9yZWFkX2xvY2soKTsKKwlhY3Rpb24gPSBSRUFEX09OQ0UoZC0+dGNmX2FjdGlvbik7CisJaWYgKHVubGlrZWx5KGFjdGlvbiA9PSBUQ19BQ1RfU0hPVCkpIHsKKwkJcXN0YXRzX292ZXJsaW1pdF9pbmModGhpc19jcHVfcHRyKGQtPmNvbW1vbi5jcHVfcXN0YXRzKSk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gYWN0aW9uOworCX0KKworCXAgPSByY3VfZGVyZWZlcmVuY2UoZC0+c2tibW9kX3ApOworCWZsYWdzID0gcC0+ZmxhZ3M7CisJaWYgKGZsYWdzICYgU0tCTU9EX0ZfRE1BQykKKwkJZXRoZXJfYWRkcl9jb3B5KGV0aF9oZHIoc2tiKS0+aF9kZXN0LCBwLT5ldGhfZHN0KTsKKwlpZiAoZmxhZ3MgJiBTS0JNT0RfRl9TTUFDKQorCQlldGhlcl9hZGRyX2NvcHkoZXRoX2hkcihza2IpLT5oX3NvdXJjZSwgcC0+ZXRoX3NyYyk7CisJaWYgKGZsYWdzICYgU0tCTU9EX0ZfRVRZUEUpCisJCWV0aF9oZHIoc2tiKS0+aF9wcm90byA9IHAtPmV0aF90eXBlOworCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKGZsYWdzICYgU0tCTU9EX0ZfU1dBUE1BQykgeworCQl1MTYgdG1wYWRkcltFVEhfQUxFTiAvIDJdOyAvKiBldGhlcl9hZGRyX2NvcHkoKSByZXF1aXJlbWVudCAqLworCQkvKlhYWDogSSBhbSBzdXJlIHdlIGNhbiBjb21lIHVwIHdpdGggbW9yZSBlZmZpY2llbnQgc3dhcHBpbmcqLworCQlldGhlcl9hZGRyX2NvcHkoKHU4ICopdG1wYWRkciwgZXRoX2hkcihza2IpLT5oX2Rlc3QpOworCQlldGhlcl9hZGRyX2NvcHkoZXRoX2hkcihza2IpLT5oX2Rlc3QsIGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UpOworCQlldGhlcl9hZGRyX2NvcHkoZXRoX2hkcihza2IpLT5oX3NvdXJjZSwgKHU4ICopdG1wYWRkcik7CisJfQorCisJcmV0dXJuIGFjdGlvbjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHNrYm1vZF9wb2xpY3lbVENBX1NLQk1PRF9NQVggKyAxXSA9IHsKKwlbVENBX1NLQk1PRF9QQVJNU10JCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCB0Y19za2Jtb2QpIH0sCisJW1RDQV9TS0JNT0RfRE1BQ10JCT0geyAubGVuID0gRVRIX0FMRU4gfSwKKwlbVENBX1NLQk1PRF9TTUFDXQkJPSB7IC5sZW4gPSBFVEhfQUxFTiB9LAorCVtUQ0FfU0tCTU9EX0VUWVBFXQkJPSB7IC50eXBlID0gTkxBX1UxNiB9LAorfTsKKworc3RhdGljIGludCB0Y2Zfc2tibW9kX2luaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsCisJCQkgICBzdHJ1Y3QgbmxhdHRyICplc3QsIHN0cnVjdCB0Y19hY3Rpb24gKiphLAorCQkJICAgaW50IG92ciwgaW50IGJpbmQpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCBza2Jtb2RfbmV0X2lkKTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltUQ0FfU0tCTU9EX01BWCArIDFdOworCXN0cnVjdCB0Y2Zfc2tibW9kX3BhcmFtcyAqcCwgKnBfb2xkOworCXN0cnVjdCB0Y19za2Jtb2QgKnBhcm07CisJc3RydWN0IHRjZl9za2Jtb2QgKmQ7CisJYm9vbCBleGlzdHMgPSBmYWxzZTsKKwl1OCAqZGFkZHIgPSBOVUxMOworCXU4ICpzYWRkciA9IE5VTEw7CisJdTE2IGV0aF90eXBlID0gMDsKKwl1MzIgbGZsYWdzID0gMDsKKwlpbnQgcmV0ID0gMCwgZXJyOworCisJaWYgKCFubGEpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgVENBX1NLQk1PRF9NQVgsIG5sYSwgc2tibW9kX3BvbGljeSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAoIXRiW1RDQV9TS0JNT0RfUEFSTVNdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0YltUQ0FfU0tCTU9EX0RNQUNdKSB7CisJCWRhZGRyID0gbmxhX2RhdGEodGJbVENBX1NLQk1PRF9ETUFDXSk7CisJCWxmbGFncyB8PSBTS0JNT0RfRl9ETUFDOworCX0KKworCWlmICh0YltUQ0FfU0tCTU9EX1NNQUNdKSB7CisJCXNhZGRyID0gbmxhX2RhdGEodGJbVENBX1NLQk1PRF9TTUFDXSk7CisJCWxmbGFncyB8PSBTS0JNT0RfRl9TTUFDOworCX0KKworCWlmICh0YltUQ0FfU0tCTU9EX0VUWVBFXSkgeworCQlldGhfdHlwZSA9IG5sYV9nZXRfdTE2KHRiW1RDQV9TS0JNT0RfRVRZUEVdKTsKKwkJbGZsYWdzIHw9IFNLQk1PRF9GX0VUWVBFOworCX0KKworCXBhcm0gPSBubGFfZGF0YSh0YltUQ0FfU0tCTU9EX1BBUk1TXSk7CisJaWYgKHBhcm0tPmZsYWdzICYgU0tCTU9EX0ZfU1dBUE1BQykKKwkJbGZsYWdzID0gU0tCTU9EX0ZfU1dBUE1BQzsKKworCWV4aXN0cyA9IHRjZl9oYXNoX2NoZWNrKHRuLCBwYXJtLT5pbmRleCwgYSwgYmluZCk7CisJaWYgKGV4aXN0cyAmJiBiaW5kKQorCQlyZXR1cm4gMDsKKworCWlmICghbGZsYWdzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZXhpc3RzKSB7CisJCXJldCA9IHRjZl9oYXNoX2NyZWF0ZSh0biwgcGFybS0+aW5kZXgsIGVzdCwgYSwKKwkJCQkgICAgICAmYWN0X3NrYm1vZF9vcHMsIGJpbmQsIHRydWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBBQ1RfUF9DUkVBVEVEOworCX0gZWxzZSB7CisJCXRjZl9oYXNoX3JlbGVhc2UoKmEsIGJpbmQpOworCQlpZiAoIW92cikKKwkJCXJldHVybiAtRUVYSVNUOworCX0KKworCWQgPSB0b19za2Jtb2QoKmEpOworCisJQVNTRVJUX1JUTkwoKTsKKwlwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRjZl9za2Jtb2RfcGFyYW1zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFwKSkgeworCQlpZiAob3ZyKQorCQkJdGNmX2hhc2hfcmVsZWFzZSgqYSwgYmluZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXAtPmZsYWdzID0gbGZsYWdzOworCWQtPnRjZl9hY3Rpb24gPSBwYXJtLT5hY3Rpb247CisKKwlwX29sZCA9IHJ0bmxfZGVyZWZlcmVuY2UoZC0+c2tibW9kX3ApOworCisJaWYgKG92cikKKwkJc3Bpbl9sb2NrX2JoKCZkLT50Y2ZfbG9jayk7CisKKwlpZiAobGZsYWdzICYgU0tCTU9EX0ZfRE1BQykKKwkJZXRoZXJfYWRkcl9jb3B5KHAtPmV0aF9kc3QsIGRhZGRyKTsKKwlpZiAobGZsYWdzICYgU0tCTU9EX0ZfU01BQykKKwkJZXRoZXJfYWRkcl9jb3B5KHAtPmV0aF9zcmMsIHNhZGRyKTsKKwlpZiAobGZsYWdzICYgU0tCTU9EX0ZfRVRZUEUpCisJCXAtPmV0aF90eXBlID0gaHRvbnMoZXRoX3R5cGUpOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKGQtPnNrYm1vZF9wLCBwKTsKKwlpZiAob3ZyKQorCQlzcGluX3VubG9ja19iaCgmZC0+dGNmX2xvY2spOworCisJaWYgKHBfb2xkKQorCQlrZnJlZV9yY3UocF9vbGQsIHJjdSk7CisKKwlpZiAocmV0ID09IEFDVF9QX0NSRUFURUQpCisJCXRjZl9oYXNoX2luc2VydCh0biwgKmEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHRjZl9za2Jtb2RfY2xlYW51cChzdHJ1Y3QgdGNfYWN0aW9uICphLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgdGNmX3NrYm1vZCAqZCA9IHRvX3NrYm1vZChhKTsKKwlzdHJ1Y3QgdGNmX3NrYm1vZF9wYXJhbXMgICpwOworCisJcCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoZC0+c2tibW9kX3AsIDEpOworCWtmcmVlX3JjdShwLCByY3UpOworfQorCitzdGF0aWMgaW50IHRjZl9za2Jtb2RfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorCQkJICAgaW50IGJpbmQsIGludCByZWYpCit7CisJc3RydWN0IHRjZl9za2Jtb2QgKmQgPSB0b19za2Jtb2QoYSk7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKKwlzdHJ1Y3QgdGNmX3NrYm1vZF9wYXJhbXMgICpwID0gcnRubF9kZXJlZmVyZW5jZShkLT5za2Jtb2RfcCk7CisJc3RydWN0IHRjX3NrYm1vZCBvcHQgPSB7CisJCS5pbmRleCAgID0gZC0+dGNmX2luZGV4LAorCQkucmVmY250ICA9IGQtPnRjZl9yZWZjbnQgLSByZWYsCisJCS5iaW5kY250ID0gZC0+dGNmX2JpbmRjbnQgLSBiaW5kLAorCQkuYWN0aW9uICA9IGQtPnRjZl9hY3Rpb24sCisJfTsKKwlzdHJ1Y3QgdGNmX3QgdDsKKworCW9wdC5mbGFncyAgPSBwLT5mbGFnczsKKwlpZiAobmxhX3B1dChza2IsIFRDQV9TS0JNT0RfUEFSTVMsIHNpemVvZihvcHQpLCAmb3B0KSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKChwLT5mbGFncyAmIFNLQk1PRF9GX0RNQUMpICYmCisJICAgIG5sYV9wdXQoc2tiLCBUQ0FfU0tCTU9EX0RNQUMsIEVUSF9BTEVOLCBwLT5ldGhfZHN0KSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKChwLT5mbGFncyAmIFNLQk1PRF9GX1NNQUMpICYmCisJICAgIG5sYV9wdXQoc2tiLCBUQ0FfU0tCTU9EX1NNQUMsIEVUSF9BTEVOLCBwLT5ldGhfc3JjKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKChwLT5mbGFncyAmIFNLQk1PRF9GX0VUWVBFKSAmJgorCSAgICBubGFfcHV0X3UxNihza2IsIFRDQV9TS0JNT0RfRVRZUEUsIG50b2hzKHAtPmV0aF90eXBlKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJdGNmX3RtX2R1bXAoJnQsICZkLT50Y2ZfdG0pOworCWlmIChubGFfcHV0XzY0Yml0KHNrYiwgVENBX1NLQk1PRF9UTSwgc2l6ZW9mKHQpLCAmdCwgVENBX1NLQk1PRF9QQUQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCXJldHVybiBza2ItPmxlbjsKK25sYV9wdXRfZmFpbHVyZToKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlubG1zZ190cmltKHNrYiwgYik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHRjZl9za2Jtb2Rfd2Fsa2VyKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLCBpbnQgdHlwZSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHRjX2FjdGlvbl9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHNrYm1vZF9uZXRfaWQpOworCisJcmV0dXJuIHRjZl9nZW5lcmljX3dhbGtlcih0biwgc2tiLCBjYiwgdHlwZSwgb3BzKTsKK30KKworc3RhdGljIGludCB0Y2Zfc2tibW9kX3NlYXJjaChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y19hY3Rpb24gKiphLCB1MzIgaW5kZXgpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCBza2Jtb2RfbmV0X2lkKTsKKworCXJldHVybiB0Y2ZfaGFzaF9zZWFyY2godG4sIGEsIGluZGV4KTsKK30KKworc3RhdGljIHN0cnVjdCB0Y19hY3Rpb25fb3BzIGFjdF9za2Jtb2Rfb3BzID0geworCS5raW5kCQk9CSJza2Jtb2QiLAorCS50eXBlCQk9CVRDQV9BQ1RfU0tCTU9ELAorCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkuYWN0CQk9CXRjZl9za2Jtb2RfcnVuLAorCS5kdW1wCQk9CXRjZl9za2Jtb2RfZHVtcCwKKwkuaW5pdAkJPQl0Y2Zfc2tibW9kX2luaXQsCisJLmNsZWFudXAJPQl0Y2Zfc2tibW9kX2NsZWFudXAsCisJLndhbGsJCT0JdGNmX3NrYm1vZF93YWxrZXIsCisJLmxvb2t1cAkJPQl0Y2Zfc2tibW9kX3NlYXJjaCwKKwkuc2l6ZQkJPQlzaXplb2Yoc3RydWN0IHRjZl9za2Jtb2QpLAorfTsKKworc3RhdGljIF9fbmV0X2luaXQgaW50IHNrYm1vZF9pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCBza2Jtb2RfbmV0X2lkKTsKKworCXJldHVybiB0Y19hY3Rpb25fbmV0X2luaXQodG4sICZhY3Rfc2tibW9kX29wcywgU0tCTU9EX1RBQl9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgX19uZXRfZXhpdCBza2Jtb2RfZXhpdF9uZXQoc3RydWN0IG5ldCAqbmV0KQoreworCXN0cnVjdCB0Y19hY3Rpb25fbmV0ICp0biA9IG5ldF9nZW5lcmljKG5ldCwgc2tibW9kX25ldF9pZCk7CisKKwl0Y19hY3Rpb25fbmV0X2V4aXQodG4pOworfQorCitzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIHNrYm1vZF9uZXRfb3BzID0geworCS5pbml0ID0gc2tibW9kX2luaXRfbmV0LAorCS5leGl0ID0gc2tibW9kX2V4aXRfbmV0LAorCS5pZCAgID0gJnNrYm1vZF9uZXRfaWQsCisJLnNpemUgPSBzaXplb2Yoc3RydWN0IHRjX2FjdGlvbl9uZXQpLAorfTsKKworTU9EVUxFX0FVVEhPUigiSmFtYWwgSGFkaSBTYWxpbSwgPGpoc0Btb2phdGF0dS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNLQiBkYXRhIG1vZC1pbmciKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgc2tibW9kX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHRjZl9yZWdpc3Rlcl9hY3Rpb24oJmFjdF9za2Jtb2Rfb3BzLCAmc2tibW9kX25ldF9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2tibW9kX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJdGNmX3VucmVnaXN0ZXJfYWN0aW9uKCZhY3Rfc2tibW9kX29wcywgJnNrYm1vZF9uZXRfb3BzKTsKK30KKworbW9kdWxlX2luaXQoc2tibW9kX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHNrYm1vZF9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X3R1bm5lbF9rZXkuYyBiL25ldC9zY2hlZC9hY3RfdHVubmVsX2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDdiZGYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc2NoZWQvYWN0X3R1bm5lbF9rZXkuYwpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgQW1pciBWYWRhaSA8YW1pckB2YWRhaS5tZT4KKyAqIENvcHlyaWdodCAoYykgMjAxNiwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KKyNpbmNsdWRlIDxuZXQvZHN0Lmg+CisjaW5jbHVkZSA8bmV0L2RzdF9tZXRhZGF0YS5oPgorCisjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX3R1bm5lbF9rZXkuaD4KKyNpbmNsdWRlIDxuZXQvdGNfYWN0L3RjX3R1bm5lbF9rZXkuaD4KKworI2RlZmluZSBUVU5ORUxfS0VZX1RBQl9NQVNLICAgICAxNQorCitzdGF0aWMgaW50IHR1bm5lbF9rZXlfbmV0X2lkOworc3RhdGljIHN0cnVjdCB0Y19hY3Rpb25fb3BzIGFjdF90dW5uZWxfa2V5X29wczsKKworc3RhdGljIGludCB0dW5uZWxfa2V5X2FjdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorCQkJICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQoreworCXN0cnVjdCB0Y2ZfdHVubmVsX2tleSAqdCA9IHRvX3R1bm5lbF9rZXkoYSk7CisJc3RydWN0IHRjZl90dW5uZWxfa2V5X3BhcmFtcyAqcGFyYW1zOworCWludCBhY3Rpb247CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlwYXJhbXMgPSByY3VfZGVyZWZlcmVuY2UodC0+cGFyYW1zKTsKKworCXRjZl9sYXN0dXNlX3VwZGF0ZSgmdC0+dGNmX3RtKTsKKwlic3RhdHNfY3B1X3VwZGF0ZSh0aGlzX2NwdV9wdHIodC0+Y29tbW9uLmNwdV9ic3RhdHMpLCBza2IpOworCWFjdGlvbiA9IHBhcmFtcy0+YWN0aW9uOworCisJc3dpdGNoIChwYXJhbXMtPnRjZnRfYWN0aW9uKSB7CisJY2FzZSBUQ0FfVFVOTkVMX0tFWV9BQ1RfUkVMRUFTRToKKwkJc2tiX2RzdF9kcm9wKHNrYik7CisJCWJyZWFrOworCWNhc2UgVENBX1RVTk5FTF9LRVlfQUNUX1NFVDoKKwkJc2tiX2RzdF9kcm9wKHNrYik7CisJCXNrYl9kc3Rfc2V0KHNrYiwgZHN0X2Nsb25lKCZwYXJhbXMtPnRjZnRfZW5jX21ldGFkYXRhLT5kc3QpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9PTkNFKDEsICJCYWQgdHVubmVsX2tleSBhY3Rpb24gJWQuXG4iLAorCQkJICBwYXJhbXMtPnRjZnRfYWN0aW9uKTsKKwkJYnJlYWs7CisJfQorCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gYWN0aW9uOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgdHVubmVsX2tleV9wb2xpY3lbVENBX1RVTk5FTF9LRVlfTUFYICsgMV0gPSB7CisJW1RDQV9UVU5ORUxfS0VZX1BBUk1TXQkgICAgPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IHRjX3R1bm5lbF9rZXkpIH0sCisJW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X1NSQ10gPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNF9EU1RdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjZfU1JDXSA9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpIH0sCisJW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY2X0RTVF0gPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSB9LAorCVtUQ0FfVFVOTkVMX0tFWV9FTkNfS0VZX0lEXSAgID0geyAudHlwZSA9IE5MQV9VMzIgfSwKK307CisKK3N0YXRpYyBpbnQgdHVubmVsX2tleV9pbml0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5sYXR0ciAqbmxhLAorCQkJICAgc3RydWN0IG5sYXR0ciAqZXN0LCBzdHJ1Y3QgdGNfYWN0aW9uICoqYSwKKwkJCSAgIGludCBvdnIsIGludCBiaW5kKQoreworCXN0cnVjdCB0Y19hY3Rpb25fbmV0ICp0biA9IG5ldF9nZW5lcmljKG5ldCwgdHVubmVsX2tleV9uZXRfaWQpOworCXN0cnVjdCBubGF0dHIgKnRiW1RDQV9UVU5ORUxfS0VZX01BWCArIDFdOworCXN0cnVjdCB0Y2ZfdHVubmVsX2tleV9wYXJhbXMgKnBhcmFtc19vbGQ7CisJc3RydWN0IHRjZl90dW5uZWxfa2V5X3BhcmFtcyAqcGFyYW1zX25ldzsKKwlzdHJ1Y3QgbWV0YWRhdGFfZHN0ICptZXRhZGF0YSA9IE5VTEw7CisJc3RydWN0IHRjX3R1bm5lbF9rZXkgKnBhcm07CisJc3RydWN0IHRjZl90dW5uZWxfa2V5ICp0OworCWJvb2wgZXhpc3RzID0gZmFsc2U7CisJX19iZTY0IGtleV9pZDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZXJyOworCisJaWYgKCFubGEpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgVENBX1RVTk5FTF9LRVlfTUFYLCBubGEsIHR1bm5lbF9rZXlfcG9saWN5KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICghdGJbVENBX1RVTk5FTF9LRVlfUEFSTVNdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhcm0gPSBubGFfZGF0YSh0YltUQ0FfVFVOTkVMX0tFWV9QQVJNU10pOworCWV4aXN0cyA9IHRjZl9oYXNoX2NoZWNrKHRuLCBwYXJtLT5pbmRleCwgYSwgYmluZCk7CisJaWYgKGV4aXN0cyAmJiBiaW5kKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocGFybS0+dF9hY3Rpb24pIHsKKwljYXNlIFRDQV9UVU5ORUxfS0VZX0FDVF9SRUxFQVNFOgorCQlicmVhazsKKwljYXNlIFRDQV9UVU5ORUxfS0VZX0FDVF9TRVQ6CisJCWlmICghdGJbVENBX1RVTk5FTF9LRVlfRU5DX0tFWV9JRF0pIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKworCQlrZXlfaWQgPSBrZXkzMl90b190dW5uZWxfaWQobmxhX2dldF9iZTMyKHRiW1RDQV9UVU5ORUxfS0VZX0VOQ19LRVlfSURdKSk7CisKKwkJaWYgKHRiW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X1NSQ10gJiYKKwkJICAgIHRiW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X0RTVF0pIHsKKwkJCV9fYmUzMiBzYWRkcjsKKwkJCV9fYmUzMiBkYWRkcjsKKworCQkJc2FkZHIgPSBubGFfZ2V0X2luX2FkZHIodGJbVENBX1RVTk5FTF9LRVlfRU5DX0lQVjRfU1JDXSk7CisJCQlkYWRkciA9IG5sYV9nZXRfaW5fYWRkcih0YltUQ0FfVFVOTkVMX0tFWV9FTkNfSVBWNF9EU1RdKTsKKworCQkJbWV0YWRhdGEgPSBfX2lwX3R1bl9zZXRfZHN0KHNhZGRyLCBkYWRkciwgMCwgMCwKKwkJCQkJCSAgICBUVU5ORUxfS0VZLCBrZXlfaWQsIDApOworCQl9IGVsc2UgaWYgKHRiW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY2X1NSQ10gJiYKKwkJCSAgIHRiW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY2X0RTVF0pIHsKKwkJCXN0cnVjdCBpbjZfYWRkciBzYWRkcjsKKwkJCXN0cnVjdCBpbjZfYWRkciBkYWRkcjsKKworCQkJc2FkZHIgPSBubGFfZ2V0X2luNl9hZGRyKHRiW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY2X1NSQ10pOworCQkJZGFkZHIgPSBubGFfZ2V0X2luNl9hZGRyKHRiW1RDQV9UVU5ORUxfS0VZX0VOQ19JUFY2X0RTVF0pOworCisJCQltZXRhZGF0YSA9IF9faXB2Nl90dW5fc2V0X2RzdCgmc2FkZHIsICZkYWRkciwgMCwgMCwgMCwKKwkJCQkJCSAgICAgIFRVTk5FTF9LRVksIGtleV9pZCwgMCk7CisJCX0KKworCQlpZiAoIW1ldGFkYXRhKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJfb3V0OworCQl9CisKKwkJbWV0YWRhdGEtPnUudHVuX2luZm8ubW9kZSB8PSBJUF9UVU5ORUxfSU5GT19UWDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBlcnJfb3V0OworCX0KKworCWlmICghZXhpc3RzKSB7CisJCXJldCA9IHRjZl9oYXNoX2NyZWF0ZSh0biwgcGFybS0+aW5kZXgsIGVzdCwgYSwKKwkJCQkgICAgICAmYWN0X3R1bm5lbF9rZXlfb3BzLCBiaW5kLCB0cnVlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gQUNUX1BfQ1JFQVRFRDsKKwl9IGVsc2UgeworCQl0Y2ZfaGFzaF9yZWxlYXNlKCphLCBiaW5kKTsKKwkJaWYgKCFvdnIpCisJCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwl0ID0gdG9fdHVubmVsX2tleSgqYSk7CisKKwlBU1NFUlRfUlROTCgpOworCXBhcmFtc19uZXcgPSBremFsbG9jKHNpemVvZigqcGFyYW1zX25ldyksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghcGFyYW1zX25ldykpIHsKKwkJaWYgKHJldCA9PSBBQ1RfUF9DUkVBVEVEKQorCQkJdGNmX2hhc2hfcmVsZWFzZSgqYSwgYmluZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBhcmFtc19vbGQgPSBydG5sX2RlcmVmZXJlbmNlKHQtPnBhcmFtcyk7CisKKwlwYXJhbXNfbmV3LT5hY3Rpb24gPSBwYXJtLT5hY3Rpb247CisJcGFyYW1zX25ldy0+dGNmdF9hY3Rpb24gPSBwYXJtLT50X2FjdGlvbjsKKwlwYXJhbXNfbmV3LT50Y2Z0X2VuY19tZXRhZGF0YSA9IG1ldGFkYXRhOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKHQtPnBhcmFtcywgcGFyYW1zX25ldyk7CisKKwlpZiAocGFyYW1zX29sZCkKKwkJa2ZyZWVfcmN1KHBhcmFtc19vbGQsIHJjdSk7CisKKwlpZiAocmV0ID09IEFDVF9QX0NSRUFURUQpCisJCXRjZl9oYXNoX2luc2VydCh0biwgKmEpOworCisJcmV0dXJuIHJldDsKKworZXJyX291dDoKKwlpZiAoZXhpc3RzKQorCQl0Y2ZfaGFzaF9yZWxlYXNlKCphLCBiaW5kKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0dW5uZWxfa2V5X3JlbGVhc2Uoc3RydWN0IHRjX2FjdGlvbiAqYSwgaW50IGJpbmQpCit7CisJc3RydWN0IHRjZl90dW5uZWxfa2V5ICp0ID0gdG9fdHVubmVsX2tleShhKTsKKwlzdHJ1Y3QgdGNmX3R1bm5lbF9rZXlfcGFyYW1zICpwYXJhbXM7CisKKwlwYXJhbXMgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHQtPnBhcmFtcywgMSk7CisKKwlpZiAocGFyYW1zLT50Y2Z0X2FjdGlvbiA9PSBUQ0FfVFVOTkVMX0tFWV9BQ1RfU0VUKQorCQlkc3RfcmVsZWFzZSgmcGFyYW1zLT50Y2Z0X2VuY19tZXRhZGF0YS0+ZHN0KTsKKworCWtmcmVlX3JjdShwYXJhbXMsIHJjdSk7Cit9CisKK3N0YXRpYyBpbnQgdHVubmVsX2tleV9kdW1wX2FkZHJlc3NlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIHNob3J0IGZhbWlseSA9IGlwX3R1bm5lbF9pbmZvX2FmKGluZm8pOworCisJaWYgKGZhbWlseSA9PSBBRl9JTkVUKSB7CisJCV9fYmUzMiBzYWRkciA9IGluZm8tPmtleS51LmlwdjQuc3JjOworCQlfX2JlMzIgZGFkZHIgPSBpbmZvLT5rZXkudS5pcHY0LmRzdDsKKworCQlpZiAoIW5sYV9wdXRfaW5fYWRkcihza2IsIFRDQV9UVU5ORUxfS0VZX0VOQ19JUFY0X1NSQywgc2FkZHIpICYmCisJCSAgICAhbmxhX3B1dF9pbl9hZGRyKHNrYiwgVENBX1RVTk5FTF9LRVlfRU5DX0lQVjRfRFNULCBkYWRkcikpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHI2ID0gJmluZm8tPmtleS51LmlwdjYuc3JjOworCQljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyNiA9ICZpbmZvLT5rZXkudS5pcHY2LmRzdDsKKworCQlpZiAoIW5sYV9wdXRfaW42X2FkZHIoc2tiLAorCQkJCSAgICAgIFRDQV9UVU5ORUxfS0VZX0VOQ19JUFY2X1NSQywgc2FkZHI2KSAmJgorCQkgICAgIW5sYV9wdXRfaW42X2FkZHIoc2tiLAorCQkJCSAgICAgIFRDQV9UVU5ORUxfS0VZX0VOQ19JUFY2X0RTVCwgZGFkZHI2KSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHR1bm5lbF9rZXlfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorCQkJICAgaW50IGJpbmQsIGludCByZWYpCit7CisJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKKwlzdHJ1Y3QgdGNmX3R1bm5lbF9rZXkgKnQgPSB0b190dW5uZWxfa2V5KGEpOworCXN0cnVjdCB0Y2ZfdHVubmVsX2tleV9wYXJhbXMgKnBhcmFtczsKKwlzdHJ1Y3QgdGNfdHVubmVsX2tleSBvcHQgPSB7CisJCS5pbmRleCAgICA9IHQtPnRjZl9pbmRleCwKKwkJLnJlZmNudCAgID0gdC0+dGNmX3JlZmNudCAtIHJlZiwKKwkJLmJpbmRjbnQgID0gdC0+dGNmX2JpbmRjbnQgLSBiaW5kLAorCX07CisJc3RydWN0IHRjZl90IHRtOworCisJcGFyYW1zID0gcnRubF9kZXJlZmVyZW5jZSh0LT5wYXJhbXMpOworCisJb3B0LnRfYWN0aW9uID0gcGFyYW1zLT50Y2Z0X2FjdGlvbjsKKwlvcHQuYWN0aW9uID0gcGFyYW1zLT5hY3Rpb247CisKKwlpZiAobmxhX3B1dChza2IsIFRDQV9UVU5ORUxfS0VZX1BBUk1TLCBzaXplb2Yob3B0KSwgJm9wdCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKHBhcmFtcy0+dGNmdF9hY3Rpb24gPT0gVENBX1RVTk5FTF9LRVlfQUNUX1NFVCkgeworCQlzdHJ1Y3QgaXBfdHVubmVsX2tleSAqa2V5ID0KKwkJCSZwYXJhbXMtPnRjZnRfZW5jX21ldGFkYXRhLT51LnR1bl9pbmZvLmtleTsKKwkJX19iZTMyIGtleV9pZCA9IHR1bm5lbF9pZF90b19rZXkzMihrZXktPnR1bl9pZCk7CisKKwkJaWYgKG5sYV9wdXRfYmUzMihza2IsIFRDQV9UVU5ORUxfS0VZX0VOQ19LRVlfSUQsIGtleV9pZCkgfHwKKwkJICAgIHR1bm5lbF9rZXlfZHVtcF9hZGRyZXNzZXMoc2tiLAorCQkJCQkgICAgICAmcGFyYW1zLT50Y2Z0X2VuY19tZXRhZGF0YS0+dS50dW5faW5mbykpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwl9CisKKwl0Y2ZfdG1fZHVtcCgmdG0sICZ0LT50Y2ZfdG0pOworCWlmIChubGFfcHV0XzY0Yml0KHNrYiwgVENBX1RVTk5FTF9LRVlfVE0sIHNpemVvZih0bSksCisJCQkgICZ0bSwgVENBX1RVTk5FTF9LRVlfUEFEKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sYV9wdXRfZmFpbHVyZToKKwlubG1zZ190cmltKHNrYiwgYik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHR1bm5lbF9rZXlfd2Fsa2VyKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLCBpbnQgdHlwZSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHRjX2FjdGlvbl9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgdGNfYWN0aW9uX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHR1bm5lbF9rZXlfbmV0X2lkKTsKKworCXJldHVybiB0Y2ZfZ2VuZXJpY193YWxrZXIodG4sIHNrYiwgY2IsIHR5cGUsIG9wcyk7Cit9CisKK3N0YXRpYyBpbnQgdHVubmVsX2tleV9zZWFyY2goc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNfYWN0aW9uICoqYSwgdTMyIGluZGV4KQoreworCXN0cnVjdCB0Y19hY3Rpb25fbmV0ICp0biA9IG5ldF9nZW5lcmljKG5ldCwgdHVubmVsX2tleV9uZXRfaWQpOworCisJcmV0dXJuIHRjZl9oYXNoX3NlYXJjaCh0biwgYSwgaW5kZXgpOworfQorCitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X3R1bm5lbF9rZXlfb3BzID0geworCS5raW5kCQk9CSJ0dW5uZWxfa2V5IiwKKwkudHlwZQkJPQlUQ0FfQUNUX1RVTk5FTF9LRVksCisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCS5hY3QJCT0JdHVubmVsX2tleV9hY3QsCisJLmR1bXAJCT0JdHVubmVsX2tleV9kdW1wLAorCS5pbml0CQk9CXR1bm5lbF9rZXlfaW5pdCwKKwkuY2xlYW51cAk9CXR1bm5lbF9rZXlfcmVsZWFzZSwKKwkud2FsawkJPQl0dW5uZWxfa2V5X3dhbGtlciwKKwkubG9va3VwCQk9CXR1bm5lbF9rZXlfc2VhcmNoLAorCS5zaXplCQk9CXNpemVvZihzdHJ1Y3QgdGNmX3R1bm5lbF9rZXkpLAorfTsKKworc3RhdGljIF9fbmV0X2luaXQgaW50IHR1bm5lbF9rZXlfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0KQoreworCXN0cnVjdCB0Y19hY3Rpb25fbmV0ICp0biA9IG5ldF9nZW5lcmljKG5ldCwgdHVubmVsX2tleV9uZXRfaWQpOworCisJcmV0dXJuIHRjX2FjdGlvbl9uZXRfaW5pdCh0biwgJmFjdF90dW5uZWxfa2V5X29wcywgVFVOTkVMX0tFWV9UQUJfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbmV0X2V4aXQgdHVubmVsX2tleV9leGl0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJc3RydWN0IHRjX2FjdGlvbl9uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0dW5uZWxfa2V5X25ldF9pZCk7CisKKwl0Y19hY3Rpb25fbmV0X2V4aXQodG4pOworfQorCitzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIHR1bm5lbF9rZXlfbmV0X29wcyA9IHsKKwkuaW5pdCA9IHR1bm5lbF9rZXlfaW5pdF9uZXQsCisJLmV4aXQgPSB0dW5uZWxfa2V5X2V4aXRfbmV0LAorCS5pZCAgID0gJnR1bm5lbF9rZXlfbmV0X2lkLAorCS5zaXplID0gc2l6ZW9mKHN0cnVjdCB0Y19hY3Rpb25fbmV0KSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHR1bm5lbF9rZXlfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gdGNmX3JlZ2lzdGVyX2FjdGlvbigmYWN0X3R1bm5lbF9rZXlfb3BzLCAmdHVubmVsX2tleV9uZXRfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHR1bm5lbF9rZXlfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl0Y2ZfdW5yZWdpc3Rlcl9hY3Rpb24oJmFjdF90dW5uZWxfa2V5X29wcywgJnR1bm5lbF9rZXlfbmV0X29wcyk7Cit9CisKK21vZHVsZV9pbml0KHR1bm5lbF9rZXlfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQodHVubmVsX2tleV9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIkFtaXIgVmFkYWkgPGFtaXJAdmFkYWkubWU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwIHR1bm5lbCBtYW5pcHVsYXRpb24gYWN0aW9ucyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2FjdF92bGFuLmMgYi9uZXQvc2NoZWQvYWN0X3ZsYW4uYwppbmRleCA2OTE0MDlkLi5iNTdmY2JjIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X3ZsYW4uYworKysgYi9uZXQvc2NoZWQvYWN0X3ZsYW4uYwpAQCAtMzAsMTIgKzMwLDE5IEBACiAJc3RydWN0IHRjZl92bGFuICp2ID0gdG9fdmxhbihhKTsKIAlpbnQgYWN0aW9uOwogCWludCBlcnI7CisJdTE2IHRjaTsKIAogCXNwaW5fbG9jaygmdi0+dGNmX2xvY2spOwogCXRjZl9sYXN0dXNlX3VwZGF0ZSgmdi0+dGNmX3RtKTsKIAlic3RhdHNfdXBkYXRlKCZ2LT50Y2ZfYnN0YXRzLCBza2IpOwogCWFjdGlvbiA9IHYtPnRjZl9hY3Rpb247CiAKKwkvKiBFbnN1cmUgJ2RhdGEnIHBvaW50cyBhdCBtYWNfaGVhZGVyIHByaW9yIGNhbGxpbmcgdmxhbiBtYW5pcHVsYXRpbmcKKwkgKiBmdW5jdGlvbnMuCisJICovCisJaWYgKHNrYl9hdF90Y19pbmdyZXNzKHNrYikpCisJCXNrYl9wdXNoX3Jjc3VtKHNrYiwgc2tiLT5tYWNfbGVuKTsKKwogCXN3aXRjaCAodi0+dGNmdl9hY3Rpb24pIHsKIAljYXNlIFRDQV9WTEFOX0FDVF9QT1A6CiAJCWVyciA9IHNrYl92bGFuX3BvcChza2IpOwpAQCAtNDMsMTAgKzUwLDM1IEBACiAJCQlnb3RvIGRyb3A7CiAJCWJyZWFrOwogCWNhc2UgVENBX1ZMQU5fQUNUX1BVU0g6Ci0JCWVyciA9IHNrYl92bGFuX3B1c2goc2tiLCB2LT50Y2Z2X3B1c2hfcHJvdG8sIHYtPnRjZnZfcHVzaF92aWQpOworCQllcnIgPSBza2Jfdmxhbl9wdXNoKHNrYiwgdi0+dGNmdl9wdXNoX3Byb3RvLCB2LT50Y2Z2X3B1c2hfdmlkIHwKKwkJCQkgICAgKHYtPnRjZnZfcHVzaF9wcmlvIDw8IFZMQU5fUFJJT19TSElGVCkpOwogCQlpZiAoZXJyKQogCQkJZ290byBkcm9wOwogCQlicmVhazsKKwljYXNlIFRDQV9WTEFOX0FDVF9NT0RJRlk6CisJCS8qIE5vLW9wIGlmIG5vIHZsYW4gdGFnIChlaXRoZXIgaHctYWNjZWwgb3IgaW4tcGF5bG9hZCkgKi8KKwkJaWYgKCFza2Jfdmxhbl90YWdnZWQoc2tiKSkKKwkJCWdvdG8gdW5sb2NrOworCQkvKiBleHRyYWN0IGV4aXN0aW5nIHRhZyAoYW5kIGd1YXJhbnRlZSBubyBody1hY2NlbCB0YWcpICovCisJCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSB7CisJCQl0Y2kgPSBza2Jfdmxhbl90YWdfZ2V0KHNrYik7CisJCQlza2ItPnZsYW5fdGNpID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIGluLXBheWxvYWQgdmxhbiB0YWcsIHBvcCBpdCAqLworCQkJZXJyID0gX19za2Jfdmxhbl9wb3Aoc2tiLCAmdGNpKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBkcm9wOworCQl9CisJCS8qIHJlcGxhY2UgdGhlIHZpZCAqLworCQl0Y2kgPSAodGNpICYgflZMQU5fVklEX01BU0spIHwgdi0+dGNmdl9wdXNoX3ZpZDsKKwkJLyogcmVwbGFjZSBwcmlvIGJpdHMsIGlmIHRjZnZfcHVzaF9wcmlvIHNwZWNpZmllZCAqLworCQlpZiAodi0+dGNmdl9wdXNoX3ByaW8pIHsKKwkJCXRjaSAmPSB+VkxBTl9QUklPX01BU0s7CisJCQl0Y2kgfD0gdi0+dGNmdl9wdXNoX3ByaW8gPDwgVkxBTl9QUklPX1NISUZUOworCQl9CisJCS8qIHB1dCB1cGRhdGVkIHRjaSBhcyBod2FjY2VsIHRhZyAqLworCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdi0+dGNmdl9wdXNoX3Byb3RvLCB0Y2kpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9CkBAIC01Nyw2ICs4OSw5IEBACiAJYWN0aW9uID0gVENfQUNUX1NIT1Q7CiAJdi0+dGNmX3FzdGF0cy5kcm9wcysrOwogdW5sb2NrOgorCWlmIChza2JfYXRfdGNfaW5ncmVzcyhza2IpKQorCQlza2JfcHVsbF9yY3N1bShza2IsIHNrYi0+bWFjX2xlbik7CisKIAlzcGluX3VubG9jaygmdi0+dGNmX2xvY2spOwogCXJldHVybiBhY3Rpb247CiB9CkBAIC02NSw2ICsxMDAsNyBAQAogCVtUQ0FfVkxBTl9QQVJNU10JCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCB0Y192bGFuKSB9LAogCVtUQ0FfVkxBTl9QVVNIX1ZMQU5fSURdCQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW1RDQV9WTEFOX1BVU0hfVkxBTl9QUk9UT0NPTF0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtUQ0FfVkxBTl9QVVNIX1ZMQU5fUFJJT1JJVFldCT0geyAudHlwZSA9IE5MQV9VOCB9LAogfTsKIAogc3RhdGljIGludCB0Y2Zfdmxhbl9pbml0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5sYXR0ciAqbmxhLApAQCAtNzgsNiArMTE0LDcgQEAKIAlpbnQgYWN0aW9uOwogCV9fYmUxNiBwdXNoX3ZpZCA9IDA7CiAJX19iZTE2IHB1c2hfcHJvdG8gPSAwOworCXU4IHB1c2hfcHJpbyA9IDA7CiAJYm9vbCBleGlzdHMgPSBmYWxzZTsKIAlpbnQgcmV0ID0gMCwgZXJyOwogCkBAIC05OSw2ICsxMzYsNyBAQAogCWNhc2UgVENBX1ZMQU5fQUNUX1BPUDoKIAkJYnJlYWs7CiAJY2FzZSBUQ0FfVkxBTl9BQ1RfUFVTSDoKKwljYXNlIFRDQV9WTEFOX0FDVF9NT0RJRlk6CiAJCWlmICghdGJbVENBX1ZMQU5fUFVTSF9WTEFOX0lEXSkgewogCQkJaWYgKGV4aXN0cykKIAkJCQl0Y2ZfaGFzaF9yZWxlYXNlKCphLCBiaW5kKTsKQEAgLTEyMyw2ICsxNjEsOSBAQAogCQl9IGVsc2UgewogCQkJcHVzaF9wcm90byA9IGh0b25zKEVUSF9QXzgwMjFRKTsKIAkJfQorCisJCWlmICh0YltUQ0FfVkxBTl9QVVNIX1ZMQU5fUFJJT1JJVFldKQorCQkJcHVzaF9wcmlvID0gbmxhX2dldF91OCh0YltUQ0FfVkxBTl9QVVNIX1ZMQU5fUFJJT1JJVFldKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJaWYgKGV4aXN0cykKQEAgLTE1MCw2ICsxOTEsNyBAQAogCiAJdi0+dGNmdl9hY3Rpb24gPSBhY3Rpb247CiAJdi0+dGNmdl9wdXNoX3ZpZCA9IHB1c2hfdmlkOworCXYtPnRjZnZfcHVzaF9wcmlvID0gcHVzaF9wcmlvOwogCXYtPnRjZnZfcHVzaF9wcm90byA9IHB1c2hfcHJvdG87CiAKIAl2LT50Y2ZfYWN0aW9uID0gcGFybS0+YWN0aW9uOwpAQCAtMTc4LDEwICsyMjAsMTMgQEAKIAlpZiAobmxhX3B1dChza2IsIFRDQV9WTEFOX1BBUk1TLCBzaXplb2Yob3B0KSwgJm9wdCkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JaWYgKHYtPnRjZnZfYWN0aW9uID09IFRDQV9WTEFOX0FDVF9QVVNIICYmCisJaWYgKCh2LT50Y2Z2X2FjdGlvbiA9PSBUQ0FfVkxBTl9BQ1RfUFVTSCB8fAorCSAgICAgdi0+dGNmdl9hY3Rpb24gPT0gVENBX1ZMQU5fQUNUX01PRElGWSkgJiYKIAkgICAgKG5sYV9wdXRfdTE2KHNrYiwgVENBX1ZMQU5fUFVTSF9WTEFOX0lELCB2LT50Y2Z2X3B1c2hfdmlkKSB8fAogCSAgICAgbmxhX3B1dF9iZTE2KHNrYiwgVENBX1ZMQU5fUFVTSF9WTEFOX1BST1RPQ09MLAotCQkJICB2LT50Y2Z2X3B1c2hfcHJvdG8pKSkKKwkJCSAgdi0+dGNmdl9wdXNoX3Byb3RvKSB8fAorCSAgICAgKG5sYV9wdXRfdTgoc2tiLCBUQ0FfVkxBTl9QVVNIX1ZMQU5fUFJJT1JJVFksCisJCQkJCSAgICAgIHYtPnRjZnZfcHVzaF9wcmlvKSkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCXRjZl90bV9kdW1wKCZ0LCAmdi0+dGNmX3RtKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfYXBpLmMgYi9uZXQvc2NoZWQvY2xzX2FwaS5jCmluZGV4IGE3YzU2NDUuLjExZGE3ZGEgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfYXBpLmMKKysrIGIvbmV0L3NjaGVkL2Nsc19hcGkuYwpAQCAtMzQ0LDEzICszNDQsMTUgQEAKIAkJCWlmIChlcnIgPT0gMCkgewogCQkJCXN0cnVjdCB0Y2ZfcHJvdG8gKm5leHQgPSBydG5sX2RlcmVmZXJlbmNlKHRwLT5uZXh0KTsKIAotCQkJCXRmaWx0ZXJfbm90aWZ5KG5ldCwgc2tiLCBuLCB0cCwgZmgsIFJUTV9ERUxURklMVEVSKTsKKwkJCQl0ZmlsdGVyX25vdGlmeShuZXQsIHNrYiwgbiwgdHAsIGZoLAorCQkJCQkgICAgICAgUlRNX0RFTFRGSUxURVIpOwogCQkJCWlmICh0Y2ZfZGVzdHJveSh0cCwgZmFsc2UpKQogCQkJCQlSQ1VfSU5JVF9QT0lOVEVSKCpiYWNrLCBuZXh0KTsKIAkJCX0KIAkJCWdvdG8gZXJyb3V0OwogCQljYXNlIFJUTV9HRVRURklMVEVSOgotCQkJZXJyID0gdGZpbHRlcl9ub3RpZnkobmV0LCBza2IsIG4sIHRwLCBmaCwgUlRNX05FV1RGSUxURVIpOworCQkJZXJyID0gdGZpbHRlcl9ub3RpZnkobmV0LCBza2IsIG4sIHRwLCBmaCwKKwkJCQkJICAgICBSVE1fTkVXVEZJTFRFUik7CiAJCQlnb3RvIGVycm91dDsKIAkJZGVmYXVsdDoKIAkJCWVyciA9IC1FSU5WQUw7CkBAIC00NDgsNyArNDUwLDggQEAKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChhLT5za2ItPnNrKTsKIAogCXJldHVybiB0Y2ZfZmlsbF9ub2RlKG5ldCwgYS0+c2tiLCB0cCwgbiwgTkVUTElOS19DQihhLT5jYi0+c2tiKS5wb3J0aWQsCi0JCQkgICAgIGEtPmNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIFJUTV9ORVdURklMVEVSKTsKKwkJCSAgICAgYS0+Y2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwKKwkJCSAgICAgUlRNX05FV1RGSUxURVIpOwogfQogCiAvKiBjYWxsZWQgd2l0aCBSVE5MICovCkBAIC01NTIsNyArNTU1LDcgQEAKIEVYUE9SVF9TWU1CT0wodGNmX2V4dHNfZGVzdHJveSk7CiAKIGludCB0Y2ZfZXh0c192YWxpZGF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgbmxhdHRyICoqdGIsCi0JCSAgc3RydWN0IG5sYXR0ciAqcmF0ZV90bHYsIHN0cnVjdCB0Y2ZfZXh0cyAqZXh0cywgYm9vbCBvdnIpCisJCSAgICAgIHN0cnVjdCBubGF0dHIgKnJhdGVfdGx2LCBzdHJ1Y3QgdGNmX2V4dHMgKmV4dHMsIGJvb2wgb3ZyKQogewogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAogCXsKQEAgLTU2MCw4ICs1NjMsNyBAQAogCiAJCWlmIChleHRzLT5wb2xpY2UgJiYgdGJbZXh0cy0+cG9saWNlXSkgewogCQkJYWN0ID0gdGNmX2FjdGlvbl9pbml0XzEobmV0LCB0YltleHRzLT5wb2xpY2VdLCByYXRlX3RsdiwKLQkJCQkJCSJwb2xpY2UiLCBvdnIsCi0JCQkJCQlUQ0FfQUNUX0JJTkQpOworCQkJCQkJInBvbGljZSIsIG92ciwgVENBX0FDVF9CSU5EKTsKIAkJCWlmIChJU19FUlIoYWN0KSkKIAkJCQlyZXR1cm4gUFRSX0VSUihhY3QpOwogCkBAIC01NzMsOCArNTc1LDggQEAKIAkJCWludCBlcnIsIGkgPSAwOwogCiAJCQllcnIgPSB0Y2ZfYWN0aW9uX2luaXQobmV0LCB0YltleHRzLT5hY3Rpb25dLCByYXRlX3RsdiwKLQkJCQkJICAgICAgTlVMTCwgb3ZyLAotCQkJCQkgICAgICBUQ0FfQUNUX0JJTkQsICZhY3Rpb25zKTsKKwkJCQkJICAgICAgTlVMTCwgb3ZyLCBUQ0FfQUNUX0JJTkQsCisJCQkJCSAgICAgICZhY3Rpb25zKTsKIAkJCWlmIChlcnIpCiAJCQkJcmV0dXJuIGVycjsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoYWN0LCAmYWN0aW9ucywgbGlzdCkKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfYmFzaWMuYyBiL25ldC9zY2hlZC9jbHNfYmFzaWMuYwppbmRleCAwYjhjM2FjLi5lYjIxOWI3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMKKysrIGIvbmV0L3NjaGVkL2Nsc19iYXNpYy5jCkBAIC0xMzgsMTAgKzEzOCwxMiBAQAogCXN0cnVjdCB0Y2ZfZXh0cyBlOwogCXN0cnVjdCB0Y2ZfZW1hdGNoX3RyZWUgdDsKIAotCXRjZl9leHRzX2luaXQoJmUsIFRDQV9CQVNJQ19BQ1QsIFRDQV9CQVNJQ19QT0xJQ0UpOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9CQVNJQ19BQ1QsIFRDQV9CQVNJQ19QT0xJQ0UpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWVyciA9IHRjZl9lbV90cmVlX3ZhbGlkYXRlKHRwLCB0YltUQ0FfQkFTSUNfRU1BVENIRVNdLCAmdCk7CiAJaWYgKGVyciA8IDApCkBAIC0xODksNyArMTkxLDEwIEBACiAJaWYgKCFmbmV3KQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKLQl0Y2ZfZXh0c19pbml0KCZmbmV3LT5leHRzLCBUQ0FfQkFTSUNfQUNULCBUQ0FfQkFTSUNfUE9MSUNFKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZmbmV3LT5leHRzLCBUQ0FfQkFTSUNfQUNULCBUQ0FfQkFTSUNfUE9MSUNFKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CisKIAllcnIgPSAtRUlOVkFMOwogCWlmIChoYW5kbGUpIHsKIAkJZm5ldy0+aGFuZGxlID0gaGFuZGxlOwpAQCAtMjI2LDYgKzIzMSw3IEBACiAKIAlyZXR1cm4gMDsKIGVycm91dDoKKwl0Y2ZfZXh0c19kZXN0cm95KCZmbmV3LT5leHRzKTsKIAlrZnJlZShmbmV3KTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19icGYuYyBiL25ldC9zY2hlZC9jbHNfYnBmLmMKaW5kZXggYzMwMDJjMi4uYmIxZDVhNCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19icGYuYworKysgYi9uZXQvc2NoZWQvY2xzX2JwZi5jCkBAIC0yNyw2ICsyNyw4IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlRDIEJQRiBiYXNlZCBjbGFzc2lmaWVyIik7CiAKICNkZWZpbmUgQ0xTX0JQRl9OQU1FX0xFTgkyNTYKKyNkZWZpbmUgQ0xTX0JQRl9TVVBQT1JURURfR0VOX0ZMQUdTCQlcCisJKFRDQV9DTFNfRkxBR1NfU0tJUF9IVyB8IFRDQV9DTFNfRkxBR1NfU0tJUF9TVykKIAogc3RydWN0IGNsc19icGZfaGVhZCB7CiAJc3RydWN0IGxpc3RfaGVhZCBwbGlzdDsKQEAgLTM5LDYgKzQxLDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpbms7CiAJc3RydWN0IHRjZl9yZXN1bHQgcmVzOwogCWJvb2wgZXh0c19pbnRlZ3JhdGVkOworCWJvb2wgb2ZmbG9hZGVkOworCXUzMiBnZW5fZmxhZ3M7CiAJc3RydWN0IHRjZl9leHRzIGV4dHM7CiAJdTMyIGhhbmRsZTsKIAl1bmlvbiB7CkBAIC01NCw4ICs1OCwxMCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGJwZl9wb2xpY3lbVENBX0JQRl9NQVggKyAxXSA9IHsKIAlbVENBX0JQRl9DTEFTU0lEXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW1RDQV9CUEZfRkxBR1NdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW1RDQV9CUEZfRkxBR1NfR0VOXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW1RDQV9CUEZfRkRdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCi0JW1RDQV9CUEZfTkFNRV0JCT0geyAudHlwZSA9IE5MQV9OVUxfU1RSSU5HLCAubGVuID0gQ0xTX0JQRl9OQU1FX0xFTiB9LAorCVtUQ0FfQlBGX05BTUVdCQk9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywKKwkJCQkgICAgLmxlbiA9IENMU19CUEZfTkFNRV9MRU4gfSwKIAlbVENBX0JQRl9PUFNfTEVOXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW1RDQV9CUEZfT1BTXQkJPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKIAkJCQkgICAgLmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja19maWx0ZXIpICogQlBGX01BWElOU05TIH0sCkBAIC04Myw5ICs4OSw2IEBACiAJc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZzsKIAlpbnQgcmV0ID0gLTE7CiAKLQlpZiAodW5saWtlbHkoIXNrYl9tYWNfaGVhZGVyX3dhc19zZXQoc2tiKSkpCi0JCXJldHVybiAtMTsKLQogCS8qIE5lZWRlZCBoZXJlIGZvciBhY2Nlc3NpbmcgbWFwcy4gKi8KIAlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHJvZywgJmhlYWQtPnBsaXN0LCBsaW5rKSB7CkBAIC05Myw3ICs5Niw5IEBACiAKIAkJcWRpc2Nfc2tiX2NiKHNrYiktPnRjX2NsYXNzaWQgPSBwcm9nLT5yZXMuY2xhc3NpZDsKIAotCQlpZiAoYXRfaW5ncmVzcykgeworCQlpZiAodGNfc2tpcF9zdyhwcm9nLT5nZW5fZmxhZ3MpKSB7CisJCQlmaWx0ZXJfcmVzID0gcHJvZy0+ZXh0c19pbnRlZ3JhdGVkID8gVENfQUNUX1VOU1BFQyA6IDA7CisJCX0gZWxzZSBpZiAoYXRfaW5ncmVzcykgewogCQkJLyogSXQgaXMgc2FmZSB0byBwdXNoL3B1bGwgZXZlbiBpZiBza2Jfc2hhcmVkKCkgKi8KIAkJCV9fc2tiX3B1c2goc2tiLCBza2ItPm1hY19sZW4pOwogCQkJYnBmX2NvbXB1dGVfZGF0YV9lbmQoc2tiKTsKQEAgLTE0MCw2ICsxNDUsOTEgQEAKIAlyZXR1cm4gIXByb2ctPmJwZl9vcHM7CiB9CiAKK3N0YXRpYyBpbnQgY2xzX2JwZl9vZmZsb2FkX2NtZChzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZywKKwkJCSAgICAgICBlbnVtIHRjX2Nsc2JwZl9jb21tYW5kIGNtZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPnEtPmRldl9xdWV1ZS0+ZGV2OworCXN0cnVjdCB0Y19jbHNfYnBmX29mZmxvYWQgYnBmX29mZmxvYWQgPSB7fTsKKwlzdHJ1Y3QgdGNfdG9fbmV0ZGV2IG9mZmxvYWQ7CisKKwlvZmZsb2FkLnR5cGUgPSBUQ19TRVRVUF9DTFNCUEY7CisJb2ZmbG9hZC5jbHNfYnBmID0gJmJwZl9vZmZsb2FkOworCisJYnBmX29mZmxvYWQuY29tbWFuZCA9IGNtZDsKKwlicGZfb2ZmbG9hZC5leHRzID0gJnByb2ctPmV4dHM7CisJYnBmX29mZmxvYWQucHJvZyA9IHByb2ctPmZpbHRlcjsKKwlicGZfb2ZmbG9hZC5uYW1lID0gcHJvZy0+YnBmX25hbWU7CisJYnBmX29mZmxvYWQuZXh0c19pbnRlZ3JhdGVkID0gcHJvZy0+ZXh0c19pbnRlZ3JhdGVkOworCWJwZl9vZmZsb2FkLmdlbl9mbGFncyA9IHByb2ctPmdlbl9mbGFnczsKKworCXJldHVybiBkZXYtPm5ldGRldl9vcHMtPm5kb19zZXR1cF90YyhkZXYsIHRwLT5xLT5oYW5kbGUsCisJCQkJCSAgICAgdHAtPnByb3RvY29sLCAmb2ZmbG9hZCk7Cit9CisKK3N0YXRpYyBpbnQgY2xzX2JwZl9vZmZsb2FkKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBzdHJ1Y3QgY2xzX2JwZl9wcm9nICpwcm9nLAorCQkJICAgc3RydWN0IGNsc19icGZfcHJvZyAqb2xkcHJvZykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPnEtPmRldl9xdWV1ZS0+ZGV2OworCXN0cnVjdCBjbHNfYnBmX3Byb2cgKm9iaiA9IHByb2c7CisJZW51bSB0Y19jbHNicGZfY29tbWFuZCBjbWQ7CisJYm9vbCBza2lwX3N3OworCWludCByZXQ7CisKKwlza2lwX3N3ID0gdGNfc2tpcF9zdyhwcm9nLT5nZW5fZmxhZ3MpIHx8CisJCShvbGRwcm9nICYmIHRjX3NraXBfc3cob2xkcHJvZy0+Z2VuX2ZsYWdzKSk7CisKKwlpZiAob2xkcHJvZyAmJiBvbGRwcm9nLT5vZmZsb2FkZWQpIHsKKwkJaWYgKHRjX3Nob3VsZF9vZmZsb2FkKGRldiwgdHAsIHByb2ctPmdlbl9mbGFncykpIHsKKwkJCWNtZCA9IFRDX0NMU0JQRl9SRVBMQUNFOworCQl9IGVsc2UgaWYgKCF0Y19za2lwX3N3KHByb2ctPmdlbl9mbGFncykpIHsKKwkJCW9iaiA9IG9sZHByb2c7CisJCQljbWQgPSBUQ19DTFNCUEZfREVTVFJPWTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCF0Y19zaG91bGRfb2ZmbG9hZChkZXYsIHRwLCBwcm9nLT5nZW5fZmxhZ3MpKQorCQkJcmV0dXJuIHNraXBfc3cgPyAtRUlOVkFMIDogMDsKKwkJY21kID0gVENfQ0xTQlBGX0FERDsKKwl9CisKKwlyZXQgPSBjbHNfYnBmX29mZmxvYWRfY21kKHRwLCBvYmosIGNtZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHNraXBfc3cgPyByZXQgOiAwOworCisJb2JqLT5vZmZsb2FkZWQgPSB0cnVlOworCWlmIChvbGRwcm9nKQorCQlvbGRwcm9nLT5vZmZsb2FkZWQgPSBmYWxzZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbHNfYnBmX3N0b3Bfb2ZmbG9hZChzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKKwkJCQkgc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZykKK3sKKwlpbnQgZXJyOworCisJaWYgKCFwcm9nLT5vZmZsb2FkZWQpCisJCXJldHVybjsKKworCWVyciA9IGNsc19icGZfb2ZmbG9hZF9jbWQodHAsIHByb2csIFRDX0NMU0JQRl9ERVNUUk9ZKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiU3RvcHBpbmcgaGFyZHdhcmUgb2ZmbG9hZCBmYWlsZWQ6ICVkXG4iLCBlcnIpOworCQlyZXR1cm47CisJfQorCisJcHJvZy0+b2ZmbG9hZGVkID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGNsc19icGZfb2ZmbG9hZF91cGRhdGVfc3RhdHMoc3RydWN0IHRjZl9wcm90byAqdHAsCisJCQkJCSBzdHJ1Y3QgY2xzX2JwZl9wcm9nICpwcm9nKQoreworCWlmICghcHJvZy0+b2ZmbG9hZGVkKQorCQlyZXR1cm47CisKKwljbHNfYnBmX29mZmxvYWRfY21kKHRwLCBwcm9nLCBUQ19DTFNCUEZfU1RBVFMpOworfQorCiBzdGF0aWMgaW50IGNsc19icGZfaW5pdChzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKIHsKIAlzdHJ1Y3QgY2xzX2JwZl9oZWFkICpoZWFkOwpAQCAtMTc5LDYgKzI2OSw3IEBACiB7CiAJc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZyA9IChzdHJ1Y3QgY2xzX2JwZl9wcm9nICopIGFyZzsKIAorCWNsc19icGZfc3RvcF9vZmZsb2FkKHRwLCBwcm9nKTsKIAlsaXN0X2RlbF9yY3UoJnByb2ctPmxpbmspOwogCXRjZl91bmJpbmRfZmlsdGVyKHRwLCAmcHJvZy0+cmVzKTsKIAljYWxsX3JjdSgmcHJvZy0+cmN1LCBfX2Nsc19icGZfZGVsZXRlX3Byb2cpOwpAQCAtMTk1LDYgKzI4Niw3IEBACiAJCXJldHVybiBmYWxzZTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwcm9nLCB0bXAsICZoZWFkLT5wbGlzdCwgbGluaykgeworCQljbHNfYnBmX3N0b3Bfb2ZmbG9hZCh0cCwgcHJvZyk7CiAJCWxpc3RfZGVsX3JjdSgmcHJvZy0+bGluayk7CiAJCXRjZl91bmJpbmRfZmlsdGVyKHRwLCAmcHJvZy0+cmVzKTsKIAkJY2FsbF9yY3UoJnByb2ctPnJjdSwgX19jbHNfYnBmX2RlbGV0ZV9wcm9nKTsKQEAgLTMwNCw2ICszOTYsNyBAQAogewogCWJvb2wgaXNfYnBmLCBpc19lYnBmLCBoYXZlX2V4dHMgPSBmYWxzZTsKIAlzdHJ1Y3QgdGNmX2V4dHMgZXh0czsKKwl1MzIgZ2VuX2ZsYWdzID0gMDsKIAlpbnQgcmV0OwogCiAJaXNfYnBmID0gdGJbVENBX0JQRl9PUFNfTEVOXSAmJiB0YltUQ0FfQlBGX09QU107CkBAIC0zMTEsMzAgKzQwNCwzOSBAQAogCWlmICgoIWlzX2JwZiAmJiAhaXNfZWJwZikgfHwgKGlzX2JwZiAmJiBpc19lYnBmKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0Y2ZfZXh0c19pbml0KCZleHRzLCBUQ0FfQlBGX0FDVCwgVENBX0JQRl9QT0xJQ0UpOwotCXJldCA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZleHRzLCBvdnIpOworCXJldCA9IHRjZl9leHRzX2luaXQoJmV4dHMsIFRDQV9CUEZfQUNULCBUQ0FfQlBGX1BPTElDRSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CisJcmV0ID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIGVzdCwgJmV4dHMsIG92cik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3V0OwogCiAJaWYgKHRiW1RDQV9CUEZfRkxBR1NdKSB7CiAJCXUzMiBicGZfZmxhZ3MgPSBubGFfZ2V0X3UzMih0YltUQ0FfQlBGX0ZMQUdTXSk7CiAKIAkJaWYgKGJwZl9mbGFncyAmIH5UQ0FfQlBGX0ZMQUdfQUNUX0RJUkVDVCkgewotCQkJdGNmX2V4dHNfZGVzdHJveSgmZXh0cyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm91dDsKIAkJfQogCiAJCWhhdmVfZXh0cyA9IGJwZl9mbGFncyAmIFRDQV9CUEZfRkxBR19BQ1RfRElSRUNUOwogCX0KKwlpZiAodGJbVENBX0JQRl9GTEFHU19HRU5dKSB7CisJCWdlbl9mbGFncyA9IG5sYV9nZXRfdTMyKHRiW1RDQV9CUEZfRkxBR1NfR0VOXSk7CisJCWlmIChnZW5fZmxhZ3MgJiB+Q0xTX0JQRl9TVVBQT1JURURfR0VOX0ZMQUdTIHx8CisJCSAgICAhdGNfZmxhZ3NfdmFsaWQoZ2VuX2ZsYWdzKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJfQogCiAJcHJvZy0+ZXh0c19pbnRlZ3JhdGVkID0gaGF2ZV9leHRzOworCXByb2ctPmdlbl9mbGFncyA9IGdlbl9mbGFnczsKIAogCXJldCA9IGlzX2JwZiA/IGNsc19icGZfcHJvZ19mcm9tX29wcyh0YiwgcHJvZykgOgogCQkgICAgICAgY2xzX2JwZl9wcm9nX2Zyb21fZWZkKHRiLCBwcm9nLCB0cCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJdGNmX2V4dHNfZGVzdHJveSgmZXh0cyk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWlmICh0YltUQ0FfQlBGX0NMQVNTSURdKSB7CiAJCXByb2ctPnJlcy5jbGFzc2lkID0gbmxhX2dldF91MzIodGJbVENBX0JQRl9DTEFTU0lEXSk7CkBAIC0zNDMsNiArNDQ1LDEwIEBACiAKIAl0Y2ZfZXh0c19jaGFuZ2UodHAsICZwcm9nLT5leHRzLCAmZXh0cyk7CiAJcmV0dXJuIDA7CisKK2Vycm91dDoKKwl0Y2ZfZXh0c19kZXN0cm95KCZleHRzKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdTMyIGNsc19icGZfZ3JhYl9uZXdfaGFuZGxlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLApAQCAtMzg4LDcgKzQ5NCw5IEBACiAJaWYgKCFwcm9nKQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKLQl0Y2ZfZXh0c19pbml0KCZwcm9nLT5leHRzLCBUQ0FfQlBGX0FDVCwgVENBX0JQRl9QT0xJQ0UpOworCXJldCA9IHRjZl9leHRzX2luaXQoJnByb2ctPmV4dHMsIFRDQV9CUEZfQUNULCBUQ0FfQlBGX1BPTElDRSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3V0OwogCiAJaWYgKG9sZHByb2cpIHsKIAkJaWYgKGhhbmRsZSAmJiBvbGRwcm9nLT5oYW5kbGUgIT0gaGFuZGxlKSB7CkBAIC00MDYsMTAgKzUxNCwxNyBAQAogCQlnb3RvIGVycm91dDsKIAl9CiAKLQlyZXQgPSBjbHNfYnBmX21vZGlmeV9leGlzdGluZyhuZXQsIHRwLCBwcm9nLCBiYXNlLCB0YiwgdGNhW1RDQV9SQVRFXSwgb3ZyKTsKKwlyZXQgPSBjbHNfYnBmX21vZGlmeV9leGlzdGluZyhuZXQsIHRwLCBwcm9nLCBiYXNlLCB0YiwgdGNhW1RDQV9SQVRFXSwKKwkJCQkgICAgICBvdnIpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycm91dDsKIAorCXJldCA9IGNsc19icGZfb2ZmbG9hZCh0cCwgcHJvZywgb2xkcHJvZyk7CisJaWYgKHJldCkgeworCQljbHNfYnBmX2RlbGV0ZV9wcm9nKHRwLCBwcm9nKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlpZiAob2xkcHJvZykgewogCQlsaXN0X3JlcGxhY2VfcmN1KCZvbGRwcm9nLT5saW5rLCAmcHJvZy0+bGluayk7CiAJCXRjZl91bmJpbmRfZmlsdGVyKHRwLCAmb2xkcHJvZy0+cmVzKTsKQEAgLTQyMCw5ICs1MzUsMTAgQEAKIAogCSphcmcgPSAodW5zaWduZWQgbG9uZykgcHJvZzsKIAlyZXR1cm4gMDsKLWVycm91dDoKLQlrZnJlZShwcm9nKTsKIAorZXJyb3V0OgorCXRjZl9leHRzX2Rlc3Ryb3koJnByb2ctPmV4dHMpOworCWtmcmVlKHByb2cpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ3MCw2ICs1ODYsOCBAQAogCiAJdG0tPnRjbV9oYW5kbGUgPSBwcm9nLT5oYW5kbGU7CiAKKwljbHNfYnBmX29mZmxvYWRfdXBkYXRlX3N0YXRzKHRwLCBwcm9nKTsKKwogCW5lc3QgPSBubGFfbmVzdF9zdGFydChza2IsIFRDQV9PUFRJT05TKTsKIAlpZiAobmVzdCA9PSBOVUxMKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKQEAgLTQ5Miw2ICs2MTAsOSBAQAogCQlicGZfZmxhZ3MgfD0gVENBX0JQRl9GTEFHX0FDVF9ESVJFQ1Q7CiAJaWYgKGJwZl9mbGFncyAmJiBubGFfcHV0X3UzMihza2IsIFRDQV9CUEZfRkxBR1MsIGJwZl9mbGFncykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChwcm9nLT5nZW5fZmxhZ3MgJiYKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBUQ0FfQlBGX0ZMQUdTX0dFTiwgcHJvZy0+Z2VuX2ZsYWdzKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAlubGFfbmVzdF9lbmQoc2tiLCBuZXN0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19jZ3JvdXAuYyBiL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMKaW5kZXggNGM4NWJkMy4uODUyMzNjNDcgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMKKysrIGIvbmV0L3NjaGVkL2Nsc19jZ3JvdXAuYwpAQCAtOTMsNyArOTMsOSBAQAogCWlmICghbmV3KQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKLQl0Y2ZfZXh0c19pbml0KCZuZXctPmV4dHMsIFRDQV9DR1JPVVBfQUNULCBUQ0FfQ0dST1VQX1BPTElDRSk7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmbmV3LT5leHRzLCBUQ0FfQ0dST1VQX0FDVCwgVENBX0NHUk9VUF9QT0xJQ0UpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAluZXctPmhhbmRsZSA9IGhhbmRsZTsKIAluZXctPnRwID0gdHA7CiAJZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgVENBX0NHUk9VUF9NQVgsIHRjYVtUQ0FfT1BUSU9OU10sCkBAIC0xMDEsMTAgKzEwMywxNCBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm91dDsKIAotCXRjZl9leHRzX2luaXQoJmUsIFRDQV9DR1JPVVBfQUNULCBUQ0FfQ0dST1VQX1BPTElDRSk7Ci0JZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIHRjYVtUQ0FfUkFURV0sICZlLCBvdnIpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9DR1JPVVBfQUNULCBUQ0FfQ0dST1VQX1BPTElDRSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3V0OworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCB0Y2FbVENBX1JBVEVdLCAmZSwgb3ZyKTsKKwlpZiAoZXJyIDwgMCkgeworCQl0Y2ZfZXh0c19kZXN0cm95KCZlKTsKKwkJZ290byBlcnJvdXQ7CisJfQogCiAJZXJyID0gdGNmX2VtX3RyZWVfdmFsaWRhdGUodHAsIHRiW1RDQV9DR1JPVVBfRU1BVENIRVNdLCAmdCk7CiAJaWYgKGVyciA8IDApIHsKQEAgLTEyMCw2ICsxMjYsNyBAQAogCQljYWxsX3JjdSgmaGVhZC0+cmN1LCBjbHNfY2dyb3VwX2Rlc3Ryb3lfcmN1KTsKIAlyZXR1cm4gMDsKIGVycm91dDoKKwl0Y2ZfZXh0c19kZXN0cm95KCZuZXctPmV4dHMpOwogCWtmcmVlKG5ldyk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfZmxvdy5jIGIvbmV0L3NjaGVkL2Nsc19mbG93LmMKaW5kZXggZmJmZWM2YS4uZTM5NjcyMyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19mbG93LmMKKysrIGIvbmV0L3NjaGVkL2Nsc19mbG93LmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxuZXQvZmxvd19kaXNzZWN0b3IuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DT05OVFJBQ0spCiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KICNlbmRpZgogCkBAIC04NywxMiArODcsMTQgQEAKIAlyZXR1cm4gYWRkcl9mb2xkKHNrYl9kc3Qoc2tiKSkgXiAoX19mb3JjZSB1MTYpIHRjX3NrYl9wcm90b2NvbChza2IpOwogfQogCi1zdGF0aWMgdTMyIGZsb3dfZ2V0X3Byb3RvKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCitzdGF0aWMgdTMyIGZsb3dfZ2V0X3Byb3RvKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJcmV0dXJuIGZsb3ctPmJhc2ljLmlwX3Byb3RvOwogfQogCi1zdGF0aWMgdTMyIGZsb3dfZ2V0X3Byb3RvX3NyYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQorc3RhdGljIHUzMiBmbG93X2dldF9wcm90b19zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJaWYgKGZsb3ctPnBvcnRzLnBvcnRzKQogCQlyZXR1cm4gbnRvaHMoZmxvdy0+cG9ydHMuc3JjKTsKQEAgLTEwMCw3ICsxMDIsOCBAQAogCXJldHVybiBhZGRyX2ZvbGQoc2tiLT5zayk7CiB9CiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfcHJvdG9fZHN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCitzdGF0aWMgdTMyIGZsb3dfZ2V0X3Byb3RvX2RzdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKIHsKIAlpZiAoZmxvdy0+cG9ydHMucG9ydHMpCiAJCXJldHVybiBudG9ocyhmbG93LT5wb3J0cy5kc3QpOwpAQCAtMTI1LDE0ICsxMjgsMTQgQEAKIAogc3RhdGljIHUzMiBmbG93X2dldF9uZmN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX0NPTk5UUkFDSykKIAlyZXR1cm4gYWRkcl9mb2xkKHNrYi0+bmZjdCk7CiAjZWxzZQogCXJldHVybiAwOwogI2VuZGlmCiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLKQogI2RlZmluZSBDVFRVUExFKHNrYiwgbWVtYmVyKQkJCQkJCVwKICh7CQkJCQkJCQkJXAogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwkJCQkJXApAQCAtMTQ5LDcgKzE1Miw4IEBACiB9KQogI2VuZGlmCiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKIHsKIAlzd2l0Y2ggKHRjX3NrYl9wcm90b2NvbChza2IpKSB7CiAJY2FzZSBodG9ucyhFVEhfUF9JUCk6CkBAIC0xNjEsNyArMTY1LDggQEAKIAlyZXR1cm4gZmxvd19nZXRfc3JjKHNrYiwgZmxvdyk7CiB9CiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKIHsKIAlzd2l0Y2ggKHRjX3NrYl9wcm90b2NvbChza2IpKSB7CiAJY2FzZSBodG9ucyhFVEhfUF9JUCk6CkBAIC0xNzMsMTQgKzE3OCwxNiBAQAogCXJldHVybiBmbG93X2dldF9kc3Qoc2tiLCBmbG93KTsKIH0KIAotc3RhdGljIHUzMiBmbG93X2dldF9uZmN0X3Byb3RvX3NyYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQorc3RhdGljIHUzMiBmbG93X2dldF9uZmN0X3Byb3RvX3NyYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJcmV0dXJuIG50b2hzKENUVFVQTEUoc2tiLCBzcmMudS5hbGwpKTsKIGZhbGxiYWNrOgogCXJldHVybiBmbG93X2dldF9wcm90b19zcmMoc2tiLCBmbG93KTsKIH0KIAotc3RhdGljIHUzMiBmbG93X2dldF9uZmN0X3Byb3RvX2RzdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQorc3RhdGljIHUzMiBmbG93X2dldF9uZmN0X3Byb3RvX2RzdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJcmV0dXJuIG50b2hzKENUVFVQTEUoc2tiLCBkc3QudS5hbGwpKTsKIGZhbGxiYWNrOgpAQCAtNDE4LDEwICs0MjUsMTIgQEAKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfRkxPV19BQ1QsIFRDQV9GTE9XX1BPTElDRSk7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmZSwgVENBX0ZMT1dfQUNULCBUQ0FfRkxPV19QT0xJQ0UpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycjE7CiAJZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIHRjYVtUQ0FfUkFURV0sICZlLCBvdnIpOwogCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycjE7CiAKIAllcnIgPSB0Y2ZfZW1fdHJlZV92YWxpZGF0ZSh0cCwgdGJbVENBX0ZMT1dfRU1BVENIRVNdLCAmdCk7CiAJaWYgKGVyciA8IDApCkBAIC00MzIsMTMgKzQ0MSwxNSBAQAogCWlmICghZm5ldykKIAkJZ290byBlcnIyOwogCi0JdGNmX2V4dHNfaW5pdCgmZm5ldy0+ZXh0cywgVENBX0ZMT1dfQUNULCBUQ0FfRkxPV19QT0xJQ0UpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmZuZXctPmV4dHMsIFRDQV9GTE9XX0FDVCwgVENBX0ZMT1dfUE9MSUNFKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnIzOwogCiAJZm9sZCA9IChzdHJ1Y3QgZmxvd19maWx0ZXIgKikqYXJnOwogCWlmIChmb2xkKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWlmIChmb2xkLT5oYW5kbGUgIT0gaGFuZGxlICYmIGhhbmRsZSkKLQkJCWdvdG8gZXJyMjsKKwkJCWdvdG8gZXJyMzsKIAogCQkvKiBDb3B5IGZvbGQgaW50byBmbmV3ICovCiAJCWZuZXctPnRwID0gZm9sZC0+dHA7CkBAIC00NTgsMzEgKzQ2OSwzMSBAQAogCQlpZiAodGJbVENBX0ZMT1dfTU9ERV0pCiAJCQltb2RlID0gbmxhX2dldF91MzIodGJbVENBX0ZMT1dfTU9ERV0pOwogCQlpZiAobW9kZSAhPSBGTE9XX01PREVfSEFTSCAmJiBua2V5cyA+IDEpCi0JCQlnb3RvIGVycjI7CisJCQlnb3RvIGVycjM7CiAKIAkJaWYgKG1vZGUgPT0gRkxPV19NT0RFX0hBU0gpCiAJCQlwZXJ0dXJiX3BlcmlvZCA9IGZvbGQtPnBlcnR1cmJfcGVyaW9kOwogCQlpZiAodGJbVENBX0ZMT1dfUEVSVFVSQl0pIHsKIAkJCWlmIChtb2RlICE9IEZMT1dfTU9ERV9IQVNIKQotCQkJCWdvdG8gZXJyMjsKKwkJCQlnb3RvIGVycjM7CiAJCQlwZXJ0dXJiX3BlcmlvZCA9IG5sYV9nZXRfdTMyKHRiW1RDQV9GTE9XX1BFUlRVUkJdKSAqIEhaOwogCQl9CiAJfSBlbHNlIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJaWYgKCFoYW5kbGUpCi0JCQlnb3RvIGVycjI7CisJCQlnb3RvIGVycjM7CiAJCWlmICghdGJbVENBX0ZMT1dfS0VZU10pCi0JCQlnb3RvIGVycjI7CisJCQlnb3RvIGVycjM7CiAKIAkJbW9kZSA9IEZMT1dfTU9ERV9NQVA7CiAJCWlmICh0YltUQ0FfRkxPV19NT0RFXSkKIAkJCW1vZGUgPSBubGFfZ2V0X3UzMih0YltUQ0FfRkxPV19NT0RFXSk7CiAJCWlmIChtb2RlICE9IEZMT1dfTU9ERV9IQVNIICYmIG5rZXlzID4gMSkKLQkJCWdvdG8gZXJyMjsKKwkJCWdvdG8gZXJyMzsKIAogCQlpZiAodGJbVENBX0ZMT1dfUEVSVFVSQl0pIHsKIAkJCWlmIChtb2RlICE9IEZMT1dfTU9ERV9IQVNIKQotCQkJCWdvdG8gZXJyMjsKKwkJCQlnb3RvIGVycjM7CiAJCQlwZXJ0dXJiX3BlcmlvZCA9IG5sYV9nZXRfdTMyKHRiW1RDQV9GTE9XX1BFUlRVUkJdKSAqIEhaOwogCQl9CiAKQEAgLTU0Miw2ICs1NTMsOCBAQAogCQljYWxsX3JjdSgmZm9sZC0+cmN1LCBmbG93X2Rlc3Ryb3lfZmlsdGVyKTsKIAlyZXR1cm4gMDsKIAorZXJyMzoKKwl0Y2ZfZXh0c19kZXN0cm95KCZmbmV3LT5leHRzKTsKIGVycjI6CiAJdGNmX2VtX3RyZWVfZGVzdHJveSgmdCk7CiAJa2ZyZWUoZm5ldyk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Zsb3dlci5jIGIvbmV0L3NjaGVkL2Nsc19mbG93ZXIuYwppbmRleCA1MDYwODAxLi5mNmY0MGZiIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Zsb3dlci5jCisrKyBiL25ldC9zY2hlZC9jbHNfZmxvd2VyLmMKQEAgLTIzLDE3ICsyMywyNiBAQAogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9mbG93X2Rpc3NlY3Rvci5oPgogCisjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPG5ldC9kc3RfbWV0YWRhdGEuaD4KKwogc3RydWN0IGZsX2Zsb3dfa2V5IHsKIAlpbnQJaW5kZXZfaWZpbmRleDsKIAlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2NvbnRyb2wgY29udHJvbDsKKwlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2NvbnRyb2wgZW5jX2NvbnRyb2w7CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9iYXNpYyBiYXNpYzsKIAlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2V0aF9hZGRycyBldGg7Ci0Jc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9hZGRycyBpcGFkZHJzOworCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdmxhbiB2bGFuOwogCXVuaW9uIHsKIAkJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9pcHY0X2FkZHJzIGlwdjQ7CiAJCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfaXB2Nl9hZGRycyBpcHY2OwogCX07CiAJc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV9wb3J0cyB0cDsKKwlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2tleWlkIGVuY19rZXlfaWQ7CisJdW5pb24geworCQlzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X2lwdjRfYWRkcnMgZW5jX2lwdjQ7CisJCXN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfaXB2Nl9hZGRycyBlbmNfaXB2NjsKKwl9OwogfSBfX2FsaWduZWQoQklUU19QRVJfTE9ORyAvIDgpOyAvKiBFbnN1cmUgdGhhdCB3ZSBjYW4gZG8gY29tcGFyaXNvbnMgYXMgbG9uZ3MuICovCiAKIHN0cnVjdCBmbF9mbG93X21hc2tfcmFuZ2UgewpAQCAtMTIzLDExICsxMzIsMzEgQEAKIAlzdHJ1Y3QgY2xzX2ZsX2ZpbHRlciAqZjsKIAlzdHJ1Y3QgZmxfZmxvd19rZXkgc2tiX2tleTsKIAlzdHJ1Y3QgZmxfZmxvd19rZXkgc2tiX21rZXk7CisJc3RydWN0IGlwX3R1bm5lbF9pbmZvICppbmZvOwogCiAJaWYgKCFhdG9taWNfcmVhZCgmaGVhZC0+aHQubmVsZW1zKSkKIAkJcmV0dXJuIC0xOwogCiAJZmxfY2xlYXJfbWFza2VkX3JhbmdlKCZza2Jfa2V5LCAmaGVhZC0+bWFzayk7CisKKwlpbmZvID0gc2tiX3R1bm5lbF9pbmZvKHNrYik7CisJaWYgKGluZm8pIHsKKwkJc3RydWN0IGlwX3R1bm5lbF9rZXkgKmtleSA9ICZpbmZvLT5rZXk7CisKKwkJc3dpdGNoIChpcF90dW5uZWxfaW5mb19hZihpbmZvKSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlza2Jfa2V5LmVuY19pcHY0LnNyYyA9IGtleS0+dS5pcHY0LnNyYzsKKwkJCXNrYl9rZXkuZW5jX2lwdjQuZHN0ID0ga2V5LT51LmlwdjQuZHN0OworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlza2Jfa2V5LmVuY19pcHY2LnNyYyA9IGtleS0+dS5pcHY2LnNyYzsKKwkJCXNrYl9rZXkuZW5jX2lwdjYuZHN0ID0ga2V5LT51LmlwdjYuZHN0OworCQkJYnJlYWs7CisJCX0KKworCQlza2Jfa2V5LmVuY19rZXlfaWQua2V5aWQgPSB0dW5uZWxfaWRfdG9fa2V5MzIoa2V5LT50dW5faWQpOworCX0KKwogCXNrYl9rZXkuaW5kZXZfaWZpbmRleCA9IHNrYi0+c2tiX2lpZjsKIAkvKiBza2JfZmxvd19kaXNzZWN0KCkgZG9lcyBub3Qgc2V0IG5fcHJvdG8gaW4gY2FzZSBhbiB1bmtub3duIHByb3RvY29sLAogCSAqIHNvIGRvIGl0IHJhdGhlciBoZXJlLgpAQCAtMjEyLDcgKzI0MSw4IEBACiAJdGMudHlwZSA9IFRDX1NFVFVQX0NMU0ZMT1dFUjsKIAl0Yy5jbHNfZmxvd2VyID0gJm9mZmxvYWQ7CiAKLQllcnIgPSBkZXYtPm5ldGRldl9vcHMtPm5kb19zZXR1cF90YyhkZXYsIHRwLT5xLT5oYW5kbGUsIHRwLT5wcm90b2NvbCwgJnRjKTsKKwllcnIgPSBkZXYtPm5ldGRldl9vcHMtPm5kb19zZXR1cF90YyhkZXYsIHRwLT5xLT5oYW5kbGUsIHRwLT5wcm90b2NvbCwKKwkJCQkJICAgICZ0Yyk7CiAKIAlpZiAodGNfc2tpcF9zdyhmbGFncykpCiAJCXJldHVybiBlcnI7CkBAIC0yOTMsNiArMzIzLDIyIEBACiAJW1RDQV9GTE9XRVJfS0VZX1RDUF9EU1RdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbVENBX0ZMT1dFUl9LRVlfVURQX1NSQ10JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtUQ0FfRkxPV0VSX0tFWV9VRFBfRFNUXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW1RDQV9GTE9XRVJfS0VZX1ZMQU5fSURdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbVENBX0ZMT1dFUl9LRVlfVkxBTl9QUklPXQk9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbVENBX0ZMT1dFUl9LRVlfVkxBTl9FVEhfVFlQRV0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtUQ0FfRkxPV0VSX0tFWV9FTkNfS0VZX0lEXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW1RDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X1NSQ10JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9TUkNfTUFTS10gPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9EU1RdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfRFNUX01BU0tdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfU1JDXQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpIH0sCisJW1RDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQ19NQVNLXSA9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpIH0sCisJW1RDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVF0JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSB9LAorCVtUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9EU1RfTUFTS10gPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSB9LAorCVtUQ0FfRkxPV0VSX0tFWV9UQ1BfU1JDX01BU0tdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKKwlbVENBX0ZMT1dFUl9LRVlfVENQX0RTVF9NQVNLXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCisJW1RDQV9GTE9XRVJfS0VZX1VEUF9TUkNfTUFTS10JPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtUQ0FfRkxPV0VSX0tFWV9VRFBfRFNUX01BU0tdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIH07CiAKIHN0YXRpYyB2b2lkIGZsX3NldF9rZXlfdmFsKHN0cnVjdCBubGF0dHIgKip0YiwKQEAgLTMwOCw5ICszNTQsMjkgQEAKIAkJbWVtY3B5KG1hc2ssIG5sYV9kYXRhKHRiW21hc2tfdHlwZV0pLCBsZW4pOwogfQogCitzdGF0aWMgdm9pZCBmbF9zZXRfa2V5X3ZsYW4oc3RydWN0IG5sYXR0ciAqKnRiLAorCQkJICAgIHN0cnVjdCBmbG93X2Rpc3NlY3Rvcl9rZXlfdmxhbiAqa2V5X3ZhbCwKKwkJCSAgICBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3ZsYW4gKmtleV9tYXNrKQoreworI2RlZmluZSBWTEFOX1BSSU9SSVRZX01BU0sJMHg3CisKKwlpZiAodGJbVENBX0ZMT1dFUl9LRVlfVkxBTl9JRF0pIHsKKwkJa2V5X3ZhbC0+dmxhbl9pZCA9CisJCQlubGFfZ2V0X3UxNih0YltUQ0FfRkxPV0VSX0tFWV9WTEFOX0lEXSkgJiBWTEFOX1ZJRF9NQVNLOworCQlrZXlfbWFzay0+dmxhbl9pZCA9IFZMQU5fVklEX01BU0s7CisJfQorCWlmICh0YltUQ0FfRkxPV0VSX0tFWV9WTEFOX1BSSU9dKSB7CisJCWtleV92YWwtPnZsYW5fcHJpb3JpdHkgPQorCQkJbmxhX2dldF91OCh0YltUQ0FfRkxPV0VSX0tFWV9WTEFOX1BSSU9dKSAmCisJCQlWTEFOX1BSSU9SSVRZX01BU0s7CisJCWtleV9tYXNrLT52bGFuX3ByaW9yaXR5ID0gVkxBTl9QUklPUklUWV9NQVNLOworCX0KK30KKwogc3RhdGljIGludCBmbF9zZXRfa2V5KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5sYXR0ciAqKnRiLAogCQkgICAgICBzdHJ1Y3QgZmxfZmxvd19rZXkgKmtleSwgc3RydWN0IGZsX2Zsb3dfa2V5ICptYXNrKQogeworCV9fYmUxNiBldGhlcnR5cGU7CiAjaWZkZWYgQ09ORklHX05FVF9DTFNfSU5ECiAJaWYgKHRiW1RDQV9GTE9XRVJfSU5ERVZdKSB7CiAJCWludCBlcnIgPSB0Y2ZfY2hhbmdlX2luZGV2KG5ldCwgdGJbVENBX0ZMT1dFUl9JTkRFVl0pOwpAQCAtMzI4LDkgKzM5NCwyMCBAQAogCQkgICAgICAgbWFzay0+ZXRoLnNyYywgVENBX0ZMT1dFUl9LRVlfRVRIX1NSQ19NQVNLLAogCQkgICAgICAgc2l6ZW9mKGtleS0+ZXRoLnNyYykpOwogCi0JZmxfc2V0X2tleV92YWwodGIsICZrZXktPmJhc2ljLm5fcHJvdG8sIFRDQV9GTE9XRVJfS0VZX0VUSF9UWVBFLAotCQkgICAgICAgJm1hc2stPmJhc2ljLm5fcHJvdG8sIFRDQV9GTE9XRVJfVU5TUEVDLAotCQkgICAgICAgc2l6ZW9mKGtleS0+YmFzaWMubl9wcm90bykpOworCWlmICh0YltUQ0FfRkxPV0VSX0tFWV9FVEhfVFlQRV0pIHsKKwkJZXRoZXJ0eXBlID0gbmxhX2dldF9iZTE2KHRiW1RDQV9GTE9XRVJfS0VZX0VUSF9UWVBFXSk7CisKKwkJaWYgKGV0aGVydHlwZSA9PSBodG9ucyhFVEhfUF84MDIxUSkpIHsKKwkJCWZsX3NldF9rZXlfdmxhbih0YiwgJmtleS0+dmxhbiwgJm1hc2stPnZsYW4pOworCQkJZmxfc2V0X2tleV92YWwodGIsICZrZXktPmJhc2ljLm5fcHJvdG8sCisJCQkJICAgICAgIFRDQV9GTE9XRVJfS0VZX1ZMQU5fRVRIX1RZUEUsCisJCQkJICAgICAgICZtYXNrLT5iYXNpYy5uX3Byb3RvLCBUQ0FfRkxPV0VSX1VOU1BFQywKKwkJCQkgICAgICAgc2l6ZW9mKGtleS0+YmFzaWMubl9wcm90bykpOworCQl9IGVsc2UgeworCQkJa2V5LT5iYXNpYy5uX3Byb3RvID0gZXRoZXJ0eXBlOworCQkJbWFzay0+YmFzaWMubl9wcm90byA9IGNwdV90b19iZTE2KH4wKTsKKwkJfQorCX0KIAogCWlmIChrZXktPmJhc2ljLm5fcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVApIHx8CiAJICAgIGtleS0+YmFzaWMubl9wcm90byA9PSBodG9ucyhFVEhfUF9JUFY2KSkgewpAQCAtMzU5LDIwICs0MzYsNTQgQEAKIAogCWlmIChrZXktPmJhc2ljLmlwX3Byb3RvID09IElQUFJPVE9fVENQKSB7CiAJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT50cC5zcmMsIFRDQV9GTE9XRVJfS0VZX1RDUF9TUkMsCi0JCQkgICAgICAgJm1hc2stPnRwLnNyYywgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkgICAgICAgJm1hc2stPnRwLnNyYywgVENBX0ZMT1dFUl9LRVlfVENQX1NSQ19NQVNLLAogCQkJICAgICAgIHNpemVvZihrZXktPnRwLnNyYykpOwogCQlmbF9zZXRfa2V5X3ZhbCh0YiwgJmtleS0+dHAuZHN0LCBUQ0FfRkxPV0VSX0tFWV9UQ1BfRFNULAotCQkJICAgICAgICZtYXNrLT50cC5kc3QsIFRDQV9GTE9XRVJfVU5TUEVDLAorCQkJICAgICAgICZtYXNrLT50cC5kc3QsIFRDQV9GTE9XRVJfS0VZX1RDUF9EU1RfTUFTSywKIAkJCSAgICAgICBzaXplb2Yoa2V5LT50cC5kc3QpKTsKIAl9IGVsc2UgaWYgKGtleS0+YmFzaWMuaXBfcHJvdG8gPT0gSVBQUk9UT19VRFApIHsKIAkJZmxfc2V0X2tleV92YWwodGIsICZrZXktPnRwLnNyYywgVENBX0ZMT1dFUl9LRVlfVURQX1NSQywKLQkJCSAgICAgICAmbWFzay0+dHAuc3JjLCBUQ0FfRkxPV0VSX1VOU1BFQywKKwkJCSAgICAgICAmbWFzay0+dHAuc3JjLCBUQ0FfRkxPV0VSX0tFWV9VRFBfU1JDX01BU0ssCiAJCQkgICAgICAgc2l6ZW9mKGtleS0+dHAuc3JjKSk7CiAJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT50cC5kc3QsIFRDQV9GTE9XRVJfS0VZX1VEUF9EU1QsCi0JCQkgICAgICAgJm1hc2stPnRwLmRzdCwgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkgICAgICAgJm1hc2stPnRwLmRzdCwgVENBX0ZMT1dFUl9LRVlfVURQX0RTVF9NQVNLLAogCQkJICAgICAgIHNpemVvZihrZXktPnRwLmRzdCkpOwogCX0KIAorCWlmICh0YltUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9TUkNdIHx8CisJICAgIHRiW1RDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X0RTVF0pIHsKKwkJa2V5LT5lbmNfY29udHJvbC5hZGRyX3R5cGUgPSBGTE9XX0RJU1NFQ1RPUl9LRVlfSVBWNF9BRERSUzsKKwkJZmxfc2V0X2tleV92YWwodGIsICZrZXktPmVuY19pcHY0LnNyYywKKwkJCSAgICAgICBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9TUkMsCisJCQkgICAgICAgJm1hc2stPmVuY19pcHY0LnNyYywKKwkJCSAgICAgICBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9TUkNfTUFTSywKKwkJCSAgICAgICBzaXplb2Yoa2V5LT5lbmNfaXB2NC5zcmMpKTsKKwkJZmxfc2V0X2tleV92YWwodGIsICZrZXktPmVuY19pcHY0LmRzdCwKKwkJCSAgICAgICBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9EU1QsCisJCQkgICAgICAgJm1hc2stPmVuY19pcHY0LmRzdCwKKwkJCSAgICAgICBUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNF9EU1RfTUFTSywKKwkJCSAgICAgICBzaXplb2Yoa2V5LT5lbmNfaXB2NC5kc3QpKTsKKwl9CisKKwlpZiAodGJbVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfU1JDXSB8fAorCSAgICB0YltUQ0FfRkxPV0VSX0tFWV9FTkNfSVBWNl9EU1RdKSB7CisJCWtleS0+ZW5jX2NvbnRyb2wuYWRkcl90eXBlID0gRkxPV19ESVNTRUNUT1JfS0VZX0lQVjZfQUREUlM7CisJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5lbmNfaXB2Ni5zcmMsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfU1JDLAorCQkJICAgICAgICZtYXNrLT5lbmNfaXB2Ni5zcmMsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfU1JDX01BU0ssCisJCQkgICAgICAgc2l6ZW9mKGtleS0+ZW5jX2lwdjYuc3JjKSk7CisJCWZsX3NldF9rZXlfdmFsKHRiLCAma2V5LT5lbmNfaXB2Ni5kc3QsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfRFNULAorCQkJICAgICAgICZtYXNrLT5lbmNfaXB2Ni5kc3QsCisJCQkgICAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfRFNUX01BU0ssCisJCQkgICAgICAgc2l6ZW9mKGtleS0+ZW5jX2lwdjYuZHN0KSk7CisJfQorCisJZmxfc2V0X2tleV92YWwodGIsICZrZXktPmVuY19rZXlfaWQua2V5aWQsIFRDQV9GTE9XRVJfS0VZX0VOQ19LRVlfSUQsCisJCSAgICAgICAmbWFzay0+ZW5jX2tleV9pZC5rZXlpZCwgVENBX0ZMT1dFUl9VTlNQRUMsCisJCSAgICAgICBzaXplb2Yoa2V5LT5lbmNfa2V5X2lkLmtleWlkKSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDA0LDEyICs1MTUsMTAgQEAKIAogI2RlZmluZSBGTF9LRVlfTUVNQkVSX09GRlNFVChtZW1iZXIpIG9mZnNldG9mKHN0cnVjdCBmbF9mbG93X2tleSwgbWVtYmVyKQogI2RlZmluZSBGTF9LRVlfTUVNQkVSX1NJWkUobWVtYmVyKSAoc2l6ZW9mKCgoc3RydWN0IGZsX2Zsb3dfa2V5ICopIDApLT5tZW1iZXIpKQotI2RlZmluZSBGTF9LRVlfTUVNQkVSX0VORF9PRkZTRVQobWVtYmVyKQkJCQkJXAotCShGTF9LRVlfTUVNQkVSX09GRlNFVChtZW1iZXIpICsgRkxfS0VZX01FTUJFUl9TSVpFKG1lbWJlcikpCiAKLSNkZWZpbmUgRkxfS0VZX0lOX1JBTkdFKG1hc2ssIG1lbWJlcikJCQkJCQlcCi0gICAgICAgIChGTF9LRVlfTUVNQkVSX09GRlNFVChtZW1iZXIpIDw9IChtYXNrKS0+cmFuZ2UuZW5kICYmCQkJXAotICAgICAgICAgRkxfS0VZX01FTUJFUl9FTkRfT0ZGU0VUKG1lbWJlcikgPj0gKG1hc2spLT5yYW5nZS5zdGFydCkKKyNkZWZpbmUgRkxfS0VZX0lTX01BU0tFRChtYXNrLCBtZW1iZXIpCQkJCQkJXAorCW1lbWNocl9pbnYoKChjaGFyICopbWFzaykgKyBGTF9LRVlfTUVNQkVSX09GRlNFVChtZW1iZXIpLAkJXAorCQkgICAwLCBGTF9LRVlfTUVNQkVSX1NJWkUobWVtYmVyKSkJCQkJXAogCiAjZGVmaW5lIEZMX0tFWV9TRVQoa2V5cywgY250LCBpZCwgbWVtYmVyKQkJCQkJXAogCWRvIHsJCQkJCQkJCQlcCkBAIC00MTgsOSArNTI3LDkgQEAKIAkJY250Kys7CQkJCQkJCQlcCiAJfSB3aGlsZSgwKTsKIAotI2RlZmluZSBGTF9LRVlfU0VUX0lGX0lOX1JBTkdFKG1hc2ssIGtleXMsIGNudCwgaWQsIG1lbWJlcikJCQlcCisjZGVmaW5lIEZMX0tFWV9TRVRfSUZfTUFTS0VEKG1hc2ssIGtleXMsIGNudCwgaWQsIG1lbWJlcikJCQlcCiAJZG8gewkJCQkJCQkJCVwKLQkJaWYgKEZMX0tFWV9JTl9SQU5HRShtYXNrLCBtZW1iZXIpKQkJCQlcCisJCWlmIChGTF9LRVlfSVNfTUFTS0VEKG1hc2ssIG1lbWJlcikpCQkJCVwKIAkJCUZMX0tFWV9TRVQoa2V5cywgY250LCBpZCwgbWVtYmVyKTsJCQlcCiAJfSB3aGlsZSgwKTsKIApAQCAtNDMyLDE0ICs1NDEsMTYgQEAKIAogCUZMX0tFWV9TRVQoa2V5cywgY250LCBGTE9XX0RJU1NFQ1RPUl9LRVlfQ09OVFJPTCwgY29udHJvbCk7CiAJRkxfS0VZX1NFVChrZXlzLCBjbnQsIEZMT1dfRElTU0VDVE9SX0tFWV9CQVNJQywgYmFzaWMpOwotCUZMX0tFWV9TRVRfSUZfSU5fUkFOR0UobWFzaywga2V5cywgY250LAotCQkJICAgICAgIEZMT1dfRElTU0VDVE9SX0tFWV9FVEhfQUREUlMsIGV0aCk7Ci0JRkxfS0VZX1NFVF9JRl9JTl9SQU5HRShtYXNrLCBrZXlzLCBjbnQsCi0JCQkgICAgICAgRkxPV19ESVNTRUNUT1JfS0VZX0lQVjRfQUREUlMsIGlwdjQpOwotCUZMX0tFWV9TRVRfSUZfSU5fUkFOR0UobWFzaywga2V5cywgY250LAotCQkJICAgICAgIEZMT1dfRElTU0VDVE9SX0tFWV9JUFY2X0FERFJTLCBpcHY2KTsKLQlGTF9LRVlfU0VUX0lGX0lOX1JBTkdFKG1hc2ssIGtleXMsIGNudCwKLQkJCSAgICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfUE9SVFMsIHRwKTsKKwlGTF9LRVlfU0VUX0lGX01BU0tFRCgmbWFzay0+a2V5LCBrZXlzLCBjbnQsCisJCQkgICAgIEZMT1dfRElTU0VDVE9SX0tFWV9FVEhfQUREUlMsIGV0aCk7CisJRkxfS0VZX1NFVF9JRl9NQVNLRUQoJm1hc2stPmtleSwga2V5cywgY250LAorCQkJICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfSVBWNF9BRERSUywgaXB2NCk7CisJRkxfS0VZX1NFVF9JRl9NQVNLRUQoJm1hc2stPmtleSwga2V5cywgY250LAorCQkJICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfSVBWNl9BRERSUywgaXB2Nik7CisJRkxfS0VZX1NFVF9JRl9NQVNLRUQoJm1hc2stPmtleSwga2V5cywgY250LAorCQkJICAgICBGTE9XX0RJU1NFQ1RPUl9LRVlfUE9SVFMsIHRwKTsKKwlGTF9LRVlfU0VUX0lGX01BU0tFRCgmbWFzay0+a2V5LCBrZXlzLCBjbnQsCisJCQkgICAgIEZMT1dfRElTU0VDVE9SX0tFWV9WTEFOLCB2bGFuKTsKIAogCXNrYl9mbG93X2Rpc3NlY3Rvcl9pbml0KCZoZWFkLT5kaXNzZWN0b3IsIGtleXMsIGNudCk7CiB9CkBAIC00NzgsMTAgKzU4OSwxMiBAQAogCXN0cnVjdCB0Y2ZfZXh0cyBlOwogCWludCBlcnI7CiAKLQl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfRkxPV0VSX0FDVCwgMCk7Ci0JZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIGVzdCwgJmUsIG92cik7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmZSwgVENBX0ZMT1dFUl9BQ1QsIDApOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKIAogCWlmICh0YltUQ0FfRkxPV0VSX0NMQVNTSURdKSB7CiAJCWYtPnJlcy5jbGFzc2lkID0gbmxhX2dldF91MzIodGJbVENBX0ZMT1dFUl9DTEFTU0lEXSk7CkBAIC01NTAsNyArNjYzLDkgQEAKIAlpZiAoIWZuZXcpCiAJCXJldHVybiAtRU5PQlVGUzsKIAotCXRjZl9leHRzX2luaXQoJmZuZXctPmV4dHMsIFRDQV9GTE9XRVJfQUNULCAwKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZmbmV3LT5leHRzLCBUQ0FfRkxPV0VSX0FDVCwgMCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OwogCiAJaWYgKCFoYW5kbGUpIHsKIAkJaGFuZGxlID0gZmxfZ3JhYl9uZXdfaGFuZGxlKHRwLCBoZWFkKTsKQEAgLTYxNCw2ICs3MjksNyBAQAogCXJldHVybiAwOwogCiBlcnJvdXQ6CisJdGNmX2V4dHNfZGVzdHJveSgmZm5ldy0+ZXh0cyk7CiAJa2ZyZWUoZm5ldyk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTY2OCw2ICs3ODQsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBmbF9kdW1wX2tleV92bGFuKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgc3RydWN0IGZsb3dfZGlzc2VjdG9yX2tleV92bGFuICp2bGFuX2tleSwKKwkJCSAgICBzdHJ1Y3QgZmxvd19kaXNzZWN0b3Jfa2V5X3ZsYW4gKnZsYW5fbWFzaykKK3sKKwlpbnQgZXJyOworCisJaWYgKCFtZW1jaHJfaW52KHZsYW5fbWFzaywgMCwgc2l6ZW9mKCp2bGFuX21hc2spKSkKKwkJcmV0dXJuIDA7CisJaWYgKHZsYW5fbWFzay0+dmxhbl9pZCkgeworCQllcnIgPSBubGFfcHV0X3UxNihza2IsIFRDQV9GTE9XRVJfS0VZX1ZMQU5fSUQsCisJCQkJICB2bGFuX2tleS0+dmxhbl9pZCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlpZiAodmxhbl9tYXNrLT52bGFuX3ByaW9yaXR5KSB7CisJCWVyciA9IG5sYV9wdXRfdTgoc2tiLCBUQ0FfRkxPV0VSX0tFWV9WTEFOX1BSSU8sCisJCQkJIHZsYW5fa2V5LT52bGFuX3ByaW9yaXR5KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGZsX2R1bXAoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBmaCwKIAkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHRjbXNnICp0KQogewpAQCAtNzEyLDYgKzg1MSwxMCBAQAogCQkJICAgICZtYXNrLT5iYXNpYy5uX3Byb3RvLCBUQ0FfRkxPV0VSX1VOU1BFQywKIAkJCSAgICBzaXplb2Yoa2V5LT5iYXNpYy5uX3Byb3RvKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKGZsX2R1bXBfa2V5X3ZsYW4oc2tiLCAma2V5LT52bGFuLCAmbWFzay0+dmxhbikpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCiAJaWYgKChrZXktPmJhc2ljLm5fcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVApIHx8CiAJICAgICBrZXktPmJhc2ljLm5fcHJvdG8gPT0gaHRvbnMoRVRIX1BfSVBWNikpICYmCiAJICAgIGZsX2R1bXBfa2V5X3ZhbChza2IsICZrZXktPmJhc2ljLmlwX3Byb3RvLCBUQ0FfRkxPV0VSX0tFWV9JUF9QUk9UTywKQEAgLTczOCwyMSArODgxLDQ4IEBACiAKIAlpZiAoa2V5LT5iYXNpYy5pcF9wcm90byA9PSBJUFBST1RPX1RDUCAmJgogCSAgICAoZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+dHAuc3JjLCBUQ0FfRkxPV0VSX0tFWV9UQ1BfU1JDLAotCQkJICAgICAmbWFzay0+dHAuc3JjLCBUQ0FfRkxPV0VSX1VOU1BFQywKKwkJCSAgICAgJm1hc2stPnRwLnNyYywgVENBX0ZMT1dFUl9LRVlfVENQX1NSQ19NQVNLLAogCQkJICAgICBzaXplb2Yoa2V5LT50cC5zcmMpKSB8fAogCSAgICAgZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+dHAuZHN0LCBUQ0FfRkxPV0VSX0tFWV9UQ1BfRFNULAotCQkJICAgICAmbWFzay0+dHAuZHN0LCBUQ0FfRkxPV0VSX1VOU1BFQywKKwkJCSAgICAgJm1hc2stPnRwLmRzdCwgVENBX0ZMT1dFUl9LRVlfVENQX0RTVF9NQVNLLAogCQkJICAgICBzaXplb2Yoa2V5LT50cC5kc3QpKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCWVsc2UgaWYgKGtleS0+YmFzaWMuaXBfcHJvdG8gPT0gSVBQUk9UT19VRFAgJiYKIAkJIChmbF9kdW1wX2tleV92YWwoc2tiLCAma2V5LT50cC5zcmMsIFRDQV9GTE9XRVJfS0VZX1VEUF9TUkMsCi0JCQkJICAmbWFzay0+dHAuc3JjLCBUQ0FfRkxPV0VSX1VOU1BFQywKKwkJCQkgICZtYXNrLT50cC5zcmMsIFRDQV9GTE9XRVJfS0VZX1VEUF9TUkNfTUFTSywKIAkJCQkgIHNpemVvZihrZXktPnRwLnNyYykpIHx8CiAJCSAgZmxfZHVtcF9rZXlfdmFsKHNrYiwgJmtleS0+dHAuZHN0LCBUQ0FfRkxPV0VSX0tFWV9VRFBfRFNULAotCQkJCSAgJm1hc2stPnRwLmRzdCwgVENBX0ZMT1dFUl9VTlNQRUMsCisJCQkJICAmbWFzay0+dHAuZHN0LCBUQ0FfRkxPV0VSX0tFWV9VRFBfRFNUX01BU0ssCiAJCQkJICBzaXplb2Yoa2V5LT50cC5kc3QpKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCisJaWYgKGtleS0+ZW5jX2NvbnRyb2wuYWRkcl90eXBlID09IEZMT1dfRElTU0VDVE9SX0tFWV9JUFY0X0FERFJTICYmCisJICAgIChmbF9kdW1wX2tleV92YWwoc2tiLCAma2V5LT5lbmNfaXB2NC5zcmMsCisJCQkgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfU1JDLCAmbWFzay0+ZW5jX2lwdjQuc3JjLAorCQkJICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X1NSQ19NQVNLLAorCQkJICAgIHNpemVvZihrZXktPmVuY19pcHY0LnNyYykpIHx8CisJICAgICBmbF9kdW1wX2tleV92YWwoc2tiLCAma2V5LT5lbmNfaXB2NC5kc3QsCisJCQkgICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY0X0RTVCwgJm1hc2stPmVuY19pcHY0LmRzdCwKKwkJCSAgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjRfRFNUX01BU0ssCisJCQkgICAgIHNpemVvZihrZXktPmVuY19pcHY0LmRzdCkpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJZWxzZSBpZiAoa2V5LT5lbmNfY29udHJvbC5hZGRyX3R5cGUgPT0gRkxPV19ESVNTRUNUT1JfS0VZX0lQVjZfQUREUlMgJiYKKwkJIChmbF9kdW1wX2tleV92YWwoc2tiLCAma2V5LT5lbmNfaXB2Ni5zcmMsCisJCQkgICAgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfU1JDLCAmbWFzay0+ZW5jX2lwdjYuc3JjLAorCQkJICAgIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X1NSQ19NQVNLLAorCQkJICAgIHNpemVvZihrZXktPmVuY19pcHY2LnNyYykpIHx8CisJCSBmbF9kdW1wX2tleV92YWwoc2tiLCAma2V5LT5lbmNfaXB2Ni5kc3QsCisJCQkJIFRDQV9GTE9XRVJfS0VZX0VOQ19JUFY2X0RTVCwKKwkJCQkgJm1hc2stPmVuY19pcHY2LmRzdCwKKwkJCQkgVENBX0ZMT1dFUl9LRVlfRU5DX0lQVjZfRFNUX01BU0ssCisJCQkgICAgc2l6ZW9mKGtleS0+ZW5jX2lwdjYuZHN0KSkpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChmbF9kdW1wX2tleV92YWwoc2tiLCAma2V5LT5lbmNfa2V5X2lkLCBUQ0FfRkxPV0VSX0tFWV9FTkNfS0VZX0lELAorCQkJICAgICZtYXNrLT5lbmNfa2V5X2lkLCBUQ0FfRkxPV0VSX1VOU1BFQywKKwkJCSAgICBzaXplb2Yoa2V5LT5lbmNfa2V5X2lkKSkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCiAJbmxhX3B1dF91MzIoc2tiLCBUQ0FfRkxPV0VSX0ZMQUdTLCBmLT5mbGFncyk7CiAKIAlpZiAodGNmX2V4dHNfZHVtcChza2IsICZmLT5leHRzKSkKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfZncuYyBiL25ldC9zY2hlZC9jbHNfZncuYwppbmRleCBmMjNhM2I2Li45ZGM2M2Q1IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Z3LmMKKysrIGIvbmV0L3NjaGVkL2Nsc19mdy5jCkBAIC01Nyw3ICs1Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZndfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjZl9wcm90byAqdHAsCi0JCQkgIHN0cnVjdCB0Y2ZfcmVzdWx0ICpyZXMpCisJCSAgICAgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewogCXN0cnVjdCBmd19oZWFkICpoZWFkID0gcmN1X2RlcmVmZXJlbmNlX2JoKHRwLT5yb290KTsKIAlzdHJ1Y3QgZndfZmlsdGVyICpmOwpAQCAtMTg4LDE3ICsxODgsMjAgQEAKIAogc3RhdGljIGludAogZndfY2hhbmdlX2F0dHJzKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCBmd19maWx0ZXIgKmYsCi0Jc3RydWN0IG5sYXR0ciAqKnRiLCBzdHJ1Y3QgbmxhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nIGJhc2UsIGJvb2wgb3ZyKQorCQlzdHJ1Y3QgbmxhdHRyICoqdGIsIHN0cnVjdCBubGF0dHIgKip0Y2EsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJYm9vbCBvdnIpCiB7CiAJc3RydWN0IGZ3X2hlYWQgKmhlYWQgPSBydG5sX2RlcmVmZXJlbmNlKHRwLT5yb290KTsKIAlzdHJ1Y3QgdGNmX2V4dHMgZTsKIAl1MzIgbWFzazsKIAlpbnQgZXJyOwogCi0JdGNmX2V4dHNfaW5pdCgmZSwgVENBX0ZXX0FDVCwgVENBX0ZXX1BPTElDRSk7Ci0JZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIHRjYVtUQ0FfUkFURV0sICZlLCBvdnIpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9GV19BQ1QsIFRDQV9GV19QT0xJQ0UpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCB0Y2FbVENBX1JBVEVdLCAmZSwgb3ZyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CiAKIAlpZiAodGJbVENBX0ZXX0NMQVNTSURdKSB7CiAJCWYtPnJlcy5jbGFzc2lkID0gbmxhX2dldF91MzIodGJbVENBX0ZXX0NMQVNTSURdKTsKQEAgLTIzNSw5ICsyMzgsOCBAQAogCiBzdGF0aWMgaW50IGZ3X2NoYW5nZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICppbl9za2IsCiAJCSAgICAgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYmFzZSwKLQkJICAgICB1MzIgaGFuZGxlLAotCQkgICAgIHN0cnVjdCBubGF0dHIgKip0Y2EsCi0JCSAgICAgdW5zaWduZWQgbG9uZyAqYXJnLCBib29sIG92cikKKwkJICAgICB1MzIgaGFuZGxlLCBzdHJ1Y3QgbmxhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nICphcmcsCisJCSAgICAgYm9vbCBvdnIpCiB7CiAJc3RydWN0IGZ3X2hlYWQgKmhlYWQgPSBydG5sX2RlcmVmZXJlbmNlKHRwLT5yb290KTsKIAlzdHJ1Y3QgZndfZmlsdGVyICpmID0gKHN0cnVjdCBmd19maWx0ZXIgKikgKmFyZzsKQEAgLTI3MCwxMCArMjcyLDE1IEBACiAjZW5kaWYgLyogQ09ORklHX05FVF9DTFNfSU5EICovCiAJCWZuZXctPnRwID0gZi0+dHA7CiAKLQkJdGNmX2V4dHNfaW5pdCgmZm5ldy0+ZXh0cywgVENBX0ZXX0FDVCwgVENBX0ZXX1BPTElDRSk7CisJCWVyciA9IHRjZl9leHRzX2luaXQoJmZuZXctPmV4dHMsIFRDQV9GV19BQ1QsIFRDQV9GV19QT0xJQ0UpOworCQlpZiAoZXJyIDwgMCkgeworCQkJa2ZyZWUoZm5ldyk7CisJCQlyZXR1cm4gZXJyOworCQl9CiAKIAkJZXJyID0gZndfY2hhbmdlX2F0dHJzKG5ldCwgdHAsIGZuZXcsIHRiLCB0Y2EsIGJhc2UsIG92cik7CiAJCWlmIChlcnIgPCAwKSB7CisJCQl0Y2ZfZXh0c19kZXN0cm95KCZmbmV3LT5leHRzKTsKIAkJCWtmcmVlKGZuZXcpOwogCQkJcmV0dXJuIGVycjsKIAkJfQpAQCAtMzEzLDcgKzMyMCw5IEBACiAJaWYgKGYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JdGNmX2V4dHNfaW5pdCgmZi0+ZXh0cywgVENBX0ZXX0FDVCwgVENBX0ZXX1BPTElDRSk7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmZi0+ZXh0cywgVENBX0ZXX0FDVCwgVENBX0ZXX1BPTElDRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OwogCWYtPmlkID0gaGFuZGxlOwogCWYtPnRwID0gdHA7CiAKQEAgLTMyOCw2ICszMzcsNyBAQAogCXJldHVybiAwOwogCiBlcnJvdXQ6CisJdGNmX2V4dHNfZGVzdHJveSgmZi0+ZXh0cyk7CiAJa2ZyZWUoZik7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfcm91dGUuYyBiL25ldC9zY2hlZC9jbHNfcm91dGUuYwppbmRleCAwOGEzYjBhLi40NTVmYzhmIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3JvdXRlLmMKKysrIGIvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jCkBAIC0yNjgsOCArMjY4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQKLXJvdXRlNF9kZWxldGVfZmlsdGVyKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3N0YXRpYyB2b2lkIHJvdXRlNF9kZWxldGVfZmlsdGVyKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKIHsKIAlzdHJ1Y3Qgcm91dGU0X2ZpbHRlciAqZiA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3Qgcm91dGU0X2ZpbHRlciwgcmN1KTsKIApAQCAtMzgzLDE3ICszODIsMTkgQEAKIAkJCSAgICBzdHJ1Y3QgbmxhdHRyICoqdGIsIHN0cnVjdCBubGF0dHIgKmVzdCwgaW50IG5ldywKIAkJCSAgICBib29sIG92cikKIHsKLQlpbnQgZXJyOwogCXUzMiBpZCA9IDAsIHRvID0gMCwgbmhhbmRsZSA9IDB4ODAwMDsKIAlzdHJ1Y3Qgcm91dGU0X2ZpbHRlciAqZnA7CiAJdW5zaWduZWQgaW50IGgxOwogCXN0cnVjdCByb3V0ZTRfYnVja2V0ICpiOwogCXN0cnVjdCB0Y2ZfZXh0cyBlOworCWludCBlcnI7CiAKLQl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfUk9VVEU0X0FDVCwgVENBX1JPVVRFNF9QT0xJQ0UpOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9ST1VURTRfQUNULCBUQ0FfUk9VVEU0X1BPTElDRSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CisJZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIGVzdCwgJmUsIG92cik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gLUVJTlZBTDsKIAlpZiAodGJbVENBX1JPVVRFNF9UT10pIHsKQEAgLTQ3MiwxMCArNDczLDggQEAKIH0KIAogc3RhdGljIGludCByb3V0ZTRfY2hhbmdlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKLQkJICAgICAgIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGJhc2UsCi0JCSAgICAgICB1MzIgaGFuZGxlLAotCQkgICAgICAgc3RydWN0IG5sYXR0ciAqKnRjYSwKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmFyZywgYm9vbCBvdnIpCisJCQkgc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdTMyIGhhbmRsZSwKKwkJCSBzdHJ1Y3QgbmxhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nICphcmcsIGJvb2wgb3ZyKQogewogCXN0cnVjdCByb3V0ZTRfaGVhZCAqaGVhZCA9IHJ0bmxfZGVyZWZlcmVuY2UodHAtPnJvb3QpOwogCXN0cnVjdCByb3V0ZTRfZmlsdGVyIF9fcmN1ICoqZnA7CkBAIC01MDMsNyArNTAyLDEwIEBACiAJaWYgKCFmKQogCQlnb3RvIGVycm91dDsKIAotCXRjZl9leHRzX2luaXQoJmYtPmV4dHMsIFRDQV9ST1VURTRfQUNULCBUQ0FfUk9VVEU0X1BPTElDRSk7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmZi0+ZXh0cywgVENBX1JPVVRFNF9BQ1QsIFRDQV9ST1VURTRfUE9MSUNFKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CisKIAlpZiAoZm9sZCkgewogCQlmLT5pZCA9IGZvbGQtPmlkOwogCQlmLT5paWYgPSBmb2xkLT5paWY7CkBAIC01NTcsNiArNTU5LDggQEAKIAlyZXR1cm4gMDsKIAogZXJyb3V0OgorCWlmIChmKQorCQl0Y2ZfZXh0c19kZXN0cm95KCZmLT5leHRzKTsKIAlrZnJlZShmKTsKIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19yc3ZwLmggYi9uZXQvc2NoZWQvY2xzX3JzdnAuaAppbmRleCBmOWM5ZmMwLi40ZjA1YTE5IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3JzdnAuaAorKysgYi9uZXQvc2NoZWQvY2xzX3JzdnAuaApAQCAtNDg3LDEwICs0ODcsMTIgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXRjZl9leHRzX2luaXQoJmUsIFRDQV9SU1ZQX0FDVCwgVENBX1JTVlBfUE9MSUNFKTsKLQllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgdGNhW1RDQV9SQVRFXSwgJmUsIG92cik7CisJZXJyID0gdGNmX2V4dHNfaW5pdCgmZSwgVENBX1JTVlBfQUNULCBUQ0FfUlNWUF9QT0xJQ0UpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOworCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCB0Y2FbVENBX1JBVEVdLCAmZSwgb3ZyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQyOwogCiAJZiA9IChzdHJ1Y3QgcnN2cF9maWx0ZXIgKikqYXJnOwogCWlmIChmKSB7CkBAIC01MDYsNyArNTA4LDExIEBACiAJCQlnb3RvIGVycm91dDI7CiAJCX0KIAotCQl0Y2ZfZXh0c19pbml0KCZuLT5leHRzLCBUQ0FfUlNWUF9BQ1QsIFRDQV9SU1ZQX1BPTElDRSk7CisJCWVyciA9IHRjZl9leHRzX2luaXQoJm4tPmV4dHMsIFRDQV9SU1ZQX0FDVCwgVENBX1JTVlBfUE9MSUNFKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWtmcmVlKG4pOworCQkJZ290byBlcnJvdXQyOworCQl9CiAKIAkJaWYgKHRiW1RDQV9SU1ZQX0NMQVNTSURdKSB7CiAJCQluLT5yZXMuY2xhc3NpZCA9IG5sYV9nZXRfdTMyKHRiW1RDQV9SU1ZQX0NMQVNTSURdKTsKQEAgLTUzMCw3ICs1MzYsOSBAQAogCWlmIChmID09IE5VTEwpCiAJCWdvdG8gZXJyb3V0MjsKIAotCXRjZl9leHRzX2luaXQoJmYtPmV4dHMsIFRDQV9SU1ZQX0FDVCwgVENBX1JTVlBfUE9MSUNFKTsKKwllcnIgPSB0Y2ZfZXh0c19pbml0KCZmLT5leHRzLCBUQ0FfUlNWUF9BQ1QsIFRDQV9SU1ZQX1BPTElDRSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OwogCWgyID0gMTY7CiAJaWYgKHRiW1RDQV9SU1ZQX1NSQ10pIHsKIAkJbWVtY3B5KGYtPnNyYywgbmxhX2RhdGEodGJbVENBX1JTVlBfU1JDXSksIHNpemVvZihmLT5zcmMpKTsKQEAgLTYyNyw2ICs2MzUsNyBAQAogCWdvdG8gaW5zZXJ0OwogCiBlcnJvdXQ6CisJdGNmX2V4dHNfZGVzdHJveSgmZi0+ZXh0cyk7CiAJa2ZyZWUoZik7CiBlcnJvdXQyOgogCXRjZl9leHRzX2Rlc3Ryb3koJmUpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMgYi9uZXQvc2NoZWQvY2xzX3RjaW5kZXguYwppbmRleCA5NDRjOGZmLi45NjE0NGJkIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3RjaW5kZXguYworKysgYi9uZXQvc2NoZWQvY2xzX3RjaW5kZXguYwpAQCAtNTAsMTQgKzUwLDEzIEBACiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50Ci10Y2luZGV4X2ZpbHRlcl9pc19zZXQoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqcikKK3N0YXRpYyBpbmxpbmUgaW50IHRjaW5kZXhfZmlsdGVyX2lzX3NldChzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpyKQogewogCXJldHVybiB0Y2ZfZXh0c19pc19wcmVkaWNhdGl2ZSgmci0+ZXh0cykgfHwgci0+cmVzLmNsYXNzaWQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICoKLXRjaW5kZXhfbG9va3VwKHN0cnVjdCB0Y2luZGV4X2RhdGEgKnAsIHUxNiBrZXkpCitzdGF0aWMgc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqdGNpbmRleF9sb29rdXAoc3RydWN0IHRjaW5kZXhfZGF0YSAqcCwKKwkJCQkJCSAgICB1MTYga2V5KQogewogCWlmIChwLT5wZXJmZWN0KSB7CiAJCXN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKmYgPSBwLT5wZXJmZWN0ICsga2V5OwpAQCAtMTQ0LDcgKzE0Myw4IEBACiAKIHN0YXRpYyB2b2lkIHRjaW5kZXhfZGVzdHJveV9mZXh0cyhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiB7Ci0Jc3RydWN0IHRjaW5kZXhfZmlsdGVyICpmID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCB0Y2luZGV4X2ZpbHRlciwgcmN1KTsKKwlzdHJ1Y3QgdGNpbmRleF9maWx0ZXIgKmYgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHRjaW5kZXhfZmlsdGVyLAorCQkJCQkJcmN1KTsKIAogCXRjZl9leHRzX2Rlc3Ryb3koJmYtPnJlc3VsdC5leHRzKTsKIAlrZnJlZShmKTsKQEAgLTIxOSwxMCArMjE5LDEwIEBACiAJW1RDQV9UQ0lOREVYX0NMQVNTSURdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiB9OwogCi1zdGF0aWMgdm9pZCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHRfaW5pdChzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpyKQorc3RhdGljIGludCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHRfaW5pdChzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpyKQogewogCW1lbXNldChyLCAwLCBzaXplb2YoKnIpKTsKLQl0Y2ZfZXh0c19pbml0KCZyLT5leHRzLCBUQ0FfVENJTkRFWF9BQ1QsIFRDQV9UQ0lOREVYX1BPTElDRSk7CisJcmV0dXJuIHRjZl9leHRzX2luaXQoJnItPmV4dHMsIFRDQV9UQ0lOREVYX0FDVCwgVENBX1RDSU5ERVhfUE9MSUNFKTsKIH0KIAogc3RhdGljIHZvaWQgX190Y2luZGV4X3BhcnRpYWxfZGVzdHJveShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCkBAIC0yMzMsMjMgKzIzMyw1NyBAQAogCWtmcmVlKHApOwogfQogCitzdGF0aWMgdm9pZCB0Y2luZGV4X2ZyZWVfcGVyZmVjdF9oYXNoKHN0cnVjdCB0Y2luZGV4X2RhdGEgKmNwKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNwLT5oYXNoOyBpKyspCisJCXRjZl9leHRzX2Rlc3Ryb3koJmNwLT5wZXJmZWN0W2ldLmV4dHMpOworCWtmcmVlKGNwLT5wZXJmZWN0KTsKK30KKworc3RhdGljIGludCB0Y2luZGV4X2FsbG9jX3BlcmZlY3RfaGFzaChzdHJ1Y3QgdGNpbmRleF9kYXRhICpjcCkKK3sKKwlpbnQgaSwgZXJyID0gMDsKKworCWNwLT5wZXJmZWN0ID0ga2NhbGxvYyhjcC0+aGFzaCwgc2l6ZW9mKHN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQpLAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcC0+cGVyZmVjdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgY3AtPmhhc2g7IGkrKykgeworCQllcnIgPSB0Y2ZfZXh0c19pbml0KCZjcC0+cGVyZmVjdFtpXS5leHRzLAorCQkJCSAgICBUQ0FfVENJTkRFWF9BQ1QsIFRDQV9UQ0lOREVYX1BPTElDRSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvdXQ7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm91dDoKKwl0Y2luZGV4X2ZyZWVfcGVyZmVjdF9oYXNoKGNwKTsKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50CiB0Y2luZGV4X3NldF9wYXJtcyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGJhc2UsCiAJCSAgdTMyIGhhbmRsZSwgc3RydWN0IHRjaW5kZXhfZGF0YSAqcCwKIAkJICBzdHJ1Y3QgdGNpbmRleF9maWx0ZXJfcmVzdWx0ICpyLCBzdHJ1Y3QgbmxhdHRyICoqdGIsCiAJCSAgc3RydWN0IG5sYXR0ciAqZXN0LCBib29sIG92cikKIHsKLQlpbnQgZXJyLCBiYWxsb2MgPSAwOwogCXN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgbmV3X2ZpbHRlcl9yZXN1bHQsICpvbGRfciA9IHI7CiAJc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCBjcjsKLQlzdHJ1Y3QgdGNpbmRleF9kYXRhICpjcCwgKm9sZHA7CisJc3RydWN0IHRjaW5kZXhfZGF0YSAqY3AgPSBOVUxMLCAqb2xkcDsKIAlzdHJ1Y3QgdGNpbmRleF9maWx0ZXIgKmYgPSBOVUxMOyAvKiBtYWtlIGdjYyBiZWhhdmUgKi8KKwlpbnQgZXJyLCBiYWxsb2MgPSAwOwogCXN0cnVjdCB0Y2ZfZXh0cyBlOwogCi0JdGNmX2V4dHNfaW5pdCgmZSwgVENBX1RDSU5ERVhfQUNULCBUQ0FfVENJTkRFWF9QT0xJQ0UpOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9UQ0lOREVYX0FDVCwgVENBX1RDSU5ERVhfUE9MSUNFKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwllcnIgPSB0Y2ZfZXh0c192YWxpZGF0ZShuZXQsIHRwLCB0YiwgZXN0LCAmZSwgb3ZyKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSAtRU5PTUVNOwogCS8qIHRjaW5kZXhfZGF0YSBhdHRyaWJ1dGVzIG11c3QgbG9vayBhdG9taWMgdG8gY2xhc3NpZmllci9sb29rdXAgc28KQEAgLTI3MCwxOSArMzA0LDIwIEBACiAJaWYgKHAtPnBlcmZlY3QpIHsKIAkJaW50IGk7CiAKLQkJY3AtPnBlcmZlY3QgPSBrbWVtZHVwKHAtPnBlcmZlY3QsCi0JCQkJICAgICAgc2l6ZW9mKCpyKSAqIGNwLT5oYXNoLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjcC0+cGVyZmVjdCkKKwkJaWYgKHRjaW5kZXhfYWxsb2NfcGVyZmVjdF9oYXNoKGNwKSA8IDApCiAJCQlnb3RvIGVycm91dDsKIAkJZm9yIChpID0gMDsgaSA8IGNwLT5oYXNoOyBpKyspCi0JCQl0Y2ZfZXh0c19pbml0KCZjcC0+cGVyZmVjdFtpXS5leHRzLAotCQkJCSAgICAgIFRDQV9UQ0lOREVYX0FDVCwgVENBX1RDSU5ERVhfUE9MSUNFKTsKKwkJCWNwLT5wZXJmZWN0W2ldLnJlcyA9IHAtPnBlcmZlY3RbaV0ucmVzOwogCQliYWxsb2MgPSAxOwogCX0KIAljcC0+aCA9IHAtPmg7CiAKLQl0Y2luZGV4X2ZpbHRlcl9yZXN1bHRfaW5pdCgmbmV3X2ZpbHRlcl9yZXN1bHQpOwotCXRjaW5kZXhfZmlsdGVyX3Jlc3VsdF9pbml0KCZjcik7CisJZXJyID0gdGNpbmRleF9maWx0ZXJfcmVzdWx0X2luaXQoJm5ld19maWx0ZXJfcmVzdWx0KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQxOworCWVyciA9IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdF9pbml0KCZjcik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0MTsKIAlpZiAob2xkX3IpCiAJCWNyLnJlcyA9IHItPnJlczsKIApAQCAtMzM4LDE1ICszNzMsOCBAQAogCWVyciA9IC1FTk9NRU07CiAJaWYgKCFjcC0+cGVyZmVjdCAmJiAhY3AtPmgpIHsKIAkJaWYgKHZhbGlkX3BlcmZlY3RfaGFzaChjcCkpIHsKLQkJCWludCBpOwotCi0JCQljcC0+cGVyZmVjdCA9IGtjYWxsb2MoY3AtPmhhc2gsIHNpemVvZigqciksIEdGUF9LRVJORUwpOwotCQkJaWYgKCFjcC0+cGVyZmVjdCkKKwkJCWlmICh0Y2luZGV4X2FsbG9jX3BlcmZlY3RfaGFzaChjcCkgPCAwKQogCQkJCWdvdG8gZXJyb3V0X2FsbG9jOwotCQkJZm9yIChpID0gMDsgaSA8IGNwLT5oYXNoOyBpKyspCi0JCQkJdGNmX2V4dHNfaW5pdCgmY3AtPnBlcmZlY3RbaV0uZXh0cywKLQkJCQkJICAgICAgVENBX1RDSU5ERVhfQUNULAotCQkJCQkgICAgICBUQ0FfVENJTkRFWF9QT0xJQ0UpOwogCQkJYmFsbG9jID0gMTsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCB0Y2luZGV4X2ZpbHRlciBfX3JjdSAqKmhhc2g7CkBAIC0zNzMsOCArNDAxLDEyIEBACiAJCWlmICghZikKIAkJCWdvdG8gZXJyb3V0X2FsbG9jOwogCQlmLT5rZXkgPSBoYW5kbGU7Ci0JCXRjaW5kZXhfZmlsdGVyX3Jlc3VsdF9pbml0KCZmLT5yZXN1bHQpOwogCQlmLT5uZXh0ID0gTlVMTDsKKwkJZXJyID0gdGNpbmRleF9maWx0ZXJfcmVzdWx0X2luaXQoJmYtPnJlc3VsdCk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlrZnJlZShmKTsKKwkJCWdvdG8gZXJyb3V0X2FsbG9jOworCQl9CiAJfQogCiAJaWYgKHRiW1RDQV9UQ0lOREVYX0NMQVNTSURdKSB7CkBAIC0zODcsOCArNDE5LDEzIEBACiAJZWxzZQogCQl0Y2ZfZXh0c19jaGFuZ2UodHAsICZjci5leHRzLCAmZSk7CiAKLQlpZiAob2xkX3IgJiYgb2xkX3IgIT0gcikKLQkJdGNpbmRleF9maWx0ZXJfcmVzdWx0X2luaXQob2xkX3IpOworCWlmIChvbGRfciAmJiBvbGRfciAhPSByKSB7CisJCWVyciA9IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdF9pbml0KG9sZF9yKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWtmcmVlKGYpOworCQkJZ290byBlcnJvdXRfYWxsb2M7CisJCX0KKwl9CiAKIAlvbGRwID0gcDsKIAlyLT5yZXMgPSBjci5yZXM7CkBAIC00MTUsOSArNDUyLDEyIEBACiAKIGVycm91dF9hbGxvYzoKIAlpZiAoYmFsbG9jID09IDEpCi0JCWtmcmVlKGNwLT5wZXJmZWN0KTsKKwkJdGNpbmRleF9mcmVlX3BlcmZlY3RfaGFzaChjcCk7CiAJZWxzZSBpZiAoYmFsbG9jID09IDIpCiAJCWtmcmVlKGNwLT5oKTsKK2Vycm91dDE6CisJdGNmX2V4dHNfZGVzdHJveSgmY3IuZXh0cyk7CisJdGNmX2V4dHNfZGVzdHJveSgmbmV3X2ZpbHRlcl9yZXN1bHQuZXh0cyk7CiBlcnJvdXQ6CiAJa2ZyZWUoY3ApOwogCXRjZl9leHRzX2Rlc3Ryb3koJmUpOwpAQCAtNTEwLDcgKzU1MCw3IEBACiAKIAogc3RhdGljIGludCB0Y2luZGV4X2R1bXAoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBmaCwKLSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnQpCisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnQpCiB7CiAJc3RydWN0IHRjaW5kZXhfZGF0YSAqcCA9IHJ0bmxfZGVyZWZlcmVuY2UodHAtPnJvb3QpOwogCXN0cnVjdCB0Y2luZGV4X2ZpbHRlcl9yZXN1bHQgKnIgPSAoc3RydWN0IHRjaW5kZXhfZmlsdGVyX3Jlc3VsdCAqKSBmaDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdTMyLmMgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCmluZGV4IGZmZTU5M2UuLmFlODNjM2FlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3UzMi5jCisrKyBiL25ldC9zY2hlZC9jbHNfdTMyLmMKQEAgLTEwNCw3ICsxMDQsOCBAQAogCXJldHVybiBoOwogfQogCi1zdGF0aWMgaW50IHUzMl9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKK3N0YXRpYyBpbnQgdTMyX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAorCQkJc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKIAlzdHJ1Y3QgewogCQlzdHJ1Y3QgdGNfdV9rbm9kZSAqa25vZGU7CkBAIC0yNTYsOCArMjU3LDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGNfdV9obm9kZSAqCi11MzJfbG9va3VwX2h0KHN0cnVjdCB0Y191X2NvbW1vbiAqdHBfYywgdTMyIGhhbmRsZSkKK3N0YXRpYyBzdHJ1Y3QgdGNfdV9obm9kZSAqdTMyX2xvb2t1cF9odChzdHJ1Y3QgdGNfdV9jb21tb24gKnRwX2MsIHUzMiBoYW5kbGUpCiB7CiAJc3RydWN0IHRjX3VfaG5vZGUgKmh0OwogCkBAIC0yNzAsOCArMjcwLDcgQEAKIAlyZXR1cm4gaHQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGNfdV9rbm9kZSAqCi11MzJfbG9va3VwX2tleShzdHJ1Y3QgdGNfdV9obm9kZSAqaHQsIHUzMiBoYW5kbGUpCitzdGF0aWMgc3RydWN0IHRjX3Vfa25vZGUgKnUzMl9sb29rdXBfa2V5KHN0cnVjdCB0Y191X2hub2RlICpodCwgdTMyIGhhbmRsZSkKIHsKIAl1bnNpZ25lZCBpbnQgc2VsOwogCXN0cnVjdCB0Y191X2tub2RlICpuID0gTlVMTDsKQEAgLTM2MCw4ICszNTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHUzMl9kZXN0cm95X2tleShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKLQkJCSAgIHN0cnVjdCB0Y191X2tub2RlICpuLAorc3RhdGljIGludCB1MzJfZGVzdHJveV9rZXkoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y191X2tub2RlICpuLAogCQkJICAgYm9vbCBmcmVlX3BmKQogewogCXRjZl9leHRzX2Rlc3Ryb3koJm4tPmV4dHMpOwpAQCAtNDQ4LDkgKzQ0Niw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHUzMl9yZXBsYWNlX2h3X2hub2RlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAotCQkJCSBzdHJ1Y3QgdGNfdV9obm9kZSAqaCwKLQkJCQkgdTMyIGZsYWdzKQorc3RhdGljIGludCB1MzJfcmVwbGFjZV9od19obm9kZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHRjX3VfaG5vZGUgKmgsCisJCQkJdTMyIGZsYWdzKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB0cC0+cS0+ZGV2X3F1ZXVlLT5kZXY7CiAJc3RydWN0IHRjX2Nsc191MzJfb2ZmbG9hZCB1MzJfb2ZmbG9hZCA9IHswfTsKQEAgLTQ5Niw5ICs0OTMsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCB1MzJfcmVwbGFjZV9od19rbm9kZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKLQkJCQkgc3RydWN0IHRjX3Vfa25vZGUgKm4sCi0JCQkJIHUzMiBmbGFncykKK3N0YXRpYyBpbnQgdTMyX3JlcGxhY2VfaHdfa25vZGUoc3RydWN0IHRjZl9wcm90byAqdHAsIHN0cnVjdCB0Y191X2tub2RlICpuLAorCQkJCXUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdHAtPnEtPmRldl9xdWV1ZS0+ZGV2OwogCXN0cnVjdCB0Y19jbHNfdTMyX29mZmxvYWQgdTMyX29mZmxvYWQgPSB7MH07CkBAIC03MDksMTMgKzcwNSwxNSBAQAogCQkJIHN0cnVjdCB0Y191X2tub2RlICpuLCBzdHJ1Y3QgbmxhdHRyICoqdGIsCiAJCQkgc3RydWN0IG5sYXR0ciAqZXN0LCBib29sIG92cikKIHsKLQlpbnQgZXJyOwogCXN0cnVjdCB0Y2ZfZXh0cyBlOworCWludCBlcnI7CiAKLQl0Y2ZfZXh0c19pbml0KCZlLCBUQ0FfVTMyX0FDVCwgVENBX1UzMl9QT0xJQ0UpOwotCWVyciA9IHRjZl9leHRzX3ZhbGlkYXRlKG5ldCwgdHAsIHRiLCBlc3QsICZlLCBvdnIpOworCWVyciA9IHRjZl9leHRzX2luaXQoJmUsIFRDQV9VMzJfQUNULCBUQ0FfVTMyX1BPTElDRSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CisJZXJyID0gdGNmX2V4dHNfdmFsaWRhdGUobmV0LCB0cCwgdGIsIGVzdCwgJmUsIG92cik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gLUVJTlZBTDsKIAlpZiAodGJbVENBX1UzMl9MSU5LXSkgewpAQCAtNzYxLDggKzc1OSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgdTMyX3JlcGxhY2Vfa25vZGUoc3RydWN0IHRjZl9wcm90byAqdHAsCi0JCQkgICAgICBzdHJ1Y3QgdGNfdV9jb21tb24gKnRwX2MsCitzdGF0aWMgdm9pZCB1MzJfcmVwbGFjZV9rbm9kZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgc3RydWN0IHRjX3VfY29tbW9uICp0cF9jLAogCQkJICAgICAgc3RydWN0IHRjX3Vfa25vZGUgKm4pCiB7CiAJc3RydWN0IHRjX3Vfa25vZGUgX19yY3UgKippbnM7CkBAIC04MzMsMTUgKzgzMCwxNyBAQAogCW5ldy0+dHAgPSB0cDsKIAltZW1jcHkoJm5ldy0+c2VsLCBzLCBzaXplb2YoKnMpICsgcy0+bmtleXMqc2l6ZW9mKHN0cnVjdCB0Y191MzJfa2V5KSk7CiAKLQl0Y2ZfZXh0c19pbml0KCZuZXctPmV4dHMsIFRDQV9VMzJfQUNULCBUQ0FfVTMyX1BPTElDRSk7CisJaWYgKHRjZl9leHRzX2luaXQoJm5ldy0+ZXh0cywgVENBX1UzMl9BQ1QsIFRDQV9VMzJfUE9MSUNFKSkgeworCQlrZnJlZShuZXcpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlyZXR1cm4gbmV3OwogfQogCiBzdGF0aWMgaW50IHUzMl9jaGFuZ2Uoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAogCQkgICAgICBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBiYXNlLCB1MzIgaGFuZGxlLAotCQkgICAgICBzdHJ1Y3QgbmxhdHRyICoqdGNhLAotCQkgICAgICB1bnNpZ25lZCBsb25nICphcmcsIGJvb2wgb3ZyKQorCQkgICAgICBzdHJ1Y3QgbmxhdHRyICoqdGNhLCB1bnNpZ25lZCBsb25nICphcmcsIGJvb2wgb3ZyKQogewogCXN0cnVjdCB0Y191X2NvbW1vbiAqdHBfYyA9IHRwLT5kYXRhOwogCXN0cnVjdCB0Y191X2hub2RlICpodDsKQEAgLTk4NSw5ICs5ODQsMTIgQEAKIAluLT5oYW5kbGUgPSBoYW5kbGU7CiAJbi0+ZnNoaWZ0ID0gcy0+aG1hc2sgPyBmZnMobnRvaGwocy0+aG1hc2spKSAtIDEgOiAwOwogCW4tPmZsYWdzID0gZmxhZ3M7Ci0JdGNmX2V4dHNfaW5pdCgmbi0+ZXh0cywgVENBX1UzMl9BQ1QsIFRDQV9VMzJfUE9MSUNFKTsKIAluLT50cCA9IHRwOwogCisJZXJyID0gdGNmX2V4dHNfaW5pdCgmbi0+ZXh0cywgVENBX1UzMl9BQ1QsIFRDQV9VMzJfUE9MSUNFKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvdXQ7CisKICNpZmRlZiBDT05GSUdfQ0xTX1UzMl9NQVJLCiAJbi0+cGNwdV9zdWNjZXNzID0gYWxsb2NfcGVyY3B1KHUzMik7CiAJaWYgKCFuLT5wY3B1X3N1Y2Nlc3MpIHsKQEAgLTEwMjgsOSArMTAzMCwxMCBAQAogZXJyaHc6CiAjaWZkZWYgQ09ORklHX0NMU19VMzJfTUFSSwogCWZyZWVfcGVyY3B1KG4tPnBjcHVfc3VjY2Vzcyk7Ci1lcnJvdXQ6CiAjZW5kaWYKIAorZXJyb3V0OgorCXRjZl9leHRzX2Rlc3Ryb3koJm4tPmV4dHMpOwogI2lmZGVmIENPTkZJR19DTFNfVTMyX1BFUkYKIAlmcmVlX3BlcmNwdShuLT5wZik7CiAjZW5kaWYKQEAgLTEwNzksNyArMTA4Miw3IEBACiB9CiAKIHN0YXRpYyBpbnQgdTMyX2R1bXAoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBmaCwKLQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnQpCisJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNtc2cgKnQpCiB7CiAJc3RydWN0IHRjX3Vfa25vZGUgKm4gPSAoc3RydWN0IHRjX3Vfa25vZGUgKilmaDsKIAlzdHJ1Y3QgdGNfdV9obm9kZSAqaHRfdXAsICpodF9kb3duOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9hcGkuYyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKaW5kZXggMTJlYmRlOC4uMjA2ZGMyNCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9hcGkuYworKysgYi9uZXQvc2NoZWQvc2NoX2FwaS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaGFzaHRhYmxlLmg+CiAKICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CkBAIC0yNTksMzcgKzI2MCw0MCBAQAogewogCXN0cnVjdCBRZGlzYyAqcTsKIAorCWlmICghcWRpc2NfZGV2KHJvb3QpKQorCQlyZXR1cm4gKHJvb3QtPmhhbmRsZSA9PSBoYW5kbGUgPyByb290IDogTlVMTCk7CisKIAlpZiAoIShyb290LT5mbGFncyAmIFRDUV9GX0JVSUxUSU4pICYmCiAJICAgIHJvb3QtPmhhbmRsZSA9PSBoYW5kbGUpCiAJCXJldHVybiByb290OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocSwgJnJvb3QtPmxpc3QsIGxpc3QpIHsKKwloYXNoX2Zvcl9lYWNoX3Bvc3NpYmxlX3JjdShxZGlzY19kZXYocm9vdCktPnFkaXNjX2hhc2gsIHEsIGhhc2gsIGhhbmRsZSkgewogCQlpZiAocS0+aGFuZGxlID09IGhhbmRsZSkKIAkJCXJldHVybiBxOwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBxZGlzY19saXN0X2FkZChzdHJ1Y3QgUWRpc2MgKnEpCit2b2lkIHFkaXNjX2hhc2hfYWRkKHN0cnVjdCBRZGlzYyAqcSkKIHsKIAlpZiAoKHEtPnBhcmVudCAhPSBUQ19IX1JPT1QpICYmICEocS0+ZmxhZ3MgJiBUQ1FfRl9JTkdSRVNTKSkgewogCQlzdHJ1Y3QgUWRpc2MgKnJvb3QgPSBxZGlzY19kZXYocSktPnFkaXNjOwogCiAJCVdBUk5fT05fT05DRShyb290ID09ICZub29wX3FkaXNjKTsKIAkJQVNTRVJUX1JUTkwoKTsKLQkJbGlzdF9hZGRfdGFpbF9yY3UoJnEtPmxpc3QsICZyb290LT5saXN0KTsKKwkJaGFzaF9hZGRfcmN1KHFkaXNjX2RldihxKS0+cWRpc2NfaGFzaCwgJnEtPmhhc2gsIHEtPmhhbmRsZSk7CiAJfQogfQotRVhQT1JUX1NZTUJPTChxZGlzY19saXN0X2FkZCk7CitFWFBPUlRfU1lNQk9MKHFkaXNjX2hhc2hfYWRkKTsKIAotdm9pZCBxZGlzY19saXN0X2RlbChzdHJ1Y3QgUWRpc2MgKnEpCit2b2lkIHFkaXNjX2hhc2hfZGVsKHN0cnVjdCBRZGlzYyAqcSkKIHsKIAlpZiAoKHEtPnBhcmVudCAhPSBUQ19IX1JPT1QpICYmICEocS0+ZmxhZ3MgJiBUQ1FfRl9JTkdSRVNTKSkgewogCQlBU1NFUlRfUlROTCgpOwotCQlsaXN0X2RlbF9yY3UoJnEtPmxpc3QpOworCQloYXNoX2RlbF9yY3UoJnEtPmhhc2gpOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wocWRpc2NfbGlzdF9kZWwpOworRVhQT1JUX1NZTUJPTChxZGlzY19oYXNoX2RlbCk7CiAKIHN0cnVjdCBRZGlzYyAqcWRpc2NfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBoYW5kbGUpCiB7CkBAIC0zODUsNyArMzg5LDggQEAKIAogc3RhdGljIHN0cnVjdCBxZGlzY19yYXRlX3RhYmxlICpxZGlzY19ydGFiX2xpc3Q7CiAKLXN0cnVjdCBxZGlzY19yYXRlX3RhYmxlICpxZGlzY19nZXRfcnRhYihzdHJ1Y3QgdGNfcmF0ZXNwZWMgKnIsIHN0cnVjdCBubGF0dHIgKnRhYikKK3N0cnVjdCBxZGlzY19yYXRlX3RhYmxlICpxZGlzY19nZXRfcnRhYihzdHJ1Y3QgdGNfcmF0ZXNwZWMgKnIsCisJCQkJCXN0cnVjdCBubGF0dHIgKnRhYikKIHsKIAlzdHJ1Y3QgcWRpc2NfcmF0ZV90YWJsZSAqcnRhYjsKIApAQCAtNTM3LDcgKzU0Miw4IEBACiAJcmV0dXJuIC0xOwogfQogCi12b2lkIF9fcWRpc2NfY2FsY3VsYXRlX3BrdF9sZW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHFkaXNjX3NpemVfdGFibGUgKnN0YWIpCit2b2lkIF9fcWRpc2NfY2FsY3VsYXRlX3BrdF9sZW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcWRpc2Nfc2l6ZV90YWJsZSAqc3RhYikKIHsKIAlpbnQgcGt0X2xlbiwgc2xvdDsKIApAQCAtODg0LDEwICs4OTAsMTAgQEAKICAgIFBhcmFtZXRlcnMgYXJlIHBhc3NlZCB2aWEgb3B0LgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgUWRpc2MgKgotcWRpc2NfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRkZXZfcXVldWUgKmRldl9xdWV1ZSwKLQkgICAgIHN0cnVjdCBRZGlzYyAqcCwgdTMyIHBhcmVudCwgdTMyIGhhbmRsZSwKLQkgICAgIHN0cnVjdCBubGF0dHIgKip0Y2EsIGludCAqZXJycCkKK3N0YXRpYyBzdHJ1Y3QgUWRpc2MgKnFkaXNjX2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IG5ldGRldl9xdWV1ZSAqZGV2X3F1ZXVlLAorCQkJCSAgc3RydWN0IFFkaXNjICpwLCB1MzIgcGFyZW50LCB1MzIgaGFuZGxlLAorCQkJCSAgc3RydWN0IG5sYXR0ciAqKnRjYSwgaW50ICplcnJwKQogewogCWludCBlcnI7CiAJc3RydWN0IG5sYXR0ciAqa2luZCA9IHRjYVtUQ0FfS0lORF07CkBAIC05OTgsNyArMTAwNCw3IEBACiAJCQkJZ290byBlcnJfb3V0NDsKIAkJfQogCi0JCXFkaXNjX2xpc3RfYWRkKHNjaCk7CisJCXFkaXNjX2hhc2hfYWRkKHNjaCk7CiAKIAkJcmV0dXJuIHNjaDsKIAl9CkBAIC0xMDY5LDcgKzEwNzUsOCBAQAogCWludAkJCWRlcHRoOwogfTsKIAotc3RhdGljIGludCBjaGVja19sb29wX2ZuKHN0cnVjdCBRZGlzYyAqcSwgdW5zaWduZWQgbG9uZyBjbCwgc3RydWN0IHFkaXNjX3dhbGtlciAqdyk7CitzdGF0aWMgaW50IGNoZWNrX2xvb3BfZm4oc3RydWN0IFFkaXNjICpxLCB1bnNpZ25lZCBsb25nIGNsLAorCQkJIHN0cnVjdCBxZGlzY193YWxrZXIgKncpOwogCiBzdGF0aWMgaW50IGNoZWNrX2xvb3Aoc3RydWN0IFFkaXNjICpxLCBzdHJ1Y3QgUWRpc2MgKnAsIGludCBkZXB0aCkKIHsKQEAgLTE0MzEsMTAgKzE0MzgsMTEgQEAKIAogc3RhdGljIGludCB0Y19kdW1wX3FkaXNjX3Jvb3Qoc3RydWN0IFFkaXNjICpyb290LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAotCQkJICAgICAgaW50ICpxX2lkeF9wLCBpbnQgc19xX2lkeCkKKwkJCSAgICAgIGludCAqcV9pZHhfcCwgaW50IHNfcV9pZHgsIGJvb2wgcmVjdXIpCiB7CiAJaW50IHJldCA9IDAsIHFfaWR4ID0gKnFfaWR4X3A7CiAJc3RydWN0IFFkaXNjICpxOworCWludCBiOwogCiAJaWYgKCFyb290KQogCQlyZXR1cm4gMDsKQEAgLTE0NDUsMTggKzE0NTMsMzAgQEAKIAl9IGVsc2UgewogCQlpZiAoIXRjX3FkaXNjX2R1bXBfaWdub3JlKHEpICYmCiAJCSAgICB0Y19maWxsX3FkaXNjKHNrYiwgcSwgcS0+cGFyZW50LCBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKLQkJCQkgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIFJUTV9ORVdRRElTQykgPD0gMCkKKwkJCQkgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksCisJCQkJICBSVE1fTkVXUURJU0MpIDw9IDApCiAJCQlnb3RvIGRvbmU7CiAJCXFfaWR4Kys7CiAJfQotCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJnJvb3QtPmxpc3QsIGxpc3QpIHsKKworCS8qIElmIGR1bXBpbmcgc2luZ2xldG9ucywgdGhlcmUgaXMgbm8gcWRpc2NfZGV2KHJvb3QpIGFuZCB0aGUgc2luZ2xldG9uCisJICogaXRzZWxmIGhhcyBhbHJlYWR5IGJlZW4gZHVtcGVkLgorCSAqCisJICogSWYgd2UndmUgYWxyZWFkeSBkdW1wZWQgdGhlIHRvcC1sZXZlbCAoaW5ncmVzcykgcWRpc2MgYWJvdmUgYW5kIHRoZSBnbG9iYWwKKwkgKiBxZGlzYyBoYXNodGFibGUsIHdlIGRvbid0IHdhbnQgdG8gaGl0IGl0IGFnYWluCisJICovCisJaWYgKCFxZGlzY19kZXYocm9vdCkgfHwgIXJlY3VyKQorCQlnb3RvIG91dDsKKworCWhhc2hfZm9yX2VhY2gocWRpc2NfZGV2KHJvb3QpLT5xZGlzY19oYXNoLCBiLCBxLCBoYXNoKSB7CiAJCWlmIChxX2lkeCA8IHNfcV9pZHgpIHsKIAkJCXFfaWR4Kys7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoIXRjX3FkaXNjX2R1bXBfaWdub3JlKHEpICYmCiAJCSAgICB0Y19maWxsX3FkaXNjKHNrYiwgcSwgcS0+cGFyZW50LCBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKLQkJCQkgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIFJUTV9ORVdRRElTQykgPD0gMCkKKwkJCQkgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksCisJCQkJICBSVE1fTkVXUURJU0MpIDw9IDApCiAJCQlnb3RvIGRvbmU7CiAJCXFfaWR4Kys7CiAJfQpAQCAtMTQ5MCwxMyArMTUxMCwxNCBAQAogCQkJc19xX2lkeCA9IDA7CiAJCXFfaWR4ID0gMDsKIAotCQlpZiAodGNfZHVtcF9xZGlzY19yb290KGRldi0+cWRpc2MsIHNrYiwgY2IsICZxX2lkeCwgc19xX2lkeCkgPCAwKQorCQlpZiAodGNfZHVtcF9xZGlzY19yb290KGRldi0+cWRpc2MsIHNrYiwgY2IsICZxX2lkeCwgc19xX2lkeCwKKwkJCQkgICAgICAgdHJ1ZSkgPCAwKQogCQkJZ290byBkb25lOwogCiAJCWRldl9xdWV1ZSA9IGRldl9pbmdyZXNzX3F1ZXVlKGRldik7CiAJCWlmIChkZXZfcXVldWUgJiYKIAkJICAgIHRjX2R1bXBfcWRpc2Nfcm9vdChkZXZfcXVldWUtPnFkaXNjX3NsZWVwaW5nLCBza2IsIGNiLAotCQkJCSAgICAgICAmcV9pZHgsIHNfcV9pZHgpIDwgMCkKKwkJCQkgICAgICAgJnFfaWR4LCBzX3FfaWR4LCBmYWxzZSkgPCAwKQogCQkJZ290byBkb25lOwogCiBjb250OgpAQCAtMTYyNSw3ICsxNjQ2LDggQEAKIAkJCWlmIChjb3BzLT5kZWxldGUpCiAJCQkJZXJyID0gY29wcy0+ZGVsZXRlKHEsIGNsKTsKIAkJCWlmIChlcnIgPT0gMCkKLQkJCQl0Y2xhc3Nfbm90aWZ5KG5ldCwgc2tiLCBuLCBxLCBjbCwgUlRNX0RFTFRDTEFTUyk7CisJCQkJdGNsYXNzX25vdGlmeShuZXQsIHNrYiwgbiwgcSwgY2wsCisJCQkJCSAgICAgIFJUTV9ERUxUQ0xBU1MpOwogCQkJZ290byBvdXQ7CiAJCWNhc2UgUlRNX0dFVFRDTEFTUzoKIAkJCWVyciA9IHRjbGFzc19ub3RpZnkobmV0LCBza2IsIG4sIHEsIGNsLCBSVE1fTkVXVENMQVNTKTsKQEAgLTE3MjMsMTIgKzE3NDUsMTQgQEAKIAlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjawkqY2I7CiB9OwogCi1zdGF0aWMgaW50IHFkaXNjX2NsYXNzX2R1bXAoc3RydWN0IFFkaXNjICpxLCB1bnNpZ25lZCBsb25nIGNsLCBzdHJ1Y3QgcWRpc2Nfd2Fsa2VyICphcmcpCitzdGF0aWMgaW50IHFkaXNjX2NsYXNzX2R1bXAoc3RydWN0IFFkaXNjICpxLCB1bnNpZ25lZCBsb25nIGNsLAorCQkJICAgIHN0cnVjdCBxZGlzY193YWxrZXIgKmFyZykKIHsKIAlzdHJ1Y3QgcWRpc2NfZHVtcF9hcmdzICphID0gKHN0cnVjdCBxZGlzY19kdW1wX2FyZ3MgKilhcmc7CiAKIAlyZXR1cm4gdGNfZmlsbF90Y2xhc3MoYS0+c2tiLCBxLCBjbCwgTkVUTElOS19DQihhLT5jYi0+c2tiKS5wb3J0aWQsCi0JCQkgICAgICBhLT5jYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBSVE1fTkVXVENMQVNTKTsKKwkJCSAgICAgIGEtPmNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksCisJCQkgICAgICBSVE1fTkVXVENMQVNTKTsKIH0KIAogc3RhdGljIGludCB0Y19kdW1wX3RjbGFzc19xZGlzYyhzdHJ1Y3QgUWRpc2MgKnEsIHN0cnVjdCBza19idWZmICpza2IsCkBAIC0xNzY1LDYgKzE3ODksNyBAQAogCQkJICAgICAgIGludCAqdF9wLCBpbnQgc190KQogewogCXN0cnVjdCBRZGlzYyAqcTsKKwlpbnQgYjsKIAogCWlmICghcm9vdCkKIAkJcmV0dXJuIDA7CkBAIC0xNzcyLDcgKzE3OTcsMTAgQEAKIAlpZiAodGNfZHVtcF90Y2xhc3NfcWRpc2Mocm9vdCwgc2tiLCB0Y20sIGNiLCB0X3AsIHNfdCkgPCAwKQogCQlyZXR1cm4gLTE7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHEsICZyb290LT5saXN0LCBsaXN0KSB7CisJaWYgKCFxZGlzY19kZXYocm9vdCkpCisJCXJldHVybiAwOworCisJaGFzaF9mb3JfZWFjaChxZGlzY19kZXYocm9vdCktPnFkaXNjX2hhc2gsIGIsIHEsIGhhc2gpIHsKIAkJaWYgKHRjX2R1bXBfdGNsYXNzX3FkaXNjKHEsIHNrYiwgdGNtLCBjYiwgdF9wLCBzX3QpIDwgMCkKIAkJCXJldHVybiAtMTsKIAl9CkBAIC0xOTU3LDEwICsxOTg1LDEyIEBACiAKIAlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX05FV1FESVNDLCB0Y19tb2RpZnlfcWRpc2MsIE5VTEwsIE5VTEwpOwogCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fREVMUURJU0MsIHRjX2dldF9xZGlzYywgTlVMTCwgTlVMTCk7Ci0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRRRElTQywgdGNfZ2V0X3FkaXNjLCB0Y19kdW1wX3FkaXNjLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVFFESVNDLCB0Y19nZXRfcWRpc2MsIHRjX2R1bXBfcWRpc2MsCisJCSAgICAgIE5VTEwpOwogCXJ0bmxfcmVnaXN0ZXIoUEZfVU5TUEVDLCBSVE1fTkVXVENMQVNTLCB0Y19jdGxfdGNsYXNzLCBOVUxMLCBOVUxMKTsKIAlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0RFTFRDTEFTUywgdGNfY3RsX3RjbGFzcywgTlVMTCwgTlVMTCk7Ci0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVRUQ0xBU1MsIHRjX2N0bF90Y2xhc3MsIHRjX2R1bXBfdGNsYXNzLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX1VOU1BFQywgUlRNX0dFVFRDTEFTUywgdGNfY3RsX3RjbGFzcywgdGNfZHVtcF90Y2xhc3MsCisJCSAgICAgIE5VTEwpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2NvZGVsLmMgYi9uZXQvc2NoZWQvc2NoX2NvZGVsLmMKaW5kZXggNDAwMmRmMy4uNWJmYTc5ZSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9jb2RlbC5jCisrKyBiL25ldC9zY2hlZC9zY2hfY29kZWwuYwpAQCAtNjksNyArNjksNyBAQAogc3RhdGljIHN0cnVjdCBza19idWZmICpkZXF1ZXVlX2Z1bmMoc3RydWN0IGNvZGVsX3ZhcnMgKnZhcnMsIHZvaWQgKmN0eCkKIHsKIAlzdHJ1Y3QgUWRpc2MgKnNjaCA9IGN0eDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19za2JfZGVxdWV1ZSgmc2NoLT5xKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQoJnNjaC0+cSk7CiAKIAlpZiAoc2tiKQogCQlzY2gtPnFzdGF0cy5iYWNrbG9nIC09IHFkaXNjX3BrdF9sZW4oc2tiKTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogCiAJcWxlbiA9IHNjaC0+cS5xbGVuOwogCXdoaWxlIChzY2gtPnEucWxlbiA+IHNjaC0+bGltaXQpIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fc2tiX2RlcXVldWUoJnNjaC0+cSk7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBfX3FkaXNjX2RlcXVldWVfaGVhZCgmc2NoLT5xKTsKIAogCQlkcm9wcGVkICs9IHFkaXNjX3BrdF9sZW4oc2tiKTsKIAkJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfZmlmby5jIGIvbmV0L3NjaGVkL3NjaF9maWZvLmMKaW5kZXggYmFlZWQ2YS4uMWUzNzI0NyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9maWZvLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9maWZvLmMKQEAgLTMxLDcgKzMxLDcgQEAKIHN0YXRpYyBpbnQgcGZpZm9fZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCwKIAkJCSBzdHJ1Y3Qgc2tfYnVmZiAqKnRvX2ZyZWUpCiB7Ci0JaWYgKGxpa2VseShza2JfcXVldWVfbGVuKCZzY2gtPnEpIDwgc2NoLT5saW1pdCkpCisJaWYgKGxpa2VseShzY2gtPnEucWxlbiA8IHNjaC0+bGltaXQpKQogCQlyZXR1cm4gcWRpc2NfZW5xdWV1ZV90YWlsKHNrYiwgc2NoKTsKIAogCXJldHVybiBxZGlzY19kcm9wKHNrYiwgc2NoLCB0b19mcmVlKTsKQEAgLTQyLDcgKzQyLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgcHJldl9iYWNrbG9nOwogCi0JaWYgKGxpa2VseShza2JfcXVldWVfbGVuKCZzY2gtPnEpIDwgc2NoLT5saW1pdCkpCisJaWYgKGxpa2VseShzY2gtPnEucWxlbiA8IHNjaC0+bGltaXQpKQogCQlyZXR1cm4gcWRpc2NfZW5xdWV1ZV90YWlsKHNrYiwgc2NoKTsKIAogCXByZXZfYmFja2xvZyA9IHNjaC0+cXN0YXRzLmJhY2tsb2c7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2ZxLmMgYi9uZXQvc2NoZWQvc2NoX2ZxLmMKaW5kZXggZTU0NThiOS4uMThlNzUyNCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9mcS5jCisrKyBiL25ldC9zY2hlZC9zY2hfZnEuYwpAQCAtODYsNiArODYsNyBAQAogCiAJc3RydWN0IHJiX3Jvb3QJZGVsYXllZDsJLyogZm9yIHJhdGUgbGltaXRlZCBmbG93cyAqLwogCXU2NAkJdGltZV9uZXh0X2RlbGF5ZWRfZmxvdzsKKwl1bnNpZ25lZCBsb25nCXVudGhyb3R0bGVfbGF0ZW5jeV9uczsKIAogCXN0cnVjdCBmcV9mbG93CWludGVybmFsOwkvKiBmb3Igbm9uIGNsYXNzaWZpZWQgb3IgaGlnaCBwcmlvIHBhY2tldHMgKi8KIAl1MzIJCXF1YW50dW07CkBAIC05NCw2ICs5NSw3IEBACiAJdTMyCQlmbG93X21heF9yYXRlOwkvKiBvcHRpb25hbCBtYXggcmF0ZSBwZXIgZmxvdyAqLwogCXUzMgkJZmxvd19wbGltaXQ7CS8qIG1heCBwYWNrZXRzIHBlciBmbG93ICovCiAJdTMyCQlvcnBoYW5fbWFzazsJLyogbWFzayBmb3Igb3JwaGFuZWQgc2tiICovCisJdTMyCQlsb3dfcmF0ZV90aHJlc2hvbGQ7CiAJc3RydWN0IHJiX3Jvb3QJKmZxX3Jvb3Q7CiAJdTgJCXJhdGVfZW5hYmxlOwogCXU4CQlmcV90cmVlc19sb2c7CkBAIC00MDcsMTEgKzQwOSwxOSBAQAogCiBzdGF0aWMgdm9pZCBmcV9jaGVja190aHJvdHRsZWQoc3RydWN0IGZxX3NjaGVkX2RhdGEgKnEsIHU2NCBub3cpCiB7CisJdW5zaWduZWQgbG9uZyBzYW1wbGU7CiAJc3RydWN0IHJiX25vZGUgKnA7CiAKIAlpZiAocS0+dGltZV9uZXh0X2RlbGF5ZWRfZmxvdyA+IG5vdykKIAkJcmV0dXJuOwogCisJLyogVXBkYXRlIHVudGhyb3R0bGUgbGF0ZW5jeSBFV01BLgorCSAqIFRoaXMgaXMgY2hlYXAgYW5kIGNhbiBoZWxwIGRpYWdub3NpbmcgdGltZXIvbGF0ZW5jeSBwcm9ibGVtcy4KKwkgKi8KKwlzYW1wbGUgPSAodW5zaWduZWQgbG9uZykobm93IC0gcS0+dGltZV9uZXh0X2RlbGF5ZWRfZmxvdyk7CisJcS0+dW50aHJvdHRsZV9sYXRlbmN5X25zIC09IHEtPnVudGhyb3R0bGVfbGF0ZW5jeV9ucyA+PiAzOworCXEtPnVudGhyb3R0bGVfbGF0ZW5jeV9ucyArPSBzYW1wbGUgPj4gMzsKKwogCXEtPnRpbWVfbmV4dF9kZWxheWVkX2Zsb3cgPSB+MFVMTDsKIAl3aGlsZSAoKHAgPSByYl9maXJzdCgmcS0+ZGVsYXllZCkpICE9IE5VTEwpIHsKIAkJc3RydWN0IGZxX2Zsb3cgKmYgPSBjb250YWluZXJfb2YocCwgc3RydWN0IGZxX2Zsb3csIHJhdGVfbm9kZSk7CkBAIC00MzMsNyArNDQzLDcgQEAKIAlzdHJ1Y3QgZnFfZmxvd19oZWFkICpoZWFkOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGZxX2Zsb3cgKmY7Ci0JdTMyIHJhdGU7CisJdTMyIHJhdGUsIHBsZW47CiAKIAlza2IgPSBmcV9kZXF1ZXVlX2hlYWQoc2NoLCAmcS0+aW50ZXJuYWwpOwogCWlmIChza2IpCkBAIC00ODIsNyArNDkyLDcgQEAKIAlwcmVmZXRjaCgmc2tiLT5lbmQpOwogCWYtPmNyZWRpdCAtPSBxZGlzY19wa3RfbGVuKHNrYik7CiAKLQlpZiAoZi0+Y3JlZGl0ID4gMCB8fCAhcS0+cmF0ZV9lbmFibGUpCisJaWYgKCFxLT5yYXRlX2VuYWJsZSkKIAkJZ290byBvdXQ7CiAKIAkvKiBEbyBub3QgcGFjZSBsb2NhbGx5IGdlbmVyYXRlZCBhY2sgcGFja2V0cyAqLwpAQCAtNDkzLDggKzUwMywxNSBAQAogCWlmIChza2ItPnNrKQogCQlyYXRlID0gbWluKHNrYi0+c2stPnNrX3BhY2luZ19yYXRlLCByYXRlKTsKIAorCWlmIChyYXRlIDw9IHEtPmxvd19yYXRlX3RocmVzaG9sZCkgeworCQlmLT5jcmVkaXQgPSAwOworCQlwbGVuID0gcWRpc2NfcGt0X2xlbihza2IpOworCX0gZWxzZSB7CisJCXBsZW4gPSBtYXgocWRpc2NfcGt0X2xlbihza2IpLCBxLT5xdWFudHVtKTsKKwkJaWYgKGYtPmNyZWRpdCA+IDApCisJCQlnb3RvIG91dDsKKwl9CiAJaWYgKHJhdGUgIT0gfjBVKSB7Ci0JCXUzMiBwbGVuID0gbWF4KHFkaXNjX3BrdF9sZW4oc2tiKSwgcS0+cXVhbnR1bSk7CiAJCXU2NCBsZW4gPSAodTY0KXBsZW4gKiBOU0VDX1BFUl9TRUM7CiAKIAkJaWYgKGxpa2VseShyYXRlKSkKQEAgLTUwNyw3ICs1MjQsMTIgQEAKIAkJCWxlbiA9IE5TRUNfUEVSX1NFQzsKIAkJCXEtPnN0YXRfcGt0c190b29fbG9uZysrOwogCQl9Ci0KKwkJLyogQWNjb3VudCBmb3Igc2NoZWR1bGUvdGltZXJzIGRyaWZ0cy4KKwkJICogZi0+dGltZV9uZXh0X3BhY2tldCB3YXMgc2V0IHdoZW4gcHJpb3IgcGFja2V0IHdhcyBzZW50LAorCQkgKiBhbmQgY3VycmVudCB0aW1lIChAbm93KSBjYW4gYmUgdG9vIGxhdGUgYnkgdGVucyBvZiB1cy4KKwkJICovCisJCWlmIChmLT50aW1lX25leHRfcGFja2V0KQorCQkJbGVuIC09IG1pbihsZW4vMiwgbm93IC0gZi0+dGltZV9uZXh0X3BhY2tldCk7CiAJCWYtPnRpbWVfbmV4dF9wYWNrZXQgPSBub3cgKyBsZW47CiAJfQogb3V0OgpAQCAtNjYyLDYgKzY4NCw3IEBACiAJW1RDQV9GUV9GTE9XX01BWF9SQVRFXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtUQ0FfRlFfQlVDS0VUU19MT0ddCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW1RDQV9GUV9GTE9XX1JFRklMTF9ERUxBWV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtUQ0FfRlFfTE9XX1JBVEVfVEhSRVNIT0xEXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiB9OwogCiBzdGF0aWMgaW50IGZxX2NoYW5nZShzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IG5sYXR0ciAqb3B0KQpAQCAtNzE2LDYgKzczOSwxMCBAQAogCWlmICh0YltUQ0FfRlFfRkxPV19NQVhfUkFURV0pCiAJCXEtPmZsb3dfbWF4X3JhdGUgPSBubGFfZ2V0X3UzMih0YltUQ0FfRlFfRkxPV19NQVhfUkFURV0pOwogCisJaWYgKHRiW1RDQV9GUV9MT1dfUkFURV9USFJFU0hPTERdKQorCQlxLT5sb3dfcmF0ZV90aHJlc2hvbGQgPQorCQkJbmxhX2dldF91MzIodGJbVENBX0ZRX0xPV19SQVRFX1RIUkVTSE9MRF0pOworCiAJaWYgKHRiW1RDQV9GUV9SQVRFX0VOQUJMRV0pIHsKIAkJdTMyIGVuYWJsZSA9IG5sYV9nZXRfdTMyKHRiW1RDQV9GUV9SQVRFX0VOQUJMRV0pOwogCkBAIC03NzQsNiArODAxLDcgQEAKIAlxLT5pbml0aWFsX3F1YW50dW0JPSAxMCAqIHBzY2hlZF9tdHUocWRpc2NfZGV2KHNjaCkpOwogCXEtPmZsb3dfcmVmaWxsX2RlbGF5CT0gbXNlY3NfdG9famlmZmllcyg0MCk7CiAJcS0+Zmxvd19tYXhfcmF0ZQk9IH4wVTsKKwlxLT50aW1lX25leHRfZGVsYXllZF9mbG93ID0gfjBVTEw7CiAJcS0+cmF0ZV9lbmFibGUJCT0gMTsKIAlxLT5uZXdfZmxvd3MuZmlyc3QJPSBOVUxMOwogCXEtPm9sZF9mbG93cy5maXJzdAk9IE5VTEw7CkBAIC03ODEsNiArODA5LDcgQEAKIAlxLT5mcV9yb290CQk9IE5VTEw7CiAJcS0+ZnFfdHJlZXNfbG9nCQk9IGlsb2cyKDEwMjQpOwogCXEtPm9ycGhhbl9tYXNrCQk9IDEwMjQgLSAxOworCXEtPmxvd19yYXRlX3RocmVzaG9sZAk9IDU1MDAwMCAvIDg7CiAJcWRpc2Nfd2F0Y2hkb2dfaW5pdCgmcS0+d2F0Y2hkb2csIHNjaCk7CiAKIAlpZiAob3B0KQpAQCAtODExLDYgKzg0MCw4IEBACiAJICAgIG5sYV9wdXRfdTMyKHNrYiwgVENBX0ZRX0ZMT1dfUkVGSUxMX0RFTEFZLAogCQkJamlmZmllc190b191c2VjcyhxLT5mbG93X3JlZmlsbF9kZWxheSkpIHx8CiAJICAgIG5sYV9wdXRfdTMyKHNrYiwgVENBX0ZRX09SUEhBTl9NQVNLLCBxLT5vcnBoYW5fbWFzaykgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBUQ0FfRlFfTE9XX1JBVEVfVEhSRVNIT0xELAorCQkJcS0+bG93X3JhdGVfdGhyZXNob2xkKSB8fAogCSAgICBubGFfcHV0X3UzMihza2IsIFRDQV9GUV9CVUNLRVRTX0xPRywgcS0+ZnFfdHJlZXNfbG9nKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKQEAgLTgyMywyMCArODU0LDI0IEBACiBzdGF0aWMgaW50IGZxX2R1bXBfc3RhdHMoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBnbmV0X2R1bXAgKmQpCiB7CiAJc3RydWN0IGZxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7Ci0JdTY0IG5vdyA9IGt0aW1lX2dldF9ucygpOwotCXN0cnVjdCB0Y19mcV9xZF9zdGF0cyBzdCA9IHsKLQkJLmdjX2Zsb3dzCQk9IHEtPnN0YXRfZ2NfZmxvd3MsCi0JCS5oaWdocHJpb19wYWNrZXRzCT0gcS0+c3RhdF9pbnRlcm5hbF9wYWNrZXRzLAotCQkudGNwX3JldHJhbnMJCT0gcS0+c3RhdF90Y3BfcmV0cmFucywKLQkJLnRocm90dGxlZAkJPSBxLT5zdGF0X3Rocm90dGxlZCwKLQkJLmZsb3dzX3BsaW1pdAkJPSBxLT5zdGF0X2Zsb3dzX3BsaW1pdCwKLQkJLnBrdHNfdG9vX2xvbmcJCT0gcS0+c3RhdF9wa3RzX3Rvb19sb25nLAotCQkuYWxsb2NhdGlvbl9lcnJvcnMJPSBxLT5zdGF0X2FsbG9jYXRpb25fZXJyb3JzLAotCQkuZmxvd3MJCQk9IHEtPmZsb3dzLAotCQkuaW5hY3RpdmVfZmxvd3MJCT0gcS0+aW5hY3RpdmVfZmxvd3MsCi0JCS50aHJvdHRsZWRfZmxvd3MJPSBxLT50aHJvdHRsZWRfZmxvd3MsCi0JCS50aW1lX25leHRfZGVsYXllZF9mbG93CT0gcS0+dGltZV9uZXh0X2RlbGF5ZWRfZmxvdyAtIG5vdywKLQl9OworCXN0cnVjdCB0Y19mcV9xZF9zdGF0cyBzdDsKKworCXNjaF90cmVlX2xvY2soc2NoKTsKKworCXN0LmdjX2Zsb3dzCQkgID0gcS0+c3RhdF9nY19mbG93czsKKwlzdC5oaWdocHJpb19wYWNrZXRzCSAgPSBxLT5zdGF0X2ludGVybmFsX3BhY2tldHM7CisJc3QudGNwX3JldHJhbnMJCSAgPSBxLT5zdGF0X3RjcF9yZXRyYW5zOworCXN0LnRocm90dGxlZAkJICA9IHEtPnN0YXRfdGhyb3R0bGVkOworCXN0LmZsb3dzX3BsaW1pdAkJICA9IHEtPnN0YXRfZmxvd3NfcGxpbWl0OworCXN0LnBrdHNfdG9vX2xvbmcJICA9IHEtPnN0YXRfcGt0c190b29fbG9uZzsKKwlzdC5hbGxvY2F0aW9uX2Vycm9ycwkgID0gcS0+c3RhdF9hbGxvY2F0aW9uX2Vycm9yczsKKwlzdC50aW1lX25leHRfZGVsYXllZF9mbG93ID0gcS0+dGltZV9uZXh0X2RlbGF5ZWRfZmxvdyAtIGt0aW1lX2dldF9ucygpOworCXN0LmZsb3dzCQkgID0gcS0+Zmxvd3M7CisJc3QuaW5hY3RpdmVfZmxvd3MJICA9IHEtPmluYWN0aXZlX2Zsb3dzOworCXN0LnRocm90dGxlZF9mbG93cwkgID0gcS0+dGhyb3R0bGVkX2Zsb3dzOworCXN0LnVudGhyb3R0bGVfbGF0ZW5jeV9ucyAgPSBtaW5fdCh1bnNpZ25lZCBsb25nLAorCQkJCQkgIHEtPnVudGhyb3R0bGVfbGF0ZW5jeV9ucywgfjBVKTsKKwlzY2hfdHJlZV91bmxvY2soc2NoKTsKIAogCXJldHVybiBnbmV0X3N0YXRzX2NvcHlfYXBwKGQsICZzdCwgc2l6ZW9mKHN0KSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCmluZGV4IGU5NWI2N2MuLjZjZmI2ZTkgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCisrKyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCkBAIC00MjMsNyArNDIzLDYgQEAKIAkuZGVxdWV1ZQk9CW5vb3BfZGVxdWV1ZSwKIAkuZmxhZ3MJCT0JVENRX0ZfQlVJTFRJTiwKIAkub3BzCQk9CSZub29wX3FkaXNjX29wcywKLQkubGlzdAkJPQlMSVNUX0hFQURfSU5JVChub29wX3FkaXNjLmxpc3QpLAogCS5xLmxvY2sJCT0JX19TUElOX0xPQ0tfVU5MT0NLRUQobm9vcF9xZGlzYy5xLmxvY2spLAogCS5kZXZfcXVldWUJPQkmbm9vcF9uZXRkZXZfcXVldWUsCiAJLnJ1bm5pbmcJPQlTRVFDTlRfWkVSTyhub29wX3FkaXNjLnJ1bm5pbmcpLApAQCAtNDY3LDcgKzQ2Niw3IEBACiAgKi8KIHN0cnVjdCBwZmlmb19mYXN0X3ByaXYgewogCXUzMiBiaXRtYXA7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBxW1BGSUZPX0ZBU1RfQkFORFNdOworCXN0cnVjdCBxZGlzY19za2JfaGVhZCBxW1BGSUZPX0ZBU1RfQkFORFNdOwogfTsKIAogLyoKQEAgLTQ3OCw3ICs0NzcsNyBAQAogICovCiBzdGF0aWMgY29uc3QgaW50IGJpdG1hcDJiYW5kW10gPSB7LTEsIDAsIDEsIDAsIDIsIDAsIDEsIDB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmX2hlYWQgKmJhbmQybGlzdChzdHJ1Y3QgcGZpZm9fZmFzdF9wcml2ICpwcml2LAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKmJhbmQybGlzdChzdHJ1Y3QgcGZpZm9fZmFzdF9wcml2ICpwcml2LAogCQkJCQkgICAgIGludCBiYW5kKQogewogCXJldHVybiBwcml2LT5xICsgYmFuZDsKQEAgLTQ4NywxMCArNDg2LDEwIEBACiBzdGF0aWMgaW50IHBmaWZvX2Zhc3RfZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnFkaXNjLAogCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKip0b19mcmVlKQogewotCWlmIChza2JfcXVldWVfbGVuKCZxZGlzYy0+cSkgPCBxZGlzY19kZXYocWRpc2MpLT50eF9xdWV1ZV9sZW4pIHsKKwlpZiAocWRpc2MtPnEucWxlbiA8IHFkaXNjX2RldihxZGlzYyktPnR4X3F1ZXVlX2xlbikgewogCQlpbnQgYmFuZCA9IHByaW8yYmFuZFtza2ItPnByaW9yaXR5ICYgVENfUFJJT19NQVhdOwogCQlzdHJ1Y3QgcGZpZm9fZmFzdF9wcml2ICpwcml2ID0gcWRpc2NfcHJpdihxZGlzYyk7Ci0JCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QgPSBiYW5kMmxpc3QocHJpdiwgYmFuZCk7CisJCXN0cnVjdCBxZGlzY19za2JfaGVhZCAqbGlzdCA9IGJhbmQybGlzdChwcml2LCBiYW5kKTsKIAogCQlwcml2LT5iaXRtYXAgfD0gKDEgPDwgYmFuZCk7CiAJCXFkaXNjLT5xLnFsZW4rKzsKQEAgLTUwNiwxMSArNTA1LDE2IEBACiAJaW50IGJhbmQgPSBiaXRtYXAyYmFuZFtwcml2LT5iaXRtYXBdOwogCiAJaWYgKGxpa2VseShiYW5kID49IDApKSB7Ci0JCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QgPSBiYW5kMmxpc3QocHJpdiwgYmFuZCk7Ci0JCXN0cnVjdCBza19idWZmICpza2IgPSBfX3FkaXNjX2RlcXVldWVfaGVhZChxZGlzYywgbGlzdCk7CisJCXN0cnVjdCBxZGlzY19za2JfaGVhZCAqcWggPSBiYW5kMmxpc3QocHJpdiwgYmFuZCk7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBfX3FkaXNjX2RlcXVldWVfaGVhZChxaCk7CisKKwkJaWYgKGxpa2VseShza2IgIT0gTlVMTCkpIHsKKwkJCXFkaXNjX3FzdGF0c19iYWNrbG9nX2RlYyhxZGlzYywgc2tiKTsKKwkJCXFkaXNjX2JzdGF0c191cGRhdGUocWRpc2MsIHNrYik7CisJCX0KIAogCQlxZGlzYy0+cS5xbGVuLS07Ci0JCWlmIChza2JfcXVldWVfZW1wdHkobGlzdCkpCisJCWlmIChxaC0+cWxlbiA9PSAwKQogCQkJcHJpdi0+Yml0bWFwICY9IH4oMSA8PCBiYW5kKTsKIAogCQlyZXR1cm4gc2tiOwpAQCAtNTI1LDkgKzUyOSw5IEBACiAJaW50IGJhbmQgPSBiaXRtYXAyYmFuZFtwcml2LT5iaXRtYXBdOwogCiAJaWYgKGJhbmQgPj0gMCkgewotCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gYmFuZDJsaXN0KHByaXYsIGJhbmQpOworCQlzdHJ1Y3QgcWRpc2Nfc2tiX2hlYWQgKnFoID0gYmFuZDJsaXN0KHByaXYsIGJhbmQpOwogCi0JCXJldHVybiBza2JfcGVlayhsaXN0KTsKKwkJcmV0dXJuIHFoLT5oZWFkOwogCX0KIAogCXJldHVybiBOVUxMOwpAQCAtNTY1LDcgKzU2OSw3IEBACiAJc3RydWN0IHBmaWZvX2Zhc3RfcHJpdiAqcHJpdiA9IHFkaXNjX3ByaXYocWRpc2MpOwogCiAJZm9yIChwcmlvID0gMDsgcHJpbyA8IFBGSUZPX0ZBU1RfQkFORFM7IHByaW8rKykKLQkJX19za2JfcXVldWVfaGVhZF9pbml0KGJhbmQybGlzdChwcml2LCBwcmlvKSk7CisJCXFkaXNjX3NrYl9oZWFkX2luaXQoYmFuZDJsaXN0KHByaXYsIHByaW8pKTsKIAogCS8qIENhbiBieS1wYXNzIHRoZSBxdWV1ZSBkaXNjaXBsaW5lICovCiAJcWRpc2MtPmZsYWdzIHw9IFRDUV9GX0NBTl9CWVBBU1M7CkBAIC02MTMsOCArNjE3LDggQEAKIAkJc2NoID0gKHN0cnVjdCBRZGlzYyAqKSBRRElTQ19BTElHTigodW5zaWduZWQgbG9uZykgcCk7CiAJCXNjaC0+cGFkZGVkID0gKGNoYXIgKikgc2NoIC0gKGNoYXIgKikgcDsKIAl9Ci0JSU5JVF9MSVNUX0hFQUQoJnNjaC0+bGlzdCk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2NoLT5xKTsKKwlxZGlzY19za2JfaGVhZF9pbml0KCZzY2gtPnEpOworCXNwaW5fbG9ja19pbml0KCZzY2gtPnEubG9jayk7CiAKIAlzcGluX2xvY2tfaW5pdCgmc2NoLT5idXN5bG9jayk7CiAJbG9ja2RlcF9zZXRfY2xhc3MoJnNjaC0+YnVzeWxvY2ssCkBAIC02NDMsMTggKzY0NywxOSBAQAogCXN0cnVjdCBRZGlzYyAqc2NoOwogCiAJaWYgKCF0cnlfbW9kdWxlX2dldChvcHMtPm93bmVyKSkKLQkJZ290byBlcnJvdXQ7CisJCXJldHVybiBOVUxMOwogCiAJc2NoID0gcWRpc2NfYWxsb2MoZGV2X3F1ZXVlLCBvcHMpOwotCWlmIChJU19FUlIoc2NoKSkKLQkJZ290byBlcnJvdXQ7CisJaWYgKElTX0VSUihzY2gpKSB7CisJCW1vZHVsZV9wdXQob3BzLT5vd25lcik7CisJCXJldHVybiBOVUxMOworCX0KIAlzY2gtPnBhcmVudCA9IHBhcmVudGlkOwogCiAJaWYgKCFvcHMtPmluaXQgfHwgb3BzLT5pbml0KHNjaCwgTlVMTCkgPT0gMCkKIAkJcmV0dXJuIHNjaDsKIAogCXFkaXNjX2Rlc3Ryb3koc2NoKTsKLWVycm91dDoKIAlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0wocWRpc2NfY3JlYXRlX2RmbHQpOwpAQCAtNzAwLDcgKzcwNSw3IEBACiAJCXJldHVybjsKIAogI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKLQlxZGlzY19saXN0X2RlbChxZGlzYyk7CisJcWRpc2NfaGFzaF9kZWwocWRpc2MpOwogCiAJcWRpc2NfcHV0X3N0YWIocnRubF9kZXJlZmVyZW5jZShxZGlzYy0+c3RhYikpOwogI2VuZGlmCkBAIC03ODgsNiArNzkzLDEwIEBACiAJCQlxZGlzYy0+b3BzLT5hdHRhY2gocWRpc2MpOwogCQl9CiAJfQorI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKKwlpZiAoZGV2LT5xZGlzYykKKwkJcWRpc2NfaGFzaF9hZGQoZGV2LT5xZGlzYyk7CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgdHJhbnNpdGlvbl9vbmVfcWRpc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfaGZzYy5jIGIvbmV0L3NjaGVkL3NjaF9oZnNjLmMKaW5kZXggM2RkYzdiZC4uMDAwZjFkMyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9oZnNjLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9oZnNjLmMKQEAgLTE0Miw4ICsxNDIsNiBAQAogCQkJCQkgICBsaW5rLXNoYXJpbmcsIG1heChteWYsIGNmbWluKSAqLwogCXU2NAljbF9teWY7CQkJLyogbXkgZml0LXRpbWUgKGNhbGN1bGF0ZWQgZnJvbSB0aGlzCiAJCQkJCSAgIGNsYXNzJ3Mgb3duIHVwcGVybGltaXQgY3VydmUpICovCi0JdTY0CWNsX215ZmFkajsJCS8qIG15IGZpdC10aW1lIGFkanVzdG1lbnQgKHRvIGNhbmNlbAotCQkJCQkgICBoaXN0b3J5IGRlcGVuZGVuY2UpICovCiAJdTY0CWNsX2NmbWluOwkJLyogZWFybGllc3QgY2hpbGRyZW4ncyBmaXQtdGltZSAodXNlZAogCQkJCQkgICB3aXRoIGNsX215ZiB0byBvYnRhaW4gY2xfZikgKi8KIAl1NjQJY2xfY3Z0bWluOwkJLyogbWluaW1hbCB2aXJ0dWFsIHRpbWUgYW1vbmcgdGhlCkBAIC0xNTEsMTEgKzE0OSw4IEBACiAJCQkJCSAgIChtb25vdG9uaWMgd2l0aGluIGEgcGVyaW9kKSAqLwogCXU2NAljbF92dGFkajsJCS8qIGludHJhLXBlcmlvZCBjdW11bGF0aXZlIHZ0CiAJCQkJCSAgIGFkanVzdG1lbnQgKi8KLQl1NjQJY2xfdnRvZmY7CQkvKiBpbnRlci1wZXJpb2QgY3VtdWxhdGl2ZSB2dCBvZmZzZXQgKi8KLQl1NjQJY2xfY3Z0bWF4OwkJLyogbWF4IGNoaWxkJ3MgdnQgaW4gdGhlIGxhc3QgcGVyaW9kICovCi0JdTY0CWNsX2N2dG9mZjsJCS8qIGN1bXVsYXRpdmUgY3Z0bWF4IG9mIGFsbCBwZXJpb2RzICovCi0JdTY0CWNsX3BjdnRvZmY7CQkvKiBwYXJlbnQncyBjdnRvZmYgYXQgaW5pdGlhbGl6YXRpb24KLQkJCQkJICAgdGltZSAqLworCXU2NAljbF9jdnRvZmY7CQkvKiBsYXJnZXN0IHZpcnR1YWwgdGltZSBzZWVuIGFtb25nCisJCQkJCSAgIHRoZSBjaGlsZHJlbiAqLwogCiAJc3RydWN0IGludGVybmFsX3NjIGNsX3JzYzsJLyogaW50ZXJuYWwgcmVhbC10aW1lIHNlcnZpY2UgY3VydmUgKi8KIAlzdHJ1Y3QgaW50ZXJuYWxfc2MgY2xfZnNjOwkvKiBpbnRlcm5hbCBmYWlyIHNlcnZpY2UgY3VydmUgKi8KQEAgLTcwMSwyOCArNjk2LDE2IEBACiAJCQl9IGVsc2UgewogCQkJCS8qCiAJCQkJICogZmlyc3QgY2hpbGQgZm9yIGEgbmV3IHBhcmVudCBiYWNrbG9nIHBlcmlvZC4KLQkJCQkgKiBhZGQgcGFyZW50J3MgY3Z0bWF4IHRvIGN2dG9mZiB0byBtYWtlIGEgbmV3Ci0JCQkJICogdnQgKHZ0b2ZmICsgdnQpIGxhcmdlciB0aGFuIHRoZSB2dCBpbiB0aGUKLQkJCQkgKiBsYXN0IHBlcmlvZCBmb3IgYWxsIGNoaWxkcmVuLgorCQkJCSAqIGluaXRpYWxpemUgY2xfdnQgdG8gdGhlIGhpZ2hlc3QgdmFsdWUgc2VlbgorCQkJCSAqIGFtb25nIHRoZSBzaWJsaW5ncy4gdGhpcyBpcyBhbmFsb2dvdXMgdG8KKwkJCQkgKiB3aGF0IGN1cl90aW1lIHdvdWxkIHByb3ZpZGUgaW4gcmVhbHRpbWUgY2FzZS4KIAkJCQkgKi8KLQkJCQl2dCA9IGNsLT5jbF9wYXJlbnQtPmNsX2N2dG1heDsKLQkJCQljbC0+Y2xfcGFyZW50LT5jbF9jdnRvZmYgKz0gdnQ7Ci0JCQkJY2wtPmNsX3BhcmVudC0+Y2xfY3Z0bWF4ID0gMDsKKwkJCQljbC0+Y2xfdnQgPSBjbC0+Y2xfcGFyZW50LT5jbF9jdnRvZmY7CiAJCQkJY2wtPmNsX3BhcmVudC0+Y2xfY3Z0bWluID0gMDsKLQkJCQljbC0+Y2xfdnQgPSAwOwogCQkJfQogCi0JCQljbC0+Y2xfdnRvZmYgPSBjbC0+Y2xfcGFyZW50LT5jbF9jdnRvZmYgLQotCQkJCQkJCWNsLT5jbF9wY3Z0b2ZmOwotCiAJCQkvKiB1cGRhdGUgdGhlIHZpcnR1YWwgY3VydmUgKi8KLQkJCXZ0ID0gY2wtPmNsX3Z0ICsgY2wtPmNsX3Z0b2ZmOwotCQkJcnRzY19taW4oJmNsLT5jbF92aXJ0dWFsLCAmY2wtPmNsX2ZzYywgdnQsCi0JCQkJCQkgICAgICBjbC0+Y2xfdG90YWwpOwotCQkJaWYgKGNsLT5jbF92aXJ0dWFsLnggPT0gdnQpIHsKLQkJCQljbC0+Y2xfdmlydHVhbC54IC09IGNsLT5jbF92dG9mZjsKLQkJCQljbC0+Y2xfdnRvZmYgPSAwOwotCQkJfQorCQkJcnRzY19taW4oJmNsLT5jbF92aXJ0dWFsLCAmY2wtPmNsX2ZzYywgY2wtPmNsX3Z0LCBjbC0+Y2xfdG90YWwpOwogCQkJY2wtPmNsX3Z0YWRqID0gMDsKIAogCQkJY2wtPmNsX3Z0cGVyaW9kKys7ICAvKiBpbmNyZW1lbnQgdnQgcGVyaW9kICovCkBAIC03NDUsNyArNzI4LDYgQEAKIAkJCQkvKiBjb21wdXRlIG15ZiAqLwogCQkJCWNsLT5jbF9teWYgPSBydHNjX3kyeCgmY2wtPmNsX3VsaW1pdCwKIAkJCQkJCSAgICAgIGNsLT5jbF90b3RhbCk7Ci0JCQkJY2wtPmNsX215ZmFkaiA9IDA7CiAJCQl9CiAJCX0KIApAQCAtNzc5LDggKzc2MSw3IEBACiAJCQlnb19wYXNzaXZlID0gMDsKIAogCQkvKiB1cGRhdGUgdnQgKi8KLQkJY2wtPmNsX3Z0ID0gcnRzY195MngoJmNsLT5jbF92aXJ0dWFsLCBjbC0+Y2xfdG90YWwpCi0JCQkgICAgLSBjbC0+Y2xfdnRvZmYgKyBjbC0+Y2xfdnRhZGo7CisJCWNsLT5jbF92dCA9IHJ0c2NfeTJ4KCZjbC0+Y2xfdmlydHVhbCwgY2wtPmNsX3RvdGFsKSArIGNsLT5jbF92dGFkajsKIAogCQkvKgogCQkgKiBpZiB2dCBvZiB0aGUgY2xhc3MgaXMgc21hbGxlciB0aGFuIGN2dG1pbiwKQEAgLTc5NSw5ICs3NzYsOSBAQAogCQlpZiAoZ29fcGFzc2l2ZSkgewogCQkJLyogbm8gbW9yZSBhY3RpdmUgY2hpbGQsIGdvaW5nIHBhc3NpdmUgKi8KIAotCQkJLyogdXBkYXRlIGN2dG1heCBvZiB0aGUgcGFyZW50IGNsYXNzICovCi0JCQlpZiAoY2wtPmNsX3Z0ID4gY2wtPmNsX3BhcmVudC0+Y2xfY3Z0bWF4KQotCQkJCWNsLT5jbF9wYXJlbnQtPmNsX2N2dG1heCA9IGNsLT5jbF92dDsKKwkJCS8qIHVwZGF0ZSBjdnRvZmYgb2YgdGhlIHBhcmVudCBjbGFzcyAqLworCQkJaWYgKGNsLT5jbF92dCA+IGNsLT5jbF9wYXJlbnQtPmNsX2N2dG9mZikKKwkJCQljbC0+Y2xfcGFyZW50LT5jbF9jdnRvZmYgPSBjbC0+Y2xfdnQ7CiAKIAkJCS8qIHJlbW92ZSB0aGlzIGNsYXNzIGZyb20gdGhlIHZ0IHRyZWUgKi8KIAkJCXZ0dHJlZV9yZW1vdmUoY2wpOwpAQCAtODEzLDkgKzc5NCwxMCBAQAogCiAJCS8qIHVwZGF0ZSBmICovCiAJCWlmIChjbC0+Y2xfZmxhZ3MgJiBIRlNDX1VTQykgeworCQkJY2wtPmNsX215ZiA9IHJ0c2NfeTJ4KCZjbC0+Y2xfdWxpbWl0LCBjbC0+Y2xfdG90YWwpOworI2lmIDAKIAkJCWNsLT5jbF9teWYgPSBjbC0+Y2xfbXlmYWRqICsgcnRzY195MngoJmNsLT5jbF91bGltaXQsCiAJCQkJCQkJICAgICAgY2wtPmNsX3RvdGFsKTsKLSNpZiAwCiAJCQkvKgogCQkJICogVGhpcyBjb2RlIGNhdXNlcyBjbGFzc2VzIHRvIHN0YXkgd2F5IHVuZGVyIHRoZWlyCiAJCQkgKiBsaW1pdCB3aGVuIG11bHRpcGxlIGNsYXNzZXMgYXJlIHVzZWQgYXQgZ2lnYWJpdApAQCAtOTQwLDcgKzkyMiw3IEBACiBoZnNjX2NoYW5nZV9mc2Moc3RydWN0IGhmc2NfY2xhc3MgKmNsLCBzdHJ1Y3QgdGNfc2VydmljZV9jdXJ2ZSAqZnNjKQogewogCXNjMmlzYyhmc2MsICZjbC0+Y2xfZnNjKTsKLQlydHNjX2luaXQoJmNsLT5jbF92aXJ0dWFsLCAmY2wtPmNsX2ZzYywgY2wtPmNsX3Z0b2ZmICsgY2wtPmNsX3Z0LCBjbC0+Y2xfdG90YWwpOworCXJ0c2NfaW5pdCgmY2wtPmNsX3ZpcnR1YWwsICZjbC0+Y2xfZnNjLCBjbC0+Y2xfdnQsIGNsLT5jbF90b3RhbCk7CiAJY2wtPmNsX2ZsYWdzIHw9IEhGU0NfRlNDOwogfQogCkBAIC0xMDk0LDcgKzEwNzYsNiBAQAogCWlmIChwYXJlbnQtPmxldmVsID09IDApCiAJCWhmc2NfcHVyZ2VfcXVldWUoc2NoLCBwYXJlbnQpOwogCWhmc2NfYWRqdXN0X2xldmVscyhwYXJlbnQpOwotCWNsLT5jbF9wY3Z0b2ZmID0gcGFyZW50LT5jbF9jdnRvZmY7CiAJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAKIAlxZGlzY19jbGFzc19oYXNoX2dyb3coc2NoLCAmcS0+Y2xoYXNoKTsKQEAgLTE0ODIsMTYgKzE0NjMsMTIgQEAKIAljbC0+Y2xfZSAgICAgICAgICAgID0gMDsKIAljbC0+Y2xfdnQgICAgICAgICAgID0gMDsKIAljbC0+Y2xfdnRhZGogICAgICAgID0gMDsKLQljbC0+Y2xfdnRvZmYgICAgICAgID0gMDsKIAljbC0+Y2xfY3Z0bWluICAgICAgID0gMDsKLQljbC0+Y2xfY3Z0bWF4ICAgICAgID0gMDsKIAljbC0+Y2xfY3Z0b2ZmICAgICAgID0gMDsKLQljbC0+Y2xfcGN2dG9mZiAgICAgID0gMDsKIAljbC0+Y2xfdnRwZXJpb2QgICAgID0gMDsKIAljbC0+Y2xfcGFyZW50cGVyaW9kID0gMDsKIAljbC0+Y2xfZiAgICAgICAgICAgID0gMDsKIAljbC0+Y2xfbXlmICAgICAgICAgID0gMDsKLQljbC0+Y2xfbXlmYWRqICAgICAgID0gMDsKIAljbC0+Y2xfY2ZtaW4gICAgICAgID0gMDsKIAljbC0+Y2xfbmFjdGl2ZSAgICAgID0gMDsKIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9odGIuYyBiL25ldC9zY2hlZC9zY2hfaHRiLmMKaW5kZXggNTNkYmZhMS4uYzc5OGQwZCAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9odGIuYworKysgYi9uZXQvc2NoZWQvc2NoX2h0Yi5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKIAogCS8qIG5vbiBzaGFwZWQgc2ticzsgbGV0IHRoZW0gZ28gZGlyZWN0bHkgdGhydSAqLwotCXN0cnVjdCBza19idWZmX2hlYWQJZGlyZWN0X3F1ZXVlOworCXN0cnVjdCBxZGlzY19za2JfaGVhZAlkaXJlY3RfcXVldWU7CiAJbG9uZwkJCWRpcmVjdF9wa3RzOwogCiAJc3RydWN0IHFkaXNjX3dhdGNoZG9nCXdhdGNoZG9nOwpAQCAtNTcwLDYgKzU3MCwyMiBAQAogCWxpc3RfZGVsX2luaXQoJmNsLT51bi5sZWFmLmRyb3BfbGlzdCk7CiB9CiAKK3N0YXRpYyB2b2lkIGh0Yl9lbnF1ZXVlX3RhaWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IFFkaXNjICpzY2gsCisJCQkgICAgIHN0cnVjdCBxZGlzY19za2JfaGVhZCAqcWgpCit7CisJc3RydWN0IHNrX2J1ZmYgKmxhc3QgPSBxaC0+dGFpbDsKKworCWlmIChsYXN0KSB7CisJCXNrYi0+bmV4dCA9IE5VTEw7CisJCWxhc3QtPm5leHQgPSBza2I7CisJCXFoLT50YWlsID0gc2tiOworCX0gZWxzZSB7CisJCXFoLT50YWlsID0gc2tiOworCQlxaC0+aGVhZCA9IHNrYjsKKwl9CisJcWgtPnFsZW4rKzsKK30KKwogc3RhdGljIGludCBodGJfZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCwKIAkJICAgICAgIHN0cnVjdCBza19idWZmICoqdG9fZnJlZSkKIHsKQEAgLTU4MCw3ICs1OTYsNyBAQAogCWlmIChjbCA9PSBIVEJfRElSRUNUKSB7CiAJCS8qIGVucXVldWUgdG8gaGVscGVyIHF1ZXVlICovCiAJCWlmIChxLT5kaXJlY3RfcXVldWUucWxlbiA8IHEtPmRpcmVjdF9xbGVuKSB7Ci0JCQlfX3NrYl9xdWV1ZV90YWlsKCZxLT5kaXJlY3RfcXVldWUsIHNrYik7CisJCQlodGJfZW5xdWV1ZV90YWlsKHNrYiwgc2NoLCAmcS0+ZGlyZWN0X3F1ZXVlKTsKIAkJCXEtPmRpcmVjdF9wa3RzKys7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gcWRpc2NfZHJvcChza2IsIHNjaCwgdG9fZnJlZSk7CkBAIC04ODgsNyArOTA0LDcgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X2F0OwogCiAJLyogdHJ5IHRvIGRlcXVldWUgZGlyZWN0IHBhY2tldHMgYXMgaGlnaCBwcmlvICghKSB0byBtaW5pbWl6ZSBjcHUgd29yayAqLwotCXNrYiA9IF9fc2tiX2RlcXVldWUoJnEtPmRpcmVjdF9xdWV1ZSk7CisJc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQoJnEtPmRpcmVjdF9xdWV1ZSk7CiAJaWYgKHNrYiAhPSBOVUxMKSB7CiBvazoKIAkJcWRpc2NfYnN0YXRzX3VwZGF0ZShzY2gsIHNrYik7CkBAIC0xMDE5LDcgKzEwMzUsNyBAQAogCiAJcWRpc2Nfd2F0Y2hkb2dfaW5pdCgmcS0+d2F0Y2hkb2csIHNjaCk7CiAJSU5JVF9XT1JLKCZxLT53b3JrLCBodGJfd29ya19mdW5jKTsKLQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnEtPmRpcmVjdF9xdWV1ZSk7CisJcWRpc2Nfc2tiX2hlYWRfaW5pdCgmcS0+ZGlyZWN0X3F1ZXVlKTsKIAogCWlmICh0YltUQ0FfSFRCX0RJUkVDVF9RTEVOXSkKIAkJcS0+ZGlyZWN0X3FsZW4gPSBubGFfZ2V0X3UzMih0YltUQ0FfSFRCX0RJUkVDVF9RTEVOXSk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX21xLmMgYi9uZXQvc2NoZWQvc2NoX21xLmMKaW5kZXggYjk0Mzk4Mi4uMmJjOGQ3ZiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9tcS5jCisrKyBiL25ldC9zY2hlZC9zY2hfbXEuYwpAQCAtODgsNyArODgsNyBAQAogCQkJcWRpc2NfZGVzdHJveShvbGQpOwogI2lmZGVmIENPTkZJR19ORVRfU0NIRUQKIAkJaWYgKG50eCA8IGRldi0+cmVhbF9udW1fdHhfcXVldWVzKQotCQkJcWRpc2NfbGlzdF9hZGQocWRpc2MpOworCQkJcWRpc2NfaGFzaF9hZGQocWRpc2MpOwogI2VuZGlmCiAKIAl9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX21xcHJpby5jIGIvbmV0L3NjaGVkL3NjaF9tcXByaW8uYwppbmRleCA1NDljNjYzLi5iNWM1MDJjIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX21xcHJpby5jCisrKyBiL25ldC9zY2hlZC9zY2hfbXFwcmlvLmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCQlpZiAob2xkKQogCQkJcWRpc2NfZGVzdHJveShvbGQpOwogCQlpZiAobnR4IDwgZGV2LT5yZWFsX251bV90eF9xdWV1ZXMpCi0JCQlxZGlzY19saXN0X2FkZChxZGlzYyk7CisJCQlxZGlzY19oYXNoX2FkZChxZGlzYyk7CiAJfQogCWtmcmVlKHByaXYtPnFkaXNjcyk7CiAJcHJpdi0+cWRpc2NzID0gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfbmV0ZW0uYyBiL25ldC9zY2hlZC9zY2hfbmV0ZW0uYwppbmRleCBhYWFmMDIxLi45ZjdiMzgwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX25ldGVtLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCkBAIC00MTMsNiArNDEzLDE2IEBACiAJcmV0dXJuIHNlZ3M7CiB9CiAKK3N0YXRpYyB2b2lkIG5ldGVtX2VucXVldWVfc2tiX2hlYWQoc3RydWN0IHFkaXNjX3NrYl9oZWFkICpxaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlza2ItPm5leHQgPSBxaC0+aGVhZDsKKworCWlmICghcWgtPmhlYWQpCisJCXFoLT50YWlsID0gc2tiOworCXFoLT5oZWFkID0gc2tiOworCXFoLT5xbGVuKys7Cit9CisKIC8qCiAgKiBJbnNlcnQgb25lIHNrYiBpbnRvIHFkaXNjLgogICogTm90ZTogcGFyZW50IGRlcGVuZHMgb24gcmV0dXJuIHZhbHVlIHRvIGFjY291bnQgZm9yIHF1ZXVlIGxlbmd0aC4KQEAgLTUwMiw3ICs1MTIsNyBAQAogCQkJMTw8KHByYW5kb21fdTMyKCkgJSA4KTsKIAl9CiAKLQlpZiAodW5saWtlbHkoc2tiX3F1ZXVlX2xlbigmc2NoLT5xKSA+PSBzY2gtPmxpbWl0KSkKKwlpZiAodW5saWtlbHkoc2NoLT5xLnFsZW4gPj0gc2NoLT5saW1pdCkpCiAJCXJldHVybiBxZGlzY19kcm9wKHNrYiwgc2NoLCB0b19mcmVlKTsKIAogCXFkaXNjX3FzdGF0c19iYWNrbG9nX2luYyhzY2gsIHNrYik7CkBAIC01MjIsOCArNTMyLDggQEAKIAkJaWYgKHEtPnJhdGUpIHsKIAkJCXN0cnVjdCBza19idWZmICpsYXN0OwogCi0JCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc2NoLT5xKSkKLQkJCQlsYXN0ID0gc2tiX3BlZWtfdGFpbCgmc2NoLT5xKTsKKwkJCWlmIChzY2gtPnEucWxlbikKKwkJCQlsYXN0ID0gc2NoLT5xLnRhaWw7CiAJCQllbHNlCiAJCQkJbGFzdCA9IG5ldGVtX3JiX3RvX3NrYihyYl9sYXN0KCZxLT50X3Jvb3QpKTsKIAkJCWlmIChsYXN0KSB7CkBAIC01NTIsNyArNTYyLDcgQEAKIAkJY2ItPnRpbWVfdG9fc2VuZCA9IHBzY2hlZF9nZXRfdGltZSgpOwogCQlxLT5jb3VudGVyID0gMDsKIAotCQlfX3NrYl9xdWV1ZV9oZWFkKCZzY2gtPnEsIHNrYik7CisJCW5ldGVtX2VucXVldWVfc2tiX2hlYWQoJnNjaC0+cSwgc2tiKTsKIAkJc2NoLT5xc3RhdHMucmVxdWV1ZXMrKzsKIAl9CiAKQEAgLTU4Nyw3ICs1OTcsNyBAQAogCXN0cnVjdCByYl9ub2RlICpwOwogCiB0Zmlmb19kZXF1ZXVlOgotCXNrYiA9IF9fc2tiX2RlcXVldWUoJnNjaC0+cSk7CisJc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQoJnNjaC0+cSk7CiAJaWYgKHNrYikgewogCQlxZGlzY19xc3RhdHNfYmFja2xvZ19kZWMoc2NoLCBza2IpOwogZGVsaXZlcjoKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfcGllLmMgYi9uZXQvc2NoZWQvc2NoX3BpZS5jCmluZGV4IGE1NzBiMGIuLjVjM2E5OWQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfcGllLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9waWUuYwpAQCAtMjMxLDcgKzIzMSw3IEBACiAJLyogRHJvcCBleGNlc3MgcGFja2V0cyBpZiBuZXcgbGltaXQgaXMgbG93ZXIgKi8KIAlxbGVuID0gc2NoLT5xLnFsZW47CiAJd2hpbGUgKHNjaC0+cS5xbGVuID4gc2NoLT5saW1pdCkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19za2JfZGVxdWV1ZSgmc2NoLT5xKTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IF9fcWRpc2NfZGVxdWV1ZV9oZWFkKCZzY2gtPnEpOwogCiAJCWRyb3BwZWQgKz0gcWRpc2NfcGt0X2xlbihza2IpOwogCQlxZGlzY19xc3RhdHNfYmFja2xvZ19kZWMoc2NoLCBza2IpOwpAQCAtNTExLDcgKzUxMSw3IEBACiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnBpZV9xZGlzY19kZXF1ZXVlKHN0cnVjdCBRZGlzYyAqc2NoKQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc2tiID0gX19xZGlzY19kZXF1ZXVlX2hlYWQoc2NoLCAmc2NoLT5xKTsKKwlza2IgPSBxZGlzY19kZXF1ZXVlX2hlYWQoc2NoKTsKIAogCWlmICghc2tiKQogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfcWZxLmMgYi9uZXQvc2NoZWQvc2NoX3FmcS5jCmluZGV4IGYyN2ZmZWUuLmNhMDUxNmUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfcWZxLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9xZnEuYwpAQCAtMTE1Myw2ICsxMTUzLDcgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIE5VTEw7CiAKKwlxZGlzY19xc3RhdHNfYmFja2xvZ19kZWMoc2NoLCBza2IpOwogCXNjaC0+cS5xbGVuLS07CiAJcWRpc2NfYnN0YXRzX3VwZGF0ZShzY2gsIHNrYik7CiAKQEAgLTEyNTYsNiArMTI1Nyw3IEBACiAJfQogCiAJYnN0YXRzX3VwZGF0ZSgmY2wtPmJzdGF0cywgc2tiKTsKKwlxZGlzY19xc3RhdHNfYmFja2xvZ19pbmMoc2NoLCBza2IpOwogCSsrc2NoLT5xLnFsZW47CiAKIAlhZ2cgPSBjbC0+YWdnOwpAQCAtMTQ3Niw2ICsxNDc4LDcgQEAKIAkJCXFkaXNjX3Jlc2V0KGNsLT5xZGlzYyk7CiAJCX0KIAl9CisJc2NoLT5xc3RhdHMuYmFja2xvZyA9IDA7CiAJc2NoLT5xLnFsZW4gPSAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3NmYi5jIGIvbmV0L3NjaGVkL3NjaF9zZmIuYwppbmRleCBhZGQzY2M3Li4yMGEzNTBiIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3NmYi5jCisrKyBiL25ldC9zY2hlZC9zY2hfc2ZiLmMKQEAgLTQwMCw2ICs0MDAsNyBAQAogZW5xdWV1ZToKIAlyZXQgPSBxZGlzY19lbnF1ZXVlKHNrYiwgY2hpbGQsIHRvX2ZyZWUpOwogCWlmIChsaWtlbHkocmV0ID09IE5FVF9YTUlUX1NVQ0NFU1MpKSB7CisJCXFkaXNjX3FzdGF0c19iYWNrbG9nX2luYyhzY2gsIHNrYik7CiAJCXNjaC0+cS5xbGVuKys7CiAJCWluY3JlbWVudF9xbGVuKHNrYiwgcSk7CiAJfSBlbHNlIGlmIChuZXRfeG1pdF9kcm9wX2NvdW50KHJldCkpIHsKQEAgLTQyOCw2ICs0MjksNyBAQAogCiAJaWYgKHNrYikgewogCQlxZGlzY19ic3RhdHNfdXBkYXRlKHNjaCwgc2tiKTsKKwkJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKIAkJc2NoLT5xLnFsZW4tLTsKIAkJZGVjcmVtZW50X3FsZW4oc2tiLCBxKTsKIAl9CkBAIC00NTAsNiArNDUyLDcgQEAKIAlzdHJ1Y3Qgc2ZiX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CiAKIAlxZGlzY19yZXNldChxLT5xZGlzYyk7CisJc2NoLT5xc3RhdHMuYmFja2xvZyA9IDA7CiAJc2NoLT5xLnFsZW4gPSAwOwogCXEtPnNsb3QgPSAwOwogCXEtPmRvdWJsZV9idWZmZXJpbmcgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2Fzc29jaW9sYS5jIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKaW5kZXggMWMyMzA2MC4uZjEwZDMzOSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYXNzb2Npb2xhLmMKKysrIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKQEAgLTE0MDgsNyArMTQwOCw3IEBACiAJCQkJdHJhbnNwb3J0cykgewogCQlpZiAodC0+cG10dV9wZW5kaW5nICYmIHQtPmRzdCkgewogCQkJc2N0cF90cmFuc3BvcnRfdXBkYXRlX3BtdHUoc2ssIHQsCi0JCQkJCQkgICBXT1JEX1RSVU5DKGRzdF9tdHUodC0+ZHN0KSkpOworCQkJCQkJICAgU0NUUF9UUlVOQzQoZHN0X210dSh0LT5kc3QpKSk7CiAJCQl0LT5wbXR1X3BlbmRpbmcgPSAwOwogCQl9CiAJCWlmICghcG10dSB8fCAodC0+cGF0aG10dSA8IHBtdHUpKQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvYXV0aC5jIGIvbmV0L3NjdHAvYXV0aC5jCmluZGV4IDkxMmViMTYuLmY5OWQ0ODUgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2F1dGguYworKysgYi9uZXQvc2N0cC9hdXRoLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIAkJLyogaWQgMiBpcyByZXNlcnZlZCBhcyB3ZWxsICovCiAJCS5obWFjX2lkID0gU0NUUF9BVVRIX0hNQUNfSURfUkVTRVJWRURfMiwKIAl9LAotI2lmIGRlZmluZWQgKENPTkZJR19DUllQVE9fU0hBMjU2KSB8fCBkZWZpbmVkIChDT05GSUdfQ1JZUFRPX1NIQTI1Nl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQ1JZUFRPX1NIQTI1NikKIAl7CiAJCS5obWFjX2lkID0gU0NUUF9BVVRIX0hNQUNfSURfU0hBMjU2LAogCQkuaG1hY19uYW1lID0gImhtYWMoc2hhMjU2KSIsCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9jaHVuay5jIGIvbmV0L3NjdHAvY2h1bmsuYwppbmRleCBhNTVlNTQ3Li43YTFjZGY0IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9jaHVuay5jCisrKyBiL25ldC9zY3RwL2NodW5rLmMKQEAgLTcwLDYgKzcwLDE5IEBACiAJcmV0dXJuIG1zZzsKIH0KIAordm9pZCBzY3RwX2RhdGFtc2dfZnJlZShzdHJ1Y3Qgc2N0cF9kYXRhbXNnICptc2cpCit7CisJc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rOworCisJLyogVGhpcyBkb2Vzbid0IGhhdmUgdG8gYmUgYSBfc2FmZSB2YWlyYW50IGJlY2F1c2UKKwkgKiBzY3RwX2NodW5rX2ZyZWUoKSBvbmx5IGRyb3BzIHRoZSByZWZzLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2h1bmssICZtc2ctPmNodW5rcywgZnJhZ19saXN0KQorCQlzY3RwX2NodW5rX2ZyZWUoY2h1bmspOworCisJc2N0cF9kYXRhbXNnX3B1dChtc2cpOworfQorCiAvKiBGaW5hbCBkZXN0cnVjdHJ1Y3Rpb24gb2YgZGF0YW1zZyBtZW1vcnkuICovCiBzdGF0aWMgdm9pZCBzY3RwX2RhdGFtc2dfZGVzdHJveShzdHJ1Y3Qgc2N0cF9kYXRhbXNnICptc2cpCiB7CkBAIC0xNzksMTIgKzE5MiwxOCBAQAogCQkJIG1zZywgbXNnLT5leHBpcmVzX2F0LCBqaWZmaWVzKTsKIAl9CiAKKwlpZiAoYXNvYy0+cGVlci5wcnNjdHBfY2FwYWJsZSAmJgorCSAgICBTQ1RQX1BSX1RUTF9FTkFCTEVEKHNpbmZvLT5zaW5mb19mbGFncykpCisJCW1zZy0+ZXhwaXJlc19hdCA9CisJCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhzaW5mby0+c2luZm9fdGltZXRvbGl2ZSk7CisKIAkvKiBUaGlzIGlzIHRoZSBiaWdnZXN0IHBvc3NpYmxlIERBVEEgY2h1bmsgdGhhdCBjYW4gZml0IGludG8KIAkgKiB0aGUgcGFja2V0CiAJICovCi0JbWF4X2RhdGEgPSAoYXNvYy0+cGF0aG10dSAtCi0JCXNjdHBfc2soYXNvYy0+YmFzZS5zayktPnBmLT5hZi0+bmV0X2hlYWRlcl9sZW4gLQotCQlzaXplb2Yoc3RydWN0IHNjdHBoZHIpIC0gc2l6ZW9mKHN0cnVjdCBzY3RwX2RhdGFfY2h1bmspKSAmIH4zOworCW1heF9kYXRhID0gYXNvYy0+cGF0aG10dSAtCisJCSAgIHNjdHBfc2soYXNvYy0+YmFzZS5zayktPnBmLT5hZi0+bmV0X2hlYWRlcl9sZW4gLQorCQkgICBzaXplb2Yoc3RydWN0IHNjdHBoZHIpIC0gc2l6ZW9mKHN0cnVjdCBzY3RwX2RhdGFfY2h1bmspOworCW1heF9kYXRhID0gU0NUUF9UUlVOQzQobWF4X2RhdGEpOwogCiAJbWF4ID0gYXNvYy0+ZnJhZ19wb2ludDsKIAkvKiBJZiB0aGUgdGhlIHBlZXIgcmVxdWVzdGVkIHRoYXQgd2UgYXV0aGVudGljYXRlIERBVEEgY2h1bmtzCkBAIC0xOTUsOCArMjE0LDggQEAKIAkJc3RydWN0IHNjdHBfaG1hYyAqaG1hY19kZXNjID0gc2N0cF9hdXRoX2Fzb2NfZ2V0X2htYWMoYXNvYyk7CiAKIAkJaWYgKGhtYWNfZGVzYykKLQkJCW1heF9kYXRhIC09IFdPUkRfUk9VTkQoc2l6ZW9mKHNjdHBfYXV0aF9jaHVua190KSArCi0JCQkJCSAgICBobWFjX2Rlc2MtPmhtYWNfbGVuKTsKKwkJCW1heF9kYXRhIC09IFNDVFBfUEFENChzaXplb2Yoc2N0cF9hdXRoX2NodW5rX3QpICsKKwkJCQkJICAgICAgaG1hY19kZXNjLT5obWFjX2xlbik7CiAJfQogCiAJLyogTm93LCBjaGVjayBpZiB3ZSBuZWVkIHRvIHJlZHVjZSBvdXIgbWF4ICovCkBAIC0yMTYsNyArMjM1LDcgQEAKIAkgICAgYXNvYy0+b3V0cXVldWUub3V0X3FsZW4gPT0gMCAmJgogCSAgICBsaXN0X2VtcHR5KCZhc29jLT5vdXRxdWV1ZS5yZXRyYW5zbWl0KSAmJgogCSAgICBtc2dfbGVuID4gbWF4KQotCQltYXhfZGF0YSAtPSBXT1JEX1JPVU5EKHNpemVvZihzY3RwX3NhY2tfY2h1bmtfdCkpOworCQltYXhfZGF0YSAtPSBTQ1RQX1BBRDQoc2l6ZW9mKHNjdHBfc2Fja19jaHVua190KSk7CiAKIAkvKiBFbmNvdXJhZ2UgQ29va2llLUVDSE8gYnVuZGxpbmcuICovCiAJaWYgKGFzb2MtPnN0YXRlIDwgU0NUUF9TVEFURV9DT09LSUVfRUNIT0VEKQpAQCAtMzM1LDcgKzM1NCw3IEBACiAvKiBDaGVjayB3aGV0aGVyIHRoaXMgbWVzc2FnZSBoYXMgZXhwaXJlZC4gKi8KIGludCBzY3RwX2NodW5rX2FiYW5kb25lZChzdHJ1Y3Qgc2N0cF9jaHVuayAqY2h1bmspCiB7Ci0JaWYgKCFjaHVuay0+YXNvYy0+cHJzY3RwX2VuYWJsZSB8fAorCWlmICghY2h1bmstPmFzb2MtPnBlZXIucHJzY3RwX2NhcGFibGUgfHwKIAkgICAgIVNDVFBfUFJfUE9MSUNZKGNodW5rLT5zaW5mby5zaW5mb19mbGFncykpIHsKIAkJc3RydWN0IHNjdHBfZGF0YW1zZyAqbXNnID0gY2h1bmstPm1zZzsKIApAQCAtMzQ5LDE0ICszNjgsMTQgQEAKIAl9CiAKIAlpZiAoU0NUUF9QUl9UVExfRU5BQkxFRChjaHVuay0+c2luZm8uc2luZm9fZmxhZ3MpICYmCi0JICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgY2h1bmstPnByc2N0cF9wYXJhbSkpIHsKKwkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBjaHVuay0+bXNnLT5leHBpcmVzX2F0KSkgewogCQlpZiAoY2h1bmstPnNlbnRfY291bnQpCiAJCQljaHVuay0+YXNvYy0+YWJhbmRvbmVkX3NlbnRbU0NUUF9QUl9JTkRFWChUVEwpXSsrOwogCQllbHNlCiAJCQljaHVuay0+YXNvYy0+YWJhbmRvbmVkX3Vuc2VudFtTQ1RQX1BSX0lOREVYKFRUTCldKys7CiAJCXJldHVybiAxOwogCX0gZWxzZSBpZiAoU0NUUF9QUl9SVFhfRU5BQkxFRChjaHVuay0+c2luZm8uc2luZm9fZmxhZ3MpICYmCi0JCSAgIGNodW5rLT5zZW50X2NvdW50ID4gY2h1bmstPnByc2N0cF9wYXJhbSkgeworCQkgICBjaHVuay0+c2VudF9jb3VudCA+IGNodW5rLT5zaW5mby5zaW5mb190aW1ldG9saXZlKSB7CiAJCWNodW5rLT5hc29jLT5hYmFuZG9uZWRfc2VudFtTQ1RQX1BSX0lOREVYKFJUWCldKys7CiAJCXJldHVybiAxOwogCX0KZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucHV0LmMgYi9uZXQvc2N0cC9pbnB1dC5jCmluZGV4IGMxODJkYjcuLmEyZWExZDEgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lucHV0LmMKKysrIGIvbmV0L3NjdHAvaW5wdXQuYwpAQCAtMTE5LDcgKzExOSwxMyBAQAogCQkgICAgICAgc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSkKIAkJZ290byBkaXNjYXJkX2l0OwogCi0JaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBzY3RwaGRyKSkpCisJLyogSWYgdGhlIHBhY2tldCBpcyBmcmFnbWVudGVkIGFuZCB3ZSBuZWVkIHRvIGRvIGNyYyBjaGVja2luZywKKwkgKiBpdCdzIGJldHRlciB0byBqdXN0IGxpbmVhcml6ZSBpdCBvdGhlcndpc2UgY3JjIGNvbXB1dGluZworCSAqIHRha2VzIGxvbmdlci4KKwkgKi8KKwlpZiAoKCEoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSAmIFNLQl9HU09fU0NUUCkgJiYKKwkgICAgIHNrYl9saW5lYXJpemUoc2tiKSkgfHwKKwkgICAgIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IHNjdHBoZHIpKSkKIAkJZ290byBkaXNjYXJkX2l0OwogCiAJLyogUHVsbCB1cCB0aGUgSVAgaGVhZGVyLiAqLwpAQCAtNTk5LDcgKzYwNSw3IEBACiAJCS8qIFBNVFUgZGlzY292ZXJ5IChSRkMxMTkxKSAqLwogCQlpZiAoSUNNUF9GUkFHX05FRURFRCA9PSBjb2RlKSB7CiAJCQlzY3RwX2ljbXBfZnJhZ19uZWVkZWQoc2ssIGFzb2MsIHRyYW5zcG9ydCwKLQkJCQkJICAgICAgV09SRF9UUlVOQyhpbmZvKSk7CisJCQkJCSAgICAgIFNDVFBfVFJVTkM0KGluZm8pKTsKIAkJCWdvdG8gb3V0X3VubG9jazsKIAkJfSBlbHNlIHsKIAkJCWlmIChJQ01QX1BST1RfVU5SRUFDSCA9PSBjb2RlKSB7CkBAIC02NjcsNyArNjczLDcgQEAKIAkJaWYgKG50b2hzKGNoLT5sZW5ndGgpIDwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpCiAJCQlicmVhazsKIAotCQljaF9lbmQgPSBvZmZzZXQgKyBXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKTsKKwkJY2hfZW5kID0gb2Zmc2V0ICsgU0NUUF9QQUQ0KG50b2hzKGNoLT5sZW5ndGgpKTsKIAkJaWYgKGNoX2VuZCA+IHNrYi0+bGVuKQogCQkJYnJlYWs7CiAKQEAgLTc5MCwyNyArNzk2LDM0IEBACiBzdGF0aWMgaW5saW5lIGludCBzY3RwX2hhc2hfY21wKHN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnICphcmcsCiAJCQkJY29uc3Qgdm9pZCAqcHRyKQogeworCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdCA9IChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKilwdHI7CiAJY29uc3Qgc3RydWN0IHNjdHBfaGFzaF9jbXBfYXJnICp4ID0gYXJnLT5rZXk7Ci0JY29uc3Qgc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0ID0gcHRyOwotCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jID0gdC0+YXNvYzsKLQljb25zdCBzdHJ1Y3QgbmV0ICpuZXQgPSB4LT5uZXQ7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7CisJaW50IGVyciA9IDE7CiAKIAlpZiAoIXNjdHBfY21wX2FkZHJfZXhhY3QoJnQtPmlwYWRkciwgeC0+cGFkZHIpKQotCQlyZXR1cm4gMTsKLQlpZiAoIW5ldF9lcShzb2NrX25ldChhc29jLT5iYXNlLnNrKSwgbmV0KSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiBlcnI7CisJaWYgKCFzY3RwX3RyYW5zcG9ydF9ob2xkKHQpKQorCQlyZXR1cm4gZXJyOworCisJYXNvYyA9IHQtPmFzb2M7CisJaWYgKCFuZXRfZXEoc29ja19uZXQoYXNvYy0+YmFzZS5zayksIHgtPm5ldCkpCisJCWdvdG8gb3V0OwogCWlmICh4LT5lcCkgewogCQlpZiAoeC0+ZXAgIT0gYXNvYy0+ZXApCi0JCQlyZXR1cm4gMTsKKwkJCWdvdG8gb3V0OwogCX0gZWxzZSB7CiAJCWlmICh4LT5sYWRkci0+djQuc2luX3BvcnQgIT0gaHRvbnMoYXNvYy0+YmFzZS5iaW5kX2FkZHIucG9ydCkpCi0JCQlyZXR1cm4gMTsKKwkJCWdvdG8gb3V0OwogCQlpZiAoIXNjdHBfYmluZF9hZGRyX21hdGNoKCZhc29jLT5iYXNlLmJpbmRfYWRkciwKIAkJCQkJICB4LT5sYWRkciwgc2N0cF9zayhhc29jLT5iYXNlLnNrKSkpCi0JCQlyZXR1cm4gMTsKKwkJCWdvdG8gb3V0OwogCX0KIAotCXJldHVybiAwOworCWVyciA9IDA7CitvdXQ6CisJc2N0cF90cmFuc3BvcnRfcHV0KHQpOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIHNjdHBfaGFzaF9vYmooY29uc3Qgdm9pZCAqZGF0YSwgdTMyIGxlbiwgdTMyIHNlZWQpCkBAIC0xMTE1LDcgKzExMjgsNyBAQAogCQlpZiAobnRvaHMoY2gtPmxlbmd0aCkgPCBzaXplb2Yoc2N0cF9jaHVua2hkcl90KSkKIAkJCWJyZWFrOwogCi0JCWNoX2VuZCA9ICgoX191OCAqKWNoKSArIFdPUkRfUk9VTkQobnRvaHMoY2gtPmxlbmd0aCkpOworCQljaF9lbmQgPSAoKF9fdTggKiljaCkgKyBTQ1RQX1BBRDQobnRvaHMoY2gtPmxlbmd0aCkpOwogCQlpZiAoY2hfZW5kID4gc2tiX3RhaWxfcG9pbnRlcihza2IpKQogCQkJYnJlYWs7CiAKQEAgLTExNzcsOSArMTE5MCw2IEBACiAJaWYgKChza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19TQ1RQKSA9PSBTS0JfR1NPX1NDVFApCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKHNrYl9saW5lYXJpemUoc2tiKSkKLQkJcmV0dXJuIE5VTEw7Ci0KIAljaCA9IChzY3RwX2NodW5raGRyX3QgKikgc2tiLT5kYXRhOwogCiAJLyogVGhlIGNvZGUgYmVsb3cgd2lsbCBhdHRlbXB0IHRvIHdhbGsgdGhlIGNodW5rIGFuZCBleHRyYWN0CkBAIC0xMTg3LDcgKzExOTcsNyBAQAogCSAqIHRoYXQgdGhlIGNodW5rIGxlbmd0aCBkb2Vzbid0IGNhdXNlIG92ZXJmbG93LiAgT3RoZXJ3aXNlLCB3ZSdsbAogCSAqIHdhbGsgb2ZmIHRoZSBlbmQuCiAJICovCi0JaWYgKFdPUkRfUk9VTkQobnRvaHMoY2gtPmxlbmd0aCkpID4gc2tiLT5sZW4pCisJaWYgKFNDVFBfUEFENChudG9ocyhjaC0+bGVuZ3RoKSkgPiBza2ItPmxlbikKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKiBJZiB0aGlzIGlzIElOSVQvSU5JVC1BQ0sgbG9vayBpbnNpZGUgdGhlIGNodW5rIHRvby4gKi8KZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucXVldWUuYyBiL25ldC9zY3RwL2lucXVldWUuYwppbmRleCBjMzBkZGIwLi5mNzMxZGUzIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9pbnF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvaW5xdWV1ZS5jCkBAIC0xNzAsMTkgKzE3MCw2IEBACiAKIAkJY2h1bmsgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3Qgc2N0cF9jaHVuaywgbGlzdCk7CiAKLQkJLyogTGluZWFyaXplIGlmIGl0J3Mgbm90IEdTTyAqLwotCQlpZiAoKHNrYl9zaGluZm8oY2h1bmstPnNrYiktPmdzb190eXBlICYgU0tCX0dTT19TQ1RQKSAhPSBTS0JfR1NPX1NDVFAgJiYKLQkJICAgIHNrYl9pc19ub25saW5lYXIoY2h1bmstPnNrYikpIHsKLQkJCWlmIChza2JfbGluZWFyaXplKGNodW5rLT5za2IpKSB7Ci0JCQkJX19TQ1RQX0lOQ19TVEFUUyhkZXZfbmV0KGNodW5rLT5za2ItPmRldiksIFNDVFBfTUlCX0lOX1BLVF9ESVNDQVJEUyk7Ci0JCQkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKLQkJCQlnb3RvIG5leHRfY2h1bms7Ci0JCQl9Ci0KLQkJCS8qIFVwZGF0ZSBzY3RwX2hkciBhcyBpdCBwcm9iYWJseSBjaGFuZ2VkICovCi0JCQljaHVuay0+c2N0cF9oZHIgPSBzY3RwX2hkcihjaHVuay0+c2tiKTsKLQkJfQotCiAJCWlmICgoc2tiX3NoaW5mbyhjaHVuay0+c2tiKS0+Z3NvX3R5cGUgJiBTS0JfR1NPX1NDVFApID09IFNLQl9HU09fU0NUUCkgewogCQkJLyogR1NPLW1hcmtlZCBza2JzIGJ1dCB3aXRob3V0IGZyYWdzLCBoYW5kbGUKIAkJCSAqIHRoZW0gbm9ybWFsbHkKQEAgLTIyNiw3ICsyMTMsNyBAQAogCX0KIAogCWNodW5rLT5jaHVua19oZHIgPSBjaDsKLQljaHVuay0+Y2h1bmtfZW5kID0gKChfX3U4ICopY2gpICsgV09SRF9ST1VORChudG9ocyhjaC0+bGVuZ3RoKSk7CisJY2h1bmstPmNodW5rX2VuZCA9ICgoX191OCAqKWNoKSArIFNDVFBfUEFENChudG9ocyhjaC0+bGVuZ3RoKSk7CiAJc2tiX3B1bGwoY2h1bmstPnNrYiwgc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkpOwogCWNodW5rLT5zdWJoLnYgPSBOVUxMOyAvKiBTdWJoZWFkZXIgaXMgbm8gbG9uZ2VyIHZhbGlkLiAgKi8KIApkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvb3V0cHV0LmMgYi9uZXQvc2N0cC9vdXRwdXQuYwppbmRleCAxZjE2ODJiLi4yYTVjMTg5IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRwdXQuYworKysgYi9uZXQvc2N0cC9vdXRwdXQuYwpAQCAtMTgwLDcgKzE4MCw2IEBACiAJCQkJICAgICAgIGludCBvbmVfcGFja2V0LCBnZnBfdCBnZnApCiB7CiAJc2N0cF94bWl0X3QgcmV0dmFsOwotCWludCBlcnJvciA9IDA7CiAKIAlwcl9kZWJ1ZygiJXM6IHBhY2tldDolcCBzaXplOiVadSBjaHVuazolcCBzaXplOiVkXG4iLCBfX2Z1bmNfXywKIAkJIHBhY2tldCwgcGFja2V0LT5zaXplLCBjaHVuaywgY2h1bmstPnNrYiA/IGNodW5rLT5za2ItPmxlbiA6IC0xKTsKQEAgLTE4OCw2ICsxODcsOCBAQAogCXN3aXRjaCAoKHJldHZhbCA9IChzY3RwX3BhY2tldF9hcHBlbmRfY2h1bmsocGFja2V0LCBjaHVuaykpKSkgewogCWNhc2UgU0NUUF9YTUlUX1BNVFVfRlVMTDoKIAkJaWYgKCFwYWNrZXQtPmhhc19jb29raWVfZWNobykgeworCQkJaW50IGVycm9yID0gMDsKKwogCQkJZXJyb3IgPSBzY3RwX3BhY2tldF90cmFuc21pdChwYWNrZXQsIGdmcCk7CiAJCQlpZiAoZXJyb3IgPCAwKQogCQkJCWNodW5rLT5za2ItPnNrLT5za19lcnIgPSAtZXJyb3I7CkBAIC0yOTYsNyArMjk3LDcgQEAKIAkJCQkJICAgICAgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rKQogewogCXNjdHBfeG1pdF90IHJldHZhbCA9IFNDVFBfWE1JVF9PSzsKLQlfX3UxNiBjaHVua19sZW4gPSBXT1JEX1JPVU5EKG50b2hzKGNodW5rLT5jaHVua19oZHItPmxlbmd0aCkpOworCV9fdTE2IGNodW5rX2xlbiA9IFNDVFBfUEFENChudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpKTsKIAogCS8qIENoZWNrIHRvIHNlZSBpZiB0aGlzIGNodW5rIHdpbGwgZml0IGludG8gdGhlIHBhY2tldCAqLwogCXJldHZhbCA9IHNjdHBfcGFja2V0X3dpbGxfZml0KHBhY2tldCwgY2h1bmssIGNodW5rX2xlbik7CkBAIC00NDEsMTQgKzQ0MiwxNCBAQAogCQkJICogdGltZS4gQXBwbGljYXRpb24gbWF5IG5vdGljZSB0aGlzIGVycm9yLgogCQkJICovCiAJCQlwcl9lcnJfb25jZSgiVHJ5aW5nIHRvIEdTTyBidXQgdW5kZXJseWluZyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGl0LiIpOwotCQkJZ290byBub21lbTsKKwkJCWdvdG8gZXJyOwogCQl9CiAJfSBlbHNlIHsKIAkJcGt0X3NpemUgPSBwYWNrZXQtPnNpemU7CiAJfQogCWhlYWQgPSBhbGxvY19za2IocGt0X3NpemUgKyBNQVhfSEVBREVSLCBnZnApOwogCWlmICghaGVhZCkKLQkJZ290byBub21lbTsKKwkJZ290byBlcnI7CiAJaWYgKGdzbykgewogCQlOQVBJX0dST19DQihoZWFkKS0+bGFzdCA9IGhlYWQ7CiAJCXNrYl9zaGluZm8oaGVhZCktPmdzb190eXBlID0gc2stPnNrX2dzb190eXBlOwpAQCAtNDY5LDggKzQ3MCwxMiBAQAogCQl9CiAJfQogCWRzdCA9IGRzdF9jbG9uZSh0cC0+ZHN0KTsKLQlpZiAoIWRzdCkKLQkJZ290byBub19yb3V0ZTsKKwlpZiAoIWRzdCkgeworCQlpZiAoYXNvYykKKwkJCUlQX0lOQ19TVEFUUyhzb2NrX25ldChhc29jLT5iYXNlLnNrKSwKKwkJCQkgICAgIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKKwkJZ290byBub2RzdDsKKwl9CiAJc2tiX2RzdF9zZXQoaGVhZCwgZHN0KTsKIAogCS8qIEJ1aWxkIHRoZSBTQ1RQIGhlYWRlci4gICovCkBAIC01MDMsNyArNTA4LDcgQEAKIAkJaWYgKGdzbykgewogCQkJcGt0X3NpemUgPSBwYWNrZXQtPm92ZXJoZWFkOwogCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaHVuaywgJnBhY2tldC0+Y2h1bmtfbGlzdCwgbGlzdCkgewotCQkJCWludCBwYWRkZWQgPSBXT1JEX1JPVU5EKGNodW5rLT5za2ItPmxlbik7CisJCQkJaW50IHBhZGRlZCA9IFNDVFBfUEFENChjaHVuay0+c2tiLT5sZW4pOwogCiAJCQkJaWYgKHBrdF9zaXplICsgcGFkZGVkID4gdHAtPnBhdGhtdHUpCiAJCQkJCWJyZWFrOwpAQCAtNTMzLDcgKzUzOCw3IEBACiAJCSAqIGluY2x1ZGVkIGluIHRoZSBjaHVuayBsZW5ndGggZmllbGQuICBUaGUgc2VuZGVyIHNob3VsZAogCQkgKiBuZXZlciBwYWQgd2l0aCBtb3JlIHRoYW4gMyBieXRlcy4KIAkJICoKLQkJICogW1RoaXMgd2hvbGUgY29tbWVudCBleHBsYWlucyBXT1JEX1JPVU5EKCkgYmVsb3cuXQorCQkgKiBbVGhpcyB3aG9sZSBjb21tZW50IGV4cGxhaW5zIFNDVFBfUEFENCgpIGJlbG93Ll0KIAkJICovCiAKIAkJcGt0X3NpemUgLT0gcGFja2V0LT5vdmVyaGVhZDsKQEAgLTU1NSw3ICs1NjAsNyBAQAogCQkJCWhhc19kYXRhID0gMTsKIAkJCX0KIAotCQkJcGFkZGluZyA9IFdPUkRfUk9VTkQoY2h1bmstPnNrYi0+bGVuKSAtIGNodW5rLT5za2ItPmxlbjsKKwkJCXBhZGRpbmcgPSBTQ1RQX1BBRDQoY2h1bmstPnNrYi0+bGVuKSAtIGNodW5rLT5za2ItPmxlbjsKIAkJCWlmIChwYWRkaW5nKQogCQkJCW1lbXNldChza2JfcHV0KGNodW5rLT5za2IsIHBhZGRpbmcpLCAwLCBwYWRkaW5nKTsKIApAQCAtNTgyLDcgKzU4Nyw3IEBACiAJCQkgKiBhY2tub3dsZWRnZWQgb3IgaGF2ZSBmYWlsZWQuCiAJCQkgKiBSZS1xdWV1ZSBhdXRoIGNodW5rcyBpZiBuZWVkZWQuCiAJCQkgKi8KLQkJCXBrdF9zaXplIC09IFdPUkRfUk9VTkQoY2h1bmstPnNrYi0+bGVuKTsKKwkJCXBrdF9zaXplIC09IFNDVFBfUEFENChjaHVuay0+c2tiLT5sZW4pOwogCiAJCQlpZiAoIXNjdHBfY2h1bmtfaXNfZGF0YShjaHVuaykgJiYgY2h1bmsgIT0gcGFja2V0LT5hdXRoKQogCQkJCXNjdHBfY2h1bmtfZnJlZShjaHVuayk7CkBAIC02MjEsOCArNjI2LDEwIEBACiAJCWlmICghZ3NvKQogCQkJYnJlYWs7CiAKLQkJaWYgKHNrYl9ncm9fcmVjZWl2ZSgmaGVhZCwgbnNrYikpCisJCWlmIChza2JfZ3JvX3JlY2VpdmUoJmhlYWQsIG5za2IpKSB7CisJCQlrZnJlZV9za2IobnNrYik7CiAJCQlnb3RvIG5vbWVtOworCQl9CiAJCW5za2IgPSBOVUxMOwogCQlpZiAoV0FSTl9PTl9PTkNFKHNrYl9zaGluZm8oaGVhZCktPmdzb19zZWdzID49CiAJCQkJIHNrLT5za19nc29fbWF4X3NlZ3MpKQpAQCAtNzE2LDE4ICs3MjMsMTMgQEAKIAl9CiAJaGVhZC0+aWdub3JlX2RmID0gcGFja2V0LT5pcGZyYWdvazsKIAl0cC0+YWZfc3BlY2lmaWMtPnNjdHBfeG1pdChoZWFkLCB0cCk7CisJZ290byBvdXQ7CiAKLW91dDoKLQlzY3RwX3BhY2tldF9yZXNldChwYWNrZXQpOwotCXJldHVybiBlcnI7Ci1ub19yb3V0ZToKLQlrZnJlZV9za2IoaGVhZCk7Ci0JaWYgKG5za2IgIT0gaGVhZCkKLQkJa2ZyZWVfc2tiKG5za2IpOworbm9tZW06CisJaWYgKHBhY2tldC0+YXV0aCAmJiBsaXN0X2VtcHR5KCZwYWNrZXQtPmF1dGgtPmxpc3QpKQorCQlzY3RwX2NodW5rX2ZyZWUocGFja2V0LT5hdXRoKTsKIAotCWlmIChhc29jKQotCQlJUF9JTkNfU1RBVFMoc29ja19uZXQoYXNvYy0+YmFzZS5zayksIElQU1RBVFNfTUlCX09VVE5PUk9VVEVTKTsKLQorbm9kc3Q6CiAJLyogRklYTUU6IFJldHVybmluZyB0aGUgJ2Vycicgd2lsbCBlZmZlY3QgYWxsIHRoZSBhc3NvY2lhdGlvbnMKIAkgKiBhc3NvY2lhdGVkIHdpdGggYSBzb2NrZXQsIGFsdGhvdWdoIG9ubHkgb25lIG9mIHRoZSBwYXRocyBvZiB0aGUKIAkgKiBhc3NvY2lhdGlvbiBpcyB1bnJlYWNoYWJsZS4KQEAgLTczNiwyMiArNzM4LDE4IEBACiAJICogcmVxdWlyZWQuCiAJICovCiAJIC8qIGVyciA9IC1FSE9TVFVOUkVBQ0g7ICovCi1lcnI6Ci0JLyogQ29udHJvbCBjaHVua3MgYXJlIHVucmVsaWFibGUgc28ganVzdCBkcm9wIHRoZW0uICBEQVRBIGNodW5rcwotCSAqIHdpbGwgZ2V0IHJlc2VudCBvciBkcm9wcGVkIGxhdGVyLgotCSAqLworCWtmcmVlX3NrYihoZWFkKTsKIAorZXJyOgogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaHVuaywgdG1wLCAmcGFja2V0LT5jaHVua19saXN0LCBsaXN0KSB7CiAJCWxpc3RfZGVsX2luaXQoJmNodW5rLT5saXN0KTsKIAkJaWYgKCFzY3RwX2NodW5rX2lzX2RhdGEoY2h1bmspKQogCQkJc2N0cF9jaHVua19mcmVlKGNodW5rKTsKIAl9Ci0JZ290byBvdXQ7Ci1ub21lbToKLQlpZiAocGFja2V0LT5hdXRoICYmIGxpc3RfZW1wdHkoJnBhY2tldC0+YXV0aC0+bGlzdCkpCi0JCXNjdHBfY2h1bmtfZnJlZShwYWNrZXQtPmF1dGgpOwotCWVyciA9IC1FTk9NRU07Ci0JZ290byBlcnI7CisKK291dDoKKwlzY3RwX3BhY2tldF9yZXNldChwYWNrZXQpOworCXJldHVybiBlcnI7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODc4LDcgKzg3Niw3IEBACiAJCQkJCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKIAkJCQkJdTE2IGNodW5rX2xlbikKIHsKLQlzaXplX3QgcHNpemUsIHBtdHU7CisJc2l6ZV90IHBzaXplLCBwbXR1LCBtYXhzaXplOwogCXNjdHBfeG1pdF90IHJldHZhbCA9IFNDVFBfWE1JVF9PSzsKIAogCXBzaXplID0gcGFja2V0LT5zaXplOwpAQCAtOTA2LDYgKzkwNCwxNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAorCQkvKiBTaW1pbGFybHksIGlmIHRoaXMgY2h1bmsgd2FzIGJ1aWx0IGJlZm9yZSBhIFBNVFUKKwkJICogcmVkdWN0aW9uLCB3ZSBoYXZlIHRvIGZyYWdtZW50IGl0IGF0IElQIGxldmVsIG5vdy4gU28KKwkJICogaWYgdGhlIHBhY2tldCBhbHJlYWR5IGNvbnRhaW5zIHNvbWV0aGluZywgd2UgbmVlZCB0bworCQkgKiBmbHVzaC4KKwkJICovCisJCW1heHNpemUgPSBwbXR1IC0gcGFja2V0LT5vdmVyaGVhZDsKKwkJaWYgKHBhY2tldC0+YXV0aCkKKwkJCW1heHNpemUgLT0gU0NUUF9QQUQ0KHBhY2tldC0+YXV0aC0+c2tiLT5sZW4pOworCQlpZiAoY2h1bmtfbGVuID4gbWF4c2l6ZSkKKwkJCXJldHZhbCA9IFNDVFBfWE1JVF9QTVRVX0ZVTEw7CisKIAkJLyogSXQgaXMgYWxzbyBva2F5IHRvIGZyYWdtZW50IGlmIHRoZSBjaHVuayB3ZSBhcmUKIAkJICogYWRkaW5nIGlzIGEgY29udHJvbCBjaHVuaywgYnV0IG9ubHkgaWYgY3VycmVudCBwYWNrZXQKIAkJICogaXMgbm90IGEgR1NPIG9uZSBvdGhlcndpc2UgaXQgY2F1c2VzIGZyYWdtZW50YXRpb24gb2YKZGlmZiAtLWdpdCBhL25ldC9zY3RwL291dHF1ZXVlLmMgYi9uZXQvc2N0cC9vdXRxdWV1ZS5jCmluZGV4IDcyZTU0YTQuLjU4MjU4NTMgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL291dHF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvb3V0cXVldWUuYwpAQCAtNjgsNyArNjgsNyBAQAogCiBzdGF0aWMgdm9pZCBzY3RwX2dlbmVyYXRlX2Z3ZHRzbihzdHJ1Y3Qgc2N0cF9vdXRxICpxLCBfX3UzMiBzYWNrX2N0c24pOwogCi1zdGF0aWMgaW50IHNjdHBfb3V0cV9mbHVzaChzdHJ1Y3Qgc2N0cF9vdXRxICpxLCBpbnQgcnR4X3RpbWVvdXQsIGdmcF90IGdmcCk7CitzdGF0aWMgdm9pZCBzY3RwX291dHFfZmx1c2goc3RydWN0IHNjdHBfb3V0cSAqcSwgaW50IHJ0eF90aW1lb3V0LCBnZnBfdCBnZnApOwogCiAvKiBBZGQgZGF0YSB0byB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlLiAqLwogc3RhdGljIGlubGluZSB2b2lkIHNjdHBfb3V0cV9oZWFkX2RhdGEoc3RydWN0IHNjdHBfb3V0cSAqcSwKQEAgLTI4NSwxMCArMjg1LDkgQEAKIH0KIAogLyogUHV0IGEgbmV3IGNodW5rIGluIGFuIHNjdHBfb3V0cS4gICovCi1pbnQgc2N0cF9vdXRxX3RhaWwoc3RydWN0IHNjdHBfb3V0cSAqcSwgc3RydWN0IHNjdHBfY2h1bmsgKmNodW5rLCBnZnBfdCBnZnApCit2b2lkIHNjdHBfb3V0cV90YWlsKHN0cnVjdCBzY3RwX291dHEgKnEsIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHEtPmFzb2MtPmJhc2Uuc2spOwotCWludCBlcnJvciA9IDA7CiAKIAlwcl9kZWJ1ZygiJXM6IG91dHE6JXAsIGNodW5rOiVwWyVzXVxuIiwgX19mdW5jX18sIHEsIGNodW5rLAogCQkgY2h1bmsgJiYgY2h1bmstPmNodW5rX2hkciA/CkBAIC0yOTksNTQgKzI5OCwyNiBAQAogCSAqIGltbWVkaWF0ZWx5LgogCSAqLwogCWlmIChzY3RwX2NodW5rX2lzX2RhdGEoY2h1bmspKSB7Ci0JCS8qIElzIGl0IE9LIHRvIHF1ZXVlIGRhdGEgY2h1bmtzPyAgKi8KLQkJLyogRnJvbSA5LiBUZXJtaW5hdGlvbiBvZiBBc3NvY2lhdGlvbgotCQkgKgotCQkgKiBXaGVuIGVpdGhlciBlbmRwb2ludCBwZXJmb3JtcyBhIHNodXRkb3duLCB0aGUKLQkJICogYXNzb2NpYXRpb24gb24gZWFjaCBwZWVyIHdpbGwgc3RvcCBhY2NlcHRpbmcgbmV3Ci0JCSAqIGRhdGEgZnJvbSBpdHMgdXNlciBhbmQgb25seSBkZWxpdmVyIGRhdGEgaW4gcXVldWUKLQkJICogYXQgdGhlIHRpbWUgb2Ygc2VuZGluZyBvciByZWNlaXZpbmcgdGhlIFNIVVRET1dOCi0JCSAqIGNodW5rLgotCQkgKi8KLQkJc3dpdGNoIChxLT5hc29jLT5zdGF0ZSkgewotCQljYXNlIFNDVFBfU1RBVEVfQ0xPU0VEOgotCQljYXNlIFNDVFBfU1RBVEVfU0hVVERPV05fUEVORElORzoKLQkJY2FzZSBTQ1RQX1NUQVRFX1NIVVRET1dOX1NFTlQ6Ci0JCWNhc2UgU0NUUF9TVEFURV9TSFVURE9XTl9SRUNFSVZFRDoKLQkJY2FzZSBTQ1RQX1NUQVRFX1NIVVRET1dOX0FDS19TRU5UOgotCQkJLyogQ2Fubm90IHNlbmQgYWZ0ZXIgdHJhbnNwb3J0IGVuZHBvaW50IHNodXRkb3duICovCi0JCQllcnJvciA9IC1FU0hVVERPV047Ci0JCQlicmVhazsKKwkJcHJfZGVidWcoIiVzOiBvdXRxdWV1ZWluZzogb3V0cTolcCwgY2h1bms6JXBbJXNdKVxuIiwKKwkJCSBfX2Z1bmNfXywgcSwgY2h1bmssIGNodW5rICYmIGNodW5rLT5jaHVua19oZHIgPworCQkJIHNjdHBfY25hbWUoU0NUUF9TVF9DSFVOSyhjaHVuay0+Y2h1bmtfaGRyLT50eXBlKSkgOgorCQkJICJpbGxlZ2FsIGNodW5rIik7CiAKLQkJZGVmYXVsdDoKLQkJCXByX2RlYnVnKCIlczogb3V0cXVldWVpbmc6IG91dHE6JXAsIGNodW5rOiVwWyVzXSlcbiIsCi0JCQkJIF9fZnVuY19fLCBxLCBjaHVuaywgY2h1bmsgJiYgY2h1bmstPmNodW5rX2hkciA/Ci0JCQkJIHNjdHBfY25hbWUoU0NUUF9TVF9DSFVOSyhjaHVuay0+Y2h1bmtfaGRyLT50eXBlKSkgOgotCQkJCSAiaWxsZWdhbCBjaHVuayIpOwotCi0JCQlzY3RwX2NodW5rX2hvbGQoY2h1bmspOwotCQkJc2N0cF9vdXRxX3RhaWxfZGF0YShxLCBjaHVuayk7Ci0JCQlpZiAoY2h1bmstPmFzb2MtPnByc2N0cF9lbmFibGUgJiYKLQkJCSAgICBTQ1RQX1BSX1BSSU9fRU5BQkxFRChjaHVuay0+c2luZm8uc2luZm9fZmxhZ3MpKQotCQkJCWNodW5rLT5hc29jLT5zZW50X2NudF9yZW1vdmFibGUrKzsKLQkJCWlmIChjaHVuay0+Y2h1bmtfaGRyLT5mbGFncyAmIFNDVFBfREFUQV9VTk9SREVSRUQpCi0JCQkJU0NUUF9JTkNfU1RBVFMobmV0LCBTQ1RQX01JQl9PVVRVTk9SREVSQ0hVTktTKTsKLQkJCWVsc2UKLQkJCQlTQ1RQX0lOQ19TVEFUUyhuZXQsIFNDVFBfTUlCX09VVE9SREVSQ0hVTktTKTsKLQkJCWJyZWFrOwotCQl9CisJCXNjdHBfb3V0cV90YWlsX2RhdGEocSwgY2h1bmspOworCQlpZiAoY2h1bmstPmFzb2MtPnBlZXIucHJzY3RwX2NhcGFibGUgJiYKKwkJICAgIFNDVFBfUFJfUFJJT19FTkFCTEVEKGNodW5rLT5zaW5mby5zaW5mb19mbGFncykpCisJCQljaHVuay0+YXNvYy0+c2VudF9jbnRfcmVtb3ZhYmxlKys7CisJCWlmIChjaHVuay0+Y2h1bmtfaGRyLT5mbGFncyAmIFNDVFBfREFUQV9VTk9SREVSRUQpCisJCQlTQ1RQX0lOQ19TVEFUUyhuZXQsIFNDVFBfTUlCX09VVFVOT1JERVJDSFVOS1MpOworCQllbHNlCisJCQlTQ1RQX0lOQ19TVEFUUyhuZXQsIFNDVFBfTUlCX09VVE9SREVSQ0hVTktTKTsKIAl9IGVsc2UgewogCQlsaXN0X2FkZF90YWlsKCZjaHVuay0+bGlzdCwgJnEtPmNvbnRyb2xfY2h1bmtfbGlzdCk7CiAJCVNDVFBfSU5DX1NUQVRTKG5ldCwgU0NUUF9NSUJfT1VUQ1RSTENIVU5LUyk7CiAJfQogCi0JaWYgKGVycm9yIDwgMCkKLQkJcmV0dXJuIGVycm9yOwotCiAJaWYgKCFxLT5jb3JrKQotCQllcnJvciA9IHNjdHBfb3V0cV9mbHVzaChxLCAwLCBnZnApOwotCi0JcmV0dXJuIGVycm9yOworCQlzY3RwX291dHFfZmx1c2gocSwgMCwgZ2ZwKTsKIH0KIAogLyogSW5zZXJ0IGEgY2h1bmsgaW50byB0aGUgc29ydGVkIGxpc3QgYmFzZWQgb24gdGhlIFRTTnMuICBUaGUgcmV0cmFuc21pdCBsaXN0CkBAIC0zODMsNyArMzU0LDcgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGssIHRlbXAsIHF1ZXVlLCB0cmFuc21pdHRlZF9saXN0KSB7CiAJCWlmICghU0NUUF9QUl9QUklPX0VOQUJMRUQoY2hrLT5zaW5mby5zaW5mb19mbGFncykgfHwKLQkJICAgIGNoay0+cHJzY3RwX3BhcmFtIDw9IHNpbmZvLT5zaW5mb190aW1ldG9saXZlKQorCQkgICAgY2hrLT5zaW5mby5zaW5mb190aW1ldG9saXZlIDw9IHNpbmZvLT5zaW5mb190aW1ldG9saXZlKQogCQkJY29udGludWU7CiAKIAkJbGlzdF9kZWxfaW5pdCgmY2hrLT50cmFuc21pdHRlZF9saXN0KTsKQEAgLTQxOCw3ICszODksNyBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoaywgdGVtcCwgcXVldWUsIGxpc3QpIHsKIAkJaWYgKCFTQ1RQX1BSX1BSSU9fRU5BQkxFRChjaGstPnNpbmZvLnNpbmZvX2ZsYWdzKSB8fAotCQkgICAgY2hrLT5wcnNjdHBfcGFyYW0gPD0gc2luZm8tPnNpbmZvX3RpbWV0b2xpdmUpCisJCSAgICBjaGstPnNpbmZvLnNpbmZvX3RpbWV0b2xpdmUgPD0gc2luZm8tPnNpbmZvX3RpbWV0b2xpdmUpCiAJCQljb250aW51ZTsKIAogCQlsaXN0X2RlbF9pbml0KCZjaGstPmxpc3QpOwpAQCAtNDQyLDcgKzQxMyw3IEBACiB7CiAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0cmFuc3BvcnQ7CiAKLQlpZiAoIWFzb2MtPnByc2N0cF9lbmFibGUgfHwgIWFzb2MtPnNlbnRfY250X3JlbW92YWJsZSkKKwlpZiAoIWFzb2MtPnBlZXIucHJzY3RwX2NhcGFibGUgfHwgIWFzb2MtPnNlbnRfY250X3JlbW92YWJsZSkKIAkJcmV0dXJuOwogCiAJbXNnX2xlbiA9IHNjdHBfcHJzY3RwX3BydW5lX3NlbnQoYXNvYywgc2luZm8sCkBAIC01NTksNyArNTMwLDYgQEAKIAkJICAgICBzY3RwX3JldHJhbnNtaXRfcmVhc29uX3QgcmVhc29uKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHEtPmFzb2MtPmJhc2Uuc2spOwotCWludCBlcnJvciA9IDA7CiAKIAlzd2l0Y2ggKHJlYXNvbikgewogCWNhc2UgU0NUUF9SVFhSX1QzX1JUWDoKQEAgLTYwMywxMCArNTczLDcgQEAKIAkgKiB3aWxsIGJlIGZsdXNoZWQgYXQgdGhlIGVuZC4KIAkgKi8KIAlpZiAocmVhc29uICE9IFNDVFBfUlRYUl9GQVNUX1JUWCkKLQkJZXJyb3IgPSBzY3RwX291dHFfZmx1c2gocSwgLyogcnR4X3RpbWVvdXQgKi8gMSwgR0ZQX0FUT01JQyk7Ci0KLQlpZiAoZXJyb3IpCi0JCXEtPmFzb2MtPmJhc2Uuc2stPnNrX2VyciA9IC1lcnJvcjsKKwkJc2N0cF9vdXRxX2ZsdXNoKHEsIC8qIHJ0eF90aW1lb3V0ICovIDEsIEdGUF9BVE9NSUMpOwogfQogCiAvKgpAQCAtNzc4LDEyICs3NDUsMTIgQEAKIH0KIAogLyogQ29yayB0aGUgb3V0cXVldWUgc28gcXVldWVkIGNodW5rcyBhcmUgcmVhbGx5IHF1ZXVlZC4gKi8KLWludCBzY3RwX291dHFfdW5jb3JrKHN0cnVjdCBzY3RwX291dHEgKnEsIGdmcF90IGdmcCkKK3ZvaWQgc2N0cF9vdXRxX3VuY29yayhzdHJ1Y3Qgc2N0cF9vdXRxICpxLCBnZnBfdCBnZnApCiB7CiAJaWYgKHEtPmNvcmspCiAJCXEtPmNvcmsgPSAwOwogCi0JcmV0dXJuIHNjdHBfb3V0cV9mbHVzaChxLCAwLCBnZnApOworCXNjdHBfb3V0cV9mbHVzaChxLCAwLCBnZnApOwogfQogCiAKQEAgLTc5Niw3ICs3NjMsNyBAQAogICogbG9ja2luZyBjb25jZXJucyBtdXN0IGJlIG1hZGUuICBUb2RheSB3ZSB1c2UgdGhlIHNvY2sgbG9jayB0byBwcm90ZWN0CiAgKiB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IHNjdHBfb3V0cV9mbHVzaChzdHJ1Y3Qgc2N0cF9vdXRxICpxLCBpbnQgcnR4X3RpbWVvdXQsIGdmcF90IGdmcCkKK3N0YXRpYyB2b2lkIHNjdHBfb3V0cV9mbHVzaChzdHJ1Y3Qgc2N0cF9vdXRxICpxLCBpbnQgcnR4X3RpbWVvdXQsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3Qgc2N0cF9wYWNrZXQgKnBhY2tldDsKIAlzdHJ1Y3Qgc2N0cF9wYWNrZXQgc2luZ2xldG9uOwpAQCAtOTE5LDggKzg4NiwxMCBAQAogCQkJc2N0cF9wYWNrZXRfY29uZmlnKCZzaW5nbGV0b24sIHZ0YWcsIDApOwogCQkJc2N0cF9wYWNrZXRfYXBwZW5kX2NodW5rKCZzaW5nbGV0b24sIGNodW5rKTsKIAkJCWVycm9yID0gc2N0cF9wYWNrZXRfdHJhbnNtaXQoJnNpbmdsZXRvbiwgZ2ZwKTsKLQkJCWlmIChlcnJvciA8IDApCi0JCQkJcmV0dXJuIGVycm9yOworCQkJaWYgKGVycm9yIDwgMCkgeworCQkJCWFzb2MtPmJhc2Uuc2stPnNrX2VyciA9IC1lcnJvcjsKKwkJCQlyZXR1cm47CisJCQl9CiAJCQlicmVhazsKIAogCQljYXNlIFNDVFBfQ0lEX0FCT1JUOgpAQCAtMTAxOCw2ICs5ODcsOCBAQAogCQlyZXRyYW46CiAJCQllcnJvciA9IHNjdHBfb3V0cV9mbHVzaF9ydHgocSwgcGFja2V0LAogCQkJCQkJICAgIHJ0eF90aW1lb3V0LCAmc3RhcnRfdGltZXIpOworCQkJaWYgKGVycm9yIDwgMCkKKwkJCQlhc29jLT5iYXNlLnNrLT5za19lcnIgPSAtZXJyb3I7CiAKIAkJCWlmIChzdGFydF90aW1lcikgewogCQkJCXNjdHBfdHJhbnNwb3J0X3Jlc2V0X3QzX3J0eCh0cmFuc3BvcnQpOwpAQCAtMTA1NSw3ICsxMDI2LDcgQEAKIAogCQkJCS8qIE1hcmsgYXMgZmFpbGVkIHNlbmQuICovCiAJCQkJc2N0cF9jaHVua19mYWlsKGNodW5rLCBTQ1RQX0VSUk9SX0lOVl9TVFJNKTsKLQkJCQlpZiAoYXNvYy0+cHJzY3RwX2VuYWJsZSAmJgorCQkJCWlmIChhc29jLT5wZWVyLnByc2N0cF9jYXBhYmxlICYmCiAJCQkJICAgIFNDVFBfUFJfUFJJT19FTkFCTEVEKGNodW5rLT5zaW5mby5zaW5mb19mbGFncykpCiAJCQkJCWFzb2MtPnNlbnRfY250X3JlbW92YWJsZS0tOwogCQkJCXNjdHBfY2h1bmtfZnJlZShjaHVuayk7CkBAIC0xMTkyLDE0ICsxMTYzLDE1IEBACiAJCQkJCQkgICAgICBzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQsCiAJCQkJCQkgICAgICBzZW5kX3JlYWR5KTsKIAkJcGFja2V0ID0gJnQtPnBhY2tldDsKLQkJaWYgKCFzY3RwX3BhY2tldF9lbXB0eShwYWNrZXQpKQorCQlpZiAoIXNjdHBfcGFja2V0X2VtcHR5KHBhY2tldCkpIHsKIAkJCWVycm9yID0gc2N0cF9wYWNrZXRfdHJhbnNtaXQocGFja2V0LCBnZnApOworCQkJaWYgKGVycm9yIDwgMCkKKwkJCQlhc29jLT5iYXNlLnNrLT5za19lcnIgPSAtZXJyb3I7CisJCX0KIAogCQkvKiBDbGVhciB0aGUgYnVyc3QgbGltaXRlZCBzdGF0ZSwgaWYgYW55ICovCiAJCXNjdHBfdHJhbnNwb3J0X2J1cnN0X3Jlc2V0KHQpOwogCX0KLQotCXJldHVybiBlcnJvcjsKIH0KIAogLyogVXBkYXRlIHVuYWNrX2RhdGEgYmFzZWQgb24gdGhlIGluY29taW5nIFNBQ0sgY2h1bmsgKi8KQEAgLTEzNDcsNyArMTMxOSw3IEBACiAJCXRzbiA9IG50b2hsKHRjaHVuay0+c3ViaC5kYXRhX2hkci0+dHNuKTsKIAkJaWYgKFRTTl9sdGUodHNuLCBjdHNuKSkgewogCQkJbGlzdF9kZWxfaW5pdCgmdGNodW5rLT50cmFuc21pdHRlZF9saXN0KTsKLQkJCWlmIChhc29jLT5wcnNjdHBfZW5hYmxlICYmCisJCQlpZiAoYXNvYy0+cGVlci5wcnNjdHBfY2FwYWJsZSAmJgogCQkJICAgIFNDVFBfUFJfUFJJT19FTkFCTEVEKGNodW5rLT5zaW5mby5zaW5mb19mbGFncykpCiAJCQkJYXNvYy0+c2VudF9jbnRfcmVtb3ZhYmxlLS07CiAJCQlzY3RwX2NodW5rX2ZyZWUodGNodW5rKTsKQEAgLTE3NDcsNyArMTcxOSw3IEBACiB7CiAJaW50IGk7CiAJc2N0cF9zYWNrX3ZhcmlhYmxlX3QgKmZyYWdzOwotCV9fdTE2IGdhcDsKKwlfX3UxNiB0c25fb2Zmc2V0LCBibG9ja3M7CiAJX191MzIgY3RzbiA9IG50b2hsKHNhY2stPmN1bV90c25fYWNrKTsKIAogCWlmIChUU05fbHRlKHRzbiwgY3RzbikpCkBAIC0xNzY2LDEwICsxNzM4LDExIEBACiAJICovCiAKIAlmcmFncyA9IHNhY2stPnZhcmlhYmxlOwotCWdhcCA9IHRzbiAtIGN0c247Ci0JZm9yIChpID0gMDsgaSA8IG50b2hzKHNhY2stPm51bV9nYXBfYWNrX2Jsb2Nrcyk7ICsraSkgewotCQlpZiAoVFNOX2x0ZShudG9ocyhmcmFnc1tpXS5nYWIuc3RhcnQpLCBnYXApICYmCi0JCSAgICBUU05fbHRlKGdhcCwgbnRvaHMoZnJhZ3NbaV0uZ2FiLmVuZCkpKQorCWJsb2NrcyA9IG50b2hzKHNhY2stPm51bV9nYXBfYWNrX2Jsb2Nrcyk7CisJdHNuX29mZnNldCA9IHRzbiAtIGN0c247CisJZm9yIChpID0gMDsgaSA8IGJsb2NrczsgKytpKSB7CisJCWlmICh0c25fb2Zmc2V0ID49IG50b2hzKGZyYWdzW2ldLmdhYi5zdGFydCkgJiYKKwkJICAgIHRzbl9vZmZzZXQgPD0gbnRvaHMoZnJhZ3NbaV0uZ2FiLmVuZCkpCiAJCQlnb3RvIHBhc3M7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9wcm9jLmMgYi9uZXQvc2N0cC9wcm9jLmMKaW5kZXggZWY4YmE3Ny4uMjA2Mzc3ZiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvcHJvYy5jCisrKyBiL25ldC9zY3RwL3Byb2MuYwpAQCAtNzMsMTMgKzczLDE3IEBACiAvKiBEaXNwbGF5IHNjdHAgc25tcCBtaWIgc3RhdGlzdGljcygvcHJvYy9uZXQvc2N0cC9zbm1wKS4gKi8KIHN0YXRpYyBpbnQgc2N0cF9zbm1wX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQogeworCXVuc2lnbmVkIGxvbmcgYnVmZltTQ1RQX01JQl9NQVhdOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcS0+cHJpdmF0ZTsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IHNjdHBfc25tcF9saXN0W2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCW1lbXNldChidWZmLCAwLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBTQ1RQX01JQl9NQVgpOworCisJc25tcF9nZXRfY3B1X2ZpZWxkX2JhdGNoKGJ1ZmYsIHNjdHBfc25tcF9saXN0LAorCQkJCSBuZXQtPnNjdHAuc2N0cF9zdGF0aXN0aWNzKTsKKwlmb3IgKGkgPSAwOyBzY3RwX3NubXBfbGlzdFtpXS5uYW1lOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCVsZFxuIiwgc2N0cF9zbm1wX2xpc3RbaV0ubmFtZSwKLQkJCSAgIHNubXBfZm9sZF9maWVsZChuZXQtPnNjdHAuc2N0cF9zdGF0aXN0aWNzLAotCQkJCSAgICAgIHNjdHBfc25tcF9saXN0W2ldLmVudHJ5KSk7CisJCQkJCQlidWZmW2ldKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc2N0cF9kaWFnLmMgYi9uZXQvc2N0cC9zY3RwX2RpYWcuYwppbmRleCBiYjY5MTUzLi4wNDg5NTRlIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zY3RwX2RpYWcuYworKysgYi9uZXQvc2N0cC9zY3RwX2RpYWcuYwpAQCAtMTA2LDcgKzEwNiw4IEBACiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKIAkJCSAgICAgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMsCiAJCQkgICAgICAgaW50IHBvcnRpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgsCisJCQkgICAgICAgYm9vbCBuZXRfYWRtaW4pCiB7CiAJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwID0gc2N0cF9zayhzayktPmVwOwogCXN0cnVjdCBsaXN0X2hlYWQgKmFkZHJfbGlzdDsKQEAgLTEzMyw3ICsxMzQsNyBAQAogCQlyLT5pZGlhZ19yZXRyYW5zID0gMDsKIAl9CiAKLQlpZiAoaW5ldF9kaWFnX21zZ19hdHRyc19maWxsKHNrLCBza2IsIHIsIGV4dCwgdXNlcl9ucykpCisJaWYgKGluZXRfZGlhZ19tc2dfYXR0cnNfZmlsbChzaywgc2tiLCByLCBleHQsIHVzZXJfbnMsIG5ldF9hZG1pbikpCiAJCWdvdG8gZXJyb3V0OwogCiAJaWYgKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfU0tNRU1JTkZPIC0gMSkpKSB7CkBAIC0yMDMsNiArMjA0LDcgQEAKIAlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2I7CiAJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnI7CiAJY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGg7CisJYm9vbCBuZXRfYWRtaW47CiB9OwogCiBzdGF0aWMgc2l6ZV90IGluZXRfYXNzb2NfYXR0cl9zaXplKHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jKQpAQCAtMjE5LDYgKzIyMSw3IEBACiAJCSsgbmxhX3RvdGFsX3NpemUoMSkgLyogSU5FVF9ESUFHX1NIVVRET1dOICovCiAJCSsgbmxhX3RvdGFsX3NpemUoMSkgLyogSU5FVF9ESUFHX1RPUyAqLwogCQkrIG5sYV90b3RhbF9zaXplKDEpIC8qIElORVRfRElBR19UQ0xBU1MgKi8KKwkJKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJTkVUX0RJQUdfTUFSSyAqLwogCQkrIG5sYV90b3RhbF9zaXplKGFkZHJsZW4gKiBhc29jLT5wZWVyLnRyYW5zcG9ydF9jb3VudCkKIAkJKyBubGFfdG90YWxfc2l6ZShhZGRybGVuICogYWRkcmNudCkKIAkJKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19tZW1pbmZvKSkKQEAgLTI1Niw3ICsyNTksOCBAQAogCWVyciA9IGluZXRfc2N0cF9kaWFnX2ZpbGwoc2ssIGFzc29jLCByZXAsIHJlcSwKIAkJCQkgIHNrX3VzZXJfbnMoTkVUTElOS19DQihpbl9za2IpLnNrKSwKIAkJCQkgIE5FVExJTktfQ0IoaW5fc2tiKS5wb3J0aWQsCi0JCQkJICBubGgtPm5sbXNnX3NlcSwgMCwgbmxoKTsKKwkJCQkgIG5saC0+bmxtc2dfc2VxLCAwLCBubGgsCisJCQkJICBjb21tcC0+bmV0X2FkbWluKTsKIAlyZWxlYXNlX3NvY2soc2spOwogCWlmIChlcnIgPCAwKSB7CiAJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CkBAIC0yNzIsMjggKzI3NiwxNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgc2N0cF90c3BfZHVtcChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKnRzcCwgdm9pZCAqcCkKK3N0YXRpYyBpbnQgc2N0cF9zb2NrX2R1bXAoc3RydWN0IHNvY2sgKnNrLCB2b2lkICpwKQogewotCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCA9IHRzcC0+YXNvYy0+ZXA7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwID0gc2N0cF9zayhzayktPmVwOwogCXN0cnVjdCBzY3RwX2NvbW1fcGFyYW0gKmNvbW1wID0gcDsKLQlzdHJ1Y3Qgc29jayAqc2sgPSBlcC0+YmFzZS5zazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gY29tbXAtPnNrYjsKIAlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IgPSBjb21tcC0+Y2I7CiAJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIgPSBjb21tcC0+cjsKLQlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNzb2MgPQotCQlsaXN0X2VudHJ5KGVwLT5hc29jcy5uZXh0LCBzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiwgYXNvY3MpOworCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc3NvYzsKIAlpbnQgZXJyID0gMDsKIAotCS8qIGZpbmQgdGhlIGVwIG9ubHkgb25jZSB0aHJvdWdoIHRoZSB0cmFuc3BvcnRzIGJ5IHRoaXMgY29uZGl0aW9uICovCi0JaWYgKHRzcC0+YXNvYyAhPSBhc3NvYykKLQkJZ290byBvdXQ7Ci0KLQlpZiAoci0+c2RpYWdfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBzay0+c2tfZmFtaWx5ICE9IHItPnNkaWFnX2ZhbWlseSkKLQkJZ290byBvdXQ7Ci0KIAlsb2NrX3NvY2soc2spOwotCWlmIChzayAhPSBhc3NvYy0+YmFzZS5zaykKLQkJZ290byByZWxlYXNlOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoYXNzb2MsICZlcC0+YXNvY3MsIGFzb2NzKSB7CiAJCWlmIChjYi0+YXJnc1s0XSA8IGNiLT5hcmdzWzFdKQogCQkJZ290byBuZXh0OwpAQCAtMzEwLDkgKzMwMywxMCBAQAogCQkJCQlza191c2VyX25zKE5FVExJTktfQ0IoY2ItPnNrYikuc2spLAogCQkJCQlORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQkJY2ItPm5saC0+bmxtc2dfc2VxLAotCQkJCQlOTE1fRl9NVUxUSSwgY2ItPm5saCkgPCAwKSB7CisJCQkJCU5MTV9GX01VTFRJLCBjYi0+bmxoLAorCQkJCQljb21tcC0+bmV0X2FkbWluKSA8IDApIHsKIAkJCWNiLT5hcmdzWzNdID0gMTsKLQkJCWVyciA9IDI7CisJCQllcnIgPSAxOwogCQkJZ290byByZWxlYXNlOwogCQl9CiAJCWNiLT5hcmdzWzNdID0gMTsKQEAgLTMyMCw4ICszMTQsOSBAQAogCQlpZiAoaW5ldF9zY3RwX2RpYWdfZmlsbChzaywgYXNzb2MsIHNrYiwgciwKIAkJCQkJc2tfdXNlcl9ucyhORVRMSU5LX0NCKGNiLT5za2IpLnNrKSwKIAkJCQkJTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJCWNiLT5ubGgtPm5sbXNnX3NlcSwgMCwgY2ItPm5saCkgPCAwKSB7Ci0JCQllcnIgPSAyOworCQkJCQljYi0+bmxoLT5ubG1zZ19zZXEsIDAsIGNiLT5ubGgsCisJCQkJCWNvbW1wLT5uZXRfYWRtaW4pIDwgMCkgeworCQkJZXJyID0gMTsKIAkJCWdvdG8gcmVsZWFzZTsKIAkJfQogbmV4dDoKQEAgLTMzMywxMCArMzI4LDM1IEBACiAJY2ItPmFyZ3NbNF0gPSAwOwogcmVsZWFzZToKIAlyZWxlYXNlX3NvY2soc2spOworCXNvY2tfcHV0KHNrKTsKIAlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNjdHBfZ2V0X3NvY2soc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0c3AsIHZvaWQgKnApCit7CisJc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwID0gdHNwLT5hc29jLT5lcDsKKwlzdHJ1Y3Qgc2N0cF9jb21tX3BhcmFtICpjb21tcCA9IHA7CisJc3RydWN0IHNvY2sgKnNrID0gZXAtPmJhc2Uuc2s7CisJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiID0gY29tbXAtPmNiOworCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyID0gY29tbXAtPnI7CisJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzc29jID0KKwkJbGlzdF9lbnRyeShlcC0+YXNvY3MubmV4dCwgc3RydWN0IHNjdHBfYXNzb2NpYXRpb24sIGFzb2NzKTsKKworCS8qIGZpbmQgdGhlIGVwIG9ubHkgb25jZSB0aHJvdWdoIHRoZSB0cmFuc3BvcnRzIGJ5IHRoaXMgY29uZGl0aW9uICovCisJaWYgKHRzcC0+YXNvYyAhPSBhc3NvYykKKwkJZ290byBvdXQ7CisKKwlpZiAoci0+c2RpYWdfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBzay0+c2tfZmFtaWx5ICE9IHItPnNkaWFnX2ZhbWlseSkKKwkJZ290byBvdXQ7CisKKwlzb2NrX2hvbGQoc2spOworCWNiLT5hcmdzWzVdID0gKGxvbmcpc2s7CisKKwlyZXR1cm4gMTsKKwogb3V0OgogCWNiLT5hcmdzWzJdKys7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzY3RwX2VwX2R1bXAoc3RydWN0IHNjdHBfZW5kcG9pbnQgKmVwLCB2b2lkICpwKQpAQCAtMzc1LDcgKzM5NSw3IEBACiAJCQkJc2tfdXNlcl9ucyhORVRMSU5LX0NCKGNiLT5za2IpLnNrKSwKIAkJCQlORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKIAkJCQljYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAotCQkJCWNiLT5ubGgpIDwgMCkgeworCQkJCWNiLT5ubGgsIGNvbW1wLT5uZXRfYWRtaW4pIDwgMCkgewogCQllcnIgPSAyOwogCQlnb3RvIG91dDsKIAl9CkBAIC00MTIsNiArNDMyLDcgQEAKIAkJLnNrYiA9IGluX3NrYiwKIAkJLnIgPSByZXEsCiAJCS5ubGggPSBubGgsCisJCS5uZXRfYWRtaW4gPSBuZXRsaW5rX25ldF9jYXBhYmxlKGluX3NrYiwgQ0FQX05FVF9BRE1JTiksCiAJfTsKIAogCWlmIChyZXEtPnNkaWFnX2ZhbWlseSA9PSBBRl9JTkVUKSB7CkBAIC00MjQsMTEgKzQ0NSwxMyBAQAogCQlwYWRkci52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKIAl9IGVsc2UgewogCQlsYWRkci52Ni5zaW42X3BvcnQgPSByZXEtPmlkLmlkaWFnX3Nwb3J0OwotCQltZW1jcHkoJmxhZGRyLnY2LnNpbjZfYWRkciwgcmVxLT5pZC5pZGlhZ19zcmMsIDY0KTsKKwkJbWVtY3B5KCZsYWRkci52Ni5zaW42X2FkZHIsIHJlcS0+aWQuaWRpYWdfc3JjLAorCQkgICAgICAgc2l6ZW9mKGxhZGRyLnY2LnNpbjZfYWRkcikpOwogCQlsYWRkci52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwogCiAJCXBhZGRyLnY2LnNpbjZfcG9ydCA9IHJlcS0+aWQuaWRpYWdfZHBvcnQ7Ci0JCW1lbWNweSgmcGFkZHIudjYuc2luNl9hZGRyLCByZXEtPmlkLmlkaWFnX2RzdCwgNjQpOworCQltZW1jcHkoJnBhZGRyLnY2LnNpbjZfYWRkciwgcmVxLT5pZC5pZGlhZ19kc3QsCisJCSAgICAgICBzaXplb2YocGFkZHIudjYuc2luNl9hZGRyKSk7CiAJCXBhZGRyLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAJfQogCkBAIC00NDUsNiArNDY4LDcgQEAKIAkJLnNrYiA9IHNrYiwKIAkJLmNiID0gY2IsCiAJCS5yID0gciwKKwkJLm5ldF9hZG1pbiA9IG5ldGxpbmtfbmV0X2NhcGFibGUoY2ItPnNrYiwgQ0FQX05FVF9BRE1JTiksCiAJfTsKIAogCS8qIGVwcyBoYXNodGFibGUgZHVtcHMKQEAgLTQ3MCwxMCArNDk0LDE4IEBACiAJICogMiA6IHRvIHJlY29yZCB0aGUgdHJhbnNwb3J0IHBvcyBvZiB0aGlzIHRpbWUncyB0cmF2ZXJzYWwKIAkgKiAzIDogdG8gbWFyayBpZiB3ZSBoYXZlIGR1bXBlZCB0aGUgZXAgaW5mbyBvZiB0aGUgY3VycmVudCBhc29jCiAJICogNCA6IHRvIHdvcmsgYXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgdG8gdHJhdmVyc2FsIGxpc3QKKwkgKiA1IDogdG8gc2F2ZSB0aGUgc2sgd2UgZ2V0IGZyb20gdHJhdmVsc2luZyB0aGUgdHNwIGxpc3QuCiAJICovCiAJaWYgKCEoaWRpYWdfc3RhdGVzICYgfihUQ1BGX0xJU1RFTiB8IFRDUEZfQ0xPU0UpKSkKIAkJZ290byBkb25lOwotCXNjdHBfZm9yX2VhY2hfdHJhbnNwb3J0KHNjdHBfdHNwX2R1bXAsIG5ldCwgY2ItPmFyZ3NbMl0sICZjb21tcCk7CisKK25leHQ6CisJY2ItPmFyZ3NbNV0gPSAwOworCXNjdHBfZm9yX2VhY2hfdHJhbnNwb3J0KHNjdHBfZ2V0X3NvY2ssIG5ldCwgY2ItPmFyZ3NbMl0sICZjb21tcCk7CisKKwlpZiAoY2ItPmFyZ3NbNV0gJiYgIXNjdHBfc29ja19kdW1wKChzdHJ1Y3Qgc29jayAqKWNiLT5hcmdzWzVdLCAmY29tbXApKQorCQlnb3RvIG5leHQ7CisKIGRvbmU6CiAJY2ItPmFyZ3NbMV0gPSBjYi0+YXJnc1s0XTsKIAljYi0+YXJnc1s0XSA9IDA7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMgYi9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKaW5kZXggOGM3N2I4Ny4uOWU5NjkwYiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCisrKyBiL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYwpAQCAtMjUzLDcgKzI1Myw3IEBACiAJbnVtX3R5cGVzID0gc3AtPnBmLT5zdXBwb3J0ZWRfYWRkcnMoc3AsIHR5cGVzKTsKIAogCWNodW5rc2l6ZSA9IHNpemVvZihpbml0KSArIGFkZHJzX2xlbjsKLQljaHVua3NpemUgKz0gV09SRF9ST1VORChTQ1RQX1NBVF9MRU4obnVtX3R5cGVzKSk7CisJY2h1bmtzaXplICs9IFNDVFBfUEFENChTQ1RQX1NBVF9MRU4obnVtX3R5cGVzKSk7CiAJY2h1bmtzaXplICs9IHNpemVvZihlY2FwX3BhcmFtKTsKIAogCWlmIChhc29jLT5wcnNjdHBfZW5hYmxlKQpAQCAtMjgzLDE0ICsyODMsMTQgQEAKIAkJLyogQWRkIEhNQUNTIHBhcmFtZXRlciBsZW5ndGggaWYgYW55IHdlcmUgZGVmaW5lZCAqLwogCQlhdXRoX2htYWNzID0gKHNjdHBfcGFyYW1oZHJfdCAqKWFzb2MtPmMuYXV0aF9obWFjczsKIAkJaWYgKGF1dGhfaG1hY3MtPmxlbmd0aCkKLQkJCWNodW5rc2l6ZSArPSBXT1JEX1JPVU5EKG50b2hzKGF1dGhfaG1hY3MtPmxlbmd0aCkpOworCQkJY2h1bmtzaXplICs9IFNDVFBfUEFENChudG9ocyhhdXRoX2htYWNzLT5sZW5ndGgpKTsKIAkJZWxzZQogCQkJYXV0aF9obWFjcyA9IE5VTEw7CiAKIAkJLyogQWRkIENIVU5LUyBwYXJhbWV0ZXIgbGVuZ3RoICovCiAJCWF1dGhfY2h1bmtzID0gKHNjdHBfcGFyYW1oZHJfdCAqKWFzb2MtPmMuYXV0aF9jaHVua3M7CiAJCWlmIChhdXRoX2NodW5rcy0+bGVuZ3RoKQotCQkJY2h1bmtzaXplICs9IFdPUkRfUk9VTkQobnRvaHMoYXV0aF9jaHVua3MtPmxlbmd0aCkpOworCQkJY2h1bmtzaXplICs9IFNDVFBfUEFENChudG9ocyhhdXRoX2NodW5rcy0+bGVuZ3RoKSk7CiAJCWVsc2UKIAkJCWF1dGhfY2h1bmtzID0gTlVMTDsKIApAQCAtMzAwLDggKzMwMCw4IEBACiAKIAkvKiBJZiB3ZSBoYXZlIGFueSBleHRlbnNpb25zIHRvIHJlcG9ydCwgYWNjb3VudCBmb3IgdGhhdCAqLwogCWlmIChudW1fZXh0KQotCQljaHVua3NpemUgKz0gV09SRF9ST1VORChzaXplb2Yoc2N0cF9zdXBwb3J0ZWRfZXh0X3BhcmFtX3QpICsKLQkJCQkJbnVtX2V4dCk7CisJCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQoc2l6ZW9mKHNjdHBfc3VwcG9ydGVkX2V4dF9wYXJhbV90KSArCisJCQkJICAgICAgIG51bV9leHQpOwogCiAJLyogUkZDIDI5NjAgMy4zLjIgSW5pdGlhdGlvbiAoSU5JVCkgKDEpCiAJICoKQEAgLTQ0MywxMyArNDQzLDEzIEBACiAKIAkJYXV0aF9obWFjcyA9IChzY3RwX3BhcmFtaGRyX3QgKilhc29jLT5jLmF1dGhfaG1hY3M7CiAJCWlmIChhdXRoX2htYWNzLT5sZW5ndGgpCi0JCQljaHVua3NpemUgKz0gV09SRF9ST1VORChudG9ocyhhdXRoX2htYWNzLT5sZW5ndGgpKTsKKwkJCWNodW5rc2l6ZSArPSBTQ1RQX1BBRDQobnRvaHMoYXV0aF9obWFjcy0+bGVuZ3RoKSk7CiAJCWVsc2UKIAkJCWF1dGhfaG1hY3MgPSBOVUxMOwogCiAJCWF1dGhfY2h1bmtzID0gKHNjdHBfcGFyYW1oZHJfdCAqKWFzb2MtPmMuYXV0aF9jaHVua3M7CiAJCWlmIChhdXRoX2NodW5rcy0+bGVuZ3RoKQotCQkJY2h1bmtzaXplICs9IFdPUkRfUk9VTkQobnRvaHMoYXV0aF9jaHVua3MtPmxlbmd0aCkpOworCQkJY2h1bmtzaXplICs9IFNDVFBfUEFENChudG9ocyhhdXRoX2NodW5rcy0+bGVuZ3RoKSk7CiAJCWVsc2UKIAkJCWF1dGhfY2h1bmtzID0gTlVMTDsKIApAQCAtNDU4LDggKzQ1OCw4IEBACiAJfQogCiAJaWYgKG51bV9leHQpCi0JCWNodW5rc2l6ZSArPSBXT1JEX1JPVU5EKHNpemVvZihzY3RwX3N1cHBvcnRlZF9leHRfcGFyYW1fdCkgKwotCQkJCQludW1fZXh0KTsKKwkJY2h1bmtzaXplICs9IFNDVFBfUEFENChzaXplb2Yoc2N0cF9zdXBwb3J0ZWRfZXh0X3BhcmFtX3QpICsKKwkJCQkgICAgICAgbnVtX2V4dCk7CiAKIAkvKiBOb3cgYWxsb2NhdGUgYW5kIGZpbGwgb3V0IHRoZSBjaHVuay4gICovCiAJcmV0dmFsID0gc2N0cF9tYWtlX2NvbnRyb2woYXNvYywgU0NUUF9DSURfSU5JVF9BQ0ssIDAsIGNodW5rc2l6ZSwgZ2ZwKTsKQEAgLTcwNiwyMCArNzA2LDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgdm9pZCBzY3RwX3NldF9wcnNjdHBfcG9saWN5KHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaywKLQkJCQkgICBjb25zdCBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbykKLXsKLQlpZiAoIWNodW5rLT5hc29jLT5wcnNjdHBfZW5hYmxlKQotCQlyZXR1cm47Ci0KLQlpZiAoU0NUUF9QUl9UVExfRU5BQkxFRChzaW5mby0+c2luZm9fZmxhZ3MpKQotCQljaHVuay0+cHJzY3RwX3BhcmFtID0KLQkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHNpbmZvLT5zaW5mb190aW1ldG9saXZlKTsKLQllbHNlIGlmIChTQ1RQX1BSX1JUWF9FTkFCTEVEKHNpbmZvLT5zaW5mb19mbGFncykgfHwKLQkJIFNDVFBfUFJfUFJJT19FTkFCTEVEKHNpbmZvLT5zaW5mb19mbGFncykpCi0JCWNodW5rLT5wcnNjdHBfcGFyYW0gPSBzaW5mby0+c2luZm9fdGltZXRvbGl2ZTsKLX0KLQogLyogTWFrZSBhIERBVEEgY2h1bmsgZm9yIHRoZSBnaXZlbiBhc3NvY2lhdGlvbiBmcm9tIHRoZSBwcm92aWRlZAogICogcGFyYW1ldGVycy4gIEhvd2V2ZXIsIGRvIG5vdCBwb3B1bGF0ZSB0aGUgZGF0YSBwYXlsb2FkLgogICovCkBAIC03NTMsNyArNzM5LDYgQEAKIAogCXJldHZhbC0+c3ViaC5kYXRhX2hkciA9IHNjdHBfYWRkdG9fY2h1bmsocmV0dmFsLCBzaXplb2YoZHApLCAmZHApOwogCW1lbWNweSgmcmV0dmFsLT5zaW5mbywgc2luZm8sIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7Ci0Jc2N0cF9zZXRfcHJzY3RwX3BvbGljeShyZXR2YWwsIHNpbmZvKTsKIAogbm9kYXRhOgogCXJldHVybiByZXR2YWw7CkBAIC0xMzkwLDcgKzEzNzUsNyBAQAogCXN0cnVjdCBzb2NrICpzazsKIAogCS8qIE5vIG5lZWQgdG8gYWxsb2NhdGUgTEwgaGVyZSwgYXMgdGhpcyBpcyBvbmx5IGEgY2h1bmsuICovCi0Jc2tiID0gYWxsb2Nfc2tiKFdPUkRfUk9VTkQoc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkgKyBwYXlsZW4pLCBnZnApOworCXNrYiA9IGFsbG9jX3NrYihTQ1RQX1BBRDQoc2l6ZW9mKHNjdHBfY2h1bmtoZHJfdCkgKyBwYXlsZW4pLCBnZnApOwogCWlmICghc2tiKQogCQlnb3RvIG5vZGF0YTsKIApAQCAtMTQ4Miw3ICsxNDY3LDcgQEAKIAl2b2lkICp0YXJnZXQ7CiAJdm9pZCAqcGFkZGluZzsKIAlpbnQgY2h1bmtsZW4gPSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpOwotCWludCBwYWRsZW4gPSBXT1JEX1JPVU5EKGNodW5rbGVuKSAtIGNodW5rbGVuOworCWludCBwYWRsZW4gPSBTQ1RQX1BBRDQoY2h1bmtsZW4pIC0gY2h1bmtsZW47CiAKIAlwYWRkaW5nID0gc2tiX3B1dChjaHVuay0+c2tiLCBwYWRsZW4pOwogCXRhcmdldCA9IHNrYl9wdXQoY2h1bmstPnNrYiwgbGVuKTsKQEAgLTE5MDAsNyArMTg4NSw3IEBACiAJc3RydWN0IF9fc2N0cF9taXNzaW5nIHJlcG9ydDsKIAlfX3UxNiBsZW47CiAKLQlsZW4gPSBXT1JEX1JPVU5EKHNpemVvZihyZXBvcnQpKTsKKwlsZW4gPSBTQ1RQX1BBRDQoc2l6ZW9mKHJlcG9ydCkpOwogCiAJLyogTWFrZSBhbiBFUlJPUiBjaHVuaywgcHJlcGFyaW5nIGVub3VnaCByb29tIGZvcgogCSAqIHJldHVybmluZyBtdWx0aXBsZSB1bmtub3duIHBhcmFtZXRlcnMuCkBAIC0yMDk4LDkgKzIwODMsOSBAQAogCiAJCWlmICgqZXJycCkgewogCQkJaWYgKCFzY3RwX2luaXRfY2F1c2VfZml4ZWQoKmVycnAsIFNDVFBfRVJST1JfVU5LTk9XTl9QQVJBTSwKLQkJCQkJV09SRF9ST1VORChudG9ocyhwYXJhbS5wLT5sZW5ndGgpKSkpCisJCQkJCVNDVFBfUEFENChudG9ocyhwYXJhbS5wLT5sZW5ndGgpKSkpCiAJCQkJc2N0cF9hZGR0b19jaHVua19maXhlZCgqZXJycCwKLQkJCQkJCVdPUkRfUk9VTkQobnRvaHMocGFyYW0ucC0+bGVuZ3RoKSksCisJCQkJCQlTQ1RQX1BBRDQobnRvaHMocGFyYW0ucC0+bGVuZ3RoKSksCiAJCQkJCQlwYXJhbS52KTsKIAkJfSBlbHNlIHsKIAkJCS8qIElmIHRoZXJlIGlzIG5vIG1lbW9yeSBmb3IgZ2VuZXJhdGluZyB0aGUgRVJST1IKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwppbmRleCAxMmQ0NTE5Li5jMzQ1YmYxIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKKysrIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCkBAIC0xMDIwLDE5ICsxMDIwLDEzIEBACiAgKiBUaGlzIHdheSB0aGUgd2hvbGUgbWVzc2FnZSBpcyBxdWV1ZWQgdXAgYW5kIGJ1bmRsaW5nIGlmCiAgKiBlbmNvdXJhZ2VkIGZvciBzbWFsbCBmcmFnbWVudHMuCiAgKi8KLXN0YXRpYyBpbnQgc2N0cF9jbWRfc2VuZF9tc2coc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2MsCi0JCQkJc3RydWN0IHNjdHBfZGF0YW1zZyAqbXNnLCBnZnBfdCBnZnApCitzdGF0aWMgdm9pZCBzY3RwX2NtZF9zZW5kX21zZyhzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYywKKwkJCSAgICAgIHN0cnVjdCBzY3RwX2RhdGFtc2cgKm1zZywgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCBzY3RwX2NodW5rICpjaHVuazsKLQlpbnQgZXJyb3IgPSAwOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaHVuaywgJm1zZy0+Y2h1bmtzLCBmcmFnX2xpc3QpIHsKLQkJZXJyb3IgPSBzY3RwX291dHFfdGFpbCgmYXNvYy0+b3V0cXVldWUsIGNodW5rLCBnZnApOwotCQlpZiAoZXJyb3IpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyb3I7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaHVuaywgJm1zZy0+Y2h1bmtzLCBmcmFnX2xpc3QpCisJCXNjdHBfb3V0cV90YWlsKCZhc29jLT5vdXRxdWV1ZSwgY2h1bmssIGdmcCk7CiB9CiAKIApAQCAtMTQyNyw4ICsxNDIxLDcgQEAKIAkJCQlsb2NhbF9jb3JrID0gMTsKIAkJCX0KIAkJCS8qIFNlbmQgYSBjaHVuayB0byBvdXIgcGVlci4gICovCi0JCQllcnJvciA9IHNjdHBfb3V0cV90YWlsKCZhc29jLT5vdXRxdWV1ZSwgY21kLT5vYmouY2h1bmssCi0JCQkJCSAgICAgICBnZnApOworCQkJc2N0cF9vdXRxX3RhaWwoJmFzb2MtPm91dHF1ZXVlLCBjbWQtPm9iai5jaHVuaywgZ2ZwKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgU0NUUF9DTURfU0VORF9QS1Q6CkBAIC0xNjgyLDcgKzE2NzUsNyBAQAogCQljYXNlIFNDVFBfQ01EX0ZPUkNFX1BSSU1fUkVUUkFOOgogCQkJdCA9IGFzb2MtPnBlZXIucmV0cmFuX3BhdGg7CiAJCQlhc29jLT5wZWVyLnJldHJhbl9wYXRoID0gYXNvYy0+cGVlci5wcmltYXJ5X3BhdGg7Ci0JCQllcnJvciA9IHNjdHBfb3V0cV91bmNvcmsoJmFzb2MtPm91dHF1ZXVlLCBnZnApOworCQkJc2N0cF9vdXRxX3VuY29yaygmYXNvYy0+b3V0cXVldWUsIGdmcCk7CiAJCQlsb2NhbF9jb3JrID0gMDsKIAkJCWFzb2MtPnBlZXIucmV0cmFuX3BhdGggPSB0OwogCQkJYnJlYWs7CkBAIC0xNzA5LDcgKzE3MDIsNyBAQAogCQkJCXNjdHBfb3V0cV9jb3JrKCZhc29jLT5vdXRxdWV1ZSk7CiAJCQkJbG9jYWxfY29yayA9IDE7CiAJCQl9Ci0JCQllcnJvciA9IHNjdHBfY21kX3NlbmRfbXNnKGFzb2MsIGNtZC0+b2JqLm1zZywgZ2ZwKTsKKwkJCXNjdHBfY21kX3NlbmRfbXNnKGFzb2MsIGNtZC0+b2JqLm1zZywgZ2ZwKTsKIAkJCWJyZWFrOwogCQljYXNlIFNDVFBfQ01EX1NFTkRfTkVYVF9BU0NPTkY6CiAJCQlzY3RwX2NtZF9zZW5kX2FzY29uZihhc29jKTsKQEAgLTE3MzksOSArMTczMiw5IEBACiAJICovCiAJaWYgKGFzb2MgJiYgU0NUUF9FVkVOVF9UX0NIVU5LID09IGV2ZW50X3R5cGUgJiYgY2h1bmspIHsKIAkJaWYgKGNodW5rLT5lbmRfb2ZfcGFja2V0IHx8IGNodW5rLT5zaW5nbGV0b24pCi0JCQllcnJvciA9IHNjdHBfb3V0cV91bmNvcmsoJmFzb2MtPm91dHF1ZXVlLCBnZnApOworCQkJc2N0cF9vdXRxX3VuY29yaygmYXNvYy0+b3V0cXVldWUsIGdmcCk7CiAJfSBlbHNlIGlmIChsb2NhbF9jb3JrKQotCQllcnJvciA9IHNjdHBfb3V0cV91bmNvcmsoJmFzb2MtPm91dHF1ZXVlLCBnZnApOworCQlzY3RwX291dHFfdW5jb3JrKCZhc29jLT5vdXRxdWV1ZSwgZ2ZwKTsKIAogCWlmIChzcC0+ZGF0YV9yZWFkeV9zaWduYWxsZWQpCiAJCXNwLT5kYXRhX3JlYWR5X3NpZ25hbGxlZCA9IDA7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zbV9zdGF0ZWZ1bnMuYyBiL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCmluZGV4IGQ4OGJiMmIuLjAyNmUzYmMgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCisrKyBiL25ldC9zY3RwL3NtX3N0YXRlZnVucy5jCkBAIC0zNDU0LDcgKzM0NTQsNyBAQAogCQl9CiAKIAkJLyogUmVwb3J0IHZpb2xhdGlvbiBpZiBjaHVuayBsZW4gb3ZlcmZsb3dzICovCi0JCWNoX2VuZCA9ICgoX191OCAqKWNoKSArIFdPUkRfUk9VTkQobnRvaHMoY2gtPmxlbmd0aCkpOworCQljaF9lbmQgPSAoKF9fdTggKiljaCkgKyBTQ1RQX1BBRDQobnRvaHMoY2gtPmxlbmd0aCkpOwogCQlpZiAoY2hfZW5kID4gc2tiX3RhaWxfcG9pbnRlcihza2IpKQogCQkJcmV0dXJuIHNjdHBfc2ZfdmlvbGF0aW9uX2NodW5rbGVuKG5ldCwgZXAsIGFzb2MsIHR5cGUsIGFyZywKIAkJCQkJCSAgY29tbWFuZHMpOwpAQCAtNDE4NSw3ICs0MTg1LDcgQEAKIAkJaGRyID0gdW5rX2NodW5rLT5jaHVua19oZHI7CiAJCWVycl9jaHVuayA9IHNjdHBfbWFrZV9vcF9lcnJvcihhc29jLCB1bmtfY2h1bmssCiAJCQkJCSAgICAgICBTQ1RQX0VSUk9SX1VOS05PV05fQ0hVTkssIGhkciwKLQkJCQkJICAgICAgIFdPUkRfUk9VTkQobnRvaHMoaGRyLT5sZW5ndGgpKSwKKwkJCQkJICAgICAgIFNDVFBfUEFENChudG9ocyhoZHItPmxlbmd0aCkpLAogCQkJCQkgICAgICAgMCk7CiAJCWlmIChlcnJfY2h1bmspIHsKIAkJCXNjdHBfYWRkX2NtZF9zZihjb21tYW5kcywgU0NUUF9DTURfUkVQTFksCkBAIC00MjAzLDcgKzQyMDMsNyBAQAogCQloZHIgPSB1bmtfY2h1bmstPmNodW5rX2hkcjsKIAkJZXJyX2NodW5rID0gc2N0cF9tYWtlX29wX2Vycm9yKGFzb2MsIHVua19jaHVuaywKIAkJCQkJICAgICAgIFNDVFBfRVJST1JfVU5LTk9XTl9DSFVOSywgaGRyLAotCQkJCQkgICAgICAgV09SRF9ST1VORChudG9ocyhoZHItPmxlbmd0aCkpLAorCQkJCQkgICAgICAgU0NUUF9QQUQ0KG50b2hzKGhkci0+bGVuZ3RoKSksCiAJCQkJCSAgICAgICAwKTsKIAkJaWYgKGVycl9jaHVuaykgewogCQkJc2N0cF9hZGRfY21kX3NmKGNvbW1hbmRzLCBTQ1RQX0NNRF9SRVBMWSwKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NvY2tldC5jIGIvbmV0L3NjdHAvc29ja2V0LmMKaW5kZXggOWZjNDE3YS4uZmIwMmM3MCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc29ja2V0LmMKKysrIGIvbmV0L3NjdHAvc29ja2V0LmMKQEAgLTE5NTgsNiArMTk1OCw4IEBACiAKIAkvKiBOb3cgc2VuZCB0aGUgKHBvc3NpYmx5KSBmcmFnbWVudGVkIG1lc3NhZ2UuICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaHVuaywgJmRhdGFtc2ctPmNodW5rcywgZnJhZ19saXN0KSB7CisJCXNjdHBfY2h1bmtfaG9sZChjaHVuayk7CisKIAkJLyogRG8gYWNjb3VudGluZyBmb3IgdGhlIHdyaXRlIHNwYWNlLiAgKi8KIAkJc2N0cF9zZXRfb3duZXJfdyhjaHVuayk7CiAKQEAgLTE5NzAsMTMgKzE5NzIsMTUgQEAKIAkgKiBicmVha3MuCiAJICovCiAJZXJyID0gc2N0cF9wcmltaXRpdmVfU0VORChuZXQsIGFzb2MsIGRhdGFtc2cpOwotCXNjdHBfZGF0YW1zZ19wdXQoZGF0YW1zZyk7CiAJLyogRGlkIHRoZSBsb3dlciBsYXllciBhY2NlcHQgdGhlIGNodW5rPyAqLwotCWlmIChlcnIpCisJaWYgKGVycikgeworCQlzY3RwX2RhdGFtc2dfZnJlZShkYXRhbXNnKTsKIAkJZ290byBvdXRfZnJlZTsKKwl9CiAKIAlwcl9kZWJ1ZygiJXM6IHdlIHNlbnQgcHJpbWl0aXZlbHlcbiIsIF9fZnVuY19fKTsKIAorCXNjdHBfZGF0YW1zZ19wdXQoZGF0YW1zZyk7CiAJZXJyID0gbXNnX2xlbjsKIAogCWlmICh1bmxpa2VseSh3YWl0X2Nvbm5lY3QpKSB7CkBAIC00NDY5LDE3ICs0NDczLDIxIEBACiAJCQkJICBjb25zdCB1bmlvbiBzY3RwX2FkZHIgKnBhZGRyLCB2b2lkICpwKQogewogCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnNwb3J0OwotCWludCBlcnIgPSAwOworCWludCBlcnIgPSAtRU5PRU5UOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCXRyYW5zcG9ydCA9IHNjdHBfYWRkcnNfbG9va3VwX3RyYW5zcG9ydChuZXQsIGxhZGRyLCBwYWRkcik7CiAJaWYgKCF0cmFuc3BvcnQgfHwgIXNjdHBfdHJhbnNwb3J0X2hvbGQodHJhbnNwb3J0KSkKIAkJZ290byBvdXQ7Ci0JZXJyID0gY2IodHJhbnNwb3J0LCBwKTsKKworCXNjdHBfYXNzb2NpYXRpb25faG9sZCh0cmFuc3BvcnQtPmFzb2MpOwogCXNjdHBfdHJhbnNwb3J0X3B1dCh0cmFuc3BvcnQpOwogCi1vdXQ6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CisJZXJyID0gY2IodHJhbnNwb3J0LCBwKTsKKwlzY3RwX2Fzc29jaWF0aW9uX3B1dCh0cmFuc3BvcnQtPmFzb2MpOworCitvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNjdHBfdHJhbnNwb3J0X2xvb2t1cF9wcm9jZXNzKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3RyYW5zcG9ydC5jIGIvbmV0L3NjdHAvdHJhbnNwb3J0LmMKaW5kZXggODFiODY2Ny4uY2U1NGRjZSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvdHJhbnNwb3J0LmMKKysrIGIvbmV0L3NjdHAvdHJhbnNwb3J0LmMKQEAgLTIzMyw3ICsyMzMsNyBAQAogCX0KIAogCWlmICh0cmFuc3BvcnQtPmRzdCkgewotCQl0cmFuc3BvcnQtPnBhdGhtdHUgPSBXT1JEX1RSVU5DKGRzdF9tdHUodHJhbnNwb3J0LT5kc3QpKTsKKwkJdHJhbnNwb3J0LT5wYXRobXR1ID0gU0NUUF9UUlVOQzQoZHN0X210dSh0cmFuc3BvcnQtPmRzdCkpOwogCX0gZWxzZQogCQl0cmFuc3BvcnQtPnBhdGhtdHUgPSBTQ1RQX0RFRkFVTFRfTUFYU0VHTUVOVDsKIH0KQEAgLTI4Nyw3ICsyODcsNyBAQAogCQlyZXR1cm47CiAJfQogCWlmICh0cmFuc3BvcnQtPmRzdCkgewotCQl0cmFuc3BvcnQtPnBhdGhtdHUgPSBXT1JEX1RSVU5DKGRzdF9tdHUodHJhbnNwb3J0LT5kc3QpKTsKKwkJdHJhbnNwb3J0LT5wYXRobXR1ID0gU0NUUF9UUlVOQzQoZHN0X210dSh0cmFuc3BvcnQtPmRzdCkpOwogCiAJCS8qIEluaXRpYWxpemUgc2stPnNrX3Jjdl9zYWRkciwgaWYgdGhlIHRyYW5zcG9ydCBpcyB0aGUKIAkJICogYXNzb2NpYXRpb24ncyBhY3RpdmUgcGF0aCBmb3IgZ2V0c29ja25hbWUoKS4KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3VscGV2ZW50LmMgYi9uZXQvc2N0cC91bHBldmVudC5jCmluZGV4IGQ4NWI4MDMuLmJlYTAwMDUgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3VscGV2ZW50LmMKKysrIGIvbmV0L3NjdHAvdWxwZXZlbnQuYwpAQCAtMzgzLDcgKzM4Myw3IEBACiAKIAljaCA9IChzY3RwX2Vycmhkcl90ICopKGNodW5rLT5za2ItPmRhdGEpOwogCWNhdXNlID0gY2gtPmNhdXNlOwotCWVsZW4gPSBXT1JEX1JPVU5EKG50b2hzKGNoLT5sZW5ndGgpKSAtIHNpemVvZihzY3RwX2Vycmhkcl90KTsKKwllbGVuID0gU0NUUF9QQUQ0KG50b2hzKGNoLT5sZW5ndGgpKSAtIHNpemVvZihzY3RwX2Vycmhkcl90KTsKIAogCS8qIFB1bGwgb2ZmIHRoZSBFUlJPUiBoZWFkZXIuICAqLwogCXNrYl9wdWxsKGNodW5rLT5za2IsIHNpemVvZihzY3RwX2Vycmhkcl90KSk7CkBAIC02ODgsNyArNjg4LDcgQEAKIAkgKiBNVVNUIGlnbm9yZSB0aGUgcGFkZGluZyBieXRlcy4KIAkgKi8KIAlsZW4gPSBudG9ocyhjaHVuay0+Y2h1bmtfaGRyLT5sZW5ndGgpOwotCXBhZGRpbmcgPSBXT1JEX1JPVU5EKGxlbikgLSBsZW47CisJcGFkZGluZyA9IFNDVFBfUEFENChsZW4pIC0gbGVuOwogCiAJLyogRml4dXAgY2xvbmVkIHNrYiB3aXRoIGp1c3QgdGhpcyBjaHVua3MgZGF0YS4gICovCiAJc2tiX3RyaW0oc2tiLCBjaHVuay0+Y2h1bmtfZW5kIC0gcGFkZGluZyAtIHNrYi0+ZGF0YSk7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC91bHBxdWV1ZS5jIGIvbmV0L3NjdHAvdWxwcXVldWUuYwppbmRleCA4NzdlNTUwLi44NGQwZmRhIDEwMDY0NAotLS0gYS9uZXQvc2N0cC91bHBxdWV1ZS5jCisrKyBiL25ldC9zY3RwL3VscHF1ZXVlLmMKQEAgLTE0MCwxMSArMTQwLDggQEAKIAkJICogd2UgY2FuIGdvIGFoZWFkIGFuZCBjbGVhciBvdXQgdGhlIGxvYmJ5IGluIG9uZSBzaG90CiAJCSAqLwogCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmc3AtPnBkX2xvYmJ5KSkgewotCQkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKIAkJCXNrYl9xdWV1ZV9zcGxpY2VfdGFpbF9pbml0KCZzcC0+cGRfbG9iYnksCiAJCQkJCQkgICAmc2stPnNrX3JlY2VpdmVfcXVldWUpOwotCQkJbGlzdCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopJnNjdHBfc2soc2spLT5wZF9sb2JieTsKLQkJCUlOSVRfTElTVF9IRUFEKGxpc3QpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbmV0L3N0cnBhcnNlci9LY29uZmlnIGIvbmV0L3N0cnBhcnNlci9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZmYzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3RycGFyc2VyL0tjb25maWcKQEAgLTAsMCArMSw0IEBACisKK2NvbmZpZyBTVFJFQU1fUEFSU0VSCisJdHJpc3RhdGUKKwlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL25ldC9zdHJwYXJzZXIvTWFrZWZpbGUgYi9uZXQvc3RycGFyc2VyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OGExMjYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvc3RycGFyc2VyL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19TVFJFQU1fUEFSU0VSKSArPSBzdHJwYXJzZXIubwpkaWZmIC0tZ2l0IGEvbmV0L3N0cnBhcnNlci9zdHJwYXJzZXIuYyBiL25ldC9zdHJwYXJzZXIvc3RycGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3NTQ5YgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9zdHJwYXJzZXIvc3RycGFyc2VyLmMKQEAgLTAsMCArMSw1MTAgQEAKKy8qCisgKiBTdHJlYW0gUGFyc2VyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFRvbSBIZXJiZXJ0IDx0b21AaGVyYmVydGxhbmQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJycXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxuZXQvc3RycGFyc2VyLmg+CisjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnN0cnBfd3E7CisKK3N0cnVjdCBfc3RycF9yeF9tc2cgeworCS8qIEludGVybmFsIGNiIHN0cnVjdHVyZS4gc3RydWN0IHN0cnBfcnhfbXNnIG11c3QgYmUgZmlyc3QgZm9yIHBhc3NpbmcKKwkgKiB0byB1cHBlciBsYXllci4KKwkgKi8KKwlzdHJ1Y3Qgc3RycF9yeF9tc2cgc3RycDsKKwlpbnQgYWNjdW1fbGVuOworCWludCBlYXJseV9lYXRlbjsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IF9zdHJwX3J4X21zZyAqX3N0cnBfcnhfbXNnKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIChzdHJ1Y3QgX3N0cnBfcnhfbXNnICopKCh2b2lkICopc2tiLT5jYiArCisJCW9mZnNldG9mKHN0cnVjdCBxZGlzY19za2JfY2IsIGRhdGEpKTsKK30KKworLyogTG93ZXIgbG9jayBoZWxkICovCitzdGF0aWMgdm9pZCBzdHJwX2Fib3J0X3J4X3N0cnAoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgaW50IGVycikKK3sKKwlzdHJ1Y3Qgc29jayAqY3NrID0gc3RycC0+c2s7CisKKwkvKiBVbnJlY292ZXJhYmxlIGVycm9yIGluIHJlY2VpdmUgKi8KKworCWRlbF90aW1lcigmc3RycC0+cnhfbXNnX3RpbWVyKTsKKworCWlmIChzdHJwLT5yeF9zdG9wcGVkKQorCQlyZXR1cm47CisKKwlzdHJwLT5yeF9zdG9wcGVkID0gMTsKKworCS8qIFJlcG9ydCBhbiBlcnJvciBvbiB0aGUgbG93ZXIgc29ja2V0ICovCisJY3NrLT5za19lcnIgPSBlcnI7CisJY3NrLT5za19lcnJvcl9yZXBvcnQoY3NrKTsKK30KKworc3RhdGljIHZvaWQgc3RycF9zdGFydF9yeF90aW1lcihzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCWlmIChzdHJwLT5zay0+c2tfcmN2dGltZW8pCisJCW1vZF90aW1lcigmc3RycC0+cnhfbXNnX3RpbWVyLCBzdHJwLT5zay0+c2tfcmN2dGltZW8pOworfQorCisvKiBMb3dlciBsb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIHN0cnBfcGFyc2VyX2VycihzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBpbnQgZXJyLAorCQkJICAgIHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjKQoreworCWRlc2MtPmVycm9yID0gZXJyOworCWtmcmVlX3NrYihzdHJwLT5yeF9za2JfaGVhZCk7CisJc3RycC0+cnhfc2tiX2hlYWQgPSBOVUxMOworCXN0cnAtPmNiLmFib3J0X3BhcnNlcihzdHJwLCBlcnIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdHJwX3BlZWtfbGVuKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApCit7CisJc3RydWN0IHNvY2tldCAqc29jayA9IHN0cnAtPnNrLT5za19zb2NrZXQ7CisKKwlyZXR1cm4gc29jay0+b3BzLT5wZWVrX2xlbihzb2NrKTsKK30KKworLyogTG93ZXIgc29ja2V0IGxvY2sgaGVsZCAqLworc3RhdGljIGludCBzdHJwX3JlY3YocmVhZF9kZXNjcmlwdG9yX3QgKmRlc2MsIHN0cnVjdCBza19idWZmICpvcmlnX3NrYiwKKwkJICAgICB1bnNpZ25lZCBpbnQgb3JpZ19vZmZzZXQsIHNpemVfdCBvcmlnX2xlbikKK3sKKwlzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwID0gKHN0cnVjdCBzdHJwYXJzZXIgKilkZXNjLT5hcmcuZGF0YTsKKwlzdHJ1Y3QgX3N0cnBfcnhfbXNnICpyeG07CisJc3RydWN0IHNrX2J1ZmYgKmhlYWQsICpza2I7CisJc2l6ZV90IGVhdGVuID0gMCwgY2FuZF9sZW47CisJc3NpemVfdCBleHRyYTsKKwlpbnQgZXJyOworCWJvb2wgY2xvbmVkX29yaWcgPSBmYWxzZTsKKworCWlmIChzdHJwLT5yeF9wYXVzZWQpCisJCXJldHVybiAwOworCisJaGVhZCA9IHN0cnAtPnJ4X3NrYl9oZWFkOworCWlmIChoZWFkKSB7CisJCS8qIE1lc3NhZ2UgYWxyZWFkeSBpbiBwcm9ncmVzcyAqLworCisJCXJ4bSA9IF9zdHJwX3J4X21zZyhoZWFkKTsKKwkJaWYgKHVubGlrZWx5KHJ4bS0+ZWFybHlfZWF0ZW4pKSB7CisJCQkvKiBBbHJlYWR5IHNvbWUgbnVtYmVyIG9mIGJ5dGVzIG9uIHRoZSByZWNlaXZlIHNvY2sKKwkJCSAqIGRhdGEgc2F2ZWQgaW4gcnhfc2tiX2hlYWQsIGp1c3QgaW5kaWNhdGUgdGhleQorCQkJICogYXJlIGNvbnN1bWVkLgorCQkJICovCisJCQllYXRlbiA9IG9yaWdfbGVuIDw9IHJ4bS0+ZWFybHlfZWF0ZW4gPworCQkJCW9yaWdfbGVuIDogcnhtLT5lYXJseV9lYXRlbjsKKwkJCXJ4bS0+ZWFybHlfZWF0ZW4gLT0gZWF0ZW47CisKKwkJCXJldHVybiBlYXRlbjsKKwkJfQorCisJCWlmICh1bmxpa2VseShvcmlnX29mZnNldCkpIHsKKwkJCS8qIEdldHRpbmcgZGF0YSB3aXRoIGEgbm9uLXplcm8gb2Zmc2V0IHdoZW4gYSBtZXNzYWdlIGlzCisJCQkgKiBpbiBwcm9ncmVzcyBpcyBub3QgZXhwZWN0ZWQuIElmIGl0IGRvZXMgaGFwcGVuLCB3ZQorCQkJICogbmVlZCB0byBjbG9uZSBhbmQgcHVsbCBzaW5jZSB3ZSBjYW4ndCBkZWFsIHdpdGgKKwkJCSAqIG9mZnNldHMgaW4gdGhlIHNrYnMgZm9yIGEgbWVzc2FnZSBleHBlY3QgaW4gdGhlIGhlYWQuCisJCQkgKi8KKwkJCW9yaWdfc2tiID0gc2tiX2Nsb25lKG9yaWdfc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghb3JpZ19za2IpIHsKKwkJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbWVtX2ZhaWwpOworCQkJCWRlc2MtPmVycm9yID0gLUVOT01FTTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmICghcHNrYl9wdWxsKG9yaWdfc2tiLCBvcmlnX29mZnNldCkpIHsKKwkJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbWVtX2ZhaWwpOworCQkJCWtmcmVlX3NrYihvcmlnX3NrYik7CisJCQkJZGVzYy0+ZXJyb3IgPSAtRU5PTUVNOworCQkJCXJldHVybiAwOworCQkJfQorCQkJY2xvbmVkX29yaWcgPSB0cnVlOworCQkJb3JpZ19vZmZzZXQgPSAwOworCQl9CisKKwkJaWYgKCFzdHJwLT5yeF9za2JfbmV4dHApIHsKKwkJCS8qIFdlIGFyZSBnb2luZyB0byBhcHBlbmQgdG8gdGhlIGZyYWdzX2xpc3Qgb2YgaGVhZC4KKwkJCSAqIE5lZWQgdG8gdW5zaGFyZSB0aGUgZnJhZ19saXN0LgorCQkJICovCisJCQllcnIgPSBza2JfdW5jbG9uZShoZWFkLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbWVtX2ZhaWwpOworCQkJCWRlc2MtPmVycm9yID0gZXJyOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAodW5saWtlbHkoc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0KSkgeworCQkJCS8qIFdlIGNhbid0IGFwcGVuZCB0byBhbiBza19idWZmIHRoYXQgYWxyZWFkeQorCQkJCSAqIGhhcyBhIGZyYWdfbGlzdC4gV2UgY3JlYXRlIGEgbmV3IGhlYWQsIHBvaW50CisJCQkJICogdGhlIGZyYWdfbGlzdCBvZiB0aGF0IHRvIHRoZSBvbGQgaGVhZCwgYW5kCisJCQkJICogdGhlbiBhcmUgYWJsZSB0byB1c2UgdGhlIG9sZCBoZWFkLT5uZXh0IGZvcgorCQkJCSAqIGFwcGVuZGluZyB0byB0aGUgbWVzc2FnZS4KKwkJCQkgKi8KKwkJCQlpZiAoV0FSTl9PTihoZWFkLT5uZXh0KSkgeworCQkJCQlkZXNjLT5lcnJvciA9IC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCXNrYiA9IGFsbG9jX3NrYigwLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAoIXNrYikgeworCQkJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbWVtX2ZhaWwpOworCQkJCQlkZXNjLT5lcnJvciA9IC1FTk9NRU07CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlza2ItPmxlbiA9IGhlYWQtPmxlbjsKKwkJCQlza2ItPmRhdGFfbGVuID0gaGVhZC0+bGVuOworCQkJCXNrYi0+dHJ1ZXNpemUgPSBoZWFkLT50cnVlc2l6ZTsKKwkJCQkqX3N0cnBfcnhfbXNnKHNrYikgPSAqX3N0cnBfcnhfbXNnKGhlYWQpOworCQkJCXN0cnAtPnJ4X3NrYl9uZXh0cCA9ICZoZWFkLT5uZXh0OworCQkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0ID0gaGVhZDsKKwkJCQlzdHJwLT5yeF9za2JfaGVhZCA9IHNrYjsKKwkJCQloZWFkID0gc2tiOworCQkJfSBlbHNlIHsKKwkJCQlzdHJwLT5yeF9za2JfbmV4dHAgPQorCQkJCSAgICAmc2tiX3NoaW5mbyhoZWFkKS0+ZnJhZ19saXN0OworCQkJfQorCQl9CisJfQorCisJd2hpbGUgKGVhdGVuIDwgb3JpZ19sZW4pIHsKKwkJLyogQWx3YXlzIGNsb25lIHNpbmNlIHdlIHdpbGwgY29uc3VtZSBzb21ldGhpbmcgKi8KKwkJc2tiID0gc2tiX2Nsb25lKG9yaWdfc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFza2IpIHsKKwkJCVNUUlBfU1RBVFNfSU5DUihzdHJwLT5zdGF0cy5yeF9tZW1fZmFpbCk7CisJCQlkZXNjLT5lcnJvciA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCisJCWNhbmRfbGVuID0gb3JpZ19sZW4gLSBlYXRlbjsKKworCQloZWFkID0gc3RycC0+cnhfc2tiX2hlYWQ7CisJCWlmICghaGVhZCkgeworCQkJaGVhZCA9IHNrYjsKKwkJCXN0cnAtPnJ4X3NrYl9oZWFkID0gaGVhZDsKKwkJCS8qIFdpbGwgc2V0IHJ4X3NrYl9uZXh0cCBvbiBuZXh0IHBhY2tldCBpZiBuZWVkZWQgKi8KKwkJCXN0cnAtPnJ4X3NrYl9uZXh0cCA9IE5VTEw7CisJCQlyeG0gPSBfc3RycF9yeF9tc2coaGVhZCk7CisJCQltZW1zZXQocnhtLCAwLCBzaXplb2YoKnJ4bSkpOworCQkJcnhtLT5zdHJwLm9mZnNldCA9IG9yaWdfb2Zmc2V0ICsgZWF0ZW47CisJCX0gZWxzZSB7CisJCQkvKiBVbmNsb25lIHNpbmNlIHdlIG1heSBiZSBhcHBlbmRpbmcgdG8gYW4gc2tiIHRoYXQgd2UKKwkJCSAqIGFscmVhZHkgc2hhcmUgYSBmcmFnX2xpc3Qgd2l0aC4KKwkJCSAqLworCQkJZXJyID0gc2tiX3VuY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbWVtX2ZhaWwpOworCQkJCWRlc2MtPmVycm9yID0gZXJyOworCQkJCWJyZWFrOworCQkJfQorCisJCQlyeG0gPSBfc3RycF9yeF9tc2coaGVhZCk7CisJCQkqc3RycC0+cnhfc2tiX25leHRwID0gc2tiOworCQkJc3RycC0+cnhfc2tiX25leHRwID0gJnNrYi0+bmV4dDsKKwkJCWhlYWQtPmRhdGFfbGVuICs9IHNrYi0+bGVuOworCQkJaGVhZC0+bGVuICs9IHNrYi0+bGVuOworCQkJaGVhZC0+dHJ1ZXNpemUgKz0gc2tiLT50cnVlc2l6ZTsKKwkJfQorCisJCWlmICghcnhtLT5zdHJwLmZ1bGxfbGVuKSB7CisJCQlzc2l6ZV90IGxlbjsKKworCQkJbGVuID0gKCpzdHJwLT5jYi5wYXJzZV9tc2cpKHN0cnAsIGhlYWQpOworCisJCQlpZiAoIWxlbikgeworCQkJCS8qIE5lZWQgbW9yZSBoZWFkZXIgdG8gZGV0ZXJtaW5lIGxlbmd0aCAqLworCQkJCWlmICghcnhtLT5hY2N1bV9sZW4pIHsKKwkJCQkJLyogU3RhcnQgUlggdGltZXIgZm9yIG5ldyBtZXNzYWdlICovCisJCQkJCXN0cnBfc3RhcnRfcnhfdGltZXIoc3RycCk7CisJCQkJfQorCQkJCXJ4bS0+YWNjdW1fbGVuICs9IGNhbmRfbGVuOworCQkJCWVhdGVuICs9IGNhbmRfbGVuOworCQkJCVNUUlBfU1RBVFNfSU5DUihzdHJwLT5zdGF0cy5yeF9uZWVkX21vcmVfaGRyKTsKKwkJCQlXQVJOX09OKGVhdGVuICE9IG9yaWdfbGVuKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAobGVuIDwgMCkgeworCQkJCWlmIChsZW4gPT0gLUVTVFJQSVBFICYmIHJ4bS0+YWNjdW1fbGVuKSB7CisJCQkJCWxlbiA9IC1FTk9EQVRBOworCQkJCQlzdHJwLT5yeF91bnJlY292X2ludHIgPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCXN0cnAtPnJ4X2ludGVycnVwdGVkID0gMTsKKwkJCQl9CisJCQkJc3RycF9wYXJzZXJfZXJyKHN0cnAsIGVyciwgZGVzYyk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGxlbiA+IHN0cnAtPnNrLT5za19yY3ZidWYpIHsKKwkJCQkvKiBNZXNzYWdlIGxlbmd0aCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCAqLworCQkJCVNUUlBfU1RBVFNfSU5DUihzdHJwLT5zdGF0cy5yeF9tc2dfdG9vX2JpZyk7CisJCQkJc3RycF9wYXJzZXJfZXJyKHN0cnAsIC1FTVNHU0laRSwgZGVzYyk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgaWYgKGxlbiA8PSAoc3NpemVfdCloZWFkLT5sZW4gLQorCQkJCQkgIHNrYi0+bGVuIC0gcnhtLT5zdHJwLm9mZnNldCkgeworCQkJCS8qIExlbmd0aCBtdXN0IGJlIGludG8gbmV3IHNrYiAoYW5kIGFsc28KKwkJCQkgKiBncmVhdGVyIHRoYW4gemVybykKKwkJCQkgKi8KKwkJCQlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfYmFkX2hkcl9sZW4pOworCQkJCXN0cnBfcGFyc2VyX2VycihzdHJwLCAtRVBST1RPLCBkZXNjKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcnhtLT5zdHJwLmZ1bGxfbGVuID0gbGVuOworCQl9CisKKwkJZXh0cmEgPSAoc3NpemVfdCkocnhtLT5hY2N1bV9sZW4gKyBjYW5kX2xlbikgLQorCQkJcnhtLT5zdHJwLmZ1bGxfbGVuOworCisJCWlmIChleHRyYSA8IDApIHsKKwkJCS8qIE1lc3NhZ2Ugbm90IGNvbXBsZXRlIHlldC4gKi8KKwkJCWlmIChyeG0tPnN0cnAuZnVsbF9sZW4gLSByeG0tPmFjY3VtX2xlbiA+CisJCQkgICAgc3RycF9wZWVrX2xlbihzdHJwKSkgeworCQkJCS8qIERvbid0IGhhdmUgdGhlIHdob2xlIG1lc3NhZ2VzIGluIHRoZSBzb2NrZXQKKwkJCQkgKiBidWZmZXIuIFNldCBzdHJwLT5yeF9uZWVkX2J5dGVzIHRvIHdhaXQgZm9yCisJCQkJICogdGhlIHJlc3Qgb2YgdGhlIG1lc3NhZ2UuIEFsc28sIHNldCAiZWFybHkKKwkJCQkgKiBlYXRlbiIgc2luY2Ugd2UndmUgYWxyZWFkeSBidWZmZXJlZCB0aGUgc2tiCisJCQkJICogYnV0IGRvbid0IGNvbnN1bWUgeWV0IHBlciBzdHJwX3JlYWRfc29jay4KKwkJCQkgKi8KKworCQkJCWlmICghcnhtLT5hY2N1bV9sZW4pIHsKKwkJCQkJLyogU3RhcnQgUlggdGltZXIgZm9yIG5ldyBtZXNzYWdlICovCisJCQkJCXN0cnBfc3RhcnRfcnhfdGltZXIoc3RycCk7CisJCQkJfQorCisJCQkJc3RycC0+cnhfbmVlZF9ieXRlcyA9IHJ4bS0+c3RycC5mdWxsX2xlbiAtCisJCQkJCQkgICAgICAgcnhtLT5hY2N1bV9sZW47CisJCQkJcnhtLT5hY2N1bV9sZW4gKz0gY2FuZF9sZW47CisJCQkJcnhtLT5lYXJseV9lYXRlbiA9IGNhbmRfbGVuOworCQkJCVNUUlBfU1RBVFNfQUREKHN0cnAtPnN0YXRzLnJ4X2J5dGVzLCBjYW5kX2xlbik7CisJCQkJZGVzYy0+Y291bnQgPSAwOyAvKiBTdG9wIHJlYWRpbmcgc29ja2V0ICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlyeG0tPmFjY3VtX2xlbiArPSBjYW5kX2xlbjsKKwkJCWVhdGVuICs9IGNhbmRfbGVuOworCQkJV0FSTl9PTihlYXRlbiAhPSBvcmlnX2xlbik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFBvc2l0aXZlIGV4dHJhIGluZGljYXRlcyBvcmUgYnl0ZXMgdGhhbiBuZWVkZWQgZm9yIHRoZQorCQkgKiBtZXNzYWdlCisJCSAqLworCisJCVdBUk5fT04oZXh0cmEgPiBjYW5kX2xlbik7CisKKwkJZWF0ZW4gKz0gKGNhbmRfbGVuIC0gZXh0cmEpOworCisJCS8qIEh1cnJheSwgd2UgaGF2ZSBhIG5ldyBtZXNzYWdlISAqLworCQlkZWxfdGltZXIoJnN0cnAtPnJ4X21zZ190aW1lcik7CisJCXN0cnAtPnJ4X3NrYl9oZWFkID0gTlVMTDsKKwkJU1RSUF9TVEFUU19JTkNSKHN0cnAtPnN0YXRzLnJ4X21zZ3MpOworCisJCS8qIEdpdmUgc2tiIHRvIHVwcGVyIGxheWVyICovCisJCXN0cnAtPmNiLnJjdl9tc2coc3RycCwgaGVhZCk7CisKKwkJaWYgKHVubGlrZWx5KHN0cnAtPnJ4X3BhdXNlZCkpIHsKKwkJCS8qIFVwcGVyIGxheWVyIHBhdXNlZCBzdHJwICovCisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChjbG9uZWRfb3JpZykKKwkJa2ZyZWVfc2tiKG9yaWdfc2tiKTsKKworCVNUUlBfU1RBVFNfQUREKHN0cnAtPnN0YXRzLnJ4X2J5dGVzLCBlYXRlbik7CisKKwlyZXR1cm4gZWF0ZW47Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9yZWFkX3NvY2tfZG9uZShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwLCBpbnQgZXJyKQoreworCXJldHVybiBlcnI7Cit9CisKKy8qIENhbGxlZCB3aXRoIGxvY2sgaGVsZCBvbiBsb3dlciBzb2NrZXQgKi8KK3N0YXRpYyBpbnQgc3RycF9yZWFkX3NvY2soc3RydWN0IHN0cnBhcnNlciAqc3RycCkKK3sKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gc3RycC0+c2stPnNrX3NvY2tldDsKKwlyZWFkX2Rlc2NyaXB0b3JfdCBkZXNjOworCisJZGVzYy5hcmcuZGF0YSA9IHN0cnA7CisJZGVzYy5lcnJvciA9IDA7CisJZGVzYy5jb3VudCA9IDE7IC8qIGdpdmUgbW9yZSB0aGFuIG9uZSBza2IgcGVyIGNhbGwgKi8KKworCS8qIHNrIHNob3VsZCBiZSBsb2NrZWQgaGVyZSwgc28gb2theSB0byBkbyByZWFkX3NvY2sgKi8KKwlzb2NrLT5vcHMtPnJlYWRfc29jayhzdHJwLT5zaywgJmRlc2MsIHN0cnBfcmVjdik7CisKKwlkZXNjLmVycm9yID0gc3RycC0+Y2IucmVhZF9zb2NrX2RvbmUoc3RycCwgZGVzYy5lcnJvcik7CisKKwlyZXR1cm4gZGVzYy5lcnJvcjsKK30KKworLyogTG93ZXIgc29jayBsb2NrIGhlbGQgKi8KK3ZvaWQgc3RycF9kYXRhX3JlYWR5KHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApCit7CisJaWYgKHVubGlrZWx5KHN0cnAtPnJ4X3N0b3BwZWQpKQorCQlyZXR1cm47CisKKwkvKiBUaGlzIGNoZWNrIGlzIG5lZWRlZCB0byBzeW5jaHJvbml6ZSB3aXRoIGRvX3N0cnBfcnhfd29yay4KKwkgKiBkb19zdHJwX3J4X3dvcmsgYWNxdWlyZXMgYSBwcm9jZXNzIGxvY2sgKGxvY2tfc29jaykgd2hlcmVhcworCSAqIHRoZSBsb2NrIGhlbGQgaGVyZSBpcyBiaF9sb2NrX3NvY2suIFRoZSB0d28gbG9ja3MgY2FuIGJlCisJICogaGVsZCBieSBkaWZmZXJlbnQgdGhyZWFkcyBhdCB0aGUgc2FtZSB0aW1lLCBidXQgYmhfbG9ja19zb2NrCisJICogYWxsb3dzIGEgdGhyZWFkIGluIEJIIGNvbnRleHQgdG8gc2FmZWx5IGNoZWNrIGlmIHRoZSBwcm9jZXNzCisJICogbG9jayBpcyBoZWxkLiBJbiB0aGlzIGNhc2UsIGlmIHRoZSBsb2NrIGlzIGhlbGQsIHF1ZXVlIHdvcmsuCisJICovCisJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzdHJwLT5zaykpIHsKKwkJcXVldWVfd29yayhzdHJwX3dxLCAmc3RycC0+cnhfd29yayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RycC0+cnhfcGF1c2VkKQorCQlyZXR1cm47CisKKwlpZiAoc3RycC0+cnhfbmVlZF9ieXRlcykgeworCQlpZiAoc3RycF9wZWVrX2xlbihzdHJwKSA+PSBzdHJwLT5yeF9uZWVkX2J5dGVzKQorCQkJc3RycC0+cnhfbmVlZF9ieXRlcyA9IDA7CisJCWVsc2UKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoc3RycF9yZWFkX3NvY2soc3RycCkgPT0gLUVOT01FTSkKKwkJcXVldWVfd29yayhzdHJwX3dxLCAmc3RycC0+cnhfd29yayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdHJwX2RhdGFfcmVhZHkpOworCitzdGF0aWMgdm9pZCBkb19zdHJwX3J4X3dvcmsoc3RydWN0IHN0cnBhcnNlciAqc3RycCkKK3sKKwlyZWFkX2Rlc2NyaXB0b3JfdCByZF9kZXNjOworCXN0cnVjdCBzb2NrICpjc2sgPSBzdHJwLT5zazsKKworCS8qIFdlIG5lZWQgdGhlIHJlYWQgbG9jayB0byBzeW5jaHJvbml6ZSB3aXRoIHN0cnBfZGF0YV9yZWFkeS4gV2UKKwkgKiBuZWVkIHRoZSBzb2NrZXQgbG9jayBmb3IgY2FsbGluZyBzdHJwX3JlYWRfc29jay4KKwkgKi8KKwlsb2NrX3NvY2soY3NrKTsKKworCWlmICh1bmxpa2VseShzdHJwLT5yeF9zdG9wcGVkKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoc3RycC0+cnhfcGF1c2VkKQorCQlnb3RvIG91dDsKKworCXJkX2Rlc2MuYXJnLmRhdGEgPSBzdHJwOworCisJaWYgKHN0cnBfcmVhZF9zb2NrKHN0cnApID09IC1FTk9NRU0pCisJCXF1ZXVlX3dvcmsoc3RycF93cSwgJnN0cnAtPnJ4X3dvcmspOworCitvdXQ6CisJcmVsZWFzZV9zb2NrKGNzayk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cnBfcnhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCit7CisJZG9fc3RycF9yeF93b3JrKGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3Qgc3RycGFyc2VyLCByeF93b3JrKSk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cnBfcnhfbXNnX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHN0cnBhcnNlciAqc3RycCA9IChzdHJ1Y3Qgc3RycGFyc2VyICopYXJnOworCisJLyogTWVzc2FnZSBhc3NlbWJseSB0aW1lZCBvdXQgKi8KKwlTVFJQX1NUQVRTX0lOQ1Ioc3RycC0+c3RhdHMucnhfbXNnX3RpbWVvdXRzKTsKKwlsb2NrX3NvY2soc3RycC0+c2spOworCXN0cnAtPmNiLmFib3J0X3BhcnNlcihzdHJwLCBFVElNRURPVVQpOworCXJlbGVhc2Vfc29jayhzdHJwLT5zayk7Cit9CisKK2ludCBzdHJwX2luaXQoc3RydWN0IHN0cnBhcnNlciAqc3RycCwgc3RydWN0IHNvY2sgKmNzaywKKwkgICAgICBzdHJ1Y3Qgc3RycF9jYWxsYmFja3MgKmNiKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBjc2stPnNrX3NvY2tldDsKKworCWlmICghY2IgfHwgIWNiLT5yY3ZfbXNnIHx8ICFjYi0+cGFyc2VfbXNnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc29jay0+b3BzLT5yZWFkX3NvY2sgfHwgIXNvY2stPm9wcy0+cGVla19sZW4pCisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCisJbWVtc2V0KHN0cnAsIDAsIHNpemVvZigqc3RycCkpOworCisJc3RycC0+c2sgPSBjc2s7CisKKwlzZXR1cF90aW1lcigmc3RycC0+cnhfbXNnX3RpbWVyLCBzdHJwX3J4X21zZ190aW1lb3V0LAorCQkgICAgKHVuc2lnbmVkIGxvbmcpc3RycCk7CisKKwlJTklUX1dPUksoJnN0cnAtPnJ4X3dvcmssIHN0cnBfcnhfd29yayk7CisKKwlzdHJwLT5jYi5yY3ZfbXNnID0gY2ItPnJjdl9tc2c7CisJc3RycC0+Y2IucGFyc2VfbXNnID0gY2ItPnBhcnNlX21zZzsKKwlzdHJwLT5jYi5yZWFkX3NvY2tfZG9uZSA9IGNiLT5yZWFkX3NvY2tfZG9uZSA/IDogZGVmYXVsdF9yZWFkX3NvY2tfZG9uZTsKKwlzdHJwLT5jYi5hYm9ydF9wYXJzZXIgPSBjYi0+YWJvcnRfcGFyc2VyID8gOiBzdHJwX2Fib3J0X3J4X3N0cnA7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHN0cnBfaW5pdCk7CisKK3ZvaWQgc3RycF91bnBhdXNlKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApCit7CisJc3RycC0+cnhfcGF1c2VkID0gMDsKKworCS8qIFN5bmMgc2V0dGluZyByeF9wYXVzZWQgd2l0aCBSWCB3b3JrICovCisJc21wX21iKCk7CisKKwlxdWV1ZV93b3JrKHN0cnBfd3EsICZzdHJwLT5yeF93b3JrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHN0cnBfdW5wYXVzZSk7CisKKy8qIHN0cnAgbXVzdCBhbHJlYWR5IGJlIHN0b3BwZWQgc28gdGhhdCBzdHJwX3JlY3Ygd2lsbCBubyBsb25nZXIgYmUgY2FsbGVkLgorICogTm90ZSB0aGF0IHN0cnBfZG9uZSBpcyBub3QgY2FsbGVkIHdpdGggdGhlIGxvd2VyIHNvY2tldCBoZWxkLgorICovCit2b2lkIHN0cnBfZG9uZShzdHJ1Y3Qgc3RycGFyc2VyICpzdHJwKQoreworCVdBUk5fT04oIXN0cnAtPnJ4X3N0b3BwZWQpOworCisJZGVsX3RpbWVyX3N5bmMoJnN0cnAtPnJ4X21zZ190aW1lcik7CisJY2FuY2VsX3dvcmtfc3luYygmc3RycC0+cnhfd29yayk7CisKKwlpZiAoc3RycC0+cnhfc2tiX2hlYWQpIHsKKwkJa2ZyZWVfc2tiKHN0cnAtPnJ4X3NrYl9oZWFkKTsKKwkJc3RycC0+cnhfc2tiX2hlYWQgPSBOVUxMOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHN0cnBfZG9uZSk7CisKK3ZvaWQgc3RycF9zdG9wKHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApCit7CisJc3RycC0+cnhfc3RvcHBlZCA9IDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdHJwX3N0b3ApOworCit2b2lkIHN0cnBfY2hlY2tfcmN2KHN0cnVjdCBzdHJwYXJzZXIgKnN0cnApCit7CisJcXVldWVfd29yayhzdHJwX3dxLCAmc3RycC0+cnhfd29yayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzdHJwX2NoZWNrX3Jjdik7CisKK3N0YXRpYyBpbnQgX19pbml0IHN0cnBfbW9kX2luaXQodm9pZCkKK3sKKwlzdHJwX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImtzdHJwIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHN0cnBfbW9kX2V4aXQodm9pZCkKK3sKK30KK21vZHVsZV9pbml0KHN0cnBfbW9kX2luaXQpOworbW9kdWxlX2V4aXQoc3RycF9tb2RfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMgYi9uZXQvc3VucnBjL2F1dGhfZ3NzL3N2Y2F1dGhfZ3NzLmMKaW5kZXggMWQyODE4MS4uZDg1ODIwMiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX2dzcy9zdmNhdXRoX2dzcy5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9nc3Mvc3ZjYXV0aF9nc3MuYwpAQCAtNTY5LDkgKzU2OSwxMCBAQAogCXN0cnVjdCByc2MgKmZvdW5kOwogCiAJbWVtc2V0KCZyc2NpLCAwLCBzaXplb2YocnNjaSkpOwotCXJzY2kuaGFuZGxlLmRhdGEgPSBoYW5kbGUtPmRhdGE7Ci0JcnNjaS5oYW5kbGUubGVuID0gaGFuZGxlLT5sZW47CisJaWYgKGR1cF90b19uZXRvYmooJnJzY2kuaGFuZGxlLCBoYW5kbGUtPmRhdGEsIGhhbmRsZS0+bGVuKSkKKwkJcmV0dXJuIE5VTEw7CiAJZm91bmQgPSByc2NfbG9va3VwKGNkLCAmcnNjaSk7CisJcnNjX2ZyZWUoJnJzY2kpOwogCWlmICghZm91bmQpCiAJCXJldHVybiBOVUxMOwogCWlmIChjYWNoZV9jaGVjayhjZCwgJmZvdW5kLT5oLCBOVUxMKSkKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvY2xudC5jIGIvbmV0L3N1bnJwYy9jbG50LmMKaW5kZXggN2Y3OWZiNy4uNjZmMjNiMyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9jbG50LmMKKysrIGIvbmV0L3N1bnJwYy9jbG50LmMKQEAgLTQ1Myw3ICs0NTMsNyBAQAogCXN0cnVjdCBycGNfeHBydF9zd2l0Y2ggKnhwczsKIAogCWlmIChhcmdzLT5iY194cHJ0ICYmIGFyZ3MtPmJjX3hwcnQtPnhwdF9iY194cHMpIHsKLQkJV0FSTl9PTihhcmdzLT5wcm90b2NvbCAhPSBYUFJUX1RSQU5TUE9SVF9CQ19UQ1ApOworCQlXQVJOX09OX09OQ0UoIShhcmdzLT5wcm90b2NvbCAmIFhQUlRfVFJBTlNQT1JUX0JDKSk7CiAJCXhwcyA9IGFyZ3MtPmJjX3hwcnQtPnhwdF9iY194cHM7CiAJCXhwcnRfc3dpdGNoX2dldCh4cHMpOwogCX0gZWxzZSB7CkBAIC01MjAsNyArNTIwLDcgQEAKIAljaGFyIHNlcnZlcm5hbWVbNDhdOwogCiAJaWYgKGFyZ3MtPmJjX3hwcnQpIHsKLQkJV0FSTl9PTihhcmdzLT5wcm90b2NvbCAhPSBYUFJUX1RSQU5TUE9SVF9CQ19UQ1ApOworCQlXQVJOX09OX09OQ0UoIShhcmdzLT5wcm90b2NvbCAmIFhQUlRfVFJBTlNQT1JUX0JDKSk7CiAJCXhwcnQgPSBhcmdzLT5iY194cHJ0LT54cHRfYmNfeHBydDsKIAkJaWYgKHhwcnQpIHsKIAkJCXhwcnRfZ2V0KHhwcnQpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0cmRtYS92ZXJicy5jIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS92ZXJicy5jCmluZGV4IDUzNmQwYmUuLjc5OWNjZTYgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYworKysgYi9uZXQvc3VucnBjL3hwcnRyZG1hL3ZlcmJzLmMKQEAgLTUxLDYgKzUxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYWRkci5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmNfcmRtYS5oPgogI2luY2x1ZGUgPGFzbS9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4gLyogdHJ5X21vZHVsZV9nZXQoKS9tb2R1bGVfcHV0KCkgKi8KIApAQCAtOTIzLDcgKzkyNCw3IEBACiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJmJ1Zi0+cmJfcmVjdl9idWZzKTsKLQlmb3IgKGkgPSAwOyBpIDwgYnVmLT5yYl9tYXhfcmVxdWVzdHM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBidWYtPnJiX21heF9yZXF1ZXN0cyArIFJQQ1JETUFfTUFYX0JDX1JFUVVFU1RTOyBpKyspIHsKIAkJc3RydWN0IHJwY3JkbWFfcmVwICpyZXA7CiAKIAkJcmVwID0gcnBjcmRtYV9jcmVhdGVfcmVwKHJfeHBydCk7CkBAIC0xMDE4LDYgKzEwMTksNyBAQAogCQlyZXAgPSBycGNyZG1hX2J1ZmZlcl9nZXRfcmVwX2xvY2tlZChidWYpOwogCQlycGNyZG1hX2Rlc3Ryb3lfcmVwKGlhLCByZXApOwogCX0KKwlidWYtPnJiX3NlbmRfY291bnQgPSAwOwogCiAJc3Bpbl9sb2NrKCZidWYtPnJiX3JlcXNsb2NrKTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmJ1Zi0+cmJfYWxscmVxcykpIHsKQEAgLTEwMzIsNiArMTAzNCw3IEBACiAJCXNwaW5fbG9jaygmYnVmLT5yYl9yZXFzbG9jayk7CiAJfQogCXNwaW5fdW5sb2NrKCZidWYtPnJiX3JlcXNsb2NrKTsKKwlidWYtPnJiX3JlY3ZfY291bnQgPSAwOwogCiAJcnBjcmRtYV9kZXN0cm95X21ycyhidWYpOwogfQpAQCAtMTA3NCw4ICsxMDc3LDI3IEBACiAJc3Bpbl91bmxvY2soJmJ1Zi0+cmJfbXdsb2NrKTsKIH0KIAorc3RhdGljIHN0cnVjdCBycGNyZG1hX3JlcCAqCitycGNyZG1hX2J1ZmZlcl9nZXRfcmVwKHN0cnVjdCBycGNyZG1hX2J1ZmZlciAqYnVmZmVycykKK3sKKwkvKiBJZiBhbiBSUEMgcHJldmlvdXNseSBjb21wbGV0ZWQgd2l0aG91dCBhIHJlcGx5IChzYXksIGEKKwkgKiBjcmVkZW50aWFsIHByb2JsZW0gb3IgYSBzb2Z0IHRpbWVvdXQgb2NjdXJzKSB0aGVuIGhvbGQgb2ZmCisJICogb24gc3VwcGx5aW5nIG1vcmUgUmVjZWl2ZSBidWZmZXJzIHVudGlsIHRoZSBudW1iZXIgb2YgbmV3CisJICogcGVuZGluZyBSUENzIGNhdGNoZXMgdXAgdG8gdGhlIG51bWJlciBvZiBwb3N0ZWQgUmVjZWl2ZXMuCisJICovCisJaWYgKHVubGlrZWx5KGJ1ZmZlcnMtPnJiX3NlbmRfY291bnQgPCBidWZmZXJzLT5yYl9yZWN2X2NvdW50KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodW5saWtlbHkobGlzdF9lbXB0eSgmYnVmZmVycy0+cmJfcmVjdl9idWZzKSkpCisJCXJldHVybiBOVUxMOworCWJ1ZmZlcnMtPnJiX3JlY3ZfY291bnQrKzsKKwlyZXR1cm4gcnBjcmRtYV9idWZmZXJfZ2V0X3JlcF9sb2NrZWQoYnVmZmVycyk7Cit9CisKIC8qCiAgKiBHZXQgYSBzZXQgb2YgcmVxdWVzdC9yZXBseSBidWZmZXJzLgorICoKKyAqIFJlcGx5IGJ1ZmZlciAoaWYgYXZhaWxhYmxlKSBpcyBhdHRhY2hlZCB0byBzZW5kIGJ1ZmZlciB1cG9uIHJldHVybi4KICAqLwogc3RydWN0IHJwY3JkbWFfcmVxICoKIHJwY3JkbWFfYnVmZmVyX2dldChzdHJ1Y3QgcnBjcmRtYV9idWZmZXIgKmJ1ZmZlcnMpCkBAIC0xMDg1LDIxICsxMTA3LDE1IEBACiAJc3Bpbl9sb2NrKCZidWZmZXJzLT5yYl9sb2NrKTsKIAlpZiAobGlzdF9lbXB0eSgmYnVmZmVycy0+cmJfc2VuZF9idWZzKSkKIAkJZ290byBvdXRfcmVxYnVmOworCWJ1ZmZlcnMtPnJiX3NlbmRfY291bnQrKzsKIAlyZXEgPSBycGNyZG1hX2J1ZmZlcl9nZXRfcmVxX2xvY2tlZChidWZmZXJzKTsKLQlpZiAobGlzdF9lbXB0eSgmYnVmZmVycy0+cmJfcmVjdl9idWZzKSkKLQkJZ290byBvdXRfcmVwYnVmOwotCXJlcS0+cmxfcmVwbHkgPSBycGNyZG1hX2J1ZmZlcl9nZXRfcmVwX2xvY2tlZChidWZmZXJzKTsKKwlyZXEtPnJsX3JlcGx5ID0gcnBjcmRtYV9idWZmZXJfZ2V0X3JlcChidWZmZXJzKTsKIAlzcGluX3VubG9jaygmYnVmZmVycy0+cmJfbG9jayk7CiAJcmV0dXJuIHJlcTsKIAogb3V0X3JlcWJ1ZjoKIAlzcGluX3VubG9jaygmYnVmZmVycy0+cmJfbG9jayk7Ci0JcHJfd2FybigicnBjcmRtYTogb3V0IG9mIHJlcXVlc3QgYnVmZmVycyAoJXApXG4iLCBidWZmZXJzKTsKLQlyZXR1cm4gTlVMTDsKLW91dF9yZXBidWY6Ci0JbGlzdF9hZGQoJnJlcS0+cmxfZnJlZSwgJmJ1ZmZlcnMtPnJiX3NlbmRfYnVmcyk7Ci0Jc3Bpbl91bmxvY2soJmJ1ZmZlcnMtPnJiX2xvY2spOwotCXByX3dhcm4oInJwY3JkbWE6IG91dCBvZiByZXBseSBidWZmZXJzICglcClcbiIsIGJ1ZmZlcnMpOworCXByX3dhcm4oIlJQQzogICAgICAgJXM6IG91dCBvZiByZXF1ZXN0IGJ1ZmZlcnNcbiIsIF9fZnVuY19fKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTExNyw5ICsxMTMzLDEyIEBACiAJcmVxLT5ybF9yZXBseSA9IE5VTEw7CiAKIAlzcGluX2xvY2soJmJ1ZmZlcnMtPnJiX2xvY2spOworCWJ1ZmZlcnMtPnJiX3NlbmRfY291bnQtLTsKIAlsaXN0X2FkZF90YWlsKCZyZXEtPnJsX2ZyZWUsICZidWZmZXJzLT5yYl9zZW5kX2J1ZnMpOwotCWlmIChyZXApCisJaWYgKHJlcCkgeworCQlidWZmZXJzLT5yYl9yZWN2X2NvdW50LS07CiAJCWxpc3RfYWRkX3RhaWwoJnJlcC0+cnJfbGlzdCwgJmJ1ZmZlcnMtPnJiX3JlY3ZfYnVmcyk7CisJfQogCXNwaW5fdW5sb2NrKCZidWZmZXJzLT5yYl9sb2NrKTsKIH0KIApAQCAtMTEzMyw4ICsxMTUyLDcgQEAKIAlzdHJ1Y3QgcnBjcmRtYV9idWZmZXIgKmJ1ZmZlcnMgPSByZXEtPnJsX2J1ZmZlcjsKIAogCXNwaW5fbG9jaygmYnVmZmVycy0+cmJfbG9jayk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZidWZmZXJzLT5yYl9yZWN2X2J1ZnMpKQotCQlyZXEtPnJsX3JlcGx5ID0gcnBjcmRtYV9idWZmZXJfZ2V0X3JlcF9sb2NrZWQoYnVmZmVycyk7CisJcmVxLT5ybF9yZXBseSA9IHJwY3JkbWFfYnVmZmVyX2dldF9yZXAoYnVmZmVycyk7CiAJc3Bpbl91bmxvY2soJmJ1ZmZlcnMtPnJiX2xvY2spOwogfQogCkBAIC0xMTQ4LDYgKzExNjYsNyBAQAogCXN0cnVjdCBycGNyZG1hX2J1ZmZlciAqYnVmZmVycyA9ICZyZXAtPnJyX3J4cHJ0LT5yeF9idWY7CiAKIAlzcGluX2xvY2soJmJ1ZmZlcnMtPnJiX2xvY2spOworCWJ1ZmZlcnMtPnJiX3JlY3ZfY291bnQtLTsKIAlsaXN0X2FkZF90YWlsKCZyZXAtPnJyX2xpc3QsICZidWZmZXJzLT5yYl9yZWN2X2J1ZnMpOwogCXNwaW5fdW5sb2NrKCZidWZmZXJzLT5yYl9sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHJkbWEveHBydF9yZG1hLmggYi9uZXQvc3VucnBjL3hwcnRyZG1hL3hwcnRfcmRtYS5oCmluZGV4IDY3MGZhZDUuLmE3MWIwZjUgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydHJkbWEveHBydF9yZG1hLmgKKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS94cHJ0X3JkbWEuaApAQCAtMzIxLDYgKzMyMSw3IEBACiAJY2hhcgkJCSpyYl9wb29sOwogCiAJc3BpbmxvY2tfdAkJcmJfbG9jazsJLyogcHJvdGVjdCBidWYgbGlzdHMgKi8KKwlpbnQJCQlyYl9zZW5kX2NvdW50LCByYl9yZWN2X2NvdW50OwogCXN0cnVjdCBsaXN0X2hlYWQJcmJfc2VuZF9idWZzOwogCXN0cnVjdCBsaXN0X2hlYWQJcmJfcmVjdl9idWZzOwogCXUzMgkJCXJiX21heF9yZXF1ZXN0czsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHNvY2suYyBiL25ldC9zdW5ycGMveHBydHNvY2suYwppbmRleCA4ZWRlM2JjLi5iZjE2ODgzIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0c29jay5jCkBAIC0xMDc0LDcgKzEwNzQsNyBAQAogCQlza2IgPSBza2JfcmVjdl9kYXRhZ3JhbShzaywgMCwgMSwgJmVycik7CiAJCWlmIChza2IgIT0gTlVMTCkgewogCQkJeHNfdWRwX2RhdGFfcmVhZF9za2IoJnRyYW5zcG9ydC0+eHBydCwgc2ssIHNrYik7Ci0JCQlza2JfZnJlZV9kYXRhZ3JhbShzaywgc2tiKTsKKwkJCXNrYl9mcmVlX2RhdGFncmFtX2xvY2tlZChzaywgc2tiKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFhQUlRfU09DS19EQVRBX1JFQURZLCAmdHJhbnNwb3J0LT5zb2NrX3N0YXRlKSkKZGlmZiAtLWdpdCBhL25ldC9zd2l0Y2hkZXYvc3dpdGNoZGV2LmMgYi9uZXQvc3dpdGNoZGV2L3N3aXRjaGRldi5jCmluZGV4IGE1ZmM5ZGQuLjAyYmViMzUgMTAwNjQ0Ci0tLSBhL25ldC9zd2l0Y2hkZXYvc3dpdGNoZGV2LmMKKysrIGIvbmV0L3N3aXRjaGRldi9zd2l0Y2hkZXYuYwpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KLSNpbmNsdWRlIDxuZXQvaXBfZmliLmg+CiAjaW5jbHVkZSA8bmV0L3N3aXRjaGRldi5oPgogCiAvKioKQEAgLTM0NCw4ICszNDMsNiBAQAogCXN3aXRjaCAob2JqLT5pZCkgewogCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX1ZMQU46CiAJCXJldHVybiBzaXplb2Yoc3RydWN0IHN3aXRjaGRldl9vYmpfcG9ydF92bGFuKTsKLQljYXNlIFNXSVRDSERFVl9PQkpfSURfSVBWNF9GSUI6Ci0JCXJldHVybiBzaXplb2Yoc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIpOwogCWNhc2UgU1dJVENIREVWX09CSl9JRF9QT1JUX0ZEQjoKIAkJcmV0dXJuIHNpemVvZihzdHJ1Y3Qgc3dpdGNoZGV2X29ial9wb3J0X2ZkYik7CiAJY2FzZSBTV0lUQ0hERVZfT0JKX0lEX1BPUlRfTURCOgpAQCAtMTA0Miw3ICsxMDM5LDcgQEAKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlzdHJ1Y3QgbmRtc2cgKm5kbTsKIAotCWlmIChkdW1wLT5pZHggPCBkdW1wLT5jYi0+YXJnc1swXSkKKwlpZiAoZHVtcC0+aWR4IDwgZHVtcC0+Y2ItPmFyZ3NbMl0pCiAJCWdvdG8gc2tpcDsKIAogCW5saCA9IG5sbXNnX3B1dChkdW1wLT5za2IsIHBvcnRpZCwgc2VxLCBSVE1fTkVXTkVJR0gsCkBAIC0xMDg5LDcgKzEwODYsNyBAQAogICovCiBpbnQgc3dpdGNoZGV2X3BvcnRfZmRiX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAogCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsIGludCBpZHgpCisJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmZpbHRlcl9kZXYsIGludCAqaWR4KQogewogCXN0cnVjdCBzd2l0Y2hkZXZfZmRiX2R1bXAgZHVtcCA9IHsKIAkJLmZkYi5vYmoub3JpZ19kZXYgPSBkZXYsCkBAIC0xMDk3LDIwNyArMTA5NCwyNyBAQAogCQkuZGV2ID0gZGV2LAogCQkuc2tiID0gc2tiLAogCQkuY2IgPSBjYiwKLQkJLmlkeCA9IGlkeCwKKwkJLmlkeCA9ICppZHgsCiAJfTsKIAlpbnQgZXJyOwogCiAJZXJyID0gc3dpdGNoZGV2X3BvcnRfb2JqX2R1bXAoZGV2LCAmZHVtcC5mZGIub2JqLAogCQkJCSAgICAgIHN3aXRjaGRldl9wb3J0X2ZkYl9kdW1wX2NiKTsKLQljYi0+YXJnc1sxXSA9IGVycjsKLQlyZXR1cm4gZHVtcC5pZHg7CisJKmlkeCA9IGR1bXAuaWR4OworCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzd2l0Y2hkZXZfcG9ydF9mZGJfZHVtcCk7CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqc3dpdGNoZGV2X2dldF9sb3dlc3RfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JY29uc3Qgc3RydWN0IHN3aXRjaGRldl9vcHMgKm9wcyA9IGRldi0+c3dpdGNoZGV2X29wczsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbG93ZXJfZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlICpwb3J0X2RldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwotCi0JLyogUmVjdXNpdmVseSBzZWFyY2ggZG93biB1bnRpbCB3ZSBmaW5kIGEgc3cgcG9ydCBkZXYuCi0JICogKEEgc3cgcG9ydCBkZXYgc3VwcG9ydHMgc3dpdGNoZGV2X3BvcnRfYXR0cl9nZXQpLgotCSAqLwotCi0JaWYgKG9wcyAmJiBvcHMtPnN3aXRjaGRldl9wb3J0X2F0dHJfZ2V0KQotCQlyZXR1cm4gZGV2OwotCi0JbmV0ZGV2X2Zvcl9lYWNoX2xvd2VyX2RldihkZXYsIGxvd2VyX2RldiwgaXRlcikgewotCQlwb3J0X2RldiA9IHN3aXRjaGRldl9nZXRfbG93ZXN0X2Rldihsb3dlcl9kZXYpOwotCQlpZiAocG9ydF9kZXYpCi0JCQlyZXR1cm4gcG9ydF9kZXY7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqc3dpdGNoZGV2X2dldF9kZXZfYnlfbmhzKHN0cnVjdCBmaWJfaW5mbyAqZmkpCi17Ci0Jc3RydWN0IHN3aXRjaGRldl9hdHRyIGF0dHIgPSB7Ci0JCS5pZCA9IFNXSVRDSERFVl9BVFRSX0lEX1BPUlRfUEFSRU5UX0lELAotCX07Ci0Jc3RydWN0IHN3aXRjaGRldl9hdHRyIHByZXZfYXR0cjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKLQlpbnQgbmhzZWw7Ci0KLQlBU1NFUlRfUlROTCgpOwotCi0JLyogRm9yIHRoaXMgcm91dGUsIGFsbCBuZXh0aG9wIGRldnMgbXVzdCBiZSBvbiB0aGUgc2FtZSBzd2l0Y2guICovCi0KLQlmb3IgKG5oc2VsID0gMDsgbmhzZWwgPCBmaS0+ZmliX25oczsgbmhzZWwrKykgewotCQljb25zdCBzdHJ1Y3QgZmliX25oICpuaCA9ICZmaS0+ZmliX25oW25oc2VsXTsKLQotCQlpZiAoIW5oLT5uaF9kZXYpCi0JCQlyZXR1cm4gTlVMTDsKLQotCQlkZXYgPSBzd2l0Y2hkZXZfZ2V0X2xvd2VzdF9kZXYobmgtPm5oX2Rldik7Ci0JCWlmICghZGV2KQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJYXR0ci5vcmlnX2RldiA9IGRldjsKLQkJaWYgKHN3aXRjaGRldl9wb3J0X2F0dHJfZ2V0KGRldiwgJmF0dHIpKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQkJaWYgKG5oc2VsID4gMCAmJgotCQkgICAgIW5ldGRldl9waHlzX2l0ZW1faWRfc2FtZSgmcHJldl9hdHRyLnUucHBpZCwgJmF0dHIudS5wcGlkKSkKLQkJCQlyZXR1cm4gTlVMTDsKLQotCQlwcmV2X2F0dHIgPSBhdHRyOwotCX0KLQotCXJldHVybiBkZXY7Ci19Ci0KLS8qKgotICoJc3dpdGNoZGV2X2ZpYl9pcHY0X2FkZCAtIEFkZC9tb2RpZnkgc3dpdGNoIElQdjQgcm91dGUgZW50cnkKLSAqCi0gKglAZHN0OiByb3V0ZSdzIElQdjQgZGVzdGluYXRpb24gYWRkcmVzcwotICoJQGRzdF9sZW46IGRlc3RpbmF0aW9uIGFkZHJlc3MgbGVuZ3RoIChwcmVmaXggbGVuZ3RoKQotICoJQGZpOiByb3V0ZSBGSUIgaW5mbyBzdHJ1Y3R1cmUKLSAqCUB0b3M6IHJvdXRlIFRPUwotICoJQHR5cGU6IHJvdXRlIHR5cGUKLSAqCUBubGZsYWdzOiBuZXRsaW5rIGZsYWdzIHBhc3NlZCBpbiAoTkxNX0ZfKikKLSAqCUB0Yl9pZDogcm91dGUgdGFibGUgSUQKLSAqCi0gKglBZGQvbW9kaWZ5IHN3aXRjaCBJUHY0IHJvdXRlIGVudHJ5LgotICovCi1pbnQgc3dpdGNoZGV2X2ZpYl9pcHY0X2FkZCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKLQkJCSAgIHU4IHRvcywgdTggdHlwZSwgdTMyIG5sZmxhZ3MsIHUzMiB0Yl9pZCkKLXsKLQlzdHJ1Y3Qgc3dpdGNoZGV2X29ial9pcHY0X2ZpYiBpcHY0X2ZpYiA9IHsKLQkJLm9iai5pZCA9IFNXSVRDSERFVl9PQkpfSURfSVBWNF9GSUIsCi0JCS5kc3QgPSBkc3QsCi0JCS5kc3RfbGVuID0gZHN0X2xlbiwKLQkJLmZpID0gZmksCi0JCS50b3MgPSB0b3MsCi0JCS50eXBlID0gdHlwZSwKLQkJLm5sZmxhZ3MgPSBubGZsYWdzLAotCQkudGJfaWQgPSB0Yl9pZCwKLQl9OwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IGVyciA9IDA7Ci0KLQkvKiBEb24ndCBvZmZsb2FkIHJvdXRlIGlmIHVzaW5nIGN1c3RvbSBpcCBydWxlcyBvciBpZgotCSAqIElQdjQgRklCIG9mZmxvYWRpbmcgaGFzIGJlZW4gZGlzYWJsZWQgY29tcGxldGVseS4KLQkgKi8KLQotI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKLQlpZiAoZmktPmZpYl9uZXQtPmlwdjQuZmliX2hhc19jdXN0b21fcnVsZXMpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KLQlpZiAoZmktPmZpYl9uZXQtPmlwdjQuZmliX29mZmxvYWRfZGlzYWJsZWQpCi0JCXJldHVybiAwOwotCi0JZGV2ID0gc3dpdGNoZGV2X2dldF9kZXZfYnlfbmhzKGZpKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuIDA7Ci0KLQlpcHY0X2ZpYi5vYmoub3JpZ19kZXYgPSBkZXY7Ci0JZXJyID0gc3dpdGNoZGV2X3BvcnRfb2JqX2FkZChkZXYsICZpcHY0X2ZpYi5vYmopOwotCWlmICghZXJyKQotCQlmaS0+ZmliX2ZsYWdzIHw9IFJUTkhfRl9PRkZMT0FEOwotCi0JcmV0dXJuIGVyciA9PSAtRU9QTk9UU1VQUCA/IDAgOiBlcnI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzd2l0Y2hkZXZfZmliX2lwdjRfYWRkKTsKLQotLyoqCi0gKglzd2l0Y2hkZXZfZmliX2lwdjRfZGVsIC0gRGVsZXRlIElQdjQgcm91dGUgZW50cnkgZnJvbSBzd2l0Y2gKLSAqCi0gKglAZHN0OiByb3V0ZSdzIElQdjQgZGVzdGluYXRpb24gYWRkcmVzcwotICoJQGRzdF9sZW46IGRlc3RpbmF0aW9uIGFkZHJlc3MgbGVuZ3RoIChwcmVmaXggbGVuZ3RoKQotICoJQGZpOiByb3V0ZSBGSUIgaW5mbyBzdHJ1Y3R1cmUKLSAqCUB0b3M6IHJvdXRlIFRPUwotICoJQHR5cGU6IHJvdXRlIHR5cGUKLSAqCUB0Yl9pZDogcm91dGUgdGFibGUgSUQKLSAqCi0gKglEZWxldGUgSVB2NCByb3V0ZSBlbnRyeSBmcm9tIHN3aXRjaCBkZXZpY2UuCi0gKi8KLWludCBzd2l0Y2hkZXZfZmliX2lwdjRfZGVsKHUzMiBkc3QsIGludCBkc3RfbGVuLCBzdHJ1Y3QgZmliX2luZm8gKmZpLAotCQkJICAgdTggdG9zLCB1OCB0eXBlLCB1MzIgdGJfaWQpCi17Ci0Jc3RydWN0IHN3aXRjaGRldl9vYmpfaXB2NF9maWIgaXB2NF9maWIgPSB7Ci0JCS5vYmouaWQgPSBTV0lUQ0hERVZfT0JKX0lEX0lQVjRfRklCLAotCQkuZHN0ID0gZHN0LAotCQkuZHN0X2xlbiA9IGRzdF9sZW4sCi0JCS5maSA9IGZpLAotCQkudG9zID0gdG9zLAotCQkudHlwZSA9IHR5cGUsCi0JCS5ubGZsYWdzID0gMCwKLQkJLnRiX2lkID0gdGJfaWQsCi0JfTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwotCWludCBlcnIgPSAwOwotCi0JaWYgKCEoZmktPmZpYl9mbGFncyAmIFJUTkhfRl9PRkZMT0FEKSkKLQkJcmV0dXJuIDA7Ci0KLQlkZXYgPSBzd2l0Y2hkZXZfZ2V0X2Rldl9ieV9uaHMoZmkpOwotCWlmICghZGV2KQotCQlyZXR1cm4gMDsKLQotCWlwdjRfZmliLm9iai5vcmlnX2RldiA9IGRldjsKLQllcnIgPSBzd2l0Y2hkZXZfcG9ydF9vYmpfZGVsKGRldiwgJmlwdjRfZmliLm9iaik7Ci0JaWYgKCFlcnIpCi0JCWZpLT5maWJfZmxhZ3MgJj0gflJUTkhfRl9PRkZMT0FEOwotCi0JcmV0dXJuIGVyciA9PSAtRU9QTk9UU1VQUCA/IDAgOiBlcnI7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzd2l0Y2hkZXZfZmliX2lwdjRfZGVsKTsKLQotLyoqCi0gKglzd2l0Y2hkZXZfZmliX2lwdjRfYWJvcnQgLSBBYm9ydCBhbiBJUHY0IEZJQiBvcGVyYXRpb24KLSAqCi0gKglAZmk6IHJvdXRlIEZJQiBpbmZvIHN0cnVjdHVyZQotICovCi12b2lkIHN3aXRjaGRldl9maWJfaXB2NF9hYm9ydChzdHJ1Y3QgZmliX2luZm8gKmZpKQotewotCS8qIFRoZXJlIHdhcyBhIHByb2JsZW0gaW5zdGFsbGluZyB0aGlzIHJvdXRlIHRvIHRoZSBvZmZsb2FkCi0JICogZGV2aWNlLiAgRm9yIG5vdywgdW50aWwgd2UgY29tZSB1cCB3aXRoIG1vcmUgcmVmaW5lZAotCSAqIHBvbGljeSBoYW5kbGluZywgYWJydXB0bHkgZW5kIElQdjQgZmliIG9mZmxvYWRpbmcgZm9yCi0JICogZm9yIGVudGlyZSBuZXQgYnkgZmx1c2hpbmcgb2ZmbG9hZCBkZXZpY2Uocykgb2YgYWxsCi0JICogSVB2NCByb3V0ZXMsIGFuZCBtYXJrIElQdjQgZmliIG9mZmxvYWRpbmcgYnJva2VuIGZyb20KLQkgKiB0aGlzIHBvaW50IGZvcndhcmQuCi0JICovCi0KLQlmaWJfZmx1c2hfZXh0ZXJuYWwoZmktPmZpYl9uZXQpOwotCWZpLT5maWJfbmV0LT5pcHY0LmZpYl9vZmZsb2FkX2Rpc2FibGVkID0gdHJ1ZTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHN3aXRjaGRldl9maWJfaXB2NF9hYm9ydCk7Ci0KIGJvb2wgc3dpdGNoZGV2X3BvcnRfc2FtZV9wYXJlbnRfaWQoc3RydWN0IG5ldF9kZXZpY2UgKmEsCiAJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmIpCiB7CiAJc3RydWN0IHN3aXRjaGRldl9hdHRyIGFfYXR0ciA9IHsKIAkJLm9yaWdfZGV2ID0gYSwKIAkJLmlkID0gU1dJVENIREVWX0FUVFJfSURfUE9SVF9QQVJFTlRfSUQsCi0JCS5mbGFncyA9IFNXSVRDSERFVl9GX05PX1JFQ1VSU0UsCiAJfTsKIAlzdHJ1Y3Qgc3dpdGNoZGV2X2F0dHIgYl9hdHRyID0gewogCQkub3JpZ19kZXYgPSBiLAogCQkuaWQgPSBTV0lUQ0hERVZfQVRUUl9JRF9QT1JUX1BBUkVOVF9JRCwKLQkJLmZsYWdzID0gU1dJVENIREVWX0ZfTk9fUkVDVVJTRSwKIAl9OwogCiAJaWYgKHN3aXRjaGRldl9wb3J0X2F0dHJfZ2V0KGEsICZhX2F0dHIpIHx8CkBAIC0xMzA2LDg5ICsxMTIzLDQgQEAKIAogCXJldHVybiBuZXRkZXZfcGh5c19pdGVtX2lkX3NhbWUoJmFfYXR0ci51LnBwaWQsICZiX2F0dHIudS5wcGlkKTsKIH0KLQotc3RhdGljIHUzMiBzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19nZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmdyb3VwX2RldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbG93ZXJfZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7Ci0KLQluZXRkZXZfZm9yX2VhY2hfbG93ZXJfZGV2KGdyb3VwX2RldiwgbG93ZXJfZGV2LCBpdGVyKSB7Ci0JCWlmIChsb3dlcl9kZXYgPT0gZGV2KQotCQkJY29udGludWU7Ci0JCWlmIChzd2l0Y2hkZXZfcG9ydF9zYW1lX3BhcmVudF9pZChkZXYsIGxvd2VyX2RldikpCi0JCQlyZXR1cm4gbG93ZXJfZGV2LT5vZmZsb2FkX2Z3ZF9tYXJrOwotCQlyZXR1cm4gc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfZ2V0KGRldiwgbG93ZXJfZGV2KTsKLQl9Ci0KLQlyZXR1cm4gZGV2LT5pZmluZGV4OwotfQogRVhQT1JUX1NZTUJPTF9HUEwoc3dpdGNoZGV2X3BvcnRfc2FtZV9wYXJlbnRfaWQpOwotCi1zdGF0aWMgdm9pZCBzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZ3JvdXBfZGV2LAotCQkJCQkgIHUzMiBvbGRfbWFyaywgdTMyICpyZXNldF9tYXJrKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpsb3dlcl9kZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKLQotCW5ldGRldl9mb3JfZWFjaF9sb3dlcl9kZXYoZ3JvdXBfZGV2LCBsb3dlcl9kZXYsIGl0ZXIpIHsKLQkJaWYgKGxvd2VyX2Rldi0+b2ZmbG9hZF9md2RfbWFyayA9PSBvbGRfbWFyaykgewotCQkJaWYgKCEqcmVzZXRfbWFyaykKLQkJCQkqcmVzZXRfbWFyayA9IGxvd2VyX2Rldi0+aWZpbmRleDsKLQkJCWxvd2VyX2Rldi0+b2ZmbG9hZF9md2RfbWFyayA9ICpyZXNldF9tYXJrOwotCQl9Ci0JCXN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX3Jlc2V0KGxvd2VyX2Rldiwgb2xkX21hcmssIHJlc2V0X21hcmspOwotCX0KLX0KLQotLyoqCi0gKglzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19zZXQgLSBTZXQgcG9ydCBvZmZsb2FkIGZvcndhcmRpbmcgbWFyawotICoKLSAqCUBkZXY6IHBvcnQgZGV2aWNlCi0gKglAZ3JvdXBfZGV2OiBjb250YWluaW5nIGRldmljZQotICoJQGpvaW5pbmc6IHRydWUgaWYgZGV2IGlzIGpvaW5pbmcgZ3JvdXA7IGZhbHNlIGlmIGxlYXZpbmcgZ3JvdXAKLSAqCi0gKglBbiB1bmdyb3VwZWQgcG9ydCdzIG9mZmxvYWQgbWFyayBpcyBqdXN0IGl0cyBpZmluZGV4LiAgQSBncm91cGVkCi0gKglwb3J0J3MgKG1lbWJlciBvZiBhIGJyaWRnZSwgZm9yIGV4YW1wbGUpIG9mZmxvYWQgbWFyayBpcyB0aGUgaWZpbmRleAotICoJb2Ygb25lIG9mIHRoZSBwb3J0cyBpbiB0aGUgZ3JvdXAgd2l0aCB0aGUgc2FtZSBwYXJlbnQgKHN3aXRjaCkgSUQuCi0gKglQb3J0cyBvbiB0aGUgc2FtZSBkZXZpY2UgaW4gdGhlIHNhbWUgZ3JvdXAgd2lsbCBoYXZlIHRoZSBzYW1lIG1hcmsuCi0gKgotICoJRXhhbXBsZToKLSAqCi0gKgkJYnIwCQlpZmluZGV4PTkKLSAqCQkgIHN3MXAxCQlpZmluZGV4PTIJbWFyaz0yCi0gKgkJICBzdzFwMgkJaWZpbmRleD0zCW1hcms9MgotICoJCSAgc3cycDEJCWlmaW5kZXg9NAltYXJrPTUKLSAqCQkgIHN3MnAyCQlpZmluZGV4PTUJbWFyaz01Ci0gKgotICoJSWYgc3cycDIgbGVhdmVzIHRoZSBicmlkZ2UsIHdlJ2xsIGhhdmU6Ci0gKgotICoJCWJyMAkJaWZpbmRleD05Ci0gKgkJICBzdzFwMQkJaWZpbmRleD0yCW1hcms9MgotICoJCSAgc3cxcDIJCWlmaW5kZXg9MwltYXJrPTIKLSAqCQkgIHN3MnAxCQlpZmluZGV4PTQJbWFyaz00Ci0gKgkJc3cycDIJCWlmaW5kZXg9NQltYXJrPTUKLSAqLwotdm9pZCBzd2l0Y2hkZXZfcG9ydF9md2RfbWFya19zZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmdyb3VwX2RldiwKLQkJCQkgYm9vbCBqb2luaW5nKQotewotCXUzMiBtYXJrID0gZGV2LT5pZmluZGV4OwotCXUzMiByZXNldF9tYXJrID0gMDsKLQotCWlmIChncm91cF9kZXYpIHsKLQkJQVNTRVJUX1JUTkwoKTsKLQkJaWYgKGpvaW5pbmcpCi0JCQltYXJrID0gc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfZ2V0KGRldiwgZ3JvdXBfZGV2KTsKLQkJZWxzZSBpZiAoZGV2LT5vZmZsb2FkX2Z3ZF9tYXJrID09IG1hcmspCi0JCQkvKiBPaG9oLCB0aGlzIHBvcnQgd2FzIHRoZSBtYXJrIHJlZmVyZW5jZSBwb3J0LAotCQkJICogYnV0IGl0J3MgbGVhdmluZyB0aGUgZ3JvdXAsIHNvIHJlc2V0IHRoZQotCQkJICogbWFyayBmb3IgdGhlIHJlbWFpbmluZyBwb3J0cyBpbiB0aGUgZ3JvdXAuCi0JCQkgKi8KLQkJCXN3aXRjaGRldl9wb3J0X2Z3ZF9tYXJrX3Jlc2V0KGdyb3VwX2RldiwgbWFyaywKLQkJCQkJCSAgICAgICZyZXNldF9tYXJrKTsKLQl9Ci0KLQlkZXYtPm9mZmxvYWRfZndkX21hcmsgPSBtYXJrOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3dpdGNoZGV2X3BvcnRfZndkX21hcmtfc2V0KTsKZGlmZiAtLWdpdCBhL25ldC9zeXNjdGxfbmV0LmMgYi9uZXQvc3lzY3RsX25ldC5jCmluZGV4IDQ2YTcxYzcuLjkxOTk4MTMgMTAwNjQ0Ci0tLSBhL25ldC9zeXNjdGxfbmV0LmMKKysrIGIvbmV0L3N5c2N0bF9uZXQuYwpAQCAtMjcsOSArMjcsOSBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX3NldCAqCi1uZXRfY3RsX2hlYWRlcl9sb29rdXAoc3RydWN0IGN0bF90YWJsZV9yb290ICpyb290LCBzdHJ1Y3QgbnNwcm94eSAqbmFtZXNwYWNlcykKK25ldF9jdGxfaGVhZGVyX2xvb2t1cChzdHJ1Y3QgY3RsX3RhYmxlX3Jvb3QgKnJvb3QpCiB7Ci0JcmV0dXJuICZuYW1lc3BhY2VzLT5uZXRfbnMtPnN5c2N0bHM7CisJcmV0dXJuICZjdXJyZW50LT5uc3Byb3h5LT5uZXRfbnMtPnN5c2N0bHM7CiB9CiAKIHN0YXRpYyBpbnQgaXNfc2VlbihzdHJ1Y3QgY3RsX3RhYmxlX3NldCAqc2V0KQpAQCAtNDIsMjYgKzQyLDM3IEBACiAJCQkgICAgICAgc3RydWN0IGN0bF90YWJsZSAqdGFibGUpCiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gY29udGFpbmVyX29mKGhlYWQtPnNldCwgc3RydWN0IG5ldCwgc3lzY3Rscyk7Ci0Ja3VpZF90IHJvb3RfdWlkID0gbWFrZV9rdWlkKG5ldC0+dXNlcl9ucywgMCk7Ci0Ja2dpZF90IHJvb3RfZ2lkID0gbWFrZV9rZ2lkKG5ldC0+dXNlcl9ucywgMCk7CiAKIAkvKiBBbGxvdyBuZXR3b3JrIGFkbWluaXN0cmF0b3IgdG8gaGF2ZSBzYW1lIGFjY2VzcyBhcyByb290LiAqLwotCWlmIChuc19jYXBhYmxlX25vYXVkaXQobmV0LT51c2VyX25zLCBDQVBfTkVUX0FETUlOKSB8fAotCSAgICB1aWRfZXEocm9vdF91aWQsIGN1cnJlbnRfZXVpZCgpKSkgeworCWlmIChuc19jYXBhYmxlX25vYXVkaXQobmV0LT51c2VyX25zLCBDQVBfTkVUX0FETUlOKSkgewogCQlpbnQgbW9kZSA9ICh0YWJsZS0+bW9kZSA+PiA2KSAmIDc7CiAJCXJldHVybiAobW9kZSA8PCA2KSB8IChtb2RlIDw8IDMpIHwgbW9kZTsKIAl9Ci0JLyogQWxsb3cgbmV0bnMgcm9vdCBncm91cCB0byBoYXZlIHRoZSBzYW1lIGFjY2VzcyBhcyB0aGUgcm9vdCBncm91cCAqLwotCWlmIChpbl9lZ3JvdXBfcChyb290X2dpZCkpIHsKLQkJaW50IG1vZGUgPSAodGFibGUtPm1vZGUgPj4gMykgJiA3OwotCQlyZXR1cm4gKG1vZGUgPDwgMykgfCBtb2RlOwotCX0KKwogCXJldHVybiB0YWJsZS0+bW9kZTsKIH0KIAorc3RhdGljIHZvaWQgbmV0X2N0bF9zZXRfb3duZXJzaGlwKHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZWFkLAorCQkJCSAgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsCisJCQkJICBrdWlkX3QgKnVpZCwga2dpZF90ICpnaWQpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gY29udGFpbmVyX29mKGhlYWQtPnNldCwgc3RydWN0IG5ldCwgc3lzY3Rscyk7CisJa3VpZF90IG5zX3Jvb3RfdWlkOworCWtnaWRfdCBuc19yb290X2dpZDsKKworCW5zX3Jvb3RfdWlkID0gbWFrZV9rdWlkKG5ldC0+dXNlcl9ucywgMCk7CisJaWYgKHVpZF92YWxpZChuc19yb290X3VpZCkpCisJCSp1aWQgPSBuc19yb290X3VpZDsKKworCW5zX3Jvb3RfZ2lkID0gbWFrZV9rZ2lkKG5ldC0+dXNlcl9ucywgMCk7CisJaWYgKGdpZF92YWxpZChuc19yb290X2dpZCkpCisJCSpnaWQgPSBuc19yb290X2dpZDsKK30KKwogc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfcm9vdCBuZXRfc3lzY3RsX3Jvb3QgPSB7CiAJLmxvb2t1cCA9IG5ldF9jdGxfaGVhZGVyX2xvb2t1cCwKIAkucGVybWlzc2lvbnMgPSBuZXRfY3RsX3Blcm1pc3Npb25zLAorCS5zZXRfb3duZXJzaGlwID0gbmV0X2N0bF9zZXRfb3duZXJzaGlwLAogfTsKIAogc3RhdGljIGludCBfX25ldF9pbml0IHN5c2N0bF9uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iY2FzdC5jIGIvbmV0L3RpcGMvYmNhc3QuYwppbmRleCBhZTQ2OWIzLi43NTNmNzc0IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iY2FzdC5jCisrKyBiL25ldC90aXBjL2JjYXN0LmMKQEAgLTI2OSwxOCArMjY5LDE5IEBACiAgKgogICogUkNVIGlzIGxvY2tlZCwgbm8gb3RoZXIgbG9ja3Mgc2V0CiAgKi8KLXZvaWQgdGlwY19iY2FzdF9zeW5jX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2xpbmsgKmwsCi0JCQkgc3RydWN0IHRpcGNfbXNnICpoZHIpCitpbnQgdGlwY19iY2FzdF9zeW5jX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2xpbmsgKmwsCisJCQlzdHJ1Y3QgdGlwY19tc2cgKmhkcikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICppbnB1dHEgPSAmdGlwY19iY19iYXNlKG5ldCktPmlucHV0cTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHhtaXRxOworCWludCByYyA9IDA7CiAKIAlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnhtaXRxKTsKIAogCXRpcGNfYmNhc3RfbG9jayhuZXQpOwogCWlmIChtc2dfdHlwZShoZHIpID09IFNUQVRFX01TRykgewogCQl0aXBjX2xpbmtfYmNfYWNrX3JjdihsLCBtc2dfYmNhc3RfYWNrKGhkciksICZ4bWl0cSk7Ci0JCXRpcGNfbGlua19iY19zeW5jX3JjdihsLCBoZHIsICZ4bWl0cSk7CisJCXJjID0gdGlwY19saW5rX2JjX3N5bmNfcmN2KGwsIGhkciwgJnhtaXRxKTsKIAl9IGVsc2UgewogCQl0aXBjX2xpbmtfYmNfaW5pdF9yY3YobCwgaGRyKTsKIAl9CkBAIC0yOTEsNiArMjkyLDcgQEAKIAkvKiBBbnkgc29ja2V0IHdha2V1cCBtZXNzYWdlcyA/ICovCiAJaWYgKCFza2JfcXVldWVfZW1wdHkoaW5wdXRxKSkKIAkJdGlwY19za19yY3YobmV0LCBpbnB1dHEpOworCXJldHVybiByYzsKIH0KIAogLyogdGlwY19iY2FzdF9hZGRfcGVlciAtIGFkZCBhIHBlZXIgbm9kZSB0byBicm9hZGNhc3QgbGluayBhbmQgYmVhcmVyCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iY2FzdC5oIGIvbmV0L3RpcGMvYmNhc3QuaAppbmRleCBkNWU3OWIzLi41ZmZlMzQ0IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iY2FzdC5oCisrKyBiL25ldC90aXBjL2JjYXN0LmgKQEAgLTU2LDggKzU2LDggQEAKIGludCB0aXBjX2JjYXN0X3htaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KTsKIGludCB0aXBjX2JjYXN0X3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2xpbmsgKmwsIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCB0aXBjX2JjYXN0X2Fja19yY3Yoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19saW5rICpsLCB1MzIgYWNrZWQpOwotdm9pZCB0aXBjX2JjYXN0X3N5bmNfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRpcGNfbGluayAqbCwKLQkJCSBzdHJ1Y3QgdGlwY19tc2cgKmhkcik7CitpbnQgdGlwY19iY2FzdF9zeW5jX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2xpbmsgKmwsCisJCQlzdHJ1Y3QgdGlwY19tc2cgKmhkcik7CiBpbnQgdGlwY19ubF9hZGRfYmNfbGluayhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX25sX21zZyAqbXNnKTsKIGludCB0aXBjX25sX2JjX2xpbmtfc2V0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5sYXR0ciAqYXR0cnNbXSk7CiBpbnQgdGlwY19iY2xpbmtfcmVzZXRfc3RhdHMoc3RydWN0IG5ldCAqbmV0KTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL2JlYXJlci5jIGIvbmV0L3RpcGMvYmVhcmVyLmMKaW5kZXggNjViMWJiZi4uOTc1ZGJlYiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvYmVhcmVyLmMKKysrIGIvbmV0L3RpcGMvYmVhcmVyLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlICJtb25pdG9yLmgiCiAjaW5jbHVkZSAiYmNhc3QuaCIKICNpbmNsdWRlICJuZXRsaW5rLmgiCisjaW5jbHVkZSAidWRwX21lZGlhLmgiCiAKICNkZWZpbmUgTUFYX0FERFJfU1RSIDYwCiAKQEAgLTU2LDYgKzU3LDEzIEBACiAJTlVMTAogfTsKIAorc3RhdGljIHN0cnVjdCB0aXBjX2JlYXJlciAqYmVhcmVyX2dldChzdHJ1Y3QgbmV0ICpuZXQsIGludCBiZWFyZXJfaWQpCit7CisJc3RydWN0IHRpcGNfbmV0ICp0biA9IHRpcGNfbmV0KG5ldCk7CisKKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX3J0bmwodG4tPmJlYXJlcl9saXN0W2JlYXJlcl9pZF0pOworfQorCiBzdGF0aWMgdm9pZCBiZWFyZXJfZGlzYWJsZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2JlYXJlciAqYik7CiAKIC8qKgpAQCAtMzIzLDYgKzMzMSw3IEBACiAJYi0+ZG9tYWluID0gZGlzY19kb21haW47CiAJYi0+bmV0X3BsYW5lID0gYmVhcmVyX2lkICsgJ0EnOwogCWItPnByaW9yaXR5ID0gcHJpb3JpdHk7CisJdGVzdF9hbmRfc2V0X2JpdF9sb2NrKDAsICZiLT51cCk7CiAKIAlyZXMgPSB0aXBjX2Rpc2NfY3JlYXRlKG5ldCwgYiwgJmItPmJjYXN0X2FkZHIsICZza2IpOwogCWlmIChyZXMpIHsKQEAgLTM2MCwxNSArMzY5LDI0IEBACiAgKi8KIHZvaWQgdGlwY19iZWFyZXJfcmVzZXRfYWxsKHN0cnVjdCBuZXQgKm5ldCkKIHsKLQlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gdGlwY19uZXQobmV0KTsKIAlzdHJ1Y3QgdGlwY19iZWFyZXIgKmI7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JFQVJFUlM7IGkrKykgewotCQliID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwodG4tPmJlYXJlcl9saXN0W2ldKTsKKwkJYiA9IGJlYXJlcl9nZXQobmV0LCBpKTsKKwkJaWYgKGIpCisJCQljbGVhcl9iaXRfdW5sb2NrKDAsICZiLT51cCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7CisJCWIgPSBiZWFyZXJfZ2V0KG5ldCwgaSk7CiAJCWlmIChiKQogCQkJdGlwY19yZXNldF9iZWFyZXIobmV0LCBiKTsKIAl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKwkJYiA9IGJlYXJlcl9nZXQobmV0LCBpKTsKKwkJaWYgKGIpCisJCQl0ZXN0X2FuZF9zZXRfYml0X2xvY2soMCwgJmItPnVwKTsKKwl9CiB9CiAKIC8qKgpAQCAtMzgyLDggKzQwMCw5IEBACiAJaW50IGJlYXJlcl9pZCA9IGItPmlkZW50aXR5OwogCiAJcHJfaW5mbygiRGlzYWJsaW5nIGJlYXJlciA8JXM+XG4iLCBiLT5uYW1lKTsKLQliLT5tZWRpYS0+ZGlzYWJsZV9tZWRpYShiKTsKKwljbGVhcl9iaXRfdW5sb2NrKDAsICZiLT51cCk7CiAJdGlwY19ub2RlX2RlbGV0ZV9saW5rcyhuZXQsIGJlYXJlcl9pZCk7CisJYi0+bWVkaWEtPmRpc2FibGVfbWVkaWEoYik7CiAJUkNVX0lOSVRfUE9JTlRFUihiLT5tZWRpYV9wdHIsIE5VTEwpOwogCWlmIChiLT5saW5rX3JlcSkKIAkJdGlwY19kaXNjX2RlbGV0ZShiLT5saW5rX3JlcSk7CkBAIC00NDAsMjIgKzQ1OSwxNiBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IGRlbHRhOwotCXZvaWQgKnRpcGNfcHRyOwogCiAJZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopcmN1X2RlcmVmZXJlbmNlX3J0bmwoYi0+bWVkaWFfcHRyKTsKIAlpZiAoIWRldikKIAkJcmV0dXJuIDA7CiAKLQkvKiBTZW5kIFJFU0VUIG1lc3NhZ2UgZXZlbiBpZiBiZWFyZXIgaXMgZGV0YWNoZWQgZnJvbSBkZXZpY2UgKi8KLQl0aXBjX3B0ciA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGRldi0+dGlwY19wdHIpOwotCWlmICh1bmxpa2VseSghdGlwY19wdHIgJiYgIW1zZ19pc19yZXNldChidWZfbXNnKHNrYikpKSkKLQkJZ290byBkcm9wOwotCi0JZGVsdGEgPSBkZXYtPmhhcmRfaGVhZGVyX2xlbiAtIHNrYl9oZWFkcm9vbShza2IpOwotCWlmICgoZGVsdGEgPiAwKSAmJgotCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgU0tCX0RBVEFfQUxJR04oZGVsdGEpLCAwLCBHRlBfQVRPTUlDKSkKLQkJZ290byBkcm9wOwotCisJZGVsdGEgPSBTS0JfREFUQV9BTElHTihkZXYtPmhhcmRfaGVhZGVyX2xlbiAtIHNrYl9oZWFkcm9vbShza2IpKTsKKwlpZiAoKGRlbHRhID4gMCkgJiYgcHNrYl9leHBhbmRfaGVhZChza2IsIGRlbHRhLCAwLCBHRlBfQVRPTUlDKSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9USVBDKTsKQEAgLTQ2Myw5ICs0NzYsNiBAQAogCQkJZGV2LT5kZXZfYWRkciwgc2tiLT5sZW4pOwogCWRldl9xdWV1ZV94bWl0KHNrYik7CiAJcmV0dXJuIDA7Ci1kcm9wOgotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiAwOwogfQogCiBpbnQgdGlwY19iZWFyZXJfbXR1KHN0cnVjdCBuZXQgKm5ldCwgdTMyIGJlYXJlcl9pZCkKQEAgLTQ4NywxMiArNDk3LDEyIEBACiAJCQkgIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRlc3QpCiB7Ci0Jc3RydWN0IHRpcGNfbmV0ICp0biA9IHRpcGNfbmV0KG5ldCk7CisJc3RydWN0IHRpcGNfbXNnICpoZHIgPSBidWZfbXNnKHNrYik7CiAJc3RydWN0IHRpcGNfYmVhcmVyICpiOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWIgPSByY3VfZGVyZWZlcmVuY2VfcnRubCh0bi0+YmVhcmVyX2xpc3RbYmVhcmVyX2lkXSk7Ci0JaWYgKGxpa2VseShiKSkKKwliID0gYmVhcmVyX2dldChuZXQsIGJlYXJlcl9pZCk7CisJaWYgKGxpa2VseShiICYmICh0ZXN0X2JpdCgwLCAmYi0+dXApIHx8IG1zZ19pc19yZXNldChoZHIpKSkpCiAJCWItPm1lZGlhLT5zZW5kX21zZyhuZXQsIHNrYiwgYiwgZGVzdCk7CiAJZWxzZQogCQlrZnJlZV9za2Ioc2tiKTsKQEAgLTUwNSw3ICs1MTUsNiBAQAogCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSwKIAkJICAgICAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZHN0KQogewotCXN0cnVjdCB0aXBjX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHRpcGNfbmV0X2lkKTsKIAlzdHJ1Y3QgdGlwY19iZWFyZXIgKmI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKIApAQCAtNTEzLDEyICs1MjIsMTUgQEAKIAkJcmV0dXJuOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWIgPSByY3VfZGVyZWZlcmVuY2VfcnRubCh0bi0+YmVhcmVyX2xpc3RbYmVhcmVyX2lkXSk7CisJYiA9IGJlYXJlcl9nZXQobmV0LCBiZWFyZXJfaWQpOwogCWlmICh1bmxpa2VseSghYikpCiAJCV9fc2tiX3F1ZXVlX3B1cmdlKHhtaXRxKTsKIAlza2JfcXVldWVfd2Fsa19zYWZlKHhtaXRxLCBza2IsIHRtcCkgewogCQlfX3NrYl9kZXF1ZXVlKHhtaXRxKTsKLQkJYi0+bWVkaWEtPnNlbmRfbXNnKG5ldCwgc2tiLCBiLCBkc3QpOworCQlpZiAobGlrZWx5KHRlc3RfYml0KDAsICZiLT51cCkgfHwgbXNnX2lzX3Jlc2V0KGJ1Zl9tc2coc2tiKSkpKQorCQkJYi0+bWVkaWEtPnNlbmRfbXNnKG5ldCwgc2tiLCBiLCBkc3QpOworCQllbHNlCisJCQlrZnJlZV9za2Ioc2tiKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CkBAIC01MzUsOCArNTQ3LDggQEAKIAlzdHJ1Y3QgdGlwY19tc2cgKmhkcjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQliID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwodG4tPmJlYXJlcl9saXN0W2JlYXJlcl9pZF0pOwotCWlmICh1bmxpa2VseSghYikpCisJYiA9IGJlYXJlcl9nZXQobmV0LCBiZWFyZXJfaWQpOworCWlmICh1bmxpa2VseSghYiB8fCAhdGVzdF9iaXQoMCwgJmItPnVwKSkpCiAJCV9fc2tiX3F1ZXVlX3B1cmdlKHhtaXRxKTsKIAlza2JfcXVldWVfd2Fsa19zYWZlKHhtaXRxLCBza2IsIHRtcCkgewogCQloZHIgPSBidWZfbXNnKHNrYik7CkBAIC01NjYsNyArNTc4LDggQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAliID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwoZGV2LT50aXBjX3B0cik7Ci0JaWYgKGxpa2VseShiICYmIChza2ItPnBrdF90eXBlIDw9IFBBQ0tFVF9CUk9BRENBU1QpKSkgeworCWlmIChsaWtlbHkoYiAmJiB0ZXN0X2JpdCgwLCAmYi0+dXApICYmCisJCSAgIChza2ItPnBrdF90eXBlIDw9IFBBQ0tFVF9CUk9BRENBU1QpKSkgewogCQlza2ItPm5leHQgPSBOVUxMOwogCQl0aXBjX3JjdihkZXZfbmV0KGRldiksIHNrYiwgYik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtNTkxLDE4ICs2MDQsOSBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7Ci0Jc3RydWN0IHRpcGNfbmV0ICp0biA9IHRpcGNfbmV0KG5ldCk7CiAJc3RydWN0IHRpcGNfYmVhcmVyICpiOwotCWludCBpOwogCiAJYiA9IHJ0bmxfZGVyZWZlcmVuY2UoZGV2LT50aXBjX3B0cik7Ci0JaWYgKCFiKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgYiA9IE5VTEwsIGkrKykgewotCQkJYiA9IHJ0bmxfZGVyZWZlcmVuY2UodG4tPmJlYXJlcl9saXN0W2ldKTsKLQkJCWlmIChiICYmIChiLT5tZWRpYV9wdHIgPT0gZGV2KSkKLQkJCQlicmVhazsKLQkJfQotCX0KIAlpZiAoIWIpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIApAQCAtNjEzLDExICs2MTcsMTAgQEAKIAkJaWYgKG5ldGlmX2NhcnJpZXJfb2soZGV2KSkKIAkJCWJyZWFrOwogCWNhc2UgTkVUREVWX1VQOgotCQlyY3VfYXNzaWduX3BvaW50ZXIoZGV2LT50aXBjX3B0ciwgYik7CisJCXRlc3RfYW5kX3NldF9iaXRfbG9jaygwLCAmYi0+dXApOwogCQlicmVhazsKIAljYXNlIE5FVERFVl9HT0lOR19ET1dOOgotCQlSQ1VfSU5JVF9QT0lOVEVSKGRldi0+dGlwY19wdHIsIE5VTEwpOwotCQlzeW5jaHJvbml6ZV9uZXQoKTsKKwkJY2xlYXJfYml0X3VubG9jaygwLCAmYi0+dXApOwogCQl0aXBjX3Jlc2V0X2JlYXJlcihuZXQsIGIpOwogCQlicmVhazsKIAljYXNlIE5FVERFVl9DSEFOR0VNVFU6CkBAIC03MDksNiArNzEyLDE0IEBACiAJCWdvdG8gcHJvcF9tc2dfZnVsbDsKIAogCW5sYV9uZXN0X2VuZChtc2ctPnNrYiwgcHJvcCk7CisKKyNpZmRlZiBDT05GSUdfVElQQ19NRURJQV9VRFAKKwlpZiAoYmVhcmVyLT5tZWRpYS0+dHlwZV9pZCA9PSBUSVBDX01FRElBX1RZUEVfVURQKSB7CisJCWlmICh0aXBjX3VkcF9ubF9hZGRfYmVhcmVyX2RhdGEobXNnLCBiZWFyZXIpKQorCQkJZ290byBhdHRyX21zZ19mdWxsOworCX0KKyNlbmRpZgorCiAJbmxhX25lc3RfZW5kKG1zZy0+c2tiLCBhdHRycyk7CiAJZ2VubG1zZ19lbmQobXNnLT5za2IsIGhkcik7CiAKQEAgLTg5NSw2ICs5MDYsNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IHRpcGNfbmxfYmVhcmVyX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCWludCBlcnI7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgdGlwY19iZWFyZXIgKmI7CisJc3RydWN0IG5sYXR0ciAqYXR0cnNbVElQQ19OTEFfQkVBUkVSX01BWCArIDFdOworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOworCisJaWYgKCFpbmZvLT5hdHRyc1tUSVBDX05MQV9CRUFSRVJdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IG5sYV9wYXJzZV9uZXN0ZWQoYXR0cnMsIFRJUENfTkxBX0JFQVJFUl9NQVgsCisJCQkgICAgICAgaW5mby0+YXR0cnNbVElQQ19OTEFfQkVBUkVSXSwKKwkJCSAgICAgICB0aXBjX25sX2JlYXJlcl9wb2xpY3kpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoIWF0dHJzW1RJUENfTkxBX0JFQVJFUl9OQU1FXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbmFtZSA9IG5sYV9kYXRhKGF0dHJzW1RJUENfTkxBX0JFQVJFUl9OQU1FXSk7CisKKwlydG5sX2xvY2soKTsKKwliID0gdGlwY19iZWFyZXJfZmluZChuZXQsIG5hbWUpOworCWlmICghYikgeworCQlydG5sX3VubG9jaygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyNpZmRlZiBDT05GSUdfVElQQ19NRURJQV9VRFAKKwlpZiAoYXR0cnNbVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTXSkgeworCQllcnIgPSB0aXBjX3VkcF9ubF9iZWFyZXJfYWRkKGIsCisJCQkJCSAgICAgYXR0cnNbVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTXSk7CisJCWlmIChlcnIpIHsKKwkJCXJ0bmxfdW5sb2NrKCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorI2VuZGlmCisJcnRubF91bmxvY2soKTsKKworCXJldHVybiAwOworfQorCiBpbnQgdGlwY19ubF9iZWFyZXJfc2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL25ldC90aXBjL2JlYXJlci5oIGIvbmV0L3RpcGMvYmVhcmVyLmgKaW5kZXggNDM3NTdmMS4uNzg4OTJlMmYgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JlYXJlci5oCisrKyBiL25ldC90aXBjL2JlYXJlci5oCkBAIC0xNTAsNiArMTUwLDcgQEAKIAl1MzIgaWRlbnRpdHk7CiAJc3RydWN0IHRpcGNfbGlua19yZXEgKmxpbmtfcmVxOwogCWNoYXIgbmV0X3BsYW5lOworCXVuc2lnbmVkIGxvbmcgdXA7CiB9OwogCiBzdHJ1Y3QgdGlwY19iZWFyZXJfbmFtZXMgewpAQCAtMTgwLDYgKzE4MSw3IEBACiBpbnQgdGlwY19ubF9iZWFyZXJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpOwogaW50IHRpcGNfbmxfYmVhcmVyX2dldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIGludCB0aXBjX25sX2JlYXJlcl9zZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CitpbnQgdGlwY19ubF9iZWFyZXJfYWRkKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOwogCiBpbnQgdGlwY19ubF9tZWRpYV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYik7CiBpbnQgdGlwY19ubF9tZWRpYV9nZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9saW5rLmMgYi9uZXQvdGlwYy9saW5rLmMKaW5kZXggODc3ZDk0Zi4uYjM2ZTE2YyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbGluay5jCisrKyBiL25ldC90aXBjL2xpbmsuYwpAQCAtMTgxLDcgKzE4MSwxMCBAQAogCXUxNiBhY2tlZDsKIAlzdHJ1Y3QgdGlwY19saW5rICpiY19yY3ZsaW5rOwogCXN0cnVjdCB0aXBjX2xpbmsgKmJjX3NuZGxpbms7Ci0JaW50IG5hY2tfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBwcmV2X3JldHI7CisJdTE2IHByZXZfZnJvbTsKKwl1MTYgcHJldl90bzsKKwl1OCBuYWNrX3N0YXRlOwogCWJvb2wgYmNfcGVlcl9pc191cDsKIAogCS8qIFN0YXRpc3RpY3MgKi8KQEAgLTIwMiw2ICsyMDUsOCBAQAogCUJDX05BQ0tfU05EX1NVUFBSRVNTLAogfTsKIAorI2RlZmluZSBUSVBDX0JDX1JFVFJfTElNSVQgMTAgICAvKiBbbXNdICovCisKIC8qCiAgKiBJbnRlcnZhbCBiZXR3ZWVuIE5BQ0tzIHdoZW4gcGFja2V0cyBhcnJpdmUgb3V0IG9mIG9yZGVyCiAgKi8KQEAgLTIzNyw4ICsyNDIsOCBAQAogCQkJCSAgICAgIHUxNiByY3ZnYXAsIGludCB0b2xlcmFuY2UsIGludCBwcmlvcml0eSwKIAkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7CiBzdGF0aWMgdm9pZCBsaW5rX3ByaW50KHN0cnVjdCB0aXBjX2xpbmsgKmwsIGNvbnN0IGNoYXIgKnN0cik7Ci1zdGF0aWMgdm9pZCB0aXBjX2xpbmtfYnVpbGRfbmFja19tc2coc3RydWN0IHRpcGNfbGluayAqbCwKLQkJCQkgICAgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKTsKK3N0YXRpYyBpbnQgdGlwY19saW5rX2J1aWxkX25hY2tfbXNnKHN0cnVjdCB0aXBjX2xpbmsgKmwsCisJCQkJICAgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKTsKIHN0YXRpYyB2b2lkIHRpcGNfbGlua19idWlsZF9iY19pbml0X21zZyhzdHJ1Y3QgdGlwY19saW5rICpsLAogCQkJCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7CiBzdGF0aWMgYm9vbCB0aXBjX2xpbmtfcmVsZWFzZV9wa3RzKHN0cnVjdCB0aXBjX2xpbmsgKmwsIHUxNiB0byk7CkBAIC0zNjcsNiArMzcyLDE4IEBACiAJcmV0dXJuIGwtPmFja2VyczsKIH0KIAordTE2IGxpbmtfYmNfcmN2X2dhcChzdHJ1Y3QgdGlwY19saW5rICpsKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfcGVlaygmbC0+ZGVmZXJkcSk7CisJdTE2IGdhcCA9IDA7CisKKwlpZiAobW9yZShsLT5zbmRfbnh0LCBsLT5yY3Zfbnh0KSkKKwkJZ2FwID0gbC0+c25kX254dCAtIGwtPnJjdl9ueHQ7CisJaWYgKHNrYikKKwkJZ2FwID0gYnVmX3NlcW5vKHNrYikgLSBsLT5yY3Zfbnh0OworCXJldHVybiBnYXA7Cit9CisKIHZvaWQgdGlwY19saW5rX3NldF9tdHUoc3RydWN0IHRpcGNfbGluayAqbCwgaW50IG10dSkKIHsKIAlsLT5tdHUgPSBtdHU7CkBAIC04MDcsNyArODI0LDcgQEAKIAogCXNrYl9xdWV1ZV93YWxrX3NhZmUoJmwtPndha2V1cHEsIHNrYiwgdG1wKSB7CiAJCWltcCA9IFRJUENfU0tCX0NCKHNrYiktPmNoYWluX2ltcDsKLQkJbGltID0gbC0+d2luZG93ICsgbC0+YmFja2xvZ1tpbXBdLmxpbWl0OworCQlsaW0gPSBsLT5iYWNrbG9nW2ltcF0ubGltaXQ7CiAJCXBuZFtpbXBdICs9IFRJUENfU0tCX0NCKHNrYiktPmNoYWluX3N6OwogCQlpZiAoKHBuZFtpbXBdICsgbC0+YmFja2xvZ1tpbXBdLmxlbikgPj0gbGltKQogCQkJYnJlYWs7CkBAIC04NzMsOSArODkwLDExIEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKl9za2IsICpic2tiOwogCiAJLyogTWF0Y2ggbXNnIGltcG9ydGFuY2UgYWdhaW5zdCB0aGlzIGFuZCBhbGwgaGlnaGVyIGJhY2tsb2cgbGltaXRzOiAqLwotCWZvciAoaSA9IGltcDsgaSA8PSBUSVBDX1NZU1RFTV9JTVBPUlRBTkNFOyBpKyspIHsKLQkJaWYgKHVubGlrZWx5KGwtPmJhY2tsb2dbaV0ubGVuID49IGwtPmJhY2tsb2dbaV0ubGltaXQpKQotCQkJcmV0dXJuIGxpbmtfc2NoZWR1bGVfdXNlcihsLCBsaXN0KTsKKwlpZiAoIXNrYl9xdWV1ZV9lbXB0eShiYWNrbG9ncSkpIHsKKwkJZm9yIChpID0gaW1wOyBpIDw9IFRJUENfU1lTVEVNX0lNUE9SVEFOQ0U7IGkrKykgeworCQkJaWYgKHVubGlrZWx5KGwtPmJhY2tsb2dbaV0ubGVuID49IGwtPmJhY2tsb2dbaV0ubGltaXQpKQorCQkJCXJldHVybiBsaW5rX3NjaGVkdWxlX3VzZXIobCwgbGlzdCk7CisJCX0KIAl9CiAJaWYgKHVubGlrZWx5KG1zZ19zaXplKGhkcikgPiBtdHUpKSB7CiAJCXNrYl9xdWV1ZV9wdXJnZShsaXN0KTsKQEAgLTExMzMsNyArMTE1MiwxMCBAQAogCQlpZiAoKChsLT5yY3Zfbnh0IF4gdGlwY19vd25fYWRkcihsLT5uZXQpKSAmIDB4ZikgIT0gMHhmKQogCQkJcmV0dXJuIDA7CiAJCWwtPnJjdl91bmFja2VkID0gMDsKLQkJcmV0dXJuIFRJUENfTElOS19TTkRfQkNfQUNLOworCisJCS8qIFVzZSBzbmRfbnh0IHRvIHN0b3JlIHBlZXIncyBzbmRfbnh0IGluIGJyb2FkY2FzdCByY3YgbGluayAqLworCQlsLT5zbmRfbnh0ID0gbC0+cmN2X254dDsKKwkJcmV0dXJuIFRJUENfTElOS19TTkRfU1RBVEU7CiAJfQogCiAJLyogVW5pY2FzdCBBQ0sgKi8KQEAgLTExNjIsMTcgKzExODQsMjYgQEAKIH0KIAogLyogdGlwY19saW5rX2J1aWxkX25hY2tfbXNnOiBwcmVwYXJlIGxpbmsgbmFjayBtZXNzYWdlIGZvciB0cmFuc21pc3Npb24KKyAqIE5vdGUgdGhhdCBzZW5kaW5nIG9mIGJyb2FkY2FzdCBOQUNLIGlzIGNvb3JkaW5hdGVkIGFtb25nIG5vZGVzLCB0bworICogcmVkdWNlIHRoZSByaXNrIG9mIE5BQ0sgc3Rvcm1zIHRvd2FyZHMgdGhlIHNlbmRlcgogICovCi1zdGF0aWMgdm9pZCB0aXBjX2xpbmtfYnVpbGRfbmFja19tc2coc3RydWN0IHRpcGNfbGluayAqbCwKLQkJCQkgICAgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKQorc3RhdGljIGludCB0aXBjX2xpbmtfYnVpbGRfbmFja19tc2coc3RydWN0IHRpcGNfbGluayAqbCwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpCiB7CiAJdTMyIGRlZl9jbnQgPSArK2wtPnN0YXRzLmRlZmVycmVkX3JlY3Y7CisJaW50IG1hdGNoMSwgbWF0Y2gyOwogCi0JaWYgKGxpbmtfaXNfYmNfcmN2bGluayhsKSkKLQkJcmV0dXJuOworCWlmIChsaW5rX2lzX2JjX3JjdmxpbmsobCkpIHsKKwkJbWF0Y2gxID0gZGVmX2NudCAmIDB4ZjsKKwkJbWF0Y2gyID0gdGlwY19vd25fYWRkcihsLT5uZXQpICYgMHhmOworCQlpZiAobWF0Y2gxID09IG1hdGNoMikKKwkJCXJldHVybiBUSVBDX0xJTktfU05EX1NUQVRFOworCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAoKHNrYl9xdWV1ZV9sZW4oJmwtPmRlZmVyZHEpID09IDEpIHx8ICEoZGVmX2NudCAlIFRJUENfTkFDS19JTlRWKSkKIAkJdGlwY19saW5rX2J1aWxkX3Byb3RvX21zZyhsLCBTVEFURV9NU0csIDAsIDAsIDAsIDAsIHhtaXRxKTsKKwlyZXR1cm4gMDsKIH0KIAogLyogdGlwY19saW5rX3JjdiAtIHByb2Nlc3MgVElQQyBwYWNrZXRzL21lc3NhZ2VzIGFycml2aW5nIGZyb20gb2ZmLW5vZGUKQEAgLTEyMjMsNyArMTI1NCw3IEBACiAJCS8qIERlZmVyIGRlbGl2ZXJ5IGlmIHNlcXVlbmNlIGdhcCAqLwogCQlpZiAodW5saWtlbHkoc2Vxbm8gIT0gcmN2X254dCkpIHsKIAkJCV9fdGlwY19za2JfcXVldWVfc29ydGVkKGRlZnEsIHNlcW5vLCBza2IpOwotCQkJdGlwY19saW5rX2J1aWxkX25hY2tfbXNnKGwsIHhtaXRxKTsKKwkJCXJjIHw9IHRpcGNfbGlua19idWlsZF9uYWNrX21zZyhsLCB4bWl0cSk7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xMjM0LDcgKzEyNjUsNyBAQAogCQkJcmMgfD0gdGlwY19saW5rX2lucHV0KGwsIHNrYiwgbC0+aW5wdXRxKTsKIAkJaWYgKHVubGlrZWx5KCsrbC0+cmN2X3VuYWNrZWQgPj0gVElQQ19NSU5fTElOS19XSU4pKQogCQkJcmMgfD0gdGlwY19saW5rX2J1aWxkX3N0YXRlX21zZyhsLCB4bWl0cSk7Ci0JCWlmICh1bmxpa2VseShyYyAmIH5USVBDX0xJTktfU05EX0JDX0FDSykpCisJCWlmICh1bmxpa2VseShyYyAmIH5USVBDX0xJTktfU05EX1NUQVRFKSkKIAkJCWJyZWFrOwogCX0gd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKGRlZnEpKSk7CiAKQEAgLTEyNDgsMTAgKzEyNzksMTEgQEAKIAkJCQkgICAgICB1MTYgcmN2Z2FwLCBpbnQgdG9sZXJhbmNlLCBpbnQgcHJpb3JpdHksCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpCiB7CisJc3RydWN0IHRpcGNfbGluayAqYmNsID0gbC0+YmNfcmN2bGluazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB0aXBjX21zZyAqaGRyOwogCXN0cnVjdCBza19idWZmX2hlYWQgKmRmcSA9ICZsLT5kZWZlcmRxOwotCWJvb2wgbm9kZV91cCA9IGxpbmtfaXNfdXAobC0+YmNfcmN2bGluayk7CisJYm9vbCBub2RlX3VwID0gbGlua19pc191cChiY2wpOwogCXN0cnVjdCB0aXBjX21vbl9zdGF0ZSAqbXN0YXRlID0gJmwtPm1vbl9zdGF0ZTsKIAlpbnQgZGxlbiA9IDA7CiAJdm9pZCAqZGF0YTsKQEAgLTEyNzksNyArMTMxMSw3IEBACiAJbXNnX3NldF9uZXRfcGxhbmUoaGRyLCBsLT5uZXRfcGxhbmUpOwogCW1zZ19zZXRfbmV4dF9zZW50KGhkciwgbC0+c25kX254dCk7CiAJbXNnX3NldF9hY2soaGRyLCBsLT5yY3Zfbnh0IC0gMSk7Ci0JbXNnX3NldF9iY2FzdF9hY2soaGRyLCBsLT5iY19yY3ZsaW5rLT5yY3Zfbnh0IC0gMSk7CisJbXNnX3NldF9iY2FzdF9hY2soaGRyLCBiY2wtPnJjdl9ueHQgLSAxKTsKIAltc2dfc2V0X2xhc3RfYmNhc3QoaGRyLCBsLT5iY19zbmRsaW5rLT5zbmRfbnh0IC0gMSk7CiAJbXNnX3NldF9saW5rX3RvbGVyYW5jZShoZHIsIHRvbGVyYW5jZSk7CiAJbXNnX3NldF9saW5rcHJpbyhoZHIsIHByaW9yaXR5KTsKQEAgLTEyODksNiArMTMyMSw3IEBACiAKIAlpZiAobXR5cCA9PSBTVEFURV9NU0cpIHsKIAkJbXNnX3NldF9zZXFfZ2FwKGhkciwgcmN2Z2FwKTsKKwkJbXNnX3NldF9iY19nYXAoaGRyLCBsaW5rX2JjX3Jjdl9nYXAoYmNsKSk7CiAJCW1zZ19zZXRfcHJvYmUoaGRyLCBwcm9iZSk7CiAJCXRpcGNfbW9uX3ByZXAobC0+bmV0LCBkYXRhLCAmZGxlbiwgbXN0YXRlLCBsLT5iZWFyZXJfaWQpOwogCQltc2dfc2V0X3NpemUoaGRyLCBJTlRfSF9TSVpFICsgZGxlbik7CkBAIC0xNTcxLDUxICsxNjA0LDEwNyBAQAogCQlsLT5yY3Zfbnh0ID0gcGVlcnNfc25kX254dDsKIH0KIAorLyogbGlua19iY19yZXRyIGV2YWwoKS0gY2hlY2sgaWYgdGhlIGluZGljYXRlZCByYW5nZSBjYW4gYmUgcmV0cmFuc21pdHRlZCBub3cKKyAqIC0gQWRqdXN0IHBlcm1pdHRlZCByYW5nZSBpZiB0aGVyZSBpcyBvdmVybGFwIHdpdGggcHJldmlvdXMgcmV0cmFuc21pc3Npb24KKyAqLworc3RhdGljIGJvb2wgbGlua19iY19yZXRyX2V2YWwoc3RydWN0IHRpcGNfbGluayAqbCwgdTE2ICpmcm9tLCB1MTYgKnRvKQoreworCXVuc2lnbmVkIGxvbmcgZWxhcHNlZCA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGwtPnByZXZfcmV0cik7CisKKwlpZiAobGVzcygqdG8sICpmcm9tKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogTmV3IHJldHJhbnNtaXNzaW9uIHJlcXVlc3QgKi8KKwlpZiAoKGVsYXBzZWQgPiBUSVBDX0JDX1JFVFJfTElNSVQpIHx8CisJICAgIGxlc3MoKnRvLCBsLT5wcmV2X2Zyb20pIHx8IG1vcmUoKmZyb20sIGwtPnByZXZfdG8pKSB7CisJCWwtPnByZXZfZnJvbSA9ICpmcm9tOworCQlsLT5wcmV2X3RvID0gKnRvOworCQlsLT5wcmV2X3JldHIgPSBqaWZmaWVzOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBJbnNpZGUgcmFuZ2Ugb2YgcHJldmlvdXMgcmV0cmFuc21pdCAqLworCWlmICghbGVzcygqZnJvbSwgbC0+cHJldl9mcm9tKSAmJiAhbW9yZSgqdG8sIGwtPnByZXZfdG8pKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBGdWxseSBvciBwYXJ0aWFsbHkgb3V0c2lkZSBwcmV2aW91cyByYW5nZSA9PiBleGNsdWRlIG92ZXJsYXAgKi8KKwlpZiAobGVzcygqZnJvbSwgbC0+cHJldl9mcm9tKSkgeworCQkqdG8gPSBsLT5wcmV2X2Zyb20gLSAxOworCQlsLT5wcmV2X2Zyb20gPSAqZnJvbTsKKwl9CisJaWYgKG1vcmUoKnRvLCBsLT5wcmV2X3RvKSkgeworCQkqZnJvbSA9IGwtPnByZXZfdG8gKyAxOworCQlsLT5wcmV2X3RvID0gKnRvOworCX0KKwlsLT5wcmV2X3JldHIgPSBqaWZmaWVzOworCXJldHVybiB0cnVlOworfQorCiAvKiB0aXBjX2xpbmtfYmNfc3luY19yY3YgLSB1cGRhdGUgcmN2IGxpbmsgYWNjb3JkaW5nIHRvIHBlZXIncyBzZW5kIHN0YXRlCiAgKi8KLXZvaWQgdGlwY19saW5rX2JjX3N5bmNfcmN2KHN0cnVjdCB0aXBjX2xpbmsgKmwsIHN0cnVjdCB0aXBjX21zZyAqaGRyLAotCQkJICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpCitpbnQgdGlwY19saW5rX2JjX3N5bmNfcmN2KHN0cnVjdCB0aXBjX2xpbmsgKmwsIHN0cnVjdCB0aXBjX21zZyAqaGRyLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSkKIHsKKwlzdHJ1Y3QgdGlwY19saW5rICpzbmRfbCA9IGwtPmJjX3NuZGxpbms7CiAJdTE2IHBlZXJzX3NuZF9ueHQgPSBtc2dfYmNfc25kX254dChoZHIpOworCXUxNiBmcm9tID0gbXNnX2JjYXN0X2FjayhoZHIpICsgMTsKKwl1MTYgdG8gPSBmcm9tICsgbXNnX2JjX2dhcChoZHIpIC0gMTsKKwlpbnQgcmMgPSAwOwogCiAJaWYgKCFsaW5rX2lzX3VwKGwpKQotCQlyZXR1cm47CisJCXJldHVybiByYzsKIAogCWlmICghbXNnX3BlZXJfbm9kZV9pc191cChoZHIpKQotCQlyZXR1cm47CisJCXJldHVybiByYzsKIAogCS8qIE9wZW4gd2hlbiBwZWVyIGFja293bGVkZ2VzIG91ciBiY2FzdCBpbml0IG1zZyAocGt0ICMxKSAqLwogCWlmIChtc2dfYWNrKGhkcikpCiAJCWwtPmJjX3BlZXJfaXNfdXAgPSB0cnVlOwogCiAJaWYgKCFsLT5iY19wZWVyX2lzX3VwKQotCQlyZXR1cm47CisJCXJldHVybiByYzsKKworCWwtPnN0YXRzLnJlY3ZfbmFja3MrKzsKIAogCS8qIElnbm9yZSBpZiBwZWVyc19zbmRfbnh0IGdvZXMgYmV5b25kIHJlY2VpdmUgd2luZG93ICovCiAJaWYgKG1vcmUocGVlcnNfc25kX254dCwgbC0+cmN2X254dCArIGwtPndpbmRvdykpCi0JCXJldHVybjsKKwkJcmV0dXJuIHJjOworCisJaWYgKGxpbmtfYmNfcmV0cl9ldmFsKHNuZF9sLCAmZnJvbSwgJnRvKSkKKwkJcmMgPSB0aXBjX2xpbmtfcmV0cmFucyhzbmRfbCwgZnJvbSwgdG8sIHhtaXRxKTsKKworCWwtPnNuZF9ueHQgPSBwZWVyc19zbmRfbnh0OworCWlmIChsaW5rX2JjX3Jjdl9nYXAobCkpCisJCXJjIHw9IFRJUENfTElOS19TTkRfU1RBVEU7CisKKwkvKiBSZXR1cm4gbm93IGlmIHNlbmRlciBzdXBwb3J0cyBuYWNrIHZpYSBTVEFURSBtZXNzYWdlcyAqLworCWlmIChsLT5wZWVyX2NhcHMgJiBUSVBDX0JDQVNUX1NUQVRFX05BQ0spCisJCXJldHVybiByYzsKKworCS8qIE90aGVyd2lzZSwgYmUgYmFja3dhcmRzIGNvbXBhdGlibGUgKi8KIAogCWlmICghbW9yZShwZWVyc19zbmRfbnh0LCBsLT5yY3Zfbnh0KSkgewogCQlsLT5uYWNrX3N0YXRlID0gQkNfTkFDS19TTkRfQ09ORElUSU9OQUw7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyogRG9uJ3QgTkFDSyBpZiBvbmUgd2FzIHJlY2VudGx5IHNlbnQgb3IgcGVla2VkICovCiAJaWYgKGwtPm5hY2tfc3RhdGUgPT0gQkNfTkFDS19TTkRfU1VQUFJFU1MpIHsKIAkJbC0+bmFja19zdGF0ZSA9IEJDX05BQ0tfU05EX1VOQ09ORElUSU9OQUw7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCiAJLyogQ29uZGl0aW9uYWxseSBkZWxheSBOQUNLIHNlbmRpbmcgdW50aWwgbmV4dCBzeW5jaCByY3YgKi8KIAlpZiAobC0+bmFja19zdGF0ZSA9PSBCQ19OQUNLX1NORF9DT05ESVRJT05BTCkgewogCQlsLT5uYWNrX3N0YXRlID0gQkNfTkFDS19TTkRfVU5DT05ESVRJT05BTDsKIAkJaWYgKChwZWVyc19zbmRfbnh0IC0gbC0+cmN2X254dCkgPCBUSVBDX01JTl9MSU5LX1dJTikKLQkJCXJldHVybjsKKwkJCXJldHVybiAwOwogCX0KIAogCS8qIFNlbmQgTkFDSyBub3cgYnV0IHN1cHByZXNzIG5leHQgb25lICovCiAJdGlwY19saW5rX2J1aWxkX2JjX3Byb3RvX21zZyhsLCB0cnVlLCBwZWVyc19zbmRfbnh0LCB4bWl0cSk7CiAJbC0+bmFja19zdGF0ZSA9IEJDX05BQ0tfU05EX1NVUFBSRVNTOworCXJldHVybiAwOwogfQogCiB2b2lkIHRpcGNfbGlua19iY19hY2tfcmN2KHN0cnVjdCB0aXBjX2xpbmsgKmwsIHUxNiBhY2tlZCwKQEAgLTE2NTIsNiArMTc0MSw4IEBACiB9CiAKIC8qIHRpcGNfbGlua19iY19uYWNrX3JjdigpOiByZWNlaXZlIGJyb2FkY2FzdCBuYWNrIG1lc3NhZ2UKKyAqIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHNpbmNlCisgKiBubyBCQ0FTVF9QUk9UT0NPTC9TVEFURSBtZXNzYWdlcyBvY2N1ciBmcm9tIFRJUEMgdjIuNS4KICAqLwogaW50IHRpcGNfbGlua19iY19uYWNrX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSkKQEAgLTE2OTIsMTAgKzE3ODMsMTAgQEAKIAlpbnQgbWF4X2J1bGsgPSBUSVBDX01BWF9QVUJMSUNBVElPTlMgLyAobC0+bXR1IC8gSVRFTV9TSVpFKTsKIAogCWwtPndpbmRvdyA9IHdpbjsKLQlsLT5iYWNrbG9nW1RJUENfTE9XX0lNUE9SVEFOQ0VdLmxpbWl0ICAgICAgPSB3aW4gLyAyOwotCWwtPmJhY2tsb2dbVElQQ19NRURJVU1fSU1QT1JUQU5DRV0ubGltaXQgICA9IHdpbjsKLQlsLT5iYWNrbG9nW1RJUENfSElHSF9JTVBPUlRBTkNFXS5saW1pdCAgICAgPSB3aW4gLyAyICogMzsKLQlsLT5iYWNrbG9nW1RJUENfQ1JJVElDQUxfSU1QT1JUQU5DRV0ubGltaXQgPSB3aW4gKiAyOworCWwtPmJhY2tsb2dbVElQQ19MT1dfSU1QT1JUQU5DRV0ubGltaXQgICAgICA9IG1heF90KHUxNiwgNTAsIHdpbik7CisJbC0+YmFja2xvZ1tUSVBDX01FRElVTV9JTVBPUlRBTkNFXS5saW1pdCAgID0gbWF4X3QodTE2LCAxMDAsIHdpbiAqIDIpOworCWwtPmJhY2tsb2dbVElQQ19ISUdIX0lNUE9SVEFOQ0VdLmxpbWl0ICAgICA9IG1heF90KHUxNiwgMTUwLCB3aW4gKiAzKTsKKwlsLT5iYWNrbG9nW1RJUENfQ1JJVElDQUxfSU1QT1JUQU5DRV0ubGltaXQgPSBtYXhfdCh1MTYsIDIwMCwgd2luICogNCk7CiAJbC0+YmFja2xvZ1tUSVBDX1NZU1RFTV9JTVBPUlRBTkNFXS5saW1pdCAgID0gbWF4X2J1bGs7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC90aXBjL2xpbmsuaCBiL25ldC90aXBjL2xpbmsuaAppbmRleCBkN2U5ZDQyLi5kMWJkMTc4IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9saW5rLmgKKysrIGIvbmV0L3RpcGMvbGluay5oCkBAIC02Myw3ICs2Myw3IEBACiBlbnVtIHsKIAlUSVBDX0xJTktfVVBfRVZUICAgICAgID0gMSwKIAlUSVBDX0xJTktfRE9XTl9FVlQgICAgID0gKDEgPDwgMSksCi0JVElQQ19MSU5LX1NORF9CQ19BQ0sgICA9ICgxIDw8IDIpCisJVElQQ19MSU5LX1NORF9TVEFURSAgICA9ICgxIDw8IDIpCiB9OwogCiAvKiBTdGFydGluZyB2YWx1ZSBmb3IgbWF4aW11bSBwYWNrZXQgc2l6ZSBuZWdvdGlhdGlvbiBvbiB1bmljYXN0IGxpbmtzCkBAIC0xMzgsOCArMTM4LDggQEAKIHZvaWQgdGlwY19saW5rX2J1aWxkX2JjX3N5bmNfbXNnKHN0cnVjdCB0aXBjX2xpbmsgKmwsCiAJCQkJIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKTsKIHZvaWQgdGlwY19saW5rX2JjX2luaXRfcmN2KHN0cnVjdCB0aXBjX2xpbmsgKmwsIHN0cnVjdCB0aXBjX21zZyAqaGRyKTsKLXZvaWQgdGlwY19saW5rX2JjX3N5bmNfcmN2KHN0cnVjdCB0aXBjX2xpbmsgKmwsICAgc3RydWN0IHRpcGNfbXNnICpoZHIsCi0JCQkgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICp4bWl0cSk7CitpbnQgdGlwY19saW5rX2JjX3N5bmNfcmN2KHN0cnVjdCB0aXBjX2xpbmsgKmwsICAgc3RydWN0IHRpcGNfbXNnICpoZHIsCisJCQkgIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKTsKIGludCB0aXBjX2xpbmtfYmNfbmFja19yY3Yoc3RydWN0IHRpcGNfbGluayAqbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqeG1pdHEpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9tc2cuaCBiL25ldC90aXBjL21zZy5oCmluZGV4IDdjZjUyZmIuLmMzODMyY2QgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL21zZy5oCisrKyBiL25ldC90aXBjL21zZy5oCkBAIC03MTksNiArNzE5LDE2IEBACiAJcmV0dXJuIChjaGFyICopJm0tPmhkcltUSVBDX01FRElBX0lORk9fT0ZGU0VUXTsKIH0KIAorc3RhdGljIGlubGluZSB1MzIgbXNnX2JjX2dhcChzdHJ1Y3QgdGlwY19tc2cgKm0pCit7CisJcmV0dXJuIG1zZ19iaXRzKG0sIDgsIDAsIDB4M2ZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfYmNfZ2FwKHN0cnVjdCB0aXBjX21zZyAqbSwgdTMyIG4pCit7CisJbXNnX3NldF9iaXRzKG0sIDgsIDAsIDB4M2ZmLCBuKTsKK30KKwogLyoKICAqIFdvcmQgOQogICovCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMgYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKaW5kZXggNmI2MjZhNi4uYTA0ZmU5YiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCisrKyBiL25ldC90aXBjL25hbWVfZGlzdHIuYwpAQCAtNjIsNiArNjIsOCBAQAogCiAvKioKICAqIG5hbWVkX3ByZXBhcmVfYnVmIC0gYWxsb2NhdGUgJiBpbml0aWFsaXplIGEgcHVibGljYXRpb24gbWVzc2FnZQorICoKKyAqIFRoZSBidWZmZXIgcmV0dXJuZWQgaXMgb2Ygc2l6ZSBJTlRfSF9TSVpFICsgcGF5bG9hZCBzaXplCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbmFtZWRfcHJlcGFyZV9idWYoc3RydWN0IG5ldCAqbmV0LCB1MzIgdHlwZSwgdTMyIHNpemUsCiAJCQkJCSB1MzIgZGVzdCkKQEAgLTE0MSw5ICsxNDMsOSBAQAogCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlzdHJ1Y3QgZGlzdHJfaXRlbSAqaXRlbSA9IE5VTEw7Ci0JdWludCBtc2dfZHN6ID0gKHRpcGNfbm9kZV9nZXRfbXR1KG5ldCwgZG5vZGUsIDApIC8gSVRFTV9TSVpFKSAqCi0JCQlJVEVNX1NJWkU7Ci0JdWludCBtc2dfcmVtID0gbXNnX2RzejsKKwl1MzIgbXNnX2RzeiA9ICgodGlwY19ub2RlX2dldF9tdHUobmV0LCBkbm9kZSwgMCkgLSBJTlRfSF9TSVpFKSAvCisJCQlJVEVNX1NJWkUpICogSVRFTV9TSVpFOworCXUzMiBtc2dfcmVtID0gbXNnX2RzejsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocHVibCwgcGxzLCBsb2NhbF9saXN0KSB7CiAJCS8qIFByZXBhcmUgbmV4dCBidWZmZXI6ICovCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uZXQuaCBiL25ldC90aXBjL25ldC5oCmluZGV4IDc3YTdhMTEuLmM3YzI1NDkgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25ldC5oCisrKyBiL25ldC90aXBjL25ldC5oCkBAIC0zOSw2ICszOSw4IEBACiAKICNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CiAKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSB0aXBjX25sX25ldF9wb2xpY3lbXTsKKwogaW50IHRpcGNfbmV0X3N0YXJ0KHN0cnVjdCBuZXQgKm5ldCwgdTMyIGFkZHIpOwogCiB2b2lkIHRpcGNfbmV0X3N0b3Aoc3RydWN0IG5ldCAqbmV0KTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL25ldGxpbmsuYyBiL25ldC90aXBjL25ldGxpbmsuYwppbmRleCBhODRkYWVjLi4zMjAwMDU5IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9uZXRsaW5rLmMKKysrIGIvbmV0L3RpcGMvbmV0bGluay5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSAibGluay5oIgogI2luY2x1ZGUgIm5vZGUuaCIKICNpbmNsdWRlICJuZXQuaCIKKyNpbmNsdWRlICJ1ZHBfbWVkaWEuaCIKICNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSB0aXBjX25sX3BvbGljeVtUSVBDX05MQV9NQVggKyAxXSA9IHsKQEAgLTE2MSw2ICsxNjIsMTEgQEAKIAkJLnBvbGljeSA9IHRpcGNfbmxfcG9saWN5LAogCX0sCiAJeworCQkuY21kCT0gVElQQ19OTF9CRUFSRVJfQURELAorCQkuZG9pdAk9IHRpcGNfbmxfYmVhcmVyX2FkZCwKKwkJLnBvbGljeSA9IHRpcGNfbmxfcG9saWN5LAorCX0sCisJewogCQkuY21kCT0gVElQQ19OTF9CRUFSRVJfU0VULAogCQkuZG9pdAk9IHRpcGNfbmxfYmVhcmVyX3NldCwKIAkJLnBvbGljeSA9IHRpcGNfbmxfcG9saWN5LApAQCAtMjM4LDYgKzI0NCwxOCBAQAogCQkuZHVtcGl0CT0gdGlwY19ubF9ub2RlX2R1bXBfbW9uaXRvcl9wZWVyLAogCQkucG9saWN5ID0gdGlwY19ubF9wb2xpY3ksCiAJfSwKKwl7CisJCS5jbWQJPSBUSVBDX05MX1BFRVJfUkVNT1ZFLAorCQkuZG9pdAk9IHRpcGNfbmxfcGVlcl9ybSwKKwkJLnBvbGljeSA9IHRpcGNfbmxfcG9saWN5LAorCX0sCisjaWZkZWYgQ09ORklHX1RJUENfTUVESUFfVURQCisJeworCQkuY21kCT0gVElQQ19OTF9VRFBfR0VUX1JFTU9URUlQLAorCQkuZHVtcGl0CT0gdGlwY191ZHBfbmxfZHVtcF9yZW1vdGVpcCwKKwkJLnBvbGljeSA9IHRpcGNfbmxfcG9saWN5LAorCX0sCisjZW5kaWYKIH07CiAKIGludCB0aXBjX25sbXNnX3BhcnNlKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLCBzdHJ1Y3QgbmxhdHRyICoqKmF0dHIpCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlLmMgYi9uZXQvdGlwYy9ub2RlLmMKaW5kZXggMjE5NzQxOS4uN2VmMTRlMiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbm9kZS5jCisrKyBiL25ldC90aXBjL25vZGUuYwpAQCAtMTI2Miw2ICsxMjYyLDM0IEBACiAJa2ZyZWVfc2tiKHNrYik7CiB9CiAKK3N0YXRpYyB2b2lkIHRpcGNfbm9kZV9iY19zeW5jX3JjdihzdHJ1Y3QgdGlwY19ub2RlICpuLCBzdHJ1Y3QgdGlwY19tc2cgKmhkciwKKwkJCQkgIGludCBiZWFyZXJfaWQsIHN0cnVjdCBza19idWZmX2hlYWQgKnhtaXRxKQoreworCXN0cnVjdCB0aXBjX2xpbmsgKnVjbDsKKwlpbnQgcmM7CisKKwlyYyA9IHRpcGNfYmNhc3Rfc3luY19yY3Yobi0+bmV0LCBuLT5iY19lbnRyeS5saW5rLCBoZHIpOworCisJaWYgKHJjICYgVElQQ19MSU5LX0RPV05fRVZUKSB7CisJCXRpcGNfYmVhcmVyX3Jlc2V0X2FsbChuLT5uZXQpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEocmMgJiBUSVBDX0xJTktfU05EX1NUQVRFKSkKKwkJcmV0dXJuOworCisJLyogSWYgcHJvYmUgbWVzc2FnZSwgYSBTVEFURSByZXNwb25zZSB3aWxsIGJlIHNlbnQgYW55d2F5ICovCisJaWYgKG1zZ19wcm9iZShoZHIpKQorCQlyZXR1cm47CisKKwkvKiBQcm9kdWNlIGEgU1RBVEUgbWVzc2FnZSBjYXJyeWluZyBicm9hZGNhc3QgTkFDSyAqLworCXRpcGNfbm9kZV9yZWFkX2xvY2sobik7CisJdWNsID0gbi0+bGlua3NbYmVhcmVyX2lkXS5saW5rOworCWlmICh1Y2wpCisJCXRpcGNfbGlua19idWlsZF9zdGF0ZV9tc2codWNsLCB4bWl0cSk7CisJdGlwY19ub2RlX3JlYWRfdW5sb2NrKG4pOworfQorCiAvKioKICAqIHRpcGNfbm9kZV9iY19yY3YgLSBwcm9jZXNzIFRJUEMgYnJvYWRjYXN0IHBhY2tldCBhcnJpdmluZyBmcm9tIG9mZi1ub2RlCiAgKiBAbmV0OiB0aGUgYXBwbGljYWJsZSBuZXQgbmFtZXNwYWNlCkBAIC0xMjk4LDcgKzEzMjYsNyBAQAogCXJjID0gdGlwY19iY2FzdF9yY3YobmV0LCBiZS0+bGluaywgc2tiKTsKIAogCS8qIEJyb2FkY2FzdCBBQ0tzIGFyZSBzZW50IG9uIGEgdW5pY2FzdCBsaW5rICovCi0JaWYgKHJjICYgVElQQ19MSU5LX1NORF9CQ19BQ0spIHsKKwlpZiAocmMgJiBUSVBDX0xJTktfU05EX1NUQVRFKSB7CiAJCXRpcGNfbm9kZV9yZWFkX2xvY2sobik7CiAJCXRpcGNfbGlua19idWlsZF9zdGF0ZV9tc2cobGUtPmxpbmssICZ4bWl0cSk7CiAJCXRpcGNfbm9kZV9yZWFkX3VubG9jayhuKTsKQEAgLTE1MDUsNyArMTUzMyw3IEBACiAKIAkvKiBFbnN1cmUgYnJvYWRjYXN0IHJlY2VwdGlvbiBpcyBpbiBzeW5jaCB3aXRoIHBlZXIncyBzZW5kIHN0YXRlICovCiAJaWYgKHVubGlrZWx5KHVzciA9PSBMSU5LX1BST1RPQ09MKSkKLQkJdGlwY19iY2FzdF9zeW5jX3JjdihuZXQsIG4tPmJjX2VudHJ5LmxpbmssIGhkcik7CisJCXRpcGNfbm9kZV9iY19zeW5jX3JjdihuLCBoZHIsIGJlYXJlcl9pZCwgJnhtaXRxKTsKIAllbHNlIGlmICh1bmxpa2VseSh0aXBjX2xpbmtfYWNrZWQobi0+YmNfZW50cnkubGluaykgIT0gYmNfYWNrKSkKIAkJdGlwY19iY2FzdF9hY2tfcmN2KG5ldCwgbi0+YmNfZW50cnkubGluaywgYmNfYWNrKTsKIApAQCAtMTU1Myw2ICsxNTgxLDY5IEBACiAJa2ZyZWVfc2tiKHNrYik7CiB9CiAKK2ludCB0aXBjX25sX3BlZXJfcm0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKKwlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0aXBjX25ldF9pZCk7CisJc3RydWN0IG5sYXR0ciAqYXR0cnNbVElQQ19OTEFfTkVUX01BWCArIDFdOworCXN0cnVjdCB0aXBjX25vZGUgKnBlZXI7CisJdTMyIGFkZHI7CisJaW50IGVycjsKKwlpbnQgaTsKKworCS8qIFdlIGlkZW50aWZ5IHRoZSBwZWVyIGJ5IGl0cyBuZXQgKi8KKwlpZiAoIWluZm8tPmF0dHJzW1RJUENfTkxBX05FVF0pCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gbmxhX3BhcnNlX25lc3RlZChhdHRycywgVElQQ19OTEFfTkVUX01BWCwKKwkJCSAgICAgICBpbmZvLT5hdHRyc1tUSVBDX05MQV9ORVRdLAorCQkJICAgICAgIHRpcGNfbmxfbmV0X3BvbGljeSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmICghYXR0cnNbVElQQ19OTEFfTkVUX0FERFJdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkZHIgPSBubGFfZ2V0X3UzMihhdHRyc1tUSVBDX05MQV9ORVRfQUREUl0pOworCisJaWYgKGluX293bl9ub2RlKG5ldCwgYWRkcikpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlzcGluX2xvY2tfYmgoJnRuLT5ub2RlX2xpc3RfbG9jayk7CisJcGVlciA9IHRpcGNfbm9kZV9maW5kKG5ldCwgYWRkcik7CisJaWYgKCFwZWVyKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZ0bi0+bm9kZV9saXN0X2xvY2spOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXRpcGNfbm9kZV93cml0ZV9sb2NrKHBlZXIpOworCWlmIChwZWVyLT5zdGF0ZSAhPSBTRUxGX0RPV05fUEVFUl9ET1dOICYmCisJICAgIHBlZXItPnN0YXRlICE9IFNFTEZfRE9XTl9QRUVSX0xFQVZJTkcpIHsKKwkJdGlwY19ub2RlX3dyaXRlX3VubG9jayhwZWVyKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKKwkJc3RydWN0IHRpcGNfbGlua19lbnRyeSAqbGUgPSAmcGVlci0+bGlua3NbaV07CisKKwkJaWYgKGxlLT5saW5rKSB7CisJCQlrZnJlZShsZS0+bGluayk7CisJCQlsZS0+bGluayA9IE5VTEw7CisJCQlwZWVyLT5saW5rX2NudC0tOworCQl9CisJfQorCXRpcGNfbm9kZV93cml0ZV91bmxvY2socGVlcik7CisJdGlwY19ub2RlX2RlbGV0ZShwZWVyKTsKKworCWVyciA9IDA7CitlcnJfb3V0OgorCXRpcGNfbm9kZV9wdXQocGVlcik7CisJc3Bpbl91bmxvY2tfYmgoJnRuLT5ub2RlX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCiBpbnQgdGlwY19ubF9ub2RlX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQogewogCWludCBlcnI7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlLmggYi9uZXQvdGlwYy9ub2RlLmgKaW5kZXggZDY5ZmRmYy4uMzllZjU0YyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbm9kZS5oCisrKyBiL25ldC90aXBjL25vZGUuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBuZXQvdGlwYy9ub2RlLmg6IEluY2x1ZGUgZmlsZSBmb3IgVElQQyBub2RlIG1hbmFnZW1lbnQgcm91dGluZXMKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgMjAxNC0yMDE1LCBFcmljc3NvbiBBQgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIDIwMTQtMjAxNiwgRXJpY3Nzb24gQUIKICAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMC0yMDE0LCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtNDUsMTEgKzQ1LDE0IEBACiAvKiBPcHRpb25hbCBjYXBhYmlsaXRpZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29kZSB2ZXJzaW9uCiAgKi8KIGVudW0gewotCVRJUENfQkNBU1RfU1lOQ0ggICA9ICgxIDw8IDEpLAotCVRJUENfQkxPQ0tfRkxPV0NUTCA9ICgyIDw8IDEpCisJVElQQ19CQ0FTVF9TWU5DSCAgICAgID0gKDEgPDwgMSksCisJVElQQ19CQ0FTVF9TVEFURV9OQUNLID0gKDEgPDwgMiksCisJVElQQ19CTE9DS19GTE9XQ1RMICAgID0gKDEgPDwgMykKIH07CiAKLSNkZWZpbmUgVElQQ19OT0RFX0NBUEFCSUxJVElFUyAoVElQQ19CQ0FTVF9TWU5DSCB8IFRJUENfQkxPQ0tfRkxPV0NUTCkKKyNkZWZpbmUgVElQQ19OT0RFX0NBUEFCSUxJVElFUyAoVElQQ19CQ0FTVF9TWU5DSCB8IFwKKwkJCQlUSVBDX0JDQVNUX1NUQVRFX05BQ0sgfCBcCisJCQkJVElQQ19CTE9DS19GTE9XQ1RMKQogI2RlZmluZSBJTlZBTElEX0JFQVJFUl9JRCAtMQogCiB2b2lkIHRpcGNfbm9kZV9zdG9wKHN0cnVjdCBuZXQgKm5ldCk7CkBAIC03Nyw2ICs4MCw3IEBACiBpbnQgdGlwY19ubF9ub2RlX3Jlc2V0X2xpbmtfc3RhdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CiBpbnQgdGlwY19ubF9ub2RlX2dldF9saW5rKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOwogaW50IHRpcGNfbmxfbm9kZV9zZXRfbGluayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKK2ludCB0aXBjX25sX3BlZXJfcm0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CiAKIGludCB0aXBjX25sX25vZGVfc2V0X21vbml0b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CiBpbnQgdGlwY19ubF9ub2RlX2dldF9tb25pdG9yKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvdWRwX21lZGlhLmMgYi9uZXQvdGlwYy91ZHBfbWVkaWEuYwppbmRleCBiMDE2YzAxLi5kODBjZDNmIDEwMDY0NAotLS0gYS9uZXQvdGlwYy91ZHBfbWVkaWEuYworKysgYi9uZXQvdGlwYy91ZHBfbWVkaWEuYwpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJiZWFyZXIuaCIKICNpbmNsdWRlICJuZXRsaW5rLmgiCisjaW5jbHVkZSAibXNnLmgiCiAKIC8qIElBTkEgYXNzaWduZWQgVURQIHBvcnQgKi8KICNkZWZpbmUgVURQX1BPUlRfREVGQVVMVAk2MTE4CkBAIC03MCw2ICs3MSwxMyBAQAogCX07CiB9OwogCisvKiBzdHJ1Y3QgdWRwX3JlcGxpY2FzdCAtIGNvbnRhaW5lciBmb3IgVURQIHJlbW90ZSBhZGRyZXNzZXMgKi8KK3N0cnVjdCB1ZHBfcmVwbGljYXN0IHsKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgYWRkcjsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKIC8qKgogICogc3RydWN0IHVkcF9iZWFyZXIgLSBpcC91ZHAgYmVhcmVyIGRhdGEgc3RydWN0dXJlCiAgKiBAYmVhcmVyOglhc3NvY2lhdGVkIGdlbmVyaWMgdGlwYyBiZWFyZXIKQEAgLTgyLDggKzkwLDIwIEBACiAJc3RydWN0IHNvY2tldCAqdWJzb2NrOwogCXUzMiBpZmluZGV4OwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCB1ZHBfcmVwbGljYXN0IHJjYXN0OwogfTsKIAorc3RhdGljIGludCB0aXBjX3VkcF9pc19tY2FzdF9hZGRyKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqYWRkcikKK3sKKwlpZiAobnRvaHMoYWRkci0+cHJvdG8pID09IEVUSF9QX0lQKQorCQlyZXR1cm4gaXB2NF9pc19tdWx0aWNhc3QoYWRkci0+aXB2NC5zX2FkZHIpOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJZWxzZQorCQlyZXR1cm4gaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmYWRkci0+aXB2Nik7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKwogLyogdWRwX21lZGlhX2FkZHJfc2V0IC0gY29udmVydCBhIGlwL3VkcCBhZGRyZXNzIHRvIGEgVElQQyBtZWRpYSBhZGRyZXNzICovCiBzdGF0aWMgdm9pZCB0aXBjX3VkcF9tZWRpYV9hZGRyX3NldChzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphZGRyLAogCQkJCSAgICBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnVhKQpAQCAtOTEsMTUgKzExMSw5IEBACiAJbWVtc2V0KGFkZHIsIDAsIHNpemVvZihzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyKSk7CiAJYWRkci0+bWVkaWFfaWQgPSBUSVBDX01FRElBX1RZUEVfVURQOwogCW1lbWNweShhZGRyLT52YWx1ZSwgdWEsIHNpemVvZihzdHJ1Y3QgdWRwX21lZGlhX2FkZHIpKTsKLQlpZiAobnRvaHModWEtPnByb3RvKSA9PSBFVEhfUF9JUCkgewotCQlpZiAoaXB2NF9pc19tdWx0aWNhc3QodWEtPmlwdjQuc19hZGRyKSkKLQkJCWFkZHItPmJyb2FkY2FzdCA9IDE7Ci0JfSBlbHNlIGlmIChudG9ocyh1YS0+cHJvdG8pID09IEVUSF9QX0lQVjYpIHsKLQkJaWYgKGlwdjZfYWRkcl90eXBlKCZ1YS0+aXB2NikgJiBJUFY2X0FERFJfTVVMVElDQVNUKQotCQkJYWRkci0+YnJvYWRjYXN0ID0gMTsKLQl9IGVsc2UgewotCQlwcl9lcnIoIkludmFsaWQgVURQIG1lZGlhIGFkZHJlc3NcbiIpOwotCX0KKworCWlmICh0aXBjX3VkcF9pc19tY2FzdF9hZGRyKHVhKSkKKwkJYWRkci0+YnJvYWRjYXN0ID0gMTsKIH0KIAogLyogdGlwY191ZHBfYWRkcjJzdHIgLSBjb252ZXJ0IGlwL3VkcCBhZGRyZXNzIHRvIHN0cmluZyAqLwpAQCAtMTQwLDI4ICsxNTQsMTMgQEAKIH0KIAogLyogdGlwY19zZW5kX21zZyAtIGVucXVldWUgYSBzZW5kIHJlcXVlc3QgKi8KLXN0YXRpYyBpbnQgdGlwY191ZHBfc2VuZF9tc2coc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIsCi0JCQkgICAgIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRlc3QpCitzdGF0aWMgaW50IHRpcGNfdWRwX3htaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIHN0cnVjdCB1ZHBfYmVhcmVyICp1Yiwgc3RydWN0IHVkcF9tZWRpYV9hZGRyICpzcmMsCisJCQkgc3RydWN0IHVkcF9tZWRpYV9hZGRyICpkc3QpCiB7CiAJaW50IHR0bCwgZXJyID0gMDsKLQlzdHJ1Y3QgdWRwX2JlYXJlciAqdWI7Ci0Jc3RydWN0IHVkcF9tZWRpYV9hZGRyICpkc3QgPSAoc3RydWN0IHVkcF9tZWRpYV9hZGRyICopJmRlc3QtPnZhbHVlOwotCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqc3JjID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZiLT5hZGRyLnZhbHVlOwogCXN0cnVjdCBydGFibGUgKnJ0OwogCi0JaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgVURQX01JTl9IRUFEUk9PTSkgewotCQllcnIgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgVURQX01JTl9IRUFEUk9PTSwgMCwgR0ZQX0FUT01JQyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIHR4X2Vycm9yOwotCX0KLQotCXNrYl9zZXRfaW5uZXJfcHJvdG9jb2woc2tiLCBodG9ucyhFVEhfUF9USVBDKSk7Ci0JdWIgPSByY3VfZGVyZWZlcmVuY2VfcnRubChiLT5tZWRpYV9wdHIpOwotCWlmICghdWIpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byB0eF9lcnJvcjsKLQl9CiAJaWYgKGRzdC0+cHJvdG8gPT0gaHRvbnMoRVRIX1BfSVApKSB7CiAJCXN0cnVjdCBmbG93aTQgZmwgPSB7CiAJCQkuZGFkZHIgPSBkc3QtPmlwdjQuc19hZGRyLApAQCAtMjA3LDI5ICsyMDYsMTc4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCB0aXBjX3VkcF9zZW5kX21zZyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHN0cnVjdCB0aXBjX2JlYXJlciAqYiwKKwkJCSAgICAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnNyYyA9IChzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKikmYi0+YWRkci52YWx1ZTsKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmRzdCA9IChzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKikmYWRkci0+dmFsdWU7CisJc3RydWN0IHVkcF9yZXBsaWNhc3QgKnJjYXN0OworCXN0cnVjdCB1ZHBfYmVhcmVyICp1YjsKKwlpbnQgZXJyID0gMDsKKworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IFVEUF9NSU5fSEVBRFJPT00pIHsKKwkJZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIFVEUF9NSU5fSEVBRFJPT00sIDAsIEdGUF9BVE9NSUMpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCisJc2tiX3NldF9pbm5lcl9wcm90b2NvbChza2IsIGh0b25zKEVUSF9QX1RJUEMpKTsKKwl1YiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGItPm1lZGlhX3B0cik7CisJaWYgKCF1YikgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoIWFkZHItPmJyb2FkY2FzdCB8fCBsaXN0X2VtcHR5KCZ1Yi0+cmNhc3QubGlzdCkpCisJCXJldHVybiB0aXBjX3VkcF94bWl0KG5ldCwgc2tiLCB1Yiwgc3JjLCBkc3QpOworCisJLyogUmVwbGljYXN0LCBzZW5kIGFuIHNrYiB0byBlYWNoIGNvbmZpZ3VyZWQgSVAgYWRkcmVzcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJjYXN0LCAmdWItPnJjYXN0Lmxpc3QsIGxpc3QpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKl9za2I7CisKKwkJX3NrYiA9IHBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAoIV9za2IpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWVyciA9IHRpcGNfdWRwX3htaXQobmV0LCBfc2tiLCB1Yiwgc3JjLCAmcmNhc3QtPmFkZHIpOworCQlpZiAoZXJyKSB7CisJCQlrZnJlZV9za2IoX3NrYik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwllcnIgPSAwOworb3V0OgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBib29sIHRpcGNfdWRwX2lzX2tub3duX3BlZXIoc3RydWN0IHRpcGNfYmVhcmVyICpiLAorCQkJCSAgIHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgdWRwX3JlcGxpY2FzdCAqcmNhc3QsICp0bXA7CisJc3RydWN0IHVkcF9iZWFyZXIgKnViOworCisJdWIgPSByY3VfZGVyZWZlcmVuY2VfcnRubChiLT5tZWRpYV9wdHIpOworCWlmICghdWIpIHsKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJVRFAgYmVhcmVyIGluc3RhbmNlIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmNhc3QsIHRtcCwgJnViLT5yY2FzdC5saXN0LCBsaXN0KSB7CisJCWlmICghbWVtY21wKCZyY2FzdC0+YWRkciwgYWRkciwgc2l6ZW9mKHN0cnVjdCB1ZHBfbWVkaWFfYWRkcikpKQorCQkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW50IHRpcGNfdWRwX3JjYXN0X2FkZChzdHJ1Y3QgdGlwY19iZWFyZXIgKmIsCisJCQkgICAgICBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmFkZHIpCit7CisJc3RydWN0IHVkcF9yZXBsaWNhc3QgKnJjYXN0OworCXN0cnVjdCB1ZHBfYmVhcmVyICp1YjsKKworCXViID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwoYi0+bWVkaWFfcHRyKTsKKwlpZiAoIXViKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJjYXN0ID0ga21hbGxvYyhzaXplb2YoKnJjYXN0KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFyY2FzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkoJnJjYXN0LT5hZGRyLCBhZGRyLCBzaXplb2Yoc3RydWN0IHVkcF9tZWRpYV9hZGRyKSk7CisKKwlpZiAobnRvaHMoYWRkci0+cHJvdG8pID09IEVUSF9QX0lQKQorCQlwcl9pbmZvKCJOZXcgcmVwbGljYXN0IHBlZXI6ICVwSTRcbiIsICZyY2FzdC0+YWRkci5pcHY0KTsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorCWVsc2UgaWYgKG50b2hzKGFkZHItPnByb3RvKSA9PSBFVEhfUF9JUFY2KQorCQlwcl9pbmZvKCJOZXcgcmVwbGljYXN0IHBlZXI6ICVwSTZcbiIsICZyY2FzdC0+YWRkci5pcHY2KTsKKyNlbmRpZgorCisJbGlzdF9hZGRfcmN1KCZyY2FzdC0+bGlzdCwgJnViLT5yY2FzdC5saXN0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aXBjX3VkcF9yY2FzdF9kaXNjKHN0cnVjdCB0aXBjX2JlYXJlciAqYiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgc3JjID0gezB9OworCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqZHN0OworCisJZHN0ID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZiLT5iY2FzdF9hZGRyLnZhbHVlOworCWlmICh0aXBjX3VkcF9pc19tY2FzdF9hZGRyKGRzdCkpCisJCXJldHVybiAwOworCisJc3JjLnBvcnQgPSB1ZHBfaGRyKHNrYiktPnNvdXJjZTsKKworCWlmIChpcF9oZHIoc2tiKS0+dmVyc2lvbiA9PSA0KSB7CisJCXN0cnVjdCBpcGhkciAqaXBoZHIgPSBpcF9oZHIoc2tiKTsKKworCQlzcmMucHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7CisJCXNyYy5pcHY0LnNfYWRkciA9IGlwaGRyLT5zYWRkcjsKKwkJaWYgKGlwdjRfaXNfbXVsdGljYXN0KGlwaGRyLT5kYWRkcikpCisJCQlyZXR1cm4gMDsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorCX0gZWxzZSBpZiAoaXBfaGRyKHNrYiktPnZlcnNpb24gPT0gNikgeworCQlzdHJ1Y3QgaXB2NmhkciAqaXBoZHIgPSBpcHY2X2hkcihza2IpOworCisJCXNyYy5wcm90byA9IGh0b25zKEVUSF9QX0lQVjYpOworCQlzcmMuaXB2NiA9IGlwaGRyLT5zYWRkcjsKKwkJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmlwaGRyLT5kYWRkcikpCisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXJldHVybiAwOworCX0KKworCWlmIChsaWtlbHkodGlwY191ZHBfaXNfa25vd25fcGVlcihiLCAmc3JjKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHRpcGNfdWRwX3JjYXN0X2FkZChiLCAmc3JjKTsKK30KKwogLyogdGlwY191ZHBfcmVjdiAtIHJlYWQgZGF0YSBmcm9tIGJlYXJlciBzb2NrZXQgKi8KIHN0YXRpYyBpbnQgdGlwY191ZHBfcmVjdihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHVkcF9iZWFyZXIgKnViOwogCXN0cnVjdCB0aXBjX2JlYXJlciAqYjsKKwlzdHJ1Y3QgdGlwY19tc2cgKmhkcjsKKwlpbnQgZXJyOwogCiAJdWIgPSByY3VfZGVyZWZlcmVuY2Vfc2tfdXNlcl9kYXRhKHNrKTsKIAlpZiAoIXViKSB7CiAJCXByX2Vycl9yYXRlbGltaXRlZCgiRmFpbGVkIHRvIGdldCBVRFAgYmVhcmVyIHJlZmVyZW5jZSIpOwotCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCX0KLQogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKKwloZHIgPSBidWZfbXNnKHNrYik7CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAJYiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKHViLT5iZWFyZXIpOworCWlmICghYikKKwkJZ290byByY3Vfb3V0OwogCi0JaWYgKGIpIHsKKwlpZiAoYiAmJiB0ZXN0X2JpdCgwLCAmYi0+dXApKSB7CiAJCXRpcGNfcmN2KHNvY2tfbmV0KHNrKSwgc2tiLCBiKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAwOwogCX0KKworCWlmICh1bmxpa2VseShtc2dfdXNlcihoZHIpID09IExJTktfQ09ORklHKSkgeworCQllcnIgPSB0aXBjX3VkcF9yY2FzdF9kaXNjKGIsIHNrYik7CisJCWlmIChlcnIpCisJCQlnb3RvIHJjdV9vdXQ7CisJfQorCisJdGlwY19yY3Yoc29ja19uZXQoc2spLCBza2IsIGIpOwogCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiAwOworCityY3Vfb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworb3V0OgogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAwOwogfQpAQCAtMjQxLDE1ICszODksMTEgQEAKIAlzdHJ1Y3Qgc29jayAqc2sgPSB1Yi0+dWJzb2NrLT5zazsKIAogCWlmIChudG9ocyhyZW1vdGUtPnByb3RvKSA9PSBFVEhfUF9JUCkgewotCQlpZiAoIWlwdjRfaXNfbXVsdGljYXN0KHJlbW90ZS0+aXB2NC5zX2FkZHIpKQotCQkJcmV0dXJuIDA7CiAJCW1yZXFuLmltcl9tdWx0aWFkZHIgPSByZW1vdGUtPmlwdjQ7CiAJCW1yZXFuLmltcl9pZmluZGV4ID0gdWItPmlmaW5kZXg7CiAJCWVyciA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxbik7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAl9IGVsc2UgewotCQlpZiAoIWlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJnJlbW90ZS0+aXB2NikpCi0JCQlyZXR1cm4gMDsKIAkJZXJyID0gaXB2Nl9zdHViLT5pcHY2X3NvY2tfbWNfam9pbihzaywgdWItPmlmaW5kZXgsCiAJCQkJCQkgICAmcmVtb3RlLT5pcHY2KTsKICNlbmRpZgpAQCAtMjU3LDc1ICs0MDEsMjM0IEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyoqCi0gKiBwYXJzZV9vcHRpb25zIC0gYnVpbGQgbG9jYWwvcmVtb3RlIGFkZHJlc3NlcyBmcm9tIGNvbmZpZ3VyYXRpb24KLSAqIEBhdHRyczoJbmV0bGluayBjb25maWcgZGF0YQotICogQHViOgkJVURQIGJlYXJlciBpbnN0YW5jZQotICogQGxvY2FsOglsb2NhbCBiZWFyZXIgSVAgYWRkcmVzcy9wb3J0Ci0gKiBAcmVtb3RlOglwZWVyIG9yIG11bHRpY2FzdCBJUC9wb3J0Ci0gKi8KLXN0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgbmxhdHRyICphdHRyc1tdLCBzdHJ1Y3QgdWRwX2JlYXJlciAqdWIsCi0JCQkgc3RydWN0IHVkcF9tZWRpYV9hZGRyICpsb2NhbCwKLQkJCSBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnJlbW90ZSkKK3N0YXRpYyBpbnQgX190aXBjX25sX2FkZF91ZHBfYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgc3RydWN0IHVkcF9tZWRpYV9hZGRyICphZGRyLCBpbnQgbmxhX3QpCiB7Ci0Jc3RydWN0IG5sYXR0ciAqb3B0c1tUSVBDX05MQV9VRFBfTUFYICsgMV07Ci0Jc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc2FfbG9jYWwsIHNhX3JlbW90ZTsKKwlpZiAobnRvaHMoYWRkci0+cHJvdG8pID09IEVUSF9QX0lQKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBpcDQ7CiAKLQlpZiAoIWF0dHJzW1RJUENfTkxBX0JFQVJFUl9VRFBfT1BUU10pCi0JCWdvdG8gZXJyOwotCWlmIChubGFfcGFyc2VfbmVzdGVkKG9wdHMsIFRJUENfTkxBX1VEUF9NQVgsCi0JCQkgICAgIGF0dHJzW1RJUENfTkxBX0JFQVJFUl9VRFBfT1BUU10sCi0JCQkgICAgIHRpcGNfbmxfdWRwX3BvbGljeSkpCi0JCWdvdG8gZXJyOwotCWlmIChvcHRzW1RJUENfTkxBX1VEUF9MT0NBTF0gJiYgb3B0c1tUSVBDX05MQV9VRFBfUkVNT1RFXSkgewotCQlubGFfbWVtY3B5KCZzYV9sb2NhbCwgb3B0c1tUSVBDX05MQV9VRFBfTE9DQUxdLAotCQkJICAgc2l6ZW9mKHNhX2xvY2FsKSk7Ci0JCW5sYV9tZW1jcHkoJnNhX3JlbW90ZSwgb3B0c1tUSVBDX05MQV9VRFBfUkVNT1RFXSwKLQkJCSAgIHNpemVvZihzYV9yZW1vdGUpKTsKKwkJaXA0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlpcDQuc2luX3BvcnQgPSBhZGRyLT5wb3J0OworCQlpcDQuc2luX2FkZHIuc19hZGRyID0gYWRkci0+aXB2NC5zX2FkZHI7CisJCWlmIChubGFfcHV0KHNrYiwgbmxhX3QsIHNpemVvZihpcDQpLCAmaXA0KSkKKwkJCXJldHVybiAtRU1TR1NJWkU7CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorCX0gZWxzZSBpZiAobnRvaHMoYWRkci0+cHJvdG8pID09IEVUSF9QX0lQVjYpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiBpcDY7CisKKwkJaXA2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCWlwNi5zaW42X3BvcnQgID0gYWRkci0+cG9ydDsKKwkJbWVtY3B5KCZpcDYuc2luNl9hZGRyLCAmYWRkci0+aXB2Niwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlpZiAobmxhX3B1dChza2IsIG5sYV90LCBzaXplb2YoaXA2KSwgJmlwNikpCisJCQlyZXR1cm4gLUVNU0dTSVpFOworI2VuZGlmCisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB0aXBjX3VkcF9ubF9kdW1wX3JlbW90ZWlwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwl1MzIgYmlkID0gY2ItPmFyZ3NbMF07CisJdTMyIHNraXBfY250ID0gY2ItPmFyZ3NbMV07CisJdTMyIHBvcnRpZCA9IE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkOworCXN0cnVjdCB1ZHBfcmVwbGljYXN0ICpyY2FzdCwgKnRtcDsKKwlzdHJ1Y3QgdGlwY19iZWFyZXIgKmI7CisJc3RydWN0IHVkcF9iZWFyZXIgKnViOworCXZvaWQgKmhkcjsKKwlpbnQgZXJyOworCWludCBpOworCisJaWYgKCFiaWQgJiYgIXNraXBfY250KSB7CisJCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOworCQlzdHJ1Y3QgbmxhdHRyICpiYXR0cnNbVElQQ19OTEFfQkVBUkVSX01BWCArIDFdOworCQlzdHJ1Y3QgbmxhdHRyICoqYXR0cnM7CisJCWNoYXIgKmJuYW1lOworCisJCWVyciA9IHRpcGNfbmxtc2dfcGFyc2UoY2ItPm5saCwgJmF0dHJzKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJaWYgKCFhdHRyc1tUSVBDX05MQV9CRUFSRVJdKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZXJyID0gbmxhX3BhcnNlX25lc3RlZChiYXR0cnMsIFRJUENfTkxBX0JFQVJFUl9NQVgsCisJCQkJICAgICAgIGF0dHJzW1RJUENfTkxBX0JFQVJFUl0sCisJCQkJICAgICAgIHRpcGNfbmxfYmVhcmVyX3BvbGljeSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWlmICghYmF0dHJzW1RJUENfTkxBX0JFQVJFUl9OQU1FXSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWJuYW1lID0gbmxhX2RhdGEoYmF0dHJzW1RJUENfTkxBX0JFQVJFUl9OQU1FXSk7CisKKwkJcnRubF9sb2NrKCk7CisJCWIgPSB0aXBjX2JlYXJlcl9maW5kKG5ldCwgYm5hbWUpOworCQlpZiAoIWIpIHsKKwkJCXJ0bmxfdW5sb2NrKCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQliaWQgPSBiLT5pZGVudGl0eTsKIAl9IGVsc2UgewotZXJyOgotCQlwcl9lcnIoIkludmFsaWQgVURQIGJlYXJlciBjb25maWd1cmF0aW9uIik7CisJCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOworCQlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0aXBjX25ldF9pZCk7CisKKwkJcnRubF9sb2NrKCk7CisJCWIgPSBydG5sX2RlcmVmZXJlbmNlKHRuLT5iZWFyZXJfbGlzdFtiaWRdKTsKKwkJaWYgKCFiKSB7CisJCQlydG5sX3VubG9jaygpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwl1YiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGItPm1lZGlhX3B0cik7CisJaWYgKCF1YikgeworCQlydG5sX3VubG9jaygpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKChzYV9sb2NhbC5zc19mYW1pbHkgJiBzYV9yZW1vdGUuc3NfZmFtaWx5KSA9PSBBRl9JTkVUKSB7Ci0JCXN0cnVjdCBzb2NrYWRkcl9pbiAqaXA0OwogCi0JCWlwNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc2FfbG9jYWw7Ci0JCWxvY2FsLT5wcm90byA9IGh0b25zKEVUSF9QX0lQKTsKLQkJbG9jYWwtPnBvcnQgPSBpcDQtPnNpbl9wb3J0OwotCQlsb2NhbC0+aXB2NC5zX2FkZHIgPSBpcDQtPnNpbl9hZGRyLnNfYWRkcjsKKwlpID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmNhc3QsIHRtcCwgJnViLT5yY2FzdC5saXN0LCBsaXN0KSB7CisJCWlmIChpIDwgc2tpcF9jbnQpCisJCQlnb3RvIGNvdW50OwogCi0JCWlwNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc2FfcmVtb3RlOwotCQlyZW1vdGUtPnByb3RvID0gaHRvbnMoRVRIX1BfSVApOwotCQlyZW1vdGUtPnBvcnQgPSBpcDQtPnNpbl9wb3J0OwotCQlyZW1vdGUtPmlwdjQuc19hZGRyID0gaXA0LT5zaW5fYWRkci5zX2FkZHI7CisJCWhkciA9IGdlbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJICAmdGlwY19nZW5sX2ZhbWlseSwgTkxNX0ZfTVVMVEksCisJCQkJICBUSVBDX05MX0JFQVJFUl9HRVQpOworCQlpZiAoIWhkcikKKwkJCWdvdG8gZG9uZTsKKworCQllcnIgPSBfX3RpcGNfbmxfYWRkX3VkcF9hZGRyKHNrYiwgJnJjYXN0LT5hZGRyLAorCQkJCQkgICAgIFRJUENfTkxBX1VEUF9SRU1PVEUpOworCQlpZiAoZXJyKSB7CisJCQlnZW5sbXNnX2NhbmNlbChza2IsIGhkcik7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJZ2VubG1zZ19lbmQoc2tiLCBoZHIpOworY291bnQ6CisJCWkrKzsKKwl9Citkb25lOgorCXJ0bmxfdW5sb2NrKCk7CisJY2ItPmFyZ3NbMF0gPSBiaWQ7CisJY2ItPmFyZ3NbMV0gPSBpOworCisJcmV0dXJuIHNrYi0+bGVuOworfQorCitpbnQgdGlwY191ZHBfbmxfYWRkX2JlYXJlcl9kYXRhKHN0cnVjdCB0aXBjX25sX21zZyAqbXNnLCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpCit7CisJc3RydWN0IHVkcF9tZWRpYV9hZGRyICpzcmMgPSAoc3RydWN0IHVkcF9tZWRpYV9hZGRyICopJmItPmFkZHIudmFsdWU7CisJc3RydWN0IHVkcF9tZWRpYV9hZGRyICpkc3Q7CisJc3RydWN0IHVkcF9iZWFyZXIgKnViOworCXN0cnVjdCBubGF0dHIgKm5lc3Q7CisKKwl1YiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGItPm1lZGlhX3B0cik7CisJaWYgKCF1YikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwluZXN0ID0gbmxhX25lc3Rfc3RhcnQobXNnLT5za2IsIFRJUENfTkxBX0JFQVJFUl9VRFBfT1BUUyk7CisJaWYgKCFuZXN0KQorCQlnb3RvIG1zZ19mdWxsOworCisJaWYgKF9fdGlwY19ubF9hZGRfdWRwX2FkZHIobXNnLT5za2IsIHNyYywgVElQQ19OTEFfVURQX0xPQ0FMKSkKKwkJZ290byBtc2dfZnVsbDsKKworCWRzdCA9IChzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKikmYi0+YmNhc3RfYWRkci52YWx1ZTsKKwlpZiAoX190aXBjX25sX2FkZF91ZHBfYWRkcihtc2ctPnNrYiwgZHN0LCBUSVBDX05MQV9VRFBfUkVNT1RFKSkKKwkJZ290byBtc2dfZnVsbDsKKworCWlmICghbGlzdF9lbXB0eSgmdWItPnJjYXN0Lmxpc3QpKSB7CisJCWlmIChubGFfcHV0X2ZsYWcobXNnLT5za2IsIFRJUENfTkxBX1VEUF9NVUxUSV9SRU1PVEVJUCkpCisJCQlnb3RvIG1zZ19mdWxsOworCX0KKworCW5sYV9uZXN0X2VuZChtc2ctPnNrYiwgbmVzdCk7CisJcmV0dXJuIDA7Cittc2dfZnVsbDoKKwlubGFfbmVzdF9jYW5jZWwobXNnLT5za2IsIG5lc3QpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKKy8qKgorICogdGlwY19wYXJzZV91ZHBfYWRkciAtIGJ1aWxkIHVkcCBtZWRpYSBhZGRyZXNzIGZyb20gbmV0bGluayBkYXRhCisgKiBAbmxhdHRyOgluZXRsaW5rIGF0dHJpYnV0ZSBjb250YWluaW5nIHNvY2thZGRyIHN0b3JhZ2UgYWxpZ25lZCBhZGRyZXNzCisgKiBAYWRkcjoJdGlwYyBtZWRpYSBhZGRyZXNzIHRvIGZpbGwgd2l0aCBhZGRyZXNzLCBwb3J0IGFuZCBwcm90b2NvbCB0eXBlCisgKiBAc2NvcGVfaWQ6CUlQdjYgc2NvcGUgaWQgcG9pbnRlciwgbm90IE5VTEwgaW5kaWNhdGVzIGl0J3MgcmVxdWlyZWQKKyAqLworCitzdGF0aWMgaW50IHRpcGNfcGFyc2VfdWRwX2FkZHIoc3RydWN0IG5sYXR0ciAqbmxhLCBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmFkZHIsCisJCQkgICAgICAgdTMyICpzY29wZV9pZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzYTsKKworCW5sYV9tZW1jcHkoJnNhLCBubGEsIHNpemVvZihzYSkpOworCWlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVCkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmlwNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc2E7CisKKwkJYWRkci0+cHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7CisJCWFkZHItPnBvcnQgPSBpcDQtPnNpbl9wb3J0OworCQlhZGRyLT5pcHY0LnNfYWRkciA9IGlwNC0+c2luX2FkZHIuc19hZGRyOwogCQlyZXR1cm4gMDsKIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JfSBlbHNlIGlmICgoc2FfbG9jYWwuc3NfZmFtaWx5ICYgc2FfcmVtb3RlLnNzX2ZhbWlseSkgPT0gQUZfSU5FVDYpIHsKLQkJaW50IGF0eXBlOwotCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICppcDY7CisJfSBlbHNlIGlmIChzYS5zc19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luNiAqaXA2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmc2E7CiAKLQkJaXA2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmc2FfbG9jYWw7Ci0JCWF0eXBlID0gaXB2Nl9hZGRyX3R5cGUoJmlwNi0+c2luNl9hZGRyKTsKLQkJaWYgKF9faXB2Nl9hZGRyX25lZWRzX3Njb3BlX2lkKGF0eXBlKSAmJiAhaXA2LT5zaW42X3Njb3BlX2lkKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCWFkZHItPnByb3RvID0gaHRvbnMoRVRIX1BfSVBWNik7CisJCWFkZHItPnBvcnQgPSBpcDYtPnNpbjZfcG9ydDsKKwkJbWVtY3B5KCZhZGRyLT5pcHY2LCAmaXA2LT5zaW42X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKIAotCQlsb2NhbC0+cHJvdG8gPSBodG9ucyhFVEhfUF9JUFY2KTsKLQkJbG9jYWwtPnBvcnQgPSBpcDYtPnNpbjZfcG9ydDsKLQkJbWVtY3B5KCZsb2NhbC0+aXB2NiwgJmlwNi0+c2luNl9hZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7Ci0JCXViLT5pZmluZGV4ID0gaXA2LT5zaW42X3Njb3BlX2lkOworCQkvKiBTY29wZSBJRCBpcyBvbmx5IGludGVyZXN0aW5nIGZvciBsb2NhbCBhZGRyZXNzZXMgKi8KKwkJaWYgKHNjb3BlX2lkKSB7CisJCQlpbnQgYXR5cGU7CiAKLQkJaXA2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmc2FfcmVtb3RlOwotCQlyZW1vdGUtPnByb3RvID0gaHRvbnMoRVRIX1BfSVBWNik7Ci0JCXJlbW90ZS0+cG9ydCA9IGlwNi0+c2luNl9wb3J0OwotCQltZW1jcHkoJnJlbW90ZS0+aXB2NiwgJmlwNi0+c2luNl9hZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCQlhdHlwZSA9IGlwdjZfYWRkcl90eXBlKCZpcDYtPnNpbjZfYWRkcik7CisJCQlpZiAoX19pcHY2X2FkZHJfbmVlZHNfc2NvcGVfaWQoYXR5cGUpICYmCisJCQkgICAgIWlwNi0+c2luNl9zY29wZV9pZCkgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQkqc2NvcGVfaWQgPSBpcDYtPnNpbjZfc2NvcGVfaWQgPyA6IDA7CisJCX0KKwogCQlyZXR1cm4gMDsKICNlbmRpZgogCX0KIAlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CiB9CiAKK2ludCB0aXBjX3VkcF9ubF9iZWFyZXJfYWRkKHN0cnVjdCB0aXBjX2JlYXJlciAqYiwgc3RydWN0IG5sYXR0ciAqYXR0cikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciBhZGRyID0gezB9OworCXN0cnVjdCBubGF0dHIgKm9wdHNbVElQQ19OTEFfVURQX01BWCArIDFdOworCXN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqZHN0OworCisJaWYgKG5sYV9wYXJzZV9uZXN0ZWQob3B0cywgVElQQ19OTEFfVURQX01BWCwgYXR0ciwgdGlwY19ubF91ZHBfcG9saWN5KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIW9wdHNbVElQQ19OTEFfVURQX1JFTU9URV0pCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gdGlwY19wYXJzZV91ZHBfYWRkcihvcHRzW1RJUENfTkxBX1VEUF9SRU1PVEVdLCAmYWRkciwgTlVMTCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWRzdCA9IChzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKikmYi0+YmNhc3RfYWRkci52YWx1ZTsKKwlpZiAodGlwY191ZHBfaXNfbWNhc3RfYWRkcihkc3QpKSB7CisJCXByX2VycigiQ2FuJ3QgYWRkIHJlbW90ZSBpcCB0byBUSVBDIFVEUCBtdWx0aWNhc3QgYmVhcmVyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHRpcGNfdWRwX2lzX2tub3duX3BlZXIoYiwgJmFkZHIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB0aXBjX3VkcF9yY2FzdF9hZGQoYiwgJmFkZHIpOworfQorCiAvKioKICAqIHRpcGNfdWRwX2VuYWJsZSAtIGNhbGxiYWNrIHRvIGNyZWF0ZSBhIG5ldyB1ZHAgYmVhcmVyIGluc3RhbmNlCiAgKiBAbmV0OgluZXR3b3JrIG5hbWVzcGFjZQpAQCAtMzQwLDE4ICs2NDMsMzggQEAKIHsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAlzdHJ1Y3QgdWRwX2JlYXJlciAqdWI7Ci0Jc3RydWN0IHVkcF9tZWRpYV9hZGRyICpyZW1vdGU7CisJc3RydWN0IHVkcF9tZWRpYV9hZGRyIHJlbW90ZSA9IHswfTsKIAlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgbG9jYWwgPSB7MH07CiAJc3RydWN0IHVkcF9wb3J0X2NmZyB1ZHBfY29uZiA9IHswfTsKIAlzdHJ1Y3QgdWRwX3R1bm5lbF9zb2NrX2NmZyB0dW5jZmcgPSB7TlVMTH07CisJc3RydWN0IG5sYXR0ciAqb3B0c1tUSVBDX05MQV9VRFBfTUFYICsgMV07CiAKIAl1YiA9IGt6YWxsb2Moc2l6ZW9mKCp1YiksIEdGUF9BVE9NSUMpOwogCWlmICghdWIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmVtb3RlID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZiLT5iY2FzdF9hZGRyLnZhbHVlOwotCW1lbXNldChyZW1vdGUsIDAsIHNpemVvZihzdHJ1Y3QgdWRwX21lZGlhX2FkZHIpKTsKLQllcnIgPSBwYXJzZV9vcHRpb25zKGF0dHJzLCB1YiwgJmxvY2FsLCByZW1vdGUpOworCUlOSVRfTElTVF9IRUFEKCZ1Yi0+cmNhc3QubGlzdCk7CisKKwlpZiAoIWF0dHJzW1RJUENfTkxBX0JFQVJFUl9VRFBfT1BUU10pCisJCWdvdG8gZXJyOworCisJaWYgKG5sYV9wYXJzZV9uZXN0ZWQob3B0cywgVElQQ19OTEFfVURQX01BWCwKKwkJCSAgICAgYXR0cnNbVElQQ19OTEFfQkVBUkVSX1VEUF9PUFRTXSwKKwkJCSAgICAgdGlwY19ubF91ZHBfcG9saWN5KSkKKwkJZ290byBlcnI7CisKKwlpZiAoIW9wdHNbVElQQ19OTEFfVURQX0xPQ0FMXSB8fCAhb3B0c1tUSVBDX05MQV9VRFBfUkVNT1RFXSkgeworCQlwcl9lcnIoIkludmFsaWQgVURQIGJlYXJlciBjb25maWd1cmF0aW9uIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCWVyciA9IHRpcGNfcGFyc2VfdWRwX2FkZHIob3B0c1tUSVBDX05MQV9VRFBfTE9DQUxdLCAmbG9jYWwsCisJCQkJICAmdWItPmlmaW5kZXgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCisJZXJyID0gdGlwY19wYXJzZV91ZHBfYWRkcihvcHRzW1RJUENfTkxBX1VEUF9SRU1PVEVdLCAmcmVtb3RlLCBOVUxMKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycjsKIApAQCAtMzk2LDEwICs3MTksMjIgQEAKIAl0dW5jZmcuZW5jYXBfZGVzdHJveSA9IE5VTEw7CiAJc2V0dXBfdWRwX3R1bm5lbF9zb2NrKG5ldCwgdWItPnVic29jaywgJnR1bmNmZyk7CiAKLQlpZiAoZW5hYmxlX21jYXN0KHViLCByZW1vdGUpKQorCS8qKgorCSAqIFRoZSBiY2FzdCBtZWRpYSBhZGRyZXNzIHBvcnQgaXMgdXNlZCBmb3IgYWxsIHBlZXJzIGFuZCB0aGUgaXAKKwkgKiBpcyB1c2VkIGlmIGl0J3MgYSBtdWx0aWNhc3QgYWRkcmVzcy4KKwkgKi8KKwltZW1jcHkoJmItPmJjYXN0X2FkZHIudmFsdWUsICZyZW1vdGUsIHNpemVvZihyZW1vdGUpKTsKKwlpZiAodGlwY191ZHBfaXNfbWNhc3RfYWRkcigmcmVtb3RlKSkKKwkJZXJyID0gZW5hYmxlX21jYXN0KHViLCAmcmVtb3RlKTsKKwllbHNlCisJCWVyciA9IHRpcGNfdWRwX3JjYXN0X2FkZChiLCAmcmVtb3RlKTsKKwlpZiAoZXJyKQogCQlnb3RvIGVycjsKKwogCXJldHVybiAwOwogZXJyOgorCWlmICh1Yi0+dWJzb2NrKQorCQl1ZHBfdHVubmVsX3NvY2tfcmVsZWFzZSh1Yi0+dWJzb2NrKTsKIAlrZnJlZSh1Yik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTQwOCw2ICs3NDMsMTIgQEAKIHN0YXRpYyB2b2lkIGNsZWFudXBfYmVhcmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgdWRwX2JlYXJlciAqdWIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHVkcF9iZWFyZXIsIHdvcmspOworCXN0cnVjdCB1ZHBfcmVwbGljYXN0ICpyY2FzdCwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyY2FzdCwgdG1wLCAmdWItPnJjYXN0Lmxpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfcmN1KCZyY2FzdC0+bGlzdCk7CisJCWtmcmVlX3JjdShyY2FzdCwgcmN1KTsKKwl9CiAKIAlpZiAodWItPnVic29jaykKIAkJdWRwX3R1bm5lbF9zb2NrX3JlbGVhc2UodWItPnVic29jayk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy91ZHBfbWVkaWEuaCBiL25ldC90aXBjL3VkcF9tZWRpYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MWJiYWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvdGlwYy91ZHBfbWVkaWEuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogbmV0L3RpcGMvdWRwX21lZGlhLmg6IEluY2x1ZGUgZmlsZSBmb3IgVURQIGJlYXJlciBtZWRpYQorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDA2LCAyMDEzLTIwMTYsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAtMjAxMSwgV2luZCBSaXZlciBTeXN0ZW1zCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZkZWYgQ09ORklHX1RJUENfTUVESUFfVURQCisjaWZuZGVmIF9USVBDX1VEUF9NRURJQV9ICisjZGVmaW5lIF9USVBDX1VEUF9NRURJQV9ICisKK2ludCB0aXBjX3VkcF9ubF9iZWFyZXJfYWRkKHN0cnVjdCB0aXBjX2JlYXJlciAqYiwgc3RydWN0IG5sYXR0ciAqYXR0cik7CitpbnQgdGlwY191ZHBfbmxfYWRkX2JlYXJlcl9kYXRhKHN0cnVjdCB0aXBjX25sX21zZyAqbXNnLCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpOworaW50IHRpcGNfdWRwX25sX2R1bXBfcmVtb3RlaXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC91bml4L2FmX3VuaXguYyBiL25ldC91bml4L2FmX3VuaXguYwppbmRleCBmMWRmZmU4Li4xNDUwODJlIDEwMDY0NAotLS0gYS9uZXQvdW5peC9hZl91bml4LmMKKysrIGIvbmV0L3VuaXgvYWZfdW5peC5jCkBAIC02NjEsMTEgKzY2MSwxMSBAQAogewogCXN0cnVjdCB1bml4X3NvY2sgKnUgPSB1bml4X3NrKHNrKTsKIAotCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnUtPnJlYWRsb2NrKSkKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ1LT5pb2xvY2spKQogCQlyZXR1cm4gLUVJTlRSOwogCiAJc2stPnNrX3BlZWtfb2ZmID0gdmFsOwotCW11dGV4X3VubG9jaygmdS0+cmVhZGxvY2spOworCW11dGV4X3VubG9jaygmdS0+aW9sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzc5LDcgKzc3OSw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJnUtPmxvY2spOwogCWF0b21pY19sb25nX3NldCgmdS0+aW5mbGlnaHQsIDApOwogCUlOSVRfTElTVF9IRUFEKCZ1LT5saW5rKTsKLQltdXRleF9pbml0KCZ1LT5yZWFkbG9jayk7IC8qIHNpbmdsZSB0YXNrIHJlYWRpbmcgbG9jayAqLworCW11dGV4X2luaXQoJnUtPmlvbG9jayk7IC8qIHNpbmdsZSB0YXNrIHJlYWRpbmcgbG9jayAqLworCW11dGV4X2luaXQoJnUtPmJpbmRsb2NrKTsgLyogc2luZ2xlIHRhc2sgYmluZGluZyBsb2NrICovCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdS0+cGVlcl93YWl0KTsKIAlpbml0X3dhaXRxdWV1ZV9mdW5jX2VudHJ5KCZ1LT5wZWVyX3dha2UsIHVuaXhfZGdyYW1fcGVlcl93YWtlX3JlbGF5KTsKIAl1bml4X2luc2VydF9zb2NrZXQodW5peF9zb2NrZXRzX3VuYm91bmQoc2spLCBzayk7CkBAIC04NDgsNyArODQ5LDcgQEAKIAlpbnQgZXJyOwogCXVuc2lnbmVkIGludCByZXRyaWVzID0gMDsKIAotCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdS0+cmVhZGxvY2spOworCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdS0+YmluZGxvY2spOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTg5NSw3ICs4OTYsNyBAQAogCXNwaW5fdW5sb2NrKCZ1bml4X3RhYmxlX2xvY2spOwogCWVyciA9IDA7CiAKLW91dDoJbXV0ZXhfdW5sb2NrKCZ1LT5yZWFkbG9jayk7CitvdXQ6CW11dGV4X3VubG9jaygmdS0+YmluZGxvY2spOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTk1NCwyMCArOTU1LDMyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgdW5peF9ta25vZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoLCB1bW9kZV90IG1vZGUsCi0JCSAgICAgIHN0cnVjdCBwYXRoICpyZXMpCitzdGF0aWMgaW50IHVuaXhfbWtub2QoY29uc3QgY2hhciAqc3VuX3BhdGgsIHVtb2RlX3QgbW9kZSwgc3RydWN0IHBhdGggKnJlcykKIHsKLQlpbnQgZXJyOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgcGF0aCBwYXRoOworCWludCBlcnIgPSAwOworCS8qCisJICogR2V0IHRoZSBwYXJlbnQgZGlyZWN0b3J5LCBjYWxjdWxhdGUgdGhlIGhhc2ggZm9yIGxhc3QKKwkgKiBjb21wb25lbnQuCisJICovCisJZGVudHJ5ID0ga2Vybl9wYXRoX2NyZWF0ZShBVF9GRENXRCwgc3VuX3BhdGgsICZwYXRoLCAwKTsKKwllcnIgPSBQVFJfRVJSKGRlbnRyeSk7CisJaWYgKElTX0VSUihkZW50cnkpKQorCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gc2VjdXJpdHlfcGF0aF9ta25vZChwYXRoLCBkZW50cnksIG1vZGUsIDApOworCS8qCisJICogQWxsIHJpZ2h0LCBsZXQncyBjcmVhdGUgaXQuCisJICovCisJZXJyID0gc2VjdXJpdHlfcGF0aF9ta25vZCgmcGF0aCwgZGVudHJ5LCBtb2RlLCAwKTsKIAlpZiAoIWVycikgewotCQllcnIgPSB2ZnNfbWtub2QoZF9pbm9kZShwYXRoLT5kZW50cnkpLCBkZW50cnksIG1vZGUsIDApOworCQllcnIgPSB2ZnNfbWtub2QoZF9pbm9kZShwYXRoLmRlbnRyeSksIGRlbnRyeSwgbW9kZSwgMCk7CiAJCWlmICghZXJyKSB7Ci0JCQlyZXMtPm1udCA9IG1udGdldChwYXRoLT5tbnQpOworCQkJcmVzLT5tbnQgPSBtbnRnZXQocGF0aC5tbnQpOwogCQkJcmVzLT5kZW50cnkgPSBkZ2V0KGRlbnRyeSk7CiAJCX0KIAl9Ci0KKwlkb25lX3BhdGhfY3JlYXRlKCZwYXRoLCBkZW50cnkpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTk3OCwxMiArOTkxLDEwIEBACiAJc3RydWN0IHVuaXhfc29jayAqdSA9IHVuaXhfc2soc2spOwogCXN0cnVjdCBzb2NrYWRkcl91biAqc3VuYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4gKil1YWRkcjsKIAljaGFyICpzdW5fcGF0aCA9IHN1bmFkZHItPnN1bl9wYXRoOwotCWludCBlcnIsIG5hbWVfZXJyOworCWludCBlcnI7CiAJdW5zaWduZWQgaW50IGhhc2g7CiAJc3RydWN0IHVuaXhfYWRkcmVzcyAqYWRkcjsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqbGlzdDsKLQlzdHJ1Y3QgcGF0aCBwYXRoOwotCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAogCWVyciA9IC1FSU5WQUw7CiAJaWYgKHN1bmFkZHItPnN1bl9mYW1pbHkgIT0gQUZfVU5JWCkKQEAgLTk5OSwzNCArMTAxMCwxNCBAQAogCQlnb3RvIG91dDsKIAlhZGRyX2xlbiA9IGVycjsKIAotCW5hbWVfZXJyID0gMDsKLQlkZW50cnkgPSBOVUxMOwotCWlmIChzdW5fcGF0aFswXSkgewotCQkvKiBHZXQgdGhlIHBhcmVudCBkaXJlY3RvcnksIGNhbGN1bGF0ZSB0aGUgaGFzaCBmb3IgbGFzdAotCQkgKiBjb21wb25lbnQuCi0JCSAqLwotCQlkZW50cnkgPSBrZXJuX3BhdGhfY3JlYXRlKEFUX0ZEQ1dELCBzdW5fcGF0aCwgJnBhdGgsIDApOwotCi0JCWlmIChJU19FUlIoZGVudHJ5KSkgewotCQkJLyogZGVsYXkgcmVwb3J0IHVudGlsIGFmdGVyICdhbHJlYWR5IGJvdW5kJyBjaGVjayAqLwotCQkJbmFtZV9lcnIgPSBQVFJfRVJSKGRlbnRyeSk7Ci0JCQlkZW50cnkgPSBOVUxMOwotCQl9Ci0JfQotCi0JZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ1LT5yZWFkbG9jayk7CisJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ1LT5iaW5kbG9jayk7CiAJaWYgKGVycikKLQkJZ290byBvdXRfcGF0aDsKKwkJZ290byBvdXQ7CiAKIAllcnIgPSAtRUlOVkFMOwogCWlmICh1LT5hZGRyKQogCQlnb3RvIG91dF91cDsKIAotCWlmIChuYW1lX2VycikgewotCQllcnIgPSBuYW1lX2VyciA9PSAtRUVYSVNUID8gLUVBRERSSU5VU0UgOiBuYW1lX2VycjsKLQkJZ290byBvdXRfdXA7Ci0JfQotCiAJZXJyID0gLUVOT01FTTsKIAlhZGRyID0ga21hbGxvYyhzaXplb2YoKmFkZHIpK2FkZHJfbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkZHIpCkBAIC0xMDM3LDExICsxMDI4LDExIEBACiAJYWRkci0+aGFzaCA9IGhhc2ggXiBzay0+c2tfdHlwZTsKIAlhdG9taWNfc2V0KCZhZGRyLT5yZWZjbnQsIDEpOwogCi0JaWYgKGRlbnRyeSkgewotCQlzdHJ1Y3QgcGF0aCB1X3BhdGg7CisJaWYgKHN1bl9wYXRoWzBdKSB7CisJCXN0cnVjdCBwYXRoIHBhdGg7CiAJCXVtb2RlX3QgbW9kZSA9IFNfSUZTT0NLIHwKIAkJICAgICAgIChTT0NLX0lOT0RFKHNvY2spLT5pX21vZGUgJiB+Y3VycmVudF91bWFzaygpKTsKLQkJZXJyID0gdW5peF9ta25vZChkZW50cnksICZwYXRoLCBtb2RlLCAmdV9wYXRoKTsKKwkJZXJyID0gdW5peF9ta25vZChzdW5fcGF0aCwgbW9kZSwgJnBhdGgpOwogCQlpZiAoZXJyKSB7CiAJCQlpZiAoZXJyID09IC1FRVhJU1QpCiAJCQkJZXJyID0gLUVBRERSSU5VU0U7CkBAIC0xMDQ5LDkgKzEwNDAsOSBAQAogCQkJZ290byBvdXRfdXA7CiAJCX0KIAkJYWRkci0+aGFzaCA9IFVOSVhfSEFTSF9TSVpFOwotCQloYXNoID0gZF9yZWFsX2lub2RlKGRlbnRyeSktPmlfaW5vICYgKFVOSVhfSEFTSF9TSVpFIC0gMSk7CisJCWhhc2ggPSBkX3JlYWxfaW5vZGUocGF0aC5kZW50cnkpLT5pX2lubyAmIChVTklYX0hBU0hfU0laRSAtIDEpOwogCQlzcGluX2xvY2soJnVuaXhfdGFibGVfbG9jayk7Ci0JCXUtPnBhdGggPSB1X3BhdGg7CisJCXUtPnBhdGggPSBwYXRoOwogCQlsaXN0ID0gJnVuaXhfc29ja2V0X3RhYmxlW2hhc2hdOwogCX0gZWxzZSB7CiAJCXNwaW5fbG9jaygmdW5peF90YWJsZV9sb2NrKTsKQEAgLTEwNzMsMTEgKzEwNjQsNyBAQAogb3V0X3VubG9jazoKIAlzcGluX3VubG9jaygmdW5peF90YWJsZV9sb2NrKTsKIG91dF91cDoKLQltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKLW91dF9wYXRoOgotCWlmIChkZW50cnkpCi0JCWRvbmVfcGF0aF9jcmVhdGUoJnBhdGgsIGRlbnRyeSk7Ci0KKwltdXRleF91bmxvY2soJnUtPmJpbmRsb2NrKTsKIG91dDoKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTk2OSwxNyArMTk1NiwxNyBAQAogCWlmIChmYWxzZSkgewogYWxsb2Nfc2tiOgogCQl1bml4X3N0YXRlX3VubG9jayhvdGhlcik7Ci0JCW11dGV4X3VubG9jaygmdW5peF9zayhvdGhlciktPnJlYWRsb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1bml4X3NrKG90aGVyKS0+aW9sb2NrKTsKIAkJbmV3c2tiID0gc29ja19hbGxvY19zZW5kX3Bza2Ioc2ssIDAsIDAsIGZsYWdzICYgTVNHX0RPTlRXQUlULAogCQkJCQkgICAgICAmZXJyLCAwKTsKIAkJaWYgKCFuZXdza2IpCiAJCQlnb3RvIGVycjsKIAl9CiAKLQkvKiB3ZSBtdXN0IGFjcXVpcmUgcmVhZGxvY2sgYXMgd2UgbW9kaWZ5IGFscmVhZHkgcHJlc2VudAorCS8qIHdlIG11c3QgYWNxdWlyZSBpb2xvY2sgYXMgd2UgbW9kaWZ5IGFscmVhZHkgcHJlc2VudAogCSAqIHNrYnMgaW4gdGhlIHNrX3JlY2VpdmVfcXVldWUgYW5kIG1lc3Mgd2l0aCBza2ItPmxlbgogCSAqLwotCWVyciA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdW5peF9zayhvdGhlciktPnJlYWRsb2NrKTsKKwllcnIgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJnVuaXhfc2sob3RoZXIpLT5pb2xvY2spOwogCWlmIChlcnIpIHsKIAkJZXJyID0gZmxhZ3MgJiBNU0dfRE9OVFdBSVQgPyAtRUFHQUlOIDogLUVSRVNUQVJUU1lTOwogCQlnb3RvIGVycjsKQEAgLTIwNDYsNyArMjAzMyw3IEBACiAJfQogCiAJdW5peF9zdGF0ZV91bmxvY2sob3RoZXIpOwotCW11dGV4X3VubG9jaygmdW5peF9zayhvdGhlciktPnJlYWRsb2NrKTsKKwltdXRleF91bmxvY2soJnVuaXhfc2sob3RoZXIpLT5pb2xvY2spOwogCiAJb3RoZXItPnNrX2RhdGFfcmVhZHkob3RoZXIpOwogCXNjbV9kZXN0cm95KCZzY20pOwpAQCAtMjA1NSw3ICsyMDQyLDcgQEAKIGVycl9zdGF0ZV91bmxvY2s6CiAJdW5peF9zdGF0ZV91bmxvY2sob3RoZXIpOwogZXJyX3VubG9jazoKLQltdXRleF91bmxvY2soJnVuaXhfc2sob3RoZXIpLT5yZWFkbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZ1bml4X3NrKG90aGVyKS0+aW9sb2NrKTsKIGVycjoKIAlrZnJlZV9za2IobmV3c2tiKTsKIAlpZiAoc2VuZF9zaWdwaXBlICYmICEoZmxhZ3MgJiBNU0dfTk9TSUdOQUwpKQpAQCAtMjEyMyw3ICsyMTEwLDcgQEAKIAl0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIGZsYWdzICYgTVNHX0RPTlRXQUlUKTsKIAogCWRvIHsKLQkJbXV0ZXhfbG9jaygmdS0+cmVhZGxvY2spOworCQltdXRleF9sb2NrKCZ1LT5pb2xvY2spOwogCiAJCXNraXAgPSBza19wZWVrX29mZnNldChzaywgZmxhZ3MpOwogCQlza2IgPSBfX3NrYl90cnlfcmVjdl9kYXRhZ3JhbShzaywgZmxhZ3MsICZwZWVrZWQsICZza2lwLCAmZXJyLApAQCAtMjEzMSwxNCArMjExOCwxNCBAQAogCQlpZiAoc2tiKQogCQkJYnJlYWs7CiAKLQkJbXV0ZXhfdW5sb2NrKCZ1LT5yZWFkbG9jayk7CisJCW11dGV4X3VubG9jaygmdS0+aW9sb2NrKTsKIAogCQlpZiAoZXJyICE9IC1FQUdBSU4pCiAJCQlicmVhazsKIAl9IHdoaWxlICh0aW1lbyAmJgogCQkgIV9fc2tiX3dhaXRfZm9yX21vcmVfcGFja2V0cyhzaywgJmVyciwgJnRpbWVvLCBsYXN0KSk7CiAKLQlpZiAoIXNrYikgeyAvKiBpbXBsaWVzIHJlYWRsb2NrIHVubG9ja2VkICovCisJaWYgKCFza2IpIHsgLyogaW1wbGllcyBpb2xvY2sgdW5sb2NrZWQgKi8KIAkJdW5peF9zdGF0ZV9sb2NrKHNrKTsKIAkJLyogU2lnbmFsIEVPRiBvbiBkaXNjb25uZWN0ZWQgbm9uLWJsb2NraW5nIFNFUVBBQ0tFVCBzb2NrZXQuICovCiAJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCAmJiBlcnIgPT0gLUVBR0FJTiAmJgpAQCAtMjIwMyw3ICsyMTkwLDcgQEAKIAogb3V0X2ZyZWU6CiAJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7Ci0JbXV0ZXhfdW5sb2NrKCZ1LT5yZWFkbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZ1LT5pb2xvY2spOwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0yMjk4LDcgKzIyODUsNyBAQAogCS8qIExvY2sgdGhlIHNvY2tldCB0byBwcmV2ZW50IHF1ZXVlIGRpc29yZGVyaW5nCiAJICogd2hpbGUgc2xlZXBzIGluIG1lbWNweV90b21zZwogCSAqLwotCW11dGV4X2xvY2soJnUtPnJlYWRsb2NrKTsKKwltdXRleF9sb2NrKCZ1LT5pb2xvY2spOwogCiAJaWYgKGZsYWdzICYgTVNHX1BFRUspCiAJCXNraXAgPSBza19wZWVrX29mZnNldChzaywgZmxhZ3MpOwpAQCAtMjM0MCw3ICsyMzI3LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJbXV0ZXhfdW5sb2NrKCZ1LT5yZWFkbG9jayk7CisJCQltdXRleF91bmxvY2soJnUtPmlvbG9jayk7CiAKIAkJCXRpbWVvID0gdW5peF9zdHJlYW1fZGF0YV93YWl0KHNrLCB0aW1lbywgbGFzdCwKIAkJCQkJCSAgICAgIGxhc3RfbGVuKTsKQEAgLTIzNTEsNyArMjMzOCw3IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKLQkJCW11dGV4X2xvY2soJnUtPnJlYWRsb2NrKTsKKwkJCW11dGV4X2xvY2soJnUtPmlvbG9jayk7CiAJCQlnb3RvIHJlZG87CiB1bmxvY2s6CiAJCQl1bml4X3N0YXRlX3VubG9jayhzayk7CkBAIC0yNDU0LDcgKzI0NDEsNyBAQAogCQl9CiAJfSB3aGlsZSAoc2l6ZSk7CiAKLQltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKKwltdXRleF91bmxvY2soJnUtPmlvbG9jayk7CiAJaWYgKHN0YXRlLT5tc2cpCiAJCXNjbV9yZWN2KHNvY2ssIHN0YXRlLT5tc2csICZzY20sIGZsYWdzKTsKIAllbHNlCkBAIC0yNDg4LDI4ICsyNDc1LDEzIEBACiAJcmV0dXJuIHVuaXhfc3RyZWFtX3JlYWRfZ2VuZXJpYygmc3RhdGUpOwogfQogCi1zdGF0aWMgc3NpemVfdCBza2JfdW5peF9zb2NrZXRfc3BsaWNlKHN0cnVjdCBzb2NrICpzaywKLQkJCQkgICAgICBzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAotCQkJCSAgICAgIHN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjICpzcGQpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgdW5peF9zb2NrICp1ID0gdW5peF9zayhzayk7Ci0KLQltdXRleF91bmxvY2soJnUtPnJlYWRsb2NrKTsKLQlyZXQgPSBzcGxpY2VfdG9fcGlwZShwaXBlLCBzcGQpOwotCW11dGV4X2xvY2soJnUtPnJlYWRsb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgdW5peF9zdHJlYW1fc3BsaWNlX2FjdG9yKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgIGludCBza2lwLCBpbnQgY2h1bmssCiAJCQkJICAgIHN0cnVjdCB1bml4X3N0cmVhbV9yZWFkX3N0YXRlICpzdGF0ZSkKIHsKIAlyZXR1cm4gc2tiX3NwbGljZV9iaXRzKHNrYiwgc3RhdGUtPnNvY2tldC0+c2ssCiAJCQkgICAgICAgVU5JWENCKHNrYikuY29uc3VtZWQgKyBza2lwLAotCQkJICAgICAgIHN0YXRlLT5waXBlLCBjaHVuaywgc3RhdGUtPnNwbGljZV9mbGFncywKLQkJCSAgICAgICBza2JfdW5peF9zb2NrZXRfc3BsaWNlKTsKKwkJCSAgICAgICBzdGF0ZS0+cGlwZSwgY2h1bmssIHN0YXRlLT5zcGxpY2VfZmxhZ3MpOwogfQogCiBzdGF0aWMgc3NpemVfdCB1bml4X3N0cmVhbV9zcGxpY2VfcmVhZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCAgbG9mZl90ICpwcG9zLApkaWZmIC0tZ2l0IGEvbmV0L3Ztd192c29jay9hZl92c29jay5jIGIvbmV0L3Ztd192c29jay9hZl92c29jay5jCmluZGV4IDE3ZGJiZTYuLjhhMzk4YjMgMTAwNjQ0Ci0tLSBhL25ldC92bXdfdnNvY2svYWZfdnNvY2suYworKysgYi9uZXQvdm13X3Zzb2NrL2FmX3Zzb2NrLmMKQEAgLTQ2NSw2ICs0NjUsOCBAQAogCiAJaWYgKHZzb2NrX2lzX3BlbmRpbmcoc2spKSB7CiAJCXZzb2NrX3JlbW92ZV9wZW5kaW5nKGxpc3RlbmVyLCBzayk7CisKKwkJbGlzdGVuZXItPnNrX2Fja19iYWNrbG9nLS07CiAJfSBlbHNlIGlmICghdnNrLT5yZWplY3RlZCkgewogCQkvKiBXZSBhcmUgbm90IG9uIHRoZSBwZW5kaW5nIGxpc3QgYW5kIGFjY2VwdCgpIGRpZCBub3QgcmVqZWN0CiAJCSAqIHVzLCBzbyB3ZSBtdXN0IGhhdmUgYmVlbiBhY2NlcHRlZCBieSBvdXIgdXNlciBwcm9jZXNzLiAgV2UKQEAgLTQ3NSw4ICs0NzcsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlsaXN0ZW5lci0+c2tfYWNrX2JhY2tsb2ctLTsKLQogCS8qIFdlIG5lZWQgdG8gcmVtb3ZlIG91cnNlbGYgZnJvbSB0aGUgZ2xvYmFsIGNvbm5lY3RlZCBzb2NrZXRzIGxpc3Qgc28KIAkgKiBpbmNvbWluZyBwYWNrZXRzIGNhbid0IGZpbmQgdGhpcyBzb2NrZXQsIGFuZCB0byByZWR1Y2UgdGhlIHJlZmVyZW5jZQogCSAqIGNvdW50LgpAQCAtMjAxMCw1ICsyMDEwLDUgQEAKIAogTU9EVUxFX0FVVEhPUigiVk13YXJlLCBJbmMuIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlZNd2FyZSBWaXJ0dWFsIFNvY2tldCBGYW1pbHkiKTsKLU1PRFVMRV9WRVJTSU9OKCIxLjAuMS4wLWsiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAuMi4wLWsiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jaGFuLmMgYi9uZXQvd2lyZWxlc3MvY2hhbi5jCmluZGV4IDBmNTA2MjIuLjU0OTdkMDIyIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvY2hhbi5jCisrKyBiL25ldC93aXJlbGVzcy9jaGFuLmMKQEAgLTM3Miw2ICszNzIsNyBAQAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ6CiAJY2FzZSBOVU1fTkw4MDIxMV9JRlRZUEVTOgpAQCAtOTQ2LDYgKzk0Nyw3IEBACiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfV0RTOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJLyogdGhlc2UgaW50ZXJmYWNlIHR5cGVzIGRvbid0IHJlYWxseSBoYXZlIGEgY2hhbm5lbCAqLwogCQlyZXR1cm47CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDoKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmMgYi9uZXQvd2lyZWxlc3MvY29yZS5jCmluZGV4IDc2NDVlOTcuLjgyMDFlNmQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmMKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuYwpAQCAtMjI1LDYgKzIyNSwyMyBAQAogCX0KIH0KIAordm9pZCBjZmc4MDIxMV9zdG9wX25hbihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCSAgICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KQoreworCUFTU0VSVF9SVE5MKCk7CisKKwlpZiAoV0FSTl9PTih3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTkFOKSkKKwkJcmV0dXJuOworCisJaWYgKCF3ZGV2LT5uYW5fc3RhcnRlZCkKKwkJcmV0dXJuOworCisJcmRldl9zdG9wX25hbihyZGV2LCB3ZGV2KTsKKwl3ZGV2LT5uYW5fc3RhcnRlZCA9IGZhbHNlOworCisJcmRldi0+b3BlbmNvdW50LS07Cit9CisKIHZvaWQgY2ZnODAyMTFfc2h1dGRvd25fYWxsX2ludGVyZmFjZXMoc3RydWN0IHdpcGh5ICp3aXBoeSkKIHsKIAlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdpcGh5KTsKQEAgLTI0Miw2ICsyNTksOSBAQAogCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CiAJCQljZmc4MDIxMV9zdG9wX3AycF9kZXZpY2UocmRldiwgd2Rldik7CiAJCQlicmVhazsKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CisJCQljZmc4MDIxMV9zdG9wX25hbihyZGV2LCB3ZGV2KTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KQEAgLTUzNyw2ICs1NTcsMTEgQEAKIAkJCQkgICAgYy0+bGltaXRzW2pdLm1heCA+IDEpKQogCQkJCXJldHVybiAtRUlOVkFMOwogCisJCQkvKiBPbmx5IGEgc2luZ2xlIE5BTiBjYW4gYmUgYWxsb3dlZCAqLworCQkJaWYgKFdBUk5fT04odHlwZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfTkFOKSAmJgorCQkJCSAgICBjLT5saW1pdHNbal0ubWF4ID4gMSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJCWNudCArPSBjLT5saW1pdHNbal0ubWF4OwogCQkJLyoKIAkJCSAqIERvbid0IGFkdmVydGlzZSBhbiB1bnN1cHBvcnRlZCB0eXBlCkBAIC01NzksNiArNjA0LDExIEBACiAJCSAgICAgIXJkZXYtPm9wcy0+dGRsc19jYW5jZWxfY2hhbm5lbF9zd2l0Y2gpKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoV0FSTl9PTigod2lwaHktPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9OQU4pKSAmJgorCQkgICAgKCFyZGV2LT5vcHMtPnN0YXJ0X25hbiB8fCAhcmRldi0+b3BzLT5zdG9wX25hbiB8fAorCQkgICAgICFyZGV2LT5vcHMtPmFkZF9uYW5fZnVuYyB8fCAhcmRldi0+b3BzLT5kZWxfbmFuX2Z1bmMpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKgogCSAqIGlmIGEgd2lwaHkgaGFzIHVuc3VwcG9ydGVkIG1vZGVzIGZvciByZWd1bGF0b3J5IGNoYW5uZWwgZW5mb3JjZW1lbnQsCiAJICogb3B0LW91dCBvZiBlbmZvcmNlbWVudCBjaGVja2luZwpAQCAtNTg5LDYgKzYxOSw3IEBACiAJCQkJICAgICAgIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pIHwKIAkJCQkgICAgICAgQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKSB8CiAJCQkJICAgICAgIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSB8CisJCQkJICAgICAgIEJJVChOTDgwMjExX0lGVFlQRV9OQU4pIHwKIAkJCQkgICAgICAgQklUKE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pIHwKIAkJCQkgICAgICAgQklUKE5MODAyMTFfSUZUWVBFX01PTklUT1IpKSkKIAkJd2lwaHktPnJlZ3VsYXRvcnlfZmxhZ3MgfD0gUkVHVUxBVE9SWV9JR05PUkVfU1RBTEVfS0lDS09GRjsKQEAgLTkwNiw2ICs5MzcsOCBAQAogCWlmIChXQVJOX09OKHdkZXYtPm5ldGRldikpCiAJCXJldHVybjsKIAorCW5sODAyMTFfbm90aWZ5X2lmYWNlKHJkZXYsIHdkZXYsIE5MODAyMTFfQ01EX0RFTF9JTlRFUkZBQ0UpOworCiAJbGlzdF9kZWxfcmN1KCZ3ZGV2LT5saXN0KTsKIAlyZGV2LT5kZXZsaXN0X2dlbmVyYXRpb24rKzsKIApAQCAtOTE0LDYgKzk0Nyw5IEBACiAJCWNmZzgwMjExX21sbWVfcHVyZ2VfcmVnaXN0cmF0aW9ucyh3ZGV2KTsKIAkJY2ZnODAyMTFfc3RvcF9wMnBfZGV2aWNlKHJkZXYsIHdkZXYpOwogCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKKwkJY2ZnODAyMTFfc3RvcF9uYW4ocmRldiwgd2Rldik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVdBUk5fT05fT05DRSgxKTsKIAkJYnJlYWs7CkBAIC05NzcsNiArMTAxMyw3IEBACiAJCS8qIG11c3QgYmUgaGFuZGxlZCBieSBtYWM4MDIxMS9kcml2ZXIsIGhhcyBubyBBUElzICovCiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJLyogY2Fubm90IGhhcHBlbiwgaGFzIG5vIG5ldGRldiAqLwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46CkBAIC0xMDc5LDYgKzExMTYsOCBAQAogCQkgICAgIHdkZXYtPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UIHx8CiAJCSAgICAgd2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSAmJiAhd2Rldi0+dXNlXzRhZGRyKQogCQkJZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9ET05UX0JSSURHRTsKKworCQlubDgwMjExX25vdGlmeV9pZmFjZShyZGV2LCB3ZGV2LCBOTDgwMjExX0NNRF9ORVdfSU5URVJGQUNFKTsKIAkJYnJlYWs7CiAJY2FzZSBORVRERVZfR09JTkdfRE9XTjoKIAkJY2ZnODAyMTFfbGVhdmUocmRldiwgd2Rldik7CkBAIC0xMTU3LDYgKzExOTYsOCBAQAogCQkgKiByZW1vdmUgYW5kIGNsZWFuIGl0IHVwLgogCQkgKi8KIAkJaWYgKCFsaXN0X2VtcHR5KCZ3ZGV2LT5saXN0KSkgeworCQkJbmw4MDIxMV9ub3RpZnlfaWZhY2UocmRldiwgd2RldiwKKwkJCQkJICAgICBOTDgwMjExX0NNRF9ERUxfSU5URVJGQUNFKTsKIAkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmRldi5rb2JqLCAicGh5ODAyMTEiKTsKIAkJCWxpc3RfZGVsX3JjdSgmd2Rldi0+bGlzdCk7CiAJCQlyZGV2LT5kZXZsaXN0X2dlbmVyYXRpb24rKzsKQEAgLTEyNDYsNyArMTI4Nyw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfZmFpbF9yZWc7CiAKLQljZmc4MDIxMV93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJjZmc4MDIxMSIpOworCWNmZzgwMjExX3dxID0gYWxsb2Nfb3JkZXJlZF93b3JrcXVldWUoImNmZzgwMjExIiwgV1FfTUVNX1JFQ0xBSU0pOwogCWlmICghY2ZnODAyMTFfd3EpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfZmFpbF93cTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9jb3JlLmggYi9uZXQvd2lyZWxlc3MvY29yZS5oCmluZGV4IGVlZTkxNDQuLjA4ZDJlOTQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9jb3JlLmgKKysrIGIvbmV0L3dpcmVsZXNzL2NvcmUuaApAQCAtMjQ5LDkgKzI0OSw5IEBACiB9OwogCiBzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgewotCXN0cnVjdCBrZXlfcGFyYW1zIHBhcmFtc1s2XTsKLQl1OCBkYXRhWzZdW1dMQU5fTUFYX0tFWV9MRU5dOwotCWludCBkZWYsIGRlZm1nbXQ7CisJc3RydWN0IGtleV9wYXJhbXMgcGFyYW1zW0NGRzgwMjExX01BWF9XRVBfS0VZU107CisJdTggZGF0YVtDRkc4MDIxMV9NQVhfV0VQX0tFWVNdW1dMQU5fS0VZX0xFTl9XRVAxMDRdOworCWludCBkZWY7CiB9OwogCiBlbnVtIGNmZzgwMjExX2NoYW5fbW9kZSB7CkBAIC00ODgsNiArNDg4LDkgQEAKIHZvaWQgY2ZnODAyMTFfc3RvcF9wMnBfZGV2aWNlKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCSAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOwogCit2b2lkIGNmZzgwMjExX3N0b3BfbmFuKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJICAgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpOworCiAjZGVmaW5lIENGRzgwMjExX01BWF9OVU1fRElGRkVSRU5UX0NIQU5ORUxTIDEwCiAKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfREVWRUxPUEVSX1dBUk5JTkdTCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvaWJzcy5jIGIvbmV0L3dpcmVsZXNzL2lic3MuYwppbmRleCA0YTRkZGE1Li4zNjRmOTAwIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvaWJzcy5jCisrKyBiL25ldC93aXJlbGVzcy9pYnNzLmMKQEAgLTQzLDcgKzQzLDggQEAKIAljZmc4MDIxMV9ob2xkX2Jzcyhic3NfZnJvbV9wdWIoYnNzKSk7CiAJd2Rldi0+Y3VycmVudF9ic3MgPSBic3NfZnJvbV9wdWIoYnNzKTsKIAotCWNmZzgwMjExX3VwbG9hZF9jb25uZWN0X2tleXMod2Rldik7CisJaWYgKCEod2Rldi0+d2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19IQVNfU1RBVElDX1dFUCkpCisJCWNmZzgwMjExX3VwbG9hZF9jb25uZWN0X2tleXMod2Rldik7CiAKIAlubDgwMjExX3NlbmRfaWJzc19ic3NpZCh3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KSwgZGV2LCBic3NpZCwKIAkJCQlHRlBfS0VSTkVMKTsKQEAgLTExNCw2ICsxMTUsOSBAQAogCQl9CiAJfQogCisJaWYgKFdBUk5fT04oY29ubmtleXMgJiYgY29ubmtleXMtPmRlZiA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChXQVJOX09OKHdkZXYtPmNvbm5lY3Rfa2V5cykpCiAJCWt6ZnJlZSh3ZGV2LT5jb25uZWN0X2tleXMpOwogCXdkZXYtPmNvbm5lY3Rfa2V5cyA9IGNvbm5rZXlzOwpAQCAtMjg0LDE4ICsyODgsMTYgQEAKIAlpZiAoIW5ldGlmX3J1bm5pbmcod2Rldi0+bmV0ZGV2KSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAod2Rldi0+d2V4dC5rZXlzKSB7CisJaWYgKHdkZXYtPndleHQua2V5cykKIAkJd2Rldi0+d2V4dC5rZXlzLT5kZWYgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfa2V5OwotCQl3ZGV2LT53ZXh0LmtleXMtPmRlZm1nbXQgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfbWdtdF9rZXk7Ci0JfQogCiAJd2Rldi0+d2V4dC5pYnNzLnByaXZhY3kgPSB3ZGV2LT53ZXh0LmRlZmF1bHRfa2V5ICE9IC0xOwogCi0JaWYgKHdkZXYtPndleHQua2V5cykgeworCWlmICh3ZGV2LT53ZXh0LmtleXMgJiYgd2Rldi0+d2V4dC5rZXlzLT5kZWYgIT0gLTEpIHsKIAkJY2sgPSBrbWVtZHVwKHdkZXYtPndleHQua2V5cywgc2l6ZW9mKCpjayksIEdGUF9LRVJORUwpOwogCQlpZiAoIWNrKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBDRkc4MDIxMV9NQVhfV0VQX0tFWVM7IGkrKykKIAkJCWNrLT5wYXJhbXNbaV0ua2V5ID0gY2stPmRhdGFbaV07CiAJfQogCWVyciA9IF9fY2ZnODAyMTFfam9pbl9pYnNzKHJkZXYsIHdkZXYtPm5ldGRldiwKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9tbG1lLmMgYi9uZXQvd2lyZWxlc3MvbWxtZS5jCmluZGV4IGMyODRkODguLmNiYjQ4ZTIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9tbG1lLmMKKysrIGIvbmV0L3dpcmVsZXNzL21sbWUuYwpAQCAtMjIyLDcgKzIyMiw3IEBACiAJQVNTRVJUX1dERVZfTE9DSyh3ZGV2KTsKIAogCWlmIChhdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZKQotCQlpZiAoIWtleSB8fCAha2V5X2xlbiB8fCBrZXlfaWR4IDwgMCB8fCBrZXlfaWR4ID4gNCkKKwkJaWYgKCFrZXkgfHwgIWtleV9sZW4gfHwga2V5X2lkeCA8IDAgfHwga2V5X2lkeCA+IDMpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh3ZGV2LT5jdXJyZW50X2JzcyAmJgpAQCAtNjM0LDYgKzYzNCw3IEBACiAJCQkgKiBmYWxsIHRocm91Z2gsIFAyUCBkZXZpY2Ugb25seSBzdXBwb3J0cwogCQkJICogcHVibGljIGFjdGlvbiBmcmFtZXMKIAkJCSAqLworCQljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAkJZGVmYXVsdDoKIAkJCWVyciA9IC1FT1BOT1RTVVBQOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwppbmRleCBmMDI2NTNhLi5jNTEwODEwIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKQEAgLTU2LDYgKzU2LDcgQEAKIAlOTDgwMjExX01DR1JQX1JFR1VMQVRPUlksCiAJTkw4MDIxMV9NQ0dSUF9NTE1FLAogCU5MODAyMTFfTUNHUlBfVkVORE9SLAorCU5MODAyMTFfTUNHUlBfTkFOLAogCU5MODAyMTFfTUNHUlBfVEVTVE1PREUgLyoga2VlcCBsYXN0IC0gaWZkZWYhICovCiB9OwogCkBAIC02NSw2ICs2Niw3IEBACiAJW05MODAyMTFfTUNHUlBfUkVHVUxBVE9SWV0gPSB7IC5uYW1lID0gTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfUkVHIH0sCiAJW05MODAyMTFfTUNHUlBfTUxNRV0gPSB7IC5uYW1lID0gTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfTUxNRSB9LAogCVtOTDgwMjExX01DR1JQX1ZFTkRPUl0gPSB7IC5uYW1lID0gTkw4MDIxMV9NVUxUSUNBU1RfR1JPVVBfVkVORE9SIH0sCisJW05MODAyMTFfTUNHUlBfTkFOXSA9IHsgLm5hbWUgPSBOTDgwMjExX01VTFRJQ0FTVF9HUk9VUF9OQU4gfSwKICNpZmRlZiBDT05GSUdfTkw4MDIxMV9URVNUTU9ERQogCVtOTDgwMjExX01DR1JQX1RFU1RNT0RFXSA9IHsgLm5hbWUgPSBOTDgwMjExX01VTFRJQ0FTVF9HUk9VUF9URVNUTU9ERSB9CiAjZW5kaWYKQEAgLTQwOSw2ICs0MTEsOSBAQAogCQkubGVuID0gVkhUX01VTUlNT19HUk9VUFNfREFUQV9MRU4KIAl9LAogCVtOTDgwMjExX0FUVFJfTVVfTUlNT19GT0xMT1dfTUFDX0FERFJdID0geyAubGVuID0gRVRIX0FMRU4gfSwKKwlbTkw4MDIxMV9BVFRSX05BTl9NQVNURVJfUFJFRl0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfQVRUUl9OQU5fRFVBTF0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfQVRUUl9OQU5fRlVOQ10gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogfTsKIAogLyogcG9saWN5IGZvciB0aGUga2V5IGF0dHJpYnV0ZXMgKi8KQEAgLTUwMiw2ICs1MDcsMzkgQEAKIAl9LAogfTsKIAorLyogcG9saWN5IGZvciBOQU4gZnVuY3Rpb24gYXR0cmlidXRlcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5CitubDgwMjExX25hbl9mdW5jX3BvbGljeVtOTDgwMjExX05BTl9GVU5DX0FUVFJfTUFYICsgMV0gPSB7CisJW05MODAyMTFfTkFOX0ZVTkNfVFlQRV0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JRF0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkgICAgLmxlbiA9IE5MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JRF9MRU4gfSwKKwlbTkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNIX1RZUEVdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9GVU5DX1BVQkxJU0hfQkNBU1RdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfU1VCU0NSSUJFX0FDVElWRV0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKKwlbTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfSURdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9SRVFfSURdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9ERVNUXSA9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfQ0xPU0VfUkFOR0VdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfVFRMXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JTkZPXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAorCQkJLmxlbiA9IE5MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9TUEVDX0lORk9fTUFYX0xFTiB9LAorCVtOTDgwMjExX05BTl9GVU5DX1NSRl0gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtOTDgwMjExX05BTl9GVU5DX1JYX01BVENIX0ZJTFRFUl0gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtOTDgwMjExX05BTl9GVU5DX1RYX01BVENIX0ZJTFRFUl0gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtOTDgwMjExX05BTl9GVU5DX0lOU1RBTkNFX0lEXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKKwlbTkw4MDIxMV9OQU5fRlVOQ19URVJNX1JFQVNPTl0gPSB7IC50eXBlID0gTkxBX1U4IH0sCit9OworCisvKiBwb2xpY3kgZm9yIFNlcnZpY2UgUmVzcG9uc2UgRmlsdGVyIGF0dHJpYnV0ZXMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeQorbmw4MDIxMV9uYW5fc3JmX3BvbGljeVtOTDgwMjExX05BTl9TUkZfQVRUUl9NQVggKyAxXSA9IHsKKwlbTkw4MDIxMV9OQU5fU1JGX0lOQ0xVREVdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCisJW05MODAyMTFfTkFOX1NSRl9CRl0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkgLmxlbiA9ICBOTDgwMjExX05BTl9GVU5DX1NSRl9NQVhfTEVOIH0sCisJW05MODAyMTFfTkFOX1NSRl9CRl9JRFhdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtOTDgwMjExX05BTl9TUkZfTUFDX0FERFJTXSA9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCit9OworCiBzdGF0aWMgaW50IG5sODAyMTFfcHJlcGFyZV93ZGV2X2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKIAkJCQkgICAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqKnJkZXYsCkBAIC04NDgsMTMgKzg4NiwyMSBAQAogCXN0cnVjdCBubGF0dHIgKmtleTsKIAlzdHJ1Y3QgY2ZnODAyMTFfY2FjaGVkX2tleXMgKnJlc3VsdDsKIAlpbnQgcmVtLCBlcnIsIGRlZiA9IDA7CisJYm9vbCBoYXZlX2tleSA9IGZhbHNlOworCisJbmxhX2Zvcl9lYWNoX25lc3RlZChrZXksIGtleXMsIHJlbSkgeworCQloYXZlX2tleSA9IHRydWU7CisJCWJyZWFrOworCX0KKworCWlmICghaGF2ZV9rZXkpCisJCXJldHVybiBOVUxMOwogCiAJcmVzdWx0ID0ga3phbGxvYyhzaXplb2YoKnJlc3VsdCksIEdGUF9LRVJORUwpOwogCWlmICghcmVzdWx0KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCXJlc3VsdC0+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+d2lwaHksCisJCQkJICAgICBOTDgwMjExX0VYVF9GRUFUVVJFX0JFQUNPTl9SQVRFX1ZIVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbmw4MDIxMV9wYXJzZV9iZWFjb24oc3RydWN0IG5sYXR0ciAqYXR0cnNbXSwKIAkJCQlzdHJ1Y3QgY2ZnODAyMTFfYmVhY29uX2RhdGEgKmJjbikKIHsKQEAgLTM1NDUsNiArMzg5NCwxNyBAQAogCQkJCQkgICB3ZGV2LT5pZnR5cGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfVFhfUkFURVNdKSB7CisJCWVyciA9IG5sODAyMTFfcGFyc2VfdHhfYml0cmF0ZV9tYXNrKGluZm8sICZwYXJhbXMuYmVhY29uX3JhdGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSB2YWxpZGF0ZV9iZWFjb25fdHhfcmF0ZShyZGV2LCBwYXJhbXMuY2hhbmRlZi5jaGFuLT5iYW5kLAorCQkJCQkgICAgICAmcGFyYW1zLmJlYWNvbl9yYXRlKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TTVBTX01PREVdKSB7CiAJCXBhcmFtcy5zbXBzX21vZGUgPQogCQkJbmxhX2dldF91OChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU01QU19NT0RFXSk7CkBAIC01Mzc0LDYgKzU3MzQsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBubDgwMjExX2NoZWNrX3Bvd2VyX21vZGUoY29uc3Qgc3RydWN0IG5sYXR0ciAqbmxhLAorCQkJCSAgICBlbnVtIG5sODAyMTFfbWVzaF9wb3dlcl9tb2RlIG1pbiwKKwkJCQkgICAgZW51bSBubDgwMjExX21lc2hfcG93ZXJfbW9kZSBtYXgsCisJCQkJICAgIGVudW0gbmw4MDIxMV9tZXNoX3Bvd2VyX21vZGUgKm91dCkKK3sKKwl1MzIgdmFsID0gbmxhX2dldF91MzIobmxhKTsKKwlpZiAodmFsIDwgbWluIHx8IHZhbCA+IG1heCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJKm91dCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBubDgwMjExX3BhcnNlX21lc2hfY29uZmlnKHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCiAJCQkJICAgICBzdHJ1Y3QgbWVzaF9jb25maWcgKmNmZywKIAkJCQkgICAgIHUzMiAqbWFza19vdXQpCkBAIC01NTE4LDcgKzU4OTAsNyBAQAogCQkJCSAgTkw4MDIxMV9NRVNIX1BPV0VSX0FDVElWRSwKIAkJCQkgIE5MODAyMTFfTUVTSF9QT1dFUl9NQVgsCiAJCQkJICBtYXNrLCBOTDgwMjExX01FU0hDT05GX1BPV0VSX01PREUsCi0JCQkJICBubDgwMjExX2NoZWNrX3UzMik7CisJCQkJICBubDgwMjExX2NoZWNrX3Bvd2VyX21vZGUpOwogCUZJTExfSU5fTUVTSF9QQVJBTV9JRl9TRVQodGIsIGNmZywgZG90MTFNZXNoQXdha2VXaW5kb3dEdXJhdGlvbiwKIAkJCQkgIDAsIDY1NTM1LCBtYXNrLAogCQkJCSAgTkw4MDIxMV9NRVNIQ09ORl9BV0FLRV9XSU5ET1csIG5sODAyMTFfY2hlY2tfdTE2KTsKQEAgLTYxMDIsNiArNjQ3NCw5IEBACiAKIAl3aXBoeSA9ICZyZGV2LT53aXBoeTsKIAorCWlmICh3ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlpZiAoIXJkZXYtPm9wcy0+c2NhbikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCkBAIC02OTc4LDcgKzczNTMsNyBAQAogCiAJCXBhcmFtcy5uX2NvdW50ZXJfb2Zmc2V0c19wcmVzcCA9IGxlbiAvIHNpemVvZih1MTYpOwogCQlpZiAocmRldi0+d2lwaHkubWF4X251bV9jc2FfY291bnRlcnMgJiYKLQkJICAgIChwYXJhbXMubl9jb3VudGVyX29mZnNldHNfYmVhY29uID4KKwkJICAgIChwYXJhbXMubl9jb3VudGVyX29mZnNldHNfcHJlc3AgPgogCQkgICAgIHJkZXYtPndpcGh5Lm1heF9udW1fY3NhX2NvdW50ZXJzKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCkBAIC03MzY4LDcgKzc3NDMsNyBAQAogCQkgICAgKGtleS5wLmNpcGhlciAhPSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQgfHwKIAkJICAgICBrZXkucC5rZXlfbGVuICE9IFdMQU5fS0VZX0xFTl9XRVAxMDQpKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChrZXkuaWR4ID4gNCkKKwkJaWYgKGtleS5pZHggPiAzKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKIAkJa2V5LnAua2V5X2xlbiA9IDA7CkBAIC03NzczLDEyICs4MTQ4LDEzIEBACiAKIAlpYnNzLmJlYWNvbl9pbnRlcnZhbCA9IDEwMDsKIAotCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQkVBQ09OX0lOVEVSVkFMXSkgeworCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfQkVBQ09OX0lOVEVSVkFMXSkKIAkJaWJzcy5iZWFjb25faW50ZXJ2YWwgPQogCQkJbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0JFQUNPTl9JTlRFUlZBTF0pOwotCQlpZiAoaWJzcy5iZWFjb25faW50ZXJ2YWwgPCAxIHx8IGlic3MuYmVhY29uX2ludGVydmFsID4gMTAwMDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisKKwllcnIgPSBjZmc4MDIxMV92YWxpZGF0ZV9iZWFjb25faW50KHJkZXYsIGlic3MuYmVhY29uX2ludGVydmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKCFyZGV2LT5vcHMtPmpvaW5faWJzcykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtNzk4NSw2ICs4MzYxLDggQEAKIAl9CiAKIAlkYXRhID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBhdHRyKTsKKwlpZiAoIWRhdGEpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJKCh2b2lkICoqKXNrYi0+Y2IpWzBdID0gcmRldjsKIAkoKHZvaWQgKiopc2tiLT5jYilbMV0gPSBoZHI7CkBAIC04NjAyLDIzOCArODk4MCwyMSBAQAogCXJldHVybiByZGV2X2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbChyZGV2LCB3ZGV2LCBjb29raWUpOwogfQogCi1zdGF0aWMgdTMyIHJhdGVzZXRfdG9fbWFzayhzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSAgIHU4ICpyYXRlcywgdTggcmF0ZXNfbGVuKQotewotCXU4IGk7Ci0JdTMyIG1hc2sgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHJhdGVzX2xlbjsgaSsrKSB7Ci0JCWludCByYXRlID0gKHJhdGVzW2ldICYgMHg3ZikgKiA1OwotCQlpbnQgcmlkeDsKLQotCQlmb3IgKHJpZHggPSAwOyByaWR4IDwgc2JhbmQtPm5fYml0cmF0ZXM7IHJpZHgrKykgewotCQkJc3RydWN0IGllZWU4MDIxMV9yYXRlICpzcmF0ZSA9Ci0JCQkJJnNiYW5kLT5iaXRyYXRlc1tyaWR4XTsKLQkJCWlmIChyYXRlID09IHNyYXRlLT5iaXRyYXRlKSB7Ci0JCQkJbWFzayB8PSAxIDw8IHJpZHg7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJpZHggPT0gc2JhbmQtPm5fYml0cmF0ZXMpCi0JCQlyZXR1cm4gMDsgLyogcmF0ZSBub3QgZm91bmQgKi8KLQl9Ci0KLQlyZXR1cm4gbWFzazsKLX0KLQotc3RhdGljIGJvb2wgaHRfcmF0ZXNldF90b19tYXNrKHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAotCQkJICAgICAgIHU4ICpyYXRlcywgdTggcmF0ZXNfbGVuLAotCQkJICAgICAgIHU4IG1jc1tJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOXSkKLXsKLQl1OCBpOwotCi0JbWVtc2V0KG1jcywgMCwgSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmF0ZXNfbGVuOyBpKyspIHsKLQkJaW50IHJpZHgsIHJiaXQ7Ci0KLQkJcmlkeCA9IHJhdGVzW2ldIC8gODsKLQkJcmJpdCA9IEJJVChyYXRlc1tpXSAlIDgpOwotCi0JCS8qIGNoZWNrIHZhbGlkaXR5ICovCi0JCWlmICgocmlkeCA8IDApIHx8IChyaWR4ID49IElFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU4pKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8qIGNoZWNrIGF2YWlsYWJpbGl0eSAqLwotCQlpZiAoc2JhbmQtPmh0X2NhcC5tY3MucnhfbWFza1tyaWR4XSAmIHJiaXQpCi0JCQltY3NbcmlkeF0gfD0gcmJpdDsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdTE2IHZodF9tY3NfbWFwX3RvX21jc19tYXNrKHU4IHZodF9tY3NfbWFwKQotewotCXUxNiBtY3NfbWFzayA9IDA7Ci0KLQlzd2l0Y2ggKHZodF9tY3NfbWFwKSB7Ci0JY2FzZSBJRUVFODAyMTFfVkhUX01DU19OT1RfU1VQUE9SVEVEOgotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9WSFRfTUNTX1NVUFBPUlRfMF83OgotCQltY3NfbWFzayA9IDB4MDBGRjsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfVkhUX01DU19TVVBQT1JUXzBfODoKLQkJbWNzX21hc2sgPSAweDAxRkY7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX1ZIVF9NQ1NfU1VQUE9SVF8wXzk6Ci0JCW1jc19tYXNrID0gMHgwM0ZGOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gbWNzX21hc2s7Ci19Ci0KLXN0YXRpYyB2b2lkIHZodF9idWlsZF9tY3NfbWFzayh1MTYgdmh0X21jc19tYXAsCi0JCQkgICAgICAgdTE2IHZodF9tY3NfbWFza1tOTDgwMjExX1ZIVF9OU1NfTUFYXSkKLXsKLQl1OCBuc3M7Ci0KLQlmb3IgKG5zcyA9IDA7IG5zcyA8IE5MODAyMTFfVkhUX05TU19NQVg7IG5zcysrKSB7Ci0JCXZodF9tY3NfbWFza1tuc3NdID0gdmh0X21jc19tYXBfdG9fbWNzX21hc2sodmh0X21jc19tYXAgJiAweDAzKTsKLQkJdmh0X21jc19tYXAgPj49IDI7Ci0JfQotfQotCi1zdGF0aWMgYm9vbCB2aHRfc2V0X21jc19tYXNrKHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAotCQkJICAgICBzdHJ1Y3Qgbmw4MDIxMV90eHJhdGVfdmh0ICp0eHJhdGUsCi0JCQkgICAgIHUxNiBtY3NbTkw4MDIxMV9WSFRfTlNTX01BWF0pCi17Ci0JdTE2IHR4X21jc19tYXAgPSBsZTE2X3RvX2NwdShzYmFuZC0+dmh0X2NhcC52aHRfbWNzLnR4X21jc19tYXApOwotCXUxNiB0eF9tY3NfbWFza1tOTDgwMjExX1ZIVF9OU1NfTUFYXSA9IHt9OwotCXU4IGk7Ci0KLQlpZiAoIXNiYW5kLT52aHRfY2FwLnZodF9zdXBwb3J0ZWQpCi0JCXJldHVybiBmYWxzZTsKLQotCW1lbXNldChtY3MsIDAsIHNpemVvZih1MTYpICogTkw4MDIxMV9WSFRfTlNTX01BWCk7Ci0KLQkvKiBCdWlsZCB2aHRfbWNzX21hc2sgZnJvbSBWSFQgY2FwYWJpbGl0aWVzICovCi0Jdmh0X2J1aWxkX21jc19tYXNrKHR4X21jc19tYXAsIHR4X21jc19tYXNrKTsKLQotCWZvciAoaSA9IDA7IGkgPCBOTDgwMjExX1ZIVF9OU1NfTUFYOyBpKyspIHsKLQkJaWYgKCh0eF9tY3NfbWFza1tpXSAmIHR4cmF0ZS0+bWNzW2ldKSA9PSB0eHJhdGUtPm1jc1tpXSkKLQkJCW1jc1tpXSA9IHR4cmF0ZS0+bWNzW2ldOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBubDgwMjExX3R4YXR0cl9wb2xpY3lbTkw4MDIxMV9UWFJBVEVfTUFYICsgMV0gPSB7Ci0JW05MODAyMTFfVFhSQVRFX0xFR0FDWV0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKLQkJCQkgICAgLmxlbiA9IE5MODAyMTFfTUFYX1NVUFBfUkFURVMgfSwKLQlbTkw4MDIxMV9UWFJBVEVfSFRdID0geyAudHlwZSA9IE5MQV9CSU5BUlksCi0JCQkJLmxlbiA9IE5MODAyMTFfTUFYX1NVUFBfSFRfUkFURVMgfSwKLQlbTkw4MDIxMV9UWFJBVEVfVkhUXSA9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3Qgbmw4MDIxMV90eHJhdGVfdmh0KX0sCi0JW05MODAyMTFfVFhSQVRFX0dJXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKLX07Ci0KIHN0YXRpYyBpbnQgbmw4MDIxMV9zZXRfdHhfYml0cmF0ZV9tYXNrKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICAgIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7Ci0Jc3RydWN0IG5sYXR0ciAqdGJbTkw4MDIxMV9UWFJBVEVfTUFYICsgMV07Ci0Jc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CiAJc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayBtYXNrOwotCWludCByZW0sIGk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPnVzZXJfcHRyWzFdOwotCXN0cnVjdCBubGF0dHIgKnR4X3JhdGVzOwotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwotCXUxNiB2aHRfdHhfbWNzX21hcDsKKwlpbnQgZXJyOwogCiAJaWYgKCFyZGV2LT5vcHMtPnNldF9iaXRyYXRlX21hc2spCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCW1lbXNldCgmbWFzaywgMCwgc2l6ZW9mKG1hc2spKTsKLQkvKiBEZWZhdWx0IHRvIGFsbCByYXRlcyBlbmFibGVkICovCi0JZm9yIChpID0gMDsgaSA8IE5VTV9OTDgwMjExX0JBTkRTOyBpKyspIHsKLQkJc2JhbmQgPSByZGV2LT53aXBoeS5iYW5kc1tpXTsKKwllcnIgPSBubDgwMjExX3BhcnNlX3R4X2JpdHJhdGVfbWFzayhpbmZvLCAmbWFzayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCQlpZiAoIXNiYW5kKQotCQkJY29udGludWU7Ci0KLQkJbWFzay5jb250cm9sW2ldLmxlZ2FjeSA9ICgxIDw8IHNiYW5kLT5uX2JpdHJhdGVzKSAtIDE7Ci0JCW1lbWNweShtYXNrLmNvbnRyb2xbaV0uaHRfbWNzLAotCQkgICAgICAgc2JhbmQtPmh0X2NhcC5tY3MucnhfbWFzaywKLQkJICAgICAgIHNpemVvZihtYXNrLmNvbnRyb2xbaV0uaHRfbWNzKSk7Ci0KLQkJaWYgKCFzYmFuZC0+dmh0X2NhcC52aHRfc3VwcG9ydGVkKQotCQkJY29udGludWU7Ci0KLQkJdmh0X3R4X21jc19tYXAgPSBsZTE2X3RvX2NwdShzYmFuZC0+dmh0X2NhcC52aHRfbWNzLnR4X21jc19tYXApOwotCQl2aHRfYnVpbGRfbWNzX21hc2sodmh0X3R4X21jc19tYXAsIG1hc2suY29udHJvbFtpXS52aHRfbWNzKTsKLQl9Ci0KLQkvKiBpZiBubyByYXRlcyBhcmUgZ2l2ZW4gc2V0IGl0IGJhY2sgdG8gdGhlIGRlZmF1bHRzICovCi0JaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfVFhfUkFURVNdKQotCQlnb3RvIG91dDsKLQotCS8qCi0JICogVGhlIG5lc3RlZCBhdHRyaWJ1dGUgdXNlcyBlbnVtIG5sODAyMTFfYmFuZCBhcyB0aGUgaW5kZXguIFRoaXMgbWFwcwotCSAqIGRpcmVjdGx5IHRvIHRoZSBlbnVtIG5sODAyMTFfYmFuZCB2YWx1ZXMgdXNlZCBpbiBjZmc4MDIxMS4KLQkgKi8KLQlCVUlMRF9CVUdfT04oTkw4MDIxMV9NQVhfU1VQUF9IVF9SQVRFUyA+IElFRUU4MDIxMV9IVF9NQ1NfTUFTS19MRU4gKiA4KTsKLQlubGFfZm9yX2VhY2hfbmVzdGVkKHR4X3JhdGVzLCBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfVFhfUkFURVNdLCByZW0pIHsKLQkJZW51bSBubDgwMjExX2JhbmQgYmFuZCA9IG5sYV90eXBlKHR4X3JhdGVzKTsKLQkJaW50IGVycjsKLQotCQlpZiAoYmFuZCA8IDAgfHwgYmFuZCA+PSBOVU1fTkw4MDIxMV9CQU5EUykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzYmFuZCA9IHJkZXYtPndpcGh5LmJhbmRzW2JhbmRdOwotCQlpZiAoc2JhbmQgPT0gTlVMTCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQllcnIgPSBubGFfcGFyc2UodGIsIE5MODAyMTFfVFhSQVRFX01BWCwgbmxhX2RhdGEodHhfcmF0ZXMpLAotCQkJCW5sYV9sZW4odHhfcmF0ZXMpLCBubDgwMjExX3R4YXR0cl9wb2xpY3kpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQkJaWYgKHRiW05MODAyMTFfVFhSQVRFX0xFR0FDWV0pIHsKLQkJCW1hc2suY29udHJvbFtiYW5kXS5sZWdhY3kgPSByYXRlc2V0X3RvX21hc2soCi0JCQkJc2JhbmQsCi0JCQkJbmxhX2RhdGEodGJbTkw4MDIxMV9UWFJBVEVfTEVHQUNZXSksCi0JCQkJbmxhX2xlbih0YltOTDgwMjExX1RYUkFURV9MRUdBQ1ldKSk7Ci0JCQlpZiAoKG1hc2suY29udHJvbFtiYW5kXS5sZWdhY3kgPT0gMCkgJiYKLQkJCSAgICBubGFfbGVuKHRiW05MODAyMTFfVFhSQVRFX0xFR0FDWV0pKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWlmICh0YltOTDgwMjExX1RYUkFURV9IVF0pIHsKLQkJCWlmICghaHRfcmF0ZXNldF90b19tYXNrKAotCQkJCQlzYmFuZCwKLQkJCQkJbmxhX2RhdGEodGJbTkw4MDIxMV9UWFJBVEVfSFRdKSwKLQkJCQkJbmxhX2xlbih0YltOTDgwMjExX1RYUkFURV9IVF0pLAotCQkJCQltYXNrLmNvbnRyb2xbYmFuZF0uaHRfbWNzKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAodGJbTkw4MDIxMV9UWFJBVEVfVkhUXSkgewotCQkJaWYgKCF2aHRfc2V0X21jc19tYXNrKAotCQkJCQlzYmFuZCwKLQkJCQkJbmxhX2RhdGEodGJbTkw4MDIxMV9UWFJBVEVfVkhUXSksCi0JCQkJCW1hc2suY29udHJvbFtiYW5kXS52aHRfbWNzKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAodGJbTkw4MDIxMV9UWFJBVEVfR0ldKSB7Ci0JCQltYXNrLmNvbnRyb2xbYmFuZF0uZ2kgPQotCQkJCW5sYV9nZXRfdTgodGJbTkw4MDIxMV9UWFJBVEVfR0ldKTsKLQkJCWlmIChtYXNrLmNvbnRyb2xbYmFuZF0uZ2kgPiBOTDgwMjExX1RYUkFURV9GT1JDRV9MR0kpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAobWFzay5jb250cm9sW2JhbmRdLmxlZ2FjeSA9PSAwKSB7Ci0JCQkvKiBkb24ndCBhbGxvdyBlbXB0eSBsZWdhY3kgcmF0ZXMgaWYgSFQgb3IgVkhUCi0JCQkgKiBhcmUgbm90IGV2ZW4gc3VwcG9ydGVkLgotCQkJICovCi0JCQlpZiAoIShyZGV2LT53aXBoeS5iYW5kc1tiYW5kXS0+aHRfY2FwLmh0X3N1cHBvcnRlZCB8fAotCQkJICAgICAgcmRldi0+d2lwaHkuYmFuZHNbYmFuZF0tPnZodF9jYXAudmh0X3N1cHBvcnRlZCkpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfSFRfTUNTX01BU0tfTEVOOyBpKyspCi0JCQkJaWYgKG1hc2suY29udHJvbFtiYW5kXS5odF9tY3NbaV0pCi0JCQkJCWdvdG8gb3V0OwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgTkw4MDIxMV9WSFRfTlNTX01BWDsgaSsrKQotCQkJCWlmIChtYXNrLmNvbnRyb2xbYmFuZF0udmh0X21jc1tpXSkKLQkJCQkJZ290byBvdXQ7Ci0KLQkJCS8qIGxlZ2FjeSBhbmQgbWNzIHJhdGVzIG1heSBub3QgYmUgYm90aCBlbXB0eSAqLwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0KLW91dDoKIAlyZXR1cm4gcmRldl9zZXRfYml0cmF0ZV9tYXNrKHJkZXYsIGRldiwgTlVMTCwgJm1hc2spOwogfQogCkBAIC04ODU5LDYgKzkwMjAsNyBAQAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRToKIAkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9OQU46CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KQEAgLTg5MDQsNiArOTA2Niw3IEBACiAJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgogCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX05BTjoKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQpAQCAtOTAyMCw2ICs5MTgzLDcgQEAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CiAJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CkBAIC05MjUyLDkgKzk0MTYsMTAgQEAKIAlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0JFQUNPTl9JTlRFUlZBTF0pIHsKIAkJc2V0dXAuYmVhY29uX2ludGVydmFsID0KIAkJCW5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9CRUFDT05fSU5URVJWQUxdKTsKLQkJaWYgKHNldHVwLmJlYWNvbl9pbnRlcnZhbCA8IDEwIHx8Ci0JCSAgICBzZXR1cC5iZWFjb25faW50ZXJ2YWwgPiAxMDAwMCkKLQkJCXJldHVybiAtRUlOVkFMOworCisJCWVyciA9IGNmZzgwMjExX3ZhbGlkYXRlX2JlYWNvbl9pbnQocmRldiwgc2V0dXAuYmVhY29uX2ludGVydmFsKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9EVElNX1BFUklPRF0pIHsKQEAgLTkzMDAsNiArOTQ2NSwxNyBAQAogCQkJcmV0dXJuIGVycjsKIAl9CiAKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1RYX1JBVEVTXSkgeworCQllcnIgPSBubDgwMjExX3BhcnNlX3R4X2JpdHJhdGVfbWFzayhpbmZvLCAmc2V0dXAuYmVhY29uX3JhdGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSB2YWxpZGF0ZV9iZWFjb25fdHhfcmF0ZShyZGV2LCBzZXR1cC5jaGFuZGVmLmNoYW4tPmJhbmQsCisJCQkJCSAgICAgICZzZXR1cC5iZWFjb25fcmF0ZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwogCXJldHVybiBjZmc4MDIxMV9qb2luX21lc2gocmRldiwgZGV2LCAmc2V0dXAsICZjZmcpOwogfQogCkBAIC05NDEzLDE4ICs5NTg5LDI3IEBACiAJaWYgKCFmcmVxcykKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JZm9yIChpID0gMDsgaSA8IHJlcS0+bl9jaGFubmVsczsgaSsrKQotCQlubGFfcHV0X3UzMihtc2csIGksIHJlcS0+Y2hhbm5lbHNbaV0tPmNlbnRlcl9mcmVxKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVxLT5uX2NoYW5uZWxzOyBpKyspIHsKKwkJaWYgKG5sYV9wdXRfdTMyKG1zZywgaSwgcmVxLT5jaGFubmVsc1tpXS0+Y2VudGVyX2ZyZXEpKQorCQkJcmV0dXJuIC1FTk9CVUZTOworCX0KIAogCW5sYV9uZXN0X2VuZChtc2csIGZyZXFzKTsKIAogCWlmIChyZXEtPm5fbWF0Y2hfc2V0cykgewogCQltYXRjaGVzID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX0FUVFJfU0NIRURfU0NBTl9NQVRDSCk7CisJCWlmICghbWF0Y2hlcykKKwkJCXJldHVybiAtRU5PQlVGUzsKKwogCQlmb3IgKGkgPSAwOyBpIDwgcmVxLT5uX21hdGNoX3NldHM7IGkrKykgewogCQkJbWF0Y2ggPSBubGFfbmVzdF9zdGFydChtc2csIGkpOwotCQkJbmxhX3B1dChtc2csIE5MODAyMTFfU0NIRURfU0NBTl9NQVRDSF9BVFRSX1NTSUQsCi0JCQkJcmVxLT5tYXRjaF9zZXRzW2ldLnNzaWQuc3NpZF9sZW4sCi0JCQkJcmVxLT5tYXRjaF9zZXRzW2ldLnNzaWQuc3NpZCk7CisJCQlpZiAoIW1hdGNoKQorCQkJCXJldHVybiAtRU5PQlVGUzsKKworCQkJaWYgKG5sYV9wdXQobXNnLCBOTDgwMjExX1NDSEVEX1NDQU5fTUFUQ0hfQVRUUl9TU0lELAorCQkJCSAgICByZXEtPm1hdGNoX3NldHNbaV0uc3NpZC5zc2lkX2xlbiwKKwkJCQkgICAgcmVxLT5tYXRjaF9zZXRzW2ldLnNzaWQuc3NpZCkpCisJCQkJcmV0dXJuIC1FTk9CVUZTOwogCQkJbmxhX25lc3RfZW5kKG1zZywgbWF0Y2gpOwogCQl9CiAJCW5sYV9uZXN0X2VuZChtc2csIG1hdGNoZXMpOwpAQCAtOTQzNiw2ICs5NjIxLDkgQEAKIAogCWZvciAoaSA9IDA7IGkgPCByZXEtPm5fc2Nhbl9wbGFuczsgaSsrKSB7CiAJCXNjYW5fcGxhbiA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgaSArIDEpOworCQlpZiAoIXNjYW5fcGxhbikKKwkJCXJldHVybiAtRU5PQlVGUzsKKwogCQlpZiAoIXNjYW5fcGxhbiB8fAogCQkgICAgbmxhX3B1dF91MzIobXNnLCBOTDgwMjExX1NDSEVEX1NDQU5fUExBTl9JTlRFUlZBTCwKIAkJCQlyZXEtPnNjYW5fcGxhbnNbaV0uaW50ZXJ2YWwpIHx8CkBAIC0xMDM2Miw2ICsxMDU1MCw1NDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBubDgwMjExX3N0YXJ0X25hbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tPnVzZXJfcHRyWzBdOworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBpbmZvLT51c2VyX3B0clsxXTsKKwlzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgY29uZiA9IHt9OworCWludCBlcnI7CisKKwlpZiAod2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX05BTikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHdkZXYtPm5hbl9zdGFydGVkKQorCQlyZXR1cm4gLUVFWElTVDsKKworCWlmIChyZmtpbGxfYmxvY2tlZChyZGV2LT5yZmtpbGwpKQorCQlyZXR1cm4gLUVSRktJTEw7CisKKwlpZiAoIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9OQU5fTUFTVEVSX1BSRUZdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05BTl9EVUFMXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb25mLm1hc3Rlcl9wcmVmID0KKwkJbmxhX2dldF91OChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX01BU1RFUl9QUkVGXSk7CisJaWYgKCFjb25mLm1hc3Rlcl9wcmVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvbmYuZHVhbCA9IG5sYV9nZXRfdTgoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05BTl9EVUFMXSk7CisKKwllcnIgPSByZGV2X3N0YXJ0X25hbihyZGV2LCB3ZGV2LCAmY29uZik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXdkZXYtPm5hbl9zdGFydGVkID0gdHJ1ZTsKKwlyZGV2LT5vcGVuY291bnQrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5sODAyMTFfc3RvcF9uYW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby0+dXNlcl9wdHJbMV07CisKKwlpZiAod2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX05BTikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJY2ZnODAyMTFfc3RvcF9uYW4ocmRldiwgd2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV9uYW5fZmlsdGVyKHN0cnVjdCBubGF0dHIgKmZpbHRlcl9hdHRyKQoreworCXN0cnVjdCBubGF0dHIgKmF0dHI7CisJaW50IGxlbiA9IDAsIG5fZW50cmllcyA9IDAsIHJlbTsKKworCW5sYV9mb3JfZWFjaF9uZXN0ZWQoYXR0ciwgZmlsdGVyX2F0dHIsIHJlbSkgeworCQlsZW4gKz0gbmxhX2xlbihhdHRyKTsKKwkJbl9lbnRyaWVzKys7CisJfQorCisJaWYgKGxlbiA+PSBVOF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG5fZW50cmllczsKK30KKworc3RhdGljIGludCBoYW5kbGVfbmFuX2ZpbHRlcihzdHJ1Y3QgbmxhdHRyICphdHRyX2ZpbHRlciwKKwkJCSAgICAgc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jLAorCQkJICAgICBib29sIHR4KQoreworCXN0cnVjdCBubGF0dHIgKmF0dHI7CisJaW50IG5fZW50cmllcywgcmVtLCBpOworCXN0cnVjdCBjZmc4MDIxMV9uYW5fZnVuY19maWx0ZXIgKmZpbHRlcjsKKworCW5fZW50cmllcyA9IHZhbGlkYXRlX25hbl9maWx0ZXIoYXR0cl9maWx0ZXIpOworCWlmIChuX2VudHJpZXMgPCAwKQorCQlyZXR1cm4gbl9lbnRyaWVzOworCisJQlVJTERfQlVHX09OKHNpemVvZigqZnVuYy0+cnhfZmlsdGVycykgIT0gc2l6ZW9mKCpmdW5jLT50eF9maWx0ZXJzKSk7CisKKwlmaWx0ZXIgPSBrY2FsbG9jKG5fZW50cmllcywgc2l6ZW9mKCpmdW5jLT5yeF9maWx0ZXJzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaWx0ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJaSA9IDA7CisJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCBhdHRyX2ZpbHRlciwgcmVtKSB7CisJCWZpbHRlcltpXS5maWx0ZXIgPSBrbWVtZHVwKG5sYV9kYXRhKGF0dHIpLCBubGFfbGVuKGF0dHIpLAorCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJZmlsdGVyW2ldLmxlbiA9IG5sYV9sZW4oYXR0cik7CisJCWkrKzsKKwl9CisJaWYgKHR4KSB7CisJCWZ1bmMtPm51bV90eF9maWx0ZXJzID0gbl9lbnRyaWVzOworCQlmdW5jLT50eF9maWx0ZXJzID0gZmlsdGVyOworCX0gZWxzZSB7CisJCWZ1bmMtPm51bV9yeF9maWx0ZXJzID0gbl9lbnRyaWVzOworCQlmdW5jLT5yeF9maWx0ZXJzID0gZmlsdGVyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5sODAyMTFfbmFuX2FkZF9mdW5jKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gaW5mby0+dXNlcl9wdHJbMV07CisJc3RydWN0IG5sYXR0ciAqdGJbTlVNX05MODAyMTFfTkFOX0ZVTkNfQVRUUl0sICpmdW5jX2F0dHI7CisJc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmdW5jOworCXN0cnVjdCBza19idWZmICptc2cgPSBOVUxMOworCXZvaWQgKmhkciA9IE5VTEw7CisJaW50IGVyciA9IDA7CisKKwlpZiAod2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX05BTikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKCF3ZGV2LT5uYW5fc3RhcnRlZCkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCWlmICghaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05BTl9GVU5DXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod2Rldi0+b3duZXJfbmxwb3J0aWQgJiYKKwkgICAgd2Rldi0+b3duZXJfbmxwb3J0aWQgIT0gaW5mby0+c25kX3BvcnRpZCkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCWVyciA9IG5sYV9wYXJzZSh0YiwgTkw4MDIxMV9OQU5fRlVOQ19BVFRSX01BWCwKKwkJCW5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9OQU5fRlVOQ10pLAorCQkJbmxhX2xlbihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX0ZVTkNdKSwKKwkJCW5sODAyMTFfbmFuX2Z1bmNfcG9saWN5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZnVuYyA9IGt6YWxsb2Moc2l6ZW9mKCpmdW5jKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmdW5jKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZ1bmMtPmNvb2tpZSA9IHdkZXYtPndpcGh5LT5jb29raWVfY291bnRlcisrOworCisJaWYgKCF0YltOTDgwMjExX05BTl9GVU5DX1RZUEVdIHx8CisJICAgIG5sYV9nZXRfdTgodGJbTkw4MDIxMV9OQU5fRlVOQ19UWVBFXSkgPiBOTDgwMjExX05BTl9GVU5DX01BWF9UWVBFKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCisJZnVuYy0+dHlwZSA9IG5sYV9nZXRfdTgodGJbTkw4MDIxMV9OQU5fRlVOQ19UWVBFXSk7CisKKwlpZiAoIXRiW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JRF0pIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtY3B5KGZ1bmMtPnNlcnZpY2VfaWQsIG5sYV9kYXRhKHRiW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JRF0pLAorCSAgICAgICBzaXplb2YoZnVuYy0+c2VydmljZV9pZCkpOworCisJZnVuYy0+Y2xvc2VfcmFuZ2UgPQorCQlubGFfZ2V0X2ZsYWcodGJbTkw4MDIxMV9OQU5fRlVOQ19DTE9TRV9SQU5HRV0pOworCisJaWYgKHRiW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JTkZPXSkgeworCQlmdW5jLT5zZXJ2X3NwZWNfaW5mb19sZW4gPQorCQkJbmxhX2xlbih0YltOTDgwMjExX05BTl9GVU5DX1NFUlZJQ0VfSU5GT10pOworCQlmdW5jLT5zZXJ2X3NwZWNfaW5mbyA9CisJCQlrbWVtZHVwKG5sYV9kYXRhKHRiW05MODAyMTFfTkFOX0ZVTkNfU0VSVklDRV9JTkZPXSksCisJCQkJZnVuYy0+c2Vydl9zcGVjX2luZm9fbGVuLAorCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIWZ1bmMtPnNlcnZfc3BlY19pbmZvKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAodGJbTkw4MDIxMV9OQU5fRlVOQ19UVExdKQorCQlmdW5jLT50dGwgPSBubGFfZ2V0X3UzMih0YltOTDgwMjExX05BTl9GVU5DX1RUTF0pOworCisJc3dpdGNoIChmdW5jLT50eXBlKSB7CisJY2FzZSBOTDgwMjExX05BTl9GVU5DX1BVQkxJU0g6CisJCWlmICghdGJbTkw4MDIxMV9OQU5fRlVOQ19QVUJMSVNIX1RZUEVdKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmdW5jLT5wdWJsaXNoX3R5cGUgPQorCQkJbmxhX2dldF91OCh0YltOTDgwMjExX05BTl9GVU5DX1BVQkxJU0hfVFlQRV0pOworCQlmdW5jLT5wdWJsaXNoX2JjYXN0ID0KKwkJCW5sYV9nZXRfZmxhZyh0YltOTDgwMjExX05BTl9GVU5DX1BVQkxJU0hfQkNBU1RdKTsKKworCQlpZiAoKCEoZnVuYy0+cHVibGlzaF90eXBlICYgTkw4MDIxMV9OQU5fU09MSUNJVEVEX1BVQkxJU0gpKSAmJgorCQkJZnVuYy0+cHVibGlzaF9iY2FzdCkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9OQU5fRlVOQ19TVUJTQ1JJQkU6CisJCWZ1bmMtPnN1YnNjcmliZV9hY3RpdmUgPQorCQkJbmxhX2dldF9mbGFnKHRiW05MODAyMTFfTkFOX0ZVTkNfU1VCU0NSSUJFX0FDVElWRV0pOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQOgorCQlpZiAoIXRiW05MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQX0lEXSB8fAorCQkgICAgIXRiW05MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQX1JFUV9JRF0pIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWZ1bmMtPmZvbGxvd3VwX2lkID0KKwkJCW5sYV9nZXRfdTgodGJbTkw4MDIxMV9OQU5fRlVOQ19GT0xMT1dfVVBfSURdKTsKKwkJZnVuYy0+Zm9sbG93dXBfcmVxaWQgPQorCQkJbmxhX2dldF91OCh0YltOTDgwMjExX05BTl9GVU5DX0ZPTExPV19VUF9SRVFfSURdKTsKKwkJbWVtY3B5KGZ1bmMtPmZvbGxvd3VwX2Rlc3QuYWRkciwKKwkJICAgICAgIG5sYV9kYXRhKHRiW05MODAyMTFfTkFOX0ZVTkNfRk9MTE9XX1VQX0RFU1RdKSwKKwkJICAgICAgIHNpemVvZihmdW5jLT5mb2xsb3d1cF9kZXN0LmFkZHIpKTsKKwkJaWYgKGZ1bmMtPnR0bCkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh0YltOTDgwMjExX05BTl9GVU5DX1NSRl0pIHsKKwkJc3RydWN0IG5sYXR0ciAqc3JmX3RiW05VTV9OTDgwMjExX05BTl9TUkZfQVRUUl07CisKKwkJZXJyID0gbmxhX3BhcnNlKHNyZl90YiwgTkw4MDIxMV9OQU5fU1JGX0FUVFJfTUFYLAorCQkJCW5sYV9kYXRhKHRiW05MODAyMTFfTkFOX0ZVTkNfU1JGXSksCisJCQkJbmxhX2xlbih0YltOTDgwMjExX05BTl9GVU5DX1NSRl0pLCBOVUxMKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCWZ1bmMtPnNyZl9pbmNsdWRlID0KKwkJCW5sYV9nZXRfZmxhZyhzcmZfdGJbTkw4MDIxMV9OQU5fU1JGX0lOQ0xVREVdKTsKKworCQlpZiAoc3JmX3RiW05MODAyMTFfTkFOX1NSRl9CRl0pIHsKKwkJCWlmIChzcmZfdGJbTkw4MDIxMV9OQU5fU1JGX01BQ19BRERSU10gfHwKKwkJCSAgICAhc3JmX3RiW05MODAyMTFfTkFOX1NSRl9CRl9JRFhdKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJZnVuYy0+c3JmX2JmX2xlbiA9CisJCQkJbmxhX2xlbihzcmZfdGJbTkw4MDIxMV9OQU5fU1JGX0JGXSk7CisJCQlmdW5jLT5zcmZfYmYgPQorCQkJCWttZW1kdXAobmxhX2RhdGEoc3JmX3RiW05MODAyMTFfTkFOX1NSRl9CRl0pLAorCQkJCQlmdW5jLT5zcmZfYmZfbGVuLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghZnVuYy0+c3JmX2JmKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJZnVuYy0+c3JmX2JmX2lkeCA9CisJCQkJbmxhX2dldF91OChzcmZfdGJbTkw4MDIxMV9OQU5fU1JGX0JGX0lEWF0pOworCQl9IGVsc2UgeworCQkJc3RydWN0IG5sYXR0ciAqYXR0ciwgKm1hY19hdHRyID0KKwkJCQlzcmZfdGJbTkw4MDIxMV9OQU5fU1JGX01BQ19BRERSU107CisJCQlpbnQgbl9lbnRyaWVzLCByZW0sIGkgPSAwOworCisJCQlpZiAoIW1hY19hdHRyKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJbl9lbnRyaWVzID0gdmFsaWRhdGVfYWNsX21hY19hZGRycyhtYWNfYXR0cik7CisJCQlpZiAobl9lbnRyaWVzIDw9IDApIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlmdW5jLT5zcmZfbnVtX21hY3MgPSBuX2VudHJpZXM7CisJCQlmdW5jLT5zcmZfbWFjcyA9CisJCQkJa3phbGxvYyhzaXplb2YoKmZ1bmMtPnNyZl9tYWNzKSAqIG5fZW50cmllcywKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWZ1bmMtPnNyZl9tYWNzKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCBtYWNfYXR0ciwgcmVtKQorCQkJCW1lbWNweShmdW5jLT5zcmZfbWFjc1tpKytdLmFkZHIsIG5sYV9kYXRhKGF0dHIpLAorCQkJCSAgICAgICBzaXplb2YoKmZ1bmMtPnNyZl9tYWNzKSk7CisJCX0KKwl9CisKKwlpZiAodGJbTkw4MDIxMV9OQU5fRlVOQ19UWF9NQVRDSF9GSUxURVJdKSB7CisJCWVyciA9IGhhbmRsZV9uYW5fZmlsdGVyKHRiW05MODAyMTFfTkFOX0ZVTkNfVFhfTUFUQ0hfRklMVEVSXSwKKwkJCQkJZnVuYywgdHJ1ZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodGJbTkw4MDIxMV9OQU5fRlVOQ19SWF9NQVRDSF9GSUxURVJdKSB7CisJCWVyciA9IGhhbmRsZV9uYW5fZmlsdGVyKHRiW05MODAyMTFfTkFOX0ZVTkNfUlhfTUFUQ0hfRklMVEVSXSwKKwkJCQkJZnVuYywgZmFsc2UpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCisJbXNnID0gbmxtc2dfbmV3KE5MTVNHX0RFRkFVTFRfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc2cpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJaGRyID0gbmw4MDIxMWhkcl9wdXQobXNnLCBpbmZvLT5zbmRfcG9ydGlkLCBpbmZvLT5zbmRfc2VxLCAwLAorCQkJICAgICBOTDgwMjExX0NNRF9BRERfTkFOX0ZVTkNUSU9OKTsKKwkvKiBUaGlzIGNhbid0IHJlYWxseSBoYXBwZW4gLSB3ZSBqdXN0IGFsbG9jYXRlZCA0S0IgKi8KKwlpZiAoV0FSTl9PTighaGRyKSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSByZGV2X2FkZF9uYW5fZnVuYyhyZGV2LCB3ZGV2LCBmdW5jKTsKK291dDoKKwlpZiAoZXJyIDwgMCkgeworCQljZmc4MDIxMV9mcmVlX25hbl9mdW5jKGZ1bmMpOworCQlubG1zZ19mcmVlKG1zZyk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogcHJvcGFnYXRlIHRoZSBpbnN0YW5jZSBpZCBhbmQgY29va2llIHRvIHVzZXJzcGFjZSAgKi8KKwlpZiAobmxhX3B1dF91NjRfNjRiaXQobXNnLCBOTDgwMjExX0FUVFJfQ09PS0lFLCBmdW5jLT5jb29raWUsCisJCQkgICAgICBOTDgwMjExX0FUVFJfUEFEKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlmdW5jX2F0dHIgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfQVRUUl9OQU5fRlVOQyk7CisJaWYgKCFmdW5jX2F0dHIpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKG5sYV9wdXRfdTgobXNnLCBOTDgwMjExX05BTl9GVU5DX0lOU1RBTkNFX0lELAorCQkgICAgICAgZnVuYy0+aW5zdGFuY2VfaWQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCW5sYV9uZXN0X2VuZChtc2csIGZ1bmNfYXR0cik7CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisJcmV0dXJuIGdlbmxtc2dfcmVwbHkobXNnLCBpbmZvKTsKKworbmxhX3B1dF9mYWlsdXJlOgorCW5sbXNnX2ZyZWUobXNnKTsKKwlyZXR1cm4gLUVOT0JVRlM7Cit9CisKK3N0YXRpYyBpbnQgbmw4MDIxMV9uYW5fZGVsX2Z1bmMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tPnVzZXJfcHRyWzBdOworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBpbmZvLT51c2VyX3B0clsxXTsKKwl1NjQgY29va2llOworCisJaWYgKHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghd2Rldi0+bmFuX3N0YXJ0ZWQpCisJCXJldHVybiAtRU5PVENPTk47CisKKwlpZiAoIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9DT09LSUVdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh3ZGV2LT5vd25lcl9ubHBvcnRpZCAmJgorCSAgICB3ZGV2LT5vd25lcl9ubHBvcnRpZCAhPSBpbmZvLT5zbmRfcG9ydGlkKQorCQlyZXR1cm4gLUVOT1RDT05OOworCisJY29va2llID0gbmxhX2dldF91NjQoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0NPT0tJRV0pOworCisJcmRldl9kZWxfbmFuX2Z1bmMocmRldiwgd2RldiwgY29va2llKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5sODAyMTFfbmFuX2NoYW5nZV9jb25maWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGluZm8tPnVzZXJfcHRyWzFdOworCXN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiBjb25mID0ge307CisJdTMyIGNoYW5nZWQgPSAwOworCisJaWYgKHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9OQU4pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghd2Rldi0+bmFuX3N0YXJ0ZWQpCisJCXJldHVybiAtRU5PVENPTk47CisKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05BTl9NQVNURVJfUFJFRl0pIHsKKwkJY29uZi5tYXN0ZXJfcHJlZiA9CisJCQlubGFfZ2V0X3U4KGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9OQU5fTUFTVEVSX1BSRUZdKTsKKwkJaWYgKGNvbmYubWFzdGVyX3ByZWYgPD0gMSB8fCBjb25mLm1hc3Rlcl9wcmVmID09IDI1NSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNoYW5nZWQgfD0gQ0ZHODAyMTFfTkFOX0NPTkZfQ0hBTkdFRF9QUkVGOworCX0KKworCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTkFOX0RVQUxdKSB7CisJCWNvbmYuZHVhbCA9IG5sYV9nZXRfdTgoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05BTl9EVUFMXSk7CisJCWNoYW5nZWQgfD0gQ0ZHODAyMTFfTkFOX0NPTkZfQ0hBTkdFRF9EVUFMOworCX0KKworCWlmICghY2hhbmdlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gcmRldl9uYW5fY2hhbmdlX2NvbmYocmRldiwgd2RldiwgJmNvbmYsIGNoYW5nZWQpOworfQorCit2b2lkIGNmZzgwMjExX25hbl9tYXRjaChzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJc3RydWN0IGNmZzgwMjExX25hbl9tYXRjaF9wYXJhbXMgKm1hdGNoLCBnZnBfdCBnZnApCit7CisJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdkZXYtPndpcGh5OworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX3JkZXYod2lwaHkpOworCXN0cnVjdCBubGF0dHIgKm1hdGNoX2F0dHIsICpsb2NhbF9mdW5jX2F0dHIsICpwZWVyX2Z1bmNfYXR0cjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXZvaWQgKmhkcjsKKworCWlmIChXQVJOX09OKCFtYXRjaC0+aW5zdF9pZCB8fCAhbWF0Y2gtPnBlZXJfaW5zdF9pZCB8fCAhbWF0Y2gtPmFkZHIpKQorCQlyZXR1cm47CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBnZnApOworCWlmICghbXNnKQorCQlyZXR1cm47CisKKwloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIDAsIDAsIDAsIE5MODAyMTFfQ01EX05BTl9NQVRDSCk7CisJaWYgKCFoZHIpIHsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm47CisJfQorCisJaWYgKG5sYV9wdXRfdTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZLCByZGV2LT53aXBoeV9pZHgpIHx8CisJICAgICh3ZGV2LT5uZXRkZXYgJiYgbmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwKKwkJCQkJIHdkZXYtPm5ldGRldi0+aWZpbmRleCkpIHx8CisJICAgIG5sYV9wdXRfdTY0XzY0Yml0KG1zZywgTkw4MDIxMV9BVFRSX1dERVYsIHdkZXZfaWQod2RldiksCisJCQkgICAgICBOTDgwMjExX0FUVFJfUEFEKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlpZiAobmxhX3B1dF91NjRfNjRiaXQobXNnLCBOTDgwMjExX0FUVFJfQ09PS0lFLCBtYXRjaC0+Y29va2llLAorCQkJICAgICAgTkw4MDIxMV9BVFRSX1BBRCkgfHwKKwkgICAgbmxhX3B1dChtc2csIE5MODAyMTFfQVRUUl9NQUMsIEVUSF9BTEVOLCBtYXRjaC0+YWRkcikpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJbWF0Y2hfYXR0ciA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9BVFRSX05BTl9NQVRDSCk7CisJaWYgKCFtYXRjaF9hdHRyKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWxvY2FsX2Z1bmNfYXR0ciA9IG5sYV9uZXN0X3N0YXJ0KG1zZywgTkw4MDIxMV9OQU5fTUFUQ0hfRlVOQ19MT0NBTCk7CisJaWYgKCFsb2NhbF9mdW5jX2F0dHIpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKG5sYV9wdXRfdTgobXNnLCBOTDgwMjExX05BTl9GVU5DX0lOU1RBTkNFX0lELCBtYXRjaC0+aW5zdF9pZCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJbmxhX25lc3RfZW5kKG1zZywgbG9jYWxfZnVuY19hdHRyKTsKKworCXBlZXJfZnVuY19hdHRyID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX05BTl9NQVRDSF9GVU5DX1BFRVIpOworCWlmICghcGVlcl9mdW5jX2F0dHIpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKG5sYV9wdXRfdTgobXNnLCBOTDgwMjExX05BTl9GVU5DX1RZUEUsIG1hdGNoLT50eXBlKSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgTkw4MDIxMV9OQU5fRlVOQ19JTlNUQU5DRV9JRCwgbWF0Y2gtPnBlZXJfaW5zdF9pZCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKG1hdGNoLT5pbmZvICYmIG1hdGNoLT5pbmZvX2xlbiAmJgorCSAgICBubGFfcHV0KG1zZywgTkw4MDIxMV9OQU5fRlVOQ19TRVJWSUNFX0lORk8sIG1hdGNoLT5pbmZvX2xlbiwKKwkJICAgIG1hdGNoLT5pbmZvKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlubGFfbmVzdF9lbmQobXNnLCBwZWVyX2Z1bmNfYXR0cik7CisJbmxhX25lc3RfZW5kKG1zZywgbWF0Y2hfYXR0cik7CisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCisJaWYgKCF3ZGV2LT5vd25lcl9ubHBvcnRpZCkKKwkJZ2VubG1zZ19tdWx0aWNhc3RfbmV0bnMoJm5sODAyMTFfZmFtLCB3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwKKwkJCQkJbXNnLCAwLCBOTDgwMjExX01DR1JQX05BTiwgZ2ZwKTsKKwllbHNlCisJCWdlbmxtc2dfdW5pY2FzdCh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLAorCQkJCXdkZXYtPm93bmVyX25scG9ydGlkKTsKKworCXJldHVybjsKKworbmxhX3B1dF9mYWlsdXJlOgorCW5sbXNnX2ZyZWUobXNnKTsKK30KK0VYUE9SVF9TWU1CT0woY2ZnODAyMTFfbmFuX21hdGNoKTsKKwordm9pZCBjZmc4MDIxMV9uYW5fZnVuY190ZXJtaW5hdGVkKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICB1OCBpbnN0X2lkLAorCQkJCSAgZW51bSBubDgwMjExX25hbl9mdW5jX3Rlcm1fcmVhc29uIHJlYXNvbiwKKwkJCQkgIHU2NCBjb29raWUsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2Rldi0+d2lwaHk7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CisJc3RydWN0IHNrX2J1ZmYgKm1zZzsKKwlzdHJ1Y3QgbmxhdHRyICpmdW5jX2F0dHI7CisJdm9pZCAqaGRyOworCisJaWYgKFdBUk5fT04oIWluc3RfaWQpKQorCQlyZXR1cm47CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBnZnApOworCWlmICghbXNnKQorCQlyZXR1cm47CisKKwloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIDAsIDAsIDAsIE5MODAyMTFfQ01EX0RFTF9OQU5fRlVOQ1RJT04pOworCWlmICghaGRyKSB7CisJCW5sbXNnX2ZyZWUobXNnKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChubGFfcHV0X3UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWSwgcmRldi0+d2lwaHlfaWR4KSB8fAorCSAgICAod2Rldi0+bmV0ZGV2ICYmIG5sYV9wdXRfdTMyKG1zZywgTkw4MDIxMV9BVFRSX0lGSU5ERVgsCisJCQkJCSB3ZGV2LT5uZXRkZXYtPmlmaW5kZXgpKSB8fAorCSAgICBubGFfcHV0X3U2NF82NGJpdChtc2csIE5MODAyMTFfQVRUUl9XREVWLCB3ZGV2X2lkKHdkZXYpLAorCQkJICAgICAgTkw4MDIxMV9BVFRSX1BBRCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKG5sYV9wdXRfdTY0XzY0Yml0KG1zZywgTkw4MDIxMV9BVFRSX0NPT0tJRSwgY29va2llLAorCQkJICAgICAgTkw4MDIxMV9BVFRSX1BBRCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJZnVuY19hdHRyID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX0FUVFJfTkFOX0ZVTkMpOworCWlmICghZnVuY19hdHRyKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChubGFfcHV0X3U4KG1zZywgTkw4MDIxMV9OQU5fRlVOQ19JTlNUQU5DRV9JRCwgaW5zdF9pZCkgfHwKKwkgICAgbmxhX3B1dF91OChtc2csIE5MODAyMTFfTkFOX0ZVTkNfVEVSTV9SRUFTT04sIHJlYXNvbikpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJbmxhX25lc3RfZW5kKG1zZywgZnVuY19hdHRyKTsKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisKKwlpZiAoIXdkZXYtPm93bmVyX25scG9ydGlkKQorCQlnZW5sbXNnX211bHRpY2FzdF9uZXRucygmbmw4MDIxMV9mYW0sIHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLAorCQkJCQltc2csIDAsIE5MODAyMTFfTUNHUlBfTkFOLCBnZnApOworCWVsc2UKKwkJZ2VubG1zZ191bmljYXN0KHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csCisJCQkJd2Rldi0+b3duZXJfbmxwb3J0aWQpOworCisJcmV0dXJuOworCitubGFfcHV0X2ZhaWx1cmU6CisJbmxtc2dfZnJlZShtc2cpOworfQorRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9uYW5fZnVuY190ZXJtaW5hdGVkKTsKKwogc3RhdGljIGludCBubDgwMjExX2dldF9wcm90b2NvbF9mZWF0dXJlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKQEAgLTExMDYzLDcgKzExNzk0LDE0IEBACiAKIAkJCWRldl9ob2xkKGRldik7CiAJCX0gZWxzZSBpZiAob3BzLT5pbnRlcm5hbF9mbGFncyAmIE5MODAyMTFfRkxBR19DSEVDS19ORVRERVZfVVApIHsKLQkJCWlmICghd2Rldi0+cDJwX3N0YXJ0ZWQpIHsKKwkJCWlmICh3ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSAmJgorCQkJICAgICF3ZGV2LT5wMnBfc3RhcnRlZCkgeworCQkJCWlmIChydG5sKQorCQkJCQlydG5sX3VubG9jaygpOworCQkJCXJldHVybiAtRU5FVERPV047CisJCQl9CisJCQlpZiAod2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX05BTiAmJgorCQkJICAgICF3ZGV2LT5uYW5fc3RhcnRlZCkgewogCQkJCWlmIChydG5sKQogCQkJCQlydG5sX3VubG9jaygpOwogCQkJCXJldHVybiAtRU5FVERPV047CkBAIC0xMTY5Nyw2ICsxMjQzNSw0NiBAQAogCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKIAl9LAogCXsKKwkJLmNtZCA9IE5MODAyMTFfQ01EX1NUQVJUX05BTiwKKwkJLmRvaXQgPSBubDgwMjExX3N0YXJ0X25hbiwKKwkJLnBvbGljeSA9IG5sODAyMTFfcG9saWN5LAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5pbnRlcm5hbF9mbGFncyA9IE5MODAyMTFfRkxBR19ORUVEX1dERVYgfAorCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKKwl9LAorCXsKKwkJLmNtZCA9IE5MODAyMTFfQ01EX1NUT1BfTkFOLAorCQkuZG9pdCA9IG5sODAyMTFfc3RvcF9uYW4sCisJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkuaW50ZXJuYWxfZmxhZ3MgPSBOTDgwMjExX0ZMQUdfTkVFRF9XREVWX1VQIHwKKwkJCQkgIE5MODAyMTFfRkxBR19ORUVEX1JUTkwsCisJfSwKKwl7CisJCS5jbWQgPSBOTDgwMjExX0NNRF9BRERfTkFOX0ZVTkNUSU9OLAorCQkuZG9pdCA9IG5sODAyMTFfbmFuX2FkZF9mdW5jLAorCQkucG9saWN5ID0gbmw4MDIxMV9wb2xpY3ksCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwkJLmludGVybmFsX2ZsYWdzID0gTkw4MDIxMV9GTEFHX05FRURfV0RFVl9VUCB8CisJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAorCX0sCisJeworCQkuY21kID0gTkw4MDIxMV9DTURfREVMX05BTl9GVU5DVElPTiwKKwkJLmRvaXQgPSBubDgwMjExX25hbl9kZWxfZnVuYywKKwkJLnBvbGljeSA9IG5sODAyMTFfcG9saWN5LAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5pbnRlcm5hbF9mbGFncyA9IE5MODAyMTFfRkxBR19ORUVEX1dERVZfVVAgfAorCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKKwl9LAorCXsKKwkJLmNtZCA9IE5MODAyMTFfQ01EX0NIQU5HRV9OQU5fQ09ORklHLAorCQkuZG9pdCA9IG5sODAyMTFfbmFuX2NoYW5nZV9jb25maWcsCisJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkuaW50ZXJuYWxfZmxhZ3MgPSBOTDgwMjExX0ZMQUdfTkVFRF9XREVWX1VQIHwKKwkJCQkgIE5MODAyMTFfRkxBR19ORUVEX1JUTkwsCisJfSwKKwl7CiAJCS5jbWQgPSBOTDgwMjExX0NNRF9TRVRfTUNBU1RfUkFURSwKIAkJLmRvaXQgPSBubDgwMjExX3NldF9tY2FzdF9yYXRlLAogCQkucG9saWN5ID0gbmw4MDIxMV9wb2xpY3ksCkBAIC0xMTg0Nyw2ICsxMjYyNSwyOSBAQAogCQkJCU5MODAyMTFfTUNHUlBfQ09ORklHLCBHRlBfS0VSTkVMKTsKIH0KIAordm9pZCBubDgwMjExX25vdGlmeV9pZmFjZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQllbnVtIG5sODAyMTFfY29tbWFuZHMgY21kKQoreworCXN0cnVjdCBza19idWZmICptc2c7CisKKwlXQVJOX09OKGNtZCAhPSBOTDgwMjExX0NNRF9ORVdfSU5URVJGQUNFICYmCisJCWNtZCAhPSBOTDgwMjExX0NNRF9ERUxfSU5URVJGQUNFKTsKKworCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghbXNnKQorCQlyZXR1cm47CisKKwlpZiAobmw4MDIxMV9zZW5kX2lmYWNlKG1zZywgMCwgMCwgMCwgcmRldiwgd2RldiwKKwkJCSAgICAgICBjbWQgPT0gTkw4MDIxMV9DTURfREVMX0lOVEVSRkFDRSkgPCAwKSB7CisJCW5sbXNnX2ZyZWUobXNnKTsKKwkJcmV0dXJuOworCX0KKworCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKCZubDgwMjExX2ZhbSwgd2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywgMCwKKwkJCQlOTDgwMjExX01DR1JQX0NPTkZJRywgR0ZQX0tFUk5FTCk7Cit9CisKIHN0YXRpYyBpbnQgbmw4MDIxMV9hZGRfc2Nhbl9yZXEoc3RydWN0IHNrX2J1ZmYgKm1zZywKIAkJCQlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYpCiB7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuaAppbmRleCBhNjNmNDAyLi43ZTM4MjFkIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oCisrKyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmgKQEAgLTcsNiArNyw5IEBACiB2b2lkIG5sODAyMTFfZXhpdCh2b2lkKTsKIHZvaWQgbmw4MDIxMV9ub3RpZnlfd2lwaHkoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkJICBlbnVtIG5sODAyMTFfY29tbWFuZHMgY21kKTsKK3ZvaWQgbmw4MDIxMV9ub3RpZnlfaWZhY2Uoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAorCQkJICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJICBlbnVtIG5sODAyMTFfY29tbWFuZHMgY21kKTsKIHZvaWQgbmw4MDIxMV9zZW5kX3NjYW5fc3RhcnQoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkJICAgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKIHN0cnVjdCBza19idWZmICpubDgwMjExX2J1aWxkX3NjYW5fbXNnKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9yZGV2LW9wcy5oIGIvbmV0L3dpcmVsZXNzL3JkZXYtb3BzLmgKaW5kZXggODVmZjMwYi4uMTFjZjgzYyAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3JkZXYtb3BzLmgKKysrIGIvbmV0L3dpcmVsZXNzL3JkZXYtb3BzLmgKQEAgLTg4Nyw2ICs4ODcsNjQgQEAKIAl0cmFjZV9yZGV2X3JldHVybl92b2lkKCZyZGV2LT53aXBoeSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHJkZXZfc3RhcnRfbmFuKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKKwkJCQkgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJCQkgc3RydWN0IGNmZzgwMjExX25hbl9jb25mICpjb25mKQoreworCWludCByZXQ7CisKKwl0cmFjZV9yZGV2X3N0YXJ0X25hbigmcmRldi0+d2lwaHksIHdkZXYsIGNvbmYpOworCXJldCA9IHJkZXYtPm9wcy0+c3RhcnRfbmFuKCZyZGV2LT53aXBoeSwgd2RldiwgY29uZik7CisJdHJhY2VfcmRldl9yZXR1cm5faW50KCZyZGV2LT53aXBoeSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmRldl9zdG9wX25hbihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkJIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCit7CisJdHJhY2VfcmRldl9zdG9wX25hbigmcmRldi0+d2lwaHksIHdkZXYpOworCXJkZXYtPm9wcy0+c3RvcF9uYW4oJnJkZXYtPndpcGh5LCB3ZGV2KTsKKwl0cmFjZV9yZGV2X3JldHVybl92b2lkKCZyZGV2LT53aXBoeSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CityZGV2X2FkZF9uYW5fZnVuYyhzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCSAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJICBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKm5hbl9mdW5jKQoreworCWludCByZXQ7CisKKwl0cmFjZV9yZGV2X2FkZF9uYW5fZnVuYygmcmRldi0+d2lwaHksIHdkZXYsIG5hbl9mdW5jKTsKKwlyZXQgPSByZGV2LT5vcHMtPmFkZF9uYW5fZnVuYygmcmRldi0+d2lwaHksIHdkZXYsIG5hbl9mdW5jKTsKKwl0cmFjZV9yZGV2X3JldHVybl9pbnQoJnJkZXYtPndpcGh5LCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZGV2X2RlbF9uYW5fZnVuYyhzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCQkJICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsIHU2NCBjb29raWUpCit7CisJdHJhY2VfcmRldl9kZWxfbmFuX2Z1bmMoJnJkZXYtPndpcGh5LCB3ZGV2LCBjb29raWUpOworCXJkZXYtPm9wcy0+ZGVsX25hbl9mdW5jKCZyZGV2LT53aXBoeSwgd2RldiwgY29va2llKTsKKwl0cmFjZV9yZGV2X3JldHVybl92b2lkKCZyZGV2LT53aXBoeSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CityZGV2X25hbl9jaGFuZ2VfY29uZihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCisJCSAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2NvbmYgKmNvbmYsIHUzMiBjaGFuZ2VzKQoreworCWludCByZXQ7CisKKwl0cmFjZV9yZGV2X25hbl9jaGFuZ2VfY29uZigmcmRldi0+d2lwaHksIHdkZXYsIGNvbmYsIGNoYW5nZXMpOworCWlmIChyZGV2LT5vcHMtPm5hbl9jaGFuZ2VfY29uZikKKwkJcmV0ID0gcmRldi0+b3BzLT5uYW5fY2hhbmdlX2NvbmYoJnJkZXYtPndpcGh5LCB3ZGV2LCBjb25mLAorCQkJCQkJIGNoYW5nZXMpOworCWVsc2UKKwkJcmV0ID0gLUVOT1RTVVBQOworCXRyYWNlX3JkZXZfcmV0dXJuX2ludCgmcmRldi0+d2lwaHksIHJldCk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgcmRldl9zZXRfbWFjX2FjbChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgY2ZnODAyMTFfYWNsX2RhdGEgKnBhcmFtcykKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zY2FuLmMgYi9uZXQvd2lyZWxlc3Mvc2Nhbi5jCmluZGV4IDAzNThlMTIuLmI1YmQ1OGQgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zY2FuLmMKKysrIGIvbmV0L3dpcmVsZXNzL3NjYW4uYwpAQCAtMzUyLDUyICszNTIsNDggQEAKIAlfX2NmZzgwMjExX2Jzc19leHBpcmUocmRldiwgamlmZmllcyAtIElFRUU4MDIxMV9TQ0FOX1JFU1VMVF9FWFBJUkUpOwogfQogCi1jb25zdCB1OCAqY2ZnODAyMTFfZmluZF9pZSh1OCBlaWQsIGNvbnN0IHU4ICppZXMsIGludCBsZW4pCitjb25zdCB1OCAqY2ZnODAyMTFfZmluZF9pZV9tYXRjaCh1OCBlaWQsIGNvbnN0IHU4ICppZXMsIGludCBsZW4sCisJCQkJIGNvbnN0IHU4ICptYXRjaCwgaW50IG1hdGNoX2xlbiwKKwkJCQkgaW50IG1hdGNoX29mZnNldCkKIHsKLQl3aGlsZSAobGVuID4gMiAmJiBpZXNbMF0gIT0gZWlkKSB7CisJLyogbWF0Y2hfb2Zmc2V0IGNhbid0IGJlIHNtYWxsZXIgdGhhbiAyLCB1bmxlc3MgbWF0Y2hfbGVuIGlzCisJICogemVybywgaW4gd2hpY2ggY2FzZSBtYXRjaF9vZmZzZXQgbXVzdCBiZSB6ZXJvIGFzIHdlbGwuCisJICovCisJaWYgKFdBUk5fT04oKG1hdGNoX2xlbiAmJiBtYXRjaF9vZmZzZXQgPCAyKSB8fAorCQkgICAgKCFtYXRjaF9sZW4gJiYgbWF0Y2hfb2Zmc2V0KSkpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKGxlbiA+PSAyICYmIGxlbiA+PSBpZXNbMV0gKyAyKSB7CisJCWlmICgoaWVzWzBdID09IGVpZCkgJiYKKwkJICAgIChpZXNbMV0gKyAyID49IG1hdGNoX29mZnNldCArIG1hdGNoX2xlbikgJiYKKwkJICAgICFtZW1jbXAoaWVzICsgbWF0Y2hfb2Zmc2V0LCBtYXRjaCwgbWF0Y2hfbGVuKSkKKwkJCXJldHVybiBpZXM7CisKIAkJbGVuIC09IGllc1sxXSArIDI7CiAJCWllcyArPSBpZXNbMV0gKyAyOwogCX0KLQlpZiAobGVuIDwgMikKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGxlbiA8IDIgKyBpZXNbMV0pCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBpZXM7CisKKwlyZXR1cm4gTlVMTDsKIH0KLUVYUE9SVF9TWU1CT0woY2ZnODAyMTFfZmluZF9pZSk7CitFWFBPUlRfU1lNQk9MKGNmZzgwMjExX2ZpbmRfaWVfbWF0Y2gpOwogCiBjb25zdCB1OCAqY2ZnODAyMTFfZmluZF92ZW5kb3JfaWUodW5zaWduZWQgaW50IG91aSwgaW50IG91aV90eXBlLAogCQkJCSAgY29uc3QgdTggKmllcywgaW50IGxlbikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZlbmRvcl9pZSAqaWU7Ci0JY29uc3QgdTggKnBvcyA9IGllcywgKmVuZCA9IGllcyArIGxlbjsKLQlpbnQgaWVfb3VpOworCWNvbnN0IHU4ICppZTsKKwl1OCBtYXRjaFtdID0geyBvdWkgPj4gMTYsIG91aSA+PiA4LCBvdWksIG91aV90eXBlIH07CisJaW50IG1hdGNoX2xlbiA9IChvdWlfdHlwZSA8IDApID8gMyA6IHNpemVvZihtYXRjaCk7CiAKIAlpZiAoV0FSTl9PTihvdWlfdHlwZSA+IDB4ZmYpKQogCQlyZXR1cm4gTlVMTDsKIAotCXdoaWxlIChwb3MgPCBlbmQpIHsKLQkJcG9zID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUMsIHBvcywKLQkJCQkgICAgICAgZW5kIC0gcG9zKTsKLQkJaWYgKCFwb3MpCi0JCQlyZXR1cm4gTlVMTDsKKwlpZSA9IGNmZzgwMjExX2ZpbmRfaWVfbWF0Y2goV0xBTl9FSURfVkVORE9SX1NQRUNJRklDLCBpZXMsIGxlbiwKKwkJCQkgICAgbWF0Y2gsIG1hdGNoX2xlbiwgMik7CiAKLQkJaWUgPSAoc3RydWN0IGllZWU4MDIxMV92ZW5kb3JfaWUgKilwb3M7CisJaWYgKGllICYmIChpZVsxXSA8IDQpKQorCQlyZXR1cm4gTlVMTDsKIAotCQkvKiBtYWtlIHN1cmUgd2UgY2FuIGFjY2VzcyBpZS0+bGVuICovCi0JCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX3ZlbmRvcl9pZSwgbGVuKSAhPSAxKTsKLQotCQlpZiAoaWUtPmxlbiA8IHNpemVvZigqaWUpKQotCQkJZ290byBjb250OwotCi0JCWllX291aSA9IGllLT5vdWlbMF0gPDwgMTYgfCBpZS0+b3VpWzFdIDw8IDggfCBpZS0+b3VpWzJdOwotCQlpZiAoaWVfb3VpID09IG91aSAmJgotCQkgICAgKG91aV90eXBlIDwgMCB8fCBpZS0+b3VpX3R5cGUgPT0gb3VpX3R5cGUpKQotCQkJcmV0dXJuIHBvczsKLWNvbnQ6Ci0JCXBvcyArPSAyICsgaWUtPmxlbjsKLQl9Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIGllOwogfQogRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZSk7CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zbWUuYyBiL25ldC93aXJlbGVzcy9zbWUuYwppbmRleCBhZGQ2ODI0Li5hNzdkYjMzIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvc21lLmMKKysrIGIvbmV0L3dpcmVsZXNzL3NtZS5jCkBAIC03MjYsNyArNzI2LDggQEAKIAogCXdkZXYtPmN1cnJlbnRfYnNzID0gYnNzX2Zyb21fcHViKGJzcyk7CiAKLQljZmc4MDIxMV91cGxvYWRfY29ubmVjdF9rZXlzKHdkZXYpOworCWlmICghKHdkZXYtPndpcGh5LT5mbGFncyAmIFdJUEhZX0ZMQUdfSEFTX1NUQVRJQ19XRVApKQorCQljZmc4MDIxMV91cGxvYWRfY29ubmVjdF9rZXlzKHdkZXYpOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWNvdW50cnlfaWUgPSBpZWVlODAyMTFfYnNzX2dldF9pZShic3MsIFdMQU5fRUlEX0NPVU5UUlkpOwpAQCAtMTA0Myw2ICsxMDQ0LDEyIEBACiAJCQkJY29ubmVjdC0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0gPSBjaXBoZXI7CiAJCQl9CiAJCX0KKworCQljb25uZWN0LT5jcnlwdG8ud2VwX2tleXMgPSBjb25ua2V5cy0+cGFyYW1zOworCQljb25uZWN0LT5jcnlwdG8ud2VwX3R4X2tleSA9IGNvbm5rZXlzLT5kZWY7CisJfSBlbHNlIHsKKwkJaWYgKFdBUk5fT04oY29ubmtleXMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJd2Rldi0+Y29ubmVjdF9rZXlzID0gY29ubmtleXM7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvc3lzZnMuYyBiL25ldC93aXJlbGVzcy9zeXNmcy5jCmluZGV4IGU0NjQ2OWIuLjAwODJmNGIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9zeXNmcy5jCisrKyBiL25ldC93aXJlbGVzcy9zeXNmcy5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVwTVxuIiwgd2lwaHktPnBlcm1fYWRkcik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgd2lwaHktPm5fYWRkcmVzc2VzOyBpKyspCi0JCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiVwTVxuIiwgJndpcGh5LT5hZGRyZXNzZXNbaV0uYWRkcik7CisJCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiVwTVxuIiwgd2lwaHktPmFkZHJlc3Nlc1tpXS5hZGRyKTsKIAogCXJldHVybiBidWYgLSBzdGFydDsKIH0KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy90cmFjZS5oIGIvbmV0L3dpcmVsZXNzL3RyYWNlLmgKaW5kZXggNzJiNTI1NS4uYTNkMGE5MWIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy90cmFjZS5oCisrKyBiL25ldC93aXJlbGVzcy90cmFjZS5oCkBAIC0xODg5LDYgKzE4ODksOTYgQEAKIAlUUF9BUkdTKHdpcGh5LCB3ZGV2KQogKTsKIAorVFJBQ0VfRVZFTlQocmRldl9zdGFydF9uYW4sCisJVFBfUFJPVE8oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZiksCisJVFBfQVJHUyh3aXBoeSwgd2RldiwgY29uZiksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJV0lQSFlfRU5UUlkKKwkJV0RFVl9FTlRSWQorCQlfX2ZpZWxkKHU4LCBtYXN0ZXJfcHJlZikKKwkJX19maWVsZCh1OCwgZHVhbCk7CisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJV0lQSFlfQVNTSUdOOworCQlXREVWX0FTU0lHTjsKKwkJX19lbnRyeS0+bWFzdGVyX3ByZWYgPSBjb25mLT5tYXN0ZXJfcHJlZjsKKwkJX19lbnRyeS0+ZHVhbCA9IGNvbmYtPmR1YWw7CisJKSwKKwlUUF9wcmludGsoV0lQSFlfUFJfRk1UICIsICIgV0RFVl9QUl9GTVQKKwkJICAiLCBtYXN0ZXIgcHJlZmVyZW5jZTogJXUsIGR1YWw6ICVkIiwKKwkJICBXSVBIWV9QUl9BUkcsIFdERVZfUFJfQVJHLCBfX2VudHJ5LT5tYXN0ZXJfcHJlZiwKKwkJICBfX2VudHJ5LT5kdWFsKQorKTsKKworVFJBQ0VfRVZFTlQocmRldl9uYW5fY2hhbmdlX2NvbmYsCisJVFBfUFJPVE8oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJIHN0cnVjdCBjZmc4MDIxMV9uYW5fY29uZiAqY29uZiwgdTMyIGNoYW5nZXMpLAorCVRQX0FSR1Mod2lwaHksIHdkZXYsIGNvbmYsIGNoYW5nZXMpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCVdJUEhZX0VOVFJZCisJCVdERVZfRU5UUlkKKwkJX19maWVsZCh1OCwgbWFzdGVyX3ByZWYpCisJCV9fZmllbGQodTgsIGR1YWwpOworCQlfX2ZpZWxkKHUzMiwgY2hhbmdlcyk7CisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJV0lQSFlfQVNTSUdOOworCQlXREVWX0FTU0lHTjsKKwkJX19lbnRyeS0+bWFzdGVyX3ByZWYgPSBjb25mLT5tYXN0ZXJfcHJlZjsKKwkJX19lbnRyeS0+ZHVhbCA9IGNvbmYtPmR1YWw7CisJCV9fZW50cnktPmNoYW5nZXMgPSBjaGFuZ2VzOworCSksCisJVFBfcHJpbnRrKFdJUEhZX1BSX0ZNVCAiLCAiIFdERVZfUFJfRk1UCisJCSAgIiwgbWFzdGVyIHByZWZlcmVuY2U6ICV1LCBkdWFsOiAlZCwgY2hhbmdlczogJXgiLAorCQkgIFdJUEhZX1BSX0FSRywgV0RFVl9QUl9BUkcsIF9fZW50cnktPm1hc3Rlcl9wcmVmLAorCQkgIF9fZW50cnktPmR1YWwsIF9fZW50cnktPmNoYW5nZXMpCispOworCitERUZJTkVfRVZFTlQod2lwaHlfd2Rldl9ldnQsIHJkZXZfc3RvcF9uYW4sCisJVFBfUFJPVE8oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiksCisJVFBfQVJHUyh3aXBoeSwgd2RldikKKyk7CisKK1RSQUNFX0VWRU5UKHJkZXZfYWRkX25hbl9mdW5jLAorCVRQX1BST1RPKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCSBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfbmFuX2Z1bmMgKmZ1bmMpLAorCVRQX0FSR1Mod2lwaHksIHdkZXYsIGZ1bmMpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCVdJUEhZX0VOVFJZCisJCVdERVZfRU5UUlkKKwkJX19maWVsZCh1OCwgZnVuY190eXBlKQorCQlfX2ZpZWxkKHU2NCwgY29va2llKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCVdJUEhZX0FTU0lHTjsKKwkJV0RFVl9BU1NJR047CisJCV9fZW50cnktPmZ1bmNfdHlwZSA9IGZ1bmMtPnR5cGU7CisJCV9fZW50cnktPmNvb2tpZSA9IGZ1bmMtPmNvb2tpZQorCSksCisJVFBfcHJpbnRrKFdJUEhZX1BSX0ZNVCAiLCAiIFdERVZfUFJfRk1UICIsIHR5cGU9JXUsIGNvb2tpZT0lbGx1IiwKKwkJICBXSVBIWV9QUl9BUkcsIFdERVZfUFJfQVJHLCBfX2VudHJ5LT5mdW5jX3R5cGUsCisJCSAgX19lbnRyeS0+Y29va2llKQorKTsKKworVFJBQ0VfRVZFTlQocmRldl9kZWxfbmFuX2Z1bmMsCisJVFBfUFJPVE8oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKKwkJIHU2NCBjb29raWUpLAorCVRQX0FSR1Mod2lwaHksIHdkZXYsIGNvb2tpZSksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJV0lQSFlfRU5UUlkKKwkJV0RFVl9FTlRSWQorCQlfX2ZpZWxkKHU2NCwgY29va2llKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCVdJUEhZX0FTU0lHTjsKKwkJV0RFVl9BU1NJR047CisJCV9fZW50cnktPmNvb2tpZSA9IGNvb2tpZTsKKwkpLAorCVRQX3ByaW50ayhXSVBIWV9QUl9GTVQgIiwgIiBXREVWX1BSX0ZNVCAiLCBjb29raWU9JWxsdSIsCisJCSAgV0lQSFlfUFJfQVJHLCBXREVWX1BSX0FSRywgX19lbnRyeS0+Y29va2llKQorKTsKKwogVFJBQ0VfRVZFTlQocmRldl9zZXRfbWFjX2FjbCwKIAlUUF9QUk9UTyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkgc3RydWN0IGNmZzgwMjExX2FjbF9kYXRhICpwYXJhbXMpLApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3V0aWwuYyBiL25ldC93aXJlbGVzcy91dGlsLmMKaW5kZXggYjdkMTU5Mi4uOGVkY2UyMiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3V0aWwuYworKysgYi9uZXQvd2lyZWxlc3MvdXRpbC5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIAkJCQkgICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zLCBpbnQga2V5X2lkeCwKIAkJCQkgICBib29sIHBhaXJ3aXNlLCBjb25zdCB1OCAqbWFjX2FkZHIpCiB7Ci0JaWYgKGtleV9pZHggPiA1KQorCWlmIChrZXlfaWR4IDwgMCB8fCBrZXlfaWR4ID4gNSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoIXBhaXJ3aXNlICYmIG1hY19hZGRyICYmICEocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX0lCU1NfUlNOKSkKQEAgLTI0OSw3ICsyNDksMTMgQEAKIAkJLyogRGlzYWxsb3cgQklQIChncm91cC1vbmx5KSBjaXBoZXIgYXMgcGFpcndpc2UgY2lwaGVyICovCiAJCWlmIChwYWlyd2lzZSkKIAkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoa2V5X2lkeCA8IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKKwkJaWYgKGtleV9pZHggPiAzKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtOTA2LDcgKzkxMiw3IEBACiAJaWYgKCF3ZGV2LT5jb25uZWN0X2tleXMpCiAJCXJldHVybjsKIAotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQ0ZHODAyMTFfTUFYX1dFUF9LRVlTOyBpKyspIHsKIAkJaWYgKCF3ZGV2LT5jb25uZWN0X2tleXMtPnBhcmFtc1tpXS5jaXBoZXIpCiAJCQljb250aW51ZTsKIAkJaWYgKHJkZXZfYWRkX2tleShyZGV2LCBkZXYsIGksIGZhbHNlLCBOVUxMLApAQCAtOTE5LDkgKzkyNSw2IEBACiAJCQkJbmV0ZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IGRlZmtleSAlZFxuIiwgaSk7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCWlmICh3ZGV2LT5jb25uZWN0X2tleXMtPmRlZm1nbXQgPT0gaSkKLQkJCWlmIChyZGV2X3NldF9kZWZhdWx0X21nbXRfa2V5KHJkZXYsIGRldiwgaSkpCi0JCQkJbmV0ZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IG1ndGRlZiAlZFxuIiwgaSk7CiAJfQogCiAJa3pmcmVlKHdkZXYtPmNvbm5lY3Rfa2V5cyk7CkBAIC0xMDA1LDggKzEwMDgsOSBAQAogCWlmIChvdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQkvKiBjYW5ub3QgY2hhbmdlIGludG8gUDJQIGRldmljZSB0eXBlICovCi0JaWYgKG50eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpCisJLyogY2Fubm90IGNoYW5nZSBpbnRvIFAyUCBkZXZpY2Ugb3IgTkFOICovCisJaWYgKG50eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UgfHwKKwkgICAgbnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTkFOKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAoIXJkZXYtPm9wcy0+Y2hhbmdlX3ZpcnR1YWxfaW50ZiB8fApAQCAtMTA4NSw2ICsxMDg5LDcgQEAKIAkJCS8qIG5vdCBoYXBwZW5pbmcgKi8KIAkJCWJyZWFrOwogCQljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTkFOOgogCQkJV0FSTl9PTigxKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xNTU5LDcgKzE1NjQsNyBAQAogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CiAJaW50IHJlcyA9IDA7CiAKLQlpZiAoIWJlYWNvbl9pbnQpCisJaWYgKGJlYWNvbl9pbnQgPCAxMCB8fCBiZWFjb25faW50ID4gMTAwMDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh3ZGV2LCAmcmRldi0+d2lwaHkud2Rldl9saXN0LCBsaXN0KSB7CkBAIC0xNzU3LDYgKzE3NjIsMjggQEAKIH0KIEVYUE9SVF9TWU1CT0woY2ZnODAyMTFfZ2V0X3N0YXRpb24pOwogCit2b2lkIGNmZzgwMjExX2ZyZWVfbmFuX2Z1bmMoc3RydWN0IGNmZzgwMjExX25hbl9mdW5jICpmKQoreworCWludCBpOworCisJaWYgKCFmKQorCQlyZXR1cm47CisKKwlrZnJlZShmLT5zZXJ2X3NwZWNfaW5mbyk7CisJa2ZyZWUoZi0+c3JmX2JmKTsKKwlrZnJlZShmLT5zcmZfbWFjcyk7CisJZm9yIChpID0gMDsgaSA8IGYtPm51bV9yeF9maWx0ZXJzOyBpKyspCisJCWtmcmVlKGYtPnJ4X2ZpbHRlcnNbaV0uZmlsdGVyKTsKKworCWZvciAoaSA9IDA7IGkgPCBmLT5udW1fdHhfZmlsdGVyczsgaSsrKQorCQlrZnJlZShmLT50eF9maWx0ZXJzW2ldLmZpbHRlcik7CisKKwlrZnJlZShmLT5yeF9maWx0ZXJzKTsKKwlrZnJlZShmLT50eF9maWx0ZXJzKTsKKwlrZnJlZShmKTsKK30KK0VYUE9SVF9TWU1CT0woY2ZnODAyMTFfZnJlZV9uYW5fZnVuYyk7CisKIC8qIFNlZSBJRUVFIDgwMi4xSCBmb3IgTExDL1NOQVAgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uICovCiAvKiBFdGhlcm5ldC1JSSBzbmFwIGhlYWRlciAoUkZDMTA0MiBmb3IgbW9zdCBFdGhlclR5cGVzKSAqLwogY29uc3QgdW5zaWduZWQgY2hhciByZmMxMDQyX2hlYWRlcltdIF9fYWxpZ25lZCgyKSA9CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvd2V4dC1jb21wYXQuYyBiL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jCmluZGV4IDlmMjcyMjEuLmEyMjAxNTYgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jCisrKyBiL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jCkBAIC00MDYsMTIgKzQwNiwxNiBAQAogCWlmIChwYWlyd2lzZSAmJiAhYWRkcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKgorCSAqIEluIG1hbnkgY2FzZXMgd2Ugd29uJ3QgYWN0dWFsbHkgbmVlZCB0aGlzLCBidXQgaXQncyBiZXR0ZXIKKwkgKiB0byBkbyBpdCBmaXJzdCBpbiBjYXNlIHRoZSBhbGxvY2F0aW9uIGZhaWxzLiBEb24ndCB1c2Ugd2V4dC4KKwkgKi8KIAlpZiAoIXdkZXYtPndleHQua2V5cykgewogCQl3ZGV2LT53ZXh0LmtleXMgPSBremFsbG9jKHNpemVvZigqd2Rldi0+d2V4dC5rZXlzKSwKLQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCQkJCSAgR0ZQX0tFUk5FTCk7CiAJCWlmICghd2Rldi0+d2V4dC5rZXlzKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBDRkc4MDIxMV9NQVhfV0VQX0tFWVM7IGkrKykKIAkJCXdkZXYtPndleHQua2V5cy0+cGFyYW1zW2ldLmtleSA9CiAJCQkJd2Rldi0+d2V4dC5rZXlzLT5kYXRhW2ldOwogCX0KQEAgLTQ2MCw3ICs0NjQsNyBAQAogCQlpZiAoZXJyID09IC1FTk9FTlQpCiAJCQllcnIgPSAwOwogCQlpZiAoIWVycikgewotCQkJaWYgKCFhZGRyKSB7CisJCQlpZiAoIWFkZHIgJiYgaWR4IDwgNCkgewogCQkJCW1lbXNldCh3ZGV2LT53ZXh0LmtleXMtPmRhdGFbaWR4XSwgMCwKIAkJCQkgICAgICAgc2l6ZW9mKHdkZXYtPndleHQua2V5cy0+ZGF0YVtpZHhdKSk7CiAJCQkJd2Rldi0+d2V4dC5rZXlzLT5wYXJhbXNbaWR4XS5rZXlfbGVuID0gMDsKQEAgLTQ4NywxMCArNDkxLDE5IEBACiAJZXJyID0gMDsKIAlpZiAod2Rldi0+Y3VycmVudF9ic3MpCiAJCWVyciA9IHJkZXZfYWRkX2tleShyZGV2LCBkZXYsIGlkeCwgcGFpcndpc2UsIGFkZHIsIHBhcmFtcyk7CisJZWxzZSBpZiAocGFyYW1zLT5jaXBoZXIgIT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgJiYKKwkJIHBhcmFtcy0+Y2lwaGVyICE9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWlmICghYWRkcikgeworCS8qCisJICogV2Ugb25seSBuZWVkIHRvIHN0b3JlIFdFUCBrZXlzLCBzaW5jZSB0aGV5J3JlIHRoZSBvbmx5IGtleXMgdGhhdAorCSAqIGNhbiBiZSBiZSBzZXQgYmVmb3JlIGEgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBhbmQgcGVyc2lzdCBhZnRlcgorCSAqIGRpc2Nvbm5lY3RpbmcuCisJICovCisJaWYgKCFhZGRyICYmIChwYXJhbXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAorCQkgICAgICBwYXJhbXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpKSB7CiAJCXdkZXYtPndleHQua2V5cy0+cGFyYW1zW2lkeF0gPSAqcGFyYW1zOwogCQltZW1jcHkod2Rldi0+d2V4dC5rZXlzLT5kYXRhW2lkeF0sCiAJCQlwYXJhbXMtPmtleSwgcGFyYW1zLT5rZXlfbGVuKTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LWNvcmUuYyBiL25ldC93aXJlbGVzcy93ZXh0LWNvcmUuYwppbmRleCBkYmIyNzM4ZS4uNjI1MGIxYyAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQtY29yZS5jCisrKyBiL25ldC93aXJlbGVzcy93ZXh0LWNvcmUuYwpAQCAtOTU4LDI5ICs5NTgsOCBAQAogCQkJcmV0dXJuIHByaXZhdGUoZGV2LCBpd3IsIGNtZCwgaW5mbywgaGFuZGxlcik7CiAJfQogCS8qIE9sZCBkcml2ZXIgQVBJIDogY2FsbCBkcml2ZXIgaW9jdGwgaGFuZGxlciAqLwotCWlmIChkZXYtPm5ldGRldl9vcHMtPm5kb19kb19pb2N0bCkgewotI2lmZGVmIENPTkZJR19DT01QQVQKLQkJaWYgKGluZm8tPmZsYWdzICYgSVdfUkVRVUVTVF9GTEFHX0NPTVBBVCkgewotCQkJaW50IHJldCA9IDA7Ci0JCQlzdHJ1Y3QgaXdyZXEgaXdyX2xjbDsKLQkJCXN0cnVjdCBjb21wYXRfaXdfcG9pbnQgKml3cF9jb21wYXQgPSAodm9pZCAqKSAmaXdyLT51LmRhdGE7Ci0KLQkJCW1lbWNweSgmaXdyX2xjbCwgaXdyLCBzaXplb2Yoc3RydWN0IGl3cmVxKSk7Ci0JCQlpd3JfbGNsLnUuZGF0YS5wb2ludGVyID0gY29tcGF0X3B0cihpd3BfY29tcGF0LT5wb2ludGVyKTsKLQkJCWl3cl9sY2wudS5kYXRhLmxlbmd0aCA9IGl3cF9jb21wYXQtPmxlbmd0aDsKLQkJCWl3cl9sY2wudS5kYXRhLmZsYWdzID0gaXdwX2NvbXBhdC0+ZmxhZ3M7Ci0KLQkJCXJldCA9IGRldi0+bmV0ZGV2X29wcy0+bmRvX2RvX2lvY3RsKGRldiwgKHZvaWQgKikgJml3cl9sY2wsIGNtZCk7Ci0KLQkJCWl3cF9jb21wYXQtPnBvaW50ZXIgPSBwdHJfdG9fY29tcGF0KGl3cl9sY2wudS5kYXRhLnBvaW50ZXIpOwotCQkJaXdwX2NvbXBhdC0+bGVuZ3RoID0gaXdyX2xjbC51LmRhdGEubGVuZ3RoOwotCQkJaXdwX2NvbXBhdC0+ZmxhZ3MgPSBpd3JfbGNsLnUuZGF0YS5mbGFnczsKLQotCQkJcmV0dXJuIHJldDsKLQkJfSBlbHNlCi0jZW5kaWYKLQkJCXJldHVybiBkZXYtPm5ldGRldl9vcHMtPm5kb19kb19pb2N0bChkZXYsIGlmciwgY21kKTsKLQl9CisJaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX2RvX2lvY3RsKQorCQlyZXR1cm4gZGV2LT5uZXRkZXZfb3BzLT5uZG9fZG9faW9jdGwoZGV2LCBpZnIsIGNtZCk7CiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYyBiL25ldC93aXJlbGVzcy93ZXh0LXNtZS5jCmluZGV4IGE0ZThhZjMuLjk5NTE2MzggMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy93ZXh0LXNtZS5jCisrKyBiL25ldC93aXJlbGVzcy93ZXh0LXNtZS5jCkBAIC0zNSw3ICszNSw2IEBACiAKIAlpZiAod2Rldi0+d2V4dC5rZXlzKSB7CiAJCXdkZXYtPndleHQua2V5cy0+ZGVmID0gd2Rldi0+d2V4dC5kZWZhdWx0X2tleTsKLQkJd2Rldi0+d2V4dC5rZXlzLT5kZWZtZ210ID0gd2Rldi0+d2V4dC5kZWZhdWx0X21nbXRfa2V5OwogCQlpZiAod2Rldi0+d2V4dC5kZWZhdWx0X2tleSAhPSAtMSkKIAkJCXdkZXYtPndleHQuY29ubmVjdC5wcml2YWN5ID0gdHJ1ZTsKIAl9CkBAIC00MywxMSArNDIsMTEgQEAKIAlpZiAoIXdkZXYtPndleHQuY29ubmVjdC5zc2lkX2xlbikKIAkJcmV0dXJuIDA7CiAKLQlpZiAod2Rldi0+d2V4dC5rZXlzKSB7CisJaWYgKHdkZXYtPndleHQua2V5cyAmJiB3ZGV2LT53ZXh0LmtleXMtPmRlZiAhPSAtMSkgewogCQljayA9IGttZW1kdXAod2Rldi0+d2V4dC5rZXlzLCBzaXplb2YoKmNrKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghY2spCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJZm9yIChpID0gMDsgaSA8IENGRzgwMjExX01BWF9XRVBfS0VZUzsgaSsrKQogCQkJY2stPnBhcmFtc1tpXS5rZXkgPSBjay0+ZGF0YVtpXTsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC94MjUvYWZfeDI1LmMgYi9uZXQveDI1L2FmX3gyNS5jCmluZGV4IGE3NTBmMzMuLmY4M2I3NGQgMTAwNjQ0Ci0tLSBhL25ldC94MjUvYWZfeDI1LmMKKysrIGIvbmV0L3gyNS9hZl94MjUuYwpAQCAtMTUwMCwxMiArMTUwMCw4IEBACiAJCQlnb3RvIG91dF9kdGVmYWNfcmVsZWFzZTsKIAkJaWYgKGR0ZWZhY3MuY2FsbGluZ19sZW4gPiBYMjVfTUFYX0FFX0xFTikKIAkJCWdvdG8gb3V0X2R0ZWZhY19yZWxlYXNlOwotCQlpZiAoZHRlZmFjcy5jYWxsaW5nX2FlID09IE5VTEwpCi0JCQlnb3RvIG91dF9kdGVmYWNfcmVsZWFzZTsKIAkJaWYgKGR0ZWZhY3MuY2FsbGVkX2xlbiA+IFgyNV9NQVhfQUVfTEVOKQogCQkJZ290byBvdXRfZHRlZmFjX3JlbGVhc2U7Ci0JCWlmIChkdGVmYWNzLmNhbGxlZF9hZSA9PSBOVUxMKQotCQkJZ290byBvdXRfZHRlZmFjX3JlbGVhc2U7CiAJCXgyNS0+ZHRlX2ZhY2lsaXRpZXMgPSBkdGVmYWNzOwogCQlyYyA9IDA7CiBvdXRfZHRlZmFjX3JlbGVhc2U6CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX2FsZ28uYyBiL25ldC94ZnJtL3hmcm1fYWxnby5jCmluZGV4IDI1MGU1NjcuLjQ0YWM4NWYgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fYWxnby5jCisrKyBiL25ldC94ZnJtL3hmcm1fYWxnby5jCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxuZXQveGZybS5oPgotI2lmIGRlZmluZWQoQ09ORklHX0lORVRfRVNQKSB8fCBkZWZpbmVkKENPTkZJR19JTkVUX0VTUF9NT0RVTEUpIHx8IGRlZmluZWQoQ09ORklHX0lORVQ2X0VTUCkgfHwgZGVmaW5lZChDT05GSUdfSU5FVDZfRVNQX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JTkVUX0VTUCkgfHwgSVNfRU5BQkxFRChDT05GSUdfSU5FVDZfRVNQKQogI2luY2x1ZGUgPG5ldC9lc3AuaD4KICNlbmRpZgogCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX2lucHV0LmMgYi9uZXQveGZybS94ZnJtX2lucHV0LmMKaW5kZXggMWM0YWQ0Ny4uNmUzZjAyNSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9pbnB1dC5jCisrKyBiL25ldC94ZnJtL3hmcm1faW5wdXQuYwpAQCAtMjA3LDE1ICsyMDcsMTUgQEAKIAlmYW1pbHkgPSBYRlJNX1NQSV9TS0JfQ0Ioc2tiKS0+ZmFtaWx5OwogCiAJLyogaWYgdHVubmVsIGlzIHByZXNlbnQgb3ZlcnJpZGUgc2tiLT5tYXJrIHZhbHVlIHdpdGggdHVubmVsIGlfa2V5ICovCi0JaWYgKFhGUk1fVFVOTkVMX1NLQl9DQihza2IpLT50dW5uZWwuaXA0KSB7Ci0JCXN3aXRjaCAoZmFtaWx5KSB7Ci0JCWNhc2UgQUZfSU5FVDoKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgQUZfSU5FVDoKKwkJaWYgKFhGUk1fVFVOTkVMX1NLQl9DQihza2IpLT50dW5uZWwuaXA0KQogCQkJbWFyayA9IGJlMzJfdG9fY3B1KFhGUk1fVFVOTkVMX1NLQl9DQihza2IpLT50dW5uZWwuaXA0LT5wYXJtcy5pX2tleSk7Ci0JCQlicmVhazsKLQkJY2FzZSBBRl9JTkVUNjoKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJaWYgKFhGUk1fVFVOTkVMX1NLQl9DQihza2IpLT50dW5uZWwuaXA2KQogCQkJbWFyayA9IGJlMzJfdG9fY3B1KFhGUk1fVFVOTkVMX1NLQl9DQihza2IpLT50dW5uZWwuaXA2LT5wYXJtcy5pX2tleSk7Ci0JCQlicmVhazsKLQkJfQorCQlicmVhazsKIAl9CiAKIAkvKiBBbGxvY2F0ZSBuZXcgc2VjcGF0aCBvciBDT1cgZXhpc3Rpbmcgb25lLiAqLwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKaW5kZXggYjVlNjY1Yi4uZmQ2OTg2NiAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9wb2xpY3kuYworKysgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCkBAIC00OSw2ICs0OSw3IEBACiAJCQkJCQlfX3JlYWRfbW9zdGx5OwogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnhmcm1fZHN0X2NhY2hlIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgX19yZWFkX21vc3RseSBzZXFjb3VudF90IHhmcm1fcG9saWN5X2hhc2hfZ2VuZXJhdGlvbjsKIAogc3RhdGljIHZvaWQgeGZybV9pbml0X3BtdHUoc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIHN0YXRpYyBpbnQgc3RhbGVfYnVuZGxlKHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CkBAIC01OSw2ICs2MCwxMSBAQAogc3RhdGljIHN0cnVjdCB4ZnJtX3BvbGljeSAqX194ZnJtX3BvbGljeV91bmxpbmsoc3RydWN0IHhmcm1fcG9saWN5ICpwb2wsCiAJCQkJCQlpbnQgZGlyKTsKIAorc3RhdGljIGlubGluZSBib29sIHhmcm1fcG9sX2hvbGRfcmN1KHN0cnVjdCB4ZnJtX3BvbGljeSAqcG9saWN5KQoreworCXJldHVybiBhdG9taWNfaW5jX25vdF96ZXJvKCZwb2xpY3ktPnJlZmNudCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgYm9vbAogX194ZnJtNF9zZWxlY3Rvcl9tYXRjaChjb25zdCBzdHJ1Y3QgeGZybV9zZWxlY3RvciAqc2VsLCBjb25zdCBzdHJ1Y3QgZmxvd2kgKmZsKQogewpAQCAtMzg1LDkgKzM5MSwxMSBAQAogCV9fZ2V0X2hhc2hfdGhyZXNoKG5ldCwgZmFtaWx5LCBkaXIsICZkYml0cywgJnNiaXRzKTsKIAloYXNoID0gX19zZWxfaGFzaChzZWwsIGZhbWlseSwgaG1hc2ssIGRiaXRzLCBzYml0cyk7CiAKLQlyZXR1cm4gKGhhc2ggPT0gaG1hc2sgKyAxID8KLQkJJm5ldC0+eGZybS5wb2xpY3lfaW5leGFjdFtkaXJdIDoKLQkJbmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlICsgaGFzaCk7CisJaWYgKGhhc2ggPT0gaG1hc2sgKyAxKQorCQlyZXR1cm4gJm5ldC0+eGZybS5wb2xpY3lfaW5leGFjdFtkaXJdOworCisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9jaGVjayhuZXQtPnhmcm0ucG9saWN5X2J5ZHN0W2Rpcl0udGFibGUsCisJCSAgICAgbG9ja2RlcF9pc19oZWxkKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jaykpICsgaGFzaDsKIH0KIAogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpwb2xpY3lfaGFzaF9kaXJlY3Qoc3RydWN0IG5ldCAqbmV0LApAQCAtNDAzLDcgKzQxMSw4IEBACiAJX19nZXRfaGFzaF90aHJlc2gobmV0LCBmYW1pbHksIGRpciwgJmRiaXRzLCAmc2JpdHMpOwogCWhhc2ggPSBfX2FkZHJfaGFzaChkYWRkciwgc2FkZHIsIGZhbWlseSwgaG1hc2ssIGRiaXRzLCBzYml0cyk7CiAKLQlyZXR1cm4gbmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLnRhYmxlICsgaGFzaDsKKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKG5ldC0+eGZybS5wb2xpY3lfYnlkc3RbZGlyXS50YWJsZSwKKwkJICAgICBsb2NrZGVwX2lzX2hlbGQoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKSkgKyBoYXNoOwogfQogCiBzdGF0aWMgdm9pZCB4ZnJtX2RzdF9oYXNoX3RyYW5zZmVyKHN0cnVjdCBuZXQgKm5ldCwKQEAgLTQyNiwxNCArNDM1LDE0IEBACiAJCWggPSBfX2FkZHJfaGFzaCgmcG9sLT5zZWxlY3Rvci5kYWRkciwgJnBvbC0+c2VsZWN0b3Iuc2FkZHIsCiAJCQkJcG9sLT5mYW1pbHksIG5oYXNobWFzaywgZGJpdHMsIHNiaXRzKTsKIAkJaWYgKCFlbnRyeTApIHsKLQkJCWhsaXN0X2RlbCgmcG9sLT5ieWRzdCk7Ci0JCQlobGlzdF9hZGRfaGVhZCgmcG9sLT5ieWRzdCwgbmRzdHRhYmxlK2gpOworCQkJaGxpc3RfZGVsX3JjdSgmcG9sLT5ieWRzdCk7CisJCQlobGlzdF9hZGRfaGVhZF9yY3UoJnBvbC0+Ynlkc3QsIG5kc3R0YWJsZSArIGgpOwogCQkJaDAgPSBoOwogCQl9IGVsc2UgewogCQkJaWYgKGggIT0gaDApCiAJCQkJY29udGludWU7Ci0JCQlobGlzdF9kZWwoJnBvbC0+Ynlkc3QpOwotCQkJaGxpc3RfYWRkX2JlaGluZCgmcG9sLT5ieWRzdCwgZW50cnkwKTsKKwkJCWhsaXN0X2RlbF9yY3UoJnBvbC0+Ynlkc3QpOworCQkJaGxpc3RfYWRkX2JlaGluZF9yY3UoJnBvbC0+Ynlkc3QsIGVudHJ5MCk7CiAJCX0KIAkJZW50cnkwID0gJnBvbC0+Ynlkc3Q7CiAJfQpAQCAtNDY4LDIyICs0NzcsMzIgQEAKIAl1bnNpZ25lZCBpbnQgaG1hc2sgPSBuZXQtPnhmcm0ucG9saWN5X2J5ZHN0W2Rpcl0uaG1hc2s7CiAJdW5zaWduZWQgaW50IG5oYXNobWFzayA9IHhmcm1fbmV3X2hhc2hfbWFzayhobWFzayk7CiAJdW5zaWduZWQgaW50IG5zaXplID0gKG5oYXNobWFzayArIDEpICogc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKTsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqb2RzdCA9IG5ldC0+eGZybS5wb2xpY3lfYnlkc3RbZGlyXS50YWJsZTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqbmRzdCA9IHhmcm1faGFzaF9hbGxvYyhuc2l6ZSk7CisJc3RydWN0IGhsaXN0X2hlYWQgKm9kc3Q7CiAJaW50IGk7CiAKIAlpZiAoIW5kc3QpCiAJCXJldHVybjsKIAotCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwl3cml0ZV9zZXFjb3VudF9iZWdpbigmeGZybV9wb2xpY3lfaGFzaF9nZW5lcmF0aW9uKTsKKworCW9kc3QgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG5ldC0+eGZybS5wb2xpY3lfYnlkc3RbZGlyXS50YWJsZSwKKwkJCQlsb2NrZGVwX2lzX2hlbGQoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKSk7CisKKwlvZHN0ID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChuZXQtPnhmcm0ucG9saWN5X2J5ZHN0W2Rpcl0udGFibGUsCisJCQkJbG9ja2RlcF9pc19oZWxkKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jaykpOwogCiAJZm9yIChpID0gaG1hc2s7IGkgPj0gMDsgaS0tKQogCQl4ZnJtX2RzdF9oYXNoX3RyYW5zZmVyKG5ldCwgb2RzdCArIGksIG5kc3QsIG5oYXNobWFzaywgZGlyKTsKIAotCW5ldC0+eGZybS5wb2xpY3lfYnlkc3RbZGlyXS50YWJsZSA9IG5kc3Q7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+eGZybS5wb2xpY3lfYnlkc3RbZGlyXS50YWJsZSwgbmRzdCk7CiAJbmV0LT54ZnJtLnBvbGljeV9ieWRzdFtkaXJdLmhtYXNrID0gbmhhc2htYXNrOwogCi0Jd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJd3JpdGVfc2VxY291bnRfZW5kKCZ4ZnJtX3BvbGljeV9oYXNoX2dlbmVyYXRpb24pOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisKKwlzeW5jaHJvbml6ZV9yY3UoKTsKIAogCXhmcm1faGFzaF9mcmVlKG9kc3QsIChobWFzayArIDEpICogc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSk7CiB9CkBAIC01MDAsNyArNTE5LDcgQEAKIAlpZiAoIW5pZHgpCiAJCXJldHVybjsKIAotCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAogCWZvciAoaSA9IGhtYXNrOyBpID49IDA7IGktLSkKIAkJeGZybV9pZHhfaGFzaF90cmFuc2ZlcihvaWR4ICsgaSwgbmlkeCwgbmhhc2htYXNrKTsKQEAgLTUwOCw3ICs1MjcsNyBAQAogCW5ldC0+eGZybS5wb2xpY3lfYnlpZHggPSBuaWR4OwogCW5ldC0+eGZybS5wb2xpY3lfaWR4X2htYXNrID0gbmhhc2htYXNrOwogCi0Jd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAogCXhmcm1faGFzaF9mcmVlKG9pZHgsIChobWFzayArIDEpICogc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSk7CiB9CkBAIC01NDEsNyArNTYwLDYgQEAKIAogdm9pZCB4ZnJtX3NwZF9nZXRpbmZvKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHhmcm1rX3NwZGluZm8gKnNpKQogewotCXJlYWRfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCXNpLT5pbmNudCA9IG5ldC0+eGZybS5wb2xpY3lfY291bnRbWEZSTV9QT0xJQ1lfSU5dOwogCXNpLT5vdXRjbnQgPSBuZXQtPnhmcm0ucG9saWN5X2NvdW50W1hGUk1fUE9MSUNZX09VVF07CiAJc2ktPmZ3ZGNudCA9IG5ldC0+eGZybS5wb2xpY3lfY291bnRbWEZSTV9QT0xJQ1lfRldEXTsKQEAgLTU1MCw3ICs1NjgsNiBAQAogCXNpLT5md2RzY250ID0gbmV0LT54ZnJtLnBvbGljeV9jb3VudFtYRlJNX1BPTElDWV9GV0QrWEZSTV9QT0xJQ1lfTUFYXTsKIAlzaS0+c3BkaGNudCA9IG5ldC0+eGZybS5wb2xpY3lfaWR4X2htYXNrOwogCXNpLT5zcGRobWNudCA9IHhmcm1fcG9saWN5X2hhc2htYXg7Ci0JcmVhZF91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0woeGZybV9zcGRfZ2V0aW5mbyk7CiAKQEAgLTYwMCw3ICs2MTcsNyBAQAogCQlyYml0czYgPSBuZXQtPnhmcm0ucG9saWN5X2h0aHJlc2gucmJpdHM2OwogCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJm5ldC0+eGZybS5wb2xpY3lfaHRocmVzaC5sb2NrLCBzZXEpKTsKIAotCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAogCS8qIHJlc2V0IHRoZSBieWRzdCBhbmQgaW5leGFjdCB0YWJsZSBpbiBhbGwgZGlyZWN0aW9ucyAqLwogCWZvciAoZGlyID0gMDsgZGlyIDwgWEZSTV9QT0xJQ1lfTUFYOyBkaXIrKykgewpAQCAtNjI2LDYgKzY0MywxMCBAQAogCiAJLyogcmUtaW5zZXJ0IGFsbCBwb2xpY2llcyBieSBvcmRlciBvZiBjcmVhdGlvbiAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShwb2xpY3ksICZuZXQtPnhmcm0ucG9saWN5X2FsbCwgd2Fsay5hbGwpIHsKKwkJaWYgKHhmcm1fcG9saWN5X2lkMmRpcihwb2xpY3ktPmluZGV4KSA+PSBYRlJNX1BPTElDWV9NQVgpIHsKKwkJCS8qIHNraXAgc29ja2V0IHBvbGljaWVzICovCisJCQljb250aW51ZTsKKwkJfQogCQluZXdwb3MgPSBOVUxMOwogCQljaGFpbiA9IHBvbGljeV9oYXNoX2J5c2VsKG5ldCwgJnBvbGljeS0+c2VsZWN0b3IsCiAJCQkJCSAgcG9saWN5LT5mYW1pbHksCkBAIC02NDIsNyArNjYzLDcgQEAKIAkJCWhsaXN0X2FkZF9oZWFkKCZwb2xpY3ktPmJ5ZHN0LCBjaGFpbik7CiAJfQogCi0Jd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAogCW11dGV4X3VubG9jaygmaGFzaF9yZXNpemVfbXV0ZXgpOwogfQpAQCAtNzUzLDcgKzc3NCw3IEBACiAJc3RydWN0IGhsaXN0X2hlYWQgKmNoYWluOwogCXN0cnVjdCBobGlzdF9ub2RlICpuZXdwb3M7CiAKLQl3cml0ZV9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJY2hhaW4gPSBwb2xpY3lfaGFzaF9ieXNlbChuZXQsICZwb2xpY3ktPnNlbGVjdG9yLCBwb2xpY3ktPmZhbWlseSwgZGlyKTsKIAlkZWxwb2wgPSBOVUxMOwogCW5ld3BvcyA9IE5VTEw7CkBAIC03NjQsNyArNzg1LDcgQEAKIAkJICAgIHhmcm1fc2VjX2N0eF9tYXRjaChwb2wtPnNlY3VyaXR5LCBwb2xpY3ktPnNlY3VyaXR5KSAmJgogCQkgICAgIVdBUk5fT04oZGVscG9sKSkgewogCQkJaWYgKGV4Y2wpIHsKLQkJCQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwkJCQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQkJCXJldHVybiAtRUVYSVNUOwogCQkJfQogCQkJZGVscG9sID0gcG9sOwpAQCAtODAwLDcgKzgyMSw3IEBACiAJcG9saWN5LT5jdXJsZnQudXNlX3RpbWUgPSAwOwogCWlmICghbW9kX3RpbWVyKCZwb2xpY3ktPnRpbWVyLCBqaWZmaWVzICsgSFopKQogCQl4ZnJtX3BvbF9ob2xkKHBvbGljeSk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAogCWlmIChkZWxwb2wpCiAJCXhmcm1fcG9saWN5X2tpbGwoZGVscG9sKTsKQEAgLTgyMCw3ICs4NDEsNyBAQAogCXN0cnVjdCBobGlzdF9oZWFkICpjaGFpbjsKIAogCSplcnIgPSAwOwotCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAljaGFpbiA9IHBvbGljeV9oYXNoX2J5c2VsKG5ldCwgc2VsLCBzZWwtPmZhbWlseSwgZGlyKTsKIAlyZXQgPSBOVUxMOwogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvbCwgY2hhaW4sIGJ5ZHN0KSB7CkBAIC04MzMsNyArODU0LDcgQEAKIAkJCQkqZXJyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfZGVsZXRlKAogCQkJCQkJCQlwb2wtPnNlY3VyaXR5KTsKIAkJCQlpZiAoKmVycikgewotCQkJCQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwkJCQkJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAkJCQkJcmV0dXJuIHBvbDsKIAkJCQl9CiAJCQkJX194ZnJtX3BvbGljeV91bmxpbmsocG9sLCBkaXIpOwpAQCAtODQyLDcgKzg2Myw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJaWYgKHJldCAmJiBkZWxldGUpCiAJCXhmcm1fcG9saWN5X2tpbGwocmV0KTsKQEAgLTg2MSw3ICs4ODIsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCSplcnIgPSAwOwotCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAljaGFpbiA9IG5ldC0+eGZybS5wb2xpY3lfYnlpZHggKyBpZHhfaGFzaChuZXQsIGlkKTsKIAlyZXQgPSBOVUxMOwogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvbCwgY2hhaW4sIGJ5aWR4KSB7CkBAIC04NzIsNyArODkzLDcgQEAKIAkJCQkqZXJyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfZGVsZXRlKAogCQkJCQkJCQlwb2wtPnNlY3VyaXR5KTsKIAkJCQlpZiAoKmVycikgewotCQkJCQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwkJCQkJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAkJCQkJcmV0dXJuIHBvbDsKIAkJCQl9CiAJCQkJX194ZnJtX3BvbGljeV91bmxpbmsocG9sLCBkaXIpOwpAQCAtODgxLDcgKzkwMiw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJaWYgKHJldCAmJiBkZWxldGUpCiAJCXhmcm1fcG9saWN5X2tpbGwocmV0KTsKQEAgLTkzOSw3ICs5NjAsNyBAQAogewogCWludCBkaXIsIGVyciA9IDAsIGNudCA9IDA7CiAKLQl3cml0ZV9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAKIAllcnIgPSB4ZnJtX3BvbGljeV9mbHVzaF9zZWNjdHhfY2hlY2sobmV0LCB0eXBlLCB0YXNrX3ZhbGlkKTsKIAlpZiAoZXJyKQpAQCAtOTU1LDE0ICs5NzYsMTQgQEAKIAkJCWlmIChwb2wtPnR5cGUgIT0gdHlwZSkKIAkJCQljb250aW51ZTsKIAkJCV9feGZybV9wb2xpY3lfdW5saW5rKHBvbCwgZGlyKTsKLQkJCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAkJCWNudCsrOwogCiAJCQl4ZnJtX2F1ZGl0X3BvbGljeV9kZWxldGUocG9sLCAxLCB0YXNrX3ZhbGlkKTsKIAogCQkJeGZybV9wb2xpY3lfa2lsbChwb2wpOwogCi0JCQl3cml0ZV9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJCQlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAkJCWdvdG8gYWdhaW4xOwogCQl9CiAKQEAgLTk3NCwxMyArOTk1LDEzIEBACiAJCQkJaWYgKHBvbC0+dHlwZSAhPSB0eXBlKQogCQkJCQljb250aW51ZTsKIAkJCQlfX3hmcm1fcG9saWN5X3VubGluayhwb2wsIGRpcik7Ci0JCQkJd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJCQkJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAkJCQljbnQrKzsKIAogCQkJCXhmcm1fYXVkaXRfcG9saWN5X2RlbGV0ZShwb2wsIDEsIHRhc2tfdmFsaWQpOwogCQkJCXhmcm1fcG9saWN5X2tpbGwocG9sKTsKIAotCQkJCXdyaXRlX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwkJCQlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAkJCQlnb3RvIGFnYWluMjsKIAkJCX0KIAkJfQpAQCAtOTg5LDcgKzEwMTAsNyBAQAogCWlmICghY250KQogCQllcnIgPSAtRVNSQ0g7CiBvdXQ6Ci0Jd3JpdGVfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3BvbGljeV9mbHVzaCk7CkBAIC0xMDA5LDcgKzEwMzAsNyBAQAogCWlmIChsaXN0X2VtcHR5KCZ3YWxrLT53YWxrLmFsbCkgJiYgd2Fsay0+c2VxICE9IDApCiAJCXJldHVybiAwOwogCi0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCWlmIChsaXN0X2VtcHR5KCZ3YWxrLT53YWxrLmFsbCkpCiAJCXggPSBsaXN0X2ZpcnN0X2VudHJ5KCZuZXQtPnhmcm0ucG9saWN5X2FsbCwgc3RydWN0IHhmcm1fcG9saWN5X3dhbGtfZW50cnksIGFsbCk7CiAJZWxzZQpAQCAtMTAzNyw3ICsxMDU4LDcgQEAKIAl9CiAJbGlzdF9kZWxfaW5pdCgmd2Fsay0+d2Fsay5hbGwpOwogb3V0OgotCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJcmV0dXJuIGVycm9yOwogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3BvbGljeV93YWxrKTsKQEAgLTEwNTYsOSArMTA3Nyw5IEBACiAJaWYgKGxpc3RfZW1wdHkoJndhbGstPndhbGsuYWxsKSkKIAkJcmV0dXJuOwogCi0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOyAvKkZJWE1FIHdoZXJlIGlzIG5ldD8gKi8KKwlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsgLypGSVhNRSB3aGVyZSBpcyBuZXQ/ICovCiAJbGlzdF9kZWwoJndhbGstPndhbGsuYWxsKTsKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogfQogRVhQT1JUX1NZTUJPTCh4ZnJtX3BvbGljeV93YWxrX2RvbmUpOwogCkBAIC0xMDk2LDE3ICsxMTE3LDI0IEBACiAJc3RydWN0IHhmcm1fcG9saWN5ICpwb2wsICpyZXQ7CiAJY29uc3QgeGZybV9hZGRyZXNzX3QgKmRhZGRyLCAqc2FkZHI7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmNoYWluOwotCXUzMiBwcmlvcml0eSA9IH4wVTsKKwl1bnNpZ25lZCBpbnQgc2VxdWVuY2U7CisJdTMyIHByaW9yaXR5OwogCiAJZGFkZHIgPSB4ZnJtX2Zsb3dpX2RhZGRyKGZsLCBmYW1pbHkpOwogCXNhZGRyID0geGZybV9mbG93aV9zYWRkcihmbCwgZmFtaWx5KTsKIAlpZiAodW5saWtlbHkoIWRhZGRyIHx8ICFzYWRkcikpCiAJCXJldHVybiBOVUxMOwogCi0JcmVhZF9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7Ci0JY2hhaW4gPSBwb2xpY3lfaGFzaF9kaXJlY3QobmV0LCBkYWRkciwgc2FkZHIsIGZhbWlseSwgZGlyKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisgcmV0cnk6CisJZG8geworCQlzZXF1ZW5jZSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJnhmcm1fcG9saWN5X2hhc2hfZ2VuZXJhdGlvbik7CisJCWNoYWluID0gcG9saWN5X2hhc2hfZGlyZWN0KG5ldCwgZGFkZHIsIHNhZGRyLCBmYW1pbHksIGRpcik7CisJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmeGZybV9wb2xpY3lfaGFzaF9nZW5lcmF0aW9uLCBzZXF1ZW5jZSkpOworCisJcHJpb3JpdHkgPSB+MFU7CiAJcmV0ID0gTlVMTDsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShwb2wsIGNoYWluLCBieWRzdCkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwb2wsIGNoYWluLCBieWRzdCkgewogCQllcnIgPSB4ZnJtX3BvbGljeV9tYXRjaChwb2wsIGZsLCB0eXBlLCBmYW1pbHksIGRpcik7CiAJCWlmIChlcnIpIHsKIAkJCWlmIChlcnIgPT0gLUVTUkNIKQpAQCAtMTEyMiw3ICsxMTUwLDcgQEAKIAkJfQogCX0KIAljaGFpbiA9ICZuZXQtPnhmcm0ucG9saWN5X2luZXhhY3RbZGlyXTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeShwb2wsIGNoYWluLCBieWRzdCkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwb2wsIGNoYWluLCBieWRzdCkgewogCQlpZiAoKHBvbC0+cHJpb3JpdHkgPj0gcHJpb3JpdHkpICYmIHJldCkKIAkJCWJyZWFrOwogCkBAIC0xMTQwLDkgKzExNjgsMTMgQEAKIAkJfQogCX0KIAotCXhmcm1fcG9sX2hvbGQocmV0KTsKKwlpZiAocmVhZF9zZXFjb3VudF9yZXRyeSgmeGZybV9wb2xpY3lfaGFzaF9nZW5lcmF0aW9uLCBzZXF1ZW5jZSkpCisJCWdvdG8gcmV0cnk7CisKKwlpZiAocmV0ICYmICF4ZnJtX3BvbF9ob2xkX3JjdShyZXQpKQorCQlnb3RvIHJldHJ5OwogZmFpbDoKLQlyZWFkX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEyMTksMTAgKzEyNTEsOSBAQAogCQkJCQkJIGNvbnN0IHN0cnVjdCBmbG93aSAqZmwpCiB7CiAJc3RydWN0IHhmcm1fcG9saWN5ICpwb2w7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXJlYWRfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworIGFnYWluOgogCXBvbCA9IHJjdV9kZXJlZmVyZW5jZShzay0+c2tfcG9saWN5W2Rpcl0pOwogCWlmIChwb2wgIT0gTlVMTCkgewogCQlib29sIG1hdGNoID0geGZybV9zZWxlY3Rvcl9tYXRjaCgmcG9sLT5zZWxlY3RvciwgZmwsCkBAIC0xMjM3LDggKzEyNjgsOCBAQAogCQkJZXJyID0gc2VjdXJpdHlfeGZybV9wb2xpY3lfbG9va3VwKHBvbC0+c2VjdXJpdHksCiAJCQkJCQkgICAgICBmbC0+Zmxvd2lfc2VjaWQsCiAJCQkJCQkgICAgICBwb2xpY3lfdG9fZmxvd19kaXIoZGlyKSk7Ci0JCQlpZiAoIWVycikKLQkJCQl4ZnJtX3BvbF9ob2xkKHBvbCk7CisJCQlpZiAoIWVyciAmJiAheGZybV9wb2xfaG9sZF9yY3UocG9sKSkKKwkJCQlnb3RvIGFnYWluOwogCQkJZWxzZSBpZiAoZXJyID09IC1FU1JDSCkKIAkJCQlwb2wgPSBOVUxMOwogCQkJZWxzZQpAQCAtMTI0Nyw3ICsxMjc4LDYgQEAKIAkJCXBvbCA9IE5VTEw7CiAJfQogb3V0OgotCXJlYWRfdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHBvbDsKIH0KQEAgLTEyNzEsNyArMTMwMSw3IEBACiAKIAkvKiBTb2NrZXQgcG9saWNpZXMgYXJlIG5vdCBoYXNoZWQuICovCiAJaWYgKCFobGlzdF91bmhhc2hlZCgmcG9sLT5ieWRzdCkpIHsKLQkJaGxpc3RfZGVsKCZwb2wtPmJ5ZHN0KTsKKwkJaGxpc3RfZGVsX3JjdSgmcG9sLT5ieWRzdCk7CiAJCWhsaXN0X2RlbCgmcG9sLT5ieWlkeCk7CiAJfQogCkBAIC0xMjk1LDkgKzEzMjUsOSBAQAogewogCXN0cnVjdCBuZXQgKm5ldCA9IHhwX25ldChwb2wpOwogCi0Jd3JpdGVfbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCXBvbCA9IF9feGZybV9wb2xpY3lfdW5saW5rKHBvbCwgZGlyKTsKLQl3cml0ZV91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCWlmIChwb2wpIHsKIAkJeGZybV9wb2xpY3lfa2lsbChwb2wpOwogCQlyZXR1cm4gMDsKQEAgLTEzMTYsNyArMTM0Niw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogI2VuZGlmCiAKLQl3cml0ZV9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJb2xkX3BvbCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2stPnNrX3BvbGljeVtkaXJdLAogCQkJCWxvY2tkZXBfaXNfaGVsZCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spKTsKIAlpZiAocG9sKSB7CkBAIC0xMzM0LDcgKzEzNjQsNyBAQAogCQkgKi8KIAkJeGZybV9za19wb2xpY3lfdW5saW5rKG9sZF9wb2wsIGRpcik7CiAJfQotCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAKIAlpZiAob2xkX3BvbCkgewogCQl4ZnJtX3BvbGljeV9raWxsKG9sZF9wb2wpOwpAQCAtMTM2NCw5ICsxMzk0LDkgQEAKIAkJbmV3cC0+dHlwZSA9IG9sZC0+dHlwZTsKIAkJbWVtY3B5KG5ld3AtPnhmcm1fdmVjLCBvbGQtPnhmcm1fdmVjLAogCQkgICAgICAgbmV3cC0+eGZybV9ucipzaXplb2Yoc3RydWN0IHhmcm1fdG1wbCkpOwotCQl3cml0ZV9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CisJCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQl4ZnJtX3NrX3BvbGljeV9saW5rKG5ld3AsIGRpcik7Ci0JCXdyaXRlX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCQlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCQl4ZnJtX3BvbF9wdXQobmV3cCk7CiAJfQogCXJldHVybiBuZXdwOwpAQCAtMzA0OCw3ICszMDc4LDcgQEAKIAogCS8qIEluaXRpYWxpemUgdGhlIHBlci1uZXQgbG9ja3MgaGVyZSAqLwogCXNwaW5fbG9ja19pbml0KCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKLQlyd2xvY2tfaW5pdCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7CiAJbXV0ZXhfaW5pdCgmbmV0LT54ZnJtLnhmcm1fY2ZnX211dGV4KTsKIAogCXJldHVybiAwOwpAQCAtMzA4Miw2ICszMTEyLDcgQEAKIHZvaWQgX19pbml0IHhmcm1faW5pdCh2b2lkKQogewogCXJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJnhmcm1fbmV0X29wcyk7CisJc2VxY291bnRfaW5pdCgmeGZybV9wb2xpY3lfaGFzaF9nZW5lcmF0aW9uKTsKIAl4ZnJtX2lucHV0X2luaXQoKTsKIH0KIApAQCAtMzE3OSw3ICszMjEwLDcgQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqY2hhaW47CiAJdTMyIHByaW9yaXR5ID0gfjBVOwogCi0JcmVhZF9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9wb2xpY3lfbG9jayk7IC8qRklYTUUqLworCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCWNoYWluID0gcG9saWN5X2hhc2hfZGlyZWN0KG5ldCwgJnNlbC0+ZGFkZHIsICZzZWwtPnNhZGRyLCBzZWwtPmZhbWlseSwgZGlyKTsKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShwb2wsIGNoYWluLCBieWRzdCkgewogCQlpZiAoeGZybV9taWdyYXRlX3NlbGVjdG9yX21hdGNoKHNlbCwgJnBvbC0+c2VsZWN0b3IpICYmCkBAIC0zMjAzLDcgKzMyMzQsNyBAQAogCiAJeGZybV9wb2xfaG9sZChyZXQpOwogCi0JcmVhZF91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3BvbGljeV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fcG9saWN5X2xvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fcHJvYy5jIGIvbmV0L3hmcm0veGZybV9wcm9jLmMKaW5kZXggOWM0ZmJkOC4uYmEyYjUzOSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9wcm9jLmMKKysrIGIvbmV0L3hmcm0veGZybV9wcm9jLmMKQEAgLTUwLDEyICs1MCwxOCBAQAogCiBzdGF0aWMgaW50IHhmcm1fc3RhdGlzdGljc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZbTElOVVhfTUlCX1hGUk1NQVhdOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcS0+cHJpdmF0ZTsKIAlpbnQgaTsKKworCW1lbXNldChidWZmLCAwLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBMSU5VWF9NSUJfWEZSTU1BWCk7CisKKwlzbm1wX2dldF9jcHVfZmllbGRfYmF0Y2goYnVmZiwgeGZybV9taWJfbGlzdCwKKwkJCQkgbmV0LT5taWIueGZybV9zdGF0aXN0aWNzKTsKIAlmb3IgKGkgPSAwOyB4ZnJtX21pYl9saXN0W2ldLm5hbWU7IGkrKykKIAkJc2VxX3ByaW50ZihzZXEsICIlLTI0c1x0JWx1XG4iLCB4ZnJtX21pYl9saXN0W2ldLm5hbWUsCi0JCQkgICBzbm1wX2ZvbGRfZmllbGQobmV0LT5taWIueGZybV9zdGF0aXN0aWNzLAotCQkJCQkgICB4ZnJtX21pYl9saXN0W2ldLmVudHJ5KSk7CisJCQkJCQlidWZmW2ldKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3JlcGxheS5jIGIvbmV0L3hmcm0veGZybV9yZXBsYXkuYwppbmRleCA0ZmQ3MjVhLi5jZGMyZTJlIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3JlcGxheS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcmVwbGF5LmMKQEAgLTU1OCw3ICs1NTgsNyBAQAogCQl4LT5yZXBsLT5ub3RpZnkoeCwgWEZSTV9SRVBMQVlfVVBEQVRFKTsKIH0KIAotc3RhdGljIHN0cnVjdCB4ZnJtX3JlcGxheSB4ZnJtX3JlcGxheV9sZWdhY3kgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmcm1fcmVwbGF5IHhmcm1fcmVwbGF5X2xlZ2FjeSA9IHsKIAkuYWR2YW5jZQk9IHhmcm1fcmVwbGF5X2FkdmFuY2UsCiAJLmNoZWNrCQk9IHhmcm1fcmVwbGF5X2NoZWNrLAogCS5yZWNoZWNrCT0geGZybV9yZXBsYXlfY2hlY2ssCkBAIC01NjYsNyArNTY2LDcgQEAKIAkub3ZlcmZsb3cJPSB4ZnJtX3JlcGxheV9vdmVyZmxvdywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgeGZybV9yZXBsYXkgeGZybV9yZXBsYXlfYm1wID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB4ZnJtX3JlcGxheSB4ZnJtX3JlcGxheV9ibXAgPSB7CiAJLmFkdmFuY2UJPSB4ZnJtX3JlcGxheV9hZHZhbmNlX2JtcCwKIAkuY2hlY2sJCT0geGZybV9yZXBsYXlfY2hlY2tfYm1wLAogCS5yZWNoZWNrCT0geGZybV9yZXBsYXlfY2hlY2tfYm1wLApAQCAtNTc0LDcgKzU3NCw3IEBACiAJLm92ZXJmbG93CT0geGZybV9yZXBsYXlfb3ZlcmZsb3dfYm1wLAogfTsKIAotc3RhdGljIHN0cnVjdCB4ZnJtX3JlcGxheSB4ZnJtX3JlcGxheV9lc24gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHhmcm1fcmVwbGF5IHhmcm1fcmVwbGF5X2VzbiA9IHsKIAkuYWR2YW5jZQk9IHhmcm1fcmVwbGF5X2FkdmFuY2VfZXNuLAogCS5jaGVjawkJPSB4ZnJtX3JlcGxheV9jaGVja19lc24sCiAJLnJlY2hlY2sJPSB4ZnJtX3JlcGxheV9yZWNoZWNrX2VzbiwKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwppbmRleCA5ODk1YThjLi40MTliZjVkIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3N0YXRlLmMKKysrIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCkBAIC0yOCw2ICsyOCwxMSBAQAogCiAjaW5jbHVkZSAieGZybV9oYXNoLmgiCiAKKyNkZWZpbmUgeGZybV9zdGF0ZV9kZXJlZl9wcm90KHRhYmxlLCBuZXQpIFwKKwlyY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKCh0YWJsZSksIGxvY2tkZXBfaXNfaGVsZCgmKG5ldCktPnhmcm0ueGZybV9zdGF0ZV9sb2NrKSkKKworc3RhdGljIHZvaWQgeGZybV9zdGF0ZV9nY190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKIC8qIEVhY2ggeGZybV9zdGF0ZSBtYXkgYmUgbGlua2VkIHRvIHR3byB0YWJsZXM6CiAKICAgIDEuIEhhc2ggdGFibGUgYnkgKHNwaSxkYWRkcixhaC9lc3ApIHRvIGZpbmQgU0EgYnkgU1BJLiAoaW5wdXQsY3RsKQpAQCAtMzYsNiArNDEsMTUgQEAKICAqLwogCiBzdGF0aWMgdW5zaWduZWQgaW50IHhmcm1fc3RhdGVfaGFzaG1heCBfX3JlYWRfbW9zdGx5ID0gMSAqIDEwMjQgKiAxMDI0Oworc3RhdGljIF9fcmVhZF9tb3N0bHkgc2VxY291bnRfdCB4ZnJtX3N0YXRlX2hhc2hfZ2VuZXJhdGlvbiA9IFNFUUNOVF9aRVJPKHhmcm1fc3RhdGVfaGFzaF9nZW5lcmF0aW9uKTsKKworc3RhdGljIERFQ0xBUkVfV09SSyh4ZnJtX3N0YXRlX2djX3dvcmssIHhmcm1fc3RhdGVfZ2NfdGFzayk7CitzdGF0aWMgSExJU1RfSEVBRCh4ZnJtX3N0YXRlX2djX2xpc3QpOworCitzdGF0aWMgaW5saW5lIGJvb2wgeGZybV9zdGF0ZV9ob2xkX3JjdShzdHJ1Y3QgeGZybV9zdGF0ZSBfX3JjdSAqeCkKK3sKKwlyZXR1cm4gYXRvbWljX2luY19ub3RfemVybygmeC0+cmVmY250KTsKK30KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgeGZybV9kc3RfaGFzaChzdHJ1Y3QgbmV0ICpuZXQsCiAJCQkJCSBjb25zdCB4ZnJtX2FkZHJlc3NfdCAqZGFkZHIsCkBAIC03NiwxOCArOTAsMTggQEAKIAkJaCA9IF9feGZybV9kc3RfaGFzaCgmeC0+aWQuZGFkZHIsICZ4LT5wcm9wcy5zYWRkciwKIAkJCQkgICAgeC0+cHJvcHMucmVxaWQsIHgtPnByb3BzLmZhbWlseSwKIAkJCQkgICAgbmhhc2htYXNrKTsKLQkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5ZHN0LCBuZHN0dGFibGUraCk7CisJCWhsaXN0X2FkZF9oZWFkX3JjdSgmeC0+Ynlkc3QsIG5kc3R0YWJsZSArIGgpOwogCiAJCWggPSBfX3hmcm1fc3JjX2hhc2goJngtPmlkLmRhZGRyLCAmeC0+cHJvcHMuc2FkZHIsCiAJCQkJICAgIHgtPnByb3BzLmZhbWlseSwKIAkJCQkgICAgbmhhc2htYXNrKTsKLQkJaGxpc3RfYWRkX2hlYWQoJngtPmJ5c3JjLCBuc3JjdGFibGUraCk7CisJCWhsaXN0X2FkZF9oZWFkX3JjdSgmeC0+YnlzcmMsIG5zcmN0YWJsZSArIGgpOwogCiAJCWlmICh4LT5pZC5zcGkpIHsKIAkJCWggPSBfX3hmcm1fc3BpX2hhc2goJngtPmlkLmRhZGRyLCB4LT5pZC5zcGksCiAJCQkJCSAgICB4LT5pZC5wcm90bywgeC0+cHJvcHMuZmFtaWx5LAogCQkJCQkgICAgbmhhc2htYXNrKTsKLQkJCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieXNwaSwgbnNwaXRhYmxlK2gpOworCQkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieXNwaSwgbnNwaXRhYmxlICsgaCk7CiAJCX0KIAl9CiB9CkBAIC0xMjIsMjUgKzEzNiwyOSBAQAogCX0KIAogCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fc3RhdGVfbG9jayk7CisJd3JpdGVfc2VxY291bnRfYmVnaW4oJnhmcm1fc3RhdGVfaGFzaF9nZW5lcmF0aW9uKTsKIAogCW5oYXNobWFzayA9IChuc2l6ZSAvIHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkpIC0gMVU7CisJb2RzdCA9IHhmcm1fc3RhdGVfZGVyZWZfcHJvdChuZXQtPnhmcm0uc3RhdGVfYnlkc3QsIG5ldCk7CiAJZm9yIChpID0gbmV0LT54ZnJtLnN0YXRlX2htYXNrOyBpID49IDA7IGktLSkKLQkJeGZybV9oYXNoX3RyYW5zZmVyKG5ldC0+eGZybS5zdGF0ZV9ieWRzdCtpLCBuZHN0LCBuc3JjLCBuc3BpLAotCQkJCSAgIG5oYXNobWFzayk7CisJCXhmcm1faGFzaF90cmFuc2ZlcihvZHN0ICsgaSwgbmRzdCwgbnNyYywgbnNwaSwgbmhhc2htYXNrKTsKIAotCW9kc3QgPSBuZXQtPnhmcm0uc3RhdGVfYnlkc3Q7Ci0Jb3NyYyA9IG5ldC0+eGZybS5zdGF0ZV9ieXNyYzsKLQlvc3BpID0gbmV0LT54ZnJtLnN0YXRlX2J5c3BpOworCW9zcmMgPSB4ZnJtX3N0YXRlX2RlcmVmX3Byb3QobmV0LT54ZnJtLnN0YXRlX2J5c3JjLCBuZXQpOworCW9zcGkgPSB4ZnJtX3N0YXRlX2RlcmVmX3Byb3QobmV0LT54ZnJtLnN0YXRlX2J5c3BpLCBuZXQpOwogCW9oYXNobWFzayA9IG5ldC0+eGZybS5zdGF0ZV9obWFzazsKIAotCW5ldC0+eGZybS5zdGF0ZV9ieWRzdCA9IG5kc3Q7Ci0JbmV0LT54ZnJtLnN0YXRlX2J5c3JjID0gbnNyYzsKLQluZXQtPnhmcm0uc3RhdGVfYnlzcGkgPSBuc3BpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPnhmcm0uc3RhdGVfYnlkc3QsIG5kc3QpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPnhmcm0uc3RhdGVfYnlzcmMsIG5zcmMpOworCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPnhmcm0uc3RhdGVfYnlzcGksIG5zcGkpOwogCW5ldC0+eGZybS5zdGF0ZV9obWFzayA9IG5oYXNobWFzazsKIAorCXdyaXRlX3NlcWNvdW50X2VuZCgmeGZybV9zdGF0ZV9oYXNoX2dlbmVyYXRpb24pOwogCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKIAogCW9zaXplID0gKG9oYXNobWFzayArIDEpICogc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKTsKKworCXN5bmNocm9uaXplX3JjdSgpOworCiAJeGZybV9oYXNoX2ZyZWUob2RzdCwgb3NpemUpOwogCXhmcm1faGFzaF9mcmVlKG9zcmMsIG9zaXplKTsKIAl4ZnJtX2hhc2hfZnJlZShvc3BpLCBvc2l6ZSk7CkBAIC0zMzIsNiArMzUwLDcgQEAKIHsKIAl0YXNrbGV0X2hydGltZXJfY2FuY2VsKCZ4LT5tdGltZXIpOwogCWRlbF90aW1lcl9zeW5jKCZ4LT5ydGltZXIpOworCWtmcmVlKHgtPmFlYWQpOwogCWtmcmVlKHgtPmFhbGcpOwogCWtmcmVlKHgtPmVhbGcpOwogCWtmcmVlKHgtPmNhbGcpOwpAQCAtMzU1LDE1ICszNzQsMTYgQEAKIAogc3RhdGljIHZvaWQgeGZybV9zdGF0ZV9nY190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5ldCwgeGZybS5zdGF0ZV9nY193b3JrKTsKIAlzdHJ1Y3QgeGZybV9zdGF0ZSAqeDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOwogCXN0cnVjdCBobGlzdF9oZWFkIGdjX2xpc3Q7CiAKIAlzcGluX2xvY2tfYmgoJnhmcm1fc3RhdGVfZ2NfbG9jayk7Ci0JaGxpc3RfbW92ZV9saXN0KCZuZXQtPnhmcm0uc3RhdGVfZ2NfbGlzdCwgJmdjX2xpc3QpOworCWhsaXN0X21vdmVfbGlzdCgmeGZybV9zdGF0ZV9nY19saXN0LCAmZ2NfbGlzdCk7CiAJc3Bpbl91bmxvY2tfYmgoJnhmcm1fc3RhdGVfZ2NfbG9jayk7CiAKKwlzeW5jaHJvbml6ZV9yY3UoKTsKKwogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoeCwgdG1wLCAmZ2NfbGlzdCwgZ2NsaXN0KQogCQl4ZnJtX3N0YXRlX2djX2Rlc3Ryb3koeCk7CiB9CkBAIC01MDAsMTQgKzUyMCwxMiBAQAogCiB2b2lkIF9feGZybV9zdGF0ZV9kZXN0cm95KHN0cnVjdCB4ZnJtX3N0YXRlICp4KQogewotCXN0cnVjdCBuZXQgKm5ldCA9IHhzX25ldCh4KTsKLQogCVdBUk5fT04oeC0+a20uc3RhdGUgIT0gWEZSTV9TVEFURV9ERUFEKTsKIAogCXNwaW5fbG9ja19iaCgmeGZybV9zdGF0ZV9nY19sb2NrKTsKLQlobGlzdF9hZGRfaGVhZCgmeC0+Z2NsaXN0LCAmbmV0LT54ZnJtLnN0YXRlX2djX2xpc3QpOworCWhsaXN0X2FkZF9oZWFkKCZ4LT5nY2xpc3QsICZ4ZnJtX3N0YXRlX2djX2xpc3QpOwogCXNwaW5fdW5sb2NrX2JoKCZ4ZnJtX3N0YXRlX2djX2xvY2spOwotCXNjaGVkdWxlX3dvcmsoJm5ldC0+eGZybS5zdGF0ZV9nY193b3JrKTsKKwlzY2hlZHVsZV93b3JrKCZ4ZnJtX3N0YXRlX2djX3dvcmspOwogfQogRVhQT1JUX1NZTUJPTChfX3hmcm1fc3RhdGVfZGVzdHJveSk7CiAKQEAgLTUyMCwxMCArNTM4LDEwIEBACiAJCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9ERUFEOwogCQlzcGluX2xvY2soJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOwogCQlsaXN0X2RlbCgmeC0+a20uYWxsKTsKLQkJaGxpc3RfZGVsKCZ4LT5ieWRzdCk7Ci0JCWhsaXN0X2RlbCgmeC0+YnlzcmMpOworCQlobGlzdF9kZWxfcmN1KCZ4LT5ieWRzdCk7CisJCWhsaXN0X2RlbF9yY3UoJngtPmJ5c3JjKTsKIAkJaWYgKHgtPmlkLnNwaSkKLQkJCWhsaXN0X2RlbCgmeC0+YnlzcGkpOworCQkJaGxpc3RfZGVsX3JjdSgmeC0+YnlzcGkpOwogCQluZXQtPnhmcm0uc3RhdGVfbnVtLS07CiAJCXNwaW5fdW5sb2NrKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKIApAQCAtNjU5LDcgKzY3Nyw3IEBACiAJdW5zaWduZWQgaW50IGggPSB4ZnJtX3NwaV9oYXNoKG5ldCwgZGFkZHIsIHNwaSwgcHJvdG8sIGZhbWlseSk7CiAJc3RydWN0IHhmcm1fc3RhdGUgKng7CiAKLQlobGlzdF9mb3JfZWFjaF9lbnRyeSh4LCBuZXQtPnhmcm0uc3RhdGVfYnlzcGkraCwgYnlzcGkpIHsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoeCwgbmV0LT54ZnJtLnN0YXRlX2J5c3BpICsgaCwgYnlzcGkpIHsKIAkJaWYgKHgtPnByb3BzLmZhbWlseSAhPSBmYW1pbHkgfHwKIAkJICAgIHgtPmlkLnNwaSAgICAgICAhPSBzcGkgfHwKIAkJICAgIHgtPmlkLnByb3RvICAgICAhPSBwcm90byB8fApAQCAtNjY4LDcgKzY4Niw4IEBACiAKIAkJaWYgKChtYXJrICYgeC0+bWFyay5tKSAhPSB4LT5tYXJrLnYpCiAJCQljb250aW51ZTsKLQkJeGZybV9zdGF0ZV9ob2xkKHgpOworCQlpZiAoIXhmcm1fc3RhdGVfaG9sZF9yY3UoeCkpCisJCQljb250aW51ZTsKIAkJcmV0dXJuIHg7CiAJfQogCkBAIC02ODMsNyArNzAyLDcgQEAKIAl1bnNpZ25lZCBpbnQgaCA9IHhmcm1fc3JjX2hhc2gobmV0LCBkYWRkciwgc2FkZHIsIGZhbWlseSk7CiAJc3RydWN0IHhmcm1fc3RhdGUgKng7CiAKLQlobGlzdF9mb3JfZWFjaF9lbnRyeSh4LCBuZXQtPnhmcm0uc3RhdGVfYnlzcmMraCwgYnlzcmMpIHsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoeCwgbmV0LT54ZnJtLnN0YXRlX2J5c3JjICsgaCwgYnlzcmMpIHsKIAkJaWYgKHgtPnByb3BzLmZhbWlseSAhPSBmYW1pbHkgfHwKIAkJICAgIHgtPmlkLnByb3RvICAgICAhPSBwcm90byB8fAogCQkgICAgIXhmcm1fYWRkcl9lcXVhbCgmeC0+aWQuZGFkZHIsIGRhZGRyLCBmYW1pbHkpIHx8CkBAIC02OTIsNyArNzExLDggQEAKIAogCQlpZiAoKG1hcmsgJiB4LT5tYXJrLm0pICE9IHgtPm1hcmsudikKIAkJCWNvbnRpbnVlOwotCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CisJCWlmICgheGZybV9zdGF0ZV9ob2xkX3JjdSh4KSkKKwkJCWNvbnRpbnVlOwogCQlyZXR1cm4geDsKIAl9CiAKQEAgLTc3NSwxMyArNzk1LDE2IEBACiAJc3RydWN0IHhmcm1fc3RhdGUgKmJlc3QgPSBOVUxMOwogCXUzMiBtYXJrID0gcG9sLT5tYXJrLnYgJiBwb2wtPm1hcmsubTsKIAl1bnNpZ25lZCBzaG9ydCBlbmNhcF9mYW1pbHkgPSB0bXBsLT5lbmNhcF9mYW1pbHk7CisJdW5zaWduZWQgaW50IHNlcXVlbmNlOwogCXN0cnVjdCBrbV9ldmVudCBjOwogCiAJdG9fcHV0ID0gTlVMTDsKIAotCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fc3RhdGVfbG9jayk7CisJc2VxdWVuY2UgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZ4ZnJtX3N0YXRlX2hhc2hfZ2VuZXJhdGlvbik7CisKKwlyY3VfcmVhZF9sb2NrKCk7CiAJaCA9IHhmcm1fZHN0X2hhc2gobmV0LCBkYWRkciwgc2FkZHIsIHRtcGwtPnJlcWlkLCBlbmNhcF9mYW1pbHkpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHgsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCtoLCBieWRzdCkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh4LCBuZXQtPnhmcm0uc3RhdGVfYnlkc3QgKyBoLCBieWRzdCkgewogCQlpZiAoeC0+cHJvcHMuZmFtaWx5ID09IGVuY2FwX2ZhbWlseSAmJgogCQkgICAgeC0+cHJvcHMucmVxaWQgPT0gdG1wbC0+cmVxaWQgJiYKIAkJICAgIChtYXJrICYgeC0+bWFyay5tKSA9PSB4LT5tYXJrLnYgJiYKQEAgLTc5Nyw3ICs4MjAsNyBAQAogCQlnb3RvIGZvdW5kOwogCiAJaF93aWxkY2FyZCA9IHhmcm1fZHN0X2hhc2gobmV0LCBkYWRkciwgJnNhZGRyX3dpbGRjYXJkLCB0bXBsLT5yZXFpZCwgZW5jYXBfZmFtaWx5KTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeSh4LCBuZXQtPnhmcm0uc3RhdGVfYnlkc3QraF93aWxkY2FyZCwgYnlkc3QpIHsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoeCwgbmV0LT54ZnJtLnN0YXRlX2J5ZHN0ICsgaF93aWxkY2FyZCwgYnlkc3QpIHsKIAkJaWYgKHgtPnByb3BzLmZhbWlseSA9PSBlbmNhcF9mYW1pbHkgJiYKIAkJICAgIHgtPnByb3BzLnJlcWlkID09IHRtcGwtPnJlcWlkICYmCiAJCSAgICAobWFyayAmIHgtPm1hcmsubSkgPT0geC0+bWFyay52ICYmCkBAIC04NTAsMTkgKzg3MywyMSBAQAogCQl9CiAKIAkJaWYgKGttX3F1ZXJ5KHgsIHRtcGwsIHBvbCkgPT0gMCkgeworCQkJc3Bpbl9sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKIAkJCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9BQ1E7CiAJCQlsaXN0X2FkZCgmeC0+a20uYWxsLCAmbmV0LT54ZnJtLnN0YXRlX2FsbCk7Ci0JCQlobGlzdF9hZGRfaGVhZCgmeC0+Ynlkc3QsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCtoKTsKKwkJCWhsaXN0X2FkZF9oZWFkX3JjdSgmeC0+Ynlkc3QsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCArIGgpOwogCQkJaCA9IHhmcm1fc3JjX2hhc2gobmV0LCBkYWRkciwgc2FkZHIsIGVuY2FwX2ZhbWlseSk7Ci0JCQlobGlzdF9hZGRfaGVhZCgmeC0+YnlzcmMsIG5ldC0+eGZybS5zdGF0ZV9ieXNyYytoKTsKKwkJCWhsaXN0X2FkZF9oZWFkX3JjdSgmeC0+YnlzcmMsIG5ldC0+eGZybS5zdGF0ZV9ieXNyYyArIGgpOwogCQkJaWYgKHgtPmlkLnNwaSkgewogCQkJCWggPSB4ZnJtX3NwaV9oYXNoKG5ldCwgJngtPmlkLmRhZGRyLCB4LT5pZC5zcGksIHgtPmlkLnByb3RvLCBlbmNhcF9mYW1pbHkpOwotCQkJCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieXNwaSwgbmV0LT54ZnJtLnN0YXRlX2J5c3BpK2gpOworCQkJCWhsaXN0X2FkZF9oZWFkX3JjdSgmeC0+YnlzcGksIG5ldC0+eGZybS5zdGF0ZV9ieXNwaSArIGgpOwogCQkJfQogCQkJeC0+bGZ0LmhhcmRfYWRkX2V4cGlyZXNfc2Vjb25kcyA9IG5ldC0+eGZybS5zeXNjdGxfYWNxX2V4cGlyZXM7CiAJCQl0YXNrbGV0X2hydGltZXJfc3RhcnQoJngtPm10aW1lciwga3RpbWVfc2V0KG5ldC0+eGZybS5zeXNjdGxfYWNxX2V4cGlyZXMsIDApLCBIUlRJTUVSX01PREVfUkVMKTsKIAkJCW5ldC0+eGZybS5zdGF0ZV9udW0rKzsKIAkJCXhmcm1faGFzaF9ncm93X2NoZWNrKG5ldCwgeC0+Ynlkc3QubmV4dCAhPSBOVUxMKTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKIAkJfSBlbHNlIHsKIAkJCXgtPmttLnN0YXRlID0gWEZSTV9TVEFURV9ERUFEOwogCQkJdG9fcHV0ID0geDsKQEAgLTg3MSwxMyArODk2LDI2IEBACiAJCX0KIAl9CiBvdXQ6Ci0JaWYgKHgpCi0JCXhmcm1fc3RhdGVfaG9sZCh4KTsKLQllbHNlCisJaWYgKHgpIHsKKwkJaWYgKCF4ZnJtX3N0YXRlX2hvbGRfcmN1KHgpKSB7CisJCQkqZXJyID0gLUVBR0FJTjsKKwkJCXggPSBOVUxMOworCQl9CisJfSBlbHNlIHsKIAkJKmVyciA9IGFjcXVpcmVfaW5fcHJvZ3Jlc3MgPyAtRUFHQUlOIDogZXJyb3I7Ci0Jc3Bpbl91bmxvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAodG9fcHV0KQogCQl4ZnJtX3N0YXRlX3B1dCh0b19wdXQpOworCisJaWYgKHJlYWRfc2VxY291bnRfcmV0cnkoJnhmcm1fc3RhdGVfaGFzaF9nZW5lcmF0aW9uLCBzZXF1ZW5jZSkpIHsKKwkJKmVyciA9IC1FQUdBSU47CisJCWlmICh4KSB7CisJCQl4ZnJtX3N0YXRlX3B1dCh4KTsKKwkJCXggPSBOVUxMOworCQl9CisJfQorCiAJcmV0dXJuIHg7CiB9CiAKQEAgLTk0NSwxNiArOTgzLDE2IEBACiAKIAloID0geGZybV9kc3RfaGFzaChuZXQsICZ4LT5pZC5kYWRkciwgJngtPnByb3BzLnNhZGRyLAogCQkJICB4LT5wcm9wcy5yZXFpZCwgeC0+cHJvcHMuZmFtaWx5KTsKLQlobGlzdF9hZGRfaGVhZCgmeC0+Ynlkc3QsIG5ldC0+eGZybS5zdGF0ZV9ieWRzdCtoKTsKKwlobGlzdF9hZGRfaGVhZF9yY3UoJngtPmJ5ZHN0LCBuZXQtPnhmcm0uc3RhdGVfYnlkc3QgKyBoKTsKIAogCWggPSB4ZnJtX3NyY19oYXNoKG5ldCwgJngtPmlkLmRhZGRyLCAmeC0+cHJvcHMuc2FkZHIsIHgtPnByb3BzLmZhbWlseSk7Ci0JaGxpc3RfYWRkX2hlYWQoJngtPmJ5c3JjLCBuZXQtPnhmcm0uc3RhdGVfYnlzcmMraCk7CisJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieXNyYywgbmV0LT54ZnJtLnN0YXRlX2J5c3JjICsgaCk7CiAKIAlpZiAoeC0+aWQuc3BpKSB7CiAJCWggPSB4ZnJtX3NwaV9oYXNoKG5ldCwgJngtPmlkLmRhZGRyLCB4LT5pZC5zcGksIHgtPmlkLnByb3RvLAogCQkJCSAgeC0+cHJvcHMuZmFtaWx5KTsKIAotCQlobGlzdF9hZGRfaGVhZCgmeC0+YnlzcGksIG5ldC0+eGZybS5zdGF0ZV9ieXNwaStoKTsKKwkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieXNwaSwgbmV0LT54ZnJtLnN0YXRlX2J5c3BpICsgaCk7CiAJfQogCiAJdGFza2xldF9ocnRpbWVyX3N0YXJ0KCZ4LT5tdGltZXIsIGt0aW1lX3NldCgxLCAwKSwgSFJUSU1FUl9NT0RFX1JFTCk7CkBAIC0xMDYzLDkgKzExMDEsOSBAQAogCQl4ZnJtX3N0YXRlX2hvbGQoeCk7CiAJCXRhc2tsZXRfaHJ0aW1lcl9zdGFydCgmeC0+bXRpbWVyLCBrdGltZV9zZXQobmV0LT54ZnJtLnN5c2N0bF9hY3FfZXhwaXJlcywgMCksIEhSVElNRVJfTU9ERV9SRUwpOwogCQlsaXN0X2FkZCgmeC0+a20uYWxsLCAmbmV0LT54ZnJtLnN0YXRlX2FsbCk7Ci0JCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieWRzdCwgbmV0LT54ZnJtLnN0YXRlX2J5ZHN0K2gpOworCQlobGlzdF9hZGRfaGVhZF9yY3UoJngtPmJ5ZHN0LCBuZXQtPnhmcm0uc3RhdGVfYnlkc3QgKyBoKTsKIAkJaCA9IHhmcm1fc3JjX2hhc2gobmV0LCBkYWRkciwgc2FkZHIsIGZhbWlseSk7Ci0JCWhsaXN0X2FkZF9oZWFkKCZ4LT5ieXNyYywgbmV0LT54ZnJtLnN0YXRlX2J5c3JjK2gpOworCQlobGlzdF9hZGRfaGVhZF9yY3UoJngtPmJ5c3JjLCBuZXQtPnhmcm0uc3RhdGVfYnlzcmMgKyBoKTsKIAogCQluZXQtPnhmcm0uc3RhdGVfbnVtKys7CiAKQEAgLTEzOTQsOSArMTQzMiw5IEBACiB7CiAJc3RydWN0IHhmcm1fc3RhdGUgKng7CiAKLQlzcGluX2xvY2tfYmgoJm5ldC0+eGZybS54ZnJtX3N0YXRlX2xvY2spOworCXJjdV9yZWFkX2xvY2soKTsKIAl4ID0gX194ZnJtX3N0YXRlX2xvb2t1cChuZXQsIG1hcmssIGRhZGRyLCBzcGksIHByb3RvLCBmYW1pbHkpOwotCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4geDsKIH0KIEVYUE9SVF9TWU1CT0woeGZybV9zdGF0ZV9sb29rdXApOwpAQCAtMTU4MSw3ICsxNjE5LDcgQEAKIAlpZiAoeC0+aWQuc3BpKSB7CiAJCXNwaW5fbG9ja19iaCgmbmV0LT54ZnJtLnhmcm1fc3RhdGVfbG9jayk7CiAJCWggPSB4ZnJtX3NwaV9oYXNoKG5ldCwgJngtPmlkLmRhZGRyLCB4LT5pZC5zcGksIHgtPmlkLnByb3RvLCB4LT5wcm9wcy5mYW1pbHkpOwotCQlobGlzdF9hZGRfaGVhZCgmeC0+YnlzcGksIG5ldC0+eGZybS5zdGF0ZV9ieXNwaStoKTsKKwkJaGxpc3RfYWRkX2hlYWRfcmN1KCZ4LT5ieXNwaSwgbmV0LT54ZnJtLnN0YXRlX2J5c3BpICsgaCk7CiAJCXNwaW5fdW5sb2NrX2JoKCZuZXQtPnhmcm0ueGZybV9zdGF0ZV9sb2NrKTsKIAogCQllcnIgPSAwOwpAQCAtMjA5OSw4ICsyMTM3LDYgQEAKIAogCW5ldC0+eGZybS5zdGF0ZV9udW0gPSAwOwogCUlOSVRfV09SSygmbmV0LT54ZnJtLnN0YXRlX2hhc2hfd29yaywgeGZybV9oYXNoX3Jlc2l6ZSk7Ci0JSU5JVF9ITElTVF9IRUFEKCZuZXQtPnhmcm0uc3RhdGVfZ2NfbGlzdCk7Ci0JSU5JVF9XT1JLKCZuZXQtPnhmcm0uc3RhdGVfZ2Nfd29yaywgeGZybV9zdGF0ZV9nY190YXNrKTsKIAlzcGluX2xvY2tfaW5pdCgmbmV0LT54ZnJtLnhmcm1fc3RhdGVfbG9jayk7CiAJcmV0dXJuIDA7CiAKQEAgLTIxMTgsNyArMjE1NCw3IEBACiAKIAlmbHVzaF93b3JrKCZuZXQtPnhmcm0uc3RhdGVfaGFzaF93b3JrKTsKIAl4ZnJtX3N0YXRlX2ZsdXNoKG5ldCwgSVBTRUNfUFJPVE9fQU5ZLCBmYWxzZSk7Ci0JZmx1c2hfd29yaygmbmV0LT54ZnJtLnN0YXRlX2djX3dvcmspOworCWZsdXNoX3dvcmsoJnhmcm1fc3RhdGVfZ2Nfd29yayk7CiAKIAlXQVJOX09OKCFsaXN0X2VtcHR5KCZuZXQtPnhmcm0uc3RhdGVfYWxsKSk7CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fc3lzY3RsLmMgYi9uZXQveGZybS94ZnJtX3N5c2N0bC5jCmluZGV4IDA1YTZlM2QuLjM1YTdlNzkgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fc3lzY3RsLmMKKysrIGIvbmV0L3hmcm0veGZybV9zeXNjdGwuYwpAQCAtMTcsMTMgKzE3LDEzIEBACiAJCS5wcm9jbmFtZQk9ICJ4ZnJtX2FldmVudF9ldGltZSIsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKHUzMiksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvdWludHZlYwogCX0sCiAJewogCQkucHJvY25hbWUJPSAieGZybV9hZXZlbnRfcnNlcXRoIiwKIAkJLm1heGxlbgkJPSBzaXplb2YodTMyKSwKIAkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG91aW50dmVjCiAJfSwKIAl7CiAJCS5wcm9jbmFtZQk9ICJ4ZnJtX2xhcnZhbF9kcm9wIiwKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fdXNlci5jIGIvbmV0L3hmcm0veGZybV91c2VyLmMKaW5kZXggZDUxNjg0NS4uMDg4OTIwOSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV91c2VyLmMKKysrIGIvbmV0L3hmcm0veGZybV91c2VyLmMKQEAgLTU4MSw5ICs1ODEsMTIgQEAKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yOwogCi0JaWYgKGF0dHJzW1hGUk1BX1NFQ19DVFhdICYmCi0JICAgIHNlY3VyaXR5X3hmcm1fc3RhdGVfYWxsb2MoeCwgbmxhX2RhdGEoYXR0cnNbWEZSTUFfU0VDX0NUWF0pKSkKLQkJZ290byBlcnJvcjsKKwlpZiAoYXR0cnNbWEZSTUFfU0VDX0NUWF0pIHsKKwkJZXJyID0gc2VjdXJpdHlfeGZybV9zdGF0ZV9hbGxvYyh4LAorCQkJCQkJbmxhX2RhdGEoYXR0cnNbWEZSTUFfU0VDX0NUWF0pKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3I7CisJfQogCiAJaWYgKChlcnIgPSB4ZnJtX2FsbG9jX3JlcGxheV9zdGF0ZV9lc24oJngtPnJlcGxheV9lc24sICZ4LT5wcmVwbGF5X2VzbiwKIAkJCQkJICAgICAgIGF0dHJzW1hGUk1BX1JFUExBWV9FU05fVkFMXSkpKQpAQCAtODk2LDcgKzg5OSw4IEBACiAJc3RydWN0IHNvY2sgKnNrID0gY2ItPnNrYi0+c2s7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCi0JeGZybV9zdGF0ZV93YWxrX2RvbmUod2FsaywgbmV0KTsKKwlpZiAoY2ItPmFyZ3NbMF0pCisJCXhmcm1fc3RhdGVfd2Fsa19kb25lKHdhbGssIG5ldCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkyMSw4ICs5MjUsNiBAQAogCQl1OCBwcm90byA9IDA7CiAJCWludCBlcnI7CiAKLQkJY2ItPmFyZ3NbMF0gPSAxOwotCiAJCWVyciA9IG5sbXNnX3BhcnNlKGNiLT5ubGgsIDAsIGF0dHJzLCBYRlJNQV9NQVgsCiAJCQkJICB4ZnJtYV9wb2xpY3kpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTkzOSw2ICs5NDEsNyBAQAogCQkJcHJvdG8gPSBubGFfZ2V0X3U4KGF0dHJzW1hGUk1BX1BST1RPXSk7CiAKIAkJeGZybV9zdGF0ZV93YWxrX2luaXQod2FsaywgcHJvdG8sIGZpbHRlcik7CisJCWNiLT5hcmdzWzBdID0gMTsKIAl9CiAKIAkodm9pZCkgeGZybV9zdGF0ZV93YWxrKG5ldCwgd2FsaywgZHVtcF9vbmVfc3RhdGUsICZpbmZvKTsKQEAgLTIwNTEsOSArMjA1NCw2IEBACiAJaWYgKHVwLT5oYXJkKSB7CiAJCXhmcm1fcG9saWN5X2RlbGV0ZSh4cCwgcC0+ZGlyKTsKIAkJeGZybV9hdWRpdF9wb2xpY3lfZGVsZXRlKHhwLCAxLCB0cnVlKTsKLQl9IGVsc2UgewotCQkvLyByZXNldCB0aGUgdGltZXJzIGhlcmU/Ci0JCVdBUk4oMSwgIkRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHNvZnQgcG9saWN5IGV4cGlyZVxuIik7CiAJfQogCWttX3BvbGljeV9leHBpcmVkKHhwLCBwLT5kaXIsIHVwLT5oYXJkLCBubGgtPm5sbXNnX3BpZCk7CiAKQEAgLTIxMTcsNyArMjExNyw3IEBACiAKIAllcnIgPSB2ZXJpZnlfbmV3cG9saWN5X2luZm8oJnVhLT5wb2xpY3kpOwogCWlmIChlcnIpCi0JCWdvdG8gYmFkX3BvbGljeTsKKwkJZ290byBmcmVlX3N0YXRlOwogCiAJLyogICBidWlsZCBhbiBYUCAqLwogCXhwID0geGZybV9wb2xpY3lfY29uc3RydWN0KG5ldCwgJnVhLT5wb2xpY3ksIGF0dHJzLCAmZXJyKTsKQEAgLTIxNDksOCArMjE0OSw2IEBACiAKIAlyZXR1cm4gMDsKIAotYmFkX3BvbGljeToKLQlXQVJOKDEsICJCQUQgcG9saWN5IHBhc3NlZFxuIik7CiBmcmVlX3N0YXRlOgogCWtmcmVlKHgpOwogbm9tZW06CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9NYWtlZmlsZSBiL3NhbXBsZXMvYnBmL01ha2VmaWxlCmluZGV4IDkwZWJmN2QuLjEyYjczMDQgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL01ha2VmaWxlCisrKyBiL3NhbXBsZXMvYnBmL01ha2VmaWxlCkBAIC0yNCw2ICsyNCw5IEBACiBob3N0cHJvZ3MteSArPSB0ZXN0X2NncnAyX2FycmF5X3BpbgogaG9zdHByb2dzLXkgKz0geGRwMQogaG9zdHByb2dzLXkgKz0geGRwMgoraG9zdHByb2dzLXkgKz0gdGVzdF9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwCitob3N0cHJvZ3MteSArPSB0cmFjZV9ldmVudAoraG9zdHByb2dzLXkgKz0gc2FtcGxlaXAKIAogdGVzdF92ZXJpZmllci1vYmpzIDo9IHRlc3RfdmVyaWZpZXIubyBsaWJicGYubwogdGVzdF9tYXBzLW9ianMgOj0gdGVzdF9tYXBzLm8gbGliYnBmLm8KQEAgLTQ5LDYgKzUyLDEwIEBACiB4ZHAxLW9ianMgOj0gYnBmX2xvYWQubyBsaWJicGYubyB4ZHAxX3VzZXIubwogIyByZXVzZSB4ZHAxIHNvdXJjZSBpbnRlbnRpb25hbGx5CiB4ZHAyLW9ianMgOj0gYnBmX2xvYWQubyBsaWJicGYubyB4ZHAxX3VzZXIubwordGVzdF9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwLW9ianMgOj0gYnBmX2xvYWQubyBsaWJicGYubyBcCisJCQkJICAgICAgIHRlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF91c2VyLm8KK3RyYWNlX2V2ZW50LW9ianMgOj0gYnBmX2xvYWQubyBsaWJicGYubyB0cmFjZV9ldmVudF91c2VyLm8KK3NhbXBsZWlwLW9ianMgOj0gYnBmX2xvYWQubyBsaWJicGYubyBzYW1wbGVpcF91c2VyLm8KIAogIyBUZWxsIGtidWlsZCB0byBhbHdheXMgYnVpbGQgdGhlIHByb2dyYW1zCiBhbHdheXMgOj0gJChob3N0cHJvZ3MteSkKQEAgLTY0LDYgKzcxLDcgQEAKIGFsd2F5cyArPSB0ZXN0X3Byb2JlX3dyaXRlX3VzZXJfa2Vybi5vCiBhbHdheXMgKz0gdHJhY2Vfb3V0cHV0X2tlcm4ubwogYWx3YXlzICs9IHRjYnBmMV9rZXJuLm8KK2Fsd2F5cyArPSB0Y2JwZjJfa2Vybi5vCiBhbHdheXMgKz0gbGF0aGlzdF9rZXJuLm8KIGFsd2F5cyArPSBvZmZ3YWtldGltZV9rZXJuLm8KIGFsd2F5cyArPSBzcGludGVzdF9rZXJuLm8KQEAgLTc0LDYgKzgyLDkgQEAKIGFsd2F5cyArPSB0ZXN0X2NncnAyX3RjX2tlcm4ubwogYWx3YXlzICs9IHhkcDFfa2Vybi5vCiBhbHdheXMgKz0geGRwMl9rZXJuLm8KK2Fsd2F5cyArPSB0ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXBfa2Vybi5vCithbHdheXMgKz0gdHJhY2VfZXZlbnRfa2Vybi5vCithbHdheXMgKz0gc2FtcGxlaXBfa2Vybi5vCiAKIEhPU1RDRkxBR1MgKz0gLUkkKG9ianRyZWUpL3Vzci9pbmNsdWRlCiAKQEAgLTk3LDYgKzEwOCw5IEBACiBIT1NUTE9BRExJQkVTX3Rlc3Rfb3ZlcmhlYWQgKz0gLWxlbGYgLWxydAogSE9TVExPQURMSUJFU194ZHAxICs9IC1sZWxmCiBIT1NUTE9BRExJQkVTX3hkcDIgKz0gLWxlbGYKK0hPU1RMT0FETElCRVNfdGVzdF9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwICs9IC1sZWxmCitIT1NUTE9BRExJQkVTX3RyYWNlX2V2ZW50ICs9IC1sZWxmCitIT1NUTE9BRExJQkVTX3NhbXBsZWlwICs9IC1sZWxmCiAKICMgQWxsb3dzIHBvaW50aW5nIExMQy9DTEFORyB0byBhIExMVk0gYmFja2VuZCB3aXRoIGJwZiBzdXBwb3J0LCByZWRlZmluZSBvbiBjbWRsaW5lOgogIyAgbWFrZSBzYW1wbGVzL2JwZi8gTExDPX4vZ2l0L2xsdm0vYnVpbGQvYmluL2xsYyBDTEFORz1+L2dpdC9sbHZtL2J1aWxkL2Jpbi9jbGFuZwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvYnBmX2hlbHBlcnMuaCBiL3NhbXBsZXMvYnBmL2JwZl9oZWxwZXJzLmgKaW5kZXggNzkyN2EwOS4uOTBmNDRiZCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9icGYvYnBmX2hlbHBlcnMuaAorKysgYi9zYW1wbGVzL2JwZi9icGZfaGVscGVycy5oCkBAIC0zNywxMiArMzcsMjYgQEAKIAkodm9pZCAqKSBCUEZfRlVOQ19jbG9uZV9yZWRpcmVjdDsKIHN0YXRpYyBpbnQgKCpicGZfcmVkaXJlY3QpKGludCBpZmluZGV4LCBpbnQgZmxhZ3MpID0KIAkodm9pZCAqKSBCUEZfRlVOQ19yZWRpcmVjdDsKLXN0YXRpYyBpbnQgKCpicGZfcGVyZl9ldmVudF9vdXRwdXQpKHZvaWQgKmN0eCwgdm9pZCAqbWFwLCBpbnQgaW5kZXgsIHZvaWQgKmRhdGEsIGludCBzaXplKSA9CitzdGF0aWMgaW50ICgqYnBmX3BlcmZfZXZlbnRfb3V0cHV0KSh2b2lkICpjdHgsIHZvaWQgKm1hcCwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBsb25nIGZsYWdzLCB2b2lkICpkYXRhLAorCQkJCSAgICBpbnQgc2l6ZSkgPQogCSh2b2lkICopIEJQRl9GVU5DX3BlcmZfZXZlbnRfb3V0cHV0Owogc3RhdGljIGludCAoKmJwZl9nZXRfc3RhY2tpZCkodm9pZCAqY3R4LCB2b2lkICptYXAsIGludCBmbGFncykgPQogCSh2b2lkICopIEJQRl9GVU5DX2dldF9zdGFja2lkOwogc3RhdGljIGludCAoKmJwZl9wcm9iZV93cml0ZV91c2VyKSh2b2lkICpkc3QsIHZvaWQgKnNyYywgaW50IHNpemUpID0KIAkodm9pZCAqKSBCUEZfRlVOQ19wcm9iZV93cml0ZV91c2VyOworc3RhdGljIGludCAoKmJwZl9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwKSh2b2lkICptYXAsIGludCBpbmRleCkgPQorCSh2b2lkICopIEJQRl9GVU5DX2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXA7CitzdGF0aWMgaW50ICgqYnBmX3NrYl9nZXRfdHVubmVsX2tleSkodm9pZCAqY3R4LCB2b2lkICprZXksIGludCBzaXplLCBpbnQgZmxhZ3MpID0KKwkodm9pZCAqKSBCUEZfRlVOQ19za2JfZ2V0X3R1bm5lbF9rZXk7CitzdGF0aWMgaW50ICgqYnBmX3NrYl9zZXRfdHVubmVsX2tleSkodm9pZCAqY3R4LCB2b2lkICprZXksIGludCBzaXplLCBpbnQgZmxhZ3MpID0KKwkodm9pZCAqKSBCUEZfRlVOQ19za2Jfc2V0X3R1bm5lbF9rZXk7CitzdGF0aWMgaW50ICgqYnBmX3NrYl9nZXRfdHVubmVsX29wdCkodm9pZCAqY3R4LCB2b2lkICptZCwgaW50IHNpemUpID0KKwkodm9pZCAqKSBCUEZfRlVOQ19za2JfZ2V0X3R1bm5lbF9vcHQ7CitzdGF0aWMgaW50ICgqYnBmX3NrYl9zZXRfdHVubmVsX29wdCkodm9pZCAqY3R4LCB2b2lkICptZCwgaW50IHNpemUpID0KKwkodm9pZCAqKSBCUEZfRlVOQ19za2Jfc2V0X3R1bm5lbF9vcHQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nICgqYnBmX2dldF9wcmFuZG9tX3UzMikodm9pZCkgPQorCSh2b2lkICopIEJQRl9GVU5DX2dldF9wcmFuZG9tX3UzMjsKIAogLyogbGx2bSBidWlsdGluIGZ1bmN0aW9ucyB0aGF0IGVCUEYgQyBwcm9ncmFtIG1heSB1c2UgdG8KICAqIGVtaXQgQlBGX0xEX0FCUyBhbmQgQlBGX0xEX0lORCBpbnN0cnVjdGlvbnMKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL2JwZl9sb2FkLmMgYi9zYW1wbGVzL2JwZi9icGZfbG9hZC5jCmluZGV4IDBjZmRhMjMuLjk3OTEzZTEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2JwZl9sb2FkLmMKKysrIGIvc2FtcGxlcy9icGYvYnBmX2xvYWQuYwpAQCAtNTEsNiArNTEsNyBAQAogCWJvb2wgaXNfa3JldHByb2JlID0gc3RybmNtcChldmVudCwgImtyZXRwcm9iZS8iLCAxMCkgPT0gMDsKIAlib29sIGlzX3RyYWNlcG9pbnQgPSBzdHJuY21wKGV2ZW50LCAidHJhY2Vwb2ludC8iLCAxMSkgPT0gMDsKIAlib29sIGlzX3hkcCA9IHN0cm5jbXAoZXZlbnQsICJ4ZHAiLCAzKSA9PSAwOworCWJvb2wgaXNfcGVyZl9ldmVudCA9IHN0cm5jbXAoZXZlbnQsICJwZXJmX2V2ZW50IiwgMTApID09IDA7CiAJZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZTsKIAljaGFyIGJ1ZlsyNTZdOwogCWludCBmZCwgZWZkLCBlcnIsIGlkOwpAQCAtNjksNiArNzAsOCBAQAogCQlwcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1RSQUNFUE9JTlQ7CiAJfSBlbHNlIGlmIChpc194ZHApIHsKIAkJcHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9YRFA7CisJfSBlbHNlIGlmIChpc19wZXJmX2V2ZW50KSB7CisJCXByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfUEVSRl9FVkVOVDsKIAl9IGVsc2UgewogCQlwcmludGYoIlVua25vd24gZXZlbnQgJyVzJ1xuIiwgZXZlbnQpOwogCQlyZXR1cm4gLTE7CkBAIC04Miw3ICs4NSw3IEBACiAKIAlwcm9nX2ZkW3Byb2dfY250KytdID0gZmQ7CiAKLQlpZiAoaXNfeGRwKQorCWlmIChpc194ZHAgfHwgaXNfcGVyZl9ldmVudCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoaXNfc29ja2V0KSB7CkBAIC0zMjYsNiArMzI5LDcgQEAKIAkJCSAgICBtZW1jbXAoc2huYW1lX3Byb2csICJrcmV0cHJvYmUvIiwgMTApID09IDAgfHwKIAkJCSAgICBtZW1jbXAoc2huYW1lX3Byb2csICJ0cmFjZXBvaW50LyIsIDExKSA9PSAwIHx8CiAJCQkgICAgbWVtY21wKHNobmFtZV9wcm9nLCAieGRwIiwgMykgPT0gMCB8fAorCQkJICAgIG1lbWNtcChzaG5hbWVfcHJvZywgInBlcmZfZXZlbnQiLCAxMCkgPT0gMCB8fAogCQkJICAgIG1lbWNtcChzaG5hbWVfcHJvZywgInNvY2tldCIsIDYpID09IDApCiAJCQkJbG9hZF9hbmRfYXR0YWNoKHNobmFtZV9wcm9nLCBpbnNucywgZGF0YV9wcm9nLT5kX3NpemUpOwogCQl9CkBAIC0zNDQsNiArMzQ4LDcgQEAKIAkJICAgIG1lbWNtcChzaG5hbWUsICJrcmV0cHJvYmUvIiwgMTApID09IDAgfHwKIAkJICAgIG1lbWNtcChzaG5hbWUsICJ0cmFjZXBvaW50LyIsIDExKSA9PSAwIHx8CiAJCSAgICBtZW1jbXAoc2huYW1lLCAieGRwIiwgMykgPT0gMCB8fAorCQkgICAgbWVtY21wKHNobmFtZSwgInBlcmZfZXZlbnQiLCAxMCkgPT0gMCB8fAogCQkgICAgbWVtY21wKHNobmFtZSwgInNvY2tldCIsIDYpID09IDApCiAJCQlsb2FkX2FuZF9hdHRhY2goc2huYW1lLCBkYXRhLT5kX2J1ZiwgZGF0YS0+ZF9zaXplKTsKIAl9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9saWJicGYuaCBiL3NhbXBsZXMvYnBmL2xpYmJwZi5oCmluZGV4IDM2NDU4MmIuLmFjNmVkYjYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2xpYmJwZi5oCisrKyBiL3NhbXBsZXMvYnBmL2xpYmJwZi5oCkBAIC04NSw2ICs4NSwxNCBAQAogCQkub2ZmICAgPSAwLAkJCQkJXAogCQkuaW1tICAgPSBJTU0gfSkKIAorI2RlZmluZSBCUEZfTU9WMzJfSU1NKERTVCwgSU1NKQkJCQkJXAorCSgoc3RydWN0IGJwZl9pbnNuKSB7CQkJCQlcCisJCS5jb2RlICA9IEJQRl9BTFUgfCBCUEZfTU9WIHwgQlBGX0ssCQlcCisJCS5kc3RfcmVnID0gRFNULAkJCQkJXAorCQkuc3JjX3JlZyA9IDAsCQkJCQlcCisJCS5vZmYgICA9IDAsCQkJCQlcCisJCS5pbW0gICA9IElNTSB9KQorCiAvKiBCUEZfTERfSU1NNjQgbWFjcm8gZW5jb2RlcyBzaW5nbGUgJ2xvYWQgNjQtYml0IGltbWVkaWF0ZScgaW5zbiAqLwogI2RlZmluZSBCUEZfTERfSU1NNjQoRFNULCBJTU0pCQkJCQlcCiAJQlBGX0xEX0lNTTY0X1JBVyhEU1QsIDAsIElNTSkKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3NhbXBsZWlwX2tlcm4uYyBiL3NhbXBsZXMvYnBmL3NhbXBsZWlwX2tlcm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzRhNjgxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9icGYvc2FtcGxlaXBfa2Vybi5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIENvcHlyaWdodCAyMDE2IE5ldGZsaXgsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9icGZfcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgImJwZl9oZWxwZXJzLmgiCisKKyNkZWZpbmUgTUFYX0lQUwkJODE5MgorCitzdHJ1Y3QgYnBmX21hcF9kZWYgU0VDKCJtYXBzIikgaXBfbWFwID0geworCS50eXBlID0gQlBGX01BUF9UWVBFX0hBU0gsCisJLmtleV9zaXplID0gc2l6ZW9mKHU2NCksCisJLnZhbHVlX3NpemUgPSBzaXplb2YodTMyKSwKKwkubWF4X2VudHJpZXMgPSBNQVhfSVBTLAorfTsKKworU0VDKCJwZXJmX2V2ZW50IikKK2ludCBkb19zYW1wbGUoc3RydWN0IGJwZl9wZXJmX2V2ZW50X2RhdGEgKmN0eCkKK3sKKwl1NjQgaXA7CisJdTMyICp2YWx1ZSwgaW5pdF92YWwgPSAxOworCisJaXAgPSBjdHgtPnJlZ3MuaXA7CisJdmFsdWUgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZpcF9tYXAsICZpcCk7CisJaWYgKHZhbHVlKQorCQkqdmFsdWUgKz0gMTsKKwllbHNlCisJCS8qIEUyQklHIG5vdCB0ZXN0ZWQgZm9yIHRoaXMgZXhhbXBsZSBvbmx5ICovCisJCWJwZl9tYXBfdXBkYXRlX2VsZW0oJmlwX21hcCwgJmlwLCAmaW5pdF92YWwsIEJQRl9OT0VYSVNUKTsKKworCXJldHVybiAwOworfQorY2hhciBfbGljZW5zZVtdIFNFQygibGljZW5zZSIpID0gIkdQTCI7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9zYW1wbGVpcF91c2VyLmMgYi9zYW1wbGVzL2JwZi9zYW1wbGVpcF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwYTZiZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3NhbXBsZWlwX3VzZXIuYwpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIHNhbXBsZWlwOiBzYW1wbGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBhbmQgZnJlcXVlbmN5IGNvdW50IGluIGEgQlBGIG1hcC4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBOZXRmbGl4LCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlICJsaWJicGYuaCIKKyNpbmNsdWRlICJicGZfbG9hZC5oIgorCisjZGVmaW5lIERFRkFVTFRfRlJFUQk5OQorI2RlZmluZSBERUZBVUxUX1NFQ1MJNQorI2RlZmluZSBNQVhfSVBTCQk4MTkyCisjZGVmaW5lIFBBR0VfT0ZGU0VUCTB4ZmZmZjg4MDAwMDAwMDAwMAorCitzdGF0aWMgaW50IG5yX2NwdXM7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJcHJpbnRmKCJVU0FHRTogc2FtcGxlaXAgWy1GIGZyZXFdIFtkdXJhdGlvbl1cbiIpOworCXByaW50ZigiICAgICAgIC1GIGZyZXEgICAgIyBzYW1wbGUgZnJlcXVlbmN5IChIZXJ0eiksIGRlZmF1bHQgOTlcbiIpOworCXByaW50ZigiICAgICAgIGR1cmF0aW9uICAgIyBzYW1wbGluZyBkdXJhdGlvbiAoc2Vjb25kcyksIGRlZmF1bHQgNVxuIik7Cit9CisKK3N0YXRpYyBpbnQgc2FtcGxpbmdfc3RhcnQoaW50ICpwbXVfZmQsIGludCBmcmVxKQoreworCWludCBpOworCisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBwZV9zYW1wbGVfYXR0ciA9IHsKKwkJLnR5cGUgPSBQRVJGX1RZUEVfU09GVFdBUkUsCisJCS5mcmVxID0gMSwKKwkJLnNhbXBsZV9wZXJpb2QgPSBmcmVxLAorCQkuY29uZmlnID0gUEVSRl9DT1VOVF9TV19DUFVfQ0xPQ0ssCisJCS5pbmhlcml0ID0gMSwKKwl9OworCisJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykgeworCQlwbXVfZmRbaV0gPSBwZXJmX2V2ZW50X29wZW4oJnBlX3NhbXBsZV9hdHRyLCAtMSAvKiBwaWQgKi8sIGksCisJCQkJCSAgICAtMSAvKiBncm91cF9mZCAqLywgMCAvKiBmbGFncyAqLyk7CisJCWlmIChwbXVfZmRbaV0gPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBJbml0aWFsaXppbmcgcGVyZiBzYW1wbGluZ1xuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlhc3NlcnQoaW9jdGwocG11X2ZkW2ldLCBQRVJGX0VWRU5UX0lPQ19TRVRfQlBGLAorCQkJICAgICBwcm9nX2ZkWzBdKSA9PSAwKTsKKwkJYXNzZXJ0KGlvY3RsKHBtdV9mZFtpXSwgUEVSRl9FVkVOVF9JT0NfRU5BQkxFLCAwKSA9PSAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2FtcGxpbmdfZW5kKGludCAqcG11X2ZkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykKKwkJY2xvc2UocG11X2ZkW2ldKTsKK30KKworc3RydWN0IGlwY291bnQgeworCV9fdTY0IGlwOworCV9fdTMyIGNvdW50OworfTsKKworLyogdXNlZCBmb3Igc29ydGluZyAqLworc3RydWN0IGlwY291bnQgY291bnRzW01BWF9JUFNdOworCitzdGF0aWMgaW50IGNvdW50X2NtcChjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCit7CisJcmV0dXJuICgoc3RydWN0IGlwY291bnQgKilwMSktPmNvdW50IC0gKChzdHJ1Y3QgaXBjb3VudCAqKXAyKS0+Y291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2lwX21hcChpbnQgZmQpCit7CisJc3RydWN0IGtzeW0gKnN5bTsKKwlfX3U2NCBrZXksIG5leHRfa2V5OworCV9fdTMyIHZhbHVlOworCWludCBpLCBtYXg7CisKKwlwcmludGYoIiUtMTlzICUtMzJzICVzXG4iLCAiQUREUiIsICJLU1lNIiwgIkNPVU5UIik7CisKKwkvKiBmZXRjaCBJUHMgYW5kIGNvdW50cyAqLworCWtleSA9IDAsIGkgPSAwOworCXdoaWxlIChicGZfZ2V0X25leHRfa2V5KGZkLCAma2V5LCAmbmV4dF9rZXkpID09IDApIHsKKwkJYnBmX2xvb2t1cF9lbGVtKGZkLCAmbmV4dF9rZXksICZ2YWx1ZSk7CisJCWNvdW50c1tpXS5pcCA9IG5leHRfa2V5OworCQljb3VudHNbaSsrXS5jb3VudCA9IHZhbHVlOworCQlrZXkgPSBuZXh0X2tleTsKKwl9CisJbWF4ID0gaTsKKworCS8qIHNvcnQgYW5kIHByaW50ICovCisJcXNvcnQoY291bnRzLCBtYXgsIHNpemVvZihzdHJ1Y3QgaXBjb3VudCksIGNvdW50X2NtcCk7CisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCWlmIChjb3VudHNbaV0uaXAgPiBQQUdFX09GRlNFVCkgeworCQkJc3ltID0ga3N5bV9zZWFyY2goY291bnRzW2ldLmlwKTsKKwkJCXByaW50ZigiMHglLTE3bGx4ICUtMzJzICV1XG4iLCBjb3VudHNbaV0uaXAsIHN5bS0+bmFtZSwKKwkJCSAgICAgICBjb3VudHNbaV0uY291bnQpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIweCUtMTdsbHggJS0zMnMgJXVcbiIsIGNvdW50c1tpXS5pcCwgIih1c2VyKSIsCisJCQkgICAgICAgY291bnRzW2ldLmNvdW50KTsKKwkJfQorCX0KKworCWlmIChtYXggPT0gTUFYX0lQUykgeworCQlwcmludGYoIldBUk5JTkc6IElQIGhhc2ggd2FzIGZ1bGwgKG1heCAlZCBlbnRyaWVzKTsgIiwgbWF4KTsKKwkJcHJpbnRmKCJtYXkgaGF2ZSBkcm9wcGVkIHNhbXBsZXNcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgaW50X2V4aXQoaW50IHNpZykKK3sKKwlwcmludGYoIlxuIik7CisJcHJpbnRfaXBfbWFwKG1hcF9mZFswXSk7CisJZXhpdCgwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgZmlsZW5hbWVbMjU2XTsKKwlpbnQgKnBtdV9mZCwgb3B0LCBmcmVxID0gREVGQVVMVF9GUkVRLCBzZWNzID0gREVGQVVMVF9TRUNTOworCisJLyogcHJvY2VzcyBhcmd1bWVudHMgKi8KKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiRjpoIikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ0YnOgorCQkJZnJlcSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoYXJnYyAtIG9wdGluZCA9PSAxKQorCQlzZWNzID0gYXRvaShhcmd2W29wdGluZF0pOworCWlmIChmcmVxID09IDAgfHwgc2VjcyA9PSAwKSB7CisJCXVzYWdlKCk7CisJCXJldHVybiAxOworCX0KKworCS8qIGluaXRpYWxpemUga2VybmVsIHN5bWJvbCB0cmFuc2xhdGlvbiAqLworCWlmIChsb2FkX2thbGxzeW1zKCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogbG9hZGluZyAvcHJvYy9rYWxsc3ltc1xuIik7CisJCXJldHVybiAyOworCX0KKworCS8qIGNyZWF0ZSBwZXJmIEZEcyBmb3IgZWFjaCBDUFUgKi8KKwlucl9jcHVzID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfQ09ORik7CisJcG11X2ZkID0gbWFsbG9jKG5yX2NwdXMgKiBzaXplb2YoaW50KSk7CisJaWYgKHBtdV9mZCA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IG1hbGxvYyBvZiBwbXVfZmRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBsb2FkIEJQRiBwcm9ncmFtICovCisJc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlc19rZXJuLm8iLCBhcmd2WzBdKTsKKwlpZiAobG9hZF9icGZfZmlsZShmaWxlbmFtZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJFUlJPUjogbG9hZGluZyBCUEYgcHJvZ3JhbSAoZXJybm8gJWQpOlxuIiwKKwkJCWVycm5vKTsKKwkJaWYgKHN0cmNtcChicGZfbG9nX2J1ZiwgIiIpID09IDApCisJCQlmcHJpbnRmKHN0ZGVyciwgIlRyeTogdWxpbWl0IC1sIHVubGltaXRlZFxuIik7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBicGZfbG9nX2J1Zik7CisJCXJldHVybiAxOworCX0KKwlzaWduYWwoU0lHSU5ULCBpbnRfZXhpdCk7CisKKwkvKiBkbyBzYW1wbGluZyAqLworCXByaW50ZigiU2FtcGxpbmcgYXQgJWQgSGVydHogZm9yICVkIHNlY29uZHMuIEN0cmwtQyBhbHNvIGVuZHMuXG4iLAorCSAgICAgICBmcmVxLCBzZWNzKTsKKwlpZiAoc2FtcGxpbmdfc3RhcnQocG11X2ZkLCBmcmVxKSAhPSAwKQorCQlyZXR1cm4gMTsKKwlzbGVlcChzZWNzKTsKKwlzYW1wbGluZ19lbmQocG11X2ZkKTsKKwlmcmVlKHBtdV9mZCk7CisKKwkvKiBvdXRwdXQgc2FtcGxlIGNvdW50cyAqLworCXByaW50X2lwX21hcChtYXBfZmRbMF0pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9zb2NrZXgyX2tlcm4uYyBiL3NhbXBsZXMvYnBmL3NvY2tleDJfa2Vybi5jCmluZGV4IGJhMGUxNzcuLjQ0ZTU4NDYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL3NvY2tleDJfa2Vybi5jCisrKyBiL3NhbXBsZXMvYnBmL3NvY2tleDJfa2Vybi5jCkBAIC0xNCw3ICsxNCw3IEBACiAJX19iZTE2IGhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CiB9OwogCi1zdHJ1Y3QgZmxvd19rZXlzIHsKK3N0cnVjdCBicGZfZmxvd19rZXlzIHsKIAlfX2JlMzIgc3JjOwogCV9fYmUzMiBkc3Q7CiAJdW5pb24gewpAQCAtNTksNyArNTksNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIF9fdTY0IHBhcnNlX2lwKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgX191NjQgbmhvZmYsIF9fdTY0ICppcF9wcm90bywKLQkJCSAgICAgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKKwkJCSAgICAgc3RydWN0IGJwZl9mbG93X2tleXMgKmZsb3cpCiB7CiAJX191NjQgdmVybGVuOwogCkBAIC04Myw3ICs4Myw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgX191NjQgcGFyc2VfaXB2NihzdHJ1Y3QgX19za19idWZmICpza2IsIF9fdTY0IG5ob2ZmLCBfX3U2NCAqaXBfcHJvdG8sCi0JCQkgICAgICAgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKKwkJCSAgICAgICBzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyAqZmxvdykKIHsKIAkqaXBfcHJvdG8gPSBsb2FkX2J5dGUoc2tiLAogCQkJICAgICAgbmhvZmYgKyBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwgbmV4dGhkcikpOwpAQCAtOTYsNyArOTYsNyBAQAogCXJldHVybiBuaG9mZjsKIH0KIAotc3RhdGljIGlubGluZSBib29sIGZsb3dfZGlzc2VjdG9yKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyBpbmxpbmUgYm9vbCBmbG93X2Rpc3NlY3RvcihzdHJ1Y3QgX19za19idWZmICpza2IsIHN0cnVjdCBicGZfZmxvd19rZXlzICpmbG93KQogewogCV9fdTY0IG5ob2ZmID0gRVRIX0hMRU47CiAJX191NjQgaXBfcHJvdG87CkBAIC0xOTgsNyArMTk4LDcgQEAKIFNFQygic29ja2V0MiIpCiBpbnQgYnBmX3Byb2cyKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgZmxvd19rZXlzIGZsb3c7CisJc3RydWN0IGJwZl9mbG93X2tleXMgZmxvdzsKIAlzdHJ1Y3QgcGFpciAqdmFsdWU7CiAJdTMyIGtleTsKIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvc29ja2V4M19rZXJuLmMgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX2tlcm4uYwppbmRleCA0MWFlMmZkLi45NTkwN2Y4IDEwMDY0NAotLS0gYS9zYW1wbGVzL2JwZi9zb2NrZXgzX2tlcm4uYworKysgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX2tlcm4uYwpAQCAtNjEsNyArNjEsNyBAQAogCV9fYmUxNiBoX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvOwogfTsKIAotc3RydWN0IGZsb3dfa2V5cyB7CitzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyB7CiAJX19iZTMyIHNyYzsKIAlfX2JlMzIgZHN0OwogCXVuaW9uIHsKQEAgLTg4LDcgKzg4LDcgQEAKIH0KIAogc3RydWN0IGdsb2JhbHMgewotCXN0cnVjdCBmbG93X2tleXMgZmxvdzsKKwlzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyBmbG93OwogfTsKIAogc3RydWN0IGJwZl9tYXBfZGVmIFNFQygibWFwcyIpIHBlcmNwdV9tYXAgPSB7CkBAIC0xMTQsMTQgKzExNCwxNCBAQAogCiBzdHJ1Y3QgYnBmX21hcF9kZWYgU0VDKCJtYXBzIikgaGFzaF9tYXAgPSB7CiAJLnR5cGUgPSBCUEZfTUFQX1RZUEVfSEFTSCwKLQkua2V5X3NpemUgPSBzaXplb2Yoc3RydWN0IGZsb3dfa2V5cyksCisJLmtleV9zaXplID0gc2l6ZW9mKHN0cnVjdCBicGZfZmxvd19rZXlzKSwKIAkudmFsdWVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGFpciksCiAJLm1heF9lbnRyaWVzID0gMTAyNCwKIH07CiAKIHN0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0cyhzdHJ1Y3QgX19za19idWZmICpza2IsIHN0cnVjdCBnbG9iYWxzICpnKQogewotCXN0cnVjdCBmbG93X2tleXMga2V5ID0gZy0+ZmxvdzsKKwlzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyBrZXkgPSBnLT5mbG93OwogCXN0cnVjdCBwYWlyICp2YWx1ZTsKIAogCXZhbHVlID0gYnBmX21hcF9sb29rdXBfZWxlbSgmaGFzaF9tYXAsICZrZXkpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvc29ja2V4M191c2VyLmMgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX3VzZXIuYwppbmRleCBkNDE4NGFiLi4zZmNmZDhjIDEwMDY0NAotLS0gYS9zYW1wbGVzL2JwZi9zb2NrZXgzX3VzZXIuYworKysgYi9zYW1wbGVzL2JwZi9zb2NrZXgzX3VzZXIuYwpAQCAtNyw3ICs3LDcgQEAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KIAotc3RydWN0IGZsb3dfa2V5cyB7CitzdHJ1Y3QgYnBmX2Zsb3dfa2V5cyB7CiAJX19iZTMyIHNyYzsKIAlfX2JlMzIgZHN0OwogCXVuaW9uIHsKQEAgLTQ5LDcgKzQ5LDcgQEAKIAkodm9pZCkgZjsKIAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJc3RydWN0IGZsb3dfa2V5cyBrZXkgPSB7fSwgbmV4dF9rZXk7CisJCXN0cnVjdCBicGZfZmxvd19rZXlzIGtleSA9IHt9LCBuZXh0X2tleTsKIAkJc3RydWN0IHBhaXIgdmFsdWU7CiAKIAkJc2xlZXAoMSk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90Y2JwZjJfa2Vybi5jIGIvc2FtcGxlcy9icGYvdGNicGYyX2tlcm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAzYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9icGYvdGNicGYyX2tlcm4uYwpAQCAtMCwwICsxLDM4MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2IFZNd2FyZQorICogQ29weXJpZ2h0IChjKSAyMDE2IEZhY2Vib29rCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaWZfcGFja2V0Lmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9pcC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaW4uaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3RjcC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvZmlsdGVyLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9wa3RfY2xzLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlICJicGZfaGVscGVycy5oIgorCisjZGVmaW5lIF9odG9ubCBfX2J1aWx0aW5fYnN3YXAzMgorI2RlZmluZSBFUlJPUihyZXQpIGRvIHtcCisJCWNoYXIgZm10W10gPSAiRVJST1IgbGluZTolZCByZXQ6JWRcbiI7XAorCQlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIF9fTElORV9fLCByZXQpOyBcCisJfSB3aGlsZSgwKQorCitzdHJ1Y3QgZ2VuZXZlX29wdCB7CisJX19iZTE2CW9wdF9jbGFzczsKKwl1OAl0eXBlOworCXU4CWxlbmd0aDo1OworCXU4CXIzOjE7CisJdTgJcjI6MTsKKwl1OAlyMToxOworCXU4CW9wdF9kYXRhWzhdOyAvKiBoYXJkLWNvZGVkIHRvIDggYnl0ZSAqLworfTsKKworc3RydWN0IHZ4bGFuX21ldGFkYXRhIHsKKwl1MzIgICAgIGdicDsKK307CisKK1NFQygiZ3JlX3NldF90dW5uZWwiKQoraW50IF9ncmVfc2V0X3R1bm5lbChzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5OworCisJX19idWlsdGluX21lbXNldCgma2V5LCAweDAsIHNpemVvZihrZXkpKTsKKwlrZXkucmVtb3RlX2lwdjQgPSAweGFjMTAwMTY0OyAvKiAxNzIuMTYuMS4xMDAgKi8KKwlrZXkudHVubmVsX2lkID0gMjsKKwlrZXkudHVubmVsX3RvcyA9IDA7CisJa2V5LnR1bm5lbF90dGwgPSA2NDsKKworCXJldCA9IGJwZl9za2Jfc2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgQlBGX0ZfWkVST19DU1VNX1RYKTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJncmVfZ2V0X3R1bm5lbCIpCitpbnQgX2dyZV9nZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJY2hhciBmbXRbXSA9ICJrZXkgJWQgcmVtb3RlIGlwIDB4JXhcbiI7CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIDApOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIGtleS50dW5uZWxfaWQsIGtleS5yZW1vdGVfaXB2NCk7CisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJ2eGxhbl9zZXRfdHVubmVsIikKK2ludCBfdnhsYW5fc2V0X3R1bm5lbChzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5OworCXN0cnVjdCB2eGxhbl9tZXRhZGF0YSBtZDsKKworCV9fYnVpbHRpbl9tZW1zZXQoJmtleSwgMHgwLCBzaXplb2Yoa2V5KSk7CisJa2V5LnJlbW90ZV9pcHY0ID0gMHhhYzEwMDE2NDsgLyogMTcyLjE2LjEuMTAwICovCisJa2V5LnR1bm5lbF9pZCA9IDI7CisJa2V5LnR1bm5lbF90b3MgPSAwOworCWtleS50dW5uZWxfdHRsID0gNjQ7CisKKwlyZXQgPSBicGZfc2tiX3NldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIEJQRl9GX1pFUk9fQ1NVTV9UWCk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCW1kLmdicCA9IDB4ODAwRkY7IC8qIFNldCBWWExBTiBHcm91cCBQb2xpY3kgZXh0ZW5zaW9uICovCisJcmV0ID0gYnBmX3NrYl9zZXRfdHVubmVsX29wdChza2IsICZtZCwgc2l6ZW9mKG1kKSk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygidnhsYW5fZ2V0X3R1bm5lbCIpCitpbnQgX3Z4bGFuX2dldF90dW5uZWwoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWludCByZXQ7CisJc3RydWN0IGJwZl90dW5uZWxfa2V5IGtleTsKKwlzdHJ1Y3QgdnhsYW5fbWV0YWRhdGEgbWQ7CisJY2hhciBmbXRbXSA9ICJrZXkgJWQgcmVtb3RlIGlwIDB4JXggdnhsYW4gZ2JwIDB4JXhcbiI7CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIDApOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfb3B0KHNrYiwgJm1kLCBzaXplb2YobWQpKTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLAorCQkJa2V5LnR1bm5lbF9pZCwga2V5LnJlbW90ZV9pcHY0LCBtZC5nYnApOworCisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJnZW5ldmVfc2V0X3R1bm5lbCIpCitpbnQgX2dlbmV2ZV9zZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0LCByZXQyOworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJc3RydWN0IGdlbmV2ZV9vcHQgZ29wdDsKKworCV9fYnVpbHRpbl9tZW1zZXQoJmtleSwgMHgwLCBzaXplb2Yoa2V5KSk7CisJa2V5LnJlbW90ZV9pcHY0ID0gMHhhYzEwMDE2NDsgLyogMTcyLjE2LjEuMTAwICovCisJa2V5LnR1bm5lbF9pZCA9IDI7CisJa2V5LnR1bm5lbF90b3MgPSAwOworCWtleS50dW5uZWxfdHRsID0gNjQ7CisKKwlfX2J1aWx0aW5fbWVtc2V0KCZnb3B0LCAweDAsIHNpemVvZihnb3B0KSk7CisJZ29wdC5vcHRfY2xhc3MgPSAweDEwMjsgLyogT3BlbiBWaXJ0dWFsIE5ldHdvcmtpbmcgKE9WTikgKi8KKwlnb3B0LnR5cGUgPSAweDA4OworCWdvcHQucjEgPSAxOworCWdvcHQucjIgPSAwOworCWdvcHQucjMgPSAxOworCWdvcHQubGVuZ3RoID0gMjsgLyogNC1ieXRlIG11bHRpcGxlICovCisJKihpbnQgKikgJmdvcHQub3B0X2RhdGEgPSAweGRlYWRiZWVmOworCisJcmV0ID0gYnBmX3NrYl9zZXRfdHVubmVsX2tleShza2IsICZrZXksIHNpemVvZihrZXkpLCBCUEZfRl9aRVJPX0NTVU1fVFgpOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlyZXQgPSBicGZfc2tiX3NldF90dW5uZWxfb3B0KHNrYiwgJmdvcHQsIHNpemVvZihnb3B0KSk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiZ2VuZXZlX2dldF90dW5uZWwiKQoraW50IF9nZW5ldmVfZ2V0X3R1bm5lbChzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5OworCXN0cnVjdCBnZW5ldmVfb3B0IGdvcHQ7CisJY2hhciBmbXRbXSA9ICJrZXkgJWQgcmVtb3RlIGlwIDB4JXggZ2VuZXZlIGNsYXNzIDB4JXhcbiI7CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIDApOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlyZXQgPSBicGZfc2tiX2dldF90dW5uZWxfb3B0KHNrYiwgJmdvcHQsIHNpemVvZihnb3B0KSk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWJwZl90cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwKKwkJCWtleS50dW5uZWxfaWQsIGtleS5yZW1vdGVfaXB2NCwgZ29wdC5vcHRfY2xhc3MpOworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiaXBpcF9zZXRfdHVubmVsIikKK2ludCBfaXBpcF9zZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5ID0ge307CisJdm9pZCAqZGF0YSA9ICh2b2lkICopKGxvbmcpc2tiLT5kYXRhOworCXN0cnVjdCBpcGhkciAqaXBoID0gZGF0YTsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSBkYXRhICsgc2l6ZW9mKCppcGgpOworCXZvaWQgKmRhdGFfZW5kID0gKHZvaWQgKikobG9uZylza2ItPmRhdGFfZW5kOworCWludCByZXQ7CisKKwkvKiBzaW5nbGUgbGVuZ3RoIGNoZWNrICovCisJaWYgKGRhdGEgKyBzaXplb2YoKmlwaCkgKyBzaXplb2YoKnRjcCkgPiBkYXRhX2VuZCkgeworCQlFUlJPUigxKTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWtleS50dW5uZWxfdHRsID0gNjQ7CisJaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CisJCWtleS5yZW1vdGVfaXB2NCA9IDB4YWMxMDAxNjQ7IC8qIDE3Mi4xNi4xLjEwMCAqLworCX0gZWxzZSB7CisJCWlmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQIHx8IGlwaC0+aWhsICE9IDUpCisJCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisKKwkJaWYgKHRjcC0+ZGVzdCA9PSBodG9ucyg1MjAwKSkKKwkJCWtleS5yZW1vdGVfaXB2NCA9IDB4YWMxMDAxNjQ7IC8qIDE3Mi4xNi4xLjEwMCAqLworCQllbHNlIGlmICh0Y3AtPmRlc3QgPT0gaHRvbnMoNTIwMSkpCisJCQlrZXkucmVtb3RlX2lwdjQgPSAweGFjMTAwMTY1OyAvKiAxNzIuMTYuMS4xMDEgKi8KKwkJZWxzZQorCQkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldCA9IGJwZl9za2Jfc2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiaXBpcF9nZXRfdHVubmVsIikKK2ludCBfaXBpcF9nZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJY2hhciBmbXRbXSA9ICJyZW1vdGUgaXAgMHgleFxuIjsKKworCXJldCA9IGJwZl9za2JfZ2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWJwZl90cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwga2V5LnJlbW90ZV9pcHY0KTsKKwlyZXR1cm4gVENfQUNUX09LOworfQorCitTRUMoImlwaXA2X3NldF90dW5uZWwiKQoraW50IF9pcGlwNl9zZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYnBmX3R1bm5lbF9rZXkga2V5ID0ge307CisJdm9pZCAqZGF0YSA9ICh2b2lkICopKGxvbmcpc2tiLT5kYXRhOworCXN0cnVjdCBpcGhkciAqaXBoID0gZGF0YTsKKwlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSBkYXRhICsgc2l6ZW9mKCppcGgpOworCXZvaWQgKmRhdGFfZW5kID0gKHZvaWQgKikobG9uZylza2ItPmRhdGFfZW5kOworCWludCByZXQ7CisKKwkvKiBzaW5nbGUgbGVuZ3RoIGNoZWNrICovCisJaWYgKGRhdGEgKyBzaXplb2YoKmlwaCkgKyBzaXplb2YoKnRjcCkgPiBkYXRhX2VuZCkgeworCQlFUlJPUigxKTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCWtleS5yZW1vdGVfaXB2NlswXSA9IF9odG9ubCgweDI0MDFkYjAwKTsKKwlrZXkudHVubmVsX3R0bCA9IDY0OworCisJaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19JQ01QKSB7CisJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgxKTsKKwl9IGVsc2UgeworCQlpZiAoaXBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCB8fCBpcGgtPmlobCAhPSA1KSB7CisJCQlFUlJPUihpcGgtPnByb3RvY29sKTsKKwkJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwkJfQorCisJCWlmICh0Y3AtPmRlc3QgPT0gaHRvbnMoNTIwMCkpIHsKKwkJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgxKTsKKwkJfSBlbHNlIGlmICh0Y3AtPmRlc3QgPT0gaHRvbnMoNTIwMSkpIHsKKwkJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgyKTsKKwkJfSBlbHNlIHsKKwkJCUVSUk9SKHRjcC0+ZGVzdCk7CisJCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJCX0KKwl9CisKKwlyZXQgPSBicGZfc2tiX3NldF90dW5uZWxfa2V5KHNrYiwgJmtleSwgc2l6ZW9mKGtleSksIEJQRl9GX1RVTklORk9fSVBWNik7CisJaWYgKHJldCA8IDApIHsKKwkJRVJST1IocmV0KTsKKwkJcmV0dXJuIFRDX0FDVF9TSE9UOworCX0KKworCXJldHVybiBUQ19BQ1RfT0s7Cit9CisKK1NFQygiaXBpcDZfZ2V0X3R1bm5lbCIpCitpbnQgX2lwaXA2X2dldF90dW5uZWwoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCWludCByZXQ7CisJc3RydWN0IGJwZl90dW5uZWxfa2V5IGtleTsKKwljaGFyIGZtdFtdID0gInJlbW90ZSBpcDYgJXg6OiV4XG4iOworCisJcmV0ID0gYnBmX3NrYl9nZXRfdHVubmVsX2tleShza2IsICZrZXksIHNpemVvZihrZXkpLCBCUEZfRl9UVU5JTkZPX0lQVjYpOworCWlmIChyZXQgPCAwKSB7CisJCUVSUk9SKHJldCk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIF9odG9ubChrZXkucmVtb3RlX2lwdjZbMF0pLAorCQkJIF9odG9ubChrZXkucmVtb3RlX2lwdjZbM10pKTsKKwlyZXR1cm4gVENfQUNUX09LOworfQorCitTRUMoImlwNmlwNl9zZXRfdHVubmVsIikKK2ludCBfaXA2aXA2X3NldF90dW5uZWwoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXkgPSB7fTsKKwl2b2lkICpkYXRhID0gKHZvaWQgKikobG9uZylza2ItPmRhdGE7CisJc3RydWN0IGlwdjZoZHIgKmlwaCA9IGRhdGE7CisJc3RydWN0IHRjcGhkciAqdGNwID0gZGF0YSArIHNpemVvZigqaXBoKTsKKwl2b2lkICpkYXRhX2VuZCA9ICh2b2lkICopKGxvbmcpc2tiLT5kYXRhX2VuZDsKKwlpbnQgcmV0OworCisJLyogc2luZ2xlIGxlbmd0aCBjaGVjayAqLworCWlmIChkYXRhICsgc2l6ZW9mKCppcGgpICsgc2l6ZW9mKCp0Y3ApID4gZGF0YV9lbmQpIHsKKwkJRVJST1IoMSk7CisJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwl9CisKKwlrZXkucmVtb3RlX2lwdjZbMF0gPSBfaHRvbmwoMHgyNDAxZGIwMCk7CisJa2V5LnR1bm5lbF90dGwgPSA2NDsKKworCWlmIChpcGgtPm5leHRoZHIgPT0gTkVYVEhEUl9JQ01QKSB7CisJCWtleS5yZW1vdGVfaXB2NlszXSA9IF9odG9ubCgxKTsKKwl9IGVsc2UgeworCQlpZiAoaXBoLT5uZXh0aGRyICE9IE5FWFRIRFJfVENQKSB7CisJCQlFUlJPUihpcGgtPm5leHRoZHIpOworCQkJcmV0dXJuIFRDX0FDVF9TSE9UOworCQl9CisKKwkJaWYgKHRjcC0+ZGVzdCA9PSBodG9ucyg1MjAwKSkgeworCQkJa2V5LnJlbW90ZV9pcHY2WzNdID0gX2h0b25sKDEpOworCQl9IGVsc2UgaWYgKHRjcC0+ZGVzdCA9PSBodG9ucyg1MjAxKSkgeworCQkJa2V5LnJlbW90ZV9pcHY2WzNdID0gX2h0b25sKDIpOworCQl9IGVsc2UgeworCQkJRVJST1IodGNwLT5kZXN0KTsKKwkJCXJldHVybiBUQ19BQ1RfU0hPVDsKKwkJfQorCX0KKworCXJldCA9IGJwZl9za2Jfc2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgQlBGX0ZfVFVOSU5GT19JUFY2KTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworU0VDKCJpcDZpcDZfZ2V0X3R1bm5lbCIpCitpbnQgX2lwNmlwNl9nZXRfdHVubmVsKHN0cnVjdCBfX3NrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBicGZfdHVubmVsX2tleSBrZXk7CisJY2hhciBmbXRbXSA9ICJyZW1vdGUgaXA2ICV4OjoleFxuIjsKKworCXJldCA9IGJwZl9za2JfZ2V0X3R1bm5lbF9rZXkoc2tiLCAma2V5LCBzaXplb2Yoa2V5KSwgQlBGX0ZfVFVOSU5GT19JUFY2KTsKKwlpZiAocmV0IDwgMCkgeworCQlFUlJPUihyZXQpOworCQlyZXR1cm4gVENfQUNUX1NIT1Q7CisJfQorCisJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLCBfaHRvbmwoa2V5LnJlbW90ZV9pcHY2WzBdKSwKKwkJCSBfaHRvbmwoa2V5LnJlbW90ZV9pcHY2WzNdKSk7CisJcmV0dXJuIFRDX0FDVF9PSzsKK30KKworCitjaGFyIF9saWNlbnNlW10gU0VDKCJsaWNlbnNlIikgPSAiR1BMIjsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3Rlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF9rZXJuLmMgYi9zYW1wbGVzL2JwZi90ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXBfa2Vybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjI4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2JwZi90ZXN0X2N1cnJlbnRfdGFza191bmRlcl9jZ3JvdXBfa2Vybi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiBTYXJndW4gRGhpbGxvbiA8c2FyZ3VuQHNhcmd1bi5tZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JwZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlICJicGZfaGVscGVycy5oIgorI2luY2x1ZGUgPHVhcGkvbGludXgvdXRzbmFtZS5oPgorCitzdHJ1Y3QgYnBmX21hcF9kZWYgU0VDKCJtYXBzIikgY2dyb3VwX21hcCA9IHsKKwkudHlwZQkJCT0gQlBGX01BUF9UWVBFX0NHUk9VUF9BUlJBWSwKKwkua2V5X3NpemUJCT0gc2l6ZW9mKHUzMiksCisJLnZhbHVlX3NpemUJCT0gc2l6ZW9mKHUzMiksCisJLm1heF9lbnRyaWVzCT0gMSwKK307CisKK3N0cnVjdCBicGZfbWFwX2RlZiBTRUMoIm1hcHMiKSBwZXJmX21hcCA9IHsKKwkudHlwZQkJCT0gQlBGX01BUF9UWVBFX0FSUkFZLAorCS5rZXlfc2l6ZQkJPSBzaXplb2YodTMyKSwKKwkudmFsdWVfc2l6ZQkJPSBzaXplb2YodTY0KSwKKwkubWF4X2VudHJpZXMJPSAxLAorfTsKKworLyogV3JpdGVzIHRoZSBsYXN0IFBJRCB0aGF0IGNhbGxlZCBzeW5jIHRvIGEgbWFwIGF0IGluZGV4IDAgKi8KK1NFQygia3Byb2JlL3N5c19zeW5jIikKK2ludCBicGZfcHJvZzEoc3RydWN0IHB0X3JlZ3MgKmN0eCkKK3sKKwl1NjQgcGlkID0gYnBmX2dldF9jdXJyZW50X3BpZF90Z2lkKCk7CisJaW50IGlkeCA9IDA7CisKKwlpZiAoIWJwZl9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwKCZjZ3JvdXBfbWFwLCAwKSkKKwkJcmV0dXJuIDA7CisKKwlicGZfbWFwX3VwZGF0ZV9lbGVtKCZwZXJmX21hcCwgJmlkeCwgJnBpZCwgQlBGX0FOWSk7CisJcmV0dXJuIDA7Cit9CisKK2NoYXIgX2xpY2Vuc2VbXSBTRUMoImxpY2Vuc2UiKSA9ICJHUEwiOwordTMyIF92ZXJzaW9uIFNFQygidmVyc2lvbiIpID0gTElOVVhfVkVSU0lPTl9DT0RFOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdGVzdF9jdXJyZW50X3Rhc2tfdW5kZXJfY2dyb3VwX3VzZXIuYyBiL3NhbXBsZXMvYnBmL3Rlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBiMGJjZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3Rlc3RfY3VycmVudF90YXNrX3VuZGVyX2Nncm91cF91c2VyLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiBTYXJndW4gRGhpbGxvbiA8c2FyZ3VuQHNhcmd1bi5tZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImxpYmJwZi5oIgorI2luY2x1ZGUgImJwZl9sb2FkLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKworI2RlZmluZSBDR1JPVVBfTU9VTlRfUEFUSAkiL21udCIKKyNkZWZpbmUgQ0dST1VQX1BBVEgJCSIvbW50L215LWNncm91cCIKKworI2RlZmluZSBjbGVhbl9lcnJubygpIChlcnJubyA9PSAwID8gIk5vbmUiIDogc3RyZXJyb3IoZXJybm8pKQorI2RlZmluZSBsb2dfZXJyKE1TRywgLi4uKSBmcHJpbnRmKHN0ZGVyciwgIiglczolZDogZXJybm86ICVzKSAiIE1TRyAiXG4iLCBcCisJX19GSUxFX18sIF9fTElORV9fLCBjbGVhbl9lcnJubygpLCAjI19fVkFfQVJHU19fKQorCitzdGF0aWMgaW50IGpvaW5fY2dyb3VwKGNoYXIgKnBhdGgpCit7CisJaW50IGZkLCByYyA9IDA7CisJcGlkX3QgcGlkID0gZ2V0cGlkKCk7CisJY2hhciBjZ3JvdXBfcGF0aFtQQVRIX01BWCArIDFdOworCisJc25wcmludGYoY2dyb3VwX3BhdGgsIHNpemVvZihjZ3JvdXBfcGF0aCksICIlcy9jZ3JvdXAucHJvY3MiLCBwYXRoKTsKKworCWZkID0gb3BlbihjZ3JvdXBfcGF0aCwgT19XUk9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJbG9nX2VycigiT3BlbmluZyBDZ3JvdXAiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRwcmludGYoZmQsICIlZFxuIiwgcGlkKSA8IDApIHsKKwkJbG9nX2VycigiSm9pbmluZyBDZ3JvdXAiKTsKKwkJcmMgPSAxOworCX0KKwljbG9zZShmZCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciBmaWxlbmFtZVsyNTZdOworCWludCBjZzIsIGlkeCA9IDA7CisJcGlkX3QgcmVtb3RlX3BpZCwgbG9jYWxfcGlkID0gZ2V0cGlkKCk7CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzX2tlcm4ubyIsIGFyZ3ZbMF0pOworCWlmIChsb2FkX2JwZl9maWxlKGZpbGVuYW1lKSkgeworCQlwcmludGYoIiVzIiwgYnBmX2xvZ19idWYpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIFRoaXMgaXMgdG8gYXZvaWQgaW50ZXJmZXJpbmcgd2l0aCBleGlzdGluZyBjZ3JvdXBzLiBVbmZvcnR1bmF0ZWx5LAorCSAqIG1vc3QgcGVvcGxlIGRvbid0IGhhdmUgY2dyb3VwdjIgZW5hYmxlZCBhdCB0aGlzIHBvaW50IGluIHRpbWUuCisJICogSXQncyBlYXNpZXIgdG8gY3JlYXRlIG91ciBvd24gbW91bnQgbmFtZXNwYWNlIGFuZCBtYW5hZ2UgaXQKKwkgKiBvdXJzZWx2ZXMuCisJICovCisJaWYgKHVuc2hhcmUoQ0xPTkVfTkVXTlMpKSB7CisJCWxvZ19lcnIoInVuc2hhcmUiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG1vdW50KCJub25lIiwgIi8iLCBOVUxMLCBNU19SRUMgfCBNU19QUklWQVRFLCBOVUxMKSkgeworCQlsb2dfZXJyKCJtb3VudCBmYWtlcm9vdCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobW91bnQoIm5vbmUiLCBDR1JPVVBfTU9VTlRfUEFUSCwgImNncm91cDIiLCAwLCBOVUxMKSkgeworCQlsb2dfZXJyKCJtb3VudCBjZ3JvdXAyIik7CisJCXJldHVybiAxOworCX0KKworCWlmIChta2RpcihDR1JPVVBfUEFUSCwgMDc3NykgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisJCWxvZ19lcnIoIm1rZGlyIGNncm91cCIpOworCQlyZXR1cm4gMTsKKwl9CisKKwljZzIgPSBvcGVuKENHUk9VUF9QQVRILCBPX1JET05MWSk7CisJaWYgKGNnMiA8IDApIHsKKwkJbG9nX2Vycigib3BlbmluZyB0YXJnZXQgY2dyb3VwIik7CisJCWdvdG8gY2xlYW51cF9jZ3JvdXBfZXJyOworCX0KKworCWlmIChicGZfdXBkYXRlX2VsZW0obWFwX2ZkWzBdLCAmaWR4LCAmY2cyLCBCUEZfQU5ZKSkgeworCQlsb2dfZXJyKCJBZGRpbmcgdGFyZ2V0IGNncm91cCB0byBtYXAiKTsKKwkJZ290byBjbGVhbnVwX2Nncm91cF9lcnI7CisJfQorCWlmIChqb2luX2Nncm91cCgiL21udC9teS1jZ3JvdXAiKSkgeworCQlsb2dfZXJyKCJMZWF2aW5nIHRhcmdldCBjZ3JvdXAiKTsKKwkJZ290byBjbGVhbnVwX2Nncm91cF9lcnI7CisJfQorCisJLyoKKwkgKiBUaGUgaW5zdGFsbGVkIGhlbHBlciBwcm9ncmFtIGNhdGNoZWQgdGhlIHN5bmMgY2FsbCwgYW5kIHNob3VsZAorCSAqIHdyaXRlIGl0IHRvIHRoZSBtYXAuCisJICovCisKKwlzeW5jKCk7CisJYnBmX2xvb2t1cF9lbGVtKG1hcF9mZFsxXSwgJmlkeCwgJnJlbW90ZV9waWQpOworCisJaWYgKGxvY2FsX3BpZCAhPSByZW1vdGVfcGlkKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIkJQRiBIZWxwZXIgZGlkbid0IHdyaXRlIGNvcnJlY3QgUElEIHRvIG1hcCwgYnV0OiAlZFxuIiwKKwkJCXJlbW90ZV9waWQpOworCQlnb3RvIGxlYXZlX2Nncm91cF9lcnI7CisJfQorCisJLyogVmVyaWZ5IHRoZSBuZWdhdGl2ZSBzY2VuYXJpbzsgbGVhdmUgdGhlIGNncm91cCAqLworCWlmIChqb2luX2Nncm91cChDR1JPVVBfTU9VTlRfUEFUSCkpCisJCWdvdG8gbGVhdmVfY2dyb3VwX2VycjsKKworCXJlbW90ZV9waWQgPSAwOworCWJwZl91cGRhdGVfZWxlbShtYXBfZmRbMV0sICZpZHgsICZyZW1vdGVfcGlkLCBCUEZfQU5ZKTsKKworCXN5bmMoKTsKKwlicGZfbG9va3VwX2VsZW0obWFwX2ZkWzFdLCAmaWR4LCAmcmVtb3RlX3BpZCk7CisKKwlpZiAobG9jYWxfcGlkID09IHJlbW90ZV9waWQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJCUEYgY2dyb3VwIG5lZ2F0aXZlIHRlc3QgZGlkIG5vdCB3b3JrXG4iKTsKKwkJZ290byBjbGVhbnVwX2Nncm91cF9lcnI7CisJfQorCisJcm1kaXIoQ0dST1VQX1BBVEgpOworCXJldHVybiAwOworCisJLyogRXJyb3IgY29uZGl0aW9uLCBjbGVhbnVwICovCitsZWF2ZV9jZ3JvdXBfZXJyOgorCWpvaW5fY2dyb3VwKENHUk9VUF9NT1VOVF9QQVRIKTsKK2NsZWFudXBfY2dyb3VwX2VycjoKKwlybWRpcihDR1JPVVBfUEFUSCk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90ZXN0X2lwaXAuc2ggYi9zYW1wbGVzL2JwZi90ZXN0X2lwaXAuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTk2OTI1NAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3Rlc3RfaXBpcC5zaApAQCAtMCwwICsxLDE3OCBAQAorIyEvYmluL2Jhc2gKKworZnVuY3Rpb24gY29uZmlnX2RldmljZSB7CisJaXAgbmV0bnMgYWRkIGF0X25zMAorCWlwIG5ldG5zIGFkZCBhdF9uczEKKwlpcCBuZXRucyBhZGQgYXRfbnMyCisJaXAgbGluayBhZGQgdmV0aDAgdHlwZSB2ZXRoIHBlZXIgbmFtZSB2ZXRoMGIKKwlpcCBsaW5rIGFkZCB2ZXRoMSB0eXBlIHZldGggcGVlciBuYW1lIHZldGgxYgorCWlwIGxpbmsgYWRkIHZldGgyIHR5cGUgdmV0aCBwZWVyIG5hbWUgdmV0aDJiCisJaXAgbGluayBzZXQgdmV0aDBiIHVwCisJaXAgbGluayBzZXQgdmV0aDFiIHVwCisJaXAgbGluayBzZXQgdmV0aDJiIHVwCisJaXAgbGluayBzZXQgZGV2IHZldGgwYiBtdHUgMTUwMAorCWlwIGxpbmsgc2V0IGRldiB2ZXRoMWIgbXR1IDE1MDAKKwlpcCBsaW5rIHNldCBkZXYgdmV0aDJiIG10dSAxNTAwCisJaXAgbGluayBzZXQgdmV0aDAgbmV0bnMgYXRfbnMwCisJaXAgbGluayBzZXQgdmV0aDEgbmV0bnMgYXRfbnMxCisJaXAgbGluayBzZXQgdmV0aDIgbmV0bnMgYXRfbnMyCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgYWRkciBhZGQgMTcyLjE2LjEuMTAwLzI0IGRldiB2ZXRoMAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGFkZHIgYWRkIDI0MDE6ZGIwMDo6MS82NCBkZXYgdmV0aDAgbm9kYWQKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBsaW5rIHNldCBkZXYgdmV0aDAgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBhZGRyIGFkZCAxNzIuMTYuMS4xMDEvMjQgZGV2IHZldGgxCisJaXAgbmV0bnMgZXhlYyBhdF9uczEgaXAgYWRkciBhZGQgMjQwMTpkYjAwOjoyLzY0IGRldiB2ZXRoMSBub2RhZAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwIGxpbmsgc2V0IGRldiB2ZXRoMSB1cAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIGlwIGFkZHIgYWRkIDE3Mi4xNi4xLjIwMC8yNCBkZXYgdmV0aDIKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCAyNDAxOmRiMDA6OjMvNjQgZGV2IHZldGgyIG5vZGFkCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2IHZldGgyIHVwCisJaXAgbGluayBhZGQgYnIwIHR5cGUgYnJpZGdlCisJaXAgbGluayBzZXQgYnIwIHVwCisJaXAgbGluayBzZXQgZGV2IGJyMCBtdHUgMTUwMAorCWlwIGxpbmsgc2V0IHZldGgwYiBtYXN0ZXIgYnIwCisJaXAgbGluayBzZXQgdmV0aDFiIG1hc3RlciBicjAKKwlpcCBsaW5rIHNldCB2ZXRoMmIgbWFzdGVyIGJyMAorfQorCitmdW5jdGlvbiBhZGRfaXBpcF90dW5uZWwgeworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcGlwIGxvY2FsIDE3Mi4xNi4xLjEwMCByZW1vdGUgMTcyLjE2LjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgbGluayBzZXQgZGV2ICRERVZfTlMgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAxMC4xLjEuMTAwLzI0CisJaXAgbmV0bnMgZXhlYyBhdF9uczEgXAorCQlpcCBsaW5rIGFkZCBkZXYgJERFVl9OUyB0eXBlIGlwaXAgbG9jYWwgMTcyLjE2LjEuMTAxIHJlbW90ZSAxNzIuMTYuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCSMgc2FtZSBpbm5lciBJUCBhZGRyZXNzIGluIGF0X25zMCBhbmQgYXRfbnMxCisJaXAgbmV0bnMgZXhlYyBhdF9uczEgaXAgYWRkciBhZGQgZGV2ICRERVZfTlMgMTAuMS4xLjEwMC8yNAorCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBhZGQgZGV2ICRERVYgdHlwZSBpcGlwIGV4dGVybmFsCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0Cit9CisKK2Z1bmN0aW9uIGFkZF9pcGlwNl90dW5uZWwgeworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcDZ0bmwgbW9kZSBpcGlwNiBsb2NhbCAyNDAxOmRiMDA6OjEvNjQgcmVtb3RlIDI0MDE6ZGIwMDo6My82NAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGxpbmsgc2V0IGRldiAkREVWX05TIHVwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgYWRkciBhZGQgZGV2ICRERVZfTlMgMTAuMS4xLjEwMC8yNAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcDZ0bmwgbW9kZSBpcGlwNiBsb2NhbCAyNDAxOmRiMDA6OjIvNjQgcmVtb3RlIDI0MDE6ZGIwMDo6My82NAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwIGxpbmsgc2V0IGRldiAkREVWX05TIHVwCisJIyBzYW1lIGlubmVyIElQIGFkZHJlc3MgaW4gYXRfbnMwIGFuZCBhdF9uczEKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAxMC4xLjEuMTAwLzI0CisKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBsaW5rIGFkZCBkZXYgJERFViB0eXBlIGlwNnRubCBtb2RlIGlwaXA2IGV4dGVybmFsCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0Cit9CisKK2Z1bmN0aW9uIGFkZF9pcDZpcDZfdHVubmVsIHsKKwlpcCBuZXRucyBleGVjIGF0X25zMCBcCisJCWlwIGxpbmsgYWRkIGRldiAkREVWX05TIHR5cGUgaXA2dG5sIG1vZGUgaXA2aXA2IGxvY2FsIDI0MDE6ZGIwMDo6MS82NCByZW1vdGUgMjQwMTpkYjAwOjozLzY0CisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgbGluayBzZXQgZGV2ICRERVZfTlMgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAyNjAxOjY0Njo6MS82NAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSBpcDZ0bmwgbW9kZSBpcDZpcDYgbG9jYWwgMjQwMTpkYjAwOjoyLzY0IHJlbW90ZSAyNDAxOmRiMDA6OjMvNjQKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyB1cAorCSMgc2FtZSBpbm5lciBJUCBhZGRyZXNzIGluIGF0X25zMCBhbmQgYXRfbnMxCisJaXAgbmV0bnMgZXhlYyBhdF9uczEgaXAgYWRkciBhZGQgZGV2ICRERVZfTlMgMjYwMTo2NDY6OjEvNjQKKworCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIGlwIGxpbmsgYWRkIGRldiAkREVWIHR5cGUgaXA2dG5sIG1vZGUgaXA2aXA2IGV4dGVybmFsCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcCBhZGRyIGFkZCBkZXYgJERFViAyNjAxOjY0Njo6Mi82NAorfQorCitmdW5jdGlvbiBhdHRhY2hfYnBmIHsKKwlERVY9JDEKKwlTRVRfVFVOTkVMPSQyCisJR0VUX1RVTk5FTD0kMworCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIHRjIHFkaXNjIGFkZCBkZXYgJERFViBjbHNhY3QKKwlpcCBuZXRucyBleGVjIGF0X25zMiB0YyBmaWx0ZXIgYWRkIGRldiAkREVWIGVncmVzcyBicGYgZGEgb2JqIHRjYnBmMl9rZXJuLm8gc2VjICRTRVRfVFVOTkVMCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgdGMgZmlsdGVyIGFkZCBkZXYgJERFViBpbmdyZXNzIGJwZiBkYSBvYmogdGNicGYyX2tlcm4ubyBzZWMgJEdFVF9UVU5ORUwKK30KKworZnVuY3Rpb24gdGVzdF9pcGlwIHsKKwlERVZfTlM9aXBpcF9zdGQKKwlERVY9aXBpcF9icGYKKwljb25maWdfZGV2aWNlCisjCXRjcGR1bXAgLW5laSBicjAgJgorCWNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlX3BpcGUgJgorCisJYWRkX2lwaXBfdHVubmVsCisJYXR0YWNoX2JwZiAkREVWIGlwaXBfc2V0X3R1bm5lbCBpcGlwX2dldF90dW5uZWwKKworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIHBpbmcgLWMgMSAxMC4xLjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgcGluZyAtYyAxIDEwLjEuMS4xMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcGVyZiAtc0QgLXAgNTIwMCA+IC9kZXYvbnVsbAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwZXJmIC1zRCAtcCA1MjAxID4gL2Rldi9udWxsCisJc2xlZXAgMC4yCisJIyB0Y3AgY2hlY2sgX3NhbWVfIElQIG92ZXIgZGlmZmVyZW50IHR1bm5lbHMKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDEKKwljbGVhbnVwCit9CisKKyMgSVB2NCBvdmVyIElQdjYgdHVubmVsCitmdW5jdGlvbiB0ZXN0X2lwaXA2IHsKKwlERVZfTlM9aXBpcF9zdGQKKwlERVY9aXBpcF9icGYKKwljb25maWdfZGV2aWNlCisjCXRjcGR1bXAgLW5laSBicjAgJgorCWNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlX3BpcGUgJgorCisJYWRkX2lwaXA2X3R1bm5lbAorCWF0dGFjaF9icGYgJERFViBpcGlwNl9zZXRfdHVubmVsIGlwaXA2X2dldF90dW5uZWwKKworCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIHBpbmcgLWMgMSAxMC4xLjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgcGluZyAtYyAxIDEwLjEuMS4xMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcGVyZiAtc0QgLXAgNTIwMCA+IC9kZXYvbnVsbAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMxIGlwZXJmIC1zRCAtcCA1MjAxID4gL2Rldi9udWxsCisJc2xlZXAgMC4yCisJIyB0Y3AgY2hlY2sgX3NhbWVfIElQIG92ZXIgZGlmZmVyZW50IHR1bm5lbHMKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMiBpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDEKKwljbGVhbnVwCit9CisKKyMgSVB2NiBvdmVyIElQdjYgdHVubmVsCitmdW5jdGlvbiB0ZXN0X2lwNmlwNiB7CisJREVWX05TPWlwaXBfc3RkCisJREVWPWlwaXBfYnBmCisJY29uZmlnX2RldmljZQorIwl0Y3BkdW1wIC1uZWkgYnIwICYKKwljYXQgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy90cmFjZV9waXBlICYKKworCWFkZF9pcDZpcDZfdHVubmVsCisJYXR0YWNoX2JwZiAkREVWIGlwNmlwNl9zZXRfdHVubmVsIGlwNmlwNl9nZXRfdHVubmVsCisKKwlpcCBuZXRucyBleGVjIGF0X25zMCBwaW5nIC02IC1jIDEgMjYwMTo2NDY6OjIKKwlpcCBuZXRucyBleGVjIGF0X25zMiBwaW5nIC02IC1jIDEgMjYwMTo2NDY6OjEKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcGVyZiAtNnNEIC1wIDUyMDAgPiAvZGV2L251bGwKKwlpcCBuZXRucyBleGVjIGF0X25zMSBpcGVyZiAtNnNEIC1wIDUyMDEgPiAvZGV2L251bGwKKwlzbGVlcCAwLjIKKwkjIHRjcCBjaGVjayBfc2FtZV8gSVAgb3ZlciBkaWZmZXJlbnQgdHVubmVscworCWlwIG5ldG5zIGV4ZWMgYXRfbnMyIGlwZXJmIC02YyAyNjAxOjY0Njo6MSAtbiA1ayAtcCA1MjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczIgaXBlcmYgLTZjIDI2MDE6NjQ2OjoxIC1uIDVrIC1wIDUyMDEKKwljbGVhbnVwCit9CisKK2Z1bmN0aW9uIGNsZWFudXAgeworCXNldCArZXgKKwlwa2lsbCBpcGVyZgorCWlwIG5ldG5zIGRlbGV0ZSBhdF9uczAKKwlpcCBuZXRucyBkZWxldGUgYXRfbnMxCisJaXAgbmV0bnMgZGVsZXRlIGF0X25zMgorCWlwIGxpbmsgZGVsIHZldGgwCisJaXAgbGluayBkZWwgdmV0aDEKKwlpcCBsaW5rIGRlbCB2ZXRoMgorCWlwIGxpbmsgZGVsIGJyMAorCXBraWxsIHRjcGR1bXAKKwlwa2lsbCBjYXQKKwlzZXQgLWV4Cit9CisKK2NsZWFudXAKK2VjaG8gIlRlc3RpbmcgSVAgdHVubmVscy4uLiIKK3Rlc3RfaXBpcAordGVzdF9pcGlwNgordGVzdF9pcDZpcDYKK2VjaG8gIioqKiBQQVNTICoqKiIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3Rlc3RfdHVubmVsX2JwZi5zaCBiL3NhbXBsZXMvYnBmL3Rlc3RfdHVubmVsX2JwZi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZmY2MzRmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9icGYvdGVzdF90dW5uZWxfYnBmLnNoCkBAIC0wLDAgKzEsMTY3IEBACisjIS9iaW4vYmFzaAorIyBJbiBOYW1lc3BhY2UgMCAoYXRfbnMwKSB1c2luZyBuYXRpdmUgdHVubmVsCisjIE92ZXJsYXkgSVA6IDEwLjEuMS4xMDAKKyMgbG9jYWwgMTkyLjE2LjEuMTAwIHJlbW90ZSAxOTIuMTYuMS4yMDAKKyMgdmV0aDAgSVA6IDE3Mi4xNi4xLjEwMCwgdHVubmVsIGRldiA8dHlwZT4wMAorCisjIE91dCBvZiBOYW1lc3BhY2UgdXNpbmcgQlBGIHNldC9nZXQgb24gbHd0dW5uZWwKKyMgT3ZlcmxheSBJUDogMTAuMS4xLjIwMAorIyBsb2NhbCAxNzIuMTYuMS4yMDAgcmVtb3RlIDE3Mi4xNi4xLjEwMAorIyB2ZXRoMSBJUDogMTcyLjE2LjEuMjAwLCB0dW5uZWwgZGV2IDx0eXBlPjExCisKK2Z1bmN0aW9uIGNvbmZpZ19kZXZpY2UgeworCWlwIG5ldG5zIGFkZCBhdF9uczAKKwlpcCBsaW5rIGFkZCB2ZXRoMCB0eXBlIHZldGggcGVlciBuYW1lIHZldGgxCisJaXAgbGluayBzZXQgdmV0aDAgbmV0bnMgYXRfbnMwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgYWRkciBhZGQgMTcyLjE2LjEuMTAwLzI0IGRldiB2ZXRoMAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGlwIGxpbmsgc2V0IGRldiB2ZXRoMCB1cAorCWlwIGxpbmsgc2V0IGRldiB2ZXRoMSB1cCBtdHUgMTUwMAorCWlwIGFkZHIgYWRkIGRldiB2ZXRoMSAxNzIuMTYuMS4yMDAvMjQKK30KKworZnVuY3Rpb24gYWRkX2dyZV90dW5uZWwgeworCSMgaW4gbmFtZXNwYWNlCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgXAorCQlpcCBsaW5rIGFkZCBkZXYgJERFVl9OUyB0eXBlICRUWVBFIGtleSAyIGxvY2FsIDE3Mi4xNi4xLjEwMCByZW1vdGUgMTcyLjE2LjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgbGluayBzZXQgZGV2ICRERVZfTlMgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAxMC4xLjEuMTAwLzI0CisKKwkjIG91dCBvZiBuYW1lc3BhY2UKKwlpcCBsaW5rIGFkZCBkZXYgJERFViB0eXBlICRUWVBFIGtleSAyIGV4dGVybmFsCisJaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0Cit9CisKK2Z1bmN0aW9uIGFkZF92eGxhbl90dW5uZWwgeworCSMgU2V0IHN0YXRpYyBBUlAgZW50cnkgaGVyZSBiZWNhdXNlIGlwdGFibGVzIHNldC1tYXJrIHdvcmtzCisJIyBvbiBMMyBwYWNrZXQsIGFzIGEgcmVzdWx0IG5vdCBhcHBseWluZyB0byBBUlAgcGFja2V0cywKKwkjIGNhdXNpbmcgZXJyb3JzIGF0IGdldF90dW5uZWxfe2tleS9vcHR9LgorCisJIyBpbiBuYW1lc3BhY2UKKwlpcCBuZXRucyBleGVjIGF0X25zMCBcCisJCWlwIGxpbmsgYWRkIGRldiAkREVWX05TIHR5cGUgJFRZUEUgaWQgMiBkc3Rwb3J0IDQ3ODkgZ2JwIHJlbW90ZSAxNzIuMTYuMS4yMDAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBsaW5rIHNldCBkZXYgJERFVl9OUyBhZGRyZXNzIDUyOjU0OjAwOmQ5OjAxOjAwIHVwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgYWRkciBhZGQgZGV2ICRERVZfTlMgMTAuMS4xLjEwMC8yNAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIGFycCAtcyAxMC4xLjEuMjAwIDUyOjU0OjAwOmQ5OjAyOjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXB0YWJsZXMgLUEgT1VUUFVUIC1qIE1BUksgLS1zZXQtbWFyayAweDgwMEZGCisKKwkjIG91dCBvZiBuYW1lc3BhY2UKKwlpcCBsaW5rIGFkZCBkZXYgJERFViB0eXBlICRUWVBFIGV4dGVybmFsIGdicCBkc3Rwb3J0IDQ3ODkKKwlpcCBsaW5rIHNldCBkZXYgJERFViBhZGRyZXNzIDUyOjU0OjAwOmQ5OjAyOjAwIHVwCisJaXAgYWRkciBhZGQgZGV2ICRERVYgMTAuMS4xLjIwMC8yNAorCWFycCAtcyAxMC4xLjEuMTAwIDUyOjU0OjAwOmQ5OjAxOjAwCit9CisKK2Z1bmN0aW9uIGFkZF9nZW5ldmVfdHVubmVsIHsKKwkjIGluIG5hbWVzcGFjZQorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIFwKKwkJaXAgbGluayBhZGQgZGV2ICRERVZfTlMgdHlwZSAkVFlQRSBpZCAyIGRzdHBvcnQgNjA4MSByZW1vdGUgMTcyLjE2LjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgbGluayBzZXQgZGV2ICRERVZfTlMgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAxMC4xLjEuMTAwLzI0CisKKwkjIG91dCBvZiBuYW1lc3BhY2UKKwlpcCBsaW5rIGFkZCBkZXYgJERFViB0eXBlICRUWVBFIGRzdHBvcnQgNjA4MSBleHRlcm5hbAorCWlwIGxpbmsgc2V0IGRldiAkREVWIHVwCisJaXAgYWRkciBhZGQgZGV2ICRERVYgMTAuMS4xLjIwMC8yNAorfQorCitmdW5jdGlvbiBhZGRfaXBpcF90dW5uZWwgeworCSMgaW4gbmFtZXNwYWNlCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgXAorCQlpcCBsaW5rIGFkZCBkZXYgJERFVl9OUyB0eXBlICRUWVBFIGxvY2FsIDE3Mi4xNi4xLjEwMCByZW1vdGUgMTcyLjE2LjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXAgbGluayBzZXQgZGV2ICRERVZfTlMgdXAKKwlpcCBuZXRucyBleGVjIGF0X25zMCBpcCBhZGRyIGFkZCBkZXYgJERFVl9OUyAxMC4xLjEuMTAwLzI0CisKKwkjIG91dCBvZiBuYW1lc3BhY2UKKwlpcCBsaW5rIGFkZCBkZXYgJERFViB0eXBlICRUWVBFIGV4dGVybmFsCisJaXAgbGluayBzZXQgZGV2ICRERVYgdXAKKwlpcCBhZGRyIGFkZCBkZXYgJERFViAxMC4xLjEuMjAwLzI0Cit9CisKK2Z1bmN0aW9uIGF0dGFjaF9icGYgeworCURFVj0kMQorCVNFVF9UVU5ORUw9JDIKKwlHRVRfVFVOTkVMPSQzCisJdGMgcWRpc2MgYWRkIGRldiAkREVWIGNsc2FjdAorCXRjIGZpbHRlciBhZGQgZGV2ICRERVYgZWdyZXNzIGJwZiBkYSBvYmogdGNicGYyX2tlcm4ubyBzZWMgJFNFVF9UVU5ORUwKKwl0YyBmaWx0ZXIgYWRkIGRldiAkREVWIGluZ3Jlc3MgYnBmIGRhIG9iaiB0Y2JwZjJfa2Vybi5vIHNlYyAkR0VUX1RVTk5FTAorfQorCitmdW5jdGlvbiB0ZXN0X2dyZSB7CisJVFlQRT1ncmV0YXAKKwlERVZfTlM9Z3JldGFwMDAKKwlERVY9Z3JldGFwMTEKKwljb25maWdfZGV2aWNlCisJYWRkX2dyZV90dW5uZWwKKwlhdHRhY2hfYnBmICRERVYgZ3JlX3NldF90dW5uZWwgZ3JlX2dldF90dW5uZWwKKwlwaW5nIC1jIDEgMTAuMS4xLjEwMAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIHBpbmcgLWMgMSAxMC4xLjEuMjAwCisJY2xlYW51cAorfQorCitmdW5jdGlvbiB0ZXN0X3Z4bGFuIHsKKwlUWVBFPXZ4bGFuCisJREVWX05TPXZ4bGFuMDAKKwlERVY9dnhsYW4xMQorCWNvbmZpZ19kZXZpY2UKKwlhZGRfdnhsYW5fdHVubmVsCisJYXR0YWNoX2JwZiAkREVWIHZ4bGFuX3NldF90dW5uZWwgdnhsYW5fZ2V0X3R1bm5lbAorCXBpbmcgLWMgMSAxMC4xLjEuMTAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgcGluZyAtYyAxIDEwLjEuMS4yMDAKKwljbGVhbnVwCit9CisKK2Z1bmN0aW9uIHRlc3RfZ2VuZXZlIHsKKwlUWVBFPWdlbmV2ZQorCURFVl9OUz1nZW5ldmUwMAorCURFVj1nZW5ldmUxMQorCWNvbmZpZ19kZXZpY2UKKwlhZGRfZ2VuZXZlX3R1bm5lbAorCWF0dGFjaF9icGYgJERFViBnZW5ldmVfc2V0X3R1bm5lbCBnZW5ldmVfZ2V0X3R1bm5lbAorCXBpbmcgLWMgMSAxMC4xLjEuMTAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgcGluZyAtYyAxIDEwLjEuMS4yMDAKKwljbGVhbnVwCit9CisKK2Z1bmN0aW9uIHRlc3RfaXBpcCB7CisJVFlQRT1pcGlwCisJREVWX05TPWlwaXAwMAorCURFVj1pcGlwMTEKKwljb25maWdfZGV2aWNlCisJdGNwZHVtcCAtbmVpIHZldGgxICYKKwljYXQgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy90cmFjZV9waXBlICYKKwlhZGRfaXBpcF90dW5uZWwKKwlldGh0b29sIC1LIHZldGgxIGdzbyBvZmYgZ3JvIG9mZiByeCBvZmYgdHggb2ZmCisJaXAgbGluayBzZXQgZGV2IHZldGgxIG10dSAxNTAwCisJYXR0YWNoX2JwZiAkREVWIGlwaXBfc2V0X3R1bm5lbCBpcGlwX2dldF90dW5uZWwKKwlwaW5nIC1jIDEgMTAuMS4xLjEwMAorCWlwIG5ldG5zIGV4ZWMgYXRfbnMwIHBpbmcgLWMgMSAxMC4xLjEuMjAwCisJaXAgbmV0bnMgZXhlYyBhdF9uczAgaXBlcmYgLXNEIC1wIDUyMDAgPiAvZGV2L251bGwKKwlzbGVlcCAwLjIKKwlpcGVyZiAtYyAxMC4xLjEuMTAwIC1uIDVrIC1wIDUyMDAKKwljbGVhbnVwCit9CisKK2Z1bmN0aW9uIGNsZWFudXAgeworCXNldCArZXgKKwlwa2lsbCBpcGVyZgorCWlwIG5ldG5zIGRlbGV0ZSBhdF9uczAKKwlpcCBsaW5rIGRlbCB2ZXRoMQorCWlwIGxpbmsgZGVsIGlwaXAxMQorCWlwIGxpbmsgZGVsIGdyZXRhcDExCisJaXAgbGluayBkZWwgZ2VuZXZlMTEKKwlwa2lsbCB0Y3BkdW1wCisJcGtpbGwgY2F0CisJc2V0IC1leAorfQorCitjbGVhbnVwCitlY2hvICJUZXN0aW5nIEdSRSB0dW5uZWwuLi4iCit0ZXN0X2dyZQorZWNobyAiVGVzdGluZyBWWExBTiB0dW5uZWwuLi4iCit0ZXN0X3Z4bGFuCitlY2hvICJUZXN0aW5nIEdFTkVWRSB0dW5uZWwuLi4iCit0ZXN0X2dlbmV2ZQorZWNobyAiVGVzdGluZyBJUElQIHR1bm5lbC4uLiIKK3Rlc3RfaXBpcAorZWNobyAiKioqIFBBU1MgKioqIgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdGVzdF92ZXJpZmllci5jIGIvc2FtcGxlcy9icGYvdGVzdF92ZXJpZmllci5jCmluZGV4IGZlMmZjZWMuLjM2OWZmYWEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL3Rlc3RfdmVyaWZpZXIuYworKysgYi9zYW1wbGVzL2JwZi90ZXN0X3ZlcmlmaWVyLmMKQEAgLTI5LDYgKzI5LDcgQEAKIAlzdHJ1Y3QgYnBmX2luc24JaW5zbnNbTUFYX0lOU05TXTsKIAlpbnQgZml4dXBbTUFYX0ZJWFVQU107CiAJaW50IHByb2dfYXJyYXlfZml4dXBbTUFYX0ZJWFVQU107CisJaW50IHRlc3RfdmFsX21hcF9maXh1cFtNQVhfRklYVVBTXTsKIAljb25zdCBjaGFyICplcnJzdHI7CiAJY29uc3QgY2hhciAqZXJyc3RyX3VucHJpdjsKIAllbnVtIHsKQEAgLTM5LDYgKzQwLDE5IEBACiAJZW51bSBicGZfcHJvZ190eXBlIHByb2dfdHlwZTsKIH07CiAKKy8qIE5vdGUgd2Ugd2FudCB0aGlzIHRvIGJlIDY0IGJpdCBhbGlnbmVkIHNvIHRoYXQgdGhlIGVuZCBvZiBvdXIgYXJyYXkgaXMKKyAqIGFjdHVhbGx5IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZS4KKyAqLworI2RlZmluZSBNQVhfRU5UUklFUyAxMQorc3RydWN0IHRlc3RfdmFsIHsKKwl1bnNpZ25lZCBpbmRleDsKKwlpbnQgZm9vW01BWF9FTlRSSUVTXTsKK307CisKK3N0cnVjdCBvdGhlcl92YWwgeworCXVuc2lnbmVkIGludCBhY3Rpb25bMzJdOworfTsKKwogc3RhdGljIHN0cnVjdCBicGZfdGVzdCB0ZXN0c1tdID0gewogCXsKIAkJImFkZCtzdWIrbXVsIiwKQEAgLTI5MSw2ICszMDUsMjkgQEAKIAkJLnJlc3VsdCA9IFJFSkVDVCwKIAl9LAogCXsKKwkJImludmFsaWQgYXJndW1lbnQgcmVnaXN0ZXIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19nZXRfY2dyb3VwX2NsYXNzaWQpLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfZ2V0X2Nncm91cF9jbGFzc2lkKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmVycnN0ciA9ICJSMSAhcmVhZF9vayIsCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJIm5vbi1pbnZhbGlkIGFyZ3VtZW50IHJlZ2lzdGVyIiwKKwkJLmluc25zID0geworCQkJQlBGX0FMVTY0X1JFRyhCUEZfTU9WLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19nZXRfY2dyb3VwX2NsYXNzaWQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTU9WLCBCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19nZXRfY2dyb3VwX2NsYXNzaWQpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gQUNDRVBULAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CiAJCSJjaGVjayB2YWxpZCBzcGlsbC9maWxsIiwKIAkJLmluc25zID0gewogCQkJLyogc3BpbGwgUjEoY3R4KSBpbnRvIHN0YWNrICovCkBAIC0xMjEwLDYgKzEyNDcsNTQgQEAKIAkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAogCX0sCiAJeworCQkicmF3X3N0YWNrOiBza2JfbG9hZF9ieXRlcywgbmVnYXRpdmUgbGVuIiwKKwkJLmluc25zID0geworCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTU9WLCBCUEZfUkVHXzYsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIC04KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18zLCBCUEZfUkVHXzYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIC04KSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX3NrYl9sb2FkX2J5dGVzKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzYsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgc3RhY2sgdHlwZSBSMyIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJInJhd19zdGFjazogc2tiX2xvYWRfYnl0ZXMsIG5lZ2F0aXZlIGxlbiAyIiwKKwkJLmluc25zID0geworCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTU9WLCBCUEZfUkVHXzYsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIC04KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18zLCBCUEZfUkVHXzYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIH4wKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX3NrYl9sb2FkX2J5dGVzKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzYsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgc3RhY2sgdHlwZSBSMyIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJInJhd19zdGFjazogc2tiX2xvYWRfYnl0ZXMsIHplcm8gbGVuIiwKKwkJLmluc25zID0geworCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTU9WLCBCUEZfUkVHXzYsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIC04KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18zLCBCUEZfUkVHXzYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfc2tiX2xvYWRfYnl0ZXMpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIEJQRl9SRUdfNiwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBzdGFjayB0eXBlIFIzIiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJewogCQkicmF3X3N0YWNrOiBza2JfbG9hZF9ieXRlcywgbm8gaW5pdCIsCiAJCS5pbnNucyA9IHsKIAkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18yLCA0KSwKQEAgLTE0NDksNyArMTUzNCw3IEBACiAJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKIAl9LAogCXsKLQkJInBrdDogdGVzdDEiLAorCQkiZGlyZWN0IHBhY2tldCBhY2Nlc3M6IHRlc3QxIiwKIAkJLmluc25zID0gewogCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAogCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCkBAIC0xNDY2LDcgKzE1NTEsNyBAQAogCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCiAJfSwKIAl7Ci0JCSJwa3Q6IHRlc3QyIiwKKwkJImRpcmVjdCBwYWNrZXQgYWNjZXNzOiB0ZXN0MiIsCiAJCS5pbnNucyA9IHsKIAkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAxKSwKIAkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzQsIEJQRl9SRUdfMSwKQEAgLTE0OTksNyArMTU4NCw3IEBACiAJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKIAl9LAogCXsKLQkJInBrdDogdGVzdDMiLAorCQkiZGlyZWN0IHBhY2tldCBhY2Nlc3M6IHRlc3QzIiwKIAkJLmluc25zID0gewogCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAogCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCkBAIC0xNTExLDcgKzE1OTYsNyBAQAogCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLAogCX0sCiAJewotCQkicGt0OiB0ZXN0NCIsCisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDQgKHdyaXRlKSIsCiAJCS5pbnNucyA9IHsKIAkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKIAkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLApAQCAtMTUyNCwxMCArMTYwOSw3ODAgQEAKIAkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKIAkJCUJQRl9FWElUX0lOU04oKSwKIAkJfSwKLQkJLmVycnN0ciA9ICJjYW5ub3Qgd3JpdGUiLAorCQkucmVzdWx0ID0gQUNDRVBULAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDUgKHBrdF9lbmQgPj0gcmVnLCBnb29kIGFjY2VzcykiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHRSwgQlBGX1JFR18zLCBCUEZfUkVHXzAsIDIpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0IsIEJQRl9SRUdfMCwgQlBGX1JFR18yLCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IEFDQ0VQVCwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiZGlyZWN0IHBhY2tldCBhY2Nlc3M6IHRlc3Q2IChwa3RfZW5kID49IHJlZywgYmFkIGFjY2VzcykiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18wLCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzAsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHRSwgQlBGX1JFR18zLCBCUEZfUkVHXzAsIDMpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0IsIEJQRl9SRUdfMCwgQlBGX1JFR18yLCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAogCQkucmVzdWx0ID0gUkVKRUNULAogCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCiAJfSwKKwl7CisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDcgKHBrdF9lbmQgPj0gcmVnLCBib3RoIGFjY2Vzc2VzKSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMCwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdFLCBCUEZfUkVHXzMsIEJQRl9SRUdfMCwgMyksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR18wLCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0IsIEJQRl9SRUdfMCwgQlBGX1JFR18yLCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDggKGRvdWJsZSB0ZXN0LCB2YXJpYW50IDEpIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18wLCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR0UsIEJQRl9SRUdfMywgQlBGX1JFR18wLCA0KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMCwgQlBGX1JFR18zLCAxKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzAsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR18wLCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gQUNDRVBULAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDkgKGRvdWJsZSB0ZXN0LCB2YXJpYW50IDIpIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18wLCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR0UsIEJQRl9SRUdfMywgQlBGX1JFR18wLCAyKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMCwgQlBGX1JFR18zLCAxKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHXzAsIEJQRl9SRUdfMiwgMCksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR18wLCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gQUNDRVBULAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJkaXJlY3QgcGFja2V0IGFjY2VzczogdGVzdDEwICh3cml0ZSBpbnZhbGlkKSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMCwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzAsIEJQRl9SRUdfMywgMiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfU1RYX01FTShCUEZfQiwgQlBGX1JFR18yLCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MSwgdmFsaWQgcGFja2V0X3B0ciByYW5nZSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHhkcF9tZCwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMSwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzEsIEJQRl9SRUdfMywgNSksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMywgQlBGX1JFR18yKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR180LCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF91cGRhdGVfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHs1fSwKKwkJLnJlc3VsdF91bnByaXYgPSBBQ0NFUFQsCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1hEUCwKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MiwgdW5jaGVja2VkIHBhY2tldF9wdHIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCB4ZHBfbWQsIGRhdGEpKSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHsxfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9YRFAsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDMsIHZhcmlhYmxlIGFkZCIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkJb2Zmc2V0b2Yoc3RydWN0IHhkcF9tZCwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCQlvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhX2VuZCkpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzQsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNCwgOCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzQsIEJQRl9SRUdfMywgMTApLAorCQkJQlBGX0xEWF9NRU0oQlBGX0IsIEJQRl9SRUdfNSwgQlBGX1JFR18yLCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR180LCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBCUEZfUkVHXzQsIEJQRl9SRUdfNSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfNSwgQlBGX1JFR180KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR181LCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfNSwgQlBGX1JFR18zLCA0KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzQpLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmZpeHVwID0gezExfSwKKwkJLnJlc3VsdCA9IEFDQ0VQVCwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfWERQLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3Q0LCBwYWNrZXRfcHRyIHdpdGggYmFkIHJhbmdlIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgeGRwX21kLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCB4ZHBfbWQsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfNCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR180LCA0KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfNCwgQlBGX1JFR18zLCAyKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHs3fSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9YRFAsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDUsIHBhY2tldF9wdHIgd2l0aCB0b28gc2hvcnQgcmFuZ2UiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCB4ZHBfbWQsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHhkcF9tZCwgZGF0YV9lbmQpKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR180LCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzQsIDcpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR180LCBCUEZfUkVHXzMsIDMpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLmZpeHVwID0gezZ9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1hEUCwKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0NiwgY2xzIHZhbGlkIHBhY2tldF9wdHIgcmFuZ2UiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18yLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzMsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzEsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18xLCBCUEZfUkVHXzMsIDUpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzMsIEJQRl9SRUdfMiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfdXBkYXRlX2VsZW0pLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZml4dXAgPSB7NX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0NywgY2xzIHVuY2hlY2tlZCBwYWNrZXRfcHRyIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZml4dXAgPSB7MX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBhY2Nlc3MgdG8gcGFja2V0IiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3Q4LCBjbHMgdmFyaWFibGUgYWRkIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCQlvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJCW9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfNCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR180LCA4KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfNCwgQlBGX1JFR18zLCAxMCksCisJCQlCUEZfTERYX01FTShCUEZfQiwgQlBGX1JFR181LCBCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzQsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIEJQRl9SRUdfNCwgQlBGX1JFR181KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR181LCBCUEZfUkVHXzQpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzUsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR181LCBCUEZfUkVHXzMsIDQpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfNCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZml4dXAgPSB7MTF9LAorCQkucmVzdWx0ID0gQUNDRVBULAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDksIGNscyBwYWNrZXRfcHRyIHdpdGggYmFkIHJhbmdlIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18zLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfNCwgQlBGX1JFR18yKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR180LCA0KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfNCwgQlBGX1JFR18zLCAyKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHs3fSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDEwLCBjbHMgcGFja2V0X3B0ciB3aXRoIHRvbyBzaG9ydCByYW5nZSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzQsIEJQRl9SRUdfMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNCwgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzQsIEJQRl9SRUdfMywgMyksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkuZml4dXAgPSB7Nn0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBhY2Nlc3MgdG8gcGFja2V0IiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3QxMSwgY2xzIHVuc3VpdGFibGUgaGVscGVyIDEiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR182LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzcsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR182LCAxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18zLCBCUEZfUkVHXzYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzMsIDcpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18zLCBCUEZfUkVHXzcsIDQpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDQyKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR181LCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX3NrYl9zdG9yZV9ieXRlcyksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaGVscGVyIGFjY2VzcyB0byB0aGUgcGFja2V0IiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3QxMiwgY2xzIHVuc3VpdGFibGUgaGVscGVyIDIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR182LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzcsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18zLCBCUEZfUkVHXzYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIDgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR182LCBCUEZfUkVHXzcsIDMpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDQpLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfc2tiX2xvYWRfYnl0ZXMpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImhlbHBlciBhY2Nlc3MgdG8gdGhlIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTMsIGNscyBoZWxwZXIgb2siLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR182LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzcsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR182LCAxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzEsIDcpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18xLCBCUEZfUkVHXzcsIDYpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgNCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMywgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19jc3VtX2RpZmYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gQUNDRVBULAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDE0LCBjbHMgaGVscGVyIGZhaWwgc3ViIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR183LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgMSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18xLCA3KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMSwgQlBGX1JFR183LCA2KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgQlBGX1JFR18xLCA0KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18yLCA0KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18zLCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR180LCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR181LCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2NzdW1fZGlmZiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAidHlwZT1pbnYgZXhwZWN0ZWQ9ZnAiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDE1LCBjbHMgaGVscGVyIGZhaWwgcmFuZ2UgMSIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMSwgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzEsIEJQRl9SRUdfNywgNiksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18yLCA4KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18zLCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR180LCAwKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR181LCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX2NzdW1fZGlmZiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJCS5lcnJzdHIgPSAiaW52YWxpZCBhY2Nlc3MgdG8gcGFja2V0IiwKKwkJLnByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCX0sCisJeworCQkiaGVscGVyIGFjY2VzcyB0byBwYWNrZXQ6IHRlc3QxNiwgY2xzIGhlbHBlciBmYWlsIHJhbmdlIDIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR182LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzcsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR182LCAxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzEsIDcpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18xLCBCUEZfUkVHXzcsIDYpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMiwgLTkpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzMsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzUsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfY3N1bV9kaWZmKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDE3LCBjbHMgaGVscGVyIGZhaWwgcmFuZ2UgMyIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzYsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YSkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNywgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhX2VuZCkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzYsIDEpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMSwgNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzEsIEJQRl9SRUdfNywgNiksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18yLCB+MCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfMywgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNCwgMCksCisJCQlCUEZfTU9WNjRfSU1NKEJQRl9SRUdfNSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19jc3VtX2RpZmYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkucmVzdWx0ID0gUkVKRUNULAorCQkuZXJyc3RyID0gImludmFsaWQgYWNjZXNzIHRvIHBhY2tldCIsCisJCS5wcm9nX3R5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKKwl9LAorCXsKKwkJImhlbHBlciBhY2Nlc3MgdG8gcGFja2V0OiB0ZXN0MTgsIGNscyBoZWxwZXIgZmFpbCByYW5nZSB6ZXJvIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR183LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgMSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18xLCA3KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMSwgQlBGX1JFR183LCA2KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzMsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzUsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfY3N1bV9kaWZmKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDE5LCBwa3QgZW5kIGFzIGlucHV0IiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfNiwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBkYXRhKSksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR183LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGFfZW5kKSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfNiwgMSksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMSwgQlBGX1JFR182KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18xLCA3KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIEJQRl9SRUdfMSwgQlBGX1JFR183LCA2KSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzcpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDQpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzMsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzUsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfY3N1bV9kaWZmKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJSMSB0eXBlPXBrdF9lbmQgZXhwZWN0ZWQ9ZnAiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJoZWxwZXIgYWNjZXNzIHRvIHBhY2tldDogdGVzdDIwLCB3cm9uZyByZWciLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR182LCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGRhdGEpKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzcsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgZGF0YV9lbmQpKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR182LCAxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18xLCBCUEZfUkVHXzYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzEsIDcpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHVCwgQlBGX1JFR18xLCBCUEZfUkVHXzcsIDYpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzIsIDQpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzMsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzQsIDApLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzUsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfY3N1bV9kaWZmKSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwkJLmVycnN0ciA9ICJpbnZhbGlkIGFjY2VzcyB0byBwYWNrZXQiLAorCQkucHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsCisJfSwKKwl7CisJCSJ2YWxpZCBtYXAgYWNjZXNzIGludG8gYW4gYXJyYXkgd2l0aCBhIGNvbnN0YW50IiwKKwkJLmluc25zID0geworCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCAxKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIDAsIG9mZnNldG9mKHN0cnVjdCB0ZXN0X3ZhbCwgZm9vKSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS50ZXN0X3ZhbF9tYXBfZml4dXAgPSB7M30sCisJCS5lcnJzdHJfdW5wcml2ID0gIlIwIGxlYWtzIGFkZHIiLAorCQkucmVzdWx0X3VucHJpdiA9IFJFSkVDVCwKKwkJLnJlc3VsdCA9IEFDQ0VQVCwKKwl9LAorCXsKKwkJInZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIGEgcmVnaXN0ZXIiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDQpLAorCQkJQlBGX01PVjY0X0lNTShCUEZfUkVHXzEsIDQpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTFNILCBCUEZfUkVHXzEsIDIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBCUEZfUkVHXzAsIEJQRl9SRUdfMSksCisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18wLCAwLCBvZmZzZXRvZihzdHJ1Y3QgdGVzdF92YWwsIGZvbykpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkudGVzdF92YWxfbWFwX2ZpeHVwID0gezN9LAorCQkuZXJyc3RyX3VucHJpdiA9ICJSMCBsZWFrcyBhZGRyIiwKKwkJLnJlc3VsdF91bnByaXYgPSBSRUpFQ1QsCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJfSwKKwl7CisJCSJ2YWxpZCBtYXAgYWNjZXNzIGludG8gYW4gYXJyYXkgd2l0aCBhIHZhcmlhYmxlIiwKKwkJLmluc25zID0geworCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCA1KSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzEsIEJQRl9SRUdfMCwgMCksCisJCQlCUEZfSk1QX0lNTShCUEZfSkdFLCBCUEZfUkVHXzEsIE1BWF9FTlRSSUVTLCAzKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0xTSCwgQlBGX1JFR18xLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR18wLCBCUEZfUkVHXzEpLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgMCwgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0cl91bnByaXYgPSAiUjAgbGVha3MgYWRkciIsCisJCS5yZXN1bHRfdW5wcml2ID0gUkVKRUNULAorCQkucmVzdWx0ID0gQUNDRVBULAorCX0sCisJeworCQkidmFsaWQgbWFwIGFjY2VzcyBpbnRvIGFuIGFycmF5IHdpdGggYSBzaWduZWQgdmFyaWFibGUiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDkpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMSwgQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KU0dULCBCUEZfUkVHXzEsIDB4ZmZmZmZmZmYsIDEpLAorCQkJQlBGX01PVjMyX0lNTShCUEZfUkVHXzEsIDApLAorCQkJQlBGX01PVjMyX0lNTShCUEZfUkVHXzIsIE1BWF9FTlRSSUVTKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KU0dULCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwgMSksCisJCQlCUEZfTU9WMzJfSU1NKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9MU0gsIEJQRl9SRUdfMSwgMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIEJQRl9SRUdfMCwgQlBGX1JFR18xKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIDAsIG9mZnNldG9mKHN0cnVjdCB0ZXN0X3ZhbCwgZm9vKSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS50ZXN0X3ZhbF9tYXBfZml4dXAgPSB7M30sCisJCS5lcnJzdHJfdW5wcml2ID0gIlIwIGxlYWtzIGFkZHIiLAorCQkucmVzdWx0X3VucHJpdiA9IFJFSkVDVCwKKwkJLnJlc3VsdCA9IEFDQ0VQVCwKKwl9LAorCXsKKwkJImludmFsaWQgbWFwIGFjY2VzcyBpbnRvIGFuIGFycmF5IHdpdGggYSBjb25zdGFudCIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEwLCAtOCwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgLTgpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgMSksCisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18wLCAoTUFYX0VOVFJJRVMgKyAxKSA8PCAyLAorCQkJCSAgIG9mZnNldG9mKHN0cnVjdCB0ZXN0X3ZhbCwgZm9vKSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS50ZXN0X3ZhbF9tYXBfZml4dXAgPSB7M30sCisJCS5lcnJzdHIgPSAiaW52YWxpZCBhY2Nlc3MgdG8gbWFwIHZhbHVlLCB2YWx1ZV9zaXplPTQ4IG9mZj00OCBzaXplPTgiLAorCQkucmVzdWx0ID0gUkVKRUNULAorCX0sCisJeworCQkiaW52YWxpZCBtYXAgYWNjZXNzIGludG8gYW4gYXJyYXkgd2l0aCBhIHJlZ2lzdGVyIiwKKwkJLmluc25zID0geworCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCA0KSwKKwkJCUJQRl9NT1Y2NF9JTU0oQlBGX1JFR18xLCBNQVhfRU5UUklFUyArIDEpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTFNILCBCUEZfUkVHXzEsIDIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBCUEZfUkVHXzAsIEJQRl9SRUdfMSksCisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18wLCAwLCBvZmZzZXRvZihzdHJ1Y3QgdGVzdF92YWwsIGZvbykpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQkudGVzdF92YWxfbWFwX2ZpeHVwID0gezN9LAorCQkuZXJyc3RyID0gIlIwIG1pbiB2YWx1ZSBpcyBvdXRzaWRlIG9mIHRoZSBhcnJheSByYW5nZSIsCisJCS5yZXN1bHQgPSBSRUpFQ1QsCisJfSwKKwl7CisJCSJpbnZhbGlkIG1hcCBhY2Nlc3MgaW50byBhbiBhcnJheSB3aXRoIGEgdmFyaWFibGUiLAorCQkuaW5zbnMgPSB7CisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBCUEZfUkVHXzAsIDAsIDQpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMSwgQlBGX1JFR18wLCAwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0xTSCwgQlBGX1JFR18xLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgQlBGX1JFR18wLCBCUEZfUkVHXzEpLAorCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgMCwgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszfSwKKwkJLmVycnN0ciA9ICJSMCBtaW4gdmFsdWUgaXMgbmVnYXRpdmUsIGVpdGhlciB1c2UgdW5zaWduZWQgaW5kZXggb3IgZG8gYSBpZiAoaW5kZXggPj0wKSBjaGVjay4iLAorCQkucmVzdWx0ID0gUkVKRUNULAorCX0sCisJeworCQkiaW52YWxpZCBtYXAgYWNjZXNzIGludG8gYW4gYXJyYXkgd2l0aCBubyBmbG9vciBjaGVjayIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEwLCAtOCwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgLTgpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgNyksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18xLCBCUEZfUkVHXzAsIDApLAorCQkJQlBGX01PVjMyX0lNTShCUEZfUkVHXzIsIE1BWF9FTlRSSUVTKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KU0dULCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwgMSksCisJCQlCUEZfTU9WMzJfSU1NKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9MU0gsIEJQRl9SRUdfMSwgMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIEJQRl9SRUdfMCwgQlBGX1JFR18xKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIDAsIG9mZnNldG9mKHN0cnVjdCB0ZXN0X3ZhbCwgZm9vKSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS50ZXN0X3ZhbF9tYXBfZml4dXAgPSB7M30sCisJCS5lcnJzdHIgPSAiUjAgbWluIHZhbHVlIGlzIG5lZ2F0aXZlLCBlaXRoZXIgdXNlIHVuc2lnbmVkIGluZGV4IG9yIGRvIGEgaWYgKGluZGV4ID49MCkgY2hlY2suIiwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwl9LAorCXsKKwkJImludmFsaWQgbWFwIGFjY2VzcyBpbnRvIGFuIGFycmF5IHdpdGggYSBpbnZhbGlkIG1heCBjaGVjayIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEwLCAtOCwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgLTgpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgNyksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18xLCBCUEZfUkVHXzAsIDApLAorCQkJQlBGX01PVjMyX0lNTShCUEZfUkVHXzIsIE1BWF9FTlRSSUVTICsgMSksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBCUEZfUkVHXzIsIEJQRl9SRUdfMSwgMSksCisJCQlCUEZfTU9WMzJfSU1NKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9MU0gsIEJQRl9SRUdfMSwgMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIEJQRl9SRUdfMCwgQlBGX1JFR18xKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzAsIDAsIG9mZnNldG9mKHN0cnVjdCB0ZXN0X3ZhbCwgZm9vKSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS50ZXN0X3ZhbF9tYXBfZml4dXAgPSB7M30sCisJCS5lcnJzdHIgPSAiaW52YWxpZCBhY2Nlc3MgdG8gbWFwIHZhbHVlLCB2YWx1ZV9zaXplPTQ4IG9mZj00NCBzaXplPTgiLAorCQkucmVzdWx0ID0gUkVKRUNULAorCX0sCisJeworCQkiaW52YWxpZCBtYXAgYWNjZXNzIGludG8gYW4gYXJyYXkgd2l0aCBhIGludmFsaWQgbWF4IGNoZWNrIiwKKwkJLmluc25zID0geworCQkJQlBGX1NUX01FTShCUEZfRFcsIEJQRl9SRUdfMTAsIC04LCAwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoQlBGX1JFR18yLCBCUEZfUkVHXzEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgQlBGX1JFR18yLCAtOCksCisJCQlCUEZfTERfTUFQX0ZEKEJQRl9SRUdfMSwgMCksCisJCQlCUEZfUkFXX0lOU04oQlBGX0pNUCB8IEJQRl9DQUxMLCAwLCAwLCAwLCBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW0pLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgQlBGX1JFR18wLCAwLCAxMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfOCwgQlBGX1JFR18wKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBCUEZfUkVHXzEwLCAtOCwgMCksCisJCQlCUEZfTU9WNjRfUkVHKEJQRl9SRUdfMiwgQlBGX1JFR18xMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIEJQRl9SRUdfMiwgLTgpLAorCQkJQlBGX0xEX01BUF9GRChCUEZfUkVHXzEsIDApLAorCQkJQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIEJQRl9SRUdfMCwgMCwgMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIEJQRl9SRUdfMCwgQlBGX1JFR184KSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzAsIEJQRl9SRUdfMCwgb2Zmc2V0b2Yoc3RydWN0IHRlc3RfdmFsLCBmb28pKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJLnRlc3RfdmFsX21hcF9maXh1cCA9IHszLCAxMX0sCisJCS5lcnJzdHIgPSAiUjAgbWluIHZhbHVlIGlzIG5lZ2F0aXZlLCBlaXRoZXIgdXNlIHVuc2lnbmVkIGluZGV4IG9yIGRvIGEgaWYgKGluZGV4ID49MCkgY2hlY2suIiwKKwkJLnJlc3VsdCA9IFJFSkVDVCwKKwl9LAogfTsKIAogc3RhdGljIGludCBwcm9iZV9maWx0ZXJfbGVuZ3RoKHN0cnVjdCBicGZfaW5zbiAqZnApCkBAIC0xNTQxLDEyICsyMzk2LDEyIEBACiAJcmV0dXJuIGxlbiArIDE7CiB9CiAKLXN0YXRpYyBpbnQgY3JlYXRlX21hcCh2b2lkKQorc3RhdGljIGludCBjcmVhdGVfbWFwKHNpemVfdCB2YWxfc2l6ZSwgaW50IG51bSkKIHsKIAlpbnQgbWFwX2ZkOwogCiAJbWFwX2ZkID0gYnBmX2NyZWF0ZV9tYXAoQlBGX01BUF9UWVBFX0hBU0gsCi0JCQkJc2l6ZW9mKGxvbmcgbG9uZyksIHNpemVvZihsb25nIGxvbmcpLCAxMDI0LCAwKTsKKwkJCQlzaXplb2YobG9uZyBsb25nKSwgdmFsX3NpemUsIG51bSwgMCk7CiAJaWYgKG1hcF9mZCA8IDApCiAJCXByaW50ZigiZmFpbGVkIHRvIGNyZWF0ZSBtYXAgJyVzJ1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKIApAQCAtMTU3NiwxMiArMjQzMSwxMyBAQAogCQlpbnQgcHJvZ19sZW4gPSBwcm9iZV9maWx0ZXJfbGVuZ3RoKHByb2cpOwogCQlpbnQgKmZpeHVwID0gdGVzdHNbaV0uZml4dXA7CiAJCWludCAqcHJvZ19hcnJheV9maXh1cCA9IHRlc3RzW2ldLnByb2dfYXJyYXlfZml4dXA7CisJCWludCAqdGVzdF92YWxfbWFwX2ZpeHVwID0gdGVzdHNbaV0udGVzdF92YWxfbWFwX2ZpeHVwOwogCQlpbnQgZXhwZWN0ZWRfcmVzdWx0OwogCQljb25zdCBjaGFyICpleHBlY3RlZF9lcnJzdHI7Ci0JCWludCBtYXBfZmQgPSAtMSwgcHJvZ19hcnJheV9mZCA9IC0xOworCQlpbnQgbWFwX2ZkID0gLTEsIHByb2dfYXJyYXlfZmQgPSAtMSwgdGVzdF92YWxfbWFwX2ZkID0gLTE7CiAKIAkJaWYgKCpmaXh1cCkgewotCQkJbWFwX2ZkID0gY3JlYXRlX21hcCgpOworCQkJbWFwX2ZkID0gY3JlYXRlX21hcChzaXplb2YobG9uZyBsb25nKSwgMTAyNCk7CiAKIAkJCWRvIHsKIAkJCQlwcm9nWypmaXh1cF0uaW1tID0gbWFwX2ZkOwpAQCAtMTU5Niw2ICsyNDUyLDE4IEBACiAJCQkJcHJvZ19hcnJheV9maXh1cCsrOwogCQkJfSB3aGlsZSAoKnByb2dfYXJyYXlfZml4dXApOwogCQl9CisJCWlmICgqdGVzdF92YWxfbWFwX2ZpeHVwKSB7CisJCQkvKiBVbnByaXZpbGVnZWQgY2FuJ3QgY3JlYXRlIGEgaGFzaCBtYXAuKi8KKwkJCWlmICh1bnByaXYpCisJCQkJY29udGludWU7CisJCQl0ZXN0X3ZhbF9tYXBfZmQgPSBjcmVhdGVfbWFwKHNpemVvZihzdHJ1Y3QgdGVzdF92YWwpLAorCQkJCQkJICAgICAyNTYpOworCQkJZG8geworCQkJCXByb2dbKnRlc3RfdmFsX21hcF9maXh1cF0uaW1tID0gdGVzdF92YWxfbWFwX2ZkOworCQkJCXRlc3RfdmFsX21hcF9maXh1cCsrOworCQkJfSB3aGlsZSAoKnRlc3RfdmFsX21hcF9maXh1cCk7CisJCX0KKwogCQlwcmludGYoIiMlZCAlcyAiLCBpLCB0ZXN0c1tpXS5kZXNjcik7CiAKIAkJcHJvZ19mZCA9IGJwZl9wcm9nX2xvYWQocHJvZ190eXBlID86IEJQRl9QUk9HX1RZUEVfU09DS0VUX0ZJTFRFUiwKQEAgLTE2NDIsNiArMjUxMCw4IEBACiAJCQljbG9zZShtYXBfZmQpOwogCQlpZiAocHJvZ19hcnJheV9mZCA+PSAwKQogCQkJY2xvc2UocHJvZ19hcnJheV9mZCk7CisJCWlmICh0ZXN0X3ZhbF9tYXBfZmQgPj0gMCkKKwkJCWNsb3NlKHRlc3RfdmFsX21hcF9mZCk7CiAJCWNsb3NlKHByb2dfZmQpOwogCiAJfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdHJhY2VfZXZlbnRfa2Vybi5jIGIvc2FtcGxlcy9icGYvdHJhY2VfZXZlbnRfa2Vybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYThlZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2JwZi90cmFjZV9ldmVudF9rZXJuLmMKQEAgLTAsMCArMSw2NSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2IEZhY2Vib29rCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JwZi5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmX3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L3BlcmZfZXZlbnQuaD4KKyNpbmNsdWRlICJicGZfaGVscGVycy5oIgorCitzdHJ1Y3Qga2V5X3QgeworCWNoYXIgY29tbVtUQVNLX0NPTU1fTEVOXTsKKwl1MzIga2VybnN0YWNrOworCXUzMiB1c2Vyc3RhY2s7Cit9OworCitzdHJ1Y3QgYnBmX21hcF9kZWYgU0VDKCJtYXBzIikgY291bnRzID0geworCS50eXBlID0gQlBGX01BUF9UWVBFX0hBU0gsCisJLmtleV9zaXplID0gc2l6ZW9mKHN0cnVjdCBrZXlfdCksCisJLnZhbHVlX3NpemUgPSBzaXplb2YodTY0KSwKKwkubWF4X2VudHJpZXMgPSAxMDAwMCwKK307CisKK3N0cnVjdCBicGZfbWFwX2RlZiBTRUMoIm1hcHMiKSBzdGFja21hcCA9IHsKKwkudHlwZSA9IEJQRl9NQVBfVFlQRV9TVEFDS19UUkFDRSwKKwkua2V5X3NpemUgPSBzaXplb2YodTMyKSwKKwkudmFsdWVfc2l6ZSA9IFBFUkZfTUFYX1NUQUNLX0RFUFRIICogc2l6ZW9mKHU2NCksCisJLm1heF9lbnRyaWVzID0gMTAwMDAsCit9OworCisjZGVmaW5lIEtFUk5fU1RBQ0tJRF9GTEFHUyAoMCB8IEJQRl9GX0ZBU1RfU1RBQ0tfQ01QKQorI2RlZmluZSBVU0VSX1NUQUNLSURfRkxBR1MgKDAgfCBCUEZfRl9GQVNUX1NUQUNLX0NNUCB8IEJQRl9GX1VTRVJfU1RBQ0spCisKK1NFQygicGVyZl9ldmVudCIpCitpbnQgYnBmX3Byb2cxKHN0cnVjdCBicGZfcGVyZl9ldmVudF9kYXRhICpjdHgpCit7CisJY2hhciBmbXRbXSA9ICJDUFUtJWQgcGVyaW9kICVsbGQgaXAgJWxseCI7CisJdTMyIGNwdSA9IGJwZl9nZXRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBrZXlfdCBrZXk7CisJdTY0ICp2YWwsIG9uZSA9IDE7CisKKwlpZiAoY3R4LT5zYW1wbGVfcGVyaW9kIDwgMTAwMDApCisJCS8qIGlnbm9yZSB3YXJtdXAgKi8KKwkJcmV0dXJuIDA7CisJYnBmX2dldF9jdXJyZW50X2NvbW0oJmtleS5jb21tLCBzaXplb2Yoa2V5LmNvbW0pKTsKKwlrZXkua2VybnN0YWNrID0gYnBmX2dldF9zdGFja2lkKGN0eCwgJnN0YWNrbWFwLCBLRVJOX1NUQUNLSURfRkxBR1MpOworCWtleS51c2Vyc3RhY2sgPSBicGZfZ2V0X3N0YWNraWQoY3R4LCAmc3RhY2ttYXAsIFVTRVJfU1RBQ0tJRF9GTEFHUyk7CisJaWYgKChpbnQpa2V5Lmtlcm5zdGFjayA8IDAgJiYgKGludClrZXkudXNlcnN0YWNrIDwgMCkgeworCQlicGZfdHJhY2VfcHJpbnRrKGZtdCwgc2l6ZW9mKGZtdCksIGNwdSwgY3R4LT5zYW1wbGVfcGVyaW9kLAorCQkJCSBjdHgtPnJlZ3MuaXApOworCQlyZXR1cm4gMDsKKwl9CisKKwl2YWwgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZjb3VudHMsICZrZXkpOworCWlmICh2YWwpCisJCSgqdmFsKSsrOworCWVsc2UKKwkJYnBmX21hcF91cGRhdGVfZWxlbSgmY291bnRzLCAma2V5LCAmb25lLCBCUEZfTk9FWElTVCk7CisJcmV0dXJuIDA7Cit9CisKK2NoYXIgX2xpY2Vuc2VbXSBTRUMoImxpY2Vuc2UiKSA9ICJHUEwiOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdHJhY2VfZXZlbnRfdXNlci5jIGIvc2FtcGxlcy9icGYvdHJhY2VfZXZlbnRfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTMwZDMxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9icGYvdHJhY2VfZXZlbnRfdXNlci5jCkBAIC0wLDAgKzEsMjEzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYgRmFjZWJvb2sKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSAibGliYnBmLmgiCisjaW5jbHVkZSAiYnBmX2xvYWQuaCIKKworI2RlZmluZSBTQU1QTEVfRlJFUSA1MAorCitzdGF0aWMgYm9vbCBzeXNfcmVhZF9zZWVuLCBzeXNfd3JpdGVfc2VlbjsKKworc3RhdGljIHZvaWQgcHJpbnRfa3N5bShfX3U2NCBhZGRyKQoreworCXN0cnVjdCBrc3ltICpzeW07CisKKwlpZiAoIWFkZHIpCisJCXJldHVybjsKKwlzeW0gPSBrc3ltX3NlYXJjaChhZGRyKTsKKwlwcmludGYoIiVzOyIsIHN5bS0+bmFtZSk7CisJaWYgKCFzdHJjbXAoc3ltLT5uYW1lLCAic3lzX3JlYWQiKSkKKwkJc3lzX3JlYWRfc2VlbiA9IHRydWU7CisJZWxzZSBpZiAoIXN0cmNtcChzeW0tPm5hbWUsICJzeXNfd3JpdGUiKSkKKwkJc3lzX3dyaXRlX3NlZW4gPSB0cnVlOworfQorCitzdGF0aWMgdm9pZCBwcmludF9hZGRyKF9fdTY0IGFkZHIpCit7CisJaWYgKCFhZGRyKQorCQlyZXR1cm47CisJcHJpbnRmKCIlbGx4OyIsIGFkZHIpOworfQorCisjZGVmaW5lIFRBU0tfQ09NTV9MRU4gMTYKKworc3RydWN0IGtleV90IHsKKwljaGFyIGNvbW1bVEFTS19DT01NX0xFTl07CisJX191MzIga2VybnN0YWNrOworCV9fdTMyIHVzZXJzdGFjazsKK307CisKK3N0YXRpYyB2b2lkIHByaW50X3N0YWNrKHN0cnVjdCBrZXlfdCAqa2V5LCBfX3U2NCBjb3VudCkKK3sKKwlfX3U2NCBpcFtQRVJGX01BWF9TVEFDS19ERVBUSF0gPSB7fTsKKwlzdGF0aWMgYm9vbCB3YXJuZWQ7CisJaW50IGk7CisKKwlwcmludGYoIiUzbGxkICVzOyIsIGNvdW50LCBrZXktPmNvbW0pOworCWlmIChicGZfbG9va3VwX2VsZW0obWFwX2ZkWzFdLCAma2V5LT5rZXJuc3RhY2ssIGlwKSAhPSAwKSB7CisJCXByaW50ZigiLS0tOyIpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IFBFUkZfTUFYX1NUQUNLX0RFUFRIIC0gMTsgaSA+PSAwOyBpLS0pCisJCQlwcmludF9rc3ltKGlwW2ldKTsKKwl9CisJcHJpbnRmKCItOyIpOworCWlmIChicGZfbG9va3VwX2VsZW0obWFwX2ZkWzFdLCAma2V5LT51c2Vyc3RhY2ssIGlwKSAhPSAwKSB7CisJCXByaW50ZigiLS0tOyIpOworCX0gZWxzZSB7CisJCWZvciAoaSA9IFBFUkZfTUFYX1NUQUNLX0RFUFRIIC0gMTsgaSA+PSAwOyBpLS0pCisJCQlwcmludF9hZGRyKGlwW2ldKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJaWYgKGtleS0+a2VybnN0YWNrID09IC1FRVhJU1QgJiYgIXdhcm5lZCkgeworCQlwcmludGYoInN0YWNrbWFwIGNvbGxpc2lvbnMgc2Vlbi4gQ29uc2lkZXIgaW5jcmVhc2luZyBzaXplXG4iKTsKKwkJd2FybmVkID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKChpbnQpa2V5LT5rZXJuc3RhY2sgPCAwICYmIChpbnQpa2V5LT51c2Vyc3RhY2sgPCAwKSB7CisJCXByaW50ZigiZXJyIHN0YWNraWQgJWQgJWRcbiIsIGtleS0+a2VybnN0YWNrLCBrZXktPnVzZXJzdGFjayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBpbnRfZXhpdChpbnQgc2lnKQoreworCWtpbGwoMCwgU0lHS0lMTCk7CisJZXhpdCgwKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhY2tzKHZvaWQpCit7CisJc3RydWN0IGtleV90IGtleSA9IHt9LCBuZXh0X2tleTsKKwlfX3U2NCB2YWx1ZTsKKwlfX3UzMiBzdGFja2lkID0gMCwgbmV4dF9pZDsKKwlpbnQgZmQgPSBtYXBfZmRbMF0sIHN0YWNrX21hcCA9IG1hcF9mZFsxXTsKKworCXN5c19yZWFkX3NlZW4gPSBzeXNfd3JpdGVfc2VlbiA9IGZhbHNlOworCXdoaWxlIChicGZfZ2V0X25leHRfa2V5KGZkLCAma2V5LCAmbmV4dF9rZXkpID09IDApIHsKKwkJYnBmX2xvb2t1cF9lbGVtKGZkLCAmbmV4dF9rZXksICZ2YWx1ZSk7CisJCXByaW50X3N0YWNrKCZuZXh0X2tleSwgdmFsdWUpOworCQlicGZfZGVsZXRlX2VsZW0oZmQsICZuZXh0X2tleSk7CisJCWtleSA9IG5leHRfa2V5OworCX0KKworCWlmICghc3lzX3JlYWRfc2VlbiB8fCAhc3lzX3dyaXRlX3NlZW4pIHsKKwkJcHJpbnRmKCJCVUcga2VybmVsIHN0YWNrIGRvZXNuJ3QgY29udGFpbiBzeXNfcmVhZCgpIGFuZCBzeXNfd3JpdGUoKVxuIik7CisJCWludF9leGl0KDApOworCX0KKworCS8qIGNsZWFyIHN0YWNrIG1hcCAqLworCXdoaWxlIChicGZfZ2V0X25leHRfa2V5KHN0YWNrX21hcCwgJnN0YWNraWQsICZuZXh0X2lkKSA9PSAwKSB7CisJCWJwZl9kZWxldGVfZWxlbShzdGFja19tYXAsICZuZXh0X2lkKTsKKwkJc3RhY2tpZCA9IG5leHRfaWQ7CisJfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X3BlcmZfZXZlbnRfYWxsX2NwdShzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQoreworCWludCBucl9jcHVzID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfQ09ORik7CisJaW50ICpwbXVfZmQgPSBtYWxsb2MobnJfY3B1cyAqIHNpemVvZihpbnQpKTsKKwlpbnQgaTsKKworCS8qIG9wZW4gcGVyZl9ldmVudCBvbiBhbGwgY3B1cyAqLworCWZvciAoaSA9IDA7IGkgPCBucl9jcHVzOyBpKyspIHsKKwkJcG11X2ZkW2ldID0gcGVyZl9ldmVudF9vcGVuKGF0dHIsIC0xLCBpLCAtMSwgMCk7CisJCWlmIChwbXVfZmRbaV0gPCAwKSB7CisJCQlwcmludGYoInBlcmZfZXZlbnRfb3BlbiBmYWlsZWRcbiIpOworCQkJZ290byBhbGxfY3B1X2VycjsKKwkJfQorCQlhc3NlcnQoaW9jdGwocG11X2ZkW2ldLCBQRVJGX0VWRU5UX0lPQ19TRVRfQlBGLCBwcm9nX2ZkWzBdKSA9PSAwKTsKKwkJYXNzZXJ0KGlvY3RsKHBtdV9mZFtpXSwgUEVSRl9FVkVOVF9JT0NfRU5BQkxFLCAwKSA9PSAwKTsKKwl9CisJc3lzdGVtKCJkZCBpZj0vZGV2L3plcm8gb2Y9L2Rldi9udWxsIGNvdW50PTUwMDBrIik7CisJcHJpbnRfc3RhY2tzKCk7CithbGxfY3B1X2VycjoKKwlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCisJCWNsb3NlKHBtdV9mZFtpXSk7CisJZnJlZShwbXVfZmQpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3BlcmZfZXZlbnRfdGFzayhzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKQoreworCWludCBwbXVfZmQ7CisKKwkvKiBvcGVuIHRhc2sgYm91bmQgZXZlbnQgKi8KKwlwbXVfZmQgPSBwZXJmX2V2ZW50X29wZW4oYXR0ciwgMCwgLTEsIC0xLCAwKTsKKwlpZiAocG11X2ZkIDwgMCkgeworCQlwcmludGYoInBlcmZfZXZlbnRfb3BlbiBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCWFzc2VydChpb2N0bChwbXVfZmQsIFBFUkZfRVZFTlRfSU9DX1NFVF9CUEYsIHByb2dfZmRbMF0pID09IDApOworCWFzc2VydChpb2N0bChwbXVfZmQsIFBFUkZfRVZFTlRfSU9DX0VOQUJMRSwgMCkgPT0gMCk7CisJc3lzdGVtKCJkZCBpZj0vZGV2L3plcm8gb2Y9L2Rldi9udWxsIGNvdW50PTUwMDBrIik7CisJcHJpbnRfc3RhY2tzKCk7CisJY2xvc2UocG11X2ZkKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9icGZfcGVyZl9ldmVudCh2b2lkKQoreworCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cl90eXBlX2h3ID0geworCQkuc2FtcGxlX2ZyZXEgPSBTQU1QTEVfRlJFUSwKKwkJLmZyZXEgPSAxLAorCQkudHlwZSA9IFBFUkZfVFlQRV9IQVJEV0FSRSwKKwkJLmNvbmZpZyA9IFBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUywKKwkJLmluaGVyaXQgPSAxLAorCX07CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyX3R5cGVfc3cgPSB7CisJCS5zYW1wbGVfZnJlcSA9IFNBTVBMRV9GUkVRLAorCQkuZnJlcSA9IDEsCisJCS50eXBlID0gUEVSRl9UWVBFX1NPRlRXQVJFLAorCQkuY29uZmlnID0gUEVSRl9DT1VOVF9TV19DUFVfQ0xPQ0ssCisJCS5pbmhlcml0ID0gMSwKKwl9OworCisJdGVzdF9wZXJmX2V2ZW50X2FsbF9jcHUoJmF0dHJfdHlwZV9odyk7CisJdGVzdF9wZXJmX2V2ZW50X3Rhc2soJmF0dHJfdHlwZV9odyk7CisJdGVzdF9wZXJmX2V2ZW50X2FsbF9jcHUoJmF0dHJfdHlwZV9zdyk7CisJdGVzdF9wZXJmX2V2ZW50X3Rhc2soJmF0dHJfdHlwZV9zdyk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBybGltaXQgciA9IHtSTElNX0lORklOSVRZLCBSTElNX0lORklOSVRZfTsKKwljaGFyIGZpbGVuYW1lWzI1Nl07CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzX2tlcm4ubyIsIGFyZ3ZbMF0pOworCXNldHJsaW1pdChSTElNSVRfTUVNTE9DSywgJnIpOworCisJc2lnbmFsKFNJR0lOVCwgaW50X2V4aXQpOworCisJaWYgKGxvYWRfa2FsbHN5bXMoKSkgeworCQlwcmludGYoImZhaWxlZCB0byBwcm9jZXNzIC9wcm9jL2thbGxzeW1zXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGxvYWRfYnBmX2ZpbGUoZmlsZW5hbWUpKSB7CisJCXByaW50ZigiJXMiLCBicGZfbG9nX2J1Zik7CisJCXJldHVybiAyOworCX0KKworCWlmIChmb3JrKCkgPT0gMCkgeworCQlyZWFkX3RyYWNlX3BpcGUoKTsKKwkJcmV0dXJuIDA7CisJfQorCXRlc3RfYnBmX3BlcmZfZXZlbnQoKTsKKworCWludF9leGl0KDApOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdHJhY2V4NV9rZXJuLmMgYi9zYW1wbGVzL2JwZi90cmFjZXg1X2tlcm4uYwppbmRleCBmOTVmMjMyLi5mZDEyZDcxIDEwMDY0NAotLS0gYS9zYW1wbGVzL2JwZi90cmFjZXg1X2tlcm4uYworKysgYi9zYW1wbGVzL2JwZi90cmFjZXg1X2tlcm4uYwpAQCAtMTksMjAgKzE5LDE4IEBACiAJLm1heF9lbnRyaWVzID0gMTAyNCwKIH07CiAKLVNFQygia3Byb2JlL3NlY2NvbXBfcGhhc2UxIikKK1NFQygia3Byb2JlL19fc2VjY29tcF9maWx0ZXIiKQogaW50IGJwZl9wcm9nMShzdHJ1Y3QgcHRfcmVncyAqY3R4KQogewotCXN0cnVjdCBzZWNjb21wX2RhdGEgc2Q7Ci0KLQlicGZfcHJvYmVfcmVhZCgmc2QsIHNpemVvZihzZCksICh2b2lkICopUFRfUkVHU19QQVJNMShjdHgpKTsKKwlpbnQgc2NfbnIgPSAoaW50KVBUX1JFR1NfUEFSTTEoY3R4KTsKIAogCS8qIGRpc3BhdGNoIGludG8gbmV4dCBCUEYgcHJvZ3JhbSBkZXBlbmRpbmcgb24gc3lzY2FsbCBudW1iZXIgKi8KLQlicGZfdGFpbF9jYWxsKGN0eCwgJnByb2dzLCBzZC5ucik7CisJYnBmX3RhaWxfY2FsbChjdHgsICZwcm9ncywgc2NfbnIpOwogCiAJLyogZmFsbCB0aHJvdWdoIC0+IHVua25vd24gc3lzY2FsbCAqLwotCWlmIChzZC5uciA+PSBfX05SX2dldHVpZCAmJiBzZC5uciA8PSBfX05SX2dldHNpZCkgeworCWlmIChzY19uciA+PSBfX05SX2dldHVpZCAmJiBzY19uciA8PSBfX05SX2dldHNpZCkgewogCQljaGFyIGZtdFtdID0gInN5c2NhbGw9JWQgKG9uZSBvZiBnZXQvc2V0IHVpZC9waWQvZ2lkKVxuIjsKLQkJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLCBzZC5ucik7CisJCWJwZl90cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwgc2NfbnIpOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTQyLDcgKzQwLDcgQEAKIHsKIAlzdHJ1Y3Qgc2VjY29tcF9kYXRhIHNkOwogCi0JYnBmX3Byb2JlX3JlYWQoJnNkLCBzaXplb2Yoc2QpLCAodm9pZCAqKVBUX1JFR1NfUEFSTTEoY3R4KSk7CisJYnBmX3Byb2JlX3JlYWQoJnNkLCBzaXplb2Yoc2QpLCAodm9pZCAqKVBUX1JFR1NfUEFSTTIoY3R4KSk7CiAJaWYgKHNkLmFyZ3NbMl0gPT0gNTEyKSB7CiAJCWNoYXIgZm10W10gPSAid3JpdGUoZmQ9JWQsIGJ1Zj0lcCwgc2l6ZT0lZClcbiI7CiAJCWJwZl90cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwKQEAgLTU1LDcgKzUzLDcgQEAKIHsKIAlzdHJ1Y3Qgc2VjY29tcF9kYXRhIHNkOwogCi0JYnBmX3Byb2JlX3JlYWQoJnNkLCBzaXplb2Yoc2QpLCAodm9pZCAqKVBUX1JFR1NfUEFSTTEoY3R4KSk7CisJYnBmX3Byb2JlX3JlYWQoJnNkLCBzaXplb2Yoc2QpLCAodm9pZCAqKVBUX1JFR1NfUEFSTTIoY3R4KSk7CiAJaWYgKHNkLmFyZ3NbMl0gPiAxMjggJiYgc2QuYXJnc1syXSA8PSAxMDI0KSB7CiAJCWNoYXIgZm10W10gPSAicmVhZChmZD0lZCwgYnVmPSVwLCBzaXplPSVkKVxuIjsKIAkJYnBmX3RyYWNlX3ByaW50ayhmbXQsIHNpemVvZihmbXQpLApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdHJhY2V4NV91c2VyLmMgYi9zYW1wbGVzL2JwZi90cmFjZXg1X3VzZXIuYwppbmRleCBhMDRkZDNjLi4zNmI1OTI1IDEwMDY0NAotLS0gYS9zYW1wbGVzL2JwZi90cmFjZXg1X3VzZXIuYworKysgYi9zYW1wbGVzL2JwZi90cmFjZXg1X3VzZXIuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlICJsaWJicGYuaCIKICNpbmNsdWRlICJicGZfbG9hZC5oIgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCiAvKiBpbnN0YWxsIGZha2Ugc2VjY29tcCBwcm9ncmFtIHRvIGVuYWJsZSBzZWNjb21wIGNvZGUgcGF0aCBpbnNpZGUgdGhlIGtlcm5lbCwKICAqIHNvIHRoYXQgb3VyIGtwcm9iZSBhdHRhY2hlZCB0byBzZWNjb21wX3BoYXNlMSgpIGNhbiBiZSB0cmlnZ2VyZWQKQEAgLTI3LDggKzI4LDEwIEBACiB7CiAJRklMRSAqZjsKIAljaGFyIGZpbGVuYW1lWzI1Nl07CisJc3RydWN0IHJsaW1pdCByID0ge1JMSU1fSU5GSU5JVFksIFJMSU1fSU5GSU5JVFl9OwogCiAJc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlc19rZXJuLm8iLCBhcmd2WzBdKTsKKwlzZXRybGltaXQoUkxJTUlUX01FTUxPQ0ssICZyKTsKIAogCWlmIChsb2FkX2JwZl9maWxlKGZpbGVuYW1lKSkgewogCQlwcmludGYoIiVzIiwgYnBmX2xvZ19idWYpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9ycG1zZy9ycG1zZ19jbGllbnRfc2FtcGxlLmMgYi9zYW1wbGVzL3JwbXNnL3JwbXNnX2NsaWVudF9zYW1wbGUuYwppbmRleCBkMGUyNDljOS4uZjE2MWRmZCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9ycG1zZy9ycG1zZ19jbGllbnRfc2FtcGxlLmMKKysrIGIvc2FtcGxlcy9ycG1zZy9ycG1zZ19jbGllbnRfc2FtcGxlLmMKQEAgLTI0LDM4ICsyNCw1MiBAQAogI2RlZmluZSBNU0cJCSJoZWxsbyB3b3JsZCEiCiAjZGVmaW5lIE1TR19MSU1JVAkxMDAKIAotc3RhdGljIHZvaWQgcnBtc2dfc2FtcGxlX2NiKHN0cnVjdCBycG1zZ19jaGFubmVsICpycGRldiwgdm9pZCAqZGF0YSwgaW50IGxlbiwKK3N0cnVjdCBpbnN0YW5jZV9kYXRhIHsKKwlpbnQgcnhfY291bnQ7Cit9OworCitzdGF0aWMgaW50IHJwbXNnX3NhbXBsZV9jYihzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldiwgdm9pZCAqZGF0YSwgaW50IGxlbiwKIAkJCQkJCXZvaWQgKnByaXYsIHUzMiBzcmMpCiB7CiAJaW50IHJldDsKLQlzdGF0aWMgaW50IHJ4X2NvdW50OworCXN0cnVjdCBpbnN0YW5jZV9kYXRhICppZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcnBkZXYtPmRldik7CiAKLQlkZXZfaW5mbygmcnBkZXYtPmRldiwgImluY29taW5nIG1zZyAlZCAoc3JjOiAweCV4KVxuIiwgKytyeF9jb3VudCwgc3JjKTsKKwlkZXZfaW5mbygmcnBkZXYtPmRldiwgImluY29taW5nIG1zZyAlZCAoc3JjOiAweCV4KVxuIiwKKwkJICsraWRhdGEtPnJ4X2NvdW50LCBzcmMpOwogCiAJcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgX19mdW5jX18sIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLAogCQkgICAgICAgZGF0YSwgbGVuLCAgdHJ1ZSk7CiAKIAkvKiBzYW1wbGVzIHNob3VsZCBub3QgbGl2ZSBmb3JldmVyICovCi0JaWYgKHJ4X2NvdW50ID49IE1TR19MSU1JVCkgeworCWlmIChpZGF0YS0+cnhfY291bnQgPj0gTVNHX0xJTUlUKSB7CiAJCWRldl9pbmZvKCZycGRldi0+ZGV2LCAiZ29vZGJ5ZSFcbiIpOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAogCS8qIHNlbmQgYSBuZXcgbWVzc2FnZSBub3cgKi8KLQlyZXQgPSBycG1zZ19zZW5kKHJwZGV2LCBNU0csIHN0cmxlbihNU0cpKTsKKwlyZXQgPSBycG1zZ19zZW5kKHJwZGV2LT5lcHQsIE1TRywgc3RybGVuKE1TRykpOwogCWlmIChyZXQpCiAJCWRldl9lcnIoJnJwZGV2LT5kZXYsICJycG1zZ19zZW5kIGZhaWxlZDogJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBycG1zZ19zYW1wbGVfcHJvYmUoc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2KQorc3RhdGljIGludCBycG1zZ19zYW1wbGVfcHJvYmUoc3RydWN0IHJwbXNnX2RldmljZSAqcnBkZXYpCiB7CiAJaW50IHJldDsKKwlzdHJ1Y3QgaW5zdGFuY2VfZGF0YSAqaWRhdGE7CiAKIAlkZXZfaW5mbygmcnBkZXYtPmRldiwgIm5ldyBjaGFubmVsOiAweCV4IC0+IDB4JXghXG4iLAogCQkJCQlycGRldi0+c3JjLCBycGRldi0+ZHN0KTsKIAorCWlkYXRhID0gZGV2bV9remFsbG9jKCZycGRldi0+ZGV2LCBzaXplb2YoKmlkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXZfc2V0X2RydmRhdGEoJnJwZGV2LT5kZXYsIGlkYXRhKTsKKwogCS8qIHNlbmQgYSBtZXNzYWdlIHRvIG91ciByZW1vdGUgcHJvY2Vzc29yICovCi0JcmV0ID0gcnBtc2dfc2VuZChycGRldiwgTVNHLCBzdHJsZW4oTVNHKSk7CisJcmV0ID0gcnBtc2dfc2VuZChycGRldi0+ZXB0LCBNU0csIHN0cmxlbihNU0cpKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnJwZGV2LT5kZXYsICJycG1zZ19zZW5kIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC02NCw3ICs3OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJwbXNnX3NhbXBsZV9yZW1vdmUoc3RydWN0IHJwbXNnX2NoYW5uZWwgKnJwZGV2KQorc3RhdGljIHZvaWQgcnBtc2dfc2FtcGxlX3JlbW92ZShzdHJ1Y3QgcnBtc2dfZGV2aWNlICpycGRldikKIHsKIAlkZXZfaW5mbygmcnBkZXYtPmRldiwgInJwbXNnIHNhbXBsZSBjbGllbnQgZHJpdmVyIGlzIHJlbW92ZWRcbiIpOwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS51YnNhbiBiL3NjcmlwdHMvTWFrZWZpbGUudWJzYW4KaW5kZXggOGFiNjg2Ny4uZGQ3NzljNCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS51YnNhbgorKysgYi9zY3JpcHRzL01ha2VmaWxlLnVic2FuCkBAIC0zLDcgKzMsNiBAQAogICAgICAgQ0ZMQUdTX1VCU0FOICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mc2FuaXRpemU9aW50ZWdlci1kaXZpZGUtYnktemVybykKICAgICAgIENGTEFHU19VQlNBTiArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtZnNhbml0aXplPXVucmVhY2hhYmxlKQogICAgICAgQ0ZMQUdTX1VCU0FOICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mc2FuaXRpemU9dmxhLWJvdW5kKQotICAgICAgQ0ZMQUdTX1VCU0FOICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mc2FuaXRpemU9bnVsbCkKICAgICAgIENGTEFHU19VQlNBTiArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtZnNhbml0aXplPXNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93KQogICAgICAgQ0ZMQUdTX1VCU0FOICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mc2FuaXRpemU9Ym91bmRzKQogICAgICAgQ0ZMQUdTX1VCU0FOICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mc2FuaXRpemU9b2JqZWN0LXNpemUpCkBAIC0xNCw0ICsxMyw4IEBACiBpZmRlZiBDT05GSUdfVUJTQU5fQUxJR05NRU5UCiAgICAgICBDRkxBR1NfVUJTQU4gKz0gJChjYWxsIGNjLW9wdGlvbiwgLWZzYW5pdGl6ZT1hbGlnbm1lbnQpCiBlbmRpZgorCitpZmRlZiBDT05GSUdfVUJTQU5fTlVMTAorICAgICAgQ0ZMQUdTX1VCU0FOICs9ICQoY2FsbCBjYy1vcHRpb24sIC1mc2FuaXRpemU9bnVsbCkKK2VuZGlmCiBlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja2tjb25maWdzeW1ib2xzLnB5IGIvc2NyaXB0cy9jaGVja2tjb25maWdzeW1ib2xzLnB5CmluZGV4IGRmNjQzZjYuLmEzMmU0ZGEgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvY2hlY2trY29uZmlnc3ltYm9scy5weQorKysgYi9zY3JpcHRzL2NoZWNra2NvbmZpZ3N5bWJvbHMucHkKQEAgLTEsOTggKzEsOTkgQEAKLSMhL3Vzci9iaW4vZW52IHB5dGhvbjIKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKIAogIiIiRmluZCBLY29uZmlnIHN5bWJvbHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBidXQgbm90IGRlZmluZWQuIiIiCiAKLSMgKGMpIDIwMTQtMjAxNSBWYWxlbnRpbiBSb3RoYmVyZyA8dmFsZW50aW5yb3RoYmVyZ0BnbWFpbC5jb20+CisjIChjKSAyMDE0LTIwMTYgVmFsZW50aW4gUm90aGJlcmcgPHZhbGVudGlucm90aGJlcmdAZ21haWwuY29tPgogIyAoYykgMjAxNCBTdGVmYW4gSGVuZ2VsZWluIDxzdGVmYW4uaGVuZ2VsZWluQGZhdS5kZT4KICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyCiAKIAoraW1wb3J0IGFyZ3BhcnNlCiBpbXBvcnQgZGlmZmxpYgogaW1wb3J0IG9zCiBpbXBvcnQgcmUKIGltcG9ydCBzaWduYWwKK2ltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCiBmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgUG9vbCwgY3B1X2NvdW50Ci1mcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKLWZyb20gc3VicHJvY2VzcyBpbXBvcnQgUG9wZW4sIFBJUEUsIFNURE9VVAogCiAKICMgcmVnZXggZXhwcmVzc2lvbnMKIE9QRVJBVE9SUyA9IHIiJnxcKHxcKXxcfHxcISIKLUZFQVRVUkUgPSByIig/Olx3KltBLVowLTldXHcqKXsyLH0iCi1ERUYgPSByIl5ccyooPzptZW51KXssMX1jb25maWdccysoIiArIEZFQVRVUkUgKyByIilccyoiCi1FWFBSID0gciIoPzoiICsgT1BFUkFUT1JTICsgciJ8XHN8IiArIEZFQVRVUkUgKyByIikrIgorU1lNQk9MID0gciIoPzpcdypbQS1aMC05XVx3Kil7Mix9IgorREVGID0gciJeXHMqKD86bWVudSl7LDF9Y29uZmlnXHMrKCIgKyBTWU1CT0wgKyByIilccyoiCitFWFBSID0gciIoPzoiICsgT1BFUkFUT1JTICsgciJ8XHN8IiArIFNZTUJPTCArIHIiKSsiCiBERUZBVUxUID0gciJkZWZhdWx0XHMrLio/KD86aWZccy4rKXssMX0iCiBTVE1UID0gciJeXHMqKD86aWZ8c2VsZWN0fGRlcGVuZHNccytvbnwoPzoiICsgREVGQVVMVCArIHIiKSlccysiICsgRVhQUgotU09VUkNFX0ZFQVRVUkUgPSByIig/OlxXfFxiKStbRF17LDF9Q09ORklHXygiICsgRkVBVFVSRSArIHIiKSIKK1NPVVJDRV9TWU1CT0wgPSByIig/OlxXfFxiKStbRF17LDF9Q09ORklHXygiICsgU1lNQk9MICsgciIpIgogCiAjIHJlZ2V4IG9iamVjdHMKIFJFR0VYX0ZJTEVfS0NPTkZJRyA9IHJlLmNvbXBpbGUociIuKktjb25maWdbXC5cdytcLV0qJCIpCi1SRUdFWF9GRUFUVVJFID0gcmUuY29tcGlsZShyJyg/IVxCKScgKyBGRUFUVVJFICsgcicoPyFcQiknKQotUkVHRVhfU09VUkNFX0ZFQVRVUkUgPSByZS5jb21waWxlKFNPVVJDRV9GRUFUVVJFKQorUkVHRVhfU1lNQk9MID0gcmUuY29tcGlsZShyJyg/IVxCKScgKyBTWU1CT0wgKyByJyg/IVxCKScpCitSRUdFWF9TT1VSQ0VfU1lNQk9MID0gcmUuY29tcGlsZShTT1VSQ0VfU1lNQk9MKQogUkVHRVhfS0NPTkZJR19ERUYgPSByZS5jb21waWxlKERFRikKIFJFR0VYX0tDT05GSUdfRVhQUiA9IHJlLmNvbXBpbGUoRVhQUikKIFJFR0VYX0tDT05GSUdfU1RNVCA9IHJlLmNvbXBpbGUoU1RNVCkKIFJFR0VYX0tDT05GSUdfSEVMUCA9IHJlLmNvbXBpbGUociJeXHMrKGhlbHB8LS0taGVscC0tLSlccyokIikKLVJFR0VYX0ZJTFRFUl9GRUFUVVJFUyA9IHJlLmNvbXBpbGUociJbQS1aYS16MC05XSQiKQorUkVHRVhfRklMVEVSX1NZTUJPTFMgPSByZS5jb21waWxlKHIiW0EtWmEtejAtOV0kIikKIFJFR0VYX05VTUVSSUMgPSByZS5jb21waWxlKHIiMFt4WF1bMC05YS1mQS1GXSt8WzAtOV0rIikKIFJFR0VYX1FVT1RFUyA9IHJlLmNvbXBpbGUoIihcIiguKj8pXCIpIikKIAogCiBkZWYgcGFyc2Vfb3B0aW9ucygpOgogICAgICIiIlRoZSB1c2VyIGludGVyZmFjZSBvZiB0aGlzIG1vZHVsZS4iIiIKLSAgICB1c2FnZSA9ICIlcHJvZyBbb3B0aW9uc11cblxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAiUnVuIHRoaXMgdG9vbCB0byBkZXRlY3QgS2NvbmZpZyBzeW1ib2xzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnV0ICIgXAotICAgICAgICAgICAgIm5vdCBkZWZpbmVkIGluXG5LY29uZmlnLiAgVGhlIG91dHB1dCBvZiB0aGlzIHRvb2wgaGFzIHRoZSAiICAgICAgIFwKLSAgICAgICAgICAgICJmb3JtYXQgXCdVbmRlZmluZWQgc3ltYm9sXFx0RmlsZSBsaXN0XCdcblxuIiAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAiSWYgbm8gb3B0aW9uIGlzIHNwZWNpZmllZCwgJXByb2cgd2lsbCBkZWZhdWx0IHRvIGNoZWNrIHlvdXJcbiIgICAgXAotICAgICAgICAgICAgImN1cnJlbnQgdHJlZS4gIFBsZWFzZSBub3RlIHRoYXQgc3BlY2lmeWluZyBjb21taXRzIHdpbGwgIiAgICAgICAgIFwKLSAgICAgICAgICAgICJcJ2dpdCByZXNldCAtLWhhcmRcJ1xueW91ciBjdXJyZW50IHRyZWUhICBZb3UgbWF5IHNhdmUgIiAgICAgICAgICBcCi0gICAgICAgICAgICAidW5jb21taXR0ZWQgY2hhbmdlcyB0byBhdm9pZCBsb3NpbmcgZGF0YS4iCisgICAgdXNhZ2UgPSAiUnVuIHRoaXMgdG9vbCB0byBkZXRlY3QgS2NvbmZpZyBzeW1ib2xzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnV0ICIgXAorICAgICAgICAgICAgIm5vdCBkZWZpbmVkIGluIEtjb25maWcuICBJZiBubyBvcHRpb24gaXMgc3BlY2lmaWVkLCAiICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJjaGVja2tjb25maWdzeW1ib2xzIGRlZmF1bHRzIHRvIGNoZWNrIHlvdXIgY3VycmVudCB0cmVlLiAgIiAgICAgICBcCisgICAgICAgICAgICAiUGxlYXNlIG5vdGUgdGhhdCBzcGVjaWZ5aW5nIGNvbW1pdHMgd2lsbCAnZ2l0IHJlc2V0IC0taGFyZFwnICIgICAgXAorICAgICAgICAgICAgInlvdXIgY3VycmVudCB0cmVlISAgWW91IG1heSBzYXZlIHVuY29tbWl0dGVkIGNoYW5nZXMgdG8gYXZvaWQgIiAgIFwKKyAgICAgICAgICAgICJsb3NpbmcgZGF0YS4iCiAKLSAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIodXNhZ2U9dXNhZ2UpCisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249dXNhZ2UpCiAKLSAgICBwYXJzZXIuYWRkX29wdGlvbignLWMnLCAnLS1jb21taXQnLCBkZXN0PSdjb21taXQnLCBhY3Rpb249J3N0b3JlJywKLSAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIiLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkNoZWNrIGlmIHRoZSBzcGVjaWZpZWQgY29tbWl0IChoYXNoKSBpbnRyb2R1Y2VzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmRlZmluZWQgS2NvbmZpZyBzeW1ib2xzLiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWMnLCAnLS1jb21taXQnLCBkZXN0PSdjb21taXQnLCBhY3Rpb249J3N0b3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IiIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJjaGVjayBpZiB0aGUgc3BlY2lmaWVkIGNvbW1pdCAoaGFzaCkgaW50cm9kdWNlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmRlZmluZWQgS2NvbmZpZyBzeW1ib2xzIikKIAotICAgIHBhcnNlci5hZGRfb3B0aW9uKCctZCcsICctLWRpZmYnLCBkZXN0PSdkaWZmJywgYWN0aW9uPSdzdG9yZScsCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJEaWZmIHVuZGVmaW5lZCBzeW1ib2xzIGJldHdlZW4gdHdvIGNvbW1pdHMuICBUaGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0IGZvcm1hdCBiYXNlcyBvbiBHaXQgbG9nJ3MgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwnY29tbW1pdDEuLmNvbW1pdDJcJy4iKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1kJywgJy0tZGlmZicsIGRlc3Q9J2RpZmYnLCBhY3Rpb249J3N0b3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IiIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkaWZmIHVuZGVmaW5lZCBzeW1ib2xzIGJldHdlZW4gdHdvIGNvbW1pdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGUuZy4sIC1kIGNvbW1taXQxLi5jb21taXQyKSIpCiAKLSAgICBwYXJzZXIuYWRkX29wdGlvbignLWYnLCAnLS1maW5kJywgZGVzdD0nZmluZCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJGaW5kIGFuZCBzaG93IGNvbW1pdHMgdGhhdCBtYXkgY2F1c2Ugc3ltYm9scyB0byBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibWlzc2luZy4gIFJlcXVpcmVkIHRvIHJ1biB3aXRoIC0tZGlmZi4iKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1mJywgJy0tZmluZCcsIGRlc3Q9J2ZpbmQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImZpbmQgYW5kIHNob3cgY29tbWl0cyB0aGF0IG1heSBjYXVzZSBzeW1ib2xzIHRvIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pc3NpbmcgKHJlcXVpcmVkIHRvIHJ1biB3aXRoIC0tZGlmZikiKQogCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oJy1pJywgJy0taWdub3JlJywgZGVzdD0naWdub3JlJywgYWN0aW9uPSdzdG9yZScsCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iIiwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJJZ25vcmUgZmlsZXMgbWF0Y2hpbmcgdGhpcyBwYXR0ZXJuLiAgTm90ZSB0aGF0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgcGF0dGVybiBuZWVkcyB0byBiZSBhIFB5dGhvbiByZWdleC4gIFRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmUgZGVmY29uZmlncywgc3BlY2lmeSAtaSAnLipkZWZjb25maWcnLiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWknLCAnLS1pZ25vcmUnLCBkZXN0PSdpZ25vcmUnLCBhY3Rpb249J3N0b3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IiIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJpZ25vcmUgZmlsZXMgbWF0Y2hpbmcgdGhpcyBQeXRob24gcmVnZXggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGUuZy4sIC1pICcuKmRlZmNvbmZpZycpIikKIAotICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcycsICctLXNpbScsIGRlc3Q9J3NpbScsIGFjdGlvbj0nc3RvcmUnLCBkZWZhdWx0PSIiLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlByaW50IGEgbGlzdCBvZiBtYXhpbXVtIDEwIHN0cmluZy1zaW1pbGFyIHN5bWJvbHMuIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctcycsICctLXNpbScsIGRlc3Q9J3NpbScsIGFjdGlvbj0nc3RvcmUnLCBkZWZhdWx0PSIiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0icHJpbnQgYSBsaXN0IG9mIG1heC4gMTAgc3RyaW5nLXNpbWlsYXIgc3ltYm9scyIpCiAKLSAgICBwYXJzZXIuYWRkX29wdGlvbignJywgJy0tZm9yY2UnLCBkZXN0PSdmb3JjZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJSZXNldCBjdXJyZW50IEdpdCB0cmVlIGV2ZW4gd2hlbiBpdCdzIGRpcnR5LiIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb3JjZScsIGRlc3Q9J2ZvcmNlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJyZXNldCBjdXJyZW50IEdpdCB0cmVlIGV2ZW4gd2hlbiBpdCdzIGRpcnR5IikKIAotICAgIChvcHRzLCBfKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW5vLWNvbG9yJywgZGVzdD0nY29sb3InLCBhY3Rpb249J3N0b3JlX2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRvbid0IHByaW50IGNvbG9yZWQgb3V0cHV0IChkZWZhdWx0IHdoZW4gbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dHRpbmcgdG8gYSB0ZXJtaW5hbCkiKQogCi0gICAgaWYgb3B0cy5jb21taXQgYW5kIG9wdHMuZGlmZjoKKyAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgaWYgYXJncy5jb21taXQgYW5kIGFyZ3MuZGlmZjoKICAgICAgICAgc3lzLmV4aXQoIlBsZWFzZSBzcGVjaWZ5IG9ubHkgb25lIG9wdGlvbiBhdCBvbmNlLiIpCiAKLSAgICBpZiBvcHRzLmRpZmYgYW5kIG5vdCByZS5tYXRjaChyIl5bXHdcLVwuXStcLlwuW1x3XC1cLl0rJCIsIG9wdHMuZGlmZik6CisgICAgaWYgYXJncy5kaWZmIGFuZCBub3QgcmUubWF0Y2gociJeW1x3XC1cLl0rXC5cLltcd1wtXC5dKyQiLCBhcmdzLmRpZmYpOgogICAgICAgICBzeXMuZXhpdCgiUGxlYXNlIHNwZWNpZnkgdmFsaWQgaW5wdXQgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICIKICAgICAgICAgICAgICAgICAgIlwnY29tbWl0MS4uY29tbWl0MlwnIikKIAotICAgIGlmIG9wdHMuY29tbWl0IG9yIG9wdHMuZGlmZjoKLSAgICAgICAgaWYgbm90IG9wdHMuZm9yY2UgYW5kIHRyZWVfaXNfZGlydHkoKToKKyAgICBpZiBhcmdzLmNvbW1pdCBvciBhcmdzLmRpZmY6CisgICAgICAgIGlmIG5vdCBhcmdzLmZvcmNlIGFuZCB0cmVlX2lzX2RpcnR5KCk6CiAgICAgICAgICAgICBzeXMuZXhpdCgiVGhlIGN1cnJlbnQgR2l0IHRyZWUgaXMgZGlydHkgKHNlZSAnZ2l0IHN0YXR1cycpLiAgIgogICAgICAgICAgICAgICAgICAgICAgIlJ1bm5pbmcgdGhpcyBzY3JpcHQgbWF5XG5kZWxldGUgaW1wb3J0YW50IGRhdGEgc2luY2UgaXQgIgogICAgICAgICAgICAgICAgICAgICAgImNhbGxzICdnaXQgcmVzZXQgLS1oYXJkJyBmb3Igc29tZSBwZXJmb3JtYW5jZVxucmVhc29ucy4gIgpAQCAtMTAwLDEzOCArMTAxLDE0OCBAQAogICAgICAgICAgICAgICAgICAgICAgIictLWZvcmNlJyBpZiB5b3VcbndhbnQgdG8gaWdub3JlIHRoaXMgd2FybmluZyBhbmQgIgogICAgICAgICAgICAgICAgICAgICAgImNvbnRpbnVlLiIpCiAKLSAgICBpZiBvcHRzLmNvbW1pdDoKLSAgICAgICAgb3B0cy5maW5kID0gRmFsc2UKKyAgICBpZiBhcmdzLmNvbW1pdDoKKyAgICAgICAgYXJncy5maW5kID0gRmFsc2UKIAotICAgIGlmIG9wdHMuaWdub3JlOgorICAgIGlmIGFyZ3MuaWdub3JlOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZS5tYXRjaChvcHRzLmlnbm9yZSwgInRoaXMvaXMvanVzdC9hL3Rlc3QuYyIpCisgICAgICAgICAgICByZS5tYXRjaChhcmdzLmlnbm9yZSwgInRoaXMvaXMvanVzdC9hL3Rlc3QuYyIpCiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIHN5cy5leGl0KCJQbGVhc2Ugc3BlY2lmeSBhIHZhbGlkIFB5dGhvbiByZWdleC4iKQogCi0gICAgcmV0dXJuIG9wdHMKKyAgICByZXR1cm4gYXJncwogCiAKIGRlZiBtYWluKCk6CiAgICAgIiIiTWFpbiBmdW5jdGlvbiBvZiB0aGlzIG1vZHVsZS4iIiIKLSAgICBvcHRzID0gcGFyc2Vfb3B0aW9ucygpCisgICAgYXJncyA9IHBhcnNlX29wdGlvbnMoKQogCi0gICAgaWYgb3B0cy5zaW0gYW5kIG5vdCBvcHRzLmNvbW1pdCBhbmQgbm90IG9wdHMuZGlmZjoKLSAgICAgICAgc2ltcyA9IGZpbmRfc2ltcyhvcHRzLnNpbSwgb3B0cy5pZ25vcmUpCisgICAgZ2xvYmFsIENPTE9SCisgICAgQ09MT1IgPSBhcmdzLmNvbG9yIGFuZCBzeXMuc3Rkb3V0LmlzYXR0eSgpCisKKyAgICBpZiBhcmdzLnNpbSBhbmQgbm90IGFyZ3MuY29tbWl0IGFuZCBub3QgYXJncy5kaWZmOgorICAgICAgICBzaW1zID0gZmluZF9zaW1zKGFyZ3Muc2ltLCBhcmdzLmlnbm9yZSkKICAgICAgICAgaWYgc2ltczoKLSAgICAgICAgICAgIHByaW50ICIlczogJXMiICUgKHllbCgiU2ltaWxhciBzeW1ib2xzIiksICcsICcuam9pbihzaW1zKSkKKyAgICAgICAgICAgIHByaW50KCIlczogJXMiICUgKHllbCgiU2ltaWxhciBzeW1ib2xzIiksICcsICcuam9pbihzaW1zKSkpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAiJXM6IG5vIHNpbWlsYXIgc3ltYm9scyBmb3VuZCIgJSB5ZWwoIlNpbWlsYXIgc3ltYm9scyIpCisgICAgICAgICAgICBwcmludCgiJXM6IG5vIHNpbWlsYXIgc3ltYm9scyBmb3VuZCIgJSB5ZWwoIlNpbWlsYXIgc3ltYm9scyIpKQogICAgICAgICBzeXMuZXhpdCgwKQogCiAgICAgIyBkaWN0aW9uYXJ5IG9mICh1bilkZWZpbmVkIHN5bWJvbHMKICAgICBkZWZpbmVkID0ge30KICAgICB1bmRlZmluZWQgPSB7fQogCi0gICAgaWYgb3B0cy5jb21taXQgb3Igb3B0cy5kaWZmOgorICAgIGlmIGFyZ3MuY29tbWl0IG9yIGFyZ3MuZGlmZjoKICAgICAgICAgaGVhZCA9IGdldF9oZWFkKCkKIAogICAgICAgICAjIGdldCBjb21taXQgcmFuZ2UKICAgICAgICAgY29tbWl0X2EgPSBOb25lCiAgICAgICAgIGNvbW1pdF9iID0gTm9uZQotICAgICAgICBpZiBvcHRzLmNvbW1pdDoKLSAgICAgICAgICAgIGNvbW1pdF9hID0gb3B0cy5jb21taXQgKyAifiIKLSAgICAgICAgICAgIGNvbW1pdF9iID0gb3B0cy5jb21taXQKLSAgICAgICAgZWxpZiBvcHRzLmRpZmY6Ci0gICAgICAgICAgICBzcGxpdCA9IG9wdHMuZGlmZi5zcGxpdCgiLi4iKQorICAgICAgICBpZiBhcmdzLmNvbW1pdDoKKyAgICAgICAgICAgIGNvbW1pdF9hID0gYXJncy5jb21taXQgKyAifiIKKyAgICAgICAgICAgIGNvbW1pdF9iID0gYXJncy5jb21taXQKKyAgICAgICAgZWxpZiBhcmdzLmRpZmY6CisgICAgICAgICAgICBzcGxpdCA9IGFyZ3MuZGlmZi5zcGxpdCgiLi4iKQogICAgICAgICAgICAgY29tbWl0X2EgPSBzcGxpdFswXQogICAgICAgICAgICAgY29tbWl0X2IgPSBzcGxpdFsxXQogICAgICAgICAgICAgdW5kZWZpbmVkX2EgPSB7fQogICAgICAgICAgICAgdW5kZWZpbmVkX2IgPSB7fQogCiAgICAgICAgICMgZ2V0IHVuZGVmaW5lZCBpdGVtcyBiZWZvcmUgdGhlIGNvbW1pdAotICAgICAgICBleGVjdXRlKCJnaXQgcmVzZXQgLS1oYXJkICVzIiAlIGNvbW1pdF9hKQotICAgICAgICB1bmRlZmluZWRfYSwgXyA9IGNoZWNrX3N5bWJvbHMob3B0cy5pZ25vcmUpCisgICAgICAgIHJlc2V0KGNvbW1pdF9hKQorICAgICAgICB1bmRlZmluZWRfYSwgXyA9IGNoZWNrX3N5bWJvbHMoYXJncy5pZ25vcmUpCiAKICAgICAgICAgIyBnZXQgdW5kZWZpbmVkIGl0ZW1zIGZvciB0aGUgY29tbWl0Ci0gICAgICAgIGV4ZWN1dGUoImdpdCByZXNldCAtLWhhcmQgJXMiICUgY29tbWl0X2IpCi0gICAgICAgIHVuZGVmaW5lZF9iLCBkZWZpbmVkID0gY2hlY2tfc3ltYm9scyhvcHRzLmlnbm9yZSkKKyAgICAgICAgcmVzZXQoY29tbWl0X2IpCisgICAgICAgIHVuZGVmaW5lZF9iLCBkZWZpbmVkID0gY2hlY2tfc3ltYm9scyhhcmdzLmlnbm9yZSkKIAogICAgICAgICAjIHJlcG9ydCBjYXNlcyB0aGF0IGFyZSBwcmVzZW50IGZvciB0aGUgY29tbWl0IGJ1dCBub3QgYmVmb3JlCi0gICAgICAgIGZvciBmZWF0dXJlIGluIHNvcnRlZCh1bmRlZmluZWRfYik6Ci0gICAgICAgICAgICAjIGZlYXR1cmUgaGFzIG5vdCBiZWVuIHVuZGVmaW5lZCBiZWZvcmUKLSAgICAgICAgICAgIGlmIG5vdCBmZWF0dXJlIGluIHVuZGVmaW5lZF9hOgotICAgICAgICAgICAgICAgIGZpbGVzID0gc29ydGVkKHVuZGVmaW5lZF9iLmdldChmZWF0dXJlKSkKLSAgICAgICAgICAgICAgICB1bmRlZmluZWRbZmVhdHVyZV0gPSBmaWxlcwotICAgICAgICAgICAgIyBjaGVjayBpZiB0aGVyZSBhcmUgbmV3IGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSB1bmRlZmluZWQgZmVhdHVyZQorICAgICAgICBmb3Igc3ltYm9sIGluIHNvcnRlZCh1bmRlZmluZWRfYik6CisgICAgICAgICAgICAjIHN5bWJvbCBoYXMgbm90IGJlZW4gdW5kZWZpbmVkIGJlZm9yZQorICAgICAgICAgICAgaWYgc3ltYm9sIG5vdCBpbiB1bmRlZmluZWRfYToKKyAgICAgICAgICAgICAgICBmaWxlcyA9IHNvcnRlZCh1bmRlZmluZWRfYi5nZXQoc3ltYm9sKSkKKyAgICAgICAgICAgICAgICB1bmRlZmluZWRbc3ltYm9sXSA9IGZpbGVzCisgICAgICAgICAgICAjIGNoZWNrIGlmIHRoZXJlIGFyZSBuZXcgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIHVuZGVmaW5lZCBzeW1ib2wKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgZmlsZXMgPSBzb3J0ZWQodW5kZWZpbmVkX2IuZ2V0KGZlYXR1cmUpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWRfYS5nZXQoZmVhdHVyZSkpCisgICAgICAgICAgICAgICAgZmlsZXMgPSBzb3J0ZWQodW5kZWZpbmVkX2IuZ2V0KHN5bWJvbCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZF9hLmdldChzeW1ib2wpKQogICAgICAgICAgICAgICAgIGlmIGZpbGVzOgotICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWRbZmVhdHVyZV0gPSBmaWxlcworICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWRbc3ltYm9sXSA9IGZpbGVzCiAKICAgICAgICAgIyByZXNldCB0byBoZWFkCi0gICAgICAgIGV4ZWN1dGUoImdpdCByZXNldCAtLWhhcmQgJXMiICUgaGVhZCkKKyAgICAgICAgcmVzZXQoaGVhZCkKIAogICAgICMgZGVmYXVsdCB0byBjaGVjayB0aGUgZW50aXJlIHRyZWUKICAgICBlbHNlOgotICAgICAgICB1bmRlZmluZWQsIGRlZmluZWQgPSBjaGVja19zeW1ib2xzKG9wdHMuaWdub3JlKQorICAgICAgICB1bmRlZmluZWQsIGRlZmluZWQgPSBjaGVja19zeW1ib2xzKGFyZ3MuaWdub3JlKQogCiAgICAgIyBub3cgcHJpbnQgdGhlIG91dHB1dAotICAgIGZvciBmZWF0dXJlIGluIHNvcnRlZCh1bmRlZmluZWQpOgotICAgICAgICBwcmludCByZWQoZmVhdHVyZSkKKyAgICBmb3Igc3ltYm9sIGluIHNvcnRlZCh1bmRlZmluZWQpOgorICAgICAgICBwcmludChyZWQoc3ltYm9sKSkKIAotICAgICAgICBmaWxlcyA9IHNvcnRlZCh1bmRlZmluZWQuZ2V0KGZlYXR1cmUpKQotICAgICAgICBwcmludCAiJXM6ICVzIiAlICh5ZWwoIlJlZmVyZW5jaW5nIGZpbGVzIiksICIsICIuam9pbihmaWxlcykpCisgICAgICAgIGZpbGVzID0gc29ydGVkKHVuZGVmaW5lZC5nZXQoc3ltYm9sKSkKKyAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAoeWVsKCJSZWZlcmVuY2luZyBmaWxlcyIpLCAiLCAiLmpvaW4oZmlsZXMpKSkKIAotICAgICAgICBzaW1zID0gZmluZF9zaW1zKGZlYXR1cmUsIG9wdHMuaWdub3JlLCBkZWZpbmVkKQorICAgICAgICBzaW1zID0gZmluZF9zaW1zKHN5bWJvbCwgYXJncy5pZ25vcmUsIGRlZmluZWQpCiAgICAgICAgIHNpbXNfb3V0ID0geWVsKCJTaW1pbGFyIHN5bWJvbHMiKQogICAgICAgICBpZiBzaW1zOgotICAgICAgICAgICAgcHJpbnQgIiVzOiAlcyIgJSAoc2ltc19vdXQsICcsICcuam9pbihzaW1zKSkKKyAgICAgICAgICAgIHByaW50KCIlczogJXMiICUgKHNpbXNfb3V0LCAnLCAnLmpvaW4oc2ltcykpKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgIiVzOiAlcyIgJSAoc2ltc19vdXQsICJubyBzaW1pbGFyIHN5bWJvbHMgZm91bmQiKQorICAgICAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAoc2ltc19vdXQsICJubyBzaW1pbGFyIHN5bWJvbHMgZm91bmQiKSkKIAotICAgICAgICBpZiBvcHRzLmZpbmQ6Ci0gICAgICAgICAgICBwcmludCAiJXM6IiAlIHllbCgiQ29tbWl0cyBjaGFuZ2luZyBzeW1ib2wiKQotICAgICAgICAgICAgY29tbWl0cyA9IGZpbmRfY29tbWl0cyhmZWF0dXJlLCBvcHRzLmRpZmYpCisgICAgICAgIGlmIGFyZ3MuZmluZDoKKyAgICAgICAgICAgIHByaW50KCIlczoiICUgeWVsKCJDb21taXRzIGNoYW5naW5nIHN5bWJvbCIpKQorICAgICAgICAgICAgY29tbWl0cyA9IGZpbmRfY29tbWl0cyhzeW1ib2wsIGFyZ3MuZGlmZikKICAgICAgICAgICAgIGlmIGNvbW1pdHM6CiAgICAgICAgICAgICAgICAgZm9yIGNvbW1pdCBpbiBjb21taXRzOgogICAgICAgICAgICAgICAgICAgICBjb21taXQgPSBjb21taXQuc3BsaXQoIiAiLCAxKQotICAgICAgICAgICAgICAgICAgICBwcmludCAiXHQtICVzIChcIiVzXCIpIiAlICh5ZWwoY29tbWl0WzBdKSwgY29tbWl0WzFdKQorICAgICAgICAgICAgICAgICAgICBwcmludCgiXHQtICVzIChcIiVzXCIpIiAlICh5ZWwoY29tbWl0WzBdKSwgY29tbWl0WzFdKSkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIlx0LSBubyBjb21taXQgZm91bmQiCi0gICAgICAgIHByaW50ICAjICBuZXcgbGluZQorICAgICAgICAgICAgICAgIHByaW50KCJcdC0gbm8gY29tbWl0IGZvdW5kIikKKyAgICAgICAgcHJpbnQoKSAgIyBuZXcgbGluZQorCisKK2RlZiByZXNldChjb21taXQpOgorICAgICIiIlJlc2V0IGN1cnJlbnQgZ2l0IHRyZWUgdG8gJWNvbW1pdC4iIiIKKyAgICBleGVjdXRlKFsiZ2l0IiwgInJlc2V0IiwgIi0taGFyZCIsIGNvbW1pdF0pCiAKIAogZGVmIHllbChzdHJpbmcpOgogICAgICIiIgogICAgIENvbG9yICVzdHJpbmcgeWVsbG93LgogICAgICIiIgotICAgIHJldHVybiAiXDAzM1szM20lc1wwMzNbMG0iICUgc3RyaW5nCisgICAgcmV0dXJuICJcMDMzWzMzbSVzXDAzM1swbSIgJSBzdHJpbmcgaWYgQ09MT1IgZWxzZSBzdHJpbmcKIAogCiBkZWYgcmVkKHN0cmluZyk6CiAgICAgIiIiCiAgICAgQ29sb3IgJXN0cmluZyByZWQuCiAgICAgIiIiCi0gICAgcmV0dXJuICJcMDMzWzMxbSVzXDAzM1swbSIgJSBzdHJpbmcKKyAgICByZXR1cm4gIlwwMzNbMzFtJXNcMDMzWzBtIiAlIHN0cmluZyBpZiBDT0xPUiBlbHNlIHN0cmluZwogCiAKIGRlZiBleGVjdXRlKGNtZCk6CiAgICAgIiIiRXhlY3V0ZSAlY21kIGFuZCByZXR1cm4gc3Rkb3V0LiAgRXhpdCBpbiBjYXNlIG9mIGVycm9yLiIiIgotICAgIHBvcCA9IFBvcGVuKGNtZCwgc3Rkb3V0PVBJUEUsIHN0ZGVycj1TVERPVVQsIHNoZWxsPVRydWUpCi0gICAgKHN0ZG91dCwgXykgPSBwb3AuY29tbXVuaWNhdGUoKSAgIyB3YWl0IHVudGlsIGZpbmlzaGVkCi0gICAgaWYgcG9wLnJldHVybmNvZGUgIT0gMDoKLSAgICAgICAgc3lzLmV4aXQoc3Rkb3V0KQorICAgIHRyeToKKyAgICAgICAgc3Rkb3V0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoY21kLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsIHNoZWxsPUZhbHNlKQorICAgICAgICBzdGRvdXQgPSBzdGRvdXQuZGVjb2RlKGVycm9ycz0ncmVwbGFjZScpCisgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGZhaWw6CisgICAgICAgIGV4aXQoZmFpbCkKICAgICByZXR1cm4gc3Rkb3V0CiAKIAogZGVmIGZpbmRfY29tbWl0cyhzeW1ib2wsIGRpZmYpOgogICAgICIiIkZpbmQgY29tbWl0cyBjaGFuZ2luZyAlc3ltYm9sIGluIHRoZSBnaXZlbiByYW5nZSBvZiAlZGlmZi4iIiIKLSAgICBjb21taXRzID0gZXhlY3V0ZSgiZ2l0IGxvZyAtLXByZXR0eT1vbmVsaW5lIC0tYWJicmV2LWNvbW1pdCAtRyAlcyAlcyIKLSAgICAgICAgICAgICAgICAgICAgICAlIChzeW1ib2wsIGRpZmYpKQorICAgIGNvbW1pdHMgPSBleGVjdXRlKFsiZ2l0IiwgImxvZyIsICItLXByZXR0eT1vbmVsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIi0tYWJicmV2LWNvbW1pdCIsICItRyIsCisgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbCwgZGlmZl0pCiAgICAgcmV0dXJuIFt4IGZvciB4IGluIGNvbW1pdHMuc3BsaXQoIlxuIikgaWYgeF0KIAogCiBkZWYgdHJlZV9pc19kaXJ0eSgpOgogICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IHdvcmtpbmcgdHJlZSBpcyBkaXJ0eSAoaS5lLiwgaWYgYW55IGZpbGUgaGFzCiAgICAgYmVlbiBhZGRlZCwgZGVsZXRlZCwgbW9kaWZpZWQsIHJlbmFtZWQgb3IgY29waWVkIGJ1dCBub3QgY29tbWl0dGVkKS4iIiIKLSAgICBzdGRvdXQgPSBleGVjdXRlKCJnaXQgc3RhdHVzIC0tcG9yY2VsYWluIikKKyAgICBzdGRvdXQgPSBleGVjdXRlKFsiZ2l0IiwgInN0YXR1cyIsICItLXBvcmNlbGFpbiJdKQogICAgIGZvciBsaW5lIGluIHN0ZG91dDoKICAgICAgICAgaWYgcmUuZmluZGFsbChyIltVUk1BRENdezF9IiwgbGluZVs6Ml0pOgogICAgICAgICAgICAgcmV0dXJuIFRydWUKQEAgLTI0MCwxMyArMjUxLDEzIEBACiAKIGRlZiBnZXRfaGVhZCgpOgogICAgICIiIlJldHVybiBjb21taXQgaGFzaCBvZiBjdXJyZW50IEhFQUQuIiIiCi0gICAgc3Rkb3V0ID0gZXhlY3V0ZSgiZ2l0IHJldi1wYXJzZSBIRUFEIikKKyAgICBzdGRvdXQgPSBleGVjdXRlKFsiZ2l0IiwgInJldi1wYXJzZSIsICJIRUFEIl0pCiAgICAgcmV0dXJuIHN0ZG91dC5zdHJpcCgnXG4nKQogCiAKIGRlZiBwYXJ0aXRpb24obHN0LCBzaXplKToKICAgICAiIiJQYXJ0aXRpb24gbGlzdCBAbHN0IGludG8gZXZlbmktc2l6ZWQgbGlzdHMgb2Ygc2l6ZSBAc2l6ZS4iIiIKLSAgICByZXR1cm4gW2xzdFtpOjpzaXplXSBmb3IgaSBpbiB4cmFuZ2Uoc2l6ZSldCisgICAgcmV0dXJuIFtsc3RbaTo6c2l6ZV0gZm9yIGkgaW4gcmFuZ2Uoc2l6ZSldCiAKIAogZGVmIGluaXRfd29ya2VyKCk6CkBAIC0yNTQsNyArMjY1LDcgQEAKICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsIHNpZ25hbC5TSUdfSUdOKQogCiAKLWRlZiBmaW5kX3NpbXMoc3ltYm9sLCBpZ25vcmUsIGRlZmluZWQgPSBbXSk6CitkZWYgZmluZF9zaW1zKHN5bWJvbCwgaWdub3JlLCBkZWZpbmVkPVtdKToKICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIG1heC4gdGVuIEtjb25maWcgc3ltYm9scyB0aGF0IGFyZSBzdHJpbmctc2ltaWxhciB0bwogICAgIEBzeW1ib2wuIiIiCiAgICAgaWYgZGVmaW5lZDoKQEAgLTI3OSw3ICsyOTAsNyBAQAogZGVmIGdldF9maWxlcygpOgogICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIGZpbGVzIGluIHRoZSBjdXJyZW50IGdpdCBkaXJlY3RvcnkuIiIiCiAgICAgIyB1c2UgJ2dpdCBscy1maWxlcycgdG8gZ2V0IHRoZSB3b3JrbGlzdAotICAgIHN0ZG91dCA9IGV4ZWN1dGUoImdpdCBscy1maWxlcyIpCisgICAgc3Rkb3V0ID0gZXhlY3V0ZShbImdpdCIsICJscy1maWxlcyJdKQogICAgIGlmIGxlbihzdGRvdXQpID4gMCBhbmQgc3Rkb3V0Wy0xXSA9PSAiXG4iOgogICAgICAgICBzdGRvdXQgPSBzdGRvdXRbOi0xXQogCkBAIC0zMTEsOCArMzIyLDggQEAKICAgICBjaGVja19zeW1ib2xzKCkgaW4gb3JkZXIgdG8gcHJvcGVybHkgdGVybWluYXRlIHJ1bm5pbmcgd29ya2VyIHByb2Nlc3Nlcy4iIiIKICAgICBzb3VyY2VfZmlsZXMgPSBbXQogICAgIGtjb25maWdfZmlsZXMgPSBbXQotICAgIGRlZmluZWRfZmVhdHVyZXMgPSBbXQotICAgIHJlZmVyZW5jZWRfZmVhdHVyZXMgPSBkaWN0KCkgICMge2ZpbGU6IFtmZWF0dXJlc119CisgICAgZGVmaW5lZF9zeW1ib2xzID0gW10KKyAgICByZWZlcmVuY2VkX3N5bWJvbHMgPSBkaWN0KCkgICMge2ZpbGU6IFtzeW1ib2xzXX0KIAogICAgIGZvciBnaXRmaWxlIGluIGdldF9maWxlcygpOgogICAgICAgICBpZiBSRUdFWF9GSUxFX0tDT05GSUcubWF0Y2goZ2l0ZmlsZSk6CkBAIC0zMjYsNzYgKzMzNyw3NSBAQAogICAgICMgcGFyc2Ugc291cmNlIGZpbGVzCiAgICAgYXJnbGlzdCA9IHBhcnRpdGlvbihzb3VyY2VfZmlsZXMsIGNwdV9jb3VudCgpKQogICAgIGZvciByZXMgaW4gcG9vbC5tYXAocGFyc2Vfc291cmNlX2ZpbGVzLCBhcmdsaXN0KToKLSAgICAgICAgcmVmZXJlbmNlZF9mZWF0dXJlcy51cGRhdGUocmVzKQotCisgICAgICAgIHJlZmVyZW5jZWRfc3ltYm9scy51cGRhdGUocmVzKQogCiAgICAgIyBwYXJzZSBrY29uZmlnIGZpbGVzCiAgICAgYXJnbGlzdCA9IFtdCiAgICAgZm9yIHBhcnQgaW4gcGFydGl0aW9uKGtjb25maWdfZmlsZXMsIGNwdV9jb3VudCgpKToKICAgICAgICAgYXJnbGlzdC5hcHBlbmQoKHBhcnQsIGlnbm9yZSkpCiAgICAgZm9yIHJlcyBpbiBwb29sLm1hcChwYXJzZV9rY29uZmlnX2ZpbGVzLCBhcmdsaXN0KToKLSAgICAgICAgZGVmaW5lZF9mZWF0dXJlcy5leHRlbmQocmVzWzBdKQotICAgICAgICByZWZlcmVuY2VkX2ZlYXR1cmVzLnVwZGF0ZShyZXNbMV0pCi0gICAgZGVmaW5lZF9mZWF0dXJlcyA9IHNldChkZWZpbmVkX2ZlYXR1cmVzKQorICAgICAgICBkZWZpbmVkX3N5bWJvbHMuZXh0ZW5kKHJlc1swXSkKKyAgICAgICAgcmVmZXJlbmNlZF9zeW1ib2xzLnVwZGF0ZShyZXNbMV0pCisgICAgZGVmaW5lZF9zeW1ib2xzID0gc2V0KGRlZmluZWRfc3ltYm9scykKIAotICAgICMgaW52ZXJzZSBtYXBwaW5nIG9mIHJlZmVyZW5jZWRfZmVhdHVyZXMgdG8gZGljdChmZWF0dXJlOiBbZmlsZXNdKQorICAgICMgaW52ZXJzZSBtYXBwaW5nIG9mIHJlZmVyZW5jZWRfc3ltYm9scyB0byBkaWN0KHN5bWJvbDogW2ZpbGVzXSkKICAgICBpbnZfbWFwID0gZGljdCgpCi0gICAgZm9yIF9maWxlLCBmZWF0dXJlcyBpbiByZWZlcmVuY2VkX2ZlYXR1cmVzLml0ZXJpdGVtcygpOgotICAgICAgICBmb3IgZmVhdHVyZSBpbiBmZWF0dXJlczoKLSAgICAgICAgICAgIGludl9tYXBbZmVhdHVyZV0gPSBpbnZfbWFwLmdldChmZWF0dXJlLCBzZXQoKSkKLSAgICAgICAgICAgIGludl9tYXBbZmVhdHVyZV0uYWRkKF9maWxlKQotICAgIHJlZmVyZW5jZWRfZmVhdHVyZXMgPSBpbnZfbWFwCisgICAgZm9yIF9maWxlLCBzeW1ib2xzIGluIHJlZmVyZW5jZWRfc3ltYm9scy5pdGVtcygpOgorICAgICAgICBmb3Igc3ltYm9sIGluIHN5bWJvbHM6CisgICAgICAgICAgICBpbnZfbWFwW3N5bWJvbF0gPSBpbnZfbWFwLmdldChzeW1ib2wsIHNldCgpKQorICAgICAgICAgICAgaW52X21hcFtzeW1ib2xdLmFkZChfZmlsZSkKKyAgICByZWZlcmVuY2VkX3N5bWJvbHMgPSBpbnZfbWFwCiAKLSAgICB1bmRlZmluZWQgPSB7fSAgIyB7ZmVhdHVyZTogW2ZpbGVzXX0KLSAgICBmb3IgZmVhdHVyZSBpbiBzb3J0ZWQocmVmZXJlbmNlZF9mZWF0dXJlcyk6CisgICAgdW5kZWZpbmVkID0ge30gICMge3N5bWJvbDogW2ZpbGVzXX0KKyAgICBmb3Igc3ltYm9sIGluIHNvcnRlZChyZWZlcmVuY2VkX3N5bWJvbHMpOgogICAgICAgICAjIGZpbHRlciBzb21lIGZhbHNlIHBvc2l0aXZlcwotICAgICAgICBpZiBmZWF0dXJlID09ICJGT08iIG9yIGZlYXR1cmUgPT0gIkJBUiIgb3IgXAotICAgICAgICAgICAgICAgIGZlYXR1cmUgPT0gIkZPT19CQVIiIG9yIGZlYXR1cmUgPT0gIlhYWCI6CisgICAgICAgIGlmIHN5bWJvbCA9PSAiRk9PIiBvciBzeW1ib2wgPT0gIkJBUiIgb3IgXAorICAgICAgICAgICAgICAgIHN5bWJvbCA9PSAiRk9PX0JBUiIgb3Igc3ltYm9sID09ICJYWFgiOgogICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgaWYgZmVhdHVyZSBub3QgaW4gZGVmaW5lZF9mZWF0dXJlczoKLSAgICAgICAgICAgIGlmIGZlYXR1cmUuZW5kc3dpdGgoIl9NT0RVTEUiKToKKyAgICAgICAgaWYgc3ltYm9sIG5vdCBpbiBkZWZpbmVkX3N5bWJvbHM6CisgICAgICAgICAgICBpZiBzeW1ib2wuZW5kc3dpdGgoIl9NT0RVTEUiKToKICAgICAgICAgICAgICAgICAjIGF2b2lkIGZhbHNlIHBvc2l0aXZlcyBmb3Iga2VybmVsIG1vZHVsZXMKLSAgICAgICAgICAgICAgICBpZiBmZWF0dXJlWzotbGVuKCJfTU9EVUxFIildIGluIGRlZmluZWRfZmVhdHVyZXM6CisgICAgICAgICAgICAgICAgaWYgc3ltYm9sWzotbGVuKCJfTU9EVUxFIildIGluIGRlZmluZWRfc3ltYm9sczoKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHVuZGVmaW5lZFtmZWF0dXJlXSA9IHJlZmVyZW5jZWRfZmVhdHVyZXMuZ2V0KGZlYXR1cmUpCi0gICAgcmV0dXJuIHVuZGVmaW5lZCwgZGVmaW5lZF9mZWF0dXJlcworICAgICAgICAgICAgdW5kZWZpbmVkW3N5bWJvbF0gPSByZWZlcmVuY2VkX3N5bWJvbHMuZ2V0KHN5bWJvbCkKKyAgICByZXR1cm4gdW5kZWZpbmVkLCBkZWZpbmVkX3N5bWJvbHMKIAogCiBkZWYgcGFyc2Vfc291cmNlX2ZpbGVzKHNvdXJjZV9maWxlcyk6CiAgICAgIiIiUGFyc2UgZWFjaCBzb3VyY2UgZmlsZSBpbiBAc291cmNlX2ZpbGVzIGFuZCByZXR1cm4gZGljdGlvbmFyeSB3aXRoIHNvdXJjZQogICAgIGZpbGVzIGFzIGtleXMgYW5kIGxpc3RzIG9mIHJlZmVyZW5jZXMgS2NvbmZpZyBzeW1ib2xzIGFzIHZhbHVlcy4iIiIKLSAgICByZWZlcmVuY2VkX2ZlYXR1cmVzID0gZGljdCgpCisgICAgcmVmZXJlbmNlZF9zeW1ib2xzID0gZGljdCgpCiAgICAgZm9yIHNmaWxlIGluIHNvdXJjZV9maWxlczoKLSAgICAgICAgcmVmZXJlbmNlZF9mZWF0dXJlc1tzZmlsZV0gPSBwYXJzZV9zb3VyY2VfZmlsZShzZmlsZSkKLSAgICByZXR1cm4gcmVmZXJlbmNlZF9mZWF0dXJlcworICAgICAgICByZWZlcmVuY2VkX3N5bWJvbHNbc2ZpbGVdID0gcGFyc2Vfc291cmNlX2ZpbGUoc2ZpbGUpCisgICAgcmV0dXJuIHJlZmVyZW5jZWRfc3ltYm9scwogCiAKIGRlZiBwYXJzZV9zb3VyY2VfZmlsZShzZmlsZSk6Ci0gICAgIiIiUGFyc2UgQHNmaWxlIGFuZCByZXR1cm4gYSBsaXN0IG9mIHJlZmVyZW5jZWQgS2NvbmZpZyBmZWF0dXJlcy4iIiIKKyAgICAiIiJQYXJzZSBAc2ZpbGUgYW5kIHJldHVybiBhIGxpc3Qgb2YgcmVmZXJlbmNlZCBLY29uZmlnIHN5bWJvbHMuIiIiCiAgICAgbGluZXMgPSBbXQogICAgIHJlZmVyZW5jZXMgPSBbXQogCiAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNmaWxlKToKICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZXMKIAotICAgIHdpdGggb3BlbihzZmlsZSwgInIiKSBhcyBzdHJlYW06CisgICAgd2l0aCBvcGVuKHNmaWxlLCAiciIsIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0ncmVwbGFjZScpIGFzIHN0cmVhbToKICAgICAgICAgbGluZXMgPSBzdHJlYW0ucmVhZGxpbmVzKCkKIAogICAgIGZvciBsaW5lIGluIGxpbmVzOgotICAgICAgICBpZiBub3QgIkNPTkZJR18iIGluIGxpbmU6CisgICAgICAgIGlmICJDT05GSUdfIiBub3QgaW4gbGluZToKICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZlYXR1cmVzID0gUkVHRVhfU09VUkNFX0ZFQVRVUkUuZmluZGFsbChsaW5lKQotICAgICAgICBmb3IgZmVhdHVyZSBpbiBmZWF0dXJlczoKLSAgICAgICAgICAgIGlmIG5vdCBSRUdFWF9GSUxURVJfRkVBVFVSRVMuc2VhcmNoKGZlYXR1cmUpOgorICAgICAgICBzeW1ib2xzID0gUkVHRVhfU09VUkNFX1NZTUJPTC5maW5kYWxsKGxpbmUpCisgICAgICAgIGZvciBzeW1ib2wgaW4gc3ltYm9sczoKKyAgICAgICAgICAgIGlmIG5vdCBSRUdFWF9GSUxURVJfU1lNQk9MUy5zZWFyY2goc3ltYm9sKToKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgcmVmZXJlbmNlcy5hcHBlbmQoZmVhdHVyZSkKKyAgICAgICAgICAgIHJlZmVyZW5jZXMuYXBwZW5kKHN5bWJvbCkKIAogICAgIHJldHVybiByZWZlcmVuY2VzCiAKIAotZGVmIGdldF9mZWF0dXJlc19pbl9saW5lKGxpbmUpOgotICAgICIiIlJldHVybiBtZW50aW9uZWQgS2NvbmZpZyBmZWF0dXJlcyBpbiBAbGluZS4iIiIKLSAgICByZXR1cm4gUkVHRVhfRkVBVFVSRS5maW5kYWxsKGxpbmUpCitkZWYgZ2V0X3N5bWJvbHNfaW5fbGluZShsaW5lKToKKyAgICAiIiJSZXR1cm4gbWVudGlvbmVkIEtjb25maWcgc3ltYm9scyBpbiBAbGluZS4iIiIKKyAgICByZXR1cm4gUkVHRVhfU1lNQk9MLmZpbmRhbGwobGluZSkKIAogCiBkZWYgcGFyc2Vfa2NvbmZpZ19maWxlcyhhcmdzKToKQEAgLTQwNCwyMSArNDE0LDIxIEBACiAgICAgcGF0dGVybi4iIiIKICAgICBrY29uZmlnX2ZpbGVzID0gYXJnc1swXQogICAgIGlnbm9yZSA9IGFyZ3NbMV0KLSAgICBkZWZpbmVkX2ZlYXR1cmVzID0gW10KLSAgICByZWZlcmVuY2VkX2ZlYXR1cmVzID0gZGljdCgpCisgICAgZGVmaW5lZF9zeW1ib2xzID0gW10KKyAgICByZWZlcmVuY2VkX3N5bWJvbHMgPSBkaWN0KCkKIAogICAgIGZvciBrZmlsZSBpbiBrY29uZmlnX2ZpbGVzOgogICAgICAgICBkZWZpbmVkLCByZWZlcmVuY2VzID0gcGFyc2Vfa2NvbmZpZ19maWxlKGtmaWxlKQotICAgICAgICBkZWZpbmVkX2ZlYXR1cmVzLmV4dGVuZChkZWZpbmVkKQorICAgICAgICBkZWZpbmVkX3N5bWJvbHMuZXh0ZW5kKGRlZmluZWQpCiAgICAgICAgIGlmIGlnbm9yZSBhbmQgcmUubWF0Y2goaWdub3JlLCBrZmlsZSk6CiAgICAgICAgICAgICAjIGRvIG5vdCBjb2xsZWN0IHJlZmVyZW5jZXMgZm9yIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIGlnbm9yZSBwYXR0ZXJuCiAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICByZWZlcmVuY2VkX2ZlYXR1cmVzW2tmaWxlXSA9IHJlZmVyZW5jZXMKLSAgICByZXR1cm4gKGRlZmluZWRfZmVhdHVyZXMsIHJlZmVyZW5jZWRfZmVhdHVyZXMpCisgICAgICAgIHJlZmVyZW5jZWRfc3ltYm9sc1trZmlsZV0gPSByZWZlcmVuY2VzCisgICAgcmV0dXJuIChkZWZpbmVkX3N5bWJvbHMsIHJlZmVyZW5jZWRfc3ltYm9scykKIAogCiBkZWYgcGFyc2Vfa2NvbmZpZ19maWxlKGtmaWxlKToKLSAgICAiIiJQYXJzZSBAa2ZpbGUgYW5kIHVwZGF0ZSBmZWF0dXJlIGRlZmluaXRpb25zIGFuZCByZWZlcmVuY2VzLiIiIgorICAgICIiIlBhcnNlIEBrZmlsZSBhbmQgdXBkYXRlIHN5bWJvbCBkZWZpbml0aW9ucyBhbmQgcmVmZXJlbmNlcy4iIiIKICAgICBsaW5lcyA9IFtdCiAgICAgZGVmaW5lZCA9IFtdCiAgICAgcmVmZXJlbmNlcyA9IFtdCkBAIC00MjcsNyArNDM3LDcgQEAKICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoa2ZpbGUpOgogICAgICAgICByZXR1cm4gZGVmaW5lZCwgcmVmZXJlbmNlcwogCi0gICAgd2l0aCBvcGVuKGtmaWxlLCAiciIpIGFzIHN0cmVhbToKKyAgICB3aXRoIG9wZW4oa2ZpbGUsICJyIiwgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSdyZXBsYWNlJykgYXMgc3RyZWFtOgogICAgICAgICBsaW5lcyA9IHN0cmVhbS5yZWFkbGluZXMoKQogCiAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSk6CkBAIC00MzYsOCArNDQ2LDggQEAKICAgICAgICAgbGluZSA9IGxpbmUuc3BsaXQoIiMiKVswXSAgIyBpZ25vcmUgY29tbWVudHMKIAogICAgICAgICBpZiBSRUdFWF9LQ09ORklHX0RFRi5tYXRjaChsaW5lKToKLSAgICAgICAgICAgIGZlYXR1cmVfZGVmID0gUkVHRVhfS0NPTkZJR19ERUYuZmluZGFsbChsaW5lKQotICAgICAgICAgICAgZGVmaW5lZC5hcHBlbmQoZmVhdHVyZV9kZWZbMF0pCisgICAgICAgICAgICBzeW1ib2xfZGVmID0gUkVHRVhfS0NPTkZJR19ERUYuZmluZGFsbChsaW5lKQorICAgICAgICAgICAgZGVmaW5lZC5hcHBlbmQoc3ltYm9sX2RlZlswXSkKICAgICAgICAgICAgIHNraXAgPSBGYWxzZQogICAgICAgICBlbGlmIFJFR0VYX0tDT05GSUdfSEVMUC5tYXRjaChsaW5lKToKICAgICAgICAgICAgIHNraXAgPSBUcnVlCkBAIC00NDYsMTggKzQ1NiwxOCBAQAogICAgICAgICAgICAgcGFzcwogICAgICAgICBlbGlmIFJFR0VYX0tDT05GSUdfU1RNVC5tYXRjaChsaW5lKToKICAgICAgICAgICAgIGxpbmUgPSBSRUdFWF9RVU9URVMuc3ViKCIiLCBsaW5lKQotICAgICAgICAgICAgZmVhdHVyZXMgPSBnZXRfZmVhdHVyZXNfaW5fbGluZShsaW5lKQorICAgICAgICAgICAgc3ltYm9scyA9IGdldF9zeW1ib2xzX2luX2xpbmUobGluZSkKICAgICAgICAgICAgICMgbXVsdGktbGluZSBzdGF0ZW1lbnRzCiAgICAgICAgICAgICB3aGlsZSBsaW5lLmVuZHN3aXRoKCJcXCIpOgogICAgICAgICAgICAgICAgIGkgKz0gMQogICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lc1tpXQogICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCdcbicpCi0gICAgICAgICAgICAgICAgZmVhdHVyZXMuZXh0ZW5kKGdldF9mZWF0dXJlc19pbl9saW5lKGxpbmUpKQotICAgICAgICAgICAgZm9yIGZlYXR1cmUgaW4gc2V0KGZlYXR1cmVzKToKLSAgICAgICAgICAgICAgICBpZiBSRUdFWF9OVU1FUklDLm1hdGNoKGZlYXR1cmUpOgorICAgICAgICAgICAgICAgIHN5bWJvbHMuZXh0ZW5kKGdldF9zeW1ib2xzX2luX2xpbmUobGluZSkpCisgICAgICAgICAgICBmb3Igc3ltYm9sIGluIHNldChzeW1ib2xzKToKKyAgICAgICAgICAgICAgICBpZiBSRUdFWF9OVU1FUklDLm1hdGNoKHN5bWJvbCk6CiAgICAgICAgICAgICAgICAgICAgICMgaWdub3JlIG51bWVyaWMgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgcmVmZXJlbmNlcy5hcHBlbmQoZmVhdHVyZSkKKyAgICAgICAgICAgICAgICByZWZlcmVuY2VzLmFwcGVuZChzeW1ib2wpCiAKICAgICByZXR1cm4gZGVmaW5lZCwgcmVmZXJlbmNlcwogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrcGF0Y2gucGwgYi9zY3JpcHRzL2NoZWNrcGF0Y2gucGwKaW5kZXggNGRlM2NjNC4uMjA2YTZiMyAxMDA3NTUKLS0tIGEvc2NyaXB0cy9jaGVja3BhdGNoLnBsCisrKyBiL3NjcmlwdHMvY2hlY2twYXRjaC5wbApAQCAtMzU3MCwxNSArMzU3MCw2IEBACiAJCQl9CiAJCX0KIAotIyBjaGVjayBmb3IgdXNlcyBvZiBERUZJTkVfUENJX0RFVklDRV9UQUJMRQotCQlpZiAoJGxpbmUgPX4gL1xiREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEVccypcKFxzKihcdyspXHMqXClccyo9LykgewotCQkJaWYgKFdBUk4oIkRFRklORV9QQ0lfREVWSUNFX1RBQkxFIiwKLQkJCQkgIlByZWZlciBzdHJ1Y3QgcGNpX2RldmljZV9pZCBvdmVyIGRlcHJlY2F0ZWQgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEVcbiIgLiAkaGVyZWN1cnIpICYmCi0JCQkgICAgJGZpeCkgewotCQkJCSRmaXhlZFskZml4bGluZW5yXSA9fiBzL1xiKD86c3RhdGljXHMrfClERUZJTkVfUENJX0RFVklDRV9UQUJMRVxzKlwoXHMqKFx3KylccypcKVxzKj1ccyovc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICQxXFtcXSA9IC87Ci0JCQl9Ci0JCX0KLQogIyBjaGVjayBmb3IgbmV3IHR5cGVkZWZzLCBvbmx5IGZ1bmN0aW9uIHBhcmFtZXRlcnMgYW5kIHNwYXJzZSBhbm5vdGF0aW9ucwogIyBtYWtlIHNlbnNlLgogCQlpZiAoJGxpbmUgPX4gL1xidHlwZWRlZlxzLyAmJgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9mYWRkcjJsaW5lIGIvc2NyaXB0cy9mYWRkcjJsaW5lCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ1MGIzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2ZhZGRyMmxpbmUKQEAgLTAsMCArMSwxNzcgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFRyYW5zbGF0ZSBzdGFjayBkdW1wIGZ1bmN0aW9uIG9mZnNldHMuCisjCisjIGFkZHIybGluZSBkb2Vzbid0IHdvcmsgd2l0aCBLQVNMUiBhZGRyZXNzZXMuICBUaGlzIHdvcmtzIHNpbWlsYXJseSB0bworIyBhZGRyMmxpbmUsIGJ1dCBpbnN0ZWFkIHRha2VzIHRoZSAnZnVuYysweDEyMycgZm9ybWF0IGFzIGlucHV0OgorIworIyAgICQgLi9zY3JpcHRzL2ZhZGRyMmxpbmUgfi9rL3ZtbGludXggbWVtaW5mb19wcm9jX3Nob3crMHg1LzB4NTY4CisjICAgbWVtaW5mb19wcm9jX3Nob3crMHg1LzB4NTY4OgorIyAgIG1lbWluZm9fcHJvY19zaG93IGF0IGZzL3Byb2MvbWVtaW5mby5jOjI3CisjCisjIElmIHRoZSBhZGRyZXNzIGlzIHBhcnQgb2YgYW4gaW5saW5lZCBmdW5jdGlvbiwgdGhlIGZ1bGwgaW5saW5lIGNhbGwgY2hhaW4gaXMKKyMgcHJpbnRlZDoKKyMKKyMgICAkIC4vc2NyaXB0cy9mYWRkcjJsaW5lIH4vay92bWxpbnV4IG5hdGl2ZV93cml0ZV9tc3IrMHg2LzB4MjcKKyMgICBuYXRpdmVfd3JpdGVfbXNyKzB4Ni8weDI3OgorIyAgIGFyY2hfc3RhdGljX2JyYW5jaCBhdCBhcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3IuaDoxMjEKKyMgICAgKGlubGluZWQgYnkpIHN0YXRpY19rZXlfZmFsc2UgYXQgaW5jbHVkZS9saW51eC9qdW1wX2xhYmVsLmg6MTI1CisjICAgIChpbmxpbmVkIGJ5KSBuYXRpdmVfd3JpdGVfbXNyIGF0IGFyY2gveDg2L2luY2x1ZGUvYXNtL21zci5oOjEyNQorIworIyBUaGUgZnVuY3Rpb24gc2l6ZSBhZnRlciB0aGUgJy8nIGluIHRoZSBpbnB1dCBpcyBvcHRpb25hbCwgYnV0IHJlY29tbWVuZGVkLgorIyBJdCdzIHVzZWQgdG8gaGVscCBkaXNhbWJpZ3VhdGUgYW55IGR1cGxpY2F0ZSBzeW1ib2wgbmFtZXMsIHdoaWNoIGNhbiBvY2N1cgorIyByYXJlbHkuICBJZiB0aGUgc2l6ZSBpcyBvbWl0dGVkIGZvciBhIGR1cGxpY2F0ZSBzeW1ib2wgdGhlbiBpdCdzIHBvc3NpYmxlIGZvcgorIyBtdWx0aXBsZSBjb2RlIHNpdGVzIHRvIGJlIHByaW50ZWQ6CisjCisjICAgJCAuL3NjcmlwdHMvZmFkZHIybGluZSB+L2svdm1saW51eCByYXdfaW9jdGwrMHg1CisjICAgcmF3X2lvY3RsKzB4NS8weDIwOgorIyAgIHJhd19pb2N0bCBhdCBkcml2ZXJzL2NoYXIvcmF3LmM6MTIyCisjCisjICAgcmF3X2lvY3RsKzB4NS8weGIxOgorIyAgIHJhd19pb2N0bCBhdCBuZXQvaXB2NC9yYXcuYzo4NzYKKyMKKyMgTXVsdGlwbGUgYWRkcmVzc2VzIGNhbiBiZSBzcGVjaWZpZWQgb24gYSBzaW5nbGUgY29tbWFuZCBsaW5lOgorIworIyAgICQgLi9zY3JpcHRzL2ZhZGRyMmxpbmUgfi9rL3ZtbGludXggdHlwZV9zaG93KzB4MTAvNDUgZnJlZV9yZXNlcnZlZF9hcmVhKzB4OTAKKyMgICB0eXBlX3Nob3crMHgxMC8weDJkOgorIyAgIHR5cGVfc2hvdyBhdCBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9iYWNrbGlnaHQuYzoyMTMKKyMKKyMgICBmcmVlX3Jlc2VydmVkX2FyZWErMHg5MC8weDEyMzoKKyMgICBmcmVlX3Jlc2VydmVkX2FyZWEgYXQgbW0vcGFnZV9hbGxvYy5jOjY0MjkgKGRpc2NyaW1pbmF0b3IgMikKKworCitzZXQgLW8gZXJyZXhpdAorc2V0IC1vIG5vdW5zZXQKKworY29tbWFuZCAtdiBhd2sgPi9kZXYvbnVsbCAyPiYxIHx8IGRpZSAiYXdrIGlzbid0IGluc3RhbGxlZCIKK2NvbW1hbmQgLXYgcmVhZGVsZiA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJyZWFkZWxmIGlzbid0IGluc3RhbGxlZCIKK2NvbW1hbmQgLXYgYWRkcjJsaW5lID4vZGV2L251bGwgMj4mMSB8fCBkaWUgImFkZHIybGluZSBpc24ndCBpbnN0YWxsZWQiCisKK3VzYWdlKCkgeworCWVjaG8gInVzYWdlOiBmYWRkcjJsaW5lIDxvYmplY3QgZmlsZT4gPGZ1bmMrb2Zmc2V0PiA8ZnVuYytvZmZzZXQ+Li4uIiA+JjIKKwlleGl0IDEKK30KKword2FybigpIHsKKwllY2hvICIkMSIgPiYyCit9CisKK2RpZSgpIHsKKwllY2hvICJFUlJPUjogJDEiID4mMgorCWV4aXQgMQorfQorCisjIFRyeSB0byBmaWd1cmUgb3V0IHRoZSBzb3VyY2UgZGlyZWN0b3J5IHByZWZpeCBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGZyb20gdGhlCisjIGFkZHIybGluZSBvdXRwdXQuICBIQUNLIEFMRVJUOiBUaGlzIGFzc3VtZXMgdGhhdCBzdGFydF9rZXJuZWwoKSBpcyBpbgorIyBrZXJuZWwvaW5pdC5jISAgVGhpcyBvbmx5IHdvcmtzIGZvciB2bWxpbnV4LiAgT3RoZXJ3aXNlIGl0IGZhbGxzIGJhY2sgdG8KKyMgcHJpbnRpbmcgdGhlIGFic29sdXRlIHBhdGguCitmaW5kX2Rpcl9wcmVmaXgoKSB7CisJbG9jYWwgb2JqZmlsZT0kMQorCisJbG9jYWwgc3RhcnRfa2VybmVsX2FkZHI9JChyZWFkZWxmIC1zVyAkb2JqZmlsZSB8IGF3ayAnJDggPT0gInN0YXJ0X2tlcm5lbCIge3ByaW50ZiAiMHglcyIsICQyfScpCisJW1sgLXogJHN0YXJ0X2tlcm5lbF9hZGRyIF1dICYmIHJldHVybgorCisJbG9jYWwgZmlsZV9saW5lPSQoYWRkcjJsaW5lIC1lICRvYmpmaWxlICRzdGFydF9rZXJuZWxfYWRkcikKKwlbWyAteiAkZmlsZV9saW5lIF1dICYmIHJldHVybgorCisJbG9jYWwgcHJlZml4PSR7ZmlsZV9saW5lJWluaXQvbWFpbi5jOip9CisJaWYgW1sgLXogJHByZWZpeCBdXSB8fCBbWyAkcHJlZml4ID0gJGZpbGVfbGluZSBdXTsgdGhlbgorCQlyZXR1cm4KKwlmaQorCisJRElSX1BSRUZJWD0kcHJlZml4CisJcmV0dXJuIDAKK30KKworX19mYWRkcjJsaW5lKCkgeworCWxvY2FsIG9iamZpbGU9JDEKKwlsb2NhbCBmdW5jX2FkZHI9JDIKKwlsb2NhbCBkaXJfcHJlZml4PSQzCisJbG9jYWwgcHJpbnRfd2FybmluZ3M9JDQKKworCWxvY2FsIGZ1bmM9JHtmdW5jX2FkZHIlKyp9CisJbG9jYWwgb2Zmc2V0PSR7ZnVuY19hZGRyIyorfQorCW9mZnNldD0ke29mZnNldCUvKn0KKwlsb2NhbCBzaXplPQorCVtbICRmdW5jX2FkZHIgPX4gIi8iIF1dICYmIHNpemU9JHtmdW5jX2FkZHIjKi99CisKKwlpZiBbWyAteiAkZnVuYyBdXSB8fCBbWyAteiAkb2Zmc2V0IF1dIHx8IFtbICRmdW5jID0gJGZ1bmNfYWRkciBdXTsgdGhlbgorCQl3YXJuICJiYWQgZnVuYytvZmZzZXQgJGZ1bmNfYWRkciIKKwkJRE9ORT0xCisJCXJldHVybgorCWZpCisKKwkjIEdvIHRocm91Z2ggZWFjaCBvZiB0aGUgb2JqZWN0J3Mgc3ltYm9scyB3aGljaCBtYXRjaCB0aGUgZnVuYyBuYW1lLgorCSMgSW4gcmFyZSBjYXNlcyB0aGVyZSBtaWdodCBiZSBkdXBsaWNhdGVzLgorCXdoaWxlIHJlYWQgc3ltYm9sOyBkbworCQlsb2NhbCBmaWVsZHM9KCRzeW1ib2wpCisJCWxvY2FsIHN5bV9iYXNlPTB4JHtmaWVsZHNbMV19CisJCWxvY2FsIHN5bV9zaXplPSR7ZmllbGRzWzJdfQorCQlsb2NhbCBzeW1fdHlwZT0ke2ZpZWxkc1szXX0KKworCQkjIGNhbGN1bGF0ZSB0aGUgYWRkcmVzcworCQlsb2NhbCBhZGRyPSQoKCRzeW1fYmFzZSArICRvZmZzZXQpKQorCQlpZiBbWyAteiAkYWRkciBdXSB8fCBbWyAkYWRkciA9IDAgXV07IHRoZW4KKwkJCXdhcm4gImJhZCBhZGRyZXNzOiAkc3ltX2Jhc2UgKyAkb2Zmc2V0IgorCQkJRE9ORT0xCisJCQlyZXR1cm4KKwkJZmkKKwkJbG9jYWwgaGV4YWRkcj0weCQocHJpbnRmICV4ICRhZGRyKQorCisJCSMgd2VlZCBvdXQgbm9uLWZ1bmN0aW9uIHN5bWJvbHMKKwkJaWYgW1sgJHN5bV90eXBlICE9ICJGVU5DIiBdXTsgdGhlbgorCQkJW1sgJHByaW50X3dhcm5pbmdzID0gMSBdXSAmJgorCQkJCWVjaG8gInNraXBwaW5nICRmdW5jIGFkZHJlc3MgYXQgJGhleGFkZHIgZHVlIHRvIG5vbi1mdW5jdGlvbiBzeW1ib2wiCisJCQljb250aW51ZQorCQlmaQorCisJCSMgaWYgdGhlIHVzZXIgcHJvdmlkZWQgYSBzaXplLCBtYWtlIHN1cmUgaXQgbWF0Y2hlcyB0aGUgc3ltYm9sJ3Mgc2l6ZQorCQlpZiBbWyAtbiAkc2l6ZSBdXSAmJiBbWyAkc2l6ZSAtbmUgJHN5bV9zaXplIF1dOyB0aGVuCisJCQlbWyAkcHJpbnRfd2FybmluZ3MgPSAxIF1dICYmCisJCQkJZWNobyAic2tpcHBpbmcgJGZ1bmMgYWRkcmVzcyBhdCAkaGV4YWRkciBkdWUgdG8gc2l6ZSBtaXNtYXRjaCAoJHNpemUgIT0gJHN5bV9zaXplKSIKKwkJCWNvbnRpbnVlOworCQlmaQorCisJCSMgbWFrZSBzdXJlIHRoZSBwcm92aWRlZCBvZmZzZXQgaXMgd2l0aGluIHRoZSBzeW1ib2wncyByYW5nZQorCQlpZiBbWyAkb2Zmc2V0IC1ndCAkc3ltX3NpemUgXV07IHRoZW4KKwkJCVtbICRwcmludF93YXJuaW5ncyA9IDEgXV0gJiYKKwkJCQllY2hvICJza2lwcGluZyAkZnVuYyBhZGRyZXNzIGF0ICRoZXhhZGRyIGR1ZSB0byBzaXplIG1pc21hdGNoICgkb2Zmc2V0ID4gJHN5bV9zaXplKSIKKwkJCWNvbnRpbnVlCisJCWZpCisKKwkJIyBzZXBhcmF0ZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGggYSBibGFuayBsaW5lCisJCVtbICRGSVJTVCA9IDAgXV0gJiYgZWNobworCQlGSVJTVD0wCisKKwkJbG9jYWwgaGV4c2l6ZT0weCQocHJpbnRmICV4ICRzeW1fc2l6ZSkKKwkJZWNobyAiJGZ1bmMrJG9mZnNldC8kaGV4c2l6ZToiCisJCWFkZHIybGluZSAtZnBpZSAkb2JqZmlsZSAkaGV4YWRkciB8IHNlZCAiczsgJGRpcl9wcmVmaXhcKFwuL1wpKjsgOyIKKwkJRE9ORT0xCisKKwlkb25lIDwgPChyZWFkZWxmIC1zVyAkb2JqZmlsZSB8IGF3ayAtdiBmPSRmdW5jICckOCA9PSBmIHtwcmludH0nKQorfQorCitbWyAkIyAtbHQgMiBdXSAmJiB1c2FnZQorCitvYmpmaWxlPSQxCitbWyAhIC1mICRvYmpmaWxlIF1dICYmIGRpZSAiY2FuJ3QgZmluZCBvYmpmaWxlICRvYmpmaWxlIgorc2hpZnQKKworRElSX1BSRUZJWD1zdXBlcmNhbGlmcmFnaWxpc3RpY2V4cGlhbGlkb2Npb3VzCitmaW5kX2Rpcl9wcmVmaXggJG9iamZpbGUKKworRklSU1Q9MQord2hpbGUgW1sgJCMgLWd0IDAgXV07IGRvCisJZnVuY19hZGRyPSQxCisJc2hpZnQKKworCSMgcHJpbnQgYW55IG1hdGNoZXMgZm91bmQKKwlET05FPTAKKwlfX2ZhZGRyMmxpbmUgJG9iamZpbGUgJGZ1bmNfYWRkciAkRElSX1BSRUZJWCAwCisKKwkjIGlmIG5vIG1hdGNoIHdhcyBmb3VuZCwgcHJpbnQgd2FybmluZ3MKKwlpZiBbWyAkRE9ORSA9IDAgXV07IHRoZW4KKwkJX19mYWRkcjJsaW5lICRvYmpmaWxlICRmdW5jX2FkZHIgJERJUl9QUkVGSVggMQorCQl3YXJuICJubyBtYXRjaCBmb3IgJGZ1bmNfYWRkciIKKwlmaQorZG9uZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rZXJuZWwtZG9jIGIvc2NyaXB0cy9rZXJuZWwtZG9jCmluZGV4IDRmMmU5MDQuLjkzNzIxZjMgMTAwNzU1Ci0tLSBhL3NjcmlwdHMva2VybmVsLWRvYworKysgYi9zY3JpcHRzL2tlcm5lbC1kb2MKQEAgLTIxMiw2ICsyMTIsNyBAQAogbXkgJHR5cGVfY29uc3RhbnQgPSAnXCUoWy1fXHddKyknOwogbXkgJHR5cGVfZnVuYyA9ICcoXHcrKVwoXCknOwogbXkgJHR5cGVfcGFyYW0gPSAnXEAoXHcrKSc7CitteSAkdHlwZV9mcF9wYXJhbSA9ICdcQChcdyspXChcKSc7ICAjIFNwZWNpYWwgUlNUIGhhbmRsaW5nIGZvciBmdW5jIHB0ciBwYXJhbXMKIG15ICR0eXBlX3N0cnVjdCA9ICdcJigoc3RydWN0XHMqKSpbX1x3XSspJzsKIG15ICR0eXBlX3N0cnVjdF94bWwgPSAnXFwmYW1wOygoc3RydWN0XHMqKSpbX1x3XSspJzsKIG15ICR0eXBlX2VudiA9ICcoXCRcdyspJzsKQEAgLTI5Miw2ICsyOTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAjIE5vdGU6IG5lZWQgdG8gZXNjYXBlICgpIHRvIGF2b2lkIGZ1bmMgbWF0Y2hpbmcgbGF0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgWyR0eXBlX21lbWJlcl9mdW5jLCAiXFw6Y1xcOnR5cGVcXDpgXCQxXCQyXFxcXChcXFxcKSA8XCQxPmAiXSwKICAgICAgICAgICAgICAgICAgICAgICAgWyR0eXBlX21lbWJlciwgIlxcOmNcXDp0eXBlXFw6YFwkMVwkMiA8XCQxPmAiXSwKKwkJICAgICAgIFskdHlwZV9mcF9wYXJhbSwgIioqXCQxXFxcXChcXFxcKSoqIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIFskdHlwZV9mdW5jLCAiXFw6Y1xcOmZ1bmNcXDpgXCQxKClgIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIFskdHlwZV9zdHJ1Y3RfZnVsbCwgIlxcOmNcXDp0eXBlXFw6YFwkMSBcJDIgPFwkMj5gIl0sCiAgICAgICAgICAgICAgICAgICAgICAgIFskdHlwZV9lbnVtX2Z1bGwsICJcXDpjXFw6dHlwZVxcOmBcJDEgXCQyIDxcJDI+YCJdLApAQCAtNDEyLDcgKzQxNCw3IEBACiBteSAkZG9jX2RlY2wgPSAkZG9jX2NvbSAuICcoXHcrKSc7CiAjIEBwYXJhbXMgYW5kIGEgc3RyaWN0bHkgbGltaXRlZCBzZXQgb2Ygc3VwcG9ydGVkIHNlY3Rpb24gbmFtZXMKIG15ICRkb2Nfc2VjdCA9ICRkb2NfY29tIC4gCi0gICAgJ1xzKihcQFx3K3xkZXNjcmlwdGlvbnxjb250ZXh0fHJldHVybnM/fG5vdGVzP3xleGFtcGxlcz8pXHMqOiguKiknOworICAgICdccyooXEBbLlx3XSt8XEBcLlwuXC58ZGVzY3JpcHRpb258Y29udGV4dHxyZXR1cm5zP3xub3Rlcz98ZXhhbXBsZXM/KVxzKjooLiopJzsKIG15ICRkb2NfY29udGVudCA9ICRkb2NfY29tX2JvZHkgLiAnKC4qKSc7CiBteSAkZG9jX2Jsb2NrID0gJGRvY19jb20gLiAnRE9DOlxzKiguKik/JzsKIG15ICRkb2NfaW5saW5lX3N0YXJ0ID0gJ15ccyovXCpcKlxzKiQnOwpAQCAtMTgzMSwxMyArMTgzMywyMiBAQAogICAgIG15ICVhcmdzID0gJXskX1swXX07CiAgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKICAgICBteSAkb2xkcHJlZml4ID0gJGxpbmVwcmVmaXg7Ci0gICAgbXkgJHN0YXJ0OworICAgIG15ICRzdGFydCA9ICIiOwogCi0gICAgcHJpbnQgIi4uIGM6ZnVuY3Rpb246OiAiOwotICAgIGlmICgkYXJnc3snZnVuY3Rpb250eXBlJ30gbmUgIiIpIHsKLQkkc3RhcnQgPSAkYXJnc3snZnVuY3Rpb250eXBlJ30gLiAiICIgLiAkYXJnc3snZnVuY3Rpb24nfSAuICIgKCI7CisgICAgaWYgKCRhcmdzeyd0eXBlZGVmJ30pIHsKKwlwcmludCAiLi4gYzp0eXBlOjogIi4gJGFyZ3N7J2Z1bmN0aW9uJ30gLiAiXG5cbiI7CisJcHJpbnRfbGluZW5vKCRkZWNsYXJhdGlvbl9zdGFydF9saW5lKTsKKwlwcmludCAiICAgKipUeXBlZGVmKio6ICI7CisJJGxpbmVwcmVmaXggPSAiIjsKKwlvdXRwdXRfaGlnaGxpZ2h0X3JzdCgkYXJnc3sncHVycG9zZSd9KTsKKwkkc3RhcnQgPSAiXG5cbioqU3ludGF4KipcblxuICBgYCI7CiAgICAgfSBlbHNlIHsKLQkkc3RhcnQgPSAkYXJnc3snZnVuY3Rpb24nfSAuICIgKCI7CisJcHJpbnQgIi4uIGM6ZnVuY3Rpb246OiAiOworICAgIH0KKyAgICBpZiAoJGFyZ3N7J2Z1bmN0aW9udHlwZSd9IG5lICIiKSB7CisJJHN0YXJ0IC49ICRhcmdzeydmdW5jdGlvbnR5cGUnfSAuICIgIiAuICRhcmdzeydmdW5jdGlvbid9IC4gIiAoIjsKKyAgICB9IGVsc2UgeworCSRzdGFydCAuPSAkYXJnc3snZnVuY3Rpb24nfSAuICIgKCI7CiAgICAgfQogICAgIHByaW50ICRzdGFydDsKIApAQCAtMTg0OSw5ICsxODYwLDYgQEAKIAkkY291bnQrKzsKIAkkdHlwZSA9ICRhcmdzeydwYXJhbWV0ZXJ0eXBlcyd9eyRwYXJhbWV0ZXJ9OwogCi0JIyBSU1QgZG9lc24ndCBsaWtlIGFkZHJlc3Nfc3BhY2UgdGFncyBhdCBmdW5jdGlvbiBwcm90b3R5cGVzCi0JJHR5cGUgPX4gcy9fXyh1c2VyfGtlcm5lbHxpb21lbXxwZXJjcHV8cG1lbXxyY3UpXHMqLy87Ci0KIAlpZiAoJHR5cGUgPX4gbS8oW15cKF0qXChcKilccypcKVxzKlwoKFteXCldKilcKS8pIHsKIAkgICAgIyBwb2ludGVyLXRvLWZ1bmN0aW9uCiAJICAgIHByaW50ICQxIC4gJHBhcmFtZXRlciAuICIpICgiIC4gJDI7CkBAIC0xODU5LDExICsxODY3LDE1IEBACiAJICAgIHByaW50ICR0eXBlIC4gIiAiIC4gJHBhcmFtZXRlcjsKIAl9CiAgICAgfQotICAgIHByaW50ICIpXG5cbiI7Ci0gICAgcHJpbnRfbGluZW5vKCRkZWNsYXJhdGlvbl9zdGFydF9saW5lKTsKLSAgICAkbGluZXByZWZpeCA9ICIgICAiOwotICAgIG91dHB1dF9oaWdobGlnaHRfcnN0KCRhcmdzeydwdXJwb3NlJ30pOwotICAgIHByaW50ICJcbiI7CisgICAgaWYgKCRhcmdzeyd0eXBlZGVmJ30pIHsKKwlwcmludCAiKTtgYFxuXG4iOworICAgIH0gZWxzZSB7CisJcHJpbnQgIilcblxuIjsKKwlwcmludF9saW5lbm8oJGRlY2xhcmF0aW9uX3N0YXJ0X2xpbmUpOworCSRsaW5lcHJlZml4ID0gIiAgICI7CisJb3V0cHV0X2hpZ2hsaWdodF9yc3QoJGFyZ3N7J3B1cnBvc2UnfSk7CisJcHJpbnQgIlxuIjsKKyAgICB9CiAKICAgICBwcmludCAiKipQYXJhbWV0ZXJzKipcblxuIjsKICAgICAkbGluZXByZWZpeCA9ICIgICI7CkBAIC0yMDAzLDcgKzIwMTUsNyBAQAogCSgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9IG5lICR1bmRlc2NyaWJlZCkgfHwgbmV4dDsKIAkkdHlwZSA9ICRhcmdzeydwYXJhbWV0ZXJ0eXBlcyd9eyRwYXJhbWV0ZXJ9OwogICAgICAgICBwcmludF9saW5lbm8oJHBhcmFtZXRlcmRlc2Nfc3RhcnRfbGluZXN7JHBhcmFtZXRlcl9uYW1lfSk7Ci0JcHJpbnQgImBgJHR5cGUgJHBhcmFtZXRlcmBgXG4iOworCXByaW50ICJgYCIgLiAkcGFyYW1ldGVyIC4gImBgXG4iOwogCW91dHB1dF9oaWdobGlnaHRfcnN0KCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0pOwogCXByaW50ICJcbiI7CiAgICAgfQpAQCAtMjE5Myw3ICsyMjA1LDkgQEAKICAgICAkeCA9fiBzQC9cKi4qP1wqL0BAZ29zOwkjIHN0cmlwIGNvbW1lbnRzLgogCiAgICAgIyBQYXJzZSBmdW5jdGlvbiBwcm90b3R5cGVzCi0gICAgaWYgKCR4ID1+IC90eXBlZGVmXHMrKFx3KylccypcKFwqXHMqKFx3XFMrKVxzKlwpXHMqXCgoLiopXCk7LykgeworICAgIGlmICgkeCA9fiAvdHlwZWRlZlxzKyhcdyspXHMqXChcKlxzKihcd1xTKylccypcKVxzKlwoKC4qKVwpOy8gfHwKKwkkeCA9fiAvdHlwZWRlZlxzKyhcdyspXHMqKFx3XFMrKVxzKlxzKlwoKC4qKVwpOy8pIHsKKwogCSMgRnVuY3Rpb24gdHlwZWRlZnMKIAkkcmV0dXJuX3R5cGUgPSAkMTsKIAkkZGVjbGFyYXRpb25fbmFtZSA9ICQyOwpAQCAtMjIwNCw2ICsyMjE4LDcgQEAKIAlvdXRwdXRfZGVjbGFyYXRpb24oJGRlY2xhcmF0aW9uX25hbWUsCiAJCQkgICAnZnVuY3Rpb24nLAogCQkJICAgeydmdW5jdGlvbicgPT4gJGRlY2xhcmF0aW9uX25hbWUsCisJCQkgICAgJ3R5cGVkZWYnID0+IDEsCiAJCQkgICAgJ21vZHVsZScgPT4gJG1vZHVsZW5hbWUsCiAJCQkgICAgJ2Z1bmN0aW9udHlwZScgPT4gJHJldHVybl90eXBlLAogCQkJICAgICdwYXJhbWV0ZXJsaXN0JyA9PiBcQHBhcmFtZXRlcmxpc3QsCkBAIC0yMzM4LDYgKzIzNTMsNyBAQAogCiAJaWYgKCR0eXBlIGVxICIiICYmICRwYXJhbSA9fiAvXC5cLlwuJC8pCiAJeworCSAgICAkcGFyYW0gPSAiLi4uIjsKIAkgICAgaWYgKCFkZWZpbmVkICRwYXJhbWV0ZXJkZXNjc3skcGFyYW19IHx8ICRwYXJhbWV0ZXJkZXNjc3skcGFyYW19IGVxICIiKSB7CiAJCSRwYXJhbWV0ZXJkZXNjc3skcGFyYW19ID0gInZhcmlhYmxlIGFyZ3VtZW50cyI7CiAJICAgIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYiBiL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgppbmRleCBlMWMwOWUyLi44ZWE5ZmQyIDEwMDc1NQotLS0gYS9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKKysrIGIvc2NyaXB0cy9wYWNrYWdlL2J1aWxkZGViCkBAIC0zMzIsNyArMzMyLDkgQEAKIAkoY2QgJG9ianRyZWU7IGZpbmQgdG9vbHMvb2JqdG9vbCAtdHlwZSBmIC1leGVjdXRhYmxlKSA+PiAiJG9ianRyZWUvZGViaWFuL2hkcm9iamZpbGVzIgogZmkKIChjZCAkb2JqdHJlZTsgZmluZCBhcmNoLyRTUkNBUkNIL2luY2x1ZGUgTW9kdWxlLnN5bXZlcnMgaW5jbHVkZSBzY3JpcHRzIC10eXBlIGYpID4+ICIkb2JqdHJlZS9kZWJpYW4vaGRyb2JqZmlsZXMiCi0oY2QgJG9ianRyZWU7IGZpbmQgc2NyaXB0cy9nY2MtcGx1Z2lucyAtbmFtZSBcKi5zbyAtbyAtbmFtZSBnY2MtY29tbW9uLmgpID4+ICIkb2JqdHJlZS9kZWJpYW4vaGRyb2JqZmlsZXMiCitpZiBncmVwIC1xICdeQ09ORklHX0dDQ19QTFVHSU5TPXknICRLQ09ORklHX0NPTkZJRyA7IHRoZW4KKwkoY2QgJG9ianRyZWU7IGZpbmQgc2NyaXB0cy9nY2MtcGx1Z2lucyAtbmFtZSBcKi5zbyAtbyAtbmFtZSBnY2MtY29tbW9uLmgpID4+ICIkb2JqdHJlZS9kZWJpYW4vaGRyb2JqZmlsZXMiCitmaQogZGVzdGRpcj0ka2VybmVsX2hlYWRlcnNfZGlyL3Vzci9zcmMvbGludXgtaGVhZGVycy0kdmVyc2lvbgogbWtkaXIgLXAgIiRkZXN0ZGlyIgogKGNkICRzcmN0cmVlOyB0YXIgLWMgLWYgLSAtVCAtKSA8ICIkb2JqdHJlZS9kZWJpYW4vaGRyc3JjZmlsZXMiIHwgKGNkICRkZXN0ZGlyOyB0YXIgLXhmIC0pCmRpZmYgLS1naXQgYS9zY3JpcHRzL3JlY29yZG1jb3VudC5jIGIvc2NyaXB0cy9yZWNvcmRtY291bnQuYwppbmRleCA0MjM5NmE3Li5hNjhmMDMxIDEwMDY0NAotLS0gYS9zY3JpcHRzL3JlY29yZG1jb3VudC5jCisrKyBiL3NjcmlwdHMvcmVjb3JkbWNvdW50LmMKQEAgLTM2Myw2ICszNjMsNyBAQAogCQlzdHJjbXAoIi5zY2hlZC50ZXh0IiwgICAgdHh0bmFtZSkgPT0gMCB8fAogCQlzdHJjbXAoIi5zcGlubG9jay50ZXh0IiwgdHh0bmFtZSkgPT0gMCB8fAogCQlzdHJjbXAoIi5pcnFlbnRyeS50ZXh0IiwgdHh0bmFtZSkgPT0gMCB8fAorCQlzdHJjbXAoIi5zb2Z0aXJxZW50cnkudGV4dCIsIHR4dG5hbWUpID09IDAgfHwKIAkJc3RyY21wKCIua3Byb2Jlcy50ZXh0IiwgdHh0bmFtZSkgPT0gMCB8fAogCQlzdHJjbXAoIi50ZXh0LnVubGlrZWx5IiwgdHh0bmFtZSkgPT0gMDsKIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMvcmVjb3JkbWNvdW50LnBsIGIvc2NyaXB0cy9yZWNvcmRtY291bnQucGwKaW5kZXggOTZlMjQ4Ni4uMmQ0ODAxMSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9yZWNvcmRtY291bnQucGwKKysrIGIvc2NyaXB0cy9yZWNvcmRtY291bnQucGwKQEAgLTEzNCw2ICsxMzQsNyBAQAogICAgICAiLnNjaGVkLnRleHQiID0+IDEsCiAgICAgICIuc3BpbmxvY2sudGV4dCIgPT4gMSwKICAgICAgIi5pcnFlbnRyeS50ZXh0IiA9PiAxLAorICAgICAiLnNvZnRpcnFlbnRyeS50ZXh0IiA9PiAxLAogICAgICAiLmtwcm9iZXMudGV4dCIgPT4gMSwKICAgICAgIi50ZXh0LnVubGlrZWx5IiA9PiAxLAogKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdGFncy5zaCBiL3NjcmlwdHMvdGFncy5zaAppbmRleCBlZDdlZWYyLi5iMzc3NWE5IDEwMDc1NQotLS0gYS9zY3JpcHRzL3RhZ3Muc2gKKysrIGIvc2NyaXB0cy90YWdzLnNoCkBAIC0yMDYsNyArMjA2LDYgQEAKIAknL1w8REVGSU5FX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoW14sXSosICpcKFtbOmFsbnVtOl1fXSpcKS9cMS92LycKIAknL1w8REVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoXChbWzphbG51bTpdX10qXCkvXDEvdi8nCiAJJy9cPERFQ0xBUkVfXChUQVNLTEVUXHxXT1JLXHxERUxBWUVEX1dPUktcKShcKFtbOmFsbnVtOl1fXSpcKS9cMi92LycKLQknL1w8REVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoXChbWzphbG51bTpdX10qXCkvXDEvdi8nCiAJJy9cKF5cc1wpT0ZGU0VUKFwoW1s6YWxudW06XV9dKlwpL1wyL3YvJwogCScvXCheXHNcKURFRklORShcKFtbOmFsbnVtOl1fXSpcKS9cMi92LycKIAknL1w8REVGSU5FX0hBU0hUQUJMRShcKFtbOmFsbnVtOl1fXSpcKS9cMS92LycKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJhY2luZy9mdHJhY2UtYmlzZWN0LnNoIGIvc2NyaXB0cy90cmFjaW5nL2Z0cmFjZS1iaXNlY3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWZmOGFjNQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvdHJhY2luZy9mdHJhY2UtYmlzZWN0LnNoCkBAIC0wLDAgKzEsMTE1IEBACisjIS9iaW4vYmFzaAorIworIyBIZXJlJ3MgaG93IHRvIHVzZSB0aGlzOgorIworIyBUaGlzIHNjcmlwdCBpcyB1c2VkIHRvIGhlbHAgZmluZCBmdW5jdGlvbnMgdGhhdCBhcmUgYmVpbmcgdHJhY2VkIGJ5IGZ1bmN0aW9uCisjIHRyYWNlciBvciBmdW5jdGlvbiBncmFwaCB0cmFjaW5nIHRoYXQgY2F1c2VzIHRoZSBtYWNoaW5lIHRvIHJlYm9vdCwgaGFuZywgb3IKKyMgY3Jhc2guIEhlcmUncyB0aGUgc3RlcHMgdG8gdGFrZS4KKyMKKyMgRmlyc3QsIGRldGVybWluZSBpZiBmdW5jdGlvbiB0cmFjaW5nIGlzIHdvcmtpbmcgd2l0aCBhIHNpbmdsZSBmdW5jdGlvbjoKKyMKKyMgICAobm90ZSwgaWYgdGhpcyBpcyBhIHByb2JsZW0gd2l0aCBmdW5jdGlvbl9ncmFwaCB0cmFjaW5nLCB0aGVuIHNpbXBseQorIyAgICByZXBsYWNlICJmdW5jdGlvbiIgd2l0aCAiZnVuY3Rpb25fZ3JhcGgiIGluIHRoZSBmb2xsb3dpbmcgc3RlcHMpLgorIworIyAgIyBjZCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nCisjICAjIGVjaG8gc2NoZWR1bGUgPiBzZXRfZnRyYWNlX2ZpbHRlcgorIyAgIyBlY2hvIGZ1bmN0aW9uID4gY3VycmVudF90cmFjZXIKKyMKKyMgSWYgdGhpcyB3b3JrcywgdGhlbiB3ZSBrbm93IHRoYXQgc29tZXRoaW5nIGlzIGJlaW5nIHRyYWNlZCB0aGF0IHNob3VsZG4ndCBiZS4KKyMKKyMgICMgZWNobyBub3AgPiBjdXJyZW50X3RyYWNlcgorIworIyAgIyBjYXQgYXZhaWxhYmxlX2ZpbHRlcl9mdW5jdGlvbnMgPiB+L2Z1bGwtZmlsZQorIyAgIyBmdHJhY2UtYmlzZWN0IH4vZnVsbC1maWxlIH4vdGVzdC1maWxlIH4vbm9uLXRlc3QtZmlsZQorIyAgIyBjYXQgfi90ZXN0LWZpbGUgPiBzZXRfZnRyYWNlX2ZpbHRlcgorIworIyAqKiogTm90ZSAqKiogdGhpcyB3aWxsIHRha2Ugc2V2ZXJhbCBtaW51dGVzLiBTZXR0aW5nIG11bHRpcGxlIGZ1bmN0aW9ucyBpcworIyBhbiBPKG5eMikgb3BlcmF0aW9uLCBhbmQgd2UgYXJlIGRlYWxpbmcgd2l0aCB0aG91c2FuZHMgb2YgZnVuY3Rpb25zLiBTbyBnbworIyBoYXZlICBjb2ZmZWUsIHRhbGsgd2l0aCB5b3VyIGNvd29ya2VycywgcmVhZCBmYWNlYm9vay4gQW5kIGV2ZW50dWFsbHksIHRoaXMKKyMgb3BlcmF0aW9uIHdpbGwgZW5kLgorIworIyAgIyBlY2hvIGZ1bmN0aW9uID4gY3VycmVudF90cmFjZXIKKyMKKyMgSWYgaXQgY3Jhc2hlcywgd2Uga25vdyB0aGF0IH4vdGVzdC1maWxlIGhhcyBhIGJhZCBmdW5jdGlvbi4KKyMKKyMgICBSZWJvb3QgYmFjayB0byB0ZXN0IGtlcm5lbC4KKyMKKyMgICAgICMgY2QgL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZworIyAgICAgIyBtdiB+L3Rlc3QtZmlsZSB+L2Z1bGwtZmlsZQorIworIyBJZiBpdCBkaWRuJ3QgY3Jhc2guCisjCisjICAgICAjIGVjaG8gbm9wID4gY3VycmVudF90cmFjZXIKKyMgICAgICMgbXYgfi9ub24tdGVzdC1maWxlIH4vZnVsbC1maWxlCisjCisjIEdldCByaWQgb2YgdGhlIG90aGVyIHRlc3QgZmlsZSBmcm9tIHByZXZpb3VzIHJ1biAob3Igc2F2ZSB0aGVtIG9mZiBzb21ld2hlcmUpLgorIyAgIyBybSAtZiB+L3Rlc3QtZmlsZSB+L25vbi10ZXN0LWZpbGUKKyMKKyMgQW5kIHN0YXJ0IGFnYWluOgorIworIyAgIyBmdHJhY2UtYmlzZWN0IH4vZnVsbC1maWxlIH4vdGVzdC1maWxlIH4vbm9uLXRlc3QtZmlsZQorIworIyBUaGUgZ29vZCB0aGluZyBpcywgYmVjYXVzZSB0aGlzIGN1dHMgdGhlIG51bWJlciBvZiBmdW5jdGlvbnMgaW4gfi90ZXN0LWZpbGUKKyMgYnkgaGFsZiwgdGhlIGNhdCBvZiBpdCBpbnRvIHNldF9mdHJhY2VfZmlsdGVyIHRha2VzIGhhbGYgYXMgbG9uZyBlYWNoCisjIGl0ZXJhdGlvbiwgc28gZG9uJ3QgdGFsayBzbyBtdWNoIGF0IHRoZSB3YXRlciBjb29sZXIgdGhlIHNlY29uZCB0aW1lLgorIworIyBFdmVudHVhbGx5LCBpZiB5b3UgZGlkIHRoaXMgY29ycmVjdGx5LCB5b3Ugd2lsbCBnZXQgZG93biB0byB0aGUgcHJvYmxlbQorIyBmdW5jdGlvbiwgYW5kIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHRvIG5vdHJhY2UgaXQuCisjCisjIFRoZSB3YXkgdG8gZmlndXJlIG91dCBpZiB0aGUgcHJvYmxlbSBmdW5jdGlvbiBpcyBiYWQsIGp1c3QgZG86CisjCisjICAjIGVjaG8gPHByb2JsZW0tZnVuY3Rpb24+ID4gc2V0X2Z0cmFjZV9ub3RyYWNlCisjICAjIGVjaG8gPiBzZXRfZnRyYWNlX2ZpbHRlcgorIyAgIyBlY2hvIGZ1bmN0aW9uID4gY3VycmVudF90cmFjZXIKKyMKKyMgQW5kIGlmIGl0IGRvZXNuJ3QgY3Jhc2gsIHdlIGFyZSBkb25lLgorIworIyBJZiBpdCBkb2VzIGNyYXNoLCBkbyB0aGlzIGFnYWluICh0aGVyZSdzIG1vcmUgdGhhbiBvbmUgcHJvYmxlbSBmdW5jdGlvbikKKyMgYnV0IHlvdSBuZWVkIHRvIGVjaG8gdGhlIHByb2JsZW0gZnVuY3Rpb24ocykgaW50byBzZXRfZnRyYWNlX25vdHJhY2UgYmVmb3JlCisjIGVuYWJsaW5nIGZ1bmN0aW9uIHRyYWNpbmcgaW4gdGhlIGFib3ZlIHN0ZXBzLiBPciBpZiB5b3UgY2FuIGNvbXBpbGUgdGhlCisjIGtlcm5lbCwgYW5ub3RhdGUgdGhlIHByb2JsZW0gZnVuY3Rpb25zIHdpdGggIm5vdHJhY2UiIGFuZCBzdGFydCBhZ2Fpbi4KKyMKKworCitpZiBbICQjIC1uZSAzIF07IHRoZW4KKyAgZWNobyAndXNhZ2U6IGZ0cmFjZS1iaXNlY3QgZnVsbC1maWxlIHRlc3QtZmlsZSAgbm9uLXRlc3QtZmlsZScKKyAgZXhpdAorZmkKKworZnVsbD0kMQordGVzdD0kMgorbm9udGVzdD0kMworCit4PWBjYXQgJGZ1bGwgfCB3YyAtbGAKK2lmIFsgJHggLWVxIDEgXTsgdGhlbgorCWVjaG8gIlRoZXJlJ3Mgb25seSBvbmUgZnVuY3Rpb24gbGVmdCwgbXVzdCBiZSB0aGUgYmFkIG9uZSIKKwljYXQgJGZ1bGwKKwlleGl0IDAKK2ZpCisKK2xldCB4PSR4LzIKK2xldCB5PSR4KzEKKworaWYgWyAhIC1mICRmdWxsIF07IHRoZW4KKwllY2hvICIkZnVsbCBkb2VzIG5vdCBleGlzdCIKKwlleGl0IDEKK2ZpCisKK2lmIFsgLWYgJHRlc3QgXTsgdGhlbgorCWVjaG8gLW4gIiR0ZXN0IGV4aXN0cywgZGVsZXRlIGl0PyBbeS9OXSIKKwlyZWFkIGEKKwlpZiBbICIkYSIgIT0gInkiIC1hICIkYSIgIT0gIlkiIF07IHRoZW4KKwkJZXhpdCAxCisJZmkKK2ZpCisKK2lmIFsgLWYgJG5vbnRlc3QgXTsgdGhlbgorCWVjaG8gLW4gIiRub250ZXN0IGV4aXN0cywgZGVsZXRlIGl0PyBbeS9OXSIKKwlyZWFkIGEKKwlpZiBbICIkYSIgIT0gInkiIC1hICIkYSIgIT0gIlkiIF07IHRoZW4KKwkJZXhpdCAxCisJZmkKK2ZpCisKK3NlZCAtbmUgIjEsJHt4fXAiICRmdWxsID4gJHRlc3QKK3NlZCAtbmUgIiR5LFwkcCIgJGZ1bGwgPiAkbm9udGVzdApkaWZmIC0tZ2l0IGEvc2NyaXB0cy92ZXJfbGludXggYi9zY3JpcHRzL3Zlcl9saW51eAppbmRleCAwZDhiZDI5Li40MzBiMjAxIDEwMDc1NQotLS0gYS9zY3JpcHRzL3Zlcl9saW51eAorKysgYi9zY3JpcHRzL3Zlcl9saW51eApAQCAtMSwxOTMgKzEsODkgQEAKLSMhL2Jpbi9zaAorIyEvYmluL2F3ayAtZgogIyBCZWZvcmUgcnVubmluZyB0aGlzIHNjcmlwdCBwbGVhc2UgZW5zdXJlIHRoYXQgeW91ciBQQVRIIGlzCiAjIHR5cGljYWwgYXMgeW91IHVzZSBmb3IgY29tcGlsYXRpb24vaW5zdGFsbGF0aW9uLiBJIHVzZQogIyAvYmluIC9zYmluIC91c3IvYmluIC91c3Ivc2JpbiAvdXNyL2xvY2FsL2JpbiwgYnV0IGl0IG1heQogIyBkaWZmZXIgb24geW91ciBzeXN0ZW0uCi0jCi1lY2hvICdJZiBzb21lIGZpZWxkcyBhcmUgZW1wdHkgb3IgbG9vayB1bnVzdWFsIHlvdSBtYXkgaGF2ZSBhbiBvbGQgdmVyc2lvbi4nCi1lY2hvICdDb21wYXJlIHRvIHRoZSBjdXJyZW50IG1pbmltYWwgcmVxdWlyZW1lbnRzIGluIERvY3VtZW50YXRpb24vQ2hhbmdlcy4nCi1lY2hvICcgJwogCi11bmFtZSAtYQotZWNobyAnICcKK0JFR0lOIHsKKwl1c2FnZSA9ICJJZiBzb21lIGZpZWxkcyBhcmUgZW1wdHkgb3IgbG9vayB1bnVzdWFsIHlvdSBtYXkgaGF2ZSBhbiBvbGQgdmVyc2lvbi5cbiIKKwl1c2FnZSA9IHVzYWdlICJDb21wYXJlIHRvIHRoZSBjdXJyZW50IG1pbmltYWwgcmVxdWlyZW1lbnRzIGluIERvY3VtZW50YXRpb24vQ2hhbmdlcy5cbiIKKwlwcmludCB1c2FnZQogCi1nY2MgLWR1bXB2ZXJzaW9uIDI+JjEgfAotYXdrICcvWzAtOV0rKFsuXT9bMC05XSspKy8gJiYgIS9ub3QgZm91bmQkL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiR05VIENcdFx0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKKwlzeXN0ZW0oInVuYW1lIC1hIikKKwlwcmludGYoIlxuIikKIAotbWFrZSAtLXZlcnNpb24gMj4mMSB8Ci1hd2sgJy9HTlUgTWFrZS97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQlwcmludGYoIkdOVSBNYWtlXHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JworCXByaW50dmVyc2lvbigiR05VIEMiLCB2ZXJzaW9uKCJnY2MgLWR1bXB2ZXJzaW9uIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIkdOVSBNYWtlIiwgdmVyc2lvbigibWFrZSAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiQmludXRpbHMiLCB2ZXJzaW9uKCJsZCAtdiAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJVdGlsLWxpbnV4IiwgdmVyc2lvbigibW91bnQgLS12ZXJzaW9uIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIk1vdW50IiwgdmVyc2lvbigibW91bnQgLS12ZXJzaW9uIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIk1vZHVsZS1pbml0LXRvb2xzIiwgdmVyc2lvbigiZGVwbW9kIC1WICAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJFMmZzcHJvZ3MiLCB2ZXJzaW9uKCJ0dW5lMmZzIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIkpmc3V0aWxzIiwgdmVyc2lvbigiZnNjay5qZnMgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiUmVpc2VyZnNwcm9ncyIsIHZlcnNpb24oInJlaXNlcmZzY2sgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiUmVpc2VyNGZzcHJvZ3MiLCB2ZXJzaW9uKCJmc2NrLnJlaXNlcjQgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiWGZzcHJvZ3MiLCB2ZXJzaW9uKCJ4ZnNfZGIgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiUGNtY2lhdXRpbHMiLCB2ZXJzaW9uKCJwY2NhcmRjdGwgLVYgMj4mMSIpKQorCXByaW50dmVyc2lvbigiUGNtY2lhLWNzIiwgdmVyc2lvbigiY2FyZG1nciAtViAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJRdW90YS10b29scyIsIHZlcnNpb24oInF1b3RhIC1WIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIlBQUCIsIHZlcnNpb24oInBwcGQgLS12ZXJzaW9uIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIklzZG40ay11dGlscyIsIHZlcnNpb24oImlzZG5jdHJsIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIk5mcy11dGlscyIsIHZlcnNpb24oInNob3dtb3VudCAtLXZlcnNpb24gMj4mMSIpKQogCi1sZCAtdiAyPiYxIHwKLWF3ayAnL1swLTldKyhbLl0/WzAtOV0rKSsvICYmICEvbm90IGZvdW5kJC97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQlwcmludGYoIkJpbnV0aWxzXHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JwotCi1tb3VudCAtLXZlcnNpb24gMj4mMSB8Ci1hd2sgJy9bMC05XSsoWy5dP1swLTldKykrLyAmJiAhL25vdCBmb3VuZCQvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JJDAgPSBzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpCi0JcHJpbnRmKCJVdGlsLWxpbnV4XHRcdCVzXG5Nb3VudFx0XHRcdCVzXG4iLCQwLCQwKQotfScKLQotZGVwbW9kIC1WICAyPiYxIHwKLWF3ayAnL1swLTldKyhbLl0/WzAtOV0rKSsvICYmICEvbm90IGZvdW5kJC97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQlwcmludGYoIk1vZHVsZS1pbml0LXRvb2xzXHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotdHVuZTJmcyAyPiYxIHwKLWF3ayAnL150dW5lMmZzL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiRTJmc3Byb2dzXHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JwotCi1mc2NrLmpmcyAtViAyPiYxIHwKLWF3ayAnL3ZlcnNpb24vewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJKZnN1dGlsc1x0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotcmVpc2VyZnNjayAtViAyPiYxIHwKLWF3ayAnL15yZWlzZXJmc2NrL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiUmVpc2VyZnNwcm9nc1x0XHQlc1xuIiwKLQlzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpKQotfScKLQotZnNjay5yZWlzZXI0IC1WIDI+JjEgfCBncmVwIF5mc2NrLnJlaXNlcjQgfCBhd2sgXAotJ05SPT0xe3ByaW50ICJyZWlzZXI0cHJvZ3MgICAgICAgICAgIiwgJDJ9JwotCi14ZnNfZGIgLVYgMj4mMSB8Ci1hd2sgJy92ZXJzaW9uL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiWGZzcHJvZ3NcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLXBjY2FyZGN0bCAtViAyPiYxIHwKLWF3ayAnL3BjbWNpYXV0aWxzL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiUGNtY2lhdXRpbHNcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLWNhcmRtZ3IgLVYgMj4mMXwgZ3JlcCB2ZXJzaW9uIHwgYXdrIFwKLSdOUj09MXtwcmludCAicGNtY2lhLWNzICAgICAgICAgICAgICIsICQzfScKLQotcXVvdGEgLVYgMj4mMSB8Ci1hd2sgJy92ZXJzaW9uL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiUXVvdGEtdG9vbHNcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLXBwcGQgLS12ZXJzaW9uIDI+JjEgfAotYXdrICcvdmVyc2lvbi97Ci0JbWF0Y2goJDAsIC9bMC05XSsoWy5dP1swLTldKykrLykKLQlwcmludGYoIlBQUFx0XHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JwotCi1pc2RuY3RybCAyPiYxIHwgZ3JlcCB2ZXJzaW9uIHwgYXdrIFwKLSdOUj09MXtwcmludCAiaXNkbjRrLXV0aWxzICAgICAgICAgICIsICRORn0nCi0KLXNob3dtb3VudCAtLXZlcnNpb24gMj4mMSB8IGdyZXAgbmZzLXV0aWxzIHwgYXdrIFwKLSdOUj09MXtwcmludCAibmZzLXV0aWxzICAgICAgICAgICAgICIsICRORn0nCi0KLXRlc3QgLXIgL3Byb2Mvc2VsZi9tYXBzICYmCi1zZWQgJwotCS8uKmxpYmMtXCguKlwpXC5zbyQvIWQKLQlzLy9MaW51eCBDIExpYnJhcnlcdFx0XDEvCi0JcQotJyAvcHJvYy9zZWxmL21hcHMKLQotbGRkIC0tdmVyc2lvbiAyPiYxIHwKLWF3ayAnL15sZGQvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JcHJpbnRmKCJEeW5hbWljIGxpbmtlciAobGRkKVx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLWxpYmNwcD1gbGRjb25maWcgLXAgMj4vZGV2L251bGwgfAotCWF3ayAnLyhsaWJnfHN0ZGMpWytdK1wuc28vIHsKLQlwcmludCAkTkYKLQlleGl0CisJaWYgKHN5c3RlbSgidGVzdCAtciAvcHJvYy9zZWxmL21hcHMiKSA9PSAwKSB7CisJCXdoaWxlIChnZXRsaW5lIDwiL3Byb2Mvc2VsZi9tYXBzIiA+IDApIHsKKwkJCW4gPSBzcGxpdCgkMCwgcHJvY21hcHMsICIvIikKKwkJCWlmICgvbGliYy4qc28kLyAmJiBtYXRjaChwcm9jbWFwc1tuXSwgL1swLTldKyhbLl0/WzAtOV0rKSsvKSkgeworCQkJCXZlciA9IHN1YnN0cihwcm9jbWFwc1tuXSwgUlNUQVJULCBSTEVOR1RIKQorCQkJCXByaW50dmVyc2lvbigiTGludXggQyBMaWJyYXJ5IiwgdmVyKQorCQkJCWJyZWFrCisJCQl9CisJCX0KIAl9Ci0nYAotdGVzdCAtciAiJGxpYmNwcCIgJiYKLWxzIC1sICRsaWJjcHAgfAotc2VkICcKLQlzIS4qc29cLiEhCi0JcyFeIUxpbnV4IEMrKyBMaWJyYXJ5XHQhCi0nCi1wcyAtLXZlcnNpb24gMj4mMSB8Ci1hd2sgJy92ZXJzaW9uL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiUHJvY3BzXHRcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCiAKLWlmY29uZmlnIC0tdmVyc2lvbiAyPiYxIHwKLWF3ayAnL3Rvb2xzL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiTmV0LXRvb2xzXHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JworCXByaW50dmVyc2lvbigiRHluYW1pYyBsaW5rZXIgKGxkZCkiLCB2ZXJzaW9uKCJsZGQgLS12ZXJzaW9uIDI+JjEiKSkKIAotbG9hZGtleXMgLVYgMj4mMSB8Ci1hd2sgJy9bMC05XSsoWy5dP1swLTldKykrLyAmJiAhL25vdCBmb3VuZCQvewotCW1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pCi0JJDAgPSBzdWJzdHIoJDAsUlNUQVJULFJMRU5HVEgpCi0JcHJpbnRmKCJLYmRcdFx0XHQlc1xuQ29uc29sZS10b29sc1x0XHQlc1xuIiwkMCwkMCkKLX0nCisJd2hpbGUgKCJsZGNvbmZpZyAtcCAyPi9kZXYvbnVsbCIgfCBnZXRsaW5lID4gMCkgeworCQlpZiAoLyhsaWJnfHN0ZGMpWytdK1wuc28vKSB7CisJCQlsaWJjcHAgPSAkTkYKKwkJCWJyZWFrCisJCX0KKwl9CisJaWYgKHN5c3RlbSgidGVzdCAtciAiIGxpYmNwcCkgPT0gMCkKKwkJcHJpbnR2ZXJzaW9uKCJMaW51eCBDKysgTGlicmFyeSIsIHZlcnNpb24oInJlYWRsaW5rICIgbGliY3BwKSkKIAotb3Byb2ZpbGVkIC0tdmVyc2lvbiAyPiYxIHwgYXdrIFwKLScoTlI9PTEgJiYgKCQyID09ICJvcHJvZmlsZSIpKSB7cHJpbnQgIm9wcm9maWxlICAgICAgICAgICAgICAiLCAkM30nCisJcHJpbnR2ZXJzaW9uKCJQcm9jcHMiLCB2ZXJzaW9uKCJwcyAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiTmV0LXRvb2xzIiwgdmVyc2lvbigiaWZjb25maWcgLS12ZXJzaW9uIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIktiZCIsIHZlcnNpb24oImxvYWRrZXlzIC1WIDI+JjEiKSkKKwlwcmludHZlcnNpb24oIkNvbnNvbGUtdG9vbHMiLCB2ZXJzaW9uKCJsb2Fka2V5cyAtViAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJPcHJvZmlsZSIsIHZlcnNpb24oIm9wcm9maWxlZCAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiU2gtdXRpbHMiLCB2ZXJzaW9uKCJleHByIC0tdiAyPiYxIikpCisJcHJpbnR2ZXJzaW9uKCJVZGV2IiwgdmVyc2lvbigidWRldmFkbSAtLXZlcnNpb24gMj4mMSIpKQorCXByaW50dmVyc2lvbigiV2lyZWxlc3MtdG9vbHMiLCB2ZXJzaW9uKCJpd2NvbmZpZyAtLXZlcnNpb24gMj4mMSIpKQogCi1leHByIC0tdiAyPiYxIHwKLWF3ayAnL15leHByL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiU2gtdXRpbHNcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLXVkZXZhZG0gLS12ZXJzaW9uIDI+JjEgfAotYXdrICcvWzAtOV0rKFsuXT9bMC05XSspKy8gJiYgIS9ub3QgZm91bmQkL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiVWRldlx0XHRcdCVzXG4iLAotCXN1YnN0cigkMCxSU1RBUlQsUkxFTkdUSCkpCi19JwotCi1pd2NvbmZpZyAtLXZlcnNpb24gMj4mMSB8Ci1hd2sgJy92ZXJzaW9uL3sKLQltYXRjaCgkMCwgL1swLTldKyhbLl0/WzAtOV0rKSsvKQotCXByaW50ZigiV2lyZWxlc3MtdG9vbHNcdFx0JXNcbiIsCi0Jc3Vic3RyKCQwLFJTVEFSVCxSTEVOR1RIKSkKLX0nCi0KLXRlc3QgLWUgL3Byb2MvbW9kdWxlcyAmJgotc29ydCAvcHJvYy9tb2R1bGVzIHwKLXNlZCAnCi0Jcy8gLiovLwotCUgKLSR7Ci0JZwotCXMvXlxuL01vZHVsZXMgTG9hZGVkXHRcdC8KLQl5L1xuLyAvCi0JcQorCWlmIChzeXN0ZW0oInRlc3QgLXIgL3Byb2MvbW9kdWxlcyIpID09IDApIHsKKwkJd2hpbGUgKCJzb3J0IC9wcm9jL21vZHVsZXMiIHwgZ2V0bGluZSA+IDApIHsKKwkJCW1vZHMgPSBtb2RzIHNlcCAkMQorCQkJc2VwID0gIiAiCisJCX0KKwkJcHJpbnR2ZXJzaW9uKCJNb2R1bGVzIExvYWRlZCIsIG1vZHMpCisJfQogfQotCWQKLScKKworZnVuY3Rpb24gdmVyc2lvbihjbWQsICAgIHZlcikgeworCXdoaWxlIChjbWQgfCBnZXRsaW5lID4gMCkgeworCQlpZiAoIS92ZXJfbGludXgvICYmIG1hdGNoKCQwLCAvWzAtOV0rKFsuXT9bMC05XSspKy8pKSB7CisJCQl2ZXIgPSBzdWJzdHIoJDAsIFJTVEFSVCwgUkxFTkdUSCkKKwkJCWJyZWFrCisJCX0KKwl9CisJY2xvc2UoY21kKQorCXJldHVybiB2ZXIKK30KKworZnVuY3Rpb24gcHJpbnR2ZXJzaW9uKG5hbWUsIHZhbHVlLCAgb2ZtdCkgeworCWlmICh2YWx1ZSAhPSAiIikgeworCQlvZm10ID0gIiUtMjBzXHQlc1xuIgorCQlwcmludGYob2ZtdCwgbmFtZSwgdmFsdWUpCisJfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvS2NvbmZpZyBiL3NlY3VyaXR5L0tjb25maWcKaW5kZXggZGExMGQ5Yi4uMTE4ZjQ1NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvS2NvbmZpZworKysgYi9zZWN1cml0eS9LY29uZmlnCkBAIC0xNDcsNiArMTQ3LDE3IEBACiAJICBvciBhcmUgcGFydCBvZiB0aGUga2VybmVsIHRleHQuIFRoaXMga2lsbHMgZW50aXJlIGNsYXNzZXMKIAkgIG9mIGhlYXAgb3ZlcmZsb3cgZXhwbG9pdHMgYW5kIHNpbWlsYXIga2VybmVsIG1lbW9yeSBleHBvc3VyZXMuCiAKK2NvbmZpZyBIQVJERU5FRF9VU0VSQ09QWV9QQUdFU1BBTgorCWJvb2wgIlJlZnVzZSB0byBjb3B5IGFsbG9jYXRpb25zIHRoYXQgc3BhbiBtdWx0aXBsZSBwYWdlcyIKKwlkZXBlbmRzIG9uIEhBUkRFTkVEX1VTRVJDT1BZCisJZGVwZW5kcyBvbiBFWFBFUlQKKwloZWxwCisJICBXaGVuIGEgbXVsdGktcGFnZSBhbGxvY2F0aW9uIGlzIGRvbmUgd2l0aG91dCBfX0dGUF9DT01QLAorCSAgaGFyZGVuZWQgdXNlcmNvcHkgd2lsbCByZWplY3QgYXR0ZW1wdHMgdG8gY29weSBpdC4gVGhlcmUgYXJlLAorCSAgaG93ZXZlciwgc2V2ZXJhbCBjYXNlcyBvZiB0aGlzIGluIHRoZSBrZXJuZWwgdGhhdCBoYXZlIG5vdCBhbGwKKwkgIGJlZW4gcmVtb3ZlZC4gVGhpcyBjb25maWcgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IHdoaWxlCisJICB0cnlpbmcgdG8gZmluZCBzdWNoIHVzZXJzLgorCiBzb3VyY2Ugc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnCiBzb3VyY2Ugc2VjdXJpdHkvc21hY2svS2NvbmZpZwogc291cmNlIHNlY3VyaXR5L3RvbW95by9LY29uZmlnCmRpZmYgLS1naXQgYS9zZWN1cml0eS9pbm9kZS5jIGIvc2VjdXJpdHkvaW5vZGUuYwppbmRleCBlM2RmOTA1Li5hY2MzZTljIDEwMDY0NAotLS0gYS9zZWN1cml0eS9pbm9kZS5jCisrKyBiL3NlY3VyaXR5L2lub2RlLmMKQEAgLTE1NiwxMiArMTU2LDExIEBACiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcwogICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgc2VjdXJpdHlmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCiAgKiB0byBiZSByZW1vdmVkIChubyBhdXRvbWF0aWMgY2xlYW51cCBoYXBwZW5zIGlmIHlvdXIgbW9kdWxlIGlzIHVubG9hZGVkLAotICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlKS4gIElmIGFuIGVycm9yIG9jY3VycywgJU5VTEwgd2lsbCBiZSByZXR1cm5lZC4KKyAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZSkuICBJZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybgorICogdGhlIGVycm9yIHZhbHVlICh2aWEgRVJSX1BUUikuCiAgKgogICogSWYgc2VjdXJpdHlmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgJS1FTk9ERVYgaXMKLSAqIHJldHVybmVkLiAgSXQgaXMgbm90IHdpc2UgdG8gY2hlY2sgZm9yIHRoaXMgdmFsdWUsIGJ1dCByYXRoZXIsIGNoZWNrIGZvcgotICogJU5VTEwgb3IgISVOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKLSAqIGNvZGUuCisgKiByZXR1cm5lZC4KICAqLwogc3RydWN0IGRlbnRyeSAqc2VjdXJpdHlmc19jcmVhdGVfZGlyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCkKIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvZW5jcnlwdGVkLWtleXMvZW5jcnlwdGVkLmMgYi9zZWN1cml0eS9rZXlzL2VuY3J5cHRlZC1rZXlzL2VuY3J5cHRlZC5jCmluZGV4IDVhZGJmYzMuLjE3YTA2MTAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvZW5jcnlwdGVkLWtleXMvZW5jcnlwdGVkLmMKKysrIGIvc2VjdXJpdHkva2V5cy9lbmNyeXB0ZWQta2V5cy9lbmNyeXB0ZWQuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KICNpbmNsdWRlIDxjcnlwdG8vaGFzaC5oPgogI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KICNpbmNsdWRlIDxjcnlwdG8vc2tjaXBoZXIuaD4KQEAgLTQ3OCw2ICs0NzksNyBAQAogCXN0cnVjdCBjcnlwdG9fc2tjaXBoZXIgKnRmbTsKIAlzdHJ1Y3Qgc2tjaXBoZXJfcmVxdWVzdCAqcmVxOwogCXVuc2lnbmVkIGludCBlbmNyeXB0ZWRfZGF0YWxlbjsKKwl1OCBpdltBRVNfQkxPQ0tfU0laRV07CiAJdW5zaWduZWQgaW50IHBhZGxlbjsKIAljaGFyIHBhZFsxNl07CiAJaW50IHJldDsKQEAgLTUwMCw4ICs1MDIsOCBAQAogCXNnX2luaXRfdGFibGUoc2dfb3V0LCAxKTsKIAlzZ19zZXRfYnVmKHNnX291dCwgZXBheWxvYWQtPmVuY3J5cHRlZF9kYXRhLCBlbmNyeXB0ZWRfZGF0YWxlbik7CiAKLQlza2NpcGhlcl9yZXF1ZXN0X3NldF9jcnlwdChyZXEsIHNnX2luLCBzZ19vdXQsIGVuY3J5cHRlZF9kYXRhbGVuLAotCQkJCSAgIGVwYXlsb2FkLT5pdik7CisJbWVtY3B5KGl2LCBlcGF5bG9hZC0+aXYsIHNpemVvZihpdikpOworCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2dfaW4sIHNnX291dCwgZW5jcnlwdGVkX2RhdGFsZW4sIGl2KTsKIAlyZXQgPSBjcnlwdG9fc2tjaXBoZXJfZW5jcnlwdChyZXEpOwogCXRmbSA9IGNyeXB0b19za2NpcGhlcl9yZXF0Zm0ocmVxKTsKIAlza2NpcGhlcl9yZXF1ZXN0X2ZyZWUocmVxKTsKQEAgLTU4MSw2ICs1ODMsNyBAQAogCXN0cnVjdCBjcnlwdG9fc2tjaXBoZXIgKnRmbTsKIAlzdHJ1Y3Qgc2tjaXBoZXJfcmVxdWVzdCAqcmVxOwogCXVuc2lnbmVkIGludCBlbmNyeXB0ZWRfZGF0YWxlbjsKKwl1OCBpdltBRVNfQkxPQ0tfU0laRV07CiAJY2hhciBwYWRbMTZdOwogCWludCByZXQ7CiAKQEAgLTU5OSw4ICs2MDIsOCBAQAogCQkgICBlcGF5bG9hZC0+ZGVjcnlwdGVkX2RhdGFsZW4pOwogCXNnX3NldF9idWYoJnNnX291dFsxXSwgcGFkLCBzaXplb2YgcGFkKTsKIAotCXNrY2lwaGVyX3JlcXVlc3Rfc2V0X2NyeXB0KHJlcSwgc2dfaW4sIHNnX291dCwgZW5jcnlwdGVkX2RhdGFsZW4sCi0JCQkJICAgZXBheWxvYWQtPml2KTsKKwltZW1jcHkoaXYsIGVwYXlsb2FkLT5pdiwgc2l6ZW9mKGl2KSk7CisJc2tjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBzZ19pbiwgc2dfb3V0LCBlbmNyeXB0ZWRfZGF0YWxlbiwgaXYpOwogCXJldCA9IGNyeXB0b19za2NpcGhlcl9kZWNyeXB0KHJlcSk7CiAJdGZtID0gY3J5cHRvX3NrY2lwaGVyX3JlcXRmbShyZXEpOwogCXNrY2lwaGVyX3JlcXVlc3RfZnJlZShyZXEpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvbHNtX2F1ZGl0LmMgYi9zZWN1cml0eS9sc21fYXVkaXQuYwppbmRleCBjY2NiZjMwLi4zN2YwNGRhIDEwMDY0NAotLS0gYS9zZWN1cml0eS9sc21fYXVkaXQuYworKysgYi9zZWN1cml0eS9sc21fYXVkaXQuYwpAQCAtOTksNyArOTksNyBAQAogCX0KIAlyZXR1cm4gcmV0OwogfQotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAvKioKICAqIGlwdjZfc2tiX3RvX2F1ZGl0ZGF0YSA6IGZpbGwgYXVkaXRkYXRhIGZyb20gc2tiCiAgKiBAc2tiIDogdGhlIHNrYgpAQCAtMjIwLDcgKzIyMCw3IEBACiAJICovCiAJQlVJTERfQlVHX09OKHNpemVvZihhLT51KSA+IHNpemVvZih2b2lkICopKjIpOwogCi0JYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBwaWQ9JWQgY29tbT0iLCB0YXNrX3BpZF9ucihjdXJyZW50KSk7CisJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBwaWQ9JWQgY29tbT0iLCB0YXNrX3RnaWRfbnIoY3VycmVudCkpOwogCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIG1lbWNweShjb21tLCBjdXJyZW50LT5jb21tLCBzaXplb2YoY29tbSkpKTsKIAogCXN3aXRjaCAoYS0+dHlwZSkgewpAQCAtMjQ1LDYgKzI0NSwxOSBAQAogCQl9CiAJCWJyZWFrOwogCX0KKwljYXNlIExTTV9BVURJVF9EQVRBX0ZJTEU6IHsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKworCQlhdWRpdF9sb2dfZF9wYXRoKGFiLCAiIHBhdGg9IiwgJmEtPnUuZmlsZS0+Zl9wYXRoKTsKKworCQlpbm9kZSA9IGZpbGVfaW5vZGUoYS0+dS5maWxlKTsKKwkJaWYgKGlub2RlKSB7CisJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGRldj0iKTsKKwkJCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIGlub2RlLT5pX3NiLT5zX2lkKTsKKwkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgaW5vPSVsdSIsIGlub2RlLT5pX2lubyk7CisJCX0KKwkJYnJlYWs7CisJfQogCWNhc2UgTFNNX0FVRElUX0RBVEFfSU9DVExfT1A6IHsKIAkJc3RydWN0IGlub2RlICppbm9kZTsKIApAQCAtMjU3LDcgKzI3MCw3IEBACiAJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGlubz0lbHUiLCBpbm9kZS0+aV9pbm8pOwogCQl9CiAKLQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBpb2N0bGNtZD0laHgiLCBhLT51Lm9wLT5jbWQpOworCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGlvY3RsY21kPTB4JWh4IiwgYS0+dS5vcC0+Y21kKTsKIAkJYnJlYWs7CiAJfQogCWNhc2UgTFNNX0FVRElUX0RBVEFfREVOVFJZOiB7CkBAIC0yOTQsNyArMzA3LDcgQEAKIAljYXNlIExTTV9BVURJVF9EQVRBX1RBU0s6IHsKIAkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBhLT51LnRzazsKIAkJaWYgKHRzaykgewotCQkJcGlkX3QgcGlkID0gdGFza19waWRfbnIodHNrKTsKKwkJCXBpZF90IHBpZCA9IHRhc2tfdGdpZF9ucih0c2spOwogCQkJaWYgKHBpZCkgewogCQkJCWNoYXIgY29tbVtzaXplb2YodHNrLT5jb21tKV07CiAJCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBvcGlkPSVkIG9jb21tPSIsIHBpZCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWN1cml0eS5jIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwppbmRleCA0ODM4ZTdmLi5mODI1MzA0IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWN1cml0eS5jCisrKyBiL3NlY3VyaXR5L3NlY3VyaXR5LmMKQEAgLTM2NCw2ICszNjQsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2VjdXJpdHlfZGVudHJ5X2luaXRfc2VjdXJpdHkpOwogCitpbnQgc2VjdXJpdHlfZGVudHJ5X2NyZWF0ZV9maWxlc19hcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkJCSAgICBzdHJ1Y3QgcXN0ciAqbmFtZSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGNyZWQgKm9sZCwgc3RydWN0IGNyZWQgKm5ldykKK3sKKwlyZXR1cm4gY2FsbF9pbnRfaG9vayhkZW50cnlfY3JlYXRlX2ZpbGVzX2FzLCAwLCBkZW50cnksIG1vZGUsCisJCQkJbmFtZSwgb2xkLCBuZXcpOworfQorRVhQT1JUX1NZTUJPTChzZWN1cml0eV9kZW50cnlfY3JlYXRlX2ZpbGVzX2FzKTsKKwogaW50IHNlY3VyaXR5X2lub2RlX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsCiAJCQkJIGNvbnN0IHN0cnVjdCBxc3RyICpxc3RyLAogCQkJCSBjb25zdCBpbml0eGF0dHJzIGluaXR4YXR0cnMsIHZvaWQgKmZzX2RhdGEpCkBAIC03NDgsNiArNzU3LDE4IEBACiAJY2FsbF92b2lkX2hvb2soaW5vZGVfZ2V0c2VjaWQsIGlub2RlLCBzZWNpZCk7CiB9CiAKK2ludCBzZWN1cml0eV9pbm9kZV9jb3B5X3VwKHN0cnVjdCBkZW50cnkgKnNyYywgc3RydWN0IGNyZWQgKipuZXcpCit7CisJcmV0dXJuIGNhbGxfaW50X2hvb2soaW5vZGVfY29weV91cCwgMCwgc3JjLCBuZXcpOworfQorRVhQT1JUX1NZTUJPTChzZWN1cml0eV9pbm9kZV9jb3B5X3VwKTsKKworaW50IHNlY3VyaXR5X2lub2RlX2NvcHlfdXBfeGF0dHIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gY2FsbF9pbnRfaG9vayhpbm9kZV9jb3B5X3VwX3hhdHRyLCAtRU9QTk9UU1VQUCwgbmFtZSk7Cit9CitFWFBPUlRfU1lNQk9MKHNlY3VyaXR5X2lub2RlX2NvcHlfdXBfeGF0dHIpOworCiBpbnQgc2VjdXJpdHlfZmlsZV9wZXJtaXNzaW9uKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgbWFzaykKIHsKIAlpbnQgcmV0OwpAQCAtMTYyMyw2ICsxNjQ0LDggQEAKIAkJTElTVF9IRUFEX0lOSVQoc2VjdXJpdHlfaG9va19oZWFkcy5zYl9wYXJzZV9vcHRzX3N0ciksCiAJLmRlbnRyeV9pbml0X3NlY3VyaXR5ID0KIAkJTElTVF9IRUFEX0lOSVQoc2VjdXJpdHlfaG9va19oZWFkcy5kZW50cnlfaW5pdF9zZWN1cml0eSksCisJLmRlbnRyeV9jcmVhdGVfZmlsZXNfYXMgPQorCQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLmRlbnRyeV9jcmVhdGVfZmlsZXNfYXMpLAogI2lmZGVmIENPTkZJR19TRUNVUklUWV9QQVRICiAJLnBhdGhfdW5saW5rID0JTElTVF9IRUFEX0lOSVQoc2VjdXJpdHlfaG9va19oZWFkcy5wYXRoX3VubGluayksCiAJLnBhdGhfbWtkaXIgPQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLnBhdGhfbWtkaXIpLApAQCAtMTY4NCw2ICsxNzA3LDEwIEBACiAJCUxJU1RfSEVBRF9JTklUKHNlY3VyaXR5X2hvb2tfaGVhZHMuaW5vZGVfbGlzdHNlY3VyaXR5KSwKIAkuaW5vZGVfZ2V0c2VjaWQgPQogCQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLmlub2RlX2dldHNlY2lkKSwKKwkuaW5vZGVfY29weV91cCA9CisJCUxJU1RfSEVBRF9JTklUKHNlY3VyaXR5X2hvb2tfaGVhZHMuaW5vZGVfY29weV91cCksCisJLmlub2RlX2NvcHlfdXBfeGF0dHIgPQorCQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLmlub2RlX2NvcHlfdXBfeGF0dHIpLAogCS5maWxlX3Blcm1pc3Npb24gPQogCQlMSVNUX0hFQURfSU5JVChzZWN1cml0eV9ob29rX2hlYWRzLmZpbGVfcGVybWlzc2lvbiksCiAJLmZpbGVfYWxsb2Nfc2VjdXJpdHkgPQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnIGIvc2VjdXJpdHkvc2VsaW51eC9LY29uZmlnCmluZGV4IDg2OTFlOTIuLmVhN2UzZWYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvS2NvbmZpZworKysgYi9zZWN1cml0eS9zZWxpbnV4L0tjb25maWcKQEAgLTkzLDQxICs5MywzIEBACiAJICB2aWEgL3NlbGludXgvY2hlY2tyZXFwcm90IGlmIGF1dGhvcml6ZWQgYnkgcG9saWN5LgogCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBob3cgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIGFuc3dlciAwLgotCi1jb25maWcgU0VDVVJJVFlfU0VMSU5VWF9QT0xJQ1lEQl9WRVJTSU9OX01BWAotCWJvb2wgIk5TQSBTRUxpbnV4IG1heGltdW0gc3VwcG9ydGVkIHBvbGljeSBmb3JtYXQgdmVyc2lvbiIKLQlkZXBlbmRzIG9uIFNFQ1VSSVRZX1NFTElOVVgKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBtYXhpbXVtIHBvbGljeSBmb3JtYXQgdmVyc2lvbiBzdXBwb3J0ZWQKLQkgIGJ5IFNFTGludXggdG8gYmUgc2V0IHRvIGEgcGFydGljdWxhciB2YWx1ZS4gIFRoaXMgdmFsdWUgaXMgcmVwb3J0ZWQKLQkgIHRvIHVzZXJzcGFjZSB2aWEgL3NlbGludXgvcG9saWN5dmVycyBhbmQgdXNlZCBhdCBwb2xpY3kgbG9hZCB0aW1lLgotCSAgSXQgY2FuIGJlIGFkanVzdGVkIGRvd253YXJkIHRvIHN1cHBvcnQgbGVnYWN5IHVzZXJsYW5kIChpbml0KSB0aGF0Ci0JICBkb2VzIG5vdCBjb3JyZWN0bHkgaGFuZGxlIGtlcm5lbHMgdGhhdCBzdXBwb3J0IG5ld2VyIHBvbGljeSB2ZXJzaW9ucy4KLQotCSAgRXhhbXBsZXM6Ci0JICBGb3IgdGhlIEZlZG9yYSBDb3JlIDMgb3IgNCBMaW51eCBkaXN0cmlidXRpb25zLCBlbmFibGUgdGhpcyBvcHRpb24KLQkgIGFuZCBzZXQgdGhlIHZhbHVlIHZpYSB0aGUgbmV4dCBvcHRpb24uIEZvciBGZWRvcmEgQ29yZSA1IGFuZCBsYXRlciwKLQkgIGRvIG5vdCBlbmFibGUgdGhpcyBvcHRpb24uCi0KLQkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5zd2VyIE4uCi0KLWNvbmZpZyBTRUNVUklUWV9TRUxJTlVYX1BPTElDWURCX1ZFUlNJT05fTUFYX1ZBTFVFCi0JaW50ICJOU0EgU0VMaW51eCBtYXhpbXVtIHN1cHBvcnRlZCBwb2xpY3kgZm9ybWF0IHZlcnNpb24gdmFsdWUiCi0JZGVwZW5kcyBvbiBTRUNVUklUWV9TRUxJTlVYX1BPTElDWURCX1ZFUlNJT05fTUFYCi0JcmFuZ2UgMTUgMjMKLQlkZWZhdWx0IDE5Ci0JaGVscAotCSAgVGhpcyBvcHRpb24gc2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBtYXhpbXVtIHBvbGljeSBmb3JtYXQgdmVyc2lvbgotCSAgc3VwcG9ydGVkIGJ5IFNFTGludXguCi0KLQkgIEV4YW1wbGVzOgotCSAgRm9yIEZlZG9yYSBDb3JlIDMsIHVzZSAxOC4KLQkgIEZvciBGZWRvcmEgQ29yZSA0LCB1c2UgMTkuCi0KLQkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgbG9vayBmb3IgdGhlCi0JICBwb2xpY3kgZm9ybWF0IHZlcnNpb24gc3VwcG9ydGVkIGJ5IHlvdXIgcG9saWN5IHRvb2xjaGFpbiwgYnkKLQkgIHJ1bm5pbmcgJ2NoZWNrcG9saWN5IC1WJy4gT3IgbG9vayBhdCB3aGF0IHBvbGljeSB5b3UgaGF2ZQotCSAgaW5zdGFsbGVkIHVuZGVyIC9ldGMvc2VsaW51eC8kU0VMSU5VWFRZUEUvcG9saWN5LCB3aGVyZQotCSAgU0VMSU5VWFRZUEUgaXMgZGVmaW5lZCBpbiB5b3VyIC9ldGMvc2VsaW51eC9jb25maWcuCi0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCAxMzE4NWE2Li4yMjA1ZWEyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC0xNzYxLDggKzE3NjEsOCBAQAogewogCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSBhZDsKIAotCWFkLnR5cGUgPSBMU01fQVVESVRfREFUQV9QQVRIOwotCWFkLnUucGF0aCA9IGZpbGUtPmZfcGF0aDsKKwlhZC50eXBlID0gTFNNX0FVRElUX0RBVEFfRklMRTsKKwlhZC51LmZpbGUgPSBmaWxlOwogCXJldHVybiBpbm9kZV9oYXNfcGVybShjcmVkLCBmaWxlX2lub2RlKGZpbGUpLCBhdiwgJmFkKTsKIH0KIApAQCAtMTc4NCw4ICsxNzg0LDggQEAKIAl1MzIgc2lkID0gY3JlZF9zaWQoY3JlZCk7CiAJaW50IHJjOwogCi0JYWQudHlwZSA9IExTTV9BVURJVF9EQVRBX1BBVEg7Ci0JYWQudS5wYXRoID0gZmlsZS0+Zl9wYXRoOworCWFkLnR5cGUgPSBMU01fQVVESVRfREFUQV9GSUxFOworCWFkLnUuZmlsZSA9IGZpbGU7CiAKIAlpZiAoc2lkICE9IGZzZWMtPnNpZCkgewogCQlyYyA9IGF2Y19oYXNfcGVybShzaWQsIGZzZWMtPnNpZCwKQEAgLTE4MDgsMTMgKzE4MDgsMTMgQEAKIC8qCiAgKiBEZXRlcm1pbmUgdGhlIGxhYmVsIGZvciBhbiBpbm9kZSB0aGF0IG1pZ2h0IGJlIHVuaW9uZWQuCiAgKi8KLXN0YXRpYyBpbnQgc2VsaW51eF9kZXRlcm1pbmVfaW5vZGVfbGFiZWwoc3RydWN0IGlub2RlICpkaXIsCi0JCQkJCSBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKLQkJCQkJIHUxNiB0Y2xhc3MsCi0JCQkJCSB1MzIgKl9uZXdfaXNpZCkKK3N0YXRpYyBpbnQKK3NlbGludXhfZGV0ZXJtaW5lX2lub2RlX2xhYmVsKGNvbnN0IHN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYywKKwkJCQkgc3RydWN0IGlub2RlICpkaXIsCisJCQkJIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLCB1MTYgdGNsYXNzLAorCQkJCSB1MzIgKl9uZXdfaXNpZCkKIHsKIAljb25zdCBzdHJ1Y3Qgc3VwZXJibG9ja19zZWN1cml0eV9zdHJ1Y3QgKnNic2VjID0gZGlyLT5pX3NiLT5zX3NlY3VyaXR5OwotCWNvbnN0IHN0cnVjdCB0YXNrX3NlY3VyaXR5X3N0cnVjdCAqdHNlYyA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKIAogCWlmICgoc2JzZWMtPmZsYWdzICYgU0VfU0JJTklUSUFMSVpFRCkgJiYKIAkgICAgKHNic2VjLT5iZWhhdmlvciA9PSBTRUNVUklUWV9GU19VU0VfTU5UUE9JTlQpKSB7CkBAIC0xODU3LDggKzE4NTcsOCBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBzZWxpbnV4X2RldGVybWluZV9pbm9kZV9sYWJlbChkaXIsICZkZW50cnktPmRfbmFtZSwgdGNsYXNzLAotCQkJCQkgICAmbmV3c2lkKTsKKwlyYyA9IHNlbGludXhfZGV0ZXJtaW5lX2lub2RlX2xhYmVsKGN1cnJlbnRfc2VjdXJpdHkoKSwgZGlyLAorCQkJCQkgICAmZGVudHJ5LT5kX25hbWUsIHRjbGFzcywgJm5ld3NpZCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTIzNjUsOCArMjM2NSw4IEBACiAJCQluZXdfdHNlYy0+c2lkID0gb2xkX3RzZWMtPnNpZDsKIAl9CiAKLQlhZC50eXBlID0gTFNNX0FVRElUX0RBVEFfUEFUSDsKLQlhZC51LnBhdGggPSBicHJtLT5maWxlLT5mX3BhdGg7CisJYWQudHlwZSA9IExTTV9BVURJVF9EQVRBX0ZJTEU7CisJYWQudS5maWxlID0gYnBybS0+ZmlsZTsKIAogCWlmIChuZXdfdHNlYy0+c2lkID09IG9sZF90c2VjLT5zaWQpIHsKIAkJcmMgPSBhdmNfaGFzX3Blcm0ob2xkX3RzZWMtPnNpZCwgaXNlYy0+c2lkLApAQCAtMjgzOCw3ICsyODM4LDggQEAKIAl1MzIgbmV3c2lkOwogCWludCByYzsKIAotCXJjID0gc2VsaW51eF9kZXRlcm1pbmVfaW5vZGVfbGFiZWwoZF9pbm9kZShkZW50cnktPmRfcGFyZW50KSwgbmFtZSwKKwlyYyA9IHNlbGludXhfZGV0ZXJtaW5lX2lub2RlX2xhYmVsKGN1cnJlbnRfc2VjdXJpdHkoKSwKKwkJCQkJICAgZF9pbm9kZShkZW50cnktPmRfcGFyZW50KSwgbmFtZSwKIAkJCQkJICAgaW5vZGVfbW9kZV90b19zZWN1cml0eV9jbGFzcyhtb2RlKSwKIAkJCQkJICAgJm5ld3NpZCk7CiAJaWYgKHJjKQpAQCAtMjg0Nyw2ICsyODQ4LDI3IEBACiAJcmV0dXJuIHNlY3VyaXR5X3NpZF90b19jb250ZXh0KG5ld3NpZCwgKGNoYXIgKiopY3R4LCBjdHhsZW4pOwogfQogCitzdGF0aWMgaW50IHNlbGludXhfZGVudHJ5X2NyZWF0ZV9maWxlc19hcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkJCQkgIHN0cnVjdCBxc3RyICpuYW1lLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBjcmVkICpvbGQsCisJCQkJCSAgc3RydWN0IGNyZWQgKm5ldykKK3sKKwl1MzIgbmV3c2lkOworCWludCByYzsKKwlzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWM7CisKKwlyYyA9IHNlbGludXhfZGV0ZXJtaW5lX2lub2RlX2xhYmVsKG9sZC0+c2VjdXJpdHksCisJCQkJCSAgIGRfaW5vZGUoZGVudHJ5LT5kX3BhcmVudCksIG5hbWUsCisJCQkJCSAgIGlub2RlX21vZGVfdG9fc2VjdXJpdHlfY2xhc3MobW9kZSksCisJCQkJCSAgICZuZXdzaWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJdHNlYyA9IG5ldy0+c2VjdXJpdHk7CisJdHNlYy0+Y3JlYXRlX3NpZCA9IG5ld3NpZDsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzZWxpbnV4X2lub2RlX2luaXRfc2VjdXJpdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsCiAJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBxc3RyICpxc3RyLAogCQkJCSAgICAgICBjb25zdCBjaGFyICoqbmFtZSwKQEAgLTI4NjMsNyArMjg4NSw3IEBACiAJc2lkID0gdHNlYy0+c2lkOwogCW5ld3NpZCA9IHRzZWMtPmNyZWF0ZV9zaWQ7CiAKLQlyYyA9IHNlbGludXhfZGV0ZXJtaW5lX2lub2RlX2xhYmVsKAorCXJjID0gc2VsaW51eF9kZXRlcm1pbmVfaW5vZGVfbGFiZWwoY3VycmVudF9zZWN1cml0eSgpLAogCQlkaXIsIHFzdHIsCiAJCWlub2RlX21vZGVfdG9fc2VjdXJpdHlfY2xhc3MoaW5vZGUtPmlfbW9kZSksCiAJCSZuZXdzaWQpOwpAQCAtMzI5Myw2ICszMzE1LDQxIEBACiAJKnNlY2lkID0gaXNlYy0+c2lkOwogfQogCitzdGF0aWMgaW50IHNlbGludXhfaW5vZGVfY29weV91cChzdHJ1Y3QgZGVudHJ5ICpzcmMsIHN0cnVjdCBjcmVkICoqbmV3KQoreworCXUzMiBzaWQ7CisJc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjOworCXN0cnVjdCBjcmVkICpuZXdfY3JlZHMgPSAqbmV3OworCisJaWYgKG5ld19jcmVkcyA9PSBOVUxMKSB7CisJCW5ld19jcmVkcyA9IHByZXBhcmVfY3JlZHMoKTsKKwkJaWYgKCFuZXdfY3JlZHMpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0c2VjID0gbmV3X2NyZWRzLT5zZWN1cml0eTsKKwkvKiBHZXQgbGFiZWwgZnJvbSBvdmVybGF5IGlub2RlIGFuZCBzZXQgaXQgaW4gY3JlYXRlX3NpZCAqLworCXNlbGludXhfaW5vZGVfZ2V0c2VjaWQoZF9pbm9kZShzcmMpLCAmc2lkKTsKKwl0c2VjLT5jcmVhdGVfc2lkID0gc2lkOworCSpuZXcgPSBuZXdfY3JlZHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2VsaW51eF9pbm9kZV9jb3B5X3VwX3hhdHRyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJLyogVGhlIGNvcHlfdXAgaG9vayBhYm92ZSBzZXRzIHRoZSBpbml0aWFsIGNvbnRleHQgb24gYW4gaW5vZGUsIGJ1dCB3ZQorCSAqIGRvbid0IHRoZW4gd2FudCB0byBvdmVyd3JpdGUgaXQgYnkgYmxpbmRseSBjb3B5aW5nIGFsbCB0aGUgbG93ZXIKKwkgKiB4YXR0cnMgdXAuICBJbnN0ZWFkLCB3ZSBoYXZlIHRvIGZpbHRlciBvdXQgU0VMaW51eC1yZWxhdGVkIHhhdHRycy4KKwkgKi8KKwlpZiAoc3RyY21wKG5hbWUsIFhBVFRSX05BTUVfU0VMSU5VWCkgPT0gMCkKKwkJcmV0dXJuIDE7IC8qIERpc2NhcmQgKi8KKwkvKgorCSAqIEFueSBvdGhlciBhdHRyaWJ1dGUgYXBhcnQgZnJvbSBTRUxJTlVYIGlzIG5vdCBjbGFpbWVkLCBzdXBwb3J0ZWQKKwkgKiBieSBzZWxpbnV4LgorCSAqLworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKwogLyogZmlsZSBzZWN1cml0eSBvcGVyYXRpb25zICovCiAKIHN0YXRpYyBpbnQgc2VsaW51eF9yZXZhbGlkYXRlX2ZpbGVfcGVybWlzc2lvbihzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG1hc2spCkBAIC0zNzc2LDggKzM4MzMsOCBAQAogCiAJLyogZmluaXRfbW9kdWxlICovCiAKLQlhZC50eXBlID0gTFNNX0FVRElUX0RBVEFfUEFUSDsKLQlhZC51LnBhdGggPSBmaWxlLT5mX3BhdGg7CisJYWQudHlwZSA9IExTTV9BVURJVF9EQVRBX0ZJTEU7CisJYWQudS5maWxlID0gZmlsZTsKIAogCWZzZWMgPSBmaWxlLT5mX3NlY3VyaXR5OwogCWlmIChzaWQgIT0gZnNlYy0+c2lkKSB7CkBAIC0zOTg0LDcgKzQwNDEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCiAvKiBSZXR1cm5zIGVycm9yIG9ubHkgaWYgdW5hYmxlIHRvIHBhcnNlIGFkZHJlc3NlcyAqLwogc3RhdGljIGludCBzZWxpbnV4X3BhcnNlX3NrYl9pcHY2KHN0cnVjdCBza19idWZmICpza2IsCkBAIC00MDc1LDcgKzQxMzIsNyBAQAogCQkJCSAgICAgICAmYWQtPnUubmV0LT52NGluZm8uZGFkZHIpOwogCQlnb3RvIG9rYXk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgUEZfSU5FVDY6CiAJCXJldCA9IHNlbGludXhfcGFyc2Vfc2tiX2lwdjYoc2tiLCBhZCwgcHJvdG8pOwogCQlpZiAocmV0KQpAQCAtNTAyOSw3ICs1MDg2LDcgQEAKIAlyZXR1cm4gc2VsaW51eF9pcF9mb3J3YXJkKHNrYiwgc3RhdGUtPmluLCBQRl9JTkVUKTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgdW5zaWduZWQgaW50IHNlbGludXhfaXB2Nl9mb3J3YXJkKHZvaWQgKnByaXYsCiAJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQpAQCAtNTA4Nyw3ICs1MTQ0LDcgQEAKIAlyZXR1cm4gc2VsaW51eF9pcF9vdXRwdXQoc2tiLCBQRl9JTkVUKTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgdW5zaWduZWQgaW50IHNlbGludXhfaXB2Nl9vdXRwdXQodm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQpAQCAtNTI3Myw3ICs1MzMwLDcgQEAKIAlyZXR1cm4gc2VsaW51eF9pcF9wb3N0cm91dGUoc2tiLCBzdGF0ZS0+b3V0LCBQRl9JTkVUKTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgdW5zaWduZWQgaW50IHNlbGludXhfaXB2Nl9wb3N0cm91dGUodm9pZCAqcHJpdiwKIAkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQpAQCAtNjA2Miw2ICs2MTE5LDcgQEAKIAlMU01fSE9PS19JTklUKHNiX3BhcnNlX29wdHNfc3RyLCBzZWxpbnV4X3BhcnNlX29wdHNfc3RyKSwKIAogCUxTTV9IT09LX0lOSVQoZGVudHJ5X2luaXRfc2VjdXJpdHksIHNlbGludXhfZGVudHJ5X2luaXRfc2VjdXJpdHkpLAorCUxTTV9IT09LX0lOSVQoZGVudHJ5X2NyZWF0ZV9maWxlc19hcywgc2VsaW51eF9kZW50cnlfY3JlYXRlX2ZpbGVzX2FzKSwKIAogCUxTTV9IT09LX0lOSVQoaW5vZGVfYWxsb2Nfc2VjdXJpdHksIHNlbGludXhfaW5vZGVfYWxsb2Nfc2VjdXJpdHkpLAogCUxTTV9IT09LX0lOSVQoaW5vZGVfZnJlZV9zZWN1cml0eSwgc2VsaW51eF9pbm9kZV9mcmVlX3NlY3VyaXR5KSwKQEAgLTYwODgsNiArNjE0Niw4IEBACiAJTFNNX0hPT0tfSU5JVChpbm9kZV9zZXRzZWN1cml0eSwgc2VsaW51eF9pbm9kZV9zZXRzZWN1cml0eSksCiAJTFNNX0hPT0tfSU5JVChpbm9kZV9saXN0c2VjdXJpdHksIHNlbGludXhfaW5vZGVfbGlzdHNlY3VyaXR5KSwKIAlMU01fSE9PS19JTklUKGlub2RlX2dldHNlY2lkLCBzZWxpbnV4X2lub2RlX2dldHNlY2lkKSwKKwlMU01fSE9PS19JTklUKGlub2RlX2NvcHlfdXAsIHNlbGludXhfaW5vZGVfY29weV91cCksCisJTFNNX0hPT0tfSU5JVChpbm9kZV9jb3B5X3VwX3hhdHRyLCBzZWxpbnV4X2lub2RlX2NvcHlfdXBfeGF0dHIpLAogCiAJTFNNX0hPT0tfSU5JVChmaWxlX3Blcm1pc3Npb24sIHNlbGludXhfZmlsZV9wZXJtaXNzaW9uKSwKIAlMU01fSE9PS19JTklUKGZpbGVfYWxsb2Nfc2VjdXJpdHksIHNlbGludXhfZmlsZV9hbGxvY19zZWN1cml0eSksCkBAIC02MzE3LDcgKzYzNzcsNyBAQAogCQkuaG9va251bSA9CU5GX0lORVRfTE9DQUxfT1VULAogCQkucHJpb3JpdHkgPQlORl9JUF9QUklfU0VMSU5VWF9GSVJTVCwKIAl9LAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJewogCQkuaG9vayA9CQlzZWxpbnV4X2lwdjZfcG9zdHJvdXRlLAogCQkucGYgPQkJTkZQUk9UT19JUFY2LApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlY3VyaXR5LmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaAppbmRleCAzOGZlYjU1Li4zMDhhMjg2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaApAQCAtMzksMTEgKzM5LDcgQEAKIAogLyogUmFuZ2Ugb2YgcG9saWN5IHZlcnNpb25zIHdlIHVuZGVyc3RhbmQqLwogI2RlZmluZSBQT0xJQ1lEQl9WRVJTSU9OX01JTiAgIFBPTElDWURCX1ZFUlNJT05fQkFTRQotI2lmZGVmIENPTkZJR19TRUNVUklUWV9TRUxJTlVYX1BPTElDWURCX1ZFUlNJT05fTUFYCi0jZGVmaW5lIFBPTElDWURCX1ZFUlNJT05fTUFYCUNPTkZJR19TRUNVUklUWV9TRUxJTlVYX1BPTElDWURCX1ZFUlNJT05fTUFYX1ZBTFVFCi0jZWxzZQogI2RlZmluZSBQT0xJQ1lEQl9WRVJTSU9OX01BWAlQT0xJQ1lEQl9WRVJTSU9OX1hQRVJNU19JT0NUTAotI2VuZGlmCiAKIC8qIE1hc2sgZm9yIGp1c3QgdGhlIG1vdW50IHJlbGF0ZWQgZmxhZ3MgKi8KICNkZWZpbmUgU0VfTU5UTUFTSwkweDBmCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2NvbmRpdGlvbmFsLmMKaW5kZXggNDU2ZTFhOS4uMzRhZmVhZCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9jb25kaXRpb25hbC5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvY29uZGl0aW9uYWwuYwpAQCAtMjQyLDYgKzI0Miw4IEBACiAJCWdvdG8gZXJyOwogCiAJbGVuID0gbGUzMl90b19jcHUoYnVmWzJdKTsKKwlpZiAoKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAodTMyKS0xKSkpCisJCWdvdG8gZXJyOwogCiAJcmMgPSAtRU5PTUVNOwogCWtleSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL2ViaXRtYXAuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jCmluZGV4IDg5NGI2Y2QuLjdkMTBlNWQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvZWJpdG1hcC5jCkBAIC0zNzQsNiArMzc0LDkgQEAKIAkJZ290byBvazsKIAl9CiAKKwlpZiAoZS0+aGlnaGJpdCAmJiAhY291bnQpCisJCWdvdG8gYmFkOworCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJcmMgPSBuZXh0X2VudHJ5KCZzdGFydGJpdCwgZnAsIHNpemVvZih1MzIpKTsKIAkJaWYgKHJjIDwgMCkgewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9wb2xpY3lkYi5jCmluZGV4IDk5MmEzMTUuLmFjZTY4MzggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvcG9saWN5ZGIuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3BvbGljeWRiLmMKQEAgLTU0MSwyMSArNTQxLDIxIEBACiAKIAlyYyA9IC1FTk9NRU07CiAJcC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCA9Ci0JCWttYWxsb2MocC0+cF9jbGFzc2VzLm5wcmltICogc2l6ZW9mKCoocC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCkpLAorCQlremFsbG9jKHAtPnBfY2xhc3Nlcy5ucHJpbSAqIHNpemVvZigqKHAtPmNsYXNzX3ZhbF90b19zdHJ1Y3QpKSwKIAkJCUdGUF9LRVJORUwpOwogCWlmICghcC0+Y2xhc3NfdmFsX3RvX3N0cnVjdCkKIAkJZ290byBvdXQ7CiAKIAlyYyA9IC1FTk9NRU07CiAJcC0+cm9sZV92YWxfdG9fc3RydWN0ID0KLQkJa21hbGxvYyhwLT5wX3JvbGVzLm5wcmltICogc2l6ZW9mKCoocC0+cm9sZV92YWxfdG9fc3RydWN0KSksCisJCWt6YWxsb2MocC0+cF9yb2xlcy5ucHJpbSAqIHNpemVvZigqKHAtPnJvbGVfdmFsX3RvX3N0cnVjdCkpLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFwLT5yb2xlX3ZhbF90b19zdHJ1Y3QpCiAJCWdvdG8gb3V0OwogCiAJcmMgPSAtRU5PTUVNOwogCXAtPnVzZXJfdmFsX3RvX3N0cnVjdCA9Ci0JCWttYWxsb2MocC0+cF91c2Vycy5ucHJpbSAqIHNpemVvZigqKHAtPnVzZXJfdmFsX3RvX3N0cnVjdCkpLAorCQlremFsbG9jKHAtPnBfdXNlcnMubnByaW0gKiBzaXplb2YoKihwLT51c2VyX3ZhbF90b19zdHJ1Y3QpKSwKIAkJCUdGUF9LRVJORUwpOwogCWlmICghcC0+dXNlcl92YWxfdG9fc3RydWN0KQogCQlnb3RvIG91dDsKQEAgLTk2NCw3ICs5NjQsNyBAQAogCQkgKiBSb2xlIG11c3QgYmUgYXV0aG9yaXplZCBmb3IgdGhlIHR5cGUuCiAJCSAqLwogCQlyb2xlID0gcC0+cm9sZV92YWxfdG9fc3RydWN0W2MtPnJvbGUgLSAxXTsKLQkJaWYgKCFlYml0bWFwX2dldF9iaXQoJnJvbGUtPnR5cGVzLCBjLT50eXBlIC0gMSkpCisJCWlmICghcm9sZSB8fCAhZWJpdG1hcF9nZXRfYml0KCZyb2xlLT50eXBlcywgYy0+dHlwZSAtIDEpKQogCQkJLyogcm9sZSBtYXkgbm90IGJlIGFzc29jaWF0ZWQgd2l0aCB0eXBlICovCiAJCQlyZXR1cm4gMDsKIApAQCAtMTA5NCw2ICsxMDk0LDkgQEAKIAlpbnQgcmM7CiAJY2hhciAqc3RyOwogCisJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAodTMyKS0xKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzdHIgPSBrbWFsbG9jKGxlbiArIDEsIGZsYWdzKTsKIAlpZiAoIXN0cikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yNDE0LDYgKzI0MTcsNyBAQAogCQl9IGVsc2UKIAkJCXRyLT50Y2xhc3MgPSBwLT5wcm9jZXNzX2NsYXNzOwogCisJCXJjID0gLUVJTlZBTDsKIAkJaWYgKCFwb2xpY3lkYl9yb2xlX2lzdmFsaWQocCwgdHItPnJvbGUpIHx8CiAJCSAgICAhcG9saWN5ZGJfdHlwZV9pc3ZhbGlkKHAsIHRyLT50eXBlKSB8fAogCQkgICAgIXBvbGljeWRiX2NsYXNzX2lzdmFsaWQocCwgdHItPnRjbGFzcykgfHwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL0tjb25maWcgYi9zZWN1cml0eS9zbWFjay9LY29uZmlnCmluZGV4IDI3MWFkYWUuLjkyM2IxMjAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL0tjb25maWcKKysrIGIvc2VjdXJpdHkvc21hY2svS2NvbmZpZwpAQCAtNDAsMyArNDAsMTUgQEAKIAkgIFRoaXMgZW5hYmxlcyBzZWN1cml0eSBtYXJraW5nIG9mIG5ldHdvcmsgcGFja2V0cyB1c2luZwogCSAgU21hY2sgbGFiZWxzLgogCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBhbnN3ZXIgTi4KKworY29uZmlnIFNFQ1VSSVRZX1NNQUNLX0FQUEVORF9TSUdOQUxTCisJYm9vbCAiVHJlYXQgZGVsaXZlcmluZyBzaWduYWxzIGFzIGFuIGFwcGVuZCBvcGVyYXRpb24iCisJZGVwZW5kcyBvbiBTRUNVUklUWV9TTUFDSworCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNlbmRpbmcgYSBzaWduYWwgaGFzIGJlZW4gdHJlYXRlZCBhcyBhIHdyaXRlIG9wZXJhdGlvbiB0byB0aGUKKwkgIHJlY2VpdmluZyBwcm9jZXNzLiBJZiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZCwgdGhlIGRlbGl2ZXJ5CisJICB3aWxsIGJlIGFuIGFwcGVuZCBvcGVyYXRpb24gaW5zdGVhZC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZQorCSAgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGRlbGl2ZXJpbmcgYSBuZXR3b3JrIHBhY2tldCBhbmQKKwkgIGRlbGl2ZXJpbmcgYSBzaWduYWwgaW4gdGhlIFNtYWNrIHJ1bGVzLgorCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBhbnN3ZXIgTi4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmggYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCmluZGV4IDI2ZTU4ZjEuLjUxZmQzMDEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2suaApAQCAtMjU2LDYgKzI1NiwxNiBAQAogI2RlZmluZSBNQVlfTE9DSwkweDAwMDAyMDAwCS8qIExvY2tzIHNob3VsZCBiZSB3cml0ZXMsIGJ1dCAuLi4gKi8KICNkZWZpbmUgTUFZX0JSSU5HVVAJMHgwMDAwNDAwMAkvKiBSZXBvcnQgdXNlIG9mIHRoaXMgcnVsZSAqLwogCisvKgorICogVGhlIHBvbGljeSBmb3IgZGVsaXZlcmluZyBzaWduYWxzIGlzIGNvbmZpZ3VyYWJsZS4KKyAqIEl0IGlzIHVzdWFsbHkgIndyaXRlIiwgYnV0IGNhbiBiZSAiYXBwZW5kIi4KKyAqLworI2lmZGVmIENPTkZJR19TRUNVUklUWV9TTUFDS19BUFBFTkRfU0lHTkFMUworI2RlZmluZSBNQVlfREVMSVZFUglNQVlfQVBQRU5ECS8qIFNpZ25hbCBkZWxpdmVyeSByZXF1aXJlcyBhcHBlbmQgKi8KKyNlbHNlCisjZGVmaW5lIE1BWV9ERUxJVkVSCU1BWV9XUklURQkvKiBTaWduYWwgZGVsaXZlcnkgcmVxdWlyZXMgd3JpdGUgKi8KKyNlbmRpZgorCiAjZGVmaW5lIFNNQUNLX0JSSU5HVVBfQUxMT1cJCTEJLyogQWxsb3cgYnJpbmd1cCBtb2RlICovCiAjZGVmaW5lIFNNQUNLX1VOQ09ORklORURfU1VCSkVDVAkyCS8qIEFsbG93IHVuY29uZmluZWQgbGFiZWwgKi8KICNkZWZpbmUgU01BQ0tfVU5DT05GSU5FRF9PQkpFQ1QJCTMJLyogQWxsb3cgdW5jb25maW5lZCBsYWJlbCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMgYi9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYwppbmRleCA4N2E5NzQxLi5jYWVjMjI1IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYwpAQCAtMTg1NywxNCArMTg1NywxNCBAQAogCiAJLyogd2UgZG9uJ3QgbG9nIGhlcmUgYXMgcmMgY2FuIGJlIG92ZXJyaWRlbiAqLwogCXNrcCA9IGZpbGUtPmZfc2VjdXJpdHk7Ci0JcmMgPSBzbWtfYWNjZXNzKHNrcCwgdGtwLCBNQVlfV1JJVEUsIE5VTEwpOwotCXJjID0gc21rX2J1X25vdGUoInNpZ2lvdGFzayIsIHNrcCwgdGtwLCBNQVlfV1JJVEUsIHJjKTsKKwlyYyA9IHNta19hY2Nlc3Moc2twLCB0a3AsIE1BWV9ERUxJVkVSLCBOVUxMKTsKKwlyYyA9IHNta19idV9ub3RlKCJzaWdpb3Rhc2siLCBza3AsIHRrcCwgTUFZX0RFTElWRVIsIHJjKTsKIAlpZiAocmMgIT0gMCAmJiBoYXNfY2FwYWJpbGl0eSh0c2ssIENBUF9NQUNfT1ZFUlJJREUpKQogCQlyYyA9IDA7CiAKIAlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9UQVNLKTsKIAlzbWtfYWRfc2V0ZmllbGRfdV90c2soJmFkLCB0c2spOwotCXNtYWNrX2xvZyhza3AtPnNta19rbm93biwgdGtwLT5zbWtfa25vd24sIE1BWV9XUklURSwgcmMsICZhZCk7CisJc21hY2tfbG9nKHNrcC0+c21rX2tub3duLCB0a3AtPnNta19rbm93biwgTUFZX0RFTElWRVIsIHJjLCAmYWQpOwogCXJldHVybiByYzsKIH0KIApAQCAtMjI2NSw4ICsyMjY1LDggQEAKIAkgKiBjYW4gd3JpdGUgdGhlIHJlY2VpdmVyLgogCSAqLwogCWlmIChzZWNpZCA9PSAwKSB7Ci0JCXJjID0gc21rX2N1cmFjYyh0a3AsIE1BWV9XUklURSwgJmFkKTsKLQkJcmMgPSBzbWtfYnVfdGFzayhwLCBNQVlfV1JJVEUsIHJjKTsKKwkJcmMgPSBzbWtfY3VyYWNjKHRrcCwgTUFZX0RFTElWRVIsICZhZCk7CisJCXJjID0gc21rX2J1X3Rhc2socCwgTUFZX0RFTElWRVIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIAkvKgpAQCAtMjI3NSw4ICsyMjc1LDggQEAKIAkgKiB3ZSBjYW4ndCB0YWtlIHByaXZpbGVnZSBpbnRvIGFjY291bnQuCiAJICovCiAJc2twID0gc21hY2tfZnJvbV9zZWNpZChzZWNpZCk7Ci0JcmMgPSBzbWtfYWNjZXNzKHNrcCwgdGtwLCBNQVlfV1JJVEUsICZhZCk7Ci0JcmMgPSBzbWtfYnVfbm90ZSgiVVNCIHNpZ25hbCIsIHNrcCwgdGtwLCBNQVlfV1JJVEUsIHJjKTsKKwlyYyA9IHNta19hY2Nlc3Moc2twLCB0a3AsIE1BWV9ERUxJVkVSLCAmYWQpOworCXJjID0gc21rX2J1X25vdGUoIlVTQiBzaWduYWwiLCBza3AsIHRrcCwgTUFZX0RFTElWRVIsIHJjKTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX25ldGZpbHRlci5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbmV0ZmlsdGVyLmMKaW5kZXggYWE2YmYxYi4uMjA1Yjc4NSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tfbmV0ZmlsdGVyLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbmV0ZmlsdGVyLmMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxuZXQvaW5ldF9zb2NrLmg+CiAjaW5jbHVkZSAic21hY2suaCIKIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc21hY2tfaXB2Nl9vdXRwdXQodm9pZCAqcHJpdiwKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTY0LDcgKzY0LDcgQEAKIAkJLmhvb2tudW0gPQlORl9JTkVUX0xPQ0FMX09VVCwKIAkJLnByaW9yaXR5ID0JTkZfSVBfUFJJX1NFTElOVVhfRklSU1QsCiAJfSwKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCXsKIAkJLmhvb2sgPQkJc21hY2tfaXB2Nl9vdXRwdXQsCiAJCS5wZiA9CQlORlBST1RPX0lQVjYsCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMgYi9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKaW5kZXggZTI0OWE2Ni4uNjQ5MmZlOSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCisrKyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYwpAQCAtMjUyMywxNCArMjUyMyw5IEBACiAJaWYgKGNvdW50ID09IDAgfHwgY291bnQgPiBTTUtfTE9OR0xBQkVMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRhdGEgPSBremFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBidWYsIGNvdW50KSAhPSAwKSB7Ci0JCXJjID0gLUVGQVVMVDsKLQkJZ290byBvdXRfZGF0YTsKLQl9CisJZGF0YSA9IG1lbWR1cF91c2VyKGJ1ZiwgY291bnQpOworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOwogCiAJY3AgPSBzbWtfcGFyc2Vfc21hY2soZGF0YSwgY291bnQpOwogCWlmIChJU19FUlIoY3ApKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29yZS9ncGlvLWZlYXR1cmUuYyBiL3NvdW5kL2FvYS9jb3JlL2dwaW8tZmVhdHVyZS5jCmluZGV4IGYzNDE1MzkuLjcxOTYwMDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2FvYS9jb3JlL2dwaW8tZmVhdHVyZS5jCisrKyBiL3NvdW5kL2FvYS9jb3JlL2dwaW8tZmVhdHVyZS5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAlpZiAobnApCiAJCSppcnFwdHIgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChucCwgMCk7CiAJZWxzZQotCQkqaXJxcHRyID0gTk9fSVJROworCQkqaXJxcHRyID0gMDsKIH0KIAogLyogMHg0IGlzIG91dGVuYWJsZSwgMHgxIGlzIG91dCwgdGh1cyA0IG9yIDUgKi8KQEAgLTMzNiw3ICszMzYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoaXJxID09IE5PX0lSUSkKKwlpZiAoIWlycSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAltdXRleF9sb2NrKCZub3RpZi0+bXV0ZXgpOwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2ZhYnJpY3MvbGF5b3V0LmMgYi9zb3VuZC9hb2EvZmFicmljcy9sYXlvdXQuYwppbmRleCA4ZjcxZjdlLi5hMGM0YTVkIDEwMDY0NAotLS0gYS9zb3VuZC9hb2EvZmFicmljcy9sYXlvdXQuYworKysgYi9zb3VuZC9hb2EvZmFicmljcy9sYXlvdXQuYwpAQCAtMTEyLDYgKzExMiw3IEBACiAKIE1PRFVMRV9BTElBUygiYW9hLWRldmljZS1pZC0xNCIpOwogTU9EVUxFX0FMSUFTKCJhb2EtZGV2aWNlLWlkLTIyIik7CitNT0RVTEVfQUxJQVMoImFvYS1kZXZpY2UtaWQtMzEiKTsKIE1PRFVMRV9BTElBUygiYW9hLWRldmljZS1pZC0zNSIpOwogTU9EVUxFX0FMSUFTKCJhb2EtZGV2aWNlLWlkLTQ0Iik7CiAKQEAgLTM2Miw2ICszNjMsMTMgQEAKIAkJLmNvbm5lY3Rpb25zID0gdGFzX2Nvbm5lY3Rpb25zX25vbGluZW91dCwKIAkgIH0sCiAJfSwKKwkvKiBQb3dlckJvb2s2LDEgKi8KKwl7IC5kZXZpY2VfaWQgPSAzMSwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gInRhcyIsCisJCS5jb25uZWN0aW9ucyA9IHRhc19jb25uZWN0aW9uc19ub2xpbmVvdXQsCisJICB9LAorCX0sCiAJLyogUG93ZXJCb29rNiw1ICovCiAJeyAuZGV2aWNlX2lkID0gNDQsCiAJICAuY29kZWNzWzBdID0gewpAQCAtMTE2MSwxMiArMTE2OSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFvYV9mYWJyaWNfbGF5b3V0X2luaXQodm9pZCkKIHsKLQlpbnQgZXJyOwotCi0JZXJyID0gc291bmRidXNfcmVnaXN0ZXJfZHJpdmVyKCZhb2Ffc291bmRidXNfZHJpdmVyKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCXJldHVybiAwOworCXJldHVybiBzb3VuZGJ1c19yZWdpc3Rlcl9kcml2ZXIoJmFvYV9zb3VuZGJ1c19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYW9hX2ZhYnJpY19sYXlvdXRfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9jb3JlLmMgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2NvcmUuYwppbmRleCAxY2JmMjEwLi4wMDBiNTg1IDEwMDY0NAotLS0gYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2NvcmUuYworKysgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2NvcmUuYwpAQCAtMTk3LDcgKzE5Nyw3IEBACiAJCQkgKiBzbyByZXN0cmljdCB0byB0aG9zZSB3ZSBkbyBoYW5kbGUgZm9yIG5vdy4KIAkJCSAqLwogCQkJaWYgKGlkICYmICgqaWQgPT0gMjIgfHwgKmlkID09IDE0IHx8ICppZCA9PSAzNSB8fAotCQkJCSAgICppZCA9PSA0NCkpIHsKKwkJCQkgICAqaWQgPT0gMzEgfHwgKmlkID09IDQ0KSkgewogCQkJCXNucHJpbnRmKGRldi0+c291bmQubW9kYWxpYXMsIDMyLAogCQkJCQkgImFvYS1kZXZpY2UtaWQtJWQiLCAqaWQpOwogCQkJCW9rID0gMTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvY29tcHJlc3Nfb2ZmbG9hZC5jIGIvc291bmQvY29yZS9jb21wcmVzc19vZmZsb2FkLmMKaW5kZXggMmM0OTg0OC4uZmVjMWRmZCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9jb21wcmVzc19vZmZsb2FkLmMKKysrIGIvc291bmQvY29yZS9jb21wcmVzc19vZmZsb2FkLmMKQEAgLTU1MywxMyArNTUzLDkgQEAKIAkJICogd2Ugc2hvdWxkIGFsbG93IHBhcmFtZXRlciBjaGFuZ2Ugb25seSB3aGVuIHN0cmVhbSBoYXMgYmVlbgogCQkgKiBvcGVuZWQgbm90IGluIG90aGVyIGNhc2VzCiAJCSAqLwotCQlwYXJhbXMgPSBrbWFsbG9jKHNpemVvZigqcGFyYW1zKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFyYW1zKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihwYXJhbXMsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKCpwYXJhbXMpKSkgewotCQkJcmV0dmFsID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0OwotCQl9CisJCXBhcmFtcyA9IG1lbWR1cF91c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKCpwYXJhbXMpKTsKKwkJaWYgKElTX0VSUihwYXJhbXMpKQorCQkJcmV0dXJuIFBUUl9FUlIocGFyYW1zKTsKIAogCQlyZXR2YWwgPSBzbmRfY29tcHJlc3NfY2hlY2tfaW5wdXQocGFyYW1zKTsKIAkJaWYgKHJldHZhbCkKQEAgLTc4NCw3ICs3ODAsNyBAQAogCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzdHJlYW0tPnJ1bnRpbWUtPnNsZWVwLAogCQkJKHN0cmVhbS0+cnVudGltZS0+c3RhdGUgIT0gU05EUlZfUENNX1NUQVRFX0RSQUlOSU5HKSk7CiAJaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpCi0JCXByX2RlYnVnKCJ3YWl0IGFib3J0ZWQgYnkgYSBzaWduYWwiKTsKKwkJcHJfZGVidWcoIndhaXQgYWJvcnRlZCBieSBhIHNpZ25hbFxuIik7CiAJZWxzZSBpZiAocmV0KQogCQlwcl9kZWJ1Zygid2FpdCBmb3IgZHJhaW4gZmFpbGVkIHdpdGggJWRcbiIsIHJldCk7CiAKQEAgLTk2Niw3ICs5NjIsNyBAQAogCQkJCSAgY29tcHItPmNhcmQsIGNvbXByLT5kZXZpY2UsCiAJCQkJICAmc25kX2NvbXByX2ZpbGVfb3BzLCBjb21wciwgJmNvbXByLT5kZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByX2Vycigic25kX3JlZ2lzdGVyX2RldmljZSBmYWlsZWRcbiAlZCIsIHJldCk7CisJCXByX2Vycigic25kX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQgJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCmluZGV4IGM2MWZkNTAuLjlkMzNjMWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX25hdGl2ZS5jCkBAIC0yNjM3LDkgKzI2MzcsMTEgQEAKIAkJCWJyZWFrOwogCQkvKiBGYWxsIHRocm91Z2ggKi8KIAljYXNlIFNORFJWX1BDTV9TVEFURV9QUkVQQVJFRDoKLQljYXNlIFNORFJWX1BDTV9TVEFURV9TVVNQRU5ERUQ6CiAJCWVyciA9IDA7CiAJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1NUQVRFX1NVU1BFTkRFRDoKKwkJZXJyID0gLUVTVFJQSVBFOworCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9TVEFURV9YUlVOOgogCQllcnIgPSAtRVBJUEU7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9yYXdtaWRpLmMgYi9zb3VuZC9jb3JlL3Jhd21pZGkuYwppbmRleCA3OTU0MzdiLi5iNDUwYTI3IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3Jhd21pZGkuYworKysgYi9zb3VuZC9jb3JlL3Jhd21pZGkuYwpAQCAtMTYzMywxMSArMTYzMywxMyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlsaXN0X2FkZF90YWlsKCZybWlkaS0+bGlzdCwgJnNuZF9yYXdtaWRpX2RldmljZXMpOworCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCWVyciA9IHNuZF9yZWdpc3Rlcl9kZXZpY2UoU05EUlZfREVWSUNFX1RZUEVfUkFXTUlESSwKIAkJCQkgIHJtaWRpLT5jYXJkLCBybWlkaS0+ZGV2aWNlLAogCQkJCSAgJnNuZF9yYXdtaWRpX2Zfb3BzLCBybWlkaSwgJnJtaWRpLT5kZXYpOwogCWlmIChlcnIgPCAwKSB7CiAJCXJtaWRpX2VycihybWlkaSwgInVuYWJsZSB0byByZWdpc3RlclxuIik7CisJCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJbGlzdF9kZWwoJnJtaWRpLT5saXN0KTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCXJldHVybiBlcnI7CkBAIC0xNjQ1LDYgKzE2NDcsNyBAQAogCWlmIChybWlkaS0+b3BzICYmIHJtaWRpLT5vcHMtPmRldl9yZWdpc3RlciAmJgogCSAgICAoZXJyID0gcm1pZGktPm9wcy0+ZGV2X3JlZ2lzdGVyKHJtaWRpKSkgPCAwKSB7CiAJCXNuZF91bnJlZ2lzdGVyX2RldmljZSgmcm1pZGktPmRldik7CisJCW11dGV4X2xvY2soJnJlZ2lzdGVyX211dGV4KTsKIAkJbGlzdF9kZWwoJnJtaWRpLT5saXN0KTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJCXJldHVybiBlcnI7CkBAIC0xNjc3LDcgKzE2ODAsNiBAQAogCQl9CiAJfQogI2VuZGlmIC8qIENPTkZJR19TTkRfT1NTRU1VTCAqLwotCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCXNwcmludGYobmFtZSwgIm1pZGklZCIsIHJtaWRpLT5kZXZpY2UpOwogCWVudHJ5ID0gc25kX2luZm9fY3JlYXRlX2NhcmRfZW50cnkocm1pZGktPmNhcmQsIG5hbWUsIHJtaWRpLT5jYXJkLT5wcm9jX3Jvb3QpOwogCWlmIChlbnRyeSkgewpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCmluZGV4IGQ2ZDk0MTkuLjRjOTM1MjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKQEAgLTg3LDIxICs4Nyw2IEBACiAKIC8qCiAgKi8KLSAKLXN0YXRpYyBpbmxpbmUgbW1fc2VnbWVudF90IHNuZF9lbnRlcl91c2VyKHZvaWQpCi17Ci0JbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7Ci0Jc2V0X2ZzKGdldF9kcygpKTsKLQlyZXR1cm4gZnM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfbGVhdmVfdXNlcihtbV9zZWdtZW50X3QgZnMpCi17Ci0Jc2V0X2ZzKGZzKTsKLX0KLQotLyoKLSAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBzbmRfc2VxX2ZpbGVfZmxhZ3Moc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAgICAgICAgIHN3aXRjaCAoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpIHsKQEAgLTExMjgsNTkgKzExMTMsNjkgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9wdmVyc2lvbihzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAqYXJnKQoreworCWludCAqcHZlcnNpb24gPSBhcmc7CisKKwkqcHZlcnNpb24gPSBTTkRSVl9TRVFfVkVSU0lPTjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2NsaWVudF9pZChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAqYXJnKQoreworCWludCAqY2xpZW50X2lkID0gYXJnOworCisJKmNsaWVudF9pZCA9IGNsaWVudC0+bnVtYmVyOworCXJldHVybiAwOworfQogCiAvKiBTWVNURU1fSU5GTyBpb2N0bCgpICovCi1zdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfc3lzdGVtX2luZm8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfc3lzdGVtX2luZm8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9zeXN0ZW1faW5mbyBpbmZvOworCXN0cnVjdCBzbmRfc2VxX3N5c3RlbV9pbmZvICppbmZvID0gYXJnOwogCi0JbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKIAkvKiBmaWxsIHRoZSBpbmZvIGZpZWxkcyAqLwotCWluZm8ucXVldWVzID0gU05EUlZfU0VRX01BWF9RVUVVRVM7Ci0JaW5mby5jbGllbnRzID0gU05EUlZfU0VRX01BWF9DTElFTlRTOwotCWluZm8ucG9ydHMgPSBTTkRSVl9TRVFfTUFYX1BPUlRTOwotCWluZm8uY2hhbm5lbHMgPSAyNTY7CS8qIGZpeGVkIGxpbWl0ICovCi0JaW5mby5jdXJfY2xpZW50cyA9IGNsaWVudF91c2FnZS5jdXI7Ci0JaW5mby5jdXJfcXVldWVzID0gc25kX3NlcV9xdWV1ZV9nZXRfY3VyX3F1ZXVlcygpOworCWluZm8tPnF1ZXVlcyA9IFNORFJWX1NFUV9NQVhfUVVFVUVTOworCWluZm8tPmNsaWVudHMgPSBTTkRSVl9TRVFfTUFYX0NMSUVOVFM7CisJaW5mby0+cG9ydHMgPSBTTkRSVl9TRVFfTUFYX1BPUlRTOworCWluZm8tPmNoYW5uZWxzID0gMjU2OwkvKiBmaXhlZCBsaW1pdCAqLworCWluZm8tPmN1cl9jbGllbnRzID0gY2xpZW50X3VzYWdlLmN1cjsKKwlpbmZvLT5jdXJfcXVldWVzID0gc25kX3NlcV9xdWV1ZV9nZXRfY3VyX3F1ZXVlcygpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIAogCiAvKiBSVU5OSU5HX01PREUgaW9jdGwoKSAqLwotc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3J1bm5pbmdfbW9kZShzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9ydW5uaW5nX21vZGUoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcnVubmluZ19pbmZvIGluZm87CisJc3RydWN0IHNuZF9zZXFfcnVubmluZ19pbmZvICppbmZvID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY3B0cjsKIAlpbnQgZXJyID0gMDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQogCS8qIHJlcXVlc3RlZCBjbGllbnQgbnVtYmVyICovCi0JY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoaW5mby5jbGllbnQpOworCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGluZm8tPmNsaWVudCk7CiAJaWYgKGNwdHIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7CQkvKiBkb24ndCBjaGFuZ2UgISEhICovCiAKICNpZmRlZiBTTkRSVl9CSUdfRU5ESUFOCi0JaWYgKCEgaW5mby5iaWdfZW5kaWFuKSB7CisJaWYgKCFpbmZvLT5iaWdfZW5kaWFuKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX19lcnI7CiAJfQogI2Vsc2UKLQlpZiAoaW5mby5iaWdfZW5kaWFuKSB7CisJaWYgKGluZm8tPmJpZ19lbmRpYW4pIHsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBfX2VycjsKIAl9CiAKICNlbmRpZgotCWlmIChpbmZvLmNwdV9tb2RlID4gc2l6ZW9mKGxvbmcpKSB7CisJaWYgKGluZm8tPmNwdV9tb2RlID4gc2l6ZW9mKGxvbmcpKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gX19lcnI7CiAJfQotCWNwdHItPmNvbnZlcnQzMiA9IChpbmZvLmNwdV9tb2RlIDwgc2l6ZW9mKGxvbmcpKTsKKwljcHRyLT5jb252ZXJ0MzIgPSAoaW5mby0+Y3B1X21vZGUgPCBzaXplb2YobG9uZykpOwogIF9fZXJyOgogCXNuZF9zZXFfY2xpZW50X3VubG9jayhjcHRyKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTIxNCw1MSArMTIwOSw0MyBAQAogfQogCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X2NsaWVudF9pbmZvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfaW5mbyAqY2xpZW50X2luZm8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjcHRyOwotCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9pbmZvIGNsaWVudF9pbmZvOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZjbGllbnRfaW5mbywgYXJnLCBzaXplb2YoY2xpZW50X2luZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkvKiByZXF1ZXN0ZWQgY2xpZW50IG51bWJlciAqLwotCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGNsaWVudF9pbmZvLmNsaWVudCk7CisJY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoY2xpZW50X2luZm8tPmNsaWVudCk7CiAJaWYgKGNwdHIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9FTlQ7CQkvKiBkb24ndCBjaGFuZ2UgISEhICovCiAKLQlnZXRfY2xpZW50X2luZm8oY3B0ciwgJmNsaWVudF9pbmZvKTsKKwlnZXRfY2xpZW50X2luZm8oY3B0ciwgY2xpZW50X2luZm8pOwogCXNuZF9zZXFfY2xpZW50X3VubG9jayhjcHRyKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY2xpZW50X2luZm8sIHNpemVvZihjbGllbnRfaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIAogCiAvKiBDTElFTlRfSU5GTyBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfc2V0X2NsaWVudF9pbmZvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfaW5mbyBjbGllbnRfaW5mbzsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmY2xpZW50X2luZm8sIGFyZywgc2l6ZW9mKGNsaWVudF9pbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOworCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9pbmZvICpjbGllbnRfaW5mbyA9IGFyZzsKIAogCS8qIGl0IGlzIG5vdCBhbGxvd2VkIHRvIHNldCB0aGUgaW5mbyBmaWVsZHMgZm9yIGFuIGFub3RoZXIgY2xpZW50ICovCi0JaWYgKGNsaWVudC0+bnVtYmVyICE9IGNsaWVudF9pbmZvLmNsaWVudCkKKwlpZiAoY2xpZW50LT5udW1iZXIgIT0gY2xpZW50X2luZm8tPmNsaWVudCkKIAkJcmV0dXJuIC1FUEVSTTsKIAkvKiBhbHNvIGNsaWVudCB0eXBlIG11c3QgYmUgc2V0IG5vdyAqLwotCWlmIChjbGllbnQtPnR5cGUgIT0gY2xpZW50X2luZm8udHlwZSkKKwlpZiAoY2xpZW50LT50eXBlICE9IGNsaWVudF9pbmZvLT50eXBlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGZpbGwgdGhlIGluZm8gZmllbGRzICovCi0JaWYgKGNsaWVudF9pbmZvLm5hbWVbMF0pCi0JCXN0cmxjcHkoY2xpZW50LT5uYW1lLCBjbGllbnRfaW5mby5uYW1lLCBzaXplb2YoY2xpZW50LT5uYW1lKSk7CisJaWYgKGNsaWVudF9pbmZvLT5uYW1lWzBdKQorCQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgY2xpZW50X2luZm8tPm5hbWUsIHNpemVvZihjbGllbnQtPm5hbWUpKTsKIAotCWNsaWVudC0+ZmlsdGVyID0gY2xpZW50X2luZm8uZmlsdGVyOwotCWNsaWVudC0+ZXZlbnRfbG9zdCA9IGNsaWVudF9pbmZvLmV2ZW50X2xvc3Q7Ci0JbWVtY3B5KGNsaWVudC0+ZXZlbnRfZmlsdGVyLCBjbGllbnRfaW5mby5ldmVudF9maWx0ZXIsIDMyKTsKKwljbGllbnQtPmZpbHRlciA9IGNsaWVudF9pbmZvLT5maWx0ZXI7CisJY2xpZW50LT5ldmVudF9sb3N0ID0gY2xpZW50X2luZm8tPmV2ZW50X2xvc3Q7CisJbWVtY3B5KGNsaWVudC0+ZXZlbnRfZmlsdGVyLCBjbGllbnRfaW5mby0+ZXZlbnRfZmlsdGVyLCAzMik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyNjcsMzAgKzEyNTQsMjYgQEAKIC8qIAogICogQ1JFQVRFIFBPUlQgaW9jdGwoKSAKICAqLwotc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2NyZWF0ZV9wb3J0KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICAgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9jcmVhdGVfcG9ydChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyAqaW5mbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqcG9ydDsKLQlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gaW5mbzsKIAlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2NhbGxiYWNrICpjYWxsYmFjazsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQogCS8qIGl0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSB0aGUgcG9ydCBmb3IgYW4gYW5vdGhlciBjbGllbnQgKi8KLQlpZiAoaW5mby5hZGRyLmNsaWVudCAhPSBjbGllbnQtPm51bWJlcikKKwlpZiAoaW5mby0+YWRkci5jbGllbnQgIT0gY2xpZW50LT5udW1iZXIpCiAJCXJldHVybiAtRVBFUk07CiAKLQlwb3J0ID0gc25kX3NlcV9jcmVhdGVfcG9ydChjbGllbnQsIChpbmZvLmZsYWdzICYgU05EUlZfU0VRX1BPUlRfRkxHX0dJVkVOX1BPUlQpID8gaW5mby5hZGRyLnBvcnQgOiAtMSk7CisJcG9ydCA9IHNuZF9zZXFfY3JlYXRlX3BvcnQoY2xpZW50LCAoaW5mby0+ZmxhZ3MgJiBTTkRSVl9TRVFfUE9SVF9GTEdfR0lWRU5fUE9SVCkgPyBpbmZvLT5hZGRyLnBvcnQgOiAtMSk7CiAJaWYgKHBvcnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoY2xpZW50LT50eXBlID09IFVTRVJfQ0xJRU5UICYmIGluZm8ua2VybmVsKSB7CisJaWYgKGNsaWVudC0+dHlwZSA9PSBVU0VSX0NMSUVOVCAmJiBpbmZvLT5rZXJuZWwpIHsKIAkJc25kX3NlcV9kZWxldGVfcG9ydChjbGllbnQsIHBvcnQtPmFkZHIucG9ydCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoY2xpZW50LT50eXBlID09IEtFUk5FTF9DTElFTlQpIHsKLQkJaWYgKChjYWxsYmFjayA9IGluZm8ua2VybmVsKSAhPSBOVUxMKSB7CisJCWlmICgoY2FsbGJhY2sgPSBpbmZvLT5rZXJuZWwpICE9IE5VTEwpIHsKIAkJCWlmIChjYWxsYmFjay0+b3duZXIpCiAJCQkJcG9ydC0+b3duZXIgPSBjYWxsYmFjay0+b3duZXI7CiAJCQlwb3J0LT5wcml2YXRlX2RhdGEgPSBjYWxsYmFjay0+cHJpdmF0ZV9kYXRhOwpAQCAtMTMwMywzNyArMTI4NiwyOSBAQAogCQl9CiAJfQogCi0JaW5mby5hZGRyID0gcG9ydC0+YWRkcjsKKwlpbmZvLT5hZGRyID0gcG9ydC0+YWRkcjsKIAotCXNuZF9zZXFfc2V0X3BvcnRfaW5mbyhwb3J0LCAmaW5mbyk7CisJc25kX3NlcV9zZXRfcG9ydF9pbmZvKHBvcnQsIGluZm8pOwogCXNuZF9zZXFfc3lzdGVtX2NsaWVudF9ldl9wb3J0X3N0YXJ0KHBvcnQtPmFkZHIuY2xpZW50LCBwb3J0LT5hZGRyLnBvcnQpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQogCXJldHVybiAwOwogfQogCiAvKiAKICAqIERFTEVURSBQT1JUIGlvY3RsKCkgCiAgKi8KLXN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9kZWxldGVfcG9ydChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZGVsZXRlX3BvcnQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gaW5mbzsKKwlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gKmluZm8gPSBhcmc7CiAJaW50IGVycjsKIAotCS8qIHNldCBwYXNzZWQgcGFyYW1ldGVycyAqLwotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQkKIAkvKiBpdCBpcyBub3QgYWxsb3dlZCB0byByZW1vdmUgdGhlIHBvcnQgZm9yIGFuIGFub3RoZXIgY2xpZW50ICovCi0JaWYgKGluZm8uYWRkci5jbGllbnQgIT0gY2xpZW50LT5udW1iZXIpCisJaWYgKGluZm8tPmFkZHIuY2xpZW50ICE9IGNsaWVudC0+bnVtYmVyKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JZXJyID0gc25kX3NlcV9kZWxldGVfcG9ydChjbGllbnQsIGluZm8uYWRkci5wb3J0KTsKKwllcnIgPSBzbmRfc2VxX2RlbGV0ZV9wb3J0KGNsaWVudCwgaW5mby0+YWRkci5wb3J0KTsKIAlpZiAoZXJyID49IDApCi0JCXNuZF9zZXFfc3lzdGVtX2NsaWVudF9ldl9wb3J0X2V4aXQoY2xpZW50LT5udW1iZXIsIGluZm8uYWRkci5wb3J0KTsKKwkJc25kX3NlcV9zeXN0ZW1fY2xpZW50X2V2X3BvcnRfZXhpdChjbGllbnQtPm51bWJlciwgaW5mby0+YWRkci5wb3J0KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMzQxLDMyICsxMzE2LDI3IEBACiAvKiAKICAqIEdFVF9QT1JUX0lORk8gaW9jdGwoKSAob24gYW55IGNsaWVudCkgCiAgKi8KLXN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfcG9ydF9pbmZvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICAgICB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9wb3J0X2luZm8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gKmluZm8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjcHRyOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwb3J0OwotCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyBpbmZvOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCBhcmcsIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGluZm8uYWRkci5jbGllbnQpOworCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGluZm8tPmFkZHIuY2xpZW50KTsKIAlpZiAoY3B0ciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOwogCi0JcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKGNwdHIsIGluZm8uYWRkci5wb3J0KTsKKwlwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoY3B0ciwgaW5mby0+YWRkci5wb3J0KTsKIAlpZiAocG9ydCA9PSBOVUxMKSB7CiAJCXNuZF9zZXFfY2xpZW50X3VubG9jayhjcHRyKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CQkJLyogZG9uJ3QgY2hhbmdlICovCiAJfQogCiAJLyogZ2V0IHBvcnQgaW5mbyAqLwotCXNuZF9zZXFfZ2V0X3BvcnRfaW5mbyhwb3J0LCAmaW5mbyk7CisJc25kX3NlcV9nZXRfcG9ydF9pbmZvKHBvcnQsIGluZm8pOwogCXNuZF9zZXFfcG9ydF91bmxvY2socG9ydCk7CiAJc25kX3NlcV9jbGllbnRfdW5sb2NrKGNwdHIpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM3NCwyMCArMTM0NCwxNiBAQAogLyogCiAgKiBTRVRfUE9SVF9JTkZPIGlvY3RsKCkgKG9ubHkgcG9ydHMgb24gdGhpcy9vd24gY2xpZW50KSAKICAqLwotc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3NldF9wb3J0X2luZm8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJICAgICAgIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfc2V0X3BvcnRfaW5mbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyAqaW5mbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqcG9ydDsKLQlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gaW5mbzsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChpbmZvLmFkZHIuY2xpZW50ICE9IGNsaWVudC0+bnVtYmVyKSAvKiBvbmx5IHNldCBvdXIgb3duIHBvcnRzICEgKi8KKwlpZiAoaW5mby0+YWRkci5jbGllbnQgIT0gY2xpZW50LT5udW1iZXIpIC8qIG9ubHkgc2V0IG91ciBvd24gcG9ydHMgISAqLwogCQlyZXR1cm4gLUVQRVJNOwotCXBvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihjbGllbnQsIGluZm8uYWRkci5wb3J0KTsKKwlwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoY2xpZW50LCBpbmZvLT5hZGRyLnBvcnQpOwogCWlmIChwb3J0KSB7Ci0JCXNuZF9zZXFfc2V0X3BvcnRfaW5mbyhwb3J0LCAmaW5mbyk7CisJCXNuZF9zZXFfc2V0X3BvcnRfaW5mbyhwb3J0LCBpbmZvKTsKIAkJc25kX3NlcV9wb3J0X3VubG9jayhwb3J0KTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNDUzLDM0ICsxNDE5LDMxIEBACiAgKiBhZGQgdG8gcG9ydCdzIHN1YnNjcmlwdGlvbiBsaXN0IElPQ1RMIGludGVyZmFjZSAKICAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3N1YnNjcmliZV9wb3J0KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQl2b2lkIF9fdXNlciAqYXJnKQorCQkJCQl2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmUgKnN1YnMgPSBhcmc7CiAJaW50IHJlc3VsdCA9IC1FSU5WQUw7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpyZWNlaXZlciA9IE5VTEwsICpzZW5kZXIgPSBOVUxMOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpzcG9ydCA9IE5VTEwsICpkcG9ydCA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmUgc3ViczsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmc3VicywgYXJnLCBzaXplb2Yoc3VicykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmICgocmVjZWl2ZXIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMuZGVzdC5jbGllbnQpKSA9PSBOVUxMKQorCWlmICgocmVjZWl2ZXIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMtPmRlc3QuY2xpZW50KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKLQlpZiAoKHNlbmRlciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy5zZW5kZXIuY2xpZW50KSkgPT0gTlVMTCkKKwlpZiAoKHNlbmRlciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy0+c2VuZGVyLmNsaWVudCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7Ci0JaWYgKChzcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKHNlbmRlciwgc3Vicy5zZW5kZXIucG9ydCkpID09IE5VTEwpCisJaWYgKChzcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKHNlbmRlciwgc3Vicy0+c2VuZGVyLnBvcnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwotCWlmICgoZHBvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihyZWNlaXZlciwgc3Vicy5kZXN0LnBvcnQpKSA9PSBOVUxMKQorCWlmICgoZHBvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihyZWNlaXZlciwgc3Vicy0+ZGVzdC5wb3J0KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKIAotCXJlc3VsdCA9IGNoZWNrX3N1YnNjcmlwdGlvbl9wZXJtaXNzaW9uKGNsaWVudCwgc3BvcnQsIGRwb3J0LCAmc3Vicyk7CisJcmVzdWx0ID0gY2hlY2tfc3Vic2NyaXB0aW9uX3Blcm1pc3Npb24oY2xpZW50LCBzcG9ydCwgZHBvcnQsIHN1YnMpOwogCWlmIChyZXN1bHQgPCAwKQogCQlnb3RvIF9fZW5kOwogCiAJLyogY29ubmVjdCB0aGVtICovCi0JcmVzdWx0ID0gc25kX3NlcV9wb3J0X2Nvbm5lY3QoY2xpZW50LCBzZW5kZXIsIHNwb3J0LCByZWNlaXZlciwgZHBvcnQsICZzdWJzKTsKKwlyZXN1bHQgPSBzbmRfc2VxX3BvcnRfY29ubmVjdChjbGllbnQsIHNlbmRlciwgc3BvcnQsIHJlY2VpdmVyLCBkcG9ydCwgc3Vicyk7CiAJaWYgKCEgcmVzdWx0KSAvKiBicm9hZGNhc3QgYW5ub3VuY2UgKi8KIAkJc25kX3NlcV9jbGllbnRfbm90aWZ5X3N1YnNjcmlwdGlvbihTTkRSVl9TRVFfQUREUkVTU19TVUJTQ1JJQkVSUywgMCwKLQkJCQkJCSAgICZzdWJzLCBTTkRSVl9TRVFfRVZFTlRfUE9SVF9TVUJTQ1JJQkVEKTsKKwkJCQkJCSAgIHN1YnMsIFNORFJWX1NFUV9FVkVOVF9QT1JUX1NVQlNDUklCRUQpOwogICAgICAgX19lbmQ6CiAgICAgICAJaWYgKHNwb3J0KQogCQlzbmRfc2VxX3BvcnRfdW5sb2NrKHNwb3J0KTsKQEAgLTE0OTgsMzMgKzE0NjEsMzAgQEAKICAqIHJlbW92ZSBmcm9tIHBvcnQncyBzdWJzY3JpcHRpb24gbGlzdCAKICAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3Vuc3Vic2NyaWJlX3BvcnQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSAgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJICB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmUgKnN1YnMgPSBhcmc7CiAJaW50IHJlc3VsdCA9IC1FTlhJTzsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKnJlY2VpdmVyID0gTlVMTCwgKnNlbmRlciA9IE5VTEw7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnNwb3J0ID0gTlVMTCwgKmRwb3J0ID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZSBzdWJzOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZzdWJzLCBhcmcsIHNpemVvZihzdWJzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKChyZWNlaXZlciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy5kZXN0LmNsaWVudCkpID09IE5VTEwpCisJaWYgKChyZWNlaXZlciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy0+ZGVzdC5jbGllbnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwotCWlmICgoc2VuZGVyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLnNlbmRlci5jbGllbnQpKSA9PSBOVUxMKQorCWlmICgoc2VuZGVyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLT5zZW5kZXIuY2xpZW50KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKLQlpZiAoKHNwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoc2VuZGVyLCBzdWJzLnNlbmRlci5wb3J0KSkgPT0gTlVMTCkKKwlpZiAoKHNwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoc2VuZGVyLCBzdWJzLT5zZW5kZXIucG9ydCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7Ci0JaWYgKChkcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKHJlY2VpdmVyLCBzdWJzLmRlc3QucG9ydCkpID09IE5VTEwpCisJaWYgKChkcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKHJlY2VpdmVyLCBzdWJzLT5kZXN0LnBvcnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwogCi0JcmVzdWx0ID0gY2hlY2tfc3Vic2NyaXB0aW9uX3Blcm1pc3Npb24oY2xpZW50LCBzcG9ydCwgZHBvcnQsICZzdWJzKTsKKwlyZXN1bHQgPSBjaGVja19zdWJzY3JpcHRpb25fcGVybWlzc2lvbihjbGllbnQsIHNwb3J0LCBkcG9ydCwgc3Vicyk7CiAJaWYgKHJlc3VsdCA8IDApCiAJCWdvdG8gX19lbmQ7CiAKLQlyZXN1bHQgPSBzbmRfc2VxX3BvcnRfZGlzY29ubmVjdChjbGllbnQsIHNlbmRlciwgc3BvcnQsIHJlY2VpdmVyLCBkcG9ydCwgJnN1YnMpOworCXJlc3VsdCA9IHNuZF9zZXFfcG9ydF9kaXNjb25uZWN0KGNsaWVudCwgc2VuZGVyLCBzcG9ydCwgcmVjZWl2ZXIsIGRwb3J0LCBzdWJzKTsKIAlpZiAoISByZXN1bHQpIC8qIGJyb2FkY2FzdCBhbm5vdW5jZSAqLwogCQlzbmRfc2VxX2NsaWVudF9ub3RpZnlfc3Vic2NyaXB0aW9uKFNORFJWX1NFUV9BRERSRVNTX1NVQlNDUklCRVJTLCAwLAotCQkJCQkJICAgJnN1YnMsIFNORFJWX1NFUV9FVkVOVF9QT1JUX1VOU1VCU0NSSUJFRCk7CisJCQkJCQkgICBzdWJzLCBTTkRSVl9TRVFfRVZFTlRfUE9SVF9VTlNVQlNDUklCRUQpOwogICAgICAgX19lbmQ6CiAgICAgICAJaWYgKHNwb3J0KQogCQlzbmRfc2VxX3BvcnRfdW5sb2NrKHNwb3J0KTsKQEAgLTE1MzksMTcgKzE0OTksMTMgQEAKIAogCiAvKiBDUkVBVEVfUVVFVUUgaW9jdGwoKSAqLwotc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2NyZWF0ZV9xdWV1ZShzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgICB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2NyZWF0ZV9xdWV1ZShzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8gaW5mbzsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvICppbmZvID0gYXJnOwogCWludCByZXN1bHQ7CiAJc3RydWN0IHNuZF9zZXFfcXVldWUgKnE7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXN1bHQgPSBzbmRfc2VxX3F1ZXVlX2FsbG9jKGNsaWVudC0+bnVtYmVyLCBpbmZvLmxvY2tlZCwgaW5mby5mbGFncyk7CisJcmVzdWx0ID0gc25kX3NlcV9xdWV1ZV9hbGxvYyhjbGllbnQtPm51bWJlciwgaW5mby0+bG9ja2VkLCBpbmZvLT5mbGFncyk7CiAJaWYgKHJlc3VsdCA8IDApCiAJCXJldHVybiByZXN1bHQ7CiAKQEAgLTE1NTcsMTgxICsxNTEzLDE1MCBAQAogCWlmIChxID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaW5mby5xdWV1ZSA9IHEtPnF1ZXVlOwotCWluZm8ubG9ja2VkID0gcS0+bG9ja2VkOwotCWluZm8ub3duZXIgPSBxLT5vd25lcjsKKwlpbmZvLT5xdWV1ZSA9IHEtPnF1ZXVlOworCWluZm8tPmxvY2tlZCA9IHEtPmxvY2tlZDsKKwlpbmZvLT5vd25lciA9IHEtPm93bmVyOwogCiAJLyogc2V0IHF1ZXVlIG5hbWUgKi8KLQlpZiAoISBpbmZvLm5hbWVbMF0pCi0JCXNucHJpbnRmKGluZm8ubmFtZSwgc2l6ZW9mKGluZm8ubmFtZSksICJRdWV1ZS0lZCIsIHEtPnF1ZXVlKTsKLQlzdHJsY3B5KHEtPm5hbWUsIGluZm8ubmFtZSwgc2l6ZW9mKHEtPm5hbWUpKTsKKwlpZiAoIWluZm8tPm5hbWVbMF0pCisJCXNucHJpbnRmKGluZm8tPm5hbWUsIHNpemVvZihpbmZvLT5uYW1lKSwgIlF1ZXVlLSVkIiwgcS0+cXVldWUpOworCXN0cmxjcHkocS0+bmFtZSwgaW5mby0+bmFtZSwgc2l6ZW9mKHEtPm5hbWUpKTsKIAlxdWV1ZWZyZWUocSk7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCiAJcmV0dXJuIDA7CiB9CiAKIC8qIERFTEVURV9RVUVVRSBpb2N0bCgpICovCi1zdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZGVsZXRlX3F1ZXVlKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICAgIHZvaWQgX191c2VyICphcmcpCitzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZGVsZXRlX3F1ZXVlKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbyBpbmZvOworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8gKmluZm8gPSBhcmc7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlyZXR1cm4gc25kX3NlcV9xdWV1ZV9kZWxldGUoY2xpZW50LT5udW1iZXIsIGluZm8ucXVldWUpOworCXJldHVybiBzbmRfc2VxX3F1ZXVlX2RlbGV0ZShjbGllbnQtPm51bWJlciwgaW5mby0+cXVldWUpOwogfQogCiAvKiBHRVRfUVVFVUVfSU5GTyBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X3F1ZXVlX2luZm8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCXZvaWQgX191c2VyICphcmcpCisJCQkJCXZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvIGluZm87CisJc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbyAqaW5mbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSAqcTsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXEgPSBxdWV1ZXB0cihpbmZvLnF1ZXVlKTsKKwlxID0gcXVldWVwdHIoaW5mby0+cXVldWUpOwogCWlmIChxID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwotCWluZm8ucXVldWUgPSBxLT5xdWV1ZTsKLQlpbmZvLm93bmVyID0gcS0+b3duZXI7Ci0JaW5mby5sb2NrZWQgPSBxLT5sb2NrZWQ7Ci0Jc3RybGNweShpbmZvLm5hbWUsIHEtPm5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisJaW5mby0+cXVldWUgPSBxLT5xdWV1ZTsKKwlpbmZvLT5vd25lciA9IHEtPm93bmVyOworCWluZm8tPmxvY2tlZCA9IHEtPmxvY2tlZDsKKwlzdHJsY3B5KGluZm8tPm5hbWUsIHEtPm5hbWUsIHNpemVvZihpbmZvLT5uYW1lKSk7CiAJcXVldWVmcmVlKHEpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQogCXJldHVybiAwOwogfQogCiAvKiBTRVRfUVVFVUVfSU5GTyBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfc2V0X3F1ZXVlX2luZm8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCXZvaWQgX191c2VyICphcmcpCisJCQkJCXZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvIGluZm87CisJc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbyAqaW5mbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSAqcTsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChpbmZvLm93bmVyICE9IGNsaWVudC0+bnVtYmVyKQorCWlmIChpbmZvLT5vd25lciAhPSBjbGllbnQtPm51bWJlcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBjaGFuZ2Ugb3duZXIvbG9ja2VkIHBlcm1pc3Npb24gKi8KLQlpZiAoc25kX3NlcV9xdWV1ZV9jaGVja19hY2Nlc3MoaW5mby5xdWV1ZSwgY2xpZW50LT5udW1iZXIpKSB7Ci0JCWlmIChzbmRfc2VxX3F1ZXVlX3NldF9vd25lcihpbmZvLnF1ZXVlLCBjbGllbnQtPm51bWJlciwgaW5mby5sb2NrZWQpIDwgMCkKKwlpZiAoc25kX3NlcV9xdWV1ZV9jaGVja19hY2Nlc3MoaW5mby0+cXVldWUsIGNsaWVudC0+bnVtYmVyKSkgeworCQlpZiAoc25kX3NlcV9xdWV1ZV9zZXRfb3duZXIoaW5mby0+cXVldWUsIGNsaWVudC0+bnVtYmVyLCBpbmZvLT5sb2NrZWQpIDwgMCkKIAkJCXJldHVybiAtRVBFUk07Ci0JCWlmIChpbmZvLmxvY2tlZCkKLQkJCXNuZF9zZXFfcXVldWVfdXNlKGluZm8ucXVldWUsIGNsaWVudC0+bnVtYmVyLCAxKTsKKwkJaWYgKGluZm8tPmxvY2tlZCkKKwkJCXNuZF9zZXFfcXVldWVfdXNlKGluZm8tPnF1ZXVlLCBjbGllbnQtPm51bWJlciwgMSk7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CQogCi0JcSA9IHF1ZXVlcHRyKGluZm8ucXVldWUpOworCXEgPSBxdWV1ZXB0cihpbmZvLT5xdWV1ZSk7CiAJaWYgKCEgcSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHEtPm93bmVyICE9IGNsaWVudC0+bnVtYmVyKSB7CiAJCXF1ZXVlZnJlZShxKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9Ci0Jc3RybGNweShxLT5uYW1lLCBpbmZvLm5hbWUsIHNpemVvZihxLT5uYW1lKSk7CisJc3RybGNweShxLT5uYW1lLCBpbmZvLT5uYW1lLCBzaXplb2YocS0+bmFtZSkpOwogCXF1ZXVlZnJlZShxKTsKIAogCXJldHVybiAwOwogfQogCiAvKiBHRVRfTkFNRURfUVVFVUUgaW9jdGwoKSAqLwotc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9uYW1lZF9xdWV1ZShzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwgdm9pZCBfX3VzZXIgKmFyZykKK3N0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfbmFtZWRfcXVldWUoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCisJCQkJCSB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfaW5mbyBpbmZvOworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX2luZm8gKmluZm8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfcXVldWUgKnE7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlxID0gc25kX3NlcV9xdWV1ZV9maW5kX25hbWUoaW5mby5uYW1lKTsKKwlxID0gc25kX3NlcV9xdWV1ZV9maW5kX25hbWUoaW5mby0+bmFtZSk7CiAJaWYgKHEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaW5mby5xdWV1ZSA9IHEtPnF1ZXVlOwotCWluZm8ub3duZXIgPSBxLT5vd25lcjsKLQlpbmZvLmxvY2tlZCA9IHEtPmxvY2tlZDsKKwlpbmZvLT5xdWV1ZSA9IHEtPnF1ZXVlOworCWluZm8tPm93bmVyID0gcS0+b3duZXI7CisJaW5mby0+bG9ja2VkID0gcS0+bG9ja2VkOwogCXF1ZXVlZnJlZShxKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KIAlyZXR1cm4gMDsKIH0KIAogLyogR0VUX1FVRVVFX1NUQVRVUyBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X3F1ZXVlX3N0YXR1cyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJICB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3N0YXR1cyAqc3RhdHVzID0gYXJnOwogCXN0cnVjdCBzbmRfc2VxX3F1ZXVlICpxdWV1ZTsKIAlzdHJ1Y3Qgc25kX3NlcV90aW1lciAqdG1yOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZzdGF0dXMsIGFyZywgc2l6ZW9mKHN0YXR1cykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXF1ZXVlID0gcXVldWVwdHIoc3RhdHVzLnF1ZXVlKTsKKwlxdWV1ZSA9IHF1ZXVlcHRyKHN0YXR1cy0+cXVldWUpOwogCWlmIChxdWV1ZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKLQltZW1zZXQoJnN0YXR1cywgMCwgc2l6ZW9mKHN0YXR1cykpOwotCXN0YXR1cy5xdWV1ZSA9IHF1ZXVlLT5xdWV1ZTsKKwltZW1zZXQoc3RhdHVzLCAwLCBzaXplb2YoKnN0YXR1cykpOworCXN0YXR1cy0+cXVldWUgPSBxdWV1ZS0+cXVldWU7CiAJCiAJdG1yID0gcXVldWUtPnRpbWVyOwotCXN0YXR1cy5ldmVudHMgPSBxdWV1ZS0+dGlja3EtPmNlbGxzICsgcXVldWUtPnRpbWVxLT5jZWxsczsKKwlzdGF0dXMtPmV2ZW50cyA9IHF1ZXVlLT50aWNrcS0+Y2VsbHMgKyBxdWV1ZS0+dGltZXEtPmNlbGxzOwogCi0Jc3RhdHVzLnRpbWUgPSBzbmRfc2VxX3RpbWVyX2dldF9jdXJfdGltZSh0bXIpOwotCXN0YXR1cy50aWNrID0gc25kX3NlcV90aW1lcl9nZXRfY3VyX3RpY2sodG1yKTsKKwlzdGF0dXMtPnRpbWUgPSBzbmRfc2VxX3RpbWVyX2dldF9jdXJfdGltZSh0bXIpOworCXN0YXR1cy0+dGljayA9IHNuZF9zZXFfdGltZXJfZ2V0X2N1cl90aWNrKHRtcik7CiAKLQlzdGF0dXMucnVubmluZyA9IHRtci0+cnVubmluZzsKKwlzdGF0dXMtPnJ1bm5pbmcgPSB0bXItPnJ1bm5pbmc7CiAKLQlzdGF0dXMuZmxhZ3MgPSBxdWV1ZS0+ZmxhZ3M7CisJc3RhdHVzLT5mbGFncyA9IHF1ZXVlLT5mbGFnczsKIAlxdWV1ZWZyZWUocXVldWUpOwogCi0JaWYgKGNvcHlfdG9fdXNlcihhcmcsICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKIAogLyogR0VUX1FVRVVFX1RFTVBPIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfcXVldWVfdGVtcG8oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RlbXBvIHRlbXBvOworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RlbXBvICp0ZW1wbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSAqcXVldWU7CiAJc3RydWN0IHNuZF9zZXFfdGltZXIgKnRtcjsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmdGVtcG8sIGFyZywgc2l6ZW9mKHRlbXBvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcXVldWUgPSBxdWV1ZXB0cih0ZW1wby5xdWV1ZSk7CisJcXVldWUgPSBxdWV1ZXB0cih0ZW1wby0+cXVldWUpOwogCWlmIChxdWV1ZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKLQltZW1zZXQoJnRlbXBvLCAwLCBzaXplb2YodGVtcG8pKTsKLQl0ZW1wby5xdWV1ZSA9IHF1ZXVlLT5xdWV1ZTsKKwltZW1zZXQodGVtcG8sIDAsIHNpemVvZigqdGVtcG8pKTsKKwl0ZW1wby0+cXVldWUgPSBxdWV1ZS0+cXVldWU7CiAJCiAJdG1yID0gcXVldWUtPnRpbWVyOwogCi0JdGVtcG8udGVtcG8gPSB0bXItPnRlbXBvOwotCXRlbXBvLnBwcSA9IHRtci0+cHBxOwotCXRlbXBvLnNrZXdfdmFsdWUgPSB0bXItPnNrZXc7Ci0JdGVtcG8uc2tld19iYXNlID0gdG1yLT5za2V3X2Jhc2U7CisJdGVtcG8tPnRlbXBvID0gdG1yLT50ZW1wbzsKKwl0ZW1wby0+cHBxID0gdG1yLT5wcHE7CisJdGVtcG8tPnNrZXdfdmFsdWUgPSB0bXItPnNrZXc7CisJdGVtcG8tPnNrZXdfYmFzZSA9IHRtci0+c2tld19iYXNlOwogCXF1ZXVlZnJlZShxdWV1ZSk7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJnRlbXBvLCBzaXplb2YodGVtcG8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NDcsMzEgKzE2NzIsMjUgQEAKIEVYUE9SVF9TWU1CT0woc25kX3NlcV9zZXRfcXVldWVfdGVtcG8pOwogCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfc2V0X3F1ZXVlX3RlbXBvKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90ZW1wbyAqdGVtcG8gPSBhcmc7CiAJaW50IHJlc3VsdDsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90ZW1wbyB0ZW1wbzsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmdGVtcG8sIGFyZywgc2l6ZW9mKHRlbXBvKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmVzdWx0ID0gc25kX3NlcV9zZXRfcXVldWVfdGVtcG8oY2xpZW50LT5udW1iZXIsICZ0ZW1wbyk7CisJcmVzdWx0ID0gc25kX3NlcV9zZXRfcXVldWVfdGVtcG8oY2xpZW50LT5udW1iZXIsIHRlbXBvKTsKIAlyZXR1cm4gcmVzdWx0IDwgMCA/IHJlc3VsdCA6IDA7CiB9CiAKIAogLyogR0VUX1FVRVVFX1RJTUVSIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9nZXRfcXVldWVfdGltZXIoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RpbWVyIHRpbWVyOworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RpbWVyICp0aW1lciA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZSAqcXVldWU7CiAJc3RydWN0IHNuZF9zZXFfdGltZXIgKnRtcjsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmdGltZXIsIGFyZywgc2l6ZW9mKHRpbWVyKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcXVldWUgPSBxdWV1ZXB0cih0aW1lci5xdWV1ZSk7CisJcXVldWUgPSBxdWV1ZXB0cih0aW1lci0+cXVldWUpOwogCWlmIChxdWV1ZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTc4MCw0MSArMTY5OSwzNiBAQAogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAl0bXIgPSBxdWV1ZS0+dGltZXI7Ci0JbWVtc2V0KCZ0aW1lciwgMCwgc2l6ZW9mKHRpbWVyKSk7Ci0JdGltZXIucXVldWUgPSBxdWV1ZS0+cXVldWU7CisJbWVtc2V0KHRpbWVyLCAwLCBzaXplb2YoKnRpbWVyKSk7CisJdGltZXItPnF1ZXVlID0gcXVldWUtPnF1ZXVlOwogCi0JdGltZXIudHlwZSA9IHRtci0+dHlwZTsKKwl0aW1lci0+dHlwZSA9IHRtci0+dHlwZTsKIAlpZiAodG1yLT50eXBlID09IFNORFJWX1NFUV9USU1FUl9BTFNBKSB7Ci0JCXRpbWVyLnUuYWxzYS5pZCA9IHRtci0+YWxzYV9pZDsKLQkJdGltZXIudS5hbHNhLnJlc29sdXRpb24gPSB0bXItPnByZWZlcnJlZF9yZXNvbHV0aW9uOworCQl0aW1lci0+dS5hbHNhLmlkID0gdG1yLT5hbHNhX2lkOworCQl0aW1lci0+dS5hbHNhLnJlc29sdXRpb24gPSB0bXItPnByZWZlcnJlZF9yZXNvbHV0aW9uOwogCX0KIAltdXRleF91bmxvY2soJnF1ZXVlLT50aW1lcl9tdXRleCk7CiAJcXVldWVmcmVlKHF1ZXVlKTsKIAkKLQlpZiAoY29weV90b191c2VyKGFyZywgJnRpbWVyLCBzaXplb2YodGltZXIpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKIAogLyogU0VUX1FVRVVFX1RJTUVSIGlvY3RsKCkgKi8KIHN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9zZXRfcXVldWVfdGltZXIoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgdm9pZCAqYXJnKQogeworCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RpbWVyICp0aW1lciA9IGFyZzsKIAlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90aW1lciB0aW1lcjsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmdGltZXIsIGFyZywgc2l6ZW9mKHRpbWVyKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKHRpbWVyLnR5cGUgIT0gU05EUlZfU0VRX1RJTUVSX0FMU0EpCisJaWYgKHRpbWVyLT50eXBlICE9IFNORFJWX1NFUV9USU1FUl9BTFNBKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChzbmRfc2VxX3F1ZXVlX2NoZWNrX2FjY2Vzcyh0aW1lci5xdWV1ZSwgY2xpZW50LT5udW1iZXIpKSB7CisJaWYgKHNuZF9zZXFfcXVldWVfY2hlY2tfYWNjZXNzKHRpbWVyLT5xdWV1ZSwgY2xpZW50LT5udW1iZXIpKSB7CiAJCXN0cnVjdCBzbmRfc2VxX3F1ZXVlICpxOwogCQlzdHJ1Y3Qgc25kX3NlcV90aW1lciAqdG1yOwogCi0JCXEgPSBxdWV1ZXB0cih0aW1lci5xdWV1ZSk7CisJCXEgPSBxdWV1ZXB0cih0aW1lci0+cXVldWUpOwogCQlpZiAocSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTlhJTzsKIAkJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcS0+dGltZXJfbXV0ZXgpKSB7CkBAIC0xODIyLDEzICsxNzM2LDEzIEBACiAJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCQl9CiAJCXRtciA9IHEtPnRpbWVyOwotCQlzbmRfc2VxX3F1ZXVlX3RpbWVyX2Nsb3NlKHRpbWVyLnF1ZXVlKTsKLQkJdG1yLT50eXBlID0gdGltZXIudHlwZTsKKwkJc25kX3NlcV9xdWV1ZV90aW1lcl9jbG9zZSh0aW1lci0+cXVldWUpOworCQl0bXItPnR5cGUgPSB0aW1lci0+dHlwZTsKIAkJaWYgKHRtci0+dHlwZSA9PSBTTkRSVl9TRVFfVElNRVJfQUxTQSkgewotCQkJdG1yLT5hbHNhX2lkID0gdGltZXIudS5hbHNhLmlkOwotCQkJdG1yLT5wcmVmZXJyZWRfcmVzb2x1dGlvbiA9IHRpbWVyLnUuYWxzYS5yZXNvbHV0aW9uOworCQkJdG1yLT5hbHNhX2lkID0gdGltZXItPnUuYWxzYS5pZDsKKwkJCXRtci0+cHJlZmVycmVkX3Jlc29sdXRpb24gPSB0aW1lci0+dS5hbHNhLnJlc29sdXRpb247CiAJCX0KLQkJcmVzdWx0ID0gc25kX3NlcV9xdWV1ZV90aW1lcl9vcGVuKHRpbWVyLnF1ZXVlKTsKKwkJcmVzdWx0ID0gc25kX3NlcV9xdWV1ZV90aW1lcl9vcGVuKHRpbWVyLT5xdWV1ZSk7CiAJCW11dGV4X3VubG9jaygmcS0+dGltZXJfbXV0ZXgpOwogCQlxdWV1ZWZyZWUocSk7CiAJfSBlbHNlIHsKQEAgLTE4NDEsMzggKzE3NTUsMzAgQEAKIAogLyogR0VUX1FVRVVFX0NMSUVOVCBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfZ2V0X3F1ZXVlX2NsaWVudChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJICB2b2lkIF9fdXNlciAqYXJnKQorCQkJCQkgIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9jbGllbnQgaW5mbzsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9jbGllbnQgKmluZm8gPSBhcmc7CiAJaW50IHVzZWQ7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQl1c2VkID0gc25kX3NlcV9xdWV1ZV9pc191c2VkKGluZm8ucXVldWUsIGNsaWVudC0+bnVtYmVyKTsKKwl1c2VkID0gc25kX3NlcV9xdWV1ZV9pc191c2VkKGluZm8tPnF1ZXVlLCBjbGllbnQtPm51bWJlcik7CiAJaWYgKHVzZWQgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpbmZvLnVzZWQgPSB1c2VkOwotCWluZm8uY2xpZW50ID0gY2xpZW50LT5udW1iZXI7CisJaW5mby0+dXNlZCA9IHVzZWQ7CisJaW5mby0+Y2xpZW50ID0gY2xpZW50LT5udW1iZXI7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCiAKIC8qIFNFVF9RVUVVRV9DTElFTlQgaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3NldF9xdWV1ZV9jbGllbnQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSAgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJICB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfcXVldWVfY2xpZW50ICppbmZvID0gYXJnOwogCWludCBlcnI7Ci0Jc3RydWN0IHNuZF9zZXFfcXVldWVfY2xpZW50IGluZm87CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpZiAoaW5mby51c2VkID49IDApIHsKLQkJZXJyID0gc25kX3NlcV9xdWV1ZV91c2UoaW5mby5xdWV1ZSwgY2xpZW50LT5udW1iZXIsIGluZm8udXNlZCk7CisJaWYgKGluZm8tPnVzZWQgPj0gMCkgeworCQllcnIgPSBzbmRfc2VxX3F1ZXVlX3VzZShpbmZvLT5xdWV1ZSwgY2xpZW50LT5udW1iZXIsIGluZm8tPnVzZWQpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJfQpAQCAtMTg4Myw3OCArMTc4OSw3MCBAQAogCiAvKiBHRVRfQ0xJRU5UX1BPT0wgaW9jdGwoKSAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9jbGllbnRfcG9vbChzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkJIHZvaWQgX191c2VyICphcmcpCisJCQkJCSB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfY2xpZW50X3Bvb2wgaW5mbzsKKwlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9vbCAqaW5mbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNwdHI7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihpbmZvLmNsaWVudCk7CisJY3B0ciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoaW5mby0+Y2xpZW50KTsKIAlpZiAoY3B0ciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0VOVDsKLQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7Ci0JaW5mby5jbGllbnQgPSBjcHRyLT5udW1iZXI7Ci0JaW5mby5vdXRwdXRfcG9vbCA9IGNwdHItPnBvb2wtPnNpemU7Ci0JaW5mby5vdXRwdXRfcm9vbSA9IGNwdHItPnBvb2wtPnJvb207Ci0JaW5mby5vdXRwdXRfZnJlZSA9IGluZm8ub3V0cHV0X3Bvb2w7Ci0JaW5mby5vdXRwdXRfZnJlZSA9IHNuZF9zZXFfdW51c2VkX2NlbGxzKGNwdHItPnBvb2wpOworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwlpbmZvLT5jbGllbnQgPSBjcHRyLT5udW1iZXI7CisJaW5mby0+b3V0cHV0X3Bvb2wgPSBjcHRyLT5wb29sLT5zaXplOworCWluZm8tPm91dHB1dF9yb29tID0gY3B0ci0+cG9vbC0+cm9vbTsKKwlpbmZvLT5vdXRwdXRfZnJlZSA9IGluZm8tPm91dHB1dF9wb29sOworCWluZm8tPm91dHB1dF9mcmVlID0gc25kX3NlcV91bnVzZWRfY2VsbHMoY3B0ci0+cG9vbCk7CiAJaWYgKGNwdHItPnR5cGUgPT0gVVNFUl9DTElFTlQpIHsKLQkJaW5mby5pbnB1dF9wb29sID0gY3B0ci0+ZGF0YS51c2VyLmZpZm9fcG9vbF9zaXplOwotCQlpbmZvLmlucHV0X2ZyZWUgPSBpbmZvLmlucHV0X3Bvb2w7CisJCWluZm8tPmlucHV0X3Bvb2wgPSBjcHRyLT5kYXRhLnVzZXIuZmlmb19wb29sX3NpemU7CisJCWluZm8tPmlucHV0X2ZyZWUgPSBpbmZvLT5pbnB1dF9wb29sOwogCQlpZiAoY3B0ci0+ZGF0YS51c2VyLmZpZm8pCi0JCQlpbmZvLmlucHV0X2ZyZWUgPSBzbmRfc2VxX3VudXNlZF9jZWxscyhjcHRyLT5kYXRhLnVzZXIuZmlmby0+cG9vbCk7CisJCQlpbmZvLT5pbnB1dF9mcmVlID0gc25kX3NlcV91bnVzZWRfY2VsbHMoY3B0ci0+ZGF0YS51c2VyLmZpZm8tPnBvb2wpOwogCX0gZWxzZSB7Ci0JCWluZm8uaW5wdXRfcG9vbCA9IDA7Ci0JCWluZm8uaW5wdXRfZnJlZSA9IDA7CisJCWluZm8tPmlucHV0X3Bvb2wgPSAwOworCQlpbmZvLT5pbnB1dF9mcmVlID0gMDsKIAl9CiAJc25kX3NlcV9jbGllbnRfdW5sb2NrKGNwdHIpOwogCQotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKIC8qIFNFVF9DTElFTlRfUE9PTCBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfc2V0X2NsaWVudF9wb29sKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJIHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9vbCBpbmZvOworCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb29sICppbmZvID0gYXJnOwogCWludCByYzsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCWlmIChjbGllbnQtPm51bWJlciAhPSBpbmZvLmNsaWVudCkKKwlpZiAoY2xpZW50LT5udW1iZXIgIT0gaW5mby0+Y2xpZW50KQogCQlyZXR1cm4gLUVJTlZBTDsgLyogY2FuJ3QgY2hhbmdlIG90aGVyIGNsaWVudHMgKi8KIAotCWlmIChpbmZvLm91dHB1dF9wb29sID49IDEgJiYgaW5mby5vdXRwdXRfcG9vbCA8PSBTTkRSVl9TRVFfTUFYX0VWRU5UUyAmJgorCWlmIChpbmZvLT5vdXRwdXRfcG9vbCA+PSAxICYmIGluZm8tPm91dHB1dF9wb29sIDw9IFNORFJWX1NFUV9NQVhfRVZFTlRTICYmCiAJICAgICghIHNuZF9zZXFfd3JpdGVfcG9vbF9hbGxvY2F0ZWQoY2xpZW50KSB8fAotCSAgICAgaW5mby5vdXRwdXRfcG9vbCAhPSBjbGllbnQtPnBvb2wtPnNpemUpKSB7CisJICAgICBpbmZvLT5vdXRwdXRfcG9vbCAhPSBjbGllbnQtPnBvb2wtPnNpemUpKSB7CiAJCWlmIChzbmRfc2VxX3dyaXRlX3Bvb2xfYWxsb2NhdGVkKGNsaWVudCkpIHsKIAkJCS8qIHJlbW92ZSBhbGwgZXhpc3RpbmcgY2VsbHMgKi8KIAkJCXNuZF9zZXFfcXVldWVfY2xpZW50X2xlYXZlX2NlbGxzKGNsaWVudC0+bnVtYmVyKTsKIAkJCXNuZF9zZXFfcG9vbF9kb25lKGNsaWVudC0+cG9vbCk7CiAJCX0KLQkJY2xpZW50LT5wb29sLT5zaXplID0gaW5mby5vdXRwdXRfcG9vbDsKKwkJY2xpZW50LT5wb29sLT5zaXplID0gaW5mby0+b3V0cHV0X3Bvb2w7CiAJCXJjID0gc25kX3NlcV9wb29sX2luaXQoY2xpZW50LT5wb29sKTsKIAkJaWYgKHJjIDwgMCkKIAkJCXJldHVybiByYzsKIAl9CiAJaWYgKGNsaWVudC0+dHlwZSA9PSBVU0VSX0NMSUVOVCAmJiBjbGllbnQtPmRhdGEudXNlci5maWZvICE9IE5VTEwgJiYKLQkgICAgaW5mby5pbnB1dF9wb29sID49IDEgJiYKLQkgICAgaW5mby5pbnB1dF9wb29sIDw9IFNORFJWX1NFUV9NQVhfQ0xJRU5UX0VWRU5UUyAmJgotCSAgICBpbmZvLmlucHV0X3Bvb2wgIT0gY2xpZW50LT5kYXRhLnVzZXIuZmlmb19wb29sX3NpemUpIHsKKwkgICAgaW5mby0+aW5wdXRfcG9vbCA+PSAxICYmCisJICAgIGluZm8tPmlucHV0X3Bvb2wgPD0gU05EUlZfU0VRX01BWF9DTElFTlRfRVZFTlRTICYmCisJICAgIGluZm8tPmlucHV0X3Bvb2wgIT0gY2xpZW50LT5kYXRhLnVzZXIuZmlmb19wb29sX3NpemUpIHsKIAkJLyogY2hhbmdlIHBvb2wgc2l6ZSAqLwotCQlyYyA9IHNuZF9zZXFfZmlmb19yZXNpemUoY2xpZW50LT5kYXRhLnVzZXIuZmlmbywgaW5mby5pbnB1dF9wb29sKTsKKwkJcmMgPSBzbmRfc2VxX2ZpZm9fcmVzaXplKGNsaWVudC0+ZGF0YS51c2VyLmZpZm8sIGluZm8tPmlucHV0X3Bvb2wpOwogCQlpZiAocmMgPCAwKQogCQkJcmV0dXJuIHJjOwotCQljbGllbnQtPmRhdGEudXNlci5maWZvX3Bvb2xfc2l6ZSA9IGluZm8uaW5wdXRfcG9vbDsKKwkJY2xpZW50LT5kYXRhLnVzZXIuZmlmb19wb29sX3NpemUgPSBpbmZvLT5pbnB1dF9wb29sOwogCX0KLQlpZiAoaW5mby5vdXRwdXRfcm9vbSA+PSAxICYmCi0JICAgIGluZm8ub3V0cHV0X3Jvb20gPD0gY2xpZW50LT5wb29sLT5zaXplKSB7Ci0JCWNsaWVudC0+cG9vbC0+cm9vbSAgPSBpbmZvLm91dHB1dF9yb29tOworCWlmIChpbmZvLT5vdXRwdXRfcm9vbSA+PSAxICYmCisJICAgIGluZm8tPm91dHB1dF9yb29tIDw9IGNsaWVudC0+cG9vbC0+c2l6ZSkgeworCQljbGllbnQtPnBvb2wtPnJvb20gID0gaW5mby0+b3V0cHV0X3Jvb207CiAJfQogCiAJcmV0dXJuIHNuZF9zZXFfaW9jdGxfZ2V0X2NsaWVudF9wb29sKGNsaWVudCwgYXJnKTsKQEAgLTE5NjMsMTcgKzE4NjEsMTQgQEAKIAogLyogUkVNT1ZFX0VWRU5UUyBpb2N0bCgpICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfcmVtb3ZlX2V2ZW50cyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKLQkJCQkgICAgICAgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkgICAgICAgdm9pZCAqYXJnKQogewotCXN0cnVjdCBzbmRfc2VxX3JlbW92ZV9ldmVudHMgaW5mbzsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlzdHJ1Y3Qgc25kX3NlcV9yZW1vdmVfZXZlbnRzICppbmZvID0gYXJnOwogCiAJLyoKIAkgKiBJbnB1dCBtb3N0bHkgbm90IGltcGxlbWVudGVkIFhYWC4KIAkgKi8KLQlpZiAoaW5mby5yZW1vdmVfbW9kZSAmIFNORFJWX1NFUV9SRU1PVkVfSU5QVVQpIHsKKwlpZiAoaW5mby0+cmVtb3ZlX21vZGUgJiBTTkRSVl9TRVFfUkVNT1ZFX0lOUFVUKSB7CiAJCS8qCiAJCSAqIE5vIHJlc3RyaWN0aW9ucyBzbyBmb3IgYSB1c2VyIGNsaWVudCB3ZSBjYW4gY2xlYXIKIAkJICogdGhlIHdob2xlIGZpZm8KQEAgLTE5ODIsOCArMTg3Nyw4IEBACiAJCQlzbmRfc2VxX2ZpZm9fY2xlYXIoY2xpZW50LT5kYXRhLnVzZXIuZmlmbyk7CiAJfQogCi0JaWYgKGluZm8ucmVtb3ZlX21vZGUgJiBTTkRSVl9TRVFfUkVNT1ZFX09VVFBVVCkKLQkJc25kX3NlcV9xdWV1ZV9yZW1vdmVfY2VsbHMoY2xpZW50LT5udW1iZXIsICZpbmZvKTsKKwlpZiAoaW5mby0+cmVtb3ZlX21vZGUgJiBTTkRSVl9TRVFfUkVNT1ZFX09VVFBVVCkKKwkJc25kX3NlcV9xdWV1ZV9yZW1vdmVfY2VsbHMoY2xpZW50LT5udW1iZXIsIGluZm8pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTkzLDI2ICsxODg4LDIzIEBACiAgKiBnZXQgc3Vic2NyaXB0aW9uIGluZm8KICAqLwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX2dldF9zdWJzY3JpcHRpb24oc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSAgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJICB2b2lkICphcmcpCiB7CisJc3RydWN0IHNuZF9zZXFfcG9ydF9zdWJzY3JpYmUgKnN1YnMgPSBhcmc7CiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKnNlbmRlciA9IE5VTEw7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50X3BvcnQgKnNwb3J0ID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3NlcV9wb3J0X3N1YnNjcmliZSBzdWJzOwogCXN0cnVjdCBzbmRfc2VxX3N1YnNjcmliZXJzICpwOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZzdWJzLCBhcmcsIHNpemVvZihzdWJzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCiAJcmVzdWx0ID0gLUVJTlZBTDsKLQlpZiAoKHNlbmRlciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy5zZW5kZXIuY2xpZW50KSkgPT0gTlVMTCkKKwlpZiAoKHNlbmRlciA9IHNuZF9zZXFfY2xpZW50X3VzZV9wdHIoc3Vicy0+c2VuZGVyLmNsaWVudCkpID09IE5VTEwpCiAJCWdvdG8gX19lbmQ7Ci0JaWYgKChzcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKHNlbmRlciwgc3Vicy5zZW5kZXIucG9ydCkpID09IE5VTEwpCisJaWYgKChzcG9ydCA9IHNuZF9zZXFfcG9ydF91c2VfcHRyKHNlbmRlciwgc3Vicy0+c2VuZGVyLnBvcnQpKSA9PSBOVUxMKQogCQlnb3RvIF9fZW5kOwotCXAgPSBzbmRfc2VxX3BvcnRfZ2V0X3N1YnNjcmlwdGlvbigmc3BvcnQtPmNfc3JjLCAmc3Vicy5kZXN0KTsKKwlwID0gc25kX3NlcV9wb3J0X2dldF9zdWJzY3JpcHRpb24oJnNwb3J0LT5jX3NyYywgJnN1YnMtPmRlc3QpOwogCWlmIChwKSB7CiAJCXJlc3VsdCA9IDA7Ci0JCXN1YnMgPSBwLT5pbmZvOworCQkqc3VicyA9IHAtPmluZm87CiAJfSBlbHNlCiAJCXJlc3VsdCA9IC1FTk9FTlQ7CiAKQEAgLTIwMjEsMTAgKzE5MTMsNyBAQAogCQlzbmRfc2VxX3BvcnRfdW5sb2NrKHNwb3J0KTsKIAlpZiAoc2VuZGVyKQogCQlzbmRfc2VxX2NsaWVudF91bmxvY2soc2VuZGVyKTsKLQlpZiAocmVzdWx0ID49IDApIHsKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZzdWJzLCBzaXplb2Yoc3VicykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQorCiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjAzMiwyNiArMTkyMSwyMiBAQAogLyoKICAqIGdldCBzdWJzY3JpcHRpb24gaW5mbyAtIGNoZWNrIG9ubHkgaXRzIHByZXNlbmNlCiAgKi8KLXN0YXRpYyBpbnQgc25kX3NlcV9pb2N0bF9xdWVyeV9zdWJzKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCSAgICB2b2lkIF9fdXNlciAqYXJnKQorc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3F1ZXJ5X3N1YnMoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9xdWVyeV9zdWJzICpzdWJzID0gYXJnOwogCWludCByZXN1bHQgPSAtRU5YSU87CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjcHRyID0gTlVMTDsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfcG9ydCAqcG9ydCA9IE5VTEw7Ci0Jc3RydWN0IHNuZF9zZXFfcXVlcnlfc3VicyBzdWJzOwogCXN0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic19pbmZvICpncm91cDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCWludCBpOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZzdWJzLCBhcmcsIHNpemVvZihzdWJzKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKChjcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihzdWJzLnJvb3QuY2xpZW50KSkgPT0gTlVMTCkKKwlpZiAoKGNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKHN1YnMtPnJvb3QuY2xpZW50KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKLQlpZiAoKHBvcnQgPSBzbmRfc2VxX3BvcnRfdXNlX3B0cihjcHRyLCBzdWJzLnJvb3QucG9ydCkpID09IE5VTEwpCisJaWYgKChwb3J0ID0gc25kX3NlcV9wb3J0X3VzZV9wdHIoY3B0ciwgc3Vicy0+cm9vdC5wb3J0KSkgPT0gTlVMTCkKIAkJZ290byBfX2VuZDsKIAotCXN3aXRjaCAoc3Vicy50eXBlKSB7CisJc3dpdGNoIChzdWJzLT50eXBlKSB7CiAJY2FzZSBTTkRSVl9TRVFfUVVFUllfU1VCU19SRUFEOgogCQlncm91cCA9ICZwb3J0LT5jX3NyYzsKIAkJYnJlYWs7CkBAIC0yMDY0LDIyICsxOTQ5LDIyIEBACiAKIAlkb3duX3JlYWQoJmdyb3VwLT5saXN0X211dGV4KTsKIAkvKiBzZWFyY2ggZm9yIHRoZSBzdWJzY3JpYmVyICovCi0Jc3Vicy5udW1fc3VicyA9IGdyb3VwLT5jb3VudDsKKwlzdWJzLT5udW1fc3VicyA9IGdyb3VwLT5jb3VudDsKIAlpID0gMDsKIAlyZXN1bHQgPSAtRU5PRU5UOwogCWxpc3RfZm9yX2VhY2gocCwgJmdyb3VwLT5saXN0X2hlYWQpIHsKLQkJaWYgKGkrKyA9PSBzdWJzLmluZGV4KSB7CisJCWlmIChpKysgPT0gc3Vicy0+aW5kZXgpIHsKIAkJCS8qIGZvdW5kISAqLwogCQkJc3RydWN0IHNuZF9zZXFfc3Vic2NyaWJlcnMgKnM7Ci0JCQlpZiAoc3Vicy50eXBlID09IFNORFJWX1NFUV9RVUVSWV9TVUJTX1JFQUQpIHsKKwkJCWlmIChzdWJzLT50eXBlID09IFNORFJWX1NFUV9RVUVSWV9TVUJTX1JFQUQpIHsKIAkJCQlzID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycywgc3JjX2xpc3QpOwotCQkJCXN1YnMuYWRkciA9IHMtPmluZm8uZGVzdDsKKwkJCQlzdWJzLT5hZGRyID0gcy0+aW5mby5kZXN0OwogCQkJfSBlbHNlIHsKIAkJCQlzID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycywgZGVzdF9saXN0KTsKLQkJCQlzdWJzLmFkZHIgPSBzLT5pbmZvLnNlbmRlcjsKKwkJCQlzdWJzLT5hZGRyID0gcy0+aW5mby5zZW5kZXI7CiAJCQl9Ci0JCQlzdWJzLmZsYWdzID0gcy0+aW5mby5mbGFnczsKLQkJCXN1YnMucXVldWUgPSBzLT5pbmZvLnF1ZXVlOworCQkJc3Vicy0+ZmxhZ3MgPSBzLT5pbmZvLmZsYWdzOworCQkJc3Vicy0+cXVldWUgPSBzLT5pbmZvLnF1ZXVlOwogCQkJcmVzdWx0ID0gMDsKIAkJCWJyZWFrOwogCQl9CkBAIC0yMDkxLDEwICsxOTc2LDcgQEAKIAkJc25kX3NlcV9wb3J0X3VubG9jayhwb3J0KTsKIAlpZiAoY3B0cikKIAkJc25kX3NlcV9jbGllbnRfdW5sb2NrKGNwdHIpOwotCWlmIChyZXN1bHQgPj0gMCkgewotCQlpZiAoY29weV90b191c2VyKGFyZywgJnN1YnMsIHNpemVvZihzdWJzKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQl9CisKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yMTAzLDMxICsxOTg1LDI2IEBACiAgKiBxdWVyeSBuZXh0IGNsaWVudAogICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfcXVlcnlfbmV4dF9jbGllbnQoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsCi0JCQkJCSAgIHZvaWQgX191c2VyICphcmcpCisJCQkJCSAgIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9jbGllbnRfaW5mbyAqaW5mbyA9IGFyZzsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNwdHIgPSBOVUxMOwotCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9pbmZvIGluZm87Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkvKiBzZWFyY2ggZm9yIG5leHQgY2xpZW50ICovCi0JaW5mby5jbGllbnQrKzsKLQlpZiAoaW5mby5jbGllbnQgPCAwKQotCQlpbmZvLmNsaWVudCA9IDA7Ci0JZm9yICg7IGluZm8uY2xpZW50IDwgU05EUlZfU0VRX01BWF9DTElFTlRTOyBpbmZvLmNsaWVudCsrKSB7Ci0JCWNwdHIgPSBzbmRfc2VxX2NsaWVudF91c2VfcHRyKGluZm8uY2xpZW50KTsKKwlpbmZvLT5jbGllbnQrKzsKKwlpZiAoaW5mby0+Y2xpZW50IDwgMCkKKwkJaW5mby0+Y2xpZW50ID0gMDsKKwlmb3IgKDsgaW5mby0+Y2xpZW50IDwgU05EUlZfU0VRX01BWF9DTElFTlRTOyBpbmZvLT5jbGllbnQrKykgeworCQljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihpbmZvLT5jbGllbnQpOwogCQlpZiAoY3B0cikKIAkJCWJyZWFrOyAvKiBmb3VuZCAqLwogCX0KIAlpZiAoY3B0ciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCWdldF9jbGllbnRfaW5mbyhjcHRyLCAmaW5mbyk7CisJZ2V0X2NsaWVudF9pbmZvKGNwdHIsIGluZm8pOwogCXNuZF9zZXFfY2xpZW50X3VubG9jayhjcHRyKTsKIAotCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKLQkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxMzUsNDMgKzIwMTIsNDEgQEAKICAqIHF1ZXJ5IG5leHQgcG9ydAogICovCiBzdGF0aWMgaW50IHNuZF9zZXFfaW9jdGxfcXVlcnlfbmV4dF9wb3J0KHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LAotCQkJCQkgdm9pZCBfX3VzZXIgKmFyZykKKwkJCQkJIHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gKmluZm8gPSBhcmc7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjcHRyOwogCXN0cnVjdCBzbmRfc2VxX2NsaWVudF9wb3J0ICpwb3J0ID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gaW5mbzsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgYXJnLCBzaXplb2YoaW5mbykpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihpbmZvLmFkZHIuY2xpZW50KTsKKwljcHRyID0gc25kX3NlcV9jbGllbnRfdXNlX3B0cihpbmZvLT5hZGRyLmNsaWVudCk7CiAJaWYgKGNwdHIgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTlhJTzsKIAogCS8qIHNlYXJjaCBmb3IgbmV4dCBwb3J0ICovCi0JaW5mby5hZGRyLnBvcnQrKzsKLQlwb3J0ID0gc25kX3NlcV9wb3J0X3F1ZXJ5X25lYXJlc3QoY3B0ciwgJmluZm8pOworCWluZm8tPmFkZHIucG9ydCsrOworCXBvcnQgPSBzbmRfc2VxX3BvcnRfcXVlcnlfbmVhcmVzdChjcHRyLCBpbmZvKTsKIAlpZiAocG9ydCA9PSBOVUxMKSB7CiAJCXNuZF9zZXFfY2xpZW50X3VubG9jayhjcHRyKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJLyogZ2V0IHBvcnQgaW5mbyAqLwotCWluZm8uYWRkciA9IHBvcnQtPmFkZHI7Ci0Jc25kX3NlcV9nZXRfcG9ydF9pbmZvKHBvcnQsICZpbmZvKTsKKwlpbmZvLT5hZGRyID0gcG9ydC0+YWRkcjsKKwlzbmRfc2VxX2dldF9wb3J0X2luZm8ocG9ydCwgaW5mbyk7CiAJc25kX3NlcV9wb3J0X3VubG9jayhwb3J0KTsKIAlzbmRfc2VxX2NsaWVudF91bmxvY2soY3B0cik7CiAKLQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCi0JCXJldHVybiAtRUZBVUxUOwogCXJldHVybiAwOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgc3RydWN0IHNlcV9pb2N0bF90YWJsZSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlvY3RsX2hhbmRsZXIgewogCXVuc2lnbmVkIGludCBjbWQ7Ci0JaW50ICgqZnVuYykoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgX191c2VyICogYXJnKTsKLX0gaW9jdGxfdGFibGVzW10gPSB7CisJaW50ICgqZnVuYykoc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQsIHZvaWQgKmFyZyk7Cit9IGlvY3RsX2hhbmRsZXJzW10gPSB7CisJeyBTTkRSVl9TRVFfSU9DVExfUFZFUlNJT04sIHNuZF9zZXFfaW9jdGxfcHZlcnNpb24gfSwKKwl7IFNORFJWX1NFUV9JT0NUTF9DTElFTlRfSUQsIHNuZF9zZXFfaW9jdGxfY2xpZW50X2lkIH0sCiAJeyBTTkRSVl9TRVFfSU9DVExfU1lTVEVNX0lORk8sIHNuZF9zZXFfaW9jdGxfc3lzdGVtX2luZm8gfSwKIAl7IFNORFJWX1NFUV9JT0NUTF9SVU5OSU5HX01PREUsIHNuZF9zZXFfaW9jdGxfcnVubmluZ19tb2RlIH0sCiAJeyBTTkRSVl9TRVFfSU9DVExfR0VUX0NMSUVOVF9JTkZPLCBzbmRfc2VxX2lvY3RsX2dldF9jbGllbnRfaW5mbyB9LApAQCAtMjIwNCw0MCArMjA3OSw2NSBAQAogCXsgMCwgTlVMTCB9LAogfTsKIAotc3RhdGljIGludCBzbmRfc2VxX2RvX2lvY3RsKHN0cnVjdCBzbmRfc2VxX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLAotCQkJICAgIHZvaWQgX191c2VyICphcmcpCi17Ci0Jc3RydWN0IHNlcV9pb2N0bF90YWJsZSAqcDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9TRVFfSU9DVExfUFZFUlNJT046Ci0JCS8qIHJldHVybiBzZXF1ZW5jZXIgdmVyc2lvbiBudW1iZXIgKi8KLQkJcmV0dXJuIHB1dF91c2VyKFNORFJWX1NFUV9WRVJTSU9OLCAoaW50IF9fdXNlciAqKWFyZykgPyAtRUZBVUxUIDogMDsKLQljYXNlIFNORFJWX1NFUV9JT0NUTF9DTElFTlRfSUQ6Ci0JCS8qIHJldHVybiB0aGUgaWQgb2YgdGhpcyBjbGllbnQgKi8KLQkJcmV0dXJuIHB1dF91c2VyKGNsaWVudC0+bnVtYmVyLCAoaW50IF9fdXNlciAqKWFyZykgPyAtRUZBVUxUIDogMDsKLQl9Ci0KLQlpZiAoISBhcmcpCi0JCXJldHVybiAtRUZBVUxUOwotCWZvciAocCA9IGlvY3RsX3RhYmxlczsgcC0+Y21kOyBwKyspIHsKLQkJaWYgKHAtPmNtZCA9PSBjbWQpCi0JCQlyZXR1cm4gcC0+ZnVuYyhjbGllbnQsIGFyZyk7Ci0JfQotCXByX2RlYnVnKCJBTFNBOiBzZXEgdW5rbm93biBpb2N0bCgpIDB4JXggKHR5cGU9JyVjJywgbnVtYmVyPTB4JTAyeClcbiIsCi0JCSAgIGNtZCwgX0lPQ19UWVBFKGNtZCksIF9JT0NfTlIoY21kKSk7Ci0JcmV0dXJuIC1FTk9UVFk7Ci19Ci0KLQotc3RhdGljIGxvbmcgc25kX3NlcV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgbG9uZyBzbmRfc2VxX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkvKiBUbyB1c2Uga2VybmVsIHN0YWNrIGZvciBpb2N0bCBkYXRhLiAqLworCXVuaW9uIHsKKwkJaW50IHB2ZXJzaW9uOworCQlpbnQgY2xpZW50X2lkOworCQlzdHJ1Y3Qgc25kX3NlcV9zeXN0ZW1faW5mbwlzeXN0ZW1faW5mbzsKKwkJc3RydWN0IHNuZF9zZXFfcnVubmluZ19pbmZvCXJ1bm5pbmdfaW5mbzsKKwkJc3RydWN0IHNuZF9zZXFfY2xpZW50X2luZm8JY2xpZW50X2luZm87CisJCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbwlwb3J0X2luZm87CisJCXN0cnVjdCBzbmRfc2VxX3BvcnRfc3Vic2NyaWJlCXBvcnRfc3Vic2NyaWJlOworCQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV9pbmZvCXF1ZXVlX2luZm87CisJCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3N0YXR1cwlxdWV1ZV9zdGF0dXM7CisJCXN0cnVjdCBzbmRfc2VxX3F1ZXVlX3RlbXBvCXRlbXBvOworCQlzdHJ1Y3Qgc25kX3NlcV9xdWV1ZV90aW1lcglxdWV1ZV90aW1lcjsKKwkJc3RydWN0IHNuZF9zZXFfcXVldWVfY2xpZW50CXF1ZXVlX2NsaWVudDsKKwkJc3RydWN0IHNuZF9zZXFfY2xpZW50X3Bvb2wJY2xpZW50X3Bvb2w7CisJCXN0cnVjdCBzbmRfc2VxX3JlbW92ZV9ldmVudHMJcmVtb3ZlX2V2ZW50czsKKwkJc3RydWN0IHNuZF9zZXFfcXVlcnlfc3VicwlxdWVyeV9zdWJzOworCX0gYnVmOworCWNvbnN0IHN0cnVjdCBpb2N0bF9oYW5kbGVyICpoYW5kbGVyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgZXJyOwogCiAJaWYgKHNuZF9CVUdfT04oIWNsaWVudCkpCiAJCXJldHVybiAtRU5YSU87Ci0JCQotCXJldHVybiBzbmRfc2VxX2RvX2lvY3RsKGNsaWVudCwgY21kLCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKworCWZvciAoaGFuZGxlciA9IGlvY3RsX2hhbmRsZXJzOyBoYW5kbGVyLT5jbWQgPiAwOyArK2hhbmRsZXIpIHsKKwkJaWYgKGhhbmRsZXItPmNtZCA9PSBjbWQpCisJCQlicmVhazsKKwl9CisJaWYgKGhhbmRsZXItPmNtZCA9PSAwKQorCQlyZXR1cm4gLUVOT1RUWTsKKworCW1lbXNldCgmYnVmLCAwLCBzaXplb2YoYnVmKSk7CisKKwkvKgorCSAqIEFsbCBvZiBpb2N0bCBjb21tYW5kcyBmb3IgQUxTQSBzZXF1ZW5jZXIgZ2V0IGFuIGFyZ3VtZW50IG9mIHNpemUKKwkgKiB3aXRoaW4gMTMgYml0cy4gV2UgY2FuIHNhZmVseSBwaWNrIHVwIHRoZSBzaXplIGZyb20gdGhlIGNvbW1hbmQuCisJICovCisJc2l6ZSA9IF9JT0NfU0laRShoYW5kbGVyLT5jbWQpOworCWlmIChoYW5kbGVyLT5jbWQgJiBJT0NfSU4pIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZidWYsIChjb25zdCB2b2lkIF9fdXNlciAqKWFyZywgc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwllcnIgPSBoYW5kbGVyLT5mdW5jKGNsaWVudCwgJmJ1Zik7CisJaWYgKGVyciA+PSAwKSB7CisJCS8qIFNvbWUgY29tbWFuZHMgaW5jbHVkZXMgYSBidWcgaW4gJ2RpcicgZmllbGQuICovCisJCWlmIChoYW5kbGVyLT5jbWQgPT0gU05EUlZfU0VRX0lPQ1RMX1NFVF9RVUVVRV9DTElFTlQgfHwKKwkJICAgIGhhbmRsZXItPmNtZCA9PSBTTkRSVl9TRVFfSU9DVExfU0VUX0NMSUVOVF9QT09MIHx8CisJCSAgICAoaGFuZGxlci0+Y21kICYgSU9DX09VVCkpCisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmJ1Ziwgc2l6ZSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIGVycjsKIH0KIAogI2lmZGVmIENPTkZJR19DT01QQVQKQEAgLTI0MjMsMjMgKzIzMjMsMzUgQEAKIAogRVhQT1JUX1NZTUJPTChzbmRfc2VxX2tlcm5lbF9jbGllbnRfZGlzcGF0Y2gpOwogCi0vKgotICogZXhwb3J0ZWQsIGNhbGxlZCBieSBrZXJuZWwgY2xpZW50cyB0byBwZXJmb3JtIHNhbWUgZnVuY3Rpb25zIGFzIHdpdGgKLSAqIHVzZXJsYW5kIGlvY3RsKCkgCisvKioKKyAqIHNuZF9zZXFfa2VybmVsX2NsaWVudF9jdGwgLSBvcGVyYXRlIGEgY29tbWFuZCBmb3IgYSBjbGllbnQgd2l0aCBkYXRhIGluCisgKgkJCSAgICAgICBrZXJuZWwgc3BhY2UuCisgKiBAY2xpZW50aWQ6CUEgbnVtZXJpY2FsIElEIGZvciBhIGNsaWVudC4KKyAqIEBjbWQ6CUFuIGlvY3RsKDIpIGNvbW1hbmQgZm9yIEFMU0Egc2VxdWVuY2VyIG9wZXJhdGlvbi4KKyAqIEBhcmc6CUEgcG9pbnRlciB0byBkYXRhIGluIGtlcm5lbCBzcGFjZS4KKyAqCisgKiBBZ2FpbnN0IGl0cyBuYW1lLCBib3RoIGtlcm5lbC9hcHBsaWNhdGlvbiBjbGllbnQgY2FuIGJlIGhhbmRsZWQgYnkgdGhpcworICoga2VybmVsIEFQSS4gQSBwb2ludGVyIG9mICdhcmcnIGFyZ3VtZW50IHNob3VsZCBiZSBpbiBrZXJuZWwgc3BhY2UuCisgKgorICogUmV0dXJuOiAwIGF0IHN1Y2Nlc3MuIE5lZ2F0aXZlIGVycm9yIGNvZGUgYXQgZmFpbHVyZS4KICAqLwogaW50IHNuZF9zZXFfa2VybmVsX2NsaWVudF9jdGwoaW50IGNsaWVudGlkLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CisJY29uc3Qgc3RydWN0IGlvY3RsX2hhbmRsZXIgKmhhbmRsZXI7CiAJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjbGllbnQ7Ci0JbW1fc2VnbWVudF90IGZzOwotCWludCByZXN1bHQ7CiAKIAljbGllbnQgPSBjbGllbnRwdHIoY2xpZW50aWQpOwogCWlmIChjbGllbnQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTlhJTzsKLQlmcyA9IHNuZF9lbnRlcl91c2VyKCk7Ci0JcmVzdWx0ID0gc25kX3NlcV9kb19pb2N0bChjbGllbnQsIGNtZCwgKHZvaWQgX19mb3JjZSBfX3VzZXIgKilhcmcpOwotCXNuZF9sZWF2ZV91c2VyKGZzKTsKLQlyZXR1cm4gcmVzdWx0OworCisJZm9yIChoYW5kbGVyID0gaW9jdGxfaGFuZGxlcnM7IGhhbmRsZXItPmNtZCA+IDA7ICsraGFuZGxlcikgeworCQlpZiAoaGFuZGxlci0+Y21kID09IGNtZCkKKwkJCXJldHVybiBoYW5kbGVyLT5mdW5jKGNsaWVudCwgYXJnKTsKKwl9CisKKwlwcl9kZWJ1ZygiQUxTQTogc2VxIHVua25vd24gaW9jdGwoKSAweCV4ICh0eXBlPSclYycsIG51bWJlcj0weCUwMngpXG4iLAorCQkgY21kLCBfSU9DX1RZUEUoY21kKSwgX0lPQ19OUihjbWQpKTsKKwlyZXR1cm4gLUVOT1RUWTsKIH0KIAogRVhQT1JUX1NZTUJPTChzbmRfc2VxX2tlcm5lbF9jbGllbnRfY3RsKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jb21wYXQuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jb21wYXQuYwppbmRleCA2NTE3NTkwLi5mY2U1Njk3IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfY29tcGF0LmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2NvbXBhdC5jCkBAIC00Nyw3ICs0Nyw2IEBACiB7CiAJaW50IGVyciA9IC1FRkFVTFQ7CiAJc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvICpkYXRhOwotCW1tX3NlZ21lbnRfdCBmczsKIAogCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwogCWlmICghZGF0YSkKQEAgLTU5LDkgKzU4LDcgQEAKIAkJZ290byBlcnJvcjsKIAlkYXRhLT5rZXJuZWwgPSBOVUxMOwogCi0JZnMgPSBzbmRfZW50ZXJfdXNlcigpOwotCWVyciA9IHNuZF9zZXFfZG9faW9jdGwoY2xpZW50LCBjbWQsIGRhdGEpOwotCXNuZF9sZWF2ZV91c2VyKGZzKTsKKwllcnIgPSBzbmRfc2VxX2tlcm5lbF9jbGllbnRfY3RsKGNsaWVudC0+bnVtYmVyLCBjbWQsICZkYXRhKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvcjsKIApAQCAtMTIzLDcgKzEyMCw3IEBACiAJY2FzZSBTTkRSVl9TRVFfSU9DVExfR0VUX1NVQlNDUklQVElPTjoKIAljYXNlIFNORFJWX1NFUV9JT0NUTF9RVUVSWV9ORVhUX0NMSUVOVDoKIAljYXNlIFNORFJWX1NFUV9JT0NUTF9SVU5OSU5HX01PREU6Ci0JCXJldHVybiBzbmRfc2VxX2RvX2lvY3RsKGNsaWVudCwgY21kLCBhcmdwKTsKKwkJcmV0dXJuIHNuZF9zZXFfaW9jdGwoZmlsZSwgY21kLCBhcmcpOwogCWNhc2UgU05EUlZfU0VRX0lPQ1RMX0NSRUFURV9QT1JUMzI6CiAJCXJldHVybiBzbmRfc2VxX2NhbGxfcG9ydF9pbmZvX2lvY3RsKGNsaWVudCwgU05EUlZfU0VRX0lPQ1RMX0NSRUFURV9QT1JULCBhcmdwKTsKIAljYXNlIFNORFJWX1NFUV9JT0NUTF9ERUxFVEVfUE9SVDMyOgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS90aW1lci5jIGIvc291bmQvY29yZS90aW1lci5jCmluZGV4IDlhNjE1N2UuLmZjMTQ0ZjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvdGltZXIuYworKysgYi9zb3VuZC9jb3JlL3RpbWVyLmMKQEAgLTM1LDYgKzM1LDkgQEAKICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogCisvKiBpbnRlcm5hbCBmbGFncyAqLworI2RlZmluZSBTTkRSVl9USU1FUl9JRkxHX1BBVVNFRAkJMHgwMDAxMDAwMAorCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX0hSVElNRVIpCiAjZGVmaW5lIERFRkFVTFRfVElNRVJfTElNSVQgNAogI2Vsc2UKQEAgLTI5NCw4ICsyOTcsMjEgQEAKIAkJZ2V0X2RldmljZSgmdGltZXItPmNhcmQtPmNhcmRfZGV2KTsKIAl0aW1lcmktPnNsYXZlX2NsYXNzID0gdGlkLT5kZXZfc2NsYXNzOwogCXRpbWVyaS0+c2xhdmVfaWQgPSBzbGF2ZV9pZDsKLQlpZiAobGlzdF9lbXB0eSgmdGltZXItPm9wZW5fbGlzdF9oZWFkKSAmJiB0aW1lci0+aHcub3BlbikKLQkJdGltZXItPmh3Lm9wZW4odGltZXIpOworCisJaWYgKGxpc3RfZW1wdHkoJnRpbWVyLT5vcGVuX2xpc3RfaGVhZCkgJiYgdGltZXItPmh3Lm9wZW4pIHsKKwkJaW50IGVyciA9IHRpbWVyLT5ody5vcGVuKHRpbWVyKTsKKwkJaWYgKGVycikgeworCQkJa2ZyZWUodGltZXJpLT5vd25lcik7CisJCQlrZnJlZSh0aW1lcmkpOworCisJCQlpZiAodGltZXItPmNhcmQpCisJCQkJcHV0X2RldmljZSgmdGltZXItPmNhcmQtPmNhcmRfZGV2KTsKKwkJCW1vZHVsZV9wdXQodGltZXItPm1vZHVsZSk7CisJCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKIAlsaXN0X2FkZF90YWlsKCZ0aW1lcmktPm9wZW5fbGlzdCwgJnRpbWVyLT5vcGVuX2xpc3RfaGVhZCk7CiAJc25kX3RpbWVyX2NoZWNrX21hc3Rlcih0aW1lcmkpOwogCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwpAQCAtNTI2LDYgKzU0MiwxMCBAQAogCQl9CiAJfQogCXRpbWVyaS0+ZmxhZ3MgJj0gfihTTkRSVl9USU1FUl9JRkxHX1JVTk5JTkcgfCBTTkRSVl9USU1FUl9JRkxHX1NUQVJUKTsKKwlpZiAoc3RvcCkKKwkJdGltZXJpLT5mbGFncyAmPSB+U05EUlZfVElNRVJfSUZMR19QQVVTRUQ7CisJZWxzZQorCQl0aW1lcmktPmZsYWdzIHw9IFNORFJWX1RJTUVSX0lGTEdfUEFVU0VEOwogCXNuZF90aW1lcl9ub3RpZnkxKHRpbWVyaSwgc3RvcCA/IFNORFJWX1RJTUVSX0VWRU5UX1NUT1AgOgogCQkJICBTTkRSVl9USU1FUl9FVkVOVF9DT05USU5VRSk7CiAgdW5sb2NrOgpAQCAtNTg3LDYgKzYwNywxMCBAQAogICovCiBpbnQgc25kX3RpbWVyX2NvbnRpbnVlKHN0cnVjdCBzbmRfdGltZXJfaW5zdGFuY2UgKnRpbWVyaSkKIHsKKwkvKiB0aW1lciBjYW4gY29udGludWUgb25seSBhZnRlciBwYXVzZSAqLworCWlmICghKHRpbWVyaS0+ZmxhZ3MgJiBTTkRSVl9USU1FUl9JRkxHX1BBVVNFRCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKHRpbWVyaS0+ZmxhZ3MgJiBTTkRSVl9USU1FUl9JRkxHX1NMQVZFKQogCQlyZXR1cm4gc25kX3RpbWVyX3N0YXJ0X3NsYXZlKHRpbWVyaSwgZmFsc2UpOwogCWVsc2UKQEAgLTgxMyw2ICs4MzcsNyBAQAogCXRpbWVyLT50bXJfc3ViZGV2aWNlID0gdGlkLT5zdWJkZXZpY2U7CiAJaWYgKGlkKQogCQlzdHJsY3B5KHRpbWVyLT5pZCwgaWQsIHNpemVvZih0aW1lci0+aWQpKTsKKwl0aW1lci0+c3RpY2tzID0gMTsKIAlJTklUX0xJU1RfSEVBRCgmdGltZXItPmRldmljZV9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmdGltZXItPm9wZW5fbGlzdF9oZWFkKTsKIAlJTklUX0xJU1RfSEVBRCgmdGltZXItPmFjdGl2ZV9saXN0X2hlYWQpOwpAQCAtMTgxNyw2ICsxODQyLDkgQEAKIAl0dSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpZiAoIXR1LT50aW1lcmkpCiAJCXJldHVybiAtRUJBREZEOworCS8qIHN0YXJ0IHRpbWVyIGluc3RlYWQgb2YgY29udGludWUgaWYgaXQncyBub3QgdXNlZCBiZWZvcmUgKi8KKwlpZiAoISh0dS0+dGltZXJpLT5mbGFncyAmIFNORFJWX1RJTUVSX0lGTEdfUEFVU0VEKSkKKwkJcmV0dXJuIHNuZF90aW1lcl91c2VyX3N0YXJ0KGZpbGUpOwogCXR1LT50aW1lcmktPmxvc3QgPSAwOwogCXJldHVybiAoZXJyID0gc25kX3RpbWVyX2NvbnRpbnVlKHR1LT50aW1lcmkpKSA8IDAgPyBlcnIgOiAwOwogfQpAQCAtMTk1OCw2ICsxOTg2LDcgQEAKIAkJdHUtPnF1c2VkLS07CiAJCXNwaW5fdW5sb2NrX2lycSgmdHUtPnFsb2NrKTsKIAorCQltdXRleF9sb2NrKCZ0dS0+aW9jdGxfbG9jayk7CiAJCWlmICh0dS0+dHJlYWQpIHsKIAkJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCAmdHUtPnRxdWV1ZVtxaGVhZF0sCiAJCQkJCSBzaXplb2Yoc3RydWN0IHNuZF90aW1lcl90cmVhZCkpKQpAQCAtMTk2Nyw2ICsxOTk2LDcgQEAKIAkJCQkJIHNpemVvZihzdHJ1Y3Qgc25kX3RpbWVyX3JlYWQpKSkKIAkJCQllcnIgPSAtRUZBVUxUOwogCQl9CisJCW11dGV4X3VubG9jaygmdHUtPmlvY3RsX2xvY2spOwogCiAJCXNwaW5fbG9ja19pcnEoJnR1LT5xbG9jayk7CiAJCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvYmVib2IvTWFrZWZpbGUgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9NYWtlZmlsZQppbmRleCBhZjdlZDY2Li5kZDQ1NDg2IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9iZWJvYi9NYWtlZmlsZQorKysgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKIHNuZC1iZWJvYi1vYmpzIDo9IGJlYm9iX2NvbW1hbmQubyBiZWJvYl9zdHJlYW0ubyBiZWJvYl9wcm9jLm8gYmVib2JfbWlkaS5vIFwKLQkJICBiZWJvYl9wY20ubyBiZWJvYl9od2RlcC5vIGJlYm9iX3RlcnJhdGVjLm8gYmVib2JfeWFtYWhhLm8gXAotCQkgIGJlYm9iX2ZvY3Vzcml0ZS5vIGJlYm9iX21hdWRpby5vIGJlYm9iLm8KKwkJICBiZWJvYl9wY20ubyBiZWJvYl9od2RlcC5vIGJlYm9iX3RlcnJhdGVjLm8gXAorCQkgIGJlYm9iX3lhbWFoYV90ZXJyYXRlYy5vIGJlYm9iX2ZvY3Vzcml0ZS5vIGJlYm9iX21hdWRpby5vIFwKKwkJICBiZWJvYi5vCiBvYmotJChDT05GSUdfU05EX0JFQk9CKSArPSBzbmQtYmVib2IubwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2IuYyBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iLmMKaW5kZXggZjdlMmNiZC4uMzQ2OWFjMTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iLmMKKysrIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2IuYwpAQCAtNDU4LDE3ICs0NTgsMTcgQEAKIAkvKiBUZXJyYVRlYyBFbGVjdHJvbmljIEdtYkgsIFBIQVNFIDg4IFJhY2sgRlcgKi8KIAlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9URVJSQVRFQywgMHgwMDAwMDAwMywgJnBoYXNlODhfcmFja19zcGVjKSwKIAkvKiBUZXJyYVRlYyBFbGVjdHJvbmljIEdtYkgsIFBIQVNFIDI0IEZXICovCi0JU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fVEVSUkFURUMsIDB4MDAwMDAwMDQsICZwaGFzZTI0X3Nlcmllc19zcGVjKSwKKwlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9URVJSQVRFQywgMHgwMDAwMDAwNCwgJnlhbWFoYV90ZXJyYXRlY19zcGVjKSwKIAkvKiBUZXJyYVRlYyBFbGVjdHJvbmljIEdtYkgsIFBoYXNlIFgyNCBGVyAqLwotCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX1RFUlJBVEVDLCAweDAwMDAwMDA3LCAmcGhhc2UyNF9zZXJpZXNfc3BlYyksCisJU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fVEVSUkFURUMsIDB4MDAwMDAwMDcsICZ5YW1haGFfdGVycmF0ZWNfc3BlYyksCiAJLyogVGVycmFUZWMgRWxlY3Ryb25pYyBHbWJILCBFV1MgTUlDMi9NSUM4ICovCiAJU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fVEVSUkFURUMsIDB4MDAwMDAwMDUsICZzcGVjX25vcm1hbCksCiAJLyogVGVycmF0ZWMgRWxlY3Ryb25pYyBHbWJILCBBdXJlb24gNy4xIEZpcmV3aXJlICovCiAJU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fVEVSUkFURUMsIDB4MDAwMDAwMDIsICZzcGVjX25vcm1hbCksCiAJLyogWWFtYWhhLCBHTzQ0ICovCi0JU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fWUFNQUhBLCAweDAwMTAwMDBiLCAmeWFtYWhhX2dvX3NwZWMpLAorCVNORF9CRUJPQl9ERVZfRU5UUlkoVkVOX1lBTUFIQSwgMHgwMDEwMDAwYiwgJnlhbWFoYV90ZXJyYXRlY19zcGVjKSwKIAkvKiBZQU1BSEEsIEdPNDYgKi8KLQlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9ZQU1BSEEsIDB4MDAxMDAwMGMsICZ5YW1haGFfZ29fc3BlYyksCisJU05EX0JFQk9CX0RFVl9FTlRSWShWRU5fWUFNQUhBLCAweDAwMTAwMDBjLCAmeWFtYWhhX3RlcnJhdGVjX3NwZWMpLAogCS8qIEZvY3Vzcml0ZSwgU2FmZmlyZVBybyAyNiBJL08gKi8KIAlTTkRfQkVCT0JfREVWX0VOVFJZKFZFTl9GT0NVU1JJVEUsIDB4MDAwMDAwMDMsICZzYWZmaXJlcHJvXzI2X3NwZWMpLAogCS8qIEZvY3Vzcml0ZSwgU2FmZmlyZVBybyAxMCBJL08gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iLmggYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYi5oCmluZGV4IGU3ZjFiYjkuLjE3NWRhODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iLmgKKysrIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2IuaApAQCAtMjM1LDggKzIzNSw3IEBACiAKIC8qIG1vZGVsIHNwZWNpZmljIG9wZXJhdGlvbnMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3NwZWMgcGhhc2U4OF9yYWNrX3NwZWM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9zcGVjIHBoYXNlMjRfc2VyaWVzX3NwZWM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9zcGVjIHlhbWFoYV9nb19zcGVjOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfYmVib2Jfc3BlYyB5YW1haGFfdGVycmF0ZWNfc3BlYzsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3NwZWMgc2FmZmlyZXByb18yNl9zcGVjOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzbmRfYmVib2Jfc3BlYyBzYWZmaXJlcHJvXzEwX3NwZWM7CiBleHRlcm4gY29uc3Qgc3RydWN0IHNuZF9iZWJvYl9zcGVjIHNhZmZpcmVfbGVfc3BlYzsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3RlcnJhdGVjLmMgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl90ZXJyYXRlYy5jCmluZGV4IGMzODM1OGIuLjJmZGFmOTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3RlcnJhdGVjLmMKKysrIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfdGVycmF0ZWMuYwpAQCAtMzYsMjUgKzM2LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgZW51bSBzbmRfYmVib2JfY2xvY2tfdHlwZSBwaGFzZTI0X3Nlcmllc19jbGtfc3JjX3R5cGVzW10gPSB7Ci0JU05EX0JFQk9CX0NMT0NLX1RZUEVfSU5URVJOQUwsCi0JU05EX0JFQk9CX0NMT0NLX1RZUEVfRVhURVJOQUwsCS8qIFMvUERJRiAqLwotfTsKLXN0YXRpYyBpbnQKLXBoYXNlMjRfc2VyaWVzX2Nsa19zcmNfZ2V0KHN0cnVjdCBzbmRfYmVib2IgKmJlYm9iLCB1bnNpZ25lZCBpbnQgKmlkKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBhdmNfYXVkaW9fZ2V0X3NlbGVjdG9yKGJlYm9iLT51bml0LCAwLCA0LCBpZCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlpZiAoKmlkID49IEFSUkFZX1NJWkUocGhhc2UyNF9zZXJpZXNfY2xrX3NyY190eXBlcykpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3JhdGVfc3BlYyBwaGFzZV9zZXJpZXNfcmF0ZV9zcGVjID0gewogCS5nZXQJPSAmc25kX2JlYm9iX3N0cmVhbV9nZXRfcmF0ZSwKIAkuc2V0CT0gJnNuZF9iZWJvYl9zdHJlYW1fc2V0X3JhdGUsCkBAIC03MSwxNSArNTIsMyBAQAogCS5yYXRlCT0gJnBoYXNlX3Nlcmllc19yYXRlX3NwZWMsCiAJLm1ldGVyCT0gTlVMTAogfTsKLQotLyogJ1BIQVNFIDI0IEZXJyBhbmQgJ1BIQVNFIFgyNCBGVycgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX2Nsb2NrX3NwZWMgcGhhc2UyNF9zZXJpZXNfY2xrID0gewotCS5udW0JPSBBUlJBWV9TSVpFKHBoYXNlMjRfc2VyaWVzX2Nsa19zcmNfdHlwZXMpLAotCS50eXBlcwk9IHBoYXNlMjRfc2VyaWVzX2Nsa19zcmNfdHlwZXMsCi0JLmdldAk9ICZwaGFzZTI0X3Nlcmllc19jbGtfc3JjX2dldCwKLX07Ci1jb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX3NwZWMgcGhhc2UyNF9zZXJpZXNfc3BlYyA9IHsKLQkuY2xvY2sJPSAmcGhhc2UyNF9zZXJpZXNfY2xrLAotCS5yYXRlCT0gJnBoYXNlX3Nlcmllc19yYXRlX3NwZWMsCi0JLm1ldGVyCT0gTlVMTAotfTsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3lhbWFoYS5jIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfeWFtYWhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZDQ0MDQuLjAwMDAwMDAKLS0tIGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfeWFtYWhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogYmVib2JfeWFtYWhhLmMgLSBhIHBhcnQgb2YgZHJpdmVyIGZvciBCZUJvQiBiYXNlZCBkZXZpY2VzCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgVGFrYXNoaSBTYWthbW90bwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KLSAqLwotCi0jaW5jbHVkZSAiLi9iZWJvYi5oIgotCi0vKgotICogTk9URToKLSAqIFlhbWFoYSBHTzQ0IGlzIG5vdCBkZXNpZ25lZCB0byBiZSB1c2VkIGFzIHN0YW5kLWFsb25lIG1peGVyLiBTbyBhbnkgc3RyZWFtcwotICogbXVzdCBiZSBhY2NvbXBhbmllZC4gSWYgY2hhbmdpbmcgdGhlIHN0YXRlLCBhIExFRCBvbiB0aGUgZGV2aWNlIHN0YXJ0cyB0bwotICogYmxpbmsgYW5kIGl0cyBzeW5jIHN0YXR1cyBpcyBmYWxzZS4gSW4gdGhpcyBzdGF0ZSwgdGhlIGRldmljZSBzb3VuZHMgbm90aGluZwotICogZXZlbiBpZiBzdHJlYW1pbmcuIFRvIHN0YXJ0IHN0cmVhbWluZyBhdCB0aGUgY3VycmVudCBzYW1wbGluZyByYXRlIGlzIG9ubHkKLSAqIHdheSB0byByZXZvY2VyIHRoaXMgc3RhdGUuIEdPNDYgaXMgYmV0dGVyIGZvciBzdGFuZC1hbG9uZSBtaXhlci4KLSAqCi0gKiBCb3RoIG9mIHRoZW0gaGF2ZSBhIGNhcGFiaWxpdHkgdG8gY2hhbmdlIGl0cyBzYW1wbGluZyByYXRlIHVwIHRvIDE5Mi4wa0h6LgotICogQXQgMTkyLjBrSHosIHRoZSBkZXZpY2UgcmVwb3J0cyA0IFBDTS1pbiwgMSBNSURJLWluLCA2IFBDTS1vdXQsIDEgTUlESS1vdXQuCi0gKiBCdXQgWWFtYWhhJ3MgZHJpdmVyIHJlZHVjZSAyIFBDTS1pbiwgMSBNSURJLWluLCAyIFBDTS1vdXQsIDEgTUlESS1vdXQgdG8gdXNlCi0gKiAnRXh0ZW5kZWQgU3RyZWFtIEZvcm1hdCBJbmZvcm1hdGlvbiBDb21tYW5kIC0gU2luZ2xlIFJlcXVlc3QnIGluICdBZGRpdGlvbmFsCi0gKiBBVkMgY29tbWFuZHMnIGRlZmluZWQgYnkgQnJpZGdlQ28uCi0gKiBUaGlzIEFMU0EgZHJpdmVyIGRvbid0IGRvIHRoaXMgYmVjYXVzZSBhIGJpdCB0aXJlc29tZS4gVGhlbiBpc29jaHJvbm91cwotICogc3RyZWFtaW5nIHdpdGggbWFueSBhc3luY2hyb25vdXMgdHJhbnNhY3Rpb25zIGJyaW5ncyBzb3VuZHMgd2l0aCBub2lzZXMuCi0gKiBVbmZvcnR1bmF0ZWx5IGN1cnJlbnQgJ2ZmYWRvLW1peGVyJyBnZW5lcmF0ZWQgbWFueSBhc3luY2hyb25vdXMgdHJhbnNhY3Rpb24KLSAqIHRvIG9ic2VydmUgZGV2aWNlJ3Mgc3RhdGUsIG1haW5seSBjaGVjayBjbXAgY29ubmVjdGlvbiBhbmQgc2lnbmFsIGZvcm1hdC4gSQotICogcmVjY29tZW5kIHVzZXJzIHRvIGNsb3NlIGZmYWRvLW1peGVyIGF0IDE5Mi4wa0h6IGlmIG1peGVyIGlzIG5lZWRsZXNzLgotICovCi0KLXN0YXRpYyBlbnVtIHNuZF9iZWJvYl9jbG9ja190eXBlIGNsa19zcmNfdHlwZXNbXSA9IHsKLQlTTkRfQkVCT0JfQ0xPQ0tfVFlQRV9JTlRFUk5BTCwKLQlTTkRfQkVCT0JfQ0xPQ0tfVFlQRV9FWFRFUk5BTCwJLyogUy9QRElGICovCi19Owotc3RhdGljIGludAotY2xrX3NyY19nZXQoc3RydWN0IHNuZF9iZWJvYiAqYmVib2IsIHVuc2lnbmVkIGludCAqaWQpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IGF2Y19hdWRpb19nZXRfc2VsZWN0b3IoYmVib2ItPnVuaXQsIDAsIDQsIGlkKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCWlmICgqaWQgPj0gQVJSQVlfU0laRShjbGtfc3JjX3R5cGVzKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX2Nsb2NrX3NwZWMgY2xvY2tfc3BlYyA9IHsKLQkubnVtCT0gQVJSQVlfU0laRShjbGtfc3JjX3R5cGVzKSwKLQkudHlwZXMJPSBjbGtfc3JjX3R5cGVzLAotCS5nZXQJPSAmY2xrX3NyY19nZXQsCi19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYmVib2JfcmF0ZV9zcGVjIHJhdGVfc3BlYyA9IHsKLQkuZ2V0CT0gJnNuZF9iZWJvYl9zdHJlYW1fZ2V0X3JhdGUsCi0JLnNldAk9ICZzbmRfYmVib2Jfc3RyZWFtX3NldF9yYXRlLAotfTsKLWNvbnN0IHN0cnVjdCBzbmRfYmVib2Jfc3BlYyB5YW1haGFfZ29fc3BlYyA9IHsKLQkuY2xvY2sJPSAmY2xvY2tfc3BlYywKLQkucmF0ZQk9ICZyYXRlX3NwZWMsCi0JLm1ldGVyCT0gTlVMTAotfTsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3lhbWFoYV90ZXJyYXRlYy5jIGIvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfeWFtYWhhX3RlcnJhdGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZiZTNlNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2JlYm9iL2JlYm9iX3lhbWFoYV90ZXJyYXRlYy5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBiZWJvYl95YW1haGEuYyAtIGEgcGFydCBvZiBkcml2ZXIgZm9yIEJlQm9CIGJhc2VkIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBUYWthc2hpIFNha2Ftb3RvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorICovCisKKyNpbmNsdWRlICIuL2JlYm9iLmgiCisKKy8qCisgKiBOT1RFOgorICogWWFtYWhhIEdPNDQgaXMgbm90IGRlc2lnbmVkIHRvIGJlIHVzZWQgYXMgc3RhbmQtYWxvbmUgbWl4ZXIuIFNvIGFueSBzdHJlYW1zCisgKiBtdXN0IGJlIGFjY29tcGFuaWVkLiBJZiBjaGFuZ2luZyB0aGUgc3RhdGUsIGEgTEVEIG9uIHRoZSBkZXZpY2Ugc3RhcnRzIHRvCisgKiBibGluayBhbmQgaXRzIHN5bmMgc3RhdHVzIGlzIGZhbHNlLiBJbiB0aGlzIHN0YXRlLCB0aGUgZGV2aWNlIHNvdW5kcyBub3RoaW5nCisgKiBldmVuIGlmIHN0cmVhbWluZy4gVG8gc3RhcnQgc3RyZWFtaW5nIGF0IHRoZSBjdXJyZW50IHNhbXBsaW5nIHJhdGUgaXMgb25seQorICogd2F5IHRvIHJlY292ZXIgdGhpcyBzdGF0ZS4gR080NiBpcyBiZXR0ZXIgZm9yIHN0YW5kLWFsb25lIG1peGVyLgorICoKKyAqIEJvdGggb2YgdGhlbSBoYXZlIGEgY2FwYWJpbGl0eSB0byBjaGFuZ2UgaXRzIHNhbXBsaW5nIHJhdGUgdXAgdG8gMTkyLjBrSHouCisgKiBBdCAxOTIuMGtIeiwgdGhlIGRldmljZSByZXBvcnRzIDQgUENNLWluLCAxIE1JREktaW4sIDYgUENNLW91dCwgMSBNSURJLW91dC4KKyAqIEJ1dCBZYW1haGEncyBkcml2ZXIgcmVkdWNlIDIgUENNLWluLCAxIE1JREktaW4sIDIgUENNLW91dCwgMSBNSURJLW91dCB0byB1c2UKKyAqICdFeHRlbmRlZCBTdHJlYW0gRm9ybWF0IEluZm9ybWF0aW9uIENvbW1hbmQgLSBTaW5nbGUgUmVxdWVzdCcgaW4gJ0FkZGl0aW9uYWwKKyAqIEFWQyBjb21tYW5kcycgZGVmaW5lZCBieSBCcmlkZ2VDby4KKyAqIFRoaXMgQUxTQSBkcml2ZXIgZG9uJ3QgZG8gdGhpcyBiZWNhdXNlIGEgYml0IHRpcmVzb21lLiBUaGVuIGlzb2Nocm9ub3VzCisgKiBzdHJlYW1pbmcgd2l0aCBtYW55IGFzeW5jaHJvbm91cyB0cmFuc2FjdGlvbnMgYnJpbmdzIHNvdW5kcyB3aXRoIG5vaXNlcy4KKyAqIFVuZm9ydHVuYXRlbHkgY3VycmVudCAnZmZhZG8tbWl4ZXInIGdlbmVyYXRlZCBtYW55IGFzeW5jaHJvbm91cyB0cmFuc2FjdGlvbgorICogdG8gb2JzZXJ2ZSBkZXZpY2UncyBzdGF0ZSwgbWFpbmx5IGNoZWNrIGNtcCBjb25uZWN0aW9uIGFuZCBzaWduYWwgZm9ybWF0LiBJCisgKiByZWNvbW1lbmQgdXNlcnMgdG8gY2xvc2UgZmZhZG8tbWl4ZXIgYXQgMTkyLjBrSHogaWYgbWl4ZXIgaXMgbmVlZGxlc3MuCisgKgorICogVGVycmF0ZWMgUEhBU0UgMjQgRlcgYW5kIFBIQVNFIFgyNCBGVyBhcmUgaW50ZXJuYWxseSB0aGUgc2FtZSBhcworICogWWFtYWhhIEdPIDQ0IGFuZCBHTyA0Ni4gWWFtYWhhIGFuZCBUZXJyYXRlYyBoYWQgY29vcGVyYXRlZCBmb3IgdGhlc2UgbW9kZWxzLgorICovCisKK3N0YXRpYyBlbnVtIHNuZF9iZWJvYl9jbG9ja190eXBlIGNsa19zcmNfdHlwZXNbXSA9IHsKKwlTTkRfQkVCT0JfQ0xPQ0tfVFlQRV9JTlRFUk5BTCwKKwlTTkRfQkVCT0JfQ0xPQ0tfVFlQRV9FWFRFUk5BTCwJLyogUy9QRElGICovCit9Oworc3RhdGljIGludAorY2xrX3NyY19nZXQoc3RydWN0IHNuZF9iZWJvYiAqYmVib2IsIHVuc2lnbmVkIGludCAqaWQpCit7CisJaW50IGVycjsKKworCWVyciA9IGF2Y19hdWRpb19nZXRfc2VsZWN0b3IoYmVib2ItPnVuaXQsIDAsIDQsIGlkKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICgqaWQgPj0gQVJSQVlfU0laRShjbGtfc3JjX3R5cGVzKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2JlYm9iX2Nsb2NrX3NwZWMgY2xvY2tfc3BlYyA9IHsKKwkubnVtCT0gQVJSQVlfU0laRShjbGtfc3JjX3R5cGVzKSwKKwkudHlwZXMJPSBjbGtfc3JjX3R5cGVzLAorCS5nZXQJPSAmY2xrX3NyY19nZXQsCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYmVib2JfcmF0ZV9zcGVjIHJhdGVfc3BlYyA9IHsKKwkuZ2V0CT0gJnNuZF9iZWJvYl9zdHJlYW1fZ2V0X3JhdGUsCisJLnNldAk9ICZzbmRfYmVib2Jfc3RyZWFtX3NldF9yYXRlLAorfTsKK2NvbnN0IHN0cnVjdCBzbmRfYmVib2Jfc3BlYyB5YW1haGFfdGVycmF0ZWNfc3BlYyA9IHsKKwkuY2xvY2sJPSAmY2xvY2tfc3BlYywKKwkucmF0ZQk9ICZyYXRlX3NwZWMsCisJLm1ldGVyCT0gTlVMTAorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2RpY2UvZGljZS1wY20uYyBiL3NvdW5kL2ZpcmV3aXJlL2RpY2UvZGljZS1wY20uYwppbmRleCA0YWEwMjQ5Li42MDc0ZmUxIDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9kaWNlL2RpY2UtcGNtLmMKKysrIGIvc291bmQvZmlyZXdpcmUvZGljZS9kaWNlLXBjbS5jCkBAIC0zMDIsNyArMzAyLDcgQEAKIAogaW50IHNuZF9kaWNlX2NyZWF0ZV9wY20oc3RydWN0IHNuZF9kaWNlICpkaWNlKQogewotCXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgY2FwdHVyZV9vcHMgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBjYXB0dXJlX29wcyA9IHsKIAkJLm9wZW4gICAgICA9IHBjbV9vcGVuLAogCQkuY2xvc2UgICAgID0gcGNtX2Nsb3NlLAogCQkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC0zMTQsNyArMzE0LDcgQEAKIAkJLnBhZ2UgICAgICA9IHNuZF9wY21fbGliX2dldF92bWFsbG9jX3BhZ2UsCiAJCS5tbWFwICAgICAgPSBzbmRfcGNtX2xpYl9tbWFwX3ZtYWxsb2MsCiAJfTsKLQlzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHBsYXliYWNrX29wcyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHBsYXliYWNrX29wcyA9IHsKIAkJLm9wZW4gICAgICA9IHBjbV9vcGVuLAogCQkuY2xvc2UgICAgID0gcGNtX2Nsb3NlLAogCQkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9kaWdpMDB4L2RpZ2kwMHgtcGNtLmMgYi9zb3VuZC9maXJld2lyZS9kaWdpMDB4L2RpZ2kwMHgtcGNtLmMKaW5kZXggY2FjMjhmNy4uNjEzZjA1OCAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvZGlnaTAweC9kaWdpMDB4LXBjbS5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2RpZ2kwMHgvZGlnaTAweC1wY20uYwpAQCAtMzI5LDcgKzMyOSw3IEBACiAJcmV0dXJuIGFtZHRwX3N0cmVhbV9wY21fcG9pbnRlcigmZGcwMHgtPnJ4X3N0cmVhbSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGNtX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBwY21fY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4JCT0gcGNtX29wZW4sCiAJLmNsb3NlCQk9IHBjbV9jbG9zZSwKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC0zNDEsNyArMzQxLDcgQEAKIAkucGFnZQkJPSBzbmRfcGNtX2xpYl9nZXRfdm1hbGxvY19wYWdlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBwY21fcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBwY21fcGxheWJhY2tfb3BzID0gewogCS5vcGVuCQk9IHBjbV9vcGVuLAogCS5jbG9zZQkJPSBwY21fY2xvc2UsCiAJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrcy5oIGIvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrcy5oCmluZGV4IDAzZWQzNTIuLmQ3M2MxMmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3MuaAorKysgYi9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzLmgKQEAgLTEwOCw3ICsxMDgsNiBAQAogCXU4ICpyZXNwX2J1ZjsKIAl1OCAqcHVsbF9wdHI7CiAJdTggKnB1c2hfcHRyOwotCXVuc2lnbmVkIGludCByZXNwX3F1ZXVlczsKIH07CiAKIGludCBzbmRfZWZ3X3RyYW5zYWN0aW9uX2NtZChzdHJ1Y3QgZndfdW5pdCAqdW5pdCwKZGlmZiAtLWdpdCBhL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfaHdkZXAuYyBiL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfaHdkZXAuYwppbmRleCAzM2RmODY1Li4yZTFkOWEyIDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX2h3ZGVwLmMKKysrIGIvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc19od2RlcC5jCkBAIC0yNSw2ICsyNSw3IEBACiB7CiAJdW5zaWduZWQgaW50IGxlbmd0aCwgdGlsbF9lbmQsIHR5cGU7CiAJc3RydWN0IHNuZF9lZndfdHJhbnNhY3Rpb24gKnQ7CisJdTggKnB1bGxfcHRyOwogCWxvbmcgY291bnQgPSAwOwogCiAJaWYgKHJlbWFpbmVkIDwgc2l6ZW9mKHR5cGUpICsgc2l6ZW9mKHN0cnVjdCBzbmRfZWZ3X3RyYW5zYWN0aW9uKSkKQEAgLTM4LDggKzM5LDE3IEBACiAJYnVmICs9IHNpemVvZih0eXBlKTsKIAogCS8qIHdyaXRlIGludG8gYnVmZmVyIGFzIG1hbnkgcmVzcG9uc2VzIGFzIHBvc3NpYmxlICovCi0Jd2hpbGUgKGVmdy0+cmVzcF9xdWV1ZXMgPiAwKSB7Ci0JCXQgPSAoc3RydWN0IHNuZF9lZndfdHJhbnNhY3Rpb24gKikoZWZ3LT5wdWxsX3B0cik7CisJc3Bpbl9sb2NrX2lycSgmZWZ3LT5sb2NrKTsKKworCS8qCisJICogV2hlbiBhbm90aGVyIHRhc2sgcmVhY2hlcyBoZXJlIGR1cmluZyB0aGlzIHRhc2sncyBhY2Nlc3MgdG8gdXNlcgorCSAqIHNwYWNlLCBpdCBwaWNrcyB1cCBjdXJyZW50IHBvc2l0aW9uIGluIGJ1ZmZlciBhbmQgY2FuIHJlYWQgdGhlIHNhbWUKKwkgKiBzZXJpZXMgb2YgcmVzcG9uc2VzLgorCSAqLworCXB1bGxfcHRyID0gZWZ3LT5wdWxsX3B0cjsKKworCXdoaWxlIChlZnctPnB1c2hfcHRyICE9IHB1bGxfcHRyKSB7CisJCXQgPSAoc3RydWN0IHNuZF9lZndfdHJhbnNhY3Rpb24gKikocHVsbF9wdHIpOwogCQlsZW5ndGggPSBiZTMyX3RvX2NwdSh0LT5sZW5ndGgpICogc2l6ZW9mKF9fYmUzMik7CiAKIAkJLyogY29uZmlybSBlbm91Z2ggc3BhY2UgZm9yIHRoaXMgcmVzcG9uc2UgKi8KQEAgLTQ5LDI2ICs1OSwzOSBAQAogCQkvKiBjb3B5IGZyb20gcmluZyBidWZmZXIgdG8gdXNlciBidWZmZXIgKi8KIAkJd2hpbGUgKGxlbmd0aCA+IDApIHsKIAkJCXRpbGxfZW5kID0gc25kX2Vmd19yZXNwX2J1Zl9zaXplIC0KLQkJCQkodW5zaWduZWQgaW50KShlZnctPnB1bGxfcHRyIC0gZWZ3LT5yZXNwX2J1Zik7CisJCQkJKHVuc2lnbmVkIGludCkocHVsbF9wdHIgLSBlZnctPnJlc3BfYnVmKTsKIAkJCXRpbGxfZW5kID0gbWluX3QodW5zaWduZWQgaW50LCBsZW5ndGgsIHRpbGxfZW5kKTsKIAotCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGVmdy0+cHVsbF9wdHIsIHRpbGxfZW5kKSkKKwkJCXNwaW5fdW5sb2NrX2lycSgmZWZ3LT5sb2NrKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIHB1bGxfcHRyLCB0aWxsX2VuZCkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCWVmdy0+cHVsbF9wdHIgKz0gdGlsbF9lbmQ7Ci0JCQlpZiAoZWZ3LT5wdWxsX3B0ciA+PSBlZnctPnJlc3BfYnVmICsKLQkJCQkJICAgICBzbmRfZWZ3X3Jlc3BfYnVmX3NpemUpCi0JCQkJZWZ3LT5wdWxsX3B0ciAtPSBzbmRfZWZ3X3Jlc3BfYnVmX3NpemU7CisJCQlzcGluX2xvY2tfaXJxKCZlZnctPmxvY2spOworCisJCQlwdWxsX3B0ciArPSB0aWxsX2VuZDsKKwkJCWlmIChwdWxsX3B0ciA+PSBlZnctPnJlc3BfYnVmICsgc25kX2Vmd19yZXNwX2J1Zl9zaXplKQorCQkJCXB1bGxfcHRyIC09IHNuZF9lZndfcmVzcF9idWZfc2l6ZTsKIAogCQkJbGVuZ3RoIC09IHRpbGxfZW5kOwogCQkJYnVmICs9IHRpbGxfZW5kOwogCQkJY291bnQgKz0gdGlsbF9lbmQ7CiAJCQlyZW1haW5lZCAtPSB0aWxsX2VuZDsKIAkJfQotCi0JCWVmdy0+cmVzcF9xdWV1ZXMtLTsKIAl9CiAKKwkvKgorCSAqIEFsbCBvZiB0YXNrcyBjYW4gcmVhZCBmcm9tIHRoZSBidWZmZXIgbmVhcmx5IHNpbXVsdGFuZW91c2x5LCBidXQgdGhlCisJICogbGFzdCBwb3NpdGlvbiBmb3IgZWFjaCB0YXNrIGlzIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIGxlbmd0aCBvZgorCSAqIGdpdmVuIGJ1ZmZlci4gSGVyZSwgZm9yIHNpbXBsaWNpdHksIGEgcG9zaXRpb24gb2YgYnVmZmVyIGlzIHNldCBieQorCSAqIHRoZSBsYXRlc3QgdGFzay4gSXQncyBiZXR0ZXIgZm9yIGEgbGlzdGVuaW5nIGFwcGxpY2F0aW9uIHRvIGFsbG93IG9uZQorCSAqIHRocmVhZCB0byByZWFkIGZyb20gdGhlIGJ1ZmZlci4gVW5sZXNzLCBlYWNoIHRhc2sgY2FuIHJlYWQgZGlmZmVyZW50CisJICogc2VxdWVuY2Ugb2YgcmVzcG9uc2VzIGRlcGVuZGluZyBvbiB2YXJpYXRpb24gb2YgYnVmZmVyIGxlbmd0aC4KKwkgKi8KKwllZnctPnB1bGxfcHRyID0gcHVsbF9wdHI7CisKKwlzcGluX3VubG9ja19pcnEoJmVmdy0+bG9jayk7CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTc2LDE0ICs5OSwxNyBAQAogaHdkZXBfcmVhZF9sb2NrZWQoc3RydWN0IHNuZF9lZncgKmVmdywgY2hhciBfX3VzZXIgKmJ1ZiwgbG9uZyBjb3VudCwKIAkJICBsb2ZmX3QgKm9mZnNldCkKIHsKLQl1bmlvbiBzbmRfZmlyZXdpcmVfZXZlbnQgZXZlbnQ7CisJdW5pb24gc25kX2ZpcmV3aXJlX2V2ZW50IGV2ZW50ID0geworCQkubG9ja19zdGF0dXMudHlwZSA9IFNORFJWX0ZJUkVXSVJFX0VWRU5UX0xPQ0tfU1RBVFVTLAorCX07CiAKLQltZW1zZXQoJmV2ZW50LCAwLCBzaXplb2YoZXZlbnQpKTsKKwlzcGluX2xvY2tfaXJxKCZlZnctPmxvY2spOwogCi0JZXZlbnQubG9ja19zdGF0dXMudHlwZSA9IFNORFJWX0ZJUkVXSVJFX0VWRU5UX0xPQ0tfU1RBVFVTOwogCWV2ZW50LmxvY2tfc3RhdHVzLnN0YXR1cyA9IChlZnctPmRldl9sb2NrX2NvdW50ID4gMCk7CiAJZWZ3LT5kZXZfbG9ja19jaGFuZ2VkID0gZmFsc2U7CiAKKwlzcGluX3VubG9ja19pcnEoJmVmdy0+bG9jayk7CisKIAljb3VudCA9IG1pbl90KGxvbmcsIGNvdW50LCBzaXplb2YoZXZlbnQubG9ja19zdGF0dXMpKTsKIAogCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmZXZlbnQsIGNvdW50KSkKQEAgLTk4LDEwICsxMjQsMTUgQEAKIHsKIAlzdHJ1Y3Qgc25kX2VmdyAqZWZ3ID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKIAlERUZJTkVfV0FJVCh3YWl0KTsKKwlib29sIGRldl9sb2NrX2NoYW5nZWQ7CisJYm9vbCBxdWV1ZWQ7CiAKIAlzcGluX2xvY2tfaXJxKCZlZnctPmxvY2spOwogCi0Jd2hpbGUgKCghZWZ3LT5kZXZfbG9ja19jaGFuZ2VkKSAmJiAoZWZ3LT5yZXNwX3F1ZXVlcyA9PSAwKSkgeworCWRldl9sb2NrX2NoYW5nZWQgPSBlZnctPmRldl9sb2NrX2NoYW5nZWQ7CisJcXVldWVkID0gZWZ3LT5wdXNoX3B0ciAhPSBlZnctPnB1bGxfcHRyOworCisJd2hpbGUgKCFkZXZfbG9ja19jaGFuZ2VkICYmICFxdWV1ZWQpIHsKIAkJcHJlcGFyZV90b193YWl0KCZlZnctPmh3ZGVwX3dhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlzcGluX3VubG9ja19pcnEoJmVmdy0+bG9jayk7CiAJCXNjaGVkdWxlKCk7CkBAIC0xMDksMTUgKzE0MCwxNyBAQAogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCQlzcGluX2xvY2tfaXJxKCZlZnctPmxvY2spOworCQlkZXZfbG9ja19jaGFuZ2VkID0gZWZ3LT5kZXZfbG9ja19jaGFuZ2VkOworCQlxdWV1ZWQgPSBlZnctPnB1c2hfcHRyICE9IGVmdy0+cHVsbF9wdHI7CiAJfQogCi0JaWYgKGVmdy0+ZGV2X2xvY2tfY2hhbmdlZCkKLQkJY291bnQgPSBod2RlcF9yZWFkX2xvY2tlZChlZncsIGJ1ZiwgY291bnQsIG9mZnNldCk7Ci0JZWxzZSBpZiAoZWZ3LT5yZXNwX3F1ZXVlcyA+IDApCi0JCWNvdW50ID0gaHdkZXBfcmVhZF9yZXNwX2J1ZihlZncsIGJ1ZiwgY291bnQsIG9mZnNldCk7Ci0KIAlzcGluX3VubG9ja19pcnEoJmVmdy0+bG9jayk7CiAKKwlpZiAoZGV2X2xvY2tfY2hhbmdlZCkKKwkJY291bnQgPSBod2RlcF9yZWFkX2xvY2tlZChlZncsIGJ1ZiwgY291bnQsIG9mZnNldCk7CisJZWxzZSBpZiAocXVldWVkKQorCQljb3VudCA9IGh3ZGVwX3JlYWRfcmVzcF9idWYoZWZ3LCBidWYsIGNvdW50LCBvZmZzZXQpOworCiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0xNjAsNyArMTkzLDcgQEAKIAlwb2xsX3dhaXQoZmlsZSwgJmVmdy0+aHdkZXBfd2FpdCwgd2FpdCk7CiAKIAlzcGluX2xvY2tfaXJxKCZlZnctPmxvY2spOwotCWlmIChlZnctPmRldl9sb2NrX2NoYW5nZWQgfHwgKGVmdy0+cmVzcF9xdWV1ZXMgPiAwKSkKKwlpZiAoZWZ3LT5kZXZfbG9ja19jaGFuZ2VkIHx8IGVmdy0+cHVsbF9wdHIgIT0gZWZ3LT5wdXNoX3B0cikKIAkJZXZlbnRzID0gUE9MTElOIHwgUE9MTFJETk9STTsKIAllbHNlCiAJCWV2ZW50cyA9IDA7CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX3Byb2MuYyBiL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfcHJvYy5jCmluZGV4IDA2MzlkY2IuLmJlYjBhMGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfcHJvYy5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfcHJvYy5jCkBAIC0xODgsOCArMTg4LDggQEAKIAllbHNlCiAJCWNvbnN1bWVkID0gKHVuc2lnbmVkIGludCkoZWZ3LT5wdXNoX3B0ciAtIGVmdy0+cHVsbF9wdHIpOwogCi0Jc25kX2lwcmludGYoYnVmZmVyLCAiJWQgJWQvJWRcbiIsCi0JCSAgICBlZnctPnJlc3BfcXVldWVzLCBjb25zdW1lZCwgc25kX2Vmd19yZXNwX2J1Zl9zaXplKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICIlZC8lZFxuIiwKKwkJICAgIGNvbnN1bWVkLCBzbmRfZWZ3X3Jlc3BfYnVmX3NpemUpOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc190cmFuc2FjdGlvbi5jIGIvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc190cmFuc2FjdGlvbi5jCmluZGV4IGY1NTA4MDguLjM2YTA4YmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfdHJhbnNhY3Rpb24uYworKysgYi9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX3RyYW5zYWN0aW9uLmMKQEAgLTEyMSwxMSArMTIxLDExIEBACiAJc2l6ZV90IGNhcGFjaXR5LCB0aWxsX2VuZDsKIAlzdHJ1Y3Qgc25kX2Vmd190cmFuc2FjdGlvbiAqdDsKIAotCXNwaW5fbG9ja19pcnEoJmVmdy0+bG9jayk7Ci0KIAl0ID0gKHN0cnVjdCBzbmRfZWZ3X3RyYW5zYWN0aW9uICopZGF0YTsKIAlsZW5ndGggPSBtaW5fdChzaXplX3QsIGJlMzJfdG9fY3B1KHQtPmxlbmd0aCkgKiBzaXplb2YodTMyKSwgbGVuZ3RoKTsKIAorCXNwaW5fbG9ja19pcnEoJmVmdy0+bG9jayk7CisKIAlpZiAoZWZ3LT5wdXNoX3B0ciA8IGVmdy0+cHVsbF9wdHIpCiAJCWNhcGFjaXR5ID0gKHVuc2lnbmVkIGludCkoZWZ3LT5wdWxsX3B0ciAtIGVmdy0+cHVzaF9wdHIpOwogCWVsc2UKQEAgLTE1NSw3ICsxNTUsNiBAQAogCX0KIAogCS8qIGZvciBod2RlcCAqLwotCWVmdy0+cmVzcF9xdWV1ZXMrKzsKIAl3YWtlX3VwKCZlZnctPmh3ZGVwX3dhaXQpOwogCiAJKnJjb2RlID0gUkNPREVfQ09NUExFVEU7CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9veGZ3L294ZnctcGNtLmMgYi9zb3VuZC9maXJld2lyZS9veGZ3L294ZnctcGNtLmMKaW5kZXggOGQyMzM0MS4uZjM1MzBmOCAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvb3hmdy9veGZ3LXBjbS5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL294Zncvb3hmdy1wY20uYwpAQCAtMzg4LDcgKzM4OCw3IEBACiAKIGludCBzbmRfb3hmd19jcmVhdGVfcGNtKHN0cnVjdCBzbmRfb3hmdyAqb3hmdykKIHsKLQlzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGNhcHR1cmVfb3BzID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgY2FwdHVyZV9vcHMgPSB7CiAJCS5vcGVuICAgICAgPSBwY21fb3BlbiwKIAkJLmNsb3NlICAgICA9IHBjbV9jbG9zZSwKIAkJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtNDAwLDcgKzQwMCw3IEBACiAJCS5wYWdlICAgICAgPSBzbmRfcGNtX2xpYl9nZXRfdm1hbGxvY19wYWdlLAogCQkubW1hcCAgICAgID0gc25kX3BjbV9saWJfbW1hcF92bWFsbG9jLAogCX07Ci0Jc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBwbGF5YmFja19vcHMgPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBwbGF5YmFja19vcHMgPSB7CiAJCS5vcGVuICAgICAgPSBwY21fb3BlbiwKIAkJLmNsb3NlICAgICA9IHBjbV9jbG9zZSwKIAkJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvdGFzY2FtL3Rhc2NhbS1od2RlcC5jIGIvc291bmQvZmlyZXdpcmUvdGFzY2FtL3Rhc2NhbS1od2RlcC5jCmluZGV4IDEzMTI2N2MuLjEwNjQwNmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL3Rhc2NhbS90YXNjYW0taHdkZXAuYworKysgYi9zb3VuZC9maXJld2lyZS90YXNjYW0vdGFzY2FtLWh3ZGVwLmMKQEAgLTE2LDMxICsxNiwxNCBAQAogCiAjaW5jbHVkZSAidGFzY2FtLmgiCiAKLXN0YXRpYyBsb25nIGh3ZGVwX3JlYWRfbG9ja2VkKHN0cnVjdCBzbmRfdHNjbSAqdHNjbSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgICAgIGxvbmcgY291bnQpCi17Ci0JdW5pb24gc25kX2ZpcmV3aXJlX2V2ZW50IGV2ZW50OwotCi0JbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKGV2ZW50KSk7Ci0KLQlldmVudC5sb2NrX3N0YXR1cy50eXBlID0gU05EUlZfRklSRVdJUkVfRVZFTlRfTE9DS19TVEFUVVM7Ci0JZXZlbnQubG9ja19zdGF0dXMuc3RhdHVzID0gKHRzY20tPmRldl9sb2NrX2NvdW50ID4gMCk7Ci0JdHNjbS0+ZGV2X2xvY2tfY2hhbmdlZCA9IGZhbHNlOwotCi0JY291bnQgPSBtaW5fdChsb25nLCBjb3VudCwgc2l6ZW9mKGV2ZW50LmxvY2tfc3RhdHVzKSk7Ci0KLQlpZiAoY29weV90b191c2VyKGJ1ZiwgJmV2ZW50LCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIGNvdW50OwotfQotCiBzdGF0aWMgbG9uZyBod2RlcF9yZWFkKHN0cnVjdCBzbmRfaHdkZXAgKmh3ZGVwLCBjaGFyIF9fdXNlciAqYnVmLCBsb25nIGNvdW50LAogCQkgICAgICAgbG9mZl90ICpvZmZzZXQpCiB7CiAJc3RydWN0IHNuZF90c2NtICp0c2NtID0gaHdkZXAtPnByaXZhdGVfZGF0YTsKIAlERUZJTkVfV0FJVCh3YWl0KTsKLQl1bmlvbiBzbmRfZmlyZXdpcmVfZXZlbnQgZXZlbnQ7CisJdW5pb24gc25kX2ZpcmV3aXJlX2V2ZW50IGV2ZW50ID0geworCQkubG9ja19zdGF0dXMudHlwZSA9IFNORFJWX0ZJUkVXSVJFX0VWRU5UX0xPQ0tfU1RBVFVTLAorCX07CiAKIAlzcGluX2xvY2tfaXJxKCZ0c2NtLT5sb2NrKTsKIApAQCAtNTQsMTAgKzM3LDE2IEBACiAJCXNwaW5fbG9ja19pcnEoJnRzY20tPmxvY2spOwogCX0KIAotCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOwotCWNvdW50ID0gaHdkZXBfcmVhZF9sb2NrZWQodHNjbSwgYnVmLCBjb3VudCk7CisJZXZlbnQubG9ja19zdGF0dXMuc3RhdHVzID0gKHRzY20tPmRldl9sb2NrX2NvdW50ID4gMCk7CisJdHNjbS0+ZGV2X2xvY2tfY2hhbmdlZCA9IGZhbHNlOworCiAJc3Bpbl91bmxvY2tfaXJxKCZ0c2NtLT5sb2NrKTsKIAorCWNvdW50ID0gbWluX3QobG9uZywgY291bnQsIHNpemVvZihldmVudC5sb2NrX3N0YXR1cykpOworCisJaWYgKGNvcHlfdG9fdXNlcihidWYsICZldmVudCwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwogCXJldHVybiBjb3VudDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvdGFzY2FtL3Rhc2NhbS1wY20uYyBiL3NvdW5kL2ZpcmV3aXJlL3Rhc2NhbS90YXNjYW0tcGNtLmMKaW5kZXggMzgwZDNkYi4uNzlkYjFiNiAxMDA2NDQKLS0tIGEvc291bmQvZmlyZXdpcmUvdGFzY2FtL3Rhc2NhbS1wY20uYworKysgYi9zb3VuZC9maXJld2lyZS90YXNjYW0vdGFzY2FtLXBjbS5jCkBAIC0yNjgsNyArMjY4LDcgQEAKIAlyZXR1cm4gYW1kdHBfc3RyZWFtX3BjbV9wb2ludGVyKCZ0c2NtLT5yeF9zdHJlYW0pOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHBjbV9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGNtX2NhcHR1cmVfb3BzID0gewogCS5vcGVuCQk9IHBjbV9vcGVuLAogCS5jbG9zZQkJPSBwY21fY2xvc2UsCiAJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtMjgwLDcgKzI4MCw3IEBACiAJLnBhZ2UJCT0gc25kX3BjbV9saWJfZ2V0X3ZtYWxsb2NfcGFnZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGNtX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGNtX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbgkJPSBwY21fb3BlbiwKIAkuY2xvc2UJCT0gcGNtX2Nsb3NlLAogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL2hkYS9leHQvaGRhY19leHRfY29udHJvbGxlci5jIGIvc291bmQvaGRhL2V4dC9oZGFjX2V4dF9jb250cm9sbGVyLmMKaW5kZXggODYwZjhjYS4uMjYxNDY5MSAxMDA2NDQKLS0tIGEvc291bmQvaGRhL2V4dC9oZGFjX2V4dF9jb250cm9sbGVyLmMKKysrIGIvc291bmQvaGRhL2V4dC9oZGFjX2V4dF9jb250cm9sbGVyLmMKQEAgLTI5LDgxICsyOSw2IEBACiAgKi8KICNkZWZpbmUgSERBQ19NQVhfQ0FQUyAxMAogCi0vKioKLSAqIHNuZF9oZGFjX2V4dF9idXNfcGFyc2VfY2FwYWJpbGl0aWVzIC0gcGFyc2UgY2FwYWJsaXR5IHN0cnVjdHVyZQotICogQGVidXM6IHRoZSBwb2ludGVyIHRvIGV4dGVuZGVkIGJ1cyBvYmplY3QKLSAqCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgotICovCi1pbnQgc25kX2hkYWNfZXh0X2J1c19wYXJzZV9jYXBhYmlsaXRpZXMoc3RydWN0IGhkYWNfZXh0X2J1cyAqZWJ1cykKLXsKLQl1bnNpZ25lZCBpbnQgY3VyX2NhcDsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0OwotCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gJmVidXMtPmJ1czsKLQl1bnNpZ25lZCBpbnQgY291bnRlciA9IDA7Ci0KLQlvZmZzZXQgPSBzbmRfaGRhY19jaGlwX3JlYWRsKGJ1cywgTExDSCk7Ci0KLQkvKiBMZXRzIHdhbGsgdGhlIGxpbmtlZCBjYXBhYmlsaXRpZXMgbGlzdCAqLwotCWRvIHsKLQkJY3VyX2NhcCA9IF9zbmRfaGRhY19jaGlwX3JlYWQobCwgYnVzLCBvZmZzZXQpOwotCi0JCWRldl9kYmcoYnVzLT5kZXYsICJDYXBhYmlsaXR5IHZlcnNpb246IDB4JXhcbiIsCi0JCQkJKChjdXJfY2FwICYgQVpYX0NBUF9IRFJfVkVSX01BU0spID4+IEFaWF9DQVBfSERSX1ZFUl9PRkYpKTsKLQotCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiSERBIGNhcGFiaWxpdHkgSUQ6IDB4JXhcbiIsCi0JCQkJKGN1cl9jYXAgJiBBWlhfQ0FQX0hEUl9JRF9NQVNLKSA+PiBBWlhfQ0FQX0hEUl9JRF9PRkYpOwotCi0JCXN3aXRjaCAoKGN1cl9jYXAgJiBBWlhfQ0FQX0hEUl9JRF9NQVNLKSA+PiBBWlhfQ0FQX0hEUl9JRF9PRkYpIHsKLQkJY2FzZSBBWlhfTUxfQ0FQX0lEOgotCQkJZGV2X2RiZyhidXMtPmRldiwgIkZvdW5kIE1MIGNhcGFiaWxpdHlcbiIpOwotCQkJZWJ1cy0+bWxjYXAgPSBidXMtPnJlbWFwX2FkZHIgKyBvZmZzZXQ7Ci0JCQlicmVhazsKLQotCQljYXNlIEFaWF9HVFNfQ0FQX0lEOgotCQkJZGV2X2RiZyhidXMtPmRldiwgIkZvdW5kIEdUUyBjYXBhYmlsaXR5IG9mZnNldD0leFxuIiwgb2Zmc2V0KTsKLQkJCWVidXMtPmd0c2NhcCA9IGJ1cy0+cmVtYXBfYWRkciArIG9mZnNldDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgQVpYX1BQX0NBUF9JRDoKLQkJCS8qIFBQIGNhcGFiaWxpdHkgZm91bmQsIHRoZSBBdWRpbyBEU1AgaXMgcHJlc2VudCAqLwotCQkJZGV2X2RiZyhidXMtPmRldiwgIkZvdW5kIFBQIGNhcGFiaWxpdHkgb2Zmc2V0PSV4XG4iLCBvZmZzZXQpOwotCQkJZWJ1cy0+cHBjYXAgPSBidXMtPnJlbWFwX2FkZHIgKyBvZmZzZXQ7Ci0JCQlicmVhazsKLQotCQljYXNlIEFaWF9TUEJfQ0FQX0lEOgotCQkJLyogU1BJQiBjYXBhYmlsaXR5IGZvdW5kLCBoYW5kbGVyIGZ1bmN0aW9uICovCi0JCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiRm91bmQgU1BCIGNhcGFiaWxpdHlcbiIpOwotCQkJZWJ1cy0+c3BiY2FwID0gYnVzLT5yZW1hcF9hZGRyICsgb2Zmc2V0OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBBWlhfRFJTTV9DQVBfSUQ6Ci0JCQkvKiBETUEgcmVzdW1lICBjYXBhYmlsaXR5IGZvdW5kLCBoYW5kbGVyIGZ1bmN0aW9uICovCi0JCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiRm91bmQgRFJTTSBjYXBhYmlsaXR5XG4iKTsKLQkJCWVidXMtPmRyc21jYXAgPSBidXMtPnJlbWFwX2FkZHIgKyBvZmZzZXQ7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZGV2X2RiZyhidXMtPmRldiwgIlVua25vd24gY2FwYWJpbGl0eSAlZFxuIiwgY3VyX2NhcCk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNvdW50ZXIrKzsKLQotCQlpZiAoY291bnRlciA+IEhEQUNfTUFYX0NBUFMpIHsKLQkJCWRldl9lcnIoYnVzLT5kZXYsICJXZSBleGNlZWRlZCBIREFDIEV4dCBjYXBhYmxpdGllcyEhIVxuIik7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIHJlYWQgdGhlIG9mZnNldCBvZiBuZXh0IGNhcGFiaWl0eSAqLwotCQlvZmZzZXQgPSBjdXJfY2FwICYgQVpYX0NBUF9IRFJfTlhUX1BUUl9NQVNLOwotCi0JfSB3aGlsZSAob2Zmc2V0KTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfZXh0X2J1c19wYXJzZV9jYXBhYmlsaXRpZXMpOwotCiAvKgogICogcHJvY2Vzc2luZyBwaXBlIGhlbHBlcnMgLSB0aGVzZSBoZWxwZXJzIGFyZSB1c2VmdWwgZm9yIGRlYWxpbmcgd2l0aCBIREEKICAqIG5ldyBjYXBhYmlsaXR5IG9mIHByb2Nlc3NpbmcgcGlwZWxpbmVzCkBAIC0xMTgsMTUgKzQzLDE1IEBACiB7CiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSAmZWJ1cy0+YnVzOwogCi0JaWYgKCFlYnVzLT5wcGNhcCkgeworCWlmICghYnVzLT5wcGNhcCkgewogCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBQUCBjYXBhYmlsaXR5IGlzIE5VTEwiKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChlbmFibGUpCi0JCXNuZF9oZGFjX3VwZGF0ZWwoZWJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsIDAsIEFaWF9QUENUTF9HUFJPQ0VOKTsKKwkJc25kX2hkYWNfdXBkYXRlbChidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLCAwLCBBWlhfUFBDVExfR1BST0NFTik7CiAJZWxzZQotCQlzbmRfaGRhY191cGRhdGVsKGVidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLCBBWlhfUFBDVExfR1BST0NFTiwgMCk7CisJCXNuZF9oZGFjX3VwZGF0ZWwoYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwgQVpYX1BQQ1RMX0dQUk9DRU4sIDApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfZXh0X2J1c19wcGNhcF9lbmFibGUpOwogCkBAIC0xMzksMTUgKzY0LDE1IEBACiB7CiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSAmZWJ1cy0+YnVzOwogCi0JaWYgKCFlYnVzLT5wcGNhcCkgeworCWlmICghYnVzLT5wcGNhcCkgewogCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBQUCBjYXBhYmlsaXR5IGlzIE5VTExcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKGVuYWJsZSkKLQkJc25kX2hkYWNfdXBkYXRlbChlYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwgMCwgQVpYX1BQQ1RMX1BJRSk7CisJCXNuZF9oZGFjX3VwZGF0ZWwoYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwgMCwgQVpYX1BQQ1RMX1BJRSk7CiAJZWxzZQotCQlzbmRfaGRhY191cGRhdGVsKGVidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLCBBWlhfUFBDVExfUElFLCAwKTsKKwkJc25kX2hkYWNfdXBkYXRlbChidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLCBBWlhfUFBDVExfUElFLCAwKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2V4dF9idXNfcHBjYXBfaW50X2VuYWJsZSk7CiAKQEAgLTE3MSw3ICs5Niw3IEBACiAJc3RydWN0IGhkYWNfZXh0X2xpbmsgKmhsaW5rOwogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gJmVidXMtPmJ1czsKIAotCWxpbmtfY291bnQgPSByZWFkbChlYnVzLT5tbGNhcCArIEFaWF9SRUdfTUxfTUxDRCkgKyAxOworCWxpbmtfY291bnQgPSByZWFkbChidXMtPm1sY2FwICsgQVpYX1JFR19NTF9NTENEKSArIDE7CiAKIAlkZXZfZGJnKGJ1cy0+ZGV2LCAiSW4gJXMgTGluayBjb3VudDogJWRcbiIsIF9fZnVuY19fLCBsaW5rX2NvdW50KTsKIApAQCAtMTgxLDcgKzEwNiw3IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJaGxpbmstPmluZGV4ID0gaWR4OwogCQlobGluay0+YnVzID0gYnVzOwotCQlobGluay0+bWxfYWRkciA9IGVidXMtPm1sY2FwICsgQVpYX01MX0JBU0UgKworCQlobGluay0+bWxfYWRkciA9IGJ1cy0+bWxjYXAgKyBBWlhfTUxfQkFTRSArCiAJCQkJCShBWlhfTUxfSU5URVJWQUwgKiBpZHgpOwogCQlobGluay0+bGNhcHMgID0gcmVhZGwoaGxpbmstPm1sX2FkZHIgKyBBWlhfUkVHX01MX0xDQVApOwogCQlobGluay0+bHNkaWlkID0gcmVhZHcoaGxpbmstPm1sX2FkZHIgKyBBWlhfUkVHX01MX0xTRElJRCk7CmRpZmYgLS1naXQgYS9zb3VuZC9oZGEvZXh0L2hkYWNfZXh0X3N0cmVhbS5jIGIvc291bmQvaGRhL2V4dC9oZGFjX2V4dF9zdHJlYW0uYwppbmRleCA2MjZmM2JiLi4zYmUwNTFhYjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2hkYS9leHQvaGRhY19leHRfc3RyZWFtLmMKKysrIGIvc291bmQvaGRhL2V4dC9oZGFjX2V4dF9zdHJlYW0uYwpAQCAtNDAsMjcgKzQwLDI3IEBACiB7CiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSAmZWJ1cy0+YnVzOwogCi0JaWYgKGVidXMtPnBwY2FwKSB7Ci0JCXN0cmVhbS0+cHBoY19hZGRyID0gZWJ1cy0+cHBjYXAgKyBBWlhfUFBIQ19CQVNFICsKKwlpZiAoYnVzLT5wcGNhcCkgeworCQlzdHJlYW0tPnBwaGNfYWRkciA9IGJ1cy0+cHBjYXAgKyBBWlhfUFBIQ19CQVNFICsKIAkJCQlBWlhfUFBIQ19JTlRFUlZBTCAqIGlkeDsKIAotCQlzdHJlYW0tPnBwbGNfYWRkciA9IGVidXMtPnBwY2FwICsgQVpYX1BQTENfQkFTRSArCisJCXN0cmVhbS0+cHBsY19hZGRyID0gYnVzLT5wcGNhcCArIEFaWF9QUExDX0JBU0UgKwogCQkJCUFaWF9QUExDX01VTFRJICogZWJ1cy0+bnVtX3N0cmVhbXMgKwogCQkJCUFaWF9QUExDX0lOVEVSVkFMICogaWR4OwogCX0KIAotCWlmIChlYnVzLT5zcGJjYXApIHsKLQkJc3RyZWFtLT5zcGliX2FkZHIgPSBlYnVzLT5zcGJjYXAgKyBBWlhfU1BCX0JBU0UgKworCWlmIChidXMtPnNwYmNhcCkgeworCQlzdHJlYW0tPnNwaWJfYWRkciA9IGJ1cy0+c3BiY2FwICsgQVpYX1NQQl9CQVNFICsKIAkJCQkJQVpYX1NQQl9JTlRFUlZBTCAqIGlkeCArCiAJCQkJCUFaWF9TUEJfU1BJQjsKIAotCQlzdHJlYW0tPmZpZm9fYWRkciA9IGVidXMtPnNwYmNhcCArIEFaWF9TUEJfQkFTRSArCisJCXN0cmVhbS0+Zmlmb19hZGRyID0gYnVzLT5zcGJjYXAgKyBBWlhfU1BCX0JBU0UgKwogCQkJCQlBWlhfU1BCX0lOVEVSVkFMICogaWR4ICsKIAkJCQkJQVpYX1NQQl9NQVhGSUZPOwogCX0KIAotCWlmIChlYnVzLT5kcnNtY2FwKQotCQlzdHJlYW0tPmRwaWJyX2FkZHIgPSBlYnVzLT5kcnNtY2FwICsgQVpYX0RSU01fQkFTRSArCisJaWYgKGJ1cy0+ZHJzbWNhcCkKKwkJc3RyZWFtLT5kcGlicl9hZGRyID0gYnVzLT5kcnNtY2FwICsgQVpYX0RSU01fQkFTRSArCiAJCQkJCUFaWF9EUlNNX0lOVEVSVkFMICogaWR4OwogCiAJc3RyZWFtLT5kZWNvdXBsZWQgPSBmYWxzZTsKQEAgLTEzMSwxMCArMTMxLDEwIEBACiAKIAlzcGluX2xvY2tfaXJxKCZidXMtPnJlZ19sb2NrKTsKIAlpZiAoZGVjb3VwbGUpCi0JCXNuZF9oZGFjX3VwZGF0ZWwoZWJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsIDAsCisJCXNuZF9oZGFjX3VwZGF0ZWwoYnVzLT5wcGNhcCwgQVpYX1JFR19QUF9QUENUTCwgMCwKIAkJCQlBWlhfUFBDVExfUFJPQ0VOKGhzdHJlYW0tPmluZGV4KSk7CiAJZWxzZQotCQlzbmRfaGRhY191cGRhdGVsKGVidXMtPnBwY2FwLCBBWlhfUkVHX1BQX1BQQ1RMLAorCQlzbmRfaGRhY191cGRhdGVsKGJ1cy0+cHBjYXAsIEFaWF9SRUdfUFBfUFBDVEwsCiAJCQkJCUFaWF9QUENUTF9QUk9DRU4oaHN0cmVhbS0+aW5kZXgpLCAwKTsKIAlzdHJlYW0tPmRlY291cGxlZCA9IGRlY291cGxlOwogCXNwaW5fdW5sb2NrX2lycSgmYnVzLT5yZWdfbG9jayk7CkBAIC0yNTUsNyArMjU1LDcgQEAKIAlzdHJ1Y3QgaGRhY19zdHJlYW0gKnN0cmVhbSA9IE5VTEw7CiAJc3RydWN0IGhkYWNfYnVzICpoYnVzID0gJmVidXMtPmJ1czsKIAotCWlmICghZWJ1cy0+cHBjYXApIHsKKwlpZiAoIWhidXMtPnBwY2FwKSB7CiAJCWRldl9lcnIoaGJ1cy0+ZGV2LCAic3RyZWFtIHR5cGUgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTI5Niw3ICsyOTYsNyBAQAogCXN0cnVjdCBoZGFjX3N0cmVhbSAqc3RyZWFtID0gTlVMTDsKIAlzdHJ1Y3QgaGRhY19idXMgKmhidXMgPSAmZWJ1cy0+YnVzOwogCi0JaWYgKCFlYnVzLT5wcGNhcCkgeworCWlmICghaGJ1cy0+cHBjYXApIHsKIAkJZGV2X2VycihoYnVzLT5kZXYsICJzdHJlYW0gdHlwZSBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNDIzLDIxICs0MjMsMjEgQEAKIAl1MzIgcmVnaXN0ZXJfbWFzayA9IDA7CiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSAmZWJ1cy0+YnVzOwogCi0JaWYgKCFlYnVzLT5zcGJjYXApIHsKLQkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgU1BCIGNhcGFiaWxpdHkgaXMgTlVMTCIpOworCWlmICghYnVzLT5zcGJjYXApIHsKKwkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgU1BCIGNhcGFiaWxpdHkgaXMgTlVMTFxuIik7CiAJCXJldHVybjsKIAl9CiAKIAltYXNrIHw9ICgxIDw8IGluZGV4KTsKIAotCXJlZ2lzdGVyX21hc2sgPSByZWFkbChlYnVzLT5zcGJjYXAgKyBBWlhfUkVHX1NQQl9TUEJGQ0NUTCk7CisJcmVnaXN0ZXJfbWFzayA9IHJlYWRsKGJ1cy0+c3BiY2FwICsgQVpYX1JFR19TUEJfU1BCRkNDVEwpOwogCiAJbWFzayB8PSByZWdpc3Rlcl9tYXNrOwogCiAJaWYgKGVuYWJsZSkKLQkJc25kX2hkYWNfdXBkYXRlbChlYnVzLT5zcGJjYXAsIEFaWF9SRUdfU1BCX1NQQkZDQ1RMLCAwLCBtYXNrKTsKKwkJc25kX2hkYWNfdXBkYXRlbChidXMtPnNwYmNhcCwgQVpYX1JFR19TUEJfU1BCRkNDVEwsIDAsIG1hc2spOwogCWVsc2UKLQkJc25kX2hkYWNfdXBkYXRlbChlYnVzLT5zcGJjYXAsIEFaWF9SRUdfU1BCX1NQQkZDQ1RMLCBtYXNrLCAwKTsKKwkJc25kX2hkYWNfdXBkYXRlbChidXMtPnNwYmNhcCwgQVpYX1JFR19TUEJfU1BCRkNDVEwsIG1hc2ssIDApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfZXh0X3N0cmVhbV9zcGJjYXBfZW5hYmxlKTsKIApAQCAtNDUyLDggKzQ1Miw4IEBACiB7CiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSAmZWJ1cy0+YnVzOwogCi0JaWYgKCFlYnVzLT5zcGJjYXApIHsKLQkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgU1BCIGNhcGFiaWxpdHkgaXMgTlVMTCIpOworCWlmICghYnVzLT5zcGJjYXApIHsKKwkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgU1BCIGNhcGFiaWxpdHkgaXMgTlVMTFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDc1LDggKzQ3NSw4IEBACiB7CiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSAmZWJ1cy0+YnVzOwogCi0JaWYgKCFlYnVzLT5zcGJjYXApIHsKLQkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgU1BCIGNhcGFiaWxpdHkgaXMgTlVMTCIpOworCWlmICghYnVzLT5zcGJjYXApIHsKKwkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgU1BCIGNhcGFiaWxpdHkgaXMgTlVMTFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNTE1LDIxICs1MTUsMjEgQEAKIAl1MzIgcmVnaXN0ZXJfbWFzayA9IDA7CiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSAmZWJ1cy0+YnVzOwogCi0JaWYgKCFlYnVzLT5kcnNtY2FwKSB7Ci0JCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIERSU00gY2FwYWJpbGl0eSBpcyBOVUxMIik7CisJaWYgKCFidXMtPmRyc21jYXApIHsKKwkJZGV2X2VycihidXMtPmRldiwgIkFkZHJlc3Mgb2YgRFJTTSBjYXBhYmlsaXR5IGlzIE5VTExcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJbWFzayB8PSAoMSA8PCBpbmRleCk7CiAKLQlyZWdpc3Rlcl9tYXNrID0gcmVhZGwoZWJ1cy0+ZHJzbWNhcCArIEFaWF9SRUdfU1BCX1NQQkZDQ1RMKTsKKwlyZWdpc3Rlcl9tYXNrID0gcmVhZGwoYnVzLT5kcnNtY2FwICsgQVpYX1JFR19TUEJfU1BCRkNDVEwpOwogCiAJbWFzayB8PSByZWdpc3Rlcl9tYXNrOwogCiAJaWYgKGVuYWJsZSkKLQkJc25kX2hkYWNfdXBkYXRlbChlYnVzLT5kcnNtY2FwLCBBWlhfUkVHX0RSU01fQ1RMLCAwLCBtYXNrKTsKKwkJc25kX2hkYWNfdXBkYXRlbChidXMtPmRyc21jYXAsIEFaWF9SRUdfRFJTTV9DVEwsIDAsIG1hc2spOwogCWVsc2UKLQkJc25kX2hkYWNfdXBkYXRlbChlYnVzLT5kcnNtY2FwLCBBWlhfUkVHX0RSU01fQ1RMLCBtYXNrLCAwKTsKKwkJc25kX2hkYWNfdXBkYXRlbChidXMtPmRyc21jYXAsIEFaWF9SRUdfRFJTTV9DVEwsIG1hc2ssIDApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfZXh0X3N0cmVhbV9kcnNtX2VuYWJsZSk7CiAKQEAgLTU0NCw4ICs1NDQsOCBAQAogewogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gJmVidXMtPmJ1czsKIAotCWlmICghZWJ1cy0+ZHJzbWNhcCkgewotCQlkZXZfZXJyKGJ1cy0+ZGV2LCAiQWRkcmVzcyBvZiBEUlNNIGNhcGFiaWxpdHkgaXMgTlVMTCIpOworCWlmICghYnVzLT5kcnNtY2FwKSB7CisJCWRldl9lcnIoYnVzLT5kZXYsICJBZGRyZXNzIG9mIERSU00gY2FwYWJpbGl0eSBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9oZGEvaGRhY19jb250cm9sbGVyLmMgYi9zb3VuZC9oZGEvaGRhY19jb250cm9sbGVyLmMKaW5kZXggOWZlZTQ2NC4uMDQzMDY1OCAxMDA2NDQKLS0tIGEvc291bmQvaGRhL2hkYWNfY29udHJvbGxlci5jCisrKyBiL3NvdW5kL2hkYS9oZGFjX2NvbnRyb2xsZXIuYwpAQCAtMjU1LDYgKzI1NSw4MSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfYnVzX2dldF9yZXNwb25zZSk7CiAKKyNkZWZpbmUgSERBQ19NQVhfQ0FQUyAxMAorLyoqCisgKiBzbmRfaGRhY19idXNfcGFyc2VfY2FwYWJpbGl0aWVzIC0gcGFyc2UgY2FwYWJpbGl0eSBzdHJ1Y3R1cmUKKyAqIEBidXM6IHRoZSBwb2ludGVyIHRvIGJ1cyBvYmplY3QKKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgc25kX2hkYWNfYnVzX3BhcnNlX2NhcGFiaWxpdGllcyhzdHJ1Y3QgaGRhY19idXMgKmJ1cykKK3sKKwl1bnNpZ25lZCBpbnQgY3VyX2NhcDsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGludCBjb3VudGVyID0gMDsKKworCW9mZnNldCA9IHNuZF9oZGFjX2NoaXBfcmVhZGwoYnVzLCBMTENIKTsKKworCS8qIExldHMgd2FsayB0aGUgbGlua2VkIGNhcGFiaWxpdGllcyBsaXN0ICovCisJZG8geworCQljdXJfY2FwID0gX3NuZF9oZGFjX2NoaXBfcmVhZChsLCBidXMsIG9mZnNldCk7CisKKwkJZGV2X2RiZyhidXMtPmRldiwgIkNhcGFiaWxpdHkgdmVyc2lvbjogMHgleFxuIiwKKwkJCShjdXJfY2FwICYgQVpYX0NBUF9IRFJfVkVSX01BU0spID4+IEFaWF9DQVBfSERSX1ZFUl9PRkYpOworCisJCWRldl9kYmcoYnVzLT5kZXYsICJIREEgY2FwYWJpbGl0eSBJRDogMHgleFxuIiwKKwkJCShjdXJfY2FwICYgQVpYX0NBUF9IRFJfSURfTUFTSykgPj4gQVpYX0NBUF9IRFJfSURfT0ZGKTsKKworCQlzd2l0Y2ggKChjdXJfY2FwICYgQVpYX0NBUF9IRFJfSURfTUFTSykgPj4gQVpYX0NBUF9IRFJfSURfT0ZGKSB7CisJCWNhc2UgQVpYX01MX0NBUF9JRDoKKwkJCWRldl9kYmcoYnVzLT5kZXYsICJGb3VuZCBNTCBjYXBhYmlsaXR5XG4iKTsKKwkJCWJ1cy0+bWxjYXAgPSBidXMtPnJlbWFwX2FkZHIgKyBvZmZzZXQ7CisJCQlicmVhazsKKworCQljYXNlIEFaWF9HVFNfQ0FQX0lEOgorCQkJZGV2X2RiZyhidXMtPmRldiwgIkZvdW5kIEdUUyBjYXBhYmlsaXR5IG9mZnNldD0leFxuIiwgb2Zmc2V0KTsKKwkJCWJ1cy0+Z3RzY2FwID0gYnVzLT5yZW1hcF9hZGRyICsgb2Zmc2V0OworCQkJYnJlYWs7CisKKwkJY2FzZSBBWlhfUFBfQ0FQX0lEOgorCQkJLyogUFAgY2FwYWJpbGl0eSBmb3VuZCwgdGhlIEF1ZGlvIERTUCBpcyBwcmVzZW50ICovCisJCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiRm91bmQgUFAgY2FwYWJpbGl0eSBvZmZzZXQ9JXhcbiIsIG9mZnNldCk7CisJCQlidXMtPnBwY2FwID0gYnVzLT5yZW1hcF9hZGRyICsgb2Zmc2V0OworCQkJYnJlYWs7CisKKwkJY2FzZSBBWlhfU1BCX0NBUF9JRDoKKwkJCS8qIFNQSUIgY2FwYWJpbGl0eSBmb3VuZCwgaGFuZGxlciBmdW5jdGlvbiAqLworCQkJZGV2X2RiZyhidXMtPmRldiwgIkZvdW5kIFNQQiBjYXBhYmlsaXR5XG4iKTsKKwkJCWJ1cy0+c3BiY2FwID0gYnVzLT5yZW1hcF9hZGRyICsgb2Zmc2V0OworCQkJYnJlYWs7CisKKwkJY2FzZSBBWlhfRFJTTV9DQVBfSUQ6CisJCQkvKiBETUEgcmVzdW1lICBjYXBhYmlsaXR5IGZvdW5kLCBoYW5kbGVyIGZ1bmN0aW9uICovCisJCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiRm91bmQgRFJTTSBjYXBhYmlsaXR5XG4iKTsKKwkJCWJ1cy0+ZHJzbWNhcCA9IGJ1cy0+cmVtYXBfYWRkciArIG9mZnNldDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkZXZfZGJnKGJ1cy0+ZGV2LCAiVW5rbm93biBjYXBhYmlsaXR5ICVkXG4iLCBjdXJfY2FwKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY291bnRlcisrOworCisJCWlmIChjb3VudGVyID4gSERBQ19NQVhfQ0FQUykgeworCQkJZGV2X2VycihidXMtPmRldiwgIldlIGV4Y2VlZGVkIEhEQUMgY2FwYWJpbGl0aWVzISEhXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogcmVhZCB0aGUgb2Zmc2V0IG9mIG5leHQgY2FwYWJpbGl0eSAqLworCQlvZmZzZXQgPSBjdXJfY2FwICYgQVpYX0NBUF9IRFJfTlhUX1BUUl9NQVNLOworCisJfSB3aGlsZSAob2Zmc2V0KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfYnVzX3BhcnNlX2NhcGFiaWxpdGllcyk7CisKIC8qCiAgKiBMb3dsZXZlbCBpbnRlcmZhY2UKICAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FkMTg4OS5jIGIvc291bmQvcGNpL2FkMTg4OS5jCmluZGV4IDFmYzZkOGIuLjhjMzY5OTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hZDE4ODkuYworKysgYi9zb3VuZC9wY2kvYWQxODg5LmMKQEAgLTU3MSw3ICs1NzEsNyBAQAogCXJldHVybiBieXRlc190b19mcmFtZXMoc3MtPnJ1bnRpbWUsIHB0cik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FkMTg4OV9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hZDE4ODlfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0gc25kX2FkMTg4OV9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9IHNuZF9hZDE4ODlfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC01ODIsNyArNTgyLDcgQEAKIAkucG9pbnRlciA9IHNuZF9hZDE4ODlfcGxheWJhY2tfcG9pbnRlciwgCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hZDE4ODlfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hZDE4ODlfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPSBzbmRfYWQxODg5X2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPSBzbmRfYWQxODg5X2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMgYi9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKaW5kZXggMzY0NzBhZi4uOTJiODE5ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCisrKyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwpAQCAtMTQwOCw2ICsxNDA4LDcgQEAKIAlzcGluX3VubG9jaygmY29kZWMtPnJlZ19sb2NrKTsKIAlkZXZfZGJnKGNvZGVjLT5jYXJkLT5kZXYsICJwbGF5YmFjayBwb2ludGVyIHJldHVybmVkIGNzbz0leGguXG4iLCBjc28pOwogCisJY3NvICU9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwogCXJldHVybiBjc287CiB9CiAKQEAgLTE0MjgsNiArMTQyOSw3IEBACiAJY3NvID0gaW53KEFMSV9SRUcoY29kZWMsIEFMSV9DU09fQUxQSEFfRk1TICsgMikpOwogCXNwaW5fdW5sb2NrKCZjb2RlYy0+cmVnX2xvY2spOwogCisJY3NvICU9IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwogCXJldHVybiBjc287CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbHMzMDAuYyBiL3NvdW5kL3BjaS9hbHMzMDAuYwppbmRleCBhZGQzMTc2Li5hYjc1NjAxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWxzMzAwLmMKKysrIGIvc291bmQvcGNpL2FsczMwMC5jCkBAIC01NjMsNyArNTYzLDcgQEAKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgY3VycmVudF9wdHIpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hbHMzMDBfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWxzMzAwX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYWxzMzAwX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2FsczMwMF9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTU3NCw3ICs1NzQsNyBAQAogCS5wb2ludGVyID0Jc25kX2FsczMwMF9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWxzMzAwX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWxzMzAwX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9hbHMzMDBfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9hbHMzMDBfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hbHM0MDAwLmMgYi9zb3VuZC9wY2kvYWxzNDAwMC5jCmluZGV4IGZmMzlhMGMuLmVkYWJlMTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hbHM0MDAwLmMKKysrIGIvc291bmQvcGNpL2FsczQwMDAuYwpAQCAtNjcyLDcgKzY3Miw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FsczQwMDBfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWxzNDAwMF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2FsczQwMDBfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYWxzNDAwMF9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTY4Myw3ICs2ODMsNyBAQAogCS5wb2ludGVyID0Jc25kX2FsczQwMDBfcGxheWJhY2tfcG9pbnRlcgogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYWxzNDAwMF9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2FsczQwMDBfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2FsczQwMDBfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9hbHM0MDAwX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jIGIvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYwppbmRleCAxMDM5ZWNjLi45NzZhM2QyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCisrKyBiL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKQEAgLTExMzgsNyArMTEzOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhcmRfYXNpaHBpX3BsYXliYWNrX21tYXBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2FyZF9hc2locGlfcGxheWJhY2tfbW1hcF9vcHMgPSB7CiAJLm9wZW4gPSBzbmRfY2FyZF9hc2locGlfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPSBzbmRfY2FyZF9hc2locGlfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0gc25kX2NhcmRfYXNpaHBpX3BsYXliYWNrX2lvY3RsLApAQCAtMTMwNSw3ICsxMzA1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2FyZF9hc2locGlfY2FwdHVyZV9tbWFwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhcmRfYXNpaHBpX2NhcHR1cmVfbW1hcF9vcHMgPSB7CiAJLm9wZW4gPSBzbmRfY2FyZF9hc2locGlfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9IHNuZF9jYXJkX2FzaWhwaV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9jYXJkX2FzaWhwaV9jYXB0dXJlX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9ocGlmdW5jLmMgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaWZ1bmMuYwppbmRleCA1MTBlNTZjLi5mOWI1NzY0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXNpaHBpL2hwaWZ1bmMuYworKysgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaWZ1bmMuYwpAQCAtMjMyMywxMSArMjMyMyw4IEBACiB1MTYgaHBpX3NhbXBsZV9jbG9ja19xdWVyeV9sb2NhbF9yYXRlKGNvbnN0IHUzMiBoX2Nsb2NrLCBjb25zdCB1MzIgaW5kZXgsCiAJdTMyICpwcmF0ZSkKIHsKLQl1MTYgZXJyOwotCWVyciA9IGhwaV9jb250cm9sX3F1ZXJ5KGhfY2xvY2ssIEhQSV9TQU1QTEVDTE9DS19MT0NBTF9TQU1QTEVSQVRFLAotCQlpbmRleCwgMCwgcHJhdGUpOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gaHBpX2NvbnRyb2xfcXVlcnkoaF9jbG9jaywgSFBJX1NBTVBMRUNMT0NLX0xPQ0FMX1NBTVBMRVJBVEUsCisJCQkJIGluZGV4LCAwLCBwcmF0ZSk7CiB9CiAKIHUxNiBocGlfc2FtcGxlX2Nsb2NrX3NldF9sb2NhbF9yYXRlKHUzMiBoX2NvbnRyb2wsIHUzMiBzYW1wbGVfcmF0ZSkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdGlpeHAuYyBiL3NvdW5kL3BjaS9hdGlpeHAuYwppbmRleCAyY2UwMDIyLi5hNDBjOTE4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXRpaXhwLmMKKysrIGIvc291bmQvcGNpL2F0aWl4cC5jCkBAIC0xMTQ4LDcgKzExNDgsNyBAQAogfQogCiAvKiBBQzk3IHBsYXliYWNrICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdGlpeHBfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXRpaXhwX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYXRpaXhwX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2F0aWl4cF9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExNjAsNyArMTE2MCw3IEBACiB9OwogCiAvKiBBQzk3IGNhcHR1cmUgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F0aWl4cF9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F0aWl4cF9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYXRpaXhwX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYXRpaXhwX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTcyLDcgKzExNzIsNyBAQAogfTsKIAogLyogU1BESUYgcGxheWJhY2sgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F0aWl4cF9zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdGlpeHBfc3BkaWZfb3BzID0gewogCS5vcGVuID0JCXNuZF9hdGlpeHBfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYXRpaXhwX3NwZGlmX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCmluZGV4IGM1MzQ1NTIuLjQwMTUyZmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYworKysgYi9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKQEAgLTk0Nyw3ICs5NDcsNyBAQAogCiAKIC8qIEFDOTcgcGxheWJhY2sgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F0aWl4cF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdGlpeHBfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9hdGlpeHBfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYXRpaXhwX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtOTU5LDcgKzk1OSw3IEBACiB9OwogCiAvKiBBQzk3IGNhcHR1cmUgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F0aWl4cF9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F0aWl4cF9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYXRpaXhwX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYXRpaXhwX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9jb3JlLmMgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9jb3JlLmMKaW5kZXggZDMxMjVjMS4uZTFhZjI0ZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfY29yZS5jCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX2NvcmUuYwpAQCAtMTA0Myw3ICsxMDQzLDcgQEAKIAlmb3IgKHggPSBOUl9BREIgLSAxOyB4ID49IDA7IHgtLSkgewogCQlod3dyaXRlKHZvcnRleC0+bW1pbywgYWRkciwgKEZJRk9fVTAgfCBGSUZPX1UxKSk7CiAJCWlmIChod3JlYWQodm9ydGV4LT5tbWlvLCBhZGRyKSAhPSAoRklGT19VMCB8IEZJRk9fVTEpKQotCQkJZGV2X2Vycih2b3J0ZXgtPmNhcmQtPmRldiwgImJhZCBhZGIgZmlmbyByZXNldCEiKTsKKwkJCWRldl9lcnIodm9ydGV4LT5jYXJkLT5kZXYsICJiYWQgYWRiIGZpZm8gcmVzZXQhXG4iKTsKIAkJdm9ydGV4X2ZpZm9fY2xlYXJhZGJkYXRhKHZvcnRleCwgeCwgRklGT19TSVpFKTsKIAkJYWRkciAtPSA0OwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hdzIvYXcyLWFsc2EuYyBiL3NvdW5kL3BjaS9hdzIvYXcyLWFsc2EuYwppbmRleCAxNjc3MTQzLi41N2JiYjg3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYXcyL2F3Mi1hbHNhLmMKKysrIGIvc291bmQvcGNpL2F3Mi9hdzItYWxzYS5jCkBAIC0xNzksNyArMTc5LDcgQEAKIG1vZHVsZV9wY2lfZHJpdmVyKGF3Ml9kcml2ZXIpOwogCiAvKiBvcGVyYXRvcnMgZm9yIHBsYXliYWNrIFBDTSBhbHNhIGludGVyZmFjZSAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXcyX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F3Ml9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPSBzbmRfYXcyX3BjbV9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9IHNuZF9hdzJfcGNtX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtMTkxLDcgKzE5MSw3IEBACiB9OwogCiAvKiBvcGVyYXRvcnMgZm9yIGNhcHR1cmUgUENNIGFsc2EgaW50ZXJmYWNlICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdzJfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hdzJfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPSBzbmRfYXcyX3BjbV9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0gc25kX2F3Ml9wY21fY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9henQzMzI4LmMgYi9zb3VuZC9wY2kvYXp0MzMyOC5jCmluZGV4IDVlMmVmMGIuLjgwYzRhNDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9henQzMzI4LmMKKysrIGIvc291bmQvcGNpL2F6dDMzMjguYwpAQCAtMjA5MCw3ICsyMDkwLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXpmMzMyOF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hemYzMzI4X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYXpmMzMyOF9wY21fcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfYXpmMzMyOF9wY21fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0yMTAxLDcgKzIxMDEsNyBAQAogCS5wb2ludGVyID0Jc25kX2F6ZjMzMjhfcGNtX3BvaW50ZXIKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2F6ZjMzMjhfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hemYzMzI4X2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9hemYzMzI4X3BjbV9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2F6ZjMzMjhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMjExMiw3ICsyMTEyLDcgQEAKIAkucG9pbnRlciA9CXNuZF9hemYzMzI4X3BjbV9wb2ludGVyCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9hemYzMzI4X2kyc19vdXRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYXpmMzMyOF9pMnNfb3V0X29wcyA9IHsKIAkub3BlbiA9CQlzbmRfYXpmMzMyOF9wY21faTJzX291dF9vcGVuLAogCS5jbG9zZSA9CXNuZF9hemYzMzI4X3BjbV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9idDg3eC5jIGIvc291bmQvcGNpL2J0ODd4LmMKaW5kZXggNTkyNWI3MS4uZjJjMDcwOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2J0ODd4LmMKKysrIGIvc291bmQvcGNpL2J0ODd4LmMKQEAgLTU1MCw3ICs1NTAsNyBAQAogCXJldHVybiAoc25kX3BjbV91ZnJhbWVzX3QpYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIGNoaXAtPmN1cnJlbnRfbGluZSAqIGNoaXAtPmxpbmVfYnl0ZXMpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9idDg3eF9wY21fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfYnQ4N3hfcGNtX29wcyA9IHsKIAkub3BlbiA9IHNuZF9idDg3eF9wY21fb3BlbiwKIAkuY2xvc2UgPSBzbmRfYnQ4N3hfY2xvc2UsCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKaW5kZXggZDNjZDk1Ni4uNjE2NWE1NyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYwpAQCAtMTEwOSw3ICsxMTA5LDcgQEAKIH0KIAogLyogb3BlcmF0b3JzICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfcGxheWJhY2tfZnJvbnRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X3BsYXliYWNrX2Zyb250X29wcyA9IHsKIAkub3BlbiA9ICAgICAgICBzbmRfY2EwMTA2X3BjbV9vcGVuX3BsYXliYWNrX2Zyb250LAogCS5jbG9zZSA9ICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX3BsYXliYWNrLAogCS5pb2N0bCA9ICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApAQCAtMTEyMCw3ICsxMTIwLDcgQEAKIAkucG9pbnRlciA9ICAgICBzbmRfY2EwMTA2X3BjbV9wb2ludGVyX3BsYXliYWNrLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X2NhcHR1cmVfMF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfY2FwdHVyZV8wX29wcyA9IHsKIAkub3BlbiA9ICAgICAgICBzbmRfY2EwMTA2X3BjbV9vcGVuXzBfY2FwdHVyZSwKIAkuY2xvc2UgPSAgICAgICBzbmRfY2EwMTA2X3BjbV9jbG9zZV9jYXB0dXJlLAogCS5pb2N0bCA9ICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApAQCAtMTEzMSw3ICsxMTMxLDcgQEAKIAkucG9pbnRlciA9ICAgICBzbmRfY2EwMTA2X3BjbV9wb2ludGVyX2NhcHR1cmUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfY2FwdHVyZV8xX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9jYXB0dXJlXzFfb3BzID0gewogCS5vcGVuID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fMV9jYXB0dXJlLAogCS5jbG9zZSA9ICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX2NhcHR1cmUsCiAJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTQyLDcgKzExNDIsNyBAQAogCS5wb2ludGVyID0gICAgIHNuZF9jYTAxMDZfcGNtX3BvaW50ZXJfY2FwdHVyZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9jYXB0dXJlXzJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X2NhcHR1cmVfMl9vcHMgPSB7CiAJLm9wZW4gPSAgICAgICAgc25kX2NhMDEwNl9wY21fb3Blbl8yX2NhcHR1cmUsCiAJLmNsb3NlID0gICAgICAgc25kX2NhMDEwNl9wY21fY2xvc2VfY2FwdHVyZSwKIAkuaW9jdGwgPSAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExNTMsNyArMTE1Myw3IEBACiAJLnBvaW50ZXIgPSAgICAgc25kX2NhMDEwNl9wY21fcG9pbnRlcl9jYXB0dXJlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X2NhcHR1cmVfM19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfY2FwdHVyZV8zX29wcyA9IHsKIAkub3BlbiA9ICAgICAgICBzbmRfY2EwMTA2X3BjbV9vcGVuXzNfY2FwdHVyZSwKIAkuY2xvc2UgPSAgICAgICBzbmRfY2EwMTA2X3BjbV9jbG9zZV9jYXB0dXJlLAogCS5pb2N0bCA9ICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApAQCAtMTE2NCw3ICsxMTY0LDcgQEAKIAkucG9pbnRlciA9ICAgICBzbmRfY2EwMTA2X3BjbV9wb2ludGVyX2NhcHR1cmUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfcGxheWJhY2tfY2VudGVyX2xmZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jYTAxMDZfcGxheWJhY2tfY2VudGVyX2xmZV9vcHMgPSB7CiAgICAgICAgIC5vcGVuID0gICAgICAgICBzbmRfY2EwMTA2X3BjbV9vcGVuX3BsYXliYWNrX2NlbnRlcl9sZmUsCiAgICAgICAgIC5jbG9zZSA9ICAgICAgICBzbmRfY2EwMTA2X3BjbV9jbG9zZV9wbGF5YmFjaywKICAgICAgICAgLmlvY3RsID0gICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApAQCAtMTE3NSw3ICsxMTc1LDcgQEAKICAgICAgICAgLnBvaW50ZXIgPSAgICAgIHNuZF9jYTAxMDZfcGNtX3BvaW50ZXJfcGxheWJhY2ssIAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X3BsYXliYWNrX3Vua25vd25fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY2EwMTA2X3BsYXliYWNrX3Vua25vd25fb3BzID0gewogICAgICAgICAub3BlbiA9ICAgICAgICAgc25kX2NhMDEwNl9wY21fb3Blbl9wbGF5YmFja191bmtub3duLAogICAgICAgICAuY2xvc2UgPSAgICAgICAgc25kX2NhMDEwNl9wY21fY2xvc2VfcGxheWJhY2ssCiAgICAgICAgIC5pb2N0bCA9ICAgICAgICBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTExODYsNyArMTE4Niw3IEBACiAgICAgICAgIC5wb2ludGVyID0gICAgICBzbmRfY2EwMTA2X3BjbV9wb2ludGVyX3BsYXliYWNrLCAKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9wbGF5YmFja19yZWFyX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NhMDEwNl9wbGF5YmFja19yZWFyX29wcyA9IHsKICAgICAgICAgLm9wZW4gPSAgICAgICAgIHNuZF9jYTAxMDZfcGNtX29wZW5fcGxheWJhY2tfcmVhciwKICAgICAgICAgLmNsb3NlID0gICAgICAgIHNuZF9jYTAxMDZfcGNtX2Nsb3NlX3BsYXliYWNrLAogICAgICAgICAuaW9jdGwgPSAgICAgICAgc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY21pcGNpLmMgYi9zb3VuZC9wY2kvY21pcGNpLmMKaW5kZXggMjRjZGNiYS4uNzNmNTkzNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NtaXBjaS5jCisrKyBiL3NvdW5kL3BjaS9jbWlwY2kuYwpAQCAtMTgzOCw3ICsxODM4LDcgQEAKIC8qCiAgKi8KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY21pcGNpX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NtaXBjaV9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2NtaXBjaV9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9jbWlwY2lfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xODQ5LDcgKzE4NDksNyBAQAogCS5wb2ludGVyID0Jc25kX2NtaXBjaV9wbGF5YmFja19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY21pcGNpX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY21pcGNpX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9jbWlwY2lfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9jbWlwY2lfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE4NjAsNyArMTg2MCw3IEBACiAJLnBvaW50ZXIgPQlzbmRfY21pcGNpX2NhcHR1cmVfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2NtaXBjaV9wbGF5YmFjazJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY21pcGNpX3BsYXliYWNrMl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2NtaXBjaV9wbGF5YmFjazJfb3BlbiwKIAkuY2xvc2UgPQlzbmRfY21pcGNpX3BsYXliYWNrMl9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE4NzEsNyArMTg3MSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfY21pcGNpX2NhcHR1cmVfcG9pbnRlciwJLyogY2hhbm5lbCBCICovCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jbWlwY2lfcGxheWJhY2tfc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY21pcGNpX3BsYXliYWNrX3NwZGlmX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfY21pcGNpX3BsYXliYWNrX3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX2NtaXBjaV9wbGF5YmFja19zcGRpZl9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE4ODIsNyArMTg4Miw3IEBACiAJLnBvaW50ZXIgPQlzbmRfY21pcGNpX3BsYXliYWNrX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jbWlwY2lfY2FwdHVyZV9zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jbWlwY2lfY2FwdHVyZV9zcGRpZl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2NtaXBjaV9jYXB0dXJlX3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX2NtaXBjaV9jYXB0dXJlX3NwZGlmX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDI4MS5jIGIvc291bmQvcGNpL2NzNDI4MS5jCmluZGV4IGMyOTZmZDAuLjYxNWQ4YTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQyODEuYworKysgYi9zb3VuZC9wY2kvY3M0MjgxLmMKQEAgLTk1MSw3ICs5NTEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jczQyODFfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY3M0MjgxX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfY3M0MjgxX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2NzNDI4MV9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTk2Miw3ICs5NjIsNyBAQAogCS5wb2ludGVyID0Jc25kX2NzNDI4MV9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY3M0MjgxX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY3M0MjgxX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9jczQyODFfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9jczQyODFfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4X2xpYi5jIGIvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMKaW5kZXggMjcwNmYyNy4uNTI4MTAyYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMKQEAgLTI0NjAsNyArMjQ2MCw3IEBACiAJCXVkZWxheSgxMCk7CiAJCWlmIChzbmRfY3M0Nnh4X2NvZGVjX3JlYWQoY2hpcCwgQUM5N19SRVNFVCwgY29kZWMpICYgMHg4MDAwKSB7CiAJCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwKLQkJCQkic2Vjb25hZHJ5IGNvZGVjIG5vdCBwcmVzZW50XG4iKTsKKwkJCQkic2Vjb25kYXJ5IGNvZGVjIG5vdCBwcmVzZW50XG4iKTsKIAkJCXJldHVybiAtRU5YSU87CiAJCX0KIAl9CkBAIC0yNTAzLDcgKzI1MDMsNyBAQAogCWNoaXAtPm5yX2FjOTdfY29kZWNzID0gMTsKIAogI2lmZGVmIENPTkZJR19TTkRfQ1M0NlhYX05FV19EU1AKLQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgImRldGVjdGluZyBzZWNvbmFkcnkgY29kZWNcbiIpOworCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiZGV0ZWN0aW5nIHNlY29uZGFyeSBjb2RlY1xuIik7CiAJLyogdHJ5IGRldGVjdCBhIHNlY29uZGFyeSBjb2RlYyAqLwogCWlmICghIGNzNDZ4eF9kZXRlY3RfY29kZWMoY2hpcCwgQ1M0NlhYX1NFQ09OREFSWV9DT0RFQ19JTkRFWCkpCiAJCWNoaXAtPm5yX2FjOTdfY29kZWNzID0gMjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYyBiL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYwppbmRleCBkMjk1MWVkLi40YTBjYmQyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5jCkBAIC0xNDQxLDcgKzE0NDEsNyBAQAogCQogCWlmIChjaGlwLT5ucl9hYzk3X2NvZGVjcyA9PSAyKSB7CiAJCS8qIGNyZWF0ZSBDT0RFQyB0YXNrbGV0IGZvciByZWFyIENlbnRlci9MRkUgb3V0cHV0IAotCQkgICBzbG90IDYgYW5kIDkgb24gc2Vjb25hZHJ5IENPREVDICovCisJCSAgIHNsb3QgNiBhbmQgOSBvbiBzZWNvbmRhcnkgQ09ERUMgKi8KIAkJY2xmZV9jb2RlY19vdXRfc2NiID0gY3M0Nnh4X2RzcF9jcmVhdGVfY29kZWNfb3V0X3NjYihjaGlwLCJDb2RlY091dFNDQl9DTEZFIiwweDAwMzAsMHgwMDMwLAogCQkJCQkJCQkgICAgIENMRkVfTUlYRVJfU0NCX0FERFIsCiAJCQkJCQkJCSAgICAgQ0xGRV9DT0RFQ19TQ0JfQUREUiwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYwppbmRleCAyN2ZhNTdkLi5jMjA4YzFkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jCkBAIC0zODAsNyArMzgwLDcgQEAKIAkJCQkgc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY3M1NTM1YXVkaW9fcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY3M1NTM1YXVkaW9fcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9jczU1MzVhdWRpb19wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9jczU1MzVhdWRpb19wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTM5MSw3ICszOTEsNyBAQAogCS5wb2ludGVyID0Jc25kX2NzNTUzNWF1ZGlvX3BjbV9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfY3M1NTM1YXVkaW9fY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9jczU1MzVhdWRpb19jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfY3M1NTM1YXVkaW9fY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9jczU1MzVhdWRpb19jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2N0eGZpL2N0YXRjLmMgYi9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYwppbmRleCA5NzdhNTk4Li45MDg2NThhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYworKysgYi9zb3VuZC9wY2kvY3R4ZmkvY3RhdGMuYwpAQCAtMTYyMyw3ICsxNjIzLDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IGN0X2F0YyBhdGNfcHJlc2V0ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBjdF9hdGMgYXRjX3ByZXNldCA9IHsKIAkubWFwX2F1ZGlvX2J1ZmZlciA9IGN0X21hcF9hdWRpb19idWZmZXIsCiAJLnVubWFwX2F1ZGlvX2J1ZmZlciA9IGN0X3VubWFwX2F1ZGlvX2J1ZmZlciwKIAkucGNtX3BsYXliYWNrX3ByZXBhcmUgPSBhdGNfcGNtX3BsYXliYWNrX3ByZXBhcmUsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3R4ZmkvY3RwY20uYyBiL3NvdW5kL3BjaS9jdHhmaS9jdHBjbS5jCmluZGV4IGQ4NmM0NzQuLjk3NDk3ODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jdHhmaS9jdHBjbS5jCisrKyBiL3NvdW5kL3BjaS9jdHhmaS9jdHBjbS5jCkBAIC0zNzIsNyArMzcyLDcgQEAKIH0KIAogLyogUENNIG9wZXJhdG9ycyBmb3IgcGxheWJhY2sgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgY3RfcGNtX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgY3RfcGNtX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbgkgCT0gY3RfcGNtX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlCQk9IGN0X3BjbV9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC0zODUsNyArMzg1LDcgQEAKIH07CiAKIC8qIFBDTSBvcGVyYXRvcnMgZm9yIGNhcHR1cmUgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgY3RfcGNtX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBjdF9wY21fY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4JIAk9IGN0X3BjbV9jYXB0dXJlX29wZW4sCiAJLmNsb3NlCQk9IGN0X3BjbV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jdHhmaS9jdHZtZW0uYyBiL3NvdW5kL3BjaS9jdHhmaS9jdHZtZW0uYwppbmRleCA0MTkzMDZlLi41MjBlMTliIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3R4ZmkvY3R2bWVtLmMKKysrIGIvc291bmQvcGNpL2N0eGZpL2N0dm1lbS5jCkBAIC0xNjYsMTEgKzE2Niw3IEBACiBzdGF0aWMgZG1hX2FkZHJfdAogY3RfZ2V0X3B0cF9waHlzKHN0cnVjdCBjdF92bSAqdm0sIGludCBpbmRleCkKIHsKLQlkbWFfYWRkcl90IGFkZHI7Ci0KLQlhZGRyID0gKGluZGV4ID49IENUX1BUUF9OVU0pID8gfjBVTCA6IHZtLT5wdHBbaW5kZXhdLmFkZHI7Ci0KLQlyZXR1cm4gYWRkcjsKKwlyZXR1cm4gKGluZGV4ID49IENUX1BUUF9OVU0pID8gfjBVTCA6IHZtLT5wdHBbaW5kZXhdLmFkZHI7CiB9CiAKIGludCBjdF92bV9jcmVhdGUoc3RydWN0IGN0X3ZtICoqcnZtLCBzdHJ1Y3QgcGNpX2RldiAqcGNpKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKaW5kZXggNmQxYjk4ZC4uOTIxMDM3ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCkBAIC01NDgsNyArNTQ4LDcgQEAKIH0KIAogLyogb3BlcmF0b3JzICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxeF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxeF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPSAgICAgICAgc25kX2VtdTEwazF4X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0gICAgICAgc25kX2VtdTEwazF4X3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9ICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApAQCAtNjk0LDcgKzY5NCw3IEBACiAJcmV0dXJuIHB0cjsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMXhfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxeF9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9ICAgICAgICBzbmRfZW11MTBrMXhfcGNtX29wZW5fY2FwdHVyZSwKIAkuY2xvc2UgPSAgICAgICBzbmRfZW11MTBrMXhfcGNtX2Nsb3NlX2NhcHR1cmUsCiAJLmlvY3RsID0gICAgICAgc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwY20uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCmluZGV4IDE0YTMwNWIuLjM3YmUxZTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXBjbS5jCkBAIC0xMzY0LDcgKzEzNjQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCQlzbmRfZW11MTBrMV9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CQlzbmRfZW11MTBrMV9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMzc2LDcgKzEzNzYsNyBAQAogCS5wYWdlID0JCQlzbmRfcGNtX3NnYnVmX29wc19wYWdlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJCXNuZF9lbXUxMGsxX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQkJc25kX2VtdTEwazFfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMzg4LDcgKzEzODgsNyBAQAogfTsKIAogLyogRUZYIHBsYXliYWNrICovCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJCXNuZF9lbXUxMGsxX2VmeF9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CQlzbmRfZW11MTBrMV9lZnhfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTQ1NSw3ICsxNDU1LDcgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX2NhcHR1cmVfbWljX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VtdTEwazFfY2FwdHVyZV9taWNfb3BzID0gewogCS5vcGVuID0JCQlzbmRfZW11MTBrMV9jYXB0dXJlX21pY19vcGVuLAogCS5jbG9zZSA9CQlzbmRfZW11MTBrMV9jYXB0dXJlX21pY19jbG9zZSwKIAkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xNTUwLDcgKzE1NTAsNyBAQAogCS5wdXQgPSBzbmRfZW11MTBrMV9wY21fZWZ4X3ZvaWNlc19tYXNrX3B1dAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9jYXB0dXJlX2VmeF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbXUxMGsxX2NhcHR1cmVfZWZ4X29wcyA9IHsKIAkub3BlbiA9CQkJc25kX2VtdTEwazFfY2FwdHVyZV9lZnhfb3BlbiwKIAkuY2xvc2UgPQkJc25kX2VtdTEwazFfY2FwdHVyZV9lZnhfY2xvc2UsCiAJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTc5MSw3ICsxNzkxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCQlzbmRfZW11MTBrMV9meDgwMTBfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQkJc25kX2VtdTEwazFfZng4MDEwX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL3AxNnYuYwppbmRleCAzYzYwYjQzLi5jMTFmMWEyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS9wMTZ2LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvcDE2di5jCkBAIC0zMDAsMzcgKzMwMCwyOSBAQAogc3RhdGljIGludCBzbmRfcDE2dl9wY21faHdfcGFyYW1zX3BsYXliYWNrKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogewotCWludCByZXN1bHQ7Ci0JcmVzdWx0ID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKIAkJCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKLQlyZXR1cm4gcmVzdWx0OwogfQogCiAvKiBod19wYXJhbXMgY2FsbGJhY2sgKi8KIHN0YXRpYyBpbnQgc25kX3AxNnZfcGNtX2h3X3BhcmFtc19jYXB0dXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQogewotCWludCByZXN1bHQ7Ci0JcmVzdWx0ID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwKIAkJCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMpKTsKLQlyZXR1cm4gcmVzdWx0OwogfQogCiAKIC8qIGh3X2ZyZWUgY2FsbGJhY2sgKi8KIHN0YXRpYyBpbnQgc25kX3AxNnZfcGNtX2h3X2ZyZWVfcGxheWJhY2soc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0JaW50IHJlc3VsdDsKLQlyZXN1bHQgPSBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwogfQogCiAvKiBod19mcmVlIGNhbGxiYWNrICovCiBzdGF0aWMgaW50IHNuZF9wMTZ2X3BjbV9od19mcmVlX2NhcHR1cmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7Ci0JaW50IHJlc3VsdDsKLQlyZXN1bHQgPSBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Ci0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwogfQogCiAKQEAgLTYwMSw3ICs1OTMsNyBAQAogfQogCiAvKiBvcGVyYXRvcnMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3AxNnZfcGxheWJhY2tfZnJvbnRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcDE2dl9wbGF5YmFja19mcm9udF9vcHMgPSB7CiAJLm9wZW4gPSAgICAgICAgc25kX3AxNnZfcGNtX29wZW5fcGxheWJhY2tfZnJvbnQsCiAJLmNsb3NlID0gICAgICAgc25kX3AxNnZfcGNtX2Nsb3NlX3BsYXliYWNrLAogCS5pb2N0bCA9ICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApAQCAtNjEyLDcgKzYwNCw3IEBACiAJLnBvaW50ZXIgPSAgICAgc25kX3AxNnZfcGNtX3BvaW50ZXJfcGxheWJhY2ssCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9wMTZ2X2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcDE2dl9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9ICAgICAgICBzbmRfcDE2dl9wY21fb3Blbl9jYXB0dXJlLAogCS5jbG9zZSA9ICAgICAgIHNuZF9wMTZ2X3BjbV9jbG9zZV9jYXB0dXJlLAogCS5pb2N0bCA9ICAgICAgIHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VuczEzNzAuYyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKaW5kZXggNjI2Y2QyMS4uN2U3NjBmZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VuczEzNzAuYworKysgYi9zb3VuZC9wY2kvZW5zMTM3MC5jCkBAIC0xMjI3LDcgKzEyMjcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbnNvbmlxX3BsYXliYWNrMV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbnNvbmlxX3BsYXliYWNrMV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2Vuc29uaXFfcGxheWJhY2sxX29wZW4sCiAJLmNsb3NlID0Jc25kX2Vuc29uaXFfcGxheWJhY2sxX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTIzOCw3ICsxMjM4LDcgQEAKIAkucG9pbnRlciA9CXNuZF9lbnNvbmlxX3BsYXliYWNrMV9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW5zb25pcV9wbGF5YmFjazJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW5zb25pcV9wbGF5YmFjazJfb3BzID0gewogCS5vcGVuID0JCXNuZF9lbnNvbmlxX3BsYXliYWNrMl9vcGVuLAogCS5jbG9zZSA9CXNuZF9lbnNvbmlxX3BsYXliYWNrMl9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyNDksNyArMTI0OSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfZW5zb25pcV9wbGF5YmFjazJfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2Vuc29uaXFfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lbnNvbmlxX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9lbnNvbmlxX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfZW5zb25pcV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VzMTkzOC5jIGIvc291bmQvcGNpL2VzMTkzOC5jCmluZGV4IDg5NjNkNzYuLjY4MTM1NTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lczE5MzguYworKysgYi9zb3VuZC9wY2kvZXMxOTM4LmMKQEAgLTk5Miw3ICs5OTIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lczE5MzhfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZXMxOTM4X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfZXMxOTM4X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2VzMTkzOF9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEwMDMsNyArMTAwMyw3IEBACiAJLnBvaW50ZXIgPQlzbmRfZXMxOTM4X3BsYXliYWNrX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lczE5MzhfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lczE5MzhfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2VzMTkzOF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2VzMTkzOF9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VzMTk2OC5jIGIvc291bmQvcGNpL2VzMTk2OC5jCmluZGV4IDUxNGYyNjAuLjgxNDZmYjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lczE5NjguYworKysgYi9zb3VuZC9wY2kvZXMxOTY4LmMKQEAgLTE2NzcsNyArMTY3Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2VzMTk2OF9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lczE5NjhfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9lczE5NjhfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfZXMxOTY4X3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTY4OCw3ICsxNjg4LDcgQEAKIAkucG9pbnRlciA9CXNuZF9lczE5NjhfcGNtX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lczE5NjhfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9lczE5NjhfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2VzMTk2OF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2VzMTk2OF9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ZtODAxLmMgYi9zb3VuZC9wY2kvZm04MDEuYwppbmRleCBiYWRlOWI5Li5jNDcyODdkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZm04MDEuYworKysgYi9zb3VuZC9wY2kvZm04MDEuYwpAQCAtNjkxLDcgKzY5MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ZtODAxX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ZtODAxX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfZm04MDFfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfZm04MDFfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC03MDIsNyArNzAyLDcgQEAKIAkucG9pbnRlciA9CXNuZF9mbTgwMV9wbGF5YmFja19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZm04MDFfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9mbTgwMV9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfZm04MDFfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9mbTgwMV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5jIGIvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5jCmluZGV4IDI3ZGU4MDEuLjUwMDg3ODUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmMKQEAgLTI3LDYgKzI3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2lmZGVmIENPTkZJR19YODYKKy8qIGZvciBhcnQtdHNjIGNvbnZlcnNpb24gKi8KKyNpbmNsdWRlIDxhc20vdHNjLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSAiaGRhX2NvbnRyb2xsZXIuaCIKQEAgLTMzNywxMiArMzQzLDE3MyBAQAogCQkJICAgICAgIGF6eF9nZXRfcG9zaXRpb24oY2hpcCwgYXp4X2RldikpOwogfQogCisvKgorICogYXp4X3NjYWxlNjQ6IFNjYWxlIGJhc2UgYnkgbXVsdC9kaXYgd2hpbGUgbm90IG92ZXJmbG93aW5nIHNhbmVseQorICoKKyAqIERlcml2ZWQgZnJvbSBzY2FsZTY0X2NoZWNrX292ZXJmbG93IGluIGtlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKKyAqCisgKiBUaGUgdG1lc3RhbXBzIGZvciBhIDQ4S2h6IHN0cmVhbSBjYW4gb3ZlcmZsb3cgYWZ0ZXIgKDJeNjQvMTBeOSkvNDhLIHdoaWNoCisgKiBpcyBhYm91dCAzODQzMDcgaWUgfjQuNSBkYXlzLgorICoKKyAqIFRoaXMgc2NhbGVzIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGF0IG92ZXJmbG93IHdpbGwgaGFwcGVuIGJ1dCBhZnRlciAyXjY0IC8KKyAqIDQ4MDAwIHNlY3MsIHdoaWNoIGlzIHByZXR0eSBsYXJnZSEKKyAqCisgKiBJbiBjYWxuIGJlbG93OgorICoJYmFzZSBtYXkgb3ZlcmZsb3csIGJ1dCBzaW5jZSB0aGVyZSBpc27igJl0IGFueSBhZGRpdGlvbmFsIGRpdmlzaW9uCisgKglwZXJmb3JtZWQgb24gYmFzZSBpdOKAmXMgT0sKKyAqCXJlbSBjYW7igJl0IG92ZXJmbG93IGJlY2F1c2UgYm90aCBhcmUgMzItYml0IHZhbHVlcworICovCisKKyNpZmRlZiBDT05GSUdfWDg2CitzdGF0aWMgdTY0IGF6eF9zY2FsZTY0KHU2NCBiYXNlLCB1MzIgbnVtLCB1MzIgZGVuKQoreworCXU2NCByZW07CisKKwlyZW0gPSBkb19kaXYoYmFzZSwgZGVuKTsKKworCWJhc2UgKj0gbnVtOworCXJlbSAqPSBudW07CisKKwlkb19kaXYocmVtLCBkZW4pOworCisJcmV0dXJuIGJhc2UgKyByZW07Cit9CisKK3N0YXRpYyBpbnQgYXp4X2dldF9zeW5jX3RpbWUoa3RpbWVfdCAqZGV2aWNlLAorCQlzdHJ1Y3Qgc3lzdGVtX2NvdW50ZXJ2YWxfdCAqc3lzdGVtLCB2b2lkICpjdHgpCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBjdHg7CisJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisJdTY0IGxsX2NvdW50ZXIsIGxsX2NvdW50ZXJfbCwgbGxfY291bnRlcl9oOworCXU2NCB0c2NfY291bnRlciwgdHNjX2NvdW50ZXJfbCwgdHNjX2NvdW50ZXJfaDsKKwl1MzIgd2FsbGNsa19jdHIsIHdhbGxjbGtfY3ljbGVzOworCWJvb2wgZGlyZWN0aW9uOworCXUzMiBkbWFfc2VsZWN0OworCXUzMiB0aW1lb3V0ID0gMjAwOworCXUzMiByZXRyeV9jb3VudCA9IDA7CisKKwlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCisJCWRpcmVjdGlvbiA9IDE7CisJZWxzZQorCQlkaXJlY3Rpb24gPSAwOworCisJLyogMHRoIHN0cmVhbSB0YWcgaXMgbm90IHVzZWQsIHNvIERNQSBjaCAwIGlzIGZvciAxc3Qgc3RyZWFtIHRhZyAqLworCWRvIHsKKwkJdGltZW91dCA9IDEwMDsKKwkJZG1hX3NlbGVjdCA9IChkaXJlY3Rpb24gPDwgR1RTQ0NfQ0RNQVNfRE1BX0RJUl9TSElGVCkgfAorCQkJCQkoYXp4X2Rldi0+Y29yZS5zdHJlYW1fdGFnIC0gMSk7CisJCXNuZF9oZGFjX2NoaXBfd3JpdGVsKGF6eF9idXMoY2hpcCksIEdUU0NDLCBkbWFfc2VsZWN0KTsKKworCQkvKiBFbmFibGUgdGhlIGNhcHR1cmUgKi8KKwkJc25kX2hkYWNfY2hpcF91cGRhdGVsKGF6eF9idXMoY2hpcCksIEdUU0NDLCAwLCBHVFNDQ19UU0NDSV9NQVNLKTsKKworCQl3aGlsZSAodGltZW91dCkgeworCQkJaWYgKHNuZF9oZGFjX2NoaXBfcmVhZGwoYXp4X2J1cyhjaGlwKSwgR1RTQ0MpICYKKwkJCQkJCUdUU0NDX1RTQ0NEX01BU0spCisJCQkJYnJlYWs7CisKKwkJCXRpbWVvdXQtLTsKKwkJfQorCisJCWlmICghdGltZW91dCkgeworCQkJZGV2X2VycihjaGlwLT5jYXJkLT5kZXYsICJHVFNDQyBjYXB0dXJlIFRpbWVkb3V0IVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCS8qIFJlYWQgd2FsbCBjbG9jayBjb3VudGVyICovCisJCXdhbGxjbGtfY3RyID0gc25kX2hkYWNfY2hpcF9yZWFkbChhenhfYnVzKGNoaXApLCBXQUxGQ0MpOworCisJCS8qIFJlYWQgVFNDIGNvdW50ZXIgKi8KKwkJdHNjX2NvdW50ZXJfbCA9IHNuZF9oZGFjX2NoaXBfcmVhZGwoYXp4X2J1cyhjaGlwKSwgVFNDQ0wpOworCQl0c2NfY291bnRlcl9oID0gc25kX2hkYWNfY2hpcF9yZWFkbChhenhfYnVzKGNoaXApLCBUU0NDVSk7CisKKwkJLyogUmVhZCBMaW5rIGNvdW50ZXIgKi8KKwkJbGxfY291bnRlcl9sID0gc25kX2hkYWNfY2hpcF9yZWFkbChhenhfYnVzKGNoaXApLCBMTFBDTCk7CisJCWxsX2NvdW50ZXJfaCA9IHNuZF9oZGFjX2NoaXBfcmVhZGwoYXp4X2J1cyhjaGlwKSwgTExQQ1UpOworCisJCS8qIEFjazogcmVnaXN0ZXJzIHJlYWQgZG9uZSAqLworCQlzbmRfaGRhY19jaGlwX3dyaXRlbChhenhfYnVzKGNoaXApLCBHVFNDQywgR1RTQ0NfVFNDQ0RfU0hJRlQpOworCisJCXRzY19jb3VudGVyID0gKHRzY19jb3VudGVyX2ggPDwgVFNDQ1VfQ0NVX1NISUZUKSB8CisJCQkJCQl0c2NfY291bnRlcl9sOworCisJCWxsX2NvdW50ZXIgPSAobGxfY291bnRlcl9oIDw8IExMUENfQ0NVX1NISUZUKSB8CWxsX2NvdW50ZXJfbDsKKwkJd2FsbGNsa19jeWNsZXMgPSB3YWxsY2xrX2N0ciAmIFdBTEZDQ19DSUZfTUFTSzsKKworCQkvKgorCQkgKiBBbiBlcnJvciBvY2N1cnMgbmVhciBmcmFtZSAicm9sbG92ZXIiLiBUaGUgY2xvY2tzIGluCisJCSAqIGZyYW1lIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgZXJyb3IgbWF5IGhhdmUKKwkJICogb2NjdXJyZWQuIEhlcmUgd2UgdXNlIHRoZSB2YWx1ZSBvZiAxMCBpLmUuLAorCQkgKiBIREFfTUFYX0NZQ0xFX09GRlNFVAorCQkgKi8KKwkJaWYgKHdhbGxjbGtfY3ljbGVzIDwgSERBX01BWF9DWUNMRV9WQUxVRSAtIEhEQV9NQVhfQ1lDTEVfT0ZGU0VUCisJCQkJCSYmIHdhbGxjbGtfY3ljbGVzID4gSERBX01BWF9DWUNMRV9PRkZTRVQpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBTbGVlcCBiZWZvcmUgd2UgcmVhZCBhZ2FpbiwgZWxzZSB3ZSBtYXkgYWdhaW4gZ2V0CisJCSAqIHZhbHVlIG5lYXIgdG8gTUFYX0NZQ0xFLiBUcnkgdG8gc2xlZXAgZm9yIGRpZmZlcmVudAorCQkgKiBhbW91bnQgb2YgdGltZSBzbyB3ZSBkb250IGhpdCB0aGUgc2FtZSBudW1iZXIgYWdhaW4KKwkJICovCisJCXVkZWxheShyZXRyeV9jb3VudCsrKTsKKworCX0gd2hpbGUgKHJldHJ5X2NvdW50ICE9IEhEQV9NQVhfQ1lDTEVfUkVBRF9SRVRSWSk7CisKKwlpZiAocmV0cnlfY291bnQgPT0gSERBX01BWF9DWUNMRV9SRUFEX1JFVFJZKSB7CisJCWRldl9lcnJfcmF0ZWxpbWl0ZWQoY2hpcC0+Y2FyZC0+ZGV2LAorCQkJIkVycm9yIGluIFdBTEZDQyBjeWNsZSBjb3VudFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCSpkZXZpY2UgPSBuc190b19rdGltZShhenhfc2NhbGU2NChsbF9jb3VudGVyLAorCQkJCU5TRUNfUEVSX1NFQywgcnVudGltZS0+cmF0ZSkpOworCSpkZXZpY2UgPSBrdGltZV9hZGRfbnMoKmRldmljZSwgKHdhbGxjbGtfY3ljbGVzICogTlNFQ19QRVJfU0VDKSAvCisJCQkgICAgICAgKChIREFfTUFYX0NZQ0xFX1ZBTFVFICsgMSkgKiBydW50aW1lLT5yYXRlKSk7CisKKwkqc3lzdGVtID0gY29udmVydF9hcnRfdG9fdHNjKHRzY19jb3VudGVyKTsKKworCXJldHVybiAwOworfQorCisjZWxzZQorc3RhdGljIGludCBhenhfZ2V0X3N5bmNfdGltZShrdGltZV90ICpkZXZpY2UsCisJCXN0cnVjdCBzeXN0ZW1fY291bnRlcnZhbF90ICpzeXN0ZW0sIHZvaWQgKmN0eCkKK3sKKwlyZXR1cm4gLUVOWElPOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYXp4X2dldF9jcm9zc3RzdGFtcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgIHN0cnVjdCBzeXN0ZW1fZGV2aWNlX2Nyb3NzdHN0YW1wICp4dHN0YW1wKQoreworCXJldHVybiBnZXRfZGV2aWNlX3N5c3RlbV9jcm9zc3RzdGFtcChhenhfZ2V0X3N5bmNfdGltZSwKKwkJCQkJc3Vic3RyZWFtLCBOVUxMLCB4dHN0YW1wKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2xpbmtfdGltZV9zdXBwb3J0ZWQoc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9hdWRpb190c3RhbXBfY29uZmlnICp0cykKK3sKKwlpZiAocnVudGltZS0+aHcuaW5mbyAmIFNORFJWX1BDTV9JTkZPX0hBU19MSU5LX1NZTkNIUk9OSVpFRF9BVElNRSkKKwkJaWYgKHRzLT50eXBlX3JlcXVlc3RlZCA9PSBTTkRSVl9QQ01fQVVESU9fVFNUQU1QX1RZUEVfTElOS19TWU5DSFJPTklaRUQpCisJCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIGludCBhenhfZ2V0X3RpbWVfaW5mbyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCXN0cnVjdCB0aW1lc3BlYyAqc3lzdGVtX3RzLCBzdHJ1Y3QgdGltZXNwZWMgKmF1ZGlvX3RzLAogCQkJc3RydWN0IHNuZF9wY21fYXVkaW9fdHN0YW1wX2NvbmZpZyAqYXVkaW9fdHN0YW1wX2NvbmZpZywKIAkJCXN0cnVjdCBzbmRfcGNtX2F1ZGlvX3RzdGFtcF9yZXBvcnQgKmF1ZGlvX3RzdGFtcF9yZXBvcnQpCiB7CiAJc3RydWN0IGF6eF9kZXYgKmF6eF9kZXYgPSBnZXRfYXp4X2RldihzdWJzdHJlYW0pOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHN5c3RlbV9kZXZpY2VfY3Jvc3N0c3RhbXAgeHRzdGFtcDsKKwlpbnQgcmV0OwogCXU2NCBuc2VjOwogCiAJaWYgKChzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmluZm8gJiBTTkRSVl9QQ01fSU5GT19IQVNfTElOS19BVElNRSkgJiYKQEAgLTM2MSw4ICs1MjgsMzcgQEAKIAkJYXVkaW9fdHN0YW1wX3JlcG9ydC0+YWNjdXJhY3lfcmVwb3J0ID0gMTsgLyogcmVzdCBvZiBzdHJ1Y3R1cmUgaXMgdmFsaWQgKi8KIAkJYXVkaW9fdHN0YW1wX3JlcG9ydC0+YWNjdXJhY3kgPSA0MjsgLyogMjQgTUh6IFdhbGxDbG9jayA9PSA0Mm5zIHJlc29sdXRpb24gKi8KIAotCX0gZWxzZQorCX0gZWxzZSBpZiAoaXNfbGlua190aW1lX3N1cHBvcnRlZChydW50aW1lLCBhdWRpb190c3RhbXBfY29uZmlnKSkgeworCisJCXJldCA9IGF6eF9nZXRfY3Jvc3N0c3RhbXAoc3Vic3RyZWFtLCAmeHRzdGFtcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXN3aXRjaCAocnVudGltZS0+dHN0YW1wX3R5cGUpIHsKKwkJY2FzZSBTTkRSVl9QQ01fVFNUQU1QX1RZUEVfTU9OT1RPTklDOgorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2FzZSBTTkRSVl9QQ01fVFNUQU1QX1RZUEVfTU9OT1RPTklDX1JBVzoKKwkJCSpzeXN0ZW1fdHMgPSBrdGltZV90b190aW1lc3BlYyh4dHN0YW1wLnN5c19tb25vcmF3KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkqc3lzdGVtX3RzID0ga3RpbWVfdG9fdGltZXNwZWMoeHRzdGFtcC5zeXNfcmVhbHRpbWUpOworCQkJYnJlYWs7CisKKwkJfQorCisJCSphdWRpb190cyA9IGt0aW1lX3RvX3RpbWVzcGVjKHh0c3RhbXAuZGV2aWNlKTsKKworCQlhdWRpb190c3RhbXBfcmVwb3J0LT5hY3R1YWxfdHlwZSA9CisJCQlTTkRSVl9QQ01fQVVESU9fVFNUQU1QX1RZUEVfTElOS19TWU5DSFJPTklaRUQ7CisJCWF1ZGlvX3RzdGFtcF9yZXBvcnQtPmFjY3VyYWN5X3JlcG9ydCA9IDE7CisJCS8qIDI0IE1IeiBXYWxsQ2xvY2sgPT0gNDJucyByZXNvbHV0aW9uICovCisJCWF1ZGlvX3RzdGFtcF9yZXBvcnQtPmFjY3VyYWN5ID0gNDI7CisKKwl9IGVsc2UgewogCQlhdWRpb190c3RhbXBfcmVwb3J0LT5hY3R1YWxfdHlwZSA9IFNORFJWX1BDTV9BVURJT19UU1RBTVBfVFlQRV9ERUZBVUxUOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtNDEyLDYgKzYwOCwxMSBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gYXp4X2RldjsKKworCWlmIChjaGlwLT5ndHNfcHJlc2VudCkKKwkJYXp4X3BjbV9ody5pbmZvID0gYXp4X3BjbV9ody5pbmZvIHwKKwkJCVNORFJWX1BDTV9JTkZPX0hBU19MSU5LX1NZTkNIUk9OSVpFRF9BVElNRTsKKwogCXJ1bnRpbWUtPmh3ID0gYXp4X3BjbV9odzsKIAlydW50aW1lLT5ody5jaGFubmVsc19taW4gPSBoaW5mby0+Y2hhbm5lbHNfbWluOwogCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IGhpbmZvLT5jaGFubmVsc19tYXg7CkBAIC00OTUsNyArNjk2LDcgQEAKIAlyZXR1cm4gc25kX3BjbV9saWJfZGVmYXVsdF9tbWFwKHN1YnN0cmVhbSwgYXJlYSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgYXp4X3BjbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGF6eF9wY21fb3BzID0gewogCS5vcGVuID0gYXp4X3BjbV9vcGVuLAogCS5jbG9zZSA9IGF6eF9wY21fY2xvc2UsCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmgKaW5kZXggZWM2M2JiZi4uYTUwZTA1MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5oCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuaApAQCAtMTU5LDYgKzE1OSw5IEBACiAJdW5zaWduZWQgaW50IHJlZ2lvbl9yZXF1ZXN0ZWQ6MTsKIAl1bnNpZ25lZCBpbnQgZGlzYWJsZWQ6MTsgLyogZGlzYWJsZWQgYnkgdmdhX3N3aXRjaGVyb28gKi8KIAorCS8qIEdUUyBwcmVzZW50ICovCisJdW5zaWduZWQgaW50IGd0c19wcmVzZW50OjE7CisKICNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCiAJc3RydWN0IGF6eF9kZXYgc2F2ZWRfYXp4X2RldjsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKaW5kZXggMTYwYzdmNy4uYzM0NjlmNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCkBAIC01NCw2ICs1NCw3IEBACiAvKiBmb3Igc25vb3AgY29udHJvbCAqLwogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2VuZGlmCiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KQEAgLTE2NjMsNiArMTY2NCwyMiBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAorCWlmIChJU19TS0xfUExVUyhwY2kpKQorCQlzbmRfaGRhY19idXNfcGFyc2VfY2FwYWJpbGl0aWVzKGJ1cyk7CisKKwkvKgorCSAqIFNvbWUgSW50ZWwgQ1BVcyBoYXMgYWx3YXlzIHJ1bm5pbmcgdGltZXIgKEFSVCkgZmVhdHVyZSBhbmQKKwkgKiBjb250cm9sbGVyIG1heSBoYXZlIEdsb2JhbCB0aW1lIHN5bmMgcmVwb3J0aW5nIGNhcGFiaWxpdHksIHNvCisJICogY2hlY2sgYm90aCBvZiB0aGVzZSBiZWZvcmUgZGVjbGFyaW5nIHN5bmNocm9uaXplZCB0aW1lIHJlcG9ydGluZworCSAqIGNhcGFiaWxpdHkgU05EUlZfUENNX0lORk9fSEFTX0xJTktfU1lOQ0hST05JWkVEX0FUSU1FCisJICovCisJY2hpcC0+Z3RzX3ByZXNlbnQgPSBmYWxzZTsKKworI2lmZGVmIENPTkZJR19YODYKKwlpZiAoYnVzLT5wcGNhcCAmJiBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVJUKSkKKwkJY2hpcC0+Z3RzX3ByZXNlbnQgPSB0cnVlOworI2VuZGlmCisKIAlpZiAoY2hpcC0+bXNpKSB7CiAJCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19OT19NU0k2NCkgewogCQkJZGV2X2RiZyhjYXJkLT5kZXYsICJEaXNhYmxpbmcgNjRiaXQgTVNJXG4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jCmluZGV4IDljZWIyYmMuLmFkMDY4NjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYwpAQCAtNDAxOCw3ICs0MDE4LDcgQEAKIC8qCiAgKiBQQ00KICAqLwotc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjYTAxMzJfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY2EwMTMyX3BjbV9hbmFsb2dfcGxheWJhY2sgPSB7CiAJLnN1YnN0cmVhbXMgPSAxLAogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSA2LApAQCAtNDAyOSw3ICs0MDI5LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjYTAxMzJfcGNtX2FuYWxvZ19jYXB0dXJlID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjYTAxMzJfcGNtX2FuYWxvZ19jYXB0dXJlID0gewogCS5zdWJzdHJlYW1zID0gMSwKIAkuY2hhbm5lbHNfbWluID0gMiwKIAkuY2hhbm5lbHNfbWF4ID0gMiwKQEAgLTQwNDAsNyArNDA0MCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY2EwMTMyX3BjbV9kaWdpdGFsX3BsYXliYWNrID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjYTAxMzJfcGNtX2RpZ2l0YWxfcGxheWJhY2sgPSB7CiAJLnN1YnN0cmVhbXMgPSAxLAogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSAyLApAQCAtNDA1Miw3ICs0MDUyLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBoZGFfcGNtX3N0cmVhbSBjYTAxMzJfcGNtX2RpZ2l0YWxfY2FwdHVyZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gY2EwMTMyX3BjbV9kaWdpdGFsX2NhcHR1cmUgPSB7CiAJLnN1YnN0cmVhbXMgPSAxLAogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSAyLApAQCAtNDYxNCw3ICs0NjE0LDcgQEAKIAlrZnJlZShjb2RlYy0+c3BlYyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX29wcyBjYTAxMzJfcGF0Y2hfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY29kZWNfb3BzIGNhMDEzMl9wYXRjaF9vcHMgPSB7CiAJLmJ1aWxkX2NvbnRyb2xzID0gY2EwMTMyX2J1aWxkX2NvbnRyb2xzLAogCS5idWlsZF9wY21zID0gY2EwMTMyX2J1aWxkX3BjbXMsCiAJLmluaXQgPSBjYTAxMzJfaW5pdCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYwppbmRleCA1NmZlZmJkLi5lZDYyNzQ4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCkBAIC0yNjEsNiArMjYxLDcgQEAKIAlDWFRfRklYVVBfSFBfNTMwLAogCUNYVF9GSVhVUF9DQVBfTUlYX0FNUF81MDQ3LAogCUNYVF9GSVhVUF9NVVRFX0xFRF9FQVBELAorCUNYVF9GSVhVUF9IUF9TUEVDVFJFLAogfTsKIAogLyogZm9yIGhkYV9maXh1cF90aGlua3BhZF9hY3BpKCkgKi8KQEAgLTc2NSw2ICs3NjYsMTQgQEAKIAkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKIAkJLnYuZnVuYyA9IGN4dF9maXh1cF9tdXRlX2xlZF9lYXBkLAogCX0sCisJW0NYVF9GSVhVUF9IUF9TUEVDVFJFXSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgaGRhX3BpbnRibFtdKSB7CisJCQkvKiBlbmFibGUgTklEIDB4MWQgZm9yIHRoZSBzcGVha2VyIG9uIHRvcCAqLworCQkJeyAweDFkLCAweDkxMTcwMTExIH0sCisJCQl7IH0KKwkJfQorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgY3h0NTA0NV9maXh1cHNbXSA9IHsKQEAgLTgxNCw2ICs4MjMsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDI1LCAweDA1NDMsICJBY2VyIEFzcGlyZSBPbmUgNTIyIiwgQ1hUX0ZJWFVQX1NURVJFT19ETUlDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwNTRjLCAiQWNlciBBc3BpcmUgMzgzMFRHIiwgQ1hUX0ZJWFVQX0FTUElSRV9ETUlDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyNSwgMHgwNTRmLCAiQWNlciBBc3BpcmUgNDgzMFQiLCBDWFRfRklYVVBfQVNQSVJFX0RNSUMpLAorCVNORF9QQ0lfUVVJUksoMHgxMDNjLCAweDgxNzQsICJIUCBTcGVjdHJlIHgzNjAiLCBDWFRfRklYVVBfSFBfU1BFQ1RSRSksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4MTM4ZCwgIkFzdXMiLCBDWFRfRklYVVBfSEVBRFBIT05FX01JQ19QSU4pLAogCVNORF9QQ0lfUVVJUksoMHgxNTJkLCAweDA4MzMsICJPTFBDIFhPLTEuNSIsIENYVF9GSVhVUF9PTFBDX1hPKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMGYyLCAiTGVub3ZvIFQ0MDAiLCBDWFRfUElOQ0ZHX0xFTk9WT19UUDQxMCksCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCmluZGV4IDcxMDBmMDUuLmI1OGU4YzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCkBAIC00ODU1LDYgKzQ4NTUsNyBAQAogCUFMQzIyMV9GSVhVUF9IUF9GUk9OVF9NSUMsCiAJQUxDMjkyX0ZJWFVQX1RQVDQ2MCwKIAlBTEMyOThfRklYVVBfU1BLX1ZPTFVNRSwKKwlBTEMyNTZfRklYVVBfREVMTF9JTlNQSVJPTl83NTU5X1NVQldPT0ZFUiwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwIGFsYzI2OV9maXh1cHNbXSA9IHsKQEAgLTUyNjMsNiArNTI2NCw4IEBACiAJW0FMQzI2OV9GSVhVUF9USElOS1BBRF9BQ1BJXSA9IHsKIAkJLnR5cGUgPSBIREFfRklYVVBfRlVOQywKIAkJLnYuZnVuYyA9IGhkYV9maXh1cF90aGlua3BhZF9hY3BpLAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzI2OV9GSVhVUF9TS1VfSUdOT1JFLAogCX0sCiAJW0FMQzI2OV9GSVhVUF9ETUlDX1RISU5LUEFEX0FDUEldID0gewogCQkudHlwZSA9IEhEQV9GSVhVUF9GVU5DLApAQCAtNTUxNiw2ICs1NTE5LDE1IEBACiAJCS5jaGFpbmVkID0gdHJ1ZSwKIAkJLmNoYWluX2lkID0gQUxDMjk4X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKIAl9LAorCVtBTEMyNTZfRklYVVBfREVMTF9JTlNQSVJPTl83NTU5X1NVQldPT0ZFUl0gPSB7CisJCS50eXBlID0gSERBX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGhkYV9waW50YmxbXSkgeworCQkJeyAweDFiLCAweDkwMTcwMTUxIH0sCisJCQl7IH0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjaV9xdWlyayBhbGMyNjlfZml4dXBfdGJsW10gPSB7CkBAIC01NTYwLDYgKzU1NzIsNyBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA2ZGYsICJEZWxsIiwgQUxDMjkzX0ZJWFVQX0RJU0FCTEVfQUFNSVhfTVVMVElKQUNLKSwKIAlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNmUwLCAiRGVsbCIsIEFMQzI5M19GSVhVUF9ESVNBQkxFX0FBTUlYX01VTFRJSkFDSyksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDcwNCwgIkRlbGwgWFBTIDEzIDkzNTAiLCBBTEMyNTZfRklYVVBfREVMTF9YUFNfMTNfSEVBRFBIT05FX05PSVNFKSwKKwlTTkRfUENJX1FVSVJLKDB4MTAyOCwgMHgwNzA2LCAiRGVsbCBJbnNwaXJvbiA3NTU5IiwgQUxDMjU2X0ZJWFVQX0RFTExfSU5TUElST05fNzU1OV9TVUJXT09GRVIpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA3MjUsICJEZWxsIEluc3Bpcm9uIDMxNjIiLCBBTEMyNTVfRklYVVBfREVMTF9TUEtfTk9JU0UpLAogCVNORF9QQ0lfUVVJUksoMHgxMDI4LCAweDA3NWIsICJEZWxsIFhQUyAxMyA5MzYwIiwgQUxDMjU2X0ZJWFVQX0RFTExfWFBTXzEzX0hFQURQSE9ORV9OT0lTRSksCiAJU05EX1BDSV9RVUlSSygweDEwMjgsIDB4MDc1ZCwgIkRlbGwgQUlPIiwgQUxDMjk4X0ZJWFVQX1NQS19WT0xVTUUpLApAQCAtNTc5NSw2ICs1ODA4LDEzIEBACiAJezB4MTQsIDB4OTAxNzAxMTB9LCBcCiAJezB4MTUsIDB4MDIyMTQwMWZ9CiAKKyNkZWZpbmUgQUxDMjk1X1NUQU5EQVJEX1BJTlMgXAorCXsweDEyLCAweGI3YTYwMTMwfSwgXAorCXsweDE0LCAweDkwMTcwMTEwfSwgXAorCXsweDE3LCAweDIxMDE0MDIwfSwgXAorCXsweDE4LCAweDIxYTE5MDMwfSwgXAorCXsweDIxLCAweDA0MjExMDIwfQorCiAjZGVmaW5lIEFMQzI5OF9TVEFOREFSRF9QSU5TIFwKIAl7MHgxMiwgMHg5MGE2MDEzMH0sIFwKIAl7MHgyMSwgMHgwMzIxMTAyMH0KQEAgLTU4MzUsNiArNTg1NSwxMCBAQAogCQl7MHgxNCwgMHg5MDE3MDEyMH0sCiAJCXsweDIxLCAweDAyMjExMDMwfSksCiAJU05EX0hEQV9QSU5fUVVJUksoMHgxMGVjMDI1NSwgMHgxMDI4LCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UsCisJCXsweDE0LCAweDkwMTcwMTEwfSwKKwkJezB4MWIsIDB4MDIwMTEwMjB9LAorCQl7MHgyMSwgMHgwMjIxMTAxZn0pLAorCVNORF9IREFfUElOX1FVSVJLKDB4MTBlYzAyNTUsIDB4MTAyOCwgIkRlbGwiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFLAogCQl7MHgxNCwgMHg5MDE3MDEzMH0sCiAJCXsweDFiLCAweDAxMDE0MDIwfSwKIAkJezB4MjEsIDB4MDIyMTEwM2Z9KSwKQEAgLTU4OTUsNiArNTkxOSwxNCBAQAogCQl7MHgxMiwgMHg5MGE2MDE3MH0sCiAJCXsweDE0LCAweDkwMTcwMTIwfSwKIAkJezB4MjEsIDB4MDIyMTEwMzB9KSwKKwlTTkRfSERBX1BJTl9RVUlSSygweDEwZWMwMjU2LCAweDEwMjgsICJEZWxsIEluc3Bpcm9uIDU0NjgiLCBBTEMyNTVfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFLAorCQl7MHgxMiwgMHg5MGE2MDE4MH0sCisJCXsweDE0LCAweDkwMTcwMTIwfSwKKwkJezB4MjEsIDB4MDIyMTEwMzB9KSwKKwlTTkRfSERBX1BJTl9RVUlSSygweDEwZWMwMjU2LCAweDEwMjgsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKKwkJezB4MTIsIDB4YjdhNjAxMzB9LAorCQl7MHgxNCwgMHg5MDE3MDExMH0sCisJCXsweDIxLCAweDAyMjExMDIwfSksCiAJU05EX0hEQV9QSU5fUVVJUksoMHgxMGVjMDI1NiwgMHgxMDI4LCAiRGVsbCIsIEFMQzI1NV9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UsCiAJCUFMQzI1Nl9TVEFOREFSRF9QSU5TKSwKIAlTTkRfSERBX1BJTl9RVUlSSygweDEwZWMwMjgwLCAweDEwM2MsICJIUCIsIEFMQzI4MF9GSVhVUF9IUF9HUElPNCwKQEAgLTYwMDYsNiArNjAzOCw4IEBACiAJU05EX0hEQV9QSU5fUVVJUksoMHgxMGVjMDI5MywgMHgxMDI4LCAiRGVsbCIsIEFMQzI5M19GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UsCiAJCUFMQzI5Ml9TVEFOREFSRF9QSU5TLAogCQl7MHgxMywgMHg5MGE2MDE0MH0pLAorCVNORF9IREFfUElOX1FVSVJLKDB4MTBlYzAyOTUsIDB4MTAyOCwgIkRlbGwiLCBBTEMyNjlfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFLAorCQlBTEMyOTVfU1RBTkRBUkRfUElOUyksCiAJU05EX0hEQV9QSU5fUVVJUksoMHgxMGVjMDI5OCwgMHgxMDI4LCAiRGVsbCIsIEFMQzI5OF9GSVhVUF9ERUxMMV9NSUNfTk9fUFJFU0VOQ0UsCiAJCUFMQzI5OF9TVEFOREFSRF9QSU5TLAogCQl7MHgxNywgMHg5MDE3MDExMH0pLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCmluZGV4IDhhZTNiYjcuLmI0YWE0YzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKQEAgLTg0Nyw3ICs4NDcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pY2UxNzEyX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ljZTE3MTJfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9pY2UxNzEyX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2ljZTE3MTJfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC04NTgsNyArODU4LDcgQEAKIAkucG9pbnRlciA9CXNuZF9pY2UxNzEyX3BsYXliYWNrX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pY2UxNzEyX3BsYXliYWNrX2RzX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ljZTE3MTJfcGxheWJhY2tfZHNfb3BzID0gewogCS5vcGVuID0JCXNuZF9pY2UxNzEyX3BsYXliYWNrX2RzX29wZW4sCiAJLmNsb3NlID0Jc25kX2ljZTE3MTJfcGxheWJhY2tfZHNfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC04NjksNyArODY5LDcgQEAKIAkucG9pbnRlciA9CXNuZF9pY2UxNzEyX3BsYXliYWNrX2RzX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pY2UxNzEyX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaWNlMTcxMl9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfaWNlMTcxMl9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX2ljZTE3MTJfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyMjgsNyArMTIyOCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ljZTE3MTJfcGxheWJhY2tfcHJvX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ljZTE3MTJfcGxheWJhY2tfcHJvX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfaWNlMTcxMl9wbGF5YmFja19wcm9fb3BlbiwKIAkuY2xvc2UgPQlzbmRfaWNlMTcxMl9wbGF5YmFja19wcm9fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjM5LDcgKzEyMzksNyBAQAogCS5wb2ludGVyID0Jc25kX2ljZTE3MTJfcGxheWJhY2tfcHJvX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pY2UxNzEyX2NhcHR1cmVfcHJvX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ljZTE3MTJfY2FwdHVyZV9wcm9fb3BzID0gewogCS5vcGVuID0JCXNuZF9pY2UxNzEyX2NhcHR1cmVfcHJvX29wZW4sCiAJLmNsb3NlID0Jc25kX2ljZTE3MTJfY2FwdHVyZV9wcm9fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKaW5kZXggMGIyMmMwMC4uZTVjNTJlZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwpAQCAtNjIwLDkgKzYyMCw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RkY2xvY2tfZ2V0X3JhdGUoc3RydWN0IHNuZF9pY2UxNzEyICppY2UpCiB7Ci0JdW5zaWduZWQgaW50IHJhdGU7Ci0JcmF0ZSA9IHN0ZGNsb2NrX3JhdGVfbGlzdFtpbmIoSUNFTVQxNzI0KGljZSwgUkFURSkpICYgMTVdOwotCXJldHVybiByYXRlOworCXJldHVybiBzdGRjbG9ja19yYXRlX2xpc3RbaW5iKElDRU1UMTcyNChpY2UsIFJBVEUpKSAmIDE1XTsKIH0KIAogc3RhdGljIHZvaWQgc3RkY2xvY2tfc2V0X3JhdGUoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIHVuc2lnbmVkIGludCByYXRlKQpAQCAtMTExMyw3ICsxMTExLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdnQxNzI0X3BsYXliYWNrX3Byb19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92dDE3MjRfcGxheWJhY2tfcHJvX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdnQxNzI0X3BsYXliYWNrX3Byb19vcGVuLAogCS5jbG9zZSA9CXNuZF92dDE3MjRfcGxheWJhY2tfcHJvX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTEyNCw3ICsxMTIyLDcgQEAKIAkucG9pbnRlciA9CXNuZF92dDE3MjRfcGxheWJhY2tfcHJvX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92dDE3MjRfY2FwdHVyZV9wcm9fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdnQxNzI0X2NhcHR1cmVfcHJvX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdnQxNzI0X2NhcHR1cmVfcHJvX29wZW4sCiAJLmNsb3NlID0Jc25kX3Z0MTcyNF9jYXB0dXJlX3Byb19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyOTIsNyArMTI5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3Z0MTcyNF9wbGF5YmFja19zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92dDE3MjRfcGxheWJhY2tfc3BkaWZfb3BzID0gewogCS5vcGVuID0JCXNuZF92dDE3MjRfcGxheWJhY2tfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdnQxNzI0X3BsYXliYWNrX3NwZGlmX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTMwMyw3ICsxMzAxLDcgQEAKIAkucG9pbnRlciA9CXNuZF92dDE3MjRfcGNtX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92dDE3MjRfY2FwdHVyZV9zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92dDE3MjRfY2FwdHVyZV9zcGRpZl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3Z0MTcyNF9jYXB0dXJlX3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX3Z0MTcyNF9jYXB0dXJlX3NwZGlmX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTQzNyw3ICsxNDM1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdnQxNzI0X3BsYXliYWNrX2luZGVwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3Z0MTcyNF9wbGF5YmFja19pbmRlcF9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3Z0MTcyNF9wbGF5YmFja19pbmRlcF9vcGVuLAogCS5jbG9zZSA9CXNuZF92dDE3MjRfcGxheWJhY2tfaW5kZXBfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYyBiL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCmluZGV4IDllMWFkMTEuLjU2NWY3ZjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCisrKyBiL3NvdW5kL3BjaS9rb3JnMTIxMi9rb3JnMTIxMi5jCkBAIC0xNjgxLDcgKzE2ODEsNyBAQAogCXJldHVybiBzbmRfa29yZzEyMTJfY29weV90byhrb3JnMTIxMiwgZHN0LCBwb3MsIGNvdW50LCAwLCBrb3JnMTIxMi0+Y2hhbm5lbHMgKiAyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfa29yZzEyMTJfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfa29yZzEyMTJfcGxheWJhY2tfb3BzID0gewogICAgICAgICAub3BlbiA9CQlzbmRfa29yZzEyMTJfcGxheWJhY2tfb3BlbiwKICAgICAgICAgLmNsb3NlID0Jc25kX2tvcmcxMjEyX3BsYXliYWNrX2Nsb3NlLAogICAgICAgICAuaW9jdGwgPQlzbmRfa29yZzEyMTJfaW9jdGwsCkBAIC0xNjkzLDcgKzE2OTMsNyBAQAogICAgICAgICAuc2lsZW5jZSA9CXNuZF9rb3JnMTIxMl9wbGF5YmFja19zaWxlbmNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfa29yZzEyMTJfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9rb3JnMTIxMl9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfa29yZzEyMTJfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9rb3JnMTIxMl9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9rb3JnMTIxMl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9sb2xhL2xvbGFfcGNtLmMgYi9zb3VuZC9wY2kvbG9sYS9sb2xhX3BjbS5jCmluZGV4IDNiZDY5ODUuLjEyNjhiYTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9sb2xhL2xvbGFfcGNtLmMKKysrIGIvc291bmQvcGNpL2xvbGEvbG9sYV9wY20uYwpAQCAtNTg2LDcgKzU4Niw3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGxvbGFfcGNtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgbG9sYV9wY21fb3BzID0gewogCS5vcGVuID0gbG9sYV9wY21fb3BlbiwKIAkuY2xvc2UgPSBsb2xhX3BjbV9jbG9zZSwKIAkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9seDY0NjRlcy9seDY0NjRlcy5jIGIvc291bmQvcGNpL2x4NjQ2NGVzL2x4NjQ2NGVzLmMKaW5kZXggOGI4ZTJlNS4uYzBmMGMzNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2x4NjQ2NGVzL2x4NjQ2NGVzLmMKKysrIGIvc291bmQvcGNpL2x4NjQ2NGVzL2x4NjQ2NGVzLmMKQEAgLTgwNCw3ICs4MDQsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgbHhfb3BzX3BsYXliYWNrID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBseF9vcHNfcGxheWJhY2sgPSB7CiAJLm9wZW4gICAgICA9IGx4X3BjbV9vcGVuLAogCS5jbG9zZSAgICAgPSBseF9wY21fY2xvc2UsCiAJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtODE1LDcgKzgxNSw3IEBACiAJLnBvaW50ZXIgICA9IGx4X3BjbV9zdHJlYW1fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgbHhfb3BzX2NhcHR1cmUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGx4X29wc19jYXB0dXJlID0gewogCS5vcGVuICAgICAgPSBseF9wY21fb3BlbiwKIAkuY2xvc2UgICAgID0gbHhfcGNtX2Nsb3NlLAogCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9tYWVzdHJvMy5jIGIvc291bmQvcGNpL21hZXN0cm8zLmMKaW5kZXggMTdhZTkyNi4uY2FmZWE2ZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21hZXN0cm8zLmMKKysrIGIvc291bmQvcGNpL21hZXN0cm8zLmMKQEAgLTE4MzQsNyArMTgzNCw3IEBACiAgKiBjcmVhdGUgcGNtIGluc3RhbmNlCiAgKi8KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbTNfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbTNfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9tM19wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9tM19wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE4NDUsNyArMTg0NSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfbTNfcGNtX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9tM19jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX20zX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9tM19jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX20zX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jIGIvc291bmQvcGNpL21peGFydC9taXhhcnQuYwppbmRleCAyNWMwZGRkLi44MGQ0Mzk5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCisrKyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMKQEAgLTkyMiw3ICs5MjIsNyBAQAogCiAKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbWl4YXJ0X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX21peGFydF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gICAgICA9IHNuZF9taXhhcnRfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgICAgID0gc25kX21peGFydF9jbG9zZSwKIAkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC05MzMsNyArOTMzLDcgQEAKIAkucG9pbnRlciAgID0gc25kX21peGFydF9zdHJlYW1fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX21peGFydF9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX21peGFydF9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiAgICAgID0gc25kX21peGFydF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlICAgICA9IHNuZF9taXhhcnRfY2xvc2UsCiAJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL25tMjU2L25tMjU2LmMgYi9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYwppbmRleCA0NzM1ZTI3Li4xMDNmZTMxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYworKysgYi9zb3VuZC9wY2kvbm0yNTYvbm0yNTYuYwpAQCAtOTAyLDcgKzkwMiw3IEBACiAvKgogICogY3JlYXRlIGEgcGNtIGluc3RhbmNlCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX25tMjU2X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX25tMjU2X3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfbm0yNTZfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfbm0yNTZfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC05MTcsNyArOTE3LDcgQEAKIAkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX2lvbWVtLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfbm0yNTZfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ubTI1Nl9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfbm0yNTZfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9ubTI1Nl9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL294eWdlbi9veHlnZW5fcGNtLmMgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9wY20uYwppbmRleCBhYTJlYmQxLi4wNDJhMjQzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9wY20uYworKysgYi9zb3VuZC9wY2kvb3h5Z2VuL294eWdlbl9wY20uYwpAQCAtNjMxLDcgKzYzMSw3IEBACiAJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBjdXJyX2FkZHIgLSAodTMyKXJ1bnRpbWUtPmRtYV9hZGRyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fcmVjX2Ffb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fcmVjX2Ffb3BzID0gewogCS5vcGVuICAgICAgPSBveHlnZW5fcmVjX2Ffb3BlbiwKIAkuY2xvc2UgICAgID0gb3h5Z2VuX2Nsb3NlLAogCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTY0Miw3ICs2NDIsNyBAQAogCS5wb2ludGVyICAgPSBveHlnZW5fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX3JlY19iX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX3JlY19iX29wcyA9IHsKIAkub3BlbiAgICAgID0gb3h5Z2VuX3JlY19iX29wZW4sCiAJLmNsb3NlICAgICA9IG94eWdlbl9jbG9zZSwKIAkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC02NTMsNyArNjUzLDcgQEAKIAkucG9pbnRlciAgID0gb3h5Z2VuX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9yZWNfY19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9yZWNfY19vcHMgPSB7CiAJLm9wZW4gICAgICA9IG94eWdlbl9yZWNfY19vcGVuLAogCS5jbG9zZSAgICAgPSBveHlnZW5fY2xvc2UsCiAJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApAQCAtNjY0LDcgKzY2NCw3IEBACiAJLnBvaW50ZXIgICA9IG94eWdlbl9wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fc3BkaWZfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fc3BkaWZfb3BzID0gewogCS5vcGVuICAgICAgPSBveHlnZW5fc3BkaWZfb3BlbiwKIAkuY2xvc2UgICAgID0gb3h5Z2VuX2Nsb3NlLAogCS5pb2N0bCAgICAgPSBzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTY3NSw3ICs2NzUsNyBAQAogCS5wb2ludGVyICAgPSBveHlnZW5fcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX211bHRpY2hfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBveHlnZW5fbXVsdGljaF9vcHMgPSB7CiAJLm9wZW4gICAgICA9IG94eWdlbl9tdWx0aWNoX29wZW4sCiAJLmNsb3NlICAgICA9IG94eWdlbl9jbG9zZSwKIAkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC02ODYsNyArNjg2LDcgQEAKIAkucG9pbnRlciAgID0gb3h5Z2VuX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIG94eWdlbl9hYzk3X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgb3h5Z2VuX2FjOTdfb3BzID0gewogCS5vcGVuICAgICAgPSBveHlnZW5fYWM5N19vcGVuLAogCS5jbG9zZSAgICAgPSBveHlnZW5fY2xvc2UsCiAJLmlvY3RsICAgICA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3BjeGhyL3BjeGhyLmMgYi9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYwppbmRleCA5MjkzMjM1Li5iYjdlZWU5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYworKysgYi9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYwpAQCAtMTE0Niw3ICsxMTQ2LDcgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHBjeGhyX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgcGN4aHJfb3BzID0gewogCS5vcGVuICAgICAgPSBwY3hocl9vcGVuLAogCS5jbG9zZSAgICAgPSBwY3hocl9jbG9zZSwKIAkuaW9jdGwgICAgID0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMgYi9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKaW5kZXggMDY3YTkxMi4uYWRhNWYwMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCisrKyBiL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYwpAQCAtNjQ0LDcgKzY0NCw3IEBACiAJIC5tb25vID0gbGJ1c19wbGF5X21vbm8zLAogCSB9LAogfTsKLXN0YXRpYyBzdHJ1Y3QgbGJ1c3BhdGggbGJ1c19yZWNfcGF0aCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGJ1c3BhdGggbGJ1c19yZWNfcGF0aCA9IHsKIAkubm9jb252ID0gbGJ1c19yZWNfbm9jb252MSwKIAkuc3RlcmVvID0gbGJ1c19yZWNfc3RlcmVvMSwKIAkubW9ubyA9IGxidXNfcmVjX21vbm8xLApAQCAtMTY2OSw3ICsxNjY5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcmlwdGlkZV9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9yaXB0aWRlX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9IHNuZF9yaXB0aWRlX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0gc25kX3JpcHRpZGVfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xNjgwLDcgKzE2ODAsNyBAQAogCS50cmlnZ2VyID0gc25kX3JpcHRpZGVfdHJpZ2dlciwKIAkucG9pbnRlciA9IHNuZF9yaXB0aWRlX3BvaW50ZXIsCiB9Owotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcmlwdGlkZV9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JpcHRpZGVfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPSBzbmRfcmlwdGlkZV9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0gc25kX3JpcHRpZGVfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWUzMi5jIGIvc291bmQvcGNpL3JtZTMyLmMKaW5kZXggY2Q5NGFjNS4uOTZkMTVkYiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTMyLmMKKysrIGIvc291bmQvcGNpL3JtZTMyLmMKQEAgLTExOTYsNyArMTE5Niw3IEBACiB9CiAKIC8qIGZvciBoYWxmZHVwbGV4IG1vZGUgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX3BsYXliYWNrX3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX3BsYXliYWNrX3NwZGlmX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lMzJfcGxheWJhY2tfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lMzJfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjEwLDcgKzEyMTAsNyBAQAogCS5tbWFwID0JCXNuZF9wY21fbGliX21tYXBfaW9tZW0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9jYXB0dXJlX3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX2NhcHR1cmVfc3BkaWZfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWUzMl9jYXB0dXJlX3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTMyX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjIzLDcgKzEyMjMsNyBAQAogCS5tbWFwID0JCXNuZF9wY21fbGliX21tYXBfaW9tZW0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9wbGF5YmFja19hZGF0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX3BsYXliYWNrX2FkYXRfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWUzMl9wbGF5YmFja19hZGF0X29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTMyX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTIzNiw3ICsxMjM2LDcgQEAKIAkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX2lvbWVtLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfY2FwdHVyZV9hZGF0X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX2NhcHR1cmVfYWRhdF9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTMyX2NhcHR1cmVfYWRhdF9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWUzMl9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTI0OSw3ICsxMjQ5LDcgQEAKIH07CiAKIC8qIGZvciBmdWxsZHVwbGV4IG1vZGUgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX3BsYXliYWNrX3NwZGlmX2ZkX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX3BsYXliYWNrX3NwZGlmX2ZkX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lMzJfcGxheWJhY2tfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lMzJfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMjYxLDcgKzEyNjEsNyBAQAogCS5hY2sgPQkJc25kX3JtZTMyX3BsYXliYWNrX2ZkX2FjaywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX2NhcHR1cmVfc3BkaWZfZmRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfY2FwdHVyZV9zcGRpZl9mZF9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTMyX2NhcHR1cmVfc3BkaWZfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lMzJfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyNzMsNyArMTI3Myw3IEBACiAJLmFjayA9CQlzbmRfcm1lMzJfY2FwdHVyZV9mZF9hY2ssCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9wbGF5YmFja19hZGF0X2ZkX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTMyX3BsYXliYWNrX2FkYXRfZmRfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWUzMl9wbGF5YmFja19hZGF0X29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTMyX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTI4NCw3ICsxMjg0LDcgQEAKIAkuYWNrID0JCXNuZF9ybWUzMl9wbGF5YmFja19mZF9hY2ssCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWUzMl9jYXB0dXJlX2FkYXRfZmRfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lMzJfY2FwdHVyZV9hZGF0X2ZkX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lMzJfY2FwdHVyZV9hZGF0X29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTMyX2NhcHR1cmVfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTYuYyBiL3NvdW5kL3BjaS9ybWU5Ni5jCmluZGV4IDQxYzMxZGIuLjA1YjlkYTMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5Ni5jCisrKyBiL3NvdW5kL3BjaS9ybWU5Ni5jCkBAIC0xNTA1LDcgKzE1MDUsNyBAQAogCXJldHVybiBzbmRfcm1lOTZfY2FwdHVyZV9wdHIocm1lOTYpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5Nl9wbGF5YmFja19zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5Nl9wbGF5YmFja19zcGRpZl9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3JtZTk2X3BsYXliYWNrX3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX3JtZTk2X3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTUxOCw3ICsxNTE4LDcgQEAKIAkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX2lvbWVtLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTZfY2FwdHVyZV9zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5Nl9jYXB0dXJlX3NwZGlmX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lOTZfY2FwdHVyZV9zcGRpZl9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWU5Nl9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTUzMCw3ICsxNTMwLDcgQEAKIAkubW1hcCA9CQlzbmRfcGNtX2xpYl9tbWFwX2lvbWVtLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTZfcGxheWJhY2tfYWRhdF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5Nl9wbGF5YmFja19hZGF0X29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lOTZfcGxheWJhY2tfYWRhdF9vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWU5Nl9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTE1NDMsNyArMTU0Myw3IEBACiAJLm1tYXAgPQkJc25kX3BjbV9saWJfbW1hcF9pb21lbSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2X2NhcHR1cmVfYWRhdF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5Nl9jYXB0dXJlX2FkYXRfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWU5Nl9jYXB0dXJlX2FkYXRfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lOTZfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwppbmRleCA3Yzg5NDFiLi5iOTRmYzYzIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCkBAIC00ODYxLDcgKzQ4NjEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9oZHNwX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2hkc3BfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9oZHNwX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX2hkc3BfcGxheWJhY2tfcmVsZWFzZSwKIAkuaW9jdGwgPQlzbmRfaGRzcF9pb2N0bCwKQEAgLTQ4NzMsNyArNDg3Myw3IEBACiAJLnNpbGVuY2UgPQlzbmRfaGRzcF9od19zaWxlbmNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfaGRzcF9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2hkc3BfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX2hkc3BfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF9oZHNwX2NhcHR1cmVfcmVsZWFzZSwKIAkuaW9jdGwgPQlzbmRfaGRzcF9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCmluZGV4IGE0YTk5OWEuLjE0YmJmNTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwpAQCAtMTY2Niw3ICsxNjY2LDcgQEAKIAkJCSAgICBIRFNQTV9BVVRPU1lOQ19GUk9NX05PTkUpIHsKIAogCQkJCWRldl93YXJuKGhkc3BtLT5jYXJkLT5kZXYsCi0JCQkJCSAiRGV0ZWN0ZWQgbm8gRXh0ZXJuZWwgU3luY1xuIik7CisJCQkJCSAiRGV0ZWN0ZWQgbm8gRXh0ZXJuYWwgU3luY1xuIik7CiAJCQkJbm90X3NldCA9IDE7CiAKIAkJCX0gZWxzZSBpZiAocmF0ZSAhPSBleHRlcm5hbF9mcmVxKSB7CkBAIC02MzYxLDcgKzYzNjEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9oZHNwbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9oZHNwbV9vcHMgPSB7CiAJLm9wZW4gPSBzbmRfaGRzcG1fb3BlbiwKIAkuY2xvc2UgPSBzbmRfaGRzcG1fcmVsZWFzZSwKIAkuaW9jdGwgPSBzbmRfaGRzcG1faW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKaW5kZXggZmRiYzBhYS4uNTUxNzJjNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYwpAQCAtMjM2OCw3ICsyMzY4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfcm1lOTY1Ml9wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5NjUyX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfcm1lOTY1Ml9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF9ybWU5NjUyX3BsYXliYWNrX3JlbGVhc2UsCiAJLmlvY3RsID0Jc25kX3JtZTk2NTJfaW9jdGwsCkBAIC0yMzgwLDcgKzIzODAsNyBAQAogCS5zaWxlbmNlID0Jc25kX3JtZTk2NTJfaHdfc2lsZW5jZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3JtZTk2NTJfY2FwdHVyZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9ybWU5NjUyX2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF9ybWU5NjUyX2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfcm1lOTY1Ml9jYXB0dXJlX3JlbGVhc2UsCiAJLmlvY3RsID0Jc25kX3JtZTk2NTJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvc29uaWN2aWJlcy5jIGIvc291bmQvcGNpL3NvbmljdmliZXMuYwppbmRleCAxYjZmYWQ3Li5lMWExMzg3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvc29uaWN2aWJlcy5jCisrKyBiL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKQEAgLTg1Nyw3ICs4NTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9zb25pY3ZpYmVzX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3NvbmljdmliZXNfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF9zb25pY3ZpYmVzX3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX3NvbmljdmliZXNfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC04NjgsNyArODY4LDcgQEAKIAkucG9pbnRlciA9CXNuZF9zb25pY3ZpYmVzX3BsYXliYWNrX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9zb25pY3ZpYmVzX2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfc29uaWN2aWJlc19jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfc29uaWN2aWJlc19jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX3NvbmljdmliZXNfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKaW5kZXggNTk5ZDJiNy4uMjdmMGVkOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKKysrIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKQEAgLTIwNzAsNyArMjA3MCw3IEBACiAgICBQQ00gb3BlcmF0aW9ucwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfcGxheWJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF90cmlkZW50X3BsYXliYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX3RyaWRlbnRfcGxheWJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3RyaWRlbnRfaW9jdGwsCkBAIC0yMDgxLDcgKzIwODEsNyBAQAogCS5wb2ludGVyID0Jc25kX3RyaWRlbnRfcGxheWJhY2tfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfbnhfcGxheWJhY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9ueF9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3RyaWRlbnRfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdHJpZGVudF9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQlzbmRfdHJpZGVudF9pb2N0bCwKQEAgLTIxMTUsNyArMjExNSw3IEBACiAJLnBvaW50ZXIgPQlzbmRfdHJpZGVudF9wbGF5YmFja19wb2ludGVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdHJpZGVudF9mb2xkYmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X2ZvbGRiYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdHJpZGVudF9mb2xkYmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF90cmlkZW50X2ZvbGRiYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF90cmlkZW50X2lvY3RsLApAQCAtMjEyNiw3ICsyMTI2LDcgQEAKIAkucG9pbnRlciA9CXNuZF90cmlkZW50X3BsYXliYWNrX3BvaW50ZXIsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X254X2ZvbGRiYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfbnhfZm9sZGJhY2tfb3BzID0gewogCS5vcGVuID0JCXNuZF90cmlkZW50X2ZvbGRiYWNrX29wZW4sCiAJLmNsb3NlID0Jc25kX3RyaWRlbnRfZm9sZGJhY2tfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3RyaWRlbnRfaW9jdGwsCkBAIC0yMTM4LDcgKzIxMzgsNyBAQAogCS5wYWdlID0JCXNuZF9wY21fc2didWZfb3BzX3BhZ2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X3NwZGlmX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfc3BkaWZfb3BzID0gewogCS5vcGVuID0JCXNuZF90cmlkZW50X3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX3RyaWRlbnRfc3BkaWZfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3RyaWRlbnRfaW9jdGwsCkBAIC0yMTQ5LDcgKzIxNDksNyBAQAogCS5wb2ludGVyID0Jc25kX3RyaWRlbnRfc3BkaWZfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3RyaWRlbnRfc3BkaWZfNzAxOF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF90cmlkZW50X3NwZGlmXzcwMThfb3BzID0gewogCS5vcGVuID0JCXNuZF90cmlkZW50X3NwZGlmX29wZW4sCiAJLmNsb3NlID0Jc25kX3RyaWRlbnRfc3BkaWZfY2xvc2UsCiAJLmlvY3RsID0Jc25kX3RyaWRlbnRfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCAzZGQwMzhiLi4zOGExN2I0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTEzNjYsNyArMTM2Niw3IEBACiAKIAogLyogdmlhNjg2IHBsYXliYWNrIGNhbGxiYWNrcyAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhNjg2X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTY4Nl9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3ZpYTY4Nl9wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF92aWE4Mnh4X3BjbV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEzNzksNyArMTM3OSw3IEBACiB9OwogCiAvKiB2aWE2ODYgY2FwdHVyZSBjYWxsYmFja3MgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTY4Nl9jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTY4Nl9jYXB0dXJlX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdmlhODJ4eF9jYXB0dXJlX29wZW4sCiAJLmNsb3NlID0Jc25kX3ZpYTgyeHhfcGNtX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTM5Miw3ICsxMzkyLDcgQEAKIH07CiAKIC8qIHZpYTgyM3ggRFNYIHBsYXliYWNrIGNhbGxiYWNrcyAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhODIzM19wbGF5YmFja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF92aWE4MjMzX3BsYXliYWNrX29wcyA9IHsKIAkub3BlbiA9CQlzbmRfdmlhODIzM19wbGF5YmFja19vcGVuLAogCS5jbG9zZSA9CXNuZF92aWE4MjMzX3BsYXliYWNrX2Nsb3NlLAogCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTQwNSw3ICsxNDA1LDcgQEAKIH07CiAKIC8qIHZpYTgyM3ggbXVsdGktY2hhbm5lbCBwbGF5YmFjayBjYWxsYmFja3MgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTgyMzNfbXVsdGlfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhODIzM19tdWx0aV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3ZpYTgyMzNfbXVsdGlfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdmlhODJ4eF9wY21fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xNDE4LDcgKzE0MTgsNyBAQAogfTsKIAogLyogdmlhODIzeCBjYXB0dXJlIGNhbGxiYWNrcyAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhODIzM19jYXB0dXJlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTgyMzNfY2FwdHVyZV9vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3ZpYTgyeHhfY2FwdHVyZV9vcGVuLAogCS5jbG9zZSA9CXNuZF92aWE4Mnh4X3BjbV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMgYi9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCmluZGV4IDk5YjkxMzcuLjJmNmQ0MGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKKysrIGIvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYwpAQCAtODA0LDcgKzgwNCw3IEBACiAKIAogLyogdmlhNjg2IHBsYXliYWNrIGNhbGxiYWNrcyAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhNjg2X3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ZpYTY4Nl9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJc25kX3ZpYTgyeHhfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdmlhODJ4eF9wY21fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCkBAIC04MTcsNyArODE3LDcgQEAKIH07CiAKIC8qIHZpYTY4NiBjYXB0dXJlIGNhbGxiYWNrcyAqLwotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhNjg2X2NhcHR1cmVfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfdmlhNjg2X2NhcHR1cmVfb3BzID0gewogCS5vcGVuID0JCXNuZF92aWE4Mnh4X2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgPQlzbmRfdmlhODJ4eF9wY21fY2xvc2UsCiAJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKaW5kZXggNGMyNjA3Ni4uZmZlZTI4NCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYwpAQCAtMTEyMyw3ICsxMTIzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfeW1mcGNpX3BsYXliYWNrX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ltZnBjaV9wbGF5YmFja19vcHMgPSB7CiAJLm9wZW4gPQkJCXNuZF95bWZwY2lfcGxheWJhY2tfb3BlbiwKIAkuY2xvc2UgPQkJc25kX3ltZnBjaV9wbGF5YmFja19jbG9zZSwKIAkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTM0LDcgKzExMzQsNyBAQAogCS5wb2ludGVyID0JCXNuZF95bWZwY2lfcGxheWJhY2tfcG9pbnRlciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ltZnBjaV9jYXB0dXJlX3JlY19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF95bWZwY2lfY2FwdHVyZV9yZWNfb3BzID0gewogCS5vcGVuID0JCQlzbmRfeW1mcGNpX2NhcHR1cmVfcmVjX29wZW4sCiAJLmNsb3NlID0JCXNuZF95bWZwY2lfY2FwdHVyZV9jbG9zZSwKIAkuaW9jdGwgPQkJc25kX3BjbV9saWJfaW9jdGwsCkBAIC0xMTY5LDcgKzExNjksNyBAQAogCQkJCSAgICAgc25kX3BjbV9zdGRfY2htYXBzLCAyLCAwLCBOVUxMKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfeW1mcGNpX2NhcHR1cmVfYWM5N19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF95bWZwY2lfY2FwdHVyZV9hYzk3X29wcyA9IHsKIAkub3BlbiA9CQkJc25kX3ltZnBjaV9jYXB0dXJlX2FjOTdfb3BlbiwKIAkuY2xvc2UgPQkJc25kX3ltZnBjaV9jYXB0dXJlX2Nsb3NlLAogCS5pb2N0bCA9CQlzbmRfcGNtX2xpYl9pb2N0bCwKQEAgLTEyMDMsNyArMTIwMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX3ltZnBjaV9wbGF5YmFja19zcGRpZl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF95bWZwY2lfcGxheWJhY2tfc3BkaWZfb3BzID0gewogCS5vcGVuID0JCQlzbmRfeW1mcGNpX3BsYXliYWNrX3NwZGlmX29wZW4sCiAJLmNsb3NlID0JCXNuZF95bWZwY2lfcGxheWJhY2tfc3BkaWZfY2xvc2UsCiAJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLApAQCAtMTIzNiw3ICsxMjM2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfeW1mcGNpX3BsYXliYWNrXzRjaF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIHNuZF95bWZwY2lfcGxheWJhY2tfNGNoX29wcyA9IHsKIAkub3BlbiA9CQkJc25kX3ltZnBjaV9wbGF5YmFja180Y2hfb3BlbiwKIAkuY2xvc2UgPQkJc25kX3ltZnBjaV9wbGF5YmFja180Y2hfY2xvc2UsCiAJLmlvY3RsID0JCXNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvcHBjL3NuZF9wczMuYyBiL3NvdW5kL3BwYy9zbmRfcHMzLmMKaW5kZXggMzY4MjQyNS4uYjg0ZDdkMyAxMDA2NDQKLS0tIGEvc291bmQvcHBjL3NuZF9wczMuYworKysgYi9zb3VuZC9wcGMvc25kX3BzMy5jCkBAIC01NjQsOSArNTY0LDcgQEAKIAogc3RhdGljIGludCBzbmRfcHMzX3BjbV9od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewotCWludCByZXQ7Ci0JcmV0ID0gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMoc3Vic3RyZWFtKTsKIH07CiAKIHN0YXRpYyBpbnQgc25kX3BzM19kZWxheV90b19ieXRlcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy90dW1ibGVyLmMgYi9zb3VuZC9wcGMvdHVtYmxlci5jCmluZGV4IGM4ZmFmYmEuLjU4ZWU4MDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BwYy90dW1ibGVyLmMKKysrIGIvc291bmQvcHBjL3R1bWJsZXIuYwpAQCAtMTMwMywxOSArMTMwMywxOSBAQAogCQkJCSAgICAmbWl4LT5saW5lX211dGUsIDEpOwogCWlycSA9IHR1bWJsZXJfZmluZF9kZXZpY2UoImhlYWRwaG9uZS1kZXRlY3QiLAogCQkJCSAgTlVMTCwgJm1peC0+aHBfZGV0ZWN0LCAwKTsKLQlpZiAoaXJxIDw9IE5PX0lSUSkKKwlpZiAoaXJxIDw9IDApCiAJCWlycSA9IHR1bWJsZXJfZmluZF9kZXZpY2UoImhlYWRwaG9uZS1kZXRlY3QiLAogCQkJCQkgIE5VTEwsICZtaXgtPmhwX2RldGVjdCwgMSk7Ci0JaWYgKGlycSA8PSBOT19JUlEpCisJaWYgKGlycSA8PSAwKQogCQlpcnEgPSB0dW1ibGVyX2ZpbmRfZGV2aWNlKCJrZXl3ZXN0LWdwaW8xNSIsCiAJCQkJCSAgTlVMTCwgJm1peC0+aHBfZGV0ZWN0LCAxKTsKIAltaXgtPmhlYWRwaG9uZV9pcnEgPSBpcnE7CiAgCWlycSA9IHR1bWJsZXJfZmluZF9kZXZpY2UoImxpbmUtb3V0cHV0LWRldGVjdCIsCiAJCQkJICBOVUxMLCAmbWl4LT5saW5lX2RldGVjdCwgMCk7Ci0gCWlmIChpcnEgPD0gTk9fSVJRKQorCWlmIChpcnEgPD0gMCkKIAkJaXJxID0gdHVtYmxlcl9maW5kX2RldmljZSgibGluZS1vdXRwdXQtZGV0ZWN0IiwKIAkJCQkJICBOVUxMLCAmbWl4LT5saW5lX2RldGVjdCwgMSk7Ci0JaWYgKElTX0c0REEgJiYgaXJxIDw9IE5PX0lSUSkKKwlpZiAoSVNfRzREQSAmJiBpcnEgPD0gMCkKIAkJaXJxID0gdHVtYmxlcl9maW5kX2RldmljZSgia2V5d2VzdC1ncGlvMTYiLAogCQkJCQkgIE5VTEwsICZtaXgtPmxpbmVfZGV0ZWN0LCAxKTsKIAltaXgtPmxpbmVvdXRfaXJxID0gaXJxOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2FtZC9hY3AtcGNtLWRtYS5jIGIvc291bmQvc29jL2FtZC9hY3AtcGNtLWRtYS5jCmluZGV4IGQxZmIwMzUuLjUwNGM3Y2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hbWQvYWNwLXBjbS1kbWEuYworKysgYi9zb3VuZC9zb2MvYW1kL2FjcC1wY20tZG1hLmMKQEAgLTg5Nyw3ICs4OTcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGFjcF9kbWFfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBhY3BfZG1hX29wcyA9IHsKIAkub3BlbiA9IGFjcF9kbWFfb3BlbiwKIAkuY2xvc2UgPSBhY3BfZG1hX2Nsb3NlLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL2F0bWVsLWNsYXNzZC5jIGIvc291bmQvc29jL2F0bWVsL2F0bWVsLWNsYXNzZC5jCmluZGV4IDZkOWI4YjQuLjg5YWM1ZjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1jbGFzc2QuYworKysgYi9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtY2xhc3NkLmMKQEAgLTMwOCw5ICszMDgsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2NsYXNzZCA9IHsKIAkucHJvYmUJCT0gYXRtZWxfY2xhc3NkX2NvZGVjX3Byb2JlLAotCS5jb250cm9scwk9IGF0bWVsX2NsYXNzZF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwk9IEFSUkFZX1NJWkUoYXRtZWxfY2xhc3NkX3NuZF9jb250cm9scyksCiAJLmdldF9yZWdtYXAJPSBhdG1lbF9jbGFzc2RfY29kZWNfZ2V0X3JlbWFwLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYXRtZWxfY2xhc3NkX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGF0bWVsX2NsYXNzZF9zbmRfY29udHJvbHMpLAorCX0sCiB9OwogCiAvKiBjb2RlYyBkYWkgY29tcG9uZW50ICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLXBkYy5jIGIvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS1wZGMuYwppbmRleCBkYTg2MWI0Li45MWI3MDY5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLXBkYy5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wY20tcGRjLmMKQEAgLTM4MSw3ICszODEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGF0bWVsX3BjbV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGF0bWVsX3BjbV9vcHMgPSB7CiAJLm9wZW4JCT0gYXRtZWxfcGNtX29wZW4sCiAJLmNsb3NlCQk9IGF0bWVsX3BjbV9jbG9zZSwKIAkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGRtaWMuYyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wZG1pYy5jCmluZGV4IDVmNTZkYTYuLmM5MTdkZjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wZG1pYy5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wZG1pYy5jCkBAIC04MCw3ICs4MCw3IEBACiAKIAlpZiAocGRhdGEtPm1pY19tYXhfZnJlcSA8IHBkYXRhLT5taWNfbWluX2ZyZXEpIHsKIAkJZGV2X2VycihkZXYsCi0JCQkibWljLW1heC1mcmVxIHNob3VsZCBub3QgbGVzcyB0aGFuIG1pYy1taW4tZnJlcVxuIik7CisJCQkibWljLW1heC1mcmVxIHNob3VsZCBub3QgYmUgbGVzcyB0aGFuIG1pYy1taW4tZnJlcVxuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIApAQCAtMTE1LDggKzExNSwxMCBAQAogCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gIGNsa19wcmVwYXJlX2VuYWJsZShkZC0+cGNsayk7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkZC0+Z2Nsayk7CiAJCXJldHVybiByZXQ7CisJfQogCiAJLyogQ2xlYXIgYWxsIGJpdHMgaW4gdGhlIENvbnRyb2wgUmVnaXN0ZXIoUERNSUNfQ1IpICovCiAJcmVnbWFwX3dyaXRlKGRkLT5yZWdtYXAsIFBETUlDX0NSLCAwKTsKQEAgLTI4Myw3ICsyODUsNyBAQAogCTgsIEFSUkFZX1NJWkUobWljX2dhaW5fdGFibGUpLTEsIFRMVl9EQl9TQ0FMRV9JVEVNKC02NTAwLCAxMDAsIDApLAogKTsKIAotaW50IHBkbWljX2dldF9taWNfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCitzdGF0aWMgaW50IHBkbWljX2dldF9taWNfdm9sc3coc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CkBAIC0zNTcsOCArMzU5LDEwIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9wZG1pYyA9IHsKIAkucHJvYmUJCT0gYXRtZWxfcGRtaWNfY29kZWNfcHJvYmUsCi0JLmNvbnRyb2xzCT0gYXRtZWxfcGRtaWNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJPSBBUlJBWV9TSVpFKGF0bWVsX3BkbWljX3NuZF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhdG1lbF9wZG1pY19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhdG1lbF9wZG1pY19zbmRfY29udHJvbHMpLAorCX0sCiB9OwogCiAvKiBjb2RlYyBkYWkgY29tcG9uZW50ICovCkBAIC01OTYsNyArNjAwLDcgQEAKIAlkZC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoZGQtPmlycSA8IDApIHsKIAkJcmV0ID0gZGQtPmlycTsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY291bGQgbm90IGdldCBpcnE6ICVkXG4iLCByZXQpOworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgaXJxOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTYxNCw3ICs2MTgsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIFRoZSBnY2xrIGNsb2NrIGZyZXF1ZW5jeSBtdXN0IGFsd2F5cyBiZSB0cmVlIHRpbWVzCisJLyogVGhlIGdjbGsgY2xvY2sgZnJlcXVlbmN5IG11c3QgYWx3YXlzIGJlIHRocmVlIHRpbWVzCiAJICogbG93ZXIgdGhhbiB0aGUgcGNsayBjbG9jayBmcmVxdWVuY3kKIAkgKi8KIAlyZXQgPSBjbGtfc2V0X3JhdGUoZGQtPmdjbGssIGNsa19nZXRfcmF0ZShkZC0+cGNsaykvMyk7CkBAIC02NDksNyArNjUzLDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiBHZXQgdGhlIG1pbmltYWwgYW5kIG1heGltYWwgc2FtcGxlIHJhdGUgdGhhdCBtaWNwaG9uZSBzdXBwb3J0cyAqLworCS8qIEdldCB0aGUgbWluaW1hbCBhbmQgbWF4aW1hbCBzYW1wbGUgcmF0ZSB0aGF0IHRoZSBtaWNyb3Bob25lIHN1cHBvcnRzICovCiAJYXRtZWxfcGRtaWNfZ2V0X3NhbXBsZV9yYXRlKGRkLCAmcmF0ZV9taW4sICZyYXRlX21heCk7CiAKIAkvKiByZWdpc3RlciBjcHUgZGFpICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMgYi9zb3VuZC9zb2MvY29kZWNzLzg4cG04NjB4LWNvZGVjLmMKaW5kZXggZThiZWQ2Yi4uYjAxM2E0YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy84OHBtODYweC1jb2RlYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvODhwbTg2MHgtY29kZWMuYwpAQCAtMTM2MSwxMiArMTM2MSwxNCBAQAogCS5zZXRfYmlhc19sZXZlbAk9IHBtODYweF9zZXRfYmlhc19sZXZlbCwKIAkuZ2V0X3JlZ21hcAk9IHBtODYweF9nZXRfcmVnbWFwLAogCi0JLmNvbnRyb2xzID0gcG04NjB4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShwbTg2MHhfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcG04NjB4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocG04NjB4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcG04NjB4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHBtODYweF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBwbTg2MHhfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocG04NjB4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcG04NjB4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHBtODYweF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcG04NjB4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShwbTg2MHhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHBtODYweF9jb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9LY29uZmlnIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCmluZGV4IDFjZDZhYjMuLmM2NzY2N2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKQEAgLTkyLDYgKzkyLDcgQEAKIAlzZWxlY3QgU05EX1NPQ19NQVg5ODc3IGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX01DMTM3ODMgaWYgTUZEX01DMTNYWFgKIAlzZWxlY3QgU05EX1NPQ19NTDI2MTI0IGlmIEkyQworCXNlbGVjdCBTTkRfU09DX05BVTg4MTAgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfTkFVODgyNSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19IRE1JX0NPREVDCiAJc2VsZWN0IFNORF9TT0NfUENNMTY4MSBpZiBJMkMKQEAgLTExMiw2ICsxMTMsOCBAQAogCXNlbGVjdCBTTkRfU09DX1JUNTY0NSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19SVDU2NTEgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfUlQ1NjU5IGlmIEkyQworCXNlbGVjdCBTTkRfU09DX1JUNTY2MCBpZiBJMkMKKwlzZWxlY3QgU05EX1NPQ19SVDU2NjMgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfUlQ1NjcwIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1JUNTY3NyBpZiBJMkMgJiYgU1BJX01BU1RFUgogCXNlbGVjdCBTTkRfU09DX1NHVEw1MDAwIGlmIEkyQwpAQCAtNjQ1LDYgKzY0OCw4IEBACiAJZGVmYXVsdCB5IGlmIFNORF9TT0NfUlQ1NjQ1PXkKIAlkZWZhdWx0IHkgaWYgU05EX1NPQ19SVDU2NTE9eQogCWRlZmF1bHQgeSBpZiBTTkRfU09DX1JUNTY1OT15CisJZGVmYXVsdCB5IGlmIFNORF9TT0NfUlQ1NjYwPXkKKwlkZWZhdWx0IHkgaWYgU05EX1NPQ19SVDU2NjM9eQogCWRlZmF1bHQgeSBpZiBTTkRfU09DX1JUNTY3MD15CiAJZGVmYXVsdCB5IGlmIFNORF9TT0NfUlQ1Njc3PXkKIAlkZWZhdWx0IG0gaWYgU05EX1NPQ19SVDU1MTQ9bQpAQCAtNjUzLDYgKzY1OCw4IEBACiAJZGVmYXVsdCBtIGlmIFNORF9TT0NfUlQ1NjQ1PW0KIAlkZWZhdWx0IG0gaWYgU05EX1NPQ19SVDU2NTE9bQogCWRlZmF1bHQgbSBpZiBTTkRfU09DX1JUNTY1OT1tCisJZGVmYXVsdCBtIGlmIFNORF9TT0NfUlQ1NjYwPW0KKwlkZWZhdWx0IG0gaWYgU05EX1NPQ19SVDU2NjM9bQogCWRlZmF1bHQgbSBpZiBTTkRfU09DX1JUNTY3MD1tCiAJZGVmYXVsdCBtIGlmIFNORF9TT0NfUlQ1Njc3PW0KIApAQCAtNjY1LDYgKzY3Miw3IEBACiAKIGNvbmZpZyBTTkRfU09DX1JUMjg2CiAJdHJpc3RhdGUKKwlzZWxlY3QgU05EX1NPQ19SVDU2NjMKIAlkZXBlbmRzIG9uIEkyQwogCiBjb25maWcgU05EX1NPQ19SVDI5OApAQCAtNjk3LDYgKzcwNSwxMiBAQAogY29uZmlnIFNORF9TT0NfUlQ1NjU5CiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfUlQ1NjYwCisJdHJpc3RhdGUKKworY29uZmlnIFNORF9TT0NfUlQ1NjYzCisJdHJpc3RhdGUKKwogY29uZmlnIFNORF9TT0NfUlQ1NjcwCiAJdHJpc3RhdGUKIApAQCAtMTA2NCw2ICsxMDc4LDEwIEBACiBjb25maWcgU05EX1NPQ19NTDI2MTI0CiAJdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfTkFVODgxMAorCXRyaXN0YXRlICJOdXZvdG9uIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gTkFVODhDMTAgQ09ERUMiCisJZGVwZW5kcyBvbiBJMkMKKwogY29uZmlnIFNORF9TT0NfTkFVODgyNQogCXRyaXN0YXRlCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUgYi9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCmluZGV4IDU4MDM2YWYuLjk1OGNkNDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQpAQCAtODYsNiArODYsNyBAQAogc25kLXNvYy1tYXg5ODYwLW9ianMgOj0gbWF4OTg2MC5vCiBzbmQtc29jLW1jMTM3ODMtb2JqcyA6PSBtYzEzNzgzLm8KIHNuZC1zb2MtbWwyNjEyNC1vYmpzIDo9IG1sMjYxMjQubworc25kLXNvYy1uYXU4ODEwLW9ianMgOj0gbmF1ODgxMC5vCiBzbmQtc29jLW5hdTg4MjUtb2JqcyA6PSBuYXU4ODI1Lm8KIHNuZC1zb2MtaGRtaS1jb2RlYy1vYmpzIDo9IGhkbWktY29kZWMubwogc25kLXNvYy1wY20xNjgxLW9ianMgOj0gcGNtMTY4MS5vCkBAIC0xMTIsNiArMTEzLDggQEAKIHNuZC1zb2MtcnQ1NjQ1LW9ianMgOj0gcnQ1NjQ1Lm8KIHNuZC1zb2MtcnQ1NjUxLW9ianMgOj0gcnQ1NjUxLm8KIHNuZC1zb2MtcnQ1NjU5LW9ianMgOj0gcnQ1NjU5Lm8KK3NuZC1zb2MtcnQ1NjYwLW9ianMgOj0gcnQ1NjYwLm8KK3NuZC1zb2MtcnQ1NjYzLW9ianMgOj0gcnQ1NjYzLm8KIHNuZC1zb2MtcnQ1NjcwLW9ianMgOj0gcnQ1NjcwLm8KIHNuZC1zb2MtcnQ1Njc3LW9ianMgOj0gcnQ1Njc3Lm8KIHNuZC1zb2MtcnQ1Njc3LXNwaS1vYmpzIDo9IHJ0NTY3Ny1zcGkubwpAQCAtMzA3LDYgKzMxMCw3IEBACiBvYmotJChDT05GSUdfU05EX1NPQ19NQVg5ODYwKQkrPSBzbmQtc29jLW1heDk4NjAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfTUMxMzc4MykJKz0gc25kLXNvYy1tYzEzNzgzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX01MMjYxMjQpCSs9IHNuZC1zb2MtbWwyNjEyNC5vCitvYmotJChDT05GSUdfU05EX1NPQ19OQVU4ODEwKSAgICs9IHNuZC1zb2MtbmF1ODgxMC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19OQVU4ODI1KSAgICs9IHNuZC1zb2MtbmF1ODgyNS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19IRE1JX0NPREVDKQkrPSBzbmQtc29jLWhkbWktY29kZWMubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUENNMTY4MSkJKz0gc25kLXNvYy1wY20xNjgxLm8KQEAgLTMzMyw2ICszMzcsOCBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfUlQ1NjQ1KQkrPSBzbmQtc29jLXJ0NTY0NS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19SVDU2NTEpCSs9IHNuZC1zb2MtcnQ1NjUxLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1JUNTY1OSkJKz0gc25kLXNvYy1ydDU2NTkubworb2JqLSQoQ09ORklHX1NORF9TT0NfUlQ1NjYwKQkrPSBzbmQtc29jLXJ0NTY2MC5vCitvYmotJChDT05GSUdfU05EX1NPQ19SVDU2NjMpCSs9IHNuZC1zb2MtcnQ1NjYzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1JUNTY3MCkJKz0gc25kLXNvYy1ydDU2NzAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUlQ1Njc3KQkrPSBzbmQtc29jLXJ0NTY3Ny5vCiBvYmotJChDT05GSUdfU05EX1NPQ19SVDU2NzdfU1BJKQkrPSBzbmQtc29jLXJ0NTY3Ny1zcGkubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hYjg1MDAtY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWI4NTAwLWNvZGVjLmMKaW5kZXggMmZjODkxNS4uOTM1ZmY3YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hYjg1MDAtY29kZWMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FiODUwMC1jb2RlYy5jCkBAIC0yNDA4LDI4ICsyNDA4LDI4IEBACiB7CiAJdTMyIHZhbHVlOwogCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInN0ZXJpY3Nzb24sYW1pYzEtdHlwZS1zaW5nbGUtZW5kZWQiLCBOVUxMKSkKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAic3Rlcmljc3NvbixhbWljMS10eXBlLXNpbmdsZS1lbmRlZCIpKQogCQljb2RlYy0+YW1pY3MubWljMV90eXBlID0gQU1JQ19UWVBFX1NJTkdMRV9FTkRFRDsKIAllbHNlCiAJCWNvZGVjLT5hbWljcy5taWMxX3R5cGUgPSBBTUlDX1RZUEVfRElGRkVSRU5USUFMOwogCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInN0ZXJpY3Nzb24sYW1pYzItdHlwZS1zaW5nbGUtZW5kZWQiLCBOVUxMKSkKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAic3Rlcmljc3NvbixhbWljMi10eXBlLXNpbmdsZS1lbmRlZCIpKQogCQljb2RlYy0+YW1pY3MubWljMl90eXBlID0gQU1JQ19UWVBFX1NJTkdMRV9FTkRFRDsKIAllbHNlCiAJCWNvZGVjLT5hbWljcy5taWMyX3R5cGUgPSBBTUlDX1RZUEVfRElGRkVSRU5USUFMOwogCiAJLyogSGFzIGEgbm9uLXN0YW5kYXJkIFZhbWljIGJlZW4gcmVxdWVzdGVkPyAqLwotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJzdGVyaWNzc29uLGFtaWMxYS1iaWFzLXZhbWljMiIsIE5VTEwpKQorCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJzdGVyaWNzc29uLGFtaWMxYS1iaWFzLXZhbWljMiIpKQogCQljb2RlYy0+YW1pY3MubWljMWFfbWljYmlhcyA9IEFNSUNfTUlDQklBU19WQU1JQzI7CiAJZWxzZQogCQljb2RlYy0+YW1pY3MubWljMWFfbWljYmlhcyA9IEFNSUNfTUlDQklBU19WQU1JQzE7CiAKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAic3Rlcmljc3NvbixhbWljMWItYmlhcy12YW1pYzIiLCBOVUxMKSkKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAic3Rlcmljc3NvbixhbWljMWItYmlhcy12YW1pYzIiKSkKIAkJY29kZWMtPmFtaWNzLm1pYzFiX21pY2JpYXMgPSBBTUlDX01JQ0JJQVNfVkFNSUMyOwogCWVsc2UKIAkJY29kZWMtPmFtaWNzLm1pYzFiX21pY2JpYXMgPSBBTUlDX01JQ0JJQVNfVkFNSUMxOwogCi0JaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgInN0ZXJpY3Nzb24sYW1pYzItYmlhcy12YW1pYzEiLCBOVUxMKSkKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAic3Rlcmljc3NvbixhbWljMi1iaWFzLXZhbWljMSIpKQogCQljb2RlYy0+YW1pY3MubWljMl9taWNiaWFzID0gQU1JQ19NSUNCSUFTX1ZBTUlDMTsKIAllbHNlCiAJCWNvZGVjLT5hbWljcy5taWMyX21pY2JpYXMgPSBBTUlDX01JQ0JJQVNfVkFNSUMyOwpAQCAtMjUyNSwxMiArMjUyNSwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIGFiODUwMF9jb2RlY19kcml2ZXIgPSB7CiAJLnByb2JlID0JCWFiODUwMF9jb2RlY19wcm9iZSwKLQkuY29udHJvbHMgPQkJYWI4NTAwX2N0cmxzLAotCS5udW1fY29udHJvbHMgPQkJQVJSQVlfU0laRShhYjg1MDBfY3RybHMpLAotCS5kYXBtX3dpZGdldHMgPQkJYWI4NTAwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9CUFSUkFZX1NJWkUoYWI4NTAwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0JCWFiODUwMF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0JQVJSQVlfU0laRShhYjg1MDBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMgPQkJYWI4NTAwX2N0cmxzLAorCQkubnVtX2NvbnRyb2xzID0JCUFSUkFZX1NJWkUoYWI4NTAwX2N0cmxzKSwKKwkJLmRhcG1fd2lkZ2V0cyA9CQlhYjg1MDBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cyA9CUFSUkFZX1NJWkUoYWI4NTAwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcyA9CQlhYjg1MDBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMgPQlBUlJBWV9TSVpFKGFiODUwMF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2NvZGVjX2RyaXZlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hYzk3LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FjOTcuYwppbmRleCA1YjMyMjRjLi5mN2YwNGM2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FjOTcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FjOTcuYwpAQCAtMTE3LDEwICsxMTcsMTIgQEAKIAkuc3VzcGVuZCA9CWFjOTdfc29jX3N1c3BlbmQsCiAJLnJlc3VtZSA9CWFjOTdfc29jX3Jlc3VtZSwKIAotCS5kYXBtX3dpZGdldHMgPSBhYzk3X3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFjOTdfd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWM5N19yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWM5N19yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGFjOTdfd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFjOTdfd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhYzk3X3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWM5N19yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFjOTdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5jCmluZGV4IGUyY2U2YzQuLmE0NzgyMzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuYwpAQCAtMzI3LDEyICszMjcsMTQgQEAKIAkuc3VzcGVuZCA9IGFkMTgzNl9zdXNwZW5kLAogCS5yZXN1bWUgPSBhZDE4MzZfcmVzdW1lLAogCi0JLmNvbnRyb2xzID0gYWQxODN4X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkMTgzeF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFkMTgzeF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkMTgzeF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFkMTgzeF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZDE4M3hfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWQxODN4X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWQxODN4X2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZDE4M3hfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWQxODN4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhZDE4M3hfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkMTgzeF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgYWQxODM2X3JlZ19kZWZhdWx0c1tdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTN4LmMKaW5kZXggM2EzZjNmMi4uZDY0MzU1NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZDE5M3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkMTkzeC5jCkBAIC00MTAsMTIgKzQxMCwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfYWQxOTN4ID0gewogCS5wcm9iZSA9IGFkMTkzeF9jb2RlY19wcm9iZSwKLQkuY29udHJvbHMgPSBhZDE5M3hfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkMTkzeF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhZDE5M3hfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZDE5M3hfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhdWRpb19wYXRocywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhdWRpb19wYXRocyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhZDE5M3hfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWQxOTN4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWQxOTN4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkMTkzeF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYXVkaW9fcGF0aHMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGF1ZGlvX3BhdGhzKSwKKwl9LAogfTsKIAogY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWQxOTN4X3JlZ21hcF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkMTk4MC5jIGIvc291bmQvc29jL2NvZGVjcy9hZDE5ODAuYwppbmRleCA5ZWYyMGRiLi5iN2MxYjlmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkMTk4MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWQxOTgwLmMKQEAgLTI5OSwxMiArMjk5LDE0IEBACiAJLnByb2JlID0gCWFkMTk4MF9zb2NfcHJvYmUsCiAJLnJlbW92ZSA9IAlhZDE5ODBfc29jX3JlbW92ZSwKIAotCS5jb250cm9scyA9IGFkMTk4MF9zbmRfYWM5N19jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhZDE5ODBfc25kX2FjOTdfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhZDE5ODBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZDE5ODBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhZDE5ODBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWQxOTgwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFkMTk4MF9zbmRfYWM5N19jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFkMTk4MF9zbmRfYWM5N19jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWQxOTgwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkMTk4MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWQxOTgwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZDE5ODBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFkMTk4MF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZDczMzExLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkNzMzMTEuYwppbmRleCBhOTQwMGFlLi4zZTM1OGE0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkNzMzMTEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkNzMzMTEuYwpAQCAtNTUsMTAgKzU1LDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfYWQ3MzMxMSA9IHsKLQkuZGFwbV93aWRnZXRzID0gYWQ3MzMxMV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkNzMzMTFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhZDczMzExX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkNzMzMTFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGFkNzMzMTFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWQ3MzMxMV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWQ3MzMxMV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWQ3MzMxMV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWQ3MzMxMV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTM3My5jCmluZGV4IDE1NTZiMzYuLjhmYTkwNDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTEzNzMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxMzczLmMKQEAgLTE0NjYsMTIgKzE0NjYsMTQgQEAKIAogCS5zZXRfcGxsID0gYWRhdTEzNzNfc2V0X3BsbCwKIAotCS5jb250cm9scyA9IGFkYXUxMzczX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFkYXUxMzczX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWRhdTEzNzNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZGF1MTM3M19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFkYXUxMzczX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkYXUxMzczX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFkYXUxMzczX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWRhdTEzNzNfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFkYXUxMzczX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkYXUxMzczX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhZGF1MTM3M19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWRhdTEzNzNfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFkYXUxMzczX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTcwMS5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTcwMS5jCmluZGV4IGRlNTNjMGQuLjNiYWQxYmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3MDEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzAxLmMKQEAgLTc2NSwxMyArNzY1LDE0IEBACiAJLnNldF9iaWFzX2xldmVsCQk9IGFkYXUxNzAxX3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmCQk9IHRydWUsCiAKLQkuY29udHJvbHMJCT0gYWRhdTE3MDFfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFkYXUxNzAxX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCQk9IGFkYXUxNzAxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWRhdTE3MDFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gYWRhdTE3MDFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWRhdTE3MDFfZGFwbV9yb3V0ZXMpLAotCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhZGF1MTcwMV9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFkYXUxNzAxX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZGF1MTcwMV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZGF1MTcwMV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWRhdTE3MDFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkYXUxNzAxX2RhcG1fcm91dGVzKSwKKwl9LAogCS5zZXRfc3lzY2xrCQk9IGFkYXUxNzAxX3NldF9zeXNjbGssCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzYxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzYxLmMKaW5kZXggYjk1ZDI5ZC4uM2JjM2NjNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTc2MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3NjEuYwpAQCAtNzE5LDEyICs3MTksMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwJPSBhZGF1MTc2MV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBhZGF1MTc2MV9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhZGF1MTc2MV9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFkYXUxeDYxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWRhdTF4NjFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhZGF1MXg2MV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZGF1MXg2MV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhZGF1MTc2MV9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFkYXUxNzYxX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZGF1MXg2MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZGF1MXg2MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWRhdTF4NjFfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkYXUxeDYxX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogI2RlZmluZSBBREFVMTc2MV9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgXApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF1MTc4MS5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTc4MS5jCmluZGV4IGJjMWJiNTYuLjU0NjA3MWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE3ODEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXUxNzgxLmMKQEAgLTQzMiwxMiArNDMyLDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gYWRhdTE3ODFfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gYWRhdTE3ODFfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWRhdTE3ODFfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhZGF1MTc4MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkYXUxNzgxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWRhdTE3ODFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWRhdTE3ODFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWRhdTE3ODFfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhZGF1MTc4MV9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWRhdTE3ODFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWRhdTE3ODFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFkYXUxNzgxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZGF1MTc4MV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKICNkZWZpbmUgQURBVTE3ODFfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuYwppbmRleCA5YmRkMTVmLi5iMzE5ZGI2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny5jCkBAIC04NzMsMTIgKzg3MywxNCBAQAogCS5zZXRfc3lzY2xrID0gYWRhdTE5Nzdfc2V0X3N5c2NsaywKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBhZGF1MTk3N19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWRhdTE5Nzdfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWRhdTE5NzdfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZGF1MTk3N19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFkYXUxOTc3X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFkYXUxOTc3X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFkYXUxOTc3X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFkYXUxOTc3X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWRhdTE5NzdfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWRhdTE5NzdfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFkYXUxOTc3X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZGF1MTk3N19kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWRhdTE5Nzdfc2V0dXBfbWljYmlhcyhzdHJ1Y3QgYWRhdTE5NzcgKmFkYXUxOTc3KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF1NzAwMi5jIGIvc291bmQvc29jL2NvZGVjcy9hZGF1NzAwMi5jCmluZGV4IDlkZjcyYzYuLjYzODRjNTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTcwMDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXU3MDAyLmMKQEAgLTM5LDEwICszOSwxMiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBhZGF1NzAwMl9jb2RlY19kcml2ZXIgPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IGFkYXU3MDAyX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFkYXU3MDAyX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFkYXU3MDAyX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZGF1NzAwMl9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGFkYXU3MDAyX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZGF1NzAwMl93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFkYXU3MDAyX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWRhdTcwMDJfcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhZGF1NzAwMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwppbmRleCBhY2ZmOGQ2Li42ZTc5M2ViIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwpAQCAtODM0LDEyICs4MzQsMTQgQEAKIAkuc2V0X3BsbCA9IGFkYXY4MHhfc2V0X3BsbCwKIAkuc2V0X3N5c2NsayA9IGFkYXY4MHhfc2V0X3N5c2NsaywKIAotCS5jb250cm9scyA9IGFkYXY4MHhfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWRhdjgweF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFkYXY4MHhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhZGF2ODB4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWRhdjgweF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhZGF2ODB4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFkYXY4MHhfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhZGF2ODB4X2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhZGF2ODB4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFkYXY4MHhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFkYXY4MHhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFkYXY4MHhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBpbnQgYWRhdjgweF9idXNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FkczExN3guYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRzMTE3eC5jCmluZGV4IGM1YmUxYmQuLjkwYzc1NmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWRzMTE3eC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRzMTE3eC5jCkBAIC01OSwxMCArNTksMTIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9hZHMxMTd4ID0gewotCS5kYXBtX3dpZGdldHMgPSBhZHMxMTd4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWRzMTE3eF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFkczExN3hfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWRzMTE3eF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gYWRzMTE3eF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhZHMxMTd4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhZHMxMTd4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhZHMxMTd4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhZHMxMTd4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FrNDEwNC5jIGIvc291bmQvc29jL2NvZGVjcy9hazQxMDQuYwppbmRleCA1OTVkMDJkLi4xYTlkMjMzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FrNDEwNC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0MTA0LmMKQEAgLTE2Myw3ICsxNjMsMTAgQEAKIAkJLnN0cmVhbV9uYW1lID0gIlBsYXliYWNrIiwKIAkJLmNoYW5uZWxzX21pbiA9IDIsCiAJCS5jaGFubmVsc19tYXggPSAyLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfMjIwNTAgfCBTTkRSVl9QQ01fUkFURV8zMjAwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfODgyMDAgfCBTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfMTc2NDAwIHwgU05EUlZfUENNX1JBVEVfMTkyMDAwLAogCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFICB8CiAJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgfAogCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUKQEAgLTI0NSwxMCArMjQ4LDEyIEBACiAJLnN1c3BlbmQgPSBhazQxMDRfc29jX3N1c3BlbmQsCiAJLnJlc3VtZSA9IGFrNDEwNF9zb2NfcmVzdW1lLAogCi0JLmRhcG1fd2lkZ2V0cyA9IGFrNDEwNF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGFrNDEwNF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFrNDEwNF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhazQxMDRfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGFrNDEwNF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhazQxMDRfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFrNDEwNF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWs0MTA0X2RhcG1fcm91dGVzKSwKKwl9CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWs0MTA0X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDUzNS5jCmluZGV4IDU0NDI4YzYuLjY2Y2ZmZmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTM1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ1MzUuYwpAQCAtMzk1LDEyICszOTUsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBhazQ1MzVfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gYWs0NTM1X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhazQ1MzVfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWs0NTM1X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWs0NTM1X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWs0NTM1X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhazQ1MzVfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFrNDUzNV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhazQ1MzVfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhazQ1MzVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWs0NTM1X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhazQ1MzVfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhazQ1MzVfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBhazQ1MzVfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FrNDU1NC5jIGIvc291bmQvc29jL2NvZGVjcy9hazQ1NTQuYwppbmRleCAyOThkZWRjLi5iOTJjNTQ4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FrNDU1NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTU0LmMKQEAgLTY1LDEwICs2NSwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2FrNDU1NCA9IHsKLQkuZGFwbV93aWRnZXRzID0gYWs0NTU0X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWs0NTU0X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWs0NTU0X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGFrNDU1NF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gYWs0NTU0X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFrNDU1NF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWs0NTU0X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhazQ1NTRfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGFrNDU1NF9zb2NfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjEzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDYxMy5jCmluZGV4IDk3Nzk4ZDIuLmU4MTlkZDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjEzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2MTMuYwpAQCAtNDU4LDEyICs0NTgsMTQgQEAKIAkuc3VzcGVuZAkJPSBhazQ2MTNfc3VzcGVuZCwKIAkucmVzdW1lCQkJPSBhazQ2MTNfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbAkJPSBhazQ2MTNfc2V0X2JpYXNfbGV2ZWwsCi0JLmNvbnRyb2xzCQk9IGFrNDYxM19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFrNDYxM19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJCT0gYWs0NjEzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWs0NjEzX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IGFrNDYxM19pbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShhazQ2MTNfaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gYWs0NjEzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFrNDYxM19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFrNDYxM19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShhazQ2MTNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFrNDYxM19pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWs0NjEzX2ludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIHZvaWQgYWs0NjEzX3BhcnNlX29mKHN0cnVjdCBhazQ2MTNfcHJpdiAqcHJpdiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jCmluZGV4IGIxNDE3NmYuLmM5MTcxN2QgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYwpAQCAtNTA1LDEyICs1MDUsMTQgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9hazQ2NDEgPSB7Ci0JLmNvbnRyb2xzCQk9IGFrNDY0MV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFrNDY0MV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJCT0gYWs0NjQxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWs0NjQxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IGFrNDY0MV9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWs0NjQxX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhazQ2NDFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWs0NjQxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWs0NjQxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFrNDY0MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWs0NjQxX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWs0NjQxX2F1ZGlvX21hcCksCisJfSwKIAkuc2V0X2JpYXNfbGV2ZWwJCT0gYWs0NjQxX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmCT0gdHJ1ZSwKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYwppbmRleCBjYzk0MWQ2Li4yNjA5Zjk1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKQEAgLTU1NSwxMiArNTU1LDE0IEBACiAJLnN1c3BlbmQJCT0gYWs0NjQyX3N1c3BlbmQsCiAJLnJlc3VtZQkJCT0gYWs0NjQyX3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwJCT0gYWs0NjQyX3NldF9iaWFzX2xldmVsLAotCS5jb250cm9scwkJPSBhazQ2NDJfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhazQ2NDJfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCQk9IGFrNDY0Ml9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFrNDY0Ml9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBhazQ2NDJfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWs0NjQyX2ludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFrNDY0Ml9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhazQ2NDJfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhazQ2NDJfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWs0NjQyX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhazQ2NDJfaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFrNDY0Ml9pbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhazQ2NDJfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMKaW5kZXggYzczYTlmNi4uNjA4OGFmYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5jCkBAIC02MTIsMTIgKzYxMiwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfYWs0NjcxID0gewogCS5zZXRfYmlhc19sZXZlbCA9IGFrNDY3MV9zZXRfYmlhc19sZXZlbCwKLQkuY29udHJvbHMgPSBhazQ2NzFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFrNDY3MV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhazQ2NzFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhazQ2NzFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhazQ2NzFfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWs0NjcxX2ludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFrNDY3MV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhazQ2NzFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhazQ2NzFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWs0NjcxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhazQ2NzFfaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFrNDY3MV9pbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBhazQ2NzFfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazUzODYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs1Mzg2LmMKaW5kZXggYWZhOTUzNi4uMGVmMmRmMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazUzODYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNTM4Ni5jCkBAIC03NCwxMCArNzQsMTIgQEAKIAkucmVtb3ZlID0gYWs1Mzg2X3NvY19yZW1vdmUsCiAJLnN1c3BlbmQgPSBhazUzODZfc29jX3N1c3BlbmQsCiAJLnJlc3VtZSA9IGFrNTM4Nl9zb2NfcmVzdW1lLAotCS5kYXBtX3dpZGdldHMgPSBhazUzODZfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhazUzODZfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBhazUzODZfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWs1Mzg2X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhazUzODZfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWs1Mzg2X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhazUzODZfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFrNTM4Nl9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWs1Mzg2X3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hbGM1NjMyLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MzIuYwppbmRleCA0ZDNiYTMzLi5hZGI4MGQ4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MzIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FsYzU2MzIuYwpAQCAtMTA3MiwxMiArMTA3MiwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IGFsYzU2MzJfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gYWxjNTYzMl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWxjNTYzMl9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBhbGM1NjMyX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWxjNTYzMl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGFsYzU2MzJfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYWxjNTYzMl9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhbGM1NjMyX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFsYzU2MzJfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBhbGM1NjMyX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFsYzU2MzJfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGFsYzU2MzJfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGFsYzU2MzJfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWxjNTYzMl9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FyaXpvbmEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5jCmluZGV4IGVjZmRiZmMuLjg0NmNhMDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGFyaXpvbmFfb3V0X2V2KHcsIGtjb250cm9sLCBldmVudCk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhcml6b25hX3RoZXJtYWxfd2FybihpbnQgaXJxLCB2b2lkICpkYXRhKQpAQCAtMTU5LDEyICsxNTksMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhcml6b25hX3Nwa2wgPQogCVNORF9TT0NfREFQTV9QR0FfRSgiT1VUNEwiLCBTTkRfU09DX05PUE0sCiAJCQkgICBBUklaT05BX09VVDRMX0VOQV9TSElGVCwgMCwgTlVMTCwgMCwgYXJpem9uYV9zcGtfZXYsCi0JCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSk7CisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhcml6b25hX3Nwa3IgPQogCVNORF9TT0NfREFQTV9QR0FfRSgiT1VUNFIiLCBTTkRfU09DX05PUE0sCiAJCQkgICBBUklaT05BX09VVDRSX0VOQV9TSElGVCwgMCwgTlVMTCwgMCwgYXJpem9uYV9zcGtfZXYsCi0JCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSk7CisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CisJCQkgICBTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCk7CiAKIGludCBhcml6b25hX2luaXRfc3BrKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKQEAgLTg2NCw2ICs4NjYsNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKIAlzdHJ1Y3QgYXJpem9uYV9wcml2ICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGFyaXpvbmEgKmFyaXpvbmEgPSBwcml2LT5hcml6b25hOwogCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTVU6CkBAIC04NzcsNiArODgwLDE4IEBACiAJCQlwcml2LT5vdXRfdXBfcGVuZGluZysrOwogCQkJcHJpdi0+b3V0X3VwX2RlbGF5ICs9IDE3OwogCQkJYnJlYWs7CisJCWNhc2UgQVJJWk9OQV9PVVQ0TF9FTkFfU0hJRlQ6CisJCWNhc2UgQVJJWk9OQV9PVVQ0Ul9FTkFfU0hJRlQ6CisJCQlwcml2LT5vdXRfdXBfcGVuZGluZysrOworCQkJc3dpdGNoIChhcml6b25hLT50eXBlKSB7CisJCQljYXNlIFdNNTEwMjoKKwkJCWNhc2UgV004OTk3OgorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcml2LT5vdXRfdXBfZGVsYXkgKz0gMTA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9CkBAIC04ODksOCArOTA0LDEyIEBACiAJCWNhc2UgQVJJWk9OQV9PVVQyUl9FTkFfU0hJRlQ6CiAJCWNhc2UgQVJJWk9OQV9PVVQzTF9FTkFfU0hJRlQ6CiAJCWNhc2UgQVJJWk9OQV9PVVQzUl9FTkFfU0hJRlQ6CisJCWNhc2UgQVJJWk9OQV9PVVQ0TF9FTkFfU0hJRlQ6CisJCWNhc2UgQVJJWk9OQV9PVVQ0Ul9FTkFfU0hJRlQ6CiAJCQlwcml2LT5vdXRfdXBfcGVuZGluZy0tOwotCQkJaWYgKCFwcml2LT5vdXRfdXBfcGVuZGluZykgeworCQkJaWYgKCFwcml2LT5vdXRfdXBfcGVuZGluZyAmJiBwcml2LT5vdXRfdXBfZGVsYXkpIHsKKwkJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJQb3dlciB1cCBkZWxheTogJWRcbiIsCisJCQkJCXByaXYtPm91dF91cF9kZWxheSk7CiAJCQkJbXNsZWVwKHByaXYtPm91dF91cF9kZWxheSk7CiAJCQkJcHJpdi0+b3V0X3VwX2RlbGF5ID0gMDsKIAkJCX0KQEAgLTkxMSw2ICs5MzAsMjEgQEAKIAkJCXByaXYtPm91dF9kb3duX3BlbmRpbmcrKzsKIAkJCXByaXYtPm91dF9kb3duX2RlbGF5Kys7CiAJCQlicmVhazsKKwkJY2FzZSBBUklaT05BX09VVDRMX0VOQV9TSElGVDoKKwkJY2FzZSBBUklaT05BX09VVDRSX0VOQV9TSElGVDoKKwkJCXByaXYtPm91dF9kb3duX3BlbmRpbmcrKzsKKwkJCXN3aXRjaCAoYXJpem9uYS0+dHlwZSkgeworCQkJY2FzZSBXTTUxMDI6CisJCQljYXNlIFdNODk5NzoKKwkJCQlicmVhazsKKwkJCWNhc2UgV004OTk4OgorCQkJY2FzZSBXTTE4MTQ6CisJCQkJcHJpdi0+b3V0X2Rvd25fZGVsYXkgKz0gNTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpdi0+b3V0X2Rvd25fZGVsYXkrKzsKKwkJCQlicmVhazsKKwkJCX0KIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9CkBAIC05MjMsOCArOTU3LDEyIEBACiAJCWNhc2UgQVJJWk9OQV9PVVQyUl9FTkFfU0hJRlQ6CiAJCWNhc2UgQVJJWk9OQV9PVVQzTF9FTkFfU0hJRlQ6CiAJCWNhc2UgQVJJWk9OQV9PVVQzUl9FTkFfU0hJRlQ6CisJCWNhc2UgQVJJWk9OQV9PVVQ0TF9FTkFfU0hJRlQ6CisJCWNhc2UgQVJJWk9OQV9PVVQ0Ul9FTkFfU0hJRlQ6CiAJCQlwcml2LT5vdXRfZG93bl9wZW5kaW5nLS07Ci0JCQlpZiAoIXByaXYtPm91dF9kb3duX3BlbmRpbmcpIHsKKwkJCWlmICghcHJpdi0+b3V0X2Rvd25fcGVuZGluZyAmJiBwcml2LT5vdXRfZG93bl9kZWxheSkgeworCQkJCWRldl9kYmcoY29kZWMtPmRldiwgIlBvd2VyIGRvd24gZGVsYXk6ICVkXG4iLAorCQkJCQlwcml2LT5vdXRfZG93bl9kZWxheSk7CiAJCQkJbXNsZWVwKHByaXYtPm91dF9kb3duX2RlbGF5KTsKIAkJCQlwcml2LT5vdXRfZG93bl9kZWxheSA9IDA7CiAJCQl9CkBAIC0xOTIwLDggKzE5NTgsOCBAQAogCiBzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnIHsKIAlpbnQgbjsKLQlpbnQgdGhldGE7Ci0JaW50IGxhbWJkYTsKKwl1bnNpZ25lZCBpbnQgdGhldGE7CisJdW5zaWduZWQgaW50IGxhbWJkYTsKIAlpbnQgcmVmZGl2OwogCWludCBvdXRkaXY7CiAJaW50IGZyYXRpbzsKQEAgLTIxODgsMTMgKzIyMjYsMTMgQEAKIAkJCQkgQVJJWk9OQV9GTEwxX0NUUkxfVVBEIHwgY2ZnLT5uKTsKIH0KIAotc3RhdGljIGludCBhcml6b25hX2lzX2VuYWJsZWRfZmxsKHN0cnVjdCBhcml6b25hX2ZsbCAqZmxsKQorc3RhdGljIGludCBhcml6b25hX2lzX2VuYWJsZWRfZmxsKHN0cnVjdCBhcml6b25hX2ZsbCAqZmxsLCBpbnQgYmFzZSkKIHsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGZsbC0+YXJpem9uYTsKIAl1bnNpZ25lZCBpbnQgcmVnOwogCWludCByZXQ7CiAKLQlyZXQgPSByZWdtYXBfcmVhZChhcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDEsICZyZWcpOworCXJldCA9IHJlZ21hcF9yZWFkKGFyaXpvbmEtPnJlZ21hcCwgYmFzZSArIDEsICZyZWcpOwogCWlmIChyZXQgIT0gMCkgewogCQlhcml6b25hX2ZsbF9lcnIoZmxsLCAiRmFpbGVkIHRvIHJlYWQgY3VycmVudCBzdGF0ZTogJWRcbiIsCiAJCQkJcmV0KTsKQEAgLTIyMDgsMjEgKzIyNDYsMjQgQEAKIHsKIAlzdHJ1Y3QgYXJpem9uYSAqYXJpem9uYSA9IGZsbC0+YXJpem9uYTsKIAlib29sIHVzZV9zeW5jID0gZmFsc2U7Ci0JaW50IGFscmVhZHlfZW5hYmxlZCA9IGFyaXpvbmFfaXNfZW5hYmxlZF9mbGwoZmxsKTsKKwlpbnQgYWxyZWFkeV9lbmFibGVkID0gYXJpem9uYV9pc19lbmFibGVkX2ZsbChmbGwsIGZsbC0+YmFzZSk7CisJaW50IHN5bmNfZW5hYmxlZCA9IGFyaXpvbmFfaXNfZW5hYmxlZF9mbGwoZmxsLCBmbGwtPmJhc2UgKyAweDEwKTsKIAlzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnIGNmZzsKIAlpbnQgaTsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCiAJaWYgKGFscmVhZHlfZW5hYmxlZCA8IDApCiAJCXJldHVybiBhbHJlYWR5X2VuYWJsZWQ7CisJaWYgKHN5bmNfZW5hYmxlZCA8IDApCisJCXJldHVybiBzeW5jX2VuYWJsZWQ7CiAKIAlpZiAoYWxyZWFkeV9lbmFibGVkKSB7CiAJCS8qIEZhY2lsaXRhdGUgc21vb3RoIHJlZmNsayBhY3Jvc3MgdGhlIHRyYW5zaXRpb24gKi8KLQkJcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGZsbC0+YXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyAweDksCi0JCQkJCSBBUklaT05BX0ZMTDFfR0FJTl9NQVNLLCAwKTsKIAkJcmVnbWFwX3VwZGF0ZV9iaXRzKGZsbC0+YXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyAxLAogCQkJCSAgIEFSSVpPTkFfRkxMMV9GUkVFUlVOLCBBUklaT05BX0ZMTDFfRlJFRVJVTik7CiAJCXVkZWxheSgzMik7CisJCXJlZ21hcF91cGRhdGVfYml0c19hc3luYyhmbGwtPmFyaXpvbmEtPnJlZ21hcCwgZmxsLT5iYXNlICsgMHg5LAorCQkJCQkgQVJJWk9OQV9GTEwxX0dBSU5fTUFTSywgMCk7CiAJfQogCiAJLyoKQEAgLTIyMzMsNiArMjI3NCwxMCBAQAogCSAgICBmbGwtPnJlZl9zcmMgIT0gZmxsLT5zeW5jX3NyYykgewogCQlhcml6b25hX2NhbGNfZmxsKGZsbCwgJmNmZywgZmxsLT5yZWZfZnJlcSwgZmFsc2UpOwogCisJCS8qIFJlZiBwYXRoIGhhcmRjb2RlcyBsYW1iZGEgdG8gNjU1MzYgd2hlbiBzeW5jIGlzIG9uICovCisJCWlmIChmbGwtPnN5bmNfc3JjID49IDAgJiYgY2ZnLmxhbWJkYSkKKwkJCWNmZy50aGV0YSA9IChjZmcudGhldGEgKiAoMSA8PCAxNikpIC8gY2ZnLmxhbWJkYTsKKwogCQlhcml6b25hX2FwcGx5X2ZsbChhcml6b25hLCBmbGwtPmJhc2UsICZjZmcsIGZsbC0+cmVmX3NyYywKIAkJCQkgIGZhbHNlKTsKIAkJaWYgKGZsbC0+c3luY19zcmMgPj0gMCkgewpAQCAtMjI1NSw2ICsyMzAwLDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKGFscmVhZHlfZW5hYmxlZCAmJiAhIXN5bmNfZW5hYmxlZCAhPSB1c2Vfc3luYykKKwkJYXJpem9uYV9mbGxfd2FybihmbGwsICJTeW5jaHJvbmlzZXIgY2hhbmdlZCBvbiBhY3RpdmUgRkxMXG4iKTsKKwogCS8qCiAJICogSW5jcmVhc2UgdGhlIGJhbmR3aWR0aCBpZiB3ZSdyZSBub3QgdXNpbmcgYSBsb3cgZnJlcXVlbmN5CiAJICogc3luYyBzb3VyY2UuCkBAIC0yMjY4LDE0ICsyMzE2LDE0IEBACiAJCQkJCSBBUklaT05BX0ZMTDFfU1lOQ19CVyk7CiAKIAlpZiAoIWFscmVhZHlfZW5hYmxlZCkKLQkJcG1fcnVudGltZV9nZXQoYXJpem9uYS0+ZGV2KTsKKwkJcG1fcnVudGltZV9nZXRfc3luYyhhcml6b25hLT5kZXYpOwogCi0JcmVnbWFwX3VwZGF0ZV9iaXRzX2FzeW5jKGFyaXpvbmEtPnJlZ21hcCwgZmxsLT5iYXNlICsgMSwKLQkJCQkgQVJJWk9OQV9GTEwxX0VOQSwgQVJJWk9OQV9GTEwxX0VOQSk7CiAJaWYgKHVzZV9zeW5jKQogCQlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyAweDExLAogCQkJCQkgQVJJWk9OQV9GTEwxX1NZTkNfRU5BLAogCQkJCQkgQVJJWk9OQV9GTEwxX1NZTkNfRU5BKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHNfYXN5bmMoYXJpem9uYS0+cmVnbWFwLCBmbGwtPmJhc2UgKyAxLAorCQkJCSBBUklaT05BX0ZMTDFfRU5BLCBBUklaT05BX0ZMTDFfRU5BKTsKIAogCWlmIChhbHJlYWR5X2VuYWJsZWQpCiAJCXJlZ21hcF91cGRhdGVfYml0c19hc3luYyhhcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDEsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2FyaXpvbmEuaCBiL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5oCmluZGV4IDY5ZGExZWYuLjg1MGFhMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5oCkBAIC0xOTAsMjAgKzE5MCwyMSBAQAogCiAjZGVmaW5lIEFSSVpPTkFfRFNQX1JPVVRFUyhuYW1lKSBcCiAJeyBuYW1lLCBOVUxMLCBuYW1lICIgUHJlbG9hZGVyIn0sIFwKLQl7IG5hbWUgIiBQcmVsb2FkZXIiLCBOVUxMLCBuYW1lICIgQXV4IDEiIH0sIFwKLQl7IG5hbWUgIiBQcmVsb2FkZXIiLCBOVUxMLCBuYW1lICIgQXV4IDIiIH0sIFwKLQl7IG5hbWUgIiBQcmVsb2FkZXIiLCBOVUxMLCBuYW1lICIgQXV4IDMiIH0sIFwKLQl7IG5hbWUgIiBQcmVsb2FkZXIiLCBOVUxMLCBuYW1lICIgQXV4IDQiIH0sIFwKLQl7IG5hbWUgIiBQcmVsb2FkZXIiLCBOVUxMLCBuYW1lICIgQXV4IDUiIH0sIFwKLQl7IG5hbWUgIiBQcmVsb2FkZXIiLCBOVUxMLCBuYW1lICIgQXV4IDYiIH0sIFwKKwl7IG5hbWUgIiBQcmVsb2FkZXIiLCBOVUxMLCAiU1lTQ0xLIiB9LCBcCisJeyBuYW1lLCBOVUxMLCBuYW1lICIgQXV4IDEiIH0sIFwKKwl7IG5hbWUsIE5VTEwsIG5hbWUgIiBBdXggMiIgfSwgXAorCXsgbmFtZSwgTlVMTCwgbmFtZSAiIEF1eCAzIiB9LCBcCisJeyBuYW1lLCBOVUxMLCBuYW1lICIgQXV4IDQiIH0sIFwKKwl7IG5hbWUsIE5VTEwsIG5hbWUgIiBBdXggNSIgfSwgXAorCXsgbmFtZSwgTlVMTCwgbmFtZSAiIEF1eCA2IiB9LCBcCiAJQVJJWk9OQV9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIEF1eCAxIiksIFwKIAlBUklaT05BX01JWEVSX0lOUFVUX1JPVVRFUyhuYW1lICIgQXV4IDIiKSwgXAogCUFSSVpPTkFfTUlYRVJfSU5QVVRfUk9VVEVTKG5hbWUgIiBBdXggMyIpLCBcCiAJQVJJWk9OQV9NSVhFUl9JTlBVVF9ST1VURVMobmFtZSAiIEF1eCA0IiksIFwKIAlBUklaT05BX01JWEVSX0lOUFVUX1JPVVRFUyhuYW1lICIgQXV4IDUiKSwgXAogCUFSSVpPTkFfTUlYRVJfSU5QVVRfUk9VVEVTKG5hbWUgIiBBdXggNiIpLCBcCi0JQVJJWk9OQV9NSVhFUl9ST1VURVMobmFtZSAiIFByZWxvYWRlciIsIG5hbWUgIkwiKSwgXAotCUFSSVpPTkFfTUlYRVJfUk9VVEVTKG5hbWUgIiBQcmVsb2FkZXIiLCBuYW1lICJSIikKKwlBUklaT05BX01JWEVSX1JPVVRFUyhuYW1lLCBuYW1lICJMIiksIFwKKwlBUklaT05BX01JWEVSX1JPVVRFUyhuYW1lLCBuYW1lICJSIikKIAogI2RlZmluZSBBUklaT05BX0VRX0NPTlRST0woeG5hbWUsIHhiYXNlKSAgICAgICAgICAgICAgICAgICAgICBcCiB7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLCAgIFwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYnQtc2NvLmMgYi9zb3VuZC9zb2MvY29kZWNzL2J0LXNjby5jCmluZGV4IDJhOGQwZWUuLjgwMTRlNjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYnQtc2NvLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9idC1zY28uYwpAQCAtNjMsMTAgKzYzLDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfYnRfc2NvID0gewotCS5kYXBtX3dpZGdldHMgPSBidF9zY29fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYnRfc2NvX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGJ0X3Njb19yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYnRfc2NvX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gYnRfc2NvX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShidF9zY29fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBidF9zY29fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShidF9zY29fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBidF9zY29fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3E5M3ZjLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NxOTN2Yy5jCmluZGV4IDFjODk1YTUuLjdhMmQ5YTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3E5M3ZjLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jcTkzdmMuYwpAQCAtMTMxLDggKzEzMSwxMCBAQAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2NxOTN2YyA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwgPSBjcTkzdmNfc2V0X2JpYXNfbGV2ZWwsCiAJLmdldF9yZWdtYXAgPSBjcTkzdmNfZ2V0X3JlZ21hcCwKLQkuY29udHJvbHMgPSBjcTkzdmNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNxOTN2Y19zbmRfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMgPSBjcTkzdmNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjcTkzdmNfc25kX2NvbnRyb2xzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBjcTkzdmNfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3MzNWwzMi5jIGIvc291bmQvc29jL2NvZGVjcy9jczM1bDMyLmMKaW5kZXggMjg3ZDEzNy4uN2U5ODA2MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczM1bDMyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczM1bDMyLmMKQEAgLTIzMSwxMyArMjMxLDE0IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfY3MzNWwzMiA9IHsKIAkuc2V0X3N5c2NsayA9IGNzMzVsMzJfY29kZWNfc2V0X3N5c2NsaywKIAotCS5kYXBtX3dpZGdldHMgPSBjczM1bDMyX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3MzNWwzMl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGNzMzVsMzJfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzMzVsMzJfYXVkaW9fbWFwKSwKLQotCS5jb250cm9scyA9IGNzMzVsMzJfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNzMzVsMzJfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzMzVsMzJfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3MzNWwzMl9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzMzVsMzJfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3MzNWwzMl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3MzNWwzMl9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzMzVsMzJfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogLyogQ3VycmVudCBhbmQgdGhyZXNob2xkIHBvd2VydXAgc2VxdWVuY2UgUGczNyBpbiBkYXRhc2hlZXQgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3MzNWwzMy5jIGIvc291bmQvc29jL2NvZGVjcy9jczM1bDMzLmMKaW5kZXggNmY5YzFhZC4uNmRmMjlmYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczM1bDMzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczM1bDMzLmMKQEAgLTgzNywxMyArODM3LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gY3MzNWwzM19zZXRfYmlhc19sZXZlbCwKIAkuc2V0X3N5c2NsayA9IGNzMzVsMzNfY29kZWNfc2V0X3N5c2NsaywKIAotCS5kYXBtX3dpZGdldHMgPSBjczM1bDMzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3MzNWwzM19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGNzMzVsMzNfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzMzVsMzNfYXVkaW9fbWFwKSwKLQkuY29udHJvbHMgPSBjczM1bDMzX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczM1bDMzX3NuZF9jb250cm9scyksCi0KKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzMzVsMzNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3MzNWwzM19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzMzVsMzNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3MzNWwzM19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3MzNWwzM19hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzMzVsMzNfYXVkaW9fbWFwKSwKKwl9LAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjY1LmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI2NS5jCmluZGV4IDU1ZGIxOWQuLmZkOTY2YmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjY1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyNjUuYwpAQCAtNTQ3LDEzICs1NDcsMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2NzNDI2NSA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwgPSBjczQyNjVfc2V0X2JpYXNfbGV2ZWwsCiAKLQkuZGFwbV93aWRnZXRzID0gY3M0MjY1X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3M0MjY1X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY3M0MjY1X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjczQyNjVfYXVkaW9fbWFwKSwKLQotCS5jb250cm9scyA9IGNzNDI2NV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3M0MjY1X3NuZF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczQyNjVfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M0MjY1X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3M0MjY1X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNDI2NV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3M0MjY1X2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M0MjY1X2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczQyNjVfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKaW5kZXggZTA3ODA3ZC4uMThiYWVhMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCkBAIC02MTcsMTIgKzYxNywxNCBAQAogCS5zdXNwZW5kID0JCWNzNDI3MF9zb2Nfc3VzcGVuZCwKIAkucmVzdW1lID0JCWNzNDI3MF9zb2NfcmVzdW1lLAogCi0JLmNvbnRyb2xzID0JCWNzNDI3MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9CQlBUlJBWV9TSVpFKGNzNDI3MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPQkJY3M0MjcwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9CUFSUkFZX1NJWkUoY3M0MjcwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0JCWNzNDI3MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0JQVJSQVlfU0laRShjczQyNzBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMgPQkJY3M0MjcwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scyA9CQlBUlJBWV9TSVpFKGNzNDI3MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzID0JCWNzNDI3MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzID0JQVJSQVlfU0laRShjczQyNzBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzID0JCWNzNDI3MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcyA9CUFSUkFZX1NJWkUoY3M0MjcwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jCmluZGV4IDBjMDAxMGIuLjhjMGYzYjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYwpAQCAtNjQ1LDEyICs2NDUsMTQgQEAKIAkuc3VzcGVuZAkJPSBjczQyNzFfc29jX3N1c3BlbmQsCiAJLnJlc3VtZQkJCT0gY3M0MjcxX3NvY19yZXN1bWUsCiAKLQkuY29udHJvbHMJCT0gY3M0MjcxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M0MjcxX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkJPSBjczQyNzFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczQyNzFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gY3M0MjcxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDI3MV9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczQyNzFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M0MjcxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3M0MjcxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNDI3MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3M0MjcxX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczQyNzFfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGNzNDI3MV9jb21tb25fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQybDUxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYwppbmRleCAzNTQ4OGYxLi45NmNmZTM4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTEuYwpAQCAtNTA3LDEyICs1MDcsMTQgQEAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2RldmljZV9jczQybDUxID0gewogCS5wcm9iZSA9IGNzNDJsNTFfY29kZWNfcHJvYmUsCiAKLQkuY29udHJvbHMgPSBjczQybDUxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczQybDUxX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGNzNDJsNTFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShjczQybDUxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY3M0Mmw1MV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3M0Mmw1MV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3M0Mmw1MV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczQybDUxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3M0Mmw1MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczQybDUxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczQybDUxX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M0Mmw1MV9yb3V0ZXMpLAorCX0sCiB9OwogCiBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBjczQybDUxX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1Mi5jIGIvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKaW5kZXggNDdiOTdmYy4uMGQ5YzRhNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQybDUyLmMKQEAgLTEwNTYsMTMgKzEwNTYsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBjczQybDUyX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5kYXBtX3dpZGdldHMgPSBjczQybDUyX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3M0Mmw1Ml9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGNzNDJsNTJfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzNDJsNTJfYXVkaW9fbWFwKSwKLQotCS5jb250cm9scyA9IGNzNDJsNTJfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNzNDJsNTJfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGNzNDJsNTJfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M0Mmw1Ml9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzNDJsNTJfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoY3M0Mmw1Ml9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gY3M0Mmw1Ml9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDJsNTJfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogLyogQ3VycmVudCBhbmQgdGhyZXNob2xkIHBvd2VydXAgc2VxdWVuY2UgUGczNyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQybDU2LmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTYuYwppbmRleCBlZWMxZmY4Li41NGMxNzY4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNTYuYwpAQCAtMTEyMSwxMyArMTEyMSwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IGNzNDJsNTZfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmRhcG1fd2lkZ2V0cyA9IGNzNDJsNTZfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShjczQybDU2X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY3M0Mmw1Nl9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3M0Mmw1Nl9hdWRpb19tYXApLAotCi0JLmNvbnRyb2xzID0gY3M0Mmw1Nl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3M0Mmw1Nl9zbmRfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3M0Mmw1Nl9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczQybDU2X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3M0Mmw1Nl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczQybDU2X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczQybDU2X2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M0Mmw1Nl9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY3M0Mmw1Nl9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJsNzMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw3My5jCmluZGV4IDQyYThmZDQuLjcxYmE1NjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw3My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw3My5jCkBAIC03OTQsNyArNzk0LDcgQEAKIAl1OCBtbWNjOwogfTsKIAotc3RhdGljIHN0cnVjdCBjczQybDczX21jbGtfZGl2IGNzNDJsNzNfbWNsa19jb2VmZnNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3M0Mmw3M19tY2xrX2RpdiBjczQybDczX21jbGtfY29lZmZzW10gPSB7CiAJLyogTUNMSywgU2FtcGxlIFJhdGUsIHhNTUNDWzU6MF0gKi8KIAl7NTY0NDgwMCwgMTEwMjUsIDB4MzB9LAogCXs1NjQ0ODAwLCAyMjA1MCwgMHgyMH0sCkBAIC04NDQsNyArODQ0LDcgQEAKIAl1OCBtY2xrZGl2OwogfTsKIAotc3RhdGljIHN0cnVjdCBjczQybDczX21jbGt4X2RpdiBjczQybDczX21jbGt4X2NvZWZmc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBjczQybDczX21jbGt4X2RpdiBjczQybDczX21jbGt4X2NvZWZmc1tdID0gewogCXs1NjQ0ODAwLCAgMSwgMH0sCS8qIDU2NDQ4MDAgKi8KIAl7NjAwMDAwMCwgIDEsIDB9LAkvKiA2MDAwMDAwICovCiAJezYxNDQwMDAsICAxLCAwfSwJLyogNjE0NDAwMCAqLwpAQCAtMTI1NywxMyArMTI1NywxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IGNzNDJsNzNfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmRhcG1fd2lkZ2V0cyA9IGNzNDJsNzNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShjczQybDczX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY3M0Mmw3M19hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3M0Mmw3M19hdWRpb19tYXApLAotCi0JLmNvbnRyb2xzID0gY3M0Mmw3M19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY3M0Mmw3M19zbmRfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3M0Mmw3M19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczQybDczX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3M0Mmw3M19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczQybDczX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczQybDczX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3M0Mmw3M19hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY3M0Mmw3M19yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJ4eDguYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mnh4OC5jCmluZGV4IDExNzkxMDFiLi5iNGQ4NzM3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDJ4eDguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDJ4eDguYwpAQCAtNDExLDEyICs0MTEsMTQgQEAKIAkucHJvYmUgPSBjczQyeHg4X2NvZGVjX3Byb2JlLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IGNzNDJ4eDhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNzNDJ4eDhfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gY3M0Mnh4OF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGNzNDJ4eDhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBjczQyeHg4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzNDJ4eDhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3M0Mnh4OF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczQyeHg4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3M0Mnh4OF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczQyeHg4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczQyeHg4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczQyeHg4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogY29uc3Qgc3RydWN0IGNzNDJ4eDhfZHJpdmVyX2RhdGEgY3M0MjQ0OF9kYXRhID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQzNDkuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MzQ5LmMKaW5kZXggMGFjOGZjNS4uMjMxY2E5MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQzNDkuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDM0OS5jCkBAIC0yNTYsMTMgKzI1NiwxNCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2NzNDM0OSA9IHsKLQkuY29udHJvbHMJCT0gY3M0MzQ5X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoY3M0MzQ5X3NuZF9jb250cm9scyksCi0KLQkuZGFwbV93aWRnZXRzCQk9IGNzNDM0OV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNDM0OV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBjczQzNDlfcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDM0OV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3M0MzQ5X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNDM0OV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGNzNDM0OV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczQzNDlfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzNDM0OV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNDM0OV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgY3M0MzQ5X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0N2wyNC5jIGIvc291bmQvc29jL2NvZGVjcy9jczQ3bDI0LmMKaW5kZXggOTU0YTRmNS4uNWIyMjU2NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQ3bDI0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQ3bDI0LmMKQEAgLTc0Niw2ICs3NDYsMTYgQEAKIAl7ICJJTjJMIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAl7ICJJTjJSIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAorCXsgIkFTUkMxTCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzFSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMkwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMyUiIsIE5VTEwsICJTWVNDTEsiIH0sCisKKwl7ICJBU1JDMUwiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzFSIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMyTCIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMlIiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisKIAl7ICJNSUNCSUFTMSIsIE5VTEwsICJNSUNWREQiIH0sCiAJeyAiTUlDQklBUzIiLCBOVUxMLCAiTUlDVkREIiB9LAogCkBAIC04MDQsNyArODE0LDYgQEAKIAl7ICJBSUYzIENhcHR1cmUiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCiAJeyAiVm9pY2UgQ29udHJvbCBEU1AiLCBOVUxMLCAiRFNQMyIgfSwKLQl7ICJWb2ljZSBDb250cm9sIERTUCIsIE5VTEwsICJTWVNDTEsiIH0sCiAKIAl7ICJJTjFMIFBHQSIsIE5VTEwsICJJTjFMIiB9LAogCXsgIklOMVIgUEdBIiwgTlVMTCwgIklOMVIiIH0sCkBAIC04MTMsNyArODIyLDYgQEAKIAl7ICJJTjJSIFBHQSIsIE5VTEwsICJJTjJSIiB9LAogCiAJeyAiQXVkaW8gVHJhY2UgRFNQIiwgTlVMTCwgIkRTUDIiIH0sCi0JeyAiQXVkaW8gVHJhY2UgRFNQIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAogCUFSSVpPTkFfTUlYRVJfUk9VVEVTKCJPVVQxTCIsICJIUE9VVDFMIiksCiAJQVJJWk9OQV9NSVhFUl9ST1VURVMoIk9VVDFSIiwgIkhQT1VUMVIiKSwKQEAgLTExOTAsMTIgKzExOTgsMTQgQEAKIAkuc2V0X3N5c2NsayA9IGFyaXpvbmFfc2V0X3N5c2NsaywKIAkuc2V0X3BsbCA9IGNzNDdsMjRfc2V0X2ZsbCwKIAotCS5jb250cm9scyA9IGNzNDdsMjRfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNzNDdsMjRfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gY3M0N2wyNF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGNzNDdsMjRfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBjczQ3bDI0X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGNzNDdsMjRfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY3M0N2wyNF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjczQ3bDI0X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY3M0N2wyNF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjczQ3bDI0X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjczQ3bDI0X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShjczQ3bDI0X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfY29tcHJfb3BzIGNzNDdsMjRfY29tcHJfb3BzID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczUzbDMwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNTNsMzAuYwppbmRleCAyYzBkOWM0Li5jYjQ3ZmI1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNTNsMzAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNTNsMzAuYwpAQCAtNDY2LDcgKzQ2Niw3IEBACiAJdTggbWNsa19pbnRfc2NhbGU7CiB9OwogCi1zdGF0aWMgc3RydWN0IGNzNTNsMzBfbWNsa19kaXYgY3M1M2wzMF9tY2xrX2NvZWZmc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBjczUzbDMwX21jbGtfZGl2IGNzNTNsMzBfbWNsa19jb2VmZnNbXSA9IHsKIAkvKiBOT1RFOiBFbmFibGUgTUNMS19JTlRfU0NBTEUgdG8gc2F2ZSBwb3dlci4gKi8KIAogCS8qIE1DTEssIFNhbXBsZSBSYXRlLCBhc3BfcmF0ZSwgaW50ZXJuYWxfZnNfcmF0aW8sIG1jbGtfaW50X3NjYWxlICovCkBAIC01MTEsNyArNTExLDcgQEAKIAl1OCBtY2xrZGl2OwogfTsKIAotc3RhdGljIHN0cnVjdCBjczUzbDMwX21jbGt4X2RpdiBjczUzbDMwX21jbGt4X2NvZWZmc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBjczUzbDMwX21jbGt4X2RpdiBjczUzbDMwX21jbGt4X2NvZWZmc1tdID0gewogCXs1NjQ0ODAwLCAgMSwgQ1M1M0wzMF9NQ0xLX0RJVl9CWV8xfSwKIAl7NjAwMDAwMCwgIDEsIENTNTNMMzBfTUNMS19ESVZfQllfMX0sCiAJezYxNDQwMDAsICAxLCBDUzUzTDMwX01DTEtfRElWX0JZXzF9LApAQCAtODk3LDEzICs4OTcsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBjczUzbDMwX3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5kYXBtX3dpZGdldHMgPSBjczUzbDMwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY3M1M2wzMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGNzNTNsMzBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY3M1M2wzMF9kYXBtX3JvdXRlcyksCi0KLQkuY29udHJvbHMgPSBjczUzbDMwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShjczUzbDMwX3NuZF9jb250cm9scyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBjczUzbDMwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGNzNTNsMzBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBjczUzbDMwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGNzNTNsMzBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGNzNTNsMzBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGNzNTNsMzBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgY3M1M2wzMF9yZWdtYXAgPSB7CkBAIC05OTksOCArMTAwMCw4IEBACiAJLyogQ2hlY2sgaWYgTUNMSyBwcm92aWRlZCAqLwogCWNzNTNsMzAtPm1jbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAibWNsayIpOwogCWlmIChJU19FUlIoY3M1M2wzMC0+bWNsaykpIHsKLQkJaWYgKFBUUl9FUlIoY3M1M2wzMC0+bWNsaykgPT0gLUVQUk9CRV9ERUZFUikgewotCQkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKKwkJaWYgKFBUUl9FUlIoY3M1M2wzMC0+bWNsaykgIT0gLUVOT0VOVCkgeworCQkJcmV0ID0gUFRSX0VSUihjczUzbDMwLT5tY2xrKTsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KIAkJLyogT3RoZXJ3aXNlIG1hcmsgdGhlIG1jbGsgcG9pbnRlciB0byBOVUxMICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2N4MjA0NDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCmluZGV4IGZiMzg4NWYuLjJjMTI0NzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCkBAIC00MDcsMTAgKzQwNywxMiBAQAogCS5yZWdfd29yZF9zaXplID0gc2l6ZW9mKHU4KSwKIAkucmVhZCA9IGN4MjA0NDJfcmVhZF9yZWdfY2FjaGUsCiAJLndyaXRlID0gY3gyMDQ0Ml93cml0ZSwKLQkuZGFwbV93aWRnZXRzID0gY3gyMDQ0Ml9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGN4MjA0NDJfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBjeDIwNDQyX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjeDIwNDQyX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gY3gyMDQ0Ml9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjeDIwNDQyX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjeDIwNDQyX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY3gyMDQ0Ml9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGN4MjA0NDJfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMC5jCmluZGV4IGFmMjNhNjEuLjE3MDUzZGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTAuYwpAQCAtMTE2NywxMyArMTE2NywxNCBAQAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2RhNzIxMCA9IHsKIAkucHJvYmUJCQk9IGRhNzIxMF9wcm9iZSwKIAotCS5jb250cm9scwkJPSBkYTcyMTBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTcyMTBfc25kX2NvbnRyb2xzKSwKLQotCS5kYXBtX3dpZGdldHMJCT0gZGE3MjEwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGE3MjEwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IGRhNzIxMF9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZGE3MjEwX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBkYTcyMTBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZGE3MjEwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gZGE3MjEwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhNzIxMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gZGE3MjEwX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZGE3MjEwX2F1ZGlvX21hcCksCisJfSwKIH07CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5jIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTMuYwppbmRleCBiY2YxODM0Li4xMmRhNTU4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEzLmMKQEAgLTc1MCwxMSArNzUwLDE4IEBACiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxM19QQ19DT1VOVCwKIAkJCQkgICAgREE3MjEzX1BDX0ZSRUVSVU5fTUFTSywgMCk7CiAKLQkJLyogU2xhdmUgbW9kZSwgaWYgU1JNIG5vdCBlbmFibGVkIG5vIG5lZWQgZm9yIHN0YXR1cyBjaGVja3MgKi8KKwkJLyogSWYgU1JNIG5vdCBlbmFibGVkIHRoZW4gbm90aGluZyBtb3JlIHRvIGRvICovCiAJCXBsbF9jdHJsID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTNfUExMX0NUUkwpOwogCQlpZiAoIShwbGxfY3RybCAmIERBNzIxM19QTExfU1JNX0VOKSkKIAkJCXJldHVybiAwOwogCisJCS8qIEFzc2lzdCAzMktIeiBtb2RlIFBMTCBsb2NrICovCisJCWlmIChwbGxfY3RybCAmIERBNzIxM19QTExfMzJLX01PREUpIHsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4RjAsIDB4OEIpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgMHhGMiwgMHgwMyk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweEYwLCAweDAwKTsKKwkJfQorCiAJCS8qIENoZWNrIFNSTSBoYXMgbG9ja2VkICovCiAJCWRvIHsKIAkJCXBsbF9zdGF0dXMgPSBzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxM19QTExfU1RBVFVTKTsKQEAgLTc3MSw2ICs3NzgsMTQgQEAKIAogCQlyZXR1cm4gMDsKIAljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJLyogUmV2ZXJ0IDMyS0h6IFBMTCBsb2NrIHVkcGF0ZXMgaWYgYXBwbGllZCBwcmV2aW91c2x5ICovCisJCXBsbF9jdHJsID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTNfUExMX0NUUkwpOworCQlpZiAocGxsX2N0cmwgJiBEQTcyMTNfUExMXzMyS19NT0RFKSB7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweEYwLCAweDhCKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4RjIsIDB4MDEpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgMHhGMCwgMHgwMCk7CisJCX0KKwogCQkvKiBQQyBmcmVlLXJ1bm5pbmcgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX1BDX0NPVU5ULAogCQkJCSAgICBEQTcyMTNfUENfRlJFRVJVTl9NQVNLLApAQCAtMTI5NywxMCArMTMxMiwxMyBAQAogCiAJc3dpdGNoIChjbGtfaWQpIHsKIAljYXNlIERBNzIxM19DTEtTUkNfTUNMSzoKLQkJZGE3MjEzLT5tY2xrX3NxdWFyZXJfZW4gPSBmYWxzZTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX1BMTF9DVFJMLAorCQkJCSAgICBEQTcyMTNfUExMX01DTEtfU1FSX0VOLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBEQTcyMTNfQ0xLU1JDX01DTEtfU1FSOgotCQlkYTcyMTMtPm1jbGtfc3F1YXJlcl9lbiA9IHRydWU7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxM19QTExfQ1RSTCwKKwkJCQkgICAgREE3MjEzX1BMTF9NQ0xLX1NRUl9FTiwKKwkJCQkgICAgREE3MjEzX1BMTF9NQ0xLX1NRUl9FTik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoY29kZWNfZGFpLT5kZXYsICJVbmtub3duIGNsb2NrIHNvdXJjZSAlZFxuIiwgY2xrX2lkKTsKQEAgLTEzMjQsNyArMTM0Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFN1cHBvcnRlZCBQTEwgaW5wdXQgZnJlcXVlbmNpZXMgYXJlIDVNSHogLSA1NE1Iei4gKi8KKy8qIFN1cHBvcnRlZCBQTEwgaW5wdXQgZnJlcXVlbmNpZXMgYXJlIDMyS0h6LCA1TUh6IC0gNTRNSHouICovCiBzdGF0aWMgaW50IGRhNzIxM19zZXRfZGFpX3BsbChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwgaW50IHBsbF9pZCwKIAkJCSAgICAgIGludCBzb3VyY2UsIHVuc2lnbmVkIGludCBmcmVmLCB1bnNpZ25lZCBpbnQgZm91dCkKIHsKQEAgLTEzMzYsMjIgKzEzNTQsMjYgQEAKIAl1MzIgZnJlcV9yZWY7CiAJdTY0IGZyYWNfZGl2OwogCi0JLyogUmVzZXQgUExMIGNvbmZpZ3VyYXRpb24gKi8KLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTNfUExMX0NUUkwsIDApOwotCi0JcGxsX2N0cmwgPSAwOwotCiAJLyogV29ya291dCBpbnB1dCBkaXZpZGVyIGJhc2VkIG9uIE1DTEsgcmF0ZSAqLwogCWlmIChkYTcyMTMtPm1jbGtfcmF0ZSA9PSAzMjc2OCkgeworCQlpZiAoIWRhNzIxMy0+bWFzdGVyKSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIjMyS0h6IG9ubHkgdmFsaWQgaWYgY29kZWMgaXMgY2xvY2sgbWFzdGVyXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKIAkJLyogMzJLSHogUExMIE1vZGUgKi8KIAkJaW5kaXZfYml0cyA9IERBNzIxM19QTExfSU5ESVZfOV9UT18xOF9NSFo7CiAJCWluZGl2ID0gREE3MjEzX1BMTF9JTkRJVl85X1RPXzE4X01IWl9WQUw7CisJCXNvdXJjZSA9IERBNzIxM19TWVNDTEtfUExMXzMyS0haOwogCQlmcmVxX3JlZiA9IDM3NTAwMDA7Ci0JCXBsbF9jdHJsIHw9IERBNzIxM19QTExfMzJLX01PREU7CisKIAl9IGVsc2UgewotCQkvKiA1IC0gNTRNSHogTUNMSyAqLwogCQlpZiAoZGE3MjEzLT5tY2xrX3JhdGUgPCA1MDAwMDAwKSB7Ci0JCQlnb3RvIHBsbF9lcnI7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIlBMTCBpbnB1dCBjbG9jayAlZCBiZWxvdyB2YWxpZCByYW5nZVxuIiwKKwkJCQlkYTcyMTMtPm1jbGtfcmF0ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfSBlbHNlIGlmIChkYTcyMTMtPm1jbGtfcmF0ZSA8PSA5MDAwMDAwKSB7CiAJCQlpbmRpdl9iaXRzID0gREE3MjEzX1BMTF9JTkRJVl81X1RPXzlfTUhaOwogCQkJaW5kaXYgPSBEQTcyMTNfUExMX0lORElWXzVfVE9fOV9NSFpfVkFMOwpAQCAtMTM2NSwzMSArMTM4Nyw0MyBAQAogCQkJaW5kaXZfYml0cyA9IERBNzIxM19QTExfSU5ESVZfMzZfVE9fNTRfTUhaOwogCQkJaW5kaXYgPSBEQTcyMTNfUExMX0lORElWXzM2X1RPXzU0X01IWl9WQUw7CiAJCX0gZWxzZSB7Ci0JCQlnb3RvIHBsbF9lcnI7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCisJCQkJIlBMTCBpbnB1dCBjbG9jayAlZCBhYm92ZSB2YWxpZCByYW5nZVxuIiwKKwkJCQlkYTcyMTMtPm1jbGtfcmF0ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlmcmVxX3JlZiA9IChkYTcyMTMtPm1jbGtfcmF0ZSAvIGluZGl2KTsKIAl9CiAKLQlwbGxfY3RybCB8PSBpbmRpdl9iaXRzOworCXBsbF9jdHJsID0gaW5kaXZfYml0czsKIAotCS8qIFBMTCBCeXBhc3MgbW9kZSAqLwotCWlmIChzb3VyY2UgPT0gREE3MjEzX1NZU0NMS19NQ0xLKSB7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxM19QTExfQ1RSTCwgcGxsX2N0cmwpOworCS8qIENvbmZpZ3VyZSBQTEwgKi8KKwlzd2l0Y2ggKHNvdXJjZSkgeworCWNhc2UgREE3MjEzX1NZU0NMS19NQ0xLOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTNfUExMX0NUUkwsCisJCQkJICAgIERBNzIxM19QTExfSU5ESVZfTUFTSyB8CisJCQkJICAgIERBNzIxM19QTExfTU9ERV9NQVNLLCBwbGxfY3RybCk7CiAJCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogSWYgQ29kZWMgaXMgc2xhdmUgYW5kIFNSTSBlbmFibGVkLAotCSAqIGZyZXFfb3V0IGlzICg5ODMwNDAwMCArIDkwMzE2ODAwKS8yID0gOTQzMTA0MDAKLQkgKi8KLQlpZiAoIWRhNzIxMy0+bWFzdGVyICYmIGRhNzIxMy0+c3JtX2VuKSB7Ci0JCWZvdXQgPSBEQTcyMTNfUExMX0ZSRVFfT1VUXzk0MzEwNDAwOworCWNhc2UgREE3MjEzX1NZU0NMS19QTEw6CisJCWJyZWFrOworCWNhc2UgREE3MjEzX1NZU0NMS19QTExfU1JNOgogCQlwbGxfY3RybCB8PSBEQTcyMTNfUExMX1NSTV9FTjsKLQl9CisJCWZvdXQgPSBEQTcyMTNfUExMX0ZSRVFfT1VUXzk0MzEwNDAwOworCQlicmVhazsKKwljYXNlIERBNzIxM19TWVNDTEtfUExMXzMyS0haOgorCQlpZiAoZGE3MjEzLT5tY2xrX3JhdGUgIT0gMzI3NjgpIHsKKwkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkiMzJLSHogbW9kZSBvbmx5IHZhbGlkIHdpdGggMzJLSHogTUNMS1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCi0JLyogRW5hYmxlIE1DTEsgc3F1YXJlciBpZiByZXF1aXJlZCAqLwotCWlmIChkYTcyMTMtPm1jbGtfc3F1YXJlcl9lbikKLQkJcGxsX2N0cmwgfD0gREE3MjEzX1BMTF9NQ0xLX1NRUl9FTjsKKwkJcGxsX2N0cmwgfD0gREE3MjEzX1BMTF8zMktfTU9ERSB8IERBNzIxM19QTExfU1JNX0VOOworCQlmb3V0ID0gREE3MjEzX1BMTF9GUkVRX09VVF85NDMxMDQwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBQTEwgY29uZmlnXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyogQ2FsY3VsYXRlIGRpdmlkZXJzIGZvciBQTEwgKi8KIAlwbGxfaW50ZWdlciA9IGZvdXQgLyBmcmVxX3JlZjsKQEAgLTE0MDUsMTQgKzE0MzksMTkgQEAKIAogCS8qIEVuYWJsZSBQTEwgKi8KIAlwbGxfY3RybCB8PSBEQTcyMTNfUExMX0VOOwotCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxM19QTExfQ1RSTCwgcGxsX2N0cmwpOworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxM19QTExfQ1RSTCwKKwkJCSAgICBEQTcyMTNfUExMX0lORElWX01BU0sgfCBEQTcyMTNfUExMX01PREVfTUFTSywKKwkJCSAgICBwbGxfY3RybCk7CisKKwkvKiBBc3Npc3QgMzJLSHogbW9kZSBQTEwgbG9jayAqLworCWlmIChzb3VyY2UgPT0gREE3MjEzX1NZU0NMS19QTExfMzJLSFopIHsKKwkJc25kX3NvY193cml0ZShjb2RlYywgMHhGMCwgMHg4Qik7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIDB4RjEsIDB4MDMpOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCAweEYxLCAweDAxKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgMHhGMCwgMHgwMCk7CisJfQogCiAJcmV0dXJuIDA7Ci0KLXBsbF9lcnI6Ci0JZGV2X2Vycihjb2RlY19kYWktPmRldiwgIlVuc3VwcG9ydGVkIFBMTCBpbnB1dCBmcmVxdWVuY3kgJWRcbiIsCi0JCWRhNzIxMy0+bWNsa19yYXRlKTsKLQlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyogREFJIG9wZXJhdGlvbnMgKi8KQEAgLTE0NTQsMTEgKzE0OTMsMTAgQEAKIAogCXN3aXRjaCAobGV2ZWwpIHsKIAljYXNlIFNORF9TT0NfQklBU19PTjoKLQljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCQlicmVhazsKLQljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX09GRikgewotCQkJLyogTUNMSyAqLworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCS8qIEVuYWJsZSBNQ0xLIGZvciB0cmFuc2l0aW9uIHRvIE9OIHN0YXRlICovCisJCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfU1RBTkRCWSkgewogCQkJaWYgKGRhNzIxMy0+bWNsaykgewogCQkJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYTcyMTMtPm1jbGspOwogCQkJCWlmIChyZXQpIHsKQEAgLTE0NjcsMjEgKzE1MDUsMjQgQEAKIAkJCQkJcmV0dXJuIHJldDsKIAkJCQl9CiAJCQl9Ci0KKwkJfQorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJLyogRW5hYmxlIFZNSUQgcmVmZXJlbmNlICYgbWFzdGVyIGJpYXMgKi8KIAkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxM19SRUZFUkVOQ0VTLAogCQkJCQkgICAgREE3MjEzX1ZNSURfRU4gfCBEQTcyMTNfQklBU19FTiwKIAkJCQkJICAgIERBNzIxM19WTUlEX0VOIHwgREE3MjEzX0JJQVNfRU4pOworCQl9IGVsc2UgeworCQkJLyogUmVtb3ZlIE1DTEsgKi8KKwkJCWlmIChkYTcyMTMtPm1jbGspCisJCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhNzIxMy0+bWNsayk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgogCQkvKiBEaXNhYmxlIFZNSUQgcmVmZXJlbmNlICYgbWFzdGVyIGJpYXMgKi8KIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX1JFRkVSRU5DRVMsCiAJCQkJICAgIERBNzIxM19WTUlEX0VOIHwgREE3MjEzX0JJQVNfRU4sIDApOwotCi0JCS8qIE1DTEsgKi8KLQkJaWYgKGRhNzIxMy0+bWNsaykKLQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYTcyMTMtPm1jbGspOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNjA1LDkgKzE2NDYsNiBAQAogCQkJICAgIERBNzIxM19BTENfQ0FMSUJfTU9ERV9NQU4sIDApOwogCWRhNzIxMy0+YWxjX2NhbGliX2F1dG8gPSB0cnVlOwogCi0JLyogRGVmYXVsdCB0byB1c2luZyBTUk0gZm9yIHNsYXZlIG1vZGUgKi8KLQlkYTcyMTMtPnNybV9lbiA9IHRydWU7Ci0KIAkvKiBEZWZhdWx0IFBDIGNvdW50ZXIgdG8gZnJlZS1ydW5uaW5nICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjEzX1BDX0NPVU5ULCBEQTcyMTNfUENfRlJFRVJVTl9NQVNLLAogCQkJICAgIERBNzIxM19QQ19GUkVFUlVOX01BU0spOwpAQCAtMTc0MCwxMyArMTc3OCwxNCBAQAogCS5wcm9iZQkJCT0gZGE3MjEzX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbAkJPSBkYTcyMTNfc2V0X2JpYXNfbGV2ZWwsCiAKLQkuY29udHJvbHMJCT0gZGE3MjEzX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZGE3MjEzX3NuZF9jb250cm9scyksCi0KLQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxM19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhNzIxM19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBkYTcyMTNfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxM19hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gZGE3MjEzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzIxM19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxM19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTcyMTNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGRhNzIxM19hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxM19hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgZGE3MjEzX3JlZ21hcF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5oIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTMuaAppbmRleCBmYmI3YTM1Li4xNmVmNTZmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxMy5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjEzLmgKQEAgLTE3Miw2ICsxNzIsNyBAQAogI2RlZmluZSBEQTcyMTNfUExMXzMyS19NT0RFCQkJCQkoMHgxIDw8IDUpCiAjZGVmaW5lIERBNzIxM19QTExfU1JNX0VOCQkJCQkoMHgxIDw8IDYpCiAjZGVmaW5lIERBNzIxM19QTExfRU4JCQkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIERBNzIxM19QTExfTU9ERV9NQVNLCQkJCQkoMHg3IDw8IDUpCiAKIC8qIERBNzIxM19EQUlfQ0xLX01PREUgPSAweDI4ICovCiAjZGVmaW5lIERBNzIxM19EQUlfQkNMS1NfUEVSX1dDTEtfMzIJCQkJKDB4MCA8PCAwKQpAQCAtNDk5LDggKzUwMCw2IEBACiAjZGVmaW5lIERBNzIxM19BTENfQVZHX0lURVJBVElPTlMJNQogCiAvKiBQTEwgcmVsYXRlZCAqLwotI2RlZmluZSBEQTcyMTNfU1lTQ0xLX01DTEsJCQkwCi0jZGVmaW5lIERBNzIxM19TWVNDTEtfUExMCQkJMQogI2RlZmluZSBEQTcyMTNfUExMX0ZSRVFfT1VUXzkwMzE2ODAwCQk5MDMxNjgwMAogI2RlZmluZSBEQTcyMTNfUExMX0ZSRVFfT1VUXzk4MzA0MDAwCQk5ODMwNDAwMAogI2RlZmluZSBEQTcyMTNfUExMX0ZSRVFfT1VUXzk0MzEwNDAwCQk5NDMxMDQwMApAQCAtNTE1LDYgKzUxNCwxMyBAQAogCURBNzIxM19DTEtTUkNfTUNMS19TUVIsCiB9OwogCitlbnVtIGRhNzIxM19zeXNfY2xrIHsKKwlEQTcyMTNfU1lTQ0xLX01DTEsgPSAwLAorCURBNzIxM19TWVNDTEtfUExMLAorCURBNzIxM19TWVNDTEtfUExMX1NSTSwKKwlEQTcyMTNfU1lTQ0xLX1BMTF8zMktIWgorfTsKKwogLyogQ29kZWMgcHJpdmF0ZSBkYXRhICovCiBzdHJ1Y3QgZGE3MjEzX3ByaXYgewogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKQEAgLTUyMiw4ICs1MjgsNiBAQAogCXVuc2lnbmVkIGludCBtY2xrX3JhdGU7CiAJaW50IGNsa19zcmM7CiAJYm9vbCBtYXN0ZXI7Ci0JYm9vbCBtY2xrX3NxdWFyZXJfZW47Ci0JYm9vbCBzcm1fZW47CiAJYm9vbCBhbGNfY2FsaWJfYXV0bzsKIAlib29sIGFsY19lbjsKIAlzdHJ1Y3QgZGE3MjEzX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTguYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE4LmMKaW5kZXggOTljZTIzZS4uYzY5ZTk3NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOC5jCkBAIC0xODE5LDcgKzE4MTksNyBAQAogCWlmIChkYTcyMTgtPm1jbGtfcmF0ZSA9PSBmcmVxKQogCQlyZXR1cm4gMDsKIAotCWlmICgoKGZyZXEgPCAyMDAwMDAwKSAmJiAoZnJlcSAhPSAzMjc2OCkpIHx8IChmcmVxID4gNTQwMDAwMDApKSB7CisJaWYgKChmcmVxIDwgMjAwMDAwMCkgfHwgKGZyZXEgPiA1NDAwMDAwMCkpIHsKIAkJZGV2X2Vycihjb2RlY19kYWktPmRldiwgIlVuc3VwcG9ydGVkIE1DTEsgdmFsdWUgJWRcbiIsCiAJCQlmcmVxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODY2LDExICsxODY2LDggQEAKIAl1MzIgZnJlcV9yZWY7CiAJdTY0IGZyYWNfZGl2OwogCi0JLyogVmVyaWZ5IDMyS0h6LCAyTUh6IC0gNTRNSHogTUNMSyBwcm92aWRlZCwgYW5kIHNldCBpbnB1dCBkaXZpZGVyICovCi0JaWYgKGRhNzIxOC0+bWNsa19yYXRlID09IDMyNzY4KSB7Ci0JCWluZGl2X2JpdHMgPSBEQTcyMThfUExMX0lORElWXzlfVE9fMThfTUhaOwotCQlpbmRpdiA9IERBNzIxOF9QTExfSU5ESVZfOV9UT18xOF9NSFpfVkFMOwotCX0gZWxzZSBpZiAoZGE3MjE4LT5tY2xrX3JhdGUgPCAyMDAwMDAwKSB7CisJLyogVmVyaWZ5IDJNSHogLSA1NE1IeiBNQ0xLIHByb3ZpZGVkLCBhbmQgc2V0IGlucHV0IGRpdmlkZXIgKi8KKwlpZiAoZGE3MjE4LT5tY2xrX3JhdGUgPCAyMDAwMDAwKSB7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIlBMTCBpbnB1dCBjbG9jayAlZCBiZWxvdyB2YWxpZCByYW5nZVxuIiwKIAkJCWRhNzIxOC0+bWNsa19yYXRlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xOTExLDkgKzE5MDgsNiBAQAogCWNhc2UgREE3MjE4X1NZU0NMS19QTExfU1JNOgogCQlwbGxfY3RybCB8PSBEQTcyMThfUExMX01PREVfU1JNOwogCQlicmVhazsKLQljYXNlIERBNzIxOF9TWVNDTEtfUExMXzMyS0haOgotCQlwbGxfY3RybCB8PSBEQTcyMThfUExMX01PREVfMzJLSFo7Ci0JCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgUExMIGNvbmZpZ1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjU4OSwyMCArMjU4MywyMiBAQAogCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX09OOgotCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CiAJCWJyZWFrOwotCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6Ci0JCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7Ci0JCQkvKiBNQ0xLICovCisJY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKKwkJLyogRW5hYmxlIE1DTEsgZm9yIHRyYW5zaXRpb24gdG8gT04gc3RhdGUgKi8KKwkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19TVEFOREJZKSB7CiAJCQlpZiAoZGE3MjE4LT5tY2xrKSB7CiAJCQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhNzIxOC0+bWNsayk7CiAJCQkJaWYgKHJldCkgewotCQkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJCQkiRmFpbGVkIHRvIGVuYWJsZSBtY2xrXG4iKTsKKwkJCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBtY2xrXG4iKTsKIAkJCQkJcmV0dXJuIHJldDsKIAkJCQl9CiAJCQl9CisJCX0KIAorCQlicmVhazsKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX09GRikgewogCQkJLyogTWFzdGVyIGJpYXMgKi8KIAkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxOF9SRUZFUkVOQ0VTLAogCQkJCQkgICAgREE3MjE4X0JJQVNfRU5fTUFTSywKQEAgLTI2MTIsNiArMjYwOCwxMCBAQAogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE4X0xET19DVFJMLAogCQkJCQkgICAgREE3MjE4X0xET19FTl9NQVNLLAogCQkJCQkgICAgREE3MjE4X0xET19FTl9NQVNLKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFJlbW92ZSBNQ0xLICovCisJCQlpZiAoZGE3MjE4LT5tY2xrKQorCQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYTcyMTgtPm1jbGspOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKQEAgLTI2MjUsMTAgKzI2MjUsNiBAQAogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE4X1JFRkVSRU5DRVMsCiAJCQkJCSAgICBEQTcyMThfQklBU19FTl9NQVNLLCAwKTsKIAkJfQotCi0JCS8qIE1DTEsgKi8KLQkJaWYgKGRhNzIxOC0+bWNsaykKLQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYTcyMTgtPm1jbGspOwogCQlicmVhazsKIAl9CiAKQEAgLTMwNDUsMTMgKzMwNDEsMTQgQEAKIAkucmVzdW1lCQkJPSBkYTcyMThfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbAkJPSBkYTcyMThfc2V0X2JpYXNfbGV2ZWwsCiAKLQkuY29udHJvbHMJCT0gZGE3MjE4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZGE3MjE4X3NuZF9jb250cm9scyksCi0KLQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxOF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhNzIxOF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBkYTcyMThfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxOF9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gZGE3MjE4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzIxOF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGRhNzIxOF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTcyMThfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGRhNzIxOF9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzIxOF9hdWRpb19tYXApLAorCX0sCiB9OwogCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE4LmggYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOC5oCmluZGV4IDQ3N2NkMzcuLjRmN2VjMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE4LmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTguaApAQCAtODg4LDcgKzg4OCw2IEBACiAjZGVmaW5lIERBNzIxOF9QTExfTU9ERV9CWVBBU1MJCSgweDAgPDwgNikKICNkZWZpbmUgREE3MjE4X1BMTF9NT0RFX05PUk1BTAkJKDB4MSA8PCA2KQogI2RlZmluZSBEQTcyMThfUExMX01PREVfU1JNCQkoMHgyIDw8IDYpCi0jZGVmaW5lIERBNzIxOF9QTExfTU9ERV8zMktIWgkJKDB4MyA8PCA2KQogCiAvKiBEQTcyMThfUExMX0ZSQUNfVE9QID0gMHg5MiAqLwogI2RlZmluZSBEQTcyMThfUExMX0ZCRElWX0ZSQUNfVE9QX1NISUZUCTAKQEAgLTEzNzEsNyArMTM3MCw2IEBACiAJREE3MjE4X1NZU0NMS19NQ0xLID0gMCwKIAlEQTcyMThfU1lTQ0xLX1BMTCwKIAlEQTcyMThfU1lTQ0xLX1BMTF9TUk0sCi0JREE3MjE4X1NZU0NMS19QTExfMzJLSFoKIH07CiAKIGVudW0gZGE3MjE4X2Rldl9pZCB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS1hYWQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LWFhZC5jCmluZGV4IGYwMDU3Y2QuLjJiODkxNGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LWFhZC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LWFhZC5jCkBAIC0xMyw2ICsxMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9wZXJ0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3dha2VpcnEuaD4KQEAgLTExNCwxMyArMTE1LDM4IEBACiAJc3RydWN0IGRhNzIxOV9wcml2ICpkYTcyMTkgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAogCXUxNiB0b25lZ2VuX2ZyZXFfaHB0ZXN0OwotCXU4IGFjY2RldF9jZmc4OwotCWludCByZXBvcnQgPSAwOworCXU4IHBsbF9zcm1fc3RzLCBnYWluX3JhbXBfY3RybCwgYWNjZGV0X2NmZzg7CisJaW50IHJlcG9ydCA9IDAsIHJldCA9IDA7CiAKIAkvKiBMb2NrIERBUE0gYW5kIGFueSBLY29udHJvbHMgdGhhdCBhcmUgYWZmZWN0ZWQgYnkgdGhpcyB0ZXN0ICovCiAJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CiAJbXV0ZXhfbG9jaygmZGE3MjE5LT5sb2NrKTsKIAorCS8qIEVuc3VyZSBNQ0xLIGlzIGF2YWlsYWJsZSBmb3IgSFAgdGVzdCBwcm9jZWR1cmUgKi8KKwlpZiAoZGE3MjE5LT5tY2xrKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYTcyMTktPm1jbGspOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIG1jbGsgLSAlZFxuIiwgcmV0KTsKKwkJCW11dGV4X3VubG9jaygmZGE3MjE5LT5sb2NrKTsKKwkJCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIElmIE1DTEsgbm90IHByZXNlbnQsIHRoZW4gd2UncmUgdXNpbmcgdGhlIGludGVybmFsIG9zY2lsbGF0b3IgYW5kCisJICogcmVxdWlyZSBkaWZmZXJlbnQgZnJlcXVlbmN5IHNldHRpbmdzIHRvIGFjaGlldmUgdGhlIHNhbWUgcmVzdWx0LgorCSAqLworCXBsbF9zcm1fc3RzID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTlfUExMX1NSTV9TVFMpOworCWlmIChwbGxfc3JtX3N0cyAmIERBNzIxOV9QTExfU1JNX1NUU19NQ0xLKQorCQl0b25lZ2VuX2ZyZXFfaHB0ZXN0ID0gY3B1X3RvX2xlMTYoREE3MjE5X0FBRF9IUFRFU1RfUkFNUF9GUkVRKTsKKwllbHNlCisJCXRvbmVnZW5fZnJlcV9ocHRlc3QgPSBjcHVfdG9fbGUxNihEQTcyMTlfQUFEX0hQVEVTVF9SQU1QX0ZSRVFfSU5UX09TQyk7CisKKwkvKiBFbnN1cmUgZ2FpbiByYW1waW5nIGF0IGZhc3Rlc3QgcmF0ZSAqLworCWdhaW5fcmFtcF9jdHJsID0gc25kX3NvY19yZWFkKGNvZGVjLCBEQTcyMTlfR0FJTl9SQU1QX0NUUkwpOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxOV9HQUlOX1JBTVBfQ1RSTCwgREE3MjE5X0dBSU5fUkFNUF9SQVRFX1g4KTsKKwogCS8qIEJ5cGFzcyBjYWNoZSBzbyBpdCBzYXZlcyBjdXJyZW50IHNldHRpbmdzICovCiAJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGRhNzIxOS0+cmVnbWFwLCB0cnVlKTsKIApAQCAtMTgzLDkgKzIwOSwxNSBAQAogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxOV9IUF9SX0NUUkwsCiAJCSAgICAgIERBNzIxOV9IUF9SX0FNUF9PRV9NQVNLIHwgREE3MjE5X0hQX1JfQU1QX0VOX01BU0spOwogCisJLyoKKwkgKiBJZiB3ZSdyZSBydW5uaW5nIGZyb20gdGhlIGludGVybmFsIG9zY2lsbGF0b3IgdGhlbiBnaXZlIGF1ZGlvIHBhdGhzCisJICogdGltZSB0byBzZXR0bGUgYmVmb3JlIHJ1bm5pbmcgdGVzdC4KKwkgKi8KKwlpZiAoIShwbGxfc3JtX3N0cyAmIERBNzIxOV9QTExfU1JNX1NUU19NQ0xLKSkKKwkJbXNsZWVwKERBNzIxOV9BQURfSFBURVNUX0lOVF9PU0NfUEFUSF9ERUxBWSk7CisKIAkvKiBDb25maWd1cmUgJiBzdGFydCBUb25lIEdlbmVyYXRvciAqLwogCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxOV9UT05FX0dFTl9PTl9QRVIsIERBNzIxOV9CRUVQX09OX1BFUl9NQVNLKTsKLQl0b25lZ2VuX2ZyZXFfaHB0ZXN0ID0gY3B1X3RvX2xlMTYoREE3MjE5X0FBRF9IUFRFU1RfUkFNUF9GUkVRKTsKIAlyZWdtYXBfcmF3X3dyaXRlKGRhNzIxOS0+cmVnbWFwLCBEQTcyMTlfVE9ORV9HRU5fRlJFUTFfTCwKIAkJCSAmdG9uZWdlbl9mcmVxX2hwdGVzdCwgc2l6ZW9mKHRvbmVnZW5fZnJlcV9ocHRlc3QpKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTlfVE9ORV9HRU5fQ0ZHMiwKQEAgLTI0NCwxMiArMjc2LDI2IEBACiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE5X0FDQ0RFVF9DT05GSUdfOCwKIAkJCSAgICBEQTcyMTlfSFBURVNUX0VOX01BU0ssIDApOwogCisJLyoKKwkgKiBJZiB3ZSdyZSBydW5uaW5nIGZyb20gdGhlIGludGVybmFsIG9zY2lsbGF0b3IgdGhlbiBnaXZlIGF1ZGlvIHBhdGhzCisJICogdGltZSB0byBzZXR0bGUgYmVmb3JlIGFsbG93aW5nIGhlYWRwaG9uZXMgdG8gYmUgZHJpdmVuIGFzIHJlcXVpcmVkLgorCSAqLworCWlmICghKHBsbF9zcm1fc3RzICYgREE3MjE5X1BMTF9TUk1fU1RTX01DTEspKQorCQltc2xlZXAoREE3MjE5X0FBRF9IUFRFU1RfSU5UX09TQ19QQVRIX0RFTEFZKTsKKworCS8qIFJlc3RvcmUgZ2FpbiByYW1waW5nIHJhdGUgKi8KKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBEQTcyMTlfR0FJTl9SQU1QX0NUUkwsIGdhaW5fcmFtcF9jdHJsKTsKKwogCS8qIERyaXZlIEhlYWRwaG9uZXMvbGluZW91dCAqLwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxOV9IUF9MX0NUUkwsIERBNzIxOV9IUF9MX0FNUF9PRV9NQVNLLAogCQkJICAgIERBNzIxOV9IUF9MX0FNUF9PRV9NQVNLKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBEQTcyMTlfSFBfUl9DVFJMLCBEQTcyMTlfSFBfUl9BTVBfT0VfTUFTSywKIAkJCSAgICBEQTcyMTlfSFBfUl9BTVBfT0VfTUFTSyk7CiAKKwkvKiBSZW1vdmUgTUNMSywgaWYgcHJldmlvdXNseSBlbmFibGVkICovCisJaWYgKGRhNzIxOS0+bWNsaykKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhNzIxOS0+bWNsayk7CisKIAltdXRleF91bmxvY2soJmRhNzIxOS0+bG9jayk7CiAJc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKIApAQCAtNzUxLDYgKzc5Nyw2MiBAQAogCiAKIC8qCisgKiBTdXNwZW5kL1Jlc3VtZQorICovCisKK3ZvaWQgZGE3MjE5X2FhZF9zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgZGE3MjE5X3ByaXYgKmRhNzIxOSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBkYTcyMTlfYWFkX3ByaXYgKmRhNzIxOV9hYWQgPSBkYTcyMTktPmFhZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKwl1OCBtaWNiaWFzX2N0cmw7CisKKwlpZiAoZGE3MjE5X2FhZC0+amFjaykgeworCQkvKiBEaXNhYmxlIGphY2sgZGV0ZWN0aW9uIGR1cmluZyBzdXNwZW5kICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxOV9BQ0NERVRfQ09ORklHXzEsCisJCQkJICAgIERBNzIxOV9BQ0NERVRfRU5fTUFTSywgMCk7CisKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBhIDQtcG9sZSBqYWNrIGluc2VydGVkLCB0aGVuIG1pY2JpYXMgd2lsbCBiZQorCQkgKiBlbmFibGVkLiBXZSBjYW4gZGlzYWJsZSBtaWNiaWFzIGhlcmUsIGFuZCBrZWVwIGEgbm90ZSB0bworCQkgKiByZS1lbmFibGUgaXQgb24gcmVzdW1lLiBJZiBqYWNrIHJlbW92YWwgb2NjdXJyZWQgZHVyaW5nCisJCSAqIHN1c3BlbmQgdGhlbiB0aGlzIHdpbGwgYmUgZGVhbHQgd2l0aCB0aHJvdWdoIHRoZSBJUlEgaGFuZGxlci4KKwkJICovCisJCWlmIChkYTcyMTlfYWFkLT5qYWNrX2luc2VydGVkKSB7CisJCQltaWNiaWFzX2N0cmwgPSBzbmRfc29jX3JlYWQoY29kZWMsIERBNzIxOV9NSUNCSUFTX0NUUkwpOworCQkJaWYgKG1pY2JpYXNfY3RybCAmIERBNzIxOV9NSUNCSUFTMV9FTl9NQVNLKSB7CisJCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgQmlhcyIpOworCQkJCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCQkJCWRhNzIxOV9hYWQtPm1pY2JpYXNfcmVzdW1lX2VuYWJsZSA9IHRydWU7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgZGE3MjE5X2FhZF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBkYTcyMTlfcHJpdiAqZGE3MjE5ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IGRhNzIxOV9hYWRfcHJpdiAqZGE3MjE5X2FhZCA9IGRhNzIxOS0+YWFkOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCisJaWYgKGRhNzIxOV9hYWQtPmphY2spIHsKKwkJLyogUmUtZW5hYmxlIG1pY2JpYXMgaWYgcHJldmlvdXNseSBlbmFibGVkIGZvciA0LXBvbGUgamFjayAqLworCQlpZiAoZGE3MjE5X2FhZC0+amFja19pbnNlcnRlZCAmJgorCQkgICAgZGE3MjE5X2FhZC0+bWljYmlhc19yZXN1bWVfZW5hYmxlKSB7CisJCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihkYXBtLCAiTWljIEJpYXMiKTsKKwkJCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCQkJZGE3MjE5X2FhZC0+bWljYmlhc19yZXN1bWVfZW5hYmxlID0gZmFsc2U7CisJCX0KKworCQkvKiBSZS1lbmFibGUgamFjayBkZXRlY3Rpb24gKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE5X0FDQ0RFVF9DT05GSUdfMSwKKwkJCQkgICAgREE3MjE5X0FDQ0RFVF9FTl9NQVNLLAorCQkJCSAgICBEQTcyMTlfQUNDREVUX0VOX01BU0spOworCX0KK30KKworCisvKgogICogSW5pdC9FeGl0CiAgKi8KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTktYWFkLmggYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS1hYWQuaAppbmRleCA0ZmNjZjY3Li4xMTdhM2Q3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS1hYWQuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS1hYWQuaApAQCAtMTc2LDggKzE3NiwxMCBAQAogI2RlZmluZSBEQTcyMTlfQUFEX01JQ0JJQVNfQ0hLX0RFTEFZCTEwCiAjZGVmaW5lIERBNzIxOV9BQURfTUlDQklBU19DSEtfUkVUUklFUwk1CiAKLSNkZWZpbmUgREE3MjE5X0FBRF9IUFRFU1RfUkFNUF9GUkVRCTB4MjgKLSNkZWZpbmUgREE3MjE5X0FBRF9IUFRFU1RfUEVSSU9ECTY1CisjZGVmaW5lIERBNzIxOV9BQURfSFBURVNUX1JBTVBfRlJFUQkJMHgyOAorI2RlZmluZSBEQTcyMTlfQUFEX0hQVEVTVF9SQU1QX0ZSRVFfSU5UX09TQwkweDRECisjZGVmaW5lIERBNzIxOV9BQURfSFBURVNUX1BFUklPRAkJNjUKKyNkZWZpbmUgREE3MjE5X0FBRF9IUFRFU1RfSU5UX09TQ19QQVRIX0RFTEFZCTIwCiAKIGVudW0gZGE3MjE5X2FhZF9ldmVudF9yZWdzIHsKIAlEQTcyMTlfQUFEX0lSUV9SRUdfQSA9IDAsCkBAIC0xOTksMTIgKzIwMSwxNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCBocHRlc3Rfd29yazsKIAogCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2s7CisJYm9vbCBtaWNiaWFzX3Jlc3VtZV9lbmFibGU7CiAJYm9vbCBqYWNrX2luc2VydGVkOwogfTsKIAogLyogQUFEIGNvbnRyb2wgKi8KIHZvaWQgZGE3MjE5X2FhZF9qYWNrX2RldChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHN0cnVjdCBzbmRfc29jX2phY2sgKmphY2spOwogCisvKiBTdXNwZW5kL1Jlc3VtZSAqLwordm9pZCBkYTcyMTlfYWFkX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKK3ZvaWQgZGE3MjE5X2FhZF9yZXN1bWUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKTsKKwogLyogSW5pdC9FeGl0ICovCiBpbnQgZGE3MjE5X2FhZF9pbml0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CiB2b2lkIGRhNzIxOV9hYWRfZXhpdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTkuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LmMKaW5kZXggNTBlYTk0My4uMTE1MmFhNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTcyMTkuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS5jCkBAIC04MDEsNyArODAxLDcgQEAKIAkJCQkrK2k7CiAJCQkJbXNsZWVwKDUwKTsKIAkJCX0KLQkJfSB3aGlsZSAoKGkgPCBEQTcyMTlfU1JNX0NIRUNLX1JFVFJJRVMpICYgKCFzcm1fbG9jaykpOworCQl9IHdoaWxlICgoaSA8IERBNzIxOV9TUk1fQ0hFQ0tfUkVUUklFUykgJiYgKCFzcm1fbG9jaykpOwogCiAJCWlmICghc3JtX2xvY2spCiAJCQlkZXZfd2Fybihjb2RlYy0+ZGV2LCAiU1JNIGZhaWxlZCB0byBsb2NrXG4iKTsKQEAgLTE0ODIsNiArMTQ4Miw4IEBACiAJaWYgKCFwZGF0YSkKIAkJcmV0dXJuIE5VTEw7CiAKKwlwZGF0YS0+d2FrZXVwX3NvdXJjZSA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX2Jvb2woZGV2LCAid2FrZXVwLXNvdXJjZSIpOworCiAJaWYgKGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJkbGcsbWljYmlhcy1sdmwiLCAmb2ZfdmFsMzIpID49IDApCiAJCXBkYXRhLT5taWNiaWFzX2x2bCA9IGRhNzIxOV9md19taWNiaWFzX2x2bChkZXYsIG9mX3ZhbDMyKTsKIAllbHNlCkBAIC0xNTA4LDExICsxNTEwLDEwIEBACiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBTTkRfU09DX0JJQVNfT046Ci0JY2FzZSBTTkRfU09DX0JJQVNfUFJFUEFSRToKIAkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19PRkYpIHsKLQkJCS8qIE1DTEsgKi8KKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQkvKiBFbmFibGUgTUNMSyBmb3IgdHJhbnNpdGlvbiB0byBPTiBzdGF0ZSAqLworCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX1NUQU5EQlkpIHsKIAkJCWlmIChkYTcyMTktPm1jbGspIHsKIAkJCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGE3MjE5LT5tY2xrKTsKIAkJCQlpZiAocmV0KSB7CkBAIC0xNTIxLDIyICsxNTIyLDI4IEBACiAJCQkJCXJldHVybiByZXQ7CiAJCQkJfQogCQkJfQorCQl9CiAKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19PRkYpCiAJCQkvKiBNYXN0ZXIgYmlhcyAqLwogCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgREE3MjE5X1JFRkVSRU5DRVMsCiAJCQkJCSAgICBEQTcyMTlfQklBU19FTl9NQVNLLAogCQkJCQkgICAgREE3MjE5X0JJQVNfRU5fTUFTSyk7CisKKwkJaWYgKHNuZF9zb2NfY29kZWNfZ2V0X2JpYXNfbGV2ZWwoY29kZWMpID09IFNORF9TT0NfQklBU19QUkVQQVJFKSB7CisJCQkvKiBSZW1vdmUgTUNMSyAqLworCQkJaWYgKGRhNzIxOS0+bWNsaykKKwkJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGE3MjE5LT5tY2xrKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6Ci0JCS8qIE9ubHkgZGlzYWJsZSBtYXN0ZXIgYmlhcyBpZiBqYWNrIGRldGVjdGlvbiBub3QgYWN0aXZlICovCi0JCWlmICghZGE3MjE5LT5hYWQtPmphY2spCisJCS8qIE9ubHkgZGlzYWJsZSBtYXN0ZXIgYmlhcyBpZiB3ZSdyZSBub3QgYSB3YWtlLXVwIHNvdXJjZSAqLworCQlpZiAoIWRhNzIxOS0+d2FrZXVwX3NvdXJjZSkKIAkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIERBNzIxOV9SRUZFUkVOQ0VTLAogCQkJCQkgICAgREE3MjE5X0JJQVNfRU5fTUFTSywgMCk7CiAKLQkJLyogTUNMSyAqLwotCQlpZiAoZGE3MjE5LT5tY2xrKQotCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhNzIxOS0+bWNsayk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTU5OSw2ICsxNjA2LDggQEAKIAlpZiAocGRhdGEpIHsKIAkJdTggbWljYmlhc19sdmwgPSAwOwogCisJCWRhNzIxOS0+d2FrZXVwX3NvdXJjZSA9IHBkYXRhLT53YWtldXBfc291cmNlOworCiAJCS8qIE1pYyBCaWFzIHZvbHRhZ2VzICovCiAJCXN3aXRjaCAocGRhdGEtPm1pY2JpYXNfbHZsKSB7CiAJCWNhc2UgREE3MjE5X01JQ0JJQVNfMV82VjoKQEAgLTE3MzMsMTEgKzE3NDIsMTEgQEAKIHsKIAlzdHJ1Y3QgZGE3MjE5X3ByaXYgKmRhNzIxOSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0Jc25kX3NvY19jb2RlY19mb3JjZV9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKKwkvKiBTdXNwZW5kIEFBRCBpZiB3ZSdyZSBub3QgYSB3YWtlLXVwIHNvdXJjZSAqLworCWlmICghZGE3MjE5LT53YWtldXBfc291cmNlKQorCQlkYTcyMTlfYWFkX3N1c3BlbmQoY29kZWMpOwogCi0JLyogUHV0IGRldmljZSBpbnRvIHN0YW5kYnkgbW9kZSBpZiBqYWNrIGRldGVjdGlvbiBkaXNhYmxlZCAqLwotCWlmICghZGE3MjE5LT5hYWQtPmphY2spCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIERBNzIxOV9TWVNURU1fQUNUSVZFLCAwKTsKKwlzbmRfc29jX2NvZGVjX2ZvcmNlX2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19PRkYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNzQ2LDEzICsxNzU1LDEyIEBACiB7CiAJc3RydWN0IGRhNzIxOV9wcml2ICpkYTcyMTkgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAotCS8qIFB1dCBkZXZpY2UgaW50byBhY3RpdmUgbW9kZSBpZiBwcmV2aW91c2x5IHB1c2hlZCB0byBzdGFuZGJ5ICovCi0JaWYgKCFkYTcyMTktPmFhZC0+amFjaykKLQkJc25kX3NvY193cml0ZShjb2RlYywgREE3MjE5X1NZU1RFTV9BQ1RJVkUsCi0JCQkgICAgICBEQTcyMTlfU1lTVEVNX0FDVElWRV9NQVNLKTsKLQogCXNuZF9zb2NfY29kZWNfZm9yY2VfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwogCisJLyogUmVzdW1lIEFBRCBpZiBwcmV2aW91c2x5IHN1c3BlbmRlZCAqLworCWlmICghZGE3MjE5LT53YWtldXBfc291cmNlKQorCQlkYTcyMTlfYWFkX3Jlc3VtZShjb2RlYyk7CisKIAlyZXR1cm4gMDsKIH0KICNlbHNlCkBAIC0xNzY3LDEzICsxNzc1LDE0IEBACiAJLnJlc3VtZQkJCT0gZGE3MjE5X3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwJCT0gZGE3MjE5X3NldF9iaWFzX2xldmVsLAogCi0JLmNvbnRyb2xzCQk9IGRhNzIxOV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhNzIxOV9zbmRfY29udHJvbHMpLAotCi0JLmRhcG1fd2lkZ2V0cwkJPSBkYTcyMTlfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTcyMTlfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gZGE3MjE5X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTcyMTlfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGRhNzIxOV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTcyMTlfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkYTcyMTlfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGE3MjE5X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBkYTcyMTlfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTcyMTlfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogCkBAIC0xOTIxLDcgKzE5MzAsOCBAQAogCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZGE3MjE5X3ByaXYgKmRhNzIxOTsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGludCBzeXN0ZW1fYWN0aXZlLCBzeXN0ZW1fc3RhdHVzOworCWludCBpLCByZXQ7CiAKIAlkYTcyMTkgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2Yoc3RydWN0IGRhNzIxOV9wcml2KSwKIAkJCSAgICAgIEdGUF9LRVJORUwpOwpAQCAtMTkzNyw2ICsxOTQ3LDM3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCisJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGRhNzIxOS0+cmVnbWFwLCB0cnVlKTsKKworCS8qIERpc2FibGUgYXVkaW8gcGF0aHMgaWYgc3RpbGwgYWN0aXZlIGZyb20gcHJldmlvdXMgc3RhcnQgKi8KKwlyZWdtYXBfcmVhZChkYTcyMTktPnJlZ21hcCwgREE3MjE5X1NZU1RFTV9BQ1RJVkUsICZzeXN0ZW1fYWN0aXZlKTsKKwlpZiAoc3lzdGVtX2FjdGl2ZSkgeworCQlyZWdtYXBfd3JpdGUoZGE3MjE5LT5yZWdtYXAsIERBNzIxOV9HQUlOX1JBTVBfQ1RSTCwKKwkJCSAgICAgREE3MjE5X0dBSU5fUkFNUF9SQVRFX05PTUlOQUwpOworCQlyZWdtYXBfd3JpdGUoZGE3MjE5LT5yZWdtYXAsIERBNzIxOV9TWVNURU1fTU9ERVNfSU5QVVQsIDB4MDApOworCQlyZWdtYXBfd3JpdGUoZGE3MjE5LT5yZWdtYXAsIERBNzIxOV9TWVNURU1fTU9ERVNfT1VUUFVULCAweDAxKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgREE3MjE5X1NZU19TVEFUX0NIRUNLX1JFVFJJRVM7ICsraSkgeworCQkJcmVnbWFwX3JlYWQoZGE3MjE5LT5yZWdtYXAsIERBNzIxOV9TWVNURU1fU1RBVFVTLAorCQkJCSAgICAmc3lzdGVtX3N0YXR1cyk7CisJCQlpZiAoIXN5c3RlbV9zdGF0dXMpCisJCQkJYnJlYWs7CisKKwkJCW1zbGVlcChEQTcyMTlfU1lTX1NUQVRfQ0hFQ0tfREVMQVkpOworCQl9CisJfQorCisJLyogU29mdCByZXNldCBjb2RlYyAqLworCXJlZ21hcF93cml0ZV9iaXRzKGRhNzIxOS0+cmVnbWFwLCBEQTcyMTlfQUNDREVUX0NPTkZJR18xLAorCQkJICBEQTcyMTlfQUNDREVUX0VOX01BU0ssIDApOworCXJlZ21hcF93cml0ZV9iaXRzKGRhNzIxOS0+cmVnbWFwLCBEQTcyMTlfQ0lGX0NUUkwsCisJCQkgIERBNzIxOV9DSUZfUkVHX1NPRlRfUkVTRVRfTUFTSywKKwkJCSAgREE3MjE5X0NJRl9SRUdfU09GVF9SRVNFVF9NQVNLKTsKKwlyZWdtYXBfd3JpdGVfYml0cyhkYTcyMTktPnJlZ21hcCwgREE3MjE5X1NZU1RFTV9BQ1RJVkUsCisJCQkgIERBNzIxOV9TWVNURU1fQUNUSVZFX01BU0ssIDApOworCisJcmVnY2FjaGVfY2FjaGVfYnlwYXNzKGRhNzIxOS0+cmVnbWFwLCBmYWxzZSk7CisKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwgJnNvY19jb2RlY19kZXZfZGE3MjE5LAogCQkJCSAgICAgJmRhNzIxOV9kYWksIDEpOwogCWlmIChyZXQgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS5oIGIvc291bmQvc29jL2NvZGVjcy9kYTcyMTkuaAppbmRleCBmZjJhMmYwLi42NmQzYmFkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzIxOS5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MjE5LmgKQEAgLTIyNCw2ICsyMjQsNyBAQAogI2RlZmluZSBEQTcyMTlfUExMX1NSTV9TVEFURV9NQVNLCSgweEYgPDwgMCkKICNkZWZpbmUgREE3MjE5X1BMTF9TUk1fU1RBVFVTX1NISUZUCTQKICNkZWZpbmUgREE3MjE5X1BMTF9TUk1fU1RBVFVTX01BU0sJKDB4RiA8PCA0KQorI2RlZmluZSBEQTcyMTlfUExMX1NSTV9TVFNfTUNMSwkJKDB4MSA8PCA0KQogI2RlZmluZSBEQTcyMTlfUExMX1NSTV9TVFNfU1JNX0xPQ0sJKDB4MSA8PCA3KQogCiAvKiBEQTcyMTlfRElHX1JPVVRJTkdfREFJID0gMHgyQSAqLwpAQCAtNTc2LDYgKzU3Nyw4IEBACiAvKiBEQTcyMTlfR0FJTl9SQU1QX0NUUkwgPSAweDkyICovCiAjZGVmaW5lIERBNzIxOV9HQUlOX1JBTVBfUkFURV9TSElGVAkwCiAjZGVmaW5lIERBNzIxOV9HQUlOX1JBTVBfUkFURV9NQVNLCSgweDMgPDwgMCkKKyNkZWZpbmUgREE3MjE5X0dBSU5fUkFNUF9SQVRFX1g4CSgweDAgPDwgMCkKKyNkZWZpbmUgREE3MjE5X0dBSU5fUkFNUF9SQVRFX05PTUlOQUwJKDB4MSA8PCAwKQogI2RlZmluZSBEQTcyMTlfR0FJTl9SQU1QX1JBVEVfTUFYCTQKIAogLyogREE3MjE5X1BDX0NPVU5UID0gMHg5NCAqLwpAQCAtNzcwLDYgKzc3MywxMCBAQAogLyogU1JNICovCiAjZGVmaW5lIERBNzIxOV9TUk1fQ0hFQ0tfUkVUUklFUwk4CiAKKy8qIFN5c3RlbSBDb250cm9sbGVyICovCisjZGVmaW5lIERBNzIxOV9TWVNfU1RBVF9DSEVDS19SRVRSSUVTCTYKKyNkZWZpbmUgREE3MjE5X1NZU19TVEFUX0NIRUNLX0RFTEFZCTUwCisKIGVudW0gZGE3MjE5X2Nsa19zcmMgewogCURBNzIxOV9DTEtTUkNfTUNMSyA9IDAsCiAJREE3MjE5X0NMS1NSQ19NQ0xLX1NRUiwKQEAgLTc5Niw2ICs4MDMsNyBAQAogCXN0cnVjdCBkYTcyMTlfYWFkX3ByaXYgKmFhZDsKIAlzdHJ1Y3QgZGE3MjE5X3BkYXRhICpwZGF0YTsKIAorCWJvb2wgd2FrZXVwX3NvdXJjZTsKIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tEQTcyMTlfTlVNX1NVUFBMSUVTXTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJc3RydWN0IG11dGV4IGxvY2s7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jIGIvc291bmQvc29jL2NvZGVjcy9kYTczMnguYwppbmRleCA0NjE1MDZhLi5jMWNjMWMxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MzJ4LmMKQEAgLTE1MDEsMTIgKzE1MDEsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X2RhNzMyeCA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwJCT0gZGE3MzJ4X3NldF9iaWFzX2xldmVsLAotCS5jb250cm9scwkJPSBkYTczMnhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTczMnhfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCQk9IGRhNzMyeF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhNzMyeF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBkYTczMnhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZGE3MzJ4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGRhNzMyeF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTczMnhfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkYTczMnhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGE3MzJ4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBkYTczMnhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGRhNzMyeF9kYXBtX3JvdXRlcyksCisJfSwKIAkuc2V0X3BsbAkJPSBkYTczMnhfc2V0X2RhaV9wbGwsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2RhOTA1NS5jIGIvc291bmQvc29jL2NvZGVjcy9kYTkwNTUuYwppbmRleCAwYjJlZGU4Li40ZWZiNWY4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RhOTA1NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE5MDU1LmMKQEAgLTE0NTUsMTMgKzE0NTUsMTQgQEAKIAkucHJvYmUJCQk9IGRhOTA1NV9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwJCT0gZGE5MDU1X3NldF9iaWFzX2xldmVsLAogCi0JLmNvbnRyb2xzCQk9IGRhOTA1NV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGRhOTA1NV9zbmRfY29udHJvbHMpLAotCi0JLmRhcG1fd2lkZ2V0cwkJPSBkYTkwNTVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShkYTkwNTVfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gZGE5MDU1X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTkwNTVfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGRhOTA1NV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYTkwNTVfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkYTkwNTVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGE5MDU1X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBkYTkwNTVfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShkYTkwNTVfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGRhOTA1NV9yZWdtYXBfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kbWljLmMgYi9zb3VuZC9zb2MvY29kZWNzL2RtaWMuYwppbmRleCBmZGU1MzI1Li5jODJiOWRjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2RtaWMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RtaWMuYwpAQCAtNTEsMTAgKzUxLDEyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19kbWljID0gewotCS5kYXBtX3dpZGdldHMgPSBkbWljX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZG1pY19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBkbWljX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRtaWNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShpbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgZG1pY19kZXZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvZXM4MzI4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2VzODMyOC5jCmluZGV4IDIwODZkNzEuLjM3NzIyMTk0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2VzODMyOC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvZXM4MzI4LmMKQEAgLTgyMywxMiArODIzLDE0IEBACiAJLnNldF9iaWFzX2xldmVsCSAgPSBlczgzMjhfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzCSAgPSBlczgzMjhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJICA9IEFSUkFZX1NJWkUoZXM4MzI4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkgID0gZXM4MzI4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoZXM4MzI4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCSAgPSBlczgzMjhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyAgPSBBUlJBWV9TSVpFKGVzODMyOF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBlczgzMjhfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoZXM4MzI4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gZXM4MzI4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGVzODMyOF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gZXM4MzI4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShlczgzMjhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBpbnQgZXM4MzI4X3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJlZ21hcCAqcmVnbWFwKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ndG02MDEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvZ3RtNjAxLmMKaW5kZXggMGI4MDA1Mi4uOTI2YjFhNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ndG02MDEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2d0bTYwMS5jCkBAIC01MiwxMCArNTIsMTIgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9ndG02MDEgPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IGd0bTYwMV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGd0bTYwMV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGd0bTYwMV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShndG02MDFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGd0bTYwMV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShndG02MDFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGd0bTYwMV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZ3RtNjAxX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBndG02MDFfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvaGRhY19oZG1pLmMgYi9zb3VuZC9zb2MvY29kZWNzL2hkYWNfaGRtaS5jCmluZGV4IDRlMTgxYjIuLmM2MDJjNDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvaGRhY19oZG1pLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9oZGFjX2hkbWkuYwpAQCAtNjE0LDcgKzYxNCw3IEBACiAJCQkoIXBpbi0+ZWxkLmVsZF92YWxpZCkpIHsKIAogCQlkZXZfd2FybigmaGRhYy0+aGRhYy5kZXYsCi0JCQkiRmFpbGVkOiBtb250aW9yIHByZXNlbnQ/ICVkIEVMRCB2YWxpZD86ICVkIGZvciBwaW46ICVkXG4iLAorCQkJIkZhaWxlZDogbW9uaXRvciBwcmVzZW50PyAlZCBFTEQgdmFsaWQ/OiAlZCBmb3IgcGluOiAlZFxuIiwKIAkJCXBpbi0+ZWxkLm1vbml0b3JfcHJlc2VudCwgcGluLT5lbGQuZWxkX3ZhbGlkLCBwaW4tPm5pZCk7CiAKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2hkbWktY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvaGRtaS1jb2RlYy5jCmluZGV4IGYyN2QxMTUuLmI5MDQ0OTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvaGRtaS1jb2RlYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvaGRtaS1jb2RlYy5jCkBAIC0yNCw2ICsyNCwxNSBAQAogCiAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+IC8qIFRoaXMgaXMgb25seSB0byBnZXQgTUFYX0VMRF9CWVRFUyAqLwogCitzdHJ1Y3QgaGRtaV9kZXZpY2UgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJaW50IGNudDsKK307CisjZGVmaW5lIHBvc190b19oZG1pX2RldmljZShwb3MpCWNvbnRhaW5lcl9vZigocG9zKSwgc3RydWN0IGhkbWlfZGV2aWNlLCBsaXN0KQorTElTVF9IRUFEKGhkbWlfZGV2aWNlX2xpc3QpOworCisjZGVmaW5lIERBSV9OQU1FX1NJWkUgMTYKIHN0cnVjdCBoZG1pX2NvZGVjX3ByaXYgewogCXN0cnVjdCBoZG1pX2NvZGVjX3BkYXRhIGhjZDsKIAlzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyICpkYWlkcnY7CkBAIC0zMjAsNyArMzI5LDYgQEAKIAkJCSBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0JFKQogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBoZG1pX2kyc19kYWkgPSB7Ci0JLm5hbWUgPSAiaTJzLWhpZmkiLAogCS5pZCA9IERBSV9JRF9JMlMsCiAJLnBsYXliYWNrID0gewogCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLApAQCAtMzM0LDcgKzM0Miw2IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBoZG1pX3NwZGlmX2RhaSA9IHsKLQkubmFtZSA9ICJzcGRpZi1oaWZpIiwKIAkuaWQgPSBEQUlfSURfU1BESUYsCiAJLnBsYXliYWNrID0gewogCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLApAQCAtMzQ2LDEzICszNTMsMzcgQEAKIAkub3BzID0gJmhkbWlfZGFpX29wcywKIH07CiAKK3N0YXRpYyBjaGFyIGhkbWlfZGFpX25hbWVbXVtEQUlfTkFNRV9TSVpFXSA9IHsKKwkiaGRtaS1oaWZpLjAiLAorCSJoZG1pLWhpZmkuMSIsCisJImhkbWktaGlmaS4yIiwKKwkiaGRtaS1oaWZpLjMiLAorfTsKKworc3RhdGljIGludCBoZG1pX29mX3hsYXRlX2RhaV9uYW1lKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50LAorCQkJCSAgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncywKKwkJCQkgIGNvbnN0IGNoYXIgKipkYWlfbmFtZSkKK3sKKwlpbnQgaWQgPSBhcmdzLT5hcmdzWzBdOworCisJaWYgKGlkIDwgQVJSQVlfU0laRShoZG1pX2RhaV9uYW1lKSkgeworCQkqZGFpX25hbWUgPSBoZG1pX2RhaV9uYW1lW2lkXTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FQUdBSU47Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgaGRtaV9jb2RlYyA9IHsKLQkuY29udHJvbHMgPSBoZG1pX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGhkbWlfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBoZG1pX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGhkbWlfd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gaGRtaV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaGRtaV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gaGRtaV9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGhkbWlfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGhkbWlfd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGhkbWlfd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBoZG1pX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoaGRtaV9yb3V0ZXMpLAorCQkub2ZfeGxhdGVfZGFpX25hbWUJPSBoZG1pX29mX3hsYXRlX2RhaV9uYW1lLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IGhkbWlfY29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTM2MCw2ICszOTEsOCBAQAogCXN0cnVjdCBoZG1pX2NvZGVjX3BkYXRhICpoY2QgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCXN0cnVjdCBoZG1pX2NvZGVjX3ByaXYgKmhjcDsKKwlzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKIAlpbnQgZGFpX2NvdW50LCBpID0gMDsKIAlpbnQgcmV0OwogCkBAIC0zODEsNiArNDE0LDMxIEBACiAJaWYgKCFoY3ApCiAJCXJldHVybiAtRU5PTUVNOwogCisJaGQgPSBOVUxMOworCWxpc3RfZm9yX2VhY2gocG9zLCAmaGRtaV9kZXZpY2VfbGlzdCkgeworCQlzdHJ1Y3QgaGRtaV9kZXZpY2UgKnRtcCA9IHBvc190b19oZG1pX2RldmljZShwb3MpOworCisJCWlmICh0bXAtPmRldiA9PSBkZXYtPnBhcmVudCkgeworCQkJaGQgPSB0bXA7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghaGQpIHsKKwkJaGQgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhkKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaGQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQloZC0+ZGV2ID0gZGV2LT5wYXJlbnQ7CisKKwkJbGlzdF9hZGRfdGFpbCgmaGQtPmxpc3QsICZoZG1pX2RldmljZV9saXN0KTsKKwl9CisKKwlpZiAoaGQtPmNudCA+PSBBUlJBWV9TSVpFKGhkbWlfZGFpX25hbWUpKSB7CisJCWRldl9lcnIoZGV2LCAidG9vIG1hbnkgaGRtaSBjb2RlYyBhcmUgZGV0ZWNlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWhjcC0+aGNkID0gKmhjZDsKIAltdXRleF9pbml0KCZoY3AtPmN1cnJlbnRfc3RyZWFtX2xvY2spOwogCkBAIC0zOTMsMTEgKzQ1MSwxNCBAQAogCQloY3AtPmRhaWRydltpXSA9IGhkbWlfaTJzX2RhaTsKIAkJaGNwLT5kYWlkcnZbaV0ucGxheWJhY2suY2hhbm5lbHNfbWF4ID0KIAkJCWhjZC0+bWF4X2kyc19jaGFubmVsczsKKwkJaGNwLT5kYWlkcnZbaV0ubmFtZSA9IGhkbWlfZGFpX25hbWVbaGQtPmNudCsrXTsKIAkJaSsrOwogCX0KIAotCWlmIChoY2QtPnNwZGlmKQorCWlmIChoY2QtPnNwZGlmKSB7CiAJCWhjcC0+ZGFpZHJ2W2ldID0gaGRtaV9zcGRpZl9kYWk7CisJCWhjcC0+ZGFpZHJ2W2ldLm5hbWUgPSBoZG1pX2RhaV9uYW1lW2hkLT5jbnQrK107CisJfQogCiAJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYyhkZXYsICZoZG1pX2NvZGVjLCBoY3AtPmRhaWRydiwKIAkJCQkgICAgIGRhaV9jb3VudCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2lubm9fcmszMDM2LmMgYi9zb3VuZC9zb2MvY29kZWNzL2lubm9fcmszMDM2LmMKaW5kZXggOWI2ZTg4NC4uYjkxOGJhNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9pbm5vX3JrMzAzNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvaW5ub19yazMwMzYuYwpAQCAtMzgwLDEyICszODAsMTQgQEAKIAkucHJvYmUJCQk9IHJrMzAzNl9jb2RlY19wcm9iZSwKIAkucmVtb3ZlCQkJPSByazMwMzZfY29kZWNfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbAkJPSByazMwMzZfY29kZWNfc2V0X2JpYXNfbGV2ZWwsCi0JLmNvbnRyb2xzCQk9IHJrMzAzNl9jb2RlY19kYXBtX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShyazMwMzZfY29kZWNfZGFwbV9jb250cm9scyksCi0JLmRhcG1fcm91dGVzCQk9IHJrMzAzNl9jb2RlY19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShyazMwMzZfY29kZWNfZGFwbV9yb3V0ZXMpLAotCS5kYXBtX3dpZGdldHMJCT0gcmszMDM2X2NvZGVjX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocmszMDM2X2NvZGVjX2RhcG1fd2lkZ2V0cyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSByazMwMzZfY29kZWNfZGFwbV9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJrMzAzNl9jb2RlY19kYXBtX2NvbnRyb2xzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJrMzAzNl9jb2RlY19kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocmszMDM2X2NvZGVjX2RhcG1fcm91dGVzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSByazMwMzZfY29kZWNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocmszMDM2X2NvZGVjX2RhcG1fd2lkZ2V0cyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyByazMwMzZfY29kZWNfcmVnbWFwX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvaXNhYmVsbGUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvaXNhYmVsbGUuYwppbmRleCBiZTQ0ODM3Li5hNGIwZWRlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2lzYWJlbGxlLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9pc2FiZWxsZS5jCkBAIC0xMDg5LDEyICsxMDg5LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9pc2FiZWxsZSA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwgPSBpc2FiZWxsZV9zZXRfYmlhc19sZXZlbCwKLQkuY29udHJvbHMgPSBpc2FiZWxsZV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoaXNhYmVsbGVfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gaXNhYmVsbGVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShpc2FiZWxsZV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGlzYWJlbGxlX2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGlzYWJlbGxlX2ludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGlzYWJlbGxlX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGlzYWJlbGxlX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gaXNhYmVsbGVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoaXNhYmVsbGVfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGlzYWJlbGxlX2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShpc2FiZWxsZV9pbnRlcmNvbiksCisJfSwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2p6NDc0MC5jIGIvc291bmQvc29jL2NvZGVjcy9qejQ3NDAuYwppbmRleCAxZjVhYjk5Li4wMjkwZmFiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2p6NDc0MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvano0NzQwLmMKQEAgLTI5OCwxMiArMjk4LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gano0NzQwX2NvZGVjX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IGp6NDc0MF9jb2RlY19jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShqejQ3NDBfY29kZWNfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBqejQ3NDBfY29kZWNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShqejQ3NDBfY29kZWNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBqejQ3NDBfY29kZWNfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoano0NzQwX2NvZGVjX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGp6NDc0MF9jb2RlY19jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGp6NDc0MF9jb2RlY19jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gano0NzQwX2NvZGVjX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGp6NDc0MF9jb2RlY19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gano0NzQwX2NvZGVjX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShqejQ3NDBfY29kZWNfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgano0NzQwX2NvZGVjX3JlZ21hcF9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2wzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2wzLmMKaW5kZXggNTM1M2FmNS4uYTEwZWEzYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9sMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbDMuYwpAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSA8c291bmQvbDMuaD4KIApAQCAtMzIsMTEgKzM0LDExIEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWFkYXAtPnNldGNsaygwKTsKKwkJYWRhcC0+c2V0Y2xrKGFkYXAsIDApOwogCQl1ZGVsYXkoYWRhcC0+ZGF0YV9ob2xkKTsKLQkJYWRhcC0+c2V0ZGF0KGJ5dGUgJiAxKTsKKwkJYWRhcC0+c2V0ZGF0KGFkYXAsIGJ5dGUgJiAxKTsKIAkJdWRlbGF5KGFkYXAtPmRhdGFfc2V0dXApOwotCQlhZGFwLT5zZXRjbGsoMSk7CisJCWFkYXAtPnNldGNsayhhZGFwLCAxKTsKIAkJdWRlbGF5KGFkYXAtPmNsb2NrX2hpZ2gpOwogCQlieXRlID4+PSAxOwogCX0KQEAgLTU1LDEwICs1NywxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogCQlpZiAoaSkgewogCQkJdWRlbGF5KGFkYXAtPm1vZGVfaG9sZCk7Ci0JCQlhZGFwLT5zZXRtb2RlKDApOworCQkJYWRhcC0+c2V0bW9kZShhZGFwLCAwKTsKIAkJCXVkZWxheShhZGFwLT5tb2RlKTsKIAkJfQotCQlhZGFwLT5zZXRtb2RlKDEpOworCQlhZGFwLT5zZXRtb2RlKGFkYXAsIDEpOwogCQl1ZGVsYXkoYWRhcC0+bW9kZV9zZXR1cCk7CiAJCXNlbmRieXRlKGFkYXAsIGJ1ZltpXSk7CiAJfQpAQCAtNjYsMjYgKzY4LDcxIEBACiAKIGludCBsM193cml0ZShzdHJ1Y3QgbDNfcGlucyAqYWRhcCwgdTggYWRkciwgdTggKmRhdGEsIGludCBsZW4pCiB7Ci0JYWRhcC0+c2V0Y2xrKDEpOwotCWFkYXAtPnNldGRhdCgxKTsKLQlhZGFwLT5zZXRtb2RlKDEpOworCWFkYXAtPnNldGNsayhhZGFwLCAxKTsKKwlhZGFwLT5zZXRkYXQoYWRhcCwgMSk7CisJYWRhcC0+c2V0bW9kZShhZGFwLCAxKTsKIAl1ZGVsYXkoYWRhcC0+bW9kZSk7CiAKLQlhZGFwLT5zZXRtb2RlKDApOworCWFkYXAtPnNldG1vZGUoYWRhcCwgMCk7CiAJdWRlbGF5KGFkYXAtPm1vZGVfc2V0dXApOwogCXNlbmRieXRlKGFkYXAsIGFkZHIpOwogCXVkZWxheShhZGFwLT5tb2RlX2hvbGQpOwogCiAJc2VuZGJ5dGVzKGFkYXAsIGRhdGEsIGxlbik7CiAKLQlhZGFwLT5zZXRjbGsoMSk7Ci0JYWRhcC0+c2V0ZGF0KDEpOwotCWFkYXAtPnNldG1vZGUoMCk7CisJYWRhcC0+c2V0Y2xrKGFkYXAsIDEpOworCWFkYXAtPnNldGRhdChhZGFwLCAxKTsKKwlhZGFwLT5zZXRtb2RlKGFkYXAsIDApOwogCiAJcmV0dXJuIGxlbjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGwzX3dyaXRlKTsKIAorCitzdGF0aWMgdm9pZCBsM19zZXRfY2xrKHN0cnVjdCBsM19waW5zICphZGFwLCBpbnQgdmFsKQoreworCWdwaW9fc2V0X3ZhbHVlKGFkYXAtPmdwaW9fY2xrLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBsM19zZXRfZGF0YShzdHJ1Y3QgbDNfcGlucyAqYWRhcCwgaW50IHZhbCkKK3sKKwlncGlvX3NldF92YWx1ZShhZGFwLT5ncGlvX2RhdGEsIHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGwzX3NldF9tb2RlKHN0cnVjdCBsM19waW5zICphZGFwLCBpbnQgdmFsKQoreworCWdwaW9fc2V0X3ZhbHVlKGFkYXAtPmdwaW9fbW9kZSwgdmFsKTsKK30KKworaW50IGwzX3NldF9ncGlvX29wcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBsM19waW5zICphZGFwKQoreworCWludCByZXQ7CisKKwlpZiAoIWFkYXAtPnVzZV9ncGlvcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoZGV2LCBhZGFwLT5ncGlvX2RhdGEsCisJCQkJR1BJT0ZfT1VUX0lOSVRfTE9XLCAibDNfZGF0YSIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWFkYXAtPnNldGRhdCA9IGwzX3NldF9kYXRhOworCisJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKGRldiwgYWRhcC0+Z3Bpb19jbGssCisJCQkJR1BJT0ZfT1VUX0lOSVRfTE9XLCAibDNfY2xrIik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJYWRhcC0+c2V0Y2xrID0gbDNfc2V0X2NsazsKKworCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZShkZXYsIGFkYXAtPmdwaW9fbW9kZSwKKwkJCQlHUElPRl9PVVRfSU5JVF9MT1csICJsM19tb2RlIik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJYWRhcC0+c2V0bW9kZSA9IGwzX3NldF9tb2RlOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsM19zZXRfZ3Bpb19vcHMpOworCiBNT0RVTEVfREVTQ1JJUFRJT04oIkwzIGJpdC1iYW5naW5nIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiQ2hyaXN0aWFuIFBlbGxlZ3JpbiA8Y2hyaXBlbGxAZXZvbHdhcmUub3JnPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9sbTQ5NDUzLmMgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYwppbmRleCA5YWY1NjQwLi44ZDQxM2MyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2xtNDk0NTMuYwpAQCAtMTM5MSwxMiArMTM5MSwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfbG00OTQ1MyA9IHsKIAkuc2V0X2JpYXNfbGV2ZWwgPSBsbTQ5NDUzX3NldF9iaWFzX2xldmVsLAotCS5jb250cm9scyA9IGxtNDk0NTNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGxtNDk0NTNfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gbG00OTQ1M19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGxtNDk0NTNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBsbTQ5NDUzX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShsbTQ5NDUzX2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBsbTQ5NDUzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGxtNDk0NTNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBsbTQ5NDUzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGxtNDk0NTNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGxtNDk0NTNfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShsbTQ5NDUzX2F1ZGlvX21hcCksCisJfSwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDg4LmMKaW5kZXggZmMyMjgwNC4uNzJmNzc0NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA4OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwODguYwpAQCAtMTcwNCwxMiArMTcwNCwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IG1heDk4MDg4X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IG1heDk4MDg4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShtYXg5ODA4OF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBtYXg5ODA4OF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1heDk4MDg4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gbWF4OTgwODhfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1heDk4MDg4X2F1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBtYXg5ODA4OF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtYXg5ODA4OF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IG1heDk4MDg4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG1heDk4MDg4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBtYXg5ODA4OF9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG1heDk4MDg4X2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgbWF4OTgwODhfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MDk1LmMKaW5kZXggMzU3NzAwMy4uNmY4YTc1NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTUuYwpAQCAtMjEwOCwxMiArMjEwOCwxNCBAQAogCS5zdXNwZW5kID0gbWF4OTgwOTVfc3VzcGVuZCwKIAkucmVzdW1lICA9IG1heDk4MDk1X3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBtYXg5ODA5NV9zZXRfYmlhc19sZXZlbCwKLQkuY29udHJvbHMgPSBtYXg5ODA5NV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWF4OTgwOTVfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCSAgPSBtYXg5ODA5NV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1heDk4MDk1X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzICAgICA9IG1heDk4MDk1X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShtYXg5ODA5NV9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gbWF4OTgwOTVfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobWF4OTgwOTVfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBtYXg5ODA5NV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShtYXg5ODA5NV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWF4OTgwOTVfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShtYXg5ODA5NV9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IG1heDk4MDk1X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODM1N2EuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgzNTdhLmMKaW5kZXggNWIxZGZiMS4uNmE2YjY4YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODM1N2EuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MzU3YS5jCkBAIC03NCwxMCArNzQsMTIgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBtYXg5ODM1N2FfY29kZWNfZHJpdmVyID0gewogCS5wcm9iZQkJCT0gbWF4OTgzNTdhX2NvZGVjX3Byb2JlLAotCS5kYXBtX3dpZGdldHMJCT0gbWF4OTgzNTdhX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWF4OTgzNTdhX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IG1heDk4MzU3YV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShtYXg5ODM1N2FfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IG1heDk4MzU3YV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShtYXg5ODM1N2FfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IG1heDk4MzU3YV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWF4OTgzNTdhX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgbWF4OTgzNTdhX2RhaV9vcHMgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MzcxLmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MzcxLmMKaW5kZXggMDIzNTJlZC4uNzgxYmU5YmEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgzNzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MzcxLmMKQEAgLTQyNiw3ICs0MjYsNiBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1heDk4MzcxX2kyY19kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAibWF4OTgzNzEiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLnBtID0gTlVMTCwKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG1heDk4MzcxX29mX21hdGNoKSwKIAl9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODUwLmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4NTAuYwppbmRleCBjMTRhNzlkLi4wNjEwODQwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21heDk4NTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4NTAuYwpAQCAtMzA2LDEyICszMDYsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBtYXg5ODUwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IG1heDk4NTBfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWF4OTg1MF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IG1heDk4NTBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShtYXg5ODUwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gbWF4OTg1MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShtYXg5ODUwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IG1heDk4NTBfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShtYXg5ODUwX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBtYXg5ODUwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG1heDk4NTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IG1heDk4NTBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG1heDk4NTBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IG1heDk4NTBfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4NjAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg2MC5jCmluZGV4IDY4MDc0YzkuLjQ5OWJkYmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg2MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg2MC5jCkBAIC01MzgsMTIgKzUzOCwxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IG1heDk4NjBfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gbWF4OTg2MF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShtYXg5ODYwX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gbWF4OTg2MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1heDk4NjBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBtYXg5ODYwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1heDk4NjBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gbWF4OTg2MF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG1heDk4NjBfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IG1heDk4NjBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWF4OTg2MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWF4OTg2MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWF4OTg2MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg2Ny5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODY3LmMKaW5kZXggMmEyMmZkZC4uNDJlMmU0MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODY3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODY3LmMKQEAgLTM4LDExICszOCwxMCBAQAogc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKG1heDk4NjBfbWljX3RsdiwgMjAwMCwgMTAwLCAxKTsKIHN0YXRpYyBERUNMQVJFX1RMVl9EQl9TQ0FMRShtYXg5ODYwX2FkY19sZWZ0X3RsdiwgLTEyMDAsIDEwMCwgMSk7CiBzdGF0aWMgREVDTEFSRV9UTFZfREJfU0NBTEUobWF4OTg2MF9hZGNfcmlnaHRfdGx2LCAtMTIwMCwgMTAwLCAxKTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWF4OTgwODhfbWljYm9vc3RfdGx2W10gPSB7Ci0JVExWX0RCX1JBTkdFX0hFQUQoMiksCitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9SQU5HRShtYXg5ODA4OF9taWNib29zdF90bHYsCiAJMCwgMSwgVExWX0RCX1NDQUxFX0lURU0oMCwgMjAwMCwgMCksCiAJMiwgMiwgVExWX0RCX1NDQUxFX0lURU0oMzAwMCwgMCwgMCksCi19OworKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1heDk4Njdfc25kX2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9SKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgTUFYOTg2N19MRUZUVk9MLApAQCAtNDE3LDEyICs0MTYsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBtYXg5ODY3X2NvZGVjID0gewogCS5wcm9iZSA9IG1heDk4NjdfcHJvYmUsCi0JLmNvbnRyb2xzID0gbWF4OTg2N19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWF4OTg2N19zbmRfY29udHJvbHMpLAotCS5kYXBtX3JvdXRlcyA9IG1heDk4NjdfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1heDk4NjdfYXVkaW9fbWFwKSwKLQkuZGFwbV93aWRnZXRzID0gbWF4OTg2N19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1heDk4NjdfZGFwbV93aWRnZXRzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IG1heDk4Njdfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobWF4OTg2N19zbmRfY29udHJvbHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWF4OTg2N19hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG1heDk4NjdfYXVkaW9fbWFwKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBtYXg5ODY3X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG1heDk4NjdfZGFwbV93aWRnZXRzKSwKKwl9LAogfTsKIAogc3RhdGljIGJvb2wgbWF4OTg2N192b2xhdGlsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL21heDk4OTI1LmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4OTI1LmMKaW5kZXggNTk5MGRlMy4uMzI3ZWFhMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODkyNS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg5MjUuYwpAQCAtNTQwLDEyICs1NDAsMTQgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X21heDk4OTI1ID0gewogCS5wcm9iZSAgICAgICAgICAgID0gbWF4OTg5MjVfcHJvYmUsCi0JLmNvbnRyb2xzID0gbWF4OTg5MjVfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKG1heDk4OTI1X3NuZF9jb250cm9scyksCi0JLmRhcG1fcm91dGVzID0gbWF4OTg5MjVfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1heDk4OTI1X2F1ZGlvX21hcCksCi0JLmRhcG1fd2lkZ2V0cyA9IG1heDk4OTI1X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobWF4OTg5MjVfZGFwbV93aWRnZXRzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IG1heDk4OTI1X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG1heDk4OTI1X3NuZF9jb250cm9scyksCisJCS5kYXBtX3JvdXRlcwkJPSBtYXg5ODkyNV9hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG1heDk4OTI1X2F1ZGlvX21hcCksCisJCS5kYXBtX3dpZGdldHMJCT0gbWF4OTg5MjVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWF4OTg5MjVfZGFwbV93aWRnZXRzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG1heDk4OTI1X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg5MjYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg5MjYuYwppbmRleCA4ZDE0YWRhLi4xZWZmN2UwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21heDk4OTI2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODkyNi5jCkBAIC0zNDcsNyArMzQ3LDcgQEAKIAkJbWF4OTg5MjZfc2V0X3NlbnNlX2RhdGEobWF4OTg5MjYpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJEQUkgY2xvY2sgbW9kZSB1bnN1cHBvcnRlZCIpOworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJEQUkgY2xvY2sgbW9kZSB1bnN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzY0LDcgKzM2NCw3IEBACiAJCWludmVydCA9IE1BWDk4OTI2X0RBSV9CQ0lfTUFTSyB8IE1BWDk4OTI2X0RBSV9XQ0lfTUFTSzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiREFJIGludmVydCBtb2RlIHVuc3VwcG9ydGVkIik7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkRBSSBpbnZlcnQgbW9kZSB1bnN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtNDA4LDcgKzQwOCw3IEBACiAJCW1heDk4OTI2LT5jaF9zaXplID0gMzI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRldl9kYmcoY29kZWMtPmRldiwgImZvcm1hdCB1bnN1cHBvcnRlZCAlZCIsCisJCWRldl9kYmcoY29kZWMtPmRldiwgImZvcm1hdCB1bnN1cHBvcnRlZCAlZFxuIiwKIAkJCXBhcmFtc19mb3JtYXQocGFyYW1zKSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQ5OCwxMiArNDk4LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9tYXg5ODkyNiA9IHsKIAkucHJvYmUJPSBtYXg5ODkyNl9wcm9iZSwKLQkuY29udHJvbHMgPSBtYXg5ODkyNl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWF4OTg5MjZfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV9yb3V0ZXMgPSBtYXg5ODkyNl9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWF4OTg5MjZfYXVkaW9fbWFwKSwKLQkuZGFwbV93aWRnZXRzID0gbWF4OTg5MjZfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShtYXg5ODkyNl9kYXBtX3dpZGdldHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gbWF4OTg5MjZfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobWF4OTg5MjZfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fcm91dGVzCQk9IG1heDk4OTI2X2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWF4OTg5MjZfYXVkaW9fbWFwKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBtYXg5ODkyNl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShtYXg5ODkyNl9kYXBtX3dpZGdldHMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgbWF4OTg5MjZfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYzEzNzgzLmMgYi9zb3VuZC9zb2MvY29kZWNzL21jMTM3ODMuYwppbmRleCAzZTc3MGNiLi45MDU2MjcwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21jMTM3ODMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL21jMTM3ODMuYwpAQCAtNzM3LDEyICs3MzcsMTQgQEAKIAkucHJvYmUJCT0gbWMxMzc4M19wcm9iZSwKIAkucmVtb3ZlCQk9IG1jMTM3ODNfcmVtb3ZlLAogCS5nZXRfcmVnbWFwCT0gbWMxMzc4M19nZXRfcmVnbWFwLAotCS5jb250cm9scwk9IG1jMTM3ODNfY29udHJvbF9saXN0LAotCS5udW1fY29udHJvbHMJPSBBUlJBWV9TSVpFKG1jMTM3ODNfY29udHJvbF9saXN0KSwKLQkuZGFwbV93aWRnZXRzCT0gbWMxMzc4M19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1jMTM3ODNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJPSBtYzEzNzgzX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShtYzEzNzgzX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBtYzEzNzgzX2NvbnRyb2xfbGlzdCwKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG1jMTM3ODNfY29udHJvbF9saXN0KSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBtYzEzNzgzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG1jMTM3ODNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IG1jMTM3ODNfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShtYzEzNzgzX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG1jMTM3ODNfY29kZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWwyNjEyNC5jIGIvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKaW5kZXggZjU2MWM3OC4uNjllNWUxOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tbDI2MTI0LmMKQEAgLTU0MSwxMiArNTQxLDE0IEBACiAJLnByb2JlID0JbWwyNjEyNF9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBtbDI2MTI0X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuZGFwbV93aWRnZXRzID0gbWwyNjEyNF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1sMjYxMjRfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBtbDI2MTI0X2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKG1sMjYxMjRfaW50ZXJjb24pLAotCS5jb250cm9scyA9IG1sMjYxMjRfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKG1sMjYxMjRfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IG1sMjYxMjRfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUobWwyNjEyNF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IG1sMjYxMjRfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUobWwyNjEyNF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gbWwyNjEyNF9pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUobWwyNjEyNF9pbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBtbDI2MTI0X2kyY19yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL25hdTg4MTAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgxMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NTUxODYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL25hdTg4MTAuYwpAQCAtMCwwICsxLDg4NCBAQAorLyoKKyAqIG5hdTg4MTAuYyAgLS0gIE5BVTg4MTAgQUxTQSBTb2MgQXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTYgTnV2b3RvbiBUZWNobm9sb2d5IENvcnAuCisgKgorICogQXV0aG9yOiBEYXZpZCBMaW4gPGN0bGluMEBudXZvdG9uLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBXTTg5NzQuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisKKyNpbmNsdWRlICJuYXU4ODEwLmgiCisKKyNkZWZpbmUgTkFVX1BMTF9GUkVRX01BWCAxMDAwMDAwMDAKKyNkZWZpbmUgTkFVX1BMTF9GUkVRX01JTiA5MDAwMDAwMAorI2RlZmluZSBOQVVfUExMX1JFRl9NQVggMzMwMDAwMDAKKyNkZWZpbmUgTkFVX1BMTF9SRUZfTUlOIDgwMDAwMDAKKyNkZWZpbmUgTkFVX1BMTF9PUFRPUF9NSU4gNgorCisKK3N0YXRpYyBjb25zdCBpbnQgbmF1ODgxMF9tY2xrX3NjYWxlcltdID0geyAxMCwgMTUsIDIwLCAzMCwgNDAsIDYwLCA4MCwgMTIwIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgbmF1ODgxMF9yZWdfZGVmYXVsdHNbXSA9IHsKKwl7IE5BVTg4MTBfUkVHX1BPV0VSMSwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19QT1dFUjIsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfUE9XRVIzLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0lGQUNFLCAweDAwNTAgfSwKKwl7IE5BVTg4MTBfUkVHX0NPTVAsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfQ0xPQ0ssIDB4MDE0MCB9LAorCXsgTkFVODgxMF9SRUdfU01QTFIsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfREFDLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0RBQ0dBSU4sIDB4MDBGRiB9LAorCXsgTkFVODgxMF9SRUdfQURDLCAweDAxMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0FEQ0dBSU4sIDB4MDBGRiB9LAorCXsgTkFVODgxMF9SRUdfRVExLCAweDAxMkMgfSwKKwl7IE5BVTg4MTBfUkVHX0VRMiwgMHgwMDJDIH0sCisJeyBOQVU4ODEwX1JFR19FUTMsIDB4MDAyQyB9LAorCXsgTkFVODgxMF9SRUdfRVE0LCAweDAwMkMgfSwKKwl7IE5BVTg4MTBfUkVHX0VRNSwgMHgwMDJDIH0sCisJeyBOQVU4ODEwX1JFR19EQUNMSU0xLCAweDAwMzIgfSwKKwl7IE5BVTg4MTBfUkVHX0RBQ0xJTTIsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfTk9UQ0gxLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX05PVENIMiwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19OT1RDSDMsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfTk9UQ0g0LCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0FMQzEsIDB4MDAzOCB9LAorCXsgTkFVODgxMF9SRUdfQUxDMiwgMHgwMDBCIH0sCisJeyBOQVU4ODEwX1JFR19BTEMzLCAweDAwMzIgfSwKKwl7IE5BVTg4MTBfUkVHX05PSVNFR0FURSwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19QTExOLCAweDAwMDggfSwKKwl7IE5BVTg4MTBfUkVHX1BMTEsxLCAweDAwMEMgfSwKKwl7IE5BVTg4MTBfUkVHX1BMTEsyLCAweDAwOTMgfSwKKwl7IE5BVTg4MTBfUkVHX1BMTEszLCAweDAwRTkgfSwKKwl7IE5BVTg4MTBfUkVHX0FUVEVOLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0lOUFVUX1NJR05BTCwgMHgwMDAzIH0sCisJeyBOQVU4ODEwX1JFR19QR0FHQUlOLCAweDAwMTAgfSwKKwl7IE5BVTg4MTBfUkVHX0FEQ0JPT1NULCAweDAxMDAgfSwKKwl7IE5BVTg4MTBfUkVHX09VVFBVVCwgMHgwMDAyIH0sCisJeyBOQVU4ODEwX1JFR19TUEtNSVgsIDB4MDAwMSB9LAorCXsgTkFVODgxMF9SRUdfU1BLR0FJTiwgMHgwMDM5IH0sCisJeyBOQVU4ODEwX1JFR19NT05PTUlYLCAweDAwMDEgfSwKKwl7IE5BVTg4MTBfUkVHX1BPV0VSNCwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19UU0xPVENUTDEsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfVFNMT1RDVEwyLCAweDAwMjAgfSwKKwl7IE5BVTg4MTBfUkVHX0RFVklDRV9SRVZJRCwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19JMkNfREVWSUNFSUQsIDB4MDAxQSB9LAorCXsgTkFVODgxMF9SRUdfQURESVRJT05JRCwgMHgwMENBIH0sCisJeyBOQVU4ODEwX1JFR19SRVNFUlZFLCAweDAxMjQgfSwKKwl7IE5BVTg4MTBfUkVHX09VVENUTCwgMHgwMDAxIH0sCisJeyBOQVU4ODEwX1JFR19BTEMxRU5IQU4xLCAweDAwMTAgfSwKKwl7IE5BVTg4MTBfUkVHX0FMQzFFTkhBTjIsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfTUlTQ0NUTCwgMHgwMDAwIH0sCisJeyBOQVU4ODEwX1JFR19PVVRUSUVPRkYsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfQUdDUDJQT1VULCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX0FHQ1BPVVQsIDB4MDAwMCB9LAorCXsgTkFVODgxMF9SRUdfQU1UQ1RMLCAweDAwMDAgfSwKKwl7IE5BVTg4MTBfUkVHX09VVFRJRU9GRk1BTiwgMHgwMDAwIH0sCit9OworCitzdGF0aWMgYm9vbCBuYXU4ODEwX3JlYWRhYmxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIE5BVTg4MTBfUkVHX1JFU0VUIC4uLiBOQVU4ODEwX1JFR19TTVBMUjoKKwljYXNlIE5BVTg4MTBfUkVHX0RBQyAuLi4gTkFVODgxMF9SRUdfREFDR0FJTjoKKwljYXNlIE5BVTg4MTBfUkVHX0FEQyAuLi4gTkFVODgxMF9SRUdfQURDR0FJTjoKKwljYXNlIE5BVTg4MTBfUkVHX0VRMSAuLi4gTkFVODgxMF9SRUdfRVE1OgorCWNhc2UgTkFVODgxMF9SRUdfREFDTElNMSAuLi4gTkFVODgxMF9SRUdfREFDTElNMjoKKwljYXNlIE5BVTg4MTBfUkVHX05PVENIMSAuLi4gTkFVODgxMF9SRUdfTk9UQ0g0OgorCWNhc2UgTkFVODgxMF9SRUdfQUxDMSAuLi4gTkFVODgxMF9SRUdfQVRURU46CisJY2FzZSBOQVU4ODEwX1JFR19JTlBVVF9TSUdOQUwgLi4uIE5BVTg4MTBfUkVHX1BHQUdBSU46CisJY2FzZSBOQVU4ODEwX1JFR19BRENCT09TVDoKKwljYXNlIE5BVTg4MTBfUkVHX09VVFBVVCAuLi4gTkFVODgxMF9SRUdfU1BLTUlYOgorCWNhc2UgTkFVODgxMF9SRUdfU1BLR0FJTjoKKwljYXNlIE5BVTg4MTBfUkVHX01PTk9NSVg6CisJY2FzZSBOQVU4ODEwX1JFR19QT1dFUjQgLi4uIE5BVTg4MTBfUkVHX1RTTE9UQ1RMMjoKKwljYXNlIE5BVTg4MTBfUkVHX0RFVklDRV9SRVZJRCAuLi4gTkFVODgxMF9SRUdfUkVTRVJWRToKKwljYXNlIE5BVTg4MTBfUkVHX09VVENUTCAuLi4gTkFVODgxMF9SRUdfQUxDMUVOSEFOMjoKKwljYXNlIE5BVTg4MTBfUkVHX01JU0NDVEw6CisJY2FzZSBOQVU4ODEwX1JFR19PVVRUSUVPRkYgLi4uIE5BVTg4MTBfUkVHX09VVFRJRU9GRk1BTjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGJvb2wgbmF1ODgxMF93cml0ZWFibGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTkFVODgxMF9SRUdfUkVTRVQgLi4uIE5BVTg4MTBfUkVHX1NNUExSOgorCWNhc2UgTkFVODgxMF9SRUdfREFDIC4uLiBOQVU4ODEwX1JFR19EQUNHQUlOOgorCWNhc2UgTkFVODgxMF9SRUdfQURDIC4uLiBOQVU4ODEwX1JFR19BRENHQUlOOgorCWNhc2UgTkFVODgxMF9SRUdfRVExIC4uLiBOQVU4ODEwX1JFR19FUTU6CisJY2FzZSBOQVU4ODEwX1JFR19EQUNMSU0xIC4uLiBOQVU4ODEwX1JFR19EQUNMSU0yOgorCWNhc2UgTkFVODgxMF9SRUdfTk9UQ0gxIC4uLiBOQVU4ODEwX1JFR19OT1RDSDQ6CisJY2FzZSBOQVU4ODEwX1JFR19BTEMxIC4uLiBOQVU4ODEwX1JFR19BVFRFTjoKKwljYXNlIE5BVTg4MTBfUkVHX0lOUFVUX1NJR05BTCAuLi4gTkFVODgxMF9SRUdfUEdBR0FJTjoKKwljYXNlIE5BVTg4MTBfUkVHX0FEQ0JPT1NUOgorCWNhc2UgTkFVODgxMF9SRUdfT1VUUFVUIC4uLiBOQVU4ODEwX1JFR19TUEtNSVg6CisJY2FzZSBOQVU4ODEwX1JFR19TUEtHQUlOOgorCWNhc2UgTkFVODgxMF9SRUdfTU9OT01JWDoKKwljYXNlIE5BVTg4MTBfUkVHX1BPV0VSNCAuLi4gTkFVODgxMF9SRUdfVFNMT1RDVEwyOgorCWNhc2UgTkFVODgxMF9SRUdfT1VUQ1RMIC4uLiBOQVU4ODEwX1JFR19BTEMxRU5IQU4yOgorCWNhc2UgTkFVODgxMF9SRUdfTUlTQ0NUTDoKKwljYXNlIE5BVTg4MTBfUkVHX09VVFRJRU9GRiAuLi4gTkFVODgxMF9SRUdfT1VUVElFT0ZGTUFOOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBuYXU4ODEwX3ZvbGF0aWxlX3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIE5BVTg4MTBfUkVHX1JFU0VUOgorCWNhc2UgTkFVODgxMF9SRUdfREVWSUNFX1JFVklEIC4uLiBOQVU4ODEwX1JFR19SRVNFUlZFOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCisvKiBUaGUgRVEgcGFyYW1ldGVycyBnZXQgZnVuY3Rpb24gaXMgdG8gZ2V0IHRoZSA1IGJhbmQgZXF1YWxpemVyIGNvbnRyb2wuCisgKiBUaGUgcmVnbWFwIHJhdyByZWFkIGNhbid0IHdvcmsgaGVyZSBiZWNhdXNlIHJlZ21hcCBkb2Vzbid0IHByb3ZpZGUKKyAqIHZhbHVlIGZvcm1hdCBmb3IgdmFsdWUgd2lkdGggb2YgOSBiaXRzLiBUaGVyZWZvcmUsIHRoZSBkcml2ZXIgcmVhZHMgZGF0YQorICogZnJvbSBjYWNoZSBhbmQgbWFrZXMgdmFsdWUgZm9ybWF0IGFjY29yZGluZyB0byB0aGUgZW5kaWFubmVzcyBvZgorICogYnl0ZXMgdHlwZSBjb250cm9sIGVsZW1lbnQuCisgKi8KK3N0YXRpYyBpbnQgbmF1ODgxMF9lcV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc29jX2J5dGVzX2V4dCAqcGFyYW1zID0gKHZvaWQgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlpbnQgaSwgcmVnLCByZWdfdmFsOworCXUxNiAqdmFsOworCisJdmFsID0gKHUxNiAqKXVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhOworCXJlZyA9IE5BVTg4MTBfUkVHX0VRMTsKKwlmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5tYXggLyBzaXplb2YodTE2KTsgaSsrKSB7CisJCXJlZ21hcF9yZWFkKG5hdTg4MTAtPnJlZ21hcCwgcmVnICsgaSwgJnJlZ192YWwpOworCQkvKiBjb252ZXJzaW9uIG9mIDE2LWJpdCBpbnRlZ2VycyBiZXR3ZWVuIG5hdGl2ZSBDUFUgZm9ybWF0CisJCSAqIGFuZCBiaWcgZW5kaWFuIGZvcm1hdAorCQkgKi8KKwkJcmVnX3ZhbCA9IGNwdV90b19iZTE2KHJlZ192YWwpOworCQltZW1jcHkodmFsICsgaSwgJnJlZ192YWwsIHNpemVvZihyZWdfdmFsKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBFUSBwYXJhbWV0ZXJzIHB1dCBmdW5jdGlvbiBpcyB0byBtYWtlIGNvbmZpZ3VyYXRpb24gb2YgNSBiYW5kIGVxdWFsaXplcgorICogY29udHJvbC4gVGhlc2UgY29uZmlndXJhdGlvbiBpbmNsdWRlcyBjZW50cmFsIGZyZXF1ZW5jeSwgZXF1YWxpemVyIGdhaW4sCisgKiBjdXQtb2ZmIGZyZXF1ZW5jeSwgYmFuZHdpZHRoIGNvbnRyb2wsIGFuZCBlcXVhbGl6ZXIgcGF0aC4KKyAqIFRoZSByZWdtYXAgcmF3IHdyaXRlIGNhbid0IHdvcmsgaGVyZSBiZWNhdXNlIHJlZ21hcCBkb2Vzbid0IHByb3ZpZGUKKyAqIHJlZ2lzdGVyIGFuZCB2YWx1ZSBmb3JtYXQgZm9yIHJlZ2lzdGVyIHdpdGggYWRkcmVzcyA3IGJpdHMgYW5kIHZhbHVlIDkgYml0cy4KKyAqIFRoZXJlZm9yZSwgdGhlIGRyaXZlciBtYWtlcyB2YWx1ZSBmb3JtYXQgYWNjb3JkaW5nIHRvIHRoZSBlbmRpYW5uZXNzIG9mCisgKiBieXRlcyB0eXBlIGNvbnRyb2wgZWxlbWVudCBhbmQgd3JpdGVzIGRhdGEgdG8gY29kZWMuCisgKi8KK3N0YXRpYyBpbnQgbmF1ODgxMF9lcV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3Qgc29jX2J5dGVzX2V4dCAqcGFyYW1zID0gKHZvaWQgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl2b2lkICpkYXRhOworCXUxNiAqdmFsLCB2YWx1ZTsKKwlpbnQgaSwgcmVnLCByZXQ7CisKKwlkYXRhID0ga21lbWR1cCh1Y29udHJvbC0+dmFsdWUuYnl0ZXMuZGF0YSwKKwkJcGFyYW1zLT5tYXgsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJdmFsID0gKHUxNiAqKWRhdGE7CisJcmVnID0gTkFVODgxMF9SRUdfRVExOworCWZvciAoaSA9IDA7IGkgPCBwYXJhbXMtPm1heCAvIHNpemVvZih1MTYpOyBpKyspIHsKKwkJLyogY29udmVyc2lvbiBvZiAxNi1iaXQgaW50ZWdlcnMgYmV0d2VlbiBuYXRpdmUgQ1BVIGZvcm1hdAorCQkgKiBhbmQgYmlnIGVuZGlhbiBmb3JtYXQKKwkJICovCisJCXZhbHVlID0gYmUxNl90b19jcHUoKih2YWwgKyBpKSk7CisJCXJldCA9IHJlZ21hcF93cml0ZShuYXU4ODEwLT5yZWdtYXAsIHJlZyArIGksIHZhbHVlKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiRVEgY29uZmlndXJhdGlvbiBmYWlsLCByZWdpc3RlcjogJXggcmV0OiAlZFxuIiwKKwkJCQlyZWcgKyBpLCByZXQpOworCQkJa2ZyZWUoZGF0YSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF1ODgxMF9jb21wYW5kaW5nW10gPSB7CisJIk9mZiIsICJOQyIsICJ1LWxhdyIsICJBLWxhdyIgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuYXU4ODEwX2NvbXBhbmRpbmdfYWRjX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShOQVU4ODEwX1JFR19DT01QLCBOQVU4ODEwX0FEQ0NNX1NGVCwKKwkJQVJSQVlfU0laRShuYXU4ODEwX2NvbXBhbmRpbmcpLCBuYXU4ODEwX2NvbXBhbmRpbmcpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIG5hdTg4MTBfY29tcGFuZGluZ19kYWNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE5BVTg4MTBfUkVHX0NPTVAsIE5BVTg4MTBfREFDQ01fU0ZULAorCQlBUlJBWV9TSVpFKG5hdTg4MTBfY29tcGFuZGluZyksIG5hdTg4MTBfY29tcGFuZGluZyk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF1ODgxMF9kZWVtcFtdID0geworCSJOb25lIiwgIjMya0h6IiwgIjQ0LjFrSHoiLCAiNDhrSHoiIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmF1ODgxMF9kZWVtcF9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTkFVODgxMF9SRUdfREFDLCBOQVU4ODEwX0RFRU1QX1NGVCwKKwkJQVJSQVlfU0laRShuYXU4ODEwX2RlZW1wKSwgbmF1ODgxMF9kZWVtcCk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF1ODgxMF9lcW1vZGVbXSA9IHsiQ2FwdHVyZSIsICJQbGF5YmFjayIgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBuYXU4ODEwX2VxbW9kZV9lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEUoTkFVODgxMF9SRUdfRVExLCBOQVU4ODEwX0VRTV9TRlQsCisJCUFSUkFZX1NJWkUobmF1ODgxMF9lcW1vZGUpLCBuYXU4ODEwX2VxbW9kZSk7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmF1ODgxMF9hbGNbXSA9IHsiTm9ybWFsIiwgIkxpbWl0ZXIiIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbmF1ODgxMF9hbGNfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE5BVTg4MTBfUkVHX0FMQzMsIE5BVTg4MTBfQUxDTV9TRlQsCisJCUFSUkFZX1NJWkUobmF1ODgxMF9hbGMpLCBuYXU4ODEwX2FsYyk7CisKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShkaWdpdGFsX3RsdiwgLTEyNzUwLCA1MCwgMSk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZXFfdGx2LCAtMTIwMCwgMTAwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShpbnBnYV90bHYsIC0xMjAwLCA3NSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoc3BrX3RsdiwgLTU3MDAsIDEwMCwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYXU4ODEwX3NuZF9jb250cm9sc1tdID0geworCVNPQ19FTlVNKCJBREMgQ29tcGFuZGluZyIsIG5hdTg4MTBfY29tcGFuZGluZ19hZGNfZW51bSksCisJU09DX0VOVU0oIkRBQyBDb21wYW5kaW5nIiwgbmF1ODgxMF9jb21wYW5kaW5nX2RhY19lbnVtKSwKKwlTT0NfRU5VTSgiREFDIERlLWVtcGhhc2lzIiwgbmF1ODgxMF9kZWVtcF9lbnVtKSwKKworCVNPQ19FTlVNKCJFUSBGdW5jdGlvbiIsIG5hdTg4MTBfZXFtb2RlX2VudW0pLAorCVNORF9TT0NfQllURVNfRVhUKCJFUSBQYXJhbWV0ZXJzIiwgMTAsCisJCSAgbmF1ODgxMF9lcV9nZXQsIG5hdTg4MTBfZXFfcHV0KSwKKworCVNPQ19TSU5HTEUoIkRBQyBJbnZlcnNpb24gU3dpdGNoIiwgTkFVODgxMF9SRUdfREFDLAorCQlOQVU4ODEwX0RBQ1BMX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRV9UTFYoIlBsYXliYWNrIFZvbHVtZSIsIE5BVTg4MTBfUkVHX0RBQ0dBSU4sCisJCU5BVTg4MTBfREFDR0FJTl9TRlQsIDB4ZmYsIDAsIGRpZ2l0YWxfdGx2KSwKKworCVNPQ19TSU5HTEUoIkhpZ2ggUGFzcyBGaWx0ZXIgU3dpdGNoIiwgTkFVODgxMF9SRUdfQURDLAorCQlOQVU4ODEwX0hQRkVOX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRSgiSGlnaCBQYXNzIEN1dCBPZmYiLCBOQVU4ODEwX1JFR19BREMsCisJCU5BVTg4MTBfSFBGX1NGVCwgMHg3LCAwKSwKKworCVNPQ19TSU5HTEUoIkFEQyBJbnZlcnNpb24gU3dpdGNoIiwgTkFVODgxMF9SRUdfQURDLAorCQlOQVU4ODEwX0FEQ1BMX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRV9UTFYoIkNhcHR1cmUgVm9sdW1lIiwgTkFVODgxMF9SRUdfQURDR0FJTiwKKwkJTkFVODgxMF9BRENHQUlOX1NGVCwgMHhmZiwgMCwgZGlnaXRhbF90bHYpLAorCisJU09DX1NJTkdMRV9UTFYoIkVRMSBWb2x1bWUiLCBOQVU4ODEwX1JFR19FUTEsCisJCU5BVTg4MTBfRVExR0NfU0ZULCAweDE4LCAxLCBlcV90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJFUTIgVm9sdW1lIiwgTkFVODgxMF9SRUdfRVEyLAorCQlOQVU4ODEwX0VRMkdDX1NGVCwgMHgxOCwgMSwgZXFfdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiRVEzIFZvbHVtZSIsIE5BVTg4MTBfUkVHX0VRMywKKwkJTkFVODgxMF9FUTNHQ19TRlQsIDB4MTgsIDEsIGVxX3RsdiksCisJU09DX1NJTkdMRV9UTFYoIkVRNCBWb2x1bWUiLCBOQVU4ODEwX1JFR19FUTQsCisJCU5BVTg4MTBfRVE0R0NfU0ZULCAweDE4LCAxLCBlcV90bHYpLAorCVNPQ19TSU5HTEVfVExWKCJFUTUgVm9sdW1lIiwgTkFVODgxMF9SRUdfRVE1LAorCQlOQVU4ODEwX0VRNUdDX1NGVCwgMHgxOCwgMSwgZXFfdGx2KSwKKworCVNPQ19TSU5HTEUoIkRBQyBMaW1pdGVyIFN3aXRjaCIsIE5BVTg4MTBfUkVHX0RBQ0xJTTEsCisJCU5BVTg4MTBfREFDTElNRU5fU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJEQUMgTGltaXRlciBEZWNheSIsIE5BVTg4MTBfUkVHX0RBQ0xJTTEsCisJCU5BVTg4MTBfREFDTElNRENZX1NGVCwgMHhmLCAwKSwKKwlTT0NfU0lOR0xFKCJEQUMgTGltaXRlciBBdHRhY2siLCBOQVU4ODEwX1JFR19EQUNMSU0xLAorCQlOQVU4ODEwX0RBQ0xJTUFUS19TRlQsIDB4ZiwgMCksCisJU09DX1NJTkdMRSgiREFDIExpbWl0ZXIgVGhyZXNob2xkIiwgTkFVODgxMF9SRUdfREFDTElNMiwKKwkJTkFVODgxMF9EQUNMSU1USExfU0ZULCAweDcsIDApLAorCVNPQ19TSU5HTEUoIkRBQyBMaW1pdGVyIEJvb3N0IiwgTkFVODgxMF9SRUdfREFDTElNMiwKKwkJTkFVODgxMF9EQUNMSU1CU1RfU0ZULCAweGYsIDApLAorCisJU09DX0VOVU0oIkFMQyBNb2RlIiwgbmF1ODgxMF9hbGNfZW51bSksCisJU09DX1NJTkdMRSgiQUxDIEVuYWJsZSBTd2l0Y2giLCBOQVU4ODEwX1JFR19BTEMxLAorCQlOQVU4ODEwX0FMQ0VOX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRSgiQUxDIE1heCBWb2x1bWUiLCBOQVU4ODEwX1JFR19BTEMxLAorCQlOQVU4ODEwX0FMQ01YR0FJTl9TRlQsIDB4NywgMCksCisJU09DX1NJTkdMRSgiQUxDIE1pbiBWb2x1bWUiLCBOQVU4ODEwX1JFR19BTEMxLAorCQlOQVU4ODEwX0FMQ01JTkdBSU5fU0ZULCAweDcsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBaQyBTd2l0Y2giLCBOQVU4ODEwX1JFR19BTEMyLAorCQlOQVU4ODEwX0FMQ1pDX1NGVCwgMSwgMCksCisJU09DX1NJTkdMRSgiQUxDIEhvbGQiLCBOQVU4ODEwX1JFR19BTEMyLAorCQlOQVU4ODEwX0FMQ0hUX1NGVCwgMHhmLCAwKSwKKwlTT0NfU0lOR0xFKCJBTEMgVGFyZ2V0IiwgTkFVODgxMF9SRUdfQUxDMiwKKwkJTkFVODgxMF9BTENTTF9TRlQsIDB4ZiwgMCksCisJU09DX1NJTkdMRSgiQUxDIERlY2F5IiwgTkFVODgxMF9SRUdfQUxDMywKKwkJTkFVODgxMF9BTENEQ1lfU0ZULCAweGYsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBBdHRhY2siLCBOQVU4ODEwX1JFR19BTEMzLAorCQlOQVU4ODEwX0FMQ0FUS19TRlQsIDB4ZiwgMCksCisJU09DX1NJTkdMRSgiQUxDIE5vaXNlIEdhdGUgU3dpdGNoIiwgTkFVODgxMF9SRUdfTk9JU0VHQVRFLAorCQlOQVU4ODEwX0FMQ05FTl9TRlQsIDEsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBOb2lzZSBHYXRlIFRocmVzaG9sZCIsIE5BVTg4MTBfUkVHX05PSVNFR0FURSwKKwkJTkFVODgxMF9BTENOVEhfU0ZULCAweDcsIDApLAorCisJU09DX1NJTkdMRSgiUEdBIFpDIFN3aXRjaCIsIE5BVTg4MTBfUkVHX1BHQUdBSU4sCisJCU5BVTg4MTBfUEdBWkNfU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFX1RMVigiUEdBIFZvbHVtZSIsIE5BVTg4MTBfUkVHX1BHQUdBSU4sCisJCU5BVTg4MTBfUEdBR0FJTl9TRlQsIDB4M2YsIDAsIGlucGdhX3RsdiksCisKKwlTT0NfU0lOR0xFKCJTcGVha2VyIFpDIFN3aXRjaCIsIE5BVTg4MTBfUkVHX1NQS0dBSU4sCisJCU5BVTg4MTBfU1BLWkNfU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJTcGVha2VyIE11dGUgU3dpdGNoIiwgTkFVODgxMF9SRUdfU1BLR0FJTiwKKwkJTkFVODgxMF9TUEtNVF9TRlQsIDEsIDApLAorCVNPQ19TSU5HTEVfVExWKCJTcGVha2VyIFZvbHVtZSIsIE5BVTg4MTBfUkVHX1NQS0dBSU4sCisJCU5BVTg4MTBfU1BLR0FJTl9TRlQsIDB4M2YsIDAsIHNwa190bHYpLAorCisJU09DX1NJTkdMRSgiQ2FwdHVyZSBCb29zdCgrMjBkQikiLCBOQVU4ODEwX1JFR19BRENCT09TVCwKKwkJTkFVODgxMF9QR0FCU1RfU0ZULCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJNb25vIE11dGUgU3dpdGNoIiwgTkFVODgxMF9SRUdfTU9OT01JWCwKKwkJTkFVODgxMF9NT1VUTVhNVF9TRlQsIDEsIDApLAorCisJU09DX1NJTkdMRSgiREFDIE92ZXJzYW1wbGluZyBSYXRlKDEyOHgpIFN3aXRjaCIsIE5BVTg4MTBfUkVHX0RBQywKKwkJTkFVODgxMF9EQUNPU19TRlQsIDEsIDApLAorCVNPQ19TSU5HTEUoIkFEQyBPdmVyc2FtcGxpbmcgUmF0ZSgxMjh4KSBTd2l0Y2giLCBOQVU4ODEwX1JFR19BREMsCisJCU5BVTg4MTBfQURDT1NfU0ZULCAxLCAwKSwKK307CisKKy8qIFNwZWFrZXIgT3V0cHV0IE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbmF1ODgxMF9zcGVha2VyX21peGVyX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJMaW5lIEJ5cGFzcyBTd2l0Y2giLCBOQVU4ODEwX1JFR19TUEtNSVgsCisJCU5BVTg4MTBfQllQU1BLX1NGVCwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgTkFVODgxMF9SRUdfU1BLTUlYLAorCQlOQVU4ODEwX0RBQ1NQS19TRlQsIDEsIDApLAorfTsKKworLyogTW9ubyBPdXRwdXQgTWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYXU4ODEwX21vbm9fbWl4ZXJfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkxpbmUgQnlwYXNzIFN3aXRjaCIsIE5BVTg4MTBfUkVHX01PTk9NSVgsCisJCU5BVTg4MTBfQllQTU9VVF9TRlQsIDEsIDApLAorCVNPQ19EQVBNX1NJTkdMRSgiUENNIFBsYXliYWNrIFN3aXRjaCIsIE5BVTg4MTBfUkVHX01PTk9NSVgsCisJCU5BVTg4MTBfREFDTU9VVF9TRlQsIDEsIDApLAorfTsKKworLyogUEdBIE11dGUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYXU4ODEwX2lucGdhX211dGVbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlBHQSBNdXRlIFN3aXRjaCIsIE5BVTg4MTBfUkVHX1BHQUdBSU4sCisJCU5BVTg4MTBfUEdBTVRfU0ZULCAxLCAwKSwKK307CisKKy8qIElucHV0IFBHQSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG5hdTg4MTBfaW5wZ2FbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIk1pY04gU3dpdGNoIiwgTkFVODgxMF9SRUdfSU5QVVRfU0lHTkFMLAorCQlOQVU4ODEwX05NSUNQR0FfU0ZULCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIk1pY1AgU3dpdGNoIiwgTkFVODgxMF9SRUdfSU5QVVRfU0lHTkFMLAorCQlOQVU4ODEwX1BNSUNQR0FfU0ZULCAxLCAwKSwKK307CisKKy8qIE1pYyBJbnB1dCBib29zdCB2b2wgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYXU4ODEwX21pY19ib29zdF9jb250cm9scyA9CisJU09DX0RBUE1fU0lOR0xFKCJNaWMgVm9sdW1lIiwgTkFVODgxMF9SRUdfQURDQk9PU1QsCisJCU5BVTg4MTBfUE1JQ0JTVEdBSU5fU0ZULCAweDcsIDApOworCisvKiBMb29wYmFjayBTd2l0Y2ggKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuYXU4ODEwX2xvb3BiYWNrID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIE5BVTg4MTBfUkVHX0NPTVAsCisJCU5BVTg4MTBfQUREQVBfU0ZULCAxLCAwKTsKKworc3RhdGljIGludCBjaGVja19tY2xrX3NlbGVjdF9wbGwoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKKwkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luaykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMoc291cmNlLT5kYXBtKTsKKwlzdHJ1Y3QgbmF1ODgxMCAqbmF1ODgxMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCXJlZ21hcF9yZWFkKG5hdTg4MTAtPnJlZ21hcCwgTkFVODgxMF9SRUdfQ0xPQ0ssICZ2YWx1ZSk7CisJcmV0dXJuICh2YWx1ZSAmIE5BVTg4MTBfQ0xLTV9NQVNLKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IG5hdTg4MTBfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX01JWEVSKCJTcGVha2VyIE1peGVyIiwgTkFVODgxMF9SRUdfUE9XRVIzLAorCQlOQVU4ODEwX1NQS01YX0VOX1NGVCwgMCwgJm5hdTg4MTBfc3BlYWtlcl9taXhlcl9jb250cm9sc1swXSwKKwkJQVJSQVlfU0laRShuYXU4ODEwX3NwZWFrZXJfbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk1vbm8gTWl4ZXIiLCBOQVU4ODEwX1JFR19QT1dFUjMsCisJCU5BVTg4MTBfTU9VVE1YX0VOX1NGVCwgMCwgJm5hdTg4MTBfbW9ub19taXhlcl9jb250cm9sc1swXSwKKwkJQVJSQVlfU0laRShuYXU4ODEwX21vbm9fbWl4ZXJfY29udHJvbHMpKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMiLCAiSGlGaSBQbGF5YmFjayIsIE5BVTg4MTBfUkVHX1BPV0VSMywKKwkJTkFVODgxMF9EQUNfRU5fU0ZULCAwKSwKKwlTTkRfU09DX0RBUE1fQURDKCJBREMiLCAiSGlGaSBDYXB0dXJlIiwgTkFVODgxMF9SRUdfUE9XRVIyLAorCQlOQVU4ODEwX0FEQ19FTl9TRlQsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIlNwa04gT3V0IiwgTkFVODgxMF9SRUdfUE9XRVIzLAorCQlOQVU4ODEwX05TUEtfRU5fU0ZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJTcGtQIE91dCIsIE5BVTg4MTBfUkVHX1BPV0VSMywKKwkJTkFVODgxMF9QU1BLX0VOX1NGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiTW9ubyBPdXQiLCBOQVU4ODEwX1JFR19QT1dFUjMsCisJCU5BVTg4MTBfTU9VVF9FTl9TRlQsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX01JWEVSKCJJbnB1dCBQR0EiLCBOQVU4ODEwX1JFR19QT1dFUjIsCisJCU5BVTg4MTBfUEdBX0VOX1NGVCwgMCwgbmF1ODgxMF9pbnBnYSwKKwkJQVJSQVlfU0laRShuYXU4ODEwX2lucGdhKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJJbnB1dCBCb29zdCBTdGFnZSIsIE5BVTg4MTBfUkVHX1BPV0VSMiwKKwkJTkFVODgxMF9CU1RfRU5fU0ZULCAwLCBuYXU4ODEwX2lucGdhX211dGUsCisJCUFSUkFZX1NJWkUobmF1ODgxMF9pbnBnYV9tdXRlKSksCisKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNaWMgQmlhcyIsIE5BVTg4MTBfUkVHX1BPV0VSMSwKKwkJTkFVODgxMF9NSUNCSUFTX0VOX1NGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUExMIiwgTkFVODgxMF9SRUdfUE9XRVIxLAorCQlOQVU4ODEwX1BMTF9FTl9TRlQsIDAsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiRGlnaXRhbCBMb29wYmFjayIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJJm5hdTg4MTBfbG9vcGJhY2spLAorCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNOIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUNQIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiTU9OT09VVCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIlNQS09VVFAiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJTUEtPVVROIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBuYXU4ODEwX2RhcG1fcm91dGVzW10gPSB7CisJeyJEQUMiLCBOVUxMLCAiUExMIiwgY2hlY2tfbWNsa19zZWxlY3RfcGxsfSwKKworCS8qIE1vbm8gb3V0cHV0IG1peGVyICovCisJeyJNb25vIE1peGVyIiwgIlBDTSBQbGF5YmFjayBTd2l0Y2giLCAiREFDIn0sCisJeyJNb25vIE1peGVyIiwgIkxpbmUgQnlwYXNzIFN3aXRjaCIsICJJbnB1dCBCb29zdCBTdGFnZSJ9LAorCisJLyogU3BlYWtlciBvdXRwdXQgbWl4ZXIgKi8KKwl7IlNwZWFrZXIgTWl4ZXIiLCAiUENNIFBsYXliYWNrIFN3aXRjaCIsICJEQUMifSwKKwl7IlNwZWFrZXIgTWl4ZXIiLCAiTGluZSBCeXBhc3MgU3dpdGNoIiwgIklucHV0IEJvb3N0IFN0YWdlIn0sCisKKwkvKiBPdXRwdXRzICovCisJeyJNb25vIE91dCIsIE5VTEwsICJNb25vIE1peGVyIn0sCisJeyJNT05PT1VUIiwgTlVMTCwgIk1vbm8gT3V0In0sCisJeyJTcGtOIE91dCIsIE5VTEwsICJTcGVha2VyIE1peGVyIn0sCisJeyJTcGtQIE91dCIsIE5VTEwsICJTcGVha2VyIE1peGVyIn0sCisJeyJTUEtPVVROIiwgTlVMTCwgIlNwa04gT3V0In0sCisJeyJTUEtPVVRQIiwgTlVMTCwgIlNwa1AgT3V0In0sCisKKwkvKiBJbnB1dCBCb29zdCBTdGFnZSAqLworCXsiQURDIiwgTlVMTCwgIklucHV0IEJvb3N0IFN0YWdlIn0sCisJeyJBREMiLCBOVUxMLCAiUExMIiwgY2hlY2tfbWNsa19zZWxlY3RfcGxsfSwKKwl7IklucHV0IEJvb3N0IFN0YWdlIiwgTlVMTCwgIklucHV0IFBHQSJ9LAorCXsiSW5wdXQgQm9vc3QgU3RhZ2UiLCBOVUxMLCAiTUlDUCJ9LAorCisJLyogSW5wdXQgUEdBICovCisJeyJJbnB1dCBQR0EiLCBOVUxMLCAiTWljIEJpYXMifSwKKwl7IklucHV0IFBHQSIsICJNaWNOIFN3aXRjaCIsICJNSUNOIn0sCisJeyJJbnB1dCBQR0EiLCAiTWljUCBTd2l0Y2giLCAiTUlDUCJ9LAorCisJLyogRGlnaXRhbCBMb29wdGFjayAqLworCXsiRGlnaXRhbCBMb29wYmFjayIsICJTd2l0Y2giLCAiQURDIn0sCisJeyJEQUMiLCBOVUxMLCAiRGlnaXRhbCBMb29wYmFjayJ9LAorfTsKKworc3RhdGljIGludCBuYXU4ODEwX3NldF9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCQkJIGludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCW5hdTg4MTAtPmNsa19pZCA9IGNsa19pZDsKKwluYXU4ODEwLT5zeXNjbGsgPSBmcmVxOworCWRldl9kYmcobmF1ODgxMC0+ZGV2LCAibWFzdGVyIHN5c2NsayAlZEh6LCBzb3VyY2UgJXNcbiIsCisJCWZyZXEsIGNsa19pZCA9PSBOQVU4ODEwX1NDTEtfUExMID8gIlBMTCIgOiAiTUNMSyIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmF1ODhsMF9jYWxjX3BsbCh1bnNpZ25lZCBpbnQgcGxsX2luLAorCXVuc2lnbmVkIGludCBmcywgc3RydWN0IG5hdTg4MTBfcGxsICpwbGxfcGFyYW0pCit7CisJdTY0IGYyLCBmMl9tYXgsIHBsbF9yYXRpbzsKKwlpbnQgaSwgc2NhbF9zZWw7CisKKwlpZiAocGxsX2luID4gTkFVX1BMTF9SRUZfTUFYIHx8IHBsbF9pbiA8IE5BVV9QTExfUkVGX01JTikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmMl9tYXggPSAwOworCXNjYWxfc2VsID0gQVJSQVlfU0laRShuYXU4ODEwX21jbGtfc2NhbGVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShuYXU4ODEwX21jbGtfc2NhbGVyKTsgaSsrKSB7CisJCWYyID0gMjU2ICogZnMgKiA0ICogbmF1ODgxMF9tY2xrX3NjYWxlcltpXSAvIDEwOworCQlpZiAoZjIgPiBOQVVfUExMX0ZSRVFfTUlOICYmIGYyIDwgTkFVX1BMTF9GUkVRX01BWCAmJgorCQkJZjJfbWF4IDwgZjIpIHsKKwkJCWYyX21heCA9IGYyOworCQkJc2NhbF9zZWwgPSBpOworCQl9CisJfQorCWlmIChBUlJBWV9TSVpFKG5hdTg4MTBfbWNsa19zY2FsZXIpID09IHNjYWxfc2VsKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwbGxfcGFyYW0tPm1jbGtfc2NhbGVyID0gc2NhbF9zZWw7CisJZjIgPSBmMl9tYXg7CisKKwkvKiBDYWxjdWxhdGUgdGhlIFBMTCA0LWJpdCBpbnRlZ2VyIGlucHV0IGFuZCB0aGUgUExMIDI0LWJpdCBmcmFjdGlvbmFsCisJICogaW5wdXQ7IHJvdW5kIHVwIHRoZSAyNCs0Yml0LgorCSAqLworCXBsbF9yYXRpbyA9IGRpdl91NjQoZjIgPDwgMjgsIHBsbF9pbik7CisJcGxsX3BhcmFtLT5wcmVfZmFjdG9yID0gMDsKKwlpZiAoKChwbGxfcmF0aW8gPj4gMjgpICYgMHhGKSA8IE5BVV9QTExfT1BUT1BfTUlOKSB7CisJCXBsbF9yYXRpbyA8PD0gMTsKKwkJcGxsX3BhcmFtLT5wcmVfZmFjdG9yID0gMTsKKwl9CisJcGxsX3BhcmFtLT5wbGxfaW50ID0gKHBsbF9yYXRpbyA+PiAyOCkgJiAweEY7CisJcGxsX3BhcmFtLT5wbGxfZnJhYyA9ICgocGxsX3JhdGlvICYgMHhGRkZGRkZGKSA+PiA0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5hdTg4MTBfc2V0X3BsbChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwgaW50IHBsbF9pZCwKKwlpbnQgc291cmNlLCB1bnNpZ25lZCBpbnQgZnJlcV9pbiwgdW5zaWduZWQgaW50IGZyZXFfb3V0KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlzdHJ1Y3QgcmVnbWFwICptYXAgPSBuYXU4ODEwLT5yZWdtYXA7CisJc3RydWN0IG5hdTg4MTBfcGxsICpwbGxfcGFyYW0gPSAmbmF1ODgxMC0+cGxsOworCWludCByZXQsIGZzOworCisJZnMgPSBmcmVxX291dCAvIDI1NjsKKwlyZXQgPSBuYXU4OGwwX2NhbGNfcGxsKGZyZXFfaW4sIGZzLCBwbGxfcGFyYW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIobmF1ODgxMC0+ZGV2LCAiVW5zdXBwb3J0ZWQgaW5wdXQgY2xvY2sgJWRcbiIsIGZyZXFfaW4pOworCQlyZXR1cm4gcmV0OworCX0KKwlkZXZfaW5mbyhuYXU4ODEwLT5kZXYsICJwbGxfaW50PSV4IHBsbF9mcmFjPSV4IG1jbGtfc2NhbGVyPSV4IHByZV9mYWN0b3I9JXhcbiIsCisJCXBsbF9wYXJhbS0+cGxsX2ludCwgcGxsX3BhcmFtLT5wbGxfZnJhYywgcGxsX3BhcmFtLT5tY2xrX3NjYWxlciwKKwkJcGxsX3BhcmFtLT5wcmVfZmFjdG9yKTsKKworCXJlZ21hcF91cGRhdGVfYml0cyhtYXAsIE5BVTg4MTBfUkVHX1BMTE4sCisJCU5BVTg4MTBfUExMTUNMS19ESVYyIHwgTkFVODgxMF9QTExOX01BU0ssCisJCShwbGxfcGFyYW0tPnByZV9mYWN0b3IgPyBOQVU4ODEwX1BMTE1DTEtfRElWMiA6IDApIHwKKwkJcGxsX3BhcmFtLT5wbGxfaW50KTsKKwlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QTExLMSwKKwkJKHBsbF9wYXJhbS0+cGxsX2ZyYWMgPj4gTkFVODgxMF9QTExLMV9TRlQpICYKKwkJTkFVODgxMF9QTExLMV9NQVNLKTsKKwlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QTExLMiwKKwkJKHBsbF9wYXJhbS0+cGxsX2ZyYWMgPj4gTkFVODgxMF9QTExLMl9TRlQpICYKKwkJTkFVODgxMF9QTExLMl9NQVNLKTsKKwlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QTExLMywKKwkJcGxsX3BhcmFtLT5wbGxfZnJhYyAmIE5BVTg4MTBfUExMSzNfTUFTSyk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgTkFVODgxMF9SRUdfQ0xPQ0ssIE5BVTg4MTBfTUNMS1NFTF9NQVNLLAorCQlwbGxfcGFyYW0tPm1jbGtfc2NhbGVyIDw8IE5BVTg4MTBfTUNMS1NFTF9TRlQpOworCXJlZ21hcF91cGRhdGVfYml0cyhtYXAsIE5BVTg4MTBfUkVHX0NMT0NLLAorCQlOQVU4ODEwX0NMS01fTUFTSywgTkFVODgxMF9DTEtNX1BMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuYXU4ODEwX3NldF9kYWlfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpLAorCQl1bnNpZ25lZCBpbnQgZm10KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1MTYgY3RybDFfdmFsID0gMCwgY3RybDJfdmFsID0gMDsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWN0cmwyX3ZhbCB8PSBOQVU4ODEwX0NMS0lPX01BU1RFUjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWN0cmwxX3ZhbCB8PSBOQVU4ODEwX0FJRk1UX0kyUzsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0xFRlRfSjoKKwkJY3RybDFfdmFsIHw9IE5BVTg4MTBfQUlGTVRfTEVGVDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJY3RybDFfdmFsIHw9IE5BVTg4MTBfQUlGTVRfUENNX0E7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX0lGOgorCQljdHJsMV92YWwgfD0gTkFVODgxMF9CQ0xLUF9JQiB8IE5BVTg4MTBfRlNQX0lGOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQljdHJsMV92YWwgfD0gTkFVODgxMF9CQ0xLUF9JQjsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9OQl9JRjoKKwkJY3RybDFfdmFsIHw9IE5BVTg4MTBfRlNQX0lGOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZWdtYXBfdXBkYXRlX2JpdHMobmF1ODgxMC0+cmVnbWFwLCBOQVU4ODEwX1JFR19JRkFDRSwKKwkJTkFVODgxMF9BSUZNVF9NQVNLIHwgTkFVODgxMF9GU1BfSUYgfAorCQlOQVU4ODEwX0JDTEtQX0lCLCBjdHJsMV92YWwpOworCXJlZ21hcF91cGRhdGVfYml0cyhuYXU4ODEwLT5yZWdtYXAsIE5BVTg4MTBfUkVHX0NMT0NLLAorCQlOQVU4ODEwX0NMS0lPX01BU0ssIGN0cmwyX3ZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuYXU4ODEwX21jbGtfY2xrZGl2KHN0cnVjdCBuYXU4ODEwICpuYXU4ODEwLCBpbnQgcmF0ZSkKK3sKKwlpbnQgaSwgc2NsaywgaW1jbGsgPSByYXRlICogMjU2LCBkaXYgPSAwOworCisJaWYgKCFuYXU4ODEwLT5zeXNjbGspIHsKKwkJZGV2X2VycihuYXU4ODEwLT5kZXYsICJNYWtlIG1jbGsgZGl2IGNvbmZpZ3VyYXRpb24gZmFpbCBiZWNhdXNlIG9mIGludmFsaWQgc3lzdGVtIGNsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ29uZmlndXJlIHRoZSBtYXN0ZXIgY2xvY2sgcHJlc2NhbGVyIGRpdiB0byBtYWtlIHN5c3RlbQorCSAqIGNsb2NrIHRvIGFwcHJveGltYXRlIHRoZSBpbnRlcm5hbCBtYXN0ZXIgY2xvY2sgKElNQ0xLKTsKKwkgKiBhbmQgbGFyZ2Ugb3IgZXF1YWwgdG8gSU1DTEsuCisJICovCisJZm9yIChpID0gMTsgaSA8IEFSUkFZX1NJWkUobmF1ODgxMF9tY2xrX3NjYWxlcik7IGkrKykgeworCQlzY2xrID0gKG5hdTg4MTAtPnN5c2NsayAqIDEwKSAvCisJCQluYXU4ODEwX21jbGtfc2NhbGVyW2ldOworCQlpZiAoc2NsayA8IGltY2xrKQorCQkJYnJlYWs7CisJCWRpdiA9IGk7CisJfQorCWRldl9kYmcobmF1ODgxMC0+ZGV2LAorCQkibWFzdGVyIGNsb2NrIHByZXNjYWxlciAleCBmb3IgZnMgJWRcbiIsIGRpdiwgcmF0ZSk7CisKKwkvKiBtYXN0ZXIgY2xvY2sgZnJvbSBNQ0xLIGFuZCBkaXNhYmxlIFBMTCAqLworCXJlZ21hcF91cGRhdGVfYml0cyhuYXU4ODEwLT5yZWdtYXAsIE5BVTg4MTBfUkVHX0NMT0NLLAorCQlOQVU4ODEwX01DTEtTRUxfTUFTSywgKGRpdiA8PCBOQVU4ODEwX01DTEtTRUxfU0ZUKSk7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKG5hdTg4MTAtPnJlZ21hcCwgTkFVODgxMF9SRUdfQ0xPQ0ssCisJCU5BVTg4MTBfQ0xLTV9NQVNLLCBOQVU4ODEwX0NMS01fTUNMSyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuYXU4ODEwX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IG5hdTg4MTAgKm5hdTg4MTAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgdmFsX2xlbiA9IDAsIHZhbF9yYXRlID0gMCwgcmV0ID0gMDsKKworCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwljYXNlIDE2OgorCQlicmVhazsKKwljYXNlIDIwOgorCQl2YWxfbGVuIHw9IE5BVTg4MTBfV0xFTl8yMDsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJdmFsX2xlbiB8PSBOQVU4ODEwX1dMRU5fMjQ7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXZhbF9sZW4gfD0gTkFVODgxMF9XTEVOXzMyOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHBhcmFtc19yYXRlKHBhcmFtcykpIHsKKwljYXNlIDgwMDA6CisJCXZhbF9yYXRlIHw9IE5BVTg4MTBfU01QTFJfOEs7CisJCWJyZWFrOworCWNhc2UgMTEwMjU6CisJCXZhbF9yYXRlIHw9IE5BVTg4MTBfU01QTFJfMTJLOworCQlicmVhazsKKwljYXNlIDE2MDAwOgorCQl2YWxfcmF0ZSB8PSBOQVU4ODEwX1NNUExSXzE2SzsKKwkJYnJlYWs7CisJY2FzZSAyMjA1MDoKKwkJdmFsX3JhdGUgfD0gTkFVODgxMF9TTVBMUl8yNEs7CisJCWJyZWFrOworCWNhc2UgMzIwMDA6CisJCXZhbF9yYXRlIHw9IE5BVTg4MTBfU01QTFJfMzJLOworCQlicmVhazsKKwljYXNlIDQ0MTAwOgorCWNhc2UgNDgwMDA6CisJCWJyZWFrOworCX0KKworCXJlZ21hcF91cGRhdGVfYml0cyhuYXU4ODEwLT5yZWdtYXAsIE5BVTg4MTBfUkVHX0lGQUNFLAorCQlOQVU4ODEwX1dMRU5fTUFTSywgdmFsX2xlbik7CisJcmVnbWFwX3VwZGF0ZV9iaXRzKG5hdTg4MTAtPnJlZ21hcCwgTkFVODgxMF9SRUdfU01QTFIsCisJCU5BVTg4MTBfU01QTFJfTUFTSywgdmFsX3JhdGUpOworCisJLyogSWYgdGhlIG1hc3RlciBjbG9jayBpcyBmcm9tIE1DTEssIHByb3ZpZGUgdGhlIHJ1bnRpbWUgRlMgZm9yIGRyaXZlcgorCSAqIHRvIGdldCB0aGUgbWFzdGVyIGNsb2NrIHByZXNjYWxlciBjb25maWd1cmF0aW9uLgorCSAqLworCWlmIChuYXU4ODEwLT5jbGtfaWQgPT0gTkFVODgxMF9TQ0xLX01DTEspIHsKKwkJcmV0ID0gbmF1ODgxMF9tY2xrX2Nsa2RpdihuYXU4ODEwLCBwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKG5hdTg4MTAtPmRldiwgIk1DTEsgZGl2IGNvbmZpZ3VyYXRpb24gZmFpbFxuIik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBuYXU4ODEwX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKK3sKKwlzdHJ1Y3QgbmF1ODgxMCAqbmF1ODgxMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCByZWdtYXAgKm1hcCA9IG5hdTg4MTAtPnJlZ21hcDsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgorCQlyZWdtYXBfdXBkYXRlX2JpdHMobWFwLCBOQVU4ODEwX1JFR19QT1dFUjEsCisJCQlOQVU4ODEwX1JFRklNUF9NQVNLLCBOQVU4ODEwX1JFRklNUF84MEspOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCXJlZ21hcF91cGRhdGVfYml0cyhtYXAsIE5BVTg4MTBfUkVHX1BPV0VSMSwKKwkJCU5BVTg4MTBfSU9CVUZfRU4gfCBOQVU4ODEwX0FCSUFTX0VOLAorCQkJTkFVODgxMF9JT0JVRl9FTiB8IE5BVTg4MTBfQUJJQVNfRU4pOworCisJCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CisJCQlyZWdjYWNoZV9zeW5jKG1hcCk7CisJCQlyZWdtYXBfdXBkYXRlX2JpdHMobWFwLCBOQVU4ODEwX1JFR19QT1dFUjEsCisJCQkJTkFVODgxMF9SRUZJTVBfTUFTSywgTkFVODgxMF9SRUZJTVBfM0spOworCQkJbWRlbGF5KDEwMCk7CisJCX0KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgTkFVODgxMF9SRUdfUE9XRVIxLAorCQkJTkFVODgxMF9SRUZJTVBfTUFTSywgTkFVODgxMF9SRUZJTVBfMzAwSyk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QT1dFUjEsIDApOworCQlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QT1dFUjIsIDApOworCQlyZWdtYXBfd3JpdGUobWFwLCBOQVU4ODEwX1JFR19QT1dFUjMsIDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisjZGVmaW5lIE5BVTg4MTBfUkFURVMgKFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDApCisKKyNkZWZpbmUgTkFVODgxMF9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzIwXzNMRSB8IFwKKwlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBuYXU4ODEwX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gbmF1ODgxMF9wY21faHdfcGFyYW1zLAorCS5zZXRfZm10ID0gbmF1ODgxMF9zZXRfZGFpX2ZtdCwKKwkuc2V0X3N5c2NsayA9IG5hdTg4MTBfc2V0X3N5c2NsaywKKwkuc2V0X3BsbCA9IG5hdTg4MTBfc2V0X3BsbCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG5hdTg4MTBfZGFpID0geworCS5uYW1lID0gIm5hdTg4MTAtaGlmaSIsCisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAorCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21heCA9IDIsICAgLyogT25seSAxIGNoYW5uZWwgb2YgZGF0YSAqLworCQkucmF0ZXMgPSBOQVU4ODEwX1JBVEVTLAorCQkuZm9ybWF0cyA9IE5BVTg4MTBfRk9STUFUUywKKwl9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiQ2FwdHVyZSIsCisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwgICAvKiBPbmx5IDEgY2hhbm5lbCBvZiBkYXRhICovCisJCS5yYXRlcyA9IE5BVTg4MTBfUkFURVMsCisJCS5mb3JtYXRzID0gTkFVODgxMF9GT1JNQVRTLAorCX0sCisJLm9wcyA9ICZuYXU4ODEwX29wcywKKwkuc3ltbWV0cmljX3JhdGVzID0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBuYXU4ODEwX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gNywKKwkudmFsX2JpdHMgPSA5LAorCisJLm1heF9yZWdpc3RlciA9IE5BVTg4MTBfUkVHX01BWCwKKwkucmVhZGFibGVfcmVnID0gbmF1ODgxMF9yZWFkYWJsZV9yZWcsCisJLndyaXRlYWJsZV9yZWcgPSBuYXU4ODEwX3dyaXRlYWJsZV9yZWcsCisJLnZvbGF0aWxlX3JlZyA9IG5hdTg4MTBfdm9sYXRpbGVfcmVnLAorCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJlZ19kZWZhdWx0cyA9IG5hdTg4MTBfcmVnX2RlZmF1bHRzLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShuYXU4ODEwX3JlZ19kZWZhdWx0cyksCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIG5hdTg4MTBfY29kZWNfZHJpdmVyID0geworCS5zZXRfYmlhc19sZXZlbCA9IG5hdTg4MTBfc2V0X2JpYXNfbGV2ZWwsCisJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAorCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scyA9IG5hdTg4MTBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShuYXU4ODEwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMgPSBuYXU4ODEwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG5hdTg4MTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzID0gbmF1ODgxMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobmF1ODgxMF9kYXBtX3JvdXRlcyksCisJfSwKK307CisKK3N0YXRpYyBpbnQgbmF1ODgxMF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmkyYy0+ZGV2OworCXN0cnVjdCBuYXU4ODEwICpuYXU4ODEwID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOworCisJaWYgKCFuYXU4ODEwKSB7CisJCW5hdTg4MTAgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKm5hdTg4MTApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuYXU4ODEwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIG5hdTg4MTApOworCisJbmF1ODgxMC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmbmF1ODgxMF9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKG5hdTg4MTAtPnJlZ21hcCkpCisJCXJldHVybiBQVFJfRVJSKG5hdTg4MTAtPnJlZ21hcCk7CisJbmF1ODgxMC0+ZGV2ID0gZGV2OworCisJcmVnbWFwX3dyaXRlKG5hdTg4MTAtPnJlZ21hcCwgTkFVODgxMF9SRUdfUkVTRVQsIDB4MDApOworCisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoZGV2LAorCQkmbmF1ODgxMF9jb2RlY19kcml2ZXIsICZuYXU4ODEwX2RhaSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgbmF1ODgxMF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG5hdTg4MTBfaTJjX2lkW10gPSB7CisJeyAibmF1ODgxMCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbmF1ODgxMF9pMmNfaWQpOworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBuYXU4ODEwX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudXZvdG9uLG5hdTg4MTAiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG5hdTg4MTBfb2ZfbWF0Y2gpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBuYXU4ODEwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibmF1ODgxMCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihuYXU4ODEwX29mX21hdGNoKSwKKwl9LAorCS5wcm9iZSA9ICAgIG5hdTg4MTBfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSAgIG5hdTg4MTBfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBuYXU4ODEwX2kyY19pZCwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKG5hdTg4MTBfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBOQVU4ODEwIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiRGF2aWQgTGluIDxjdGxpbjBAbnV2b3Rvbi5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL25hdTg4MTAuaCBiL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgxMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODgyNjUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL25hdTg4MTAuaApAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIE5BVTg4MTAgQUxTQSBTb0MgYXVkaW8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTYgTnV2b3RvbiBUZWNobm9sb2d5IENvcnAuCisgKiBBdXRob3I6IERhdmlkIExpbiA8Y3RsaW4wQG51dm90b24uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBfX05BVTg4MTBfSF9fCisjZGVmaW5lIF9fTkFVODgxMF9IX18KKworI2RlZmluZSBOQVU4ODEwX1JFR19SRVNFVAkJMHgwMAorI2RlZmluZSBOQVU4ODEwX1JFR19QT1dFUjEJCTB4MDEKKyNkZWZpbmUgTkFVODgxMF9SRUdfUE9XRVIyCQkweDAyCisjZGVmaW5lIE5BVTg4MTBfUkVHX1BPV0VSMwkJMHgwMworI2RlZmluZSBOQVU4ODEwX1JFR19JRkFDRQkJMHgwNAorI2RlZmluZSBOQVU4ODEwX1JFR19DT01QCQkweDA1CisjZGVmaW5lIE5BVTg4MTBfUkVHX0NMT0NLCQkweDA2CisjZGVmaW5lIE5BVTg4MTBfUkVHX1NNUExSCQkweDA3CisjZGVmaW5lIE5BVTg4MTBfUkVHX0RBQwkJMHgwQQorI2RlZmluZSBOQVU4ODEwX1JFR19EQUNHQUlOCQkweDBCCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FEQwkJMHgwRQorI2RlZmluZSBOQVU4ODEwX1JFR19BRENHQUlOCQkweDBGCisjZGVmaW5lIE5BVTg4MTBfUkVHX0VRMQkJMHgxMgorI2RlZmluZSBOQVU4ODEwX1JFR19FUTIJCTB4MTMKKyNkZWZpbmUgTkFVODgxMF9SRUdfRVEzCQkweDE0CisjZGVmaW5lIE5BVTg4MTBfUkVHX0VRNAkJMHgxNQorI2RlZmluZSBOQVU4ODEwX1JFR19FUTUJCTB4MTYKKyNkZWZpbmUgTkFVODgxMF9SRUdfREFDTElNMQkJMHgxOAorI2RlZmluZSBOQVU4ODEwX1JFR19EQUNMSU0yCQkweDE5CisjZGVmaW5lIE5BVTg4MTBfUkVHX05PVENIMQkJMHgxQgorI2RlZmluZSBOQVU4ODEwX1JFR19OT1RDSDIJCTB4MUMKKyNkZWZpbmUgTkFVODgxMF9SRUdfTk9UQ0gzCQkweDFECisjZGVmaW5lIE5BVTg4MTBfUkVHX05PVENINAkJMHgxRQorI2RlZmluZSBOQVU4ODEwX1JFR19BTEMxCQkweDIwCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FMQzIJCTB4MjEKKyNkZWZpbmUgTkFVODgxMF9SRUdfQUxDMwkJMHgyMgorI2RlZmluZSBOQVU4ODEwX1JFR19OT0lTRUdBVEUJCTB4MjMKKyNkZWZpbmUgTkFVODgxMF9SRUdfUExMTgkJMHgyNAorI2RlZmluZSBOQVU4ODEwX1JFR19QTExLMQkJMHgyNQorI2RlZmluZSBOQVU4ODEwX1JFR19QTExLMgkJMHgyNgorI2RlZmluZSBOQVU4ODEwX1JFR19QTExLMwkJMHgyNworI2RlZmluZSBOQVU4ODEwX1JFR19BVFRFTgkJMHgyOAorI2RlZmluZSBOQVU4ODEwX1JFR19JTlBVVF9TSUdOQUwJMHgyQworI2RlZmluZSBOQVU4ODEwX1JFR19QR0FHQUlOCQkweDJECisjZGVmaW5lIE5BVTg4MTBfUkVHX0FEQ0JPT1NUCQkweDJGCisjZGVmaW5lIE5BVTg4MTBfUkVHX09VVFBVVAkJMHgzMQorI2RlZmluZSBOQVU4ODEwX1JFR19TUEtNSVgJCTB4MzIKKyNkZWZpbmUgTkFVODgxMF9SRUdfU1BLR0FJTgkJMHgzNgorI2RlZmluZSBOQVU4ODEwX1JFR19NT05PTUlYCQkweDM4CisjZGVmaW5lIE5BVTg4MTBfUkVHX1BPV0VSNAkJMHgzQQorI2RlZmluZSBOQVU4ODEwX1JFR19UU0xPVENUTDEJCTB4M0IKKyNkZWZpbmUgTkFVODgxMF9SRUdfVFNMT1RDVEwyCQkweDNDCisjZGVmaW5lIE5BVTg4MTBfUkVHX0RFVklDRV9SRVZJRAkweDNFCisjZGVmaW5lIE5BVTg4MTBfUkVHX0kyQ19ERVZJQ0VJRAkweDNGCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FERElUSU9OSUQJMHg0MAorI2RlZmluZSBOQVU4ODEwX1JFR19SRVNFUlZFCQkweDQxCisjZGVmaW5lIE5BVTg4MTBfUkVHX09VVENUTAkJMHg0NQorI2RlZmluZSBOQVU4ODEwX1JFR19BTEMxRU5IQU4xCTB4NDYKKyNkZWZpbmUgTkFVODgxMF9SRUdfQUxDMUVOSEFOMgkweDQ3CisjZGVmaW5lIE5BVTg4MTBfUkVHX01JU0NDVEwJCTB4NDkKKyNkZWZpbmUgTkFVODgxMF9SRUdfT1VUVElFT0ZGCQkweDRCCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FHQ1AyUE9VVAkweDRDCisjZGVmaW5lIE5BVTg4MTBfUkVHX0FHQ1BPVVQJCTB4NEQKKyNkZWZpbmUgTkFVODgxMF9SRUdfQU1UQ1RMCQkweDRFCisjZGVmaW5lIE5BVTg4MTBfUkVHX09VVFRJRU9GRk1BTgkweDRGCisjZGVmaW5lIE5BVTg4MTBfUkVHX01BWAkJTkFVODgxMF9SRUdfT1VUVElFT0ZGTUFOCisKKworLyogTkFVODgxMF9SRUdfUE9XRVIxICgweDEpICovCisjZGVmaW5lIE5BVTg4MTBfRENCVUZfRU4JCSgweDEgPDwgOCkKKyNkZWZpbmUgTkFVODgxMF9QTExfRU5fU0ZUCQk1CisjZGVmaW5lIE5BVTg4MTBfTUlDQklBU19FTl9TRlQJNAorI2RlZmluZSBOQVU4ODEwX0FCSUFTX0VOCQkoMHgxIDw8IDMpCisjZGVmaW5lIE5BVTg4MTBfSU9CVUZfRU4JCSgweDEgPDwgMikKKyNkZWZpbmUgTkFVODgxMF9SRUZJTVBfTUFTSwkJMHgzCisjZGVmaW5lIE5BVTg4MTBfUkVGSU1QX0RJUwkJMHgwCisjZGVmaW5lIE5BVTg4MTBfUkVGSU1QXzgwSwkJMHgxCisjZGVmaW5lIE5BVTg4MTBfUkVGSU1QXzMwMEsJCTB4MgorI2RlZmluZSBOQVU4ODEwX1JFRklNUF8zSwkJMHgzCisKKy8qIE5BVTg4MTBfUkVHX1BPV0VSMiAoMHgyKSAqLworI2RlZmluZSBOQVU4ODEwX0JTVF9FTl9TRlQJCTQKKyNkZWZpbmUgTkFVODgxMF9QR0FfRU5fU0ZUCQkyCisjZGVmaW5lIE5BVTg4MTBfQURDX0VOX1NGVAkJMAorCisvKiBOQVU4ODEwX1JFR19QT1dFUjMgKDB4MykgKi8KKyNkZWZpbmUgTkFVODgxMF9EQUNfRU5fU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfU1BLTVhfRU5fU0ZUCQkyCisjZGVmaW5lIE5BVTg4MTBfTU9VVE1YX0VOX1NGVAkzCisjZGVmaW5lIE5BVTg4MTBfUFNQS19FTl9TRlQJCTUKKyNkZWZpbmUgTkFVODgxMF9OU1BLX0VOX1NGVAkJNgorI2RlZmluZSBOQVU4ODEwX01PVVRfRU5fU0ZUCQk3CisKKy8qIE5BVTg4MTBfUkVHX0lGQUNFICgweDQpICovCisjZGVmaW5lIE5BVTg4MTBfQUlGTVRfU0ZUCQkzCisjZGVmaW5lIE5BVTg4MTBfQUlGTVRfTUFTSwkJKDB4MyA8PCBOQVU4ODEwX0FJRk1UX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9BSUZNVF9SSUdIVAkJKDB4MCA8PCBOQVU4ODEwX0FJRk1UX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9BSUZNVF9MRUZUCQkoMHgxIDw8IE5BVTg4MTBfQUlGTVRfU0ZUKQorI2RlZmluZSBOQVU4ODEwX0FJRk1UX0kyUwkJKDB4MiA8PCBOQVU4ODEwX0FJRk1UX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9BSUZNVF9QQ01fQQkJKDB4MyA8PCBOQVU4ODEwX0FJRk1UX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9XTEVOX1NGVAkJNQorI2RlZmluZSBOQVU4ODEwX1dMRU5fTUFTSwkJKDB4MyA8PCBOQVU4ODEwX1dMRU5fU0ZUKQorI2RlZmluZSBOQVU4ODEwX1dMRU5fMTYJCSgweDAgPDwgTkFVODgxMF9XTEVOX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9XTEVOXzIwCQkoMHgxIDw8IE5BVTg4MTBfV0xFTl9TRlQpCisjZGVmaW5lIE5BVTg4MTBfV0xFTl8yNAkJKDB4MiA8PCBOQVU4ODEwX1dMRU5fU0ZUKQorI2RlZmluZSBOQVU4ODEwX1dMRU5fMzIJCSgweDMgPDwgTkFVODgxMF9XTEVOX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9GU1BfSUYJCQkoMHgxIDw8IDcpCisjZGVmaW5lIE5BVTg4MTBfQkNMS1BfSUIJCSgweDEgPDwgOCkKKworLyogTkFVODgxMF9SRUdfQ09NUCAoMHg1KSAqLworI2RlZmluZSBOQVU4ODEwX0FEREFQX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0FEQ0NNX1NGVAkJMQorI2RlZmluZSBOQVU4ODEwX0RBQ0NNX1NGVAkJMworCisvKiBOQVU4ODEwX1JFR19DTE9DSyAoMHg2KSAqLworI2RlZmluZSBOQVU4ODEwX0NMS0lPX01BU0sJCTB4MQorI2RlZmluZSBOQVU4ODEwX0NMS0lPX1NMQVZFCQkweDAKKyNkZWZpbmUgTkFVODgxMF9DTEtJT19NQVNURVIJCTB4MQorI2RlZmluZSBOQVU4ODEwX0JDTEtTRUxfU0ZUCQkyCisjZGVmaW5lIE5BVTg4MTBfQkNMS1NFTF9NQVNLCQkoMHg3IDw8IE5BVTg4MTBfQkNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQkNMS0RJVl8xCQkoMHgwIDw8IE5BVTg4MTBfQkNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQkNMS0RJVl8yCQkoMHgxIDw8IE5BVTg4MTBfQkNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQkNMS0RJVl80CQkoMHgyIDw8IE5BVTg4MTBfQkNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQkNMS0RJVl84CQkoMHgzIDw8IE5BVTg4MTBfQkNMS1NFTF9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQkNMS0RJVl8xNgkJKDB4NCA8PCBOQVU4ODEwX0JDTEtTRUxfU0ZUKQorI2RlZmluZSBOQVU4ODEwX0JDTEtESVZfMzIJCSgweDUgPDwgTkFVODgxMF9CQ0xLU0VMX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9NQ0xLU0VMX1NGVAkJNQorI2RlZmluZSBOQVU4ODEwX01DTEtTRUxfTUFTSwkJKDB4NyA8PCBOQVU4ODEwX01DTEtTRUxfU0ZUKQorI2RlZmluZSBOQVU4ODEwX0NMS01fU0ZUCQk4CisjZGVmaW5lIE5BVTg4MTBfQ0xLTV9NQVNLCQkoMHgxIDw8IE5BVTg4MTBfQ0xLTV9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQ0xLTV9NQ0xLCQkoMHgwIDw8IE5BVTg4MTBfQ0xLTV9TRlQpCisjZGVmaW5lIE5BVTg4MTBfQ0xLTV9QTEwJCSgweDEgPDwgTkFVODgxMF9DTEtNX1NGVCkKKworLyogTkFVODgxMF9SRUdfU01QTFIgKDB4NykgKi8KKyNkZWZpbmUgTkFVODgxMF9TTVBMUl9TRlQJCTEKKyNkZWZpbmUgTkFVODgxMF9TTVBMUl9NQVNLCQkoMHg3IDw8IE5BVTg4MTBfU01QTFJfU0ZUKQorI2RlZmluZSBOQVU4ODEwX1NNUExSXzQ4SwkJKDB4MCA8PCBOQVU4ODEwX1NNUExSX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9TTVBMUl8zMksJCSgweDEgPDwgTkFVODgxMF9TTVBMUl9TRlQpCisjZGVmaW5lIE5BVTg4MTBfU01QTFJfMjRLCQkoMHgyIDw8IE5BVTg4MTBfU01QTFJfU0ZUKQorI2RlZmluZSBOQVU4ODEwX1NNUExSXzE2SwkJKDB4MyA8PCBOQVU4ODEwX1NNUExSX1NGVCkKKyNkZWZpbmUgTkFVODgxMF9TTVBMUl8xMksJCSgweDQgPDwgTkFVODgxMF9TTVBMUl9TRlQpCisjZGVmaW5lIE5BVTg4MTBfU01QTFJfOEsJCSgweDUgPDwgTkFVODgxMF9TTVBMUl9TRlQpCisKKy8qIE5BVTg4MTBfUkVHX0RBQyAoMHhBKSAqLworI2RlZmluZSBOQVU4ODEwX0RBQ1BMX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0RBQ09TX1NGVAkJMworI2RlZmluZSBOQVU4ODEwX0RFRU1QX1NGVAkJNAorCisvKiBOQVU4ODEwX1JFR19EQUNHQUlOICgweEIpICovCisjZGVmaW5lIE5BVTg4MTBfREFDR0FJTl9TRlQJCTAKKworLyogTkFVODgxMF9SRUdfQURDICgweEUpICovCisjZGVmaW5lIE5BVTg4MTBfQURDUExfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfQURDT1NfU0ZUCQkzCisjZGVmaW5lIE5BVTg4MTBfSFBGX1NGVAkJNAorI2RlZmluZSBOQVU4ODEwX0hQRkVOX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19BRENHQUlOICgweEYpICovCisjZGVmaW5lIE5BVTg4MTBfQURDR0FJTl9TRlQJCTAKKworLyogTkFVODgxMF9SRUdfRVExICgweDEyKSAqLworI2RlZmluZSBOQVU4ODEwX0VRMUdDX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0VRMUNGX1NGVAkJNQorI2RlZmluZSBOQVU4ODEwX0VRTV9TRlQJCTgKKworLyogTkFVODgxMF9SRUdfRVEyICgweDEzKSAqLworI2RlZmluZSBOQVU4ODEwX0VRMkdDX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0VRMkNGX1NGVAkJNQorI2RlZmluZSBOQVU4ODEwX0VRMkJXX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19FUTMgKDB4MTQpICovCisjZGVmaW5lIE5BVTg4MTBfRVEzR0NfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfRVEzQ0ZfU0ZUCQk1CisjZGVmaW5lIE5BVTg4MTBfRVEzQldfU0ZUCQk4CisKKy8qIE5BVTg4MTBfUkVHX0VRNCAoMHgxNSkgKi8KKyNkZWZpbmUgTkFVODgxMF9FUTRHQ19TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9FUTRDRl9TRlQJCTUKKyNkZWZpbmUgTkFVODgxMF9FUTRCV19TRlQJCTgKKworLyogTkFVODgxMF9SRUdfRVE1ICgweDE2KSAqLworI2RlZmluZSBOQVU4ODEwX0VRNUdDX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0VRNUNGX1NGVAkJNQorCisvKiBOQVU4ODEwX1JFR19EQUNMSU0xICgweDE4KSAqLworI2RlZmluZSBOQVU4ODEwX0RBQ0xJTUFUS19TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9EQUNMSU1EQ1lfU0ZUCQk0CisjZGVmaW5lIE5BVTg4MTBfREFDTElNRU5fU0ZUCQk4CisKKy8qIE5BVTg4MTBfUkVHX0RBQ0xJTTIgKDB4MTkpICovCisjZGVmaW5lIE5BVTg4MTBfREFDTElNQlNUX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0RBQ0xJTVRITF9TRlQJCTQKKworLyogTkFVODgxMF9SRUdfQUxDMSAoMHgyMCkgKi8KKyNkZWZpbmUgTkFVODgxMF9BTENNSU5HQUlOX1NGVAkwCisjZGVmaW5lIE5BVTg4MTBfQUxDTVhHQUlOX1NGVAkJMworI2RlZmluZSBOQVU4ODEwX0FMQ0VOX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19BTEMyICgweDIxKSAqLworI2RlZmluZSBOQVU4ODEwX0FMQ1NMX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0FMQ0hUX1NGVAkJNAorI2RlZmluZSBOQVU4ODEwX0FMQ1pDX1NGVAkJOAorCisvKiBOQVU4ODEwX1JFR19BTEMzICgweDIyKSAqLworI2RlZmluZSBOQVU4ODEwX0FMQ0FUS19TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9BTENEQ1lfU0ZUCQk0CisjZGVmaW5lIE5BVTg4MTBfQUxDTV9TRlQJCTgKKworLyogTkFVODgxMF9SRUdfTk9JU0VHQVRFICgweDIzKSAqLworI2RlZmluZSBOQVU4ODEwX0FMQ05USF9TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9BTENORU5fU0ZUCQkzCisKKy8qIE5BVTg4MTBfUkVHX1BMTE4gKDB4MjQpICovCisjZGVmaW5lIE5BVTg4MTBfUExMTl9NQVNLCQkweEYKKyNkZWZpbmUgTkFVODgxMF9QTExNQ0xLX0RJVjIJCSgweDEgPDwgNCkKKworLyogTkFVODgxMF9SRUdfUExMSzEgKDB4MjUpICovCisjZGVmaW5lIE5BVTg4MTBfUExMSzFfU0ZUCQkxOAorI2RlZmluZSBOQVU4ODEwX1BMTEsxX01BU0sJCTB4M0YKKworLyogTkFVODgxMF9SRUdfUExMSzIgKDB4MjYpICovCisjZGVmaW5lIE5BVTg4MTBfUExMSzJfU0ZUCQk5CisjZGVmaW5lIE5BVTg4MTBfUExMSzJfTUFTSwkJMHgxRkYKKworLyogTkFVODgxMF9SRUdfUExMSzMgKDB4MjcpICovCisjZGVmaW5lIE5BVTg4MTBfUExMSzNfTUFTSwkJMHgxRkYKKworLyogTkFVODgxMF9SRUdfSU5QVVRfU0lHTkFMICgweDJDKSAqLworI2RlZmluZSBOQVU4ODEwX1BNSUNQR0FfU0ZUCQkwCisjZGVmaW5lIE5BVTg4MTBfTk1JQ1BHQV9TRlQJCTEKKworLyogTkFVODgxMF9SRUdfUEdBR0FJTiAoMHgyRCkgKi8KKyNkZWZpbmUgTkFVODgxMF9QR0FHQUlOX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX1BHQU1UX1NGVAkJNgorI2RlZmluZSBOQVU4ODEwX1BHQVpDX1NGVAkJNworCisvKiBOQVU4ODEwX1JFR19BRENCT09TVCAoMHgyRikgKi8KKyNkZWZpbmUgTkFVODgxMF9QTUlDQlNUR0FJTl9TRlQJNAorI2RlZmluZSBOQVU4ODEwX1BHQUJTVF9TRlQJCTgKKworLyogTkFVODgxMF9SRUdfU1BLTUlYICgweDMyKSAqLworI2RlZmluZSBOQVU4ODEwX0RBQ1NQS19TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9CWVBTUEtfU0ZUCQkxCisKKy8qIE5BVTg4MTBfUkVHX1NQS0dBSU4gKDB4MzYpICovCisjZGVmaW5lIE5BVTg4MTBfU1BLR0FJTl9TRlQJCTAKKyNkZWZpbmUgTkFVODgxMF9TUEtNVF9TRlQJCTYKKyNkZWZpbmUgTkFVODgxMF9TUEtaQ19TRlQJCTcKKworLyogTkFVODgxMF9SRUdfTU9OT01JWCAoMHgzOCkgKi8KKyNkZWZpbmUgTkFVODgxMF9EQUNNT1VUX1NGVAkJMAorI2RlZmluZSBOQVU4ODEwX0JZUE1PVVRfU0ZUCQkxCisjZGVmaW5lIE5BVTg4MTBfTU9VVE1YTVRfU0ZUCQk2CisKKworLyogU3lzdGVtIENsb2NrIFNvdXJjZSAqLworZW51bSB7CisJTkFVODgxMF9TQ0xLX01DTEssCisJTkFVODgxMF9TQ0xLX1BMTCwKK307CisKK3N0cnVjdCBuYXU4ODEwX3BsbCB7CisJaW50IHByZV9mYWN0b3I7CisJaW50IG1jbGtfc2NhbGVyOworCWludCBwbGxfZnJhYzsKKwlpbnQgcGxsX2ludDsKK307CisKK3N0cnVjdCBuYXU4ODEwIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBuYXU4ODEwX3BsbCBwbGw7CisJaW50IHN5c2NsazsKKwlpbnQgY2xrX2lkOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL25hdTg4MjUuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgyNS5jCmluZGV4IDJlNTlhODUuLmU2NDNiZTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgyNS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvbmF1ODgyNS5jCkBAIC0xOTA3LDcgKzE5MDcsNyBAQAogCS8qIENhbGN1bGF0ZSB0aGUgRkxMIDEwLWJpdCBpbnRlZ2VyIGlucHV0IGFuZCB0aGUgRkxMIDE2LWJpdCBmcmFjdGlvbmFsCiAJICogaW5wdXQgYmFzZWQgb24gRkRDTywgRlJFRiBhbmQgRkxMIHJhdGlvLgogCSAqLwotCWZ2Y28gPSBkaXZfdTY0KGZ2Y28gPDwgMTYsIGZyZWYgKiBmbGxfcGFyYW0tPnJhdGlvKTsKKwlmdmNvID0gZGl2X3U2NChmdmNvX21heCA8PCAxNiwgZnJlZiAqIGZsbF9wYXJhbS0+cmF0aW8pOwogCWZsbF9wYXJhbS0+ZmxsX2ludCA9IChmdmNvID4+IDE2KSAmIDB4M0ZGOwogCWZsbF9wYXJhbS0+ZmxsX2ZyYWMgPSBmdmNvICYgMHhGRkZGOwogCXJldHVybiAwOwpAQCAtMjI1NiwxMiArMjI1NiwxNCBAQAogCS5zdXNwZW5kID0gbmF1ODgyNV9zdXNwZW5kLAogCS5yZXN1bWUgPSBuYXU4ODI1X3Jlc3VtZSwKIAotCS5jb250cm9scyA9IG5hdTg4MjVfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobmF1ODgyNV9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IG5hdTg4MjVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShuYXU4ODI1X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gbmF1ODgyNV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShuYXU4ODI1X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IG5hdTg4MjVfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShuYXU4ODI1X2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBuYXU4ODI1X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKG5hdTg4MjVfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IG5hdTg4MjVfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKG5hdTg4MjVfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBuYXU4ODI1X3Jlc2V0X2NoaXAoc3RydWN0IHJlZ21hcCAqcmVnbWFwKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY20xNjgxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTE2ODEuYwppbmRleCAzM2UxZmMyZC4uMGIxNGVmYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9wY20xNjgxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY20xNjgxLmMKQEAgLTI4OSwxMiArMjg5LDE0IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfcGNtMTY4MSA9IHsKLQkuY29udHJvbHMJCT0gcGNtMTY4MV9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocGNtMTY4MV9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkJPSBwY20xNjgxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocGNtMTY4MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSBwY20xNjgxX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHBjbTE2ODFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcGNtMTY4MV9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHBjbTE2ODFfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHBjbTE2ODFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocGNtMTY4MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcGNtMTY4MV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocGNtMTY4MV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBwY20xNjgxX2kyY19pZFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY20xNzl4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTE3OXguYwppbmRleCA4OGZiZGQxLi5iODEzYTE1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3BjbTE3OXguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTE3OXguYwpAQCAtMjA2LDEyICsyMDYsMTQgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHBjbTE3OXhfcmVnbWFwX2NvbmZpZyk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9wY20xNzl4ID0gewotCS5jb250cm9scwkJPSBwY20xNzl4X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShwY20xNzl4X2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCQk9IHBjbTE3OXhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShwY20xNzl4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCQk9IHBjbTE3OXhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocGNtMTc5eF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBwY20xNzl4X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocGNtMTc5eF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcGNtMTc5eF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShwY20xNzl4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBwY20xNzl4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShwY20xNzl4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogaW50IHBjbTE3OXhfY29tbW9uX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3BjbTMwMDguYyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMzAwOC5jCmluZGV4IDhmYjQ0NWYuLjcwOGFmMDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtMzAwOC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMzAwOC5jCkBAIC05OSwxMCArOTksMTIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl9wY20zMDA4ID0gewotCS5kYXBtX3dpZGdldHMgPSBwY20zMDA4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocGNtMzAwOF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHBjbTMwMDhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocGNtMzAwOF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gcGNtMzAwOF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShwY20zMDA4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBwY20zMDA4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShwY20zMDA4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCBwY20zMDA4X2NvZGVjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3BjbTMxNjhhLmMgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTMxNjhhLmMKaW5kZXggOTkyYTc3ZS4uMzliYzAyZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9wY20zMTY4YS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcGNtMzE2OGEuYwpAQCAtNTk5LDEyICs1OTksMTQgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBwY20zMTY4YV9kcml2ZXIgPSB7CiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHBjbTMxNjhhX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShwY20zMTY4YV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBwY20zMTY4YV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHBjbTMxNjhhX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcGNtMzE2OGFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocGNtMzE2OGFfZGFwbV9yb3V0ZXMpCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBwY20zMTY4YV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShwY20zMTY4YV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHBjbTMxNjhhX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHBjbTMxNjhhX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBwY20zMTY4YV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocGNtMzE2OGFfZGFwbV9yb3V0ZXMpCisJfSwKIH07CiAKIGludCBwY20zMTY4YV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcGNtNTEyeC5jIGIvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmMKaW5kZXggMDQ3YzQ4OS4uNzJiMTllNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmMKQEAgLTEzNDgsMTIgKzEzNDgsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBwY201MTJ4X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHBjbTUxMnhfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocGNtNTEyeF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHBjbTUxMnhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShwY201MTJ4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcGNtNTEyeF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShwY201MTJ4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHBjbTUxMnhfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShwY201MTJ4X2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBwY201MTJ4X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHBjbTUxMnhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHBjbTUxMnhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHBjbTUxMnhfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9yYW5nZV9jZmcgcGNtNTEyeF9yYW5nZSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQyODYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQyODYuYwppbmRleCA3NGMwZTRlLi45YzM2NWE3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0Mjg2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDI4Ni5jCkBAIC0xMDUzLDEyICsxMDUzLDE0IEBACiAJLnJlc3VtZSA9IHJ0Mjg2X3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBydDI4Nl9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcnQyODZfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0Mjg2X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHJ0Mjg2X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQyODZfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBydDI4Nl9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDI4Nl9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDI4Nl9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDI4Nl9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0Mjg2X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0Mjg2X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDI4Nl9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQyODZfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQyODZfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDI5OC5jIGIvc291bmQvc29jL2NvZGVjcy9ydDI5OC5jCmluZGV4IGY4MGNmZTQuLjU1NTU4NjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQyOTguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0Mjk4LmMKQEAgLTEwOTUsMTIgKzEwOTUsMTQgQEAKIAkucmVzdW1lID0gcnQyOThfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHJ0Mjk4X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBydDI5OF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQyOThfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcnQyOThfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDI5OF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJ0Mjk4X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0Mjk4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0Mjk4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0Mjk4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQyOThfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQyOThfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0Mjk4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDI5OF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDI5OF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC1zcGkuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LXNwaS5jCmluZGV4IDc3ZmY4ZWIuLjA5MTAzYWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LXNwaS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LXNwaS5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIHJ0NTUxNF9kc3AtPmRtYV9vZmZzZXQpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHJ0NTUxNF9zcGlfcGNtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgcnQ1NTE0X3NwaV9wY21fb3BzID0gewogCS5vcGVuCQk9IHJ0NTUxNF9zcGlfcGNtX29wZW4sCiAJLmh3X3BhcmFtcwk9IHJ0NTUxNF9zcGlfaHdfcGFyYW1zLAogCS5od19mcmVlCT0gcnQ1NTE0X3NwaV9od19mcmVlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU1MTQuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LmMKaW5kZXggNzE2MmYwNS4uZjI0YjdjZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU1MTQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC5jCkBAIC0yNzgsNyArMjc4LDcgQEAKIAk4LCA4LCBUTFZfREJfU0NBTEVfSVRFTSgxNzAwLCAwLCAwKQogKTsKIAotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY192b2xfdGx2LCAtMTc2MjUsIDM3NSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX3ZvbF90bHYsIC0xNzI1LCA3NSwgMCk7CiAKIHN0YXRpYyBpbnQgcnQ1NTE0X2RzcF92b2ljZV93YWtlX3VwX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCkBAIC0zNTIsMTAgKzM1MiwxMCBAQAogCVNPQ19ET1VCTEVfVExWKCJNSUMgQm9vc3QgVm9sdW1lIiwgUlQ1NTE0X0FOQV9DVFJMX01JQ0JTVCwKIAkJUlQ1NTE0X1NFTF9CU1RMX1NGVCwgUlQ1NTE0X1NFTF9CU1RSX1NGVCwgOCwgMCwgYnN0X3RsdiksCiAJU09DX0RPVUJMRV9SX1RMVigiQURDMSBDYXB0dXJlIFZvbHVtZSIsIFJUNTUxNF9ET1dORklMVEVSMF9DVFJMMSwKLQkJUlQ1NTE0X0RPV05GSUxURVIwX0NUUkwyLCBSVDU1MTRfQURfR0FJTl9TRlQsIDEyNywgMCwKKwkJUlQ1NTE0X0RPV05GSUxURVIwX0NUUkwyLCBSVDU1MTRfQURfR0FJTl9TRlQsIDYzLCAwLAogCQlhZGNfdm9sX3RsdiksCiAJU09DX0RPVUJMRV9SX1RMVigiQURDMiBDYXB0dXJlIFZvbHVtZSIsIFJUNTUxNF9ET1dORklMVEVSMV9DVFJMMSwKLQkJUlQ1NTE0X0RPV05GSUxURVIxX0NUUkwyLCBSVDU1MTRfQURfR0FJTl9TRlQsIDEyNywgMCwKKwkJUlQ1NTE0X0RPV05GSUxURVIxX0NUUkwyLCBSVDU1MTRfQURfR0FJTl9TRlQsIDYzLCAwLAogCQlhZGNfdm9sX3RsdiksCiAJU09DX1NJTkdMRV9FWFQoIkRTUCBWb2ljZSBXYWtlIFVwIiwgU05EX1NPQ19OT1BNLCAwLCAxLCAwLAogCQlydDU1MTRfZHNwX3ZvaWNlX3dha2VfdXBfZ2V0LCBydDU1MTRfZHNwX3ZvaWNlX3dha2VfdXBfcHV0KSwKQEAgLTEwMjMsMTIgKzEwMjMsMTQgQEAKIAkucHJvYmUgPSBydDU1MTRfcHJvYmUsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTUxNF9zZXRfYmlhc19sZXZlbCwKLQkuY29udHJvbHMgPSBydDU1MTRfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTUxNF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBydDU1MTRfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU1MTRfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBydDU1MTRfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1NTE0X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0NTUxNF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDU1MTRfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDU1MTRfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQ1NTE0X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDU1MTRfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0NTUxNF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDU1MTRfaTJjX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LmggYi9zb3VuZC9zb2MvY29kZWNzL3J0NTUxNC5oCmluZGV4IDY4ODgzYzYuLjIyOWRlMGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NTE0LmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU1MTQuaApAQCAtMTk2LDggKzE5Niw4IEBACiAjZGVmaW5lIFJUNTUxNF9BRF9BRF9NSVhfQklUCQkJMTAKICNkZWZpbmUgUlQ1NTE0X0FEX0FEX01VVEUJCQkoMHgxIDw8IDcpCiAjZGVmaW5lIFJUNTUxNF9BRF9BRF9NVVRFX0JJVAkJCTcKLSNkZWZpbmUgUlQ1NTE0X0FEX0dBSU5fTUFTSwkJCSgweDdmIDw8IDApCi0jZGVmaW5lIFJUNTUxNF9BRF9HQUlOX1NGVAkJCTAKKyNkZWZpbmUgUlQ1NTE0X0FEX0dBSU5fTUFTSwkJCSgweDNmIDw8IDEpCisjZGVmaW5lIFJUNTUxNF9BRF9HQUlOX1NGVAkJCTEKIAogLyogIFJUNTUxNF9BTkFfQ1RSTF9NSUNCU1QgKDB4MjIyMCkgKi8KICNkZWZpbmUgUlQ1NTE0X1NFTF9CU1RMX01BU0sJCQkoMHhmIDw8IDQpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTYxNi5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MTYuYwppbmRleCBmNTI3YjViLi5kMWYyNzNiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTYxNi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjE2LmMKQEAgLTI5NCw4ICsyOTQsNyBAQAogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFkY19ic3RfdGx2LCAwLCAxMjAwLCAwKTsKIAogLyogezAsICsyMCwgKzI0LCArMzAsICszNSwgKzQwLCArNDQsICs1MCwgKzUyfSBkQiAqLwotc3RhdGljIHVuc2lnbmVkIGludCBic3RfdGx2W10gPSB7Ci0JVExWX0RCX1JBTkdFX0hFQUQoNyksCitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9SQU5HRShic3RfdGx2LAogCTAsIDAsIFRMVl9EQl9TQ0FMRV9JVEVNKDAsIDAsIDApLAogCTEsIDEsIFRMVl9EQl9TQ0FMRV9JVEVNKDIwMDAsIDAsIDApLAogCTIsIDIsIFRMVl9EQl9TQ0FMRV9JVEVNKDI0MDAsIDAsIDApLApAQCAtMzAzLDcgKzMwMiw3IEBACiAJNiwgNiwgVExWX0RCX1NDQUxFX0lURU0oNDQwMCwgMCwgMCksCiAJNywgNywgVExWX0RCX1NDQUxFX0lURU0oNTAwMCwgMCwgMCksCiAJOCwgOCwgVExWX0RCX1NDQUxFX0lURU0oNTIwMCwgMCwgMCksCi19OworKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTYxNl9zbmRfY29udHJvbHNbXSA9IHsKIAkvKiBIZWFkcGhvbmUgT3V0cHV0IFZvbHVtZSAqLwpAQCAtMTI2NywxNCArMTI2NiwxNCBAQAogI2RlZmluZSBSVDU2MTZfRk9STUFUUyAoU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MyMF8zTEUgfCBcCiAJCQlTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzgpCiAKLXN0cnVjdCBzbmRfc29jX2RhaV9vcHMgcnQ1NjE2X2FpZl9kYWlfb3BzID0geworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgcnQ1NjE2X2FpZl9kYWlfb3BzID0gewogCS5od19wYXJhbXMgPSBydDU2MTZfaHdfcGFyYW1zLAogCS5zZXRfZm10ID0gcnQ1NjE2X3NldF9kYWlfZm10LAogCS5zZXRfc3lzY2xrID0gcnQ1NjE2X3NldF9kYWlfc3lzY2xrLAogCS5zZXRfcGxsID0gcnQ1NjE2X3NldF9kYWlfcGxsLAogfTsKIAotc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBydDU2MTZfZGFpW10gPSB7CitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBydDU2MTZfZGFpW10gPSB7CiAJewogCQkubmFtZSA9ICJydDU2MTYtYWlmMSIsCiAJCS5pZCA9IFJUNTYxNl9BSUYxLApAQCAtMTMwMiwxMiArMTMwMSwxNCBAQAogCS5yZXN1bWUgPSBydDU2MTZfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTYxNl9zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcnQ1NjE2X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDU2MTZfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcnQ1NjE2X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQ1NjE2X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcnQ1NjE2X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0NTYxNl9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDU2MTZfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQ1NjE2X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQ1NjE2X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0NTYxNl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQ1NjE2X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDU2MTZfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQ1NjE2X3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTYzMS5jCmluZGV4IDFiZTJiYWIuLjBlNDE4MDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYwpAQCAtMTY1NywxMiArMTY1NywxNCBAQAogCS5wcm9iZSA9IHJ0NTYzMV9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBydDU2MzFfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHJ0NTYzMV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQ1NjMxX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHJ0NTYzMV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0NTYzMV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJ0NTYzMV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDU2MzFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQ1NjMxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0NTYzMV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0NTYzMV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDU2MzFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0NTYzMV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQ1NjMxX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHJ0NTYzMV9pMmNfaWRbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY0MC5jCmluZGV4IDA5ZTg5ODguLjNjYzExMzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuYwpAQCAtMTg3MCw2ICsxODcwLDkgQEAKIAljYXNlIFJUNTY0MF9TQ0xLX1NfUExMMToKIAkJcmVnX3ZhbCB8PSBSVDU2NDBfU0NMS19TUkNfUExMMTsKIAkJYnJlYWs7CisJY2FzZSBSVDU2NDBfU0NMS19TX1JDQ0xLOgorCQlyZWdfdmFsIHw9IFJUNTY0MF9TQ0xLX1NSQ19SQ0NMSzsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBjbG9jayBpZCAoJWQpXG4iLCBjbGtfaWQpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIyNjEsMTIgKzIyNjQsMTQgQEAKIAkucmVzdW1lID0gcnQ1NjQwX3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBydDU2NDBfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHJ0NTY0MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQ1NjQwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHJ0NTY0MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0NTY0MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJ0NTY0MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDU2NDBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQ1NjQwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0NTY0MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0NTY0MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDU2NDBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0NTY0MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQ1NjQwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0NTY0MF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY0MC5oIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NDAuaAppbmRleCA1OGI2NjRiLi45MGM4ODcxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY0MC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQwLmgKQEAgLTk4NCw2ICs5ODQsNyBAQAogI2RlZmluZSBSVDU2NDBfU0NMS19TUkNfU0ZUCQkJMTQKICNkZWZpbmUgUlQ1NjQwX1NDTEtfU1JDX01DTEsJCQkoMHgwIDw8IDE0KQogI2RlZmluZSBSVDU2NDBfU0NMS19TUkNfUExMMQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY0MF9TQ0xLX1NSQ19SQ0NMSwkJCSgweDIgPDwgMTQpCiAjZGVmaW5lIFJUNTY0MF9QTEwxX1NSQ19NQVNLCQkJKDB4MyA8PCAxMikKICNkZWZpbmUgUlQ1NjQwX1BMTDFfU1JDX1NGVAkJCTEyCiAjZGVmaW5lIFJUNTY0MF9QTEwxX1NSQ19NQ0xLCQkJKDB4MCA8PCAxMikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQ1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY0NS5jCmluZGV4IDQ5MGJmZTYuLjEwYzJhNTY0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY0NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQ1LmMKQEAgLTM0ODQsMTIgKzM0ODQsMTQgQEAKIAkucmVzdW1lID0gcnQ1NjQ1X3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBydDU2NDVfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHJ0NTY0NV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQ1NjQ1X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHJ0NTY0NV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0NTY0NV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJ0NTY0NV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDU2NDVfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQ1NjQ1X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0NTY0NV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0NTY0NV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDU2NDVfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0NTY0NV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQ1NjQ1X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0NTY0NV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY1MS5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NTEuYwppbmRleCA3YTYxOTcwLi5mNWQzNDE1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY1MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjUxLmMKQEAgLTE3MTIsMTIgKzE3MTIsMTQgQEAKIAkucmVzdW1lID0gcnQ1NjUxX3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBydDU2NTFfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHJ0NTY1MV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQ1NjUxX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHJ0NTY1MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0NTY1MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJ0NTY1MV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDU2NTFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQ1NjUxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0NTY1MV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0NTY1MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDU2NTFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0NTY1MV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQ1NjUxX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0NTY1MV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY1OS5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NTkuYwppbmRleCAxYjMwOTE0Li5kYjU0NTUwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY1OS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjU5LmMKQEAgLTksNiArOSw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0zNTY1LDcgKzM1NjYsOSBAQAogc3RhdGljIGludCBydDU2NTlfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAogCQkJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CiAJc3RydWN0IHJ0NTY1OV9wcml2ICpydDU2NTkgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OwogCiAJc3dpdGNoIChsZXZlbCkgewogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CkBAIC0zNTgyLDYgKzM1ODUsMTcgQEAKIAkJCVJUNTY1OV9QV1JfRlYxIHwgUlQ1NjU5X1BXUl9GVjIpOwogCQlicmVhazsKIAorCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWlmIChkYXBtLT5iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PRkYpIHsKKwkJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShydDU2NTktPm1jbGspOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoY29kZWMtPmRldiwKKwkJCQkJImZhaWxlZCB0byBlbmFibGUgTUNMSzogJWRcbiIsIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKIAkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY1OS0+cmVnbWFwLCBSVDU2NTlfUFdSX0RJR18xLAogCQkJUlQ1NjU5X1BXUl9MRE8sIDApOwpAQCAtMzU5MSw2ICszNjA1LDcgQEAKIAkJCVJUNTY1OV9QV1JfTUIgfCBSVDU2NTlfUFdSX1ZSRUYyKTsKIAkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY1OS0+cmVnbWFwLCBSVDU2NTlfRElHX01JU0MsCiAJCQlSVDU2NTlfRElHX0dBVEVfQ1RSTCwgMCk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShydDU2NTktPm1jbGspOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0zNzIyLDEyICszNzM3LDE0IEBACiAJLnJlc3VtZSA9IHJ0NTY1OV9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gcnQ1NjU5X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSBydDU2NTlfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTY1OV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBydDU2NTlfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShydDU2NTlfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBydDU2NTlfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocnQ1NjU5X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHJ0NTY1OV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShydDU2NTlfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBydDU2NTlfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocnQ1NjU5X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBydDU2NTlfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJ0NTY1OV9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIApAQCAtNDAyMCw2ICs0MDM3LDE1IEBACiAKIAlyZWdtYXBfd3JpdGUocnQ1NjU5LT5yZWdtYXAsIFJUNTY1OV9SRVNFVCwgMCk7CiAKKwkvKiBDaGVjayBpZiBNQ0xLIHByb3ZpZGVkICovCisJcnQ1NjU5LT5tY2xrID0gZGV2bV9jbGtfZ2V0KCZpMmMtPmRldiwgIm1jbGsiKTsKKwlpZiAoSVNfRVJSKHJ0NTY1OS0+bWNsaykpIHsKKwkJaWYgKFBUUl9FUlIocnQ1NjU5LT5tY2xrKSAhPSAtRU5PRU5UKQorCQkJcmV0dXJuIFBUUl9FUlIocnQ1NjU5LT5tY2xrKTsKKwkJLyogT3RoZXJ3aXNlIG1hcmsgdGhlIG1jbGsgcG9pbnRlciB0byBOVUxMICovCisJCXJ0NTY1OS0+bWNsayA9IE5VTEw7CisJfQorCiAJcnQ1NjU5X2NhbGlicmF0ZShydDU2NTkpOwogCiAJLyogbGluZSBpbiBkaWZmIG1vZGUqLwpAQCAtNDE2Myw2ICs0MTg5LDkgQEAKIAkJaWYgKHJldCkKIAkJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHJlZ3Vlc3QgSVJROiAlZFxuIiwgcmV0KTsKIAorCQkvKiBFbmFibGUgSVJRIG91dHB1dCBmb3IgR1BJTzEgcGluIGFueSB3YXkgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY1OS0+cmVnbWFwLCBSVDU2NTlfR1BJT19DVFJMXzEsCisJCQkJICAgUlQ1NjU5X0dQMV9QSU5fTUFTSywgUlQ1NjU5X0dQMV9QSU5fSVJRKTsKIAl9CiAKIAlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsICZzb2NfY29kZWNfZGV2X3J0NTY1OSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjU5LmggYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY1OS5oCmluZGV4IGQzMWM5ZTUuLjhmMWFlZWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjU5LmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NTkuaApAQCAtMTgwLDkgKzE4MCw5IEBACiAjZGVmaW5lIFJUNTY1OV9JUlFfQ1RSTF8xCQkJMHgwMGI2CiAjZGVmaW5lIFJUNTY1OV9JUlFfQ1RSTF8yCQkJMHgwMGI3CiAjZGVmaW5lIFJUNTY1OV9JUlFfQ1RSTF8zCQkJMHgwMGI4Ci0jZGVmaW5lIFJUNTY1OV9JUlFfQ1RSTF80CQkJMHgwMGI5Ci0jZGVmaW5lIFJUNTY1OV9JUlFfQ1RSTF81CQkJMHgwMGJhCi0jZGVmaW5lIFJUNTY1OV9JUlFfQ1RSTF82CQkJMHgwMGJiCisjZGVmaW5lIFJUNTY1OV9JUlFfQ1RSTF80CQkJMHgwMGJhCisjZGVmaW5lIFJUNTY1OV9JUlFfQ1RSTF81CQkJMHgwMGJiCisjZGVmaW5lIFJUNTY1OV9JUlFfQ1RSTF82CQkJMHgwMGJjCiAjZGVmaW5lIFJUNTY1OV9JTlRfU1RfMQkJCQkweDAwYmUKICNkZWZpbmUgUlQ1NjU5X0lOVF9TVF8yCQkJCTB4MDBiZgogI2RlZmluZSBSVDU2NTlfR1BJT19DVFJMXzEJCQkweDAwYzAKQEAgLTE3OTYsNiArMTc5Niw3IEBACiAJc3RydWN0IGdwaW9fZGVzYyAqZ3Bpb2RfcmVzZXQ7CiAJc3RydWN0IHNuZF9zb2NfamFjayAqaHNfamFjazsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGphY2tfZGV0ZWN0X3dvcms7CisJc3RydWN0IGNsayAqbWNsazsKIAogCWludCBzeXNjbGs7CiAJaW50IHN5c2Nsa19zcmM7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY2MC5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjA5MzNjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NjAuYwpAQCAtMCwwICsxLDEzNTMgQEAKKy8qCisgKiBydDU2NjAuYyAgLS0gIFJUNTY2MCBBTFNBIFNvQyBhdWRpbyBjb2RlYyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4KKyAqIEF1dGhvcjogT2RlciBDaGlvdSA8b2Rlcl9jaGlvdUByZWFsdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworI2luY2x1ZGUgInJsNjIzMS5oIgorI2luY2x1ZGUgInJ0NTY2MC5oIgorCisjZGVmaW5lIFJUNTY2MF9ERVZJQ0VfSUQgMHg2MzM4CisKKyNkZWZpbmUgUlQ1NjYwX1BSX1JBTkdFX0JBU0UgKDB4ZmYgKyAxKQorI2RlZmluZSBSVDU2NjBfUFJfU1BBQ0lORyAweDEwMAorCisjZGVmaW5lIFJUNTY2MF9QUl9CQVNFIChSVDU2NjBfUFJfUkFOR0VfQkFTRSArICgwICogUlQ1NjYwX1BSX1NQQUNJTkcpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9yYW5nZV9jZmcgcnQ1NjYwX3Jhbmdlc1tdID0geworCXsgLm5hbWUgPSAiUFIiLCAucmFuZ2VfbWluID0gUlQ1NjYwX1BSX0JBU0UsCisJICAucmFuZ2VfbWF4ID0gUlQ1NjYwX1BSX0JBU0UgKyAweGYzLAorCSAgLnNlbGVjdG9yX3JlZyA9IFJUNTY2MF9QUklWX0lOREVYLAorCSAgLnNlbGVjdG9yX21hc2sgPSAweGZmLAorCSAgLnNlbGVjdG9yX3NoaWZ0ID0gMHgwLAorCSAgLndpbmRvd19zdGFydCA9IFJUNTY2MF9QUklWX0RBVEEsCisJICAud2luZG93X2xlbiA9IDB4MSwgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX3NlcXVlbmNlIHJ0NTY2MF9wYXRjaFtdID0geworCXsgUlQ1NjYwX0FMQ19QR0FfQ1RSTDIsCQkweDQ0YzMgfSwKKwl7IFJUNTY2MF9QUl9CQVNFICsgMHgzZCwJMHgyNjAwIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ19kZWZhdWx0IHJ0NTY2MF9yZWdbXSA9IHsKKwl7IDB4MDAsIDB4MDAwMCB9LAorCXsgMHgwMSwgMHhjODAwIH0sCisJeyAweDAyLCAweGM4YzggfSwKKwl7IDB4MGQsIDB4MTAxMCB9LAorCXsgMHgwZSwgMHgxMDEwIH0sCisJeyAweDE5LCAweGFmYWYgfSwKKwl7IDB4MWMsIDB4MmYyZiB9LAorCXsgMHgxZSwgMHgwMDAwIH0sCisJeyAweDI3LCAweDYwNjAgfSwKKwl7IDB4MjksIDB4ODA4MCB9LAorCXsgMHgyYSwgMHg0MjQyIH0sCisJeyAweDJmLCAweDAwMDAgfSwKKwl7IDB4M2IsIDB4MDAwMCB9LAorCXsgMHgzYywgMHgwMDdmIH0sCisJeyAweDNkLCAweDAwMDAgfSwKKwl7IDB4M2UsIDB4MDA3ZiB9LAorCXsgMHg0NSwgMHhlMDAwIH0sCisJeyAweDQ2LCAweDAwM2UgfSwKKwl7IDB4NDgsIDB4ZjgwMCB9LAorCXsgMHg0YSwgMHgwMDA0IH0sCisJeyAweDRkLCAweDAwMDAgfSwKKwl7IDB4NGUsIDB4MDAwMCB9LAorCXsgMHg0ZiwgMHgwMWZmIH0sCisJeyAweDUwLCAweDAwMDAgfSwKKwl7IDB4NTEsIDB4MDAwMCB9LAorCXsgMHg1MiwgMHgwMWZmIH0sCisJeyAweDYxLCAweDAwMDAgfSwKKwl7IDB4NjIsIDB4MDAwMCB9LAorCXsgMHg2MywgMHgwMGMwIH0sCisJeyAweDY0LCAweDAwMDAgfSwKKwl7IDB4NjUsIDB4MDAwMCB9LAorCXsgMHg2NiwgMHgwMDAwIH0sCisJeyAweDcwLCAweDgwMDAgfSwKKwl7IDB4NzMsIDB4NzAwMCB9LAorCXsgMHg3NCwgMHgzYzAwIH0sCisJeyAweDc1LCAweDI4MDAgfSwKKwl7IDB4ODAsIDB4MDAwMCB9LAorCXsgMHg4MSwgMHgwMDAwIH0sCisJeyAweDgyLCAweDAwMDAgfSwKKwl7IDB4OGMsIDB4MDIyOCB9LAorCXsgMHg4ZCwgMHhhMDAwIH0sCisJeyAweDhlLCAweDAwMDAgfSwKKwl7IDB4OTIsIDB4MDAwMCB9LAorCXsgMHg5MywgMHgzMDAwIH0sCisJeyAweGExLCAweDAwNTkgfSwKKwl7IDB4YTIsIDB4MDAwMSB9LAorCXsgMHhhMywgMHg1YzgwIH0sCisJeyAweGE0LCAweDAxNDYgfSwKKwl7IDB4YTUsIDB4MWYxZiB9LAorCXsgMHhhNiwgMHg3OGM2IH0sCisJeyAweGE3LCAweGU1ZWMgfSwKKwl7IDB4YTgsIDB4YmE2MSB9LAorCXsgMHhhOSwgMHgzYzc4IH0sCisJeyAweGFhLCAweDhhZTIgfSwKKwl7IDB4YWIsIDB4ZTVlYyB9LAorCXsgMHhhYywgMHhjNjAwIH0sCisJeyAweGFkLCAweGJhNjEgfSwKKwl7IDB4YWUsIDB4MTdlZCB9LAorCXsgMHhiMCwgMHgyMDgwIH0sCisJeyAweGIxLCAweDAwMDAgfSwKKwl7IDB4YjMsIDB4MDAxZiB9LAorCXsgMHhiNCwgMHgwMjBjIH0sCisJeyAweGI1LCAweDFmMDAgfSwKKwl7IDB4YjYsIDB4MDAwMCB9LAorCXsgMHhiNywgMHg0MDAwIH0sCisJeyAweGJiLCAweDAwMDAgfSwKKwl7IDB4YmQsIDB4MDAwMCB9LAorCXsgMHhiZSwgMHgwMDAwIH0sCisJeyAweGJmLCAweDAxMDAgfSwKKwl7IDB4YzAsIDB4MDAwMCB9LAorCXsgMHhjMiwgMHgwMDAwIH0sCisJeyAweGQzLCAweGEyMjAgfSwKKwl7IDB4ZDksIDB4MDgwOSB9LAorCXsgMHhkYSwgMHgwMDAwIH0sCisJeyAweGUwLCAweDgwMDAgfSwKKwl7IDB4ZTEsIDB4MDIwMCB9LAorCXsgMHhlMiwgMHg4MDAwIH0sCisJeyAweGUzLCAweDAyMDAgfSwKKwl7IDB4ZTQsIDB4MGYyMCB9LAorCXsgMHhlNSwgMHgwMDFmIH0sCisJeyAweGU2LCAweDAyMGMgfSwKKwl7IDB4ZTcsIDB4MWYwMCB9LAorCXsgMHhlOCwgMHgwMDAwIH0sCisJeyAweGU5LCAweDQwMDAgfSwKKwl7IDB4ZWEsIDB4MDBhNiB9LAorCXsgMHhlYiwgMHgwNGMzIH0sCisJeyAweGVjLCAweDI3YzggfSwKKwl7IDB4ZWQsIDB4NzQxOCB9LAorCXsgMHhlZSwgMHhiZjUwIH0sCisJeyAweGVmLCAweDAwNDUgfSwKKwl7IDB4ZjAsIDB4MDAwNyB9LAorCXsgMHhmYSwgMHgwMDAwIH0sCisJeyAweGZkLCAweDAwMDAgfSwKKwl7IDB4ZmUsIDB4MTBlYyB9LAorCXsgMHhmZiwgMHg2MzM4IH0sCit9OworCitzdGF0aWMgYm9vbCBydDU2NjBfdm9sYXRpbGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocnQ1NjYwX3Jhbmdlcyk7IGkrKykKKwkJaWYgKChyZWcgPj0gcnQ1NjYwX3Jhbmdlc1tpXS53aW5kb3dfc3RhcnQgJiYKKwkJICAgICByZWcgPD0gcnQ1NjYwX3Jhbmdlc1tpXS53aW5kb3dfc3RhcnQgKworCQkgICAgIHJ0NTY2MF9yYW5nZXNbaV0ud2luZG93X2xlbikgfHwKKwkJICAgIChyZWcgPj0gcnQ1NjYwX3Jhbmdlc1tpXS5yYW5nZV9taW4gJiYKKwkJICAgICByZWcgPD0gcnQ1NjYwX3Jhbmdlc1tpXS5yYW5nZV9tYXgpKQorCQkJcmV0dXJuIHRydWU7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUlQ1NjYwX1JFU0VUOgorCWNhc2UgUlQ1NjYwX1BSSVZfREFUQToKKwljYXNlIFJUNTY2MF9FUV9DVFJMMToKKwljYXNlIFJUNTY2MF9JUlFfQ1RSTDI6CisJY2FzZSBSVDU2NjBfSU5UX0lSUV9TVDoKKwljYXNlIFJUNTY2MF9WRU5ET1JfSUQ6CisJY2FzZSBSVDU2NjBfVkVORE9SX0lEMToKKwljYXNlIFJUNTY2MF9WRU5ET1JfSUQyOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBydDU2NjBfcmVhZGFibGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocnQ1NjYwX3Jhbmdlcyk7IGkrKykKKwkJaWYgKChyZWcgPj0gcnQ1NjYwX3Jhbmdlc1tpXS53aW5kb3dfc3RhcnQgJiYKKwkJICAgICByZWcgPD0gcnQ1NjYwX3Jhbmdlc1tpXS53aW5kb3dfc3RhcnQgKworCQkgICAgIHJ0NTY2MF9yYW5nZXNbaV0ud2luZG93X2xlbikgfHwKKwkJICAgIChyZWcgPj0gcnQ1NjYwX3Jhbmdlc1tpXS5yYW5nZV9taW4gJiYKKwkJICAgICByZWcgPD0gcnQ1NjYwX3Jhbmdlc1tpXS5yYW5nZV9tYXgpKQorCQkJcmV0dXJuIHRydWU7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUlQ1NjYwX1JFU0VUOgorCWNhc2UgUlQ1NjYwX1NQS19WT0w6CisJY2FzZSBSVDU2NjBfTE9VVF9WT0w6CisJY2FzZSBSVDU2NjBfSU4xX0lOMjoKKwljYXNlIFJUNTY2MF9JTjNfSU40OgorCWNhc2UgUlQ1NjYwX0RBQzFfRElHX1ZPTDoKKwljYXNlIFJUNTY2MF9TVE8xX0FEQ19ESUdfVk9MOgorCWNhc2UgUlQ1NjYwX0FEQ19CU1RfVk9MMToKKwljYXNlIFJUNTY2MF9TVE8xX0FEQ19NSVhFUjoKKwljYXNlIFJUNTY2MF9BRF9EQV9NSVhFUjoKKwljYXNlIFJUNTY2MF9TVE9fREFDX01JWEVSOgorCWNhc2UgUlQ1NjYwX0RJR19JTkYxX0RBVEE6CisJY2FzZSBSVDU2NjBfUkVDX0wxX01JWEVSOgorCWNhc2UgUlQ1NjYwX1JFQ19MMl9NSVhFUjoKKwljYXNlIFJUNTY2MF9SRUNfUjFfTUlYRVI6CisJY2FzZSBSVDU2NjBfUkVDX1IyX01JWEVSOgorCWNhc2UgUlQ1NjYwX0xPVVRfTUlYRVI6CisJY2FzZSBSVDU2NjBfU1BLX01JWEVSOgorCWNhc2UgUlQ1NjYwX1NQT19NSVhFUjoKKwljYXNlIFJUNTY2MF9TUE9fQ0xTRF9SQVRJTzoKKwljYXNlIFJUNTY2MF9PVVRfTF9HQUlOMToKKwljYXNlIFJUNTY2MF9PVVRfTF9HQUlOMjoKKwljYXNlIFJUNTY2MF9PVVRfTDFfTUlYRVI6CisJY2FzZSBSVDU2NjBfT1VUX1JfR0FJTjE6CisJY2FzZSBSVDU2NjBfT1VUX1JfR0FJTjI6CisJY2FzZSBSVDU2NjBfT1VUX1IxX01JWEVSOgorCWNhc2UgUlQ1NjYwX1BXUl9ESUcxOgorCWNhc2UgUlQ1NjYwX1BXUl9ESUcyOgorCWNhc2UgUlQ1NjYwX1BXUl9BTkxHMToKKwljYXNlIFJUNTY2MF9QV1JfQU5MRzI6CisJY2FzZSBSVDU2NjBfUFdSX01JWEVSOgorCWNhc2UgUlQ1NjYwX1BXUl9WT0w6CisJY2FzZSBSVDU2NjBfUFJJVl9JTkRFWDoKKwljYXNlIFJUNTY2MF9QUklWX0RBVEE6CisJY2FzZSBSVDU2NjBfSTJTMV9TRFA6CisJY2FzZSBSVDU2NjBfQUREQV9DTEsxOgorCWNhc2UgUlQ1NjYwX0FEREFfQ0xLMjoKKwljYXNlIFJUNTY2MF9ETUlDX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0dMQl9DTEs6CisJY2FzZSBSVDU2NjBfUExMX0NUUkwxOgorCWNhc2UgUlQ1NjYwX1BMTF9DVFJMMjoKKwljYXNlIFJUNTY2MF9DTFNEX0FNUF9PQ19DVFJMOgorCWNhc2UgUlQ1NjYwX0NMU0RfQU1QX0NUUkw6CisJY2FzZSBSVDU2NjBfTE9VVF9BTVBfQ1RSTDoKKwljYXNlIFJUNTY2MF9TUEtfQU1QX1NQS1ZERDoKKwljYXNlIFJUNTY2MF9NSUNCSUFTOgorCWNhc2UgUlQ1NjYwX0NMU0RfT1VUX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0NMU0RfT1VUX0NUUkwyOgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDE6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMjoKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwzOgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDQ6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMNToKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw2OgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDc6CisJY2FzZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMODoKKwljYXNlIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw5OgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDEwOgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDExOgorCWNhc2UgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDEyOgorCWNhc2UgUlQ1NjYwX0VRX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0VRX0NUUkwyOgorCWNhc2UgUlQ1NjYwX0RSQ19BR0NfQ1RSTDE6CisJY2FzZSBSVDU2NjBfRFJDX0FHQ19DVFJMMjoKKwljYXNlIFJUNTY2MF9EUkNfQUdDX0NUUkwzOgorCWNhc2UgUlQ1NjYwX0RSQ19BR0NfQ1RSTDQ6CisJY2FzZSBSVDU2NjBfRFJDX0FHQ19DVFJMNToKKwljYXNlIFJUNTY2MF9KRF9DVFJMOgorCWNhc2UgUlQ1NjYwX0lSUV9DVFJMMToKKwljYXNlIFJUNTY2MF9JUlFfQ1RSTDI6CisJY2FzZSBSVDU2NjBfSU5UX0lSUV9TVDoKKwljYXNlIFJUNTY2MF9HUElPX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0dQSU9fQ1RSTDI6CisJY2FzZSBSVDU2NjBfV0lORF9GSUxURVJfQ1RSTDE6CisJY2FzZSBSVDU2NjBfU1ZfWkNEMToKKwljYXNlIFJUNTY2MF9TVl9aQ0QyOgorCWNhc2UgUlQ1NjYwX0RSQzFfTE1fQ1RSTDE6CisJY2FzZSBSVDU2NjBfRFJDMV9MTV9DVFJMMjoKKwljYXNlIFJUNTY2MF9EUkMyX0xNX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0RSQzJfTE1fQ1RSTDI6CisJY2FzZSBSVDU2NjBfTVVMVElfRFJDX0NUUkw6CisJY2FzZSBSVDU2NjBfRFJDMl9DVFJMMToKKwljYXNlIFJUNTY2MF9EUkMyX0NUUkwyOgorCWNhc2UgUlQ1NjYwX0RSQzJfQ1RSTDM6CisJY2FzZSBSVDU2NjBfRFJDMl9DVFJMNDoKKwljYXNlIFJUNTY2MF9EUkMyX0NUUkw1OgorCWNhc2UgUlQ1NjYwX0FMQ19QR0FfQ1RSTDE6CisJY2FzZSBSVDU2NjBfQUxDX1BHQV9DVFJMMjoKKwljYXNlIFJUNTY2MF9BTENfUEdBX0NUUkwzOgorCWNhc2UgUlQ1NjYwX0FMQ19QR0FfQ1RSTDQ6CisJY2FzZSBSVDU2NjBfQUxDX1BHQV9DVFJMNToKKwljYXNlIFJUNTY2MF9BTENfUEdBX0NUUkw2OgorCWNhc2UgUlQ1NjYwX0FMQ19QR0FfQ1RSTDc6CisJY2FzZSBSVDU2NjBfR0VOX0NUUkwxOgorCWNhc2UgUlQ1NjYwX0dFTl9DVFJMMjoKKwljYXNlIFJUNTY2MF9HRU5fQ1RSTDM6CisJY2FzZSBSVDU2NjBfVkVORE9SX0lEOgorCWNhc2UgUlQ1NjYwX1ZFTkRPUl9JRDE6CisJY2FzZSBSVDU2NjBfVkVORE9SX0lEMjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHJ0NTY2MF9vdXRfdm9sX3RsdiwgLTQ2NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUocnQ1NjYwX2RhY192b2xfdGx2LCAtNjUyNSwgNzUsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHJ0NTY2MF9hZGNfdm9sX3RsdiwgLTE3MjUsIDc1LCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShydDU2NjBfYWRjX2JzdF90bHYsIDAsIDEyMDAsIDApOworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHJ0NTY2MF9ic3RfdGx2LCAtMTIwMCwgNzUsIDApOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX3NuZF9jb250cm9sc1tdID0geworCS8qIFNwZWFrZXIgT3V0cHV0IFZvbHVtZSAqLworCVNPQ19TSU5HTEUoIlNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgUlQ1NjYwX1NQS19WT0wsIFJUNTY2MF9MX01VVEVfU0ZULAorCQkxLCAxKSwKKwlTT0NfU0lOR0xFX1RMVigiU3BlYWtlciBQbGF5YmFjayBWb2x1bWUiLCBSVDU2NjBfU1BLX1ZPTCwKKwkJUlQ1NjYwX0xfVk9MX1NGVCwgMzksIDEsIHJ0NTY2MF9vdXRfdm9sX3RsdiksCisKKwkvKiBPVVRQVVQgQ29udHJvbCAqLworCVNPQ19ET1VCTEUoIk9VVCBQbGF5YmFjayBTd2l0Y2giLCBSVDU2NjBfTE9VVF9WT0wsIFJUNTY2MF9MX01VVEVfU0ZULAorCQlSVDU2NjBfUl9NVVRFX1NGVCwgMSwgMSksCisJU09DX0RPVUJMRV9UTFYoIk9VVCBQbGF5YmFjayBWb2x1bWUiLCBSVDU2NjBfTE9VVF9WT0wsIFJUNTY2MF9MX1ZPTF9TRlQsCisJCVJUNTY2MF9SX1ZPTF9TRlQsIDM5LCAxLCBydDU2NjBfb3V0X3ZvbF90bHYpLAorCisJLyogREFDIERpZ2l0YWwgVm9sdW1lICovCisJU09DX0RPVUJMRV9UTFYoIkRBQzEgUGxheWJhY2sgVm9sdW1lIiwgUlQ1NjYwX0RBQzFfRElHX1ZPTCwKKwkJUlQ1NjYwX0RBQ19MMV9WT0xfU0ZULCBSVDU2NjBfREFDX1IxX1ZPTF9TRlQsIDg3LCAwLAorCQlydDU2NjBfZGFjX3ZvbF90bHYpLAorCisJLyogSU4xL0lOMi9JTjMgQ29udHJvbCAqLworCVNPQ19TSU5HTEVfVExWKCJJTjEgQm9vc3QgVm9sdW1lIiwgUlQ1NjYwX0lOMV9JTjIsIFJUNTY2MF9CU1RfU0ZUMSwgNjksCisJCTAsIHJ0NTY2MF9ic3RfdGx2KSwKKwlTT0NfU0lOR0xFX1RMVigiSU4yIEJvb3N0IFZvbHVtZSIsIFJUNTY2MF9JTjFfSU4yLCBSVDU2NjBfQlNUX1NGVDIsIDY5LAorCQkwLCBydDU2NjBfYnN0X3RsdiksCisJU09DX1NJTkdMRV9UTFYoIklOMyBCb29zdCBWb2x1bWUiLCBSVDU2NjBfSU4zX0lONCwgUlQ1NjYwX0JTVF9TRlQzLCA2OSwKKwkJMCwgcnQ1NjYwX2JzdF90bHYpLAorCisJLyogQURDIERpZ2l0YWwgVm9sdW1lIENvbnRyb2wgKi8KKwlTT0NfRE9VQkxFKCJBREMgQ2FwdHVyZSBTd2l0Y2giLCBSVDU2NjBfU1RPMV9BRENfRElHX1ZPTCwKKwkJUlQ1NjYwX0xfTVVURV9TRlQsIFJUNTY2MF9SX01VVEVfU0ZULCAxLCAxKSwKKwlTT0NfRE9VQkxFX1RMVigiQURDIENhcHR1cmUgVm9sdW1lIiwgUlQ1NjYwX1NUTzFfQURDX0RJR19WT0wsCisJCVJUNTY2MF9BRENfTF9WT0xfU0ZULCBSVDU2NjBfQURDX1JfVk9MX1NGVCwgNjMsIDAsCisJCXJ0NTY2MF9hZGNfdm9sX3RsdiksCisKKwkvKiBBREMgQm9vc3QgVm9sdW1lIENvbnRyb2wgKi8KKwlTT0NfRE9VQkxFX1RMVigiU1RPMSBBREMgQm9vc3QgR2FpbiBWb2x1bWUiLCBSVDU2NjBfQURDX0JTVF9WT0wxLAorCQlSVDU2NjBfU1RPMV9BRENfTF9CU1RfU0ZULCBSVDU2NjBfU1RPMV9BRENfUl9CU1RfU0ZULCAzLCAwLAorCQlydDU2NjBfYWRjX2JzdF90bHYpLAorfTsKKworLyoqCisgKiBydDU2NjBfc2V0X2RtaWNfY2xrIC0gU2V0IHBhcmFtZXRlciBvZiBkbWljLgorICoKKyAqIEB3OiBEQVBNIHdpZGdldC4KKyAqIEBrY29udHJvbDogVGhlIGtjb250cm9sIG9mIHRoaXMgd2lkZ2V0LgorICogQGV2ZW50OiBFdmVudCBpZC4KKyAqCisgKi8KK3N0YXRpYyBpbnQgcnQ1NjYwX3NldF9kbWljX2NsayhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKwlzdHJ1Y3QgcnQ1NjYwX3ByaXYgKnJ0NTY2MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWludCBpZHgsIHJhdGU7CisKKwlyYXRlID0gcnQ1NjYwLT5zeXNjbGsgLyBybDYyMzFfZ2V0X3ByZV9kaXYocnQ1NjYwLT5yZWdtYXAsCisJCVJUNTY2MF9BRERBX0NMSzEsIFJUNTY2MF9JMlNfUEQxX1NGVCk7CisJaWR4ID0gcmw2MjMxX2NhbGNfZG1pY19jbGsocmF0ZSk7CisJaWYgKGlkeCA8IDApCisJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBzZXQgRE1JQyBjbG9ja1xuIik7CisJZWxzZQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfRE1JQ19DVFJMMSwKKwkJCVJUNTY2MF9ETUlDX0NMS19NQVNLLCBpZHggPDwgUlQ1NjYwX0RNSUNfQ0xLX1NGVCk7CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW50IHJ0NTY2MF9pc19zeXNfY2xrX2Zyb21fcGxsKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzb3VyY2UsCisJCQkgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHNvdXJjZS0+ZGFwbSk7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjYwX0dMQl9DTEspOworCXZhbCAmPSBSVDU2NjBfU0NMS19TUkNfTUFTSzsKKwlpZiAodmFsID09IFJUNTY2MF9TQ0xLX1NSQ19QTEwxKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKiBEaWdpdGFsIE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX3N0bzFfYWRjX2xfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJBREMxIFN3aXRjaCIsIFJUNTY2MF9TVE8xX0FEQ19NSVhFUiwKKwkJCVJUNTY2MF9NX0FEQ19MMV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQURDMiBTd2l0Y2giLCBSVDU2NjBfU1RPMV9BRENfTUlYRVIsCisJCQlSVDU2NjBfTV9BRENfTDJfU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfc3RvMV9hZGNfcl9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkFEQzEgU3dpdGNoIiwgUlQ1NjYwX1NUTzFfQURDX01JWEVSLAorCQkJUlQ1NjYwX01fQURDX1IxX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJBREMyIFN3aXRjaCIsIFJUNTY2MF9TVE8xX0FEQ19NSVhFUiwKKwkJCVJUNTY2MF9NX0FEQ19SMl9TRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9kYWNfbF9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIlN0ZXJlbyBBREMgU3dpdGNoIiwgUlQ1NjYwX0FEX0RBX01JWEVSLAorCQkJUlQ1NjYwX01fQURDTUlYX0xfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQzEgU3dpdGNoIiwgUlQ1NjYwX0FEX0RBX01JWEVSLAorCQkJUlQ1NjYwX01fREFDMV9MX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX2RhY19yX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiU3RlcmVvIEFEQyBTd2l0Y2giLCBSVDU2NjBfQURfREFfTUlYRVIsCisJCQlSVDU2NjBfTV9BRENNSVhfUl9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDMSBTd2l0Y2giLCBSVDU2NjBfQURfREFfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUMxX1JfU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfc3RvX2RhY19sX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiREFDIEwxIFN3aXRjaCIsIFJUNTY2MF9TVE9fREFDX01JWEVSLAorCQkJUlQ1NjYwX01fREFDX0wxX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUMgUjEgU3dpdGNoIiwgUlQ1NjYwX1NUT19EQUNfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNfUjFfU1RPX0xfU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfc3RvX2RhY19yX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiREFDIFIxIFN3aXRjaCIsIFJUNTY2MF9TVE9fREFDX01JWEVSLAorCQkJUlQ1NjYwX01fREFDX1IxX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUMgTDEgU3dpdGNoIiwgUlQ1NjYwX1NUT19EQUNfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNfTDFfU1RPX1JfU0ZULCAxLCAxKSwKK307CisKKy8qIEFuYWxvZyBJbnB1dCBNaXhlciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9yZWNfbF9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDMgU3dpdGNoIiwgUlQ1NjYwX1JFQ19MMl9NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDNfUk1fTF9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQlNUMiBTd2l0Y2giLCBSVDU2NjBfUkVDX0wyX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUMl9STV9MX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJCU1QxIFN3aXRjaCIsIFJUNTY2MF9SRUNfTDJfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QxX1JNX0xfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk9VVCBNSVhMIFN3aXRjaCIsIFJUNTY2MF9SRUNfTDJfTUlYRVIsCisJCQlSVDU2NjBfTV9PTV9MX1JNX0xfU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfcmVjX3JfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJCU1QzIFN3aXRjaCIsIFJUNTY2MF9SRUNfUjJfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QzX1JNX1JfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDIgU3dpdGNoIiwgUlQ1NjYwX1JFQ19SMl9NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDJfUk1fUl9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQlNUMSBTd2l0Y2giLCBSVDU2NjBfUkVDX1IyX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUMV9STV9SX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJPVVQgTUlYUiBTd2l0Y2giLCBSVDU2NjBfUkVDX1IyX01JWEVSLAorCQkJUlQ1NjYwX01fT01fUl9STV9SX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX3Nwa19taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDMgU3dpdGNoIiwgUlQ1NjYwX1NQS19NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDNfU01fU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDEgU3dpdGNoIiwgUlQ1NjYwX1NQS19NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDFfU01fU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQ0wgU3dpdGNoIiwgUlQ1NjYwX1NQS19NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ0xfU01fU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQ1IgU3dpdGNoIiwgUlQ1NjYwX1NQS19NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ1JfU01fU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk9VVE1JWEwgU3dpdGNoIiwgUlQ1NjYwX1NQS19NSVhFUiwKKwkJCVJUNTY2MF9NX09NX0xfU01fU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfb3V0X2xfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJCU1QzIFN3aXRjaCIsIFJUNTY2MF9PVVRfTDFfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QzX09NX0xfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDIgU3dpdGNoIiwgUlQ1NjYwX09VVF9MMV9NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDJfT01fTF9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQlNUMSBTd2l0Y2giLCBSVDU2NjBfT1VUX0wxX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUMV9PTV9MX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJSRUNNSVhMIFN3aXRjaCIsIFJUNTY2MF9PVVRfTDFfTUlYRVIsCisJCQlSVDU2NjBfTV9STV9MX09NX0xfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQ1IgU3dpdGNoIiwgUlQ1NjYwX09VVF9MMV9NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ19SX09NX0xfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkRBQ0wgU3dpdGNoIiwgUlQ1NjYwX09VVF9MMV9NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ19MX09NX0xfU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfb3V0X3JfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJCU1QyIFN3aXRjaCIsIFJUNTY2MF9PVVRfUjFfTUlYRVIsCisJCQlSVDU2NjBfTV9CU1QyX09NX1JfU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkJTVDEgU3dpdGNoIiwgUlQ1NjYwX09VVF9SMV9NSVhFUiwKKwkJCVJUNTY2MF9NX0JTVDFfT01fUl9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiUkVDTUlYUiBTd2l0Y2giLCBSVDU2NjBfT1VUX1IxX01JWEVSLAorCQkJUlQ1NjYwX01fUk1fUl9PTV9SX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUNSIFN3aXRjaCIsIFJUNTY2MF9PVVRfUjFfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNfUl9PTV9SX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUNMIFN3aXRjaCIsIFJUNTY2MF9PVVRfUjFfTUlYRVIsCisJCQlSVDU2NjBfTV9EQUNfTF9PTV9SX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYwX3Nwb19taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRBQ1IgU3dpdGNoIiwgUlQ1NjYwX1NQT19NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQ19SX1NQTV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDTCBTd2l0Y2giLCBSVDU2NjBfU1BPX01JWEVSLAorCQkJUlQ1NjYwX01fREFDX0xfU1BNX1NGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJTUEtWT0wgU3dpdGNoIiwgUlQ1NjYwX1NQT19NSVhFUiwKKwkJCVJUNTY2MF9NX1NWX1NQTV9TRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQlNUMSBTd2l0Y2giLCBSVDU2NjBfU1BPX01JWEVSLAorCQkJUlQ1NjYwX01fQlNUMV9TUE1fU0ZULCAxLCAxKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfbG91dF9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkRBQyBTd2l0Y2giLCBSVDU2NjBfTE9VVF9NSVhFUiwKKwkJCVJUNTY2MF9NX0RBQzFfTE1fU0ZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIk9VVE1JWCBTd2l0Y2giLCBSVDU2NjBfTE9VVF9NSVhFUiwKKwkJCVJUNTY2MF9NX0xPVk9MX0xNX1NGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc3BrX3ZvbF9jb250cm9sID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFJUNTY2MF9TUEtfVk9MLAorCQlSVDU2NjBfVk9MX0xfU0ZULCAxLCAxKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxvdXRfbF92b2xfY29udHJvbCA9CisJU09DX0RBUE1fU0lOR0xFKCJTd2l0Y2giLCBSVDU2NjBfTE9VVF9WT0wsCisJCVJUNTY2MF9WT0xfTF9TRlQsIDEsIDEpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbG91dF9yX3ZvbF9jb250cm9sID0KKwlTT0NfREFQTV9TSU5HTEUoIlN3aXRjaCIsIFJUNTY2MF9MT1VUX1ZPTCwKKwkJUlQ1NjYwX1ZPTF9SX1NGVCwgMSwgMSk7CisKKy8qIEludGVyZmFjZSBkYXRhIHNlbGVjdCAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBydDU2NjBfZGF0YV9zZWxlY3RbXSA9IHsKKwkiTC9SIiwgIlIvTCIsICJML0wiLCAiUi9SIgorfTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY2MF9pZjFfZGFjX2VudW0sCisJUlQ1NjYwX0RJR19JTkYxX0RBVEEsIFJUNTY2MF9JRjFfREFDX0lOX1NGVCwgcnQ1NjYwX2RhdGFfc2VsZWN0KTsKKworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY2MF9pZjFfYWRjX2VudW0sCisJUlQ1NjYwX0RJR19JTkYxX0RBVEEsIFJUNTY2MF9JRjFfQURDX0lOX1NGVCwgcnQ1NjYwX2RhdGFfc2VsZWN0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2MF9pZjFfZGFjX3N3YXBfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJJRjEgREFDIFN3YXAgU291cmNlIiwgcnQ1NjYwX2lmMV9kYWNfZW51bSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjBfaWYxX2FkY19zd2FwX211eCA9CisJU09DX0RBUE1fRU5VTSgiSUYxIEFEQyBTd2FwIFNvdXJjZSIsIHJ0NTY2MF9pZjFfYWRjX2VudW0pOworCitzdGF0aWMgaW50IHJ0NTY2MF9sb3V0X2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfTE9VVF9BTVBfQ1RSTCwKKwkJCVJUNTY2MF9MT1VUX0NPX01BU0sgfCBSVDU2NjBfTE9VVF9DQl9NQVNLLAorCQkJUlQ1NjYwX0xPVVRfQ09fRU4gfCBSVDU2NjBfTE9VVF9DQl9QVSk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0xPVVRfQU1QX0NUUkwsCisJCQlSVDU2NjBfTE9VVF9DT19NQVNLIHwgUlQ1NjYwX0xPVVRfQ0JfTUFTSywKKwkJCVJUNTY2MF9MT1VUX0NPX0RJUyB8IFJUNTY2MF9MT1VUX0NCX1BEKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHJ0NTY2MF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJMRE8yIiwgUlQ1NjYwX1BXUl9BTkxHMSwKKwkJUlQ1NjYwX1BXUl9MRE8yX0JJVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUExMMSIsIFJUNTY2MF9QV1JfQU5MRzIsCisJCVJUNTY2MF9QV1JfUExMX0JJVCwgMCwgTlVMTCwgMCksCisKKwkvKiBNSUNCSUFTICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQklBUzEiLCBSVDU2NjBfUFdSX0FOTEcyLAorCQkJUlQ1NjYwX1BXUl9NQjFfQklULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNSUNCSUFTMiIsIFJUNTY2MF9QV1JfQU5MRzIsCisJCQlSVDU2NjBfUFdSX01CMl9CSVQsIDAsIE5VTEwsIDApLAorCisJLyogSW5wdXQgU2lkZSAqLworCS8qIElucHV0IExpbmVzICovCisJU05EX1NPQ19EQVBNX0lOUFVUKCJETUlDIEwxIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJETUlDIFIxIiksCisKKwlTTkRfU09DX0RBUE1fSU5QVVQoIklOMVAiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIklOMU4iKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIklOMlAiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIklOM1AiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIklOM04iKSwKKworCVNORF9TT0NfREFQTV9TVVBQTFkoIkRNSUMgQ0xLIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlydDU2NjBfc2V0X2RtaWNfY2xrLCBTTkRfU09DX0RBUE1fUFJFX1BNVSksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiRE1JQyBQb3dlciIsIFJUNTY2MF9ETUlDX0NUUkwxLAorCQlSVDU2NjBfRE1JQ18xX0VOX1NGVCwgMCwgTlVMTCwgMCksCisKKwkvKiBCb29zdCAqLworCVNORF9TT0NfREFQTV9QR0EoIkJTVDEiLCBSVDU2NjBfUFdSX0FOTEcyLCBSVDU2NjBfUFdSX0JTVDFfQklULCAwLAorCQlOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJCU1QyIiwgUlQ1NjYwX1BXUl9BTkxHMiwgUlQ1NjYwX1BXUl9CU1QyX0JJVCwgMCwKKwkJTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiQlNUMyIsIFJUNTY2MF9QV1JfQU5MRzIsIFJUNTY2MF9QV1JfQlNUM19CSVQsIDAsCisJCU5VTEwsIDApLAorCisJLyogUkVDIE1peGVyICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJSRUNNSVhMIiwgUlQ1NjYwX1BXUl9NSVhFUiwgUlQ1NjYwX1BXUl9STV9MX0JJVCwKKwkJCTAsIHJ0NTY2MF9yZWNfbF9taXgsIEFSUkFZX1NJWkUocnQ1NjYwX3JlY19sX21peCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiUkVDTUlYUiIsIFJUNTY2MF9QV1JfTUlYRVIsIFJUNTY2MF9QV1JfUk1fUl9CSVQsCisJCQkwLCBydDU2NjBfcmVjX3JfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2MF9yZWNfcl9taXgpKSwKKworCS8qIEFEQ3MgKi8KKwlTTkRfU09DX0RBUE1fQURDKCJBREMgTCIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FEQygiQURDIFIiLCBOVUxMLCBTTkRfU09DX05PUE0sIDAsIDApLAorCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQURDIEwgcG93ZXIiLCBSVDU2NjBfUFdSX0RJRzEsCisJCQlSVDU2NjBfUFdSX0FEQ19MX0JJVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQURDIFIgcG93ZXIiLCBSVDU2NjBfUFdSX0RJRzEsCisJCQlSVDU2NjBfUFdSX0FEQ19SX0JJVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQURDIGNsb2NrIiwgUlQ1NjYwX1BSX0JBU0UgKyBSVDU2NjBfQ0hPUF9EQUNfQURDLAorCQkJMTIsIDAsIE5VTEwsIDApLAorCisJLyogQURDIE1peGVyICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiYWRjIHN0ZXJlbzEgZmlsdGVyIiwgUlQ1NjYwX1BXUl9ESUcyLAorCQlSVDU2NjBfUFdSX0FEQ19TMUZfQklULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlN0bzEgQURDIE1JWEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ0NTY2MF9zdG8xX2FkY19sX21peCwgQVJSQVlfU0laRShydDU2NjBfc3RvMV9hZGNfbF9taXgpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlN0bzEgQURDIE1JWFIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ0NTY2MF9zdG8xX2FkY19yX21peCwgQVJSQVlfU0laRShydDU2NjBfc3RvMV9hZGNfcl9taXgpKSwKKworCS8qIEFEQyAqLworCVNORF9TT0NfREFQTV9BREMoIlN0ZXJlbzEgQURDIE1JWEwiLCBOVUxMLCBSVDU2NjBfU1RPMV9BRENfRElHX1ZPTCwKKwkJUlQ1NjYwX0xfTVVURV9TRlQsIDEpLAorCVNORF9TT0NfREFQTV9BREMoIlN0ZXJlbzEgQURDIE1JWFIiLCBOVUxMLCBSVDU2NjBfU1RPMV9BRENfRElHX1ZPTCwKKwkJUlQ1NjYwX1JfTVVURV9TRlQsIDEpLAorCisJLyogRGlnaXRhbCBJbnRlcmZhY2UgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJJMlMxIiwgUlQ1NjYwX1BXUl9ESUcxLCBSVDU2NjBfUFdSX0kyUzFfQklULCAwLAorCQlOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJJRjEgREFDIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJJRjEgREFDIEwiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIklGMSBEQUMgUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01VWCgiSUYxIERBQyBTd2FwIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZydDU2NjBfaWYxX2RhY19zd2FwX211eCksCisJU05EX1NPQ19EQVBNX1BHQSgiSUYxIEFEQyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01VWCgiSUYxIEFEQyBTd2FwIE11eCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSZydDU2NjBfaWYxX2FkY19zd2FwX211eCksCisKKwkvKiBBdWRpbyBJbnRlcmZhY2UgKi8KKwlTTkRfU09DX0RBUE1fQUlGX0lOKCJBSUYxUlgiLCAiQUlGMSBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRjFUWCIsICJBSUYxIENhcHR1cmUiLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCisJLyogT3V0cHV0IFNpZGUgKi8KKwkvKiBEQUMgbWl4ZXIgYmVmb3JlIHNvdW5kIGVmZmVjdCAgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIkRBQzEgTUlYTCIsIFNORF9TT0NfTk9QTSwgMCwgMCwgcnQ1NjYwX2RhY19sX21peCwKKwkJQVJSQVlfU0laRShydDU2NjBfZGFjX2xfbWl4KSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJEQUMxIE1JWFIiLCBTTkRfU09DX05PUE0sIDAsIDAsIHJ0NTY2MF9kYWNfcl9taXgsCisJCUFSUkFZX1NJWkUocnQ1NjYwX2RhY19yX21peCkpLAorCisJLyogREFDIE1peGVyICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiZGFjIHN0ZXJlbzEgZmlsdGVyIiwgUlQ1NjYwX1BXUl9ESUcyLAorCQlSVDU2NjBfUFdSX0RBQ19TMUZfQklULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlN0ZXJlbyBEQUMgTUlYTCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnQ1NjYwX3N0b19kYWNfbF9taXgsIEFSUkFZX1NJWkUocnQ1NjYwX3N0b19kYWNfbF9taXgpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIlN0ZXJlbyBEQUMgTUlYUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnQ1NjYwX3N0b19kYWNfcl9taXgsIEFSUkFZX1NJWkUocnQ1NjYwX3N0b19kYWNfcl9taXgpKSwKKworCS8qIERBQ3MgKi8KKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgTDEiLCBOVUxMLCBSVDU2NjBfUFdSX0RJRzEsCisJCQlSVDU2NjBfUFdSX0RBQ19MMV9CSVQsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkRBQyBSMSIsIE5VTEwsIFJUNTY2MF9QV1JfRElHMSwKKwkJCVJUNTY2MF9QV1JfREFDX1IxX0JJVCwgMCksCisKKwkvKiBPVVQgTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNQSyBNSVgiLCBSVDU2NjBfUFdSX01JWEVSLCBSVDU2NjBfUFdSX1NNX0JJVCwKKwkJMCwgcnQ1NjYwX3Nwa19taXgsIEFSUkFZX1NJWkUocnQ1NjYwX3Nwa19taXgpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk9VVCBNSVhMIiwgUlQ1NjYwX1BXUl9NSVhFUiwgUlQ1NjYwX1BXUl9PTV9MX0JJVCwKKwkJMCwgcnQ1NjYwX291dF9sX21peCwgQVJSQVlfU0laRShydDU2NjBfb3V0X2xfbWl4KSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJPVVQgTUlYUiIsIFJUNTY2MF9QV1JfTUlYRVIsIFJUNTY2MF9QV1JfT01fUl9CSVQsCisJCTAsIHJ0NTY2MF9vdXRfcl9taXgsIEFSUkFZX1NJWkUocnQ1NjYwX291dF9yX21peCkpLAorCisJLyogT3V0cHV0IFZvbHVtZSAqLworCVNORF9TT0NfREFQTV9TV0lUQ0goIlNQS1ZPTCIsIFJUNTY2MF9QV1JfVk9MLAorCQlSVDU2NjBfUFdSX1NWX0JJVCwgMCwgJnNwa192b2xfY29udHJvbCksCisJU05EX1NPQ19EQVBNX1BHQSgiREFDIDEiLCBTTkRfU09DX05PUE0sCisJCTAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkxPVVRWT0wiLCBTTkRfU09DX05PUE0sCisJCTAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TV0lUQ0goIkxPVVRWT0wgTCIsIFNORF9TT0NfTk9QTSwKKwkJUlQ1NjYwX1BXUl9MVl9MX0JJVCwgMCwgJmxvdXRfbF92b2xfY29udHJvbCksCisJU05EX1NPQ19EQVBNX1NXSVRDSCgiTE9VVFZPTCBSIiwgU05EX1NPQ19OT1BNLAorCQlSVDU2NjBfUFdSX0xWX1JfQklULCAwLCAmbG91dF9yX3ZvbF9jb250cm9sKSwKKworCS8qIEhQTy9MT1VUL01vbm8gTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIlNQTyBNSVgiLCBTTkRfU09DX05PUE0sIDAsCisJCTAsIHJ0NTY2MF9zcG9fbWl4LCBBUlJBWV9TSVpFKHJ0NTY2MF9zcG9fbWl4KSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJMT1VUIE1JWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJcnQ1NjYwX2xvdXRfbWl4LCBBUlJBWV9TSVpFKHJ0NTY2MF9sb3V0X21peCkpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlZSRUYgSFAiLCBSVDU2NjBfR0VOX0NUUkwxLAorCQlSVDU2NjBfUFdSX1ZSRUZfSFBfU0ZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBX1MoIkxPVVQgYW1wIiwgMSwgUlQ1NjYwX1BXUl9BTkxHMSwKKwkJUlQ1NjYwX1BXUl9IQV9CSVQsIDAsIHJ0NTY2MF9sb3V0X2V2ZW50LAorCQlTTkRfU09DX0RBUE1fUFJFX1BNRCB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSksCisJU05EX1NPQ19EQVBNX1BHQV9TKCJTUEsgYW1wIiwgMSwgUlQ1NjYwX1BXUl9ESUcxLAorCQlSVDU2NjBfUFdSX0NMU19EX0JJVCwgMCwgTlVMTCwgMCksCisKKwkvKiBPdXRwdXQgTGluZXMgKi8KKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJMT1VUTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkxPVVRSIiksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiU1BPIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBydDU2NjBfZGFwbV9yb3V0ZXNbXSA9IHsKKwl7ICJNSUNCSUFTMSIsIE5VTEwsICJMRE8yIiB9LAorCXsgIk1JQ0JJQVMyIiwgTlVMTCwgIkxETzIiIH0sCisKKwl7ICJCU1QxIiwgTlVMTCwgIklOMVAiIH0sCisJeyAiQlNUMSIsIE5VTEwsICJJTjFOIiB9LAorCXsgIkJTVDIiLCBOVUxMLCAiSU4yUCIgfSwKKwl7ICJCU1QzIiwgTlVMTCwgIklOM1AiIH0sCisJeyAiQlNUMyIsIE5VTEwsICJJTjNOIiB9LAorCisJeyAiUkVDTUlYTCIsICJCU1QzIFN3aXRjaCIsICJCU1QzIiB9LAorCXsgIlJFQ01JWEwiLCAiQlNUMiBTd2l0Y2giLCAiQlNUMiIgfSwKKwl7ICJSRUNNSVhMIiwgIkJTVDEgU3dpdGNoIiwgIkJTVDEiIH0sCisJeyAiUkVDTUlYTCIsICJPVVQgTUlYTCBTd2l0Y2giLCAiT1VUIE1JWEwiIH0sCisKKwl7ICJSRUNNSVhSIiwgIkJTVDMgU3dpdGNoIiwgIkJTVDMiIH0sCisJeyAiUkVDTUlYUiIsICJCU1QyIFN3aXRjaCIsICJCU1QyIiB9LAorCXsgIlJFQ01JWFIiLCAiQlNUMSBTd2l0Y2giLCAiQlNUMSIgfSwKKwl7ICJSRUNNSVhSIiwgIk9VVCBNSVhSIFN3aXRjaCIsICJPVVQgTUlYUiIgfSwKKworCXsgIkFEQyBMIiwgTlVMTCwgIlJFQ01JWEwiIH0sCisJeyAiQURDIEwiLCBOVUxMLCAiQURDIEwgcG93ZXIiIH0sCisJeyAiQURDIEwiLCBOVUxMLCAiQURDIGNsb2NrIiB9LAorCXsgIkFEQyBSIiwgTlVMTCwgIlJFQ01JWFIiIH0sCisJeyAiQURDIFIiLCBOVUxMLCAiQURDIFIgcG93ZXIiIH0sCisJeyAiQURDIFIiLCBOVUxMLCAiQURDIGNsb2NrIiB9LAorCisJeyJETUlDIEwxIiwgTlVMTCwgIkRNSUMgQ0xLIn0sCisJeyJETUlDIEwxIiwgTlVMTCwgIkRNSUMgUG93ZXIifSwKKwl7IkRNSUMgUjEiLCBOVUxMLCAiRE1JQyBDTEsifSwKKwl7IkRNSUMgUjEiLCBOVUxMLCAiRE1JQyBQb3dlciJ9LAorCisJeyAiU3RvMSBBREMgTUlYTCIsICJBREMxIFN3aXRjaCIsICJBREMgTCIgfSwKKwl7ICJTdG8xIEFEQyBNSVhMIiwgIkFEQzIgU3dpdGNoIiwgIkRNSUMgTDEiIH0sCisJeyAiU3RvMSBBREMgTUlYUiIsICJBREMxIFN3aXRjaCIsICJBREMgUiIgfSwKKwl7ICJTdG8xIEFEQyBNSVhSIiwgIkFEQzIgU3dpdGNoIiwgIkRNSUMgUjEiIH0sCisKKwl7ICJTdGVyZW8xIEFEQyBNSVhMIiwgTlVMTCwgIlN0bzEgQURDIE1JWEwiIH0sCisJeyAiU3RlcmVvMSBBREMgTUlYTCIsIE5VTEwsICJhZGMgc3RlcmVvMSBmaWx0ZXIiIH0sCisJeyAiYWRjIHN0ZXJlbzEgZmlsdGVyIiwgTlVMTCwgIlBMTDEiLCBydDU2NjBfaXNfc3lzX2Nsa19mcm9tX3BsbCB9LAorCisJeyAiU3RlcmVvMSBBREMgTUlYUiIsIE5VTEwsICJTdG8xIEFEQyBNSVhSIiB9LAorCXsgIlN0ZXJlbzEgQURDIE1JWFIiLCBOVUxMLCAiYWRjIHN0ZXJlbzEgZmlsdGVyIiB9LAorCXsgImFkYyBzdGVyZW8xIGZpbHRlciIsIE5VTEwsICJQTEwxIiwgcnQ1NjYwX2lzX3N5c19jbGtfZnJvbV9wbGwgfSwKKworCXsgIklGMSBBREMiLCBOVUxMLCAiU3RlcmVvMSBBREMgTUlYTCIgfSwKKwl7ICJJRjEgQURDIiwgTlVMTCwgIlN0ZXJlbzEgQURDIE1JWFIiIH0sCisJeyAiSUYxIEFEQyIsIE5VTEwsICJJMlMxIiB9LAorCisJeyAiSUYxIEFEQyBTd2FwIE11eCIsICJML1IiLCAiSUYxIEFEQyIgfSwKKwl7ICJJRjEgQURDIFN3YXAgTXV4IiwgIlIvTCIsICJJRjEgQURDIiB9LAorCXsgIklGMSBBREMgU3dhcCBNdXgiLCAiTC9MIiwgIklGMSBBREMiIH0sCisJeyAiSUYxIEFEQyBTd2FwIE11eCIsICJSL1IiLCAiSUYxIEFEQyIgfSwKKwl7ICJBSUYxVFgiLCBOVUxMLCAiSUYxIEFEQyBTd2FwIE11eCIgfSwKKworCXsgIklGMSBEQUMiLCBOVUxMLCAiQUlGMVJYIiB9LAorCXsgIklGMSBEQUMiLCBOVUxMLCAiSTJTMSIgfSwKKworCXsgIklGMSBEQUMgU3dhcCBNdXgiLCAiTC9SIiwgIklGMSBEQUMiIH0sCisJeyAiSUYxIERBQyBTd2FwIE11eCIsICJSL0wiLCAiSUYxIERBQyIgfSwKKwl7ICJJRjEgREFDIFN3YXAgTXV4IiwgIkwvTCIsICJJRjEgREFDIiB9LAorCXsgIklGMSBEQUMgU3dhcCBNdXgiLCAiUi9SIiwgIklGMSBEQUMiIH0sCisKKwl7ICJJRjEgREFDIEwiLCBOVUxMLCAiSUYxIERBQyBTd2FwIE11eCIgfSwKKwl7ICJJRjEgREFDIFIiLCBOVUxMLCAiSUYxIERBQyBTd2FwIE11eCIgfSwKKworCXsgIkRBQzEgTUlYTCIsICJTdGVyZW8gQURDIFN3aXRjaCIsICJTdGVyZW8xIEFEQyBNSVhMIiB9LAorCXsgIkRBQzEgTUlYTCIsICJEQUMxIFN3aXRjaCIsICJJRjEgREFDIEwiIH0sCisJeyAiREFDMSBNSVhSIiwgIlN0ZXJlbyBBREMgU3dpdGNoIiwgIlN0ZXJlbzEgQURDIE1JWFIiIH0sCisJeyAiREFDMSBNSVhSIiwgIkRBQzEgU3dpdGNoIiwgIklGMSBEQUMgUiIgfSwKKworCXsgIlN0ZXJlbyBEQUMgTUlYTCIsICJEQUMgTDEgU3dpdGNoIiwgIkRBQzEgTUlYTCIgfSwKKwl7ICJTdGVyZW8gREFDIE1JWEwiLCAiREFDIFIxIFN3aXRjaCIsICJEQUMxIE1JWFIiIH0sCisJeyAiU3RlcmVvIERBQyBNSVhMIiwgTlVMTCwgImRhYyBzdGVyZW8xIGZpbHRlciIgfSwKKwl7ICJkYWMgc3RlcmVvMSBmaWx0ZXIiLCBOVUxMLCAiUExMMSIsIHJ0NTY2MF9pc19zeXNfY2xrX2Zyb21fcGxsIH0sCisJeyAiU3RlcmVvIERBQyBNSVhSIiwgIkRBQyBSMSBTd2l0Y2giLCAiREFDMSBNSVhSIiB9LAorCXsgIlN0ZXJlbyBEQUMgTUlYUiIsICJEQUMgTDEgU3dpdGNoIiwgIkRBQzEgTUlYTCIgfSwKKwl7ICJTdGVyZW8gREFDIE1JWFIiLCBOVUxMLCAiZGFjIHN0ZXJlbzEgZmlsdGVyIiB9LAorCXsgImRhYyBzdGVyZW8xIGZpbHRlciIsIE5VTEwsICJQTEwxIiwgcnQ1NjYwX2lzX3N5c19jbGtfZnJvbV9wbGwgfSwKKworCXsgIkRBQyBMMSIsIE5VTEwsICJTdGVyZW8gREFDIE1JWEwiIH0sCisJeyAiREFDIFIxIiwgTlVMTCwgIlN0ZXJlbyBEQUMgTUlYUiIgfSwKKworCXsgIlNQSyBNSVgiLCAiQlNUMyBTd2l0Y2giLCAiQlNUMyIgfSwKKwl7ICJTUEsgTUlYIiwgIkJTVDEgU3dpdGNoIiwgIkJTVDEiIH0sCisJeyAiU1BLIE1JWCIsICJEQUNMIFN3aXRjaCIsICJEQUMgTDEiIH0sCisJeyAiU1BLIE1JWCIsICJEQUNSIFN3aXRjaCIsICJEQUMgUjEiIH0sCisJeyAiU1BLIE1JWCIsICJPVVRNSVhMIFN3aXRjaCIsICJPVVQgTUlYTCIgfSwKKworCXsgIk9VVCBNSVhMIiwgIkJTVDMgU3dpdGNoIiwgIkJTVDMiIH0sCisJeyAiT1VUIE1JWEwiLCAiQlNUMiBTd2l0Y2giLCAiQlNUMiIgfSwKKwl7ICJPVVQgTUlYTCIsICJCU1QxIFN3aXRjaCIsICJCU1QxIiB9LAorCXsgIk9VVCBNSVhMIiwgIlJFQ01JWEwgU3dpdGNoIiwgIlJFQ01JWEwiIH0sCisJeyAiT1VUIE1JWEwiLCAiREFDUiBTd2l0Y2giLCAiREFDIFIxIiB9LAorCXsgIk9VVCBNSVhMIiwgIkRBQ0wgU3dpdGNoIiwgIkRBQyBMMSIgfSwKKworCXsgIk9VVCBNSVhSIiwgIkJTVDIgU3dpdGNoIiwgIkJTVDIiIH0sCisJeyAiT1VUIE1JWFIiLCAiQlNUMSBTd2l0Y2giLCAiQlNUMSIgfSwKKwl7ICJPVVQgTUlYUiIsICJSRUNNSVhSIFN3aXRjaCIsICJSRUNNSVhSIiB9LAorCXsgIk9VVCBNSVhSIiwgIkRBQ1IgU3dpdGNoIiwgIkRBQyBSMSIgfSwKKwl7ICJPVVQgTUlYUiIsICJEQUNMIFN3aXRjaCIsICJEQUMgTDEiIH0sCisKKwl7ICJTUE8gTUlYIiwgIkRBQ1IgU3dpdGNoIiwgIkRBQyBSMSIgfSwKKwl7ICJTUE8gTUlYIiwgIkRBQ0wgU3dpdGNoIiwgIkRBQyBMMSIgfSwKKwl7ICJTUE8gTUlYIiwgIlNQS1ZPTCBTd2l0Y2giLCAiU1BLVk9MIiB9LAorCXsgIlNQTyBNSVgiLCAiQlNUMSBTd2l0Y2giLCAiQlNUMSIgfSwKKworCXsgIlNQS1ZPTCIsICJTd2l0Y2giLCAiU1BLIE1JWCIgfSwKKwl7ICJMT1VUVk9MIEwiLCAiU3dpdGNoIiwgIk9VVCBNSVhMIiB9LAorCXsgIkxPVVRWT0wgUiIsICJTd2l0Y2giLCAiT1VUIE1JWFIiIH0sCisKKwl7ICJMT1VUVk9MIiwgTlVMTCwgIkxPVVRWT0wgTCIgfSwKKwl7ICJMT1VUVk9MIiwgTlVMTCwgIkxPVVRWT0wgUiIgfSwKKworCXsgIkRBQyAxIiwgTlVMTCwgIkRBQyBMMSIgfSwKKwl7ICJEQUMgMSIsIE5VTEwsICJEQUMgUjEiIH0sCisKKwl7ICJMT1VUIE1JWCIsICJEQUMgU3dpdGNoIiwgIkRBQyAxIiB9LAorCXsgIkxPVVQgTUlYIiwgIk9VVE1JWCBTd2l0Y2giLCAiTE9VVFZPTCIgfSwKKworCXsgIkxPVVQgYW1wIiwgTlVMTCwgIkxPVVQgTUlYIiB9LAorCXsgIkxPVVQgYW1wIiwgTlVMTCwgIlZSRUYgSFAiIH0sCisJeyAiTE9VVEwiLCBOVUxMLCAiTE9VVCBhbXAiIH0sCisJeyAiTE9VVFIiLCBOVUxMLCAiTE9VVCBhbXAiIH0sCisKKwl7ICJTUEsgYW1wIiwgTlVMTCwgIlNQTyBNSVgiIH0sCisJeyAiU1BPIiwgTlVMTCwgIlNQSyBhbXAiIH0sCit9OworCitzdGF0aWMgaW50IHJ0NTY2MF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTY2MF9wcml2ICpydDU2NjAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgdmFsX2xlbiA9IDAsIHZhbF9jbGssIG1hc2tfY2xrOworCWludCBwcmVfZGl2LCBiY2xrX21zLCBmcmFtZV9zaXplOworCisJcnQ1NjYwLT5scmNrW2RhaS0+aWRdID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwlwcmVfZGl2ID0gcmw2MjMxX2dldF9jbGtfaW5mbyhydDU2NjAtPnN5c2NsaywgcnQ1NjYwLT5scmNrW2RhaS0+aWRdKTsKKwlpZiAocHJlX2RpdiA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5zdXBwb3J0ZWQgY2xvY2sgc2V0dGluZyAlZCBmb3IgREFJICVkXG4iLAorCQkJcnQ1NjYwLT5scmNrW2RhaS0+aWRdLCBkYWktPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZnJhbWVfc2l6ZSA9IHNuZF9zb2NfcGFyYW1zX3RvX2ZyYW1lX3NpemUocGFyYW1zKTsKKwlpZiAoZnJhbWVfc2l6ZSA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5zdXBwb3J0ZWQgZnJhbWUgc2l6ZTogJWRcbiIsIGZyYW1lX3NpemUpOworCQlyZXR1cm4gZnJhbWVfc2l6ZTsKKwl9CisKKwlpZiAoZnJhbWVfc2l6ZSA+IDMyKQorCQliY2xrX21zID0gMTsKKwllbHNlCisJCWJjbGtfbXMgPSAwOworCisJcnQ1NjYwLT5iY2xrW2RhaS0+aWRdID0gcnQ1NjYwLT5scmNrW2RhaS0+aWRdICogKDMyIDw8IGJjbGtfbXMpOworCisJZGV2X2RiZyhkYWktPmRldiwgImJjbGsgaXMgJWRIeiBhbmQgbHJjayBpcyAlZEh6XG4iLAorCQlydDU2NjAtPmJjbGtbZGFpLT5pZF0sIHJ0NTY2MC0+bHJja1tkYWktPmlkXSk7CisJZGV2X2RiZyhkYWktPmRldiwgImJjbGtfbXMgaXMgJWQgYW5kIHByZV9kaXYgaXMgJWQgZm9yIGlpcyAlZFxuIiwKKwkJCQliY2xrX21zLCBwcmVfZGl2LCBkYWktPmlkKTsKKworCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwljYXNlIDE2OgorCQlicmVhazsKKwljYXNlIDIwOgorCQl2YWxfbGVuIHw9IFJUNTY2MF9JMlNfRExfMjA7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXZhbF9sZW4gfD0gUlQ1NjYwX0kyU19ETF8yNDsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQl2YWxfbGVuIHw9IFJUNTY2MF9JMlNfRExfODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChkYWktPmlkKSB7CisJY2FzZSBSVDU2NjBfQUlGMToKKwkJbWFza19jbGsgPSBSVDU2NjBfSTJTX0JDTEtfTVMxX01BU0sgfCBSVDU2NjBfSTJTX1BEMV9NQVNLOworCQl2YWxfY2xrID0gYmNsa19tcyA8PCBSVDU2NjBfSTJTX0JDTEtfTVMxX1NGVCB8CisJCQlwcmVfZGl2IDw8IFJUNTY2MF9JMlNfUEQxX1NGVDsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0kyUzFfU0RQLCBSVDU2NjBfSTJTX0RMX01BU0ssCisJCQl2YWxfbGVuKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0FEREFfQ0xLMSwgbWFza19jbGssIHZhbF9jbGspOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgZGFpLT5pZDogJWRcbiIsIGRhaS0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjBfc2V0X2RhaV9mbXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHVuc2lnbmVkIGludCBmbXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjYwX3ByaXYgKnJ0NTY2MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCByZWdfdmFsID0gMDsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCXJ0NTY2MC0+bWFzdGVyW2RhaS0+aWRdID0gMTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCXJlZ192YWwgfD0gUlQ1NjYwX0kyU19NU19TOworCQlydDU2NjAtPm1hc3RlcltkYWktPmlkXSA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBSUZNVF9JQl9ORjoKKwkJcmVnX3ZhbCB8PSBSVDU2NjBfSTJTX0JQX0lOVjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBSUZNVF9MRUZUX0o6CisJCXJlZ192YWwgfD0gUlQ1NjYwX0kyU19ERl9MRUZUOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQUlGTVRfRFNQX0E6CisJCXJlZ192YWwgfD0gUlQ1NjYwX0kyU19ERl9QQ01fQTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQlyZWdfdmFsICB8PSBSVDU2NjBfSTJTX0RGX1BDTV9COworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZGFpLT5pZCkgeworCWNhc2UgUlQ1NjYwX0FJRjE6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9JMlMxX1NEUCwKKwkJCVJUNTY2MF9JMlNfTVNfTUFTSyB8IFJUNTY2MF9JMlNfQlBfTUFTSyB8CisJCQlSVDU2NjBfSTJTX0RGX01BU0ssIHJlZ192YWwpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgZGFpLT5pZDogJWRcbiIsIGRhaS0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjBfc2V0X2RhaV9zeXNjbGsoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCisJCWludCBjbGtfaWQsIHVuc2lnbmVkIGludCBmcmVxLCBpbnQgZGlyKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CisJc3RydWN0IHJ0NTY2MF9wcml2ICpydDU2NjAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgcmVnX3ZhbCA9IDA7CisKKwlpZiAoZnJlcSA9PSBydDU2NjAtPnN5c2NsayAmJiBjbGtfaWQgPT0gcnQ1NjYwLT5zeXNjbGtfc3JjKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoY2xrX2lkKSB7CisJY2FzZSBSVDU2NjBfU0NMS19TX01DTEs6CisJCXJlZ192YWwgfD0gUlQ1NjYwX1NDTEtfU1JDX01DTEs7CisJCWJyZWFrOworCisJY2FzZSBSVDU2NjBfU0NMS19TX1BMTDE6CisJCXJlZ192YWwgfD0gUlQ1NjYwX1NDTEtfU1JDX1BMTDE7CisJCWJyZWFrOworCisJY2FzZSBSVDU2NjBfU0NMS19TX1JDQ0xLOgorCQlyZWdfdmFsIHw9IFJUNTY2MF9TQ0xLX1NSQ19SQ0NMSzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIGNsb2NrIGlkICglZClcbiIsIGNsa19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9HTEJfQ0xLLCBSVDU2NjBfU0NMS19TUkNfTUFTSywKKwkJcmVnX3ZhbCk7CisKKwlydDU2NjAtPnN5c2NsayA9IGZyZXE7CisJcnQ1NjYwLT5zeXNjbGtfc3JjID0gY2xrX2lkOworCisJZGV2X2RiZyhkYWktPmRldiwgIlN5c2NsayBpcyAlZEh6IGFuZCBjbG9jayBpZCBpcyAlZFxuIiwgZnJlcSwgY2xrX2lkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2MF9zZXRfZGFpX3BsbChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IHBsbF9pZCwgaW50IHNvdXJjZSwKKwkJCXVuc2lnbmVkIGludCBmcmVxX2luLCB1bnNpZ25lZCBpbnQgZnJlcV9vdXQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcnQ1NjYwX3ByaXYgKnJ0NTY2MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXN0cnVjdCBybDYyMzFfcGxsX2NvZGUgcGxsX2NvZGU7CisJaW50IHJldDsKKworCWlmIChzb3VyY2UgPT0gcnQ1NjYwLT5wbGxfc3JjICYmIGZyZXFfaW4gPT0gcnQ1NjYwLT5wbGxfaW4gJiYKKwkJZnJlcV9vdXQgPT0gcnQ1NjYwLT5wbGxfb3V0KQorCQlyZXR1cm4gMDsKKworCWlmICghZnJlcV9pbiB8fCAhZnJlcV9vdXQpIHsKKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiUExMIGRpc2FibGVkXG4iKTsKKworCQlydDU2NjAtPnBsbF9pbiA9IDA7CisJCXJ0NTY2MC0+cGxsX291dCA9IDA7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9HTEJfQ0xLLAorCQkJUlQ1NjYwX1NDTEtfU1JDX01BU0ssIFJUNTY2MF9TQ0xLX1NSQ19NQ0xLKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChzb3VyY2UpIHsKKwljYXNlIFJUNTY2MF9QTEwxX1NfTUNMSzoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX0dMQl9DTEssCisJCQlSVDU2NjBfUExMMV9TUkNfTUFTSywgUlQ1NjYwX1BMTDFfU1JDX01DTEspOworCQlicmVhazsKKworCWNhc2UgUlQ1NjYwX1BMTDFfU19CQ0xLOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfR0xCX0NMSywKKwkJCVJUNTY2MF9QTEwxX1NSQ19NQVNLLCBSVDU2NjBfUExMMV9TUkNfQkNMSzEpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gUExMIHNvdXJjZSAlZFxuIiwgc291cmNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gcmw2MjMxX3BsbF9jYWxjKGZyZXFfaW4sIGZyZXFfb3V0LCAmcGxsX2NvZGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVuc3VwcG9ydCBpbnB1dCBjbG9jayAlZFxuIiwgZnJlcV9pbik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiYnlwYXNzPSVkIG09JWQgbj0lZCBrPSVkXG4iLAorCQlwbGxfY29kZS5tX2JwLCAocGxsX2NvZGUubV9icCA/IDAgOiBwbGxfY29kZS5tX2NvZGUpLAorCQlwbGxfY29kZS5uX2NvZGUsIHBsbF9jb2RlLmtfY29kZSk7CisKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjBfUExMX0NUUkwxLAorCQlwbGxfY29kZS5uX2NvZGUgPDwgUlQ1NjYwX1BMTF9OX1NGVCB8IHBsbF9jb2RlLmtfY29kZSk7CisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYwX1BMTF9DVFJMMiwKKwkJKHBsbF9jb2RlLm1fYnAgPyAwIDogcGxsX2NvZGUubV9jb2RlKSA8PCBSVDU2NjBfUExMX01fU0ZUIHwKKwkJcGxsX2NvZGUubV9icCA8PCBSVDU2NjBfUExMX01fQlBfU0ZUKTsKKworCXJ0NTY2MC0+cGxsX2luID0gZnJlcV9pbjsKKwlydDU2NjAtPnBsbF9vdXQgPSBmcmVxX291dDsKKwlydDU2NjAtPnBsbF9zcmMgPSBzb3VyY2U7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjBfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJc3RydWN0IHJ0NTY2MF9wcml2ICpydDU2NjAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09OOgorCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2MF9HRU5fQ1RSTDEsCisJCQlSVDU2NjBfRElHX0dBVEVfQ1RSTCwgUlQ1NjYwX0RJR19HQVRFX0NUUkwpOworCisJCWlmIChJU19FUlIocnQ1NjYwLT5tY2xrKSkKKwkJCWJyZWFrOworCisJCWlmIChzbmRfc29jX2NvZGVjX2dldF9iaWFzX2xldmVsKGNvZGVjKSA9PSBTTkRfU09DX0JJQVNfT04pIHsKKwkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShydDU2NjAtPm1jbGspOworCQl9IGVsc2UgeworCQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHJ0NTY2MC0+bWNsayk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAoc25kX3NvY19jb2RlY19nZXRfYmlhc19sZXZlbChjb2RlYykgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX1BXUl9BTkxHMSwKKwkJCQlSVDU2NjBfUFdSX1ZSRUYxIHwgUlQ1NjYwX1BXUl9NQiB8CisJCQkJUlQ1NjYwX1BXUl9CRyB8IFJUNTY2MF9QV1JfVlJFRjIsCisJCQkJUlQ1NjYwX1BXUl9WUkVGMSB8IFJUNTY2MF9QV1JfTUIgfAorCQkJCVJUNTY2MF9QV1JfQkcgfCBSVDU2NjBfUFdSX1ZSRUYyKTsKKwkJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTUwMDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYwX1BXUl9BTkxHMSwKKwkJCQlSVDU2NjBfUFdSX0ZWMSB8IFJUNTY2MF9QV1JfRlYyLAorCQkJCVJUNTY2MF9QV1JfRlYxIHwgUlQ1NjYwX1BXUl9GVjIpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjBfR0VOX0NUUkwxLAorCQkJUlQ1NjYwX0RJR19HQVRFX0NUUkwsIDApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2MF9wcm9iZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHJ0NTY2MF9wcml2ICpydDU2NjAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJ0NTY2MC0+Y29kZWMgPSBjb2RlYzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2MF9yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjBfUkVTRVQsIDApOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHJ0NTY2MF9zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgcnQ1NjYwX3ByaXYgKnJ0NTY2MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcmVnY2FjaGVfY2FjaGVfb25seShydDU2NjAtPnJlZ21hcCwgdHJ1ZSk7CisJcmVnY2FjaGVfbWFya19kaXJ0eShydDU2NjAtPnJlZ21hcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjBfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgcnQ1NjYwX3ByaXYgKnJ0NTY2MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKHJ0NTY2MC0+cGRhdGEucG93ZXJvZmZfY29kZWNfaW5fc3VzcGVuZCkKKwkJdXNsZWVwX3JhbmdlKDM1MDAwMCwgNDAwMDAwKTsKKworCXJlZ2NhY2hlX2NhY2hlX29ubHkocnQ1NjYwLT5yZWdtYXAsIGZhbHNlKTsKKwlyZWdjYWNoZV9zeW5jKHJ0NTY2MC0+cmVnbWFwKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcnQ1NjYwX3N1c3BlbmQgTlVMTAorI2RlZmluZSBydDU2NjBfcmVzdW1lIE5VTEwKKyNlbmRpZgorCisjZGVmaW5lIFJUNTY2MF9TVEVSRU9fUkFURVMgU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAKKyNkZWZpbmUgUlQ1NjYwX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1M4KQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBydDU2NjBfYWlmX2RhaV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IHJ0NTY2MF9od19wYXJhbXMsCisJLnNldF9mbXQgPSBydDU2NjBfc2V0X2RhaV9mbXQsCisJLnNldF9zeXNjbGsgPSBydDU2NjBfc2V0X2RhaV9zeXNjbGssCisJLnNldF9wbGwgPSBydDU2NjBfc2V0X2RhaV9wbGwsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBydDU2NjBfZGFpW10gPSB7CisJeworCQkubmFtZSA9ICJydDU2NjAtYWlmMSIsCisJCS5pZCA9IFJUNTY2MF9BSUYxLAorCQkucGxheWJhY2sgPSB7CisJCQkuc3RyZWFtX25hbWUgPSAiQUlGMSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gUlQ1NjYwX1NURVJFT19SQVRFUywKKwkJCS5mb3JtYXRzID0gUlQ1NjYwX0ZPUk1BVFMsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFJRjEgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gUlQ1NjYwX1NURVJFT19SQVRFUywKKwkJCS5mb3JtYXRzID0gUlQ1NjYwX0ZPUk1BVFMsCisJCX0sCisJCS5vcHMgPSAmcnQ1NjYwX2FpZl9kYWlfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfcnQ1NjYwID0geworCS5wcm9iZSA9IHJ0NTY2MF9wcm9iZSwKKwkucmVtb3ZlID0gcnQ1NjYwX3JlbW92ZSwKKwkuc3VzcGVuZCA9IHJ0NTY2MF9zdXNwZW5kLAorCS5yZXN1bWUgPSBydDU2NjBfcmVzdW1lLAorCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTY2MF9zZXRfYmlhc19sZXZlbCwKKwkuaWRsZV9iaWFzX29mZiA9IHRydWUsCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDU2NjBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQ1NjYwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQ1NjYwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0NTY2MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQ1NjYwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDU2NjBfZGFwbV9yb3V0ZXMpLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQ1NjYwX3JlZ21hcCA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDE2LAorCS51c2Vfc2luZ2xlX3J3ID0gdHJ1ZSwKKworCS5tYXhfcmVnaXN0ZXIgPSBSVDU2NjBfVkVORE9SX0lEMiArIDEgKyAoQVJSQVlfU0laRShydDU2NjBfcmFuZ2VzKSAqCisJCQkJCSAgICAgICBSVDU2NjBfUFJfU1BBQ0lORyksCisJLnZvbGF0aWxlX3JlZyA9IHJ0NTY2MF92b2xhdGlsZV9yZWdpc3RlciwKKwkucmVhZGFibGVfcmVnID0gcnQ1NjYwX3JlYWRhYmxlX3JlZ2lzdGVyLAorCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLnJlZ19kZWZhdWx0cyA9IHJ0NTY2MF9yZWcsCisJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKHJ0NTY2MF9yZWcpLAorCS5yYW5nZXMgPSBydDU2NjBfcmFuZ2VzLAorCS5udW1fcmFuZ2VzID0gQVJSQVlfU0laRShydDU2NjBfcmFuZ2VzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBydDU2NjBfaTJjX2lkW10gPSB7CisJeyAicnQ1NjYwIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBydDU2NjBfaTJjX2lkKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcnQ1NjYwX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyZWFsdGVrLHJ0NTY2MCIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcnQ1NjYwX29mX21hdGNoKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBydDU2NjBfYWNwaV9tYXRjaFtdID0geworCXsgIjEwRUM1NjYwIiwgMCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHJ0NTY2MF9hY3BpX21hdGNoKTsKKworc3RhdGljIGludCBydDU2NjBfcGFyc2VfZHQoc3RydWN0IHJ0NTY2MF9wcml2ICpydDU2NjAsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlydDU2NjAtPnBkYXRhLmluMV9kaWZmID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsCisJCQkJCSJyZWFsdGVrLGluMS1kaWZmZXJlbnRpYWwiKTsKKwlydDU2NjAtPnBkYXRhLmluM19kaWZmID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsCisJCQkJCSJyZWFsdGVrLGluMy1kaWZmZXJlbnRpYWwiKTsKKwlydDU2NjAtPnBkYXRhLnBvd2Vyb2ZmX2NvZGVjX2luX3N1c3BlbmQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwKKwkJCQkJInJlYWx0ZWsscG93ZXJvZmYtaW4tc3VzcGVuZCIpOworCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJyZWFsdGVrLGRtaWMxLWRhdGEtcGluIiwKKwkJJnJ0NTY2MC0+cGRhdGEuZG1pYzFfZGF0YV9waW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBydDU2NjBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZpMmMtPmRldik7CisJc3RydWN0IHJ0NTY2MF9wcml2ICpydDU2NjA7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJcnQ1NjYwID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKHN0cnVjdCBydDU2NjBfcHJpdiksCisJCUdGUF9LRVJORUwpOworCisJaWYgKHJ0NTY2MCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIENoZWNrIGlmIE1DTEsgcHJvdmlkZWQgKi8KKwlydDU2NjAtPm1jbGsgPSBkZXZtX2Nsa19nZXQoJmkyYy0+ZGV2LCAibWNsayIpOworCWlmIChQVFJfRVJSKHJ0NTY2MC0+bWNsaykgPT0gLUVQUk9CRV9ERUZFUikKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBydDU2NjApOworCisJaWYgKHBkYXRhKQorCQlydDU2NjAtPnBkYXRhID0gKnBkYXRhOworCWVsc2UgaWYgKGkyYy0+ZGV2Lm9mX25vZGUpCisJCXJ0NTY2MF9wYXJzZV9kdChydDU2NjAsICZpMmMtPmRldik7CisKKwlydDU2NjAtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnJ0NTY2MF9yZWdtYXApOworCWlmIChJU19FUlIocnQ1NjYwLT5yZWdtYXApKSB7CisJCXJldCA9IFBUUl9FUlIocnQ1NjYwLT5yZWdtYXApOworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RlciBtYXA6ICVkXG4iLAorCQkJcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZWdtYXBfcmVhZChydDU2NjAtPnJlZ21hcCwgUlQ1NjYwX1ZFTkRPUl9JRDIsICZ2YWwpOworCWlmICh2YWwgIT0gUlQ1NjYwX0RFVklDRV9JRCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwKKwkJCSJEZXZpY2Ugd2l0aCBJRCByZWdpc3RlciAlI3ggaXMgbm90IHJ0NTY2MFxuIiwgdmFsKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmVnbWFwX3dyaXRlKHJ0NTY2MC0+cmVnbWFwLCBSVDU2NjBfUkVTRVQsIDApOworCisJcmV0ID0gcmVnbWFwX3JlZ2lzdGVyX3BhdGNoKHJ0NTY2MC0+cmVnbWFwLCBydDU2NjBfcGF0Y2gsCisJCQkJICAgIEFSUkFZX1NJWkUocnQ1NjYwX3BhdGNoKSk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfd2FybigmaTJjLT5kZXYsICJGYWlsZWQgdG8gYXBwbHkgcmVnbWFwIHBhdGNoOiAlZFxuIiwgcmV0KTsKKworCWlmIChydDU2NjAtPnBkYXRhLmRtaWMxX2RhdGFfcGluKSB7CisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjAtPnJlZ21hcCwgUlQ1NjYwX0dQSU9fQ1RSTDEsCisJCQlSVDU2NjBfR1AxX1BJTl9NQVNLLCBSVDU2NjBfR1AxX1BJTl9ETUlDMV9TQ0wpOworCisJCWlmIChydDU2NjAtPnBkYXRhLmRtaWMxX2RhdGFfcGluID09IFJUNTY2MF9ETUlDMV9EQVRBX0dQSU8yKQorCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2MC0+cmVnbWFwLCBSVDU2NjBfRE1JQ19DVFJMMSwKKwkJCQlSVDU2NjBfU0VMX0RNSUNfREFUQV9NQVNLLAorCQkJCVJUNTY2MF9TRUxfRE1JQ19EQVRBX0dQSU8yKTsKKwkJZWxzZSBpZiAocnQ1NjYwLT5wZGF0YS5kbWljMV9kYXRhX3BpbiA9PSBSVDU2NjBfRE1JQzFfREFUQV9JTjFQKQorCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2MC0+cmVnbWFwLCBSVDU2NjBfRE1JQ19DVFJMMSwKKwkJCQlSVDU2NjBfU0VMX0RNSUNfREFUQV9NQVNLLAorCQkJCVJUNTY2MF9TRUxfRE1JQ19EQVRBX0lOMVApOworCX0KKworCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwgJnNvY19jb2RlY19kZXZfcnQ1NjYwLAorCQkJCSAgICAgIHJ0NTY2MF9kYWksIEFSUkFZX1NJWkUocnQ1NjYwX2RhaSkpOworfQorCitzdGF0aWMgaW50IHJ0NTY2MF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHJ0NTY2MF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInJ0NTY2MCIsCisJCS5hY3BpX21hdGNoX3RhYmxlID0gQUNQSV9QVFIocnQ1NjYwX2FjcGlfbWF0Y2gpLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIocnQ1NjYwX29mX21hdGNoKSwKKwl9LAorCS5wcm9iZSA9IHJ0NTY2MF9pMmNfcHJvYmUsCisJLnJlbW92ZSAgID0gcnQ1NjYwX2kyY19yZW1vdmUsCisJLmlkX3RhYmxlID0gcnQ1NjYwX2kyY19pZCwKK307Cittb2R1bGVfaTJjX2RyaXZlcihydDU2NjBfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBSVDU2NjAgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJPZGVyIENoaW91IDxvZGVyX2NoaW91QHJlYWx0ZWsuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NjAuaCBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkYjkyNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYwLmgKQEAgLTAsMCArMSw4NDcgQEAKKy8qCisgKiBydDU2NjAuaCAgLS0gIFJUNTY2MCBBTFNBIFNvQyBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4KKyAqIEF1dGhvcjogT2RlciBDaGlvdSA8b2Rlcl9jaGlvdUByZWFsdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX1JUNTY2MF9ICisjZGVmaW5lIF9SVDU2NjBfSAorCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8c291bmQvcnQ1NjYwLmg+CisKKy8qIEluZm8gKi8KKyNkZWZpbmUgUlQ1NjYwX1JFU0VUCQkJCTB4MDAKKyNkZWZpbmUgUlQ1NjYwX1ZFTkRPUl9JRAkJCTB4ZmQKKyNkZWZpbmUgUlQ1NjYwX1ZFTkRPUl9JRDEJCQkweGZlCisjZGVmaW5lIFJUNTY2MF9WRU5ET1JfSUQyCQkJMHhmZgorLyogIEkvTyAtIE91dHB1dCAqLworI2RlZmluZSBSVDU2NjBfU1BLX1ZPTAkJCQkweDAxCisjZGVmaW5lIFJUNTY2MF9MT1VUX1ZPTAkJCQkweDAyCisvKiBJL08gLSBJbnB1dCAqLworI2RlZmluZSBSVDU2NjBfSU4xX0lOMgkJCQkweDBkCisjZGVmaW5lIFJUNTY2MF9JTjNfSU40CQkJCTB4MGUKKy8qIEkvTyAtIEFEQy9EQUMvRE1JQyAqLworI2RlZmluZSBSVDU2NjBfREFDMV9ESUdfVk9MCQkJMHgxOQorI2RlZmluZSBSVDU2NjBfU1RPMV9BRENfRElHX1ZPTAkJCTB4MWMKKyNkZWZpbmUgUlQ1NjYwX0FEQ19CU1RfVk9MMQkJCTB4MWUKKy8qIE1peGVyIC0gRC1EICovCisjZGVmaW5lIFJUNTY2MF9TVE8xX0FEQ19NSVhFUgkJCTB4MjcKKyNkZWZpbmUgUlQ1NjYwX0FEX0RBX01JWEVSCQkJMHgyOQorI2RlZmluZSBSVDU2NjBfU1RPX0RBQ19NSVhFUgkJCTB4MmEKKyNkZWZpbmUgUlQ1NjYwX0RJR19JTkYxX0RBVEEJCQkweDJmCisvKiBNaXhlciAtIEFEQyAqLworI2RlZmluZSBSVDU2NjBfUkVDX0wxX01JWEVSCQkJMHgzYgorI2RlZmluZSBSVDU2NjBfUkVDX0wyX01JWEVSCQkJMHgzYworI2RlZmluZSBSVDU2NjBfUkVDX1IxX01JWEVSCQkJMHgzZAorI2RlZmluZSBSVDU2NjBfUkVDX1IyX01JWEVSCQkJMHgzZQorLyogTWl4ZXIgLSBEQUMgKi8KKyNkZWZpbmUgUlQ1NjYwX0xPVVRfTUlYRVIJCQkweDQ1CisjZGVmaW5lIFJUNTY2MF9TUEtfTUlYRVIJCQkweDQ2CisjZGVmaW5lIFJUNTY2MF9TUE9fTUlYRVIJCQkweDQ4CisjZGVmaW5lIFJUNTY2MF9TUE9fQ0xTRF9SQVRJTwkJCTB4NGEKKyNkZWZpbmUgUlQ1NjYwX09VVF9MX0dBSU4xCQkJMHg0ZAorI2RlZmluZSBSVDU2NjBfT1VUX0xfR0FJTjIJCQkweDRlCisjZGVmaW5lIFJUNTY2MF9PVVRfTDFfTUlYRVIJCQkweDRmCisjZGVmaW5lIFJUNTY2MF9PVVRfUl9HQUlOMQkJCTB4NTAKKyNkZWZpbmUgUlQ1NjYwX09VVF9SX0dBSU4yCQkJMHg1MQorI2RlZmluZSBSVDU2NjBfT1VUX1IxX01JWEVSCQkJMHg1MgorLyogUG93ZXIgKi8KKyNkZWZpbmUgUlQ1NjYwX1BXUl9ESUcxCQkJCTB4NjEKKyNkZWZpbmUgUlQ1NjYwX1BXUl9ESUcyCQkJCTB4NjIKKyNkZWZpbmUgUlQ1NjYwX1BXUl9BTkxHMQkJCTB4NjMKKyNkZWZpbmUgUlQ1NjYwX1BXUl9BTkxHMgkJCTB4NjQKKyNkZWZpbmUgUlQ1NjYwX1BXUl9NSVhFUgkJCTB4NjUKKyNkZWZpbmUgUlQ1NjYwX1BXUl9WT0wJCQkJMHg2NgorLyogUHJpdmF0ZSBSZWdpc3RlciBDb250cm9sICovCisjZGVmaW5lIFJUNTY2MF9QUklWX0lOREVYCQkJMHg2YQorI2RlZmluZSBSVDU2NjBfUFJJVl9EQVRBCQkJMHg2YworLyogRm9ybWF0IC0gQURDL0RBQyAqLworI2RlZmluZSBSVDU2NjBfSTJTMV9TRFAJCQkJMHg3MAorI2RlZmluZSBSVDU2NjBfQUREQV9DTEsxCQkJMHg3MworI2RlZmluZSBSVDU2NjBfQUREQV9DTEsyCQkJMHg3NAorI2RlZmluZSBSVDU2NjBfRE1JQ19DVFJMMQkJCTB4NzUKKy8qIEZ1bmN0aW9uIC0gQW5hbG9nICovCisjZGVmaW5lIFJUNTY2MF9HTEJfQ0xLCQkJCTB4ODAKKyNkZWZpbmUgUlQ1NjYwX1BMTF9DVFJMMQkJCTB4ODEKKyNkZWZpbmUgUlQ1NjYwX1BMTF9DVFJMMgkJCTB4ODIKKyNkZWZpbmUgUlQ1NjYwX0NMU0RfQU1QX09DX0NUUkwJCQkweDhjCisjZGVmaW5lIFJUNTY2MF9DTFNEX0FNUF9DVFJMCQkJMHg4ZAorI2RlZmluZSBSVDU2NjBfTE9VVF9BTVBfQ1RSTAkJCTB4OGUKKyNkZWZpbmUgUlQ1NjYwX1NQS19BTVBfU1BLVkRECQkJMHg5MgorI2RlZmluZSBSVDU2NjBfTUlDQklBUwkJCQkweDkzCisjZGVmaW5lIFJUNTY2MF9DTFNEX09VVF9DVFJMMQkJCTB4YTEKKyNkZWZpbmUgUlQ1NjYwX0NMU0RfT1VUX0NUUkwyCQkJMHhhMgorI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMQkJCTB4YTMKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDIJCQkweGE0CisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwzCQkJMHhhNQorI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMNAkJCTB4YTYKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDUJCQkweGE3CisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw2CQkJMHhhOAorI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMNwkJCTB4YTkKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDgJCQkweGFhCisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkw5CQkJMHhhYgorI2RlZmluZSBSVDU2NjBfRElQT0xFX01JQ19DVFJMMTAJCTB4YWMKKyNkZWZpbmUgUlQ1NjYwX0RJUE9MRV9NSUNfQ1RSTDExCQkweGFkCisjZGVmaW5lIFJUNTY2MF9ESVBPTEVfTUlDX0NUUkwxMgkJMHhhZQorLyogRnVuY3Rpb24gLSBEaWdpdGFsICovCisjZGVmaW5lIFJUNTY2MF9FUV9DVFJMMQkJCQkweGIwCisjZGVmaW5lIFJUNTY2MF9FUV9DVFJMMgkJCQkweGIxCisjZGVmaW5lIFJUNTY2MF9EUkNfQUdDX0NUUkwxCQkJMHhiMworI2RlZmluZSBSVDU2NjBfRFJDX0FHQ19DVFJMMgkJCTB4YjQKKyNkZWZpbmUgUlQ1NjYwX0RSQ19BR0NfQ1RSTDMJCQkweGI1CisjZGVmaW5lIFJUNTY2MF9EUkNfQUdDX0NUUkw0CQkJMHhiNgorI2RlZmluZSBSVDU2NjBfRFJDX0FHQ19DVFJMNQkJCTB4YjcKKyNkZWZpbmUgUlQ1NjYwX0pEX0NUUkwJCQkJMHhiYgorI2RlZmluZSBSVDU2NjBfSVJRX0NUUkwxCQkJMHhiZAorI2RlZmluZSBSVDU2NjBfSVJRX0NUUkwyCQkJMHhiZQorI2RlZmluZSBSVDU2NjBfSU5UX0lSUV9TVAkJCTB4YmYKKyNkZWZpbmUgUlQ1NjYwX0dQSU9fQ1RSTDEJCQkweGMwCisjZGVmaW5lIFJUNTY2MF9HUElPX0NUUkwyCQkJMHhjMgorI2RlZmluZSBSVDU2NjBfV0lORF9GSUxURVJfQ1RSTDEJCTB4ZDMKKyNkZWZpbmUgUlQ1NjYwX1NWX1pDRDEJCQkJMHhkOQorI2RlZmluZSBSVDU2NjBfU1ZfWkNEMgkJCQkweGRhCisjZGVmaW5lIFJUNTY2MF9EUkMxX0xNX0NUUkwxCQkJMHhlMAorI2RlZmluZSBSVDU2NjBfRFJDMV9MTV9DVFJMMgkJCTB4ZTEKKyNkZWZpbmUgUlQ1NjYwX0RSQzJfTE1fQ1RSTDEJCQkweGUyCisjZGVmaW5lIFJUNTY2MF9EUkMyX0xNX0NUUkwyCQkJMHhlMworI2RlZmluZSBSVDU2NjBfTVVMVElfRFJDX0NUUkwJCQkweGU0CisjZGVmaW5lIFJUNTY2MF9EUkMyX0NUUkwxCQkJMHhlNQorI2RlZmluZSBSVDU2NjBfRFJDMl9DVFJMMgkJCTB4ZTYKKyNkZWZpbmUgUlQ1NjYwX0RSQzJfQ1RSTDMJCQkweGU3CisjZGVmaW5lIFJUNTY2MF9EUkMyX0NUUkw0CQkJMHhlOAorI2RlZmluZSBSVDU2NjBfRFJDMl9DVFJMNQkJCTB4ZTkKKyNkZWZpbmUgUlQ1NjYwX0FMQ19QR0FfQ1RSTDEJCQkweGVhCisjZGVmaW5lIFJUNTY2MF9BTENfUEdBX0NUUkwyCQkJMHhlYgorI2RlZmluZSBSVDU2NjBfQUxDX1BHQV9DVFJMMwkJCTB4ZWMKKyNkZWZpbmUgUlQ1NjYwX0FMQ19QR0FfQ1RSTDQJCQkweGVkCisjZGVmaW5lIFJUNTY2MF9BTENfUEdBX0NUUkw1CQkJMHhlZQorI2RlZmluZSBSVDU2NjBfQUxDX1BHQV9DVFJMNgkJCTB4ZWYKKyNkZWZpbmUgUlQ1NjYwX0FMQ19QR0FfQ1RSTDcJCQkweGYwCisKKy8qIEdlbmVyYWwgQ29udHJvbCAqLworI2RlZmluZSBSVDU2NjBfR0VOX0NUUkwxCQkJMHhmYQorI2RlZmluZSBSVDU2NjBfR0VOX0NUUkwyCQkJMHhmYgorI2RlZmluZSBSVDU2NjBfR0VOX0NUUkwzCQkJMHhmYworCisvKiBJbmRleCBvZiBDb2RlYyBQcml2YXRlIFJlZ2lzdGVyIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgUlQ1NjYwX0NIT1BfREFDX0FEQwkJCTB4M2QKKworLyogR2xvYmFsIERlZmluaXRpb24gKi8KKyNkZWZpbmUgUlQ1NjYwX0xfTVVURQkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfTF9NVVRFX1NGVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9WT0xfTF9NVVRFCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1ZPTF9MX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9SX01VVEUJCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjBfUl9NVVRFX1NGVAkJCTcKKyNkZWZpbmUgUlQ1NjYwX1ZPTF9SX01VVEUJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9WT0xfUl9TRlQJCQk2CisjZGVmaW5lIFJUNTY2MF9MX1ZPTF9NQVNLCQkJKDB4M2YgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0xfVk9MX1NGVAkJCTgKKyNkZWZpbmUgUlQ1NjYwX1JfVk9MX01BU0sJCQkoMHgzZikKKyNkZWZpbmUgUlQ1NjYwX1JfVk9MX1NGVAkJCTAKKworLyogSU4xIGFuZCBJTjIgQ29udHJvbCAoMHgwZCkgKi8KKyNkZWZpbmUgUlQ1NjYwX0lOX0RGMQkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSU5fU0ZUMQkJCQkxNQorI2RlZmluZSBSVDU2NjBfQlNUX01BU0sxCQkJKDB4N2YgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0JTVF9TRlQxCQkJCTgKKyNkZWZpbmUgUlQ1NjYwX0lOX0RGMgkJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9JTl9TRlQyCQkJCTcKKyNkZWZpbmUgUlQ1NjYwX0JTVF9NQVNLMgkJCSgweDdmIDw8IDApCisjZGVmaW5lIFJUNTY2MF9CU1RfU0ZUMgkJCQkwCisKKy8qIElOMyBhbmQgSU40IENvbnRyb2wgKDB4MGUpICovCisjZGVmaW5lIFJUNTY2MF9JTl9ERjMJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0lOX1NGVDMJCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX0JTVF9NQVNLMwkJCSgweDdmIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9CU1RfU0ZUMwkJCQk4CisjZGVmaW5lIFJUNTY2MF9JTl9ERjQJCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjBfSU5fU0ZUNAkJCQk3CisjZGVmaW5lIFJUNTY2MF9CU1RfTUFTSzQJCQkoMHg3ZiA8PCAwKQorI2RlZmluZSBSVDU2NjBfQlNUX1NGVDQJCQkJMAorCisvKiBEQUMxIERpZ2l0YWwgVm9sdW1lICgweDE5KSAqLworI2RlZmluZSBSVDU2NjBfREFDX0wxX1ZPTF9NQVNLCQkJKDB4N2YgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX0RBQ19MMV9WT0xfU0ZUCQkJOQorI2RlZmluZSBSVDU2NjBfREFDX1IxX1ZPTF9NQVNLCQkJKDB4N2YgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX0RBQ19SMV9WT0xfU0ZUCQkJMQorCisvKiBBREMgRGlnaXRhbCBWb2x1bWUgQ29udHJvbCAoMHgxYykgKi8KKyNkZWZpbmUgUlQ1NjYwX0FEQ19MX1ZPTF9NQVNLCQkJKDB4M2YgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX0FEQ19MX1ZPTF9TRlQJCQk5CisjZGVmaW5lIFJUNTY2MF9BRENfUl9WT0xfTUFTSwkJCSgweDNmIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9BRENfUl9WT0xfU0ZUCQkJMQorCisvKiBBREMgQm9vc3QgVm9sdW1lIENvbnRyb2wgKDB4MWUpICovCisjZGVmaW5lIFJUNTY2MF9TVE8xX0FEQ19MX0JTVF9NQVNLCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfU1RPMV9BRENfTF9CU1RfU0ZUCQkxNAorI2RlZmluZSBSVDU2NjBfU1RPMV9BRENfUl9CU1RfTUFTSwkJKDB4MyA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX1NUTzFfQURDX1JfQlNUX1NGVAkJMTIKKworLyogU3RlcmVvIEFEQyBNaXhlciBDb250cm9sICgweDI3KSAqLworI2RlZmluZSBSVDU2NjBfTV9BRENfTDEJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX01fQURDX0wxX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9NX0FEQ19MMgkJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfTV9BRENfTDJfU0ZUCQkJMTMKKyNkZWZpbmUgUlQ1NjYwX01fQURDX1IxCQkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX01fQURDX1IxX1NGVAkJCTYKKyNkZWZpbmUgUlQ1NjYwX01fQURDX1IyCQkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX01fQURDX1IyX1NGVAkJCTUKKworLyogQURDIE1peGVyIHRvIERBQyBNaXhlciBDb250cm9sICgweDI5KSAqLworI2RlZmluZSBSVDU2NjBfTV9BRENNSVhfTAkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9NX0FEQ01JWF9MX1NGVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9NX0RBQzFfTAkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfTV9EQUMxX0xfU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX01fQURDTUlYX1IJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9NX0FEQ01JWF9SX1NGVAkJCTcKKyNkZWZpbmUgUlQ1NjYwX01fREFDMV9SCQkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX01fREFDMV9SX1NGVAkJCTYKKworLyogU3RlcmVvIERBQyBNaXhlciBDb250cm9sICgweDJhKSAqLworI2RlZmluZSBSVDU2NjBfTV9EQUNfTDEJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX01fREFDX0wxX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9EQUNfTDFfU1RPX0xfVk9MX01BU0sJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9EQUNfTDFfU1RPX0xfVk9MX1NGVAkJMTMKKyNkZWZpbmUgUlQ1NjYwX01fREFDX1IxX1NUT19MCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjBfTV9EQUNfUjFfU1RPX0xfU0ZUCQk5CisjZGVmaW5lIFJUNTY2MF9EQUNfUjFfU1RPX0xfVk9MX01BU0sJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0RBQ19SMV9TVE9fTF9WT0xfU0ZUCQk4CisjZGVmaW5lIFJUNTY2MF9NX0RBQ19SMQkJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19SMV9TRlQJCQk2CisjZGVmaW5lIFJUNTY2MF9EQUNfUjFfU1RPX1JfVk9MX01BU0sJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX0RBQ19SMV9TVE9fUl9WT0xfU0ZUCQk1CisjZGVmaW5lIFJUNTY2MF9NX0RBQ19MMV9TVE9fUgkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX01fREFDX0wxX1NUT19SX1NGVAkJMQorI2RlZmluZSBSVDU2NjBfREFDX0wxX1NUT19SX1ZPTF9NQVNLCQkoMHgxKQorI2RlZmluZSBSVDU2NjBfREFDX0wxX1NUT19SX1ZPTF9TRlQJCTAKKworLyogRGlnaXRhbCBJbnRlcmZhY2UgRGF0YSBDb250cm9sICgweDJmKSAqLworI2RlZmluZSBSVDU2NjBfSUYxX0RBQ19JTl9TRUwJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfSUYxX0RBQ19JTl9TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfSUYxX0FEQ19JTl9TRUwJCQkoMHgzIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfSUYxX0FEQ19JTl9TRlQJCQkxMgorCisvKiBSRUMgTGVmdCBNaXhlciBDb250cm9sIDEgKDB4M2IpICovCisjZGVmaW5lIFJUNTY2MF9HX0JTVDNfUk1fTF9NQVNLCQkJKDB4NyA8PCA0KQorI2RlZmluZSBSVDU2NjBfR19CU1QzX1JNX0xfU0ZUCQkJNAorI2RlZmluZSBSVDU2NjBfR19CU1QyX1JNX0xfTUFTSwkJCSgweDcgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMl9STV9MX1NGVAkJCTEKKworLyogUkVDIExlZnQgTWl4ZXIgQ29udHJvbCAyICgweDNjKSAqLworI2RlZmluZSBSVDU2NjBfR19CU1QxX1JNX0xfTUFTSwkJCSgweDcgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9HX0JTVDFfUk1fTF9TRlQJCQkxMworI2RlZmluZSBSVDU2NjBfR19PTV9MX1JNX0xfTUFTSwkJCSgweDcgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9HX09NX0xfUk1fTF9TRlQJCQkxMAorI2RlZmluZSBSVDU2NjBfTV9CU1QzX1JNX0wJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDNfUk1fTF9TRlQJCQkzCisjZGVmaW5lIFJUNTY2MF9NX0JTVDJfUk1fTAkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMl9STV9MX1NGVAkJCTIKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9STV9MCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2NjBfTV9CU1QxX1JNX0xfU0ZUCQkJMQorI2RlZmluZSBSVDU2NjBfTV9PTV9MX1JNX0wJCQkoMHgxKQorI2RlZmluZSBSVDU2NjBfTV9PTV9MX1JNX0xfU0ZUCQkJMAorCisvKiBSRUMgUmlnaHQgTWl4ZXIgQ29udHJvbCAxICgweDNkKSAqLworI2RlZmluZSBSVDU2NjBfR19CU1QzX1JNX1JfTUFTSwkJCSgweDcgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUM19STV9SX1NGVAkJCTQKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMl9STV9SX01BU0sJCQkoMHg3IDw8IDEpCisjZGVmaW5lIFJUNTY2MF9HX0JTVDJfUk1fUl9TRlQJCQkxCisKKy8qIFJFQyBSaWdodCBNaXhlciBDb250cm9sIDIgKDB4M2UpICovCisjZGVmaW5lIFJUNTY2MF9HX0JTVDFfUk1fUl9NQVNLCQkJKDB4NyA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMV9STV9SX1NGVAkJCTEzCisjZGVmaW5lIFJUNTY2MF9HX09NX1JfUk1fUl9NQVNLCQkJKDB4NyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0dfT01fUl9STV9SX1NGVAkJCTEwCisjZGVmaW5lIFJUNTY2MF9NX0JTVDNfUk1fUgkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX01fQlNUM19STV9SX1NGVAkJCTMKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMl9STV9SCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfTV9CU1QyX1JNX1JfU0ZUCQkJMgorI2RlZmluZSBSVDU2NjBfTV9CU1QxX1JNX1IJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfUk1fUl9TRlQJCQkxCisjZGVmaW5lIFJUNTY2MF9NX09NX1JfUk1fUgkJCSgweDEpCisjZGVmaW5lIFJUNTY2MF9NX09NX1JfUk1fUl9TRlQJCQkwCisKKy8qIExPVVRNSVggQ29udHJvbCAoMHg0NSkgKi8KKyNkZWZpbmUgUlQ1NjYwX01fREFDMV9MTQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9NX0RBQzFfTE1fU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX01fTE9WT0xfTQkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9NX0xPVk9MX0xNX1NGVAkJCTEzCisKKy8qIFNQSyBNaXhlciBDb250cm9sICgweDQ2KSAqLworI2RlZmluZSBSVDU2NjBfR19CU1QzX1NNX01BU0sJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfR19CU1QzX1NNX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9HX0JTVDFfU01fTUFTSwkJCSgweDMgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9HX0JTVDFfU01fU0ZUCQkJMTIKKyNkZWZpbmUgUlQ1NjYwX0dfREFDbF9TTV9NQVNLCQkJKDB4MyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0dfREFDbF9TTV9TRlQJCQkxMAorI2RlZmluZSBSVDU2NjBfR19EQUNSX1NNX01BU0sJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9HX0RBQ1JfU01fU0ZUCQkJOAorI2RlZmluZSBSVDU2NjBfR19PTV9MX1NNX01BU0sJCQkoMHgzIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9HX09NX0xfU01fU0ZUCQkJNgorI2RlZmluZSBSVDU2NjBfTV9EQUNSX1NNCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjBfTV9EQUNSX1NNX1NGVAkJCTUKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9TTQkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9TTV9TRlQJCQk0CisjZGVmaW5lIFJUNTY2MF9NX0JTVDNfU00JCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDNfU01fU0ZUCQkJMworI2RlZmluZSBSVDU2NjBfTV9EQUNMX1NNCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfTV9EQUNMX1NNX1NGVAkJCTIKKyNkZWZpbmUgUlQ1NjYwX01fT01fTF9TTQkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX01fT01fTF9TTV9TRlQJCQkxCisKKy8qIFNQT01JWCBDb250cm9sICgweDQ4KSAqLworI2RlZmluZSBSVDU2NjBfTV9EQUNfUl9TUE0JCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfTV9EQUNfUl9TUE1fU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX01fREFDX0xfU1BNCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX01fREFDX0xfU1BNX1NGVAkJCTEzCisjZGVmaW5lIFJUNTY2MF9NX1NWX1NQTQkJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfTV9TVl9TUE1fU0ZUCQkJMTIKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9TUE0JCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfTV9CU1QxX1NQTV9TRlQJCQkxMQorCisvKiBPdXRwdXQgTGVmdCBNaXhlciBDb250cm9sIDEgKDB4NGQpICovCisjZGVmaW5lIFJUNTY2MF9HX0JTVDNfT01fTF9NQVNLCQkJKDB4NyA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUM19PTV9MX1NGVAkJCTEzCisjZGVmaW5lIFJUNTY2MF9HX0JTVDJfT01fTF9NQVNLCQkJKDB4NyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMl9PTV9MX1NGVAkJCTEwCisjZGVmaW5lIFJUNTY2MF9HX0JTVDFfT01fTF9NQVNLCQkJKDB4NyA8PCA3KQorI2RlZmluZSBSVDU2NjBfR19CU1QxX09NX0xfU0ZUCQkJNworI2RlZmluZSBSVDU2NjBfR19STV9MX09NX0xfTUFTSwkJCSgweDcgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX0dfUk1fTF9PTV9MX1NGVAkJCTEKKworLyogT3V0cHV0IExlZnQgTWl4ZXIgQ29udHJvbCAyICgweDRlKSAqLworI2RlZmluZSBSVDU2NjBfR19EQUNfUjFfT01fTF9NQVNLCQkoMHg3IDw8IDEwKQorI2RlZmluZSBSVDU2NjBfR19EQUNfUjFfT01fTF9TRlQJCTEwCisjZGVmaW5lIFJUNTY2MF9HX0RBQ19MMV9PTV9MX01BU0sJCSgweDcgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX0dfREFDX0wxX09NX0xfU0ZUCQk3CisKKy8qIE91dHB1dCBMZWZ0IE1peGVyIENvbnRyb2wgMyAoMHg0ZikgKi8KKyNkZWZpbmUgUlQ1NjYwX01fQlNUM19PTV9MCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjBfTV9CU1QzX09NX0xfU0ZUCQkJNQorI2RlZmluZSBSVDU2NjBfTV9CU1QyX09NX0wJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9NX0JTVDJfT01fTF9TRlQJCQk0CisjZGVmaW5lIFJUNTY2MF9NX0JTVDFfT01fTAkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9PTV9MX1NGVAkJCTMKKyNkZWZpbmUgUlQ1NjYwX01fUk1fTF9PTV9MCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfTV9STV9MX09NX0xfU0ZUCQkJMgorI2RlZmluZSBSVDU2NjBfTV9EQUNfUl9PTV9MCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2NjBfTV9EQUNfUl9PTV9MX1NGVAkJCTEKKyNkZWZpbmUgUlQ1NjYwX01fREFDX0xfT01fTAkJCSgweDEpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19MX09NX0xfU0ZUCQkJMAorCisvKiBPdXRwdXQgUmlnaHQgTWl4ZXIgQ29udHJvbCAxICgweDUwKSAqLworI2RlZmluZSBSVDU2NjBfR19CU1QyX09NX1JfTUFTSwkJCSgweDcgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9HX0JTVDJfT01fUl9TRlQJCQkxMAorI2RlZmluZSBSVDU2NjBfR19CU1QxX09NX1JfTUFTSwkJCSgweDcgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX0dfQlNUMV9PTV9SX1NGVAkJCTcKKyNkZWZpbmUgUlQ1NjYwX0dfUk1fUl9PTV9SX01BU0sJCQkoMHg3IDw8IDEpCisjZGVmaW5lIFJUNTY2MF9HX1JNX1JfT01fUl9TRlQJCQkxCisKKy8qIE91dHB1dCBSaWdodCBNaXhlciBDb250cm9sIDIgKDB4NTEpICovCisjZGVmaW5lIFJUNTY2MF9HX0RBQ19MX09NX1JfTUFTSwkJKDB4NyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0dfREFDX0xfT01fUl9TRlQJCQkxMAorI2RlZmluZSBSVDU2NjBfR19EQUNfUl9PTV9SX01BU0sJCSgweDcgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX0dfREFDX1JfT01fUl9TRlQJCQk3CisKKy8qIE91dHB1dCBSaWdodCBNaXhlciBDb250cm9sIDMgKDB4NTIpICovCisjZGVmaW5lIFJUNTY2MF9NX0JTVDJfT01fUgkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMl9PTV9SX1NGVAkJCTQKKyNkZWZpbmUgUlQ1NjYwX01fQlNUMV9PTV9SCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjBfTV9CU1QxX09NX1JfU0ZUCQkJMworI2RlZmluZSBSVDU2NjBfTV9STV9SX09NX1IJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9NX1JNX1JfT01fUl9TRlQJCQkyCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19MX09NX1IJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9NX0RBQ19MX09NX1JfU0ZUCQkJMQorI2RlZmluZSBSVDU2NjBfTV9EQUNfUl9PTV9SCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYwX01fREFDX1JfT01fUl9TRlQJCQkwCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIERpZ2l0YWwgMSAoMHg2MSkgKi8KKyNkZWZpbmUgUlQ1NjYwX1BXUl9JMlMxCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9QV1JfSTJTMV9CSVQJCQkxNQorI2RlZmluZSBSVDU2NjBfUFdSX0RBQ19MMQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9QV1JfREFDX0wxX0JJVAkJCTEyCisjZGVmaW5lIFJUNTY2MF9QV1JfREFDX1IxCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9EQUNfUjFfQklUCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX1BXUl9BRENfTAkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX1BXUl9BRENfTF9CSVQJCQkyCisjZGVmaW5lIFJUNTY2MF9QV1JfQURDX1IJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9QV1JfQURDX1JfQklUCQkJMQorI2RlZmluZSBSVDU2NjBfUFdSX0NMU19ECQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9DTFNfRF9CSVQJCQkwCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIERpZ2l0YWwgMiAoMHg2MikgKi8KKyNkZWZpbmUgUlQ1NjYwX1BXUl9BRENfUzFGCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9BRENfUzFGX0JJVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9QV1JfREFDX1MxRgkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9QV1JfREFDX1MxRl9CSVQJCQkxMQorCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBBbmFsb2cgMSAoMHg2MykgKi8KKyNkZWZpbmUgUlQ1NjYwX1BXUl9WUkVGMQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9QV1JfVlJFRjFfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX1BXUl9GVjEJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9GVjFfQklUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX1BXUl9NQgkJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfUFdSX01CX0JJVAkJCTEzCisjZGVmaW5lIFJUNTY2MF9QV1JfQkcJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9CR19CSVQJCQkxMQorI2RlZmluZSBSVDU2NjBfUFdSX0hQX0wJCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjBfUFdSX0hQX0xfQklUCQkJNworI2RlZmluZSBSVDU2NjBfUFdSX0hQX1IJCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjBfUFdSX0hQX1JfQklUCQkJNgorI2RlZmluZSBSVDU2NjBfUFdSX0hBCQkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9IQV9CSVQJCQk1CisjZGVmaW5lIFJUNTY2MF9QV1JfVlJFRjIJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9QV1JfVlJFRjJfQklUCQkJNAorI2RlZmluZSBSVDU2NjBfUFdSX0ZWMgkJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2MF9QV1JfRlYyX0JJVAkJCTMKKyNkZWZpbmUgUlQ1NjYwX1BXUl9MRE8yCQkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX1BXUl9MRE8yX0JJVAkJCTIKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgQW5hbG9nIDIgKDB4NjQpICovCisjZGVmaW5lIFJUNTY2MF9QV1JfQlNUMQkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfUFdSX0JTVDFfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX1BXUl9CU1QyCQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9QV1JfQlNUMl9CSVQJCQkxNAorI2RlZmluZSBSVDU2NjBfUFdSX0JTVDMJCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX1BXUl9CU1QzX0JJVAkJCTEzCisjZGVmaW5lIFJUNTY2MF9QV1JfTUIxCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9QV1JfTUIxX0JJVAkJCTExCisjZGVmaW5lIFJUNTY2MF9QV1JfTUIyCQkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9QV1JfTUIyX0JJVAkJCTEwCisjZGVmaW5lIFJUNTY2MF9QV1JfUExMCQkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9QTExfQklUCQkJOQorCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBNaXhlciAoMHg2NSkgKi8KKyNkZWZpbmUgUlQ1NjYwX1BXUl9PTV9MCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9QV1JfT01fTF9CSVQJCQkxNQorI2RlZmluZSBSVDU2NjBfUFdSX09NX1IJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9PTV9SX0JJVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9QV1JfU00JCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjYwX1BXUl9TTV9CSVQJCQkxMworI2RlZmluZSBSVDU2NjBfUFdSX1JNX0wJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9STV9MX0JJVAkJCTExCisjZGVmaW5lIFJUNTY2MF9QV1JfUk1fUgkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfUFdSX1JNX1JfQklUCQkJMTAKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgVm9sdW1lICgweDY2KSAqLworI2RlZmluZSBSVDU2NjBfUFdSX1NWCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9QV1JfU1ZfQklUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX1BXUl9MVl9MCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9QV1JfTFZfTF9CSVQJCQkxMQorI2RlZmluZSBSVDU2NjBfUFdSX0xWX1IJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9MVl9SX0JJVAkJCTEwCisKKy8qIEkyUzEgQXVkaW8gU2VyaWFsIERhdGEgUG9ydCBDb250cm9sICgweDcwKSAqLworI2RlZmluZSBSVDU2NjBfSTJTX01TX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSTJTX01TX1NGVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9JMlNfTVNfTQkJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSTJTX01TX1MJCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0kyU19PX0NQX01BU0sJCQkoMHgzIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfSTJTX09fQ1BfU0ZUCQkJMTAKKyNkZWZpbmUgUlQ1NjYwX0kyU19PX0NQX09GRgkJCSgweDAgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9JMlNfT19DUF9VX0xBVwkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9JMlNfT19DUF9BX0xBVwkJCSgweDIgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9JMlNfSV9DUF9NQVNLCQkJKDB4MyA8PCA4KQorI2RlZmluZSBSVDU2NjBfSTJTX0lfQ1BfU0ZUCQkJOAorI2RlZmluZSBSVDU2NjBfSTJTX0lfQ1BfT0ZGCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2NjBfSTJTX0lfQ1BfVV9MQVcJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9JMlNfSV9DUF9BX0xBVwkJCSgweDIgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0kyU19CUF9NQVNLCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjBfSTJTX0JQX1NGVAkJCTcKKyNkZWZpbmUgUlQ1NjYwX0kyU19CUF9OT1IJCQkoMHgwIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9JMlNfQlBfSU5WCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjBfSTJTX0RMX01BU0sJCQkoMHgzIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9JMlNfRExfU0ZUCQkJMgorI2RlZmluZSBSVDU2NjBfSTJTX0RMXzE2CQkJKDB4MCA8PCAyKQorI2RlZmluZSBSVDU2NjBfSTJTX0RMXzIwCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfSTJTX0RMXzI0CQkJKDB4MiA8PCAyKQorI2RlZmluZSBSVDU2NjBfSTJTX0RMXzgJCQkJKDB4MyA8PCAyKQorI2RlZmluZSBSVDU2NjBfSTJTX0RGX01BU0sJCQkoMHgzKQorI2RlZmluZSBSVDU2NjBfSTJTX0RGX1NGVAkJCTAKKyNkZWZpbmUgUlQ1NjYwX0kyU19ERl9JMlMJCQkoMHgwKQorI2RlZmluZSBSVDU2NjBfSTJTX0RGX0xFRlQJCQkoMHgxKQorI2RlZmluZSBSVDU2NjBfSTJTX0RGX1BDTV9BCQkJKDB4MikKKyNkZWZpbmUgUlQ1NjYwX0kyU19ERl9QQ01fQgkJCSgweDMpCisKKy8qIEFEQy9EQUMgQ2xvY2sgQ29udHJvbCAxICgweDczKSAqLworI2RlZmluZSBSVDU2NjBfSTJTX0JDTEtfTVMxX01BU0sJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JMlNfQkNMS19NUzFfU0ZUCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX0kyU19CQ0xLX01TMV8zMgkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JMlNfQkNMS19NUzFfNjQJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSTJTX1BEMV9NQVNLCQkJKDB4NyA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19QRDFfU0ZUCQkJMTIKKyNkZWZpbmUgUlQ1NjYwX0kyU19QRDFfMQkJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9JMlNfUEQxXzIJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfSTJTX1BEMV8zCQkJKDB4MiA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19QRDFfNAkJCSgweDMgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9JMlNfUEQxXzYJCQkoMHg0IDw8IDEyKQorI2RlZmluZSBSVDU2NjBfSTJTX1BEMV84CQkJKDB4NSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0kyU19QRDFfMTIJCQkoMHg2IDw8IDEyKQorI2RlZmluZSBSVDU2NjBfSTJTX1BEMV8xNgkJCSgweDcgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9EQUNfT1NSX01BU0sJCQkoMHgzIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9EQUNfT1NSX1NGVAkJCTIKKyNkZWZpbmUgUlQ1NjYwX0RBQ19PU1JfMTI4CQkJKDB4MCA8PCAyKQorI2RlZmluZSBSVDU2NjBfREFDX09TUl82NAkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0RBQ19PU1JfMzIJCQkoMHgyIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9EQUNfT1NSXzE2CQkJKDB4MyA8PCAyKQorI2RlZmluZSBSVDU2NjBfQURDX09TUl9NQVNLCQkJKDB4MykKKyNkZWZpbmUgUlQ1NjYwX0FEQ19PU1JfU0ZUCQkJMAorI2RlZmluZSBSVDU2NjBfQURDX09TUl8xMjgJCQkoMHgwKQorI2RlZmluZSBSVDU2NjBfQURDX09TUl82NAkJCSgweDEpCisjZGVmaW5lIFJUNTY2MF9BRENfT1NSXzMyCQkJKDB4MikKKyNkZWZpbmUgUlQ1NjYwX0FEQ19PU1JfMTYJCQkoMHgzKQorCisvKiBBREMvREFDIENsb2NrIENvbnRyb2wgMiAoMHg3NCkgKi8KKyNkZWZpbmUgUlQ1NjYwX1JFU0VUX0FERgkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9SRVNFVF9BREZfU0ZUCQkJMTMKKyNkZWZpbmUgUlQ1NjYwX1JFU0VUX0RBRgkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9SRVNFVF9EQUZfU0ZUCQkJMTIKKyNkZWZpbmUgUlQ1NjYwX0RBSFBGX0VOCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9EQUhQRl9FTl9TRlQJCQkxMQorI2RlZmluZSBSVDU2NjBfQURIUEZfRU4JCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0FESFBGX0VOX1NGVAkJCTEwCisKKy8qIERpZ2l0YWwgTWljcm9waG9uZSBDb250cm9sICgweDc1KSAqLworI2RlZmluZSBSVDU2NjBfRE1JQ18xX0VOX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfRE1JQ18xX0VOX1NGVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9ETUlDXzFfRElTCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0RNSUNfMV9FTgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9ETUlDXzFMX0xIX01BU0sJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfRE1JQ18xTF9MSF9TRlQJCQkxMworI2RlZmluZSBSVDU2NjBfRE1JQ18xTF9MSF9SSVNJTkcJCSgweDAgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9ETUlDXzFMX0xIX0ZBTExJTkcJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9ETUlDXzFSX0xIX01BU0sJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfRE1JQ18xUl9MSF9TRlQJCQkxMgorI2RlZmluZSBSVDU2NjBfRE1JQ18xUl9MSF9SSVNJTkcJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9ETUlDXzFSX0xIX0ZBTExJTkcJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9TRUxfRE1JQ19EQVRBX01BU0sJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9TRUxfRE1JQ19EQVRBX1NGVAkJMTEKKyNkZWZpbmUgUlQ1NjYwX1NFTF9ETUlDX0RBVEFfR1BJTzIJCSgweDAgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9TRUxfRE1JQ19EQVRBX0lOMVAJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9ETUlDX0NMS19NQVNLCQkJKDB4NyA8PCA1KQorI2RlZmluZSBSVDU2NjBfRE1JQ19DTEtfU0ZUCQkJNQorCisvKiBHbG9iYWwgQ2xvY2sgQ29udHJvbCAoMHg4MCkgKi8KKyNkZWZpbmUgUlQ1NjYwX1NDTEtfU1JDX01BU0sJCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfU0NMS19TUkNfU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX1NDTEtfU1JDX01DTEsJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfU0NMS19TUkNfUExMMQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9TQ0xLX1NSQ19SQ0NMSwkJCSgweDIgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9QTEwxX1NSQ19NQVNLCQkJKDB4MyA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX1BMTDFfU1JDX1NGVAkJCTEyCisjZGVmaW5lIFJUNTY2MF9QTEwxX1NSQ19NQ0xLCQkJKDB4MCA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX1BMTDFfU1JDX0JDTEsxCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX1BMTDFfU1JDX1JDQ0xLCQkJKDB4MiA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX1BMTDFfUERfTUFTSwkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYwX1BMTDFfUERfU0ZUCQkJMworI2RlZmluZSBSVDU2NjBfUExMMV9QRF8xCQkJKDB4MCA8PCAzKQorI2RlZmluZSBSVDU2NjBfUExMMV9QRF8yCQkJKDB4MSA8PCAzKQorCisjZGVmaW5lIFJUNTY2MF9QTExfSU5QX01BWAkJCTQwMDAwMDAwCisjZGVmaW5lIFJUNTY2MF9QTExfSU5QX01JTgkJCTI1NjAwMAorLyogUExMIE0vTi9LIENvZGUgQ29udHJvbCAxICgweDgxKSAqLworI2RlZmluZSBSVDU2NjBfUExMX05fTUFYCQkJMHgxZmYKKyNkZWZpbmUgUlQ1NjYwX1BMTF9OX01BU0sJCQkoUlQ1NjYwX1BMTF9OX01BWCA8PCA3KQorI2RlZmluZSBSVDU2NjBfUExMX05fU0ZUCQkJNworI2RlZmluZSBSVDU2NjBfUExMX0tfTUFYCQkJMHgxZgorI2RlZmluZSBSVDU2NjBfUExMX0tfTUFTSwkJCShSVDU2NjBfUExMX0tfTUFYKQorI2RlZmluZSBSVDU2NjBfUExMX0tfU0ZUCQkJMAorCisvKiBQTEwgTS9OL0sgQ29kZSBDb250cm9sIDIgKDB4ODIpICovCisjZGVmaW5lIFJUNTY2MF9QTExfTV9NQVgJCQkweGYKKyNkZWZpbmUgUlQ1NjYwX1BMTF9NX01BU0sJCQkoUlQ1NjYwX1BMTF9NX01BWCA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX1BMTF9NX1NGVAkJCTEyCisjZGVmaW5lIFJUNTY2MF9QTExfTV9CUAkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfUExMX01fQlBfU0ZUCQkJMTEKKworLyogQ2xhc3MgRCBPdmVyIEN1cnJlbnQgQ29udHJvbCAoMHg4YykgKi8KKyNkZWZpbmUgUlQ1NjYwX0NMU0RfT0NfTUFTSwkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX0NMU0RfT0NfU0ZUCQkJOQorI2RlZmluZSBSVDU2NjBfQ0xTRF9PQ19QVQkJCSgweDAgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX0NMU0RfT0NfUEQJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9BVVRPX1BEX01BU0sJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9BVVRPX1BEX1NGVAkJCTgKKyNkZWZpbmUgUlQ1NjYwX0FVVE9fUERfRElTCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2NjBfQVVUT19QRF9FTgkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX0NMU0RfT0NfVEhfTUFTSwkJCSgweDNmKQorI2RlZmluZSBSVDU2NjBfQ0xTRF9PQ19USF9TRlQJCQkwCisKKy8qIENsYXNzIEQgT3V0cHV0IENvbnRyb2wgKDB4OGQpICovCisjZGVmaW5lIFJUNTY2MF9DTFNEX1JBVElPX01BU0sJCQkoMHhmIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfQ0xTRF9SQVRJT19TRlQJCQkxMgorCisvKiBMb3V0IEFtcCBDb250cm9sIDEgKDB4OGUpICovCisjZGVmaW5lIFJUNTY2MF9MT1VUX0NPX01BU0sJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9MT1VUX0NPX1NGVAkJCTQKKyNkZWZpbmUgUlQ1NjYwX0xPVVRfQ09fRElTCQkJKDB4MCA8PCA0KQorI2RlZmluZSBSVDU2NjBfTE9VVF9DT19FTgkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX0xPVVRfQ0JfTUFTSwkJCSgweDEpCisjZGVmaW5lIFJUNTY2MF9MT1VUX0NCX1NGVAkJCTAKKyNkZWZpbmUgUlQ1NjYwX0xPVVRfQ0JfUEQJCQkoMHgwKQorI2RlZmluZSBSVDU2NjBfTE9VVF9DQl9QVQkJCSgweDEpCisKKy8qIFNQS1ZERCBkZXRlY3Rpb24gY29udHJvbCAoMHg5MikgKi8KKyNkZWZpbmUgUlQ1NjYwX1NQS1ZERF9ERVRfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9TUEtWRERfREVUX1NGVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9TUEtWRERfREVUX0RJUwkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9TUEtWRERfREVUX0VOCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1NQS19BR19NQVNLCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1NQS19BR19TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfU1BLX0FHX0RJUwkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9TUEtfQUdfRU4JCQkoMHgxIDw8IDE0KQorCisvKiBNaWNiaWFzIENvbnRyb2wgKDB4OTMpICovCisjZGVmaW5lIFJUNTY2MF9NSUMxX0JTX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfTUlDMV9CU19TRlQJCQkxNQorI2RlZmluZSBSVDU2NjBfTUlDMV9CU185QVYJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfTUlDMV9CU183NUFWCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX01JQzJfQlNfTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9NSUMyX0JTX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9NSUMyX0JTXzlBVgkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9NSUMyX0JTXzc1QVYJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfTUlDMV9PVkNEX01BU0sJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfTUlDMV9PVkNEX1NGVAkJCTExCisjZGVmaW5lIFJUNTY2MF9NSUMxX09WQ0RfRElTCQkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYwX01JQzFfT1ZDRF9FTgkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9NSUMxX09WVEhfTUFTSwkJCSgweDMgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX01JQzFfT1ZUSF9TRlQJCQk5CisjZGVmaW5lIFJUNTY2MF9NSUMxX09WVEhfNjAwVUEJCQkoMHgwIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9NSUMxX09WVEhfMTUwMFVBCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjBfTUlDMV9PVlRIXzIwMDBVQQkJCSgweDIgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX01JQzJfT1ZDRF9NQVNLCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjBfTUlDMl9PVkNEX1NGVAkJCTgKKyNkZWZpbmUgUlQ1NjYwX01JQzJfT1ZDRF9ESVMJCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9NSUMyX09WQ0RfRU4JCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9NSUMyX09WVEhfTUFTSwkJCSgweDMgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX01JQzJfT1ZUSF9TRlQJCQk2CisjZGVmaW5lIFJUNTY2MF9NSUMyX09WVEhfNjAwVUEJCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9NSUMyX09WVEhfMTUwMFVBCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjBfTUlDMl9PVlRIXzIwMDBVQQkJCSgweDIgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX1BXUl9DTEsyNU1fTUFTSwkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9DTEsyNU1fU0ZUCQkJNAorI2RlZmluZSBSVDU2NjBfUFdSX0NMSzI1TV9QRAkJCSgweDAgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX1BXUl9DTEsyNU1fUFUJCQkoMHgxIDw8IDQpCisKKy8qIEVRIENvbnRyb2wgMSAoMHhiMCkgKi8KKyNkZWZpbmUgUlQ1NjYwX0VRX1NSQ19NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0VRX1NSQ19TRlQJCQkxNQorI2RlZmluZSBSVDU2NjBfRVFfU1JDX0RBQwkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9FUV9TUkNfQURDCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0VRX1VQRAkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfRVFfVVBEX0JJVAkJCTE0CisKKy8qIEphY2sgRGV0ZWN0IENvbnRyb2wgKDB4YmIpICovCisjZGVmaW5lIFJUNTY2MF9KRF9NQVNLCQkJCSgweDMgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9KRF9TRlQJCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX0pEX0RJUwkJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfSkRfR1BJTzEJCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0pEX0dQSU8yCQkJCSgweDIgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9KRF9MT1VUX01BU0sJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfSkRfTE9VVF9TRlQJCQkxMQorI2RlZmluZSBSVDU2NjBfSkRfTE9VVF9ESVMJCQkoMHgwIDw8IDExKQorI2RlZmluZSBSVDU2NjBfSkRfTE9VVF9FTgkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9KRF9MT1VUX1RSR19NQVNLCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX0pEX0xPVVRfVFJHX1NGVAkJCTEwCisjZGVmaW5lIFJUNTY2MF9KRF9MT1VUX1RSR19MTwkJCSgweDAgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9KRF9MT1VUX1RSR19ISQkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9KRF9TUE9fTUFTSwkJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjYwX0pEX1NQT19TRlQJCQk5CisjZGVmaW5lIFJUNTY2MF9KRF9TUE9fRElTCQkJKDB4MCA8PCA5KQorI2RlZmluZSBSVDU2NjBfSkRfU1BPX0VOCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjBfSkRfU1BPX1RSR19NQVNLCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjBfSkRfU1BPX1RSR19TRlQJCQk4CisjZGVmaW5lIFJUNTY2MF9KRF9TUE9fVFJHX0xPCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2NjBfSkRfU1BPX1RSR19ISQkJCSgweDEgPDwgOCkKKworLyogSVJRIENvbnRyb2wgMSAoMHhiZCkgKi8KKyNkZWZpbmUgUlQ1NjYwX0lSUV9KRF9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0lSUV9KRF9TRlQJCQkxNQorI2RlZmluZSBSVDU2NjBfSVJRX0pEX0JQCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0lSUV9KRF9OT1IJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfSVJRX09UX01BU0sJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfSVJRX09UX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9JUlFfT1RfQlAJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfSVJRX09UX05PUgkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9KRF9TVEtZX01BU0sJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfSkRfU1RLWV9TRlQJCQkxMworI2RlZmluZSBSVDU2NjBfSkRfU1RLWV9ESVMJCQkoMHgwIDw8IDEzKQorI2RlZmluZSBSVDU2NjBfSkRfU1RLWV9FTgkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2MF9PVF9TVEtZX01BU0sJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfT1RfU1RLWV9TRlQJCQkxMgorI2RlZmluZSBSVDU2NjBfT1RfU1RLWV9ESVMJCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfT1RfU1RLWV9FTgkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9KRF9QX01BU0sJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfSkRfUF9TRlQJCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX0pEX1BfTk9SCQkJCSgweDAgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9KRF9QX0lOVgkJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfT1RfUF9NQVNLCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX09UX1BfU0ZUCQkJCTEwCisjZGVmaW5lIFJUNTY2MF9PVF9QX05PUgkJCQkoMHgwIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfT1RfUF9JTlYJCQkJKDB4MSA8PCAxMCkKKworLyogSVJRIENvbnRyb2wgMiAoMHhiZSkgKi8KKyNkZWZpbmUgUlQ1NjYwX0lSUV9NQjFfT0NfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9JUlFfTUIxX09DX1NGVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9JUlFfTUIxX09DX0JQCQkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0lSUV9NQjFfT0NfTk9SCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX0lSUV9NQjJfT0NfTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9JUlFfTUIyX09DX1NGVAkJCTE0CisjZGVmaW5lIFJUNTY2MF9JUlFfTUIyX09DX0JQCQkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0lSUV9NQjJfT0NfTk9SCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX01CMV9PQ19TVEtZX01BU0sJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfTUIxX09DX1NUS1lfU0ZUCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX01CMV9PQ19TVEtZX0RJUwkJCSgweDAgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9NQjFfT0NfU1RLWV9FTgkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9NQjJfT0NfU1RLWV9NQVNLCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX01CMl9PQ19TVEtZX1NGVAkJCTEwCisjZGVmaW5lIFJUNTY2MF9NQjJfT0NfU1RLWV9ESVMJCQkoMHgwIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfTUIyX09DX1NUS1lfRU4JCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfTUIxX09DX1BfTUFTSwkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX01CMV9PQ19QX1NGVAkJCTcKKyNkZWZpbmUgUlQ1NjYwX01CMV9PQ19QX05PUgkJCSgweDAgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX01CMV9PQ19QX0lOVgkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX01CMl9PQ19QX01BU0sJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9NQjJfT0NfUF9TRlQJCQk2CisjZGVmaW5lIFJUNTY2MF9NQjJfT0NfUF9OT1IJCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9NQjJfT0NfUF9JTlYJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9NQjFfT0NfQ0xSCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjBfTUIxX09DX0NMUl9TRlQJCQkzCisjZGVmaW5lIFJUNTY2MF9NQjJfT0NfQ0xSCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjBfTUIyX09DX0NMUl9TRlQJCQkyCisKKy8qIEdQSU8gQ29udHJvbCAxICgweGMwKSAqLworI2RlZmluZSBSVDU2NjBfR1AyX1BJTl9NQVNLCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX0dQMl9QSU5fU0ZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYwX0dQMl9QSU5fR1BJTzIJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfR1AyX1BJTl9ETUlDMV9TREEJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9HUDFfUElOX01BU0sJCQkoMHgzIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfR1AxX1BJTl9TRlQJCQkxMgorI2RlZmluZSBSVDU2NjBfR1AxX1BJTl9HUElPMQkJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9HUDFfUElOX0RNSUMxX1NDTAkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QSU5fSVJRCQkJKDB4MiA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX0dQSU9fTV9NQVNLCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjBfR1BJT19NX1NGVAkJCTkKKyNkZWZpbmUgUlQ1NjYwX0dQSU9fTV9GTFQJCQkoMHgwIDw8IDkpCisjZGVmaW5lIFJUNTY2MF9HUElPX01fUEgJCQkoMHgxIDw8IDkpCisKKy8qIEdQSU8gQ29udHJvbCAzICgweGMyKSAqLworI2RlZmluZSBSVDU2NjBfR1AyX1BGX01BU0sJCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2MF9HUDJfUEZfU0ZUCQkJNQorI2RlZmluZSBSVDU2NjBfR1AyX1BGX0lOCQkJKDB4MCA8PCA1KQorI2RlZmluZSBSVDU2NjBfR1AyX1BGX09VVAkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX0dQMl9PVVRfTUFTSwkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX0dQMl9PVVRfU0ZUCQkJNAorI2RlZmluZSBSVDU2NjBfR1AyX09VVF9MTwkJCSgweDAgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX0dQMl9PVVRfSEkJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2MF9HUDJfUF9NQVNLCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjBfR1AyX1BfU0ZUCQkJMworI2RlZmluZSBSVDU2NjBfR1AyX1BfTk9SCQkJKDB4MCA8PCAzKQorI2RlZmluZSBSVDU2NjBfR1AyX1BfSU5WCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjBfR1AxX1BGX01BU0sJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2MF9HUDFfUEZfU0ZUCQkJMgorI2RlZmluZSBSVDU2NjBfR1AxX1BGX0lOCQkJKDB4MCA8PCAyKQorI2RlZmluZSBSVDU2NjBfR1AxX1BGX09VVAkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYwX0dQMV9PVVRfTUFTSwkJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX0dQMV9PVVRfU0ZUCQkJMQorI2RlZmluZSBSVDU2NjBfR1AxX09VVF9MTwkJCSgweDAgPDwgMSkKKyNkZWZpbmUgUlQ1NjYwX0dQMV9PVVRfSEkJCQkoMHgxIDw8IDEpCisjZGVmaW5lIFJUNTY2MF9HUDFfUF9NQVNLCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QX1NGVAkJCTAKKyNkZWZpbmUgUlQ1NjYwX0dQMV9QX05PUgkJCSgweDApCisjZGVmaW5lIFJUNTY2MF9HUDFfUF9JTlYJCQkoMHgxKQorCisvKiBTb2Z0IHZvbHVtZSBhbmQgemVybyBjcm9zcyBjb250cm9sIDEgKDB4ZDkpICovCisjZGVmaW5lIFJUNTY2MF9TVl9NQVNLCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9TVl9TRlQJCQkJMTUKKyNkZWZpbmUgUlQ1NjYwX1NWX0RJUwkJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjBfU1ZfRU4JCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1NQT19TVl9NQVNLCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYwX1NQT19TVl9TRlQJCQkxNAorI2RlZmluZSBSVDU2NjBfU1BPX1NWX0RJUwkJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2MF9TUE9fU1ZfRU4JCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjBfT1VUX1NWX01BU0sJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjBfT1VUX1NWX1NGVAkJCTEyCisjZGVmaW5lIFJUNTY2MF9PVVRfU1ZfRElTCQkJKDB4MCA8PCAxMikKKyNkZWZpbmUgUlQ1NjYwX09VVF9TVl9FTgkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2MF9aQ0RfRElHX01BU0sJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfWkNEX0RJR19TRlQJCQkxMQorI2RlZmluZSBSVDU2NjBfWkNEX0RJR19ESVMJCQkoMHgwIDw8IDExKQorI2RlZmluZSBSVDU2NjBfWkNEX0RJR19FTgkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2MF9aQ0RfTUFTSwkJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjBfWkNEX1NGVAkJCQkxMAorI2RlZmluZSBSVDU2NjBfWkNEX1BECQkJCSgweDAgPDwgMTApCisjZGVmaW5lIFJUNTY2MF9aQ0RfUFUJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYwX1NWX0RMWV9NQVNLCQkJKDB4ZikKKyNkZWZpbmUgUlQ1NjYwX1NWX0RMWV9TRlQJCQkwCisKKy8qIFNvZnQgdm9sdW1lIGFuZCB6ZXJvIGNyb3NzIGNvbnRyb2wgMiAoMHhkYSkgKi8KKyNkZWZpbmUgUlQ1NjYwX1pDRF9TUE9fTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9aQ0RfU1BPX1NGVAkJCTE1CisjZGVmaW5lIFJUNTY2MF9aQ0RfU1BPX0RJUwkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2MF9aQ0RfU1BPX0VOCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9PTVJfTUFTSwkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9PTVJfU0ZUCQkJOAorI2RlZmluZSBSVDU2NjBfWkNEX09NUl9ESVMJCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJUNTY2MF9aQ0RfT01SX0VOCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjBfWkNEX09NTF9NQVNLCQkJKDB4MSA8PCA3KQorI2RlZmluZSBSVDU2NjBfWkNEX09NTF9TRlQJCQk3CisjZGVmaW5lIFJUNTY2MF9aQ0RfT01MX0RJUwkJCSgweDAgPDwgNykKKyNkZWZpbmUgUlQ1NjYwX1pDRF9PTUxfRU4JCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2MF9aQ0RfU1BNX01BU0sJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2MF9aQ0RfU1BNX1NGVAkJCTYKKyNkZWZpbmUgUlQ1NjYwX1pDRF9TUE1fRElTCQkJKDB4MCA8PCA2KQorI2RlZmluZSBSVDU2NjBfWkNEX1NQTV9FTgkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYwX1pDRF9STVJfTUFTSwkJCSgweDEgPDwgNSkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9STVJfU0ZUCQkJNQorI2RlZmluZSBSVDU2NjBfWkNEX1JNUl9ESVMJCQkoMHgwIDw8IDUpCisjZGVmaW5lIFJUNTY2MF9aQ0RfUk1SX0VOCQkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjBfWkNEX1JNTF9NQVNLCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjBfWkNEX1JNTF9TRlQJCQk0CisjZGVmaW5lIFJUNTY2MF9aQ0RfUk1MX0RJUwkJCSgweDAgPDwgNCkKKyNkZWZpbmUgUlQ1NjYwX1pDRF9STUxfRU4JCQkoMHgxIDw8IDQpCisKKy8qIEdlbmVyYWwgQ29udHJvbCAxICgweGZhKSAqLworI2RlZmluZSBSVDU2NjBfUFdSX1ZSRUZfSFAJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjBfUFdSX1ZSRUZfSFBfU0ZUCQkJMTEKKyNkZWZpbmUgUlQ1NjYwX0RJR19HQVRFX0NUUkwJCQkoMHgxKQorI2RlZmluZSBSVDU2NjBfRElHX0dBVEVfQ1RSTF9TRlQJCTAKKworLyogU3lzdGVtIENsb2NrIFNvdXJjZSAqLworI2RlZmluZSBSVDU2NjBfU0NMS19TX01DTEsJCQkwCisjZGVmaW5lIFJUNTY2MF9TQ0xLX1NfUExMMQkJCTEKKyNkZWZpbmUgUlQ1NjYwX1NDTEtfU19SQ0NMSwkJCTIKKworLyogUExMMSBTb3VyY2UgKi8KKyNkZWZpbmUgUlQ1NjYwX1BMTDFfU19NQ0xLCQkJMAorI2RlZmluZSBSVDU2NjBfUExMMV9TX0JDTEsJCQkxCisKK2VudW0geworCVJUNTY2MF9BSUYxLAorCVJUNTY2MF9BSUZTLAorfTsKKworc3RydWN0IHJ0NTY2MF9wcml2IHsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHJ0NTY2MF9wbGF0Zm9ybV9kYXRhIHBkYXRhOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgY2xrICptY2xrOworCisJaW50IHN5c2NsazsKKwlpbnQgc3lzY2xrX3NyYzsKKwlpbnQgbHJja1tSVDU2NjBfQUlGU107CisJaW50IGJjbGtbUlQ1NjYwX0FJRlNdOworCWludCBtYXN0ZXJbUlQ1NjYwX0FJRlNdOworCisJaW50IHBsbF9zcmM7CisJaW50IHBsbF9pbjsKKwlpbnQgcGxsX291dDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NjMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhMThkOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjYzLmMKQEAgLTAsMCArMSwzMjE4IEBACisvKgorICogcnQ1NjYzLmMgIC0tICBSVDU2NjgvUlQ1NjYzIEFMU0EgU29DIGF1ZGlvIGNvZGVjIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDE2IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLgorICogQXV0aG9yOiBKYWNrIFl1IDxqYWNrLnl1QHJlYWx0ZWsuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKworI2luY2x1ZGUgInJ0NTY2My5oIgorI2luY2x1ZGUgInJsNjIzMS5oIgorCisjZGVmaW5lIFJUNTY2OF9ERVZJQ0VfSUQgMHg2NDUxCisjZGVmaW5lIFJUNTY2M19ERVZJQ0VfSUQgMHg2NDA2CisKK2VudW0geworCUNPREVDX1RZUEVfUlQ1NjY4LAorCUNPREVDX1RZUEVfUlQ1NjYzLAorfTsKKworc3RydWN0IHJ0NTY2M19wcml2IHsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBkZWxheWVkX3dvcmsgamFja19kZXRlY3Rfd29yazsKKwlzdHJ1Y3Qgc25kX3NvY19qYWNrICpoc19qYWNrOworCXN0cnVjdCB0aW1lcl9saXN0IGJ0bl9jaGVja190aW1lcjsKKworCWludCBjb2RlY190eXBlOworCWludCBzeXNjbGs7CisJaW50IHN5c2Nsa19zcmM7CisJaW50IGxyY2s7CisKKwlpbnQgcGxsX3NyYzsKKwlpbnQgcGxsX2luOworCWludCBwbGxfb3V0OworCisJaW50IGphY2tfdHlwZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnX2RlZmF1bHQgcnQ1NjY4X3JlZ1tdID0geworCXsgMHgwMDAwLCAweDAwMDAgfSwKKwl7IDB4MDAwMSwgMHhjOGM4IH0sCisJeyAweDAwMDIsIDB4ODA4MCB9LAorCXsgMHgwMDAzLCAweDgwMDAgfSwKKwl7IDB4MDAwNCwgMHhjODBhIH0sCisJeyAweDAwMDUsIDB4MDAwMCB9LAorCXsgMHgwMDA2LCAweDAwMDAgfSwKKwl7IDB4MDAwNywgMHgwMDAwIH0sCisJeyAweDAwMGEsIDB4MDAwMCB9LAorCXsgMHgwMDBiLCAweDAwMDAgfSwKKwl7IDB4MDAwYywgMHgwMDAwIH0sCisJeyAweDAwMGQsIDB4MDAwMCB9LAorCXsgMHgwMDBmLCAweDA4MDggfSwKKwl7IDB4MDAxMCwgMHg0MDAwIH0sCisJeyAweDAwMTEsIDB4MDAwMCB9LAorCXsgMHgwMDEyLCAweDE0MDQgfSwKKwl7IDB4MDAxMywgMHgxMDAwIH0sCisJeyAweDAwMTQsIDB4YTAwYSB9LAorCXsgMHgwMDE1LCAweDA0MDQgfSwKKwl7IDB4MDAxNiwgMHgwNDA0IH0sCisJeyAweDAwMTcsIDB4MDAxMSB9LAorCXsgMHgwMDE4LCAweGFmYWYgfSwKKwl7IDB4MDAxOSwgMHhhZmFmIH0sCisJeyAweDAwMWEsIDB4YWZhZiB9LAorCXsgMHgwMDFiLCAweDAwMTEgfSwKKwl7IDB4MDAxYywgMHgyZjJmIH0sCisJeyAweDAwMWQsIDB4MmYyZiB9LAorCXsgMHgwMDFlLCAweDJmMmYgfSwKKwl7IDB4MDAxZiwgMHgwMDAwIH0sCisJeyAweDAwMjAsIDB4MDAwMCB9LAorCXsgMHgwMDIxLCAweDAwMDAgfSwKKwl7IDB4MDAyMiwgMHg1NzU3IH0sCisJeyAweDAwMjMsIDB4MDAzOSB9LAorCXsgMHgwMDI0LCAweDAwMGIgfSwKKwl7IDB4MDAyNiwgMHhjMGMwIH0sCisJeyAweDAwMjcsIDB4YzBjMCB9LAorCXsgMHgwMDI4LCAweGMwYzAgfSwKKwl7IDB4MDAyOSwgMHg4MDgwIH0sCisJeyAweDAwMmEsIDB4YWFhYSB9LAorCXsgMHgwMDJiLCAweGFhYWEgfSwKKwl7IDB4MDAyYywgMHhhYmE4IH0sCisJeyAweDAwMmQsIDB4MDAwMCB9LAorCXsgMHgwMDJlLCAweDAwMDAgfSwKKwl7IDB4MDAyZiwgMHgwMDAwIH0sCisJeyAweDAwMzAsIDB4MDAwMCB9LAorCXsgMHgwMDMxLCAweDUwMDAgfSwKKwl7IDB4MDAzMiwgMHgwMDAwIH0sCisJeyAweDAwMzMsIDB4MDAwMCB9LAorCXsgMHgwMDM0LCAweDAwMDAgfSwKKwl7IDB4MDAzNSwgMHgwMDAwIH0sCisJeyAweDAwM2EsIDB4MDAwMCB9LAorCXsgMHgwMDNiLCAweDAwMDAgfSwKKwl7IDB4MDAzYywgMHgwMGZmIH0sCisJeyAweDAwM2QsIDB4MDAwMCB9LAorCXsgMHgwMDNlLCAweDAwZmYgfSwKKwl7IDB4MDAzZiwgMHgwMDAwIH0sCisJeyAweDAwNDAsIDB4MDAwMCB9LAorCXsgMHgwMDQxLCAweDAwZmYgfSwKKwl7IDB4MDA0MiwgMHgwMDAwIH0sCisJeyAweDAwNDMsIDB4MDBmZiB9LAorCXsgMHgwMDQ0LCAweDBjMGMgfSwKKwl7IDB4MDA0OSwgMHhjMDBiIH0sCisJeyAweDAwNGEsIDB4MDAwMCB9LAorCXsgMHgwMDRiLCAweDAzMWYgfSwKKwl7IDB4MDA0ZCwgMHgwMDAwIH0sCisJeyAweDAwNGUsIDB4MDAxZiB9LAorCXsgMHgwMDRmLCAweDAwMDAgfSwKKwl7IDB4MDA1MCwgMHgwMDFmIH0sCisJeyAweDAwNTIsIDB4ZjAwMCB9LAorCXsgMHgwMDYxLCAweDAwMDAgfSwKKwl7IDB4MDA2MiwgMHgwMDAwIH0sCisJeyAweDAwNjMsIDB4MDAzZSB9LAorCXsgMHgwMDY0LCAweDAwMDAgfSwKKwl7IDB4MDA2NSwgMHgwMDAwIH0sCisJeyAweDAwNjYsIDB4MDAzZiB9LAorCXsgMHgwMDY3LCAweDAwMDAgfSwKKwl7IDB4MDA2YiwgMHgwMDAwIH0sCisJeyAweDAwNmQsIDB4ZmYwMCB9LAorCXsgMHgwMDZlLCAweDI4MDggfSwKKwl7IDB4MDA2ZiwgMHgwMDBhIH0sCisJeyAweDAwNzAsIDB4ODAwMCB9LAorCXsgMHgwMDcxLCAweDgwMDAgfSwKKwl7IDB4MDA3MiwgMHg4MDAwIH0sCisJeyAweDAwNzMsIDB4NzAwMCB9LAorCXsgMHgwMDc0LCAweDc3NzAgfSwKKwl7IDB4MDA3NSwgMHgwMDAyIH0sCisJeyAweDAwNzYsIDB4MDAwMSB9LAorCXsgMHgwMDc4LCAweDAwZjAgfSwKKwl7IDB4MDA3OSwgMHgwMDAwIH0sCisJeyAweDAwN2EsIDB4MDAwMCB9LAorCXsgMHgwMDdiLCAweDAwMDAgfSwKKwl7IDB4MDA3YywgMHgwMDAwIH0sCisJeyAweDAwN2QsIDB4MDEyMyB9LAorCXsgMHgwMDdlLCAweDQ1MDAgfSwKKwl7IDB4MDA3ZiwgMHg4MDAzIH0sCisJeyAweDAwODAsIDB4MDAwMCB9LAorCXsgMHgwMDgxLCAweDAwMDAgfSwKKwl7IDB4MDA4MiwgMHgwMDAwIH0sCisJeyAweDAwODMsIDB4MDAwMCB9LAorCXsgMHgwMDg0LCAweDAwMDAgfSwKKwl7IDB4MDA4NSwgMHgwMDAwIH0sCisJeyAweDAwODYsIDB4MDAwOCB9LAorCXsgMHgwMDg3LCAweDAwMDAgfSwKKwl7IDB4MDA4OCwgMHgwMDAwIH0sCisJeyAweDAwODksIDB4MDAwMCB9LAorCXsgMHgwMDhhLCAweDAwMDAgfSwKKwl7IDB4MDA4YiwgMHgwMDAwIH0sCisJeyAweDAwOGMsIDB4MDAwMyB9LAorCXsgMHgwMDhlLCAweDAwNjAgfSwKKwl7IDB4MDA4ZiwgMHgxMDAwIH0sCisJeyAweDAwOTEsIDB4MGMyNiB9LAorCXsgMHgwMDkyLCAweDAwNzMgfSwKKwl7IDB4MDA5MywgMHgwMDAwIH0sCisJeyAweDAwOTQsIDB4MDA4MCB9LAorCXsgMHgwMDk4LCAweDAwMDAgfSwKKwl7IDB4MDA5OSwgMHgwMDAwIH0sCisJeyAweDAwOWEsIDB4MDAwNyB9LAorCXsgMHgwMDlmLCAweDAwMDAgfSwKKwl7IDB4MDBhMCwgMHgwMDAwIH0sCisJeyAweDAwYTEsIDB4MDAwMiB9LAorCXsgMHgwMGEyLCAweDAwMDEgfSwKKwl7IDB4MDBhMywgMHgwMDAyIH0sCisJeyAweDAwYTQsIDB4MDAwMSB9LAorCXsgMHgwMGFlLCAweDIwNDAgfSwKKwl7IDB4MDBhZiwgMHgwMDAwIH0sCisJeyAweDAwYjYsIDB4MDAwMCB9LAorCXsgMHgwMGI3LCAweDAwMDAgfSwKKwl7IDB4MDBiOCwgMHgwMDAwIH0sCisJeyAweDAwYjksIDB4MDAwMCB9LAorCXsgMHgwMGJhLCAweDAwMDIgfSwKKwl7IDB4MDBiYiwgMHgwMDAwIH0sCisJeyAweDAwYmUsIDB4MDAwMCB9LAorCXsgMHgwMGMwLCAweDAwMDAgfSwKKwl7IDB4MDBjMSwgMHgwYWFhIH0sCisJeyAweDAwYzIsIDB4YWE4MCB9LAorCXsgMHgwMGMzLCAweDAwMDMgfSwKKwl7IDB4MDBjNCwgMHgwMDAwIH0sCisJeyAweDAwZDAsIDB4MDAwMCB9LAorCXsgMHgwMGQxLCAweDIyNDQgfSwKKwl7IDB4MDBkMiwgMHgwMDAwIH0sCisJeyAweDAwZDMsIDB4MzMwMCB9LAorCXsgMHgwMGQ0LCAweDIyMDAgfSwKKwl7IDB4MDBkOSwgMHgwODA5IH0sCisJeyAweDAwZGEsIDB4MDAwMCB9LAorCXsgMHgwMGRiLCAweDAwMDggfSwKKwl7IDB4MDBkYywgMHgwMGMwIH0sCisJeyAweDAwZGQsIDB4NjcyNCB9LAorCXsgMHgwMGRlLCAweDMxMzEgfSwKKwl7IDB4MDBkZiwgMHgwMDA4IH0sCisJeyAweDAwZTAsIDB4NDAwMCB9LAorCXsgMHgwMGUxLCAweDMxMzEgfSwKKwl7IDB4MDBlMiwgMHg2MDBjIH0sCisJeyAweDAwZWEsIDB4YjMyMCB9LAorCXsgMHgwMGViLCAweDAwMDAgfSwKKwl7IDB4MDBlYywgMHhiMzAwIH0sCisJeyAweDAwZWQsIDB4MDAwMCB9LAorCXsgMHgwMGVlLCAweGIzMjAgfSwKKwl7IDB4MDBlZiwgMHgwMDAwIH0sCisJeyAweDAwZjAsIDB4MDIwMSB9LAorCXsgMHgwMGYxLCAweDBkZGQgfSwKKwl7IDB4MDBmMiwgMHgwZGRkIH0sCisJeyAweDAwZjYsIDB4MDAwMCB9LAorCXsgMHgwMGY3LCAweDAwMDAgfSwKKwl7IDB4MDBmOCwgMHgwMDAwIH0sCisJeyAweDAwZmEsIDB4MDAwMCB9LAorCXsgMHgwMGZiLCAweDAwMDAgfSwKKwl7IDB4MDBmYywgMHgwMDAwIH0sCisJeyAweDAwZmQsIDB4MDAwMCB9LAorCXsgMHgwMGZlLCAweDEwZWMgfSwKKwl7IDB4MDBmZiwgMHg2NDUxIH0sCisJeyAweDAxMDAsIDB4YWFhYSB9LAorCXsgMHgwMTAxLCAweDAwMGEgfSwKKwl7IDB4MDEwYSwgMHhhYWFhIH0sCisJeyAweDAxMGIsIDB4YTBhMCB9LAorCXsgMHgwMTBjLCAweGFlYWUgfSwKKwl7IDB4MDEwZCwgMHhhYWFhIH0sCisJeyAweDAxMGUsIDB4YWFhYSB9LAorCXsgMHgwMTBmLCAweGFhYWEgfSwKKwl7IDB4MDExMCwgMHhlMDAyIH0sCisJeyAweDAxMTEsIDB4YTYwMiB9LAorCXsgMHgwMTEyLCAweGFhYWEgfSwKKwl7IDB4MDExMywgMHgyMDAwIH0sCisJeyAweDAxMTcsIDB4MGYwMCB9LAorCXsgMHgwMTI1LCAweDA0MjAgfSwKKwl7IDB4MDEzMiwgMHgwMDAwIH0sCisJeyAweDAxMzMsIDB4MDAwMCB9LAorCXsgMHgwMTM2LCAweDU1NTUgfSwKKwl7IDB4MDEzNywgMHg1NTQwIH0sCisJeyAweDAxMzgsIDB4MzcwMCB9LAorCXsgMHgwMTM5LCAweDc5YTEgfSwKKwl7IDB4MDEzYSwgMHgyMDIwIH0sCisJeyAweDAxM2IsIDB4MjAyMCB9LAorCXsgMHgwMTNjLCAweDIwMDUgfSwKKwl7IDB4MDEzZiwgMHgwMDAwIH0sCisJeyAweDAxNDUsIDB4MDAwMiB9LAorCXsgMHgwMTQ2LCAweDAwMDAgfSwKKwl7IDB4MDE0NywgMHgwMDAwIH0sCisJeyAweDAxNDgsIDB4MDAwMCB9LAorCXsgMHgwMTYwLCAweDRlYzAgfSwKKwl7IDB4MDE2MSwgMHgwMDgwIH0sCisJeyAweDAxNjIsIDB4MDIwMCB9LAorCXsgMHgwMTYzLCAweDA4MDAgfSwKKwl7IDB4MDE2NCwgMHgwMDAwIH0sCisJeyAweDAxNjUsIDB4MDAwMCB9LAorCXsgMHgwMTY2LCAweDAwMDAgfSwKKwl7IDB4MDE2NywgMHgwMDBmIH0sCisJeyAweDAxNjgsIDB4MDAwZiB9LAorCXsgMHgwMTcwLCAweDRlODAgfSwKKwl7IDB4MDE3MSwgMHgwMDgwIH0sCisJeyAweDAxNzIsIDB4MDIwMCB9LAorCXsgMHgwMTczLCAweDA4MDAgfSwKKwl7IDB4MDE3NCwgMHgwMGZmIH0sCisJeyAweDAxNzUsIDB4MDAwMCB9LAorCXsgMHgwMTkwLCAweDQxMzEgfSwKKwl7IDB4MDE5MSwgMHg0MTMxIH0sCisJeyAweDAxOTIsIDB4NDEzMSB9LAorCXsgMHgwMTkzLCAweDQxMzEgfSwKKwl7IDB4MDE5NCwgMHgwMDAwIH0sCisJeyAweDAxOTUsIDB4MDAwMCB9LAorCXsgMHgwMTk2LCAweDAwMDAgfSwKKwl7IDB4MDE5NywgMHgwMDAwIH0sCisJeyAweDAxOTgsIDB4MDAwMCB9LAorCXsgMHgwMTk5LCAweDAwMDAgfSwKKwl7IDB4MDFhMCwgMHgxZTY0IH0sCisJeyAweDAxYTEsIDB4MDZhMyB9LAorCXsgMHgwMWEyLCAweDAwMDAgfSwKKwl7IDB4MDFhMywgMHgwMDAwIH0sCisJeyAweDAxYTQsIDB4MDAwMCB9LAorCXsgMHgwMWE1LCAweDAwMDAgfSwKKwl7IDB4MDFhNiwgMHgwMDAwIH0sCisJeyAweDAxYTcsIDB4MDAwMCB9LAorCXsgMHgwMWE4LCAweDAwMDAgfSwKKwl7IDB4MDFhOSwgMHgwMDAwIH0sCisJeyAweDAxYWEsIDB4MDAwMCB9LAorCXsgMHgwMWFiLCAweDAwMDAgfSwKKwl7IDB4MDFiNSwgMHgwMDAwIH0sCisJeyAweDAxYjYsIDB4MDFjMyB9LAorCXsgMHgwMWI3LCAweDAyYTAgfSwKKwl7IDB4MDFiOCwgMHgwM2U5IH0sCisJeyAweDAxYjksIDB4MTM4OSB9LAorCXsgMHgwMWJhLCAweGMzNTEgfSwKKwl7IDB4MDFiYiwgMHgwMDA5IH0sCisJeyAweDAxYmMsIDB4MDAxOCB9LAorCXsgMHgwMWJkLCAweDAwMmEgfSwKKwl7IDB4MDFiZSwgMHgwMDRjIH0sCisJeyAweDAxYmYsIDB4MDA5NyB9LAorCXsgMHgwMWMwLCAweDQzM2QgfSwKKwl7IDB4MDFjMSwgMHgwMDAwIH0sCisJeyAweDAxYzIsIDB4MDAwMCB9LAorCXsgMHgwMWMzLCAweDAwMDAgfSwKKwl7IDB4MDFjNCwgMHgwMDAwIH0sCisJeyAweDAxYzUsIDB4MDAwMCB9LAorCXsgMHgwMWM2LCAweDAwMDAgfSwKKwl7IDB4MDFjNywgMHgwMDAwIH0sCisJeyAweDAxYzgsIDB4NDBhZiB9LAorCXsgMHgwMWM5LCAweDA3MDIgfSwKKwl7IDB4MDFjYSwgMHgwMDAwIH0sCisJeyAweDAxY2IsIDB4MDAwMCB9LAorCXsgMHgwMWNjLCAweDU3NTcgfSwKKwl7IDB4MDFjZCwgMHg1NzU3IH0sCisJeyAweDAxY2UsIDB4NTc1NyB9LAorCXsgMHgwMWNmLCAweDU3NTcgfSwKKwl7IDB4MDFkMCwgMHg1NzU3IH0sCisJeyAweDAxZDEsIDB4NTc1NyB9LAorCXsgMHgwMWQyLCAweDU3NTcgfSwKKwl7IDB4MDFkMywgMHg1NzU3IH0sCisJeyAweDAxZDQsIDB4NTc1NyB9LAorCXsgMHgwMWQ1LCAweDU3NTcgfSwKKwl7IDB4MDFkNiwgMHgwMDNjIH0sCisJeyAweDAxZGEsIDB4MDAwMCB9LAorCXsgMHgwMWRiLCAweDAwMDAgfSwKKwl7IDB4MDFkYywgMHgwMDAwIH0sCisJeyAweDAxZGUsIDB4N2MwMCB9LAorCXsgMHgwMWRmLCAweDAzMjAgfSwKKwl7IDB4MDFlMCwgMHgwNmExIH0sCisJeyAweDAxZTEsIDB4MDAwMCB9LAorCXsgMHgwMWUyLCAweDAwMDAgfSwKKwl7IDB4MDFlMywgMHgwMDAwIH0sCisJeyAweDAxZTQsIDB4MDAwMCB9LAorCXsgMHgwMWU1LCAweDAwMDAgfSwKKwl7IDB4MDFlNiwgMHgwMDAxIH0sCisJeyAweDAxZTcsIDB4MDAwMCB9LAorCXsgMHgwMWU4LCAweDAwMDAgfSwKKwl7IDB4MDFlYSwgMHgwMDAwIH0sCisJeyAweDAxZWIsIDB4MDAwMCB9LAorCXsgMHgwMWVjLCAweDAwMDAgfSwKKwl7IDB4MDFlZCwgMHgwMDAwIH0sCisJeyAweDAxZWUsIDB4MDAwMCB9LAorCXsgMHgwMWVmLCAweDAwMDAgfSwKKwl7IDB4MDFmMCwgMHgwMDAwIH0sCisJeyAweDAxZjEsIDB4MDAwMCB9LAorCXsgMHgwMWYyLCAweDAwMDAgfSwKKwl7IDB4MDFmMywgMHgwMDAwIH0sCisJeyAweDAxZjQsIDB4MDAwMCB9LAorCXsgMHgwMjAwLCAweDAwMDAgfSwKKwl7IDB4MDIwMSwgMHgwMDAwIH0sCisJeyAweDAyMDIsIDB4MDAwMCB9LAorCXsgMHgwMjAzLCAweDAwMDAgfSwKKwl7IDB4MDIwNCwgMHgwMDAwIH0sCisJeyAweDAyMDUsIDB4MDAwMCB9LAorCXsgMHgwMjA2LCAweDAwMDAgfSwKKwl7IDB4MDIwNywgMHgwMDAwIH0sCisJeyAweDAyMDgsIDB4MDAwMCB9LAorCXsgMHgwMjEwLCAweDYwYjEgfSwKKwl7IDB4MDIxMSwgMHhhMDAwIH0sCisJeyAweDAyMTIsIDB4MDI0YyB9LAorCXsgMHgwMjEzLCAweGY3ZmYgfSwKKwl7IDB4MDIxNCwgMHgwMjRjIH0sCisJeyAweDAyMTUsIDB4MDEwMiB9LAorCXsgMHgwMjE2LCAweDAwYTMgfSwKKwl7IDB4MDIxNywgMHgwMDQ4IH0sCisJeyAweDAyMTgsIDB4OTJjMCB9LAorCXsgMHgwMjE5LCAweDAwMDAgfSwKKwl7IDB4MDIxYSwgMHgwMGM4IH0sCisJeyAweDAyMWIsIDB4MDAyMCB9LAorCXsgMHgwMmZhLCAweDAwMDAgfSwKKwl7IDB4MDJmYiwgMHgwMDAwIH0sCisJeyAweDAyZmMsIDB4MDAwMCB9LAorCXsgMHgwMmZmLCAweDAxMTAgfSwKKwl7IDB4MDMwMCwgMHgwMDFmIH0sCisJeyAweDAzMDEsIDB4MDMyYyB9LAorCXsgMHgwMzAyLCAweDVmMjEgfSwKKwl7IDB4MDMwMywgMHg0MDAwIH0sCisJeyAweDAzMDQsIDB4NDAwMCB9LAorCXsgMHgwMzA1LCAweDA2ZDUgfSwKKwl7IDB4MDMwNiwgMHg4MDAwIH0sCisJeyAweDAzMDcsIDB4MDcwMCB9LAorCXsgMHgwMzEwLCAweDQ1NjAgfSwKKwl7IDB4MDMxMSwgMHhhNGE4IH0sCisJeyAweDAzMTIsIDB4NzQxOCB9LAorCXsgMHgwMzEzLCAweDAwMDAgfSwKKwl7IDB4MDMxNCwgMHgwMDA2IH0sCisJeyAweDAzMTUsIDB4ZmZmZiB9LAorCXsgMHgwMzE2LCAweGM0MDAgfSwKKwl7IDB4MDMxNywgMHgwMDAwIH0sCisJeyAweDAzMzAsIDB4MDBhNiB9LAorCXsgMHgwMzMxLCAweDA0YzMgfSwKKwl7IDB4MDMzMiwgMHgyN2M4IH0sCisJeyAweDAzMzMsIDB4YmY1MCB9LAorCXsgMHgwMzM0LCAweDAwNDUgfSwKKwl7IDB4MDMzNSwgMHgwMDA3IH0sCisJeyAweDAzMzYsIDB4NzQxOCB9LAorCXsgMHgwMzM3LCAweDA1MDEgfSwKKwl7IDB4MDMzOCwgMHgwMDAwIH0sCisJeyAweDAzMzksIDB4MDAxMCB9LAorCXsgMHgwMzNhLCAweDEwMTAgfSwKKwl7IDB4MDNjMCwgMHg3ZTAwIH0sCisJeyAweDAzYzEsIDB4ODAwMCB9LAorCXsgMHgwM2MyLCAweDgwMDAgfSwKKwl7IDB4MDNjMywgMHg4MDAwIH0sCisJeyAweDAzYzQsIDB4ODAwMCB9LAorCXsgMHgwM2M1LCAweDgwMDAgfSwKKwl7IDB4MDNjNiwgMHg4MDAwIH0sCisJeyAweDAzYzcsIDB4ODAwMCB9LAorCXsgMHgwM2M4LCAweDgwMDAgfSwKKwl7IDB4MDNjOSwgMHg4MDAwIH0sCisJeyAweDAzY2EsIDB4ODAwMCB9LAorCXsgMHgwM2NiLCAweDgwMDAgfSwKKwl7IDB4MDNjYywgMHg4MDAwIH0sCisJeyAweDAzZDAsIDB4MDAwMCB9LAorCXsgMHgwM2QxLCAweDAwMDAgfSwKKwl7IDB4MDNkMiwgMHgwMDAwIH0sCisJeyAweDAzZDMsIDB4MDAwMCB9LAorCXsgMHgwM2Q0LCAweDIwMDAgfSwKKwl7IDB4MDNkNSwgMHgyMDAwIH0sCisJeyAweDAzZDYsIDB4MDAwMCB9LAorCXsgMHgwM2Q3LCAweDAwMDAgfSwKKwl7IDB4MDNkOCwgMHgyMDAwIH0sCisJeyAweDAzZDksIDB4MjAwMCB9LAorCXsgMHgwM2RhLCAweDIwMDAgfSwKKwl7IDB4MDNkYiwgMHgyMDAwIH0sCisJeyAweDAzZGMsIDB4MDAwMCB9LAorCXsgMHgwM2RkLCAweDAwMDAgfSwKKwl7IDB4MDNkZSwgMHgwMDAwIH0sCisJeyAweDAzZGYsIDB4MjAwMCB9LAorCXsgMHgwM2UwLCAweDAwMDAgfSwKKwl7IDB4MDNlMSwgMHgwMDAwIH0sCisJeyAweDAzZTIsIDB4MDAwMCB9LAorCXsgMHgwM2UzLCAweDAwMDAgfSwKKwl7IDB4MDNlNCwgMHgwMDAwIH0sCisJeyAweDAzZTUsIDB4MDAwMCB9LAorCXsgMHgwM2U2LCAweDAwMDAgfSwKKwl7IDB4MDNlNywgMHgwMDAwIH0sCisJeyAweDAzZTgsIDB4MDAwMCB9LAorCXsgMHgwM2U5LCAweDAwMDAgfSwKKwl7IDB4MDNlYSwgMHgwMDAwIH0sCisJeyAweDAzZWIsIDB4MDAwMCB9LAorCXsgMHgwM2VjLCAweDAwMDAgfSwKKwl7IDB4MDNlZCwgMHgwMDAwIH0sCisJeyAweDAzZWUsIDB4MDAwMCB9LAorCXsgMHgwM2VmLCAweDAwMDAgfSwKKwl7IDB4MDNmMCwgMHgwODAwIH0sCisJeyAweDAzZjEsIDB4MDgwMCB9LAorCXsgMHgwM2YyLCAweDA4MDAgfSwKKwl7IDB4MDNmMywgMHgwODAwIH0sCisJeyAweDAzZmUsIDB4MDAwMCB9LAorCXsgMHgwM2ZmLCAweDAwMDAgfSwKKwl7IDB4MDdmMCwgMHgwMDAwIH0sCisJeyAweDA3ZmEsIDB4MDAwMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBydDU2NjNfcmVnW10gPSB7CisJeyAweDAwMDAsIDB4MDAwMCB9LAorCXsgMHgwMDAyLCAweDAwMDggfSwKKwl7IDB4MDAwNSwgMHgxMDAwIH0sCisJeyAweDAwMDYsIDB4MTAwMCB9LAorCXsgMHgwMDBhLCAweDAwMDAgfSwKKwl7IDB4MDAxMCwgMHgwMDBmIH0sCisJeyAweDAwMTUsIDB4NDJjMSB9LAorCXsgMHgwMDE2LCAweDAwMDAgfSwKKwl7IDB4MDAxOCwgMHgwMDBiIH0sCisJeyAweDAwMTksIDB4YWZhZiB9LAorCXsgMHgwMDFjLCAweDJmMmYgfSwKKwl7IDB4MDAxZiwgMHgwMDAwIH0sCisJeyAweDAwMjIsIDB4NTc1NyB9LAorCXsgMHgwMDIzLCAweDAwMzkgfSwKKwl7IDB4MDAyNiwgMHhjMGMwIH0sCisJeyAweDAwMjksIDB4ODA4MCB9LAorCXsgMHgwMDJhLCAweGEwYTAgfSwKKwl7IDB4MDAyYywgMHgwMDBjIH0sCisJeyAweDAwMmQsIDB4MDAwMCB9LAorCXsgMHgwMDQwLCAweDA4MDggfSwKKwl7IDB4MDA2MSwgMHgwMDAwIH0sCisJeyAweDAwNjIsIDB4MDAwMCB9LAorCXsgMHgwMDYzLCAweDAwM2UgfSwKKwl7IDB4MDA2NCwgMHgwMDAwIH0sCisJeyAweDAwNjUsIDB4MDAwMCB9LAorCXsgMHgwMDY2LCAweDAwMDAgfSwKKwl7IDB4MDA2YiwgMHgwMDAwIH0sCisJeyAweDAwNmUsIDB4MDAwMCB9LAorCXsgMHgwMDZmLCAweDAwMDAgfSwKKwl7IDB4MDA3MCwgMHg4MDIwIH0sCisJeyAweDAwNzMsIDB4MTAwMCB9LAorCXsgMHgwMDc0LCAweGU0MDAgfSwKKwl7IDB4MDA3NSwgMHgwMDAyIH0sCisJeyAweDAwNzYsIDB4MDAwMSB9LAorCXsgMHgwMDc3LCAweDAwZjAgfSwKKwl7IDB4MDA3OCwgMHgwMDAwIH0sCisJeyAweDAwNzksIDB4MDAwMCB9LAorCXsgMHgwMDdhLCAweDAxMjMgfSwKKwl7IDB4MDA3YiwgMHg4MDAzIH0sCisJeyAweDAwODAsIDB4MDAwMCB9LAorCXsgMHgwMDgxLCAweDAwMDAgfSwKKwl7IDB4MDA4MiwgMHgwMDAwIH0sCisJeyAweDAwODMsIDB4MDAwMCB9LAorCXsgMHgwMDg0LCAweDAwMDAgfSwKKwl7IDB4MDA4NiwgMHgwMDA4IH0sCisJeyAweDAwODcsIDB4MDAwMCB9LAorCXsgMHgwMDhhLCAweDAwMDAgfSwKKwl7IDB4MDA4YiwgMHgwMDAwIH0sCisJeyAweDAwOGMsIDB4MDAwMyB9LAorCXsgMHgwMDhlLCAweDAwMDQgfSwKKwl7IDB4MDA4ZiwgMHgxMDAwIH0sCisJeyAweDAwOTAsIDB4MDY0NiB9LAorCXsgMHgwMDkxLCAweDBlM2UgfSwKKwl7IDB4MDA5MiwgMHgxMDcxIH0sCisJeyAweDAwOTMsIDB4MDAwMCB9LAorCXsgMHgwMDk0LCAweDAwODAgfSwKKwl7IDB4MDA5NywgMHgwMDAwIH0sCisJeyAweDAwOTgsIDB4MDAwMCB9LAorCXsgMHgwMDlhLCAweDAwMDAgfSwKKwl7IDB4MDA5ZiwgMHgwMDAwIH0sCisJeyAweDAwYWUsIDB4MjAwMCB9LAorCXsgMHgwMGFmLCAweDAwMDAgfSwKKwl7IDB4MDBiNiwgMHgwMDAwIH0sCisJeyAweDAwYjcsIDB4MDAwMCB9LAorCXsgMHgwMGI4LCAweDAwMDAgfSwKKwl7IDB4MDBiYSwgMHgwMDAwIH0sCisJeyAweDAwYmIsIDB4MDAwMCB9LAorCXsgMHgwMGJlLCAweDAwMDAgfSwKKwl7IDB4MDBiZiwgMHgwMDAwIH0sCisJeyAweDAwYzAsIDB4MDAwMCB9LAorCXsgMHgwMGMxLCAweDAwMDAgfSwKKwl7IDB4MDBjNSwgMHgwMDAwIH0sCisJeyAweDAwY2IsIDB4YTAyZiB9LAorCXsgMHgwMGNjLCAweDAwMDAgfSwKKwl7IDB4MDBjZCwgMHgwZTAyIH0sCisJeyAweDAwZDksIDB4MDhmOSB9LAorCXsgMHgwMGRiLCAweDAwMDggfSwKKwl7IDB4MDBkYywgMHgwMGMwIH0sCisJeyAweDAwZGQsIDB4NjcyNCB9LAorCXsgMHgwMGRlLCAweDMxMzEgfSwKKwl7IDB4MDBkZiwgMHgwMDA4IH0sCisJeyAweDAwZTAsIDB4NDAwMCB9LAorCXsgMHgwMGUxLCAweDMxMzEgfSwKKwl7IDB4MDBlMiwgMHgwMDQzIH0sCisJeyAweDAwZTQsIDB4NDAwYiB9LAorCXsgMHgwMGU1LCAweDgwMzEgfSwKKwl7IDB4MDBlNiwgMHgzMDgwIH0sCisJeyAweDAwZTcsIDB4NDEwMCB9LAorCXsgMHgwMGU4LCAweDE0MDAgfSwKKwl7IDB4MDBlOSwgMHhlMDBhIH0sCisJeyAweDAwZWEsIDB4MDQwNCB9LAorCXsgMHgwMGViLCAweDA0MDQgfSwKKwl7IDB4MDBlYywgMHhiMzIwIH0sCisJeyAweDAwZWQsIDB4MDAwMCB9LAorCXsgMHgwMGY0LCAweDAwMDAgfSwKKwl7IDB4MDBmNiwgMHgwMDAwIH0sCisJeyAweDAwZjgsIDB4MDAwMCB9LAorCXsgMHgwMGZhLCAweDgwMDAgfSwKKwl7IDB4MDBmZCwgMHgwMDAxIH0sCisJeyAweDAwZmUsIDB4MTBlYyB9LAorCXsgMHgwMGZmLCAweDY0MDYgfSwKKwl7IDB4MDEwMCwgMHhhMGEwIH0sCisJeyAweDAxMDgsIDB4NDQ0NCB9LAorCXsgMHgwMTA5LCAweDQ0NDQgfSwKKwl7IDB4MDEwYSwgMHhhYWFhIH0sCisJeyAweDAxMGIsIDB4MDBhMCB9LAorCXsgMHgwMTBjLCAweDhhYWEgfSwKKwl7IDB4MDEwZCwgMHhhYWFhIH0sCisJeyAweDAxMGUsIDB4MmFhYSB9LAorCXsgMHgwMTBmLCAweDAwMmEgfSwKKwl7IDB4MDExMCwgMHhhMGE0IH0sCisJeyAweDAxMTEsIDB4NDYwMiB9LAorCXsgMHgwMTEyLCAweDAxMDEgfSwKKwl7IDB4MDExMywgMHgyMDAwIH0sCisJeyAweDAxMTQsIDB4MDAwMCB9LAorCXsgMHgwMTE2LCAweDAwMDAgfSwKKwl7IDB4MDExNywgMHgwZjAwIH0sCisJeyAweDAxMTgsIDB4MDAwNiB9LAorCXsgMHgwMTI1LCAweDIyMjQgfSwKKwl7IDB4MDEyNiwgMHg1NTUwIH0sCisJeyAweDAxMjcsIDB4MDQwMCB9LAorCXsgMHgwMTI4LCAweDc3MTEgfSwKKwl7IDB4MDEzMiwgMHgwMDA0IH0sCisJeyAweDAxMzcsIDB4NTQ0MSB9LAorCXsgMHgwMTM5LCAweDc5YTEgfSwKKwl7IDB4MDEzYSwgMHgzMGMwIH0sCisJeyAweDAxM2IsIDB4MjAwMCB9LAorCXsgMHgwMTNjLCAweDIwMDUgfSwKKwl7IDB4MDEzZCwgMHgzMGMwIH0sCisJeyAweDAxM2UsIDB4MDAwMCB9LAorCXsgMHgwMTQwLCAweDM3MDAgfSwKKwl7IDB4MDE0MSwgMHgxZjAwIH0sCisJeyAweDAxNDQsIDB4MDAwMCB9LAorCXsgMHgwMTQ1LCAweDAwMDIgfSwKKwl7IDB4MDE0NiwgMHgwMDAwIH0sCisJeyAweDAxNjAsIDB4MGU4MCB9LAorCXsgMHgwMTYxLCAweDAwMjAgfSwKKwl7IDB4MDE2MiwgMHgwMDgwIH0sCisJeyAweDAxNjMsIDB4MDgwMCB9LAorCXsgMHgwMTY0LCAweDAwMDAgfSwKKwl7IDB4MDE2NSwgMHgwMDAwIH0sCisJeyAweDAxNjYsIDB4MDAwMCB9LAorCXsgMHgwMTY3LCAweDE0MTcgfSwKKwl7IDB4MDE2OCwgMHgwMDE3IH0sCisJeyAweDAxNjksIDB4MDAxNyB9LAorCXsgMHgwMTgwLCAweDIwMDAgfSwKKwl7IDB4MDE4MSwgMHgwMDAwIH0sCisJeyAweDAxODIsIDB4MDAwMCB9LAorCXsgMHgwMTgzLCAweDIwMDAgfSwKKwl7IDB4MDE4NCwgMHgwMDAwIH0sCisJeyAweDAxODUsIDB4MDAwMCB9LAorCXsgMHgwMWIwLCAweDRiMzAgfSwKKwl7IDB4MDFiMSwgMHgwMDAwIH0sCisJeyAweDAxYjIsIDB4ZDg3MCB9LAorCXsgMHgwMWIzLCAweDAwMDAgfSwKKwl7IDB4MDFiNCwgMHgwMDMwIH0sCisJeyAweDAxYjUsIDB4NTc1NyB9LAorCXsgMHgwMWI2LCAweDU3NTcgfSwKKwl7IDB4MDFiNywgMHg1NzU3IH0sCisJeyAweDAxYjgsIDB4NTc1NyB9LAorCXsgMHgwMWMwLCAweDQzM2QgfSwKKwl7IDB4MDFjMSwgMHgwNTQwIH0sCisJeyAweDAxYzIsIDB4MDAwMCB9LAorCXsgMHgwMWMzLCAweDAwMDAgfSwKKwl7IDB4MDFjNCwgMHgwMDAwIH0sCisJeyAweDAxYzUsIDB4MDAwOSB9LAorCXsgMHgwMWM2LCAweDAwMTggfSwKKwl7IDB4MDFjNywgMHgwMDJhIH0sCisJeyAweDAxYzgsIDB4MDA0YyB9LAorCXsgMHgwMWM5LCAweDAwOTcgfSwKKwl7IDB4MDFjYSwgMHgwMWMzIH0sCisJeyAweDAxY2IsIDB4MDNlOSB9LAorCXsgMHgwMWNjLCAweDEzODkgfSwKKwl7IDB4MDFjZCwgMHhjMzUxIH0sCisJeyAweDAxY2UsIDB4MDAwMCB9LAorCXsgMHgwMWNmLCAweDAwMDAgfSwKKwl7IDB4MDFkMCwgMHgwMDAwIH0sCisJeyAweDAxZDEsIDB4MDAwMCB9LAorCXsgMHgwMWQyLCAweDAwMDAgfSwKKwl7IDB4MDFkMywgMHgwMDNjIH0sCisJeyAweDAxZDQsIDB4NTc1NyB9LAorCXsgMHgwMWQ1LCAweDU3NTcgfSwKKwl7IDB4MDFkNiwgMHg1NzU3IH0sCisJeyAweDAxZDcsIDB4NTc1NyB9LAorCXsgMHgwMWQ4LCAweDU3NTcgfSwKKwl7IDB4MDFkOSwgMHg1NzU3IH0sCisJeyAweDAxZGEsIDB4MDAwMCB9LAorCXsgMHgwMWRiLCAweDAwMDAgfSwKKwl7IDB4MDFkZCwgMHgwMDA5IH0sCisJeyAweDAxZGUsIDB4N2YwMCB9LAorCXsgMHgwMWRmLCAweDAwYzggfSwKKwl7IDB4MDFlMCwgMHgwNjkxIH0sCisJeyAweDAxZTEsIDB4MDAwMCB9LAorCXsgMHgwMWUyLCAweDAwMDAgfSwKKwl7IDB4MDFlMywgMHgwMDAwIH0sCisJeyAweDAxZTQsIDB4MDAwMCB9LAorCXsgMHgwMWU1LCAweDAwNDAgfSwKKwl7IDB4MDFlNiwgMHgwMDAwIH0sCisJeyAweDAxZTcsIDB4MDAwMCB9LAorCXsgMHgwMWU4LCAweDAwMDAgfSwKKwl7IDB4MDFlYSwgMHgwMDAwIH0sCisJeyAweDAxZWIsIDB4MDAwMCB9LAorCXsgMHgwMWVjLCAweDAwMDAgfSwKKwl7IDB4MDFlZCwgMHgwMDAwIH0sCisJeyAweDAxZWUsIDB4MDAwMCB9LAorCXsgMHgwMWVmLCAweDAwMDAgfSwKKwl7IDB4MDFmMCwgMHgwMDAwIH0sCisJeyAweDAxZjEsIDB4MDAwMCB9LAorCXsgMHgwMWYyLCAweDAwMDAgfSwKKwl7IDB4MDIwMCwgMHgwMDAwIH0sCisJeyAweDAyMDEsIDB4MjI0NCB9LAorCXsgMHgwMjAyLCAweGFhYWEgfSwKKwl7IDB4MDI1MCwgMHg4MDEwIH0sCisJeyAweDAyNTEsIDB4MDAwMCB9LAorCXsgMHgwMjUyLCAweDAyOGEgfSwKKwl7IDB4MDJmYSwgMHgwMDAwIH0sCisJeyAweDAyZmIsIDB4MDAwMCB9LAorCXsgMHgwMmZjLCAweDAwMDAgfSwKKwl7IDB4MDMwMCwgMHgwMDAwIH0sCisJeyAweDAzZDAsIDB4MDAwMCB9LAorCXsgMHgwM2QxLCAweDAwMDAgfSwKKwl7IDB4MDNkMiwgMHgwMDAwIH0sCisJeyAweDAzZDMsIDB4MDAwMCB9LAorCXsgMHgwM2Q0LCAweDIwMDAgfSwKKwl7IDB4MDNkNSwgMHgyMDAwIH0sCisJeyAweDAzZDYsIDB4MDAwMCB9LAorCXsgMHgwM2Q3LCAweDAwMDAgfSwKKwl7IDB4MDNkOCwgMHgyMDAwIH0sCisJeyAweDAzZDksIDB4MjAwMCB9LAorCXsgMHgwM2RhLCAweDIwMDAgfSwKKwl7IDB4MDNkYiwgMHgyMDAwIH0sCisJeyAweDAzZGMsIDB4MDAwMCB9LAorCXsgMHgwM2RkLCAweDAwMDAgfSwKKwl7IDB4MDNkZSwgMHgwMDAwIH0sCisJeyAweDAzZGYsIDB4MjAwMCB9LAorCXsgMHgwM2UwLCAweDAwMDAgfSwKKwl7IDB4MDNlMSwgMHgwMDAwIH0sCisJeyAweDAzZTIsIDB4MDAwMCB9LAorCXsgMHgwM2UzLCAweDAwMDAgfSwKKwl7IDB4MDNlNCwgMHgwMDAwIH0sCisJeyAweDAzZTUsIDB4MDAwMCB9LAorCXsgMHgwM2U2LCAweDAwMDAgfSwKKwl7IDB4MDNlNywgMHgwMDAwIH0sCisJeyAweDAzZTgsIDB4MDAwMCB9LAorCXsgMHgwM2U5LCAweDAwMDAgfSwKKwl7IDB4MDNlYSwgMHgwMDAwIH0sCisJeyAweDAzZWIsIDB4MDAwMCB9LAorCXsgMHgwM2VjLCAweDAwMDAgfSwKKwl7IDB4MDNlZCwgMHgwMDAwIH0sCisJeyAweDAzZWUsIDB4MDAwMCB9LAorCXsgMHgwM2VmLCAweDAwMDAgfSwKKwl7IDB4MDNmMCwgMHgwODAwIH0sCisJeyAweDAzZjEsIDB4MDgwMCB9LAorCXsgMHgwM2YyLCAweDA4MDAgfSwKKwl7IDB4MDNmMywgMHgwODAwIH0sCit9OworCitzdGF0aWMgYm9vbCBydDU2NjNfdm9sYXRpbGVfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBSVDU2NjNfUkVTRVQ6CisJY2FzZSBSVDU2NjNfU0lMX0RFVF9DVEw6CisJY2FzZSBSVDU2NjNfSFBfSU1QX0dBSU5fMjoKKwljYXNlIFJUNTY2M19BRF9EQV9NSVhFUjoKKwljYXNlIFJUNTY2M19GUkFDX0RJVl8yOgorCWNhc2UgUlQ1NjYzX01JQ0JJQVNfMToKKwljYXNlIFJUNTY2M19BU1JDXzExXzI6CisJY2FzZSBSVDU2NjNfQURDX0VRXzE6CisJY2FzZSBSVDU2NjNfSU5UX1NUXzE6CisJY2FzZSBSVDU2NjNfSU5UX1NUXzI6CisJY2FzZSBSVDU2NjNfR1BJT19TVEE6CisJY2FzZSBSVDU2NjNfU0lOX0dFTl8xOgorCWNhc2UgUlQ1NjYzX0lMX0NNRF8xOgorCWNhc2UgUlQ1NjYzX0lMX0NNRF81OgorCWNhc2UgUlQ1NjYzX0lMX0NNRF9QV1JTQVYxOgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8xOgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8yOgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8zOgorCWNhc2UgUlQ1NjYzX0pEX0NUUkwyOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRDoKKwljYXNlIFJUNTY2M19WRU5ET1JfSURfMToKKwljYXNlIFJUNTY2M19WRU5ET1JfSURfMjoKKwljYXNlIFJUNTY2M19QTExfSU5UX1JFRzoKKwljYXNlIFJUNTY2M19TT0ZUX1JBTVA6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV8xOgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfNToKKwljYXNlIFJUNTY2M19TVE9fRFJFXzY6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV83OgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST18xOgorCWNhc2UgUlQ1NjYzX01JQ19ERUNST180OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMToKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzM6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl80OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fNToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl8xXzE6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfOToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDE6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1QyOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUMzoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDQ6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q1OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNjoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDc6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q4OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUOToKKwljYXNlIFJUNTY2M19BTkFfSkQ6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBib29sIHJ0NTY2M19yZWFkYWJsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFJUNTY2M19SRVNFVDoKKwljYXNlIFJUNTY2M19IUF9PVVRfRU46CisJY2FzZSBSVDU2NjNfSFBfTENIX0RSRToKKwljYXNlIFJUNTY2M19IUF9SQ0hfRFJFOgorCWNhc2UgUlQ1NjYzX0NBTElCX0JTVDoKKwljYXNlIFJUNTY2M19SRUNNSVg6CisJY2FzZSBSVDU2NjNfU0lMX0RFVF9DVEw6CisJY2FzZSBSVDU2NjNfUFdSX1NBVl9TSUxERVQ6CisJY2FzZSBSVDU2NjNfU0lERVRPTkVfQ1RMOgorCWNhc2UgUlQ1NjYzX1NUTzFfREFDX0RJR19WT0w6CisJY2FzZSBSVDU2NjNfU1RPMV9BRENfRElHX1ZPTDoKKwljYXNlIFJUNTY2M19TVE8xX0JPT1NUOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9HQUlOXzE6CisJY2FzZSBSVDU2NjNfSFBfSU1QX0dBSU5fMjoKKwljYXNlIFJUNTY2M19TVE8xX0FEQ19NSVhFUjoKKwljYXNlIFJUNTY2M19BRF9EQV9NSVhFUjoKKwljYXNlIFJUNTY2M19TVE9fREFDX01JWEVSOgorCWNhc2UgUlQ1NjYzX0RJR19TSURFX01JWEVSOgorCWNhc2UgUlQ1NjYzX0JZUEFTU19TVE9fREFDOgorCWNhc2UgUlQ1NjYzX0NBTElCX1JFQ19NSVg6CisJY2FzZSBSVDU2NjNfUFdSX0RJR18xOgorCWNhc2UgUlQ1NjYzX1BXUl9ESUdfMjoKKwljYXNlIFJUNTY2M19QV1JfQU5MR18xOgorCWNhc2UgUlQ1NjYzX1BXUl9BTkxHXzI6CisJY2FzZSBSVDU2NjNfUFdSX0FOTEdfMzoKKwljYXNlIFJUNTY2M19QV1JfTUlYRVI6CisJY2FzZSBSVDU2NjNfU0lHX0NMS19ERVQ6CisJY2FzZSBSVDU2NjNfUFJFX0RJVl9HQVRJTkdfMToKKwljYXNlIFJUNTY2M19QUkVfRElWX0dBVElOR18yOgorCWNhc2UgUlQ1NjYzX0kyUzFfU0RQOgorCWNhc2UgUlQ1NjYzX0FEREFfQ0xLXzE6CisJY2FzZSBSVDU2NjNfQUREQV9SU1Q6CisJY2FzZSBSVDU2NjNfRlJBQ19ESVZfMToKKwljYXNlIFJUNTY2M19GUkFDX0RJVl8yOgorCWNhc2UgUlQ1NjYzX1RETV8xOgorCWNhc2UgUlQ1NjYzX1RETV8yOgorCWNhc2UgUlQ1NjYzX1RETV8zOgorCWNhc2UgUlQ1NjYzX1RETV80OgorCWNhc2UgUlQ1NjYzX1RETV81OgorCWNhc2UgUlQ1NjYzX0dMQl9DTEs6CisJY2FzZSBSVDU2NjNfUExMXzE6CisJY2FzZSBSVDU2NjNfUExMXzI6CisJY2FzZSBSVDU2NjNfQVNSQ18xOgorCWNhc2UgUlQ1NjYzX0FTUkNfMjoKKwljYXNlIFJUNTY2M19BU1JDXzQ6CisJY2FzZSBSVDU2NjNfRFVNTVlfUkVHOgorCWNhc2UgUlQ1NjYzX0FTUkNfODoKKwljYXNlIFJUNTY2M19BU1JDXzk6CisJY2FzZSBSVDU2NjNfQVNSQ18xMToKKwljYXNlIFJUNTY2M19ERVBPUF8xOgorCWNhc2UgUlQ1NjYzX0RFUE9QXzI6CisJY2FzZSBSVDU2NjNfREVQT1BfMzoKKwljYXNlIFJUNTY2M19IUF9DSEFSR0VfUFVNUF8xOgorCWNhc2UgUlQ1NjYzX0hQX0NIQVJHRV9QVU1QXzI6CisJY2FzZSBSVDU2NjNfTUlDQklBU18xOgorCWNhc2UgUlQ1NjYzX1JDX0NMSzoKKwljYXNlIFJUNTY2M19BU1JDXzExXzI6CisJY2FzZSBSVDU2NjNfRFVNTVlfUkVHXzI6CisJY2FzZSBSVDU2NjNfUkVDX1BBVEhfR0FJTjoKKwljYXNlIFJUNTY2M19BVVRPXzFNUkNfQ0xLOgorCWNhc2UgUlQ1NjYzX0FEQ19FUV8xOgorCWNhc2UgUlQ1NjYzX0FEQ19FUV8yOgorCWNhc2UgUlQ1NjYzX0lSUV8xOgorCWNhc2UgUlQ1NjYzX0lSUV8yOgorCWNhc2UgUlQ1NjYzX0lSUV8zOgorCWNhc2UgUlQ1NjYzX0lSUV80OgorCWNhc2UgUlQ1NjYzX0lSUV81OgorCWNhc2UgUlQ1NjYzX0lOVF9TVF8xOgorCWNhc2UgUlQ1NjYzX0lOVF9TVF8yOgorCWNhc2UgUlQ1NjYzX0dQSU9fMToKKwljYXNlIFJUNTY2M19HUElPXzI6CisJY2FzZSBSVDU2NjNfR1BJT19TVEE6CisJY2FzZSBSVDU2NjNfU0lOX0dFTl8xOgorCWNhc2UgUlQ1NjYzX1NJTl9HRU5fMjoKKwljYXNlIFJUNTY2M19TSU5fR0VOXzM6CisJY2FzZSBSVDU2NjNfU09GX1ZPTF9aQzE6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzE6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzI6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzM6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzQ6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzU6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzY6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzc6CisJY2FzZSBSVDU2NjNfSUxfQ01EXzg6CisJY2FzZSBSVDU2NjNfSUxfQ01EX1BXUlNBVjE6CisJY2FzZSBSVDU2NjNfSUxfQ01EX1BXUlNBVjI6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzE6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzI6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzM6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzQ6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzU6CisJY2FzZSBSVDU2NjNfRU1fSkFDS19UWVBFXzY6CisJY2FzZSBSVDU2NjNfU1RPMV9IUEZfQURKMToKKwljYXNlIFJUNTY2M19TVE8xX0hQRl9BREoyOgorCWNhc2UgUlQ1NjYzX0ZBU1RfT0ZGX01JQ0JJQVM6CisJY2FzZSBSVDU2NjNfSkRfQ1RSTDE6CisJY2FzZSBSVDU2NjNfSkRfQ1RSTDI6CisJY2FzZSBSVDU2NjNfRElHX01JU0M6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRF8xOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRF8yOgorCWNhc2UgUlQ1NjYzX0RJR19WT0xfWkNEOgorCWNhc2UgUlQ1NjYzX0FOQV9CSUFTX0NVUl8xOgorCWNhc2UgUlQ1NjYzX0FOQV9CSUFTX0NVUl8yOgorCWNhc2UgUlQ1NjYzX0FOQV9CSUFTX0NVUl8zOgorCWNhc2UgUlQ1NjYzX0FOQV9CSUFTX0NVUl80OgorCWNhc2UgUlQ1NjYzX0FOQV9CSUFTX0NVUl81OgorCWNhc2UgUlQ1NjYzX0FOQV9CSUFTX0NVUl82OgorCWNhc2UgUlQ1NjYzX0JJQVNfQ1VSXzU6CisJY2FzZSBSVDU2NjNfQklBU19DVVJfNjoKKwljYXNlIFJUNTY2M19CSUFTX0NVUl83OgorCWNhc2UgUlQ1NjYzX0JJQVNfQ1VSXzg6CisJY2FzZSBSVDU2NjNfREFDUkVGX0xETzoKKwljYXNlIFJUNTY2M19EVU1NWV9SRUdfMzoKKwljYXNlIFJUNTY2M19CSUFTX0NVUl85OgorCWNhc2UgUlQ1NjYzX0RVTU1ZX1JFR180OgorCWNhc2UgUlQ1NjYzX1ZSRUZBREpfT1A6CisJY2FzZSBSVDU2NjNfVlJFRl9SRUNNSVg6CisJY2FzZSBSVDU2NjNfQ0hBUkdFX1BVTVBfMToKKwljYXNlIFJUNTY2M19DSEFSR0VfUFVNUF8xXzI6CisJY2FzZSBSVDU2NjNfQ0hBUkdFX1BVTVBfMV8zOgorCWNhc2UgUlQ1NjYzX0NIQVJHRV9QVU1QXzI6CisJY2FzZSBSVDU2NjNfRElHX0lOX1BJTjE6CisJY2FzZSBSVDU2NjNfUEFEX0RSVl9DVEw6CisJY2FzZSBSVDU2NjNfUExMX0lOVF9SRUc6CisJY2FzZSBSVDU2NjNfQ0hPUF9EQUNfTDoKKwljYXNlIFJUNTY2M19DSE9QX0FEQzoKKwljYXNlIFJUNTY2M19DQUxJQl9BREM6CisJY2FzZSBSVDU2NjNfQ0hPUF9EQUNfUjoKKwljYXNlIFJUNTY2M19EVU1NWV9DVExfREFDTFI6CisJY2FzZSBSVDU2NjNfRFVNTVlfUkVHXzU6CisJY2FzZSBSVDU2NjNfU09GVF9SQU1QOgorCWNhc2UgUlQ1NjYzX1RFU1RfTU9ERV8xOgorCWNhc2UgUlQ1NjYzX1RFU1RfTU9ERV8yOgorCWNhc2UgUlQ1NjYzX1RFU1RfTU9ERV8zOgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfMToKKwljYXNlIFJUNTY2M19TVE9fRFJFXzI6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV8zOgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfNDoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzU6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV82OgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfNzoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzg6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV85OgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfMTA6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzE6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzI6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzM6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzQ6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzU6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzY6CisJY2FzZSBSVDU2NjNfSFBfREVDUk9fMToKKwljYXNlIFJUNTY2M19IUF9ERUNST18yOgorCWNhc2UgUlQ1NjYzX0hQX0RFQ1JPXzM6CisJY2FzZSBSVDU2NjNfSFBfREVDUk9fNDoKKwljYXNlIFJUNTY2M19IUF9ERUNPVVA6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl9NQVA4OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fTUFQOToKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOX01BUDEwOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fTUFQMTE6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMjoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzM6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl80OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fNToKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzY6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl83OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fODoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzk6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xMDoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzExOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMTI6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xMzoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzE0OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMTU6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xNjoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzE3OgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMTg6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xOToKKwljYXNlIFJUNTY2M19IUF9JTVBTRU5fRElHNToKKwljYXNlIFJUNTY2M19IUF9JTVBTRU5fTUFQMToKKwljYXNlIFJUNTY2M19IUF9JTVBTRU5fTUFQMjoKKwljYXNlIFJUNTY2M19IUF9JTVBTRU5fTUFQMzoKKwljYXNlIFJUNTY2M19IUF9JTVBTRU5fTUFQNDoKKwljYXNlIFJUNTY2M19IUF9JTVBTRU5fTUFQNToKKwljYXNlIFJUNTY2M19IUF9JTVBTRU5fTUFQNzoKKwljYXNlIFJUNTY2M19IUF9MT0dJQ18xOgorCWNhc2UgUlQ1NjYzX0hQX0xPR0lDXzI6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfMToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl8xXzE6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfMjoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl8zOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzQ6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfNToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl81XzE6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfNjoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl83OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzk6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfMTA6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfMTE6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1QxOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUMjoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDM6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q0OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDY6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q3OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUODoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDk6CisJY2FzZSBSVDU2NjNfSFBfQU1QX0RFVDoKKwljYXNlIFJUNTY2M19EVU1NWV9SRUdfNjoKKwljYXNlIFJUNTY2M19IUF9CSUFTOgorCWNhc2UgUlQ1NjYzX0NCSl8xOgorCWNhc2UgUlQ1NjYzX0NCSl8yOgorCWNhc2UgUlQ1NjYzX0NCSl8zOgorCWNhc2UgUlQ1NjYzX0RVTU1ZXzE6CisJY2FzZSBSVDU2NjNfRFVNTVlfMjoKKwljYXNlIFJUNTY2M19EVU1NWV8zOgorCWNhc2UgUlQ1NjYzX0FOQV9KRDoKKwljYXNlIFJUNTY2M19BRENfTENIX0xQRjFfQTE6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9MUEYxX0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfTFBGMV9IMDoKKwljYXNlIFJUNTY2M19BRENfUkNIX0xQRjFfSDA6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEYxX0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGMV9BMToKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjFfQTI6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEYxX0EyOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGMV9IMDoKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjFfSDA6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEYyX0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGMl9BMToKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjJfQTI6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEYyX0EyOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGMl9IMDoKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjJfSDA6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEYzX0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGM19BMToKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjNfQTI6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEYzX0EyOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGM19IMDoKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjNfSDA6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9CUEY0X0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfQlBGNF9BMToKKwljYXNlIFJUNTY2M19BRENfTENIX0JQRjRfQTI6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9CUEY0X0EyOgorCWNhc2UgUlQ1NjYzX0FEQ19MQ0hfQlBGNF9IMDoKKwljYXNlIFJUNTY2M19BRENfUkNIX0JQRjRfSDA6CisJY2FzZSBSVDU2NjNfQURDX0xDSF9IUEYxX0ExOgorCWNhc2UgUlQ1NjYzX0FEQ19SQ0hfSFBGMV9BMToKKwljYXNlIFJUNTY2M19BRENfTENIX0hQRjFfSDA6CisJY2FzZSBSVDU2NjNfQURDX1JDSF9IUEYxX0gwOgorCWNhc2UgUlQ1NjYzX0FEQ19FUV9QUkVfVk9MX0w6CisJY2FzZSBSVDU2NjNfQURDX0VRX1BSRV9WT0xfUjoKKwljYXNlIFJUNTY2M19BRENfRVFfUE9TVF9WT0xfTDoKKwljYXNlIFJUNTY2M19BRENfRVFfUE9TVF9WT0xfUjoKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworc3RhdGljIGJvb2wgcnQ1NjY4X3ZvbGF0aWxlX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUlQ1NjYzX1JFU0VUOgorCWNhc2UgUlQ1NjY4X0NCSl9UWVBFXzI6CisJY2FzZSBSVDU2NjhfUERNX09VVF9DVEw6CisJY2FzZSBSVDU2NjhfUERNX0kyQ19EQVRBX0NUTDE6CisJY2FzZSBSVDU2NjhfUERNX0kyQ19EQVRBX0NUTDQ6CisJY2FzZSBSVDU2NjhfQUxDX0JLX0dBSU46CisJY2FzZSBSVDU2NjNfUExMXzI6CisJY2FzZSBSVDU2NjNfTUlDQklBU18xOgorCWNhc2UgUlQ1NjYzX0FEQ19FUV8xOgorCWNhc2UgUlQ1NjYzX0lOVF9TVF8xOgorCWNhc2UgUlQ1NjY4X0dQSU9fU1RBOgorCWNhc2UgUlQ1NjYzX0lMX0NNRF8xOgorCWNhc2UgUlQ1NjYzX0lMX0NNRF81OgorCWNhc2UgUlQ1NjY4X0FfSkRfQ1RSTDoKKwljYXNlIFJUNTY2M19KRF9DVFJMMjoKKwljYXNlIFJUNTY2M19WRU5ET1JfSUQ6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEXzE6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEXzI6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV8xOgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfNToKKwljYXNlIFJUNTY2M19TVE9fRFJFXzY6CisJY2FzZSBSVDU2NjNfU1RPX0RSRV83OgorCWNhc2UgUlQ1NjY4X01PTk9fRFlOQV82OgorCWNhc2UgUlQ1NjY4X1NUTzFfU0lMX0RFVDoKKwljYXNlIFJUNTY2OF9NT05PTF9TSUxfREVUOgorCWNhc2UgUlQ1NjY4X01PTk9SX1NJTF9ERVQ6CisJY2FzZSBSVDU2NjhfU1RPMl9EQUNfU0lMOgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDE6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUMjoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUxfU1QzOgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDQ6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8yOgorCWNhc2UgUlQ1NjYzX0hQX0lNUF9TRU5fMzoKKwljYXNlIFJUNTY2M19IUF9JTVBfU0VOXzQ6CisJY2FzZSBSVDU2NjNfSFBfSU1QX1NFTl8xMDoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl8xOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCXzEwOgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUMToKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDQ6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q1OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUNjoKKwljYXNlIFJUNTY2M19IUF9DQUxJQl9TVDc6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfU1Q4OgorCWNhc2UgUlQ1NjYzX0hQX0NBTElCX1NUOToKKwljYXNlIFJUNTY2OF9IUF9DQUxJQl9TVDEwOgorCWNhc2UgUlQ1NjY4X0hQX0NBTElCX1NUMTE6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBib29sIHJ0NTY2OF9yZWFkYWJsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFJUNTY2OF9MT1VUX0NUUkw6CisJY2FzZSBSVDU2NjhfSFBfQU1QXzI6CisJY2FzZSBSVDU2NjhfTU9OT19PVVQ6CisJY2FzZSBSVDU2NjhfTU9OT19HQUlOOgorCWNhc2UgUlQ1NjY4X0FFQ19CU1Q6CisJY2FzZSBSVDU2NjhfSU4xX0lOMjoKKwljYXNlIFJUNTY2OF9JTjNfSU40OgorCWNhc2UgUlQ1NjY4X0lOTDFfSU5SMToKKwljYXNlIFJUNTY2OF9DQkpfVFlQRV8yOgorCWNhc2UgUlQ1NjY4X0NCSl9UWVBFXzM6CisJY2FzZSBSVDU2NjhfQ0JKX1RZUEVfNDoKKwljYXNlIFJUNTY2OF9DQkpfVFlQRV81OgorCWNhc2UgUlQ1NjY4X0NCSl9UWVBFXzg6CisJY2FzZSBSVDU2NjhfREFDM19ESUdfVk9MOgorCWNhc2UgUlQ1NjY4X0RBQzNfQ1RSTDoKKwljYXNlIFJUNTY2OF9NT05PX0FEQ19ESUdfVk9MOgorCWNhc2UgUlQ1NjY4X1NUTzJfQURDX0RJR19WT0w6CisJY2FzZSBSVDU2NjhfTU9OT19BRENfQlNUX0dBSU46CisJY2FzZSBSVDU2NjhfU1RPMl9BRENfQlNUX0dBSU46CisJY2FzZSBSVDU2NjhfU0lERVRPTkVfQ1RSTDoKKwljYXNlIFJUNTY2OF9NT05PMV9BRENfTUlYRVI6CisJY2FzZSBSVDU2NjhfU1RPMl9BRENfTUlYRVI6CisJY2FzZSBSVDU2NjhfTU9OT19EQUNfTUlYRVI6CisJY2FzZSBSVDU2NjhfREFDMl9TUkNfQ1RSTDoKKwljYXNlIFJUNTY2OF9JRl8zXzRfREFUQV9DVEw6CisJY2FzZSBSVDU2NjhfSUZfNV9EQVRBX0NUTDoKKwljYXNlIFJUNTY2OF9QRE1fT1VUX0NUTDoKKwljYXNlIFJUNTY2OF9QRE1fSTJDX0RBVEFfQ1RMMToKKwljYXNlIFJUNTY2OF9QRE1fSTJDX0RBVEFfQ1RMMjoKKwljYXNlIFJUNTY2OF9QRE1fSTJDX0RBVEFfQ1RMMzoKKwljYXNlIFJUNTY2OF9QRE1fSTJDX0RBVEFfQ1RMNDoKKwljYXNlIFJUNTY2OF9SRUNNSVgxX05FVzoKKwljYXNlIFJUNTY2OF9SRUNNSVgxTF8wOgorCWNhc2UgUlQ1NjY4X1JFQ01JWDFMOgorCWNhc2UgUlQ1NjY4X1JFQ01JWDFSXzA6CisJY2FzZSBSVDU2NjhfUkVDTUlYMVI6CisJY2FzZSBSVDU2NjhfUkVDTUlYMl9ORVc6CisJY2FzZSBSVDU2NjhfUkVDTUlYMl9MXzI6CisJY2FzZSBSVDU2NjhfUkVDTUlYMl9SOgorCWNhc2UgUlQ1NjY4X1JFQ01JWDJfUl8yOgorCWNhc2UgUlQ1NjY4X0NBTElCX1JFQ19MUjoKKwljYXNlIFJUNTY2OF9BTENfQktfR0FJTjoKKwljYXNlIFJUNTY2OF9NT05PTUlYX0dBSU46CisJY2FzZSBSVDU2NjhfTU9OT01JWF9JTl9HQUlOOgorCWNhc2UgUlQ1NjY4X09VVF9NSVhMX0dBSU46CisJY2FzZSBSVDU2NjhfT1VUX0xNSVhfSU5fR0FJTjoKKwljYXNlIFJUNTY2OF9PVVRfUk1JWF9JTl9HQUlOOgorCWNhc2UgUlQ1NjY4X09VVF9STUlYX0lOX0dBSU4xOgorCWNhc2UgUlQ1NjY4X0xPVVRfTUlYRVJfQ1RSTDoKKwljYXNlIFJUNTY2OF9QV1JfVk9MOgorCWNhc2UgUlQ1NjY4X0FEQ0RBQ19SU1Q6CisJY2FzZSBSVDU2NjhfSTJTMzRfU0RQOgorCWNhc2UgUlQ1NjY4X0kyUzVfU0RQOgorCWNhc2UgUlQ1NjY4X1RETV81OgorCWNhc2UgUlQ1NjY4X1RETV82OgorCWNhc2UgUlQ1NjY4X1RETV83OgorCWNhc2UgUlQ1NjY4X1RETV84OgorCWNhc2UgUlQ1NjY4X0FTUkNfMzoKKwljYXNlIFJUNTY2OF9BU1JDXzY6CisJY2FzZSBSVDU2NjhfQVNSQ183OgorCWNhc2UgUlQ1NjY4X1BMTF9UUktfMTM6CisJY2FzZSBSVDU2NjhfSTJTX01fQ0xLX0NUTDoKKwljYXNlIFJUNTY2OF9GRElWX0kyUzM0X01fQ0xLOgorCWNhc2UgUlQ1NjY4X0ZESVZfSTJTMzRfTV9DTEsyOgorCWNhc2UgUlQ1NjY4X0ZESVZfSTJTNV9NX0NMSzoKKwljYXNlIFJUNTY2OF9GRElWX0kyUzVfTV9DTEsyOgorCWNhc2UgUlQ1NjY4X0lSUV80OgorCWNhc2UgUlQ1NjY4X0dQSU9fMzoKKwljYXNlIFJUNTY2OF9HUElPXzQ6CisJY2FzZSBSVDU2NjhfR1BJT19TVEE6CisJY2FzZSBSVDU2NjhfSFBfQU1QX0RFVDE6CisJY2FzZSBSVDU2NjhfSFBfQU1QX0RFVDI6CisJY2FzZSBSVDU2NjhfSFBfQU1QX0RFVDM6CisJY2FzZSBSVDU2NjhfTUlEX0JEX0hQX0FNUDoKKwljYXNlIFJUNTY2OF9MT1dfQkRfSFBfQU1QOgorCWNhc2UgUlQ1NjY4X1NPRl9WT0xfWkMyOgorCWNhc2UgUlQ1NjY4X0FEQ19TVE8yX0FESjE6CisJY2FzZSBSVDU2NjhfQURDX1NUTzJfQURKMjoKKwljYXNlIFJUNTY2OF9BX0pEX0NUUkw6CisJY2FzZSBSVDU2NjhfSkQxX1RSRVNfQ1RSTDoKKwljYXNlIFJUNTY2OF9KRDJfVFJFU19DVFJMOgorCWNhc2UgUlQ1NjY4X0pEX0NUUkwyOgorCWNhc2UgUlQ1NjY4X0RVTV9SRUdfMjoKKwljYXNlIFJUNTY2OF9EVU1fUkVHXzM6CisJY2FzZSBSVDU2NjNfVkVORE9SX0lEOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRF8xOgorCWNhc2UgUlQ1NjYzX1ZFTkRPUl9JRF8yOgorCWNhc2UgUlQ1NjY4X0RBQ0FEQ19ESUdfVk9MMjoKKwljYXNlIFJUNTY2OF9ESUdfSU5fUElOMjoKKwljYXNlIFJUNTY2OF9QQURfRFJWX0NUTDE6CisJY2FzZSBSVDU2NjhfU09GX1JBTV9ERVBPUDoKKwljYXNlIFJUNTY2OF9WT0xfVEVTVDoKKwljYXNlIFJUNTY2OF9URVNUX01PREVfMzoKKwljYXNlIFJUNTY2OF9URVNUX01PREVfNDoKKwljYXNlIFJUNTY2M19TVE9fRFJFXzk6CisJY2FzZSBSVDU2NjhfTU9OT19EWU5BXzE6CisJY2FzZSBSVDU2NjhfTU9OT19EWU5BXzI6CisJY2FzZSBSVDU2NjhfTU9OT19EWU5BXzM6CisJY2FzZSBSVDU2NjhfTU9OT19EWU5BXzQ6CisJY2FzZSBSVDU2NjhfTU9OT19EWU5BXzU6CisJY2FzZSBSVDU2NjhfTU9OT19EWU5BXzY6CisJY2FzZSBSVDU2NjhfU1RPMV9TSUxfREVUOgorCWNhc2UgUlQ1NjY4X01PTk9MX1NJTF9ERVQ6CisJY2FzZSBSVDU2NjhfTU9OT1JfU0lMX0RFVDoKKwljYXNlIFJUNTY2OF9TVE8yX0RBQ19TSUw6CisJY2FzZSBSVDU2NjhfUFdSX1NBVl9DVEwxOgorCWNhc2UgUlQ1NjY4X1BXUl9TQVZfQ1RMMjoKKwljYXNlIFJUNTY2OF9QV1JfU0FWX0NUTDM6CisJY2FzZSBSVDU2NjhfUFdSX1NBVl9DVEw0OgorCWNhc2UgUlQ1NjY4X1BXUl9TQVZfQ1RMNToKKwljYXNlIFJUNTY2OF9QV1JfU0FWX0NUTDY6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMMToKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUwyOgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTDM6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMNDoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUw1OgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTDY6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMNzoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUxfU1QxOgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDI6CisJY2FzZSBSVDU2NjhfTU9OT19BTVBfQ0FMX1NUMzoKKwljYXNlIFJUNTY2OF9NT05PX0FNUF9DQUxfU1Q0OgorCWNhc2UgUlQ1NjY4X01PTk9fQU1QX0NBTF9TVDU6CisJY2FzZSBSVDU2NjhfSFBfSU1QX1NFTl8xMzoKKwljYXNlIFJUNTY2OF9IUF9JTVBfU0VOXzE0OgorCWNhc2UgUlQ1NjY4X0hQX0lNUF9TRU5fNjoKKwljYXNlIFJUNTY2OF9IUF9JTVBfU0VOXzc6CisJY2FzZSBSVDU2NjhfSFBfSU1QX1NFTl84OgorCWNhc2UgUlQ1NjY4X0hQX0lNUF9TRU5fOToKKwljYXNlIFJUNTY2OF9IUF9JTVBfU0VOXzEwOgorCWNhc2UgUlQ1NjY4X0hQX0xPR0lDXzM6CisJY2FzZSBSVDU2NjhfSFBfQ0FMSUJfU1QxMDoKKwljYXNlIFJUNTY2OF9IUF9DQUxJQl9TVDExOgorCWNhc2UgUlQ1NjY4X1BST19SRUdfVEJMXzQ6CisJY2FzZSBSVDU2NjhfUFJPX1JFR19UQkxfNToKKwljYXNlIFJUNTY2OF9QUk9fUkVHX1RCTF82OgorCWNhc2UgUlQ1NjY4X1BST19SRUdfVEJMXzc6CisJY2FzZSBSVDU2NjhfUFJPX1JFR19UQkxfODoKKwljYXNlIFJUNTY2OF9QUk9fUkVHX1RCTF85OgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzE6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfMjoKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF8zOgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzQ6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfNToKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF82OgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzc6CisJY2FzZSBSVDU2NjhfU0FSX0FEQ19JTkxfODoKKwljYXNlIFJUNTY2OF9TQVJfQURDX0lOTF85OgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzEwOgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzExOgorCWNhc2UgUlQ1NjY4X1NBUl9BRENfSU5MXzEyOgorCWNhc2UgUlQ1NjY4X0RSQ19DVFJMXzE6CisJY2FzZSBSVDU2NjhfRFJDMV9DVFJMXzI6CisJY2FzZSBSVDU2NjhfRFJDMV9DVFJMXzM6CisJY2FzZSBSVDU2NjhfRFJDMV9DVFJMXzQ6CisJY2FzZSBSVDU2NjhfRFJDMV9DVFJMXzU6CisJY2FzZSBSVDU2NjhfRFJDMV9DVFJMXzY6CisJY2FzZSBSVDU2NjhfRFJDMV9IRF9DVFJMXzE6CisJY2FzZSBSVDU2NjhfRFJDMV9IRF9DVFJMXzI6CisJY2FzZSBSVDU2NjhfRFJDMV9QUklfUkVHXzE6CisJY2FzZSBSVDU2NjhfRFJDMV9QUklfUkVHXzI6CisJY2FzZSBSVDU2NjhfRFJDMV9QUklfUkVHXzM6CisJY2FzZSBSVDU2NjhfRFJDMV9QUklfUkVHXzQ6CisJY2FzZSBSVDU2NjhfRFJDMV9QUklfUkVHXzU6CisJY2FzZSBSVDU2NjhfRFJDMV9QUklfUkVHXzY6CisJY2FzZSBSVDU2NjhfRFJDMV9QUklfUkVHXzc6CisJY2FzZSBSVDU2NjhfRFJDMV9QUklfUkVHXzg6CisJY2FzZSBSVDU2NjhfQUxDX1BHQV9DVExfMToKKwljYXNlIFJUNTY2OF9BTENfUEdBX0NUTF8yOgorCWNhc2UgUlQ1NjY4X0FMQ19QR0FfQ1RMXzM6CisJY2FzZSBSVDU2NjhfQUxDX1BHQV9DVExfNDoKKwljYXNlIFJUNTY2OF9BTENfUEdBX0NUTF81OgorCWNhc2UgUlQ1NjY4X0FMQ19QR0FfQ1RMXzY6CisJY2FzZSBSVDU2NjhfQUxDX1BHQV9DVExfNzoKKwljYXNlIFJUNTY2OF9BTENfUEdBX0NUTF84OgorCWNhc2UgUlQ1NjY4X0FMQ19QR0FfUkVHXzE6CisJY2FzZSBSVDU2NjhfQUxDX1BHQV9SRUdfMjoKKwljYXNlIFJUNTY2OF9BTENfUEdBX1JFR18zOgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl8xOgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl8yOgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl8zOgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl80OgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl81OgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl82OgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl83OgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl84OgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl85OgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl8xMDoKKwljYXNlIFJUNTY2OF9BRENfRVFfUkVDT1ZfMTE6CisJY2FzZSBSVDU2NjhfQURDX0VRX1JFQ09WXzEyOgorCWNhc2UgUlQ1NjY4X0FEQ19FUV9SRUNPVl8xMzoKKwljYXNlIFJUNTY2OF9WSURfSElEREVOOgorCWNhc2UgUlQ1NjY4X1ZJRF9DVVNUT01FUjoKKwljYXNlIFJUNTY2OF9TQ0FOX01PREU6CisJY2FzZSBSVDU2NjhfSTJDX0JZUEE6CisJCXJldHVybiB0cnVlOworCWNhc2UgUlQ1NjYzX1RETV8xOgorCWNhc2UgUlQ1NjYzX0RFUE9QXzM6CisJY2FzZSBSVDU2NjNfQVNSQ18xMV8yOgorCWNhc2UgUlQ1NjYzX0lOVF9TVF8yOgorCWNhc2UgUlQ1NjYzX0dQSU9fU1RBOgorCWNhc2UgUlQ1NjYzX1NJTl9HRU5fMToKKwljYXNlIFJUNTY2M19TSU5fR0VOXzI6CisJY2FzZSBSVDU2NjNfU0lOX0dFTl8zOgorCWNhc2UgUlQ1NjYzX0lMX0NNRF9QV1JTQVYxOgorCWNhc2UgUlQ1NjYzX0lMX0NNRF9QV1JTQVYyOgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8xOgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8yOgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8zOgorCWNhc2UgUlQ1NjYzX0VNX0pBQ0tfVFlQRV80OgorCWNhc2UgUlQ1NjYzX0ZBU1RfT0ZGX01JQ0JJQVM6CisJY2FzZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzE6CisJY2FzZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzI6CisJY2FzZSBSVDU2NjNfQklBU19DVVJfOToKKwljYXNlIFJUNTY2M19EVU1NWV9SRUdfNDoKKwljYXNlIFJUNTY2M19WUkVGX1JFQ01JWDoKKwljYXNlIFJUNTY2M19DSEFSR0VfUFVNUF8xXzI6CisJY2FzZSBSVDU2NjNfQ0hBUkdFX1BVTVBfMV8zOgorCWNhc2UgUlQ1NjYzX0NIQVJHRV9QVU1QXzI6CisJY2FzZSBSVDU2NjNfQ0hPUF9EQUNfUjoKKwljYXNlIFJUNTY2M19EVU1NWV9DVExfREFDTFI6CisJY2FzZSBSVDU2NjNfRFVNTVlfUkVHXzU6CisJY2FzZSBSVDU2NjNfU09GVF9SQU1QOgorCWNhc2UgUlQ1NjYzX1RFU1RfTU9ERV8xOgorCWNhc2UgUlQ1NjYzX1NUT19EUkVfMTA6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzE6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzI6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzM6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzQ6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzU6CisJY2FzZSBSVDU2NjNfTUlDX0RFQ1JPXzY6CisJY2FzZSBSVDU2NjNfSFBfREVDUk9fMToKKwljYXNlIFJUNTY2M19IUF9ERUNST18yOgorCWNhc2UgUlQ1NjYzX0hQX0RFQ1JPXzM6CisJY2FzZSBSVDU2NjNfSFBfREVDUk9fNDoKKwljYXNlIFJUNTY2M19IUF9ERUNPVVA6CisJY2FzZSBSVDU2NjNfSFBfSU1QU0VOX01BUDQ6CisJY2FzZSBSVDU2NjNfSFBfSU1QU0VOX01BUDU6CisJY2FzZSBSVDU2NjNfSFBfSU1QU0VOX01BUDc6CisJY2FzZSBSVDU2NjNfSFBfQ0FMSUJfMToKKwljYXNlIFJUNTY2M19DQkpfMToKKwljYXNlIFJUNTY2M19DQkpfMjoKKwljYXNlIFJUNTY2M19DQkpfMzoKKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiBydDU2NjNfcmVhZGFibGVfcmVnaXN0ZXIoZGV2LCByZWcpOworCX0KK30KKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKHJ0NTY2M19ocF92b2xfdGx2LCAtMjQwMCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShydDU2NjhfaHBfdm9sX3RsdiwgLTIyNTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGFjX3ZvbF90bHYsIC02NTI1LCA3NSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYWRjX3ZvbF90bHYsIC0xNzI1LCA3NSwgMCk7CisKKy8qIHswLCArMjAsICsyNCwgKzMwLCArMzUsICs0MCwgKzQ0LCArNTAsICs1Mn0gZEIgKi8KK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9SQU5HRShpbl9ic3RfdGx2LAorCTAsIDAsIFRMVl9EQl9TQ0FMRV9JVEVNKDAsIDAsIDApLAorCTEsIDEsIFRMVl9EQl9TQ0FMRV9JVEVNKDIwMDAsIDAsIDApLAorCTIsIDIsIFRMVl9EQl9TQ0FMRV9JVEVNKDI0MDAsIDAsIDApLAorCTMsIDUsIFRMVl9EQl9TQ0FMRV9JVEVNKDMwMDAsIDUwMCwgMCksCisJNiwgNiwgVExWX0RCX1NDQUxFX0lURU0oNDQwMCwgMCwgMCksCisJNywgNywgVExWX0RCX1NDQUxFX0lURU0oNTAwMCwgMCwgMCksCisJOCwgOCwgVExWX0RCX1NDQUxFX0lURU0oNTIwMCwgMCwgMCkKKyk7CisKKy8qIEludGVyZmFjZSBkYXRhIHNlbGVjdCAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBydDU2NjNfaWYxX2FkY19kYXRhX3NlbGVjdFtdID0geworCSJML1IiLCAiUi9MIiwgIkwvTCIsICJSL1IiCit9OworCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjYzX2lmMV9hZGNfZW51bSwgUlQ1NjYzX1RETV8yLAorCVJUNTY2M19EQVRBX1NXQVBfQURDREFUMV9TSElGVCwgcnQ1NjYzX2lmMV9hZGNfZGF0YV9zZWxlY3QpOworCitzdGF0aWMgdm9pZCBydDU2NjNfZW5hYmxlX3B1c2hfYnV0dG9uX2lycShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChlbmFibGUpIHsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lMX0NNRF82LAorCQkJUlQ1NjY4X0VOXzRCVE5fSU5MX01BU0ssIFJUNTY2OF9FTl80QlROX0lOTF9FTik7CisJCS8qIHJlc2V0IGluLWxpbmUgY29tbWFuZCAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSUxfQ01EXzYsCisJCQlSVDU2NjhfUkVTRVRfNEJUTl9JTkxfTUFTSywKKwkJCVJUNTY2OF9SRVNFVF80QlROX0lOTF9SRVNFVCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JTF9DTURfNiwKKwkJCVJUNTY2OF9SRVNFVF80QlROX0lOTF9NQVNLLAorCQkJUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX05PUik7CisJCXN3aXRjaCAocnQ1NjYzLT5jb2RlY190eXBlKSB7CisJCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSVJRXzMsCisJCQkJUlQ1NjY4X0VOX0lSUV9JTkxJTkVfTUFTSywKKwkJCQlSVDU2NjhfRU5fSVJRX0lOTElORV9OT1IpOworCQkJYnJlYWs7CisJCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSVJRXzIsCisJCQkJUlQ1NjYzX0VOX0lSUV9JTkxJTkVfTUFTSywKKwkJCQlSVDU2NjNfRU5fSVJRX0lOTElORV9OT1IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIENPREVDX1RZUEVcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChydDU2NjMtPmNvZGVjX3R5cGUpIHsKKwkJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JUlFfMywKKwkJCQlSVDU2NjhfRU5fSVJRX0lOTElORV9NQVNLLAorCQkJCVJUNTY2OF9FTl9JUlFfSU5MSU5FX0JZUCk7CisJCQlicmVhazsKKwkJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JUlFfMiwKKwkJCQlSVDU2NjNfRU5fSVJRX0lOTElORV9NQVNLLAorCQkJCVJUNTY2M19FTl9JUlFfSU5MSU5FX0JZUCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gQ09ERUNfVFlQRVxuIik7CisJCX0KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lMX0NNRF82LAorCQkJUlQ1NjY4X0VOXzRCVE5fSU5MX01BU0ssIFJUNTY2OF9FTl80QlROX0lOTF9ESVMpOworCQkvKiByZXNldCBpbi1saW5lIGNvbW1hbmQgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0lMX0NNRF82LAorCQkJUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX01BU0ssCisJCQlSVDU2NjhfUkVTRVRfNEJUTl9JTkxfUkVTRVQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSUxfQ01EXzYsCisJCQlSVDU2NjhfUkVTRVRfNEJUTl9JTkxfTUFTSywKKwkJCVJUNTY2OF9SRVNFVF80QlROX0lOTF9OT1IpOworCX0KK30KKworLyoqCisgKiBydDU2NjhfamFja19kZXRlY3QgLSBEZXRlY3QgaGVhZHNldC4KKyAqIEBjb2RlYzogU29DIGF1ZGlvIGNvZGVjIGRldmljZS4KKyAqIEBqYWNrX2luc2VydDogSmFjayBpbnNlcnQgb3Igbm90LgorICoKKyAqIERldGVjdCB3aGV0aGVyIGlzIGhlYWRzZXQgb3Igbm90IHdoZW4gamFjayBpbnNlcnRlZC4KKyAqCisgKiBSZXR1cm5zIGRldGVjdCBzdGF0dXMuCisgKi8KKworc3RhdGljIGludCBydDU2NjhfamFja19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgamFja19pbnNlcnQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShjb2RlYyk7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgdmFsLCBpID0gMCwgc2xlZXBfdGltZVs1XSA9IHszMDAsIDE1MCwgMTAwLCA1MCwgMzB9OworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgamFja19pbnNlcnQ6JWRcbiIsIF9fZnVuY19fLCBqYWNrX2luc2VydCk7CisJaWYgKGphY2tfaW5zZXJ0KSB7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2OF9DQkpfVFlQRV8yLCAweDgwNDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjhfQ0JKX1RZUEVfMywgMHgxNDg0KTsKKworCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihkYXBtLCAiTUlDQklBUzEiKTsKKwkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oZGFwbSwgIk1JQ0JJQVMyIik7CisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKGRhcG0sICJNaWMgRGV0IFBvd2VyIik7CisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKGRhcG0sICJDQkogUG93ZXIiKTsKKwkJc25kX3NvY19kYXBtX3N5bmMoZGFwbSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19SQ19DTEssCisJCQlSVDU2NjhfRElHXzFNX0NMS19NQVNLLCBSVDU2NjhfRElHXzFNX0NMS19FTik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19SRUNNSVgsIDB4OCwgMHg4KTsKKworCQl3aGlsZSAoaSA8IDUpIHsKKwkJCW1zbGVlcChzbGVlcF90aW1lW2ldKTsKKwkJCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjY4X0NCSl9UWVBFXzIpICYgMHgwMDAzOworCQkJaWYgKHZhbCA9PSAweDEgfHwgdmFsID09IDB4MiB8fCB2YWwgPT0gMHgzKQorCQkJCWJyZWFrOworCQkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IE1YLTAwMTEgdmFsPSV4IHNsZWVwICVkXG4iLAorCQkJCV9fZnVuY19fLCB2YWwsIHNsZWVwX3RpbWVbaV0pOworCQkJaSsrOworCQl9CisJCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIHZhbCA9ICVkXG4iLCBfX2Z1bmNfXywgdmFsKTsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCQlydDU2NjgtPmphY2tfdHlwZSA9IFNORF9KQUNLX0hFQURTRVQ7CisJCQlydDU2NjNfZW5hYmxlX3B1c2hfYnV0dG9uX2lycShjb2RlYywgdHJ1ZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTUlDQklBUzEiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTUlDQklBUzIiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljIERldCBQb3dlciIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJDQkogUG93ZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCQkJcnQ1NjY4LT5qYWNrX3R5cGUgPSBTTkRfSkFDS19IRUFEUEhPTkU7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19SRUNNSVgsIDB4OCwgMHgwKTsKKworCQlpZiAocnQ1NjY4LT5qYWNrX3R5cGUgPT0gU05EX0pBQ0tfSEVBRFNFVCkgeworCQkJcnQ1NjYzX2VuYWJsZV9wdXNoX2J1dHRvbl9pcnEoY29kZWMsIGZhbHNlKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTUlDQklBUzEiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTUlDQklBUzIiKTsKKwkJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTWljIERldCBQb3dlciIpOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJDQkogUG93ZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9zeW5jKGRhcG0pOworCQl9CisJCXJ0NTY2OC0+amFja190eXBlID0gMDsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJqYWNrX3R5cGUgPSAlZFxuIiwgcnQ1NjY4LT5qYWNrX3R5cGUpOworCXJldHVybiBydDU2NjgtPmphY2tfdHlwZTsKK30KKworLyoqCisgKiBydDU2NjNfamFja19kZXRlY3QgLSBEZXRlY3QgaGVhZHNldC4KKyAqIEBjb2RlYzogU29DIGF1ZGlvIGNvZGVjIGRldmljZS4KKyAqIEBqYWNrX2luc2VydDogSmFjayBpbnNlcnQgb3Igbm90LgorICoKKyAqIERldGVjdCB3aGV0aGVyIGlzIGhlYWRzZXQgb3Igbm90IHdoZW4gamFjayBpbnNlcnRlZC4KKyAqCisgKiBSZXR1cm5zIGRldGVjdCBzdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgcnQ1NjYzX2phY2tfZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywgaW50IGphY2tfaW5zZXJ0KQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHZhbCwgaSA9IDAsIHNsZWVwX3RpbWVbNV0gPSB7MzAwLCAxNTAsIDEwMCwgNTAsIDMwfTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIGphY2tfaW5zZXJ0OiVkXG4iLCBfX2Z1bmNfXywgamFja19pbnNlcnQpOworCisJaWYgKGphY2tfaW5zZXJ0KSB7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19ESUdfTUlTQywKKwkJCVJUNTY2OF9ESUdfR0FURV9DVFJMX01BU0ssIFJUNTY2OF9ESUdfR0FURV9DVFJMX0VOKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0hQX0NIQVJHRV9QVU1QXzEsCisJCQlSVDU2NjNfU0lfSFBfTUFTSyB8IFJUNTY2OF9PU1dfSFBfTF9NQVNLIHwKKwkJCVJUNTY2OF9PU1dfSFBfUl9NQVNLLCBSVDU2NjNfU0lfSFBfRU4gfAorCQkJUlQ1NjY4X09TV19IUF9MX0RJUyB8IFJUNTY2OF9PU1dfSFBfUl9ESVMpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfRFVNTVlfMSwKKwkJCVJUNTY2M19FTUJfQ0xLX01BU0sgfCBSVDU2NjNfSFBBX0NQTF9CSUFTX01BU0sgfAorCQkJUlQ1NjYzX0hQQV9DUFJfQklBU19NQVNLLCBSVDU2NjNfRU1CX0NMS19FTiB8CisJCQlSVDU2NjNfSFBBX0NQTF9CSUFTXzEgfCBSVDU2NjNfSFBBX0NQUl9CSUFTXzEpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfQ0JKXzEsCisJCQlSVDU2NjNfSU5CVUZfQ0JKX0JTVDFfTUFTSyB8IFJUNTY2M19DQkpfU0VOU0VfQlNUMV9NQVNLLAorCQkJUlQ1NjYzX0lOQlVGX0NCSl9CU1QxX09OIHwgUlQ1NjYzX0NCSl9TRU5TRV9CU1QxX0wpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSUxfQ01EXzIsCisJCQlSVDU2NjNfUFdSX01JQ19ERVRfTUFTSywgUlQ1NjYzX1BXUl9NSUNfREVUX09OKTsKKwkJLyogQlNUMSBwb3dlciBvbiBmb3IgSkQgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1BXUl9BTkxHXzIsCisJCQlSVDU2NjhfUFdSX0JTVDFfTUFTSywgUlQ1NjY4X1BXUl9CU1QxX09OKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8xLAorCQkJUlQ1NjYzX0NCSl9ERVRfTUFTSyB8IFJUNTY2M19FWFRfSkRfTUFTSyB8CisJCQlSVDU2NjNfUE9MX0VYVF9KRF9NQVNLLCBSVDU2NjNfQ0JKX0RFVF9FTiB8CisJCQlSVDU2NjNfRVhUX0pEX0VOIHwgUlQ1NjYzX1BPTF9FWFRfSkRfRU4pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfUFdSX0FOTEdfMSwKKwkJCVJUNTY2OF9QV1JfTUJfTUFTSyB8IFJUNTY2OF9MRE8xX0RWT19NQVNLIHwKKwkJCVJUNTY2OF9BTVBfSFBfTUFTSywgUlQ1NjY4X1BXUl9NQiB8CisJCQlSVDU2NjhfTERPMV9EVk9fMF85ViB8IFJUNTY2OF9BTVBfSFBfM1gpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfQVVUT18xTVJDX0NMSywKKwkJCVJUNTY2OF9JUlFfUE9XX1NBVl9NQVNLLCBSVDU2NjhfSVJRX1BPV19TQVZfRU4pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSVJRXzEsCisJCQlSVDU2NjNfRU5fSVJRX0pEMV9NQVNLLCBSVDU2NjNfRU5fSVJRX0pEMV9FTik7CisJCXdoaWxlIChpIDwgNSkgeworCQkJbXNsZWVwKHNsZWVwX3RpbWVbaV0pOworCQkJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NjNfRU1fSkFDS19UWVBFXzIpICYKKwkJCQkweDAwMDM7CisJCQlpKys7CisJCQlpZiAodmFsID09IDB4MSB8fCB2YWwgPT0gMHgyIHx8IHZhbCA9PSAweDMpCisJCQkJYnJlYWs7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogTVgtMDBlNyB2YWw9JXggc2xlZXAgJWRcbiIsCisJCQkJX19mdW5jX18sIHZhbCwgc2xlZXBfdGltZVtpXSk7CisJCX0KKwkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXMgdmFsID0gJWRcbiIsIF9fZnVuY19fLCB2YWwpOworCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJCXJ0NTY2My0+amFja190eXBlID0gU05EX0pBQ0tfSEVBRFNFVDsKKwkJCXJ0NTY2M19lbmFibGVfcHVzaF9idXR0b25faXJxKGNvZGVjLCB0cnVlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcnQ1NjYzLT5qYWNrX3R5cGUgPSBTTkRfSkFDS19IRUFEUEhPTkU7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChydDU2NjMtPmphY2tfdHlwZSA9PSBTTkRfSkFDS19IRUFEU0VUKQorCQkJcnQ1NjYzX2VuYWJsZV9wdXNoX2J1dHRvbl9pcnEoY29kZWMsIGZhbHNlKTsKKwkJcnQ1NjYzLT5qYWNrX3R5cGUgPSAwOworCX0KKworCWRldl9kYmcoY29kZWMtPmRldiwgImphY2tfdHlwZSA9ICVkXG4iLCBydDU2NjMtPmphY2tfdHlwZSk7CisJcmV0dXJuIHJ0NTY2My0+amFja190eXBlOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19idXR0b25fZGV0ZWN0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlpbnQgYnRuX3R5cGUsIHZhbDsKKworCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjYzX0lMX0NNRF81KTsKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogdmFsPTB4JXhcbiIsIF9fZnVuY19fLCB2YWwpOworCWJ0bl90eXBlID0gdmFsICYgMHhmZmYwOworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19JTF9DTURfNSwgdmFsKTsKKworCXJldHVybiBidG5fdHlwZTsKK30KKworc3RhdGljIGlycXJldHVybl90IHJ0NTY2M19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IGRhdGE7CisKKwlkZXZfZGJnKHJ0NTY2My0+Y29kZWMtPmRldiwgIiVzIElSUSBxdWV1ZSB3b3JrXG4iLCBfX2Z1bmNfXyk7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3dxLCAmcnQ1NjYzLT5qYWNrX2RldGVjdF93b3JrLAorCQltc2Vjc190b19qaWZmaWVzKDI1MCkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpbnQgcnQ1NjYzX3NldF9qYWNrX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9zb2NfamFjayAqaHNfamFjaykKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcnQ1NjYzLT5oc19qYWNrID0gaHNfamFjazsKKworCXJ0NTY2M19pcnEoMCwgcnQ1NjYzKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocnQ1NjYzX3NldF9qYWNrX2RldGVjdCk7CisKK3N0YXRpYyBib29sIHJ0NTY2M19jaGVja19qZF9zdGF0dXMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IHZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjYzX0lOVF9TVF8xKTsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIHZhbD0leFxuIiwgX19mdW5jX18sIHZhbCk7CisKKwkvKiBKRDEgKi8KKwlzd2l0Y2ggKHJ0NTY2My0+Y29kZWNfdHlwZSkgeworCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCXJldHVybiAhKHZhbCAmIDB4MjAwMCk7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJcmV0dXJuICEodmFsICYgMHgxMDAwKTsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIENPREVDX1RZUEVcbiIpOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgcnQ1NjYzX2phY2tfZGV0ZWN0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydDU2NjNfcHJpdiwgamFja19kZXRlY3Rfd29yay53b3JrKTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydDU2NjMtPmNvZGVjOworCWludCBidG5fdHlwZSwgcmVwb3J0ID0gMDsKKworCWlmICghY29kZWMpCisJCXJldHVybjsKKworCWlmIChydDU2NjNfY2hlY2tfamRfc3RhdHVzKGNvZGVjKSkgeworCQkvKiBqYWNrIGluICovCisJCWlmIChydDU2NjMtPmphY2tfdHlwZSA9PSAwKSB7CisJCQkvKiBqYWNrIHdhcyBvdXQsIHJlcG9ydCBqYWNrIHR5cGUgKi8KKwkJCXN3aXRjaCAocnQ1NjYzLT5jb2RlY190eXBlKSB7CisJCQljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQkJCXJlcG9ydCA9IHJ0NTY2OF9qYWNrX2RldGVjdChydDU2NjMtPmNvZGVjLCAxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCQkJcmVwb3J0ID0gcnQ1NjYzX2phY2tfZGV0ZWN0KHJ0NTY2My0+Y29kZWMsIDEpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIENPREVDX1RZUEVcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogamFjayBpcyBhbHJlYWR5IGluLCByZXBvcnQgYnV0dG9uIGV2ZW50ICovCisJCQlyZXBvcnQgPSBTTkRfSkFDS19IRUFEU0VUOworCQkJYnRuX3R5cGUgPSBydDU2NjNfYnV0dG9uX2RldGVjdChydDU2NjMtPmNvZGVjKTsKKwkJCS8qKgorCQkJICogcnQ1NjYzIGNhbiByZXBvcnQgdGhyZWUga2luZHMgb2YgYnV0dG9uIGJlaGF2aW9yLAorCQkJICogb25lIGNsaWNrLCBkb3VibGUgY2xpY2sgYW5kIGhvbGQuIEhvd2V2ZXIsCisJCQkgKiBjdXJyZW50bHkgd2Ugd2lsbCByZXBvcnQgYnV0dG9uIHByZXNzZWQvcmVsZWFzZWQKKwkJCSAqIGV2ZW50LiBTbyBhbGwgdGhlIHRocmVlIGJ1dHRvbiBiZWhhdmlvcnMgYXJlCisJCQkgKiB0cmVhdGVkIGFzIGJ1dHRvbiBwcmVzc2VkLgorCQkJICovCisJCQlzd2l0Y2ggKGJ0bl90eXBlKSB7CisJCQljYXNlIDB4ODAwMDoKKwkJCWNhc2UgMHg0MDAwOgorCQkJY2FzZSAweDIwMDA6CisJCQkJcmVwb3J0IHw9IFNORF9KQUNLX0JUTl8wOworCQkJCWJyZWFrOworCQkJY2FzZSAweDEwMDA6CisJCQljYXNlIDB4MDgwMDoKKwkJCWNhc2UgMHgwNDAwOgorCQkJCXJlcG9ydCB8PSBTTkRfSkFDS19CVE5fMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMjAwOgorCQkJY2FzZSAweDAxMDA6CisJCQljYXNlIDB4MDA4MDoKKwkJCQlyZXBvcnQgfD0gU05EX0pBQ0tfQlROXzI7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDA0MDoKKwkJCWNhc2UgMHgwMDIwOgorCQkJY2FzZSAweDAwMTA6CisJCQkJcmVwb3J0IHw9IFNORF9KQUNLX0JUTl8zOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAwMDA6IC8qIHVucHJlc3NlZCAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlidG5fdHlwZSA9IDA7CisJCQkJZGV2X2VycihydDU2NjMtPmNvZGVjLT5kZXYsCisJCQkJCSJVbmV4cGVjdGVkIGJ1dHRvbiBjb2RlIDB4JTA0eFxuIiwKKwkJCQkJYnRuX3R5cGUpOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogYnV0dG9uIHJlbGVhc2Ugb3Igc3B1cmlvdXMgaW50ZXJycHV0Ki8KKwkJCWlmIChidG5fdHlwZSA9PSAwKQorCQkJCXJlcG9ydCA9ICBydDU2NjMtPmphY2tfdHlwZTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIGphY2sgb3V0ICovCisJCXN3aXRjaCAocnQ1NjYzLT5jb2RlY190eXBlKSB7CisJCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCQlyZXBvcnQgPSBydDU2NjhfamFja19kZXRlY3QocnQ1NjYzLT5jb2RlYywgMCk7CisJCQlicmVhazsKKwkJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJCXJlcG9ydCA9IHJ0NTY2M19qYWNrX2RldGVjdChydDU2NjMtPmNvZGVjLCAwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBDT0RFQ19UWVBFXG4iKTsKKwkJfQorCX0KKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlcyBqYWNrIHJlcG9ydDogMHglMDR4XG4iLCBfX2Z1bmNfXywgcmVwb3J0KTsKKwlzbmRfc29jX2phY2tfcmVwb3J0KHJ0NTY2My0+aHNfamFjaywgcmVwb3J0LCBTTkRfSkFDS19IRUFEU0VUIHwKKwkJCSAgICBTTkRfSkFDS19CVE5fMCB8IFNORF9KQUNLX0JUTl8xIHwKKwkJCSAgICBTTkRfSkFDS19CVE5fMiB8IFNORF9KQUNLX0JUTl8zKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2M19zbmRfY29udHJvbHNbXSA9IHsKKwkvKiBEQUMgRGlnaXRhbCBWb2x1bWUgKi8KKwlTT0NfRE9VQkxFX1RMVigiREFDIFBsYXliYWNrIFZvbHVtZSIsIFJUNTY2M19TVE8xX0RBQ19ESUdfVk9MLAorCQlSVDU2NjhfREFDX0wxX1ZPTF9TSElGVCArIDEsIFJUNTY2OF9EQUNfUjFfVk9MX1NISUZUICsgMSwKKwkJODcsIDAsIGRhY192b2xfdGx2KSwKKwkvKiBBREMgRGlnaXRhbCBWb2x1bWUgQ29udHJvbCAqLworCVNPQ19ET1VCTEUoIkFEQyBDYXB0dXJlIFN3aXRjaCIsIFJUNTY2M19TVE8xX0FEQ19ESUdfVk9MLAorCQlSVDU2NjhfQURDX0xfTVVURV9TSElGVCwgUlQ1NjY4X0FEQ19SX01VVEVfU0hJRlQsIDEsIDEpLAorCVNPQ19ET1VCTEVfVExWKCJBREMgQ2FwdHVyZSBWb2x1bWUiLCBSVDU2NjNfU1RPMV9BRENfRElHX1ZPTCwKKwkJUlQ1NjY4X0FEQ19MX1ZPTF9TSElGVCArIDEsIFJUNTY2OF9BRENfUl9WT0xfU0hJRlQgKyAxLAorCQk2MywgMCwgYWRjX3ZvbF90bHYpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2OF9zcGVjaWZpY19jb250cm9sc1tdID0geworCS8qIEhlYWRwaG9uZSBPdXRwdXQgVm9sdW1lICovCisJU09DX0RPVUJMRV9SX1RMVigiSGVhZHBob25lIFBsYXliYWNrIFZvbHVtZSIsIFJUNTY2M19IUF9MQ0hfRFJFLAorCQlSVDU2NjNfSFBfUkNIX0RSRSwgUlQ1NjY4X0dBSU5fSFBfU0hJRlQsIDE1LCAxLAorCQlydDU2NjhfaHBfdm9sX3RsdiksCisJLyogTWljIEJvb3N0IFZvbHVtZSAqLworCVNPQ19TSU5HTEVfVExWKCJJTjEgQ2FwdHVyZSBWb2x1bWUiLCBSVDU2NjhfQUVDX0JTVCwKKwkJUlQ1NjY4X0dBSU5fQ0JKX1NISUZULCA4LCAwLCBpbl9ic3RfdGx2KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjNfc3BlY2lmaWNfY29udHJvbHNbXSA9IHsKKwkvKiBIZWFkcGhvbmUgT3V0cHV0IFZvbHVtZSAqLworCVNPQ19ET1VCTEVfUl9UTFYoIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLCBSVDU2NjNfU1RPX0RSRV85LAorCQlSVDU2NjNfU1RPX0RSRV8xMCwgUlQ1NjYzX0RSRV9HQUlOX0hQX1NISUZULCAyMywgMSwKKwkJcnQ1NjYzX2hwX3ZvbF90bHYpLAorCS8qIE1pYyBCb29zdCBWb2x1bWUqLworCVNPQ19TSU5HTEVfVExWKCJJTjEgQ2FwdHVyZSBWb2x1bWUiLCBSVDU2NjNfQ0JKXzIsCisJCVJUNTY2M19HQUlOX0JTVDFfU0hJRlQsIDgsIDAsIGluX2JzdF90bHYpLAorCS8qIERhdGEgU3dhcCBmb3IgU2xvdDAvMSBpbiBBRENEQVQxICovCisJU09DX0VOVU0oIklGMSBBREMgRGF0YSBTd2FwIiwgcnQ1NjYzX2lmMV9hZGNfZW51bSksCit9OworCitzdGF0aWMgaW50IHJ0NTY2M19pc19zeXNfY2xrX2Zyb21fcGxsKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCisJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NjNfR0xCX0NMSyk7CisJdmFsICY9IFJUNTY2M19TQ0xLX1NSQ19NQVNLOworCWlmICh2YWwgPT0gUlQ1NjYzX1NDTEtfU1JDX1BMTDEpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX2lzX3VzaW5nX2FzcmMoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCit7CisJdW5zaWduZWQgaW50IHJlZywgc2hpZnQsIHZhbDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChydDU2NjMtPmNvZGVjX3R5cGUgPT0gQ09ERUNfVFlQRV9SVDU2NjgpIHsKKwkJc3dpdGNoICh3LT5zaGlmdCkgeworCQljYXNlIFJUNTY2OF9BRENfU1RPMV9BU1JDX1NISUZUOgorCQkJcmVnID0gUlQ1NjY4X0FTUkNfMzsKKwkJCXNoaWZ0ID0gUlQ1NjY4X0FEX1NUTzFfVFJBQ0tfU0hJRlQ7CisJCQlicmVhazsKKwkJY2FzZSBSVDU2NjhfREFDX1NUTzFfQVNSQ19TSElGVDoKKwkJCXJlZyA9IFJUNTY2M19BU1JDXzI7CisJCQlzaGlmdCA9IFJUNTY2OF9EQV9TVE8xX1RSQUNLX1NISUZUOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAody0+c2hpZnQpIHsKKwkJY2FzZSBSVDU2NjNfQURDX1NUTzFfQVNSQ19TSElGVDoKKwkJCXJlZyA9IFJUNTY2M19BU1JDXzI7CisJCQlzaGlmdCA9IFJUNTY2M19BRF9TVE8xX1RSQUNLX1NISUZUOworCQkJYnJlYWs7CisJCWNhc2UgUlQ1NjYzX0RBQ19TVE8xX0FTUkNfU0hJRlQ6CisJCQlyZWcgPSBSVDU2NjNfQVNSQ18yOworCQkJc2hpZnQgPSBSVDU2NjNfREFfU1RPMV9UUkFDS19TSElGVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwl2YWwgPSAoc25kX3NvY19yZWFkKGNvZGVjLCByZWcpID4+IHNoaWZ0KSAmIDB4NzsKKworCWlmICh2YWwpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX2kyc191c2VfYXNyYyhzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc291cmNlLAorCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzaW5rKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyhzb3VyY2UtPmRhcG0pOworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJaW50IGRhX2FzcmNfZW4sIGFkX2FzcmNfZW47CisKKwlkYV9hc3JjX2VuID0gKHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjYzX0FTUkNfMikgJgorCQlSVDU2NjNfREFfU1RPMV9UUkFDS19NQVNLKSA/IDEgOiAwOworCXN3aXRjaCAocnQ1NjYzLT5jb2RlY190eXBlKSB7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJYWRfYXNyY19lbiA9IChzbmRfc29jX3JlYWQoY29kZWMsIFJUNTY2OF9BU1JDXzMpICYKKwkJCVJUNTY2OF9BRF9TVE8xX1RSQUNLX01BU0spID8gMSA6IDA7CisJCWJyZWFrOworCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCWFkX2FzcmNfZW4gPSAoc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NjNfQVNSQ18yKSAmCisJCQlSVDU2NjNfQURfU1RPMV9UUkFDS19NQVNLKSA/IDEgOiAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbmtub3duIENPREVDX1RZUEVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoZGFfYXNyY19lbiB8fCBhZF9hc3JjX2VuKQorCQlpZiAocnQ1NjYzLT5zeXNjbGsgPiBydDU2NjMtPmxyY2sgKiAzODQpCisJCQlyZXR1cm4gMTsKKworCWRldl9lcnIoY29kZWMtPmRldiwgInN5c2NsayA8IDM4NCB4IGZzLCBkaXNhYmxlIGkycyBhc3JjXG4iKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHJ0NTY2M19zZWxfYXNyY19jbGtfc3JjIC0gc2VsZWN0IEFTUkMgY2xvY2sgc291cmNlIGZvciBhIHNldCBvZiBmaWx0ZXJzCisgKiBAY29kZWM6IFNvQyBhdWRpbyBjb2RlYyBkZXZpY2UuCisgKiBAZmlsdGVyX21hc2s6IG1hc2sgb2YgZmlsdGVycy4KKyAqIEBjbGtfc3JjOiBjbG9jayBzb3VyY2UKKyAqCisgKiBUaGUgQVNSQyBmdW5jdGlvbiBpcyBmb3IgYXN5bmNocm9ub3VzIE1DTEsgYW5kIExSQ0suIEFsc28sIHNpbmNlIFJUNTY2OCBjYW4KKyAqIG9ubHkgc3VwcG9ydCBzdGFuZGFyZCAzMmZzIG9yIDY0ZnMgaTJzIGZvcm1hdCwgQVNSQyBzaG91bGQgYmUgZW5hYmxlZCB0bworICogc3VwcG9ydCBzcGVjaWFsIGkycyBjbG9jayBmb3JtYXQgc3VjaCBhcyBJbnRlbCdzIDEwMGZzKDEwMCAqIHNhbXBsaW5nIHJhdGUpLgorICogQVNSQyBmdW5jdGlvbiB3aWxsIHRyYWNrIGkycyBjbG9jayBhbmQgZ2VuZXJhdGUgYSBjb3JyZXNwb25kaW5nIHN5c3RlbSBjbG9jaworICogZm9yIGNvZGVjLiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGFuIEFQSSB0byBzZWxlY3QgdGhlIGNsb2NrIHNvdXJjZSBmb3IgYQorICogc2V0IG9mIGZpbHRlcnMgc3BlY2lmaWVkIGJ5IHRoZSBtYXNrLiBBbmQgdGhlIGNvZGVjIGRyaXZlciB3aWxsIHR1cm4gb24gQVNSQworICogZm9yIHRoZXNlIGZpbHRlcnMgaWYgQVNSQyBpcyBzZWxlY3RlZCBhcyB0aGVpciBjbG9jayBzb3VyY2UuCisgKi8KK2ludCBydDU2NjNfc2VsX2FzcmNfY2xrX3NyYyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCXVuc2lnbmVkIGludCBmaWx0ZXJfbWFzaywgdW5zaWduZWQgaW50IGNsa19zcmMpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgYXNyYzJfbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGFzcmMyX3ZhbHVlID0gMDsKKwl1bnNpZ25lZCBpbnQgYXNyYzNfbWFzayA9IDA7CisJdW5zaWduZWQgaW50IGFzcmMzX3ZhbHVlID0gMDsKKworCXN3aXRjaCAoY2xrX3NyYykgeworCWNhc2UgUlQ1NjYzX0NMS19TRUxfU1lTOgorCWNhc2UgUlQ1NjYzX0NMS19TRUxfSTJTMV9BU1JDOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChmaWx0ZXJfbWFzayAmIFJUNTY2M19EQV9TVEVSRU9fRklMVEVSKSB7CisJCWFzcmMyX21hc2sgfD0gUlQ1NjY4X0RBX1NUTzFfVFJBQ0tfTUFTSzsKKwkJYXNyYzJfdmFsdWUgfD0gY2xrX3NyYyA8PCBSVDU2NjhfREFfU1RPMV9UUkFDS19TSElGVDsKKwl9CisKKwlpZiAoZmlsdGVyX21hc2sgJiBSVDU2NjNfQURfU1RFUkVPX0ZJTFRFUikgeworCQlzd2l0Y2ggKHJ0NTY2OC0+Y29kZWNfdHlwZSkgeworCQljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQkJYXNyYzNfbWFzayB8PSBSVDU2NjhfQURfU1RPMV9UUkFDS19NQVNLOworCQkJYXNyYzNfdmFsdWUgfD0gY2xrX3NyYyA8PCBSVDU2NjhfQURfU1RPMV9UUkFDS19TSElGVDsKKwkJCWJyZWFrOworCQljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQkJYXNyYzJfbWFzayB8PSBSVDU2NjNfQURfU1RPMV9UUkFDS19NQVNLOworCQkJYXNyYzJfdmFsdWUgfD0gY2xrX3NyYyA8PCBSVDU2NjNfQURfU1RPMV9UUkFDS19TSElGVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBDT0RFQ19UWVBFXG4iKTsKKwkJfQorCX0KKworCWlmIChhc3JjMl9tYXNrKQorCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfQVNSQ18yLCBhc3JjMl9tYXNrLAorCQkJYXNyYzJfdmFsdWUpOworCisJaWYgKGFzcmMzX21hc2spCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2OF9BU1JDXzMsIGFzcmMzX21hc2ssCisJCQlhc3JjM192YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0NTY2M19zZWxfYXNyY19jbGtfc3JjKTsKKworLyogQW5hbG9nIE1peGVyICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjY4X3JlY21peDFsW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJCU1QyIFN3aXRjaCIsIFJUNTY2OF9SRUNNSVgxTCwKKwkJUlQ1NjY4X1JFQ01JWDFMX0JTVDJfU0hJRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQlNUMSBDQkogU3dpdGNoIiwgUlQ1NjY4X1JFQ01JWDFMLAorCQlSVDU2NjhfUkVDTUlYMUxfQlNUMV9DQkpfU0hJRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2OF9yZWNtaXgxcltdID0geworCVNPQ19EQVBNX1NJTkdMRSgiQlNUMiBTd2l0Y2giLCBSVDU2NjhfUkVDTUlYMVIsCisJCVJUNTY2OF9SRUNNSVgxUl9CU1QyX1NISUZULCAxLCAxKSwKK307CisKKy8qIERpZ2l0YWwgTWl4ZXIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2NjNfc3RvMV9hZGNfbF9taXhbXSA9IHsKKwlTT0NfREFQTV9TSU5HTEUoIkFEQzEgU3dpdGNoIiwgUlQ1NjYzX1NUTzFfQURDX01JWEVSLAorCQkJUlQ1NjY4X01fU1RPMV9BRENfTDFfU0hJRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiQURDMiBTd2l0Y2giLCBSVDU2NjNfU1RPMV9BRENfTUlYRVIsCisJCQlSVDU2NjhfTV9TVE8xX0FEQ19MMl9TSElGVCwgMSwgMSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjY4X3N0bzFfYWRjX3JfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJBREMxIFN3aXRjaCIsIFJUNTY2M19TVE8xX0FEQ19NSVhFUiwKKwkJCVJUNTY2OF9NX1NUTzFfQURDX1IxX1NISUZULCAxLCAxKSwKKwlTT0NfREFQTV9TSU5HTEUoIkFEQzIgU3dpdGNoIiwgUlQ1NjYzX1NUTzFfQURDX01JWEVSLAorCQkJUlQ1NjY4X01fU1RPMV9BRENfUjJfU0hJRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2M19hZGRhX2xfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJBREMgTCBTd2l0Y2giLCBSVDU2NjNfQURfREFfTUlYRVIsCisJCQlSVDU2NjhfTV9BRENNSVhfTF9TSElGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUMgTCBTd2l0Y2giLCBSVDU2NjNfQURfREFfTUlYRVIsCisJCQlSVDU2NjhfTV9EQUMxX0xfU0hJRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2M19hZGRhX3JfbWl4W10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJBREMgUiBTd2l0Y2giLCBSVDU2NjNfQURfREFfTUlYRVIsCisJCQlSVDU2NjhfTV9BRENNSVhfUl9TSElGVCwgMSwgMSksCisJU09DX0RBUE1fU0lOR0xFKCJEQUMgUiBTd2l0Y2giLCBSVDU2NjNfQURfREFfTUlYRVIsCisJCQlSVDU2NjhfTV9EQUMxX1JfU0hJRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2M19zdG8xX2RhY19sX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiREFDIEwgU3dpdGNoIiwgUlQ1NjYzX1NUT19EQUNfTUlYRVIsCisJCQlSVDU2NjhfTV9EQUNfTDFfU1RPX0xfU0hJRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDIFIgU3dpdGNoIiwgUlQ1NjYzX1NUT19EQUNfTUlYRVIsCisJCQlSVDU2NjhfTV9EQUNfUjFfU1RPX0xfU0hJRlQsIDEsIDEpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2M19zdG8xX2RhY19yX21peFtdID0geworCVNPQ19EQVBNX1NJTkdMRSgiREFDIEwgU3dpdGNoIiwgUlQ1NjYzX1NUT19EQUNfTUlYRVIsCisJCQlSVDU2NjhfTV9EQUNfTDFfU1RPX1JfU0hJRlQsIDEsIDEpLAorCVNPQ19EQVBNX1NJTkdMRSgiREFDIFIgU3dpdGNoIiwgUlQ1NjYzX1NUT19EQUNfTUlYRVIsCisJCQlSVDU2NjhfTV9EQUNfUjFfU1RPX1JfU0hJRlQsIDEsIDEpLAorfTsKKworLyogT3V0IFN3aXRjaCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2OF9ocG9fc3dpdGNoID0KKwlTT0NfREFQTV9TSU5HTEVfQVVUT0RJU0FCTEUoIlN3aXRjaCIsIFJUNTY2OF9IUF9BTVBfMiwKKwkJUlQ1NjY4X0VOX0RBQ19IUE9fU0hJRlQsIDEsIDApOworCisvKiBTdGVyZW8gQURDIHNvdXJjZSAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBydDU2Njhfc3RvMV9hZGNfc3JjW10gPSB7CisJIkFEQyBMIiwgIkFEQyBSIgorfTsKKworc3RhdGljIFNPQ19FTlVNX1NJTkdMRV9ERUNMKHJ0NTY2OF9zdG8xX2FkY2xfZW51bSwgUlQ1NjYzX1NUTzFfQURDX01JWEVSLAorCVJUNTY2OF9TVE8xX0FEQ19MX1NSQ19TSElGVCwgcnQ1NjY4X3N0bzFfYWRjX3NyYyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBydDU2Njhfc3RvMV9hZGNsX211eCA9CisJU09DX0RBUE1fRU5VTSgiU1RPMSBBREMgTCBNdXgiLCBydDU2Njhfc3RvMV9hZGNsX2VudW0pOworCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjY4X3N0bzFfYWRjcl9lbnVtLCBSVDU2NjNfU1RPMV9BRENfTUlYRVIsCisJUlQ1NjY4X1NUTzFfQURDX1JfU1JDX1NISUZULCBydDU2Njhfc3RvMV9hZGNfc3JjKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2OF9zdG8xX2FkY3JfbXV4ID0KKwlTT0NfREFQTV9FTlVNKCJTVE8xIEFEQyBSIE11eCIsIHJ0NTY2OF9zdG8xX2FkY3JfZW51bSk7CisKKy8qIFJUNTY2MzogQW5hbG9nIERBQ0wxIGlucHV0IHNvdXJjZSAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBydDU2NjNfYWxnX2RhY2xfc3JjW10gPSB7CisJIkRBQyBMIiwgIlNUTyBEQUMgTUlYTCIKK307CisKK3N0YXRpYyBTT0NfRU5VTV9TSU5HTEVfREVDTChydDU2NjNfYWxnX2RhY2xfZW51bSwgUlQ1NjYzX0JZUEFTU19TVE9fREFDLAorCVJUNTY2M19EQUNMMV9TUkNfU0hJRlQsIHJ0NTY2M19hbGdfZGFjbF9zcmMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcnQ1NjYzX2FsZ19kYWNsX211eCA9CisJU09DX0RBUE1fRU5VTSgiREFDIEwgTXV4IiwgcnQ1NjYzX2FsZ19kYWNsX2VudW0pOworCisvKiBSVDU2NjM6IEFuYWxvZyBEQUNSMSBpbnB1dCBzb3VyY2UgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcnQ1NjYzX2FsZ19kYWNyX3NyY1tdID0geworCSJEQUMgUiIsICJTVE8gREFDIE1JWFIiCit9OworCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wocnQ1NjYzX2FsZ19kYWNyX2VudW0sIFJUNTY2M19CWVBBU1NfU1RPX0RBQywKKwlSVDU2NjNfREFDUjFfU1JDX1NISUZULCBydDU2NjNfYWxnX2RhY3Jfc3JjKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY2M19hbGdfZGFjcl9tdXggPQorCVNPQ19EQVBNX0VOVU0oIkRBQyBSIE11eCIsIHJ0NTY2M19hbGdfZGFjcl9lbnVtKTsKKworc3RhdGljIGludCBydDU2NjNfaHBfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJaWYgKHJ0NTY2My0+Y29kZWNfdHlwZSA9PSBDT0RFQ19UWVBFX1JUNTY2OCkgeworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0hQX0NIQVJHRV9QVU1QXzEsCisJCQkJUlQ1NjY4X1NFTF9QTV9IUF9TSElGVCwgUlQ1NjY4X1NFTF9QTV9IUF9ISUdIKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19IUF9MT0dJQ18yLAorCQkJCVJUNTY2OF9IUF9TSUdfU1JDMV9NQVNLLAorCQkJCVJUNTY2OF9IUF9TSUdfU1JDMV9TSUxFTkNFKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19ERVBPUF8yLCAweDMwMDMpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0RFUE9QXzEsIDB4MDAwYiwKKwkJCQkweDAwMGIpOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0RFUE9QXzEsIDB4MDAzMCwKKwkJCQkweDAwMzApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0hQX0NIQVJHRV9QVU1QXzEsCisJCQkJUlQ1NjY4X09WQ0RfSFBfTUFTSywgUlQ1NjY4X09WQ0RfSFBfRElTKTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19IUF9DSEFSR0VfUFVNUF8yLCAweDEzNzEpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX0hQX0JJQVMsIDB4YWJiYSk7CisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfQ0hBUkdFX1BVTVBfMSwgMHgyMjI0KTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19BTkFfQklBU19DVVJfMSwgMHg3NzY2KTsKKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19IUF9CSUFTLCAweGFmYWEpOworCQkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX0NIQVJHRV9QVU1QXzIsIDB4Nzc3Nyk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfREVQT1BfMSwgMHgzMDAwLAorCQkJCTB4MzAwMCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1EOgorCQlpZiAocnQ1NjYzLT5jb2RlY190eXBlID09IENPREVDX1RZUEVfUlQ1NjY4KSB7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSFBfTE9HSUNfMiwKKwkJCQlSVDU2NjhfSFBfU0lHX1NSQzFfTUFTSywKKwkJCQlSVDU2NjhfSFBfU0lHX1NSQzFfUkVHKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19ERVBPUF8xLCAweDMwMDAsIDB4MCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfSFBfQ0hBUkdFX1BVTVBfMSwKKwkJCQlSVDU2NjhfT1ZDRF9IUF9NQVNLLCBSVDU2NjhfT1ZDRF9IUF9FTik7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NjNfREVQT1BfMSwgMHgwMDMwLCAweDApOworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0RFUE9QXzEsIDB4MDAwYiwKKwkJCQkweDAwMGIpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjY4X2JzdDJfcG93ZXIoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBTTkRfU09DX0RBUE1fUE9TVF9QTVU6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19QV1JfQU5MR18yLAorCQkJUlQ1NjY4X1BXUl9CU1QyX01BU0sgfCBSVDU2NjhfUFdSX0JTVDJfT1BfTUFTSywKKwkJCVJUNTY2OF9QV1JfQlNUMiB8IFJUNTY2OF9QV1JfQlNUMl9PUCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNRDoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1BXUl9BTkxHXzIsCisJCQlSVDU2NjhfUFdSX0JTVDJfTUFTSyB8IFJUNTY2OF9QV1JfQlNUMl9PUF9NQVNLLCAwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfcHJlX2Rpdl9wb3dlcihzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyh3LT5kYXBtKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX1BSRV9ESVZfR0FUSU5HXzEsIDB4ZmYwMCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19QUkVfRElWX0dBVElOR18yLCAweGZmZmMpOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19QUkVfRElWX0dBVElOR18xLCAweDAwMDApOworCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NjNfUFJFX0RJVl9HQVRJTkdfMiwgMHgwMDAwKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHJ0NTY2M19kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJQTEwiLCBSVDU2NjNfUFdSX0FOTEdfMywgUlQ1NjY4X1BXUl9QTExfU0hJRlQsIDAsCisJCU5VTEwsIDApLAorCisJLyogbWljYmlhcyAqLworCVNORF9TT0NfREFQTV9NSUNCSUFTKCJNSUNCSUFTMSIsIFJUNTY2M19QV1JfQU5MR18yLAorCQlSVDU2NjhfUFdSX01CMV9TSElGVCwgMCksCisJU05EX1NPQ19EQVBNX01JQ0JJQVMoIk1JQ0JJQVMyIiwgUlQ1NjYzX1BXUl9BTkxHXzIsCisJCVJUNTY2OF9QV1JfTUIyX1NISUZULCAwKSwKKworCS8qIElucHV0IExpbmVzICovCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjFQIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjFOIiksCisKKwkvKiBSRUMgTWl4ZXIgUG93ZXIgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJSRUNNSVgxTCBQb3dlciIsIFJUNTY2M19QV1JfQU5MR18yLAorCQlSVDU2NjhfUFdSX1JFQ01JWDFfU0hJRlQsIDAsIE5VTEwsIDApLAorCisJLyogQURDcyAqLworCVNORF9TT0NfREFQTV9BREMoIkFEQyBMIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBREMgTCBQb3dlciIsIFJUNTY2M19QV1JfRElHXzEsCisJCVJUNTY2OF9QV1JfQURDX0wxX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBREMgQ2xvY2siLCBSVDU2NjNfQ0hPUF9BREMsCisJCVJUNTY2OF9DS0dFTl9BRENDX1NISUZULCAwLCBOVUxMLCAwKSwKKworCS8qIEFEQyBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiU1RPMSBBREMgTUlYTCIsIFNORF9TT0NfTk9QTSwKKwkJMCwgMCwgcnQ1NjYzX3N0bzFfYWRjX2xfbWl4LAorCQlBUlJBWV9TSVpFKHJ0NTY2M19zdG8xX2FkY19sX21peCkpLAorCisJLyogQURDIEZpbHRlciBQb3dlciAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIlNUTzEgQURDIEZpbHRlciIsIFJUNTY2M19QV1JfRElHXzIsCisJCVJUNTY2OF9QV1JfQURDX1MxRl9TSElGVCwgMCwgTlVMTCwgMCksCisKKwkvKiBEaWdpdGFsIEludGVyZmFjZSAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIkkyUyIsIFJUNTY2M19QV1JfRElHXzEsIFJUNTY2OF9QV1JfSTJTMV9TSElGVCwgMCwKKwkJTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiSUYgREFDIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJJRjEgREFDMSBMIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJJRjEgREFDMSBSIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJJRjEgQURDMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiSUYgQURDIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKworCS8qIEF1ZGlvIEludGVyZmFjZSAqLworCVNORF9TT0NfREFQTV9BSUZfSU4oIkFJRlJYIiwgIkFJRiBQbGF5YmFjayIsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIkFJRlRYIiwgIkFJRiBDYXB0dXJlIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCS8qIERBQyBtaXhlciBiZWZvcmUgc291bmQgZWZmZWN0ICAqLworCVNORF9TT0NfREFQTV9NSVhFUigiQUREQSBNSVhMIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBydDU2NjNfYWRkYV9sX21peCwKKwkJQVJSQVlfU0laRShydDU2NjNfYWRkYV9sX21peCkpLAorCVNORF9TT0NfREFQTV9NSVhFUigiQUREQSBNSVhSIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBydDU2NjNfYWRkYV9yX21peCwKKwkJQVJSQVlfU0laRShydDU2NjNfYWRkYV9yX21peCkpLAorCVNORF9TT0NfREFQTV9QR0EoIkRBQyBMMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiREFDIFIxIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKworCS8qIERBQyBNaXhlciAqLworCVNORF9TT0NfREFQTV9TVVBQTFkoIlNUTzEgREFDIEZpbHRlciIsIFJUNTY2M19QV1JfRElHXzIsCisJCVJUNTY2OF9QV1JfREFDX1MxRl9TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTVE8xIERBQyBNSVhMIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlydDU2NjNfc3RvMV9kYWNfbF9taXgsIEFSUkFZX1NJWkUocnQ1NjYzX3N0bzFfZGFjX2xfbWl4KSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJTVE8xIERBQyBNSVhSIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlydDU2NjNfc3RvMV9kYWNfcl9taXgsIEFSUkFZX1NJWkUocnQ1NjYzX3N0bzFfZGFjX3JfbWl4KSksCisKKwkvKiBEQUNzICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiU1RPMSBEQUMgTCBQb3dlciIsIFJUNTY2M19QV1JfRElHXzEsCisJCVJUNTY2OF9QV1JfREFDX0wxX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJTVE8xIERBQyBSIFBvd2VyIiwgUlQ1NjYzX1BXUl9ESUdfMSwKKwkJUlQ1NjY4X1BXUl9EQUNfUjFfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkRBQyBMIiwgTlVMTCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fREFDKCJEQUMgUiIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCksCisKKwkvKiBIZWFkcGhvbmUqLworCVNORF9TT0NfREFQTV9QR0FfUygiSFAgQW1wIiwgMSwgU05EX1NPQ19OT1BNLCAwLCAwLCBydDU2NjNfaHBfZXZlbnQsCisJCVNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VKSwKKworCS8qIE91dHB1dCBMaW5lcyAqLworCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQT0wiKSwKKwlTTkRfU09DX0RBUE1fT1VUUFVUKCJIUE9SIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgcnQ1NjY4X3NwZWNpZmljX2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9TVVBQTFkoIkxETzIiLCBSVDU2NjNfUFdSX0FOTEdfMywKKwkJUlQ1NjY4X1BXUl9MRE8yX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJNaWMgRGV0IFBvd2VyIiwgUlQ1NjY4X1BXUl9WT0wsCisJCVJUNTY2OF9QV1JfTUlDX0RFVF9TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTERPIERBQyIsIFJUNTY2M19QV1JfRElHXzEsCisJCVJUNTY2OF9QV1JfTERPX0RBQ1JFRl9TSElGVCwgMCwgTlVMTCwgMCksCisKKwkvKiBBU1JDICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiSTJTIEFTUkMiLCBSVDU2NjNfQVNSQ18xLAorCQlSVDU2NjhfSTJTMV9BU1JDX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJEQUMgQVNSQyIsIFJUNTY2M19BU1JDXzEsCisJCVJUNTY2OF9EQUNfU1RPMV9BU1JDX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBREMgQVNSQyIsIFJUNTY2M19BU1JDXzEsCisJCVJUNTY2OF9BRENfU1RPMV9BU1JDX1NISUZULCAwLCBOVUxMLCAwKSwKKworCS8qIElucHV0IExpbmVzICovCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjJQIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJJTjJOIiksCisKKwkvKiBCb29zdCAqLworCVNORF9TT0NfREFQTV9QR0EoIkJTVDEgQ0JKIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJDQkogUG93ZXIiLCBSVDU2NjNfUFdSX0FOTEdfMywKKwkJUlQ1NjY4X1BXUl9DQkpfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIkJTVDIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIkJTVDIgUG93ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCXJ0NTY2OF9ic3QyX3Bvd2VyLCBTTkRfU09DX0RBUE1fUFJFX1BNRCB8CisJCVNORF9TT0NfREFQTV9QT1NUX1BNVSksCisKKwkvKiBSRUMgTWl4ZXIgKi8KKwlTTkRfU09DX0RBUE1fTUlYRVIoIlJFQ01JWDFMIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBydDU2NjhfcmVjbWl4MWwsCisJCUFSUkFZX1NJWkUocnQ1NjY4X3JlY21peDFsKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJSRUNNSVgxUiIsIFNORF9TT0NfTk9QTSwgMCwgMCwgcnQ1NjY4X3JlY21peDFyLAorCQlBUlJBWV9TSVpFKHJ0NTY2OF9yZWNtaXgxcikpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlJFQ01JWDFSIFBvd2VyIiwgUlQ1NjYzX1BXUl9BTkxHXzIsCisJCVJUNTY2OF9QV1JfUkVDTUlYMl9TSElGVCwgMCwgTlVMTCwgMCksCisKKwkvKiBBREMgKi8KKwlTTkRfU09DX0RBUE1fQURDKCJBREMgUiIsIE5VTEwsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiQURDIFIgUG93ZXIiLCBSVDU2NjNfUFdSX0RJR18xLAorCQlSVDU2NjhfUFdSX0FEQ19SMV9TSElGVCwgMCwgTlVMTCwgMCksCisKKwkvKiBBREMgTXV4ICovCisJU05EX1NPQ19EQVBNX1BHQSgiU1RPMSBBREMgTDEiLCBSVDU2NjNfU1RPMV9BRENfTUlYRVIsCisJCVJUNTY2OF9TVE8xX0FEQ19MMV9TUkNfU0hJRlQsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIlNUTzEgQURDIFIxIiwgUlQ1NjYzX1NUTzFfQURDX01JWEVSLAorCQlSVDU2NjhfU1RPMV9BRENfUjFfU1JDX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fUEdBKCJTVE8xIEFEQyBMMiIsIFJUNTY2M19TVE8xX0FEQ19NSVhFUiwKKwkJUlQ1NjY4X1NUTzFfQURDX0wyX1NSQ19TSElGVCwgMSwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX1BHQSgiU1RPMSBBREMgUjIiLCBSVDU2NjNfU1RPMV9BRENfTUlYRVIsCisJCVJUNTY2OF9TVE8xX0FEQ19SMl9TUkNfU0hJRlQsIDEsIE5VTEwsIDApLAorCisJU05EX1NPQ19EQVBNX01VWCgiU1RPMSBBREMgTCBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZydDU2Njhfc3RvMV9hZGNsX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiU1RPMSBBREMgUiBNdXgiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZydDU2Njhfc3RvMV9hZGNyX211eCksCisKKwkvKiBBREMgTWl4ICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJTVE8xIEFEQyBNSVhSIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlydDU2Njhfc3RvMV9hZGNfcl9taXgsIEFSUkFZX1NJWkUocnQ1NjY4X3N0bzFfYWRjX3JfbWl4KSksCisKKwkvKiBBbmFsb2cgREFDIENsb2NrICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiREFDIENsb2NrIiwgUlQ1NjYzX0NIT1BfREFDX0wsCisJCVJUNTY2OF9DS0dFTl9EQUMxX1NISUZULCAwLCBOVUxMLCAwKSwKKworCS8qIEhlYWRwaG9uZSBvdXQgKi8KKwlTTkRfU09DX0RBUE1fU1dJVENIKCJIUE8gUGxheWJhY2siLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCSZydDU2NjhfaHBvX3N3aXRjaCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgcnQ1NjYzX3NwZWNpZmljX2RhcG1fd2lkZ2V0c1tdID0geworCS8qIFN5c3RlbSBDbG9jayBQcmUgRGl2aWRlciBHYXRpbmcgKi8KKwlTTkRfU09DX0RBUE1fU1VQUExZKCJQcmUgRGl2IFBvd2VyIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQlydDU2NjNfcHJlX2Rpdl9wb3dlciwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCisJLyogTERPICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTERPIEFEQyIsIFJUNTY2M19QV1JfRElHXzEsCisJCVJUNTY2OF9QV1JfTERPX0RBQ1JFRl9TSElGVCwgMCwgTlVMTCwgMCksCisKKwkvKiBBU1JDICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiSTJTIEFTUkMiLCBSVDU2NjNfQVNSQ18xLAorCQlSVDU2NjNfSTJTMV9BU1JDX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJEQUMgQVNSQyIsIFJUNTY2M19BU1JDXzEsCisJCVJUNTY2M19EQUNfU1RPMV9BU1JDX1NISUZULCAwLCBOVUxMLCAwKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJBREMgQVNSQyIsIFJUNTY2M19BU1JDXzEsCisJCVJUNTY2M19BRENfU1RPMV9BU1JDX1NISUZULCAwLCBOVUxMLCAwKSwKKworCS8qIEJvb3N0ICovCisJU05EX1NPQ19EQVBNX1BHQSgiQlNUMSIsIFNORF9TT0NfTk9QTSwgMCwgMCwgTlVMTCwgMCksCisKKwkvKiBTVE8gQURDICovCisJU05EX1NPQ19EQVBNX1BHQSgiU1RPMSBBREMgTDEiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAorCVNORF9TT0NfREFQTV9QR0EoIlNUTzEgQURDIEwyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKKworCS8qIEFuYWxvZyBEQUMgc291cmNlICovCisJU05EX1NPQ19EQVBNX01VWCgiREFDIEwgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmcnQ1NjYzX2FsZ19kYWNsX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiREFDIFIgTXV4IiwgU05EX1NPQ19OT1BNLCAwLCAwLCAmcnQ1NjYzX2FsZ19kYWNyX211eCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBydDU2NjNfZGFwbV9yb3V0ZXNbXSA9IHsKKwkvKiBQTEwgKi8KKwl7ICJJMlMiLCBOVUxMLCAiUExMIiwgcnQ1NjYzX2lzX3N5c19jbGtfZnJvbV9wbGwgfSwKKworCS8qIEFTUkMgKi8KKwl7ICJTVE8xIEFEQyBGaWx0ZXIiLCBOVUxMLCAiQURDIEFTUkMiLCBydDU2NjNfaXNfdXNpbmdfYXNyYyB9LAorCXsgIlNUTzEgREFDIEZpbHRlciIsIE5VTEwsICJEQUMgQVNSQyIsIHJ0NTY2M19pc191c2luZ19hc3JjIH0sCisJeyAiSTJTIiwgTlVMTCwgIkkyUyBBU1JDIiwgcnQ1NjYzX2kyc191c2VfYXNyYyB9LAorCisJeyAiQURDIEwiLCBOVUxMLCAiQURDIEwgUG93ZXIiIH0sCisJeyAiQURDIEwiLCBOVUxMLCAiQURDIENsb2NrIiB9LAorCisJeyAiU1RPMSBBREMgTDIiLCBOVUxMLCAiU1RPMSBEQUMgTUlYTCIgfSwKKworCXsgIlNUTzEgQURDIE1JWEwiLCAiQURDMSBTd2l0Y2giLCAiU1RPMSBBREMgTDEiIH0sCisJeyAiU1RPMSBBREMgTUlYTCIsICJBREMyIFN3aXRjaCIsICJTVE8xIEFEQyBMMiIgfSwKKwl7ICJTVE8xIEFEQyBNSVhMIiwgTlVMTCwgIlNUTzEgQURDIEZpbHRlciIgfSwKKworCXsgIklGMSBBREMxIiwgTlVMTCwgIlNUTzEgQURDIE1JWEwiIH0sCisJeyAiSUYgQURDIiwgTlVMTCwgIklGMSBBREMxIiB9LAorCXsgIkFJRlRYIiwgTlVMTCwgIklGIEFEQyIgfSwKKwl7ICJBSUZUWCIsIE5VTEwsICJJMlMiIH0sCisKKwl7ICJBSUZSWCIsIE5VTEwsICJJMlMiIH0sCisJeyAiSUYgREFDIiwgTlVMTCwgIkFJRlJYIiB9LAorCXsgIklGMSBEQUMxIEwiLCBOVUxMLCAiSUYgREFDIiB9LAorCXsgIklGMSBEQUMxIFIiLCBOVUxMLCAiSUYgREFDIiB9LAorCisJeyAiQUREQSBNSVhMIiwgIkFEQyBMIFN3aXRjaCIsICJTVE8xIEFEQyBNSVhMIiB9LAorCXsgIkFEREEgTUlYTCIsICJEQUMgTCBTd2l0Y2giLCAiSUYxIERBQzEgTCIgfSwKKwl7ICJBRERBIE1JWEwiLCBOVUxMLCAiU1RPMSBEQUMgRmlsdGVyIiB9LAorCXsgIkFEREEgTUlYTCIsIE5VTEwsICJTVE8xIERBQyBMIFBvd2VyIiB9LAorCXsgIkFEREEgTUlYUiIsICJEQUMgUiBTd2l0Y2giLCAiSUYxIERBQzEgUiIgfSwKKwl7ICJBRERBIE1JWFIiLCBOVUxMLCAiU1RPMSBEQUMgRmlsdGVyIiB9LAorCXsgIkFEREEgTUlYUiIsIE5VTEwsICJTVE8xIERBQyBSIFBvd2VyIiB9LAorCisJeyAiREFDIEwxIiwgTlVMTCwgIkFEREEgTUlYTCIgfSwKKwl7ICJEQUMgUjEiLCBOVUxMLCAiQUREQSBNSVhSIiB9LAorCisJeyAiU1RPMSBEQUMgTUlYTCIsICJEQUMgTCBTd2l0Y2giLCAiREFDIEwxIiB9LAorCXsgIlNUTzEgREFDIE1JWEwiLCAiREFDIFIgU3dpdGNoIiwgIkRBQyBSMSIgfSwKKwl7ICJTVE8xIERBQyBNSVhMIiwgTlVMTCwgIlNUTzEgREFDIEwgUG93ZXIiIH0sCisJeyAiU1RPMSBEQUMgTUlYTCIsIE5VTEwsICJTVE8xIERBQyBGaWx0ZXIiIH0sCisJeyAiU1RPMSBEQUMgTUlYUiIsICJEQUMgUiBTd2l0Y2giLCAiREFDIFIxIiB9LAorCXsgIlNUTzEgREFDIE1JWFIiLCAiREFDIEwgU3dpdGNoIiwgIkRBQyBMMSIgfSwKKwl7ICJTVE8xIERBQyBNSVhSIiwgTlVMTCwgIlNUTzEgREFDIFIgUG93ZXIiIH0sCisJeyAiU1RPMSBEQUMgTUlYUiIsIE5VTEwsICJTVE8xIERBQyBGaWx0ZXIiIH0sCisKKwl7ICJIUCBBbXAiLCBOVUxMLCAiREFDIEwiIH0sCisJeyAiSFAgQW1wIiwgTlVMTCwgIkRBQyBSIiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgcnQ1NjY4X3NwZWNpZmljX2RhcG1fcm91dGVzW10gPSB7CisJeyAiTUlDQklBUzEiLCBOVUxMLCAiTERPMiIgfSwKKwl7ICJNSUNCSUFTMiIsIE5VTEwsICJMRE8yIiB9LAorCisJeyAiQlNUMSBDQkoiLCBOVUxMLCAiSU4xUCIgfSwKKwl7ICJCU1QxIENCSiIsIE5VTEwsICJJTjFOIiB9LAorCXsgIkJTVDEgQ0JKIiwgTlVMTCwgIkNCSiBQb3dlciIgfSwKKworCXsgIkJTVDIiLCBOVUxMLCAiSU4yUCIgfSwKKwl7ICJCU1QyIiwgTlVMTCwgIklOMk4iIH0sCisJeyAiQlNUMiIsIE5VTEwsICJCU1QyIFBvd2VyIiB9LAorCisJeyAiUkVDTUlYMUwiLCAiQlNUMiBTd2l0Y2giLCAiQlNUMiIgfSwKKwl7ICJSRUNNSVgxTCIsICJCU1QxIENCSiBTd2l0Y2giLCAiQlNUMSBDQkoiIH0sCisJeyAiUkVDTUlYMUwiLCBOVUxMLCAiUkVDTUlYMUwgUG93ZXIiIH0sCisJeyAiUkVDTUlYMVIiLCAiQlNUMiBTd2l0Y2giLCAiQlNUMiIgfSwKKwl7ICJSRUNNSVgxUiIsIE5VTEwsICJSRUNNSVgxUiBQb3dlciIgfSwKKworCXsgIkFEQyBMIiwgTlVMTCwgIlJFQ01JWDFMIiB9LAorCXsgIkFEQyBSIiwgTlVMTCwgIlJFQ01JWDFSIiB9LAorCXsgIkFEQyBSIiwgTlVMTCwgIkFEQyBSIFBvd2VyIiB9LAorCXsgIkFEQyBSIiwgTlVMTCwgIkFEQyBDbG9jayIgfSwKKworCXsgIlNUTzEgQURDIEwgTXV4IiwgIkFEQyBMIiwgIkFEQyBMIiB9LAorCXsgIlNUTzEgQURDIEwgTXV4IiwgIkFEQyBSIiwgIkFEQyBSIiB9LAorCXsgIlNUTzEgQURDIEwxIiwgTlVMTCwgIlNUTzEgQURDIEwgTXV4IiB9LAorCisJeyAiU1RPMSBBREMgUiBNdXgiLCAiQURDIEwiLCAiQURDIEwiIH0sCisJeyAiU1RPMSBBREMgUiBNdXgiLCAiQURDIFIiLCAiQURDIFIiIH0sCisJeyAiU1RPMSBBREMgUjEiLCBOVUxMLCAiU1RPMSBBREMgUiBNdXgiIH0sCisJeyAiU1RPMSBBREMgUjIiLCBOVUxMLCAiU1RPMSBEQUMgTUlYUiIgfSwKKworCXsgIlNUTzEgQURDIE1JWFIiLCAiQURDMSBTd2l0Y2giLCAiU1RPMSBBREMgUjEiIH0sCisJeyAiU1RPMSBBREMgTUlYUiIsICJBREMyIFN3aXRjaCIsICJTVE8xIEFEQyBSMiIgfSwKKwl7ICJTVE8xIEFEQyBNSVhSIiwgTlVMTCwgIlNUTzEgQURDIEZpbHRlciIgfSwKKworCXsgIklGMSBBREMxIiwgTlVMTCwgIlNUTzEgQURDIE1JWFIiIH0sCisKKwl7ICJBRERBIE1JWFIiLCAiQURDIFIgU3dpdGNoIiwgIlNUTzEgQURDIE1JWFIiIH0sCisKKwl7ICJEQUMgTCIsIE5VTEwsICJTVE8xIERBQyBNSVhMIiB9LAorCXsgIkRBQyBMIiwgTlVMTCwgIkxETyBEQUMiIH0sCisJeyAiREFDIEwiLCBOVUxMLCAiREFDIENsb2NrIiB9LAorCXsgIkRBQyBSIiwgTlVMTCwgIlNUTzEgREFDIE1JWFIiIH0sCisJeyAiREFDIFIiLCBOVUxMLCAiTERPIERBQyIgfSwKKwl7ICJEQUMgUiIsIE5VTEwsICJEQUMgQ2xvY2siIH0sCisKKwl7ICJIUE8gUGxheWJhY2siLCAiU3dpdGNoIiwgIkhQIEFtcCIgfSwKKwl7ICJIUE9MIiwgTlVMTCwgIkhQTyBQbGF5YmFjayIgfSwKKwl7ICJIUE9SIiwgTlVMTCwgIkhQTyBQbGF5YmFjayIgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHJ0NTY2M19zcGVjaWZpY19kYXBtX3JvdXRlc1tdID0geworCXsgIkkyUyIsIE5VTEwsICJQcmUgRGl2IFBvd2VyIiB9LAorCisJeyAiQlNUMSIsIE5VTEwsICJJTjFQIiB9LAorCXsgIkJTVDEiLCBOVUxMLCAiSU4xTiIgfSwKKwl7ICJCU1QxIiwgTlVMTCwgIlJFQ01JWDFMIFBvd2VyIiB9LAorCisJeyAiQURDIEwiLCBOVUxMLCAiQlNUMSIgfSwKKworCXsgIlNUTzEgQURDIEwxIiwgTlVMTCwgIkFEQyBMIiB9LAorCisJeyAiREFDIEwgTXV4IiwgIkRBQyBMIiwgICJEQUMgTDEiIH0sCisJeyAiREFDIEwgTXV4IiwgIlNUTyBEQUMgTUlYTCIsICJTVE8xIERBQyBNSVhMIiB9LAorCXsgIkRBQyBSIE11eCIsICJEQUMgUiIsICAiREFDIFIxIn0sCisJeyAiREFDIFIgTXV4IiwgIlNUTyBEQUMgTUlYUiIsICJTVE8xIERBQyBNSVhSIiB9LAorCisJeyAiREFDIEwiLCBOVUxMLCAiREFDIEwgTXV4IiB9LAorCXsgIkRBQyBSIiwgTlVMTCwgIkRBQyBSIE11eCIgfSwKKworCXsgIkhQT0wiLCBOVUxMLCAiSFAgQW1wIiB9LAorCXsgIkhQT1IiLCBOVUxMLCAiSFAgQW1wIiB9LAorfTsKKworc3RhdGljIGludCBydDU2NjNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHZhbF9sZW4gPSAwOworCWludCBwcmVfZGl2OworCisJcnQ1NjYzLT5scmNrID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKworCWRldl9kYmcoZGFpLT5kZXYsICJiY2xrIGlzICVkSHogYW5kIHN5c2NsayBpcyAlZEh6XG4iLAorCQlydDU2NjMtPmxyY2ssIHJ0NTY2My0+c3lzY2xrKTsKKworCXByZV9kaXYgPSBybDYyMzFfZ2V0X2Nsa19pbmZvKHJ0NTY2My0+c3lzY2xrLCBydDU2NjMtPmxyY2spOworCWlmIChwcmVfZGl2IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbnN1cHBvcnRlZCBjbG9jayBzZXR0aW5nICVkIGZvciBEQUkgJWRcbiIsCisJCQlydDU2NjMtPmxyY2ssIGRhaS0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKGRhaS0+ZGV2LCAicHJlX2RpdiBpcyAlZCBmb3IgaWlzICVkXG4iLCBwcmVfZGl2LCBkYWktPmlkKTsKKworCXN3aXRjaCAocGFyYW1zX3dpZHRoKHBhcmFtcykpIHsKKwljYXNlIDg6CisJCXZhbF9sZW4gPSBSVDU2NjhfSTJTX0RMXzg7CisJCWJyZWFrOworCWNhc2UgMTY6CisJCXZhbF9sZW4gPSBSVDU2NjhfSTJTX0RMXzE2OworCQlicmVhazsKKwljYXNlIDIwOgorCQl2YWxfbGVuID0gUlQ1NjY4X0kyU19ETF8yMDsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJdmFsX2xlbiA9IFJUNTY2OF9JMlNfRExfMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JMlMxX1NEUCwKKwkJUlQ1NjY4X0kyU19ETF9NQVNLLCB2YWxfbGVuKTsKKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19BRERBX0NMS18xLAorCQlSVDU2NjhfSTJTX1BEMV9NQVNLLCBwcmVfZGl2IDw8IFJUNTY2OF9JMlNfUEQxX1NISUZUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19zZXRfZGFpX2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXVuc2lnbmVkIGludCByZWdfdmFsID0gMDsKKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzoKKwkJcmVnX3ZhbCB8PSBSVDU2NjhfSTJTX01TX1M7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfSU5WX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX05CX05GOgorCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0lCX05GOgorCQlyZWdfdmFsIHw9IFJUNTY2OF9JMlNfQlBfSU5WOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGZtdCAmIFNORF9TT0NfREFJRk1UX0ZPUk1BVF9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9JMlM6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTEVGVF9KOgorCQlyZWdfdmFsIHw9IFJUNTY2OF9JMlNfREZfTEVGVDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9EU1BfQToKKwkJcmVnX3ZhbCB8PSBSVDU2NjhfSTJTX0RGX1BDTV9BOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0RTUF9COgorCQlyZWdfdmFsIHw9IFJUNTY2OF9JMlNfREZfUENNX0I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19JMlMxX1NEUCwgUlQ1NjY4X0kyU19NU19NQVNLIHwKKwkJUlQ1NjY4X0kyU19CUF9NQVNLIHwgUlQ1NjY4X0kyU19ERl9NQVNLLCByZWdfdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19zZXRfZGFpX3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IGNsa19pZCwKKwl1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHJlZ192YWwgPSAwOworCisJaWYgKGZyZXEgPT0gcnQ1NjYzLT5zeXNjbGsgJiYgY2xrX2lkID09IHJ0NTY2My0+c3lzY2xrX3NyYykKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGNsa19pZCkgeworCWNhc2UgUlQ1NjYzX1NDTEtfU19NQ0xLOgorCQlyZWdfdmFsIHw9IFJUNTY2M19TQ0xLX1NSQ19NQ0xLOworCQlicmVhazsKKwljYXNlIFJUNTY2M19TQ0xLX1NfUExMMToKKwkJcmVnX3ZhbCB8PSBSVDU2NjNfU0NMS19TUkNfUExMMTsKKwkJYnJlYWs7CisJY2FzZSBSVDU2NjNfU0NMS19TX1JDQ0xLOgorCQlyZWdfdmFsIHw9IFJUNTY2M19TQ0xLX1NSQ19SQ0NMSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCBjbG9jayBpZCAoJWQpXG4iLCBjbGtfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0dMQl9DTEssIFJUNTY2OF9TQ0xLX1NSQ19NQVNLLAorCQlyZWdfdmFsKTsKKwlydDU2NjMtPnN5c2NsayA9IGZyZXE7CisJcnQ1NjYzLT5zeXNjbGtfc3JjID0gY2xrX2lkOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiU3lzY2xrIGlzICVkSHogYW5kIGNsb2NrIGlkIGlzICVkXG4iLAorCQlmcmVxLCBjbGtfaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX3NldF9kYWlfcGxsKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgcGxsX2lkLCBpbnQgc291cmNlLAorCQkJdW5zaWduZWQgaW50IGZyZXFfaW4sIHVuc2lnbmVkIGludCBmcmVxX291dCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHJsNjIzMV9wbGxfY29kZSBwbGxfY29kZTsKKwlpbnQgcmV0OworCWludCBtYXNrLCBzaGlmdCwgdmFsOworCisJaWYgKHNvdXJjZSA9PSBydDU2NjMtPnBsbF9zcmMgJiYgZnJlcV9pbiA9PSBydDU2NjMtPnBsbF9pbiAmJgorCSAgICBmcmVxX291dCA9PSBydDU2NjMtPnBsbF9vdXQpCisJCXJldHVybiAwOworCisJaWYgKCFmcmVxX2luIHx8ICFmcmVxX291dCkgeworCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJQTEwgZGlzYWJsZWRcbiIpOworCisJCXJ0NTY2My0+cGxsX2luID0gMDsKKwkJcnQ1NjYzLT5wbGxfb3V0ID0gMDsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0dMQl9DTEssCisJCQlSVDU2NjNfU0NMS19TUkNfTUFTSywgUlQ1NjYzX1NDTEtfU1JDX01DTEspOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKHJ0NTY2My0+Y29kZWNfdHlwZSkgeworCWNhc2UgQ09ERUNfVFlQRV9SVDU2Njg6CisJCW1hc2sgPSBSVDU2NjhfUExMMV9TUkNfTUFTSzsKKwkJc2hpZnQgPSBSVDU2NjhfUExMMV9TUkNfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCW1hc2sgPSBSVDU2NjNfUExMMV9TUkNfTUFTSzsKKwkJc2hpZnQgPSBSVDU2NjNfUExMMV9TUkNfU0hJRlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gQ09ERUNfVFlQRVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoc291cmNlKSB7CisJY2FzZSBSVDU2NjNfUExMMV9TX01DTEs6CisJCXZhbCA9IDB4MDsKKwkJYnJlYWs7CisJY2FzZSBSVDU2NjNfUExMMV9TX0JDTEsxOgorCQl2YWwgPSAweDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoY29kZWMtPmRldiwgIlVua25vd24gUExMIHNvdXJjZSAlZFxuIiwgc291cmNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19HTEJfQ0xLLCBtYXNrLCAodmFsIDw8IHNoaWZ0KSk7CisKKwlyZXQgPSBybDYyMzFfcGxsX2NhbGMoZnJlcV9pbiwgZnJlcV9vdXQsICZwbGxfY29kZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5zdXBwb3J0IGlucHV0IGNsb2NrICVkXG4iLCBmcmVxX2luKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfZGJnKGNvZGVjLT5kZXYsICJieXBhc3M9JWQgbT0lZCBuPSVkIGs9JWRcbiIsIHBsbF9jb2RlLm1fYnAsCisJCShwbGxfY29kZS5tX2JwID8gMCA6IHBsbF9jb2RlLm1fY29kZSksIHBsbF9jb2RlLm5fY29kZSwKKwkJcGxsX2NvZGUua19jb2RlKTsKKworCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY2M19QTExfMSwKKwkJcGxsX2NvZGUubl9jb2RlIDw8IFJUNTY2OF9QTExfTl9TSElGVCB8IHBsbF9jb2RlLmtfY29kZSk7CisJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjYzX1BMTF8yLAorCQkocGxsX2NvZGUubV9icCA/IDAgOiBwbGxfY29kZS5tX2NvZGUpIDw8IFJUNTY2OF9QTExfTV9TSElGVCB8CisJCXBsbF9jb2RlLm1fYnAgPDwgUlQ1NjY4X1BMTF9NX0JQX1NISUZUKTsKKworCXJ0NTY2My0+cGxsX2luID0gZnJlcV9pbjsKKwlydDU2NjMtPnBsbF9vdXQgPSBmcmVxX291dDsKKwlydDU2NjMtPnBsbF9zcmMgPSBzb3VyY2U7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfc2V0X3RkbV9zbG90KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgdHhfbWFzaywKKwl1bnNpZ25lZCBpbnQgcnhfbWFzaywgaW50IHNsb3RzLCBpbnQgc2xvdF93aWR0aCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHZhbCA9IDAsIHJlZzsKKworCWlmIChyeF9tYXNrIHx8IHR4X21hc2spCisJCXZhbCB8PSBSVDU2NjhfVERNX01PREVfVERNOworCisJc3dpdGNoIChzbG90cykgeworCWNhc2UgNDoKKwkJdmFsIHw9IFJUNTY2OF9URE1fSU5fQ0hfNDsKKwkJdmFsIHw9IFJUNTY2OF9URE1fT1VUX0NIXzQ7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJdmFsIHw9IFJUNTY2OF9URE1fSU5fQ0hfNjsKKwkJdmFsIHw9IFJUNTY2OF9URE1fT1VUX0NIXzY7CisJCWJyZWFrOworCWNhc2UgODoKKwkJdmFsIHw9IFJUNTY2OF9URE1fSU5fQ0hfODsKKwkJdmFsIHw9IFJUNTY2OF9URE1fT1VUX0NIXzg7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChzbG90X3dpZHRoKSB7CisJY2FzZSAyMDoKKwkJdmFsIHw9IFJUNTY2OF9URE1fSU5fTEVOXzIwOworCQl2YWwgfD0gUlQ1NjY4X1RETV9PVVRfTEVOXzIwOworCQlicmVhazsKKwljYXNlIDI0OgorCQl2YWwgfD0gUlQ1NjY4X1RETV9JTl9MRU5fMjQ7CisJCXZhbCB8PSBSVDU2NjhfVERNX09VVF9MRU5fMjQ7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXZhbCB8PSBSVDU2NjhfVERNX0lOX0xFTl8zMjsKKwkJdmFsIHw9IFJUNTY2OF9URE1fT1VUX0xFTl8zMjsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChydDU2NjMtPmNvZGVjX3R5cGUpIHsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQlyZWcgPSBSVDU2NjNfVERNXzI7CisJCWJyZWFrOworCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCXJlZyA9IFJUNTY2M19URE1fMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiVW5rbm93biBDT0RFQ19UWVBFXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLCBSVDU2NjhfVERNX01PREVfTUFTSyB8CisJCVJUNTY2OF9URE1fSU5fQ0hfTUFTSyB8IFJUNTY2OF9URE1fT1VUX0NIX01BU0sgfAorCQlSVDU2NjhfVERNX0lOX0xFTl9NQVNLIHwgUlQ1NjY4X1RETV9PVVRfTEVOX01BU0ssIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfc2V0X2JjbGtfcmF0aW8oc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIHVuc2lnbmVkIGludCByYXRpbykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJdW5zaWduZWQgaW50IHJlZzsKKworCWRldl9kYmcoY29kZWMtPmRldiwgIiVzIHJhdGlvID0gJWRcbiIsIF9fZnVuY19fLCByYXRpbyk7CisKKwlpZiAocnQ1NjYzLT5jb2RlY190eXBlID09IENPREVDX1RZUEVfUlQ1NjY4KQorCQlyZWcgPSBSVDU2NjhfVERNXzg7CisJZWxzZQorCQlyZWcgPSBSVDU2NjNfVERNXzU7CisKKwlzd2l0Y2ggKHJhdGlvKSB7CisJY2FzZSAzMjoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLAorCQkJUlQ1NjYzX1RETV9MRU5HVE5fTUFTSywKKwkJCVJUNTY2M19URE1fTEVOR1ROXzE2KTsKKwkJYnJlYWs7CisJY2FzZSA0MDoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLAorCQkJUlQ1NjYzX1RETV9MRU5HVE5fTUFTSywKKwkJCVJUNTY2M19URE1fTEVOR1ROXzIwKTsKKwkJYnJlYWs7CisJY2FzZSA0ODoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLAorCQkJUlQ1NjYzX1RETV9MRU5HVE5fTUFTSywKKwkJCVJUNTY2M19URE1fTEVOR1ROXzI0KTsKKwkJYnJlYWs7CisJY2FzZSA2NDoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgcmVnLAorCQkJUlQ1NjYzX1RETV9MRU5HVE5fTUFTSywKKwkJCVJUNTY2M19URE1fTEVOR1ROXzMyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW52YWxpZCByYXRpbyFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydDU2NjNfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCQkJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgbGV2ZWwpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PTjoKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1BXUl9BTkxHXzEsCisJCQlSVDU2NjhfUFdSX0ZWMV9NQVNLIHwgUlQ1NjY4X1BXUl9GVjJfTUFTSywKKwkJCVJUNTY2OF9QV1JfRlYxIHwgUlQ1NjY4X1BXUl9GVjIpOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCWlmIChydDU2NjMtPmNvZGVjX3R5cGUgPT0gQ09ERUNfVFlQRV9SVDU2NjgpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19ESUdfTUlTQywKKwkJCQlSVDU2NjhfRElHX0dBVEVfQ1RSTF9NQVNLLAorCQkJCVJUNTY2OF9ESUdfR0FURV9DVFJMX0VOKTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19TSUdfQ0xLX0RFVCwKKwkJCQlSVDU2NjhfRU5fQU5BX0NMS19ERVRfTUFTSyB8CisJCQkJUlQ1NjY4X1BXUl9DTEtfREVUX01BU0ssCisJCQkJUlQ1NjY4X0VOX0FOQV9DTEtfREVUX0FVVE8gfAorCQkJCVJUNTY2OF9QV1JfQ0xLX0RFVF9FTik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlpZiAocnQ1NjYzLT5jb2RlY190eXBlID09IENPREVDX1RZUEVfUlQ1NjY4KQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX0RJR19NSVNDLAorCQkJCVJUNTY2OF9ESUdfR0FURV9DVFJMX01BU0ssCisJCQkJUlQ1NjY4X0RJR19HQVRFX0NUUkxfRElTKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjYzX1BXUl9BTkxHXzEsCisJCQlSVDU2NjhfUFdSX1ZSRUYxX01BU0sgfCBSVDU2NjhfUFdSX1ZSRUYyX01BU0sgfAorCQkJUlQ1NjY4X1BXUl9GVjFfTUFTSyB8IFJUNTY2OF9QV1JfRlYyX01BU0sgfAorCQkJUlQ1NjY4X1BXUl9NQl9NQVNLLCBSVDU2NjhfUFdSX1ZSRUYxIHwKKwkJCVJUNTY2OF9QV1JfVlJFRjIgfCBSVDU2NjhfUFdSX01CKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDAwNSk7CisJCWlmIChydDU2NjMtPmNvZGVjX3R5cGUgPT0gQ09ERUNfVFlQRV9SVDU2NjgpIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19TSUdfQ0xLX0RFVCwKKwkJCQlSVDU2NjhfRU5fQU5BX0NMS19ERVRfTUFTSyB8CisJCQkJUlQ1NjY4X1BXUl9DTEtfREVUX01BU0ssCisJCQkJUlQ1NjY4X0VOX0FOQV9DTEtfREVUX0RJUyB8CisJCQkJUlQ1NjY4X1BXUl9DTEtfREVUX0RJUyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY2M19QV1JfQU5MR18xLAorCQkJUlQ1NjY4X1BXUl9WUkVGMV9NQVNLIHwgUlQ1NjY4X1BXUl9WUkVGMl9NQVNLIHwKKwkJCVJUNTY2OF9QV1JfRlYxIHwgUlQ1NjY4X1BXUl9GVjIsIDB4MCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGNvZGVjKTsKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJcnQ1NjYzLT5jb2RlYyA9IGNvZGVjOworCisJc3dpdGNoIChydDU2NjMtPmNvZGVjX3R5cGUpIHsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjY4OgorCQlzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKGRhcG0sCisJCQlydDU2Njhfc3BlY2lmaWNfZGFwbV93aWRnZXRzLAorCQkJQVJSQVlfU0laRShydDU2Njhfc3BlY2lmaWNfZGFwbV93aWRnZXRzKSk7CisJCXNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sCisJCQlydDU2Njhfc3BlY2lmaWNfZGFwbV9yb3V0ZXMsCisJCQlBUlJBWV9TSVpFKHJ0NTY2OF9zcGVjaWZpY19kYXBtX3JvdXRlcykpOworCQlzbmRfc29jX2FkZF9jb2RlY19jb250cm9scyhjb2RlYywgcnQ1NjY4X3NwZWNpZmljX2NvbnRyb2xzLAorCQkJQVJSQVlfU0laRShydDU2Njhfc3BlY2lmaWNfY29udHJvbHMpKTsKKwkJYnJlYWs7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2MzoKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9scyhkYXBtLAorCQkJcnQ1NjYzX3NwZWNpZmljX2RhcG1fd2lkZ2V0cywKKwkJCUFSUkFZX1NJWkUocnQ1NjYzX3NwZWNpZmljX2RhcG1fd2lkZ2V0cykpOworCQlzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLAorCQkJcnQ1NjYzX3NwZWNpZmljX2RhcG1fcm91dGVzLAorCQkJQVJSQVlfU0laRShydDU2NjNfc3BlY2lmaWNfZGFwbV9yb3V0ZXMpKTsKKwkJc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoY29kZWMsIHJ0NTY2M19zcGVjaWZpY19jb250cm9scywKKwkJCUFSUkFZX1NJWkUocnQ1NjYzX3NwZWNpZmljX2NvbnRyb2xzKSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0NTY2M19yZW1vdmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlyZWdtYXBfd3JpdGUocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19SRVNFVCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBydDU2NjNfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJlZ2NhY2hlX2NhY2hlX29ubHkocnQ1NjYzLT5yZWdtYXAsIHRydWUpOworCXJlZ2NhY2hlX21hcmtfZGlydHkocnQ1NjYzLT5yZWdtYXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHJ0NTY2M19wcml2ICpydDU2NjMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJlZ2NhY2hlX2NhY2hlX29ubHkocnQ1NjYzLT5yZWdtYXAsIGZhbHNlKTsKKwlyZWdjYWNoZV9zeW5jKHJ0NTY2My0+cmVnbWFwKTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgcnQ1NjYzX3N1c3BlbmQgTlVMTAorI2RlZmluZSBydDU2NjNfcmVzdW1lIE5VTEwKKyNlbmRpZgorCisjZGVmaW5lIFJUNTY2M19TVEVSRU9fUkFURVMgU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAKKyNkZWZpbmUgUlQ1NjYzX0ZPUk1BVFMgKFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjBfM0xFIHwgXAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1M4KQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBydDU2NjNfYWlmX2RhaV9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IHJ0NTY2M19od19wYXJhbXMsCisJLnNldF9mbXQgPSBydDU2NjNfc2V0X2RhaV9mbXQsCisJLnNldF9zeXNjbGsgPSBydDU2NjNfc2V0X2RhaV9zeXNjbGssCisJLnNldF9wbGwgPSBydDU2NjNfc2V0X2RhaV9wbGwsCisJLnNldF90ZG1fc2xvdCA9IHJ0NTY2M19zZXRfdGRtX3Nsb3QsCisJLnNldF9iY2xrX3JhdGlvID0gcnQ1NjYzX3NldF9iY2xrX3JhdGlvLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgcnQ1NjYzX2RhaVtdID0geworCXsKKwkJLm5hbWUgPSAicnQ1NjYzLWFpZiIsCisJCS5pZCA9IFJUNTY2M19BSUYsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYgUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFJUNTY2M19TVEVSRU9fUkFURVMsCisJCQkuZm9ybWF0cyA9IFJUNTY2M19GT1JNQVRTLAorCQl9LAorCQkuY2FwdHVyZSA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJBSUYgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gUlQ1NjYzX1NURVJFT19SQVRFUywKKwkJCS5mb3JtYXRzID0gUlQ1NjYzX0ZPUk1BVFMsCisJCX0sCisJCS5vcHMgPSAmcnQ1NjYzX2FpZl9kYWlfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfcnQ1NjYzID0geworCS5wcm9iZSA9IHJ0NTY2M19wcm9iZSwKKwkucmVtb3ZlID0gcnQ1NjYzX3JlbW92ZSwKKwkuc3VzcGVuZCA9IHJ0NTY2M19zdXNwZW5kLAorCS5yZXN1bWUgPSBydDU2NjNfcmVzdW1lLAorCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTY2M19zZXRfYmlhc19sZXZlbCwKKwkuaWRsZV9iaWFzX29mZiA9IHRydWUsCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scyA9IHJ0NTY2M19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHJ0NTY2M19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzID0gcnQ1NjYzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0NTY2M19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMgPSBydDU2NjNfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0NTY2M19kYXBtX3JvdXRlcyksCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0NTY2OF9yZWdtYXAgPSB7CisJLnJlZ19iaXRzID0gMTYsCisJLnZhbF9iaXRzID0gMTYsCisJLnVzZV9zaW5nbGVfcncgPSB0cnVlLAorCS5tYXhfcmVnaXN0ZXIgPSAweDA3ZmEsCisJLnZvbGF0aWxlX3JlZyA9IHJ0NTY2OF92b2xhdGlsZV9yZWdpc3RlciwKKwkucmVhZGFibGVfcmVnID0gcnQ1NjY4X3JlYWRhYmxlX3JlZ2lzdGVyLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5yZWdfZGVmYXVsdHMgPSBydDU2NjhfcmVnLAorCS5udW1fcmVnX2RlZmF1bHRzID0gQVJSQVlfU0laRShydDU2NjhfcmVnKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDU2NjNfcmVnbWFwID0geworCS5yZWdfYml0cyA9IDE2LAorCS52YWxfYml0cyA9IDE2LAorCS51c2Vfc2luZ2xlX3J3ID0gdHJ1ZSwKKwkubWF4X3JlZ2lzdGVyID0gMHgwM2YzLAorCS52b2xhdGlsZV9yZWcgPSBydDU2NjNfdm9sYXRpbGVfcmVnaXN0ZXIsCisJLnJlYWRhYmxlX3JlZyA9IHJ0NTY2M19yZWFkYWJsZV9yZWdpc3RlciwKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkucmVnX2RlZmF1bHRzID0gcnQ1NjYzX3JlZywKKwkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUocnQ1NjYzX3JlZyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGVtcF9yZWdtYXAgPSB7CisJLm5hbWUgPSAibm9jYWNoZSIsCisJLnJlZ19iaXRzID0gMTYsCisJLnZhbF9iaXRzID0gMTYsCisJLnVzZV9zaW5nbGVfcncgPSB0cnVlLAorCS5tYXhfcmVnaXN0ZXIgPSAweDAzZjMsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9OT05FLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHJ0NTY2M19pMmNfaWRbXSA9IHsKKwl7ICJydDU2NjgiLCAwIH0sCisJeyAicnQ1NjYzIiwgMCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHJ0NTY2M19pMmNfaWQpOworCisjaWYgZGVmaW5lZChDT05GSUdfT0YpCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBydDU2NjNfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJlYWx0ZWsscnQ1NjY4IiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInJlYWx0ZWsscnQ1NjYzIiwgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBydDU2NjNfb2ZfbWF0Y2gpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQUNQSQorc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZV9pZCBydDU2NjNfYWNwaV9tYXRjaFtdID0geworCXsgIjEwRUM1NjY4IiwgMH0sCisJeyAiMTBFQzU2NjMiLCAwfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHJ0NTY2M19hY3BpX21hdGNoKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydDU2NjhfY2FsaWJyYXRlKHN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjY4KQoreworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0JJQVNfQ1VSXzgsIDB4YTQwMik7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUFdSX0RJR18xLCAweDAxMDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1JFQ01JWCwgMHg0MDQwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19ESUdfTUlTQywgMHgwMDAxKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19SQ19DTEssIDB4MDM4MCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfR0xCX0NMSywgMHg4MDAwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19BRERBX0NMS18xLCAweDEwMDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0NIT1BfREFDX0wsIDB4MzAzMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfQ0FMSUJfQURDLCAweDNjMDUpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1BXUl9BTkxHXzEsIDB4YTIzZSk7CisJbXNsZWVwKDQwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19QV1JfQU5MR18xLCAweGYyM2UpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX0NBTElCXzIsIDB4MDMyMSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfQ0FMSUJfMSwgMHhmYzAwKTsKKwltc2xlZXAoNTAwKTsKK30KKworc3RhdGljIHZvaWQgcnQ1NjYzX2NhbGlicmF0ZShzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2OCkKK3sKKwlpbnQgdmFsdWUsIGNvdW50OworCisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUkNfQ0xLLCAweDAyODApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0dMQl9DTEssIDB4ODAwMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfRElHX01JU0MsIDB4ODAwMSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfVlJFRl9SRUNNSVgsIDB4MDAzMik7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUFdSX0FOTEdfMSwgMHhhMmJlKTsKKwltc2xlZXAoMjApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1BXUl9BTkxHXzEsIDB4ZjJiZSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUFdSX0RJR18yLCAweDg0MDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0NIT1BfQURDLCAweDMwMDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0RFUE9QXzEsIDB4MDAzYik7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUFdSX0RJR18xLCAweDhkZjgpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1BXUl9BTkxHXzIsIDB4MDAwMyk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUFdSX0FOTEdfMywgMHgwMThjKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19BRERBX0NMS18xLCAweDExMTEpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1BSRV9ESVZfR0FUSU5HXzEsIDB4ZmZmZik7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfUFJFX0RJVl9HQVRJTkdfMiwgMHhmZmZmKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19ERVBPUF8yLCAweDMwMDMpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0RFUE9QXzEsIDB4MDAzYik7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfQ0hBUkdFX1BVTVBfMSwgMHgxZTMyKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9DSEFSR0VfUFVNUF8yLCAweDEzNzEpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0RBQ1JFRl9MRE8sIDB4M2IwYik7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfU1RPX0RBQ19NSVhFUiwgMHgyMDgwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19CWVBBU1NfU1RPX0RBQywgMHgwMDBjKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9CSUFTLCAweGFiYmEpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0NIQVJHRV9QVU1QXzEsIDB4MjIyNCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfT1VUX0VOLCAweDgwODgpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1NUT19EUkVfOSwgMHgwMDE3KTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19TVE9fRFJFXzEwLCAweDAwMTcpOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1NUTzFfQURDX01JWEVSLCAweDQwNDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX1JFQ01JWCwgMHgwMDA1KTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19BRERBX1JTVCwgMHhjMDAwKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19TVE8xX0hQRl9BREoxLCAweDMzMjApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX0NBTElCXzIsIDB4MDBjOSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfRFVNTVlfMSwgMHgwMDRjKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19BTkFfQklBU19DVVJfMSwgMHg3NzY2KTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19CSUFTX0NVUl84LCAweDQ3MDIpOworCW1zbGVlcCgyMDApOworCXJlZ21hcF93cml0ZShydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX0NBTElCXzEsIDB4MDA2OSk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfQ0FMSUJfMywgMHgwNmMyKTsKKwlyZWdtYXBfd3JpdGUocnQ1NjY4LT5yZWdtYXAsIFJUNTY2M19IUF9DQUxJQl8xXzEsIDB4N2IwMCk7CisJcmVnbWFwX3dyaXRlKHJ0NTY2OC0+cmVnbWFwLCBSVDU2NjNfSFBfQ0FMSUJfMV8xLCAweGZiMDApOworCWNvdW50ID0gMDsKKwl3aGlsZSAodHJ1ZSkgeworCQlyZWdtYXBfcmVhZChydDU2NjgtPnJlZ21hcCwgUlQ1NjYzX0hQX0NBTElCXzFfMSwgJnZhbHVlKTsKKwkJaWYgKHZhbHVlICYgMHg4MDAwKQorCQkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMDAwNSk7CisJCWVsc2UKKwkJCWJyZWFrOworCisJCWlmIChjb3VudCA+IDIwMCkKKwkJCXJldHVybjsKKwkJY291bnQrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBydDU2NjNfcHJpdiAqcnQ1NjYzOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlydDU2NjMgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2Yoc3RydWN0IHJ0NTY2M19wcml2KSwKKwkJR0ZQX0tFUk5FTCk7CisKKwlpZiAocnQ1NjYzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgcnQ1NjYzKTsKKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGkyYywgJnRlbXBfcmVnbWFwKTsKKwlpZiAoSVNfRVJSKHJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihyZWdtYXApOworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0ZW1wIHJlZ2lzdGVyIG1hcDogJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZWdtYXBfcmVhZChyZWdtYXAsIFJUNTY2M19WRU5ET1JfSURfMiwgJnZhbCk7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIFJUNTY2OF9ERVZJQ0VfSUQ6CisJCXJ0NTY2My0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmcnQ1NjY4X3JlZ21hcCk7CisJCXJ0NTY2My0+Y29kZWNfdHlwZSA9IENPREVDX1RZUEVfUlQ1NjY4OworCQlicmVhazsKKwljYXNlIFJUNTY2M19ERVZJQ0VfSUQ6CisJCXJ0NTY2My0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmcnQ1NjYzX3JlZ21hcCk7CisJCXJ0NTY2My0+Y29kZWNfdHlwZSA9IENPREVDX1RZUEVfUlQ1NjYzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKCZpMmMtPmRldiwKKwkJCSJEZXZpY2Ugd2l0aCBJRCByZWdpc3RlciAlI3ggaXMgbm90IHJ0NTY2MyBvciBydDU2NjhcbiIsCisJCQl2YWwpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoSVNfRVJSKHJ0NTY2My0+cmVnbWFwKSkgeworCQlyZXQgPSBQVFJfRVJSKHJ0NTY2My0+cmVnbWFwKTsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgcmVnaXN0ZXIgbWFwOiAlZFxuIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogcmVzZXQgYW5kIGNhbGlicmF0ZSAqLworCXJlZ21hcF93cml0ZShydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1JFU0VULCAwKTsKKwlyZWdjYWNoZV9jYWNoZV9ieXBhc3MocnQ1NjYzLT5yZWdtYXAsIHRydWUpOworCXN3aXRjaCAocnQ1NjYzLT5jb2RlY190eXBlKSB7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJcnQ1NjY4X2NhbGlicmF0ZShydDU2NjMpOworCQlicmVhazsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjYzOgorCQlydDU2NjNfY2FsaWJyYXRlKHJ0NTY2Myk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiJXM6VW5rbm93biBjb2RlYyB0eXBlXG4iLCBfX2Z1bmNfXyk7CisJfQorCXJlZ2NhY2hlX2NhY2hlX2J5cGFzcyhydDU2NjMtPnJlZ21hcCwgZmFsc2UpOworCXJlZ21hcF93cml0ZShydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1JFU0VULCAwKTsKKwlkZXZfZGJnKCZpMmMtPmRldiwgImNhbGlicmF0ZSBkb25lXG4iKTsKKworCS8qIEdQSU8xIGFzIElSUSAqLworCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX0dQSU9fMSwgUlQ1NjY4X0dQMV9QSU5fTUFTSywKKwkJUlQ1NjY4X0dQMV9QSU5fSVJRKTsKKwkvKiA0YnRuIGlubGluZSBjb21tYW5kIGRlYm91bmNlICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfSUxfQ01EXzUsCisJCVJUNTY2OF80QlROX0NMS19ERUJfTUFTSywgUlQ1NjY4XzRCVE5fQ0xLX0RFQl82NU1TKTsKKworCXN3aXRjaCAocnQ1NjYzLT5jb2RlY190eXBlKSB7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY2ODoKKwkJcmVnbWFwX3dyaXRlKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfQklBU19DVVJfOCwgMHhhNDAyKTsKKwkJLyogSkQxICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX0FVVE9fMU1SQ19DTEssCisJCQlSVDU2NjhfSVJRX1BPV19TQVZfTUFTSyB8IFJUNTY2OF9JUlFfUE9XX1NBVl9KRDFfTUFTSywKKwkJCVJUNTY2OF9JUlFfUE9XX1NBVl9FTiB8IFJUNTY2OF9JUlFfUE9XX1NBVl9KRDFfRU4pOworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19QV1JfQU5MR18yLAorCQkJUlQ1NjY4X1BXUl9KRDFfTUFTSywgUlQ1NjY4X1BXUl9KRDEpOworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19JUlFfMSwKKwkJCVJUNTY2OF9FTl9DQl9KRF9NQVNLLCBSVDU2NjhfRU5fQ0JfSkRfRU4pOworCisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX0hQX0xPR0lDXzIsCisJCQlSVDU2NjhfSFBfU0lHX1NSQzFfTUFTSywgUlQ1NjY4X0hQX1NJR19TUkMxX1JFRyk7CisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1JFQ01JWCwKKwkJCVJUNTY2OF9WUkVGX0JJQVNfTUFTSyB8IFJUNTY2OF9DQkpfREVUX01BU0sgfAorCQkJUlQ1NjY4X0RFVF9UWVBFX01BU0ssIFJUNTY2OF9WUkVGX0JJQVNfUkVHIHwKKwkJCVJUNTY2OF9DQkpfREVUX0VOIHwgUlQ1NjY4X0RFVF9UWVBFX1FGTik7CisJCS8qIFNldCBHUElPNCBhbmQgR1BJTzggYXMgaW5wdXQgZm9yIGNvbWJvIGphY2sgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfR1BJT18yLAorCQkJUlQ1NjY4X0dQNF9QSU5fQ09ORl9NQVNLLCBSVDU2NjhfR1A0X1BJTl9DT05GX0lOUFVUKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjhfR1BJT18zLAorCQkJUlQ1NjY4X0dQOF9QSU5fQ09ORl9NQVNLLCBSVDU2NjhfR1A4X1BJTl9DT05GX0lOUFVUKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfUFdSX0FOTEdfMSwKKwkJCVJUNTY2OF9MRE8xX0RWT19NQVNLIHwgUlQ1NjY4X0FNUF9IUF9NQVNLLAorCQkJUlQ1NjY4X0xETzFfRFZPXzBfOVYgfCBSVDU2NjhfQU1QX0hQXzNYKTsKKwkJCWJyZWFrOworCWNhc2UgQ09ERUNfVFlQRV9SVDU2NjM6CisJCXJlZ21hcF93cml0ZShydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1ZSRUZfUkVDTUlYLCAweDAwMzIpOworCQlyZWdtYXBfd3JpdGUocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19QV1JfQU5MR18xLCAweGEyYmUpOworCQltc2xlZXAoMjApOworCQlyZWdtYXBfd3JpdGUocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19QV1JfQU5MR18xLCAweGYyYmUpOworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjYzLT5yZWdtYXAsIFJUNTY2M19HUElPXzIsCisJCQlSVDU2NjNfR1AxX1BJTl9DT05GX01BU0ssIFJUNTY2M19HUDFfUElOX0NPTkZfT1VUUFVUKTsKKwkJLyogREFDUkVGIExETyBjb250cm9sICovCisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX0RBQ1JFRl9MRE8sIDB4M2UwZSwKKwkJCTB4M2EwYSk7CisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1JFQ01JWCwKKwkJCVJUNTY2M19SRUNNSVgxX0JTVDFfTUFTSywgUlQ1NjYzX1JFQ01JWDFfQlNUMV9PTik7CisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NjMtPnJlZ21hcCwgUlQ1NjYzX1RETV8yLAorCQkJUlQ1NjYzX0RBVEFfU1dBUF9BRENEQVQxX01BU0ssCisJCQlSVDU2NjNfREFUQV9TV0FQX0FEQ0RBVDFfTEwpOworCQkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmaTJjLT5kZXYsICIlczpVbmtub3duIGNvZGVjIHR5cGVcbiIsIF9fZnVuY19fKTsKKwl9CisKKwlJTklUX0RFTEFZRURfV09SSygmcnQ1NjYzLT5qYWNrX2RldGVjdF93b3JrLCBydDU2NjNfamFja19kZXRlY3Rfd29yayk7CisKKwlpZiAoaTJjLT5pcnEpIHsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaTJjLT5pcnEsIHJ0NTY2M19pcnEsCisJCQlJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcKKwkJCXwgSVJRRl9PTkVTSE9ULCAicnQ1NjYzIiwgcnQ1NjYzKTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIoJmkyYy0+ZGV2LCAiJXMgRmFpbGVkIHRvIHJlZ3Vlc3QgSVJROiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwl9CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwgJnNvY19jb2RlY19kZXZfcnQ1NjYzLAorCQkJcnQ1NjYzX2RhaSwgQVJSQVlfU0laRShydDU2NjNfZGFpKSk7CisKKwlpZiAocmV0KSB7CisJCWlmIChpMmMtPmlycSkKKwkJCWZyZWVfaXJxKGkyYy0+aXJxLCBydDU2NjMpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnQ1NjYzX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmMpOworCisJaWYgKGkyYy0+aXJxKQorCQlmcmVlX2lycShpMmMtPmlycSwgcnQ1NjYzKTsKKworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0NTY2M19pMmNfc2h1dGRvd24oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgcnQ1NjYzX3ByaXYgKnJ0NTY2MyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcmVnbWFwX3dyaXRlKHJ0NTY2My0+cmVnbWFwLCBSVDU2NjNfUkVTRVQsIDApOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcnQ1NjYzX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAicnQ1NjYzIiwKKwkJLmFjcGlfbWF0Y2hfdGFibGUgPSBBQ1BJX1BUUihydDU2NjNfYWNwaV9tYXRjaCksCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihydDU2NjNfb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gcnQ1NjYzX2kyY19wcm9iZSwKKwkucmVtb3ZlID0gcnQ1NjYzX2kyY19yZW1vdmUsCisJLnNodXRkb3duID0gcnQ1NjYzX2kyY19zaHV0ZG93biwKKwkuaWRfdGFibGUgPSBydDU2NjNfaTJjX2lkLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKHJ0NTY2M19pMmNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFJUNTY2MyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkphY2sgWXUgPGphY2sueXVAcmVhbHRlay5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY2My5oIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NjMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2M4ZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NjMuaApAQCAtMCwwICsxLDExMjEgQEAKKy8qCisgKiBydDU2NjMuaCAgLS0gIFJUNTY2MyBBTFNBIFNvQyBhdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBSZWFsdGVrIE1pY3JvZWxlY3Ryb25pY3MKKyAqIEF1dGhvcjogSmFjayBZdSA8amFjay55dUByZWFsdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX19SVDU2NjNfSF9fCisjZGVmaW5lIF9fUlQ1NjYzX0hfXworCisvKiBJbmZvICovCisjZGVmaW5lIFJUNTY2M19SRVNFVAkJCQkweDAwMDAKKyNkZWZpbmUgUlQ1NjYzX1ZFTkRPUl9JRAkJCTB4MDBmZAorI2RlZmluZSBSVDU2NjNfVkVORE9SX0lEXzEJCQkweDAwZmUKKyNkZWZpbmUgUlQ1NjYzX1ZFTkRPUl9JRF8yCQkJMHgwMGZmCisKKyNkZWZpbmUgUlQ1NjY4X0xPVVRfQ1RSTAkJCTB4MDAwMQorI2RlZmluZSBSVDU2NjhfSFBfQU1QXzIJCQkJMHgwMDAzCisjZGVmaW5lIFJUNTY2OF9NT05PX09VVAkJCQkweDAwMDQKKyNkZWZpbmUgUlQ1NjY4X01PTk9fR0FJTgkJCTB4MDAwNworCisjZGVmaW5lIFJUNTY2OF9BRUNfQlNUCQkJCTB4MDAwYgorI2RlZmluZSBSVDU2NjhfSU4xX0lOMgkJCQkweDAwMGMKKyNkZWZpbmUgUlQ1NjY4X0lOM19JTjQJCQkJMHgwMDBkCisjZGVmaW5lIFJUNTY2OF9JTkwxX0lOUjEJCQkweDAwMGYKKyNkZWZpbmUgUlQ1NjY4X0NCSl9UWVBFXzIJCQkweDAwMTEKKyNkZWZpbmUgUlQ1NjY4X0NCSl9UWVBFXzMJCQkweDAwMTIKKyNkZWZpbmUgUlQ1NjY4X0NCSl9UWVBFXzQJCQkweDAwMTMKKyNkZWZpbmUgUlQ1NjY4X0NCSl9UWVBFXzUJCQkweDAwMTQKKyNkZWZpbmUgUlQ1NjY4X0NCSl9UWVBFXzgJCQkweDAwMTcKKworLyogSS9PIC0gQURDL0RBQy9ETUlDICovCisjZGVmaW5lIFJUNTY2OF9EQUMzX0RJR19WT0wJCQkweDAwMWEKKyNkZWZpbmUgUlQ1NjY4X0RBQzNfQ1RSTAkJCTB4MDAxYgorI2RlZmluZSBSVDU2NjhfTU9OT19BRENfRElHX1ZPTAkJCTB4MDAxZAorI2RlZmluZSBSVDU2NjhfU1RPMl9BRENfRElHX1ZPTAkJCTB4MDAxZQorI2RlZmluZSBSVDU2NjhfTU9OT19BRENfQlNUX0dBSU4JCTB4MDAyMAorI2RlZmluZSBSVDU2NjhfU1RPMl9BRENfQlNUX0dBSU4JCTB4MDAyMQorI2RlZmluZSBSVDU2NjhfU0lERVRPTkVfQ1RSTAkJCTB4MDAyNAorLyogTWl4ZXIgLSBELUQgKi8KKyNkZWZpbmUgUlQ1NjY4X01PTk8xX0FEQ19NSVhFUgkJCTB4MDAyNworI2RlZmluZSBSVDU2NjhfU1RPMl9BRENfTUlYRVIJCQkweDAwMjgKKyNkZWZpbmUgUlQ1NjY4X01PTk9fREFDX01JWEVSCQkJMHgwMDJiCisjZGVmaW5lIFJUNTY2OF9EQUMyX1NSQ19DVFJMCQkJMHgwMDJlCisjZGVmaW5lIFJUNTY2OF9JRl8zXzRfREFUQV9DVEwJCQkweDAwMmYKKyNkZWZpbmUgUlQ1NjY4X0lGXzVfREFUQV9DVEwJCQkweDAwMzAKKyNkZWZpbmUgUlQ1NjY4X1BETV9PVVRfQ1RMCQkJMHgwMDMxCisjZGVmaW5lIFJUNTY2OF9QRE1fSTJDX0RBVEFfQ1RMMQkJMHgwMDMyCisjZGVmaW5lIFJUNTY2OF9QRE1fSTJDX0RBVEFfQ1RMMgkJMHgwMDMzCisjZGVmaW5lIFJUNTY2OF9QRE1fSTJDX0RBVEFfQ1RMMwkJMHgwMDM0CisjZGVmaW5lIFJUNTY2OF9QRE1fSTJDX0RBVEFfQ1RMNAkJMHgwMDM1CisKKy8qTWl4ZXIgLSBBbmFsb2cqLworI2RlZmluZSBSVDU2NjhfUkVDTUlYMV9ORVcJCQkweDAwM2EKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDFMXzAJCQkweDAwM2IKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDFMCQkJCTB4MDAzYworI2RlZmluZSBSVDU2NjhfUkVDTUlYMVJfMAkJCTB4MDAzZAorI2RlZmluZSBSVDU2NjhfUkVDTUlYMVIJCQkJMHgwMDNlCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgyX05FVwkJCTB4MDAzZgorI2RlZmluZSBSVDU2NjhfUkVDTUlYMl9MXzIJCQkweDAwNDEKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDJfUgkJCTB4MDA0MgorI2RlZmluZSBSVDU2NjhfUkVDTUlYMl9SXzIJCQkweDAwNDMKKyNkZWZpbmUgUlQ1NjY4X0NBTElCX1JFQ19MUgkJCTB4MDA0NAorI2RlZmluZSBSVDU2NjhfQUxDX0JLX0dBSU4JCQkweDAwNDkKKyNkZWZpbmUgUlQ1NjY4X01PTk9NSVhfR0FJTgkJCTB4MDA0YQorI2RlZmluZSBSVDU2NjhfTU9OT01JWF9JTl9HQUlOCQkJMHgwMDRiCisjZGVmaW5lIFJUNTY2OF9PVVRfTUlYTF9HQUlOCQkJMHgwMDRkCisjZGVmaW5lIFJUNTY2OF9PVVRfTE1JWF9JTl9HQUlOCQkJMHgwMDRlCisjZGVmaW5lIFJUNTY2OF9PVVRfUk1JWF9JTl9HQUlOCQkJMHgwMDRmCisjZGVmaW5lIFJUNTY2OF9PVVRfUk1JWF9JTl9HQUlOMQkJMHgwMDUwCisjZGVmaW5lIFJUNTY2OF9MT1VUX01JWEVSX0NUUkwJCQkweDAwNTIKKy8qIFBvd2VyICovCisjZGVmaW5lIFJUNTY2OF9QV1JfVk9MCQkJCTB4MDA2NworCisjZGVmaW5lIFJUNTY2OF9BRENEQUNfUlNUCQkJMHgwMDZkCisvKiBGb3JtYXQgLSBBREMvREFDICovCisjZGVmaW5lIFJUNTY2OF9JMlMzNF9TRFAJCQkweDAwNzEKKyNkZWZpbmUgUlQ1NjY4X0kyUzVfU0RQCQkJCTB4MDA3MgorLyogRm9ybWF0IC0gVERNIENvbnRyb2wgKi8KKyNkZWZpbmUgUlQ1NjY4X1RETV81CQkJCTB4MDA3YworI2RlZmluZSBSVDU2NjhfVERNXzYJCQkJMHgwMDdkCisjZGVmaW5lIFJUNTY2OF9URE1fNwkJCQkweDAwN2UKKyNkZWZpbmUgUlQ1NjY4X1RETV84CQkJCTB4MDA3ZgorCisvKiBGdW5jdGlvbiAtIEFuYWxvZyAqLworI2RlZmluZSBSVDU2NjhfQVNSQ18zCQkJCTB4MDA4NQorI2RlZmluZSBSVDU2NjhfQVNSQ182CQkJCTB4MDA4OAorI2RlZmluZSBSVDU2NjhfQVNSQ183CQkJCTB4MDA4OQorI2RlZmluZSBSVDU2NjhfUExMX1RSS18xMwkJCTB4MDA5OQorI2RlZmluZSBSVDU2NjhfSTJTX01fQ0xLX0NUTAkJCTB4MDBhMAorI2RlZmluZSBSVDU2NjhfRkRJVl9JMlMzNF9NX0NMSwkJCTB4MDBhMQorI2RlZmluZSBSVDU2NjhfRkRJVl9JMlMzNF9NX0NMSzIJCTB4MDBhMgorI2RlZmluZSBSVDU2NjhfRkRJVl9JMlM1X01fQ0xLCQkJMHgwMGEzCisjZGVmaW5lIFJUNTY2OF9GRElWX0kyUzVfTV9DTEsyCQkJMHgwMGE0CisKKy8qIEZ1bmN0aW9uIC0gRGlnaXRhbCAqLworI2RlZmluZSBSVDU2NjhfSVJRXzQJCQkJMHgwMGI5CisjZGVmaW5lIFJUNTY2OF9HUElPXzMJCQkJMHgwMGMyCisjZGVmaW5lIFJUNTY2OF9HUElPXzQJCQkJMHgwMGMzCisjZGVmaW5lIFJUNTY2OF9HUElPX1NUQQkJCQkweDAwYzQKKyNkZWZpbmUgUlQ1NjY4X0hQX0FNUF9ERVQxCQkJMHgwMGQwCisjZGVmaW5lIFJUNTY2OF9IUF9BTVBfREVUMgkJCTB4MDBkMQorI2RlZmluZSBSVDU2NjhfSFBfQU1QX0RFVDMJCQkweDAwZDIKKyNkZWZpbmUgUlQ1NjY4X01JRF9CRF9IUF9BTVAJCQkweDAwZDMKKyNkZWZpbmUgUlQ1NjY4X0xPV19CRF9IUF9BTVAJCQkweDAwZDQKKyNkZWZpbmUgUlQ1NjY4X1NPRl9WT0xfWkMyCQkJMHgwMGRhCisjZGVmaW5lIFJUNTY2OF9BRENfU1RPMl9BREoxCQkJMHgwMGVlCisjZGVmaW5lIFJUNTY2OF9BRENfU1RPMl9BREoyCQkJMHgwMGVmCisvKiBHZW5lcmFsIENvbnRyb2wgKi8KKyNkZWZpbmUgUlQ1NjY4X0FfSkRfQ1RSTAkJCTB4MDBmMAorI2RlZmluZSBSVDU2NjhfSkQxX1RSRVNfQ1RSTAkJCTB4MDBmMQorI2RlZmluZSBSVDU2NjhfSkQyX1RSRVNfQ1RSTAkJCTB4MDBmMgorI2RlZmluZSBSVDU2NjhfSkRfQ1RSTDIJCQkJMHgwMGY3CisjZGVmaW5lIFJUNTY2OF9EVU1fUkVHXzIJCQkweDAwZmIKKyNkZWZpbmUgUlQ1NjY4X0RVTV9SRUdfMwkJCTB4MDBmYworCisKKyNkZWZpbmUgUlQ1NjY4X0RBQ0FEQ19ESUdfVk9MMgkJCTB4MDEwMQorI2RlZmluZSBSVDU2NjhfRElHX0lOX1BJTjIJCQkweDAxMzMKKyNkZWZpbmUgUlQ1NjY4X1BBRF9EUlZfQ1RMMQkJCTB4MDEzNgorI2RlZmluZSBSVDU2NjhfU09GX1JBTV9ERVBPUAkJCTB4MDEzOAorI2RlZmluZSBSVDU2NjhfVk9MX1RFU1QJCQkJMHgwMTNmCisjZGVmaW5lIFJUNTY2OF9URVNUX01PREVfMwkJCTB4MDE0NworI2RlZmluZSBSVDU2NjhfVEVTVF9NT0RFXzQJCQkweDAxNDgKKyNkZWZpbmUgUlQ1NjY4X01PTk9fRFlOQV8xCQkJMHgwMTcwCisjZGVmaW5lIFJUNTY2OF9NT05PX0RZTkFfMgkJCTB4MDE3MQorI2RlZmluZSBSVDU2NjhfTU9OT19EWU5BXzMJCQkweDAxNzIKKyNkZWZpbmUgUlQ1NjY4X01PTk9fRFlOQV80CQkJMHgwMTczCisjZGVmaW5lIFJUNTY2OF9NT05PX0RZTkFfNQkJCTB4MDE3NAorI2RlZmluZSBSVDU2NjhfTU9OT19EWU5BXzYJCQkweDAxNzUKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfU0lMX0RFVAkJCTB4MDE5MAorI2RlZmluZSBSVDU2NjhfTU9OT0xfU0lMX0RFVAkJCTB4MDE5MQorI2RlZmluZSBSVDU2NjhfTU9OT1JfU0lMX0RFVAkJCTB4MDE5MgorI2RlZmluZSBSVDU2NjhfU1RPMl9EQUNfU0lMCQkJMHgwMTkzCisjZGVmaW5lIFJUNTY2OF9QV1JfU0FWX0NUTDEJCQkweDAxOTQKKyNkZWZpbmUgUlQ1NjY4X1BXUl9TQVZfQ1RMMgkJCTB4MDE5NQorI2RlZmluZSBSVDU2NjhfUFdSX1NBVl9DVEwzCQkJMHgwMTk2CisjZGVmaW5lIFJUNTY2OF9QV1JfU0FWX0NUTDQJCQkweDAxOTcKKyNkZWZpbmUgUlQ1NjY4X1BXUl9TQVZfQ1RMNQkJCTB4MDE5OAorI2RlZmluZSBSVDU2NjhfUFdSX1NBVl9DVEw2CQkJMHgwMTk5CisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUwxCQkJMHgwMWEwCisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUwyCQkJMHgwMWExCisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUwzCQkJMHgwMWEyCisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUw0CQkJMHgwMWEzCisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUw1CQkJMHgwMWE0CisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUw2CQkJMHgwMWE1CisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUw3CQkJMHgwMWE2CisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUxfU1QxCQkJMHgwMWE3CisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUxfU1QyCQkJMHgwMWE4CisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUxfU1QzCQkJMHgwMWE5CisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUxfU1Q0CQkJMHgwMWFhCisjZGVmaW5lIFJUNTY2OF9NT05PX0FNUF9DQUxfU1Q1CQkJMHgwMWFiCisjZGVmaW5lIFJUNTY2OF9IUF9JTVBfU0VOXzEzCQkJMHgwMWI5CisjZGVmaW5lIFJUNTY2OF9IUF9JTVBfU0VOXzE0CQkJMHgwMWJhCisjZGVmaW5lIFJUNTY2OF9IUF9JTVBfU0VOXzYJCQkweDAxYmIKKyNkZWZpbmUgUlQ1NjY4X0hQX0lNUF9TRU5fNwkJCTB4MDFiYworI2RlZmluZSBSVDU2NjhfSFBfSU1QX1NFTl84CQkJMHgwMWJkCisjZGVmaW5lIFJUNTY2OF9IUF9JTVBfU0VOXzkJCQkweDAxYmUKKyNkZWZpbmUgUlQ1NjY4X0hQX0lNUF9TRU5fMTAJCQkweDAxYmYKKyNkZWZpbmUgUlQ1NjY4X0hQX0xPR0lDXzMJCQkweDAxZGMKKyNkZWZpbmUgUlQ1NjY4X0hQX0NBTElCX1NUMTAJCQkweDAxZjMKKyNkZWZpbmUgUlQ1NjY4X0hQX0NBTElCX1NUMTEJCQkweDAxZjQKKyNkZWZpbmUgUlQ1NjY4X1BST19SRUdfVEJMXzQJCQkweDAyMDMKKyNkZWZpbmUgUlQ1NjY4X1BST19SRUdfVEJMXzUJCQkweDAyMDQKKyNkZWZpbmUgUlQ1NjY4X1BST19SRUdfVEJMXzYJCQkweDAyMDUKKyNkZWZpbmUgUlQ1NjY4X1BST19SRUdfVEJMXzcJCQkweDAyMDYKKyNkZWZpbmUgUlQ1NjY4X1BST19SRUdfVEJMXzgJCQkweDAyMDcKKyNkZWZpbmUgUlQ1NjY4X1BST19SRUdfVEJMXzkJCQkweDAyMDgKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzEJCQkweDAyMTAKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzIJCQkweDAyMTEKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzMJCQkweDAyMTIKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzQJCQkweDAyMTMKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzUJCQkweDAyMTQKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzYJCQkweDAyMTUKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzcJCQkweDAyMTYKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzgJCQkweDAyMTcKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzkJCQkweDAyMTgKKyNkZWZpbmUgUlQ1NjY4X1NBUl9BRENfSU5MXzEwCQkJMHgwMjE5CisjZGVmaW5lIFJUNTY2OF9TQVJfQURDX0lOTF8xMQkJCTB4MDIxYQorI2RlZmluZSBSVDU2NjhfU0FSX0FEQ19JTkxfMTIJCQkweDAyMWIKKyNkZWZpbmUgUlQ1NjY4X0RSQ19DVFJMXzEJCQkweDAyZmYKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfQ1RSTF8yCQkJMHgwMzAxCisjZGVmaW5lIFJUNTY2OF9EUkMxX0NUUkxfMwkJCTB4MDMwMgorI2RlZmluZSBSVDU2NjhfRFJDMV9DVFJMXzQJCQkweDAzMDMKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfQ1RSTF81CQkJMHgwMzA0CisjZGVmaW5lIFJUNTY2OF9EUkMxX0NUUkxfNgkJCTB4MDMwNQorI2RlZmluZSBSVDU2NjhfRFJDMV9IRF9DVFJMXzEJCQkweDAzMDYKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfSERfQ1RSTF8yCQkJMHgwMzA3CisjZGVmaW5lIFJUNTY2OF9EUkMxX1BSSV9SRUdfMQkJCTB4MDMxMAorI2RlZmluZSBSVDU2NjhfRFJDMV9QUklfUkVHXzIJCQkweDAzMTEKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfUFJJX1JFR18zCQkJMHgwMzEyCisjZGVmaW5lIFJUNTY2OF9EUkMxX1BSSV9SRUdfNAkJCTB4MDMxMworI2RlZmluZSBSVDU2NjhfRFJDMV9QUklfUkVHXzUJCQkweDAzMTQKKyNkZWZpbmUgUlQ1NjY4X0RSQzFfUFJJX1JFR182CQkJMHgwMzE1CisjZGVmaW5lIFJUNTY2OF9EUkMxX1BSSV9SRUdfNwkJCTB4MDMxNgorI2RlZmluZSBSVDU2NjhfRFJDMV9QUklfUkVHXzgJCQkweDAzMTcKKyNkZWZpbmUgUlQ1NjY4X0FMQ19QR0FfQ1RMXzEJCQkweDAzMzAKKyNkZWZpbmUgUlQ1NjY4X0FMQ19QR0FfQ1RMXzIJCQkweDAzMzEKKyNkZWZpbmUgUlQ1NjY4X0FMQ19QR0FfQ1RMXzMJCQkweDAzMzIKKyNkZWZpbmUgUlQ1NjY4X0FMQ19QR0FfQ1RMXzQJCQkweDAzMzMKKyNkZWZpbmUgUlQ1NjY4X0FMQ19QR0FfQ1RMXzUJCQkweDAzMzQKKyNkZWZpbmUgUlQ1NjY4X0FMQ19QR0FfQ1RMXzYJCQkweDAzMzUKKyNkZWZpbmUgUlQ1NjY4X0FMQ19QR0FfQ1RMXzcJCQkweDAzMzYKKyNkZWZpbmUgUlQ1NjY4X0FMQ19QR0FfQ1RMXzgJCQkweDAzMzcKKyNkZWZpbmUgUlQ1NjY4X0FMQ19QR0FfUkVHXzEJCQkweDAzMzgKKyNkZWZpbmUgUlQ1NjY4X0FMQ19QR0FfUkVHXzIJCQkweDAzMzkKKyNkZWZpbmUgUlQ1NjY4X0FMQ19QR0FfUkVHXzMJCQkweDAzM2EKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl8xCQkJMHgwM2MwCisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfMgkJCTB4MDNjMQorI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzMJCQkweDAzYzIKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl80CQkJMHgwM2MzCisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfNQkJCTB4MDNjNAorI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzYJCQkweDAzYzUKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl83CQkJMHgwM2M2CisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfOAkJCTB4MDNjNworI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzkJCQkweDAzYzgKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl8xMAkJCTB4MDNjOQorI2RlZmluZSBSVDU2NjhfQURDX0VRX1JFQ09WXzExCQkJMHgwM2NhCisjZGVmaW5lIFJUNTY2OF9BRENfRVFfUkVDT1ZfMTIJCQkweDAzY2IKKyNkZWZpbmUgUlQ1NjY4X0FEQ19FUV9SRUNPVl8xMwkJCTB4MDNjYworI2RlZmluZSBSVDU2NjhfVklEX0hJRERFTgkJCTB4MDNmZQorI2RlZmluZSBSVDU2NjhfVklEX0NVU1RPTUVSCQkJMHgwM2ZmCisjZGVmaW5lIFJUNTY2OF9TQ0FOX01PREUJCQkweDA3ZjAKKyNkZWZpbmUgUlQ1NjY4X0kyQ19CWVBBCQkJCTB4MDdmYQorCisvKiBIZWFkcGhvbmUgQW1wIENvbnRyb2wgMiAoMHgwMDAzKSAqLworI2RlZmluZSBSVDU2NjhfRU5fREFDX0hQT19NQVNLCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X0VOX0RBQ19IUE9fU0hJRlQJCQkxNAorI2RlZmluZSBSVDU2NjhfRU5fREFDX0hQT19ESVMJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfRU5fREFDX0hQT19FTgkJCSgweDEgPDwgMTQpCisKKy8qSGVhZHBob25lIEFtcCBML1IgQW5hbG9nIEdhaW4gYW5kIERpZ2l0YWwgTkcyIEdhaW4gQ29udHJvbCAoMHgwMDA1IDB4MDAwNikqLworI2RlZmluZSBSVDU2NjhfR0FJTl9IUAkJCQkoMHgxZiA8PCA4KQorI2RlZmluZSBSVDU2NjhfR0FJTl9IUF9TSElGVAkJCTgKKworLyogQUVDIEJTVCBDb250cm9sICgweDAwMGIpICovCisjZGVmaW5lIFJUNTY2OF9HQUlOX0NCSl9NQVNLCQkJKDB4ZiA8PCA4KQorI2RlZmluZSBSVDU2NjhfR0FJTl9DQkpfU0hJRlQJCQk4CisKKy8qIElOMSBDb250cm9sIC8gTUlDIEdORCBSRUYgKDB4MDAwYykgKi8KKyNkZWZpbmUgUlQ1NjY4X0lOMV9ERl9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0lOMV9ERl9TSElGVAkJCTE1CisKKy8qIENvbWJvIEphY2sgYW5kIFR5cGUgRGV0ZWN0aW9uIENvbnRyb2wgMSAoMHgwMDEwKSAqLworI2RlZmluZSBSVDU2NjhfQ0JKX0RFVF9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0NCSl9ERVRfU0hJRlQJCQkxNQorI2RlZmluZSBSVDU2NjhfQ0JKX0RFVF9ESVMJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfQ0JKX0RFVF9FTgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9ERVRfVFlQRV9NQVNLCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X0RFVF9UWVBFX1NISUZUCQkJMTIKKyNkZWZpbmUgUlQ1NjY4X0RFVF9UWVBFX1dMQ1NQCQkJKDB4MCA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X0RFVF9UWVBFX1FGTgkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9WUkVGX0JJQVNfTUFTSwkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X1ZSRUZfQklBU19TSElGVAkJCTYKKyNkZWZpbmUgUlQ1NjY4X1ZSRUZfQklBU19GU00JCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9WUkVGX0JJQVNfUkVHCQkJKDB4MSA8PCA2KQorCisvKiBSRUMgTGVmdCBNaXhlciBDb250cm9sIDIgKDB4MDAzYykgKi8KKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDFMX0JTVDFfQ0JKCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2OF9SRUNNSVgxTF9CU1QxX0NCSl9TSElGVAkJNworI2RlZmluZSBSVDU2NjhfUkVDTUlYMUxfQlNUMgkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDFMX0JTVDJfU0hJRlQJCTQKKworLyogUkVDIFJpZ2h0IE1peGVyIENvbnRyb2wgMiAoMHgwMDNlKSAqLworI2RlZmluZSBSVDU2NjhfUkVDTUlYMVJfQlNUMgkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X1JFQ01JWDFSX0JTVDJfU0hJRlQJCTQKKworLyogREFDMSBEaWdpdGFsIFZvbHVtZSAoMHgwMDE5KSAqLworI2RlZmluZSBSVDU2NjhfREFDX0wxX1ZPTF9NQVNLCQkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X0RBQ19MMV9WT0xfU0hJRlQJCQk4CisjZGVmaW5lIFJUNTY2OF9EQUNfUjFfVk9MX01BU0sJCQkoMHhmZikKKyNkZWZpbmUgUlQ1NjY4X0RBQ19SMV9WT0xfU0hJRlQJCQkwCisKKy8qIEFEQyBEaWdpdGFsIFZvbHVtZSBDb250cm9sICgweDAwMWMpICovCisjZGVmaW5lIFJUNTY2OF9BRENfTF9NVVRFX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfQURDX0xfTVVURV9TSElGVAkJCTE1CisjZGVmaW5lIFJUNTY2OF9BRENfTF9WT0xfTUFTSwkJCSgweDdmIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9BRENfTF9WT0xfU0hJRlQJCQk4CisjZGVmaW5lIFJUNTY2OF9BRENfUl9NVVRFX01BU0sJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2OF9BRENfUl9NVVRFX1NISUZUCQkJNworI2RlZmluZSBSVDU2NjhfQURDX1JfVk9MX01BU0sJCQkoMHg3ZikKKyNkZWZpbmUgUlQ1NjY4X0FEQ19SX1ZPTF9TSElGVAkJCTAKKworLyogU3RlcmVvIEFEQyBNaXhlciBDb250cm9sICgweDAwMjYpICovCisjZGVmaW5lIFJUNTY2OF9NX1NUTzFfQURDX0wxCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X01fU1RPMV9BRENfTDFfU0hJRlQJCTE1CisjZGVmaW5lIFJUNTY2OF9NX1NUTzFfQURDX0wyCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X01fU1RPMV9BRENfTDJfU0hJRlQJCTE0CisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19MMV9TUkMJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfTDFfU1JDX1NISUZUCQkxMworI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfTDJfU1JDCQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX0wyX1NSQ19TSElGVAkJMTIKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX0xfU1JDCQkJKDB4MyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX0xfU1JDX1NISUZUCQkxMAorI2RlZmluZSBSVDU2NjhfTV9TVE8xX0FEQ19SMQkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjY4X01fU1RPMV9BRENfUjFfU0hJRlQJCTcKKyNkZWZpbmUgUlQ1NjY4X01fU1RPMV9BRENfUjIJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9NX1NUTzFfQURDX1IyX1NISUZUCQk2CisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19SMV9TUkMJCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19SMV9TUkNfU0hJRlQJCTUKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX1IyX1NSQwkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X1NUTzFfQURDX1IyX1NSQ19TSElGVAkJNAorI2RlZmluZSBSVDU2NjhfU1RPMV9BRENfUl9TUkMJCQkoMHgzIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9TVE8xX0FEQ19SX1NSQ19TSElGVAkJMgorCisvKiBBREMgTWl4ZXIgdG8gREFDIE1peGVyIENvbnRyb2wgKDB4MDAyOSkgKi8KKyNkZWZpbmUgUlQ1NjY4X01fQURDTUlYX0wJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfTV9BRENNSVhfTF9TSElGVAkJCTE1CisjZGVmaW5lIFJUNTY2OF9NX0RBQzFfTAkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfTV9EQUMxX0xfU0hJRlQJCQkxNAorI2RlZmluZSBSVDU2NjhfTV9BRENNSVhfUgkJCSgweDEgPDwgNykKKyNkZWZpbmUgUlQ1NjY4X01fQURDTUlYX1JfU0hJRlQJCQk3CisjZGVmaW5lIFJUNTY2OF9NX0RBQzFfUgkJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9NX0RBQzFfUl9TSElGVAkJCTYKKworLyogU3RlcmVvIERBQyBNaXhlciBDb250cm9sICgweDAwMmEpICovCisjZGVmaW5lIFJUNTY2OF9NX0RBQ19MMV9TVE9fTAkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9NX0RBQ19MMV9TVE9fTF9TSElGVAkJMTUKKyNkZWZpbmUgUlQ1NjY4X01fREFDX1IxX1NUT19MCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjY4X01fREFDX1IxX1NUT19MX1NISUZUCQkxMworI2RlZmluZSBSVDU2NjhfTV9EQUNfTDFfU1RPX1IJCQkoMHgxIDw8IDcpCisjZGVmaW5lIFJUNTY2OF9NX0RBQ19MMV9TVE9fUl9TSElGVAkJNworI2RlZmluZSBSVDU2NjhfTV9EQUNfUjFfU1RPX1IJCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2OF9NX0RBQ19SMV9TVE9fUl9TSElGVAkJNQorCisvKiBQb3dlciBNYW5hZ2VtZW50IGZvciBEaWdpdGFsIDEgKDB4MDA2MSkgKi8KKyNkZWZpbmUgUlQ1NjY4X1BXUl9JMlMxCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9QV1JfSTJTMV9TSElGVAkJCTE1CisjZGVmaW5lIFJUNTY2OF9QV1JfREFDX0wxCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9EQUNfTDFfU0hJRlQJCQkxMQorI2RlZmluZSBSVDU2NjhfUFdSX0RBQ19SMQkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9QV1JfREFDX1IxX1NISUZUCQkJMTAKKyNkZWZpbmUgUlQ1NjY4X1BXUl9MRE9fREFDUkVGX01BU0sJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9MRE9fREFDUkVGX1NISUZUCQk4CisjZGVmaW5lIFJUNTY2OF9QV1JfTERPX0RBQ1JFRl9PTgkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjhfUFdSX0xET19EQUNSRUZfRE9XTgkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2NjhfUFdSX0xET19TSElGVAkJCTgKKyNkZWZpbmUgUlQ1NjY4X1BXUl9BRENfTDEJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9QV1JfQURDX0wxX1NISUZUCQkJNAorI2RlZmluZSBSVDU2NjhfUFdSX0FEQ19SMQkJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjY4X1BXUl9BRENfUjFfU0hJRlQJCQkzCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIERpZ2l0YWwgMiAoMHgwMDYyKSAqLworI2RlZmluZSBSVDU2NjhfUFdSX0FEQ19TMUYJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfUFdSX0FEQ19TMUZfU0hJRlQJCTE1CisjZGVmaW5lIFJUNTY2OF9QV1JfREFDX1MxRgkJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2OF9QV1JfREFDX1MxRl9TSElGVAkJMTAKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgQW5hbG9nIDEgKDB4MDA2MykgKi8KKyNkZWZpbmUgUlQ1NjY4X1BXUl9WUkVGMQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9QV1JfVlJFRjFfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9QV1JfVlJFRjFfU0hJRlQJCQkxNQorI2RlZmluZSBSVDU2NjhfUFdSX0ZWMQkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfUFdSX0ZWMV9NQVNLCQkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9GVjFfU0hJRlQJCQkxNAorI2RlZmluZSBSVDU2NjhfUFdSX1ZSRUYyCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjY4X1BXUl9WUkVGMl9NQVNLCQkJKDB4MSA8PCAxMykKKyNkZWZpbmUgUlQ1NjY4X1BXUl9WUkVGMl9TSElGVAkJCTEzCisjZGVmaW5lIFJUNTY2OF9QV1JfRlYyCQkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9QV1JfRlYyX01BU0sJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfUFdSX0ZWMl9TSElGVAkJCTEyCisjZGVmaW5lIFJUNTY2OF9QV1JfTUIJCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjhfUFdSX01CX01BU0sJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2OF9QV1JfTUJfU0hJRlQJCQk5CisjZGVmaW5lIFJUNTY2OF9BTVBfSFBfTUFTSwkJCSgweDMgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X0FNUF9IUF9TSElGVAkJCTIKKyNkZWZpbmUgUlQ1NjY4X0FNUF9IUF8xWAkJCSgweDAgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X0FNUF9IUF8zWAkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X0FNUF9IUF81WAkJCSgweDMgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X0xETzFfRFZPX01BU0sJCQkoMHgzKQorI2RlZmluZSBSVDU2NjhfTERPMV9EVk9fU0hJRlQJCQkwCisjZGVmaW5lIFJUNTY2OF9MRE8xX0RWT18wXzlWCQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjY4X0xETzFfRFZPXzFfMFYJCQkoMHgxKQorI2RlZmluZSBSVDU2NjhfTERPMV9EVk9fMV8yVgkJCSgweDIpCisjZGVmaW5lIFJUNTY2OF9MRE8xX0RWT18xXzRWCQkJKDB4MykKKworLyogUG93ZXIgTWFuYWdlbWVudCBmb3IgQW5hbG9nIDIgKDB4MDA2NCkgKi8KKyNkZWZpbmUgUlQ1NjY4X1BXUl9CU1QxCQkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9QV1JfQlNUMV9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9CU1QxX1NISUZUCQkJMTUKKyNkZWZpbmUgUlQ1NjY4X1BXUl9CU1QxX09GRgkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9QV1JfQlNUMV9PTgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9QV1JfQlNUMgkJCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfUFdSX0JTVDJfTUFTSwkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9QV1JfQlNUMl9TSElGVAkJCTE0CisjZGVmaW5lIFJUNTY2OF9QV1JfTUIxCQkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2OF9QV1JfTUIxX1NISUZUCQkJMTEKKyNkZWZpbmUgUlQ1NjY4X1BXUl9NQjIJCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9NQjJfU0hJRlQJCQkxMAorI2RlZmluZSBSVDU2NjhfUFdSX0JTVDJfT1AJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9QV1JfQlNUMl9PUF9NQVNLCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjhfUFdSX0JTVDJfT1BfU0hJRlQJCTYKKyNkZWZpbmUgUlQ1NjY4X1BXUl9KRDEJCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjhfUFdSX0pEMV9NQVNLCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjhfUFdSX0pEMV9TSElGVAkJCTMKKyNkZWZpbmUgUlQ1NjY4X1BXUl9KRDIJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjhfUFdSX0pEMl9NQVNLCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjhfUFdSX0pEMl9TSElGVAkJCTIKKyNkZWZpbmUgUlQ1NjY4X1BXUl9SRUNNSVgxCQkJKDB4MSA8PCAxKQorI2RlZmluZSBSVDU2NjhfUFdSX1JFQ01JWDFfU0hJRlQJCTEKKyNkZWZpbmUgUlQ1NjY4X1BXUl9SRUNNSVgyCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9SRUNNSVgyX1NISUZUCQkwCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIEFuYWxvZyAzICgweDAwNjUpICovCisjZGVmaW5lIFJUNTY2OF9QV1JfQ0JKX01BU0sJCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2OF9QV1JfQ0JKX1NISUZUCQkJOQorI2RlZmluZSBSVDU2NjhfUFdSX0NCSl9PRkYJCQkoMHgwIDw8IDkpCisjZGVmaW5lIFJUNTY2OF9QV1JfQ0JKX09OCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjhfUFdSX1BMTAkJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9QV1JfUExMX1NISUZUCQkJNgorI2RlZmluZSBSVDU2NjhfUFdSX0xETzIJCQkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjhfUFdSX0xETzJfU0hJRlQJCQkyCisKKy8qIFBvd2VyIE1hbmFnZW1lbnQgZm9yIFZvbHVtZSAoMHgwMDY3KSAqLworI2RlZmluZSBSVDU2NjhfUFdSX01JQ19ERVQJCQkoMHgxIDw8IDUpCisjZGVmaW5lIFJUNTY2OF9QV1JfTUlDX0RFVF9TSElGVAkJNQorCisvKiBNQ0xLIGFuZCBTeXN0ZW0gQ2xvY2sgRGV0ZWN0aW9uIENvbnRyb2wgKDB4MDA2YikgKi8KKyNkZWZpbmUgUlQ1NjY4X0VOX0FOQV9DTEtfREVUX01BU0sJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9FTl9BTkFfQ0xLX0RFVF9TSElGVAkJMTUKKyNkZWZpbmUgUlQ1NjY4X0VOX0FOQV9DTEtfREVUX0RJUwkJKDB4MCA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0VOX0FOQV9DTEtfREVUX0FVVE8JCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9QV1JfQ0xLX0RFVF9NQVNLCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjY4X1BXUl9DTEtfREVUX1NISUZUCQkwCisjZGVmaW5lIFJUNTY2OF9QV1JfQ0xLX0RFVF9ESVMJCQkoMHgwKQorI2RlZmluZSBSVDU2NjhfUFdSX0NMS19ERVRfRU4JCQkoMHgxKQorCisvKiBJMlMxIEF1ZGlvIFNlcmlhbCBEYXRhIFBvcnQgQ29udHJvbCAoMHgwMDcwKSAqLworI2RlZmluZSBSVDU2NjhfSTJTX01TX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfSTJTX01TX1NISUZUCQkJMTUKKyNkZWZpbmUgUlQ1NjY4X0kyU19NU19NCQkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9JMlNfTVNfUwkJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfSTJTX0JQX01BU0sJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9JMlNfQlBfU0hJRlQJCQk4CisjZGVmaW5lIFJUNTY2OF9JMlNfQlBfTk9SCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2NjhfSTJTX0JQX0lOVgkJCSgweDEgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X0kyU19ETF9NQVNLCQkJKDB4MyA8PCA0KQorI2RlZmluZSBSVDU2NjhfSTJTX0RMX1NISUZUCQkJNAorI2RlZmluZSBSVDU2NjhfSTJTX0RMXzE2CQkJKDB4MCA8PCA0KQorI2RlZmluZSBSVDU2NjhfSTJTX0RMXzIwCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjhfSTJTX0RMXzI0CQkJKDB4MiA8PCA0KQorI2RlZmluZSBSVDU2NjhfSTJTX0RMXzgJCQkJKDB4MyA8PCA0KQorI2RlZmluZSBSVDU2NjhfSTJTX0RGX01BU0sJCQkoMHg3KQorI2RlZmluZSBSVDU2NjhfSTJTX0RGX1NISUZUCQkJMAorI2RlZmluZSBSVDU2NjhfSTJTX0RGX0kyUwkJCSgweDApCisjZGVmaW5lIFJUNTY2OF9JMlNfREZfTEVGVAkJCSgweDEpCisjZGVmaW5lIFJUNTY2OF9JMlNfREZfUENNX0EJCQkoMHgyKQorI2RlZmluZSBSVDU2NjhfSTJTX0RGX1BDTV9CCQkJKDB4MykKKyNkZWZpbmUgUlQ1NjY4X0kyU19ERl9QQ01fQV9OCQkJKDB4NikKKyNkZWZpbmUgUlQ1NjY4X0kyU19ERl9QQ01fQl9OCQkJKDB4NykKKworLyogQURDL0RBQyBDbG9jayBDb250cm9sIDEgKDB4MDA3MykgKi8KKyNkZWZpbmUgUlQ1NjY4X0kyU19QRDFfTUFTSwkJCSgweDcgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9JMlNfUEQxX1NISUZUCQkJMTIKKyNkZWZpbmUgUlQ1NjY4X01fSTJTX0RJVl9NQVNLCQkJKDB4NyA8PCA4KQorI2RlZmluZSBSVDU2NjhfTV9JMlNfRElWX1NISUZUCQkJOAorI2RlZmluZSBSVDU2NjhfQ0xLX1NSQ19NQVNLCQkJKDB4MyA8PCA0KQorI2RlZmluZSBSVDU2NjhfQ0xLX1NSQ19NQ0xLCQkJKDB4MCA8PCA0KQorI2RlZmluZSBSVDU2NjhfQ0xLX1NSQ19QTExfT1VUCQkJKDB4MSA8PCA0KQorI2RlZmluZSBSVDU2NjhfQ0xLX1NSQ19ESVYJCQkoMHgyIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9DTEtfU1JDX1JDCQkJKDB4MyA8PCA0KQorI2RlZmluZSBSVDU2NjhfREFDX09TUl9NQVNLCQkJKDB4MyA8PCAyKQorI2RlZmluZSBSVDU2NjhfREFDX09TUl9TSElGVAkJCTIKKyNkZWZpbmUgUlQ1NjY4X0RBQ19PU1JfMTI4CQkJKDB4MCA8PCAyKQorI2RlZmluZSBSVDU2NjhfREFDX09TUl82NAkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X0RBQ19PU1JfMzIJCQkoMHgyIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9BRENfT1NSX01BU0sJCQkoMHgzKQorI2RlZmluZSBSVDU2NjhfQURDX09TUl9TSElGVAkJCTAKKyNkZWZpbmUgUlQ1NjY4X0FEQ19PU1JfMTI4CQkJKDB4MCkKKyNkZWZpbmUgUlQ1NjY4X0FEQ19PU1JfNjQJCQkoMHgxKQorI2RlZmluZSBSVDU2NjhfQURDX09TUl8zMgkJCSgweDIpCisKKy8qIFRETTEgY29udHJvbCAxICgweDAwNzgpICovCisjZGVmaW5lIFJUNTY2OF9URE1fTU9ERV9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X1RETV9NT0RFX1NISUZUCQkJMTUKKyNkZWZpbmUgUlQ1NjY4X1RETV9NT0RFX0kyUwkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9URE1fTU9ERV9URE0JCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfVERNX0lOX0NIX01BU0sJCQkoMHgzIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfVERNX0lOX0NIX1NISUZUCQkJMTAKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9DSF8yCQkJKDB4MCA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9DSF80CQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9DSF82CQkJKDB4MiA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9DSF84CQkJKDB4MyA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfQ0hfTUFTSwkJCSgweDMgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfQ0hfU0hJRlQJCQk4CisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0NIXzIJCQkoMHgwIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0NIXzQJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0NIXzYJCQkoMHgyIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0NIXzgJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9URE1fSU5fTEVOX01BU0sJCQkoMHgzIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9URE1fSU5fTEVOX1NISUZUCQkJNgorI2RlZmluZSBSVDU2NjhfVERNX0lOX0xFTl8xNgkJCSgweDAgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X1RETV9JTl9MRU5fMjAJCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9URE1fSU5fTEVOXzI0CQkJKDB4MiA8PCA2KQorI2RlZmluZSBSVDU2NjhfVERNX0lOX0xFTl8zMgkJCSgweDMgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfTEVOX01BU0sJCQkoMHgzIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0xFTl9TSElGVAkJNAorI2RlZmluZSBSVDU2NjhfVERNX09VVF9MRU5fMTYJCQkoMHgwIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9URE1fT1VUX0xFTl8yMAkJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X1RETV9PVVRfTEVOXzI0CQkJKDB4MiA8PCA0KQorI2RlZmluZSBSVDU2NjhfVERNX09VVF9MRU5fMzIJCQkoMHgzIDw8IDQpCisKKy8qIEdsb2JhbCBDbG9jayBDb250cm9sICgweDAwODApICovCisjZGVmaW5lIFJUNTY2OF9TQ0xLX1NSQ19NQVNLCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X1NDTEtfU1JDX1NISUZUCQkJMTQKKyNkZWZpbmUgUlQ1NjY4X1NDTEtfU1JDX01DTEsJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjhfU0NMS19TUkNfUExMMQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9TQ0xLX1NSQ19SQ0NMSwkJCSgweDIgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9QTEwxX1NSQ19NQVNLCQkJKDB4NyA8PCA4KQorI2RlZmluZSBSVDU2NjhfUExMMV9TUkNfU0hJRlQJCQk4CisjZGVmaW5lIFJUNTY2OF9QTEwxX1NSQ19NQ0xLCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2NjhfUExMMV9TUkNfQkNMSzEJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9QTEwxX1BEX01BU0sJCQkoMHgxIDw8IDQpCisjZGVmaW5lIFJUNTY2OF9QTEwxX1BEX1NISUZUCQkJNAorCisjZGVmaW5lIFJUNTY2OF9QTExfSU5QX01BWAkJCTQwMDAwMDAwCisjZGVmaW5lIFJUNTY2OF9QTExfSU5QX01JTgkJCTI1NjAwMAorLyogUExMIE0vTi9LIENvZGUgQ29udHJvbCAxICgweDAwODEpICovCisjZGVmaW5lIFJUNTY2OF9QTExfTl9NQVgJCQkweDAwMWZmCisjZGVmaW5lIFJUNTY2OF9QTExfTl9NQVNLCQkJKFJUNTY2OF9QTExfTl9NQVggPDwgNykKKyNkZWZpbmUgUlQ1NjY4X1BMTF9OX1NISUZUCQkJNworI2RlZmluZSBSVDU2NjhfUExMX0tfTUFYCQkJMHgwMDFmCisjZGVmaW5lIFJUNTY2OF9QTExfS19NQVNLCQkJKFJUNTY2OF9QTExfS19NQVgpCisjZGVmaW5lIFJUNTY2OF9QTExfS19TSElGVAkJCTAKKworLyogUExMIE0vTi9LIENvZGUgQ29udHJvbCAyICgweDAwODIpICovCisjZGVmaW5lIFJUNTY2OF9QTExfTV9NQVgJCQkweDAwZgorI2RlZmluZSBSVDU2NjhfUExMX01fTUFTSwkJCShSVDU2NjhfUExMX01fTUFYIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfUExMX01fU0hJRlQJCQkxMgorI2RlZmluZSBSVDU2NjhfUExMX01fQlAJCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjY4X1BMTF9NX0JQX1NISUZUCQkJMTEKKworLyogUExMIHRyYWNraW5nIG1vZGUgMSAoMHgwMDgzKSAqLworI2RlZmluZSBSVDU2NjhfSTJTMV9BU1JDX01BU0sJCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjhfSTJTMV9BU1JDX1NISUZUCQkJMTMKKyNkZWZpbmUgUlQ1NjY4X0RBQ19TVE8xX0FTUkNfTUFTSwkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjY4X0RBQ19TVE8xX0FTUkNfU0hJRlQJCTEyCisjZGVmaW5lIFJUNTY2OF9BRENfU1RPMV9BU1JDX01BU0sJCSgweDEgPDwgNCkKKyNkZWZpbmUgUlQ1NjY4X0FEQ19TVE8xX0FTUkNfU0hJRlQJCTQKKworLyogUExMIHRyYWNraW5nIG1vZGUgMiAoMHgwMDg0KSovCisjZGVmaW5lIFJUNTY2OF9EQV9TVE8xX1RSQUNLX01BU0sJCSgweDcgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9EQV9TVE8xX1RSQUNLX1NISUZUCQkxMgorI2RlZmluZSBSVDU2NjhfREFfU1RPMV9UUkFDS19TWVNDTEsJCSgweDAgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9EQV9TVE8xX1RSQUNLX0kyUzEJCSgweDEgPDwgMTIpCisKKy8qIFBMTCB0cmFja2luZyBtb2RlIDMgKDB4MDA4NSkqLworI2RlZmluZSBSVDU2NjhfQURfU1RPMV9UUkFDS19NQVNLCQkoMHg3IDw8IDEyKQorI2RlZmluZSBSVDU2NjhfQURfU1RPMV9UUkFDS19TSElGVAkJMTIKKyNkZWZpbmUgUlQ1NjY4X0FEX1NUTzFfVFJBQ0tfU1lTQ0xLCQkoMHgwIDw8IDEyKQorI2RlZmluZSBSVDU2NjhfQURfU1RPMV9UUkFDS19JMlMxCQkoMHgxIDw8IDEyKQorCisvKiBIUE9VVCBDaGFyZ2UgcHVtcCBjb250cm9sIDEgKDB4MDA5MSkgKi8KKyNkZWZpbmUgUlQ1NjY4X09TV19IUF9MX01BU0sJCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjhfT1NXX0hQX0xfU0hJRlQJCQkxMQorI2RlZmluZSBSVDU2NjhfT1NXX0hQX0xfRU4JCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjhfT1NXX0hQX0xfRElTCQkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjY4X09TV19IUF9SX01BU0sJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfT1NXX0hQX1JfU0hJRlQJCQkxMAorI2RlZmluZSBSVDU2NjhfT1NXX0hQX1JfRU4JCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjhfT1NXX0hQX1JfRElTCQkJKDB4MCA8PCAxMCkKKyNkZWZpbmUgUlQ1NjY4X1NFTF9QTV9IUF9NQVNLCQkJKDB4MyA8PCA4KQorI2RlZmluZSBSVDU2NjhfU0VMX1BNX0hQX1NISUZUCQkJOAorI2RlZmluZSBSVDU2NjhfU0VMX1BNX0hQXzBfNgkJCSgweDAgPDwgOCkKKyNkZWZpbmUgUlQ1NjY4X1NFTF9QTV9IUF8wXzkJCQkoMHgxIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9TRUxfUE1fSFBfMV84CQkJKDB4MiA8PCA4KQorI2RlZmluZSBSVDU2NjhfU0VMX1BNX0hQX0hJR0gJCQkoMHgzIDw8IDgpCisjZGVmaW5lIFJUNTY2OF9PVkNEX0hQX01BU0sJCQkoMHgxIDw8IDIpCisjZGVmaW5lIFJUNTY2OF9PVkNEX0hQX1NISUZUCQkJMgorI2RlZmluZSBSVDU2NjhfT1ZDRF9IUF9FTgkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjY4X09WQ0RfSFBfRElTCQkJKDB4MCA8PCAyKQorCisvKiBSQyBDbG9jayBDb250cm9sICgweDAwOTQpICovCisjZGVmaW5lIFJUNTY2OF9ESUdfMjVNX0NMS19NQVNLCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjhfRElHXzI1TV9DTEtfU0hJRlQJCTkKKyNkZWZpbmUgUlQ1NjY4X0RJR18yNU1fQ0xLX0RJUwkJCSgweDAgPDwgOSkKKyNkZWZpbmUgUlQ1NjY4X0RJR18yNU1fQ0xLX0VOCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjhfRElHXzFNX0NMS19NQVNLCQkJKDB4MSA8PCA4KQorI2RlZmluZSBSVDU2NjhfRElHXzFNX0NMS19TSElGVAkJCTgKKyNkZWZpbmUgUlQ1NjY4X0RJR18xTV9DTEtfRElTCQkJKDB4MCA8PCA4KQorI2RlZmluZSBSVDU2NjhfRElHXzFNX0NMS19FTgkJCSgweDEgPDwgOCkKKworLyogQXV0byBUdXJuIE9uIDFNIFJDIENMSyAoMHgwMDlmKSAqLworI2RlZmluZSBSVDU2NjhfSVJRX1BPV19TQVZfTUFTSwkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9JUlFfUE9XX1NBVl9TSElGVAkJMTUKKyNkZWZpbmUgUlQ1NjY4X0lSUV9QT1dfU0FWX0RJUwkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9JUlFfUE9XX1NBVl9FTgkJCSgweDEgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9JUlFfUE9XX1NBVl9KRDFfTUFTSwkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X0lSUV9QT1dfU0FWX0pEMV9TSElGVAkJMTQKKyNkZWZpbmUgUlQ1NjY4X0lSUV9QT1dfU0FWX0pEMV9ESVMJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9JUlFfUE9XX1NBVl9KRDFfRU4JCSgweDEgPDwgMTQpCisKKy8qIElSUSBDb250cm9sIDEgKDB4MDBiNikgKi8KKyNkZWZpbmUgUlQ1NjY4X0VOX0NCX0pEX01BU0sJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2OF9FTl9DQl9KRF9TSElGVAkJCTMKKyNkZWZpbmUgUlQ1NjY4X0VOX0NCX0pEX0VOCQkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjhfRU5fQ0JfSkRfRElTCQkJKDB4MCA8PCAzKQorCisvKiBJUlEgQ29udHJvbCAzICgweDAwYjgpICovCisjZGVmaW5lIFJUNTY2OF9FTl9JUlFfSU5MSU5FX01BU0sJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjY4X0VOX0lSUV9JTkxJTkVfU0hJRlQJCTYKKyNkZWZpbmUgUlQ1NjY4X0VOX0lSUV9JTkxJTkVfQllQCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTY2OF9FTl9JUlFfSU5MSU5FX05PUgkJKDB4MSA8PCA2KQorCisvKiBHUElPIENvbnRyb2wgMSAoMHgwMGMwKSAqLworI2RlZmluZSBSVDU2NjhfR1AxX1BJTl9NQVNLCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjY4X0dQMV9QSU5fU0hJRlQJCQkxNQorI2RlZmluZSBSVDU2NjhfR1AxX1BJTl9HUElPMQkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2OF9HUDFfUElOX0lSUQkJCSgweDEgPDwgMTUpCisKKy8qIEdQSU8gQ29udHJvbCAyICgweDAwYzEpICovCisjZGVmaW5lIFJUNTY2OF9HUDRfUElOX0NPTkZfTUFTSwkJKDB4MSA8PCA1KQorI2RlZmluZSBSVDU2NjhfR1A0X1BJTl9DT05GX1NISUZUCQk1CisjZGVmaW5lIFJUNTY2OF9HUDRfUElOX0NPTkZfSU5QVVQJCSgweDAgPDwgNSkKKyNkZWZpbmUgUlQ1NjY4X0dQNF9QSU5fQ09ORl9PVVRQVVQJCSgweDEgPDwgNSkKKworLyogR1BJTyBDb250cm9sIDIgKDB4MDBjMikgKi8KKyNkZWZpbmUgUlQ1NjY4X0dQOF9QSU5fQ09ORl9NQVNLCQkoMHgxIDw8IDEzKQorI2RlZmluZSBSVDU2NjhfR1A4X1BJTl9DT05GX1NISUZUCQkxMworI2RlZmluZSBSVDU2NjhfR1A4X1BJTl9DT05GX0lOUFVUCQkoMHgwIDw8IDEzKQorI2RlZmluZSBSVDU2NjhfR1A4X1BJTl9DT05GX09VVFBVVAkJKDB4MSA8PCAxMykKKworLyogNCBCdXR0b25zIElubGluZSBDb21tYW5kIEZ1bmN0aW9uIDEgKDB4MDBkZikgKi8KKyNkZWZpbmUgUlQ1NjY4XzRCVE5fQ0xLX0RFQl9NQVNLCQkoMHgzIDw8IDIpCisjZGVmaW5lIFJUNTY2OF80QlROX0NMS19ERUJfU0hJRlQJCTIKKyNkZWZpbmUgUlQ1NjY4XzRCVE5fQ0xLX0RFQl84TVMJCQkoMHgwIDw8IDIpCisjZGVmaW5lIFJUNTY2OF80QlROX0NMS19ERUJfMTZNUwkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjhfNEJUTl9DTEtfREVCXzMyTVMJCSgweDIgPDwgMikKKyNkZWZpbmUgUlQ1NjY4XzRCVE5fQ0xLX0RFQl82NU1TCQkoMHgzIDw8IDIpCisKKy8qIElubGluZSBDb21tYW5kIEZ1bmN0aW9uIDYgKDB4MDBlMCkgKi8KKyNkZWZpbmUgUlQ1NjY4X0VOXzRCVE5fSU5MX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfRU5fNEJUTl9JTkxfU0hJRlQJCTE1CisjZGVmaW5lIFJUNTY2OF9FTl80QlROX0lOTF9ESVMJCQkoMHgwIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfRU5fNEJUTl9JTkxfRU4JCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjhfUkVTRVRfNEJUTl9JTkxfTUFTSwkJKDB4MSA8PCAxNCkKKyNkZWZpbmUgUlQ1NjY4X1JFU0VUXzRCVE5fSU5MX1NISUZUCQkxNAorI2RlZmluZSBSVDU2NjhfUkVTRVRfNEJUTl9JTkxfUkVTRVQJCSgweDAgPDwgMTQpCisjZGVmaW5lIFJUNTY2OF9SRVNFVF80QlROX0lOTF9OT1IJCSgweDEgPDwgMTQpCisKKy8qIERpZ2l0YWwgTWlzYyBDb250cm9sICgweDAwZmEpICovCisjZGVmaW5lIFJUNTY2OF9ESUdfR0FURV9DVFJMX01BU0sJCTB4MQorI2RlZmluZSBSVDU2NjhfRElHX0dBVEVfQ1RSTF9TSElGVAkJKDApCisjZGVmaW5lIFJUNTY2OF9ESUdfR0FURV9DVFJMX0RJUwkJMHgwCisjZGVmaW5lIFJUNTY2OF9ESUdfR0FURV9DVFJMX0VOCQkJMHgxCisKKy8qIENob3BwZXIgYW5kIENsb2NrIGNvbnRyb2wgZm9yIERBQyBMICgweDAxM2EpKi8KKyNkZWZpbmUgUlQ1NjY4X0NLWEVOX0RBQzFfTUFTSwkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2OF9DS1hFTl9EQUMxX1NISUZUCQkJMTMKKyNkZWZpbmUgUlQ1NjY4X0NLR0VOX0RBQzFfTUFTSwkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9DS0dFTl9EQUMxX1NISUZUCQkJMTIKKworLyogQ2hvcHBlciBhbmQgQ2xvY2sgY29udHJvbCBmb3IgQURDICgweDAxM2IpKi8KKyNkZWZpbmUgUlQ1NjY4X0NLWEVOX0FEQ0NfTUFTSwkJCSgweDEgPDwgMTMpCisjZGVmaW5lIFJUNTY2OF9DS1hFTl9BRENDX1NISUZUCQkJMTMKKyNkZWZpbmUgUlQ1NjY4X0NLR0VOX0FEQ0NfTUFTSwkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2OF9DS0dFTl9BRENDX1NISUZUCQkJMTIKKworLyogSFAgQmVoYXZpb3IgTG9naWMgQ29udHJvbCAyICgweDAxZGIpICovCisjZGVmaW5lIFJUNTY2OF9IUF9TSUdfU1JDMV9NQVNLCQkJKDB4MykKKyNkZWZpbmUgUlQ1NjY4X0hQX1NJR19TUkMxX1NISUZUCQkwCisjZGVmaW5lIFJUNTY2OF9IUF9TSUdfU1JDMV9IUF9EQwkJKDB4MCkKKyNkZWZpbmUgUlQ1NjY4X0hQX1NJR19TUkMxX0hQX0NBTElCCQkoMHgxKQorI2RlZmluZSBSVDU2NjhfSFBfU0lHX1NSQzFfUkVHCQkJKDB4MikKKyNkZWZpbmUgUlQ1NjY4X0hQX1NJR19TUkMxX1NJTEVOQ0UJCSgweDMpCisKKy8qIFJUNTY2MyBzcGVjaWZpYyByZWdpc3RlciAqLworI2RlZmluZSBSVDU2NjNfSFBfT1VUX0VOCQkJMHgwMDAyCisjZGVmaW5lIFJUNTY2M19IUF9MQ0hfRFJFCQkJMHgwMDA1CisjZGVmaW5lIFJUNTY2M19IUF9SQ0hfRFJFCQkJMHgwMDA2CisjZGVmaW5lIFJUNTY2M19DQUxJQl9CU1QJCQkweDAwMGEKKyNkZWZpbmUgUlQ1NjYzX1JFQ01JWAkJCQkweDAwMTAKKyNkZWZpbmUgUlQ1NjYzX1NJTF9ERVRfQ1RMCQkJMHgwMDE1CisjZGVmaW5lIFJUNTY2M19QV1JfU0FWX1NJTERFVAkJCTB4MDAxNgorI2RlZmluZSBSVDU2NjNfU0lERVRPTkVfQ1RMCQkJMHgwMDE4CisjZGVmaW5lIFJUNTY2M19TVE8xX0RBQ19ESUdfVk9MCQkJMHgwMDE5CisjZGVmaW5lIFJUNTY2M19TVE8xX0FEQ19ESUdfVk9MCQkJMHgwMDFjCisjZGVmaW5lIFJUNTY2M19TVE8xX0JPT1NUCQkJMHgwMDFmCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfR0FJTl8xCQkJMHgwMDIyCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfR0FJTl8yCQkJMHgwMDIzCisjZGVmaW5lIFJUNTY2M19TVE8xX0FEQ19NSVhFUgkJCTB4MDAyNgorI2RlZmluZSBSVDU2NjNfQURfREFfTUlYRVIJCQkweDAwMjkKKyNkZWZpbmUgUlQ1NjYzX1NUT19EQUNfTUlYRVIJCQkweDAwMmEKKyNkZWZpbmUgUlQ1NjYzX0RJR19TSURFX01JWEVSCQkJMHgwMDJjCisjZGVmaW5lIFJUNTY2M19CWVBBU1NfU1RPX0RBQwkJCTB4MDAyZAorI2RlZmluZSBSVDU2NjNfQ0FMSUJfUkVDX01JWAkJCTB4MDA0MAorI2RlZmluZSBSVDU2NjNfUFdSX0RJR18xCQkJMHgwMDYxCisjZGVmaW5lIFJUNTY2M19QV1JfRElHXzIJCQkweDAwNjIKKyNkZWZpbmUgUlQ1NjYzX1BXUl9BTkxHXzEJCQkweDAwNjMKKyNkZWZpbmUgUlQ1NjYzX1BXUl9BTkxHXzIJCQkweDAwNjQKKyNkZWZpbmUgUlQ1NjYzX1BXUl9BTkxHXzMJCQkweDAwNjUKKyNkZWZpbmUgUlQ1NjYzX1BXUl9NSVhFUgkJCTB4MDA2NgorI2RlZmluZSBSVDU2NjNfU0lHX0NMS19ERVQJCQkweDAwNmIKKyNkZWZpbmUgUlQ1NjYzX1BSRV9ESVZfR0FUSU5HXzEJCQkweDAwNmUKKyNkZWZpbmUgUlQ1NjYzX1BSRV9ESVZfR0FUSU5HXzIJCQkweDAwNmYKKyNkZWZpbmUgUlQ1NjYzX0kyUzFfU0RQCQkJCTB4MDA3MAorI2RlZmluZSBSVDU2NjNfQUREQV9DTEtfMQkJCTB4MDA3MworI2RlZmluZSBSVDU2NjNfQUREQV9SU1QJCQkJMHgwMDc0CisjZGVmaW5lIFJUNTY2M19GUkFDX0RJVl8xCQkJMHgwMDc1CisjZGVmaW5lIFJUNTY2M19GUkFDX0RJVl8yCQkJMHgwMDc2CisjZGVmaW5lIFJUNTY2M19URE1fMQkJCQkweDAwNzcKKyNkZWZpbmUgUlQ1NjYzX1RETV8yCQkJCTB4MDA3OAorI2RlZmluZSBSVDU2NjNfVERNXzMJCQkJMHgwMDc5CisjZGVmaW5lIFJUNTY2M19URE1fNAkJCQkweDAwN2EKKyNkZWZpbmUgUlQ1NjYzX1RETV81CQkJCTB4MDA3YgorI2RlZmluZSBSVDU2NjNfR0xCX0NMSwkJCQkweDAwODAKKyNkZWZpbmUgUlQ1NjYzX1BMTF8xCQkJCTB4MDA4MQorI2RlZmluZSBSVDU2NjNfUExMXzIJCQkJMHgwMDgyCisjZGVmaW5lIFJUNTY2M19BU1JDXzEJCQkJMHgwMDgzCisjZGVmaW5lIFJUNTY2M19BU1JDXzIJCQkJMHgwMDg0CisjZGVmaW5lIFJUNTY2M19BU1JDXzQJCQkJMHgwMDg2CisjZGVmaW5lIFJUNTY2M19EVU1NWV9SRUcJCQkweDAwODcKKyNkZWZpbmUgUlQ1NjYzX0FTUkNfOAkJCQkweDAwOGEKKyNkZWZpbmUgUlQ1NjYzX0FTUkNfOQkJCQkweDAwOGIKKyNkZWZpbmUgUlQ1NjYzX0FTUkNfMTEJCQkJMHgwMDhjCisjZGVmaW5lIFJUNTY2M19ERVBPUF8xCQkJCTB4MDA4ZQorI2RlZmluZSBSVDU2NjNfREVQT1BfMgkJCQkweDAwOGYKKyNkZWZpbmUgUlQ1NjYzX0RFUE9QXzMJCQkJMHgwMDkwCisjZGVmaW5lIFJUNTY2M19IUF9DSEFSR0VfUFVNUF8xCQkJMHgwMDkxCisjZGVmaW5lIFJUNTY2M19IUF9DSEFSR0VfUFVNUF8yCQkJMHgwMDkyCisjZGVmaW5lIFJUNTY2M19NSUNCSUFTXzEJCQkweDAwOTMKKyNkZWZpbmUgUlQ1NjYzX1JDX0NMSwkJCQkweDAwOTQKKyNkZWZpbmUgUlQ1NjYzX0FTUkNfMTFfMgkJCTB4MDA5NworI2RlZmluZSBSVDU2NjNfRFVNTVlfUkVHXzIJCQkweDAwOTgKKyNkZWZpbmUgUlQ1NjYzX1JFQ19QQVRIX0dBSU4JCQkweDAwOWEKKyNkZWZpbmUgUlQ1NjYzX0FVVE9fMU1SQ19DTEsJCQkweDAwOWYKKyNkZWZpbmUgUlQ1NjYzX0FEQ19FUV8xCQkJCTB4MDBhZQorI2RlZmluZSBSVDU2NjNfQURDX0VRXzIJCQkJMHgwMGFmCisjZGVmaW5lIFJUNTY2M19JUlFfMQkJCQkweDAwYjYKKyNkZWZpbmUgUlQ1NjYzX0lSUV8yCQkJCTB4MDBiNworI2RlZmluZSBSVDU2NjNfSVJRXzMJCQkJMHgwMGI4CisjZGVmaW5lIFJUNTY2M19JUlFfNAkJCQkweDAwYmEKKyNkZWZpbmUgUlQ1NjYzX0lSUV81CQkJCTB4MDBiYgorI2RlZmluZSBSVDU2NjNfSU5UX1NUXzEJCQkJMHgwMGJlCisjZGVmaW5lIFJUNTY2M19JTlRfU1RfMgkJCQkweDAwYmYKKyNkZWZpbmUgUlQ1NjYzX0dQSU9fMQkJCQkweDAwYzAKKyNkZWZpbmUgUlQ1NjYzX0dQSU9fMgkJCQkweDAwYzEKKyNkZWZpbmUgUlQ1NjYzX0dQSU9fU1RBCQkJCTB4MDBjNQorI2RlZmluZSBSVDU2NjNfU0lOX0dFTl8xCQkJMHgwMGNiCisjZGVmaW5lIFJUNTY2M19TSU5fR0VOXzIJCQkweDAwY2MKKyNkZWZpbmUgUlQ1NjYzX1NJTl9HRU5fMwkJCTB4MDBjZAorI2RlZmluZSBSVDU2NjNfU09GX1ZPTF9aQzEJCQkweDAwZDkKKyNkZWZpbmUgUlQ1NjYzX0lMX0NNRF8xCQkJCTB4MDBkYgorI2RlZmluZSBSVDU2NjNfSUxfQ01EXzIJCQkJMHgwMGRjCisjZGVmaW5lIFJUNTY2M19JTF9DTURfMwkJCQkweDAwZGQKKyNkZWZpbmUgUlQ1NjYzX0lMX0NNRF80CQkJCTB4MDBkZQorI2RlZmluZSBSVDU2NjNfSUxfQ01EXzUJCQkJMHgwMGRmCisjZGVmaW5lIFJUNTY2M19JTF9DTURfNgkJCQkweDAwZTAKKyNkZWZpbmUgUlQ1NjYzX0lMX0NNRF83CQkJCTB4MDBlMQorI2RlZmluZSBSVDU2NjNfSUxfQ01EXzgJCQkJMHgwMGUyCisjZGVmaW5lIFJUNTY2M19JTF9DTURfUFdSU0FWMQkJCTB4MDBlNAorI2RlZmluZSBSVDU2NjNfSUxfQ01EX1BXUlNBVjIJCQkweDAwZTUKKyNkZWZpbmUgUlQ1NjYzX0VNX0pBQ0tfVFlQRV8xCQkJMHgwMGU2CisjZGVmaW5lIFJUNTY2M19FTV9KQUNLX1RZUEVfMgkJCTB4MDBlNworI2RlZmluZSBSVDU2NjNfRU1fSkFDS19UWVBFXzMJCQkweDAwZTgKKyNkZWZpbmUgUlQ1NjYzX0VNX0pBQ0tfVFlQRV80CQkJMHgwMGU5CisjZGVmaW5lIFJUNTY2M19FTV9KQUNLX1RZUEVfNQkJCTB4MDBlYQorI2RlZmluZSBSVDU2NjNfRU1fSkFDS19UWVBFXzYJCQkweDAwZWIKKyNkZWZpbmUgUlQ1NjYzX1NUTzFfSFBGX0FESjEJCQkweDAwZWMKKyNkZWZpbmUgUlQ1NjYzX1NUTzFfSFBGX0FESjIJCQkweDAwZWQKKyNkZWZpbmUgUlQ1NjYzX0ZBU1RfT0ZGX01JQ0JJQVMJCQkweDAwZjQKKyNkZWZpbmUgUlQ1NjYzX0pEX0NUUkwxCQkJCTB4MDBmNgorI2RlZmluZSBSVDU2NjNfSkRfQ1RSTDIJCQkJMHgwMGY4CisjZGVmaW5lIFJUNTY2M19ESUdfTUlTQwkJCQkweDAwZmEKKyNkZWZpbmUgUlQ1NjYzX0RJR19WT0xfWkNECQkJMHgwMTAwCisjZGVmaW5lIFJUNTY2M19BTkFfQklBU19DVVJfMQkJCTB4MDEwOAorI2RlZmluZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzIJCQkweDAxMDkKKyNkZWZpbmUgUlQ1NjYzX0FOQV9CSUFTX0NVUl8zCQkJMHgwMTBhCisjZGVmaW5lIFJUNTY2M19BTkFfQklBU19DVVJfNAkJCTB4MDEwYgorI2RlZmluZSBSVDU2NjNfQU5BX0JJQVNfQ1VSXzUJCQkweDAxMGMKKyNkZWZpbmUgUlQ1NjYzX0FOQV9CSUFTX0NVUl82CQkJMHgwMTBkCisjZGVmaW5lIFJUNTY2M19CSUFTX0NVUl81CQkJMHgwMTBlCisjZGVmaW5lIFJUNTY2M19CSUFTX0NVUl82CQkJMHgwMTBmCisjZGVmaW5lIFJUNTY2M19CSUFTX0NVUl83CQkJMHgwMTEwCisjZGVmaW5lIFJUNTY2M19CSUFTX0NVUl84CQkJMHgwMTExCisjZGVmaW5lIFJUNTY2M19EQUNSRUZfTERPCQkJMHgwMTEyCisjZGVmaW5lIFJUNTY2M19EVU1NWV9SRUdfMwkJCTB4MDExMworI2RlZmluZSBSVDU2NjNfQklBU19DVVJfOQkJCTB4MDExNAorI2RlZmluZSBSVDU2NjNfRFVNTVlfUkVHXzQJCQkweDAxMTYKKyNkZWZpbmUgUlQ1NjYzX1ZSRUZBREpfT1AJCQkweDAxMTcKKyNkZWZpbmUgUlQ1NjYzX1ZSRUZfUkVDTUlYCQkJMHgwMTE4CisjZGVmaW5lIFJUNTY2M19DSEFSR0VfUFVNUF8xCQkJMHgwMTI1CisjZGVmaW5lIFJUNTY2M19DSEFSR0VfUFVNUF8xXzIJCQkweDAxMjYKKyNkZWZpbmUgUlQ1NjYzX0NIQVJHRV9QVU1QXzFfMwkJCTB4MDEyNworI2RlZmluZSBSVDU2NjNfQ0hBUkdFX1BVTVBfMgkJCTB4MDEyOAorI2RlZmluZSBSVDU2NjNfRElHX0lOX1BJTjEJCQkweDAxMzIKKyNkZWZpbmUgUlQ1NjYzX1BBRF9EUlZfQ1RMCQkJMHgwMTM3CisjZGVmaW5lIFJUNTY2M19QTExfSU5UX1JFRwkJCTB4MDEzOQorI2RlZmluZSBSVDU2NjNfQ0hPUF9EQUNfTAkJCTB4MDEzYQorI2RlZmluZSBSVDU2NjNfQ0hPUF9BREMJCQkJMHgwMTNiCisjZGVmaW5lIFJUNTY2M19DQUxJQl9BREMJCQkweDAxM2MKKyNkZWZpbmUgUlQ1NjYzX0NIT1BfREFDX1IJCQkweDAxM2QKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX0NUTF9EQUNMUgkJCTB4MDEzZQorI2RlZmluZSBSVDU2NjNfRFVNTVlfUkVHXzUJCQkweDAxNDAKKyNkZWZpbmUgUlQ1NjYzX1NPRlRfUkFNUAkJCTB4MDE0MQorI2RlZmluZSBSVDU2NjNfVEVTVF9NT0RFXzEJCQkweDAxNDQKKyNkZWZpbmUgUlQ1NjYzX1RFU1RfTU9ERV8yCQkJMHgwMTQ1CisjZGVmaW5lIFJUNTY2M19URVNUX01PREVfMwkJCTB4MDE0NgorI2RlZmluZSBSVDU2NjNfU1RPX0RSRV8xCQkJMHgwMTYwCisjZGVmaW5lIFJUNTY2M19TVE9fRFJFXzIJCQkweDAxNjEKKyNkZWZpbmUgUlQ1NjYzX1NUT19EUkVfMwkJCTB4MDE2MgorI2RlZmluZSBSVDU2NjNfU1RPX0RSRV80CQkJMHgwMTYzCisjZGVmaW5lIFJUNTY2M19TVE9fRFJFXzUJCQkweDAxNjQKKyNkZWZpbmUgUlQ1NjYzX1NUT19EUkVfNgkJCTB4MDE2NQorI2RlZmluZSBSVDU2NjNfU1RPX0RSRV83CQkJMHgwMTY2CisjZGVmaW5lIFJUNTY2M19TVE9fRFJFXzgJCQkweDAxNjcKKyNkZWZpbmUgUlQ1NjYzX1NUT19EUkVfOQkJCTB4MDE2OAorI2RlZmluZSBSVDU2NjNfU1RPX0RSRV8xMAkJCTB4MDE2OQorI2RlZmluZSBSVDU2NjNfTUlDX0RFQ1JPXzEJCQkweDAxODAKKyNkZWZpbmUgUlQ1NjYzX01JQ19ERUNST18yCQkJMHgwMTgxCisjZGVmaW5lIFJUNTY2M19NSUNfREVDUk9fMwkJCTB4MDE4MgorI2RlZmluZSBSVDU2NjNfTUlDX0RFQ1JPXzQJCQkweDAxODMKKyNkZWZpbmUgUlQ1NjYzX01JQ19ERUNST181CQkJMHgwMTg0CisjZGVmaW5lIFJUNTY2M19NSUNfREVDUk9fNgkJCTB4MDE4NQorI2RlZmluZSBSVDU2NjNfSFBfREVDUk9fMQkJCTB4MDFiMAorI2RlZmluZSBSVDU2NjNfSFBfREVDUk9fMgkJCTB4MDFiMQorI2RlZmluZSBSVDU2NjNfSFBfREVDUk9fMwkJCTB4MDFiMgorI2RlZmluZSBSVDU2NjNfSFBfREVDUk9fNAkJCTB4MDFiMworI2RlZmluZSBSVDU2NjNfSFBfREVDT1VQCQkJMHgwMWI0CisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOX01BUDgJCQkweDAxYjUKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fTUFQOQkJCTB4MDFiNgorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl9NQVAxMAkJCTB4MDFiNworI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl9NQVAxMQkJCTB4MDFiOAorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8xCQkJMHgwMWMwCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzIJCQkweDAxYzEKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fMwkJCTB4MDFjMgorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl80CQkJMHgwMWMzCisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzUJCQkweDAxYzQKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fNgkJCTB4MDFjNQorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl83CQkJMHgwMWM2CisjZGVmaW5lIFJUNTY2M19IUF9JTVBfU0VOXzgJCQkweDAxYzcKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUF9TRU5fOQkJCTB4MDFjOAorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8xMAkJCTB4MDFjOQorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8xMQkJCTB4MDFjYQorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8xMgkJCTB4MDFjYgorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8xMwkJCTB4MDFjYworI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8xNAkJCTB4MDFjZAorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8xNQkJCTB4MDFjZQorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8xNgkJCTB4MDFjZgorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8xNwkJCTB4MDFkMAorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8xOAkJCTB4MDFkMQorI2RlZmluZSBSVDU2NjNfSFBfSU1QX1NFTl8xOQkJCTB4MDFkMgorI2RlZmluZSBSVDU2NjNfSFBfSU1QU0VOX0RJRzUJCQkweDAxZDMKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUFNFTl9NQVAxCQkJMHgwMWQ0CisjZGVmaW5lIFJUNTY2M19IUF9JTVBTRU5fTUFQMgkJCTB4MDFkNQorI2RlZmluZSBSVDU2NjNfSFBfSU1QU0VOX01BUDMJCQkweDAxZDYKKyNkZWZpbmUgUlQ1NjYzX0hQX0lNUFNFTl9NQVA0CQkJMHgwMWQ3CisjZGVmaW5lIFJUNTY2M19IUF9JTVBTRU5fTUFQNQkJCTB4MDFkOAorI2RlZmluZSBSVDU2NjNfSFBfSU1QU0VOX01BUDcJCQkweDAxZDkKKyNkZWZpbmUgUlQ1NjYzX0hQX0xPR0lDXzEJCQkweDAxZGEKKyNkZWZpbmUgUlQ1NjYzX0hQX0xPR0lDXzIJCQkweDAxZGIKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzEJCQkweDAxZGQKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCXzFfMQkJCTB4MDFkZQorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfMgkJCTB4MDFkZgorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfMwkJCTB4MDFlMAorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfNAkJCTB4MDFlMQorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfNQkJCTB4MDFlMgorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfNV8xCQkJMHgwMWUzCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl82CQkJMHgwMWU0CisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl83CQkJMHgwMWU1CisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl85CQkJMHgwMWU2CisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl8xMAkJCTB4MDFlNworI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfMTEJCQkweDAxZTgKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCX1NUMQkJCTB4MDFlYQorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfU1QyCQkJMHgwMWViCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl9TVDMJCQkweDAxZWMKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCX1NUNAkJCTB4MDFlZAorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfU1Q1CQkJMHgwMWVlCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl9TVDYJCQkweDAxZWYKKyNkZWZpbmUgUlQ1NjYzX0hQX0NBTElCX1NUNwkJCTB4MDFmMAorI2RlZmluZSBSVDU2NjNfSFBfQ0FMSUJfU1Q4CQkJMHgwMWYxCisjZGVmaW5lIFJUNTY2M19IUF9DQUxJQl9TVDkJCQkweDAxZjIKKyNkZWZpbmUgUlQ1NjYzX0hQX0FNUF9ERVQJCQkweDAyMDAKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX1JFR182CQkJMHgwMjAxCisjZGVmaW5lIFJUNTY2M19IUF9CSUFTCQkJCTB4MDIwMgorI2RlZmluZSBSVDU2NjNfQ0JKXzEJCQkJMHgwMjUwCisjZGVmaW5lIFJUNTY2M19DQkpfMgkJCQkweDAyNTEKKyNkZWZpbmUgUlQ1NjYzX0NCSl8zCQkJCTB4MDI1MgorI2RlZmluZSBSVDU2NjNfRFVNTVlfMQkJCQkweDAyZmEKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZXzIJCQkJMHgwMmZiCisjZGVmaW5lIFJUNTY2M19EVU1NWV8zCQkJCTB4MDJmYworI2RlZmluZSBSVDU2NjNfQU5BX0pECQkJCTB4MDMwMAorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9MUEYxX0ExCQkJMHgwM2QwCisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0xQRjFfQTEJCQkweDAzZDEKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfTFBGMV9IMAkJCTB4MDNkMgorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9MUEYxX0gwCQkJMHgwM2QzCisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjFfQTEJCQkweDAzZDQKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGMV9BMQkJCTB4MDNkNQorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEYxX0EyCQkJMHgwM2Q2CisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjFfQTIJCQkweDAzZDcKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGMV9IMAkJCTB4MDNkOAorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEYxX0gwCQkJMHgwM2Q5CisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjJfQTEJCQkweDAzZGEKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGMl9BMQkJCTB4MDNkYgorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEYyX0EyCQkJMHgwM2RjCisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjJfQTIJCQkweDAzZGQKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGMl9IMAkJCTB4MDNkZQorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEYyX0gwCQkJMHgwM2RmCisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjNfQTEJCQkweDAzZTAKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGM19BMQkJCTB4MDNlMQorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEYzX0EyCQkJMHgwM2UyCisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjNfQTIJCQkweDAzZTMKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGM19IMAkJCTB4MDNlNAorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEYzX0gwCQkJMHgwM2U1CisjZGVmaW5lIFJUNTY2M19BRENfTENIX0JQRjRfQTEJCQkweDAzZTYKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfQlBGNF9BMQkJCTB4MDNlNworI2RlZmluZSBSVDU2NjNfQURDX0xDSF9CUEY0X0EyCQkJMHgwM2U4CisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0JQRjRfQTIJCQkweDAzZTkKKyNkZWZpbmUgUlQ1NjYzX0FEQ19MQ0hfQlBGNF9IMAkJCTB4MDNlYQorI2RlZmluZSBSVDU2NjNfQURDX1JDSF9CUEY0X0gwCQkJMHgwM2ViCisjZGVmaW5lIFJUNTY2M19BRENfTENIX0hQRjFfQTEJCQkweDAzZWMKKyNkZWZpbmUgUlQ1NjYzX0FEQ19SQ0hfSFBGMV9BMQkJCTB4MDNlZAorI2RlZmluZSBSVDU2NjNfQURDX0xDSF9IUEYxX0gwCQkJMHgwM2VlCisjZGVmaW5lIFJUNTY2M19BRENfUkNIX0hQRjFfSDAJCQkweDAzZWYKKyNkZWZpbmUgUlQ1NjYzX0FEQ19FUV9QUkVfVk9MX0wJCQkweDAzZjAKKyNkZWZpbmUgUlQ1NjYzX0FEQ19FUV9QUkVfVk9MX1IJCQkweDAzZjEKKyNkZWZpbmUgUlQ1NjYzX0FEQ19FUV9QT1NUX1ZPTF9MCQkweDAzZjIKKyNkZWZpbmUgUlQ1NjYzX0FEQ19FUV9QT1NUX1ZPTF9SCQkweDAzZjMKKworLyogUlQ1NjYzOiBSRUNNSVggQ29udHJvbCAoMHgwMDEwKSAqLworI2RlZmluZSBSVDU2NjNfUkVDTUlYMV9CU1QxX01BU0sJCSgweDEpCisjZGVmaW5lIFJUNTY2M19SRUNNSVgxX0JTVDFfU0hJRlQJCTAKKyNkZWZpbmUgUlQ1NjYzX1JFQ01JWDFfQlNUMV9PTgkJCSgweDApCisjZGVmaW5lIFJUNTY2M19SRUNNSVgxX0JTVDFfT0ZGCQkJKDB4MSkKKworLyogUlQ1NjYzOiBCeXBhc3MgU3RlcmVvMSBEQUMgTWl4ZXIgQ29udHJvbCAoMHgwMDJkKSAqLworI2RlZmluZSBSVDU2NjNfREFDTDFfU1JDX01BU0sJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2M19EQUNMMV9TUkNfU0hJRlQJCQkzCisjZGVmaW5lIFJUNTY2M19EQUNSMV9TUkNfTUFTSwkJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYzX0RBQ1IxX1NSQ19TSElGVAkJCTIKKworLyogUlQ1NjYzOiBURE0gY29udHJvbCAyICgweDAwNzgpICovCisjZGVmaW5lIFJUNTY2M19EQVRBX1NXQVBfQURDREFUMV9NQVNLCQkoMHgzIDw8IDE0KQorI2RlZmluZSBSVDU2NjNfREFUQV9TV0FQX0FEQ0RBVDFfU0hJRlQJCTE0CisjZGVmaW5lIFJUNTY2M19EQVRBX1NXQVBfQURDREFUMV9MUgkJKDB4MCA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYzX0RBVEFfU1dBUF9BRENEQVQxX1JMCQkoMHgxIDw8IDE0KQorI2RlZmluZSBSVDU2NjNfREFUQV9TV0FQX0FEQ0RBVDFfTEwJCSgweDIgPDwgMTQpCisjZGVmaW5lIFJUNTY2M19EQVRBX1NXQVBfQURDREFUMV9SUgkJKDB4MyA8PCAxNCkKKworLyogUlQ1NjYzOiBURE0gY29udHJvbCA1ICgweDAwN2IpICovCisjZGVmaW5lIFJUNTY2M19URE1fTEVOR1ROX01BU0sJCQkoMHgzKQorI2RlZmluZSBSVDU2NjNfVERNX0xFTkdUTl9TSElGVAkJCTAKKyNkZWZpbmUgUlQ1NjYzX1RETV9MRU5HVE5fMTYJCQkoMHgwKQorI2RlZmluZSBSVDU2NjNfVERNX0xFTkdUTl8yMAkJCSgweDEpCisjZGVmaW5lIFJUNTY2M19URE1fTEVOR1ROXzI0CQkJKDB4MikKKyNkZWZpbmUgUlQ1NjYzX1RETV9MRU5HVE5fMzIJCQkoMHgzKQorCisvKiBSVDU2NjM6IEdsb2JhbCBDbG9jayBDb250cm9sICgweDAwODApICovCisjZGVmaW5lIFJUNTY2M19TQ0xLX1NSQ19NQVNLCQkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgUlQ1NjYzX1NDTEtfU1JDX1NISUZUCQkJMTQKKyNkZWZpbmUgUlQ1NjYzX1NDTEtfU1JDX01DTEsJCQkoMHgwIDw8IDE0KQorI2RlZmluZSBSVDU2NjNfU0NMS19TUkNfUExMMQkJCSgweDEgPDwgMTQpCisjZGVmaW5lIFJUNTY2M19TQ0xLX1NSQ19SQ0NMSwkJCSgweDIgPDwgMTQpCisjZGVmaW5lIFJUNTY2M19QTEwxX1NSQ19NQVNLCQkJKDB4NyA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYzX1BMTDFfU1JDX1NISUZUCQkJMTEKKyNkZWZpbmUgUlQ1NjYzX1BMTDFfU1JDX01DTEsJCQkoMHgwIDw8IDExKQorI2RlZmluZSBSVDU2NjNfUExMMV9TUkNfQkNMSzEJCQkoMHgxIDw8IDExKQorCisvKiBQTEwgdHJhY2tpbmcgbW9kZSAxICgweDAwODMpICovCisjZGVmaW5lIFJUNTY2M19JMlMxX0FTUkNfTUFTSwkJCSgweDEgPDwgMTEpCisjZGVmaW5lIFJUNTY2M19JMlMxX0FTUkNfU0hJRlQJCQkxMQorI2RlZmluZSBSVDU2NjNfREFDX1NUTzFfQVNSQ19NQVNLCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjNfREFDX1NUTzFfQVNSQ19TSElGVAkJMTAKKyNkZWZpbmUgUlQ1NjYzX0FEQ19TVE8xX0FTUkNfTUFTSwkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjNfQURDX1NUTzFfQVNSQ19TSElGVAkJMworCisvKiBQTEwgdHJhY2tpbmcgbW9kZSAyICgweDAwODQpKi8KKyNkZWZpbmUgUlQ1NjYzX0RBX1NUTzFfVFJBQ0tfTUFTSwkJKDB4NyA8PCAxMikKKyNkZWZpbmUgUlQ1NjYzX0RBX1NUTzFfVFJBQ0tfU0hJRlQJCTEyCisjZGVmaW5lIFJUNTY2M19EQV9TVE8xX1RSQUNLX1NZU0NMSwkJKDB4MCA8PCAxMikKKyNkZWZpbmUgUlQ1NjYzX0RBX1NUTzFfVFJBQ0tfSTJTMQkJKDB4MSA8PCAxMikKKyNkZWZpbmUgUlQ1NjYzX0FEX1NUTzFfVFJBQ0tfTUFTSwkJKDB4NykKKyNkZWZpbmUgUlQ1NjYzX0FEX1NUTzFfVFJBQ0tfU0hJRlQJCTAKKyNkZWZpbmUgUlQ1NjYzX0FEX1NUTzFfVFJBQ0tfU1lTQ0xLCQkoMHgwKQorI2RlZmluZSBSVDU2NjNfQURfU1RPMV9UUkFDS19JMlMxCQkoMHgxKQorCisvKiBSVDU2NjM6IEhQT1VUIENoYXJnZSBwdW1wIGNvbnRyb2wgMSAoMHgwMDkxKSAqLworI2RlZmluZSBSVDU2NjNfU0lfSFBfTUFTSwkJCSgweDEgPDwgMTIpCisjZGVmaW5lIFJUNTY2M19TSV9IUF9TSElGVAkJCTEyCisjZGVmaW5lIFJUNTY2M19TSV9IUF9FTgkJCQkoMHgxIDw8IDEyKQorI2RlZmluZSBSVDU2NjNfU0lfSFBfRElTCQkJKDB4MCA8PCAxMikKKworLyogUlQ1NjYzOiBHUElPIENvbnRyb2wgMiAoMHgwMGI2KSAqLworI2RlZmluZSBSVDU2NjNfR1AxX1BJTl9DT05GX01BU0sJCSgweDEgPDwgMikKKyNkZWZpbmUgUlQ1NjYzX0dQMV9QSU5fQ09ORl9TSElGVAkJMgorI2RlZmluZSBSVDU2NjNfR1AxX1BJTl9DT05GX09VVFBVVAkJKDB4MSA8PCAyKQorI2RlZmluZSBSVDU2NjNfR1AxX1BJTl9DT05GX0lOUFVUCQkoMHgwIDw8IDIpCisKKy8qIFJUNTY2MzogR1BJTyBDb250cm9sIDIgKDB4MDBiNykgKi8KKyNkZWZpbmUgUlQ1NjYzX0VOX0lSUV9JTkxJTkVfTUFTSwkJKDB4MSA8PCAzKQorI2RlZmluZSBSVDU2NjNfRU5fSVJRX0lOTElORV9TSElGVAkJMworI2RlZmluZSBSVDU2NjNfRU5fSVJRX0lOTElORV9OT1IJCSgweDEgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0VOX0lSUV9JTkxJTkVfQllQCQkoMHgwIDw8IDMpCisKKy8qIFJUNTY2MzogSVJRIENvbnRyb2wgMSAoMHgwMGMxKSAqLworI2RlZmluZSBSVDU2NjNfRU5fSVJRX0pEMV9NQVNLCQkJKDB4MSA8PCA2KQorI2RlZmluZSBSVDU2NjNfRU5fSVJRX0pEMV9TSElGVAkJCTYKKyNkZWZpbmUgUlQ1NjYzX0VOX0lSUV9KRDFfRU4JCQkoMHgxIDw8IDYpCisjZGVmaW5lIFJUNTY2M19FTl9JUlFfSkQxX0RJUwkJCSgweDAgPDwgNikKKworLyogUlQ1NjYzOiBJbmxpbmUgQ29tbWFuZCBGdW5jdGlvbiAyICgweDAwZGMpICovCisjZGVmaW5lIFJUNTY2M19QV1JfTUlDX0RFVF9NQVNLCQkJKDB4MSkKKyNkZWZpbmUgUlQ1NjYzX1BXUl9NSUNfREVUX1NISUZUCQkwCisjZGVmaW5lIFJUNTY2M19QV1JfTUlDX0RFVF9PTgkJCSgweDEpCisjZGVmaW5lIFJUNTY2M19QV1JfTUlDX0RFVF9PRkYJCQkoMHgwKQorCisvKiBSVDU2NjM6IEVtYmVlZGVkIEphY2sgYW5kIFR5cGUgRGV0ZWN0aW9uIENvbnRyb2wgMSAoMHgwMGU2KSovCisjZGVmaW5lIFJUNTY2M19DQkpfREVUX01BU0sJCQkoMHgxIDw8IDE1KQorI2RlZmluZSBSVDU2NjNfQ0JKX0RFVF9TSElGVAkJCTE1CisjZGVmaW5lIFJUNTY2M19DQkpfREVUX0RJUwkJCSgweDAgPDwgMTUpCisjZGVmaW5lIFJUNTY2M19DQkpfREVUX0VOCQkJKDB4MSA8PCAxNSkKKyNkZWZpbmUgUlQ1NjYzX0VYVF9KRF9NQVNLCQkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYzX0VYVF9KRF9TSElGVAkJCTExCisjZGVmaW5lIFJUNTY2M19FWFRfSkRfRU4JCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjNfRVhUX0pEX0RJUwkJCSgweDAgPDwgMTEpCisjZGVmaW5lIFJUNTY2M19QT0xfRVhUX0pEX01BU0sJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjNfUE9MX0VYVF9KRF9TSElGVAkJCTEwCisjZGVmaW5lIFJUNTY2M19QT0xfRVhUX0pEX0VOCQkJKDB4MSA8PCAxMCkKKyNkZWZpbmUgUlQ1NjYzX1BPTF9FWFRfSkRfRElTCQkJKDB4MCA8PCAxMCkKKworLyogUlQ1NjYzOiBEQUNSRUYgTERPIENvbnRyb2wgKDB4MDExMikqLworI2RlZmluZSBSVDU2NjNfUFdSX0xET19EQUNSRUZMX01BU0sJCSgweDEgPDwgOSkKKyNkZWZpbmUgUlQ1NjYzX1BXUl9MRE9fREFDUkVGTF9TSElGVAkJOQorI2RlZmluZSBSVDU2NjNfUFdSX0xET19EQUNSRUZSX01BU0sJCSgweDEgPDwgMSkKKyNkZWZpbmUgUlQ1NjYzX1BXUl9MRE9fREFDUkVGUl9TSElGVAkJMQorCisvKiBSVDU2NjM6IFN0ZXJlbyBEeW5hbWljIFJhbmdlIEVuaGFuY2VtZW50IENvbnRyb2wgOSAoMHgwMTY4LCAweDAxNjkpKi8KKyNkZWZpbmUgUlQ1NjYzX0RSRV9HQUlOX0hQX01BU0sJCQkoMHgxZikKKyNkZWZpbmUgUlQ1NjYzX0RSRV9HQUlOX0hQX1NISUZUCQkwCisKKy8qIFJUNTY2MzogQ29tYm8gSmFjayBDb250cm9sICgweDAyNTApICovCisjZGVmaW5lIFJUNTY2M19JTkJVRl9DQkpfQlNUMV9NQVNLCQkoMHgxIDw8IDExKQorI2RlZmluZSBSVDU2NjNfSU5CVUZfQ0JKX0JTVDFfU0hJRlQJCTExCisjZGVmaW5lIFJUNTY2M19JTkJVRl9DQkpfQlNUMV9PTgkJKDB4MSA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYzX0lOQlVGX0NCSl9CU1QxX09GRgkJKDB4MCA8PCAxMSkKKyNkZWZpbmUgUlQ1NjYzX0NCSl9TRU5TRV9CU1QxX01BU0sJCSgweDEgPDwgMTApCisjZGVmaW5lIFJUNTY2M19DQkpfU0VOU0VfQlNUMV9TSElGVAkJMTAKKyNkZWZpbmUgUlQ1NjYzX0NCSl9TRU5TRV9CU1QxX0wJCQkoMHgxIDw8IDEwKQorI2RlZmluZSBSVDU2NjNfQ0JKX1NFTlNFX0JTVDFfUgkJCSgweDAgPDwgMTApCisKKy8qIFJUNTY2MzogQ29tYm8gSmFjayBDb250cm9sICgweDAyNTEpICovCisjZGVmaW5lIFJUNTY2M19HQUlOX0JTVDFfTUFTSwkJCSgweGYpCisjZGVmaW5lIFJUNTY2M19HQUlOX0JTVDFfU0hJRlQJCQkwCisKKy8qIFJUNTY2MzogRHVtbXkgcmVnaXN0ZXIgMSAoMHgwMmZhKSAqLworI2RlZmluZSBSVDU2NjNfRU1CX0NMS19NQVNLCQkJKDB4MSA8PCA5KQorI2RlZmluZSBSVDU2NjNfRU1CX0NMS19TSElGVAkJCTkKKyNkZWZpbmUgUlQ1NjYzX0VNQl9DTEtfRU4JCQkoMHgxIDw8IDkpCisjZGVmaW5lIFJUNTY2M19FTUJfQ0xLX0RJUwkJCSgweDAgPDwgOSkKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUExfQklBU19NQVNLCQkoMHg3IDw8IDYpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BMX0JJQVNfU0hJRlQJCTYKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUExfQklBU18wXzUJCQkoMHgwIDw8IDYpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BMX0JJQVNfMQkJCSgweDEgPDwgNikKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUExfQklBU18yCQkJKDB4MiA8PCA2KQorI2RlZmluZSBSVDU2NjNfSFBBX0NQTF9CSUFTXzMJCQkoMHgzIDw8IDYpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BMX0JJQVNfNF8xCQkJKDB4NCA8PCA2KQorI2RlZmluZSBSVDU2NjNfSFBBX0NQTF9CSUFTXzRfMgkJCSgweDUgPDwgNikKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUExfQklBU182CQkJKDB4NiA8PCA2KQorI2RlZmluZSBSVDU2NjNfSFBBX0NQTF9CSUFTXzgJCQkoMHg3IDw8IDYpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BSX0JJQVNfTUFTSwkJKDB4NyA8PCAzKQorI2RlZmluZSBSVDU2NjNfSFBBX0NQUl9CSUFTX1NISUZUCQkzCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BSX0JJQVNfMF81CQkJKDB4MCA8PCAzKQorI2RlZmluZSBSVDU2NjNfSFBBX0NQUl9CSUFTXzEJCQkoMHgxIDw8IDMpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BSX0JJQVNfMgkJCSgweDIgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUFJfQklBU18zCQkJKDB4MyA8PCAzKQorI2RlZmluZSBSVDU2NjNfSFBBX0NQUl9CSUFTXzRfMQkJCSgweDQgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUFJfQklBU180XzIJCQkoMHg1IDw8IDMpCisjZGVmaW5lIFJUNTY2M19IUEFfQ1BSX0JJQVNfNgkJCSgweDYgPDwgMykKKyNkZWZpbmUgUlQ1NjYzX0hQQV9DUFJfQklBU184CQkJKDB4NyA8PCAzKQorI2RlZmluZSBSVDU2NjNfRFVNTVlfQklBU19NQVNLCQkJKDB4NykKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX0JJQVNfU0hJRlQJCQkwCisjZGVmaW5lIFJUNTY2M19EVU1NWV9CSUFTXzBfNQkJCSgweDApCisjZGVmaW5lIFJUNTY2M19EVU1NWV9CSUFTXzEJCQkoMHgxKQorI2RlZmluZSBSVDU2NjNfRFVNTVlfQklBU18yCQkJKDB4MikKKyNkZWZpbmUgUlQ1NjYzX0RVTU1ZX0JJQVNfMwkJCSgweDMpCisjZGVmaW5lIFJUNTY2M19EVU1NWV9CSUFTXzRfMQkJCSgweDQpCisjZGVmaW5lIFJUNTY2M19EVU1NWV9CSUFTXzRfMgkJCSgweDUpCisjZGVmaW5lIFJUNTY2M19EVU1NWV9CSUFTXzYJCQkoMHg2KQorI2RlZmluZSBSVDU2NjNfRFVNTVlfQklBU184CQkJKDB4NykKKworCisvKiBTeXN0ZW0gQ2xvY2sgU291cmNlICovCitlbnVtIHsKKwlSVDU2NjNfU0NMS19TX01DTEssCisJUlQ1NjYzX1NDTEtfU19QTEwxLAorCVJUNTY2M19TQ0xLX1NfUkNDTEssCit9OworCisvKiBQTEwxIFNvdXJjZSAqLworZW51bSB7CisJUlQ1NjYzX1BMTDFfU19NQ0xLLAorCVJUNTY2M19QTEwxX1NfQkNMSzEsCit9OworCitlbnVtIHsKKwlSVDU2NjNfQUlGLAorCVJUNTY2M19BSUZTLAorfTsKKworLyogYXNyYyBjbG9jayBzb3VyY2UgKi8KK2VudW0geworCVJUNTY2M19DTEtfU0VMX1NZUyA9IDB4MCwKKwlSVDU2NjNfQ0xLX1NFTF9JMlMxX0FTUkMgPSAweDEsCit9OworCisvKiBmaWx0ZXIgbWFzayAqLworZW51bSB7CisJUlQ1NjYzX0RBX1NURVJFT19GSUxURVIgPSAweDEsCisJUlQ1NjYzX0FEX1NURVJFT19GSUxURVIgPSAweDIsCit9OworCitpbnQgcnQ1NjYzX3NldF9qYWNrX2RldGVjdChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9zb2NfamFjayAqaHNfamFjayk7CitpbnQgcnQ1NjYzX3NlbF9hc3JjX2Nsa19zcmMoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXVuc2lnbmVkIGludCBmaWx0ZXJfbWFzaywgdW5zaWduZWQgaW50IGNsa19zcmMpOworCisjZW5kaWYgLyogX19SVDU2NjNfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY3MC5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NzAuYwppbmRleCA4ZWY0NjdmLi40OWNhZjEzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY3MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjcwLmMKQEAgLTI3NzcsMTIgKzI3NzcsMTQgQEAKIAkucmVzdW1lID0gcnQ1NjcwX3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBydDU2NzBfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHJ0NTY3MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocnQ1NjcwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHJ0NTY3MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHJ0NTY3MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHJ0NTY3MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShydDU2NzBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcnQ1NjcwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHJ0NTY3MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHJ0NTY3MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShydDU2NzBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHJ0NTY3MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUocnQ1NjcwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0NTY3MF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY3Ny5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NzcuYwppbmRleCBkYTk0ODNjLi5hYmM4MDJhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY3Ny5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1Njc3LmMKQEAgLTksNiArOSw3IEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KQEAgLTQwLDYgKzQxLDE1IEBACiAKICNkZWZpbmUgUlQ1Njc3X1BSX0JBU0UgKFJUNTY3N19QUl9SQU5HRV9CQVNFICsgKDAgKiBSVDU2NzdfUFJfU1BBQ0lORykpCiAKKy8qIEdQSU8gaW5kZXhlcyBkZWZpbmVkIGJ5IEFDUEkgKi8KK2VudW0geworCVJUNTY3N19HUElPX1BMVUdfREVUCQk9IDAsCisJUlQ1Njc3X0dQSU9fTUlDX1BSRVNFTlRfTAk9IDEsCisJUlQ1Njc3X0dQSU9fSE9UV09SRF9ERVRfTAk9IDIsCisJUlQ1Njc3X0dQSU9fRFNQX0lOVAkJPSAzLAorCVJUNTY3N19HUElPX0hQX0FNUF9TSEROX0wJPSA0LAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfcmFuZ2VfY2ZnIHJ0NTY3N19yYW5nZXNbXSA9IHsKIAl7CiAJCS5uYW1lID0gIlBSIiwKQEAgLTQ2NTcsNyArNDY2Nyw3IEBACiAJcmV0dXJuIHJlZ21hcF9pcnFfZ2V0X3ZpcnEoZGF0YSwgaXJxKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgcnQ1Njc3X3RlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCBydDU2NzdfdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJydDU2NzciLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmRpcmVjdGlvbl9vdXRwdXQJPSBydDU2NzdfZ3Bpb19kaXJlY3Rpb25fb3V0LApAQCAtNDk3NCwxMiArNDk4NCwxNCBAQAogCS5yZXN1bWUgPSBydDU2NzdfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHJ0NTY3N19zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcnQ1Njc3X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShydDU2Nzdfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gcnQ1Njc3X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUocnQ1Njc3X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcnQ1Njc3X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJ0NTY3N19kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBydDU2Nzdfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUocnQ1Njc3X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcnQ1Njc3X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHJ0NTY3N19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcnQ1Njc3X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShydDU2NzdfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQ1Njc3X3JlZ21hcF9waHlzaWNhbCA9IHsKQEAgLTUwMTgsMTAgKzUwMzAsNDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBydDU2NzdfaTJjX2lkW10gPSB7CiAJeyAicnQ1Njc3IiwgUlQ1Njc3IH0sCiAJeyAicnQ1Njc2IiwgUlQ1Njc2IH0sCisJeyAiUlQ1Njc3Q0U6MDAiLCBSVDU2NzcgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgcnQ1Njc3X2kyY19pZCk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9ncGlvX3BhcmFtcyBwbHVnX2RldF9ncGlvID0geyBSVDU2NzdfR1BJT19QTFVHX0RFVCwgMCwgZmFsc2UgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9ncGlvX3BhcmFtcyBtaWNfcHJlc2VudF9ncGlvID0geyBSVDU2NzdfR1BJT19NSUNfUFJFU0VOVF9MLCAwLCBmYWxzZSB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2dwaW9fcGFyYW1zIGhlYWRwaG9uZV9lbmFibGVfZ3BpbyA9IHsgUlQ1Njc3X0dQSU9fSFBfQU1QX1NIRE5fTCwgMCwgZmFsc2UgfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2dwaW9fbWFwcGluZyBiZHdfcnQ1Njc3X2dwaW9zW10gPSB7CisJeyAicGx1Zy1kZXQtZ3Bpb3MiLCAmcGx1Z19kZXRfZ3BpbywgMSB9LAorCXsgIm1pYy1wcmVzZW50LWdwaW9zIiwgJm1pY19wcmVzZW50X2dwaW8sIDEgfSwKKwl7ICJoZWFkcGhvbmUtZW5hYmxlLWdwaW9zIiwgJmhlYWRwaG9uZV9lbmFibGVfZ3BpbywgMSB9LAorCXsgTlVMTCB9LAorfTsKKworc3RhdGljIHZvaWQgcnQ1Njc3X3JlYWRfYWNwaV9wcm9wZXJ0aWVzKHN0cnVjdCBydDU2NzdfcHJpdiAqcnQ1Njc3LAorCQlzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwl1MzIgdmFsOworCisJcmV0ID0gYWNwaV9kZXZfYWRkX2RyaXZlcl9ncGlvcyhBQ1BJX0NPTVBBTklPTihkZXYpLAorCQkJYmR3X3J0NTY3N19ncGlvcyk7CisJaWYgKHJldCkKKwkJZGV2X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGFkZCBkcml2ZXIgZ3Bpb3NcbiIpOworCisJaWYgKCFkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAiRENMSyIsICZ2YWwpKQorCQlydDU2NzctPnBkYXRhLmRtaWMyX2Nsa19waW4gPSB2YWw7CisKKwlydDU2NzctPnBkYXRhLmluMV9kaWZmID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJJTjEiKTsKKwlydDU2NzctPnBkYXRhLmluMl9kaWZmID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYsICJJTjIiKTsKKwlydDU2NzctPnBkYXRhLmxvdXQxX2RpZmYgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgIk9VVDEiKTsKKwlydDU2NzctPnBkYXRhLmxvdXQyX2RpZmYgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgIk9VVDIiKTsKKwlydDU2NzctPnBkYXRhLmxvdXQzX2RpZmYgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF9ib29sKGRldiwgIk9VVDMiKTsKKworCWRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJKRDEiLCAmcnQ1Njc3LT5wZGF0YS5qZDFfZ3Bpbyk7CisJZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyKGRldiwgIkpEMiIsICZydDU2NzctPnBkYXRhLmpkMl9ncGlvKTsKKwlkZXZpY2VfcHJvcGVydHlfcmVhZF91MzIoZGV2LCAiSkQzIiwgJnJ0NTY3Ny0+cGRhdGEuamQzX2dwaW8pOworfQorCiBzdGF0aWMgdm9pZCBydDU2NzdfcmVhZF9kZXZpY2VfcHJvcGVydGllcyhzdHJ1Y3QgcnQ1Njc3X3ByaXYgKnJ0NTY3NywKIAkJc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtNTEyNyw4ICs1MTc2LDEyIEBACiAKIAlpZiAocGRhdGEpCiAJCXJ0NTY3Ny0+cGRhdGEgPSAqcGRhdGE7Ci0JZWxzZQorCWVsc2UgaWYgKGkyYy0+ZGV2Lm9mX25vZGUpCiAJCXJ0NTY3N19yZWFkX2RldmljZV9wcm9wZXJ0aWVzKHJ0NTY3NywgJmkyYy0+ZGV2KTsKKwllbHNlIGlmIChBQ1BJX0hBTkRMRSgmaTJjLT5kZXYpKQorCQlydDU2NzdfcmVhZF9hY3BpX3Byb3BlcnRpZXMocnQ1Njc3LCAmaTJjLT5kZXYpOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBwb3ctbGRvMiBhbmQgcmVzZXQgYXJlIG9wdGlvbmFsLiBUaGUgY29kZWMgcGlucyBtYXkgYmUgc3RhdGljYWxseQogCSAqIGNvbm5lY3RlZCBvbiB0aGUgYm9hcmQgd2l0aG91dCBncGlvcy4gSWYgdGhlIGdwaW8gZGV2aWNlIHByb3BlcnR5CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmMKaW5kZXggNTI3Yjc1OS4uMTU4OTMyNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYwpAQCAtNDExLDYgKzQxMSw4IEBACiAJCQkwLCA4LAogCQkJMHg3ZiwgMSwKIAkJCWhlYWRwaG9uZV92b2x1bWUpLAorCVNPQ19TSU5HTEUoIkhlYWRwaG9uZSBQbGF5YmFjayBTd2l0Y2giLCBTR1RMNTAwMF9DSElQX0FOQV9DVFJMLAorCQkJNCwgMSwgMSksCiAJU09DX1NJTkdMRSgiSGVhZHBob25lIFBsYXliYWNrIFpDIFN3aXRjaCIsIFNHVEw1MDAwX0NISVBfQU5BX0NUUkwsCiAJCQk1LCAxLCAwKSwKIApAQCAtNDIzLDYgKzQyNSw3IEBACiAJCQlTR1RMNTAwMF9MSU5FX09VVF9WT0xfUklHSFRfU0hJRlQsCiAJCQkweDFmLCAxLAogCQkJbGluZW91dF92b2x1bWUpLAorCVNPQ19TSU5HTEUoIkxpbmVvdXQgUGxheWJhY2sgU3dpdGNoIiwgU0dUTDUwMDBfQ0hJUF9BTkFfQ1RSTCwgOCwgMSwgMSksCiB9OwogCiAvKiBtdXRlIHRoZSBjb2RlYyB1c2VkIGJ5IGFsc2EgY29yZSAqLwpAQCAtMTE1MSwxMiArMTE1NCwxNCBAQAogCS5yZW1vdmUgPSBzZ3RsNTAwMF9yZW1vdmUsCiAJLnNldF9iaWFzX2xldmVsID0gc2d0bDUwMDBfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAotCS5jb250cm9scyA9IHNndGw1MDAwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShzZ3RsNTAwMF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBzZ3RsNTAwMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHNndGw1MDAwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gc2d0bDUwMDBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoc2d0bDUwMDBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gc2d0bDUwMDBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoc2d0bDUwMDBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSBzZ3RsNTAwMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShzZ3RsNTAwMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gc2d0bDUwMDBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHNndGw1MDAwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHNndGw1MDAwX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2k0NzZ4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3NpNDc2eC5jCmluZGV4IGE4NDAyZDAuLjUzNDRmNGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc2k0NzZ4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zaTQ3NnguYwpAQCAtMjM4LDEwICsyMzgsMTIgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3NpNDc2eCA9IHsKIAkuZ2V0X3JlZ21hcCA9IHNpNDc2eF9nZXRfcmVnbWFwLAotCS5kYXBtX3dpZGdldHMgPSBzaTQ3NnhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShzaTQ3NnhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBzaTQ3NnhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoc2k0NzZ4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSBzaTQ3NnhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoc2k0NzZ4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBzaTQ3NnhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHNpNDc2eF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgc2k0NzZ4X3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NuOTUwMzEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc245NTAzMS5jCmluZGV4IDNhN2RlMDEuLmVhZTU0YzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc245NTAzMS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc245NTAzMS5jCkBAIC04ODgsMTIgKzg4OCwxNCBAQAogCS5zZXRfYmlhc19sZXZlbAk9IHNuOTUwMzFfc2V0X3ZhdWRfYmlhcywKIAkuaWRsZV9iaWFzX29mZgk9IHRydWUsCiAKLQkuY29udHJvbHMJPSBzbjk1MDMxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCT0gQVJSQVlfU0laRShzbjk1MDMxX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwk9IHNuOTUwMzFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShzbjk1MDMxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzCT0gc245NTAzMV9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoc245NTAzMV9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gc245NTAzMV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShzbjk1MDMxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gc245NTAzMV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShzbjk1MDMxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBzbjk1MDMxX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoc245NTAzMV9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHNuOTUwMzFfZGV2aWNlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3NwZGlmX3JlY2VpdmVyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3NwZGlmX3JlY2VpdmVyLmMKaW5kZXggM2VjNDFjY2IuLjIzNGY4N2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3BkaWZfcmVjZWl2ZXIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3NwZGlmX3JlY2VpdmVyLmMKQEAgLTM4LDEwICszOCwxMiBAQAogCQkJU05EUlZfUENNX0ZNVEJJVF9JRUM5NThfU1VCRlJBTUVfTEUpCiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX3NwZGlmX2RpciA9IHsKLQkuZGFwbV93aWRnZXRzID0gZGlyX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGRpcl93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBkaXJfcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGRpcl9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGRpcl93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGlyX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gZGlyX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZGlyX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGRpcl9zdHViX2RhaSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3BkaWZfdHJhbnNtaXR0ZXIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3BkaWZfdHJhbnNtaXR0ZXIuYwppbmRleCBlZjYzNGE5Li5lZTM2NzUzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NwZGlmX3RyYW5zbWl0dGVyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zcGRpZl90cmFuc21pdHRlci5jCkBAIC0zOCwxMCArMzgsMTIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX3NwZGlmX2RpdCA9IHsKLQkuZGFwbV93aWRnZXRzID0gZGl0X3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGRpdF93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBkaXRfcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGRpdF9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IGRpdF93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoZGl0X3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gZGl0X3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoZGl0X3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGRpdF9zdHViX2RhaSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjUxOC5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKaW5kZXggZTJlMGJmYS4uMzhhODVmMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNTE4LmMKQEAgLTcxNSwxMiArNzE1LDE0IEBACiAJLnNldF9zeXNjbGsgPSBzc20yNTE4X3NldF9zeXNjbGssCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gc3NtMjUxOF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoc3NtMjUxOF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBzc20yNTE4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoc3NtMjUxOF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHNzbTI1MThfcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHNzbTI1MThfcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHNzbTI1MThfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoc3NtMjUxOF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHNzbTI1MThfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoc3NtMjUxOF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gc3NtMjUxOF9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHNzbTI1MThfcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHNzbTI1MThfcmVnbWFwX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtMjYwMi5jIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKaW5kZXggNDQ1MmZlYS4uOTkzYmRlMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc20yNjAyLmMKQEAgLTU5NywxMiArNTk3LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gc3NtMjYwMl9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBzc20yNjB4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShzc20yNjB4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHNzbTI2MHhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShzc20yNjB4X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gc3NtMjYweF9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoc3NtMjYweF9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gc3NtMjYweF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShzc20yNjB4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gc3NtMjYweF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShzc20yNjB4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBzc20yNjB4X3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoc3NtMjYweF9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgYm9vbCBzc20yNjAyX3JlZ2lzdGVyX3ZvbGF0aWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3NtNDU2Ny5jIGIvc291bmQvc29jL2NvZGVjcy9zc200NTY3LmMKaW5kZXggMDgwYzc4ZS4uMmJiNWExMSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zc200NTY3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zc200NTY3LmMKQEAgLTQyMSwxMiArNDIxLDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gc3NtNDU2N19zZXRfYmlhc19sZXZlbCwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBzc200NTY3X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShzc200NTY3X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHNzbTQ1NjdfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShzc200NTY3X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gc3NtNDU2N19yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoc3NtNDU2N19yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gc3NtNDU2N19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShzc200NTY3X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gc3NtNDU2N19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShzc200NTY3X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBzc200NTY3X3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoc3NtNDU2N19yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3NtNDU2N19yZWdtYXBfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzJ4LmMKaW5kZXggYTk4NDRiMi4uMDc5MGFlOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zdGEzMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTMyeC5jCkBAIC05OTEsMTIgKzk5MSwxNCBAQAogCS5yZW1vdmUgPQkJc3RhMzJ4X3JlbW92ZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPQlzdGEzMnhfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPQl0cnVlLAotCS5jb250cm9scyA9CQlzdGEzMnhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPQkJQVJSQVlfU0laRShzdGEzMnhfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0JCXN0YTMyeF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPQlBUlJBWV9TSVpFKHN0YTMyeF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9CQlzdGEzMnhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9CUFSUkFZX1NJWkUoc3RhMzJ4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzID0JCXN0YTMyeF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMgPQkJQVJSQVlfU0laRShzdGEzMnhfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cyA9CQlzdGEzMnhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cyA9CUFSUkFZX1NJWkUoc3RhMzJ4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcyA9CQlzdGEzMnhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMgPQlBUlJBWV9TSVpFKHN0YTMyeF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBzdGEzMnhfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9zdGEzNTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzUwLmMKaW5kZXggMzNhNDYxMi4uOTY0NGMyMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zdGEzNTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTM1MC5jCkBAIC0xMDU3LDEyICsxMDU3LDE0IEBACiAJLnJlbW92ZSA9CQlzdGEzNTBfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbCA9CXN0YTM1MF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9CXRydWUsCi0JLmNvbnRyb2xzID0JCXN0YTM1MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9CQlBUlJBWV9TSVpFKHN0YTM1MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPQkJc3RhMzUwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9CUFSUkFZX1NJWkUoc3RhMzUwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0JCXN0YTM1MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0JQVJSQVlfU0laRShzdGEzNTBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMgPQkJc3RhMzUwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scyA9CQlBUlJBWV9TSVpFKHN0YTM1MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzID0JCXN0YTM1MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzID0JQVJSQVlfU0laRShzdGEzNTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzID0JCXN0YTM1MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcyA9CUFSUkFZX1NJWkUoc3RhMzUwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHN0YTM1MF9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3N0YTUyOS5jIGIvc291bmQvc29jL2NvZGVjcy9zdGE1MjkuYwppbmRleCAyY2RhY2E5Li5kNGIzODRlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3N0YTUyOS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhNTI5LmMKQEAgLTMxNyw4ICszMTcsMTAgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSBzdGE1Mjlfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gc3RhNTI5X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShzdGE1Mjlfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHN0YTUyOV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShzdGE1Mjlfc25kX2NvbnRyb2xzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHN0YTUyOV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3N0YWM5NzY2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3N0YWM5NzY2LmMKaW5kZXggMDk0NWM1MS4uMjdmMzBkMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zdGFjOTc2Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvc3RhYzk3NjYuYwpAQCAtODUsMTAgKzg1LDEwIEBACiBzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0woc3RhYzk3NjZfc3RlcmVvX21pY19lbnVtLAogCQkJICAgIEFDOTdfU1RBQ19TVEVSRU9fTUlDLCAyLCBzdGFjOTc2Nl9zdGVyZW9fbWljKTsKIAotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihtYXN0ZXJfdGx2LCAtNDYwMCwgMCk7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKHJlY29yZF90bHYsIDAsIDIyNTApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihiZWVwX3RsdiwgLTQ1MDAsIDApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihtaXhfdGx2LCAtMzQ1MCwgMTIwMCk7CitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9TQ0FMRShtYXN0ZXJfdGx2LCAtNDY1MCwgMTUwLCAwKTsKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1NDQUxFKHJlY29yZF90bHYsICAgICAwLCAxNTAsIDApOworc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfU0NBTEUoYmVlcF90bHYsICAgLTQ1MDAsIDMwMCwgMCk7CitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9TQ0FMRShtaXhfdGx2LCAgICAtMzQ1MCwgMTUwLCAwKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHN0YWM5NzY2X3NuZF9hYzk3X2NvbnRyb2xzW10gPSB7CiAJU09DX0RPVUJMRV9UTFYoIlNwZWFrZXIgVm9sdW1lIiwgQUM5N19NQVNURVIsIDgsIDAsIDMxLCAxLCBtYXN0ZXJfdGx2KSwKQEAgLTMyMCw4ICszMjAsMTAgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3N0YWM5NzY2ID0gewotCS5jb250cm9scyA9IHN0YWM5NzY2X3NuZF9hYzk3X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHN0YWM5NzY2X3NuZF9hYzk3X2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHN0YWM5NzY2X3NuZF9hYzk3X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoc3RhYzk3NjZfc25kX2FjOTdfY29udHJvbHMpLAorCX0sCiAJLndyaXRlID0gc3RhYzk3NjZfYWM5N193cml0ZSwKIAkucmVhZCA9IHN0YWM5NzY2X2FjOTdfcmVhZCwKIAkuc2V0X2JpYXNfbGV2ZWwgPSBzdGFjOTc2Nl9zZXRfYmlhc19sZXZlbCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RpLXNhcy5jIGIvc291bmQvc29jL2NvZGVjcy9zdGktc2FzLmMKaW5kZXggMTYwZDYxYS4uN2IzMWVlOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zdGktc2FzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGktc2FzLmMKQEAgLTU5MSwxMSArNTkxLDExIEBACiAJc3RpX3Nhc19kYWlbU1RJX1NBU19EQUlfQU5BTE9HX09VVF0ub3BzID0gZHJ2ZGF0YS0+ZGV2X2RhdGEtPmRhY19vcHM7CiAKIAkvKiBTZXQgZGFwbXMqLwotCXN0aV9zYXNfZHJpdmVyLmRhcG1fd2lkZ2V0cyA9IGRydmRhdGEtPmRldl9kYXRhLT5kYXBtX3dpZGdldHM7Ci0Jc3RpX3Nhc19kcml2ZXIubnVtX2RhcG1fd2lkZ2V0cyA9IGRydmRhdGEtPmRldl9kYXRhLT5udW1fZGFwbV93aWRnZXRzOworCXN0aV9zYXNfZHJpdmVyLmNvbXBvbmVudF9kcml2ZXIuZGFwbV93aWRnZXRzID0gZHJ2ZGF0YS0+ZGV2X2RhdGEtPmRhcG1fd2lkZ2V0czsKKwlzdGlfc2FzX2RyaXZlci5jb21wb25lbnRfZHJpdmVyLm51bV9kYXBtX3dpZGdldHMgPSBkcnZkYXRhLT5kZXZfZGF0YS0+bnVtX2RhcG1fd2lkZ2V0czsKIAotCXN0aV9zYXNfZHJpdmVyLmRhcG1fcm91dGVzID0gZHJ2ZGF0YS0+ZGV2X2RhdGEtPmRhcG1fcm91dGVzOwotCXN0aV9zYXNfZHJpdmVyLm51bV9kYXBtX3JvdXRlcyA9IGRydmRhdGEtPmRldl9kYXRhLT5udW1fZGFwbV9yb3V0ZXM7CisJc3RpX3Nhc19kcml2ZXIuY29tcG9uZW50X2RyaXZlci5kYXBtX3JvdXRlcyA9IGRydmRhdGEtPmRldl9kYXRhLT5kYXBtX3JvdXRlczsKKwlzdGlfc2FzX2RyaXZlci5jb21wb25lbnRfZHJpdmVyLm51bV9kYXBtX3JvdXRlcyA9IGRydmRhdGEtPmRldl9kYXRhLT5udW1fZGFwbV9yb3V0ZXM7CiAKIAkvKiBTdG9yZSBjb250ZXh0ICovCiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRydmRhdGEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90YXMyNTUyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RhczI1NTIuYwppbmRleCBjYzFkMzk4Li5iYWY0NTVlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RhczI1NTIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RhczI1NTIuYwpAQCAtNjY3LDEyICs2NjcsMTQgQEAKIAkucmVzdW1lID0gdGFzMjU1Ml9yZXN1bWUsCiAJLmlnbm9yZV9wbWRvd25fdGltZSA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB0YXMyNTUyX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh0YXMyNTUyX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHRhczI1NTJfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh0YXMyNTUyX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gdGFzMjU1Ml9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodGFzMjU1Ml9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gdGFzMjU1Ml9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh0YXMyNTUyX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gdGFzMjU1Ml9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0YXMyNTUyX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB0YXMyNTUyX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUodGFzMjU1Ml9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGFzMjU1Ml9yZWdtYXBfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90YXM1MDg2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RhczUwODYuYwppbmRleCBkNDlkMjVkLi5iN2RlODU3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RhczUwODYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RhczUwODYuYwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJdmFsID0gaW5kZXhfaW5fYXJyYXkodGFzNTA4Nl9yYXRpb3MsIEFSUkFZX1NJWkUodGFzNTA4Nl9yYXRpb3MpLAogCQkJICAgICBwcml2LT5tY2xrIC8gcHJpdi0+cmF0ZSk7CiAJaWYgKHZhbCA8IDApIHsKLQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiSW5hdmxpZCBNQ0xLIC8gRnMgcmF0aW9cbiIpOworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJJbnZhbGlkIE1DTEsgLyBGcyByYXRpb1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtODkwLDEyICs4OTAsMTQgQEAKIAkucmVtb3ZlCQkJPSB0YXM1MDg2X3JlbW92ZSwKIAkuc3VzcGVuZAkJPSB0YXM1MDg2X3NvY19zdXNwZW5kLAogCS5yZXN1bWUJCQk9IHRhczUwODZfc29jX3Jlc3VtZSwKLQkuY29udHJvbHMJCT0gdGFzNTA4Nl9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUodGFzNTA4Nl9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cwkJPSB0YXM1MDg2X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodGFzNTA4Nl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcwkJPSB0YXM1MDg2X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHRhczUwODZfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gdGFzNTA4Nl9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHRhczUwODZfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHRhczUwODZfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodGFzNTA4Nl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gdGFzNTA4Nl9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUodGFzNTA4Nl9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0YXM1MDg2X2kyY19pZFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90YXM1NzF4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RhczU3MXguYwppbmRleCBkOGJhY2EzLi5kZjVlNWNiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RhczU3MXguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RhczU3MXguYwpAQCAtNjU4LDEwICs2NTgsMTIgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSB0YXM1NzF4X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5kYXBtX3dpZGdldHMgPSB0YXM1NzF4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGFzNTcxeF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHRhczU3MXhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodGFzNTcxeF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gdGFzNTcxeF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0YXM1NzF4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB0YXM1NzF4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh0YXM1NzF4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgdGFzNTcxeF9kYWkgPSB7CkBAIC03NTQsOCArNzU2LDggQEAKIAogCiAJbWVtY3B5KCZwcml2LT5jb2RlY19kcml2ZXIsICZ0YXM1NzF4X2NvZGVjLCBzaXplb2YocHJpdi0+Y29kZWNfZHJpdmVyKSk7Ci0JcHJpdi0+Y29kZWNfZHJpdmVyLmNvbnRyb2xzID0gcHJpdi0+Y2hpcC0+Y29udHJvbHM7Ci0JcHJpdi0+Y29kZWNfZHJpdmVyLm51bV9jb250cm9scyA9IHByaXYtPmNoaXAtPm51bV9jb250cm9sczsKKwlwcml2LT5jb2RlY19kcml2ZXIuY29tcG9uZW50X2RyaXZlci5jb250cm9scyA9IHByaXYtPmNoaXAtPmNvbnRyb2xzOworCXByaXYtPmNvZGVjX2RyaXZlci5jb21wb25lbnRfZHJpdmVyLm51bV9jb250cm9scyA9IHByaXYtPmNoaXAtPm51bV9jb250cm9sczsKIAogCWlmIChwcml2LT5jaGlwLT52b2xfcmVnX3NpemUgPT0gMikgewogCQkvKgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90YXM1NzIwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RhczU3MjAuYwppbmRleCBmNTRmYjQ2Li5jNjViOTE3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RhczU3MjAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RhczU3MjAuYwpAQCAtNDg5LDEyICs0ODksMTQgQEAKIAkuc3VzcGVuZCA9IHRhczU3MjBfc3VzcGVuZCwKIAkucmVzdW1lID0gdGFzNTcyMF9yZXN1bWUsCiAKLQkuY29udHJvbHMgPSB0YXM1NzIwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh0YXM1NzIwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHRhczU3MjBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh0YXM1NzIwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gdGFzNTcyMF9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodGFzNTcyMF9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gdGFzNTcyMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh0YXM1NzIwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gdGFzNTcyMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh0YXM1NzIwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB0YXM1NzIwX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUodGFzNTcyMF9hdWRpb19tYXApLAorCX0sCiB9OwogCiAvKiBQQ00gcmF0ZXMgc3VwcG9ydGVkIGJ5IHRoZSBUQVM1NzIwIGRyaXZlciAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90ZmE5ODc5LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RmYTk4NzkuYwppbmRleCBjYjUzMTBkLi45NWUwYTdhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RmYTk4NzkuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RmYTk4NzkuYwpAQCAtMjMxLDEzICsyMzEsMTQgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgdGZhOTg3OV9jb2RlYyA9IHsKLQkuY29udHJvbHMgPSB0ZmE5ODc5X2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHRmYTk4NzlfY29udHJvbHMpLAotCi0JLmRhcG1fd2lkZ2V0cyA9IHRmYTk4NzlfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh0ZmE5ODc5X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gdGZhOTg3OV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh0ZmE5ODc5X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHRmYTk4NzlfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh0ZmE5ODc5X2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB0ZmE5ODc5X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHRmYTk4NzlfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHRmYTk4NzlfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHRmYTk4NzlfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgdGZhOTg3OV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLmMKaW5kZXggY2Q4YzAyYi4uNDEwY2FlMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMuYwpAQCAtNTgzLDEyICs1ODMsMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSB0bHYzMjBhaWMyM19zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB0bHYzMjBhaWMyM19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gdGx2MzIwYWljMjNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh0bHYzMjBhaWMyM19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHRsdjMyMGFpYzIzX2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX2ludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHRsdjMyMGFpYzIzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzIzX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gdGx2MzIwYWljMjNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodGx2MzIwYWljMjNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHRsdjMyMGFpYzIzX2ludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh0bHYzMjBhaWMyM19pbnRlcmNvbiksCisJfSwKIH07CiAKIGludCB0bHYzMjBhaWMyM19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjYuYwppbmRleCAyYzkwNGQ3Li4xNGFhOTZkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzI2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyNi5jCkBAIC0zMjEsMTIgKzMyMSwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIGFpYzI2X3NvY19jb2RlY19kZXYgPSB7CiAJLnByb2JlID0gYWljMjZfcHJvYmUsCi0JLmNvbnRyb2xzID0gYWljMjZfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGFpYzI2X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHRsdjMyMGFpYzI2X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodGx2MzIwYWljMjZfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB0bHYzMjBhaWMyNl9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh0bHYzMjBhaWMyNl9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBhaWMyNl9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShhaWMyNl9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHRsdjMyMGFpYzI2X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHRsdjMyMGFpYzI2X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB0bHYzMjBhaWMyNl9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUodGx2MzIwYWljMjZfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYWljMjZfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMXh4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguYwppbmRleCAzYzVlMWRmLi5iZTFhNjRiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguYwpAQCAtMjczLDEwICsyNzMsMjAgQEAKIC8qCiAgKiBjb250cm9scyB0byBiZSBleHBvcnRlZCB0byB0aGUgdXNlciBzcGFjZQogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljMzF4eF9zbmRfY29udHJvbHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjb21tb24zMXh4X3NuZF9jb250cm9sc1tdID0gewogCVNPQ19ET1VCTEVfUl9TX1RMVigiREFDIFBsYXliYWNrIFZvbHVtZSIsIEFJQzMxWFhfTERBQ1ZPTCwKIAkJCSAgIEFJQzMxWFhfUkRBQ1ZPTCwgMCwgLTEyNywgNDgsIDcsIDAsIGRhY192b2xfdGx2KSwKIAorCVNPQ19ET1VCTEVfUigiSFAgRHJpdmVyIFBsYXliYWNrIFN3aXRjaCIsIEFJQzMxWFhfSFBMR0FJTiwKKwkJICAgICBBSUMzMVhYX0hQUkdBSU4sIDIsIDEsIDApLAorCVNPQ19ET1VCTEVfUl9UTFYoIkhQIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLCBBSUMzMVhYX0hQTEdBSU4sCisJCQkgQUlDMzFYWF9IUFJHQUlOLCAzLCAweDA5LCAwLCBocF9kcnZfdGx2KSwKKworCVNPQ19ET1VCTEVfUl9UTFYoIkhQIEFuYWxvZyBQbGF5YmFjayBWb2x1bWUiLCBBSUMzMVhYX0xBTkFMT0dIUEwsCisJCQkgQUlDMzFYWF9SQU5BTE9HSFBSLCAwLCAweDdGLCAxLCBocF92b2xfdGx2KSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMzMXh4X3NuZF9jb250cm9sc1tdID0gewogCVNPQ19TSU5HTEVfVExWKCJBREMgRmluZSBDYXB0dXJlIFZvbHVtZSIsIEFJQzMxWFhfQURDRkdBLCA0LCA0LCAxLAogCQkgICAgICAgYWRjX2ZnYWluX3RsdiksCiAKQEAgLTI4NiwxNCArMjk2LDYgQEAKIAogCVNPQ19TSU5HTEVfVExWKCJNaWMgUEdBIENhcHR1cmUgVm9sdW1lIiwgQUlDMzFYWF9NSUNQR0EsIDAsCiAJCSAgICAgICAxMTksIDAsIG1pY19wZ2FfdGx2KSwKLQotCVNPQ19ET1VCTEVfUigiSFAgRHJpdmVyIFBsYXliYWNrIFN3aXRjaCIsIEFJQzMxWFhfSFBMR0FJTiwKLQkJICAgICBBSUMzMVhYX0hQUkdBSU4sIDIsIDEsIDApLAotCVNPQ19ET1VCTEVfUl9UTFYoIkhQIERyaXZlciBQbGF5YmFjayBWb2x1bWUiLCBBSUMzMVhYX0hQTEdBSU4sCi0JCQkgQUlDMzFYWF9IUFJHQUlOLCAzLCAweDA5LCAwLCBocF9kcnZfdGx2KSwKLQotCVNPQ19ET1VCTEVfUl9UTFYoIkhQIEFuYWxvZyBQbGF5YmFjayBWb2x1bWUiLCBBSUMzMVhYX0xBTkFMT0dIUEwsCi0JCQkgQUlDMzFYWF9SQU5BTE9HSFBSLCAwLCAweDdGLCAxLCBocF92b2xfdGx2KSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhaWMzMTF4X3NuZF9jb250cm9sc1tdID0gewpAQCAtMzk3LDE3ICszOTksMjggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxlZnRfb3V0cHV0X3N3aXRjaGVzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljMzF4eF9sZWZ0X291dHB1dF9zd2l0Y2hlc1tdID0gewogCVNPQ19EQVBNX1NJTkdMRSgiRnJvbSBMZWZ0IERBQyIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNiwgMSwgMCksCiAJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFMUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNSwgMSwgMCksCiAJU09DX0RBUE1fU0lOR0xFKCJGcm9tIE1JQzFSUCIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNCwgMSwgMCksCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgcmlnaHRfb3V0cHV0X3N3aXRjaGVzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYWljMzF4eF9yaWdodF9vdXRwdXRfc3dpdGNoZXNbXSA9IHsKIAlTT0NfREFQTV9TSU5HTEUoIkZyb20gUmlnaHQgREFDIiwgQUlDMzFYWF9EQUNNSVhFUlJPVVRFLCAyLCAxLCAwKSwKIAlTT0NfREFQTV9TSU5HTEUoIkZyb20gTUlDMVJQIiwgQUlDMzFYWF9EQUNNSVhFUlJPVVRFLCAxLCAxLCAwKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBkYWMzMXh4X2xlZnRfb3V0cHV0X3N3aXRjaGVzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIExlZnQgREFDIiwgQUlDMzFYWF9EQUNNSVhFUlJPVVRFLCA2LCAxLCAwKSwKKwlTT0NfREFQTV9TSU5HTEUoIkZyb20gQUlOMSIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgNSwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIEFJTjIiLCBBSUMzMVhYX0RBQ01JWEVSUk9VVEUsIDQsIDEsIDApLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGRhYzMxeHhfcmlnaHRfb3V0cHV0X3N3aXRjaGVzW10gPSB7CisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIFJpZ2h0IERBQyIsIEFJQzMxWFhfREFDTUlYRVJST1VURSwgMiwgMSwgMCksCisJU09DX0RBUE1fU0lOR0xFKCJGcm9tIEFJTjIiLCBBSUMzMVhYX0RBQ01JWEVSUk9VVEUsIDEsIDEsIDApLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHBfdGVybV9taWMxbHAgPQogCVNPQ19EQVBNX0VOVU0oIk1JQzFMUCBQLVRlcm1pbmFsIiwgbWljMWxwX3BfZW51bSk7CiAKQEAgLTQ1Nyw3ICs0NzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYWljMzF4eF9kYXBtX3dpZGdldHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBjb21tb24zMXh4X2RhcG1fd2lkZ2V0c1tdID0gewogCVNORF9TT0NfREFQTV9BSUZfSU4oIkRBQyBJTiIsICJEQUMgUGxheWJhY2siLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAogCiAJU05EX1NPQ19EQVBNX01VWCgiREFDIExlZnQgSW5wdXQiLApAQCAtNDczLDE0ICs0ODYsNyBAQAogCQkJICAgQUlDMzFYWF9EQUNTRVRVUCwgNiwgMCwgYWljMzF4eF9kYXBtX3Bvd2VyX2V2ZW50LAogCQkJICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKIAotCS8qIE91dHB1dCBNaXhlcnMgKi8KLQlTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBMZWZ0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJICAgbGVmdF9vdXRwdXRfc3dpdGNoZXMsCi0JCQkgICBBUlJBWV9TSVpFKGxlZnRfb3V0cHV0X3N3aXRjaGVzKSksCi0JU05EX1NPQ19EQVBNX01JWEVSKCJPdXRwdXQgUmlnaHQiLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQkgICByaWdodF9vdXRwdXRfc3dpdGNoZXMsCi0JCQkgICBBUlJBWV9TSVpFKHJpZ2h0X291dHB1dF9zd2l0Y2hlcykpLAotCisJLyogSFAgKi8KIAlTTkRfU09DX0RBUE1fU1dJVENIKCJIUCBMZWZ0IiwgU05EX1NPQ19OT1BNLCAwLCAwLAogCQkJICAgICZhaWMzMXh4X2RhcG1faHBsX3N3aXRjaCksCiAJU05EX1NPQ19EQVBNX1NXSVRDSCgiSFAgUmlnaHQiLCBTTkRfU09DX05PUE0sIDAsIDAsCkBAIC00OTQsMTAgKzUwMCwzNCBAQAogCQkJICAgICAgIE5VTEwsIDAsIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwKIAkJCSAgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQgfCBTTkRfU09DX0RBUE1fUE9TVF9QTVUpLAogCi0JLyogQURDICovCi0JU05EX1NPQ19EQVBNX0FEQ19FKCJBREMiLCAiQ2FwdHVyZSIsIEFJQzMxWFhfQURDU0VUVVAsIDcsIDAsCi0JCQkgICBhaWMzMXh4X2RhcG1fcG93ZXJfZXZlbnQsIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8Ci0JCQkgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCS8qIE1pYyBCaWFzICovCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQklBUyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgbWljX2JpYXNfZXZlbnQsCisJCQkgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAorCisJLyogT3V0cHV0cyAqLworCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQTCIpLAorCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQUiIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGRhYzMxeHhfZGFwbV93aWRnZXRzW10gPSB7CisJLyogSW5wdXRzICovCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4xIiksCisJU05EX1NPQ19EQVBNX0lOUFVUKCJBSU4yIiksCisKKwkvKiBPdXRwdXQgTWl4ZXJzICovCisJU05EX1NPQ19EQVBNX01JWEVSKCJPdXRwdXQgTGVmdCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgIGRhYzMxeHhfbGVmdF9vdXRwdXRfc3dpdGNoZXMsCisJCQkgICBBUlJBWV9TSVpFKGRhYzMxeHhfbGVmdF9vdXRwdXRfc3dpdGNoZXMpKSwKKwlTTkRfU09DX0RBUE1fTUlYRVIoIk91dHB1dCBSaWdodCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCSAgIGRhYzMxeHhfcmlnaHRfb3V0cHV0X3N3aXRjaGVzLAorCQkJICAgQVJSQVlfU0laRShkYWMzMXh4X3JpZ2h0X291dHB1dF9zd2l0Y2hlcykpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFpYzMxeHhfZGFwbV93aWRnZXRzW10gPSB7CisJLyogSW5wdXRzICovCisJU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMxTFAiKSwKKwlTTkRfU09DX0RBUE1fSU5QVVQoIk1JQzFSUCIpLAorCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMUxNIiksCiAKIAkvKiBJbnB1dCBTZWxlY3Rpb24gdG8gTUlDX1BHQSAqLwogCVNORF9TT0NfREFQTV9NVVgoIk1JQzFMUCBQLVRlcm1pbmFsIiwgU05EX1NPQ19OT1BNLCAwLCAwLApAQCAtNTA3LDI0ICs1MzcsMjUgQEAKIAlTTkRfU09DX0RBUE1fTVVYKCJNSUMxTE0gUC1UZXJtaW5hbCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKIAkJCSAmcF90ZXJtX21pYzFsbSksCiAKKwkvKiBBREMgKi8KKwlTTkRfU09DX0RBUE1fQURDX0UoIkFEQyIsICJDYXB0dXJlIiwgQUlDMzFYWF9BRENTRVRVUCwgNywgMCwKKwkJCSAgIGFpYzMxeHhfZGFwbV9wb3dlcl9ldmVudCwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QT1NUX1BNRCksCisKIAlTTkRfU09DX0RBUE1fTVVYKCJNSUMxTE0gTS1UZXJtaW5hbCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKIAkJCSAmbV90ZXJtX21pYzFsbSksCisKIAkvKiBFbmFibGluZyAmIERpc2FibGluZyBNSUMgR2FpbiBDdGwgKi8KIAlTTkRfU09DX0RBUE1fUEdBKCJNSUNfR0FJTl9DVEwiLCBBSUMzMVhYX01JQ1BHQSwKIAkJCSA3LCAxLCBOVUxMLCAwKSwKIAotCS8qIE1pYyBCaWFzICovCi0JU05EX1NPQ19EQVBNX1NVUFBMWSgiTUlDQklBUyIsIFNORF9TT0NfTk9QTSwgMCwgMCwgbWljX2JpYXNfZXZlbnQsCi0JCQkgICAgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwgU05EX1NPQ19EQVBNX1BSRV9QTUQpLAotCi0JLyogT3V0cHV0cyAqLwotCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQTCIpLAotCVNORF9TT0NfREFQTV9PVVRQVVQoIkhQUiIpLAotCi0JLyogSW5wdXRzICovCi0JU05EX1NPQ19EQVBNX0lOUFVUKCJNSUMxTFAiKSwKLQlTTkRfU09DX0RBUE1fSU5QVVQoIk1JQzFSUCIpLAotCVNORF9TT0NfREFQTV9JTlBVVCgiTUlDMUxNIiksCisJLyogT3V0cHV0IE1peGVycyAqLworCVNORF9TT0NfREFQTV9NSVhFUigiT3V0cHV0IExlZnQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICBhaWMzMXh4X2xlZnRfb3V0cHV0X3N3aXRjaGVzLAorCQkJICAgQVJSQVlfU0laRShhaWMzMXh4X2xlZnRfb3V0cHV0X3N3aXRjaGVzKSksCisJU05EX1NPQ19EQVBNX01JWEVSKCJPdXRwdXQgUmlnaHQiLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQkgICBhaWMzMXh4X3JpZ2h0X291dHB1dF9zd2l0Y2hlcywKKwkJCSAgIEFSUkFZX1NJWkUoYWljMzF4eF9yaWdodF9vdXRwdXRfc3dpdGNoZXMpKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhaWMzMTF4X2RhcG1fd2lkZ2V0c1tdID0gewpAQCAtNTU0LDcgKzU4NSw3IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZQotYWljMzF4eF9hdWRpb19tYXBbXSA9IHsKK2NvbW1vbjMxeHhfYXVkaW9fbWFwW10gPSB7CiAJLyogREFDIElucHV0IFJvdXRpbmcgKi8KIAl7IkRBQyBMZWZ0IElucHV0IiwgIkxlZnQgRGF0YSIsICJEQUMgSU4ifSwKIAl7IkRBQyBMZWZ0IElucHV0IiwgIlJpZ2h0IERhdGEiLCAiREFDIElOIn0sCkBAIC01NjUsNiArNTk2LDMxIEBACiAJeyJEQUMgTGVmdCIsIE5VTEwsICJEQUMgTGVmdCBJbnB1dCJ9LAogCXsiREFDIFJpZ2h0IiwgTlVMTCwgIkRBQyBSaWdodCBJbnB1dCJ9LAogCisJLyogSFBMIHBhdGggKi8KKwl7IkhQIExlZnQiLCAiU3dpdGNoIiwgIk91dHB1dCBMZWZ0In0sCisJeyJIUEwgRHJpdmVyIiwgTlVMTCwgIkhQIExlZnQifSwKKwl7IkhQTCIsIE5VTEwsICJIUEwgRHJpdmVyIn0sCisKKwkvKiBIUFIgcGF0aCAqLworCXsiSFAgUmlnaHQiLCAiU3dpdGNoIiwgIk91dHB1dCBSaWdodCJ9LAorCXsiSFBSIERyaXZlciIsIE5VTEwsICJIUCBSaWdodCJ9LAorCXsiSFBSIiwgTlVMTCwgIkhQUiBEcml2ZXIifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlCitkYWMzMXh4X2F1ZGlvX21hcFtdID0geworCS8qIExlZnQgT3V0cHV0ICovCisJeyJPdXRwdXQgTGVmdCIsICJGcm9tIExlZnQgREFDIiwgIkRBQyBMZWZ0In0sCisJeyJPdXRwdXQgTGVmdCIsICJGcm9tIEFJTjEiLCAiQUlOMSJ9LAorCXsiT3V0cHV0IExlZnQiLCAiRnJvbSBBSU4yIiwgIkFJTjIifSwKKworCS8qIFJpZ2h0IE91dHB1dCAqLworCXsiT3V0cHV0IFJpZ2h0IiwgIkZyb20gUmlnaHQgREFDIiwgIkRBQyBSaWdodCJ9LAorCXsiT3V0cHV0IFJpZ2h0IiwgIkZyb20gQUlOMiIsICJBSU4yIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZQorYWljMzF4eF9hdWRpb19tYXBbXSA9IHsKIAkvKiBNaWMgaW5wdXQgKi8KIAl7Ik1JQzFMUCBQLVRlcm1pbmFsIiwgIkZGUiAxMCBPaG0iLCAiTUlDMUxQIn0sCiAJeyJNSUMxTFAgUC1UZXJtaW5hbCIsICJGRlIgMjAgT2htIiwgIk1JQzFMUCJ9LApAQCAtNTk1LDE2ICs2NTEsNiBAQAogCS8qIFJpZ2h0IE91dHB1dCAqLwogCXsiT3V0cHV0IFJpZ2h0IiwgIkZyb20gUmlnaHQgREFDIiwgIkRBQyBSaWdodCJ9LAogCXsiT3V0cHV0IFJpZ2h0IiwgIkZyb20gTUlDMVJQIiwgIk1JQzFSUCJ9LAotCi0JLyogSFBMIHBhdGggKi8KLQl7IkhQIExlZnQiLCAiU3dpdGNoIiwgIk91dHB1dCBMZWZ0In0sCi0JeyJIUEwgRHJpdmVyIiwgTlVMTCwgIkhQIExlZnQifSwKLQl7IkhQTCIsIE5VTEwsICJIUEwgRHJpdmVyIn0sCi0KLQkvKiBIUFIgcGF0aCAqLwotCXsiSFAgUmlnaHQiLCAiU3dpdGNoIiwgIk91dHB1dCBSaWdodCJ9LAotCXsiSFBSIERyaXZlciIsIE5VTEwsICJIUCBSaWdodCJ9LAotCXsiSFBSIiwgTlVMTCwgIkhQUiBEcml2ZXIifSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlCkBAIC02MzMsNiArNjc5LDEzIEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGFpYzMxeHhfcHJpdiAqYWljMzF4eCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCisJaWYgKCEoYWljMzF4eC0+cGRhdGEuY29kZWNfdHlwZSAmIERBQzMxWFhfQklUKSkKKwkJcmV0ID0gc25kX3NvY19hZGRfY29kZWNfY29udHJvbHMoCisJCQljb2RlYywgYWljMzF4eF9zbmRfY29udHJvbHMsCisJCQlBUlJBWV9TSVpFKGFpYzMxeHhfc25kX2NvbnRyb2xzKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWlmIChhaWMzMXh4LT5wZGF0YS5jb2RlY190eXBlICYgQUlDMzFYWF9TVEVSRU9fQ0xBU1NfRF9CSVQpCiAJCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKAogCQkJY29kZWMsIGFpYzMxMXhfc25kX2NvbnRyb2xzLApAQCAtNjUxLDYgKzcwNCwzMCBAQAogCXN0cnVjdCBhaWMzMXh4X3ByaXYgKmFpYzMxeHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0ID0gMDsKIAorCWlmIChhaWMzMXh4LT5wZGF0YS5jb2RlY190eXBlICYgREFDMzFYWF9CSVQpIHsKKwkJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scygKKwkJCWRhcG0sIGRhYzMxeHhfZGFwbV93aWRnZXRzLAorCQkJQVJSQVlfU0laRShkYWMzMXh4X2RhcG1fd2lkZ2V0cykpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcyhkYXBtLCBkYWMzMXh4X2F1ZGlvX21hcCwKKwkJCQkJICAgICAgQVJSQVlfU0laRShkYWMzMXh4X2F1ZGlvX21hcCkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlyZXQgPSBzbmRfc29jX2RhcG1fbmV3X2NvbnRyb2xzKAorCQkJZGFwbSwgYWljMzF4eF9kYXBtX3dpZGdldHMsCisJCQlBUlJBWV9TSVpFKGFpYzMxeHhfZGFwbV93aWRnZXRzKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKGRhcG0sIGFpYzMxeHhfYXVkaW9fbWFwLAorCQkJCQkgICAgICBBUlJBWV9TSVpFKGFpYzMxeHhfYXVkaW9fbWFwKSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwogCWlmIChhaWMzMXh4LT5wZGF0YS5jb2RlY190eXBlICYgQUlDMzFYWF9TVEVSRU9fQ0xBU1NfRF9CSVQpIHsKIAkJcmV0ID0gc25kX3NvY19kYXBtX25ld19jb250cm9scygKIAkJCWRhcG0sIGFpYzMxMXhfZGFwbV93aWRnZXRzLApAQCAtMTExNCwxMiArMTE5MSwxNCBAQAogCS5zZXRfYmlhc19sZXZlbAkJPSBhaWMzMXh4X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmCT0gdHJ1ZSwKIAotCS5jb250cm9scwkJPSBhaWMzMXh4X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWljMzF4eF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMJCT0gYWljMzF4eF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGFpYzMxeHhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMJCT0gYWljMzF4eF9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWljMzF4eF9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gY29tbW9uMzF4eF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShjb21tb24zMXh4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gY29tbW9uMzF4eF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRShjb21tb24zMXh4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBjb21tb24zMXh4X2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoY29tbW9uMzF4eF9hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBhaWMzMXh4X2RhaV9vcHMgPSB7CkBAIC0xMTI5LDE5ICsxMjA4LDM0IEBACiAJLmRpZ2l0YWxfbXV0ZQk9IGFpYzMxeHhfZGFjX211dGUsCiB9OwogCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBkYWMzMXh4X2RhaV9kcml2ZXJbXSA9IHsKKwl7CisJCS5uYW1lID0gInRsdjMyZGFjMzF4eC1oaWZpIiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lCSA9ICJQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluCSA9IDIsCisJCQkuY2hhbm5lbHNfbWF4CSA9IDIsCisJCQkucmF0ZXMJCSA9IEFJQzMxWFhfUkFURVMsCisJCQkuZm9ybWF0cwkgPSBBSUMzMVhYX0ZPUk1BVFMsCisJCX0sCisJCS5vcHMgPSAmYWljMzF4eF9kYWlfb3BzLAorCQkuc3ltbWV0cmljX3JhdGVzID0gMSwKKwl9Cit9OworCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBhaWMzMXh4X2RhaV9kcml2ZXJbXSA9IHsKIAl7CiAJCS5uYW1lID0gInRsdjMyMGFpYzMxeHgtaGlmaSIsCiAJCS5wbGF5YmFjayA9IHsKIAkJCS5zdHJlYW1fbmFtZQkgPSAiUGxheWJhY2siLAotCQkJLmNoYW5uZWxzX21pbgkgPSAxLAorCQkJLmNoYW5uZWxzX21pbgkgPSAyLAogCQkJLmNoYW5uZWxzX21heAkgPSAyLAogCQkJLnJhdGVzCQkgPSBBSUMzMVhYX1JBVEVTLAogCQkJLmZvcm1hdHMJID0gQUlDMzFYWF9GT1JNQVRTLAogCQl9LAogCQkuY2FwdHVyZSA9IHsKIAkJCS5zdHJlYW1fbmFtZQkgPSAiQ2FwdHVyZSIsCi0JCQkuY2hhbm5lbHNfbWluCSA9IDEsCisJCQkuY2hhbm5lbHNfbWluCSA9IDIsCiAJCQkuY2hhbm5lbHNfbWF4CSA9IDIsCiAJCQkucmF0ZXMJCSA9IEFJQzMxWFhfUkFURVMsCiAJCQkuZm9ybWF0cwkgPSBBSUMzMVhYX0ZPUk1BVFMsCkBAIC0xMjU5LDkgKzEzNTMsMTYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2LCAmc29jX2NvZGVjX2RyaXZlcl9haWMzMXh4LAotCQkJCSAgICAgYWljMzF4eF9kYWlfZHJpdmVyLAotCQkJCSAgICAgQVJSQVlfU0laRShhaWMzMXh4X2RhaV9kcml2ZXIpKTsKKwlpZiAoYWljMzF4eC0+cGRhdGEuY29kZWNfdHlwZSAmIERBQzMxWFhfQklUKQorCQlyZXR1cm4gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmaTJjLT5kZXYsCisJCQkJJnNvY19jb2RlY19kcml2ZXJfYWljMzF4eCwKKwkJCQlkYWMzMXh4X2RhaV9kcml2ZXIsCisJCQkJQVJSQVlfU0laRShkYWMzMXh4X2RhaV9kcml2ZXIpKTsKKwllbHNlCisJCXJldHVybiBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKKwkJCQkmc29jX2NvZGVjX2RyaXZlcl9haWMzMXh4LAorCQkJCWFpYzMxeHhfZGFpX2RyaXZlciwKKwkJCQlBUlJBWV9TSVpFKGFpYzMxeHhfZGFpX2RyaXZlcikpOwogfQogCiBzdGF0aWMgaW50IGFpYzMxeHhfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQpAQCAtMTI3Nyw2ICsxMzc4LDcgQEAKIAl7ICJ0bHYzMjBhaWMzMTEwIiwgQUlDMzExMCB9LAogCXsgInRsdjMyMGFpYzMxMjAiLCBBSUMzMTIwIH0sCiAJeyAidGx2MzIwYWljMzExMSIsIEFJQzMxMTEgfSwKKwl7ICJ0bHYzMjBkYWMzMTAwIiwgREFDMzEwMCB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhaWMzMXh4X2kyY19pZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzMxeHguaCBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5oCmluZGV4IGFjOWIxNDYuLjVhY2Q1YjYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzF4eC5oCkBAIC0yNCwxMiArMjQsMTQgQEAKIAogI2RlZmluZSBBSUMzMVhYX1NURVJFT19DTEFTU19EX0JJVAkweDEKICNkZWZpbmUgQUlDMzFYWF9NSU5JRFNQX0JJVAkJMHgyCisjZGVmaW5lIERBQzMxWFhfQklUCQkJMHg0CiAKIGVudW0gYWljMzF4eF90eXBlIHsKIAlBSUMzMTAwCT0gMCwKIAlBSUMzMTEwID0gQUlDMzFYWF9TVEVSRU9fQ0xBU1NfRF9CSVQsCiAJQUlDMzEyMCA9IEFJQzMxWFhfTUlOSURTUF9CSVQsCiAJQUlDMzExMSA9IChBSUMzMVhYX1NURVJFT19DTEFTU19EX0JJVCB8IEFJQzMxWFhfTUlOSURTUF9CSVQpLAorCURBQzMxMDAgPSBEQUMzMVhYX0JJVCwKIH07CiAKIHN0cnVjdCBhaWMzMXh4X3BkYXRhIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMzJ4NC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMKaW5kZXggODVkNDk3OC4uMjhmZGZjNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzMng0LmMKQEAgLTc5NywxMiArNzk3LDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gYWljMzJ4NF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSBhaWMzMng0X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShhaWMzMng0X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IGFpYzMyeDRfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhaWMzMng0X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYWljMzJ4NF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShhaWMzMng0X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFpYzMyeDRfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUoYWljMzJ4NF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGFpYzMyeDRfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWljMzJ4NF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gYWljMzJ4NF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYWljMzJ4NF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgYWljMzJ4NF9wYXJzZV9kdChzdHJ1Y3QgYWljMzJ4NF9wcml2ICphaWMzMng0LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMzeC5jCmluZGV4IGE1NjQ3NTkuLjVhOGQ5NmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljM3guYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzN4LmMKQEAgLTE2NzAsMTIgKzE2NzAsMTQgQEAKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAJLnByb2JlID0gYWljM3hfcHJvYmUsCiAJLnJlbW92ZSA9IGFpYzN4X3JlbW92ZSwKLQkuY29udHJvbHMgPSBhaWMzeF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYWljM3hfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gYWljM3hfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShhaWMzeF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IGFpYzN4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKGFpYzN4X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gYWljM3hfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUoYWljM3hfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShpbnRlcmNvbiksCisJfSwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGRhYzMzLmMKaW5kZXggZjdhNmNlNy4uN2JjZjAxZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90bHYzMjBkYWMzMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwZGFjMzMuYwpAQCAtOTAsNyArOTAsNiBAQAogCiBzdHJ1Y3QgdGx2MzIwZGFjMzNfcHJpdiB7CiAJc3RydWN0IG11dGV4IG11dGV4OwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpkYWMzM193cTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CiAJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbREFDMzNfTlVNX1NVUFBMSUVTXTsKQEAgLTc3MSw3ICs3NzAsNyBAQAogCiAJLyogRG8gbm90IHNjaGVkdWxlIHRoZSB3b3JrcXVldWUgaW4gTW9kZTcgKi8KIAlpZiAoZGFjMzMtPmZpZm9fbW9kZSAhPSBEQUMzM19GSUZPX01PREU3KQotCQlxdWV1ZV93b3JrKGRhYzMzLT5kYWMzM193cSwgJmRhYzMzLT53b3JrKTsKKwkJc2NoZWR1bGVfd29yaygmZGFjMzMtPndvcmspOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMTEyNyw3ICsxMTI2LDcgQEAKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CiAJCWlmIChkYWMzMy0+Zmlmb19tb2RlKSB7CiAJCQlkYWMzMy0+c3RhdGUgPSBEQUMzM19QUkVGSUxMOwotCQkJcXVldWVfd29yayhkYWMzMy0+ZGFjMzNfd3EsICZkYWMzMy0+d29yayk7CisJCQlzY2hlZHVsZV93b3JrKCZkYWMzMy0+d29yayk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgpAQCAtMTEzNSw3ICsxMTM0LDcgQEAKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CiAJCWlmIChkYWMzMy0+Zmlmb19tb2RlKSB7CiAJCQlkYWMzMy0+c3RhdGUgPSBEQUMzM19GTFVTSDsKLQkJCXF1ZXVlX3dvcmsoZGFjMzMtPmRhYzMzX3dxLCAmZGFjMzMtPndvcmspOworCQkJc2NoZWR1bGVfd29yaygmZGFjMzMtPndvcmspOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNDEwLDE0ICsxNDA5LDYgQEAKIAkJCWRhYzMzLT5pcnEgPSAtMTsKIAkJfQogCQlpZiAoZGFjMzMtPmlycSAhPSAtMSkgewotCQkJLyogU2V0dXAgd29yayBxdWV1ZSAqLwotCQkJZGFjMzMtPmRhYzMzX3dxID0KLQkJCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidGx2MzIwZGFjMzMiKTsKLQkJCWlmIChkYWMzMy0+ZGFjMzNfd3EgPT0gTlVMTCkgewotCQkJCWZyZWVfaXJxKGRhYzMzLT5pcnEsIGNvZGVjKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQogCQkJSU5JVF9XT1JLKCZkYWMzMy0+d29yaywgZGFjMzNfd29yayk7CiAJCX0KIAl9CkBAIC0xNDM3LDcgKzE0MjgsNyBAQAogCiAJaWYgKGRhYzMzLT5pcnEgPj0gMCkgewogCQlmcmVlX2lycShkYWMzMy0+aXJxLCBkYWMzMy0+Y29kZWMpOwotCQlkZXN0cm95X3dvcmtxdWV1ZShkYWMzMy0+ZGFjMzNfd3EpOworCQlmbHVzaF93b3JrKCZkYWMzMy0+d29yayk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTQ1MywxMiArMTQ0NCwxNCBAQAogCS5wcm9iZSA9IGRhYzMzX3NvY19wcm9iZSwKIAkucmVtb3ZlID0gZGFjMzNfc29jX3JlbW92ZSwKIAotCS5jb250cm9scyA9IGRhYzMzX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShkYWMzM19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBkYWMzM19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGRhYzMzX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSBkYWMzM19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShkYWMzM19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IGRhYzMzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKGRhYzMzX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKGF1ZGlvX21hcCksCisJfSwKIH07CiAKICNkZWZpbmUgREFDMzNfUkFURVMJKFNORFJWX1BDTV9SQVRFXzQ0MTAwIHwgXApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90cGE2MTMwYTIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdHBhNjEzMGEyLmMKaW5kZXggZjFlYTA1Mi4uMmUwMTRjOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90cGE2MTMwYTIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RwYTYxMzBhMi5jCkBAIC01Miw3ICs1Miw3IEBACiAKIHN0YXRpYyBpbnQgdHBhNjEzMGEyX3Bvd2VyKHN0cnVjdCB0cGE2MTMwYTJfZGF0YSAqZGF0YSwgYm9vbCBlbmFibGUpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMCwgcmV0MjsKIAogCWlmIChlbmFibGUpIHsKIAkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShkYXRhLT5zdXBwbHkpOwpAQCAtNjQsNyArNjQsMzAgQEAKIAkJLyogUG93ZXIgb24gKi8KIAkJaWYgKGRhdGEtPnBvd2VyX2dwaW8gPj0gMCkKIAkJCWdwaW9fc2V0X3ZhbHVlKGRhdGEtPnBvd2VyX2dwaW8sIDEpOworCisJCS8qIFN5bmMgcmVnaXN0ZXJzICovCisJCXJlZ2NhY2hlX2NhY2hlX29ubHkoZGF0YS0+cmVnbWFwLCBmYWxzZSk7CisJCXJldCA9IHJlZ2NhY2hlX3N5bmMoZGF0YS0+cmVnbWFwKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlkZXZfZXJyKGRhdGEtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHN5bmMgcmVnaXN0ZXJzOiAlZFxuIiwgcmV0KTsKKwkJCXJlZ2NhY2hlX2NhY2hlX29ubHkoZGF0YS0+cmVnbWFwLCB0cnVlKTsKKwkJCWlmIChkYXRhLT5wb3dlcl9ncGlvID49IDApCisJCQkJZ3Bpb19zZXRfdmFsdWUoZGF0YS0+cG93ZXJfZ3BpbywgMCk7CisJCQlyZXQyID0gcmVndWxhdG9yX2Rpc2FibGUoZGF0YS0+c3VwcGx5KTsKKwkJCWlmIChyZXQyICE9IDApCisJCQkJZGV2X2VycihkYXRhLT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gZGlzYWJsZSBzdXBwbHk6ICVkXG4iLCByZXQyKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9IGVsc2UgeworCQkvKiBQb3dlcmVkIG9mZiBkZXZpY2UgZG9lcyBub3QgcmV0YWluIHJlZ2lzdGVycy4gV2hpbGUgZGV2aWNlCisJCSAqIGlzIG9mZiwgYW55IHJlZ2lzdGVyIHVwZGF0ZXMgKGkuZS4gdm9sdW1lIGNoYW5nZXMpIHNob3VsZAorCQkgKiBoYXBwZW4gaW4gY2FjaGUgb25seS4KKwkJICovCisJCXJlZ2NhY2hlX21hcmtfZGlydHkoZGF0YS0+cmVnbWFwKTsKKwkJcmVnY2FjaGVfY2FjaGVfb25seShkYXRhLT5yZWdtYXAsIHRydWUpOworCiAJCS8qIFBvd2VyIG9mZiAqLwogCQlpZiAoZGF0YS0+cG93ZXJfZ3BpbyA+PSAwKQogCQkJZ3Bpb19zZXRfdmFsdWUoZGF0YS0+cG93ZXJfZ3BpbywgMCk7CkBAIC03NSw5ICs5OCw2IEBACiAJCQkJIkZhaWxlZCB0byBkaXNhYmxlIHN1cHBseTogJWRcbiIsIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0KLQkJLyogZGV2aWNlIHJlZ3MgZG9lcyBub3QgbWF0Y2ggdGhlIGNhY2hlIHN0YXRlIGFueW1vcmUgKi8KLQkJcmVnY2FjaGVfbWFya19kaXJ0eShkYXRhLT5yZWdtYXApOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC04OCwyNSArMTA4LDE0IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29tcG9uZW50ICpjID0gc25kX3NvY19kYXBtX3RvX2NvbXBvbmVudCh3LT5kYXBtKTsKIAlzdHJ1Y3QgdHBhNjEzMGEyX2RhdGEgKmRhdGEgPSBzbmRfc29jX2NvbXBvbmVudF9nZXRfZHJ2ZGF0YShjKTsKLQlpbnQgcmV0OwogCi0JLyogYmVmb3JlIHdpZGdldCBwb3dlciB1cCAqLwogCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7Ci0JCS8qIFR1cm4gb24gdGhlIGNoaXAgKi8KLQkJdHBhNjEzMGEyX3Bvd2VyKGRhdGEsIHRydWUpOwotCQkvKiBTeW5jIHRoZSByZWdpc3RlcnMgKi8KLQkJcmV0ID0gcmVnY2FjaGVfc3luYyhkYXRhLT5yZWdtYXApOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihjLT5kZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjaGlwXG4iKTsKLQkJCXRwYTYxMzBhMl9wb3dlcihkYXRhLCBmYWxzZSk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JLyogYWZ0ZXIgd2lkZ2V0IHBvd2VyIGRvd24gKi8KKwkJLyogQmVmb3JlIHdpZGdldCBwb3dlciB1cDogdHVybiBjaGlwIG9uLCBzeW5jIHJlZ2lzdGVycyAqLworCQlyZXR1cm4gdHBhNjEzMGEyX3Bvd2VyKGRhdGEsIHRydWUpOwogCX0gZWxzZSB7Ci0JCXRwYTYxMzBhMl9wb3dlcihkYXRhLCBmYWxzZSk7CisJCS8qIEFmdGVyIHdpZGdldCBwb3dlciBkb3duOiB0dXJuIGNoaXAgb2ZmICovCisJCXJldHVybiB0cGE2MTMwYTJfcG93ZXIoZGF0YSwgZmFsc2UpOwogCX0KLQotCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTkwLDcgKzE5OSw3IEBACiAJeyAiUmlnaHQgUEdBIiwgTlVMTCwgIlBvd2VyIiB9LAogfTsKIAotc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciB0cGE2MTMwYTJfY29tcG9uZW50X2RyaXZlciA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIHRwYTYxMzBhMl9jb21wb25lbnRfZHJpdmVyID0gewogCS5uYW1lID0gInRwYTYxMzBhMiIsCiAJLnByb2JlID0gdHBhNjEzMGEyX2NvbXBvbmVudF9wcm9iZSwKIAkuZGFwbV93aWRnZXRzID0gdHBhNjEzMGEyX2RhcG1fd2lkZ2V0cywKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvdHdsNDAzMC5jIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKaW5kZXggYTVhNGU5Zi4uYTIxMDRkNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy90d2w0MDMwLmMKQEAgLTIxOTksMTIgKzIxOTksMTQgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSB0d2w0MDMwX3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHR3bDQwMzBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHR3bDQwMzBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gdHdsNDAzMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHR3bDQwMzBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBpbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShpbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB0d2w0MDMwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHR3bDQwMzBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB0d2w0MDMwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHR3bDQwMzBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShpbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgdHdsNDAzMF9jb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90d2w2MDQwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuYwppbmRleCAxZjcwODEwLi43NDgwMzZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3R3bDYwNDAuYwpAQCAtMTE1NiwxMiArMTE1NiwxNCBAQAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAkuaWdub3JlX3BtZG93bl90aW1lID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHR3bDYwNDBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHR3bDYwNDBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gdHdsNjA0MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHR3bDYwNDBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBpbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShpbnRlcmNvbiksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB0d2w2MDQwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHR3bDYwNDBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB0d2w2MDQwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHR3bDYwNDBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IGludGVyY29uLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShpbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgdHdsNjA0MF9jb2RlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy91ZGExMzR4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYwppbmRleCBlNGM2OTRjLi41ZmRlZTg3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzNHguYwpAQCAtNTIzLDEwICs1MjMsMTIgQEAKIAkuc2V0X2JpYXNfbGV2ZWwgPSB1ZGExMzR4X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5kYXBtX3dpZGdldHMgPSB1ZGExMzR4X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUodWRhMTM0eF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHVkYTEzNHhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUodWRhMTM0eF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gdWRhMTM0eF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh1ZGExMzR4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB1ZGExMzR4X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh1ZGExMzR4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHVkYTEzNHhfcmVnbWFwX2NvbmZpZyA9IHsKQEAgLTU0NCw2ICs1NDYsNyBAQAogewogCXN0cnVjdCB1ZGExMzR4X3BsYXRmb3JtX2RhdGEgKnBkID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IHVkYTEzNHhfcHJpdiAqdWRhMTM0eDsKKwlpbnQgcmV0OwogCiAJaWYgKCFwZCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIEwzIGJpdGJhbmcgZnVuY3Rpb25cbiIpOwpAQCAtNTU3LDYgKzU2MCwxMiBAQAogCXVkYTEzNHgtPnBkID0gcGQ7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdWRhMTM0eCk7CiAKKwlpZiAocGQtPmwzLnVzZV9ncGlvcykgeworCQlyZXQgPSBsM19zZXRfZ3Bpb19vcHMoJnBkZXYtPmRldiwgJnVkYTEzNHgtPnBkLT5sMyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKIAl1ZGExMzR4LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0KCZwZGV2LT5kZXYsIE5VTEwsIHBkLAogCQkmdWRhMTM0eF9yZWdtYXBfY29uZmlnKTsKIAlpZiAoSVNfRVJSKHVkYTEzNHgtPnJlZ21hcCkpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCmluZGV4IDM1ZjA0NjkuLjUzM2UzYmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdWRhMTM4MC5jCkBAIC03NjUsMTIgKzc2NSwxNCBAQAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHVkYTEzODBfcmVnLAogCS5yZWdfY2FjaGVfc3RlcCA9IDEsCiAKLQkuY29udHJvbHMgPSB1ZGExMzgwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh1ZGExMzgwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHVkYTEzODBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh1ZGExMzgwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gdWRhMTM4MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh1ZGExMzgwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHVkYTEzODBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUodWRhMTM4MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHVkYTEzODBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUodWRhMTM4MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gdWRhMTM4MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUodWRhMTM4MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JMkMpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dsMTI3My5jIGIvc291bmQvc29jL2NvZGVjcy93bDEyNzMuYwppbmRleCAxYjc5Nzc4Li5mY2ZmYjZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dsMTI3My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd2wxMjczLmMKQEAgLTQ4NCwxMiArNDg0LDE0IEBACiAJLnByb2JlID0gd2wxMjczX3Byb2JlLAogCS5yZW1vdmUgPSB3bDEyNzNfcmVtb3ZlLAogCi0JLmNvbnRyb2xzID0gd2wxMjczX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdsMTI3M19jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdsMTI3M19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdsMTI3M19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdsMTI3M19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bDEyNzNfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd2wxMjczX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod2wxMjczX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bDEyNzNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod2wxMjczX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bDEyNzNfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdsMTI3M19kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd2wxMjczX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtMDAxMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTAwMTAuYwppbmRleCBlM2MzNGJkLi4wZWI1ZGNmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtMDAxMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20wMDEwLmMKQEAgLTc4OSwxNiArNzg5LDE4IEBACiAKIHN0YXRpYyBpbnQgd20wMDEwX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTAwMTAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd20wMDEwID0gewogCS5wcm9iZSA9IHdtMDAxMF9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTAwMTBfc2V0X2JpYXNfbGV2ZWwsCiAJLnNldF9zeXNjbGsgPSB3bTAwMTBfc2V0X3N5c2NsaywKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuZGFwbV93aWRnZXRzID0gd20wMDEwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod20wMDEwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd20wMDEwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtMDAxMF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gd20wMDEwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtMDAxMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd20wMDEwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTAwMTBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiAjZGVmaW5lIFdNMDAxMF9SQVRFUyAoU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd20xMjUwLWV2MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTEyNTAtZXYxLmMKaW5kZXggZWM0NWM1Yi4uY2Y1ZjA1OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTEyNTAtZXYxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTEyNTAtZXYxLmMKQEAgLTE0MSwxMiArMTQxLDEzIEBACiAJLm9wcyA9ICZ3bTEyNTBfZXYxX29wcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTEyNTBfZXYxID0gewotCS5kYXBtX3dpZGdldHMgPSB3bTEyNTBfZXYxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod20xMjUwX2V2MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtMTI1MF9ldjFfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod20xMjUwX2V2MV9kYXBtX3JvdXRlcyksCi0KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTEyNTBfZXYxID0geworCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IHdtMTI1MF9ldjFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod20xMjUwX2V2MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd20xMjUwX2V2MV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod20xMjUwX2V2MV9kYXBtX3JvdXRlcyksCisJfSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTEyNTBfZXYxX3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIH07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtMjAwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTIwMDAuYwppbmRleCBmMjY2NDM5Li4yM2NkZTNhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtMjAwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMKQEAgLTc5OSwxOCArNzk5LDIwIEBACiAJcmV0dXJuIHdtMjAwMF9hbmNfdHJhbnNpdGlvbih3bTIwMDAsIEFOQ19PRkYpOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd20yMDAwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtMjAwMCA9IHsKIAkucHJvYmUgPSB3bTIwMDBfcHJvYmUsCiAJLnJlbW92ZSA9IHdtMjAwMF9yZW1vdmUsCiAJLnN1c3BlbmQgPSB3bTIwMDBfc3VzcGVuZCwKIAkucmVzdW1lID0gd20yMDAwX3Jlc3VtZSwKIAotCS5kYXBtX3dpZGdldHMgPSB3bTIwMDBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTIwMDBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTIwMDBfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtMjAwMF9hdWRpb19tYXApLAotCS5jb250cm9scyA9IHdtMjAwMF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTIwMDBfY29udHJvbHMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd20yMDAwX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod20yMDAwX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTIwMDBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod20yMDAwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTIwMDBfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTIwMDBfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bTIwMDBfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtMjIwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTIyMDAuYwppbmRleCBmZDE0MzllLi42MDZiZjg4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtMjIwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20yMjAwLmMKQEAgLTIxMDMsNyArMjEwMyw3IEBACiAJLm9wcyA9ICZ3bTIyMDBfZGFpX29wcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX3dtMjIwMCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX3dtMjIwMCA9IHsKIAkucHJvYmUgPSB3bTIyMDBfcHJvYmUsCiAKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCkBAIC0yMTExLDEyICsyMTExLDE0IEBACiAJLnNldF9zeXNjbGsgPSB3bTIyMDBfc2V0X3N5c2NsaywKIAkuc2V0X3BsbCA9IHdtMjIwMF9zZXRfZmxsLAogCi0JLmNvbnRyb2xzID0gd20yMjAwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTIyMDBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd20yMjAwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod20yMjAwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd20yMjAwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtMjIwMF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTIyMDBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod20yMjAwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd20yMjAwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtMjIwMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd20yMjAwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTIyMDBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgd20yMjAwX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmMKaW5kZXggNTEyYTlkMi4uNTYwNTc1MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jCkBAIC0yMjg1LDcgKzIyODUsNyBAQAogCQkJCSAgKDEgPDwgV001MTAwX0dQMV9ESVJfU0hJRlQpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgd201MTAwX3RlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB3bTUxMDBfdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJ3bTUxMDAiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLmRpcmVjdGlvbl9vdXRwdXQJPSB3bTUxMDBfZ3Bpb19kaXJlY3Rpb25fb3V0LApAQCAtMjM4MSw3ICsyMzgxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtNTEwMCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTUxMDAgPSB7CiAJLnByb2JlID0Jd201MTAwX3Byb2JlLAogCS5yZW1vdmUgPQl3bTUxMDBfcmVtb3ZlLAogCkBAIC0yMzkwLDEyICsyMzkwLDE0IEBACiAJLmlkbGVfYmlhc19vZmYgPSAxLAogCiAJLnNlcV9ub3RpZmllciA9IHdtNTEwMF9zZXFfbm90aWZpZXIsCi0JLmNvbnRyb2xzID0gd201MTAwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTUxMDBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd201MTAwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod201MTAwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd201MTAwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtNTEwMF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTUxMDBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod201MTAwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd201MTAwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtNTEwMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd201MTAwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTUxMDBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd201MTAwX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMi5jCmluZGV4IDg0NmRlZWQuLjkzODc2YzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYwpAQCAtMTUyMSw2ICsxNTIxLDE2IEBACiAJeyAiSU4zTCIsIE5VTEwsICJTWVNDTEsiIH0sCiAJeyAiSU4zUiIsIE5VTEwsICJTWVNDTEsiIH0sCiAKKwl7ICJBU1JDMUwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMxUiIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzJMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMlIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCisJeyAiQVNSQzFMIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMxUiIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMkwiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzJSIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCiAJeyAiTUlDQklBUzEiLCBOVUxMLCAiTUlDVkREIiB9LAogCXsgIk1JQ0JJQVMyIiwgTlVMTCwgIk1JQ1ZERCIgfSwKIAl7ICJNSUNCSUFTMyIsIE5VTEwsICJNSUNWREQiIH0sCkBAIC0xNjAwLDcgKzE2MTAsNiBAQAogCXsgIlNsaW0zIENhcHR1cmUiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCiAJeyAiQXVkaW8gVHJhY2UgRFNQIiwgTlVMTCwgIkRTUDEiIH0sCi0JeyAiQXVkaW8gVHJhY2UgRFNQIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAogCXsgIklOMUwgUEdBIiwgTlVMTCwgIklOMUwiIH0sCiAJeyAiSU4xUiBQR0EiLCBOVUxMLCAiSU4xUiIgfSwKQEAgLTE5OTAsNyArMTk5OSw3IEBACiAJcmV0dXJuIHByaXYtPmNvcmUuYXJpem9uYS0+cmVnbWFwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd201MTAyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtNTEwMiA9IHsKIAkucHJvYmUgPSB3bTUxMDJfY29kZWNfcHJvYmUsCiAJLnJlbW92ZSA9IHdtNTEwMl9jb2RlY19yZW1vdmUsCiAJLmdldF9yZWdtYXAgPSB3bTUxMDJfZ2V0X3JlZ21hcCwKQEAgLTIwMDAsMTIgKzIwMDksMTQgQEAKIAkuc2V0X3N5c2NsayA9IGFyaXpvbmFfc2V0X3N5c2NsaywKIAkuc2V0X3BsbCA9IHdtNTEwMl9zZXRfZmxsLAogCi0JLmNvbnRyb2xzID0gd201MTAyX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTUxMDJfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd201MTAyX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod201MTAyX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd201MTAyX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtNTEwMl9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTUxMDJfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod201MTAyX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd201MTAyX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtNTEwMl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd201MTAyX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTUxMDJfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9jb21wcl9vcHMgd201MTAyX2NvbXByX29wcyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd201MTEwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTExMC5jCmluZGV4IDE1NjU0NzAuLjA2YmFlM2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd201MTEwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTUxMTAuYwpAQCAtMTc0NSw2ICsxNzQ1LDE2IEBACiAJeyAiSU40TCIsIE5VTEwsICJTWVNDTEsiIH0sCiAJeyAiSU40UiIsIE5VTEwsICJTWVNDTEsiIH0sCiAKKwl7ICJBU1JDMUwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMxUiIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzJMIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMlIiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCisJeyAiQVNSQzFMIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMxUiIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMkwiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzJSIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCiAJeyAiTUlDQklBUzEiLCBOVUxMLCAiTUlDVkREIiB9LAogCXsgIk1JQ0JJQVMyIiwgTlVMTCwgIk1JQ1ZERCIgfSwKIAl7ICJNSUNCSUFTMyIsIE5VTEwsICJNSUNWREQiIH0sCkBAIC0xODMyLDEwICsxODQyLDggQEAKIAl7ICJTbGltMyBDYXB0dXJlIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAogCXsgIlZvaWNlIENvbnRyb2wgRFNQIiwgTlVMTCwgIkRTUDMiIH0sCi0JeyAiVm9pY2UgQ29udHJvbCBEU1AiLCBOVUxMLCAiU1lTQ0xLIiB9LAogCiAJeyAiQXVkaW8gVHJhY2UgRFNQIiwgTlVMTCwgIkRTUDEiIH0sCi0JeyAiQXVkaW8gVHJhY2UgRFNQIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAogCXsgIklOMUwgUEdBIiwgTlVMTCwgIklOMUwiIH0sCiAJeyAiSU4xUiBQR0EiLCBOVUxMLCAiSU4xUiIgfSwKQEAgLTIzNDcsNyArMjM1NSw3IEBACiAJcmV0dXJuIHByaXYtPmNvcmUuYXJpem9uYS0+cmVnbWFwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd201MTEwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtNTExMCA9IHsKIAkucHJvYmUgPSB3bTUxMTBfY29kZWNfcHJvYmUsCiAJLnJlbW92ZSA9IHdtNTExMF9jb2RlY19yZW1vdmUsCiAJLmdldF9yZWdtYXAgPSB3bTUxMTBfZ2V0X3JlZ21hcCwKQEAgLTIzNTcsMTIgKzIzNjUsMTQgQEAKIAkuc2V0X3N5c2NsayA9IGFyaXpvbmFfc2V0X3N5c2NsaywKIAkuc2V0X3BsbCA9IHdtNTExMF9zZXRfZmxsLAogCi0JLmNvbnRyb2xzID0gd201MTEwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTUxMTBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd201MTEwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod201MTEwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd201MTEwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtNTExMF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTUxMTBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod201MTEwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd201MTEwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtNTExMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd201MTEwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTUxMTBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHNuZF9jb21wcl9vcHMgd201MTEwX2NvbXByX29wcyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204MzUwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCmluZGV4IGZmYmYzZGYuLjJlZmM1YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204MzUwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYwpAQCAtMTU4NywxOSArMTU4NywyMSBAQAogCXJldHVybiB3bTgzNTAtPnJlZ21hcDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODM1MCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTgzNTAgPSB7CiAJLnByb2JlID0Jd204MzUwX2NvZGVjX3Byb2JlLAogCS5yZW1vdmUgPQl3bTgzNTBfY29kZWNfcmVtb3ZlLAogCS5nZXRfcmVnbWFwID0Jd204MzUwX2dldF9yZWdtYXAsCiAJLnNldF9iaWFzX2xldmVsID0gd204MzUwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODM1MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204MzUwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODM1MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODM1MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODM1MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTgzNTBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204MzUwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODM1MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODM1MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTgzNTBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODM1MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204MzUwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bTgzNTBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODQwMC5jCmluZGV4IGIxZDM0NmEuLjZjNTlmYjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg0MDAuYwpAQCAtMTMzMiwxOSArMTMzMiwyMSBAQAogCXJldHVybiB3bTg0MDAtPnJlZ21hcDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODQwMCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg0MDAgPSB7CiAJLnByb2JlID0Jd204NDAwX2NvZGVjX3Byb2JlLAogCS5yZW1vdmUgPQl3bTg0MDBfY29kZWNfcmVtb3ZlLAogCS5nZXRfcmVnbWFwID0Jd204NDAwX2dldF9yZWdtYXAsCiAJLnNldF9iaWFzX2xldmVsID0gd204NDAwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODQwMF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204NDAwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODQwMF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODQwMF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODQwMF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg0MDBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204NDAwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODQwMF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODQwMF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg0MDBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODQwMF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NDAwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bTg0MDBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUxMC5jCmluZGV4IDk5ZTQwZTYuLjExOWNlYWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTEwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1MTAuYwpAQCAtNTgxLDE3ICs1ODEsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODUxMCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg1MTAgPSB7CiAJLnByb2JlID0Jd204NTEwX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODUxMF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg1MTBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODUxMF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg1MTBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg1MTBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg1MTBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NTEwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODUxMF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg1MTBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg1MTBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NTEwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg1MTBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODUxMF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODUxMF9vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NTIzLmMKaW5kZXggYWEyODdhMy4uZGViMmUwNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg1MjMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODUyMy5jCkBAIC00MTMsMTcgKzQxMywxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NTIzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODUyMyA9IHsKIAkucHJvYmUgPQl3bTg1MjNfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204NTIzX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODUyM19jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg1MjNfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg1MjNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg1MjNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg1MjNfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NTIzX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODUyM19jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODUyM19jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204NTIzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODUyM19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NTIzX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg1MjNfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg1MjNfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODU4MC5jCmluZGV4IDY2NjAyYmYuLmZhYTcyODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NTgwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg1ODAuYwpAQCAtODk5LDE3ICs4OTksMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODU4MCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg1ODAgPSB7CiAJLnByb2JlID0Jd204NTgwX3Byb2JlLAogCS5yZW1vdmUgPQl3bTg1ODBfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODU4MF9zZXRfYmlhc19sZXZlbCwKIAotCS5jb250cm9scyA9IHdtODU4MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204NTgwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODU4MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODU4MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODU4MF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg1ODBfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204NTgwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODU4MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODU4MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg1ODBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODU4MF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NTgwX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NTgwX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3MTEuYwppbmRleCBjNzU5ZWMwLi4yYjM3NmM5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODcxMS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzExLmMKQEAgLTM2NywxNyArMzY3LDE5IEBACiAKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODcxMSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3MTEgPSB7CiAJLnByb2JlID0Jd204NzExX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODcxMV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg3MTFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODcxMV9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg3MTFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3MTFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg3MTFfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NzExX2ludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODcxMV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg3MTFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg3MTFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NzExX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg3MTFfaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODcxMV9pbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODcxMV9vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MjcuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI3LmMKaW5kZXggYmIyNWE3NS4uN2ZkZTA3NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MjcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODcyNy5jCkBAIC01MywxMSArNTMsMTMgQEAKIAkJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3MjcgPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IHdtODcyN19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODcyN19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODcyN19kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg3MjdfZGFwbV9yb3V0ZXMpLAorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODcyNyA9IHsKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg3MjdfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NzI3X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg3MjdfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODcyN19kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd204NzI3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODcyOC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3MjguYwppbmRleCAxNTY0ZTY5Li43OTdjYzZlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODcyOC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzI4LmMKQEAgLTIxMSwxNiArMjExLDE4IEBACiAJLm9wcyA9ICZ3bTg3MjhfZGFpX29wcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3MjggPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzI4ID0gewogCS5zZXRfYmlhc19sZXZlbCA9IHdtODcyOF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg3Mjhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODcyOF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg3MjhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3MjhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg3MjhfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NzI4X2ludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODcyOF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg3Mjhfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg3MjhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NzI4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg3MjhfaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODcyOF9pbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODcyOF9vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKaW5kZXggZDE4MjYxYS4uNGY5YTFlYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCkBAIC02MjgsMTYgKzYyOCwxOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3MzEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzMxID0gewogCS5zZXRfYmlhc19sZXZlbCA9IHdtODczMV9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuZGFwbV93aWRnZXRzID0gd204NzMxX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NzMxX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NzMxX2ludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODczMV9pbnRlcmNvbiksCi0JLmNvbnRyb2xzID0Jd204NzMxX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg3MzFfc25kX2NvbnRyb2xzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODczMV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg3MzFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg3MzFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NzMxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg3MzFfaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODczMV9pbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODczMV9vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzM3LmMKaW5kZXggZTc4MDc2MC4uZjBjYjFjNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MzcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczNy5jCkBAIC01NzMsMTcgKzU3MywxOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3MzcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzM3ID0gewogCS5wcm9iZQkJPSB3bTg3MzdfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204NzM3X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODczN19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204NzM3X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODczN19kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODczN19kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGludGVyY29uLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODczN19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg3Mzdfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg3MzdfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NzM3X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBpbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoaW50ZXJjb24pLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3Mzdfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jCmluZGV4IDM2ZWY5MWYuLjU2NWQ0NzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NDEuYwpAQCAtNDk3LDE1ICs0OTcsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc0MSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3NDEgPSB7CiAJLnByb2JlID0Jd204NzQxX3Byb2JlLAogCS5yZW1vdmUgPQl3bTg3NDFfcmVtb3ZlLAogCS5yZXN1bWUgPQl3bTg3NDFfcmVzdW1lLAogCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODc0MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODc0MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODc0MV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg3NDFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuZGFwbV93aWRnZXRzCQk9IHdtODc0MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg3NDFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODc0MV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NzQxX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NzQxX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NTAuYwppbmRleCBiZDlkY2QyLi4wZGEyYmJhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc1MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUwLmMKQEAgLTcwOCwxNyArNzA4LDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc1MCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3NTAgPSB7CiAJLnByb2JlID0Jd204NzUwX3Byb2JlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODc1MF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg3NTBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODc1MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg3NTBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3NTBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg3NTBfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204NzUwX2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODc1MF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg3NTBfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg3NTBfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NzUwX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg3NTBfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODc1MF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODc1MF9vZl9tYXRjaFtdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMKaW5kZXggY2RjYzkxMi4uOWJkZjU0NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jCkBAIC0xNDc4LDE4ICsxNDc4LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3NTMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzUzID0gewogCS5wcm9iZSA9CXdtODc1M19wcm9iZSwKIAkucmVzdW1lID0Jd204NzUzX3Jlc3VtZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg3NTNfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204NzUzX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg3NTNfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204NzUzX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204NzUzX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204NzUzX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODc1M19kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg3NTNfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204NzUzX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204NzUzX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODc1M19kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204NzUzX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg3NTNfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3NTNfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3MC5jCmluZGV4IGRmNjE3ODQuLmQ2ZWRjYmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzAuYwpAQCAtNjA4LDE3ICs2MDgsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzcwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc3MCA9IHsKIAkucHJvYmUgPSB3bTg3NzBfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204NzcwX3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODc3MF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204NzcwX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODc3MF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODc3MF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODc3MF9pbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg3NzBfaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204NzcwX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODc3MF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODc3MF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg3NzBfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODc3MF9pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204NzcwX2ludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204NzcwX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzYuYwppbmRleCA1YWY0NGY5Li5hZTMwNDgwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMKQEAgLTQyNSwxNyArNDI1LDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc3NiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3NzYgPSB7CiAJLnByb2JlID0gCXdtODc3Nl9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg3NzZfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0gd204Nzc2X3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg3NzZfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204Nzc2X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204Nzc2X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHJvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg3NzZfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204Nzc2X3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204Nzc2X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODc3Nl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShyb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bTg3NzZfb2ZfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzgyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc4Mi5jCmluZGV4IGZiNTVmZDguLmJjZGEyMTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzgyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3ODIuYwpAQCAtNTAsMTEgKzUwLDEzIEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg3ODIgPSB7Ci0JLmRhcG1fd2lkZ2V0cyA9IHdtODc4Ml9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODc4Ml9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODc4Ml9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg3ODJfZGFwbV9yb3V0ZXMpLAorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODc4MiA9IHsKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg3ODJfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204NzgyX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg3ODJfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODc4Ml9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd204NzgyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYwppbmRleCA4ZDkxNDcwLi5hZjk1ZDY0OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCkBAIC01NDUsMTAgKzU0NSwxMiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODgwNCA9IHsKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCiAKLQkuZGFwbV93aWRnZXRzID0gd204ODA0X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204ODA0X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204ODA0X2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODgwNF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5kYXBtX3dpZGdldHMJCT0gd204ODA0X2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODgwNF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204ODA0X2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg4MDRfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg4MDRfcmVnbWFwX2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jCmluZGV4IDVkOGRjYTg4Li5jNzdiNDlhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODkwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAwLmMKQEAgLTEyMDgsMTggKzEyMDgsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODkwMCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5MDAgPSB7CiAJLnByb2JlID0Jd204OTAwX3Byb2JlLAogCS5zdXNwZW5kID0Jd204OTAwX3N1c3BlbmQsCiAJLnJlc3VtZSA9CXdtODkwMF9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTAwX3NldF9iaWFzX2xldmVsLAogCi0JLmNvbnRyb2xzID0gd204OTAwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5MDBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTAwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTAwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd204OTAwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODkwMF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5MDBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTAwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTAwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODkwMF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTAwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5MDBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTAwX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jCmluZGV4IGEyNmNhNDkuLjZlODg3YzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDMuYwpAQCAtMTgzMCw3ICsxODMwLDcgQEAKIAkJCSAgICEhdmFsdWUgPDwgV004OTAzX0dQMV9MVkxfU0hJRlQpOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB3bTg5MDNfdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHdtODkwM190ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gIndtODkwMyIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkucmVxdWVzdAkJPSB3bTg5MDNfZ3Bpb19yZXF1ZXN0LApAQCAtMTg3NCwxOCArMTg3NCwyMCBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5MDMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTAzID0gewogCS5yZXN1bWUgPQl3bTg5MDNfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODkwM19zZXRfYmlhc19sZXZlbCwKIAkuc2VxX25vdGlmaWVyID0gd204OTAzX3NlcV9ub3RpZmllciwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg5MDNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODkwM19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5MDNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5MDNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5MDNfaW50ZXJjb24sCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTAzX2ludGVyY29uKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODkwM19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5MDNfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5MDNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTAzX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5MDNfaW50ZXJjb24sCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODkwM19pbnRlcmNvbiksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5MDNfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMKaW5kZXggZWRkN2E3Ny4uNGZkMzUwZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYwpAQCAtMjA4Niw3ICsyMDg2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODkwNCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5MDQgPSB7CiAJLnByb2JlID0Jd204OTA0X3Byb2JlLAogCS5yZW1vdmUgPQl3bTg5MDRfcmVtb3ZlLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODkwNF9zZXRfYmlhc19sZXZlbCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk0MC5jCmluZGV4IDFjNjAwODEuLmI1OTM1NjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTQwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NDAuYwpAQCAtNzIzLDE3ICs3MjMsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTQwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk0MCA9IHsKIAkucHJvYmUgPQl3bTg5NDBfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTQwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9ICAgICB3bTg5NDBfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk0MF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5NDBfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5NDBfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSAgd204OTQwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk0MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5NDBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTQwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTQwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk0MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTQwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5NDBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTQwX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jCmluZGV4IDlkYjAwZDUuLjFlZGM3YjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NTUuYwpAQCAtOTQwLDE3ICs5NDAsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTU1ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk1NSA9IHsKIAkucHJvYmUgPQl3bTg5NTVfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTU1X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9CXdtODk1NV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTU1X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk1NV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk1NV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9CXdtODk1NV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5NTVfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTU1X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk1NV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk1NV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5NTVfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk1NV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTU1X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODk1NV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYwppbmRleCBkN2Y0NDRmLi4zYmYwODFhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMKQEAgLTIyNiwxMSArMjI2LDEwIEBACiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYnlwYXNzX3RsdiwgLTIxMDAsIDMwMCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUob3V0X3RsdiwgLTEyMTAwLCAxMDAsIDEpOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGxpbmVpbmJvb3N0X3RsdiwgLTE1MDAsIDMwMCwgMSk7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1pY2Jvb3N0X3RsdltdID0gewotCVRMVl9EQl9SQU5HRV9IRUFEKDIpLAorc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfUkFOR0UobWljYm9vc3RfdGx2LAogCTAsIDEsIFRMVl9EQl9TQ0FMRV9JVEVNKDAsIDEzMDAsIDApLAogCTIsIDMsIFRMVl9EQl9TQ0FMRV9JVEVNKDIwMDAsIDkwMCwgMCksCi19OworKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk2MF9zbmRfY29udHJvbHNbXSA9IHsKIFNPQ19ET1VCTEVfUl9UTFYoIkNhcHR1cmUgVm9sdW1lIiwgV004OTYwX0xJTlZPTCwgV004OTYwX1JJTlZPTCwKQEAgLTEyNjQsNyArMTI2Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NjAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTYwID0gewogCS5wcm9iZSA9CXdtODk2MF9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5NjBfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYxLmMKaW5kZXggZTMwNDQ2YS4uZTIzY2VhYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NjEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MS5jCkBAIC04ODIsMTggKzg4MiwyMCBAQAogI2RlZmluZSB3bTg5NjFfcmVzdW1lIE5VTEwKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTYxID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk2MSA9IHsKIAkucHJvYmUgPQl3bTg5NjFfcHJvYmUsCiAJLnJlc3VtZSA9CXdtODk2MV9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTYxX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODk2MV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTYxX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk2MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk2MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGF1ZGlvX3BhdGhzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGF1ZGlvX3BhdGhzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk2MV9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5NjFfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5NjFfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTYxX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSBhdWRpb19wYXRocywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUoYXVkaW9fcGF0aHMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTYxX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2Mi5jCmluZGV4IGYzMTA5ZGEuLmZkMjczMWQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5NjIuYwpAQCAtMzM1Nyw3ICszMzU3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBncGlvX2NoaXAgd204OTYyX3RlbXBsYXRlX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCB3bTg5NjJfdGVtcGxhdGVfY2hpcCA9IHsKIAkubGFiZWwJCQk9ICJ3bTg5NjIiLAogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAJLnJlcXVlc3QJCT0gd204OTYyX2dwaW9fcmVxdWVzdCwKQEAgLTM0NzksNyArMzQ3OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NjIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTYyID0gewogCS5wcm9iZSA9CXdtODk2Ml9wcm9iZSwKIAkucmVtb3ZlID0Jd204OTYyX3JlbW92ZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5NjJfc2V0X2JpYXNfbGV2ZWwsCkBAIC0zNzEzLDcgKzM3MTMsNyBAQAogCQkJCQkgICAgQVJSQVlfU0laRSh3bTg5NjJfZGNfbWVhc3VyZSkpOwogCQlpZiAocmV0ICE9IDApCiAJCQlkZXZfZXJyKCZpMmMtPmRldiwKLQkJCQkiRmFpbGVkIHRvIGNvbmZpZ3VyZSBmb3IgREMgbWVzdXJlbWVudDogJWRcbiIsCisJCQkJIkZhaWxlZCB0byBjb25maWd1cmUgZm9yIERDIG1lYXN1cmVtZW50OiAlZFxuIiwKIAkJCQlyZXQpOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKaW5kZXggMmNkZGUzMi4uODg3ZDMxYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jCkBAIC02NDksMTcgKzY0OSwxOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTcxID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk3MSA9IHsKIAkucHJvYmUgPQl3bTg5NzFfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTcxX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODk3MV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTcxX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk3MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk3MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODk3MV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5NzFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTcxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk3MV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk3MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5NzFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk3MV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTcxX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODk3MV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzQuYwppbmRleCBkYzhjM2IxLi5kNDE0ZGRkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3NC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc0LmMKQEAgLTY3NiwxNyArNjc2LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NzQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTc0ID0gewogCS5wcm9iZSA9IAl3bTg5NzRfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTc0X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODk3NF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTc0X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk3NF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk3NF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODk3NF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5NzRfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTc0X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk3NF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk3NF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5NzRfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk3NF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTc0X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bTg5NzRfaTJjX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NzguYwppbmRleCBkMzZkNjAwLi45MGIyZDQxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk3OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTc4LmMKQEAgLTk5MywxOCArOTkzLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NzggPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTc4ID0gewogCS5wcm9iZSA9CXdtODk3OF9wcm9iZSwKIAkuc3VzcGVuZCA9CXdtODk3OF9zdXNwZW5kLAogCS5yZXN1bWUgPQl3bTg5NzhfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk3OF9zZXRfYmlhc19sZXZlbCwKIAotCS5jb250cm9scyA9IHdtODk3OF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTc4X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk3OF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk3OF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODk3OF9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5NzhfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTc4X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk3OF9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk3OF9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5NzhfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk3OF9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTc4X2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODk3OF9yZWdtYXBfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTgzLmMKaW5kZXggMGMwMDJhNS4uYmZkYmU3MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4My5jCkBAIC05NzYsMTYgKzk3NiwxOCBAQAogCS5zeW1tZXRyaWNfcmF0ZXMgPSAxCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTgzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk4MyA9IHsKIAkucHJvYmUgPSB3bTg5ODNfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTgzX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKLQkuY29udHJvbHMgPSB3bTg5ODNfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk4M19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5ODNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5ODNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5ODNfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk4M19hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTgzX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk4M19zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk4M19kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5ODNfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk4M19hdWRpb19tYXAsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk4M19hdWRpb19tYXApLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTgzX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4NS5jCmluZGV4IDczNDdhYmYuLjA1MzQ0ZjkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTg1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODUuYwpAQCAtMTEwNSwxNyArMTEwNSwxOSBAQAogCS5zeW1tZXRyaWNfcmF0ZXMgPSAxCiB9OwogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTg1ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk4NSA9IHsKIAkucHJvYmUgPSB3bTg5ODVfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTg1X3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODk4NV9jb21tb25fc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk4NV9jb21tb25fc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTg1X2NvbW1vbl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk4NV9jb21tb25fZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5ODVfY29tbW9uX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk4NV9jb21tb25fZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTg1X2NvbW1vbl9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5ODVfY29tbW9uX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTg1X2NvbW1vbl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5ODVfY29tbW9uX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5ODVfY29tbW9uX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5ODVfY29tbW9uX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODk4NV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5ODguYwppbmRleCA4OTU3MjFhMi4uYjBkMDIxOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5ODguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk4OC5jCkBAIC04MTcsMTIgKzgxNywxNCBAQAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODk4OF9zZXRfYmlhc19sZXZlbCwKIAkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKLQkuY29udHJvbHMgPSB3bTg5ODhfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk4OF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5ODhfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5ODhfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5ODhfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTg4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk4OF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5ODhfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5ODhfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTg4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5ODhfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk4OF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg5ODhfcmVnbWFwID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkwLmMKaW5kZXggMjNlY2QzMC4uYTg5NDUwMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MC5jCkBAIC0xMjk0LDE3ICsxMjk0LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTkwID0gewogCS5wcm9iZSA9CXdtODk5MF9wcm9iZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5OTBfc2V0X2JpYXNfbGV2ZWwsCiAJLnN1c3BlbmRfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzID0Jd204OTkwX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTg5OTBfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd204OTkwX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod204OTkwX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0Jd204OTkwX2RhcG1fcm91dGVzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtODk5MF9kYXBtX3JvdXRlcyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTg5OTBfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod204OTkwX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd204OTkwX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtODk5MF9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd204OTkwX2RhcG1fcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTg5OTBfZGFwbV9yb3V0ZXMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204OTkwX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jCmluZGV4IGM5ZWUwYWMuLjgwMmMwNjk0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkxLmMKQEAgLTExMSwxNCArMTExLDI0IEBACiAJfQogfQogCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKHJlY19taXhfdGx2LCAtMTUwMCwgNjAwKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIoaW5fcGdhX3RsdiwgLTE2NTAsIDMwMDApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihvdXRfbWl4X3RsdiwgMCwgLTIxMDApOwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihvdXRfcGdhX3RsdiwgLTczMDAsIDYwMCk7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG91dF9vbWl4X3RsdiwgLTYwMCwgMCk7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKG91dF9kYWNfdGx2LCAtNzE2MywgMCk7Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfTElORUFSKGluX2FkY190bHYsIC03MTYzLCAxNzYzKTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9MSU5FQVIob3V0X3NpZGV0b25lX3RsdiwgLTM2MDAsIDApOworc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfU0NBTEUoaW5fcGdhX3RsdiwgLTE2NTAsIDE1MCwgMCk7CitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9TQ0FMRShvdXRfbWl4X3RsdiwgLTIxMDAsIDMwMCwgMCk7CitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9SQU5HRShvdXRfcGdhX3RsdiwKKwkweDAwLCAweDJmLCBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNKFNORFJWX0NUTF9UTFZEX0RCX0dBSU5fTVVURSwgMCwgMSksCisJMHgzMCwgMHg3ZiwgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfSVRFTSgtNzMwMCwgMTAwLCAwKSwKKyk7CitzdGF0aWMgY29uc3QgU05EUlZfQ1RMX1RMVkRfREVDTEFSRV9EQl9SQU5HRShvdXRfZGFjX3RsdiwKKwkweDAwLCAweGJmLCBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNKC03MTYyNSwgMzc1LCAxKSwKKwkweGMwLCAweGZmLCBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNKDAsIDAsIDApLAorKTsKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1JBTkdFKGluX2FkY190bHYsCisJMHgwMCwgMHhlZiwgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfSVRFTSgtNzE2MjUsIDM3NSwgMSksCisJMHhmMCwgMHhmZiwgU05EUlZfQ1RMX1RMVkRfREJfU0NBTEVfSVRFTSgxNzYyNSwgMCwgMCksCispOworc3RhdGljIGNvbnN0IFNORFJWX0NUTF9UTFZEX0RFQ0xBUkVfREJfUkFOR0Uob3V0X3NpZGV0b25lX3RsdiwKKwkweDAwLCAweDBjLCBTTkRSVl9DVExfVExWRF9EQl9TQ0FMRV9JVEVNKC0zNjAwLCAzMDAsIDApLAorCTB4MGQsIDB4MGYsIFNORFJWX0NUTF9UTFZEX0RCX1NDQUxFX0lURU0oMCwgMCwgMCksCispOwogCiBzdGF0aWMgaW50IHdtODk5eF9vdXRwZ2FfcHV0X3ZvbHN3X3Z1KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQpAQCAtMzk4LDcgKzQwOCw3IEBACiB9CiAKIC8qIElOTUlYIGRCIHZhbHVlcyAqLwotc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX0xJTkVBUihpbl9taXhfdGx2LCAtMTIwMCwgNjAwKTsKK3N0YXRpYyBjb25zdCBTTkRSVl9DVExfVExWRF9ERUNMQVJFX0RCX1NDQUxFKGluX21peF90bHYsIC0xMjAwLCAzMDAsIDEpOwogCiAvKiBMZWZ0IEluIFBHQSBDb25uZWN0aW9ucyAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODk5MV9kYXBtX2xpbjEyX3BnYV9jb250cm9sc1tdID0gewpAQCAtMTIzMiwxNiArMTI0MiwxOCBAQAogCS5vcHMgPSAmd204OTkxX29wcwogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5MSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTEgPSB7CiAJLnNldF9iaWFzX2xldmVsID0gd204OTkxX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODk5MV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTkxX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk5MV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk5MV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODk5MV9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5OTFfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTkxX3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk5MV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk5MV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5OTFfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk5MV9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTkxX2RhcG1fcm91dGVzKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODk5MV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTMuYwppbmRleCA4NjY4YzRjLi4xOTVmN2JmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5My5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTkzLmMKQEAgLTE2MTMsNyArMTYxMyw3IEBACiAJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKHdtODk5M19yZWdfZGVmYXVsdHMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5MyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTMgPSB7CiAJLnByb2JlID0gCXdtODk5M19wcm9iZSwKIAkuc3VzcGVuZCA9CXdtODk5M19zdXNwZW5kLAogCS5yZXN1bWUgPQl3bTg5OTNfcmVzdW1lLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKaW5kZXggYTE4YWVjYi4uMzg5NjUyMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCkBAIC00NDM5LDcgKzQ0MzksNyBAQAogCXJldHVybiBjb250cm9sLT5yZWdtYXA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTQgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTk0ID0gewogCS5wcm9iZSA9CXdtODk5NF9jb2RlY19wcm9iZSwKIAkucmVtb3ZlID0Jd204OTk0X2NvZGVjX3JlbW92ZSwKIAkuc3VzcGVuZCA9CXdtODk5NF9jb2RlY19zdXNwZW5kLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk1LmMKaW5kZXggMjQ1MDBiYS4uMTliMDhhNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NS5jCkBAIC0yMTkyLDEyICsyMTkyLDE0IEBACiAJLnNldF9iaWFzX2xldmVsID0gd204OTk1X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODk5NV9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTk1X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk5NV9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk5NV9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODk5NV9pbnRlcmNvbiwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5OTVfaW50ZXJjb24pLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTk1X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk5NV9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk5NV9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5OTVfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk5NV9pbnRlcmNvbiwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTk1X2ludGVyY29uKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODk5NV9yZWdtYXAgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYwppbmRleCBhNzMwNDQyLi44YWZmYTQ5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMKQEAgLTIxODQsNyArMjE4NCw3IEBACiAJCQkJICAoMSA8PCBXTTg5OTZfR1AxX0RJUl9TSElGVCkpOwogfQogCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB3bTg5OTZfdGVtcGxhdGVfY2hpcCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZ3Bpb19jaGlwIHdtODk5Nl90ZW1wbGF0ZV9jaGlwID0gewogCS5sYWJlbAkJCT0gIndtODk5NiIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuZGlyZWN0aW9uX291dHB1dAk9IHdtODk5Nl9ncGlvX2RpcmVjdGlvbl9vdXQsCkBAIC0yNjg0LDE4ICsyNjg0LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTYgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTk2ID0gewogCS5wcm9iZSA9CXdtODk5Nl9wcm9iZSwKIAkucmVtb3ZlID0Jd204OTk2X3JlbW92ZSwKIAkuc2V0X2JpYXNfbGV2ZWwgPSB3bTg5OTZfc2V0X2JpYXNfbGV2ZWwsCiAJLmlkbGVfYmlhc19vZmYJPSB0cnVlLAogCS5zZXFfbm90aWZpZXIgPSB3bTg5OTZfc2VxX25vdGlmaWVyLAotCS5jb250cm9scyA9IHdtODk5Nl9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTk2X3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IHdtODk5Nl9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODk5Nl9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IHdtODk5Nl9kYXBtX3JvdXRlcywKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg5OTZfZGFwbV9yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd204OTk2X3NuZF9jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtODk5Nl9zbmRfY29udHJvbHMpLAorCQkuZGFwbV93aWRnZXRzCQk9IHdtODk5Nl9kYXBtX3dpZGdldHMsCisJCS5udW1fZGFwbV93aWRnZXRzCT0gQVJSQVlfU0laRSh3bTg5OTZfZGFwbV93aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHdtODk5Nl9kYXBtX3JvdXRlcywKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod204OTk2X2RhcG1fcm91dGVzKSwKKwl9LAogCS5zZXRfcGxsID0gd204OTk2X3NldF9mbGwsCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ny5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTcuYwppbmRleCA2YjA3ODViLi4yZjI4MjFiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ny5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk3LmMKQEAgLTEwOTUsNyArMTA5NSw3IEBACiAJcmV0dXJuIHByaXYtPmNvcmUuYXJpem9uYS0+cmVnbWFwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTk3ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODk5NyA9IHsKIAkucHJvYmUgPSB3bTg5OTdfY29kZWNfcHJvYmUsCiAJLnJlbW92ZSA9IHdtODk5N19jb2RlY19yZW1vdmUsCiAJLmdldF9yZWdtYXAgPSAgIHdtODk5N19nZXRfcmVnbWFwLApAQCAtMTEwNSwxMiArMTEwNSwxNCBAQAogCS5zZXRfc3lzY2xrID0gYXJpem9uYV9zZXRfc3lzY2xrLAogCS5zZXRfcGxsID0gd204OTk3X3NldF9mbGwsCiAKLQkuY29udHJvbHMgPSB3bTg5OTdfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk5N19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5OTdfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5OTdfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5OTdfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTk3X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk5N19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5OTdfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5OTdfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTk3X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5OTdfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk5N19kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd204OTk3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5OC5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTguYwppbmRleCAzYTVjODk2Li5iY2MyZTEwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5OC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk4LmMKQEAgLTk2Niw2ICs5NjYsMTYgQEAKIAl7ICJJTjJBIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAl7ICJJTjJCIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAorCXsgIkFTUkMxTCIsIE5VTEwsICJTWVNDTEsiIH0sCisJeyAiQVNSQzFSIiwgTlVMTCwgIlNZU0NMSyIgfSwKKwl7ICJBU1JDMkwiLCBOVUxMLCAiU1lTQ0xLIiB9LAorCXsgIkFTUkMyUiIsIE5VTEwsICJTWVNDTEsiIH0sCisKKwl7ICJBU1JDMUwiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisJeyAiQVNSQzFSIiwgTlVMTCwgIkFTWU5DQ0xLIiB9LAorCXsgIkFTUkMyTCIsIE5VTEwsICJBU1lOQ0NMSyIgfSwKKwl7ICJBU1JDMlIiLCBOVUxMLCAiQVNZTkNDTEsiIH0sCisKIAl7ICJTUEQxIiwgTlVMTCwgIlNZU0NMSyIgfSwKIAl7ICJTUEQxIiwgTlVMTCwgIlNQRDFUWDEiIH0sCiAJeyAiU1BEMSIsIE5VTEwsICJTUEQxVFgyIiB9LApAQCAtMTM1MSw3ICsxMzYxLDcgQEAKIAlyZXR1cm4gcHJpdi0+Y29yZS5hcml6b25hLT5yZWdtYXA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5OTggPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204OTk4ID0gewogCS5wcm9iZSA9IHdtODk5OF9jb2RlY19wcm9iZSwKIAkucmVtb3ZlID0gd204OTk4X2NvZGVjX3JlbW92ZSwKIAkuZ2V0X3JlZ21hcCA9IHdtODk5OF9nZXRfcmVnbWFwLApAQCAtMTM2MSwxMiArMTM3MSwxNCBAQAogCS5zZXRfc3lzY2xrID0gYXJpem9uYV9zZXRfc3lzY2xrLAogCS5zZXRfcGxsID0gd204OTk4X3NldF9mbGwsCiAKLQkuY29udHJvbHMgPSB3bTg5OThfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODk5OF9zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTg5OThfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg5OThfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTg5OThfZGFwbV9yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUod204OTk4X2RhcG1fcm91dGVzKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtODk5OF9zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRSh3bTg5OThfc25kX2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTg5OThfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod204OTk4X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTg5OThfZGFwbV9yb3V0ZXMsCisJCS5udW1fZGFwbV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHdtODk5OF9kYXBtX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd204OTk4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtOTA4MS5jIGIvc291bmQvc29jL2NvZGVjcy93bTkwODEuYwppbmRleCAzNjNiM2I2Li44NTY4NjdlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtOTA4MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205MDgxLmMKQEAgLTEyNzQsNyArMTI3NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTkwODEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd205MDgxID0gewogCS5wcm9iZSA9IAl3bTkwODFfcHJvYmUsCiAKIAkuc2V0X3N5c2NsayA9IHdtOTA4MV9zZXRfc3lzY2xrLApAQCAtMTI4MiwxMiArMTI4MiwxNCBAQAogCiAJLmlkbGVfYmlhc19vZmYgPSB0cnVlLAogCi0JLmNvbnRyb2xzICAgICAgICAgPSB3bTkwODFfc25kX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgICAgID0gQVJSQVlfU0laRSh3bTkwODFfc25kX2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzCSAgPSB3bTkwODFfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTkwODFfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgICAgID0gd205MDgxX2F1ZGlvX3BhdGhzLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtOTA4MV9hdWRpb19wYXRocyksCisJLmNvbXBvbmVudF9kcml2ZXIgPSB7CisJCS5jb250cm9scwkJPSB3bTkwODFfc25kX2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod205MDgxX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd205MDgxX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtOTA4MV9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd205MDgxX2F1ZGlvX3BhdGhzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTkwODFfYXVkaW9fcGF0aHMpLAorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd205MDgxX3JlZ21hcCA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTA5MC5jCmluZGV4IDVkNzM3MjkuLjVhMTMxMzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205MDkwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTkwOTAuYwpAQCAtNTUwLDcgKzU1MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTkwOTAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd205MDkwID0gewogCS5wcm9iZSA9IAl3bTkwOTBfcHJvYmUsCiAJLnNldF9iaWFzX2xldmVsID0gd205MDkwX3NldF9iaWFzX2xldmVsLAogCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzA1LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcwNS5jCmluZGV4IDc0NDg0MmMuLmRjZGQwNTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzA1LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTk3MDUuYwpAQCAtMzUyLDcgKzM1Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTk3MDUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd205NzA1ID0gewogCS5wcm9iZSA9IAl3bTk3MDVfc29jX3Byb2JlLAogCS5yZW1vdmUgPSAJd205NzA1X3NvY19yZW1vdmUsCiAJLnN1c3BlbmQgPQl3bTk3MDVfc29jX3N1c3BlbmQsCkBAIC0zNjQsMTIgKzM2NCwxNCBAQAogCS5yZWdfY2FjaGVfc3RlcCA9IDIsCiAJLnJlZ19jYWNoZV9kZWZhdWx0ID0gd205NzA1X3JlZywKIAotCS5jb250cm9scyA9IHdtOTcwNV9zbmRfYWM5N19jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTk3MDVfc25kX2FjOTdfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTk3MDVfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTk3MDVfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTk3MDVfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtOTcwNV9hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd205NzA1X3NuZF9hYzk3X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod205NzA1X3NuZF9hYzk3X2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTk3MDVfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod205NzA1X2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTk3MDVfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTk3MDVfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bTk3MDVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCmluZGV4IDQ4OGE5MjIuLjU1NzcwOWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTk3MTIuYwpAQCAtNjY5LDcgKzY2OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTk3MTIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd205NzEyID0gewogCS5wcm9iZSA9IAl3bTk3MTJfc29jX3Byb2JlLAogCS5yZW1vdmUgPSAJd205NzEyX3NvY19yZW1vdmUsCiAJLnJlc3VtZSA9CXdtOTcxMl9zb2NfcmVzdW1lLApAQCAtNjgyLDEyICs2ODIsMTQgQEAKIAkucmVnX2NhY2hlX3N0ZXAgPSAyLAogCS5yZWdfY2FjaGVfZGVmYXVsdCA9IHdtOTcxMl9yZWcsCiAKLQkuY29udHJvbHMgPSB3bTk3MTJfc25kX2FjOTdfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod205NzEyX3NuZF9hYzk3X2NvbnRyb2xzKSwKLQkuZGFwbV93aWRnZXRzID0gd205NzEyX2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUod205NzEyX2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gd205NzEyX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTk3MTJfYXVkaW9fbWFwKSwKKwkuY29tcG9uZW50X2RyaXZlciA9IHsKKwkJLmNvbnRyb2xzCQk9IHdtOTcxMl9zbmRfYWM5N19jb250cm9scywKKwkJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKHdtOTcxMl9zbmRfYWM5N19jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gd205NzEyX2RhcG1fd2lkZ2V0cywKKwkJLm51bV9kYXBtX3dpZGdldHMJPSBBUlJBWV9TSVpFKHdtOTcxMl9kYXBtX3dpZGdldHMpLAorCQkuZGFwbV9yb3V0ZXMJCT0gd205NzEyX2F1ZGlvX21hcCwKKwkJLm51bV9kYXBtX3JvdXRlcwk9IEFSUkFZX1NJWkUod205NzEyX2F1ZGlvX21hcCksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgd205NzEyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMy5jIGIvc291bmQvc29jL2NvZGVjcy93bTk3MTMuYwppbmRleCA5ODQ5NjQzLi5lNDMwMWRkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEzLmMKQEAgLTEyMzUsMTkgKzEyMzUsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtOTcxMyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTk3MTMgPSB7CiAJLnByb2JlID0gCXdtOTcxM19zb2NfcHJvYmUsCiAJLnJlbW92ZSA9IAl3bTk3MTNfc29jX3JlbW92ZSwKIAkuc3VzcGVuZCA9CXdtOTcxM19zb2Nfc3VzcGVuZCwKIAkucmVzdW1lID0gCXdtOTcxM19zb2NfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtOTcxM19zZXRfYmlhc19sZXZlbCwKIAotCS5jb250cm9scyA9IHdtOTcxM19zbmRfYWM5N19jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRSh3bTk3MTNfc25kX2FjOTdfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3bTk3MTNfZGFwbV93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTk3MTNfZGFwbV93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSB3bTk3MTNfYXVkaW9fbWFwLAotCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKHdtOTcxM19hdWRpb19tYXApLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gd205NzEzX3NuZF9hYzk3X2NvbnRyb2xzLAorCQkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUod205NzEzX3NuZF9hYzk3X2NvbnRyb2xzKSwKKwkJLmRhcG1fd2lkZ2V0cwkJPSB3bTk3MTNfZGFwbV93aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUod205NzEzX2RhcG1fd2lkZ2V0cyksCisJCS5kYXBtX3JvdXRlcwkJPSB3bTk3MTNfYXVkaW9fbWFwLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRSh3bTk3MTNfYXVkaW9fbWFwKSwKKwl9LAogfTsKIAogc3RhdGljIGludCB3bTk3MTNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jIGIvc291bmQvc29jL2NvZGVjcy93bV9hZHNwLmMKaW5kZXggMjFmYmU3ZC4uYjk0M2RkZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bV9hZHNwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bV9hZHNwLmMKQEAgLTQ4MCw3ICs0ODAsNyBAQAogCiAJbXV0ZXhfbG9jaygmZHNwLT5wd3JfbG9jayk7CiAKLQlpZiAoIWRzcC0+d21md19maWxlX25hbWUgfHwgIWRzcC0+cnVubmluZykKKwlpZiAoIWRzcC0+d21md19maWxlX25hbWUgfHwgIWRzcC0+Ym9vdGVkKQogCQlyZXQgPSAwOwogCWVsc2UKIAkJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLApAQCAtNTAwLDcgKzUwMCw3IEBACiAKIAltdXRleF9sb2NrKCZkc3AtPnB3cl9sb2NrKTsKIAotCWlmICghZHNwLT5iaW5fZmlsZV9uYW1lIHx8ICFkc3AtPnJ1bm5pbmcpCisJaWYgKCFkc3AtPmJpbl9maWxlX25hbWUgfHwgIWRzcC0+Ym9vdGVkKQogCQlyZXQgPSAwOwogCWVsc2UKIAkJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLApAQCAtNTU0LDYgKzU1NCw5IEBACiAJaWYgKCFyb290KQogCQlnb3RvIGVycjsKIAorCWlmICghZGVidWdmc19jcmVhdGVfYm9vbCgiYm9vdGVkIiwgU19JUlVHTywgcm9vdCwgJmRzcC0+Ym9vdGVkKSkKKwkJZ290byBlcnI7CisKIAlpZiAoIWRlYnVnZnNfY3JlYXRlX2Jvb2woInJ1bm5pbmciLCBTX0lSVUdPLCByb290LCAmZHNwLT5ydW5uaW5nKSkKIAkJZ290byBlcnI7CiAKQEAgLTYzNyw3ICs2NDAsNyBAQAogCiAJbXV0ZXhfbG9jaygmZHNwW2UtPnNoaWZ0X2xdLnB3cl9sb2NrKTsKIAotCWlmIChkc3BbZS0+c2hpZnRfbF0ucnVubmluZyB8fCBkc3BbZS0+c2hpZnRfbF0uY29tcHIpCisJaWYgKGRzcFtlLT5zaGlmdF9sXS5ib290ZWQgfHwgZHNwW2UtPnNoaWZ0X2xdLmNvbXByKQogCQlyZXQgPSAtRUJVU1k7CiAJZWxzZQogCQlkc3BbZS0+c2hpZnRfbF0uZncgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwpAQCAtNzg5LDcgKzc5Miw3IEBACiAJbWVtY3B5KGN0bC0+Y2FjaGUsIHAsIGN0bC0+bGVuKTsKIAogCWN0bC0+c2V0ID0gMTsKLQlpZiAoY3RsLT5lbmFibGVkKQorCWlmIChjdGwtPmVuYWJsZWQgJiYgY3RsLT5kc3AtPnJ1bm5pbmcpCiAJCXJldCA9IHdtX2NvZWZmX3dyaXRlX2NvbnRyb2woY3RsLCBwLCBjdGwtPmxlbik7CiAKIAltdXRleF91bmxvY2soJmN0bC0+ZHNwLT5wd3JfbG9jayk7CkBAIC04MTEsNyArODE0LDcgQEAKIAkJcmV0ID0gLUVGQVVMVDsKIAl9IGVsc2UgewogCQljdGwtPnNldCA9IDE7Ci0JCWlmIChjdGwtPmVuYWJsZWQpCisJCWlmIChjdGwtPmVuYWJsZWQgJiYgY3RsLT5kc3AtPnJ1bm5pbmcpCiAJCQlyZXQgPSB3bV9jb2VmZl93cml0ZV9jb250cm9sKGN0bCwgY3RsLT5jYWNoZSwgc2l6ZSk7CiAJfQogCkBAIC04NzEsMTIgKzg3NCwxMiBAQAogCW11dGV4X2xvY2soJmN0bC0+ZHNwLT5wd3JfbG9jayk7CiAKIAlpZiAoY3RsLT5mbGFncyAmIFdNRldfQ1RMX0ZMQUdfVk9MQVRJTEUpIHsKLQkJaWYgKGN0bC0+ZW5hYmxlZCkKKwkJaWYgKGN0bC0+ZW5hYmxlZCAmJiBjdGwtPmRzcC0+cnVubmluZykKIAkJCXJldCA9IHdtX2NvZWZmX3JlYWRfY29udHJvbChjdGwsIHAsIGN0bC0+bGVuKTsKIAkJZWxzZQogCQkJcmV0ID0gLUVQRVJNOwogCX0gZWxzZSB7Ci0JCWlmICghY3RsLT5mbGFncyAmJiBjdGwtPmVuYWJsZWQpCisJCWlmICghY3RsLT5mbGFncyAmJiBjdGwtPmVuYWJsZWQgJiYgY3RsLT5kc3AtPnJ1bm5pbmcpCiAJCQlyZXQgPSB3bV9jb2VmZl9yZWFkX2NvbnRyb2woY3RsLCBjdGwtPmNhY2hlLCBjdGwtPmxlbik7CiAKIAkJbWVtY3B5KHAsIGN0bC0+Y2FjaGUsIGN0bC0+bGVuKTsKQEAgLTg5OCwxMiArOTAxLDEyIEBACiAJbXV0ZXhfbG9jaygmY3RsLT5kc3AtPnB3cl9sb2NrKTsKIAogCWlmIChjdGwtPmZsYWdzICYgV01GV19DVExfRkxBR19WT0xBVElMRSkgewotCQlpZiAoY3RsLT5lbmFibGVkKQorCQlpZiAoY3RsLT5lbmFibGVkICYmIGN0bC0+ZHNwLT5ydW5uaW5nKQogCQkJcmV0ID0gd21fY29lZmZfcmVhZF9jb250cm9sKGN0bCwgY3RsLT5jYWNoZSwgc2l6ZSk7CiAJCWVsc2UKIAkJCXJldCA9IC1FUEVSTTsKIAl9IGVsc2UgewotCQlpZiAoIWN0bC0+ZmxhZ3MgJiYgY3RsLT5lbmFibGVkKQorCQlpZiAoIWN0bC0+ZmxhZ3MgJiYgY3RsLT5lbmFibGVkICYmIGN0bC0+ZHNwLT5ydW5uaW5nKQogCQkJcmV0ID0gd21fY29lZmZfcmVhZF9jb250cm9sKGN0bCwgY3RsLT5jYWNoZSwgc2l6ZSk7CiAJfQogCkBAIC0yMTY2LDEzICsyMTY5LDIwIEBACiAJCWlmIChyZXQgIT0gMCkKIAkJCWdvdG8gZXJyX2VuYTsKIAorCQlkc3AtPmJvb3RlZCA9IHRydWU7CisKIAkJLyogU3RhcnQgdGhlIGNvcmUgcnVubmluZyAqLwogCQlyZWdtYXBfdXBkYXRlX2JpdHMoZHNwLT5yZWdtYXAsIGRzcC0+YmFzZSArIEFEU1AxX0NPTlRST0xfMzAsCiAJCQkJICAgQURTUDFfQ09SRV9FTkEgfCBBRFNQMV9TVEFSVCwKIAkJCQkgICBBRFNQMV9DT1JFX0VOQSB8IEFEU1AxX1NUQVJUKTsKKworCQlkc3AtPnJ1bm5pbmcgPSB0cnVlOwogCQlicmVhazsKIAogCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCWRzcC0+cnVubmluZyA9IGZhbHNlOworCQlkc3AtPmJvb3RlZCA9IGZhbHNlOworCiAJCS8qIEhhbHQgdGhlIGNvcmUgKi8KIAkJcmVnbWFwX3VwZGF0ZV9iaXRzKGRzcC0+cmVnbWFwLCBkc3AtPmJhc2UgKyBBRFNQMV9DT05UUk9MXzMwLAogCQkJCSAgIEFEU1AxX0NPUkVfRU5BIHwgQURTUDFfU1RBUlQsIDApOwpAQCAtMjIyNyw3ICsyMjM3LDcgQEAKIAkJaWYgKHZhbCAmIEFEU1AyX1JBTV9SRFkpCiAJCQlicmVhazsKIAotCQltc2xlZXAoMSk7CisJCXVzbGVlcF9yYW5nZSgyNTAsIDUwMCk7CiAJfQogCiAJaWYgKCEodmFsICYgQURTUDJfUkFNX1JEWSkpIHsKQEAgLTIyNDksNiArMjI1OSwxMSBAQAogCiAJbXV0ZXhfbG9jaygmZHNwLT5wd3JfbG9jayk7CiAKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZHNwLT5yZWdtYXAsIGRzcC0+YmFzZSArIEFEU1AyX0NPTlRST0wsCisJCQkJIEFEU1AyX01FTV9FTkEsIEFEU1AyX01FTV9FTkEpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBlcnJfbXV0ZXg7CisKIAlyZXQgPSB3bV9hZHNwMl9lbmEoZHNwKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gZXJyX211dGV4OwpAQCAtMjI3MCwxMyArMjI4NSwxNCBAQAogCWlmIChyZXQgIT0gMCkKIAkJZ290byBlcnJfZW5hOwogCi0JLyogU3luYyBzZXQgY29udHJvbHMgKi8KLQlyZXQgPSB3bV9jb2VmZl9zeW5jX2NvbnRyb2xzKGRzcCk7CisJZHNwLT5ib290ZWQgPSB0cnVlOworCisJLyogVHVybiBEU1AgYmFjayBvZmYgdW50aWwgd2UgYXJlIHJlYWR5IHRvIHJ1biAqLworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkc3AtPnJlZ21hcCwgZHNwLT5iYXNlICsgQURTUDJfQ09OVFJPTCwKKwkJCQkgQURTUDJfU1lTX0VOQSwgMCk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGVycl9lbmE7CiAKLQlkc3AtPnJ1bm5pbmcgPSB0cnVlOwotCiAJbXV0ZXhfdW5sb2NrKCZkc3AtPnB3cl9sb2NrKTsKIAogCXJldHVybjsKQEAgLTIzMDcsNiArMjMyMyw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwogCXN0cnVjdCB3bV9hZHNwICpkc3BzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IHdtX2Fkc3AgKmRzcCA9ICZkc3BzW3ctPnNoaWZ0XTsKKwlzdHJ1Y3Qgd21fY29lZmZfY3RsICpjdGw7CiAKIAlkc3AtPmNhcmQgPSBjb2RlYy0+Y29tcG9uZW50LmNhcmQ7CiAKQEAgLTIzMTUsNiArMjMzMiwyNCBAQAogCQl3bV9hZHNwMl9zZXRfZHNwY2xrKGRzcCwgZnJlcSk7CiAJCXF1ZXVlX3dvcmsoc3lzdGVtX3VuYm91bmRfd3EsICZkc3AtPmJvb3Rfd29yayk7CiAJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJCXdtX2Fkc3BfZGVidWdmc19jbGVhcihkc3ApOworCisJCWRzcC0+ZndfaWQgPSAwOworCQlkc3AtPmZ3X2lkX3ZlcnNpb24gPSAwOworCisJCWRzcC0+Ym9vdGVkID0gZmFsc2U7CisKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKGRzcC0+cmVnbWFwLCBkc3AtPmJhc2UgKyBBRFNQMl9DT05UUk9MLAorCQkJCSAgIEFEU1AyX01FTV9FTkEsIDApOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3RsLCAmZHNwLT5jdGxfbGlzdCwgbGlzdCkKKwkJCWN0bC0+ZW5hYmxlZCA9IDA7CisKKwkJd21fYWRzcF9mcmVlX2FsZ19yZWdpb25zKGRzcCk7CisKKwkJYWRzcF9kYmcoZHNwLCAiU2h1dGRvd24gY29tcGxldGVcbiIpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0yMzI5LDE2ICsyMzY0LDI0IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOwogCXN0cnVjdCB3bV9hZHNwICpkc3BzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IHdtX2Fkc3AgKmRzcCA9ICZkc3BzW3ctPnNoaWZ0XTsKLQlzdHJ1Y3Qgd21fY29lZmZfY3RsICpjdGw7CiAJaW50IHJldDsKIAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKIAkJZmx1c2hfd29yaygmZHNwLT5ib290X3dvcmspOwogCi0JCWlmICghZHNwLT5ydW5uaW5nKQorCQlpZiAoIWRzcC0+Ym9vdGVkKQogCQkJcmV0dXJuIC1FSU87CiAKKwkJcmV0ID0gd21fYWRzcDJfZW5hKGRzcCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWdvdG8gZXJyOworCisJCS8qIFN5bmMgc2V0IGNvbnRyb2xzICovCisJCXJldCA9IHdtX2NvZWZmX3N5bmNfY29udHJvbHMoZHNwKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBlcnI7CisKIAkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRzcC0+cmVnbWFwLAogCQkJCQkgZHNwLT5iYXNlICsgQURTUDJfQ09OVFJPTCwKIAkJCQkJIEFEU1AyX0NPUkVfRU5BIHwgQURTUDJfU1RBUlQsCkBAIC0yMzQ2LDYgKzIzODksOCBAQAogCQlpZiAocmV0ICE9IDApCiAJCQlnb3RvIGVycjsKIAorCQlkc3AtPnJ1bm5pbmcgPSB0cnVlOworCiAJCW11dGV4X2xvY2soJmRzcC0+cHdyX2xvY2spOwogCiAJCWlmICh3bV9hZHNwX2Z3W2RzcC0+ZnddLm51bV9jYXBzICE9IDApCkBAIC0yMzYxLDEwICsyNDA2LDYgQEAKIAogCQltdXRleF9sb2NrKCZkc3AtPnB3cl9sb2NrKTsKIAotCQl3bV9hZHNwX2RlYnVnZnNfY2xlYXIoZHNwKTsKLQotCQlkc3AtPmZ3X2lkID0gMDsKLQkJZHNwLT5md19pZF92ZXJzaW9uID0gMDsKIAkJZHNwLT5ydW5uaW5nID0gZmFsc2U7CiAKIAkJcmVnbWFwX3VwZGF0ZV9iaXRzKGRzcC0+cmVnbWFwLCBkc3AtPmJhc2UgKyBBRFNQMl9DT05UUk9MLApAQCAtMjM3OCwxNyArMjQxOSwxMiBAQAogCQlyZWdtYXBfdXBkYXRlX2JpdHMoZHNwLT5yZWdtYXAsIGRzcC0+YmFzZSArIEFEU1AyX0NPTlRST0wsCiAJCQkJICAgQURTUDJfU1lTX0VOQSwgMCk7CiAKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShjdGwsICZkc3AtPmN0bF9saXN0LCBsaXN0KQotCQkJY3RsLT5lbmFibGVkID0gMDsKLQotCQl3bV9hZHNwX2ZyZWVfYWxnX3JlZ2lvbnMoZHNwKTsKLQogCQlpZiAod21fYWRzcF9md1tkc3AtPmZ3XS5udW1fY2FwcyAhPSAwKQogCQkJd21fYWRzcF9idWZmZXJfZnJlZShkc3ApOwogCiAJCW11dGV4X3VubG9jaygmZHNwLT5wd3JfbG9jayk7CiAKLQkJYWRzcF9kYmcoZHNwLCAiU2h1dGRvd24gY29tcGxldGVcbiIpOworCQlhZHNwX2RiZyhkc3AsICJFeGVjdXRpb24gc3RvcHBlZFxuIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5oIGIvc291bmQvc29jL2NvZGVjcy93bV9hZHNwLmgKaW5kZXggYmUzYjViYy4uMzYyZGQ3YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bV9hZHNwLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy93bV9hZHNwLmgKQEAgLTYxLDYgKzYxLDggQEAKIAogCWludCBmdzsKIAlpbnQgZndfdmVyOworCisJYm9vbCBib290ZWQ7CiAJYm9vbCBydW5uaW5nOwogCiAJc3RydWN0IGxpc3RfaGVhZCBjdGxfbGlzdDsKQEAgLTg1LDkgKzg3LDEwIEBACiAJCXdtX2Fkc3AxX2V2ZW50LCBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUFJFX1BNRCkKIAogI2RlZmluZSBXTV9BRFNQMih3bmFtZSwgbnVtLCBldmVudF9mbikgXAotewkuaWQgPSBzbmRfc29jX2RhcG1fZGFpX2xpbmssIC5uYW1lID0gd25hbWUgIiBQcmVsb2FkZXIiLCBcCit7CS5pZCA9IHNuZF9zb2NfZGFwbV9zdXBwbHksIC5uYW1lID0gd25hbWUgIiBQcmVsb2FkZXIiLCBcCiAJLnJlZyA9IFNORF9TT0NfTk9QTSwgLnNoaWZ0ID0gbnVtLCAuZXZlbnQgPSBldmVudF9mbiwgXAotCS5ldmVudF9mbGFncyA9IFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EIH0sIFwKKwkuZXZlbnRfZmxhZ3MgPSBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1ELCBcCisJLnN1YnNlcSA9IDEwMCwgLyogRW5zdXJlIHdlIHJ1biBhZnRlciBTWVNDTEsgc3VwcGx5IHdpZGdldCAqLyB9LCBcCiB7CS5pZCA9IHNuZF9zb2NfZGFwbV9vdXRfZHJ2LCAubmFtZSA9IHduYW1lLCBcCiAJLnJlZyA9IFNORF9TT0NfTk9QTSwgLnNoaWZ0ID0gbnVtLCAuZXZlbnQgPSB3bV9hZHNwMl9ldmVudCwgXAogCS5ldmVudF9mbGFncyA9IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QUkVfUE1EIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYwppbmRleCAwNWMyZDMzLi4zYzVhOTgwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jCkBAIC0xMjE4LDcgKzEyMTgsNyBAQAogCiAJc25kX21hc2tfbm9uZSgmbmZtdCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgU05EUlZfUENNX0ZPUk1BVF9MQVNUOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDw9IFNORFJWX1BDTV9GT1JNQVRfTEFTVDsgaSsrKSB7CiAJCWlmIChzbmRfbWFza190ZXN0KGZtdCwgaSkpIHsKIAkJCXVpbnQgc2JpdHMgPSBzbmRfcGNtX2Zvcm1hdF93aWR0aChpKTsKIAkJCWludCBwcG07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZHdjL2Rlc2lnbndhcmVfaTJzLmMgYi9zb3VuZC9zb2MvZHdjL2Rlc2lnbndhcmVfaTJzLmMKaW5kZXggZGM5N2Y0My4uMjk5ODk1NGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kd2MvZGVzaWdud2FyZV9pMnMuYworKysgYi9zb3VuZC9zb2MvZHdjL2Rlc2lnbndhcmVfaTJzLmMKQEAgLTU3Nyw3ICs1NzcsNiBAQAogCQlkZXYtPmNhcGFiaWxpdHkgfD0gRFdDX0kyU19QTEFZOwogCQlkZXYtPnBsYXlfZG1hX2RhdGEuZHQuYWRkciA9IHJlcy0+c3RhcnQgKyBJMlNfVFhETUE7CiAJCWRldi0+cGxheV9kbWFfZGF0YS5kdC5hZGRyX3dpZHRoID0gYnVzX3dpZHRoc1tpZHhdOwotCQlkZXYtPnBsYXlfZG1hX2RhdGEuZHQuY2hhbl9uYW1lID0gIlRYIjsKIAkJZGV2LT5wbGF5X2RtYV9kYXRhLmR0LmZpZm9fc2l6ZSA9IGZpZm9fZGVwdGggKgogCQkJKGZpZm9fd2lkdGhbaWR4Ml0pID4+IDg7CiAJCWRldi0+cGxheV9kbWFfZGF0YS5kdC5tYXhidXJzdCA9IDE2OwpAQCAtNTg4LDcgKzU4Nyw2IEBACiAJCWRldi0+Y2FwYWJpbGl0eSB8PSBEV0NfSTJTX1JFQ09SRDsKIAkJZGV2LT5jYXB0dXJlX2RtYV9kYXRhLmR0LmFkZHIgPSByZXMtPnN0YXJ0ICsgSTJTX1JYRE1BOwogCQlkZXYtPmNhcHR1cmVfZG1hX2RhdGEuZHQuYWRkcl93aWR0aCA9IGJ1c193aWR0aHNbaWR4XTsKLQkJZGV2LT5jYXB0dXJlX2RtYV9kYXRhLmR0LmNoYW5fbmFtZSA9ICJSWCI7CiAJCWRldi0+Y2FwdHVyZV9kbWFfZGF0YS5kdC5maWZvX3NpemUgPSBmaWZvX2RlcHRoICoKIAkJCShmaWZvX3dpZHRoW2lkeDJdID4+IDgpOwogCQlkZXYtPmNhcHR1cmVfZG1hX2RhdGEuZHQubWF4YnVyc3QgPSAxNjsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX2FzcmMuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX2FzcmMuYwppbmRleCBjMWEwZTAxLi4xZDgyZjY4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbF9hc3JjLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfYXNyYy5jCkBAIC03MjYsNyArNzI2LDcgQEAKIAkucmVhZGFibGVfcmVnID0gZnNsX2FzcmNfcmVhZGFibGVfcmVnLAogCS52b2xhdGlsZV9yZWcgPSBmc2xfYXNyY192b2xhdGlsZV9yZWcsCiAJLndyaXRlYWJsZV9yZWcgPSBmc2xfYXNyY193cml0ZWFibGVfcmVnLAotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfRkxBVCwKIH07CiAKIC8qKgpAQCAtODc5LDcgKzg3OSw3IEBACiAJCX0KIAl9CiAKLQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsICJmc2wsaW14MzUtYXNyYyIpKSB7CisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGlteDM1LWFzcmMiKSkgewogCQlhc3JjX3ByaXYtPmNoYW5uZWxfYml0cyA9IDM7CiAJCWNsa19tYXBbSU5dID0gaW5wdXRfY2xrX21hcF9pbXgzNTsKIAkJY2xrX21hcFtPVVRdID0gb3V0cHV0X2Nsa19tYXBfaW14MzU7CkBAIC04OTIsNyArODkyLDcgQEAKIAlyZXQgPSBmc2xfYXNyY19pbml0KGFzcmNfcHJpdik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5pdCBhc3JjICVkXG4iLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlhc3JjX3ByaXYtPmNoYW5uZWxfYXZhaWwgPSAxMDsKQEAgLTkwMSwxNCArOTAxLDE0IEBACiAJCQkJICAgJmFzcmNfcHJpdi0+YXNyY19yYXRlKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgb3V0cHV0IHJhdGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImZzbCxhc3JjLXdpZHRoIiwKIAkJCQkgICAmYXNyY19wcml2LT5hc3JjX3dpZHRoKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgb3V0cHV0IHdpZHRoXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiByZXQ7CiAJfQogCiAJaWYgKGFzcmNfcHJpdi0+YXNyY193aWR0aCAhPSAxNiAmJiBhc3JjX3ByaXYtPmFzcmNfd2lkdGggIT0gMjQpIHsKQEAgLTkzMyw4ICs5MzMsNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJkcml2ZXIgcmVnaXN0ZXJlZFxuIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfYXNyY19kbWEuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX2FzcmNfZG1hLmMKaW5kZXggZmZjMDAwYi4uZGMzMGQ3OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfYXNyY19kbWEuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9hc3JjX2RtYS5jCkBAIC0zMjIsNyArMzIyLDcgQEAKIAlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHN1YnN0cmVhbS0+cnVudGltZSwgcGFpci0+cG9zKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBmc2xfYXNyY19kbWFfcGNtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgZnNsX2FzcmNfZG1hX3BjbV9vcHMgPSB7CiAJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLAogCS5od19wYXJhbXMJPSBmc2xfYXNyY19kbWFfaHdfcGFyYW1zLAogCS5od19mcmVlCT0gZnNsX2FzcmNfZG1hX2h3X2ZyZWUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL2ZzbF9lc2FpLmMgYi9zb3VuZC9zb2MvZnNsL2ZzbF9lc2FpLmMKaW5kZXggMjZhOTBlMS4uMzhiZmQ0NiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfZXNhaS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvZnNsX2VzYWkuYwpAQCAtNzcsMTkgKzc3LDE5IEBACiAJcmVnbWFwX3JlYWQoZXNhaV9wcml2LT5yZWdtYXAsIFJFR19FU0FJX0VTUiwgJmVzcik7CiAKIAlpZiAoZXNyICYgRVNBSV9FU1JfVElOSVRfTUFTSykKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiaXNyOiBUcmFuc21pdGlvbiBJbml0aWFsaXplZFxuIik7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImlzcjogVHJhbnNtaXNzaW9uIEluaXRpYWxpemVkXG4iKTsKIAogCWlmIChlc3IgJiBFU0FJX0VTUl9SRkZfTUFTSykKIAkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImlzcjogUmVjZWl2aW5nIG92ZXJydW5cbiIpOwogCiAJaWYgKGVzciAmIEVTQUlfRVNSX1RGRV9NQVNLKQotCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaXNyOiBUcmFuc21pdGlvbiB1bmRlcnJ1blxuIik7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJpc3I6IFRyYW5zbWlzc2lvbiB1bmRlcnJ1blxuIik7CiAKIAlpZiAoZXNyICYgRVNBSV9FU1JfVExTX01BU0spCiAJCWRldl9kYmcoJnBkZXYtPmRldiwgImlzcjogSnVzdCB0cmFuc21pdHRlZCB0aGUgbGFzdCBzbG90XG4iKTsKIAogCWlmIChlc3IgJiBFU0FJX0VTUl9UREVfTUFTSykKLQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiaXNyOiBUcmFuc21pdGlvbiBkYXRhIGV4Y2VwdGlvblxuIik7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImlzcjogVHJhbnNtaXNzaW9uIGRhdGEgZXhjZXB0aW9uXG4iKTsKIAogCWlmIChlc3IgJiBFU0FJX0VTUl9URURfTUFTSykKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiaXNyOiBUcmFuc21pdHRpbmcgZXZlbiBzbG90c1xuIik7CkBAIC03ODEsNyArNzgxLDcgQEAKIAkucmVhZGFibGVfcmVnID0gZnNsX2VzYWlfcmVhZGFibGVfcmVnLAogCS52b2xhdGlsZV9yZWcgPSBmc2xfZXNhaV92b2xhdGlsZV9yZWcsCiAJLndyaXRlYWJsZV9yZWcgPSBmc2xfZXNhaV93cml0ZWFibGVfcmVnLAotCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfRkxBVCwKIH07CiAKIHN0YXRpYyBpbnQgZnNsX2VzYWlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX3NhaS5jIGIvc291bmQvc29jL2ZzbC9mc2xfc2FpLmMKaW5kZXggMjE0Nzk5NC4uOWZhZGY3ZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc2FpLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfc2FpLmMKQEAgLTgwMSw4ICs4MDEsOCBAQAogCiAJc2FpLT5wZGV2ID0gcGRldjsKIAotCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgImZzbCxpbXg2c3gtc2FpIikgfHwKLQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsICJmc2wsaW14NnVsLXNhaSIpKQorCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxpbXg2c3gtc2FpIikgfHwKKwkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsaW14NnVsLXNhaSIpKQogCQlzYWktPnNhaV9vbl9pbXggPSB0cnVlOwogCiAJc2FpLT5pc19sc2JfZmlyc3QgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJsc2ItZmlyc3QiKTsKQEAgLTg4Myw3ICs4ODMsNyBAQAogCX0KIAogCWlmIChvZl9maW5kX3Byb3BlcnR5KG5wLCAiZnNsLHNhaS1tY2xrLWRpcmVjdGlvbi1vdXRwdXQiLCBOVUxMKSAmJgotCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwZGV2LT5kZXYub2Zfbm9kZSwgImZzbCxpbXg2dWwtc2FpIikpIHsKKwkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsaW14NnVsLXNhaSIpKSB7CiAJCWdwciA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X2NvbXBhdGlibGUoImZzbCxpbXg2dWwtaW9tdXhjLWdwciIpOwogCQlpZiAoSVNfRVJSKGdwcikpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBmaW5kIGlvbXV4YyByZWdpc3RlcnNcbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2xfc3BkaWYuYyBiL3NvdW5kL3NvYy9mc2wvZnNsX3NwZGlmLmMKaW5kZXggYmVlYzc5My4uMWZmNDY3YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc3BkaWYuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbF9zcGRpZi5jCkBAIC0xMTAzLDcgKzExMDMsNyBAQAogCS5yZWFkYWJsZV9yZWcgPSBmc2xfc3BkaWZfcmVhZGFibGVfcmVnLAogCS52b2xhdGlsZV9yZWcgPSBmc2xfc3BkaWZfdm9sYXRpbGVfcmVnLAogCS53cml0ZWFibGVfcmVnID0gZnNsX3NwZGlmX3dyaXRlYWJsZV9yZWcsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAogc3RhdGljIHUzMiBmc2xfc3BkaWZfdHhjbGtfY2FsZGl2KHN0cnVjdCBmc2xfc3BkaWZfcHJpdiAqc3BkaWZfcHJpdiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jIGIvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKaW5kZXggYmVkZWM0YS4uNTAzNDk0MyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCS52b2xhdGlsZV9yZWcgPSBmc2xfc3NpX3ZvbGF0aWxlX3JlZywKIAkucHJlY2lvdXNfcmVnID0gZnNsX3NzaV9wcmVjaW91c19yZWcsCiAJLndyaXRlYWJsZV9yZWcgPSBmc2xfc3NpX3dyaXRlYWJsZV9yZWcsCi0JLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9SQlRSRUUsCisJLmNhY2hlX3R5cGUgPSBSRUdDQUNIRV9GTEFULAogfTsKIAogc3RydWN0IGZzbF9zc2lfc29jX2RhdGEgewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2dlbmVyaWMvS2NvbmZpZyBiL3NvdW5kL3NvYy9nZW5lcmljL0tjb25maWcKaW5kZXggYzAxYzVkZC4uZDAyMzk1OSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2dlbmVyaWMvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvZ2VuZXJpYy9LY29uZmlnCkBAIC02LDMgKzYsMTEgQEAKIAlzZWxlY3QgU05EX1NJTVBMRV9DQVJEX1VUSUxTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBnZW5lcmljIHNpbXBsZSBzb3VuZCBjYXJkIHN1cHBvcnQKKworY29uZmlnIFNORF9TSU1QTEVfU0NVX0NBUkQKKwl0cmlzdGF0ZSAiQVNvQyBTaW1wbGUgU0NVIHNvdW5kIGNhcmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE9GCisJc2VsZWN0IFNORF9TSU1QTEVfQ0FSRF9VVElMUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZ2VuZXJpYyBzaW1wbGUgU0NVIHNvdW5kIGNhcmQgc3VwcG9ydC4KKwkgIEl0IHN1cHBvcnRzIERQQ00gb2YgbXVsdGkgQ1BVIHNpbmdsZSBDb2RlYyBzeXN0ZW0uCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZ2VuZXJpYy9NYWtlZmlsZSBiL3NvdW5kL3NvYy9nZW5lcmljL01ha2VmaWxlCmluZGV4IDJkNTNjOGQuLmVlNzUwZjMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9nZW5lcmljL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9nZW5lcmljL01ha2VmaWxlCkBAIC0xLDUgKzEsNyBAQAogc25kLXNvYy1zaW1wbGUtY2FyZC11dGlscy1vYmpzCTo9IHNpbXBsZS1jYXJkLXV0aWxzLm8KIHNuZC1zb2Mtc2ltcGxlLWNhcmQtb2Jqcwk6PSBzaW1wbGUtY2FyZC5vCitzbmQtc29jLXNpbXBsZS1zY3UtY2FyZC1vYmpzCTo9IHNpbXBsZS1zY3UtY2FyZC5vCiAKIG9iai0kKENPTkZJR19TTkRfU0lNUExFX0NBUkRfVVRJTFMpCSs9IHNuZC1zb2Mtc2ltcGxlLWNhcmQtdXRpbHMubwogb2JqLSQoQ09ORklHX1NORF9TSU1QTEVfQ0FSRCkJCSs9IHNuZC1zb2Mtc2ltcGxlLWNhcmQubworb2JqLSQoQ09ORklHX1NORF9TSU1QTEVfU0NVX0NBUkQpCSs9IHNuZC1zb2Mtc2ltcGxlLXNjdS1jYXJkLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLXV0aWxzLmMgYi9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC11dGlscy5jCmluZGV4IDk1OTlkZTYuLjFjYjM5MzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLXV0aWxzLmMKKysrIGIvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQtdXRpbHMuYwpAQCAtNyw2ICs3LDcgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8c291bmQvc2ltcGxlX2NhcmRfdXRpbHMuaD4KQEAgLTk3LDYgKzk4LDE0NiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jYXJkX25hbWUpOwogCitpbnQgYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jbGsoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGFpX29mX25vZGUsCisJCQkgICAgICAgc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqc2ltcGxlX2RhaSkKK3sKKwlzdHJ1Y3QgY2xrICpjbGs7CisJdTMyIHZhbDsKKworCS8qCisJICogUGFyc2UgZGFpLT5zeXNjbGsgY29tZSBmcm9tICJjbG9ja3MgPSA8Jnh4eD4iCisJICogKGlmIHN5c3RlbSBoYXMgY29tbW9uIGNsb2NrKQorCSAqICBvciAic3lzdGVtLWNsb2NrLWZyZXF1ZW5jeSA9IDx4eHg+IgorCSAqICBvciBkZXZpY2UncyBtb2R1bGUgY2xvY2suCisJICovCisJY2xrID0gb2ZfY2xrX2dldChub2RlLCAwKTsKKwlpZiAoIUlTX0VSUihjbGspKSB7CisJCXNpbXBsZV9kYWktPnN5c2NsayA9IGNsa19nZXRfcmF0ZShjbGspOworCQlzaW1wbGVfZGFpLT5jbGsgPSBjbGs7CisJfSBlbHNlIGlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kiLCAmdmFsKSkgeworCQlzaW1wbGVfZGFpLT5zeXNjbGsgPSB2YWw7CisJfSBlbHNlIHsKKwkJY2xrID0gb2ZfY2xrX2dldChkYWlfb2Zfbm9kZSwgMCk7CisJCWlmICghSVNfRVJSKGNsaykpCisJCQlzaW1wbGVfZGFpLT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrKTsKKworaW50IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfZGFpKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkgICAgc3RydWN0IGRldmljZV9ub2RlICoqZGFpX29mX25vZGUsCisJCQkJICAgIGNvbnN0IGNoYXIgKipkYWlfbmFtZSwKKwkJCQkgICAgY29uc3QgY2hhciAqbGlzdF9uYW1lLAorCQkJCSAgICBjb25zdCBjaGFyICpjZWxsc19uYW1lLAorCQkJCSAgICBpbnQgKmlzX3NpbmdsZV9saW5rKQoreworCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgYXJnczsKKwlpbnQgcmV0OworCisJaWYgKCFub2RlKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogR2V0IG5vZGUgdmlhICJzb3VuZC1kYWkgPSA8JnBoYW5kbGUgcG9ydD4iCisJICogaXQgd2lsbCBiZSB1c2VkIGFzIHh4eF9vZl9ub2RlIG9uIHNvY19iaW5kX2RhaV9saW5rKCkKKwkgKi8KKwlyZXQgPSBvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhub2RlLCBsaXN0X25hbWUsIGNlbGxzX25hbWUsIDAsICZhcmdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogR2V0IGRhaS0+bmFtZSAqLworCWlmIChkYWlfbmFtZSkgeworCQlyZXQgPSBzbmRfc29jX29mX2dldF9kYWlfbmFtZShub2RlLCBkYWlfbmFtZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkqZGFpX29mX25vZGUgPSBhcmdzLm5wOworCisJaWYgKGlzX3NpbmdsZV9saW5rKQorCQkqaXNfc2luZ2xlX2xpbmsgPSAhYXJncy5hcmdzX2NvdW50OworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2RhaSk7CisKK2ludCBhc29jX3NpbXBsZV9jYXJkX2luaXRfZGFpKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCQkJICAgICAgc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqc2ltcGxlX2RhaSkKK3sKKwlpbnQgcmV0OworCisJaWYgKHNpbXBsZV9kYWktPnN5c2NsaykgeworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGRhaSwgMCwgc2ltcGxlX2RhaS0+c3lzY2xrLCAwKTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7CisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAic2ltcGxlLWNhcmQ6IHNldF9zeXNjbGsgZXJyb3JcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmIChzaW1wbGVfZGFpLT5zbG90cykgeworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoZGFpLAorCQkJCQkgICAgICAgc2ltcGxlX2RhaS0+dHhfc2xvdF9tYXNrLAorCQkJCQkgICAgICAgc2ltcGxlX2RhaS0+cnhfc2xvdF9tYXNrLAorCQkJCQkgICAgICAgc2ltcGxlX2RhaS0+c2xvdHMsCisJCQkJCSAgICAgICBzaW1wbGVfZGFpLT5zbG90X3dpZHRoKTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7CisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAic2ltcGxlLWNhcmQ6IHNldF90ZG1fc2xvdCBlcnJvclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhc29jX3NpbXBsZV9jYXJkX2luaXRfZGFpKTsKKworaW50IGFzb2Nfc2ltcGxlX2NhcmRfY2Fub25pY2FsaXplX2RhaWxpbmsoc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rKQoreworCWlmICghZGFpX2xpbmstPmNwdV9kYWlfbmFtZSB8fCAhZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIEFzc3VtZXMgcGxhdGZvcm0gPT0gY3B1ICovCisJaWYgKCFkYWlfbGluay0+cGxhdGZvcm1fb2Zfbm9kZSkKKwkJZGFpX2xpbmstPnBsYXRmb3JtX29mX25vZGUgPSBkYWlfbGluay0+Y3B1X29mX25vZGU7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzb2Nfc2ltcGxlX2NhcmRfY2Fub25pY2FsaXplX2RhaWxpbmspOworCit2b2lkIGFzb2Nfc2ltcGxlX2NhcmRfY2Fub25pY2FsaXplX2NwdShzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmssCisJCQkJICAgICAgIGludCBpc19zaW5nbGVfbGlua3MpCit7CisJLyoKKwkgKiBJbiBzb2NfYmluZF9kYWlfbGluaygpIHdpbGwgY2hlY2sgY3B1IG5hbWUgYWZ0ZXIKKwkgKiBvZl9ub2RlIG1hdGNoaW5nIGlmIGRhaV9saW5rIGhhcyBjcHVfZGFpX25hbWUuCisJICogYnV0LCBpdCB3aWxsIG5ldmVyIG1hdGNoIGlmIG5hbWUgd2FzIGNyZWF0ZWQgYnkKKwkgKiBmbXRfc2luZ2xlX25hbWUoKSByZW1vdmUgY3B1X2RhaV9uYW1lIGlmIGNwdV9hcmdzCisJICogd2FzIDAuIFNlZToKKwkgKglmbXRfc2luZ2xlX25hbWUoKQorCSAqCWZtdF9tdWx0aXBsZV9uYW1lKCkKKwkgKi8KKwlpZiAoaXNfc2luZ2xlX2xpbmtzKQorCQlkYWlfbGluay0+Y3B1X2RhaV9uYW1lID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzb2Nfc2ltcGxlX2NhcmRfY2Fub25pY2FsaXplX2NwdSk7CisKK2ludCBhc29jX3NpbXBsZV9jYXJkX2NsZWFuX3JlZmVyZW5jZShzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKKwlpbnQgbnVtX2xpbmtzOworCisJZm9yIChudW1fbGlua3MgPSAwLCBkYWlfbGluayA9IGNhcmQtPmRhaV9saW5rOworCSAgICAgbnVtX2xpbmtzIDwgY2FyZC0+bnVtX2xpbmtzOworCSAgICAgbnVtX2xpbmtzKyssIGRhaV9saW5rKyspIHsKKwkJb2Zfbm9kZV9wdXQoZGFpX2xpbmstPmNwdV9vZl9ub2RlKTsKKwkJb2Zfbm9kZV9wdXQoZGFpX2xpbmstPmNvZGVjX29mX25vZGUpOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFzb2Nfc2ltcGxlX2NhcmRfY2xlYW5fcmVmZXJlbmNlKTsKKwogLyogTW9kdWxlIGluZm9ybWF0aW9uICovCiBNT0RVTEVfQVVUSE9SKCJLdW5pbm9yaSBNb3JpbW90byA8a3VuaW5vcmkubW9yaW1vdG8uZ3hAcmVuZXNhcy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgU29DIFNpbXBsZSBDYXJkIFV0aWxzIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC5jIGIvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQuYwppbmRleCA0MzI5NWYwLi5mNjA4ZjhkMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQuYworKysgYi9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC5jCkBAIC0zNywxMyArMzcsMTUgQEAKIAl1bnNpZ25lZCBpbnQgbWNsa19mczsKIAlzdHJ1Y3QgYXNvY19zaW1wbGVfamFjayBocF9qYWNrOwogCXN0cnVjdCBhc29jX3NpbXBsZV9qYWNrIG1pY19qYWNrOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGRhaV9saW5rW107CS8qIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCAqLworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKIH07CiAKICNkZWZpbmUgc2ltcGxlX3ByaXZfdG9fZGV2KHByaXYpICgocHJpdiktPnNuZF9jYXJkLmRldikKLSNkZWZpbmUgc2ltcGxlX3ByaXZfdG9fbGluayhwcml2LCBpKSAoKHByaXYpLT5zbmRfY2FyZC5kYWlfbGluayArIGkpCi0jZGVmaW5lIHNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIGkpICgocHJpdiktPmRhaV9wcm9wcyArIGkpCisjZGVmaW5lIHNpbXBsZV9wcml2X3RvX2xpbmsocHJpdiwgaSkgKChwcml2KS0+c25kX2NhcmQuZGFpX2xpbmsgKyAoaSkpCisjZGVmaW5lIHNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIGkpICgocHJpdiktPmRhaV9wcm9wcyArIChpKSkKIAorI2RlZmluZSBEQUkJInNvdW5kLWRhaSIKKyNkZWZpbmUgQ0VMTAkiI3NvdW5kLWRhaS1jZWxscyIKICNkZWZpbmUgUFJFRklYCSJzaW1wbGUtYXVkaW8tY2FyZCwiCiAKICNkZWZpbmUgYXNvY19zaW1wbGVfY2FyZF9pbml0X2hwKGNhcmQsIHNqYWNrLCBwcmVmaXgpXApAQCAtMTEyLDEzICsxMTQsMTMgQEAKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNpbXBsZV9jYXJkX2RhdGEgKnByaXYgPQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKIAlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyAqZGFpX3Byb3BzID0KLQkJJnByaXYtPmRhaV9wcm9wc1tydGQtPm51bV07CisJCXNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIHJ0ZC0+bnVtKTsKIAlpbnQgcmV0OwogCiAJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhaV9wcm9wcy0+Y3B1X2RhaS5jbGspOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JCisKIAlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoZGFpX3Byb3BzLT5jb2RlY19kYWkuY2xrKTsKIAlpZiAocmV0KQogCQljbGtfZGlzYWJsZV91bnByZXBhcmUoZGFpX3Byb3BzLT5jcHVfZGFpLmNsayk7CkBAIC0xMzEsNyArMTMzLDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNpbXBsZV9jYXJkX2RhdGEgKnByaXYgPQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKIAlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyAqZGFpX3Byb3BzID0KLQkJJnByaXYtPmRhaV9wcm9wc1tydGQtPm51bV07CisJCXNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIHJ0ZC0+bnVtKTsKIAogCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYWlfcHJvcHMtPmNwdV9kYWkuY2xrKTsKIApAQCAtMTQ1LDcgKzE0Nyw4IEBACiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7CiAJc3RydWN0IHNpbXBsZV9jYXJkX2RhdGEgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKLQlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyAqZGFpX3Byb3BzID0gJnByaXYtPmRhaV9wcm9wc1tydGQtPm51bV07CisJc3RydWN0IHNpbXBsZV9kYWlfcHJvcHMgKmRhaV9wcm9wcyA9CisJCXNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIHJ0ZC0+bnVtKTsKIAl1bnNpZ25lZCBpbnQgbWNsaywgbWNsa19mcyA9IDA7CiAJaW50IHJldCA9IDA7CiAKQEAgLTE3Nyw1MSArMTgwLDIwIEBACiAJLmh3X3BhcmFtcyA9IGFzb2Nfc2ltcGxlX2NhcmRfaHdfcGFyYW1zLAogfTsKIAotc3RhdGljIGludCBfX2Fzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksCi0JCQkJICAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKnNldCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKHNldC0+c3lzY2xrKSB7Ci0JCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoZGFpLCAwLCBzZXQtPnN5c2NsaywgMCk7Ci0JCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9UU1VQUCkgewotCQkJZGV2X2VycihkYWktPmRldiwgInNpbXBsZS1jYXJkOiBzZXRfc3lzY2xrIGVycm9yXG4iKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JaWYgKHNldC0+c2xvdHMpIHsKLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KGRhaSwKLQkJCQkJICAgICAgIHNldC0+dHhfc2xvdF9tYXNrLAotCQkJCQkgICAgICAgc2V0LT5yeF9zbG90X21hc2ssCi0JCQkJCQlzZXQtPnNsb3RzLAotCQkJCQkJc2V0LT5zbG90X3dpZHRoKTsKLQkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7Ci0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAic2ltcGxlLWNhcmQ6IHNldF90ZG1fc2xvdCBlcnJvclxuIik7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQotCXJldCA9IDA7Ci0KLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSAqcHJpdiA9CXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwogCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWMgPSBydGQtPmNvZGVjX2RhaTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc2ltcGxlX2RhaV9wcm9wcyAqZGFpX3Byb3BzOworCXN0cnVjdCBzaW1wbGVfZGFpX3Byb3BzICpkYWlfcHJvcHMgPQorCQlzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBydGQtPm51bSk7CiAJaW50IHJldDsKIAotCWRhaV9wcm9wcyA9ICZwcml2LT5kYWlfcHJvcHNbcnRkLT5udW1dOwotCXJldCA9IF9fYXNvY19zaW1wbGVfY2FyZF9kYWlfaW5pdChjb2RlYywgJmRhaV9wcm9wcy0+Y29kZWNfZGFpKTsKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX2luaXRfZGFpKGNvZGVjLCAmZGFpX3Byb3BzLT5jb2RlY19kYWkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gX19hc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0KGNwdSwgJmRhaV9wcm9wcy0+Y3B1X2RhaSk7CisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9pbml0X2RhaShjcHUsICZkYWlfcHJvcHMtPmNwdV9kYWkpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0yMzYsNzggKzIwOCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQKLWFzb2Nfc2ltcGxlX2NhcmRfc3ViX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkgICAgICBzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWksCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKipwX25vZGUsCi0JCQkgICAgICBjb25zdCBjaGFyICoqbmFtZSwKLQkJCSAgICAgIGludCAqYXJnc19jb3VudCkKLXsKLQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGFyZ3M7Ci0Jc3RydWN0IGNsayAqY2xrOwotCXUzMiB2YWw7Ci0JaW50IHJldDsKLQotCWlmICghbnApCi0JCXJldHVybiAwOwotCi0JLyoKLQkgKiBHZXQgbm9kZSB2aWEgInNvdW5kLWRhaSA9IDwmcGhhbmRsZSBwb3J0PiIKLQkgKiBpdCB3aWxsIGJlIHVzZWQgYXMgeHh4X29mX25vZGUgb24gc29jX2JpbmRfZGFpX2xpbmsoKQotCSAqLwotCXJldCA9IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKG5wLCAic291bmQtZGFpIiwKLQkJCQkJICIjc291bmQtZGFpLWNlbGxzIiwgMCwgJmFyZ3MpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkqcF9ub2RlID0gYXJncy5ucDsKLQotCWlmIChhcmdzX2NvdW50KQotCQkqYXJnc19jb3VudCA9IGFyZ3MuYXJnc19jb3VudDsKLQotCS8qIEdldCBkYWktPm5hbWUgKi8KLQlpZiAobmFtZSkgewotCQlyZXQgPSBzbmRfc29jX29mX2dldF9kYWlfbmFtZShucCwgbmFtZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoIWRhaSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBQYXJzZSBURE0gc2xvdCAqLwotCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfdGRtX3Nsb3QobnAsICZkYWktPnR4X3Nsb3RfbWFzaywKLQkJCQkJJmRhaS0+cnhfc2xvdF9tYXNrLAotCQkJCQkmZGFpLT5zbG90cywgJmRhaS0+c2xvdF93aWR0aCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qCi0JICogUGFyc2UgZGFpLT5zeXNjbGsgY29tZSBmcm9tICJjbG9ja3MgPSA8Jnh4eD4iCi0JICogKGlmIHN5c3RlbSBoYXMgY29tbW9uIGNsb2NrKQotCSAqICBvciAic3lzdGVtLWNsb2NrLWZyZXF1ZW5jeSA9IDx4eHg+IgotCSAqICBvciBkZXZpY2UncyBtb2R1bGUgY2xvY2suCi0JICovCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImNsb2NrcyIpKSB7Ci0JCWNsayA9IG9mX2Nsa19nZXQobnAsIDApOwotCQlpZiAoSVNfRVJSKGNsaykpIHsKLQkJCXJldCA9IFBUUl9FUlIoY2xrKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQlkYWktPnN5c2NsayA9IGNsa19nZXRfcmF0ZShjbGspOwotCQlkYWktPmNsayA9IGNsazsKLQl9IGVsc2UgaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kiLCAmdmFsKSkgewotCQlkYWktPnN5c2NsayA9IHZhbDsKLQl9IGVsc2UgewotCQljbGsgPSBvZl9jbGtfZ2V0KGFyZ3MubnAsIDApOwotCQlpZiAoIUlTX0VSUihjbGspKQotCQkJZGFpLT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX2RhaV9saW5rX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKIAkJCQkJc3RydWN0IHNpbXBsZV9jYXJkX2RhdGEgKnByaXYsCiAJCQkJCWludCBpZHgsCkBAIC0zMTYsMTMgKzIxNiwxNCBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNpbXBsZV9wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbmsgPSBzaW1wbGVfcHJpdl90b19saW5rKHByaXYsIGlkeCk7CiAJc3RydWN0IHNpbXBsZV9kYWlfcHJvcHMgKmRhaV9wcm9wcyA9IHNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIGlkeCk7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqY3B1X2RhaSA9ICZkYWlfcHJvcHMtPmNwdV9kYWk7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqY29kZWNfZGFpID0gJmRhaV9wcm9wcy0+Y29kZWNfZGFpOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1ID0gTlVMTDsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBsYXQgPSBOVUxMOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY29kZWMgPSBOVUxMOwogCWNoYXIgcHJvcFsxMjhdOwogCWNoYXIgKnByZWZpeCA9ICIiOwotCWludCByZXQsIGNwdV9hcmdzOwotCXUzMiB2YWw7CisJaW50IHJldCwgc2luZ2xlX2NwdTsKIAogCS8qIEZvciBzaW5nbGUgREFJIGxpbmsgJiBvbGQgc3R5bGUgb2YgRFQgbm9kZSAqLwogCWlmIChpc190b3BfbGV2ZWxfbm9kZSkKQEAgLTM0OCwzNiArMjQ5LDQ2IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOwogCi0JaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAibWNsay1mcyIsICZ2YWwpKQotCQlkYWlfcHJvcHMtPm1jbGtfZnMgPSB2YWw7CisJb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgIm1jbGstZnMiLCAmZGFpX3Byb3BzLT5tY2xrX2ZzKTsKIAotCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc3ViX3BhcnNlX29mKGNwdSwgJmRhaV9wcm9wcy0+Y3B1X2RhaSwKLQkJCQkJICAgICZkYWlfbGluay0+Y3B1X29mX25vZGUsCi0JCQkJCSAgICAmZGFpX2xpbmstPmNwdV9kYWlfbmFtZSwKLQkJCQkJICAgICZjcHVfYXJncyk7CisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jcHUoY3B1LCBkYWlfbGluaywKKwkJCQkJIERBSSwgQ0VMTCwgJnNpbmdsZV9jcHUpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGRhaV9saW5rX29mX2VycjsKIAotCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc3ViX3BhcnNlX29mKGNvZGVjLCAmZGFpX3Byb3BzLT5jb2RlY19kYWksCi0JCQkJCSAgICAmZGFpX2xpbmstPmNvZGVjX29mX25vZGUsCi0JCQkJCSAgICAmZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lLCBOVUxMKTsKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2NvZGVjKGNvZGVjLCBkYWlfbGluaywgREFJLCBDRUxMKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBkYWlfbGlua19vZl9lcnI7CiAKLQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3N1Yl9wYXJzZV9vZihwbGF0LCBOVUxMLAotCQkJCQkgICAgJmRhaV9saW5rLT5wbGF0Zm9ybV9vZl9ub2RlLAotCQkJCQkgICAgTlVMTCwgTlVMTCk7CisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9wbGF0Zm9ybShwbGF0LCBkYWlfbGluaywgREFJLCBDRUxMKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBkYWlfbGlua19vZl9lcnI7CiAKLQlpZiAoIWRhaV9saW5rLT5jcHVfZGFpX25hbWUgfHwgIWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkgewotCQlyZXQgPSAtRUlOVkFMOworCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfdGRtX3Nsb3QoY3B1LAkmY3B1X2RhaS0+dHhfc2xvdF9tYXNrLAorCQkJCQkJJmNwdV9kYWktPnJ4X3Nsb3RfbWFzaywKKwkJCQkJCSZjcHVfZGFpLT5zbG90cywKKwkJCQkJCSZjcHVfZGFpLT5zbG90X3dpZHRoKTsKKwlpZiAocmV0IDwgMCkKIAkJZ290byBkYWlfbGlua19vZl9lcnI7Ci0JfQogCi0JLyogQXNzdW1lcyBwbGF0Zm9ybSA9PSBjcHUgKi8KLQlpZiAoIWRhaV9saW5rLT5wbGF0Zm9ybV9vZl9ub2RlKQotCQlkYWlfbGluay0+cGxhdGZvcm1fb2Zfbm9kZSA9IGRhaV9saW5rLT5jcHVfb2Zfbm9kZTsKKwlyZXQgPSBzbmRfc29jX29mX3BhcnNlX3RkbV9zbG90KGNvZGVjLAkmY29kZWNfZGFpLT50eF9zbG90X21hc2ssCisJCQkJCQkmY29kZWNfZGFpLT5yeF9zbG90X21hc2ssCisJCQkJCQkmY29kZWNfZGFpLT5zbG90cywKKwkJCQkJCSZjb2RlY19kYWktPnNsb3Rfd2lkdGgpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRhaV9saW5rX29mX2VycjsKKworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2xrX2NwdShjcHUsIGRhaV9saW5rLCBjcHVfZGFpKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBkYWlfbGlua19vZl9lcnI7CisKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2Nsa19jb2RlYyhjb2RlYywgZGFpX2xpbmssIGNvZGVjX2RhaSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOworCisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9jYW5vbmljYWxpemVfZGFpbGluayhkYWlfbGluayk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOwogCiAJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zZXRfZGFpbGlua19uYW1lKGRldiwgZGFpX2xpbmssCiAJCQkJCQkiJXMtJXMiLApAQCAtMzk4LDE3ICszMDksNyBAQAogCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUsCiAJCWRhaV9wcm9wcy0+Y29kZWNfZGFpLnN5c2Nsayk7CiAKLQkvKgotCSAqIEluIHNvY19iaW5kX2RhaV9saW5rKCkgd2lsbCBjaGVjayBjcHUgbmFtZSBhZnRlcgotCSAqIG9mX25vZGUgbWF0Y2hpbmcgaWYgZGFpX2xpbmsgaGFzIGNwdV9kYWlfbmFtZS4KLQkgKiBidXQsIGl0IHdpbGwgbmV2ZXIgbWF0Y2ggaWYgbmFtZSB3YXMgY3JlYXRlZCBieQotCSAqIGZtdF9zaW5nbGVfbmFtZSgpIHJlbW92ZSBjcHVfZGFpX25hbWUgaWYgY3B1X2FyZ3MKLQkgKiB3YXMgMC4gU2VlOgotCSAqCWZtdF9zaW5nbGVfbmFtZSgpCi0JICoJZm10X211bHRpcGxlX25hbWUoKQotCSAqLwotCWlmICghY3B1X2FyZ3MpCi0JCWRhaV9saW5rLT5jcHVfZGFpX25hbWUgPSBOVUxMOworCWFzb2Nfc2ltcGxlX2NhcmRfY2Fub25pY2FsaXplX2NwdShkYWlfbGluaywgc2luZ2xlX2NwdSk7CiAKIGRhaV9saW5rX29mX2VycjoKIAlvZl9ub2RlX3B1dChjcHUpOwpAQCAtNDE3LDIyICszMTgsNTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfYXV4X2RldnMoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCQkgICBzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSAqcHJpdikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzaW1wbGVfcHJpdl90b19kZXYocHJpdik7CisJc3RydWN0IGRldmljZV9ub2RlICphdXhfbm9kZTsKKwlpbnQgaSwgbiwgbGVuOworCisJaWYgKCFvZl9maW5kX3Byb3BlcnR5KG5vZGUsIFBSRUZJWCAiYXV4LWRldnMiLCAmbGVuKSkKKwkJcmV0dXJuIDA7CQkvKiBPayB0byBoYXZlIG5vIGF1eC1kZXZzICovCisKKwluID0gbGVuIC8gc2l6ZW9mKF9fYmUzMik7CisJaWYgKG4gPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcml2LT5zbmRfY2FyZC5hdXhfZGV2ID0gZGV2bV9remFsbG9jKGRldiwKKwkJCW4gKiBzaXplb2YoKnByaXYtPnNuZF9jYXJkLmF1eF9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYtPnNuZF9jYXJkLmF1eF9kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlhdXhfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobm9kZSwgUFJFRklYICJhdXgtZGV2cyIsIGkpOworCQlpZiAoIWF1eF9ub2RlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXByaXYtPnNuZF9jYXJkLmF1eF9kZXZbaV0uY29kZWNfb2Zfbm9kZSA9IGF1eF9ub2RlOworCX0KKworCXByaXYtPnNuZF9jYXJkLm51bV9hdXhfZGV2cyA9IG47CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCiAJCQkJICAgICBzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSAqcHJpdikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzaW1wbGVfcHJpdl90b19kZXYocHJpdik7Ci0JdTMyIHZhbDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRhaV9saW5rOwogCWludCByZXQ7CiAKIAlpZiAoIW5vZGUpCiAJCXJldHVybiAtRUlOVkFMOwogCisJZGFpX2xpbmsgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShub2RlLCBQUkVGSVggImRhaS1saW5rIik7CisKIAkvKiBUaGUgb2ZmLWNvZGVjIHdpZGdldHMgKi8KIAlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsIFBSRUZJWCAid2lkZ2V0cyIpKSB7CiAJCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fc2ltcGxlX3dpZGdldHMoJnByaXYtPnNuZF9jYXJkLAogCQkJCQlQUkVGSVggIndpZGdldHMiKTsKIAkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIGNhcmRfcGFyc2VfZW5kOwogCX0KIAogCS8qIERBUE0gcm91dGVzICovCkBAIC00NDAsMTYgKzM3MywxNCBAQAogCQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoJnByaXYtPnNuZF9jYXJkLAogCQkJCQlQUkVGSVggInJvdXRpbmciKTsKIAkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIGNhcmRfcGFyc2VfZW5kOwogCX0KIAogCS8qIEZhY3RvciB0byBtY2xrLCB1c2VkIGluIGh3X3BhcmFtcygpICovCi0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgUFJFRklYICJtY2xrLWZzIiwgJnZhbCk7Ci0JaWYgKHJldCA9PSAwKQotCQlwcml2LT5tY2xrX2ZzID0gdmFsOworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsIFBSRUZJWCAibWNsay1mcyIsICZwcml2LT5tY2xrX2ZzKTsKIAogCS8qIFNpbmdsZS9NdXRpIERBSSBsaW5rKHMpICYgTmV3IHN0eWxlIG9mIERUIG5vZGUgKi8KLQlpZiAob2ZfZ2V0X2NoaWxkX2J5X25hbWUobm9kZSwgUFJFRklYICJkYWktbGluayIpKSB7CisJaWYgKGRhaV9saW5rKSB7CiAJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOwogCQlpbnQgaSA9IDA7CiAKQEAgLTQ1OSw3ICszOTAsNyBAQAogCQkJCQkJCSAgIGksIGZhbHNlKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJb2Zfbm9kZV9wdXQobnApOwotCQkJCXJldHVybiByZXQ7CisJCQkJZ290byBjYXJkX3BhcnNlX2VuZDsKIAkJCX0KIAkJCWkrKzsKIAkJfQpAQCAtNDY3LDY2ICszOTgsNTUgQEAKIAkJLyogRm9yIHNpbmdsZSBEQUkgbGluayAmIG9sZCBzdHlsZSBvZiBEVCBub2RlICovCiAJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2xpbmtfb2Yobm9kZSwgcHJpdiwgMCwgdHJ1ZSk7CiAJCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gY2FyZF9wYXJzZV9lbmQ7CiAJfQogCiAJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jYXJkX25hbWUoJnByaXYtPnNuZF9jYXJkLCBQUkVGSVgpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY2FyZF9wYXJzZV9lbmQ7CiAKLQlyZXR1cm4gMDsKLX0KKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2F1eF9kZXZzKG5vZGUsIHByaXYpOwogCi0vKiBEZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBkZXZpY2Ugbm9kZXMgKi8KLXN0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF91bnJlZihzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQotewotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKLQlpbnQgbnVtX2xpbmtzOworY2FyZF9wYXJzZV9lbmQ6CisJb2Zfbm9kZV9wdXQoZGFpX2xpbmspOwogCi0JZm9yIChudW1fbGlua3MgPSAwLCBkYWlfbGluayA9IGNhcmQtPmRhaV9saW5rOwotCSAgICAgbnVtX2xpbmtzIDwgY2FyZC0+bnVtX2xpbmtzOwotCSAgICAgbnVtX2xpbmtzKyssIGRhaV9saW5rKyspIHsKLQkJb2Zfbm9kZV9wdXQoZGFpX2xpbmstPmNwdV9vZl9ub2RlKTsKLQkJb2Zfbm9kZV9wdXQoZGFpX2xpbmstPmNvZGVjX29mX25vZGUpOwotCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc2ltcGxlX2NhcmRfZGF0YSAqcHJpdjsKIAlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbms7CisJc3RydWN0IHNpbXBsZV9kYWlfcHJvcHMgKmRhaV9wcm9wczsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlpbnQgbnVtX2xpbmtzLCByZXQ7CisJaW50IG51bSwgcmV0OwogCiAJLyogR2V0IHRoZSBudW1iZXIgb2YgREFJIGxpbmtzICovCiAJaWYgKG5wICYmIG9mX2dldF9jaGlsZF9ieV9uYW1lKG5wLCBQUkVGSVggImRhaS1saW5rIikpCi0JCW51bV9saW5rcyA9IG9mX2dldF9jaGlsZF9jb3VudChucCk7CisJCW51bSA9IG9mX2dldF9jaGlsZF9jb3VudChucCk7CiAJZWxzZQotCQludW1fbGlua3MgPSAxOworCQludW0gPSAxOwogCiAJLyogQWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSBhbmQgdGhlIERBSSBsaW5rIGFycmF5ICovCi0JcHJpdiA9IGRldm1fa3phbGxvYyhkZXYsCi0JCQlzaXplb2YoKnByaXYpICsgc2l6ZW9mKCpkYWlfbGluaykgKiBudW1fbGlua3MsCi0JCQlHRlBfS0VSTkVMKTsKKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCS8qIEluaXQgc25kX3NvY19jYXJkICovCi0JcHJpdi0+c25kX2NhcmQub3duZXIgPSBUSElTX01PRFVMRTsKLQlwcml2LT5zbmRfY2FyZC5kZXYgPSBkZXY7Ci0JZGFpX2xpbmsgPSBwcml2LT5kYWlfbGluazsKLQlwcml2LT5zbmRfY2FyZC5kYWlfbGluayA9IGRhaV9saW5rOwotCXByaXYtPnNuZF9jYXJkLm51bV9saW5rcyA9IG51bV9saW5rczsKLQotCS8qIEdldCByb29tIGZvciB0aGUgb3RoZXIgcHJvcGVydGllcyAqLwotCXByaXYtPmRhaV9wcm9wcyA9IGRldm1fa3phbGxvYyhkZXYsCi0JCQlzaXplb2YoKnByaXYtPmRhaV9wcm9wcykgKiBudW1fbGlua3MsCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPmRhaV9wcm9wcykKKwlkYWlfcHJvcHMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmRhaV9wcm9wcykgKiBudW0sIEdGUF9LRVJORUwpOworCWRhaV9saW5rICA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZGFpX2xpbmspICAqIG51bSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYWlfcHJvcHMgfHwgIWRhaV9saW5rKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXByaXYtPmRhaV9wcm9wcwkJCT0gZGFpX3Byb3BzOworCXByaXYtPmRhaV9saW5rCQkJPSBkYWlfbGluazsKKworCS8qIEluaXQgc25kX3NvY19jYXJkICovCisJcHJpdi0+c25kX2NhcmQub3duZXIJCT0gVEhJU19NT0RVTEU7CisJcHJpdi0+c25kX2NhcmQuZGV2CQk9IGRldjsKKwlwcml2LT5zbmRfY2FyZC5kYWlfbGluawkJPSBwcml2LT5kYWlfbGluazsKKwlwcml2LT5zbmRfY2FyZC5udW1fbGlua3MJPSBudW07CisKIAlpZiAobnAgJiYgb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShucCkpIHsKIAogCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKG5wLCBwcml2KTsKQEAgLTU2Nyw3ICs0ODcsNiBAQAogCQkJCQlzaXplb2YocHJpdi0+ZGFpX3Byb3BzLT5jcHVfZGFpKSk7CiAJCW1lbWNweSgmcHJpdi0+ZGFpX3Byb3BzLT5jb2RlY19kYWksICZjaW5mby0+Y29kZWNfZGFpLAogCQkJCQlzaXplb2YocHJpdi0+ZGFpX3Byb3BzLT5jb2RlY19kYWkpKTsKLQogCX0KIAogCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YSgmcHJpdi0+c25kX2NhcmQsIHByaXYpOwpAQCAtNTc1LDkgKzQ5NCw5IEBACiAJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJnByaXYtPnNuZF9jYXJkKTsKIAlpZiAocmV0ID49IDApCiAJCXJldHVybiByZXQ7Ci0KIGVycjoKLQlhc29jX3NpbXBsZV9jYXJkX3VucmVmKCZwcml2LT5zbmRfY2FyZCk7CisJYXNvY19zaW1wbGVfY2FyZF9jbGVhbl9yZWZlcmVuY2UoJnByaXYtPnNuZF9jYXJkKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU4OSw3ICs1MDgsNyBAQAogCWFzb2Nfc2ltcGxlX2NhcmRfcmVtb3ZlX2phY2soJnByaXYtPmhwX2phY2spOwogCWFzb2Nfc2ltcGxlX2NhcmRfcmVtb3ZlX2phY2soJnByaXYtPm1pY19qYWNrKTsKIAotCXJldHVybiBhc29jX3NpbXBsZV9jYXJkX3VucmVmKGNhcmQpOworCXJldHVybiBhc29jX3NpbXBsZV9jYXJkX2NsZWFuX3JlZmVyZW5jZShjYXJkKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXNvY19zaW1wbGVfb2ZfbWF0Y2hbXSA9IHsKQEAgLTYxMSw2ICs1MzAsNiBAQAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhc29jX3NpbXBsZV9jYXJkKTsKIAogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphc29jLXNpbXBsZS1jYXJkIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgU2ltcGxlIFNvdW5kIENhcmQiKTsKIE1PRFVMRV9BVVRIT1IoIkt1bmlub3JpIE1vcmltb3RvIDxrdW5pbm9yaS5tb3JpbW90by5neEByZW5lc2FzLmNvbT4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1zY3UtY2FyZC5jIGIvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLXNjdS1jYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5NzNhNQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1zY3UtY2FyZC5jCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogQVNvQyBzaW1wbGUgU0NVIHNvdW5kIGNhcmQgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgorICogS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPgorICoKKyAqIGJhc2VkIG9uICR7TElOVVh9L3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhaS5oPgorI2luY2x1ZGUgPHNvdW5kL3NpbXBsZV9jYXJkX3V0aWxzLmg+CisKK3N0cnVjdCBhc29jX3NpbXBsZV9jYXJkX3ByaXYgeworCXN0cnVjdCBzbmRfc29jX2NhcmQgc25kX2NhcmQ7CisJc3RydWN0IHNuZF9zb2NfY29kZWNfY29uZiBjb2RlY19jb25mOworCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmRhaV9wcm9wczsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbms7CisJdTMyIGNvbnZlcnRfcmF0ZTsKKwl1MzIgY29udmVydF9jaGFubmVsczsKK307CisKKyNkZWZpbmUgc2ltcGxlX3ByaXZfdG9fZGV2KHByaXYpICgocHJpdiktPnNuZF9jYXJkLmRldikKKyNkZWZpbmUgc2ltcGxlX3ByaXZfdG9fbGluayhwcml2LCBpKSAoKHByaXYpLT5zbmRfY2FyZC5kYWlfbGluayArIChpKSkKKyNkZWZpbmUgc2ltcGxlX3ByaXZfdG9fcHJvcHMocHJpdiwgaSkgKChwcml2KS0+ZGFpX3Byb3BzICsgKGkpKQorCisjZGVmaW5lIERBSQkic291bmQtZGFpIgorI2RlZmluZSBDRUxMCSIjc291bmQtZGFpLWNlbGxzIgorI2RlZmluZSBQUkVGSVgJInNpbXBsZS1hdWRpby1jYXJkLCIKKworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhc29jX3NpbXBsZV9jYXJkX3ByaXYgKnByaXYgPQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHMgPQorCQlzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBydGQtPm51bSk7CisKKwlyZXR1cm4gY2xrX3ByZXBhcmVfZW5hYmxlKGRhaV9wcm9wcy0+Y2xrKTsKK30KKworc3RhdGljIHZvaWQgYXNvY19zaW1wbGVfY2FyZF9zaHV0ZG93bihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2NhcmRfcHJpdiAqcHJpdiA9CXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOworCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmRhaV9wcm9wcyA9CisJCXNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIHJ0ZC0+bnVtKTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShkYWlfcHJvcHMtPmNsayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgYXNvY19zaW1wbGVfY2FyZF9vcHMgPSB7CisJLnN0YXJ0dXAgPSBhc29jX3NpbXBsZV9jYXJkX3N0YXJ0dXAsCisJLnNodXRkb3duID0gYXNvY19zaW1wbGVfY2FyZF9zaHV0ZG93biwKK307CisKK3N0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9kYWlfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBhc29jX3NpbXBsZV9jYXJkX3ByaXYgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbms7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzOworCWludCBudW0gPSBydGQtPm51bTsKKworCWRhaV9saW5rCT0gc2ltcGxlX3ByaXZfdG9fbGluayhwcml2LCBudW0pOworCWRhaV9wcm9wcwk9IHNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIG51bSk7CisJZGFpCQk9IGRhaV9saW5rLT5keW5hbWljID8KKwkJCQlydGQtPmNwdV9kYWkgOgorCQkJCXJ0ZC0+Y29kZWNfZGFpOworCisJcmV0dXJuIGFzb2Nfc2ltcGxlX2NhcmRfaW5pdF9kYWkoZGFpLCBkYWlfcHJvcHMpOworfQorCitzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfYmVfaHdfcGFyYW1zX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBhc29jX3NpbXBsZV9jYXJkX3ByaXYgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQkJICAgICAgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKworCWlmIChwcml2LT5jb252ZXJ0X3JhdGUpCisJCXJhdGUtPm1pbiA9CisJCXJhdGUtPm1heCA9IHByaXYtPmNvbnZlcnRfcmF0ZTsKKworCWlmIChwcml2LT5jb252ZXJ0X2NoYW5uZWxzKQorCQljaGFubmVscy0+bWluID0KKwkJY2hhbm5lbHMtPm1heCA9IHByaXYtPmNvbnZlcnRfY2hhbm5lbHM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2xpbmtzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCXN0cnVjdCBhc29jX3NpbXBsZV9jYXJkX3ByaXYgKnByaXYsCisJCQkJCXVuc2lnbmVkIGludCBkYWlmbXQsCisJCQkJCWludCBpZHgsIGJvb2wgaXNfZmUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc2ltcGxlX3ByaXZfdG9fZGV2KHByaXYpOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHNpbXBsZV9wcml2X3RvX2xpbmsocHJpdiwgaWR4KTsKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHMgPSBzaW1wbGVfcHJpdl90b19wcm9wcyhwcml2LCBpZHgpOworCWludCByZXQ7CisKKwlpZiAoaXNfZmUpIHsKKwkJaW50IGlzX3NpbmdsZV9saW5rcyA9IDA7CisKKwkJLyogQkUgaXMgZHVtbXkgKi8KKwkJZGFpX2xpbmstPmNvZGVjX29mX25vZGUJCT0gTlVMTDsKKwkJZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lCT0gInNuZC1zb2MtZHVtbXktZGFpIjsKKwkJZGFpX2xpbmstPmNvZGVjX25hbWUJCT0gInNuZC1zb2MtZHVtbXkiOworCisJCS8qIEZFIHNldHRpbmdzICovCisJCWRhaV9saW5rLT5keW5hbWljCQk9IDE7CisJCWRhaV9saW5rLT5kcGNtX21lcmdlZF9mb3JtYXQJPSAxOworCisJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY3B1KG5wLCBkYWlfbGluaywgREFJLCBDRUxMLAorCQkJCQkJICZpc19zaW5nbGVfbGlua3MpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2Nsa19jcHUobnAsIGRhaV9saW5rLCBkYWlfcHJvcHMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zZXRfZGFpbGlua19uYW1lKGRldiwgZGFpX2xpbmssCisJCQkJCQkJImZlLiVzIiwKKwkJCQkJCQlkYWlfbGluay0+Y3B1X2RhaV9uYW1lKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWFzb2Nfc2ltcGxlX2NhcmRfY2Fub25pY2FsaXplX2NwdShkYWlfbGluaywgaXNfc2luZ2xlX2xpbmtzKTsKKwl9IGVsc2UgeworCQkvKiBGRSBpcyBkdW1teSAqLworCQlkYWlfbGluay0+Y3B1X29mX25vZGUJCT0gTlVMTDsKKwkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZQkJPSAic25kLXNvYy1kdW1teS1kYWkiOworCQlkYWlfbGluay0+Y3B1X25hbWUJCT0gInNuZC1zb2MtZHVtbXkiOworCisJCS8qIEJFIHNldHRpbmdzICovCisJCWRhaV9saW5rLT5ub19wY20JCT0gMTsKKwkJZGFpX2xpbmstPmJlX2h3X3BhcmFtc19maXh1cAk9IGFzb2Nfc2ltcGxlX2NhcmRfYmVfaHdfcGFyYW1zX2ZpeHVwOworCisJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY29kZWMobnAsIGRhaV9saW5rLCBEQUksIENFTEwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9wYXJzZV9jbGtfY29kZWMobnAsIGRhaV9saW5rLCBkYWlfcHJvcHMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9zZXRfZGFpbGlua19uYW1lKGRldiwgZGFpX2xpbmssCisJCQkJCQkJImJlLiVzIiwKKwkJCQkJCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJc25kX3NvY19vZl9wYXJzZV9hdWRpb19wcmVmaXgoJnByaXYtPnNuZF9jYXJkLAorCQkJCQkgICAgICAmcHJpdi0+Y29kZWNfY29uZiwKKwkJCQkJICAgICAgZGFpX2xpbmstPmNvZGVjX29mX25vZGUsCisJCQkJCSAgICAgIFBSRUZJWCAicHJlZml4Iik7CisJfQorCisJcmV0ID0gc25kX3NvY19vZl9wYXJzZV90ZG1fc2xvdChucCwKKwkJCQkJJmRhaV9wcm9wcy0+dHhfc2xvdF9tYXNrLAorCQkJCQkmZGFpX3Byb3BzLT5yeF9zbG90X21hc2ssCisJCQkJCSZkYWlfcHJvcHMtPnNsb3RzLAorCQkJCQkmZGFpX3Byb3BzLT5zbG90X3dpZHRoKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9jYW5vbmljYWxpemVfZGFpbGluayhkYWlfbGluayk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlkYWlfbGluay0+ZGFpX2ZtdAkJPSBkYWlmbXQ7CisJZGFpX2xpbmstPmRwY21fcGxheWJhY2sJCT0gMTsKKwlkYWlfbGluay0+ZHBjbV9jYXB0dXJlCQk9IDE7CisJZGFpX2xpbmstPm9wcwkJCT0gJmFzb2Nfc2ltcGxlX2NhcmRfb3BzOworCWRhaV9saW5rLT5pbml0CQkJPSBhc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0OworCisJZGV2X2RiZyhkZXYsICJcdCVzIC8gJTA0eCAvICVkXG4iLAorCQlkYWlfbGluay0+bmFtZSwKKwkJZGFpX2xpbmstPmRhaV9mbXQsCisJCWRhaV9wcm9wcy0+c3lzY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfZGFpX2xpbmtfb2Yoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSBzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9wcml2ICpwcml2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNpbXBsZV9wcml2X3RvX2Rldihwcml2KTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXVuc2lnbmVkIGludCBkYWlmbXQgPSAwOworCWludCByZXQsIGk7CisJYm9vbCBpc19mZTsKKworCS8qIGZpbmQgMXN0IGNvZGVjICovCisJbnAgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShub2RlLCBQUkVGSVggImNvZGVjIik7CisJaWYgKCFucCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX2RhaWZtdChkZXYsIG5vZGUsIG5wLAorCQkJCQkgICAgUFJFRklYLCAmZGFpZm10KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWkgPSAwOworCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobm9kZSwgbnApIHsKKwkJaXNfZmUgPSBmYWxzZTsKKwkJaWYgKHN0cmNtcChucC0+bmFtZSwgUFJFRklYICJjcHUiKSA9PSAwKQorCQkJaXNfZmUgPSB0cnVlOworCisJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfbGlua3MobnAsIHByaXYsIGRhaWZtdCwgaSwgaXNfZmUpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWkrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICAgIHN0cnVjdCBhc29jX3NpbXBsZV9jYXJkX3ByaXYgKnByaXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqcHJvcHM7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmxpbmtzOworCWludCByZXQ7CisJaW50IG51bTsKKworCWlmICghbm9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwludW0gPSBvZl9nZXRfY2hpbGRfY291bnQobm9kZSk7CisJcHJvcHMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByb3BzKSAqIG51bSwgR0ZQX0tFUk5FTCk7CisJbGlua3MgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmxpbmtzKSAqIG51bSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcm9wcyB8fCAhbGlua3MpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+ZGFpX3Byb3BzCT0gcHJvcHM7CisJcHJpdi0+ZGFpX2xpbmsJPSBsaW5rczsKKworCS8qIEluaXQgc25kX3NvY19jYXJkICovCisJcHJpdi0+c25kX2NhcmQub3duZXIJCQk9IFRISVNfTU9EVUxFOworCXByaXYtPnNuZF9jYXJkLmRldgkJCT0gZGV2OworCXByaXYtPnNuZF9jYXJkLmRhaV9saW5rCQkJPSBwcml2LT5kYWlfbGluazsKKwlwcml2LT5zbmRfY2FyZC5udW1fbGlua3MJCT0gbnVtOworCXByaXYtPnNuZF9jYXJkLmNvZGVjX2NvbmYJCT0gJnByaXYtPmNvZGVjX2NvbmY7CisJcHJpdi0+c25kX2NhcmQubnVtX2NvbmZpZ3MJCT0gMTsKKworCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcm91dGluZygmcHJpdi0+c25kX2NhcmQsIFBSRUZJWCAicm91dGluZyIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2FtcGxpbmcgcmF0ZSBjb252ZXJ0ICovCisJb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgUFJFRklYICJjb252ZXJ0LXJhdGUiLCAmcHJpdi0+Y29udmVydF9yYXRlKTsKKworCS8qIGNoYW5uZWxzIHRyYW5zZmVyICovCisJb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgUFJFRklYICJjb252ZXJ0LWNoYW5uZWxzIiwgJnByaXYtPmNvbnZlcnRfY2hhbm5lbHMpOworCisJcmV0ID0gYXNvY19zaW1wbGVfY2FyZF9kYWlfbGlua19vZihub2RlLCBwcml2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2FyZF9uYW1lKCZwcml2LT5zbmRfY2FyZCwgUFJFRklYKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRldl9kYmcoZGV2LCAiTmV3IGNhcmQ6ICVzXG4iLAorCQlwcml2LT5zbmRfY2FyZC5uYW1lID8gcHJpdi0+c25kX2NhcmQubmFtZSA6ICIiKTsKKwlkZXZfZGJnKGRldiwgImNvbnZlcnRfcmF0ZSAgICAgJWRcbiIsIHByaXYtPmNvbnZlcnRfcmF0ZSk7CisJZGV2X2RiZyhkZXYsICJjb252ZXJ0X2NoYW5uZWxzICVkXG4iLCBwcml2LT5jb252ZXJ0X2NoYW5uZWxzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzb2Nfc2ltcGxlX2NhcmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXNvY19zaW1wbGVfY2FyZF9wcml2ICpwcml2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWludCByZXQ7CisKKwkvKiBBbGxvY2F0ZSB0aGUgcHJpdmF0ZSBkYXRhICovCisJcHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBhc29jX3NpbXBsZV9jYXJkX3BhcnNlX29mKG5wLCBwcml2LCBkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgIT0gLUVQUk9CRV9ERUZFUikKKwkJCWRldl9lcnIoZGV2LCAicGFyc2UgZXJyb3IgJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YSgmcHJpdi0+c25kX2NhcmQsIHByaXYpOworCisJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJnByaXYtPnNuZF9jYXJkKTsKKwlpZiAocmV0ID49IDApCisJCXJldHVybiByZXQ7CitlcnI6CisJYXNvY19zaW1wbGVfY2FyZF9jbGVhbl9yZWZlcmVuY2UoJnByaXYtPnNuZF9jYXJkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXNvY19zaW1wbGVfY2FyZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gYXNvY19zaW1wbGVfY2FyZF9jbGVhbl9yZWZlcmVuY2UoY2FyZCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFzb2Nfc2ltcGxlX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJzcmMtY2FyZCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtc2N1LWF1ZGlvLWNhcmQiLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFzb2Nfc2ltcGxlX29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXNvY19zaW1wbGVfY2FyZCA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzaW1wbGUtc2N1LWF1ZGlvLWNhcmQiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBhc29jX3NpbXBsZV9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IGFzb2Nfc2ltcGxlX2NhcmRfcHJvYmUsCisJLnJlbW92ZSA9IGFzb2Nfc2ltcGxlX2NhcmRfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhc29jX3NpbXBsZV9jYXJkKTsKKworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphc29jLXNpbXBsZS1zY3UtY2FyZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIFNpbXBsZSBTQ1UgU291bmQgQ2FyZCIpOworTU9EVUxFX0FVVEhPUigiS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ltZy9waXN0YWNoaW8taW50ZXJuYWwtZGFjLmMgYi9zb3VuZC9zb2MvaW1nL3Bpc3RhY2hpby1pbnRlcm5hbC1kYWMuYwppbmRleCAxNjJhMGZkLi41M2UxMWM2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW1nL3Bpc3RhY2hpby1pbnRlcm5hbC1kYWMuYworKysgYi9zb3VuZC9zb2MvaW1nL3Bpc3RhY2hpby1pbnRlcm5hbC1kYWMuYwpAQCAtMTM0LDEyICsxMzQsMTQgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgcGlzdGFjaGlvX2ludGVybmFsX2RhY19kcml2ZXIgPSB7CiAJLnByb2JlID0gcGlzdGFjaGlvX2ludGVybmFsX2RhY19jb2RlY19wcm9iZSwKIAkuaWRsZV9iaWFzX29mZiA9IHRydWUsCi0JLmNvbnRyb2xzID0gcGlzdGFjaGlvX2ludGVybmFsX2RhY19zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUocGlzdGFjaGlvX2ludGVybmFsX2RhY19zbmRfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gcGlzdGFjaGlvX2ludGVybmFsX2RhY19yb3V0ZXMsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUocGlzdGFjaGlvX2ludGVybmFsX2RhY19yb3V0ZXMpLAorCS5jb21wb25lbnRfZHJpdmVyID0geworCQkuY29udHJvbHMJCT0gcGlzdGFjaGlvX2ludGVybmFsX2RhY19zbmRfY29udHJvbHMsCisJCS5udW1fY29udHJvbHMJCT0gQVJSQVlfU0laRShwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3NuZF9jb250cm9scyksCisJCS5kYXBtX3dpZGdldHMJCT0gcGlzdGFjaGlvX2ludGVybmFsX2RhY193aWRnZXRzLAorCQkubnVtX2RhcG1fd2lkZ2V0cwk9IEFSUkFZX1NJWkUocGlzdGFjaGlvX2ludGVybmFsX2RhY193aWRnZXRzKSwKKwkJLmRhcG1fcm91dGVzCQk9IHBpc3RhY2hpb19pbnRlcm5hbF9kYWNfcm91dGVzLAorCQkubnVtX2RhcG1fcm91dGVzCT0gQVJSQVlfU0laRShwaXN0YWNoaW9faW50ZXJuYWxfZGFjX3JvdXRlcyksCisJfSwKIH07CiAKIHN0YXRpYyBpbnQgcGlzdGFjaGlvX2ludGVybmFsX2RhY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL0tjb25maWcgYi9zb3VuZC9zb2MvaW50ZWwvS2NvbmZpZwppbmRleCBhMjBjM2RmLi4yNmViNWEwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvaW50ZWwvS2NvbmZpZwpAQCAtMjUsNiArMjUsNyBAQAogCXRyaXN0YXRlCiAJc2VsZWN0IFNORF9TU1RfSVBDCiAJc2VsZWN0IFNORF9TT0NfSU5URUxfU1NUCisJc2VsZWN0IElPU0ZfTUJJCiAKIGNvbmZpZyBTTkRfU09DX0lOVEVMX1NTVAogCXRyaXN0YXRlCkBAIC0xMjAsNiArMTIxLDE3IEBACiAJICBUaGlzIGFkZHMgYXVkaW8gZHJpdmVyIGZvciBJbnRlbCBCYXl0cmFpbCBwbGF0Zm9ybSBiYXNlZCBib2FyZHMKIAkgIHdpdGggdGhlIE1BWDk4MDkwIGF1ZGlvIGNvZGVjLgogCitjb25maWcgU05EX1NPQ19JTlRFTF9CRFdfUlQ1Njc3X01BQ0gKKwl0cmlzdGF0ZSAiQVNvQyBBdWRpbyBkcml2ZXIgZm9yIEludGVsIEJyb2Fkd2VsbCB3aXRoIFJUNTY3NyBjb2RlYyIKKwlkZXBlbmRzIG9uIFg4Nl9JTlRFTF9MUFNTICYmIEdQSU9MSUIgJiYgSTJDICYmIERXX0RNQUMKKwlkZXBlbmRzIG9uIERXX0RNQUNfQ09SRT15CisJc2VsZWN0IFNORF9TT0NfSU5URUxfU1NUCisJc2VsZWN0IFNORF9TT0NfSU5URUxfSEFTV0VMTAorCXNlbGVjdCBTTkRfU09DX1JUNTY3NworCWhlbHAKKwkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBJbnRlbCBCcm9hZHdlbGwgcGxhdGZvcm0gYmFzZWQgYm9hcmRzIHdpdGgKKwkgIHRoZSBSVDU2NzcgYXVkaW8gY29kZWMuCisKIGNvbmZpZyBTTkRfU09DX0lOVEVMX0JST0FEV0VMTF9NQUNICiAJdHJpc3RhdGUgIkFTb0MgQXVkaW8gRFNQIHN1cHBvcnQgZm9yIEludGVsIEJyb2Fkd2VsbCBXaWxkY2F0cG9pbnQiCiAJZGVwZW5kcyBvbiBYODZfSU5URUxfTFBTUyAmJiBJMkMgJiYgRFdfRE1BQyAmJiBcCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtYXRvbS1jb250cm9scy5jIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0LWF0b20tY29udHJvbHMuYwppbmRleCA5ODcyMGE5Li4wODM4NDc4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtYXRvbS1jb250cm9scy5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmMKQEAgLTEsNCArMSw0IEBACi0vKgorIC8qCiAgKiAgc3N0LWF0b20tY29udHJvbHMuYyAtIEludGVsIE1JRCBQbGF0Zm9ybSBkcml2ZXIgRFBDTSBBTFNBIGNvbnRyb2xzIGZvciBNcmZsZAogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMTMtMTQgSW50ZWwgQ29ycApAQCAtNTM0LDYgKzUzNCw3IEBACiAKIC8qIExvb2sgdXAgdGFibGUgdG8gY29udmVydCBNSVhFUiBTVyBiaXQgcmVncyB0byBTV00gaW5wdXRzICovCiBzdGF0aWMgY29uc3QgdWludCBzd21fbWl4ZXJfaW5wdXRfaWRzW1NTVF9TV01fSU5QVVRfQ09VTlRdID0geworCVtTU1RfSVBfTU9ERU1dCQk9IFNTVF9TV01fSU5fTU9ERU0sCiAJW1NTVF9JUF9DT0RFQzBdCQk9IFNTVF9TV01fSU5fQ09ERUMwLAogCVtTU1RfSVBfQ09ERUMxXQkJPSBTU1RfU1dNX0lOX0NPREVDMSwKIAlbU1NUX0lQX0xPT1AwXQkJPSBTU1RfU1dNX0lOX1NQUk9UX0xPT1AsCkBAIC02NzQsNiArNjc1LDcgQEAKIC8qIFNCQSBtaXhlcnMgLSAxNiBpbnB1dHMgKi8KICNkZWZpbmUgU1NUX1NCQV9ERUNMQVJFX01JWF9DT05UUk9MUyhrY3RsX25hbWUpCQkJCQkJCVwKIAlzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcga2N0bF9uYW1lW10gPSB7CQkJCQlcCisJCVNPQ19EQVBNX1NJTkdMRSgibW9kZW1faW4gU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBTU1RfSVBfTU9ERU0sIDEsIDApLAkJXAogCQlTT0NfREFQTV9TSU5HTEUoImNvZGVjX2luMCBTd2l0Y2giLCBTTkRfU09DX05PUE0sIFNTVF9JUF9DT0RFQzAsIDEsIDApLAkJXAogCQlTT0NfREFQTV9TSU5HTEUoImNvZGVjX2luMSBTd2l0Y2giLCBTTkRfU09DX05PUE0sIFNTVF9JUF9DT0RFQzEsIDEsIDApLAkJXAogCQlTT0NfREFQTV9TSU5HTEUoInNwcm90X2xvb3BfaW4gU3dpdGNoIiwgU05EX1NPQ19OT1BNLCBTU1RfSVBfTE9PUDAsIDEsIDApLAlcCkBAIC02ODQsNiArNjg2LDcgQEAKIAl9CiAKICNkZWZpbmUgU1NUX1NCQV9NSVhFUl9HUkFQSF9NQVAobWl4X25hbWUpCQkJXAorCXsgbWl4X25hbWUsICJtb2RlbV9pbiBTd2l0Y2giLAkibW9kZW1faW4iIH0sCQlcCiAJeyBtaXhfbmFtZSwgImNvZGVjX2luMCBTd2l0Y2giLAkiY29kZWNfaW4wIiB9LAkJXAogCXsgbWl4X25hbWUsICJjb2RlY19pbjEgU3dpdGNoIiwJImNvZGVjX2luMSIgfSwJCVwKIAl7IG1peF9uYW1lLCAic3Byb3RfbG9vcF9pbiBTd2l0Y2giLAkic3Byb3RfbG9vcF9pbiIgfSwJXApAQCAtNzEzLDYgKzcxNiw3IEBACiBTU1RfU0JBX0RFQ0xBUkVfTUlYX0NPTlRST0xTKHNzdF9taXhfdm9pcF9jb250cm9scyk7CiBTU1RfU0JBX0RFQ0xBUkVfTUlYX0NPTlRST0xTKHNzdF9taXhfY29kZWMwX2NvbnRyb2xzKTsKIFNTVF9TQkFfREVDTEFSRV9NSVhfQ09OVFJPTFMoc3N0X21peF9jb2RlYzFfY29udHJvbHMpOworU1NUX1NCQV9ERUNMQVJFX01JWF9DT05UUk9MUyhzc3RfbWl4X21vZGVtX2NvbnRyb2xzKTsKIAogLyoKICAqIHNzdF9oYW5kbGVfdmJfdGltZXIgLSBTdGFydC9TdG9wIHRoZSBEU1Agc2NoZWR1bGVyCkBAIC05MzEsMTcgKzkzNSwyNiBAQAogaW50IHNlbmRfc3NwX2NtZChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgY29uc3QgY2hhciAqaWQsIGJvb2wgZW5hYmxlKQogewogCXN0cnVjdCBzc3RfZGF0YSAqZHJ2ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKLQljb25zdCBzdHJ1Y3Qgc3N0X3NzcF9jb25maWcgKmNvbmZpZzsKKwlpbnQgc3NwX2lkOwogCiAJZGV2X2luZm8oZGFpLT5kZXYsICJFbnRlcjogZW5hYmxlPSVkIHBvcnRfbmFtZT0lc1xuIiwgZW5hYmxlLCBpZCk7CiAKKwlpZiAoc3RyY21wKGlkLCAic3NwMC1wb3J0IikgPT0gMCkKKwkJc3NwX2lkID0gU1NQX01PREVNOworCWVsc2UgaWYgKHN0cmNtcChpZCwgInNzcDItcG9ydCIpID09IDApCisJCXNzcF9pZCA9IFNTUF9DT0RFQzsKKwllbHNlIHsKKwkJZGV2X2RiZyhkYWktPmRldiwgInBvcnQgJXMgaXMgbm90IHN1cHBvcnRlZFxuIiwgaWQpOworCQlyZXR1cm4gLTE7CisJfQorCiAJU1NUX0ZJTExfREVGQVVMVF9ERVNUSU5BVElPTihkcnYtPnNzcF9jbWQuaGVhZGVyLmRzdCk7CiAJZHJ2LT5zc3BfY21kLmhlYWRlci5jb21tYW5kX2lkID0gU0JBX0hXX1NFVF9TU1A7CiAJZHJ2LT5zc3BfY21kLmhlYWRlci5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHNzdF9jbWRfc2JhX2h3X3NldF9zc3ApCiAJCQkJLSBzaXplb2Yoc3RydWN0IHNzdF9kc3BfaGVhZGVyKTsKIAotCWNvbmZpZyA9ICZzc3Rfc3NwX2NvbmZpZ3M7Ci0JZGV2X2RiZyhkYWktPmRldiwgInNzcF9pZDogJXVcbiIsIGNvbmZpZy0+c3NwX2lkKTsKKwlkcnYtPnNzcF9jbWQuc2VsZWN0aW9uID0gc3NwX2lkOworCWRldl9kYmcoZGFpLT5kZXYsICJzc3BfaWQ6ICV1XG4iLCBzc3BfaWQpOwogCiAJaWYgKGVuYWJsZSkKIAkJZHJ2LT5zc3BfY21kLnN3aXRjaF9zdGF0ZSA9IFNTVF9TV0lUQ0hfT047CkBAIC0xMDQ3LDggKzEwNjAsMTAgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHNzdF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTU1RfQUlGX0lOKCJtb2RlbV9pbiIsIHNzdF9zZXRfYmVfbW9kdWxlcyksCiAJU1NUX0FJRl9JTigiY29kZWNfaW4wIiwgc3N0X3NldF9iZV9tb2R1bGVzKSwKIAlTU1RfQUlGX0lOKCJjb2RlY19pbjEiLCBzc3Rfc2V0X2JlX21vZHVsZXMpLAorCVNTVF9BSUZfT1VUKCJtb2RlbV9vdXQiLCBzc3Rfc2V0X2JlX21vZHVsZXMpLAogCVNTVF9BSUZfT1VUKCJjb2RlY19vdXQwIiwgc3N0X3NldF9iZV9tb2R1bGVzKSwKIAlTU1RfQUlGX09VVCgiY29kZWNfb3V0MSIsIHNzdF9zZXRfYmVfbW9kdWxlcyksCiAKQEAgLTExMDMsNiArMTExOCw5IEBACiAJCSAgICAgIHNzdF9taXhfY29kZWMwX2NvbnRyb2xzLCBzc3Rfc3dtX21peGVyX2V2ZW50KSwKIAlTU1RfU1dNX01JWEVSKCJjb2RlY19vdXQxIG1peCAwIiwgU05EX1NPQ19OT1BNLCBTU1RfVEFTS19TQkEsIFNTVF9TV01fT1VUX0NPREVDMSwKIAkJICAgICAgc3N0X21peF9jb2RlYzFfY29udHJvbHMsIHNzdF9zd21fbWl4ZXJfZXZlbnQpLAorCVNTVF9TV01fTUlYRVIoIm1vZGVtX291dCBtaXggMCIsIFNORF9TT0NfTk9QTSwgU1NUX1RBU0tfU0JBLCBTU1RfU1dNX09VVF9NT0RFTSwKKwkJICAgICAgc3N0X21peF9tb2RlbV9jb250cm9scywgc3N0X3N3bV9taXhlcl9ldmVudCksCisKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGludGVyY29uW10gPSB7CkBAIC0xMTQ4LDYgKzExNjYsOSBAQAogCVNTVF9TQkFfTUlYRVJfR1JBUEhfTUFQKCJjb2RlY19vdXQwIG1peCAwIiksCiAJeyJjb2RlY19vdXQxIiwgTlVMTCwgImNvZGVjX291dDEgbWl4IDAifSwKIAlTU1RfU0JBX01JWEVSX0dSQVBIX01BUCgiY29kZWNfb3V0MSBtaXggMCIpLAorCXsibW9kZW1fb3V0IiwgTlVMTCwgIm1vZGVtX291dCBtaXggMCJ9LAorCVNTVF9TQkFfTUlYRVJfR1JBUEhfTUFQKCJtb2RlbV9vdXQgbWl4IDAiKSwKKwogCiB9Owogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbG90X25hbWVzW10gPSB7CkBAIC0xMjE3LDYgKzEyMzgsOSBAQAogCVNTVF9HQUlOKCJtZWRpYV9sb29wMl9vdXQiLCBTU1RfUEFUSF9JTkRFWF9NRURJQV9MT09QMl9PVVQsIFNTVF9UQVNLX1NCQSwgMCwgJnNzdF9nYWluc1sxM10pLAogCVNTVF9HQUlOKCJzcHJvdF9sb29wX291dCIsIFNTVF9QQVRIX0lOREVYX1NQUk9UX0xPT1BfT1VULCBTU1RfVEFTS19TQkEsIDAsICZzc3RfZ2FpbnNbMTRdKSwKIAlTU1RfVk9MVU1FKCJtZWRpYTBfaW4iLCBTU1RfUEFUSF9JTkRFWF9NRURJQTBfSU4sIFNTVF9UQVNLX01NWCwgMCwgJnNzdF9nYWluc1sxNV0pLAorCVNTVF9HQUlOKCJtb2RlbV9pbiIsIFNTVF9QQVRIX0lOREVYX01PREVNX0lOLCBTU1RfVEFTS19TQkEsIDAsICZzc3RfZ2FpbnNbMTZdKSwKKwlTU1RfR0FJTigibW9kZW1fb3V0IiwgU1NUX1BBVEhfSU5ERVhfTU9ERU1fT1VULCBTU1RfVEFTS19TQkEsIDAsICZzc3RfZ2FpbnNbMTddKSwKKwogfTsKIAogI2RlZmluZSBTU1RfR0FJTl9OVU1fQ09OVFJPTFMgMwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0LWF0b20tY29udHJvbHMuaCBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmgKaW5kZXggZTAxMTMxMS4uMzUxZDgxNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0LWF0b20tY29udHJvbHMuaAorKysgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtYXRvbS1jb250cm9scy5oCkBAIC0zNSw2ICszNSw4IEBACiAvKiBkZWZpbmUgYSBiaXQgZm9yIGVhY2ggbWl4ZXIgaW5wdXQgKi8KICNkZWZpbmUgU1NUX01JWF9JUCh4KQkJKHgpCiAKKyNkZWZpbmUgU1NUX0lQX01PREVNCQlTU1RfTUlYX0lQKDApCisjZGVmaW5lIFNTVF9JUF9CVAkJU1NUX01JWF9JUCgxKQogI2RlZmluZSBTU1RfSVBfQ09ERUMwCQlTU1RfTUlYX0lQKDIpCiAjZGVmaW5lIFNTVF9JUF9DT0RFQzEJCVNTVF9NSVhfSVAoMykKICNkZWZpbmUgU1NUX0lQX0xPT1AwCQlTU1RfTUlYX0lQKDQpCkBAIC02Myw2ICs2NSw3IEBACiAgKiBBdWRpbyBEU1AgUGF0aCBJZHMuIFNwZWNpZmllZCBieSB0aGUgYXVkaW8gRFNQIEZXCiAgKi8KIGVudW0gc3N0X3BhdGhfaW5kZXggeworCVNTVF9QQVRIX0lOREVYX01PREVNX09VVCAgICAgICAgICAgICAgICA9ICgweDAwIDw8IFNTVF9QQVRIX0lEX1NISUZUKSwKIAlTU1RfUEFUSF9JTkRFWF9DT0RFQ19PVVQwICAgICAgICAgICAgICAgPSAoMHgwMiA8PCBTU1RfUEFUSF9JRF9TSElGVCksCiAJU1NUX1BBVEhfSU5ERVhfQ09ERUNfT1VUMSAgICAgICAgICAgICAgID0gKDB4MDMgPDwgU1NUX1BBVEhfSURfU0hJRlQpLAogCkBAIC04MCw2ICs4Myw3IEBACiAKIAogCS8qIFN0YXJ0IG9mIGlucHV0IHBhdGhzICovCisJU1NUX1BBVEhfSU5ERVhfTU9ERU1fSU4gICAgICAgICAgICAgICAgID0gKDB4ODAgPDwgU1NUX1BBVEhfSURfU0hJRlQpLAogCVNTVF9QQVRIX0lOREVYX0NPREVDX0lOMCAgICAgICAgICAgICAgICA9ICgweDgyIDw8IFNTVF9QQVRIX0lEX1NISUZUKSwKIAlTU1RfUEFUSF9JTkRFWF9DT0RFQ19JTjEgICAgICAgICAgICAgICAgPSAoMHg4MyA8PCBTU1RfUEFUSF9JRF9TSElGVCksCiAKQEAgLTEwNSw2ICsxMDksNyBAQAogICogcGF0aCBJRHMKICAqLwogZW51bSBzc3Rfc3dtX2lucHV0cyB7CisJU1NUX1NXTV9JTl9NT0RFTQk9IChTU1RfUEFUSF9JTkRFWF9NT0RFTV9JTgkgIHwgU1NUX0RFRkFVTFRfQ0VMTF9OQlIpLAogCVNTVF9TV01fSU5fQ09ERUMwCT0gKFNTVF9QQVRIX0lOREVYX0NPREVDX0lOMAkgIHwgU1NUX0RFRkFVTFRfQ0VMTF9OQlIpLAogCVNTVF9TV01fSU5fQ09ERUMxCT0gKFNTVF9QQVRIX0lOREVYX0NPREVDX0lOMQkgIHwgU1NUX0RFRkFVTFRfQ0VMTF9OQlIpLAogCVNTVF9TV01fSU5fU1BST1RfTE9PUAk9IChTU1RfUEFUSF9JTkRFWF9TUFJPVF9MT09QX0lOCSAgfCBTU1RfREVGQVVMVF9DRUxMX05CUiksCkBAIC0xMjQsNiArMTI5LDcgQEAKICAqIHBhdGggSURzCiAgKi8KIGVudW0gc3N0X3N3bV9vdXRwdXRzIHsKKwlTU1RfU1dNX09VVF9NT0RFTQk9IChTU1RfUEFUSF9JTkRFWF9NT0RFTV9PVVQJICB8IFNTVF9ERUZBVUxUX0NFTExfTkJSKSwKIAlTU1RfU1dNX09VVF9DT0RFQzAJPSAoU1NUX1BBVEhfSU5ERVhfQ09ERUNfT1VUMAkgIHwgU1NUX0RFRkFVTFRfQ0VMTF9OQlIpLAogCVNTVF9TV01fT1VUX0NPREVDMQk9IChTU1RfUEFUSF9JTkRFWF9DT0RFQ19PVVQxCSAgfCBTU1RfREVGQVVMVF9DRUxMX05CUiksCiAJU1NUX1NXTV9PVVRfU1BST1RfTE9PUAk9IChTU1RfUEFUSF9JTkRFWF9TUFJPVF9MT09QX09VVCAgfCBTU1RfREVGQVVMVF9DRUxMX05CUiksCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtbWZsZC1wbGF0Zm9ybS1wY20uYyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1tZmxkLXBsYXRmb3JtLXBjbS5jCmluZGV4IDUyZWQ0MzQuLjI1YzZkODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1tZmxkLXBsYXRmb3JtLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1tZmxkLXBsYXRmb3JtLXBjbS5jCkBAIC02NzAsNyArNjcwLDcgQEAKIAlyZXR1cm4gc3RyX2luZm8tPmJ1ZmZlcl9wdHI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc3N0X3BsYXRmb3JtX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9vcHMgc3N0X3BsYXRmb3JtX29wcyA9IHsKIAkub3BlbiA9IHNzdF9wbGF0Zm9ybV9vcGVuLAogCS5pb2N0bCA9IHNuZF9wY21fbGliX2lvY3RsLAogCS50cmlnZ2VyID0gc3N0X3BsYXRmb3JtX3BjbV90cmlnZ2VyLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdC5jIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdC5jCmluZGV4IGE0YjQ1OGUuLjliNmUyNzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3QuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0LmMKQEAgLTE5MCw3ICsxOTAsOCBAQAogCiAJZGVmYXVsdDoKIAkJZGV2X2Vycihzc3QtPmRldiwKLQkJCSJTU1QgRHJpdmVyIGNhcGFibGl0aWVzIG1pc3NpbmcgZm9yIGRldl9pZDogJXgiLCBzc3QtPmRldl9pZCk7CisJCQkiU1NUIERyaXZlciBjYXBhYmlsaXRpZXMgbWlzc2luZyBmb3IgZGV2X2lkOiAleCIsCisJCQlzc3QtPmRldl9pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX07CiB9CkBAIC00NDEsNyArNDQyLDcgQEAKIAkJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW0gPSAmY3R4LT5zdHJlYW1zW2ldOwogCiAJCWlmIChzdHJlYW0tPnN0YXR1cyA9PSBTVFJFQU1fUlVOTklORykgewotCQkJZGV2X2VycihkZXYsICJzdHJlYW0gJWQgaXMgcnVubmluZywgY2FudCBzdXN1cGVuZCwgYWJvcnRcbiIsIGkpOworCQkJZGV2X2VycihkZXYsICJzdHJlYW0gJWQgaXMgcnVubmluZywgY2FuJ3Qgc3VzcGVuZCwgYWJvcnRcbiIsIGkpOwogCQkJcmV0dXJuIC1FQlVTWTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfYWNwaS5jIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9hY3BpLmMKaW5kZXggNGQzMTg0OS4uYmE1YzBkNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9hY3BpLmMKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9hY3BpLmMKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlIDxhY3BpL3BsYXRmb3JtL2FjbGludXguaD4KICNpbmNsdWRlIDxhY3BpL2FjdHlwZXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSA8YXNtL2NwdV9kZXZpY2VfaWQuaD4KKyNpbmNsdWRlIDxhc20vaW9zZl9tYmkuaD4KICNpbmNsdWRlICIuLi9zc3QtbWZsZC1wbGF0Zm9ybS5oIgogI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9zc3QtZHNwLmgiCiAjaW5jbHVkZSAiLi4vLi4vY29tbW9uL3NzdC1hY3BpLmgiCkBAIC0xMTMsNiArMTE1LDI4IEBACiAJLmFjcGlfaXBjX2lycV9pbmRleCA9IDUsCiB9OwogCisvKiBCWVRDUiBoYXMgZGlmZmVyZW50IEJJT1MgZnJvbSBCWVQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3N0X3Jlc19pbmZvIGJ5dGNyX3Jlc19pbmZvID0geworCS5zaGltX29mZnNldCA9IDB4MTQwMDAwLAorCS5zaGltX3NpemUgPSAweDAwMDEwMCwKKwkuc2hpbV9waHlfYWRkciA9IFNTVF9CWVRfU0hJTV9QSFlfQUREUiwKKwkuc3NwMF9vZmZzZXQgPSAweGEwMDAwLAorCS5zc3AwX3NpemUgPSAweDEwMDAsCisJLmRtYTBfb2Zmc2V0ID0gMHg5ODAwMCwKKwkuZG1hMF9zaXplID0gMHg0MDAwLAorCS5kbWExX29mZnNldCA9IDB4OWMwMDAsCisJLmRtYTFfc2l6ZSA9IDB4NDAwMCwKKwkuaXJhbV9vZmZzZXQgPSAweDBjMDAwMCwKKwkuaXJhbV9zaXplID0gMHgxNDAwMCwKKwkuZHJhbV9vZmZzZXQgPSAweDEwMDAwMCwKKwkuZHJhbV9zaXplID0gMHgyODAwMCwKKwkubWJveF9vZmZzZXQgPSAweDE0NDAwMCwKKwkubWJveF9zaXplID0gMHgxMDAwLAorCS5hY3BpX2xwZV9yZXNfaW5kZXggPSAwLAorCS5hY3BpX2Rkcl9pbmRleCA9IDIsCisJLmFjcGlfaXBjX2lycV9pbmRleCA9IDAKK307CisKIHN0YXRpYyBzdHJ1Y3Qgc3N0X3BsYXRmb3JtX2luZm8gYnl0X3J2cF9wbGF0Zm9ybV9kYXRhID0gewogCS5wcm9iZV9kYXRhID0gJmJ5dF9md3BhcnNlX2luZm8sCiAJLmlwY19pbmZvID0gJmJ5dF9pcGNfaW5mbywKQEAgLTE0Miw3ICsxNjYsNyBAQAogCXJzcmMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sCiAJCQkJCWN0eC0+cGRhdGEtPnJlc19pbmZvLT5hY3BpX2xwZV9yZXNfaW5kZXgpOwogCWlmICghcnNyYykgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAiSW52YWxpZCBTSElNIGJhc2UgZnJvbSBJRldJIik7CisJCWRldl9lcnIoY3R4LT5kZXYsICJJbnZhbGlkIFNISU0gYmFzZSBmcm9tIElGV0lcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAJZGV2X2luZm8oY3R4LT5kZXYsICJMUEUgYmFzZTogJSN4IHNpemU6JSN4IiwgKHVuc2lnbmVkIGludCkgcnNyYy0+c3RhcnQsCkBAIC0xNTQsNyArMTc4LDcgQEAKIAljdHgtPmlyYW0gPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShjdHgtPmRldiwgY3R4LT5pcmFtX2Jhc2UsCiAJCQkJCSBjdHgtPnBkYXRhLT5yZXNfaW5mby0+aXJhbV9zaXplKTsKIAlpZiAoIWN0eC0+aXJhbSkgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBJUkFNIik7CisJCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIElSQU1cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE2NCw3ICsxODgsNyBAQAogCWN0eC0+ZHJhbSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKGN0eC0+ZGV2LCBjdHgtPmRyYW1fYmFzZSwKIAkJCQkJIGN0eC0+cGRhdGEtPnJlc19pbmZvLT5kcmFtX3NpemUpOwogCWlmICghY3R4LT5kcmFtKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIERSQU0iKTsKKwkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgRFJBTVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMTczLDcgKzE5Nyw3IEBACiAJY3R4LT5zaGltID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoY3R4LT5kZXYsIGN0eC0+c2hpbV9waHlfYWRkLAogCQkJCQljdHgtPnBkYXRhLT5yZXNfaW5mby0+c2hpbV9zaXplKTsKIAlpZiAoIWN0eC0+c2hpbSkgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBTSElNIik7CisJCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIFNISU1cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTE4Niw3ICsyMTAsNyBAQAogCWN0eC0+bWFpbGJveCA9IGRldm1faW9yZW1hcF9ub2NhY2hlKGN0eC0+ZGV2LCBjdHgtPm1haWxib3hfYWRkLAogCQkJCQkgICAgY3R4LT5wZGF0YS0+cmVzX2luZm8tPm1ib3hfc2l6ZSk7CiAJaWYgKCFjdHgtPm1haWxib3gpIHsKLQkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgbWFpbGJveCIpOworCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBtYWlsYm94XG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC0xOTYsNyArMjIwLDcgQEAKIAlyc3JjID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAogCQkJCQljdHgtPnBkYXRhLT5yZXNfaW5mby0+YWNwaV9kZHJfaW5kZXgpOwogCWlmICghcnNyYykgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAiSW52YWxpZCBERFIgYmFzZSBmcm9tIElGV0kiKTsKKwkJZGV2X2VycihjdHgtPmRldiwgIkludmFsaWQgRERSIGJhc2UgZnJvbSBJRldJXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWN0eC0+ZGRyX2Jhc2UgPSByc3JjLT5zdGFydDsKQEAgLTIwNSw3ICsyMjksNyBAQAogCWN0eC0+ZGRyID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoY3R4LT5kZXYsIGN0eC0+ZGRyX2Jhc2UsCiAJCQkJCXJlc291cmNlX3NpemUocnNyYykpOwogCWlmICghY3R4LT5kZHIpIHsKLQkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgRERSIik7CisJCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIEREUlxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMjE1LDYgKzIzOSw0NiBAQAogCXJldHVybiAwOwogfQogCisKK3N0YXRpYyBpbnQgaXNfYnl0X2NyKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCAqYnl0Y3IpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfSU9TRl9NQkkpKSB7CisJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCBjcHVfaWRzW10gPSB7CisJCQl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIDU1IH0sIC8qIFZhbGxleXZpZXcsIEJheSBUcmFpbCAqLworCQkJe30KKwkJfTsKKwkJdTMyIGJpb3Nfc3RhdHVzOworCisJCWlmICgheDg2X21hdGNoX2NwdShjcHVfaWRzKSB8fCAhaW9zZl9tYmlfYXZhaWxhYmxlKCkpIHsKKwkJCS8qIGJhaWwgc2lsZW50bHkgKi8KKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKworCQlzdGF0dXMgPSBpb3NmX21iaV9yZWFkKEJUX01CSV9VTklUX1BNQywgLyogMHgwNCBQVU5JVCAqLworCQkJCSAgICAgICBNQklfUkVHX1JFQUQsIC8qIDB4MTAgKi8KKwkJCQkgICAgICAgMHgwMDYsIC8qIEJJT1NfQ09ORklHICovCisJCQkJICAgICAgICZiaW9zX3N0YXR1cyk7CisKKwkJaWYgKHN0YXR1cykgeworCQkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgcmVhZCBQVU5JVCBCSU9TX0NPTkZJR1xuIik7CisJCX0gZWxzZSB7CisJCQkvKiBiaXRzIDI2OjI3IG1pcnJvciBQTUlDIG9wdGlvbnMgKi8KKwkJCWJpb3Nfc3RhdHVzID0gKGJpb3Nfc3RhdHVzID4+IDI2KSAmIDM7CisKKwkJCWlmICgoYmlvc19zdGF0dXMgPT0gMSkgfHwgKGJpb3Nfc3RhdHVzID09IDMpKQorCQkJCSpieXRjciA9IHRydWU7CisJCQllbHNlCisJCQkJZGV2X2luZm8oZGV2LCAiQllULUNSIG5vdCBkZXRlY3RlZFxuIik7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfaW5mbyhkZXYsICJJT1NGX01CSSBub3QgZW5hYmxlZCwgbm8gQllULUNSIGRldGVjdGlvblxuIik7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKwogc3RhdGljIGludCBzc3RfYWNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CkBAIC0yMjYsMTEgKzI5MCwxMiBAQAogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRfZGV2OwogCXN0cnVjdCBzc3RfcGxhdGZvcm1faW5mbyAqcGRhdGE7CiAJdW5zaWduZWQgaW50IGRldl9pZDsKKwlib29sIGJ5dGNyID0gZmFsc2U7CiAKIAlpZCA9IGFjcGlfbWF0Y2hfZGV2aWNlKGRldi0+ZHJpdmVyLT5hY3BpX21hdGNoX3RhYmxlLCBkZXYpOwogCWlmICghaWQpCiAJCXJldHVybiAtRU5PREVWOwotCWRldl9kYmcoZGV2LCAiZm9yICVzIiwgaWQtPmlkKTsKKwlkZXZfZGJnKGRldiwgImZvciAlc1xuIiwgaWQtPmlkKTsKIAogCW1hY2ggPSAoc3RydWN0IHNzdF9hY3BpX21hY2ggKilpZC0+ZHJpdmVyX2RhdGE7CiAJbWFjaCA9IHNzdF9hY3BpX2ZpbmRfbWFjaGluZShtYWNoKTsKQEAgLTI1MSw2ICszMTYsMTggQEAKIAogCWRldl9kYmcoZGV2LCAiQUNQSSBkZXZpY2UgaWQ6ICV4XG4iLCBkZXZfaWQpOwogCisJcmV0ID0gc3N0X2FsbG9jX2Rydl9jb250ZXh0KCZjdHgsIGRldiwgZGV2X2lkKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGlzX2J5dF9jcihkZXYsICZieXRjcik7CisJaWYgKCEoKHJldCA8IDApIHx8IChieXRjciA9PSBmYWxzZSkpKSB7CisJCWRldl9pbmZvKGRldiwgIkRldGVjdGVkIEJheXRyYWlsLUNSIHBsYXRmb3JtXG4iKTsKKworCQkvKiBvdmVycmlkZSByZXNvdXJjZSBpbmZvICovCisJCWJ5dF9ydnBfcGxhdGZvcm1fZGF0YS5yZXNfaW5mbyA9ICZieXRjcl9yZXNfaW5mbzsKKwl9CisKIAlwbGF0X2RldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKGRldiwgcGRhdGEtPnBsYXRmb3JtLCAtMSwKIAkJCQkJCU5VTEwsIDApOwogCWlmIChJU19FUlIocGxhdF9kZXYpKSB7CkBAIC0yNzEsMTAgKzM0OCw2IEBACiAJCXJldHVybiBQVFJfRVJSKG1kZXYpOwogCX0KIAotCXJldCA9IHNzdF9hbGxvY19kcnZfY29udGV4dCgmY3R4LCBkZXYsIGRldl9pZCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KIAkvKiBGaWxsIHNzdCBwbGF0Zm9ybSBkYXRhICovCiAJY3R4LT5wZGF0YSA9IHBkYXRhOwogCXN0cmNweShjdHgtPmZpcm13YXJlX25hbWUsIG1hY2gtPmZ3X2ZpbGVuYW1lKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfaXBjLmMgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X2lwYy5jCmluZGV4IDhhZmE2ZmUuLmJmYzg4OTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfaXBjLmMKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9pcGMuYwpAQCAtMjY3LDYgKzI2Nyw5IEBACiAJCQkJIlBlcmlvZCBlbGFwc2VkIHJjdmQgZm9yIHBpcGUgaWQgMHgleFxuIiwKIAkJCQlwaXBlX2lkKTsKIAkJCXN0cmVhbSA9ICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOworCQkJLyogSWYgc3RyZWFtIGlzIGRyb3BwZWQsIHNraXAgcHJvY2Vzc2luZyB0aGlzIG1lc3NhZ2UqLworCQkJaWYgKHN0cmVhbS0+c3RhdHVzID09IFNUUkVBTV9JTklUKQorCQkJCWJyZWFrOwogCQkJaWYgKHN0cmVhbS0+cGVyaW9kX2VsYXBzZWQpCiAJCQkJc3RyZWFtLT5wZXJpb2RfZWxhcHNlZChzdHJlYW0tPnBjbV9zdWJzdHJlYW0pOwogCQkJaWYgKHN0cmVhbS0+Y29tcHJfY2IpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X3B2dC5jIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9wdnQuYwppbmRleCBhZGIzMmZlLi5iMWU2YjhmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X3B2dC5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfcHZ0LmMKQEAgLTI3OSwxNyArMjc5LDE1IEBACiAKIAlpZiAocmVzcG9uc2UpIHsKIAkJcmV0ID0gc3N0X3dhaXRfdGltZW91dChzc3QsIGJsb2NrKTsKLQkJaWYgKHJldCA8IDApIHsKKwkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKLQkJfSBlbHNlIGlmKGJsb2NrLT5kYXRhKSB7Ci0JCQlpZiAoIWRhdGEpCi0JCQkJZ290byBvdXQ7Ci0JCQkqZGF0YSA9IGt6YWxsb2MoYmxvY2stPnNpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKCEoKmRhdGEpKSB7CisKKwkJaWYgKGRhdGEgJiYgYmxvY2stPmRhdGEpIHsKKwkJCSpkYXRhID0ga21lbWR1cChibG9jay0+ZGF0YSwgYmxvY2stPnNpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKCEqZGF0YSkgewogCQkJCXJldCA9IC1FTk9NRU07CiAJCQkJZ290byBvdXQ7Ci0JCQl9IGVsc2UKLQkJCQltZW1jcHkoZGF0YSwgKHZvaWQgKikgYmxvY2stPmRhdGEsIGJsb2NrLT5zaXplKTsKKwkJCX0KIAkJfQogCX0KIG91dDoKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9iYXl0cmFpbC9zc3QtYmF5dHJhaWwtaXBjLmMgYi9zb3VuZC9zb2MvaW50ZWwvYmF5dHJhaWwvc3N0LWJheXRyYWlsLWlwYy5jCmluZGV4IDViYmFhNjYuLmM4NDU1YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9iYXl0cmFpbC9zc3QtYmF5dHJhaWwtaXBjLmMKKysrIGIvc291bmQvc29jL2ludGVsL2JheXRyYWlsL3NzdC1iYXl0cmFpbC1pcGMuYwpAQCAtMTg0LDE1ICsxODQsOSBAQAogCiBzdGF0aWMgaW5saW5lIHU2NCBzc3RfYnl0X2hlYWRlcihpbnQgbXNnX2lkLCBpbnQgZGF0YSwgYm9vbCBsYXJnZSwgaW50IHN0cl9pZCkKIHsKLQl1NjQgaGVhZGVyOwotCi0JaGVhZGVyID0gSVBDX0hFQURFUl9NU0dfSUQobXNnX2lkKSB8Ci0JCSBJUENfSEVBREVSX1NUUl9JRChzdHJfaWQpIHwKLQkJIElQQ19IRUFERVJfTEFSR0UobGFyZ2UpIHwKLQkJIElQQ19IRUFERVJfREFUQShkYXRhKSB8Ci0JCSBTU1RfQllUX0lQQ1hfQlVTWTsKLQotCXJldHVybiBoZWFkZXI7CisJcmV0dXJuIElQQ19IRUFERVJfTVNHX0lEKG1zZ19pZCkgfCBJUENfSEVBREVSX1NUUl9JRChzdHJfaWQpIHwKKwkgICAgICAgSVBDX0hFQURFUl9MQVJHRShsYXJnZSkgfCBJUENfSEVBREVSX0RBVEEoZGF0YSkgfAorCSAgICAgICBTU1RfQllUX0lQQ1hfQlVTWTsKIH0KIAogc3RhdGljIGlubGluZSB1MTYgc3N0X2J5dF9oZWFkZXJfbXNnX2lkKHU2NCBoZWFkZXIpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL01ha2VmaWxlIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9NYWtlZmlsZQppbmRleCBkYWMwM2EwLi41NjM5ZjEwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvTWFrZWZpbGUKQEAgLTEsNiArMSw3IEBACiBzbmQtc29jLXNzdC1oYXN3ZWxsLW9ianMgOj0gaGFzd2VsbC5vCiBzbmQtc29jLXNzdC1ieXQtcnQ1NjQwLW1hY2gtb2JqcyA6PSBieXQtcnQ1NjQwLm8KIHNuZC1zb2Mtc3N0LWJ5dC1tYXg5ODA5MC1tYWNoLW9ianMgOj0gYnl0LW1heDk4MDkwLm8KK3NuZC1zb2Mtc3N0LWJkdy1ydDU2NzctbWFjaC1vYmpzIDo9IGJkdy1ydDU2Nzcubwogc25kLXNvYy1zc3QtYnJvYWR3ZWxsLW9ianMgOj0gYnJvYWR3ZWxsLm8KIHNuZC1zb2Mtc3N0LWJ4dC1kYTcyMTlfbWF4OTgzNTdhLW9ianMgOj0gYnh0X2RhNzIxOV9tYXg5ODM1N2Eubwogc25kLXNvYy1zc3QtYnh0LXJ0Mjk4LW9ianMgOj0gYnh0X3J0Mjk4Lm8KQEAgLTE5LDYgKzIwLDcgQEAKIG9iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0JYVF9EQTcyMTlfTUFYOTgzNTdBX01BQ0gpICs9IHNuZC1zb2Mtc3N0LWJ4dC1kYTcyMTlfbWF4OTgzNTdhLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0JYVF9SVDI5OF9NQUNIKSArPSBzbmQtc29jLXNzdC1ieHQtcnQyOTgubwogb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQlJPQURXRUxMX01BQ0gpICs9IHNuZC1zb2Mtc3N0LWJyb2Fkd2VsbC5vCitvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9CRFdfUlQ1Njc3X01BQ0gpICs9IHNuZC1zb2Mtc3N0LWJkdy1ydDU2NzctbWFjaC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9CWVRDUl9SVDU2NDBfTUFDSCkgKz0gc25kLXNvYy1zc3QtYnl0Y3ItcnQ1NjQwLm8KIG9iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0JZVENSX1JUNTY1MV9NQUNIKSArPSBzbmQtc29jLXNzdC1ieXRjci1ydDU2NTEubwogb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQ0hUX0JTV19SVDU2NzJfTUFDSCkgKz0gc25kLXNvYy1zc3QtY2h0LWJzdy1ydDU2NzIubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2JvYXJkcy9iZHctcnQ1Njc3LmMgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2Jkdy1ydDU2NzcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdlNjcwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9iZHctcnQ1Njc3LmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBBU29DIG1hY2hpbmUgZHJpdmVyIGZvciBJbnRlbCBCcm9hZHdlbGwgcGxhdGZvcm1zIHdpdGggUlQ1Njc3IGNvZGVjCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBUaGUgQ2hyb21pdW0gT1MgQXV0aG9ycy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisKKyNpbmNsdWRlICIuLi9jb21tb24vc3N0LWRzcC5oIgorI2luY2x1ZGUgIi4uL2hhc3dlbGwvc3N0LWhhc3dlbGwtaXBjLmgiCisKKyNpbmNsdWRlICIuLi8uLi9jb2RlY3MvcnQ1Njc3LmgiCisKK3N0cnVjdCBiZHdfcnQ1Njc3X3ByaXYgeworCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9faHBfZW47CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworfTsKKworc3RhdGljIGludCBiZHdfcnQ1Njc3X2V2ZW50X2hwKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJc3RydWN0IHNuZF9rY29udHJvbCAqaywgaW50IGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHctPmRhcG07CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGRhcG0tPmNhcmQ7CisJc3RydWN0IGJkd19ydDU2NzdfcHJpdiAqYmR3X3J0NTY3NyA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKworCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKQorCQltc2xlZXAoNzApOworCisJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKGJkd19ydDU2NzctPmdwaW9faHBfZW4sCisJCVNORF9TT0NfREFQTV9FVkVOVF9PTihldmVudCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBiZHdfcnQ1Njc3X3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSIsIGJkd19ydDU2NzdfZXZlbnRfaHApLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkxvY2FsIERNSUNzIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiUmVtb3RlIERNSUNzIiwgTlVMTCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBiZHdfcnQ1Njc3X21hcFtdID0geworCS8qIFNwZWFrZXJzICovCisJeyJTcGVha2VyIiwgTlVMTCwgIlBETTFMIn0sCisJeyJTcGVha2VyIiwgTlVMTCwgIlBETTFSIn0sCisKKwkvKiBIZWFkc2V0IGphY2sgY29ubmVjdG9ycyAqLworCXsiSGVhZHBob25lIiwgTlVMTCwgIkxPVVQxIn0sCisJeyJIZWFkcGhvbmUiLCBOVUxMLCAiTE9VVDIifSwKKwl7IklOMVAiLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKKwl7IklOMU4iLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKKworCS8qIERpZ2l0YWwgTUlDcworCSAqIExvY2FsIERNSUNzOiB0aGUgdHdvIERNSUNzIG9uIHRoZSBtYWluYm9hcmQKKwkgKiBSZW1vdGUgRE1JQ3M6IHRoZSB0d28gRE1JQ3Mgb24gdGhlIGNhbWVyYSBtb2R1bGUKKwkgKi8KKwl7IkRNSUMgTDEiLCBOVUxMLCAiUmVtb3RlIERNSUNzIn0sCisJeyJETUlDIFIxIiwgTlVMTCwgIlJlbW90ZSBETUlDcyJ9LAorCXsiRE1JQyBMMiIsIE5VTEwsICJMb2NhbCBETUlDcyJ9LAorCXsiRE1JQyBSMiIsIE5VTEwsICJMb2NhbCBETUlDcyJ9LAorCisJLyogQ09ERUMgQkUgY29ubmVjdGlvbnMgKi8KKwl7IlNTUDAgQ09ERUMgSU4iLCBOVUxMLCAiQUlGMSBDYXB0dXJlIn0sCisJeyJBSUYxIFBsYXliYWNrIiwgTlVMTCwgIlNTUDAgQ09ERUMgT1VUIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYmR3X3J0NTY3N19jb250cm9sc1tdID0geworCVNPQ19EQVBNX1BJTl9TV0lUQ0goIlNwZWFrZXIiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkcGhvbmUiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkc2V0IE1pYyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkxvY2FsIERNSUNzIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiUmVtb3RlIERNSUNzIiksCit9OworCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrIGhlYWRwaG9uZV9qYWNrOworc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2sgbWljX2phY2s7CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrX3BpbiBoZWFkcGhvbmVfamFja19waW4gPSB7CisJLnBpbgk9ICJIZWFkcGhvbmUiLAorCS5tYXNrCT0gU05EX0pBQ0tfSEVBRFBIT05FLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfcGluIG1pY19qYWNrX3BpbiA9IHsKKwkucGluCT0gIkhlYWRzZXQgTWljIiwKKwkubWFzawk9IFNORF9KQUNLX01JQ1JPUEhPTkUsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFja19ncGlvIGhlYWRwaG9uZV9qYWNrX2dwaW8gPSB7CisJLm5hbWUJCQk9ICJwbHVnLWRldCIsCisJLnJlcG9ydAkJCT0gU05EX0pBQ0tfSEVBRFBIT05FLAorCS5kZWJvdW5jZV90aW1lCQk9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrX2dwaW8gbWljX2phY2tfZ3BpbyA9IHsKKwkubmFtZQkJCT0gIm1pYy1wcmVzZW50IiwKKwkucmVwb3J0CQkJPSBTTkRfSkFDS19NSUNST1BIT05FLAorCS5kZWJvdW5jZV90aW1lCQk9IDIwMCwKKwkuaW52ZXJ0CQkJPSAxLAorfTsKKworc3RhdGljIGludCBicm9hZHdlbGxfc3NwMF9maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwkvKiBUaGUgQURTUCB3aWxsIGNvdmVydCB0aGUgRkUgcmF0ZSB0byA0OGssIHN0ZXJlbyAqLworCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IDQ4MDAwOworCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gMjsKKworCS8qIHNldCBTU1AwIHRvIDE2IGJpdCAqLworCXNuZF9tYXNrX3NldCgmcGFyYW1zLT5tYXNrc1tTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFUIC0KKwkJCQkgICAgU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0tdLAorCQkJCSAgICBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmR3X3J0NTY3N19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NzdfU0NMS19TX01DTEssIDI0NTc2MDAwLAorCQlTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHN5c2NsayBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGJkd19ydDU2Nzdfb3BzID0geworCS5od19wYXJhbXMgPSBiZHdfcnQ1Njc3X2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBpbnQgYmR3X3J0NTY3N19ydGRfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShydGQtPnBsYXRmb3JtLT5kZXYpOworCXN0cnVjdCBzc3RfaHN3ICpicm9hZHdlbGwgPSBwZGF0YS0+ZHNwOworCWludCByZXQ7CisKKwkvKiBTZXQgQURTUCBTU1AgcG9ydCBzZXR0aW5ncyAqLworCXJldCA9IHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcoYnJvYWR3ZWxsLCBTU1RfSFNXX0RFVklDRV9TU1BfMCwKKwkJU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzI0X01IWiwKKwkJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfTUFTVEVSLCA5KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBzZXQgZGV2aWNlIGNvbmZpZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmR3X3J0NTY3N19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IGJkd19ydDU2NzdfcHJpdiAqYmR3X3J0NTY3NyA9CisJCQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RhcG0oY29kZWMpOworCisJLyogRW5hYmxlIGNvZGVjIEFTUkMgZnVuY3Rpb24gZm9yIFN0ZXJlbyBEQUMvU3RlcmVvMSBBREMvRE1JQy9JMlMxLgorCSAqIFRoZSBBU1JDIGNsb2NrIHNvdXJjZSBpcyBjbGtfaTJzMV9hc3JjLgorCSAqLworCXJ0NTY3N19zZWxfYXNyY19jbGtfc3JjKGNvZGVjLCBSVDU2NzdfREFfU1RFUkVPX0ZJTFRFUiB8CisJCQlSVDU2NzdfQURfU1RFUkVPMV9GSUxURVIgfCBSVDU2NzdfSTJTMV9TT1VSQ0UsCisJCQlSVDU2NzdfQ0xLX1NFTF9JMlMxX0FTUkMpOworCisJLyogUmVxdWVzdCBydDU2NzcgR1BJTyBmb3IgaGVhZHBob25lIGFtcCBjb250cm9sICovCisJYmR3X3J0NTY3Ny0+Z3Bpb19ocF9lbiA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGNvZGVjLT5kZXYsCisJCQkiaGVhZHBob25lLWVuYWJsZSIsIDAsIDApOworCWlmIChJU19FUlIoYmR3X3J0NTY3Ny0+Z3Bpb19ocF9lbikpIHsKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiQ2FuJ3QgZmluZCBIUF9BTVBfU0hETl9MIGdwaW9cbiIpOworCQlyZXR1cm4gUFRSX0VSUihiZHdfcnQ1Njc3LT5ncGlvX2hwX2VuKTsKKwl9CisJZ3Bpb2RfZGlyZWN0aW9uX291dHB1dChiZHdfcnQ1Njc3LT5ncGlvX2hwX2VuLCAwKTsKKworCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBoZWFkcGhvbmUgamFjayAqLworCWlmICghc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRwaG9uZSBKYWNrIiwKKwkJCVNORF9KQUNLX0hFQURQSE9ORSwgJmhlYWRwaG9uZV9qYWNrLAorCQkJJmhlYWRwaG9uZV9qYWNrX3BpbiwgMSkpIHsKKwkJaGVhZHBob25lX2phY2tfZ3Bpby5ncGlvZF9kZXYgPSBjb2RlYy0+ZGV2OworCQlpZiAoc25kX3NvY19qYWNrX2FkZF9ncGlvcygmaGVhZHBob25lX2phY2ssIDEsCisJCQkJJmhlYWRwaG9uZV9qYWNrX2dwaW8pKQorCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiQ2FuJ3QgYWRkIGhlYWRwaG9uZSBqYWNrIGdwaW9cbiIpOworCX0gZWxzZSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkNhbid0IGNyZWF0ZSBoZWFkcGhvbmUgamFja1xuIik7CisJfQorCisJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIG1pYyBqYWNrICovCisJaWYgKCFzbmRfc29jX2NhcmRfamFja19uZXcocnRkLT5jYXJkLCAiTWljIEphY2siLAorCQkJU05EX0pBQ0tfTUlDUk9QSE9ORSwgJm1pY19qYWNrLAorCQkJJm1pY19qYWNrX3BpbiwgMSkpIHsKKwkJbWljX2phY2tfZ3Bpby5ncGlvZF9kZXYgPSBjb2RlYy0+ZGV2OworCQlpZiAoc25kX3NvY19qYWNrX2FkZF9ncGlvcygmbWljX2phY2ssIDEsICZtaWNfamFja19ncGlvKSkKKwkJCWRldl9lcnIoY29kZWMtPmRldiwgIkNhbid0IGFkZCBtaWMgamFjayBncGlvXG4iKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJDYW4ndCBjcmVhdGUgbWljIGphY2tcbiIpOworCX0KKwliZHdfcnQ1Njc3LT5jb2RlYyA9IGNvZGVjOworCisJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oZGFwbSwgIk1JQ0JJQVMxIik7CisJcmV0dXJuIDA7Cit9CisKKy8qIGJyb2Fkd2VsbCBkaWdpdGFsIGF1ZGlvIGludGVyZmFjZSBnbHVlIC0gY29ubmVjdHMgY29kZWMgPC0tPiBDUFUgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBiZHdfcnQ1Njc3X2RhaXNbXSA9IHsKKwkvKiBGcm9udCBFbmQgREFJIGxpbmtzICovCisJeworCQkubmFtZSA9ICJTeXN0ZW0gUENNIiwKKwkJLnN0cmVhbV9uYW1lID0gIlN5c3RlbSBQbGF5YmFjay9DYXB0dXJlIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJTeXN0ZW0gUGluIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAorCQkuZHluYW1pYyA9IDEsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuaW5pdCA9IGJkd19ydDU2NzdfcnRkX2luaXQsCisJCS50cmlnZ2VyID0geworCQkJU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwKKwkJCVNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QKKwkJfSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwl9LAorCisJLyogQmFjayBFbmQgREFJIGxpbmtzICovCisJeworCQkvKiBTU1AwIC0gQ29kZWMgKi8KKwkJLm5hbWUgPSAiQ29kZWMiLAorCQkuaWQgPSAwLAorCQkuY3B1X2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5ub19wY20gPSAxLAorCQkuY29kZWNfbmFtZSA9ICJpMmMtUlQ1Njc3Q0U6MDAiLAorCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1Njc3LWFpZjEiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCVNORF9TT0NfREFJRk1UX0NCU19DRlMsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gYnJvYWR3ZWxsX3NzcDBfZml4dXAsCisJCS5vcHMgPSAmYmR3X3J0NTY3N19vcHMsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5pbml0ID0gYmR3X3J0NTY3N19pbml0LAorCX0sCit9OworCitzdGF0aWMgaW50IGJkd19ydDU2Nzdfc3VzcGVuZF9wcmUoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgYmR3X3J0NTY3N19wcml2ICpiZHdfcnQ1Njc3ID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbTsKKworCWlmIChiZHdfcnQ1Njc3LT5jb2RlYykgeworCQlkYXBtID0gc25kX3NvY19jb2RlY19nZXRfZGFwbShiZHdfcnQ1Njc3LT5jb2RlYyk7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTUlDQklBUzEiKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmR3X3J0NTY3N19yZXN1bWVfcG9zdChzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCXN0cnVjdCBiZHdfcnQ1Njc3X3ByaXYgKmJkd19ydDU2NzcgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtOworCisJaWYgKGJkd19ydDU2NzctPmNvZGVjKSB7CisJCWRhcG0gPSBzbmRfc29jX2NvZGVjX2dldF9kYXBtKGJkd19ydDU2NzctPmNvZGVjKTsKKwkJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oZGFwbSwgIk1JQ0JJQVMxIik7CisJfQorCXJldHVybiAwOworfQorCisvKiBBU29DIG1hY2hpbmUgZHJpdmVyIGZvciBCcm9hZHdlbGwgRFNQICsgUlQ1Njc3ICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBiZHdfcnQ1Njc3X2NhcmQgPSB7CisJLm5hbWUgPSAiYmR3LXJ0NTY3NyIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmRhaV9saW5rID0gYmR3X3J0NTY3N19kYWlzLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGJkd19ydDU2NzdfZGFpcyksCisJLmRhcG1fd2lkZ2V0cyA9IGJkd19ydDU2Nzdfd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYmR3X3J0NTY3N193aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBiZHdfcnQ1Njc3X21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShiZHdfcnQ1Njc3X21hcCksCisJLmNvbnRyb2xzID0gYmR3X3J0NTY3N19jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShiZHdfcnQ1Njc3X2NvbnRyb2xzKSwKKwkuZnVsbHlfcm91dGVkID0gdHJ1ZSwKKwkuc3VzcGVuZF9wcmUgPSBiZHdfcnQ1Njc3X3N1c3BlbmRfcHJlLAorCS5yZXN1bWVfcG9zdCA9IGJkd19ydDU2NzdfcmVzdW1lX3Bvc3QsCit9OworCitzdGF0aWMgaW50IGJkd19ydDU2NzdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYmR3X3J0NTY3N19wcml2ICpiZHdfcnQ1Njc3OworCisJYmR3X3J0NTY3N19jYXJkLmRldiA9ICZwZGV2LT5kZXY7CisKKwkvKiBBbGxvY2F0ZSBkcml2ZXIgcHJpdmF0ZSBzdHJ1Y3QgKi8KKwliZHdfcnQ1Njc3ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgYmR3X3J0NTY3N19wcml2KSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCFiZHdfcnQ1Njc3KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGFsbG9jYXRlIGJkd19ydDU2NzdcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJmJkd19ydDU2NzdfY2FyZCwgYmR3X3J0NTY3Nyk7CisKKwlyZXR1cm4gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJmJkd19ydDU2NzdfY2FyZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJkd19ydDU2NzdfYXVkaW8gPSB7CisJLnByb2JlID0gYmR3X3J0NTY3N19wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJiZHctcnQ1Njc3IiwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiZHdfcnQ1Njc3X2F1ZGlvKQorCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIkJlbiBaaGFuZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBCcm9hZHdlbGwgUlQ1Njc3IG1hY2hpbmUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJkdy1ydDU2NzciKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnh0X2RhNzIxOV9tYXg5ODM1N2EuYyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnh0X2RhNzIxOV9tYXg5ODM1N2EuYwppbmRleCAzNzc0YjExLi42NTMyYjhmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J4dF9kYTcyMTlfbWF4OTgzNTdhLmMKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieHRfZGE3MjE5X21heDk4MzU3YS5jCkBAIC0zNyw2ICszNyw3IEBACiAJQlhUX0RQQ01fQVVESU9fUEIgPSAwLAogCUJYVF9EUENNX0FVRElPX0NQLAogCUJYVF9EUENNX0FVRElPX1JFRl9DUCwKKwlCWFRfRFBDTV9BVURJT19ETUlDX0NQLAogCUJYVF9EUENNX0FVRElPX0hETUkxX1BCLAogCUJYVF9EUENNX0FVRElPX0hETUkyX1BCLAogCUJYVF9EUENNX0FVRElPX0hETUkzX1BCLApAQCAtMjUyLDEwICsyNTMsNTYgQEAKIAkuaHdfZnJlZSA9IGJyb3h0b25fZGE3MjE5X2h3X2ZyZWUsCiB9OwogCitzdGF0aWMgaW50IGJyb3h0b25fZG1pY19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gRFVBTF9DSEFOTkVMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnJveHRvbl9kbWljX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKworCXJ1bnRpbWUtPmh3LmNoYW5uZWxzX21heCA9IERVQUxfQ0hBTk5FTDsKKwlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsCisJCQkmY29uc3RyYWludHNfY2hhbm5lbHMpOworCisJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLCAmY29uc3RyYWludHNfcmF0ZXMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2Nfb3BzIGJyb3h0b25fZG1pY19vcHMgPSB7CisJLnN0YXJ0dXAgPSBicm94dG9uX2RtaWNfc3RhcnR1cCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcmF0ZXNfMTYwMDBbXSA9IHsKKwkxNjAwMCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTYwMDAgPSB7CisJLmNvdW50ID0gQVJSQVlfU0laRShyYXRlc18xNjAwMCksCisJLmxpc3QgID0gcmF0ZXNfMTYwMDAsCit9OworCitzdGF0aWMgaW50IGJyb3h0b25fcmVmY2FwX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJJmNvbnN0cmFpbnRzXzE2MDAwKTsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgYnJveHRvbl9yZWZjYXBfb3BzID0geworCS5zdGFydHVwID0gYnJveHRvbl9yZWZjYXBfc3RhcnR1cCwKK307CisKIC8qIGJyb3h0b24gZGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgYnJveHRvbl9kYWlzW10gPSB7CiAJLyogRnJvbnQgRW5kIERBSSBsaW5rcyAqLwotCVtCWFRfRFBDTV9BVURJT19QQl0KKwlbQlhUX0RQQ01fQVVESU9fUEJdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBBdWRpbyBQb3J0IiwKIAkJLnN0cmVhbV9uYW1lID0gIkF1ZGlvIiwKQEAgLTI3MSw3ICszMTgsNyBAQAogCQkuZHBjbV9wbGF5YmFjayA9IDEsCiAJCS5vcHMgPSAmYnJveHRvbl9kYTcyMTlfZmVfb3BzLAogCX0sCi0JW0JYVF9EUENNX0FVRElPX0NQXQorCVtCWFRfRFBDTV9BVURJT19DUF0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEF1ZGlvIENhcHR1cmUgUG9ydCIsCiAJCS5zdHJlYW1fbmFtZSA9ICJBdWRpbyBSZWNvcmQiLApAQCAtMjg2LDcgKzMzMyw3IEBACiAJCS5kcGNtX2NhcHR1cmUgPSAxLAogCQkub3BzID0gJmJyb3h0b25fZGE3MjE5X2ZlX29wcywKIAl9LAotCVtCWFRfRFBDTV9BVURJT19SRUZfQ1BdCisJW0JYVF9EUENNX0FVRElPX1JFRl9DUF0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEF1ZGlvIFJlZmVyZW5jZSBjYXAiLAogCQkuc3RyZWFtX25hbWUgPSAiUmVmY2FwIiwKQEAgLTI5OSw4ICszNDYsMjMgQEAKIAkJLmlnbm9yZV9zdXNwZW5kID0gMSwKIAkJLm5vbmF0b21pYyA9IDEsCiAJCS5keW5hbWljID0gMSwKKwkJLm9wcyA9ICZicm94dG9uX3JlZmNhcF9vcHMsCiAJfSwKLQlbQlhUX0RQQ01fQVVESU9fSERNSTFfUEJdCisJW0JYVF9EUENNX0FVRElPX0RNSUNfQ1BdCisJeworCQkubmFtZSA9ICJCeHQgQXVkaW8gRE1JQyBjYXAiLAorCQkuc3RyZWFtX25hbWUgPSAiZG1pY2NhcCIsCisJCS5jcHVfZGFpX25hbWUgPSAiRE1JQyBQaW4iLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAiMDAwMDowMDowZS4wIiwKKwkJLmluaXQgPSBOVUxMLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLm5vbmF0b21pYyA9IDEsCisJCS5keW5hbWljID0gMSwKKwkJLm9wcyA9ICZicm94dG9uX2RtaWNfb3BzLAorCX0sCisJW0JYVF9EUENNX0FVRElPX0hETUkxX1BCXSA9CiAJewogCQkubmFtZSA9ICJCeHQgSERNSSBQb3J0MSIsCiAJCS5zdHJlYW1fbmFtZSA9ICJIZG1pMSIsCkBAIC0zMTMsNyArMzc1LDcgQEAKIAkJLm5vbmF0b21pYyA9IDEsCiAJCS5keW5hbWljID0gMSwKIAl9LAotCVtCWFRfRFBDTV9BVURJT19IRE1JMl9QQl0KKwlbQlhUX0RQQ01fQVVESU9fSERNSTJfUEJdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBIRE1JIFBvcnQyIiwKIAkJLnN0cmVhbV9uYW1lID0gIkhkbWkyIiwKQEAgLTMyNiw3ICszODgsNyBAQAogCQkubm9uYXRvbWljID0gMSwKIAkJLmR5bmFtaWMgPSAxLAogCX0sCi0JW0JYVF9EUENNX0FVRElPX0hETUkzX1BCXQorCVtCWFRfRFBDTV9BVURJT19IRE1JM19QQl0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEhETUkgUG9ydDMiLAogCQkuc3RyZWFtX25hbWUgPSAiSGRtaTMiLApAQCAtMzgyLDYgKzQ0NCw3IEBACiAJCS5jb2RlY19kYWlfbmFtZSA9ICJkbWljLWhpZmkiLAogCQkucGxhdGZvcm1fbmFtZSA9ICIwMDAwOjAwOjBlLjAiLAogCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gYnJveHRvbl9kbWljX2ZpeHVwLAogCQkuZHBjbV9jYXB0dXJlID0gMSwKIAkJLm5vX3BjbSA9IDEsCiAJfSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnh0X3J0Mjk4LmMgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J4dF9ydDI5OC5jCmluZGV4IDI1M2Q3YmYuLmQ2MTBiZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnh0X3J0Mjk4LmMKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieHRfcnQyOTguYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAvKiBicm94dG9uIGRpZ2l0YWwgYXVkaW8gaW50ZXJmYWNlIGdsdWUgLSBjb25uZWN0cyBjb2RlYyA8LS0+IENQVSAqLwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGJyb3h0b25fcnQyOThfZGFpc1tdID0gewogCS8qIEZyb250IEVuZCBEQUkgbGlua3MgKi8KLQlbQlhUX0RQQ01fQVVESU9fUEJdCisJW0JYVF9EUENNX0FVRElPX1BCXSA9CiAJewogCQkubmFtZSA9ICJCeHQgQXVkaW8gUG9ydCIsCiAJCS5zdHJlYW1fbmFtZSA9ICJBdWRpbyIsCkBAIC0yODYsNyArMjg2LDcgQEAKIAkJLmRwY21fcGxheWJhY2sgPSAxLAogCQkub3BzID0gJmJyb3h0b25fcnQyODZfZmVfb3BzLAogCX0sCi0JW0JYVF9EUENNX0FVRElPX0NQXQorCVtCWFRfRFBDTV9BVURJT19DUF0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEF1ZGlvIENhcHR1cmUgUG9ydCIsCiAJCS5zdHJlYW1fbmFtZSA9ICJBdWRpbyBSZWNvcmQiLApAQCAtMzAwLDcgKzMwMCw3IEBACiAJCS5kcGNtX2NhcHR1cmUgPSAxLAogCQkub3BzID0gJmJyb3h0b25fcnQyODZfZmVfb3BzLAogCX0sCi0JW0JYVF9EUENNX0FVRElPX1JFRl9DUF0KKwlbQlhUX0RQQ01fQVVESU9fUkVGX0NQXSA9CiAJewogCQkubmFtZSA9ICJCeHQgQXVkaW8gUmVmZXJlbmNlIGNhcCIsCiAJCS5zdHJlYW1fbmFtZSA9ICJyZWZjYXAiLApAQCAtMzEzLDcgKzMxMyw3IEBACiAJCS5ub25hdG9taWMgPSAxLAogCQkuZHluYW1pYyA9IDEsCiAJfSwKLQlbQlhUX0RQQ01fQVVESU9fRE1JQ19DUF0KKwlbQlhUX0RQQ01fQVVESU9fRE1JQ19DUF0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEF1ZGlvIERNSUMgY2FwIiwKIAkJLnN0cmVhbV9uYW1lID0gImRtaWNjYXAiLApAQCAtMzI3LDcgKzMyNyw3IEBACiAJCS5keW5hbWljID0gMSwKIAkJLm9wcyA9ICZicm94dG9uX2RtaWNfb3BzLAogCX0sCi0JW0JYVF9EUENNX0FVRElPX0hETUkxX1BCXQorCVtCWFRfRFBDTV9BVURJT19IRE1JMV9QQl0gPQogCXsKIAkJLm5hbWUgPSAiQnh0IEhETUkgUG9ydDEiLAogCQkuc3RyZWFtX25hbWUgPSAiSGRtaTEiLApAQCAtMzQwLDcgKzM0MCw3IEBACiAJCS5ub25hdG9taWMgPSAxLAogCQkuZHluYW1pYyA9IDEsCiAJfSwKLQlbQlhUX0RQQ01fQVVESU9fSERNSTJfUEJdCisJW0JYVF9EUENNX0FVRElPX0hETUkyX1BCXSA9CiAJewogCQkubmFtZSA9ICJCeHQgSERNSSBQb3J0MiIsCiAJCS5zdHJlYW1fbmFtZSA9ICJIZG1pMiIsCkBAIC0zNTMsNyArMzUzLDcgQEAKIAkJLm5vbmF0b21pYyA9IDEsCiAJCS5keW5hbWljID0gMSwKIAl9LAotCVtCWFRfRFBDTV9BVURJT19IRE1JM19QQl0KKwlbQlhUX0RQQ01fQVVESU9fSERNSTNfUEJdID0KIAl7CiAJCS5uYW1lID0gIkJ4dCBIRE1JIFBvcnQzIiwKIAkJLnN0cmVhbV9uYW1lID0gIkhkbWkzIiwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnl0Y3JfcnQ1NjQwLmMgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J5dGNyX3J0NTY0MC5jCmluZGV4IDg4ZWZiNjIuLmJmZjc3YTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnl0Y3JfcnQ1NjQwLmMKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieXRjcl9ydDU2NDAuYwpAQCAtMjQsNiArMjQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vY3B1X2RldmljZV9pZC5oPgorI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybV9zc3RfYXVkaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvc29jLmg+CkBAIC0zMSw0MiArMzQsMTUzIEBACiAjaW5jbHVkZSAiLi4vLi4vY29kZWNzL3J0NTY0MC5oIgogI2luY2x1ZGUgIi4uL2F0b20vc3N0LWF0b20tY29udHJvbHMuaCIKICNpbmNsdWRlICIuLi9jb21tb24vc3N0LWFjcGkuaCIKKyNpbmNsdWRlICIuLi9jb21tb24vc3N0LWRzcC5oIgogCiBlbnVtIHsKIAlCWVRfUlQ1NjQwX0RNSUMxX01BUCwKIAlCWVRfUlQ1NjQwX0RNSUMyX01BUCwKIAlCWVRfUlQ1NjQwX0lOMV9NQVAsCisJQllUX1JUNTY0MF9JTjNfTUFQLAogfTsKIAogI2RlZmluZSBCWVRfUlQ1NjQwX01BUChxdWlyaykJKChxdWlyaykgJiAweGZmKQogI2RlZmluZSBCWVRfUlQ1NjQwX0RNSUNfRU4JQklUKDE2KQorI2RlZmluZSBCWVRfUlQ1NjQwX01PTk9fU1BFQUtFUiBCSVQoMTcpCisjZGVmaW5lIEJZVF9SVDU2NDBfRElGRl9NSUMgICAgIEJJVCgxOCkgLyogZGVmYXV0IGlzIHNpbmdsZS1lbmRlZCAqLworI2RlZmluZSBCWVRfUlQ1NjQwX1NTUDJfQUlGMiAgICAgQklUKDE5KSAvKiBkZWZhdWx0IGlzIHVzaW5nIEFJRjEgICovCisjZGVmaW5lIEJZVF9SVDU2NDBfU1NQMF9BSUYxICAgICBCSVQoMjApCisjZGVmaW5lIEJZVF9SVDU2NDBfU1NQMF9BSUYyICAgICBCSVQoMjEpCisjZGVmaW5lIEJZVF9SVDU2NDBfTUNMS19FTglCSVQoMjIpCisjZGVmaW5lIEJZVF9SVDU2NDBfTUNMS18yNU1IWglCSVQoMjMpCisKK3N0cnVjdCBieXRfcnQ1NjQwX3ByaXZhdGUgeworCXN0cnVjdCBjbGsgKm1jbGs7Cit9OwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBieXRfcnQ1NjQwX3F1aXJrID0gQllUX1JUNTY0MF9ETUlDMV9NQVAgfAotCQkJCQlCWVRfUlQ1NjQwX0RNSUNfRU47CisJCQkJCUJZVF9SVDU2NDBfRE1JQ19FTiB8CisJCQkJCUJZVF9SVDU2NDBfTUNMS19FTjsKKworc3RhdGljIHZvaWQgbG9nX3F1aXJrcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaWYgKEJZVF9SVDU2NDBfTUFQKGJ5dF9ydDU2NDBfcXVpcmspID09IEJZVF9SVDU2NDBfRE1JQzFfTUFQKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBETUlDMV9NQVAgZW5hYmxlZCIpOworCWlmIChCWVRfUlQ1NjQwX01BUChieXRfcnQ1NjQwX3F1aXJrKSA9PSBCWVRfUlQ1NjQwX0RNSUMyX01BUCkKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgRE1JQzJfTUFQIGVuYWJsZWQiKTsKKwlpZiAoQllUX1JUNTY0MF9NQVAoYnl0X3J0NTY0MF9xdWlyaykgPT0gQllUX1JUNTY0MF9JTjFfTUFQKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBJTjFfTUFQIGVuYWJsZWQiKTsKKwlpZiAoQllUX1JUNTY0MF9NQVAoYnl0X3J0NTY0MF9xdWlyaykgPT0gQllUX1JUNTY0MF9JTjNfTUFQKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBJTjNfTUFQIGVuYWJsZWQiKTsKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfRE1JQ19FTikKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgRE1JQyBlbmFibGVkIik7CisJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX01PTk9fU1BFQUtFUikKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgTU9OT19TUEVBS0VSIGVuYWJsZWQiKTsKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfRElGRl9NSUMpCisJCWRldl9pbmZvKGRldiwgInF1aXJrIERJRkZfTUlDIGVuYWJsZWQiKTsKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMl9BSUYyKQorCQlkZXZfaW5mbyhkZXYsICJxdWlyayBTU1AyX0FJRjIgZW5hYmxlZCIpOworCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AwX0FJRjEpCisJCWRldl9pbmZvKGRldiwgInF1aXJrIFNTUDBfQUlGMSBlbmFibGVkIik7CisJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDBfQUlGMikKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgU1NQMF9BSUYyIGVuYWJsZWQiKTsKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfTUNMS19FTikKKwkJZGV2X2luZm8oZGV2LCAicXVpcmsgTUNMS19FTiBlbmFibGVkIik7CisJaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX01DTEtfMjVNSFopCisJCWRldl9pbmZvKGRldiwgInF1aXJrIE1DTEtfMjVNSFogZW5hYmxlZCIpOworfQorCisKKyNkZWZpbmUgQllUX0NPREVDX0RBSTEJInJ0NTY0MC1haWYxIgorI2RlZmluZSBCWVRfQ09ERUNfREFJMgkicnQ1NjQwLWFpZjIiCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNuZF9zb2NfZGFpICpieXRfZ2V0X2NvZGVjX2RhaShzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJ0ZCwgJmNhcmQtPnJ0ZF9saXN0LCBsaXN0KSB7CisJCWlmICghc3RybmNtcChydGQtPmNvZGVjX2RhaS0+bmFtZSwgQllUX0NPREVDX0RBSTEsCisJCQkgICAgIHN0cmxlbihCWVRfQ09ERUNfREFJMSkpKQorCQkJcmV0dXJuIHJ0ZC0+Y29kZWNfZGFpOworCQlpZiAoIXN0cm5jbXAocnRkLT5jb2RlY19kYWktPm5hbWUsIEJZVF9DT0RFQ19EQUkyLAorCQkJCXN0cmxlbihCWVRfQ09ERUNfREFJMikpKQorCQkJcmV0dXJuIHJ0ZC0+Y29kZWNfZGFpOworCisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHBsYXRmb3JtX2Nsb2NrX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkJICBzdHJ1Y3Qgc25kX2tjb250cm9sICprLCBpbnQgIGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHctPmRhcG07CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGRhcG0tPmNhcmQ7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWk7CisJc3RydWN0IGJ5dF9ydDU2NDBfcHJpdmF0ZSAqcHJpdiA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlpbnQgcmV0OworCisJY29kZWNfZGFpID0gYnl0X2dldF9jb2RlY19kYWkoY2FyZCk7CisJaWYgKCFjb2RlY19kYWkpIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsCisJCQkiQ29kZWMgZGFpIG5vdCBmb3VuZDsgVW5hYmxlIHRvIHNldCBwbGF0Zm9ybSBjbG9ja1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7CisJCWlmICgoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfTUNMS19FTikgJiYgcHJpdi0+bWNsaykgeworCQkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHByaXYtPm1jbGspOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKGNhcmQtPmRldiwKKwkJCQkJImNvdWxkIG5vdCBjb25maWd1cmUgTUNMSyBzdGF0ZSIpOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY0MF9TQ0xLX1NfUExMMSwKKwkJCQkJICAgICA0ODAwMCAqIDUxMiwKKwkJCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTZXQgY29kZWMgY2xvY2sgc291cmNlIHRvIGludGVybmFsIGNsb2NrIGJlZm9yZQorCQkgKiB0dXJuaW5nIG9mZiB0aGUgcGxhdGZvcm0gY2xvY2suIENvZGVjIG5lZWRzIGNsb2NrCisJCSAqIGZvciBKYWNrIGRldGVjdGlvbiBhbmQgYnV0dG9uIHByZXNzCisJCSAqLworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgUlQ1NjQwX1NDTEtfU19SQ0NMSywKKwkJCQkJICAgICAwLAorCQkJCQkgICAgIFNORF9TT0NfQ0xPQ0tfSU4pOworCQlpZiAoIXJldCkgeworCQkJaWYgKChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NQ0xLX0VOKSAmJiBwcml2LT5tY2xrKQorCQkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5tY2xrKTsKKwkJfQorCX0KKworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHN5c2NsazogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBieXRfcnQ1NjQwX3dpZGdldHNbXSA9IHsKIAlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSIsIE5VTEwpLAogCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCiAJU05EX1NPQ19EQVBNX01JQygiSW50ZXJuYWwgTWljIiwgTlVMTCksCiAJU05EX1NPQ19EQVBNX1NQSygiU3BlYWtlciIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlBsYXRmb3JtIENsb2NrIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJICAgIHBsYXRmb3JtX2Nsb2NrX2NvbnRyb2wsIFNORF9TT0NfREFQTV9QUkVfUE1VIHwKKwkJCSAgICBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfcnQ1NjQwX2F1ZGlvX21hcFtdID0gewotCXsiQUlGMSBQbGF5YmFjayIsIE5VTEwsICJzc3AyIFR4In0sCi0JeyJzc3AyIFR4IiwgTlVMTCwgImNvZGVjX291dDAifSwKLQl7InNzcDIgVHgiLCBOVUxMLCAiY29kZWNfb3V0MSJ9LAotCXsiY29kZWNfaW4wIiwgTlVMTCwgInNzcDIgUngifSwKLQl7ImNvZGVjX2luMSIsIE5VTEwsICJzc3AyIFJ4In0sCi0JeyJzc3AyIFJ4IiwgTlVMTCwgIkFJRjEgQ2FwdHVyZSJ9LAorCXsiSGVhZHBob25lIiwgTlVMTCwgIlBsYXRmb3JtIENsb2NrIn0sCisJeyJIZWFkc2V0IE1pYyIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAorCXsiSW50ZXJuYWwgTWljIiwgTlVMTCwgIlBsYXRmb3JtIENsb2NrIn0sCisJeyJTcGVha2VyIiwgTlVMTCwgIlBsYXRmb3JtIENsb2NrIn0sCiAKIAl7IkhlYWRzZXQgTWljIiwgTlVMTCwgIk1JQ0JJQVMxIn0sCiAJeyJJTjJQIiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCiAJeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBPTCJ9LAogCXsiSGVhZHBob25lIiwgTlVMTCwgIkhQT1IifSwKLQl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPTFAifSwKLQl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPTE4ifSwKLQl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPUlAifSwKLQl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPUk4ifSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfaW50bWljX2RtaWMxX21hcFtdID0gewpAQCAtODIsNiArMTk2LDU5IEBACiAJeyJJTjFQIiwgTlVMTCwgIkludGVybmFsIE1pYyJ9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X3J0NTY0MF9pbnRtaWNfaW4zX21hcFtdID0geworCXsiSW50ZXJuYWwgTWljIiwgTlVMTCwgIk1JQ0JJQVMxIn0sCisJeyJJTjNQIiwgTlVMTCwgIkludGVybmFsIE1pYyJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X3J0NTY0MF9zc3AyX2FpZjFfbWFwW10gPSB7CisJeyJzc3AyIFR4IiwgTlVMTCwgImNvZGVjX291dDAifSwKKwl7InNzcDIgVHgiLCBOVUxMLCAiY29kZWNfb3V0MSJ9LAorCXsiY29kZWNfaW4wIiwgTlVMTCwgInNzcDIgUngifSwKKwl7ImNvZGVjX2luMSIsIE5VTEwsICJzc3AyIFJ4In0sCisKKwl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAic3NwMiBUeCJ9LAorCXsic3NwMiBSeCIsIE5VTEwsICJBSUYxIENhcHR1cmUifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfc3NwMl9haWYyX21hcFtdID0geworCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQwIn0sCisJeyJzc3AyIFR4IiwgTlVMTCwgImNvZGVjX291dDEifSwKKwl7ImNvZGVjX2luMCIsIE5VTEwsICJzc3AyIFJ4In0sCisJeyJjb2RlY19pbjEiLCBOVUxMLCAic3NwMiBSeCJ9LAorCisJeyJBSUYyIFBsYXliYWNrIiwgTlVMTCwgInNzcDIgVHgifSwKKwl7InNzcDIgUngiLCBOVUxMLCAiQUlGMiBDYXB0dXJlIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfcnQ1NjQwX3NzcDBfYWlmMV9tYXBbXSA9IHsKKwl7InNzcDAgVHgiLCBOVUxMLCAibW9kZW1fb3V0In0sCisJeyJtb2RlbV9pbiIsIE5VTEwsICJzc3AwIFJ4In0sCisKKwl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAic3NwMCBUeCJ9LAorCXsic3NwMCBSeCIsIE5VTEwsICJBSUYxIENhcHR1cmUifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfc3NwMF9haWYyX21hcFtdID0geworCXsic3NwMCBUeCIsIE5VTEwsICJtb2RlbV9vdXQifSwKKwl7Im1vZGVtX2luIiwgTlVMTCwgInNzcDAgUngifSwKKworCXsiQUlGMiBQbGF5YmFjayIsIE5VTEwsICJzc3AwIFR4In0sCisJeyJzc3AwIFJ4IiwgTlVMTCwgIkFJRjIgQ2FwdHVyZSJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X3J0NTY0MF9zdGVyZW9fc3BrX21hcFtdID0geworCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MUCJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MTiJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9SUCJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9STiJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X3J0NTY0MF9tb25vX3Nwa19tYXBbXSA9IHsKKwl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPTFAifSwKKwl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPTE4ifSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBieXRfcnQ1NjQwX2NvbnRyb2xzW10gPSB7CiAJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHBob25lIiksCiAJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHNldCBNaWMiKSwKQEAgLTk2LDE5ICsyNjMsNDYgQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwogCWludCByZXQ7CiAKLQlzbmRfc29jX2RhaV9zZXRfYmNsa19yYXRpbyhjb2RlY19kYWksIDUwKTsKLQogCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NDBfU0NMS19TX1BMTDEsCiAJCQkJICAgICBwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyLAogCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CisKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIGNsb2NrICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCAwLCBSVDU2NDBfUExMMV9TX0JDTEsxLAotCQkJCSAgcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUwLAotCQkJCSAgcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUxMik7CisJaWYgKCEoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfTUNMS19FTikpIHsKKwkJLyogdXNlIGJpdGNsb2NrIGFzIFBMTCBpbnB1dCAqLworCQlpZiAoKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDBfQUlGMSkgfHwKKwkJCShieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AwX0FJRjIpKSB7CisKKwkJCS8qIDJ4MTYgYml0IHNsb3RzIG9uIFNTUDAgKi8KKwkJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCAwLAorCQkJCQkJUlQ1NjQwX1BMTDFfU19CQ0xLMSwKKwkJCQkJCXBhcmFtc19yYXRlKHBhcmFtcykgKiAzMiwKKwkJCQkJCXBhcmFtc19yYXRlKHBhcmFtcykgKiA1MTIpOworCQl9IGVsc2UgeworCQkJLyogMngxNSBiaXQgc2xvdHMgb24gU1NQMiAqLworCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsCisJCQkJCQlSVDU2NDBfUExMMV9TX0JDTEsxLAorCQkJCQkJcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUwLAorCQkJCQkJcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUxMik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfTUNMS18yNU1IWikgeworCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsCisJCQkJCQlSVDU2NDBfUExMMV9TX01DTEssCisJCQkJCQkyNTAwMDAwMCwKKwkJCQkJCXBhcmFtc19yYXRlKHBhcmFtcykgKiA1MTIpOworCQl9IGVsc2UgeworCQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsCisJCQkJCQlSVDU2NDBfUExMMV9TX01DTEssCisJCQkJCQkxOTIwMDAwMCwKKwkJCQkJCXBhcmFtc19yYXRlKHBhcmFtcykgKiA1MTIpOworCQl9CisJfQorCiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBwbGw6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTI3LDI3ICszMjEsNzMgQEAKIAl7CiAJCS5jYWxsYmFjayA9IGJ5dF9ydDU2NDBfcXVpcmtfY2IsCiAJCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQVNVU1RlSyBDT01QVVRFUiBJTkMuIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlQxMDBUQSIpLAorCQkJRE1JX0VYQUNUX01BVENIKERNSV9TWVNfVkVORE9SLCAiQVNVU1RlSyBDT01QVVRFUiBJTkMuIiksCisJCQlETUlfRVhBQ1RfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlQxMDBUQSIpLAogCQl9LAotCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKUJZVF9SVDU2NDBfSU4xX01BUCwKKwkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcgKikoQllUX1JUNTY0MF9JTjFfTUFQIHwKKwkJCQkJCSBCWVRfUlQ1NjQwX01DTEtfRU4pLAogCX0sCiAJewogCQkuY2FsbGJhY2sgPSBieXRfcnQ1NjQwX3F1aXJrX2NiLAogCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGxJbmMuIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZlbnVlIDggUHJvIDU4MzAiKSwKKwkJCURNSV9FWEFDVF9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkFTVVNUZUsgQ09NUFVURVIgSU5DLiIpLAorCQkJRE1JX0VYQUNUX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJUMTAwVEFGIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopKEJZVF9SVDU2NDBfSU4xX01BUCB8CisJCQkJCQkgQllUX1JUNTY0MF9NT05PX1NQRUFLRVIgfAorCQkJCQkJIEJZVF9SVDU2NDBfRElGRl9NSUMgfAorCQkJCQkJIEJZVF9SVDU2NDBfU1NQMF9BSUYyIHwKKwkJCQkJCSBCWVRfUlQ1NjQwX01DTEtfRU4KKwkJCQkJCSApLAorCX0sCisJeworCQkuY2FsbGJhY2sgPSBieXRfcnQ1NjQwX3F1aXJrX2NiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9FWEFDVF9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGxJbmMuIiksCisJCQlETUlfRVhBQ1RfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZlbnVlIDggUHJvIDU4MzAiKSwKIAkJfSwKIAkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcgKikoQllUX1JUNTY0MF9ETUlDMl9NQVAgfAorCQkJCQkJIEJZVF9SVDU2NDBfRE1JQ19FTiB8CisJCQkJCQkgQllUX1JUNTY0MF9NQ0xLX0VOKSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gYnl0X3J0NTY0MF9xdWlya19jYiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfRVhBQ1RfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKKwkJCURNSV9FWEFDVF9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSFAgRWxpdGVQYWQgMTAwMCBHMiIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKShCWVRfUlQ1NjQwX0lOMV9NQVAgfAorCQkJCQkJIEJZVF9SVDU2NDBfTUNMS19FTiksCisJfSwKKwl7CisJCS5jYWxsYmFjayA9IGJ5dF9ydDU2NDBfcXVpcmtfY2IsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQ2lyY3VpdGNvIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk1pbm5vd2JvYXJkIE1heCBCMyBQTEFURk9STSIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKShCWVRfUlQ1NjQwX0RNSUMxX01BUCB8CiAJCQkJCQkgQllUX1JUNTY0MF9ETUlDX0VOKSwKIAl9LAogCXsKIAkJLmNhbGxiYWNrID0gYnl0X3J0NTY0MF9xdWlya19jYiwKIAkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJIZXdsZXR0LVBhY2thcmQiKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiSFAgRWxpdGVQYWQgMTAwMCBHMiIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJURUNMQVNUIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJ0UEFEIiksCiAJCX0sCi0JCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopQllUX1JUNTY0MF9JTjFfTUFQLAorCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKShCWVRfUlQ1NjQwX0lOM19NQVAgfAorCQkJCQkJQllUX1JUNTY0MF9NQ0xLX0VOIHwKKwkJCQkJCUJZVF9SVDU2NDBfU1NQMF9BSUYxKSwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gYnl0X3J0NTY0MF9xdWlya19jYiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJBY2VyIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkFzcGlyZSBTVzUtMDEyIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopKEJZVF9SVDU2NDBfSU4xX01BUCB8CisJCQkJCQkgQllUX1JUNTY0MF9NQ0xLX0VOIHwKKwkJCQkJCSBCWVRfUlQ1NjQwX1NTUDBfQUlGMSksCisKIAl9LAogCXt9CiB9OwpAQCAtMTU4LDEzICszOTgsMTggQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydW50aW1lLT5jb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnVudGltZS0+Y2FyZDsKIAljb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlICpjdXN0b21fbWFwOworCXN0cnVjdCBieXRfcnQ1NjQwX3ByaXZhdGUgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CiAJaW50IG51bV9yb3V0ZXM7CiAKIAljYXJkLT5kYXBtLmlkbGVfYmlhc19vZmYgPSB0cnVlOwogCiAJcnQ1NjQwX3NlbF9hc3JjX2Nsa19zcmMoY29kZWMsCiAJCQkJUlQ1NjQwX0RBX1NURVJFT19GSUxURVIgfAotCQkJCVJUNTY0MF9BRF9TVEVSRU9fRklMVEVSLAorCQkJCVJUNTY0MF9EQV9NT05PX0xfRklMVEVSCXwKKwkJCQlSVDU2NDBfREFfTU9OT19SX0ZJTFRFUgl8CisJCQkJUlQ1NjQwX0FEX1NURVJFT19GSUxURVIJfAorCQkJCVJUNTY0MF9BRF9NT05PX0xfRklMVEVSCXwKKwkJCQlSVDU2NDBfQURfTU9OT19SX0ZJTFRFUiwKIAkJCQlSVDU2NDBfQ0xLX1NFTF9BU1JDKTsKIAogCXJldCA9IHNuZF9zb2NfYWRkX2NhcmRfY29udHJvbHMoY2FyZCwgYnl0X3J0NTY0MF9jb250cm9scywKQEAgLTE3OSw2ICs0MjQsMTAgQEAKIAkJY3VzdG9tX21hcCA9IGJ5dF9ydDU2NDBfaW50bWljX2luMV9tYXA7CiAJCW51bV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfaW50bWljX2luMV9tYXApOwogCQlicmVhazsKKwljYXNlIEJZVF9SVDU2NDBfSU4zX01BUDoKKwkJY3VzdG9tX21hcCA9IGJ5dF9ydDU2NDBfaW50bWljX2luM19tYXA7CisJCW51bV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfaW50bWljX2luM19tYXApOworCQlicmVhazsKIAljYXNlIEJZVF9SVDU2NDBfRE1JQzJfTUFQOgogCQljdXN0b21fbWFwID0gYnl0X3J0NTY0MF9pbnRtaWNfZG1pYzJfbWFwOwogCQludW1fcm91dGVzID0gQVJSQVlfU0laRShieXRfcnQ1NjQwX2ludG1pY19kbWljMl9tYXApOwpAQCAtMTkyLDYgKzQ0MSw0MyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfU1NQMl9BSUYyKSB7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKCZjYXJkLT5kYXBtLAorCQkJCQlieXRfcnQ1NjQwX3NzcDJfYWlmMl9tYXAsCisJCQkJCUFSUkFZX1NJWkUoYnl0X3J0NTY0MF9zc3AyX2FpZjJfbWFwKSk7CisJfSBlbHNlIGlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AwX0FJRjEpIHsKKwkJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNhcmQtPmRhcG0sCisJCQkJCWJ5dF9ydDU2NDBfc3NwMF9haWYxX21hcCwKKwkJCQkJQVJSQVlfU0laRShieXRfcnQ1NjQwX3NzcDBfYWlmMV9tYXApKTsKKwl9IGVsc2UgaWYgKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDBfQUlGMikgeworCQlyZXQgPSBzbmRfc29jX2RhcG1fYWRkX3JvdXRlcygmY2FyZC0+ZGFwbSwKKwkJCQkJYnl0X3J0NTY0MF9zc3AwX2FpZjJfbWFwLAorCQkJCQlBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfc3NwMF9haWYyX21hcCkpOworCX0gZWxzZSB7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKCZjYXJkLT5kYXBtLAorCQkJCQlieXRfcnQ1NjQwX3NzcDJfYWlmMV9tYXAsCisJCQkJCUFSUkFZX1NJWkUoYnl0X3J0NTY0MF9zc3AyX2FpZjFfbWFwKSk7CisJfQorCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfTU9OT19TUEVBS0VSKSB7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKCZjYXJkLT5kYXBtLAorCQkJCQlieXRfcnQ1NjQwX21vbm9fc3BrX21hcCwKKwkJCQkJQVJSQVlfU0laRShieXRfcnQ1NjQwX21vbm9fc3BrX21hcCkpOworCX0gZWxzZSB7CisJCXJldCA9IHNuZF9zb2NfZGFwbV9hZGRfcm91dGVzKCZjYXJkLT5kYXBtLAorCQkJCQlieXRfcnQ1NjQwX3N0ZXJlb19zcGtfbWFwLAorCQkJCQlBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfc3RlcmVvX3Nwa19tYXApKTsKKwl9CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9ESUZGX01JQykgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCAgUlQ1NjQwX0lOMV9JTjIsIFJUNTY0MF9JTl9ERjEsCisJCQkJICAgIFJUNTY0MF9JTl9ERjEpOworCX0KKwogCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9ETUlDX0VOKSB7CiAJCXJldCA9IHJ0NTY0MF9kbWljX2VuYWJsZShjb2RlYywgMCwgMCk7CiAJCWlmIChyZXQpCkBAIC0yMDEsNiArNDg3LDMwIEBACiAJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiSGVhZHBob25lIik7CiAJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiU3BlYWtlciIpOwogCisJaWYgKChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NQ0xLX0VOKSAmJiBwcml2LT5tY2xrKSB7CisJCS8qCisJCSAqIFRoZSBmaXJtd2FyZSBtaWdodCBlbmFibGUgdGhlIGNsb2NrIGF0CisJCSAqIGJvb3QgKHRoaXMgaW5mb3JtYXRpb24gbWF5IG9yIG1heSBub3QKKwkJICogYmUgcmVmbGVjdGVkIGluIHRoZSBlbmFibGUgY2xvY2sgcmVnaXN0ZXIpLgorCQkgKiBUbyBjaGFuZ2UgdGhlIHJhdGUgd2UgbXVzdCBkaXNhYmxlIHRoZSBjbG9jaworCQkgKiBmaXJzdCB0byBjb3ZlciB0aGVzZSBjYXNlcy4gRHVlIHRvIGNvbW1vbgorCQkgKiBjbG9jayBmcmFtZXdvcmsgcmVzdHJpY3Rpb25zIHRoYXQgZG8gbm90IGFsbG93CisJCSAqIHRvIGRpc2FibGUgYSBjbG9jayB0aGF0IGhhcyBub3QgYmVlbiBlbmFibGVkLAorCQkgKiB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgY2xvY2sgZmlyc3QuCisJCSAqLworCQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+bWNsayk7CisJCWlmICghcmV0KQorCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPm1jbGspOworCisJCWlmIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9NQ0xLXzI1TUhaKQorCQkJcmV0ID0gY2xrX3NldF9yYXRlKHByaXYtPm1jbGssIDI1MDAwMDAwKTsKKwkJZWxzZQorCQkJcmV0ID0gY2xrX3NldF9yYXRlKHByaXYtPm1jbGssIDE5MjAwMDAwKTsKKworCQlpZiAocmV0KQorCQkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gc2V0IE1DTEsgcmF0ZVxuIik7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjIxLDM0ICs1MzEsNjMgQEAKIAkJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CiAJaW50IHJldDsKIAotCS8qIFRoZSBEU1Agd2lsbCBjb3ZlcnQgdGhlIEZFIHJhdGUgdG8gNDhrLCBzdGVyZW8sIDI0Yml0cyAqLworCS8qIFRoZSBEU1Agd2lsbCBjb3ZlcnQgdGhlIEZFIHJhdGUgdG8gNDhrLCBzdGVyZW8gKi8KIAlyYXRlLT5taW4gPSByYXRlLT5tYXggPSA0ODAwMDsKIAljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDI7CiAKLQkvKiBzZXQgU1NQMiB0byAyNC1iaXQgKi8KLQlwYXJhbXNfc2V0X2Zvcm1hdChwYXJhbXMsIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKTsKKwlpZiAoKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDBfQUlGMSkgfHwKKwkJKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX1NTUDBfQUlGMikpIHsKIAotCS8qCi0JICogRGVmYXVsdCBtb2RlIGZvciBTU1AgY29uZmlndXJhdGlvbiBpcyBURE0gNCBzbG90LCBvdmVycmlkZSBjb25maWcKLQkgKiB3aXRoIGV4cGxpY2l0IHNldHRpbmcgdG8gSTJTIDJjaCAyNC1iaXQuIFRoZSB3b3JkIGxlbmd0aCBpcyBzZXQgd2l0aAotCSAqIGRhaV9zZXRfdGRtX3Nsb3QoKSBzaW5jZSB0aGVyZSBpcyBubyBvdGhlciBBUEkgZXhwb3NlZAotCSAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQocnRkLT5jcHVfZGFpLAotCQkJCSAgU05EX1NPQ19EQUlGTVRfSTJTICAgICB8Ci0JCQkJICBTTkRfU09DX0RBSUZNVF9OQl9JRiAgIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCU19DRlMKLQkJCQkgICk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBmb3JtYXQgdG8gSTJTLCBlcnIgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJCS8qIHNldCBTU1AwIHRvIDE2LWJpdCAqLworCQlwYXJhbXNfc2V0X2Zvcm1hdChwYXJhbXMsIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFKTsKKworCQkvKgorCQkgKiBEZWZhdWx0IG1vZGUgZm9yIFNTUCBjb25maWd1cmF0aW9uIGlzIFRETSA0IHNsb3QsIG92ZXJyaWRlIGNvbmZpZworCQkgKiB3aXRoIGV4cGxpY2l0IHNldHRpbmcgdG8gSTJTIDJjaCAxNi1iaXQuIFRoZSB3b3JkIGxlbmd0aCBpcyBzZXQgd2l0aAorCQkgKiBkYWlfc2V0X3RkbV9zbG90KCkgc2luY2UgdGhlcmUgaXMgbm8gb3RoZXIgQVBJIGV4cG9zZWQKKwkJICovCisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQocnRkLT5jcHVfZGFpLAorCQkJCQlTTkRfU09DX0RBSUZNVF9JMlMgICAgIHwKKwkJCQkJU05EX1NPQ19EQUlGTVRfTkJfSUYgICB8CisJCQkJCVNORF9TT0NfREFJRk1UX0NCU19DRlMKKwkJCSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGZvcm1hdCB0byBJMlMsIGVyciAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QocnRkLT5jcHVfZGFpLCAweDMsIDB4MywgMiwgMTYpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBJMlMgY29uZmlnLCBlcnIgJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwl9IGVsc2UgeworCisJCS8qIHNldCBTU1AyIHRvIDI0LWJpdCAqLworCQlwYXJhbXNfc2V0X2Zvcm1hdChwYXJhbXMsIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKTsKKworCQkvKgorCQkgKiBEZWZhdWx0IG1vZGUgZm9yIFNTUCBjb25maWd1cmF0aW9uIGlzIFRETSA0IHNsb3QsIG92ZXJyaWRlIGNvbmZpZworCQkgKiB3aXRoIGV4cGxpY2l0IHNldHRpbmcgdG8gSTJTIDJjaCAyNC1iaXQuIFRoZSB3b3JkIGxlbmd0aCBpcyBzZXQgd2l0aAorCQkgKiBkYWlfc2V0X3RkbV9zbG90KCkgc2luY2UgdGhlcmUgaXMgbm8gb3RoZXIgQVBJIGV4cG9zZWQKKwkJICovCisJCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQocnRkLT5jcHVfZGFpLAorCQkJCQlTTkRfU09DX0RBSUZNVF9JMlMgICAgIHwKKwkJCQkJU05EX1NPQ19EQUlGTVRfTkJfSUYgICB8CisJCQkJCVNORF9TT0NfREFJRk1UX0NCU19DRlMKKwkJCSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGZvcm1hdCB0byBJMlMsIGVyciAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QocnRkLT5jcHVfZGFpLCAweDMsIDB4MywgMiwgMjQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBJMlMgY29uZmlnLCBlcnIgJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJfQotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KHJ0ZC0+Y3B1X2RhaSwgMHgzLCAweDMsIDIsIDI0KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IEkyUyBjb25maWcsIGVyciAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzA1LDEwICs2NDQsMTAgQEAKIAl7CiAJCS5uYW1lID0gIlNTUDItQ29kZWMiLAogCQkuaWQgPSAxLAotCQkuY3B1X2RhaV9uYW1lID0gInNzcDItcG9ydCIsCisJCS5jcHVfZGFpX25hbWUgPSAic3NwMi1wb3J0IiwgLyogb3ZlcndyaXR0ZW4gZm9yIHNzcDAgcm91dGluZyAqLwogCQkucGxhdGZvcm1fbmFtZSA9ICJzc3QtbWZsZC1wbGF0Zm9ybSIsCiAJCS5ub19wY20gPSAxLAotCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1NjQwLWFpZjEiLAorCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1NjQwLWFpZjEiLCAvKiBjaGFuZ2VkIHcvIHF1aXJrICovCiAJCS5jb2RlY19uYW1lID0gImkyYy0xMEVDNTY0MDowMCIsIC8qIG92ZXJ3cml0dGVuIHdpdGggSElEICovCiAJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYKIAkJCQkJCXwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKQEAgLTMzNSw2ICs2NzQsMjEgQEAKIH07CiAKIHN0YXRpYyBjaGFyIGJ5dF9ydDU2NDBfY29kZWNfbmFtZVsxNl07IC8qIGkyYy08SElEPjowMCB3aXRoIEhJRCBiZWluZyA4IGNoYXJzICovCitzdGF0aWMgY2hhciBieXRfcnQ1NjQwX2NvZGVjX2FpZl9uYW1lWzEyXTsgLyogID0gInJ0NTY0MC1haWZbMXwyXSIgKi8KK3N0YXRpYyBjaGFyIGJ5dF9ydDU2NDBfY3B1X2RhaV9uYW1lWzEwXTsgLyogID0gInNzcFswfDJdLXBvcnQiICovCisKK3N0YXRpYyBib29sIGlzX3ZhbGxleXZpZXcodm9pZCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgY3B1X2lkc1tdID0geworCQl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIDU1IH0sIC8qIFZhbGxleXZpZXcsIEJheSBUcmFpbCAqLworCQl7fQorCX07CisKKwlpZiAoIXg4Nl9tYXRjaF9jcHUoY3B1X2lkcykpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKwogCiBzdGF0aWMgaW50IHNuZF9ieXRfcnQ1NjQwX21jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC0zNDMsMTAgKzY5NywxNiBAQAogCWNvbnN0IGNoYXIgKmkyY19uYW1lID0gTlVMTDsKIAlpbnQgaTsKIAlpbnQgZGFpX2luZGV4OworCXN0cnVjdCBieXRfcnQ1NjQwX3ByaXZhdGUgKnByaXY7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcHJpdiksIEdGUF9BVE9NSUMpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiByZWdpc3RlciB0aGUgc29jIGNhcmQgKi8KIAlieXRfcnQ1NjQwX2NhcmQuZGV2ID0gJnBkZXYtPmRldjsKIAltYWNoID0gYnl0X3J0NTY0MF9jYXJkLmRldi0+cGxhdGZvcm1fZGF0YTsKKwlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJmJ5dF9ydDU2NDBfY2FyZCwgcHJpdik7CiAKIAkvKiBmaXggaW5kZXggb2YgY29kZWMgZGFpICovCiAJZGFpX2luZGV4ID0gTUVSUl9EUENNX0NPTVBSICsgMTsKQEAgLTM2Niw4ICs3MjYsNTcgQEAKIAkJYnl0X3J0NTY0MF9kYWlzW2RhaV9pbmRleF0uY29kZWNfbmFtZSA9IGJ5dF9ydDU2NDBfY29kZWNfbmFtZTsKIAl9CiAKKwkvKgorCSAqIHN3YXAgU1NQMCBpZiBieXRjciBpcyBkZXRlY3RlZAorCSAqICh3aWxsIGJlIG92ZXJyaWRkZW4gaWYgRE1JIHF1aXJrIGlzIGRldGVjdGVkKQorCSAqLworCWlmIChpc192YWxsZXl2aWV3KCkpIHsKKwkJc3RydWN0IHNzdF9wbGF0Zm9ybV9pbmZvICpwX2luZm8gPSBtYWNoLT5wZGF0YTsKKwkJY29uc3Qgc3RydWN0IHNzdF9yZXNfaW5mbyAqcmVzX2luZm8gPSBwX2luZm8tPnJlc19pbmZvOworCisJCS8qIFRPRE86IHVzZSBDSEFOIHBhY2thZ2UgaW5mbyBmcm9tIEJJT1MgdG8gZGV0ZWN0IEFJRjEvQUlGMiAqLworCQlpZiAocmVzX2luZm8tPmFjcGlfaXBjX2lycV9pbmRleCA9PSAwKSB7CisJCQlieXRfcnQ1NjQwX3F1aXJrIHw9IEJZVF9SVDU2NDBfU1NQMF9BSUYyOworCQl9CisJfQorCiAJLyogY2hlY2sgcXVpcmtzIGJlZm9yZSBjcmVhdGluZyBjYXJkICovCiAJZG1pX2NoZWNrX3N5c3RlbShieXRfcnQ1NjQwX3F1aXJrX3RhYmxlKTsKKwlsb2dfcXVpcmtzKCZwZGV2LT5kZXYpOworCisJaWYgKChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AyX0FJRjIpIHx8CisJICAgIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AwX0FJRjIpKSB7CisKKwkJLyogZml4dXAgY29kZWMgYWlmIG5hbWUgKi8KKwkJc25wcmludGYoYnl0X3J0NTY0MF9jb2RlY19haWZfbmFtZSwKKwkJCXNpemVvZihieXRfcnQ1NjQwX2NvZGVjX2FpZl9uYW1lKSwKKwkJCSIlcyIsICJydDU2NDAtYWlmMiIpOworCisJCWJ5dF9ydDU2NDBfZGFpc1tkYWlfaW5kZXhdLmNvZGVjX2RhaV9uYW1lID0KKwkJCWJ5dF9ydDU2NDBfY29kZWNfYWlmX25hbWU7CisJfQorCisJaWYgKChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AwX0FJRjEpIHx8CisJICAgIChieXRfcnQ1NjQwX3F1aXJrICYgQllUX1JUNTY0MF9TU1AwX0FJRjIpKSB7CisKKwkJLyogZml4dXAgY3B1IGRhaSBuYW1lIG5hbWUgKi8KKwkJc25wcmludGYoYnl0X3J0NTY0MF9jcHVfZGFpX25hbWUsCisJCQlzaXplb2YoYnl0X3J0NTY0MF9jcHVfZGFpX25hbWUpLAorCQkJIiVzIiwgInNzcDAtcG9ydCIpOworCisJCWJ5dF9ydDU2NDBfZGFpc1tkYWlfaW5kZXhdLmNwdV9kYWlfbmFtZSA9CisJCQlieXRfcnQ1NjQwX2NwdV9kYWlfbmFtZTsKKwl9CisKKwlpZiAoKGJ5dF9ydDU2NDBfcXVpcmsgJiBCWVRfUlQ1NjQwX01DTEtfRU4pICYmIChpc192YWxsZXl2aWV3KCkpKSB7CisJCXByaXYtPm1jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInBtY19wbHRfY2xrXzMiKTsKKwkJaWYgKElTX0VSUihwcml2LT5tY2xrKSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gZ2V0IE1DTEsgZnJvbSBwbWNfcGx0X2Nsa18zOiAlbGRcbiIsCisJCQkJUFRSX0VSUihwcml2LT5tY2xrKSk7CisJCQlyZXR1cm4gUFRSX0VSUihwcml2LT5tY2xrKTsKKwkJfQorCX0KIAogCXJldF92YWwgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmYnl0X3J0NTY0MF9jYXJkKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2NvbW1vbi9zc3QtYWNwaS5jIGIvc291bmQvc29jL2ludGVsL2NvbW1vbi9zc3QtYWNwaS5jCmluZGV4IDJjNWVkYTEuLjEyODVjYzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWFjcGkuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvY29tbW9uL3NzdC1hY3BpLmMKQEAgLTE5OSw2ICsxOTksNyBAQAogCiBzdGF0aWMgc3RydWN0IHNzdF9hY3BpX21hY2ggYnJvYWR3ZWxsX21hY2hpbmVzW10gPSB7CiAJeyAiSU5UMzQzQSIsICJicm9hZHdlbGwtYXVkaW8iLCAiaW50ZWwvSW50Y1NTVDIuYmluIiwgTlVMTCwgTlVMTCwgTlVMTCB9LAorCXsgIlJUNTY3N0NFIiwgImJkdy1ydDU2NzciLCAiaW50ZWwvSW50Y1NTVDIuYmluIiwgTlVMTCwgTlVMTCwgTlVMTCB9LAogCXt9CiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC9zc3QtaGFzd2VsbC1wY20uYyBiL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsL3NzdC1oYXN3ZWxsLXBjbS5jCmluZGV4IDMxNTQ1MjUuLjllNDA5NGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsL3NzdC1oYXN3ZWxsLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsL3NzdC1oYXN3ZWxsLXBjbS5jCkBAIC04NzEsNyArODcxLDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGhzd19wY21fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBoc3dfcGNtX29wcyA9IHsKIAkub3BlbgkJPSBoc3dfcGNtX29wZW4sCiAJLmNsb3NlCQk9IGhzd19wY21fY2xvc2UsCiAJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2UvYnh0LXNzdC5jIGIvc291bmQvc29jL2ludGVsL3NreWxha2UvYnh0LXNzdC5jCmluZGV4IDI2NjM3ODEuLjFkMjUxZDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL2J4dC1zc3QuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9ieHQtc3N0LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICIuLi9jb21tb24vc3N0LWRzcC5oIgogI2luY2x1ZGUgIi4uL2NvbW1vbi9zc3QtZHNwLXByaXYuaCIKICNpbmNsdWRlICJza2wtc3N0LWlwYy5oIgorI2luY2x1ZGUgInNrbC10cGxnLWludGVyZmFjZS5oIgogCiAjZGVmaW5lIEJYVF9CQVNFRldfVElNRU9VVAkzMDAwCiAjZGVmaW5lIEJYVF9JTklUX1RJTUVPVVQJNTAwCkBAIC00MCwxMSArNDEsNzMgQEAKICNkZWZpbmUgQlhUX0lOU1RBTkNFX0lEIDAKICNkZWZpbmUgQlhUX0JBU0VfRldfTU9EVUxFX0lEIDAKIAorI2RlZmluZSBCWFRfQURTUF9GV19CSU5fSERSX09GRlNFVCAweDIwMDAKKwogc3RhdGljIHVuc2lnbmVkIGludCBieHRfZ2V0X2Vycm9yY29kZShzdHJ1Y3Qgc3N0X2RzcCAqY3R4KQogewogCSByZXR1cm4gc3N0X2RzcF9zaGltX3JlYWQoY3R4LCBCWFRfQURTUF9FUlJPUl9DT0RFKTsKIH0KIAorc3RhdGljIGludAorYnh0X2xvYWRfbGlicmFyeShzdHJ1Y3Qgc3N0X2RzcCAqY3R4LCBzdHJ1Y3Qgc2tsX2Rmd19tYW5pZmVzdCAqbWluZm8pCit7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIGRtYWI7CisJc3RydWN0IHNrbF9zc3QgKnNrbCA9IGN0eC0+dGhyZWFkX2NvbnRleHQ7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9IE5VTEw7CisJc3RydWN0IGZpcm13YXJlIHN0cmlwcGVkX2Z3OworCWludCByZXQgPSAwLCBpLCBkbWFfaWQsIHN0cmVhbV90YWc7CisKKwkvKiBsaWJyYXJ5IGluZGljZXMgc3RhcnQgZnJvbSAxIHRvIE4uIDAgcmVwcmVzZW50cyBiYXNlIEZXICovCisJZm9yIChpID0gMTsgaSA8IG1pbmZvLT5saWJfY291bnQ7IGkrKykgeworCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgbWluZm8tPmxpYltpXS5uYW1lLCBjdHgtPmRldik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGN0eC0+ZGV2LCAiUmVxdWVzdCBsaWIgJXMgZmFpbGVkOiVkXG4iLAorCQkJCQltaW5mby0+bGliW2ldLm5hbWUsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKHNrbC0+aXNfZmlyc3RfYm9vdCkgeworCQkJcmV0ID0gc25kX3NrbF9wYXJzZV91dWlkcyhjdHgsIGZ3LAorCQkJCQlCWFRfQURTUF9GV19CSU5fSERSX09GRlNFVCwgaSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIGxvYWRfbGlicmFyeV9mYWlsZWQ7CisJCX0KKworCQlzdHJpcHBlZF9mdy5kYXRhID0gZnctPmRhdGE7CisJCXN0cmlwcGVkX2Z3LnNpemUgPSBmdy0+c2l6ZTsKKwkJc2tsX2RzcF9zdHJpcF9leHRlbmRlZF9tYW5pZmVzdCgmc3RyaXBwZWRfZncpOworCisJCXN0cmVhbV90YWcgPSBjdHgtPmRzcF9vcHMucHJlcGFyZShjdHgtPmRldiwgMHg0MCwKKwkJCQkJc3RyaXBwZWRfZncuc2l6ZSwgJmRtYWIpOworCQlpZiAoc3RyZWFtX3RhZyA8PSAwKSB7CisJCQlkZXZfZXJyKGN0eC0+ZGV2LCAiTGliIHByZXBhcmUgRE1BIGVycjogJXhcbiIsCisJCQkJCXN0cmVhbV90YWcpOworCQkJcmV0ID0gc3RyZWFtX3RhZzsKKwkJCWdvdG8gbG9hZF9saWJyYXJ5X2ZhaWxlZDsKKwkJfQorCisJCWRtYV9pZCA9IHN0cmVhbV90YWcgLSAxOworCQltZW1jcHkoZG1hYi5hcmVhLCBzdHJpcHBlZF9mdy5kYXRhLCBzdHJpcHBlZF9mdy5zaXplKTsKKworCQljdHgtPmRzcF9vcHMudHJpZ2dlcihjdHgtPmRldiwgdHJ1ZSwgc3RyZWFtX3RhZyk7CisJCXJldCA9IHNrbF9zc3RfaXBjX2xvYWRfbGlicmFyeSgmc2tsLT5pcGMsIGRtYV9pZCwgaSk7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X2VycihjdHgtPmRldiwgIklQQyBMb2FkIExpYiBmb3IgJXMgZmFpbDogJWRcbiIsCisJCQkJCW1pbmZvLT5saWJbaV0ubmFtZSwgcmV0KTsKKworCQljdHgtPmRzcF9vcHMudHJpZ2dlcihjdHgtPmRldiwgZmFsc2UsIHN0cmVhbV90YWcpOworCQljdHgtPmRzcF9vcHMuY2xlYW51cChjdHgtPmRldiwgJmRtYWIsIHN0cmVhbV90YWcpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKwkJZncgPSBOVUxMOworCX0KKworCXJldHVybiByZXQ7CisKK2xvYWRfbGlicmFyeV9mYWlsZWQ6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJcmV0dXJuIHJldDsKK30KKwogLyoKICAqIEZpcnN0IGJvb3Qgc2VxdWVuY2UgaGFzIHNvbWUgZXh0cmEgc3RlcHMuIENvcmUgMCB3YWl0cyBmb3IgcG93ZXIKICAqIHN0YXR1cyBvbiBjb3JlIDEsIHNvIHBvd2VyIHVwIGNvcmUgMSBhbHNvIG1vbWVudGFyaWx5LCBrZWVwIGl0IGluCkBAIC0xNTcsOCArMjIwLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZGVmaW5lIEJYVF9BRFNQX0ZXX0JJTl9IRFJfT0ZGU0VUIDB4MjAwMAotCiBzdGF0aWMgaW50IGJ4dF9sb2FkX2Jhc2VfZmlybXdhcmUoc3RydWN0IHNzdF9kc3AgKmN0eCkKIHsKIAlzdHJ1Y3QgZmlybXdhcmUgc3RyaXBwZWRfZnc7CkBAIC0xNzUsOSArMjM2LDEyIEBACiAJaWYgKGN0eC0+ZncgPT0gTlVMTCkKIAkJZ290byBzc3RfbG9hZF9iYXNlX2Zpcm13YXJlX2ZhaWxlZDsKIAotCXJldCA9IHNuZF9za2xfcGFyc2VfdXVpZHMoY3R4LCBCWFRfQURTUF9GV19CSU5fSERSX09GRlNFVCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gc3N0X2xvYWRfYmFzZV9maXJtd2FyZV9mYWlsZWQ7CisJLyogcHJhc2UgdXVpZHMgb24gZmlyc3QgYm9vdCAqLworCWlmIChza2wtPmlzX2ZpcnN0X2Jvb3QpIHsKKwkJcmV0ID0gc25kX3NrbF9wYXJzZV91dWlkcyhjdHgsIGN0eC0+ZncsIEJYVF9BRFNQX0ZXX0JJTl9IRFJfT0ZGU0VULCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIHNzdF9sb2FkX2Jhc2VfZmlybXdhcmVfZmFpbGVkOworCX0KIAogCXN0cmlwcGVkX2Z3LmRhdGEgPSBjdHgtPmZ3LT5kYXRhOwogCXN0cmlwcGVkX2Z3LnNpemUgPSBjdHgtPmZ3LT5zaXplOwpAQCAtMjMwLDEyICsyOTQsMjMgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBza2xfaXBjX2R4c3RhdGVfaW5mbyBkeDsKIAl1bnNpZ25lZCBpbnQgY29yZV9tYXNrID0gU0tMX0RTUF9DT1JFX01BU0soY29yZV9pZCk7CisJc3RydWN0IHNrbF9kZndfbWFuaWZlc3QgKm1pbmZvID0gJnNrbC0+bWFuaWZlc3Q7CiAKIAlpZiAoc2tsLT5md19sb2FkZWQgPT0gZmFsc2UpIHsKIAkJc2tsLT5ib290X2NvbXBsZXRlID0gZmFsc2U7CiAJCXJldCA9IGJ4dF9sb2FkX2Jhc2VfZmlybXdhcmUoY3R4KTsKLQkJaWYgKHJldCA8IDApCisJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKGN0eC0+ZGV2LCAicmVsb2FkIGZ3IGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJaWYgKG1pbmZvLT5saWJfY291bnQgPiAxKSB7CisJCQlyZXQgPSBieHRfbG9hZF9saWJyYXJ5KGN0eCwgbWluZm8pOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlkZXZfZXJyKGN0eC0+ZGV2LCAicmVsb2FkIGxpYnMgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zMjksNyArNDA0LDcgQEAKIAogCXJldCA9IHNrbF9kc3BfZGlzYWJsZV9jb3JlKGN0eCwgY29yZV9tYXNrKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAiRmFpbGVkIHRvIGRpc2FibGUgY29yZSAlZCIsIHJldCk7CisJCWRldl9lcnIoY3R4LT5kZXYsICJGYWlsZWQgdG8gZGlzYWJsZSBjb3JlICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlza2wtPmNvcmVzLnN0YXRlW2NvcmVfaWRdID0gU0tMX0RTUF9SRVNFVDsKQEAgLTM0MSw2ICs0MTYsNyBAQAogCS5zZXRfc3RhdGVfRDMgPSBieHRfc2V0X2RzcF9EMywKIAkubG9hZF9mdyA9IGJ4dF9sb2FkX2Jhc2VfZmlybXdhcmUsCiAJLmdldF9md19lcnJjb2RlID0gYnh0X2dldF9lcnJvcmNvZGUsCisJLmxvYWRfbGlicmFyeSA9IGJ4dF9sb2FkX2xpYnJhcnksCiB9OwogCiBzdGF0aWMgc3RydWN0IHNzdF9vcHMgc2tsX29wcyA9IHsKQEAgLTM5NywxNCArNDczLDcgQEAKIAlza2wtPmNvcmVzLmNvdW50ID0gMjsKIAlza2wtPmJvb3RfY29tcGxldGUgPSBmYWxzZTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZza2wtPmJvb3Rfd2FpdCk7Ci0KLQlyZXQgPSBzc3QtPmZ3X29wcy5sb2FkX2Z3KHNzdCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJMb2FkIGJhc2UgZncgZmFpbGVkOiAleCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc2tsX2RzcF9pbml0X2NvcmVfc3RhdGUoc3N0KTsKKwlza2wtPmlzX2ZpcnN0X2Jvb3QgPSB0cnVlOwogCiAJaWYgKGRzcCkKIAkJKmRzcCA9IHNrbDsKQEAgLTQxMyw2ICs0ODIsMzEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGJ4dF9zc3RfZHNwX2luaXQpOwogCitpbnQgYnh0X3NzdF9pbml0X2Z3KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBjdHgtPmRzcDsKKworCXJldCA9IHNzdC0+Zndfb3BzLmxvYWRfZncoc3N0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkxvYWQgYmFzZSBmdyBmYWlsZWQ6ICV4XG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXNrbF9kc3BfaW5pdF9jb3JlX3N0YXRlKHNzdCk7CisKKwlpZiAoY3R4LT5tYW5pZmVzdC5saWJfY291bnQgPiAxKSB7CisJCXJldCA9IHNzdC0+Zndfb3BzLmxvYWRfbGlicmFyeShzc3QsICZjdHgtPm1hbmlmZXN0KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiTG9hZCBMaWJyYXJ5IGZhaWxlZCA6ICV4XG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwljdHgtPmlzX2ZpcnN0X2Jvb3QgPSBmYWxzZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnh0X3NzdF9pbml0X2Z3KTsKIAogdm9pZCBieHRfc3N0X2RzcF9jbGVhbnVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCkKIHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1tZXNzYWdlcy5jIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLW1lc3NhZ2VzLmMKaW5kZXggNDRhYjU5NS4uODA1YjdmMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLW1lc3NhZ2VzLmMKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLW1lc3NhZ2VzLmMKQEAgLTIwMywzMiArMjAzLDM1IEBACiAJCS5pZCA9IDB4OWQ3MCwKIAkJLmxvYWRlcl9vcHMgPSBza2xfZ2V0X2xvYWRlcl9vcHMsCiAJCS5pbml0ID0gc2tsX3NzdF9kc3BfaW5pdCwKKwkJLmluaXRfZncgPSBza2xfc3N0X2luaXRfZncsCiAJCS5jbGVhbnVwID0gc2tsX3NzdF9kc3BfY2xlYW51cAogCX0sCiAJewogCQkuaWQgPSAweDlkNzEsCiAJCS5sb2FkZXJfb3BzID0gc2tsX2dldF9sb2FkZXJfb3BzLAogCQkuaW5pdCA9IHNrbF9zc3RfZHNwX2luaXQsCisJCS5pbml0X2Z3ID0gc2tsX3NzdF9pbml0X2Z3LAogCQkuY2xlYW51cCA9IHNrbF9zc3RfZHNwX2NsZWFudXAKIAl9LAogCXsKIAkJLmlkID0gMHg1YTk4LAogCQkubG9hZGVyX29wcyA9IGJ4dF9nZXRfbG9hZGVyX29wcywKIAkJLmluaXQgPSBieHRfc3N0X2RzcF9pbml0LAorCQkuaW5pdF9mdyA9IGJ4dF9zc3RfaW5pdF9mdywKIAkJLmNsZWFudXAgPSBieHRfc3N0X2RzcF9jbGVhbnVwCiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgc2tsX2dldF9kc3Bfb3BzKGludCBwY2lfaWQpCitjb25zdCBzdHJ1Y3Qgc2tsX2RzcF9vcHMgKnNrbF9nZXRfZHNwX29wcyhpbnQgcGNpX2lkKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHNwX29wcyk7IGkrKykgewogCQlpZiAoZHNwX29wc1tpXS5pZCA9PSBwY2lfaWQpCi0JCQlyZXR1cm4gaTsKKwkJCXJldHVybiAmZHNwX29wc1tpXTsKIAl9CiAKLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gTlVMTDsKIH0KIAogaW50IHNrbF9pbml0X2RzcChzdHJ1Y3Qgc2tsICpza2wpCkBAIC0yMzgsNyArMjQxLDggQEAKIAlzdHJ1Y3QgaGRhY19idXMgKmJ1cyA9IGVidXNfdG9faGJ1cyhlYnVzKTsKIAlzdHJ1Y3Qgc2tsX2RzcF9sb2FkZXJfb3BzIGxvYWRlcl9vcHM7CiAJaW50IGlycSA9IGJ1cy0+aXJxOwotCWludCByZXQsIGluZGV4OworCWNvbnN0IHN0cnVjdCBza2xfZHNwX29wcyAqb3BzOworCWludCByZXQ7CiAKIAkvKiBlbmFibGUgcHBjYXAgaW50ZXJydXB0ICovCiAJc25kX2hkYWNfZXh0X2J1c19wcGNhcF9lbmFibGUoJnNrbC0+ZWJ1cywgdHJ1ZSk7CkBAIC0yNTEsMTggKzI1NSwxOCBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCWluZGV4ICA9IHNrbF9nZXRfZHNwX29wcyhza2wtPnBjaS0+ZGV2aWNlKTsKLQlpZiAoaW5kZXggIDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJb3BzID0gc2tsX2dldF9kc3Bfb3BzKHNrbC0+cGNpLT5kZXZpY2UpOworCWlmICghb3BzKQorCQlyZXR1cm4gLUVJTzsKIAotCWxvYWRlcl9vcHMgPSBkc3Bfb3BzW2luZGV4XS5sb2FkZXJfb3BzKCk7Ci0JcmV0ID0gZHNwX29wc1tpbmRleF0uaW5pdChidXMtPmRldiwgbW1pb19iYXNlLCBpcnEsCi0JCQlza2wtPmZ3X25hbWUsIGxvYWRlcl9vcHMsICZza2wtPnNrbF9zc3QpOworCWxvYWRlcl9vcHMgPSBvcHMtPmxvYWRlcl9vcHMoKTsKKwlyZXQgPSBvcHMtPmluaXQoYnVzLT5kZXYsIG1taW9fYmFzZSwgaXJxLAorCQkJCXNrbC0+ZndfbmFtZSwgbG9hZGVyX29wcywKKwkJCQkmc2tsLT5za2xfc3N0KTsKIAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0Jc2tsX2RzcF9lbmFibGVfbm90aWZpY2F0aW9uKHNrbC0+c2tsX3NzdCwgZmFsc2UpOwogCWRldl9kYmcoYnVzLT5kZXYsICJkc3AgcmVnaXN0cmF0aW9uIHN0YXR1cz0lZFxuIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CkBAIC0yNzMsMTYgKzI3NywxNiBAQAogCXN0cnVjdCBoZGFjX2V4dF9idXMgKmVidXMgPSAmc2tsLT5lYnVzOwogCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gZWJ1c190b19oYnVzKGVidXMpOwogCXN0cnVjdCBza2xfc3N0ICpjdHggPSBza2wtPnNrbF9zc3Q7Ci0JaW50IGluZGV4OworCWNvbnN0IHN0cnVjdCBza2xfZHNwX29wcyAqb3BzOwogCiAJLyogZGlzYWJsZSAgcHBjYXAgaW50ZXJydXB0ICovCiAJc25kX2hkYWNfZXh0X2J1c19wcGNhcF9pbnRfZW5hYmxlKCZza2wtPmVidXMsIGZhbHNlKTsKIAotCWluZGV4ID0gc2tsX2dldF9kc3Bfb3BzKHNrbC0+cGNpLT5kZXZpY2UpOwotCWlmIChpbmRleCAgPCAwKQorCW9wcyA9IHNrbF9nZXRfZHNwX29wcyhza2wtPnBjaS0+ZGV2aWNlKTsKKwlpZiAoIW9wcykKIAkJcmV0dXJuIC1FSU87CiAKLQlkc3Bfb3BzW2luZGV4XS5jbGVhbnVwKGJ1cy0+ZGV2LCBjdHgpOworCW9wcy0+Y2xlYW51cChidXMtPmRldiwgY3R4KTsKIAogCWlmIChjdHgtPmRzcC0+YWRkci5scGUpCiAJCWlvdW5tYXAoY3R4LT5kc3AtPmFkZHIubHBlKTsKQEAgLTI5Niw3ICszMDAsNyBAQAogCWludCByZXQ7CiAKIAkvKiBpZiBwcGNhcCBpcyBub3Qgc3VwcG9ydGVkIHJldHVybiAwICovCi0JaWYgKCFza2wtPmVidXMucHBjYXApCisJaWYgKCFza2wtPmVidXMuYnVzLnBwY2FwKQogCQlyZXR1cm4gMDsKIAogCXJldCA9IHNrbF9kc3Bfc2xlZXAoY3R4LT5kc3ApOwpAQCAtMzE2LDEzICszMjAsMTcgQEAKIAlpbnQgcmV0OwogCiAJLyogaWYgcHBjYXAgaXMgbm90IHN1cHBvcnRlZCByZXR1cm4gMCAqLwotCWlmICghc2tsLT5lYnVzLnBwY2FwKQorCWlmICghc2tsLT5lYnVzLmJ1cy5wcGNhcCkKIAkJcmV0dXJuIDA7CiAKIAkvKiBlbmFibGUgcHBjYXAgaW50ZXJydXB0ICovCiAJc25kX2hkYWNfZXh0X2J1c19wcGNhcF9lbmFibGUoJnNrbC0+ZWJ1cywgdHJ1ZSk7CiAJc25kX2hkYWNfZXh0X2J1c19wcGNhcF9pbnRfZW5hYmxlKCZza2wtPmVidXMsIHRydWUpOwogCisJLyogY2hlY2sgaWYgRFNQIDFzdCBib290IGlzIGRvbmUgKi8KKwlpZiAoc2tsLT5za2xfc3N0LT5pc19maXJzdF9ib290ID09IHRydWUpCisJCXJldHVybiAwOworCiAJcmV0ID0gc2tsX2RzcF93YWtlKGN0eC0+ZHNwKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTY3Miw2ICs2ODAsNyBAQAogCQlyZXR1cm4gcGFyYW1fc2l6ZTsKIAogCWNhc2UgU0tMX01PRFVMRV9UWVBFX0JBU0VfT1VURk1UOgorCWNhc2UgU0tMX01PRFVMRV9UWVBFX0tQQjoKIAkJcmV0dXJuIHNpemVvZihzdHJ1Y3Qgc2tsX2Jhc2Vfb3V0Zm10X2NmZyk7CiAKIAlkZWZhdWx0OgpAQCAtNzI1LDYgKzczNCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTS0xfTU9EVUxFX1RZUEVfQkFTRV9PVVRGTVQ6CisJY2FzZSBTS0xfTU9EVUxFX1RZUEVfS1BCOgogCQlza2xfc2V0X2Jhc2Vfb3V0Zm10X2Zvcm1hdChjdHgsIG1vZHVsZV9jb25maWcsICpwYXJhbV9kYXRhKTsKIAkJYnJlYWs7CiAKQEAgLTc3OSw2ICs3ODksNyBAQAogCQkJCW1waW5baV0uaW5fdXNlID0gdHJ1ZTsKIAkJCQltcGluW2ldLmlkLm1vZHVsZV9pZCA9IGlkLm1vZHVsZV9pZDsKIAkJCQltcGluW2ldLmlkLmluc3RhbmNlX2lkID0gaWQuaW5zdGFuY2VfaWQ7CisJCQkJbXBpbltpXS5pZC5wdnRfaWQgPSBpZC5wdnRfaWQ7CiAJCQkJbXBpbltpXS50Z3RfbWNmZyA9IHRndF9jZmc7CiAJCQkJcmV0dXJuIGk7CiAJCQl9CkBAIC04MDIsNiArODEzLDcgQEAKIAkJbXBpbltxX2luZGV4XS5pbl91c2UgPSBmYWxzZTsKIAkJbXBpbltxX2luZGV4XS5pZC5tb2R1bGVfaWQgPSAwOwogCQltcGluW3FfaW5kZXhdLmlkLmluc3RhbmNlX2lkID0gMDsKKwkJbXBpbltxX2luZGV4XS5pZC5wdnRfaWQgPSAwOwogCX0KIAltcGluW3FfaW5kZXhdLnBpbl9zdGF0ZSA9IFNLTF9QSU5fVU5CSU5EOwogCW1waW5bcV9pbmRleF0udGd0X21jZmcgPSBOVUxMOwpAQCAtODQyLDcgKzg1NCw3IEBACiAJc3RydWN0IHNrbF9pcGNfaW5pdF9pbnN0YW5jZV9tc2cgbXNnOwogCiAJZGV2X2RiZyhjdHgtPmRldiwgIiVzOiBtb2R1bGVfaWQgPSAlZCBpbnN0YW5jZT0lZFxuIiwgX19mdW5jX18sCi0JCSBtY29uZmlnLT5pZC5tb2R1bGVfaWQsIG1jb25maWctPmlkLmluc3RhbmNlX2lkKTsKKwkJIG1jb25maWctPmlkLm1vZHVsZV9pZCwgbWNvbmZpZy0+aWQucHZ0X2lkKTsKIAogCWlmIChtY29uZmlnLT5waXBlLT5zdGF0ZSAhPSBTS0xfUElQRV9DUkVBVEVEKSB7CiAJCWRldl9lcnIoY3R4LT5kZXYsICJQaXBlIG5vdCBjcmVhdGVkIHN0YXRlPSAlZCBwaXBlX2lkPSAlZFxuIiwKQEAgLTg1OCwxMCArODcwLDExIEBACiAJfQogCiAJbXNnLm1vZHVsZV9pZCA9IG1jb25maWctPmlkLm1vZHVsZV9pZDsKLQltc2cuaW5zdGFuY2VfaWQgPSBtY29uZmlnLT5pZC5pbnN0YW5jZV9pZDsKKwltc2cuaW5zdGFuY2VfaWQgPSBtY29uZmlnLT5pZC5wdnRfaWQ7CiAJbXNnLnBwbF9pbnN0YW5jZV9pZCA9IG1jb25maWctPnBpcGUtPnBwbF9pZDsKIAltc2cucGFyYW1fZGF0YV9zaXplID0gbW9kdWxlX2NvbmZpZ19zaXplOwogCW1zZy5jb3JlX2lkID0gbWNvbmZpZy0+Y29yZV9pZDsKKwltc2cuZG9tYWluID0gbWNvbmZpZy0+ZG9tYWluOwogCiAJcmV0ID0gc2tsX2lwY19pbml0X2luc3RhbmNlKCZjdHgtPmlwYywgJm1zZywgcGFyYW1fZGF0YSk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTg3OCw5ICs4OTEsOSBAQAogCSpzcmNfbW9kdWxlLCBzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKmRzdF9tb2R1bGUpCiB7CiAJZGV2X2RiZyhjdHgtPmRldiwgIiVzOiBzcmMgbW9kdWxlX2lkID0gJWQgIHNyY19pbnN0YW5jZT0lZFxuIiwKLQkJX19mdW5jX18sIHNyY19tb2R1bGUtPmlkLm1vZHVsZV9pZCwgc3JjX21vZHVsZS0+aWQuaW5zdGFuY2VfaWQpOworCQlfX2Z1bmNfXywgc3JjX21vZHVsZS0+aWQubW9kdWxlX2lkLCBzcmNfbW9kdWxlLT5pZC5wdnRfaWQpOwogCWRldl9kYmcoY3R4LT5kZXYsICIlczogZHN0X21vZHVsZT0lZCBkc3RfaW5zdGFjbmU9JWRcbiIsIF9fZnVuY19fLAotCQkgZHN0X21vZHVsZS0+aWQubW9kdWxlX2lkLCBkc3RfbW9kdWxlLT5pZC5pbnN0YW5jZV9pZCk7CisJCSBkc3RfbW9kdWxlLT5pZC5tb2R1bGVfaWQsIGRzdF9tb2R1bGUtPmlkLnB2dF9pZCk7CiAKIAlkZXZfZGJnKGN0eC0+ZGV2LCAic3JjX21vZHVsZSBzdGF0ZSA9ICVkIGRzdCBtb2R1bGUgc3RhdGUgPSAlZFxuIiwKIAkJc3JjX21vZHVsZS0+bV9zdGF0ZSwgZHN0X21vZHVsZS0+bV9zdGF0ZSk7CkBAIC05MjcsOSArOTQwLDkgQEAKIAkJcmV0dXJuIDA7CiAKIAltc2cubW9kdWxlX2lkID0gc3JjX21jZmctPmlkLm1vZHVsZV9pZDsKLQltc2cuaW5zdGFuY2VfaWQgPSBzcmNfbWNmZy0+aWQuaW5zdGFuY2VfaWQ7CisJbXNnLmluc3RhbmNlX2lkID0gc3JjX21jZmctPmlkLnB2dF9pZDsKIAltc2cuZHN0X21vZHVsZV9pZCA9IGRzdF9tY2ZnLT5pZC5tb2R1bGVfaWQ7Ci0JbXNnLmRzdF9pbnN0YW5jZV9pZCA9IGRzdF9tY2ZnLT5pZC5pbnN0YW5jZV9pZDsKKwltc2cuZHN0X2luc3RhbmNlX2lkID0gZHN0X21jZmctPmlkLnB2dF9pZDsKIAltc2cuYmluZCA9IGZhbHNlOwogCiAJcmV0ID0gc2tsX2lwY19iaW5kX3VuYmluZCgmY3R4LT5pcGMsICZtc2cpOwpAQCAtOTg4LDkgKzEwMDEsOSBAQAogCQkJIG1zZy5zcmNfcXVldWUsIG1zZy5kc3RfcXVldWUpOwogCiAJbXNnLm1vZHVsZV9pZCA9IHNyY19tY2ZnLT5pZC5tb2R1bGVfaWQ7Ci0JbXNnLmluc3RhbmNlX2lkID0gc3JjX21jZmctPmlkLmluc3RhbmNlX2lkOworCW1zZy5pbnN0YW5jZV9pZCA9IHNyY19tY2ZnLT5pZC5wdnRfaWQ7CiAJbXNnLmRzdF9tb2R1bGVfaWQgPSBkc3RfbWNmZy0+aWQubW9kdWxlX2lkOwotCW1zZy5kc3RfaW5zdGFuY2VfaWQgPSBkc3RfbWNmZy0+aWQuaW5zdGFuY2VfaWQ7CisJbXNnLmRzdF9pbnN0YW5jZV9pZCA9IGRzdF9tY2ZnLT5pZC5wdnRfaWQ7CiAJbXNnLmJpbmQgPSB0cnVlOwogCiAJcmV0ID0gc2tsX2lwY19iaW5kX3VuYmluZCgmY3R4LT5pcGMsICZtc2cpOwpAQCAtMTE2OCw3ICsxMTgxLDcgQEAKIAlzdHJ1Y3Qgc2tsX2lwY19sYXJnZV9jb25maWdfbXNnIG1zZzsKIAogCW1zZy5tb2R1bGVfaWQgPSBtY2ZnLT5pZC5tb2R1bGVfaWQ7Ci0JbXNnLmluc3RhbmNlX2lkID0gbWNmZy0+aWQuaW5zdGFuY2VfaWQ7CisJbXNnLmluc3RhbmNlX2lkID0gbWNmZy0+aWQucHZ0X2lkOwogCW1zZy5wYXJhbV9kYXRhX3NpemUgPSBzaXplOwogCW1zZy5sYXJnZV9wYXJhbV9pZCA9IHBhcmFtX2lkOwogCkBAIC0xMTgxLDcgKzExOTQsNyBAQAogCXN0cnVjdCBza2xfaXBjX2xhcmdlX2NvbmZpZ19tc2cgbXNnOwogCiAJbXNnLm1vZHVsZV9pZCA9IG1jZmctPmlkLm1vZHVsZV9pZDsKLQltc2cuaW5zdGFuY2VfaWQgPSBtY2ZnLT5pZC5pbnN0YW5jZV9pZDsKKwltc2cuaW5zdGFuY2VfaWQgPSBtY2ZnLT5pZC5wdnRfaWQ7CiAJbXNnLnBhcmFtX2RhdGFfc2l6ZSA9IHNpemU7CiAJbXNnLmxhcmdlX3BhcmFtX2lkID0gcGFyYW1faWQ7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1wY20uYyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1wY20uYwppbmRleCA2ZTA1YmY4Li41OGM3Mjg2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtcGNtLmMKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXBjbS5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAogc3RhdGljIGVudW0gaGRhY19leHRfc3RyZWFtX3R5cGUgc2tsX2dldF9ob3N0X3N0cmVhbV90eXBlKHN0cnVjdCBoZGFjX2V4dF9idXMgKmVidXMpCiB7Ci0JaWYgKGVidXMtPnBwY2FwKQorCWlmICgoZWJ1c190b19oYnVzKGVidXMpKS0+cHBjYXApCiAJCXJldHVybiBIREFDX0VYVF9TVFJFQU1fVFlQRV9IT1NUOwogCWVsc2UKIAkJcmV0dXJuIEhEQUNfRVhUX1NUUkVBTV9UWVBFX0NPVVBMRUQ7CkBAIC0xODgsNyArMTg4LDcgQEAKIAlzdHJ1Y3QgaGRhY19leHRfYnVzICplYnVzID0gZGV2X2dldF9kcnZkYXRhKGRhaS0+ZGV2KTsKIAlpbnQgZm9ybWF0X3ZhbCA9IDA7CiAKLQlpZiAoZWJ1cy0+cHBjYXApIHsKKwlpZiAoKGVidXNfdG9faGJ1cyhlYnVzKSktPnBwY2FwKSB7CiAJCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKIAkJZm9ybWF0X3ZhbCA9IHNuZF9oZGFjX2NhbGNfc3RyZWFtX2Zvcm1hdChydW50aW1lLT5yYXRlLApAQCAtNjQ4LDcgKzY0OCw4IEBACiAJCS5jaGFubmVsc19taW4gPSBIREFfTU9OTywKIAkJLmNoYW5uZWxzX21heCA9IEhEQV9TVEVSRU8sCiAJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwgU05EUlZfUENNX1JBVEVfMTYwMDAgfCBTTkRSVl9QQ01fUkFURV84MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAorCQkJU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MzMl9MRSwKIAl9LAogCS5jYXB0dXJlID0gewogCQkuc3RyZWFtX25hbWUgPSAiU3lzdGVtIENhcHR1cmUiLApAQCAtMTAyMCw3ICsxMDIxLDcgQEAKIHsKIAlzdHJ1Y3QgaGRhY19leHRfYnVzICplYnVzID0gZ2V0X2J1c19jdHgoc3Vic3RyZWFtKTsKIAotCWlmICghZWJ1cy0+cHBjYXApCisJaWYgKCEoZWJ1c190b19oYnVzKGVidXMpKS0+cHBjYXApCiAJCXJldHVybiBza2xfY291cGxlZF90cmlnZ2VyKHN1YnN0cmVhbSwgY21kKTsKIAogCXJldHVybiAwOwpAQCAtMTA5Myw3ICsxMDk0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBza2xfcGxhdGZvcm1fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX29wcyBza2xfcGxhdGZvcm1fb3BzID0gewogCS5vcGVuID0gc2tsX3BsYXRmb3JtX29wZW4sCiAJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCiAJLnRyaWdnZXIgPSBza2xfcGxhdGZvcm1fcGNtX3RyaWdnZXIsCkBAIC0xMTM4LDIwICsxMTM5LDY3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIGludCBza2xfcG9wdWxhdGVfbW9kdWxlcyhzdHJ1Y3Qgc2tsICpza2wpCit7CisJc3RydWN0IHNrbF9waXBlbGluZSAqcDsKKwlzdHJ1Y3Qgc2tsX3BpcGVfbW9kdWxlICptOworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3OworCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZzsKKwlpbnQgcmV0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmc2tsLT5wcGxfbGlzdCwgbm9kZSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG0sICZwLT5waXBlLT53X2xpc3QsIG5vZGUpIHsKKworCQkJdyA9IG0tPnc7CisJCQltY29uZmlnID0gdy0+cHJpdjsKKworCQkJcmV0ID0gc25kX3NrbF9nZXRfbW9kdWxlX2luZm8oc2tsLT5za2xfc3N0LCBtY29uZmlnKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2Vycihza2wtPnNrbF9zc3QtPmRldiwKKwkJCQkJInF1ZXJ5IG1vZHVsZSBpbmZvIGZhaWxlZDolZFxuIiwgcmV0KTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCX0KK2VycjoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHNrbF9wbGF0Zm9ybV9zb2NfcHJvYmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQogewogCXN0cnVjdCBoZGFjX2V4dF9idXMgKmVidXMgPSBkZXZfZ2V0X2RydmRhdGEocGxhdGZvcm0tPmRldik7CiAJc3RydWN0IHNrbCAqc2tsID0gZWJ1c190b19za2woZWJ1cyk7CisJY29uc3Qgc3RydWN0IHNrbF9kc3Bfb3BzICpvcHM7CiAJaW50IHJldDsKIAotCWlmIChlYnVzLT5wcGNhcCkgeworCXBtX3J1bnRpbWVfZ2V0X3N5bmMocGxhdGZvcm0tPmRldik7CisJaWYgKChlYnVzX3RvX2hidXMoZWJ1cykpLT5wcGNhcCkgewogCQlyZXQgPSBza2xfdHBsZ19pbml0KHBsYXRmb3JtLCBlYnVzKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIocGxhdGZvcm0tPmRldiwgIkZhaWxlZCB0byBpbml0IHRvcG9sb2d5IVxuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJCXNrbC0+cGxhdGZvcm0gPSBwbGF0Zm9ybTsKKworCQkvKiBsb2FkIHRoZSBmaXJtd2FyZXMsIHNpbmNlIGFsbCBpcyBzZXQgKi8KKwkJb3BzID0gc2tsX2dldF9kc3Bfb3BzKHNrbC0+cGNpLT5kZXZpY2UpOworCQlpZiAoIW9wcykKKwkJCXJldHVybiAtRUlPOworCisJCWlmIChza2wtPnNrbF9zc3QtPmlzX2ZpcnN0X2Jvb3QgPT0gZmFsc2UpIHsKKwkJCWRldl9lcnIocGxhdGZvcm0tPmRldiwgIkRTUCByZXBvcnRzIGZpcnN0IGJvb3QgZG9uZSEhIVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCXJldCA9IG9wcy0+aW5pdF9mdyhwbGF0Zm9ybS0+ZGV2LCBza2wtPnNrbF9zc3QpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihwbGF0Zm9ybS0+ZGV2LCAiRmFpbGVkIHRvIGJvb3QgZmlyc3QgZnc6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlza2xfcG9wdWxhdGVfbW9kdWxlcyhza2wpOwogCX0KKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBsYXRmb3JtLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHBsYXRmb3JtLT5kZXYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWNsZG1hLmMgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWNsZG1hLmMKaW5kZXggZGEyMzI5ZC4uZWZhMjUzMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1jbGRtYS5jCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtY2xkbWEuYwpAQCAtMzQxLDE0ICszNDEsMTQgQEAKIAlyZXQgPSBjdHgtPmRzcF9vcHMuYWxsb2NfZG1hX2J1ZihjdHgtPmRldiwKIAkJCSZjdHgtPmNsX2Rldi5kbWFiX2RhdGEsIGN0eC0+Y2xfZGV2LmJ1ZnNpemUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJBbGxvYyBidWZmZXIgZm9yIGJhc2UgZncgZmFpbGVkOiAleCIsIHJldCk7CisJCWRldl9lcnIoY3R4LT5kZXYsICJBbGxvYyBidWZmZXIgZm9yIGJhc2UgZncgZmFpbGVkOiAleFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJLyogU2V0dXAgQ29kZSBsb2FkZXIgQkRMICovCiAJcmV0ID0gY3R4LT5kc3Bfb3BzLmFsbG9jX2RtYV9idWYoY3R4LT5kZXYsCiAJCQkmY3R4LT5jbF9kZXYuZG1hYl9iZGwsIFBBR0VfU0laRSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihjdHgtPmRldiwgIkFsbG9jIGJ1ZmZlciBmb3IgYmxkZSBmYWlsZWQ6ICV4IiwgcmV0KTsKKwkJZGV2X2VycihjdHgtPmRldiwgIkFsbG9jIGJ1ZmZlciBmb3IgYmxkZSBmYWlsZWQ6ICV4XG4iLCByZXQpOwogCQljdHgtPmRzcF9vcHMuZnJlZV9kbWFfYnVmKGN0eC0+ZGV2LCAmY3R4LT5jbF9kZXYuZG1hYl9kYXRhKTsKIAkJcmV0dXJuIHJldDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWRzcC5oIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1kc3AuaAppbmRleCAwZjg2MjllLi5iOWU3MWQwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWRzcC5oCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtZHNwLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxzb3VuZC9tZW1hbGxvYy5oPgogI2luY2x1ZGUgInNrbC1zc3QtY2xkbWEuaCIKICNpbmNsdWRlICJza2wtdHBsZy1pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJza2wtdG9wb2xvZ3kuaCIKIAogc3RydWN0IHNzdF9kc3A7CiBzdHJ1Y3Qgc2tsX3NzdDsKQEAgLTEzMyw2ICsxMzQsOCBAQAogc3RydWN0IHNrbF9kc3BfZndfb3BzIHsKIAlpbnQgKCpsb2FkX2Z3KShzdHJ1Y3Qgc3N0X2RzcCAgKmN0eCk7CiAJLyogRlcgbW9kdWxlIHBhcnNlci9sb2FkZXIgKi8KKwlpbnQgKCpsb2FkX2xpYnJhcnkpKHN0cnVjdCBzc3RfZHNwICpjdHgsCisJCXN0cnVjdCBza2xfZGZ3X21hbmlmZXN0ICptaW5mbyk7CiAJaW50ICgqcGFyc2VfZncpKHN0cnVjdCBzc3RfZHNwICpjdHgpOwogCWludCAoKnNldF9zdGF0ZV9EMCkoc3RydWN0IHNzdF9kc3AgKmN0eCwgdW5zaWduZWQgaW50IGNvcmVfaWQpOwogCWludCAoKnNldF9zdGF0ZV9EMykoc3RydWN0IHNzdF9kc3AgKmN0eCwgdW5zaWduZWQgaW50IGNvcmVfaWQpOwpAQCAtMjAzLDEyICsyMDYsMjEgQEAKIGludCBieHRfc3N0X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UsIGludCBpcnEsCiAJCWNvbnN0IGNoYXIgKmZ3X25hbWUsIHN0cnVjdCBza2xfZHNwX2xvYWRlcl9vcHMgZHNwX29wcywKIAkJc3RydWN0IHNrbF9zc3QgKipkc3ApOworaW50IHNrbF9zc3RfaW5pdF9mdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfc3N0ICpjdHgpOworaW50IGJ4dF9zc3RfaW5pdF9mdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfc3N0ICpjdHgpOwogdm9pZCBza2xfc3N0X2RzcF9jbGVhbnVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCk7CiB2b2lkIGJ4dF9zc3RfZHNwX2NsZWFudXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tsX3NzdCAqY3R4KTsKIAotaW50IHNuZF9za2xfZ2V0X21vZHVsZV9pbmZvKHN0cnVjdCBza2xfc3N0ICpjdHgsIHU4ICp1dWlkLAotCQlzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGUgKmRmd19jb25maWcpOwotaW50IHNuZF9za2xfcGFyc2VfdXVpZHMoc3RydWN0IHNzdF9kc3AgKmN0eCwgdW5zaWduZWQgaW50IG9mZnNldCk7CitpbnQgc25kX3NrbF9nZXRfbW9kdWxlX2luZm8oc3RydWN0IHNrbF9zc3QgKmN0eCwKKwkJCQlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcpOworaW50IHNuZF9za2xfcGFyc2VfdXVpZHMoc3RydWN0IHNzdF9kc3AgKmN0eCwgY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKKwkJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgaW5kZXgpOworaW50IHNrbF9nZXRfcHZ0X2lkKHN0cnVjdCBza2xfc3N0ICpjdHgsCisJCQkJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnKTsKK2ludCBza2xfcHV0X3B2dF9pZChzdHJ1Y3Qgc2tsX3NzdCAqY3R4LAorCQkJCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZyk7CitpbnQgc2tsX2dldF9wdnRfaW5zdGFuY2VfaWRfbWFwKHN0cnVjdCBza2xfc3N0ICpjdHgsCisJCQkJaW50IG1vZHVsZV9pZCwgaW50IGluc3RhbmNlX2lkKTsKIHZvaWQgc2tsX2ZyZWV1cF91dWlkX2xpc3Qoc3RydWN0IHNrbF9zc3QgKmN0eCk7CiAKIGludCBza2xfZHNwX3N0cmlwX2V4dGVuZGVkX21hbmlmZXN0KHN0cnVjdCBmaXJtd2FyZSAqZncpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1pcGMuYyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtaXBjLmMKaW5kZXggOTZmMmY2OC4uMGJkMDFlNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1pcGMuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWlwYy5jCkBAIC0xMTQsNiArMTE0LDExIEBACiAjZGVmaW5lIElQQ19DT1JFX0lEKHgpCQkJKCgoeCkgJiBJUENfQ09SRV9JRF9NQVNLKSBcCiAJCQkJCTw8IElQQ19DT1JFX0lEX1NISUZUKQogCisjZGVmaW5lIElQQ19ET01BSU5fU0hJRlQgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgSVBDX0RPTUFJTl9NQVNLICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgSVBDX0RPTUFJTih4KSAgICAgICAgICAgICAgICAgICAoKCh4KSAmIElQQ19ET01BSU5fTUFTSykgXAorCQkJCQk8PCBJUENfRE9NQUlOX1NISUZUKQorCiAvKiBCaW5kL1VuYmluZCBtZXNzYWdlIGV4dGVuc2lvbiByZWdpc3RlciAqLwogI2RlZmluZSBJUENfRFNUX01PRF9JRF9TSElGVAkJMAogI2RlZmluZSBJUENfRFNUX01PRF9JRCh4KQkJKCgoeCkgJiBJUENfTU9EX0lEX01BU0spIFwKQEAgLTE5MCw2ICsxOTUsNyBAQAogCUlQQ19HTEJfR0VUX1BQTF9DT05URVhUX1NJWkUgPSAyMSwKIAlJUENfR0xCX1NBVkVfUFBMID0gMjIsCiAJSVBDX0dMQl9SRVNUT1JFX1BQTCA9IDIzLAorCUlQQ19HTEJfTE9BRF9MSUJSQVJZID0gMjQsCiAJSVBDX0dMQl9OT1RJRlkgPSAyNiwKIAlJUENfR0xCX01BWF9JUENfTVNHX05VTUJFUiA9IDMxIC8qIE1heGltdW0gbWVzc2FnZSBudW1iZXIgKi8KIH07CkBAIC0zMzgsNyArMzQ0LDcgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKGlwYy0+ZGV2LCAiaXBjOiBVbmhhbmRsZWQgZXJyb3IgbXNnPSV4IiwKKwkJCWRldl9lcnIoaXBjLT5kZXYsICJpcGM6IFVuaGFuZGxlZCBlcnJvciBtc2c9JXhcbiIsCiAJCQkJCQloZWFkZXIucHJpbWFyeSk7CiAJCQlicmVhazsKIAkJfQpAQCAtMzc5LDEzICszODUsMTMgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlkZXZfZXJyKGlwYy0+ZGV2LCAiVW5rbm93biBpcGMgcmVwbHk6IDB4JXgiLCByZXBseSk7CisJCWRldl9lcnIoaXBjLT5kZXYsICJVbmtub3duIGlwYyByZXBseTogMHgleFxuIiwgcmVwbHkpOwogCQltc2ctPmVycm5vID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQogCiAJaWYgKHJlcGx5ICE9IElQQ19HTEJfUkVQTFlfU1VDQ0VTUykgewotCQlkZXZfZXJyKGlwYy0+ZGV2LCAiaXBjIEZXIHJlcGx5OiByZXBseT0lZCIsIHJlcGx5KTsKKwkJZGV2X2VycihpcGMtPmRldiwgImlwYyBGVyByZXBseTogcmVwbHk9JWRcbiIsIHJlcGx5KTsKIAkJZGV2X2VycihpcGMtPmRldiwgIkZXIEVycm9yIENvZGU6ICV1XG4iLAogCQkJaXBjLT5kc3AtPmZ3X29wcy5nZXRfZndfZXJyY29kZShpcGMtPmRzcCkpOwogCX0KQEAgLTQzNCw5ICs0NDAsOSBAQAogCQloaXBjdGUgPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChkc3AsIFNLTF9BRFNQX1JFR19ISVBDVEUpOwogCQloZWFkZXIucHJpbWFyeSA9IGhpcGN0OwogCQloZWFkZXIuZXh0ZW5zaW9uID0gaGlwY3RlOwotCQlkZXZfZGJnKGRzcC0+ZGV2LCAiSVBDIGlycTogRmlybXdhcmUgcmVzcG9uZCBwcmltYXJ5OiV4IiwKKwkJZGV2X2RiZyhkc3AtPmRldiwgIklQQyBpcnE6IEZpcm13YXJlIHJlc3BvbmQgcHJpbWFyeToleFxuIiwKIAkJCQkJCWhlYWRlci5wcmltYXJ5KTsKLQkJZGV2X2RiZyhkc3AtPmRldiwgIklQQyBpcnE6IEZpcm13YXJlIHJlc3BvbmQgZXh0ZW5zaW9uOiV4IiwKKwkJZGV2X2RiZyhkc3AtPmRldiwgIklQQyBpcnE6IEZpcm13YXJlIHJlc3BvbmQgZXh0ZW5zaW9uOiV4XG4iLAogCQkJCQkJaGVhZGVyLmV4dGVuc2lvbik7CiAKIAkJaWYgKElQQ19HTEJfTk9USUZZX1JTUF9UWVBFKGhlYWRlci5wcmltYXJ5KSkgewpAQCAtNzA0LDYgKzcxMCw3IEBACiAJaGVhZGVyLmV4dGVuc2lvbiA9IElQQ19DT1JFX0lEKG1zZy0+Y29yZV9pZCk7CiAJaGVhZGVyLmV4dGVuc2lvbiB8PSBJUENfUFBMX0lOU1RBTkNFX0lEKG1zZy0+cHBsX2luc3RhbmNlX2lkKTsKIAloZWFkZXIuZXh0ZW5zaW9uIHw9IElQQ19QQVJBTV9CTE9DS19TSVpFKHBhcmFtX2Jsb2NrX3NpemUpOworCWhlYWRlci5leHRlbnNpb24gfD0gSVBDX0RPTUFJTihtc2ctPmRvbWFpbik7CiAKIAlkZXZfZGJnKGlwYy0+ZGV2LCAiSW4gJXMgcHJpbWFyeSA9JXggZXh0PSV4XG4iLCBfX2Z1bmNfXywKIAkJCSBoZWFkZXIucHJpbWFyeSwgaGVhZGVyLmV4dGVuc2lvbik7CkBAIC03NDIsNyArNzQ5LDcgQEAKIAkJCSBoZWFkZXIuZXh0ZW5zaW9uKTsKIAlyZXQgPSBzc3RfaXBjX3R4X21lc3NhZ2Vfd2FpdChpcGMsICppcGNfaGVhZGVyLCBOVUxMLCAwLCBOVUxMLCAwKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGlwYy0+ZGV2LCAiaXBjOiBiaW5kL3VuYmluZCBmYWlsZWRlbiIpOworCQlkZXZfZXJyKGlwYy0+ZGV2LCAiaXBjOiBiaW5kL3VuYmluZCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtOTAyLDMgKzkwOSwyNSBAQAogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChza2xfaXBjX2dldF9sYXJnZV9jb25maWcpOworCitpbnQgc2tsX3NzdF9pcGNfbG9hZF9saWJyYXJ5KHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYywKKwkJCQl1OCBkbWFfaWQsIHU4IHRhYmxlX2lkKQoreworCXN0cnVjdCBza2xfaXBjX2hlYWRlciBoZWFkZXIgPSB7MH07CisJdTY0ICppcGNfaGVhZGVyID0gKHU2NCAqKSgmaGVhZGVyKTsKKwlpbnQgcmV0ID0gMDsKKworCWhlYWRlci5wcmltYXJ5ID0gSVBDX01TR19UQVJHRVQoSVBDX0ZXX0dFTl9NU0cpOworCWhlYWRlci5wcmltYXJ5IHw9IElQQ19NU0dfRElSKElQQ19NU0dfUkVRVUVTVCk7CisJaGVhZGVyLnByaW1hcnkgfD0gSVBDX0dMQl9UWVBFKElQQ19HTEJfTE9BRF9MSUJSQVJZKTsKKwloZWFkZXIucHJpbWFyeSB8PSBJUENfTU9EX0lOU1RBTkNFX0lEKHRhYmxlX2lkKTsKKwloZWFkZXIucHJpbWFyeSB8PSBJUENfTU9EX0lEKGRtYV9pZCk7CisKKwlyZXQgPSBzc3RfaXBjX3R4X21lc3NhZ2Vfd2FpdChpcGMsICppcGNfaGVhZGVyLCBOVUxMLCAwLCBOVUxMLCAwKTsKKworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGlwYy0+ZGV2LCAiaXBjOiBsb2FkIGxpYiBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNrbF9zc3RfaXBjX2xvYWRfbGlicmFyeSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWlwYy5oIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC1pcGMuaAppbmRleCAyZTNkNGU4Li4wMzM0ZWQ0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LWlwYy5oCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtaXBjLmgKQEAgLTY2LDcgKzY2LDcgQEAKIAogCS8qIGNhbGxiYWNrIGZvciBtaXNjYmRnZSAqLwogCXZvaWQgKCplbmFibGVfbWlzY2JkY2dlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKLQkvKklzIENHQ1RMLk1JU0NCRENHRSBkaXNhYmxlZCovCisJLyogSXMgQ0dDVEwuTUlTQ0JEQ0dFIGRpc2FibGVkICovCiAJYm9vbCBtaXNjYmRjZ19kaXNhYmxlZDsKIAogCS8qIFBvcHVsYXRlIG1vZHVsZSBpbmZvcm1hdGlvbiAqLwpAQCAtNzUsOCArNzUsMTQgQEAKIAkvKiBJcyBmaXJtd2FyZSBsb2FkZWQgKi8KIAlib29sIGZ3X2xvYWRlZDsKIAorCS8qIGZpcnN0IGJvb3QgPyAqLworCWJvb2wgaXNfZmlyc3RfYm9vdDsKKwogCS8qIG11bHRpLWNvcmUgKi8KIAlzdHJ1Y3Qgc2tsX2RzcF9jb3JlcyBjb3JlczsKKworCS8qIHRwbGcgbWFuaWZlc3QgKi8KKwlzdHJ1Y3Qgc2tsX2Rmd19tYW5pZmVzdCBtYW5pZmVzdDsKIH07CiAKIHN0cnVjdCBza2xfaXBjX2luaXRfaW5zdGFuY2VfbXNnIHsKQEAgLTg1LDYgKzkxLDcgQEAKIAl1MTYgcGFyYW1fZGF0YV9zaXplOwogCXU4IHBwbF9pbnN0YW5jZV9pZDsKIAl1OCBjb3JlX2lkOworCXU4IGRvbWFpbjsKIH07CiAKIHN0cnVjdCBza2xfaXBjX2JpbmRfdW5iaW5kX21zZyB7CkBAIC0xNDUsNiArMTUyLDkgQEAKIGludCBza2xfaXBjX2dldF9sYXJnZV9jb25maWcoc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLAogCQlzdHJ1Y3Qgc2tsX2lwY19sYXJnZV9jb25maWdfbXNnICptc2csIHUzMiAqcGFyYW0pOwogCitpbnQgc2tsX3NzdF9pcGNfbG9hZF9saWJyYXJ5KHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYywKKwkJCXU4IGRtYV9pZCwgdTggdGFibGVfaWQpOworCiB2b2lkIHNrbF9pcGNfaW50X2VuYWJsZShzdHJ1Y3Qgc3N0X2RzcCAqZHNwKTsKIHZvaWQgc2tsX2lwY19vcF9pbnRfZW5hYmxlKHN0cnVjdCBzc3RfZHNwICpjdHgpOwogdm9pZCBza2xfaXBjX29wX2ludF9kaXNhYmxlKHN0cnVjdCBzc3RfZHNwICpjdHgpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC11dGlscy5jIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC11dGlscy5jCmluZGV4IGRkY2I1MmEuLjhkYzAzMDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QtdXRpbHMuYworKysgYi9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LXV0aWxzLmMKQEAgLTI4LDExICsyOCw2IEBACiAvKiBGVyBFeHRlbmRlZCBNYW5pZmVzdCBIZWFkZXIgaWQgPSAkQUUxICovCiAjZGVmaW5lIFNLTF9FWFRfTUFOSUZFU1RfSEVBREVSX01BR0lDICAgMHgzMTQ1NDEyNAogCi1zdHJ1Y3Qgc2tsX2Rmd19tb2R1bGVfbW9kIHsKLQljaGFyIG5hbWVbMTAwXTsKLQlzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGUgc2tsX2Rmd19tb2Q7Ci19OwotCiBzdHJ1Y3QgVVVJRCB7CiAJdTggaWRbMTZdOwogfTsKQEAgLTk5LDEwICs5NCwxNSBAQAogCXUzMiBsb2FkX29mZnNldDsKIH0gX19wYWNrZWQ7CiAKKyNkZWZpbmUgTUFYX0lOU1RBTkNFX0JVRkYgMgorCiBzdHJ1Y3QgdXVpZF9tb2R1bGUgewogCXV1aWRfbGUgdXVpZDsKIAlpbnQgaWQ7CiAJaW50IGlzX2xvYWRhYmxlOworCWludCBtYXhfaW5zdGFuY2U7CisJdTY0IHB2dF9pZFtNQVhfSU5TVEFOQ0VfQlVGRl07CisJaW50ICppbnN0YW5jZV9pZDsKIAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CkBAIC0xMTUsMTMgKzExNSwxMyBAQAogCXUzMiBlbnRyaWVzOwogfTsKIAotaW50IHNuZF9za2xfZ2V0X21vZHVsZV9pbmZvKHN0cnVjdCBza2xfc3N0ICpjdHgsIHU4ICp1dWlkLAotCQkJc3RydWN0IHNrbF9kZndfbW9kdWxlICpkZndfY29uZmlnKQoraW50IHNuZF9za2xfZ2V0X21vZHVsZV9pbmZvKHN0cnVjdCBza2xfc3N0ICpjdHgsCisJCQkJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnKQogewogCXN0cnVjdCB1dWlkX21vZHVsZSAqbW9kdWxlOwogCXV1aWRfbGUgKnV1aWRfbW9kOwogCi0JdXVpZF9tb2QgPSAodXVpZF9sZSAqKXV1aWQ7CisJdXVpZF9tb2QgPSAodXVpZF9sZSAqKW1jb25maWctPmd1aWQ7CiAKIAlpZiAobGlzdF9lbXB0eSgmY3R4LT51dWlkX2xpc3QpKSB7CiAJCWRldl9lcnIoY3R4LT5kZXYsICJNb2R1bGUgbGlzdCBpcyBlbXB0eVxuIik7CkBAIC0xMzAsOCArMTMwLDggQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kdWxlLCAmY3R4LT51dWlkX2xpc3QsIGxpc3QpIHsKIAkJaWYgKHV1aWRfbGVfY21wKCp1dWlkX21vZCwgbW9kdWxlLT51dWlkKSA9PSAwKSB7Ci0JCQlkZndfY29uZmlnLT5tb2R1bGVfaWQgPSBtb2R1bGUtPmlkOwotCQkJZGZ3X2NvbmZpZy0+aXNfbG9hZGFibGUgPSBtb2R1bGUtPmlzX2xvYWRhYmxlOworCQkJbWNvbmZpZy0+aWQubW9kdWxlX2lkID0gbW9kdWxlLT5pZDsKKwkJCW1jb25maWctPmlzX2xvYWRhYmxlID0gbW9kdWxlLT5pc19sb2FkYWJsZTsKIAogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTE0MSwxNSArMTQxLDE1NCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NrbF9nZXRfbW9kdWxlX2luZm8pOwogCitzdGF0aWMgaW50IHNrbF9nZXRfcHZ0aWRfbWFwKHN0cnVjdCB1dWlkX21vZHVsZSAqbW9kdWxlLCBpbnQgaW5zdGFuY2VfaWQpCit7CisJaW50IHB2dF9pZDsKKworCWZvciAocHZ0X2lkID0gMDsgcHZ0X2lkIDwgbW9kdWxlLT5tYXhfaW5zdGFuY2U7IHB2dF9pZCsrKSB7CisJCWlmIChtb2R1bGUtPmluc3RhbmNlX2lkW3B2dF9pZF0gPT0gaW5zdGFuY2VfaWQpCisJCQlyZXR1cm4gcHZ0X2lkOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworaW50IHNrbF9nZXRfcHZ0X2luc3RhbmNlX2lkX21hcChzdHJ1Y3Qgc2tsX3NzdCAqY3R4LAorCQkJCWludCBtb2R1bGVfaWQsIGludCBpbnN0YW5jZV9pZCkKK3sKKwlzdHJ1Y3QgdXVpZF9tb2R1bGUgKm1vZHVsZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kdWxlLCAmY3R4LT51dWlkX2xpc3QsIGxpc3QpIHsKKwkJaWYgKG1vZHVsZS0+aWQgPT0gbW9kdWxlX2lkKQorCQkJcmV0dXJuIHNrbF9nZXRfcHZ0aWRfbWFwKG1vZHVsZSwgaW5zdGFuY2VfaWQpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2tsX2dldF9wdnRfaW5zdGFuY2VfaWRfbWFwKTsKKworc3RhdGljIGlubGluZSBpbnQgc2tsX2dldGlkXzMyKHN0cnVjdCB1dWlkX21vZHVsZSAqbW9kdWxlLCB1NjQgKnZhbCwKKwkJCQlpbnQgd29yZDFfbWFzaywgaW50IHdvcmQyX21hc2spCit7CisJaW50IGluZGV4LCBtYXhfaW5zdCwgcHZ0X2lkOworCXUzMiBtYXNrX3ZhbDsKKworCW1heF9pbnN0ID0gIG1vZHVsZS0+bWF4X2luc3RhbmNlOworCW1hc2tfdmFsID0gKHUzMikoKnZhbCA+PiB3b3JkMV9tYXNrKTsKKworCWlmIChtYXNrX3ZhbCAhPSAweGZmZmZmZmZmKSB7CisJCWluZGV4ID0gZmZ6KG1hc2tfdmFsKTsKKwkJcHZ0X2lkID0gaW5kZXggKyB3b3JkMV9tYXNrICsgd29yZDJfbWFzazsKKwkJaWYgKHB2dF9pZCA8PSAobWF4X2luc3QgLSAxKSkgeworCQkJKnZhbCB8PSAxIDw8IChpbmRleCArIHdvcmQxX21hc2spOworCQkJcmV0dXJuIHB2dF9pZDsKKwkJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW5saW5lIGludCBza2xfcHZ0aWRfMTI4KHN0cnVjdCB1dWlkX21vZHVsZSAqbW9kdWxlKQoreworCWludCBqLCBpLCB3b3JkMV9tYXNrLCB3b3JkMl9tYXNrID0gMCwgcHZ0X2lkOworCisJZm9yIChqID0gMDsgaiA8IE1BWF9JTlNUQU5DRV9CVUZGOyBqKyspIHsKKwkJd29yZDFfbWFzayA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJcHZ0X2lkID0gc2tsX2dldGlkXzMyKG1vZHVsZSwgJm1vZHVsZS0+cHZ0X2lkW2pdLAorCQkJCQkJd29yZDFfbWFzaywgd29yZDJfbWFzayk7CisJCQlpZiAocHZ0X2lkID49IDApCisJCQkJcmV0dXJuIHB2dF9pZDsKKworCQkJd29yZDFfbWFzayArPSAzMjsKKwkJCWlmICgod29yZDFfbWFzayArIHdvcmQyX21hc2spID49IG1vZHVsZS0+bWF4X2luc3RhbmNlKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJd29yZDJfbWFzayArPSA2NDsKKwkJaWYgKHdvcmQyX21hc2sgPj0gbW9kdWxlLT5tYXhfaW5zdGFuY2UpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiBza2xfZ2V0X3B2dF9pZDogZ2VuZXJhdGUgYSBwcml2YXRlIGlkIGZvciB1c2UgYXMgbW9kdWxlIGlkCisgKgorICogQGN0eDogZHJpdmVyIGNvbnRleHQKKyAqIEBtY29uZmlnOiBtb2R1bGUgY29uZmlndXJhdGlvbiBkYXRhCisgKgorICogVGhpcyBnZW5lcmF0ZXMgYSAxMjggYml0IHByaXZhdGUgdW5pcXVlIGlkIGZvciBhIG1vZHVsZSBUWVBFIHNvIHRoYXQKKyAqIG1vZHVsZSBpbnN0YW5jZSBpcyB1bmlxdWUKKyAqLworaW50IHNrbF9nZXRfcHZ0X2lkKHN0cnVjdCBza2xfc3N0ICpjdHgsIHN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZykKK3sKKwlzdHJ1Y3QgdXVpZF9tb2R1bGUgKm1vZHVsZTsKKwl1dWlkX2xlICp1dWlkX21vZDsKKwlpbnQgcHZ0X2lkOworCisJdXVpZF9tb2QgPSAodXVpZF9sZSAqKW1jb25maWctPmd1aWQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZHVsZSwgJmN0eC0+dXVpZF9saXN0LCBsaXN0KSB7CisJCWlmICh1dWlkX2xlX2NtcCgqdXVpZF9tb2QsIG1vZHVsZS0+dXVpZCkgPT0gMCkgeworCisJCQlwdnRfaWQgPSBza2xfcHZ0aWRfMTI4KG1vZHVsZSk7CisJCQlpZiAocHZ0X2lkID49IDApIHsKKwkJCQltb2R1bGUtPmluc3RhbmNlX2lkW3B2dF9pZF0gPQorCQkJCQkJbWNvbmZpZy0+aWQuaW5zdGFuY2VfaWQ7CisJCQkJcmV0dXJuIHB2dF9pZDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2tsX2dldF9wdnRfaWQpOworCisvKioKKyAqIHNrbF9wdXRfcHZ0X2lkOiBmcmVlIHVwIHRoZSBwcml2YXRlIGlkIGFsbG9jYXRlZAorICoKKyAqIEBjdHg6IGRyaXZlciBjb250ZXh0CisgKiBAbWNvbmZpZzogbW9kdWxlIGNvbmZpZ3VyYXRpb24gZGF0YQorICoKKyAqIFRoaXMgZnJlZXMgYSAxMjggYml0IHByaXZhdGUgdW5pcXVlIGlkIHByZXZpb3VzbHkgZ2VuZXJhdGVkCisgKi8KK2ludCBza2xfcHV0X3B2dF9pZChzdHJ1Y3Qgc2tsX3NzdCAqY3R4LCBzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcpCit7CisJaW50IGk7CisJdXVpZF9sZSAqdXVpZF9tb2Q7CisJc3RydWN0IHV1aWRfbW9kdWxlICptb2R1bGU7CisKKwl1dWlkX21vZCA9ICh1dWlkX2xlICopbWNvbmZpZy0+Z3VpZDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZHVsZSwgJmN0eC0+dXVpZF9saXN0LCBsaXN0KSB7CisJCWlmICh1dWlkX2xlX2NtcCgqdXVpZF9tb2QsIG1vZHVsZS0+dXVpZCkgPT0gMCkgeworCisJCQlpZiAobWNvbmZpZy0+aWQucHZ0X2lkICE9IDApCisJCQkJaSA9IChtY29uZmlnLT5pZC5wdnRfaWQpIC8gNjQ7CisJCQllbHNlCisJCQkJaSA9IDA7CisKKwkJCW1vZHVsZS0+cHZ0X2lkW2ldICY9IH4oMSA8PCAobWNvbmZpZy0+aWQucHZ0X2lkKSk7CisJCQltY29uZmlnLT5pZC5wdnRfaWQgPSAtMTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChza2xfcHV0X3B2dF9pZCk7CisKIC8qCiAgKiBQYXJzZSB0aGUgZmlybXdhcmUgYmluYXJ5IHRvIGdldCB0aGUgVVVJRCwgbW9kdWxlIGlkCiAgKiBhbmQgbG9hZGFibGUgZmxhZ3MKICAqLwotaW50IHNuZF9za2xfcGFyc2VfdXVpZHMoc3RydWN0IHNzdF9kc3AgKmN0eCwgdW5zaWduZWQgaW50IG9mZnNldCkKK2ludCBzbmRfc2tsX3BhcnNlX3V1aWRzKHN0cnVjdCBzc3RfZHNwICpjdHgsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsCisJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IGFkc3BfZndfaGRyICphZHNwX2hkcjsKIAlzdHJ1Y3QgYWRzcF9tb2R1bGVfZW50cnkgKm1vZF9lbnRyeTsKLQlpbnQgaSwgbnVtX2VudHJ5OworCWludCBpLCBudW1fZW50cnksIHNpemU7CiAJdXVpZF9sZSAqdXVpZF9iaW47CiAJY29uc3QgY2hhciAqYnVmOwogCXN0cnVjdCBza2xfc3N0ICpza2wgPSBjdHgtPnRocmVhZF9jb250ZXh0OwpAQCAtMTU4LDggKzI5Nyw4IEBACiAJdW5zaWduZWQgaW50IHNhZmVfZmlsZTsKIAogCS8qIEdldCB0aGUgRlcgcG9pbnRlciB0byBkZXJpdmUgQURTUCBoZWFkZXIgKi8KLQlzdHJpcHBlZF9mdy5kYXRhID0gY3R4LT5mdy0+ZGF0YTsKLQlzdHJpcHBlZF9mdy5zaXplID0gY3R4LT5mdy0+c2l6ZTsKKwlzdHJpcHBlZF9mdy5kYXRhID0gZnctPmRhdGE7CisJc3RyaXBwZWRfZncuc2l6ZSA9IGZ3LT5zaXplOwogCiAJc2tsX2RzcF9zdHJpcF9leHRlbmRlZF9tYW5pZmVzdCgmc3RyaXBwZWRfZncpOwogCkBAIC0yMTAsOCArMzQ5LDE1IEBACiAJCXV1aWRfYmluID0gKHV1aWRfbGUgKiltb2RfZW50cnktPnV1aWQuaWQ7CiAJCW1lbWNweSgmbW9kdWxlLT51dWlkLCB1dWlkX2Jpbiwgc2l6ZW9mKG1vZHVsZS0+dXVpZCkpOwogCi0JCW1vZHVsZS0+aWQgPSBpOworCQltb2R1bGUtPmlkID0gKGkgfCAoaW5kZXggPDwgMTIpKTsKIAkJbW9kdWxlLT5pc19sb2FkYWJsZSA9IG1vZF9lbnRyeS0+dHlwZS5sb2FkX3R5cGU7CisJCW1vZHVsZS0+bWF4X2luc3RhbmNlID0gbW9kX2VudHJ5LT5pbnN0YW5jZV9tYXhfY291bnQ7CisJCXNpemUgPSBzaXplb2YoaW50KSAqIG1vZF9lbnRyeS0+aW5zdGFuY2VfbWF4X2NvdW50OworCQltb2R1bGUtPmluc3RhbmNlX2lkID0gZGV2bV9remFsbG9jKGN0eC0+ZGV2LCBzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtb2R1bGUtPmluc3RhbmNlX2lkKSB7CisJCQlrZnJlZShtb2R1bGUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KIAogCQlsaXN0X2FkZF90YWlsKCZtb2R1bGUtPmxpc3QsICZza2wtPnV1aWRfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QuYyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC1zc3QuYwppbmRleCA1ODhmODk5Li44ZmMzMTc4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtc3N0LmMKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXNzdC5jCkBAIC04OCwxMyArODgsMTUgQEAKIAkJfQogCX0KIAotCXJldCA9IHNuZF9za2xfcGFyc2VfdXVpZHMoY3R4LCBTS0xfQURTUF9GV19CSU5fSERSX09GRlNFVCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihjdHgtPmRldiwKLQkJCQkiVVVJRCBwYXJzaW5nIGVycjogJWRcbiIsIHJldCk7Ci0JCXJlbGVhc2VfZmlybXdhcmUoY3R4LT5mdyk7Ci0JCXNrbF9kc3BfZGlzYWJsZV9jb3JlKGN0eCwgU0tMX0RTUF9DT1JFMF9NQVNLKTsKLQkJcmV0dXJuIHJldDsKKwkvKiBwcmFzZSB1dWlkcyBvbiBmaXJzdCBib290ICovCisJaWYgKHNrbC0+aXNfZmlyc3RfYm9vdCkgeworCQlyZXQgPSBzbmRfc2tsX3BhcnNlX3V1aWRzKGN0eCwgY3R4LT5mdywgU0tMX0FEU1BfRldfQklOX0hEUl9PRkZTRVQsIDApOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihjdHgtPmRldiwgIlVVSUQgcGFyc2luZyBlcnI6ICVkXG4iLCByZXQpOworCQkJcmVsZWFzZV9maXJtd2FyZShjdHgtPmZ3KTsKKwkJCXNrbF9kc3BfZGlzYWJsZV9jb3JlKGN0eCwgU0tMX0RTUF9DT1JFMF9NQVNLKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAKIAkvKiBjaGVjayBmb3IgZXh0ZW5kZWQgbWFuaWZlc3QgKi8KQEAgLTEwNSwxMyArMTA3LDEzIEBACiAKIAlyZXQgPSBza2xfZHNwX2Jvb3QoY3R4KTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAiQm9vdCBkc3AgY29yZSBmYWlsZWQgcmV0OiAlZCIsIHJldCk7CisJCWRldl9lcnIoY3R4LT5kZXYsICJCb290IGRzcCBjb3JlIGZhaWxlZCByZXQ6ICVkXG4iLCByZXQpOwogCQlnb3RvIHNrbF9sb2FkX2Jhc2VfZmlybXdhcmVfZmFpbGVkOwogCX0KIAogCXJldCA9IHNrbF9jbGRtYV9wcmVwYXJlKGN0eCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihjdHgtPmRldiwgIkNMIGRtYSBwcmVwYXJlIGZhaWxlZCA6ICVkIiwgcmV0KTsKKwkJZGV2X2VycihjdHgtPmRldiwgIkNMIGRtYSBwcmVwYXJlIGZhaWxlZCA6ICVkXG4iLCByZXQpOwogCQlnb3RvIHNrbF9sb2FkX2Jhc2VfZmlybXdhcmVfZmFpbGVkOwogCX0KIApAQCAtNDg0LDI2ICs0ODYsMzMgQEAKIAkJcmV0dXJuIHJldDsKIAogCXNrbC0+Y29yZXMuY291bnQgPSAyOwotCi0JcmV0ID0gc3N0LT5md19vcHMubG9hZF9mdyhzc3QpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiTG9hZCBiYXNlIGZ3IGZhaWxlZCA6ICVkIiwgcmV0KTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCXNrbF9kc3BfaW5pdF9jb3JlX3N0YXRlKHNzdCk7CisJc2tsLT5pc19maXJzdF9ib290ID0gdHJ1ZTsKIAogCWlmIChkc3ApCiAJCSpkc3AgPSBza2w7CiAKIAlyZXR1cm4gcmV0OwotCi1jbGVhbnVwOgotCXNrbF9zc3RfZHNwX2NsZWFudXAoZGV2LCBza2wpOwotCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChza2xfc3N0X2RzcF9pbml0KTsKIAoraW50IHNrbF9zc3RfaW5pdF9mdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfc3N0ICpjdHgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gY3R4LT5kc3A7CisKKwlyZXQgPSBzc3QtPmZ3X29wcy5sb2FkX2Z3KHNzdCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJMb2FkIGJhc2UgZncgZmFpbGVkIDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc2tsX2RzcF9pbml0X2NvcmVfc3RhdGUoc3N0KTsKKwljdHgtPmlzX2ZpcnN0X2Jvb3QgPSBmYWxzZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2tsX3NzdF9pbml0X2Z3KTsKKwogdm9pZCBza2xfc3N0X2RzcF9jbGVhbnVwKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCkKIHsKIAlza2xfY2xlYXJfbW9kdWxlX3RhYmxlKGN0eC0+ZHNwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10b3BvbG9neS5jIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRvcG9sb2d5LmMKaW5kZXggY2MwMTUwZi4uYjViMTkzNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRvcG9sb2d5LmMKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLXRvcG9sb2d5LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy10b3BvbG9neS5oPgorI2luY2x1ZGUgPHVhcGkvc291bmQvc25kX3NzdF90b2tlbnMuaD4KICNpbmNsdWRlICJza2wtc3N0LWRzcC5oIgogI2luY2x1ZGUgInNrbC1zc3QtaXBjLmgiCiAjaW5jbHVkZSAic2tsLXRvcG9sb2d5LmgiCkBAIC0zMiw2ICszMyw4IEBACiAjZGVmaW5lIFNLTF9DSF9GSVhVUF9NQVNLCQkoMSA8PCAwKQogI2RlZmluZSBTS0xfUkFURV9GSVhVUF9NQVNLCQkoMSA8PCAxKQogI2RlZmluZSBTS0xfRk1UX0ZJWFVQX01BU0sJCSgxIDw8IDIpCisjZGVmaW5lIFNLTF9JTl9ESVJfQklUX01BU0sJCUJJVCgwKQorI2RlZmluZSBTS0xfUElOX0NPVU5UX01BU0sJCUdFTk1BU0soNywgNCkKIAogLyoKICAqIFNLTCBEU1AgZHJpdmVyIG1vZGVsbGluZyB1c2VzIG9ubHkgZmV3IERBUE0gd2lkZ2V0cyBzbyBmb3IgcmVzdCB3ZSB3aWxsCkBAIC00NzMsNiArNDc2LDE0IEBACiAJCXcgPSB3X21vZHVsZS0+dzsKIAkJbWNvbmZpZyA9IHctPnByaXY7CiAKKwkJLyogY2hlY2sgaWYgbW9kdWxlIGlkcyBhcmUgcG9wdWxhdGVkICovCisJCWlmIChtY29uZmlnLT5pZC5tb2R1bGVfaWQgPCAwKSB7CisJCQlkZXZfZXJyKHNrbC0+c2tsX3NzdC0+ZGV2LAorCQkJCQkibW9kdWxlICVwVUwgaWQgbm90IHBvcHVsYXRlZFxuIiwKKwkJCQkJKHV1aWRfbGUgKiltY29uZmlnLT5ndWlkKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKIAkJLyogY2hlY2sgcmVzb3VyY2UgYXZhaWxhYmxlICovCiAJCWlmICghc2tsX2lzX3BpcGVfbWNwc19hdmFpbChza2wsIG1jb25maWcpKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC00OTQsMTIgKzUwNSwxNSBAQAogCQkgKiBGRS9CRSBwYXJhbXMKIAkJICovCiAJCXNrbF90cGxnX3VwZGF0ZV9tb2R1bGVfcGFyYW1zKHcsIGN0eCk7Ci0KKwkJbWNvbmZpZy0+aWQucHZ0X2lkID0gc2tsX2dldF9wdnRfaWQoY3R4LCBtY29uZmlnKTsKKwkJaWYgKG1jb25maWctPmlkLnB2dF9pZCA8IDApCisJCQlyZXR1cm4gcmV0OwogCQlza2xfdHBsZ19zZXRfbW9kdWxlX2luaXRfZGF0YSh3KTsKIAkJcmV0ID0gc2tsX2luaXRfbW9kdWxlKGN0eCwgbWNvbmZpZyk7Ci0JCWlmIChyZXQgPCAwKQorCQlpZiAocmV0IDwgMCkgeworCQkJc2tsX3B1dF9wdnRfaWQoY3R4LCBtY29uZmlnKTsKIAkJCXJldHVybiByZXQ7Ci0KKwkJfQogCQlza2xfdHBsZ19hbGxvY19waXBlX21jcHMoc2tsLCBtY29uZmlnKTsKIAkJcmV0ID0gc2tsX3RwbGdfc2V0X21vZHVsZV9wYXJhbXModywgY3R4KTsKIAkJaWYgKHJldCA8IDApCkBAIC01MTIsNiArNTI2LDcgQEAKIHN0YXRpYyBpbnQgc2tsX3RwbGdfdW5sb2FkX3BpcGVfbW9kdWxlcyhzdHJ1Y3Qgc2tsX3NzdCAqY3R4LAogCSBzdHJ1Y3Qgc2tsX3BpcGUgKnBpcGUpCiB7CisJaW50IHJldDsKIAlzdHJ1Y3Qgc2tsX3BpcGVfbW9kdWxlICp3X21vZHVsZSA9IE5VTEw7CiAJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnID0gTlVMTDsKIApAQCAtNTE5LDkgKzUzNCwxMyBAQAogCQltY29uZmlnICA9IHdfbW9kdWxlLT53LT5wcml2OwogCiAJCWlmIChtY29uZmlnLT5pc19sb2FkYWJsZSAmJiBjdHgtPmRzcC0+Zndfb3BzLnVubG9hZF9tb2QgJiYKLQkJCW1jb25maWctPm1fc3RhdGUgPiBTS0xfTU9EVUxFX1VOSU5JVCkKLQkJCXJldHVybiBjdHgtPmRzcC0+Zndfb3BzLnVubG9hZF9tb2QoY3R4LT5kc3AsCisJCQltY29uZmlnLT5tX3N0YXRlID4gU0tMX01PRFVMRV9VTklOSVQpIHsKKwkJCXJldCA9IGN0eC0+ZHNwLT5md19vcHMudW5sb2FkX21vZChjdHgtPmRzcCwKIAkJCQkJCW1jb25maWctPmlkLm1vZHVsZV9pZCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlza2xfcHV0X3B2dF9pZChjdHgsIG1jb25maWcpOwogCX0KIAogCS8qIG5vIG1vZHVsZXMgdG8gdW5sb2FkIGluIHRoaXMgcGF0aCwgc28gcmV0dXJuICovCkBAIC01ODgsNiArNjA3LDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2tsX2ZpbGxfc2lua19pbnN0YW5jZV9pZChzdHJ1Y3Qgc2tsX3NzdCAqY3R4LAorCQkJCXN0cnVjdCBza2xfYWxnb19kYXRhICphbGdfZGF0YSkKK3sKKwlzdHJ1Y3Qgc2tsX2twYl9wYXJhbXMgKnBhcmFtcyA9IChzdHJ1Y3Qgc2tsX2twYl9wYXJhbXMgKilhbGdfZGF0YS0+cGFyYW1zOworCXN0cnVjdCBza2xfbW9kX2luc3RfbWFwICppbnN0OworCWludCBpLCBwdnRfaWQ7CisKKwlpbnN0ID0gcGFyYW1zLT5tYXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFyYW1zLT5udW1fbW9kdWxlczsgaSsrKSB7CisJCXB2dF9pZCA9IHNrbF9nZXRfcHZ0X2luc3RhbmNlX2lkX21hcChjdHgsCisJCQkJCWluc3QtPm1vZF9pZCwgaW5zdC0+aW5zdF9pZCk7CisJCWlmIChwdnRfaWQgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWluc3QtPmluc3RfaWQgPSBwdnRfaWQ7CisJCWluc3QrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBTb21lIG1vZHVsZXMgcmVxdWlyZSBwYXJhbXMgdG8gYmUgc2V0IGFmdGVyIHRoZSBtb2R1bGUgaXMgYm91bmQgdG8KICAqIGFsbCBwaW5zIGNvbm5lY3RlZC4KQEAgLTYzNiw2ICs2NzUsOCBAQAogCQkJYmMgPSAoc3RydWN0IHNrbF9hbGdvX2RhdGEgKilzYi0+ZG9iai5wcml2YXRlOwogCiAJCQlpZiAoYmMtPnNldF9wYXJhbXMgPT0gU0tMX1BBUkFNX0JJTkQpIHsKKwkJCQlpZiAobWNvbmZpZy0+bV90eXBlID09IFNLTF9NT0RVTEVfVFlQRV9LUEIpCisJCQkJCXNrbF9maWxsX3NpbmtfaW5zdGFuY2VfaWQoY3R4LCBiYyk7CiAJCQkJcmV0ID0gc2tsX3NldF9tb2R1bGVfcGFyYW1zKGN0eCwKIAkJCQkJCSh1MzIgKiliYy0+cGFyYW1zLCBiYy0+bWF4LAogCQkJCQkJYmMtPnBhcmFtX2lkLCBtY29uZmlnKTsKQEAgLTE0NjAsODUgKzE1MDEsNTcwIEBACiAJCQkJCXNrbF90cGxnX3Rsdl9jb250cm9sX3NldH0sCiB9OwogCi0vKgotICogVGhlIHRvcG9sb2d5IGJpbmFyeSBwYXNzZXMgdGhlIHBpbiBpbmZvIGZvciBhIG1vZHVsZSBzbyBpbml0aWFsaXplIHRoZSBwaW4KLSAqIGluZm8gcGFzc2VkIGludG8gbW9kdWxlIGluc3RhbmNlCi0gKi8KLXN0YXRpYyB2b2lkIHNrbF9maWxsX21vZHVsZV9waW5faW5mbyhzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGVfcGluICpkZndfcGluLAotCQkJCQkJc3RydWN0IHNrbF9tb2R1bGVfcGluICptX3BpbiwKLQkJCQkJCWJvb2wgaXNfZHluYW1pYywgaW50IG1heF9waW4pCitzdGF0aWMgaW50IHNrbF90cGxnX2ZpbGxfcGlwZV90a24oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IHNrbF9waXBlICpwaXBlLCB1MzIgdGtuLAorCQkJdTMyIHRrbl92YWwpCiB7Ci0JaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbWF4X3BpbjsgaSsrKSB7Ci0JCW1fcGluW2ldLmlkLm1vZHVsZV9pZCA9IGRmd19waW5baV0ubW9kdWxlX2lkOwotCQltX3BpbltpXS5pZC5pbnN0YW5jZV9pZCA9IGRmd19waW5baV0uaW5zdGFuY2VfaWQ7Ci0JCW1fcGluW2ldLmluX3VzZSA9IGZhbHNlOwotCQltX3BpbltpXS5pc19keW5hbWljID0gaXNfZHluYW1pYzsKLQkJbV9waW5baV0ucGluX3N0YXRlID0gU0tMX1BJTl9VTkJJTkQ7CisJc3dpdGNoICh0a24pIHsKKwljYXNlIFNLTF9US05fVTMyX1BJUEVfQ09OTl9UWVBFOgorCQlwaXBlLT5jb25uX3R5cGUgPSB0a25fdmFsOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfUElQRV9QUklPUklUWToKKwkJcGlwZS0+cGlwZV9wcmlvcml0eSA9IHRrbl92YWw7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9QSVBFX01FTV9QR1M6CisJCXBpcGUtPm1lbW9yeV9wYWdlcyA9IHRrbl92YWw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJUb2tlbiBub3QgaGFuZGxlZCAlZFxuIiwgdGtuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBBZGQgcGlwZWxpbmUgZnJvbSB0b3BvbG9neSBiaW5hcnkgaW50byBkcml2ZXIgcGlwZWxpbmUgbGlzdAotICoKLSAqIElmIGFscmVhZHkgYWRkZWQgd2UgcmV0dXJuIHRoYXQgaW5zdGFuY2UKLSAqIE90aGVyd2lzZSB3ZSBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgYW5kIGFkZCBpbnRvIGRyaXZlciBsaXN0CisgKiBBZGQgcGlwZWxpbmUgYnkgcGFyc2luZyB0aGUgcmVsZXZhbnQgdG9rZW5zCisgKiBSZXR1cm4gYW4gZXhpc3RpbmcgcGlwZSBpZiB0aGUgcGlwZSBhbHJlYWR5IGV4aXN0cy4KICAqLwotc3RhdGljIHN0cnVjdCBza2xfcGlwZSAqc2tsX3RwbGdfYWRkX3BpcGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJc3RydWN0IHNrbCAqc2tsLCBzdHJ1Y3Qgc2tsX2Rmd19waXBlICpkZndfcGlwZSkKK3N0YXRpYyBpbnQgc2tsX3RwbGdfYWRkX3BpcGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcsIHN0cnVjdCBza2wgKnNrbCwKKwkJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfdmFsdWVfZWxlbSAqdGtuX2VsZW0pCiB7CiAJc3RydWN0IHNrbF9waXBlbGluZSAqcHBsOwogCXN0cnVjdCBza2xfcGlwZSAqcGlwZTsKIAlzdHJ1Y3Qgc2tsX3BpcGVfcGFyYW1zICpwYXJhbXM7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBwbCwgJnNrbC0+cHBsX2xpc3QsIG5vZGUpIHsKLQkJaWYgKHBwbC0+cGlwZS0+cHBsX2lkID09IGRmd19waXBlLT5waXBlX2lkKQotCQkJcmV0dXJuIHBwbC0+cGlwZTsKKwkJaWYgKHBwbC0+cGlwZS0+cHBsX2lkID09IHRrbl9lbGVtLT52YWx1ZSkgeworCQkJbWNvbmZpZy0+cGlwZSA9IHBwbC0+cGlwZTsKKwkJCXJldHVybiBFRVhJU1Q7CisJCX0KIAl9CiAKIAlwcGwgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBwbCksIEdGUF9LRVJORUwpOwogCWlmICghcHBsKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlwaXBlID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwaXBlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwaXBlKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlwYXJhbXMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBhcmFtcyksIEdGUF9LRVJORUwpOwogCWlmICghcGFyYW1zKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlwaXBlLT5wcGxfaWQgPSBkZndfcGlwZS0+cGlwZV9pZDsKLQlwaXBlLT5tZW1vcnlfcGFnZXMgPSBkZndfcGlwZS0+bWVtb3J5X3BhZ2VzOwotCXBpcGUtPnBpcGVfcHJpb3JpdHkgPSBkZndfcGlwZS0+cGlwZV9wcmlvcml0eTsKLQlwaXBlLT5jb25uX3R5cGUgPSBkZndfcGlwZS0+Y29ubl90eXBlOwotCXBpcGUtPnN0YXRlID0gU0tMX1BJUEVfSU5WQUxJRDsKIAlwaXBlLT5wX3BhcmFtcyA9IHBhcmFtczsKKwlwaXBlLT5wcGxfaWQgPSB0a25fZWxlbS0+dmFsdWU7CiAJSU5JVF9MSVNUX0hFQUQoJnBpcGUtPndfbGlzdCk7CiAKIAlwcGwtPnBpcGUgPSBwaXBlOwogCWxpc3RfYWRkKCZwcGwtPm5vZGUsICZza2wtPnBwbF9saXN0KTsKIAotCXJldHVybiBwcGwtPnBpcGU7CisJbWNvbmZpZy0+cGlwZSA9IHBpcGU7CisJbWNvbmZpZy0+cGlwZS0+c3RhdGUgPSBTS0xfUElQRV9JTlZBTElEOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNrbF90cGxnX2ZpbGxfZm10KHN0cnVjdCBza2xfbW9kdWxlX2ZtdCAqZHN0X2ZtdCwKLQkJCQlzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGVfZm10ICpzcmNfZm10LAotCQkJCWludCBwaW5zKQorc3RhdGljIGludCBza2xfdHBsZ19maWxsX3BpbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiB0a24sCisJCQlzdHJ1Y3Qgc2tsX21vZHVsZV9waW4gKm1fcGluLAorCQkJaW50IHBpbl9pbmRleCwgdTMyIHZhbHVlKQoreworCXN3aXRjaCAodGtuKSB7CisJY2FzZSBTS0xfVEtOX1UzMl9QSU5fTU9EX0lEOgorCQltX3BpbltwaW5faW5kZXhdLmlkLm1vZHVsZV9pZCA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfUElOX0lOU1RfSUQ6CisJCW1fcGluW3Bpbl9pbmRleF0uaWQuaW5zdGFuY2VfaWQgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIiVkIE5vdCBhIHBpbiB0b2tlblxuIiwgdmFsdWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBhcnNlIGZvciBwaW4gY29uZmlnIHNwZWNpZmljIHRva2VucyB0byBmaWxsIHVwIHRoZQorICogbW9kdWxlIHByaXZhdGUgZGF0YQorICovCitzdGF0aWMgaW50IHNrbF90cGxnX2ZpbGxfcGluc19pbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnLAorCQlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl92YWx1ZV9lbGVtICp0a25fZWxlbSwKKwkJaW50IGRpciwgaW50IHBpbl9jb3VudCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBza2xfbW9kdWxlX3BpbiAqbV9waW47CisKKwlzd2l0Y2ggKGRpcikgeworCWNhc2UgU0tMX0RJUl9JTjoKKwkJbV9waW4gPSBtY29uZmlnLT5tX2luX3BpbjsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9ESVJfT1VUOgorCQltX3BpbiA9IG1jb25maWctPm1fb3V0X3BpbjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIkludmFsaWQgZGlyZWN0aW9uIHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gc2tsX3RwbGdfZmlsbF9waW4oZGV2LCB0a25fZWxlbS0+dG9rZW4sCisJCQltX3BpbiwgcGluX2NvdW50LCB0a25fZWxlbS0+dmFsdWUpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltX3BpbltwaW5fY291bnRdLmluX3VzZSA9IGZhbHNlOworCW1fcGluW3Bpbl9jb3VudF0ucGluX3N0YXRlID0gU0tMX1BJTl9VTkJJTkQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZpbGwgdXAgaW5wdXQvb3V0cHV0IG1vZHVsZSBjb25maWcgZm9ybWF0IGJhc2VkCisgKiBvbiB0aGUgZGlyZWN0aW9uCisgKi8KK3N0YXRpYyBpbnQgc2tsX3RwbGdfZmlsbF9mbXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3Qgc2tsX21vZHVsZV9jZmcgKm1jb25maWcsCXUzMiB0a24sCisJCXUzMiB2YWx1ZSwgdTMyIGRpciwgdTMyIHBpbl9jb3VudCkKK3sKKwlzdHJ1Y3Qgc2tsX21vZHVsZV9mbXQgKmRzdF9mbXQ7CisKKwlzd2l0Y2ggKGRpcikgeworCWNhc2UgU0tMX0RJUl9JTjoKKwkJZHN0X2ZtdCA9IG1jb25maWctPmluX2ZtdDsKKwkJZHN0X2ZtdCArPSBwaW5fY291bnQ7CisJCWJyZWFrOworCisJY2FzZSBTS0xfRElSX09VVDoKKwkJZHN0X2ZtdCA9IG1jb25maWctPm91dF9mbXQ7CisJCWRzdF9mbXQgKz0gcGluX2NvdW50OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiSW52YWxpZCBkaXJlY3Rpb24gdmFsdWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHRrbikgeworCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0NIOgorCQlkc3RfZm10LT5jaGFubmVscyAgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9GUkVROgorCQlkc3RfZm10LT5zX2ZyZXEgPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9CSVRfREVQVEg6CisJCWRzdF9mbXQtPmJpdF9kZXB0aCA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfRk1UX1NBTVBMRV9TSVpFOgorCQlkc3RfZm10LT52YWxpZF9iaXRfZGVwdGggPSB2YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9DSF9DT05GSUc6CisJCWRzdF9mbXQtPmNoX2NmZyA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0lOVEVSTEVBVkU6CisJCWRzdF9mbXQtPmludGVybGVhdmluZ19zdHlsZSA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfRk1UX1NBTVBMRV9UWVBFOgorCQlkc3RfZm10LT5zYW1wbGVfdHlwZSA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0NIX01BUDoKKwkJZHN0X2ZtdC0+Y2hfbWFwID0gdmFsdWU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJJbnZhbGlkIHRva2VuICVkXG4iLCB0a24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBza2xfdHBsZ19nZXRfdXVpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZywKKwkgICAgICBzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl91dWlkX2VsZW0gKnV1aWRfdGtuKQoreworCWlmICh1dWlkX3Rrbi0+dG9rZW4gPT0gU0tMX1RLTl9VVUlEKQorCQltZW1jcHkoJm1jb25maWctPmd1aWQsICZ1dWlkX3Rrbi0+dXVpZCwgMTYpOworCWVsc2UgeworCQlkZXZfZXJyKGRldiwgIk5vdCBhbiBVVUlEIHRva2VuIHRrbiAlZFxuIiwgdXVpZF90a24tPnRva2VuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNrbF90cGxnX2ZpbGxfcGluX2R5bmFtaWNfdmFsKAorCQlzdHJ1Y3Qgc2tsX21vZHVsZV9waW4gKm1waW4sIHUzMiBwaW5fY291bnQsIHUzMiB2YWx1ZSkKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBwaW5zOyBpKyspIHsKLQkJZHN0X2ZtdFtpXS5jaGFubmVscyAgPSBzcmNfZm10W2ldLmNoYW5uZWxzOwotCQlkc3RfZm10W2ldLnNfZnJlcSA9IHNyY19mbXRbaV0uZnJlcTsKLQkJZHN0X2ZtdFtpXS5iaXRfZGVwdGggPSBzcmNfZm10W2ldLmJpdF9kZXB0aDsKLQkJZHN0X2ZtdFtpXS52YWxpZF9iaXRfZGVwdGggPSBzcmNfZm10W2ldLnZhbGlkX2JpdF9kZXB0aDsKLQkJZHN0X2ZtdFtpXS5jaF9jZmcgPSBzcmNfZm10W2ldLmNoX2NmZzsKLQkJZHN0X2ZtdFtpXS5jaF9tYXAgPSBzcmNfZm10W2ldLmNoX21hcDsKLQkJZHN0X2ZtdFtpXS5pbnRlcmxlYXZpbmdfc3R5bGUgPSBzcmNfZm10W2ldLmludGVybGVhdmluZ19zdHlsZTsKLQkJZHN0X2ZtdFtpXS5zYW1wbGVfdHlwZSA9IHNyY19mbXRbaV0uc2FtcGxlX3R5cGU7CisJZm9yIChpID0gMDsgaSA8IHBpbl9jb3VudDsgaSsrKQorCQltcGluW2ldLmlzX2R5bmFtaWMgPSB2YWx1ZTsKK30KKworLyoKKyAqIFBhcnNlIHRva2VucyB0byBmaWxsIHVwIHRoZSBtb2R1bGUgcHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbnQgc2tsX3RwbGdfZ2V0X3Rva2VuKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfdmFsdWVfZWxlbSAqdGtuX2VsZW0sCisJCXN0cnVjdCBza2wgKnNrbCwgc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnKQoreworCWludCB0a25fY291bnQgPSAwOworCWludCByZXQ7CisJc3RhdGljIGludCBpc19waXBlX2V4aXN0czsKKwlzdGF0aWMgaW50IHBpbl9pbmRleCwgZGlyOworCisJaWYgKHRrbl9lbGVtLT50b2tlbiA+IFNLTF9US05fTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAodGtuX2VsZW0tPnRva2VuKSB7CisJY2FzZSBTS0xfVEtOX1U4X0lOX1FVRVVFX0NPVU5UOgorCQltY29uZmlnLT5tYXhfaW5fcXVldWUgPSB0a25fZWxlbS0+dmFsdWU7CisJCW1jb25maWctPm1faW5fcGluID0gZGV2bV9remFsbG9jKGRldiwgbWNvbmZpZy0+bWF4X2luX3F1ZXVlICoKKwkJCQkJc2l6ZW9mKCptY29uZmlnLT5tX2luX3BpbiksCisJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIW1jb25maWctPm1faW5fcGluKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVThfT1VUX1FVRVVFX0NPVU5UOgorCQltY29uZmlnLT5tYXhfb3V0X3F1ZXVlID0gdGtuX2VsZW0tPnZhbHVlOworCQltY29uZmlnLT5tX291dF9waW4gPSBkZXZtX2t6YWxsb2MoZGV2LCBtY29uZmlnLT5tYXhfb3V0X3F1ZXVlICoKKwkJCQkJc2l6ZW9mKCptY29uZmlnLT5tX291dF9waW4pLAorCQkJCQlHRlBfS0VSTkVMKTsKKworCQlpZiAoIW1jb25maWctPm1fb3V0X3BpbikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1U4X0RZTl9JTl9QSU46CisJCWlmICghbWNvbmZpZy0+bV9pbl9waW4pCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlza2xfdHBsZ19maWxsX3Bpbl9keW5hbWljX3ZhbChtY29uZmlnLT5tX2luX3BpbiwKKwkJCW1jb25maWctPm1heF9pbl9xdWV1ZSwgdGtuX2VsZW0tPnZhbHVlKTsKKworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VOF9EWU5fT1VUX1BJTjoKKwkJaWYgKCFtY29uZmlnLT5tX291dF9waW4pCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlza2xfdHBsZ19maWxsX3Bpbl9keW5hbWljX3ZhbChtY29uZmlnLT5tX291dF9waW4sCisJCQltY29uZmlnLT5tYXhfb3V0X3F1ZXVlLCB0a25fZWxlbS0+dmFsdWUpOworCisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1U4X1RJTUVfU0xPVDoKKwkJbWNvbmZpZy0+dGltZV9zbG90ID0gdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VOF9DT1JFX0lEOgorCQltY29uZmlnLT5jb3JlX2lkID0gdGtuX2VsZW0tPnZhbHVlOworCisJY2FzZSBTS0xfVEtOX1U4X01PRF9UWVBFOgorCQltY29uZmlnLT5tX3R5cGUgPSB0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1U4X0RFVl9UWVBFOgorCQltY29uZmlnLT5kZXZfdHlwZSA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVThfSFdfQ09OTl9UWVBFOgorCQltY29uZmlnLT5od19jb25uX3R5cGUgPSB0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UxNl9NT0RfSU5TVF9JRDoKKwkJbWNvbmZpZy0+aWQuaW5zdGFuY2VfaWQgPQorCQl0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9NRU1fUEFHRVM6CisJCW1jb25maWctPm1lbV9wYWdlcyA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX01BWF9NQ1BTOgorCQltY29uZmlnLT5tY3BzID0gdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfT0JTOgorCQltY29uZmlnLT5vYnMgPSB0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9JQlM6CisJCW1jb25maWctPmlicyA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX1ZCVVNfSUQ6CisJCW1jb25maWctPnZidXNfaWQgPSB0a25fZWxlbS0+dmFsdWU7CisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9QQVJBTVNfRklYVVA6CisJCW1jb25maWctPnBhcmFtc19maXh1cCA9IHRrbl9lbGVtLT52YWx1ZTsKKwkJYnJlYWs7CisKKwljYXNlIFNLTF9US05fVTMyX0NPTlZFUlRFUjoKKwkJbWNvbmZpZy0+Y29udmVydGVyID0gdGtuX2VsZW0tPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfUElQRV9JRDoKKwkJcmV0ID0gc2tsX3RwbGdfYWRkX3BpcGUoZGV2LAorCQkJCW1jb25maWcsIHNrbCwgdGtuX2VsZW0pOworCisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIGlzX3BpcGVfZXhpc3RzOworCisJCWlmIChyZXQgPT0gRUVYSVNUKQorCQkJaXNfcGlwZV9leGlzdHMgPSAxOworCisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9QSVBFX0NPTk5fVFlQRToKKwljYXNlIFNLTF9US05fVTMyX1BJUEVfUFJJT1JJVFk6CisJY2FzZSBTS0xfVEtOX1UzMl9QSVBFX01FTV9QR1M6CisJCWlmIChpc19waXBlX2V4aXN0cykgeworCQkJcmV0ID0gc2tsX3RwbGdfZmlsbF9waXBlX3RrbihkZXYsIG1jb25maWctPnBpcGUsCisJCQkJCXRrbl9lbGVtLT50b2tlbiwgdGtuX2VsZW0tPnZhbHVlKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlicmVhazsKKworCS8qCisJICogU0tMX1RLTl9VMzJfRElSX1BJTl9DT1VOVCB0b2tlbiBoYXMgdGhlIHZhbHVlIGZvciBib3RoCisJICogZGlyZWN0aW9uIGFuZCB0aGUgcGluIGNvdW50LiBUaGUgZmlyc3QgZm91ciBiaXRzIHJlcHJlc2VudAorCSAqIGRpcmVjdGlvbiBhbmQgbmV4dCBmb3VyIHRoZSBwaW4gY291bnQuCisJICovCisJY2FzZSBTS0xfVEtOX1UzMl9ESVJfUElOX0NPVU5UOgorCQlkaXIgPSB0a25fZWxlbS0+dmFsdWUgJiBTS0xfSU5fRElSX0JJVF9NQVNLOworCQlwaW5faW5kZXggPSAodGtuX2VsZW0tPnZhbHVlICYKKwkJCVNLTF9QSU5fQ09VTlRfTUFTSykgPj4gNDsKKworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0NIOgorCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0ZSRVE6CisJY2FzZSBTS0xfVEtOX1UzMl9GTVRfQklUX0RFUFRIOgorCWNhc2UgU0tMX1RLTl9VMzJfRk1UX1NBTVBMRV9TSVpFOgorCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0NIX0NPTkZJRzoKKwljYXNlIFNLTF9US05fVTMyX0ZNVF9JTlRFUkxFQVZFOgorCWNhc2UgU0tMX1RLTl9VMzJfRk1UX1NBTVBMRV9UWVBFOgorCWNhc2UgU0tMX1RLTl9VMzJfRk1UX0NIX01BUDoKKwkJcmV0ID0gc2tsX3RwbGdfZmlsbF9mbXQoZGV2LCBtY29uZmlnLCB0a25fZWxlbS0+dG9rZW4sCisJCQkJdGtuX2VsZW0tPnZhbHVlLCBkaXIsIHBpbl9pbmRleCk7CisKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9QSU5fTU9EX0lEOgorCWNhc2UgU0tMX1RLTl9VMzJfUElOX0lOU1RfSUQ6CisJCXJldCA9IHNrbF90cGxnX2ZpbGxfcGluc19pbmZvKGRldiwKKwkJCQltY29uZmlnLCB0a25fZWxlbSwgZGlyLAorCQkJCXBpbl9pbmRleCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VMzJfQ0FQU19TSVpFOgorCQltY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5jYXBzX3NpemUgPQorCQkJdGtuX2VsZW0tPnZhbHVlOworCisJCWJyZWFrOworCisJY2FzZSBTS0xfVEtOX1UzMl9QUk9DX0RPTUFJTjoKKwkJbWNvbmZpZy0+ZG9tYWluID0KKwkJCXRrbl9lbGVtLT52YWx1ZTsKKworCQlicmVhazsKKworCWNhc2UgU0tMX1RLTl9VOF9JTl9QSU5fVFlQRToKKwljYXNlIFNLTF9US05fVThfT1VUX1BJTl9UWVBFOgorCWNhc2UgU0tMX1RLTl9VOF9DT05OX1RZUEU6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYsICJUb2tlbiAlZCBub3QgaGFuZGxlZFxuIiwKKwkJCQl0a25fZWxlbS0+dG9rZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKKwl0a25fY291bnQrKzsKKworCXJldHVybiB0a25fY291bnQ7Cit9CisKKy8qCisgKiBQYXJzZSB0aGUgdmVuZG9yIGFycmF5IGZvciBzcGVjaWZpYyB0b2tlbnMgdG8gY29uc3RydWN0CisgKiBtb2R1bGUgcHJpdmF0ZSBkYXRhCisgKi8KK3N0YXRpYyBpbnQgc2tsX3RwbGdfZ2V0X3Rva2VucyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCWNoYXIgKnB2dF9kYXRhLAlzdHJ1Y3Qgc2tsICpza2wsCisJCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZywgaW50IGJsb2NrX3NpemUpCit7CisJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKmFycmF5OworCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3ZhbHVlX2VsZW0gKnRrbl9lbGVtOworCWludCB0a25fY291bnQgPSAwLCByZXQ7CisJaW50IG9mZiA9IDAsIHR1cGxlX3NpemUgPSAwOworCisJaWYgKGJsb2NrX3NpemUgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3aGlsZSAodHVwbGVfc2l6ZSA8IGJsb2NrX3NpemUpIHsKKwkJYXJyYXkgPSAoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKikocHZ0X2RhdGEgKyBvZmYpOworCisJCW9mZiArPSBhcnJheS0+c2l6ZTsKKworCQlzd2l0Y2ggKGFycmF5LT50eXBlKSB7CisJCWNhc2UgU05EX1NPQ19UUExHX1RVUExFX1RZUEVfU1RSSU5HOgorCQkJZGV2X3dhcm4oZGV2LCAibm8gc3RyaW5nIHRva2VucyBleHBlY3RlZCBmb3Igc2tsIHRwbGdcbiIpOworCQkJY29udGludWU7CisKKwkJY2FzZSBTTkRfU09DX1RQTEdfVFVQTEVfVFlQRV9VVUlEOgorCQkJcmV0ID0gc2tsX3RwbGdfZ2V0X3V1aWQoZGV2LCBtY29uZmlnLCBhcnJheS0+dXVpZCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQl0dXBsZV9zaXplICs9IHNpemVvZigqYXJyYXktPnV1aWQpOworCisJCQljb250aW51ZTsKKworCQlkZWZhdWx0OgorCQkJdGtuX2VsZW0gPSBhcnJheS0+dmFsdWU7CisJCQl0a25fY291bnQgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQl3aGlsZSAodGtuX2NvdW50IDw9IChhcnJheS0+bnVtX2VsZW1zIC0gMSkpIHsKKwkJCXJldCA9IHNrbF90cGxnX2dldF90b2tlbihkZXYsIHRrbl9lbGVtLAorCQkJCQlza2wsIG1jb25maWcpOworCisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQl0a25fY291bnQgPSB0a25fY291bnQgKyByZXQ7CisJCQl0a25fZWxlbSsrOworCQl9CisKKwkJdHVwbGVfc2l6ZSArPSB0a25fY291bnQgKiBzaXplb2YoKnRrbl9lbGVtKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEV2ZXJ5IGRhdGEgYmxvY2sgaXMgcHJlY2VkZWQgYnkgYSBkZXNjcmlwdG9yIHRvIHJlYWQgdGhlIG51bWJlcgorICogb2YgZGF0YSBibG9ja3MsIHRoZXkgdHlwZSBvZiB0aGUgYmxvY2sgYW5kIGl0J3Mgc2l6ZQorICovCitzdGF0aWMgaW50IHNrbF90cGxnX2dldF9kZXNjX2Jsb2NrcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICphcnJheSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl92YWx1ZV9lbGVtICp0a25fZWxlbTsKKworCXRrbl9lbGVtID0gYXJyYXktPnZhbHVlOworCisJc3dpdGNoICh0a25fZWxlbS0+dG9rZW4pIHsKKwljYXNlIFNLTF9US05fVThfTlVNX0JMT0NLUzoKKwljYXNlIFNLTF9US05fVThfQkxPQ0tfVFlQRToKKwljYXNlIFNLTF9US05fVTE2X0JMT0NLX1NJWkU6CisJCXJldHVybiB0a25fZWxlbS0+dmFsdWU7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIkludmFsaWQgZGVzY3JpcHRvciB0b2tlbiAlZFxuIiwgdGtuX2VsZW0tPnRva2VuKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBQYXJzZSB0aGUgcHJpdmF0ZSBkYXRhIGZvciB0aGUgdG9rZW4gYW5kIGNvcnJlc3BvbmRpbmcgdmFsdWUuCisgKiBUaGUgcHJpdmF0ZSBkYXRhIGNhbiBoYXZlIG11bHRpcGxlIGRhdGEgYmxvY2tzLiBTbywgYSBkYXRhIGJsb2NrCisgKiBpcyBwcmVjZWRlZCBieSBhIGRlc2NyaXB0b3IgZm9yIG51bWJlciBvZiBibG9ja3MgYW5kIGEgZGVzY3JpcHRvcgorICogZm9yIHRoZSB0eXBlIGFuZCBzaXplIG9mIHRoZSBzdWNlZWRpbmcgZGF0YSBibG9jay4KKyAqLworc3RhdGljIGludCBza2xfdHBsZ19nZXRfcHZ0X2RhdGEoc3RydWN0IHNuZF9zb2NfdHBsZ19kYXBtX3dpZGdldCAqdHBsZ193LAorCQkJCXN0cnVjdCBza2wgKnNrbCwgc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBza2xfbW9kdWxlX2NmZyAqbWNvbmZpZykKK3sKKwlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqYXJyYXk7CisJaW50IG51bV9ibG9ja3MsIGJsb2NrX3NpemUgPSAwLCBibG9ja190eXBlLCBvZmYgPSAwOworCWNoYXIgKmRhdGE7CisJaW50IHJldDsKKworCS8qIFJlYWQgdGhlIE5VTV9EQVRBX0JMT0NLUyBkZXNjcmlwdG9yICovCisJYXJyYXkgPSAoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKil0cGxnX3ctPnByaXYuZGF0YTsKKwlyZXQgPSBza2xfdHBsZ19nZXRfZGVzY19ibG9ja3MoZGV2LCBhcnJheSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJbnVtX2Jsb2NrcyA9IHJldDsKKworCW9mZiArPSBhcnJheS0+c2l6ZTsKKwlhcnJheSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqKSh0cGxnX3ctPnByaXYuZGF0YSArIG9mZik7CisKKwkvKiBSZWFkIHRoZSBCTE9DS19UWVBFIGFuZCBCTE9DS19TSVpFIGRlc2NyaXB0b3IgKi8KKwl3aGlsZSAobnVtX2Jsb2NrcyA+IDApIHsKKwkJcmV0ID0gc2tsX3RwbGdfZ2V0X2Rlc2NfYmxvY2tzKGRldiwgYXJyYXkpOworCisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJYmxvY2tfdHlwZSA9IHJldDsKKwkJb2ZmICs9IGFycmF5LT5zaXplOworCisJCWFycmF5ID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICopCisJCQkodHBsZ193LT5wcml2LmRhdGEgKyBvZmYpOworCisJCXJldCA9IHNrbF90cGxnX2dldF9kZXNjX2Jsb2NrcyhkZXYsIGFycmF5KTsKKworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWJsb2NrX3NpemUgPSByZXQ7CisJCW9mZiArPSBhcnJheS0+c2l6ZTsKKworCQlhcnJheSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqKQorCQkJKHRwbGdfdy0+cHJpdi5kYXRhICsgb2ZmKTsKKworCQlkYXRhID0gKHRwbGdfdy0+cHJpdi5kYXRhICsgb2ZmKTsKKworCQlpZiAoYmxvY2tfdHlwZSA9PSBTS0xfVFlQRV9UVVBMRSkgeworCQkJcmV0ID0gc2tsX3RwbGdfZ2V0X3Rva2VucyhkZXYsIGRhdGEsCisJCQkJCXNrbCwgbWNvbmZpZywgYmxvY2tfc2l6ZSk7CisKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCS0tbnVtX2Jsb2NrczsKKwkJfSBlbHNlIHsKKwkJCWlmIChtY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5jYXBzX3NpemUgPiAwKQorCQkJCW1lbWNweShtY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5jYXBzLCBkYXRhLAorCQkJCQltY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5jYXBzX3NpemUpOworCQkJLS1udW1fYmxvY2tzOworCQl9CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHNrbF9jbGVhcl9waW5fY29uZmlnKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSwKQEAgLTE2MDYsOSArMjEzMiw2IEBACiAJc3RydWN0IHNrbCAqc2tsID0gZWJ1c190b19za2woZWJ1cyk7CiAJc3RydWN0IGhkYWNfYnVzICpidXMgPSBlYnVzX3RvX2hidXMoZWJ1cyk7CiAJc3RydWN0IHNrbF9tb2R1bGVfY2ZnICptY29uZmlnOwotCXN0cnVjdCBza2xfcGlwZSAqcGlwZTsKLQlzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGUgKmRmd19jb25maWcgPQotCQkJCShzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGUgKil0cGxnX3ctPnByaXYuZGF0YTsKIAogCWlmICghdHBsZ193LT5wcml2LnNpemUpCiAJCWdvdG8gYmluZF9ldmVudDsKQEAgLTE2MTksNzYgKzIxNDIsMTcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAl3LT5wcml2ID0gbWNvbmZpZzsKLQltZW1jcHkoJm1jb25maWctPmd1aWQsICZkZndfY29uZmlnLT51dWlkLCAxNik7CiAKLQlyZXQgPSBzbmRfc2tsX2dldF9tb2R1bGVfaW5mbyhza2wtPnNrbF9zc3QsIG1jb25maWctPmd1aWQsIGRmd19jb25maWcpOworCS8qCisJICogbW9kdWxlIGJpbmFyeSBjYW4gYmUgbG9hZGVkIGxhdGVyLCBzbyBzZXQgaXQgdG8gcXVlcnkgd2hlbgorCSAqIG1vZHVsZSBpcyBsb2FkIGZvciBhIHVzZSBjYXNlCisJICovCisJbWNvbmZpZy0+aWQubW9kdWxlX2lkID0gLTE7CisKKwkvKiBQYXJzZSBwcml2YXRlIGRhdGEgZm9yIHR1cGxlcyAqLworCXJldCA9IHNrbF90cGxnX2dldF9wdnRfZGF0YSh0cGxnX3csIHNrbCwgYnVzLT5kZXYsIG1jb25maWcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCi0JbWNvbmZpZy0+aWQubW9kdWxlX2lkID0gZGZ3X2NvbmZpZy0+bW9kdWxlX2lkOwotCW1jb25maWctPmlkLmluc3RhbmNlX2lkID0gZGZ3X2NvbmZpZy0+aW5zdGFuY2VfaWQ7Ci0JbWNvbmZpZy0+bWNwcyA9IGRmd19jb25maWctPm1heF9tY3BzOwotCW1jb25maWctPmlicyA9IGRmd19jb25maWctPmliczsKLQltY29uZmlnLT5vYnMgPSBkZndfY29uZmlnLT5vYnM7Ci0JbWNvbmZpZy0+Y29yZV9pZCA9IGRmd19jb25maWctPmNvcmVfaWQ7Ci0JbWNvbmZpZy0+bWF4X2luX3F1ZXVlID0gZGZ3X2NvbmZpZy0+bWF4X2luX3F1ZXVlOwotCW1jb25maWctPm1heF9vdXRfcXVldWUgPSBkZndfY29uZmlnLT5tYXhfb3V0X3F1ZXVlOwotCW1jb25maWctPmlzX2xvYWRhYmxlID0gZGZ3X2NvbmZpZy0+aXNfbG9hZGFibGU7Ci0Jc2tsX3RwbGdfZmlsbF9mbXQobWNvbmZpZy0+aW5fZm10LCBkZndfY29uZmlnLT5pbl9mbXQsCi0JCQkJCQlNT0RVTEVfTUFYX0lOX1BJTlMpOwotCXNrbF90cGxnX2ZpbGxfZm10KG1jb25maWctPm91dF9mbXQsIGRmd19jb25maWctPm91dF9mbXQsCi0JCQkJCQlNT0RVTEVfTUFYX09VVF9QSU5TKTsKLQotCW1jb25maWctPnBhcmFtc19maXh1cCA9IGRmd19jb25maWctPnBhcmFtc19maXh1cDsKLQltY29uZmlnLT5jb252ZXJ0ZXIgPSBkZndfY29uZmlnLT5jb252ZXJ0ZXI7Ci0JbWNvbmZpZy0+bV90eXBlID0gZGZ3X2NvbmZpZy0+bW9kdWxlX3R5cGU7Ci0JbWNvbmZpZy0+dmJ1c19pZCA9IGRmd19jb25maWctPnZidXNfaWQ7Ci0JbWNvbmZpZy0+bWVtX3BhZ2VzID0gZGZ3X2NvbmZpZy0+bWVtX3BhZ2VzOwotCi0JcGlwZSA9IHNrbF90cGxnX2FkZF9waXBlKGJ1cy0+ZGV2LCBza2wsICZkZndfY29uZmlnLT5waXBlKTsKLQlpZiAocGlwZSkKLQkJbWNvbmZpZy0+cGlwZSA9IHBpcGU7Ci0KLQltY29uZmlnLT5kZXZfdHlwZSA9IGRmd19jb25maWctPmRldl90eXBlOwotCW1jb25maWctPmh3X2Nvbm5fdHlwZSA9IGRmd19jb25maWctPmh3X2Nvbm5fdHlwZTsKLQltY29uZmlnLT50aW1lX3Nsb3QgPSBkZndfY29uZmlnLT50aW1lX3Nsb3Q7Ci0JbWNvbmZpZy0+Zm9ybWF0c19jb25maWcuY2Fwc19zaXplID0gZGZ3X2NvbmZpZy0+Y2Fwcy5jYXBzX3NpemU7Ci0KLQltY29uZmlnLT5tX2luX3BpbiA9IGRldm1fa3phbGxvYyhidXMtPmRldiwgKG1jb25maWctPm1heF9pbl9xdWV1ZSkgKgotCQkJCQkJc2l6ZW9mKCptY29uZmlnLT5tX2luX3BpbiksCi0JCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIW1jb25maWctPm1faW5fcGluKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1jb25maWctPm1fb3V0X3BpbiA9IGRldm1fa3phbGxvYyhidXMtPmRldiwgKG1jb25maWctPm1heF9vdXRfcXVldWUpICoKLQkJCQkJCXNpemVvZigqbWNvbmZpZy0+bV9vdXRfcGluKSwKLQkJCQkJCUdGUF9LRVJORUwpOwotCWlmICghbWNvbmZpZy0+bV9vdXRfcGluKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNrbF9maWxsX21vZHVsZV9waW5faW5mbyhkZndfY29uZmlnLT5pbl9waW4sIG1jb25maWctPm1faW5fcGluLAotCQkJCQkJZGZ3X2NvbmZpZy0+aXNfZHluYW1pY19pbl9waW4sCi0JCQkJCQltY29uZmlnLT5tYXhfaW5fcXVldWUpOwotCi0Jc2tsX2ZpbGxfbW9kdWxlX3Bpbl9pbmZvKGRmd19jb25maWctPm91dF9waW4sIG1jb25maWctPm1fb3V0X3BpbiwKLQkJCQkJCSBkZndfY29uZmlnLT5pc19keW5hbWljX291dF9waW4sCi0JCQkJCQkJbWNvbmZpZy0+bWF4X291dF9xdWV1ZSk7Ci0KLQotCWlmIChtY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5jYXBzX3NpemUgPT0gMCkKLQkJZ290byBiaW5kX2V2ZW50OwotCi0JbWNvbmZpZy0+Zm9ybWF0c19jb25maWcuY2FwcyA9ICh1MzIgKilkZXZtX2t6YWxsb2MoYnVzLT5kZXYsCi0JCQltY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5jYXBzX3NpemUsIEdGUF9LRVJORUwpOwotCi0JaWYgKG1jb25maWctPmZvcm1hdHNfY29uZmlnLmNhcHMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1jcHkobWNvbmZpZy0+Zm9ybWF0c19jb25maWcuY2FwcywgZGZ3X2NvbmZpZy0+Y2Fwcy5jYXBzLAotCQkJCQkJIGRmd19jb25maWctPmNhcHMuY2Fwc19zaXplKTsKLQltY29uZmlnLT5mb3JtYXRzX2NvbmZpZy5wYXJhbV9pZCA9IGRmd19jb25maWctPmNhcHMucGFyYW1faWQ7Ci0JbWNvbmZpZy0+Zm9ybWF0c19jb25maWcuc2V0X3BhcmFtcyA9IGRmd19jb25maWctPmNhcHMuc2V0X3BhcmFtczsKLQogYmluZF9ldmVudDoKIAlpZiAodHBsZ193LT5ldmVudF90eXBlID09IDApIHsKIAkJZGV2X2RiZyhidXMtPmRldiwgIkFTb0M6IE5vIGV2ZW50IGhhbmRsZXIgcmVxdWlyZWRcbiIpOwpAQCAtMTc2NywxMSArMjIzMSwyMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBza2xfdHBsZ19maWxsX3N0cl9tZmVzdF90a24oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9zdHJpbmdfZWxlbSAqc3RyX2VsZW0sCisJCXN0cnVjdCBza2xfZGZ3X21hbmlmZXN0ICptaW5mbykKK3sKKwlpbnQgdGtuX2NvdW50ID0gMDsKKwlzdGF0aWMgaW50IHJlZl9jb3VudDsKKworCXN3aXRjaCAoc3RyX2VsZW0tPnRva2VuKSB7CisJY2FzZSBTS0xfVEtOX1NUUl9MSUJfTkFNRToKKwkJaWYgKHJlZl9jb3VudCA+IG1pbmZvLT5saWJfY291bnQgLSAxKSB7CisJCQlyZWZfY291bnQgPSAwOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzdHJuY3B5KG1pbmZvLT5saWJbcmVmX2NvdW50XS5uYW1lLCBzdHJfZWxlbS0+c3RyaW5nLAorCQkJCUFSUkFZX1NJWkUobWluZm8tPmxpYltyZWZfY291bnRdLm5hbWUpKTsKKwkJcmVmX2NvdW50Kys7CisJCXRrbl9jb3VudCsrOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoZGV2LCAiTm90IGEgc3RyaW5nIHRva2VuICVkXG4iLCBzdHJfZWxlbS0+dG9rZW4pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdGtuX2NvdW50OworfQorCitzdGF0aWMgaW50IHNrbF90cGxnX2dldF9zdHJfdGtuKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKmFycmF5LAorCQlzdHJ1Y3Qgc2tsX2Rmd19tYW5pZmVzdCAqbWluZm8pCit7CisJaW50IHRrbl9jb3VudCA9IDAsIHJldDsKKwlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9zdHJpbmdfZWxlbSAqc3RyX2VsZW07CisKKwlzdHJfZWxlbSA9IChzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9zdHJpbmdfZWxlbSAqKWFycmF5LT52YWx1ZTsKKwl3aGlsZSAodGtuX2NvdW50IDwgYXJyYXktPm51bV9lbGVtcykgeworCQlyZXQgPSBza2xfdHBsZ19maWxsX3N0cl9tZmVzdF90a24oZGV2LCBzdHJfZWxlbSwgbWluZm8pOworCQlzdHJfZWxlbSsrOworCisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQl0a25fY291bnQgPSB0a25fY291bnQgKyByZXQ7CisJfQorCisJcmV0dXJuIHRrbl9jb3VudDsKK30KKworc3RhdGljIGludCBza2xfdHBsZ19nZXRfaW50X3RrbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX3ZhbHVlX2VsZW0gKnRrbl9lbGVtLAorCQlzdHJ1Y3Qgc2tsX2Rmd19tYW5pZmVzdCAqbWluZm8pCit7CisJaW50IHRrbl9jb3VudCA9IDA7CisKKwlzd2l0Y2ggKHRrbl9lbGVtLT50b2tlbikgeworCWNhc2UgU0tMX1RLTl9VMzJfTElCX0NPVU5UOgorCQltaW5mby0+bGliX2NvdW50ID0gdGtuX2VsZW0tPnZhbHVlOworCQl0a25fY291bnQrKzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIk5vdCBhIG1hbmlmZXN0IHRva2VuICVkXG4iLCB0a25fZWxlbS0+dG9rZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gdGtuX2NvdW50OworfQorCisvKgorICogRmlsbCB0aGUgbWFuaWZlc3Qgc3RydWN0dXJlIGJ5IHBhcnNpbmcgdGhlIHRva2VucyBiYXNlZCBvbiB0aGUKKyAqIHR5cGUuCisgKi8KK3N0YXRpYyBpbnQgc2tsX3RwbGdfZ2V0X21hbmlmZXN0X3RrbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCWNoYXIgKnB2dF9kYXRhLCBzdHJ1Y3Qgc2tsX2Rmd19tYW5pZmVzdCAqbWluZm8sCisJCWludCBibG9ja19zaXplKQoreworCWludCB0a25fY291bnQgPSAwLCByZXQ7CisJaW50IG9mZiA9IDAsIHR1cGxlX3NpemUgPSAwOworCXN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICphcnJheTsKKwlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl92YWx1ZV9lbGVtICp0a25fZWxlbTsKKworCWlmIChibG9ja19zaXplIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJd2hpbGUgKHR1cGxlX3NpemUgPCBibG9ja19zaXplKSB7CisJCWFycmF5ID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICopKHB2dF9kYXRhICsgb2ZmKTsKKwkJb2ZmICs9IGFycmF5LT5zaXplOworCQlzd2l0Y2ggKGFycmF5LT50eXBlKSB7CisJCWNhc2UgU05EX1NPQ19UUExHX1RVUExFX1RZUEVfU1RSSU5HOgorCQkJcmV0ID0gc2tsX3RwbGdfZ2V0X3N0cl90a24oZGV2LCBhcnJheSwgbWluZm8pOworCisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJdGtuX2NvdW50ICs9IHJldDsKKworCQkJdHVwbGVfc2l6ZSArPSB0a25fY291bnQgKgorCQkJCXNpemVvZihzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9zdHJpbmdfZWxlbSk7CisJCQljb250aW51ZTsKKworCQljYXNlIFNORF9TT0NfVFBMR19UVVBMRV9UWVBFX1VVSUQ6CisJCQlkZXZfd2FybihkZXYsICJubyB1dWlkIHRva2VucyBmb3Igc2tsIHRwbGYgbWFuaWZlc3RcbiIpOworCQkJY29udGludWU7CisKKwkJZGVmYXVsdDoKKwkJCXRrbl9lbGVtID0gYXJyYXktPnZhbHVlOworCQkJdGtuX2NvdW50ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJd2hpbGUgKHRrbl9jb3VudCA8PSBhcnJheS0+bnVtX2VsZW1zIC0gMSkgeworCQkJcmV0ID0gc2tsX3RwbGdfZ2V0X2ludF90a24oZGV2LAorCQkJCQl0a25fZWxlbSwgbWluZm8pOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKworCQkJdGtuX2NvdW50ID0gdGtuX2NvdW50ICsgcmV0OworCQkJdGtuX2VsZW0rKzsKKwkJCXR1cGxlX3NpemUgKz0gdGtuX2NvdW50ICoKKwkJCQlzaXplb2Yoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfdmFsdWVfZWxlbSk7CisJCQlicmVhazsKKwkJfQorCQl0a25fY291bnQgPSAwOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUGFyc2UgbWFuaWZlc3QgcHJpdmF0ZSBkYXRhIGZvciB0b2tlbnMuIFRoZSBwcml2YXRlIGRhdGEgYmxvY2sgaXMKKyAqIHByZWNlZGVkIGJ5IGRlc2NyaXB0b3JzIGZvciB0eXBlIGFuZCBzaXplIG9mIGRhdGEgYmxvY2suCisgKi8KK3N0YXRpYyBpbnQgc2tsX3RwbGdfZ2V0X21hbmlmZXN0X2RhdGEoc3RydWN0IHNuZF9zb2NfdHBsZ19tYW5pZmVzdCAqbWFuaWZlc3QsCisJCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza2xfZGZ3X21hbmlmZXN0ICptaW5mbykKK3sKKwlzdHJ1Y3Qgc25kX3NvY190cGxnX3ZlbmRvcl9hcnJheSAqYXJyYXk7CisJaW50IG51bV9ibG9ja3MsIGJsb2NrX3NpemUgPSAwLCBibG9ja190eXBlLCBvZmYgPSAwOworCWNoYXIgKmRhdGE7CisJaW50IHJldDsKKworCS8qIFJlYWQgdGhlIE5VTV9EQVRBX0JMT0NLUyBkZXNjcmlwdG9yICovCisJYXJyYXkgPSAoc3RydWN0IHNuZF9zb2NfdHBsZ192ZW5kb3JfYXJyYXkgKiltYW5pZmVzdC0+cHJpdi5kYXRhOworCXJldCA9IHNrbF90cGxnX2dldF9kZXNjX2Jsb2NrcyhkZXYsIGFycmF5KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwludW1fYmxvY2tzID0gcmV0OworCisJb2ZmICs9IGFycmF5LT5zaXplOworCWFycmF5ID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICopCisJCQkobWFuaWZlc3QtPnByaXYuZGF0YSArIG9mZik7CisKKwkvKiBSZWFkIHRoZSBCTE9DS19UWVBFIGFuZCBCTE9DS19TSVpFIGRlc2NyaXB0b3IgKi8KKwl3aGlsZSAobnVtX2Jsb2NrcyA+IDApIHsKKwkJcmV0ID0gc2tsX3RwbGdfZ2V0X2Rlc2NfYmxvY2tzKGRldiwgYXJyYXkpOworCisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJYmxvY2tfdHlwZSA9IHJldDsKKwkJb2ZmICs9IGFycmF5LT5zaXplOworCisJCWFycmF5ID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICopCisJCQkobWFuaWZlc3QtPnByaXYuZGF0YSArIG9mZik7CisKKwkJcmV0ID0gc2tsX3RwbGdfZ2V0X2Rlc2NfYmxvY2tzKGRldiwgYXJyYXkpOworCisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJYmxvY2tfc2l6ZSA9IHJldDsKKwkJb2ZmICs9IGFycmF5LT5zaXplOworCisJCWFycmF5ID0gKHN0cnVjdCBzbmRfc29jX3RwbGdfdmVuZG9yX2FycmF5ICopCisJCQkobWFuaWZlc3QtPnByaXYuZGF0YSArIG9mZik7CisKKwkJZGF0YSA9IChtYW5pZmVzdC0+cHJpdi5kYXRhICsgb2ZmKTsKKworCQlpZiAoYmxvY2tfdHlwZSA9PSBTS0xfVFlQRV9UVVBMRSkgeworCQkJcmV0ID0gc2tsX3RwbGdfZ2V0X21hbmlmZXN0X3RrbihkZXYsIGRhdGEsIG1pbmZvLAorCQkJCQlibG9ja19zaXplKTsKKworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKworCQkJLS1udW1fYmxvY2tzOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBza2xfbWFuaWZlc3RfbG9hZChzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNtcG50LAorCQkJCXN0cnVjdCBzbmRfc29jX3RwbGdfbWFuaWZlc3QgKm1hbmlmZXN0KQoreworCXN0cnVjdCBza2xfZGZ3X21hbmlmZXN0ICptaW5mbzsKKwlzdHJ1Y3QgaGRhY19leHRfYnVzICplYnVzID0gc25kX3NvY19jb21wb25lbnRfZ2V0X2RydmRhdGEoY21wbnQpOworCXN0cnVjdCBoZGFjX2J1cyAqYnVzID0gZWJ1c190b19oYnVzKGVidXMpOworCXN0cnVjdCBza2wgKnNrbCA9IGVidXNfdG9fc2tsKGVidXMpOworCWludCByZXQgPSAwOworCisJLyogcHJvY2VlZCBvbmx5IGlmIHdlIGhhdmUgcHJpdmF0ZSBkYXRhIGRlZmluZWQgKi8KKwlpZiAobWFuaWZlc3QtPnByaXYuc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCW1pbmZvID0gJnNrbC0+c2tsX3NzdC0+bWFuaWZlc3Q7CisKKwlza2xfdHBsZ19nZXRfbWFuaWZlc3RfZGF0YShtYW5pZmVzdCwgYnVzLT5kZXYsIG1pbmZvKTsKKworCWlmIChtaW5mby0+bGliX2NvdW50ID4gSERBX01BWF9MSUIpIHsKKwkJZGV2X2VycihidXMtPmRldiwgIkV4Y2VlZGluZyBtYXggTGlicmFyeSBjb3VudC4gR290OiVkXG4iLAorCQkJCQltaW5mby0+bGliX2NvdW50KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfdHBsZ19vcHMgc2tsX3RwbGdfb3BzICA9IHsKIAkud2lkZ2V0X2xvYWQgPSBza2xfdHBsZ193aWRnZXRfbG9hZCwKIAkuY29udHJvbF9sb2FkID0gc2tsX3RwbGdfY29udHJvbF9sb2FkLAogCS5ieXRlc19leHRfb3BzID0gc2tsX3Rsdl9vcHMsCiAJLmJ5dGVzX2V4dF9vcHNfY291bnQgPSBBUlJBWV9TSVpFKHNrbF90bHZfb3BzKSwKKwkubWFuaWZlc3QgPSBza2xfbWFuaWZlc3RfbG9hZCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdG9wb2xvZ3kuaCBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10b3BvbG9neS5oCmluZGV4IDIyZDNlZjguLmE1MTkzNjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10b3BvbG9neS5oCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10b3BvbG9neS5oCkBAIC0xMzMsNyArMTMzLDcgQEAKIHN0cnVjdCBza2xfZG1hX2NvbnRyb2wgewogCXUzMiBub2RlX2lkOwogCXUzMiBjb25maWdfbGVuZ3RoOwotCXUzMiBjb25maWdfZGF0YVsxXTsKKwl1MzIgY29uZmlnX2RhdGFbMF07CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3Qgc2tsX2Nwcl9jZmcgewpAQCAtMjE1LDkgKzIxNSwyMCBAQAogCiBzdHJ1Y3Qgc2tsX21vZHVsZV9jZmc7CiAKK3N0cnVjdCBza2xfbW9kX2luc3RfbWFwIHsKKwl1MTYgbW9kX2lkOworCXUxNiBpbnN0X2lkOworfTsKKworc3RydWN0IHNrbF9rcGJfcGFyYW1zIHsKKwl1MzIgbnVtX21vZHVsZXM7CisJc3RydWN0IHNrbF9tb2RfaW5zdF9tYXAgbWFwWzBdOworfTsKKwogc3RydWN0IHNrbF9tb2R1bGVfaW5zdF9pZCB7Ci0JdTMyIG1vZHVsZV9pZDsKKwlpbnQgbW9kdWxlX2lkOwogCXUzMiBpbnN0YW5jZV9pZDsKKwlpbnQgcHZ0X2lkOwogfTsKIAogZW51bSBza2xfbW9kdWxlX3Bpbl9zdGF0ZSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wtdHBsZy1pbnRlcmZhY2UuaCBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10cGxnLWludGVyZmFjZS5oCmluZGV4IGEzMmU1ZTkuLjJmNjI4MWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10cGxnLWludGVyZmFjZS5oCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC10cGxnLWludGVyZmFjZS5oCkBAIC04MCw3ICs4MCw4IEBACiAJU0tMX01PRFVMRV9UWVBFX1VQRFdNSVgsCiAJU0tMX01PRFVMRV9UWVBFX1NSQ0lOVCwKIAlTS0xfTU9EVUxFX1RZUEVfQUxHTywKLQlTS0xfTU9EVUxFX1RZUEVfQkFTRV9PVVRGTVQKKwlTS0xfTU9EVUxFX1RZUEVfQkFTRV9PVVRGTVQsCisJU0tMX01PRFVMRV9UWVBFX0tQQiwKIH07CiAKIGVudW0gc2tsX2NvcmVfYWZmaW5pdHkgewpAQCAtMTQ4LDc4ICsxNDksNiBAQAogCVNLTF9QQVJBTV9CSU5ECiB9OwogCi1zdHJ1Y3Qgc2tsX2Rmd19tb2R1bGVfcGluIHsKLQl1MTYgbW9kdWxlX2lkOwotCXUxNiBpbnN0YW5jZV9pZDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBza2xfZGZ3X21vZHVsZV9mbXQgewotCXUzMiBjaGFubmVsczsKLQl1MzIgZnJlcTsKLQl1MzIgYml0X2RlcHRoOwotCXUzMiB2YWxpZF9iaXRfZGVwdGg7Ci0JdTMyIGNoX2NmZzsKLQl1MzIgaW50ZXJsZWF2aW5nX3N0eWxlOwotCXUzMiBzYW1wbGVfdHlwZTsKLQl1MzIgY2hfbWFwOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHNrbF9kZndfbW9kdWxlX2NhcHMgewotCXUzMiBzZXRfcGFyYW1zOjI7Ci0JdTMyIHJzdmQ6MzA7Ci0JdTMyIHBhcmFtX2lkOwotCXUzMiBjYXBzX3NpemU7Ci0JdTMyIGNhcHNbSERBX1NTVF9DRkdfTUFYXTsKLX07Ci0KLXN0cnVjdCBza2xfZGZ3X3BpcGUgewotCXU4IHBpcGVfaWQ7Ci0JdTggcGlwZV9wcmlvcml0eTsKLQl1MTYgY29ubl90eXBlOjQ7Ci0JdTE2IHJzdmQ6NDsKLQl1MTYgbWVtb3J5X3BhZ2VzOjg7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc2tsX2Rmd19tb2R1bGUgewotCXU4IHV1aWRbMTZdOwotCi0JdTE2IG1vZHVsZV9pZDsKLQl1MTYgaW5zdGFuY2VfaWQ7Ci0JdTMyIG1heF9tY3BzOwotCXUzMiBtZW1fcGFnZXM7Ci0JdTMyIG9iczsKLQl1MzIgaWJzOwotCXUzMiB2YnVzX2lkOwotCi0JdTMyIG1heF9pbl9xdWV1ZTo4OwotCXUzMiBtYXhfb3V0X3F1ZXVlOjg7Ci0JdTMyIHRpbWVfc2xvdDo4OwotCXUzMiBjb3JlX2lkOjQ7Ci0JdTMyIHJzdmQxOjQ7Ci0KLQl1MzIgbW9kdWxlX3R5cGU6ODsKLQl1MzIgY29ubl90eXBlOjQ7Ci0JdTMyIGRldl90eXBlOjQ7Ci0JdTMyIGh3X2Nvbm5fdHlwZTo0OwotCXUzMiByc3ZkMjoxMjsKLQotCXUzMiBwYXJhbXNfZml4dXA6ODsKLQl1MzIgY29udmVydGVyOjg7Ci0JdTMyIGlucHV0X3Bpbl90eXBlOjE7Ci0JdTMyIG91dHB1dF9waW5fdHlwZToxOwotCXUzMiBpc19keW5hbWljX2luX3BpbjoxOwotCXUzMiBpc19keW5hbWljX291dF9waW46MTsKLQl1MzIgaXNfbG9hZGFibGU6MTsKLQl1MzIgcnN2ZDM6MTE7Ci0KLQlzdHJ1Y3Qgc2tsX2Rmd19waXBlIHBpcGU7Ci0Jc3RydWN0IHNrbF9kZndfbW9kdWxlX2ZtdCBpbl9mbXRbTUFYX0lOX1FVRVVFXTsKLQlzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGVfZm10IG91dF9mbXRbTUFYX09VVF9RVUVVRV07Ci0Jc3RydWN0IHNrbF9kZndfbW9kdWxlX3BpbiBpbl9waW5bTUFYX0lOX1FVRVVFXTsKLQlzdHJ1Y3Qgc2tsX2Rmd19tb2R1bGVfcGluIG91dF9waW5bTUFYX09VVF9RVUVVRV07Ci0Jc3RydWN0IHNrbF9kZndfbW9kdWxlX2NhcHMgY2FwczsKLX0gX19wYWNrZWQ7Ci0KIHN0cnVjdCBza2xfZGZ3X2FsZ29fZGF0YSB7CiAJdTMyIHNldF9wYXJhbXM6MjsKIAl1MzIgcnN2ZDozMDsKQEAgLTIyOCw0ICsxNTcsMjYgQEAKIAljaGFyIHBhcmFtc1swXTsKIH0gX19wYWNrZWQ7CiAKKyNkZWZpbmUgTElCX05BTUVfTEVOR1RICTEyOAorI2RlZmluZSBIREFfTUFYX0xJQgkxNgorCitzdHJ1Y3QgbGliX2luZm8geworCWNoYXIgbmFtZVtMSUJfTkFNRV9MRU5HVEhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHNrbF9kZndfbWFuaWZlc3QgeworCXUzMiBsaWJfY291bnQ7CisJc3RydWN0IGxpYl9pbmZvIGxpYltIREFfTUFYX0xJQl07Cit9IF9fcGFja2VkOworCitlbnVtIHNrbF90a25fZGlyIHsKKwlTS0xfRElSX0lOLAorCVNLTF9ESVJfT1VUCit9OworCitlbnVtIHNrbF90dXBsZV90eXBlIHsKKwlTS0xfVFlQRV9UVVBMRSwKKwlTS0xfVFlQRV9EQVRBCit9OworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC5jIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLmMKaW5kZXggZTNlNzY0MS4uMjk4OWMxNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLmMKKysrIGIvc291bmQvc29jL2ludGVsL3NreWxha2Uvc2tsLmMKQEAgLTU4Nyw3ICs1ODcsNyBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCXNuZF9oZGFjX2V4dF9idXNfcGFyc2VfY2FwYWJpbGl0aWVzKGVidXMpOworCXNuZF9oZGFjX2J1c19wYXJzZV9jYXBhYmlsaXRpZXMoYnVzKTsKIAogCWlmIChza2xfYWNxdWlyZV9pcnEoZWJ1cywgMCkgPCAwKQogCQlyZXR1cm4gLUVCVVNZOwpAQCAtNjg0LDcgKzY4NCw3IEBACiAJc2tsX2RtaWNfZGF0YS5kbWljX251bSA9IHNrbF9nZXRfZG1pY19nZW8oc2tsKTsKIAogCS8qIGNoZWNrIGlmIGRzcCBpcyB0aGVyZSAqLwotCWlmIChlYnVzLT5wcGNhcCkgeworCWlmIChidXMtPnBwY2FwKSB7CiAJCWVyciA9IHNrbF9tYWNoaW5lX2RldmljZV9yZWdpc3Rlcihza2wsCiAJCQkJICAodm9pZCAqKXBjaV9pZC0+ZHJpdmVyX2RhdGEpOwogCQlpZiAoZXJyIDwgMCkKQEAgLTY5OCw3ICs2OTgsNyBAQAogCQlza2wtPnNrbF9zc3QtPmVuYWJsZV9taXNjYmRjZ2UgPSBza2xfZW5hYmxlX21pc2NiZGNnZTsKIAogCX0KLQlpZiAoZWJ1cy0+bWxjYXApCisJaWYgKGJ1cy0+bWxjYXApCiAJCXNuZF9oZGFjX2V4dF9idXNfZ2V0X21sX2NhcGFiaWxpdGllcyhlYnVzKTsKIAogCS8qIGNyZWF0ZSBkZXZpY2UgZm9yIHNvYyBkbWljICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc2t5bGFrZS9za2wuaCBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC5oCmluZGV4IDkwNjRlNWIuLjVkNGZiYjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC5oCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9za3lsYWtlL3NrbC5oCkBAIC0xMDUsNiArMTA1LDcgQEAKIAkJCWludCBpcnEsIGNvbnN0IGNoYXIgKmZ3X25hbWUsCiAJCQlzdHJ1Y3Qgc2tsX2RzcF9sb2FkZXJfb3BzIGxvYWRlcl9vcHMsCiAJCQlzdHJ1Y3Qgc2tsX3NzdCAqKnNrbF9zc3QpOworCWludCAoKmluaXRfZncpKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCk7CiAJdm9pZCAoKmNsZWFudXApKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrbF9zc3QgKmN0eCk7CiB9OwogCkBAIC0xMjMsNCArMTI0LDUgQEAKIGludCBza2xfc3VzcGVuZF9kc3Aoc3RydWN0IHNrbCAqc2tsKTsKIGludCBza2xfcmVzdW1lX2RzcChzdHJ1Y3Qgc2tsICpza2wpOwogdm9pZCBza2xfY2xlYW51cF9yZXNvdXJjZXMoc3RydWN0IHNrbCAqc2tsKTsKK2NvbnN0IHN0cnVjdCBza2xfZHNwX29wcyAqc2tsX2dldF9kc3Bfb3BzKGludCBwY2lfaWQpOwogI2VuZGlmIC8qIF9fU09VTkRfU09DX1NLTF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtZG1hLmMgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtZG1hLmMKaW5kZXggZGJmZGZlOS4uZGFmZDIyZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWRtYS5jCisrKyBiL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1kbWEuYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGtpcmt3b29kX2RtYV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21fb3BzIGtpcmt3b29kX2RtYV9vcHMgPSB7CiAJLm9wZW4gPQkJa2lya3dvb2RfZG1hX29wZW4sCiAJLmNsb3NlID0gICAgICAgIGtpcmt3b29kX2RtYV9jbG9zZSwKIAkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9tZWRpYXRlay9jb21tb24vbXRrLWFmZS1mZS1kYWkuYyBiL3NvdW5kL3NvYy9tZWRpYXRlay9jb21tb24vbXRrLWFmZS1mZS1kYWkuYwppbmRleCBiNzg4NzkxYi4uYWMyMzFkMyAxMDA2NDQKLS0tIGEvc291bmQvc29jL21lZGlhdGVrL2NvbW1vbi9tdGstYWZlLWZlLWRhaS5jCisrKyBiL3NvdW5kL3NvYy9tZWRpYXRlay9jb21tb24vbXRrLWFmZS1mZS1kYWkuYwpAQCAtMjMsNyArMjMsOCBAQAogCiAjZGVmaW5lIEFGRV9CQVNFX0VORF9PRkZTRVQgOAogCi1pbnQgbXRrX3JlZ21hcF91cGRhdGVfYml0cyhzdHJ1Y3QgcmVnbWFwICptYXAsIGludCByZWcsIHVuc2lnbmVkIGludCBtYXNrLAorc3RhdGljIGludCBtdGtfcmVnbWFwX3VwZGF0ZV9iaXRzKHN0cnVjdCByZWdtYXAgKm1hcCwgaW50IHJlZywKKwkJCSAgIHVuc2lnbmVkIGludCBtYXNrLAogCQkJICAgdW5zaWduZWQgaW50IHZhbCkKIHsKIAlpZiAocmVnIDwgMCkKQEAgLTMxLDcgKzMyLDcgQEAKIAlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1hcCwgcmVnLCBtYXNrLCB2YWwpOwogfQogCi1pbnQgbXRrX3JlZ21hcF93cml0ZShzdHJ1Y3QgcmVnbWFwICptYXAsIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpCitzdGF0aWMgaW50IG10a19yZWdtYXBfd3JpdGUoc3RydWN0IHJlZ21hcCAqbWFwLCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQogewogCWlmIChyZWcgPCAwKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL21jYnNwLmMgYi9zb3VuZC9zb2Mvb21hcC9tY2JzcC5jCmluZGV4IDc2Y2UzMzEuLjA2ZmVjNTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL21jYnNwLmMKKysrIGIvc291bmQvc29jL29tYXAvbWNic3AuYwpAQCAtMjIxLDcgKzIyMSw4IEBACiAKIAkvKiBFbmFibGUgVFgvUlggc3luYyBlcnJvciBpbnRlcnJ1cHRzIGJ5IGRlZmF1bHQgKi8KIAlpZiAobWNic3AtPmlycSkKLQkJTUNCU1BfV1JJVEUobWNic3AsIElSUUVOLCBSU1lOQ0VSUkVOIHwgWFNZTkNFUlJFTik7CisJCU1DQlNQX1dSSVRFKG1jYnNwLCBJUlFFTiwgUlNZTkNFUlJFTiB8IFhTWU5DRVJSRU4gfAorCQkJICAgIFJVTkRGTEVOIHwgUk9WRkxFTiB8IFhVTkRGTEVOIHwgWE9WRkxFTik7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvb21hcC1hYmUtdHdsNjA0MC5jIGIvc291bmQvc29jL29tYXAvb21hcC1hYmUtdHdsNjA0MC5jCmluZGV4IGY2MWIzYjUuLjg5ZmU5NWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtYWJlLXR3bDYwNDAuYworKysgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLWFiZS10d2w2MDQwLmMKQEAgLTMwNSwyMyArMzA1LDE0IEBACiAKIAlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoY2FyZCwgcHJpdik7CiAKLQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoY2FyZCk7CisJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgY2FyZCk7CiAJaWYgKHJldCkKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAic25kX3NvY19yZWdpc3Rlcl9jYXJkKCkgZmFpbGVkOiAlZFxuIiwKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoKSBmYWlsZWQ6ICVkXG4iLAogCQkJcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF9hYmVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0Jc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoY2FyZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb21hcF9hYmVfb2ZfbWF0Y2hbXSA9IHsKIAl7LmNvbXBhdGlibGUgPSAidGksYWJlLXR3bDYwNDAiLCB9LAogCXsgfSwKQEAgLTMzNSw3ICszMjYsNiBAQAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvbWFwX2FiZV9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZSA9IG9tYXBfYWJlX3Byb2JlLAotCS5yZW1vdmUgPSBvbWFwX2FiZV9yZW1vdmUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBvbWFwX2FiZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwLXBjbS5jIGIvc291bmQvc29jL29tYXAvb21hcC1wY20uYwppbmRleCBhODRmNjc3Li45NGU5ZmY3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvb21hcC9vbWFwLXBjbS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtcGNtLmMKQEAgLTU4LDcgKzU4LDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBTTkRSVl9QQ01fRk9STUFUX0xBU1Q7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPD0gU05EUlZfUENNX0ZPUk1BVF9MQVNUOyBpKyspIHsKIAkJc3dpdGNoIChzbmRfcGNtX2Zvcm1hdF9waHlzaWNhbF93aWR0aChpKSkgewogCQljYXNlIDg6CiAJCWNhc2UgMTY6CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcWNvbS9hcHE4MDE2X3NiYy5jIGIvc291bmQvc29jL3Fjb20vYXBxODAxNl9zYmMuYwppbmRleCAxMjg5NTQzLi4wN2Y5MWU5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcWNvbS9hcHE4MDE2X3NiYy5jCisrKyBiL3NvdW5kL3NvYy9xY29tL2FwcTgwMTZfc2JjLmMKQEAgLTg1LDYgKzg1LDE1IEBACiAJCXJldHVybiBFUlJfUFRSKHJldCk7CiAJfQogCisJLyogREFQTSByb3V0ZXMgKi8KKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsICJxY29tLGF1ZGlvLXJvdXRpbmciKSkgeworCQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoY2FyZCwKKwkJCQkJInFjb20sYXVkaW8tcm91dGluZyIpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwogCS8qIFBvcHVsYXRlIGxpbmtzICovCiAJbnVtX2xpbmtzID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5vZGUpOwogCkBAIC0xNDcsNiArMTU2LDE1IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBhcHE4MDE2X3NiY19kYXBtX3dpZGdldHNbXSA9IHsKKworCVNORF9TT0NfREFQTV9NSUMoIkhhbmRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJTZWNvbmRhcnkgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWMxIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiRGlnaXRhbCBNaWMyIiwgTlVMTCksCit9OworCiBzdGF0aWMgaW50IGFwcTgwMTZfc2JjX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKQEAgLTE1OSw2ICsxNzcsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWNhcmQtPmRldiA9IGRldjsKKwljYXJkLT5kYXBtX3dpZGdldHMgPSBhcHE4MDE2X3NiY19kYXBtX3dpZGdldHM7CisJY2FyZC0+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+ZG1hX2NhcHR1cmU7CiAKIAlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCiAJCQkmczNjMjR4eF9pMnNfY29tcG9uZW50LCAmczNjMjR4eF9pMnNfZGFpLCAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3MzYzI0eHhfdWRhMTM0eC5jIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKaW5kZXggOTJlODhiYy4uNzg1M2ZiZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvczNjMjR4eF91ZGExMzR4LmMKQEAgLTU0LDggKzU0LDYgQEAKIH07CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlOwotCiBzdGF0aWMgaW50IHMzYzI0eHhfdWRhMTM0eF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKQEAgLTY2LDE3ICs2NCwxNyBAQAogCWludCByZXQgPSAwOwogCiAJbXV0ZXhfbG9jaygmY2xrX2xvY2spOwotCXByX2RlYnVnKCIlcyAlZFxuIiwgX19mdW5jX18sIGNsa191c2Vycyk7CisKIAlpZiAoY2xrX3VzZXJzID09IDApIHsKLQkJeHRhbCA9IGNsa19nZXQoJnMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlLT5kZXYsICJ4dGFsIik7CisJCXh0YWwgPSBjbGtfZ2V0KHJ0ZC0+ZGV2LCAieHRhbCIpOwogCQlpZiAoSVNfRVJSKHh0YWwpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzIGNhbm5vdCBnZXQgeHRhbFxuIiwgX19mdW5jX18pOworCQkJZGV2X2VycihydGQtPmRldiwgIiVzIGNhbm5vdCBnZXQgeHRhbFxuIiwgX19mdW5jX18pOwogCQkJcmV0ID0gUFRSX0VSUih4dGFsKTsKIAkJfSBlbHNlIHsKIAkJCXBjbGsgPSBjbGtfZ2V0KGNwdV9kYWktPmRldiwgImlpcyIpOwogCQkJaWYgKElTX0VSUihwY2xrKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiJXMgY2Fubm90IGdldCBwY2xrXG4iLAotCQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQkJZGV2X2VycihydGQtPmRldiwgIiVzIGNhbm5vdCBnZXQgcGNsa1xuIiwKKwkJCQkJX19mdW5jX18pOwogCQkJCWNsa19wdXQoeHRhbCk7CiAJCQkJcmV0ID0gUFRSX0VSUihwY2xrKTsKIAkJCX0KQEAgLTEwMiw4ICsxMDAsOCBAQAogCQkJCQkJIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAogCQkJCQkJICZod19jb25zdHJhaW50c19yYXRlcyk7CiAJCWlmIChyZXQgPCAwKQotCQkJcHJpbnRrKEtFUk5fRVJSICIlcyBjYW5ub3Qgc2V0IGNvbnN0cmFpbnRzXG4iLAotCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCWRldl9lcnIocnRkLT5kZXYsICIlcyBjYW5ub3Qgc2V0IGNvbnN0cmFpbnRzXG4iLAorCQkJCV9fZnVuY19fKTsKICNlbmRpZgogCX0KIAlyZXR1cm4gcmV0OwpAQCAtMTEyLDcgKzExMCw2IEBACiBzdGF0aWMgdm9pZCBzM2MyNHh4X3VkYTEzNHhfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJbXV0ZXhfbG9jaygmY2xrX2xvY2spOwotCXByX2RlYnVnKCIlcyAlZFxuIiwgX19mdW5jX18sIGNsa191c2Vycyk7CiAJY2xrX3VzZXJzIC09IDE7CiAJaWYgKGNsa191c2VycyA9PSAwKSB7CiAJCWNsa19wdXQoeHRhbCk7CkBAIC0xNTksMTggKzE1NiwxOSBAQAogCQljbGtfc291cmNlID0gUzNDMjRYWF9DTEtTUkNfUENMSzsKIAkJZGl2ID0gYmkgJSAzMzsKIAl9Ci0JcHJfZGVidWcoIiVzIGRlc2lyZWQgcmF0ZSAlbHUsICVkXG4iLCBfX2Z1bmNfXywgcmF0ZSwgYmkpOworCisJZGV2X2RiZyhydGQtPmRldiwgIiVzIGRlc2lyZWQgcmF0ZSAlbHUsICVkXG4iLCBfX2Z1bmNfXywgcmF0ZSwgYmkpOwogCiAJY2xrID0gKGZzX21vZGUgPT0gUzNDMjQxMF9JSVNNT0RfMzg0RlMgPyAzODQgOiAyNTYpICogcmF0ZTsKLQlwcl9kZWJ1ZygiJXMgd2lsbCB1c2U6ICVzICVzICVkIHN5c2NsayAlZCBlcnIgJWxkXG4iLCBfX2Z1bmNfXywKLQkJIGZzX21vZGUgPT0gUzNDMjQxMF9JSVNNT0RfMzg0RlMgPyAiMzg0RlMiIDogIjI1NkZTIiwKLQkJIGNsa19zb3VyY2UgPT0gUzNDMjRYWF9DTEtTUkNfTVBMTCA/ICJNUExMaW4iIDogIlBDTEsiLAotCQkgZGl2LCBjbGssIGVycik7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiJXMgd2lsbCB1c2U6ICVzICVzICVkIHN5c2NsayAlZCBlcnIgJWxkXG4iLCBfX2Z1bmNfXywKKwkJZnNfbW9kZSA9PSBTM0MyNDEwX0lJU01PRF8zODRGUyA/ICIzODRGUyIgOiAiMjU2RlMiLAorCQljbGtfc291cmNlID09IFMzQzI0WFhfQ0xLU1JDX01QTEwgPyAiTVBMTGluIiA6ICJQQ0xLIiwKKwkJZGl2LCBjbGssIGVycik7CiAKIAlpZiAoKGVyciAqIDEwMCAvIHJhdGUpID4gNSkgewotCQlwcmludGsoS0VSTl9FUlIgIlMzQzI0WFhfVURBMTM0WDogZWZmZWN0aXZlIGZyZXF1ZW5jeSAiCi0JCSAgICAgICAidG9vIGRpZmZlcmVudCBmcm9tIGRlc2lyZWQgKCVsZCUlKVxuIiwKLQkJICAgICAgIGVyciAqIDEwMCAvIHJhdGUpOworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZWZmZWN0aXZlIGZyZXF1ZW5jeSB0b28gZGlmZmVyZW50ICIKKwkJCQkgICJmcm9tIGRlc2lyZWQgKCVsZCUlKVxuIiwgZXJyICogMTAwIC8gcmF0ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjI3LDExNSArMjI1LDI3IEBACiAJLm51bV9saW5rcyA9IDEsCiB9OwogCi1zdGF0aWMgc3RydWN0IHMzYzI0eHhfdWRhMTM0eF9wbGF0Zm9ybV9kYXRhICpzM2MyNHh4X3VkYTEzNHhfbDNfcGluczsKLQotc3RhdGljIHZvaWQgc2V0ZGF0KGludCB2KQotewotCWdwaW9fc2V0X3ZhbHVlKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19kYXRhLCB2ID4gMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldGNsayhpbnQgdikKLXsKLQlncGlvX3NldF92YWx1ZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfY2xrLCB2ID4gMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldG1vZGUoaW50IHYpCi17Ci0JZ3Bpb19zZXRfdmFsdWUoczNjMjR4eF91ZGExMzR4X2wzX3BpbnMtPmwzX21vZGUsIHYgPiAwKTsKLX0KLQotLyogRklYTUUgLSBUaGlzIG11c3QgYmUgY29kZWMgcGxhdGZvcm0gZGF0YSBidXQgaW4gd2hpY2ggYm9hcmQgZmlsZSA/PyAqLwotc3RhdGljIHN0cnVjdCB1ZGExMzR4X3BsYXRmb3JtX2RhdGEgczNjMjR4eF91ZGExMzR4ID0gewotCS5sMyA9IHsKLQkJLnNldGRhdCA9IHNldGRhdCwKLQkJLnNldGNsayA9IHNldGNsaywKLQkJLnNldG1vZGUgPSBzZXRtb2RlLAotCQkuZGF0YV9ob2xkID0gMSwKLQkJLmRhdGFfc2V0dXAgPSAxLAotCQkuY2xvY2tfaGlnaCA9IDEsCi0JCS5tb2RlX2hvbGQgPSAxLAotCQkubW9kZSA9IDEsCi0JCS5tb2RlX3NldHVwID0gMSwKLQl9LAotfTsKLQotc3RhdGljIGludCBzM2MyNHh4X3VkYTEzNHhfc2V0dXBfcGluKGludCBwaW4sIGNoYXIgKmZ1bikKLXsKLQlpZiAoZ3Bpb19yZXF1ZXN0KHBpbiwgInMzYzI0eHhfdWRhMTM0eCIpIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlMzQzI0WFhfVURBMTM0WCBTb0MgQXVkaW86ICIKLQkJICAgICAgICJsMyAlcyBwaW4gYWxyZWFkeSBpbiB1c2UiLCBmdW4pOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQocGluLCAwKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBzM2MyNHh4X3VkYTEzNHhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJnNuZF9zb2NfczNjMjR4eF91ZGExMzR4OwogCWludCByZXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICJTM0MyNFhYX1VEQTEzNFggU29DIEF1ZGlvIGRyaXZlclxuIik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2FyZCk7CisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKIAotCXMzYzI0eHhfdWRhMTM0eF9sM19waW5zID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTM0MyNFhYX1VEQTEzNFggU29DIEF1ZGlvOiAiCi0JCSAgICAgICAidW5hYmxlIHRvIGZpbmQgcGxhdGZvcm0gZGF0YVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlzM2MyNHh4X3VkYTEzNHgucG93ZXIgPSBzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+cG93ZXI7Ci0JczNjMjR4eF91ZGExMzR4Lm1vZGVsID0gczNjMjR4eF91ZGExMzR4X2wzX3BpbnMtPm1vZGVsOwotCi0JaWYgKHMzYzI0eHhfdWRhMTM0eF9zZXR1cF9waW4oczNjMjR4eF91ZGExMzR4X2wzX3BpbnMtPmwzX2RhdGEsCi0JCQkJICAgICAgImRhdGEiKSA8IDApCi0JCXJldHVybiAtRUJVU1k7Ci0JaWYgKHMzYzI0eHhfdWRhMTM0eF9zZXR1cF9waW4oczNjMjR4eF91ZGExMzR4X2wzX3BpbnMtPmwzX2NsaywKLQkJCQkgICAgICAiY2xrIikgPCAwKSB7Ci0JCWdwaW9fZnJlZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfZGF0YSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCWlmIChzM2MyNHh4X3VkYTEzNHhfc2V0dXBfcGluKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19tb2RlLAotCQkJCSAgICAgICJtb2RlIikgPCAwKSB7Ci0JCWdwaW9fZnJlZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfZGF0YSk7Ci0JCWdwaW9fZnJlZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfY2xrKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlzM2MyNHh4X3VkYTEzNHhfc25kX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9hbGxvYygic29jLWF1ZGlvIiwgLTEpOwotCWlmICghczNjMjR4eF91ZGExMzR4X3NuZF9kZXZpY2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTM0MyNFhYX1VEQTEzNFggU29DIEF1ZGlvOiAiCi0JCSAgICAgICAiVW5hYmxlIHRvIHJlZ2lzdGVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoczNjMjR4eF91ZGExMzR4X3NuZF9kZXZpY2UsCi0JCQkgICAgICZzbmRfc29jX3MzYzI0eHhfdWRhMTM0eCk7Ci0JcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlLCAmczNjMjR4eF91ZGExMzR4LCBzaXplb2YoczNjMjR4eF91ZGExMzR4KSk7Ci0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzM2MyNHh4X3VkYTEzNHhfc25kX2RldmljZSk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgIlMzQzI0WFhfVURBMTM0WCBTb0MgQXVkaW86IFVuYWJsZSB0byBhZGRcbiIpOwotCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHMzYzI0eHhfdWRhMTM0eF9zbmRfZGV2aWNlKTsKLQl9CisJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgY2FyZCk7CisJaWYgKHJldCkKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGNhcmQ6ICVkXG4iLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzM2MyNHh4X3VkYTEzNHhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoczNjMjR4eF91ZGExMzR4X3NuZF9kZXZpY2UpOwotCWdwaW9fZnJlZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfZGF0YSk7Ci0JZ3Bpb19mcmVlKHMzYzI0eHhfdWRhMTM0eF9sM19waW5zLT5sM19jbGspOwotCWdwaW9fZnJlZShzM2MyNHh4X3VkYTEzNHhfbDNfcGlucy0+bDNfbW9kZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHMzYzI0eHhfdWRhMTM0eF9kcml2ZXIgPSB7CiAJLnByb2JlICA9IHMzYzI0eHhfdWRhMTM0eF9wcm9iZSwKLQkucmVtb3ZlID0gczNjMjR4eF91ZGExMzR4X3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9ICJzM2MyNHh4X3VkYTEzNHgiLAogCX0sCiB9OwotCiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHMzYzI0eHhfdWRhMTM0eF9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJab2x0YW4gRGV2YWksIENocmlzdGlhbiBQZWxsZWdyaW4gPGNocmlwZWxsQGV2b2x3YXJlLm9yZz4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204NTgwcGNtLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODU4MHBjbS5jCmluZGV4IDZkZWVjNTIuLmE2ZDIyMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204NTgwcGNtLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg1ODBwY20uYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKICNpbmNsdWRlICIuLi9jb2RlY3Mvd204NTgwLmgiCi0jaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAicGNtLmgiCiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NHBjbS5jIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTRwY20uYwppbmRleCBiMWM4OWVjLi4yZTYyMTQ5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NHBjbS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0cGNtLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAKICNpbmNsdWRlICIuLi9jb2RlY3Mvd204OTk0LmgiCi0jaW5jbHVkZSAiZG1hLmgiCiAjaW5jbHVkZSAicGNtLmgiCiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5jIGIvc291bmQvc29jL3NhbXN1bmcvc3BkaWYuYwppbmRleCAwY2I5Yzg1Li4yNmMxZmJlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGRpZi5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZGlmLmMKQEAgLTkwLDEwICs5MCwxMCBAQAogCXUzMgkJc2F2ZWRfY2xrY29uOwogCXUzMgkJc2F2ZWRfY29uOwogCXUzMgkJc2F2ZWRfY3N0YXM7Ci0Jc3RydWN0IHMzY19kbWFfcGFyYW1zCSpkbWFfcGxheWJhY2s7CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfcGxheWJhY2s7CiB9OwogCi1zdGF0aWMgc3RydWN0IHMzY19kbWFfcGFyYW1zIHNwZGlmX3N0ZXJlb19vdXQ7CitzdGF0aWMgc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIHNwZGlmX3N0ZXJlb19vdXQ7CiBzdGF0aWMgc3RydWN0IHNhbXN1bmdfc3BkaWZfaW5mbyBzcGRpZl9pbmZvOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzYW1zdW5nX3NwZGlmX2luZm8gKnRvX2luZm8oc3RydWN0IHNuZF9zb2NfZGFpICpjcHVfZGFpKQpAQCAtMTc5LDcgKzE3OSw3IEBACiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzYW1zdW5nX3NwZGlmX2luZm8gKnNwZGlmID0gdG9faW5mbyhydGQtPmNwdV9kYWkpOwogCXZvaWQgX19pb21lbSAqcmVncyA9IHNwZGlmLT5yZWdzOwotCXN0cnVjdCBzM2NfZG1hX3BhcmFtcyAqZG1hX2RhdGE7CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfZGF0YTsKIAl1MzIgY29uLCBjbGtjb24sIGNzdGFzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGksIHJhdGlvOwpAQCAtNDI1LDExICs0MjUsMTEgQEAKIAkJZ290byBlcnI0OwogCX0KIAotCXNwZGlmX3N0ZXJlb19vdXQuZG1hX3NpemUgPSAyOwotCXNwZGlmX3N0ZXJlb19vdXQuZG1hX2FkZHIgPSBtZW1fcmVzLT5zdGFydCArIERBVEFfT1VUQlVGOworCXNwZGlmX3N0ZXJlb19vdXQuYWRkcl93aWR0aCA9IDI7CisJc3BkaWZfc3RlcmVvX291dC5hZGRyID0gbWVtX3Jlcy0+c3RhcnQgKyBEQVRBX09VVEJVRjsKIAlmaWx0ZXIgPSBOVUxMOwogCWlmIChzcGRpZl9wZGF0YSkgewotCQlzcGRpZl9zdGVyZW9fb3V0LnNsYXZlID0gc3BkaWZfcGRhdGEtPmRtYV9wbGF5YmFjazsKKwkJc3BkaWZfc3RlcmVvX291dC5maWx0ZXJfZGF0YSA9IHNwZGlmX3BkYXRhLT5kbWFfcGxheWJhY2s7CiAJCWZpbHRlciA9IHNwZGlmX3BkYXRhLT5kbWFfZmlsdGVyOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL0tjb25maWcgYi9zb3VuZC9zb2Mvc2gvS2NvbmZpZwppbmRleCA5MzExZjExLi42ZGI2NDA1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvS2NvbmZpZworKysgYi9zb3VuZC9zb2Mvc2gvS2NvbmZpZwpAQCAtNDIsMTIgKzQyLDYgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIFItQ2FyIFNSVS9TQ1UvU1NJVS9TU0kgc291bmQgc3VwcG9ydAogCi1jb25maWcgU05EX1NPQ19SU1JDX0NBUkQKLQl0cmlzdGF0ZSAiUmVuZXNhcyBTYW1wbGluZyBSYXRlIENvbnZlcnQgU291bmQgQ2FyZCIKLQlzZWxlY3QgU05EX1NJTVBMRV9DQVJEX1VUSUxTCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzaW1wbGUgc291bmQgaWYgeW91IG5lZWQgc2FtcGxpbmcgcmF0ZSBjb252ZXJ0Ci0KICMjCiAjIyBCb2FyZHMKICMjCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9NYWtlZmlsZSBiL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlCmluZGV4IGE4OWRkZjcuLjljM2Q1YWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL01ha2VmaWxlCkBAIC0xLDUgKzEsMiBAQAogc25kLXNvYy1yY2FyLW9ianMJOj0gY29yZS5vIGdlbi5vIGRtYS5vIGFkZy5vIHNzaS5vIHNzaXUubyBzcmMubyBjdHUubyBtaXgubyBkdmMubyBjbWQubwogb2JqLSQoQ09ORklHX1NORF9TT0NfUkNBUikJKz0gc25kLXNvYy1yY2FyLm8KLQotc25kLXNvYy1yc3JjLWNhcmQtb2Jqcwk6PSByc3JjLWNhcmQubwotb2JqLSQoQ09ORklHX1NORF9TT0NfUlNSQ19DQVJEKQkrPSBzbmQtc29jLXJzcmMtY2FyZC5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9jb3JlLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9jb3JlLmMKaW5kZXggMzM1MWE3MC4uZjE4MTQxMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvY29yZS5jCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL2NvcmUuYwpAQCAtMTEwLDYgKzExMCw3IEBACiAvKgogICoJcnNuZF9tb2QgZnVuY3Rpb25zCiAgKi8KKyNpZmRlZiBERUJVRwogdm9pZCByc25kX21vZF9tYWtlX3N1cmUoc3RydWN0IHJzbmRfbW9kICptb2QsIGVudW0gcnNuZF9tb2RfdHlwZSB0eXBlKQogewogCWlmIChtb2QtPnR5cGUgIT0gdHlwZSkgewpAQCAtMTIwLDYgKzEyMSw3IEBACiAJCQkgcnNuZF9tb2RfbmFtZShtb2QpLCByc25kX21vZF9pZChtb2QpKTsKIAl9CiB9CisjZW5kaWYKIAogY2hhciAqcnNuZF9tb2RfbmFtZShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKIHsKQEAgLTU3NCw2ICs1NzYsNyBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgogCQlyc25kX2RhaV9zdHJlYW1faW5pdChpbywgc3Vic3RyZWFtKTsKIAogCQlyZXQgPSByc25kX2RhaV9jYWxsKGluaXQsIGlvLCBwcml2KTsKQEAgLTU5MCw2ICs1OTMsNyBAQAogCiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CiAJCXJldCA9IHJzbmRfZGFpX2NhbGwoaXJxLCBpbywgcHJpdiwgMCk7CiAKIAkJcmV0IHw9IHJzbmRfZGFpX2NhbGwoc3RvcCwgaW8sIHByaXYpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvcnNyYy1jYXJkLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9yc3JjLWNhcmQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzN2Y4NC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9yc3JjLWNhcmQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi0vKgotICogUmVuZXNhcyBTYW1wbGluZyBSYXRlIENvbnZlcnQgU291bmQgQ2FyZCBmb3IgRFBDTQotICoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgotICogS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPgotICoKLSAqIGJhc2VkIG9uICR7TElOVVh9L3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0jaW5jbHVkZSA8bGludXgvY2xrLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLWRhaS5oPgotI2luY2x1ZGUgPHNvdW5kL3NpbXBsZV9jYXJkX3V0aWxzLmg+Ci0KLXN0cnVjdCByc3JjX2NhcmRfb2ZfZGF0YSB7Ci0JY29uc3QgY2hhciAqcHJlZml4OwotCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgKnJvdXRlczsKLQlpbnQgbnVtX3JvdXRlczsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHJvdXRlc19zc2kwX2FrNDY0MltdID0gewotCXsiYWs0NjQyIFBsYXliYWNrIiwgTlVMTCwgIkRBSTAgUGxheWJhY2sifSwKLQl7IkRBSTAgQ2FwdHVyZSIsIE5VTEwsICJhazQ2NDIgQ2FwdHVyZSJ9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCByc3JjX2NhcmRfb2ZfZGF0YSByb3V0ZXNfb2Zfc3NpMF9hazQ2NDIgPSB7Ci0JLnByZWZpeAkJPSAiYWs0NjQyIiwKLQkucm91dGVzCQk9IHJvdXRlc19zc2kwX2FrNDY0MiwKLQkubnVtX3JvdXRlcwk9IEFSUkFZX1NJWkUocm91dGVzX3NzaTBfYWs0NjQyKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJzcmNfY2FyZF9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyc3JjLWNhcmQsbGFnZXIiLAkuZGF0YSA9ICZyb3V0ZXNfb2Zfc3NpMF9hazQ2NDIgfSwKLQl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscnNyYy1jYXJkLGtvZWxzY2giLAkuZGF0YSA9ICZyb3V0ZXNfb2Zfc3NpMF9hazQ2NDIgfSwKLQl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscnNyYy1jYXJkIiwgfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCByc3JjX2NhcmRfb2ZfbWF0Y2gpOwotCi0jZGVmaW5lIElEWF9DUFUJCTAKLSNkZWZpbmUgSURYX0NPREVDCTEKLXN0cnVjdCByc3JjX2NhcmRfcHJpdiB7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfY2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlY19jb25mIGNvZGVjX2NvbmY7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKLQl1MzIgY29udmVydF9yYXRlOwotCXUzMiBjb252ZXJ0X2NoYW5uZWxzOwotfTsKLQotI2RlZmluZSByc3JjX3ByaXZfdG9fZGV2KHByaXYpICgocHJpdiktPnNuZF9jYXJkLmRldikKLSNkZWZpbmUgcnNyY19wcml2X3RvX2xpbmsocHJpdiwgaSkgKChwcml2KS0+c25kX2NhcmQuZGFpX2xpbmsgKyAoaSkpCi0jZGVmaW5lIHJzcmNfcHJpdl90b19wcm9wcyhwcml2LCBpKSAoKHByaXYpLT5kYWlfcHJvcHMgKyAoaSkpCi0KLXN0YXRpYyBpbnQgcnNyY19jYXJkX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdiA9CXNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwotCXN0cnVjdCBhc29jX3NpbXBsZV9kYWkgKmRhaV9wcm9wcyA9Ci0JCXJzcmNfcHJpdl90b19wcm9wcyhwcml2LCBydGQtPm51bSk7Ci0KLQlyZXR1cm4gY2xrX3ByZXBhcmVfZW5hYmxlKGRhaV9wcm9wcy0+Y2xrKTsKLX0KLQotc3RhdGljIHZvaWQgcnNyY19jYXJkX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYgPQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHMgPQotCQlyc3JjX3ByaXZfdG9fcHJvcHMocHJpdiwgcnRkLT5udW0pOwotCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhaV9wcm9wcy0+Y2xrKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyByc3JjX2NhcmRfb3BzID0gewotCS5zdGFydHVwID0gcnNyY19jYXJkX3N0YXJ0dXAsCi0JLnNodXRkb3duID0gcnNyY19jYXJkX3NodXRkb3duLAotfTsKLQotc3RhdGljIGludCByc3JjX2NhcmRfZGFpX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbms7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzOwotCWludCBudW0gPSBydGQtPm51bTsKLQlpbnQgcmV0OwotCi0JZGFpX2xpbmsJPSByc3JjX3ByaXZfdG9fbGluayhwcml2LCBudW0pOwotCWRhaV9wcm9wcwk9IHJzcmNfcHJpdl90b19wcm9wcyhwcml2LCBudW0pOwotCWRhaQkJPSBkYWlfbGluay0+ZHluYW1pYyA/Ci0JCQkJcnRkLT5jcHVfZGFpIDoKLQkJCQlydGQtPmNvZGVjX2RhaTsKLQotCWlmIChkYWlfcHJvcHMtPnN5c2NsaykgewotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGRhaSwgMCwgZGFpX3Byb3BzLT5zeXNjbGssIDApOwotCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJzZXRfc3lzY2xrIGVycm9yXG4iKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JaWYgKGRhaV9wcm9wcy0+c2xvdHMpIHsKLQkJcmV0ID0gc25kX3NvY19kYWlfc2V0X3RkbV9zbG90KGRhaSwKLQkJCQkJICAgICAgIGRhaV9wcm9wcy0+dHhfc2xvdF9tYXNrLAotCQkJCQkgICAgICAgZGFpX3Byb3BzLT5yeF9zbG90X21hc2ssCi0JCQkJCSAgICAgICBkYWlfcHJvcHMtPnNsb3RzLAotCQkJCQkgICAgICAgZGFpX3Byb3BzLT5zbG90X3dpZHRoKTsKLQkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7Ci0JCQlkZXZfZXJyKGRhaS0+ZGV2LCAic2V0X3RkbV9zbG90IGVycm9yXG4iKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfQotCi0JcmV0ID0gMDsKLQotZXJyOgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcnNyY19jYXJkX2JlX2h3X3BhcmFtc19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAotCQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJCQkJICAgICAgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOwotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKLQotCWlmIChwcml2LT5jb252ZXJ0X3JhdGUpCi0JCXJhdGUtPm1pbiA9Ci0JCXJhdGUtPm1heCA9IHByaXYtPmNvbnZlcnRfcmF0ZTsKLQotCWlmIChwcml2LT5jb252ZXJ0X2NoYW5uZWxzKQotCQljaGFubmVscy0+bWluID0KLQkJY2hhbm5lbHMtPm1heCA9IHByaXYtPmNvbnZlcnRfY2hhbm5lbHM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByc3JjX2NhcmRfcGFyc2VfbGlua3Moc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkgc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2LAotCQkJCSBpbnQgaWR4LCBib29sIGlzX2ZlKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzcmNfcHJpdl90b19kZXYocHJpdik7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnNyY19wcml2X3RvX2xpbmsocHJpdiwgaWR4KTsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHMgPSByc3JjX3ByaXZfdG9fcHJvcHMocHJpdiwgaWR4KTsKLQlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGFyZ3M7Ci0JaW50IHJldDsKLQotCS8qCi0JICogR2V0IG5vZGUgdmlhICJzb3VuZC1kYWkgPSA8JnBoYW5kbGUgcG9ydD4iCi0JICogaXQgd2lsbCBiZSB1c2VkIGFzIHh4eF9vZl9ub2RlIG9uIHNvY19iaW5kX2RhaV9saW5rKCkKLQkgKi8KLQlyZXQgPSBvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhucCwgInNvdW5kLWRhaSIsCi0JCQkJCSAiI3NvdW5kLWRhaS1jZWxscyIsIDAsICZhcmdzKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogUGFyc2UgVERNIHNsb3QgKi8KLQlyZXQgPSBzbmRfc29jX29mX3BhcnNlX3RkbV9zbG90KG5wLAotCQkJCQkmZGFpX3Byb3BzLT50eF9zbG90X21hc2ssCi0JCQkJCSZkYWlfcHJvcHMtPnJ4X3Nsb3RfbWFzaywKLQkJCQkJJmRhaV9wcm9wcy0+c2xvdHMsCi0JCQkJCSZkYWlfcHJvcHMtPnNsb3Rfd2lkdGgpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoaXNfZmUpIHsKLQkJLyogQkUgaXMgZHVtbXkgKi8KLQkJZGFpX2xpbmstPmNvZGVjX29mX25vZGUJCT0gTlVMTDsKLQkJZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lCT0gInNuZC1zb2MtZHVtbXktZGFpIjsKLQkJZGFpX2xpbmstPmNvZGVjX25hbWUJCT0gInNuZC1zb2MtZHVtbXkiOwotCi0JCS8qIEZFIHNldHRpbmdzICovCi0JCWRhaV9saW5rLT5keW5hbWljCQk9IDE7Ci0JCWRhaV9saW5rLT5kcGNtX21lcmdlZF9mb3JtYXQJPSAxOwotCQlkYWlfbGluay0+Y3B1X29mX25vZGUJCT0gYXJncy5ucDsKLQkJcmV0ID0gc25kX3NvY19vZl9nZXRfZGFpX25hbWUobnAsICZkYWlfbGluay0+Y3B1X2RhaV9uYW1lKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc2V0X2RhaWxpbmtfbmFtZShkZXYsIGRhaV9saW5rLAotCQkJCQkJCSJmZS4lcyIsCi0JCQkJCQkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQotCQkvKgotCQkgKiBJbiBzb2NfYmluZF9kYWlfbGluaygpIHdpbGwgY2hlY2sgY3B1IG5hbWUgYWZ0ZXIKLQkJICogb2Zfbm9kZSBtYXRjaGluZyBpZiBkYWlfbGluayBoYXMgY3B1X2RhaV9uYW1lLgotCQkgKiBidXQsIGl0IHdpbGwgbmV2ZXIgbWF0Y2ggaWYgbmFtZSB3YXMgY3JlYXRlZCBieQotCQkgKiBmbXRfc2luZ2xlX25hbWUoKSByZW1vdmUgY3B1X2RhaV9uYW1lIGlmIGNwdV9hcmdzCi0JCSAqIHdhcyAwLiBTZWU6Ci0JCSAqCWZtdF9zaW5nbGVfbmFtZSgpCi0JCSAqCWZtdF9tdWx0aXBsZV9uYW1lKCkKLQkJICovCi0JCWlmICghYXJncy5hcmdzX2NvdW50KQotCQkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZSA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJY29uc3Qgc3RydWN0IHJzcmNfY2FyZF9vZl9kYXRhICpvZl9kYXRhOwotCi0JCW9mX2RhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTsKLQotCQkvKiBGRSBpcyBkdW1teSAqLwotCQlkYWlfbGluay0+Y3B1X29mX25vZGUJCT0gTlVMTDsKLQkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZQkJPSAic25kLXNvYy1kdW1teS1kYWkiOwotCQlkYWlfbGluay0+Y3B1X25hbWUJCT0gInNuZC1zb2MtZHVtbXkiOwotCi0JCS8qIEJFIHNldHRpbmdzICovCi0JCWRhaV9saW5rLT5ub19wY20JCT0gMTsKLQkJZGFpX2xpbmstPmJlX2h3X3BhcmFtc19maXh1cAk9IHJzcmNfY2FyZF9iZV9od19wYXJhbXNfZml4dXA7Ci0JCWRhaV9saW5rLT5jb2RlY19vZl9ub2RlCQk9IGFyZ3MubnA7Ci0JCXJldCA9IHNuZF9zb2Nfb2ZfZ2V0X2RhaV9uYW1lKG5wLCAmZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfc2V0X2RhaWxpbmtfbmFtZShkZXYsIGRhaV9saW5rLAotCQkJCQkJCSJiZS4lcyIsCi0JCQkJCQkJZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCS8qIGFkZGl0aW9uYWwgbmFtZSBwcmVmaXggKi8KLQkJaWYgKG9mX2RhdGEpIHsKLQkJCXByaXYtPmNvZGVjX2NvbmYub2Zfbm9kZSA9IGRhaV9saW5rLT5jb2RlY19vZl9ub2RlOwotCQkJcHJpdi0+Y29kZWNfY29uZi5uYW1lX3ByZWZpeCA9IG9mX2RhdGEtPnByZWZpeDsKLQkJfSBlbHNlIHsKLQkJCXNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcHJlZml4KCZwcml2LT5zbmRfY2FyZCwKLQkJCQkJCSAgICAgICZwcml2LT5jb2RlY19jb25mLAotCQkJCQkJICAgICAgZGFpX2xpbmstPmNvZGVjX29mX25vZGUsCi0JCQkJCQkgICAgICAiYXVkaW8tcHJlZml4Iik7Ci0JCX0KLQl9Ci0KLQkvKiBTaW1wbGUgQ2FyZCBhc3N1bWVzIHBsYXRmb3JtID09IGNwdSAqLwotCWRhaV9saW5rLT5wbGF0Zm9ybV9vZl9ub2RlCT0gZGFpX2xpbmstPmNwdV9vZl9ub2RlOwotCWRhaV9saW5rLT5kcGNtX3BsYXliYWNrCQk9IDE7Ci0JZGFpX2xpbmstPmRwY21fY2FwdHVyZQkJPSAxOwotCWRhaV9saW5rLT5vcHMJCQk9ICZyc3JjX2NhcmRfb3BzOwotCWRhaV9saW5rLT5pbml0CQkJPSByc3JjX2NhcmRfZGFpX2luaXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByc3JjX2NhcmRfcGFyc2VfY2xrKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCQkgICAgICAgc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2LAotCQkJICAgICAgIGludCBpZHgsIGJvb2wgaXNfZmUpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gcnNyY19wcml2X3RvX2xpbmsocHJpdiwgaWR4KTsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpkYWlfcHJvcHMgPSByc3JjX3ByaXZfdG9fcHJvcHMocHJpdiwgaWR4KTsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpvZl9ucCA9IGlzX2ZlID8JZGFpX2xpbmstPmNwdV9vZl9ub2RlIDoKLQkJCQkJCWRhaV9saW5rLT5jb2RlY19vZl9ub2RlOwotCXUzMiB2YWw7Ci0KLQkvKgotCSAqIFBhcnNlIGRhaS0+c3lzY2xrIGNvbWUgZnJvbSAiY2xvY2tzID0gPCZ4eHg+IgotCSAqIChpZiBzeXN0ZW0gaGFzIGNvbW1vbiBjbG9jaykKLQkgKiAgb3IgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kgPSA8eHh4PiIKLQkgKiAgb3IgZGV2aWNlJ3MgbW9kdWxlIGNsb2NrLgotCSAqLwotCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJjbG9ja3MiKSkgewotCQljbGsgPSBvZl9jbGtfZ2V0KG5wLCAwKTsKLQkJaWYgKElTX0VSUihjbGspKQotCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKLQotCQlkYWlfcHJvcHMtPnN5c2NsayA9IGNsa19nZXRfcmF0ZShjbGspOwotCQlkYWlfcHJvcHMtPmNsayA9IGNsazsKLQl9IGVsc2UgaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kiLCAmdmFsKSkgewotCQlkYWlfcHJvcHMtPnN5c2NsayA9IHZhbDsKLQl9IGVsc2UgewotCQljbGsgPSBvZl9jbGtfZ2V0KG9mX25wLCAwKTsKLQkJaWYgKCFJU19FUlIoY2xrKSkKLQkJCWRhaV9wcm9wcy0+c3lzY2xrID0gY2xrX2dldF9yYXRlKGNsayk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnNyY19jYXJkX2RhaV9zdWJfbGlua19vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0JCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCSAgICAgc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2LAotCQkJCSAgICAgaW50IGlkeCwgYm9vbCBpc19mZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc3JjX3ByaXZfdG9fZGV2KHByaXYpOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHJzcmNfcHJpdl90b19saW5rKHByaXYsIGlkeCk7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqZGFpX3Byb3BzID0gcnNyY19wcml2X3RvX3Byb3BzKHByaXYsIGlkeCk7Ci0JaW50IHJldDsKLQotCXJldCA9IHJzcmNfY2FyZF9wYXJzZV9saW5rcyhucCwgcHJpdiwgaWR4LCBpc19mZSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSByc3JjX2NhcmRfcGFyc2VfY2xrKG5wLCBwcml2LCBpZHgsIGlzX2ZlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWRldl9kYmcoZGV2LCAiXHQlcyAvICUwNHggLyAlZFxuIiwKLQkJZGFpX2xpbmstPm5hbWUsCi0JCWRhaV9saW5rLT5kYWlfZm10LAotCQlkYWlfcHJvcHMtPnN5c2Nsayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJzcmNfY2FyZF9kYWlfbGlua19vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCi0JCQkJIHN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc3JjX3ByaXZfdG9fZGV2KHByaXYpOwotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXVuc2lnbmVkIGludCBkYWlmbXQgPSAwOwotCWludCByZXQsIGk7Ci0JYm9vbCBpc19mZTsKLQotCS8qIGZpbmQgMXN0IGNvZGVjICovCi0JaSA9IDA7Ci0JZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShub2RlLCBucCkgewotCQlkYWlfbGluayA9IHJzcmNfcHJpdl90b19saW5rKHByaXYsIGkpOwotCi0JCWlmIChzdHJjbXAobnAtPm5hbWUsICJjb2RlYyIpID09IDApIHsKLQkJCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfZGFpZm10KGRldiwgbm9kZSwgbnAsCi0JCQkJCQkJICAgIE5VTEwsICZkYWlmbXQpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJcmV0dXJuIHJldDsKLQkJCWJyZWFrOwotCQl9Ci0JCWkrKzsKLQl9Ci0KLQlpID0gMDsKLQlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5vZGUsIG5wKSB7Ci0JCWRhaV9saW5rID0gcnNyY19wcml2X3RvX2xpbmsocHJpdiwgaSk7Ci0JCWRhaV9saW5rLT5kYWlfZm10ID0gZGFpZm10OwotCi0JCWlzX2ZlID0gZmFsc2U7Ci0JCWlmIChzdHJjbXAobnAtPm5hbWUsICJjcHUiKSA9PSAwKQotCQkJaXNfZmUgPSB0cnVlOwotCi0JCXJldCA9IHJzcmNfY2FyZF9kYWlfc3ViX2xpbmtfb2Yobm9kZSwgbnAsIHByaXYsIGksIGlzX2ZlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlpKys7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcnNyY19jYXJkX3BhcnNlX29mKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICAgIHN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQljb25zdCBzdHJ1Y3QgcnNyY19jYXJkX29mX2RhdGEgKm9mX2RhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNoX2RhdGEoZGV2KTsKLQlzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpICpwcm9wczsKLQlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqbGlua3M7Ci0JaW50IHJldDsKLQlpbnQgbnVtOwotCi0JaWYgKCFub2RlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW51bSA9IG9mX2dldF9jaGlsZF9jb3VudChub2RlKTsKLQlwcm9wcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJvcHMpICogbnVtLCBHRlBfS0VSTkVMKTsKLQlsaW5rcyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqbGlua3MpICogbnVtLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByb3BzIHx8ICFsaW5rcykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcml2LT5kYWlfcHJvcHMJPSBwcm9wczsKLQlwcml2LT5kYWlfbGluawk9IGxpbmtzOwotCi0JLyogSW5pdCBzbmRfc29jX2NhcmQgKi8KLQlwcml2LT5zbmRfY2FyZC5vd25lcgkJCT0gVEhJU19NT0RVTEU7Ci0JcHJpdi0+c25kX2NhcmQuZGV2CQkJPSBkZXY7Ci0JcHJpdi0+c25kX2NhcmQuZGFpX2xpbmsJCQk9IHByaXYtPmRhaV9saW5rOwotCXByaXYtPnNuZF9jYXJkLm51bV9saW5rcwkJPSBudW07Ci0JcHJpdi0+c25kX2NhcmQuY29kZWNfY29uZgkJPSAmcHJpdi0+Y29kZWNfY29uZjsKLQlwcml2LT5zbmRfY2FyZC5udW1fY29uZmlncwkJPSAxOwotCi0JaWYgKG9mX2RhdGEpIHsKLQkJcHJpdi0+c25kX2NhcmQub2ZfZGFwbV9yb3V0ZXMJCT0gb2ZfZGF0YS0+cm91dGVzOwotCQlwcml2LT5zbmRfY2FyZC5udW1fb2ZfZGFwbV9yb3V0ZXMJPSBvZl9kYXRhLT5udW1fcm91dGVzOwotCX0gZWxzZSB7Ci0JCXNuZF9zb2Nfb2ZfcGFyc2VfYXVkaW9fcm91dGluZygmcHJpdi0+c25kX2NhcmQsCi0JCQkJCSAgICAgICAiYXVkaW8tcm91dGluZyIpOwotCX0KLQotCS8qIHNhbXBsaW5nIHJhdGUgY29udmVydCAqLwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJjb252ZXJ0LXJhdGUiLCAmcHJpdi0+Y29udmVydF9yYXRlKTsKLQotCS8qIGNoYW5uZWxzIHRyYW5zZmVyICovCi0Jb2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgImNvbnZlcnQtY2hhbm5lbHMiLCAmcHJpdi0+Y29udmVydF9jaGFubmVscyk7Ci0KLQlkZXZfZGJnKGRldiwgIk5ldyByc3JjLWF1ZGlvLWNhcmQ6ICVzXG4iLAotCQlwcml2LT5zbmRfY2FyZC5uYW1lID8gcHJpdi0+c25kX2NhcmQubmFtZSA6ICIiKTsKLQlkZXZfZGJnKGRldiwgIlNSQyA6IGNvbnZlcnRfcmF0ZSAgICAgJWRcbiIsIHByaXYtPmNvbnZlcnRfcmF0ZSk7Ci0JZGV2X2RiZyhkZXYsICJDVFUgOiBjb252ZXJ0X2NoYW5uZWxzICVkXG4iLCBwcml2LT5jb252ZXJ0X2NoYW5uZWxzKTsKLQotCXJldCA9IHJzcmNfY2FyZF9kYWlfbGlua19vZihub2RlLCBwcml2KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGFzb2Nfc2ltcGxlX2NhcmRfcGFyc2VfY2FyZF9uYW1lKCZwcml2LT5zbmRfY2FyZCwgImNhcmQtIik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogRGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZGV2aWNlIG5vZGVzICovCi1zdGF0aWMgaW50IHJzcmNfY2FyZF91bnJlZihzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQotewotCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKLQlpbnQgbnVtX2xpbmtzOwotCi0JZm9yIChudW1fbGlua3MgPSAwLCBkYWlfbGluayA9IGNhcmQtPmRhaV9saW5rOwotCSAgICAgbnVtX2xpbmtzIDwgY2FyZC0+bnVtX2xpbmtzOwotCSAgICAgbnVtX2xpbmtzKyssIGRhaV9saW5rKyspIHsKLQkJb2Zfbm9kZV9wdXQoZGFpX2xpbmstPmNwdV9vZl9ub2RlKTsKLQkJb2Zfbm9kZV9wdXQoZGFpX2xpbmstPmNvZGVjX29mX25vZGUpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByc3JjX2NhcmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXY7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0JaW50IHJldDsKLQotCS8qIEFsbG9jYXRlIHRoZSBwcml2YXRlIGRhdGEgKi8KLQlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IHJzcmNfY2FyZF9wYXJzZV9vZihucCwgcHJpdiwgZGV2KTsKLQlpZiAocmV0IDwgMCkgewotCQlpZiAocmV0ICE9IC1FUFJPQkVfREVGRVIpCi0JCQlkZXZfZXJyKGRldiwgInBhcnNlIGVycm9yICVkXG4iLCByZXQpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJnByaXYtPnNuZF9jYXJkLCBwcml2KTsKLQotCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZwcml2LT5zbmRfY2FyZCk7Ci0JaWYgKHJldCA+PSAwKQotCQlyZXR1cm4gcmV0OwotZXJyOgotCXJzcmNfY2FyZF91bnJlZigmcHJpdi0+c25kX2NhcmQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByc3JjX2NhcmRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JcmV0dXJuIHJzcmNfY2FyZF91bnJlZihjYXJkKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcnNyY19jYXJkID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gInJlbmVzYXMtc3JjLWF1ZGlvLWNhcmQiLAotCQkub2ZfbWF0Y2hfdGFibGUgPSByc3JjX2NhcmRfb2ZfbWF0Y2gsCi0JfSwKLQkucHJvYmUgPSByc3JjX2NhcmRfcHJvYmUsCi0JLnJlbW92ZSA9IHJzcmNfY2FyZF9yZW1vdmUsCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJzcmNfY2FyZCk7Ci0KLU1PRFVMRV9BTElBUygicGxhdGZvcm06cmVuZXNhcy1zcmMtYXVkaW8tY2FyZCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJSZW5lc2FzIFNhbXBsaW5nIFJhdGUgQ29udmVydCBTb3VuZCBDYXJkIik7Ci1NT0RVTEVfQVVUSE9SKCJLdW5pbm9yaSBNb3JpbW90byA8a3VuaW5vcmkubW9yaW1vdG8uZ3hAcmVuZXNhcy5jb20+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9zc2kuYyBiL3NvdW5kL3NvYy9zaC9yY2FyL3NzaS5jCmluZGV4IDVmODQ4ZjAuLjZjYjZkYjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL3NzaS5jCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL3NzaS5jCkBAIC05MjgsNyArOTI4LDcgQEAKIAkJfQogCiAJCW9wcyA9ICZyc25kX3NzaV9ub25fb3BzOwotCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGlvLXRyYW5zZmVyIiwgTlVMTCkpCisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJwaW8tdHJhbnNmZXIiKSkKIAkJCW9wcyA9ICZyc25kX3NzaV9waW9fb3BzOwogCQllbHNlCiAJCQlvcHMgPSAmcnNuZF9zc2lfZG1hX29wczsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtYWM5Ny5jIGIvc291bmQvc29jL3NvYy1hYzk3LmMKaW5kZXggYmM0YTU1Yi4uNmM4YjBiMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1hYzk3LmMKKysrIGIvc291bmQvc29jL3NvYy1hYzk3LmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCXJldHVybiBzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBBQzk3X0dQSU9fQ0ZHLCAxIDw8IG9mZnNldCwgMCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIHNuZF9zb2NfYWM5N19ncGlvX2NoaXAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGdwaW9fY2hpcCBzbmRfc29jX2FjOTdfZ3Bpb19jaGlwID0gewogCS5sYWJlbAkJCT0gInNuZF9zb2NfYWM5NyIsCiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkucmVxdWVzdAkJPSBzbmRfc29jX2FjOTdfZ3Bpb19yZXF1ZXN0LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1jb3JlLmMgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwppbmRleCA0YWZhOGRiLi5jMGJiY2Q5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNvcmUuYworKysgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwpAQCAtMzMzMiwxOSArMzMzMiw2IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfZnJlZTsKIAotCWlmIChjb2RlY19kcnYtPmNvbnRyb2xzKSB7Ci0JCWNvZGVjLT5jb21wb25lbnQuY29udHJvbHMgPSBjb2RlY19kcnYtPmNvbnRyb2xzOwotCQljb2RlYy0+Y29tcG9uZW50Lm51bV9jb250cm9scyA9IGNvZGVjX2Rydi0+bnVtX2NvbnRyb2xzOwotCX0KLQlpZiAoY29kZWNfZHJ2LT5kYXBtX3dpZGdldHMpIHsKLQkJY29kZWMtPmNvbXBvbmVudC5kYXBtX3dpZGdldHMgPSBjb2RlY19kcnYtPmRhcG1fd2lkZ2V0czsKLQkJY29kZWMtPmNvbXBvbmVudC5udW1fZGFwbV93aWRnZXRzID0gY29kZWNfZHJ2LT5udW1fZGFwbV93aWRnZXRzOwotCX0KLQlpZiAoY29kZWNfZHJ2LT5kYXBtX3JvdXRlcykgewotCQljb2RlYy0+Y29tcG9uZW50LmRhcG1fcm91dGVzID0gY29kZWNfZHJ2LT5kYXBtX3JvdXRlczsKLQkJY29kZWMtPmNvbXBvbmVudC5udW1fZGFwbV9yb3V0ZXMgPSBjb2RlY19kcnYtPm51bV9kYXBtX3JvdXRlczsKLQl9Ci0KIAlpZiAoY29kZWNfZHJ2LT5wcm9iZSkKIAkJY29kZWMtPmNvbXBvbmVudC5wcm9iZSA9IHNuZF9zb2NfY29kZWNfZHJ2X3Byb2JlOwogCWlmIChjb2RlY19kcnYtPnJlbW92ZSkKQEAgLTM3MzIsNyArMzcxOSw3IEBACiAJICogU05EX1NPQ19EQUlGTVRfQ0xPQ0tfTUFTSyBhcmVhCiAJICovCiAJc25wcmludGYocHJvcCwgc2l6ZW9mKHByb3ApLCAiJXNjb250aW51b3VzLWNsb2NrIiwgcHJlZml4KTsKLQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCBwcm9wLCBOVUxMKSkKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCBwcm9wKSkKIAkJZm9ybWF0IHw9IFNORF9TT0NfREFJRk1UX0NPTlQ7CiAJZWxzZQogCQlmb3JtYXQgfD0gU05EX1NPQ19EQUlGTVRfR0FURUQ7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLWRhcG0uYyBiL3NvdW5kL3NvYy9zb2MtZGFwbS5jCmluZGV4IGQ5MDhmZjguLjNiYmUzMmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zb2MtZGFwbS5jCisrKyBiL3NvdW5kL3NvYy9zb2MtZGFwbS5jCkBAIC04MjMsNiArODIzLDcgQEAKIAkJCWNhc2Ugc25kX3NvY19kYXBtX3N3aXRjaDoKIAkJCWNhc2Ugc25kX3NvY19kYXBtX21peGVyOgogCQkJY2FzZSBzbmRfc29jX2RhcG1fcGdhOgorCQkJY2FzZSBzbmRfc29jX2RhcG1fb3V0X2RydjoKIAkJCQl3bmFtZV9pbl9sb25nX25hbWUgPSB0cnVlOwogCQkJCWtjbmFtZV9pbl9sb25nX25hbWUgPSB0cnVlOwogCQkJCWJyZWFrOwpAQCAtMTE2OSw3ICsxMTcwLDcgQEAKICAqIEBjdXN0b21fc3RvcF9jb25kaXRpb246IChvcHRpb25hbCkgYSBmdW5jdGlvbiBtZWFudCB0byBzdG9wIHRoZSB3aWRnZXQgZ3JhcGgKICAqICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGsgYmFzZWQgb24gY3VzdG9tIGxvZ2ljLgogICoKLSAqIFF1ZXJpZXMgREFQTSBncmFwaCBhcyB0byB3aGV0aGVyIGFuIHZhbGlkIGF1ZGlvIHN0cmVhbSBwYXRoIGV4aXN0cyBmb3IKKyAqIFF1ZXJpZXMgREFQTSBncmFwaCBhcyB0byB3aGV0aGVyIGEgdmFsaWQgYXVkaW8gc3RyZWFtIHBhdGggZXhpc3RzIGZvcgogICogdGhlIGluaXRpYWwgc3RyZWFtIHNwZWNpZmllZCBieSBuYW1lLiBUaGlzIHRha2VzIGludG8gYWNjb3VudAogICogY3VycmVudCBtaXhlciBhbmQgbXV4IGtjb250cm9sIHNldHRpbmdzLiBDcmVhdGVzIGxpc3Qgb2YgdmFsaWQgd2lkZ2V0cy4KICAqCkBAIC0xMjk0LDggKzEyOTUsNyBAQAogCXJldHVybiB3LT5uZXdfcG93ZXI7CiB9CiAKLS8qIEdlbmVyaWMgY2hlY2sgdG8gc2VlIGlmIGEgd2lkZ2V0IHNob3VsZCBiZSBwb3dlcmVkLgotICovCisvKiBHZW5lcmljIGNoZWNrIHRvIHNlZSBpZiBhIHdpZGdldCBzaG91bGQgYmUgcG93ZXJlZC4gKi8KIHN0YXRpYyBpbnQgZGFwbV9nZW5lcmljX2NoZWNrX3Bvd2VyKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQogewogCWludCBpbiwgb3V0OwpAQCAtMTY0Niw3ICsxNjQ2LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmQgPSBkYXRhOwogCWludCByZXQ7CiAKLQkvKiBJZiB3ZSdyZSBvZmYgYW5kIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBiZSBnbyBpbnRvIFNUQU5EQlkgKi8KKwkvKiBJZiB3ZSdyZSBvZmYgYW5kIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBnbyBpbnRvIFNUQU5EQlkgKi8KIAlpZiAoZC0+Ymlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGICYmCiAJICAgIGQtPnRhcmdldF9iaWFzX2xldmVsICE9IFNORF9TT0NfQklBU19PRkYpIHsKIAkJaWYgKGQtPmRldikKQEAgLTE3OTgsNyArMTc5OCw3IEBACiAgKiBBIGNvbXBsZXRlIHBhdGggaXMgYSByb3V0ZSB0aGF0IGhhcyB2YWxpZCBlbmRwb2ludHMgaS5lLjotCiAgKgogICogIG8gREFDIHRvIG91dHB1dCBwaW4uCi0gKiAgbyBJbnB1dCBQaW4gdG8gQURDLgorICogIG8gSW5wdXQgcGluIHRvIEFEQy4KICAqICBvIElucHV0IHBpbiB0byBPdXRwdXQgcGluIChieXBhc3MsIHNpZGV0b25lKQogICogIG8gREFDIHRvIEFEQyAobG9vcGJhY2spLgogICovCkBAIC0yMTE0LDcgKzIxMTQsNyBAQAogICogc29jX2RhcG1fY29ubmVjdF9wYXRoKCkgLSBDb25uZWN0cyBvciBkaXNjb25uZWN0cyBhIHBhdGgKICAqIEBwYXRoOiBUaGUgcGF0aCB0byB1cGRhdGUKICAqIEBjb25uZWN0OiBUaGUgbmV3IGNvbm5lY3Qgc3RhdGUgb2YgdGhlIHBhdGguIFRydWUgaWYgdGhlIHBhdGggaXMgY29ubmVjdGVkLAotICogIGZhbHNlIGlmIGl0IGlzIGRpc2Nvbm5ldGVkLgorICogIGZhbHNlIGlmIGl0IGlzIGRpc2Nvbm5lY3RlZC4KICAqIEByZWFzb246IFRoZSByZWFzb24gd2h5IHRoZSBwYXRoIGNoYW5nZWQgKGZvciBkZWJ1Z2dpbmcgb25seSkKICAqLwogc3RhdGljIHZvaWQgc29jX2RhcG1fY29ubmVjdF9wYXRoKHN0cnVjdCBzbmRfc29jX2RhcG1fcGF0aCAqcGF0aCwKQEAgLTIyMzMsNyArMjIzMyw3IEBACiAJCWlmICh3LT5kYXBtICE9IGRhcG0pCiAJCQljb250aW51ZTsKIAotCQkvKiBvbmx5IGRpc3BsYXkgd2lkZ2V0cyB0aGF0IGJ1cm5tIHBvd2VyICovCisJCS8qIG9ubHkgZGlzcGxheSB3aWRnZXRzIHRoYXQgYnVybiBwb3dlciAqLwogCQlzd2l0Y2ggKHctPmlkKSB7CiAJCWNhc2Ugc25kX3NvY19kYXBtX2hwOgogCQljYXNlIHNuZF9zb2NfZGFwbV9taWM6CkBAIC0yNDYxLDcgKzI0NjEsNyBAQAogCiAJc3dpdGNoICh3LT5pZCkgewogCWNhc2Ugc25kX3NvY19kYXBtX2lucHV0OgotCQkvKiBPbiBhIGZ1bGx5IHJvdXRlZCBjYXJkIGEgaW5wdXQgaXMgbmV2ZXIgYSBzb3VyY2UgKi8KKwkJLyogT24gYSBmdWxseSByb3V0ZWQgY2FyZCBhbiBpbnB1dCBpcyBuZXZlciBhIHNvdXJjZSAqLwogCQlpZiAody0+ZGFwbS0+Y2FyZC0+ZnVsbHlfcm91dGVkKQogCQkJcmV0dXJuOwogCQllcCA9IFNORF9TT0NfREFQTV9FUF9TT1VSQ0U7CkBAIC0zMDQ5LDYgKzMwNDksOSBAQAogCX0KIAltdXRleF91bmxvY2soJmNhcmQtPmRhcG1fbXV0ZXgpOwogCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWlmIChpbnZlcnQpCiAJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbWF4IC0gdmFsOwogCWVsc2UKQEAgLTMyMDAsNyArMzIwMyw3IEBACiAJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+c2hpZnRfcikgewogCQlpZiAoaXRlbVsxXSA+IGUtPml0ZW1zKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXZhbCB8PSBzbmRfc29jX2VudW1faXRlbV90b192YWwoZSwgaXRlbVsxXSkgPDwgZS0+c2hpZnRfbDsKKwkJdmFsIHw9IHNuZF9zb2NfZW51bV9pdGVtX3RvX3ZhbChlLCBpdGVtWzFdKSA8PCBlLT5zaGlmdF9yOwogCQltYXNrIHw9IGUtPm1hc2sgPDwgZS0+c2hpZnRfcjsKIAl9CiAKQEAgLTM0NDUsNyArMzQ0OCw3IEBACiAJCXctPmVuZHBvaW50c1tkaXJdID0gLTE7CiAJfQogCi0JLyogbWFjaGluZSBsYXllciBzZXQgdXBzIHVuY29ubmVjdGVkIHBpbnMgYW5kIGluc2VydGlvbnMgKi8KKwkvKiBtYWNoaW5lIGxheWVyIHNldHMgdXAgdW5jb25uZWN0ZWQgcGlucyBhbmQgaW5zZXJ0aW9ucyAqLwogCXctPmNvbm5lY3RlZCA9IDE7CiAJcmV0dXJuIHc7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLW9wcy5jIGIvc291bmQvc29jL3NvYy1vcHMuYwppbmRleCBhNTEzYTM0Li45ZmMxYTdiIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLW9wcy5jCisrKyBiL3NvdW5kL3NvYy9zb2Mtb3BzLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAlpdGVtID0gc25kX3NvY19lbnVtX3ZhbF90b19pdGVtKGUsIHZhbCk7CiAJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGl0ZW07CiAJaWYgKGUtPnNoaWZ0X2wgIT0gZS0+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+Y2FwYWJpbGl0aWVzICYgTElORTZfQ0FQX0NPTlRST0xfTUlESSkpIHsKIAkJLyogc2tpcCBNSURJIGluaXRpYWxpemF0aW9uIGFuZCByZXBvcnQgc3VjY2VzcyAqLwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbGluZTYvcGNtLmMgYi9zb3VuZC91c2IvbGluZTYvcGNtLmMKaW5kZXggNDFhYTMzNS4uZmFiNTNmNSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2xpbmU2L3BjbS5jCisrKyBiL3NvdW5kL3VzYi9saW5lNi9wY20uYwpAQCAtNTIsNyArNTIsNyBAQAogCiAJbGluZTZwY20tPmltcHVsc2Vfdm9sdW1lID0gdmFsdWU7CiAJaWYgKHZhbHVlID4gMCkgewotCQllcnIgPSBsaW5lNl9wY21fYWNxdWlyZShsaW5lNnBjbSwgTElORTZfU1RSRUFNX0lNUFVMU0UpOworCQllcnIgPSBsaW5lNl9wY21fYWNxdWlyZShsaW5lNnBjbSwgTElORTZfU1RSRUFNX0lNUFVMU0UsIHRydWUpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJbGluZTZwY20tPmltcHVsc2Vfdm9sdW1lID0gMDsKIAkJCXJldHVybiBlcnI7CkBAIC0xMDQsNyArMTA0LDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fQlVGRkVSUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGxpbmU2cGNtLT5saW5lNi0+aXNvX2J1ZmZlcnM7IGkrKykgewogCQlpZiAodGVzdF9iaXQoaSwgJnBjbXMtPmFjdGl2ZV91cmJzKSkgewogCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGksICZwY21zLT51bmxpbmtfdXJicykpCiAJCQkJdXNiX3VubGlua191cmIocGNtcy0+dXJic1tpXSk7CkBAIC0xMjQsNyArMTI0LDcgQEAKIAogCWRvIHsKIAkJYWxpdmUgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX0JVRkZFUlM7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVyczsgaSsrKSB7CiAJCQlpZiAodGVzdF9iaXQoaSwgJnBjbXMtPmFjdGl2ZV91cmJzKSkKIAkJCQlhbGl2ZSsrOwogCQl9CkBAIC0xNDYsMTUgKzE0NiwyMCBAQAogfQogCiAvKiBhbGxvY2F0ZSBhIGJ1ZmZlciBpZiBub3Qgb3BlbmVkIHlldDsKLSAqIGNhbGwgdGhpcyBpbiBsaW5lNnBjbS5zdGF0ZV9jaGFuZ2UgbXV0ZXgKKyAqIGNhbGwgdGhpcyBpbiBsaW5lNnBjbS5zdGF0ZV9tdXRleAogICovCiBzdGF0aWMgaW50IGxpbmU2X2J1ZmZlcl9hY3F1aXJlKHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSwKLQkJCQlzdHJ1Y3QgbGluZTZfcGNtX3N0cmVhbSAqcHN0ciwgaW50IHR5cGUpCisJCQkJc3RydWN0IGxpbmU2X3BjbV9zdHJlYW0gKnBzdHIsIGludCBkaXJlY3Rpb24sIGludCB0eXBlKQogeworCWNvbnN0IGludCBwa3Rfc2l6ZSA9CisJCShkaXJlY3Rpb24gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgPworCQkJbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9vdXQgOgorCQkJbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9pbjsKKwogCS8qIEludm9rZWQgbXVsdGlwbGUgdGltZXMgaW4gYSByb3cgc28gYWxsb2NhdGUgb25jZSBvbmx5ICovCiAJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KHR5cGUsICZwc3RyLT5vcGVuZWQpICYmICFwc3RyLT5idWZmZXIpIHsKLQkJcHN0ci0+YnVmZmVyID0ga21hbGxvYyhMSU5FNl9JU09fQlVGRkVSUyAqIExJTkU2X0lTT19QQUNLRVRTICoKLQkJCQkgICAgICAgbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCXBzdHItPmJ1ZmZlciA9IGttYWxsb2MobGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVycyAqCisJCQkJICAgICAgIExJTkU2X0lTT19QQUNLRVRTICogcGt0X3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIXBzdHItPmJ1ZmZlcikKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTE2MiwxMiArMTY3LDExIEBACiB9CiAKIC8qIGZyZWUgYSBidWZmZXIgaWYgYWxsIHN0cmVhbXMgYXJlIGNsb3NlZDsKLSAqIGNhbGwgdGhpcyBpbiBsaW5lNnBjbS5zdGF0ZV9jaGFuZ2UgbXV0ZXgKKyAqIGNhbGwgdGhpcyBpbiBsaW5lNnBjbS5zdGF0ZV9tdXRleAogICovCiBzdGF0aWMgdm9pZCBsaW5lNl9idWZmZXJfcmVsZWFzZShzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20sCiAJCQkJIHN0cnVjdCBsaW5lNl9wY21fc3RyZWFtICpwc3RyLCBpbnQgdHlwZSkKIHsKLQogCWNsZWFyX2JpdCh0eXBlLCAmcHN0ci0+b3BlbmVkKTsKIAlpZiAoIXBzdHItPm9wZW5lZCkgewogCQlsaW5lNl93YWl0X2NsZWFyX2F1ZGlvX3VyYnMobGluZTZwY20sIHBzdHIpOwpAQCAtMTk0LDYgKzE5OCw3IEBACiAJCWVsc2UKIAkJCXJldCA9IGxpbmU2X3N1Ym1pdF9hdWRpb19pbl9hbGxfdXJicyhsaW5lNnBjbSk7CiAJfQorCiAJaWYgKHJldCA8IDApCiAJCWNsZWFyX2JpdCh0eXBlLCAmcHN0ci0+cnVubmluZyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHN0ci0+bG9jaywgZmxhZ3MpOwpAQCAtMjM3LDYgKzI0MiwxNCBAQAogCQlzd2l0Y2ggKGNtZCkgewogCQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgogCQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJCWlmIChzLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFICYmCisJCQkJKGxpbmU2cGNtLT5saW5lNi0+cHJvcGVydGllcy0+Y2FwYWJpbGl0aWVzICYKKwkJCQkJTElORTZfQ0FQX0lOX05FRURTX09VVCkpIHsKKwkJCQllcnIgPSBsaW5lNl9zdHJlYW1fc3RhcnQobGluZTZwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkJCQkgTElORTZfU1RSRUFNX0NBUFRVUkVfSEVMUEVSKTsKKwkJCQlpZiAoZXJyIDwgMCkKKwkJCQkJcmV0dXJuIGVycjsKKwkJCX0KIAkJCWVyciA9IGxpbmU2X3N0cmVhbV9zdGFydChsaW5lNnBjbSwgcy0+c3RyZWFtLAogCQkJCQkJIExJTkU2X1NUUkVBTV9QQ00pOwogCQkJaWYgKGVyciA8IDApCkBAIC0yNDUsNiArMjU4LDEyIEBACiAKIAkJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJCQlpZiAocy0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSAmJgorCQkJCShsaW5lNnBjbS0+bGluZTYtPnByb3BlcnRpZXMtPmNhcGFiaWxpdGllcyAmCisJCQkJCUxJTkU2X0NBUF9JTl9ORUVEU19PVVQpKSB7CisJCQkJbGluZTZfc3RyZWFtX3N0b3AobGluZTZwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCisJCQkJCSAgTElORTZfU1RSRUFNX0NBUFRVUkVfSEVMUEVSKTsKKwkJCX0KIAkJCWxpbmU2X3N0cmVhbV9zdG9wKGxpbmU2cGNtLCBzLT5zdHJlYW0sCiAJCQkJCSAgTElORTZfU1RSRUFNX1BDTSk7CiAJCQlicmVhazsKQEAgLTI3OCwyNyArMjk3LDMwIEBACiAJcmV0dXJuIHBzdHItPnBvc19kb25lOwogfQogCi0vKiBBY3F1aXJlIGFuZCBzdGFydCBkdXBsZXggc3RyZWFtczoKKy8qIEFjcXVpcmUgYW5kIG9wdGlvbmFsbHkgc3RhcnQgZHVwbGV4IHN0cmVhbXM6CiAgKiB0eXBlIGlzIGVpdGhlciBMSU5FNl9TVFJFQU1fSU1QVUxTRSBvciBMSU5FNl9TVFJFQU1fTU9OSVRPUgogICovCi1pbnQgbGluZTZfcGNtX2FjcXVpcmUoc3RydWN0IHNuZF9saW5lNl9wY20gKmxpbmU2cGNtLCBpbnQgdHlwZSkKK2ludCBsaW5lNl9wY21fYWNxdWlyZShzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20sIGludCB0eXBlLCBib29sIHN0YXJ0KQogewogCXN0cnVjdCBsaW5lNl9wY21fc3RyZWFtICpwc3RyOwogCWludCByZXQgPSAwLCBkaXI7CiAKKwkvKiBUT0RPOiBXZSBzaG91bGQgYXNzZXJ0IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0svQ0FQVFVSRSA9PSAwLzEgKi8KIAltdXRleF9sb2NrKCZsaW5lNnBjbS0+c3RhdGVfbXV0ZXgpOwogCWZvciAoZGlyID0gMDsgZGlyIDwgMjsgZGlyKyspIHsKIAkJcHN0ciA9IGdldF9zdHJlYW0obGluZTZwY20sIGRpcik7Ci0JCXJldCA9IGxpbmU2X2J1ZmZlcl9hY3F1aXJlKGxpbmU2cGNtLCBwc3RyLCB0eXBlKTsKKwkJcmV0ID0gbGluZTZfYnVmZmVyX2FjcXVpcmUobGluZTZwY20sIHBzdHIsIGRpciwgdHlwZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBlcnJvcjsKIAkJaWYgKCFwc3RyLT5ydW5uaW5nKQogCQkJbGluZTZfd2FpdF9jbGVhcl9hdWRpb191cmJzKGxpbmU2cGNtLCBwc3RyKTsKIAl9Ci0JZm9yIChkaXIgPSAwOyBkaXIgPCAyOyBkaXIrKykgewotCQlyZXQgPSBsaW5lNl9zdHJlYW1fc3RhcnQobGluZTZwY20sIGRpciwgdHlwZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBlcnJvcjsKKwlpZiAoc3RhcnQpIHsKKwkJZm9yIChkaXIgPSAwOyBkaXIgPCAyOyBkaXIrKykgeworCQkJcmV0ID0gbGluZTZfc3RyZWFtX3N0YXJ0KGxpbmU2cGNtLCBkaXIsIHR5cGUpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQogCX0KICBlcnJvcjoKIAltdXRleF91bmxvY2soJmxpbmU2cGNtLT5zdGF0ZV9tdXRleCk7CkBAIC0zMzQsNyArMzU2LDggQEAKIAlzdHJ1Y3QgbGluZTZfcGNtX3N0cmVhbSAqcHN0ciA9IGdldF9zdHJlYW0obGluZTZwY20sIHN1YnN0cmVhbS0+c3RyZWFtKTsKIAogCW11dGV4X2xvY2soJmxpbmU2cGNtLT5zdGF0ZV9tdXRleCk7Ci0JcmV0ID0gbGluZTZfYnVmZmVyX2FjcXVpcmUobGluZTZwY20sIHBzdHIsIExJTkU2X1NUUkVBTV9QQ00pOworCXJldCA9IGxpbmU2X2J1ZmZlcl9hY3F1aXJlKGxpbmU2cGNtLCBwc3RyLCBzdWJzdHJlYW0tPnN0cmVhbSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5FNl9TVFJFQU1fUENNKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIApAQCAtNDM0LDI0ICs0NTcsMzAgQEAKIC8qCiAJQ2xlYW51cCB0aGUgUENNIGRldmljZS4KICovCi1zdGF0aWMgdm9pZCBjbGVhbnVwX3VyYnMoc3RydWN0IGxpbmU2X3BjbV9zdHJlYW0gKnBjbXMpCitzdGF0aWMgdm9pZCBjbGVhbnVwX3VyYnMoc3RydWN0IGxpbmU2X3BjbV9zdHJlYW0gKnBjbXMsIGludCBpc29fYnVmZmVycykKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBMSU5FNl9JU09fQlVGRkVSUzsgaSsrKSB7CisJLyogTW9zdCBsaWtlbHkgaW1wb3NzaWJsZSBpbiBjdXJyZW50IGNvZGUuLi4gKi8KKwlpZiAocGNtcy0+dXJicyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgaXNvX2J1ZmZlcnM7IGkrKykgewogCQlpZiAocGNtcy0+dXJic1tpXSkgewogCQkJdXNiX2tpbGxfdXJiKHBjbXMtPnVyYnNbaV0pOwogCQkJdXNiX2ZyZWVfdXJiKHBjbXMtPnVyYnNbaV0pOwogCQl9CiAJfQorCWtmcmVlKHBjbXMtPnVyYnMpOworCXBjbXMtPnVyYnMgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBsaW5lNl9jbGVhbnVwX3BjbShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQogewogCXN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSA9IHNuZF9wY21fY2hpcChwY20pOwogCi0JY2xlYW51cF91cmJzKCZsaW5lNnBjbS0+b3V0KTsKLQljbGVhbnVwX3VyYnMoJmxpbmU2cGNtLT5pbik7CisJY2xlYW51cF91cmJzKCZsaW5lNnBjbS0+b3V0LCBsaW5lNnBjbS0+bGluZTYtPmlzb19idWZmZXJzKTsKKwljbGVhbnVwX3VyYnMoJmxpbmU2cGNtLT5pbiwgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVycyk7CiAJa2ZyZWUobGluZTZwY20pOwogfQogCkBAIC01MjMsMTIgKzU1MiwxMiBAQAogCWxpbmU2cGNtLT52b2x1bWVfbW9uaXRvciA9IDI1NTsKIAlsaW5lNnBjbS0+bGluZTYgPSBsaW5lNjsKIAotCS8qIFJlYWQgYW5kIHdyaXRlIGJ1ZmZlcnMgYXJlIHNpemVkIGlkZW50aWNhbGx5LCBzbyBjaG9vc2UgbWluaW11bSAqLwotCWxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemUgPSBtaW4oCi0JCQl1c2JfbWF4cGFja2V0KGxpbmU2LT51c2JkZXYsCi0JCQkJdXNiX3Jjdmlzb2NwaXBlKGxpbmU2LT51c2JkZXYsIGVwX3JlYWQpLCAwKSwKLQkJCXVzYl9tYXhwYWNrZXQobGluZTYtPnVzYmRldiwKLQkJCQl1c2Jfc25kaXNvY3BpcGUobGluZTYtPnVzYmRldiwgZXBfd3JpdGUpLCAxKSk7CisJbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9pbiA9CisJCXVzYl9tYXhwYWNrZXQobGluZTYtPnVzYmRldiwKKwkJCXVzYl9yY3Zpc29jcGlwZShsaW5lNi0+dXNiZGV2LCBlcF9yZWFkKSwgMCk7CisJbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZV9vdXQgPQorCQl1c2JfbWF4cGFja2V0KGxpbmU2LT51c2JkZXYsCisJCQl1c2Jfc25kaXNvY3BpcGUobGluZTYtPnVzYmRldiwgZXBfd3JpdGUpLCAxKTsKIAogCXNwaW5fbG9ja19pbml0KCZsaW5lNnBjbS0+b3V0LmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZsaW5lNnBjbS0+aW4ubG9jayk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbGluZTYvcGNtLmggYi9zb3VuZC91c2IvbGluZTYvcGNtLmgKaW5kZXggNTA4NDEwYS4uYmIwYzljYiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL2xpbmU2L3BjbS5oCisrKyBiL3NvdW5kL3VzYi9saW5lNi9wY20uaApAQCAtMjAsOSArMjAsNiBAQAogCiAjaW5jbHVkZSAiZHJpdmVyLmgiCiAKLS8qIG51bWJlciBvZiBVUkJzICovCi0jZGVmaW5lIExJTkU2X0lTT19CVUZGRVJTCTIKLQogLyoKIAludW1iZXIgb2YgVVNCIGZyYW1lcyBwZXIgVVJCCiAJVGhlIExpbmUgNiBXaW5kb3dzIGRyaXZlciBhbHdheXMgdHJhbnNtaXRzIHR3byBmcmFtZXMgcGVyIHBhY2tldCwgYnV0CkBAIC0zMSw3ICsyOCw5IEBACiAqLwogI2RlZmluZSBMSU5FNl9JU09fUEFDS0VUUwkxCiAKLS8qIGluIGEgImZ1bGwgc3BlZWQiIGRldmljZSAoc3VjaCBhcyB0aGUgUE9EeHQgUHJvKSB0aGlzIG1lYW5zIDFtcyAqLworLyogaW4gYSAiZnVsbCBzcGVlZCIgZGV2aWNlIChzdWNoIGFzIHRoZSBQT0R4dCBQcm8pIHRoaXMgbWVhbnMgMW1zLAorICogIGZvciAiaGlnaCBzcGVlZCIgaXQncyAxLzhtcworICovCiAjZGVmaW5lIExJTkU2X0lTT19JTlRFUlZBTAkxCiAKICNkZWZpbmUgTElORTZfSU1QVUxTRV9ERUZBVUxUX1BFUklPRCAxMDAKQEAgLTc0LDYgKzczLDcgQEAKIAlMSU5FNl9TVFJFQU1fUENNLAogCUxJTkU2X1NUUkVBTV9NT05JVE9SLAogCUxJTkU2X1NUUkVBTV9JTVBVTFNFLAorCUxJTkU2X1NUUkVBTV9DQVBUVVJFX0hFTFBFUiwKIH07CiAKIC8qIG1pc2MgYml0IGZsYWdzIGZvciBQQ00gb3BlcmF0aW9uICovCkBAIC04NSwxMiArODUsMTIgQEAKIHN0cnVjdCBsaW5lNl9wY21fcHJvcGVydGllcyB7CiAJc3RydWN0IHNuZF9wY21faGFyZHdhcmUgcGxheWJhY2tfaHcsIGNhcHR1cmVfaHc7CiAJc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9yYXRkZW5zIHJhdGVzOwotCWludCBieXRlc19wZXJfZnJhbWU7CisJaW50IGJ5dGVzX3Blcl9jaGFubmVsOwogfTsKIAogc3RydWN0IGxpbmU2X3BjbV9zdHJlYW0gewogCS8qIGFsbG9jYXRlZCBVUkJzICovCi0Jc3RydWN0IHVyYiAqdXJic1tMSU5FNl9JU09fQlVGRkVSU107CisJc3RydWN0IHVyYiAqKnVyYnM7CiAKIAkvKiBUZW1wb3JhcnkgYnVmZmVyOwogCSAqIFNpbmNlIHRoZSBwYWNrZXQgc2l6ZSBpcyBub3Qga25vd24gaW4gYWR2YW5jZSwgdGhpcyBidWZmZXIgaXMKQEAgLTE1NywxMSArMTU3LDEyIEBACiAJLyogUHJldmlvdXNseSBjYXB0dXJlZCBmcmFtZSAoZm9yIHNvZnR3YXJlIG1vbml0b3JpbmcpICovCiAJdW5zaWduZWQgY2hhciAqcHJldl9mYnVmOwogCi0JLyogU2l6ZSBvZiBwcmV2aW91c2x5IGNhcHR1cmVkIGZyYW1lIChmb3Igc29mdHdhcmUgbW9uaXRvcmluZykgKi8KKwkvKiBTaXplIG9mIHByZXZpb3VzbHkgY2FwdHVyZWQgZnJhbWUgKGZvciBzb2Z0d2FyZSBtb25pdG9yaW5nL3N5bmMpICovCiAJaW50IHByZXZfZnNpemU7CiAKIAkvKiBNYXhpbXVtIHNpemUgb2YgVVNCIHBhY2tldCAqLwotCWludCBtYXhfcGFja2V0X3NpemU7CisJaW50IG1heF9wYWNrZXRfc2l6ZV9pbjsKKwlpbnQgbWF4X3BhY2tldF9zaXplX291dDsKIAogCS8qIFBDTSBwbGF5YmFjayB2b2x1bWUgKGxlZnQgYW5kIHJpZ2h0KSAqLwogCWludCB2b2x1bWVfcGxheWJhY2tbMl07CkBAIC0xOTEsNyArMTkyLDggQEAKIGV4dGVybiBpbnQgc25kX2xpbmU2X2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pOwogZXh0ZXJuIHNuZF9wY21fdWZyYW1lc190IHNuZF9saW5lNl9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIGV4dGVybiB2b2lkIGxpbmU2X3BjbV9kaXNjb25uZWN0KHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSk7Ci1leHRlcm4gaW50IGxpbmU2X3BjbV9hY3F1aXJlKHN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSwgaW50IHR5cGUpOworZXh0ZXJuIGludCBsaW5lNl9wY21fYWNxdWlyZShzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqbGluZTZwY20sIGludCB0eXBlLAorCQkJICAgICAgIGJvb2wgc3RhcnQpOwogZXh0ZXJuIHZvaWQgbGluZTZfcGNtX3JlbGVhc2Uoc3RydWN0IHNuZF9saW5lNl9wY20gKmxpbmU2cGNtLCBpbnQgdHlwZSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2xpbmU2L3BsYXliYWNrLmMgYi9zb3VuZC91c2IvbGluZTYvcGxheWJhY2suYwppbmRleCA5N2VkNTkzLi44MTJkMTgxIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvbGluZTYvcGxheWJhY2suYworKysgYi9zb3VuZC91c2IvbGluZTYvcGxheWJhY2suYwpAQCAtMTQ2LDE4ICsxNDYsMjAgQEAKIAlpbnQgaW5kZXg7CiAJaW50IGksIHVyYl9zaXplLCB1cmJfZnJhbWVzOwogCWludCByZXQ7Ci0JY29uc3QgaW50IGJ5dGVzX3Blcl9mcmFtZSA9IGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7CisJY29uc3QgaW50IGJ5dGVzX3Blcl9mcmFtZSA9CisJCWxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfY2hhbm5lbCAqCisJCWxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5wbGF5YmFja19ody5jaGFubmVsc19tYXg7CiAJY29uc3QgaW50IGZyYW1lX2luY3JlbWVudCA9CiAJCWxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5yYXRlcy5yYXRzWzBdLm51bV9taW47CiAJY29uc3QgaW50IGZyYW1lX2ZhY3RvciA9CiAJCWxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5yYXRlcy5yYXRzWzBdLmRlbiAqCi0JCShVU0JfSU5URVJWQUxTX1BFUl9TRUNPTkQgLyBMSU5FNl9JU09fSU5URVJWQUwpOworCQkobGluZTZwY20tPmxpbmU2LT5pbnRlcnZhbHNfcGVyX3NlY29uZCAvIExJTkU2X0lTT19JTlRFUlZBTCk7CiAJc3RydWN0IHVyYiAqdXJiX291dDsKIAotCWluZGV4ID0KLQkgICAgZmluZF9maXJzdF96ZXJvX2JpdCgmbGluZTZwY20tPm91dC5hY3RpdmVfdXJicywgTElORTZfSVNPX0JVRkZFUlMpOworCWluZGV4ID0gZmluZF9maXJzdF96ZXJvX2JpdCgmbGluZTZwY20tPm91dC5hY3RpdmVfdXJicywKKwkJCQkgICAgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVycyk7CiAKLQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IExJTkU2X0lTT19CVUZGRVJTKSB7CisJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsaW5lNnBjbS0+bGluZTYtPmlzb19idWZmZXJzKSB7CiAJCWRldl9lcnIobGluZTZwY20tPmxpbmU2LT5pZmNkZXYsICJubyBmcmVlIFVSQiBmb3VuZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE2NSw2ICsxNjcsNyBAQAogCXVyYl9vdXQgPSBsaW5lNnBjbS0+b3V0LnVyYnNbaW5kZXhdOwogCXVyYl9zaXplID0gMDsKIAorCS8qIFRPRE86IHRoaXMgbWF5IG5vdCB3b3JrIGZvciBMSU5FNl9JU09fUEFDS0VUUyAhPSAxICovCiAJZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19QQUNLRVRTOyArK2kpIHsKIAkJLyogY29tcHV0ZSBmcmFtZSBzaXplIGZvciBnaXZlbiBzYW1wbGluZyByYXRlICovCiAJCWludCBmc2l6ZSA9IDA7CkBAIC0xNzgsOSArMTgxLDExIEBACiAJCQlsaW5lNnBjbS0+b3V0LmNvdW50ICs9IGZyYW1lX2luY3JlbWVudDsKIAkJCW4gPSBsaW5lNnBjbS0+b3V0LmNvdW50IC8gZnJhbWVfZmFjdG9yOwogCQkJbGluZTZwY20tPm91dC5jb3VudCAtPSBuICogZnJhbWVfZmFjdG9yOwotCQkJZnNpemUgPSBuICogYnl0ZXNfcGVyX2ZyYW1lOworCQkJZnNpemUgPSBuOwogCQl9CiAKKwkJZnNpemUgKj0gYnl0ZXNfcGVyX2ZyYW1lOworCiAJCWZvdXQtPm9mZnNldCA9IHVyYl9zaXplOwogCQlmb3V0LT5sZW5ndGggPSBmc2l6ZTsKIAkJdXJiX3NpemUgKz0gZnNpemU7CkBAIC0xOTUsNyArMjAwLDcgQEAKIAl1cmJfZnJhbWVzID0gdXJiX3NpemUgLyBieXRlc19wZXJfZnJhbWU7CiAJdXJiX291dC0+dHJhbnNmZXJfYnVmZmVyID0KIAkgICAgbGluZTZwY20tPm91dC5idWZmZXIgKwotCSAgICBpbmRleCAqIExJTkU2X0lTT19QQUNLRVRTICogbGluZTZwY20tPm1heF9wYWNrZXRfc2l6ZTsKKwkgICAgaW5kZXggKiBMSU5FNl9JU09fUEFDS0VUUyAqIGxpbmU2cGNtLT5tYXhfcGFja2V0X3NpemVfb3V0OwogCXVyYl9vdXQtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB1cmJfc2l6ZTsKIAl1cmJfb3V0LT5jb250ZXh0ID0gbGluZTZwY207CiAKQEAgLTI4Niw3ICsyOTEsNyBAQAogewogCWludCByZXQgPSAwLCBpOwogCi0JZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19CVUZGRVJTOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVyczsgKytpKSB7CiAJCXJldCA9IHN1Ym1pdF9hdWRpb19vdXRfdXJiKGxpbmU2cGNtKTsKIAkJaWYgKHJldCA8IDApCiAJCQlicmVhazsKQEAgLTMwNSw2ICszMTAsOSBAQAogCXN0cnVjdCBzbmRfbGluZTZfcGNtICpsaW5lNnBjbSA9IChzdHJ1Y3Qgc25kX2xpbmU2X3BjbSAqKXVyYi0+Y29udGV4dDsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9CiAJICAgIGdldF9zdWJzdHJlYW0obGluZTZwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOworCWNvbnN0IGludCBieXRlc19wZXJfZnJhbWUgPQorCQlsaW5lNnBjbS0+cHJvcGVydGllcy0+Ynl0ZXNfcGVyX2NoYW5uZWwgKgorCQlsaW5lNnBjbS0+cHJvcGVydGllcy0+cGxheWJhY2tfaHcuY2hhbm5lbHNfbWF4OwogCiAjaWYgVVNFX0NMRUFSX0JVRkZFUl9XT1JLQVJPVU5ECiAJbWVtc2V0KHVyYi0+dHJhbnNmZXJfYnVmZmVyLCAwLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOwpAQCAtMzEzLDExICszMjEsMTEgQEAKIAlsaW5lNnBjbS0+b3V0Lmxhc3RfZnJhbWUgPSB1cmItPnN0YXJ0X2ZyYW1lOwogCiAJLyogZmluZCBpbmRleCBvZiBVUkIgKi8KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBMSU5FNl9JU09fQlVGRkVSUzsgaW5kZXgrKykKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBsaW5lNnBjbS0+bGluZTYtPmlzb19idWZmZXJzOyBpbmRleCsrKQogCQlpZiAodXJiID09IGxpbmU2cGNtLT5vdXQudXJic1tpbmRleF0pCiAJCQlicmVhazsKIAotCWlmIChpbmRleCA+PSBMSU5FNl9JU09fQlVGRkVSUykKKwlpZiAoaW5kZXggPj0gbGluZTZwY20tPmxpbmU2LT5pc29fYnVmZmVycykKIAkJcmV0dXJuOwkJLyogVVJCIGhhcyBiZWVuIHVubGlua2VkIGFzeW5jaHJvbm91c2x5ICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgTElORTZfSVNPX1BBQ0tFVFM7IGkrKykKQEAgLTMyOSw3ICszMzcsNyBAQAogCQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwogCiAJCWxpbmU2cGNtLT5vdXQucG9zX2RvbmUgKz0KLQkJICAgIGxlbmd0aCAvIGxpbmU2cGNtLT5wcm9wZXJ0aWVzLT5ieXRlc19wZXJfZnJhbWU7CisJCSAgICBsZW5ndGggLyBieXRlc19wZXJfZnJhbWU7CiAKIAkJaWYgKGxpbmU2cGNtLT5vdXQucG9zX2RvbmUgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCiAJCQlsaW5lNnBjbS0+b3V0LnBvc19kb25lIC09IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplOwpAQCAtNDAxLDggKzQwOSwxMyBAQAogCXN0cnVjdCB1c2JfbGluZTYgKmxpbmU2ID0gbGluZTZwY20tPmxpbmU2OwogCWludCBpOwogCisJbGluZTZwY20tPm91dC51cmJzID0ga3phbGxvYygKKwkJc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiBsaW5lNi0+aXNvX2J1ZmZlcnMsIEdGUF9LRVJORUwpOworCWlmIChsaW5lNnBjbS0+b3V0LnVyYnMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAkvKiBjcmVhdGUgYXVkaW8gVVJCcyBhbmQgZmlsbCBpbiBjb25zdGFudCB2YWx1ZXM6ICovCi0JZm9yIChpID0gMDsgaSA8IExJTkU2X0lTT19CVUZGRVJTOyArK2kpIHsKKwlmb3IgKGkgPSAwOyBpIDwgbGluZTYtPmlzb19idWZmZXJzOyArK2kpIHsKIAkJc3RydWN0IHVyYiAqdXJiOwogCiAJCS8qIFVSQiBmb3IgYXVkaW8gb3V0OiAqLwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL2xpbmU2L3BvZC5jIGIvc291bmQvdXNiL2xpbmU2L3BvZC5jCmluZGV4IDQ1ZGQzNDguLjE3YWE2MTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi9wb2QuYworKysgYi9zb3VuZC91c2IvbGluZTYvcG9kLmMKQEAgLTgzLDcgKzgzLDYgQEAKIH07CiAKICNkZWZpbmUgUE9EX1NZU0VYX0NPREUgMwotI2RlZmluZSBQT0RfQllURVNfUEVSX0ZSQU1FIDYJLyogMjRiaXQgYXVkaW8gKHN0ZXJlbykgKi8KIAogLyogKklOREVOVC1PRkYqICovCiAKQEAgLTE2Nyw3ICsxNjYsNyBAQAogCS5yYXRlcyA9IHsKIAkJCSAgICAubnJhdHMgPSAxLAogCQkJICAgIC5yYXRzID0gJnBvZF9yYXRkZW59LAotCS5ieXRlc19wZXJfZnJhbWUgPSBQT0RfQllURVNfUEVSX0ZSQU1FCisJLmJ5dGVzX3Blcl9jaGFubmVsID0gMyAvKiBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUgKi8KIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyIHBvZF92ZXJzaW9uX2hlYWRlcltdID0gewpAQCAtNDc2LDYgKzQ3NSw3IEBACiAJCS5pZCA9ICJCYXNzUE9EeHQiLAogCQkubmFtZSA9ICJCYXNzUE9EeHQiLAogCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKKwkJCQl8IExJTkU2X0NBUF9DT05UUk9MX01JREkKIAkJCQl8IExJTkU2X0NBUF9QQ00KIAkJCQl8IExJTkU2X0NBUF9IV01PTiwKIAkJLmFsdHNldHRpbmcgPSA1LApAQCAtNDg4LDYgKzQ4OCw3IEBACiAJCS5pZCA9ICJCYXNzUE9EeHRMaXZlIiwKIAkJLm5hbWUgPSAiQmFzc1BPRHh0IExpdmUiLAogCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKKwkJCQl8IExJTkU2X0NBUF9DT05UUk9MX01JREkKIAkJCQl8IExJTkU2X0NBUF9QQ00KIAkJCQl8IExJTkU2X0NBUF9IV01PTiwKIAkJLmFsdHNldHRpbmcgPSAxLApAQCAtNTAwLDYgKzUwMSw3IEBACiAJCS5pZCA9ICJCYXNzUE9EeHRQcm8iLAogCQkubmFtZSA9ICJCYXNzUE9EeHQgUHJvIiwKIAkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCisJCQkJfCBMSU5FNl9DQVBfQ09OVFJPTF9NSURJCiAJCQkJfCBMSU5FNl9DQVBfUENNCiAJCQkJfCBMSU5FNl9DQVBfSFdNT04sCiAJCS5hbHRzZXR0aW5nID0gNSwKQEAgLTUxMSw3ICs1MTMsOCBAQAogCVtMSU5FNl9QT0NLRVRQT0RdID0gewogCQkuaWQgPSAiUG9ja2V0UE9EIiwKIAkJLm5hbWUgPSAiUG9ja2V0IFBPRCIsCi0JCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTCwKKwkJLmNhcGFiaWxpdGllcwk9IExJTkU2X0NBUF9DT05UUk9MCisJCQkJfCBMSU5FNl9DQVBfQ09OVFJPTF9NSURJLAogCQkuYWx0c2V0dGluZyA9IDAsCiAJCS5lcF9jdHJsX3IgPSAweDgyLAogCQkuZXBfY3RybF93ID0gMHgwMiwKQEAgLTUyMSw2ICs1MjQsNyBAQAogCQkuaWQgPSAiUE9EeHQiLAogCQkubmFtZSA9ICJQT0R4dCIsCiAJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAorCQkJCXwgTElORTZfQ0FQX0NPTlRST0xfTUlESQogCQkJCXwgTElORTZfQ0FQX1BDTQogCQkJCXwgTElORTZfQ0FQX0hXTU9OLAogCQkuYWx0c2V0dGluZyA9IDUsCkBAIC01MzMsNiArNTM3LDcgQEAKIAkJLmlkID0gIlBPRHh0TGl2ZSIsCiAJCS5uYW1lID0gIlBPRHh0IExpdmUiLAogCQkuY2FwYWJpbGl0aWVzCT0gTElORTZfQ0FQX0NPTlRST0wKKwkJCQl8IExJTkU2X0NBUF9DT05UUk9MX01JREkKIAkJCQl8IExJTkU2X0NBUF9QQ00KIAkJCQl8IExJTkU2X0NBUF9IV01PTiwKIAkJLmFsdHNldHRpbmcgPSAxLApAQCAtNTQ1LDYgKzU1MCw3IEBACiAJCS5pZCA9ICJQT0R4dFBybyIsCiAJCS5uYW1lID0gIlBPRHh0IFBybyIsCiAJCS5jYXBhYmlsaXRpZXMJPSBMSU5FNl9DQVBfQ09OVFJPTAorCQkJCXwgTElORTZfQ0FQX0NPTlRST0xfTUlESQogCQkJCXwgTElORTZfQ0FQX1BDTQogCQkJCXwgTElORTZfQ0FQX0hXTU9OLAogCQkuYWx0c2V0dGluZyA9IDUsCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbGluZTYvcG9kaGQuYyBiL3NvdW5kL3VzYi9saW5lNi9wb2RoZC5jCmluZGV4IDYzZGNhZWYuLjkzNTJhNDQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9saW5lNi9wb2RoZC5jCisrKyBiL3NvdW5kL3VzYi9saW5lNi9wb2RoZC5jCkBAIC0yLDYgKzIsNyBAQAogICogTGluZSA2IFBvZCBIRAogICoKICAqIENvcHlyaWdodCAoQykgMjAxMSBTdGVmYW4gSGFqbm9jemkgPHN0ZWZhbmhhQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBBbmRyZWogS3J1dGFrIDxkZXZAYW5kcmVlLnNrPgogICoKICAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC0xOCwxNCArMTksNDYgQEAKICNpbmNsdWRlICJkcml2ZXIuaCIKICNpbmNsdWRlICJwY20uaCIKIAorI2RlZmluZSBQT0RIRF9TVEFSVFVQX0RFTEFZIDUwMAorCisvKgorICogU3RhZ2VzIG9mIFBPRCBzdGFydHVwIHByb2NlZHVyZQorICovCitlbnVtIHsKKwlQT0RIRF9TVEFSVFVQX0lOSVQgPSAxLAorCVBPREhEX1NUQVJUVVBfU0NIRURVTEVfV09SS1FVRVVFLAorCVBPREhEX1NUQVJUVVBfU0VUVVAsCisJUE9ESERfU1RBUlRVUF9MQVNUID0gUE9ESERfU1RBUlRVUF9TRVRVUCAtIDEKK307CisKIGVudW0gewogCUxJTkU2X1BPREhEMzAwLAogCUxJTkU2X1BPREhENDAwLAogCUxJTkU2X1BPREhENTAwXzAsCiAJTElORTZfUE9ESEQ1MDBfMSwKKwlMSU5FNl9QT0RYMywKKwlMSU5FNl9QT0RYM0xJVkUKIH07CiAKLSNkZWZpbmUgUE9ESERfQllURVNfUEVSX0ZSQU1FIDYJLyogMjRiaXQgYXVkaW8gKHN0ZXJlbykgKi8KK3N0cnVjdCB1c2JfbGluZTZfcG9kaGQgeworCS8qIEdlbmVyaWMgTGluZSA2IFVTQiBkYXRhICovCisJc3RydWN0IHVzYl9saW5lNiBsaW5lNjsKKworCS8qIFRpbWVyIGZvciBkZXZpY2UgaW5pdGlhbGl6YXRpb24gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBzdGFydHVwX3RpbWVyOworCisJLyogV29yayBoYW5kbGVyIGZvciBkZXZpY2UgaW5pdGlhbGl6YXRpb24gKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc3RhcnR1cF93b3JrOworCisJLyogQ3VycmVudCBwcm9ncmVzcyBpbiBzdGFydHVwIHByb2NlZHVyZSAqLworCWludCBzdGFydHVwX3Byb2dyZXNzOworCisJLyogU2VyaWFsIG51bWJlciBvZiBkZXZpY2UgKi8KKwl1MzIgc2VyaWFsX251bWJlcjsKKworCS8qIEZpcm13YXJlIHZlcnNpb24gKi8KKwlpbnQgZmlybXdhcmVfdmVyc2lvbjsKK307CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3JhdGRlbiBwb2RoZF9yYXRkZW4gPSB7CiAJLm51bV9taW4gPSA0ODAwMCwKQEAgLTczLDkgKzEwNiwxOTYgQEAKIAkucmF0ZXMgPSB7CiAJCQkgICAgLm5yYXRzID0gMSwKIAkJCSAgICAucmF0cyA9ICZwb2RoZF9yYXRkZW59LAotCS5ieXRlc19wZXJfZnJhbWUgPSBQT0RIRF9CWVRFU19QRVJfRlJBTUUKKwkuYnl0ZXNfcGVyX2NoYW5uZWwgPSAzIC8qIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSAqLwogfTsKIAorc3RhdGljIHN0cnVjdCBsaW5lNl9wY21fcHJvcGVydGllcyBwb2R4M19wY21fcHJvcGVydGllcyA9IHsKKwkucGxheWJhY2tfaHcgPSB7CisJCQkJICAuaW5mbyA9IChTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkJICAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCQkgICBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJCSAgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCQkgICBTTkRSVl9QQ01fSU5GT19QQVVTRSB8CisJCQkJCSAgIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCQkJCSAgLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF8zTEUsCisJCQkJICAucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCQkgIC5yYXRlX21pbiA9IDQ4MDAwLAorCQkJCSAgLnJhdGVfbWF4ID0gNDgwMDAsCisJCQkJICAuY2hhbm5lbHNfbWluID0gMiwKKwkJCQkgIC5jaGFubmVsc19tYXggPSAyLAorCQkJCSAgLmJ1ZmZlcl9ieXRlc19tYXggPSA2MDAwMCwKKwkJCQkgIC5wZXJpb2RfYnl0ZXNfbWluID0gNjQsCisJCQkJICAucGVyaW9kX2J5dGVzX21heCA9IDgxOTIsCisJCQkJICAucGVyaW9kc19taW4gPSAxLAorCQkJCSAgLnBlcmlvZHNfbWF4ID0gMTAyNH0sCisJLmNhcHR1cmVfaHcgPSB7CisJCQkJIC5pbmZvID0gKFNORFJWX1BDTV9JTkZPX01NQVAgfAorCQkJCQkgIFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkJICBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CisJCQkJCSAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJCSAgU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCksCisJCQkJIC5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFLAorCQkJCSAucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCQkgLnJhdGVfbWluID0gNDgwMDAsCisJCQkJIC5yYXRlX21heCA9IDQ4MDAwLAorCQkJCSAvKiAxKzI6IE1haW4gc2lnbmFsIChvdXQpLCAzKzQ6IFRvbmUgMSwKKwkJCQkgICogNSs2OiBUb25lIDIsIDcrODogcmF3CisJCQkJICAqLworCQkJCSAuY2hhbm5lbHNfbWluID0gOCwKKwkJCQkgLmNoYW5uZWxzX21heCA9IDgsCisJCQkJIC5idWZmZXJfYnl0ZXNfbWF4ID0gNjAwMDAsCisJCQkJIC5wZXJpb2RfYnl0ZXNfbWluID0gNjQsCisJCQkJIC5wZXJpb2RfYnl0ZXNfbWF4ID0gODE5MiwKKwkJCQkgLnBlcmlvZHNfbWluID0gMSwKKwkJCQkgLnBlcmlvZHNfbWF4ID0gMTAyNH0sCisJLnJhdGVzID0geworCQkJICAgIC5ucmF0cyA9IDEsCisJCQkgICAgLnJhdHMgPSAmcG9kaGRfcmF0ZGVufSwKKwkuYnl0ZXNfcGVyX2NoYW5uZWwgPSAzIC8qIFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSAqLworfTsKKworc3RhdGljIHZvaWQgcG9kaGRfc3RhcnR1cF9zdGFydF93b3JrcXVldWUodW5zaWduZWQgbG9uZyBkYXRhKTsKK3N0YXRpYyB2b2lkIHBvZGhkX3N0YXJ0dXBfd29ya3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgaW50IHBvZGhkX3N0YXJ0dXBfZmluYWxpemUoc3RydWN0IHVzYl9saW5lNl9wb2RoZCAqcG9kKTsKKworc3RhdGljIHNzaXplX3Qgc2VyaWFsX251bWJlcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X3RvX3NuZF9jYXJkKGRldik7CisJc3RydWN0IHVzYl9saW5lNl9wb2RoZCAqcG9kID0gY2FyZC0+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+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIGFybSwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZmQzMTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX0FSTTY0X1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9BUk02NF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIGFybTY0LCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9mcnYvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL2Zydi9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmU3OGFjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9mcnYvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfRlJWX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9GUlZfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBmcnYsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL2g4MzAwL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9oODMwMC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDlhYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9oODMwMC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9IODMwMF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfSDgzMDBfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBoODMwMCwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvaGV4YWdvbi9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvaGV4YWdvbi9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDJmM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9oZXhhZ29uL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX0hFWEFHT05fVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX0hFWEFHT05fVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBoZXhhZ29uLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9pYTY0L2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9pYTY0L2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmU1YWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL2lhNjQvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfSUE2NF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfSUE2NF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLmg+CisvKiBNQVBfMzJCSVQgaXMgdW5kZWZpbmVkIG9uIGlhNjQsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL20zMnIvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL20zMnIvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyOTYzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvbTMyci9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9NMzJSX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9NMzJSX1VBUElfQVNNX01NQU5fRklYX0gKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gbTMyciwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDVjZDUwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX01JQ1JPQkxBWkVfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX01JQ1JPQkxBWkVfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBtaWNyb2JsYXplLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9taXBzL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMjA1MjkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBUT09MU19BUkNIX01JUFNfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX01JUFNfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBNQURWX0RPRFVNUAkxNworI2RlZmluZSBNQURWX0RPRk9SSwkxMQorI2RlZmluZSBNQURWX0RPTlREVU1QCTE2CisjZGVmaW5lIE1BRFZfRE9OVEZPUksJMTAKKyNkZWZpbmUgTUFEVl9ET05UTkVFRAk0CisjZGVmaW5lIE1BRFZfRlJFRQk4CisjZGVmaW5lIE1BRFZfSFVHRVBBR0UJMTQKKyNkZWZpbmUgTUFEVl9IV1BPSVNPTgkgMTAwCisjZGVmaW5lIE1BRFZfTUVSR0VBQkxFCSAxMgorI2RlZmluZSBNQURWX05PSFVHRVBBR0UgMTUKKyNkZWZpbmUgTUFEVl9OT1JNQUwJMAorI2RlZmluZSBNQURWX1JBTkRPTQkxCisjZGVmaW5lIE1BRFZfUkVNT1ZFCTkKKyNkZWZpbmUgTUFEVl9TRVFVRU5USUFMIDIKKyNkZWZpbmUgTUFEVl9VTk1FUkdFQUJMRSAxMworI2RlZmluZSBNQURWX1dJTExORUVECTMKKyNkZWZpbmUgTUFQX0FOT05ZTU9VUwkweDA4MDAKKyNkZWZpbmUgTUFQX0RFTllXUklURQkweDIwMDAKKyNkZWZpbmUgTUFQX0VYRUNVVEFCTEUJMHg0MDAwCisjZGVmaW5lIE1BUF9GSUxFCTAKKyNkZWZpbmUgTUFQX0ZJWEVECTB4MDEwCisjZGVmaW5lIE1BUF9HUk9XU0RPV04JMHgxMDAwCisjZGVmaW5lIE1BUF9IVUdFVExCCTB4ODAwMDAKKyNkZWZpbmUgTUFQX0xPQ0tFRAkweDgwMDAKKyNkZWZpbmUgTUFQX05PTkJMT0NLCTB4MjAwMDAKKyNkZWZpbmUgTUFQX05PUkVTRVJWRQkweDA0MDAKKyNkZWZpbmUgTUFQX1BPUFVMQVRFCTB4MTAwMDAKKyNkZWZpbmUgTUFQX1BSSVZBVEUJMHgwMDIKKyNkZWZpbmUgTUFQX1NIQVJFRAkweDAwMQorI2RlZmluZSBNQVBfU1RBQ0sJMHg0MDAwMAorI2RlZmluZSBQUk9UX0VYRUMJMHgwNAorI2RlZmluZSBQUk9UX0dST1dTRE9XTgkweDAxMDAwMDAwCisjZGVmaW5lIFBST1RfR1JPV1NVUAkweDAyMDAwMDAwCisjZGVmaW5lIFBST1RfTk9ORQkweDAwCisjZGVmaW5lIFBST1RfUkVBRAkweDAxCisjZGVmaW5lIFBST1RfU0VNCTB4MTAKKyNkZWZpbmUgUFJPVF9XUklURQkweDAyCisvKiBNQURWX1NPRlRfT0ZGTElORSBpcyB1bmRlZmluZWQgb24gbWlwcywgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BRFZfU09GVF9PRkZMSU5FIDEwMQorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBtaXBzLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKy8qIE1BUF9VTklOSVRJQUxJWkVEIGlzIHVuZGVmaW5lZCBvbiBtaXBzLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQX1VOSU5JVElBTElaRUQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL21uMTAzMDAvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL21uMTAzMDAvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlYTM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvbW4xMDMwMC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9NTjEwMzAwX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9NTjEwMzAwX1VBUElfQVNNX01NQU5fRklYX0gKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gbW4xMDMwMCwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9wYXJpc2MvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkOGQ1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvcGFyaXNjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNDcgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9QQVJJU0NfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX1BBUklTQ19VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIE1BRFZfRE9EVU1QCTcwCisjZGVmaW5lIE1BRFZfRE9GT1JLCTExCisjZGVmaW5lIE1BRFZfRE9OVERVTVAgICA2OQorI2RlZmluZSBNQURWX0RPTlRGT1JLCTEwCisjZGVmaW5lIE1BRFZfRE9OVE5FRUQgICA0CisjZGVmaW5lIE1BRFZfRlJFRQk4CisjZGVmaW5lIE1BRFZfSFVHRVBBR0UJNjcKKyNkZWZpbmUgTUFEVl9NRVJHRUFCTEUgICA2NQorI2RlZmluZSBNQURWX05PSFVHRVBBR0UJNjgKKyNkZWZpbmUgTUFEVl9OT1JNQUwgICAgIDAKKyNkZWZpbmUgTUFEVl9SQU5ET00gICAgIDEKKyNkZWZpbmUgTUFEVl9SRU1PVkUJOQorI2RlZmluZSBNQURWX1NFUVVFTlRJQUwgMgorI2RlZmluZSBNQURWX1VOTUVSR0VBQkxFIDY2CisjZGVmaW5lIE1BRFZfV0lMTE5FRUQgICAzCisjZGVmaW5lIE1BUF9BTk9OWU1PVVMJMHgxMAorI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MDgwMAorI2RlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDEwMDAKKyNkZWZpbmUgTUFQX0ZJTEUJMAorI2RlZmluZSBNQVBfRklYRUQJMHgwNAorI2RlZmluZSBNQVBfR1JPV1NET1dOCTB4ODAwMAorI2RlZmluZSBNQVBfSFVHRVRMQgkweDgwMDAwCisjZGVmaW5lIE1BUF9MT0NLRUQJMHgyMDAwCisjZGVmaW5lIE1BUF9OT05CTE9DSwkweDIwMDAwCisjZGVmaW5lIE1BUF9OT1JFU0VSVkUJMHg0MDAwCisjZGVmaW5lIE1BUF9QT1BVTEFURQkweDEwMDAwCisjZGVmaW5lIE1BUF9QUklWQVRFCTB4MDIKKyNkZWZpbmUgTUFQX1NIQVJFRAkweDAxCisjZGVmaW5lIE1BUF9TVEFDSwkweDQwMDAwCisjZGVmaW5lIFBST1RfRVhFQwkweDQKKyNkZWZpbmUgUFJPVF9HUk9XU0RPV04JMHgwMTAwMDAwMAorI2RlZmluZSBQUk9UX0dST1dTVVAJMHgwMjAwMDAwMAorI2RlZmluZSBQUk9UX05PTkUJMHgwCisjZGVmaW5lIFBST1RfUkVBRAkweDEKKyNkZWZpbmUgUFJPVF9TRU0JMHg4CisjZGVmaW5lIFBST1RfV1JJVEUJMHgyCisvKiBNQURWX0hXUE9JU09OIGlzIHVuZGVmaW5lZCBvbiBwYXJpc2MsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQURWX0hXUE9JU09OCTEwMAorLyogTUFEVl9TT0ZUX09GRkxJTkUgaXMgdW5kZWZpbmVkIG9uIHBhcmlzYywgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BRFZfU09GVF9PRkZMSU5FIDEwMQorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBwYXJpc2MsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorLyogTUFQX1VOSU5JVElBTElaRUQgaXMgdW5kZWZpbmVkIG9uIHBhcmlzYywgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF9VTklOSVRJQUxJWkVECTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9wb3dlcnBjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9wb3dlcnBjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWRiNDMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL3Bvd2VycGMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBUT09MU19BUkNIX1BPV0VSUENfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX1BPV0VSUENfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MDgwMAorI2RlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDEwMDAKKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDAxMDAKKyNkZWZpbmUgTUFQX0hVR0VUTEIJMHg0MDAwMAorI2RlZmluZSBNQVBfTE9DS0VECTB4ODAKKyNkZWZpbmUgTUFQX05PTkJMT0NLCTB4MTAwMDAKKyNkZWZpbmUgTUFQX05PUkVTRVJWRSAgIDB4NDAKKyNkZWZpbmUgTUFQX1BPUFVMQVRFCTB4ODAwMAorI2RlZmluZSBNQVBfU1RBQ0sJMHgyMDAwMAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gcG93ZXJwYywgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDNkZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsNiBAQAorI2lmbmRlZiBUT09MU19BUkNIX1MzOTBfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX1MzOTBfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBzMzkwLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC9zY29yZS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gvc2NvcmUvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4ZmI4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvc2NvcmUvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfU0NPUkVfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBUT09MU19BUkNIX1NDT1JFX1VBUElfQVNNX01NQU5fRklYX0gKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gc2NvcmUsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3NoL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oIGIvdG9vbHMvYXJjaC9zaC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUwNGY2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC9zaC9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9TSF9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfU0hfVUFQSV9BU01fTU1BTl9GSVhfSAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiBzaCwgZml4IGl0IGZvciBwZXJmICovCisjZGVmaW5lIE1BUF8zMkJJVAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2FyY2gvc3BhcmMvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NDA1MjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL3NwYXJjL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgVE9PTFNfQVJDSF9TUEFSQ19VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfU1BBUkNfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MDgwMAorI2RlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDEwMDAKKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDAyMDAKKyNkZWZpbmUgTUFQX0hVR0VUTEIJMHg0MDAwMAorI2RlZmluZSBNQVBfTE9DS0VEICAgICAgMHgxMDAKKyNkZWZpbmUgTUFQX05PTkJMT0NLCTB4MTAwMDAKKyNkZWZpbmUgTUFQX05PUkVTRVJWRSAgIDB4NDAKKyNkZWZpbmUgTUFQX1BPUFVMQVRFCTB4ODAwMAorI2RlZmluZSBNQVBfU1RBQ0sJMHgyMDAwMAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaD4KKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24gc3BhcmMsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfMzJCSVQJMAorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3RpbGUvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL3RpbGUvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExNmM0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2FyY2gvdGlsZS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfVElMRV9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIFRPT0xTX0FSQ0hfVElMRV9VQVBJX0FTTV9NTUFOX0ZJWF9ICisjZGVmaW5lIE1BUF9ERU5ZV1JJVEUJMHgwODAwCisjZGVmaW5lIE1BUF9FWEVDVVRBQkxFCTB4MTAwMAorI2RlZmluZSBNQVBfR1JPV1NET1dOCTB4MDEwMAorI2RlZmluZSBNQVBfSFVHRVRMQgkweDQwMDAKKyNkZWZpbmUgTUFQX0xPQ0tFRAkweDAyMDAKKyNkZWZpbmUgTUFQX05PTkJMT0NLCTB4MDA4MAorI2RlZmluZSBNQVBfTk9SRVNFUlZFCTB4MDQwMAorI2RlZmluZSBNQVBfUE9QVUxBVEUJMHgwMDQwCisjZGVmaW5lIE1BUF9TVEFDSwlNQVBfR1JPV1NET1dOCisjaW5jbHVkZSA8dWFwaS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oPgorLyogTUFQXzMyQklUIGlzIHVuZGVmaW5lZCBvbiB0aWxlLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmggYi90b29scy9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzNjMWFmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tbWFuLmgKQEAgLTAsMCArMSw1IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfWDg2X1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9YODZfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBNQVBfMzJCSVQJMHg0MAorI2luY2x1ZGUgPHVhcGkvYXNtLWdlbmVyaWMvbW1hbi5oPgorI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9hcmNoL3h0ZW5zYS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaCBiL3Rvb2xzL2FyY2gveHRlbnNhL2luY2x1ZGUvdWFwaS9hc20vbW1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NTMxOTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hcmNoL3h0ZW5zYS9pbmNsdWRlL3VhcGkvYXNtL21tYW4uaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIFRPT0xTX0FSQ0hfWFRFTlNBX1VBUElfQVNNX01NQU5fRklYX0gKKyNkZWZpbmUgVE9PTFNfQVJDSF9YVEVOU0FfVUFQSV9BU01fTU1BTl9GSVhfSAorI2RlZmluZSBNQURWX0RPRFVNUAkxNworI2RlZmluZSBNQURWX0RPRk9SSwkxMQorI2RlZmluZSBNQURWX0RPTlREVU1QICAgMTYKKyNkZWZpbmUgTUFEVl9ET05URk9SSwkxMAorI2RlZmluZSBNQURWX0RPTlRORUVECTQKKyNkZWZpbmUgTUFEVl9GUkVFCTgKKyNkZWZpbmUgTUFEVl9IVUdFUEFHRQkxNAorI2RlZmluZSBNQURWX01FUkdFQUJMRSAgIDEyCisjZGVmaW5lIE1BRFZfTk9IVUdFUEFHRQkxNQorI2RlZmluZSBNQURWX05PUk1BTAkwCisjZGVmaW5lIE1BRFZfUkFORE9NCTEKKyNkZWZpbmUgTUFEVl9SRU1PVkUJOQorI2RlZmluZSBNQURWX1NFUVVFTlRJQUwJMgorI2RlZmluZSBNQURWX1VOTUVSR0VBQkxFIDEzCisjZGVmaW5lIE1BRFZfV0lMTE5FRUQJMworI2RlZmluZSBNQVBfQU5PTllNT1VTCTB4MDgwMAorI2RlZmluZSBNQVBfREVOWVdSSVRFCTB4MjAwMAorI2RlZmluZSBNQVBfRVhFQ1VUQUJMRQkweDQwMDAKKyNkZWZpbmUgTUFQX0ZJTEUJMAorI2RlZmluZSBNQVBfRklYRUQJMHgwMTAKKyNkZWZpbmUgTUFQX0dST1dTRE9XTgkweDEwMDAKKyNkZWZpbmUgTUFQX0hVR0VUTEIJMHg4MDAwMAorI2RlZmluZSBNQVBfTE9DS0VECTB4ODAwMAorI2RlZmluZSBNQVBfTk9OQkxPQ0sJMHgyMDAwMAorI2RlZmluZSBNQVBfTk9SRVNFUlZFCTB4MDQwMAorI2RlZmluZSBNQVBfUE9QVUxBVEUJMHgxMDAwMAorI2RlZmluZSBNQVBfUFJJVkFURQkweDAwMgorI2RlZmluZSBNQVBfU0hBUkVECTB4MDAxCisjZGVmaW5lIE1BUF9TVEFDSwkweDQwMDAwCisjZGVmaW5lIFBST1RfRVhFQwkweDQKKyNkZWZpbmUgUFJPVF9HUk9XU0RPV04JMHgwMTAwMDAwMAorI2RlZmluZSBQUk9UX0dST1dTVVAJMHgwMjAwMDAwMAorI2RlZmluZSBQUk9UX05PTkUJMHgwCisjZGVmaW5lIFBST1RfUkVBRAkweDEKKyNkZWZpbmUgUFJPVF9TRU0JMHgxMAorI2RlZmluZSBQUk9UX1dSSVRFCTB4MgorLyogTUFEVl9IV1BPSVNPTiBpcyB1bmRlZmluZWQgb24geHRlbnNhLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFEVl9IV1BPSVNPTgkxMDAKKy8qIE1BRFZfU09GVF9PRkZMSU5FIGlzIHVuZGVmaW5lZCBvbiB4dGVuc2EsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQURWX1NPRlRfT0ZGTElORSAxMDEKKy8qIE1BUF8zMkJJVCBpcyB1bmRlZmluZWQgb24geHRlbnNhLCBmaXggaXQgZm9yIHBlcmYgKi8KKyNkZWZpbmUgTUFQXzMyQklUCTAKKy8qIE1BUF9VTklOSVRJQUxJWkVEIGlzIHVuZGVmaW5lZCBvbiB4dGVuc2EsIGZpeCBpdCBmb3IgcGVyZiAqLworI2RlZmluZSBNQVBfVU5JTklUSUFMSVpFRAkwCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2h2L2h2X2t2cF9kYWVtb24uYyBiL3Rvb2xzL2h2L2h2X2t2cF9kYWVtb24uYwppbmRleCAwZDlmNDhlLi5iYzdhZGI4IDEwMDY0NAotLS0gYS90b29scy9odi9odl9rdnBfZGFlbW9uLmMKKysrIGIvdG9vbHMvaHYvaHZfa3ZwX2RhZW1vbi5jCkBAIC0xNDMzLDcgKzE0MzMsNyBAQAogCW9wZW5sb2coIktWUCIsIDAsIExPR19VU0VSKTsKIAlzeXNsb2coTE9HX0lORk8sICJLVlAgc3RhcnRpbmc7IHBpZCBpczolZCIsIGdldHBpZCgpKTsKIAotCWt2cF9mZCA9IG9wZW4oIi9kZXYvdm1idXMvaHZfa3ZwIiwgT19SRFdSKTsKKwlrdnBfZmQgPSBvcGVuKCIvZGV2L3ZtYnVzL2h2X2t2cCIsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiAKIAlpZiAoa3ZwX2ZkIDwgMCkgewogCQlzeXNsb2coTE9HX0VSUiwgIm9wZW4gL2Rldi92bWJ1cy9odl9rdnAgZmFpbGVkOyBlcnJvcjogJWQgJXMiLApkaWZmIC0tZ2l0IGEvdG9vbHMvaHYvaHZfdnNzX2RhZW1vbi5jIGIvdG9vbHMvaHYvaHZfdnNzX2RhZW1vbi5jCmluZGV4IDVkNTFkNmYuLmUwODI5ODAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2h2L2h2X3Zzc19kYWVtb24uYworKysgYi90b29scy9odi9odl92c3NfZGFlbW9uLmMKQEAgLTI1MCw2ICsyNTAsOSBAQAogCQkJCXN5c2xvZyhMT0dfRVJSLCAiL2V0Yy9mc3RhYiBhbmQgL3Byb2MvbW91bnRzIik7CiAJCQl9CiAJCQlicmVhazsKKwkJY2FzZSBWU1NfT1BfSE9UX0JBQ0tVUDoKKwkJCXN5c2xvZyhMT0dfSU5GTywgIlZTUzogb3A9Q0hFQ0sgSE9UIEJBQ0tVUFxuIik7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXN5c2xvZyhMT0dfRVJSLCAiSWxsZWdhbCBvcDolZFxuIiwgb3ApOwogCQl9CmRpZmYgLS1naXQgYS90b29scy9paW8vaWlvX2dlbmVyaWNfYnVmZmVyLmMgYi90b29scy9paW8vaWlvX2dlbmVyaWNfYnVmZmVyLmMKaW5kZXggMGU4YTFmNy4uZjM5YzBlOSAxMDA2NDQKLS0tIGEvdG9vbHMvaWlvL2lpb19nZW5lcmljX2J1ZmZlci5jCisrKyBiL3Rvb2xzL2lpby9paW9fZ2VuZXJpY19idWZmZXIuYwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJaW50IG5vdHJpZ2dlciA9IDA7CiAJY2hhciAqZHVtbXk7CiAKLQlzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyAqY2hhbm5lbHM7CisJc3RydWN0IGlpb19jaGFubmVsX2luZm8gKmNoYW5uZWxzID0gTlVMTDsKIAogCXJlZ2lzdGVyX2NsZWFudXAoKTsKIApAQCAtNDU2LDcgKzQ1Niw3IEBACiAKIAlpZiAobm90cmlnZ2VyKSB7CiAJCXByaW50ZigidHJpZ2dlci1sZXNzIG1vZGUgc2VsZWN0ZWRcbiIpOwotCX0gaWYgKHRyaWdfbnVtID49IDApIHsKKwl9IGVsc2UgaWYgKHRyaWdfbnVtID49IDApIHsKIAkJY2hhciAqdHJpZ19kZXZfbmFtZTsKIAkJcmV0ID0gYXNwcmludGYoJnRyaWdfZGV2X25hbWUsICIlc3RyaWdnZXIlZCIsIGlpb19kaXIsIHRyaWdfbnVtKTsKIAkJaWYgKHJldCA8IDApIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2lpby9paW9fdXRpbHMuYyBiL3Rvb2xzL2lpby9paW9fdXRpbHMuYwppbmRleCA1ZWI2NzkzLi43YTZkNjFjIDEwMDY0NAotLS0gYS90b29scy9paW8vaWlvX3V0aWxzLmMKKysrIGIvdG9vbHMvaWlvL2lpb191dGlscy5jCkBAIC0xMjEsMTAgKzEyMSw2IEBACiAKIAlyZXQgPSAtRU5PRU5UOwogCXdoaWxlIChlbnQgPSByZWFkZGlyKGRwKSwgZW50KQotCQkvKgotCQkgKiBEbyB3ZSBhbGxvdyBkZXZpY2VzIHRvIG92ZXJyaWRlIGEgZ2VuZXJpYyBuYW1lIHdpdGgKLQkJICogYSBzcGVjaWZpYyBvbmU/Ci0JCSAqLwogCQlpZiAoKHN0cmNtcChidWlsdG5hbWUsIGVudC0+ZF9uYW1lKSA9PSAwKSB8fAogCQkgICAgKHN0cmNtcChidWlsdG5hbWVfZ2VuZXJpYywgZW50LT5kX25hbWUpID09IDApKSB7CiAJCQlyZXQgPSBhc3ByaW50ZigmZmlsZW5hbWUsCkBAIC0xNzgsNiArMTc0LDEzIEBACiAJCQlzeXNmc2ZwID0gMDsKIAkJCWZyZWUoZmlsZW5hbWUpOwogCQkJZmlsZW5hbWUgPSAwOworCisJCQkvKgorCQkJICogQXZvaWQgaGF2aW5nIGEgbW9yZSBnZW5lcmljIGVudHJ5IG92ZXJ3cml0aW5nCisJCQkgKiB0aGUgc2V0dGluZ3MuCisJCQkgKi8KKwkJCWlmIChzdHJjbXAoYnVpbHRuYW1lLCBlbnQtPmRfbmFtZSkgPT0gMCkKKwkJCQlicmVhazsKIAkJfQogCiBlcnJvcl9jbG9zZV9zeXNmc2ZwOgpkaWZmIC0tZ2l0IGEvdG9vbHMvaWlvL2xzaWlvLmMgYi90b29scy9paW8vbHNpaW8uYwppbmRleCAzZDY1MGU2Li5hYjBmNWNmIDEwMDY0NAotLS0gYS90b29scy9paW8vbHNpaW8uYworKysgYi90b29scy9paW8vbHNpaW8uYwpAQCAtNTEsNyArNTEsOCBAQAogCiAJd2hpbGUgKGVudCA9IHJlYWRkaXIoZHApLCBlbnQpCiAJCWlmIChjaGVja19wcmVmaXgoZW50LT5kX25hbWUsICJpbl8iKSAmJgotCQkgICAgY2hlY2tfcG9zdGZpeChlbnQtPmRfbmFtZSwgIl9yYXciKSkKKwkJICAgKGNoZWNrX3Bvc3RmaXgoZW50LT5kX25hbWUsICJfcmF3IikgfHwKKwkJICAgIGNoZWNrX3Bvc3RmaXgoZW50LT5kX25hbWUsICJfaW5wdXQiKSkpCiAJCQlwcmludGYoIiAgICUtMTBzXG4iLCBlbnQtPmRfbmFtZSk7CiAKIAlyZXR1cm4gKGNsb3NlZGlyKGRwKSA9PSAtMSkgPyAtZXJybm8gOiAwOwpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQtcG11LmggYi90b29scy9pbmNsdWRlL2xpbnV4L2NvcmVzaWdodC1wbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDQxMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaW5jbHVkZS9saW51eC9jb3Jlc2lnaHQtcG11LmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodChDKSAyMDE1IExpbmFybyBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQXV0aG9yOiBNYXRoaWV1IFBvaXJpZXIgPG1hdGhpZXUucG9pcmllckBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQ09SRVNJR0hUX1BNVV9ICisjZGVmaW5lIF9MSU5VWF9DT1JFU0lHSFRfUE1VX0gKKworI2RlZmluZSBDT1JFU0lHSFRfRVRNX1BNVV9OQU1FICJjc19ldG0iCisjZGVmaW5lIENPUkVTSUdIVF9FVE1fUE1VX1NFRUQgIDB4MTAKKworLyogRVRNdjMuNS9QVE0ncyBFVE1DUiBjb25maWcgYml0ICovCisjZGVmaW5lIEVUTV9PUFRfQ1lDQUNDICAxMgorI2RlZmluZSBFVE1fT1BUX1RTICAgICAgMjgKKworc3RhdGljIGlubGluZSBpbnQgY29yZXNpZ2h0X2dldF90cmFjZV9pZChpbnQgY3B1KQoreworCS8qCisJICogQSB0cmFjZSBJRCBvZiB2YWx1ZSAwIGlzIGludmFsaWQsIHNvIGxldCdzIHN0YXJ0IGF0IHNvbWUKKwkgKiByYW5kb20gdmFsdWUgdGhhdCBmaXRzIGluIDcgYml0cyBhbmQgZ28gZnJvbSB0aGVyZS4gIFNpbmNlCisJICogdGhlIGNvbW1vbiBjb252ZW50aW9uIGlzIHRvIGhhdmUgZGF0YSB0cmFjZSBJRHMgYmUgSShOKSArIDEsCisJICogc2V0IGluc3RydWN0aW9uIHRyYWNlIElEcyBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBDUFUgbnVtYmVyLgorCSAqLworCXJldHVybiAoQ09SRVNJR0hUX0VUTV9QTVVfU0VFRCArIChjcHUgKiAyKSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvaW5jbHVkZS9saW51eC90aW1lNjQuaCBiL3Rvb2xzL2luY2x1ZGUvbGludXgvdGltZTY0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY5MjY1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2luY2x1ZGUvbGludXgvdGltZTY0LmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfVE9PTFNfTElOVVhfVElNRTY0X0gKKyNkZWZpbmUgX1RPT0xTX0xJTlVYX1RJTUU2NF9ICisKKyNkZWZpbmUgTVNFQ19QRVJfU0VDCTEwMDBMCisjZGVmaW5lIFVTRUNfUEVSX01TRUMJMTAwMEwKKyNkZWZpbmUgTlNFQ19QRVJfVVNFQwkxMDAwTAorI2RlZmluZSBOU0VDX1BFUl9NU0VDCTEwMDAwMDBMCisjZGVmaW5lIFVTRUNfUEVSX1NFQwkxMDAwMDAwTAorI2RlZmluZSBOU0VDX1BFUl9TRUMJMTAwMDAwMDAwMEwKKyNkZWZpbmUgRlNFQ19QRVJfU0VDCTEwMDAwMDAwMDAwMDAwMDBMTAorCisjZW5kaWYgLyogX0xJTlVYX1RJTUU2NF9IICovCmRpZmYgLS1naXQgYS90b29scy9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaCBiL3Rvb2xzL2luY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9tbWFuLWNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Mjc0MzgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi1jb21tb24uaApAQCAtMCwwICsxLDc1IEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfTU1BTl9DT01NT05fSAorI2RlZmluZSBfX0FTTV9HRU5FUklDX01NQU5fQ09NTU9OX0gKKworLyoKKyBBdXRob3I6IE1pY2hhZWwgUy4gVHNpcmtpbiA8bXN0QG1lbGxhbm94LmNvLmlsPiwgTWVsbGFub3ggVGVjaG5vbG9naWVzIEx0ZC4KKyBCYXNlZCBvbjogYXNtLXh4eC9tbWFuLmgKKyovCisKKyNkZWZpbmUgUFJPVF9SRUFECTB4MQkJLyogcGFnZSBjYW4gYmUgcmVhZCAqLworI2RlZmluZSBQUk9UX1dSSVRFCTB4MgkJLyogcGFnZSBjYW4gYmUgd3JpdHRlbiAqLworI2RlZmluZSBQUk9UX0VYRUMJMHg0CQkvKiBwYWdlIGNhbiBiZSBleGVjdXRlZCAqLworI2RlZmluZSBQUk9UX1NFTQkweDgJCS8qIHBhZ2UgbWF5IGJlIHVzZWQgZm9yIGF0b21pYyBvcHMgKi8KKyNkZWZpbmUgUFJPVF9OT05FCTB4MAkJLyogcGFnZSBjYW4gbm90IGJlIGFjY2Vzc2VkICovCisjZGVmaW5lIFBST1RfR1JPV1NET1dOCTB4MDEwMDAwMDAJLyogbXByb3RlY3QgZmxhZzogZXh0ZW5kIGNoYW5nZSB0byBzdGFydCBvZiBncm93c2Rvd24gdm1hICovCisjZGVmaW5lIFBST1RfR1JPV1NVUAkweDAyMDAwMDAwCS8qIG1wcm90ZWN0IGZsYWc6IGV4dGVuZCBjaGFuZ2UgdG8gZW5kIG9mIGdyb3dzdXAgdm1hICovCisKKyNkZWZpbmUgTUFQX1NIQVJFRAkweDAxCQkvKiBTaGFyZSBjaGFuZ2VzICovCisjZGVmaW5lIE1BUF9QUklWQVRFCTB4MDIJCS8qIENoYW5nZXMgYXJlIHByaXZhdGUgKi8KKyNkZWZpbmUgTUFQX1RZUEUJMHgwZgkJLyogTWFzayBmb3IgdHlwZSBvZiBtYXBwaW5nICovCisjZGVmaW5lIE1BUF9GSVhFRAkweDEwCQkvKiBJbnRlcnByZXQgYWRkciBleGFjdGx5ICovCisjZGVmaW5lIE1BUF9BTk9OWU1PVVMJMHgyMAkJLyogZG9uJ3QgdXNlIGEgZmlsZSAqLworI2lmZGVmIENPTkZJR19NTUFQX0FMTE9XX1VOSU5JVElBTElaRUQKKyMgZGVmaW5lIE1BUF9VTklOSVRJQUxJWkVEIDB4NDAwMDAwMAkvKiBGb3IgYW5vbnltb3VzIG1tYXAsIG1lbW9yeSBjb3VsZCBiZSB1bmluaXRpYWxpemVkICovCisjZWxzZQorIyBkZWZpbmUgTUFQX1VOSU5JVElBTElaRUQgMHgwCQkvKiBEb24ndCBzdXBwb3J0IHRoaXMgZmxhZyAqLworI2VuZGlmCisKKy8qCisgKiBGbGFncyBmb3IgbWxvY2sKKyAqLworI2RlZmluZSBNTE9DS19PTkZBVUxUCTB4MDEJCS8qIExvY2sgcGFnZXMgaW4gcmFuZ2UgYWZ0ZXIgdGhleSBhcmUgZmF1bHRlZCBpbiwgZG8gbm90IHByZWZhdWx0ICovCisKKyNkZWZpbmUgTVNfQVNZTkMJMQkJLyogc3luYyBtZW1vcnkgYXN5bmNocm9ub3VzbHkgKi8KKyNkZWZpbmUgTVNfSU5WQUxJREFURQkyCQkvKiBpbnZhbGlkYXRlIHRoZSBjYWNoZXMgKi8KKyNkZWZpbmUgTVNfU1lOQwkJNAkJLyogc3luY2hyb25vdXMgbWVtb3J5IHN5bmMgKi8KKworI2RlZmluZSBNQURWX05PUk1BTAkwCQkvKiBubyBmdXJ0aGVyIHNwZWNpYWwgdHJlYXRtZW50ICovCisjZGVmaW5lIE1BRFZfUkFORE9NCTEJCS8qIGV4cGVjdCByYW5kb20gcGFnZSByZWZlcmVuY2VzICovCisjZGVmaW5lIE1BRFZfU0VRVUVOVElBTAkyCQkvKiBleHBlY3Qgc2VxdWVudGlhbCBwYWdlIHJlZmVyZW5jZXMgKi8KKyNkZWZpbmUgTUFEVl9XSUxMTkVFRAkzCQkvKiB3aWxsIG5lZWQgdGhlc2UgcGFnZXMgKi8KKyNkZWZpbmUgTUFEVl9ET05UTkVFRAk0CQkvKiBkb24ndCBuZWVkIHRoZXNlIHBhZ2VzICovCisKKy8qIGNvbW1vbiBwYXJhbWV0ZXJzOiB0cnkgdG8ga2VlcCB0aGVzZSBjb25zaXN0ZW50IGFjcm9zcyBhcmNoaXRlY3R1cmVzICovCisjZGVmaW5lIE1BRFZfRlJFRQk4CQkvKiBmcmVlIHBhZ2VzIG9ubHkgaWYgbWVtb3J5IHByZXNzdXJlICovCisjZGVmaW5lIE1BRFZfUkVNT1ZFCTkJCS8qIHJlbW92ZSB0aGVzZSBwYWdlcyAmIHJlc291cmNlcyAqLworI2RlZmluZSBNQURWX0RPTlRGT1JLCTEwCQkvKiBkb24ndCBpbmhlcml0IGFjcm9zcyBmb3JrICovCisjZGVmaW5lIE1BRFZfRE9GT1JLCTExCQkvKiBkbyBpbmhlcml0IGFjcm9zcyBmb3JrICovCisjZGVmaW5lIE1BRFZfSFdQT0lTT04JMTAwCQkvKiBwb2lzb24gYSBwYWdlIGZvciB0ZXN0aW5nICovCisjZGVmaW5lIE1BRFZfU09GVF9PRkZMSU5FIDEwMQkJLyogc29mdCBvZmZsaW5lIHBhZ2UgZm9yIHRlc3RpbmcgKi8KKworI2RlZmluZSBNQURWX01FUkdFQUJMRSAgIDEyCQkvKiBLU00gbWF5IG1lcmdlIGlkZW50aWNhbCBwYWdlcyAqLworI2RlZmluZSBNQURWX1VOTUVSR0VBQkxFIDEzCQkvKiBLU00gbWF5IG5vdCBtZXJnZSBpZGVudGljYWwgcGFnZXMgKi8KKworI2RlZmluZSBNQURWX0hVR0VQQUdFCTE0CQkvKiBXb3J0aCBiYWNraW5nIHdpdGggaHVnZXBhZ2VzICovCisjZGVmaW5lIE1BRFZfTk9IVUdFUEFHRQkxNQkJLyogTm90IHdvcnRoIGJhY2tpbmcgd2l0aCBodWdlcGFnZXMgKi8KKworI2RlZmluZSBNQURWX0RPTlREVU1QICAgMTYJCS8qIEV4cGxpY2l0eSBleGNsdWRlIGZyb20gdGhlIGNvcmUgZHVtcCwKKwkJCQkJICAgb3ZlcnJpZGVzIHRoZSBjb3JlZHVtcCBmaWx0ZXIgYml0cyAqLworI2RlZmluZSBNQURWX0RPRFVNUAkxNwkJLyogQ2xlYXIgdGhlIE1BRFZfRE9OVERVTVAgZmxhZyAqLworCisvKiBjb21wYXRpYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIE1BUF9GSUxFCTAKKworLyoKKyAqIFdoZW4gTUFQX0hVR0VUTEIgaXMgc2V0IGJpdHMgWzI2OjMxXSBlbmNvZGUgdGhlIGxvZzIgb2YgdGhlIGh1Z2UgcGFnZSBzaXplLgorICogVGhpcyBnaXZlcyB1cyA2IGJpdHMsIHdoaWNoIGlzIGVub3VnaCB1bnRpbCBzb21lb25lIGludmVudHMgMTI4IGJpdCBhZGRyZXNzCisgKiBzcGFjZXMuCisgKgorICogQXNzdW1lIHRoZXNlIGFyZSBhbGwgcG93ZXIgb2YgdHdvcy4KKyAqIFdoZW4gMCB1c2UgdGhlIGRlZmF1bHQgcGFnZSBzaXplLgorICovCisjZGVmaW5lIE1BUF9IVUdFX1NISUZUCTI2CisjZGVmaW5lIE1BUF9IVUdFX01BU0sJMHgzZgorCisjZW5kaWYgLyogX19BU01fR0VORVJJQ19NTUFOX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS90b29scy9pbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvbW1hbi5oIGIvdG9vbHMvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGZhNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaW5jbHVkZS91YXBpL2FzbS1nZW5lcmljL21tYW4uaApAQCAtMCwwICsxLDIyIEBACisjaWZuZGVmIF9fQVNNX0dFTkVSSUNfTU1BTl9ICisjZGVmaW5lIF9fQVNNX0dFTkVSSUNfTU1BTl9ICisKKyNpbmNsdWRlIDx1YXBpL2FzbS1nZW5lcmljL21tYW4tY29tbW9uLmg+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+dXNlcl9yZWdzOworCXU2NCAqYnVmOworCisJYnVmID0gY2FsbG9jKDEsIHNpemVvZih1NjQpICogUEVSRl9SRUdTX01BWCk7CisJaWYgKCFidWYpIHsKKwkJcHJfZGVidWcoImZhaWxlZCB0byBhbGxvY2F0ZSBzYW1wbGUgdXJlZ3MgZGF0YVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwZXJmX3JlZ3NfbG9hZChidWYpOworCXJlZ3MtPmFiaSAgPSBQRVJGX1NBTVBMRV9SRUdTX0FCSTsKKwlyZWdzLT5yZWdzID0gYnVmOworCXJlZ3MtPm1hc2sgPSBQRVJGX1JFR1NfTUFTSzsKKworCXJldHVybiBzYW1wbGVfdXN0YWNrKHNhbXBsZSwgdGhyZWFkLCBidWYpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdGVzdHMvcmVnc19sb2FkLlMgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy90ZXN0cy9yZWdzX2xvYWQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzZjOWEzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdGVzdHMvcmVnc19sb2FkLlMKQEAgLTAsMCArMSw5NCBAQAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKworLyogT2Zmc2V0IGlzIGJhc2VkIG9uIG1hY3JvcyBmcm9tIGFyY2gvcG93ZXJwYy9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS5oLiAqLworI2RlZmluZSBSMAkgMAorI2RlZmluZSBSMQkgMSAqIDgKKyNkZWZpbmUgUjIJIDIgKiA4CisjZGVmaW5lIFIzCSAzICogOAorI2RlZmluZSBSNAkgNCAqIDgKKyNkZWZpbmUgUjUJIDUgKiA4CisjZGVmaW5lIFI2CSA2ICogOAorI2RlZmluZSBSNwkgNyAqIDgKKyNkZWZpbmUgUjgJIDggKiA4CisjZGVmaW5lIFI5CSA5ICogOAorI2RlZmluZSBSMTAJMTAgKiA4CisjZGVmaW5lIFIxMQkxMSAqIDgKKyNkZWZpbmUgUjEyCTEyICogOAorI2RlZmluZSBSMTMJMTMgKiA4CisjZGVmaW5lIFIxNAkxNCAqIDgKKyNkZWZpbmUgUjE1CTE1ICogOAorI2RlZmluZSBSMTYJMTYgKiA4CisjZGVmaW5lIFIxNwkxNyAqIDgKKyNkZWZpbmUgUjE4CTE4ICogOAorI2RlZmluZSBSMTkJMTkgKiA4CisjZGVmaW5lIFIyMAkyMCAqIDgKKyNkZWZpbmUgUjIxCTIxICogOAorI2RlZmluZSBSMjIJMjIgKiA4CisjZGVmaW5lIFIyMwkyMyAqIDgKKyNkZWZpbmUgUjI0CTI0ICogOAorI2RlZmluZSBSMjUJMjUgKiA4CisjZGVmaW5lIFIyNgkyNiAqIDgKKyNkZWZpbmUgUjI3CTI3ICogOAorI2RlZmluZSBSMjgJMjggKiA4CisjZGVmaW5lIFIyOQkyOSAqIDgKKyNkZWZpbmUgUjMwCTMwICogOAorI2RlZmluZSBSMzEJMzEgKiA4CisjZGVmaW5lIE5JUAkzMiAqIDgKKyNkZWZpbmUgQ1RSCTM1ICogOAorI2RlZmluZSBMSU5LCTM2ICogOAorI2RlZmluZSBYRVIJMzcgKiA4CisKKy5nbG9ibCBwZXJmX3JlZ3NfbG9hZAorcGVyZl9yZWdzX2xvYWQ6CisJc3RkIDAsIFIwKDMpCisJc3RkIDEsIFIxKDMpCisJc3RkIDIsIFIyKDMpCisJc3RkIDMsIFIzKDMpCisJc3RkIDQsIFI0KDMpCisJc3RkIDUsIFI1KDMpCisJc3RkIDYsIFI2KDMpCisJc3RkIDcsIFI3KDMpCisJc3RkIDgsIFI4KDMpCisJc3RkIDksIFI5KDMpCisJc3RkIDEwLCBSMTAoMykKKwlzdGQgMTEsIFIxMSgzKQorCXN0ZCAxMiwgUjEyKDMpCisJc3RkIDEzLCBSMTMoMykKKwlzdGQgMTQsIFIxNCgzKQorCXN0ZCAxNSwgUjE1KDMpCisJc3RkIDE2LCBSMTYoMykKKwlzdGQgMTcsIFIxNygzKQorCXN0ZCAxOCwgUjE4KDMpCisJc3RkIDE5LCBSMTkoMykKKwlzdGQgMjAsIFIyMCgzKQorCXN0ZCAyMSwgUjIxKDMpCisJc3RkIDIyLCBSMjIoMykKKwlzdGQgMjMsIFIyMygzKQorCXN0ZCAyNCwgUjI0KDMpCisJc3RkIDI1LCBSMjUoMykKKwlzdGQgMjYsIFIyNigzKQorCXN0ZCAyNywgUjI3KDMpCisJc3RkIDI4LCBSMjgoMykKKwlzdGQgMjksIFIyOSgzKQorCXN0ZCAzMCwgUjMwKDMpCisJc3RkIDMxLCBSMzEoMykKKworCS8qIHN0b3JlIE5JUCAqLworCW1mbHIgNAorCXN0ZCA0LCBOSVAoMykKKworCS8qIFN0b3JlIExSICovCisJc3RkIDQsIExJTksoMykKKworCS8qIFN0b3JlIFhFUiAqLworCW1meGVyIDQKKwlzdGQgNCwgWEVSKDMpCisKKwkvKiBTdG9yZSBDVFIgKi8KKwltZmN0ciA0CisJc3RkIDQsIENUUigzKQorCisJLyogUmVzdG9yZSBvcmlnaW5hbCB2YWx1ZSBvZiByNCAqLworCWxkIDQsIFI0KDMpCisKKwlibHIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3V0aWwvc3ltLWhhbmRsaW5nLmMgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy91dGlsL3N5bS1oYW5kbGluZy5jCmluZGV4IDM1NzQ1YTcuLmVkOWQ1ZDEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3V0aWwvc3ltLWhhbmRsaW5nLmMKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdXRpbC9zeW0taGFuZGxpbmcuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJaW50IGkgPSAwOwogCiAJbWFwID0gZ2V0X3RhcmdldF9tYXAocGV2LT50YXJnZXQsIHBldi0+dXByb2Jlcyk7Ci0JaWYgKCFtYXAgfHwgbWFwX19sb2FkKG1hcCwgTlVMTCkgPCAwKQorCWlmICghbWFwIHx8IG1hcF9fbG9hZChtYXApIDwgMCkKIAkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgaSA8IG50ZXZzOyBpKyspIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9zMzkwL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIGIvdG9vbHMvcGVyZi9hcmNoL3MzOTAvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhNzRhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9zMzkwL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCkBAIC0wLDAgKzEsOCBAQAorI2lmZGVmIERFRklORV9EV0FSRl9SRUdTVFJfVEFCTEUKKy8qIFRoaXMgaXMgaW5jbHVkZWQgaW4gcGVyZi91dGlsL2R3YXJmLXJlZ3MuYyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHMzOTBfcmVnc3RyX3RibFtdID0geworCSIlcjAiLCAiJXIxIiwgICIlcjIiLCAgIiVyMyIsICAiJXI0IiwgICIlcjUiLCAgIiVyNiIsICAiJXI3IiwKKwkiJXI4IiwgIiVyOSIsICIlcjEwIiwgIiVyMTEiLCAiJXIxMiIsICIlcjEzIiwgIiVyMTQiLCAiJXIxNSIsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvc2gvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmggYi90b29scy9wZXJmL2FyY2gvc2gvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyZGVhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9zaC9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApAQCAtMCwwICsxLDI1IEBACisjaWZkZWYgREVGSU5FX0RXQVJGX1JFR1NUUl9UQUJMRQorLyogVGhpcyBpcyBpbmNsdWRlZCBpbiBwZXJmL3V0aWwvZHdhcmYtcmVncy5jICovCisKK2NvbnN0IGNoYXIgKiBjb25zdCBzaF9yZWdzdHJfdGJsW10gPSB7CisJInIwIiwKKwkicjEiLAorCSJyMiIsCisJInIzIiwKKwkicjQiLAorCSJyNSIsCisJInI2IiwKKwkicjciLAorCSJyOCIsCisJInI5IiwKKwkicjEwIiwKKwkicjExIiwKKwkicjEyIiwKKwkicjEzIiwKKwkicjE0IiwKKwkicjE1IiwKKwkicGMiLAorCSJwciIsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9zcGFyYy9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCBiL3Rvb2xzL3BlcmYvYXJjaC9zcGFyYy9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmMwNzYxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3NwYXJjL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZmRlZiBERUZJTkVfRFdBUkZfUkVHU1RSX1RBQkxFCisvKiBUaGlzIGlzIGluY2x1ZGVkIGluIHBlcmYvdXRpbC9kd2FyZi1yZWdzLmMgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGFyY19yZWdzdHJfdGJsW10gPSB7CisJIiVnMCIsICIlZzEiLCAiJWcyIiwgIiVnMyIsICIlZzQiLCAiJWc1IiwgIiVnNiIsICIlZzciLAorCSIlbzAiLCAiJW8xIiwgIiVvMiIsICIlbzMiLCAiJW80IiwgIiVvNSIsICIlc3AiLCAiJW83IiwKKwkiJWwwIiwgIiVsMSIsICIlbDIiLCAiJWwzIiwgIiVsNCIsICIlbDUiLCAiJWw2IiwgIiVsNyIsCisJIiVpMCIsICIlaTEiLCAiJWkyIiwgIiVpMyIsICIlaTQiLCAiJWk1IiwgIiVmcCIsICIlaTciLAorCSIlZjAiLCAiJWYxIiwgIiVmMiIsICIlZjMiLCAiJWY0IiwgIiVmNSIsICIlZjYiLCAiJWY3IiwKKwkiJWY4IiwgIiVmOSIsICIlZjEwIiwgIiVmMTEiLCAiJWYxMiIsICIlZjEzIiwgIiVmMTQiLCAiJWYxNSIsCisJIiVmMTYiLCAiJWYxNyIsICIlZjE4IiwgIiVmMTkiLCAiJWYyMCIsICIlZjIxIiwgIiVmMjIiLCAiJWYyMyIsCisJIiVmMjQiLCAiJWYyNSIsICIlZjI2IiwgIiVmMjciLCAiJWYyOCIsICIlZjI5IiwgIiVmMzAiLCAiJWYzMSIsCisJIiVmMzIiLCAiJWYzMyIsICIlZjM0IiwgIiVmMzUiLCAiJWYzNiIsICIlZjM3IiwgIiVmMzgiLCAiJWYzOSIsCisJIiVmNDAiLCAiJWY0MSIsICIlZjQyIiwgIiVmNDMiLCAiJWY0NCIsICIlZjQ1IiwgIiVmNDYiLCAiJWY0NyIsCisJIiVmNDgiLCAiJWY0OSIsICIlZjUwIiwgIiVmNTEiLCAiJWY1MiIsICIlZjUzIiwgIiVmNTQiLCAiJWY1NSIsCisJIiVmNTYiLCAiJWY1NyIsICIlZjU4IiwgIiVmNTkiLCAiJWY2MCIsICIlZjYxIiwgIiVmNjIiLCAiJWY2MyIsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjVlNWNiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaApAQCAtMCwwICsxLDE0IEBACisjaWZkZWYgREVGSU5FX0RXQVJGX1JFR1NUUl9UQUJMRQorLyogVGhpcyBpcyBpbmNsdWRlZCBpbiBwZXJmL3V0aWwvZHdhcmYtcmVncy5jICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgeDg2XzMyX3JlZ3N0cl90YmxbXSA9IHsKKwkiJWF4IiwgIiVjeCIsICIlZHgiLCAiJWJ4IiwgIiRzdGFjayIsLyogU3RhY2sgYWRkcmVzcyBpbnN0ZWFkIG9mICVzcCAqLworCSIlYnAiLCAiJXNpIiwgIiVkaSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHg4Nl82NF9yZWdzdHJfdGJsW10gPSB7CisJIiVheCIsICIlZHgiLCAiJWN4IiwgIiVieCIsICIlc2kiLCAiJWRpIiwKKwkiJWJwIiwgIiVzcCIsICIlcjgiLCAiJXI5IiwgIiVyMTAiLCAiJXIxMSIsCisJIiVyMTIiLCAiJXIxMyIsICIlcjE0IiwgIiVyMTUiLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni91dGlsL2ludGVsLXB0LmMgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvaW50ZWwtcHQuYwppbmRleCBhMjQxMmU5Li45MGZhMjI4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvaW50ZWwtcHQuYworKysgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvaW50ZWwtcHQuYwpAQCAtNjIsNiArNjIsNyBAQAogCXNpemVfdAkJCQlzbmFwc2hvdF9yZWZfYnVmX3NpemU7CiAJaW50CQkJCXNuYXBzaG90X3JlZl9jbnQ7CiAJc3RydWN0IGludGVsX3B0X3NuYXBzaG90X3JlZgkqc25hcHNob3RfcmVmczsKKwlzaXplX3QJCQkJcHJpdl9zaXplOwogfTsKIAogc3RhdGljIGludCBpbnRlbF9wdF9wYXJzZV90ZXJtc193aXRoX2RlZmF1bHQoc3RydWN0IGxpc3RfaGVhZCAqZm9ybWF0cywKQEAgLTI3MywxMSArMjc0LDM3IEBACiAJcmV0dXJuIGF0dHI7CiB9CiAKLXN0YXRpYyBzaXplX3QKLWludGVsX3B0X2luZm9fcHJpdl9zaXplKHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciBfX21heWJlX3VudXNlZCwKLQkJCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0IF9fbWF5YmVfdW51c2VkKQorc3RhdGljIGNvbnN0IGNoYXIgKmludGVsX3B0X2ZpbmRfZmlsdGVyKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAorCQkJCQlzdHJ1Y3QgcGVyZl9wbXUgKmludGVsX3B0X3BtdSkKIHsKLQlyZXR1cm4gSU5URUxfUFRfQVVYVFJBQ0VfUFJJVl9TSVpFOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKworCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkoZXZsaXN0LCBldnNlbCkgeworCQlpZiAoZXZzZWwtPmF0dHIudHlwZSA9PSBpbnRlbF9wdF9wbXUtPnR5cGUpCisJCQlyZXR1cm4gZXZzZWwtPmZpbHRlcjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHNpemVfdCBpbnRlbF9wdF9maWx0ZXJfYnl0ZXMoY29uc3QgY2hhciAqZmlsdGVyKQoreworCXNpemVfdCBsZW4gPSBmaWx0ZXIgPyBzdHJsZW4oZmlsdGVyKSA6IDA7CisKKwlyZXR1cm4gbGVuID8gcm91bmR1cChsZW4gKyAxLCA4KSA6IDA7Cit9CisKK3N0YXRpYyBzaXplX3QKK2ludGVsX3B0X2luZm9fcHJpdl9zaXplKHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQgKml0ciwgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCit7CisJc3RydWN0IGludGVsX3B0X3JlY29yZGluZyAqcHRyID0KKwkJCWNvbnRhaW5lcl9vZihpdHIsIHN0cnVjdCBpbnRlbF9wdF9yZWNvcmRpbmcsIGl0cik7CisJY29uc3QgY2hhciAqZmlsdGVyID0gaW50ZWxfcHRfZmluZF9maWx0ZXIoZXZsaXN0LCBwdHItPmludGVsX3B0X3BtdSk7CisKKwlwdHItPnByaXZfc2l6ZSA9IChJTlRFTF9QVF9BVVhUUkFDRV9QUklWX01BWCAqIHNpemVvZih1NjQpKSArCisJCQkgaW50ZWxfcHRfZmlsdGVyX2J5dGVzKGZpbHRlcik7CisKKwlyZXR1cm4gcHRyLT5wcml2X3NpemU7CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX3B0X3RzY19jdGNfcmF0aW8odTMyICpuLCB1MzIgKmQpCkBAIC0zMDIsOSArMzI5LDEzIEBACiAJYm9vbCBjYXBfdXNlcl90aW1lX3plcm8gPSBmYWxzZSwgcGVyX2NwdV9tbWFwczsKIAl1NjQgdHNjX2JpdCwgbXRjX2JpdCwgbXRjX2ZyZXFfYml0cywgY3ljX2JpdCwgbm9yZXRjb21wX2JpdDsKIAl1MzIgdHNjX2N0Y19yYXRpb19uLCB0c2NfY3RjX3JhdGlvX2Q7CisJdW5zaWduZWQgbG9uZyBtYXhfbm9uX3R1cmJvX3JhdGlvOworCXNpemVfdCBmaWx0ZXJfc3RyX2xlbjsKKwljb25zdCBjaGFyICpmaWx0ZXI7CisJdTY0ICppbmZvOwogCWludCBlcnI7CiAKLQlpZiAocHJpdl9zaXplICE9IElOVEVMX1BUX0FVWFRSQUNFX1BSSVZfU0laRSkKKwlpZiAocHJpdl9zaXplICE9IHB0ci0+cHJpdl9zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWludGVsX3B0X3BhcnNlX3Rlcm1zKCZpbnRlbF9wdF9wbXUtPmZvcm1hdCwgInRzYyIsICZ0c2NfYml0KTsKQEAgLTMxNyw2ICszNDgsMTMgQEAKIAogCWludGVsX3B0X3RzY19jdGNfcmF0aW8oJnRzY19jdGNfcmF0aW9fbiwgJnRzY19jdGNfcmF0aW9fZCk7CiAKKwlpZiAocGVyZl9wbXVfX3NjYW5fZmlsZShpbnRlbF9wdF9wbXUsICJtYXhfbm9udHVyYm9fcmF0aW8iLAorCQkJCSIlbHUiLCAmbWF4X25vbl90dXJib19yYXRpbykgIT0gMSkKKwkJbWF4X25vbl90dXJib19yYXRpbyA9IDA7CisKKwlmaWx0ZXIgPSBpbnRlbF9wdF9maW5kX2ZpbHRlcihzZXNzaW9uLT5ldmxpc3QsIHB0ci0+aW50ZWxfcHRfcG11KTsKKwlmaWx0ZXJfc3RyX2xlbiA9IGZpbHRlciA/IHN0cmxlbihmaWx0ZXIpIDogMDsKKwogCWlmICghc2Vzc2lvbi0+ZXZsaXN0LT5ucl9tbWFwcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTM1MSw2ICszODksMTcgQEAKIAlhdXh0cmFjZV9pbmZvLT5wcml2W0lOVEVMX1BUX1RTQ19DVENfTl0gPSB0c2NfY3RjX3JhdGlvX247CiAJYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9UU0NfQ1RDX0RdID0gdHNjX2N0Y19yYXRpb19kOwogCWF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfQ1lDX0JJVF0gPSBjeWNfYml0OworCWF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfTUFYX05PTlRVUkJPX1JBVElPXSA9IG1heF9ub25fdHVyYm9fcmF0aW87CisJYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9GSUxURVJfU1RSX0xFTl0gPSBmaWx0ZXJfc3RyX2xlbjsKKworCWluZm8gPSAmYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9GSUxURVJfU1RSX0xFTl0gKyAxOworCisJaWYgKGZpbHRlcl9zdHJfbGVuKSB7CisJCXNpemVfdCBsZW4gPSBpbnRlbF9wdF9maWx0ZXJfYnl0ZXMoZmlsdGVyKTsKKworCQlzdHJuY3B5KChjaGFyICopaW5mbywgZmlsdGVyLCBsZW4pOworCQlpbmZvICs9IGxlbiA+PiAzOworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCBiL3Rvb2xzL3BlcmYvYXJjaC94dGVuc2EvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwNDQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC94dGVuc2EvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgKQEAgLTAsMCArMSw4IEBACisjaWZkZWYgREVGSU5FX0RXQVJGX1JFR1NUUl9UQUJMRQorLyogVGhpcyBpcyBpbmNsdWRlZCBpbiBwZXJmL3V0aWwvZHdhcmYtcmVncy5jICovCisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgeHRlbnNhX3JlZ3N0cl90YmxbXSA9IHsKKwkiYTAiLCAiYTEiLCAiYTIiLCAiYTMiLCAiYTQiLCAiYTUiLCAiYTYiLCAiYTciLAorCSJhOCIsICJhOSIsICJhMTAiLCAiYTExIiwgImExMiIsICJhMTMiLCAiYTE0IiwgImExNSIsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXJlcXVldWUuYyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtcmVxdWV1ZS5jCmluZGV4IGY5NmUyMmUuLjJiOTcwNWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtcmVxdWV1ZS5jCisrKyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtcmVxdWV1ZS5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8c3ViY21kL3BhcnNlLW9wdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSAiYmVuY2guaCIKICNpbmNsdWRlICJmdXRleC5oIgpAQCAtNjIsNyArNjMsNyBAQAogCXByaW50ZigiUmVxdWV1ZWQgJWQgb2YgJWQgdGhyZWFkcyBpbiAlLjRmIG1zICgrLSUuMmYlJSlcbiIsCiAJICAgICAgIHJlcXVldWVkX2F2ZywKIAkgICAgICAgbnRocmVhZHMsCi0JICAgICAgIHJlcXVldWV0aW1lX2F2Zy8xZTMsCisJICAgICAgIHJlcXVldWV0aW1lX2F2ZyAvIFVTRUNfUEVSX01TRUMsCiAJICAgICAgIHJlbF9zdGRkZXZfc3RhdHMocmVxdWV1ZXRpbWVfc3RkZGV2LCByZXF1ZXVldGltZV9hdmcpKTsKIH0KIApAQCAtMTg0LDcgKzE4NSw3IEBACiAKIAkJaWYgKCFzaWxlbnQpIHsKIAkJCXByaW50ZigiW1J1biAlZF06IFJlcXVldWVkICVkIG9mICVkIHRocmVhZHMgaW4gJS40ZiBtc1xuIiwKLQkJCSAgICAgICBqICsgMSwgbnJlcXVldWVkLCBudGhyZWFkcywgcnVudGltZS50dl91c2VjLzFlMyk7CisJCQkgICAgICAgaiArIDEsIG5yZXF1ZXVlZCwgbnRocmVhZHMsIHJ1bnRpbWUudHZfdXNlYyAvIChkb3VibGUpVVNFQ19QRVJfTVNFQyk7CiAJCX0KIAogCQkvKiBldmVyeWJvZHkgc2hvdWxkIGJlIGJsb2NrZWQgb24gZnV0ZXgyLCB3YWtlJ2VtIHVwICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UtcGFyYWxsZWwuYyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtd2FrZS1wYXJhbGxlbC5jCmluZGV4IDRhMmVjZDcuLjJjOGZhNjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtd2FrZS1wYXJhbGxlbC5jCisrKyBiL3Rvb2xzL3BlcmYvYmVuY2gvZnV0ZXgtd2FrZS1wYXJhbGxlbC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8c3ViY21kL3BhcnNlLW9wdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSAiYmVuY2guaCIKICNpbmNsdWRlICJmdXRleC5oIgpAQCAtMTU2LDcgKzE1Nyw3IEBACiAKIAlwcmludGYoIltSdW4gJWRdOiBBdmcgcGVyLXRocmVhZCBsYXRlbmN5ICh3YWtpbmcgJWQvJWQgdGhyZWFkcykgIgogCSAgICAgICAiaW4gJS40ZiBtcyAoKy0lLjJmJSUpXG4iLCBydW5fbnVtICsgMSwgd2FrZXVwX2F2ZywKLQkgICAgICAgbmJsb2NrZWRfdGhyZWFkcywgd2FrZXRpbWVfYXZnLzFlMywKKwkgICAgICAgbmJsb2NrZWRfdGhyZWFkcywgd2FrZXRpbWVfYXZnIC8gVVNFQ19QRVJfTVNFQywKIAkgICAgICAgcmVsX3N0ZGRldl9zdGF0cyh3YWtldGltZV9zdGRkZXYsIHdha2V0aW1lX2F2ZykpOwogfQogCkBAIC0xNzIsNyArMTczLDcgQEAKIAlwcmludGYoIkF2ZyBwZXItdGhyZWFkIGxhdGVuY3kgKHdha2luZyAlZC8lZCB0aHJlYWRzKSBpbiAlLjRmIG1zICgrLSUuMmYlJSlcbiIsCiAJICAgICAgIHdha2V1cF9hdmcsCiAJICAgICAgIG5ibG9ja2VkX3RocmVhZHMsCi0JICAgICAgIHdha2V0aW1lX2F2Zy8xZTMsCisJICAgICAgIHdha2V0aW1lX2F2ZyAvIFVTRUNfUEVSX01TRUMsCiAJICAgICAgIHJlbF9zdGRkZXZfc3RhdHMod2FrZXRpbWVfc3RkZGV2LCB3YWtldGltZV9hdmcpKTsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9mdXRleC13YWtlLmMgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UuYwppbmRleCA4N2Q4ZjRmLi5lMjQ2YjFiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UuYworKysgYi90b29scy9wZXJmL2JlbmNoL2Z1dGV4LXdha2UuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPHN1YmNtZC9wYXJzZS1vcHRpb25zLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgImJlbmNoLmgiCiAjaW5jbHVkZSAiZnV0ZXguaCIKQEAgLTgxLDcgKzgyLDcgQEAKIAlwcmludGYoIldva2V1cCAlZCBvZiAlZCB0aHJlYWRzIGluICUuNGYgbXMgKCstJS4yZiUlKVxuIiwKIAkgICAgICAgd2FrZXVwX2F2ZywKIAkgICAgICAgbnRocmVhZHMsCi0JICAgICAgIHdha2V0aW1lX2F2Zy8xZTMsCisJICAgICAgIHdha2V0aW1lX2F2ZyAvIFVTRUNfUEVSX01TRUMsCiAJICAgICAgIHJlbF9zdGRkZXZfc3RhdHMod2FrZXRpbWVfc3RkZGV2LCB3YWtldGltZV9hdmcpKTsKIH0KIApAQCAtMTgyLDcgKzE4Myw3IEBACiAKIAkJaWYgKCFzaWxlbnQpIHsKIAkJCXByaW50ZigiW1J1biAlZF06IFdva2V1cCAlZCBvZiAlZCB0aHJlYWRzIGluICUuNGYgbXNcbiIsCi0JCQkgICAgICAgaiArIDEsIG53b2tlbiwgbnRocmVhZHMsIHJ1bnRpbWUudHZfdXNlYy8xZTMpOworCQkJICAgICAgIGogKyAxLCBud29rZW4sIG50aHJlYWRzLCBydW50aW1lLnR2X3VzZWMgLyAoZG91YmxlKVVTRUNfUEVSX01TRUMpOwogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvbWVtLWZ1bmN0aW9ucy5jIGIvdG9vbHMvcGVyZi9iZW5jaC9tZW0tZnVuY3Rpb25zLmMKaW5kZXggMmI1NGQwZi4uYzY4NDkxMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9tZW0tZnVuY3Rpb25zLmMKKysrIGIvdG9vbHMvcGVyZi9iZW5jaC9tZW0tZnVuY3Rpb25zLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNkZWZpbmUgSyAxMDI0CiAKQEAgLTg5LDcgKzkwLDcgQEAKIAogc3RhdGljIGRvdWJsZSB0aW1ldmFsMmRvdWJsZShzdHJ1Y3QgdGltZXZhbCAqdHMpCiB7Ci0JcmV0dXJuIChkb3VibGUpdHMtPnR2X3NlYyArIChkb3VibGUpdHMtPnR2X3VzZWMgLyAoZG91YmxlKTEwMDAwMDA7CisJcmV0dXJuIChkb3VibGUpdHMtPnR2X3NlYyArIChkb3VibGUpdHMtPnR2X3VzZWMgLyAoZG91YmxlKVVTRUNfUEVSX1NFQzsKIH0KIAogI2RlZmluZSBwcmludF9icHMoeCkgZG8gewkJCQkJCVwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvbnVtYS5jIGIvdG9vbHMvcGVyZi9iZW5jaC9udW1hLmMKaW5kZXggZjdmNTMwMC4uOGVmZTkwNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9udW1hLmMKKysrIGIvdG9vbHMvcGVyZi9iZW5jaC9udW1hLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogCiAjaW5jbHVkZSA8bnVtYS5oPgogI2luY2x1ZGUgPG51bWFpZi5oPgpAQCAtMTAwNCw3ICsxMDA1LDcgQEAKIAlpZiAoc3Ryb25nICYmIHByb2Nlc3NfZ3JvdXBzID09IGctPnAubnJfcHJvYykgewogCQlpZiAoISpjb252ZXJnZW5jZSkgewogCQkJKmNvbnZlcmdlbmNlID0gcnVudGltZV9uc19tYXg7Ci0JCQl0cHJpbnRmKCIgKCU2LjFmcyBjb252ZXJnZWQpXG4iLCAqY29udmVyZ2VuY2UvMWU5KTsKKwkJCXRwcmludGYoIiAoJTYuMWZzIGNvbnZlcmdlZClcbiIsICpjb252ZXJnZW5jZSAvIE5TRUNfUEVSX1NFQyk7CiAJCQlpZiAoZy0+cC5tZWFzdXJlX2NvbnZlcmdlbmNlKSB7CiAJCQkJZy0+YWxsX2NvbnZlcmdlZCA9IHRydWU7CiAJCQkJZy0+c3RvcF93b3JrID0gdHJ1ZTsKQEAgLTEwMTIsNyArMTAxMyw3IEBACiAJCX0KIAl9IGVsc2UgewogCQlpZiAoKmNvbnZlcmdlbmNlKSB7Ci0JCQl0cHJpbnRmKCIgKCU2LjFmcyBkZS1jb252ZXJnZWQpIiwgcnVudGltZV9uc19tYXgvMWU5KTsKKwkJCXRwcmludGYoIiAoJTYuMWZzIGRlLWNvbnZlcmdlZCkiLCBydW50aW1lX25zX21heCAvIE5TRUNfUEVSX1NFQyk7CiAJCQkqY29udmVyZ2VuY2UgPSAwOwogCQl9CiAJCXRwcmludGYoIlxuIik7CkBAIC0xMDIyLDcgKzEwMjMsNyBAQAogc3RhdGljIHZvaWQgc2hvd19zdW1tYXJ5KGRvdWJsZSBydW50aW1lX25zX21heCwgaW50IGwsIGRvdWJsZSAqY29udmVyZ2VuY2UpCiB7CiAJdHByaW50ZigiXHIgIyAgJTUuMWYlJSAgWyUuMWYgbWluc10iLAotCQkoZG91YmxlKShsKzEpL2ctPnAubnJfbG9vcHMqMTAwLjAsIHJ1bnRpbWVfbnNfbWF4LzFlOSAvIDYwLjApOworCQkoZG91YmxlKShsKzEpL2ctPnAubnJfbG9vcHMqMTAwLjAsIHJ1bnRpbWVfbnNfbWF4IC8gTlNFQ19QRVJfU0VDIC8gNjAuMCk7CiAKIAljYWxjX2NvbnZlcmdlbmNlKHJ1bnRpbWVfbnNfbWF4LCBjb252ZXJnZW5jZSk7CiAKQEAgLTExNzksOCArMTE4MCw4IEBACiAKIAkJaWYgKGRldGFpbHMgPj0gMykgewogCQkJdGltZXJzdWIoJnN0b3AsICZzdGFydCwgJmRpZmYpOwotCQkJcnVudGltZV9uc19tYXggPSBkaWZmLnR2X3NlYyAqIDEwMDAwMDAwMDA7Ci0JCQlydW50aW1lX25zX21heCArPSBkaWZmLnR2X3VzZWMgKiAxMDAwOworCQkJcnVudGltZV9uc19tYXggPSBkaWZmLnR2X3NlYyAqIE5TRUNfUEVSX1NFQzsKKwkJCXJ1bnRpbWVfbnNfbWF4ICs9IGRpZmYudHZfdXNlYyAqIE5TRUNfUEVSX1VTRUM7CiAKIAkJCWlmIChkZXRhaWxzID49IDApIHsKIAkJCQlwcmludGYoIiAjJTJkIC8gJTJkOiAlMTQuMmxmIG5zZWNzL29wIFt2YWw6ICUwMTYiUFJJeDY0Il1cbiIsCkBAIC0xMTkyLDIzICsxMTkzLDIzIEBACiAJCQljb250aW51ZTsKIAogCQl0aW1lcnN1Yigmc3RvcCwgJnN0YXJ0MCwgJmRpZmYpOwotCQlydW50aW1lX25zX21heCA9IGRpZmYudHZfc2VjICogMTAwMDAwMDAwMFVMTDsKLQkJcnVudGltZV9uc19tYXggKz0gZGlmZi50dl91c2VjICogMTAwMFVMTDsKKwkJcnVudGltZV9uc19tYXggPSBkaWZmLnR2X3NlYyAqIE5TRUNfUEVSX1NFQzsKKwkJcnVudGltZV9uc19tYXggKz0gZGlmZi50dl91c2VjICogTlNFQ19QRVJfVVNFQzsKIAogCQlzaG93X3N1bW1hcnkocnVudGltZV9uc19tYXgsIGwsICZjb252ZXJnZW5jZSk7CiAJfQogCiAJZ2V0dGltZW9mZGF5KCZzdG9wLCBOVUxMKTsKIAl0aW1lcnN1Yigmc3RvcCwgJnN0YXJ0MCwgJmRpZmYpOwotCXRkLT5ydW50aW1lX25zID0gZGlmZi50dl9zZWMgKiAxMDAwMDAwMDAwVUxMOwotCXRkLT5ydW50aW1lX25zICs9IGRpZmYudHZfdXNlYyAqIDEwMDBVTEw7Ci0JdGQtPnNwZWVkX2dicyA9IGJ5dGVzX2RvbmUgLyAodGQtPnJ1bnRpbWVfbnMgLyAxZTkpIC8gMWU5OworCXRkLT5ydW50aW1lX25zID0gZGlmZi50dl9zZWMgKiBOU0VDX1BFUl9TRUM7CisJdGQtPnJ1bnRpbWVfbnMgKz0gZGlmZi50dl91c2VjICogTlNFQ19QRVJfVVNFQzsKKwl0ZC0+c3BlZWRfZ2JzID0gYnl0ZXNfZG9uZSAvICh0ZC0+cnVudGltZV9ucyAvIE5TRUNfUEVSX1NFQykgLyAxZTk7CiAKIAlnZXRydXNhZ2UoUlVTQUdFX1RIUkVBRCwgJnJ1c2FnZSk7Ci0JdGQtPnN5c3RlbV90aW1lX25zID0gcnVzYWdlLnJ1X3N0aW1lLnR2X3NlYyAqIDEwMDAwMDAwMDBVTEw7Ci0JdGQtPnN5c3RlbV90aW1lX25zICs9IHJ1c2FnZS5ydV9zdGltZS50dl91c2VjICogMTAwMFVMTDsKLQl0ZC0+dXNlcl90aW1lX25zID0gcnVzYWdlLnJ1X3V0aW1lLnR2X3NlYyAqIDEwMDAwMDAwMDBVTEw7Ci0JdGQtPnVzZXJfdGltZV9ucyArPSBydXNhZ2UucnVfdXRpbWUudHZfdXNlYyAqIDEwMDBVTEw7CisJdGQtPnN5c3RlbV90aW1lX25zID0gcnVzYWdlLnJ1X3N0aW1lLnR2X3NlYyAqIE5TRUNfUEVSX1NFQzsKKwl0ZC0+c3lzdGVtX3RpbWVfbnMgKz0gcnVzYWdlLnJ1X3N0aW1lLnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDOworCXRkLT51c2VyX3RpbWVfbnMgPSBydXNhZ2UucnVfdXRpbWUudHZfc2VjICogTlNFQ19QRVJfU0VDOworCXRkLT51c2VyX3RpbWVfbnMgKz0gcnVzYWdlLnJ1X3V0aW1lLnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDOwogCiAJZnJlZV9kYXRhKHRocmVhZF9kYXRhLCBnLT5wLmJ5dGVzX3RocmVhZCk7CiAKQEAgLTE0NjksNyArMTQ3MCw3IEBACiAJfQogCS8qIFdhaXQgZm9yIGFsbCB0aGUgdGhyZWFkcyB0byBzdGFydCB1cDogKi8KIAl3aGlsZSAoZy0+bnJfdGFza3Nfc3RhcnRlZCAhPSBnLT5wLm5yX3Rhc2tzKQotCQl1c2xlZXAoMTAwMCk7CisJCXVzbGVlcChVU0VDX1BFUl9NU0VDKTsKIAogCUJVR19PTihnLT5ucl90YXNrc19zdGFydGVkICE9IGctPnAubnJfdGFza3MpOwogCkBAIC0xNDg4LDkgKzE0ODksOSBAQAogCiAJCXRpbWVyc3ViKCZzdG9wLCAmc3RhcnQsICZkaWZmKTsKIAotCQlzdGFydHVwX3NlYyA9IGRpZmYudHZfc2VjICogMTAwMDAwMDAwMC4wOwotCQlzdGFydHVwX3NlYyArPSBkaWZmLnR2X3VzZWMgKiAxMDAwLjA7Ci0JCXN0YXJ0dXBfc2VjIC89IDFlOTsKKwkJc3RhcnR1cF9zZWMgPSBkaWZmLnR2X3NlYyAqIE5TRUNfUEVSX1NFQzsKKwkJc3RhcnR1cF9zZWMgKz0gZGlmZi50dl91c2VjICogTlNFQ19QRVJfVVNFQzsKKwkJc3RhcnR1cF9zZWMgLz0gTlNFQ19QRVJfU0VDOwogCiAJCXRwcmludGYoIiB0aHJlYWRzIGluaXRpYWxpemVkIGluICUuNmYgc2Vjb25kcy5cbiIsIHN0YXJ0dXBfc2VjKTsKIAkJdHByaW50ZigiICNcbiIpOwpAQCAtMTUyOSwxNCArMTUzMCwxNCBAQAogCXRwcmludGYoIlxuICMjI1xuIik7CiAJdHByaW50ZigiXG4iKTsKIAotCXJ1bnRpbWVfc2VjX21heCA9IGRpZmYudHZfc2VjICogMTAwMDAwMDAwMC4wOwotCXJ1bnRpbWVfc2VjX21heCArPSBkaWZmLnR2X3VzZWMgKiAxMDAwLjA7Ci0JcnVudGltZV9zZWNfbWF4IC89IDFlOTsKKwlydW50aW1lX3NlY19tYXggPSBkaWZmLnR2X3NlYyAqIE5TRUNfUEVSX1NFQzsKKwlydW50aW1lX3NlY19tYXggKz0gZGlmZi50dl91c2VjICogTlNFQ19QRVJfVVNFQzsKKwlydW50aW1lX3NlY19tYXggLz0gTlNFQ19QRVJfU0VDOwogCi0JcnVudGltZV9zZWNfbWluID0gcnVudGltZV9uc19taW4vMWU5OworCXJ1bnRpbWVfc2VjX21pbiA9IHJ1bnRpbWVfbnNfbWluIC8gTlNFQ19QRVJfU0VDOwogCiAJYnl0ZXMgPSBnLT5ieXRlc19kb25lOwotCXJ1bnRpbWVfYXZnID0gKGRvdWJsZSlydW50aW1lX25zX3N1bSAvIGctPnAubnJfdGFza3MgLyAxZTk7CisJcnVudGltZV9hdmcgPSAoZG91YmxlKXJ1bnRpbWVfbnNfc3VtIC8gZy0+cC5ucl90YXNrcyAvIE5TRUNfUEVSX1NFQzsKIAogCWlmIChnLT5wLm1lYXN1cmVfY29udmVyZ2VuY2UpIHsKIAkJcHJpbnRfcmVzKG5hbWUsIHJ1bnRpbWVfc2VjX21heCwKQEAgLTE1NjIsNyArMTU2Myw3IEBACiAJcHJpbnRfcmVzKG5hbWUsIGJ5dGVzIC8gMWU5LAogCQkiR0IsIiwgImRhdGEtdG90YWwiLAkJIkdCIGRhdGEgcHJvY2Vzc2VkLCB0b3RhbCIpOwogCi0JcHJpbnRfcmVzKG5hbWUsIHJ1bnRpbWVfc2VjX21heCAqIDFlOSAvIChieXRlcyAvIGctPnAubnJfdGFza3MpLAorCXByaW50X3JlcyhuYW1lLCBydW50aW1lX3NlY19tYXggKiBOU0VDX1BFUl9TRUMgLyAoYnl0ZXMgLyBnLT5wLm5yX3Rhc2tzKSwKIAkJIm5zZWNzLCIsICJydW50aW1lL2J5dGUvdGhyZWFkIiwibnNlY3MvYnl0ZS90aHJlYWQgcnVudGltZSIpOwogCiAJcHJpbnRfcmVzKG5hbWUsIGJ5dGVzIC8gZy0+cC5ucl90YXNrcyAvIDFlOSAvIHJ1bnRpbWVfc2VjX21heCwKQEAgLTE1ODEsOSArMTU4Miw5IEBACiAJCQkJc25wcmludGYodG5hbWUsIDMyLCAicHJvY2VzcyVkOnRocmVhZCVkIiwgcCwgdCk7CiAJCQkJcHJpbnRfcmVzKHRuYW1lLCB0ZC0+c3BlZWRfZ2JzLAogCQkJCQkiR0Ivc2VjIiwJInRocmVhZC1zcGVlZCIsICJHQi9zZWMvdGhyZWFkIHNwZWVkIik7Ci0JCQkJcHJpbnRfcmVzKHRuYW1lLCB0ZC0+c3lzdGVtX3RpbWVfbnMgLyAxZTksCisJCQkJcHJpbnRfcmVzKHRuYW1lLCB0ZC0+c3lzdGVtX3RpbWVfbnMgLyBOU0VDX1BFUl9TRUMsCiAJCQkJCSJzZWNzIiwJInRocmVhZC1zeXN0ZW0tdGltZSIsICJzeXN0ZW0gQ1BVIHRpbWUvdGhyZWFkIik7Ci0JCQkJcHJpbnRfcmVzKHRuYW1lLCB0ZC0+dXNlcl90aW1lX25zIC8gMWU5LAorCQkJCXByaW50X3Jlcyh0bmFtZSwgdGQtPnVzZXJfdGltZV9ucyAvIE5TRUNfUEVSX1NFQywKIAkJCQkJInNlY3MiLAkidGhyZWFkLXVzZXItdGltZSIsICJ1c2VyIENQVSB0aW1lL3RocmVhZCIpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL3NjaGVkLW1lc3NhZ2luZy5jIGIvdG9vbHMvcGVyZi9iZW5jaC9zY2hlZC1tZXNzYWdpbmcuYwppbmRleCBiZmFmOTUwLi42YTExMWU3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2JlbmNoL3NjaGVkLW1lc3NhZ2luZy5jCisrKyBiL3Rvb2xzL3BlcmYvYmVuY2gvc2NoZWQtbWVzc2FnaW5nLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxwb2xsLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8ZXJyLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNkZWZpbmUgREFUQVNJWkUgMTAwCiAKQEAgLTMxMiwxMSArMzEzLDExIEBACiAJCSAgICAgICB0aHJlYWRfbW9kZSA/ICJ0aHJlYWRzIiA6ICJwcm9jZXNzZXMiKTsKIAkJcHJpbnRmKCIgJTE0czogJWx1LiUwM2x1IFtzZWNdXG4iLCAiVG90YWwgdGltZSIsCiAJCSAgICAgICBkaWZmLnR2X3NlYywKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoZGlmZi50dl91c2VjLzEwMDApKTsKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoZGlmZi50dl91c2VjIC8gVVNFQ19QRVJfTVNFQykpOwogCQlicmVhazsKIAljYXNlIEJFTkNIX0ZPUk1BVF9TSU1QTEU6CiAJCXByaW50ZigiJWx1LiUwM2x1XG4iLCBkaWZmLnR2X3NlYywKLQkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoZGlmZi50dl91c2VjLzEwMDApKTsKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoZGlmZi50dl91c2VjIC8gVVNFQ19QRVJfTVNFQykpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQkvKiByZWFjaGluZyBoZXJlIGlzIHNvbWV0aGluZyBkaXNhc3RlciAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9zY2hlZC1waXBlLmMgYi90b29scy9wZXJmL2JlbmNoL3NjaGVkLXBpcGUuYwppbmRleCAxZGMyZDEzLi4yMjQzZjAxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2JlbmNoL3NjaGVkLXBpcGUuYworKysgYi90b29scy9wZXJmL2JlbmNoL3NjaGVkLXBpcGUuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIApAQCAtMTUzLDI0ICsxNTQsMjQgQEAKIAkJcHJpbnRmKCIjIEV4ZWN1dGVkICVkIHBpcGUgb3BlcmF0aW9ucyBiZXR3ZWVuIHR3byAlc1xuXG4iLAogCQkJbG9vcHMsIHRocmVhZGVkID8gInRocmVhZHMiIDogInByb2Nlc3NlcyIpOwogCi0JCXJlc3VsdF91c2VjID0gZGlmZi50dl9zZWMgKiAxMDAwMDAwOworCQlyZXN1bHRfdXNlYyA9IGRpZmYudHZfc2VjICogVVNFQ19QRVJfU0VDOwogCQlyZXN1bHRfdXNlYyArPSBkaWZmLnR2X3VzZWM7CiAKIAkJcHJpbnRmKCIgJTE0czogJWx1LiUwM2x1IFtzZWNdXG5cbiIsICJUb3RhbCB0aW1lIiwKIAkJICAgICAgIGRpZmYudHZfc2VjLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChkaWZmLnR2X3VzZWMvMTAwMCkpOworCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChkaWZmLnR2X3VzZWMgLyBVU0VDX1BFUl9NU0VDKSk7CiAKIAkJcHJpbnRmKCIgJTE0bGYgdXNlY3Mvb3BcbiIsCiAJCSAgICAgICAoZG91YmxlKXJlc3VsdF91c2VjIC8gKGRvdWJsZSlsb29wcyk7CiAJCXByaW50ZigiICUxNGQgb3BzL3NlY1xuIiwKIAkJICAgICAgIChpbnQpKChkb3VibGUpbG9vcHMgLwotCQkJICAgICAoKGRvdWJsZSlyZXN1bHRfdXNlYyAvIChkb3VibGUpMTAwMDAwMCkpKTsKKwkJCSAgICAgKChkb3VibGUpcmVzdWx0X3VzZWMgLyAoZG91YmxlKVVTRUNfUEVSX1NFQykpKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJFTkNIX0ZPUk1BVF9TSU1QTEU6CiAJCXByaW50ZigiJWx1LiUwM2x1XG4iLAogCQkgICAgICAgZGlmZi50dl9zZWMsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZykgKGRpZmYudHZfdXNlYyAvIDEwMDApKTsKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoZGlmZi50dl91c2VjIC8gVVNFQ19QRVJfTVNFQykpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1hbm5vdGF0ZS5jCmluZGV4IDljMTAzNGQuLmViYjYyODMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1hbm5vdGF0ZS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1hbm5vdGF0ZS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAidXRpbC90b29sLmgiCiAjaW5jbHVkZSAidXRpbC9kYXRhLmgiCiAjaW5jbHVkZSAiYXJjaC9jb21tb24uaCIKKyNpbmNsdWRlICJ1dGlsL2Jsb2NrLXJhbmdlLmgiCiAKICNpbmNsdWRlIDxkbGZjbi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgpAQCAtNDYsNiArNDcsMTAzIEBACiAJREVDTEFSRV9CSVRNQVAoY3B1X2JpdG1hcCwgTUFYX05SX0NQVVMpOwogfTsKIAorLyoKKyAqIEdpdmVuIG9uZSBiYXNpYyBibG9jazoKKyAqCisgKglmcm9tCXRvCQlicmFuY2hfaQorICoJKiAtLS0tPiAqCisgKgkJfAorICoJCXwgYmxvY2sKKyAqCQl2CisgKgkJKiAtLS0tPiAqCisgKgkJZnJvbQl0bwlicmFuY2hfaSsxCisgKgorICogd2hlcmUgdGhlIGhvcml6b250YWwgYXJlIHRoZSBicmFuY2hlcyBhbmQgdGhlIHZlcnRpY2FsIGlzIHRoZSBleGVjdXRlZAorICogYmxvY2sgb2YgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIFdlIGNvdW50LCBmb3IgZWFjaCAnaW5zdHJ1Y3Rpb24nLCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGNvdmVyZWQgaXQgYXMKKyAqIHdlbGwgYXMgY291bnQgdGhlIHJhdGlvIGVhY2ggYnJhbmNoIGlzIHRha2VuLgorICoKKyAqIFdlIGNhbiBkbyB0aGlzIHdpdGhvdXQga25vd2luZyB0aGUgYWN0dWFsIGluc3RydWN0aW9uIHN0cmVhbSBieSBrZWVwaW5nCisgKiB0cmFjayBvZiB0aGUgYWRkcmVzcyByYW5nZXMuIFdlIGJyZWFrIGRvd24gcmFuZ2VzIHN1Y2ggdGhhdCB0aGVyZSBpcyBubworICogb3ZlcmxhcCBhbmQgaXRlcmF0ZSBmcm9tIHRoZSBzdGFydCB1bnRpbCB0aGUgZW5kLgorICoKKyAqIEBhY21lOiBvbmNlIHdlIHBhcnNlIHRoZSBvYmpkdW1wIG91dHB1dCBfYmVmb3JlXyBwcm9jZXNzaW5nIHRoZSBzYW1wbGVzLAorICogd2UgY2FuIGVhc2lseSBmb2xkIHRoZSBicmFuY2guY3ljbGVzIElQQyBiaXRzIGluLgorICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX2Jhc2ljX2Jsb2NrKHN0cnVjdCBhZGRyX21hcF9zeW1ib2wgKnN0YXJ0LAorCQkJCXN0cnVjdCBhZGRyX21hcF9zeW1ib2wgKmVuZCwKKwkJCQlzdHJ1Y3QgYnJhbmNoX2ZsYWdzICpmbGFncykKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzdGFydC0+c3ltOworCXN0cnVjdCBhbm5vdGF0aW9uICpub3RlcyA9IHN5bSA/IHN5bWJvbF9fYW5ub3RhdGlvbihzeW0pIDogTlVMTDsKKwlzdHJ1Y3QgYmxvY2tfcmFuZ2VfaXRlciBpdGVyOworCXN0cnVjdCBibG9ja19yYW5nZSAqZW50cnk7CisKKwkvKgorCSAqIFNhbml0eTsgTlVMTCBpc24ndCBleGVjdXRhYmxlIGFuZCB0aGUgQ1BVIGNhbm5vdCBleGVjdXRlIGJhY2t3YXJkcworCSAqLworCWlmICghc3RhcnQtPmFkZHIgfHwgc3RhcnQtPmFkZHIgPiBlbmQtPmFkZHIpCisJCXJldHVybjsKKworCWl0ZXIgPSBibG9ja19yYW5nZV9fY3JlYXRlKHN0YXJ0LT5hZGRyLCBlbmQtPmFkZHIpOworCWlmICghYmxvY2tfcmFuZ2VfaXRlcl9fdmFsaWQoJml0ZXIpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEZpcnN0IGJsb2NrIGluIHJhbmdlIGlzIGEgYnJhbmNoIHRhcmdldC4KKwkgKi8KKwllbnRyeSA9IGJsb2NrX3JhbmdlX2l0ZXIoJml0ZXIpOworCWFzc2VydChlbnRyeS0+aXNfdGFyZ2V0KTsKKwllbnRyeS0+ZW50cnkrKzsKKworCWRvIHsKKwkJZW50cnkgPSBibG9ja19yYW5nZV9pdGVyKCZpdGVyKTsKKworCQllbnRyeS0+Y292ZXJhZ2UrKzsKKwkJZW50cnktPnN5bSA9IHN5bTsKKworCQlpZiAobm90ZXMpCisJCQlub3Rlcy0+bWF4X2NvdmVyYWdlID0gbWF4KG5vdGVzLT5tYXhfY292ZXJhZ2UsIGVudHJ5LT5jb3ZlcmFnZSk7CisKKwl9IHdoaWxlIChibG9ja19yYW5nZV9pdGVyX19uZXh0KCZpdGVyKSk7CisKKwkvKgorCSAqIExhc3QgYmxvY2sgaW4gcmFnZSBpcyBhIGJyYW5jaC4KKwkgKi8KKwllbnRyeSA9IGJsb2NrX3JhbmdlX2l0ZXIoJml0ZXIpOworCWFzc2VydChlbnRyeS0+aXNfYnJhbmNoKTsKKwllbnRyeS0+dGFrZW4rKzsKKwlpZiAoZmxhZ3MtPnByZWRpY3RlZCkKKwkJZW50cnktPnByZWQrKzsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19icmFuY2hfc3RhY2soc3RydWN0IGJyYW5jaF9zdGFjayAqYnMsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKKwkJCQkgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUpCit7CisJc3RydWN0IGFkZHJfbWFwX3N5bWJvbCAqcHJldiA9IE5VTEw7CisJc3RydWN0IGJyYW5jaF9pbmZvICpiaTsKKwlpbnQgaTsKKworCWlmICghYnMgfHwgIWJzLT5ucikKKwkJcmV0dXJuOworCisJYmkgPSBzYW1wbGVfX3Jlc29sdmVfYnN0YWNrKHNhbXBsZSwgYWwpOworCWlmICghYmkpCisJCXJldHVybjsKKworCWZvciAoaSA9IGJzLT5uciAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCS8qCisJCSAqIFhYWCBmaWx0ZXIgYWdhaW5zdCBzeW1ib2wKKwkJICovCisJCWlmIChwcmV2KQorCQkJcHJvY2Vzc19iYXNpY19ibG9jayhwcmV2LCAmYmlbaV0uZnJvbSwgJmJpW2ldLmZsYWdzKTsKKwkJcHJldiA9ICZiaVtpXS50bzsKKwl9CisKKwlmcmVlKGJpKTsKK30KKwogc3RhdGljIGludCBwZXJmX2V2c2VsX19hZGRfc2FtcGxlKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKIAkJCQkgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCSAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLApAQCAtNzIsNiArMTcwLDEyIEBACiAJCXJldHVybiAwOwogCX0KIAorCS8qCisJICogWFhYIGZpbHRlcmVkIHNhbXBsZXMgY2FuIHN0aWxsIGhhdmUgYnJhbmNoIGVudGlyZXMgcG9pbnRpbmcgaW50byBvdXIKKwkgKiBzeW1ib2wgYW5kIGFyZSBtaXNzZWQuCisJICovCisJcHJvY2Vzc19icmFuY2hfc3RhY2soc2FtcGxlLT5icmFuY2hfc3RhY2ssIGFsLCBzYW1wbGUpOworCiAJc2FtcGxlLT5wZXJpb2QgPSAxOwogCXNhbXBsZS0+d2VpZ2h0ID0gMTsKIApAQCAtMjA0LDggKzMwOCw2IEBACiAJc3RydWN0IHBlcmZfZXZzZWwgKnBvczsKIAl1NjQgdG90YWxfbnJfc2FtcGxlczsKIAotCW1hY2hpbmVzX19zZXRfc3ltYm9sX2ZpbHRlcigmc2Vzc2lvbi0+bWFjaGluZXMsIHN5bWJvbF9fYW5ub3RhdGVfaW5pdCk7Ci0KIAlpZiAoYW5uLT5jcHVfbGlzdCkgewogCQlyZXQgPSBwZXJmX3Nlc3Npb25fX2NwdV9iaXRtYXAoc2Vzc2lvbiwgYW5uLT5jcHVfbGlzdCwKIAkJCQkJICAgICAgIGFubi0+Y3B1X2JpdG1hcCk7CkBAIC0zNjcsNyArNDY5LDEwIEBACiAJaWYgKGFubm90YXRlLnNlc3Npb24gPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCi0Jc3ltYm9sX2NvbmYucHJpdl9zaXplID0gc2l6ZW9mKHN0cnVjdCBhbm5vdGF0aW9uKTsKKwlyZXQgPSBzeW1ib2xfX2Fubm90YXRpb25faW5pdCgpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9kZWxldGU7CisKIAlzeW1ib2xfY29uZi50cnlfdm1saW51eF9wYXRoID0gdHJ1ZTsKIAogCXJldCA9IHN5bWJvbF9faW5pdCgmYW5ub3RhdGUuc2Vzc2lvbi0+aGVhZGVyLmVudik7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tZGlmZi5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYwppbmRleCAyMWVlNzUzLi45ZmYwZGI0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tZGlmZi5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1kaWZmLmMKQEAgLTEwMzMsNyArMTAzMyw5IEBACiB9CiAKIHN0YXRpYyBpbnQgaHBwX19oZWFkZXIoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKLQkJICAgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMgX19tYXliZV91bnVzZWQpCisJCSAgICAgICBzdHJ1Y3QgaGlzdHMgKmhpc3RzIF9fbWF5YmVfdW51c2VkLAorCQkgICAgICAgaW50IGxpbmUgX19tYXliZV91bnVzZWQsCisJCSAgICAgICBpbnQgKnNwYW4gX19tYXliZV91bnVzZWQpCiB7CiAJc3RydWN0IGRpZmZfaHBwX2ZtdCAqZGZtdCA9CiAJCWNvbnRhaW5lcl9vZihmbXQsIHN0cnVjdCBkaWZmX2hwcF9mbXQsIGZtdCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4taW5qZWN0LmMgYi90b29scy9wZXJmL2J1aWx0aW4taW5qZWN0LmMKaW5kZXggNzNjMWM0Yy4uYjliYzdlMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWluamVjdC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1pbmplY3QuYwpAQCAtNDI5LDcgKzQyOSw3IEBACiAJaWYgKGFsLm1hcCAhPSBOVUxMKSB7CiAJCWlmICghYWwubWFwLT5kc28tPmhpdCkgewogCQkJYWwubWFwLT5kc28tPmhpdCA9IDE7Ci0JCQlpZiAobWFwX19sb2FkKGFsLm1hcCwgTlVMTCkgPj0gMCkgeworCQkJaWYgKG1hcF9fbG9hZChhbC5tYXApID49IDApIHsKIAkJCQlkc29fX2luamVjdF9idWlsZF9pZChhbC5tYXAtPmRzbywgdG9vbCwgbWFjaGluZSk7CiAJCQkJLyoKIAkJCQkgKiBJZiB0aGlzIGZhaWxzLCB0b28gYmFkLCBsZXQgdGhlIG90aGVyIHNpZGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rbWVtLmMgYi90b29scy9wZXJmL2J1aWx0aW4ta21lbS5jCmluZGV4IGZkZGUxYmQuLmQ0MjZkY2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rbWVtLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWttZW0uYwpAQCAtMzMwLDcgKzMzMCw3IEBACiAJfQogCiAJa2VybmVsX21hcCA9IG1hY2hpbmVfX2tlcm5lbF9tYXAobWFjaGluZSk7Ci0JaWYgKG1hcF9fbG9hZChrZXJuZWxfbWFwLCBOVUxMKSA8IDApIHsKKwlpZiAobWFwX19sb2FkKGtlcm5lbF9tYXApIDwgMCkgewogCQlwcl9lcnIoImNhbm5vdCBsb2FkIGtlcm5lbCBtYXBcbiIpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CkBAIC05NzksNyArOTc5LDcgQEAKIAkJaWYgKGlzX2NhbGxlcikgewogCQkJYWRkciA9IGRhdGEtPmNhbGxfc2l0ZTsKIAkJCWlmICghcmF3X2lwKQotCQkJCXN5bSA9IG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKG1hY2hpbmUsIGFkZHIsICZtYXAsIE5VTEwpOworCQkJCXN5bSA9IG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKG1hY2hpbmUsIGFkZHIsICZtYXApOwogCQl9IGVsc2UKIAkJCWFkZHIgPSBkYXRhLT5wdHI7CiAKQEAgLTEwNDMsOCArMTA0Myw3IEBACiAJCWNoYXIgKmNhbGxlciA9IGJ1ZjsKIAogCQlkYXRhID0gcmJfZW50cnkobmV4dCwgc3RydWN0IHBhZ2Vfc3RhdCwgbm9kZSk7Ci0JCXN5bSA9IG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKG1hY2hpbmUsIGRhdGEtPmNhbGxzaXRlLAotCQkJCQkJICAgICZtYXAsIE5VTEwpOworCQlzeW0gPSBtYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbihtYWNoaW5lLCBkYXRhLT5jYWxsc2l0ZSwgJm1hcCk7CiAJCWlmIChzeW0gJiYgc3ltLT5uYW1lKQogCQkJY2FsbGVyID0gc3ltLT5uYW1lOwogCQllbHNlCkBAIC0xMDg2LDggKzEwODUsNyBAQAogCQljaGFyICpjYWxsZXIgPSBidWY7CiAKIAkJZGF0YSA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBwYWdlX3N0YXQsIG5vZGUpOwotCQlzeW0gPSBtYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbihtYWNoaW5lLCBkYXRhLT5jYWxsc2l0ZSwKLQkJCQkJCSAgICAmbWFwLCBOVUxMKTsKKwkJc3ltID0gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb24obWFjaGluZSwgZGF0YS0+Y2FsbHNpdGUsICZtYXApOwogCQlpZiAoc3ltICYmIHN5bS0+bmFtZSkKIAkJCWNhbGxlciA9IHN5bS0+bmFtZTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWt2bS5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWt2bS5jCmluZGV4IDVlMjEyN2UuLjA4ZmE4OGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rdm0uYworKysgYi90b29scy9wZXJmL2J1aWx0aW4ta3ZtLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxzeXMvdGltZXJmZC5oPgogI2VuZGlmCiAKKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+CiAjaW5jbHVkZSA8c2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgpAQCAtMzYyLDcgKzM2Myw3IEBACiAJCWlmICghc2tpcF9ldmVudChkZWNvZGUpKSB7CiAJCQlwcl9pbmZvKCIlIiBQUkl1NjQgIiBWTSAlZCwgdmNwdSAlZDogJXMgZXZlbnQgdG9vayAlIiBQUkl1NjQgInVzZWNcbiIsCiAJCQkJIHNhbXBsZS0+dGltZSwgc2FtcGxlLT5waWQsIHZjcHVfcmVjb3JkLT52Y3B1X2lkLAotCQkJCSBkZWNvZGUsIHRpbWVfZGlmZi8xMDAwKTsKKwkJCQkgZGVjb2RlLCB0aW1lX2RpZmYgLyBOU0VDX1BFUl9VU0VDKTsKIAkJfQogCX0KIApAQCAtNjA4LDE1ICs2MDksMTUgQEAKIAkJcHJfaW5mbygiJTEwbGx1ICIsICh1bnNpZ25lZCBsb25nIGxvbmcpZWNvdW50KTsKIAkJcHJfaW5mbygiJTguMmYlJSAiLCAoZG91YmxlKWVjb3VudCAvIGt2bS0+dG90YWxfY291bnQgKiAxMDApOwogCQlwcl9pbmZvKCIlOC4yZiUlICIsIChkb3VibGUpZXRpbWUgLyBrdm0tPnRvdGFsX3RpbWUgKiAxMDApOwotCQlwcl9pbmZvKCIlOS4yZnVzICIsIChkb3VibGUpbWluIC8gMWUzKTsKLQkJcHJfaW5mbygiJTkuMmZ1cyAiLCAoZG91YmxlKW1heCAvIDFlMyk7Ci0JCXByX2luZm8oIiU5LjJmdXMgKCArLSU3LjJmJSUgKSIsIChkb3VibGUpZXRpbWUgLyBlY291bnQvMWUzLAorCQlwcl9pbmZvKCIlOS4yZnVzICIsIChkb3VibGUpbWluIC8gTlNFQ19QRVJfVVNFQyk7CisJCXByX2luZm8oIiU5LjJmdXMgIiwgKGRvdWJsZSltYXggLyBOU0VDX1BFUl9VU0VDKTsKKwkJcHJfaW5mbygiJTkuMmZ1cyAoICstJTcuMmYlJSApIiwgKGRvdWJsZSlldGltZSAvIGVjb3VudCAvIE5TRUNfUEVSX1VTRUMsCiAJCQlrdm1fZXZlbnRfcmVsX3N0ZGRldih2Y3B1LCBldmVudCkpOwogCQlwcl9pbmZvKCJcbiIpOwogCX0KIAogCXByX2luZm8oIlxuVG90YWwgU2FtcGxlczolIiBQUkl1NjQgIiwgVG90YWwgZXZlbnRzIGhhbmRsZWQgdGltZTolLjJmdXMuXG5cbiIsCi0JCWt2bS0+dG90YWxfY291bnQsIGt2bS0+dG90YWxfdGltZSAvIDFlMyk7CisJCWt2bS0+dG90YWxfY291bnQsIGt2bS0+dG90YWxfdGltZSAvIChkb3VibGUpTlNFQ19QRVJfVVNFQyk7CiAKIAlpZiAoa3ZtLT5sb3N0X2V2ZW50cykKIAkJcHJfaW5mbygiXG5Mb3N0IGV2ZW50czogJSIgUFJJdTY0ICJcblxuIiwga3ZtLT5sb3N0X2V2ZW50cyk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jCmluZGV4IGVlNWI0MjEuLmY4Nzk5NmIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1wcm9iZS5jCkBAIC0zMjYsNiArMzI2LDExIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X2NsZWFudXA7CiAKKwlpZiAocGFyYW1zLmNvbW1hbmQgPT0gJ0QnKSB7CS8qIGl0IHNob3dzIGRlZmluaXRpb24gKi8KKwkJcmV0ID0gc2hvd19wcm9iZV90cmFjZV9ldmVudHMocGV2cywgbnBldnMpOworCQlnb3RvIG91dF9jbGVhbnVwOworCX0KKwogCXJldCA9IGFwcGx5X3BlcmZfcHJvYmVfZXZlbnRzKHBldnMsIG5wZXZzKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfY2xlYW51cDsKQEAgLTQ1NCw2ICs0NTksMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgSEFWRV9EV0FSRl9TVVBQT1JUCisjZGVmaW5lIFBST0JFREVGX1NUUglcCisJIltFVkVOVD1dRlVOQ1tAU1JDXVsrT0ZGfCVyZXR1cm58OlJMfDtQVF18U1JDOkFMfFNSQztQVCBbW05BTUU9XUFSRyAuLi5dIgorI2Vsc2UKKyNkZWZpbmUgUFJPQkVERUZfU1RSCSJbRVZFTlQ9XUZVTkNbK09GRnwlcmV0dXJuXSBbW05BTUU9XUFSRyAuLi5dIgorI2VuZGlmCisKKwogc3RhdGljIGludAogX19jbWRfcHJvYmUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXggX19tYXliZV91bnVzZWQpCiB7CkBAIC00NzksMTMgKzQ5Miw3IEBACiAJCQkgICAgIG9wdF9zZXRfZmlsdGVyX3dpdGhfY29tbWFuZCwgREVGQVVMVF9MSVNUX0ZJTFRFUiksCiAJT1BUX0NBTExCQUNLKCdkJywgImRlbCIsIE5VTEwsICJbR1JPVVA6XUVWRU5UIiwgImRlbGV0ZSBhIHByb2JlIGV2ZW50LiIsCiAJCSAgICAgb3B0X3NldF9maWx0ZXJfd2l0aF9jb21tYW5kKSwKLQlPUFRfQ0FMTEJBQ0soJ2EnLCAiYWRkIiwgTlVMTCwKLSNpZmRlZiBIQVZFX0RXQVJGX1NVUFBPUlQKLQkJIltFVkVOVD1dRlVOQ1tAU1JDXVsrT0ZGfCVyZXR1cm58OlJMfDtQVF18U1JDOkFMfFNSQztQVCIKLQkJIiBbW05BTUU9XUFSRyAuLi5dIiwKLSNlbHNlCi0JCSJbRVZFTlQ9XUZVTkNbK09GRnwlcmV0dXJuXSBbW05BTUU9XUFSRyAuLi5dIiwKLSNlbmRpZgorCU9QVF9DQUxMQkFDSygnYScsICJhZGQiLCBOVUxMLCBQUk9CRURFRl9TVFIsCiAJCSJwcm9iZSBwb2ludCBkZWZpbml0aW9uLCB3aGVyZVxuIgogCQkiXHRcdEdST1VQOlx0R3JvdXAgbmFtZSAob3B0aW9uYWwpXG4iCiAJCSJcdFx0RVZFTlQ6XHRFdmVudCBuYW1lXG4iCkBAIC01MDMsNiArNTEwLDkgQEAKIAkJIlx0XHRBUkc6XHRQcm9iZSBhcmd1bWVudCAoa3Byb2JlLXRyYWNlciBhcmd1bWVudCBmb3JtYXQuKVxuIiwKICNlbmRpZgogCQlvcHRfYWRkX3Byb2JlX2V2ZW50KSwKKwlPUFRfQ0FMTEJBQ0soJ0QnLCAiZGVmaW5pdGlvbiIsIE5VTEwsIFBST0JFREVGX1NUUiwKKwkJIlNob3cgdHJhY2UgZXZlbnQgZGVmaW5pdGlvbiBvZiBnaXZlbiB0cmFjZWV2ZW50IGZvciBrL3Vwcm9iZV9ldmVudHMuIiwKKwkJb3B0X2FkZF9wcm9iZV9ldmVudCksCiAJT1BUX0JPT0xFQU4oJ2YnLCAiZm9yY2UiLCAmcHJvYmVfY29uZi5mb3JjZV9hZGQsICJmb3JjaWJseSBhZGQgZXZlbnRzIgogCQkgICAgIiB3aXRoIGV4aXN0aW5nIG5hbWUiKSwKIAlPUFRfQ0FMTEJBQ0soJ0wnLCAibGluZSIsIE5VTEwsCkBAIC01NDgsNiArNTU4LDcgQEAKIAogCXNldF9vcHRpb25fZmxhZyhvcHRpb25zLCAnYScsICJhZGQiLCBQQVJTRV9PUFRfRVhDTFVTSVZFKTsKIAlzZXRfb3B0aW9uX2ZsYWcob3B0aW9ucywgJ2QnLCAiZGVsIiwgUEFSU0VfT1BUX0VYQ0xVU0lWRSk7CisJc2V0X29wdGlvbl9mbGFnKG9wdGlvbnMsICdEJywgImRlZmluaXRpb24iLCBQQVJTRV9PUFRfRVhDTFVTSVZFKTsKIAlzZXRfb3B0aW9uX2ZsYWcob3B0aW9ucywgJ2wnLCAibGlzdCIsIFBBUlNFX09QVF9FWENMVVNJVkUpOwogI2lmZGVmIEhBVkVfRFdBUkZfU1VQUE9SVAogCXNldF9vcHRpb25fZmxhZyhvcHRpb25zLCAnTCcsICJsaW5lIiwgUEFSU0VfT1BUX0VYQ0xVU0lWRSk7CkBAIC02MDAsNiArNjExLDE0IEBACiAJICovCiAJc3ltYm9sX2NvbmYudHJ5X3ZtbGludXhfcGF0aCA9IChzeW1ib2xfY29uZi52bWxpbnV4X25hbWUgPT0gTlVMTCk7CiAKKwkvKgorCSAqIEV4Y2VwdCBmb3IgLS1saXN0LCAtLWRlbCBhbmQgLS1hZGQsIG90aGVyIGNvbW1hbmQgZG9lc24ndCBkZXBlbmQKKwkgKiBub3IgY2hhbmdlIHJ1bm5pbmcga2VybmVsLiBTbyBpZiB1c2VyIGdpdmVzIG9mZmxpbmUgdm1saW51eCwKKwkgKiBpZ25vcmUgaXRzIGJ1aWxkaWQuCisJICovCisJaWYgKCFzdHJjaHIoImxkYSIsIHBhcmFtcy5jb21tYW5kKSAmJiBzeW1ib2xfY29uZi52bWxpbnV4X25hbWUpCisJCXN5bWJvbF9jb25mLmlnbm9yZV92bWxpbnV4X2J1aWxkaWQgPSB0cnVlOworCiAJc3dpdGNoIChwYXJhbXMuY29tbWFuZCkgewogCWNhc2UgJ2wnOgogCQlpZiAocGFyYW1zLnVwcm9iZXMpIHsKQEAgLTY0Myw3ICs2NjIsOSBAQAogCQkJcmV0dXJuIHJldDsKIAkJfQogCQlicmVhazsKKwljYXNlICdEJzoKIAljYXNlICdhJzoKKwogCQkvKiBFbnN1cmUgdGhlIGxhc3QgZ2l2ZW4gdGFyZ2V0IGlzIHVzZWQgKi8KIAkJaWYgKHBhcmFtcy50YXJnZXQgJiYgIXBhcmFtcy50YXJnZXRfdXNlZCkgewogCQkJcHJfZXJyKCIgIEVycm9yOiAteC8tbSBtdXN0IGZvbGxvdyB0aGUgcHJvYmUgZGVmaW5pdGlvbnMuXG4iKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYwppbmRleCA2MzU1OTAyLi42N2QyYTkwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAidXRpbC9ldmxpc3QuaCIKICNpbmNsdWRlICJ1dGlsL2V2c2VsLmgiCiAjaW5jbHVkZSAidXRpbC9kZWJ1Zy5oIgorI2luY2x1ZGUgInV0aWwvZHJ2X2NvbmZpZ3MuaCIKICNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKICNpbmNsdWRlICJ1dGlsL3Rvb2wuaCIKICNpbmNsdWRlICJ1dGlsL3N5bWJvbC5oIgpAQCAtNDIsNyArNDMsNyBAQAogI2luY2x1ZGUgPHNjaGVkLmg+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+YWxsX2NvdW50KTsKIAogCXByaW50ZigiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYwppbmRleCBjODU5ZTU5Li43MjI4ZDE0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc2NyaXB0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXNjcmlwdC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAidXRpbC90aHJlYWQtc3RhY2suaCIKICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KICNpbmNsdWRlICJhc20vYnVnLmgiCiAjaW5jbHVkZSAidXRpbC9tZW0tZXZlbnRzLmgiCiAKQEAgLTQ2NCw5ICs0NjUsOSBAQAogCiAJaWYgKFBSSU5UX0ZJRUxEKFRJTUUpKSB7CiAJCW5zZWNzID0gc2FtcGxlLT50aW1lOwotCQlzZWNzID0gbnNlY3MgLyBOU0VDU19QRVJfU0VDOwotCQluc2VjcyAtPSBzZWNzICogTlNFQ1NfUEVSX1NFQzsKLQkJdXNlY3MgPSBuc2VjcyAvIE5TRUNTX1BFUl9VU0VDOworCQlzZWNzID0gbnNlY3MgLyBOU0VDX1BFUl9TRUM7CisJCW5zZWNzIC09IHNlY3MgKiBOU0VDX1BFUl9TRUM7CisJCXVzZWNzID0gbnNlY3MgLyBOU0VDX1BFUl9VU0VDOwogCQlpZiAobmFub3NlY3MpCiAJCQlwcmludGYoIiU1bHUuJTA5bGx1OiAiLCBzZWNzLCBuc2Vjcyk7CiAJCWVsc2UKQEAgLTUyMSwxMSArNTIyLDExIEBACiAKIAkJdGhyZWFkX19maW5kX2FkZHJfbWFwKHRocmVhZCwgc2FtcGxlLT5jcHVtb2RlLCBNQVBfX0ZVTkNUSU9OLCBmcm9tLCAmYWxmKTsKIAkJaWYgKGFsZi5tYXApCi0JCQlhbGYuc3ltID0gbWFwX19maW5kX3N5bWJvbChhbGYubWFwLCBhbGYuYWRkciwgTlVMTCk7CisJCQlhbGYuc3ltID0gbWFwX19maW5kX3N5bWJvbChhbGYubWFwLCBhbGYuYWRkcik7CiAKIAkJdGhyZWFkX19maW5kX2FkZHJfbWFwKHRocmVhZCwgc2FtcGxlLT5jcHVtb2RlLCBNQVBfX0ZVTkNUSU9OLCB0bywgJmFsdCk7CiAJCWlmIChhbHQubWFwKQotCQkJYWx0LnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYWx0Lm1hcCwgYWx0LmFkZHIsIE5VTEwpOworCQkJYWx0LnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYWx0Lm1hcCwgYWx0LmFkZHIpOwogCiAJCXN5bWJvbF9fZnByaW50Zl9zeW1uYW1lX29mZnMoYWxmLnN5bSwgJmFsZiwgc3Rkb3V0KTsKIAkJcHV0Y2hhcignLycpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKaW5kZXggM2M3NDUyYi4uNjg4ZGVhNyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSAidXRpbC9ldmxpc3QuaCIKICNpbmNsdWRlICJ1dGlsL2V2c2VsLmgiCiAjaW5jbHVkZSAidXRpbC9kZWJ1Zy5oIgorI2luY2x1ZGUgInV0aWwvZHJ2X2NvbmZpZ3MuaCIKICNpbmNsdWRlICJ1dGlsL2NvbG9yLmgiCiAjaW5jbHVkZSAidXRpbC9zdGF0LmgiCiAjaW5jbHVkZSAidXRpbC9oZWFkZXIuaCIKQEAgLTY1LDYgKzY2LDcgQEAKICNpbmNsdWRlICJ1dGlsL2dyb3VwLmgiCiAjaW5jbHVkZSAiYXNtL2J1Zy5oIgogCisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAjaW5jbHVkZSA8YXBpL2ZzL2ZzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CkBAIC0xNzIsNyArMTc0LDcgQEAKIHsKIAlyLT50dl9zZWMgPSBhLT50dl9zZWMgLSBiLT50dl9zZWM7CiAJaWYgKGEtPnR2X25zZWMgPCBiLT50dl9uc2VjKSB7Ci0JCXItPnR2X25zZWMgPSBhLT50dl9uc2VjICsgMTAwMDAwMDAwMEwgLSBiLT50dl9uc2VjOworCQlyLT50dl9uc2VjID0gYS0+dHZfbnNlYyArIE5TRUNfUEVSX1NFQyAtIGItPnR2X25zZWM7CiAJCXItPnR2X3NlYy0tOwogCX0gZWxzZSB7CiAJCXItPnR2X25zZWMgPSBhLT50dl9uc2VjIC0gYi0+dHZfbnNlYyA7CkBAIC0zNTQsNyArMzU2LDcgQEAKIAlkaWZmX3RpbWVzcGVjKCZycywgJnRzLCAmcmVmX3RpbWUpOwogCiAJaWYgKFNUQVRfUkVDT1JEKSB7Ci0JCWlmIChXUklURV9TVEFUX1JPVU5EX0VWRU5UKHJzLnR2X3NlYyAqIE5TRUNTX1BFUl9TRUMgKyBycy50dl9uc2VjLCBJTlRFUlZBTCkpCisJCWlmIChXUklURV9TVEFUX1JPVU5EX0VWRU5UKHJzLnR2X3NlYyAqIE5TRUNfUEVSX1NFQyArIHJzLnR2X25zZWMsIElOVEVSVkFMKSkKIAkJCXByX2VycigiZmFpbGVkIHRvIHdyaXRlIHN0YXQgcm91bmQgZXZlbnRcbiIpOwogCX0KIApAQCAtMzY0LDcgKzM2Niw3IEBACiBzdGF0aWMgdm9pZCBlbmFibGVfY291bnRlcnModm9pZCkKIHsKIAlpZiAoaW5pdGlhbF9kZWxheSkKLQkJdXNsZWVwKGluaXRpYWxfZGVsYXkgKiAxMDAwKTsKKwkJdXNsZWVwKGluaXRpYWxfZGVsYXkgKiBVU0VDX1BFUl9NU0VDKTsKIAogCS8qCiAJICogV2UgbmVlZCB0byBlbmFibGUgY291bnRlcnMgb25seSBpZjoKQEAgLTUzOSwxMCArNTQxLDExIEBACiAJaW50IHN0YXR1cyA9IDA7CiAJY29uc3QgYm9vbCBmb3JrcyA9IChhcmdjID4gMCk7CiAJYm9vbCBpc19waXBlID0gU1RBVF9SRUNPUkQgPyBwZXJmX3N0YXQuZmlsZS5pc19waXBlIDogZmFsc2U7CisJc3RydWN0IHBlcmZfZXZzZWxfY29uZmlnX3Rlcm0gKmVycl90ZXJtOwogCiAJaWYgKGludGVydmFsKSB7Ci0JCXRzLnR2X3NlYyAgPSBpbnRlcnZhbCAvIDEwMDA7Ci0JCXRzLnR2X25zZWMgPSAoaW50ZXJ2YWwgJSAxMDAwKSAqIDEwMDAwMDA7CisJCXRzLnR2X3NlYyAgPSBpbnRlcnZhbCAvIFVTRUNfUEVSX01TRUM7CisJCXRzLnR2X25zZWMgPSAoaW50ZXJ2YWwgJSBVU0VDX1BFUl9NU0VDKSAqIE5TRUNfUEVSX01TRUM7CiAJfSBlbHNlIHsKIAkJdHMudHZfc2VjICA9IDE7CiAJCXRzLnR2X25zZWMgPSAwOwpAQCAtNjEwLDYgKzYxMywxMyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCisJaWYgKHBlcmZfZXZsaXN0X19hcHBseV9kcnZfY29uZmlncyhldnNlbF9saXN0LCAmY291bnRlciwgJmVycl90ZXJtKSkgeworCQllcnJvcigiZmFpbGVkIHRvIHNldCBjb25maWcgXCIlc1wiIG9uIGV2ZW50ICVzIHdpdGggJWQgKCVzKVxuIiwKKwkJICAgICAgZXJyX3Rlcm0tPnZhbC5kcnZfY2ZnLCBwZXJmX2V2c2VsX19uYW1lKGNvdW50ZXIpLCBlcnJubywKKwkJICAgICAgc3RyX2Vycm9yX3IoZXJybm8sIG1zZywgc2l6ZW9mKG1zZykpKTsKKwkJcmV0dXJuIC0xOworCX0KKwogCWlmIChTVEFUX1JFQ09SRCkgewogCQlpbnQgZXJyLCBmZCA9IHBlcmZfZGF0YV9maWxlX19mZCgmcGVyZl9zdGF0LmZpbGUpOwogCkBAIC05NzEsNyArOTgxLDcgQEAKIHN0YXRpYyB2b2lkIG5zZWNfcHJpbnRvdXQoaW50IGlkLCBpbnQgbnIsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgZG91YmxlIGF2ZykKIHsKIAlGSUxFICpvdXRwdXQgPSBzdGF0X2NvbmZpZy5vdXRwdXQ7Ci0JZG91YmxlIG1zZWNzID0gYXZnIC8gMWU2OworCWRvdWJsZSBtc2VjcyA9IGF2ZyAvIE5TRUNfUEVSX01TRUM7CiAJY29uc3QgY2hhciAqZm10X3YsICpmbXRfbjsKIAljaGFyIG5hbWVbMjVdOwogCkBAIC0xNDYwLDcgKzE0NzAsNyBAQAogCWlmICghbnVsbF9ydW4pCiAJCWZwcmludGYob3V0cHV0LCAiXG4iKTsKIAlmcHJpbnRmKG91dHB1dCwgIiAlMTcuOWYgc2Vjb25kcyB0aW1lIGVsYXBzZWQiLAotCQkJYXZnX3N0YXRzKCZ3YWxsdGltZV9uc2Vjc19zdGF0cykvMWU5KTsKKwkJCWF2Z19zdGF0cygmd2FsbHRpbWVfbnNlY3Nfc3RhdHMpIC8gTlNFQ19QRVJfU0VDKTsKIAlpZiAocnVuX2NvdW50ID4gMSkgewogCQlmcHJpbnRmKG91dHB1dCwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKIAkJcHJpbnRfbm9pc2VfcGN0KHN0ZGRldl9zdGF0cygmd2FsbHRpbWVfbnNlY3Nfc3RhdHMpLApAQCAtMjE3NSw4ICsyMTg1LDggQEAKIAkJdXBkYXRlX3N0YXRzKCZ3YWxsdGltZV9uc2Vjc19zdGF0cywgc3RhdF9yb3VuZC0+dGltZSk7CiAKIAlpZiAoc3RhdF9jb25maWcuaW50ZXJ2YWwgJiYgc3RhdF9yb3VuZC0+dGltZSkgewotCQl0c2gudHZfc2VjICA9IHN0YXRfcm91bmQtPnRpbWUgLyBOU0VDU19QRVJfU0VDOwotCQl0c2gudHZfbnNlYyA9IHN0YXRfcm91bmQtPnRpbWUgJSBOU0VDU19QRVJfU0VDOworCQl0c2gudHZfc2VjICA9IHN0YXRfcm91bmQtPnRpbWUgLyBOU0VDX1BFUl9TRUM7CisJCXRzaC50dl9uc2VjID0gc3RhdF9yb3VuZC0+dGltZSAlIE5TRUNfUEVSX1NFQzsKIAkJdHMgPSAmdHNoOwogCX0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jCmluZGV4IDczM2E1NTQuLmU3ZWFhMjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJ1dGlsL2V2bGlzdC5oIgogI2luY2x1ZGUgInV0aWwvZXZzZWwuaCIKICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KICNpbmNsdWRlICJ1dGlsL3N5bWJvbC5oIgogI2luY2x1ZGUgInV0aWwvY2FsbGNoYWluLmgiCiAjaW5jbHVkZSAidXRpbC9zdHJsaXN0LmgiCkBAIC0xMjg4LDkgKzEyODksOSBAQAogCQkJaWYgKGMtPmNvbW0pIHsKIAkJCQljaGFyIGNvbW1bMjU2XTsKIAkJCQlpZiAoYy0+dG90YWxfdGltZSA+IDUwMDAwMDAwMDApIC8qIDUgc2Vjb25kcyAqLwotCQkJCQlzcHJpbnRmKGNvbW0sICIlczolaSAoJTIuMmZzKSIsIGMtPmNvbW0sIHAtPnBpZCwgYy0+dG90YWxfdGltZSAvIDEwMDAwMDAwMDAuMCk7CisJCQkJCXNwcmludGYoY29tbSwgIiVzOiVpICglMi4yZnMpIiwgYy0+Y29tbSwgcC0+cGlkLCBjLT50b3RhbF90aW1lIC8gKGRvdWJsZSlOU0VDX1BFUl9TRUMpOwogCQkJCWVsc2UKLQkJCQkJc3ByaW50Zihjb21tLCAiJXM6JWkgKCUzLjFmbXMpIiwgYy0+Y29tbSwgcC0+cGlkLCBjLT50b3RhbF90aW1lIC8gMTAwMDAwMC4wKTsKKwkJCQkJc3ByaW50Zihjb21tLCAiJXM6JWkgKCUzLjFmbXMpIiwgYy0+Y29tbSwgcC0+cGlkLCBjLT50b3RhbF90aW1lIC8gKGRvdWJsZSlOU0VDX1BFUl9NU0VDKTsKIAogCQkJCXN2Z190ZXh0KFksIGMtPnN0YXJ0X3RpbWUsIGNvbW0pOwogCQkJfQpAQCAtMTYzNyw3ICsxNjM4LDcgQEAKIAl3cml0ZV9zdmdfZmlsZSh0Y2hhcnQsIG91dHB1dF9uYW1lKTsKIAogCXByX2luZm8oIldyaXR0ZW4gJTIuMWYgc2Vjb25kcyBvZiB0cmFjZSB0byAlcy5cbiIsCi0JCSh0Y2hhcnQtPmxhc3RfdGltZSAtIHRjaGFydC0+Zmlyc3RfdGltZSkgLyAxMDAwMDAwMDAwLjAsIG91dHB1dF9uYW1lKTsKKwkJKHRjaGFydC0+bGFzdF90aW1lIC0gdGNoYXJ0LT5maXJzdF90aW1lKSAvIChkb3VibGUpTlNFQ19QRVJfU0VDLCBvdXRwdXRfbmFtZSk7CiBvdXRfZGVsZXRlOgogCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOwogCXJldHVybiByZXQ7CkBAIC0xOTAxLDEwICsxOTAyLDEwIEBACiAJaWYgKHNzY2FuZihhcmcsICIlIiBQUkl1NjQgIiVjcyIsIHZhbHVlLCAmdW5pdCkgPiAwKSB7CiAJCXN3aXRjaCAodW5pdCkgewogCQljYXNlICdtJzoKLQkJCSp2YWx1ZSAqPSAxMDAwMDAwOworCQkJKnZhbHVlICo9IE5TRUNfUEVSX01TRUM7CiAJCQlicmVhazsKIAkJY2FzZSAndSc6Ci0JCQkqdmFsdWUgKj0gMTAwMDsKKwkJCSp2YWx1ZSAqPSBOU0VDX1BFUl9VU0VDOwogCQkJYnJlYWs7CiAJCWNhc2UgJ24nOgogCQkJYnJlYWs7CkBAIC0xOTI4LDcgKzE5MjksNyBAQAogCQkJLm9yZGVyZWRfZXZlbnRzCSA9IHRydWUsCiAJCX0sCiAJCS5wcm9jX251bSA9IDE1LAotCQkubWluX3RpbWUgPSAxMDAwMDAwLAorCQkubWluX3RpbWUgPSBOU0VDX1BFUl9NU0VDLAogCQkubWVyZ2VfZGlzdCA9IDEwMDAsCiAJfTsKIAljb25zdCBjaGFyICpvdXRwdXRfbmFtZSA9ICJvdXRwdXQuc3ZnIjsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYwppbmRleCA0MThlZDk0Li5mZTNhZjk1IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAidXRpbC9hbm5vdGF0ZS5oIgogI2luY2x1ZGUgInV0aWwvY29uZmlnLmgiCiAjaW5jbHVkZSAidXRpbC9jb2xvci5oIgorI2luY2x1ZGUgInV0aWwvZHJ2X2NvbmZpZ3MuaCIKICNpbmNsdWRlICJ1dGlsL2V2bGlzdC5oIgogI2luY2x1ZGUgInV0aWwvZXZzZWwuaCIKICNpbmNsdWRlICJ1dGlsL21hY2hpbmUuaCIKQEAgLTY4LDYgKzY5LDcgQEAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogc3RhdGljIHZvbGF0aWxlIGludCBkb25lOwpAQCAtNjI0LDcgKzYyNiw3IEBACiAJZGlzcGxheV9zZXR1cF9zaWcoKTsKIAlwdGhyZWFkX191bmJsb2NrX3NpZ3dpbmNoKCk7CiByZXBlYXQ6Ci0JZGVsYXlfbXNlY3MgPSB0b3AtPmRlbGF5X3NlY3MgKiAxMDAwOworCWRlbGF5X21zZWNzID0gdG9wLT5kZWxheV9zZWNzICogTVNFQ19QRVJfU0VDOwogCXNldF90ZXJtX3F1aWV0X2lucHV0KCZzYXZlKTsKIAkvKiB0cmFzaCByZXR1cm4qLwogCWdldGMoc3RkaW4pOwpAQCAtNjU2LDM0ICs2NTgsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IHN5bWJvbF9maWx0ZXIoc3RydWN0IG1hcCAqbWFwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCi17Ci0JY29uc3QgY2hhciAqbmFtZSA9IHN5bS0+bmFtZTsKLQotCWlmICghX19tYXBfX2lzX2tlcm5lbChtYXApKQotCQlyZXR1cm4gMDsKLQkvKgotCSAqIHBwYzY0IHVzZXMgZnVuY3Rpb24gZGVzY3JpcHRvcnMgYW5kIGFwcGVuZHMgYSAnLicgdG8gdGhlCi0JICogc3RhcnQgb2YgZXZlcnkgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4gUmVtb3ZlIGl0LgotCSAqLwotCWlmIChuYW1lWzBdID09ICcuJykKLQkJbmFtZSsrOwotCi0JaWYgKCFzdHJjbXAobmFtZSwgIl90ZXh0IikgfHwKLQkgICAgIXN0cmNtcChuYW1lLCAiX2V0ZXh0IikgfHwKLQkgICAgIXN0cmNtcChuYW1lLCAiX3Npbml0dGV4dCIpIHx8Ci0JICAgICFzdHJuY21wKCJpbml0X21vZHVsZSIsIG5hbWUsIDExKSB8fAotCSAgICAhc3RybmNtcCgiY2xlYW51cF9tb2R1bGUiLCBuYW1lLCAxNCkgfHwKLQkgICAgc3Ryc3RyKG5hbWUsICJfdGV4dF9zdGFydCIpIHx8Ci0JICAgIHN0cnN0cihuYW1lLCAiX3RleHRfZW5kIikpCi0JCXJldHVybiAxOwotCi0JaWYgKHN5bWJvbF9faXNfaWRsZShzeW0pKQotCQlzeW0tPmlnbm9yZSA9IHRydWU7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBoaXN0X2l0ZXJfX3RvcF9jYWxsYmFjayhzdHJ1Y3QgaGlzdF9lbnRyeV9pdGVyICppdGVyLAogCQkJCSAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwgYm9vbCBzaW5nbGUsCiAJCQkJICAgdm9pZCAqYXJnKQpAQCAtNzgyLDcgKzc1Niw3IEBACiAJCX0KIAl9CiAKLQlpZiAoYWwuc3ltID09IE5VTEwgfHwgIWFsLnN5bS0+aWdub3JlKSB7CisJaWYgKGFsLnN5bSA9PSBOVUxMIHx8ICFhbC5zeW0tPmlkbGUpIHsKIAkJc3RydWN0IGhpc3RzICpoaXN0cyA9IGV2c2VsX19oaXN0cyhldnNlbCk7CiAJCXN0cnVjdCBoaXN0X2VudHJ5X2l0ZXIgaXRlciA9IHsKIAkJCS5ldnNlbAkJPSBldnNlbCwKQEAgLTk0MCw2ICs5MTQsMTAgQEAKIAogc3RhdGljIGludCBfX2NtZF90b3Aoc3RydWN0IHBlcmZfdG9wICp0b3ApCiB7CisJY2hhciBtc2dbNTEyXTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqcG9zOworCXN0cnVjdCBwZXJmX2V2c2VsX2NvbmZpZ190ZXJtICplcnJfdGVybTsKKwlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCA9IHRvcC0+ZXZsaXN0OwogCXN0cnVjdCByZWNvcmRfb3B0cyAqb3B0cyA9ICZ0b3AtPnJlY29yZF9vcHRzOwogCXB0aHJlYWRfdCB0aHJlYWQ7CiAJaW50IHJldDsKQEAgLTk0OCw4ICs5MjYsNiBAQAogCWlmICh0b3AtPnNlc3Npb24gPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCi0JbWFjaGluZXNfX3NldF9zeW1ib2xfZmlsdGVyKCZ0b3AtPnNlc3Npb24tPm1hY2hpbmVzLCBzeW1ib2xfZmlsdGVyKTsKLQogCWlmICghb2JqZHVtcF9wYXRoKSB7CiAJCXJldCA9IHBlcmZfZW52X19sb29rdXBfb2JqZHVtcCgmdG9wLT5zZXNzaW9uLT5oZWFkZXIuZW52KTsKIAkJaWYgKHJldCkKQEAgLTk3Niw2ICs5NTIsMTQgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dF9kZWxldGU7CiAKKwlyZXQgPSBwZXJmX2V2bGlzdF9fYXBwbHlfZHJ2X2NvbmZpZ3MoZXZsaXN0LCAmcG9zLCAmZXJyX3Rlcm0pOworCWlmIChyZXQpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBzZXQgY29uZmlnIFwiJXNcIiBvbiBldmVudCAlcyB3aXRoICVkICglcylcbiIsCisJCQllcnJfdGVybS0+dmFsLmRydl9jZmcsIHBlcmZfZXZzZWxfX25hbWUocG9zKSwgZXJybm8sCisJCQlzdHJfZXJyb3JfcihlcnJubywgbXNnLCBzaXplb2YobXNnKSkpOworCQlnb3RvIG91dF9kZWxldGU7CisJfQorCiAJdG9wLT5zZXNzaW9uLT5ldmxpc3QgPSB0b3AtPmV2bGlzdDsKIAlwZXJmX3Nlc3Npb25fX3NldF9pZF9oZHJfc2l6ZSh0b3AtPnNlc3Npb24pOwogCkBAIC0xMzIzLDcgKzEzMDcsOSBAQAogCWlmIChzeW1ib2xfY29uZi5jdW11bGF0ZV9jYWxsY2hhaW4gJiYgIWNhbGxjaGFpbl9wYXJhbS5vcmRlcl9zZXQpCiAJCWNhbGxjaGFpbl9wYXJhbS5vcmRlciA9IE9SREVSX0NBTExFUjsKIAotCXN5bWJvbF9jb25mLnByaXZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYW5ub3RhdGlvbik7CisJc3RhdHVzID0gc3ltYm9sX19hbm5vdGF0aW9uX2luaXQoKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBvdXRfZGVsZXRlX2V2bGlzdDsKIAogCXN5bWJvbF9jb25mLnRyeV92bWxpbnV4X3BhdGggPSAoc3ltYm9sX2NvbmYudm1saW51eF9uYW1lID09IE5VTEwpOwogCWlmIChzeW1ib2xfX2luaXQoTlVMTCkgPCAwKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRyYWNlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYwppbmRleCBiOGM2NzY2Li5jMjk4YmQzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYwpAQCAtNDUsNiArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNpZm5kZWYgT19DTE9FWEVDCiAjIGRlZmluZSBPX0NMT0VYRUMJCTAyMDAwMDAwCkBAIC03NDEsNiArNzQyLDggQEAKIAkgIC5hcmdfc2NucHJpbnRmID0geyBbMV0gPSBTQ0FfU0lHTlVNLCAvKiBzaWcgKi8gfSwgfSwKIAl7IC5uYW1lCSAgICA9ICJydF90Z3NpZ3F1ZXVlaW5mbyIsIC5lcnJtc2cgPSB0cnVlLAogCSAgLmFyZ19zY25wcmludGYgPSB7IFsyXSA9IFNDQV9TSUdOVU0sIC8qIHNpZyAqLyB9LCB9LAorCXsgLm5hbWUJICAgID0gInNjaGVkX2dldGF0dHIiLAkgICAgICAuZXJybXNnID0gdHJ1ZSwgfSwKKwl7IC5uYW1lCSAgICA9ICJzY2hlZF9zZXRhdHRyIiwJICAgICAgLmVycm1zZyA9IHRydWUsIH0sCiAJeyAubmFtZQkgICAgPSAic2NoZWRfc2V0c2NoZWR1bGVyIiwgICAuZXJybXNnID0gdHJ1ZSwKIAkgIC5hcmdfc2NucHJpbnRmID0geyBbMV0gPSBTQ0FfU0NIRURfUE9MSUNZLCAvKiBwb2xpY3kgKi8gfSwgfSwKIAl7IC5uYW1lCSAgICA9ICJzZWNjb21wIiwgLmVycm1zZyA9IHRydWUsCkBAIC0yMTQwLDYgKzIxNDMsNyBAQAogc3RhdGljIGludCB0cmFjZV9fc2V0X2V2X3F1YWxpZmllcl9maWx0ZXIoc3RydWN0IHRyYWNlICp0cmFjZSkKIHsKIAlpbnQgZXJyID0gLTE7CisJc3RydWN0IHBlcmZfZXZzZWwgKnN5c19leGl0OwogCWNoYXIgKmZpbHRlciA9IGFzcHJpbnRmX2V4cHJfaW5vdXRfaW50cygiaWQiLCAhdHJhY2UtPm5vdF9ldl9xdWFsaWZpZXIsCiAJCQkJCQl0cmFjZS0+ZXZfcXVhbGlmaWVyX2lkcy5uciwKIAkJCQkJCXRyYWNlLT5ldl9xdWFsaWZpZXJfaWRzLmVudHJpZXMpOwpAQCAtMjE0Nyw4ICsyMTUxLDExIEBACiAJaWYgKGZpbHRlciA9PSBOVUxMKQogCQlnb3RvIG91dF9lbm9tZW07CiAKLQlpZiAoIXBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIodHJhY2UtPnN5c2NhbGxzLmV2ZW50cy5zeXNfZW50ZXIsICImJiIsIGZpbHRlcikpCi0JCWVyciA9IHBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIodHJhY2UtPnN5c2NhbGxzLmV2ZW50cy5zeXNfZXhpdCwgIiYmIiwgZmlsdGVyKTsKKwlpZiAoIXBlcmZfZXZzZWxfX2FwcGVuZF90cF9maWx0ZXIodHJhY2UtPnN5c2NhbGxzLmV2ZW50cy5zeXNfZW50ZXIsCisJCQkJCSAgZmlsdGVyKSkgeworCQlzeXNfZXhpdCA9IHRyYWNlLT5zeXNjYWxscy5ldmVudHMuc3lzX2V4aXQ7CisJCWVyciA9IHBlcmZfZXZzZWxfX2FwcGVuZF90cF9maWx0ZXIoc3lzX2V4aXQsIGZpbHRlcik7CisJfQogCiAJZnJlZShmaWx0ZXIpOwogb3V0OgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9wZXJmLXN5cy5oIGIvdG9vbHMvcGVyZi9wZXJmLXN5cy5oCmluZGV4IDdlZDcyYTQuLmU0YjcxN2UgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvcGVyZi1zeXMuaAorKysgYi90b29scy9wZXJmL3BlcmYtc3lzLmgKQEAgLTIwLDcgKzIwLDYgQEAKICNlbmRpZgogCiAjaWZkZWYgX19wb3dlcnBjX18KLSNpbmNsdWRlICIuLi8uLi9hcmNoL3Bvd2VycGMvaW5jbHVkZS91YXBpL2FzbS91bmlzdGQuaCIKICNkZWZpbmUgQ1BVSU5GT19QUk9DCXsiY3B1In0KICNlbmRpZgogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3BlcmYuaCBiL3Rvb2xzL3BlcmYvcGVyZi5oCmluZGV4IGNiMGYxMzUuLjlhMDIzNmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvcGVyZi5oCisrKyBiL3Rvb2xzL3BlcmYvcGVyZi5oCkBAIC0xNCwxMyArMTQsNiBAQAogI2RlZmluZSBIQVZFX0FUVFJfVEVTVAogI2luY2x1ZGUgInBlcmYtc3lzLmgiCiAKLSNpZm5kZWYgTlNFQ19QRVJfU0VDCi0jIGRlZmluZSBOU0VDX1BFUl9TRUMJCQkxMDAwMDAwMDAwVUxMCi0jZW5kaWYKLSNpZm5kZWYgTlNFQ19QRVJfVVNFQwotIyBkZWZpbmUgTlNFQ19QRVJfVVNFQwkJCTEwMDBVTEwKLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyByZGNsb2NrKHZvaWQpCiB7CiAJc3RydWN0IHRpbWVzcGVjIHRzOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy9CdWlsZCBiL3Rvb2xzL3BlcmYvdGVzdHMvQnVpbGQKaW5kZXggZGM1MWJjNS4uOGE0Y2U0OSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9CdWlsZAorKysgYi90b29scy9wZXJmL3Rlc3RzL0J1aWxkCkBAIC03MSw3ICs3MSw3IEBACiAJJChRKXNlZCAtZSAncy8iL1xcIi9nJyAtZSAncy9cKC4qXCkvIlwxXFxuIi9nJyAkPCA+PiAkQAogCSQoUSllY2hvICc7JyA+PiAkQAogCi1pZmVxICgkKEFSQ0gpLCQoZmlsdGVyICQoQVJDSCkseDg2IGFybSBhcm02NCkpCitpZmVxICgkKEFSQ0gpLCQoZmlsdGVyICQoQVJDSCkseDg2IGFybSBhcm02NCBwb3dlcnBjKSkKIHBlcmYtJChDT05GSUdfRFdBUkZfVU5XSU5EKSArPSBkd2FyZi11bndpbmQubwogZW5kaWYKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy9iYWNrd2FyZC1yaW5nLWJ1ZmZlci5jIGIvdG9vbHMvcGVyZi90ZXN0cy9iYWNrd2FyZC1yaW5nLWJ1ZmZlci5jCmluZGV4IDYxNTc4MGMuLmU2ZDE4MTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvYmFja3dhcmQtcmluZy1idWZmZXIuYworKysgYi90b29scy9wZXJmL3Rlc3RzL2JhY2t3YXJkLXJpbmctYnVmZmVyLmMKQEAgLTk3LDcgKzk3LDcgQEAKIAogCWV2bGlzdCA9IHBlcmZfZXZsaXN0X19uZXcoKTsKIAlpZiAoIWV2bGlzdCkgewotCQlwcl9kZWJ1ZygiTm8gZWhvdWdoIG1lbW9yeSB0byBjcmVhdGUgZXZsaXN0XG4iKTsKKwkJcHJfZGVidWcoIk5vIGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIGV2bGlzdFxuIik7CiAJCXJldHVybiBURVNUX0ZBSUw7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2JwZi5jIGIvdG9vbHMvcGVyZi90ZXN0cy9icGYuYwppbmRleCBmYzU0MDY0Li4yNjczZTg2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL2JwZi5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvYnBmLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCS8qIEluc3RlYWQgb2YgcGVyZl9ldmxpc3RfX25ld19kZWZhdWx0LCBkb24ndCBhZGQgZGVmYXVsdCBldmVudHMgKi8KIAlldmxpc3QgPSBwZXJmX2V2bGlzdF9fbmV3KCk7CiAJaWYgKCFldmxpc3QpIHsKLQkJcHJfZGVidWcoIk5vIGVob3VnaCBtZW1vcnkgdG8gY3JlYXRlIGV2bGlzdFxuIik7CisJCXByX2RlYnVnKCJObyBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBldmxpc3RcbiIpOwogCQlyZXR1cm4gVEVTVF9GQUlMOwogCX0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy9jb2RlLXJlYWRpbmcuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvY29kZS1yZWFkaW5nLmMKaW5kZXggMmFmMTU2YS4uZmY1YmM2MyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9jb2RlLXJlYWRpbmcuYworKysgYi90b29scy9wZXJmL3Rlc3RzL2NvZGUtcmVhZGluZy5jCkBAIC0yNjMsNyArMjYzLDcgQEAKIAkgKiBDb252ZXJ0aW5nIGFkZHJlc3NlcyBmb3IgdXNlIGJ5IG9iamR1bXAgcmVxdWlyZXMgbW9yZSBpbmZvcm1hdGlvbi4KIAkgKiBtYXBfX2xvYWQoKSBkb2VzIHRoYXQuICBTZWUgbWFwX19yaXBfMm9iamR1bXAoKSBmb3IgZGV0YWlscy4KIAkgKi8KLQlpZiAobWFwX19sb2FkKGFsLm1hcCwgTlVMTCkpCisJaWYgKG1hcF9fbG9hZChhbC5tYXApKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBvYmpkdW1wIHN0cnVnZ2xlcyB3aXRoIGtjb3JlIC0gdHJ5IGVhY2ggbWFwIG9ubHkgb25jZSAqLwpAQCAtNTExLDcgKzUxMSw3IEBACiAKIAkvKiBMb2FkIGtlcm5lbCBtYXAgKi8KIAltYXAgPSBtYWNoaW5lX19rZXJuZWxfbWFwKG1hY2hpbmUpOwotCXJldCA9IG1hcF9fbG9hZChtYXAsIE5VTEwpOworCXJldCA9IG1hcF9fbG9hZChtYXApOwogCWlmIChyZXQgPCAwKSB7CiAJCXByX2RlYnVnKCJtYXBfX2xvYWQgZmFpbGVkXG4iKTsKIAkJZ290byBvdXRfZXJyOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy9kd2FyZi11bndpbmQuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvZHdhcmYtdW53aW5kLmMKaW5kZXggOGY2ZWI4NS4uMTA0NjQ5MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9kd2FyZi11bndpbmQuYworKysgYi90b29scy9wZXJmL3Rlc3RzL2R3YXJmLXVud2luZC5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAiY2FsbGNoYWluLmgiCiAKLSNpZiBkZWZpbmVkIChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkIChfX2kzODZfXykKKyNpZiBkZWZpbmVkIChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkIChfX2kzODZfXykgfHwgZGVmaW5lZCAoX19wb3dlcnBjX18pCiAjaW5jbHVkZSAiYXJjaC10ZXN0cy5oIgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvdm1saW51eC1rYWxsc3ltcy5jIGIvdG9vbHMvcGVyZi90ZXN0cy92bWxpbnV4LWthbGxzeW1zLmMKaW5kZXggZTYzYWJhYi4uYTUwODIzMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy92bWxpbnV4LWthbGxzeW1zLmMKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy92bWxpbnV4LWthbGxzeW1zLmMKQEAgLTgsMTQgKzgsNiBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAibWFjaGluZS5oIgogCi1zdGF0aWMgaW50IHZtbGludXhfbWF0Y2hlc19rYWxsc3ltc19maWx0ZXIoc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkLAotCQkJCQkgICBzdHJ1Y3Qgc3ltYm9sICpzeW0pCi17Ci0JYm9vbCAqdmlzaXRlZCA9IHN5bWJvbF9fcHJpdihzeW0pOwotCSp2aXNpdGVkID0gdHJ1ZTsKLQlyZXR1cm4gMDsKLX0KLQogI2RlZmluZSBVTSh4KSBrYWxsc3ltc19tYXAtPnVubWFwX2lwKGthbGxzeW1zX21hcCwgKHgpKQogCiBpbnQgdGVzdF9fdm1saW51eF9tYXRjaGVzX2thbGxzeW1zKGludCBzdWJ0ZXN0IF9fbWF5YmVfdW51c2VkKQpAQCAtMjgsNiArMjAsNyBAQAogCWVudW0gbWFwX3R5cGUgdHlwZSA9IE1BUF9fRlVOQ1RJT047CiAJc3RydWN0IG1hcHMgKm1hcHMgPSAmdm1saW51eC5rbWFwcy5tYXBzW3R5cGVdOwogCXU2NCBtZW1fc3RhcnQsIG1lbV9lbmQ7CisJYm9vbCBoZWFkZXJfcHJpbnRlZDsKIAogCS8qCiAJICogU3RlcCAxOgpAQCAtNjEsNyArNTQsNyBAQAogCSAqIGJlIGNvbXBhY3RlZCBhZ2FpbnN0IHRoZSBsaXN0IG9mIG1vZHVsZXMgZm91bmQgaW4gdGhlICJ2bWxpbnV4IgogCSAqIGNvZGUgYW5kIHdpdGggdGhlIG9uZSBnb3QgZnJvbSAvcHJvYy9tb2R1bGVzIGZyb20gdGhlICJrYWxsc3ltcyIgY29kZS4KIAkgKi8KLQlpZiAoX19tYWNoaW5lX19sb2FkX2thbGxzeW1zKCZrYWxsc3ltcywgIi9wcm9jL2thbGxzeW1zIiwgdHlwZSwgdHJ1ZSwgTlVMTCkgPD0gMCkgeworCWlmIChfX21hY2hpbmVfX2xvYWRfa2FsbHN5bXMoJmthbGxzeW1zLCAiL3Byb2Mva2FsbHN5bXMiLCB0eXBlLCB0cnVlKSA8PSAwKSB7CiAJCXByX2RlYnVnKCJkc29fX2xvYWRfa2FsbHN5bXMgIik7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTk5LDggKzkyLDcgQEAKIAkgKiBtYXBzX19yZWxvY192bWxpbnV4IHdpbGwgbm90aWNlIGFuZCBzZXQgcHJvcGVyIC0+W3VuXW1hcF9pcCByb3V0aW5lcwogCSAqIHRvIGZpeHVwIHRoZSBzeW1ib2xzLgogCSAqLwotCWlmIChtYWNoaW5lX19sb2FkX3ZtbGludXhfcGF0aCgmdm1saW51eCwgdHlwZSwKLQkJCQkgICAgICAgdm1saW51eF9tYXRjaGVzX2thbGxzeW1zX2ZpbHRlcikgPD0gMCkgeworCWlmIChtYWNoaW5lX19sb2FkX3ZtbGludXhfcGF0aCgmdm1saW51eCwgdHlwZSkgPD0gMCkgewogCQlwcl9kZWJ1ZygiQ291bGRuJ3QgZmluZCBhIHZtbGludXggdGhhdCBtYXRjaGVzIHRoZSBrZXJuZWwgcnVubmluZyBvbiB0aGlzIG1hY2hpbmUsIHNraXBwaW5nIHRlc3RcbiIpOwogCQllcnIgPSBURVNUX1NLSVA7CiAJCWdvdG8gb3V0OwpAQCAtMTI2LDcgKzExOCw3IEBACiAJCW1lbV9lbmQgPSB2bWxpbnV4X21hcC0+dW5tYXBfaXAodm1saW51eF9tYXAsIHN5bS0+ZW5kKTsKIAogCQlmaXJzdF9wYWlyID0gbWFjaGluZV9fZmluZF9rZXJuZWxfc3ltYm9sKCZrYWxsc3ltcywgdHlwZSwKLQkJCQkJCQkgbWVtX3N0YXJ0LCBOVUxMLCBOVUxMKTsKKwkJCQkJCQkgbWVtX3N0YXJ0LCBOVUxMKTsKIAkJcGFpciA9IGZpcnN0X3BhaXI7CiAKIAkJaWYgKHBhaXIgJiYgVU0ocGFpci0+c3RhcnQpID09IG1lbV9zdGFydCkgewpAQCAtMTQzLDcgKzEzNSw3IEBACiAJCQkJICovCiAJCQkJczY0IHNrZXcgPSBtZW1fZW5kIC0gVU0ocGFpci0+ZW5kKTsKIAkJCQlpZiAobGxhYnMoc2tldykgPj0gcGFnZV9zaXplKQotCQkJCQlwcl9kZWJ1ZygiJSMiIFBSSXg2NCAiOiBkaWZmIGVuZCBhZGRyIGZvciAlcyB2OiAlIyIgUFJJeDY0ICIgazogJSMiIFBSSXg2NCAiXG4iLAorCQkJCQlwcl9kZWJ1ZygiV0FSTjogJSMiIFBSSXg2NCAiOiBkaWZmIGVuZCBhZGRyIGZvciAlcyB2OiAlIyIgUFJJeDY0ICIgazogJSMiIFBSSXg2NCAiXG4iLAogCQkJCQkJIG1lbV9zdGFydCwgc3ltLT5uYW1lLCBtZW1fZW5kLAogCQkJCQkJIFVNKHBhaXItPmVuZCkpOwogCkBAIC0xNTQsMjIgKzE0NiwyMyBAQAogCQkJCSAqIGthbGxzeW1zLgogCQkJCSAqLwogCQkJCWNvbnRpbnVlOwotCiAJCQl9IGVsc2UgewotCQkJCXBhaXIgPSBtYWNoaW5lX19maW5kX2tlcm5lbF9zeW1ib2xfYnlfbmFtZSgma2FsbHN5bXMsIHR5cGUsIHN5bS0+bmFtZSwgTlVMTCwgTlVMTCk7CisJCQkJcGFpciA9IG1hY2hpbmVfX2ZpbmRfa2VybmVsX3N5bWJvbF9ieV9uYW1lKCZrYWxsc3ltcywgdHlwZSwgc3ltLT5uYW1lLCBOVUxMKTsKIAkJCQlpZiAocGFpcikgewogCQkJCQlpZiAoVU0ocGFpci0+c3RhcnQpID09IG1lbV9zdGFydCkKIAkJCQkJCWdvdG8gbmV4dF9wYWlyOwogCi0JCQkJCXByX2RlYnVnKCIlIyIgUFJJeDY0ICI6IGRpZmYgbmFtZSB2OiAlcyBrOiAlc1xuIiwKKwkJCQkJcHJfZGVidWcoIldBUk46ICUjIiBQUkl4NjQgIjogZGlmZiBuYW1lIHY6ICVzIGs6ICVzXG4iLAogCQkJCQkJIG1lbV9zdGFydCwgc3ltLT5uYW1lLCBwYWlyLT5uYW1lKTsKIAkJCQl9IGVsc2UgewotCQkJCQlwcl9kZWJ1ZygiJSMiIFBSSXg2NCAiOiBkaWZmIG5hbWUgdjogJXMgazogJXNcbiIsCisJCQkJCXByX2RlYnVnKCJXQVJOOiAlIyIgUFJJeDY0ICI6IGRpZmYgbmFtZSB2OiAlcyBrOiAlc1xuIiwKIAkJCQkJCSBtZW1fc3RhcnQsIHN5bS0+bmFtZSwgZmlyc3RfcGFpci0+bmFtZSk7CiAJCQkJfQorCisJCQkJY29udGludWU7CiAJCQl9CiAJCX0gZWxzZQotCQkJcHJfZGVidWcoIiUjIiBQUkl4NjQgIjogJXMgbm90IG9uIGthbGxzeW1zXG4iLAorCQkJcHJfZGVidWcoIkVSUiA6ICUjIiBQUkl4NjQgIjogJXMgbm90IG9uIGthbGxzeW1zXG4iLAogCQkJCSBtZW1fc3RhcnQsIHN5bS0+bmFtZSk7CiAKIAkJZXJyID0gLTE7CkBAIC0xNzgsNyArMTcxLDcgQEAKIAlpZiAoIXZlcmJvc2UpCiAJCWdvdG8gb3V0OwogCi0JcHJfaW5mbygiTWFwcyBvbmx5IGluIHZtbGludXg6XG4iKTsKKwloZWFkZXJfcHJpbnRlZCA9IGZhbHNlOwogCiAJZm9yIChtYXAgPSBtYXBzX19maXJzdChtYXBzKTsgbWFwOyBtYXAgPSBtYXBfX25leHQobWFwKSkgewogCQlzdHJ1Y3QgbWFwICoKQEAgLTE5MiwxMyArMTg1LDE4IEBACiAJCQkJCQkobWFwLT5kc28tPmtlcm5lbCA/CiAJCQkJCQkJbWFwLT5kc28tPnNob3J0X25hbWUgOgogCQkJCQkJCW1hcC0+ZHNvLT5uYW1lKSk7Ci0JCWlmIChwYWlyKQorCQlpZiAocGFpcikgewogCQkJcGFpci0+cHJpdiA9IDE7Ci0JCWVsc2UKKwkJfSBlbHNlIHsKKwkJCWlmICghaGVhZGVyX3ByaW50ZWQpIHsKKwkJCQlwcl9pbmZvKCJXQVJOOiBNYXBzIG9ubHkgaW4gdm1saW51eDpcbiIpOworCQkJCWhlYWRlcl9wcmludGVkID0gdHJ1ZTsKKwkJCX0KIAkJCW1hcF9fZnByaW50ZihtYXAsIHN0ZGVycik7CisJCX0KIAl9CiAKLQlwcl9pbmZvKCJNYXBzIGluIHZtbGludXggd2l0aCBhIGRpZmZlcmVudCBuYW1lIGluIGthbGxzeW1zOlxuIik7CisJaGVhZGVyX3ByaW50ZWQgPSBmYWxzZTsKIAogCWZvciAobWFwID0gbWFwc19fZmlyc3QobWFwcyk7IG1hcDsgbWFwID0gbWFwX19uZXh0KG1hcCkpIHsKIAkJc3RydWN0IG1hcCAqcGFpcjsKQEAgLTIxMSwyNCArMjA5LDMzIEBACiAJCQljb250aW51ZTsKIAogCQlpZiAocGFpci0+c3RhcnQgPT0gbWVtX3N0YXJ0KSB7Ci0JCQlwYWlyLT5wcml2ID0gMTsKLQkJCXByX2luZm8oIiAlIiBQUkl4NjQgIi0lIiBQUkl4NjQgIiAlIiBQUkl4NjQgIiAlcyBpbiBrYWxsc3ltcyBhcyIsCisJCQlpZiAoIWhlYWRlcl9wcmludGVkKSB7CisJCQkJcHJfaW5mbygiV0FSTjogTWFwcyBpbiB2bWxpbnV4IHdpdGggYSBkaWZmZXJlbnQgbmFtZSBpbiBrYWxsc3ltczpcbiIpOworCQkJCWhlYWRlcl9wcmludGVkID0gdHJ1ZTsKKwkJCX0KKworCQkJcHJfaW5mbygiV0FSTjogJSIgUFJJeDY0ICItJSIgUFJJeDY0ICIgJSIgUFJJeDY0ICIgJXMgaW4ga2FsbHN5bXMgYXMiLAogCQkJCW1hcC0+c3RhcnQsIG1hcC0+ZW5kLCBtYXAtPnBnb2ZmLCBtYXAtPmRzby0+bmFtZSk7CiAJCQlpZiAobWVtX2VuZCAhPSBwYWlyLT5lbmQpCi0JCQkJcHJfaW5mbygiOlxuKiUiIFBSSXg2NCAiLSUiIFBSSXg2NCAiICUiIFBSSXg2NCwKKwkJCQlwcl9pbmZvKCI6XG5XQVJOOiAqJSIgUFJJeDY0ICItJSIgUFJJeDY0ICIgJSIgUFJJeDY0LAogCQkJCQlwYWlyLT5zdGFydCwgcGFpci0+ZW5kLCBwYWlyLT5wZ29mZik7CiAJCQlwcl9pbmZvKCIgJXNcbiIsIHBhaXItPmRzby0+bmFtZSk7CiAJCQlwYWlyLT5wcml2ID0gMTsKIAkJfQogCX0KIAotCXByX2luZm8oIk1hcHMgb25seSBpbiBrYWxsc3ltczpcbiIpOworCWhlYWRlcl9wcmludGVkID0gZmFsc2U7CiAKIAltYXBzID0gJmthbGxzeW1zLmttYXBzLm1hcHNbdHlwZV07CiAKIAlmb3IgKG1hcCA9IG1hcHNfX2ZpcnN0KG1hcHMpOyBtYXA7IG1hcCA9IG1hcF9fbmV4dChtYXApKSB7Ci0JCWlmICghbWFwLT5wcml2KQorCQlpZiAoIW1hcC0+cHJpdikgeworCQkJaWYgKCFoZWFkZXJfcHJpbnRlZCkgeworCQkJCXByX2luZm8oIldBUk46IE1hcHMgb25seSBpbiBrYWxsc3ltczpcbiIpOworCQkJCWhlYWRlcl9wcmludGVkID0gdHJ1ZTsKKwkJCX0KIAkJCW1hcF9fZnByaW50ZihtYXAsIHN0ZGVycik7CisJCX0KIAl9CiBvdXQ6CiAJbWFjaGluZV9fZXhpdCgma2FsbHN5bXMpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90cmFjZS9iZWF1dHkvbW1hcC5jIGIvdG9vbHMvcGVyZi90cmFjZS9iZWF1dHkvbW1hcC5jCmluZGV4IGQwYTNhOGUuLmZkNzEwYWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdHJhY2UvYmVhdXR5L21tYXAuYworKysgYi90b29scy9wZXJmL3RyYWNlL2JlYXV0eS9tbWFwLmMKQEAgLTEsOCArMSw0IEBACi0jaW5jbHVkZSA8c3lzL21tYW4uaD4KLQotI2lmbmRlZiBQUk9UX1NFTQotI2RlZmluZSBQUk9UX1NFTSAweDgKLSNlbmRpZgorI2luY2x1ZGUgPHVhcGkvbGludXgvbW1hbi5oPgogCiBzdGF0aWMgc2l6ZV90IHN5c2NhbGxfYXJnX19zY25wcmludGZfbW1hcF9wcm90KGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSwKIAkJCQkJICAgICAgIHN0cnVjdCBzeXNjYWxsX2FyZyAqYXJnKQpAQCAtMzMsMzEgKzI5LDYgQEAKIAogI2RlZmluZSBTQ0FfTU1BUF9QUk9UIHN5c2NhbGxfYXJnX19zY25wcmludGZfbW1hcF9wcm90CiAKLSNpZm5kZWYgTUFQX0ZJWEVECi0jZGVmaW5lIE1BUF9GSVhFRAkJICAgICAweDEwCi0jZW5kaWYKLQotI2lmbmRlZiBNQVBfQU5PTllNT1VTCi0jZGVmaW5lIE1BUF9BTk9OWU1PVVMJCSAgICAgMHgyMAotI2VuZGlmCi0KLSNpZm5kZWYgTUFQXzMyQklUCi0jZGVmaW5lIE1BUF8zMkJJVAkJICAgICAweDQwCi0jZW5kaWYKLQotI2lmbmRlZiBNQVBfU1RBQ0sKLSNkZWZpbmUgTUFQX1NUQUNLCQkgIDB4MjAwMDAKLSNlbmRpZgotCi0jaWZuZGVmIE1BUF9IVUdFVExCCi0jZGVmaW5lIE1BUF9IVUdFVExCCQkgIDB4NDAwMDAKLSNlbmRpZgotCi0jaWZuZGVmIE1BUF9VTklOSVRJQUxJWkVECi0jZGVmaW5lIE1BUF9VTklOSVRJQUxJWkVECTB4NDAwMDAwMAotI2VuZGlmCi0KLQogc3RhdGljIHNpemVfdCBzeXNjYWxsX2FyZ19fc2NucHJpbnRmX21tYXBfZmxhZ3MoY2hhciAqYmYsIHNpemVfdCBzaXplLAogCQkJCQkJc3RydWN0IHN5c2NhbGxfYXJnICphcmcpCiB7CkBAIC05NSwxMyArNjYsNiBAQAogCiAjZGVmaW5lIFNDQV9NTUFQX0ZMQUdTIHN5c2NhbGxfYXJnX19zY25wcmludGZfbW1hcF9mbGFncwogCi0jaWZuZGVmIE1SRU1BUF9NQVlNT1ZFCi0jZGVmaW5lIE1SRU1BUF9NQVlNT1ZFIDEKLSNlbmRpZgotI2lmbmRlZiBNUkVNQVBfRklYRUQKLSNkZWZpbmUgTVJFTUFQX0ZJWEVEIDIKLSNlbmRpZgotCiBzdGF0aWMgc2l6ZV90IHN5c2NhbGxfYXJnX19zY25wcmludGZfbXJlbWFwX2ZsYWdzKGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSwKIAkJCQkJCSAgc3RydWN0IHN5c2NhbGxfYXJnICphcmcpCiB7CkBAIC0xMjUsMzkgKzg5LDYgQEAKIAogI2RlZmluZSBTQ0FfTVJFTUFQX0ZMQUdTIHN5c2NhbGxfYXJnX19zY25wcmludGZfbXJlbWFwX2ZsYWdzCiAKLSNpZm5kZWYgTUFEVl9IV1BPSVNPTgotI2RlZmluZSBNQURWX0hXUE9JU09OCQkxMDAKLSNlbmRpZgotCi0jaWZuZGVmIE1BRFZfU09GVF9PRkZMSU5FCi0jZGVmaW5lIE1BRFZfU09GVF9PRkZMSU5FCTEwMQotI2VuZGlmCi0KLSNpZm5kZWYgTUFEVl9NRVJHRUFCTEUKLSNkZWZpbmUgTUFEVl9NRVJHRUFCTEUJCSAxMgotI2VuZGlmCi0KLSNpZm5kZWYgTUFEVl9VTk1FUkdFQUJMRQotI2RlZmluZSBNQURWX1VOTUVSR0VBQkxFCSAxMwotI2VuZGlmCi0KLSNpZm5kZWYgTUFEVl9IVUdFUEFHRQotI2RlZmluZSBNQURWX0hVR0VQQUdFCQkgMTQKLSNlbmRpZgotCi0jaWZuZGVmIE1BRFZfTk9IVUdFUEFHRQotI2RlZmluZSBNQURWX05PSFVHRVBBR0UJCSAxNQotI2VuZGlmCi0KLSNpZm5kZWYgTUFEVl9ET05URFVNUAotI2RlZmluZSBNQURWX0RPTlREVU1QCQkgMTYKLSNlbmRpZgotCi0jaWZuZGVmIE1BRFZfRE9EVU1QCi0jZGVmaW5lIE1BRFZfRE9EVU1QCQkgMTcKLSNlbmRpZgotCi0KIHN0YXRpYyBzaXplX3Qgc3lzY2FsbF9hcmdfX3NjbnByaW50Zl9tYWR2aXNlX2JlaGF2aW9yKGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSwKIAkJCQkJCSAgICAgIHN0cnVjdCBzeXNjYWxsX2FyZyAqYXJnKQogewpAQCAtMTcwLDYgKzEwMSw3IEBACiAJUF9NQURWX0JIVihTRVFVRU5USUFMKTsKIAlQX01BRFZfQkhWKFdJTExORUVEKTsKIAlQX01BRFZfQkhWKERPTlRORUVEKTsKKwlQX01BRFZfQkhWKEZSRUUpOwogCVBfTUFEVl9CSFYoUkVNT1ZFKTsKIAlQX01BRFZfQkhWKERPTlRGT1JLKTsKIAlQX01BRFZfQkhWKERPRk9SSyk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMgYi90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMKaW5kZXggMmUyZDEwMC4uNGMxODI3MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91aS9icm93c2Vycy9hbm5vdGF0ZS5jCisrKyBiL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvYW5ub3RhdGUuYwpAQCAtNDk1LDcgKzQ5NSw3IEBACiAJaWYgKCFpbnNfX2lzX2NhbGwoZGwtPmlucykpCiAJCXJldHVybiBmYWxzZTsKIAotCWlmIChtYXBfZ3JvdXBzX19maW5kX2FtcygmdGFyZ2V0LCBOVUxMKSB8fAorCWlmIChtYXBfZ3JvdXBzX19maW5kX2FtcygmdGFyZ2V0KSB8fAogCSAgICBtYXBfX3JpcF8yb2JqZHVtcCh0YXJnZXQubWFwLCB0YXJnZXQubWFwLT5tYXBfaXAodGFyZ2V0Lm1hcCwKIAkJCQkJCQkgICAgIHRhcmdldC5hZGRyKSkgIT0KIAkgICAgZGwtPm9wcy50YXJnZXQuYWRkcikgewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jCmluZGV4IDEzZDQxNDMuLmZiOGU0MmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvaGlzdHMuYworKysgYi90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2hpc3RzLmMKQEAgLTY5LDggKzY5LDExIEBACiBzdGF0aWMgdm9pZCBoaXN0X2Jyb3dzZXJfX3VwZGF0ZV9yb3dzKHN0cnVjdCBoaXN0X2Jyb3dzZXIgKmhiKQogewogCXN0cnVjdCB1aV9icm93c2VyICpicm93c2VyID0gJmhiLT5iOwotCXUxNiBoZWFkZXJfb2Zmc2V0ID0gaGItPnNob3dfaGVhZGVycyA/IDEgOiAwLCBpbmRleF9yb3c7CisJc3RydWN0IGhpc3RzICpoaXN0cyA9IGhiLT5oaXN0czsKKwlzdHJ1Y3QgcGVyZl9ocHBfbGlzdCAqaHBwX2xpc3QgPSBoaXN0cy0+aHBwX2xpc3Q7CisJdTE2IGhlYWRlcl9vZmZzZXQsIGluZGV4X3JvdzsKIAorCWhlYWRlcl9vZmZzZXQgPSBoYi0+c2hvd19oZWFkZXJzID8gaHBwX2xpc3QtPm5yX2hlYWRlcl9saW5lcyA6IDA7CiAJYnJvd3Nlci0+cm93cyA9IGJyb3dzZXItPmhlaWdodCAtIGhlYWRlcl9vZmZzZXQ7CiAJLyoKIAkgKiBWZXJpZnkgaWYgd2Ugd2VyZSBhdCB0aGUgbGFzdCBsaW5lIGFuZCB0aGF0IGxpbmUgaXNuJ3QKQEAgLTk5LDggKzEwMiwxMSBAQAogCiBzdGF0aWMgdm9pZCBoaXN0X2Jyb3dzZXJfX2dvdG9yYyhzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyLCBpbnQgcm93LCBpbnQgY29sdW1uKQogewotCXUxNiBoZWFkZXJfb2Zmc2V0ID0gYnJvd3Nlci0+c2hvd19oZWFkZXJzID8gMSA6IDA7CisJc3RydWN0IGhpc3RzICpoaXN0cyA9IGJyb3dzZXItPmhpc3RzOworCXN0cnVjdCBwZXJmX2hwcF9saXN0ICpocHBfbGlzdCA9IGhpc3RzLT5ocHBfbGlzdDsKKwl1MTYgaGVhZGVyX29mZnNldDsKIAorCWhlYWRlcl9vZmZzZXQgPSBicm93c2VyLT5zaG93X2hlYWRlcnMgPyBocHBfbGlzdC0+bnJfaGVhZGVyX2xpbmVzIDogMDsKIAl1aV9icm93c2VyX19nb3RvcmMoJmJyb3dzZXItPmIsIHJvdyArIGhlYWRlcl9vZmZzZXQsIGNvbHVtbik7CiB9CiAKQEAgLTEwNzQsNyArMTA4MCw3IEBACiAJYm9vbCBjdXJyZW50X2VudHJ5OwogfTsKIAotc3RhdGljIGludCBfX2hwcF9fc2xzbWdfY29sb3JfcHJpbnRmKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK2ludCBfX2hwcF9fc2xzbWdfY29sb3JfcHJpbnRmKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAlzdHJ1Y3QgaHBwX2FyZyAqYXJnID0gaHBwLT5wdHI7CiAJaW50IHJldCwgbGVuOwpAQCAtMTA5MSw3ICsxMDk3LDYgQEAKIAlyZXQgPSBzY25wcmludGYoaHBwLT5idWYsIGhwcC0+c2l6ZSwgZm10LCBsZW4sIHBlcmNlbnQpOwogCXVpX2Jyb3dzZXJfX3ByaW50ZihhcmctPmIsICIlcyIsIGhwcC0+YnVmKTsKIAotCWFkdmFuY2VfaHBwKGhwcCwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDk2LDcgKzE1MDEsOSBAQAogCXJldHVybiBocHAtPnNpemUgPD0gMDsKIH0KIAotc3RhdGljIGludCBoaXN0c19icm93c2VyX19zY25wcmludGZfaGVhZGVycyhzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQorc3RhdGljIGludAoraGlzdHNfYnJvd3Nlcl9fc2NucHJpbnRmX2hlYWRlcnMoc3RydWN0IGhpc3RfYnJvd3NlciAqYnJvd3NlciwgY2hhciAqYnVmLAorCQkJCSBzaXplX3Qgc2l6ZSwgaW50IGxpbmUpCiB7CiAJc3RydWN0IGhpc3RzICpoaXN0cyA9IGJyb3dzZXItPmhpc3RzOwogCXN0cnVjdCBwZXJmX2hwcCBkdW1teV9ocHAgPSB7CkBAIC0xNTA2LDYgKzE1MTMsNyBAQAogCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKIAlzaXplX3QgcmV0ID0gMDsKIAlpbnQgY29sdW1uID0gMDsKKwlpbnQgc3BhbiA9IDA7CiAKIAlpZiAoc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikgewogCQlyZXQgPSBzY25wcmludGYoYnVmLCBzaXplLCAiICAiKTsKQEAgLTE1MTcsMTAgKzE1MjUsMTMgQEAKIAkJaWYgKHBlcmZfaHBwX19zaG91bGRfc2tpcChmbXQsIGhpc3RzKSAgfHwgY29sdW1uKysgPCBicm93c2VyLT5iLmhvcml6X3Njcm9sbCkKIAkJCWNvbnRpbnVlOwogCi0JCXJldCA9IGZtdC0+aGVhZGVyKGZtdCwgJmR1bW15X2hwcCwgaGlzdHMpOworCQlyZXQgPSBmbXQtPmhlYWRlcihmbXQsICZkdW1teV9ocHAsIGhpc3RzLCBsaW5lLCAmc3Bhbik7CiAJCWlmIChhZHZhbmNlX2hwcF9jaGVjaygmZHVtbXlfaHBwLCByZXQpKQogCQkJYnJlYWs7CiAKKwkJaWYgKHNwYW4pCisJCQljb250aW51ZTsKKwogCQlyZXQgPSBzY25wcmludGYoZHVtbXlfaHBwLmJ1ZiwgZHVtbXlfaHBwLnNpemUsICIgICIpOwogCQlpZiAoYWR2YW5jZV9ocHBfY2hlY2soJmR1bW15X2hwcCwgcmV0KSkKIAkJCWJyZWFrOwpAQCAtMTU1NCw3ICsxNTY1LDcgQEAKIAkJaWYgKGNvbHVtbisrIDwgYnJvd3Nlci0+Yi5ob3Jpel9zY3JvbGwpCiAJCQljb250aW51ZTsKIAotCQlyZXQgPSBmbXQtPmhlYWRlcihmbXQsICZkdW1teV9ocHAsIGhpc3RzKTsKKwkJcmV0ID0gZm10LT5oZWFkZXIoZm10LCAmZHVtbXlfaHBwLCBoaXN0cywgMCwgTlVMTCk7CiAJCWlmIChhZHZhbmNlX2hwcF9jaGVjaygmZHVtbXlfaHBwLCByZXQpKQogCQkJYnJlYWs7CiAKQEAgLTE1OTEsNyArMTYwMiw3IEBACiAJCQl9CiAJCQlmaXJzdF9jb2wgPSBmYWxzZTsKIAotCQkJcmV0ID0gZm10LT5oZWFkZXIoZm10LCAmZHVtbXlfaHBwLCBoaXN0cyk7CisJCQlyZXQgPSBmbXQtPmhlYWRlcihmbXQsICZkdW1teV9ocHAsIGhpc3RzLCAwLCBOVUxMKTsKIAkJCWR1bW15X2hwcC5idWZbcmV0XSA9ICdcMCc7CiAKIAkJCXN0YXJ0ID0gdHJpbShkdW1teV9ocHAuYnVmKTsKQEAgLTE2MjIsMTQgKzE2MzMsMjEgQEAKIAogc3RhdGljIHZvaWQgaGlzdHNfYnJvd3Nlcl9faGVhZGVycyhzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyKQogewotCWNoYXIgaGVhZGVyc1sxMDI0XTsKKwlzdHJ1Y3QgaGlzdHMgKmhpc3RzID0gYnJvd3Nlci0+aGlzdHM7CisJc3RydWN0IHBlcmZfaHBwX2xpc3QgKmhwcF9saXN0ID0gaGlzdHMtPmhwcF9saXN0OwogCi0JaGlzdHNfYnJvd3Nlcl9fc2NucHJpbnRmX2hlYWRlcnMoYnJvd3NlciwgaGVhZGVycywKLQkJCQkJIHNpemVvZihoZWFkZXJzKSk7CisJaW50IGxpbmU7CiAKLQl1aV9icm93c2VyX19nb3RvcmMoJmJyb3dzZXItPmIsIDAsIDApOwotCXVpX2Jyb3dzZXJfX3NldF9jb2xvcigmYnJvd3Nlci0+YiwgSEVfQ09MT1JTRVRfUk9PVCk7Ci0JdWlfYnJvd3Nlcl9fd3JpdGVfbnN0cmluZygmYnJvd3Nlci0+YiwgaGVhZGVycywgYnJvd3Nlci0+Yi53aWR0aCArIDEpOworCWZvciAobGluZSA9IDA7IGxpbmUgPCBocHBfbGlzdC0+bnJfaGVhZGVyX2xpbmVzOyBsaW5lKyspIHsKKwkJY2hhciBoZWFkZXJzWzEwMjRdOworCisJCWhpc3RzX2Jyb3dzZXJfX3NjbnByaW50Zl9oZWFkZXJzKGJyb3dzZXIsIGhlYWRlcnMsCisJCQkJCQkgc2l6ZW9mKGhlYWRlcnMpLCBsaW5lKTsKKworCQl1aV9icm93c2VyX19nb3RvcmMoJmJyb3dzZXItPmIsIGxpbmUsIDApOworCQl1aV9icm93c2VyX19zZXRfY29sb3IoJmJyb3dzZXItPmIsIEhFX0NPTE9SU0VUX1JPT1QpOworCQl1aV9icm93c2VyX193cml0ZV9uc3RyaW5nKCZicm93c2VyLT5iLCBoZWFkZXJzLCBicm93c2VyLT5iLndpZHRoICsgMSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBoaXN0X2Jyb3dzZXJfX3Nob3dfaGVhZGVycyhzdHJ1Y3QgaGlzdF9icm93c2VyICpicm93c2VyKQpAQCAtMTY1NiwxMCArMTY3NCwxMyBAQAogCXUxNiBoZWFkZXJfb2Zmc2V0ID0gMDsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CiAJc3RydWN0IGhpc3RfYnJvd3NlciAqaGIgPSBjb250YWluZXJfb2YoYnJvd3Nlciwgc3RydWN0IGhpc3RfYnJvd3NlciwgYik7CisJc3RydWN0IGhpc3RzICpoaXN0cyA9IGhiLT5oaXN0czsKIAogCWlmIChoYi0+c2hvd19oZWFkZXJzKSB7CisJCXN0cnVjdCBwZXJmX2hwcF9saXN0ICpocHBfbGlzdCA9IGhpc3RzLT5ocHBfbGlzdDsKKwogCQloaXN0X2Jyb3dzZXJfX3Nob3dfaGVhZGVycyhoYik7Ci0JCWhlYWRlcl9vZmZzZXQgPSAxOworCQloZWFkZXJfb2Zmc2V0ID0gaHBwX2xpc3QtPm5yX2hlYWRlcl9saW5lczsKIAl9CiAKIAl1aV9icm93c2VyX19oaXN0c19pbml0X3RvcChicm93c2VyKTsKQEAgLTIwNTQsMTAgKzIwNzUsMTAgQEAKIAlicm93c2VyLT5iLnVzZV9uYXZrZXlwcmVzc2VkCT0gdHJ1ZTsKIAlicm93c2VyLT5zaG93X2hlYWRlcnMJCT0gc3ltYm9sX2NvbmYuc2hvd19oaXN0X2hlYWRlcnM7CiAKLQloaXN0c19fZm9yX2VhY2hfZm9ybWF0KGhpc3RzLCBmbXQpIHsKLQkJcGVyZl9ocHBfX3Jlc2V0X3dpZHRoKGZtdCwgaGlzdHMpOworCWhpc3RzX19mb3JfZWFjaF9mb3JtYXQoaGlzdHMsIGZtdCkKIAkJKyticm93c2VyLT5iLmNvbHVtbnM7Ci0JfQorCisJaGlzdHNfX3Jlc2V0X2NvbHVtbl93aWR0aChoaXN0cyk7CiB9CiAKIHN0cnVjdCBoaXN0X2Jyb3dzZXIgKmhpc3RfYnJvd3Nlcl9fbmV3KHN0cnVjdCBoaXN0cyAqaGlzdHMpCkBAIC0yNDE4LDggKzI0MzksNiBAQAogCQlicm93c2VyLT5oaXN0cy0+ZHNvX2ZpbHRlciA9IE5VTEw7CiAJCXVpX2hlbHBsaW5lX19wb3AoKTsKIAl9IGVsc2UgewotCQlpZiAobWFwID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKIAkJdWlfaGVscGxpbmVfX2ZwdXNoKCJUbyB6b29tIG91dCBwcmVzcyBFU0Mgb3IgRU5URVIgKyBcIlpvb20gb3V0IG9mICVzIERTT1wiIiwKIAkJCQkgICBfX21hcF9faXNfa2VybmVsKG1hcCkgPyAidGhlIEtlcm5lbCIgOiBtYXAtPmRzby0+c2hvcnRfbmFtZSk7CiAJCWJyb3dzZXItPmhpc3RzLT5kc29fZmlsdGVyID0gbWFwLT5kc287CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3VpL2Jyb3dzZXJzL21hcC5jIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9tYXAuYwppbmRleCA4MDkxMjc3Li45OGEzNDY2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3VpL2Jyb3dzZXJzL21hcC5jCisrKyBiL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvbWFwLmMKQEAgLTUyLDkgKzUyLDkgQEAKIAogCWlmICh0YXJnZXRbMF0gPT0gJzAnICYmIHRvbG93ZXIodGFyZ2V0WzFdKSA9PSAneCcpIHsKIAkJdTY0IGFkZHIgPSBzdHJ0b3VsbCh0YXJnZXQsIE5VTEwsIDE2KTsKLQkJc3ltID0gbWFwX19maW5kX3N5bWJvbChicm93c2VyLT5tYXAsIGFkZHIsIE5VTEwpOworCQlzeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGJyb3dzZXItPm1hcCwgYWRkcik7CiAJfSBlbHNlCi0JCXN5bSA9IG1hcF9fZmluZF9zeW1ib2xfYnlfbmFtZShicm93c2VyLT5tYXAsIHRhcmdldCwgTlVMTCk7CisJCXN5bSA9IG1hcF9fZmluZF9zeW1ib2xfYnlfbmFtZShicm93c2VyLT5tYXAsIHRhcmdldCk7CiAKIAlpZiAoc3ltICE9IE5VTEwpIHsKIAkJdTMyICppZHggPSBzeW1ib2xfX2Jyb3dzZXJfaW5kZXgoc3ltKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvZ3RrL2hpc3RzLmMgYi90b29scy9wZXJmL3VpL2d0ay9oaXN0cy5jCmluZGV4IGM1ZjM2NzcuLmE0ZjAyZGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdWkvZ3RrL2hpc3RzLmMKKysrIGIvdG9vbHMvcGVyZi91aS9ndGsvaGlzdHMuYwpAQCAtNTQ5LDcgKzU0OSw3IEBACiAJCQkJc3RyY2F0KGJ1ZiwgIisiKTsKIAkJCWZpcnN0X2NvbCA9IGZhbHNlOwogCi0JCQlmbXQtPmhlYWRlcihmbXQsICZocHAsIGhpc3RzKTsKKwkJCWZtdC0+aGVhZGVyKGZtdCwgJmhwcCwgaGlzdHMsIDAsIE5VTEwpOwogCQkJc3RyY2F0KGJ1ZiwgbHRyaW0ocnRyaW0oaHBwLmJ1ZikpKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvaGlzdC5jIGIvdG9vbHMvcGVyZi91aS9oaXN0LmMKaW5kZXggNDI3NDk2OS4uMzczODgzOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91aS9oaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91aS9oaXN0LmMKQEAgLTIzMCwxMyArMjMwLDE0IEBACiB9CiAKIHN0YXRpYyBpbnQgaHBwX19oZWFkZXJfZm4oc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKLQkJCSAgc3RydWN0IGhpc3RzICpoaXN0cykKKwkJCSAgc3RydWN0IGhpc3RzICpoaXN0cywgaW50IGxpbmUgX19tYXliZV91bnVzZWQsCisJCQkgIGludCAqc3BhbiBfX21heWJlX3VudXNlZCkKIHsKIAlpbnQgbGVuID0gaHBwX193aWR0aF9mbihmbXQsIGhwcCwgaGlzdHMpOwogCXJldHVybiBzY25wcmludGYoaHBwLT5idWYsIGhwcC0+c2l6ZSwgIiUqcyIsIGxlbiwgZm10LT5uYW1lKTsKIH0KIAotc3RhdGljIGludCBocHBfY29sb3Jfc2NucHJpbnRmKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK2ludCBocHBfY29sb3Jfc2NucHJpbnRmKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFyZ3M7CiAJc3NpemVfdCBzc2l6ZSA9IGhwcC0+c2l6ZTsKQEAgLTQ0MSw2ICs0NDIsNyBAQAogc3RydWN0IHBlcmZfaHBwX2xpc3QgcGVyZl9ocHBfbGlzdCA9IHsKIAkuZmllbGRzCT0gTElTVF9IRUFEX0lOSVQocGVyZl9ocHBfbGlzdC5maWVsZHMpLAogCS5zb3J0cwk9IExJU1RfSEVBRF9JTklUKHBlcmZfaHBwX2xpc3Quc29ydHMpLAorCS5ucl9oZWFkZXJfbGluZXMgPSAxLAogfTsKIAogI3VuZGVmIEhQUF9fQ09MT1JfUFJJTlRfRk5TCkBAIC02OTcsNiArNjk5LDIxIEBACiAJfQogfQogCit2b2lkIGhpc3RzX19yZXNldF9jb2x1bW5fd2lkdGgoc3RydWN0IGhpc3RzICpoaXN0cykKK3sKKwlzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQ7CisJc3RydWN0IHBlcmZfaHBwX2xpc3Rfbm9kZSAqbm9kZTsKKworCWhpc3RzX19mb3JfZWFjaF9mb3JtYXQoaGlzdHMsIGZtdCkKKwkJcGVyZl9ocHBfX3Jlc2V0X3dpZHRoKGZtdCwgaGlzdHMpOworCisJLyogaGllcmFyY2h5IGVudHJpZXMgaGF2ZSB0aGVpciBvd24gaHBwIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZoaXN0cy0+aHBwX2Zvcm1hdHMsIGxpc3QpIHsKKwkJcGVyZl9ocHBfbGlzdF9fZm9yX2VhY2hfZm9ybWF0KCZub2RlLT5ocHAsIGZtdCkKKwkJCXBlcmZfaHBwX19yZXNldF93aWR0aChmbXQsIGhpc3RzKTsKKwl9Cit9CisKIHZvaWQgcGVyZl9ocHBfX3NldF91c2VyX3dpZHRoKGNvbnN0IGNoYXIgKndpZHRoX2xpc3Rfc3RyKQogewogCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvc3RkaW8vaGlzdC5jIGIvdG9vbHMvcGVyZi91aS9zdGRpby9oaXN0LmMKaW5kZXggZjA0YTYzMS4uODlkODQ0MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91aS9zdGRpby9oaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91aS9zdGRpby9oaXN0LmMKQEAgLTM3Myw3ICszNzMsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhpc3RfZW50cnlfX3NucHJpbnRmKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSwgc3RydWN0IHBlcmZfaHBwICpocHApCitpbnQgX19oaXN0X2VudHJ5X19zbnByaW50ZihzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAorCQkJICAgc3RydWN0IHBlcmZfaHBwX2xpc3QgKmhwcF9saXN0KQogewogCWNvbnN0IGNoYXIgKnNlcCA9IHN5bWJvbF9jb25mLmZpZWxkX3NlcDsKIAlzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQ7CkBAIC0zODQsNyArMzg1LDcgQEAKIAlpZiAoc3ltYm9sX2NvbmYuZXhjbHVkZV9vdGhlciAmJiAhaGUtPnBhcmVudCkKIAkJcmV0dXJuIDA7CiAKLQloaXN0c19fZm9yX2VhY2hfZm9ybWF0KGhlLT5oaXN0cywgZm10KSB7CisJcGVyZl9ocHBfbGlzdF9fZm9yX2VhY2hfZm9ybWF0KGhwcF9saXN0LCBmbXQpIHsKIAkJaWYgKHBlcmZfaHBwX19zaG91bGRfc2tpcChmbXQsIGhlLT5oaXN0cykpCiAJCQljb250aW51ZTsKIApAQCAtNDEwLDYgKzQxMSwxMSBAQAogCXJldHVybiBocHAtPmJ1ZiAtIHN0YXJ0OwogfQogCitzdGF0aWMgaW50IGhpc3RfZW50cnlfX3NucHJpbnRmKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSwgc3RydWN0IHBlcmZfaHBwICpocHApCit7CisJcmV0dXJuIF9faGlzdF9lbnRyeV9fc25wcmludGYoaGUsIGhwcCwgaGUtPmhpc3RzLT5ocHBfbGlzdCk7Cit9CisKIHN0YXRpYyBpbnQgaGlzdF9lbnRyeV9faGllcmFyY2h5X2ZwcmludGYoc3RydWN0IGhpc3RfZW50cnkgKmhlLAogCQkJCQkgc3RydWN0IHBlcmZfaHBwICpocHAsCiAJCQkJCSBzdHJ1Y3QgaGlzdHMgKmhpc3RzLApAQCAtNTI4LDggKzUzNCw4IEBACiAJcmV0dXJuIGZwcmludGYoZnAsICIlLS4qcyIsIChpbmRlbnQgLSAyKSAqIEhJRVJBUkNIWV9JTkRFTlQsIGxpbmUpOwogfQogCi1zdGF0aWMgaW50IHByaW50X2hpZXJhcmNoeV9oZWFkZXIoc3RydWN0IGhpc3RzICpoaXN0cywgc3RydWN0IHBlcmZfaHBwICpocHAsCi0JCQkJICBjb25zdCBjaGFyICpzZXAsIEZJTEUgKmZwKQorc3RhdGljIGludCBoaXN0c19fZnByaW50Zl9oaWVyYXJjaHlfaGVhZGVycyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLAorCQkJCQkgICAgc3RydWN0IHBlcmZfaHBwICpocHAsIEZJTEUgKmZwKQogewogCWJvb2wgZmlyc3Rfbm9kZSwgZmlyc3RfY29sOwogCWludCBpbmRlbnQ7CkBAIC01MzgsNiArNTQ0LDcgQEAKIAl1bnNpZ25lZCBoZWFkZXJfd2lkdGggPSAwOwogCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKIAlzdHJ1Y3QgcGVyZl9ocHBfbGlzdF9ub2RlICpmbXRfbm9kZTsKKwljb25zdCBjaGFyICpzZXAgPSBzeW1ib2xfY29uZi5maWVsZF9zZXA7CiAKIAlpbmRlbnQgPSBoaXN0cy0+bnJfaHBwX25vZGU7CiAKQEAgLTU0OSw3ICs1NTYsNyBAQAogCQkJCSAgICBzdHJ1Y3QgcGVyZl9ocHBfbGlzdF9ub2RlLCBsaXN0KTsKIAogCXBlcmZfaHBwX2xpc3RfX2Zvcl9lYWNoX2Zvcm1hdCgmZm10X25vZGUtPmhwcCwgZm10KSB7Ci0JCWZtdC0+aGVhZGVyKGZtdCwgaHBwLCBoaXN0cyk7CisJCWZtdC0+aGVhZGVyKGZtdCwgaHBwLCBoaXN0cywgMCwgTlVMTCk7CiAJCWZwcmludGYoZnAsICIlcyVzIiwgaHBwLT5idWYsIHNlcCA/OiAiICAiKTsKIAl9CiAKQEAgLTU2OSw3ICs1NzYsNyBAQAogCQkJCWhlYWRlcl93aWR0aCArPSBmcHJpbnRmKGZwLCAiKyIpOwogCQkJZmlyc3RfY29sID0gZmFsc2U7CiAKLQkJCWZtdC0+aGVhZGVyKGZtdCwgaHBwLCBoaXN0cyk7CisJCQlmbXQtPmhlYWRlcihmbXQsIGhwcCwgaGlzdHMsIDAsIE5VTEwpOwogCiAJCQloZWFkZXJfd2lkdGggKz0gZnByaW50ZihmcCwgIiVzIiwgdHJpbShocHAtPmJ1ZikpOwogCQl9CkBAIC02MjMsMjAgKzYzMCwyOCBAQAogCXJldHVybiAyOwogfQogCi1zdGF0aWMgaW50Ci1oaXN0c19fZnByaW50Zl9oaWVyYXJjaHlfaGVhZGVycyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLAotCQkJCSBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKLQkJCQkgRklMRSAqZnApCitzdGF0aWMgdm9pZCBmcHJpbnRmX2xpbmUoc3RydWN0IGhpc3RzICpoaXN0cywgc3RydWN0IHBlcmZfaHBwICpocHAsCisJCQkgaW50IGxpbmUsIEZJTEUgKmZwKQogewotCXN0cnVjdCBwZXJmX2hwcF9saXN0X25vZGUgKmZtdF9ub2RlOwogCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKKwljb25zdCBjaGFyICpzZXAgPSBzeW1ib2xfY29uZi5maWVsZF9zZXA7CisJYm9vbCBmaXJzdCA9IHRydWU7CisJaW50IHNwYW4gPSAwOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShmbXRfbm9kZSwgJmhpc3RzLT5ocHBfZm9ybWF0cywgbGlzdCkgewotCQlwZXJmX2hwcF9saXN0X19mb3JfZWFjaF9mb3JtYXQoJmZtdF9ub2RlLT5ocHAsIGZtdCkKLQkJCXBlcmZfaHBwX19yZXNldF93aWR0aChmbXQsIGhpc3RzKTsKKwloaXN0c19fZm9yX2VhY2hfZm9ybWF0KGhpc3RzLCBmbXQpIHsKKwkJaWYgKHBlcmZfaHBwX19zaG91bGRfc2tpcChmbXQsIGhpc3RzKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghZmlyc3QgJiYgIXNwYW4pCisJCQlmcHJpbnRmKGZwLCAiJXMiLCBzZXAgPzogIiAgIik7CisJCWVsc2UKKwkJCWZpcnN0ID0gZmFsc2U7CisKKwkJZm10LT5oZWFkZXIoZm10LCBocHAsIGhpc3RzLCBsaW5lLCAmc3Bhbik7CisKKwkJaWYgKCFzcGFuKQorCQkJZnByaW50ZihmcCwgIiVzIiwgaHBwLT5idWYpOwogCX0KLQotCXJldHVybiBwcmludF9oaWVyYXJjaHlfaGVhZGVyKGhpc3RzLCBocHAsIHN5bWJvbF9jb25mLmZpZWxkX3NlcCwgZnApOwogfQogCiBzdGF0aWMgaW50CkBAIC02NDQsMjggKzY1OSwyMyBAQAogCQkJCXN0cnVjdCBwZXJmX2hwcCAqaHBwLAogCQkJCUZJTEUgKmZwKQogeworCXN0cnVjdCBwZXJmX2hwcF9saXN0ICpocHBfbGlzdCA9IGhpc3RzLT5ocHBfbGlzdDsKIAlzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQ7CiAJdW5zaWduZWQgaW50IHdpZHRoOwogCWNvbnN0IGNoYXIgKnNlcCA9IHN5bWJvbF9jb25mLmZpZWxkX3NlcDsKIAlib29sIGZpcnN0ID0gdHJ1ZTsKKwlpbnQgbGluZTsKIAotCWhpc3RzX19mb3JfZWFjaF9mb3JtYXQoaGlzdHMsIGZtdCkgewotCQlpZiAocGVyZl9ocHBfX3Nob3VsZF9za2lwKGZtdCwgaGlzdHMpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFmaXJzdCkKLQkJCWZwcmludGYoZnAsICIlcyIsIHNlcCA/OiAiICAiKTsKLQkJZWxzZQotCQkJZmlyc3QgPSBmYWxzZTsKLQotCQlmbXQtPmhlYWRlcihmbXQsIGhwcCwgaGlzdHMpOwotCQlmcHJpbnRmKGZwLCAiJXMiLCBocHAtPmJ1Zik7CisJZm9yIChsaW5lID0gMDsgbGluZSA8IGhwcF9saXN0LT5ucl9oZWFkZXJfbGluZXM7IGxpbmUrKykgeworCQkvKiBmaXJzdCAjIGlzIGRpc3BsYXllZCBvbmUgbGV2ZWwgdXAgKi8KKwkJaWYgKGxpbmUpCisJCQlmcHJpbnRmKGZwLCAiIyAiKTsKKwkJZnByaW50Zl9saW5lKGhpc3RzLCBocHAsIGxpbmUsIGZwKTsKKwkJZnByaW50ZihmcCwgIlxuIik7CiAJfQogCi0JZnByaW50ZihmcCwgIlxuIik7Ci0KIAlpZiAoc2VwKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIGhwcF9saXN0LT5ucl9oZWFkZXJfbGluZXM7CiAKIAlmaXJzdCA9IHRydWU7CiAKQEAgLTY4OSwxMiArNjk5LDEyIEBACiAKIAlmcHJpbnRmKGZwLCAiXG4iKTsKIAlmcHJpbnRmKGZwLCAiI1xuIik7Ci0JcmV0dXJuIDM7CisJcmV0dXJuIGhwcF9saXN0LT5ucl9oZWFkZXJfbGluZXMgKyAyOwogfQogCi1zdGF0aWMgaW50IGhpc3RzX19mcHJpbnRmX2hlYWRlcnMoc3RydWN0IGhpc3RzICpoaXN0cywgRklMRSAqZnApCitpbnQgaGlzdHNfX2ZwcmludGZfaGVhZGVycyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBGSUxFICpmcCkKIHsKLQljaGFyIGJmWzk2XTsKKwljaGFyIGJmWzEwMjRdOwogCXN0cnVjdCBwZXJmX2hwcCBkdW1teV9ocHAgPSB7CiAJCS5idWYJPSBiZiwKIAkJLnNpemUJPSBzaXplb2YoYmYpLApAQCAtNzEzLDcgKzcyMyw2IEBACiAJCSAgICAgIGludCBtYXhfY29scywgZmxvYXQgbWluX3BjbnQsIEZJTEUgKmZwLAogCQkgICAgICBib29sIHVzZV9jYWxsY2hhaW4pCiB7Ci0Jc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OwogCXN0cnVjdCByYl9ub2RlICpuZDsKIAlzaXplX3QgcmV0ID0gMDsKIAljb25zdCBjaGFyICpzZXAgPSBzeW1ib2xfY29uZi5maWVsZF9zZXA7CkBAIC03MjQsOCArNzMzLDcgQEAKIAogCWluaXRfcmVtX2hpdHMoKTsKIAotCWhpc3RzX19mb3JfZWFjaF9mb3JtYXQoaGlzdHMsIGZtdCkKLQkJcGVyZl9ocHBfX3Jlc2V0X3dpZHRoKGZtdCwgaGlzdHMpOworCWhpc3RzX19yZXNldF9jb2x1bW5fd2lkdGgoaGlzdHMpOwogCiAJaWYgKHN5bWJvbF9jb25mLmNvbF93aWR0aF9saXN0X3N0cikKIAkJcGVyZl9ocHBfX3NldF91c2VyX3dpZHRoKHN5bWJvbF9jb25mLmNvbF93aWR0aF9saXN0X3N0cik7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvQnVpbGQgYi90b29scy9wZXJmL3V0aWwvQnVpbGQKaW5kZXggOTFjNWY2ZS4uZWI2MGU2MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL0J1aWxkCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9CdWlsZApAQCAtMSw1ICsxLDYgQEAKIGxpYnBlcmYteSArPSBhbGlhcy5vCiBsaWJwZXJmLXkgKz0gYW5ub3RhdGUubworbGlicGVyZi15ICs9IGJsb2NrLXJhbmdlLm8KIGxpYnBlcmYteSArPSBidWlsZC1pZC5vCiBsaWJwZXJmLXkgKz0gY29uZmlnLm8KIGxpYnBlcmYteSArPSBjdHlwZS5vCkBAIC04NSw2ICs4Niw3IEBACiBsaWJwZXJmLXkgKz0gaGVscC11bmtub3duLWNtZC5vCiBsaWJwZXJmLXkgKz0gbWVtLWV2ZW50cy5vCiBsaWJwZXJmLXkgKz0gdnNwcmludGYubworbGlicGVyZi15ICs9IGRydl9jb25maWdzLm8KIAogbGlicGVyZi0kKENPTkZJR19MSUJCUEYpICs9IGJwZi1sb2FkZXIubwogbGlicGVyZi0kKENPTkZJR19CUEZfUFJPTE9HVUUpICs9IGJwZi1wcm9sb2d1ZS5vCkBAIC05OCw2ICsxMDAsNyBAQAogCiBsaWJwZXJmLSQoQ09ORklHX0RXQVJGKSArPSBwcm9iZS1maW5kZXIubwogbGlicGVyZi0kKENPTkZJR19EV0FSRikgKz0gZHdhcmYtYXV4Lm8KK2xpYnBlcmYtJChDT05GSUdfRFdBUkYpICs9IGR3YXJmLXJlZ3MubwogCiBsaWJwZXJmLSQoQ09ORklHX0xJQkRXX0RXQVJGX1VOV0lORCkgKz0gdW53aW5kLWxpYmR3Lm8KIGxpYnBlcmYtJChDT05GSUdfTE9DQUxfTElCVU5XSU5EKSAgICArPSB1bndpbmQtbGlidW53aW5kLWxvY2FsLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5jIGIvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKaW5kZXggNDAyNGQzMC4uYWViNWE0NCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImFubm90YXRlLmgiCiAjaW5jbHVkZSAiZXZzZWwuaCIKKyNpbmNsdWRlICJibG9jay1yYW5nZS5oIgogI2luY2x1ZGUgPHJlZ2V4Lmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgpAQCAtNTMsNyArNTQsNyBAQAogCXJldHVybiBpbnNfX3Jhd19zY25wcmludGYoaW5zLCBiZiwgc2l6ZSwgb3BzKTsKIH0KIAotc3RhdGljIGludCBjYWxsX19wYXJzZShzdHJ1Y3QgaW5zX29wZXJhbmRzICpvcHMpCitzdGF0aWMgaW50IGNhbGxfX3BhcnNlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcywgc3RydWN0IG1hcCAqbWFwKQogewogCWNoYXIgKmVuZHB0ciwgKnRvaywgKm5hbWU7CiAKQEAgLTgxLDE2ICs4MiwxNiBAQAogCXJldHVybiBvcHMtPnRhcmdldC5uYW1lID09IE5VTEwgPyAtMSA6IDA7CiAKIGluZGlyZWN0X2NhbGw6Ci0JdG9rID0gc3RyY2hyKGVuZHB0ciwgJygnKTsKLQlpZiAodG9rICE9IE5VTEwpIHsKLQkJb3BzLT50YXJnZXQuYWRkciA9IDA7CisJdG9rID0gc3RyY2hyKGVuZHB0ciwgJyonKTsKKwlpZiAodG9rID09IE5VTEwpIHsKKwkJc3RydWN0IHN5bWJvbCAqc3ltID0gbWFwX19maW5kX3N5bWJvbChtYXAsIG1hcC0+bWFwX2lwKG1hcCwgb3BzLT50YXJnZXQuYWRkcikpOworCQlpZiAoc3ltICE9IE5VTEwpCisJCQlvcHMtPnRhcmdldC5uYW1lID0gc3RyZHVwKHN5bS0+bmFtZSk7CisJCWVsc2UKKwkJCW9wcy0+dGFyZ2V0LmFkZHIgPSAwOwogCQlyZXR1cm4gMDsKIAl9CiAKLQl0b2sgPSBzdHJjaHIoZW5kcHRyLCAnKicpOwotCWlmICh0b2sgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOwotCiAJb3BzLT50YXJnZXQuYWRkciA9IHN0cnRvdWxsKHRvayArIDEsIE5VTEwsIDE2KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExNyw3ICsxMTgsNyBAQAogCXJldHVybiBpbnMtPm9wcyA9PSAmY2FsbF9vcHM7CiB9CiAKLXN0YXRpYyBpbnQganVtcF9fcGFyc2Uoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzKQorc3RhdGljIGludCBqdW1wX19wYXJzZShzdHJ1Y3QgaW5zX29wZXJhbmRzICpvcHMsIHN0cnVjdCBtYXAgKm1hcCBfX21heWJlX3VudXNlZCkKIHsKIAljb25zdCBjaGFyICpzID0gc3RyY2hyKG9wcy0+cmF3LCAnKycpOwogCkBAIC0xNzIsNyArMTczLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsb2NrX19wYXJzZShzdHJ1Y3QgaW5zX29wZXJhbmRzICpvcHMpCitzdGF0aWMgaW50IGxvY2tfX3BhcnNlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcywgc3RydWN0IG1hcCAqbWFwKQogewogCWNoYXIgKm5hbWU7CiAKQEAgLTE5Myw3ICsxOTQsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChvcHMtPmxvY2tlZC5pbnMtPm9wcy0+cGFyc2UgJiYKLQkgICAgb3BzLT5sb2NrZWQuaW5zLT5vcHMtPnBhcnNlKG9wcy0+bG9ja2VkLm9wcykgPCAwKQorCSAgICBvcHMtPmxvY2tlZC5pbnMtPm9wcy0+cGFyc2Uob3BzLT5sb2NrZWQub3BzLCBtYXApIDwgMCkKIAkJZ290byBvdXRfZnJlZV9vcHM7CiAKIAlyZXR1cm4gMDsKQEAgLTIzNiw3ICsyMzcsNyBAQAogCS5zY25wcmludGYgPSBsb2NrX19zY25wcmludGYsCiB9OwogCi1zdGF0aWMgaW50IG1vdl9fcGFyc2Uoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzKQorc3RhdGljIGludCBtb3ZfX3BhcnNlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcywgc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkKQogewogCWNoYXIgKnMgPSBzdHJjaHIob3BzLT5yYXcsICcsJyksICp0YXJnZXQsICpjb21tZW50LCBwcmV2OwogCkBAIC0zMDMsNyArMzA0LDcgQEAKIAkuc2NucHJpbnRmID0gbW92X19zY25wcmludGYsCiB9OwogCi1zdGF0aWMgaW50IGRlY19fcGFyc2Uoc3RydWN0IGluc19vcGVyYW5kcyAqb3BzKQorc3RhdGljIGludCBkZWNfX3BhcnNlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcywgc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkKQogewogCWNoYXIgKnRhcmdldCwgKmNvbW1lbnQsICpzLCBwcmV2OwogCkBAIC00OTEsMTMgKzQ5Miw2IEBACiAJcmV0dXJuIGJzZWFyY2gobmFtZSwgaW5zdHJ1Y3Rpb25zLCBubWVtYiwgc2l6ZW9mKHN0cnVjdCBpbnMpLCBpbnNfX2tleV9jbXApOwogfQogCi1pbnQgc3ltYm9sX19hbm5vdGF0ZV9pbml0KHN0cnVjdCBtYXAgKm1hcCBfX21heWJlX3VudXNlZCwgc3RydWN0IHN5bWJvbCAqc3ltKQotewotCXN0cnVjdCBhbm5vdGF0aW9uICpub3RlcyA9IHN5bWJvbF9fYW5ub3RhdGlvbihzeW0pOwotCXB0aHJlYWRfbXV0ZXhfaW5pdCgmbm90ZXMtPmxvY2ssIE5VTEwpOwotCXJldHVybiAwOwotfQotCiBpbnQgc3ltYm9sX19hbGxvY19oaXN0KHN0cnVjdCBzeW1ib2wgKnN5bSkKIHsKIAlzdHJ1Y3QgYW5ub3RhdGlvbiAqbm90ZXMgPSBzeW1ib2xfX2Fubm90YXRpb24oc3ltKTsKQEAgLTcxNSw3ICs3MDksNyBAQAogCXJldHVybiBzeW1ib2xfX2luY19hZGRyX3NhbXBsZXMoaGUtPm1zLnN5bSwgaGUtPm1zLm1hcCwgZXZpZHgsIGlwKTsKIH0KIAotc3RhdGljIHZvaWQgZGlzYXNtX2xpbmVfX2luaXRfaW5zKHN0cnVjdCBkaXNhc21fbGluZSAqZGwpCitzdGF0aWMgdm9pZCBkaXNhc21fbGluZV9faW5pdF9pbnMoc3RydWN0IGRpc2FzbV9saW5lICpkbCwgc3RydWN0IG1hcCAqbWFwKQogewogCWRsLT5pbnMgPSBpbnNfX2ZpbmQoZGwtPm5hbWUpOwogCkBAIC03MjUsNyArNzE5LDcgQEAKIAlpZiAoIWRsLT5pbnMtPm9wcykKIAkJcmV0dXJuOwogCi0JaWYgKGRsLT5pbnMtPm9wcy0+cGFyc2UgJiYgZGwtPmlucy0+b3BzLT5wYXJzZSgmZGwtPm9wcykgPCAwKQorCWlmIChkbC0+aW5zLT5vcHMtPnBhcnNlICYmIGRsLT5pbnMtPm9wcy0+cGFyc2UoJmRsLT5vcHMsIG1hcCkgPCAwKQogCQlkbC0+aW5zID0gTlVMTDsKIH0KIApAQCAtNzY3LDcgKzc2MSw4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZGlzYXNtX2xpbmUgKmRpc2FzbV9saW5lX19uZXcoczY0IG9mZnNldCwgY2hhciAqbGluZSwKLQkJCQkJc2l6ZV90IHByaXZzaXplLCBpbnQgbGluZV9ucikKKwkJCQkJICAgIHNpemVfdCBwcml2c2l6ZSwgaW50IGxpbmVfbnIsCisJCQkJCSAgICBzdHJ1Y3QgbWFwICptYXApCiB7CiAJc3RydWN0IGRpc2FzbV9saW5lICpkbCA9IHphbGxvYyhzaXplb2YoKmRsKSArIHByaXZzaXplKTsKIApAQCAtNzgyLDcgKzc3Nyw3IEBACiAJCQlpZiAoZGlzYXNtX2xpbmVfX3BhcnNlKGRsLT5saW5lLCAmZGwtPm5hbWUsICZkbC0+b3BzLnJhdykgPCAwKQogCQkJCWdvdG8gb3V0X2ZyZWVfbGluZTsKIAotCQkJZGlzYXNtX2xpbmVfX2luaXRfaW5zKGRsKTsKKwkJCWRpc2FzbV9saW5lX19pbml0X2lucyhkbCwgbWFwKTsKIAkJfQogCX0KIApAQCAtODY2LDYgKzg2MSw4OSBAQAogCXJldHVybiBwZXJjZW50OwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqYW5ub3RhdGVfX2FkZHJlc3NfY29sb3Ioc3RydWN0IGJsb2NrX3JhbmdlICpicikKK3sKKwlkb3VibGUgY292ID0gYmxvY2tfcmFuZ2VfX2NvdmVyYWdlKGJyKTsKKworCWlmIChjb3YgPj0gMCkgeworCQkvKiBtYXJrIHJlZCBmb3IgPjc1JSBjb3ZlcmFnZSAqLworCQlpZiAoY292ID4gMC43NSkKKwkJCXJldHVybiBQRVJGX0NPTE9SX1JFRDsKKworCQkvKiBtYXJrIGR1bGwgZm9yIDwxJSBjb3ZlcmFnZSAqLworCQlpZiAoY292IDwgMC4wMSkKKwkJCXJldHVybiBQRVJGX0NPTE9SX05PUk1BTDsKKwl9CisKKwlyZXR1cm4gUEVSRl9DT0xPUl9NQUdFTlRBOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYW5ub3RhdGVfX2FzbV9jb2xvcihzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJyKQoreworCWRvdWJsZSBjb3YgPSBibG9ja19yYW5nZV9fY292ZXJhZ2UoYnIpOworCisJaWYgKGNvdiA+PSAwKSB7CisJCS8qIG1hcmsgZHVsbCBmb3IgPDElIGNvdmVyYWdlICovCisJCWlmIChjb3YgPCAwLjAxKQorCQkJcmV0dXJuIFBFUkZfQ09MT1JfTk9STUFMOworCX0KKworCXJldHVybiBQRVJGX0NPTE9SX0JMVUU7Cit9CisKK3N0YXRpYyB2b2lkIGFubm90YXRlX19icmFuY2hfcHJpbnRmKHN0cnVjdCBibG9ja19yYW5nZSAqYnIsIHU2NCBhZGRyKQoreworCWJvb2wgZW1pdF9jb21tZW50ID0gdHJ1ZTsKKworCWlmICghYnIpCisJCXJldHVybjsKKworI2lmIDEKKwlpZiAoYnItPmlzX3RhcmdldCAmJiBici0+c3RhcnQgPT0gYWRkcikgeworCQlzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJyYW5jaCA9IGJyOworCQlkb3VibGUgcDsKKworCQkvKgorCQkgKiBGaW5kIG1hdGNoaW5nIGJyYW5jaCB0byBvdXIgdGFyZ2V0LgorCQkgKi8KKwkJd2hpbGUgKCFicmFuY2gtPmlzX2JyYW5jaCkKKwkJCWJyYW5jaCA9IGJsb2NrX3JhbmdlX19uZXh0KGJyYW5jaCk7CisKKwkJcCA9IDEwMCAqKGRvdWJsZSlici0+ZW50cnkgLyBicmFuY2gtPmNvdmVyYWdlOworCisJCWlmIChwID4gMC4xKSB7CisJCQlpZiAoZW1pdF9jb21tZW50KSB7CisJCQkJZW1pdF9jb21tZW50ID0gZmFsc2U7CisJCQkJcHJpbnRmKCJcdCMiKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFRoZSBwZXJjZW50YWdlIG9mIGNvdmVyYWdlIGpvaW5lZCBhdCB0aGlzIHRhcmdldCBpbiByZWxhdGlvbgorCQkJICogdG8gdGhlIG5leHQgYnJhbmNoLgorCQkJICovCisJCQlwcmludGYoIiArJS4yZiUlIiwgcCk7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoYnItPmlzX2JyYW5jaCAmJiBici0+ZW5kID09IGFkZHIpIHsKKwkJZG91YmxlIHAgPSAxMDAqKGRvdWJsZSlici0+dGFrZW4gLyBici0+Y292ZXJhZ2U7CisKKwkJaWYgKHAgPiAwLjEpIHsKKwkJCWlmIChlbWl0X2NvbW1lbnQpIHsKKwkJCQllbWl0X2NvbW1lbnQgPSBmYWxzZTsKKwkJCQlwcmludGYoIlx0IyIpOworCQkJfQorCisJCQkvKgorCQkJICogVGhlIHBlcmNlbnRhZ2Ugb2YgY292ZXJhZ2UgbGVhdmluZyBhdCB0aGlzIGJyYW5jaCwgYW5kCisJCQkgKiBpdHMgcHJlZGljdGlvbiByYXRpby4KKwkJCSAqLworCQkJcHJpbnRmKCIgLSUuMmYlJSAocDolLjJmJSUpIiwgcCwgMTAwKihkb3VibGUpYnItPnByZWQgIC8gYnItPnRha2VuKTsKKwkJfQorCX0KK30KKworCiBzdGF0aWMgaW50IGRpc2FzbV9saW5lX19wcmludChzdHJ1Y3QgZGlzYXNtX2xpbmUgKmRsLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIHU2NCBzdGFydCwKIAkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCB1NjQgbGVuLCBpbnQgbWluX3BjbnQsIGludCBwcmludGVkLAogCQkgICAgICBpbnQgbWF4X2xpbmVzLCBzdHJ1Y3QgZGlzYXNtX2xpbmUgKnF1ZXVlKQpAQCAtODg1LDYgKzk2Myw3IEBACiAJCXM2NCBvZmZzZXQgPSBkbC0+b2Zmc2V0OwogCQljb25zdCB1NjQgYWRkciA9IHN0YXJ0ICsgb2Zmc2V0OwogCQlzdHJ1Y3QgZGlzYXNtX2xpbmUgKm5leHQ7CisJCXN0cnVjdCBibG9ja19yYW5nZSAqYnI7CiAKIAkJbmV4dCA9IGRpc2FzbV9fZ2V0X25leHRfaXBfbGluZSgmbm90ZXMtPnNyYy0+c291cmNlLCBkbCk7CiAKQEAgLTk1NCw4ICsxMDMzLDEyIEBACiAJCX0KIAogCQlwcmludGYoIiA6CSIpOwotCQljb2xvcl9mcHJpbnRmKHN0ZG91dCwgUEVSRl9DT0xPUl9NQUdFTlRBLCAiICAlIiBQUkl4NjQgIjoiLCBhZGRyKTsKLQkJY29sb3JfZnByaW50ZihzdGRvdXQsIFBFUkZfQ09MT1JfQkxVRSwgIiVzXG4iLCBkbC0+bGluZSk7CisKKwkJYnIgPSBibG9ja19yYW5nZV9fZmluZChhZGRyKTsKKwkJY29sb3JfZnByaW50ZihzdGRvdXQsIGFubm90YXRlX19hZGRyZXNzX2NvbG9yKGJyKSwgIiAgJSIgUFJJeDY0ICI6IiwgYWRkcik7CisJCWNvbG9yX2ZwcmludGYoc3Rkb3V0LCBhbm5vdGF0ZV9fYXNtX2NvbG9yKGJyKSwgIiVzIiwgZGwtPmxpbmUpOworCQlhbm5vdGF0ZV9fYnJhbmNoX3ByaW50ZihiciwgYWRkcik7CisJCXByaW50ZigiXG4iKTsKIAogCQlpZiAocHBlcmNlbnRzICE9ICZwZXJjZW50KQogCQkJZnJlZShwcGVyY2VudHMpOwpAQCAtMTA2Niw3ICsxMTQ5LDcgQEAKIAkJCXBhcnNlZF9saW5lID0gdG1wMiArIDE7CiAJfQogCi0JZGwgPSBkaXNhc21fbGluZV9fbmV3KG9mZnNldCwgcGFyc2VkX2xpbmUsIHByaXZzaXplLCAqbGluZV9ucik7CisJZGwgPSBkaXNhc21fbGluZV9fbmV3KG9mZnNldCwgcGFyc2VkX2xpbmUsIHByaXZzaXplLCAqbGluZV9uciwgbWFwKTsKIAlmcmVlKGxpbmUpOwogCSgqbGluZV9ucikrKzsKIApAQCAtMTA4NCw3ICsxMTY3LDcgQEAKIAkJCS5hZGRyID0gZGwtPm9wcy50YXJnZXQuYWRkciwKIAkJfTsKIAotCQlpZiAoIW1hcF9ncm91cHNfX2ZpbmRfYW1zKCZ0YXJnZXQsIE5VTEwpICYmCisJCWlmICghbWFwX2dyb3Vwc19fZmluZF9hbXMoJnRhcmdldCkgJiYKIAkJICAgIHRhcmdldC5zeW0tPnN0YXJ0ID09IHRhcmdldC5hbF9hZGRyKQogCQkJZGwtPm9wcy50YXJnZXQubmFtZSA9IHN0cmR1cCh0YXJnZXQuc3ltLT5uYW1lKTsKIAl9CkBAIC0xMTYyLDE0ICsxMjQ1LDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZHNvX19kaXNhc3NlbWJsZV9maWxlbmFtZShzdHJ1Y3QgZHNvICpkc28sIGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgZmlsZW5hbWVfc2l6ZSkKK3sKKwljaGFyIGxpbmtuYW1lW1BBVEhfTUFYXTsKKwljaGFyICpidWlsZF9pZF9maWxlbmFtZTsKKworCWlmIChkc28tPnN5bXRhYl90eXBlID09IERTT19CSU5BUllfVFlQRV9fS0FMTFNZTVMgJiYKKwkgICAgIWRzb19faXNfa2NvcmUoZHNvKSkKKwkJcmV0dXJuIFNZTUJPTF9BTk5PVEFURV9FUlJOT19fTk9fVk1MSU5VWDsKKworCWJ1aWxkX2lkX2ZpbGVuYW1lID0gZHNvX19idWlsZF9pZF9maWxlbmFtZShkc28sIE5VTEwsIDApOworCWlmIChidWlsZF9pZF9maWxlbmFtZSkgeworCQlfX3N5bWJvbF9fam9pbl9zeW1mcyhmaWxlbmFtZSwgZmlsZW5hbWVfc2l6ZSwgYnVpbGRfaWRfZmlsZW5hbWUpOworCQlmcmVlKGJ1aWxkX2lkX2ZpbGVuYW1lKTsKKwl9IGVsc2UgeworCQlpZiAoZHNvLT5oYXNfYnVpbGRfaWQpCisJCQlyZXR1cm4gRU5PTUVNOworCQlnb3RvIGZhbGxiYWNrOworCX0KKworCWlmIChkc29fX2lzX2tjb3JlKGRzbykgfHwKKwkgICAgcmVhZGxpbmsoZmlsZW5hbWUsIGxpbmtuYW1lLCBzaXplb2YobGlua25hbWUpKSA8IDAgfHwKKwkgICAgc3Ryc3RyKGxpbmtuYW1lLCBEU09fX05BTUVfS0FMTFNZTVMpIHx8CisJICAgIGFjY2VzcyhmaWxlbmFtZSwgUl9PSykpIHsKK2ZhbGxiYWNrOgorCQkvKgorCQkgKiBJZiB3ZSBkb24ndCBoYXZlIGJ1aWxkLWlkcyBvciB0aGUgYnVpbGQtaWQgZmlsZSBpc24ndCBpbiB0aGUKKwkJICogY2FjaGUsIG9yIGlzIGp1c3QgYSBrYWxsc3ltcyBmaWxlLCB3ZWxsLCBsZXRzIGhvcGUgdGhhdCB0aGlzCisJCSAqIERTTyBpcyB0aGUgc2FtZSBhcyB3aGVuICdwZXJmIHJlY29yZCcgcmFuLgorCQkgKi8KKwkJX19zeW1ib2xfX2pvaW5fc3ltZnMoZmlsZW5hbWUsIGZpbGVuYW1lX3NpemUsIGRzby0+bG9uZ19uYW1lKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogaW50IHN5bWJvbF9fZGlzYXNzZW1ibGUoc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3QgbWFwICptYXAsIHNpemVfdCBwcml2c2l6ZSkKIHsKIAlzdHJ1Y3QgZHNvICpkc28gPSBtYXAtPmRzbzsKLQljaGFyICpmaWxlbmFtZSA9IGRzb19fYnVpbGRfaWRfZmlsZW5hbWUoZHNvLCBOVUxMLCAwKTsKLQlib29sIGZyZWVfZmlsZW5hbWUgPSB0cnVlOwogCWNoYXIgY29tbWFuZFtQQVRIX01BWCAqIDJdOwogCUZJTEUgKmZpbGU7Ci0JaW50IGVyciA9IDA7CiAJY2hhciBzeW1mc19maWxlbmFtZVtQQVRIX01BWF07CiAJc3RydWN0IGtjb3JlX2V4dHJhY3Qga2NlOwogCWJvb2wgZGVsZXRlX2V4dHJhY3QgPSBmYWxzZTsKQEAgLTExNzcsMzggKzEyOTIsMTMgQEAKIAlpbnQgbGluZW5vID0gMDsKIAlpbnQgbmxpbmU7CiAJcGlkX3QgcGlkOworCWludCBlcnIgPSBkc29fX2Rpc2Fzc2VtYmxlX2ZpbGVuYW1lKGRzbywgc3ltZnNfZmlsZW5hbWUsIHNpemVvZihzeW1mc19maWxlbmFtZSkpOwogCi0JaWYgKGZpbGVuYW1lKQotCQlzeW1ib2xfX2pvaW5fc3ltZnMoc3ltZnNfZmlsZW5hbWUsIGZpbGVuYW1lKTsKLQotCWlmIChmaWxlbmFtZSA9PSBOVUxMKSB7Ci0JCWlmIChkc28tPmhhc19idWlsZF9pZCkKLQkJCXJldHVybiBFTk9NRU07Ci0JCWdvdG8gZmFsbGJhY2s7Ci0JfSBlbHNlIGlmIChkc29fX2lzX2tjb3JlKGRzbykgfHwKLQkJICAgcmVhZGxpbmsoc3ltZnNfZmlsZW5hbWUsIGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSkgPCAwIHx8Ci0JCSAgIHN0cnN0cihjb21tYW5kLCBEU09fX05BTUVfS0FMTFNZTVMpIHx8Ci0JCSAgIGFjY2VzcyhzeW1mc19maWxlbmFtZSwgUl9PSykpIHsKLQkJZnJlZShmaWxlbmFtZSk7Ci1mYWxsYmFjazoKLQkJLyoKLQkJICogSWYgd2UgZG9uJ3QgaGF2ZSBidWlsZC1pZHMgb3IgdGhlIGJ1aWxkLWlkIGZpbGUgaXNuJ3QgaW4gdGhlCi0JCSAqIGNhY2hlLCBvciBpcyBqdXN0IGEga2FsbHN5bXMgZmlsZSwgd2VsbCwgbGV0cyBob3BlIHRoYXQgdGhpcwotCQkgKiBEU08gaXMgdGhlIHNhbWUgYXMgd2hlbiAncGVyZiByZWNvcmQnIHJhbi4KLQkJICovCi0JCWZpbGVuYW1lID0gKGNoYXIgKilkc28tPmxvbmdfbmFtZTsKLQkJc3ltYm9sX19qb2luX3N5bWZzKHN5bWZzX2ZpbGVuYW1lLCBmaWxlbmFtZSk7Ci0JCWZyZWVfZmlsZW5hbWUgPSBmYWxzZTsKLQl9Ci0KLQlpZiAoZHNvLT5zeW10YWJfdHlwZSA9PSBEU09fQklOQVJZX1RZUEVfX0tBTExTWU1TICYmCi0JICAgICFkc29fX2lzX2tjb3JlKGRzbykpIHsKLQkJZXJyID0gU1lNQk9MX0FOTk9UQVRFX0VSUk5PX19OT19WTUxJTlVYOwotCQlnb3RvIG91dF9mcmVlX2ZpbGVuYW1lOwotCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJcHJfZGVidWcoIiVzOiBmaWxlbmFtZT0lcywgc3ltPSVzLCBzdGFydD0lIyIgUFJJeDY0ICIsIGVuZD0lIyIgUFJJeDY0ICJcbiIsIF9fZnVuY19fLAotCQkgZmlsZW5hbWUsIHN5bS0+bmFtZSwgbWFwLT51bm1hcF9pcChtYXAsIHN5bS0+c3RhcnQpLAorCQkgc3ltZnNfZmlsZW5hbWUsIHN5bS0+bmFtZSwgbWFwLT51bm1hcF9pcChtYXAsIHN5bS0+c3RhcnQpLAogCQkgbWFwLT51bm1hcF9pcChtYXAsIHN5bS0+ZW5kKSk7CiAKIAlwcl9kZWJ1ZygiYW5ub3RhdGluZyBbJXBdICUzMHMgOiBbJXBdICUzMHNcbiIsCkBAIC0xMjIzLDExICsxMzEzLDYgQEAKIAkJCWRlbGV0ZV9leHRyYWN0ID0gdHJ1ZTsKIAkJCXN0cmxjcHkoc3ltZnNfZmlsZW5hbWUsIGtjZS5leHRyYWN0X2ZpbGVuYW1lLAogCQkJCXNpemVvZihzeW1mc19maWxlbmFtZSkpOwotCQkJaWYgKGZyZWVfZmlsZW5hbWUpIHsKLQkJCQlmcmVlKGZpbGVuYW1lKTsKLQkJCQlmcmVlX2ZpbGVuYW1lID0gZmFsc2U7Ci0JCQl9Ci0JCQlmaWxlbmFtZSA9IHN5bWZzX2ZpbGVuYW1lOwogCQl9CiAJfSBlbHNlIGlmIChkc29fX25lZWRzX2RlY29tcHJlc3MoZHNvKSkgewogCQljaGFyIHRtcFtQQVRIX01BWF07CkBAIC0xMjM2LDE0ICsxMzIxLDE0IEBACiAJCWJvb2wgcmV0OwogCiAJCWlmIChrbW9kX3BhdGhfX3BhcnNlX2V4dCgmbSwgc3ltZnNfZmlsZW5hbWUpKQotCQkJZ290byBvdXRfZnJlZV9maWxlbmFtZTsKKwkJCWdvdG8gb3V0OwogCiAJCXNucHJpbnRmKHRtcCwgUEFUSF9NQVgsICIvdG1wL3BlcmYta21vZC1YWFhYWFgiKTsKIAogCQlmZCA9IG1rc3RlbXAodG1wKTsKIAkJaWYgKGZkIDwgMCkgewogCQkJZnJlZShtLmV4dCk7Ci0JCQlnb3RvIG91dF9mcmVlX2ZpbGVuYW1lOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQlyZXQgPSBkZWNvbXByZXNzX3RvX2ZpbGUobS5leHQsIHN5bWZzX2ZpbGVuYW1lLCBmZCk7CkBAIC0xMjU1LDcgKzEzNDAsNyBAQAogCQljbG9zZShmZCk7CiAKIAkJaWYgKCFyZXQpCi0JCQlnb3RvIG91dF9mcmVlX2ZpbGVuYW1lOworCQkJZ290byBvdXQ7CiAKIAkJc3RyY3B5KHN5bWZzX2ZpbGVuYW1lLCB0bXApOwogCX0KQEAgLTEyNzEsNyArMTM1Niw3IEBACiAJCSBtYXBfX3JpcF8yb2JqZHVtcChtYXAsIHN5bS0+ZW5kKSwKIAkJIHN5bWJvbF9jb25mLmFubm90YXRlX2FzbV9yYXcgPyAiIiA6ICItLW5vLXNob3ctcmF3IiwKIAkJIHN5bWJvbF9jb25mLmFubm90YXRlX3NyYyA/ICItUyIgOiAiIiwKLQkJIHN5bWZzX2ZpbGVuYW1lLCBmaWxlbmFtZSk7CisJCSBzeW1mc19maWxlbmFtZSwgc3ltZnNfZmlsZW5hbWUpOwogCiAJcHJfZGVidWcoIkV4ZWN1dGluZzogJXNcbiIsIGNvbW1hbmQpOwogCkBAIC0xMzMzLDExICsxNDE4LDEwIEBACiAKIAlpZiAoZHNvX19uZWVkc19kZWNvbXByZXNzKGRzbykpCiAJCXVubGluayhzeW1mc19maWxlbmFtZSk7Ci1vdXRfZnJlZV9maWxlbmFtZToKKwogCWlmIChkZWxldGVfZXh0cmFjdCkKIAkJa2NvcmVfZXh0cmFjdF9fZGVsZXRlKCZrY2UpOwotCWlmIChmcmVlX2ZpbGVuYW1lKQotCQlmcmVlKGZpbGVuYW1lKTsKK291dDoKIAlyZXR1cm4gZXJyOwogCiBvdXRfY2xvc2Vfc3Rkb3V0OgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Fubm90YXRlLmggYi90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuaAppbmRleCBmNjdjY2IwLi41YmJjZWMxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuaAorKysgYi90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuaApAQCAtMzYsNyArMzYsNyBAQAogCiBzdHJ1Y3QgaW5zX29wcyB7CiAJdm9pZCAoKmZyZWUpKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcyk7Ci0JaW50ICgqcGFyc2UpKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcyk7CisJaW50ICgqcGFyc2UpKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcywgc3RydWN0IG1hcCAqbWFwKTsKIAlpbnQgKCpzY25wcmludGYpKHN0cnVjdCBpbnMgKmlucywgY2hhciAqYmYsIHNpemVfdCBzaXplLAogCQkJIHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcyk7CiB9OwpAQCAtMTMwLDYgKzEzMCw3IEBACiAKIHN0cnVjdCBhbm5vdGF0aW9uIHsKIAlwdGhyZWFkX211dGV4X3QJCWxvY2s7CisJdTY0CQkJbWF4X2NvdmVyYWdlOwogCXN0cnVjdCBhbm5vdGF0ZWRfc291cmNlICpzcmM7CiB9OwogCkBAIC0xNzcsNyArMTc4LDYgQEAKIGludCBzeW1ib2xfX3N0cmVycm9yX2Rpc2Fzc2VtYmxlKHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IG1hcCAqbWFwLAogCQkJCSBpbnQgZXJybnVtLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pOwogCi1pbnQgc3ltYm9sX19hbm5vdGF0ZV9pbml0KHN0cnVjdCBtYXAgKm1hcCwgc3RydWN0IHN5bWJvbCAqc3ltKTsKIGludCBzeW1ib2xfX2Fubm90YXRlX3ByaW50ZihzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBtYXAgKm1hcCwKIAkJCSAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGJvb2wgZnVsbF9wYXRocywKIAkJCSAgICBpbnQgbWluX3BjbnQsIGludCBtYXhfbGluZXMsIGludCBjb250ZXh0KTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5jIGIvdG9vbHMvcGVyZi91dGlsL2F1eHRyYWNlLmMKaW5kZXggYzkxNjkwMS4uYzVhNmUwYjEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5jCkBAIC0xNiw2ICsxNiwxMCBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KQEAgLTM1LDkgKzM5LDE0IEBACiAjaW5jbHVkZSAiLi4vcGVyZi5oIgogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJldmxpc3QuaCIKKyNpbmNsdWRlICJkc28uaCIKKyNpbmNsdWRlICJtYXAuaCIKKyNpbmNsdWRlICJwbXUuaCIKKyNpbmNsdWRlICJldnNlbC5oIgogI2luY2x1ZGUgImNwdW1hcC5oIgogI2luY2x1ZGUgInRocmVhZF9tYXAuaCIKICNpbmNsdWRlICJhc20vYnVnLmgiCisjaW5jbHVkZSAic3ltYm9sL2thbGxzeW1zLmgiCiAjaW5jbHVkZSAiYXV4dHJhY2UuaCIKIAogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KQEAgLTg5Miw2ICs5MDEsNyBAQAogCQlyZXR1cm4gaW50ZWxfcHRfcHJvY2Vzc19hdXh0cmFjZV9pbmZvKGV2ZW50LCBzZXNzaW9uKTsKIAljYXNlIFBFUkZfQVVYVFJBQ0VfSU5URUxfQlRTOgogCQlyZXR1cm4gaW50ZWxfYnRzX3Byb2Nlc3NfYXV4dHJhY2VfaW5mbyhldmVudCwgc2Vzc2lvbik7CisJY2FzZSBQRVJGX0FVWFRSQUNFX0NTX0VUTToKIAljYXNlIFBFUkZfQVVYVFJBQ0VfVU5LTk9XTjoKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEzOTgsMyArMTQwOCw3MzEgQEAKIAogCXJldHVybiBOVUxMOwogfQorCitzdGF0aWMgdm9pZCBhZGRyX2ZpbHRlcl9fZnJlZV9zdHIoc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0KQoreworCWZyZWUoZmlsdC0+c3RyKTsKKwlmaWx0LT5hY3Rpb24gICA9IE5VTEw7CisJZmlsdC0+c3ltX2Zyb20gPSBOVUxMOworCWZpbHQtPnN5bV90byAgID0gTlVMTDsKKwlmaWx0LT5maWxlbmFtZSA9IE5VTEw7CisJZmlsdC0+c3RyICAgICAgPSBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJfZmlsdGVyICphZGRyX2ZpbHRlcl9fbmV3KHZvaWQpCit7CisJc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0ID0gemFsbG9jKHNpemVvZigqZmlsdCkpOworCisJaWYgKGZpbHQpCisJCUlOSVRfTElTVF9IRUFEKCZmaWx0LT5saXN0KTsKKworCXJldHVybiBmaWx0OworfQorCitzdGF0aWMgdm9pZCBhZGRyX2ZpbHRlcl9fZnJlZShzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJaWYgKGZpbHQpCisJCWFkZHJfZmlsdGVyX19mcmVlX3N0cihmaWx0KTsKKwlmcmVlKGZpbHQpOworfQorCitzdGF0aWMgdm9pZCBhZGRyX2ZpbHRlcnNfX2FkZChzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cywKKwkJCSAgICAgIHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCkKK3sKKwlsaXN0X2FkZF90YWlsKCZmaWx0LT5saXN0LCAmZmlsdHMtPmhlYWQpOworCWZpbHRzLT5jbnQgKz0gMTsKK30KKworc3RhdGljIHZvaWQgYWRkcl9maWx0ZXJzX19kZWwoc3RydWN0IGFkZHJfZmlsdGVycyAqZmlsdHMsCisJCQkgICAgICBzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJbGlzdF9kZWxfaW5pdCgmZmlsdC0+bGlzdCk7CisJZmlsdHMtPmNudCAtPSAxOworfQorCit2b2lkIGFkZHJfZmlsdGVyc19faW5pdChzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cykKK3sKKwlJTklUX0xJU1RfSEVBRCgmZmlsdHMtPmhlYWQpOworCWZpbHRzLT5jbnQgPSAwOworfQorCit2b2lkIGFkZHJfZmlsdGVyc19fZXhpdChzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cykKK3sKKwlzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQsICpuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZpbHQsIG4sICZmaWx0cy0+aGVhZCwgbGlzdCkgeworCQlhZGRyX2ZpbHRlcnNfX2RlbChmaWx0cywgZmlsdCk7CisJCWFkZHJfZmlsdGVyX19mcmVlKGZpbHQpOworCX0KK30KKworc3RhdGljIGludCBwYXJzZV9udW1fb3Jfc3RyKGNoYXIgKippbnAsIHU2NCAqbnVtLCBjb25zdCBjaGFyICoqc3RyLAorCQkJICAgIGNvbnN0IGNoYXIgKnN0cl9kZWxpbSkKK3sKKwkqaW5wICs9IHN0cnNwbigqaW5wLCAiICIpOworCisJaWYgKGlzZGlnaXQoKippbnApKSB7CisJCWNoYXIgKmVuZHB0cjsKKworCQlpZiAoIW51bSkKKwkJCXJldHVybiAtRUlOVkFMOworCQllcnJubyA9IDA7CisJCSpudW0gPSBzdHJ0b3VsbCgqaW5wLCAmZW5kcHRyLCAwKTsKKwkJaWYgKGVycm5vKQorCQkJcmV0dXJuIC1lcnJubzsKKwkJaWYgKGVuZHB0ciA9PSAqaW5wKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSppbnAgPSBlbmRwdHI7CisJfSBlbHNlIHsKKwkJc2l6ZV90IG47CisKKwkJaWYgKCFzdHIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJKmlucCArPSBzdHJzcG4oKmlucCwgIiAiKTsKKwkJKnN0ciA9ICppbnA7CisJCW4gPSBzdHJjc3BuKCppbnAsIHN0cl9kZWxpbSk7CisJCWlmICghbikKKwkJCXJldHVybiAtRUlOVkFMOworCQkqaW5wICs9IG47CisJCWlmICgqKmlucCkgeworCQkJKippbnAgPSAnXDAnOworCQkJKmlucCArPSAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2FjdGlvbihzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJaWYgKCFzdHJjbXAoZmlsdC0+YWN0aW9uLCAiZmlsdGVyIikpIHsKKwkJZmlsdC0+c3RhcnQgPSB0cnVlOworCQlmaWx0LT5yYW5nZSA9IHRydWU7CisJfSBlbHNlIGlmICghc3RyY21wKGZpbHQtPmFjdGlvbiwgInN0YXJ0IikpIHsKKwkJZmlsdC0+c3RhcnQgPSB0cnVlOworCX0gZWxzZSBpZiAoIXN0cmNtcChmaWx0LT5hY3Rpb24sICJzdG9wIikpIHsKKwkJZmlsdC0+c3RhcnQgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAoZmlsdC0+YWN0aW9uLCAidHJhY2VzdG9wIikpIHsKKwkJZmlsdC0+c3RhcnQgPSBmYWxzZTsKKwkJZmlsdC0+cmFuZ2UgPSB0cnVlOworCQlmaWx0LT5hY3Rpb24gKz0gNTsgLyogQ2hhbmdlICd0cmFjZXN0b3AnIHRvICdzdG9wJyAqLworCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9zeW1faWR4KGNoYXIgKippbnAsIGludCAqaWR4KQoreworCSppZHggPSAtMTsKKworCSppbnAgKz0gc3Ryc3BuKCppbnAsICIgIik7CisKKwlpZiAoKippbnAgIT0gJyMnKQorCQlyZXR1cm4gMDsKKworCSppbnAgKz0gMTsKKworCWlmICgqKmlucCA9PSAnZycgfHwgKippbnAgPT0gJ0cnKSB7CisJCSppbnAgKz0gMTsKKwkJKmlkeCA9IDA7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBudW07CisJCWNoYXIgKmVuZHB0cjsKKworCQllcnJubyA9IDA7CisJCW51bSA9IHN0cnRvdWwoKmlucCwgJmVuZHB0ciwgMCk7CisJCWlmIChlcnJubykKKwkJCXJldHVybiAtZXJybm87CisJCWlmIChlbmRwdHIgPT0gKmlucCB8fCBudW0gPiBJTlRfTUFYKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSppbnAgPSBlbmRwdHI7CisJCSppZHggPSBudW07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYWRkcl9zaXplKGNoYXIgKippbnAsIHU2NCAqbnVtLCBjb25zdCBjaGFyICoqc3RyLCBpbnQgKmlkeCkKK3sKKwlpbnQgZXJyID0gcGFyc2VfbnVtX29yX3N0cihpbnAsIG51bSwgc3RyLCAiICIpOworCisJaWYgKCFlcnIgJiYgKnN0cikKKwkJZXJyID0gcGFyc2Vfc3ltX2lkeChpbnAsIGlkeCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBhcnNlX29uZV9maWx0ZXIoc3RydWN0IGFkZHJfZmlsdGVyICpmaWx0LCBjb25zdCBjaGFyICoqZmlsdGVyX2lucCkKK3sKKwljaGFyICpmc3RyOworCWludCBlcnI7CisKKwlmaWx0LT5zdHIgPSBmc3RyID0gc3RyZHVwKCpmaWx0ZXJfaW5wKTsKKwlpZiAoIWZzdHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gcGFyc2VfbnVtX29yX3N0cigmZnN0ciwgTlVMTCwgJmZpbHQtPmFjdGlvbiwgIiAiKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9lcnI7CisKKwllcnIgPSBwYXJzZV9hY3Rpb24oZmlsdCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gcGFyc2VfYWRkcl9zaXplKCZmc3RyLCAmZmlsdC0+YWRkciwgJmZpbHQtPnN5bV9mcm9tLAorCQkJICAgICAgJmZpbHQtPnN5bV9mcm9tX2lkeCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZXJyOworCisJZnN0ciArPSBzdHJzcG4oZnN0ciwgIiAiKTsKKworCWlmICgqZnN0ciA9PSAnLycpIHsKKwkJZnN0ciArPSAxOworCQllcnIgPSBwYXJzZV9hZGRyX3NpemUoJmZzdHIsICZmaWx0LT5zaXplLCAmZmlsdC0+c3ltX3RvLAorCQkJCSAgICAgICZmaWx0LT5zeW1fdG9faWR4KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2VycjsKKwkJZmlsdC0+cmFuZ2UgPSB0cnVlOworCX0KKworCWZzdHIgKz0gc3Ryc3BuKGZzdHIsICIgIik7CisKKwlpZiAoKmZzdHIgPT0gJ0AnKSB7CisJCWZzdHIgKz0gMTsKKwkJZXJyID0gcGFyc2VfbnVtX29yX3N0cigmZnN0ciwgTlVMTCwgJmZpbHQtPmZpbGVuYW1lLCAiICwiKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlmc3RyICs9IHN0cnNwbihmc3RyLCAiICwiKTsKKworCSpmaWx0ZXJfaW5wICs9IGZzdHIgLSBmaWx0LT5zdHI7CisKKwlyZXR1cm4gMDsKKworb3V0X2VycjoKKwlhZGRyX2ZpbHRlcl9fZnJlZV9zdHIoZmlsdCk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYWRkcl9maWx0ZXJzX19wYXJzZV9iYXJlX2ZpbHRlcihzdHJ1Y3QgYWRkcl9maWx0ZXJzICpmaWx0cywKKwkJCQkgICAgY29uc3QgY2hhciAqZmlsdGVyKQoreworCXN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdDsKKwljb25zdCBjaGFyICpmc3RyID0gZmlsdGVyOworCWludCBlcnI7CisKKwl3aGlsZSAoKmZzdHIpIHsKKwkJZmlsdCA9IGFkZHJfZmlsdGVyX19uZXcoKTsKKwkJZXJyID0gcGFyc2Vfb25lX2ZpbHRlcihmaWx0LCAmZnN0cik7CisJCWlmIChlcnIpIHsKKwkJCWFkZHJfZmlsdGVyX19mcmVlKGZpbHQpOworCQkJYWRkcl9maWx0ZXJzX19leGl0KGZpbHRzKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJYWRkcl9maWx0ZXJzX19hZGQoZmlsdHMsIGZpbHQpOworCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc3ltX2FyZ3MgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJdTY0CQlzdGFydDsKKwl1NjQJCXNpemU7CisJaW50CQlpZHg7CisJaW50CQljbnQ7CisJYm9vbAkJc3RhcnRlZDsKKwlib29sCQlnbG9iYWw7CisJYm9vbAkJc2VsZWN0ZWQ7CisJYm9vbAkJZHVwbGljYXRlOworCWJvb2wJCW5lYXI7Cit9OworCitzdGF0aWMgYm9vbCBrZXJuX3N5bV9tYXRjaChzdHJ1Y3Qgc3ltX2FyZ3MgKmFyZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgdHlwZSkKK3sKKwkvKiBBIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgbmFtZSwgYW5kIGdsb2JhbCBvciB0aGUgbid0aCBmb3VuZCBvciBhbnkgKi8KKwlyZXR1cm4gc3ltYm9sX3R5cGVfX2lzX2EodHlwZSwgTUFQX19GVU5DVElPTikgJiYKKwkgICAgICAgIXN0cmNtcChuYW1lLCBhcmdzLT5uYW1lKSAmJgorCSAgICAgICAoKGFyZ3MtPmdsb2JhbCAmJiBpc3VwcGVyKHR5cGUpKSB8fAorCQkoYXJncy0+c2VsZWN0ZWQgJiYgKysoYXJncy0+Y250KSA9PSBhcmdzLT5pZHgpIHx8CisJCSghYXJncy0+Z2xvYmFsICYmICFhcmdzLT5zZWxlY3RlZCkpOworfQorCitzdGF0aWMgaW50IGZpbmRfa2Vybl9zeW1fY2Iodm9pZCAqYXJnLCBjb25zdCBjaGFyICpuYW1lLCBjaGFyIHR5cGUsIHU2NCBzdGFydCkKK3sKKwlzdHJ1Y3Qgc3ltX2FyZ3MgKmFyZ3MgPSBhcmc7CisKKwlpZiAoYXJncy0+c3RhcnRlZCkgeworCQlpZiAoIWFyZ3MtPnNpemUpCisJCQlhcmdzLT5zaXplID0gc3RhcnQgLSBhcmdzLT5zdGFydDsKKwkJaWYgKGFyZ3MtPnNlbGVjdGVkKSB7CisJCQlpZiAoYXJncy0+c2l6ZSkKKwkJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmIChrZXJuX3N5bV9tYXRjaChhcmdzLCBuYW1lLCB0eXBlKSkgeworCQkJYXJncy0+ZHVwbGljYXRlID0gdHJ1ZTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIGlmIChrZXJuX3N5bV9tYXRjaChhcmdzLCBuYW1lLCB0eXBlKSkgeworCQlhcmdzLT5zdGFydGVkID0gdHJ1ZTsKKwkJYXJncy0+c3RhcnQgPSBzdGFydDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludF9rZXJuX3N5bV9jYih2b2lkICphcmcsIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgdHlwZSwgdTY0IHN0YXJ0KQoreworCXN0cnVjdCBzeW1fYXJncyAqYXJncyA9IGFyZzsKKworCWlmIChrZXJuX3N5bV9tYXRjaChhcmdzLCBuYW1lLCB0eXBlKSkgeworCQlwcl9lcnIoIiMlZFx0MHglIlBSSXg2NCJcdCVjXHQlc1xuIiwKKwkJICAgICAgICsrYXJncy0+Y250LCBzdGFydCwgdHlwZSwgbmFtZSk7CisJCWFyZ3MtPm5lYXIgPSB0cnVlOworCX0gZWxzZSBpZiAoYXJncy0+bmVhcikgeworCQlhcmdzLT5uZWFyID0gZmFsc2U7CisJCXByX2VycigiXHRcdHdoaWNoIGlzIG5lYXJcdFx0JXNcbiIsIG5hbWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN5bV9ub3RfZm91bmRfZXJyb3IoY29uc3QgY2hhciAqc3ltX25hbWUsIGludCBpZHgpCit7CisJaWYgKGlkeCA+IDApIHsKKwkJcHJfZXJyKCJOJ3RoIG9jY3VycmVuY2UgKE49JWQpIG9mIHN5bWJvbCAnJXMnIG5vdCBmb3VuZC5cbiIsCisJCSAgICAgICBpZHgsIHN5bV9uYW1lKTsKKwl9IGVsc2UgaWYgKCFpZHgpIHsKKwkJcHJfZXJyKCJHbG9iYWwgc3ltYm9sICclcycgbm90IGZvdW5kLlxuIiwgc3ltX25hbWUpOworCX0gZWxzZSB7CisJCXByX2VycigiU3ltYm9sICclcycgbm90IGZvdW5kLlxuIiwgc3ltX25hbWUpOworCX0KKwlwcl9lcnIoIk5vdGUgdGhhdCBzeW1ib2xzIG11c3QgYmUgZnVuY3Rpb25zLlxuIik7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBmaW5kX2tlcm5fc3ltKGNvbnN0IGNoYXIgKnN5bV9uYW1lLCB1NjQgKnN0YXJ0LCB1NjQgKnNpemUsIGludCBpZHgpCit7CisJc3RydWN0IHN5bV9hcmdzIGFyZ3MgPSB7CisJCS5uYW1lID0gc3ltX25hbWUsCisJCS5pZHggPSBpZHgsCisJCS5nbG9iYWwgPSAhaWR4LAorCQkuc2VsZWN0ZWQgPSBpZHggPiAwLAorCX07CisJaW50IGVycjsKKworCSpzdGFydCA9IDA7CisJKnNpemUgPSAwOworCisJZXJyID0ga2FsbHN5bXNfX3BhcnNlKCIvcHJvYy9rYWxsc3ltcyIsICZhcmdzLCBmaW5kX2tlcm5fc3ltX2NiKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBwYXJzZSAvcHJvYy9rYWxsc3ltc1xuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKGFyZ3MuZHVwbGljYXRlKSB7CisJCXByX2VycigiTXVsdGlwbGUga2VybmVsIHN5bWJvbHMgd2l0aCBuYW1lICclcydcbiIsIHN5bV9uYW1lKTsKKwkJYXJncy5jbnQgPSAwOworCQlrYWxsc3ltc19fcGFyc2UoIi9wcm9jL2thbGxzeW1zIiwgJmFyZ3MsIHByaW50X2tlcm5fc3ltX2NiKTsKKwkJcHJfZXJyKCJEaXNhbWJpZ3VhdGUgc3ltYm9sIG5hbWUgYnkgaW5zZXJ0aW5nICNuIGFmdGVyIHRoZSBuYW1lIGUuZy4gJXMgIzJcbiIsCisJCSAgICAgICBzeW1fbmFtZSk7CisJCXByX2VycigiT3Igc2VsZWN0IGEgZ2xvYmFsIHN5bWJvbCBieSBpbnNlcnRpbmcgIzAgb3IgI2cgb3IgI0dcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWFyZ3Muc3RhcnRlZCkgeworCQlwcl9lcnIoIktlcm5lbCBzeW1ib2wgbG9va3VwOiAiKTsKKwkJcmV0dXJuIHN5bV9ub3RfZm91bmRfZXJyb3Ioc3ltX25hbWUsIGlkeCk7CisJfQorCisJKnN0YXJ0ID0gYXJncy5zdGFydDsKKwkqc2l6ZSA9IGFyZ3Muc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbmRfZW50aXJlX2tlcm5fY2Iodm9pZCAqYXJnLCBjb25zdCBjaGFyICpuYW1lIF9fbWF5YmVfdW51c2VkLAorCQkJICAgICAgIGNoYXIgdHlwZSwgdTY0IHN0YXJ0KQoreworCXN0cnVjdCBzeW1fYXJncyAqYXJncyA9IGFyZzsKKworCWlmICghc3ltYm9sX3R5cGVfX2lzX2EodHlwZSwgTUFQX19GVU5DVElPTikpCisJCXJldHVybiAwOworCisJaWYgKCFhcmdzLT5zdGFydGVkKSB7CisJCWFyZ3MtPnN0YXJ0ZWQgPSB0cnVlOworCQlhcmdzLT5zdGFydCA9IHN0YXJ0OworCX0KKwkvKiBEb24ndCBrbm93IGV4YWN0bHkgd2hlcmUgdGhlIGtlcm5lbCBlbmRzLCBzbyB3ZSBhZGQgYSBwYWdlICovCisJYXJncy0+c2l6ZSA9IHJvdW5kX3VwKHN0YXJ0LCBwYWdlX3NpemUpICsgcGFnZV9zaXplIC0gYXJncy0+c3RhcnQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRyX2ZpbHRlcl9fZW50aXJlX2tlcm5lbChzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJc3RydWN0IHN5bV9hcmdzIGFyZ3MgPSB7IC5zdGFydGVkID0gZmFsc2UgfTsKKwlpbnQgZXJyOworCisJZXJyID0ga2FsbHN5bXNfX3BhcnNlKCIvcHJvYy9rYWxsc3ltcyIsICZhcmdzLCBmaW5kX2VudGlyZV9rZXJuX2NiKTsKKwlpZiAoZXJyIDwgMCB8fCAhYXJncy5zdGFydGVkKSB7CisJCXByX2VycigiRmFpbGVkIHRvIHBhcnNlIC9wcm9jL2thbGxzeW1zXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmaWx0LT5hZGRyID0gYXJncy5zdGFydDsKKwlmaWx0LT5zaXplID0gYXJncy5zaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZW5kX2FmdGVyX3N0YXJ0KHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCwgdTY0IHN0YXJ0LCB1NjQgc2l6ZSkKK3sKKwlpZiAoc3RhcnQgKyBzaXplID49IGZpbHQtPmFkZHIpCisJCXJldHVybiAwOworCisJaWYgKGZpbHQtPnN5bV9mcm9tKSB7CisJCXByX2VycigiU3ltYm9sICclcycgKDB4JSJQUkl4NjQiKSBjb21lcyBiZWZvcmUgJyVzJyAoMHglIlBSSXg2NCIpXG4iLAorCQkgICAgICAgZmlsdC0+c3ltX3RvLCBzdGFydCwgZmlsdC0+c3ltX2Zyb20sIGZpbHQtPmFkZHIpOworCX0gZWxzZSB7CisJCXByX2VycigiU3ltYm9sICclcycgKDB4JSJQUkl4NjQiKSBjb21lcyBiZWZvcmUgYWRkcmVzcyAweCUiUFJJeDY0IilcbiIsCisJCSAgICAgICBmaWx0LT5zeW1fdG8sIHN0YXJ0LCBmaWx0LT5hZGRyKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZGRyX2ZpbHRlcl9fcmVzb2x2ZV9rZXJuZWxfc3ltcyhzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJYm9vbCBub19zaXplID0gZmFsc2U7CisJdTY0IHN0YXJ0LCBzaXplOworCWludCBlcnI7CisKKwlpZiAoc3ltYm9sX2NvbmYua3B0cl9yZXN0cmljdCkgeworCQlwcl9lcnIoIktlcm5lbCBhZGRyZXNzZXMgYXJlIHJlc3RyaWN0ZWQuIFVuYWJsZSB0byByZXNvbHZlIGtlcm5lbCBzeW1ib2xzLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChmaWx0LT5zeW1fZnJvbSAmJiAhc3RyY21wKGZpbHQtPnN5bV9mcm9tLCAiKiIpKQorCQlyZXR1cm4gYWRkcl9maWx0ZXJfX2VudGlyZV9rZXJuZWwoZmlsdCk7CisKKwlpZiAoZmlsdC0+c3ltX2Zyb20pIHsKKwkJZXJyID0gZmluZF9rZXJuX3N5bShmaWx0LT5zeW1fZnJvbSwgJnN0YXJ0LCAmc2l6ZSwKKwkJCQkgICAgZmlsdC0+c3ltX2Zyb21faWR4KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWZpbHQtPmFkZHIgPSBzdGFydDsKKwkJaWYgKGZpbHQtPnJhbmdlICYmICFmaWx0LT5zaXplICYmICFmaWx0LT5zeW1fdG8pIHsKKwkJCWZpbHQtPnNpemUgPSBzaXplOworCQkJbm9fc2l6ZSA9ICEhc2l6ZTsKKwkJfQorCX0KKworCWlmIChmaWx0LT5zeW1fdG8pIHsKKwkJZXJyID0gZmluZF9rZXJuX3N5bShmaWx0LT5zeW1fdG8sICZzdGFydCwgJnNpemUsCisJCQkJICAgIGZpbHQtPnN5bV90b19pZHgpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSBjaGVja19lbmRfYWZ0ZXJfc3RhcnQoZmlsdCwgc3RhcnQsIHNpemUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZmlsdC0+c2l6ZSA9IHN0YXJ0ICsgc2l6ZSAtIGZpbHQtPmFkZHI7CisJCW5vX3NpemUgPSAhIXNpemU7CisJfQorCisJLyogVGhlIHZlcnkgbGFzdCBzeW1ib2wgaW4ga2FsbHN5bXMgZG9lcyBub3QgaW1wbHkgYSBwYXJ0aWN1bGFyIHNpemUgKi8KKwlpZiAobm9fc2l6ZSkgeworCQlwcl9lcnIoIkNhbm5vdCBkZXRlcm1pbmUgc2l6ZSBvZiBzeW1ib2wgJyVzJ1xuIiwKKwkJICAgICAgIGZpbHQtPnN5bV90byA/IGZpbHQtPnN5bV90byA6IGZpbHQtPnN5bV9mcm9tKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHNvICpsb2FkX2Rzbyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBtYXAgKm1hcDsKKwlzdHJ1Y3QgZHNvICpkc287CisKKwltYXAgPSBkc29fX25ld19tYXAobmFtZSk7CisJaWYgKCFtYXApCisJCXJldHVybiBOVUxMOworCisJbWFwX19sb2FkKG1hcCk7CisKKwlkc28gPSBkc29fX2dldChtYXAtPmRzbyk7CisKKwltYXBfX3B1dChtYXApOworCisJcmV0dXJuIGRzbzsKK30KKworc3RhdGljIGJvb2wgZHNvX3N5bV9tYXRjaChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKm5hbWUsIGludCAqY250LAorCQkJICBpbnQgaWR4KQoreworCS8qIFNhbWUgbmFtZSwgYW5kIGdsb2JhbCBvciB0aGUgbid0aCBmb3VuZCBvciBhbnkgKi8KKwlyZXR1cm4gIWFyY2hfX2NvbXBhcmVfc3ltYm9sX25hbWVzKG5hbWUsIHN5bS0+bmFtZSkgJiYKKwkgICAgICAgKCghaWR4ICYmIHN5bS0+YmluZGluZyA9PSBTVEJfR0xPQkFMKSB8fAorCQkoaWR4ID4gMCAmJiArKypjbnQgPT0gaWR4KSB8fAorCQlpZHggPCAwKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZHVwbGljYXRlX3N5bXMoc3RydWN0IGRzbyAqZHNvLCBjb25zdCBjaGFyICpzeW1fbmFtZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJYm9vbCBuZWFyID0gZmFsc2U7CisJaW50IGNudCA9IDA7CisKKwlwcl9lcnIoIk11bHRpcGxlIHN5bWJvbHMgd2l0aCBuYW1lICclcydcbiIsIHN5bV9uYW1lKTsKKworCXN5bSA9IGRzb19fZmlyc3Rfc3ltYm9sKGRzbywgTUFQX19GVU5DVElPTik7CisJd2hpbGUgKHN5bSkgeworCQlpZiAoZHNvX3N5bV9tYXRjaChzeW0sIHN5bV9uYW1lLCAmY250LCAtMSkpIHsKKwkJCXByX2VycigiIyVkXHQweCUiUFJJeDY0Ilx0JWNcdCVzXG4iLAorCQkJICAgICAgICsrY250LCBzeW0tPnN0YXJ0LAorCQkJICAgICAgIHN5bS0+YmluZGluZyA9PSBTVEJfR0xPQkFMID8gJ2cnIDoKKwkJCSAgICAgICBzeW0tPmJpbmRpbmcgPT0gU1RCX0xPQ0FMICA/ICdsJyA6ICd3JywKKwkJCSAgICAgICBzeW0tPm5hbWUpOworCQkJbmVhciA9IHRydWU7CisJCX0gZWxzZSBpZiAobmVhcikgeworCQkJbmVhciA9IGZhbHNlOworCQkJcHJfZXJyKCJcdFx0d2hpY2ggaXMgbmVhclx0XHQlc1xuIiwgc3ltLT5uYW1lKTsKKwkJfQorCQlzeW0gPSBkc29fX25leHRfc3ltYm9sKHN5bSk7CisJfQorCisJcHJfZXJyKCJEaXNhbWJpZ3VhdGUgc3ltYm9sIG5hbWUgYnkgaW5zZXJ0aW5nICNuIGFmdGVyIHRoZSBuYW1lIGUuZy4gJXMgIzJcbiIsCisJICAgICAgIHN5bV9uYW1lKTsKKwlwcl9lcnIoIk9yIHNlbGVjdCBhIGdsb2JhbCBzeW1ib2wgYnkgaW5zZXJ0aW5nICMwIG9yICNnIG9yICNHXG4iKTsKK30KKworc3RhdGljIGludCBmaW5kX2Rzb19zeW0oc3RydWN0IGRzbyAqZHNvLCBjb25zdCBjaGFyICpzeW1fbmFtZSwgdTY0ICpzdGFydCwKKwkJCXU2NCAqc2l6ZSwgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJaW50IGNudCA9IDA7CisKKwkqc3RhcnQgPSAwOworCSpzaXplID0gMDsKKworCXN5bSA9IGRzb19fZmlyc3Rfc3ltYm9sKGRzbywgTUFQX19GVU5DVElPTik7CisJd2hpbGUgKHN5bSkgeworCQlpZiAoKnN0YXJ0KSB7CisJCQlpZiAoISpzaXplKQorCQkJCSpzaXplID0gc3ltLT5zdGFydCAtICpzdGFydDsKKwkJCWlmIChpZHggPiAwKSB7CisJCQkJaWYgKCpzaXplKQorCQkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSBpZiAoZHNvX3N5bV9tYXRjaChzeW0sIHN5bV9uYW1lLCAmY250LCBpZHgpKSB7CisJCQkJcHJpbnRfZHVwbGljYXRlX3N5bXMoZHNvLCBzeW1fbmFtZSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSBpZiAoZHNvX3N5bV9tYXRjaChzeW0sIHN5bV9uYW1lLCAmY250LCBpZHgpKSB7CisJCQkqc3RhcnQgPSBzeW0tPnN0YXJ0OworCQkJKnNpemUgPSBzeW0tPmVuZCAtIHN5bS0+c3RhcnQ7CisJCX0KKwkJc3ltID0gZHNvX19uZXh0X3N5bWJvbChzeW0pOworCX0KKworCWlmICghKnN0YXJ0KQorCQlyZXR1cm4gc3ltX25vdF9mb3VuZF9lcnJvcihzeW1fbmFtZSwgaWR4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZHJfZmlsdGVyX19lbnRpcmVfZHNvKHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCwgc3RydWN0IGRzbyAqZHNvKQoreworCXN0cnVjdCBzeW1ib2wgKmZpcnN0X3N5bSA9IGRzb19fZmlyc3Rfc3ltYm9sKGRzbywgTUFQX19GVU5DVElPTik7CisJc3RydWN0IHN5bWJvbCAqbGFzdF9zeW0gPSBkc29fX2xhc3Rfc3ltYm9sKGRzbywgTUFQX19GVU5DVElPTik7CisKKwlpZiAoIWZpcnN0X3N5bSB8fCAhbGFzdF9zeW0pIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gZGV0ZXJtaW5lIGZpbHRlciBmb3IgJXNcbk5vIHN5bWJvbHMgZm91bmQuXG4iLAorCQkgICAgICAgZmlsdC0+ZmlsZW5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmaWx0LT5hZGRyID0gZmlyc3Rfc3ltLT5zdGFydDsKKwlmaWx0LT5zaXplID0gbGFzdF9zeW0tPmVuZCAtIGZpcnN0X3N5bS0+c3RhcnQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRyX2ZpbHRlcl9fcmVzb2x2ZV9zeW1zKHN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdCkKK3sKKwl1NjQgc3RhcnQsIHNpemU7CisJc3RydWN0IGRzbyAqZHNvOworCWludCBlcnIgPSAwOworCisJaWYgKCFmaWx0LT5zeW1fZnJvbSAmJiAhZmlsdC0+c3ltX3RvKQorCQlyZXR1cm4gMDsKKworCWlmICghZmlsdC0+ZmlsZW5hbWUpCisJCXJldHVybiBhZGRyX2ZpbHRlcl9fcmVzb2x2ZV9rZXJuZWxfc3ltcyhmaWx0KTsKKworCWRzbyA9IGxvYWRfZHNvKGZpbHQtPmZpbGVuYW1lKTsKKwlpZiAoIWRzbykgeworCQlwcl9lcnIoIkZhaWxlZCB0byBsb2FkIHN5bWJvbHMgZnJvbTogJXNcbiIsIGZpbHQtPmZpbGVuYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZpbHQtPnN5bV9mcm9tICYmICFzdHJjbXAoZmlsdC0+c3ltX2Zyb20sICIqIikpIHsKKwkJZXJyID0gYWRkcl9maWx0ZXJfX2VudGlyZV9kc28oZmlsdCwgZHNvKTsKKwkJZ290byBwdXRfZHNvOworCX0KKworCWlmIChmaWx0LT5zeW1fZnJvbSkgeworCQllcnIgPSBmaW5kX2Rzb19zeW0oZHNvLCBmaWx0LT5zeW1fZnJvbSwgJnN0YXJ0LCAmc2l6ZSwKKwkJCQkgICBmaWx0LT5zeW1fZnJvbV9pZHgpOworCQlpZiAoZXJyKQorCQkJZ290byBwdXRfZHNvOworCQlmaWx0LT5hZGRyID0gc3RhcnQ7CisJCWlmIChmaWx0LT5yYW5nZSAmJiAhZmlsdC0+c2l6ZSAmJiAhZmlsdC0+c3ltX3RvKQorCQkJZmlsdC0+c2l6ZSA9IHNpemU7CisJfQorCisJaWYgKGZpbHQtPnN5bV90bykgeworCQllcnIgPSBmaW5kX2Rzb19zeW0oZHNvLCBmaWx0LT5zeW1fdG8sICZzdGFydCwgJnNpemUsCisJCQkJICAgZmlsdC0+c3ltX3RvX2lkeCk7CisJCWlmIChlcnIpCisJCQlnb3RvIHB1dF9kc287CisKKwkJZXJyID0gY2hlY2tfZW5kX2FmdGVyX3N0YXJ0KGZpbHQsIHN0YXJ0LCBzaXplKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZmlsdC0+c2l6ZSA9IHN0YXJ0ICsgc2l6ZSAtIGZpbHQtPmFkZHI7CisJfQorCitwdXRfZHNvOgorCWRzb19fcHV0KGRzbyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY2hhciAqYWRkcl9maWx0ZXJfX3RvX3N0cihzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQpCit7CisJY2hhciBmaWxlbmFtZV9idWZbUEFUSF9NQVhdOworCWNvbnN0IGNoYXIgKmF0ID0gIiI7CisJY29uc3QgY2hhciAqZm4gPSAiIjsKKwljaGFyICpmaWx0ZXI7CisJaW50IGVycjsKKworCWlmIChmaWx0LT5maWxlbmFtZSkgeworCQlhdCA9ICJAIjsKKwkJZm4gPSByZWFscGF0aChmaWx0LT5maWxlbmFtZSwgZmlsZW5hbWVfYnVmKTsKKwkJaWYgKCFmbikKKwkJCXJldHVybiBOVUxMOworCX0KKworCWlmIChmaWx0LT5yYW5nZSkgeworCQllcnIgPSBhc3ByaW50ZigmZmlsdGVyLCAiJXMgMHglIlBSSXg2NCIvMHglIlBSSXg2NCIlcyVzIiwKKwkJCSAgICAgICBmaWx0LT5hY3Rpb24sIGZpbHQtPmFkZHIsIGZpbHQtPnNpemUsIGF0LCBmbik7CisJfSBlbHNlIHsKKwkJZXJyID0gYXNwcmludGYoJmZpbHRlciwgIiVzIDB4JSJQUkl4NjQiJXMlcyIsCisJCQkgICAgICAgZmlsdC0+YWN0aW9uLCBmaWx0LT5hZGRyLCBhdCwgZm4pOworCX0KKworCXJldHVybiBlcnIgPCAwID8gTlVMTCA6IGZpbHRlcjsKK30KKworc3RhdGljIGludCBwYXJzZV9hZGRyX2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGNvbnN0IGNoYXIgKmZpbHRlciwKKwkJCSAgICAgaW50IG1heF9ucikKK3sKKwlzdHJ1Y3QgYWRkcl9maWx0ZXJzIGZpbHRzOworCXN0cnVjdCBhZGRyX2ZpbHRlciAqZmlsdDsKKwlpbnQgZXJyOworCisJYWRkcl9maWx0ZXJzX19pbml0KCZmaWx0cyk7CisKKwllcnIgPSBhZGRyX2ZpbHRlcnNfX3BhcnNlX2JhcmVfZmlsdGVyKCZmaWx0cywgZmlsdGVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9leGl0OworCisJaWYgKGZpbHRzLmNudCA+IG1heF9ucikgeworCQlwcl9lcnIoIkVycm9yOiBudW1iZXIgb2YgYWRkcmVzcyBmaWx0ZXJzICglZCkgZXhjZWVkcyBtYXhpbXVtICglZClcbiIsCisJCSAgICAgICBmaWx0cy5jbnQsIG1heF9ucik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2V4aXQ7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmaWx0LCAmZmlsdHMuaGVhZCwgbGlzdCkgeworCQljaGFyICpuZXdfZmlsdGVyOworCisJCWVyciA9IGFkZHJfZmlsdGVyX19yZXNvbHZlX3N5bXMoZmlsdCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9leGl0OworCisJCW5ld19maWx0ZXIgPSBhZGRyX2ZpbHRlcl9fdG9fc3RyKGZpbHQpOworCQlpZiAoIW5ld19maWx0ZXIpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9leGl0OworCQl9CisKKwkJaWYgKHBlcmZfZXZzZWxfX2FwcGVuZF9hZGRyX2ZpbHRlcihldnNlbCwgbmV3X2ZpbHRlcikpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9leGl0OworCQl9CisJfQorCitvdXRfZXhpdDoKKwlhZGRyX2ZpbHRlcnNfX2V4aXQoJmZpbHRzKTsKKworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcGFyc2UgYWRkcmVzcyBmaWx0ZXI6ICclcydcbiIsIGZpbHRlcik7CisJCXByX2VycigiRmlsdGVyIGZvcm1hdCBpczogZmlsdGVyfHN0YXJ0fHN0b3B8dHJhY2VzdG9wIDxzdGFydCBzeW1ib2wgb3IgYWRkcmVzcz4gWy8gPGVuZCBzeW1ib2wgb3Igc2l6ZT5dIFtAPGZpbGUgbmFtZT5dXG4iKTsKKwkJcHJfZXJyKCJXaGVyZSBtdWx0aXBsZSBmaWx0ZXJzIGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2Ugb3IgY29tbWEuXG4iKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHBlcmZfcG11ICpwZXJmX2V2c2VsX19maW5kX3BtdShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpCit7CisJc3RydWN0IHBlcmZfcG11ICpwbXUgPSBOVUxMOworCisJd2hpbGUgKChwbXUgPSBwZXJmX3BtdV9fc2NhbihwbXUpKSAhPSBOVUxMKSB7CisJCWlmIChwbXUtPnR5cGUgPT0gZXZzZWwtPmF0dHIudHlwZSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBwbXU7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9ldnNlbF9fbnJfYWRkcl9maWx0ZXIoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsKQoreworCXN0cnVjdCBwZXJmX3BtdSAqcG11ID0gcGVyZl9ldnNlbF9fZmluZF9wbXUoZXZzZWwpOworCWludCBucl9hZGRyX2ZpbHRlcnMgPSAwOworCisJaWYgKCFwbXUpCisJCXJldHVybiAwOworCisJcGVyZl9wbXVfX3NjYW5fZmlsZShwbXUsICJucl9hZGRyX2ZpbHRlcnMiLCAiJWQiLCAmbnJfYWRkcl9maWx0ZXJzKTsKKworCXJldHVybiBucl9hZGRyX2ZpbHRlcnM7Cit9CisKK2ludCBhdXh0cmFjZV9wYXJzZV9maWx0ZXJzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKwljaGFyICpmaWx0ZXI7CisJaW50IGVyciwgbWF4X25yOworCisJZXZsaXN0X19mb3JfZWFjaF9lbnRyeShldmxpc3QsIGV2c2VsKSB7CisJCWZpbHRlciA9IGV2c2VsLT5maWx0ZXI7CisJCW1heF9uciA9IHBlcmZfZXZzZWxfX25yX2FkZHJfZmlsdGVyKGV2c2VsKTsKKwkJaWYgKCFmaWx0ZXIgfHwgIW1heF9ucikKKwkJCWNvbnRpbnVlOworCQlldnNlbC0+ZmlsdGVyID0gTlVMTDsKKwkJZXJyID0gcGFyc2VfYWRkcl9maWx0ZXIoZXZzZWwsIGZpbHRlciwgbWF4X25yKTsKKwkJZnJlZShmaWx0ZXIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJcHJfZGVidWcoIkFkZHJlc3MgZmlsdGVyOiAlc1xuIiwgZXZzZWwtPmZpbHRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYXV4dHJhY2UuaCBiL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5oCmluZGV4IGFjNWYwZDcuLjI2ZmIxZWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9hdXh0cmFjZS5oCkBAIC00MSw2ICs0MSw3IEBACiAJUEVSRl9BVVhUUkFDRV9VTktOT1dOLAogCVBFUkZfQVVYVFJBQ0VfSU5URUxfUFQsCiAJUEVSRl9BVVhUUkFDRV9JTlRFTF9CVFMsCisJUEVSRl9BVVhUUkFDRV9DU19FVE0sCiB9OwogCiBlbnVtIGl0cmFjZV9wZXJpb2RfdHlwZSB7CkBAIC0zMTcsNiArMzE4LDQ4IEBACiAJdW5zaWduZWQgaW50IGFsaWdubWVudDsKIH07CiAKKy8qKgorICogc3RydWN0IGFkZHJfZmlsdGVyIC0gYWRkcmVzcyBmaWx0ZXIuCisgKiBAbGlzdDogbGlzdCBub2RlCisgKiBAcmFuZ2U6IHRydWUgaWYgaXQgaXMgYSByYW5nZSBmaWx0ZXIKKyAqIEBzdGFydDogdHJ1ZSBpZiBhY3Rpb24gaXMgJ2ZpbHRlcicgb3IgJ3N0YXJ0JworICogQGFjdGlvbjogJ2ZpbHRlcicsICdzdGFydCcgb3IgJ3N0b3AnICgndHJhY2VzdG9wJyBpcyBhY2NlcHRlZCBidXQgY29udmVydGVkCisgKiAgICAgICAgICB0byAnc3RvcCcpCisgKiBAc3ltX2Zyb206IHN5bWJvbCBuYW1lIGZvciB0aGUgZmlsdGVyIGFkZHJlc3MKKyAqIEBzeW1fdG86IHN5bWJvbCBuYW1lIHRoYXQgZGV0ZXJtaW5lcyB0aGUgZmlsdGVyIHNpemUKKyAqIEBzeW1fZnJvbV9pZHg6IHNlbGVjdHMgbid0aCBmcm9tIHN5bWJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lICgwIG1lYW5zIGdsb2JhbAorICogICAgICAgICAgICAgICAgYW5kIGxlc3MgdGhhbiAwIG1lYW5zIHN5bWJvbCBtdXN0IGJlIHVuaXF1ZSkKKyAqIEBzeW1fdG9faWR4OiBzYW1lIGFzIEBzeW1fZnJvbV9pZHggYnV0IGZvciBAc3ltX3RvCisgKiBAYWRkcjogZmlsdGVyIGFkZHJlc3MKKyAqIEBzaXplOiBmaWx0ZXIgcmVnaW9uIHNpemUgKGZvciByYW5nZSBmaWx0ZXJzKQorICogQGZpbGVuYW1lOiBEU08gZmlsZSBuYW1lIG9yIE5VTEwgZm9yIHRoZSBrZXJuZWwKKyAqIEBzdHI6IGFsbG9jYXRlZCBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgb3RoZXIgc3RyaW5nIG1lbWJlcnMKKyAqLworc3RydWN0IGFkZHJfZmlsdGVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJYm9vbAkJCXJhbmdlOworCWJvb2wJCQlzdGFydDsKKwljb25zdCBjaGFyCQkqYWN0aW9uOworCWNvbnN0IGNoYXIJCSpzeW1fZnJvbTsKKwljb25zdCBjaGFyCQkqc3ltX3RvOworCWludAkJCXN5bV9mcm9tX2lkeDsKKwlpbnQJCQlzeW1fdG9faWR4OworCXU2NAkJCWFkZHI7CisJdTY0CQkJc2l6ZTsKKwljb25zdCBjaGFyCQkqZmlsZW5hbWU7CisJY2hhcgkJCSpzdHI7Cit9OworCisvKioKKyAqIHN0cnVjdCBhZGRyX2ZpbHRlcnMgLSBsaXN0IG9mIGFkZHJlc3MgZmlsdGVycy4KKyAqIEBoZWFkOiBsaXN0IG9mIGFkZHJlc3MgZmlsdGVycworICogQGNudDogbnVtYmVyIG9mIGFkZHJlc3MgZmlsdGVycworICovCitzdHJ1Y3QgYWRkcl9maWx0ZXJzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWhlYWQ7CisJaW50CQkJY250OworfTsKKwogI2lmZGVmIEhBVkVfQVVYVFJBQ0VfU1VQUE9SVAogCiAvKgpAQCAtNDgxLDYgKzUyNCwxMiBAQAogCQkJCSAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50KTsKIHZvaWQgZXZlbnRzX3N0YXRzX19hdXh0cmFjZV9lcnJvcl93YXJuKGNvbnN0IHN0cnVjdCBldmVudHNfc3RhdHMgKnN0YXRzKTsKIAordm9pZCBhZGRyX2ZpbHRlcnNfX2luaXQoc3RydWN0IGFkZHJfZmlsdGVycyAqZmlsdHMpOwordm9pZCBhZGRyX2ZpbHRlcnNfX2V4aXQoc3RydWN0IGFkZHJfZmlsdGVycyAqZmlsdHMpOworaW50IGFkZHJfZmlsdGVyc19fcGFyc2VfYmFyZV9maWx0ZXIoc3RydWN0IGFkZHJfZmlsdGVycyAqZmlsdHMsCisJCQkJICAgIGNvbnN0IGNoYXIgKmZpbHRlcik7CitpbnQgYXV4dHJhY2VfcGFyc2VfZmlsdGVycyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CisKIHN0YXRpYyBpbmxpbmUgaW50IGF1eHRyYWNlX19wcm9jZXNzX2V2ZW50KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCiAJCQkJCSAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJCSAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCkBAIC02MzksNiArNjg4LDEyIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUKK2ludCBhdXh0cmFjZV9wYXJzZV9maWx0ZXJzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0IF9fbWF5YmVfdW51c2VkKQoreworCXJldHVybiAwOworfQorCiBpbnQgYXV4dHJhY2VfbW1hcF9fbW1hcChzdHJ1Y3QgYXV4dHJhY2VfbW1hcCAqbW0sCiAJCQlzdHJ1Y3QgYXV4dHJhY2VfbW1hcF9wYXJhbXMgKm1wLAogCQkJdm9pZCAqdXNlcnBnLCBpbnQgZmQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Jsb2NrLXJhbmdlLmMgYi90b29scy9wZXJmL3V0aWwvYmxvY2stcmFuZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjNlMWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Jsb2NrLXJhbmdlLmMKQEAgLTAsMCArMSwzMjggQEAKKyNpbmNsdWRlICJibG9jay1yYW5nZS5oIgorI2luY2x1ZGUgImFubm90YXRlLmgiCisKK3N0cnVjdCB7CisJc3RydWN0IHJiX3Jvb3Qgcm9vdDsKKwl1NjQgYmxvY2tzOworfSBibG9ja19yYW5nZXM7CisKK3N0YXRpYyB2b2lkIGJsb2NrX3JhbmdlX19kZWJ1Zyh2b2lkKQoreworCS8qCisJICogWFhYIHN0aWxsIHBhcmFub2lkIGZvciBub3c7IHNlZSBpZiB3ZSBjYW4gbWFrZSB0aGlzIGRlcGVuZCBvbgorCSAqIERFQlVHPTEgYnVpbGRzLgorCSAqLworI2lmIDEKKwlzdHJ1Y3QgcmJfbm9kZSAqcmI7CisJdTY0IG9sZCA9IDA7IC8qIE5VTEwgaXNuJ3QgZXhlY3V0YWJsZSAqLworCisJZm9yIChyYiA9IHJiX2ZpcnN0KCZibG9ja19yYW5nZXMucm9vdCk7IHJiOyByYiA9IHJiX25leHQocmIpKSB7CisJCXN0cnVjdCBibG9ja19yYW5nZSAqZW50cnkgPSByYl9lbnRyeShyYiwgc3RydWN0IGJsb2NrX3JhbmdlLCBub2RlKTsKKworCQlhc3NlcnQob2xkIDwgZW50cnktPnN0YXJ0KTsKKwkJYXNzZXJ0KGVudHJ5LT5zdGFydCA8PSBlbnRyeS0+ZW5kKTsgLyogc2luZ2xlIGluc3RydWN0aW9uIGJsb2NrOyBqdW1wIHRvIGEganVtcCAqLworCisJCW9sZCA9IGVudHJ5LT5lbmQ7CisJfQorI2VuZGlmCit9CisKK3N0cnVjdCBibG9ja19yYW5nZSAqYmxvY2tfcmFuZ2VfX2ZpbmQodTY0IGFkZHIpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJmJsb2NrX3Jhbmdlcy5yb290LnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGJsb2NrX3JhbmdlICplbnRyeTsKKworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCXBhcmVudCA9ICpwOworCQllbnRyeSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGJsb2NrX3JhbmdlLCBub2RlKTsKKworCQlpZiAoYWRkciA8IGVudHJ5LT5zdGFydCkKKwkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OworCQllbHNlIGlmIChhZGRyID4gZW50cnktPmVuZCkKKwkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIGVudHJ5OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmJfbGlua19sZWZ0X29mX25vZGUoc3RydWN0IHJiX25vZGUgKmxlZnQsIHN0cnVjdCByYl9ub2RlICpub2RlKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZub2RlLT5yYl9sZWZ0OworCXdoaWxlICgqcCkgeworCQlub2RlID0gKnA7CisJCXAgPSAmbm9kZS0+cmJfcmlnaHQ7CisJfQorCXJiX2xpbmtfbm9kZShsZWZ0LCBub2RlLCBwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJiX2xpbmtfcmlnaHRfb2Zfbm9kZShzdHJ1Y3QgcmJfbm9kZSAqcmlnaHQsIHN0cnVjdCByYl9ub2RlICpub2RlKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZub2RlLT5yYl9yaWdodDsKKwl3aGlsZSAoKnApIHsKKwkJbm9kZSA9ICpwOworCQlwID0gJm5vZGUtPnJiX2xlZnQ7CisJfQorCXJiX2xpbmtfbm9kZShyaWdodCwgbm9kZSwgcCk7Cit9CisKKy8qKgorICogYmxvY2tfcmFuZ2VfX2NyZWF0ZQorICogQHN0YXJ0OiBicmFuY2ggdGFyZ2V0IHN0YXJ0aW5nIHRoaXMgYmFzaWMgYmxvY2sKKyAqIEBlbmQ6ICAgYnJhbmNoIGVuZGluZyB0aGlzIGJhc2ljIGJsb2NrCisgKgorICogQ3JlYXRlIGFsbCB0aGUgcmVxdWlyZWQgYmxvY2sgcmFuZ2VzIHRvIHByZWNpc2VseSBzcGFuIHRoZSBnaXZlbiByYW5nZS4KKyAqLworc3RydWN0IGJsb2NrX3JhbmdlX2l0ZXIgYmxvY2tfcmFuZ2VfX2NyZWF0ZSh1NjQgc3RhcnQsIHU2NCBlbmQpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJmJsb2NrX3Jhbmdlcy5yb290LnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKm4sICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBibG9ja19yYW5nZSAqbmV4dCwgKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgYmxvY2tfcmFuZ2VfaXRlciBpdGVyID0geyBOVUxMLCBOVUxMIH07CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJZW50cnkgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBibG9ja19yYW5nZSwgbm9kZSk7CisKKwkJaWYgKHN0YXJ0IDwgZW50cnktPnN0YXJ0KQorCQkJcCA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHN0YXJ0ID4gZW50cnktPmVuZCkKKwkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBEaWRuJ3QgZmluZCBhbnl0aGluZy4uIHRoZXJlJ3MgYSBob2xlIGF0IEBzdGFydCwgaG93ZXZlciBAZW5kIG1pZ2h0CisJICogYmUgaW5zaWRlL2JlaGluZCB0aGUgbmV4dCByYW5nZS4KKwkgKi8KKwlpZiAoISpwKSB7CisJCWlmICghZW50cnkpIC8qIHRyZWUgZW1wdHkgKi8KKwkJCWdvdG8gZG9fd2hvbGU7CisKKwkJLyoKKwkJICogSWYgdGhlIGxhc3Qgbm9kZSBpcyBiZWZvcmUsIGFkdmFuY2Ugb25lIHRvIGZpbmQgdGhlIG5leHQuCisJCSAqLworCQluID0gcGFyZW50OworCQlpZiAoZW50cnktPmVuZCA8IHN0YXJ0KSB7CisJCQluID0gcmJfbmV4dChuKTsKKwkJCWlmICghbikKKwkJCQlnb3RvIGRvX3dob2xlOworCQl9CisJCW5leHQgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYmxvY2tfcmFuZ2UsIG5vZGUpOworCisJCWlmIChuZXh0LT5zdGFydCA8PSBlbmQpIHsgLyogYWRkIGhlYWQ6IFtzdGFydC4uLl1bbi0+c3RhcnQuLi5dICovCisJCQlzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmhlYWQgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBibG9ja19yYW5nZSkpOworCQkJaWYgKCFoZWFkKQorCQkJCXJldHVybiBpdGVyOworCisJCQkqaGVhZCA9IChzdHJ1Y3QgYmxvY2tfcmFuZ2UpeworCQkJCS5zdGFydAkJPSBzdGFydCwKKwkJCQkuZW5kCQk9IG5leHQtPnN0YXJ0IC0gMSwKKwkJCQkuaXNfdGFyZ2V0CT0gMSwKKwkJCQkuaXNfYnJhbmNoCT0gMCwKKwkJCX07CisKKwkJCXJiX2xpbmtfbGVmdF9vZl9ub2RlKCZoZWFkLT5ub2RlLCAmbmV4dC0+bm9kZSk7CisJCQlyYl9pbnNlcnRfY29sb3IoJmhlYWQtPm5vZGUsICZibG9ja19yYW5nZXMucm9vdCk7CisJCQlibG9ja19yYW5nZV9fZGVidWcoKTsKKworCQkJaXRlci5zdGFydCA9IGhlYWQ7CisJCQlnb3RvIGRvX3RhaWw7CisJCX0KKworZG9fd2hvbGU6CisJCS8qCisJCSAqIFRoZSB3aG9sZSBbc3RhcnQuLmVuZF0gcmFuZ2UgaXMgbm9uLW92ZXJsYXBwaW5nLgorCQkgKi8KKwkJZW50cnkgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBibG9ja19yYW5nZSkpOworCQlpZiAoIWVudHJ5KQorCQkJcmV0dXJuIGl0ZXI7CisKKwkJKmVudHJ5ID0gKHN0cnVjdCBibG9ja19yYW5nZSl7CisJCQkuc3RhcnQJCT0gc3RhcnQsCisJCQkuZW5kCQk9IGVuZCwKKwkJCS5pc190YXJnZXQJPSAxLAorCQkJLmlzX2JyYW5jaAk9IDEsCisJCX07CisKKwkJcmJfbGlua19ub2RlKCZlbnRyeS0+bm9kZSwgcGFyZW50LCBwKTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZlbnRyeS0+bm9kZSwgJmJsb2NrX3Jhbmdlcy5yb290KTsKKwkJYmxvY2tfcmFuZ2VfX2RlYnVnKCk7CisKKwkJaXRlci5zdGFydCA9IGVudHJ5OworCQlpdGVyLmVuZCAgID0gZW50cnk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIFdlIGZvdW5kIGEgcmFuZ2UgdGhhdCBvdmVybGFwcGVkIHdpdGggb3Vycywgc3BsaXQgaWYgbmVlZGVkLgorCSAqLworCWlmIChlbnRyeS0+c3RhcnQgPCBzdGFydCkgeyAvKiBzcGxpdDogW2UtPnN0YXJ0Li4uXVtzdGFydC4uLl0gKi8KKwkJc3RydWN0IGJsb2NrX3JhbmdlICpoZWFkID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tfcmFuZ2UpKTsKKwkJaWYgKCFoZWFkKQorCQkJcmV0dXJuIGl0ZXI7CisKKwkJKmhlYWQgPSAoc3RydWN0IGJsb2NrX3JhbmdlKXsKKwkJCS5zdGFydAkJPSBlbnRyeS0+c3RhcnQsCisJCQkuZW5kCQk9IHN0YXJ0IC0gMSwKKwkJCS5pc190YXJnZXQJPSBlbnRyeS0+aXNfdGFyZ2V0LAorCQkJLmlzX2JyYW5jaAk9IDAsCisKKwkJCS5jb3ZlcmFnZQk9IGVudHJ5LT5jb3ZlcmFnZSwKKwkJCS5lbnRyeQkJPSBlbnRyeS0+ZW50cnksCisJCX07CisKKwkJZW50cnktPnN0YXJ0CQk9IHN0YXJ0OworCQllbnRyeS0+aXNfdGFyZ2V0CT0gMTsKKwkJZW50cnktPmVudHJ5CQk9IDA7CisKKwkJcmJfbGlua19sZWZ0X29mX25vZGUoJmhlYWQtPm5vZGUsICZlbnRyeS0+bm9kZSk7CisJCXJiX2luc2VydF9jb2xvcigmaGVhZC0+bm9kZSwgJmJsb2NrX3Jhbmdlcy5yb290KTsKKwkJYmxvY2tfcmFuZ2VfX2RlYnVnKCk7CisKKwl9IGVsc2UgaWYgKGVudHJ5LT5zdGFydCA9PSBzdGFydCkKKwkJZW50cnktPmlzX3RhcmdldCA9IDE7CisKKwlpdGVyLnN0YXJ0ID0gZW50cnk7CisKK2RvX3RhaWw6CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlJ3ZlIGdvdDogQGl0ZXIuc3RhcnQgPSBbQHN0YXJ0Li4uXSBidXQgQGVuZCBjYW4gc3RpbGwgYmUKKwkgKiBpbnNpZGUgb3IgYmV5b25kIGl0LgorCSAqLworCWVudHJ5ID0gaXRlci5zdGFydDsKKwlmb3IgKDs7KSB7CisJCS8qCisJCSAqIElmIEBlbmQgaXMgaW5zaWRlIEBlbnRyeSwgc3BsaXQuCisJCSAqLworCQlpZiAoZW5kIDwgZW50cnktPmVuZCkgeyAvKiBzcGxpdDogWy4uLmVuZF1bLi4uZS0+ZW5kXSAqLworCQkJc3RydWN0IGJsb2NrX3JhbmdlICp0YWlsID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tfcmFuZ2UpKTsKKwkJCWlmICghdGFpbCkKKwkJCQlyZXR1cm4gaXRlcjsKKworCQkJKnRhaWwgPSAoc3RydWN0IGJsb2NrX3JhbmdlKXsKKwkJCQkuc3RhcnQJCT0gZW5kICsgMSwKKwkJCQkuZW5kCQk9IGVudHJ5LT5lbmQsCisJCQkJLmlzX3RhcmdldAk9IDAsCisJCQkJLmlzX2JyYW5jaAk9IGVudHJ5LT5pc19icmFuY2gsCisKKwkJCQkuY292ZXJhZ2UJPSBlbnRyeS0+Y292ZXJhZ2UsCisJCQkJLnRha2VuCQk9IGVudHJ5LT50YWtlbiwKKwkJCQkucHJlZAkJPSBlbnRyeS0+cHJlZCwKKwkJCX07CisKKwkJCWVudHJ5LT5lbmQJCT0gZW5kOworCQkJZW50cnktPmlzX2JyYW5jaAk9IDE7CisJCQllbnRyeS0+dGFrZW4JCT0gMDsKKwkJCWVudHJ5LT5wcmVkCQk9IDA7CisKKwkJCXJiX2xpbmtfcmlnaHRfb2Zfbm9kZSgmdGFpbC0+bm9kZSwgJmVudHJ5LT5ub2RlKTsKKwkJCXJiX2luc2VydF9jb2xvcigmdGFpbC0+bm9kZSwgJmJsb2NrX3Jhbmdlcy5yb290KTsKKwkJCWJsb2NrX3JhbmdlX19kZWJ1ZygpOworCisJCQlpdGVyLmVuZCA9IGVudHJ5OworCQkJZ290byBkb25lOworCQl9CisKKwkJLyoKKwkJICogSWYgQGVuZCBtYXRjaGVzIEBlbnRyeSwgZG9uZQorCQkgKi8KKwkJaWYgKGVuZCA9PSBlbnRyeS0+ZW5kKSB7CisJCQllbnRyeS0+aXNfYnJhbmNoID0gMTsKKwkJCWl0ZXIuZW5kID0gZW50cnk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQluZXh0ID0gYmxvY2tfcmFuZ2VfX25leHQoZW50cnkpOworCQlpZiAoIW5leHQpCisJCQlnb3RvIGFkZF90YWlsOworCisJCS8qCisJCSAqIElmIEBlbmQgaXMgaW4gYmV5b25kIEBlbnRyeSBidXQgbm90IGluc2lkZSBAbmV4dCwgYWRkIHRhaWwuCisJCSAqLworCQlpZiAoZW5kIDwgbmV4dC0+c3RhcnQpIHsgLyogYWRkIHRhaWw6IFsuLi5lLT5lbmRdWy4uLmVuZF0gKi8KKwkJCXN0cnVjdCBibG9ja19yYW5nZSAqdGFpbDsKK2FkZF90YWlsOgorCQkJdGFpbCA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGJsb2NrX3JhbmdlKSk7CisJCQlpZiAoIXRhaWwpCisJCQkJcmV0dXJuIGl0ZXI7CisKKwkJCSp0YWlsID0gKHN0cnVjdCBibG9ja19yYW5nZSl7CisJCQkJLnN0YXJ0CQk9IGVudHJ5LT5lbmQgKyAxLAorCQkJCS5lbmQJCT0gZW5kLAorCQkJCS5pc190YXJnZXQJPSAwLAorCQkJCS5pc19icmFuY2gJPSAxLAorCQkJfTsKKworCQkJcmJfbGlua19yaWdodF9vZl9ub2RlKCZ0YWlsLT5ub2RlLCAmZW50cnktPm5vZGUpOworCQkJcmJfaW5zZXJ0X2NvbG9yKCZ0YWlsLT5ub2RlLCAmYmxvY2tfcmFuZ2VzLnJvb3QpOworCQkJYmxvY2tfcmFuZ2VfX2RlYnVnKCk7CisKKwkJCWl0ZXIuZW5kID0gdGFpbDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoZXJlIGlzIGEgaG9sZSBiZXR3ZWVuIEBlbnRyeSBhbmQgQG5leHQsIGZpbGwgaXQuCisJCSAqLworCQlpZiAoZW50cnktPmVuZCArIDEgIT0gbmV4dC0+c3RhcnQpIHsKKwkJCXN0cnVjdCBibG9ja19yYW5nZSAqaG9sZSA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGJsb2NrX3JhbmdlKSk7CisJCQlpZiAoIWhvbGUpCisJCQkJcmV0dXJuIGl0ZXI7CisKKwkJCSpob2xlID0gKHN0cnVjdCBibG9ja19yYW5nZSl7CisJCQkJLnN0YXJ0CQk9IGVudHJ5LT5lbmQgKyAxLAorCQkJCS5lbmQJCT0gbmV4dC0+c3RhcnQgLSAxLAorCQkJCS5pc190YXJnZXQJPSAwLAorCQkJCS5pc19icmFuY2gJPSAwLAorCQkJfTsKKworCQkJcmJfbGlua19sZWZ0X29mX25vZGUoJmhvbGUtPm5vZGUsICZuZXh0LT5ub2RlKTsKKwkJCXJiX2luc2VydF9jb2xvcigmaG9sZS0+bm9kZSwgJmJsb2NrX3Jhbmdlcy5yb290KTsKKwkJCWJsb2NrX3JhbmdlX19kZWJ1ZygpOworCQl9CisKKwkJZW50cnkgPSBuZXh0OworCX0KKworZG9uZToKKwlhc3NlcnQoaXRlci5zdGFydC0+c3RhcnQgPT0gc3RhcnQgJiYgaXRlci5zdGFydC0+aXNfdGFyZ2V0KTsKKwlhc3NlcnQoaXRlci5lbmQtPmVuZCA9PSBlbmQgJiYgaXRlci5lbmQtPmlzX2JyYW5jaCk7CisKKwlibG9ja19yYW5nZXMuYmxvY2tzKys7CisKKwlyZXR1cm4gaXRlcjsKK30KKworCisvKgorICogQ29tcHV0ZSBjb3ZlcmFnZSBhczoKKyAqCisgKiAgICBici0+Y292ZXJhZ2UgLyBici0+c3ltLT5tYXhfY292ZXJhZ2UKKyAqCisgKiBUaGlzIGVuc3VyZXMgZWFjaCBzeW1ib2wgaGFzIGEgMTAwJSBzcG90LCB0byByZWZsZWN0IHRoYXQgZWFjaCBzeW1ib2wgaGFzIGEKKyAqIG1vc3QgY292ZXJlZCBzZWN0aW9uLgorICoKKyAqIFJldHVybnMgWzAtMV0gZm9yIGNvdmVyYWdlIGFuZCAtMSBpZiB3ZSBoYWQgbm8gZGF0YSB3aGF0IHNvIGV2ZXIgb3IgdGhlCisgKiBzeW1ib2wgZG9lcyBub3QgZXhpc3QuCisgKi8KK2RvdWJsZSBibG9ja19yYW5nZV9fY292ZXJhZ2Uoc3RydWN0IGJsb2NrX3JhbmdlICpicikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKwlpZiAoIWJyKSB7CisJCWlmIChibG9ja19yYW5nZXMuYmxvY2tzKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXN5bSA9IGJyLT5zeW07CisJaWYgKCFzeW0pCisJCXJldHVybiAtMTsKKworCXJldHVybiAoZG91YmxlKWJyLT5jb3ZlcmFnZSAvIHN5bWJvbF9fYW5ub3RhdGlvbihzeW0pLT5tYXhfY292ZXJhZ2U7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYmxvY2stcmFuZ2UuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ibG9jay1yYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4Yzg0MTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvYmxvY2stcmFuZ2UuaApAQCAtMCwwICsxLDcxIEBACisjaWZuZGVmIF9fUEVSRl9CTE9DS19SQU5HRV9ICisjZGVmaW5lIF9fUEVSRl9CTE9DS19SQU5HRV9ICisKKyNpbmNsdWRlICJzeW1ib2wuaCIKKworLyoKKyAqIHN0cnVjdCBibG9ja19yYW5nZSAtIG5vbi1vdmVybGFwcGluZyBwYXJ0cyBvZiBiYXNpYyBibG9ja3MKKyAqIEBub2RlOgl0cmVlbm9kZQorICogQHN0YXJ0OglpbmNsdXNpdmUgc3RhcnQgb2YgcmFuZ2UKKyAqIEBlbmQ6CWluY2x1c2l2ZSBlbmQgb2YgcmFuZ2UKKyAqIEBpc190YXJnZXQ6CUBzdGFydCBpcyBhIGp1bXAgdGFyZ2V0CisgKiBAaXNfYnJhbmNoOglAZW5kIGlzIGEgYnJhbmNoIGluc3RydWN0aW9uCisgKiBAY292ZXJhZ2U6CW51bWJlciBvZiBibG9ja3MgdGhhdCBjb3ZlciB0aGlzIHJhbmdlCisgKiBAdGFrZW46CW51bWJlciBvZiB0aW1lcyB0aGUgYnJhbmNoIGlzIHRha2VuIChyZXF1aXJlcyBAaXNfYnJhbmNoKQorICogQHByZWQ6CW51bWJlciBvZiB0aW1lcyB0aGUgdGFrZW4gYnJhbmNoIHdhcyBwcmVkaWN0ZWQKKyAqLworc3RydWN0IGJsb2NrX3JhbmdlIHsKKwlzdHJ1Y3QgcmJfbm9kZSBub2RlOworCisJc3RydWN0IHN5bWJvbCAqc3ltOworCisJdTY0IHN0YXJ0OworCXU2NCBlbmQ7CisKKwlpbnQgaXNfdGFyZ2V0LCBpc19icmFuY2g7CisKKwl1NjQgY292ZXJhZ2U7CisJdTY0IGVudHJ5OworCXU2NCB0YWtlbjsKKwl1NjQgcHJlZDsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJsb2NrX3JhbmdlICpibG9ja19yYW5nZV9fbmV4dChzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJyKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gcmJfbmV4dCgmYnItPm5vZGUpOworCWlmICghbikKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHJiX2VudHJ5KG4sIHN0cnVjdCBibG9ja19yYW5nZSwgbm9kZSk7Cit9CisKK3N0cnVjdCBibG9ja19yYW5nZV9pdGVyIHsKKwlzdHJ1Y3QgYmxvY2tfcmFuZ2UgKnN0YXJ0OworCXN0cnVjdCBibG9ja19yYW5nZSAqZW5kOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2tfcmFuZ2UgKmJsb2NrX3JhbmdlX2l0ZXIoc3RydWN0IGJsb2NrX3JhbmdlX2l0ZXIgKml0ZXIpCit7CisJcmV0dXJuIGl0ZXItPnN0YXJ0OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYmxvY2tfcmFuZ2VfaXRlcl9fbmV4dChzdHJ1Y3QgYmxvY2tfcmFuZ2VfaXRlciAqaXRlcikKK3sKKwlpZiAoaXRlci0+c3RhcnQgPT0gaXRlci0+ZW5kKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpdGVyLT5zdGFydCA9IGJsb2NrX3JhbmdlX19uZXh0KGl0ZXItPnN0YXJ0KTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGlubGluZSBib29sIGJsb2NrX3JhbmdlX2l0ZXJfX3ZhbGlkKHN0cnVjdCBibG9ja19yYW5nZV9pdGVyICppdGVyKQoreworCWlmICghaXRlci0+c3RhcnQgfHwgIWl0ZXItPmVuZCkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCitleHRlcm4gc3RydWN0IGJsb2NrX3JhbmdlICpibG9ja19yYW5nZV9fZmluZCh1NjQgYWRkcik7CitleHRlcm4gc3RydWN0IGJsb2NrX3JhbmdlX2l0ZXIgYmxvY2tfcmFuZ2VfX2NyZWF0ZSh1NjQgc3RhcnQsIHU2NCBlbmQpOworZXh0ZXJuIGRvdWJsZSBibG9ja19yYW5nZV9fY292ZXJhZ2Uoc3RydWN0IGJsb2NrX3JhbmdlICpicik7CisKKyNlbmRpZiAvKiBfX1BFUkZfQkxPQ0tfUkFOR0VfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2JwZi1sb2FkZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9icGYtbG9hZGVyLmMKaW5kZXggMWYxMmU0ZS4uMmIyYzliOCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2JwZi1sb2FkZXIuYworKysgYi90b29scy9wZXJmL3V0aWwvYnBmLWxvYWRlci5jCkBAIC01MzEsNyArNTMxLDcgQEAKIAogCXB0ZXZzID0gbWFsbG9jKGFycmF5X3N6KTsKIAlpZiAoIXB0ZXZzKSB7Ci0JCXByX2RlYnVnKCJObyBlaG91Z2ggbWVtb3J5OiBhbGxvYyBwdGV2cyBmYWlsZWRcbiIpOworCQlwcl9kZWJ1ZygiTm8gZW5vdWdoIG1lbW9yeTogYWxsb2MgcHRldnMgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYnVpbGQtaWQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCmluZGV4IDU2NTFmM2MuLmU1MjhjNDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCkBAIC02MjAsNyArNjIwLDcgQEAKIAogCXJldCA9IHByb2JlX2NhY2hlX19zY2FuX3NkdChjYWNoZSwgcmVhbG5hbWUpOwogCWlmIChyZXQgPj0gMCkgewotCQlwcl9kZWJ1ZygiRm91bmQgJWQgU0RUcyBpbiAlc1xuIiwgcmV0LCByZWFsbmFtZSk7CisJCXByX2RlYnVnNCgiRm91bmQgJWQgU0RUcyBpbiAlc1xuIiwgcmV0LCByZWFsbmFtZSk7CiAJCWlmIChwcm9iZV9jYWNoZV9fY29tbWl0KGNhY2hlKSA8IDApCiAJCQlyZXQgPSAtMTsKIAl9CkBAIC02OTEsNyArNjkxLDcgQEAKIAogCS8qIFVwZGF0ZSBTRFQgY2FjaGUgOiBlcnJvciBpcyBqdXN0IHdhcm5lZCAqLwogCWlmIChidWlsZF9pZF9jYWNoZV9fYWRkX3NkdF9jYWNoZShzYnVpbGRfaWQsIHJlYWxuYW1lKSA8IDApCi0JCXByX2RlYnVnKCJGYWlsZWQgdG8gdXBkYXRlL3NjYW4gU0RUIGNhY2hlIGZvciAlc1xuIiwgcmVhbG5hbWUpOworCQlwcl9kZWJ1ZzQoIkZhaWxlZCB0byB1cGRhdGUvc2NhbiBTRFQgY2FjaGUgZm9yICVzXG4iLCByZWFsbmFtZSk7CiAKIG91dF9mcmVlOgogCWlmICghaXNfa2FsbHN5bXMpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY3MtZXRtLmggYi90b29scy9wZXJmL3V0aWwvY3MtZXRtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjNmJjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jcy1ldG0uaApAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0KEMpIDIwMTUgTGluYXJvIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBBdXRob3I6IE1hdGhpZXUgUG9pcmllciA8bWF0aGlldS5wb2lyaWVyQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIElOQ0xVREVfX1VUSUxfUEVSRl9DU19FVE1fSF9fCisjZGVmaW5lIElOQ0xVREVfX1VUSUxfUEVSRl9DU19FVE1fSF9fCisKKy8qIFZlcnNpb25uaW5nIGhlYWRlciBpbiBjYXNlIHRoaW5ncyBuZWVkIHRybyBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4gIFRoYXQgd2F5CisgKiBkZWNvZGluZyBvZiBvbGQgc25hcHNob3QgaXMgc3RpbGwgcG9zc2libGUuCisgKi8KK2VudW0geworCS8qIFN0YXJ0aW5nIHdpdGggMHgwICovCisJQ1NfSEVBREVSX1ZFUlNJT05fMCwKKwkvKiBQTVUtPnR5cGUgKDMyIGJpdCksIHRvdGFsICMgb2YgQ1BVcyAoMzIgYml0KSAqLworCUNTX1BNVV9UWVBFX0NQVVMsCisJQ1NfRVRNX1NOQVBTSE9ULAorCUNTX0hFQURFUl9WRVJTSU9OXzBfTUFYLAorfTsKKworLyogQmVnaW5uaW5nIG9mIGhlYWRlciBjb21tb24gdG8gYm90aCBFVE12MyBhbmQgVjQgKi8KK2VudW0geworCUNTX0VUTV9NQUdJQywKKwlDU19FVE1fQ1BVLAorfTsKKworLyogRVRNdjMvUFRNIG1ldGFkYXRhICovCitlbnVtIHsKKwkvKiBEeW5hbWljLCBjb25maWd1cmFibGUgcGFyYW1ldGVycyAqLworCUNTX0VUTV9FVE1DUiA9IENTX0VUTV9DUFUgKyAxLAorCUNTX0VUTV9FVE1UUkFDRUlEUiwKKwkvKiBSTywgdGFrZW4gZnJvbSBzeXNGUyAqLworCUNTX0VUTV9FVE1DQ0VSLAorCUNTX0VUTV9FVE1JRFIsCisJQ1NfRVRNX1BSSVZfTUFYLAorfTsKKworLyogRVRNdjQgbWV0YWRhdGEgKi8KK2VudW0geworCS8qIER5bmFtaWMsIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzICovCisJQ1NfRVRNVjRfVFJDQ09ORklHUiA9IENTX0VUTV9DUFUgKyAxLAorCUNTX0VUTVY0X1RSQ1RSQUNFSURSLAorCS8qIFJPLCB0YWtlbiBmcm9tIHN5c0ZTICovCisJQ1NfRVRNVjRfVFJDSURSMCwKKwlDU19FVE1WNF9UUkNJRFIxLAorCUNTX0VUTVY0X1RSQ0lEUjIsCisJQ1NfRVRNVjRfVFJDSURSOCwKKwlDU19FVE1WNF9UUkNBVVRIU1RBVFVTLAorCUNTX0VUTVY0X1BSSVZfTUFYLAorfTsKKworI2RlZmluZSBLaUIoeCkgKCh4KSAqIDEwMjQpCisjZGVmaW5lIE1pQih4KSAoKHgpICogMTAyNCAqIDEwMjQpCisKKyNkZWZpbmUgQ1NfRVRNX0hFQURFUl9TSVpFIChDU19IRUFERVJfVkVSU0lPTl8wX01BWCAqIHNpemVvZih1NjQpKQorCitzdGF0aWMgY29uc3QgdTY0IF9fcGVyZl9jc19ldG12M19tYWdpYyAgID0gMHgzMDMwMzAzMDMwMzAzMDMwVUxMOworc3RhdGljIGNvbnN0IHU2NCBfX3BlcmZfY3NfZXRtdjRfbWFnaWMgICA9IDB4NDA0MDQwNDA0MDQwNDA0MFVMTDsKKyNkZWZpbmUgQ1NfRVRNVjNfUFJJVl9TSVpFIChDU19FVE1fUFJJVl9NQVggKiBzaXplb2YodTY0KSkKKyNkZWZpbmUgQ1NfRVRNVjRfUFJJVl9TSVpFIChDU19FVE1WNF9QUklWX01BWCAqIHNpemVvZih1NjQpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kYXRhLWNvbnZlcnQtYnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9kYXRhLWNvbnZlcnQtYnQuYwppbmRleCA0Zjk3OWJiLi43MTIzZjRkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZGF0YS1jb252ZXJ0LWJ0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2RhdGEtY29udmVydC1idC5jCkBAIC00MzcsNyArNDM3LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKG5yX2VsZW1lbnRzICogc2l6ZW9mKHUzMikgIT0gcmF3X3NpemUpCi0JCXByX3dhcm5pbmcoIkluY29ycmVjdCByYXdfc2l6ZSAoJXUpIGluIGJwZiBvdXRwdXQgZXZlbnQsIHNraXAgJWx1IGJ5dGVzXG4iLAorCQlwcl93YXJuaW5nKCJJbmNvcnJlY3QgcmF3X3NpemUgKCV1KSBpbiBicGYgb3V0cHV0IGV2ZW50LCBza2lwICV6dSBieXRlc1xuIiwKIAkJCSAgIHJhd19zaXplLCBucl9lbGVtZW50cyAqIHNpemVvZih1MzIpIC0gcmF3X3NpemUpOwogCiAJbGVuX3R5cGUgPSBidF9jdGZfZXZlbnRfY2xhc3NfZ2V0X2ZpZWxkX2J5X25hbWUoZXZlbnRfY2xhc3MsICJyYXdfbGVuIik7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZGVidWcuYyBiL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5jCmluZGV4IDhjNDIxMmEuLmMxODM4YjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8YXBpL2RlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNpbmNsdWRlICJjYWNoZS5oIgogI2luY2x1ZGUgImNvbG9yLmgiCkBAIC0xNCw5ICsxNSw2IEBACiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgInRhcmdldC5oIgogCi0jZGVmaW5lIE5TRUNTX1BFUl9TRUMgIDEwMDAwMDAwMDBVTEwKLSNkZWZpbmUgTlNFQ1NfUEVSX1VTRUMgMTAwMFVMTAotCiBpbnQgdmVyYm9zZTsKIGJvb2wgZHVtcF90cmFjZSA9IGZhbHNlLCBxdWlldCA9IGZhbHNlOwogaW50IGRlYnVnX29yZGVyZWRfZXZlbnRzOwpAQCAtNTQsOSArNTIsOSBAQAogCWludCByZXQgPSAwOwogCXU2NCBzZWNzLCB1c2VjcywgbnNlY3MgPSB0OwogCi0Jc2VjcyAgID0gbnNlY3MgLyBOU0VDU19QRVJfU0VDOwotCW5zZWNzIC09IHNlY3MgICogTlNFQ1NfUEVSX1NFQzsKLQl1c2VjcyAgPSBuc2VjcyAvIE5TRUNTX1BFUl9VU0VDOworCXNlY3MgICA9IG5zZWNzIC8gTlNFQ19QRVJfU0VDOworCW5zZWNzIC09IHNlY3MgICogTlNFQ19QRVJfU0VDOworCXVzZWNzICA9IG5zZWNzIC8gTlNFQ19QRVJfVVNFQzsKIAogCXJldCA9IGZwcmludGYoc3RkZXJyLCAiWyUxMyIgUFJJdTY0ICIuJTA2IiBQUkl1NjQgIl0gIiwKIAkJICAgICAgc2VjcywgdXNlY3MpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Rydl9jb25maWdzLmMgYi90b29scy9wZXJmL3V0aWwvZHJ2X2NvbmZpZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjQ3ZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Rydl9jb25maWdzLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIGRydl9jb25maWdzLmg6IEludGVyZmFjZSB0byBhcHBseSBQTVUgc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTgsIExpbmFybyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSAiZHJ2X2NvbmZpZ3MuaCIKKyNpbmNsdWRlICJldmxpc3QuaCIKKyNpbmNsdWRlICJldnNlbC5oIgorI2luY2x1ZGUgInBtdS5oIgorCitzdGF0aWMgaW50CitwZXJmX2V2c2VsX19hcHBseV9kcnZfY29uZmlncyhzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbF9jb25maWdfdGVybSAqKmVycl90ZXJtKQoreworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcGVyZl9ldnNlbF9jb25maWdfdGVybSAqdGVybTsKKwlzdHJ1Y3QgcGVyZl9wbXUgKnBtdSA9IE5VTEw7CisKKwl3aGlsZSAoKHBtdSA9IHBlcmZfcG11X19zY2FuKHBtdSkpICE9IE5VTEwpCisJCWlmIChwbXUtPnR5cGUgPT0gZXZzZWwtPmF0dHIudHlwZSkgeworCQkJZm91bmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGVybSwgJmV2c2VsLT5jb25maWdfdGVybXMsIGxpc3QpIHsKKwkJaWYgKHRlcm0tPnR5cGUgIT0gUEVSRl9FVlNFTF9fQ09ORklHX1RFUk1fRFJWX0NGRykKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFdlIGhhdmUgYSBjb25maWd1cmF0aW9uIHRlcm0sIHJlcG9ydCBhbiBlcnJvciBpZiB3ZQorCQkgKiBjYW4ndCBmaW5kIHRoZSBQTVUgb3IgaWYgdGhlIFBNVSBkcml2ZXIgZG9lc24ndCBzdXBwb3J0CisJCSAqIGNtZCBsaW5lIGRyaXZlciBjb25maWd1cmF0aW9uLgorCQkgKi8KKwkJaWYgKCFmb3VuZCB8fCAhcG11LT5zZXRfZHJ2X2NvbmZpZykgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCSplcnJfdGVybSA9IHRlcm07CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IHBtdS0+c2V0X2Rydl9jb25maWcodGVybSk7CisJCWlmIChlcnIpIHsKKwkJCSplcnJfdGVybSA9IHRlcm07CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBlcnI7Cit9CisKK2ludCBwZXJmX2V2bGlzdF9fYXBwbHlfZHJ2X2NvbmZpZ3Moc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkJICAgc3RydWN0IHBlcmZfZXZzZWwgKiplcnJfZXZzZWwsCisJCQkJICAgc3RydWN0IHBlcmZfZXZzZWxfY29uZmlnX3Rlcm0gKiplcnJfdGVybSkKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisJaW50IGVyciA9IDA7CisKKwlldmxpc3RfX2Zvcl9lYWNoX2VudHJ5KGV2bGlzdCwgZXZzZWwpIHsKKwkJZXJyID0gcGVyZl9ldnNlbF9fYXBwbHlfZHJ2X2NvbmZpZ3MoZXZzZWwsIGVycl90ZXJtKTsKKwkJaWYgKGVycikgeworCQkJKmVycl9ldnNlbCA9IGV2c2VsOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Rydl9jb25maWdzLmggYi90b29scy9wZXJmL3V0aWwvZHJ2X2NvbmZpZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJjOWJhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Rydl9jb25maWdzLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGRydl9jb25maWdzLmg6IEludGVyZmFjZSB0byBhcHBseSBQTVUgc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTgsIExpbmFybyBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fUEVSRl9EUlZfQ09ORklHU19ICisjZGVmaW5lIF9fUEVSRl9EUlZfQ09ORklHU19ICisKKyNpbmNsdWRlICJkcnZfY29uZmlncy5oIgorI2luY2x1ZGUgImV2bGlzdC5oIgorI2luY2x1ZGUgImV2c2VsLmgiCisKK2ludCBwZXJmX2V2bGlzdF9fYXBwbHlfZHJ2X2NvbmZpZ3Moc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkJICAgc3RydWN0IHBlcmZfZXZzZWwgKiplcnJfZXZzZWwsCisJCQkJICAgc3RydWN0IHBlcmZfZXZzZWxfY29uZmlnX3Rlcm0gKip0ZXJtKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2Rzby5jIGIvdG9vbHMvcGVyZi91dGlsL2Rzby5jCmluZGV4IDc3NGY2ZWMuLmQyYzZjZGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kc28uYworKysgYi90b29scy9wZXJmL3V0aWwvZHNvLmMKQEAgLTM2Myw2ICszNjMsOSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoIWlzX3JlZ3VsYXJfZmlsZShuYW1lKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlmZCA9IGRvX29wZW4obmFtZSk7CiAJZnJlZShuYW1lKTsKIAlyZXR1cm4gZmQ7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmMgYi90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmMKaW5kZXggYTM0N2IxOS4uNDFlMDY4ZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2R3YXJmLWF1eC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguYwpAQCAtMTMwLDYgKzEzMCwyMiBAQAogfQogCiAvKioKKyAqIGRpZV9nZXRfbGlua2FnZV9uYW1lIC0gR2V0IHRoZSBsaW5rYWdlIG5hbWUgb2YgdGhlIG9iamVjdAorICogQGR3X2RpZTogQSBESUUgb2YgdGhlIG9iamVjdAorICoKKyAqIEdldCB0aGUgbGlua2FnZSBuYW1lIGF0dGlyaWJ1dGUgb2YgZ2l2ZW4gQGR3X2RpZS4KKyAqIEZvciBDKysgYmluYXJ5LCB0aGUgbGlua2FnZSBuYW1lIHdpbGwgYmUgdGhlIG1hbmdsZWQgc3ltYm9sLgorICovCitjb25zdCBjaGFyICpkaWVfZ2V0X2xpbmthZ2VfbmFtZShEd2FyZl9EaWUgKmR3X2RpZSkKK3sKKwlEd2FyZl9BdHRyaWJ1dGUgYXR0cjsKKworCWlmIChkd2FyZl9hdHRyX2ludGVncmF0ZShkd19kaWUsIERXX0FUX2xpbmthZ2VfbmFtZSwgJmF0dHIpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBkd2FyZl9mb3Jtc3RyaW5nKCZhdHRyKTsKK30KKworLyoqCiAgKiBkaWVfY29tcGFyZV9uYW1lIC0gQ29tcGFyZSBkaWVuYW1lIGFuZCB0bmFtZQogICogQGR3X2RpZTogYSBESUUKICAqIEB0bmFtZTogYSBzdHJpbmcgb2YgdGFyZ2V0IG5hbWUKQEAgLTE0NSwxOCArMTYxLDI2IEBACiB9CiAKIC8qKgotICogZGllX21hdGNoX25hbWUgLSBNYXRjaCBkaWVuYW1lIGFuZCBnbG9iCisgKiBkaWVfbWF0Y2hfbmFtZSAtIE1hdGNoIGRpZW5hbWUvbGlua2FnZSBuYW1lIGFuZCBnbG9iCiAgKiBAZHdfZGllOiBhIERJRQogICogQGdsb2I6IGEgc3RyaW5nIG9mIHRhcmdldCBnbG9iIHBhdHRlcm4KICAqCiAgKiBHbG9iIG1hdGNoaW5nIHRoZSBuYW1lIG9mIEBkd19kaWUgYW5kIEBnbG9iLiBSZXR1cm4gZmFsc2UgaWYgbWF0Y2hpbmcgZmFpbC4KKyAqIFRoaXMgYWxzbyBtYXRjaCBsaW5rYWdlIG5hbWUuCiAgKi8KIGJvb2wgZGllX21hdGNoX25hbWUoRHdhcmZfRGllICpkd19kaWUsIGNvbnN0IGNoYXIgKmdsb2IpCiB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAogCW5hbWUgPSBkd2FyZl9kaWVuYW1lKGR3X2RpZSk7Ci0JcmV0dXJuIG5hbWUgPyBzdHJnbG9ibWF0Y2gobmFtZSwgZ2xvYikgOiBmYWxzZTsKKwlpZiAobmFtZSAmJiBzdHJnbG9ibWF0Y2gobmFtZSwgZ2xvYikpCisJCXJldHVybiB0cnVlOworCS8qIGZhbGwgYmFjayB0byBjaGVjayBsaW5rYWdlIG5hbWUgKi8KKwluYW1lID0gZGllX2dldF9saW5rYWdlX25hbWUoZHdfZGllKTsKKwlpZiAobmFtZSAmJiBzdHJnbG9ibWF0Y2gobmFtZSwgZ2xvYikpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOwogfQogCiAvKioKQEAgLTEwODUsMyArMTEwOSwxODIgQEAKIAlyZXR1cm4gLUVOT1RTVVA7CiB9CiAjZW5kaWYKKworLyoKKyAqIGRpZV9oYXNfbG9jbGlzdCAtIENoZWNrIGlmIERXX0FUX2xvY2F0aW9uIG9mIEB2cl9kaWUgaXMgYSBsb2NhdGlvbiBsaXN0CisgKiBAdnJfZGllOiBhIHZhcmlhYmxlIERJRQorICovCitzdGF0aWMgYm9vbCBkaWVfaGFzX2xvY2xpc3QoRHdhcmZfRGllICp2cl9kaWUpCit7CisJRHdhcmZfQXR0cmlidXRlIGxvYzsKKwlpbnQgdGFnID0gZHdhcmZfdGFnKHZyX2RpZSk7CisKKwlpZiAodGFnICE9IERXX1RBR19mb3JtYWxfcGFyYW1ldGVyICYmCisJICAgIHRhZyAhPSBEV19UQUdfdmFyaWFibGUpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiAoZHdhcmZfYXR0cl9pbnRlZ3JhdGUodnJfZGllLCBEV19BVF9sb2NhdGlvbiwgJmxvYykgJiYKKwkJZHdhcmZfd2hhdGZvcm0oJmxvYykgPT0gRFdfRk9STV9zZWNfb2Zmc2V0KTsKK30KKworLyoKKyAqIGRpZV9pc19vcHRpbWl6ZWRfdGFyZ2V0IC0gQ2hlY2sgaWYgdGFyZ2V0IHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aAorICogb3B0aW1pemF0aW9uCisgKiBAY3VfZGllOiBhIENVIERJRQorICoKKyAqIEZvciBhbnkgb2JqZWN0IGluIGdpdmVuIENVIHdob3NlIERXX0FUX2xvY2F0aW9uIGlzIGEgbG9jYXRpb24gbGlzdCwKKyAqIHRhcmdldCBwcm9ncmFtIGlzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9uLiBUaGlzIGlzIGFwcGxpY2FibGUgdG8KKyAqIGNsYW5nIGFzIHdlbGwuCisgKi8KK2Jvb2wgZGllX2lzX29wdGltaXplZF90YXJnZXQoRHdhcmZfRGllICpjdV9kaWUpCit7CisJRHdhcmZfRGllIHRtcF9kaWU7CisKKwlpZiAoZGllX2hhc19sb2NsaXN0KGN1X2RpZSkpCisJCXJldHVybiB0cnVlOworCisJaWYgKCFkd2FyZl9jaGlsZChjdV9kaWUsICZ0bXBfZGllKSAmJgorCSAgICBkaWVfaXNfb3B0aW1pemVkX3RhcmdldCgmdG1wX2RpZSkpCisJCXJldHVybiB0cnVlOworCisJaWYgKCFkd2FyZl9zaWJsaW5nb2YoY3VfZGllLCAmdG1wX2RpZSkgJiYKKwkgICAgZGllX2lzX29wdGltaXplZF90YXJnZXQoJnRtcF9kaWUpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIGRpZV9zZWFyY2hfaWR4IC0gU2VhcmNoIGluZGV4IG9mIGdpdmVuIGxpbmUgYWRkcmVzcworICogQGxpbmVzOiBMaW5lIHJlY29yZHMgb2Ygc2luZ2xlIENVCisgKiBAbnJfbGluZXM6IE51bWJlciBvZiBAbGluZXMKKyAqIEBhZGRyOiBhZGRyZXNzIHdlIGFyZSBsb29raW5nIGZvcgorICogQGlkeDogaW5kZXggdG8gYmUgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gKHJldHVybiB2YWx1ZSkKKyAqCisgKiBTZWFyY2ggZm9yIEBhZGRyIGJ5IGxvb3Bpbmcgb3ZlciBldmVyeSBsaW5lcyBvZiBDVS4gSWYgYWRkcmVzcworICogbWF0Y2hlcywgc2V0IGluZGV4IG9mIHRoYXQgbGluZSBpbiBAaWR4LiBOb3RlIHRoYXQgc2luZ2xlIHNvdXJjZQorICogbGluZSBjYW4gaGF2ZSBtdWx0aXBsZSBsaW5lIHJlY29yZHMuIGkuZS4gc2luZ2xlIHNvdXJjZSBsaW5lIGNhbgorICogaGF2ZSBtdWx0aXBsZSBpbmRleC4KKyAqLworc3RhdGljIGJvb2wgZGllX3NlYXJjaF9pZHgoRHdhcmZfTGluZXMgKmxpbmVzLCB1bnNpZ25lZCBsb25nIG5yX2xpbmVzLAorCQkJICAgRHdhcmZfQWRkciBhZGRyLCB1bnNpZ25lZCBsb25nICppZHgpCit7CisJdW5zaWduZWQgbG9uZyBpOworCUR3YXJmX0FkZHIgdG1wOworCisJZm9yIChpID0gMDsgaSA8IG5yX2xpbmVzOyBpKyspIHsKKwkJaWYgKGR3YXJmX2xpbmVhZGRyKGR3YXJmX29uZXNyY2xpbmUobGluZXMsIGkpLCAmdG1wKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAodG1wID09IGFkZHIpIHsKKwkJCSppZHggPSBpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogZGllX2dldF9wb3N0cHJvbG9ndWVfYWRkciAtIFNlYXJjaCBuZXh0IGFkZHJlc3MgYWZ0ZXIgZnVuY3Rpb24gcHJvbG9ndWUKKyAqIEBlbnRyeXBjX2lkeDogZW50cnlwYyBpbmRleAorICogQGxpbmVzOiBMaW5lIHJlY29yZHMgb2Ygc2luZ2xlIENVCisgKiBAbnJfbGluZXM6IE51bWJlciBvZiBAbGluZXMKKyAqIEBoaWducGM6IGhpZ2ggUEMgYWRkcmVzcyBvZiBmdW5jdGlvbgorICogQHBvc3Rwcm9sb2d1ZV9hZGRyOiBOZXh0IGFkZHJlc3MgYWZ0ZXIgZnVuY3Rpb24gcHJvbG9ndWUgKHJldHVybiB2YWx1ZSkKKyAqCisgKiBMb29rIGZvciBwcm9sb2d1ZS1lbmQgbWFya2VyLiBJZiB0aGVyZSBpcyBubyBleHBsaWNpdCBtYXJrZXIsIHJldHVybgorICogYWRkcmVzcyBvZiBuZXh0IGxpbmUgcmVjb3JkIG9yIG5leHQgc291cmNlIGxpbmUuCisgKi8KK3N0YXRpYyBib29sIGRpZV9nZXRfcG9zdHByb2xvZ3VlX2FkZHIodW5zaWduZWQgbG9uZyBlbnRyeXBjX2lkeCwKKwkJCQkgICAgICBEd2FyZl9MaW5lcyAqbGluZXMsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9saW5lcywKKwkJCQkgICAgICBEd2FyZl9BZGRyIGhpZ2hwYywKKwkJCQkgICAgICBEd2FyZl9BZGRyICpwb3N0cHJvbG9ndWVfYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJaW50IGVudHJ5cGNfbG5vLCBsbm87CisJRHdhcmZfTGluZSAqbGluZTsKKwlEd2FyZl9BZGRyIGFkZHI7CisJYm9vbCBwX2VuZDsKKworCS8qIGVudHJ5cGNfbG5vIGlzIGFjdHVhbCBzb3VyY2UgbGluZSBudW1iZXIgKi8KKwlsaW5lID0gZHdhcmZfb25lc3JjbGluZShsaW5lcywgZW50cnlwY19pZHgpOworCWlmIChkd2FyZl9saW5lbm8obGluZSwgJmVudHJ5cGNfbG5vKSkKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChpID0gZW50cnlwY19pZHg7IGkgPCBucl9saW5lczsgaSsrKSB7CisJCWxpbmUgPSBkd2FyZl9vbmVzcmNsaW5lKGxpbmVzLCBpKTsKKworCQlpZiAoZHdhcmZfbGluZWFkZHIobGluZSwgJmFkZHIpIHx8CisJCSAgICBkd2FyZl9saW5lbm8obGluZSwgJmxubykgICAgfHwKKwkJICAgIGR3YXJmX2xpbmVwcm9sb2d1ZWVuZChsaW5lLCAmcF9lbmQpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCS8qIGhpZ2hwYyBpcyBleGNsdXNpdmUuIFtlbnRyeXBjLGhpZ2hwYykgKi8KKwkJaWYgKGFkZHIgPj0gaGlnaHBjKQorCQkJYnJlYWs7CisKKwkJLyogY2xhbmcgc3VwcG9ydHMgcHJvbG9ndWUtZW5kIG1hcmtlciAqLworCQlpZiAocF9lbmQpCisJCQlicmVhazsKKworCQkvKiBBY3R1YWwgbmV4dCBsaW5lIGluIHNvdXJjZSAqLworCQlpZiAobG5vICE9IGVudHJ5cGNfbG5vKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogU2luZ2xlIHNvdXJjZSBsaW5lIGNhbiBoYXZlIG11bHRpcGxlIGxpbmUgcmVjb3Jkcy4KKwkJICogRm9yIEV4YW1wbGUsCisJCSAqICAgICB2b2lkIGZvbygpIHsgcHJpbnRmKCJoZWxsb1xuIik7IH0KKwkJICogY29udGFpbnMgdHdvIGxpbmUgcmVjb3Jkcy4gT25lIHBvaW50cyB0byBkZWNsYXJhdGlvbiBhbmQKKwkJICogb3RoZXIgcG9pbnRzIHRvIHByaW50ZigpIGxpbmUuIFZhcmlhYmxlICdsbm8nIHdvbid0IGdldAorCQkgKiBpbmNyZW1lbnRlZCBpbiB0aGlzIGNhc2UgYnV0ICdpJyB3aWxsLgorCQkgKi8KKwkJaWYgKGkgIT0gZW50cnlwY19pZHgpCisJCQlicmVhazsKKwl9CisKKwlkd2FyZl9saW5lYWRkcihsaW5lLCBwb3N0cHJvbG9ndWVfYWRkcik7CisJaWYgKCpwb3N0cHJvbG9ndWVfYWRkciA+PSBoaWdocGMpCisJCWR3YXJmX2xpbmVhZGRyKGR3YXJmX29uZXNyY2xpbmUobGluZXMsIGkgLSAxKSwKKwkJCSAgICAgICBwb3N0cHJvbG9ndWVfYWRkcik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIGRpZV9za2lwX3Byb2xvZ3VlIC0gVXNlIG5leHQgYWRkcmVzcyBhZnRlciBwcm9sb2d1ZSBhcyBwcm9iZSBsb2NhdGlvbgorICogQHNwX2RpZTogYSBzdWJwcm9ncmFtIERJRQorICogQGN1X2RpZTogYSBDVSBESUUKKyAqIEBlbnRyeXBjOiBlbnRyeXBjIG9mIHRoZSBmdW5jdGlvbgorICoKKyAqIEZ1bmN0aW9uIHByb2xvZ3VlIHByZXBhcmVzIHN0YWNrIGFuZCByZWdpc3RlcnMgYmVmb3JlIGV4ZWN1dGluZyBmdW5jdGlvbgorICogbG9naWMuIFdoZW4gdGFyZ2V0IHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aG91dCBvcHRpbWl6YXRpb24sIGZ1bmN0aW9uCisgKiBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gaXMgb25seSB2YWxpZCBhZnRlciBwcm9sb2d1ZS4gV2hlbiB3ZSBwcm9iZSBlbnRyeXBjCisgKiBvZiB0aGUgZnVuY3Rpb24sIGFuZCB0cnkgdG8gcmVjb3JkIGZ1bmN0aW9uIHBhcmFtZXRlciwgaXQgY29udGFpbnMKKyAqIGdhcmJhZ2UgdmFsdWUuCisgKi8KK3ZvaWQgZGllX3NraXBfcHJvbG9ndWUoRHdhcmZfRGllICpzcF9kaWUsIER3YXJmX0RpZSAqY3VfZGllLAorCQkgICAgICAgRHdhcmZfQWRkciAqZW50cnlwYykKK3sKKwlzaXplX3QgbnJfbGluZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgZW50cnlwY19pZHggPSAwOworCUR3YXJmX0xpbmVzICpsaW5lcyA9IE5VTEw7CisJRHdhcmZfQWRkciBwb3N0cHJvbG9ndWVfYWRkcjsKKwlEd2FyZl9BZGRyIGhpZ2hwYzsKKworCWlmIChkd2FyZl9oaWdocGMoc3BfZGllLCAmaGlnaHBjKSkKKwkJcmV0dXJuOworCisJaWYgKGR3YXJmX2dldHNyY2xpbmVzKGN1X2RpZSwgJmxpbmVzLCAmbnJfbGluZXMpKQorCQlyZXR1cm47CisKKwlpZiAoIWRpZV9zZWFyY2hfaWR4KGxpbmVzLCBucl9saW5lcywgKmVudHJ5cGMsICZlbnRyeXBjX2lkeCkpCisJCXJldHVybjsKKworCWlmICghZGllX2dldF9wb3N0cHJvbG9ndWVfYWRkcihlbnRyeXBjX2lkeCwgbGluZXMsIG5yX2xpbmVzLAorCQkJCSAgICAgICBoaWdocGMsICZwb3N0cHJvbG9ndWVfYWRkcikpCisJCXJldHVybjsKKworCSplbnRyeXBjID0gcG9zdHByb2xvZ3VlX2FkZHI7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmggYi90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmgKaW5kZXggZGMwY2UxYS4uOGFjNTNiZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2R3YXJmLWF1eC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguaApAQCAtMzgsNiArMzgsOSBAQAogaW50IGN1X3dhbGtfZnVuY3Rpb25zX2F0KER3YXJmX0RpZSAqY3VfZGllLCBEd2FyZl9BZGRyIGFkZHIsCiAJCQkgaW50ICgqY2FsbGJhY2spKER3YXJmX0RpZSAqLCB2b2lkICopLCB2b2lkICpkYXRhKTsKIAorLyogR2V0IERXX0FUX2xpbmthZ2VfbmFtZSAoc2hvdWxkIGJlIE5VTEwgZm9yIEMgYmluYXJ5KSAqLworY29uc3QgY2hhciAqZGllX2dldF9saW5rYWdlX25hbWUoRHdhcmZfRGllICpkd19kaWUpOworCiAvKiBFbnN1cmUgdGhhdCB0aGlzIERJRSBpcyBhIHN1YnByb2dyYW0gYW5kIGRlZmluaXRpb24gKG5vdCBkZWNsYXJhdGlvbikgKi8KIGJvb2wgZGllX2lzX2Z1bmNfZGVmKER3YXJmX0RpZSAqZHdfZGllKTsKIApAQCAtMTI1LDQgKzEyOCwxMiBAQAogLyogR2V0IHRoZSBuYW1lIGFuZCB0eXBlIG9mIGdpdmVuIHZhcmlhYmxlIERJRSwgc3RvcmVkIGFzICJ0eXBlXHRuYW1lIiAqLwogaW50IGRpZV9nZXRfdmFybmFtZShEd2FyZl9EaWUgKnZyX2RpZSwgc3RydWN0IHN0cmJ1ZiAqYnVmKTsKIGludCBkaWVfZ2V0X3Zhcl9yYW5nZShEd2FyZl9EaWUgKnNwX2RpZSwgRHdhcmZfRGllICp2cl9kaWUsIHN0cnVjdCBzdHJidWYgKmJ1Zik7CisKKy8qIENoZWNrIGlmIHRhcmdldCBwcm9ncmFtIGlzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9uICovCitib29sIGRpZV9pc19vcHRpbWl6ZWRfdGFyZ2V0KER3YXJmX0RpZSAqY3VfZGllKTsKKworLyogVXNlIG5leHQgYWRkcmVzcyBhZnRlciBwcm9sb2d1ZSBhcyBwcm9iZSBsb2NhdGlvbiAqLwordm9pZCBkaWVfc2tpcF9wcm9sb2d1ZShEd2FyZl9EaWUgKnNwX2RpZSwgRHdhcmZfRGllICpjdV9kaWUsCisJCSAgICAgICBEd2FyZl9BZGRyICplbnRyeXBjKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHdhcmYtcmVncy5jIGIvdG9vbHMvcGVyZi91dGlsL2R3YXJmLXJlZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmJjNGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2R3YXJmLXJlZ3MuYwpAQCAtMCwwICsxLDU5IEBACisvKgorICogZHdhcmYtcmVncy5jIDogTWFwcGluZyBvZiBEV0FSRiBkZWJ1ZyByZWdpc3RlciBudW1iZXJzIGludG8gcmVnaXN0ZXIgbmFtZXMuCisgKgorICogV3JpdHRlbiBieTogTWFzYW1pIEhpcmFtYXRzdSA8bWhpcmFtYXRAa2VybmVsLm9yZz4KKyAqLworCisjaW5jbHVkZSA8dXRpbC5oPgorI2luY2x1ZGUgPGRlYnVnLmg+CisjaW5jbHVkZSA8ZHdhcmYtcmVncy5oPgorI2luY2x1ZGUgPGVsZi5oPgorCisjaWZuZGVmIEVNX0FBUkNINjQKKyNkZWZpbmUgRU1fQUFSQ0g2NAkxODMgIC8qIEFSTSA2NCBiaXQgKi8KKyNlbmRpZgorCisvKiBEZWZpbmUgY29uc3QgY2hhciAqIHthcmNofV9yZWdpc3Rlcl90YmxbXSAqLworI2RlZmluZSBERUZJTkVfRFdBUkZfUkVHU1RSX1RBQkxFCisjaW5jbHVkZSAiLi4vYXJjaC94ODYvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgiCisjaW5jbHVkZSAiLi4vYXJjaC9hcm0vaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgiCisjaW5jbHVkZSAiLi4vYXJjaC9hcm02NC9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCIKKyNpbmNsdWRlICIuLi9hcmNoL3NoL2luY2x1ZGUvZHdhcmYtcmVncy10YWJsZS5oIgorI2luY2x1ZGUgIi4uL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCIKKyNpbmNsdWRlICIuLi9hcmNoL3MzOTAvaW5jbHVkZS9kd2FyZi1yZWdzLXRhYmxlLmgiCisjaW5jbHVkZSAiLi4vYXJjaC9zcGFyYy9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCIKKyNpbmNsdWRlICIuLi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2R3YXJmLXJlZ3MtdGFibGUuaCIKKworI2RlZmluZSBfX2dldF9kd2FyZl9yZWdzdHIodGJsLCBuKSAoKChuKSA8IEFSUkFZX1NJWkUodGJsKSkgPyAodGJsKVsobildIDogTlVMTCkKKworLyogUmV0dXJuIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgcmVnaXN0ZXIgc3RyaW5nIChmb3Iga3Byb2JlLXRyYWNlcikgKi8KK2NvbnN0IGNoYXIgKmdldF9kd2FyZl9yZWdzdHIodW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCBtYWNoaW5lKQoreworCXN3aXRjaCAobWFjaGluZSkgeworCWNhc2UgRU1fTk9ORToJLyogR2VuZXJpYyBhcmNoIC0gdXNlIGhvc3QgYXJjaCAqLworCQlyZXR1cm4gZ2V0X2FyY2hfcmVnc3RyKG4pOworCWNhc2UgRU1fMzg2OgorCQlyZXR1cm4gX19nZXRfZHdhcmZfcmVnc3RyKHg4Nl8zMl9yZWdzdHJfdGJsLCBuKTsKKwljYXNlIEVNX1g4Nl82NDoKKwkJcmV0dXJuIF9fZ2V0X2R3YXJmX3JlZ3N0cih4ODZfNjRfcmVnc3RyX3RibCwgbik7CisJY2FzZSBFTV9BUk06CisJCXJldHVybiBfX2dldF9kd2FyZl9yZWdzdHIoYXJtX3JlZ3N0cl90YmwsIG4pOworCWNhc2UgRU1fQUFSQ0g2NDoKKwkJcmV0dXJuIF9fZ2V0X2R3YXJmX3JlZ3N0cihhYXJjaDY0X3JlZ3N0cl90YmwsIG4pOworCWNhc2UgRU1fU0g6CisJCXJldHVybiBfX2dldF9kd2FyZl9yZWdzdHIoc2hfcmVnc3RyX3RibCwgbik7CisJY2FzZSBFTV9TMzkwOgorCQlyZXR1cm4gX19nZXRfZHdhcmZfcmVnc3RyKHMzOTBfcmVnc3RyX3RibCwgbik7CisJY2FzZSBFTV9QUEM6CisJY2FzZSBFTV9QUEM2NDoKKwkJcmV0dXJuIF9fZ2V0X2R3YXJmX3JlZ3N0cihwb3dlcnBjX3JlZ3N0cl90YmwsIG4pOworCWNhc2UgRU1fU1BBUkM6CisJY2FzZSBFTV9TUEFSQ1Y5OgorCQlyZXR1cm4gX19nZXRfZHdhcmZfcmVnc3RyKHNwYXJjX3JlZ3N0cl90YmwsIG4pOworCWNhc2UgRU1fWFRFTlNBOgorCQlyZXR1cm4gX19nZXRfZHdhcmZfcmVnc3RyKHh0ZW5zYV9yZWdzdHJfdGJsLCBuKTsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIkVMRiBNQUNISU5FICV4IGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBtYWNoaW5lKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZlbnQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCmluZGV4IGUyMDQzOGIuLjhhYjBkN2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jCkBAIC0xLDUgKzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L21tYW4uaD4gLyogVG8gZ2V0IHRoaW5ncyBsaWtlIE1BUF9IVUdFVExCIGV2ZW4gb24gb2xkZXIgbGliYyBoZWFkZXJzICovCisjaW5jbHVkZSA8YXBpL2ZzL2ZzLmg+CiAjaW5jbHVkZSAiZXZlbnQuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImhpc3QuaCIKQEAgLTI0OCw2ICsyNDksOCBAQAogCWJvb2wgdHJ1bmNhdGlvbiA9IGZhbHNlOwogCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lb3V0ID0gcHJvY19tYXBfdGltZW91dCAqIDEwMDAwMDBVTEw7CiAJaW50IHJjID0gMDsKKwljb25zdCBjaGFyICpodWdldGxiZnNfbW50ID0gaHVnZXRsYmZzX19tb3VudHBvaW50KCk7CisJaW50IGh1Z2V0bGJmc19tbnRfbGVuID0gaHVnZXRsYmZzX21udCA/IHN0cmxlbihodWdldGxiZnNfbW50KSA6IDA7CiAKIAlpZiAobWFjaGluZV9faXNfZGVmYXVsdF9ndWVzdChtYWNoaW5lKSkKIAkJcmV0dXJuIDA7CkBAIC0zNDMsNiArMzQ2LDEyIEBACiAJCWlmICghc3RyY21wKGV4ZWNuYW1lLCAiIikpCiAJCQlzdHJjcHkoZXhlY25hbWUsIGFub25zdHIpOwogCisJCWlmIChodWdldGxiZnNfbW50X2xlbiAmJgorCQkgICAgIXN0cm5jbXAoZXhlY25hbWUsIGh1Z2V0bGJmc19tbnQsIGh1Z2V0bGJmc19tbnRfbGVuKSkgeworCQkJc3RyY3B5KGV4ZWNuYW1lLCBhbm9uc3RyKTsKKwkJCWV2ZW50LT5tbWFwMi5mbGFncyB8PSBNQVBfSFVHRVRMQjsKKwkJfQorCiAJCXNpemUgPSBzdHJsZW4oZXhlY25hbWUpICsgMTsKIAkJbWVtY3B5KGV2ZW50LT5tbWFwMi5maWxlbmFtZSwgZXhlY25hbWUsIHNpemUpOwogCQlzaXplID0gUEVSRl9BTElHTihzaXplLCBzaXplb2YodTY0KSk7CkBAIC0xMjg2LDcgKzEyOTUsNyBAQAogCQkgKiBtdXN0IGJlIGRvbmUgcHJpb3IgdG8gdXNpbmcga2VybmVsIG1hcHMuCiAJCSAqLwogCQlpZiAobG9hZF9tYXApCi0JCQltYXBfX2xvYWQoYWwtPm1hcCwgbWFjaGluZS0+c3ltYm9sX2ZpbHRlcik7CisJCQltYXBfX2xvYWQoYWwtPm1hcCk7CiAJCWFsLT5hZGRyID0gYWwtPm1hcC0+bWFwX2lwKGFsLT5tYXAsIGFsLT5hZGRyKTsKIAl9CiB9CkBAIC0xMjk3LDggKzEzMDYsNyBAQAogewogCXRocmVhZF9fZmluZF9hZGRyX21hcCh0aHJlYWQsIGNwdW1vZGUsIHR5cGUsIGFkZHIsIGFsKTsKIAlpZiAoYWwtPm1hcCAhPSBOVUxMKQotCQlhbC0+c3ltID0gbWFwX19maW5kX3N5bWJvbChhbC0+bWFwLCBhbC0+YWRkciwKLQkJCQkJICAgdGhyZWFkLT5tZy0+bWFjaGluZS0+c3ltYm9sX2ZpbHRlcik7CisJCWFsLT5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLT5tYXAsIGFsLT5hZGRyKTsKIAllbHNlCiAJCWFsLT5zeW0gPSBOVUxMOwogfQpAQCAtMTM1OSw4ICsxMzY3LDcgQEAKIAkJCWFsLT5maWx0ZXJlZCB8PSAoMSA8PCBISVNUX0ZJTFRFUl9fRFNPKTsKIAkJfQogCi0JCWFsLT5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLT5tYXAsIGFsLT5hZGRyLAotCQkJCQkgICBtYWNoaW5lLT5zeW1ib2xfZmlsdGVyKTsKKwkJYWwtPnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYWwtPm1hcCwgYWwtPmFkZHIpOwogCX0KIAogCWlmIChzeW1ib2xfY29uZi5zeW1fbGlzdCAmJgpAQCAtMTQxNiw1ICsxNDIzLDUgQEAKIAlhbC0+c3ltID0gTlVMTDsKIAogCWlmIChhbC0+bWFwKQotCQlhbC0+c3ltID0gbWFwX19maW5kX3N5bWJvbChhbC0+bWFwLCBhbC0+YWRkciwgTlVMTCk7CisJCWFsLT5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLT5tYXAsIGFsLT5hZGRyKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYwppbmRleCAwOTdiM2VkLi5lYTM0YzVhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jCkBAIC0xMDMyLDE2ICsxMDMyLDE4IEBACiB9CiAKIHN0YXRpYyBpbnQgcGVyZl9ldmxpc3RfX21tYXBfcGVyX2V2c2VsKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBpbnQgaWR4LAotCQkJCSAgICAgICBzdHJ1Y3QgbW1hcF9wYXJhbXMgKm1wLCBpbnQgY3B1LAorCQkJCSAgICAgICBzdHJ1Y3QgbW1hcF9wYXJhbXMgKm1wLCBpbnQgY3B1X2lkeCwKIAkJCQkgICAgICAgaW50IHRocmVhZCwgaW50ICpfb3V0cHV0LCBpbnQgKl9vdXRwdXRfYmFja3dhcmQpCiB7CiAJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOwogCWludCByZXZlbnQ7CisJaW50IGV2bGlzdF9jcHUgPSBjcHVfbWFwX19jcHUoZXZsaXN0LT5jcHVzLCBjcHVfaWR4KTsKIAogCWV2bGlzdF9fZm9yX2VhY2hfZW50cnkoZXZsaXN0LCBldnNlbCkgewogCQlzdHJ1Y3QgcGVyZl9tbWFwICptYXBzID0gZXZsaXN0LT5tbWFwOwogCQlpbnQgKm91dHB1dCA9IF9vdXRwdXQ7CiAJCWludCBmZDsKKwkJaW50IGNwdTsKIAogCQlpZiAoZXZzZWwtPmF0dHIud3JpdGVfYmFja3dhcmQpIHsKIAkJCW91dHB1dCA9IF9vdXRwdXRfYmFja3dhcmQ7CkBAIC0xMDYwLDYgKzEwNjIsMTAgQEAKIAkJaWYgKGV2c2VsLT5zeXN0ZW1fd2lkZSAmJiB0aHJlYWQpCiAJCQljb250aW51ZTsKIAorCQljcHUgPSBjcHVfbWFwX19pZHgoZXZzZWwtPmNwdXMsIGV2bGlzdF9jcHUpOworCQlpZiAoY3B1ID09IC0xKQorCQkJY29udGludWU7CisKIAkJZmQgPSBGRChldnNlbCwgY3B1LCB0aHJlYWQpOwogCiAJCWlmICgqb3V0cHV0ID09IC0xKSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCmluZGV4IDIxZmQ1NzMuLjM4MGU4NGMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jCkBAIC0xMDQ1LDE1ICsxMDQ1LDE1IEBACiAJcmV0dXJuIC0xOwogfQogCi1pbnQgcGVyZl9ldnNlbF9fYXBwZW5kX2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCi0JCQkgICAgICBjb25zdCBjaGFyICpvcCwgY29uc3QgY2hhciAqZmlsdGVyKQorc3RhdGljIGludCBwZXJmX2V2c2VsX19hcHBlbmRfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgY2hhciAqZmlsdGVyKQogewogCWNoYXIgKm5ld19maWx0ZXI7CiAKIAlpZiAoZXZzZWwtPmZpbHRlciA9PSBOVUxMKQogCQlyZXR1cm4gcGVyZl9ldnNlbF9fc2V0X2ZpbHRlcihldnNlbCwgZmlsdGVyKTsKIAotCWlmIChhc3ByaW50ZigmbmV3X2ZpbHRlciwiKCVzKSAlcyAoJXMpIiwgZXZzZWwtPmZpbHRlciwgb3AsIGZpbHRlcikgPiAwKSB7CisJaWYgKGFzcHJpbnRmKCZuZXdfZmlsdGVyLCBmbXQsIGV2c2VsLT5maWx0ZXIsIGZpbHRlcikgPiAwKSB7CiAJCWZyZWUoZXZzZWwtPmZpbHRlcik7CiAJCWV2c2VsLT5maWx0ZXIgPSBuZXdfZmlsdGVyOwogCQlyZXR1cm4gMDsKQEAgLTEwNjIsNiArMTA2MiwxNiBAQAogCXJldHVybiAtMTsKIH0KIAoraW50IHBlcmZfZXZzZWxfX2FwcGVuZF90cF9maWx0ZXIoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBjb25zdCBjaGFyICpmaWx0ZXIpCit7CisJcmV0dXJuIHBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIoZXZzZWwsICIoJXMpICYmICglcykiLCBmaWx0ZXIpOworfQorCitpbnQgcGVyZl9ldnNlbF9fYXBwZW5kX2FkZHJfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgY29uc3QgY2hhciAqZmlsdGVyKQoreworCXJldHVybiBwZXJmX2V2c2VsX19hcHBlbmRfZmlsdGVyKGV2c2VsLCAiJXMsJXMiLCBmaWx0ZXIpOworfQorCiBpbnQgcGVyZl9ldnNlbF9fZW5hYmxlKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKIHsKIAlpbnQgbnRocmVhZHMgPSB0aHJlYWRfbWFwX19ucihldnNlbC0+dGhyZWFkcyk7CkBAIC0xNzI4LDcgKzE3MzgsNiBAQAogCWRhdGEtPmNwdSA9IGRhdGEtPnBpZCA9IGRhdGEtPnRpZCA9IC0xOwogCWRhdGEtPnN0cmVhbV9pZCA9IGRhdGEtPmlkID0gZGF0YS0+dGltZSA9IC0xVUxMOwogCWRhdGEtPnBlcmlvZCA9IGV2c2VsLT5hdHRyLnNhbXBsZV9wZXJpb2Q7Ci0JZGF0YS0+d2VpZ2h0ID0gMDsKIAlkYXRhLT5jcHVtb2RlID0gZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9SRUNPUkRfTUlTQ19DUFVNT0RFX01BU0s7CiAKIAlpZiAoZXZlbnQtPmhlYWRlci50eXBlICE9IFBFUkZfUkVDT1JEX1NBTVBMRSkgewpAQCAtMTkzNSw3ICsxOTQ0LDYgQEAKIAkJfQogCX0KIAotCWRhdGEtPndlaWdodCA9IDA7CiAJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9XRUlHSFQpIHsKIAkJT1ZFUkZMT1dfQ0hFQ0tfdTY0KGFycmF5KTsKIAkJZGF0YS0+d2VpZ2h0ID0gKmFycmF5OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmggYi90b29scy9wZXJmL3V0aWwvZXZzZWwuaAppbmRleCA0ZDQ0MTI5Li5iMTUwM2IwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZzZWwuaAorKysgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuaApAQCAtNDYsNiArNDYsNyBAQAogCVBFUkZfRVZTRUxfX0NPTkZJR19URVJNX0lOSEVSSVQsCiAJUEVSRl9FVlNFTF9fQ09ORklHX1RFUk1fTUFYX1NUQUNLLAogCVBFUkZfRVZTRUxfX0NPTkZJR19URVJNX09WRVJXUklURSwKKwlQRVJGX0VWU0VMX19DT05GSUdfVEVSTV9EUlZfQ0ZHLAogCVBFUkZfRVZTRUxfX0NPTkZJR19URVJNX01BWCwKIH07CiAKQEAgLTU3LDYgKzU4LDcgQEAKIAkJdTY0CWZyZXE7CiAJCWJvb2wJdGltZTsKIAkJY2hhcgkqY2FsbGdyYXBoOworCQljaGFyCSpkcnZfY2ZnOwogCQl1NjQJc3RhY2tfdXNlcjsKIAkJaW50CW1heF9zdGFjazsKIAkJYm9vbAlpbmhlcml0OwpAQCAtMjMzLDggKzIzNSw5IEBACiAJCQkgICAgICAgYm9vbCB1c2Vfc2FtcGxlX2lkZW50aWZpZXIpOwogCiBpbnQgcGVyZl9ldnNlbF9fc2V0X2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGNvbnN0IGNoYXIgKmZpbHRlcik7Ci1pbnQgcGVyZl9ldnNlbF9fYXBwZW5kX2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCi0JCQkgICAgICBjb25zdCBjaGFyICpvcCwgY29uc3QgY2hhciAqZmlsdGVyKTsKK2ludCBwZXJmX2V2c2VsX19hcHBlbmRfdHBfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgY29uc3QgY2hhciAqZmlsdGVyKTsKK2ludCBwZXJmX2V2c2VsX19hcHBlbmRfYWRkcl9maWx0ZXIoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJCSAgIGNvbnN0IGNoYXIgKmZpbHRlcik7CiBpbnQgcGVyZl9ldnNlbF9fYXBwbHlfZmlsdGVyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgaW50IG5jcHVzLCBpbnQgbnRocmVhZHMsCiAJCQkgICAgIGNvbnN0IGNoYXIgKmZpbHRlcik7CiBpbnQgcGVyZl9ldnNlbF9fZW5hYmxlKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWxfZnByaW50Zi5jIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsX2ZwcmludGYuYwppbmRleCAzNjc0ZTc3Li42NjJhMGE2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZzZWxfZnByaW50Zi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbF9mcHJpbnRmLmMKQEAgLTEyMiw5ICsxMjIsNiBAQAogCQkJaWYgKCFub2RlKQogCQkJCWJyZWFrOwogCi0JCQlpZiAobm9kZS0+c3ltICYmIG5vZGUtPnN5bS0+aWdub3JlKQotCQkJCWdvdG8gbmV4dDsKLQogCQkJcHJpbnRlZCArPSBmcHJpbnRmKGZwLCAiJS0qLipzIiwgbGVmdF9hbGlnbm1lbnQsIGxlZnRfYWxpZ25tZW50LCAiICIpOwogCiAJCQlpZiAocHJpbnRfaXApCkBAIC0xNTgsNyArMTU1LDcgQEAKIAogCQkJaWYgKCFwcmludF9vbmVsaW5lKQogCQkJCXByaW50ZWQgKz0gZnByaW50ZihmcCwgIlxuIik7Ci1uZXh0OgorCiAJCQljYWxsY2hhaW5fY3Vyc29yX2FkdmFuY2UoY3Vyc29yKTsKIAkJfQogCX0KQEAgLTE4MSw3ICsxNzgsNyBAQAogCWlmIChjdXJzb3IgIT0gTlVMTCkgewogCQlwcmludGVkICs9IHNhbXBsZV9fZnByaW50Zl9jYWxsY2hhaW4oc2FtcGxlLCBsZWZ0X2FsaWdubWVudCwKIAkJCQkJCSAgICAgcHJpbnRfb3B0cywgY3Vyc29yLCBmcCk7Ci0JfSBlbHNlIGlmICghKGFsLT5zeW0gJiYgYWwtPnN5bS0+aWdub3JlKSkgeworCX0gZWxzZSB7CiAJCXByaW50ZWQgKz0gZnByaW50ZihmcCwgIiUtKi4qcyIsIGxlZnRfYWxpZ25tZW50LCBsZWZ0X2FsaWdubWVudCwgIiAiKTsKIAogCQlpZiAocHJpbnRfaXApCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMgYi90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMKaW5kZXggOGYwZGI0MC4uODVkZDBkYiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYwpAQCAtODI4LDggKzgyOCw3IEBACiAgKiBkZWZhdWx0IGdldF9jcHVpZCgpOiBub3RoaW5nIGdldHMgcmVjb3JkZWQKICAqIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIGluIGFyY2gvJChBUkNIKS91dGlsL2hlYWRlci5jCiAgKi8KLWludCBfX2F0dHJpYnV0ZV9fICgod2VhaykpIGdldF9jcHVpZChjaGFyICpidWZmZXIgX19tYXliZV91bnVzZWQsCi0JCQkJICAgICBzaXplX3Qgc3ogX19tYXliZV91bnVzZWQpCitpbnQgX193ZWFrIGdldF9jcHVpZChjaGFyICpidWZmZXIgX19tYXliZV91bnVzZWQsIHNpemVfdCBzeiBfX21heWJlX3VudXNlZCkKIHsKIAlyZXR1cm4gLTE7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGlzdC5jIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuYwppbmRleCBkZTE1ZGJjLi5iMDI5OTJlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGlzdC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMKQEAgLTE3Nyw4ICsxNzcsMTAgQEAKIAloaXN0c19fbmV3X2NvbF9sZW4oaGlzdHMsIEhJU1RDX0xPQ0FMX1dFSUdIVCwgMTIpOwogCWhpc3RzX19uZXdfY29sX2xlbihoaXN0cywgSElTVENfR0xPQkFMX1dFSUdIVCwgMTIpOwogCi0JaWYgKGgtPnNyY2xpbmUpCi0JCWhpc3RzX19uZXdfY29sX2xlbihoaXN0cywgSElTVENfU1JDTElORSwgc3RybGVuKGgtPnNyY2xpbmUpKTsKKwlpZiAoaC0+c3JjbGluZSkgeworCQlsZW4gPSBNQVgoc3RybGVuKGgtPnNyY2xpbmUpLCBzdHJsZW4oc29ydF9zcmNsaW5lLnNlX2hlYWRlcikpOworCQloaXN0c19fbmV3X2NvbF9sZW4oaGlzdHMsIEhJU1RDX1NSQ0xJTkUsIGxlbik7CisJfQogCiAJaWYgKGgtPnNyY2ZpbGUpCiAJCWhpc3RzX19uZXdfY29sX2xlbihoaXN0cywgSElTVENfU1JDRklMRSwgc3RybGVuKGgtPnNyY2ZpbGUpKTsKQEAgLTQxNyw2ICs0MTksOCBAQAogCX0KIAlJTklUX0xJU1RfSEVBRCgmaGUtPnBhaXJzLm5vZGUpOwogCXRocmVhZF9fZ2V0KGhlLT50aHJlYWQpOworCWhlLT5ocm9vdF9pbiAgPSBSQl9ST09UOworCWhlLT5ocm9vdF9vdXQgPSBSQl9ST09UOwogCiAJaWYgKCFzeW1ib2xfY29uZi5yZXBvcnRfaGllcmFyY2h5KQogCQloZS0+bGVhZiA9IHRydWU7CkBAIC0yMTQ5LDYgKzIxNTMsNTAgQEAKIAlyZXR1cm4gaGU7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaGlzdF9lbnRyeSAqYWRkX2R1bW15X2hpZXJhcmNoeV9lbnRyeShzdHJ1Y3QgaGlzdHMgKmhpc3RzLAorCQkJCQkJICAgIHN0cnVjdCByYl9yb290ICpyb290LAorCQkJCQkJICAgIHN0cnVjdCBoaXN0X2VudHJ5ICpwYWlyKQoreworCXN0cnVjdCByYl9ub2RlICoqcDsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGU7CisJc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10OworCisJcCA9ICZyb290LT5yYl9ub2RlOworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCWludDY0X3QgY21wID0gMDsKKworCQlwYXJlbnQgPSAqcDsKKwkJaGUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlX2luKTsKKworCQlwZXJmX2hwcF9saXN0X19mb3JfZWFjaF9zb3J0X2xpc3QoaGUtPmhwcF9saXN0LCBmbXQpIHsKKwkJCWNtcCA9IGZtdC0+Y29sbGFwc2UoZm10LCBoZSwgcGFpcik7CisJCQlpZiAoY21wKQorCQkJCWJyZWFrOworCQl9CisJCWlmICghY21wKQorCQkJZ290byBvdXQ7CisKKwkJaWYgKGNtcCA8IDApCisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCX0KKworCWhlID0gaGlzdF9lbnRyeV9fbmV3KHBhaXIsIHRydWUpOworCWlmIChoZSkgeworCQlyYl9saW5rX25vZGUoJmhlLT5yYl9ub2RlX2luLCBwYXJlbnQsIHApOworCQlyYl9pbnNlcnRfY29sb3IoJmhlLT5yYl9ub2RlX2luLCByb290KTsKKworCQloZS0+ZHVtbXkgPSB0cnVlOworCQloZS0+aGlzdHMgPSBoaXN0czsKKwkJbWVtc2V0KCZoZS0+c3RhdCwgMCwgc2l6ZW9mKGhlLT5zdGF0KSk7CisJCWhpc3RzX19pbmNfc3RhdHMoaGlzdHMsIGhlKTsKKwl9CitvdXQ6CisJcmV0dXJuIGhlOworfQorCiBzdGF0aWMgc3RydWN0IGhpc3RfZW50cnkgKmhpc3RzX19maW5kX2VudHJ5KHN0cnVjdCBoaXN0cyAqaGlzdHMsCiAJCQkJCSAgICBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpCiB7CkBAIC0yMTc0LDYgKzIyMjIsNTEgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHN0cnVjdCBoaXN0X2VudHJ5ICpoaXN0c19fZmluZF9oaWVyYXJjaHlfZW50cnkoc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJCQkJCQkgICAgICBzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSByb290LT5yYl9ub2RlOworCisJd2hpbGUgKG4pIHsKKwkJc3RydWN0IGhpc3RfZW50cnkgKml0ZXI7CisJCXN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdDsKKwkJaW50NjRfdCBjbXAgPSAwOworCisJCWl0ZXIgPSByYl9lbnRyeShuLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZV9pbik7CisJCXBlcmZfaHBwX2xpc3RfX2Zvcl9lYWNoX3NvcnRfbGlzdChoZS0+aHBwX2xpc3QsIGZtdCkgeworCQkJY21wID0gZm10LT5jb2xsYXBzZShmbXQsIGl0ZXIsIGhlKTsKKwkJCWlmIChjbXApCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY21wIDwgMCkKKwkJCW4gPSBuLT5yYl9sZWZ0OworCQllbHNlIGlmIChjbXAgPiAwKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gaXRlcjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaGlzdHNfX21hdGNoX2hpZXJhcmNoeShzdHJ1Y3QgcmJfcm9vdCAqbGVhZGVyX3Jvb3QsCisJCQkJICAgc3RydWN0IHJiX3Jvb3QgKm90aGVyX3Jvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKm5kOworCXN0cnVjdCBoaXN0X2VudHJ5ICpwb3MsICpwYWlyOworCisJZm9yIChuZCA9IHJiX2ZpcnN0KGxlYWRlcl9yb290KTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJcG9zICA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZV9pbik7CisJCXBhaXIgPSBoaXN0c19fZmluZF9oaWVyYXJjaHlfZW50cnkob3RoZXJfcm9vdCwgcG9zKTsKKworCQlpZiAocGFpcikgeworCQkJaGlzdF9lbnRyeV9fYWRkX3BhaXIocGFpciwgcG9zKTsKKwkJCWhpc3RzX19tYXRjaF9oaWVyYXJjaHkoJnBvcy0+aHJvb3RfaW4sICZwYWlyLT5ocm9vdF9pbik7CisJCX0KKwl9Cit9CisKIC8qCiAgKiBMb29rIGZvciBwYWlycyB0byBsaW5rIHRvIHRoZSBsZWFkZXIgYnVja2V0cyAoaGlzdF9lbnRyaWVzKToKICAqLwpAQCAtMjE4Myw2ICsyMjc2LDEyIEBACiAJc3RydWN0IHJiX25vZGUgKm5kOwogCXN0cnVjdCBoaXN0X2VudHJ5ICpwb3MsICpwYWlyOwogCisJaWYgKHN5bWJvbF9jb25mLnJlcG9ydF9oaWVyYXJjaHkpIHsKKwkJLyogaGllcmFyY2h5IHJlcG9ydCBhbHdheXMgY29sbGFwc2VzIGVudHJpZXMgKi8KKwkJcmV0dXJuIGhpc3RzX19tYXRjaF9oaWVyYXJjaHkoJmxlYWRlci0+ZW50cmllc19jb2xsYXBzZWQsCisJCQkJCSAgICAgICZvdGhlci0+ZW50cmllc19jb2xsYXBzZWQpOworCX0KKwogCWlmIChoaXN0c19faGFzKGxlYWRlciwgbmVlZF9jb2xsYXBzZSkpCiAJCXJvb3QgPSAmbGVhZGVyLT5lbnRyaWVzX2NvbGxhcHNlZDsKIAllbHNlCkBAIC0yMTk3LDYgKzIyOTYsNTAgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgaGlzdHNfX2xpbmtfaGllcmFyY2h5KHN0cnVjdCBoaXN0cyAqbGVhZGVyX2hpc3RzLAorCQkJCSBzdHJ1Y3QgaGlzdF9lbnRyeSAqcGFyZW50LAorCQkJCSBzdHJ1Y3QgcmJfcm9vdCAqbGVhZGVyX3Jvb3QsCisJCQkJIHN0cnVjdCByYl9yb290ICpvdGhlcl9yb290KQoreworCXN0cnVjdCByYl9ub2RlICpuZDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqcG9zLCAqbGVhZGVyOworCisJZm9yIChuZCA9IHJiX2ZpcnN0KG90aGVyX3Jvb3QpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCQlwb3MgPSByYl9lbnRyeShuZCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGVfaW4pOworCisJCWlmIChoaXN0X2VudHJ5X19oYXNfcGFpcnMocG9zKSkgeworCQkJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxlYWRlciwgJnBvcy0+cGFpcnMuaGVhZCwgcGFpcnMubm9kZSkgeworCQkJCWlmIChsZWFkZXItPmhpc3RzID09IGxlYWRlcl9oaXN0cykgeworCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICghZm91bmQpCisJCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJbGVhZGVyID0gYWRkX2R1bW15X2hpZXJhcmNoeV9lbnRyeShsZWFkZXJfaGlzdHMsCisJCQkJCQkJICAgbGVhZGVyX3Jvb3QsIHBvcyk7CisJCQlpZiAobGVhZGVyID09IE5VTEwpCisJCQkJcmV0dXJuIC0xOworCisJCQkvKiBkbyBub3QgcG9pbnQgcGFyZW50IGluIHRoZSBwb3MgKi8KKwkJCWxlYWRlci0+cGFyZW50X2hlID0gcGFyZW50OworCisJCQloaXN0X2VudHJ5X19hZGRfcGFpcihwb3MsIGxlYWRlcik7CisJCX0KKworCQlpZiAoIXBvcy0+bGVhZikgeworCQkJaWYgKGhpc3RzX19saW5rX2hpZXJhcmNoeShsZWFkZXJfaGlzdHMsIGxlYWRlciwKKwkJCQkJCSAgJmxlYWRlci0+aHJvb3RfaW4sCisJCQkJCQkgICZwb3MtPmhyb290X2luKSA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXJldHVybiAwOworfQorCiAvKgogICogTG9vayBmb3IgZW50cmllcyBpbiB0aGUgb3RoZXIgaGlzdHMgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGxlYWRlciwgaWYKICAqIHdlIGZpbmQgdGhlbSwganVzdCBhZGQgYSBkdW1teSBlbnRyeSBvbiB0aGUgbGVhZGVyIGhpc3RzLCB3aXRoIHBlcmlvZD0wLApAQCAtMjIwOCw2ICsyMzUxLDEzIEBACiAJc3RydWN0IHJiX25vZGUgKm5kOwogCXN0cnVjdCBoaXN0X2VudHJ5ICpwb3MsICpwYWlyOwogCisJaWYgKHN5bWJvbF9jb25mLnJlcG9ydF9oaWVyYXJjaHkpIHsKKwkJLyogaGllcmFyY2h5IHJlcG9ydCBhbHdheXMgY29sbGFwc2VzIGVudHJpZXMgKi8KKwkJcmV0dXJuIGhpc3RzX19saW5rX2hpZXJhcmNoeShsZWFkZXIsIE5VTEwsCisJCQkJCSAgICAgJmxlYWRlci0+ZW50cmllc19jb2xsYXBzZWQsCisJCQkJCSAgICAgJm90aGVyLT5lbnRyaWVzX2NvbGxhcHNlZCk7CisJfQorCiAJaWYgKGhpc3RzX19oYXMob3RoZXIsIG5lZWRfY29sbGFwc2UpKQogCQlyb290ID0gJm90aGVyLT5lbnRyaWVzX2NvbGxhcHNlZDsKIAllbHNlCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGlzdC5oIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuaAppbmRleCAwYTFlZGYxLi45OTI4ZmVkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGlzdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmgKQEAgLTIzMCw3ICsyMzAsNyBAQAogc3RydWN0IHBlcmZfaHBwX2ZtdCB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAlpbnQgKCpoZWFkZXIpKHN0cnVjdCBwZXJmX2hwcF9mbXQgKmZtdCwgc3RydWN0IHBlcmZfaHBwICpocHAsCi0JCSAgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMpOworCQkgICAgICBzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBpbnQgbGluZSwgaW50ICpzcGFuKTsKIAlpbnQgKCp3aWR0aCkoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKIAkJICAgICBzdHJ1Y3QgaGlzdHMgKmhpc3RzKTsKIAlpbnQgKCpjb2xvcikoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKQEAgLTI1OSw2ICsyNTksNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZmllbGRzOwogCXN0cnVjdCBsaXN0X2hlYWQgc29ydHM7CiAKKwlpbnQgbnJfaGVhZGVyX2xpbmVzOwogCWludCBuZWVkX2NvbGxhcHNlOwogCWludCBwYXJlbnQ7CiAJaW50IHN5bTsKQEAgLTM2Nyw2ICszNjgsNyBAQAogdm9pZCBwZXJmX2hwcF9fcmVzZXRfd2lkdGgoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgaGlzdHMgKmhpc3RzKTsKIHZvaWQgcGVyZl9ocHBfX3Jlc2V0X3NvcnRfd2lkdGgoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgaGlzdHMgKmhpc3RzKTsKIHZvaWQgcGVyZl9ocHBfX3NldF91c2VyX3dpZHRoKGNvbnN0IGNoYXIgKndpZHRoX2xpc3Rfc3RyKTsKK3ZvaWQgaGlzdHNfX3Jlc2V0X2NvbHVtbl93aWR0aChzdHJ1Y3QgaGlzdHMgKmhpc3RzKTsKIAogdHlwZWRlZiB1NjQgKCpocHBfZmllbGRfZm4pKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSk7CiB0eXBlZGVmIGludCAoKmhwcF9jYWxsYmFja19mbikoc3RydWN0IHBlcmZfaHBwICpocHAsIGJvb2wgZnJvbnQpOwpAQCAtNDgzLDUgKzQ4NSwxMCBAQAogI2RlZmluZSBISUVSQVJDSFlfSU5ERU5UICAzCiAKIGJvb2wgaGlzdF9lbnRyeV9faGFzX2hpZXJhcmNoeV9jaGlsZHJlbihzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsIGZsb2F0IGxpbWl0KTsKK2ludCBocHBfY29sb3Jfc2NucHJpbnRmKHN0cnVjdCBwZXJmX2hwcCAqaHBwLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitpbnQgX19ocHBfX3Nsc21nX2NvbG9yX3ByaW50ZihzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOworaW50IF9faGlzdF9lbnRyeV9fc25wcmludGYoc3RydWN0IGhpc3RfZW50cnkgKmhlLCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKKwkJCSAgIHN0cnVjdCBwZXJmX2hwcF9saXN0ICpocHBfbGlzdCk7CitpbnQgaGlzdHNfX2ZwcmludGZfaGVhZGVycyhzdHJ1Y3QgaGlzdHMgKmhpc3RzLCBGSUxFICpmcCk7CiAKICNlbmRpZgkvKiBfX1BFUkZfSElTVF9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9kd2FyZi1yZWdzLmggYi90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9kd2FyZi1yZWdzLmgKaW5kZXggMDdjNjQ0ZS4uNDNiZmQ4ZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2luY2x1ZGUvZHdhcmYtcmVncy5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2R3YXJmLXJlZ3MuaApAQCAtMyw2ICszLDEyIEBACiAKICNpZmRlZiBIQVZFX0RXQVJGX1NVUFBPUlQKIGNvbnN0IGNoYXIgKmdldF9hcmNoX3JlZ3N0cih1bnNpZ25lZCBpbnQgbik7CisvKgorICogZ2V0X2R3YXJmX3JlZ3N0ciAtIFJldHVybnMgZnRyYWNlIHJlZ2lzdGVyIHN0cmluZyBmcm9tIERXQVJGIHJlZ251bQorICogbjogRFdBUkYgcmVnaXN0ZXIgbnVtYmVyCisgKiBtYWNoaW5lOiBFTEYgbWFjaGluZSBzaWduYXR1cmUgKEVNXyopCisgKi8KK2NvbnN0IGNoYXIgKmdldF9kd2FyZl9yZWdzdHIodW5zaWduZWQgaW50IG4sIHVuc2lnbmVkIGludCBtYWNoaW5lKTsKICNlbmRpZgogCiAjaWZkZWYgSEFWRV9BUkNIX1JFR1NfUVVFUllfUkVHSVNURVJfT0ZGU0VUCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW50ZWwtYnRzLmMgYi90b29scy9wZXJmL3V0aWwvaW50ZWwtYnRzLmMKaW5kZXggNzQ5ZTZmMi4uZjU0NWVjMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2ludGVsLWJ0cy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1idHMuYwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJCWdvdG8gb3V0X3B1dDsKIAogCS8qIExvYWQgbWFwcyB0byBlbnN1cmUgZHNvLT5pc182NF9iaXQgaGFzIGJlZW4gdXBkYXRlZCAqLwotCW1hcF9fbG9hZChhbC5tYXAsIG1hY2hpbmUtPnN5bWJvbF9maWx0ZXIpOworCW1hcF9fbG9hZChhbC5tYXApOwogCiAJeDg2XzY0ID0gYWwubWFwLT5kc28tPmlzXzY0X2JpdDsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtZGVjb2Rlci5jIGIvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtZGVjb2Rlci5jCmluZGV4IDhmZjZjNmEuLjc1OTFhMGMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC1kZWNvZGVyL2ludGVsLXB0LWRlY29kZXIuYworKysgYi90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQtZGVjb2Rlci9pbnRlbC1wdC1kZWNvZGVyLmMKQEAgLTgwLDYgKzgwLDcgQEAKIAlpbnQgKCp3YWxrX2luc24pKHN0cnVjdCBpbnRlbF9wdF9pbnNuICppbnRlbF9wdF9pbnNuLAogCQkJIHVpbnQ2NF90ICppbnNuX2NudF9wdHIsIHVpbnQ2NF90ICppcCwgdWludDY0X3QgdG9faXAsCiAJCQkgdWludDY0X3QgbWF4X2luc25fY250LCB2b2lkICpkYXRhKTsKKwlib29sICgqcGdkX2lwKSh1aW50NjRfdCBpcCwgdm9pZCAqZGF0YSk7CiAJdm9pZCAqZGF0YTsKIAlzdHJ1Y3QgaW50ZWxfcHRfc3RhdGUgc3RhdGU7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmOwpAQCAtMTg2LDYgKzE4Nyw3IEBACiAKIAlkZWNvZGVyLT5nZXRfdHJhY2UgICAgICAgICAgPSBwYXJhbXMtPmdldF90cmFjZTsKIAlkZWNvZGVyLT53YWxrX2luc24gICAgICAgICAgPSBwYXJhbXMtPndhbGtfaW5zbjsKKwlkZWNvZGVyLT5wZ2RfaXAgICAgICAgICAgICAgPSBwYXJhbXMtPnBnZF9pcDsKIAlkZWNvZGVyLT5kYXRhICAgICAgICAgICAgICAgPSBwYXJhbXMtPmRhdGE7CiAJZGVjb2Rlci0+cmV0dXJuX2NvbXByZXNzaW9uID0gcGFyYW1zLT5yZXR1cm5fY29tcHJlc3Npb247CiAKQEAgLTEwMDgsNiArMTAxMCwxOSBAQAogCWludCBlcnI7CiAKIAllcnIgPSBpbnRlbF9wdF93YWxrX2luc24oZGVjb2RlciwgJmludGVsX3B0X2luc24sIDApOworCWlmIChlcnIgPT0gSU5URUxfUFRfUkVUVVJOICYmCisJICAgIGRlY29kZXItPnBnZF9pcCAmJgorCSAgICBkZWNvZGVyLT5wa3Rfc3RhdGUgPT0gSU5URUxfUFRfU1RBVEVfVElQX1BHRCAmJgorCSAgICAoZGVjb2Rlci0+c3RhdGUudHlwZSAmIElOVEVMX1BUX0JSQU5DSCkgJiYKKwkgICAgZGVjb2Rlci0+cGdkX2lwKGRlY29kZXItPnN0YXRlLnRvX2lwLCBkZWNvZGVyLT5kYXRhKSkgeworCQkvKiBVbmNvbmRpdGlvbmFsIGJyYW5jaCBsZWF2aW5nIGZpbHRlciByZWdpb24gKi8KKwkJZGVjb2Rlci0+bm9fcHJvZ3Jlc3MgPSAwOworCQlkZWNvZGVyLT5wZ2UgPSBmYWxzZTsKKwkJZGVjb2Rlci0+Y29udGludW91c19wZXJpb2QgPSBmYWxzZTsKKwkJZGVjb2Rlci0+cGt0X3N0YXRlID0gSU5URUxfUFRfU1RBVEVfSU5fU1lOQzsKKwkJZGVjb2Rlci0+c3RhdGUudG9faXAgPSAwOworCQlyZXR1cm4gMDsKKwl9CiAJaWYgKGVyciA9PSBJTlRFTF9QVF9SRVRVUk4pCiAJCXJldHVybiAwOwogCWlmIChlcnIpCkBAIC0xMDM2LDYgKzEwNTEsMjEgQEAKIAl9CiAKIAlpZiAoaW50ZWxfcHRfaW5zbi5icmFuY2ggPT0gSU5URUxfUFRfQlJfQ09ORElUSU9OQUwpIHsKKwkJdWludDY0X3QgdG9faXAgPSBkZWNvZGVyLT5pcCArIGludGVsX3B0X2luc24ubGVuZ3RoICsKKwkJCQkgaW50ZWxfcHRfaW5zbi5yZWw7CisKKwkJaWYgKGRlY29kZXItPnBnZF9pcCAmJgorCQkgICAgZGVjb2Rlci0+cGt0X3N0YXRlID09IElOVEVMX1BUX1NUQVRFX1RJUF9QR0QgJiYKKwkJICAgIGRlY29kZXItPnBnZF9pcCh0b19pcCwgZGVjb2Rlci0+ZGF0YSkpIHsKKwkJCS8qIENvbmRpdGlvbmFsIGJyYW5jaCBsZWF2aW5nIGZpbHRlciByZWdpb24gKi8KKwkJCWRlY29kZXItPnBnZSA9IGZhbHNlOworCQkJZGVjb2Rlci0+Y29udGludW91c19wZXJpb2QgPSBmYWxzZTsKKwkJCWRlY29kZXItPnBrdF9zdGF0ZSA9IElOVEVMX1BUX1NUQVRFX0lOX1NZTkM7CisJCQlkZWNvZGVyLT5pcCA9IHRvX2lwOworCQkJZGVjb2Rlci0+c3RhdGUuZnJvbV9pcCA9IGRlY29kZXItPmlwOworCQkJZGVjb2Rlci0+c3RhdGUudG9faXAgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KIAkJaW50ZWxfcHRfbG9nX2F0KCJFUlJPUjogQ29uZGl0aW9uYWwgYnJhbmNoIHdoZW4gZXhwZWN0aW5nIGluZGlyZWN0IGJyYW5jaCIsCiAJCQkJZGVjb2Rlci0+aXApOwogCQlkZWNvZGVyLT5wa3Rfc3RhdGUgPSBJTlRFTF9QVF9TVEFURV9FUlJfUkVTWU5DOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtZGVjb2Rlci5oIGIvdG9vbHMvcGVyZi91dGlsL2ludGVsLXB0LWRlY29kZXIvaW50ZWwtcHQtZGVjb2Rlci5oCmluZGV4IDAyYzM4ZmUuLjg5Mzk5OTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC1kZWNvZGVyL2ludGVsLXB0LWRlY29kZXIuaAorKysgYi90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQtZGVjb2Rlci9pbnRlbC1wdC1kZWNvZGVyLmgKQEAgLTgzLDYgKzgzLDcgQEAKIAlpbnQgKCp3YWxrX2luc24pKHN0cnVjdCBpbnRlbF9wdF9pbnNuICppbnRlbF9wdF9pbnNuLAogCQkJIHVpbnQ2NF90ICppbnNuX2NudF9wdHIsIHVpbnQ2NF90ICppcCwgdWludDY0X3QgdG9faXAsCiAJCQkgdWludDY0X3QgbWF4X2luc25fY250LCB2b2lkICpkYXRhKTsKKwlib29sICgqcGdkX2lwKSh1aW50NjRfdCBpcCwgdm9pZCAqZGF0YSk7CiAJdm9pZCAqZGF0YTsKIAlib29sIHJldHVybl9jb21wcmVzc2lvbjsKIAl1aW50NjRfdCBwZXJpb2Q7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5jCmluZGV4IDU1MWZmNmYuLmRjMDQxZDQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5jCkBAIC0xMDMsNiArMTAzLDkgQEAKIAl1bnNpZ25lZCBtYXhfbm9uX3R1cmJvX3JhdGlvOwogCiAJdW5zaWduZWQgbG9uZyBudW1fZXZlbnRzOworCisJY2hhciAqZmlsdGVyOworCXN0cnVjdCBhZGRyX2ZpbHRlcnMgZmlsdHM7CiB9OwogCiBlbnVtIHN3aXRjaF9zdGF0ZSB7CkBAIC0yNDEsNyArMjQ0LDcgQEAKIAl9CiAKIAlxdWV1ZSA9ICZwdHEtPnB0LT5xdWV1ZXMucXVldWVfYXJyYXlbcHRxLT5xdWV1ZV9ucl07Ci0KK25leHQ6CiAJYnVmZmVyID0gYXV4dHJhY2VfYnVmZmVyX19uZXh0KHF1ZXVlLCBidWZmZXIpOwogCWlmICghYnVmZmVyKSB7CiAJCWlmIChvbGRfYnVmZmVyKQpAQCAtMjY0LDkgKzI2Nyw2IEBACiAJICAgIGludGVsX3B0X2RvX2ZpeF9vdmVybGFwKHB0cS0+cHQsIG9sZF9idWZmZXIsIGJ1ZmZlcikpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKG9sZF9idWZmZXIpCi0JCWF1eHRyYWNlX2J1ZmZlcl9fZHJvcF9kYXRhKG9sZF9idWZmZXIpOwotCiAJaWYgKGJ1ZmZlci0+dXNlX2RhdGEpIHsKIAkJYi0+bGVuID0gYnVmZmVyLT51c2Vfc2l6ZTsKIAkJYi0+YnVmID0gYnVmZmVyLT51c2VfZGF0YTsKQEAgLTI3Niw2ICsyNzYsMTYgQEAKIAl9CiAJYi0+cmVmX3RpbWVzdGFtcCA9IGJ1ZmZlci0+cmVmZXJlbmNlOwogCisJLyoKKwkgKiBJZiBpbiBzbmFwc2hvdCBtb2RlIGFuZCB0aGUgYnVmZmVyIGhhcyBubyB1c2FibGUgZGF0YSwgZ2V0IG5leHQKKwkgKiBidWZmZXIgYW5kIGFnYWluIGNoZWNrIG92ZXJsYXAgYWdhaW5zdCBvbGRfYnVmZmVyLgorCSAqLworCWlmIChwdHEtPnB0LT5zbmFwc2hvdF9tb2RlICYmICFiLT5sZW4pCisJCWdvdG8gbmV4dDsKKworCWlmIChvbGRfYnVmZmVyKQorCQlhdXh0cmFjZV9idWZmZXJfX2Ryb3BfZGF0YShvbGRfYnVmZmVyKTsKKwogCWlmICghb2xkX2J1ZmZlciB8fCBwdHEtPnB0LT5zYW1wbGluZ19tb2RlIHx8IChwdHEtPnB0LT5zbmFwc2hvdF9tb2RlICYmCiAJCQkJCQkgICAgICAhYnVmZmVyLT5jb25zZWN1dGl2ZSkpIHsKIAkJYi0+Y29uc2VjdXRpdmUgPSBmYWxzZTsKQEAgLTQ3Nyw3ICs0ODcsNyBAQAogCQlzdGFydF9pcCA9ICppcDsKIAogCQkvKiBMb2FkIG1hcHMgdG8gZW5zdXJlIGRzby0+aXNfNjRfYml0IGhhcyBiZWVuIHVwZGF0ZWQgKi8KLQkJbWFwX19sb2FkKGFsLm1hcCwgbWFjaGluZS0+c3ltYm9sX2ZpbHRlcik7CisJCW1hcF9fbG9hZChhbC5tYXApOwogCiAJCXg4Nl82NCA9IGFsLm1hcC0+ZHNvLT5pc182NF9iaXQ7CiAKQEAgLTU0MSw2ICs1NTEsNzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGJvb2wgaW50ZWxfcHRfbWF0Y2hfcGdkX2lwKHN0cnVjdCBpbnRlbF9wdCAqcHQsIHVpbnQ2NF90IGlwLAorCQkJCSAgdWludDY0X3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgYWRkcl9maWx0ZXIgKmZpbHQ7CisJYm9vbCBoYXZlX2ZpbHRlciAgID0gZmFsc2U7CisJYm9vbCBoaXRfdHJhY2VzdG9wID0gZmFsc2U7CisJYm9vbCBoaXRfZmlsdGVyICAgID0gZmFsc2U7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpbHQsICZwdC0+ZmlsdHMuaGVhZCwgbGlzdCkgeworCQlpZiAoZmlsdC0+c3RhcnQpCisJCQloYXZlX2ZpbHRlciA9IHRydWU7CisKKwkJaWYgKChmaWxlbmFtZSAmJiAhZmlsdC0+ZmlsZW5hbWUpIHx8CisJCSAgICAoIWZpbGVuYW1lICYmIGZpbHQtPmZpbGVuYW1lKSB8fAorCQkgICAgKGZpbGVuYW1lICYmIHN0cmNtcChmaWxlbmFtZSwgZmlsdC0+ZmlsZW5hbWUpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghKG9mZnNldCA+PSBmaWx0LT5hZGRyICYmIG9mZnNldCA8IGZpbHQtPmFkZHIgKyBmaWx0LT5zaXplKSkKKwkJCWNvbnRpbnVlOworCisJCWludGVsX3B0X2xvZygiVElQLlBHRCBpcCAlIyJQUkl4NjQiIG9mZnNldCAlIyJQUkl4NjQiIGluICVzIGhpdCBmaWx0ZXI6ICVzIG9mZnNldCAlIyJQUkl4NjQiIHNpemUgJSMiUFJJeDY0IlxuIiwKKwkJCSAgICAgaXAsIG9mZnNldCwgZmlsZW5hbWUgPyBmaWxlbmFtZSA6ICJba2VybmVsXSIsCisJCQkgICAgIGZpbHQtPnN0YXJ0ID8gImZpbHRlciIgOiAic3RvcCIsCisJCQkgICAgIGZpbHQtPmFkZHIsIGZpbHQtPnNpemUpOworCisJCWlmIChmaWx0LT5zdGFydCkKKwkJCWhpdF9maWx0ZXIgPSB0cnVlOworCQllbHNlCisJCQloaXRfdHJhY2VzdG9wID0gdHJ1ZTsKKwl9CisKKwlpZiAoIWhpdF90cmFjZXN0b3AgJiYgIWhpdF9maWx0ZXIpCisJCWludGVsX3B0X2xvZygiVElQLlBHRCBpcCAlIyJQUkl4NjQiIG9mZnNldCAlIyJQUkl4NjQiIGluICVzIGlzIG5vdCBpbiBhIGZpbHRlciByZWdpb25cbiIsCisJCQkgICAgIGlwLCBvZmZzZXQsIGZpbGVuYW1lID8gZmlsZW5hbWUgOiAiW2tlcm5lbF0iKTsKKworCXJldHVybiBoaXRfdHJhY2VzdG9wIHx8IChoYXZlX2ZpbHRlciAmJiAhaGl0X2ZpbHRlcik7Cit9CisKK3N0YXRpYyBpbnQgX19pbnRlbF9wdF9wZ2RfaXAodWludDY0X3QgaXAsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGludGVsX3B0X3F1ZXVlICpwdHEgPSBkYXRhOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZDsKKwlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKKwl1OCBjcHVtb2RlOworCXU2NCBvZmZzZXQ7CisKKwlpZiAoaXAgPj0gcHRxLT5wdC0+a2VybmVsX3N0YXJ0KQorCQlyZXR1cm4gaW50ZWxfcHRfbWF0Y2hfcGdkX2lwKHB0cS0+cHQsIGlwLCBpcCwgTlVMTCk7CisKKwljcHVtb2RlID0gUEVSRl9SRUNPUkRfTUlTQ19VU0VSOworCisJdGhyZWFkID0gcHRxLT50aHJlYWQ7CisJaWYgKCF0aHJlYWQpCisJCXJldHVybiAtRUlOVkFMOworCisJdGhyZWFkX19maW5kX2FkZHJfbWFwKHRocmVhZCwgY3B1bW9kZSwgTUFQX19GVU5DVElPTiwgaXAsICZhbCk7CisJaWYgKCFhbC5tYXAgfHwgIWFsLm1hcC0+ZHNvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9mZnNldCA9IGFsLm1hcC0+bWFwX2lwKGFsLm1hcCwgaXApOworCisJcmV0dXJuIGludGVsX3B0X21hdGNoX3BnZF9pcChwdHEtPnB0LCBpcCwgb2Zmc2V0LAorCQkJCSAgICAgYWwubWFwLT5kc28tPmxvbmdfbmFtZSk7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3B0X3BnZF9pcCh1aW50NjRfdCBpcCwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gX19pbnRlbF9wdF9wZ2RfaXAoaXAsIGRhdGEpID4gMDsKK30KKwogc3RhdGljIGJvb2wgaW50ZWxfcHRfZ2V0X2NvbmZpZyhzdHJ1Y3QgaW50ZWxfcHQgKnB0LAogCQkJCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsIHU2NCAqY29uZmlnKQogewpAQCAtNzE3LDYgKzc5Nyw5IEBACiAJcGFyYW1zLnRzY19jdGNfcmF0aW9fbiA9IHB0LT50c2NfY3RjX3JhdGlvX247CiAJcGFyYW1zLnRzY19jdGNfcmF0aW9fZCA9IHB0LT50c2NfY3RjX3JhdGlvX2Q7CiAKKwlpZiAocHQtPmZpbHRzLmNudCA+IDApCisJCXBhcmFtcy5wZ2RfaXAgPSBpbnRlbF9wdF9wZ2RfaXA7CisKIAlpZiAocHQtPnN5bnRoX29wdHMuaW5zdHJ1Y3Rpb25zKSB7CiAJCWlmIChwdC0+c3ludGhfb3B0cy5wZXJpb2QpIHsKIAkJCXN3aXRjaCAocHQtPnN5bnRoX29wdHMucGVyaW9kX3R5cGUpIHsKQEAgLTEyOTQsNyArMTM3Nyw3IEBACiAJaWYgKCFtYXApCiAJCXJldHVybiAwOwogCi0JaWYgKG1hcF9fbG9hZChtYXAsIG1hY2hpbmUtPnN5bWJvbF9maWx0ZXIpKQorCWlmIChtYXBfX2xvYWQobWFwKSkKIAkJcmV0dXJuIDA7CiAKIAlzdGFydCA9IGRzb19fZmlyc3Rfc3ltYm9sKG1hcC0+ZHNvLCBNQVBfX0ZVTkNUSU9OKTsKQEAgLTE3NjcsNiArMTg1MCw4IEBACiAJaW50ZWxfcHRfZnJlZV9ldmVudHMoc2Vzc2lvbik7CiAJc2Vzc2lvbi0+YXV4dHJhY2UgPSBOVUxMOwogCXRocmVhZF9fcHV0KHB0LT51bmtub3duX3RocmVhZCk7CisJYWRkcl9maWx0ZXJzX19leGl0KCZwdC0+ZmlsdHMpOworCXpmcmVlKCZwdC0+ZmlsdGVyKTsKIAlmcmVlKHB0KTsKIH0KIApAQCAtMjAxNiw2ICsyMTAxLDggQEAKIAlbSU5URUxfUFRfVFNDX0NUQ19OXQkJPSAiICBUU0M6Q1RDIG51bWVyYXRvciAgICUiUFJJdTY0IlxuIiwKIAlbSU5URUxfUFRfVFNDX0NUQ19EXQkJPSAiICBUU0M6Q1RDIGRlbm9taW5hdG9yICUiUFJJdTY0IlxuIiwKIAlbSU5URUxfUFRfQ1lDX0JJVF0JCT0gIiAgQ1lDIGJpdCAgICAgICAgICAgICAlIyJQUkl4NjQiXG4iLAorCVtJTlRFTF9QVF9NQVhfTk9OVFVSQk9fUkFUSU9dCT0gIiAgTWF4IG5vbi10dXJibyByYXRpbyAlIlBSSXU2NCJcbiIsCisJW0lOVEVMX1BUX0ZJTFRFUl9TVFJfTEVOXQk9ICIgIEZpbHRlciBzdHJpbmcgbGVuLiAgJSJQUkl1NjQiXG4iLAogfTsKIAogc3RhdGljIHZvaWQgaW50ZWxfcHRfcHJpbnRfaW5mbyh1NjQgKmFyciwgaW50IHN0YXJ0LCBpbnQgZmluaXNoKQpAQCAtMjAyOSwxMiArMjExNiwyOCBAQAogCQlmcHJpbnRmKHN0ZG91dCwgaW50ZWxfcHRfaW5mb19mbXRzW2ldLCBhcnJbaV0pOwogfQogCitzdGF0aWMgdm9pZCBpbnRlbF9wdF9wcmludF9pbmZvX3N0cihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKCFkdW1wX3RyYWNlKQorCQlyZXR1cm47CisKKwlmcHJpbnRmKHN0ZG91dCwgIiAgJS0yMHMlc1xuIiwgbmFtZSwgc3RyID8gc3RyIDogIiIpOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9wdF9oYXMoc3RydWN0IGF1eHRyYWNlX2luZm9fZXZlbnQgKmF1eHRyYWNlX2luZm8sIGludCBwb3MpCit7CisJcmV0dXJuIGF1eHRyYWNlX2luZm8tPmhlYWRlci5zaXplID49CisJCXNpemVvZihzdHJ1Y3QgYXV4dHJhY2VfaW5mb19ldmVudCkgKyAoc2l6ZW9mKHU2NCkgKiAocG9zICsgMSkpOworfQorCiBpbnQgaW50ZWxfcHRfcHJvY2Vzc19hdXh0cmFjZV9pbmZvKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCiB7CiAJc3RydWN0IGF1eHRyYWNlX2luZm9fZXZlbnQgKmF1eHRyYWNlX2luZm8gPSAmZXZlbnQtPmF1eHRyYWNlX2luZm87CiAJc2l6ZV90IG1pbl9zeiA9IHNpemVvZih1NjQpICogSU5URUxfUFRfUEVSX0NQVV9NTUFQUzsKIAlzdHJ1Y3QgaW50ZWxfcHQgKnB0OworCXZvaWQgKmluZm9fZW5kOworCXU2NCAqaW5mbzsKIAlpbnQgZXJyOwogCiAJaWYgKGF1eHRyYWNlX2luZm8tPmhlYWRlci5zaXplIDwgc2l6ZW9mKHN0cnVjdCBhdXh0cmFjZV9pbmZvX2V2ZW50KSArCkBAIC0yMDQ1LDYgKzIxNDgsOCBAQAogCWlmICghcHQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJYWRkcl9maWx0ZXJzX19pbml0KCZwdC0+ZmlsdHMpOworCiAJcGVyZl9jb25maWcoaW50ZWxfcHRfcGVyZl9jb25maWcsIHB0KTsKIAogCWVyciA9IGF1eHRyYWNlX3F1ZXVlc19faW5pdCgmcHQtPnF1ZXVlcyk7CkBAIC0yMDY5LDggKzIxNzQsNyBAQAogCWludGVsX3B0X3ByaW50X2luZm8oJmF1eHRyYWNlX2luZm8tPnByaXZbMF0sIElOVEVMX1BUX1BNVV9UWVBFLAogCQkJICAgIElOVEVMX1BUX1BFUl9DUFVfTU1BUFMpOwogCi0JaWYgKGF1eHRyYWNlX2luZm8tPmhlYWRlci5zaXplID49IHNpemVvZihzdHJ1Y3QgYXV4dHJhY2VfaW5mb19ldmVudCkgKwotCQkJCQkoc2l6ZW9mKHU2NCkgKiBJTlRFTF9QVF9DWUNfQklUKSkgeworCWlmIChpbnRlbF9wdF9oYXMoYXV4dHJhY2VfaW5mbywgSU5URUxfUFRfQ1lDX0JJVCkpIHsKIAkJcHQtPm10Y19iaXQgPSBhdXh0cmFjZV9pbmZvLT5wcml2W0lOVEVMX1BUX01UQ19CSVRdOwogCQlwdC0+bXRjX2ZyZXFfYml0cyA9IGF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfTVRDX0ZSRVFfQklUU107CiAJCXB0LT50c2NfY3RjX3JhdGlvX24gPSBhdXh0cmFjZV9pbmZvLT5wcml2W0lOVEVMX1BUX1RTQ19DVENfTl07CkBAIC0yMDgwLDYgKzIxODQsNTQgQEAKIAkJCQkgICAgSU5URUxfUFRfQ1lDX0JJVCk7CiAJfQogCisJaWYgKGludGVsX3B0X2hhcyhhdXh0cmFjZV9pbmZvLCBJTlRFTF9QVF9NQVhfTk9OVFVSQk9fUkFUSU8pKSB7CisJCXB0LT5tYXhfbm9uX3R1cmJvX3JhdGlvID0KKwkJCWF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfTUFYX05PTlRVUkJPX1JBVElPXTsKKwkJaW50ZWxfcHRfcHJpbnRfaW5mbygmYXV4dHJhY2VfaW5mby0+cHJpdlswXSwKKwkJCQkgICAgSU5URUxfUFRfTUFYX05PTlRVUkJPX1JBVElPLAorCQkJCSAgICBJTlRFTF9QVF9NQVhfTk9OVFVSQk9fUkFUSU8pOworCX0KKworCWluZm8gPSAmYXV4dHJhY2VfaW5mby0+cHJpdltJTlRFTF9QVF9GSUxURVJfU1RSX0xFTl0gKyAxOworCWluZm9fZW5kID0gKHZvaWQgKilpbmZvICsgYXV4dHJhY2VfaW5mby0+aGVhZGVyLnNpemU7CisKKwlpZiAoaW50ZWxfcHRfaGFzKGF1eHRyYWNlX2luZm8sIElOVEVMX1BUX0ZJTFRFUl9TVFJfTEVOKSkgeworCQlzaXplX3QgbGVuOworCisJCWxlbiA9IGF1eHRyYWNlX2luZm8tPnByaXZbSU5URUxfUFRfRklMVEVSX1NUUl9MRU5dOworCQlpbnRlbF9wdF9wcmludF9pbmZvKCZhdXh0cmFjZV9pbmZvLT5wcml2WzBdLAorCQkJCSAgICBJTlRFTF9QVF9GSUxURVJfU1RSX0xFTiwKKwkJCQkgICAgSU5URUxfUFRfRklMVEVSX1NUUl9MRU4pOworCQlpZiAobGVuKSB7CisJCQljb25zdCBjaGFyICpmaWx0ZXIgPSAoY29uc3QgY2hhciAqKWluZm87CisKKwkJCWxlbiA9IHJvdW5kdXAobGVuICsgMSwgOCk7CisJCQlpbmZvICs9IGxlbiA+PiAzOworCQkJaWYgKCh2b2lkICopaW5mbyA+IGluZm9fZW5kKSB7CisJCQkJcHJfZXJyKCIlczogYmFkIGZpbHRlciBzdHJpbmcgbGVuZ3RoXG4iLCBfX2Z1bmNfXyk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycl9mcmVlX3F1ZXVlczsKKwkJCX0KKwkJCXB0LT5maWx0ZXIgPSBtZW1kdXAoZmlsdGVyLCBsZW4pOworCQkJaWYgKCFwdC0+ZmlsdGVyKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycl9mcmVlX3F1ZXVlczsKKwkJCX0KKwkJCWlmIChzZXNzaW9uLT5oZWFkZXIubmVlZHNfc3dhcCkKKwkJCQltZW1fYnN3YXBfNjQocHQtPmZpbHRlciwgbGVuKTsKKwkJCWlmIChwdC0+ZmlsdGVyW2xlbiAtIDFdKSB7CisJCQkJcHJfZXJyKCIlczogZmlsdGVyIHN0cmluZyBub3QgbnVsbCB0ZXJtaW5hdGVkXG4iLCBfX2Z1bmNfXyk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycl9mcmVlX3F1ZXVlczsKKwkJCX0KKwkJCWVyciA9IGFkZHJfZmlsdGVyc19fcGFyc2VfYmFyZV9maWx0ZXIoJnB0LT5maWx0cywKKwkJCQkJCQkgICAgICBmaWx0ZXIpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGVycl9mcmVlX3F1ZXVlczsKKwkJfQorCQlpbnRlbF9wdF9wcmludF9pbmZvX3N0cigiRmlsdGVyIHN0cmluZyIsIHB0LT5maWx0ZXIpOworCX0KKwogCXB0LT50aW1lbGVzc19kZWNvZGluZyA9IGludGVsX3B0X3RpbWVsZXNzX2RlY29kaW5nKHB0KTsKIAlwdC0+aGF2ZV90c2MgPSBpbnRlbF9wdF9oYXZlX3RzYyhwdCk7CiAJcHQtPnNhbXBsaW5nX21vZGUgPSBmYWxzZTsKQEAgLTIxMjEsMTEgKzIyNzMsMTMgQEAKIAkJcHQtPnN3aXRjaF9ldnNlbCA9IGludGVsX3B0X2ZpbmRfc2NoZWRfc3dpdGNoKHNlc3Npb24tPmV2bGlzdCk7CiAJCWlmICghcHQtPnN3aXRjaF9ldnNlbCkgewogCQkJcHJfZXJyKCIlczogbWlzc2luZyBzY2hlZF9zd2l0Y2ggZXZlbnRcbiIsIF9fZnVuY19fKTsKKwkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl9kZWxldGVfdGhyZWFkOwogCQl9CiAJfSBlbHNlIGlmIChwdC0+aGF2ZV9zY2hlZF9zd2l0Y2ggPT0gMiAmJgogCQkgICAhaW50ZWxfcHRfZmluZF9zd2l0Y2goc2Vzc2lvbi0+ZXZsaXN0KSkgewogCQlwcl9lcnIoIiVzOiBtaXNzaW5nIGNvbnRleHRfc3dpdGNoIGF0dHJpYnV0ZSBmbGFnXG4iLCBfX2Z1bmNfXyk7CisJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2RlbGV0ZV90aHJlYWQ7CiAJfQogCkBAIC0yMTQ5LDcgKzIzMDMsOSBAQAogCWlmIChwdC0+dGMudGltZV9tdWx0KSB7CiAJCXU2NCB0c2NfZnJlcSA9IGludGVsX3B0X25zX3RvX3RpY2tzKHB0LCAxMDAwMDAwMDAwKTsKIAotCQlwdC0+bWF4X25vbl90dXJib19yYXRpbyA9ICh0c2NfZnJlcSArIDUwMDAwMDAwKSAvIDEwMDAwMDAwMDsKKwkJaWYgKCFwdC0+bWF4X25vbl90dXJib19yYXRpbykKKwkJCXB0LT5tYXhfbm9uX3R1cmJvX3JhdGlvID0KKwkJCQkJKHRzY19mcmVxICsgNTAwMDAwMDApIC8gMTAwMDAwMDAwOwogCQlpbnRlbF9wdF9sb2coIlRTQyBmcmVxdWVuY3kgJSJQUkl1NjQiXG4iLCB0c2NfZnJlcSk7CiAJCWludGVsX3B0X2xvZygiTWF4aW11bSBub24tdHVyYm8gcmF0aW8gJXVcbiIsCiAJCQkgICAgIHB0LT5tYXhfbm9uX3R1cmJvX3JhdGlvKTsKQEAgLTIxOTMsNiArMjM0OSw4IEBACiAJYXV4dHJhY2VfcXVldWVzX19mcmVlKCZwdC0+cXVldWVzKTsKIAlzZXNzaW9uLT5hdXh0cmFjZSA9IE5VTEw7CiBlcnJfZnJlZToKKwlhZGRyX2ZpbHRlcnNfX2V4aXQoJnB0LT5maWx0cyk7CisJemZyZWUoJnB0LT5maWx0ZXIpOwogCWZyZWUocHQpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW50ZWwtcHQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5oCmluZGV4IDAwNjU5NDkuLmUxM2IxNGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbnRlbC1wdC5oCkBAIC0zNCwxMSArMzQsMTEgQEAKIAlJTlRFTF9QVF9UU0NfQ1RDX04sCiAJSU5URUxfUFRfVFNDX0NUQ19ELAogCUlOVEVMX1BUX0NZQ19CSVQsCisJSU5URUxfUFRfTUFYX05PTlRVUkJPX1JBVElPLAorCUlOVEVMX1BUX0ZJTFRFUl9TVFJfTEVOLAogCUlOVEVMX1BUX0FVWFRSQUNFX1BSSVZfTUFYLAogfTsKIAotI2RlZmluZSBJTlRFTF9QVF9BVVhUUkFDRV9QUklWX1NJWkUgKElOVEVMX1BUX0FVWFRSQUNFX1BSSVZfTUFYICogc2l6ZW9mKHU2NCkpCi0KIHN0cnVjdCBhdXh0cmFjZV9yZWNvcmQ7CiBzdHJ1Y3QgcGVyZl90b29sOwogdW5pb24gcGVyZl9ldmVudDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9sem1hLmMgYi90b29scy9wZXJmL3V0aWwvbHptYS5jCmluZGV4IDk1YTFhY2IuLjlkZGVhNWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9sem1hLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2x6bWEuYwpAQCAtMjksNiArMjksNyBAQAogCWx6bWFfYWN0aW9uIGFjdGlvbiA9IExaTUFfUlVOOwogCWx6bWFfc3RyZWFtIHN0cm0gICA9IExaTUFfU1RSRUFNX0lOSVQ7CiAJbHptYV9yZXQgcmV0OworCWludCBlcnIgPSAtMTsKIAogCXU4IGJ1Zl9pbltCVUZTSVpFXTsKIAl1OCBidWZfb3V0W0JVRlNJWkVdOwpAQCAtNDUsNyArNDYsNyBAQAogCWlmIChyZXQgIT0gTFpNQV9PSykgewogCQlwcl9lcnIoImx6bWE6IGx6bWFfc3RyZWFtX2RlY29kZXIgZmFpbGVkICVzICglZClcbiIsCiAJCQlsem1hX3N0cmVycm9yKHJldCksIHJldCk7Ci0JCXJldHVybiAtMTsKKwkJZ290byBlcnJfZmNsb3NlOwogCX0KIAogCXN0cm0ubmV4dF9pbiAgID0gTlVMTDsKQEAgLTYwLDcgKzYxLDcgQEAKIAogCQkJaWYgKGZlcnJvcihpbmZpbGUpKSB7CiAJCQkJcHJfZXJyKCJsem1hOiByZWFkIGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLQkJCQlyZXR1cm4gLTE7CisJCQkJZ290byBlcnJfZmNsb3NlOwogCQkJfQogCiAJCQlpZiAoZmVvZihpbmZpbGUpKQpAQCAtNzQsNyArNzUsNyBAQAogCiAJCQlpZiAod3JpdGVuKG91dHB1dF9mZCwgYnVmX291dCwgd3JpdGVfc2l6ZSkgIT0gd3JpdGVfc2l6ZSkgewogCQkJCXByX2VycigibHptYTogd3JpdGUgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotCQkJCXJldHVybiAtMTsKKwkJCQlnb3RvIGVycl9mY2xvc2U7CiAJCQl9CiAKIAkJCXN0cm0ubmV4dF9vdXQgID0gYnVmX291dDsKQEAgLTgzLDEzICs4NCwxNSBAQAogCiAJCWlmIChyZXQgIT0gTFpNQV9PSykgewogCQkJaWYgKHJldCA9PSBMWk1BX1NUUkVBTV9FTkQpCi0JCQkJcmV0dXJuIDA7CisJCQkJYnJlYWs7CiAKIAkJCXByX2VycigibHptYTogZmFpbGVkICVzXG4iLCBsem1hX3N0cmVycm9yKHJldCkpOwotCQkJcmV0dXJuIC0xOworCQkJZ290byBlcnJfZmNsb3NlOwogCQl9CiAJfQogCisJZXJyID0gMDsKK2Vycl9mY2xvc2U6CiAJZmNsb3NlKGluZmlsZSk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMgYi90b29scy9wZXJmL3V0aWwvbWFjaGluZS5jCmluZGV4IGNiNjM4OGQuLjE4ZTQ1MTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuYwpAQCAtNDEsNyArNDEsNiBAQAogCiAJbWFjaGluZS0+cGlkID0gcGlkOwogCi0JbWFjaGluZS0+c3ltYm9sX2ZpbHRlciA9IE5VTEw7CiAJbWFjaGluZS0+aWRfaGRyX3NpemUgPSAwOwogCW1hY2hpbmUtPmtwdHJfcmVzdHJpY3Rfd2FybmVkID0gZmFsc2U7CiAJbWFjaGluZS0+Y29tbV9leGVjID0gZmFsc2U7CkBAIC0xNDgsNyArMTQ3LDYgQEAKIHsKIAltYWNoaW5lX19pbml0KCZtYWNoaW5lcy0+aG9zdCwgIiIsIEhPU1RfS0VSTkVMX0lEKTsKIAltYWNoaW5lcy0+Z3Vlc3RzID0gUkJfUk9PVDsKLQltYWNoaW5lcy0+c3ltYm9sX2ZpbHRlciA9IE5VTEw7CiB9CiAKIHZvaWQgbWFjaGluZXNfX2V4aXQoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcykKQEAgLTE3Miw4ICsxNzAsNiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQltYWNoaW5lLT5zeW1ib2xfZmlsdGVyID0gbWFjaGluZXMtPnN5bWJvbF9maWx0ZXI7Ci0KIAl3aGlsZSAoKnAgIT0gTlVMTCkgewogCQlwYXJlbnQgPSAqcDsKIAkJcG9zID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgbWFjaGluZSwgcmJfbm9kZSk7CkBAIC0xODksMjEgKzE4NSw2IEBACiAJcmV0dXJuIG1hY2hpbmU7CiB9CiAKLXZvaWQgbWFjaGluZXNfX3NldF9zeW1ib2xfZmlsdGVyKHN0cnVjdCBtYWNoaW5lcyAqbWFjaGluZXMsCi0JCQkJIHN5bWJvbF9maWx0ZXJfdCBzeW1ib2xfZmlsdGVyKQotewotCXN0cnVjdCByYl9ub2RlICpuZDsKLQotCW1hY2hpbmVzLT5zeW1ib2xfZmlsdGVyID0gc3ltYm9sX2ZpbHRlcjsKLQltYWNoaW5lcy0+aG9zdC5zeW1ib2xfZmlsdGVyID0gc3ltYm9sX2ZpbHRlcjsKLQotCWZvciAobmQgPSByYl9maXJzdCgmbWFjaGluZXMtPmd1ZXN0cyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7Ci0JCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lID0gcmJfZW50cnkobmQsIHN0cnVjdCBtYWNoaW5lLCByYl9ub2RlKTsKLQotCQltYWNoaW5lLT5zeW1ib2xfZmlsdGVyID0gc3ltYm9sX2ZpbHRlcjsKLQl9Ci19Ci0KIHZvaWQgbWFjaGluZXNfX3NldF9jb21tX2V4ZWMoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcywgYm9vbCBjb21tX2V4ZWMpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5kOwpAQCAtOTE2LDEwICs4OTcsMTAgQEAKIH0KIAogaW50IF9fbWFjaGluZV9fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkgICAgIGVudW0gbWFwX3R5cGUgdHlwZSwgYm9vbCBub19rY29yZSwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCSAgICAgZW51bSBtYXBfdHlwZSB0eXBlLCBib29sIG5vX2tjb3JlKQogewogCXN0cnVjdCBtYXAgKm1hcCA9IG1hY2hpbmVfX2tlcm5lbF9tYXAobWFjaGluZSk7Ci0JaW50IHJldCA9IF9fZHNvX19sb2FkX2thbGxzeW1zKG1hcC0+ZHNvLCBmaWxlbmFtZSwgbWFwLCBub19rY29yZSwgZmlsdGVyKTsKKwlpbnQgcmV0ID0gX19kc29fX2xvYWRfa2FsbHN5bXMobWFwLT5kc28sIGZpbGVuYW1lLCBtYXAsIG5vX2tjb3JlKTsKIAogCWlmIChyZXQgPiAwKSB7CiAJCWRzb19fc2V0X2xvYWRlZChtYXAtPmRzbywgdHlwZSk7CkBAIC05MzUsMTYgKzkxNiwxNSBAQAogfQogCiBpbnQgbWFjaGluZV9fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkgICBlbnVtIG1hcF90eXBlIHR5cGUsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCisJCQkgICBlbnVtIG1hcF90eXBlIHR5cGUpCiB7Ci0JcmV0dXJuIF9fbWFjaGluZV9fbG9hZF9rYWxsc3ltcyhtYWNoaW5lLCBmaWxlbmFtZSwgdHlwZSwgZmFsc2UsIGZpbHRlcik7CisJcmV0dXJuIF9fbWFjaGluZV9fbG9hZF9rYWxsc3ltcyhtYWNoaW5lLCBmaWxlbmFtZSwgdHlwZSwgZmFsc2UpOwogfQogCi1pbnQgbWFjaGluZV9fbG9hZF92bWxpbnV4X3BhdGgoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGVudW0gbWFwX3R5cGUgdHlwZSwKLQkJCSAgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQoraW50IG1hY2hpbmVfX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBlbnVtIG1hcF90eXBlIHR5cGUpCiB7CiAJc3RydWN0IG1hcCAqbWFwID0gbWFjaGluZV9fa2VybmVsX21hcChtYWNoaW5lKTsKLQlpbnQgcmV0ID0gZHNvX19sb2FkX3ZtbGludXhfcGF0aChtYXAtPmRzbywgbWFwLCBmaWx0ZXIpOworCWludCByZXQgPSBkc29fX2xvYWRfdm1saW51eF9wYXRoKG1hcC0+ZHNvLCBtYXApOwogCiAJaWYgKHJldCA+IDApCiAJCWRzb19fc2V0X2xvYWRlZChtYXAtPmRzbywgdHlwZSk7CkBAIC0xMzEzLDcgKzEyOTMsNyBAQAogCQkJLyoKIAkJCSAqIHByZWxvYWQgZHNvIG9mIGd1ZXN0IGtlcm5lbCBhbmQgbW9kdWxlcwogCQkJICovCi0JCQlkc29fX2xvYWQoa2VybmVsLCBtYWNoaW5lX19rZXJuZWxfbWFwKG1hY2hpbmUpLCBOVUxMKTsKKwkJCWRzb19fbG9hZChrZXJuZWwsIG1hY2hpbmVfX2tlcm5lbF9tYXAobWFjaGluZSkpOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtMjExNSw3ICsyMDk1LDcgQEAKIAkgKi8KIAltYWNoaW5lLT5rZXJuZWxfc3RhcnQgPSAxVUxMIDw8IDYzOwogCWlmIChtYXApIHsKLQkJZXJyID0gbWFwX19sb2FkKG1hcCwgbWFjaGluZS0+c3ltYm9sX2ZpbHRlcik7CisJCWVyciA9IG1hcF9fbG9hZChtYXApOwogCQlpZiAobWFwLT5zdGFydCkKIAkJCW1hY2hpbmUtPmtlcm5lbF9zdGFydCA9IG1hcC0+c3RhcnQ7CiAJfQpAQCAtMjEzMSw3ICsyMTExLDcgQEAKIHsKIAlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSA9IHZtYWNoaW5lOwogCXN0cnVjdCBtYXAgKm1hcDsKLQlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtYXBfZ3JvdXBzX19maW5kX3N5bWJvbCgmbWFjaGluZS0+a21hcHMsIE1BUF9fRlVOQ1RJT04sICphZGRycCwgJm1hcCwgIE5VTEwpOworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1hcF9ncm91cHNfX2ZpbmRfc3ltYm9sKCZtYWNoaW5lLT5rbWFwcywgTUFQX19GVU5DVElPTiwgKmFkZHJwLCAmbWFwKTsKIAogCWlmIChzeW0gPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFjaGluZS5oIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuaAppbmRleCAyMDczOWY3Li4zNTRkZTZlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvbWFjaGluZS5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmgKQEAgLTQxLDcgKzQxLDYgQEAKIAlzdHJ1Y3QgbWFwX2dyb3VwcyBrbWFwczsKIAlzdHJ1Y3QgbWFwCSAgKnZtbGludXhfbWFwc1tNQVBfX05SX1RZUEVTXTsKIAl1NjQJCSAga2VybmVsX3N0YXJ0OwotCXN5bWJvbF9maWx0ZXJfdAkgIHN5bWJvbF9maWx0ZXI7CiAJcGlkX3QJCSAgKmN1cnJlbnRfdGlkOwogCXVuaW9uIHsgLyogVG9vbCBzcGVjaWZpYyBhcmVhICovCiAJCXZvaWQJICAqcHJpdjsKQEAgLTExMCw3ICsxMDksNiBAQAogc3RydWN0IG1hY2hpbmVzIHsKIAlzdHJ1Y3QgbWFjaGluZSBob3N0OwogCXN0cnVjdCByYl9yb290IGd1ZXN0czsKLQlzeW1ib2xfZmlsdGVyX3Qgc3ltYm9sX2ZpbHRlcjsKIH07CiAKIHZvaWQgbWFjaGluZXNfX2luaXQoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcyk7CkBAIC0xMjgsOCArMTI2LDYgQEAKIHZvaWQgbWFjaGluZXNfX3NldF9pZF9oZHJfc2l6ZShzdHJ1Y3QgbWFjaGluZXMgKm1hY2hpbmVzLCB1MTYgaWRfaGRyX3NpemUpOwogY2hhciAqbWFjaGluZV9fbW1hcF9uYW1lKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBjaGFyICpiZiwgc2l6ZV90IHNpemUpOwogCi12b2lkIG1hY2hpbmVzX19zZXRfc3ltYm9sX2ZpbHRlcihzdHJ1Y3QgbWFjaGluZXMgKm1hY2hpbmVzLAotCQkJCSBzeW1ib2xfZmlsdGVyX3Qgc3ltYm9sX2ZpbHRlcik7CiB2b2lkIG1hY2hpbmVzX19zZXRfY29tbV9leGVjKHN0cnVjdCBtYWNoaW5lcyAqbWFjaGluZXMsIGJvb2wgY29tbV9leGVjKTsKIAogc3RydWN0IG1hY2hpbmUgKm1hY2hpbmVfX25ld19ob3N0KHZvaWQpOwpAQCAtMTc4LDQwICsxNzQsMzMgQEAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBzeW1ib2wgKm1hY2hpbmVfX2ZpbmRfa2VybmVsX3N5bWJvbChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCB1NjQgYWRkciwKLQkJCQkJICAgc3RydWN0IG1hcCAqKm1hcHAsCi0JCQkJCSAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCisJCQkJCSAgIHN0cnVjdCBtYXAgKiptYXBwKQogewotCXJldHVybiBtYXBfZ3JvdXBzX19maW5kX3N5bWJvbCgmbWFjaGluZS0+a21hcHMsIHR5cGUsIGFkZHIsCi0JCQkJICAgICAgIG1hcHAsIGZpbHRlcik7CisJcmV0dXJuIG1hcF9ncm91cHNfX2ZpbmRfc3ltYm9sKCZtYWNoaW5lLT5rbWFwcywgdHlwZSwgYWRkciwgbWFwcCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBzeW1ib2wgKm1hY2hpbmVfX2ZpbmRfa2VybmVsX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAogCQkJCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkJICAgc3RydWN0IG1hcCAqKm1hcHAsCi0JCQkJCQkgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJCQkJICAgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0JcmV0dXJuIG1hcF9ncm91cHNfX2ZpbmRfc3ltYm9sX2J5X25hbWUoJm1hY2hpbmUtPmttYXBzLCB0eXBlLCBuYW1lLAotCQkJCQkgICAgICAgbWFwcCwgZmlsdGVyKTsKKwlyZXR1cm4gbWFwX2dyb3Vwc19fZmluZF9zeW1ib2xfYnlfbmFtZSgmbWFjaGluZS0+a21hcHMsIHR5cGUsIG5hbWUsIG1hcHApOwogfQogCiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3Qgc3ltYm9sICptYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbihzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgdTY0IGFkZHIsCi0JCQkJCSAgICAgc3RydWN0IG1hcCAqKm1hcHAsCi0JCQkJCSAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCQkJICAgICBzdHJ1Y3QgbWFwICoqbWFwcCkKIHsKIAlyZXR1cm4gbWFjaGluZV9fZmluZF9rZXJuZWxfc3ltYm9sKG1hY2hpbmUsIE1BUF9fRlVOQ1RJT04sIGFkZHIsCi0JCQkJCSAgIG1hcHAsIGZpbHRlcik7CisJCQkJCSAgIG1hcHApOwogfQogCiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3Qgc3ltYm9sICptYWNoaW5lX19maW5kX2tlcm5lbF9mdW5jdGlvbl9ieV9uYW1lKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAogCQkJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkJICAgICBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkJCSAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCQkJCSAgICAgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0JcmV0dXJuIG1hcF9ncm91cHNfX2ZpbmRfZnVuY3Rpb25fYnlfbmFtZSgmbWFjaGluZS0+a21hcHMsIG5hbWUsIG1hcHAsCi0JCQkJCQkgZmlsdGVyKTsKKwlyZXR1cm4gbWFwX2dyb3Vwc19fZmluZF9mdW5jdGlvbl9ieV9uYW1lKCZtYWNoaW5lLT5rbWFwcywgbmFtZSwgbWFwcCk7CiB9CiAKIHN0cnVjdCBtYXAgKm1hY2hpbmVfX2ZpbmRuZXdfbW9kdWxlX21hcChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgdTY0IHN0YXJ0LApAQCAtMjE5LDExICsyMDgsMTAgQEAKIGludCBhcmNoX19maXhfbW9kdWxlX3RleHRfc3RhcnQodTY0ICpzdGFydCwgY29uc3QgY2hhciAqbmFtZSk7CiAKIGludCBfX21hY2hpbmVfX2xvYWRfa2FsbHN5bXMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJICAgICBlbnVtIG1hcF90eXBlIHR5cGUsIGJvb2wgbm9fa2NvcmUsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworCQkJICAgICBlbnVtIG1hcF90eXBlIHR5cGUsIGJvb2wgbm9fa2NvcmUpOwogaW50IG1hY2hpbmVfX2xvYWRfa2FsbHN5bXMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKLWludCBtYWNoaW5lX19sb2FkX3ZtbGludXhfcGF0aChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgZW51bSBtYXBfdHlwZSB0eXBlLAotCQkJICAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOworCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlKTsKK2ludCBtYWNoaW5lX19sb2FkX3ZtbGludXhfcGF0aChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgZW51bSBtYXBfdHlwZSB0eXBlKTsKIAogc2l6ZV90IG1hY2hpbmVfX2ZwcmludGZfZHNvc19idWlsZGlkKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBGSUxFICpmcCwKIAkJCQkgICAgIGJvb2wgKHNraXApKHN0cnVjdCBkc28gKmRzbywgaW50IHBhcm0pLCBpbnQgcGFybSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFwLmMgYi90b29scy9wZXJmL3V0aWwvbWFwLmMKaW5kZXggNzI4MTI5YS4uYzY2MmZlZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL21hcC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvbW1hbi5oPiAvKiBUbyBnZXQgdGhpbmdzIGxpa2UgTUFQX0hVR0VUTEIgZXZlbiBvbiBvbGRlciBsaWJjIGhlYWRlcnMgKi8KICNpbmNsdWRlICJtYXAuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJzdHJsaXN0LmgiCkBAIC0yNCw5ICsyNSwxMCBAQAogCVtNQVBfX1ZBUklBQkxFXSA9ICJWYXJpYWJsZXMiLAogfTsKIAotc3RhdGljIGlubGluZSBpbnQgaXNfYW5vbl9tZW1vcnkoY29uc3QgY2hhciAqZmlsZW5hbWUpCitzdGF0aWMgaW5saW5lIGludCBpc19hbm9uX21lbW9yeShjb25zdCBjaGFyICpmaWxlbmFtZSwgdTMyIGZsYWdzKQogewotCXJldHVybiAhc3RyY21wKGZpbGVuYW1lLCAiLy9hbm9uIikgfHwKKwlyZXR1cm4gZmxhZ3MgJiBNQVBfSFVHRVRMQiB8fAorCSAgICAgICAhc3RyY21wKGZpbGVuYW1lLCAiLy9hbm9uIikgfHwKIAkgICAgICAgIXN0cm5jbXAoZmlsZW5hbWUsICIvZGV2L3plcm8iLCBzaXplb2YoIi9kZXYvemVybyIpIC0gMSkgfHwKIAkgICAgICAgIXN0cm5jbXAoZmlsZW5hbWUsICIvYW5vbl9odWdlcGFnZSIsIHNpemVvZigiL2Fub25faHVnZXBhZ2UiKSAtIDEpOwogfQpAQCAtMTU1LDcgKzE1Nyw3IEBACiAJCWludCBhbm9uLCBub19kc28sIHZkc28sIGFuZHJvaWQ7CiAKIAkJYW5kcm9pZCA9IGlzX2FuZHJvaWRfbGliKGZpbGVuYW1lKTsKLQkJYW5vbiA9IGlzX2Fub25fbWVtb3J5KGZpbGVuYW1lKTsKKwkJYW5vbiA9IGlzX2Fub25fbWVtb3J5KGZpbGVuYW1lLCBmbGFncyk7CiAJCXZkc28gPSBpc192ZHNvX21hcChmaWxlbmFtZSk7CiAJCW5vX2RzbyA9IGlzX25vX2Rzb19tZW1vcnkoZmlsZW5hbWUpOwogCkBAIC0yNzksNyArMjgxLDcgQEAKIAogI2RlZmluZSBEU09fX0RFTEVURUQgIihkZWxldGVkKSIKIAotaW50IG1hcF9fbG9hZChzdHJ1Y3QgbWFwICptYXAsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitpbnQgbWFwX19sb2FkKHN0cnVjdCBtYXAgKm1hcCkKIHsKIAljb25zdCBjaGFyICpuYW1lID0gbWFwLT5kc28tPmxvbmdfbmFtZTsKIAlpbnQgbnI7CkBAIC0yODcsNyArMjg5LDcgQEAKIAlpZiAoZHNvX19sb2FkZWQobWFwLT5kc28sIG1hcC0+dHlwZSkpCiAJCXJldHVybiAwOwogCi0JbnIgPSBkc29fX2xvYWQobWFwLT5kc28sIG1hcCwgZmlsdGVyKTsKKwluciA9IGRzb19fbG9hZChtYXAtPmRzbywgbWFwKTsKIAlpZiAobnIgPCAwKSB7CiAJCWlmIChtYXAtPmRzby0+aGFzX2J1aWxkX2lkKSB7CiAJCQljaGFyIHNidWlsZF9pZFtTQlVJTERfSURfU0laRV07CkBAIC0zMTIsOSArMzE0LDYgQEAKIAkJCXByX3dhcm5pbmcoIiUuKnMgd2FzIHVwZGF0ZWQgKGlzIHByZWxpbmsgZW5hYmxlZD8pLiAiCiAJCQkJIlJlc3RhcnQgdGhlIGxvbmcgcnVubmluZyBhcHBzIHRoYXQgdXNlIGl0IVxuIiwKIAkJCQkgICAoaW50KXJlYWxfbGVuLCBuYW1lKTsKLQkJfSBlbHNlIGlmIChmaWx0ZXIpIHsKLQkJCXByX3dhcm5pbmcoIm5vIHN5bWJvbHMgcGFzc2VkIHRoZSBnaXZlbiBmaWx0ZXIuXG4iKTsKLQkJCXJldHVybiAtMjsJLyogRW1wdHkgYnV0IG1heWJlIGJ5IHRoZSBmaWx0ZXIgKi8KIAkJfSBlbHNlIHsKIAkJCXByX3dhcm5pbmcoIm5vIHN5bWJvbHMgZm91bmQgaW4gJXMsIG1heWJlIGluc3RhbGwgIgogCQkJCSAgICJhIGRlYnVnIHBhY2thZ2U/XG4iLCBuYW1lKTsKQEAgLTMzMSwxOSArMzMwLDE3IEBACiAJcmV0dXJuIHN0cmNtcChuYW1lYSwgbmFtZWIpOwogfQogCi1zdHJ1Y3Qgc3ltYm9sICptYXBfX2ZpbmRfc3ltYm9sKHN0cnVjdCBtYXAgKm1hcCwgdTY0IGFkZHIsCi0JCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0cnVjdCBzeW1ib2wgKm1hcF9fZmluZF9zeW1ib2woc3RydWN0IG1hcCAqbWFwLCB1NjQgYWRkcikKIHsKLQlpZiAobWFwX19sb2FkKG1hcCwgZmlsdGVyKSA8IDApCisJaWYgKG1hcF9fbG9hZChtYXApIDwgMCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gZHNvX19maW5kX3N5bWJvbChtYXAtPmRzbywgbWFwLT50eXBlLCBhZGRyKTsKIH0KIAotc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBtYXAgKm1hcCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0cnVjdCBzeW1ib2wgKm1hcF9fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgbWFwICptYXAsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0JaWYgKG1hcF9fbG9hZChtYXAsIGZpbHRlcikgPCAwKQorCWlmIChtYXBfX2xvYWQobWFwKSA8IDApCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKCFkc29fX3NvcnRlZF9ieV9uYW1lKG1hcC0+ZHNvLCBtYXAtPnR5cGUpKQpAQCAtNTU2LDIzICs1NTMsMjIgQEAKIAogc3RydWN0IHN5bWJvbCAqbWFwX2dyb3Vwc19fZmluZF9zeW1ib2woc3RydWN0IG1hcF9ncm91cHMgKm1nLAogCQkJCSAgICAgICBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAotCQkJCSAgICAgICBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCQkgICAgICAgc3RydWN0IG1hcCAqKm1hcHApCiB7CiAJc3RydWN0IG1hcCAqbWFwID0gbWFwX2dyb3Vwc19fZmluZChtZywgdHlwZSwgYWRkcik7CiAKIAkvKiBFbnN1cmUgbWFwIGlzIGxvYWRlZCBiZWZvcmUgdXNpbmcgbWFwLT5tYXBfaXAgKi8KLQlpZiAobWFwICE9IE5VTEwgJiYgbWFwX19sb2FkKG1hcCwgZmlsdGVyKSA+PSAwKSB7CisJaWYgKG1hcCAhPSBOVUxMICYmIG1hcF9fbG9hZChtYXApID49IDApIHsKIAkJaWYgKG1hcHAgIT0gTlVMTCkKIAkJCSptYXBwID0gbWFwOwotCQlyZXR1cm4gbWFwX19maW5kX3N5bWJvbChtYXAsIG1hcC0+bWFwX2lwKG1hcCwgYWRkciksIGZpbHRlcik7CisJCXJldHVybiBtYXBfX2ZpbmRfc3ltYm9sKG1hcCwgbWFwLT5tYXBfaXAobWFwLCBhZGRyKSk7CiAJfQogCiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0cnVjdCBzeW1ib2wgKm1hcHNfX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IG1hcHMgKm1hcHMsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJCSBzdHJ1Y3QgbWFwICoqbWFwcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCQkJIHN0cnVjdCBtYXAgKiptYXBwKQogewogCXN0cnVjdCBzeW1ib2wgKnN5bTsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CkBAIC01ODIsNyArNTc4LDcgQEAKIAlmb3IgKG5kID0gcmJfZmlyc3QoJm1hcHMtPmVudHJpZXMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgewogCQlzdHJ1Y3QgbWFwICpwb3MgPSByYl9lbnRyeShuZCwgc3RydWN0IG1hcCwgcmJfbm9kZSk7CiAKLQkJc3ltID0gbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKHBvcywgbmFtZSwgZmlsdGVyKTsKKwkJc3ltID0gbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKHBvcywgbmFtZSk7CiAKIAkJaWYgKHN5bSA9PSBOVUxMKQogCQkJY29udGludWU7CkBAIC02MDAsMTUgKzU5NiwxNCBAQAogc3RydWN0IHN5bWJvbCAqbWFwX2dyb3Vwc19fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsCiAJCQkJCSAgICAgICBlbnVtIG1hcF90eXBlIHR5cGUsCiAJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgICAgc3RydWN0IG1hcCAqKm1hcHAsCi0JCQkJCSAgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJCQkgICAgICAgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0Jc3RydWN0IHN5bWJvbCAqc3ltID0gbWFwc19fZmluZF9zeW1ib2xfYnlfbmFtZSgmbWctPm1hcHNbdHlwZV0sIG5hbWUsIG1hcHAsIGZpbHRlcik7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWFwc19fZmluZF9zeW1ib2xfYnlfbmFtZSgmbWctPm1hcHNbdHlwZV0sIG5hbWUsIG1hcHApOwogCiAJcmV0dXJuIHN5bTsKIH0KIAotaW50IG1hcF9ncm91cHNfX2ZpbmRfYW1zKHN0cnVjdCBhZGRyX21hcF9zeW1ib2wgKmFtcywgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK2ludCBtYXBfZ3JvdXBzX19maW5kX2FtcyhzdHJ1Y3QgYWRkcl9tYXBfc3ltYm9sICphbXMpCiB7CiAJaWYgKGFtcy0+YWRkciA8IGFtcy0+bWFwLT5zdGFydCB8fCBhbXMtPmFkZHIgPj0gYW1zLT5tYXAtPmVuZCkgewogCQlpZiAoYW1zLT5tYXAtPmdyb3VwcyA9PSBOVUxMKQpAQCAtNjIwLDcgKzYxNSw3IEBACiAJfQogCiAJYW1zLT5hbF9hZGRyID0gYW1zLT5tYXAtPm1hcF9pcChhbXMtPm1hcCwgYW1zLT5hZGRyKTsKLQlhbXMtPnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYW1zLT5tYXAsIGFtcy0+YWxfYWRkciwgZmlsdGVyKTsKKwlhbXMtPnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYW1zLT5tYXAsIGFtcy0+YWxfYWRkcik7CiAKIAlyZXR1cm4gYW1zLT5zeW0gPyAwIDogLTE7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFwLmggYi90b29scy9wZXJmL3V0aWwvbWFwLmgKaW5kZXggZDgzMzk2Yy4uYWJkYWNmOCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL21hcC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaApAQCAtMTI3LDE3ICsxMjcsMTQgQEAKICAqIEBtYXA6IHRoZSAnc3RydWN0IG1hcCAqJyBpbiB3aGljaCBzeW1ib2xzIGl0ZXJlYXRlZAogICogQHN5bV9uYW1lOiB0aGUgc3ltYm9sIG5hbWUKICAqIEBwb3M6IHRoZSAnc3RydWN0IHN5bWJvbCAqJyB0byB1c2UgYXMgYSBsb29wIGN1cnNvcgotICogQGZpbHRlcjogdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgRFNPCiAgKi8KLSNkZWZpbmUgX19tYXBfX2Zvcl9lYWNoX3N5bWJvbF9ieV9uYW1lKG1hcCwgc3ltX25hbWUsIHBvcywgZmlsdGVyKQlcCi0JZm9yIChwb3MgPSBtYXBfX2ZpbmRfc3ltYm9sX2J5X25hbWUobWFwLCBzeW1fbmFtZSwgZmlsdGVyKTsJXAorI2RlZmluZSBfX21hcF9fZm9yX2VhY2hfc3ltYm9sX2J5X25hbWUobWFwLCBzeW1fbmFtZSwgcG9zKQlcCisJZm9yIChwb3MgPSBtYXBfX2ZpbmRfc3ltYm9sX2J5X25hbWUobWFwLCBzeW1fbmFtZSk7CVwKIAkgICAgIHBvcyAmJiBhcmNoX19jb21wYXJlX3N5bWJvbF9uYW1lcyhwb3MtPm5hbWUsIHN5bV9uYW1lKSA9PSAwOwlcCiAJICAgICBwb3MgPSBzeW1ib2xfX25leHRfYnlfbmFtZShwb3MpKQogCiAjZGVmaW5lIG1hcF9fZm9yX2VhY2hfc3ltYm9sX2J5X25hbWUobWFwLCBzeW1fbmFtZSwgcG9zKQkJXAotCV9fbWFwX19mb3JfZWFjaF9zeW1ib2xfYnlfbmFtZShtYXAsIHN5bV9uYW1lLCAocG9zKSwgTlVMTCkKLQotdHlwZWRlZiBpbnQgKCpzeW1ib2xfZmlsdGVyX3QpKHN0cnVjdCBtYXAgKm1hcCwgc3RydWN0IHN5bWJvbCAqc3ltKTsKKwlfX21hcF9fZm9yX2VhY2hfc3ltYm9sX2J5X25hbWUobWFwLCBzeW1fbmFtZSwgKHBvcykpCiAKIGludCBhcmNoX19jb21wYXJlX3N5bWJvbF9uYW1lcyhjb25zdCBjaGFyICpuYW1lYSwgY29uc3QgY2hhciAqbmFtZWIpOwogdm9pZCBtYXBfX2luaXQoc3RydWN0IG1hcCAqbWFwLCBlbnVtIG1hcF90eXBlIHR5cGUsCkBAIC0xNzMsMTEgKzE3MCw5IEBACiBpbnQgbWFwX19mcHJpbnRmX3NyY2xpbmUoc3RydWN0IG1hcCAqbWFwLCB1NjQgYWRkciwgY29uc3QgY2hhciAqcHJlZml4LAogCQkJIEZJTEUgKmZwKTsKIAotaW50IG1hcF9fbG9hZChzdHJ1Y3QgbWFwICptYXAsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOwotc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbChzdHJ1Y3QgbWFwICptYXAsCi0JCQkJdTY0IGFkZHIsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpOwotc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBtYXAgKm1hcCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CitpbnQgbWFwX19sb2FkKHN0cnVjdCBtYXAgKm1hcCk7CitzdHJ1Y3Qgc3ltYm9sICptYXBfX2ZpbmRfc3ltYm9sKHN0cnVjdCBtYXAgKm1hcCwgdTY0IGFkZHIpOworc3RydWN0IHN5bWJvbCAqbWFwX19maW5kX3N5bWJvbF9ieV9uYW1lKHN0cnVjdCBtYXAgKm1hcCwgY29uc3QgY2hhciAqbmFtZSk7CiB2b2lkIG1hcF9fZml4dXBfc3RhcnQoc3RydWN0IG1hcCAqbWFwKTsKIHZvaWQgbWFwX19maXh1cF9lbmQoc3RydWN0IG1hcCAqbWFwKTsKIApAQCAtMTkxLDcgKzE4Niw3IEBACiBzdHJ1Y3QgbWFwICptYXBzX19maXJzdChzdHJ1Y3QgbWFwcyAqbWFwcyk7CiBzdHJ1Y3QgbWFwICptYXBfX25leHQoc3RydWN0IG1hcCAqbWFwKTsKIHN0cnVjdCBzeW1ib2wgKm1hcHNfX2ZpbmRfc3ltYm9sX2J5X25hbWUoc3RydWN0IG1hcHMgKm1hcHMsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBtYXAgKiptYXBwLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1hcCAqKm1hcHApOwogdm9pZCBtYXBfZ3JvdXBzX19pbml0KHN0cnVjdCBtYXBfZ3JvdXBzICptZywgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOwogdm9pZCBtYXBfZ3JvdXBzX19leGl0KHN0cnVjdCBtYXBfZ3JvdXBzICptZyk7CiBpbnQgbWFwX2dyb3Vwc19fY2xvbmUoc3RydWN0IHRocmVhZCAqdGhyZWFkLApAQCAtMjMxLDI1ICsyMjYsMjIgQEAKIAogc3RydWN0IHN5bWJvbCAqbWFwX2dyb3Vwc19fZmluZF9zeW1ib2woc3RydWN0IG1hcF9ncm91cHMgKm1nLAogCQkJCSAgICAgICBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLAotCQkJCSAgICAgICBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CisJCQkJICAgICAgIHN0cnVjdCBtYXAgKiptYXBwKTsKIAogc3RydWN0IHN5bWJvbCAqbWFwX2dyb3Vwc19fZmluZF9zeW1ib2xfYnlfbmFtZShzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsCiAJCQkJCSAgICAgICBlbnVtIG1hcF90eXBlIHR5cGUsCiAJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLAotCQkJCQkgICAgICAgc3RydWN0IG1hcCAqKm1hcHAsCi0JCQkJCSAgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKKwkJCQkJICAgICAgIHN0cnVjdCBtYXAgKiptYXBwKTsKIAogc3RydWN0IGFkZHJfbWFwX3N5bWJvbDsKIAotaW50IG1hcF9ncm91cHNfX2ZpbmRfYW1zKHN0cnVjdCBhZGRyX21hcF9zeW1ib2wgKmFtcywgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CitpbnQgbWFwX2dyb3Vwc19fZmluZF9hbXMoc3RydWN0IGFkZHJfbWFwX3N5bWJvbCAqYW1zKTsKIAogc3RhdGljIGlubGluZQogc3RydWN0IHN5bWJvbCAqbWFwX2dyb3Vwc19fZmluZF9mdW5jdGlvbl9ieV9uYW1lKHN0cnVjdCBtYXBfZ3JvdXBzICptZywKLQkJCQkJCSBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbWFwICoqbWFwcCwKLQkJCQkJCSBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkJCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtYXAgKiptYXBwKQogewotCXJldHVybiBtYXBfZ3JvdXBzX19maW5kX3N5bWJvbF9ieV9uYW1lKG1nLCBNQVBfX0ZVTkNUSU9OLCBuYW1lLCBtYXBwLCBmaWx0ZXIpOworCXJldHVybiBtYXBfZ3JvdXBzX19maW5kX3N5bWJvbF9ieV9uYW1lKG1nLCBNQVBfX0ZVTkNUSU9OLCBuYW1lLCBtYXBwKTsKIH0KIAogaW50IG1hcF9ncm91cHNfX2ZpeHVwX292ZXJsYXBwaW5ncyhzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsIHN0cnVjdCBtYXAgKm1hcCwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwppbmRleCA2YzkxM2MzLi4zMzU0NmMzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCkBAIC05MDQsNiArOTA0LDcgQEAKIAlbUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfTUFYX1NUQUNLXQkJPSAibWF4LXN0YWNrIiwKIAlbUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfT1ZFUldSSVRFXQkJPSAib3ZlcndyaXRlIiwKIAlbUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfTk9PVkVSV1JJVEVdCQk9ICJuby1vdmVyd3JpdGUiLAorCVtQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9EUlZfQ0ZHXQkJPSAiZHJpdmVyLWNvbmZpZyIsCiB9OwogCiBzdGF0aWMgYm9vbCBjb25maWdfdGVybV9zaHJpbmtlZDsKQEAgLTEwMzQsNyArMTAzNSw4IEBACiAJCQkgICBzdHJ1Y3QgcGFyc2VfZXZlbnRzX3Rlcm0gKnRlcm0sCiAJCQkgICBzdHJ1Y3QgcGFyc2VfZXZlbnRzX2Vycm9yICplcnIpCiB7Ci0JaWYgKHRlcm0tPnR5cGVfdGVybSA9PSBQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9VU0VSKQorCWlmICh0ZXJtLT50eXBlX3Rlcm0gPT0gUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfVVNFUiB8fAorCSAgICB0ZXJtLT50eXBlX3Rlcm0gPT0gUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfRFJWX0NGRykKIAkJLyoKIAkJICogQWx3YXlzIHN1Y2NlZWQgZm9yIHN5c2ZzIHRlcm1zLCBhcyB3ZSBkb250IGtub3cKIAkJICogYXQgdGhpcyBwb2ludCB3aGF0IHR5cGUgdGhleSBuZWVkIHRvIGhhdmUuCkBAIC0xMTM0LDYgKzExMzYsOSBAQAogCQljYXNlIFBBUlNFX0VWRU5UU19fVEVSTV9UWVBFX05PT1ZFUldSSVRFOgogCQkJQUREX0NPTkZJR19URVJNKE9WRVJXUklURSwgb3ZlcndyaXRlLCB0ZXJtLT52YWwubnVtID8gMCA6IDEpOwogCQkJYnJlYWs7CisJCWNhc2UgUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfRFJWX0NGRzoKKwkJCUFERF9DT05GSUdfVEVSTShEUlZfQ0ZHLCBkcnZfY2ZnLCB0ZXJtLT52YWwuc3RyKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KQEAgLTE3NTUsMjAgKzE3NjAsNDkgQEAKIHN0YXRpYyBpbnQgc2V0X2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGNvbnN0IHZvaWQgKmFyZykKIHsKIAljb25zdCBjaGFyICpzdHIgPSBhcmc7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCWludCBucl9hZGRyX2ZpbHRlcnMgPSAwOworCXN0cnVjdCBwZXJmX3BtdSAqcG11ID0gTlVMTDsKIAotCWlmIChldnNlbCA9PSBOVUxMIHx8IGV2c2VsLT5hdHRyLnR5cGUgIT0gUEVSRl9UWVBFX1RSQUNFUE9JTlQpIHsKLQkJZnByaW50ZihzdGRlcnIsCi0JCQkiLS1maWx0ZXIgb3B0aW9uIHNob3VsZCBmb2xsb3cgYSAtZSB0cmFjZXBvaW50IG9wdGlvblxuIik7Ci0JCXJldHVybiAtMTsKKwlpZiAoZXZzZWwgPT0gTlVMTCkKKwkJZ290byBlcnI7CisKKwlpZiAoZXZzZWwtPmF0dHIudHlwZSA9PSBQRVJGX1RZUEVfVFJBQ0VQT0lOVCkgeworCQlpZiAocGVyZl9ldnNlbF9fYXBwZW5kX3RwX2ZpbHRlcihldnNlbCwgc3RyKSA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJub3QgZW5vdWdoIG1lbW9yeSB0byBob2xkIGZpbHRlciBzdHJpbmdcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIoZXZzZWwsICImJiIsIHN0cikgPCAwKSB7CisJd2hpbGUgKChwbXUgPSBwZXJmX3BtdV9fc2NhbihwbXUpKSAhPSBOVUxMKQorCQlpZiAocG11LT50eXBlID09IGV2c2VsLT5hdHRyLnR5cGUpIHsKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoZm91bmQpCisJCXBlcmZfcG11X19zY2FuX2ZpbGUocG11LCAibnJfYWRkcl9maWx0ZXJzIiwKKwkJCQkgICAgIiVkIiwgJm5yX2FkZHJfZmlsdGVycyk7CisKKwlpZiAoIW5yX2FkZHJfZmlsdGVycykKKwkJZ290byBlcnI7CisKKwlpZiAocGVyZl9ldnNlbF9fYXBwZW5kX2FkZHJfZmlsdGVyKGV2c2VsLCBzdHIpIDwgMCkgewogCQlmcHJpbnRmKHN0ZGVyciwKIAkJCSJub3QgZW5vdWdoIG1lbW9yeSB0byBob2xkIGZpbHRlciBzdHJpbmdcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJcmV0dXJuIDA7CisKK2VycjoKKwlmcHJpbnRmKHN0ZGVyciwKKwkJIi0tZmlsdGVyIG9wdGlvbiBzaG91bGQgZm9sbG93IGEgLWUgdHJhY2Vwb2ludCBvciBIVyB0cmFjZXIgb3B0aW9uXG4iKTsKKworCXJldHVybiAtMTsKIH0KIAogaW50IHBhcnNlX2ZpbHRlcihjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKnN0ciwKQEAgLTE3OTMsNyArMTgyNyw3IEBACiAKIAlzbnByaW50ZihuZXdfZmlsdGVyLCBzaXplb2YobmV3X2ZpbHRlciksICJjb21tb25fcGlkICE9ICVkIiwgZ2V0cGlkKCkpOwogCi0JaWYgKHBlcmZfZXZzZWxfX2FwcGVuZF9maWx0ZXIoZXZzZWwsICImJiIsIG5ld19maWx0ZXIpIDwgMCkgeworCWlmIChwZXJmX2V2c2VsX19hcHBlbmRfdHBfZmlsdGVyKGV2c2VsLCBuZXdfZmlsdGVyKSA8IDApIHsKIAkJZnByaW50ZihzdGRlcnIsCiAJCQkibm90IGVub3VnaCBtZW1vcnkgdG8gaG9sZCBmaWx0ZXIgc3RyaW5nXG4iKTsKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5oIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5oCmluZGV4IGQxZWRiZjguLjhkMDlhOTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaAorKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmgKQEAgLTcxLDYgKzcxLDcgQEAKIAlQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9NQVhfU1RBQ0ssCiAJUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfTk9PVkVSV1JJVEUsCiAJUEFSU0VfRVZFTlRTX19URVJNX1RZUEVfT1ZFUldSSVRFLAorCVBBUlNFX0VWRU5UU19fVEVSTV9UWVBFX0RSVl9DRkcsCiAJX19QQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9OUiwKIH07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMubCBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMubAppbmRleCA3YTI1MTk0Li45ZjQzZmRhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5sCkBAIC01Myw2ICs1MywyNiBAQAogCXJldHVybiB0b2tlbjsKIH0KIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHBhcnNlciBnZXRzIHR3byBraW5kIG9mIGlucHV0OgorICoKKyAqIAlAY2ZnMSBvciBAY2ZnMj1jb25maWcKKyAqCisgKiBUaGUgbGVhZGluZyAnQCcgaXMgc3RyaXBwZWQgb2ZmIGJlZm9yZSAnY2ZnMScgYW5kICdjZmcyPWNvbmZpZycgYXJlIGdpdmVuIHRvCisgKiBiaXNvbi4gIEluIHRoZSBsYXR0ZXIgY2FzZSBpdCBpcyBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgc3RyaW5nIGludGFjdCBzbyB0aGF0CisgKiB0aGUgUE1VIGtlcm5lbCBkcml2ZXIgY2FuIGRldGVybWluZSB3aGF0IGNvbmZpZ3VyYWJsZSBpcyBhc3NvY2lhdGVkIHRvCisgKiAnY29uZmlnJy4KKyAqLworc3RhdGljIGludCBkcnZfc3RyKHl5c2Nhbl90IHNjYW5uZXIsIGludCB0b2tlbikKK3sKKwlZWVNUWVBFICp5eWx2YWwgPSBwYXJzZV9ldmVudHNfZ2V0X2x2YWwoc2Nhbm5lcik7CisJY2hhciAqdGV4dCA9IHBhcnNlX2V2ZW50c19nZXRfdGV4dChzY2FubmVyKTsKKworCS8qIFN0cmlwIG9mZiB0aGUgJ0AnICovCisJeXlsdmFsLT5zdHIgPSBzdHJkdXAodGV4dCArIDEpOworCXJldHVybiB0b2tlbjsKK30KKwogI2RlZmluZSBSRVdJTkQoX19hbGxvYykJCQkJXAogZG8gewkJCQkJCQkJXAogCVlZU1RZUEUgKl9feXlsdmFsID0gcGFyc2VfZXZlbnRzX2dldF9sdmFsKHl5c2Nhbm5lcik7CVwKQEAgLTEyNCw2ICsxNDQsNyBAQAogbnVtX3Jhd19oZXgJW2EtZkEtRjAtOV0rCiBuYW1lCQlbYS16QS1aXyo/XVthLXpBLVowLTlfKj8uXSoKIG5hbWVfbWludXMJW2EtekEtWl8qP11bYS16QS1aMC05XC1fKj8uOl0qCitkcnZfY2ZnX3Rlcm0JW2EtekEtWjAtOV9cLl0rKD1bYS16QS1aMC05Xyo/XC46XSspPwogLyogSWYgeW91IGFkZCBhIG1vZGlmaWVyIHlvdSBuZWVkIHRvIHVwZGF0ZSBjaGVja19tb2RpZmllcigpICovCiBtb2RpZmllcl9ldmVudAlbdWtocFBHSFNESV0rCiBtb2RpZmllcl9icAlbcnd4XXsxLDN9CkBAIC0yMDksNiArMjMwLDcgQEAKIHtuYW1lX21pbnVzfQkJeyByZXR1cm4gc3RyKHl5c2Nhbm5lciwgUEVfTkFNRSk7IH0KIFxbYWxsXF0JCQl7IHJldHVybiBQRV9BUlJBWV9BTEw7IH0KICJbIgkJCXsgQkVHSU4oYXJyYXkpOyByZXR1cm4gJ1snOyB9CitAe2Rydl9jZmdfdGVybX0JCXsgcmV0dXJuIGRydl9zdHIoeXlzY2FubmVyLCBQRV9EUlZfQ0ZHX1RFUk0pOyB9CiB9CiAKIDxtZW0+ewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy55IGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy55CmluZGV4IDViZTRhNWYuLjg3OTExNWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMueQorKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLnkKQEAgLTQ5LDYgKzQ5LDcgQEAKICV0b2tlbiBQRV9FUlJPUgogJXRva2VuIFBFX1BNVV9FVkVOVF9QUkUgUEVfUE1VX0VWRU5UX1NVRiBQRV9LRVJORUxfUE1VX0VWRU5UCiAldG9rZW4gUEVfQVJSQVlfQUxMIFBFX0FSUkFZX1JBTkdFCisldG9rZW4gUEVfRFJWX0NGR19URVJNCiAldHlwZSA8bnVtPiBQRV9WQUxVRQogJXR5cGUgPG51bT4gUEVfVkFMVUVfU1lNX0hXCiAldHlwZSA8bnVtPiBQRV9WQUxVRV9TWU1fU1cKQEAgLTYzLDYgKzY0LDcgQEAKICV0eXBlIDxzdHI+IFBFX01PRElGSUVSX0JQCiAldHlwZSA8c3RyPiBQRV9FVkVOVF9OQU1FCiAldHlwZSA8c3RyPiBQRV9QTVVfRVZFTlRfUFJFIFBFX1BNVV9FVkVOVF9TVUYgUEVfS0VSTkVMX1BNVV9FVkVOVAorJXR5cGUgPHN0cj4gUEVfRFJWX0NGR19URVJNCiAldHlwZSA8bnVtPiB2YWx1ZV9zeW0KICV0eXBlIDxoZWFkPiBldmVudF9jb25maWcKICV0eXBlIDxoZWFkPiBvcHRfZXZlbnRfY29uZmlnCkBAIC01OTksNiArNjAxLDE1IEBACiAJdGVybS0+YXJyYXkgPSAkMjsKIAkkJCA9IHRlcm07CiB9Cit8CitQRV9EUlZfQ0ZHX1RFUk0KK3sKKwlzdHJ1Y3QgcGFyc2VfZXZlbnRzX3Rlcm0gKnRlcm07CisKKwlBQk9SVF9PTihwYXJzZV9ldmVudHNfdGVybV9fc3RyKCZ0ZXJtLCBQQVJTRV9FVkVOVFNfX1RFUk1fVFlQRV9EUlZfQ0ZHLAorCQkJCQkkMSwgJDEsICZAMSwgTlVMTCkpOworCSQkID0gdGVybTsKK30KIAogYXJyYXk6CiAnWycgYXJyYXlfdGVybXMgJ10nCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcG11LmMgYi90b29scy9wZXJmL3V0aWwvcG11LmMKaW5kZXggZGRiMDI2MS4uMmJhYmNkZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3BtdS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wbXUuYwpAQCAtNDQ1LDE0ICs0NDUsMjMgQEAKIAlGSUxFICpmaWxlOwogCXN0cnVjdCBjcHVfbWFwICpjcHVzOwogCWNvbnN0IGNoYXIgKnN5c2ZzID0gc3lzZnNfX21vdW50cG9pbnQoKTsKKwljb25zdCBjaGFyICp0ZW1wbGF0ZXNbXSA9IHsKKwkJICIlcy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvJXMvY3B1bWFzayIsCisJCSAiJXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2VzLyVzL2NwdXMiLAorCQkgTlVMTAorCX07CisJY29uc3QgY2hhciAqKnRlbXBsYXRlOwogCiAJaWYgKCFzeXNmcykKIAkJcmV0dXJuIE5VTEw7CiAKLQlzbnByaW50ZihwYXRoLCBQQVRIX01BWCwKLQkJICIlcy9idXMvZXZlbnRfc291cmNlL2RldmljZXMvJXMvY3B1bWFzayIsIHN5c2ZzLCBuYW1lKTsKKwlmb3IgKHRlbXBsYXRlID0gdGVtcGxhdGVzOyAqdGVtcGxhdGU7IHRlbXBsYXRlKyspIHsKKwkJc25wcmludGYocGF0aCwgUEFUSF9NQVgsICp0ZW1wbGF0ZSwgc3lzZnMsIG5hbWUpOworCQlpZiAoc3RhdChwYXRoLCAmc3QpID09IDApCisJCQlicmVhazsKKwl9CiAKLQlpZiAoc3RhdChwYXRoLCAmc3QpIDwgMCkKKwlpZiAoISp0ZW1wbGF0ZSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlmaWxlID0gZm9wZW4ocGF0aCwgInIiKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wbXUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wbXUuaAppbmRleCA1ZDdlODQ0Li43NDM0MjJhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcG11LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BtdS5oCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSAiZXZzZWwuaCIKICNpbmNsdWRlICJwYXJzZS1ldmVudHMuaCIKIAogZW51bSB7CkBAIC0yNSw2ICsyNiw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBmb3JtYXQ7ICAvKiBIRUFEIHN0cnVjdCBwZXJmX3BtdV9mb3JtYXQgLT4gbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgYWxpYXNlczsgLyogSEVBRCBzdHJ1Y3QgcGVyZl9wbXVfYWxpYXMgLT4gbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgICAgLyogRUxFTSAqLworCWludCAoKnNldF9kcnZfY29uZmlnKQkoc3RydWN0IHBlcmZfZXZzZWxfY29uZmlnX3Rlcm0gKnRlcm0pOwogfTsKIAogc3RydWN0IHBlcmZfcG11X2luZm8gewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYwppbmRleCAyODczMzk2Li5mY2ZiZWYwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYworKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuYwpAQCAtMTEwLDEzICsxMTAsMTIgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJCSAgICAgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0JcmV0dXJuIG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uX2J5X25hbWUoaG9zdF9tYWNoaW5lLCBuYW1lLCBtYXBwLAotCQkJCQkJICAgICBOVUxMKTsKKwlyZXR1cm4gbWFjaGluZV9fZmluZF9rZXJuZWxfZnVuY3Rpb25fYnlfbmFtZShob3N0X21hY2hpbmUsIG5hbWUsIG1hcHApOwogfQogCiBzdGF0aWMgc3RydWN0IHN5bWJvbCAqX19maW5kX2tlcm5lbF9mdW5jdGlvbih1NjQgYWRkciwgc3RydWN0IG1hcCAqKm1hcHApCiB7Ci0JcmV0dXJuIG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKGhvc3RfbWFjaGluZSwgYWRkciwgbWFwcCwgTlVMTCk7CisJcmV0dXJuIG1hY2hpbmVfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uKGhvc3RfbWFjaGluZSwgYWRkciwgbWFwcCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmVmX3JlbG9jX3N5bSAqa2VybmVsX2dldF9yZWZfcmVsb2Nfc3ltKHZvaWQpCkBAIC0xMjUsNyArMTI0LDcgQEAKIAlzdHJ1Y3Qga21hcCAqa21hcDsKIAlzdHJ1Y3QgbWFwICptYXAgPSBtYWNoaW5lX19rZXJuZWxfbWFwKGhvc3RfbWFjaGluZSk7CiAKLQlpZiAobWFwX19sb2FkKG1hcCwgTlVMTCkgPCAwKQorCWlmIChtYXBfX2xvYWQobWFwKSA8IDApCiAJCXJldHVybiBOVUxMOwogCiAJa21hcCA9IG1hcF9fa21hcChtYXApOwpAQCAtMjE0LDkgKzIxMywxMyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlwdHIyID0gc3RycGJyayhwdHIxLCAiLS5fIik7Ci0JaWYgKHB0cjIpCi0JCSpwdHIyID0gJ1wwJzsKKwlmb3IgKHB0cjIgPSBwdHIxOyBwdHIyICE9ICdcMCc7IHB0cjIrKykgeworCQlpZiAoIWlzYWxudW0oKnB0cjIpICYmICpwdHIyICE9ICdfJykgeworCQkJKnB0cjIgPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwl9CisKIAlyZXQgPSBlX3NucHJpbnRmKGJ1ZiwgNjQsICIlc18lcyIsIFBFUkZQUk9CRV9HUk9VUCwgcHRyMSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwpAQCAtMzUxLDkgKzM1NCw5IEBACiAJdm1saW51eF9uYW1lID0gc3ltYm9sX2NvbmYudm1saW51eF9uYW1lOwogCWRzby0+bG9hZF9lcnJubyA9IDA7CiAJaWYgKHZtbGludXhfbmFtZSkKLQkJcmV0ID0gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsIHZtbGludXhfbmFtZSwgZmFsc2UsIE5VTEwpOworCQlyZXQgPSBkc29fX2xvYWRfdm1saW51eChkc28sIG1hcCwgdm1saW51eF9uYW1lLCBmYWxzZSk7CiAJZWxzZQotCQlyZXQgPSBkc29fX2xvYWRfdm1saW51eF9wYXRoKGRzbywgbWFwLCBOVUxMKTsKKwkJcmV0ID0gZHNvX19sb2FkX3ZtbGludXhfcGF0aChkc28sIG1hcCk7CiBmb3VuZDoKIAkqcGRzbyA9IGRzbzsKIAlyZXR1cm4gcmV0OwpAQCAtNjc0LDYgKzY3NywxMCBAQAogCWNoYXIgKnRtcDsKIAlpbnQgaSwgc2tpcHBlZCA9IDA7CiAKKwkvKiBTa2lwIHBvc3QgcHJvY2VzcyBpZiB0aGUgdGFyZ2V0IGlzIGFuIG9mZmxpbmUga2VybmVsICovCisJaWYgKHN5bWJvbF9jb25mLmlnbm9yZV92bWxpbnV4X2J1aWxkaWQpCisJCXJldHVybiAwOworCiAJcmVsb2Nfc3ltID0ga2VybmVsX2dldF9yZWZfcmVsb2Nfc3ltKCk7CiAJaWYgKCFyZWxvY19zeW0pIHsKIAkJcHJfd2FybmluZygiUmVsb2NhdGVkIGJhc2Ugc3ltYm9sIGlzIG5vdCBmb3VuZCFcbiIpOwpAQCAtMTYxNCwxOSArMTYyMSwyNyBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qIFJldHVybnMgdHJ1ZSBpZiAqYW55KiBBUkcgaXMgZWl0aGVyIEMgdmFyaWFibGUsICRwYXJhbXMgb3IgJHZhcnMuICovCitib29sIHBlcmZfcHJvYmVfd2l0aF92YXIoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldikKK3sKKwlpbnQgaSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGV2LT5uYXJnczsgaSsrKQorCQlpZiAoaXNfY192YXJuYW1lKHBldi0+YXJnc1tpXS52YXIpICAgICAgICAgICAgICB8fAorCQkgICAgIXN0cmNtcChwZXYtPmFyZ3NbaV0udmFyLCBQUk9CRV9BUkdfUEFSQU1TKSB8fAorCQkgICAgIXN0cmNtcChwZXYtPmFyZ3NbaV0udmFyLCBQUk9CRV9BUkdfVkFSUykpCisJCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qIFJldHVybiB0cnVlIGlmIHRoaXMgcGVyZl9wcm9iZV9ldmVudCByZXF1aXJlcyBkZWJ1Z2luZm8gKi8KIGJvb2wgcGVyZl9wcm9iZV9ldmVudF9uZWVkX2R3YXJmKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYpCiB7Ci0JaW50IGk7Ci0KIAlpZiAocGV2LT5wb2ludC5maWxlIHx8IHBldi0+cG9pbnQubGluZSB8fCBwZXYtPnBvaW50LmxhenlfbGluZSkKIAkJcmV0dXJuIHRydWU7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGV2LT5uYXJnczsgaSsrKQotCQlpZiAoaXNfY192YXJuYW1lKHBldi0+YXJnc1tpXS52YXIpIHx8Ci0JCSAgICAhc3RyY21wKHBldi0+YXJnc1tpXS52YXIsICIkcGFyYW1zIikgfHwKLQkJICAgICFzdHJjbXAocGV2LT5hcmdzW2ldLnZhciwgIiR2YXJzIikpCi0JCQlyZXR1cm4gdHJ1ZTsKKwlpZiAocGVyZl9wcm9iZV93aXRoX3ZhcihwZXYpKQorCQlyZXR1cm4gdHJ1ZTsKIAogCXJldHVybiBmYWxzZTsKIH0KQEAgLTE5ODcsNyArMjAwMiw3IEBACiAJCW1hcCA9IGRzb19fbmV3X21hcCh0cC0+bW9kdWxlKTsKIAkJaWYgKCFtYXApCiAJCQlnb3RvIG91dDsKLQkJc3ltID0gbWFwX19maW5kX3N5bWJvbChtYXAsIGFkZHIsIE5VTEwpOworCQlzeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKG1hcCwgYWRkcik7CiAJfSBlbHNlIHsKIAkJaWYgKHRwLT5zeW1ib2wgJiYgIWFkZHIpIHsKIAkJCWlmIChrZXJuZWxfZ2V0X3N5bWJvbF9hZGRyZXNzX2J5X25hbWUodHAtPnN5bWJvbCwKQEAgLTI2OTIsNyArMjcwNyw3IEBACiAJc3RydWN0IHN5bWJvbCAqc3ltOwogCXN0cnVjdCByYl9ub2RlICp0bXA7CiAKLQlpZiAobWFwX19sb2FkKG1hcCwgTlVMTCkgPCAwKQorCWlmIChtYXBfX2xvYWQobWFwKSA8IDApCiAJCXJldHVybiAwOwogCiAJbWFwX19mb3JfZWFjaF9zeW1ib2wobWFwLCBzeW0sIHRtcCkgewpAQCAtMzIwNyw2ICszMjIyLDUyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2hvd19wcm9iZV90cmFjZV9ldmVudChzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldikKK3sKKwljaGFyICpidWYgPSBzeW50aGVzaXplX3Byb2JlX3RyYWNlX2NvbW1hbmQodGV2KTsKKworCWlmICghYnVmKSB7CisJCXByX2RlYnVnKCJGYWlsZWQgdG8gc3ludGhlc2l6ZSBwcm9iZSB0cmFjZSBldmVudC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBTaG93aW5nIGRlZmluaXRpb24gYWx3YXlzIGdvIHN0ZG91dCAqLworCXByaW50ZigiJXNcbiIsIGJ1Zik7CisJZnJlZShidWYpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzaG93X3Byb2JlX3RyYWNlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2cywgaW50IG5wZXZzKQoreworCXN0cnVjdCBzdHJsaXN0ICpuYW1lbGlzdCA9IHN0cmxpc3RfX25ldyhOVUxMLCBOVUxMKTsKKwlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldjsKKwlzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2OworCWludCBpLCBqLCByZXQgPSAwOworCisJaWYgKCFuYW1lbGlzdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGogPSAwOyBqIDwgbnBldnMgJiYgIXJldDsgaisrKSB7CisJCXBldiA9ICZwZXZzW2pdOworCQlmb3IgKGkgPSAwOyBpIDwgcGV2LT5udGV2cyAmJiAhcmV0OyBpKyspIHsKKwkJCXRldiA9ICZwZXYtPnRldnNbaV07CisJCQkvKiBTa2lwIGlmIHRoZSBzeW1ib2wgaXMgb3V0IG9mIC50ZXh0IG9yIGJsYWNrbGlzdGVkICovCisJCQlpZiAoIXRldi0+cG9pbnQuc3ltYm9sICYmICFwZXYtPnVwcm9iZXMpCisJCQkJY29udGludWU7CisKKwkJCS8qIFNldCBuZXcgbmFtZSBmb3IgdGV2IChhbmQgdXBkYXRlIG5hbWVsaXN0KSAqLworCQkJcmV0ID0gcHJvYmVfdHJhY2VfZXZlbnRfX3NldF9uYW1lKHRldiwgcGV2LAorCQkJCQkJCSAgbmFtZWxpc3QsIHRydWUpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gc2hvd19wcm9iZV90cmFjZV9ldmVudCh0ZXYpOworCQl9CisJfQorCXN0cmxpc3RfX2RlbGV0ZShuYW1lbGlzdCk7CisKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgYXBwbHlfcGVyZl9wcm9iZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMsIGludCBucGV2cykKIHsKIAlpbnQgaSwgcmV0ID0gMDsKQEAgLTMyODksMjQgKzMzNTAsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBUT0RPOiBkb24ndCB1c2UgYSBnbG9iYWwgdmFyaWFibGUgZm9yIGZpbHRlciAuLi4gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3RyZmlsdGVyICphdmFpbGFibGVfZnVuY19maWx0ZXI7Ci0KLS8qCi0gKiBJZiBhIHN5bWJvbCBjb3JyZXNwb25kcyB0byBhIGZ1bmN0aW9uIHdpdGggZ2xvYmFsIGJpbmRpbmcgYW5kCi0gKiBtYXRjaGVzIGZpbHRlciByZXR1cm4gMC4gRm9yIGFsbCBvdGhlcnMgcmV0dXJuIDEuCi0gKi8KLXN0YXRpYyBpbnQgZmlsdGVyX2F2YWlsYWJsZV9mdW5jdGlvbnMoc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkLAotCQkJCSAgICAgIHN0cnVjdCBzeW1ib2wgKnN5bSkKLXsKLQlpZiAoc3RyZmlsdGVyX19jb21wYXJlKGF2YWlsYWJsZV9mdW5jX2ZpbHRlciwgc3ltLT5uYW1lKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KIGludCBzaG93X2F2YWlsYWJsZV9mdW5jcyhjb25zdCBjaGFyICp0YXJnZXQsIHN0cnVjdCBzdHJmaWx0ZXIgKl9maWx0ZXIsCiAJCQkJCWJvb2wgdXNlcikKIHsKKyAgICAgICAgc3RydWN0IHJiX25vZGUgKm5kOwogCXN0cnVjdCBtYXAgKm1hcDsKIAlpbnQgcmV0OwogCkBAIC0zMzI0LDkgKzMzNzEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKiBMb2FkIHN5bWJvbHMgd2l0aCBnaXZlbiBmaWx0ZXIgKi8KLQlhdmFpbGFibGVfZnVuY19maWx0ZXIgPSBfZmlsdGVyOwotCXJldCA9IG1hcF9fbG9hZChtYXAsIGZpbHRlcl9hdmFpbGFibGVfZnVuY3Rpb25zKTsKKwlyZXQgPSBtYXBfX2xvYWQobWFwKTsKIAlpZiAocmV0KSB7CiAJCWlmIChyZXQgPT0gLTIpIHsKIAkJCWNoYXIgKnN0ciA9IHN0cmZpbHRlcl9fc3RyaW5nKF9maWx0ZXIpOwpAQCAtMzM0Myw3ICszMzg4LDE0IEBACiAKIAkvKiBTaG93IGFsbCAoZmlsdGVyZWQpIHN5bWJvbHMgKi8KIAlzZXR1cF9wYWdlcigpOwotCWRzb19fZnByaW50Zl9zeW1ib2xzX2J5X25hbWUobWFwLT5kc28sIG1hcC0+dHlwZSwgc3Rkb3V0KTsKKworICAgICAgICBmb3IgKG5kID0gcmJfZmlyc3QoJm1hcC0+ZHNvLT5zeW1ib2xfbmFtZXNbbWFwLT50eXBlXSk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJCXN0cnVjdCBzeW1ib2xfbmFtZV9yYl9ub2RlICpwb3MgPSByYl9lbnRyeShuZCwgc3RydWN0IHN5bWJvbF9uYW1lX3JiX25vZGUsIHJiX25vZGUpOworCisJCWlmIChzdHJmaWx0ZXJfX2NvbXBhcmUoX2ZpbHRlciwgcG9zLT5zeW0ubmFtZSkpCisJCQlwcmludGYoIiVzXG4iLCBwb3MtPnN5bS5uYW1lKTsKKyAgICAgICAgfQorCiBlbmQ6CiAJaWYgKHVzZXIpIHsKIAkJbWFwX19wdXQobWFwKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5oIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmgKaW5kZXggZjRmNDVkYi4uODA5MWQxNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmgKQEAgLTEyOCw2ICsxMjgsOCBAQAogaW50IHBlcmZfcHJvYmVfZXZlbnRfX2NvcHkoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKmRzdCwKIAkJCSAgIHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpzcmMpOwogCitib29sIHBlcmZfcHJvYmVfd2l0aF92YXIoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldik7CisKIC8qIENoZWNrIHRoZSBwZXJmX3Byb2JlX2V2ZW50IG5lZWRzIGRlYnVnaW5mbyAqLwogYm9vbCBwZXJmX3Byb2JlX2V2ZW50X25lZWRfZHdhcmYoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldik7CiAKQEAgLTE0Nyw2ICsxNDksNyBAQAogaW50IGFkZF9wZXJmX3Byb2JlX2V2ZW50cyhzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2cywgaW50IG5wZXZzKTsKIGludCBjb252ZXJ0X3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpOwogaW50IGFwcGx5X3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpOworaW50IHNob3dfcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpOwogdm9pZCBjbGVhbnVwX3BlcmZfcHJvYmVfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXZzLCBpbnQgbnBldnMpOwogaW50IGRlbF9wZXJmX3Byb2JlX2V2ZW50cyhzdHJ1Y3Qgc3RyZmlsdGVyICpmaWx0ZXIpOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5jIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuYwppbmRleCA5YzNiOWVkLi40MzZiNjQ3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmMKQEAgLTczLDExICs3MywxMCBAQAogc3RhdGljIGludCBvcGVuX3Byb2JlX2V2ZW50cyhjb25zdCBjaGFyICp0cmFjZV9maWxlLCBib29sIHJlYWR3cml0ZSkKIHsKIAljaGFyIGJ1ZltQQVRIX01BWF07Ci0JY29uc3QgY2hhciAqdHJhY2luZ19kaXIgPSAiIjsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZV9zbnByaW50ZihidWYsIFBBVEhfTUFYLCAiJXMvJXMlcyIsCi0JCQkgdHJhY2luZ19wYXRoLCB0cmFjaW5nX2RpciwgdHJhY2VfZmlsZSk7CisJcmV0ID0gZV9zbnByaW50ZihidWYsIFBBVEhfTUFYLCAiJXMvJXMiLAorCQkJIHRyYWNpbmdfcGF0aCwgdHJhY2VfZmlsZSk7CiAJaWYgKHJldCA+PSAwKSB7CiAJCXByX2RlYnVnKCJPcGVuaW5nICVzIHdyaXRlPSVkXG4iLCBidWYsIHJlYWR3cml0ZSk7CiAJCWlmIChyZWFkd3JpdGUgJiYgIXByb2JlX2V2ZW50X2RyeV9ydW4pCkBAIC03MDAsNyArNjk5LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmc2R0bGlzdCk7CiAJcmV0ID0gZ2V0X3NkdF9ub3RlX2xpc3QoJnNkdGxpc3QsIHBhdGhuYW1lKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIGdldCBzZHQgbm90ZTogJWRcbiIsIHJldCk7CisJCXByX2RlYnVnNCgiRmFpbGVkIHRvIGdldCBzZHQgbm90ZTogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCWxpc3RfZm9yX2VhY2hfZW50cnkobm90ZSwgJnNkdGxpc3QsIG5vdGVfbGlzdCkgewpAQCAtODc3LDMgKzg3Niw2MCBAQAogCiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBzdHJ1Y3QgeworCWNvbnN0IGNoYXIgKnBhdHRlcm47CisJYm9vbAlhdmFpbDsKKwlib29sCWNoZWNrZWQ7Cit9IHByb2JlX3R5cGVfdGFibGVbXSA9IHsKKyNkZWZpbmUgREVGSU5FX1RZUEUoaWR4LCBwYXQsIGRlZl9hdmFpbCkJXAorCVtpZHhdID0gey5wYXR0ZXJuID0gcGF0LCAuYXZhaWwgPSAoZGVmX2F2YWlsKX0KKwlERUZJTkVfVFlQRShQUk9CRV9UWVBFX1UsICIqIHU4LzE2LzMyLzY0LCoiLCB0cnVlKSwKKwlERUZJTkVfVFlQRShQUk9CRV9UWVBFX1MsICIqIHM4LzE2LzMyLzY0LCoiLCB0cnVlKSwKKwlERUZJTkVfVFlQRShQUk9CRV9UWVBFX1gsICIqIHg4LzE2LzMyLzY0LCoiLCBmYWxzZSksCisJREVGSU5FX1RZUEUoUFJPQkVfVFlQRV9TVFJJTkcsICIqIHN0cmluZywqIiwgdHJ1ZSksCisJREVGSU5FX1RZUEUoUFJPQkVfVFlQRV9CSVRGSUVMRCwKKwkJICAgICIqIGI8Yml0LXdpZHRoPkA8Yml0LW9mZnNldD4vPGNvbnRhaW5lci1zaXplPiIsIHRydWUpLAorfTsKKworYm9vbCBwcm9iZV90eXBlX2lzX2F2YWlsYWJsZShlbnVtIHByb2JlX3R5cGUgdHlwZSkKK3sKKwlGSUxFICpmcDsKKwljaGFyICpidWYgPSBOVUxMOworCXNpemVfdCBsZW4gPSAwOworCWJvb2wgdGFyZ2V0X2xpbmUgPSBmYWxzZTsKKwlib29sIHJldCA9IHByb2JlX3R5cGVfdGFibGVbdHlwZV0uYXZhaWw7CisKKwlpZiAodHlwZSA+PSBQUk9CRV9UWVBFX0VORCkKKwkJcmV0dXJuIGZhbHNlOworCS8qIFdlIGRvbid0IGhhdmUgdG8gY2hlY2sgdGhlIHR5cGUgd2hpY2ggc3VwcG9ydGVkIGJ5IGRlZmF1bHQgKi8KKwlpZiAocmV0IHx8IHByb2JlX3R5cGVfdGFibGVbdHlwZV0uY2hlY2tlZCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChhc3ByaW50ZigmYnVmLCAiJXMvUkVBRE1FIiwgdHJhY2luZ19wYXRoKSA8IDApCisJCXJldHVybiByZXQ7CisKKwlmcCA9IGZvcGVuKGJ1ZiwgInIiKTsKKwlpZiAoIWZwKQorCQlnb3RvIGVuZDsKKworCXpmcmVlKCZidWYpOworCXdoaWxlIChnZXRsaW5lKCZidWYsICZsZW4sIGZwKSA+IDAgJiYgIXJldCkgeworCQlpZiAoIXRhcmdldF9saW5lKSB7CisJCQl0YXJnZXRfbGluZSA9ICEhc3Ryc3RyKGJ1ZiwgIiB0eXBlOiAiKTsKKwkJCWlmICghdGFyZ2V0X2xpbmUpCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3Ryc3RyKGJ1ZiwgIlx0ICAgICAgICAgICIpICE9IGJ1ZikKKwkJCWJyZWFrOworCQlyZXQgPSBzdHJnbG9ibWF0Y2goYnVmLCBwcm9iZV90eXBlX3RhYmxlW3R5cGVdLnBhdHRlcm4pOworCX0KKwkvKiBDYWNoZSB0aGUgcmVzdWx0ICovCisJcHJvYmVfdHlwZV90YWJsZVt0eXBlXS5jaGVja2VkID0gdHJ1ZTsKKwlwcm9iZV90eXBlX3RhYmxlW3R5cGVdLmF2YWlsID0gcmV0OworCisJZmNsb3NlKGZwKTsKK2VuZDoKKwlmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maWxlLmgKaW5kZXggOTU3N2I1Yy4uZWJhNDRjMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbGUuaAorKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmlsZS5oCkBAIC0xOSw2ICsxOSwxNSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgZW50cmllczsKIH07CiAKK2VudW0gcHJvYmVfdHlwZSB7CisJUFJPQkVfVFlQRV9VID0gMCwKKwlQUk9CRV9UWVBFX1MsCisJUFJPQkVfVFlQRV9YLAorCVBST0JFX1RZUEVfU1RSSU5HLAorCVBST0JFX1RZUEVfQklURklFTEQsCisJUFJPQkVfVFlQRV9FTkQsCit9OworCiAjZGVmaW5lIFBGX0ZMX1VQUk9CRQkxCiAjZGVmaW5lIFBGX0ZMX1JXCTIKICNkZWZpbmUgZm9yX2VhY2hfcHJvYmVfY2FjaGVfZW50cnkoZW50cnksIHBjYWNoZSkgXApAQCAtNTQsNiArNjMsNyBAQAogc3RydWN0IHByb2JlX2NhY2hlX2VudHJ5ICpwcm9iZV9jYWNoZV9fZmluZF9ieV9uYW1lKHN0cnVjdCBwcm9iZV9jYWNoZSAqcGNhY2hlLAogCQkJCQljb25zdCBjaGFyICpncm91cCwgY29uc3QgY2hhciAqZXZlbnQpOwogaW50IHByb2JlX2NhY2hlX19zaG93X2FsbF9jYWNoZXMoc3RydWN0IHN0cmZpbHRlciAqZmlsdGVyKTsKK2Jvb2wgcHJvYmVfdHlwZV9pc19hdmFpbGFibGUoZW51bSBwcm9iZV90eXBlIHR5cGUpOwogI2Vsc2UJLyogISBIQVZFX0xJQkVMRl9TVVBQT1JUICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwcm9iZV9jYWNoZSAqcHJvYmVfY2FjaGVfX25ldyhjb25zdCBjaGFyICp0Z3QgX19tYXliZV91bnVzZWQpCiB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMKaW5kZXggNWMyOTBjNi4uZGY0ZGViZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJzeW1ib2wuaCIKICNpbmNsdWRlICJwcm9iZS1maW5kZXIuaCIKKyNpbmNsdWRlICJwcm9iZS1maWxlLmgiCiAKIC8qIEtwcm9iZSB0cmFjZXIgYmFzaWMgdHlwZSBpcyB1cCB0byB1NjQgKi8KICNkZWZpbmUgTUFYX0JBU0lDX1RZUEVfQklUUwk2NApAQCAtMTcwLDYgKzE3MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgY29udmVydF92YXJpYWJsZV9sb2NhdGlvbihEd2FyZl9EaWUgKnZyX2RpZSwgRHdhcmZfQWRkciBhZGRyLAogCQkJCSAgICAgRHdhcmZfT3AgKmZiX29wcywgRHdhcmZfRGllICpzcF9kaWUsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgbWFjaGluZSwKIAkJCQkgICAgIHN0cnVjdCBwcm9iZV90cmFjZV9hcmcgKnR2YXIpCiB7CiAJRHdhcmZfQXR0cmlidXRlIGF0dHI7CkBAIC0yNjUsNyArMjY3LDcgQEAKIAlpZiAoIXR2YXIpCiAJCXJldHVybiByZXQyOwogCi0JcmVncyA9IGdldF9hcmNoX3JlZ3N0cihyZWduKTsKKwlyZWdzID0gZ2V0X2R3YXJmX3JlZ3N0cihyZWduLCBtYWNoaW5lKTsKIAlpZiAoIXJlZ3MpIHsKIAkJLyogVGhpcyBzaG91bGQgYmUgYSBidWcgaW4gRFdBUkYgb3IgdGhpcyB0b29sICovCiAJCXByX3dhcm5pbmcoIk1hcHBpbmcgZm9yIHRoZSByZWdpc3RlciBudW1iZXIgJXUgIgpAQCAtMjk3LDEzICsyOTksMTMgQEAKIAljaGFyIHNidWZbU1RSRVJSX0JVRlNJWkVdOwogCWludCBic2l6ZSwgYm9mZnMsIHRvdGFsOwogCWludCByZXQ7Ci0JY2hhciBzaWduOworCWNoYXIgcHJlZml4OwogCiAJLyogVE9ETzogY2hlY2sgYWxsIHR5cGVzICovCi0JaWYgKGNhc3QgJiYgc3RyY21wKGNhc3QsICJzdHJpbmciKSAhPSAwICYmCisJaWYgKGNhc3QgJiYgc3RyY21wKGNhc3QsICJzdHJpbmciKSAhPSAwICYmIHN0cmNtcChjYXN0LCAieCIpICE9IDAgJiYKIAkgICAgc3RyY21wKGNhc3QsICJzIikgIT0gMCAmJiBzdHJjbXAoY2FzdCwgInUiKSAhPSAwKSB7CiAJCS8qIE5vbiBzdHJpbmcgdHlwZSBpcyBPSyAqLwotCQkvKiBhbmQgcmVzcGVjdCBzaWduZWRuZXNzIGNhc3QgKi8KKwkJLyogYW5kIHJlc3BlY3Qgc2lnbmVkbmVzcy9oZXhhZGVjaW1hbCBjYXN0ICovCiAJCXR2YXItPnR5cGUgPSBzdHJkdXAoY2FzdCk7CiAJCXJldHVybiAodHZhci0+dHlwZSA9PSBOVUxMKSA/IC1FTk9NRU0gOiAwOwogCX0KQEAgLTM2NSwxMSArMzY3LDE1IEBACiAJfQogCiAJaWYgKGNhc3QgJiYgKHN0cmNtcChjYXN0LCAidSIpID09IDApKQotCQlzaWduID0gJ3UnOworCQlwcmVmaXggPSAndSc7CiAJZWxzZSBpZiAoY2FzdCAmJiAoc3RyY21wKGNhc3QsICJzIikgPT0gMCkpCi0JCXNpZ24gPSAncyc7CisJCXByZWZpeCA9ICdzJzsKKwllbHNlIGlmIChjYXN0ICYmIChzdHJjbXAoY2FzdCwgIngiKSA9PSAwKSAmJgorCQkgcHJvYmVfdHlwZV9pc19hdmFpbGFibGUoUFJPQkVfVFlQRV9YKSkKKwkJcHJlZml4ID0gJ3gnOwogCWVsc2UKLQkJc2lnbiA9IGRpZV9pc19zaWduZWRfdHlwZSgmdHlwZSkgPyAncycgOiAndSc7CisJCXByZWZpeCA9IGRpZV9pc19zaWduZWRfdHlwZSgmdHlwZSkgPyAncycgOgorCQkJIHByb2JlX3R5cGVfaXNfYXZhaWxhYmxlKFBST0JFX1RZUEVfWCkgPyAneCcgOiAndSc7CiAKIAlyZXQgPSBkd2FyZl9ieXRlc2l6ZSgmdHlwZSk7CiAJaWYgKHJldCA8PSAwKQpAQCAtMzgzLDcgKzM4OSw3IEBACiAJCQlkd2FyZl9kaWVuYW1lKCZ0eXBlKSwgTUFYX0JBU0lDX1RZUEVfQklUUyk7CiAJCXJldCA9IE1BWF9CQVNJQ19UWVBFX0JJVFM7CiAJfQotCXJldCA9IHNucHJpbnRmKGJ1ZiwgMTYsICIlYyVkIiwgc2lnbiwgcmV0KTsKKwlyZXQgPSBzbnByaW50ZihidWYsIDE2LCAiJWMlZCIsIHByZWZpeCwgcmV0KTsKIAogZm9ybWF0dGVkOgogCWlmIChyZXQgPCAwIHx8IHJldCA+PSAxNikgewpAQCAtNTM4LDcgKzU0NCw3IEBACiAJCSBkd2FyZl9kaWVuYW1lKHZyX2RpZSkpOwogCiAJcmV0ID0gY29udmVydF92YXJpYWJsZV9sb2NhdGlvbih2cl9kaWUsIHBmLT5hZGRyLCBwZi0+ZmJfb3BzLAotCQkJCQkmcGYtPnNwX2RpZSwgcGYtPnR2YXIpOworCQkJCQkmcGYtPnNwX2RpZSwgcGYtPm1hY2hpbmUsIHBmLT50dmFyKTsKIAlpZiAocmV0ID09IC1FTk9FTlQgfHwgcmV0ID09IC1FSU5WQUwpIHsKIAkJcHJfZXJyKCJGYWlsZWQgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlICclcycgdmFyaWFibGUgYXQgdGhpcyBhZGRyZXNzLlxuIgogCQkgICAgICAgIiBQZXJoYXBzIGl0IGhhcyBiZWVuIG9wdGltaXplZCBvdXQuXG4iCkBAIC05MDEsNiArOTA3LDM4IEBACiAJcmV0dXJuIGRpZV93YWxrX2xpbmVzKHNwX2RpZSwgcHJvYmVfcG9pbnRfbGF6eV93YWxrZXIsIHBmKTsKIH0KIAorc3RhdGljIHZvaWQgc2tpcF9wcm9sb2d1ZShEd2FyZl9EaWUgKnNwX2RpZSwgc3RydWN0IHByb2JlX2ZpbmRlciAqcGYpCit7CisJc3RydWN0IHBlcmZfcHJvYmVfcG9pbnQgKnBwID0gJnBmLT5wZXYtPnBvaW50OworCisJLyogTm90IHVwcm9iZT8gKi8KKwlpZiAoIXBmLT5wZXYtPnVwcm9iZXMpCisJCXJldHVybjsKKworCS8qIENvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9uPyAqLworCWlmIChkaWVfaXNfb3B0aW1pemVkX3RhcmdldCgmcGYtPmN1X2RpZSkpCisJCXJldHVybjsKKworCS8qIERvbid0IGtub3cgZW50cnlwYz8gKi8KKwlpZiAoIXBmLT5hZGRyKQorCQlyZXR1cm47CisKKwkvKiBPbmx5IEZVTkMgYW5kIEZVTkNAU1JDIGFyZSBlbGlnaWJsZS4gKi8KKwlpZiAoIXBwLT5mdW5jdGlvbiB8fCBwcC0+bGluZSB8fCBwcC0+cmV0cHJvYmUgfHwgcHAtPmxhenlfbGluZSB8fAorCSAgICBwcC0+b2Zmc2V0IHx8IHBwLT5hYnNfYWRkcmVzcykKKwkJcmV0dXJuOworCisJLyogTm90IGludGVyZXN0ZWQgaW4gZnVuYyBwYXJhbWV0ZXI/ICovCisJaWYgKCFwZXJmX3Byb2JlX3dpdGhfdmFyKHBmLT5wZXYpKQorCQlyZXR1cm47CisKKwlwcl9pbmZvKCJUYXJnZXQgcHJvZ3JhbSBpcyBjb21waWxlZCB3aXRob3V0IG9wdGltaXphdGlvbi4gU2tpcHBpbmcgcHJvbG9ndWUuXG4iCisJCSJQcm9iZSBvbiBhZGRyZXNzIDB4JSIgUFJJeDY0ICIgdG8gZm9yY2UgcHJvYmluZyBhdCB0aGUgZnVuY3Rpb24gZW50cnkuXG5cbiIsCisJCXBmLT5hZGRyKTsKKworCWRpZV9za2lwX3Byb2xvZ3VlKHNwX2RpZSwgJnBmLT5jdV9kaWUsICZwZi0+YWRkcik7Cit9CisKIHN0YXRpYyBpbnQgcHJvYmVfcG9pbnRfaW5saW5lX2NiKER3YXJmX0RpZSAqaW5fZGllLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBwcm9iZV9maW5kZXIgKnBmID0gZGF0YTsKQEAgLTkxNyw2ICs5NTUsMTEgQEAKIAkJCQkgICBkd2FyZl9kaWVuYW1lKGluX2RpZSkpOwogCQkJcmV0dXJuIC1FTk9FTlQ7CiAJCX0KKwkJaWYgKGFkZHIgPT0gMCkgeworCQkJcHJfZGVidWcoIiVzIGhhcyBubyB2YWxpZCBlbnRyeSBhZGRyZXNzLiBza2lwcGVkLlxuIiwKKwkJCQkgZHdhcmZfZGllbmFtZShpbl9kaWUpKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CiAJCXBmLT5hZGRyID0gYWRkcjsKIAkJcGYtPmFkZHIgKz0gcHAtPm9mZnNldDsKIAkJcHJfZGVidWcoImZvdW5kIGlubGluZSBhZGRyOiAweCVqeFxuIiwKQEAgLTk1MCw3ICs5OTMsOCBAQAogCWlmIChwcC0+ZmlsZSAmJiBzdHJ0YWlsY21wKHBwLT5maWxlLCBkd2FyZl9kZWNsX2ZpbGUoc3BfZGllKSkpCiAJCXJldHVybiBEV0FSRl9DQl9PSzsKIAotCXByX2RlYnVnKCJNYXRjaGVkIGZ1bmN0aW9uOiAlc1xuIiwgZHdhcmZfZGllbmFtZShzcF9kaWUpKTsKKwlwcl9kZWJ1ZygiTWF0Y2hlZCBmdW5jdGlvbjogJXMgWyVseF1cbiIsIGR3YXJmX2RpZW5hbWUoc3BfZGllKSwKKwkJICh1bnNpZ25lZCBsb25nKWR3YXJmX2RpZW9mZnNldChzcF9kaWUpKTsKIAlwZi0+Zm5hbWUgPSBkd2FyZl9kZWNsX2ZpbGUoc3BfZGllKTsKIAlpZiAocHAtPmxpbmUpIHsgLyogRnVuY3Rpb24gcmVsYXRpdmUgbGluZSAqLwogCQlkd2FyZl9kZWNsX2xpbmUoc3BfZGllLCAmcGYtPmxubyk7CkBAIC05NTksMTAgKzEwMDMsMTYgQEAKIAl9IGVsc2UgaWYgKGRpZV9pc19mdW5jX2luc3RhbmNlKHNwX2RpZSkpIHsKIAkJLyogSW5zdGFuY2VzIGFsd2F5cyBoYXZlIHRoZSBlbnRyeSBhZGRyZXNzICovCiAJCWR3YXJmX2VudHJ5cGMoc3BfZGllLCAmcGYtPmFkZHIpOworCQkvKiBCdXQgaW4gc29tZSBjYXNlIHRoZSBlbnRyeSBhZGRyZXNzIGlzIDAgKi8KKwkJaWYgKHBmLT5hZGRyID09IDApIHsKKwkJCXByX2RlYnVnKCIlcyBoYXMgbm8gZW50cnkgUEMuIFNraXBwZWRcbiIsCisJCQkJIGR3YXJmX2RpZW5hbWUoc3BfZGllKSk7CisJCQlwYXJhbS0+cmV0dmFsID0gMDsKIAkJLyogUmVhbCBmdW5jdGlvbiAqLwotCQlpZiAocHAtPmxhenlfbGluZSkKKwkJfSBlbHNlIGlmIChwcC0+bGF6eV9saW5lKQogCQkJcGFyYW0tPnJldHZhbCA9IGZpbmRfcHJvYmVfcG9pbnRfbGF6eShzcF9kaWUsIHBmKTsKIAkJZWxzZSB7CisJCQlza2lwX3Byb2xvZ3VlKHNwX2RpZSwgcGYpOwogCQkJcGYtPmFkZHIgKz0gcHAtPm9mZnNldDsKIAkJCS8qIFRPRE86IENoZWNrIHRoZSBhZGRyZXNzIGluIHRoaXMgZnVuY3Rpb24gKi8KIAkJCXBhcmFtLT5yZXR2YWwgPSBjYWxsX3Byb2JlX2ZpbmRlcihzcF9kaWUsIHBmKTsKQEAgLTk3Miw3ICsxMDIyLDcgQEAKIAkJcGFyYW0tPnJldHZhbCA9IGRpZV93YWxrX2luc3RhbmNlcyhzcF9kaWUsCiAJCQkJCXByb2JlX3BvaW50X2lubGluZV9jYiwgKHZvaWQgKilwZik7CiAJCS8qIFRoaXMgY291bGQgYmUgYSBub24tZXhpc3RlZCBpbmxpbmUgZGVmaW5pdGlvbiAqLwotCQlpZiAocGFyYW0tPnJldHZhbCA9PSAtRU5PRU5UICYmIHN0cmlzZ2xvYihwcC0+ZnVuY3Rpb24pKQorCQlpZiAocGFyYW0tPnJldHZhbCA9PSAtRU5PRU5UKQogCQkJcGFyYW0tPnJldHZhbCA9IDA7CiAJfQogCkBAIC0xMTAxLDExICsxMTUxLDggQEAKIAkJCQkgIHN0cnVjdCBwcm9iZV9maW5kZXIgKnBmKQogewogCWludCByZXQgPSAwOwotCi0jaWYgX0VMRlVUSUxTX1BSRVJFUSgwLCAxNDIpCiAJRWxmICplbGY7CiAJR0VsZl9FaGRyIGVoZHI7Ci0JR0VsZl9TaGRyIHNoZHI7CiAKIAlpZiAocGYtPmNmaV9laCB8fCBwZi0+Y2ZpX2RiZykKIAkJcmV0dXJuIGRlYnVnaW5mb19fZmluZF9wcm9iZV9sb2NhdGlvbihkYmcsIHBmKTsKQEAgLTExMTgsMTEgKzExNjUsMTggQEAKIAlpZiAoZ2VsZl9nZXRlaGRyKGVsZiwgJmVoZHIpID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGVsZl9zZWN0aW9uX2J5X25hbWUoZWxmLCAmZWhkciwgJnNoZHIsICIuZWhfZnJhbWUiLCBOVUxMKSAmJgotCSAgICBzaGRyLnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTKQotCQlwZi0+Y2ZpX2VoID0gZHdhcmZfZ2V0Y2ZpX2VsZihlbGYpOworCXBmLT5tYWNoaW5lID0gZWhkci5lX21hY2hpbmU7CiAKLQlwZi0+Y2ZpX2RiZyA9IGR3YXJmX2dldGNmaShkYmctPmRiZyk7CisjaWYgX0VMRlVUSUxTX1BSRVJFUSgwLCAxNDIpCisJZG8geworCQlHRWxmX1NoZHIgc2hkcjsKKworCQlpZiAoZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsICZlaGRyLCAmc2hkciwgIi5laF9mcmFtZSIsIE5VTEwpICYmCisJCSAgICBzaGRyLnNoX3R5cGUgPT0gU0hUX1BST0dCSVRTKQorCQkJcGYtPmNmaV9laCA9IGR3YXJmX2dldGNmaV9lbGYoZWxmKTsKKworCQlwZi0+Y2ZpX2RiZyA9IGR3YXJmX2dldGNmaShkYmctPmRiZyk7CisJfSB3aGlsZSAoMCk7CiAjZW5kaWYKIAogCXJldCA9IGRlYnVnaW5mb19fZmluZF9wcm9iZV9sb2NhdGlvbihkYmcsIHBmKTsKQEAgLTExNTAsNyArMTIwNCw3IEBACiAJICAgICh0YWcgPT0gRFdfVEFHX3ZhcmlhYmxlICYmIHZmLT52YXJzKSkgewogCQlpZiAoY29udmVydF92YXJpYWJsZV9sb2NhdGlvbihkaWVfbWVtLCB2Zi0+cGYtPmFkZHIsCiAJCQkJCSAgICAgIHZmLT5wZi0+ZmJfb3BzLCAmcGYtPnNwX2RpZSwKLQkJCQkJICAgICAgTlVMTCkgPT0gMCkgeworCQkJCQkgICAgICBwZi0+bWFjaGluZSwgTlVMTCkgPT0gMCkgewogCQkJdmYtPmFyZ3NbdmYtPm5hcmdzXS52YXIgPSAoY2hhciAqKWR3YXJmX2RpZW5hbWUoZGllX21lbSk7CiAJCQlpZiAodmYtPmFyZ3NbdmYtPm5hcmdzXS52YXIgPT0gTlVMTCkgewogCQkJCXZmLT5yZXQgPSAtRU5PTUVNOwpAQCAtMTMxMyw3ICsxMzY3LDcgQEAKIAkgICAgdGFnID09IERXX1RBR192YXJpYWJsZSkgewogCQlyZXQgPSBjb252ZXJ0X3ZhcmlhYmxlX2xvY2F0aW9uKGRpZV9tZW0sIGFmLT5wZi5hZGRyLAogCQkJCQkJYWYtPnBmLmZiX29wcywgJmFmLT5wZi5zcF9kaWUsCi0JCQkJCQlOVUxMKTsKKwkJCQkJCWFmLT5wZi5tYWNoaW5lLCBOVUxMKTsKIAkJaWYgKHJldCA9PSAwIHx8IHJldCA9PSAtRVJBTkdFKSB7CiAJCQlpbnQgcmV0MjsKIAkJCWJvb2wgZXh0ZXJucyA9ICFhZi0+Y2hpbGQ7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmggYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmgKaW5kZXggNTExMzdmYy4uZjFkODU1OCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaApAQCAtODAsNiArODAsNyBAQAogCUR3YXJmX0NGSQkJKmNmaV9kYmc7CiAjZW5kaWYKIAlEd2FyZl9PcAkJKmZiX29wczsJLyogRnJhbWUgYmFzZSBhdHRyaWJ1dGUgKi8KKwl1bnNpZ25lZCBpbnQJCW1hY2hpbmU7CS8qIFRhcmdldCBtYWNoaW5lIGFyY2ggKi8KIAlzdHJ1Y3QgcGVyZl9wcm9iZV9hcmcJKnB2YXI7CQkvKiBDdXJyZW50IHRhcmdldCB2YXJpYWJsZSAqLwogCXN0cnVjdCBwcm9iZV90cmFjZV9hcmcJKnR2YXI7CQkvKiBDdXJyZW50IHJlc3VsdCB2YXJpYWJsZSAqLwogfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1wZXJsLmMgYi90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcGVybC5jCmluZGV4IDVkMWViMWMuLmU1NWExMzIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1wZXJsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXBlcmwuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lNjQuaD4KIAogI2luY2x1ZGUgIi4uL3V0aWwuaCIKICNpbmNsdWRlIDxFWFRFUk4uaD4KQEAgLTM1OSw4ICszNjAsOCBAQAogCWlmICghdGVzdF9hbmRfc2V0X2JpdChldmVudC0+aWQsIGV2ZW50c19kZWZpbmVkKSkKIAkJZGVmaW5lX2V2ZW50X3N5bWJvbHMoZXZlbnQsIGhhbmRsZXIsIGV2ZW50LT5wcmludF9mbXQuYXJncyk7CiAKLQlzID0gbnNlY3MgLyBOU0VDU19QRVJfU0VDOwotCW5zID0gbnNlY3MgLSBzICogTlNFQ1NfUEVSX1NFQzsKKwlzID0gbnNlY3MgLyBOU0VDX1BFUl9TRUM7CisJbnMgPSBuc2VjcyAtIHMgKiBOU0VDX1BFUl9TRUM7CiAKIAlzY3JpcHRpbmdfY29udGV4dC0+ZXZlbnRfZGF0YSA9IGRhdGE7CiAJc2NyaXB0aW5nX2NvbnRleHQtPnBldmVudCA9IGV2c2VsLT50cF9mb3JtYXQtPnBldmVudDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1weXRob24uYyBiL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1weXRob24uYwppbmRleCBlMDIwM2I5Li4wODk0MzhkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcHl0aG9uLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXB5dGhvbi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNpbmNsdWRlICIuLi8uLi9wZXJmLmgiCiAjaW5jbHVkZSAiLi4vZGVidWcuaCIKQEAgLTQyNiw4ICs0MjcsOCBAQAogCQlpZiAoIWRpY3QpCiAJCQlQeV9GYXRhbEVycm9yKCJjb3VsZG4ndCBjcmVhdGUgUHl0aG9uIGRpY3QiKTsKIAl9Ci0JcyA9IG5zZWNzIC8gTlNFQ1NfUEVSX1NFQzsKLQlucyA9IG5zZWNzIC0gcyAqIE5TRUNTX1BFUl9TRUM7CisJcyA9IG5zZWNzIC8gTlNFQ19QRVJfU0VDOworCW5zID0gbnNlY3MgLSBzICogTlNFQ19QRVJfU0VDOwogCiAJc2NyaXB0aW5nX2NvbnRleHQtPmV2ZW50X2RhdGEgPSBkYXRhOwogCXNjcmlwdGluZ19jb250ZXh0LT5wZXZlbnQgPSBldnNlbC0+dHBfZm9ybWF0LT5wZXZlbnQ7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc29ydC5jIGIvdG9vbHMvcGVyZi91dGlsL3NvcnQuYwppbmRleCAzZDNjYjgzLi40NTJlMTVhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc29ydC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmMKQEAgLTExLDcgKzExLDcgQEAKIHJlZ2V4X3QJCXBhcmVudF9yZWdleDsKIGNvbnN0IGNoYXIJZGVmYXVsdF9wYXJlbnRfcGF0dGVybltdID0gIl5zeXNffF5kb19wYWdlX2ZhdWx0IjsKIGNvbnN0IGNoYXIJKnBhcmVudF9wYXR0ZXJuID0gZGVmYXVsdF9wYXJlbnRfcGF0dGVybjsKLWNvbnN0IGNoYXIJZGVmYXVsdF9zb3J0X29yZGVyW10gPSAiY29tbSxkc28sc3ltYm9sIjsKK2NvbnN0IGNoYXIJKmRlZmF1bHRfc29ydF9vcmRlciA9ICJjb21tLGRzbyxzeW1ib2wiOwogY29uc3QgY2hhcglkZWZhdWx0X2JyYW5jaF9zb3J0X29yZGVyW10gPSAiY29tbSxkc29fZnJvbSxzeW1ib2xfZnJvbSxzeW1ib2xfdG8sY3ljbGVzIjsKIGNvbnN0IGNoYXIJZGVmYXVsdF9tZW1fc29ydF9vcmRlcltdID0gImxvY2FsX3dlaWdodCxtZW0sc3ltLGRzbyxzeW1ib2xfZGFkZHIsZHNvX2RhZGRyLHNub29wLHRsYixsb2NrZWQiOwogY29uc3QgY2hhcglkZWZhdWx0X3RvcF9zb3J0X29yZGVyW10gPSAiZHNvLHN5bWJvbCI7CkBAIC04NjcsNyArODY3LDcgQEAKIH07CiAKIC8qIC0tc29ydCBkYWRkcl9zeW0gKi8KLXN0YXRpYyBpbnQ2NF90CitpbnQ2NF90CiBzb3J0X19kYWRkcl9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKIHsKIAl1aW50NjRfdCBsID0gMCwgciA9IDA7CkBAIC04OTYsNyArODk2LDcgQEAKIAkJCQkJIHdpZHRoKTsKIH0KIAotc3RhdGljIGludDY0X3QKK2ludDY0X3QKIHNvcnRfX2lhZGRyX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQogewogCXVpbnQ2NF90IGwgPSAwLCByID0gMDsKQEAgLTEwNjIsNyArMTA2Miw3IEBACiAJcmV0dXJuIHJlcHNlcF9zbnByaW50ZihiZiwgc2l6ZSwgIiUtKnMiLCB3aWR0aCwgb3V0KTsKIH0KIAotc3RhdGljIGludDY0X3QKK2ludDY0X3QKIHNvcnRfX2RjYWNoZWxpbmVfY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCiB7CiAJdTY0IGwsIHI7CkBAIC0xNDkyLDcgKzE0OTIsOCBAQAogfQogCiBzdGF0aWMgaW50IF9fc29ydF9faHBwX2hlYWRlcihzdHJ1Y3QgcGVyZl9ocHBfZm10ICpmbXQsIHN0cnVjdCBwZXJmX2hwcCAqaHBwLAotCQkJICAgICAgc3RydWN0IGhpc3RzICpoaXN0cykKKwkJCSAgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMsIGludCBsaW5lIF9fbWF5YmVfdW51c2VkLAorCQkJICAgICAgaW50ICpzcGFuIF9fbWF5YmVfdW51c2VkKQogewogCXN0cnVjdCBocHBfc29ydF9lbnRyeSAqaHNlOwogCXNpemVfdCBsZW4gPSBmbXQtPnVzZXJfbGVuOwpAQCAtMTc5Nyw3ICsxNzk4LDkgQEAKIH0KIAogc3RhdGljIGludCBfX3NvcnRfX2hkZV9oZWFkZXIoc3RydWN0IHBlcmZfaHBwX2ZtdCAqZm10LCBzdHJ1Y3QgcGVyZl9ocHAgKmhwcCwKLQkJCSAgICAgIHN0cnVjdCBoaXN0cyAqaGlzdHMgX19tYXliZV91bnVzZWQpCisJCQkgICAgICBzdHJ1Y3QgaGlzdHMgKmhpc3RzIF9fbWF5YmVfdW51c2VkLAorCQkJICAgICAgaW50IGxpbmUgX19tYXliZV91bnVzZWQsCisJCQkgICAgICBpbnQgKnNwYW4gX19tYXliZV91bnVzZWQpCiB7CiAJc3RydWN0IGhwcF9keW5hbWljX2VudHJ5ICpoZGU7CiAJc2l6ZV90IGxlbiA9IGZtdC0+dXNlcl9sZW47CkBAIC0yMzA1LDkgKzIzMDgsOSBAQAogCXJldHVybiBfX2hwcF9kaW1lbnNpb25fX2FkZF9vdXRwdXQoJnBlcmZfaHBwX2xpc3QsICZocHBfc29ydF9kaW1lbnNpb25zW2NvbF0pOwogfQogCi1zdGF0aWMgaW50IHNvcnRfZGltZW5zaW9uX19hZGQoc3RydWN0IHBlcmZfaHBwX2xpc3QgKmxpc3QsIGNvbnN0IGNoYXIgKnRvaywKLQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKLQkJCSAgICAgICBpbnQgbGV2ZWwpCitpbnQgc29ydF9kaW1lbnNpb25fX2FkZChzdHJ1Y3QgcGVyZl9ocHBfbGlzdCAqbGlzdCwgY29uc3QgY2hhciAqdG9rLAorCQkJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQlpbnQgbGV2ZWwpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTI2ODIsNyArMjY4NSw3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IG91dHB1dF9maWVsZF9hZGQoc3RydWN0IHBlcmZfaHBwX2xpc3QgKmxpc3QsIGNoYXIgKnRvaykKK2ludCBvdXRwdXRfZmllbGRfYWRkKHN0cnVjdCBwZXJmX2hwcF9saXN0ICpsaXN0LCBjaGFyICp0b2spCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTI3NDUsNyArMjc0OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgcmVzZXRfZGltZW5zaW9ucyh2b2lkKQordm9pZCByZXNldF9kaW1lbnNpb25zKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmggYi90b29scy9wZXJmL3V0aWwvc29ydC5oCmluZGV4IDdjYTM3ZWEuLjA5OWM5NzUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NvcnQuaApAQCAtMjgsNyArMjgsNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKmZpZWxkX29yZGVyOwogZXh0ZXJuIGNvbnN0IGNoYXIgZGVmYXVsdF9wYXJlbnRfcGF0dGVybltdOwogZXh0ZXJuIGNvbnN0IGNoYXIgKnBhcmVudF9wYXR0ZXJuOwotZXh0ZXJuIGNvbnN0IGNoYXIgZGVmYXVsdF9zb3J0X29yZGVyW107CitleHRlcm4gY29uc3QgY2hhciAqZGVmYXVsdF9zb3J0X29yZGVyOwogZXh0ZXJuIHJlZ2V4X3QgaWdub3JlX2NhbGxlZXNfcmVnZXg7CiBleHRlcm4gaW50IGhhdmVfaWdub3JlX2NhbGxlZXM7CiBleHRlcm4gZW51bSBzb3J0X21vZGUgc29ydF9fbW9kZTsKQEAgLTQwLDYgKzQwLDcgQEAKIGV4dGVybiBzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X2Rzb190bzsKIGV4dGVybiBzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X3N5bV9mcm9tOwogZXh0ZXJuIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfc3ltX3RvOworZXh0ZXJuIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfc3JjbGluZTsKIGV4dGVybiBlbnVtIHNvcnRfdHlwZSBzb3J0X19maXJzdF9kaW1lbnNpb247CiBleHRlcm4gY29uc3QgY2hhciBkZWZhdWx0X21lbV9zb3J0X29yZGVyW107CiAKQEAgLTI2OCw0ICsyNjksMTUgQEAKIGJvb2wgaXNfc3RyaWN0X29yZGVyKGNvbnN0IGNoYXIgKm9yZGVyKTsKIAogaW50IGhwcF9kaW1lbnNpb25fX2FkZF9vdXRwdXQodW5zaWduZWQgY29sKTsKK3ZvaWQgcmVzZXRfZGltZW5zaW9ucyh2b2lkKTsKK2ludCBzb3J0X2RpbWVuc2lvbl9fYWRkKHN0cnVjdCBwZXJmX2hwcF9saXN0ICpsaXN0LCBjb25zdCBjaGFyICp0b2ssCisJCQlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKKwkJCWludCBsZXZlbCk7CitpbnQgb3V0cHV0X2ZpZWxkX2FkZChzdHJ1Y3QgcGVyZl9ocHBfbGlzdCAqbGlzdCwgY2hhciAqdG9rKTsKK2ludDY0X3QKK3NvcnRfX2lhZGRyX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KTsKK2ludDY0X3QKK3NvcnRfX2RhZGRyX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KTsKK2ludDY0X3QKK3NvcnRfX2RjYWNoZWxpbmVfY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpOwogI2VuZGlmCS8qIF9fUEVSRl9TT1JUX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zdmdoZWxwZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zdmdoZWxwZXIuYwppbmRleCBlZWM2YzExLi4xY2JhZGEyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ZnaGVscGVyLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N2Z2hlbHBlci5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvdGltZTY0Lmg+CiAKICNpbmNsdWRlICJwZXJmLmgiCiAjaW5jbHVkZSAic3ZnaGVscGVyLmgiCkBAIC0yNzQsMTQgKzI3NSwxNCBAQAogCiAJdGV4dFswXSA9IDA7CiAKLQlpZiAoZHVyYXRpb24gPCAxMDAwKSAvKiBsZXNzIHRoYW4gMSB1c2VjICovCisJaWYgKGR1cmF0aW9uIDwgTlNFQ19QRVJfVVNFQykgLyogbGVzcyB0aGFuIDEgdXNlYyAqLwogCQlyZXR1cm4gdGV4dDsKIAotCWlmIChkdXJhdGlvbiA8IDEwMDAgKiAxMDAwKSB7IC8qIGxlc3MgdGhhbiAxIG1zZWMgKi8KLQkJc3ByaW50Zih0ZXh0LCAiJS4xZiB1cyIsIGR1cmF0aW9uIC8gMTAwMC4wKTsKKwlpZiAoZHVyYXRpb24gPCBOU0VDX1BFUl9NU0VDKSB7IC8qIGxlc3MgdGhhbiAxIG1zZWMgKi8KKwkJc3ByaW50Zih0ZXh0LCAiJS4xZiB1cyIsIGR1cmF0aW9uIC8gKGRvdWJsZSlOU0VDX1BFUl9VU0VDKTsKIAkJcmV0dXJuIHRleHQ7CiAJfQotCXNwcmludGYodGV4dCwgIiUuMWYgbXMiLCBkdXJhdGlvbiAvIDEwMDAuMCAvIDEwMDApOworCXNwcmludGYodGV4dCwgIiUuMWYgbXMiLCBkdXJhdGlvbiAvIChkb3VibGUpTlNFQ19QRVJfTVNFQyk7CiAKIAlyZXR1cm4gdGV4dDsKIH0KQEAgLTI5Nyw3ICsyOTgsNyBAQAogCiAJc3R5bGUgPSAid2FpdGluZyI7CiAKLQlpZiAoZW5kLXN0YXJ0ID4gMTAgKiAxMDAwMDAwKSAvKiAxMCBtc2VjICovCisJaWYgKGVuZC1zdGFydCA+IDEwICogTlNFQ19QRVJfTVNFQykgLyogMTAgbXNlYyAqLwogCQlzdHlsZSA9ICJXQUlUSU5HIjsKIAogCXRleHQgPSB0aW1lX3RvX3N0cmluZyhlbmQtc3RhcnQpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtZWxmLmMKaW5kZXggYTgxMWMxMy4uOTk0MDBiMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYworKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLWVsZi5jCkBAIC0yMDYsNiArMjA2LDM3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBib29sIHdhbnRfZGVtYW5nbGUoYm9vbCBpc19rZXJuZWxfc3ltKQoreworCXJldHVybiBpc19rZXJuZWxfc3ltID8gc3ltYm9sX2NvbmYuZGVtYW5nbGVfa2VybmVsIDogc3ltYm9sX2NvbmYuZGVtYW5nbGU7Cit9CisKK3N0YXRpYyBjaGFyICpkZW1hbmdsZV9zeW0oc3RydWN0IGRzbyAqZHNvLCBpbnQga21vZHVsZSwgY29uc3QgY2hhciAqZWxmX25hbWUpCit7CisJaW50IGRlbWFuZ2xlX2ZsYWdzID0gdmVyYm9zZSA/IChETUdMX1BBUkFNUyB8IERNR0xfQU5TSSkgOiBETUdMX05PX09QVFM7CisJY2hhciAqZGVtYW5nbGVkID0gTlVMTDsKKworCS8qCisJICogV2UgbmVlZCB0byBmaWd1cmUgb3V0IGlmIHRoZSBvYmplY3Qgd2FzIGNyZWF0ZWQgZnJvbSBDKysgc291cmNlcworCSAqIERXQVJGIERXX2NvbXBpbGVfdW5pdCBoYXMgdGhpcywgYnV0IHdlIGRvbid0IGFsd2F5cyBoYXZlIGFjY2VzcworCSAqIHRvIGl0Li4uCisJICovCisJaWYgKCF3YW50X2RlbWFuZ2xlKGRzby0+a2VybmVsIHx8IGttb2R1bGUpKQorCSAgICByZXR1cm4gZGVtYW5nbGVkOworCisJZGVtYW5nbGVkID0gYmZkX2RlbWFuZ2xlKE5VTEwsIGVsZl9uYW1lLCBkZW1hbmdsZV9mbGFncyk7CisJaWYgKGRlbWFuZ2xlZCA9PSBOVUxMKQorCQlkZW1hbmdsZWQgPSBqYXZhX2RlbWFuZ2xlX3N5bShlbGZfbmFtZSwgSkFWQV9ERU1BTkdMRV9OT1JFVCk7CisJZWxzZSBpZiAocnVzdF9pc19tYW5nbGVkKGRlbWFuZ2xlZCkpCisJCS8qCisJCSAgICAqIElucHV0IHRvIFJ1c3QgZGVtYW5nbGluZyBpcyB0aGUgQkZELWRlbWFuZ2xlZAorCQkgICAgKiBuYW1lIHdoaWNoIGl0IFJ1c3QtZGVtYW5nbGVzIGluIHBsYWNlLgorCQkgICAgKi8KKwkJcnVzdF9kZW1hbmdsZV9zeW0oZGVtYW5nbGVkKTsKKworCXJldHVybiBkZW1hbmdsZWQ7Cit9CisKICNkZWZpbmUgZWxmX3NlY3Rpb25fX2Zvcl9lYWNoX3JlbChyZWxkYXRhLCBwb3MsIHBvc19tZW0sIGlkeCwgbnJfZW50cmllcykgXAogCWZvciAoaWR4ID0gMCwgcG9zID0gZ2VsZl9nZXRyZWwocmVsZGF0YSwgMCwgJnBvc19tZW0pOyBcCiAJICAgICBpZHggPCBucl9lbnRyaWVzOyBcCkBAIC0yMjMsOCArMjU0LDcgQEAKICAqIEFuZCBhbHdheXMgbG9vayBhdCB0aGUgb3JpZ2luYWwgZHNvLCBub3QgYXQgZGVidWdpbmZvIHBhY2thZ2VzLCB0aGF0CiAgKiBoYXZlIHRoZSBQTFQgZGF0YSBzdHJpcHBlZCBvdXQgKHNoZHJfcmVsX3BsdC5zaF90eXBlID09IFNIVF9OT0JJVFMpLgogICovCi1pbnQgZHNvX19zeW50aGVzaXplX3BsdF9zeW1ib2xzKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IHN5bXNyYyAqc3MsIHN0cnVjdCBtYXAgKm1hcCwKLQkJCQlzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQoraW50IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBzeW1zcmMgKnNzLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJdWludDMyX3QgbnJfcmVsX2VudHJpZXMsIGlkeDsKIAlHRWxmX1N5bSBzeW07CkBAIC0zMDEsNDUgKzMzMSw1MyBAQAogCiAJCWVsZl9zZWN0aW9uX19mb3JfZWFjaF9yZWxhKHJlbGRhdGEsIHBvcywgcG9zX21lbSwgaWR4LAogCQkJCQkgICBucl9yZWxfZW50cmllcykgeworCQkJY29uc3QgY2hhciAqZWxmX25hbWUgPSBOVUxMOworCQkJY2hhciAqZGVtYW5nbGVkID0gTlVMTDsKIAkJCXN5bWlkeCA9IEdFTEZfUl9TWU0ocG9zLT5yX2luZm8pOwogCQkJcGx0X29mZnNldCArPSBzaGRyX3BsdC5zaF9lbnRzaXplOwogCQkJZ2VsZl9nZXRzeW0oc3ltcywgc3ltaWR4LCAmc3ltKTsKKworCQkJZWxmX25hbWUgPSBlbGZfc3ltX19uYW1lKCZzeW0sIHN5bXN0cnMpOworCQkJZGVtYW5nbGVkID0gZGVtYW5nbGVfc3ltKGRzbywgMCwgZWxmX25hbWUpOworCQkJaWYgKGRlbWFuZ2xlZCAhPSBOVUxMKQorCQkJCWVsZl9uYW1lID0gZGVtYW5nbGVkOwogCQkJc25wcmludGYoc3ltcGx0bmFtZSwgc2l6ZW9mKHN5bXBsdG5hbWUpLAotCQkJCSAiJXNAcGx0IiwgZWxmX3N5bV9fbmFtZSgmc3ltLCBzeW1zdHJzKSk7CisJCQkJICIlc0BwbHQiLCBlbGZfbmFtZSk7CisJCQlmcmVlKGRlbWFuZ2xlZCk7CiAKIAkJCWYgPSBzeW1ib2xfX25ldyhwbHRfb2Zmc2V0LCBzaGRyX3BsdC5zaF9lbnRzaXplLAogCQkJCQlTVEJfR0xPQkFMLCBzeW1wbHRuYW1lKTsKIAkJCWlmICghZikKIAkJCQlnb3RvIG91dF9lbGZfZW5kOwogCi0JCQlpZiAoZmlsdGVyICYmIGZpbHRlcihtYXAsIGYpKQotCQkJCXN5bWJvbF9fZGVsZXRlKGYpOwotCQkJZWxzZSB7Ci0JCQkJc3ltYm9sc19faW5zZXJ0KCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSwgZik7Ci0JCQkJKytucjsKLQkJCX0KKwkJCXN5bWJvbHNfX2luc2VydCgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0sIGYpOworCQkJKytucjsKIAkJfQogCX0gZWxzZSBpZiAoc2hkcl9yZWxfcGx0LnNoX3R5cGUgPT0gU0hUX1JFTCkgewogCQlHRWxmX1JlbCBwb3NfbWVtLCAqcG9zOwogCQllbGZfc2VjdGlvbl9fZm9yX2VhY2hfcmVsKHJlbGRhdGEsIHBvcywgcG9zX21lbSwgaWR4LAogCQkJCQkgIG5yX3JlbF9lbnRyaWVzKSB7CisJCQljb25zdCBjaGFyICplbGZfbmFtZSA9IE5VTEw7CisJCQljaGFyICpkZW1hbmdsZWQgPSBOVUxMOwogCQkJc3ltaWR4ID0gR0VMRl9SX1NZTShwb3MtPnJfaW5mbyk7CiAJCQlwbHRfb2Zmc2V0ICs9IHNoZHJfcGx0LnNoX2VudHNpemU7CiAJCQlnZWxmX2dldHN5bShzeW1zLCBzeW1pZHgsICZzeW0pOworCisJCQllbGZfbmFtZSA9IGVsZl9zeW1fX25hbWUoJnN5bSwgc3ltc3Rycyk7CisJCQlkZW1hbmdsZWQgPSBkZW1hbmdsZV9zeW0oZHNvLCAwLCBlbGZfbmFtZSk7CisJCQlpZiAoZGVtYW5nbGVkICE9IE5VTEwpCisJCQkJZWxmX25hbWUgPSBkZW1hbmdsZWQ7CiAJCQlzbnByaW50ZihzeW1wbHRuYW1lLCBzaXplb2Yoc3ltcGx0bmFtZSksCi0JCQkJICIlc0BwbHQiLCBlbGZfc3ltX19uYW1lKCZzeW0sIHN5bXN0cnMpKTsKKwkJCQkgIiVzQHBsdCIsIGVsZl9uYW1lKTsKKwkJCWZyZWUoZGVtYW5nbGVkKTsKIAogCQkJZiA9IHN5bWJvbF9fbmV3KHBsdF9vZmZzZXQsIHNoZHJfcGx0LnNoX2VudHNpemUsCiAJCQkJCVNUQl9HTE9CQUwsIHN5bXBsdG5hbWUpOwogCQkJaWYgKCFmKQogCQkJCWdvdG8gb3V0X2VsZl9lbmQ7CiAKLQkJCWlmIChmaWx0ZXIgJiYgZmlsdGVyKG1hcCwgZikpCi0JCQkJc3ltYm9sX19kZWxldGUoZik7Ci0JCQllbHNlIHsKLQkJCQlzeW1ib2xzX19pbnNlcnQoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdLCBmKTsKLQkJCQkrK25yOwotCQkJfQorCQkJc3ltYm9sc19faW5zZXJ0KCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSwgZik7CisJCQkrK25yOwogCQl9CiAJfQogCkBAIC02ODUsNyArNzIzLDcgQEAKIAl9CiAKIAkvKiBBbHdheXMgcmVqZWN0IGltYWdlcyB3aXRoIGEgbWlzbWF0Y2hlZCBidWlsZC1pZDogKi8KLQlpZiAoZHNvLT5oYXNfYnVpbGRfaWQpIHsKKwlpZiAoZHNvLT5oYXNfYnVpbGRfaWQgJiYgIXN5bWJvbF9jb25mLmlnbm9yZV92bWxpbnV4X2J1aWxkaWQpIHsKIAkJdTggYnVpbGRfaWRbQlVJTERfSURfU0laRV07CiAKIAkJaWYgKGVsZl9yZWFkX2J1aWxkX2lkKGVsZiwgYnVpbGRfaWQsIEJVSUxEX0lEX1NJWkUpIDwgMCkgewpAQCAtNzc1LDE3ICs4MTMsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wgd2FudF9kZW1hbmdsZShib29sIGlzX2tlcm5lbF9zeW0pCi17Ci0JcmV0dXJuIGlzX2tlcm5lbF9zeW0gPyBzeW1ib2xfY29uZi5kZW1hbmdsZV9rZXJuZWwgOiBzeW1ib2xfY29uZi5kZW1hbmdsZTsKLX0KLQogdm9pZCBfX3dlYWsgYXJjaF9fc3ltX3VwZGF0ZShzdHJ1Y3Qgc3ltYm9sICpzIF9fbWF5YmVfdW51c2VkLAogCQlHRWxmX1N5bSAqc3ltIF9fbWF5YmVfdW51c2VkKSB7IH0KIAotaW50IGRzb19fbG9hZF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCSAgc3RydWN0IHN5bXNyYyAqc3ltc19zcywgc3RydWN0IHN5bXNyYyAqcnVudGltZV9zcywKLQkJICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQga21vZHVsZSkKK2ludCBkc29fX2xvYWRfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLCBzdHJ1Y3Qgc3ltc3JjICpzeW1zX3NzLAorCQkgIHN0cnVjdCBzeW1zcmMgKnJ1bnRpbWVfc3MsIGludCBrbW9kdWxlKQogewogCXN0cnVjdCBrbWFwICprbWFwID0gZHNvLT5rZXJuZWwgPyBtYXBfX2ttYXAobWFwKSA6IE5VTEw7CiAJc3RydWN0IG1hcF9ncm91cHMgKmttYXBzID0ga21hcCA/IG1hcF9fa21hcHMobWFwKSA6IE5VTEw7CkBAIC0xMDcwLDI5ICsxMTAyLDEwIEBACiAJCQlzeW0uc3RfdmFsdWUgLT0gc2hkci5zaF9hZGRyIC0gc2hkci5zaF9vZmZzZXQ7CiAJCX0KIG5ld19zeW1ib2w6Ci0JCS8qCi0JCSAqIFdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgb2JqZWN0IHdhcyBjcmVhdGVkIGZyb20gQysrIHNvdXJjZXMKLQkJICogRFdBUkYgRFdfY29tcGlsZV91bml0IGhhcyB0aGlzLCBidXQgd2UgZG9uJ3QgYWx3YXlzIGhhdmUgYWNjZXNzCi0JCSAqIHRvIGl0Li4uCi0JCSAqLwotCQlpZiAod2FudF9kZW1hbmdsZShkc28tPmtlcm5lbCB8fCBrbW9kdWxlKSkgewotCQkJaW50IGRlbWFuZ2xlX2ZsYWdzID0gRE1HTF9OT19PUFRTOwotCQkJaWYgKHZlcmJvc2UpCi0JCQkJZGVtYW5nbGVfZmxhZ3MgPSBETUdMX1BBUkFNUyB8IERNR0xfQU5TSTsKKwkJZGVtYW5nbGVkID0gZGVtYW5nbGVfc3ltKGRzbywga21vZHVsZSwgZWxmX25hbWUpOworCQlpZiAoZGVtYW5nbGVkICE9IE5VTEwpCisJCQllbGZfbmFtZSA9IGRlbWFuZ2xlZDsKIAotCQkJZGVtYW5nbGVkID0gYmZkX2RlbWFuZ2xlKE5VTEwsIGVsZl9uYW1lLCBkZW1hbmdsZV9mbGFncyk7Ci0JCQlpZiAoZGVtYW5nbGVkID09IE5VTEwpCi0JCQkJZGVtYW5nbGVkID0gamF2YV9kZW1hbmdsZV9zeW0oZWxmX25hbWUsIEpBVkFfREVNQU5HTEVfTk9SRVQpOwotCQkJZWxzZSBpZiAocnVzdF9pc19tYW5nbGVkKGRlbWFuZ2xlZCkpCi0JCQkJLyoKLQkJCQkgKiBJbnB1dCB0byBSdXN0IGRlbWFuZ2xpbmcgaXMgdGhlIEJGRC1kZW1hbmdsZWQKLQkJCQkgKiBuYW1lIHdoaWNoIGl0IFJ1c3QtZGVtYW5nbGVzIGluIHBsYWNlLgotCQkJCSAqLwotCQkJCXJ1c3RfZGVtYW5nbGVfc3ltKGRlbWFuZ2xlZCk7Ci0KLQkJCWlmIChkZW1hbmdsZWQgIT0gTlVMTCkKLQkJCQllbGZfbmFtZSA9IGRlbWFuZ2xlZDsKLQkJfQogCQlmID0gc3ltYm9sX19uZXcoc3ltLnN0X3ZhbHVlLCBzeW0uc3Rfc2l6ZSwKIAkJCQlHRUxGX1NUX0JJTkQoc3ltLnN0X2luZm8pLCBlbGZfbmFtZSk7CiAJCWZyZWUoZGVtYW5nbGVkKTsKQEAgLTExMDEsMjEgKzExMTQsMTYgQEAKIAogCQlhcmNoX19zeW1fdXBkYXRlKGYsICZzeW0pOwogCi0JCWlmIChmaWx0ZXIgJiYgZmlsdGVyKGN1cnJfbWFwLCBmKSkKLQkJCXN5bWJvbF9fZGVsZXRlKGYpOwotCQllbHNlIHsKLQkJCXN5bWJvbHNfX2luc2VydCgmY3Vycl9kc28tPnN5bWJvbHNbY3Vycl9tYXAtPnR5cGVdLCBmKTsKLQkJCW5yKys7Ci0JCX0KKwkJX19zeW1ib2xzX19pbnNlcnQoJmN1cnJfZHNvLT5zeW1ib2xzW2N1cnJfbWFwLT50eXBlXSwgZiwgZHNvLT5rZXJuZWwpOworCQlucisrOwogCX0KIAogCS8qCiAJICogRm9yIG1pc2Fubm90YXRlZCwgemVyb2VkLCBBU00gZnVuY3Rpb24gc2l6ZXMuCiAJICovCiAJaWYgKG5yID4gMCkgewotCQlpZiAoIXN5bWJvbF9jb25mLmFsbG93X2FsaWFzZXMpCi0JCQlzeW1ib2xzX19maXh1cF9kdXBsaWNhdGUoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdKTsKIAkJc3ltYm9sc19fZml4dXBfZW5kKCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSk7CisJCXN5bWJvbHNfX2ZpeHVwX2R1cGxpY2F0ZSgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0pOwogCQlpZiAoa21hcCkgewogCQkJLyoKIAkJCSAqIFdlIG5lZWQgdG8gZml4dXAgdGhpcyBoZXJlIHRvbyBiZWNhdXNlIHdlIGNyZWF0ZSBuZXcKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtbWluaW1hbC5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1taW5pbWFsLmMKaW5kZXggNDg5MDYzMy4uMTFjZGRlOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1taW5pbWFsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1taW5pbWFsLmMKQEAgLTI4Nyw4ICsyODcsNyBAQAogCiBpbnQgZHNvX19zeW50aGVzaXplX3BsdF9zeW1ib2xzKHN0cnVjdCBkc28gKmRzbyBfX21heWJlX3VudXNlZCwKIAkJCQlzdHJ1Y3Qgc3ltc3JjICpzcyBfX21heWJlX3VudXNlZCwKLQkJCQlzdHJ1Y3QgbWFwICptYXAgX19tYXliZV91bnVzZWQsCi0JCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlciBfX21heWJlX3VudXNlZCkKKwkJCQlzdHJ1Y3QgbWFwICptYXAgX19tYXliZV91bnVzZWQpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMzQsNyArMzMzLDYgQEAKIGludCBkc29fX2xvYWRfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkLAogCQkgIHN0cnVjdCBzeW1zcmMgKnNzLAogCQkgIHN0cnVjdCBzeW1zcmMgKnJ1bnRpbWVfc3MgX19tYXliZV91bnVzZWQsCi0JCSAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlciBfX21heWJlX3VudXNlZCwKIAkJICBpbnQga21vZHVsZSBfX21heWJlX3VudXNlZCkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1aWxkX2lkW0JVSUxEX0lEX1NJWkVdOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCmluZGV4IDM3ZThkMjAuLmFlY2ZmNjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYworKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgImFubm90YXRlLmgiCiAjaW5jbHVkZSAiYnVpbGQtaWQuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTIzLDEwICsyNCwxMCBAQAogI2luY2x1ZGUgPHN5bWJvbC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiAKLXN0YXRpYyBpbnQgZHNvX19sb2FkX2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7Ci1zdGF0aWMgaW50IGRzb19fbG9hZF9ndWVzdF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CitzdGF0aWMgaW50IGRzb19fbG9hZF9rZXJuZWxfc3ltKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKTsKK3N0YXRpYyBpbnQgZHNvX19sb2FkX2d1ZXN0X2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApOworc3RhdGljIGJvb2wgc3ltYm9sX19pc19pZGxlKGNvbnN0IGNoYXIgKm5hbWUpOworCiBpbnQgdm1saW51eF9wYXRoX19ucl9lbnRyaWVzOwogY2hhciAqKnZtbGludXhfcGF0aDsKIApAQCAtMTUyLDYgKzE1Myw5IEBACiAJc3RydWN0IHJiX25vZGUgKm5kOwogCXN0cnVjdCBzeW1ib2wgKmN1cnIsICpuZXh0OwogCisJaWYgKHN5bWJvbF9jb25mLmFsbG93X2FsaWFzZXMpCisJCXJldHVybjsKKwogCW5kID0gcmJfZmlyc3Qoc3ltYm9scyk7CiAKIAl3aGlsZSAobmQpIHsKQEAgLTIzNSw4ICsyMzksMTMgQEAKIAlpZiAoc3ltID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JaWYgKHN5bWJvbF9jb25mLnByaXZfc2l6ZSkKKwlpZiAoc3ltYm9sX2NvbmYucHJpdl9zaXplKSB7CisJCWlmIChzeW1ib2xfY29uZi5pbml0X2Fubm90YXRpb24pIHsKKwkJCXN0cnVjdCBhbm5vdGF0aW9uICpub3RlcyA9ICh2b2lkICopc3ltOworCQkJcHRocmVhZF9tdXRleF9pbml0KCZub3Rlcy0+bG9jaywgTlVMTCk7CisJCX0KIAkJc3ltID0gKCh2b2lkICopc3ltKSArIHN5bWJvbF9jb25mLnByaXZfc2l6ZTsKKwl9CiAKIAlzeW0tPnN0YXJ0ICAgPSBzdGFydDsKIAlzeW0tPmVuZCAgICAgPSBsZW4gPyBzdGFydCArIGxlbiA6IHN0YXJ0OwpAQCAtMjY4LDEzICsyNzcsMjQgQEAKIAl9CiB9CiAKLXZvaWQgc3ltYm9sc19faW5zZXJ0KHN0cnVjdCByYl9yb290ICpzeW1ib2xzLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit2b2lkIF9fc3ltYm9sc19faW5zZXJ0KHN0cnVjdCByYl9yb290ICpzeW1ib2xzLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIGJvb2wga2VybmVsKQogewogCXN0cnVjdCByYl9ub2RlICoqcCA9ICZzeW1ib2xzLT5yYl9ub2RlOwogCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwogCWNvbnN0IHU2NCBpcCA9IHN5bS0+c3RhcnQ7CiAJc3RydWN0IHN5bWJvbCAqczsKIAorCWlmIChrZXJuZWwpIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHN5bS0+bmFtZTsKKwkJLyoKKwkJICogcHBjNjQgdXNlcyBmdW5jdGlvbiBkZXNjcmlwdG9ycyBhbmQgYXBwZW5kcyBhICcuJyB0byB0aGUKKwkJICogc3RhcnQgb2YgZXZlcnkgaW5zdHJ1Y3Rpb24gYWRkcmVzcy4gUmVtb3ZlIGl0LgorCQkgKi8KKwkJaWYgKG5hbWVbMF0gPT0gJy4nKQorCQkJbmFtZSsrOworCQlzeW0tPmlkbGUgPSBzeW1ib2xfX2lzX2lkbGUobmFtZSk7CisJfQorCiAJd2hpbGUgKCpwICE9IE5VTEwpIHsKIAkJcGFyZW50ID0gKnA7CiAJCXMgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBzeW1ib2wsIHJiX25vZGUpOwpAQCAtMjg3LDYgKzMwNywxMSBAQAogCXJiX2luc2VydF9jb2xvcigmc3ltLT5yYl9ub2RlLCBzeW1ib2xzKTsKIH0KIAordm9pZCBzeW1ib2xzX19pbnNlcnQoc3RydWN0IHJiX3Jvb3QgKnN5bWJvbHMsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlfX3N5bWJvbHNfX2luc2VydChzeW1ib2xzLCBzeW0sIGZhbHNlKTsKK30KKwogc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bWJvbHNfX2ZpbmQoc3RydWN0IHJiX3Jvb3QgKnN5bWJvbHMsIHU2NCBpcCkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbjsKQEAgLTMyMCw2ICszNDUsMTYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bWJvbHNfX2xhc3Qoc3RydWN0IHJiX3Jvb3QgKnN5bWJvbHMpCit7CisJc3RydWN0IHJiX25vZGUgKm4gPSByYl9sYXN0KHN5bWJvbHMpOworCisJaWYgKG4pCisJCXJldHVybiByYl9lbnRyeShuLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKKworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltYm9sc19fbmV4dChzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7CiAJc3RydWN0IHJiX25vZGUgKm4gPSByYl9uZXh0KCZzeW0tPnJiX25vZGUpOwpAQCAtNDE1LDcgKzQ1MCw3IEBACiAKIHZvaWQgZHNvX19pbnNlcnRfc3ltYm9sKHN0cnVjdCBkc28gKmRzbywgZW51bSBtYXBfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7Ci0Jc3ltYm9sc19faW5zZXJ0KCZkc28tPnN5bWJvbHNbdHlwZV0sIHN5bSk7CisJX19zeW1ib2xzX19pbnNlcnQoJmRzby0+c3ltYm9sc1t0eXBlXSwgc3ltLCBkc28tPmtlcm5lbCk7CiAKIAkvKiB1cGRhdGUgdGhlIHN5bWJvbCBjYWNoZSBpZiBuZWNlc3NhcnkgKi8KIAlpZiAoZHNvLT5sYXN0X2ZpbmRfcmVzdWx0W3R5cGVdLmFkZHIgPj0gc3ltLT5zdGFydCAmJgpAQCAtNDQxLDYgKzQ3NiwxMSBAQAogCXJldHVybiBzeW1ib2xzX19maXJzdCgmZHNvLT5zeW1ib2xzW3R5cGVdKTsKIH0KIAorc3RydWN0IHN5bWJvbCAqZHNvX19sYXN0X3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSkKK3sKKwlyZXR1cm4gc3ltYm9sc19fbGFzdCgmZHNvLT5zeW1ib2xzW3R5cGVdKTsKK30KKwogc3RydWN0IHN5bWJvbCAqZHNvX19uZXh0X3N5bWJvbChzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7CiAJcmV0dXJuIHN5bWJvbHNfX25leHQoc3ltKTsKQEAgLTUzNyw3ICs1NzcsNyBAQAogICogVGhlc2UgYXJlIHN5bWJvbHMgaW4gdGhlIGtlcm5lbCBpbWFnZSwgc28gbWFrZSBzdXJlIHRoYXQKICAqIHN5bSBpcyBmcm9tIGEga2VybmVsIERTTy4KICAqLwotYm9vbCBzeW1ib2xfX2lzX2lkbGUoc3RydWN0IHN5bWJvbCAqc3ltKQorc3RhdGljIGJvb2wgc3ltYm9sX19pc19pZGxlKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJY29uc3QgY2hhciAqIGNvbnN0IGlkbGVfc3ltYm9sc1tdID0gewogCQkiY3B1X2lkbGUiLApAQCAtNTU0LDE0ICs1OTQsMTAgQEAKIAkJInBzZXJpZXNfZGVkaWNhdGVkX2lkbGVfc2xlZXAiLAogCQlOVUxMCiAJfTsKLQogCWludCBpOwogCi0JaWYgKCFzeW0pCi0JCXJldHVybiBmYWxzZTsKLQogCWZvciAoaSA9IDA7IGlkbGVfc3ltYm9sc1tpXTsgaSsrKSB7Ci0JCWlmICghc3RyY21wKGlkbGVfc3ltYm9sc1tpXSwgc3ltLT5uYW1lKSkKKwkJaWYgKCFzdHJjbXAoaWRsZV9zeW1ib2xzW2ldLCBuYW1lKSkKIAkJCXJldHVybiB0cnVlOwogCX0KIApAQCAtNTkwLDcgKzYyNiw3IEBACiAJICogV2Ugd2lsbCBwYXNzIHRoZSBzeW1ib2xzIHRvIHRoZSBmaWx0ZXIgbGF0ZXIsIGluCiAJICogbWFwX19zcGxpdF9rYWxsc3ltcywgd2hlbiB3ZSBoYXZlIHNwbGl0IHRoZSBtYXBzIHBlciBtb2R1bGUKIAkgKi8KLQlzeW1ib2xzX19pbnNlcnQocm9vdCwgc3ltKTsKKwlfX3N5bWJvbHNfX2luc2VydChyb290LCBzeW0sICFzdHJjaHIobmFtZSwgJ1snKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYwNyw4ICs2NDMsNyBAQAogCXJldHVybiBrYWxsc3ltc19fcGFyc2UoZmlsZW5hbWUsICZhcmdzLCBtYXBfX3Byb2Nlc3Nfa2FsbHN5bV9zeW1ib2wpOwogfQogCi1zdGF0aWMgaW50IGRzb19fc3BsaXRfa2FsbHN5bXNfZm9yX2tjb3JlKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkJCQkgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0YXRpYyBpbnQgZHNvX19zcGxpdF9rYWxsc3ltc19mb3Jfa2NvcmUoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJc3RydWN0IG1hcF9ncm91cHMgKmttYXBzID0gbWFwX19rbWFwcyhtYXApOwogCXN0cnVjdCBtYXAgKmN1cnJfbWFwOwpAQCAtNjM3LDcgKzY3Miw3IEBACiAKIAkJY3Vycl9tYXAgPSBtYXBfZ3JvdXBzX19maW5kKGttYXBzLCBtYXAtPnR5cGUsIHBvcy0+c3RhcnQpOwogCi0JCWlmICghY3Vycl9tYXAgfHwgKGZpbHRlciAmJiBmaWx0ZXIoY3Vycl9tYXAsIHBvcykpKSB7CisJCWlmICghY3Vycl9tYXApIHsKIAkJCXN5bWJvbF9fZGVsZXRlKHBvcyk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtNjYwLDggKzY5NSw3IEBACiAgKiBrZXJuZWwgcmFuZ2UgaXMgYnJva2VuIGluIHNldmVyYWwgbWFwcywgbmFtZWQgW2tlcm5lbF0uTiwgYXMgd2UgZG9uJ3QgaGF2ZQogICogdGhlIG9yaWdpbmFsIEVMRiBzZWN0aW9uIG5hbWVzIHZtbGludXggaGF2ZS4KICAqLwotc3RhdGljIGludCBkc29fX3NwbGl0X2thbGxzeW1zKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLCB1NjQgZGVsdGEsCi0JCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0YXRpYyBpbnQgZHNvX19zcGxpdF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYXAgKm1hcCwgdTY0IGRlbHRhKQogewogCXN0cnVjdCBtYXBfZ3JvdXBzICprbWFwcyA9IG1hcF9fa21hcHMobWFwKTsKIAlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZTsKQEAgLTczOCw3ICs3NzIsNyBAQAogCiAJCQlpZiAoY291bnQgPT0gMCkgewogCQkJCWN1cnJfbWFwID0gbWFwOwotCQkJCWdvdG8gZmlsdGVyX3N5bWJvbDsKKwkJCQlnb3RvIGFkZF9zeW1ib2w7CiAJCQl9CiAKIAkJCWlmIChkc28tPmtlcm5lbCA9PSBEU09fVFlQRV9HVUVTVF9LRVJORUwpCkBAIC03NzAsMTggKzgwNCwxOCBAQAogCQkJcG9zLT5zdGFydCAtPSBkZWx0YTsKIAkJCXBvcy0+ZW5kIC09IGRlbHRhOwogCQl9Ci1maWx0ZXJfc3ltYm9sOgotCQlpZiAoZmlsdGVyICYmIGZpbHRlcihjdXJyX21hcCwgcG9zKSkgewotZGlzY2FyZF9zeW1ib2w6CQlyYl9lcmFzZSgmcG9zLT5yYl9ub2RlLCByb290KTsKLQkJCXN5bWJvbF9fZGVsZXRlKHBvcyk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoY3Vycl9tYXAgIT0gbWFwKSB7Ci0JCQkJcmJfZXJhc2UoJnBvcy0+cmJfbm9kZSwgcm9vdCk7Ci0JCQkJc3ltYm9sc19faW5zZXJ0KCZjdXJyX21hcC0+ZHNvLT5zeW1ib2xzW2N1cnJfbWFwLT50eXBlXSwgcG9zKTsKLQkJCQkrK21vdmVkOwotCQkJfSBlbHNlCi0JCQkJKytjb3VudDsKLQkJfQorYWRkX3N5bWJvbDoKKwkJaWYgKGN1cnJfbWFwICE9IG1hcCkgeworCQkJcmJfZXJhc2UoJnBvcy0+cmJfbm9kZSwgcm9vdCk7CisJCQlzeW1ib2xzX19pbnNlcnQoJmN1cnJfbWFwLT5kc28tPnN5bWJvbHNbY3Vycl9tYXAtPnR5cGVdLCBwb3MpOworCQkJKyttb3ZlZDsKKwkJfSBlbHNlCisJCQkrK2NvdW50OworCisJCWNvbnRpbnVlOworZGlzY2FyZF9zeW1ib2w6CisJCXJiX2VyYXNlKCZwb3MtPnJiX25vZGUsIHJvb3QpOworCQlzeW1ib2xfX2RlbGV0ZShwb3MpOwogCX0KIAogCWlmIChjdXJyX21hcCAhPSBtYXAgJiYKQEAgLTEyMjEsNyArMTI1NSw3IEBACiB9CiAKIGludCBfX2Rzb19fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJIHN0cnVjdCBtYXAgKm1hcCwgYm9vbCBub19rY29yZSwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKKwkJCSBzdHJ1Y3QgbWFwICptYXAsIGJvb2wgbm9fa2NvcmUpCiB7CiAJdTY0IGRlbHRhID0gMDsKIApAQCAtMTIzNCw4ICsxMjY4LDggQEAKIAlpZiAoa2FsbHN5bXNfX2RlbHRhKG1hcCwgZmlsZW5hbWUsICZkZWx0YSkpCiAJCXJldHVybiAtMTsKIAotCXN5bWJvbHNfX2ZpeHVwX2R1cGxpY2F0ZSgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0pOwogCXN5bWJvbHNfX2ZpeHVwX2VuZCgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0pOworCXN5bWJvbHNfX2ZpeHVwX2R1cGxpY2F0ZSgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0pOwogCiAJaWYgKGRzby0+a2VybmVsID09IERTT19UWVBFX0dVRVNUX0tFUk5FTCkKIAkJZHNvLT5zeW10YWJfdHlwZSA9IERTT19CSU5BUllfVFlQRV9fR1VFU1RfS0FMTFNZTVM7CkBAIC0xMjQzLDE5ICsxMjc3LDE4IEBACiAJCWRzby0+c3ltdGFiX3R5cGUgPSBEU09fQklOQVJZX1RZUEVfX0tBTExTWU1TOwogCiAJaWYgKCFub19rY29yZSAmJiAhZHNvX19sb2FkX2tjb3JlKGRzbywgbWFwLCBmaWxlbmFtZSkpCi0JCXJldHVybiBkc29fX3NwbGl0X2thbGxzeW1zX2Zvcl9rY29yZShkc28sIG1hcCwgZmlsdGVyKTsKKwkJcmV0dXJuIGRzb19fc3BsaXRfa2FsbHN5bXNfZm9yX2tjb3JlKGRzbywgbWFwKTsKIAllbHNlCi0JCXJldHVybiBkc29fX3NwbGl0X2thbGxzeW1zKGRzbywgbWFwLCBkZWx0YSwgZmlsdGVyKTsKKwkJcmV0dXJuIGRzb19fc3BsaXRfa2FsbHN5bXMoZHNvLCBtYXAsIGRlbHRhKTsKIH0KIAogaW50IGRzb19fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpkc28sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkgICAgICAgc3RydWN0IG1hcCAqbWFwLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorCQkgICAgICAgc3RydWN0IG1hcCAqbWFwKQogewotCXJldHVybiBfX2Rzb19fbG9hZF9rYWxsc3ltcyhkc28sIGZpbGVuYW1lLCBtYXAsIGZhbHNlLCBmaWx0ZXIpOworCXJldHVybiBfX2Rzb19fbG9hZF9rYWxsc3ltcyhkc28sIGZpbGVuYW1lLCBtYXAsIGZhbHNlKTsKIH0KIAotc3RhdGljIGludCBkc29fX2xvYWRfcGVyZl9tYXAoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQorc3RhdGljIGludCBkc29fX2xvYWRfcGVyZl9tYXAoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJY2hhciAqbGluZSA9IE5VTEw7CiAJc2l6ZV90IG47CkBAIC0xMjk3LDEyICsxMzMwLDggQEAKIAkJaWYgKHN5bSA9PSBOVUxMKQogCQkJZ290byBvdXRfZGVsZXRlX2xpbmU7CiAKLQkJaWYgKGZpbHRlciAmJiBmaWx0ZXIobWFwLCBzeW0pKQotCQkJc3ltYm9sX19kZWxldGUoc3ltKTsKLQkJZWxzZSB7Ci0JCQlzeW1ib2xzX19pbnNlcnQoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdLCBzeW0pOwotCQkJbnJfc3ltcysrOwotCQl9CisJCXN5bWJvbHNfX2luc2VydCgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0sIHN5bSk7CisJCW5yX3N5bXMrKzsKIAl9CiAKIAlmcmVlKGxpbmUpOwpAQCAtMTM1OCw3ICsxMzg3LDcgQEAKIAl9CiB9CiAKLWludCBkc29fX2xvYWQoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCitpbnQgZHNvX19sb2FkKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwKQogewogCWNoYXIgKm5hbWU7CiAJaW50IHJldCA9IC0xOwpAQCAtMTM4MSw5ICsxNDEwLDkgQEAKIAogCWlmIChkc28tPmtlcm5lbCkgewogCQlpZiAoZHNvLT5rZXJuZWwgPT0gRFNPX1RZUEVfS0VSTkVMKQotCQkJcmV0ID0gZHNvX19sb2FkX2tlcm5lbF9zeW0oZHNvLCBtYXAsIGZpbHRlcik7CisJCQlyZXQgPSBkc29fX2xvYWRfa2VybmVsX3N5bShkc28sIG1hcCk7CiAJCWVsc2UgaWYgKGRzby0+a2VybmVsID09IERTT19UWVBFX0dVRVNUX0tFUk5FTCkKLQkJCXJldCA9IGRzb19fbG9hZF9ndWVzdF9rZXJuZWxfc3ltKGRzbywgbWFwLCBmaWx0ZXIpOworCQkJcmV0ID0gZHNvX19sb2FkX2d1ZXN0X2tlcm5lbF9zeW0oZHNvLCBtYXApOwogCiAJCWdvdG8gb3V0OwogCX0KQEAgLTE0MDcsNyArMTQzNiw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXJldCA9IGRzb19fbG9hZF9wZXJmX21hcChkc28sIG1hcCwgZmlsdGVyKTsKKwkJcmV0ID0gZHNvX19sb2FkX3BlcmZfbWFwKGRzbywgbWFwKTsKIAkJZHNvLT5zeW10YWJfdHlwZSA9IHJldCA+IDAgPyBEU09fQklOQVJZX1RZUEVfX0pBVkFfSklUIDoKIAkJCQkJICAgICBEU09fQklOQVJZX1RZUEVfX05PVF9GT1VORDsKIAkJZ290byBvdXQ7CkBAIC0xNDk4LDE0ICsxNTI3LDE0IEBACiAJCQlrbW9kID0gdHJ1ZTsKIAogCWlmIChzeW1zX3NzKQotCQlyZXQgPSBkc29fX2xvYWRfc3ltKGRzbywgbWFwLCBzeW1zX3NzLCBydW50aW1lX3NzLCBmaWx0ZXIsIGttb2QpOworCQlyZXQgPSBkc29fX2xvYWRfc3ltKGRzbywgbWFwLCBzeW1zX3NzLCBydW50aW1lX3NzLCBrbW9kKTsKIAllbHNlCiAJCXJldCA9IC0xOwogCiAJaWYgKHJldCA+IDApIHsKIAkJaW50IG5yX3BsdDsKIAotCQlucl9wbHQgPSBkc29fX3N5bnRoZXNpemVfcGx0X3N5bWJvbHMoZHNvLCBydW50aW1lX3NzLCBtYXAsIGZpbHRlcik7CisJCW5yX3BsdCA9IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhkc28sIHJ1bnRpbWVfc3MsIG1hcCk7CiAJCWlmIChucl9wbHQgPiAwKQogCQkJcmV0ICs9IG5yX3BsdDsKIAl9CkBAIC0xNTQ0LDggKzE1NzMsNyBAQAogfQogCiBpbnQgZHNvX19sb2FkX3ZtbGludXgoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCSAgICAgIGNvbnN0IGNoYXIgKnZtbGludXgsIGJvb2wgdm1saW51eF9hbGxvY2F0ZWQsCi0JCSAgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIpCisJCSAgICAgIGNvbnN0IGNoYXIgKnZtbGludXgsIGJvb2wgdm1saW51eF9hbGxvY2F0ZWQpCiB7CiAJaW50IGVyciA9IC0xOwogCXN0cnVjdCBzeW1zcmMgc3M7CkBAIC0xNTY1LDcgKzE1OTMsNyBAQAogCWlmIChzeW1zcmNfX2luaXQoJnNzLCBkc28sIHN5bWZzX3ZtbGludXgsIHN5bXRhYl90eXBlKSkKIAkJcmV0dXJuIC0xOwogCi0JZXJyID0gZHNvX19sb2FkX3N5bShkc28sIG1hcCwgJnNzLCAmc3MsIGZpbHRlciwgMCk7CisJZXJyID0gZHNvX19sb2FkX3N5bShkc28sIG1hcCwgJnNzLCAmc3MsIDApOwogCXN5bXNyY19fZGVzdHJveSgmc3MpOwogCiAJaWYgKGVyciA+IDApIHsKQEAgLTE1ODEsOCArMTYwOSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGRzb19fbG9hZF92bWxpbnV4X3BhdGgoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQoraW50IGRzb19fbG9hZF92bWxpbnV4X3BhdGgoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJaW50IGksIGVyciA9IDA7CiAJY2hhciAqZmlsZW5hbWUgPSBOVUxMOwpAQCAtMTU5MSw3ICsxNjE4LDcgQEAKIAkJIHZtbGludXhfcGF0aF9fbnJfZW50cmllcyArIDEpOwogCiAJZm9yIChpID0gMDsgaSA8IHZtbGludXhfcGF0aF9fbnJfZW50cmllczsgKytpKSB7Ci0JCWVyciA9IGRzb19fbG9hZF92bWxpbnV4KGRzbywgbWFwLCB2bWxpbnV4X3BhdGhbaV0sIGZhbHNlLCBmaWx0ZXIpOworCQllcnIgPSBkc29fX2xvYWRfdm1saW51eChkc28sIG1hcCwgdm1saW51eF9wYXRoW2ldLCBmYWxzZSk7CiAJCWlmIChlcnIgPiAwKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtMTU5OSw3ICsxNjI2LDcgQEAKIAlpZiAoIXN5bWJvbF9jb25mLmlnbm9yZV92bWxpbnV4X2J1aWxkaWQpCiAJCWZpbGVuYW1lID0gZHNvX19idWlsZF9pZF9maWxlbmFtZShkc28sIE5VTEwsIDApOwogCWlmIChmaWxlbmFtZSAhPSBOVUxMKSB7Ci0JCWVyciA9IGRzb19fbG9hZF92bWxpbnV4KGRzbywgbWFwLCBmaWxlbmFtZSwgdHJ1ZSwgZmlsdGVyKTsKKwkJZXJyID0gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsIGZpbGVuYW1lLCB0cnVlKTsKIAkJaWYgKGVyciA+IDApCiAJCQlnb3RvIG91dDsKIAkJZnJlZShmaWxlbmFtZSk7CkBAIC0xNzEzLDggKzE3NDAsNyBAQAogCXJldHVybiBzdHJkdXAocGF0aCk7CiB9CiAKLXN0YXRpYyBpbnQgZHNvX19sb2FkX2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0YXRpYyBpbnQgZHNvX19sb2FkX2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJaW50IGVycjsKIAljb25zdCBjaGFyICprYWxsc3ltc19maWxlbmFtZSA9IE5VTEw7CkBAIC0xNzQwLDEyICsxNzY2LDExIEBACiAJfQogCiAJaWYgKCFzeW1ib2xfY29uZi5pZ25vcmVfdm1saW51eCAmJiBzeW1ib2xfY29uZi52bWxpbnV4X25hbWUgIT0gTlVMTCkgewotCQlyZXR1cm4gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsIHN5bWJvbF9jb25mLnZtbGludXhfbmFtZSwKLQkJCQkJIGZhbHNlLCBmaWx0ZXIpOworCQlyZXR1cm4gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsIHN5bWJvbF9jb25mLnZtbGludXhfbmFtZSwgZmFsc2UpOwogCX0KIAogCWlmICghc3ltYm9sX2NvbmYuaWdub3JlX3ZtbGludXggJiYgdm1saW51eF9wYXRoICE9IE5VTEwpIHsKLQkJZXJyID0gZHNvX19sb2FkX3ZtbGludXhfcGF0aChkc28sIG1hcCwgZmlsdGVyKTsKKwkJZXJyID0gZHNvX19sb2FkX3ZtbGludXhfcGF0aChkc28sIG1hcCk7CiAJCWlmIChlcnIgPiAwKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0xNzYxLDcgKzE3ODYsNyBAQAogCWthbGxzeW1zX2ZpbGVuYW1lID0ga2FsbHN5bXNfYWxsb2NhdGVkX2ZpbGVuYW1lOwogCiBkb19rYWxsc3ltczoKLQllcnIgPSBkc29fX2xvYWRfa2FsbHN5bXMoZHNvLCBrYWxsc3ltc19maWxlbmFtZSwgbWFwLCBmaWx0ZXIpOworCWVyciA9IGRzb19fbG9hZF9rYWxsc3ltcyhkc28sIGthbGxzeW1zX2ZpbGVuYW1lLCBtYXApOwogCWlmIChlcnIgPiAwKQogCQlwcl9kZWJ1ZygiVXNpbmcgJXMgZm9yIHN5bWJvbHNcbiIsIGthbGxzeW1zX2ZpbGVuYW1lKTsKIAlmcmVlKGthbGxzeW1zX2FsbG9jYXRlZF9maWxlbmFtZSk7CkBAIC0xNzc2LDggKzE4MDEsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZHNvX19sb2FkX2d1ZXN0X2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCi0JCQkJICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKK3N0YXRpYyBpbnQgZHNvX19sb2FkX2d1ZXN0X2tlcm5lbF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApCiB7CiAJaW50IGVycjsKIAljb25zdCBjaGFyICprYWxsc3ltc19maWxlbmFtZSA9IE5VTEw7CkBAIC0xNzk5LDcgKzE4MjMsNyBAQAogCQlpZiAoc3ltYm9sX2NvbmYuZGVmYXVsdF9ndWVzdF92bWxpbnV4X25hbWUgIT0gTlVMTCkgewogCQkJZXJyID0gZHNvX19sb2FkX3ZtbGludXgoZHNvLCBtYXAsCiAJCQkJCQlzeW1ib2xfY29uZi5kZWZhdWx0X2d1ZXN0X3ZtbGludXhfbmFtZSwKLQkJCQkJCWZhbHNlLCBmaWx0ZXIpOworCQkJCQkJZmFsc2UpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCkBAIC0xODExLDcgKzE4MzUsNyBAQAogCQlrYWxsc3ltc19maWxlbmFtZSA9IHBhdGg7CiAJfQogCi0JZXJyID0gZHNvX19sb2FkX2thbGxzeW1zKGRzbywga2FsbHN5bXNfZmlsZW5hbWUsIG1hcCwgZmlsdGVyKTsKKwllcnIgPSBkc29fX2xvYWRfa2FsbHN5bXMoZHNvLCBrYWxsc3ltc19maWxlbmFtZSwgbWFwKTsKIAlpZiAoZXJyID4gMCkKIAkJcHJfZGVidWcoIlVzaW5nICVzIGZvciBzeW1ib2xzXG4iLCBrYWxsc3ltc19maWxlbmFtZSk7CiAJaWYgKGVyciA+IDAgJiYgIWRzb19faXNfa2NvcmUoZHNvKSkgewpAQCAtMTk0OCw2ICsxOTcyLDIzIEBACiAJcmV0dXJuIHZhbHVlOwogfQogCitpbnQgc3ltYm9sX19hbm5vdGF0aW9uX2luaXQodm9pZCkKK3sKKwlpZiAoc3ltYm9sX2NvbmYuaW5pdGlhbGl6ZWQpIHsKKwkJcHJfZXJyKCJBbm5vdGF0aW9uIG5lZWRzIHRvIGJlIGluaXQgYmVmb3JlIHN5bWJvbF9faW5pdCgpXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzeW1ib2xfY29uZi5pbml0X2Fubm90YXRpb24pIHsKKwkJcHJfd2FybmluZygiQW5ub3RhdGlvbiBiZWluZyBpbml0aWFsaXplZCBtdWx0aXBsZSB0aW1lc1xuIik7CisJCXJldHVybiAwOworCX0KKworCXN5bWJvbF9jb25mLnByaXZfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGFubm90YXRpb24pOworCXN5bWJvbF9jb25mLmluaXRfYW5ub3RhdGlvbiA9IHRydWU7CisJcmV0dXJuIDA7Cit9CisKIGludCBzeW1ib2xfX2luaXQoc3RydWN0IHBlcmZfZW52ICplbnYpCiB7CiAJY29uc3QgY2hhciAqc3ltZnM7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmggYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKaW5kZXggNjk5ZjdjYi4uZDk2NDg0NCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaApAQCAtNTcsNyArNTcsNyBAQAogCXU2NAkJZW5kOwogCXUxNgkJbmFtZWxlbjsKIAl1OAkJYmluZGluZzsKLQlib29sCQlpZ25vcmU7CisJdTgJCWlkbGU6MTsKIAl1OAkJYXJjaF9zeW07CiAJY2hhcgkJbmFtZVswXTsKIH07CkBAIC04OCw2ICs4OCw3IEBACiAJdW5zaWduZWQgc2hvcnQJcHJpdl9zaXplOwogCXVuc2lnbmVkIHNob3J0CW5yX2V2ZW50czsKIAlib29sCQl0cnlfdm1saW51eF9wYXRoLAorCQkJaW5pdF9hbm5vdGF0aW9uLAogCQkJZm9yY2UsCiAJCQlpZ25vcmVfdm1saW51eCwKIAkJCWlnbm9yZV92bWxpbnV4X2J1aWxkaWQsCkBAIC0yNDAsMTYgKzI0MSwxMyBAQAogYm9vbCBzeW1zcmNfX2hhc19zeW10YWIoc3RydWN0IHN5bXNyYyAqc3MpOwogYm9vbCBzeW1zcmNfX3Bvc3NpYmx5X3J1bnRpbWUoc3RydWN0IHN5bXNyYyAqc3MpOwogCi1pbnQgZHNvX19sb2FkKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKK2ludCBkc29fX2xvYWQoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApOwogaW50IGRzb19fbG9hZF92bWxpbnV4KHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkgICAgICBjb25zdCBjaGFyICp2bWxpbnV4LCBib29sIHZtbGludXhfYWxsb2NhdGVkLAotCQkgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKLWludCBkc29fX2xvYWRfdm1saW51eF9wYXRoKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAotCQkJICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CisJCSAgICAgIGNvbnN0IGNoYXIgKnZtbGludXgsIGJvb2wgdm1saW51eF9hbGxvY2F0ZWQpOworaW50IGRzb19fbG9hZF92bWxpbnV4X3BhdGgoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXApOwogaW50IF9fZHNvX19sb2FkX2thbGxzeW1zKHN0cnVjdCBkc28gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBtYXAgKm1hcCwKLQkJCSBib29sIG5vX2tjb3JlLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKTsKLWludCBkc29fX2xvYWRfa2FsbHN5bXMoc3RydWN0IGRzbyAqZHNvLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgc3RydWN0IG1hcCAqbWFwLAotCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CisJCQkgYm9vbCBub19rY29yZSk7CitpbnQgZHNvX19sb2FkX2thbGxzeW1zKHN0cnVjdCBkc28gKmRzbywgY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBtYXAgKm1hcCk7CiAKIHZvaWQgZHNvX19pbnNlcnRfc3ltYm9sKHN0cnVjdCBkc28gKmRzbywgZW51bSBtYXBfdHlwZSB0eXBlLAogCQkJc3RydWN0IHN5bWJvbCAqc3ltKTsKQEAgLTI2MSw2ICsyNTksNyBAQAogc3RydWN0IHN5bWJvbCAqc3ltYm9sX19uZXh0X2J5X25hbWUoc3RydWN0IHN5bWJvbCAqc3ltKTsKIAogc3RydWN0IHN5bWJvbCAqZHNvX19maXJzdF9zeW1ib2woc3RydWN0IGRzbyAqZHNvLCBlbnVtIG1hcF90eXBlIHR5cGUpOworc3RydWN0IHN5bWJvbCAqZHNvX19sYXN0X3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIGVudW0gbWFwX3R5cGUgdHlwZSk7CiBzdHJ1Y3Qgc3ltYm9sICpkc29fX25leHRfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSk7CiAKIGVudW0gZHNvX3R5cGUgZHNvX190eXBlX2ZkKGludCBmZCk7CkBAIC0yNzcsNiArMjc2LDggQEAKIGludCBzeW1ib2xfX2luaXQoc3RydWN0IHBlcmZfZW52ICplbnYpOwogdm9pZCBzeW1ib2xfX2V4aXQodm9pZCk7CiB2b2lkIHN5bWJvbF9fZWxmX2luaXQodm9pZCk7CitpbnQgc3ltYm9sX19hbm5vdGF0aW9uX2luaXQodm9pZCk7CisKIHN0cnVjdCBzeW1ib2wgKnN5bWJvbF9fbmV3KHU2NCBzdGFydCwgdTY0IGxlbiwgdTggYmluZGluZywgY29uc3QgY2hhciAqbmFtZSk7CiBzaXplX3QgX19zeW1ib2xfX2ZwcmludGZfc3ltbmFtZV9vZmZzKGNvbnN0IHN0cnVjdCBzeW1ib2wgKnN5bSwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCkBAIC0yOTEsMTYgKzI5MiwxNSBAQAogYm9vbCBzeW1ib2xfdHlwZV9faXNfYShjaGFyIHN5bWJvbF90eXBlLCBlbnVtIG1hcF90eXBlIG1hcF90eXBlKTsKIGJvb2wgc3ltYm9sX19yZXN0cmljdGVkX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogCQkJCSBjb25zdCBjaGFyICpyZXN0cmljdGVkX2ZpbGVuYW1lKTsKLWJvb2wgc3ltYm9sX19pc19pZGxlKHN0cnVjdCBzeW1ib2wgKnN5bSk7CiBpbnQgc3ltYm9sX19jb25maWdfc3ltZnMoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0IF9fbWF5YmVfdW51c2VkLAogCQkJIGNvbnN0IGNoYXIgKmRpciwgaW50IHVuc2V0IF9fbWF5YmVfdW51c2VkKTsKIAogaW50IGRzb19fbG9hZF9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsIHN0cnVjdCBzeW1zcmMgKnN5bXNfc3MsCi0JCSAgc3RydWN0IHN5bXNyYyAqcnVudGltZV9zcywgc3ltYm9sX2ZpbHRlcl90IGZpbHRlciwKLQkJICBpbnQga21vZHVsZSk7CisJCSAgc3RydWN0IHN5bXNyYyAqcnVudGltZV9zcywgaW50IGttb2R1bGUpOwogaW50IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBzeW1zcmMgKnNzLAotCQkJCXN0cnVjdCBtYXAgKm1hcCwgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CisJCQkJc3RydWN0IG1hcCAqbWFwKTsKIAordm9pZCBfX3N5bWJvbHNfX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scywgc3RydWN0IHN5bWJvbCAqc3ltLCBib29sIGtlcm5lbCk7CiB2b2lkIHN5bWJvbHNfX2luc2VydChzdHJ1Y3QgcmJfcm9vdCAqc3ltYm9scywgc3RydWN0IHN5bWJvbCAqc3ltKTsKIHZvaWQgc3ltYm9sc19fZml4dXBfZHVwbGljYXRlKHN0cnVjdCByYl9yb290ICpzeW1ib2xzKTsKIHZvaWQgc3ltYm9sc19fZml4dXBfZW5kKHN0cnVjdCByYl9yb290ICpzeW1ib2xzKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmMgYi90b29scy9wZXJmL3V0aWwvdXRpbC5jCmluZGV4IGNlZTU1OWQuLjg1YzU2ODAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3V0aWwuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWU2NC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgImNhbGxjaGFpbi5oIgogI2luY2x1ZGUgInN0cmxpc3QuaCIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmggYi90b29scy9wZXJmL3V0aWwvdXRpbC5oCmluZGV4IGU1ZjU1NDcuLjQzODk5ZTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3V0aWwuaApAQCAtMTc5LDEwICsxNzksNiBAQAogI3VuZGVmIHRvbG93ZXIKICN1bmRlZiB0b3VwcGVyCiAKLSNpZm5kZWYgTlNFQ19QRVJfTVNFQwotI2RlZmluZSBOU0VDX1BFUl9NU0VDCTEwMDAwMDBMCi0jZW5kaWYKLQogaW50IHBhcnNlX25zZWNfdGltZShjb25zdCBjaGFyICpzdHIsIHU2NCAqcHRpbWUpOwogCiBleHRlcm4gdW5zaWduZWQgY2hhciBzYW5lX2N0eXBlWzI1Nl07CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9hY3BpL2NvbW1vbi9jbWZzaXplLmMgYi90b29scy9wb3dlci9hY3BpL2NvbW1vbi9jbWZzaXplLmMKaW5kZXggZTczYTc5Zi4uYmM4MjU5NiAxMDA2NDQKLS0tIGEvdG9vbHMvcG93ZXIvYWNwaS9jb21tb24vY21mc2l6ZS5jCisrKyBiL3Rvb2xzL3Bvd2VyL2FjcGkvY29tbW9uL2NtZnNpemUuYwpAQCAtNDQsNyArNDQsNiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWNhcHBzLmgiCi0jaW5jbHVkZSA8c3RkaW8uaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVE9PTFMKIEFDUElfTU9EVUxFX05BTUUoImNtZnNpemUiKQpAQCAtNjksMjQgKzY4LDI0IEBACiAKIAkvKiBTYXZlIHRoZSBjdXJyZW50IGZpbGUgcG9pbnRlciwgc2VlayB0byBFT0YgdG8gb2J0YWluIGZpbGUgc2l6ZSAqLwogCi0JY3VycmVudF9vZmZzZXQgPSBhY3BpX29zX2dldF9maWxlX29mZnNldChmaWxlKTsKKwljdXJyZW50X29mZnNldCA9IGZ0ZWxsKGZpbGUpOwogCWlmIChjdXJyZW50X29mZnNldCA8IDApIHsKIAkJZ290byBvZmZzZXRfZXJyb3I7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9vc19zZXRfZmlsZV9vZmZzZXQoZmlsZSwgMCwgQUNQSV9GSUxFX0VORCk7CisJc3RhdHVzID0gZnNlZWsoZmlsZSwgMCwgU0VFS19FTkQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIHNlZWtfZXJyb3I7CiAJfQogCi0JZmlsZV9zaXplID0gYWNwaV9vc19nZXRfZmlsZV9vZmZzZXQoZmlsZSk7CisJZmlsZV9zaXplID0gZnRlbGwoZmlsZSk7CiAJaWYgKGZpbGVfc2l6ZSA8IDApIHsKIAkJZ290byBvZmZzZXRfZXJyb3I7CiAJfQogCiAJLyogUmVzdG9yZSBvcmlnaW5hbCBmaWxlIHBvaW50ZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfb3Nfc2V0X2ZpbGVfb2Zmc2V0KGZpbGUsIGN1cnJlbnRfb2Zmc2V0LCBBQ1BJX0ZJTEVfQkVHSU4pOworCXN0YXR1cyA9IGZzZWVrKGZpbGUsIGN1cnJlbnRfb2Zmc2V0LCBTRUVLX1NFVCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCWdvdG8gc2Vla19lcnJvcjsKIAl9CkBAIC05NCwxMCArOTMsMTAgQEAKIAlyZXR1cm4gKCh1MzIpZmlsZV9zaXplKTsKIAogb2Zmc2V0X2Vycm9yOgotCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3QgZ2V0IGZpbGUgb2Zmc2V0Iik7CisJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IGZpbGUgb2Zmc2V0XG4iKTsKIAlyZXR1cm4gKEFDUElfVUlOVDMyX01BWCk7CiAKIHNlZWtfZXJyb3I6Ci0JYWNwaV9sb2dfZXJyb3IoIkNvdWxkIG5vdCBzZXQgZmlsZSBvZmZzZXQiKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBzZXQgZmlsZSBvZmZzZXRcbiIpOwogCXJldHVybiAoQUNQSV9VSU5UMzJfTUFYKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvY29tbW9uL2dldG9wdC5jIGIvdG9vbHMvcG93ZXIvYWNwaS9jb21tb24vZ2V0b3B0LmMKaW5kZXggMGJkMzQzZi4uMzkxOTk3MCAxMDA2NDQKLS0tIGEvdG9vbHMvcG93ZXIvYWNwaS9jb21tb24vZ2V0b3B0LmMKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS9jb21tb24vZ2V0b3B0LmMKQEAgLTU3LDcgKzU3LDcgQEAKICNpbmNsdWRlICJhY2FwcHMuaCIKIAogI2RlZmluZSBBQ1BJX09QVElPTl9FUlJPUihtc2csIGJhZGNoYXIpIFwKLQlpZiAoYWNwaV9nYmxfb3B0ZXJyKSB7YWNwaV9sb2dfZXJyb3IgKCIlcyVjXG4iLCBtc2csIGJhZGNoYXIpO30KKwlpZiAoYWNwaV9nYmxfb3B0ZXJyKSB7ZnByaW50ZiAoc3RkZXJyLCAiJXMlY1xuIiwgbXNnLCBiYWRjaGFyKTt9CiAKIGludCBhY3BpX2dibF9vcHRlcnIgPSAxOwogaW50IGFjcGlfZ2JsX29wdGluZCA9IDE7CkBAIC05NCw3ICs5NCw3IEBACiAJCWFjcGlfZ2JsX29wdGFyZyA9CiAJCSAgICAmYXJndlthY3BpX2dibF9vcHRpbmQrK11bKGludCkoY3VycmVudF9jaGFyX3B0ciArIDEpXTsKIAl9IGVsc2UgaWYgKCsrYWNwaV9nYmxfb3B0aW5kID49IGFyZ2MpIHsKLQkJQUNQSV9PUFRJT05fRVJST1IoIk9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudDogLSIsICd2Jyk7CisJCUFDUElfT1BUSU9OX0VSUk9SKCJcbk9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIsIDApOwogCiAJCWN1cnJlbnRfY2hhcl9wdHIgPSAxOwogCQlyZXR1cm4gKC0xKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvb3Nfc3BlY2lmaWMvc2VydmljZV9sYXllcnMvb3NsaWJjZnMuYyBiL3Rvb2xzL3Bvd2VyL2FjcGkvb3Nfc3BlY2lmaWMvc2VydmljZV9sYXllcnMvb3NsaWJjZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFmNGFiYS4uMDAwMDAwMAotLS0gYS90b29scy9wb3dlci9hY3BpL29zX3NwZWNpZmljL3NlcnZpY2VfbGF5ZXJzL29zbGliY2ZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIE1vZHVsZSBOYW1lOiBvc2xpYmNmcyAtIEMgbGlicmFyeSBPU0wgZm9yIGZpbGUgSS9PCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29weXJpZ2h0IChDKSAyMDAwIC0gMjAxNiwgSW50ZWwgQ29ycC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKLSAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIGF0IG1pbmltdW0gYSBkaXNjbGFpbWVyCi0gKiAgICBzdWJzdGFudGlhbGx5IHNpbWlsYXIgdG8gdGhlICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdwotICogICAgKCJEaXNjbGFpbWVyIikgYW5kIGFueSByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24KLSAqICAgIGluY2x1ZGluZyBhIHN1YnN0YW50aWFsbHkgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBmdXJ0aGVyCi0gKiAgICBiaW5hcnkgcmVkaXN0cmlidXRpb24uCi0gKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMKLSAqICAgIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTk8gV0FSUkFOVFkKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAotICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKLSAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQotICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HCi0gKiBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLSAqLwotCi0jaW5jbHVkZSA8YWNwaS9hY3BpLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfT1NfU0VSVklDRVMKLUFDUElfTU9EVUxFX05BTUUoIm9zbGliY2ZzIikKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9vc19vcGVuX2ZpbGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgcGF0aCAgICAgICAgICAgICAgICAtIEZpbGUgcGF0aAotICogICAgICAgICAgICAgIG1vZGVzICAgICAgICAgICAgICAgLSBGaWxlIG9wZXJhdGlvbiB0eXBlCi0gKgotICogUkVUVVJOOiAgICAgIEZpbGUgZGVzY3JpcHRvci4KLSAqCi0gKiBERVNDUklQVElPTjogT3BlbiBhIGZpbGUgZm9yIHJlYWRpbmcgKEFDUElfRklMRV9SRUFESU5HKSBvci9hbmQgd3JpdGluZwotICogICAgICAgICAgICAgIChBQ1BJX0ZJTEVfV1JJVElORykuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUFDUElfRklMRSBhY3BpX29zX29wZW5fZmlsZShjb25zdCBjaGFyICpwYXRoLCB1OCBtb2RlcykKLXsKLQlBQ1BJX0ZJTEUgZmlsZTsKLQl1MzIgaSA9IDA7Ci0JY2hhciBtb2Rlc19zdHJbNF07Ci0KLQlpZiAobW9kZXMgJiBBQ1BJX0ZJTEVfUkVBRElORykgewotCQltb2Rlc19zdHJbaSsrXSA9ICdyJzsKLQl9Ci0JaWYgKG1vZGVzICYgQUNQSV9GSUxFX1dSSVRJTkcpIHsKLQkJbW9kZXNfc3RyW2krK10gPSAndyc7Ci0JfQotCi0JaWYgKG1vZGVzICYgQUNQSV9GSUxFX0JJTkFSWSkgewotCQltb2Rlc19zdHJbaSsrXSA9ICdiJzsKLQl9Ci0KLQltb2Rlc19zdHJbaSsrXSA9ICdcMCc7Ci0KLQlmaWxlID0gZm9wZW4ocGF0aCwgbW9kZXNfc3RyKTsKLQlpZiAoIWZpbGUpIHsKLQkJcGVycm9yKCJDb3VsZCBub3Qgb3BlbiBmaWxlIik7Ci0JfQotCi0JcmV0dXJuIChmaWxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9vc19jbG9zZV9maWxlCi0gKgotICogUEFSQU1FVEVSUzogIGZpbGUgICAgICAgICAgICAgICAgLSBBbiBvcGVuIGZpbGUgZGVzY3JpcHRvcgotICoKLSAqIFJFVFVSTjogICAgICBOb25lLgotICoKLSAqIERFU0NSSVBUSU9OOiBDbG9zZSBhIGZpbGUgb3BlbmVkIHZpYSBhY3BpX29zX29wZW5fZmlsZS4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIGFjcGlfb3NfY2xvc2VfZmlsZShBQ1BJX0ZJTEUgZmlsZSkKLXsKLQotCWZjbG9zZShmaWxlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9vc19yZWFkX2ZpbGUKLSAqCi0gKiBQQVJBTUVURVJTOiAgZmlsZSAgICAgICAgICAgICAgICAtIEFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yCi0gKiAgICAgICAgICAgICAgYnVmZmVyICAgICAgICAgICAgICAtIERhdGEgYnVmZmVyCi0gKiAgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgICAgICAtIERhdGEgYmxvY2sgc2l6ZQotICogICAgICAgICAgICAgIGNvdW50ICAgICAgICAgICAgICAgLSBOdW1iZXIgb2YgZGF0YSBibG9ja3MKLSAqCi0gKiBSRVRVUk46ICAgICAgTnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCi0gKgotICogREVTQ1JJUFRJT046IFJlYWQgZnJvbSBhIGZpbGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50Ci1hY3BpX29zX3JlYWRfZmlsZShBQ1BJX0ZJTEUgZmlsZSwgdm9pZCAqYnVmZmVyLCBhY3BpX3NpemUgc2l6ZSwgYWNwaV9zaXplIGNvdW50KQotewotCWludCBsZW5ndGg7Ci0KLQlsZW5ndGggPSBmcmVhZChidWZmZXIsIHNpemUsIGNvdW50LCBmaWxlKTsKLQlpZiAobGVuZ3RoIDwgMCkgewotCQlwZXJyb3IoIkVycm9yIHJlYWRpbmcgZmlsZSIpOwotCX0KLQotCXJldHVybiAobGVuZ3RoKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9vc193cml0ZV9maWxlCi0gKgotICogUEFSQU1FVEVSUzogIGZpbGUgICAgICAgICAgICAgICAgLSBBbiBvcGVuIGZpbGUgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgLSBEYXRhIGJ1ZmZlcgotICogICAgICAgICAgICAgIHNpemUgICAgICAgICAgICAgICAgLSBEYXRhIGJsb2NrIHNpemUKLSAqICAgICAgICAgICAgICBjb3VudCAgICAgICAgICAgICAgIC0gTnVtYmVyIG9mIGRhdGEgYmxvY2tzCi0gKgotICogUkVUVVJOOiAgICAgIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSB3cml0dGVuLgotICoKLSAqIERFU0NSSVBUSU9OOiBXcml0ZSB0byBhIGZpbGUuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW50Ci1hY3BpX29zX3dyaXRlX2ZpbGUoQUNQSV9GSUxFIGZpbGUsCi0JCSAgIHZvaWQgKmJ1ZmZlciwgYWNwaV9zaXplIHNpemUsIGFjcGlfc2l6ZSBjb3VudCkKLXsKLQlpbnQgbGVuZ3RoOwotCi0JbGVuZ3RoID0gZndyaXRlKGJ1ZmZlciwgc2l6ZSwgY291bnQsIGZpbGUpOwotCWlmIChsZW5ndGggPCAwKSB7Ci0JCXBlcnJvcigiRXJyb3Igd3JpdGluZyBmaWxlIik7Ci0JfQotCi0JcmV0dXJuIChsZW5ndGgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX29zX2dldF9maWxlX29mZnNldAotICoKLSAqIFBBUkFNRVRFUlM6ICBmaWxlICAgICAgICAgICAgICAgIC0gQW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IKLSAqCi0gKiBSRVRVUk46ICAgICAgQ3VycmVudCBmaWxlIHBvaW50ZXIgcG9zaXRpb24uCi0gKgotICogREVTQ1JJUFRJT046IEdldCBjdXJyZW50IGZpbGUgb2Zmc2V0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWxvbmcgYWNwaV9vc19nZXRfZmlsZV9vZmZzZXQoQUNQSV9GSUxFIGZpbGUpCi17Ci0JbG9uZyBvZmZzZXQ7Ci0KLQlvZmZzZXQgPSBmdGVsbChmaWxlKTsKLQlyZXR1cm4gKG9mZnNldCk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfb3Nfc2V0X2ZpbGVfb2Zmc2V0Ci0gKgotICogUEFSQU1FVEVSUzogIGZpbGUgICAgICAgICAgICAgICAgLSBBbiBvcGVuIGZpbGUgZGVzY3JpcHRvcgotICogICAgICAgICAgICAgIG9mZnNldCAgICAgICAgICAgICAgLSBOZXcgZmlsZSBvZmZzZXQKLSAqICAgICAgICAgICAgICBmcm9tICAgICAgICAgICAgICAgIC0gRnJvbSBiZWdpbi9lbmQgb2YgZmlsZQotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogU2V0IGN1cnJlbnQgZmlsZSBvZmZzZXQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMgYWNwaV9vc19zZXRfZmlsZV9vZmZzZXQoQUNQSV9GSUxFIGZpbGUsIGxvbmcgb2Zmc2V0LCB1OCBmcm9tKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKGZyb20gPT0gQUNQSV9GSUxFX0JFR0lOKSB7Ci0JCXJldCA9IGZzZWVrKGZpbGUsIG9mZnNldCwgU0VFS19TRVQpOwotCX0KLQotCWlmIChmcm9tID09IEFDUElfRklMRV9FTkQpIHsKLQkJcmV0ID0gZnNlZWsoZmlsZSwgb2Zmc2V0LCBTRUVLX0VORCk7Ci0JfQotCi0JaWYgKHJldCA8IDApIHsKLQkJcmV0dXJuIChBRV9FUlJPUik7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIChBRV9PSyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvYWNwaS9vc19zcGVjaWZpYy9zZXJ2aWNlX2xheWVycy9vc3VuaXh4Zi5jIGIvdG9vbHMvcG93ZXIvYWNwaS9vc19zcGVjaWZpYy9zZXJ2aWNlX2xheWVycy9vc3VuaXh4Zi5jCmluZGV4IDg4YWE2NmUuLjhkODAwM2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL2FjcGkvb3Nfc3BlY2lmaWMvc2VydmljZV9sYXllcnMvb3N1bml4eGYuYworKysgYi90b29scy9wb3dlci9hY3BpL29zX3NwZWNpZmljL3NlcnZpY2VfbGF5ZXJzL29zdW5peHhmLmMKQEAgLTYzLDEwICs2Myw3IEBACiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9PU19TRVJWSUNFUwogQUNQSV9NT0RVTEVfTkFNRSgib3N1bml4eGYiKQogCi11OCBhY3BpX2dibF9kZWJ1Z190aW1lb3V0ID0gRkFMU0U7Ci0KIC8qIFVwY2FsbHMgdG8gYWNwaV9leGVjICovCi0KIHZvaWQKIGFlX3RhYmxlX292ZXJyaWRlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqZXhpc3RpbmdfdGFibGUsCiAJCSAgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqbmV3X3RhYmxlKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvTWFrZWZpbGUgYi90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL01ha2VmaWxlCmluZGV4IDI5NDJjZGMuLjA0YjVkYjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvTWFrZWZpbGUKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9NYWtlZmlsZQpAQCAtMzYsMTIgKzM2LDEzIEBACiAJdXRkZWJ1Zy5vXAogCXV0ZXhjZXAub1wKIAl1dGdsb2JhbC5vXAorCXV0aGV4Lm9cCiAJdXRtYXRoLm9cCiAJdXRub25hbnNpLm9cCiAJdXRwcmludC5vXAogCXV0c3RyaW5nLm9cCisJdXRzdHJ0b3VsNjQub1wKIAl1dHhmZXJyb3Iub1wKLQlvc2xpYmNmcy5vXAogCW9zbGludXh0Ymwub1wKIAljbWZzaXplLm9cCiAJZ2V0b3B0Lm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYWNwaWR1bXAuaCBiL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYWNwaWR1bXAuaAppbmRleCAwMjVjMjMyLi4wMDQyM2ZjIDEwMDY0NAotLS0gYS90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FjcGlkdW1wLmgKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hY3BpZHVtcC5oCkBAIC01NSwxMSArNTUsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgImFjY29tbW9uLmgiCiAjaW5jbHVkZSAiYWN0YWJsZXMuaCIKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAiYWNhcHBzLmgiCiAKIC8qIEdsb2JhbHMgKi8KIApAQCAtNzIsMTIgKzY4LDYgQEAKIEVYVEVSTiBjaGFyIElOSVRfR0xPQkFMKCpnYmxfb3V0cHV0X2ZpbGVuYW1lLCBOVUxMKTsKIEVYVEVSTiB1NjQgSU5JVF9HTE9CQUwoZ2JsX3JzZHBfYmFzZSwgMCk7CiAKLS8qIEdsb2JhbHMgcmVxdWlyZWQgZm9yIHVzZSB3aXRoIEFDUElDQSBtb2R1bGVzICovCi0KLSNpZmRlZiBfREVDTEFSRV9HTE9CQUxTCi11OCBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGggPSA4OwotI2VuZGlmCi0KIC8qIEFjdGlvbiB0YWJsZSB1c2VkIHRvIGRlZmVyIHJlcXVlc3RlZCBvcHRpb25zICovCiAKIHN0cnVjdCBhcF9kdW1wX2FjdGlvbiB7CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FwZHVtcC5jIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcGR1bXAuYwppbmRleCBmYjhmMWQ5Li45MDMxYmUxIDEwMDY0NAotLS0gYS90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FwZHVtcC5jCisrKyBiL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYXBkdW1wLmMKQEAgLTY5LDE2ICs2OSwxNyBAQAogCQkvKiBNYWtlIHN1cmUgc2lnbmF0dXJlIGlzIGFsbCBBU0NJSSBhbmQgYSB2YWxpZCBBQ1BJIG5hbWUgKi8KIAogCQlpZiAoIWFjcGlfdXRfdmFsaWRfbmFtZXNlZyh0YWJsZS0+c2lnbmF0dXJlKSkgewotCQkJYWNwaV9sb2dfZXJyb3IoIlRhYmxlIHNpZ25hdHVyZSAoMHglOC44WCkgaXMgaW52YWxpZFxuIiwKLQkJCQkgICAgICAgKih1MzIgKil0YWJsZS0+c2lnbmF0dXJlKTsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJUYWJsZSBzaWduYXR1cmUgKDB4JTguOFgpIGlzIGludmFsaWRcbiIsCisJCQkJKih1MzIgKil0YWJsZS0+c2lnbmF0dXJlKTsKIAkJCXJldHVybiAoRkFMU0UpOwogCQl9CiAKIAkJLyogQ2hlY2sgZm9yIG1pbmltdW0gdGFibGUgbGVuZ3RoICovCiAKIAkJaWYgKHRhYmxlLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgewotCQkJYWNwaV9sb2dfZXJyb3IoIlRhYmxlIGxlbmd0aCAoMHglOC44WCkgaXMgaW52YWxpZFxuIiwKLQkJCQkgICAgICAgdGFibGUtPmxlbmd0aCk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlRhYmxlIGxlbmd0aCAoMHglOC44WCkgaXMgaW52YWxpZFxuIiwKKwkJCQl0YWJsZS0+bGVuZ3RoKTsKIAkJCXJldHVybiAoRkFMU0UpOwogCQl9CiAJfQpAQCAtMTE1LDggKzExNiw4IEBACiAJfQogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCIlNC40czogV2FybmluZzogd3JvbmcgY2hlY2tzdW0gaW4gdGFibGVcbiIsCi0JCQkgICAgICAgdGFibGUtPnNpZ25hdHVyZSk7CisJCWZwcmludGYoc3RkZXJyLCAiJTQuNHM6IFdhcm5pbmc6IHdyb25nIGNoZWNrc3VtIGluIHRhYmxlXG4iLAorCQkJdGFibGUtPnNpZ25hdHVyZSk7CiAJfQogCiAJcmV0dXJuIChBRV9PSyk7CkBAIC0xOTUsMTMgKzE5NiwxMyBAQAogCSAqIE5vdGU6IHNpbXBsZXN0IHRvIGp1c3QgYWx3YXlzIGVtaXQgYSA2NC1iaXQgYWRkcmVzcy4gYWNwaV94dHJhY3QKIAkgKiB1dGlsaXR5IGNhbiBoYW5kbGUgdGhpcy4KIAkgKi8KLQlhY3BpX3V0X2ZpbGVfcHJpbnRmKGdibF9vdXRwdXRfZmlsZSwgIiU0LjRzIEAgMHglOC44WCU4LjhYXG4iLAotCQkJICAgIHRhYmxlLT5zaWduYXR1cmUsIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSk7CisJZnByaW50ZihnYmxfb3V0cHV0X2ZpbGUsICIlNC40cyBAIDB4JTguOFglOC44WFxuIiwKKwkJdGFibGUtPnNpZ25hdHVyZSwgQUNQSV9GT1JNQVRfVUlOVDY0KGFkZHJlc3MpKTsKIAogCWFjcGlfdXRfZHVtcF9idWZmZXJfdG9fZmlsZShnYmxfb3V0cHV0X2ZpbGUsCiAJCQkJICAgIEFDUElfQ0FTVF9QVFIodTgsIHRhYmxlKSwgdGFibGVfbGVuZ3RoLAogCQkJCSAgICBEQl9CWVRFX0RJU1BMQVksIDApOwotCWFjcGlfdXRfZmlsZV9wcmludGYoZ2JsX291dHB1dF9maWxlLCAiXG4iKTsKKwlmcHJpbnRmKGdibF9vdXRwdXRfZmlsZSwgIlxuIik7CiAJcmV0dXJuICgwKTsKIH0KIApAQCAtMjM5LDE0ICsyNDAsMTQgQEAKIAkJCWlmIChzdGF0dXMgPT0gQUVfTElNSVQpIHsKIAkJCQlyZXR1cm4gKDApOwogCQkJfSBlbHNlIGlmIChpID09IDApIHsKLQkJCQlhY3BpX2xvZ19lcnJvcgotCQkJCSAgICAoIkNvdWxkIG5vdCBnZXQgQUNQSSB0YWJsZXMsICVzXG4iLAotCQkJCSAgICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiQ291bGQgbm90IGdldCBBQ1BJIHRhYmxlcywgJXNcbiIsCisJCQkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKTsKIAkJCQlyZXR1cm4gKC0xKTsKIAkJCX0gZWxzZSB7Ci0JCQkJYWNwaV9sb2dfZXJyb3IKLQkJCQkgICAgKCJDb3VsZCBub3QgZ2V0IEFDUEkgdGFibGUgYXQgaW5kZXggJXUsICVzXG4iLAotCQkJCSAgICAgaSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiQ291bGQgbm90IGdldCBBQ1BJIHRhYmxlIGF0IGluZGV4ICV1LCAlc1xuIiwKKwkJCQkJaSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CkBAIC0yODYsMjAgKzI4NywyMCBAQAogCiAJLyogQ29udmVydCBhcmd1bWVudCB0byBhbiBpbnRlZ2VyIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfc3RydG91bDY0KGFzY2lpX2FkZHJlc3MsIEFDUElfQU5ZX0JBU0UsCi0JCQkJICAgQUNQSV9NQVg2NF9CWVRFX1dJRFRILCAmbG9uZ19hZGRyZXNzKTsKKwlzdGF0dXMgPSBhY3BpX3V0X3N0cnRvdWw2NChhc2NpaV9hZGRyZXNzLCBBQ1BJX1NUUlRPVUxfNjRCSVQsCisJCQkJICAgJmxvbmdfYWRkcmVzcyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCIlczogQ291bGQgbm90IGNvbnZlcnQgdG8gYSBwaHlzaWNhbCBhZGRyZXNzXG4iLAotCQkJICAgICAgIGFzY2lpX2FkZHJlc3MpOworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBDb3VsZCBub3QgY29udmVydCB0byBhIHBoeXNpY2FsIGFkZHJlc3NcbiIsCisJCQlhc2NpaV9hZGRyZXNzKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCiAJYWRkcmVzcyA9IChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpbG9uZ19hZGRyZXNzOwogCXN0YXR1cyA9IGFjcGlfb3NfZ2V0X3RhYmxlX2J5X2FkZHJlc3MoYWRkcmVzcywgJnRhYmxlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJYWNwaV9sb2dfZXJyb3IoIkNvdWxkIG5vdCBnZXQgdGFibGUgYXQgMHglOC44WCU4LjhYLCAlc1xuIiwKLQkJCSAgICAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcyksCi0JCQkgICAgICAgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBnZXQgdGFibGUgYXQgMHglOC44WCU4LjhYLCAlc1xuIiwKKwkJCUFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSwKKwkJCWFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCkBAIC0zMzEsOSArMzMyLDkgQEAKIAlpbnQgdGFibGVfc3RhdHVzOwogCiAJaWYgKHN0cmxlbihzaWduYXR1cmUpICE9IEFDUElfTkFNRV9TSVpFKSB7Ci0JCWFjcGlfbG9nX2Vycm9yCi0JCSAgICAoIkludmFsaWQgdGFibGUgc2lnbmF0dXJlIFslc106IG11c3QgYmUgZXhhY3RseSA0IGNoYXJhY3RlcnNcbiIsCi0JCSAgICAgc2lnbmF0dXJlKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiSW52YWxpZCB0YWJsZSBzaWduYXR1cmUgWyVzXTogbXVzdCBiZSBleGFjdGx5IDQgY2hhcmFjdGVyc1xuIiwKKwkJCXNpZ25hdHVyZSk7CiAJCXJldHVybiAoLTEpOwogCX0KIApAQCAtMzYzLDkgKzM2NCw5IEBACiAJCQkJcmV0dXJuICgwKTsKIAkJCX0KIAotCQkJYWNwaV9sb2dfZXJyb3IKLQkJCSAgICAoIkNvdWxkIG5vdCBnZXQgQUNQSSB0YWJsZSB3aXRoIHNpZ25hdHVyZSBbJXNdLCAlc1xuIiwKLQkJCSAgICAgbG9jYWxfc2lnbmF0dXJlLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiQ291bGQgbm90IGdldCBBQ1BJIHRhYmxlIHdpdGggc2lnbmF0dXJlIFslc10sICVzXG4iLAorCQkJCWxvY2FsX3NpZ25hdHVyZSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOwogCQkJcmV0dXJuICgtMSk7CiAJCX0KIApAQCAtNDA4LDI0ICs0MDksMjQgQEAKIAl9CiAKIAlpZiAoIWFjcGlfdXRfdmFsaWRfbmFtZXNlZyh0YWJsZS0+c2lnbmF0dXJlKSkgewotCQlhY3BpX2xvZ19lcnJvcgotCQkgICAgKCJObyB2YWxpZCBBQ1BJIHNpZ25hdHVyZSB3YXMgZm91bmQgaW4gaW5wdXQgZmlsZSAlc1xuIiwKLQkJICAgICBwYXRobmFtZSk7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIk5vIHZhbGlkIEFDUEkgc2lnbmF0dXJlIHdhcyBmb3VuZCBpbiBpbnB1dCBmaWxlICVzXG4iLAorCQkJcGF0aG5hbWUpOwogCX0KIAogCS8qIEZpbGUgbXVzdCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSB0YWJsZSBsZW5ndGggKi8KIAogCWlmICh0YWJsZS0+bGVuZ3RoID4gZmlsZV9zaXplKSB7Ci0JCWFjcGlfbG9nX2Vycm9yCi0JCSAgICAoIlRhYmxlIGxlbmd0aCAoMHglWCkgaXMgdG9vIGxhcmdlIGZvciBpbnB1dCBmaWxlICgweCVYKSAlc1xuIiwKLQkJICAgICB0YWJsZS0+bGVuZ3RoLCBmaWxlX3NpemUsIHBhdGhuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiVGFibGUgbGVuZ3RoICgweCVYKSBpcyB0b28gbGFyZ2UgZm9yIGlucHV0IGZpbGUgKDB4JVgpICVzXG4iLAorCQkJdGFibGUtPmxlbmd0aCwgZmlsZV9zaXplLCBwYXRobmFtZSk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAoZ2JsX3ZlcmJvc2VfbW9kZSkgewotCQlhY3BpX2xvZ19lcnJvcgotCQkgICAgKCJJbnB1dCBmaWxlOiAgJXMgY29udGFpbnMgdGFibGUgWyU0LjRzXSwgMHglWCAoJXUpIGJ5dGVzXG4iLAotCQkgICAgIHBhdGhuYW1lLCB0YWJsZS0+c2lnbmF0dXJlLCBmaWxlX3NpemUsIGZpbGVfc2l6ZSk7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIklucHV0IGZpbGU6ICAlcyBjb250YWlucyB0YWJsZSBbJTQuNHNdLCAweCVYICgldSkgYnl0ZXNcbiIsCisJCQlwYXRobmFtZSwgdGFibGUtPnNpZ25hdHVyZSwgZmlsZV9zaXplLCBmaWxlX3NpemUpOwogCX0KIAogCXRhYmxlX3N0YXR1cyA9IGFwX2R1bXBfdGFibGVfYnVmZmVyKHRhYmxlLCAwLCAwKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYXBmaWxlcy5jIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcGZpbGVzLmMKaW5kZXggNWZjZDk3MC4uZGQ1Yjg2MSAxMDA2NDQKLS0tIGEvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcGZpbGVzLmMKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcGZpbGVzLmMKQEAgLTQyLDcgKzQyLDYgQEAKICAqLwogCiAjaW5jbHVkZSAiYWNwaWR1bXAuaCIKLSNpbmNsdWRlICJhY2FwcHMuaCIKIAogLyogTG9jYWwgcHJvdG90eXBlcyAqLwogCkBAIC02Niw3ICs2NSw4IEBACiAJc3RydWN0IHN0YXQgc3RhdF9pbmZvOwogCiAJaWYgKCFzdGF0KHBhdGhuYW1lLCAmc3RhdF9pbmZvKSkgewotCQlhY3BpX2xvZ19lcnJvcigiVGFyZ2V0IHBhdGggYWxyZWFkeSBleGlzdHMsIG92ZXJ3cml0ZT8gW3l8bl0gIik7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlRhcmdldCBwYXRoIGFscmVhZHkgZXhpc3RzLCBvdmVyd3JpdGU/IFt5fG5dICIpOwogCiAJCWlmIChnZXRjaGFyKCkgIT0gJ3knKSB7CiAJCQlyZXR1cm4gKC0xKTsKQEAgLTEwMiw5ICsxMDIsOSBAQAogCiAJLyogUG9pbnQgc3Rkb3V0IHRvIHRoZSBmaWxlICovCiAKLQlmaWxlID0gYWNwaV9vc19vcGVuX2ZpbGUocGF0aG5hbWUsIEFDUElfRklMRV9XUklUSU5HKTsKKwlmaWxlID0gZm9wZW4ocGF0aG5hbWUsICJ3Iik7CiAJaWYgKCFmaWxlKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZTogJXNcbiIsIHBhdGhuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZTogJXNcbiIsIHBhdGhuYW1lKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCkBAIC0xMzQsNyArMTM0LDcgQEAKIAljaGFyIGZpbGVuYW1lW0FDUElfTkFNRV9TSVpFICsgMTZdOwogCWNoYXIgaW5zdGFuY2Vfc3RyWzE2XTsKIAlBQ1BJX0ZJTEUgZmlsZTsKLQlzaXplX3QgYWN0dWFsOworCWFjcGlfc2l6ZSBhY3R1YWw7CiAJdTMyIHRhYmxlX2xlbmd0aDsKIAogCS8qIE9idGFpbiB0YWJsZSBsZW5ndGggKi8KQEAgLTE1OCwzNyArMTU4LDM2IEBACiAJLyogSGFuZGxlIG11bHRpcGxlIFNTRHRzIC0gY3JlYXRlIGRpZmZlcmVudCBmaWxlbmFtZXMgZm9yIGVhY2ggKi8KIAogCWlmIChpbnN0YW5jZSA+IDApIHsKLQkJYWNwaV91dF9zbnByaW50ZihpbnN0YW5jZV9zdHIsIHNpemVvZihpbnN0YW5jZV9zdHIpLCAiJXUiLAotCQkJCSBpbnN0YW5jZSk7CisJCXNucHJpbnRmKGluc3RhbmNlX3N0ciwgc2l6ZW9mKGluc3RhbmNlX3N0ciksICIldSIsIGluc3RhbmNlKTsKIAkJc3RyY2F0KGZpbGVuYW1lLCBpbnN0YW5jZV9zdHIpOwogCX0KIAogCXN0cmNhdChmaWxlbmFtZSwgRklMRV9TVUZGSVhfQklOQVJZX1RBQkxFKTsKIAogCWlmIChnYmxfdmVyYm9zZV9tb2RlKSB7Ci0JCWFjcGlfbG9nX2Vycm9yCi0JCSAgICAoIldyaXRpbmcgWyU0LjRzXSB0byBiaW5hcnkgZmlsZTogJXMgMHglWCAoJXUpIGJ5dGVzXG4iLAotCQkgICAgIHRhYmxlLT5zaWduYXR1cmUsIGZpbGVuYW1lLCB0YWJsZS0+bGVuZ3RoLCB0YWJsZS0+bGVuZ3RoKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiV3JpdGluZyBbJTQuNHNdIHRvIGJpbmFyeSBmaWxlOiAlcyAweCVYICgldSkgYnl0ZXNcbiIsCisJCQl0YWJsZS0+c2lnbmF0dXJlLCBmaWxlbmFtZSwgdGFibGUtPmxlbmd0aCwKKwkJCXRhYmxlLT5sZW5ndGgpOwogCX0KIAogCS8qIE9wZW4gdGhlIGZpbGUgYW5kIGR1bXAgdGhlIGVudGlyZSB0YWJsZSBpbiBiaW5hcnkgbW9kZSAqLwogCi0JZmlsZSA9IGFjcGlfb3Nfb3Blbl9maWxlKGZpbGVuYW1lLAotCQkJCSBBQ1BJX0ZJTEVfV1JJVElORyB8IEFDUElfRklMRV9CSU5BUlkpOworCWZpbGUgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CiAJaWYgKCFmaWxlKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCi0JYWN0dWFsID0gYWNwaV9vc193cml0ZV9maWxlKGZpbGUsIHRhYmxlLCAxLCB0YWJsZV9sZW5ndGgpOworCWFjdHVhbCA9IGZ3cml0ZSh0YWJsZSwgMSwgdGFibGVfbGVuZ3RoLCBmaWxlKTsKIAlpZiAoYWN0dWFsICE9IHRhYmxlX2xlbmd0aCkgewotCQlhY3BpX2xvZ19lcnJvcigiRXJyb3Igd3JpdGluZyBiaW5hcnkgb3V0cHV0IGZpbGU6ICVzXG4iLAotCQkJICAgICAgIGZpbGVuYW1lKTsKLQkJYWNwaV9vc19jbG9zZV9maWxlKGZpbGUpOworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdyaXRpbmcgYmluYXJ5IG91dHB1dCBmaWxlOiAlc1xuIiwKKwkJCWZpbGVuYW1lKTsKKwkJZmNsb3NlKGZpbGUpOwogCQlyZXR1cm4gKC0xKTsKIAl9CiAKLQlhY3BpX29zX2Nsb3NlX2ZpbGUoZmlsZSk7CisJZmNsb3NlKGZpbGUpOwogCXJldHVybiAoMCk7CiB9CiAKQEAgLTIxMSwxNCArMjEwLDEzIEBACiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpidWZmZXIgPSBOVUxMOwogCUFDUElfRklMRSBmaWxlOwogCXUzMiBmaWxlX3NpemU7Ci0Jc2l6ZV90IGFjdHVhbDsKKwlhY3BpX3NpemUgYWN0dWFsOwogCiAJLyogTXVzdCB1c2UgYmluYXJ5IG1vZGUgKi8KIAotCWZpbGUgPQotCSAgICBhY3BpX29zX29wZW5fZmlsZShwYXRobmFtZSwgQUNQSV9GSUxFX1JFQURJTkcgfCBBQ1BJX0ZJTEVfQklOQVJZKTsKKwlmaWxlID0gZm9wZW4ocGF0aG5hbWUsICJyYiIpOwogCWlmICghZmlsZSkgewotCQlhY3BpX2xvZ19lcnJvcigiQ291bGQgbm90IG9wZW4gaW5wdXQgZmlsZTogJXNcbiIsIHBhdGhuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlOiAlc1xuIiwgcGF0aG5hbWUpOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KIApAQCAtMjI2LDcgKzIyNCw4IEBACiAKIAlmaWxlX3NpemUgPSBjbV9nZXRfZmlsZV9zaXplKGZpbGUpOwogCWlmIChmaWxlX3NpemUgPT0gQUNQSV9VSU5UMzJfTUFYKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3QgZ2V0IGlucHV0IGZpbGUgc2l6ZTogJXNcbiIsIHBhdGhuYW1lKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiQ291bGQgbm90IGdldCBpbnB1dCBmaWxlIHNpemU6ICVzXG4iLCBwYXRobmFtZSk7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKQEAgLTIzNCwxNiArMjMzLDE3IEBACiAKIAlidWZmZXIgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChmaWxlX3NpemUpOwogCWlmICghYnVmZmVyKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgZmlsZSBidWZmZXIgb2Ygc2l6ZTogJXVcbiIsCi0JCQkgICAgICAgZmlsZV9zaXplKTsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiQ291bGQgbm90IGFsbG9jYXRlIGZpbGUgYnVmZmVyIG9mIHNpemU6ICV1XG4iLAorCQkJZmlsZV9zaXplKTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIFJlYWQgdGhlIGVudGlyZSBmaWxlICovCiAKLQlhY3R1YWwgPSBhY3BpX29zX3JlYWRfZmlsZShmaWxlLCBidWZmZXIsIDEsIGZpbGVfc2l6ZSk7CisJYWN0dWFsID0gZnJlYWQoYnVmZmVyLCAxLCBmaWxlX3NpemUsIGZpbGUpOwogCWlmIChhY3R1YWwgIT0gZmlsZV9zaXplKSB7Ci0JCWFjcGlfbG9nX2Vycm9yKCJDb3VsZCBub3QgcmVhZCBpbnB1dCBmaWxlOiAlc1xuIiwgcGF0aG5hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCByZWFkIGlucHV0IGZpbGU6ICVzXG4iLCBwYXRobmFtZSk7CiAJCUFDUElfRlJFRShidWZmZXIpOwogCQlidWZmZXIgPSBOVUxMOwogCQlnb3RvIGNsZWFudXA7CkBAIC0yNTIsNiArMjUyLDYgQEAKIAkqb3V0X2ZpbGVfc2l6ZSA9IGZpbGVfc2l6ZTsKIAogY2xlYW51cDoKLQlhY3BpX29zX2Nsb3NlX2ZpbGUoZmlsZSk7CisJZmNsb3NlKGZpbGUpOwogCXJldHVybiAoYnVmZmVyKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYXBtYWluLmMgYi90b29scy9wb3dlci9hY3BpL3Rvb2xzL2FjcGlkdW1wL2FwbWFpbi5jCmluZGV4IDc2OTJlNmIuLjdmZjQ2YmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL2FjcGkvdG9vbHMvYWNwaWR1bXAvYXBtYWluLmMKKysrIGIvdG9vbHMvcG93ZXIvYWNwaS90b29scy9hY3BpZHVtcC9hcG1haW4uYwpAQCAtNDMsNyArNDMsNiBAQAogCiAjZGVmaW5lIF9ERUNMQVJFX0dMT0JBTFMKICNpbmNsdWRlICJhY3BpZHVtcC5oIgotI2luY2x1ZGUgImFjYXBwcy5oIgogCiAvKgogICogYWNwaWR1bXAgLSBBIHBvcnRhYmxlIHV0aWxpdHkgZm9yIG9idGFpbmluZyBzeXN0ZW0gQUNQSSB0YWJsZXMgYW5kIGR1bXBpbmcKQEAgLTE0MCw4ICsxMzksOCBAQAogCiAJY3VycmVudF9hY3Rpb24rKzsKIAlpZiAoY3VycmVudF9hY3Rpb24gPiBBUF9NQVhfQUNUSU9OUykgewotCQlhY3BpX2xvZ19lcnJvcigiVG9vIG1hbnkgdGFibGUgb3B0aW9ucyAobWF4ICV1KVxuIiwKLQkJCSAgICAgICBBUF9NQVhfQUNUSU9OUyk7CisJCWZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgdGFibGUgb3B0aW9ucyAobWF4ICV1KVxuIiwKKwkJCUFQX01BWF9BQ1RJT05TKTsKIAkJcmV0dXJuICgtMSk7CiAJfQogCkBAIC0xODYsOSArMTg1LDkgQEAKIAkJCX0gZWxzZSBpZiAoIXN0cmNtcChhY3BpX2dibF9vcHRhcmcsICJvZmYiKSkgewogCQkJCWdibF9kdW1wX2N1c3RvbWl6ZWRfdGFibGVzID0gRkFMU0U7CiAJCQl9IGVsc2UgewotCQkJCWFjcGlfbG9nX2Vycm9yCi0JCQkJICAgICgiJXM6IENhbm5vdCBoYW5kbGUgdGhpcyBzd2l0Y2gsIHBsZWFzZSB1c2Ugb258b2ZmXG4iLAotCQkJCSAgICAgYWNwaV9nYmxfb3B0YXJnKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIiVzOiBDYW5ub3QgaGFuZGxlIHRoaXMgc3dpdGNoLCBwbGVhc2UgdXNlIG9ufG9mZlxuIiwKKwkJCQkJYWNwaV9nYmxfb3B0YXJnKTsKIAkJCQlyZXR1cm4gKC0xKTsKIAkJCX0KIAkJCWNvbnRpbnVlOwpAQCAtMjA5LDEzICsyMDgsMTMgQEAKIAkJY2FzZSAncic6CS8qIER1bXAgdGFibGVzIGZyb20gc3BlY2lmaWVkIFJTRFAgKi8KIAogCQkJc3RhdHVzID0KLQkJCSAgICBhY3BpX3V0X3N0cnRvdWw2NChhY3BpX2dibF9vcHRhcmcsIEFDUElfQU5ZX0JBU0UsCi0JCQkJCSAgICAgIEFDUElfTUFYNjRfQllURV9XSURUSCwKKwkJCSAgICBhY3BpX3V0X3N0cnRvdWw2NChhY3BpX2dibF9vcHRhcmcsCisJCQkJCSAgICAgIEFDUElfU1RSVE9VTF82NEJJVCwKIAkJCQkJICAgICAgJmdibF9yc2RwX2Jhc2UpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQkJYWNwaV9sb2dfZXJyb3IKLQkJCQkgICAgKCIlczogQ291bGQgbm90IGNvbnZlcnQgdG8gYSBwaHlzaWNhbCBhZGRyZXNzXG4iLAotCQkJCSAgICAgYWNwaV9nYmxfb3B0YXJnKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIiVzOiBDb3VsZCBub3QgY29udmVydCB0byBhIHBoeXNpY2FsIGFkZHJlc3NcbiIsCisJCQkJCWFjcGlfZ2JsX29wdGFyZyk7CiAJCQkJcmV0dXJuICgtMSk7CiAJCQl9CiAJCQljb250aW51ZTsKQEAgLTI0Miw3ICsyNDEsNyBAQAogCQljYXNlICd6JzoJLyogVmVyYm9zZSBtb2RlICovCiAKIAkJCWdibF92ZXJib3NlX21vZGUgPSBUUlVFOwotCQkJYWNwaV9sb2dfZXJyb3IoQUNQSV9DT01NT05fU0lHTk9OKEFQX1VUSUxJVFlfTkFNRSkpOworCQkJZnByaW50ZihzdGRlcnIsIEFDUElfQ09NTU9OX1NJR05PTihBUF9VVElMSVRZX05BTUUpKTsKIAkJCWNvbnRpbnVlOwogCiAJCQkvKgpAQCAtMzE1LDYgKzMxNCw3IEBACiAJQUNQSV9ERUJVR19JTklUSUFMSVpFKCk7CS8qIEZvciBkZWJ1ZyB2ZXJzaW9uIG9ubHkgKi8KIAlhY3BpX29zX2luaXRpYWxpemUoKTsKIAlnYmxfb3V0cHV0X2ZpbGUgPSBBQ1BJX0ZJTEVfT1VUOworCWFjcGlfZ2JsX2ludGVnZXJfYnl0ZV93aWR0aCA9IDg7CiAKIAkvKiBQcm9jZXNzIGNvbW1hbmQgbGluZSBvcHRpb25zICovCiAKQEAgLTM1Myw4ICszNTMsOSBAQAogCiAJCWRlZmF1bHQ6CiAKLQkJCWFjcGlfbG9nX2Vycm9yKCJJbnRlcm5hbCBlcnJvciwgaW52YWxpZCBhY3Rpb246IDB4JVhcbiIsCi0JCQkJICAgICAgIGFjdGlvbi0+dG9fYmVfZG9uZSk7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiSW50ZXJuYWwgZXJyb3IsIGludmFsaWQgYWN0aW9uOiAweCVYXG4iLAorCQkJCWFjdGlvbi0+dG9fYmVfZG9uZSk7CiAJCQlyZXR1cm4gKC0xKTsKIAkJfQogCkBAIC0zNjksMTIgKzM3MCwxMiBAQAogCQkJLyogU3VtbWFyeSBmb3IgdGhlIG91dHB1dCBmaWxlICovCiAKIAkJCWZpbGVfc2l6ZSA9IGNtX2dldF9maWxlX3NpemUoZ2JsX291dHB1dF9maWxlKTsKLQkJCWFjcGlfbG9nX2Vycm9yCi0JCQkgICAgKCJPdXRwdXQgZmlsZSAlcyBjb250YWlucyAweCVYICgldSkgYnl0ZXNcblxuIiwKLQkJCSAgICAgZ2JsX291dHB1dF9maWxlbmFtZSwgZmlsZV9zaXplLCBmaWxlX3NpemUpOworCQkJZnByaW50ZihzdGRlcnIsCisJCQkJIk91dHB1dCBmaWxlICVzIGNvbnRhaW5zIDB4JVggKCV1KSBieXRlc1xuXG4iLAorCQkJCWdibF9vdXRwdXRfZmlsZW5hbWUsIGZpbGVfc2l6ZSwgZmlsZV9zaXplKTsKIAkJfQogCi0JCWFjcGlfb3NfY2xvc2VfZmlsZShnYmxfb3V0cHV0X2ZpbGUpOworCQlmY2xvc2UoZ2JsX291dHB1dF9maWxlKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CmRpZmYgLS1naXQgYS90b29scy9zcGkvTWFrZWZpbGUgYi90b29scy9zcGkvTWFrZWZpbGUKaW5kZXggY2QwZGI2Mi4uMzgxNWIxOCAxMDA2NDQKLS0tIGEvdG9vbHMvc3BpL01ha2VmaWxlCisrKyBiL3Rvb2xzL3NwaS9NYWtlZmlsZQpAQCAtMSwzICsxLDUgQEAKK0NDID0gJChDUk9TU19DT01QSUxFKWdjYworCiBhbGw6IHNwaWRldl90ZXN0IHNwaWRldl9mZHgKIAogY2xlYW46CmRpZmYgLS1naXQgYS90b29scy9zcGkvc3BpZGV2X3Rlc3QuYyBiL3Rvb2xzL3NwaS9zcGlkZXZfdGVzdC5jCmluZGV4IDhhNzNkODEuLmYwNDZiNzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3NwaS9zcGlkZXZfdGVzdC5jCisrKyBiL3Rvb2xzL3NwaS9zcGlkZXZfdGVzdC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpZGV2Lmg+CkBAIC0yODQsNyArMjg1LDcgQEAKIAogc3RhdGljIHZvaWQgdHJhbnNmZXJfZXNjYXBlZF9zdHJpbmcoaW50IGZkLCBjaGFyICpzdHIpCiB7Ci0Jc2l6ZV90IHNpemUgPSBzdHJsZW4oc3RyICsgMSk7CisJc2l6ZV90IHNpemUgPSBzdHJsZW4oc3RyKTsKIAl1aW50OF90ICp0eDsKIAl1aW50OF90ICpyeDsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9udmRpbW0vdGVzdC9uZml0LmMgYi90b29scy90ZXN0aW5nL252ZGltbS90ZXN0L25maXQuYwppbmRleCBkZDQ4ZjQyLi5mNjRjNTdiIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL252ZGltbS90ZXN0L25maXQuYworKysgYi90b29scy90ZXN0aW5nL252ZGltbS90ZXN0L25maXQuYwpAQCAtNjAzLDcgKzYwMyw4IEBACiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJc3ByaW50Zih0LT5sYWJlbFtpXSwgImxhYmVsJWQiLCBpKTsKIAotCQl0LT5mbHVzaFtpXSA9IHRlc3RfYWxsb2ModCwgc2l6ZW9mKHU2NCkgKiBOVU1fSElOVFMsCisJCXQtPmZsdXNoW2ldID0gdGVzdF9hbGxvYyh0LCBtYXgoUEFHRV9TSVpFLAorCQkJCQlzaXplb2YodTY0KSAqIE5VTV9ISU5UUyksCiAJCQkJJnQtPmZsdXNoX2RtYVtpXSk7CiAJCWlmICghdC0+Zmx1c2hbaV0pCiAJCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9NYWtlZmlsZQppbmRleCAzYjUzMDQ2Li45ZDA5MTllZCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKIAotQ0ZMQUdTICs9IC1JLiAtZyAtV2FsbCAtRF9MR1BMX1NPVVJDRQorQ0ZMQUdTICs9IC1JLiAtZyAtTzIgLVdhbGwgLURfTEdQTF9TT1VSQ0UKIExERkxBR1MgKz0gLWxwdGhyZWFkIC1sdXJjdQogVEFSR0VUUyA9IG1haW4KIE9GSUxFUyA9IG1haW4ubyByYWRpeC10cmVlLm8gbGludXgubyB0ZXN0Lm8gdGFnX2NoZWNrLm8gZmluZF9uZXh0X2JpdC5vIFwKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9jcHUuaCBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9saW51eC9jcHUuaAppbmRleCA2MGE0MDQ1Li43Y2Y0MTIxIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbGludXgvY3B1LmgKKysrIGIvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL2xpbnV4L2NwdS5oCkBAIC03LDE5ICs3LDggQEAKICNkZWZpbmUgQ1BVX0RPV05fUFJFUEFSRQkweDAwMDUgLyogQ1BVICh1bnNpZ25lZCl2IGdvaW5nIGRvd24gKi8KICNkZWZpbmUgQ1BVX0RPV05fRkFJTEVECQkweDAwMDYgLyogQ1BVICh1bnNpZ25lZCl2IE5PVCBnb2luZyBkb3duICovCiAjZGVmaW5lIENQVV9ERUFECQkweDAwMDcgLyogQ1BVICh1bnNpZ25lZCl2IGRlYWQgKi8KLSNkZWZpbmUgQ1BVX0RZSU5HCQkweDAwMDggLyogQ1BVICh1bnNpZ25lZCl2IG5vdCBydW5uaW5nIGFueSB0YXNrLAotCQkJCQkqIG5vdCBoYW5kbGluZyBpbnRlcnJ1cHRzLCBzb29uIGRlYWQuCi0JCQkJCSogQ2FsbGVkIG9uIHRoZSBkeWluZyBjcHUsIGludGVycnVwdHMKLQkJCQkJKiBhcmUgYWxyZWFkeSBkaXNhYmxlZC4gTXVzdCBub3QKLQkJCQkJKiBzbGVlcCwgbXVzdCBub3QgZmFpbCAqLwogI2RlZmluZSBDUFVfUE9TVF9ERUFECQkweDAwMDkgLyogQ1BVICh1bnNpZ25lZCl2IGRlYWQsIGNwdV9ob3RwbHVnCiAJCQkJCSogbG9jayBpcyBkcm9wcGVkICovCi0jZGVmaW5lIENQVV9TVEFSVElORwkJMHgwMDBBIC8qIENQVSAodW5zaWduZWQpdiBzb29uIHJ1bm5pbmcuCi0JCQkJCSogQ2FsbGVkIG9uIHRoZSBuZXcgY3B1LCBqdXN0IGJlZm9yZQotCQkJCQkqIGVuYWJsaW5nIGludGVycnVwdHMuIE11c3Qgbm90IHNsZWVwLAotCQkJCQkqIG11c3Qgbm90IGZhaWwgKi8KLSNkZWZpbmUgQ1BVX0RZSU5HX0lETEUJCTB4MDAwQiAvKiBDUFUgKHVuc2lnbmVkKXYgZHlpbmcsIHJlYWNoZWQKLQkJCQkJKiBpZGxlIGxvb3AuICovCiAjZGVmaW5lIENQVV9CUk9LRU4JCTB4MDAwQyAvKiBDUFUgKHVuc2lnbmVkKXYgZGlkIG5vdCBkaWUgcHJvcGVybHksCiAJCQkJCSogcGVyaGFwcyBkdWUgdG8gcHJlZW1wdGlvbi4gKi8KICNkZWZpbmUgQ1BVX1RBU0tTX0ZST1pFTgkweDAwMTAKQEAgLTMwLDUgKzE5LDMgQEAKICNkZWZpbmUgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU4gKENQVV9ET1dOX1BSRVBBUkUgfCBDUFVfVEFTS1NfRlJPWkVOKQogI2RlZmluZSBDUFVfRE9XTl9GQUlMRURfRlJPWkVOICAoQ1BVX0RPV05fRkFJTEVEIHwgQ1BVX1RBU0tTX0ZST1pFTikKICNkZWZpbmUgQ1BVX0RFQURfRlJPWkVOCQkoQ1BVX0RFQUQgfCBDUFVfVEFTS1NfRlJPWkVOKQotI2RlZmluZSBDUFVfRFlJTkdfRlJPWkVOCShDUFVfRFlJTkcgfCBDUFVfVEFTS1NfRlJPWkVOKQotI2RlZmluZSBDUFVfU1RBUlRJTkdfRlJPWkVOCShDUFVfU1RBUlRJTkcgfCBDUFVfVEFTS1NfRlJPWkVOKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL211bHRpb3JkZXIuYyBiL3Rvb2xzL3Rlc3RpbmcvcmFkaXgtdHJlZS9tdWx0aW9yZGVyLmMKaW5kZXggMzlkOWI5NS4uMDVkN2JjNCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9yYWRpeC10cmVlL211bHRpb3JkZXIuYworKysgYi90b29scy90ZXN0aW5nL3JhZGl4LXRyZWUvbXVsdGlvcmRlci5jCkBAIC0xMjQsNiArMTI0LDggQEAKIAl1bnNpZ25lZCBsb25nIGk7CiAJdW5zaWduZWQgbG9uZyBtaW4gPSBpbmRleCAmIH4oKDFVTCA8PCBvcmRlcikgLSAxKTsKIAl1bnNpZ25lZCBsb25nIG1heCA9IG1pbiArICgxVUwgPDwgb3JkZXIpOworCXZvaWQgKipzbG90OworCXN0cnVjdCBpdGVtICppdGVtMiA9IGl0ZW1fY3JlYXRlKG1pbik7CiAJUkFESVhfVFJFRSh0cmVlLCBHRlBfS0VSTkVMKTsKIAogCXByaW50ZigiTXVsdGlvcmRlciBpbmRleCAlbGQsIG9yZGVyICVkXG4iLCBpbmRleCwgb3JkZXIpOwpAQCAtMTM5LDEzICsxNDEsMTkgQEAKIAkJaXRlbV9jaGVja19hYnNlbnQoJnRyZWUsIGkpOwogCWZvciAoaSA9IG1heDsgaSA8IDIqbWF4OyBpKyspCiAJCWl0ZW1fY2hlY2tfYWJzZW50KCZ0cmVlLCBpKTsKKwlmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykKKwkJYXNzZXJ0KHJhZGl4X3RyZWVfaW5zZXJ0KCZ0cmVlLCBpLCBpdGVtMikgPT0gLUVFWElTVCk7CisKKwlzbG90ID0gcmFkaXhfdHJlZV9sb29rdXBfc2xvdCgmdHJlZSwgaW5kZXgpOworCWZyZWUoKnNsb3QpOworCXJhZGl4X3RyZWVfcmVwbGFjZV9zbG90KHNsb3QsIGl0ZW0yKTsKIAlmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykgewotCQlzdGF0aWMgdm9pZCAqZW50cnkgPSAodm9pZCAqKQotCQkJCQkoMHhBMCB8IFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfRU5UUlkpOwotCQlhc3NlcnQocmFkaXhfdHJlZV9pbnNlcnQoJnRyZWUsIGksIGVudHJ5KSA9PSAtRUVYSVNUKTsKKwkJc3RydWN0IGl0ZW0gKml0ZW0gPSBpdGVtX2xvb2t1cCgmdHJlZSwgaSk7CisJCWFzc2VydChpdGVtICE9IDApOworCQlhc3NlcnQoaXRlbS0+aW5kZXggPT0gbWluKTsKIAl9CiAKLQlhc3NlcnQoaXRlbV9kZWxldGUoJnRyZWUsIGluZGV4KSAhPSAwKTsKKwlhc3NlcnQoaXRlbV9kZWxldGUoJnRyZWUsIG1pbikgIT0gMCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMiptYXg7IGkrKykKIAkJaXRlbV9jaGVja19hYnNlbnQoJnRyZWUsIGkpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZQppbmRleCBmZjllNWYyLi5mNzcwZGJhIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZQorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9NYWtlZmlsZQpAQCAtMTUsNiArMTUsNyBAQAogVEFSR0VUUyArPSBtb3VudAogVEFSR0VUUyArPSBtcXVldWUKIFRBUkdFVFMgKz0gbmV0CitUQVJHRVRTICs9IG5zZnMKIFRBUkdFVFMgKz0gcG93ZXJwYwogVEFSR0VUUyArPSBwc3RvcmUKIFRBUkdFVFMgKz0gcHRyYWNlCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uc2ZzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbnNmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzA2MDU0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbnNmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACitURVNUX1BST0dTIDo9IG93bmVyIHBpZG5zCisKK0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCisKK2FsbDogb3duZXIgcGlkbnMKK293bmVyOiBvd25lci5jCitwaWRuczogcGlkbnMuYworCitjbGVhbjoKKwkkKFJNKSBvd25lciBwaWRucworCitpbmNsdWRlIC4uL2xpYi5tawpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbnNmcy9vd25lci5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbnNmcy9vd25lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNzIwNWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uc2ZzL293bmVyLmMKQEAgLTAsMCArMSw5MSBAQAorI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisjZGVmaW5lIE5TSU8gICAgMHhiNworI2RlZmluZSBOU19HRVRfVVNFUk5TICAgX0lPKE5TSU8sIDB4MSkKKworI2RlZmluZSBwcl9lcnIoZm10LCAuLi4pIFwKKwkJKHsgXAorCQkJZnByaW50ZihzdGRlcnIsICIlczolZDoiIGZtdCAiOiAlbVxuIiwgXAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXyk7IFwKKwkJCTE7IFwKKwkJfSkKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZwW10pCit7CisJaW50IHBmZFsyXSwgbnMsIHVucywgaW5pdF91bnM7CisJc3RydWN0IHN0YXQgc3QxLCBzdDI7CisJY2hhciBwYXRoWzEyOF07CisJcGlkX3QgcGlkOworCWNoYXIgYzsKKworCWlmIChwaXBlKHBmZCkpCisJCXJldHVybiAxOworCisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gcHJfZXJyKCJmb3JrIik7CisJaWYgKHBpZCA9PSAwKSB7CisJCXByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwpOworCQlpZiAodW5zaGFyZShDTE9ORV9ORVdVVFMgfCBDTE9ORV9ORVdVU0VSKSkKKwkJCXJldHVybiBwcl9lcnIoInVuc2hhcmUiKTsKKwkJY2xvc2UocGZkWzBdKTsKKwkJY2xvc2UocGZkWzFdKTsKKwkJd2hpbGUgKDEpCisJCQlzbGVlcCgxKTsKKwkJcmV0dXJuIDA7CisJfQorCWNsb3NlKHBmZFsxXSk7CisJaWYgKHJlYWQocGZkWzBdLCAmYywgMSkgIT0gMCkKKwkJcmV0dXJuIHByX2VycigiVW5hYmxlIHRvIHJlYWQgZnJvbSBwaXBlIik7CisJY2xvc2UocGZkWzBdKTsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIi9wcm9jLyVkL25zL3V0cyIsIHBpZCk7CisJbnMgPSBvcGVuKHBhdGgsIE9fUkRPTkxZKTsKKwlpZiAobnMgPCAwKQorCQlyZXR1cm4gcHJfZXJyKCJVbmFibGUgdG8gb3BlbiAlcyIsIHBhdGgpOworCisJdW5zID0gaW9jdGwobnMsIE5TX0dFVF9VU0VSTlMpOworCWlmICh1bnMgPCAwKQorCQlyZXR1cm4gcHJfZXJyKCJVbmFibGUgdG8gZ2V0IGFuIG93bmluZyB1c2VyIG5hbWVzcGFjZSIpOworCisJaWYgKGZzdGF0KHVucywgJnN0MSkpCisJCXJldHVybiBwcl9lcnIoImZzdGF0Iik7CisKKwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIvcHJvYy8lZC9ucy91c2VyIiwgcGlkKTsKKwlpZiAoc3RhdChwYXRoLCAmc3QyKSkKKwkJcmV0dXJuIHByX2Vycigic3RhdCIpOworCisJaWYgKHN0MS5zdF9pbm8gIT0gc3QyLnN0X2lubykKKwkJcmV0dXJuIHByX2VycigiTlNfR0VUX1VTRVJOUyByZXR1cm5lZCBhIHdyb25nIG5hbWVzcGFjZSIpOworCisJaW5pdF91bnMgPSBpb2N0bCh1bnMsIE5TX0dFVF9VU0VSTlMpOworCWlmICh1bnMgPCAwKQorCQlyZXR1cm4gcHJfZXJyKCJVbmFibGUgdG8gZ2V0IGFuIG93bmluZyB1c2VyIG5hbWVzcGFjZSIpOworCisJaWYgKGlvY3RsKGluaXRfdW5zLCBOU19HRVRfVVNFUk5TKSA+PSAwIHx8IGVycm5vICE9IEVQRVJNKQorCQlyZXR1cm4gcHJfZXJyKCJEb24ndCBnZXQgRVBFUk0iKTsKKworCWlmICh1bnNoYXJlKENMT05FX05FV1VTRVIpKQorCQlyZXR1cm4gcHJfZXJyKCJ1bnNoYXJlIik7CisKKwlpZiAoaW9jdGwobnMsIE5TX0dFVF9VU0VSTlMpID49IDAgfHwgZXJybm8gIT0gRVBFUk0pCisJCXJldHVybiBwcl9lcnIoIkRvbid0IGdldCBFUEVSTSIpOworCWlmIChpb2N0bChpbml0X3VucywgTlNfR0VUX1VTRVJOUykgPj0gMCB8fCBlcnJubyAhPSBFUEVSTSkKKwkJcmV0dXJuIHByX2VycigiRG9uJ3QgZ2V0IEVQRVJNIik7CisKKwlraWxsKHBpZCwgU0lHS0lMTCk7CisJd2FpdChOVUxMKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25zZnMvcGlkbnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25zZnMvcGlkbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTNhMGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbnNmcy9waWRucy5jCkBAIC0wLDAgKzEsNzggQEAKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2RlZmluZSBwcl9lcnIoZm10LCAuLi4pIFwKKwkJKHsgXAorCQkJZnByaW50ZihzdGRlcnIsICIlczolZDoiIGZtdCAiOiAlbVxuIiwgXAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgIyNfX1ZBX0FSR1NfXyk7IFwKKwkJCTE7IFwKKwkJfSkKKworI2RlZmluZSBOU0lPCTB4YjcKKyNkZWZpbmUgTlNfR0VUX1VTRVJOUyAgIF9JTyhOU0lPLCAweDEpCisjZGVmaW5lIE5TX0dFVF9QQVJFTlQgICBfSU8oTlNJTywgMHgyKQorCisjZGVmaW5lIF9fc3RhY2tfYWxpZ25lZF9fCV9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkKK3N0cnVjdCBjcl9jbG9uZV9hcmcgeworCWNoYXIgc3RhY2tbMTI4XSBfX3N0YWNrX2FsaWduZWRfXzsKKwljaGFyIHN0YWNrX3B0clswXTsKK307CisKK3N0YXRpYyBpbnQgY2hpbGQodm9pZCAqYXJncykKK3sKKwlwcmN0bChQUl9TRVRfUERFQVRIU0lHLCBTSUdLSUxMKTsKKwl3aGlsZSAoMSkKKwkJc2xlZXAoMSk7CisJZXhpdCgwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyICpuc19zdHJzW10gPSB7InBpZCIsICJ1c2VyIn07CisJY2hhciBwYXRoW10gPSAiL3Byb2MvMDEyMzQ1Njc4OS9ucy9waWQiOworCXN0cnVjdCBjcl9jbG9uZV9hcmcgY2E7CisJc3RydWN0IHN0YXQgc3QxLCBzdDI7CisJaW50IG5zLCBwbnMsIGk7CisJcGlkX3QgcGlkOworCisJcGlkID0gY2xvbmUoY2hpbGQsIGNhLnN0YWNrX3B0ciwgQ0xPTkVfTkVXVVNFUiB8IENMT05FX05FV1BJRCB8IFNJR0NITEQsIE5VTEwpOworCWlmIChwaWQgPCAwKQorCQlyZXR1cm4gcHJfZXJyKCJjbG9uZSIpOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIvcHJvYy8lZC9ucy8lcyIsIHBpZCwgbnNfc3Ryc1tpXSk7CisJCW5zID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChucyA8IDApCisJCQlyZXR1cm4gcHJfZXJyKCJVbmFibGUgdG8gb3BlbiAlcyIsIHBhdGgpOworCisJCXBucyA9IGlvY3RsKG5zLCBOU19HRVRfUEFSRU5UKTsKKwkJaWYgKHBucyA8IDApCisJCQlyZXR1cm4gcHJfZXJyKCJVbmFibGUgdG8gZ2V0IGEgcGFyZW50IHBpZG5zIik7CisKKwkJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiL3Byb2Mvc2VsZi9ucy8lcyIsIG5zX3N0cnNbaV0pOworCQlpZiAoc3RhdChwYXRoLCAmc3QyKSkKKwkJCXJldHVybiBwcl9lcnIoIlVuYWJsZSB0byBzdGF0ICVzIiwgcGF0aCk7CisJCWlmIChmc3RhdChwbnMsICZzdDEpKQorCQkJcmV0dXJuIHByX2VycigiVW5hYmxlIHRvIHN0YXQgdGhlIHBhcmVudCBwaWRucyIpOworCQlpZiAoc3QxLnN0X2lubyAhPSBzdDIuc3RfaW5vKQorCQkJcmV0dXJuIHByX2VycigiTlNfR0VUX1BBUkVOVCByZXR1cm5lZCBhIHdyb25nIG5hbWVzcGFjZSIpOworCisJCWlmIChpb2N0bChwbnMsIE5TX0dFVF9QQVJFTlQpID49IDAgfHwgZXJybm8gIT0gRVBFUk0pCisJCQlyZXR1cm4gcHJfZXJyKCJEb24ndCBnZXQgRVBFUk0iKTs7CisJfQorCisJa2lsbChwaWQsIFNJR0tJTEwpOworCXdhaXQoTlVMTCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9NYWtlZmlsZQppbmRleCAxY2M2ZDY0Li5kYjU0YTMzIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvTWFrZWZpbGUKQEAgLTE5LDYgKzE5LDcgQEAKIAkgICBkc2NyCQkJXAogCSAgIG1tCQkJXAogCSAgIHBtdQkJCVwKKwkgICBzaWduYWwJCVwKIAkgICBwcmltaXRpdmVzCQlcCiAJICAgc3RyaW5nbG9vcHMJCVwKIAkgICBzd2l0Y2hfZW5kaWFuCVwKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvZnB1X2FzbS5oIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9mcHVfYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEzODdkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvZnB1X2FzbS5oCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiwgQ3lyaWwgQnVyLCBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX1NFTEZURVNUU19QT1dFUlBDX0ZQVV9BU01fSAorI2RlZmluZSBfU0VMRlRFU1RTX1BPV0VSUENfRlBVX0FTTV9ICisjaW5jbHVkZSAiYmFzaWNfYXNtLmgiCisKKyNkZWZpbmUgUFVTSF9GUFUoc3RhY2tfc2l6ZSkgXAorCXN0ZmQJZjMxLChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUpKCVyMSk7IFwKKwlzdGZkCWYzMCwoc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFIC0gOCkoJXIxKTsgXAorCXN0ZmQJZjI5LChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSAxNikoJXIxKTsgXAorCXN0ZmQJZjI4LChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSAyNCkoJXIxKTsgXAorCXN0ZmQJZjI3LChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSAzMikoJXIxKTsgXAorCXN0ZmQJZjI2LChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSA0MCkoJXIxKTsgXAorCXN0ZmQJZjI1LChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSA0OCkoJXIxKTsgXAorCXN0ZmQJZjI0LChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSA1NikoJXIxKTsgXAorCXN0ZmQJZjIzLChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSA2NCkoJXIxKTsgXAorCXN0ZmQJZjIyLChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSA3MikoJXIxKTsgXAorCXN0ZmQJZjIxLChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSA4MCkoJXIxKTsgXAorCXN0ZmQJZjIwLChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSA4OCkoJXIxKTsgXAorCXN0ZmQJZjE5LChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSA5NikoJXIxKTsgXAorCXN0ZmQJZjE4LChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSAxMDQpKCVyMSk7IFwKKwlzdGZkCWYxNywoc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFIC0gMTEyKSglcjEpOyBcCisJc3RmZAlmMTYsKHN0YWNrX3NpemUgKyBTVEFDS19GUkFNRV9NSU5fU0laRSAtIDEyMCkoJXIxKTsgXAorCXN0ZmQJZjE1LChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSAxMjgpKCVyMSk7IFwKKwlzdGZkCWYxNCwoc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFIC0gMTM2KSglcjEpOworCisjZGVmaW5lIFBPUF9GUFUoc3RhY2tfc2l6ZSkgXAorCWxmZAlmMzEsKHN0YWNrX3NpemUgKyBTVEFDS19GUkFNRV9NSU5fU0laRSkoJXIxKTsgXAorCWxmZAlmMzAsKHN0YWNrX3NpemUgKyBTVEFDS19GUkFNRV9NSU5fU0laRSAtIDgpKCVyMSk7IFwKKwlsZmQJZjI5LChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSAxNikoJXIxKTsgXAorCWxmZAlmMjgsKHN0YWNrX3NpemUgKyBTVEFDS19GUkFNRV9NSU5fU0laRSAtIDI0KSglcjEpOyBcCisJbGZkCWYyNywoc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFIC0gMzIpKCVyMSk7IFwKKwlsZmQJZjI2LChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSA0MCkoJXIxKTsgXAorCWxmZAlmMjUsKHN0YWNrX3NpemUgKyBTVEFDS19GUkFNRV9NSU5fU0laRSAtIDQ4KSglcjEpOyBcCisJbGZkCWYyNCwoc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFIC0gNTYpKCVyMSk7IFwKKwlsZmQJZjIzLChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSA2NCkoJXIxKTsgXAorCWxmZAlmMjIsKHN0YWNrX3NpemUgKyBTVEFDS19GUkFNRV9NSU5fU0laRSAtIDcyKSglcjEpOyBcCisJbGZkCWYyMSwoc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFIC0gODApKCVyMSk7IFwKKwlsZmQJZjIwLChzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSA4OCkoJXIxKTsgXAorCWxmZAlmMTksKHN0YWNrX3NpemUgKyBTVEFDS19GUkFNRV9NSU5fU0laRSAtIDk2KSglcjEpOyBcCisJbGZkCWYxOCwoc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFIC0gMTA0KSglcjEpOyBcCisJbGZkCWYxNywoc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFIC0gMTEyKSglcjEpOyBcCisJbGZkCWYxNiwoc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFIC0gMTIwKSglcjEpOyBcCisJbGZkCWYxNSwoc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFIC0gMTI4KSglcjEpOyBcCisJbGZkCWYxNCwoc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFIC0gMTM2KSglcjEpOworCisvKgorICogQ2FyZWZ1bCBjYWxsaW5nIHRoaXMsIGl0IHdpbGwgJ2Nsb2JiZXInIGZwdSAoYnkgZGVzaWduKQorICogRG9uJ3QgY2FsbCB0aGlzIGZyb20gQworICovCitGVU5DX1NUQVJUKGxvYWRfZnB1KQorCWxmZAlmMTQsMChyMykKKwlsZmQJZjE1LDgocjMpCisJbGZkCWYxNiwxNihyMykKKwlsZmQJZjE3LDI0KHIzKQorCWxmZAlmMTgsMzIocjMpCisJbGZkCWYxOSw0MChyMykKKwlsZmQJZjIwLDQ4KHIzKQorCWxmZAlmMjEsNTYocjMpCisJbGZkCWYyMiw2NChyMykKKwlsZmQJZjIzLDcyKHIzKQorCWxmZAlmMjQsODAocjMpCisJbGZkCWYyNSw4OChyMykKKwlsZmQJZjI2LDk2KHIzKQorCWxmZAlmMjcsMTA0KHIzKQorCWxmZAlmMjgsMTEyKHIzKQorCWxmZAlmMjksMTIwKHIzKQorCWxmZAlmMzAsMTI4KHIzKQorCWxmZAlmMzEsMTM2KHIzKQorCWJscgorRlVOQ19FTkQobG9hZF9mcHUpCisKKyNlbmRpZiAvKiBfU0VMRlRFU1RTX1BPV0VSUENfRlBVX0FTTV9IICovCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2dwcl9hc20uaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvZ3ByX2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjM4ODUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL2dwcl9hc20uaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYsIEN5cmlsIEJ1ciwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9TRUxGVEVTVFNfUE9XRVJQQ19HUFJfQVNNX0gKKyNkZWZpbmUgX1NFTEZURVNUU19QT1dFUlBDX0dQUl9BU01fSAorCisjaW5jbHVkZSAiYmFzaWNfYXNtLmgiCisKKyNkZWZpbmUgX19QVVNIX05WUkVHUyh0b3BfcG9zKTsgXAorCXN0ZCByMzEsKHRvcF9wb3MpKCVyMSk7IFwKKwlzdGQgcjMwLCh0b3BfcG9zIC0gOCkoJXIxKTsgXAorCXN0ZCByMjksKHRvcF9wb3MgLSAxNikoJXIxKTsgXAorCXN0ZCByMjgsKHRvcF9wb3MgLSAyNCkoJXIxKTsgXAorCXN0ZCByMjcsKHRvcF9wb3MgLSAzMikoJXIxKTsgXAorCXN0ZCByMjYsKHRvcF9wb3MgLSA0MCkoJXIxKTsgXAorCXN0ZCByMjUsKHRvcF9wb3MgLSA0OCkoJXIxKTsgXAorCXN0ZCByMjQsKHRvcF9wb3MgLSA1NikoJXIxKTsgXAorCXN0ZCByMjMsKHRvcF9wb3MgLSA2NCkoJXIxKTsgXAorCXN0ZCByMjIsKHRvcF9wb3MgLSA3MikoJXIxKTsgXAorCXN0ZCByMjEsKHRvcF9wb3MgLSA4MCkoJXIxKTsgXAorCXN0ZCByMjAsKHRvcF9wb3MgLSA4OCkoJXIxKTsgXAorCXN0ZCByMTksKHRvcF9wb3MgLSA5NikoJXIxKTsgXAorCXN0ZCByMTgsKHRvcF9wb3MgLSAxMDQpKCVyMSk7IFwKKwlzdGQgcjE3LCh0b3BfcG9zIC0gMTEyKSglcjEpOyBcCisJc3RkIHIxNiwodG9wX3BvcyAtIDEyMCkoJXIxKTsgXAorCXN0ZCByMTUsKHRvcF9wb3MgLSAxMjgpKCVyMSk7IFwKKwlzdGQgcjE0LCh0b3BfcG9zIC0gMTM2KSglcjEpCisKKyNkZWZpbmUgX19QT1BfTlZSRUdTKHRvcF9wb3MpOyBcCisJbGQgcjMxLCh0b3BfcG9zKSglcjEpOyBcCisJbGQgcjMwLCh0b3BfcG9zIC0gOCkoJXIxKTsgXAorCWxkIHIyOSwodG9wX3BvcyAtIDE2KSglcjEpOyBcCisJbGQgcjI4LCh0b3BfcG9zIC0gMjQpKCVyMSk7IFwKKwlsZCByMjcsKHRvcF9wb3MgLSAzMikoJXIxKTsgXAorCWxkIHIyNiwodG9wX3BvcyAtIDQwKSglcjEpOyBcCisJbGQgcjI1LCh0b3BfcG9zIC0gNDgpKCVyMSk7IFwKKwlsZCByMjQsKHRvcF9wb3MgLSA1NikoJXIxKTsgXAorCWxkIHIyMywodG9wX3BvcyAtIDY0KSglcjEpOyBcCisJbGQgcjIyLCh0b3BfcG9zIC0gNzIpKCVyMSk7IFwKKwlsZCByMjEsKHRvcF9wb3MgLSA4MCkoJXIxKTsgXAorCWxkIHIyMCwodG9wX3BvcyAtIDg4KSglcjEpOyBcCisJbGQgcjE5LCh0b3BfcG9zIC0gOTYpKCVyMSk7IFwKKwlsZCByMTgsKHRvcF9wb3MgLSAxMDQpKCVyMSk7IFwKKwlsZCByMTcsKHRvcF9wb3MgLSAxMTIpKCVyMSk7IFwKKwlsZCByMTYsKHRvcF9wb3MgLSAxMjApKCVyMSk7IFwKKwlsZCByMTUsKHRvcF9wb3MgLSAxMjgpKCVyMSk7IFwKKwlsZCByMTQsKHRvcF9wb3MgLSAxMzYpKCVyMSkKKworI2RlZmluZSBQVVNIX05WUkVHUyhzdGFja19zaXplKSBcCisJX19QVVNIX05WUkVHUyhzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUpCisKKy8qIDE4IE5WIEZQVSBSRUdTICovCisjZGVmaW5lIFBVU0hfTlZSRUdTX0JFTE9XX0ZQVShzdGFja19zaXplKSBcCisJX19QVVNIX05WUkVHUyhzdGFja19zaXplICsgU1RBQ0tfRlJBTUVfTUlOX1NJWkUgLSAoMTggKiA4KSkKKworI2RlZmluZSBQT1BfTlZSRUdTKHN0YWNrX3NpemUpIFwKKwlfX1BPUF9OVlJFR1Moc3RhY2tfc2l6ZSArIFNUQUNLX0ZSQU1FX01JTl9TSVpFKQorCisvKiAxOCBOViBGUFUgUkVHUyAqLworI2RlZmluZSBQT1BfTlZSRUdTX0JFTE9XX0ZQVShzdGFja19zaXplKSBcCisJX19QT1BfTlZSRUdTKHN0YWNrX3NpemUgKyBTVEFDS19GUkFNRV9NSU5fU0laRSAtICgxOCAqIDgpKQorCisvKgorICogQ2FyZWZ1bCBjYWxsaW5nIHRoaXMsIGl0IHdpbGwgJ2Nsb2JiZXInIE5WR1BScyAoYnkgZGVzaWduKQorICogRG9uJ3QgY2FsbCB0aGlzIGZyb20gQworICovCitGVU5DX1NUQVJUKGxvYWRfZ3ByKQorCWxkCXIxNCwwKHIzKQorCWxkCXIxNSw4KHIzKQorCWxkCXIxNiwxNihyMykKKwlsZAlyMTcsMjQocjMpCisJbGQJcjE4LDMyKHIzKQorCWxkCXIxOSw0MChyMykKKwlsZAlyMjAsNDgocjMpCisJbGQJcjIxLDU2KHIzKQorCWxkCXIyMiw2NChyMykKKwlsZAlyMjMsNzIocjMpCisJbGQJcjI0LDgwKHIzKQorCWxkCXIyNSw4OChyMykKKwlsZAlyMjYsOTYocjMpCisJbGQJcjI3LDEwNChyMykKKwlsZAlyMjgsMTEyKHIzKQorCWxkCXIyOSwxMjAocjMpCisJbGQJcjMwLDEyOChyMykKKwlsZAlyMzEsMTM2KHIzKQorCWJscgorRlVOQ19FTkQobG9hZF9ncHIpCisKKworI2VuZGlmIC8qIF9TRUxGVEVTVFNfUE9XRVJQQ19HUFJfQVNNX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvaGFybmVzcy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9oYXJuZXNzLmMKaW5kZXggNTJmOWJlNy4uMjQ4YTgyMCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9oYXJuZXNzLmMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9oYXJuZXNzLmMKQEAgLTE5LDkgKzE5LDkgQEAKICNpbmNsdWRlICJzdWJ1bml0LmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKIAotI2RlZmluZSBUSU1FT1VUCQkxMjAKICNkZWZpbmUgS0lMTF9USU1FT1VUCTUKIAorc3RhdGljIHVpbnQ2NF90IHRpbWVvdXQgPSAxMjA7CiAKIGludCBydW5fdGVzdChpbnQgKHRlc3RfZnVuY3Rpb24pKHZvaWQpLCBjaGFyICpuYW1lKQogewpAQCAtNDQsNyArNDQsNyBAQAogCXNldHBnaWQocGlkLCBwaWQpOwogCiAJLyogV2FrZSB1cyB1cCBpbiB0aW1lb3V0IHNlY29uZHMgKi8KLQlhbGFybShUSU1FT1VUKTsKKwlhbGFybSh0aW1lb3V0KTsKIAl0ZXJtaW5hdGVkID0gZmFsc2U7CiAKIHdhaXQ6CkBAIC05NCw2ICs5NCwxMSBAQAogCS5zYV9oYW5kbGVyID0gYWxhcm1faGFuZGxlciwKIH07CiAKK3ZvaWQgdGVzdF9oYXJuZXNzX3NldF90aW1lb3V0KHVpbnQ2NF90IHRpbWUpCit7CisJdGltZW91dCA9IHRpbWU7Cit9CisKIGludCB0ZXN0X2hhcm5lc3MoaW50ICh0ZXN0X2Z1bmN0aW9uKSh2b2lkKSwgY2hhciAqbmFtZSkKIHsKIAlpbnQgcmM7CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21hdGgvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21hdGgvTWFrZWZpbGUKaW5kZXggNWI4ODg3NS4uYTUwNWI2NiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9tYXRoL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvbWF0aC9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKLVRFU1RfUFJPR1MgOj0gZnB1X3N5c2NhbGwgZnB1X3ByZWVtcHQgZnB1X3NpZ25hbCB2bXhfc3lzY2FsbCB2bXhfcHJlZW1wdCB2bXhfc2lnbmFsCitURVNUX1BST0dTIDo9IGZwdV9zeXNjYWxsIGZwdV9wcmVlbXB0IGZwdV9zaWduYWwgdm14X3N5c2NhbGwgdm14X3ByZWVtcHQgdm14X3NpZ25hbCB2c3hfcHJlZW1wdAogCiBhbGw6ICQoVEVTVF9QUk9HUykKIApAQCAtMTMsNiArMTMsOSBAQAogdm14X3ByZWVtcHQ6IHZteF9hc20uUwogdm14X3NpZ25hbDogdm14X2FzbS5TCiAKK3ZzeF9wcmVlbXB0OiBDRkxBR1MgKz0gLW12c3gKK3ZzeF9wcmVlbXB0OiB2c3hfYXNtLlMKKwogaW5jbHVkZSAuLi8uLi9saWIubWsKIAogY2xlYW46CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21hdGgvZnB1X2FzbS5TIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9tYXRoL2ZwdV9hc20uUwppbmRleCBmMzcxMWQ4Li4yNDFmMDY3IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21hdGgvZnB1X2FzbS5TCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvbWF0aC9mcHVfYXNtLlMKQEAgLTgsNzAgKzgsNyBAQAogICovCiAKICNpbmNsdWRlICIuLi9iYXNpY19hc20uaCIKLQotI2RlZmluZSBQVVNIX0ZQVShwb3MpIFwKLQlzdGZkCWYxNCxwb3Moc3ApOyBcCi0Jc3RmZAlmMTUscG9zKzgoc3ApOyBcCi0Jc3RmZAlmMTYscG9zKzE2KHNwKTsgXAotCXN0ZmQJZjE3LHBvcysyNChzcCk7IFwKLQlzdGZkCWYxOCxwb3MrMzIoc3ApOyBcCi0Jc3RmZAlmMTkscG9zKzQwKHNwKTsgXAotCXN0ZmQJZjIwLHBvcys0OChzcCk7IFwKLQlzdGZkCWYyMSxwb3MrNTYoc3ApOyBcCi0Jc3RmZAlmMjIscG9zKzY0KHNwKTsgXAotCXN0ZmQJZjIzLHBvcys3MihzcCk7IFwKLQlzdGZkCWYyNCxwb3MrODAoc3ApOyBcCi0Jc3RmZAlmMjUscG9zKzg4KHNwKTsgXAotCXN0ZmQJZjI2LHBvcys5NihzcCk7IFwKLQlzdGZkCWYyNyxwb3MrMTA0KHNwKTsgXAotCXN0ZmQJZjI4LHBvcysxMTIoc3ApOyBcCi0Jc3RmZAlmMjkscG9zKzEyMChzcCk7IFwKLQlzdGZkCWYzMCxwb3MrMTI4KHNwKTsgXAotCXN0ZmQJZjMxLHBvcysxMzYoc3ApOwotCi0jZGVmaW5lIFBPUF9GUFUocG9zKSBcCi0JbGZkCWYxNCxwb3Moc3ApOyBcCi0JbGZkCWYxNSxwb3MrOChzcCk7IFwKLQlsZmQJZjE2LHBvcysxNihzcCk7IFwKLQlsZmQJZjE3LHBvcysyNChzcCk7IFwKLQlsZmQJZjE4LHBvcyszMihzcCk7IFwKLQlsZmQJZjE5LHBvcys0MChzcCk7IFwKLQlsZmQJZjIwLHBvcys0OChzcCk7IFwKLQlsZmQJZjIxLHBvcys1NihzcCk7IFwKLQlsZmQJZjIyLHBvcys2NChzcCk7IFwKLQlsZmQJZjIzLHBvcys3MihzcCk7IFwKLQlsZmQJZjI0LHBvcys4MChzcCk7IFwKLQlsZmQJZjI1LHBvcys4OChzcCk7IFwKLQlsZmQJZjI2LHBvcys5NihzcCk7IFwKLQlsZmQJZjI3LHBvcysxMDQoc3ApOyBcCi0JbGZkCWYyOCxwb3MrMTEyKHNwKTsgXAotCWxmZAlmMjkscG9zKzEyMChzcCk7IFwKLQlsZmQJZjMwLHBvcysxMjgoc3ApOyBcCi0JbGZkCWYzMSxwb3MrMTM2KHNwKTsKLQotIyBDYXJlZnVsIGNhbGxpbmcgdGhpcywgaXQgd2lsbCAnY2xvYmJlcicgZnB1IChieSBkZXNpZ24pCi0jIERvbid0IGNhbGwgdGhpcyBmcm9tIEMKLUZVTkNfU1RBUlQobG9hZF9mcHUpCi0JbGZkCWYxNCwwKHIzKQotCWxmZAlmMTUsOChyMykKLQlsZmQJZjE2LDE2KHIzKQotCWxmZAlmMTcsMjQocjMpCi0JbGZkCWYxOCwzMihyMykKLQlsZmQJZjE5LDQwKHIzKQotCWxmZAlmMjAsNDgocjMpCi0JbGZkCWYyMSw1NihyMykKLQlsZmQJZjIyLDY0KHIzKQotCWxmZAlmMjMsNzIocjMpCi0JbGZkCWYyNCw4MChyMykKLQlsZmQJZjI1LDg4KHIzKQotCWxmZAlmMjYsOTYocjMpCi0JbGZkCWYyNywxMDQocjMpCi0JbGZkCWYyOCwxMTIocjMpCi0JbGZkCWYyOSwxMjAocjMpCi0JbGZkCWYzMCwxMjgocjMpCi0JbGZkCWYzMSwxMzYocjMpCi0JYmxyCi1GVU5DX0VORChsb2FkX2ZwdSkKKyNpbmNsdWRlICIuLi9mcHVfYXNtLmgiCiAKIEZVTkNfU1RBUlQoY2hlY2tfZnB1KQogCW1yIHI0LHIzCkBAIC0xMzgsOSArNzUsOSBAQAogCSMgcjQgaG9sZHMgcG9pbnRlciB0byB0aGUgcGlkCiAJIyBmMTQtZjMxIGFyZSBub24gdm9sYXRpbGVzCiAJUFVTSF9CQVNJQ19TVEFDSygyNTYpCisJUFVTSF9GUFUoMjU2KQogCXN0ZAlyMyxTVEFDS19GUkFNRV9QQVJBTSgwKShzcCkgIyBBZGRyZXNzIG9mIGRhcnJheQogCXN0ZCByNCxTVEFDS19GUkFNRV9QQVJBTSgxKShzcCkgIyBBZGRyZXNzIG9mIHBpZAotCVBVU0hfRlBVKFNUQUNLX0ZSQU1FX0xPQ0FMKDIsMCkpCiAKIAlibCBsb2FkX2ZwdQogCW5vcApAQCAtMTU1LDcgKzkyLDcgQEAKIAlibCBjaGVja19mcHUKIAlub3AKIAotCVBPUF9GUFUoU1RBQ0tfRlJBTUVfTE9DQUwoMiwwKSkKKwlQT1BfRlBVKDI1NikKIAlQT1BfQkFTSUNfU1RBQ0soMjU2KQogCWJscgogRlVOQ19FTkQodGVzdF9mcHUpCkBAIC0xNjYsMTAgKzEwMywxMCBAQAogIyByZWdpc3RlcnMgd2hpbGUgcnVubmluZyBpcyBub3QgemVyby4KIEZVTkNfU1RBUlQocHJlZW1wdF9mcHUpCiAJUFVTSF9CQVNJQ19TVEFDSygyNTYpCisJUFVTSF9GUFUoMjU2KQogCXN0ZCByMyxTVEFDS19GUkFNRV9QQVJBTSgwKShzcCkgIyBkb3VibGUgKmRhcnJheQogCXN0ZCByNCxTVEFDS19GUkFNRV9QQVJBTSgxKShzcCkgIyBpbnQgKnRocmVhZHNfc3RhcnRpbmcKIAlzdGQgcjUsU1RBQ0tfRlJBTUVfUEFSQU0oMikoc3ApICMgaW50ICpydW5uaW5nCi0JUFVTSF9GUFUoU1RBQ0tfRlJBTUVfTE9DQUwoMywwKSkKIAogCWJsIGxvYWRfZnB1CiAJbm9wCkBAIC0xOTIsNyArMTI5LDcgQEAKIAljbXB3aSByNSwwCiAJYm5lIDJiCiAKLTM6CVBPUF9GUFUoU1RBQ0tfRlJBTUVfTE9DQUwoMywwKSkKKzM6CVBPUF9GUFUoMjU2KQogCVBPUF9CQVNJQ19TVEFDSygyNTYpCiAJYmxyCiBGVU5DX0VORChwcmVlbXB0X2ZwdSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvbWF0aC92bXhfYXNtLlMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21hdGgvdm14X2FzbS5TCmluZGV4IDFiOGMyNDguLmZkNzRkYTQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvbWF0aC92bXhfYXNtLlMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9tYXRoL3ZteF9hc20uUwpAQCAtOCw5MCArOCw3IEBACiAgKi8KIAogI2luY2x1ZGUgIi4uL2Jhc2ljX2FzbS5oIgotCi0jIFBPUyBNVVNUIEJFIDE2IEFMSUdORUQhCi0jZGVmaW5lIFBVU0hfVk1YKHBvcyxyZWcpIFwKLQlsaQlyZWcscG9zOyBcCi0Jc3R2eAl2MjAscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0Jc3R2eAl2MjEscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0Jc3R2eAl2MjIscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0Jc3R2eAl2MjMscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0Jc3R2eAl2MjQscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0Jc3R2eAl2MjUscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0Jc3R2eAl2MjYscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0Jc3R2eAl2MjcscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0Jc3R2eAl2MjgscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0Jc3R2eAl2MjkscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0Jc3R2eAl2MzAscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0Jc3R2eAl2MzEscmVnLHNwOwotCi0jIFBPUyBNVVNUIEJFIDE2IEFMSUdORUQhCi0jZGVmaW5lIFBPUF9WTVgocG9zLHJlZykgXAotCWxpCXJlZyxwb3M7IFwKLQlsdngJdjIwLHJlZyxzcDsgXAotCWFkZGkJcmVnLHJlZywxNjsgXAotCWx2eAl2MjEscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0JbHZ4CXYyMixyZWcsc3A7IFwKLQlhZGRpCXJlZyxyZWcsMTY7IFwKLQlsdngJdjIzLHJlZyxzcDsgXAotCWFkZGkJcmVnLHJlZywxNjsgXAotCWx2eAl2MjQscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0JbHZ4CXYyNSxyZWcsc3A7IFwKLQlhZGRpCXJlZyxyZWcsMTY7IFwKLQlsdngJdjI2LHJlZyxzcDsgXAotCWFkZGkJcmVnLHJlZywxNjsgXAotCWx2eAl2MjcscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0JbHZ4CXYyOCxyZWcsc3A7IFwKLQlhZGRpCXJlZyxyZWcsMTY7IFwKLQlsdngJdjI5LHJlZyxzcDsgXAotCWFkZGkJcmVnLHJlZywxNjsgXAotCWx2eAl2MzAscmVnLHNwOyBcCi0JYWRkaQlyZWcscmVnLDE2OyBcCi0JbHZ4CXYzMSxyZWcsc3A7Ci0KLSMgQ2FyZWZ1bGwgdGhpcyB3aWxsICdjbG9iYmVyJyB2bXggKGJ5IGRlc2lnbikKLSMgRG9uJ3QgY2FsbCB0aGlzIGZyb20gQwotRlVOQ19TVEFSVChsb2FkX3ZteCkKLQlsaQlyNSwwCi0JbHZ4CXYyMCxyNSxyMwotCWFkZGkJcjUscjUsMTYKLQlsdngJdjIxLHI1LHIzCi0JYWRkaQlyNSxyNSwxNgotCWx2eAl2MjIscjUscjMKLQlhZGRpCXI1LHI1LDE2Ci0JbHZ4CXYyMyxyNSxyMwotCWFkZGkJcjUscjUsMTYKLQlsdngJdjI0LHI1LHIzCi0JYWRkaQlyNSxyNSwxNgotCWx2eAl2MjUscjUscjMKLQlhZGRpCXI1LHI1LDE2Ci0JbHZ4CXYyNixyNSxyMwotCWFkZGkJcjUscjUsMTYKLQlsdngJdjI3LHI1LHIzCi0JYWRkaQlyNSxyNSwxNgotCWx2eAl2MjgscjUscjMKLQlhZGRpCXI1LHI1LDE2Ci0JbHZ4CXYyOSxyNSxyMwotCWFkZGkJcjUscjUsMTYKLQlsdngJdjMwLHI1LHIzCi0JYWRkaQlyNSxyNSwxNgotCWx2eAl2MzEscjUscjMKLQlibHIKLUZVTkNfRU5EKGxvYWRfdm14KQorI2luY2x1ZGUgIi4uL3ZteF9hc20uaCIKIAogIyBTaG91bGQgYmUgc2FmZSBmcm9tIEMsIG9ubHkgdG91Y2hlcyByNCwgcjUgYW5kIHYwLHYxLHYyCiBGVU5DX1NUQVJUKGNoZWNrX3ZteCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvbWF0aC92c3hfYXNtLlMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21hdGgvdnN4X2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMTBkZDgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21hdGgvdnN4X2FzbS5TCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSwgQ3lyaWwgQnVyLCBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICIuLi9iYXNpY19hc20uaCIKKyNpbmNsdWRlICIuLi92c3hfYXNtLmgiCisKKyNsb25nIGNoZWNrX3ZzeCh2ZWN0b3IgaW50ICpyMyk7CisjVGhpcyBmdW5jdGlvbiB3cmFwcyBzdG9yZWluZyBWU1ggcmVncyB0byB0aGUgZW5kIG9mIGFuIGFycmF5IGFuZCBhCisjY2FsbCB0byBhIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gQyB3aGljaCBib2lscyBkb3duIHRvIGEgbWVtY21wKCkKK0ZVTkNfU1RBUlQoY2hlY2tfdnN4KQorCVBVU0hfQkFTSUNfU1RBQ0soMzIpCisJc3RkCXIzLFNUQUNLX0ZSQU1FX1BBUkFNKDApKHNwKQorCWFkZGkgcjMsIHIzLCAxNiAqIDEyICNTZWNvbmQgaGFsZiBvZiBhcnJheQorCWJsIHN0b3JlX3ZzeAorCWxkIHIzLFNUQUNLX0ZSQU1FX1BBUkFNKDApKHNwKQorCWJsIHZzeF9tZW1jbXAKKwlQT1BfQkFTSUNfU1RBQ0soMzIpCisJYmxyCitGVU5DX0VORChjaGVja192c3gpCisKKyMgaW50IHByZWVtcHRfdm14KHZlY3RvciBpbnQgKnZhcnJheSwgaW50ICp0aHJlYWRzX3N0YXJ0aW5nLAorIyAgICAgICAgICAgICAgICAgaW50ICpydW5uaW5nKTsKKyMgT24gc3RhcnRpbmcgd2lsbCAoYXRvbWljYWxseSkgZGVjcmVtZW50IHRocmVhZHNfc3RhcnRpbmcgYXMgYSBzaWduYWwKKyMgdGhhdCB0aGUgVk1YIGhhdmUgYmVlbiBsb2FkZWQgd2l0aCB2YXJyYXkuIFdpbGwgcHJvY2VlZCB0byBjaGVjayB0aGUKKyMgdmFsaWRpdHkgb2YgdGhlIFZNWCByZWdpc3RlcnMgd2hpbGUgcnVubmluZyBpcyBub3QgemVyby4KK0ZVTkNfU1RBUlQocHJlZW1wdF92c3gpCisJUFVTSF9CQVNJQ19TVEFDSyg1MTIpCisJc3RkIHIzLFNUQUNLX0ZSQU1FX1BBUkFNKDApKHNwKSAjIHZlY3RvciBpbnQgKnZhcnJheQorCXN0ZCByNCxTVEFDS19GUkFNRV9QQVJBTSgxKShzcCkgIyBpbnQgKnRocmVhZHNfc3RhcnRpbmcKKwlzdGQgcjUsU1RBQ0tfRlJBTUVfUEFSQU0oMikoc3ApICMgaW50ICpydW5uaW5nCisKKwlibCBsb2FkX3ZzeAorCW5vcAorCisJc3luYworCSMgQXRvbWljIERFQworCWxkIHIzLFNUQUNLX0ZSQU1FX1BBUkFNKDEpKHNwKQorMToJbHdhcnggcjQsMCxyMworCWFkZGkgcjQscjQsLTEKKwlzdHdjeC4gcjQsMCxyMworCWJuZS0gMWIKKworMjoJbGQgcjMsU1RBQ0tfRlJBTUVfUEFSQU0oMCkoc3ApCisJYmwgY2hlY2tfdnN4CisJbm9wCisJY21wZGkgcjMsMAorCWJuZSAzZgorCWxkIHI0LFNUQUNLX0ZSQU1FX1BBUkFNKDIpKHNwKQorCWxkIHI1LDAocjQpCisJY21wd2kgcjUsMAorCWJuZSAyYgorCiszOglQT1BfQkFTSUNfU1RBQ0soNTEyKQorCWJscgorRlVOQ19FTkQocHJlZW1wdF92c3gpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21hdGgvdnN4X3ByZWVtcHQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvbWF0aC92c3hfcHJlZW1wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODdmMDMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21hdGgvdnN4X3ByZWVtcHQuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1LCBDeXJpbCBCdXIsIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyB0ZXN0IGF0dGVtcHRzIHRvIHNlZSBpZiB0aGUgVlNYIHJlZ2lzdGVycyBjaGFuZ2UgYWNyb3NzIHByZWVtcHRpb24uCisgKiBUaGVyZSBpcyBubyB3YXkgdG8gYmUgc3VyZSBwcmVlbXB0aW9uIGhhcHBlbmVkIHNvIHRoaXMgdGVzdCBqdXN0CisgKiB1c2VzIG1hbnkgdGhyZWFkcyBhbmQgYSBsb25nIHdhaXQuIEFzIHN1Y2gsIGEgc3VjY2Vzc2Z1bCB0ZXN0CisgKiBkb2Vzbid0IG1lYW4gbXVjaCBidXQgYSBmYWlsdXJlIGlzIGJhZC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorCisvKiBUaW1lIHRvIHdhaXQgZm9yIHdvcmtlcnMgdG8gZ2V0IHByZWVtcHRlZCAoc2Vjb25kcykgKi8KKyNkZWZpbmUgUFJFRU1QVF9USU1FIDIwCisvKgorICogRmFjdG9yIGJ5IHdoaWNoIHRvIG11bHRpcGx5IG51bWJlciBvZiBvbmxpbmUgQ1BVcyBmb3IgdG90YWwgbnVtYmVyIG9mCisgKiB3b3JrZXIgdGhyZWFkcworICovCisjZGVmaW5lIFRIUkVBRF9GQUNUT1IgOAorCisvKgorICogRW5zdXJlIHRoZXJlIGlzIHR3aWNlIHRoZSBudW1iZXIgb2Ygbm9uLXZvbGF0aWxlIFZNWCByZWdzIQorICogY2hlY2tfdm14KCkgaXMgZ29pbmcgdG8gdXNlIHRoZSBvdGhlciBoYWxmIGFzIHNwYWNlIHRvIHB1dCB0aGUgbGl2ZQorICogcmVnaXN0ZXJzIGJlZm9yZSBjYWxsaW5nIHZzeF9tZW1jbXAoKQorICovCitfX3RocmVhZCB2ZWN0b3IgaW50IHZhcnJheVsyNF0gPSB7CisJezEsIDIsIDMsIDQgfSwgezUsIDYsIDcsIDggfSwgezksIDEwLDExLDEyfSwKKwl7MTMsMTQsMTUsMTZ9LCB7MTcsMTgsMTksMjB9LCB7MjEsMjIsMjMsMjR9LAorCXsyNSwyNiwyNywyOH0sIHsyOSwzMCwzMSwzMn0sIHszMywzNCwzNSwzNn0sCisJezM3LDM4LDM5LDQwfSwgezQxLDQyLDQzLDQ0fSwgezQ1LDQ2LDQ3LDQ4fQorfTsKKworaW50IHRocmVhZHNfc3RhcnRpbmc7CitpbnQgcnVubmluZzsKKworZXh0ZXJuIGxvbmcgcHJlZW1wdF92c3godmVjdG9yIGludCAqdmFycmF5LCBpbnQgKnRocmVhZHNfc3RhcnRpbmcsIGludCAqcnVubmluZyk7CisKK2xvbmcgdnN4X21lbWNtcCh2ZWN0b3IgaW50ICphKSB7CisJdmVjdG9yIGludCB6ZXJvID0gezAsIDAsIDAsIDB9OworCWludCBpOworCisJRkFJTF9JRihhICE9IHZhcnJheSk7CisKKwlmb3IoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisJCWlmIChtZW1jbXAoJmFbaSArIDEyXSwgJnplcm8sIHNpemVvZih2ZWN0b3IgaW50KSkgPT0gMCkgeworCQkJZnByaW50ZihzdGRlcnIsICJEZXRlY3RlZCB6ZXJvIGZyb20gdGhlIFZTWCByZWcgJWRcbiIsIGkgKyAxMik7CisJCQlyZXR1cm4gMjsKKwkJfQorCX0KKworCWlmIChtZW1jbXAoYSwgJmFbMTJdLCAxMiAqIHNpemVvZih2ZWN0b3IgaW50KSkpIHsKKwkJbG9uZyAqcCA9IChsb25nICopYTsKKwkJZnByaW50ZihzdGRlcnIsICJWU1ggbWlzbWF0Y2hcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgMjQ7IGk9aSsyKQorCQkJZnByaW50ZihzdGRlcnIsICIlZDogMHglMDhseCUwOGx4IHwgMHglMDhseCUwOGx4XG4iLAorCQkJCQlpLzIgKyBpJTIgKyAyMCwgcFtpXSwgcFtpICsgMV0sIHBbaSArIDI0XSwgcFtpICsgMjVdKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCit2b2lkICpwcmVlbXB0X3ZzeF9jKHZvaWQgKnApCit7CisJaW50IGksIGo7CisJbG9uZyByYzsKKwlzcmFuZChwdGhyZWFkX3NlbGYoKSk7CisJZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKwkJCXZhcnJheVtpXVtqXSA9IHJhbmQoKTsKKwkJCS8qIERvbid0IHdhbnQgemVybyBiZWNhdXNlIGl0IGhpZGVzIGtlcm5lbCBwcm9ibGVtcyAqLworCQkJaWYgKHZhcnJheVtpXVtqXSA9PSAwKQorCQkJCWotLTsKKwkJfQorCXJjID0gcHJlZW1wdF92c3godmFycmF5LCAmdGhyZWFkc19zdGFydGluZywgJnJ1bm5pbmcpOworCWlmIChyYyA9PSAyKQorCQlmcHJpbnRmKHN0ZGVyciwgIkNhdWdodCB6ZXJvcyBpbiBWU1ggY29tcGFyZXNcbiIpOworCXJldHVybiAodm9pZCAqKXJjOworfQorCitpbnQgdGVzdF9wcmVlbXB0X3ZzeCh2b2lkKQoreworCWludCBpLCByYywgdGhyZWFkczsKKwlwdGhyZWFkX3QgKnRpZHM7CisKKwl0aHJlYWRzID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTikgKiBUSFJFQURfRkFDVE9SOworCXRpZHMgPSBtYWxsb2ModGhyZWFkcyAqIHNpemVvZihwdGhyZWFkX3QpKTsKKwlGQUlMX0lGKCF0aWRzKTsKKworCXJ1bm5pbmcgPSB0cnVlOworCXRocmVhZHNfc3RhcnRpbmcgPSB0aHJlYWRzOworCWZvciAoaSA9IDA7IGkgPCB0aHJlYWRzOyBpKyspIHsKKwkJcmMgPSBwdGhyZWFkX2NyZWF0ZSgmdGlkc1tpXSwgTlVMTCwgcHJlZW1wdF92c3hfYywgTlVMTCk7CisJCUZBSUxfSUYocmMpOworCX0KKworCXNldGJ1ZihzdGRvdXQsIE5VTEwpOworCS8qIE5vdCByZWFsbHkgbmVzc2VzYXJ5IGJ1dCBuaWNlIHRvIHdhaXQgZm9yIGV2ZXJ5IHRocmVhZCB0byBzdGFydCAqLworCXByaW50ZigiXHRXYWl0aW5nIGZvciAlZCB3b3JrZXJzIHRvIHN0YXJ0Li4uIiwgdGhyZWFkc19zdGFydGluZyk7CisJd2hpbGUodGhyZWFkc19zdGFydGluZykKKwkJYXNtIHZvbGF0aWxlKCIiOiA6IDoibWVtb3J5Iik7CisJcHJpbnRmKCJkb25lXG4iKTsKKworCXByaW50ZigiXHRXYWl0aW5nIGZvciAlZCBzZWNvbmRzIHRvIGxldCBzb21lIHdvcmtlcnMgZ2V0IHByZWVtcHRlZC4uLiIsIFBSRUVNUFRfVElNRSk7CisJc2xlZXAoUFJFRU1QVF9USU1FKTsKKwlwcmludGYoImRvbmVcbiIpOworCisJcHJpbnRmKCJcdFN0b3BwaW5nIHdvcmtlcnMuLi4iKTsKKwkvKgorCSAqIFdvcmtpbmcgYXJlIGNoZWNraW5nIHRoaXMgdmFsdWUgZXZlcnkgbG9vcC4gSW4gcHJlZW1wdF92c3ggJ2NtcHdpIHI1LDA7IGJuZSAyYicuCisJICogcjUgd2lsbCBoYXZlIGxvYWRlZCB0aGUgdmFsdWUgb2YgcnVubmluZy4KKwkgKi8KKwlydW5uaW5nID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdGhyZWFkczsgaSsrKSB7CisJCXZvaWQgKnJjX3A7CisJCXB0aHJlYWRfam9pbih0aWRzW2ldLCAmcmNfcCk7CisKKwkJLyoKKwkJICogSGFybmVzcyB3aWxsIHNheSB0aGUgZmFpbCB3YXMgaGVyZSwgbG9vayBhdCB3aHkgcHJlZW1wdF92c3gKKwkJICogcmV0dXJuZWQKKwkJICovCisJCWlmICgobG9uZykgcmNfcCkKKwkJCXByaW50Zigib29wc1xuIik7CisJCUZBSUxfSUYoKGxvbmcpIHJjX3ApOworCX0KKwlwcmludGYoImRvbmVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJcmV0dXJuIHRlc3RfaGFybmVzcyh0ZXN0X3ByZWVtcHRfdnN4LCAidnN4X3ByZWVtcHQiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc2lnbmFsL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9zaWduYWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlZWYyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc2lnbmFsL01ha2VmaWxlCkBAIC0wLDAgKzEsMTMgQEAKK1RFU1RfUFJPR1MgOj0gc2lnbmFsIHNpZ25hbF90bQorCithbGw6ICQoVEVTVF9QUk9HUykKKworJChURVNUX1BST0dTKTogLi4vaGFybmVzcy5jIC4uL3V0aWxzLmMgc2lnbmFsLlMKKworQ0ZMQUdTICs9IC1tYWx0aXZlYworc2lnbmFsX3RtOiBDRkxBR1MgKz0gLW1odG0KKworaW5jbHVkZSAuLi8uLi9saWIubWsKKworY2xlYW46CisJcm0gLWYgJChURVNUX1BST0dTKSAqLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc2lnbmFsL3NpZ25hbC5TIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9zaWduYWwvc2lnbmFsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0M2Q1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc2lnbmFsL3NpZ25hbC5TCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSwgQ3lyaWwgQnVyLCBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICIuLi9iYXNpY19hc20uaCIKKworLyogbG9uZyBzaWduYWxfc2VsZihwaWRfdCBwaWQsIGludCBzaWcpOyAqLworRlVOQ19TVEFSVChzaWduYWxfc2VsZikKKwlsaQlyMCwzNyAvKiBzeXNfa2lsbCAqLworCS8qIHIzIGFscmVhZHkgaGFzIG91ciBwaWQgaW4gaXQgKi8KKwkvKiByNCBhbHJlYWR5IGhhcyBzaWduYWwgdHlwZSBpbiBpdCAqLworCXNjCisJYmMJNCwzLDFmCisJc3ViZnplCXIzLHIzCisxOglibHIKK0ZVTkNfRU5EKHNpZ25hbF9zZWxmKQorCisvKiBsb25nIHRtX3NpZ25hbF9zZWxmKHBpZF90IHBpZCwgaW50IHNpZywgaW50ICpyZXQpOyAqLworRlVOQ19TVEFSVCh0bV9zaWduYWxfc2VsZikKKwlQVVNIX0JBU0lDX1NUQUNLKDgpCisJc3RkCXI1LFNUQUNLX0ZSQU1FX1BBUkFNKDApKHNwKSAvKiByZXQgKi8KKwl0YmVnaW4uCisJYmVxCTFmCisJdHN1c3BlbmQuCisJbGkJcjAsMzcgLyogc3lzX2tpbGwgKi8KKwkvKiByMyBhbHJlYWR5IGhhcyBvdXIgcGlkIGluIGl0ICovCisJLyogcjQgYWxyZWFkeSBoYXMgc2lnbmFsIHR5cGUgaW4gaXQgKi8KKwlzYworCWxkCXI1LFNUQUNLX0ZSQU1FX1BBUkFNKDApKHNwKSAvKiByZXQgKi8KKwliYwk0LDMsMmYKKwlzdWJmemUJcjMscjMKKzI6CXN0ZAlyMywwKHI1KQorCXRhYm9ydC4gMAorCXRyZXN1bWUuIC8qIEJlIG5pY2UgdG8gc29tZSBjbGVhbnVwLCBqdW1wcyBiYWNrIHRvIHRiZWdpbiB0aGVuIHRvIDE6ICovCisJLyoKKwkgKiBUcmFuc2FjdGlvbiBzaG91bGQgYmUgcHJvcGVyIGRvb21lZCBhbmQgd2Ugc2hvdWxkIG5ldmVyIGdldAorCSAqIGhlcmUKKwkgKi8KKwlsaQlyMywxCisJUE9QX0JBU0lDX1NUQUNLKDgpCisJYmxyCisxOglsaQlyMywwCisJUE9QX0JBU0lDX1NUQUNLKDgpCisJYmxyCitGVU5DX0VORCh0bV9zaWduYWxfc2VsZikKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc2lnbmFsL3NpZ25hbC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9zaWduYWwvc2lnbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkZWRkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc2lnbmFsL3NpZ25hbC5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYsIEN5cmlsIEJ1ciwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBTZW5kaW5nIG9uZSBzZWxmIGEgc2lnbmFsIHNob3VsZCBhbHdheXMgZ2V0IGRlbGl2ZXJlZC4KKyAqLworCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWx0aXZlYy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2RlZmluZSBNQVhfQVRURU1QVCA1MDAwMDAKKyNkZWZpbmUgVElNRU9VVCA1CisKK2V4dGVybiBsb25nIHNpZ25hbF9zZWxmKHBpZF90IHBpZCwgaW50IHNpZyk7CisKK3N0YXRpYyBzaWdfYXRvbWljX3Qgc2lnbmFsZWQ7CitzdGF0aWMgc2lnX2F0b21pY190IGZhaWw7CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpCit7CisJaWYgKHNpZyA9PSBTSUdVU1IxKQorCQlzaWduYWxlZCA9IDE7CisJZWxzZQorCQlmYWlsID0gMTsKK30KKworc3RhdGljIGludCB0ZXN0X3NpZ25hbCgpCit7CisJaW50IGk7CisJc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisJcGlkX3QgcHBpZCA9IGdldHBpZCgpOworCXBpZF90IHBpZDsKKworCWFjdC5zYV9oYW5kbGVyID0gc2lnbmFsX2hhbmRsZXI7CisJYWN0LnNhX2ZsYWdzID0gMDsKKwlzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOworCWlmIChzaWdhY3Rpb24oU0lHVVNSMSwgJmFjdCwgTlVMTCkgPCAwKSB7CisJCXBlcnJvcigic2lnYWN0aW9uIFNJR1VTUjEiKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKHNpZ2FjdGlvbihTSUdBTFJNLCAmYWN0LCBOVUxMKSA8IDApIHsKKwkJcGVycm9yKCJzaWdhY3Rpb24gU0lHQUxSTSIpOworCQlleGl0KDEpOworCX0KKworCS8qIERvbid0IGRvIHRoaXMgZm9yIE1BWF9BVFRFTVBULCBpdHMgc2ltcGx5IHRvbyBsb25nICovCisJZm9yKGkgID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlwaWQgPSBmb3JrKCk7CisJCWlmIChwaWQgPT0gLTEpIHsKKwkJCXBlcnJvcigiZm9yayIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAocGlkID09IDApIHsKKwkJCXNpZ25hbF9zZWxmKHBwaWQsIFNJR1VTUjEpOworCQkJZXhpdCgxKTsKKwkJfSBlbHNlIHsKKwkJCWFsYXJtKDApOyAvKiBEaXNhYmxlIGFueSBwZW5kaW5nICovCisJCQlhbGFybSgyKTsKKwkJCXdoaWxlICghc2lnbmFsZWQgJiYgIWZhaWwpCisJCQkJYXNtIHZvbGF0aWxlKCIiOiA6IDoibWVtb3J5Iik7CisJCQlpZiAoIXNpZ25hbGVkKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJEaWRuJ3QgZ2V0IHNpZ25hbCBmcm9tIGNoaWxkXG4iKTsKKwkJCQlGQUlMX0lGKDEpOyAvKiBGb3IgdGhlIGxpbmUgbnVtYmVyICovCisJCQl9CisJCQkvKiBPdGhlcndpc2Ugd2UnbGwgbG9vcCB0b28gZmFzdCBhbmQgZm9yaygpIHdpbGwgZXZlbnR1YWxseSBmYWlsICovCisJCQl3YWl0cGlkKHBpZCwgTlVMTCwgMCk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FUVEVNUFQ7IGkrKykgeworCQlsb25nIHJjOworCisJCWFsYXJtKDApOyAvKiBEaXNhYmxlIGFueSBwZW5kaW5nICovCisJCXNpZ25hbGVkID0gMDsKKwkJYWxhcm0oVElNRU9VVCk7CisJCXJjID0gc2lnbmFsX3NlbGYocHBpZCwgU0lHVVNSMSk7CisJCWlmIChyYykgeworCQkJZnByaW50ZihzdGRlcnIsICIoJWQpIEZhaWwgcmVhc29uOiAlZCByYz0weCVseCIsCisJCQkJCWksIGZhaWwsIHJjKTsKKwkJCUZBSUxfSUYoMSk7IC8qIEZvciB0aGUgbGluZSBudW1iZXIgKi8KKwkJfQorCQl3aGlsZSAoIXNpZ25hbGVkICYmICFmYWlsKQorCQkJYXNtIHZvbGF0aWxlKCIiOiA6IDoibWVtb3J5Iik7CisJCWlmICghc2lnbmFsZWQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiKCVkKSBGYWlsIHJlYXNvbjogJWQgcmM9MHglbHgiLAorCQkJCQlpLCBmYWlsLCByYyk7CisJCQlGQUlMX0lGKDEpOyAvKiBGb3IgdGhlIGxpbmUgbnVtYmVyICovCisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwl0ZXN0X2hhcm5lc3Nfc2V0X3RpbWVvdXQoMzAwKTsKKwlyZXR1cm4gdGVzdF9oYXJuZXNzKHRlc3Rfc2lnbmFsLCAic2lnbmFsIik7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3NpZ25hbC9zaWduYWxfdG0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc2lnbmFsL3NpZ25hbF90bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzQ1MWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3NpZ25hbC9zaWduYWxfdG0uYwpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE2LCBDeXJpbCBCdXIsIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogU2VuZGluZyBvbmUgc2VsZiBhIHNpZ25hbCBzaG91bGQgYWx3YXlzIGdldCBkZWxpdmVyZWQuCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSAiLi4vdG0vdG0uaCIKKworI2RlZmluZSBNQVhfQVRURU1QVCA1MDAwMDAKKyNkZWZpbmUgVElNRU9VVCAxMAorCitleHRlcm4gbG9uZyB0bV9zaWduYWxfc2VsZihwaWRfdCBwaWQsIGludCBzaWcsIGxvbmcgKnJldCk7CisKK3N0YXRpYyBzaWdfYXRvbWljX3Qgc2lnbmFsZWQ7CitzdGF0aWMgc2lnX2F0b21pY190IGZhaWw7CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpCit7CisJaWYgKHRjaGVja19hY3RpdmUoKSkgeworCQlmYWlsID0gMjsKKwkJcmV0dXJuOworCX0KKworCWlmIChzaWcgPT0gU0lHVVNSMSkKKwkJc2lnbmFsZWQgPSAxOworCWVsc2UKKwkJZmFpbCA9IDE7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9zaWduYWxfdG0oKQoreworCWludCBpOworCXN0cnVjdCBzaWdhY3Rpb24gYWN0OworCisJYWN0LnNhX2hhbmRsZXIgPSBzaWduYWxfaGFuZGxlcjsKKwlhY3Quc2FfZmxhZ3MgPSAwOworCXNpZ2VtcHR5c2V0KCZhY3Quc2FfbWFzayk7CisJaWYgKHNpZ2FjdGlvbihTSUdVU1IxLCAmYWN0LCBOVUxMKSA8IDApIHsKKwkJcGVycm9yKCJzaWdhY3Rpb24gU0lHVVNSMSIpOworCQlleGl0KDEpOworCX0KKwlpZiAoc2lnYWN0aW9uKFNJR0FMUk0sICZhY3QsIE5VTEwpIDwgMCkgeworCQlwZXJyb3IoInNpZ2FjdGlvbiBTSUdBTFJNIik7CisJCWV4aXQoMSk7CisJfQorCisJU0tJUF9JRighaGF2ZV9odG0oKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0FUVEVNUFQ7IGkrKykgeworCQkvKgorCQkgKiBJZiBhbnl0aGluZyBiYWQgaGFwcGVucyBpbiBBU00gYW5kIHdlIGZhaWwgdG8gc2V0IHJldAorCQkgKiBiZWNhdXNlICpoYW5kd2F2ZSogVE0gdGhpcyB3aWxsIGNhdXNlIGZhaWx1cmUKKwkJICovCisJCWxvbmcgcmV0ID0gMHhkZWFkOworCQlsb25nIHJjID0gMHhiZWVmOworCisJCWFsYXJtKDApOyAvKiBEaXNhYmxlIGFueSBwZW5kaW5nICovCisJCXNpZ25hbGVkID0gMDsKKwkJYWxhcm0oVElNRU9VVCk7CisJCUZBSUxfSUYodGNoZWNrX3RyYW5zYWN0aW9uYWwoKSk7CisJCXJjID0gdG1fc2lnbmFsX3NlbGYoZ2V0cGlkKCksIFNJR1VTUjEsICZyZXQpOworCQlpZiAocmV0ID09IDB4ZGVhZCkKKwkJCS8qCisJCQkgKiBUaGlzIGJhc2ljYWxseSBtZWFucyB0aGUgdHJhbnNhY3Rpb24gYWJvcnRlZCBiZWZvcmUgd2UKKwkJCSAqIGV2ZW4gZ290IHRvIHRoZSBzdXNwZW5kLi4uIHRoaXMgaXMgY3JhenkgYnV0IGl0CisJCQkgKiBoYXBwZW5zLgorCQkJICogWWVzIHRoaXMgYWxzbyBtZWFucyB3ZSBtaWdodCBuZXZlciBtYWtlIGZvcndhcmQKKwkJCSAqIHByb2dyZXNzLi4uIHRoZSBhbGFybSgpIHdpbGwgdHJpcCBldmVudHVhbGx5Li4uCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCisJCWlmIChyYyB8fCByZXQpIHsKKwkJCS8qIFJldCBpcyBhY3R1YWxseSBhbiBlcnJubyAqLworCQkJcHJpbnRmKCJURVhBU1IgMHglMDE2bHgsIFRGSUFSIDB4JTAxNmx4XG4iLAorCQkJCQlfX2J1aWx0aW5fZ2V0X3RleGFzcigpLCBfX2J1aWx0aW5fZ2V0X3RmaWFyKCkpOworCQkJZnByaW50ZihzdGRlcnIsICIoJWQpIEZhaWwgcmVhc29uOiAlZCByYz0weCVseCByZXQ9MHglbHhcbiIsCisJCQkJCWksIGZhaWwsIHJjLCByZXQpOworCQkJRkFJTF9JRihyZXQpOworCQl9CisJCXdoaWxlKCFzaWduYWxlZCAmJiAhZmFpbCkKKwkJCWFzbSB2b2xhdGlsZSgiIjogOiA6Im1lbW9yeSIpOworCQlpZiAoIXNpZ25hbGVkKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiglZCkgRmFpbCByZWFzb246ICVkIHJjPTB4JWx4IHJldD0weCVseFxuIiwKKwkJCQkJaSwgZmFpbCwgcmMsIHJldCk7CisJCQlGQUlMX0lGKGZhaWwpOyAvKiBGb3IgdGhlIGxpbmUgbnVtYmVyICovCisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gdGVzdF9oYXJuZXNzKHRlc3Rfc2lnbmFsX3RtLCAic2lnbmFsX3RtIik7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3RtL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy90bS9NYWtlZmlsZQppbmRleCA5ZDMwMWQ3Li5jNmM1M2M4IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3RtL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vTWFrZWZpbGUKQEAgLTEsNSArMSw4IEBACitTSUdOQUxfQ09OVEVYVF9DSEtfVEVTVFMgOj0gdG0tc2lnbmFsLWNvbnRleHQtY2hrLWdwciB0bS1zaWduYWwtY29udGV4dC1jaGstZnB1IFwKKwl0bS1zaWduYWwtY29udGV4dC1jaGstdm14IHRtLXNpZ25hbC1jb250ZXh0LWNoay12c3gKKwogVEVTVF9QUk9HUyA6PSB0bS1yZXNjaGVkLWRzY3IgdG0tc3lzY2FsbCB0bS1zaWduYWwtbXNyLXJlc3YgdG0tc2lnbmFsLXN0YWNrIFwKLQl0bS12bXhjb3B5IHRtLWZvcmsgdG0tdGFyIHRtLXRtc3ByIHRtLWV4ZWMgdG0tZXhlY2VkCisJdG0tdm14Y29weSB0bS1mb3JrIHRtLXRhciB0bS10bXNwciAkKFNJR05BTF9DT05URVhUX0NIS19URVNUUykKIAogYWxsOiAkKFRFU1RfUFJPR1MpCiAKQEAgLTExLDYgKzE0LDkgQEAKIHRtLXN5c2NhbGw6IENGTEFHUyArPSAtSS4uLy4uLy4uLy4uLy4uL3Vzci9pbmNsdWRlCiB0bS10bXNwcjogQ0ZMQUdTICs9IC1wdGhyZWFkCiAKKyQoU0lHTkFMX0NPTlRFWFRfQ0hLX1RFU1RTKTogdG0tc2lnbmFsLlMKKyQoU0lHTkFMX0NPTlRFWFRfQ0hLX1RFU1RTKTogQ0ZMQUdTICs9IC1taHRtIC1tNjQgLW12c3gKKwogaW5jbHVkZSAuLi8uLi9saWIubWsKIAogY2xlYW46CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3RtL3RtLXNpZ25hbC1jb250ZXh0LWNoay1mcHUuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vdG0tc2lnbmFsLWNvbnRleHQtY2hrLWZwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NjBkZWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3RtL3RtLXNpZ25hbC1jb250ZXh0LWNoay1mcHUuYwpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYsIEN5cmlsIEJ1ciwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogVGVzdCB0aGUga2VybmVsJ3Mgc2lnbmFsIGZyYW1lIGNvZGUuCisgKgorICogVGhlIGtlcm5lbCBzZXRzIHVwIHR3byBzZXRzIG9mIHVjb250ZXh0cyBpZiB0aGUgc2lnbmFsIHdhcyB0byBiZQorICogZGVsaXZlcmVkIHdoaWxlIHRoZSB0aHJlYWQgd2FzIGluIGEgdHJhbnNhY3Rpb24uCisgKiBFeHBlY3RlZCBiZWhhdmlvdXIgaXMgdGhhdCB0aGUgY2hlY2twb2ludGVkIHN0YXRlIGlzIGluIHRoZSB1c2VyCisgKiBjb250ZXh0IHBhc3NlZCB0byB0aGUgc2lnbmFsIGhhbmRsZXIuIFRoZSBzcGVjdWxhdGVkIHN0YXRlIGNhbiBiZQorICogYWNjZXNzZWQgd2l0aCB0aGUgdWNfbGluayBwb2ludGVyLgorICoKKyAqIFRoZSByYXRpb25hbGUgZm9yIHRoaXMgaXMgdGhhdCBpZiBUTSB1bmF3YXJlIGNvZGUgKHdoaWNoIGxpbmtlZAorICogYWdhaW5zdCBUTSBsaWJzKSBpbnN0YWxscyBhIHNpZ25hbCBoYW5kbGVyIGl0IHdpbGwgbm90IGtub3cgb2YgdGhlCisgKiBzcGVjdWxhdGl2ZSBuYXR1cmUgb2YgdGhlICdsaXZlJyByZWdpc3RlcnMgYW5kIG1heSBpbmZlciB0aGUgd3JvbmcKKyAqIHRoaW5nLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWx0aXZlYy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0bS5oIgorCisjZGVmaW5lIE1BWF9BVFRFTVBUIDUwMDAwMAorCisjZGVmaW5lIE5WX0ZQVV9SRUdTIDE4CisKK2xvbmcgdG1fc2lnbmFsX3NlbGZfY29udGV4dF9sb2FkKHBpZF90IHBpZCwgbG9uZyAqZ3BycywgZG91YmxlICpmcHMsIHZlY3RvciBpbnQgKnZtcywgdmVjdG9yIGludCAqdnNzKTsKKworLyogQmUgc3VyZSB0aGVyZSBhcmUgMnggYXMgbWFueSBhcyB0aGVyZSBhcmUgTlYgRlBVIHJlZ3MgKDJ4MTgpICovCitzdGF0aWMgZG91YmxlIGZwc1tdID0geworCSAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LAorCS0xLC0yLC0zLC00LC01LC02LC03LC04LC05LC0xMCwtMTEsLTEyLC0xMywtMTQsLTE1LC0xNiwtMTcsLTE4Cit9OworCitzdGF0aWMgc2lnX2F0b21pY190IGZhaWw7CisKK3N0YXRpYyB2b2lkIHNpZ25hbF91c3IxKGludCBzaWdudW0sIHNpZ2luZm9fdCAqaW5mbywgdm9pZCAqdWMpCit7CisJaW50IGk7CisJdWNvbnRleHRfdCAqdWNwID0gdWM7CisJdWNvbnRleHRfdCAqdG1fdWNwID0gdWNwLT51Y19saW5rOworCisJZm9yIChpID0gMDsgaSA8IE5WX0ZQVV9SRUdTICYmICFmYWlsOyBpKyspIHsKKwkJZmFpbCA9ICh1Y3AtPnVjX21jb250ZXh0LmZwX3JlZ3NbaSArIDE0XSAhPSBmcHNbaV0pOworCQlmYWlsIHw9ICh0bV91Y3AtPnVjX21jb250ZXh0LmZwX3JlZ3NbaSArIDE0XSAhPSBmcHNbaSArIE5WX0ZQVV9SRUdTXSk7CisJCWlmIChmYWlsKQorCQkJcHJpbnRmKCJGYWlsZWQgb24gJWQgRlAgJWcgb3IgJWdcbiIsIGksIHVjcC0+dWNfbWNvbnRleHQuZnBfcmVnc1tpICsgMTRdLCB0bV91Y3AtPnVjX21jb250ZXh0LmZwX3JlZ3NbaSArIDE0XSk7CisJfQorfQorCitzdGF0aWMgaW50IHRtX3NpZ25hbF9jb250ZXh0X2Noa19mcHUoKQoreworCXN0cnVjdCBzaWdhY3Rpb24gYWN0OworCWludCBpOworCWxvbmcgcmM7CisJcGlkX3QgcGlkID0gZ2V0cGlkKCk7CisKKwlTS0lQX0lGKCFoYXZlX2h0bSgpKTsKKworCWFjdC5zYV9zaWdhY3Rpb24gPSBzaWduYWxfdXNyMTsKKwlzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOworCWFjdC5zYV9mbGFncyA9IFNBX1NJR0lORk87CisJaWYgKHNpZ2FjdGlvbihTSUdVU1IxLCAmYWN0LCBOVUxMKSA8IDApIHsKKwkJcGVycm9yKCJzaWdhY3Rpb24gc2lndXNyMSIpOworCQlleGl0KDEpOworCX0KKworCWkgPSAwOworCXdoaWxlIChpIDwgTUFYX0FUVEVNUFQgJiYgIWZhaWwpIHsKKwkJcmMgPSB0bV9zaWduYWxfc2VsZl9jb250ZXh0X2xvYWQocGlkLCBOVUxMLCBmcHMsIE5VTEwsIE5VTEwpOworCQlGQUlMX0lGKHJjICE9IHBpZCk7CisJCWkrKzsKKwl9CisKKwlyZXR1cm4gZmFpbDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gdGVzdF9oYXJuZXNzKHRtX3NpZ25hbF9jb250ZXh0X2Noa19mcHUsICJ0bV9zaWduYWxfY29udGV4dF9jaGtfZnB1Iik7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3RtL3RtLXNpZ25hbC1jb250ZXh0LWNoay1ncHIuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vdG0tc2lnbmFsLWNvbnRleHQtY2hrLWdwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTEzMzAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3RtL3RtLXNpZ25hbC1jb250ZXh0LWNoay1ncHIuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYsIEN5cmlsIEJ1ciwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogVGVzdCB0aGUga2VybmVsJ3Mgc2lnbmFsIGZyYW1lIGNvZGUuCisgKgorICogVGhlIGtlcm5lbCBzZXRzIHVwIHR3byBzZXRzIG9mIHVjb250ZXh0cyBpZiB0aGUgc2lnbmFsIHdhcyB0byBiZQorICogZGVsaXZlcmVkIHdoaWxlIHRoZSB0aHJlYWQgd2FzIGluIGEgdHJhbnNhY3Rpb24uCisgKiBFeHBlY3RlZCBiZWhhdmlvdXIgaXMgdGhhdCB0aGUgY2hlY2twb2ludGVkIHN0YXRlIGlzIGluIHRoZSB1c2VyCisgKiBjb250ZXh0IHBhc3NlZCB0byB0aGUgc2lnbmFsIGhhbmRsZXIuIFRoZSBzcGVjdWxhdGVkIHN0YXRlIGNhbiBiZQorICogYWNjZXNzZWQgd2l0aCB0aGUgdWNfbGluayBwb2ludGVyLgorICoKKyAqIFRoZSByYXRpb25hbGUgZm9yIHRoaXMgaXMgdGhhdCBpZiBUTSB1bmF3YXJlIGNvZGUgKHdoaWNoIGxpbmtlZAorICogYWdhaW5zdCBUTSBsaWJzKSBpbnN0YWxscyBhIHNpZ25hbCBoYW5kbGVyIGl0IHdpbGwgbm90IGtub3cgb2YgdGhlCisgKiBzcGVjdWxhdGl2ZSBuYXR1cmUgb2YgdGhlICdsaXZlJyByZWdpc3RlcnMgYW5kIG1heSBpbmZlciB0aGUgd3JvbmcKKyAqIHRoaW5nLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWx0aXZlYy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0bS5oIgorCisjZGVmaW5lIE1BWF9BVFRFTVBUIDUwMDAwMAorCisjZGVmaW5lIE5WX0dQUl9SRUdTIDE4CisKK2xvbmcgdG1fc2lnbmFsX3NlbGZfY29udGV4dF9sb2FkKHBpZF90IHBpZCwgbG9uZyAqZ3BycywgZG91YmxlICpmcHMsIHZlY3RvciBpbnQgKnZtcywgdmVjdG9yIGludCAqdnNzKTsKKworc3RhdGljIHNpZ19hdG9taWNfdCBmYWlsOworCitzdGF0aWMgbG9uZyBncHNbXSA9IHsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwKKwkJCQkJIC0xLC0yLC0zLC00LC01LC02LC03LC04LC05LC0xMCwtMTEsLTEyLC0xMywtMTQsLTE1LC0xNiwtMTcsLTE4fTsKKworc3RhdGljIHZvaWQgc2lnbmFsX3VzcjEoaW50IHNpZ251bSwgc2lnaW5mb190ICppbmZvLCB2b2lkICp1YykKK3sKKwlpbnQgaTsKKwl1Y29udGV4dF90ICp1Y3AgPSB1YzsKKwl1Y29udGV4dF90ICp0bV91Y3AgPSB1Y3AtPnVjX2xpbms7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlZfR1BSX1JFR1MgJiYgIWZhaWw7IGkrKykgeworCQlmYWlsID0gKHVjcC0+dWNfbWNvbnRleHQuZ3BfcmVnc1tpICsgMTRdICE9IGdwc1tpXSk7CisJCWZhaWwgfD0gKHRtX3VjcC0+dWNfbWNvbnRleHQuZ3BfcmVnc1tpICsgMTRdICE9IGdwc1tpICsgTlZfR1BSX1JFR1NdKTsKKwkJaWYgKGZhaWwpCisJCQlwcmludGYoIkZhaWxlZCBvbiAlZCBHUFIgJWx1IG9yICVsdVxuIiwgaSwKKwkJCQkJdWNwLT51Y19tY29udGV4dC5ncF9yZWdzW2kgKyAxNF0sIHRtX3VjcC0+dWNfbWNvbnRleHQuZ3BfcmVnc1tpICsgMTRdKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdG1fc2lnbmFsX2NvbnRleHRfY2hrX2dwcigpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisJaW50IGk7CisJbG9uZyByYzsKKwlwaWRfdCBwaWQgPSBnZXRwaWQoKTsKKworCVNLSVBfSUYoIWhhdmVfaHRtKCkpOworCisJYWN0LnNhX3NpZ2FjdGlvbiA9IHNpZ25hbF91c3IxOworCXNpZ2VtcHR5c2V0KCZhY3Quc2FfbWFzayk7CisJYWN0LnNhX2ZsYWdzID0gU0FfU0lHSU5GTzsKKwlpZiAoc2lnYWN0aW9uKFNJR1VTUjEsICZhY3QsIE5VTEwpIDwgMCkgeworCQlwZXJyb3IoInNpZ2FjdGlvbiBzaWd1c3IxIik7CisJCWV4aXQoMSk7CisJfQorCisJaSA9IDA7CisJd2hpbGUgKGkgPCBNQVhfQVRURU1QVCAmJiAhZmFpbCkgeworCQlyYyA9IHRtX3NpZ25hbF9zZWxmX2NvbnRleHRfbG9hZChwaWQsIGdwcywgTlVMTCwgTlVMTCwgTlVMTCk7CisJCUZBSUxfSUYocmMgIT0gcGlkKTsKKwkJaSsrOworCX0KKworCXJldHVybiBmYWlsOworfQorCitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiB0ZXN0X2hhcm5lc3ModG1fc2lnbmFsX2NvbnRleHRfY2hrX2dwciwgInRtX3NpZ25hbF9jb250ZXh0X2Noa19ncHIiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vdG0tc2lnbmFsLWNvbnRleHQtY2hrLXZteC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy90bS90bS1zaWduYWwtY29udGV4dC1jaGstdm14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlZTU1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vdG0tc2lnbmFsLWNvbnRleHQtY2hrLXZteC5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTYsIEN5cmlsIEJ1ciwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogVGVzdCB0aGUga2VybmVsJ3Mgc2lnbmFsIGZyYW1lIGNvZGUuCisgKgorICogVGhlIGtlcm5lbCBzZXRzIHVwIHR3byBzZXRzIG9mIHVjb250ZXh0cyBpZiB0aGUgc2lnbmFsIHdhcyB0byBiZQorICogZGVsaXZlcmVkIHdoaWxlIHRoZSB0aHJlYWQgd2FzIGluIGEgdHJhbnNhY3Rpb24uCisgKiBFeHBlY3RlZCBiZWhhdmlvdXIgaXMgdGhhdCB0aGUgY2hlY2twb2ludGVkIHN0YXRlIGlzIGluIHRoZSB1c2VyCisgKiBjb250ZXh0IHBhc3NlZCB0byB0aGUgc2lnbmFsIGhhbmRsZXIuIFRoZSBzcGVjdWxhdGVkIHN0YXRlIGNhbiBiZQorICogYWNjZXNzZWQgd2l0aCB0aGUgdWNfbGluayBwb2ludGVyLgorICoKKyAqIFRoZSByYXRpb25hbGUgZm9yIHRoaXMgaXMgdGhhdCBpZiBUTSB1bmF3YXJlIGNvZGUgKHdoaWNoIGxpbmtlZAorICogYWdhaW5zdCBUTSBsaWJzKSBpbnN0YWxscyBhIHNpZ25hbCBoYW5kbGVyIGl0IHdpbGwgbm90IGtub3cgb2YgdGhlCisgKiBzcGVjdWxhdGl2ZSBuYXR1cmUgb2YgdGhlICdsaXZlJyByZWdpc3RlcnMgYW5kIG1heSBpbmZlciB0aGUgd3JvbmcKKyAqIHRoaW5nLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWx0aXZlYy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0bS5oIgorCisjZGVmaW5lIE1BWF9BVFRFTVBUIDUwMDAwMAorCisjZGVmaW5lIE5WX1ZNWF9SRUdTIDEyCisKK2xvbmcgdG1fc2lnbmFsX3NlbGZfY29udGV4dF9sb2FkKHBpZF90IHBpZCwgbG9uZyAqZ3BycywgZG91YmxlICpmcHMsIHZlY3RvciBpbnQgKnZtcywgdmVjdG9yIGludCAqdnNzKTsKKworc3RhdGljIHNpZ19hdG9taWNfdCBmYWlsOworCit2ZWN0b3IgaW50IHZtc1tdID0geworCXsxLCAyLCAzLCA0IH0sezUsIDYsIDcsIDggfSx7OSwgMTAsMTEsMTJ9LAorCXsxMywxNCwxNSwxNn0sezE3LDE4LDE5LDIwfSx7MjEsMjIsMjMsMjR9LAorCXsyNSwyNiwyNywyOH0sezI5LDMwLDMxLDMyfSx7MzMsMzQsMzUsMzZ9LAorCXszNywzOCwzOSw0MH0sezQxLDQyLDQzLDQ0fSx7NDUsNDYsNDcsNDh9LAorCXstMSwgLTIsIC0zLCAtNH0sIHstNSwgLTYsIC03LCAtOH0sIHstOSwgLTEwLC0xMSwtMTJ9LAorCXstMTMsLTE0LC0xNSwtMTZ9LHstMTcsLTE4LC0xOSwtMjB9LHstMjEsLTIyLC0yMywtMjR9LAorCXstMjUsLTI2LC0yNywtMjh9LHstMjksLTMwLC0zMSwtMzJ9LHstMzMsLTM0LC0zNSwtMzZ9LAorCXstMzcsLTM4LC0zOSwtNDB9LHstNDEsLTQyLC00MywtNDR9LHstNDUsLTQ2LC00NywtNDh9Cit9OworCitzdGF0aWMgdm9pZCBzaWduYWxfdXNyMShpbnQgc2lnbnVtLCBzaWdpbmZvX3QgKmluZm8sIHZvaWQgKnVjKQoreworCWludCBpOworCXVjb250ZXh0X3QgKnVjcCA9IHVjOworCXVjb250ZXh0X3QgKnRtX3VjcCA9IHVjcC0+dWNfbGluazsKKworCWZvciAoaSA9IDA7IGkgPCBOVl9WTVhfUkVHUyAmJiAhZmFpbDsgaSsrKSB7CisJCWZhaWwgPSBtZW1jbXAodWNwLT51Y19tY29udGV4dC52X3JlZ3MtPnZycmVnc1tpICsgMjBdLAorCQkJCSZ2bXNbaV0sIHNpemVvZih2ZWN0b3IgaW50KSk7CisJCWZhaWwgfD0gbWVtY21wKHRtX3VjcC0+dWNfbWNvbnRleHQudl9yZWdzLT52cnJlZ3NbaSArIDIwXSwKKwkJCQkmdm1zW2kgKyBOVl9WTVhfUkVHU10sIHNpemVvZiAodmVjdG9yIGludCkpOworCisJCWlmIChmYWlsKSB7CisJCQlpbnQgajsKKworCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgb24gJWQgdm14IDB4IiwgaSk7CisJCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorCQkJCWZwcmludGYoc3RkZXJyLCAiJTA0eCIsIHVjcC0+dWNfbWNvbnRleHQudl9yZWdzLT52cnJlZ3NbaSArIDIwXVtqXSk7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiB2cyAweCIpOworCQkJZm9yIChqID0gMCA7IGogPCA0OyBqKyspCisJCQkJZnByaW50ZihzdGRlcnIsICIlMDR4IiwgdG1fdWNwLT51Y19tY29udGV4dC52X3JlZ3MtPnZycmVnc1tpICsgMjBdW2pdKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB0bV9zaWduYWxfY29udGV4dF9jaGsoKQoreworCXN0cnVjdCBzaWdhY3Rpb24gYWN0OworCWludCBpOworCWxvbmcgcmM7CisJcGlkX3QgcGlkID0gZ2V0cGlkKCk7CisKKwlTS0lQX0lGKCFoYXZlX2h0bSgpKTsKKworCWFjdC5zYV9zaWdhY3Rpb24gPSBzaWduYWxfdXNyMTsKKwlzaWdlbXB0eXNldCgmYWN0LnNhX21hc2spOworCWFjdC5zYV9mbGFncyA9IFNBX1NJR0lORk87CisJaWYgKHNpZ2FjdGlvbihTSUdVU1IxLCAmYWN0LCBOVUxMKSA8IDApIHsKKwkJcGVycm9yKCJzaWdhY3Rpb24gc2lndXNyMSIpOworCQlleGl0KDEpOworCX0KKworCWkgPSAwOworCXdoaWxlIChpIDwgTUFYX0FUVEVNUFQgJiYgIWZhaWwpIHsKKwkJcmMgPSB0bV9zaWduYWxfc2VsZl9jb250ZXh0X2xvYWQocGlkLCBOVUxMLCBOVUxMLCB2bXMsIE5VTEwpOworCQlGQUlMX0lGKHJjICE9IHBpZCk7CisJCWkrKzsKKwl9CisKKwlyZXR1cm4gZmFpbDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlyZXR1cm4gdGVzdF9oYXJuZXNzKHRtX3NpZ25hbF9jb250ZXh0X2NoaywgInRtX3NpZ25hbF9jb250ZXh0X2Noa192bXgiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vdG0tc2lnbmFsLWNvbnRleHQtY2hrLXZzeC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy90bS90bS1zaWduYWwtY29udGV4dC1jaGstdnN4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5YzNkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vdG0tc2lnbmFsLWNvbnRleHQtY2hrLXZzeC5jCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYsIEN5cmlsIEJ1ciwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogVGVzdCB0aGUga2VybmVsJ3Mgc2lnbmFsIGZyYW1lIGNvZGUuCisgKgorICogVGhlIGtlcm5lbCBzZXRzIHVwIHR3byBzZXRzIG9mIHVjb250ZXh0cyBpZiB0aGUgc2lnbmFsIHdhcyB0byBiZQorICogZGVsaXZlcmVkIHdoaWxlIHRoZSB0aHJlYWQgd2FzIGluIGEgdHJhbnNhY3Rpb24uCisgKiBFeHBlY3RlZCBiZWhhdmlvdXIgaXMgdGhhdCB0aGUgY2hlY2twb2ludGVkIHN0YXRlIGlzIGluIHRoZSB1c2VyCisgKiBjb250ZXh0IHBhc3NlZCB0byB0aGUgc2lnbmFsIGhhbmRsZXIuIFRoZSBzcGVjdWxhdGVkIHN0YXRlIGNhbiBiZQorICogYWNjZXNzZWQgd2l0aCB0aGUgdWNfbGluayBwb2ludGVyLgorICoKKyAqIFRoZSByYXRpb25hbGUgZm9yIHRoaXMgaXMgdGhhdCBpZiBUTSB1bmF3YXJlIGNvZGUgKHdoaWNoIGxpbmtlZAorICogYWdhaW5zdCBUTSBsaWJzKSBpbnN0YWxscyBhIHNpZ25hbCBoYW5kbGVyIGl0IHdpbGwgbm90IGtub3cgb2YgdGhlCisgKiBzcGVjdWxhdGl2ZSBuYXR1cmUgb2YgdGhlICdsaXZlJyByZWdpc3RlcnMgYW5kIG1heSBpbmZlciB0aGUgd3JvbmcKKyAqIHRoaW5nLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWx0aXZlYy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJ0bS5oIgorCisjZGVmaW5lIE1BWF9BVFRFTVBUIDUwMDAwMAorCisjZGVmaW5lIE5WX1ZTWF9SRUdTIDEyCisKK2xvbmcgdG1fc2lnbmFsX3NlbGZfY29udGV4dF9sb2FkKHBpZF90IHBpZCwgbG9uZyAqZ3BycywgZG91YmxlICpmcHMsIHZlY3RvciBpbnQgKnZtcywgdmVjdG9yIGludCAqdnNzKTsKKworc3RhdGljIHNpZ19hdG9taWNfdCBmYWlsOworCit2ZWN0b3IgaW50IHZzc1tdID0geworCXsxLCAyLCAzLCA0IH0sezUsIDYsIDcsIDggfSx7OSwgMTAsMTEsMTJ9LAorCXsxMywxNCwxNSwxNn0sezE3LDE4LDE5LDIwfSx7MjEsMjIsMjMsMjR9LAorCXsyNSwyNiwyNywyOH0sezI5LDMwLDMxLDMyfSx7MzMsMzQsMzUsMzZ9LAorCXszNywzOCwzOSw0MH0sezQxLDQyLDQzLDQ0fSx7NDUsNDYsNDcsNDh9LAorCXstMSwgLTIsIC0zLCAtNCB9LHstNSwgLTYsIC03LCAtOCB9LHstOSwgLTEwLC0xMSwtMTJ9LAorCXstMTMsLTE0LC0xNSwtMTZ9LHstMTcsLTE4LC0xOSwtMjB9LHstMjEsLTIyLC0yMywtMjR9LAorCXstMjUsLTI2LC0yNywtMjh9LHstMjksLTMwLC0zMSwtMzJ9LHstMzMsLTM0LC0zNSwtMzZ9LAorCXstMzcsLTM4LC0zOSwtNDB9LHstNDEsLTQyLC00MywtNDR9LHstNDUsLTQ2LC00NywtNDh9Cit9OworCitzdGF0aWMgdm9pZCBzaWduYWxfdXNyMShpbnQgc2lnbnVtLCBzaWdpbmZvX3QgKmluZm8sIHZvaWQgKnVjKQoreworCWludCBpOworCXVpbnQ4X3QgdnNjW3NpemVvZih2ZWN0b3IgaW50KV07CisJdWludDhfdCB2c3Rbc2l6ZW9mKHZlY3RvciBpbnQpXTsKKwl1Y29udGV4dF90ICp1Y3AgPSB1YzsKKwl1Y29udGV4dF90ICp0bV91Y3AgPSB1Y3AtPnVjX2xpbms7CisKKwkvKgorCSAqIFRoZSBvdGhlciBoYWxmIG9mIHRoZSBWU1ggcmVncyB3aWxsIGJlIGFmdGVyIHZfcmVncy4KKwkgKgorCSAqIEluIHNob3J0LCB2bXhfcmVzZXJ2ZSBhcnJheSBob2xkcyBldmVyeXRoaW5nLiB2X3JlZ3MgaXMgYSAxNgorCSAqIGJ5dGUgYWxpZ25lZCBwb2ludGVyIGF0IHRoZSBzdGFydCBvZiB2bXhfcmVzZXJ2ZSAodm14X3Jlc2VydmUKKwkgKiBtYXkgb3IgbWF5IG5vdCBiZSAxNiBhbGlnbmVkKSB3aGVyZSB0aGUgdl9yZWdzIHN0cnVjdHVyZSBleGlzdHMuCisJICogKGhhbGYgb2YpIFRoZSBWU1ggcmVnc3RlcnMgYXJlIGRpcmVjdGx5IGFmdGVyIHZfcmVncyBzbyB0aGUKKwkgKiBlYXNpZXN0IHdheSB0byBmaW5kIHRoZW0gYmVsb3cuCisJICovCisJbG9uZyAqdnN4X3B0ciA9IChsb25nICopKHVjcC0+dWNfbWNvbnRleHQudl9yZWdzICsgMSk7CisJbG9uZyAqdG1fdnN4X3B0ciA9IChsb25nICopKHRtX3VjcC0+dWNfbWNvbnRleHQudl9yZWdzICsgMSk7CisJZm9yIChpID0gMDsgaSA8IE5WX1ZTWF9SRUdTICYmICFmYWlsOyBpKyspIHsKKwkJbWVtY3B5KHZzYywgJnVjcC0+dWNfbWNvbnRleHQuZnBfcmVnc1tpICsgMjBdLCA4KTsKKwkJbWVtY3B5KHZzYyArIDgsICZ2c3hfcHRyWzIwICsgaV0sIDgpOworCQlmYWlsID0gbWVtY21wKHZzYywgJnZzc1tpXSwgc2l6ZW9mKHZlY3RvciBpbnQpKTsKKwkJbWVtY3B5KHZzdCwgJnRtX3VjcC0+dWNfbWNvbnRleHQuZnBfcmVnc1tpICsgMjBdLCA4KTsKKwkJbWVtY3B5KHZzdCArIDgsICZ0bV92c3hfcHRyWzIwICsgaV0sIDgpOworCQlmYWlsIHw9IG1lbWNtcCh2c3QsICZ2c3NbaSArIE5WX1ZTWF9SRUdTXSwgc2l6ZW9mKHZlY3RvciBpbnQpKTsKKworCQlpZiAoZmFpbCkgeworCQkJaW50IGo7CisKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIG9uICVkIHZzeCAweCIsIGkpOworCQkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisJCQkJZnByaW50ZihzdGRlcnIsICIlMDJ4IiwgdnNjW2pdKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiIHZzIDB4Iik7CisJCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiUwMngiLCB2c3Rbal0pOworCQkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHRtX3NpZ25hbF9jb250ZXh0X2NoaygpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisJaW50IGk7CisJbG9uZyByYzsKKwlwaWRfdCBwaWQgPSBnZXRwaWQoKTsKKworCVNLSVBfSUYoIWhhdmVfaHRtKCkpOworCisJYWN0LnNhX3NpZ2FjdGlvbiA9IHNpZ25hbF91c3IxOworCXNpZ2VtcHR5c2V0KCZhY3Quc2FfbWFzayk7CisJYWN0LnNhX2ZsYWdzID0gU0FfU0lHSU5GTzsKKwlpZiAoc2lnYWN0aW9uKFNJR1VTUjEsICZhY3QsIE5VTEwpIDwgMCkgeworCQlwZXJyb3IoInNpZ2FjdGlvbiBzaWd1c3IxIik7CisJCWV4aXQoMSk7CisJfQorCisJaSA9IDA7CisJd2hpbGUgKGkgPCBNQVhfQVRURU1QVCAmJiAhZmFpbCkgeworCQlyYyA9IHRtX3NpZ25hbF9zZWxmX2NvbnRleHRfbG9hZChwaWQsIE5VTEwsIE5VTEwsIE5VTEwsIHZzcyk7CisJCUZBSUxfSUYocmMgIT0gcGlkKTsKKwkJaSsrOworCX0KKworCXJldHVybiBmYWlsOworfQorCitpbnQgbWFpbih2b2lkKQoreworCXJldHVybiB0ZXN0X2hhcm5lc3ModG1fc2lnbmFsX2NvbnRleHRfY2hrLCAidG1fc2lnbmFsX2NvbnRleHRfY2hrX3ZzeCIpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy90bS90bS1zaWduYWwuUyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vdG0tc2lnbmFsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxM2U4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vdG0tc2lnbmFsLlMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSwgQ3lyaWwgQnVyLCBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICIuLi9iYXNpY19hc20uaCIKKyNpbmNsdWRlICIuLi9ncHJfYXNtLmgiCisjaW5jbHVkZSAiLi4vZnB1X2FzbS5oIgorI2luY2x1ZGUgIi4uL3ZteF9hc20uaCIKKyNpbmNsdWRlICIuLi92c3hfYXNtLmgiCisKKy8qCisgKiBMYXJnZSBjYXZlYXQgaGVyZSBiZWluZyB0aGF0IHRoZSBjYWxsZXIgY2Fubm90IGV4cGVjdCB0aGUKKyAqIHNpZ25hbCB0byBhbHdheXMgYmUgc2VudCEgVGhlIGhhcmR3YXJlIGNhbiAoQU5EIFdJTEwhKSBhYm9ydAorICogdGhlIHRyYW5zYWN0aW9uIGJldHdlZW4gdGhlIHRiZWdpbiBhbmQgdGhlIHRzdXNwZW5kIChob3dldmVyCisgKiB1bmxpa2VseSBpdCBzZWVtcyBvciBpbmZyZXF1ZW50bHkgaXQgYWN0dWFsbHkgaGFwcGVucykuCisgKiBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KKyAqLworLyogbG9uZyB0bV9zaWduYWxfc2VsZihwaWRfdCBwaWQsIGxvbmcgKmdwcnMsIGRvdWJsZSAqZnBzLCB2ZWN0b3IgKnZtcywgdmVjdG9yICp2c3MpOyAqLworRlVOQ19TVEFSVCh0bV9zaWduYWxfc2VsZl9jb250ZXh0X2xvYWQpCisJUFVTSF9CQVNJQ19TVEFDSyg1MTIpCisJLyoKKwkgKiBEb24ndCBzdHJpY3RseSBuZWVkIHRvIHNhdmUgYW5kIHJlc3RvcmUgYXMgaXQgZGVwZW5kcyBvbiBpZgorCSAqIHdlJ3JlIGdvaW5nIHRvIHVzZSB0aGVtLCBob3dldmVyIHRoaXMgcmVkdWNlcyBtZXNzeSBsb2dpYworCSAqLworCVBVU0hfVk1YKFNUQUNLX0ZSQU1FX0xPQ0FMKDUsMCkscjgpCisJUFVTSF9GUFUoNTEyKQorCVBVU0hfTlZSRUdTX0JFTE9XX0ZQVSg1MTIpCisJc3RkIHIzLCBTVEFDS19GUkFNRV9QQVJBTSgwKShzcCkgLyogcGlkICovCisJc3RkIHI0LCBTVEFDS19GUkFNRV9QQVJBTSgxKShzcCkgLyogZ3BzICovCisJc3RkIHI1LCBTVEFDS19GUkFNRV9QQVJBTSgyKShzcCkgLyogZnBzICovCisJc3RkIHI2LCBTVEFDS19GUkFNRV9QQVJBTSgzKShzcCkgLyogdm1zICovCisJc3RkIHI3LCBTVEFDS19GUkFNRV9QQVJBTSg0KShzcCkgLyogdnNzICovCisKKwlsZCByMywgU1RBQ0tfRlJBTUVfUEFSQU0oMSkoc3ApCisJY21wZGkgcjMsIDAKKwliZXEgc2tpcF9ncHJfbGMKKwlibCBsb2FkX2dwcgorc2tpcF9ncHJfbGM6CisJbGQgcjMsIFNUQUNLX0ZSQU1FX1BBUkFNKDIpKHNwKQorCWNtcGRpCXIzLCAwCisJYmVxCXNraXBfZnB1X2xjCisJYmwgbG9hZF9mcHUKK3NraXBfZnB1X2xjOgorCWxkIHIzLCBTVEFDS19GUkFNRV9QQVJBTSgzKShzcCkKKwljbXBkaSByMywgMAorCWJlcQlza2lwX3ZteF9sYworCWJsIGxvYWRfdm14Citza2lwX3ZteF9sYzoKKwlsZCByMywgU1RBQ0tfRlJBTUVfUEFSQU0oNCkoc3ApCisJY21wZGkJcjMsIDAKKwliZXEJc2tpcF92c3hfbGMKKwlibCBsb2FkX3ZzeAorc2tpcF92c3hfbGM6CisJLyoKKwkgKiBTZXQgcjMgKHJldHVybiB2YWx1ZSkgYmVmb3JlIHRiZWdpbi4gVXNlIHRoZSBwaWQgYXMgYSBrbm93bgorCSAqICdhbGwgZ29vZCcgcmV0dXJuIHZhbHVlLCB6ZXJvIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBub24tZG9vbWVkCisJICogdHJhbnNhY3Rpb24uCisJICovCisJbGQJcjMsIFNUQUNLX0ZSQU1FX1BBUkFNKDApKHNwKQorCXRiZWdpbi4KKwliZXEJMWYKKwl0c3VzcGVuZC4gLyogQ2FuJ3QgZW50ZXIgYSBzeXNjYWxsIHRyYW5zYWN0aW9uYWxseSAqLworCWxkCXIzLCBTVEFDS19GUkFNRV9QQVJBTSgxKShzcCkKKwljbXBkaQlyMywgMAorCWJlcSBza2lwX2dwcl9sdAorCS8qIEdldCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGFycmF5ICovCisJYWRkaQlyMywgcjMsIDggKiAxOAorCWJsIGxvYWRfZ3ByCitza2lwX2dwcl9sdDoKKwlsZCByMywgU1RBQ0tfRlJBTUVfUEFSQU0oMikoc3ApCisJY21wZGkJcjMsIDAKKwliZXEJc2tpcF9mcHVfbHQKKwkvKiBHZXQgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBhcnJheSAqLworCWFkZGkJcjMsIHIzLCA4ICogMTgKKwlibCBsb2FkX2ZwdQorc2tpcF9mcHVfbHQ6CisJbGQgcjMsIFNUQUNLX0ZSQU1FX1BBUkFNKDMpKHNwKQorCWNtcGRpIHIzLCAwCisJYmVxCXNraXBfdm14X2x0CisJLyogR2V0IHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgYXJyYXkgKi8KKwlhZGRpCXIzLCByMywgMTYgKiAxMgorCWJsIGxvYWRfdm14Citza2lwX3ZteF9sdDoKKwlsZCByMywgU1RBQ0tfRlJBTUVfUEFSQU0oNCkoc3ApCisJY21wZGkJcjMsIDAKKwliZXEJc2tpcF92c3hfbHQKKwkvKiBHZXQgdGhlIHNlY29uZCBoYWxmIG9mIHRoZSBhcnJheSAqLworCWFkZGkJcjMsIHIzLCAxNiAqIDEyCisJYmwgbG9hZF92c3gKK3NraXBfdnN4X2x0OgorCWxpCXIwLCAzNyAvKiBzeXNfa2lsbCAqLworCWxkIHIzLCBTVEFDS19GUkFNRV9QQVJBTSgwKShzcCkgLyogcGlkICovCisJbGkgcjQsIDEwIC8qIFNJR1VTUjEgKi8KKwlzYyAvKiBUYWtpbmcgdGhlIHNpZ25hbCB3aWxsIGRvb20gdGhlIHRyYW5zYWN0aW9uICovCisJdGFib3J0LiAwCisJdHJlc3VtZS4gLyogQmUgc3VwZXIgc3VyZSB3ZSBhYm9ydCAqLworCS8qCisJICogVGhpcyB3aWxsIGNhdXNlIHVzIHRvIHJlc3VtZSBkb29tZWQgdHJhbnNhY3Rpb24gYW5kIGNhdXNlCisJICogaGFyZHdhcmUgdG8gY2xlYW51cCwgd2UnbGwgZW5kIHVwIGF0IDE6IGFueXRoaW5nIGJldHdlZW4KKwkgKiB0cmVzdW1lLiBhbmQgMTogc2hvdWxkbid0IGV2ZXIgcnVuLgorCSAqLworCWxpIHIzLCAwCisJMToKKwlQT1BfVk1YKFNUQUNLX0ZSQU1FX0xPQ0FMKDUsMCkscjQpCisJUE9QX0ZQVSg1MTIpCisJUE9QX05WUkVHU19CRUxPV19GUFUoNTEyKQorCVBPUF9CQVNJQ19TVEFDSyg1MTIpCisJYmxyCitGVU5DX0VORCh0bV9zaWduYWxfc2VsZl9jb250ZXh0X2xvYWQpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3RtL3RtLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3RtL3RtLmgKaW5kZXggNjAzMThiYS4uMmM4ZGE3NCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy90bS90bS5oCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vdG0uaApAQCAtNTIsNCArNTIsMzEgQEAKIAlyZXR1cm4gKF9fYnVpbHRpbl9nZXRfdGV4YXNydSgpICYgMHg0MDAwMDApOwogfQogCitzdGF0aWMgaW5saW5lIGludCB0Y2hlY2sodm9pZCkKK3sKKwlsb25nIGNyOworCWFzbSB2b2xhdGlsZSAoInRjaGVjayAwIiA6ICI9ciIoY3IpIDogOiAiY3IwIik7CisJcmV0dXJuIChjciA+PiAyOCkgJiA0OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgdGNoZWNrX2Rvb21lZCh2b2lkKQoreworCXJldHVybiB0Y2hlY2soKSAmIDg7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB0Y2hlY2tfYWN0aXZlKHZvaWQpCit7CisJcmV0dXJuIHRjaGVjaygpICYgNDsKK30KKworc3RhdGljIGlubGluZSBib29sIHRjaGVja19zdXNwZW5kZWQodm9pZCkKK3sKKwlyZXR1cm4gdGNoZWNrKCkgJiAyOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgdGNoZWNrX3RyYW5zYWN0aW9uYWwodm9pZCkKK3sKKwlyZXR1cm4gdGNoZWNrKCkgJiA2OworfQorCiAjZW5kaWYgLyogX1NFTEZURVNUU19QT1dFUlBDX1RNX1RNX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdXRpbHMuaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdXRpbHMuaAppbmRleCBmYmQzM2U1Li41MzQwNWU4IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3V0aWxzLmgKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy91dGlscy5oCkBAIC0yMiw3ICsyMiw3IEBACiB0eXBlZGVmIHVpbnQxNl90IHUxNjsKIHR5cGVkZWYgdWludDhfdCB1ODsKIAotCit2b2lkIHRlc3RfaGFybmVzc19zZXRfdGltZW91dCh1aW50NjRfdCB0aW1lKTsKIGludCB0ZXN0X2hhcm5lc3MoaW50ICh0ZXN0X2Z1bmN0aW9uKSh2b2lkKSwgY2hhciAqbmFtZSk7CiBleHRlcm4gdm9pZCAqZ2V0X2F1eHZfZW50cnkoaW50IHR5cGUpOwogaW50IHBpY2tfb25saW5lX2NwdSh2b2lkKTsKQEAgLTMyLDEwICszMiwxNyBAQAogCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpZ2V0X2F1eHZfZW50cnkoQVRfSFdDQVApICYgZnRyKSA9PSBmdHI7CiB9CiAKKyNpZmRlZiBBVF9IV0NBUDIKIHN0YXRpYyBpbmxpbmUgYm9vbCBoYXZlX2h3Y2FwMih1bnNpZ25lZCBsb25nIGZ0cjIpCiB7CiAJcmV0dXJuICgodW5zaWduZWQgbG9uZylnZXRfYXV4dl9lbnRyeShBVF9IV0NBUDIpICYgZnRyMikgPT0gZnRyMjsKIH0KKyNlbHNlCitzdGF0aWMgaW5saW5lIGJvb2wgaGF2ZV9od2NhcDIodW5zaWduZWQgbG9uZyBmdHIyKQoreworCXJldHVybiBmYWxzZTsKK30KKyNlbmRpZgogCiAvKiBZZXMsIHRoaXMgaXMgZXZpbCAqLwogI2RlZmluZSBGQUlMX0lGKHgpCQkJCQkJXApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy92bXhfYXNtLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3ZteF9hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWFhZWNhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy92bXhfYXNtLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1LCBDeXJpbCBCdXIsIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgImJhc2ljX2FzbS5oIgorCisvKiBQT1MgTVVTVCBCRSAxNiBBTElHTkVEISAqLworI2RlZmluZSBQVVNIX1ZNWChwb3MscmVnKSBcCisJbGkJcmVnLHBvczsgXAorCXN0dngJdjIwLHJlZywlcjE7IFwKKwlhZGRpCXJlZyxyZWcsMTY7IFwKKwlzdHZ4CXYyMSxyZWcsJXIxOyBcCisJYWRkaQlyZWcscmVnLDE2OyBcCisJc3R2eAl2MjIscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCXN0dngJdjIzLHJlZywlcjE7IFwKKwlhZGRpCXJlZyxyZWcsMTY7IFwKKwlzdHZ4CXYyNCxyZWcsJXIxOyBcCisJYWRkaQlyZWcscmVnLDE2OyBcCisJc3R2eAl2MjUscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCXN0dngJdjI2LHJlZywlcjE7IFwKKwlhZGRpCXJlZyxyZWcsMTY7IFwKKwlzdHZ4CXYyNyxyZWcsJXIxOyBcCisJYWRkaQlyZWcscmVnLDE2OyBcCisJc3R2eAl2MjgscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCXN0dngJdjI5LHJlZywlcjE7IFwKKwlhZGRpCXJlZyxyZWcsMTY7IFwKKwlzdHZ4CXYzMCxyZWcsJXIxOyBcCisJYWRkaQlyZWcscmVnLDE2OyBcCisJc3R2eAl2MzEscmVnLCVyMTsKKworLyogUE9TIE1VU1QgQkUgMTYgQUxJR05FRCEgKi8KKyNkZWZpbmUgUE9QX1ZNWChwb3MscmVnKSBcCisJbGkJcmVnLHBvczsgXAorCWx2eAl2MjAscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCWx2eAl2MjEscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCWx2eAl2MjIscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCWx2eAl2MjMscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCWx2eAl2MjQscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCWx2eAl2MjUscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCWx2eAl2MjYscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCWx2eAl2MjcscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCWx2eAl2MjgscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCWx2eAl2MjkscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCWx2eAl2MzAscmVnLCVyMTsgXAorCWFkZGkJcmVnLHJlZywxNjsgXAorCWx2eAl2MzEscmVnLCVyMTsKKworLyoKKyAqIENhcmVmdWwgdGhpcyB3aWxsICdjbG9iYmVyJyB2bXggKGJ5IGRlc2lnbikKKyAqIERvbid0IGNhbGwgdGhpcyBmcm9tIEMKKyAqLworRlVOQ19TVEFSVChsb2FkX3ZteCkKKwlsaQlyNSwwCisJbHZ4CXYyMCxyNSxyMworCWFkZGkJcjUscjUsMTYKKwlsdngJdjIxLHI1LHIzCisJYWRkaQlyNSxyNSwxNgorCWx2eAl2MjIscjUscjMKKwlhZGRpCXI1LHI1LDE2CisJbHZ4CXYyMyxyNSxyMworCWFkZGkJcjUscjUsMTYKKwlsdngJdjI0LHI1LHIzCisJYWRkaQlyNSxyNSwxNgorCWx2eAl2MjUscjUscjMKKwlhZGRpCXI1LHI1LDE2CisJbHZ4CXYyNixyNSxyMworCWFkZGkJcjUscjUsMTYKKwlsdngJdjI3LHI1LHIzCisJYWRkaQlyNSxyNSwxNgorCWx2eAl2MjgscjUscjMKKwlhZGRpCXI1LHI1LDE2CisJbHZ4CXYyOSxyNSxyMworCWFkZGkJcjUscjUsMTYKKwlsdngJdjMwLHI1LHIzCisJYWRkaQlyNSxyNSwxNgorCWx2eAl2MzEscjUscjMKKwlibHIKK0ZVTkNfRU5EKGxvYWRfdm14KQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy92c3hfYXNtLmggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3ZzeF9hc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODI4YmZiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy92c3hfYXNtLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1LCBDeXJpbCBCdXIsIElCTSBDb3JwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgImJhc2ljX2FzbS5oIgorCisvKgorICogQ2FyZWZ1bCB0aGlzIHdpbGwgJ2Nsb2JiZXInIHZzeCAoYnkgZGVzaWduKSwgVlNYIGFyZSBhbHdheXMKKyAqIHZvbGF0aWxlIHRob3VnaCBzbyB1bmxpa2Ugdm14IHRoaXMgaXNuJ3Qgc28gbXVjaCBvZiBhbiBpc3N1ZQorICogU3RpbGwgc2hvdWxkIGF2b2lkIGNhbGxpbmcgZnJvbSBDCisgKi8KK0ZVTkNfU1RBUlQobG9hZF92c3gpCisJbGkJcjUsMAorCWx4dngJdnMyMCxyNSxyMworCWFkZGkJcjUscjUsMTYKKwlseHZ4CXZzMjEscjUscjMKKwlhZGRpCXI1LHI1LDE2CisJbHh2eAl2czIyLHI1LHIzCisJYWRkaQlyNSxyNSwxNgorCWx4dngJdnMyMyxyNSxyMworCWFkZGkJcjUscjUsMTYKKwlseHZ4CXZzMjQscjUscjMKKwlhZGRpCXI1LHI1LDE2CisJbHh2eAl2czI1LHI1LHIzCisJYWRkaQlyNSxyNSwxNgorCWx4dngJdnMyNixyNSxyMworCWFkZGkJcjUscjUsMTYKKwlseHZ4CXZzMjcscjUscjMKKwlhZGRpCXI1LHI1LDE2CisJbHh2eAl2czI4LHI1LHIzCisJYWRkaQlyNSxyNSwxNgorCWx4dngJdnMyOSxyNSxyMworCWFkZGkJcjUscjUsMTYKKwlseHZ4CXZzMzAscjUscjMKKwlhZGRpCXI1LHI1LDE2CisJbHh2eAl2czMxLHI1LHIzCisJYmxyCitGVU5DX0VORChsb2FkX3ZzeCkKKworRlVOQ19TVEFSVChzdG9yZV92c3gpCisJbGkJcjUsMAorCXN0eHZ4CXZzMjAscjUscjMKKwlhZGRpCXI1LHI1LDE2CisJc3R4dngJdnMyMSxyNSxyMworCWFkZGkJcjUscjUsMTYKKwlzdHh2eAl2czIyLHI1LHIzCisJYWRkaQlyNSxyNSwxNgorCXN0eHZ4CXZzMjMscjUscjMKKwlhZGRpCXI1LHI1LDE2CisJc3R4dngJdnMyNCxyNSxyMworCWFkZGkJcjUscjUsMTYKKwlzdHh2eAl2czI1LHI1LHIzCisJYWRkaQlyNSxyNSwxNgorCXN0eHZ4CXZzMjYscjUscjMKKwlhZGRpCXI1LHI1LDE2CisJc3R4dngJdnMyNyxyNSxyMworCWFkZGkJcjUscjUsMTYKKwlzdHh2eAl2czI4LHI1LHIzCisJYWRkaQlyNSxyNSwxNgorCXN0eHZ4CXZzMjkscjUscjMKKwlhZGRpCXI1LHI1LDE2CisJc3R4dngJdnMzMCxyNSxyMworCWFkZGkJcjUscjUsMTYKKwlzdHh2eAl2czMxLHI1LHIzCisJYmxyCitGVU5DX0VORChzdG9yZV92c3gpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvcHRyYWNlX3N5c2NhbGwuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9wdHJhY2Vfc3lzY2FsbC5jCmluZGV4IDQyMTQ1NjcuLmIwMzdjZTljIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvcHRyYWNlX3N5c2NhbGwuYworKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvcHRyYWNlX3N5c2NhbGwuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJaWYgKGFyZ3MubnIgIT0gZ2V0cGlkKCkgfHwKIAkgICAgYXJncy5hcmcwICE9IDEwIHx8IGFyZ3MuYXJnMSAhPSAxMSB8fCBhcmdzLmFyZzIgIT0gMTIgfHwKIAkgICAgYXJncy5hcmczICE9IDEzIHx8IGFyZ3MuYXJnNCAhPSAxNCB8fCBhcmdzLmFyZzUgIT0gMTUpIHsKLQkJcHJpbnRmKCJbRkFJTF1cdGdldHBpZCgpIGZhaWxlZCB0byBwcmVzZXZlIHJlZ3NcbiIpOworCQlwcmludGYoIltGQUlMXVx0Z2V0cGlkKCkgZmFpbGVkIHRvIHByZXNlcnZlIHJlZ3NcbiIpOwogCQluZXJycysrOwogCX0gZWxzZSB7CiAJCXByaW50ZigiW09LXVx0Z2V0cGlkKCkgcHJlc2VydmVzIHJlZ3NcbiIpOwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJaWYgKGFyZ3MubnIgIT0gMCB8fAogCSAgICBhcmdzLmFyZzAgIT0gZ2V0cGlkKCkgfHwgYXJncy5hcmcxICE9IFNJR1VTUjEgfHwgYXJncy5hcmcyICE9IDEyIHx8CiAJICAgIGFyZ3MuYXJnMyAhPSAxMyB8fCBhcmdzLmFyZzQgIT0gMTQgfHwgYXJncy5hcmc1ICE9IDE1KSB7Ci0JCXByaW50ZigiW0ZBSUxdXHRraWxsKGdldHBpZCgpLCBTSUdVU1IxKSBmYWlsZWQgdG8gcHJlc2V2ZSByZWdzXG4iKTsKKwkJcHJpbnRmKCJbRkFJTF1cdGtpbGwoZ2V0cGlkKCksIFNJR1VTUjEpIGZhaWxlZCB0byBwcmVzZXJ2ZSByZWdzXG4iKTsKIAkJbmVycnMrKzsKIAl9IGVsc2UgewogCQlwcmludGYoIltPS11cdGtpbGwoZ2V0cGlkKCksIFNJR1VTUjEpIHByZXNlcnZlcyByZWdzXG4iKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9zaWdyZXR1cm4uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9zaWdyZXR1cm4uYwppbmRleCA4YTU3N2U3Li4yNDYxNDViIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvc2lncmV0dXJuLmMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3NpZ3JldHVybi5jCkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgIi50eXBlIGludDMsIEBmdW5jdGlvblxuXHQiCiAgICAgICIuYWxpZ24gNDA5NlxuXHQiCiAgICAgICJpbnQzOlxuXHQiCi0gICAgICJtb3YgJXNzLCVlYXhcblx0IgorICAgICAibW92ICVzcywlZWN4XG5cdCIKICAgICAgImludDNcblx0IgogICAgICAiLnNpemUgaW50MywgLiAtIGludDNcblx0IgogICAgICAiLmFsaWduIDQwOTYsIDB4Y2Ncblx0IgpAQCAtMzA2LDcgKzMwNiw3IEBACiAjaWZkZWYgX194ODZfNjRfXwogIyBkZWZpbmUgUkVHX0lQIFJFR19SSVAKICMgZGVmaW5lIFJFR19TUCBSRUdfUlNQCi0jIGRlZmluZSBSRUdfQVggUkVHX1JBWAorIyBkZWZpbmUgUkVHX0NYIFJFR19SQ1gKIAogc3RydWN0IHNlbGVjdG9ycyB7CiAJdW5zaWduZWQgc2hvcnQgY3MsIGdzLCBmcywgc3M7CkBAIC0zMjYsNyArMzI2LDcgQEAKICNlbHNlCiAjIGRlZmluZSBSRUdfSVAgUkVHX0VJUAogIyBkZWZpbmUgUkVHX1NQIFJFR19FU1AKLSMgZGVmaW5lIFJFR19BWCBSRUdfRUFYCisjIGRlZmluZSBSRUdfQ1ggUkVHX0VDWAogCiBzdGF0aWMgZ3JlZ190ICpzc3B0cih1Y29udGV4dF90ICpjdHgpCiB7CkBAIC00NTcsMTAgKzQ1NywxMCBAQAogCWN0eC0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0lQXSA9CiAJCXNpZ19jcyA9PSBjb2RlMTZfc2VsID8gMCA6ICh1bnNpZ25lZCBsb25nKSZpbnQzOwogCWN0eC0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX1NQXSA9ICh1bnNpZ25lZCBsb25nKTB4OGJhZGYwMGQ1YWFkYzBkZVVMTDsKLQljdHgtPnVjX21jb250ZXh0LmdyZWdzW1JFR19BWF0gPSAwOworCWN0eC0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0NYXSA9IDA7CiAKIAltZW1jcHkoJnJlcXVlc3RlZF9yZWdzLCAmY3R4LT51Y19tY29udGV4dC5ncmVncywgc2l6ZW9mKGdyZWdzZXRfdCkpOwotCXJlcXVlc3RlZF9yZWdzW1JFR19BWF0gPSAqc3NwdHIoY3R4KTsJLyogVGhlIGFzbSBjb2RlIGRvZXMgdGhpcy4gKi8KKwlyZXF1ZXN0ZWRfcmVnc1tSRUdfQ1hdID0gKnNzcHRyKGN0eCk7CS8qIFRoZSBhc20gY29kZSBkb2VzIHRoaXMuICovCiAKIAlyZXR1cm47CiB9CkBAIC00ODIsNyArNDgyLDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBzczsKIAlhc20gKCJtb3YgJSVzcywlMCIgOiAiPXIiIChzcykpOwogCi0JZ3JlZ190IGFzbV9zcyA9IGN0eC0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0FYXTsKKwlncmVnX3QgYXNtX3NzID0gY3R4LT51Y19tY29udGV4dC5ncmVnc1tSRUdfQ1hdOwogCWlmIChhc21fc3MgIT0gc2lnX3NzICYmIHNpZyA9PSBTSUdUUkFQKSB7CiAJCS8qIFNhbml0eSBjaGVjayBmYWlsdXJlLiAqLwogCQlwcmludGYoIltGQUlMXVx0U0lHVFJBUDogc3MgPSAlaHgsIGZyYW1lIHNzID0gJWh4LCBheCA9ICVsbHhcbiIsCkBAIC02NTQsOCArNjU0LDggQEAKICNlbmRpZgogCiAJCS8qIFNhbml0eSBjaGVjayBvbiB0aGUga2VybmVsICovCi0JCWlmIChpID09IFJFR19BWCAmJiByZXF1ZXN0ZWRfcmVnc1tpXSAhPSByZXN1bHRpbmdfcmVnc1tpXSkgewotCQkJcHJpbnRmKCJbRkFJTF1cdEFYIChzYXZlZCBTUCkgbWlzbWF0Y2g6IHJlcXVlc3RlZCAweCVsbHg7IGdvdCAweCVsbHhcbiIsCisJCWlmIChpID09IFJFR19DWCAmJiByZXF1ZXN0ZWRfcmVnc1tpXSAhPSByZXN1bHRpbmdfcmVnc1tpXSkgeworCQkJcHJpbnRmKCJbRkFJTF1cdENYIChzYXZlZCBTUCkgbWlzbWF0Y2g6IHJlcXVlc3RlZCAweCVsbHg7IGdvdCAweCVsbHhcbiIsCiAJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXF1ZXN0ZWRfcmVnc1tpXSwKIAkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlc3VsdGluZ19yZWdzW2ldKTsKIAkJCW5lcnJzKys7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vYWFyY2gzMi5jIGIvdmlydC9rdm0vYXJtL2FhcmNoMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjhhZjRiCi0tLSAvZGV2L251bGwKKysrIGIvdmlydC9rdm0vYXJtL2FhcmNoMzIuYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIChub3QgbXVjaCBvZiBhbikgRW11bGF0aW9uIGxheWVyIGZvciAzMmJpdCBndWVzdHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyLDIwMTMgLSBBUk0gTHRkCisgKiBBdXRob3I6IE1hcmMgWnluZ2llciA8bWFyYy56eW5naWVyQGFybS5jb20+CisgKgorICogYmFzZWQgb24gYXJjaC9hcm0va3ZtL2VtdWxhdGUuYworICogQ29weXJpZ2h0IChDKSAyMDEyIC0gVmlydHVhbCBPcGVuIFN5c3RlbXMgYW5kIENvbHVtYmlhIFVuaXZlcnNpdHkKKyAqIEF1dGhvcjogQ2hyaXN0b2ZmZXIgRGFsbCA8Yy5kYWxsQHZpcnR1YWxvcGVuc3lzdGVtcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KKyNpbmNsdWRlIDxhc20va3ZtX2VtdWxhdGUuaD4KKyNpbmNsdWRlIDxhc20va3ZtX2h5cC5oPgorCisjaWZuZGVmIENPTkZJR19BUk02NAorI2RlZmluZSBDT01QQVRfUFNSX1RfQklUCVBTUl9UX0JJVAorI2RlZmluZSBDT01QQVRfUFNSX0lUX01BU0sJUFNSX0lUX01BU0sKKyNlbmRpZgorCisvKgorICogc3RvbGVuIGZyb20gYXJjaC9hcm0va2VybmVsL29wY29kZXMuYworICoKKyAqIGNvbmRpdGlvbiBjb2RlIGxvb2t1cCB0YWJsZQorICogaW5kZXggaW50byB0aGUgdGFibGUgaXMgdGVzdCBjb2RlOiBFUSwgTkUsIC4uLiBMVCwgR1QsIEFMLCBOVgorICoKKyAqIGJpdCBwb3NpdGlvbiBpbiBzaG9ydCBpcyBjb25kaXRpb24gY29kZTogTlpDVgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgY2NfbWFwWzE2XSA9IHsKKwkweEYwRjAsCQkJLyogRVEgPT0gWiBzZXQgICAgICAgICAgICAqLworCTB4MEYwRiwJCQkvKiBORSAgICAgICAgICAgICAgICAgICAgICovCisJMHhDQ0NDLAkJCS8qIENTID09IEMgc2V0ICAgICAgICAgICAgKi8KKwkweDMzMzMsCQkJLyogQ0MgICAgICAgICAgICAgICAgICAgICAqLworCTB4RkYwMCwJCQkvKiBNSSA9PSBOIHNldCAgICAgICAgICAgICovCisJMHgwMEZGLAkJCS8qIFBMICAgICAgICAgICAgICAgICAgICAgKi8KKwkweEFBQUEsCQkJLyogVlMgPT0gViBzZXQgICAgICAgICAgICAqLworCTB4NTU1NSwJCQkvKiBWQyAgICAgICAgICAgICAgICAgICAgICovCisJMHgwQzBDLAkJCS8qIEhJID09IEMgc2V0ICYmIFogY2xlYXIgKi8KKwkweEYzRjMsCQkJLyogTFMgPT0gQyBjbGVhciB8fCBaIHNldCAqLworCTB4QUE1NSwJCQkvKiBHRSA9PSAoTj09VikgICAgICAgICAgICovCisJMHg1NUFBLAkJCS8qIExUID09IChOIT1WKSAgICAgICAgICAgKi8KKwkweDBBMDUsCQkJLyogR1QgPT0gKCFaICYmIChOPT1WKSkgICAqLworCTB4RjVGQSwJCQkvKiBMRSA9PSAoWiB8fCAoTiE9VikpICAgICovCisJMHhGRkZGLAkJCS8qIEFMIGFsd2F5cyAgICAgICAgICAgICAgKi8KKwkwCQkJLyogTlYgICAgICAgICAgICAgICAgICAgICAqLworfTsKKworLyoKKyAqIENoZWNrIGlmIGEgdHJhcHBlZCBpbnN0cnVjdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGV4ZWN1dGVkIG9yIG5vdC4KKyAqLworYm9vbCBrdm1fY29uZGl0aW9uX3ZhbGlkMzIoY29uc3Qgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXVuc2lnbmVkIGxvbmcgY3BzcjsKKwl1MzIgY3Bzcl9jb25kOworCWludCBjb25kOworCisJLyogVG9wIHR3byBiaXRzIG5vbi16ZXJvPyAgVW5jb25kaXRpb25hbC4gKi8KKwlpZiAoa3ZtX3ZjcHVfZ2V0X2hzcih2Y3B1KSA+PiAzMCkKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBJcyBjb25kaXRpb24gZmllbGQgdmFsaWQ/ICovCisJY29uZCA9IGt2bV92Y3B1X2dldF9jb25kaXRpb24odmNwdSk7CisJaWYgKGNvbmQgPT0gMHhFKQorCQlyZXR1cm4gdHJ1ZTsKKworCWNwc3IgPSAqdmNwdV9jcHNyKHZjcHUpOworCisJaWYgKGNvbmQgPCAwKSB7CisJCS8qIFRoaXMgY2FuIGhhcHBlbiBpbiBUaHVtYiBtb2RlOiBleGFtaW5lIElUIHN0YXRlLiAqLworCQl1bnNpZ25lZCBsb25nIGl0OworCisJCWl0ID0gKChjcHNyID4+IDgpICYgMHhGQykgfCAoKGNwc3IgPj4gMjUpICYgMHgzKTsKKworCQkvKiBpdCA9PSAwID0+IHVuY29uZGl0aW9uYWwuICovCisJCWlmIChpdCA9PSAwKQorCQkJcmV0dXJuIHRydWU7CisKKwkJLyogVGhlIGNvbmQgZm9yIHRoaXMgaW5zbiB3b3JrcyBvdXQgYXMgdGhlIHRvcCA0IGJpdHMuICovCisJCWNvbmQgPSAoaXQgPj4gNCk7CisJfQorCisJY3Bzcl9jb25kID0gY3BzciA+PiAyODsKKworCWlmICghKChjY19tYXBbY29uZF0gPj4gY3Bzcl9jb25kKSAmIDEpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBhZGp1c3RfaXRzdGF0ZSAtIGFkanVzdCBJVFNUQVRFIHdoZW4gZW11bGF0aW5nIGluc3RydWN0aW9ucyBpbiBJVC1ibG9jaworICogQHZjcHU6CVRoZSBWQ1BVIHBvaW50ZXIKKyAqCisgKiBXaGVuIGV4Y2VwdGlvbnMgb2NjdXIgd2hpbGUgaW5zdHJ1Y3Rpb25zIGFyZSBleGVjdXRlZCBpbiBUaHVtYiBJRi1USEVOCisgKiBibG9ja3MsIHRoZSBJVFNUQVRFIGZpZWxkIG9mIHRoZSBDUFNSIGlzIG5vdCBhZHZhbmNlZCAodXBkYXRlZCksIHNvIHdlIGhhdmUKKyAqIHRvIGRvIHRoaXMgbGl0dGxlIGJpdCBvZiB3b3JrIG1hbnVhbGx5LiBUaGUgZmllbGRzIG1hcCBsaWtlIHRoaXM6CisgKgorICogSVRbNzowXSAtPiBDUFNSWzI2OjI1XSxDUFNSWzE1OjEwXQorICovCitzdGF0aWMgdm9pZCBfX2h5cF90ZXh0IGt2bV9hZGp1c3RfaXRzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdW5zaWduZWQgbG9uZyBpdGJpdHMsIGNvbmQ7CisJdW5zaWduZWQgbG9uZyBjcHNyID0gKnZjcHVfY3Bzcih2Y3B1KTsKKwlib29sIGlzX2FybSA9ICEoY3BzciAmIENPTVBBVF9QU1JfVF9CSVQpOworCisJaWYgKGlzX2FybSB8fCAhKGNwc3IgJiBDT01QQVRfUFNSX0lUX01BU0spKQorCQlyZXR1cm47CisKKwljb25kID0gKGNwc3IgJiAweGUwMDApID4+IDEzOworCWl0Yml0cyA9IChjcHNyICYgMHgxYzAwKSA+PiAoMTAgLSAyKTsKKwlpdGJpdHMgfD0gKGNwc3IgJiAoMHgzIDw8IDI1KSkgPj4gMjU7CisKKwkvKiBQZXJmb3JtIElUQWR2YW5jZSAoc2VlIHBhZ2UgQTItNTIgaW4gQVJNIERESSAwNDA2QykgKi8KKwlpZiAoKGl0Yml0cyAmIDB4NykgPT0gMCkKKwkJaXRiaXRzID0gY29uZCA9IDA7CisJZWxzZQorCQlpdGJpdHMgPSAoaXRiaXRzIDw8IDEpICYgMHgxZjsKKworCWNwc3IgJj0gfkNPTVBBVF9QU1JfSVRfTUFTSzsKKwljcHNyIHw9IGNvbmQgPDwgMTM7CisJY3BzciB8PSAoaXRiaXRzICYgMHgxYykgPDwgKDEwIC0gMik7CisJY3BzciB8PSAoaXRiaXRzICYgMHgzKSA8PCAyNTsKKwkqdmNwdV9jcHNyKHZjcHUpID0gY3BzcjsKK30KKworLyoqCisgKiBrdm1fc2tpcF9pbnN0ciAtIHNraXAgYSB0cmFwcGVkIGluc3RydWN0aW9uIGFuZCBwcm9jZWVkIHRvIHRoZSBuZXh0CisgKiBAdmNwdTogVGhlIHZjcHUgcG9pbnRlcgorICovCit2b2lkIF9faHlwX3RleHQga3ZtX3NraXBfaW5zdHIzMihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGJvb2wgaXNfd2lkZV9pbnN0cikKK3sKKwlib29sIGlzX3RodW1iOworCisJaXNfdGh1bWIgPSAhISgqdmNwdV9jcHNyKHZjcHUpICYgQ09NUEFUX1BTUl9UX0JJVCk7CisJaWYgKGlzX3RodW1iICYmICFpc193aWRlX2luc3RyKQorCQkqdmNwdV9wYyh2Y3B1KSArPSAyOworCWVsc2UKKwkJKnZjcHVfcGModmNwdSkgKz0gNDsKKwlrdm1fYWRqdXN0X2l0c3RhdGUodmNwdSk7Cit9CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vYXJjaF90aW1lci5jIGIvdmlydC9rdm0vYXJtL2FyY2hfdGltZXIuYwppbmRleCA3N2U2Y2NmLi4yN2ExZjYzIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vYXJjaF90aW1lci5jCisrKyBiL3ZpcnQva3ZtL2FybS9hcmNoX3RpbWVyLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlICJ0cmFjZS5oIgogCiBzdGF0aWMgc3RydWN0IHRpbWVjb3VudGVyICp0aW1lY291bnRlcjsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3F1ZXVlOwogc3RhdGljIHVuc2lnbmVkIGludCBob3N0X3Z0aW1lcl9pcnE7CiBzdGF0aWMgdTMyIGhvc3RfdnRpbWVyX2lycV9mbGFnczsKIApAQCAtMTQxLDcgKzE0MCw3IEBACiAJCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7CiAJfQogCi0JcXVldWVfd29yayh3cXVldWUsICZ0aW1lci0+ZXhwaXJlZCk7CisJc2NoZWR1bGVfd29yaygmdGltZXItPmV4cGlyZWQpOwogCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKIH0KIApAQCAtNDQ2LDEzICs0NDUsNyBAQAogCWlmIChlcnIpIHsKIAkJa3ZtX2Vycigia3ZtX2FyY2hfdGltZXI6IGNhbid0IHJlcXVlc3QgaW50ZXJydXB0ICVkICglZClcbiIsCiAJCQlob3N0X3Z0aW1lcl9pcnEsIGVycik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXdxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJrdm1fYXJjaF90aW1lciIpOwotCWlmICghd3F1ZXVlKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2ZyZWU7CisJCXJldHVybiBlcnI7CiAJfQogCiAJa3ZtX2luZm8oInZpcnR1YWwgdGltZXIgSVJRJWRcbiIsIGhvc3RfdnRpbWVyX2lycSk7CkBAIC00NjAsMTAgKzQ1Myw2IEBACiAJY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfS1ZNX0FSTV9USU1FUl9TVEFSVElORywKIAkJCSAgIkFQX0tWTV9BUk1fVElNRVJfU1RBUlRJTkciLCBrdm1fdGltZXJfc3RhcnRpbmdfY3B1LAogCQkJICBrdm1fdGltZXJfZHlpbmdfY3B1KTsKLQlnb3RvIG91dDsKLW91dF9mcmVlOgotCWZyZWVfcGVyY3B1X2lycShob3N0X3Z0aW1lcl9pcnEsIGt2bV9nZXRfcnVubmluZ192Y3B1cygpKTsKLW91dDoKIAlyZXR1cm4gZXJyOwogfQogCkBAIC01MTgsNyArNTA3LDcgQEAKIAkgKiBWQ1BVcyBoYXZlIHRoZSBlbmFibGVkIHZhcmlhYmxlIHNldCwgYmVmb3JlIGVudGVyaW5nIHRoZSBndWVzdCwgaWYKIAkgKiB0aGUgYXJjaCB0aW1lcnMgYXJlIGVuYWJsZWQuCiAJICovCi0JaWYgKHRpbWVjb3VudGVyICYmIHdxdWV1ZSkKKwlpZiAodGltZWNvdW50ZXIpCiAJCXRpbWVyLT5lbmFibGVkID0gMTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL2h5cC92Z2ljLXYyLXNyLmMgYi92aXJ0L2t2bS9hcm0vaHlwL3ZnaWMtdjItc3IuYwppbmRleCA3Y2ZmZDkzLi5jOGFlYjdiIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vaHlwL3ZnaWMtdjItc3IuYworKysgYi92aXJ0L2t2bS9hcm0vaHlwL3ZnaWMtdjItc3IuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvYXJtLWdpYy5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAKKyNpbmNsdWRlIDxhc20va3ZtX2VtdWxhdGUuaD4KICNpbmNsdWRlIDxhc20va3ZtX2h5cC5oPgogCiBzdGF0aWMgdm9pZCBfX2h5cF90ZXh0IHNhdmVfbWFpbnRfaW50X3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKQEAgLTE2NywzICsxNjgsNTkgQEAKIAl3cml0ZWxfcmVsYXhlZChjcHVfaWYtPnZnaWNfdm1jciwgYmFzZSArIEdJQ0hfVk1DUik7CiAJdmNwdS0+YXJjaC52Z2ljX2NwdS5saXZlX2xycyA9IGxpdmVfbHJzOwogfQorCisjaWZkZWYgQ09ORklHX0FSTTY0CisvKgorICogX192Z2ljX3YyX3BlcmZvcm1fY3B1aWZfYWNjZXNzIC0tIHBlcmZvcm0gYSBHSUNWIGFjY2VzcyBvbiBiZWhhbGYgb2YgdGhlCisgKgkJCQkgICAgIGd1ZXN0LgorICoKKyAqIEB2Y3B1OiB0aGUgb2ZmZW5kaW5nIHZjcHUKKyAqCisgKiBSZXR1cm5zOgorICogIDE6IEdJQ1YgYWNjZXNzIHN1Y2Nlc3NmdWxseSBwZXJmb3JtZWQKKyAqICAwOiBOb3QgYSBHSUNWIGFjY2VzcworICogLTE6IElsbGVnYWwgR0lDViBhY2Nlc3MKKyAqLworaW50IF9faHlwX3RleHQgX192Z2ljX3YyX3BlcmZvcm1fY3B1aWZfYWNjZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtICprdm0gPSBrZXJuX2h5cF92YSh2Y3B1LT5rdm0pOworCXN0cnVjdCB2Z2ljX2Rpc3QgKnZnaWMgPSAma3ZtLT5hcmNoLnZnaWM7CisJcGh5c19hZGRyX3QgZmF1bHRfaXBhOworCXZvaWQgX19pb21lbSAqYWRkcjsKKwlpbnQgcmQ7CisKKwkvKiBCdWlsZCB0aGUgZnVsbCBhZGRyZXNzICovCisJZmF1bHRfaXBhICA9IGt2bV92Y3B1X2dldF9mYXVsdF9pcGEodmNwdSk7CisJZmF1bHRfaXBhIHw9IGt2bV92Y3B1X2dldF9oZmFyKHZjcHUpICYgR0VOTUFTSygxMSwgMCk7CisKKwkvKiBJZiBub3QgZm9yIEdJQ1YsIG1vdmUgb24gKi8KKwlpZiAoZmF1bHRfaXBhIDwgIHZnaWMtPnZnaWNfY3B1X2Jhc2UgfHwKKwkgICAgZmF1bHRfaXBhID49ICh2Z2ljLT52Z2ljX2NwdV9iYXNlICsgS1ZNX1ZHSUNfVjJfQ1BVX1NJWkUpKQorCQlyZXR1cm4gMDsKKworCS8qIFJlamVjdCBhbnl0aGluZyBidXQgYSAzMmJpdCBhY2Nlc3MgKi8KKwlpZiAoa3ZtX3ZjcHVfZGFidF9nZXRfYXModmNwdSkgIT0gc2l6ZW9mKHUzMikpCisJCXJldHVybiAtMTsKKworCS8qIE5vdCBhbGlnbmVkPyBEb24ndCBib3RoZXIgKi8KKwlpZiAoZmF1bHRfaXBhICYgMykKKwkJcmV0dXJuIC0xOworCisJcmQgPSBrdm1fdmNwdV9kYWJ0X2dldF9yZCh2Y3B1KTsKKwlhZGRyICA9IGtlcm5faHlwX3ZhKChrZXJuX2h5cF92YSgma3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlKSktPnZjcHVfYmFzZV92YSk7CisJYWRkciArPSBmYXVsdF9pcGEgLSB2Z2ljLT52Z2ljX2NwdV9iYXNlOworCisJaWYgKGt2bV92Y3B1X2RhYnRfaXN3cml0ZSh2Y3B1KSkgeworCQl1MzIgZGF0YSA9IHZjcHVfZGF0YV9ndWVzdF90b19ob3N0KHZjcHUsCisJCQkJCQkgICB2Y3B1X2dldF9yZWcodmNwdSwgcmQpLAorCQkJCQkJICAgc2l6ZW9mKHUzMikpOworCQl3cml0ZWxfcmVsYXhlZChkYXRhLCBhZGRyKTsKKwl9IGVsc2UgeworCQl1MzIgZGF0YSA9IHJlYWRsX3JlbGF4ZWQoYWRkcik7CisJCXZjcHVfc2V0X3JlZyh2Y3B1LCByZCwgdmNwdV9kYXRhX2hvc3RfdG9fZ3Vlc3QodmNwdSwgZGF0YSwKKwkJCQkJCQkgICAgICAgc2l6ZW9mKHUzMikpKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL2h5cC92Z2ljLXYzLXNyLmMgYi92aXJ0L2t2bS9hcm0vaHlwL3ZnaWMtdjMtc3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ3MDk1Ci0tLSAvZGV2L251bGwKKysrIGIvdmlydC9rdm0vYXJtL2h5cC92Z2ljLXYzLXNyLmMKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNSAtIEFSTSBMdGQKKyAqIEF1dGhvcjogTWFyYyBaeW5naWVyIDxtYXJjLnp5bmdpZXJAYXJtLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvYXJtLWdpYy12My5oPgorI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CisKKyNpbmNsdWRlIDxhc20va3ZtX2h5cC5oPgorCisjZGVmaW5lIHZ0cl90b19tYXhfbHJfaWR4KHYpCQkoKHYpICYgMHhmKQorI2RlZmluZSB2dHJfdG9fbnJfcHJpX2JpdHModikJCSgoKHUzMikodikgPj4gMjkpICsgMSkKKworc3RhdGljIHU2NCBfX2h5cF90ZXh0IF9fZ2ljX3YzX2dldF9scih1bnNpZ25lZCBpbnQgbHIpCit7CisJc3dpdGNoIChsciAmIDB4ZikgeworCWNhc2UgMDoKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjBfRUwyKTsKKwljYXNlIDE6CisJCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFIxX0VMMik7CisJY2FzZSAyOgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSMl9FTDIpOworCWNhc2UgMzoKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjNfRUwyKTsKKwljYXNlIDQ6CisJCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFI0X0VMMik7CisJY2FzZSA1OgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSNV9FTDIpOworCWNhc2UgNjoKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjZfRUwyKTsKKwljYXNlIDc6CisJCXJldHVybiByZWFkX2dpY3JlZyhJQ0hfTFI3X0VMMik7CisJY2FzZSA4OgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSOF9FTDIpOworCWNhc2UgOToKKwkJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9MUjlfRUwyKTsKKwljYXNlIDEwOgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSMTBfRUwyKTsKKwljYXNlIDExOgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSMTFfRUwyKTsKKwljYXNlIDEyOgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSMTJfRUwyKTsKKwljYXNlIDEzOgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSMTNfRUwyKTsKKwljYXNlIDE0OgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSMTRfRUwyKTsKKwljYXNlIDE1OgorCQlyZXR1cm4gcmVhZF9naWNyZWcoSUNIX0xSMTVfRUwyKTsKKwl9CisKKwl1bnJlYWNoYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCBfX2h5cF90ZXh0IF9fZ2ljX3YzX3NldF9scih1NjQgdmFsLCBpbnQgbHIpCit7CisJc3dpdGNoIChsciAmIDB4ZikgeworCWNhc2UgMDoKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSMF9FTDIpOworCQlicmVhazsKKwljYXNlIDE6CisJCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjFfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFIyX0VMMik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSM19FTDIpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjRfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFI1X0VMMik7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSNl9FTDIpOworCQlicmVhazsKKwljYXNlIDc6CisJCXdyaXRlX2dpY3JlZyh2YWwsIElDSF9MUjdfRUwyKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFI4X0VMMik7CisJCWJyZWFrOworCWNhc2UgOToKKwkJd3JpdGVfZ2ljcmVnKHZhbCwgSUNIX0xSOV9FTDIpOworCQlicmVhazsKKwljYXNlIDEwOgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFIxMF9FTDIpOworCQlicmVhazsKKwljYXNlIDExOgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFIxMV9FTDIpOworCQlicmVhazsKKwljYXNlIDEyOgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFIxMl9FTDIpOworCQlicmVhazsKKwljYXNlIDEzOgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFIxM19FTDIpOworCQlicmVhazsKKwljYXNlIDE0OgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFIxNF9FTDIpOworCQlicmVhazsKKwljYXNlIDE1OgorCQl3cml0ZV9naWNyZWcodmFsLCBJQ0hfTFIxNV9FTDIpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faHlwX3RleHQgc2F2ZV9tYWludF9pbnRfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgbnJfbHIpCit7CisJc3RydWN0IHZnaWNfdjNfY3B1X2lmICpjcHVfaWYgPSAmdmNwdS0+YXJjaC52Z2ljX2NwdS52Z2ljX3YzOworCWludCBpOworCWJvb2wgZXhwZWN0X21pOworCisJZXhwZWN0X21pID0gISEoY3B1X2lmLT52Z2ljX2hjciAmIElDSF9IQ1JfVUlFKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9scjsgaSsrKSB7CisJCWlmICghKHZjcHUtPmFyY2gudmdpY19jcHUubGl2ZV9scnMgJiAoMVVMIDw8IGkpKSkKKwkJCQljb250aW51ZTsKKworCQlleHBlY3RfbWkgfD0gKCEoY3B1X2lmLT52Z2ljX2xyW2ldICYgSUNIX0xSX0hXKSAmJgorCQkJICAgICAgKGNwdV9pZi0+dmdpY19scltpXSAmIElDSF9MUl9FT0kpKTsKKwl9CisKKwlpZiAoZXhwZWN0X21pKSB7CisJCWNwdV9pZi0+dmdpY19taXNyICA9IHJlYWRfZ2ljcmVnKElDSF9NSVNSX0VMMik7CisKKwkJaWYgKGNwdV9pZi0+dmdpY19taXNyICYgSUNIX01JU1JfRU9JKQorCQkJY3B1X2lmLT52Z2ljX2Vpc3IgPSByZWFkX2dpY3JlZyhJQ0hfRUlTUl9FTDIpOworCQllbHNlCisJCQljcHVfaWYtPnZnaWNfZWlzciA9IDA7CisJfSBlbHNlIHsKKwkJY3B1X2lmLT52Z2ljX21pc3IgPSAwOworCQljcHVfaWYtPnZnaWNfZWlzciA9IDA7CisJfQorfQorCit2b2lkIF9faHlwX3RleHQgX192Z2ljX3YzX3NhdmVfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCB2Z2ljX3YzX2NwdV9pZiAqY3B1X2lmID0gJnZjcHUtPmFyY2gudmdpY19jcHUudmdpY192MzsKKwl1NjQgdmFsOworCisJLyoKKwkgKiBNYWtlIHN1cmUgc3RvcmVzIHRvIHRoZSBHSUMgdmlhIHRoZSBtZW1vcnkgbWFwcGVkIGludGVyZmFjZQorCSAqIGFyZSBub3cgdmlzaWJsZSB0byB0aGUgc3lzdGVtIHJlZ2lzdGVyIGludGVyZmFjZS4KKwkgKi8KKwlpZiAoIWNwdV9pZi0+dmdpY19zcmUpCisJCWRzYihzdCk7CisKKwljcHVfaWYtPnZnaWNfdm1jciAgPSByZWFkX2dpY3JlZyhJQ0hfVk1DUl9FTDIpOworCisJaWYgKHZjcHUtPmFyY2gudmdpY19jcHUubGl2ZV9scnMpIHsKKwkJaW50IGk7CisJCXUzMiBtYXhfbHJfaWR4LCBucl9wcmlfYml0czsKKworCQljcHVfaWYtPnZnaWNfZWxyc3IgPSByZWFkX2dpY3JlZyhJQ0hfRUxTUl9FTDIpOworCisJCXdyaXRlX2dpY3JlZygwLCBJQ0hfSENSX0VMMik7CisJCXZhbCA9IHJlYWRfZ2ljcmVnKElDSF9WVFJfRUwyKTsKKwkJbWF4X2xyX2lkeCA9IHZ0cl90b19tYXhfbHJfaWR4KHZhbCk7CisJCW5yX3ByaV9iaXRzID0gdnRyX3RvX25yX3ByaV9iaXRzKHZhbCk7CisKKwkJc2F2ZV9tYWludF9pbnRfc3RhdGUodmNwdSwgbWF4X2xyX2lkeCArIDEpOworCisJCWZvciAoaSA9IDA7IGkgPD0gbWF4X2xyX2lkeDsgaSsrKSB7CisJCQlpZiAoISh2Y3B1LT5hcmNoLnZnaWNfY3B1LmxpdmVfbHJzICYgKDFVTCA8PCBpKSkpCisJCQkJY29udGludWU7CisKKwkJCWlmIChjcHVfaWYtPnZnaWNfZWxyc3IgJiAoMSA8PCBpKSkKKwkJCQljcHVfaWYtPnZnaWNfbHJbaV0gJj0gfklDSF9MUl9TVEFURTsKKwkJCWVsc2UKKwkJCQljcHVfaWYtPnZnaWNfbHJbaV0gPSBfX2dpY192M19nZXRfbHIoaSk7CisKKwkJCV9fZ2ljX3YzX3NldF9scigwLCBpKTsKKwkJfQorCisJCXN3aXRjaCAobnJfcHJpX2JpdHMpIHsKKwkJY2FzZSA3OgorCQkJY3B1X2lmLT52Z2ljX2FwMHJbM10gPSByZWFkX2dpY3JlZyhJQ0hfQVAwUjNfRUwyKTsKKwkJCWNwdV9pZi0+dmdpY19hcDByWzJdID0gcmVhZF9naWNyZWcoSUNIX0FQMFIyX0VMMik7CisJCWNhc2UgNjoKKwkJCWNwdV9pZi0+dmdpY19hcDByWzFdID0gcmVhZF9naWNyZWcoSUNIX0FQMFIxX0VMMik7CisJCWRlZmF1bHQ6CisJCQljcHVfaWYtPnZnaWNfYXAwclswXSA9IHJlYWRfZ2ljcmVnKElDSF9BUDBSMF9FTDIpOworCQl9CisKKwkJc3dpdGNoIChucl9wcmlfYml0cykgeworCQljYXNlIDc6CisJCQljcHVfaWYtPnZnaWNfYXAxclszXSA9IHJlYWRfZ2ljcmVnKElDSF9BUDFSM19FTDIpOworCQkJY3B1X2lmLT52Z2ljX2FwMXJbMl0gPSByZWFkX2dpY3JlZyhJQ0hfQVAxUjJfRUwyKTsKKwkJY2FzZSA2OgorCQkJY3B1X2lmLT52Z2ljX2FwMXJbMV0gPSByZWFkX2dpY3JlZyhJQ0hfQVAxUjFfRUwyKTsKKwkJZGVmYXVsdDoKKwkJCWNwdV9pZi0+dmdpY19hcDFyWzBdID0gcmVhZF9naWNyZWcoSUNIX0FQMVIwX0VMMik7CisJCX0KKworCQl2Y3B1LT5hcmNoLnZnaWNfY3B1LmxpdmVfbHJzID0gMDsKKwl9IGVsc2UgeworCQljcHVfaWYtPnZnaWNfbWlzciAgPSAwOworCQljcHVfaWYtPnZnaWNfZWlzciAgPSAwOworCQljcHVfaWYtPnZnaWNfZWxyc3IgPSAweGZmZmY7CisJCWNwdV9pZi0+dmdpY19hcDByWzBdID0gMDsKKwkJY3B1X2lmLT52Z2ljX2FwMHJbMV0gPSAwOworCQljcHVfaWYtPnZnaWNfYXAwclsyXSA9IDA7CisJCWNwdV9pZi0+dmdpY19hcDByWzNdID0gMDsKKwkJY3B1X2lmLT52Z2ljX2FwMXJbMF0gPSAwOworCQljcHVfaWYtPnZnaWNfYXAxclsxXSA9IDA7CisJCWNwdV9pZi0+dmdpY19hcDFyWzJdID0gMDsKKwkJY3B1X2lmLT52Z2ljX2FwMXJbM10gPSAwOworCX0KKworCXZhbCA9IHJlYWRfZ2ljcmVnKElDQ19TUkVfRUwyKTsKKwl3cml0ZV9naWNyZWcodmFsIHwgSUNDX1NSRV9FTDJfRU5BQkxFLCBJQ0NfU1JFX0VMMik7CisKKwlpZiAoIWNwdV9pZi0+dmdpY19zcmUpIHsKKwkJLyogTWFrZSBzdXJlIEVOQUJMRSBpcyBzZXQgYXQgRUwyIGJlZm9yZSBzZXR0aW5nIFNSRSBhdCBFTDEgKi8KKwkJaXNiKCk7CisJCXdyaXRlX2dpY3JlZygxLCBJQ0NfU1JFX0VMMSk7CisJfQorfQorCit2b2lkIF9faHlwX3RleHQgX192Z2ljX3YzX3Jlc3RvcmVfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCB2Z2ljX3YzX2NwdV9pZiAqY3B1X2lmID0gJnZjcHUtPmFyY2gudmdpY19jcHUudmdpY192MzsKKwl1NjQgdmFsOworCXUzMiBtYXhfbHJfaWR4LCBucl9wcmlfYml0czsKKwl1MTYgbGl2ZV9scnMgPSAwOworCWludCBpOworCisJLyoKKwkgKiBWRklRRW4gaXMgUkVTMSBpZiBJQ0NfU1JFX0VMMS5TUkUgaXMgMS4gVGhpcyBjYXVzZXMgYQorCSAqIEdyb3VwMCBpbnRlcnJ1cHQgKGFzIGdlbmVyYXRlZCBpbiBHSUN2MiBtb2RlKSB0byBiZQorCSAqIGRlbGl2ZXJlZCBhcyBhIEZJUSB0byB0aGUgZ3Vlc3QsIHdpdGggcG90ZW50aWFsbHkgZmF0YWwKKwkgKiBjb25zZXF1ZW5jZXMuIFNvIHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgSUNDX1NSRV9FTDEgaGFzCisJICogYmVlbiBhY3R1YWxseSBwcm9ncmFtbWVkIHdpdGggdGhlIHZhbHVlIHdlIHdhbnQgYmVmb3JlCisJICogc3RhcnRpbmcgdG8gbWVzcyB3aXRoIHRoZSByZXN0IG9mIHRoZSBHSUMuCisJICovCisJaWYgKCFjcHVfaWYtPnZnaWNfc3JlKSB7CisJCXdyaXRlX2dpY3JlZygwLCBJQ0NfU1JFX0VMMSk7CisJCWlzYigpOworCX0KKworCXZhbCA9IHJlYWRfZ2ljcmVnKElDSF9WVFJfRUwyKTsKKwltYXhfbHJfaWR4ID0gdnRyX3RvX21heF9scl9pZHgodmFsKTsKKwlucl9wcmlfYml0cyA9IHZ0cl90b19ucl9wcmlfYml0cyh2YWwpOworCisJZm9yIChpID0gMDsgaSA8PSBtYXhfbHJfaWR4OyBpKyspIHsKKwkJaWYgKGNwdV9pZi0+dmdpY19scltpXSAmIElDSF9MUl9TVEFURSkKKwkJCWxpdmVfbHJzIHw9ICgxIDw8IGkpOworCX0KKworCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfdm1jciwgSUNIX1ZNQ1JfRUwyKTsKKworCWlmIChsaXZlX2xycykgeworCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2hjciwgSUNIX0hDUl9FTDIpOworCisJCXN3aXRjaCAobnJfcHJpX2JpdHMpIHsKKwkJY2FzZSA3OgorCQkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19hcDByWzNdLCBJQ0hfQVAwUjNfRUwyKTsKKwkJCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfYXAwclsyXSwgSUNIX0FQMFIyX0VMMik7CisJCWNhc2UgNjoKKwkJCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfYXAwclsxXSwgSUNIX0FQMFIxX0VMMik7CisJCWRlZmF1bHQ6CisJCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2FwMHJbMF0sIElDSF9BUDBSMF9FTDIpOworCQl9CisKKwkJc3dpdGNoIChucl9wcmlfYml0cykgeworCQljYXNlIDc6CisJCQl3cml0ZV9naWNyZWcoY3B1X2lmLT52Z2ljX2FwMXJbM10sIElDSF9BUDFSM19FTDIpOworCQkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19hcDFyWzJdLCBJQ0hfQVAxUjJfRUwyKTsKKwkJY2FzZSA2OgorCQkJd3JpdGVfZ2ljcmVnKGNwdV9pZi0+dmdpY19hcDFyWzFdLCBJQ0hfQVAxUjFfRUwyKTsKKwkJZGVmYXVsdDoKKwkJCXdyaXRlX2dpY3JlZyhjcHVfaWYtPnZnaWNfYXAxclswXSwgSUNIX0FQMVIwX0VMMik7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDw9IG1heF9scl9pZHg7IGkrKykgeworCQkJaWYgKCEobGl2ZV9scnMgJiAoMSA8PCBpKSkpCisJCQkJY29udGludWU7CisKKwkJCV9fZ2ljX3YzX3NldF9scihjcHVfaWYtPnZnaWNfbHJbaV0sIGkpOworCQl9CisJfQorCisJLyoKKwkgKiBFbnN1cmVzIHRoYXQgdGhlIGFib3ZlIHdpbGwgaGF2ZSByZWFjaGVkIHRoZQorCSAqIChyZSlkaXN0cmlidXRvcnMuIFRoaXMgZW5zdXJlIHRoZSBndWVzdCB3aWxsIHJlYWQgdGhlCisJICogY29ycmVjdCB2YWx1ZXMgZnJvbSB0aGUgbWVtb3J5LW1hcHBlZCBpbnRlcmZhY2UuCisJICovCisJaWYgKCFjcHVfaWYtPnZnaWNfc3JlKSB7CisJCWlzYigpOworCQlkc2Ioc3kpOworCX0KKwl2Y3B1LT5hcmNoLnZnaWNfY3B1LmxpdmVfbHJzID0gbGl2ZV9scnM7CisKKwkvKgorCSAqIFByZXZlbnQgdGhlIGd1ZXN0IGZyb20gdG91Y2hpbmcgdGhlIEdJQyBzeXN0ZW0gcmVnaXN0ZXJzIGlmCisJICogU1JFIGlzbid0IGVuYWJsZWQgZm9yIEdJQ3YzIGVtdWxhdGlvbi4KKwkgKi8KKwl3cml0ZV9naWNyZWcocmVhZF9naWNyZWcoSUNDX1NSRV9FTDIpICYgfklDQ19TUkVfRUwyX0VOQUJMRSwKKwkJICAgICBJQ0NfU1JFX0VMMik7Cit9CisKK3ZvaWQgX19oeXBfdGV4dCBfX3ZnaWNfdjNfaW5pdF9scnModm9pZCkKK3sKKwlpbnQgbWF4X2xyX2lkeCA9IHZ0cl90b19tYXhfbHJfaWR4KHJlYWRfZ2ljcmVnKElDSF9WVFJfRUwyKSk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IG1heF9scl9pZHg7IGkrKykKKwkJX19naWNfdjNfc2V0X2xyKDAsIGkpOworfQorCit1NjQgX19oeXBfdGV4dCBfX3ZnaWNfdjNfZ2V0X2ljaF92dHJfZWwyKHZvaWQpCit7CisJcmV0dXJuIHJlYWRfZ2ljcmVnKElDSF9WVFJfRUwyKTsKK30KZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS9wbXUuYyBiL3ZpcnQva3ZtL2FybS9wbXUuYwppbmRleCBhMDI3NTY5Li42ZTljNDBlIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vcG11LmMKKysrIGIvdmlydC9rdm0vYXJtL3BtdS5jCkBAIC00MjMsNiArNDIzLDE0IEBACiAJaWYgKCFrdm1fYXJtX3N1cHBvcnRfcG11X3YzKCkpCiAJCXJldHVybiAtRU5PREVWOwogCisJLyoKKwkgKiBXZSBjdXJyZW50bHkgcmVxdWlyZSBhbiBpbi1rZXJuZWwgVkdJQyB0byB1c2UgdGhlIFBNVSBlbXVsYXRpb24sCisJICogYmVjYXVzZSB3ZSBkbyBub3Qgc3VwcG9ydCBmb3J3YXJkaW5nIFBNVSBvdmVyZmxvdyBpbnRlcnJ1cHRzIHRvCisJICogdXNlcnNwYWNlIHlldC4KKwkgKi8KKwlpZiAoIWlycWNoaXBfaW5fa2VybmVsKHZjcHUtPmt2bSkgfHwgIXZnaWNfaW5pdGlhbGl6ZWQodmNwdS0+a3ZtKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlpZiAoIXRlc3RfYml0KEtWTV9BUk1fVkNQVV9QTVVfVjMsIHZjcHUtPmFyY2guZmVhdHVyZXMpIHx8CiAJICAgICFrdm1fYXJtX3BtdV9pcnFfaW5pdGlhbGl6ZWQodmNwdSkpCiAJCXJldHVybiAtRU5YSU87CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWluaXQuYyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtaW5pdC5jCmluZGV4IDgzNzc3YzEuLjhjZWJmYmMgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtaW5pdC5jCisrKyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtaW5pdC5jCkBAIC00MDUsNiArNDA1LDEwIEBACiAJCWJyZWFrOwogCWNhc2UgR0lDX1YzOgogCQlyZXQgPSB2Z2ljX3YzX3Byb2JlKGdpY19rdm1faW5mbyk7CisJCWlmICghcmV0KSB7CisJCQlzdGF0aWNfYnJhbmNoX2VuYWJsZSgma3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLmdpY3YzX2NwdWlmKTsKKwkJCWt2bV9pbmZvKCJHSUMgc3lzdGVtIHJlZ2lzdGVyIENQVSBpbnRlcmZhY2UgZW5hYmxlZFxuIik7CisJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtaXJxZmQuYyBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtaXJxZmQuYwppbmRleCBiMzFhNTFhLi5kOTE4ZGNmIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWlycWZkLmMKKysrIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1pcnFmZC5jCkBAIC00NiwxNSArNDYsOSBAQAogICogQHVlOiB1c2VyIGFwaSByb3V0aW5nIGVudHJ5IGhhbmRsZQogICogcmV0dXJuIDAgb24gc3VjY2VzcywgLUVJTlZBTCBvbiBlcnJvcnMuCiAgKi8KLSNpZmRlZiBLVk1fQ0FQX1gyQVBJQ19BUEkKIGludCBrdm1fc2V0X3JvdXRpbmdfZW50cnkoc3RydWN0IGt2bSAqa3ZtLAogCQkJICBzdHJ1Y3Qga3ZtX2tlcm5lbF9pcnFfcm91dGluZ19lbnRyeSAqZSwKIAkJCSAgY29uc3Qgc3RydWN0IGt2bV9pcnFfcm91dGluZ19lbnRyeSAqdWUpCi0jZWxzZQotLyogUmVtb3ZlIHRoaXMgdmVyc2lvbiBhbmQgdGhlIGlmZGVmZXJ5IG9uY2UgbWVyZ2VkIGludG8gNC44ICovCi1pbnQga3ZtX3NldF9yb3V0aW5nX2VudHJ5KHN0cnVjdCBrdm1fa2VybmVsX2lycV9yb3V0aW5nX2VudHJ5ICplLAotCQkJICBjb25zdCBzdHJ1Y3Qga3ZtX2lycV9yb3V0aW5nX2VudHJ5ICp1ZSkKLSNlbmRpZgogewogCWludCByID0gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1rdm0tZGV2aWNlLmMgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWt2bS1kZXZpY2UuYwppbmRleCAxODEzZjkzLi5jZTFmNGVkIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWt2bS1kZXZpY2UuYworKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLWt2bS1kZXZpY2UuYwpAQCAtNzEsNyArNzEsNiBAQAogCQlhZGRyX3B0ciA9ICZ2Z2ljLT52Z2ljX2NwdV9iYXNlOwogCQlhbGlnbm1lbnQgPSBTWl80SzsKIAkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0tWTV9BUk1fVkdJQ19WMwogCWNhc2UgS1ZNX1ZHSUNfVjNfQUREUl9UWVBFX0RJU1Q6CiAJCXR5cGVfbmVlZGVkID0gS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YzOwogCQlhZGRyX3B0ciA9ICZ2Z2ljLT52Z2ljX2Rpc3RfYmFzZTsKQEAgLTgyLDcgKzgxLDYgQEAKIAkJYWRkcl9wdHIgPSAmdmdpYy0+dmdpY19yZWRpc3RfYmFzZTsKIAkJYWxpZ25tZW50ID0gU1pfNjRLOwogCQlicmVhazsKLSNlbmRpZgogCWRlZmF1bHQ6CiAJCXIgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKQEAgLTIxOSw1MiArMjE3LDY1IEBACiAJCXJldCA9IGt2bV9yZWdpc3Rlcl9kZXZpY2Vfb3BzKCZrdm1fYXJtX3ZnaWNfdjJfb3BzLAogCQkJCQkgICAgICBLVk1fREVWX1RZUEVfQVJNX1ZHSUNfVjIpOwogCQlicmVhazsKLSNpZmRlZiBDT05GSUdfS1ZNX0FSTV9WR0lDX1YzCiAJY2FzZSBLVk1fREVWX1RZUEVfQVJNX1ZHSUNfVjM6CiAJCXJldCA9IGt2bV9yZWdpc3Rlcl9kZXZpY2Vfb3BzKCZrdm1fYXJtX3ZnaWNfdjNfb3BzLAogCQkJCQkgICAgICBLVk1fREVWX1RZUEVfQVJNX1ZHSUNfVjMpOworCisjaWZkZWYgQ09ORklHX0tWTV9BUk1fVkdJQ19WM19JVFMKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwogCQlyZXQgPSBrdm1fdmdpY19yZWdpc3Rlcl9pdHNfZGV2aWNlKCk7Ci0JCWJyZWFrOwogI2VuZGlmCisJCWJyZWFrOwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLS8qKiB2Z2ljX2F0dHJfcmVnc19hY2Nlc3M6IGFsbG93cyB1c2VyIHNwYWNlIHRvIHJlYWQvd3JpdGUgVkdJQyByZWdpc3RlcnMKLSAqCi0gKiBAZGV2OiBrdm0gZGV2aWNlIGhhbmRsZQotICogQGF0dHI6IGt2bSBkZXZpY2UgYXR0cmlidXRlCi0gKiBAcmVnOiBhZGRyZXNzIHRoZSB2YWx1ZSBpcyByZWFkIG9yIHdyaXR0ZW4KLSAqIEBpc193cml0ZTogd3JpdGUgZmxhZwotICoKLSAqLwotc3RhdGljIGludCB2Z2ljX2F0dHJfcmVnc19hY2Nlc3Moc3RydWN0IGt2bV9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGt2bV9kZXZpY2VfYXR0ciAqYXR0ciwKLQkJCQkgdTMyICpyZWcsIGJvb2wgaXNfd3JpdGUpCi17CitzdHJ1Y3QgdmdpY19yZWdfYXR0ciB7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OwogCWdwYV90IGFkZHI7Ci0JaW50IGNwdWlkLCByZXQsIGM7Ci0Jc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCAqdG1wX3ZjcHU7Ci0JaW50IHZjcHVfbG9ja19pZHggPSAtMTsKK307CisKK3N0YXRpYyBpbnQgcGFyc2VfdmdpY192Ml9hdHRyKHN0cnVjdCBrdm1fZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3Qga3ZtX2RldmljZV9hdHRyICphdHRyLAorCQkJICAgICAgc3RydWN0IHZnaWNfcmVnX2F0dHIgKnJlZ19hdHRyKQoreworCWludCBjcHVpZDsKIAogCWNwdWlkID0gKGF0dHItPmF0dHIgJiBLVk1fREVWX0FSTV9WR0lDX0NQVUlEX01BU0spID4+CiAJCSBLVk1fREVWX0FSTV9WR0lDX0NQVUlEX1NISUZUOwotCXZjcHUgPSBrdm1fZ2V0X3ZjcHUoZGV2LT5rdm0sIGNwdWlkKTsKLQlhZGRyID0gYXR0ci0+YXR0ciAmIEtWTV9ERVZfQVJNX1ZHSUNfT0ZGU0VUX01BU0s7CiAKLQltdXRleF9sb2NrKCZkZXYtPmt2bS0+bG9jayk7CisJaWYgKGNwdWlkID49IGF0b21pY19yZWFkKCZkZXYtPmt2bS0+b25saW5lX3ZjcHVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSB2Z2ljX2luaXQoZGV2LT5rdm0pOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OworCXJlZ19hdHRyLT52Y3B1ID0ga3ZtX2dldF92Y3B1KGRldi0+a3ZtLCBjcHVpZCk7CisJcmVnX2F0dHItPmFkZHIgPSBhdHRyLT5hdHRyICYgS1ZNX0RFVl9BUk1fVkdJQ19PRkZTRVRfTUFTSzsKIAotCWlmIChjcHVpZCA+PSBhdG9taWNfcmVhZCgmZGV2LT5rdm0tPm9ubGluZV92Y3B1cykpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIHVubG9ja3MgdmNwdXMgZnJvbSBAdmNwdV9sb2NrX2lkeCBhbmQgc21hbGxlciAqLworc3RhdGljIHZvaWQgdW5sb2NrX3ZjcHVzKHN0cnVjdCBrdm0gKmt2bSwgaW50IHZjcHVfbG9ja19pZHgpCit7CisJc3RydWN0IGt2bV92Y3B1ICp0bXBfdmNwdTsKKworCWZvciAoOyB2Y3B1X2xvY2tfaWR4ID49IDA7IHZjcHVfbG9ja19pZHgtLSkgeworCQl0bXBfdmNwdSA9IGt2bV9nZXRfdmNwdShrdm0sIHZjcHVfbG9ja19pZHgpOworCQltdXRleF91bmxvY2soJnRtcF92Y3B1LT5tdXRleCk7CiAJfQorfQorCitzdGF0aWMgdm9pZCB1bmxvY2tfYWxsX3ZjcHVzKHN0cnVjdCBrdm0gKmt2bSkKK3sKKwl1bmxvY2tfdmNwdXMoa3ZtLCBhdG9taWNfcmVhZCgma3ZtLT5vbmxpbmVfdmNwdXMpIC0gMSk7Cit9CisKKy8qIFJldHVybnMgdHJ1ZSBpZiBhbGwgdmNwdXMgd2VyZSBsb2NrZWQsIGZhbHNlIG90aGVyd2lzZSAqLworc3RhdGljIGJvb2wgbG9ja19hbGxfdmNwdXMoc3RydWN0IGt2bSAqa3ZtKQoreworCXN0cnVjdCBrdm1fdmNwdSAqdG1wX3ZjcHU7CisJaW50IGM7CiAKIAkvKgogCSAqIEFueSB0aW1lIGEgdmNwdSBpcyBydW4sIHZjcHVfbG9hZCBpcyBjYWxsZWQgd2hpY2ggdHJpZXMgdG8gZ3JhYiB0aGUKQEAgLTI3MiwxMSArMjgzLDQ5IEBACiAJICogdGhhdCBubyBvdGhlciBWQ1BVcyBhcmUgcnVuIGFuZCBmaWRkbGUgd2l0aCB0aGUgdmdpYyBzdGF0ZSB3aGlsZSB3ZQogCSAqIGFjY2VzcyBpdC4KIAkgKi8KLQlyZXQgPSAtRUJVU1k7Ci0Ja3ZtX2Zvcl9lYWNoX3ZjcHUoYywgdG1wX3ZjcHUsIGRldi0+a3ZtKSB7Ci0JCWlmICghbXV0ZXhfdHJ5bG9jaygmdG1wX3ZjcHUtPm11dGV4KSkKLQkJCWdvdG8gb3V0OwotCQl2Y3B1X2xvY2tfaWR4ID0gYzsKKwlrdm1fZm9yX2VhY2hfdmNwdShjLCB0bXBfdmNwdSwga3ZtKSB7CisJCWlmICghbXV0ZXhfdHJ5bG9jaygmdG1wX3ZjcHUtPm11dGV4KSkgeworCQkJdW5sb2NrX3ZjcHVzKGt2bSwgYyAtIDEpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogdmdpY19hdHRyX3JlZ3NfYWNjZXNzX3YyIC0gYWxsb3dzIHVzZXIgc3BhY2UgdG8gYWNjZXNzIFZHSUMgdjIgc3RhdGUKKyAqCisgKiBAZGV2OiAgICAgIGt2bSBkZXZpY2UgaGFuZGxlCisgKiBAYXR0cjogICAgIGt2bSBkZXZpY2UgYXR0cmlidXRlCisgKiBAcmVnOiAgICAgIGFkZHJlc3MgdGhlIHZhbHVlIGlzIHJlYWQgb3Igd3JpdHRlbgorICogQGlzX3dyaXRlOiB0cnVlIGlmIHVzZXJzcGFjZSBpcyB3cml0aW5nIGEgcmVnaXN0ZXIKKyAqLworc3RhdGljIGludCB2Z2ljX2F0dHJfcmVnc19hY2Nlc3NfdjIoc3RydWN0IGt2bV9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGt2bV9kZXZpY2VfYXR0ciAqYXR0ciwKKwkJCQkgICAgdTMyICpyZWcsIGJvb2wgaXNfd3JpdGUpCit7CisJc3RydWN0IHZnaWNfcmVnX2F0dHIgcmVnX2F0dHI7CisJZ3BhX3QgYWRkcjsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisJaW50IHJldDsKKworCXJldCA9IHBhcnNlX3ZnaWNfdjJfYXR0cihkZXYsIGF0dHIsICZyZWdfYXR0cik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXZjcHUgPSByZWdfYXR0ci52Y3B1OworCWFkZHIgPSByZWdfYXR0ci5hZGRyOworCisJbXV0ZXhfbG9jaygmZGV2LT5rdm0tPmxvY2spOworCisJcmV0ID0gdmdpY19pbml0KGRldi0+a3ZtKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmICghbG9ja19hbGxfdmNwdXMoZGV2LT5rdm0pKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CiAJfQogCiAJc3dpdGNoIChhdHRyLT5ncm91cCkgewpAQCAtMjkxLDE4ICszNDAsMTIgQEAKIAkJYnJlYWs7CiAJfQogCisJdW5sb2NrX2FsbF92Y3B1cyhkZXYtPmt2bSk7CiBvdXQ6Ci0JZm9yICg7IHZjcHVfbG9ja19pZHggPj0gMDsgdmNwdV9sb2NrX2lkeC0tKSB7Ci0JCXRtcF92Y3B1ID0ga3ZtX2dldF92Y3B1KGRldi0+a3ZtLCB2Y3B1X2xvY2tfaWR4KTsKLQkJbXV0ZXhfdW5sb2NrKCZ0bXBfdmNwdS0+bXV0ZXgpOwotCX0KLQogCW11dGV4X3VubG9jaygmZGV2LT5rdm0tPmxvY2spOwogCXJldHVybiByZXQ7CiB9CiAKLS8qIFYyIG9wcyAqLwotCiBzdGF0aWMgaW50IHZnaWNfdjJfc2V0X2F0dHIoc3RydWN0IGt2bV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3Qga3ZtX2RldmljZV9hdHRyICphdHRyKQogewpAQCAtMzIxLDcgKzM2NCw3IEBACiAJCWlmIChnZXRfdXNlcihyZWcsIHVhZGRyKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCi0JCXJldHVybiB2Z2ljX2F0dHJfcmVnc19hY2Nlc3MoZGV2LCBhdHRyLCAmcmVnLCB0cnVlKTsKKwkJcmV0dXJuIHZnaWNfYXR0cl9yZWdzX2FjY2Vzc192MihkZXYsIGF0dHIsICZyZWcsIHRydWUpOwogCX0KIAl9CiAKQEAgLTM0Myw3ICszODYsNyBAQAogCQl1MzIgX191c2VyICp1YWRkciA9ICh1MzIgX191c2VyICopKGxvbmcpYXR0ci0+YWRkcjsKIAkJdTMyIHJlZyA9IDA7CiAKLQkJcmV0ID0gdmdpY19hdHRyX3JlZ3NfYWNjZXNzKGRldiwgYXR0ciwgJnJlZywgZmFsc2UpOworCQlyZXQgPSB2Z2ljX2F0dHJfcmVnc19hY2Nlc3NfdjIoZGV2LCBhdHRyLCAmcmVnLCBmYWxzZSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCQlyZXR1cm4gcHV0X3VzZXIocmVnLCB1YWRkcik7CkBAIC0zODcsMTAgKzQzMCw2IEBACiAJLmhhc19hdHRyID0gdmdpY192Ml9oYXNfYXR0ciwKIH07CiAKLS8qIFYzIG9wcyAqLwotCi0jaWZkZWYgQ09ORklHX0tWTV9BUk1fVkdJQ19WMwotCiBzdGF0aWMgaW50IHZnaWNfdjNfc2V0X2F0dHIoc3RydWN0IGt2bV9kZXZpY2UgKmRldiwKIAkJCSAgICBzdHJ1Y3Qga3ZtX2RldmljZV9hdHRyICphdHRyKQogewpAQCAtNDMzLDUgKzQ3MiwzIEBACiAJLmdldF9hdHRyID0gdmdpY192M19nZXRfYXR0ciwKIAkuaGFzX2F0dHIgPSB2Z2ljX3YzX2hhc19hdHRyLAogfTsKLQotI2VuZGlmIC8qIENPTkZJR19LVk1fQVJNX1ZHSUNfVjMgKi8KZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtbW1pby12My5jIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1tbWlvLXYzLmMKaW5kZXggOTBkODE4MS4uMGQzYzc2YSAxMDA2NDQKLS0tIGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1tbWlvLXYzLmMKKysrIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1tbWlvLXYzLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlICJ2Z2ljLW1taW8uaCIKIAogLyogZXh0cmFjdCBAbnVtIGJ5dGVzIGF0IEBvZmZzZXQgYnl0ZXMgb2Zmc2V0IGluIGRhdGEgKi8KLXVuc2lnbmVkIGxvbmcgZXh0cmFjdF9ieXRlcyh1bnNpZ25lZCBsb25nIGRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsCit1bnNpZ25lZCBsb25nIGV4dHJhY3RfYnl0ZXModTY0IGRhdGEsIHVuc2lnbmVkIGludCBvZmZzZXQsCiAJCQkgICAgdW5zaWduZWQgaW50IG51bSkKIHsKIAlyZXR1cm4gKGRhdGEgPj4gKG9mZnNldCAqIDgpKSAmIEdFTk1BU0tfVUxMKG51bSAqIDggLSAxLCAwKTsKQEAgLTQyLDYgKzQyLDcgQEAKIAlyZXR1cm4gcmVnIHwgKCh1NjQpdmFsIDw8IGxvd2VyKTsKIH0KIAorI2lmZGVmIENPTkZJR19LVk1fQVJNX1ZHSUNfVjNfSVRTCiBib29sIHZnaWNfaGFzX2l0cyhzdHJ1Y3Qga3ZtICprdm0pCiB7CiAJc3RydWN0IHZnaWNfZGlzdCAqZGlzdCA9ICZrdm0tPmFyY2gudmdpYzsKQEAgLTUxLDYgKzUyLDcgQEAKIAogCXJldHVybiBkaXN0LT5oYXNfaXRzOwogfQorI2VuZGlmCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHZnaWNfbW1pb19yZWFkX3YzX21pc2Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCQkgICAgZ3BhX3QgYWRkciwgdW5zaWduZWQgaW50IGxlbikKQEAgLTE3OSw3ICsxODEsNyBAQAogCWludCB0YXJnZXRfdmNwdV9pZCA9IHZjcHUtPnZjcHVfaWQ7CiAJdTY0IHZhbHVlOwogCi0JdmFsdWUgPSAobXBpZHIgJiBHRU5NQVNLKDIzLCAwKSkgPDwgMzI7CisJdmFsdWUgPSAodTY0KShtcGlkciAmIEdFTk1BU0soMjMsIDApKSA8PCAzMjsKIAl2YWx1ZSB8PSAoKHRhcmdldF92Y3B1X2lkICYgMHhmZmZmKSA8PCA4KTsKIAlpZiAodGFyZ2V0X3ZjcHVfaWQgPT0gYXRvbWljX3JlYWQoJnZjcHUtPmt2bS0+b25saW5lX3ZjcHVzKSAtIDEpCiAJCXZhbHVlIHw9IEdJQ1JfVFlQRVJfTEFTVDsKQEAgLTYwOSw3ICs2MTEsNyBAQAogCWJvb2wgYnJvYWRjYXN0OwogCiAJc2dpID0gKHJlZyAmIElDQ19TR0kxUl9TR0lfSURfTUFTSykgPj4gSUNDX1NHSTFSX1NHSV9JRF9TSElGVDsKLQlicm9hZGNhc3QgPSByZWcgJiBCSVQoSUNDX1NHSTFSX0lSUV9ST1VUSU5HX01PREVfQklUKTsKKwlicm9hZGNhc3QgPSByZWcgJiBCSVRfVUxMKElDQ19TR0kxUl9JUlFfUk9VVElOR19NT0RFX0JJVCk7CiAJdGFyZ2V0X2NwdXMgPSAocmVnICYgSUNDX1NHSTFSX1RBUkdFVF9MSVNUX01BU0spID4+IElDQ19TR0kxUl9UQVJHRVRfTElTVF9TSElGVDsKIAltcGlkciA9IFNHSV9BRkZJTklUWV9MRVZFTChyZWcsIDMpOwogCW1waWRyIHw9IFNHSV9BRkZJTklUWV9MRVZFTChyZWcsIDIpOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1tbWlvLmMgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uYwppbmRleCAzYmFkM2M1Li5lMThiMzBkIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uYworKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uYwpAQCAtNTUwLDExICs1NTAsOSBAQAogCWNhc2UgVkdJQ19WMjoKIAkJbGVuID0gdmdpY192Ml9pbml0X2Rpc3RfaW9kZXYoaW9fZGV2aWNlKTsKIAkJYnJlYWs7Ci0jaWZkZWYgQ09ORklHX0tWTV9BUk1fVkdJQ19WMwogCWNhc2UgVkdJQ19WMzoKIAkJbGVuID0gdmdpY192M19pbml0X2Rpc3RfaW9kZXYoaW9fZGV2aWNlKTsKIAkJYnJlYWs7Ci0jZW5kaWYKIAlkZWZhdWx0OgogCQlCVUdfT04oMSk7CiAJfQpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy1tbWlvLmggYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uaAppbmRleCAwYjNlY2Y5Li40YzM0ZDM5IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uaAorKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLW1taW8uaApAQCAtOTYsNyArOTYsNyBAQAogdm9pZCB2Z2ljX2RhdGFfaG9zdF90b19tbWlvX2J1cyh2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sCiAJCQkJdW5zaWduZWQgbG9uZyBkYXRhKTsKIAotdW5zaWduZWQgbG9uZyBleHRyYWN0X2J5dGVzKHVuc2lnbmVkIGxvbmcgZGF0YSwgdW5zaWduZWQgaW50IG9mZnNldCwKK3Vuc2lnbmVkIGxvbmcgZXh0cmFjdF9ieXRlcyh1NjQgZGF0YSwgdW5zaWduZWQgaW50IG9mZnNldCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgbnVtKTsKIAogdTY0IHVwZGF0ZV82NGJpdF9yZWcodTY0IHJlZywgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGxlbiwKQEAgLTE2MiwxMiArMTYyLDEwIEBACiAKIHVuc2lnbmVkIGludCB2Z2ljX3YzX2luaXRfZGlzdF9pb2RldihzdHJ1Y3QgdmdpY19pb19kZXZpY2UgKmRldik7CiAKLSNpZmRlZiBDT05GSUdfS1ZNX0FSTV9WR0lDX1YzCiB1NjQgdmdpY19zYW5pdGlzZV9vdXRlcl9jYWNoZWFiaWxpdHkodTY0IHJlZyk7CiB1NjQgdmdpY19zYW5pdGlzZV9pbm5lcl9jYWNoZWFiaWxpdHkodTY0IHJlZyk7CiB1NjQgdmdpY19zYW5pdGlzZV9zaGFyZWFiaWxpdHkodTY0IHJlZyk7CiB1NjQgdmdpY19zYW5pdGlzZV9maWVsZCh1NjQgcmVnLCB1NjQgZmllbGRfbWFzaywgaW50IGZpZWxkX3NoaWZ0LAogCQkJdTY0ICgqc2FuaXRpc2VfZm4pKHU2NCkpOwotI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy12Mi5jIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy12Mi5jCmluZGV4IDBiZjY3MDkuLjBhMDYzYWYgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMtdjIuYworKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLXYyLmMKQEAgLTI3OCwxMiArMjc4LDE0IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IGt2bV9waHlzX2FkZHJfaW9yZW1hcChrdm0sIGRpc3QtPnZnaWNfY3B1X2Jhc2UsCi0JCQkJICAgIGt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3B1X2Jhc2UsCi0JCQkJICAgIEtWTV9WR0lDX1YyX0NQVV9TSVpFLCB0cnVlKTsKLQlpZiAocmV0KSB7Ci0JCWt2bV9lcnIoIlVuYWJsZSB0byByZW1hcCBWR0lDIENQVSB0byBWQ1BVXG4iKTsKLQkJZ290byBvdXQ7CisJaWYgKCFzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZ2Z2ljX3YyX2NwdWlmX3RyYXApKSB7CisJCXJldCA9IGt2bV9waHlzX2FkZHJfaW9yZW1hcChrdm0sIGRpc3QtPnZnaWNfY3B1X2Jhc2UsCisJCQkJCSAgICBrdm1fdmdpY19nbG9iYWxfc3RhdGUudmNwdV9iYXNlLAorCQkJCQkgICAgS1ZNX1ZHSUNfVjJfQ1BVX1NJWkUsIHRydWUpOworCQlpZiAocmV0KSB7CisJCQlrdm1fZXJyKCJVbmFibGUgdG8gcmVtYXAgVkdJQyBDUFUgdG8gVkNQVVxuIik7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAogCWRpc3QtPnJlYWR5ID0gdHJ1ZTsKQEAgLTI5NCw2ICsyOTYsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK0RFRklORV9TVEFUSUNfS0VZX0ZBTFNFKHZnaWNfdjJfY3B1aWZfdHJhcCk7CisKIC8qKgogICogdmdpY192Ml9wcm9iZSAtIHByb2JlIGZvciBhIEdJQ3YyIGNvbXBhdGlibGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgaW4gRFQKICAqIEBub2RlOglwb2ludGVyIHRvIHRoZSBEVCBub2RlCkBAIC0zMTAsNDUgKzMxNCw1MSBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCWlmICghUEFHRV9BTElHTkVEKGluZm8tPnZjcHUuc3RhcnQpKSB7Ci0JCWt2bV9lcnIoIkdJQ1YgcGh5c2ljYWwgYWRkcmVzcyAweCVsbHggbm90IHBhZ2UgYWxpZ25lZFxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaW5mby0+dmNwdS5zdGFydCk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQorCWlmICghUEFHRV9BTElHTkVEKGluZm8tPnZjcHUuc3RhcnQpIHx8CisJICAgICFQQUdFX0FMSUdORUQocmVzb3VyY2Vfc2l6ZSgmaW5mby0+dmNwdSkpKSB7CisJCWt2bV9pbmZvKCJHSUNWIHJlZ2lvbiBzaXplL2FsaWdubWVudCBpcyB1bnNhZmUsIHVzaW5nIHRyYXBwaW5nIChyZWR1Y2VkIHBlcmZvcm1hbmNlKVxuIik7CisJCWt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3B1X2Jhc2VfdmEgPSBpb3JlbWFwKGluZm8tPnZjcHUuc3RhcnQsCisJCQkJCQkJICAgICByZXNvdXJjZV9zaXplKCZpbmZvLT52Y3B1KSk7CisJCWlmICgha3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLnZjcHVfYmFzZV92YSkgeworCQkJa3ZtX2VycigiQ2Fubm90IGlvcmVtYXAgR0lDVlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCi0JaWYgKCFQQUdFX0FMSUdORUQocmVzb3VyY2Vfc2l6ZSgmaW5mby0+dmNwdSkpKSB7Ci0JCWt2bV9lcnIoIkdJQ1Ygc2l6ZSAweCVsbHggbm90IGEgbXVsdGlwbGUgb2YgcGFnZSBzaXplIDB4JWx4XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZXNvdXJjZV9zaXplKCZpbmZvLT52Y3B1KSwKLQkJCVBBR0VfU0laRSk7Ci0JCXJldHVybiAtRU5YSU87CisJCXJldCA9IGNyZWF0ZV9oeXBfaW9fbWFwcGluZ3Moa3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLnZjcHVfYmFzZV92YSwKKwkJCQkJICAgICBrdm1fdmdpY19nbG9iYWxfc3RhdGUudmNwdV9iYXNlX3ZhICsgcmVzb3VyY2Vfc2l6ZSgmaW5mby0+dmNwdSksCisJCQkJCSAgICAgaW5mby0+dmNwdS5zdGFydCk7CisJCWlmIChyZXQpIHsKKwkJCWt2bV9lcnIoIkNhbm5vdCBtYXAgR0lDViBpbnRvIGh5cFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXN0YXRpY19icmFuY2hfZW5hYmxlKCZ2Z2ljX3YyX2NwdWlmX3RyYXApOwogCX0KIAogCWt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3RybF9iYXNlID0gaW9yZW1hcChpbmZvLT52Y3RybC5zdGFydCwKIAkJCQkJCSAgIHJlc291cmNlX3NpemUoJmluZm8tPnZjdHJsKSk7CiAJaWYgKCFrdm1fdmdpY19nbG9iYWxfc3RhdGUudmN0cmxfYmFzZSkgewogCQlrdm1fZXJyKCJDYW5ub3QgaW9yZW1hcCBHSUNIXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OwogCX0KIAogCXZ0ciA9IHJlYWRsX3JlbGF4ZWQoa3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLnZjdHJsX2Jhc2UgKyBHSUNIX1ZUUik7CiAJa3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLm5yX2xyID0gKHZ0ciAmIDB4M2YpICsgMTsKIAotCXJldCA9IGt2bV9yZWdpc3Rlcl92Z2ljX2RldmljZShLVk1fREVWX1RZUEVfQVJNX1ZHSUNfVjIpOwotCWlmIChyZXQpIHsKLQkJa3ZtX2VycigiQ2Fubm90IHJlZ2lzdGVyIEdJQ3YyIEtWTSBkZXZpY2VcbiIpOwotCQlpb3VubWFwKGt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3RybF9iYXNlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXQgPSBjcmVhdGVfaHlwX2lvX21hcHBpbmdzKGt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3RybF9iYXNlLAogCQkJCSAgICAga3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLnZjdHJsX2Jhc2UgKwogCQkJCQkgcmVzb3VyY2Vfc2l6ZSgmaW5mby0+dmN0cmwpLAogCQkJCSAgICAgaW5mby0+dmN0cmwuc3RhcnQpOwogCWlmIChyZXQpIHsKIAkJa3ZtX2VycigiQ2Fubm90IG1hcCBWQ1RSTCBpbnRvIGh5cFxuIik7Ci0JCWt2bV91bnJlZ2lzdGVyX2RldmljZV9vcHMoS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YyKTsKLQkJaW91bm1hcChrdm1fdmdpY19nbG9iYWxfc3RhdGUudmN0cmxfYmFzZSk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGt2bV9yZWdpc3Rlcl92Z2ljX2RldmljZShLVk1fREVWX1RZUEVfQVJNX1ZHSUNfVjIpOworCWlmIChyZXQpIHsKKwkJa3ZtX2VycigiQ2Fubm90IHJlZ2lzdGVyIEdJQ3YyIEtWTSBkZXZpY2VcbiIpOworCQlnb3RvIG91dDsKIAl9CiAKIAlrdm1fdmdpY19nbG9iYWxfc3RhdGUuY2FuX2VtdWxhdGVfZ2ljdjIgPSB0cnVlOwpAQCAtMzU5LDQgKzM2OSwxMSBAQAogCWt2bV9pbmZvKCJ2Z2ljLXYyQCVsbHhcbiIsIGluZm8tPnZjdHJsLnN0YXJ0KTsKIAogCXJldHVybiAwOworb3V0OgorCWlmIChrdm1fdmdpY19nbG9iYWxfc3RhdGUudmN0cmxfYmFzZSkKKwkJaW91bm1hcChrdm1fdmdpY19nbG9iYWxfc3RhdGUudmN0cmxfYmFzZSk7CisJaWYgKGt2bV92Z2ljX2dsb2JhbF9zdGF0ZS52Y3B1X2Jhc2VfdmEpCisJCWlvdW5tYXAoa3ZtX3ZnaWNfZ2xvYmFsX3N0YXRlLnZjcHVfYmFzZV92YSk7CisKKwlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy5jIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy5jCmluZGV4IGU4M2I3ZmUuLjI4OTNkNWIgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMuYworKysgYi92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNkZWZpbmUgREVCVUdfU1BJTkxPQ0tfQlVHX09OKHApCiAjZW5kaWYKIAotc3RydWN0IHZnaWNfZ2xvYmFsIF9fc2VjdGlvbiguaHlwLnRleHQpIGt2bV92Z2ljX2dsb2JhbF9zdGF0ZTsKK3N0cnVjdCB2Z2ljX2dsb2JhbCBfX3NlY3Rpb24oLmh5cC50ZXh0KSBrdm1fdmdpY19nbG9iYWxfc3RhdGUgPSB7LmdpY3YzX2NwdWlmID0gU1RBVElDX0tFWV9GQUxTRV9JTklULH07CiAKIC8qCiAgKiBMb2NraW5nIG9yZGVyIGlzIGFsd2F5czoKQEAgLTY0NSw2ICs2NDUsOSBAQAogLyogU3luYyBiYWNrIHRoZSBoYXJkd2FyZSBWR0lDIHN0YXRlIGludG8gb3VyIGVtdWxhdGlvbiBhZnRlciBhIGd1ZXN0J3MgcnVuLiAqLwogdm9pZCBrdm1fdmdpY19zeW5jX2h3c3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCWlmICh1bmxpa2VseSghdmdpY19pbml0aWFsaXplZCh2Y3B1LT5rdm0pKSkKKwkJcmV0dXJuOworCiAJdmdpY19wcm9jZXNzX21haW50ZW5hbmNlX2ludGVycnVwdCh2Y3B1KTsKIAl2Z2ljX2ZvbGRfbHJfc3RhdGUodmNwdSk7CiAJdmdpY19wcnVuZV9hcF9saXN0KHZjcHUpOwpAQCAtNjUzLDYgKzY1Niw5IEBACiAvKiBGbHVzaCBvdXIgZW11bGF0aW9uIHN0YXRlIGludG8gdGhlIEdJQyBoYXJkd2FyZSBiZWZvcmUgZW50ZXJpbmcgdGhlIGd1ZXN0LiAqLwogdm9pZCBrdm1fdmdpY19mbHVzaF9od3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwlpZiAodW5saWtlbHkoIXZnaWNfaW5pdGlhbGl6ZWQodmNwdS0+a3ZtKSkpCisJCXJldHVybjsKKwogCXNwaW5fbG9jaygmdmNwdS0+YXJjaC52Z2ljX2NwdS5hcF9saXN0X2xvY2spOwogCXZnaWNfZmx1c2hfbHJfc3RhdGUodmNwdSk7CiAJc3Bpbl91bmxvY2soJnZjcHUtPmFyY2gudmdpY19jcHUuYXBfbGlzdF9sb2NrKTsKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMuaCBiL3ZpcnQva3ZtL2FybS92Z2ljL3ZnaWMuaAppbmRleCA2YzQ2MjVjLi45ZDllMDE0IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy92Z2ljLmgKKysrIGIvdmlydC9rdm0vYXJtL3ZnaWMvdmdpYy5oCkBAIC03Miw3ICs3Miw2IEBACiAJa3JlZl9nZXQoJmlycS0+cmVmY291bnQpOwogfQogCi0jaWZkZWYgQ09ORklHX0tWTV9BUk1fVkdJQ19WMwogdm9pZCB2Z2ljX3YzX3Byb2Nlc3NfbWFpbnRlbmFuY2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQgdmdpY192M19mb2xkX2xyX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIHZnaWNfdjNfcG9wdWxhdGVfbHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgdmdpY19pcnEgKmlycSwgaW50IGxyKTsKQEAgLTg0LDYzICs4MywxNCBAQAogaW50IHZnaWNfdjNfcHJvYmUoY29uc3Qgc3RydWN0IGdpY19rdm1faW5mbyAqaW5mbyk7CiBpbnQgdmdpY192M19tYXBfcmVzb3VyY2VzKHN0cnVjdCBrdm0gKmt2bSk7CiBpbnQgdmdpY19yZWdpc3Rlcl9yZWRpc3RfaW9kZXZzKHN0cnVjdCBrdm0gKmt2bSwgZ3BhX3QgZGlzdF9iYXNlX2FkZHJlc3MpOworCisjaWZkZWYgQ09ORklHX0tWTV9BUk1fVkdJQ19WM19JVFMKIGludCB2Z2ljX3JlZ2lzdGVyX2l0c19pb2RldnMoc3RydWN0IGt2bSAqa3ZtKTsKIGJvb2wgdmdpY19oYXNfaXRzKHN0cnVjdCBrdm0gKmt2bSk7CiBpbnQga3ZtX3ZnaWNfcmVnaXN0ZXJfaXRzX2RldmljZSh2b2lkKTsKIHZvaWQgdmdpY19lbmFibGVfbHBpcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogaW50IHZnaWNfaXRzX2luamVjdF9tc2koc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX21zaSAqbXNpKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgdmdpY192M19wcm9jZXNzX21haW50ZW5hbmNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHZnaWNfdjNfZm9sZF9scl9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2Z2ljX3YzX3BvcHVsYXRlX2xyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJCQkgICAgICAgc3RydWN0IHZnaWNfaXJxICppcnEsIGludCBscikKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHZnaWNfdjNfY2xlYXJfbHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgbHIpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2Z2ljX3YzX3NldF91bmRlcmZsb3coc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotfQotCi1zdGF0aWMgaW5saW5lCi12b2lkIHZnaWNfdjNfc2V0X3ZtY3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgdmdpY192bWNyICp2bWNyKQotewotfQotCi1zdGF0aWMgaW5saW5lCi12b2lkIHZnaWNfdjNfZ2V0X3ZtY3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3QgdmdpY192bWNyICp2bWNyKQotewotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdmdpY192M19lbmFibGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotfQotCi1zdGF0aWMgaW5saW5lIGludCB2Z2ljX3YzX3Byb2JlKGNvbnN0IHN0cnVjdCBnaWNfa3ZtX2luZm8gKmluZm8pCi17Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHZnaWNfdjNfbWFwX3Jlc291cmNlcyhzdHJ1Y3Qga3ZtICprdm0pCi17Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHZnaWNfcmVnaXN0ZXJfcmVkaXN0X2lvZGV2cyhzdHJ1Y3Qga3ZtICprdm0sCi0JCQkJCSAgICAgIGdwYV90IGRpc3RfYmFzZV9hZGRyZXNzKQotewotCXJldHVybiAtRU5PREVWOwotfQotCiBzdGF0aWMgaW5saW5lIGludCB2Z2ljX3JlZ2lzdGVyX2l0c19pb2RldnMoc3RydWN0IGt2bSAqa3ZtKQogewogCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vZXZlbnRmZC5jIGIvdmlydC9rdm0vZXZlbnRmZC5jCmluZGV4IGU0NjliNjAuLmYzOTdlOWIgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2V2ZW50ZmQuYworKysgYi92aXJ0L2t2bS9ldmVudGZkLmMKQEAgLTQyLDcgKzQyLDYgQEAKIAogI2lmZGVmIENPTkZJR19IQVZFX0tWTV9JUlFGRAogCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmlycWZkX2NsZWFudXBfd3E7CiAKIHN0YXRpYyB2b2lkCiBpcnFmZF9pbmplY3Qoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMTY4LDcgKzE2Nyw3IEBACiAKIAlsaXN0X2RlbF9pbml0KCZpcnFmZC0+bGlzdCk7CiAKLQlxdWV1ZV93b3JrKGlycWZkX2NsZWFudXBfd3EsICZpcnFmZC0+c2h1dGRvd24pOworCXNjaGVkdWxlX3dvcmsoJmlycWZkLT5zaHV0ZG93bik7CiB9CiAKIGludCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkga3ZtX2FyY2hfc2V0X2lycV9pbmF0b21pYygKQEAgLTU1NSw3ICs1NTQsNyBAQAogCSAqIHNvIHRoYXQgd2UgZ3VhcmFudGVlIHRoZXJlIHdpbGwgbm90IGJlIGFueSBtb3JlIGludGVycnVwdHMgb24gdGhpcwogCSAqIGdzaSBvbmNlIHRoaXMgZGVhc3NpZ24gZnVuY3Rpb24gcmV0dXJucy4KIAkgKi8KLQlmbHVzaF93b3JrcXVldWUoaXJxZmRfY2xlYW51cF93cSk7CisJZmx1c2hfd29yaygmaXJxZmQtPnNodXRkb3duKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTkyLDcgKzU5MSw3IEBACiAJICogQmxvY2sgdW50aWwgd2Uga25vdyBhbGwgb3V0c3RhbmRpbmcgc2h1dGRvd24gam9icyBoYXZlIGNvbXBsZXRlZAogCSAqIHNpbmNlIHdlIGRvIG5vdCB0YWtlIGEga3ZtKiByZWZlcmVuY2UuCiAJICovCi0JZmx1c2hfd29ya3F1ZXVlKGlycWZkX2NsZWFudXBfd3EpOworCWZsdXNoX3dvcmsoJmlycWZkLT5zaHV0ZG93bik7CiAKIH0KIApAQCAtNjIyLDIzICs2MjEsOCBAQAogCXNwaW5fdW5sb2NrX2lycSgma3ZtLT5pcnFmZHMubG9jayk7CiB9CiAKLS8qCi0gKiBjcmVhdGUgYSBob3N0LXdpZGUgd29ya3F1ZXVlIGZvciBpc3N1aW5nIGRlZmVycmVkIHNodXRkb3duIHJlcXVlc3RzCi0gKiBhZ2dyZWdhdGVkIGZyb20gYWxsIHZtKiBpbnN0YW5jZXMuIFdlIG5lZWQgb3VyIG93biBpc29sYXRlZCBzaW5nbGUtdGhyZWFkCi0gKiBxdWV1ZSB0byBwcmV2ZW50IGRlYWRsb2NrIGFnYWluc3QgZmx1c2hpbmcgdGhlIG5vcm1hbCB3b3JrLXF1ZXVlLgotICovCi1pbnQga3ZtX2lycWZkX2luaXQodm9pZCkKLXsKLQlpcnFmZF9jbGVhbnVwX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImt2bS1pcnFmZC1jbGVhbnVwIik7Ci0JaWYgKCFpcnFmZF9jbGVhbnVwX3dxKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiAwOwotfQotCiB2b2lkIGt2bV9pcnFmZF9leGl0KHZvaWQpCiB7Ci0JZGVzdHJveV93b3JrcXVldWUoaXJxZmRfY2xlYW51cF93cSk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggMTk1MDc4Mi4uODFkZmM3MyAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYworKysgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC01NTksOSArNTU5LDExIEBACiAKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoa3ZtLT5kZWJ1Z2ZzX2RlbnRyeSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwga3ZtX2RlYnVnZnNfbnVtX2VudHJpZXM7IGkrKykKLQkJa2ZyZWUoa3ZtLT5kZWJ1Z2ZzX3N0YXRfZGF0YVtpXSk7Ci0Ja2ZyZWUoa3ZtLT5kZWJ1Z2ZzX3N0YXRfZGF0YSk7CisJaWYgKGt2bS0+ZGVidWdmc19zdGF0X2RhdGEpIHsKKwkJZm9yIChpID0gMDsgaSA8IGt2bV9kZWJ1Z2ZzX251bV9lbnRyaWVzOyBpKyspCisJCQlrZnJlZShrdm0tPmRlYnVnZnNfc3RhdF9kYXRhW2ldKTsKKwkJa2ZyZWUoa3ZtLT5kZWJ1Z2ZzX3N0YXRfZGF0YSk7CisJfQogfQogCiBzdGF0aWMgaW50IGt2bV9jcmVhdGVfdm1fZGVidWdmcyhzdHJ1Y3Qga3ZtICprdm0sIGludCBmZCkKQEAgLTIzNjksNiArMjM3MSw3IEBACiB7CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHZjcHUtPmRlYnVnZnNfZGVudHJ5KTsKIAlrdm1fcHV0X2t2bSh2Y3B1LT5rdm0pOwogCXJldHVybiAwOwogfQpAQCAtMjM5MSw2ICsyMzk0LDMyIEBACiAJcmV0dXJuIGFub25faW5vZGVfZ2V0ZmQoImt2bS12Y3B1IiwgJmt2bV92Y3B1X2ZvcHMsIHZjcHUsIE9fUkRXUiB8IE9fQ0xPRVhFQyk7CiB9CiAKK3N0YXRpYyBpbnQga3ZtX2NyZWF0ZV92Y3B1X2RlYnVnZnMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWNoYXIgZGlyX25hbWVbSVRPQV9NQVhfTEVOICogMl07CisJaW50IHJldDsKKworCWlmICgha3ZtX2FyY2hfaGFzX3ZjcHVfZGVidWdmcygpKQorCQlyZXR1cm4gMDsKKworCWlmICghZGVidWdmc19pbml0aWFsaXplZCgpKQorCQlyZXR1cm4gMDsKKworCXNucHJpbnRmKGRpcl9uYW1lLCBzaXplb2YoZGlyX25hbWUpLCAidmNwdSVkIiwgdmNwdS0+dmNwdV9pZCk7CisJdmNwdS0+ZGVidWdmc19kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoZGlyX25hbWUsCisJCQkJCQkJCXZjcHUtPmt2bS0+ZGVidWdmc19kZW50cnkpOworCWlmICghdmNwdS0+ZGVidWdmc19kZW50cnkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0ga3ZtX2FyY2hfY3JlYXRlX3ZjcHVfZGVidWdmcyh2Y3B1KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUodmNwdS0+ZGVidWdmc19kZW50cnkpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCiAvKgogICogQ3JlYXRlcyBzb21lIHZpcnR1YWwgY3B1cy4gIEdvb2QgbHVjayBjcmVhdGluZyBtb3JlIHRoYW4gb25lLgogICovCkBAIC0yNDIzLDYgKzI0NTIsMTAgQEAKIAlpZiAocikKIAkJZ290byB2Y3B1X2Rlc3Ryb3k7CiAKKwlyID0ga3ZtX2NyZWF0ZV92Y3B1X2RlYnVnZnModmNwdSk7CisJaWYgKHIpCisJCWdvdG8gdmNwdV9kZXN0cm95OworCiAJbXV0ZXhfbG9jaygma3ZtLT5sb2NrKTsKIAlpZiAoa3ZtX2dldF92Y3B1X2J5X2lkKGt2bSwgaWQpKSB7CiAJCXIgPSAtRUVYSVNUOwpAQCAtMjQ1NCw2ICsyNDg3LDcgQEAKIAogdW5sb2NrX3ZjcHVfZGVzdHJveToKIAltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHZjcHUtPmRlYnVnZnNfZGVudHJ5KTsKIHZjcHVfZGVzdHJveToKIAlrdm1fYXJjaF92Y3B1X2Rlc3Ryb3kodmNwdSk7CiB2Y3B1X2RlY3JlbWVudDoKQEAgLTM2MTksNyArMzY1Myw3IEBACiB7CiAJc3RydWN0IGt2bV9zdGF0X2RhdGEgKnN0YXRfZGF0YSA9IChzdHJ1Y3Qga3ZtX3N0YXRfZGF0YSAqKWRhdGE7CiAKLQkqdmFsID0gKih1MzIgKikoKHZvaWQgKilzdGF0X2RhdGEtPmt2bSArIHN0YXRfZGF0YS0+b2Zmc2V0KTsKKwkqdmFsID0gKih1bG9uZyAqKSgodm9pZCAqKXN0YXRfZGF0YS0+a3ZtICsgc3RhdF9kYXRhLT5vZmZzZXQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNjQ5LDcgKzM2ODMsNyBAQAogCSp2YWwgPSAwOwogCiAJa3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdmNwdSwgc3RhdF9kYXRhLT5rdm0pCi0JCSp2YWwgKz0gKih1MzIgKikoKHZvaWQgKil2Y3B1ICsgc3RhdF9kYXRhLT5vZmZzZXQpOworCQkqdmFsICs9ICoodTY0ICopKCh2b2lkICopdmNwdSArIHN0YXRfZGF0YS0+b2Zmc2V0KTsKIAogCXJldHVybiAwOwogfQpAQCAtMzgwNywxMiArMzg0MSw3IEBACiAJICoga3ZtX2FyY2hfaW5pdCBtYWtlcyBzdXJlIHRoZXJlJ3MgYXQgbW9zdCBvbmUgY2FsbGVyCiAJICogZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCBzdXBwb3J0IG11bHRpcGxlIGltcGxlbWVudGF0aW9ucywKIAkgKiBsaWtlIGludGVsIGFuZCBhbWQgb24geDg2LgotCSAqIGt2bV9hcmNoX2luaXQgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGt2bV9pcnFmZF9pbml0IHRvIGF2b2lkIGNyZWF0aW5nCi0JICogY29uZmxpY3RzIGluIGNhc2Uga3ZtIGlzIGFscmVhZHkgc2V0dXAgZm9yIGFub3RoZXIgaW1wbGVtZW50YXRpb24uCiAJICovCi0JciA9IGt2bV9pcnFmZF9pbml0KCk7Ci0JaWYgKHIpCi0JCWdvdG8gb3V0X2lycWZkOwogCiAJaWYgKCF6YWxsb2NfY3B1bWFza192YXIoJmNwdXNfaGFyZHdhcmVfZW5hYmxlZCwgR0ZQX0tFUk5FTCkpIHsKIAkJciA9IC1FTk9NRU07CkBAIC0zODk0LDcgKzM5MjMsNiBAQAogCWZyZWVfY3B1bWFza192YXIoY3B1c19oYXJkd2FyZV9lbmFibGVkKTsKIG91dF9mcmVlXzA6CiAJa3ZtX2lycWZkX2V4aXQoKTsKLW91dF9pcnFmZDoKIAlrdm1fYXJjaF9leGl0KCk7CiBvdXRfZmFpbDoKIAlyZXR1cm4gcjsK